commit b452bd670c98ff5561b12840f4751b0656deae96 Author: Ceikry Date: Sun Mar 7 20:37:32 2021 -0600 Added initial version diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..a4d179a11 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,12 @@ +### Pull Requests +* Pull Requests should ALWAYS be made into the development branch and ONLY the development branch. +* Please try to include as much detail as you can/follow the template provided for pull requests. + +### Code Guidelines +* ALL new code MUST be Kotlin. The only exception is when modifying old java files, in which case we would still *prefer* that it be converted to Kotlin if possible. +* Code must be clean +* You must include a javadoc-style comment at the top of each file stating the file's purpose and your @author tag. Ex: @author Ceikry +* If you are making significant changes to a file that already has a tagged author, add yours below theirs. +* If you are completely rewriting a file, you may replace the @author tag with your own. Rewrites should only be done when the resulting improvements are significant. +* If you come across a file without a mentioned @author, it's a safe bet that it was written by Ceikry. Feel free to add his @author tag to that file. +* You are responsible for the bugs your code causes. If your code results in a bug, you are expected to fix it yourself. diff --git a/FishingTrawlerSoloGuide.md b/FishingTrawlerSoloGuide.md new file mode 100644 index 000000000..d43a25fe3 --- /dev/null +++ b/FishingTrawlerSoloGuide.md @@ -0,0 +1,54 @@ +## Fishing Trawler Solo-player Guide +### Notes +* You require level 15 fishing to play this minigame. +* This minigame is not 100% authentic. + +### Inventory Setup + + +* 100-200 Swamp Paste +* 3-4 Bailing Buckets +* 12-16 Ropes + +### Playing the game +When you first start the game you'll be prompted with a brief tutorial telling you
+what each item does. You should plug leaks as fast as possible as the boat
+can fill with water very quickly. Occasionally, the net will rip. Go on the top deck
+and inspect the net in order to repair it. If your net is good and all leaks
+are already plugged, spam click your bailing buckets to remove water as fast as
+possible. + +### Rewards +Our fishing trawler has all the authentic rewards, including: +* Raw Shrimp +* Raw Sardine +* Raw Anchovie +* Raw Lobster +* Raw Manta Ray +* Raw Sea Turtle +* Raw Sharks +* Various Junk Items + +However, somewhat inauthentically, I wanted to make this minigame
+somewhat worth doing, as in its vanilla state it is pretty much
+pointless. So all the above fish can be caught at any level, and
+there's been a few inauthentic rewards added. Those are as follows: +* Loop half of key +* Tooth half of key +* Caskets (can award gems, coins, talismans, and a few other things) +* Pirate's Hat (very rare) +* Lucky Cutlass (very rare) + +### Experience +I tweaked how experience is gained as well, again to make this somewhat worth doing. +The exact formula for experience gained at x1 xp is:
+`((1.5% of Fishing Level) * Fishing Level) * Number of Fish Caught` +
+What this generally works out to mean is that at level 99, you get roughly
+20k experience per trip at x1 xp at level 99, and 438.75 xp per trip at x1
+at level 15. These are both based on catching around 130 fish, which is the expected
+average when soloing. + +### Other players +Playing with more players is more relaxed but you get less fish
+and xp, as the haul is divided evenly between all players. \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..e72baa96a --- /dev/null +++ b/LICENSE @@ -0,0 +1,95 @@ +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + +Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. +Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. +BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. +Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. +Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. +Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. +License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike. +Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. +Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. +Licensor means the individual(s) or entity(ies) granting rights under this Public License. +NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. +Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. +Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. +You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. +Section 2 – Scope. + +License grant. +Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: +reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and +produce, reproduce, and Share Adapted Material for NonCommercial purposes only. +Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. +Term. The term of this Public License is specified in Section 6(a). +Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. +Downstream recipients. +Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. +Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. +No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. +No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). +Other rights. + +Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. +Patent and trademark rights are not licensed under this Public License. +To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +Attribution. + +If You Share the Licensed Material (including in modified form), You must: + +retain the following if it is supplied by the Licensor with the Licensed Material: +identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); +a copyright notice; +a notice that refers to this Public License; +a notice that refers to the disclaimer of warranties; +a URI or hyperlink to the Licensed Material to the extent reasonably practicable; +indicate if You modified the Licensed Material and retain an indication of any previous modifications; and +indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. +You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. +If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. +ShareAlike. +In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + +The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License. +You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. +You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only; +if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and +You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. +Section 5 – Disclaimer of Warranties and Limitation of Liability. + +Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. +To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. +The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. +Section 6 – Term and Termination. + +This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. +Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + +automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or +upon express reinstatement by the Licensor. +For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. +For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. +Sections 1, 5, 6, 7, and 8 survive termination of this Public License. +Section 7 – Other Terms and Conditions. + +The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. +Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. +Section 8 – Interpretation. + +For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. +To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. +No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. +Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. diff --git a/Management-Server/build.gradle b/Management-Server/build.gradle new file mode 100644 index 000000000..797b2b7d4 --- /dev/null +++ b/Management-Server/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'application' + +archivesBaseName = 'managementserver' + +mainClassName = 'ms.Management' + +dependencies { + implementation 'com.google.guava:guava:29.0-jre' + implementation 'mysql:mysql-connector-java:8.0.21' +} + +jar { + manifest { + attributes 'Main-Class': 'ms.Management' + } + from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } } +} \ No newline at end of file diff --git a/Management-Server/build/classes/java/main/ms/Management$1.class b/Management-Server/build/classes/java/main/ms/Management$1.class new file mode 100644 index 000000000..36e7eb290 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/Management$1.class differ diff --git a/Management-Server/build/classes/java/main/ms/Management$2.class b/Management-Server/build/classes/java/main/ms/Management$2.class new file mode 100644 index 000000000..d3c3db618 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/Management$2.class differ diff --git a/Management-Server/build/classes/java/main/ms/Management$3.class b/Management-Server/build/classes/java/main/ms/Management$3.class new file mode 100644 index 000000000..65465adf3 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/Management$3.class differ diff --git a/Management-Server/build/classes/java/main/ms/Management$4.class b/Management-Server/build/classes/java/main/ms/Management$4.class new file mode 100644 index 000000000..c69526ab0 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/Management$4.class differ diff --git a/Management-Server/build/classes/java/main/ms/Management$5.class b/Management-Server/build/classes/java/main/ms/Management$5.class new file mode 100644 index 000000000..6a2cfbaf2 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/Management$5.class differ diff --git a/Management-Server/build/classes/java/main/ms/Management$6.class b/Management-Server/build/classes/java/main/ms/Management$6.class new file mode 100644 index 000000000..07264c6f6 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/Management$6.class differ diff --git a/Management-Server/build/classes/java/main/ms/Management$7.class b/Management-Server/build/classes/java/main/ms/Management$7.class new file mode 100644 index 000000000..70e68b713 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/Management$7.class differ diff --git a/Management-Server/build/classes/java/main/ms/Management$8.class b/Management-Server/build/classes/java/main/ms/Management$8.class new file mode 100644 index 000000000..78c2c757c Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/Management$8.class differ diff --git a/Management-Server/build/classes/java/main/ms/Management.class b/Management-Server/build/classes/java/main/ms/Management.class new file mode 100644 index 000000000..b8465a343 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/Management.class differ diff --git a/Management-Server/build/classes/java/main/ms/ServerConstants.class b/Management-Server/build/classes/java/main/ms/ServerConstants.class new file mode 100644 index 000000000..e484cb2c6 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/ServerConstants.class differ diff --git a/Management-Server/build/classes/java/main/ms/classloader/ClassLoadServer.class b/Management-Server/build/classes/java/main/ms/classloader/ClassLoadServer.class new file mode 100644 index 000000000..f4935a121 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/classloader/ClassLoadServer.class differ diff --git a/Management-Server/build/classes/java/main/ms/classloader/WorkerThread.class b/Management-Server/build/classes/java/main/ms/classloader/WorkerThread.class new file mode 100644 index 000000000..17440f8bd Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/classloader/WorkerThread.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/EventProducer.class b/Management-Server/build/classes/java/main/ms/net/EventProducer.class new file mode 100644 index 000000000..64301bc6b Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/EventProducer.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/IoEventHandler.class b/Management-Server/build/classes/java/main/ms/net/IoEventHandler.class new file mode 100644 index 000000000..003a1a2fd Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/IoEventHandler.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/IoReadEvent.class b/Management-Server/build/classes/java/main/ms/net/IoReadEvent.class new file mode 100644 index 000000000..a26aebb64 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/IoReadEvent.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/IoSession.class b/Management-Server/build/classes/java/main/ms/net/IoSession.class new file mode 100644 index 000000000..9536f1738 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/IoSession.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/IoWriteEvent.class b/Management-Server/build/classes/java/main/ms/net/IoWriteEvent.class new file mode 100644 index 000000000..408b10915 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/IoWriteEvent.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/NioReactor.class b/Management-Server/build/classes/java/main/ms/net/NioReactor.class new file mode 100644 index 000000000..d974bf7b4 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/NioReactor.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/event/HSReadEvent.class b/Management-Server/build/classes/java/main/ms/net/event/HSReadEvent.class new file mode 100644 index 000000000..a1bf8a654 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/event/HSReadEvent.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/event/HSWriteEvent.class b/Management-Server/build/classes/java/main/ms/net/event/HSWriteEvent.class new file mode 100644 index 000000000..543f27f1e Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/event/HSWriteEvent.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/event/PacketReadEvent.class b/Management-Server/build/classes/java/main/ms/net/event/PacketReadEvent.class new file mode 100644 index 000000000..e77c75df4 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/event/PacketReadEvent.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/event/PacketWriteEvent$1.class b/Management-Server/build/classes/java/main/ms/net/event/PacketWriteEvent$1.class new file mode 100644 index 000000000..89df8046b Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/event/PacketWriteEvent$1.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/event/PacketWriteEvent.class b/Management-Server/build/classes/java/main/ms/net/event/PacketWriteEvent.class new file mode 100644 index 000000000..bea72abf5 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/event/PacketWriteEvent.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/event/RegistryReadEvent.class b/Management-Server/build/classes/java/main/ms/net/event/RegistryReadEvent.class new file mode 100644 index 000000000..aaed2bc1a Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/event/RegistryReadEvent.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/event/RegistryWriteEvent.class b/Management-Server/build/classes/java/main/ms/net/event/RegistryWriteEvent.class new file mode 100644 index 000000000..5e3863d56 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/event/RegistryWriteEvent.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/packet/IoBuffer.class b/Management-Server/build/classes/java/main/ms/net/packet/IoBuffer.class new file mode 100644 index 000000000..86a10306b Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/packet/IoBuffer.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/packet/PacketHeader.class b/Management-Server/build/classes/java/main/ms/net/packet/PacketHeader.class new file mode 100644 index 000000000..5571ceb45 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/packet/PacketHeader.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/packet/WorldPacketRepository.class b/Management-Server/build/classes/java/main/ms/net/packet/WorldPacketRepository.class new file mode 100644 index 000000000..43c6b39cd Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/packet/WorldPacketRepository.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/producer/HSEventProducer.class b/Management-Server/build/classes/java/main/ms/net/producer/HSEventProducer.class new file mode 100644 index 000000000..0124a954b Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/producer/HSEventProducer.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/producer/PacketEventProducer.class b/Management-Server/build/classes/java/main/ms/net/producer/PacketEventProducer.class new file mode 100644 index 000000000..b016267db Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/producer/PacketEventProducer.class differ diff --git a/Management-Server/build/classes/java/main/ms/net/producer/RegistryEventProducer.class b/Management-Server/build/classes/java/main/ms/net/producer/RegistryEventProducer.class new file mode 100644 index 000000000..05ed8e1e7 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/net/producer/RegistryEventProducer.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/OperatingSystem.class b/Management-Server/build/classes/java/main/ms/system/OperatingSystem.class new file mode 100644 index 000000000..01c8c27b0 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/OperatingSystem.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/PunishmentStorage.class b/Management-Server/build/classes/java/main/ms/system/PunishmentStorage.class new file mode 100644 index 000000000..c68fb73f8 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/PunishmentStorage.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/ShutdownSequence.class b/Management-Server/build/classes/java/main/ms/system/ShutdownSequence.class new file mode 100644 index 000000000..5ab12f32b Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/ShutdownSequence.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/communication/ClanRank.class b/Management-Server/build/classes/java/main/ms/system/communication/ClanRank.class new file mode 100644 index 000000000..744488838 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/communication/ClanRank.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/communication/ClanRepository.class b/Management-Server/build/classes/java/main/ms/system/communication/ClanRepository.class new file mode 100644 index 000000000..15b1e2777 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/communication/ClanRepository.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/communication/CommunicationInfo.class b/Management-Server/build/classes/java/main/ms/system/communication/CommunicationInfo.class new file mode 100644 index 000000000..36db003e1 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/communication/CommunicationInfo.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/mysql/SQLColumn.class b/Management-Server/build/classes/java/main/ms/system/mysql/SQLColumn.class new file mode 100644 index 000000000..f2c1def83 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/mysql/SQLColumn.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/mysql/SQLEntryHandler.class b/Management-Server/build/classes/java/main/ms/system/mysql/SQLEntryHandler.class new file mode 100644 index 000000000..1ef651b93 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/mysql/SQLEntryHandler.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/mysql/SQLManager.class b/Management-Server/build/classes/java/main/ms/system/mysql/SQLManager.class new file mode 100644 index 000000000..979ec689b Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/mysql/SQLManager.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/mysql/SQLTable.class b/Management-Server/build/classes/java/main/ms/system/mysql/SQLTable.class new file mode 100644 index 000000000..5a4860404 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/mysql/SQLTable.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/mysql/WorldListSQLHandler.class b/Management-Server/build/classes/java/main/ms/system/mysql/WorldListSQLHandler.class new file mode 100644 index 000000000..21c9e3e9b Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/mysql/WorldListSQLHandler.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/util/ByteBufferUtils.class b/Management-Server/build/classes/java/main/ms/system/util/ByteBufferUtils.class new file mode 100644 index 000000000..0e79f13ed Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/util/ByteBufferUtils.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/util/Command.class b/Management-Server/build/classes/java/main/ms/system/util/Command.class new file mode 100644 index 000000000..b6e577d71 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/util/Command.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/util/EncryptionManager$BCrypt.class b/Management-Server/build/classes/java/main/ms/system/util/EncryptionManager$BCrypt.class new file mode 100644 index 000000000..e84efec14 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/util/EncryptionManager$BCrypt.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/util/EncryptionManager.class b/Management-Server/build/classes/java/main/ms/system/util/EncryptionManager.class new file mode 100644 index 000000000..1550eba4c Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/util/EncryptionManager.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/util/PlayerDatabaseGen.class b/Management-Server/build/classes/java/main/ms/system/util/PlayerDatabaseGen.class new file mode 100644 index 000000000..32a70c2a0 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/util/PlayerDatabaseGen.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/util/StringUtils.class b/Management-Server/build/classes/java/main/ms/system/util/StringUtils.class new file mode 100644 index 000000000..e720c71ef Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/util/StringUtils.class differ diff --git a/Management-Server/build/classes/java/main/ms/system/util/TaskExecutor.class b/Management-Server/build/classes/java/main/ms/system/util/TaskExecutor.class new file mode 100644 index 000000000..b4e4bfcaa Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/system/util/TaskExecutor.class differ diff --git a/Management-Server/build/classes/java/main/ms/world/GameServer.class b/Management-Server/build/classes/java/main/ms/world/GameServer.class new file mode 100644 index 000000000..c30825018 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/world/GameServer.class differ diff --git a/Management-Server/build/classes/java/main/ms/world/PlayerSession.class b/Management-Server/build/classes/java/main/ms/world/PlayerSession.class new file mode 100644 index 000000000..6e740fce3 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/world/PlayerSession.class differ diff --git a/Management-Server/build/classes/java/main/ms/world/WorldDatabase.class b/Management-Server/build/classes/java/main/ms/world/WorldDatabase.class new file mode 100644 index 000000000..59e1d8afe Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/world/WorldDatabase.class differ diff --git a/Management-Server/build/classes/java/main/ms/world/info/CountryFlag.class b/Management-Server/build/classes/java/main/ms/world/info/CountryFlag.class new file mode 100644 index 000000000..76e9b90cc Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/world/info/CountryFlag.class differ diff --git a/Management-Server/build/classes/java/main/ms/world/info/Response.class b/Management-Server/build/classes/java/main/ms/world/info/Response.class new file mode 100644 index 000000000..60a5b8b20 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/world/info/Response.class differ diff --git a/Management-Server/build/classes/java/main/ms/world/info/UIDInfo.class b/Management-Server/build/classes/java/main/ms/world/info/UIDInfo.class new file mode 100644 index 000000000..d8c1d9043 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/world/info/UIDInfo.class differ diff --git a/Management-Server/build/classes/java/main/ms/world/info/WorldInfo.class b/Management-Server/build/classes/java/main/ms/world/info/WorldInfo.class new file mode 100644 index 000000000..0647db560 Binary files /dev/null and b/Management-Server/build/classes/java/main/ms/world/info/WorldInfo.class differ diff --git a/Management-Server/build/kotlin/compileKotlin/build-history.bin b/Management-Server/build/kotlin/compileKotlin/build-history.bin new file mode 100644 index 000000000..bd51ec7d6 Binary files /dev/null and b/Management-Server/build/kotlin/compileKotlin/build-history.bin differ diff --git a/Management-Server/build/kotlin/compileKotlin/last-build.bin b/Management-Server/build/kotlin/compileKotlin/last-build.bin new file mode 100644 index 000000000..6a649081c Binary files /dev/null and b/Management-Server/build/kotlin/compileKotlin/last-build.bin differ diff --git a/Management-Server/build/tmp/compileJava/source-classes-mapping.txt b/Management-Server/build/tmp/compileJava/source-classes-mapping.txt new file mode 100644 index 000000000..ef675219c --- /dev/null +++ b/Management-Server/build/tmp/compileJava/source-classes-mapping.txt @@ -0,0 +1,102 @@ +ms/system/ShutdownSequence.java + ms.system.ShutdownSequence +ms/world/GameServer.java + ms.world.GameServer +ms/ServerConstants.java + ms.ServerConstants +ms/world/WorldDatabase.java + ms.world.WorldDatabase +ms/system/util/StringUtils.java + ms.system.util.StringUtils +ms/net/event/PacketWriteEvent.java + ms.net.event.PacketWriteEvent + ms.net.event.PacketWriteEvent$1 +ms/net/event/RegistryWriteEvent.java + ms.net.event.RegistryWriteEvent +ms/net/EventProducer.java + ms.net.EventProducer +ms/system/mysql/SQLTable.java + ms.system.mysql.SQLTable +ms/classloader/ClassLoadServer.java + ms.classloader.ClassLoadServer +ms/system/mysql/SQLEntryHandler.java + ms.system.mysql.SQLEntryHandler +ms/system/mysql/SQLColumn.java + ms.system.mysql.SQLColumn +ms/net/IoEventHandler.java + ms.net.IoEventHandler +ms/world/info/UIDInfo.java + ms.world.info.UIDInfo +ms/Management.java + ms.Management + ms.Management$1 + ms.Management$2 + ms.Management$3 + ms.Management$4 + ms.Management$5 + ms.Management$6 + ms.Management$7 + ms.Management$8 +ms/system/mysql/WorldListSQLHandler.java + ms.system.mysql.WorldListSQLHandler +ms/world/PlayerSession.java + ms.world.PlayerSession +ms/system/PunishmentStorage.java + ms.system.PunishmentStorage +ms/net/packet/WorldPacketRepository.java + ms.net.packet.WorldPacketRepository +ms/system/mysql/SQLManager.java + ms.system.mysql.SQLManager +ms/classloader/WorkerThread.java + ms.classloader.WorkerThread +ms/net/event/PacketReadEvent.java + ms.net.event.PacketReadEvent +ms/system/communication/CommunicationInfo.java + ms.system.communication.CommunicationInfo +ms/net/event/HSWriteEvent.java + ms.net.event.HSWriteEvent +ms/net/event/HSReadEvent.java + ms.net.event.HSReadEvent +ms/net/packet/PacketHeader.java + ms.net.packet.PacketHeader +ms/world/info/WorldInfo.java + ms.world.info.WorldInfo +ms/net/producer/RegistryEventProducer.java + ms.net.producer.RegistryEventProducer +ms/world/info/Response.java + ms.world.info.Response +ms/net/IoWriteEvent.java + ms.net.IoWriteEvent +ms/system/util/Command.java + ms.system.util.Command +ms/system/communication/ClanRepository.java + ms.system.communication.ClanRepository +ms/system/util/EncryptionManager.java + ms.system.util.EncryptionManager + ms.system.util.EncryptionManager$BCrypt +ms/net/NioReactor.java + ms.net.NioReactor +ms/system/communication/ClanRank.java + ms.system.communication.ClanRank +ms/system/OperatingSystem.java + ms.system.OperatingSystem +ms/net/IoSession.java + ms.net.IoSession +ms/system/util/TaskExecutor.java + ms.system.util.TaskExecutor +ms/world/info/CountryFlag.java + ms.world.info.CountryFlag +ms/net/event/RegistryReadEvent.java + ms.net.event.RegistryReadEvent +ms/net/producer/HSEventProducer.java + ms.net.producer.HSEventProducer +ms/net/IoReadEvent.java + ms.net.IoReadEvent +ms/net/producer/PacketEventProducer.java + ms.net.producer.PacketEventProducer +ms/net/packet/IoBuffer.java + ms.net.packet.IoBuffer +ms/system/util/ByteBufferUtils.java + ms.system.util.ByteBufferUtils +ms/system/util/PlayerDatabaseGen.java + ms.system.util.PlayerDatabaseGen diff --git a/Management-Server/src/main/java/ms/Management.java b/Management-Server/src/main/java/ms/Management.java new file mode 100644 index 000000000..73df899dd --- /dev/null +++ b/Management-Server/src/main/java/ms/Management.java @@ -0,0 +1,172 @@ +package ms; + +import ms.classloader.ClassLoadServer; +import ms.net.NioReactor; +import ms.net.packet.WorldPacketRepository; +import ms.system.ShutdownSequence; +import ms.system.mysql.SQLManager; +import ms.system.util.Command; +import ms.world.GameServer; +import ms.world.PlayerSession; +import ms.world.WorldDatabase; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Scanner; + +/** + * The main class. + * @author Emperor + * + */ +public final class Management { + + /** + * If the shutdown hook is active. + */ + public static boolean active = true; + + /** + * The commands. + */ + private static final Command[] COMMANDS = { + new Command("-commands", "Print a list of all commands.") { + @Override + public void run(String...args) { + for (Command c : COMMANDS) { + System.out.println("Command " + c.getName() + ": " + c.getInfo()); + } + } + }, + new Command("-s", "Safely shuts down the server.") { + @Override + public void run(String...args) { + System.out.println("Shutting down Management server..."); + ShutdownSequence.shutdown(); + } + }, + new Command("-debug", "Debug world info.") { + @Override + public void run(String...args) { + System.out.println("---------------------------------------------"); + for (GameServer server : WorldDatabase.getWorlds()) { + if (server != null) { + System.out.println("World [id=" + server.getInfo().getWorldId() + ", IP=" + server.getInfo().getAddress() + ", country=" + server.getInfo().getCountry() + ", members=" + server.getInfo().isMembers() + ", players=" + server.getPlayers().size() + ", active=" + server.isActive() + "]."); + } + } + } + }, + new Command("-pinfo", "Debugs player information (usage: -pinfo emperor).") { + @Override + public void run(String...args) { + String name = args[1]; + PlayerSession player = WorldDatabase.getPlayer(name); + if (player == null) { + System.out.println("Player " + name + " was not registered!"); + return; + } + System.out.println("Player [name=" + name + ", world=" + player.getWorldId() + ", active=" + player.isActive() + "]."); + } + }, + new Command("-update", "Calls an update on all the game servers (-update -1 to cancel).") { + @Override + public void run(String...args) { + int ticks = Integer.parseInt(args[1]); + for (GameServer server : WorldDatabase.getWorlds()) { + if (server != null && server.isActive()) { + WorldPacketRepository.sendUpdate(server, ticks); + } + } + } + }, + new Command("-reloadconfig", "Reloads the configurations of all worlds.") { + + @Override + public void run(String... args) { + for (GameServer server : WorldDatabase.getWorlds()) { + if(server == null) { + continue; + } + WorldPacketRepository.sendConfigReload(server); + } + } + }, + + new Command("-rlcache", "Reloads launcher/client resource cache") { + @Override + public void run(String... args) { + ClassLoadServer.resetResourceCache(); + System.out.println("Reloaded resource cache!"); + } + }, + + new Command("-kick", "Kicks a player from the MS (not ingame).") { + @Override + public void run(String... args) { + String name = args[1]; + PlayerSession player = WorldDatabase.getPlayer(name); + if (player == null) { + System.out.println("Player " + name + " was not registered!"); + return; + } + player.getWorld().getPlayers().remove(name); + player.setWorldId(0); + System.out.println("Kicked player " + name + "!"); + } + } + }; + + /** + * The main method. + * @param args The arguments cast on runtime. + * @throws Throwable When an exception occurs. + */ + public static void main(String...args) throws Throwable { + if (!isLocallyHosted(ServerConstants.HOST_ADDRESS)) { + System.err.println("WARNING: Configure host address in server constants!"); + } + System.out.println("-------- 530 Management server --------"); + System.out.println("Starting up..."); + SQLManager.init(); + //NioReactor.configure(ServerConstants.PORT).start(); + NioReactor.configure(5555).start(); + new ClassLoadServer().start(); + Runtime.getRuntime().addShutdownHook(new ShutdownSequence()); + System.out.println("Status: ready."); + System.out.println("Use -commands for a list of commands!"); + Scanner s = new Scanner(System.in); + while (s.hasNext()) { + try { + String command = s.nextLine(); + if (!command.startsWith("-")) { + continue; + } + String[] arguments = command.split(" "); + command = arguments[0]; + for (Command c : COMMANDS) { + if (c.getName().equals(command)) { + System.out.println("Handling command \"" + command + "\"!"); + c.run(arguments); + } + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + s.close(); + } + + /** + * Checks if the Management server is locally hosted. + * @return {@code True} if so. + * @throws IOException When an I/O exception occurs. + */ + private static boolean isLocallyHosted(String ip) throws IOException { + InetAddress address = InetAddress.getByName(ip); + if (address.isAnyLocalAddress() || address.isLoopbackAddress()) { + return true; + } + return NetworkInterface.getByInetAddress(address) != null; + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/ServerConstants.java b/Management-Server/src/main/java/ms/ServerConstants.java new file mode 100644 index 000000000..385378744 --- /dev/null +++ b/Management-Server/src/main/java/ms/ServerConstants.java @@ -0,0 +1,84 @@ +package ms; + +import ms.system.OperatingSystem; + +/** + * Holds constants for the management server. + * @author v4rg + * + */ +public final class ServerConstants { + + /** + * The port to be used for communications. + */ + public static final String SERVER_NAME = "2009Scape"; + + /** + * The port to be used for communications. + */ + public static final int PORT = 5555; + + /** + * The maximum amount of worlds. + */ + public static final int WORLD_LIMIT = 10; + + /** + * The world switching delay in milliseconds. + */ + public static final long WORLD_SWITCH_DELAY = 20_000l; + + /** + * The address of the Management server. + */ + public static final String HOST_ADDRESS = "127.0.0.1"; + + /** + * The store path. + */ + public static final String STORE_PATH = "./store/"; + + /** + * The maximum amount of players per world. + */ + public static final int MAX_PLAYERS = (1 << 11) - 1; + + /** + * The operating system of the management server + */ + public static final OperatingSystem OS = System.getProperty("os.name").toUpperCase().contains("WIN") ? OperatingSystem.WINDOWS : OperatingSystem.UNIX; + + /** + * The administrators. + */ + public static final String[] ADMINISTRATORS = { + "redsparr0w", + }; + + public static final String[] DATABASE_NAMES = { + "server", + "global", + }; + + /** + * Stops from instantiating. + */ + private ServerConstants() { + /* + * empty. + */ + } + + /** + * Fixes a path to a specified operating system + * @param operatingSystem The os type. + * @param path The path. + * @return The fixed path. + */ + public static String fixPath(OperatingSystem operatingSystem, String path) { + if (operatingSystem == null) + operatingSystem = OS; + return operatingSystem == OperatingSystem.WINDOWS ? path.replace("/","\\") : path.replace("\\","/"); + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/classloader/ClassLoadServer.java b/Management-Server/src/main/java/ms/classloader/ClassLoadServer.java new file mode 100644 index 000000000..cfbae574a --- /dev/null +++ b/Management-Server/src/main/java/ms/classloader/ClassLoadServer.java @@ -0,0 +1,109 @@ +package ms.classloader; + +import ms.Management; +import ms.ServerConstants; + +import java.io.File; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.util.HashMap; + +/** + * ClassLoadServer + * @author Clayton Williams (Hope) + */ +public class ClassLoadServer extends Thread { + + /** + * Listening port + */ + private static final int PORT = 5050; + + /** + * serverSocket for incoming connections + */ + private ServerSocket serverSocket = null; + + /** + * Holds classes and resources already added in the server + */ + protected static HashMap resourceCache = new HashMap(); + + /** + * New socket + * @throws UnknownHostException + * @throws IOException + */ + public ClassLoadServer() { + try { + serverSocket = new ServerSocket(PORT); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * Listen for incoming connections + */ + @Override + public void run() { + resetResourceCache(); + // System.out.println("Listening on port " + PORT + "..."); + while (Management.active) { + Socket clientSocket = null; + try { + clientSocket = serverSocket.accept(); + //System.out.println("New Connection from : " + clientSocket.getInetAddress()); + WorkerThread wcs = new WorkerThread(clientSocket); + wcs.start(); + } catch (Exception e) {} + } + } + + /** + * Loads resources recursively from a starting root directory and adds the file bytes to our cache + * @param path + * @param pathRoot + */ + private static void loadResources(String path, String pathRoot) { + try { + path = ServerConstants.fixPath(null, path); + pathRoot = ServerConstants.fixPath(null, pathRoot); + File root = new File(path); + File[] list = root.listFiles(); + if (list == null) return; + for (File f : list) { + if (f.isDirectory()) { + loadResources(f.getAbsolutePath(), pathRoot); + } else { + if (f.exists()) { + if (!f.getName().startsWith(".")) { + byte[] bytes = Files.readAllBytes(f.toPath()); + String name = ServerConstants.fixPath(null, f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf(pathRoot))); + //System.out.println("[ClassLoadServer] Loaded resource '" + f.getName() + + // "' Size: " + NumberFormat.getInstance().format(bytes.length) + " bytes"); + resourceCache.put(name, bytes); + } + } + } + } + } catch(Exception e) { + e.printStackTrace(); + } + } + + /** + * Empties the class cache and loads resources + */ + public static void resetResourceCache() { + resourceCache.clear(); + //loadResources("bin/org/keldagrim/launcher/", "org/arios/launcher/"); + //loadResources("resources/", "org/keldagrim/launcher/"); + //System.out.println("Loaded all resources!"); + } + +} diff --git a/Management-Server/src/main/java/ms/classloader/WorkerThread.java b/Management-Server/src/main/java/ms/classloader/WorkerThread.java new file mode 100644 index 000000000..c9af27f6a --- /dev/null +++ b/Management-Server/src/main/java/ms/classloader/WorkerThread.java @@ -0,0 +1,136 @@ +package ms.classloader; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.Socket; +import java.util.Map; + +import ms.ServerConstants; +import ms.system.OperatingSystem; + +/** + * Worker thread for launcher connections + * @author Clayton Williams (Hope) + * + */ +public class WorkerThread extends Thread { + + /** + * Our launcher connection + */ + private Socket launcher = null; + + /** + * Input stream from launcher + */ + private ObjectInputStream is = null; + + /** + * Output stream to launcher + */ + private ObjectOutputStream os = null; + + /** + * The user's operating system type + */ + private OperatingSystem operatingSystem = OperatingSystem.WINDOWS; + + /** + * Creates a new worker thread to handle the launcher requests + * @param socket + * @param classesCache + * @throws IOException + */ + public WorkerThread(Socket launcher) throws IOException { + super(); + this.launcher = launcher; + try { + os = new ObjectOutputStream(new BufferedOutputStream(this.launcher.getOutputStream())); + os.flush(); + is = new ObjectInputStream(new BufferedInputStream(launcher.getInputStream())); + } catch (IOException ioe) { + this.launcher.close(); + } + } + + /** + * Input Stream handler + */ + @SuppressWarnings("unused") //saving resource type for later + public void run() { + byte opcode = -1; + try { + while (true) { + opcode = is.readByte(); + switch(opcode) { + case 1: //requests revision + operatingSystem = is.readUTF().contains("UNIX") ? OperatingSystem.UNIX : OperatingSystem.WINDOWS; + os.reset(); + os.writeInt(ClassLoadServer.resourceCache.size());//#customresources + for (Map.Entry hm : ClassLoadServer.resourceCache.entrySet()) { + os.writeUTF(ServerConstants.fixPath(operatingSystem, (String) hm.getKey())); + os.writeInt(hm.getValue().length); + } + os.writeByte(1); //number of custom resources + //followed by 2 strings + //System.err.println(operatingSystem.name()); + os.writeUTF(ServerConstants.fixPath(operatingSystem, "ms/launcher/arios-gamepack-530.jar")); + os.writeUTF("BINARY"); + os.flush(); + break; + case 2: //resource request + String resourceName = ServerConstants.fixPath(null, is.readUTF()); + String resourceType = is.readUTF(); + if (ClassLoadServer.resourceCache.containsKey(resourceName)) { + sendResource(ClassLoadServer.resourceCache.get(resourceName)); + //System.out.println("Sent Resource: " + resourceName); + } else { + sendOpcode(-1); + //System.out.println("Could not send resource '" + resourceName + "'"); + } + break; + default: + System.out.println("Unhandled opcode=" + opcode); + break; + } + } + } catch(Exception e) { + //System.out.println("Client force disconnect."); + } finally { + try { + is.close(); + os.close(); + launcher.close(); + } catch (Exception e) {} + } + } + + /** + * send a byte array packet to the client + * @exception IOException file read error. + */ + protected void sendResource(byte [] bytes) throws IOException { + os.reset(); + os.writeByte(2); + os.writeInt(bytes.length); + for (int i = 0; i < bytes.length; i++) { + os.writeByte(bytes[i]); + } + os.flush(); + } + + /** + * Send no data opcodes + * @param opcode + * @throws IOException + */ + protected void sendOpcode(int opcode) throws IOException { + os.reset(); + os.writeByte(opcode); + os.flush(); + } + +} diff --git a/Management-Server/src/main/java/ms/net/EventProducer.java b/Management-Server/src/main/java/ms/net/EventProducer.java new file mode 100644 index 000000000..9f3093c1c --- /dev/null +++ b/Management-Server/src/main/java/ms/net/EventProducer.java @@ -0,0 +1,28 @@ +package ms.net; + +import java.nio.ByteBuffer; + +/** + * Used for producing I/O events. + * @author Emperor + * + */ +public interface EventProducer { + + /** + * Produces a new read event. + * @param session The session. + * @param buffer The buffer to read. + * @return The read event handler. + */ + IoReadEvent produceReader(IoSession session, ByteBuffer buffer); + + /** + * Produces a new writing event. + * @param session The session. + * @param context The context. + * @return The write event handler. + */ + IoWriteEvent produceWriter(IoSession session, Object context); + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/IoEventHandler.java b/Management-Server/src/main/java/ms/net/IoEventHandler.java new file mode 100644 index 000000000..22fbfd2c9 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/IoEventHandler.java @@ -0,0 +1,106 @@ +package ms.net; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ClosedChannelException; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.concurrent.ExecutorService; + +/** + * I/O event handling. + * @author Emperor + * + */ +public final class IoEventHandler { + + /** + * The executor service. + */ + private final ExecutorService service; + + /** + * Constructs a new {@code IoEventHandler}. + * @param service The executor service used for handling events. + */ + public IoEventHandler(ExecutorService service) { + this.service = service; + } + + /** + * Called when making a new connection. + * @param key The selection key. + */ + public void connect(SelectionKey key) { + /* + * empty. + */ + } + + /** + * Used for accepting a new connection. + * @param key The selection key. + * @param selector The selector. + * @throws IOException When an I/O exception occurs. + */ + public void accept(SelectionKey key, Selector selector) throws IOException { + SocketChannel sc = ((ServerSocketChannel) key.channel()).accept(); + sc.configureBlocking(false); + sc.socket().setTcpNoDelay(true); + sc.register(selector, SelectionKey.OP_READ); + } + + /** + * Reads the incoming packet data. + * @param key The selection key. + * @throws IOException When an I/O exception occurs. + */ + public void read(SelectionKey key) throws IOException { + ReadableByteChannel channel = (ReadableByteChannel) key.channel(); + ByteBuffer buffer = ByteBuffer.allocate(100_000); + IoSession session = (IoSession) key.attachment(); + if (channel.read(buffer) == -1) { + System.out.println("Existing session disconnected - likely portscanner or server status checker."); + key.cancel(); + return; + } + buffer.flip(); + if (session == null) { + key.attach(session = new IoSession(key, service)); + } + service.execute(session.getProducer().produceReader(session, buffer)); + } + + /** + * Writes the outgoing packet data. + * @param key The selection key. + */ + public void write(SelectionKey key) { + IoSession session = (IoSession) key.attachment(); + key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE); + session.write(); + } + + /** + * Disconnects a connection. + * @param key The selection key. + * @param t The occurred exception (if any). + */ + public void disconnect(SelectionKey key, Throwable t) { + try { + IoSession session = (IoSession) key.attachment(); + String cause = "" + t; + if (t != null && !(t instanceof ClosedChannelException || cause.contains("De externe host") || cause.contains("De software op uw") || cause.contains("An established connection was aborted") || cause.contains("An existing connection") || cause.contains("AsynchronousClose"))) { + t.printStackTrace(); + } + if (session != null) { + session.disconnect(); + } + } catch (Throwable e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/IoReadEvent.java b/Management-Server/src/main/java/ms/net/IoReadEvent.java new file mode 100644 index 000000000..74de5d5bd --- /dev/null +++ b/Management-Server/src/main/java/ms/net/IoReadEvent.java @@ -0,0 +1,73 @@ +package ms.net; + +import java.nio.ByteBuffer; + +/** + * Handles a reading event. + * @author Emperor + * + */ +public abstract class IoReadEvent implements Runnable { + + /** + * The I/O session. + */ + private final IoSession session; + + /** + * The buffer. + */ + private ByteBuffer buffer; + + /** + * If the queued reading buffer was used (debugging purposes). + */ + protected boolean usedQueuedBuffer; + + /** + * Constructs a new {@code IoReadEvent}. + * @param session The session. + * @param buffer The buffer to read from. + */ + public IoReadEvent(IoSession session, ByteBuffer buffer) { + this.session = session; + this.buffer = buffer; + } + + @Override + public void run() { + try { + if (session.getReadingQueue() != null) { + buffer = session.getReadingQueue().put(buffer); + buffer.flip(); + session.setReadingQueue(null); + usedQueuedBuffer = true; + } + read(session, buffer); + } catch (Throwable t) { + t.printStackTrace(); + session.disconnect(); + } + } + + /** + * Queues the buffer until more data has been received. + * @param data The data that has been read already. + */ + public void queueBuffer(int...data) { + ByteBuffer queue = ByteBuffer.allocate(data.length + buffer.remaining() + 100_000); + for (int value : data) { + queue.put((byte) value); + } + queue.put(buffer); + session.setReadingQueue(queue); + } + + /** + * Reads the data from the buffer. + * @param session The session. + * @param buffer The buffer to read from. + */ + public abstract void read(IoSession session, ByteBuffer buffer); + +} diff --git a/Management-Server/src/main/java/ms/net/IoSession.java b/Management-Server/src/main/java/ms/net/IoSession.java new file mode 100644 index 000000000..21a836534 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/IoSession.java @@ -0,0 +1,351 @@ +package ms.net; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import ms.ServerConstants; +import ms.net.producer.HSEventProducer; +import ms.world.GameServer; + +/** + * Represents a connected I/O session. + * @author Emperor + * + */ +public class IoSession { + + /** + * The handshake event producer. + */ + private static final EventProducer HANDSHAKE_PRODUCER = new HSEventProducer(); + + /** + * The selection key. + */ + private final SelectionKey key; + + /** + * The executor service. + */ + private final ExecutorService service; + + /** + * The event producer. + */ + private EventProducer producer = HANDSHAKE_PRODUCER; + + /** + * The currently queued writing data. + */ + private List writingQueue = new ArrayList<>(); + + /** + * The currently queued reading data. + */ + private ByteBuffer readingQueue; + + /** + * The writing lock. + */ + private Lock writingLock = new ReentrantLock(); + + /** + * The name hash. + */ + private int nameHash; + + /** + * The server key. + */ + private long serverKey; + + /** + * The JS-5 encryption value. + */ + private int js5Encryption; + + /** + * If the session is active. + */ + private boolean active = true; + + /** + * The last ping time stamp. + */ + private long lastPing; + + /** + * The address. + */ + private final String address; + + /** + * The game server object for this session. + */ + private GameServer gameServer; + + /** + * Constructs a new {@code IoSession}. + * @param key The selection key. + * @param service The executor service. + */ + public IoSession(SelectionKey key, ExecutorService service) { + this.key = key; + this.service = service; + String address = getRemoteAddress().replaceAll("/", "").split(":")[0]; + if (address.equals("127.0.0.1")) { + address = ServerConstants.HOST_ADDRESS; + } + this.address = address; + } + + /** + * Fires a write event created using the current event producer. + * @param context The event context. + */ + public void write(Object context) { + write(context, false); + } + + /** + * Fires a write event created using the current event producer. + * @param context The event context. + * @param instant If the event should be instantly executed on this thread. + */ + public void write(Object context, boolean instant) { + if (context == null) { + throw new IllegalStateException("Invalid writing context!"); + } + if (instant) { + producer.produceWriter(this, context).run(); + return; + } + service.execute(producer.produceWriter(this, context)); + } + + /** + * Sends the packet data (without write event encoding). + * @param buffer The buffer. + */ + public void queue(ByteBuffer buffer) { + try { + writingLock.tryLock(1000L, TimeUnit.MILLISECONDS); + } catch (Exception e){ + System.out.println(e); + writingLock.unlock(); + return; + } + writingQueue.add(buffer); + writingLock.unlock(); + write(); + } + + /** + * Handles the writing of all buffers in the queue. + */ + public void write() { + if (!key.isValid()) { + disconnect(); + return; + } + writingLock.lock(); + SocketChannel channel = (SocketChannel) key.channel(); + try { + while (!writingQueue.isEmpty()) { + ByteBuffer buffer = writingQueue.get(0); + channel.write(buffer); + if (buffer.hasRemaining()) { + key.interestOps(key.interestOps() | SelectionKey.OP_WRITE); + break; + } + writingQueue.remove(0); + } + } catch (IOException e) { + disconnect(); + } + writingLock.unlock(); + } + + /** + * Disconnects the session. + */ + public void disconnect() { + try { + if (!active) { + return; + } + active = false; + key.cancel(); + SocketChannel channel = (SocketChannel) key.channel(); + channel.socket().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Gets the IP-address (without the port). + * @return The address. + */ + public String getAddress() { + return address; + } + + /** + * Gets the remote address of this session. + * @return The remote address, as a String. + */ + public String getRemoteAddress() { + try { + return ((SocketChannel) key.channel()).getRemoteAddress().toString(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + /** + * Gets the current event producer. + * @return The producer. + */ + public EventProducer getProducer() { + return producer; + } + + /** + * Sets the event producer. + * @param producer The producer to set. + */ + public void setProducer(EventProducer producer) { + this.producer = producer; + } + + /** + * Gets the queued reading data. + * @return The readingQueue. + */ + public ByteBuffer getReadingQueue() { + synchronized (this) { + return readingQueue; + } + } + + /** + * Queues reading data. + * @param readingQueue The readingQueue to set. + */ + public void setReadingQueue(ByteBuffer readingQueue) { + synchronized (this) { + this.readingQueue = readingQueue; + } + } + + /** + * Gets the writing lock. + * @return The writing lock. + */ + public Lock getWritingLock() { + return writingLock; + } + + /** + * Gets the selection key. + * @return The selection key. + */ + public SelectionKey getKey() { + return key; + } + + /** + * @return The active. + */ + public boolean isActive() { + return active; + } + + /** + * @return The js5Encryption. + */ + public int getJs5Encryption() { + return js5Encryption; + } + + /** + * @param js5Encryption The js5Encryption to set. + */ + public void setJs5Encryption(int js5Encryption) { + this.js5Encryption = js5Encryption; + } + + /** + * Gets the lastPing. + * @return The lastPing. + */ + public long getLastPing() { + return lastPing; + } + + /** + * Sets the lastPing. + * @param lastPing The lastPing to set. + */ + public void setLastPing(long lastPing) { + this.lastPing = lastPing; + } + + /** + * Gets the nameHash. + * @return The nameHash. + */ + public int getNameHash() { + return nameHash; + } + + /** + * Sets the nameHash. + * @param nameHash The nameHash to set. + */ + public void setNameHash(int nameHash) { + this.nameHash = nameHash; + } + + /** + * Gets the serverKey. + * @return The serverKey. + */ + public long getServerKey() { + return serverKey; + } + + /** + * Sets the serverKey. + * @param serverKey The serverKey to set. + */ + public void setServerKey(long serverKey) { + this.serverKey = serverKey; + } + + /** + * Gets the gameServer value. + * @return The gameServer. + */ + public GameServer getGameServer() { + return gameServer; + } + + /** + * Sets the gameServer value. + * @param gameServer The gameServer to set. + */ + public void setGameServer(GameServer gameServer) { + this.gameServer = gameServer; + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/IoWriteEvent.java b/Management-Server/src/main/java/ms/net/IoWriteEvent.java new file mode 100644 index 000000000..5ed73d653 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/IoWriteEvent.java @@ -0,0 +1,50 @@ +package ms.net; + +import java.nio.channels.CancelledKeyException; + +/** + * Handles a writing event. + * @author Emperor + */ +public abstract class IoWriteEvent implements Runnable { + + /** + * The I/O session. + */ + private final IoSession session; + + /** + * The buffer. + */ + private final Object context; + + /** + * Constructs a new {@code IoWriteEvent}. + * @param session The session. + * @param context The write event context. + */ + public IoWriteEvent(IoSession session, Object context) { + this.session = session; + this.context = context; + } + + @Override + public void run() { + try { + write(session, context); + } catch (Throwable t) { + if (!(t instanceof CancelledKeyException)) { + t.printStackTrace(); + } + session.disconnect(); + } + } + + /** + * Writes the data. + * @param session The session. + * @param context The write event context. + */ + public abstract void write(IoSession session, Object context); + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/NioReactor.java b/Management-Server/src/main/java/ms/net/NioReactor.java new file mode 100644 index 000000000..8c28177ad --- /dev/null +++ b/Management-Server/src/main/java/ms/net/NioReactor.java @@ -0,0 +1,133 @@ +package ms.net; + +import ms.Management; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.util.Iterator; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * Handles (NIO-based) networking events using the reactor pattern. + * @author Emperor + */ +public final class NioReactor implements Runnable { + + /** + * The executor service. + */ + private final ExecutorService service; + + /** + * The selector + */ + private Selector selector; + + /** + * The socket channel. + */ + private ServerSocketChannel channel; + + /** + * The I/O event handling instance. + */ + private final IoEventHandler eventHandler; + + /** + * If the reactor is running. + */ + private boolean running; + + /** + * Constructs a new {@code NioReactor}. + * @param poolSize The pool size. + */ + private NioReactor(int poolSize) { + this.service = Executors.newSingleThreadScheduledExecutor(); + this.eventHandler = new IoEventHandler(Executors.newFixedThreadPool(poolSize)); + } + + /** + * Creates and configures a new {@code NioReactor} with a pool size of 1. + * @param port The port. + * @return The {@code NioReactor} {@code Object}. + * @throws IOException When an I/O exception occurs. + */ + public static NioReactor configure(int port) throws IOException { + return configure(port, 1); + } + + /** + * Creates and configures a new {@code NioReactor}. + * @param port The port. + * @param poolSize The amount of threads in the thread pool. + * @return The {@code NioReactor} {@code Object}. + * @throws IOException When an I/O exception occurs. + */ + public static NioReactor configure(int port, int poolSize) throws IOException { + NioReactor reactor = new NioReactor(poolSize); + reactor.channel = ServerSocketChannel.open(); + reactor.selector = Selector.open(); + reactor.channel.bind(new InetSocketAddress(port)); + reactor.channel.configureBlocking(false); + reactor.channel.register(reactor.selector, SelectionKey.OP_ACCEPT); + return reactor; + } + + /** + * Starts the reactor. + */ + public void start() { + running = true; + service.execute(this); + } + + @Override + public void run() { + while (running && Management.active) { + try { + if(selector.select() > 0){ + Iterator keys = selector.selectedKeys().iterator(); + while (keys.hasNext()) { + SelectionKey key = keys.next(); + keys.remove(); + try { + if (!key.isValid() || !key.channel().isOpen()) { + key.cancel(); + continue; + } + if (key.isAcceptable()) { + eventHandler.accept(key, selector); + } + if (key.isReadable()) { + eventHandler.read(key); + } + else if (key.isWritable()) { + eventHandler.write(key); + } + } catch (Throwable t) { + eventHandler.disconnect(key, t); + } + } + } else { + System.out.println("SLEEPING"); + Thread.sleep(200); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * Terminates the reactor (once it's done processing current I/O events). + */ + public void terminate() { + running = false; + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/event/HSReadEvent.java b/Management-Server/src/main/java/ms/net/event/HSReadEvent.java new file mode 100644 index 000000000..ac12befc0 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/event/HSReadEvent.java @@ -0,0 +1,54 @@ +package ms.net.event; + +import java.nio.ByteBuffer; + +import ms.net.IoReadEvent; +import ms.net.IoSession; +import ms.world.WorldDatabase; +import ms.system.util.ByteBufferUtils; + +/** + * Handles handshake read events. + * @author Emperor + */ +public final class HSReadEvent extends IoReadEvent { + + /** + * The password used to verify + */ + private static final String PASSWORD = "0x14ari0SSbh98989910"; + + /** + * Constructs a new {@code HSReadEvent}. + * @param session The session. + * @param buffer The buffer. + */ + public HSReadEvent(IoSession session, ByteBuffer buffer) { + super(session, buffer); + } + + @Override + public void read(IoSession session, ByteBuffer buffer) { + int opcode = buffer.get() & 0xFF; + switch (opcode) { + case 88: + String password = ByteBufferUtils.getString(buffer); + if (!password.equals(PASSWORD)) { + System.out.println("Password mismatch (attempt=" + password + ")!"); + session.disconnect(); + break; + } + session.write(opcode); + break; + case 255: // World list + int updateStamp = buffer.getInt(); + WorldDatabase.sendUpdate(session, updateStamp); + break; + default: + System.err.println("Unhandled handshake opcode: " + opcode + "."); + session.disconnect(); + break; + } + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/event/HSWriteEvent.java b/Management-Server/src/main/java/ms/net/event/HSWriteEvent.java new file mode 100644 index 000000000..2376b2a90 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/event/HSWriteEvent.java @@ -0,0 +1,38 @@ +package ms.net.event; + +import java.nio.ByteBuffer; + +import ms.net.IoSession; +import ms.net.IoWriteEvent; +import ms.net.producer.RegistryEventProducer; + +/** + * Handles Handshake write events. + * @author Emperor + */ +public final class HSWriteEvent extends IoWriteEvent { + + /** + * The login event producer. + */ + private static final RegistryEventProducer REGISTRY_PRODUCER = new RegistryEventProducer(); + + /** + * Constructs a new {@code HSWriteEvent} {@code Object}. + * @param session The session. + * @param context The context. + */ + public HSWriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + ByteBuffer buffer = ByteBuffer.allocate(9); + buffer.put((byte) 14); + session.setProducer( REGISTRY_PRODUCER); + buffer.flip(); + session.queue(buffer); + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/event/PacketReadEvent.java b/Management-Server/src/main/java/ms/net/event/PacketReadEvent.java new file mode 100644 index 000000000..227751b2f --- /dev/null +++ b/Management-Server/src/main/java/ms/net/event/PacketReadEvent.java @@ -0,0 +1,101 @@ +package ms.net.event; + +import java.nio.ByteBuffer; + +import ms.net.IoReadEvent; +import ms.net.IoSession; +import ms.net.packet.WorldPacketRepository; + +/** + * Handles world packet reading events. + * @author Emperor + * + */ +public final class PacketReadEvent extends IoReadEvent { + + /** + * The packet sizes. + */ + private static final int[] PACKET_SIZE = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + }; + + /** + * Constructs a new {@code PacketReadEvent} {@code Object}. + * @param session The I/O session. + * @param buffer The buffer to read from. + */ + public PacketReadEvent(IoSession session, ByteBuffer buffer) { + super(session, buffer); + } + + @Override + public void read(IoSession session, ByteBuffer buffer) { + int last = -1; + while (buffer.hasRemaining()) { + int opcode = buffer.get() & 0xFF; + if (opcode >= PACKET_SIZE.length) { + break; + } + int header = PACKET_SIZE[opcode]; + int size = header; + if (header < 0) { + size = getPacketSize(buffer, opcode, header, last); + } + if (size == -1) { + break; + } + if (buffer.remaining() < size) { + switch (header) { + case -2: + queueBuffer(opcode, size >> 8, size); + break; + case -1: + queueBuffer(opcode, size); + break; + default: + queueBuffer(opcode); + break; + } + break; + } + byte[] data = new byte[size]; + buffer.get(data); + last = opcode; + try { + WorldPacketRepository.handleIncoming(session, opcode, ByteBuffer.wrap(data)); + } catch (Throwable t) { + t.printStackTrace(); + } + } + } + + /** + * Gets the packet size for the given opcode. + * @param buffer The buffer. + * @param opcode The opcode. + * @param header The packet header. + * @param last The last opcode. + * @return The packet size. + */ + private int getPacketSize(ByteBuffer buffer, int opcode, int header, int last) { + if (header == -1) { + if (buffer.remaining() < 1) { + queueBuffer(opcode); + return -1; + } + return buffer.get() & 0xFF; + } + if (header == -2) { + if (buffer.remaining() < 2) { + queueBuffer(opcode); + return -1; + } + return buffer.getShort() & 0xFFFF; + } + System.err.println("Invalid packet [opcode=" + opcode + ", last=" + last + ", queued=" + usedQueuedBuffer + "]!"); + return -1; + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/event/PacketWriteEvent.java b/Management-Server/src/main/java/ms/net/event/PacketWriteEvent.java new file mode 100644 index 000000000..3ffdeb32f --- /dev/null +++ b/Management-Server/src/main/java/ms/net/event/PacketWriteEvent.java @@ -0,0 +1,46 @@ +package ms.net.event; + +import java.nio.ByteBuffer; + +import ms.net.IoSession; +import ms.net.IoWriteEvent; +import ms.net.packet.IoBuffer; + +/** + * Handles world packet writing events. + * @author Emperor + * + */ +public final class PacketWriteEvent extends IoWriteEvent { + + + /** + * Constructs a new {@code PacketWriteEvent} {@code Object}. + * @param session The I/O session. + * @param context The packet context. + */ + public PacketWriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + IoBuffer b = (IoBuffer) context; + int size = b.toByteBuffer().position(); + ByteBuffer buffer = ByteBuffer.allocate(1 + size + b.getHeader().ordinal()); + buffer.put((byte) b.opcode()); + switch (b.getHeader()) { + case NORMAL: + break; + case BYTE: + buffer.put((byte) size); + break; + case SHORT: + buffer.putShort((short) size); + break; + } + buffer.put((ByteBuffer) b.toByteBuffer().flip()); + session.queue((ByteBuffer) buffer.flip()); + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/event/RegistryReadEvent.java b/Management-Server/src/main/java/ms/net/event/RegistryReadEvent.java new file mode 100644 index 000000000..3ca964cf7 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/event/RegistryReadEvent.java @@ -0,0 +1,75 @@ +package ms.net.event; + +import java.nio.ByteBuffer; + +import ms.ServerConstants; +import ms.net.IoReadEvent; +import ms.net.IoSession; +import ms.world.WorldDatabase; +import ms.system.util.ByteBufferUtils; +import ms.world.info.CountryFlag; +import ms.world.info.WorldInfo; + +/** + * Handles world registry read events. + * @author Emperor + * + */ +public final class RegistryReadEvent extends IoReadEvent { + + /** + * The string check. + */ + private static final String CHECK = "12x4578f5g45hrdjiofed59898"; + //kratos = 666x14x88x28shhhwpwwb&h + //12x4578f5g45hrdjiofed59898 + + /** + * Constructs a new {@code RegistryReadEvent} {@code Object}. + * @param session The session. + * @param buffer The buffer to read. + */ + public RegistryReadEvent(IoSession session, ByteBuffer buffer) { + super(session, buffer); + } + + @Override + public void read(IoSession session, ByteBuffer buffer) { + int worldId = buffer.get() & 0xFF; + if (buffer.remaining() < 2) { + queueBuffer(worldId); + return; + } + int revision = buffer.getInt(); + int country = buffer.get() & 0xFF; + boolean members = buffer.get() == 1; + boolean pvp = buffer.get() == 1; + boolean quickChat = buffer.get() == 1; + boolean lootshare = buffer.get() == 1; + String activity = ByteBufferUtils.getString(buffer); + System.out.println("["+ revision + "], country = " + country + ", members = " + members + ", pvp = " + pvp + ", quickChat = " + quickChat + ", lootShare = " + lootshare + ", activity = " + activity); + for (int i = 0; i < CHECK.length(); i++) { + if ((char) buffer.get() != CHECK.charAt(i)) { + session.write(3); + return; + } + } + if (worldId >= ServerConstants.WORLD_LIMIT) { + session.write(0); + return; + } + if (WorldDatabase.isActive(worldId)) { + session.write(2); + return; + } + try { + WorldInfo info = new WorldInfo(worldId, session.getAddress(), revision, CountryFlag.values()[country], activity, members, pvp, quickChat, lootshare); + WorldDatabase.register(info).configure(session); + session.write(1); + } catch (Throwable t) { + t.printStackTrace(); + session.write(3); + } + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/event/RegistryWriteEvent.java b/Management-Server/src/main/java/ms/net/event/RegistryWriteEvent.java new file mode 100644 index 000000000..0e75aea91 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/event/RegistryWriteEvent.java @@ -0,0 +1,43 @@ +package ms.net.event; + +import java.nio.ByteBuffer; + +import ms.net.EventProducer; +import ms.net.IoSession; +import ms.net.IoWriteEvent; +import ms.net.producer.PacketEventProducer; + +/** + * Handles game world registry writing events. + * @author Emperor + * + */ +public final class RegistryWriteEvent extends IoWriteEvent { + + /** + * The event producer. + */ + public static final EventProducer PRODUCER = new PacketEventProducer(); + + /** + * Constructs a new {@code RegistryWriteEvent} {@code Object}. + * @param session The I/O session. + * @param context The writing context. + */ + public RegistryWriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + ByteBuffer buffer = ByteBuffer.allocate(1); + int opcode = (int) context; + buffer.put((byte) opcode); + buffer.flip(); + if (opcode == 1) { + session.setProducer(PRODUCER); + } + session.queue(buffer); + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/packet/IoBuffer.java b/Management-Server/src/main/java/ms/net/packet/IoBuffer.java new file mode 100644 index 000000000..4e4a7e682 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/packet/IoBuffer.java @@ -0,0 +1,677 @@ +package ms.net.packet; + +import java.nio.ByteBuffer; + +import ms.system.util.ByteBufferUtils; + +/** + * Represents the buffer used for reading/writing packets. + * @author Emperor + * + */ +public class IoBuffer { + + /** + * The bit masks. + */ + private static final int[] BIT_MASK = new int[32]; + + /** + * The packet size. + */ + private int packetSize; + + /** + * The opcode. + */ + private final int opcode; + + /** + * The packet header. + */ + private final PacketHeader header; + + /** + * The byte buffer. + */ + private ByteBuffer buf; + + /** + * The bit position. + */ + private int bitPosition = 0; + + /** + * Constructs a new {@code IoBuffer} {@code Object}. + */ + public IoBuffer() { + this(-1, PacketHeader.NORMAL, ByteBuffer.allocate(2048)); + } + + /** + * Constructs a new {@code IoBuffer} {@code Object}. + * @param opcode The opcode. + */ + public IoBuffer(int opcode) { + this(opcode, PacketHeader.NORMAL, ByteBuffer.allocate(2048)); + } + + /** + * Constructs a new {@code IoBuffer} {@code Object}. + * @param opcode The opcode. + * @param header The packet header. + */ + public IoBuffer(int opcode, PacketHeader header) { + this(opcode, header, ByteBuffer.allocate((1 << 16) + 1)); + } + + /** + * Constructs a new {@code IoBuffer} {@code Object}. + * @param opcode The opcode. + * @param header The packet header. + * @param buf The byte buffer. + */ + public IoBuffer(int opcode, PacketHeader header, ByteBuffer buf) { + this.opcode = opcode; + this.header = header; + this.buf = buf; + } + + static { + for (int i = 0; i < 32; i++) { + BIT_MASK[i] = (1 << i) - 1; + } + } + + /** + * + * @return + */ + public IoBuffer clear() { + buf.clear(); + bitPosition = 0; + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer put(int val) { + buf.put((byte) val); + return this; + } + + /** + * + * @param datas + * @param offset + * @param len + * @return + */ + public IoBuffer putBytes(byte[] datas, int offset, int len) { + for (int i = offset; i < len; i++) { + put(datas[i]); + } + return this; + } + + public final void getBytes(byte data[], int off, int len) { + for (int k = off; k < len + off; k++) { + data[k] = data[off++]; + } + } + + /** + * + * @param val + * @return + */ + public IoBuffer putA(int val) { + buf.put((byte) (val + 128)); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putC(int val) { + buf.put((byte) -val); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putS(int val) { + buf.put((byte) (128 - val)); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putTri(int val) { + buf.put((byte) (val >> 16)); + buf.put((byte) (val >> 8)); + buf.put((byte) val); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putShort(int val) { + buf.putShort((short) val); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putLEShort(int val) { + buf.put((byte) val); + buf.put((byte) (val >> 8)); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putShortA(int val) { + buf.put((byte) (val >> 8)); + buf.put((byte) (val + 128)); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putLEShortA(int val) { + buf.put((byte) (val + 128)); + buf.put((byte) (val >> 8)); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putInt(int val) { + buf.putInt(val); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putLEInt(int val) { + buf.put((byte) val); + buf.put((byte) (val >> 8)); + buf.put((byte) (val >> 16)); + buf.put((byte) (val >> 24)); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putIntA(int val) { + buf.put((byte) (val >> 8)); + buf.put((byte) val); + buf.put((byte) (val >> 24)); + buf.put((byte) (val >> 16)); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putIntB(int val) { + buf.put((byte) (val >> 16)); + buf.put((byte) (val >> 24)); + buf.put((byte) val); + buf.put((byte) (val >> 8)); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putLong(long val) { + buf.putLong(val); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putSmart(int val) { + if (val > Byte.MAX_VALUE) { + buf.putShort((short) (val + 32768)); + } else { + buf.put((byte) val); + } + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putIntSmart(int val) { + if (val > Short.MAX_VALUE) { + buf.putInt(val + 32768); + } else { + buf.putShort((short) val); + } + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putString(String val) { + buf.put(val.getBytes()); + buf.put((byte) 0); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putJagString(String val) { + buf.put((byte) 0); + buf.put(val.getBytes()); + buf.put((byte) 0); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer putJagString2(String val) { + byte[] packed = new byte[256]; + int length = ByteBufferUtils.packGJString2(0, packed, val); + buf.put((byte) 0).put(packed, 0, length).put((byte) 0); + return this; + } + + /** + * + * @param val + * @return + */ + public IoBuffer put(byte[] val) { + buf.put(val); + return this; + } + + /** + * Puts a byte array as byte A in reverse. + * @param data The data to put. + * @param start The start index. + * @param offset The offset. + */ + public void putReverseA(byte[] data, int start, int offset) { + for (int i = offset + start; i >= start; i--) { + putA(data[i]); + } + } + + /** + * + * @param numBits + * @param value + * @return + */ + public IoBuffer putBits(int numBits, int value) { + int bytePos = getBitPosition() >> 3; + int bitOffset = 8 - (getBitPosition() & 7); + bitPosition += numBits; + for (; numBits > bitOffset; bitOffset = 8) { + byte b = buf.get(bytePos); + buf.put(bytePos, b &= ~BIT_MASK[bitOffset]); + buf.put(bytePos++, b |= value >> numBits - bitOffset & BIT_MASK[bitOffset]); + numBits -= bitOffset; + } + byte b = buf.get(bytePos); + if (numBits == bitOffset) { + buf.put(bytePos, b &= ~BIT_MASK[bitOffset]); + buf.put(bytePos, b |= value & BIT_MASK[bitOffset]); + } else { + buf.put(bytePos, b &= ~(BIT_MASK[numBits] << bitOffset - numBits)); + buf.put(bytePos, b |= (value & BIT_MASK[numBits]) << bitOffset - numBits); + } + return this; + } + + /** + * + * @param buffer + * @return + */ + public IoBuffer put(IoBuffer buffer) { + buffer.toByteBuffer().flip(); + buf.put(buffer.toByteBuffer()); + return this; + } + + /** + * + * @param buffer + * @return + */ + public IoBuffer putA(IoBuffer buffer) { + buffer.toByteBuffer().flip(); + while (buffer.toByteBuffer().hasRemaining()) { + putA(buffer.toByteBuffer().get()); + } + return this; + } + + /** + * + * @param buffer + * @return + */ + public IoBuffer put(ByteBuffer buffer) { + buf.put(buffer); + return this; + } + + /** + * + * @return + */ + public IoBuffer setBitAccess() { + bitPosition = buf.position() * 8; + return this; + } + + /** + * + * @return + */ + public IoBuffer setByteAccess() { + buf.position((getBitPosition() + 7) / 8); + return this; + } + + /** + * + * @return + */ + public int get() { + return buf.get(); + } + + /** + * + * @return + */ + public int getA() { + return (buf.get() & 0xFF) - 128; + } + + /** + * + * @return + */ + public int getC() { + return -buf.get(); + } + + /** + * + * @return + */ + public int getS() { + return 128 - buf.get(); + } + + /** + * + * @return + */ + public int getTri() { + return ((buf.get() << 16) & 0xFF) | ((buf.get() << 8) & 0xFF) | (buf.get() & 0xFF); + } + + /** + * + * @return + */ + public int getShort() { + return buf.getShort(); + } + + /** + * + * @return + */ + public int getLEShort() { + return (buf.get() & 0xFF) | ((buf.get() & 0xFF) << 8); + } + + /** + * + * @return + */ + public int getShortA() { + return ((buf.get() & 0xFF) << 8) | (buf.get() - 128 & 0xFF); + } + + /** + * + * @return + */ + public int getLEShortA() { + return (buf.get() - 128 & 0xFF) | ((buf.get() & 0xFF) << 8); + } + + /** + * + * @return + */ + public int getInt() { + return buf.getInt(); + } + + /** + * + * @return + */ + public int getLEInt() { + return (buf.get() & 0xFF) + ((buf.get() & 0xFF) << 8) + + ((buf.get() & 0xFF) << 16) + ((buf.get() & 0xFF) << 24); + } + + /** + * + * @return + */ + public int getIntA() { + return ((buf.get() & 0xFF) << 8) + (buf.get() & 0xFF)+ ((buf.get() & 0xFF) << 24) + ((buf.get() & 0xFF) << 16); + } + + /** + * + * @return + */ + public int getIntB() { + return ((buf.get() & 0xFF) << 16) + ((buf.get() & 0xFF) << 24) + + (buf.get() & 0xFF) + ((buf.get() & 0xFF) << 8); + } + + /** + * + * @return + */ + public long getLongL() { + long first = getIntB(); + long second = getIntB(); + if (second < 0) + second = second & 0xffffffffL; + return (first << -41780448) + second; + } + + /** + * + * @return + */ + public long getLong() { + return buf.getLong(); + } + + /** + * + * @return + */ + public int getSmart() { + int peek = buf.get(buf.position()); + if (peek <= Byte.MAX_VALUE) { + return buf.get() & 0xFF; + } + return (buf.getShort() & 0xFFFF) - 32768; + } + + /** + * + * @return + */ + public int getIntSmart() { + int peek = buf.getShort(buf.position()); + if (peek <= Short.MAX_VALUE) { + return buf.getShort() & 0xFFFF; + } + return (buf.getInt() & 0xFFFFFFFF) - 32768; + } + + /** + * + * @return + */ + public String getString() { + return ByteBufferUtils.getString(buf); + } + + /** + * + * @return + */ + public String getJagString() { + buf.get(); + return ByteBufferUtils.getString(buf); + } + + /** + * + * @param is + * @param offset + * @param length + * @return + */ + public IoBuffer getReverseA(byte[] is, int offset, int length) { + for (int i = (offset + length - 1); i >= offset; i--) { + is[i] = (byte) (buf.get() - 128); + } + return this; + } + + /** + * + * @return + */ + public ByteBuffer toByteBuffer() { + return buf; + } + + /** + * + * @return + */ + public int opcode() { + return opcode; + } + + /** + * + * @return + */ + public int readableBytes() { + return buf.capacity() - buf.remaining(); + } + + /** + * + * @return + */ + public PacketHeader getHeader() { + return header; + } + + /** + * + * @return + */ + public byte[] array() { + return buf.array(); + } + + /** + * @return the packetSize. + */ + public int getPacketSize() { + return packetSize; + } + + /** + * @param packetSize the packetSize to set. + */ + public void setPacketSize(int packetSize) { + this.packetSize = packetSize; + } + + /** + * Gets the bitPosition. + * @return The bitPosition. + */ + public int getBitPosition() { + return bitPosition; + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/packet/PacketHeader.java b/Management-Server/src/main/java/ms/net/packet/PacketHeader.java new file mode 100644 index 000000000..b4bc54eb8 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/packet/PacketHeader.java @@ -0,0 +1,25 @@ +package ms.net.packet; + +/** + * Represents the types of packet headers. + * @author Emperor + * + */ +public enum PacketHeader { + + /** + * The normal packet header. + */ + NORMAL, + + /** + * The byte packet header. + */ + BYTE, + + /** + * The short packet header. + */ + SHORT; + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/packet/WorldPacketRepository.java b/Management-Server/src/main/java/ms/net/packet/WorldPacketRepository.java new file mode 100644 index 000000000..dc5e82285 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/packet/WorldPacketRepository.java @@ -0,0 +1,587 @@ +package ms.net.packet; + +import java.nio.ByteBuffer; +import java.util.List; + +import ms.ServerConstants; +import ms.net.IoSession; +import ms.system.PunishmentStorage; +import ms.world.GameServer; +import ms.world.PlayerSession; +import ms.world.WorldDatabase; +import ms.system.communication.ClanRank; +import ms.system.communication.ClanRepository; +import ms.system.communication.CommunicationInfo; +import ms.world.info.Response; +import ms.world.info.UIDInfo; + +/** + * Repository class for world packets. + * @author Emperor + * + */ +public final class WorldPacketRepository { + + /** + * Sends the player registry response. + * @param server The game server. + * @param player The player session. + * @param response The registry response. + */ + public static void sendRegistryResponse(GameServer server, PlayerSession player, Response response) { + IoBuffer buffer = new IoBuffer(0, PacketHeader.BYTE); + buffer.putString(player.getUsername()); + buffer.put((byte) response.opcode()); + if (response == Response.MOVING_WORLD) { + long delay = ServerConstants.WORLD_SWITCH_DELAY - (System.currentTimeMillis() - player.getDisconnectionTime()); + buffer.put((byte) (delay / 1000)); + } + server.getSession().write(buffer); + } + + /** + * Sends a message to the player. + * @param player The player. + * @param message The message to send. + */ + public static void sendPlayerMessage(PlayerSession player, String message) { + if (player == null) { + return; + } + IoBuffer buffer = new IoBuffer(2, PacketHeader.BYTE); + buffer.putString(player.getUsername()); + buffer.putString(message); + player.getWorld().getSession().write(buffer); + } + + public static void sendPlayerMessage(PlayerSession player, String[] messages) { + if (player == null) { + return; + } + for (String message : messages) + sendPlayerMessage(player, message); + } + + /** + * Sends the contact information. + * @param player The player. + */ + public static void sendContactInformation(PlayerSession player) { + CommunicationInfo info = player.getCommunication(); + IoBuffer buffer = new IoBuffer(3, PacketHeader.SHORT); + buffer.putString(player.getUsername()); + buffer.put(info.getContacts().size()); + for (String contact : info.getContacts().keySet()) { + buffer.putString(contact); + buffer.put(info.getRank(contact).ordinal()); + buffer.put(CommunicationInfo.getWorldId(player, contact)); + } + buffer.put(info.getBlocked().size()); + for (String contact : info.getBlocked()) { + buffer.putString(contact); + } + if (info.getCurrentClan() == null) { + buffer.put(0); + } else { + buffer.put(1); + buffer.putString(info.getCurrentClan()); + } + player.getWorld().getSession().write(buffer); + } + + /** + * Sends a contact update. + * @param player The player who's contacts we're changing. + * @param contact The contact to update. + * @param block If we're updating the blocked list. + * @param remove If the contact should be removed. + * @param worldId The world id of the contact. + * @param rank The clan rank. + */ + public static void sendContactUpdate(PlayerSession player, String contact, boolean block, boolean remove, int worldId, ClanRank rank) { + IoBuffer buffer = new IoBuffer(4, PacketHeader.BYTE); + buffer.putString(player.getUsername()); + buffer.putString(contact); + buffer.put((byte) (block ? 1 : 0)); + if (rank != null) { + buffer.put((byte) (2 + rank.ordinal())); + } else { + buffer.put((byte) (remove ? 1 : 0)); + if (!block && !remove) { + buffer.put((byte) worldId); + } + } + player.getWorld().getSession().write(buffer); + } + + /** + * Sends a clan message. + * @param player The player to send the message to. + * @param p The player sending the message. + * @param message The message to send. + * @param type The message type. + */ + public static void sendMessage(PlayerSession player, PlayerSession p, int type, String message) { + IoBuffer buffer = new IoBuffer(5, PacketHeader.BYTE); + buffer.putString(player.getUsername()); + buffer.putString(p.getUsername()); + buffer.put((byte) type); + buffer.put((byte) p.getChatIcon()); + buffer.putString(message); + player.getWorld().getSession().write(buffer); + } + + /** + * Sends clan information to the server. + * @param server The server. + * @param clan The clan. + */ + public static void sendClanInformation(GameServer server, ClanRepository clan) { + IoBuffer buffer = new IoBuffer(6, PacketHeader.SHORT); + buffer.putString(clan.getOwner().getUsername()); + buffer.putString(clan.getName()); + int length = clan.getPlayers().size(); + if (length > ClanRepository.MAX_MEMBERS) { + length = ClanRepository.MAX_MEMBERS; + } + buffer.put((byte) length); + for (int i = 0; i < length; i++) { + PlayerSession player = clan.getPlayers().get(i); + buffer.putString(player.getUsername()); + buffer.put(player.getWorldId()); + buffer.put((byte) clan.getRank(player).ordinal()); + } + buffer.put((byte) clan.getJoinRequirement().ordinal()); + buffer.put((byte) clan.getKickRequirement().ordinal()); + buffer.put((byte) clan.getMessageRequirement().ordinal()); + buffer.put((byte) clan.getLootRequirement().ordinal()); + server.getSession().write(buffer); + } + + /** + * Sends the leave clan packet. + * @param player The player leaving the clan. + */ + public static void sendLeaveClan(PlayerSession player) { + IoBuffer buffer = new IoBuffer(7, PacketHeader.BYTE); + buffer.putString(player.getUsername()); + player.getWorld().getSession().write(buffer); + } + + /** + * Sends the player login notification. + * @param server The server. + * @param player The player logging in. + * @param names The names. + */ + public static void notifyPlayers(GameServer server, PlayerSession player, List names) { + IoBuffer buffer = new IoBuffer(8, PacketHeader.SHORT); + buffer.putString(player.getUsername()); + buffer.put((byte) player.getWorldId()); + buffer.put((byte) names.size()); + for (String name : names) { + buffer.putString(name); + } + server.getSession().write(buffer); + } + + /** + * Notifies the game server a player logged out. + * @param server The game server to notify. + * @param player The player logging out. + */ + public static void notifyLogout(GameServer server, PlayerSession player) { + IoBuffer buffer = new IoBuffer(9, PacketHeader.BYTE); + buffer.putString(player.getUsername()); + server.getSession().write(buffer); + } + + /** + * Sends the update countdown to the server. + * @param server The server. + * @param ticks The amount of ticks left. + */ + public static void sendUpdate(GameServer server, int ticks) { + IoBuffer buffer = new IoBuffer(10); + buffer.putInt(ticks); + server.getSession().write(buffer); + } + + /** + * Sends the punishment update packet. + * @param world The world to send the packet to. + * @param key The punishment key. + * @param type The punishment type. + * @param duration The duration of the punishment. + */ + public static void sendPunishUpdate(GameServer world, String key, int type, long duration) { + IoBuffer buffer = new IoBuffer(11, PacketHeader.BYTE); + buffer.putString(key); + buffer.put((byte) type); + buffer.putLong(duration); + world.getSession().write(buffer); + } + + /** + * Sends a configuration reload. + * @param world the world. + */ + public static void sendConfigReload(GameServer world) { + world.getSession().write(new IoBuffer(15, PacketHeader.BYTE)); + } + + /** + * Handles incoming world packets. + * @param session The I/O session. + * @param opcode The opcode. + * @param b The buffer to read from. + */ + public static void handleIncoming(IoSession session, int opcode, ByteBuffer b) { + IoBuffer buffer = new IoBuffer(opcode, PacketHeader.NORMAL, b); + GameServer server = session.getGameServer(); + switch (opcode) { + case 0: + handlePlayerRegistration(server, buffer); + break; + case 1: + handlePlayerRemoval(server, buffer); + break; + case 2: + handlePunishment(server, buffer); + break; + case 3: + handleCommunicationRequest(server, buffer); + break; + case 4: + case 5: + handleContactUpdate(server, buffer, opcode == 5); + break; + case 6: + handleJoinClan(server, buffer); + break; + case 7: + handleClanRename(server, buffer); + break; + case 8: + handleClanSetting(server, buffer); + break; + case 9: + handleClanKick(server, buffer); + break; + case 10: + handleClanMessage(server, buffer); + break; + case 11: + handlePrivateMessage(server, buffer); + break; + case 12: + handleClanInfoRequest(server, buffer); + break; + case 13: + handleChatSetting(server, buffer); + break; + case 14: + handleInfoUpdate(server, buffer); + break; + default: + System.err.println("Handling incoming packet [opcode=" + opcode + ", size=" + b.limit() + "]."); + } + } + + /** + * Handles the info of a player update. + * @param server the server. + * @param buffer the buffer. + */ + private static void handleInfoUpdate(GameServer server, IoBuffer buffer) { + String username = buffer.getString(); + PlayerSession player = server.getPlayers().get(username); + if (player != null) { + player.setChatIcon((int) buffer.get()); + } + } + + /** + * Handles a player registration. + * @param server The game server. + * @param buffer The buffer. + */ + private static void handlePlayerRegistration(GameServer server, IoBuffer buffer) { + String username = buffer.getString(); + String password = buffer.getString(); + String ipAddress = buffer.getString(); + String macAddress = buffer.getString(); + String compName = buffer.getString(); + String serial = buffer.getString(); + int rights = server.getInfo().getRevision() == 498 ? 0 : buffer.getInt(); + int chatIcon = server.getInfo().getRevision() == 498 ? 0 : buffer.get(); + UIDInfo uid = new UIDInfo(ipAddress, compName, macAddress, serial); + PlayerSession player = new PlayerSession(username, password, new UIDInfo(ipAddress, compName, macAddress, serial)); + if (WorldDatabase.isActivePlayer(username)) { + sendRegistryResponse(server, player, Response.ALREADY_ONLINE); + return; + } + player.setUid(uid); + player.setRights(rights); + player.setChatIcon(chatIcon); + if (PunishmentStorage.isSystemBanned(uid)) { + sendRegistryResponse(server, player, Response.BANNED); + return; + } + player.parse(); + if (player.isBanned()) { + sendRegistryResponse(server, player, Response.ACCOUNT_DISABLED); + return; + } + if (player.getLastWorld() != server.getInfo().getWorldId() && player.hasMovedWorld()) { + sendRegistryResponse(server, player, Response.MOVING_WORLD); + return; + } + server.register(player); + } + + /** + * Handles the removal of a player. + * @param server The game server. + * @param buffer The buffer. + */ + private static void handlePlayerRemoval(GameServer server, IoBuffer buffer) { + String username = buffer.getString(); + PlayerSession session = server.getPlayers().get(username); + if (session != null) { + session.setActive(false); + PlayerSession player = server.getPlayers().remove(username); + if (player != null) { + session.remove(); + } + session.setWorldId(0); + } + } + + /** + * Handles a player registration. + * @param server The game server. + * @param buffer The buffer. + */ + private static void handlePunishment(GameServer server, IoBuffer buffer) { + int type = buffer.get() & 0xFF; + String target = buffer.getString(); + long duration = buffer.getLong(); + String staff = buffer.getString(); + PunishmentStorage.handlePunishment(staff, target, type, duration); + } + + /** + * Handles the communication info request packet. + * @param server The game server. + * @param buffer The buffer. + */ + private static void handleCommunicationRequest(GameServer server, IoBuffer buffer) { + String username = buffer.getString(); + PlayerSession player = server.getPlayers().get(username); + if (player == null) { + return; + } + sendContactInformation(player); + } + + /** + * Handles a contact update packet. + * @param server The server. + * @param buffer The buffer to read from. + * @param block If the list is for blocked players. + */ + private static void handleContactUpdate(GameServer server, IoBuffer buffer, boolean block) { + String username = buffer.getString(); + PlayerSession player = server.getPlayers().get(username); + if (player == null) { + return; + } + String contact = buffer.getString(); + switch (buffer.get()) { + case 0: + if (block) { + player.getCommunication().block(contact); + break; + } + player.getCommunication().add(contact); + break; + case 1: + player.getCommunication().remove(contact, block); + break; + case 2: + player.getCommunication().updateClanRank(contact, ClanRank.values()[buffer.get()]); + break; + } + } + + /** + * Handles a clan related packet. + * @param server The game server. + * @param buffer The buffer. + */ + private static void handleJoinClan(GameServer server, IoBuffer buffer) { + String name = buffer.getString(); + String clanName = buffer.getString(); + PlayerSession player = server.getPlayers().get(name); + if (player == null || !player.isActive()) { + System.err.println("Invalid player specified in clan packet!"); + return; + } + if (player.getClan() != null) { + player.getClan().leave(player, true); + return; + } + if (clanName.length() < 1) { + sendLeaveClan(player); + return; + } + ClanRepository clan = ClanRepository.get(server, clanName); + if (clan == null) { + sendPlayerMessage(player, new String[]{ "The channel you tried to join does not exist.", "Try joining the main clan named '" + ServerConstants.SERVER_NAME + "'.:clan:" }); + return; + } + clan.enter(player); + } + + /** + * Handles renaming a clan. + * @param server The server. + * @param buffer The buffer. + */ + private static void handleClanRename(GameServer server, IoBuffer buffer) { + String username = buffer.getString(); + String name = buffer.getString(); + PlayerSession player = server.getPlayers().get(username); + if (player == null || !player.isActive()) { + return; + } + ClanRepository clan = ClanRepository.getClans().get(username); + player.getCommunication().setClanName(name); + if (clan != null) { + if (name.length() < 1) { + clan.clean(true); + } else { + clan.rename(name); + } + } + } + + /** + * Handles changing clan settings packet. + * @param server The game server. + * @param buffer The buffer. + */ + private static void handleClanSetting(GameServer server, IoBuffer buffer) { + String username = buffer.getString(); + int type = buffer.get(); + ClanRank rank = type < 4 ? ClanRank.values()[buffer.get() & 0xFF] : null; + PlayerSession player = server.getPlayers().get(username); + if (player == null || !player.isActive()) { + return; + } + ClanRepository clan = ClanRepository.get(server,username); + switch (type) { + case 0: + player.getCommunication().setJoinRequirement(rank); + if (clan != null) { + clan.clean(false); + } + break; + case 1: + player.getCommunication().setMessageRequirement(rank); + break; + case 2: + player.getCommunication().setKickRequirement(rank); + if (clan != null) { + clan.update(); + } + break; + case 3: + player.getCommunication().setLootRequirement(rank); + break; + } + } + + /** + * Handles kicking a player from the clan. + * @param server The game server. + * @param buffer The buffer. + */ + private static void handleClanKick(GameServer server, IoBuffer buffer) { + String username = buffer.getString(); + String playerName = buffer.getString(); + PlayerSession player = server.getPlayers().get(username); + if (player == null || !player.isActive() || player.getClan() == null) { + return; + } + PlayerSession target = WorldDatabase.getPlayer(playerName); + if (target == null || !target.isActive()) { + return; + } + player.getClan().kick(player, target); + } + + /** + * Handles a clan message. + * @param server The game server. + * @param buffer The buffer. + */ + private static void handleClanMessage(GameServer server, IoBuffer buffer) { + String username = buffer.getString(); + String message = buffer.getString(); + PlayerSession player = server.getPlayers().get(username); + if (player == null || !player.isActive() || player.getClan() == null) { + return; + } + player.getClan().message(player, message); + } + + + /** + * Handles a clan message. + * @param server The game server. + * @param buffer The buffer. + */ + private static void handlePrivateMessage(GameServer server, IoBuffer buffer) { + String username = buffer.getString(); + String receiver = buffer.getString(); + String message = buffer.getString(); + PlayerSession player = server.getPlayers().get(username); + if (player == null || !player.isActive()) { + return; + } + player.getCommunication().sendMessage(receiver, message); + } + + /** + * Handles a clan information request packet. + * @param server The server. + * @param buffer The buffer. + */ + private static void handleClanInfoRequest(GameServer server, IoBuffer buffer) { + String name = buffer.getString(); + ClanRepository clan = ClanRepository.get(server, name); + if (clan == null) { + return; + } + sendClanInformation(server, clan); + } + + /** + * Handles a chat setting update packet. + * @param server The server. + * @param buffer The buffer. + */ + private static void handleChatSetting(GameServer server, IoBuffer buffer) { + String name = buffer.getString(); + int publicSetting = buffer.get(); + int privateSetting = buffer.get(); + int tradeSetting = buffer.get(); + PlayerSession player = server.getPlayers().get(name); + if (player == null || !player.isActive()) { + return; + } + player.getCommunication().updateSettings(publicSetting, privateSetting, tradeSetting); + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/producer/HSEventProducer.java b/Management-Server/src/main/java/ms/net/producer/HSEventProducer.java new file mode 100644 index 000000000..40936a72d --- /dev/null +++ b/Management-Server/src/main/java/ms/net/producer/HSEventProducer.java @@ -0,0 +1,29 @@ +package ms.net.producer; + +import java.nio.ByteBuffer; + +import ms.net.EventProducer; +import ms.net.IoReadEvent; +import ms.net.IoSession; +import ms.net.IoWriteEvent; +import ms.net.event.HSReadEvent; +import ms.net.event.HSWriteEvent; + +/** + * Produces I/O events for the handshake protocol. + * @author Emperor + * + */ +public final class HSEventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new HSReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new HSWriteEvent(session, context); + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/producer/PacketEventProducer.java b/Management-Server/src/main/java/ms/net/producer/PacketEventProducer.java new file mode 100644 index 000000000..091fcf5d7 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/producer/PacketEventProducer.java @@ -0,0 +1,29 @@ +package ms.net.producer; + +import java.nio.ByteBuffer; + +import ms.net.EventProducer; +import ms.net.IoReadEvent; +import ms.net.IoSession; +import ms.net.IoWriteEvent; +import ms.net.event.PacketReadEvent; +import ms.net.event.PacketWriteEvent; + +/** + * The packet event producer. + * @author Emperor + * + */ +public final class PacketEventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new PacketReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new PacketWriteEvent(session, context); + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/net/producer/RegistryEventProducer.java b/Management-Server/src/main/java/ms/net/producer/RegistryEventProducer.java new file mode 100644 index 000000000..25db4d265 --- /dev/null +++ b/Management-Server/src/main/java/ms/net/producer/RegistryEventProducer.java @@ -0,0 +1,29 @@ +package ms.net.producer; + +import java.nio.ByteBuffer; + +import ms.net.EventProducer; +import ms.net.IoReadEvent; +import ms.net.IoSession; +import ms.net.IoWriteEvent; +import ms.net.event.RegistryReadEvent; +import ms.net.event.RegistryWriteEvent; + +/** + * Handles world server registry. + * @author Emperor + * + */ +public final class RegistryEventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new RegistryReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new RegistryWriteEvent(session, context); + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/OperatingSystem.java b/Management-Server/src/main/java/ms/system/OperatingSystem.java new file mode 100644 index 000000000..abc330a05 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/OperatingSystem.java @@ -0,0 +1,13 @@ +package ms.system; + +/** + * The operating systems + * @author Clayton Williams + * + */ +public enum OperatingSystem { + + UNIX, + WINDOWS + +} diff --git a/Management-Server/src/main/java/ms/system/PunishmentStorage.java b/Management-Server/src/main/java/ms/system/PunishmentStorage.java new file mode 100644 index 000000000..8bbcfd6c8 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/PunishmentStorage.java @@ -0,0 +1,263 @@ +package ms.system; + +import ms.net.packet.WorldPacketRepository; +import ms.system.mysql.SQLManager; +import ms.world.GameServer; +import ms.world.PlayerSession; +import ms.world.WorldDatabase; +import ms.world.info.UIDInfo; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Used for storing and handling punishment data. + * @author Emperor + * @author Vexia + * + */ +public final class PunishmentStorage { + + /** + * The type ids for IP, MAC and SERIAL bans. + */ + public static final int IP = 2, MAC = 3, SERIAL = 4; + + /** + * Constructs a new {@code PunishmentStorage} {@code Object}. + */ + public PunishmentStorage() { + /* + * empty. + */ + } + + /** + * Handles a punishment. + * @param staff The name of the staff member dealing the punishment. + * @param target The target. + * @param type The punishment type. + * @param duration The duration of the punishment (in milliseconds). + */ + public static void handlePunishment(String name, String target, int type, long duration) { + PlayerSession staff = WorldDatabase.getPlayer(name); + PlayerSession player = WorldDatabase.getPlayer(target, true); + if (player == null) { + WorldPacketRepository.sendPlayerMessage(staff, "Player " + target + " is invalid!"); + return; + } + long end = Long.MAX_VALUE; + if (duration != -1l && duration != 0L) { + end = System.currentTimeMillis() + duration; + } else if (duration == 0L) { + end = 0L; + } + String key = "null"; + switch (type) { + case 0: //Mute + case 1: //Ban + if (type == 1 && end == 0L) { + unban(player.getIpAddress()); + unban(player.getMacAddress()); + unban(player.getSerialKey()); + } + if (player.isActive()) { + WorldPacketRepository.sendPunishUpdate(player.getWorld(), player.getUsername(), type, end); + } + notify(staff, type == 0 ? "mute" : "ban", target, end); + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return; + } + PreparedStatement statement; + try { + statement = connection.prepareStatement("UPDATE members SET " + (type == 0 ? "muteTime" : "banTime") + "='" + end + "' WHERE username ='" + target + "'"); + statement.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + SQLManager.close(connection); + return; + } + SQLManager.close(connection); + return; + case 2: + ban(player.getIpAddress(), type); + notify(staff, "IP-ban", target, end); + notifyServers(key = player.getIpAddress(), type, end); + break; + case 3: + ban(player.getMacAddress(), type); + notify(staff, "MAC-ban", target, end); + notifyServers(key = player.getMacAddress(), type, end); + break; + case 4: + ban(player.getSerialKey(), type); + notify(staff, "UID-ban", target, end); + notifyServers(key = player.getSerialKey(), type, end); + break; + case 5: + ban(player.getIpAddress(), 2); + notifyServers(key = player.getIpAddress(), 2, end); + ban(player.getMacAddress(), 3); + notifyServers(key = player.getMacAddress(), 3, end); + ban(player.getSerialKey(), 4); + notifyServers(key = player.getSerialKey(), 4, end); + notify(staff, "full ban", target, end); + return; + case 6: //Kick + if (player.isActive()) { + WorldPacketRepository.sendPunishUpdate(player.getWorld(), player.getUsername(), 6, end); + WorldPacketRepository.sendPlayerMessage(staff, "Successfully kicked player " + target + " from world " + player.getWorldId() + "."); + } else { + WorldPacketRepository.sendPlayerMessage(staff, "Player " + target + " was already inactive."); + } + break; + case 7: //Request info + WorldPacketRepository.sendPlayerMessage(staff, "[----------Player info----------]"); + WorldPacketRepository.sendPlayerMessage(staff, "Name: " + player.getUsername()); + WorldPacketRepository.sendPlayerMessage(staff, "IP address: " + player.getIpAddress()); + WorldPacketRepository.sendPlayerMessage(staff, "MAC address: " + player.getMacAddress()); + WorldPacketRepository.sendPlayerMessage(staff, "Serial key: " + player.getSerialKey()); + WorldPacketRepository.sendPlayerMessage(staff, "Computer name: " + player.getComputerName()); + WorldPacketRepository.sendPlayerMessage(staff, "[-------------------------------]"); + return; + } + notifyServers(key, type, end); + } + + /** + * Bans an address. + * @param address the address. + * @return {@code True} if banned. + */ + public static boolean ban(String address, int type) { + if (address == null || address.length() == 0 || address.equals("To be filled by O.E.M.") || address.equals("To be filled by O.E.M") || address.equals("Base Board Serial Number")) { + System.out.println("Error! Can't ban address " + address + " type = " + type + "!"); + return false; + } + if (isBanned(address)) { + return false; + } + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return false; + } + PreparedStatement statement; + try { + statement = connection.prepareStatement("INSERT INTO punishments VALUES('" + address + "','" + type + "')"); + statement.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + SQLManager.close(connection); + return false; + } + SQLManager.close(connection); + return true; + } + + /** + * Unbans an address. + * @param address the address. + * @return {@code True} if unbanned. + */ + public static boolean unban(String address) { + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return false; + } + PreparedStatement statement; + try { + statement = connection.prepareStatement("DELETE from punishments WHERE address ='" + address + "'"); + statement.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + SQLManager.close(connection); + return false; + } + SQLManager.close(connection); + return true; + } + + /** + * Notifies the punishing player of success. + * @param staff The punishing player. + * @param type The punishment type. + * @param target The target name. + * @param end The end time stamp of the punishment. + */ + private static void notify(PlayerSession staff, String type, String target, long end) { + if (end <= System.currentTimeMillis()) { + WorldPacketRepository.sendPlayerMessage(staff, "Successfully removed punishment [type=" + type + ", player=" + target + "]."); + return; + } + WorldPacketRepository.sendPlayerMessage(staff, "Successfully punished player " + target + " [type=" + type + ", duration=" + getDuration(end) + "]."); + } + + /** + * Notifies the game servers of a punishment update. + * @param key The punishment key. + * @param type The type. + * @param duration The duration. + */ + public static void notifyServers(String key, int type, long duration) { + for (GameServer server : WorldDatabase.getWorlds()) { + if (server != null && server.isActive()) { + WorldPacketRepository.sendPunishUpdate(server, key, type, duration); + } + } + } + + /** + * Checks if the UID Info is banned. + * @param info the info. + * @return {@code True} if banned. + */ + public static boolean isSystemBanned(UIDInfo info) { + return isBanned(info.getIp()) || isBanned(info.getMac()) || isBanned(info.getSerial()); + } + + /** + * Checked if an address is banned. + * @param address the address. + * @param type the type. + * @return {@code True} if so. + */ + public static boolean isBanned(String address) { + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return false; + } + try { + ResultSet set = connection.createStatement().executeQuery("SELECT * FROM punishments WHERE address ='" + address +"'"); + if (set == null || !set.next()) { + SQLManager.close(connection); + return false; + } + } catch (SQLException e) { + e.printStackTrace(); + SQLManager.close(connection); + return false; + } + SQLManager.close(connection); + return true; + } + + /** + * Gets the duration string representation. + * @param end The end time. + * @return The string. + */ + private static String getDuration(long end) { + String time = "indefinite time"; + if (end != Long.MAX_VALUE) { + int days = (int) ((end -= System.currentTimeMillis()) / (24 * 60 * 60_000)); + int hours = (int) ((end -= (days * 24 * 60 * 60_000)) / (60 * 60_000)); + int minutes = (int) ((end -= (hours * (60 * 60_000))) / 60_000); + time = days + "d, " + hours + "h, " + minutes + "m"; + } + return time; + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/ShutdownSequence.java b/Management-Server/src/main/java/ms/system/ShutdownSequence.java new file mode 100644 index 000000000..9d137923d --- /dev/null +++ b/Management-Server/src/main/java/ms/system/ShutdownSequence.java @@ -0,0 +1,27 @@ +package ms.system; + + +import ms.Management; + +/** + * The shutdown sequence used for safely turning off the Management server. + * @author Emperor + * + */ +public final class ShutdownSequence extends Thread { + + @Override + public void run() { + if (Management.active) { + shutdown(); + } + } + + /** + * Safely shuts down the Management server. + */ + public static void shutdown() { + System.out.println("Management server successfully shut down!"); + Management.active = false; + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/communication/ClanRank.java b/Management-Server/src/main/java/ms/system/communication/ClanRank.java new file mode 100644 index 000000000..f13aa7212 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/communication/ClanRank.java @@ -0,0 +1,54 @@ +package ms.system.communication; + +/** + * Represents the rank of a clan member. + * @author Emperor + */ +public enum ClanRank { + NONE(-1, "Anyone"), + FRIEND(0, "Any friends"), + RECRUIT(1, "Recruit+"), + CORPORAL(2, "Corporal+"), + SERGEANT(3, "Sergeant+"), + LIEUTENANT(4, "Lieutenant+"), + CAPTAIN(5, "Captain+"), + GENERAL(6, "General+"), + OWNER(7, "Only me"), + ADMINISTRATOR(127, "No-one"); + + /** + * The value of the rank. + */ + private final int value; + + /** + * The requirement info. + */ + private final String info; + + /** + * Constructs a new {@code ClanRank} {@code Object}. + * @param value The rank value. + * @param info The requirement info. + */ + private ClanRank(int value, String info) { + this.value = value; + this.info = info; + } + + /** + * Gets the value. + * @return The value. + */ + public int getValue() { + return value; + } + + /** + * Gets the info. + * @return The info. + */ + public String getInfo() { + return info; + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/communication/ClanRepository.java b/Management-Server/src/main/java/ms/system/communication/ClanRepository.java new file mode 100644 index 000000000..bfe96cbd4 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/communication/ClanRepository.java @@ -0,0 +1,337 @@ +package ms.system.communication; + +import ms.net.packet.WorldPacketRepository; +import ms.system.util.StringUtils; +import ms.world.GameServer; +import ms.world.PlayerSession; +import ms.world.WorldDatabase; +import ms.world.info.UIDInfo; + +import java.util.*; + +/** + * Holds clan related information. + * @author Emperor + * + */ +public final class ClanRepository { + + /** + * The mapping of active clans. + */ + private static final Map CLANS = new HashMap<>(); + + /** + * The maximum amount of members to be in a clan chat. + */ + public static final int MAX_MEMBERS = 100; + + /** + * The owner's details. + */ + private PlayerSession owner; + + /** + * The list of players currently in the chat. + */ + private final List players = new ArrayList<>(MAX_MEMBERS); + + /** + * The banned players. + */ + private final Map banned = new HashMap<>(); + + /** + * Constructs a new {@code ClanRepository} {@code Object}. + */ + private ClanRepository() { + /* + * empty. + */ + } + + /** + * Gets the clan repository for the given username. + * @param ownerName The clan owner's name. + * @return The clan repository. + */ + public static ClanRepository get(GameServer server, String ownerName) { + ClanRepository clan = CLANS.get(ownerName); + if (clan != null) { + return clan; + } + PlayerSession owner = WorldDatabase.getPlayer(ownerName); + if (owner == null) { + owner = new PlayerSession(ownerName, ownerName, new UIDInfo()); + owner.parse(); + } + if (owner.getCommunication().getClanName().equals("")) { + return null; + } + clan = new ClanRepository(); + clan.owner = owner; + CLANS.put(ownerName, clan); + return clan; + } + + /** + * Enters the clan chat. + * @param player The player. + */ + public void enter(PlayerSession player) { + if (players.size() >= MAX_MEMBERS && !owner.getUsername().equals("2009scape")) { + WorldPacketRepository.sendPlayerMessage(player, "The channel you tried to join is full.:clan:"); + return; + } + if (player != owner && player.getRights() != 2) { + if (isBanned(player.getUsername()) || owner.getCommunication().getBlocked().contains(player.getUsername())) { + WorldPacketRepository.sendPlayerMessage(player, "You are temporarily banned from this clan channel.:clan:"); + return; + } + ClanRank rank = getRank(player); + if (rank.ordinal() < getJoinRequirement().ordinal()) { + WorldPacketRepository.sendPlayerMessage(player, "You do not have a high enough rank to join this clan channel.:clan:"); + return; + } + } + if (!players.contains(player)) { + players.add(player); + } + WorldPacketRepository.sendPlayerMessage(player, "Now talking in clan channel " + owner.getCommunication().getClanName() + ".:clan:"); + WorldPacketRepository.sendPlayerMessage(player, "To talk, start each line of chat with the / symbol.:clan:"); + player.getCommunication().setCurrentClan(owner.getUsername()); + player.setClan(this); + update(); + } + + /** + * Leaves the clan chat. + * @param player The player to leave. + * @param remove If the player should be removed from the list. + */ + public void leave(PlayerSession player, boolean remove) { + if (remove) { + players.remove(player); + update(); + if (players.size() < 1) { + banned.clear(); + } + } + WorldPacketRepository.sendPlayerMessage(player, "You have left the channel.:clan:"); + player.setClan(null); + player.getCommunication().setCurrentClan(null); + if (player.isActive()) { + WorldPacketRepository.sendLeaveClan(player); + } + } + + /** + * Sends a message to all players in the chat. + * @param player The player sending the message. + * @param message The message to send. + */ + public void message(PlayerSession player, String message) { + if (player != owner && player.getRights() != 2) { + ClanRank rank = getRank(player); + if (rank.ordinal() < getMessageRequirement().ordinal()) { + WorldPacketRepository.sendPlayerMessage(player, "You do not have a high enough rank to talk in this clan channel.:clan:"); + return; + } + } + for (Iterator it = players.iterator(); it.hasNext();) { + PlayerSession p = it.next(); + if (p != null) { + WorldPacketRepository.sendMessage(p, player, 2, message); + } + } + } + + /** + * Updates the clan chat. + */ + public void update() { + for (GameServer server : WorldDatabase.getWorlds()) { + if (server != null && server.isActive()) { + WorldPacketRepository.sendClanInformation(server, this); + } + } + } + + /** + * Kicks a player from the clan chat. + * @param player The player. + */ + public void kick(PlayerSession player, PlayerSession target) { + ClanRank rank = getRank(target); + if (target.getRights() == 2) { + WorldPacketRepository.sendPlayerMessage(player, "You can't kick an administrator.:clan:"); + return; + } + System.out.println(rank + ", " + player.getUsername()); + if (player.getRights() < 1/*!= 2 && rank.ordinal() < getKickRequirement().ordinal()*/) { + WorldPacketRepository.sendPlayerMessage(player, "You do not have a high enough rank to kick in this clan channel.:clan:"); + return; + } + if (target == owner) { + WorldPacketRepository.sendPlayerMessage(player, "You can't kick the owner of this clan channel.:clan:"); + return; + } + if (target == player) { + WorldPacketRepository.sendPlayerMessage(player, "You can't kick yourself.:clan:"); + return; + } + for (PlayerSession p : players) { + WorldPacketRepository.sendMessage(p, player, 2, "[Attempting to kick/ban " + StringUtils.formatDisplayName(target.getUsername()) + " from this Clan Chat.]"); + } + leave(target, true); + banned.put(target.getUsername(), System.currentTimeMillis() + (3_600_000)); + WorldPacketRepository.sendPlayerMessage(target, "You have been kicked from the channel.:clan:"); + } + + /** + * Gets the rank for the given player. + * @param player The player. + * @return The rank. + */ + public ClanRank getRank(PlayerSession player) { + ClanRank rank = owner.getCommunication().getContacts().get(player.getUsername()); + if (player.getRights() == 2 && player != owner) { + return ClanRank.ADMINISTRATOR; + } + if (rank == null) { + if (player == owner) { + return ClanRank.OWNER; + } + return ClanRank.NONE; + } + return rank; + } + + /** + * Checks if the player is banned. + * @param username The username of the player. + * @return {@code True} if so. + */ + private boolean isBanned(String username) { + Long time = banned.get(username); + if (time == null) { + return false; + } + if (time < System.currentTimeMillis()) { + banned.remove(username); + return false; + } + return true; + } + + /** + * Clears the clan chat. + * @param disable If the clan chat is getting disabled. + */ + public void clean(boolean disable) { + for (Iterator it = players.iterator(); it.hasNext();) { + PlayerSession player = it.next(); + boolean remove = disable; + if (!remove) { + remove = getRank(player).ordinal() < getJoinRequirement().getValue(); + } + if (remove) { + leave(player, false); + it.remove(); + } + } + if (players.isEmpty()) { + banned.clear(); + } + update(); + } + + /** + * Renames the clan chat. + * @param name The new clan name. + */ + public void rename(String name) { + owner.getCommunication().setClanName(name); + update(); + } + + /** + * Gets the clan name. + * @return The clan name. + */ + public String getName() { + return owner.getCommunication().getClanName(); + } + + /** + * Gets the owner value. + * @return The owner. + */ + public PlayerSession getOwner() { + return owner; + } + + /** + * Sets the owner value. + * @param owner The owner to set. + */ + public void setOwner(PlayerSession owner) { + this.owner = owner; + } + + /** + * Gets the players value. + * @return The players. + */ + public List getPlayers() { + return players; + } + + /** + * Gets the clans value. + * @return The clans. + */ + public static Map getClans() { + return CLANS; + } + + /** + * Gets the joinRequirement value. + * @return The joinRequirement. + */ + public ClanRank getJoinRequirement() { + return owner.getCommunication().getJoinRequirement(); + } + + /** + * Gets the messageRequirement value. + * @return The messageRequirement. + */ + public ClanRank getMessageRequirement() { + return owner.getCommunication().getMessageRequirement(); + } + + /** + * Gets the kickRequirement value. + * @return The kickRequirement. + */ + public ClanRank getKickRequirement() { + return owner.getCommunication().getKickRequirement(); + } + + /** + * Gets the lootRequirement value. + * @return The lootRequirement. + */ + public ClanRank getLootRequirement() { + return owner.getCommunication().getLootRequirement(); + } + + /** + * Gets the banned value. + * @return The banned. + */ + public Map getBanned() { + return banned; + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/communication/CommunicationInfo.java b/Management-Server/src/main/java/ms/system/communication/CommunicationInfo.java new file mode 100644 index 000000000..df42656b0 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/communication/CommunicationInfo.java @@ -0,0 +1,655 @@ +package ms.system.communication; + +import ms.ServerConstants; +import ms.net.packet.WorldPacketRepository; +import ms.system.util.ByteBufferUtils; +import ms.system.util.StringUtils; +import ms.world.GameServer; +import ms.world.PlayerSession; +import ms.world.WorldDatabase; + +import java.nio.ByteBuffer; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Holds communication information. + * @author Emperor + * + */ +public final class CommunicationInfo { + + /** + * The maximum list size. + */ + public static final int MAX_LIST_SIZE = 200; + + /** + * The clan ranks. + */ + private final Map contacts = new HashMap<>(); + + /** + * The list of blocked players. + */ + private final List blocked = new ArrayList<>(); + + /** + * The player's clan name. + */ + private String clanName = ""; + + /** + * The current clan this player is in. + */ + private String currentClan = "2009scape"; + + /** + * The rank required for joining. + */ + private ClanRank joinRequirement = ClanRank.FRIEND; + + /** + * The rank required for messaging. + */ + private ClanRank messageRequirement = ClanRank.NONE; + + /** + * The rank required for kicking members. + */ + private ClanRank kickRequirement = ClanRank.OWNER; + + /** + * The rank required for loot-share. + */ + private ClanRank lootRequirement = ClanRank.ADMINISTRATOR; + + /** + * The public chat setting. + */ + private int publicChatSetting = 0; + + /** + * The private chat setting. + */ + private int privateChatSetting = 0; + + /** + * The trade setting. + */ + private int tradeSetting = 0; + + /** + * The player session. + */ + private PlayerSession player; + + /** + * Constructs a new {@code CommunicationInfo} {@code Object}. + * @param player The player. + */ + public CommunicationInfo(PlayerSession player) { + this.setPlayer(player); + } + + /** + * Called when the player logs in. + */ + public void sync() { + if (privateChatSetting != 2) { + for (GameServer server : WorldDatabase.getWorlds()) { + if (server != null && server.isActive()) { + List names = new ArrayList<>(); + for (PlayerSession p : server.getPlayers().values()) { + if (p.isActive() && p.getCommunication().contacts.containsKey(player.getUsername())) { + if (privateChatSetting == 0 || contacts.containsKey(p.getUsername())) { + names.add(p.getUsername()); + } + } + } + WorldPacketRepository.notifyPlayers(server, player, names); + } + } + } + } + + /** + * Called when the player logs out. + */ + public void clear() { + for (GameServer server : WorldDatabase.getWorlds()) { + if (server != null && server.isActive()) { + WorldPacketRepository.notifyLogout(server, player); + } + } + if (player.getClan() != null) { + player.getClan().leave(player, true); + } + } + + /** + * Saves the communication info. + * @param statement The buffer. + * @throws SQLException The exception if thrown. + */ + public void save(PreparedStatement statement) throws SQLException { + String contacts = ""; + String blocked = ""; + for (int i = 0; i < this.blocked.size(); i++) { + blocked += (i == 0 ? "" : ",") + this.blocked.get(i); + } + int count = 0; + for (Entry entry : this.contacts.entrySet()) { + contacts += "{" + entry.getKey() + "," + entry.getValue().ordinal() + "}" + (count == this.contacts.size() - 1 ? "" : "~"); + count++; + } + statement.setString(3, contacts); + statement.setString(4, blocked); + statement.setString(5, clanName); + statement.setString(6, currentClan); + statement.setString(7, joinRequirement.ordinal() + "," + messageRequirement.ordinal() + "," + kickRequirement.ordinal() + "," + lootRequirement.ordinal()); + statement.setString(8, publicChatSetting + "," + privateChatSetting + "," + tradeSetting); + } + + /** + * Parses the communication info from the database. + * @param set The result set. + * @throws SQLException The exception if thrown. + */ + public void parse(ResultSet set) throws SQLException { + String contacts = set.getString("contacts"); + String[] tokens; + if (contacts != null && !contacts.isEmpty()) { + String[] datas = contacts.split("~"); + for (String d : datas) { + tokens = d.replace("{", "").replace("}", "").split(","); + if (tokens.length < 2) { + continue; + } + this.contacts.put(tokens[0], ClanRank.values()[Integer.parseInt(tokens[1])]); + } + } + String bl = set.getString("blocked"); + if (bl != null && !bl.isEmpty()) { + tokens = bl.split(","); + for (String name : tokens) { + blocked.add(name); + } + } + clanName = set.getString("clanName"); + currentClan = set.getString("currentClan"); + String clanReqs = set.getString("clanReqs"); + if (!clanReqs.isEmpty()) { + tokens = clanReqs.split(","); + ClanRank rank = null; + int ordinal = 0; + for (int i = 0; i < tokens.length; i++) { + ordinal = Integer.parseInt(tokens[i]); + if (ordinal < 0 || ordinal > ClanRank.values().length -1) { + continue; + } + rank = ClanRank.values()[ordinal]; + switch (i) { + case 0: + joinRequirement = rank; + break; + case 1: + messageRequirement = rank; + break; + case 2: + if (ordinal < 3 || ordinal > 8) { + break; + } + kickRequirement = rank; + break; + case 3: + lootRequirement = rank; + break; + } + } + } + String chatSettings = set.getString("chatSettings"); + if (!chatSettings.isEmpty()) { + tokens = chatSettings.split(","); + for (int i = 0; i < tokens.length; i++) { + switch (i) { + case 0: + publicChatSetting = Integer.parseInt(tokens[0]); + break; + case 1: + privateChatSetting = Integer.parseInt(tokens[1]); + break; + case 2: + tradeSetting = Integer.parseInt(tokens[2]); + break; + } + } + } + } + + /** + * Saves the communication info. + * @param buffer The buffer. + */ + public void save(ByteBuffer buffer) { + buffer.put((byte) contacts.size()); + for (String name : contacts.keySet()) { + ByteBufferUtils.putString(name, buffer); + buffer.put((byte) contacts.get(name).ordinal()); + } + buffer.put((byte) blocked.size()); + for (String name : blocked) { + ByteBufferUtils.putString(name, buffer); + } + ByteBufferUtils.putString(clanName, buffer); + if (currentClan != null) { + ByteBufferUtils.putString(currentClan, buffer.put((byte) 1)); + } else { + buffer.put((byte) 0); + } + buffer.put((byte) joinRequirement.ordinal()); + buffer.put((byte) messageRequirement.ordinal()); + buffer.put((byte) kickRequirement.ordinal()); + buffer.put((byte) lootRequirement.ordinal()); + buffer.put((byte) publicChatSetting); + buffer.put((byte) privateChatSetting); + buffer.put((byte) tradeSetting); + } + + /** + * Parses the communication info from the buffer. + * @param buffer The buffer. + */ + public void parse(ByteBuffer buffer) { + int length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + contacts.put(ByteBufferUtils.getString(buffer), ClanRank.values()[buffer.get() & 0xFF]); + } + length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + blocked.add(ByteBufferUtils.getString(buffer)); + } + clanName = ByteBufferUtils.getString(buffer); + if (buffer.get() == 1) { + currentClan = ByteBufferUtils.getString(buffer); + } + joinRequirement = ClanRank.values()[buffer.get()]; + messageRequirement = ClanRank.values()[buffer.get()]; + kickRequirement = ClanRank.values()[buffer.get()]; + lootRequirement = ClanRank.values()[buffer.get()]; + publicChatSetting = buffer.get(); + privateChatSetting = buffer.get(); + tradeSetting = buffer.get(); + } + + /** + * Sends a message to the target. + * @param target The target. + * @param message The message to send. + */ + public void sendMessage(String target, String message) { + PlayerSession receiver = WorldDatabase.getPlayer(target); + if (receiver == null || !receiver.isActive()) { + WorldPacketRepository.sendPlayerMessage(player, "That player is currently offline."); + return; + } + WorldPacketRepository.sendMessage(player, receiver, 0, message); + WorldPacketRepository.sendMessage(receiver, player, 1, message); + } + + /** + * Adds a contact. + * @param contact The contact to add. + */ + public void add(String contact) { + if (contacts.size() >= MAX_LIST_SIZE) { + WorldPacketRepository.sendPlayerMessage(player, "Your friend list is full."); + return; + } + if (blocked.contains(contact)) { + WorldPacketRepository.sendPlayerMessage(player, "Please remove " + StringUtils.formatDisplayName(contact) + " from your ignored list first."); + return; + } + if (contacts.containsKey(contact)) { + WorldPacketRepository.sendPlayerMessage(player, StringUtils.formatDisplayName(contact) + " is already on your friend list."); + return; + } + contacts.put(contact, ClanRank.FRIEND); + WorldPacketRepository.sendContactUpdate(player, contact, false, false, getWorldId(player, contact), null); + ClanRepository clan = ClanRepository.getClans().get(player.getUsername()); + if (clan != null) { + clan.update(); + } + if (privateChatSetting == 1) { + PlayerSession other = WorldDatabase.getPlayer(contact); + if (other != null && other.isActive() && other.getCommunication().getContacts().containsKey(player.getUsername())) { + WorldPacketRepository.sendContactUpdate(other, player.getUsername(), false, false, getWorldId(other, player.getUsername()), null); + } + } + } + + /** + * Gets the world id for the given contact. + * @param player The player. + * @param contact The contact. + * @return The world id to display. + */ + public static int getWorldId(PlayerSession player, String contact) { + PlayerSession p = WorldDatabase.getPlayer(contact); + if (p == null || !p.isActive() || p.getCommunication().getPrivateChatSetting() == 2) { + return 0; + } + if (p.getCommunication().getBlocked().contains(player.getUsername())) { + return 0; + } + if (p.getCommunication().getPrivateChatSetting() == 1) { + if (p.getCommunication().getContacts().containsKey(player.getUsername())) { + return p.getWorldId(); + } + return 0; + } + return p.getWorldId(); + } + + /** + * Removes a contact. + * @param contact The contact to remove. + * @param block If the contact should be removed from the block list. + */ + public void remove(String contact, boolean block) { + PlayerSession other = WorldDatabase.getPlayer(contact); + if (block) { + blocked.remove(contact); + if (other != null && other.isActive() && other.getCommunication().getContacts().containsKey(player.getUsername())) { + WorldPacketRepository.sendContactUpdate(other, player.getUsername(), false, false, getWorldId(other, player.getUsername()), null); + } + } else { + contacts.remove(contact); + ClanRepository clan = ClanRepository.getClans().get(player.getUsername()); + if (clan != null) { + clan.update(); + } + if (privateChatSetting == 1 && other != null && other.isActive() && other.getCommunication().getContacts().containsKey(player.getUsername())) { + WorldPacketRepository.sendContactUpdate(other, player.getUsername(), false, false, getWorldId(other, player.getUsername()), null); + } + } + WorldPacketRepository.sendContactUpdate(player, contact, block, true, 0, null); + } + + + /** + * Adds a blocked contact. + * @param contact The contact to block. + */ + public void block(String contact) { + if (blocked.size() >= MAX_LIST_SIZE) { + WorldPacketRepository.sendPlayerMessage(player, "Your ignore list is full."); + return; + } + if (contacts.containsKey(contact)) { + WorldPacketRepository.sendPlayerMessage(player, "Please remove " + StringUtils.formatDisplayName(contact) + " from your friends list first."); + return; + } + if (blocked.contains(contact)) { + WorldPacketRepository.sendPlayerMessage(player, StringUtils.formatDisplayName(contact) + " is already on your friend list."); + return; + } + blocked.add(contact); + WorldPacketRepository.sendContactUpdate(player, contact, true, false, 0, null); + PlayerSession other = WorldDatabase.getPlayer(contact); + if (other != null && other.isActive() && other.getCommunication().getContacts().containsKey(player.getUsername())) { + WorldPacketRepository.sendContactUpdate(other, player.getUsername(), false, false, 0, null); + } + } + + /** + * Updates the clan rank of a certain contact. + * @param contact The contact. + * @param clanRank The clan rank to set. + */ + public void updateClanRank(String contact, ClanRank clanRank) { + if (!contacts.containsKey(contact)) { + System.err.println("Could not find contact " + contact + " to update clan rank!"); + return; + } + contacts.put(contact, clanRank); + ClanRepository clan = ClanRepository.getClans().get(player.getUsername()); + if (clan != null) { + clan.update(); + } + + WorldPacketRepository.sendContactUpdate(player, contact, false, false, 0, clanRank); + } + + /** + * Updates the settings. + * @param publicSetting The public chat setting. + * @param privateSetting The private chat setting. + * @param tradeSetting The trade setting. + */ + public void updateSettings(int publicSetting, int privateSetting, int tradeSetting) { + this.publicChatSetting = publicSetting; + this.tradeSetting = tradeSetting; + if (this.privateChatSetting != privateSetting) { + updatePrivateSetting(privateSetting); + } + } + + /** + * Updates the private chat setting. + * @param privateSetting The private chat setting. + */ + private void updatePrivateSetting(int privateSetting) { + this.privateChatSetting = privateSetting; + for (GameServer server : WorldDatabase.getWorlds()) { + if (server != null && server.isActive()) { + if (privateSetting == 2) { + WorldPacketRepository.notifyLogout(server, player); + continue; + } + for (PlayerSession p : server.getPlayers().values()) { + if (p.isActive() && p.getCommunication().contacts.containsKey(player.getUsername())) { + WorldPacketRepository.sendContactUpdate(p, player.getUsername(), false, false, getWorldId(p, player.getUsername()), null); + } + } + } + } + } + + /** + * Gets the contacts value. + * @return The contacts. + */ + public Map getContacts() { + return contacts; + } + + /** + * Gets the clan rank for the given contact. + * @param contact The contact. + * @return The rank. + */ + public ClanRank getRank(String contact) { + for (String name : ServerConstants.ADMINISTRATORS) { + if (contact.equals(name)) { + return ClanRank.ADMINISTRATOR; + } + } + return contacts.get(contact); + } + + /** + * Gets the blocked value. + * @return The blocked. + */ + public List getBlocked() { + return blocked; + } + + /** + * Gets the clanName value. + * @return The clanName. + */ + public String getClanName() { + return clanName; + } + + /** + * Sets the clanName value. + * @param clanName The clanName to set. + */ + public void setClanName(String clanName) { + this.clanName = clanName; + } + + /** + * Gets the currentClan value. + * @return The currentClan. + */ + public String getCurrentClan() { + return currentClan; + } + + /** + * Sets the currentClan value. + * @param currentClan The currentClan to set. + */ + public void setCurrentClan(String currentClan) { + this.currentClan = currentClan; + } + + /** + * Gets the player value. + * @return The player. + */ + public PlayerSession getPlayer() { + return player; + } + + /** + * Sets the player value. + * @param player The player to set. + */ + public void setPlayer(PlayerSession player) { + this.player = player; + } + + /** + * Gets the joinRequirement value. + * @return The joinRequirement. + */ + public ClanRank getJoinRequirement() { + return joinRequirement; + } + + /** + * Sets the joinRequirement value. + * @param joinRequirement The joinRequirement to set. + */ + public void setJoinRequirement(ClanRank joinRequirement) { + this.joinRequirement = joinRequirement; + } + + /** + * Gets the messageRequirement value. + * @return The messageRequirement. + */ + public ClanRank getMessageRequirement() { + return messageRequirement; + } + + /** + * Sets the messageRequirement value. + * @param messageRequirement The messageRequirement to set. + */ + public void setMessageRequirement(ClanRank messageRequirement) { + this.messageRequirement = messageRequirement; + } + + /** + * Gets the kickRequirement value. + * @return The kickRequirement. + */ + public ClanRank getKickRequirement() { + return kickRequirement; + } + + /** + * Sets the kickRequirement value. + * @param kickRequirement The kickRequirement to set. + */ + public void setKickRequirement(ClanRank kickRequirement) { + this.kickRequirement = kickRequirement; + } + + /** + * Gets the lootRequirement value. + * @return The lootRequirement. + */ + public ClanRank getLootRequirement() { + return lootRequirement; + } + + /** + * Sets the lootRequirement value. + * @param lootRequirement The lootRequirement to set. + */ + public void setLootRequirement(ClanRank lootRequirement) { + this.lootRequirement = lootRequirement; + } + + /** + * Gets the publicChatSetting value. + * @return The publicChatSetting. + */ + public int getPublicChatSetting() { + return publicChatSetting; + } + + /** + * Sets the publicChatSetting value. + * @param publicChatSetting The publicChatSetting to set. + */ + public void setPublicChatSetting(int publicChatSetting) { + this.publicChatSetting = publicChatSetting; + } + + /** + * Gets the privateChatSetting value. + * @return The privateChatSetting. + */ + public int getPrivateChatSetting() { + return privateChatSetting; + } + + /** + * Sets the privateChatSetting value. + * @param privateChatSetting The privateChatSetting to set. + */ + public void setPrivateChatSetting(int privateChatSetting) { + this.privateChatSetting = privateChatSetting; + } + + /** + * Gets the tradeSetting value. + * @return The tradeSetting. + */ + public int getTradeSetting() { + return tradeSetting; + } + + /** + * Sets the tradeSetting value. + * @param tradeSetting The tradeSetting to set. + */ + public void setTradeSetting(int tradeSetting) { + this.tradeSetting = tradeSetting; + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/mysql/SQLColumn.java b/Management-Server/src/main/java/ms/system/mysql/SQLColumn.java new file mode 100644 index 000000000..727c3075f --- /dev/null +++ b/Management-Server/src/main/java/ms/system/mysql/SQLColumn.java @@ -0,0 +1,121 @@ +package ms.system.mysql; + +/** + * Represents a column used in an SQL table. + * @author Emperor + * + */ +public final class SQLColumn { + + /** + * The name. + */ + private final String name; + + /** + * The data type. + */ + private final Class type; + + /** + * If this column should never be updated in the database. + */ + private final boolean neverUpdate; + + /** + * The value. + */ + private Object value; + + /** + * If the column value changed. + */ + private boolean changed; + + /** + * Constructs a new {@code SQLColumn} {@code Object}. + * @param name The column name. + * @param type The data type. + */ + public SQLColumn(String name, Class type) { + this(name, type, false); + } + + /** + * Constructs a new {@code SQLColumn} {@code Object}. + * @param name The column name. + * @param type The data type. + * @param neverUpdate If this column should never be updated in the database. + */ + public SQLColumn(String name, Class type, boolean neverUpdate) { + this.name = name; + this.type = type; + this.neverUpdate = neverUpdate; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Updates the value. + * @param value The value. + */ + public void updateValue(Object value) { + this.changed = value != this.value; + this.value = value; + } + + /** + * Gets the value. + * @return The value. + */ + public Object getValue() { + return value; + } + + /** + * Sets the value. + * @param value The value to set. + */ + public void setValue(Object value) { + this.value = value; + this.changed = false; + } + + /** + * Gets the changed. + * @return The changed. + */ + public boolean isChanged() { + return changed; + } + + /** + * Sets the changed. + * @param changed The changed to set. + */ + public void setChanged(boolean changed) { + this.changed = changed; + } + + /** + * Gets the type. + * @return The type. + */ + public Class getType() { + return type; + } + + /** + * Gets the neverUpdate. + * @return The neverUpdate. + */ + public boolean isNeverUpdate() { + return neverUpdate; + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/mysql/SQLEntryHandler.java b/Management-Server/src/main/java/ms/system/mysql/SQLEntryHandler.java new file mode 100644 index 000000000..94ee8b5c2 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/mysql/SQLEntryHandler.java @@ -0,0 +1,202 @@ +package ms.system.mysql; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Handles an SQL entry. + * @author Emperor + * @param The entry type. + */ +public abstract class SQLEntryHandler { + + /** + * The connection. + */ + protected Connection connection; + + /** + * The entry. + */ + protected T entry; + + /** + * The result set. + */ + protected ResultSet result; + + /** + * The table name. + */ + protected String table; + + /** + * The column name. + */ + private String column; + + /** + * The value to use. + */ + protected String value; + + /** + * Constructs a new {@code SQLEntryHandler} {@code Object}. + * @param entry The entry. + * @param table The table name. + * @param column column name. + * @param value The column value. + */ + public SQLEntryHandler(T entry, String table, String column, String value) { + this.entry = entry; + this.table = table; + this.column = column; + this.value = value; + } + + /** + * Reads the SQL entry. + * @param entry The entry. + */ + public static void read(SQLEntryHandler entry) { + entry.connection = entry.getConnection(); + if (entry.connection == null) { + //System.err.println("Could not read SQL data: connection is null!"); + return; + } + try { + entry.read(); + if (entry.result == null || !entry.result.next()) { + entry.create(); + } else { + entry.parse(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + SQLManager.close(entry.connection); + entry.connection = null; + } + + /** + * Writes the entry data on the SQL database. + * @param entry The entry. + */ + public static void write(SQLEntryHandler entry) { + write(entry, entry.getConnection(), true); + } + + /** + * Reads the SQL entry. + * @param entry The entry. + */ + public static void write(SQLEntryHandler entry, Connection connection, boolean commit) { + if (connection == null) { + //System.err.println("Could not write SQL data: connection is null!"); + return; + } + entry.connection = connection; + try { + if (!commit) { + entry.connection.setAutoCommit(false); + } + entry.save(); + } catch (SQLException e) { + e.printStackTrace(); + } + if (commit) { + SQLManager.close(entry.connection); + } + entry.connection = null; + } + + /** + * Reads the table from the SQL database. + * @throws SQLException When an SQL exception occurs. + */ + public void read() throws SQLException { + PreparedStatement statement = connection.prepareStatement("SELECT " + getReadSelection() + " FROM " + table + " WHERE " + column + " = ?"); + statement.setString(1, value); + result = statement.executeQuery(); + } + + /** + * Gets the result. + * @return the result. + */ + public ResultSet getResult() { + return result; + } + + /** + * Gets the selection. + * @return The selection. + */ + public String getReadSelection() { + return "*"; + } + + /** + * Gets the writing statement. + * @param create If we are creating a new row. + * @param columns The columns to update. + */ + public PreparedStatement getWritingStatement(boolean create, String...columns) { + PreparedStatement statement = null; + try { + StringBuilder sb = new StringBuilder(); + if (create) { + sb.append("INSERT INTO ").append(table).append(" (").append(column); + for (String name : columns) { + sb.append(",").append(name); + } + sb.append(") VALUES (?"); + for (int i = 0; i < columns.length; i++) { + sb.append(",?"); + } + sb.append(")"); + } else { + sb.append("UPDATE ").append(table).append(" SET "); + for (int i = 0; i < columns.length; i++) { + sb.append(columns[i]).append("=?"); + if (i < columns.length - 1) { + sb.append(","); + } + } + sb.append(" WHERE ").append(column).append("=?"); + } + statement = connection.prepareStatement(sb.toString()); + statement.setString(create ? 1 : columns.length + 1, value); + } catch (SQLException e) { + e.printStackTrace(); + } + return statement; + } + + /** + * Parses the entry. + * @throws SQLException When an SQL exception occurs. + */ + public abstract void parse() throws SQLException; + + /** + * Creates a new row in the database. + * @throws SQLException When an SQL exception occurs. + */ + public abstract void create() throws SQLException; + + /** + * Saves the entry. + * @throws SQLException When an SQL exception occurs. + */ + public abstract void save() throws SQLException; + + /** + * Gets the connection. + * @return The connection. + */ + public abstract Connection getConnection(); + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/mysql/SQLManager.java b/Management-Server/src/main/java/ms/system/mysql/SQLManager.java new file mode 100644 index 000000000..6fa0082cb --- /dev/null +++ b/Management-Server/src/main/java/ms/system/mysql/SQLManager.java @@ -0,0 +1,100 @@ +package ms.system.mysql; + +import ms.ServerConstants; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +/** + * Manages the sql connections. + * @author Vexia + * + */ +public final class SQLManager { + + /** + * If the sql manager is locally hosted. + */ + public static final boolean LOCAL = true; + + /** + * The database URL. + */ + public static final String DATABASE_URL = (LOCAL ? "127.0.0.1" : "keldagrim.org") + ":3306/" + (SQLManager.LOCAL ? "global" : ServerConstants.DATABASE_NAMES[1]); + + /** + * The username of the user. + */ + private static final String USERNAME = (LOCAL ? "root" : "keldagr1_user"); + + /** + * The password of the user. + */ + private static final String PASSWORD = (LOCAL ? "" : "2jf4wkz$"); + + + /** + * IF the sql manager is initialized. + */ + private static boolean initialized; + + /** + * Constructs a new {@code SQLManager} {@code Object} + */ + public SQLManager() { + /** + * empty. + */ + } + + /** + * Initializes the sql manager. + */ + public static void init() { + initialized = true; + WorldListSQLHandler.clearWorldList(); + } + + /** + * Gets a connection from the pool. + * @return The connection. + */ + public static Connection getConnection() { + try { + return DriverManager.getConnection("jdbc:mysql://" + DATABASE_URL + "?useTimezone=true&serverTimezone=UTC", USERNAME, PASSWORD); + } catch (SQLException e) { + System.out.println("Error: Mysql error message=" + e.getMessage() + "."); + } + return null; + } + + /** + * Releases the connection so it's available for usage. + * @param connection The connection. + */ + public static void close(Connection connection) { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + /** + * Gets the initialized. + * @return the initialized + */ + public static boolean isInitialized() { + return initialized; + } + + /** + * Sets the bainitialized. + * @param initialized the initialized to set. + */ + public static void setInitialized(boolean initialized) { + SQLManager.initialized = initialized; + } + +} diff --git a/Management-Server/src/main/java/ms/system/mysql/SQLTable.java b/Management-Server/src/main/java/ms/system/mysql/SQLTable.java new file mode 100644 index 000000000..ad707e2f7 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/mysql/SQLTable.java @@ -0,0 +1,63 @@ +package ms.system.mysql; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents an SQL table. + * @author Emperor + * + */ +public final class SQLTable { + + /** + * The columns. + */ + private final SQLColumn[] columns; + + /** + * Constructs a new {@code SQLTable} {@code Object}. + * @param columns The columns. + */ + public SQLTable(SQLColumn...columns) { + this.columns = columns; + } + + /** + * Gets the column for the given name. + * @param name The column name. + * @return The column. + */ + public SQLColumn getColumn(String name) { + for (SQLColumn column : columns) { + if (column.getName().equals(name)) { + return column; + } + } + return null; + } + + /** + * Gets the changed columns. + * @return The columns. + */ + public List getChanged() { + List updated = new ArrayList<>(); + for (int i = 0; i < columns.length; i++) { + SQLColumn column = columns[i]; + if (column.isChanged()) { + updated.add(column); + } + } + return updated; + } + + /** + * Gets the columns. + * @return The columns. + */ + public SQLColumn[] getColumns() { + return columns; + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/mysql/WorldListSQLHandler.java b/Management-Server/src/main/java/ms/system/mysql/WorldListSQLHandler.java new file mode 100644 index 000000000..54a91c6c3 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/mysql/WorldListSQLHandler.java @@ -0,0 +1,80 @@ +package ms.system.mysql; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import ms.world.GameServer; +import ms.world.info.WorldInfo; + +/** + * Handles the world list SQL database. + * @author Emperor + * + */ +public final class WorldListSQLHandler extends SQLEntryHandler { + + /** + * The table for this sql entry. + */ + private static final String TABLE = "worlds"; + + /** + * Constructs a new {@code WorldListSQLHandler} {@code Object}. + * @param entry The game server entry. + */ + public WorldListSQLHandler(GameServer entry) { + super(entry, TABLE, "world", "" + entry.getInfo().getWorldId()); + } + + /** + * Clears the world list. + */ + public static void clearWorldList() { + try { + Connection connection = SQLManager.getConnection(); + PreparedStatement statement = connection.prepareStatement("DELETE FROM " + TABLE); + statement.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + @Override + public void parse() throws SQLException { + + } + + @Override + public void create() throws SQLException { + PreparedStatement statement = connection.prepareStatement("INSERT "+ table + "(world, ip, players, country, member, revision) VALUES('" + value + "', '" + entry.getInfo().getAddress() + "', '" + entry.getPlayerAmount() + "', '" + entry.getInfo().getCountry().getId() + "', '" + (entry.getInfo().isMembers() ? 1 : 0) + "', '" + entry.getInfo().getRevision() + "')"); + statement.executeUpdate(); + SQLManager.close(statement.getConnection()); + } + + @Override + public void save() throws SQLException { + super.read(); + if (result == null || !result.next()) { + create(); + return; + } + int players = entry.getPlayerAmount(); + WorldInfo info = entry.getInfo(); + if (!entry.isActive()) { + players = -1; + } + if (players <= 0) { + PreparedStatement statement = connection.prepareStatement("UPDATE members SET online='0' WHERE lastWorld='" + value + "'"); + statement.executeUpdate(); + } + PreparedStatement statement = connection.prepareStatement("UPDATE " + table + " SET players='" + players + "', ip='" + info.getAddress() + "', country='" + info.getCountry().getId() + "', member='" + (info.isMembers() ? 1 : 0) + "', revision='" + info.getRevision() + "' WHERE world='" + value + "'"); + statement.executeUpdate(); + SQLManager.close(statement.getConnection()); + } + + @Override + public Connection getConnection() { + return SQLManager.getConnection(); + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/util/ByteBufferUtils.java b/Management-Server/src/main/java/ms/system/util/ByteBufferUtils.java new file mode 100644 index 000000000..a45abe289 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/util/ByteBufferUtils.java @@ -0,0 +1,153 @@ +package ms.system.util; + +import java.nio.ByteBuffer; + + +/** + * Holds utility methods for reading/writing a byte buffer. + * @author Emperor + * + */ +public final class ByteBufferUtils { + + /** + * Gets a string from the byte buffer. + * @param buffer The byte buffer. + * @return The string. + */ + public static String getString(ByteBuffer buffer) { + StringBuilder sb = new StringBuilder(); + byte b; + while ((b = buffer.get()) != 0) { + sb.append((char) b); + } + return sb.toString(); + } + + /** + * Puts a string on the byte buffer. + * @param s The string to put. + * @param buffer The byte buffer. + */ + public static void putString(String s, ByteBuffer buffer) { + buffer.put(s.getBytes()).put((byte) 0); + } + + /** + * Gets a string from the byte buffer. + * @param s The string. + * @param buffer The byte buffer. + * @return The string. + */ + public static ByteBuffer putGJ2String(String s, ByteBuffer buffer) { + byte[] packed = new byte[256]; + int length = packGJString2(0, packed, s); + return buffer.put((byte) 0).put(packed, 0, length).put((byte) 0); + } + + /** + * Decodes the XTEA encryption. + * @param keys The keys. + * @param start The start index. + * @param end The end index. + * @param buffer The byte buffer. + */ + public static void decodeXTEA(int[] keys, int start, int end, ByteBuffer buffer) { + int l = buffer.position(); + buffer.position(start); + int length = (end - start) / 8; + for (int i = 0; i < length; i++) { + int firstInt = buffer.getInt(); + int secondInt = buffer.getInt(); + int sum = 0xc6ef3720; + int delta = 0x9e3779b9; + for (int j = 32; j-- > 0;) { + secondInt -= keys[(sum & 0x1c84) >>> 11] + sum ^ (firstInt >>> 5 ^ firstInt << 4) + firstInt; + sum -= delta; + firstInt -= (secondInt >>> 5 ^ secondInt << 4) + secondInt ^ keys[sum & 3] + sum; + } + buffer.position(buffer.position() - 8); + buffer.putInt(firstInt); + buffer.putInt(secondInt); + } + buffer.position(l); + } + + /** + * Converts a String to an Integer? + * + * @param position + * The position. + * @param buffer + * The buffer used. + * @param string + * The String to convert. + * @return The Integer. + */ + public static int packGJString2(int position, byte[] buffer, String string) { + int length = string.length(); + int offset = position; + for (int i = 0; length > i; i++) { + int character = string.charAt(i); + if (character > 127) { + if (character > 2047) { + buffer[offset++] = (byte) ((character | 919275) >> 12); + buffer[offset++] = (byte) (128 | ((character >> 6) & 63)); + buffer[offset++] = (byte) (128 | (character & 63)); + } else { + buffer[offset++] = (byte) ((character | 12309) >> 6); + buffer[offset++] = (byte) (128 | (character & 63)); + } + } else + buffer[offset++] = (byte) character; + } + return offset - position; + } + + /** + * Gets a tri-byte from the buffer. + * @param buffer The buffer. + * @return The value. + */ + public static int getTriByte(ByteBuffer buffer) { + return ((buffer.get() & 0xFF) << 16) + ((buffer.get() & 0xFF) << 8) + (buffer.get() & 0xFF); + } + + /** + * Gets a smart from the buffer. + * @param buffer The buffer. + * @return The value. + */ + public static int getSmart(ByteBuffer buffer) { + int peek = buffer.get() & 0xFF; + if (peek <= Byte.MAX_VALUE) { + return peek; + } + return ((peek << 8) | (buffer.get() & 0xFF)) - 32768; + } + + /** + * Gets a smart from the buffer. + * @param buffer The buffer. + * @return The value. + */ + public static int getBigSmart(ByteBuffer buffer) { + int value = 0; + int current = getSmart(buffer); + while (current == 32767) { + current = getSmart(buffer); + value += 32767; + } + value += current; + return value; + } + + /** + * Constructs a new {@code ByteBufferUtils} {@code Object}. + */ + private ByteBufferUtils() { + /* + * empty. + */ + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/util/Command.java b/Management-Server/src/main/java/ms/system/util/Command.java new file mode 100644 index 000000000..fbfe0da09 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/util/Command.java @@ -0,0 +1,52 @@ +package ms.system.util; + +/** + * Represents a command. + * @author Emperor + * + */ +public abstract class Command { + + /** + * The command name. + */ + private final String name; + + /** + * The command info. + */ + private final String info; + + /** + * Constructs a new {@code Command} {@code Object}. + * @param name The command name. + * @param info The command info. + */ + public Command(String name, String info) { + this.name = name; + this.info = info; + } + + /** + * Runs the command. + * @param args The arguments. + */ + public abstract void run(String...args); + + /** + * Gets the name value. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Gets the info value. + * @return The info. + */ + public String getInfo() { + return info; + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/util/EncryptionManager.java b/Management-Server/src/main/java/ms/system/util/EncryptionManager.java new file mode 100644 index 000000000..91e154fc0 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/util/EncryptionManager.java @@ -0,0 +1,815 @@ +package ms.system.util; + +import java.io.UnsupportedEncodingException; +import java.security.SecureRandom; + +/** + * Represents the class of simple encryption functions. + * @author Unknown + */ +public class EncryptionManager { + + // Define the BCrypt workload to use when generating password hashes. 10-31 is a valid value. + private static int workload = 12; + + /** + * Singleton instance. + */ + private static final EncryptionManager INSTANCE = new EncryptionManager(); + + /** + * Constructs a new {@code EncryptionManager} {@code Object}. + */ + private EncryptionManager() { + //empty. + } + + /** + * This method can be used to generate a string representing an account password + * suitable for storing in a database. It will be an OpenBSD-style crypt(3) formatted + * hash string of length=60 + * The bcrypt workload is specified in the above static variable, a value from 10 to 31. + * A workload of 12 is a very reasonable safe default as of 2013. + * This automatically handles secure 128-bit salt generation and storage within the hash. + * @param password_plaintext The account's plaintext password as provided during account creation, + * or when changing an account's password. + * @return String - a string of length 60 that is the bcrypt hashed password in crypt(3) format. + */ + public String hashPassword(String password_plaintext) { + String salt = BCrypt.gensalt(workload); + String hashed_password = BCrypt.hashpw(password_plaintext, salt); + return(hashed_password); + } + + /** + * This method can be used to verify a computed hash from a plaintext (e.g. during a login + * request) with that of a stored hash from a database. The password hash from the database + * must be passed as the second variable. + * @param password_plaintext The account's plaintext password, as provided during a login request + * @param stored_hash The account's stored password hash, retrieved from the authorization database + * @return boolean - true if the password matches the password of the stored hash, false otherwise + */ + public boolean checkPassword(String password_plaintext, String stored_hash) { + boolean password_verified = false; + if(null == stored_hash || !stored_hash.startsWith("$2a$")) + throw new java.lang.IllegalArgumentException("Invalid hash provided for comparison"); + password_verified = BCrypt.checkpw(password_plaintext, stored_hash); + return(password_verified); + } + + // Copyright (c) 2006 Damien Miller + // + // Permission to use, copy, modify, and distribute this software for any + // purpose with or without fee is hereby granted, provided that the above + // copyright notice and this permission notice appear in all copies. + // + // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + /** + * Gets the instance value. + * @return The instance. + */ + public static EncryptionManager getInstance() { + return INSTANCE; + } + + /** + * BCrypt implements OpenBSD-style Blowfish password hashing using + * the scheme described in "A Future-Adaptable Password Scheme" by + * Niels Provos and David Mazieres. + *

+ * This password hashing system tries to thwart off-line password + * cracking using a computationally-intensive hashing algorithm, + * based on Bruce Schneier's Blowfish cipher. The work factor of + * the algorithm is parameterised, so it can be increased as + * computers get faster. + *

+ * Usage is really simple. To hash a password for the first time, + * call the hashpw method with a random salt, like this: + *

+ * + * String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
+ *
+ *

+ * To check whether a plaintext password matches one that has been + * hashed previously, use the checkpw method: + *

+ * + * if (BCrypt.checkpw(candidate_password, stored_hash))
+ *     System.out.println("It matches");
+ * else
+ *     System.out.println("It does not match");
+ *
+ *

+ * The gensalt() method takes an optional parameter (log_rounds) + * that determines the computational complexity of the hashing: + *

+ * + * String strong_salt = BCrypt.gensalt(10)
+ * String stronger_salt = BCrypt.gensalt(12)
+ *
+ *

+ * The amount of work increases exponentially (2**log_rounds), so + * each increment is twice as much work. The default log_rounds is + * 10, and the valid range is 4 to 31. + * + * @author Damien Miller + * @version 0.2 + */ + public static class BCrypt { + // BCrypt parameters + private static final int GENSALT_DEFAULT_LOG2_ROUNDS = 10; + private static final int BCRYPT_SALT_LEN = 16; + + // Blowfish parameters + private static final int BLOWFISH_NUM_ROUNDS = 16; + + // Initial contents of key schedule + private static final int P_orig[] = { + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b + }; + private static final int S_orig[] = { + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + }; + + // bcrypt IV: "OrpheanBeholderScryDoubt" + static private final int bf_crypt_ciphertext[] = { + 0x4f727068, 0x65616e42, 0x65686f6c, + 0x64657253, 0x63727944, 0x6f756274 + }; + + // Table for Base64 encoding + static private final char base64_code[] = { + '.', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9' + }; + + // Table for Base64 decoding + static private final byte index_64[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, + -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + -1, -1, -1, -1, -1, -1, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, -1, -1, -1, -1, -1 + }; + + // Expanded Blowfish key + private int P[]; + private int S[]; + + /** + * Encode a byte array using bcrypt's slightly-modified base64 + * encoding scheme. Note that this is *not* compatible with + * the standard MIME-base64 encoding. + * + * @param d the byte array to encode + * @param len the number of bytes to encode + * @return base64-encoded string + * @exception IllegalArgumentException if the length is invalid + */ + private static String encode_base64(byte d[], int len) + throws IllegalArgumentException { + int off = 0; + StringBuffer rs = new StringBuffer(); + int c1, c2; + + if (len <= 0 || len > d.length) + throw new IllegalArgumentException ("Invalid len"); + + while (off < len) { + c1 = d[off++] & 0xff; + rs.append(base64_code[(c1 >> 2) & 0x3f]); + c1 = (c1 & 0x03) << 4; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 4) & 0x0f; + rs.append(base64_code[c1 & 0x3f]); + c1 = (c2 & 0x0f) << 2; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 6) & 0x03; + rs.append(base64_code[c1 & 0x3f]); + rs.append(base64_code[c2 & 0x3f]); + } + return rs.toString(); + } + + /** + * Look up the 3 bits base64-encoded by the specified character, + * range-checking againt conversion table + * @param x the base64-encoded value + * @return the decoded value of x + */ + private static byte char64(char x) { + if ((int)x < 0 || (int)x > index_64.length) + return -1; + return index_64[(int)x]; + } + + /** + * Decode a string encoded using bcrypt's base64 scheme to a + * byte array. Note that this is *not* compatible with + * the standard MIME-base64 encoding. + * @param s the string to decode + * @param maxolen the maximum number of bytes to decode + * @return an array containing the decoded bytes + * @throws IllegalArgumentException if maxolen is invalid + */ + private static byte[] decode_base64(String s, int maxolen) + throws IllegalArgumentException { + StringBuffer rs = new StringBuffer(); + int off = 0, slen = s.length(), olen = 0; + byte ret[]; + byte c1, c2, c3, c4, o; + + if (maxolen <= 0) + throw new IllegalArgumentException ("Invalid maxolen"); + + while (off < slen - 1 && olen < maxolen) { + c1 = char64(s.charAt(off++)); + c2 = char64(s.charAt(off++)); + if (c1 == -1 || c2 == -1) + break; + o = (byte)(c1 << 2); + o |= (c2 & 0x30) >> 4; + rs.append((char)o); + if (++olen >= maxolen || off >= slen) + break; + c3 = char64(s.charAt(off++)); + if (c3 == -1) + break; + o = (byte)((c2 & 0x0f) << 4); + o |= (c3 & 0x3c) >> 2; + rs.append((char)o); + if (++olen >= maxolen || off >= slen) + break; + c4 = char64(s.charAt(off++)); + o = (byte)((c3 & 0x03) << 6); + o |= c4; + rs.append((char)o); + ++olen; + } + + ret = new byte[olen]; + for (off = 0; off < olen; off++) + ret[off] = (byte)rs.charAt(off); + return ret; + } + + /** + * Blowfish encipher a single 64-bit block encoded as + * two 32-bit halves + * @param lr an array containing the two 32-bit half blocks + * @param off the position in the array of the blocks + */ + private final void encipher(int lr[], int off) { + int i, n, l = lr[off], r = lr[off + 1]; + + l ^= P[0]; + for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) { + // Feistel substitution on left word + n = S[(l >> 24) & 0xff]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[++i]; + + // Feistel substitution on right word + n = S[(r >> 24) & 0xff]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[++i]; + } + lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; + lr[off + 1] = l; + } + + /** + * Cycically extract a word of key material + * @param data the string to extract the data from + * @param offp a "pointer" (as a one-entry array) to the + * current offset into data + * @return the next word of material from data + */ + private static int streamtoword(byte data[], int offp[]) { + int i; + int word = 0; + int off = offp[0]; + + for (i = 0; i < 4; i++) { + word = (word << 8) | (data[off] & 0xff); + off = (off + 1) % data.length; + } + + offp[0] = off; + return word; + } + + /** + * Initialise the Blowfish key schedule + */ + private void init_key() { + P = (int[])P_orig.clone(); + S = (int[])S_orig.clone(); + } + + /** + * Key the Blowfish cipher + * @param key an array containing the key + */ + private void key(byte key[]) { + int i; + int koffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) + P[i] = P[i] ^ streamtoword(key, koffp); + + for (i = 0; i < plen; i += 2) { + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + /** + * Perform the "enhanced key schedule" step described by + * Provos and Mazieres in "A Future-Adaptable Password Scheme" + * http://www.openbsd.org/papers/bcrypt-paper.ps + * @param data salt information + * @param key password information + */ + private void ekskey(byte data[], byte key[]) { + int i; + int koffp[] = { 0 }, doffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) + P[i] = P[i] ^ streamtoword(key, koffp); + + for (i = 0; i < plen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + /** + * Perform the central password hashing step in the + * bcrypt scheme + * @param password the password to hash + * @param salt the binary salt to hash with the password + * @param log_rounds the binary logarithm of the number + * of rounds of hashing to apply + * @return an array containing the binary hashed password + */ + private byte[] crypt_raw(byte password[], byte salt[], int log_rounds) { + int rounds, i, j; + int cdata[] = (int[])bf_crypt_ciphertext.clone(); + int clen = cdata.length; + byte ret[]; + + if (log_rounds < 4 || log_rounds > 31) + throw new IllegalArgumentException ("Bad number of rounds"); + rounds = 1 << log_rounds; + if (salt.length != BCRYPT_SALT_LEN) + throw new IllegalArgumentException ("Bad salt length"); + + init_key(); + ekskey(salt, password); + for (i = 0; i < rounds; i++) { + key(password); + key(salt); + } + + for (i = 0; i < 64; i++) { + for (j = 0; j < (clen >> 1); j++) + encipher(cdata, j << 1); + } + + ret = new byte[clen * 4]; + for (i = 0, j = 0; i < clen; i++) { + ret[j++] = (byte)((cdata[i] >> 24) & 0xff); + ret[j++] = (byte)((cdata[i] >> 16) & 0xff); + ret[j++] = (byte)((cdata[i] >> 8) & 0xff); + ret[j++] = (byte)(cdata[i] & 0xff); + } + return ret; + } + + /** + * Hash a password using the OpenBSD bcrypt scheme + * @param password the password to hash + * @param salt the salt to hash with (perhaps generated + * using BCrypt.gensalt) + * @return the hashed password + */ + public static String hashpw(String password, String salt) { + BCrypt B; + String real_salt; + byte passwordb[], saltb[], hashed[]; + char minor = (char)0; + int rounds, off = 0; + StringBuffer rs = new StringBuffer(); + + if (salt.charAt(0) != '$' || salt.charAt(1) != '2') + throw new IllegalArgumentException ("Invalid salt version"); + if (salt.charAt(2) == '$') + off = 3; + else { + minor = salt.charAt(2); + if (minor != 'a' || salt.charAt(3) != '$') + throw new IllegalArgumentException ("Invalid salt revision"); + off = 4; + } + + // Extract number of rounds + if (salt.charAt(off + 2) > '$') + throw new IllegalArgumentException ("Missing salt rounds"); + rounds = Integer.parseInt(salt.substring(off, off + 2)); + + real_salt = salt.substring(off + 3, off + 25); + try { + passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF-8"); + } catch (UnsupportedEncodingException uee) { + throw new AssertionError("UTF-8 is not supported"); + } + + saltb = decode_base64(real_salt, BCRYPT_SALT_LEN); + + B = new BCrypt(); + hashed = B.crypt_raw(passwordb, saltb, rounds); + + rs.append("$2"); + if (minor >= 'a') + rs.append(minor); + rs.append("$"); + if (rounds < 10) + rs.append("0"); + rs.append(Integer.toString(rounds)); + rs.append("$"); + rs.append(encode_base64(saltb, saltb.length)); + rs.append(encode_base64(hashed, + bf_crypt_ciphertext.length * 4 - 1)); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of + * hashing to apply - the work factor therefore increases as + * 2**log_rounds. + * @param random an instance of SecureRandom to use + * @return an encoded salt value + */ + public static String gensalt(int log_rounds, SecureRandom random) { + StringBuffer rs = new StringBuffer(); + byte rnd[] = new byte[BCRYPT_SALT_LEN]; + + random.nextBytes(rnd); + + rs.append("$2a$"); + if (log_rounds < 10) + rs.append("0"); + rs.append(Integer.toString(log_rounds)); + rs.append("$"); + rs.append(encode_base64(rnd, rnd.length)); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of + * hashing to apply - the work factor therefore increases as + * 2**log_rounds. + * @return an encoded salt value + */ + public static String gensalt(int log_rounds) { + return gensalt(log_rounds, new SecureRandom()); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method, + * selecting a reasonable default for the number of hashing + * rounds to apply + * @return an encoded salt value + */ + public static String gensalt() { + return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS); + } + + /** + * Check that a plaintext password matches a previously hashed + * one + * @param plaintext the plaintext password to verify + * @param hashed the previously-hashed password + * @return true if the passwords match, false otherwise + */ + public static boolean checkpw(String plaintext, String hashed) { + return (hashed.compareTo(hashpw(plaintext, hashed)) == 0); + } + } + +} diff --git a/Management-Server/src/main/java/ms/system/util/PlayerDatabaseGen.java b/Management-Server/src/main/java/ms/system/util/PlayerDatabaseGen.java new file mode 100644 index 000000000..e4187f7ee --- /dev/null +++ b/Management-Server/src/main/java/ms/system/util/PlayerDatabaseGen.java @@ -0,0 +1,19 @@ +package ms.system.util; + +/** + * Handles generating a player database. + * @author Emperor + * + */ +public final class PlayerDatabaseGen { + + /** + * The main method. + * @param args The arguments. + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/system/util/StringUtils.java b/Management-Server/src/main/java/ms/system/util/StringUtils.java new file mode 100644 index 000000000..d5cc34991 --- /dev/null +++ b/Management-Server/src/main/java/ms/system/util/StringUtils.java @@ -0,0 +1,650 @@ +package ms.system.util; + +import java.text.DecimalFormat; + +import ms.net.packet.IoBuffer; + +/** + * The string utils. + * @author Emperor + * + */ +public final class StringUtils { + + /** + * The valid characters to be used in names/messages/... + */ + public static final char[] VALID_CHARS = { + '_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', + 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' + }; + /** + * Character mapping. + */ + public static char[] mapping = { + '\n', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ' }; + /** + * The an int array241. + */ + public static int[] anIntArray241 = { 215, 203, 83, 158, 104, 101, 93, 84, + 107, 103, 109, 95, 94, 98, 89, 86, 70, 41, 32, 27, 24, 23, -1, -2, + 26, -3, -4, 31, 30, -5, -6, -7, 37, 38, 36, -8, -9, -10, 40, -11, + -12, 55, 48, 46, 47, -13, -14, -15, 52, 51, -16, -17, 54, -18, -19, + 63, 60, 59, -20, -21, 62, -22, -23, 67, 66, -24, -25, 69, -26, -27, + 199, 132, 80, 77, 76, -28, -29, 79, -30, -31, 87, 85, -32, -33, + -34, -35, -36, 197, -37, 91, -38, 134, -39, -40, -41, 97, -42, -43, + 133, 106, -44, 117, -45, -46, 139, -47, -48, 110, -49, -50, 114, + 113, -51, -52, 116, -53, -54, 135, 138, 136, 129, 125, 124, -55, + -56, 130, 128, -57, -58, -59, 183, -60, -61, -62, -63, -64, 148, + -65, -66, 153, 149, 145, 144, -67, -68, 147, -69, -70, -71, 152, + 154, -72, -73, -74, 157, 171, -75, -76, 207, 184, 174, 167, 166, + 165, -77, -78, -79, 172, 170, -80, -81, -82, 178, -83, 177, 182, + -84, -85, 187, 181, -86, -87, -88, -89, 206, 221, -90, 189, -91, + 198, 254, 262, 195, 196, -92, -93, -94, -95, -96, 252, 255, 250, + -97, 211, 209, -98, -99, 212, -100, 213, -101, -102, -103, 224, + -104, 232, 227, 220, 226, -105, -106, 246, 236, -107, 243, -108, + -109, 231, 237, 235, -110, -111, 239, 238, -112, -113, -114, -115, + -116, 241, -117, 244, -118, -119, 248, -120, 249, -121, -122, -123, + 253, -124, -125, -126, -127, 259, 258, -128, -129, 261, -130, -131, + 390, 327, 296, 281, 274, 271, 270, -132, -133, 273, -134, -135, + 278, 277, -136, -137, 280, -138, -139, 289, 286, 285, -140, -141, + 288, -142, -143, 293, 292, -144, -145, 295, -146, -147, 312, 305, + 302, 301, -148, -149, 304, -150, -151, 309, 308, -152, -153, 311, + -154, -155, 320, 317, 316, -156, -157, 319, -158, -159, 324, 323, + -160, -161, 326, -162, -163, 359, 344, 337, 334, 333, -164, -165, + 336, -166, -167, 341, 340, -168, -169, 343, -170, -171, 352, 349, + 348, -172, -173, 351, -174, -175, 356, 355, -176, -177, 358, -178, + -179, 375, 368, 365, 364, -180, -181, 367, -182, -183, 372, 371, + -184, -185, 374, -186, -187, 383, 380, 379, -188, -189, 382, -190, + -191, 387, 386, -192, -193, 389, -194, -195, 454, 423, 408, 401, + 398, 397, -196, -197, 400, -198, -199, 405, 404, -200, -201, 407, + -202, -203, 416, 413, 412, -204, -205, 415, -206, -207, 420, 419, + -208, -209, 422, -210, -211, 439, 432, 429, 428, -212, -213, 431, + -214, -215, 436, 435, -216, -217, 438, -218, -219, 447, 444, 443, + -220, -221, 446, -222, -223, 451, 450, -224, -225, 453, -226, -227, + 486, 471, 464, 461, 460, -228, -229, 463, -230, -231, 468, 467, + -232, -233, 470, -234, -235, 479, 476, 475, -236, -237, 478, -238, + -239, 483, 482, -240, -241, 485, -242, -243, 499, 495, 492, 491, + -244, -245, 494, -246, -247, 497, -248, 502, -249, 506, 503, -250, + -251, 505, -252, -253, 508, -254, 510, -255, -256, 0 }; + + /** + * Constructs a new {@code StringUtils.java} {@code Object}. + */ + public StringUtils() { + /** + * empty. + */ + } + /** + * Method used to get the formatted number as a string from the integer inputed. + * @param amount the ammount. + * @return the string value. + */ + public static String getFormattedNumber(int amount) { + return new DecimalFormat("#,###,##0").format(amount).toString(); + } + /** + * Checks if the string contains an invalid character. + * @param nameThe string. + * @return {@code True} if so. + */ + public static boolean containsInvalidCharacter(String name) { + for (char c : name.toCharArray()) { + boolean pass = false; + for (char vc : VALID_CHARS) + if (vc == c) { + pass = true; + break; + } + if (!pass) + return true; + } + return false; + } + /** + * If a word starts with a e i o u h for grammar = a + n. + * @param word The word. + * @return If the a should have +n {@code true}. + */ + public static boolean isPlusN(String word) { + if (word == null) + return false; + String s = word.toLowerCase(); + return s.charAt(0) == 'a' || s.charAt(0) == 'e' || s.charAt(0) == 'i' + || s.charAt(0) == 'o' || s.charAt(0) == 'u' + || (s.charAt(0) == 'h' && s.length() > 1 && s.charAt(1) != 'e'); + } + /** + * Method used to get the player name as a long. + * @param s the string. + * @return the long. + */ + public static long getPlayerNameLong(String s) { + long l = 0L; + for(int i = 0; i < s.length() && i < 12; i++) { + char c = s.charAt(i); + l *= 37L; + if(c >= 'A' && c <= 'Z') l += (1 + c) - 65; + else if(c >= 'a' && c <= 'z') l += (1 + c) - 97; + else if(c >= '0' && c <= '9') l += (27 + c) - 48; + } + while(l % 37L == 0L && l != 0L) l /= 37L; + return l; + } + + /** + * Method used to convert the string to a long. + * @param s the string. + * @return the long. + */ + public static long convertStringToLong(String s) { + if (s.length() > 20) { + throw new IllegalArgumentException("String is too long: " + s); + } + long out = 0L; + for (int i = 0; i < s.length(); ++i) { + long m = reducedMapping(s.codePointAt(i)); + if (m == -1) { + throw new IllegalArgumentException("Unmapped Character in String: " + s); + } + m <<= ((9 - i) * 6) + 4; + out |= m; + } + return out; + } + + /** + * Formats the string as display name. + * @param name The string to format. + * @return The formatted name. + */ + public static String formatDisplayName(String name) { + name = name.replaceAll("_", " "); + name = name.toLowerCase(); + StringBuilder newName = new StringBuilder(); + boolean wasSpace = true; + for (int i = 0; i < name.length(); i++) { + if (wasSpace) { + newName.append((new String() + name.charAt(i)).toUpperCase()); + wasSpace = false; + } else { + newName.append(name.charAt(i)); + } + if (name.charAt(i) == ' ') { + wasSpace = true; + } + } + return newName.toString(); + } + + /** + * Gets the byte for the character. + * @param c The character. + * @return The byte. + */ + private static final byte getByte(char c) { + byte charByte; + if (c > 0 && c < '\200' || c >= '\240' && c <= '\377') + charByte = (byte) c; + else if (c != '\u20AC') { + if (c != '\u201A') { + if (c != '\u0192') { + if (c == '\u201E') + charByte = -124; + else if (c != '\u2026') { + if (c != '\u2020') { + if (c == '\u2021') + charByte = -121; + else if (c == '\u02C6') + charByte = -120; + else if (c == '\u2030') + charByte = -119; + else if (c == '\u0160') + charByte = -118; + else if (c == '\u2039') + charByte = -117; + else if (c == '\u0152') + charByte = -116; + else if (c != '\u017D') { + if (c == '\u2018') + charByte = -111; + else if (c != '\u2019') { + if (c != '\u201C') { + if (c == '\u201D') + charByte = -108; + else if (c != '\u2022') { + if (c == '\u2013') + charByte = -106; + else if (c == '\u2014') + charByte = -105; + else if (c == '\u02DC') + charByte = -104; + else if (c == '\u2122') + charByte = -103; + else if (c != '\u0161') { + if (c == '\u203A') + charByte = -101; + else if (c != '\u0153') { + if (c == '\u017E') + charByte = -98; + else if (c != '\u0178') + charByte = 63; + else + charByte = -97; + } else + charByte = -100; + } else + charByte = -102; + } else + charByte = -107; + } else + charByte = -109; + } else + charByte = -110; + } else + charByte = -114; + } else + charByte = -122; + } else + charByte = -123; + } else + charByte = -125; + } else + charByte = -126; + } else + charByte = -128; + return charByte; + } + /** + * Gets the double value of this string + * @param s The string. + * @return The double value. + */ + public static double getDouble(String s) { + s = s.replaceAll(", ", "").replaceAll(",", ""); + StringBuilder sb = new StringBuilder(); + char c; + boolean foundStart = false; + for (int i = 0; i < s.length(); i++) { + c = s.charAt(i); + if (Character.isDigit(c) || c == '-' || c == '.') { + sb.append(c); + foundStart = true; + } else if (foundStart) + break; + } + try { + double amount = Double.parseDouble(sb.toString()); + return amount; + } catch (NumberFormatException e) { + return 0.0; + } + } + /** + * Gets the hash for the string. + * @param str The string. + * @return The hash. + */ + public static final int getNameHash(String str) { + str = str.toLowerCase(); + int hash = 0; + for (int index = 0; index < str.length(); index++) + hash = getByte(str.charAt(index)) + ((hash << 5) - hash); + return hash; + } + /** + * Gets the string value of this string (all html/... removed). + * @param s The string. + * @return The string value. + */ + public static String getString(String s) { + String string = s.replaceAll("\\<.*?>", "").replaceAll(" ", "") + .replaceAll("Discontinued Item:", ""); + return string; + } + /** + * Characters used to convert a String to a Long. + */ + public static char[] validChars = { + '_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', + 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', + 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', + '3', '4', '5', '6', '7', '8', '9' + }; + public static int[] anIntArray233 = { + 0, 1024, 2048, 3072, 4096, 5120, + 6144, 8192, 9216, 12288, 10240, 11264, 16384, 18432, 17408, 20480, + 21504, 22528, 23552, 24576, 25600, 26624, 27648, 28672, 29696, + 30720, 31744, 32768, 33792, 34816, 35840, 36864, 536870912, + 16777216, 37888, 65536, 38912, 131072, 196608, 33554432, 524288, + 1048576, 1572864, 262144, 67108864, 4194304, 134217728, 327680, + 8388608, 2097152, 12582912, 13631488, 14680064, 15728640, + 100663296, 101187584, 101711872, 101974016, 102760448, 102236160, + 40960, 393216, 229376, 117440512, 104857600, 109051904, 201326592, + 205520896, 209715200, 213909504, 106954752, 218103808, 226492416, + 234881024, 222298112, 224395264, 268435456, 272629760, 276824064, + 285212672, 289406976, 223346688, 293601280, 301989888, 318767104, + 297795584, 298844160, 310378496, 102498304, 335544320, 299892736, + 300941312, 301006848, 300974080, 39936, 301465600, 49152, + 1073741824, 369098752, 402653184, 1342177280, 1610612736, + 469762048, 1476395008, -2147483648, -1879048192, 352321536, + 1543503872, -2013265920, -1610612736, -1342177280, -1073741824, + -1543503872, 356515840, -1476395008, -805306368, -536870912, + -268435456, 1577058304, -134217728, 360710144, -67108864, + 364904448, 51200, 57344, 52224, 301203456, 53248, 54272, 55296, + 56320, 301072384, 301073408, 301074432, 301075456, 301076480, + 301077504, 301078528, 301079552, 301080576, 301081600, 301082624, + 301083648, 301084672, 301085696, 301086720, 301087744, 301088768, + 301089792, 301090816, 301091840, 301092864, 301093888, 301094912, + 301095936, 301096960, 301097984, 301099008, 301100032, 301101056, + 301102080, 301103104, 301104128, 301105152, 301106176, 301107200, + 301108224, 301109248, 301110272, 301111296, 301112320, 301113344, + 301114368, 301115392, 301116416, 301117440, 301118464, 301119488, + 301120512, 301121536, 301122560, 301123584, 301124608, 301125632, + 301126656, 301127680, 301128704, 301129728, 301130752, 301131776, + 301132800, 301133824, 301134848, 301135872, 301136896, 301137920, + 301138944, 301139968, 301140992, 301142016, 301143040, 301144064, + 301145088, 301146112, 301147136, 301148160, 301149184, 301150208, + 301151232, 301152256, 301153280, 301154304, 301155328, 301156352, + 301157376, 301158400, 301159424, 301160448, 301161472, 301162496, + 301163520, 301164544, 301165568, 301166592, 301167616, 301168640, + 301169664, 301170688, 301171712, 301172736, 301173760, 301174784, + 301175808, 301176832, 301177856, 301178880, 301179904, 301180928, + 301181952, 301182976, 301184000, 301185024, 301186048, 301187072, + 301188096, 301189120, 301190144, 301191168, 301193216, 301195264, + 301194240, 301197312, 301198336, 301199360, 301201408, 301202432 + }; + public static byte[] aByteArray235 = { + 22, 22, 22, 22, 22, 22, 21, 22, 22, + 20, 22, 22, 22, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 3, 8, 22, 16, 22, 16, 17, 7, 13, 13, 13, + 16, 7, 10, 6, 16, 10, 11, 12, 12, 12, 12, 13, 13, 14, 14, 11, 14, + 19, 15, 17, 8, 11, 9, 10, 10, 10, 10, 11, 10, 9, 7, 12, 11, 10, 10, + 9, 10, 10, 12, 10, 9, 8, 12, 12, 9, 14, 8, 12, 17, 16, 17, 22, 13, + 21, 4, 7, 6, 5, 3, 6, 6, 5, 4, 10, 7, 5, 6, 4, 4, 6, 10, 5, 4, 4, + 5, 7, 6, 10, 6, 10, 22, 19, 22, 14, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 22, 21, 22, 22, 22, 21, + 22, 22 + }; + /** + * Encrypt a string for the client. + */ + public static int encryptPlayerChat(byte[] is, int i_25_, int i_26_, int i_27_, byte[] is_28_) { + try { + i_27_ += i_25_; + int i_29_ = 0; + int i_30_ = i_26_ << -2116795453; + for (; i_27_ > i_25_; i_25_++) { + int i_31_ = 0xff & is_28_[i_25_]; + int i_32_ = anIntArray233[i_31_]; + int i_33_ = aByteArray235[i_31_]; + int i_34_ = i_30_ >> -1445887805; + int i_35_ = i_30_ & 0x7; + i_29_ &= (-i_35_ >> 473515839); + i_30_ += i_33_; + int i_36_ = ((-1 + (i_35_ - -i_33_)) >> -1430991229) + i_34_; + i_35_ += 24; + is[i_34_] = (byte) (i_29_ = (i_29_ | (i_32_ >>> i_35_))); + if ((i_36_ ^ 0xffffffff) < (i_34_ ^ 0xffffffff)) { + i_34_++; + i_35_ -= 8; + is[i_34_] = (byte) (i_29_ = i_32_ >>> i_35_); + if (i_36_ > i_34_) { + i_34_++; + i_35_ -= 8; + is[i_34_] = (byte) (i_29_ = i_32_ >>> i_35_); + if (i_36_ > i_34_) { + i_35_ -= 8; + i_34_++; + is[i_34_] = (byte) (i_29_ = i_32_ >>> i_35_); + if (i_34_ < i_36_) { + i_35_ -= 8; + i_34_++; + is[i_34_] = (byte) (i_29_ = i_32_ << -i_35_); + } + } + } + } + } + return -i_26_ + ((7 + i_30_) >> -662855293); + } catch (RuntimeException runtimeexception) { + } + return 0; + } + /** + * Gets an integer value from a string. + * @param s the string. + * @return The value; + */ + public static int getValue(String s) { + s = s.replaceAll(", ", "").replaceAll(",", ""); + StringBuilder sb = new StringBuilder(); + char c; + boolean foundStart = false; + for (int i = 0; i < s.length(); i++) { + c = s.charAt(i); + if (Character.isDigit(c) || c == '-') { + sb.append(c); + foundStart = true; + } else if (foundStart) + break; + } + try { + int amount = Integer.parseInt(sb.toString()); + return amount; + } catch (NumberFormatException e) { + return 0; + } + } + /** + * Checks if the account name is valid. + * @param name The account name. + * @return {@code True} if the account name is invalid. + */ + public static boolean invalidAccountName(String name) { + return name.length() < 2 || name.length() > 12 || name.startsWith("_")|| name.endsWith("_") || name.contains("__") || containsInvalidCharacter(name); + } + + /** + * Converts a long to a string. + * @param l The long. + * @return The string. + */ + public static String longToString(long l) { + int i = 0; + char ac[] = new char[32]; + while (l != 0L) { + long l1 = l; + l /= 37L; + ac[11 - i++] = VALID_CHARS[(int) (l1 - l * 37L)]; + } + return new String(ac, 12 - i, i); + } + + /** + * Packs a GJ2-String. + * @param position The position to start. + * @param buffer The byte-array. + * @param str The string. + * @return The size of the string. + */ + public static final int packGJString2(int position, byte[] buffer, + String str) { + int length = str.length(); + int offset = position; + for (int index = 0; length > index; index++) { + int character = str.charAt(index); + if (character > 127) { + if (character > 2047) { + buffer[offset++] = (byte) ((character | 919275) >> 12); + buffer[offset++] = (byte) (128 | ((character >> 6) & 63)); + buffer[offset++] = (byte) (128 | (character & 63)); + } else { + buffer[offset++] = (byte) ((character | 12309) >> 6); + buffer[offset++] = (byte) (128 | (character & 63)); + } + } else + buffer[offset++] = (byte) character; + } + return offset - position; + } + /** + * Method used to... + * @param x idk, + * @return the idk. + */ + public static long reducedMapping(int x) { + long out = -1; + if (x >= 97 && x <= 122) + out = x - 96; + else if (x >= 65 && x <= 90) + out = x - 37; + else if (x >= 48 && x <= 57) + out = x - +5; + else if (x == 32) + out = 63L; + return out; + } + /** + * Converts a string to a long. + * @param s The string. + * @return The long. + */ + public static long stringToLong(String s) { + long l = 0L; + for (int i = 0; i < s.length() && i < 12; i++) { + char c = s.charAt(i); + l *= 37L; + if (c >= 'A' && c <= 'Z') + l += (1 + c) - 65; + else if (c >= 'a' && c <= 'z') + l += (1 + c) - 97; + else if (c >= '0' && c <= '9') + l += (27 + c) - 48; + } + while (l % 37L == 0L && l != 0L) + l /= 37L; + return l; + } + /** + * Decrypt player chat. + * + * @param buffer + * The buffer + * @param totalChars + * The total chars + * @return The string + */ + public static String decryptPlayerChat(IoBuffer buffer, int totalChars) { + try { + if (totalChars == 0) + return ""; + int charsDecoded = 0; + int i_4_ = 0; + String s = ""; + for (;;) { + byte i_7_ = (byte) buffer.get(); + if (i_7_ >= 0) + i_4_++; + else + i_4_ = anIntArray241[i_4_]; + int i_8_; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + i_4_ = 0; + } + if (((i_7_ & 0x40) ^ 0xffffffff) != -1) + i_4_ = anIntArray241[i_4_]; + else + i_4_++; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (++charsDecoded >= totalChars) + break; + i_4_ = 0; + } + if ((0x20 & i_7_) == 0) + i_4_++; + else + i_4_ = anIntArray241[i_4_]; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + i_4_ = 0; + } + if (((0x10 & i_7_) ^ 0xffffffff) == -1) + i_4_++; + else + i_4_ = anIntArray241[i_4_]; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + + i_4_ = 0; + } + if (((0x8 & i_7_) ^ 0xffffffff) != -1) + i_4_ = anIntArray241[i_4_]; + else + i_4_++; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (++charsDecoded >= totalChars) + break; + i_4_ = 0; + } + if ((0x4 & i_7_) == 0) + i_4_++; + else + i_4_ = anIntArray241[i_4_]; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + i_4_ = 0; + } + if (((i_7_ & 0x2) ^ 0xffffffff) != -1) + i_4_ = anIntArray241[i_4_]; + else + i_4_++; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + i_4_ = 0; + } + if (((i_7_ & 0x1) ^ 0xffffffff) != -1) + i_4_ = anIntArray241[i_4_]; + else + i_4_++; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (++charsDecoded >= totalChars) + break; + i_4_ = 0; + } + } + return s; + } catch (RuntimeException runtimeexception) { + runtimeexception.printStackTrace(); + } + return ""; + } +} diff --git a/Management-Server/src/main/java/ms/system/util/TaskExecutor.java b/Management-Server/src/main/java/ms/system/util/TaskExecutor.java new file mode 100644 index 000000000..e2b3c886b --- /dev/null +++ b/Management-Server/src/main/java/ms/system/util/TaskExecutor.java @@ -0,0 +1,55 @@ +package ms.system.util; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +/** + * A class holding methods to execute tasks. + * @author Emperor + * + */ +public final class TaskExecutor { + + /** + * The executor to use. + */ + private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor(); + + /** + * The SQL task executor. + */ + private static final ScheduledExecutorService SQL_EXECUTOR = Executors.newSingleThreadScheduledExecutor(); + + /** + * Constructs a new {@code TaskExecutor} {@code Object}. + */ + private TaskExecutor() { + /* + * empty. + */ + } + + /** + * Executes an SQL handling task. + * @param task The task. + */ + public static void executeSQL(Runnable task) { + SQL_EXECUTOR.execute(task); + } + + /** + * Executes the task. + * @param task The task to execute. + */ + public static void execute(Runnable task) { + EXECUTOR.execute(task); + } + + /** + * Gets the executor. + * @return The executor. + */ + public static ScheduledExecutorService getExecutor() { + return EXECUTOR; + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/world/GameServer.java b/Management-Server/src/main/java/ms/world/GameServer.java new file mode 100644 index 000000000..fed3069b7 --- /dev/null +++ b/Management-Server/src/main/java/ms/world/GameServer.java @@ -0,0 +1,124 @@ +package ms.world; + +import ms.net.IoSession; +import ms.net.packet.WorldPacketRepository; +import ms.system.mysql.SQLEntryHandler; +import ms.system.mysql.WorldListSQLHandler; +import ms.system.util.TaskExecutor; +import ms.world.info.Response; +import ms.world.info.WorldInfo; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +/** + * Represents a game world. + * @author Emperor + * + */ +public final class GameServer { + + /** + * The world info. + */ + private final WorldInfo info; + + /** + * The I/O session. + */ + private IoSession session; + + /** + * The players active on the game server. + */ + private final Map players = new HashMap<>(); + + /** + * The scheduled future for the updating task. + */ + private ScheduledFuture future; + + /** + * constructs a new {@code GameServer} {@code Object}. + * @param info The world info. + */ + public GameServer(WorldInfo info) { + this.info = info; + } + + /** + * Configures the game server. + * @param session The I/O session. + */ + public void configure(IoSession session) { + this.session = session; + session.setGameServer(this); + future = TaskExecutor.getExecutor().scheduleAtFixedRate(() -> { + SQLEntryHandler.write(new WorldListSQLHandler(GameServer.this)); + if (!isActive()) { + future.cancel(false); + future = null; + } + }, 0, 10, TimeUnit.SECONDS); + } + + /** + * Registers a player. + * @param player The player. + */ + public void register(PlayerSession player) { + players.put(player.getUsername(), player); + player.setWorld(this); + player.setActive(true); + player.setWorldId(info.getWorldId()); + player.configure(); + WorldPacketRepository.sendRegistryResponse(this, player, Response.SUCCESSFUL); + player.getCommunication().sync(); + } + + /** + * Checks if the game server is active. + * @return {@code True} if so. + */ + public boolean isActive() { + return session.isActive(); + } + + /** + * @return the playerAmount + */ + public int getPlayerAmount() { + return players.size(); + } + + /** + * @return the info + */ + public WorldInfo getInfo() { + return info; + } + + /** + * @return the session + */ + public IoSession getSession() { + return session; + } + + /** + * @param session the session to set + */ + public void setSession(IoSession session) { + this.session = session; + } + + /** + * Gets the players value. + * @return The players. + */ + public Map getPlayers() { + return players; + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/world/PlayerSession.java b/Management-Server/src/main/java/ms/world/PlayerSession.java new file mode 100644 index 000000000..4cfa02f66 --- /dev/null +++ b/Management-Server/src/main/java/ms/world/PlayerSession.java @@ -0,0 +1,470 @@ +package ms.world; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import ms.ServerConstants; +import ms.system.communication.ClanRepository; +import ms.system.communication.CommunicationInfo; +import ms.system.mysql.SQLManager; +import ms.world.info.UIDInfo; + +/** + * Represents a player session. + * @author Emperor + * + */ +public final class PlayerSession { + + /** + * The player's communication info. + */ + private CommunicationInfo communication = new CommunicationInfo(this); + + /** + * The game server the player is currently in. + */ + private GameServer world; + + /** + * The current clan. + */ + private ClanRepository clan; + + /** + * The player's UID info. + */ + private UIDInfo uid; + + /** + * The username. + */ + private final String username; + + /** + * The password. + */ + private String password; + + /** + * The player's rights. + */ + private int rights; + + /** + * The world id. + */ + private int worldId; + + /** + * If the player session is active. + */ + private boolean active; + + /** + * The time stamp of last disconnection. + */ + private long disconnectionTime = 0l; + + /** + * How long the player is banned for. + */ + private long banTime; + + /** + * How long the player is muted for. + */ + private long muteTime; + + /** + * The last world the player logged in. + */ + private int lastWorld = -1; + + /** + * The chat icon. + */ + private int chatIcon; + + /** + * Constructs a new {@code PlayerSession} {@code Object}. + * @param username The username. + * @param password The password. + * @param ipAddress The ip address. + * @param macAddress The mac address. + * @param computerName The computer name. + * @param serial The motherboard serial key. + */ + public PlayerSession(String username, String password, UIDInfo uid) { + this.username = username; + this.password = password; + this.uid = uid; + } + + /** + * Parses the session's data from the database. + * @return {@code True} if parsed. + */ + public boolean parse() { + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return false; + } + ResultSet result = null; + PreparedStatement statement; + try { + statement = connection.prepareStatement("SELECT * FROM " + "members" + " WHERE " + "" + "username" + "='" + username.toLowerCase() + "' LIMIT 1"); + result = statement.executeQuery(); + if (result == null || !result.next()) { + SQLManager.close(connection); + return false; + } + rights = result.getInt("rights"); + disconnectionTime = result.getLong("disconnectTime"); + lastWorld = result.getInt("lastWorld"); + banTime = result.getLong("banTime"); + communication.parse(result); + uid.parse(result); + SQLManager.close(connection); + } catch (SQLException ex) { + ex.printStackTrace(); + SQLManager.close(connection); + return false; + } + return true; + } + + /** + * Called when a session is removed. + */ + public void remove() { + if (world != null && world.getInfo().getRevision() == 498) { + return; + } + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return; + } + PreparedStatement statement; + try { + statement = connection.prepareStatement("UPDATE members SET disconnectTime = ?, lastWorld = ?, contacts = ?, blocked = ?, clanName = ?, currentClan = ?, clanReqs = ?, chatSettings = ?, online= ? WHERE username = ?"); + statement.setLong(1, System.currentTimeMillis()); + statement.setInt(2, worldId); + communication.save(statement); + statement.setBoolean(9, false); + statement.setString(10, username); + statement.executeUpdate(); + SQLManager.close(connection); + } catch (SQLException e) { + e.printStackTrace(); + SQLManager.close(connection); + } + communication.clear(); + } + + /** + * Gets a player session. + * @param username the username. + * @return the player session. + */ + public static PlayerSession get(String username) { + PlayerSession session = new PlayerSession(username, "", new UIDInfo()); + if (!session.parse()) { + return null; + } + return session; + } + + /** + * Configures the player session. + */ + public void configure() { + ClanRepository clan = ClanRepository.getClans().get(username); + if (clan != null) { + clan.setOwner(this); + } + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return; + } + PreparedStatement statement; + try { + statement = connection.prepareStatement("UPDATE members SET online = ?, lastWorld = ?, lastLogin = ? WHERE username = ?"); + statement.setBoolean(1, true); + statement.setInt(2, worldId); + statement.setLong(3, System.currentTimeMillis()); + statement.setString(4, username); + statement.execute(); + SQLManager.close(connection); + } catch (SQLException e) { + e.printStackTrace(); + SQLManager.close(connection); + } + } + + /** + * Checks if the player has just moved worlds. + * @return {@code True} if so. + */ + public boolean hasMovedWorld() { + if (rights == 2) { + return false; + } + return System.currentTimeMillis() - disconnectionTime < ServerConstants.WORLD_SWITCH_DELAY; + } + + /** + * Gets the username value. + * @return The username. + */ + public String getUsername() { + return username; + } + + /** + * Gets the password value. + * @return The password. + */ + public String getPassword() { + return password; + } + + /** + * Gets the chat icon. + * @return The chat icon. + */ + public int getChatIcon() { + return chatIcon; + } + + /** + * Gets the ipAddress value. + * @return The ipAddress. + */ + public String getIpAddress() { + return uid.getIp(); + } + + /** + * Gets the macAddress value. + * @return The macAddress. + */ + public String getMacAddress() { + return uid.getMac(); + } + + /** + * Gets the computerName value. + * @return The computerName. + */ + public String getComputerName() { + return uid.getCompName(); + } + + /** + * Gets the worldId value. + * @return The worldId. + */ + public int getWorldId() { + return worldId; + } + + /** + * Sets the worldId value. + * @param worldId The worldId to set. + */ + public void setWorldId(int worldId) { + this.worldId = worldId; + } + + /** + * Gets the active value. + * @return The active. + */ + public boolean isActive() { + return active; + } + + /** + * Sets the active value. + * @param active The active to set. + */ + public void setActive(boolean active) { + this.active = active; + } + + /** + * Gets the serialKey value. + * @return The serialKey. + */ + public String getSerialKey() { + return uid.getSerial(); + } + + /** + * Gets the rights value. + * @return The rights. + */ + public int getRights() { + return rights; + } + + /** + * Sets the rights value. + * @param rights The rights to set. + */ + public void setRights(int rights) { + this.rights = rights; + } + + /** + * If the player is banned. + * @return {@code true} if so. + */ + public boolean isBanned() { + return banTime > System.currentTimeMillis(); + } + + /** + * Gets the banTime value. + * @return The banTime. + */ + public long getBanTime() { + return banTime; + } + + /** + * Gets the muteTime. + * @return the muteTime. + */ + public long getMuteTime() { + return muteTime; + } + + + /** + * Sets the muteTime. + * @param muteTime the muteTime to set + */ + public void setMuteTime(long muteTime) { + this.muteTime = muteTime; + } + + + /** + * Gets the disconnectionTime value. + * @return The disconnectionTime. + */ + public long getDisconnectionTime() { + return disconnectionTime; + } + + /** + * Gets the lastWorld value. + * @return The lastWorld. + */ + public int getLastWorld() { + return lastWorld; + } + + /** + * Sets the lastWorld value. + * @param lastWorld The lastWorld to set. + */ + public void setLastWorld(int lastWorld) { + this.lastWorld = lastWorld; + } + + /** + * Gets the communication value. + * @return The communication. + */ + public CommunicationInfo getCommunication() { + return communication; + } + + /** + * Sets the communication value. + * @param communication The communication to set. + */ + public void setCommunication(CommunicationInfo communication) { + this.communication = communication; + } + + /** + * Gets the world value. + * @return The world. + */ + public GameServer getWorld() { + return world; + } + + /** + * Sets the world value. + * @param world The world to set. + */ + public void setWorld(GameServer world) { + this.world = world; + } + + /** + * Gets the clan value. + * @return The clan. + */ + public ClanRepository getClan() { + return clan; + } + + /** + * Sets the clan value. + * @param clan The clan to set. + */ + public void setClan(ClanRepository clan) { + this.clan = clan; + } + + /** + * Sets the chat icon. + * @param chatIcon + */ + public void setChatIcon(int chatIcon) { + this.chatIcon = chatIcon; + } + + /** + * Gets the uid. + * @return the uid. + */ + public UIDInfo getUid() { + return uid; + } + + /** + * Sets the uid. + * @param uid the uid to set + */ + public void setUid(UIDInfo uid) { + this.uid = uid; + } + + /** + * Sets the disconnect time. + * @param time the time. + */ + public void setDisconnectTime(long time) { + this.disconnectionTime = time; + } + + @Override + public boolean equals(Object o) { + return username.equals(((PlayerSession) o).username); + } + + @Override + public String toString() { + return "player [name=" + username + ", pass=" + password + ", ip=" + uid.getIp() + ", mac=" + uid.getMac() + ", comp=" + uid.getCompName() + ", msk=" + uid.getSerial() + "]"; + } + +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/world/WorldDatabase.java b/Management-Server/src/main/java/ms/world/WorldDatabase.java new file mode 100644 index 000000000..f859ccc6d --- /dev/null +++ b/Management-Server/src/main/java/ms/world/WorldDatabase.java @@ -0,0 +1,255 @@ +package ms.world; + +import java.nio.ByteBuffer; + +import ms.ServerConstants; +import ms.net.IoSession; +import ms.net.packet.IoBuffer; +import ms.world.info.CountryFlag; +import ms.world.info.WorldInfo; + +/** + * Holds all the world servers. + * @author Emperor + * + */ +public class WorldDatabase { + + /** + * The game servers. + */ + public static final GameServer[] DATABASE = new GameServer[ServerConstants.WORLD_LIMIT]; + + /** + * The update time stamp. + */ + private static long updateStamp = System.currentTimeMillis(); + + /** + * Used to prevent {@code WorldDatabase} from getting instantiated. + */ + private WorldDatabase() { + /* + * empty. + */ + } + + /** + * Gets the packet to update the world list in the lobby. + * @param player The player. + * @param worldConfiguration If the configuration should be added. + * @param worldStatus If the status should be added. + * @return The {@code OutgoingPacket} to write. + */ + public static void sendUpdate(IoSession session, int updateStamp) { + ByteBuffer buf = ByteBuffer.allocate(1024); + buf.put((byte) 0); + buf.putShort((short) 0); + buf.put((byte) 1); + IoBuffer buffer = new IoBuffer(); + if (updateStamp != (int) WorldDatabase.updateStamp) { + buf.put((byte) 1); // Indicates an update occured. + putWorldListinfo(buffer); + } else { + buf.put((byte) 0); + } + putPlayerInfo(buffer); + if (buffer.toByteBuffer().position() > 0) { + buf.put((ByteBuffer) buffer.toByteBuffer().flip()); + } + buf.putShort(1, (short) (buf.position() - 3)); + session.queue((ByteBuffer) buf.flip()); + } + + /** + * Adds the world status on the packet. + * @param buffer The current packet. + */ + private static void putPlayerInfo(IoBuffer buffer) { + for (GameServer server : DATABASE) { + if (server != null) { + WorldInfo w = server.getInfo(); + buffer.putSmart(w.getWorldId()); + buffer.putShort(server.isActive() ? server.getPlayerAmount() : -1); + } + } + } + + /** + * Sets the countries for each world. + * @param buffer The current packet. + */ + private static void putCountryInfo(IoBuffer buffer) { + for (CountryFlag country : CountryFlag.values()) { + buffer.putSmart(country.getId()); + buffer.putJagString(capitalize(country.name().toLowerCase())); + } + } + /* + * Stole this from a library so we don't need the dependency + */ + private static String capitalize(String name) { + if (name != null && name.length() != 0) { + char[] chars = name.toCharArray(); + chars[0] = Character.toUpperCase(chars[0]); + return new String(chars); + } else { + return name; + } + } + + /** + * Adds the world configuration on the packet. + * @param buffer The current packet. + */ + private static void putWorldListinfo(IoBuffer buffer) { + buffer.putSmart(CountryFlag.values().length); + putCountryInfo(buffer); + buffer.putSmart(0); + buffer.putSmart(DATABASE.length); + buffer.putSmart(getRegisteredAmount()); + for (GameServer server : DATABASE) { + if (server != null) { + WorldInfo w = server.getInfo(); + buffer.putSmart(w.getWorldId()); + buffer.put(w.getCountry().ordinal()); + buffer.putInt(w.getSettings()); + buffer.putJagString(w.getActivity()); + buffer.putJagString(w.getAddress()); + } + } + buffer.putInt((int) updateStamp); + } + + /** + * Gets the amount of worlds registered. + * @return The amount of worlds registered. + */ + public static int getRegisteredAmount() { + int count = 0; + for (GameServer server : DATABASE) { + if (server != null) { + count++; + } + } + return count; + } + + /** + * Registers a game server. + * @param info The game world info. + */ + public static GameServer register(WorldInfo info) { + GameServer server = DATABASE[info.getWorldId()]; + if (server != null && server.getSession().isActive() && !server.getSession().getAddress().equals(info.getAddress())) { + throw new IllegalStateException("World " + info.getWorldId() + " is already registered!"); + } + flagUpdate(); + System.out.println("Registered world - [id=" + info.getWorldId() + ", ip=" + info.getAddress() + ", country=" + info.getCountry().name().toLowerCase() + ", revision=" + info.getRevision() + "]!"); + return DATABASE[info.getWorldId()] = new GameServer(info); + } + + /** + * Gets the world id of the player. + * @param username The username of the player. + * @return The world id. + */ + public static int getWorldId(String username) { + return getWorldId(getPlayer(username)); + } + + /** + * Gets the world id of the player. + * @param player The player. + * @return The world id. + */ + public static int getWorldId(PlayerSession player) { + if (player == null || !player.isActive()) { + return 0; + } + return player.getWorldId(); + } + + /** + * Checks if the game world is active. + * @param worldId The world id. + * @return {@code True} if so. + */ + public static boolean isActive(int worldId) { + GameServer server = get(worldId); + return server != null && server.isActive(); + } + + /** + * Checks if the player session for the given name is active. + * @param username The player's username. + * @return {@code True} if so. + */ + public static boolean isActivePlayer(String username) { + PlayerSession session = getPlayer(username); + return session != null && session.isActive(); + } + + /** + * Gets the player session for the given name. + * @param username The player's username. + * @return The player session. + */ + public static PlayerSession getPlayer(String username) { + return getPlayer(username, false); + } + + /** + * Gets the player session for the given name. + * @param username The player's username. + * @param load If we load the users data. + * @return The player session. + */ + public static PlayerSession getPlayer(String username, boolean load) { + for (GameServer server : DATABASE) { + if (server != null && server.isActive()) { + PlayerSession player = server.getPlayers().get(username); + if (player != null) { + return player; + } + } + } + if (load) { + return PlayerSession.get(username); + } + return null; + } + + /** + * Gets the game server for the given world id. + * @param worldId The world id. + * @return The game server. + */ + public static GameServer get(int worldId) { + return DATABASE[worldId]; + } + + /** + * Gets all the game servers. + * @return The list of game servers. + */ + public static GameServer[] getWorlds() { + return DATABASE; + } + + /** + * Gets the updateStamp. + * @return the updateStamp + */ + public static long getUpdateStamp() { + return updateStamp; + } + + /** + * Sets the updateStamp. + * @param updateStamp the updateStamp to set. + */ + public static void flagUpdate() { + WorldDatabase.updateStamp = System.currentTimeMillis(); + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/world/info/CountryFlag.java b/Management-Server/src/main/java/ms/world/info/CountryFlag.java new file mode 100644 index 000000000..f59a31a26 --- /dev/null +++ b/Management-Server/src/main/java/ms/world/info/CountryFlag.java @@ -0,0 +1,96 @@ +package ms.world.info; + +/** + * The country flags. + * @author Emperor + * + */ +public enum CountryFlag { + + /** + * Belgium + */ + BELGIUM(22), + + /** + * Canada. + */ + CANADA(38), + + /** + * The united kingdom. + */ + UNITED_KINGDOM(77), + + /** + * Netherlands + */ + NETHERLANDS(161), + + /** + * Sweden + */ + SWEDEN(191), + + /** + * Finland + */ + FINLAND(69), + + /** + * Australia. + */ + AUSTRALIA(16), + + /** + * America (USA) + */ + UNITED_STATES_OF_AMERICA(225), + + /** + * Norway + */ + NORWAY(162), + + /** + * Ireland + */ + IRELAND(101), + + /** + * DENMARK + */ + DENMARK(58), + + /** + * Brazil + */ + BRAZIL(31), + + /** + * Mexico + */ + MEXICO(152), + + ; + + /** + * The flag id. + */ + private final int id; + + /** + * Constructs a new {@code CountryFlag} {@code Object}. + * @param id The flag id. + */ + private CountryFlag(int id) { + this.id = id; + } + + /** + * @return the id + */ + public int getId() { + return id; + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/world/info/Response.java b/Management-Server/src/main/java/ms/world/info/Response.java new file mode 100644 index 000000000..7d8ae0c73 --- /dev/null +++ b/Management-Server/src/main/java/ms/world/info/Response.java @@ -0,0 +1,144 @@ +package ms.world.info; + +/** + * Holds the response codes during the attempt to login. + * @author Emperor + */ +public enum Response { + + /** + * An unexpected server response occurred. + */ + UNEXPECTED_RESPONSE(0), + + /** + * Could not display advertisement video, logging in in x seconds. + */ + COULD_NOT_DISPLAY_AD(1), + + /** + * A successful login. + */ + SUCCESSFUL(2), + + /** + * Invalid username or password has been entered. + */ + INVALID_CREDENTIALS(3), + + /** + * This account is banned. + */ + ACCOUNT_DISABLED(4), + + /** + * This account is already logged in. + */ + ALREADY_ONLINE(5), + + /** + * We have updated and client needs to be reloaded. + */ + UPDATED(6), + + /** + * The world is full. + */ + FULL_WORLD(7), + + /** + * Login server is offline. + */ + LOGIN_SERVER_OFFLINE(8), + + /** + * The login limit has been exceeded. + */ + LOGIN_LIMIT_EXCEEDED(9), + + /** + * The session key was invalid. + */ + BAD_SESSION_ID(10), + + /** + * The password is too weak, and should be improved. + */ + WEAK_PASSWORD(11), + + /** + * When trying to connect to a members world while being f2p. + */ + MEMBERS_WORLD(12), + + /** + * Could not login. + */ + COULD_NOT_LOGIN(13), + + /** + * The server is currently updating. + */ + UPDATING(14), + + /** + * Too many incorrect login attempts from your address. + */ + TOO_MANY_INCORRECT_LOGINS(16), + + /** + * When logging on a free world while standing in members area. + */ + STANDING_IN_MEMBER(17), + + /** + * This account is locked as it might have been stolen. + */ + LOCKED(18), + + /** + * Closed beta going on. + */ + CLOSED_BETA(19), + + /** + * The login server connected to is invalid. + */ + INVALID_LOGIN_SERVER(20), + + /** + * Moving from another world... + */ + MOVING_WORLD(21), + + /** + * When the player's saved file exists, but is unable to be loaded. + */ + ERROR_LOADING_PROFILE(24), + + /** + * This computer address is disabled as it was used to break our rules. + */ + BANNED(26); + + /** + * The buffer. + */ + private final int opcode; + + /** + * Constructs a new {@code Response} {@code Object}. + * @param opcode The login response opcode. + */ + Response(int opcode) { + this.opcode = opcode; + } + + /** + * Gets the opcode. + * @return The opcode. + */ + public int opcode() { + return opcode; + } +} \ No newline at end of file diff --git a/Management-Server/src/main/java/ms/world/info/UIDInfo.java b/Management-Server/src/main/java/ms/world/info/UIDInfo.java new file mode 100644 index 000000000..d5122c792 --- /dev/null +++ b/Management-Server/src/main/java/ms/world/info/UIDInfo.java @@ -0,0 +1,222 @@ +package ms.world.info; + +import java.nio.ByteBuffer; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.StringTokenizer; + +import ms.system.util.ByteBufferUtils; + +/** + * The unique info of a player. + * @author Vexia + * + */ +public class UIDInfo { + + /** + * The ip address. + */ + private String ip; + + /** + * The computer name. + */ + private String compName; + + /** + * The mac-address. + */ + private String mac; + + /** + * The motherboard serial of the user. + */ + private String serial; + + + /** + * Constructs a new {@code UIDInfo} {@code Object} + */ + public UIDInfo() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code UIDInfo} {@code Object} + * @param ip the ip. + * @param compName the computer name. + * @param mac the mac. + * @param serial the serial. + */ + public UIDInfo(String ip, String compName, String mac, String serial) { + this.ip = ip; + this.compName = compName; + this.mac = mac; + this.serial = serial; + } + + /** + * Parses the data from a prepared statement. + * @param set The result set + * @throws SQLException The exception if thrown. + */ + public void parse(ResultSet set) throws SQLException { + setIp(parseFormat(set.getString("ip"))); + setCompName(parseFormat(set.getString("computerName"))); + setMac(parseFormat(set.getString("mac"))); + setSerial(parseFormat(set.getString("serial"))); + } + + /** + * Saves the UID data on the buffer. + * @param buffer The buffer. + */ + public void save(ByteBuffer buffer) { + save(buffer, ip, 1); + save(buffer, compName, 2); + save(buffer, mac, 3); + save(buffer, serial, 4); + buffer.put((byte) 0); + } + + /** + * Parses the UID data from the buffer. + * @param buffer The buffer. + */ + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + ip = ByteBufferUtils.getString(buffer); + break; + case 2: + compName = ByteBufferUtils.getString(buffer); + break; + case 3: + mac = ByteBufferUtils.getString(buffer); + break; + case 4: + serial = ByteBufferUtils.getString(buffer); + break; + } + } + } + + /** + * Parses a string with a certain format. + * @param string the string. + * @return the string. + */ + private String parseFormat(String string) { + if (string == null || string == "") { + return null; + } + StringTokenizer token = new StringTokenizer(string, "|"); + String s = ""; + int t = token.countTokens(); + for (int i = 0; i < t; i++) { + s = token.nextToken(); + } + return s; + } + + /** + * Saves a string value to the buffer. + * @param buffer the buffer. + * @param value the value. + * @param opcode the opcode. + */ + private void save(ByteBuffer buffer, String value, int opcode) { + if (value == null) { + return; + } + ByteBufferUtils.putString(value, buffer.put((byte) opcode)); + } + + /** + * Converts a to string in format mode for an admin or mod. + * @param admin the admin. + * @return the string. + */ + public String toString(boolean admin) { + String format = toString(); + if (!admin) {//formats for non-admins + String[] tokens = format.split("serial="); + format = format.replace("serial=", "uid=").replace(tokens[tokens.length - 1], "*****"); + } + return format; + } + + /** + * Gets the compName. + * @return the compName + */ + public String getCompName() { + return compName; + } + + /** + * Gets the ip. + * @return the ip + */ + public String getIp() { + return ip; + } + + /** + * Gets the mac. + * @return the mac + */ + public String getMac() { + return mac; + } + + /** + * Gets the serial. + * @return the serial + */ + public String getSerial() { + return serial; + } + + /** + * Sets the ip. + * @param ip the ip to set. + */ + public void setIp(String ip) { + this.ip = ip; + } + + /** + * Sets the compName. + * @param compName the compName to set. + */ + public void setCompName(String compName) { + this.compName = compName; + } + + /** + * Sets the mac. + * @param mac the mac to set. + */ + public void setMac(String mac) { + this.mac = mac; + } + + /** + * Sets the serial. + * @param serial the serial to set. + */ + public void setSerial(String serial) { + this.serial = serial; + } + + @Override + public String toString() { + return "[ip=" + ip + ", compName=" + compName + ", mac=" + mac + ", serial=" + serial + "]"; + } +} diff --git a/Management-Server/src/main/java/ms/world/info/WorldInfo.java b/Management-Server/src/main/java/ms/world/info/WorldInfo.java new file mode 100644 index 000000000..74c4d743d --- /dev/null +++ b/Management-Server/src/main/java/ms/world/info/WorldInfo.java @@ -0,0 +1,163 @@ +package ms.world.info; + +/** + * Holds the info of a world server. + * @author Emperor + * + */ +public final class WorldInfo { + + /** + * The world id. + */ + private final int worldId; + + /** + * The IP-address. + */ + private final String address; + + /** + * The revision of the world. + */ + private final int revision; + + /** + * The country this world is located in. + */ + private final CountryFlag country; + + /** + * The world activity. + */ + private final String activity; + + /** + * If the world is members only. + */ + private final boolean members; + + /** + * If the world is a PvP world. + */ + private final boolean pvp; + + /** + * If the world is a quick chat only world. + */ + private final boolean quickChat; + + /** + * If the world has lootshare option enabled. + */ + private final boolean lootshare; + + /** + * Constructs a new {@code WorldInfo} {@code Object}. + * @param id The world id. + * @param address The address. + * @param country The country flag. + * @param members If the world is members only. + */ + public WorldInfo(int id, String address, int revision, CountryFlag country, String activity, boolean members, boolean pvp, boolean quickChat, boolean lootshare) { + this.worldId = id; + this.address = address; + this.revision = revision; + this.country = country; + this.activity = activity; + this.members = members; + this.pvp = pvp; + this.quickChat = quickChat; + this.lootshare = lootshare; + } + + /** + * Gets the settings hash. + * @return The settings hash. + */ + public int getSettings() { + int settings = 0; + if (members) { + settings |= 0x1; + } + if (quickChat) { + settings |= 0x2; + } + if (pvp) { + settings |= 0x4; + } + if (lootshare) { + settings |= 0x8; + } + return settings; + } + + /** + * @return the worldId + */ + public int getWorldId() { + return worldId; + } + + /** + * @return the address + */ + public String getAddress() { + return address; + } + + /** + * @return the country + */ + public CountryFlag getCountry() { + return country; + } + + /** + * Gets the members value. + * @return The members. + */ + public boolean isMembers() { + return members; + } + + /** + * Gets the activity value. + * @return The activity. + */ + public String getActivity() { + return activity; + } + + /** + * Gets the pvp value. + * @return The pvp. + */ + public boolean isPvp() { + return pvp; + } + + /** + * Gets the quickChat value. + * @return The quickChat. + */ + public boolean isQuickChat() { + return quickChat; + } + + /** + * Gets the lootshare value. + * @return The lootshare. + */ + public boolean isLootshare() { + return lootshare; + } + + /** + * Gets the revision. + * @return the revision. + */ + public int getRevision() { + return revision; + } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..fbdc35276 --- /dev/null +++ b/README.md @@ -0,0 +1,256 @@ +[![License: CC BY-NC-SA 4.0](https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc-sa/4.0/) + +
+

+ + Logo + +

An open source MMORPG emulation server

+ +

Play the live server »

+

+
+
+ Community Hosted Server + · + Discord Invite + · Report Bug + · + Community Website +

+

ATTENTION: Starting October 5th, 2020 the development team will no longer be providing support for setting up your own server. Do not ping or private message Developers asking how to build the project. This in-depth guide will be continually updated if the building process changes. We are focusing all of our efforts on the development of features and bugfixes for the live server.

+

+ + +## Table of Contents + +* [Live Server Information](#live-server-information) +* [About the Project](#about-the-project) +* [Contributing](#contributing) +* [Contributing without Building](#contributing-without-building) +* [Getting Started](#getting-started) + * [Github Setup](#github-setup) + * [Prerequisites](#prerequisites) + * [Prereq Installation](#prereq-installation) +* [Project Setup](#project-setup) +* [Running the project](#running-the-project) +* [License](#license) +* [Contact](#contact) + + +## Live Server Information + +Did you know that the 2009Scape Development Team hosts the main branch of this repo that you can connect to and play? Come join a growing community of people that love to grind out skills, quest, and hangout together. A download link for the launcher can be found here. Connecting to the live server is also one of the easiest ways to identify bugs/typos/missing features. Identifying these issues help developers, whether already on the project, or are even brand new to the project, fix bugs and issues in an expedited rate. + +## About The Project + +The 2009Scape you see today has gone through a magnitude of changes. Originally starting its life as Arios498, this server saw a lot of people playing it daily, unfortunately, it was for profit and closed source. It was later upgraded to Arios530, targeting the build 530 of runescape with content in and around January 1st, 2009. Development came to a halt when a developer of the closed source project released the source code. The original developers of this server went on to create Kratos 530 back in 2015. + +This project was started out of love for the 530 revision. A small group of developers spent hundreds of hours improving on the existing source that was left to the curb. Over the past year, this project has seen many developers coming and going, fixing bugs that they find either through their own server, or bugs that they find in the live game that is currently hosted. We do not accept donations of any kind. The smiles and wonderful compliments are more than enough to keep us going! Content and bugfixes are always number one on our list, and we try our best to answer any questions that you may have, provided you have read through this readme and frequently asked questions on the discord. + +## Contributing + +

Note: A live server that the 2009Scape development team runs is the best way to find and report bugs! Any changes made should be pushed to the Development Branch, Any changes that are pushed to the main branch will be denied, and you will have to submit another PR request. We are currently in the process of rewriting the codebase in Kotlin. Any new commits should be written in Kotlin Only.

+

More information on Kotlin can be found here.

+ +We are always looking for fellow helpers and developers to help preserve history and contribute towards making the most complete emulation server! The beautiful part is you don't even have to download and build the project in order to contribute! Want to make simple edits to NPCs, Items, Music, Shops, Typos? Follow the [Contributing-without-Building](#contributing-without-building) guide below! + +## Contributing without Building + +First create a Github account if you do not have one already. Editing the repository directly is one of the easiest ways to contribute to the project. You will start off in the master/main branch. Switch to the **"Development Branch"** by clicking on the drop down menu which is on the left hand side where it says "Branches" and "Tags". Then navigate to the file you wish to change, for example, All definitions are located in **"Server/data/configs/"**. If you were to edit NPCSpawns.json, you would select NPCSpawns.json, and on the right hand side of the window there will be a screen icon, pencil icon, and trashcan icon. Click on the pencil icon to make changes. When you are finished with your changes, ensure you are in **development** by looking at the branch in the top left. Scroll down until you see "propose changes", and fill out the two info bars at the bottom to describe what you changed/fixed. +
+**More information on repository file editing can be found here.** +
+
+**Editing files that are too large for Github in-browser editing** +
+First follow the [Github-Setup](#github-setup). After you have forked over your copy of the repo, swap over to the **Development branch**, and then download the file that you wish to edit. JSON format can be edited in any notepad program, however it is recommended to use either Atom or Notepad++. After you are finished editing your file, navigate back to the file you wish to replace on your **Development Branch**. Select it and delete it off your branch. Then go back and on the right hand side click on "Add files" and then "Upload new files". Upload the file you are done editing and then submit a Pull request (PR). To submit a PR navigate to "Pull requests" and then click on "New pull request". On the top of the page you should see "Comparing changes". The left set of options is what you will be pushing to and the right side is where you are pushing from. On the right side, put your repo and compare to **Development**, On the left hand side put the repo as 2009scape/2009scape base: **Development**. If at anytime it tries to pull/push into its own repository, click "Compare across forks" and you should be able to select where you want to push to and from. +
+**More information about submitting PR's can be found here.** + + + +## Getting Started + +### Github Setup + +

Note: This allows you to commit changes to the main repo (with approval)! Also, always stay up to date with the most recent updates by pulling into your copy when 2009Scape updates!

+ +1. Create a github account if you haven't done so already + +2. Go to the 2009Scape Github Page + +3. Click "Fork" in the top right hand side of Github + +**If at anytime you have an issue with Github please refer to the** Github help center. + + +### Prerequisites + +

Note: It is required for a developer submitting a PR to use Intellij IDEA as your integrated development environment.

+ +* Intellij IDEA +* Java SE Development Kit Version 1.8 +* Gradle (optional - Installs with Intellij on project build) +* Xampp + +## Prereq Installation + +

Windows

+
+ + +1. Install JDK version 1.8 + * Scroll down until you see Windows x86 and Windows x64 + * If you are running a 64bit verison of Windows (standard), select Windows x64 + * Accept the terms and conditions, after reading them of course, and login to oracle + * Download and install like any normal application + +2. Install Intellij IDEA + * Click "Download" on the main page + * Ensure "Windows" is selected at the top + * Select "Community download" + * Download and install like any normal application + +3. Install Gradle + * Click on "Install Gradle" + * Scroll down to "Installing manually" + * Download "Binary-only" + * Scroll down until you see "Microsoft Windows users" + * Follow the instructions listed on the website + +4. Install Xampp + * Click on "Xampp for Windows" + * Download + * Install as Administrator +
+ +

MacOS

+
+ + +1. Install JDK version 1.8 + * Scroll down until you see macOS x64 + * select macOS x64 + * Accept the terms and conditions, after reading them of course, and login to oracle + * Download and install like any normal mac application + +2. Install Intellij IDEA + * Click "Download" on the main page + * Select "Mac" towards the top of the main page + * Select "Community download" + * Download and install like any normal application + +3. Install Gradle + * Click on "Install Gradle" + * Scroll down to "Installing manually" + * Download "Binary-only" + * Scroll down until you see "Linux & MacOS users" + * Follow the instructions listed on the website + +4. Install Xampp + * Click on "Xampp for OS X" + * Download + * Install as Administrator +
+ +

Linux

+
+ + +1. Install JDK version 1.8 through Oracle or through command line + * Debian, Ubuntu, etc. + ```sh + sudo apt-get install jre8-openjdk + ``` + * Fedora, Oracle Linux, Red Hat Enterprise Linux, etc. + ```sh + su -c "yum install java-1.8.0-openjdk" + ``` + +2. Install Intellij IDEA through Intellij Website or through Command Line + * Debian, Ubuntu, etc. + ```sh + sudo snap install intellij-idea-community --classic + ``` + +3. Install Gradle through the Gradle Website or through Command Line + * Click install Gradle + * If you're installing through Command Line follow : Installing with a package manager + * If you're installing through Download follow : Installing manually : Linux & MacOS users + ```sh + sdk install gradle 6.6.1 + ``` + +4. Install Xampp + * Click install "XAMPP for Linux" + * Install like any normal Linux program +
+ + +### Project Setup + +1. Open Xampp + * On Windows make sure you run Xampp as administrator + * On the left hand side make sure you tick the two "Service" boxes for Apache and MySQL + * For both Apache and MySQL click "Start" under Actions + * After doing that navigate to the PHP My Admin LOCAL SITE + * Once opened, on the left hand side click the three "disks" that say "New" + * In the "Database name" bar type: global + * Press the "Create" button + * A three disk "global" should appear on the left hand side + * Click it and on the top bar select "Import" + * Under **FILE TO IMPORT** click "Browse...." + * Navigate to your 2009Scape project folder + * Go to Server/db_exports/ and import global.sql + * It may take a moment to import, when It is done importing Xampp is all set up! + +2. Open Intellij + * Select Get from Version Control + * Click on "Github", and you will be asked to login + * Change your directory to wherever you want the project to load, or keep it default + * On the right hand side you should see your Github Repository for 2009Scape + * Select it and hit "Clone" + * The project should instantly start building on import. Give it some time because it is going through and compiling alot of files + * In Intellij go to File -> Project Structure -> Project and verify your Project SDK is set to JDK "1.8" + * Setup through Intellij should now be finished! + +### Running the project + +1. Navigate to the right hand side of Intellij where it says "Gradle" + * Gradle is very useful when it comes to running and compiling the project + * The only tabs we are concerned about are "Client", "Management-Server", and "Server" + * Each of these have a "Tasks" folder and an "application" folder +
+2. Click on the "application" folder for the Management-Server and double-click "run" + * The management server is used for things such as player data(not saves), highscores, and world information +
+3. Click on the "application" folder for the Server and double-click "run" + * Please note this may take a minute or two to build, it is compiling a lot of files! + * If you receive an error on server start, check and make sure that your worldprops/default.json is pointing to the correct paths +
+4. Copy your cache from 2009Scape/Server/data/cache (.dat2/.idx0-255) to C:/Users/(your_name)/.runite_rs/runescape/ + * As of the writing of this readme, cache downloading is still broken. It is on the agenda to be fixed in the future + * **If you don't have those folders then create them** + * Server debug mode/other information can be changed in worldprops/default.json +
+5. Click on the "application" folder for the Client and double-click "run" + * If you receive an error on client run open your build.gradle to verify that the mainClassName is set to the correct location + * Due to client work that is on going a lot of files get changed and new paths for the main class are created + * **FIX** In your build.gradle change the mainClassName and Main-Class attributes to 'org.runite.jagex.Client' + * If Gradle run still does not work, launch the Client by navigating to Client/src/main/java/org.runite/jagex/Client + * Right click on the client and select Run 'Client.main()' + * Client debugging options can be found inside of config.json + +### License + +We use the CC BY-NC-SA 4.0 license, which can be found here. Please read and understand the license. Failure to follow the guidelines outlined in the license will result in legal action. If you know or hear of anyone breaking this license, please send a report, with proof, to Red Bracket#8151, ceikry#2724, or woahscam#8535 on discord or email woahscam@hotmail.com. **We WILL NOT change the license to fit your needs.** + +### Contact + +

Reminder: Developer support for setting up your own server ended October 5th, 2020. Do not ping/dm developers about setting up your server.

+ + + +[license-shield]: https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg +[license-url]: https://creativecommons.org/licenses/by-nc-sa/4.0/ diff --git a/Server/.gitignore b/Server/.gitignore new file mode 100644 index 000000000..ad29d7e67 --- /dev/null +++ b/Server/.gitignore @@ -0,0 +1,16 @@ +bin/** +out/** +data/logs/** +data/profile/** +.idea/** +/bin +.DS_Store** +.project** +.classpath** +/bin/ +/out/ +*.iml +*.eml +*.userlibraries +data/players/** +data/eco/offer_dispatch_db.emp diff --git a/Server/License b/Server/License new file mode 100644 index 000000000..be3f7b28e --- /dev/null +++ b/Server/License @@ -0,0 +1,661 @@ + 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 +. diff --git a/Server/build.gradle b/Server/build.gradle new file mode 100644 index 000000000..7299e2ea7 --- /dev/null +++ b/Server/build.gradle @@ -0,0 +1,44 @@ +apply plugin: 'application' + + +archivesBaseName = 'server' + +mainClassName = 'core.Server' + +compileJava { + options.encoding = "UTF-8" +} + +compileKotlin { + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 + freeCompilerArgs = ['-Xjsr305=strict', '-XXLanguage:-NewInference','-Xms2560m','-Xmx4096m', '-XX:MaxPermSize=350m','-XX:ReservedCodeCacheSize=225m','-XX:+UseCompressedOops'] + } +} + +repositories { + maven { url "https://dl.bintray.com/jetbrains/markdown" } +} + +dependencies { + implementation("com.github.ajalt.mordant:mordant:2.0.0-alpha2") + implementation "org.jetbrains:markdown-jvm:0.2.0.pre-55" + implementation 'com.google.guava:guava:29.0-jre' + implementation 'mysql:mysql-connector-java:8.0.21' + implementation 'com.googlecode.json-simple:json-simple:1.1.1' + implementation 'io.github.classgraph:classgraph:4.8.98' + implementation 'org.jetbrains.kotlin:kotlin-reflect' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2' +} + +sourceSets { + main.java.srcDirs = ['src/main/java/Server'] + main.kotlin.srcDirs = ['src/main/java/Server'] +} + +jar { + manifest { + attributes 'Main-Class': 'core.Server' + } + from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } } +} \ No newline at end of file diff --git a/Server/build/classes/java/main/core/Util.class b/Server/build/classes/java/main/core/Util.class new file mode 100644 index 000000000..2f3eb45ba Binary files /dev/null and b/Server/build/classes/java/main/core/Util.class differ diff --git a/Server/build/classes/java/main/core/cache/Cache.class b/Server/build/classes/java/main/core/cache/Cache.class new file mode 100644 index 000000000..83cef070a Binary files /dev/null and b/Server/build/classes/java/main/core/cache/Cache.class differ diff --git a/Server/build/classes/java/main/core/cache/CacheFile.class b/Server/build/classes/java/main/core/cache/CacheFile.class new file mode 100644 index 000000000..5e073ee91 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/CacheFile.class differ diff --git a/Server/build/classes/java/main/core/cache/CacheFileManager.class b/Server/build/classes/java/main/core/cache/CacheFileManager.class new file mode 100644 index 000000000..1c5e17707 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/CacheFileManager.class differ diff --git a/Server/build/classes/java/main/core/cache/ServerStore.class b/Server/build/classes/java/main/core/cache/ServerStore.class new file mode 100644 index 000000000..b1a46d880 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/ServerStore.class differ diff --git a/Server/build/classes/java/main/core/cache/StoreFile.class b/Server/build/classes/java/main/core/cache/StoreFile.class new file mode 100644 index 000000000..e11e94d62 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/StoreFile.class differ diff --git a/Server/build/classes/java/main/core/cache/bzip2/BZip2BlockEntry.class b/Server/build/classes/java/main/core/cache/bzip2/BZip2BlockEntry.class new file mode 100644 index 000000000..f3a4ca97c Binary files /dev/null and b/Server/build/classes/java/main/core/cache/bzip2/BZip2BlockEntry.class differ diff --git a/Server/build/classes/java/main/core/cache/bzip2/BZip2Decompressor.class b/Server/build/classes/java/main/core/cache/bzip2/BZip2Decompressor.class new file mode 100644 index 000000000..002f68662 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/bzip2/BZip2Decompressor.class differ diff --git a/Server/build/classes/java/main/core/cache/crypto/ISAACCipher.class b/Server/build/classes/java/main/core/cache/crypto/ISAACCipher.class new file mode 100644 index 000000000..7ddb510ab Binary files /dev/null and b/Server/build/classes/java/main/core/cache/crypto/ISAACCipher.class differ diff --git a/Server/build/classes/java/main/core/cache/crypto/ISAACPair.class b/Server/build/classes/java/main/core/cache/crypto/ISAACPair.class new file mode 100644 index 000000000..b86a8dba5 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/crypto/ISAACPair.class differ diff --git a/Server/build/classes/java/main/core/cache/crypto/XTEACryption.class b/Server/build/classes/java/main/core/cache/crypto/XTEACryption.class new file mode 100644 index 000000000..4c576de5c Binary files /dev/null and b/Server/build/classes/java/main/core/cache/crypto/XTEACryption.class differ diff --git a/Server/build/classes/java/main/core/cache/def/Definition.class b/Server/build/classes/java/main/core/cache/def/Definition.class new file mode 100644 index 000000000..4bd540d6a Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/Definition.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/AnimationDefinition.class b/Server/build/classes/java/main/core/cache/def/impl/AnimationDefinition.class new file mode 100644 index 000000000..f3a128739 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/AnimationDefinition.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/CS2Mapping.class b/Server/build/classes/java/main/core/cache/def/impl/CS2Mapping.class new file mode 100644 index 000000000..3fd309fc1 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/CS2Mapping.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/ClothDefinition.class b/Server/build/classes/java/main/core/cache/def/impl/ClothDefinition.class new file mode 100644 index 000000000..0d72bc974 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/ClothDefinition.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/GraphicDefinition.class b/Server/build/classes/java/main/core/cache/def/impl/GraphicDefinition.class new file mode 100644 index 000000000..bfdfe48af Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/GraphicDefinition.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/ItemDefinition$1.class b/Server/build/classes/java/main/core/cache/def/impl/ItemDefinition$1.class new file mode 100644 index 000000000..5c4053e12 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/ItemDefinition$1.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/ItemDefinition.class b/Server/build/classes/java/main/core/cache/def/impl/ItemDefinition.class new file mode 100644 index 000000000..be92f5319 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/ItemDefinition.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/NPCDefinition.class b/Server/build/classes/java/main/core/cache/def/impl/NPCDefinition.class new file mode 100644 index 000000000..a693088c8 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/NPCDefinition.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/ObjectDefinition.class b/Server/build/classes/java/main/core/cache/def/impl/ObjectDefinition.class new file mode 100644 index 000000000..fffd075d5 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/ObjectDefinition.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/RenderAnimationDefinition.class b/Server/build/classes/java/main/core/cache/def/impl/RenderAnimationDefinition.class new file mode 100644 index 000000000..3974703be Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/RenderAnimationDefinition.class differ diff --git a/Server/build/classes/java/main/core/cache/def/impl/VarbitDefinition.class b/Server/build/classes/java/main/core/cache/def/impl/VarbitDefinition.class new file mode 100644 index 000000000..0de69db46 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/def/impl/VarbitDefinition.class differ diff --git a/Server/build/classes/java/main/core/cache/gzip/GZipDecompressor.class b/Server/build/classes/java/main/core/cache/gzip/GZipDecompressor.class new file mode 100644 index 000000000..7aa3e40fb Binary files /dev/null and b/Server/build/classes/java/main/core/cache/gzip/GZipDecompressor.class differ diff --git a/Server/build/classes/java/main/core/cache/misc/Container.class b/Server/build/classes/java/main/core/cache/misc/Container.class new file mode 100644 index 000000000..8fe020add Binary files /dev/null and b/Server/build/classes/java/main/core/cache/misc/Container.class differ diff --git a/Server/build/classes/java/main/core/cache/misc/ContainersInformation.class b/Server/build/classes/java/main/core/cache/misc/ContainersInformation.class new file mode 100644 index 000000000..add7577ca Binary files /dev/null and b/Server/build/classes/java/main/core/cache/misc/ContainersInformation.class differ diff --git a/Server/build/classes/java/main/core/cache/misc/FilesContainer.class b/Server/build/classes/java/main/core/cache/misc/FilesContainer.class new file mode 100644 index 000000000..4bad2504a Binary files /dev/null and b/Server/build/classes/java/main/core/cache/misc/FilesContainer.class differ diff --git a/Server/build/classes/java/main/core/cache/misc/buffer/BufferInputStream.class b/Server/build/classes/java/main/core/cache/misc/buffer/BufferInputStream.class new file mode 100644 index 000000000..c9bd05ae0 Binary files /dev/null and b/Server/build/classes/java/main/core/cache/misc/buffer/BufferInputStream.class differ diff --git a/Server/build/classes/java/main/core/cache/misc/buffer/BufferOutputStream.class b/Server/build/classes/java/main/core/cache/misc/buffer/BufferOutputStream.class new file mode 100644 index 000000000..900e4ad5a Binary files /dev/null and b/Server/build/classes/java/main/core/cache/misc/buffer/BufferOutputStream.class differ diff --git a/Server/build/classes/java/main/core/cache/misc/buffer/ByteBufferUtils.class b/Server/build/classes/java/main/core/cache/misc/buffer/ByteBufferUtils.class new file mode 100644 index 000000000..12be9d3ae Binary files /dev/null and b/Server/build/classes/java/main/core/cache/misc/buffer/ByteBufferUtils.class differ diff --git a/Server/build/classes/java/main/core/game/component/AccessMaskBuilder.class b/Server/build/classes/java/main/core/game/component/AccessMaskBuilder.class new file mode 100644 index 000000000..356ed7160 Binary files /dev/null and b/Server/build/classes/java/main/core/game/component/AccessMaskBuilder.class differ diff --git a/Server/build/classes/java/main/core/game/component/CloseEvent.class b/Server/build/classes/java/main/core/game/component/CloseEvent.class new file mode 100644 index 000000000..71da3ee97 Binary files /dev/null and b/Server/build/classes/java/main/core/game/component/CloseEvent.class differ diff --git a/Server/build/classes/java/main/core/game/component/Component$1.class b/Server/build/classes/java/main/core/game/component/Component$1.class new file mode 100644 index 000000000..41130db11 Binary files /dev/null and b/Server/build/classes/java/main/core/game/component/Component$1.class differ diff --git a/Server/build/classes/java/main/core/game/component/Component.class b/Server/build/classes/java/main/core/game/component/Component.class new file mode 100644 index 000000000..361b9ca72 Binary files /dev/null and b/Server/build/classes/java/main/core/game/component/Component.class differ diff --git a/Server/build/classes/java/main/core/game/component/ComponentDefinition.class b/Server/build/classes/java/main/core/game/component/ComponentDefinition.class new file mode 100644 index 000000000..5ef803c7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/component/ComponentDefinition.class differ diff --git a/Server/build/classes/java/main/core/game/component/ComponentPlugin.class b/Server/build/classes/java/main/core/game/component/ComponentPlugin.class new file mode 100644 index 000000000..007a957bc Binary files /dev/null and b/Server/build/classes/java/main/core/game/component/ComponentPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/component/InterfaceType.class b/Server/build/classes/java/main/core/game/component/InterfaceType.class new file mode 100644 index 000000000..b6675294e Binary files /dev/null and b/Server/build/classes/java/main/core/game/component/InterfaceType.class differ diff --git a/Server/build/classes/java/main/core/game/container/Container.class b/Server/build/classes/java/main/core/game/container/Container.class new file mode 100644 index 000000000..acf892537 Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/Container.class differ diff --git a/Server/build/classes/java/main/core/game/container/ContainerEvent.class b/Server/build/classes/java/main/core/game/container/ContainerEvent.class new file mode 100644 index 000000000..16b8e5270 Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/ContainerEvent.class differ diff --git a/Server/build/classes/java/main/core/game/container/ContainerListener.class b/Server/build/classes/java/main/core/game/container/ContainerListener.class new file mode 100644 index 000000000..119f0cae7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/ContainerListener.class differ diff --git a/Server/build/classes/java/main/core/game/container/ContainerType.class b/Server/build/classes/java/main/core/game/container/ContainerType.class new file mode 100644 index 000000000..b42f20cf8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/ContainerType.class differ diff --git a/Server/build/classes/java/main/core/game/container/SortType.class b/Server/build/classes/java/main/core/game/container/SortType.class new file mode 100644 index 000000000..26125cb62 Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/SortType.class differ diff --git a/Server/build/classes/java/main/core/game/container/access/BitregisterAssembler.class b/Server/build/classes/java/main/core/game/container/access/BitregisterAssembler.class new file mode 100644 index 000000000..4a7a8afa4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/access/BitregisterAssembler.class differ diff --git a/Server/build/classes/java/main/core/game/container/access/InterfaceContainer.class b/Server/build/classes/java/main/core/game/container/access/InterfaceContainer.class new file mode 100644 index 000000000..1e3a6c82c Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/access/InterfaceContainer.class differ diff --git a/Server/build/classes/java/main/core/game/container/impl/BankContainer$BankListener.class b/Server/build/classes/java/main/core/game/container/impl/BankContainer$BankListener.class new file mode 100644 index 000000000..3a8ac4ead Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/impl/BankContainer$BankListener.class differ diff --git a/Server/build/classes/java/main/core/game/container/impl/BankContainer.class b/Server/build/classes/java/main/core/game/container/impl/BankContainer.class new file mode 100644 index 000000000..eecb6d310 Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/impl/BankContainer.class differ diff --git a/Server/build/classes/java/main/core/game/container/impl/EquipmentContainer$EquipmentListener.class b/Server/build/classes/java/main/core/game/container/impl/EquipmentContainer$EquipmentListener.class new file mode 100644 index 000000000..c679f5079 Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/impl/EquipmentContainer$EquipmentListener.class differ diff --git a/Server/build/classes/java/main/core/game/container/impl/EquipmentContainer.class b/Server/build/classes/java/main/core/game/container/impl/EquipmentContainer.class new file mode 100644 index 000000000..97800f67c Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/impl/EquipmentContainer.class differ diff --git a/Server/build/classes/java/main/core/game/container/impl/InventoryListener.class b/Server/build/classes/java/main/core/game/container/impl/InventoryListener.class new file mode 100644 index 000000000..cf8792c88 Binary files /dev/null and b/Server/build/classes/java/main/core/game/container/impl/InventoryListener.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/ActivityManager.class b/Server/build/classes/java/main/core/game/content/activity/ActivityManager.class new file mode 100644 index 000000000..75586d4d5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/ActivityManager.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/ActivityPlugin.class b/Server/build/classes/java/main/core/game/content/activity/ActivityPlugin.class new file mode 100644 index 000000000..6995a381c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/ActivityPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/CutscenePlugin$EndPulse.class b/Server/build/classes/java/main/core/game/content/activity/CutscenePlugin$EndPulse.class new file mode 100644 index 000000000..81bdd6554 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/CutscenePlugin$EndPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/CutscenePlugin$StartPulse.class b/Server/build/classes/java/main/core/game/content/activity/CutscenePlugin$StartPulse.class new file mode 100644 index 000000000..26f93c2b3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/CutscenePlugin$StartPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/CutscenePlugin.class b/Server/build/classes/java/main/core/game/content/activity/CutscenePlugin.class new file mode 100644 index 000000000..0bf5f1d7a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/CutscenePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowBrother.class b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowBrother.class new file mode 100644 index 000000000..259b00e54 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowBrother.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsActivityPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsActivityPlugin$1.class new file mode 100644 index 000000000..fc1b8d547 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsActivityPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsActivityPlugin$2.class b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsActivityPlugin$2.class new file mode 100644 index 000000000..8674d9d75 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsActivityPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsActivityPlugin.class b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsActivityPlugin.class new file mode 100644 index 000000000..3694e19a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsActivityPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsCrypt$1.class b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsCrypt$1.class new file mode 100644 index 000000000..01fec30f9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsCrypt$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsCrypt.class b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsCrypt.class new file mode 100644 index 000000000..55a62bf0f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsCrypt.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsPuzzle.class b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsPuzzle.class new file mode 100644 index 000000000..78b570fe2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/barrows/BarrowsPuzzle.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/barrows/TunnelEntranceDialogue.class b/Server/build/classes/java/main/core/game/content/activity/barrows/TunnelEntranceDialogue.class new file mode 100644 index 000000000..5354067e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/barrows/TunnelEntranceDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BHOptionHandler$1.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BHOptionHandler$1.class new file mode 100644 index 000000000..20a7bc097 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BHOptionHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BHOptionHandler.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BHOptionHandler.class new file mode 100644 index 000000000..dab02cbab Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BHOptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BHScoreBoard.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BHScoreBoard.class new file mode 100644 index 000000000..6d5c726a6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BHScoreBoard.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyEntry.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyEntry.class new file mode 100644 index 000000000..d29022ea3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyEntry.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$1.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$1.class new file mode 100644 index 000000000..e03fa92f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$2.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$2.class new file mode 100644 index 000000000..a1131f402 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$3.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$3.class new file mode 100644 index 000000000..613a7504d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$4.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$4.class new file mode 100644 index 000000000..2182ac946 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity.class new file mode 100644 index 000000000..74899cac5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyHunterActivity.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyLocateSpell$1.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyLocateSpell$1.class new file mode 100644 index 000000000..29d0b7445 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyLocateSpell$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyLocateSpell.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyLocateSpell.class new file mode 100644 index 000000000..e034bd5e9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/BountyLocateSpell.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/bountyhunter/CraterType.class b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/CraterType.class new file mode 100644 index 000000000..f77acbf3a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/bountyhunter/CraterType.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/clanwars/CWChallengeOption$1.class b/Server/build/classes/java/main/core/game/content/activity/clanwars/CWChallengeOption$1.class new file mode 100644 index 000000000..02a37b4f6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/clanwars/CWChallengeOption$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/clanwars/CWChallengeOption$2.class b/Server/build/classes/java/main/core/game/content/activity/clanwars/CWChallengeOption$2.class new file mode 100644 index 000000000..2a0599239 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/clanwars/CWChallengeOption$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/clanwars/CWChallengeOption.class b/Server/build/classes/java/main/core/game/content/activity/clanwars/CWChallengeOption.class new file mode 100644 index 000000000..fc7fa0a74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/clanwars/CWChallengeOption.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin$1.class new file mode 100644 index 000000000..89247c254 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin$2$1.class b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin$2$1.class new file mode 100644 index 000000000..d0596ac53 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin$2.class b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin$2.class new file mode 100644 index 000000000..474cc08ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin.class b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin.class new file mode 100644 index 000000000..4958eb2d0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsActivityPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsChallengeRoom.class b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsChallengeRoom.class new file mode 100644 index 000000000..b9c0789f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/clanwars/ClanWarsChallengeRoom.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/ChallengeOptionPlugin.class b/Server/build/classes/java/main/core/game/content/activity/duel/ChallengeOptionPlugin.class new file mode 100644 index 000000000..3943abd82 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/ChallengeOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$1.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$1.class new file mode 100644 index 000000000..9767f6a32 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$2.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$2.class new file mode 100644 index 000000000..748a45739 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$3.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$3.class new file mode 100644 index 000000000..1ded96ae0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$4.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$4.class new file mode 100644 index 000000000..ff1f16561 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$ForfeitTrapdoorPlugin.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$ForfeitTrapdoorPlugin.class new file mode 100644 index 000000000..0d9f7f0f1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea$ForfeitTrapdoorPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea.class new file mode 100644 index 000000000..342330b5f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArea.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelArenaActivity.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArenaActivity.class new file mode 100644 index 000000000..d5b0d537d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelArenaActivity.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelComponentPlugin.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelComponentPlugin.class new file mode 100644 index 000000000..ebefdc9a6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelComponentPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelReqModule.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelReqModule.class new file mode 100644 index 000000000..0f0c4eac7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelReqModule.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelRule.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelRule.class new file mode 100644 index 000000000..5a3c67d9a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelRule.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$1.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$1.class new file mode 100644 index 000000000..3e1fef0c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$2.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$2.class new file mode 100644 index 000000000..f7f6f3980 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$3.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$3.class new file mode 100644 index 000000000..fc5dee7bd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$4.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$4.class new file mode 100644 index 000000000..1d803d79d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$5.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$5.class new file mode 100644 index 000000000..8657d6796 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$6.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$6.class new file mode 100644 index 000000000..7e78911d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$6.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$7.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$7.class new file mode 100644 index 000000000..1df2f878e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession$7.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession.class b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession.class new file mode 100644 index 000000000..d7bfd43c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/DuelSession.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/StakeContainer$StakeListener.class b/Server/build/classes/java/main/core/game/content/activity/duel/StakeContainer$StakeListener.class new file mode 100644 index 000000000..cc01c9aa5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/StakeContainer$StakeListener.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/duel/StakeContainer.class b/Server/build/classes/java/main/core/game/content/activity/duel/StakeContainer.class new file mode 100644 index 000000000..efe6d700e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/duel/StakeContainer.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/fog/FOGActivityPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/fog/FOGActivityPlugin$1.class new file mode 100644 index 000000000..3b58542a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/fog/FOGActivityPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/fog/FOGActivityPlugin.class b/Server/build/classes/java/main/core/game/content/activity/fog/FOGActivityPlugin.class new file mode 100644 index 000000000..a5e4f4105 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/fog/FOGActivityPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/fog/FOGLobbyZone.class b/Server/build/classes/java/main/core/game/content/activity/fog/FOGLobbyZone.class new file mode 100644 index 000000000..78af2c553 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/fog/FOGLobbyZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/fog/FOGPlayer.class b/Server/build/classes/java/main/core/game/content/activity/fog/FOGPlayer.class new file mode 100644 index 000000000..c7966b2de Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/fog/FOGPlayer.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/fog/FOGWaitingZone.class b/Server/build/classes/java/main/core/game/content/activity/fog/FOGWaitingZone.class new file mode 100644 index 000000000..cebc60971 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/fog/FOGWaitingZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GCInformationSign.class b/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GCInformationSign.class new file mode 100644 index 000000000..99c79cd52 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GCInformationSign.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GnomeCopterActivity$1.class b/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GnomeCopterActivity$1.class new file mode 100644 index 000000000..e996b9b1d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GnomeCopterActivity$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GnomeCopterActivity$2.class b/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GnomeCopterActivity$2.class new file mode 100644 index 000000000..d9cb120bd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GnomeCopterActivity$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GnomeCopterActivity.class b/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GnomeCopterActivity.class new file mode 100644 index 000000000..c82eb5853 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gnomecopter/GnomeCopterActivity.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/CraftingGuildPlugin$MasterCrafterDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/CraftingGuildPlugin$MasterCrafterDialogue.class new file mode 100644 index 000000000..2b57d8188 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/CraftingGuildPlugin$MasterCrafterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/CraftingGuildPlugin$TannerDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/CraftingGuildPlugin$TannerDialogue.class new file mode 100644 index 000000000..041ed6bb9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/CraftingGuildPlugin$TannerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/CraftingGuildPlugin.class b/Server/build/classes/java/main/core/game/content/activity/guild/CraftingGuildPlugin.class new file mode 100644 index 000000000..5b57c184c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/CraftingGuildPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/FishingGuild$MasterFisherDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/FishingGuild$MasterFisherDialogue.class new file mode 100644 index 000000000..87910c999 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/FishingGuild$MasterFisherDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/FishingGuild.class b/Server/build/classes/java/main/core/game/content/activity/guild/FishingGuild.class new file mode 100644 index 000000000..e8e852195 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/FishingGuild.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/HeroGuildPlugin$JewelleryRechargePlugin.class b/Server/build/classes/java/main/core/game/content/activity/guild/HeroGuildPlugin$JewelleryRechargePlugin.class new file mode 100644 index 000000000..dd60c4461 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/HeroGuildPlugin$JewelleryRechargePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/HeroGuildPlugin.class b/Server/build/classes/java/main/core/game/content/activity/guild/HeroGuildPlugin.class new file mode 100644 index 000000000..1f93b5df2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/HeroGuildPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/MiningGuildPlugin.class b/Server/build/classes/java/main/core/game/content/activity/guild/MiningGuildPlugin.class new file mode 100644 index 000000000..e37603d89 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/MiningGuildPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$ArcheryCompetitionPulse.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$ArcheryCompetitionPulse.class new file mode 100644 index 000000000..c3ef429dd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$ArcheryCompetitionPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$ArmourSalesman.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$ArmourSalesman.class new file mode 100644 index 000000000..a0ce065e2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$ArmourSalesman.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$BowArrowSalesman.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$BowArrowSalesman.class new file mode 100644 index 000000000..f3f562aa7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$BowArrowSalesman.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$CompetitionJudge.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$CompetitionJudge.class new file mode 100644 index 000000000..49656a531 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$CompetitionJudge.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$GuardDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$GuardDialogue.class new file mode 100644 index 000000000..29435b07b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$GuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$LeatherWorkerDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$LeatherWorkerDialogue.class new file mode 100644 index 000000000..0f84e4b33 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$LeatherWorkerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$RangingGuildDoorman.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$RangingGuildDoorman.class new file mode 100644 index 000000000..06ac643ae Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$RangingGuildDoorman.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$TowerAdvisor.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$TowerAdvisor.class new file mode 100644 index 000000000..3ed2f2125 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$TowerAdvisor.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$TowerArcher.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$TowerArcher.class new file mode 100644 index 000000000..c271a0ca7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$TowerArcher.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$TribalWeaponSalesman.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$TribalWeaponSalesman.class new file mode 100644 index 000000000..046e62825 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$TribalWeaponSalesman.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$WarningInterface.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$WarningInterface.class new file mode 100644 index 000000000..2b92e4678 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin$WarningInterface.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin.class b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin.class new file mode 100644 index 000000000..612b479ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/RangingGuildPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$ProfessorImblewynDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$ProfessorImblewynDialogue.class new file mode 100644 index 000000000..264e75775 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$ProfessorImblewynDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$RobeStoreDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$RobeStoreDialogue.class new file mode 100644 index 000000000..fd9400926 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$RobeStoreDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$WizardDistentorDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$WizardDistentorDialogue.class new file mode 100644 index 000000000..6d4712803 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$WizardDistentorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$WizardFrumsconeDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$WizardFrumsconeDialogue.class new file mode 100644 index 000000000..2b6ff5d21 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$WizardFrumsconeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$ZavisticRarveDialogue.class b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$ZavisticRarveDialogue.class new file mode 100644 index 000000000..642769675 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin$ZavisticRarveDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin.class b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin.class new file mode 100644 index 000000000..b7c7c7047 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/guild/WizardGuildPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GWDGraardorSwingHandler$1.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDGraardorSwingHandler$1.class new file mode 100644 index 000000000..91d9657d1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDGraardorSwingHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GWDGraardorSwingHandler.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDGraardorSwingHandler.class new file mode 100644 index 000000000..83eff3179 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDGraardorSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GWDKreeArraSwingHandler$1.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDKreeArraSwingHandler$1.class new file mode 100644 index 000000000..61b819daa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDKreeArraSwingHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GWDKreeArraSwingHandler.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDKreeArraSwingHandler.class new file mode 100644 index 000000000..44a56e673 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDKreeArraSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GWDTsutsarothSwingHandler$1.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDTsutsarothSwingHandler$1.class new file mode 100644 index 000000000..13198be7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDTsutsarothSwingHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.class new file mode 100644 index 000000000..d16166451 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GWDZilyanaSwingHandler$1.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDZilyanaSwingHandler$1.class new file mode 100644 index 000000000..dad735921 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDZilyanaSwingHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GWDZilyanaSwingHandler.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDZilyanaSwingHandler.class new file mode 100644 index 000000000..4c244ce59 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GWDZilyanaSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsFaction.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsFaction.class new file mode 100644 index 000000000..8baffa0bf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsFaction.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsMinionNPC.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsMinionNPC.class new file mode 100644 index 000000000..41065baec Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsMinionNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsNPC$1.class new file mode 100644 index 000000000..aa303f361 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsNPC.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsNPC.class new file mode 100644 index 000000000..6c9927642 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodWarsNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsBossNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsBossNPC$1.class new file mode 100644 index 000000000..645079fba Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsBossNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsBossNPC$2.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsBossNPC$2.class new file mode 100644 index 000000000..44ff72859 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsBossNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsBossNPC.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsBossNPC.class new file mode 100644 index 000000000..c480c1c5e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsBossNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsEntranceHandler$1.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsEntranceHandler$1.class new file mode 100644 index 000000000..1fe1e623e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsEntranceHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsEntranceHandler$2.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsEntranceHandler$2.class new file mode 100644 index 000000000..88a8f4343 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsEntranceHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsEntranceHandler.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsEntranceHandler.class new file mode 100644 index 000000000..f1534510f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsEntranceHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$1.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$1.class new file mode 100644 index 000000000..223695a72 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$2.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$2.class new file mode 100644 index 000000000..00bef39b1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$3.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$3.class new file mode 100644 index 000000000..19be5b56a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$4$1.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$4$1.class new file mode 100644 index 000000000..f9dd60b8e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$4$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$4.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$4.class new file mode 100644 index 000000000..9a042e6b0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$GodWarsFaction.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$GodWarsFaction.class new file mode 100644 index 000000000..5fe02f6b1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone$GodWarsFaction.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone.class b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone.class new file mode 100644 index 000000000..2920a9553 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/gwd/GodwarsMapzone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/ChamberGuardianDialogue.class b/Server/build/classes/java/main/core/game/content/activity/magearena/ChamberGuardianDialogue.class new file mode 100644 index 000000000..ced1a0d9b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/ChamberGuardianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionDialogue.class b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionDialogue.class new file mode 100644 index 000000000..e61a1ff9a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC$1.class new file mode 100644 index 000000000..c0b0ca862 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC$KolodionType$1.class b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC$KolodionType$1.class new file mode 100644 index 000000000..e87a6f47c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC$KolodionType$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC$KolodionType.class b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC$KolodionType.class new file mode 100644 index 000000000..08fa6697d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC$KolodionType.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC.class b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC.class new file mode 100644 index 000000000..9ca347172 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionSession$1.class b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionSession$1.class new file mode 100644 index 000000000..2a22874f5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionSession$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionSession.class b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionSession.class new file mode 100644 index 000000000..f7c2f370a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/KolodionSession.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/LundailDialogue.class b/Server/build/classes/java/main/core/game/content/activity/magearena/LundailDialogue.class new file mode 100644 index 000000000..15ddfcc15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/LundailDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaNPC.class b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaNPC.class new file mode 100644 index 000000000..c9f765606 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$1.class new file mode 100644 index 000000000..0b0bd7d77 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$2.class b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$2.class new file mode 100644 index 000000000..0d32e22a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$3.class b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$3.class new file mode 100644 index 000000000..4b66181a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$4.class b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$4.class new file mode 100644 index 000000000..41d83acf4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin.class b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin.class new file mode 100644 index 000000000..da017edd9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaZone$1.class b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaZone$1.class new file mode 100644 index 000000000..3dccf0db2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaZone.class b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaZone.class new file mode 100644 index 000000000..3d89a1b65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/magearena/MageArenaZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/AlchemyGuardianDialogue.class b/Server/build/classes/java/main/core/game/content/activity/mta/AlchemyGuardianDialogue.class new file mode 100644 index 000000000..bae1d9504 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/AlchemyGuardianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/AlchemySpell.class b/Server/build/classes/java/main/core/game/content/activity/mta/AlchemySpell.class new file mode 100644 index 000000000..1601b9808 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/AlchemySpell.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/BonesConvertingSpells.class b/Server/build/classes/java/main/core/game/content/activity/mta/BonesConvertingSpells.class new file mode 100644 index 000000000..2a990a85b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/BonesConvertingSpells.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/CharmedWarriorDialogue.class b/Server/build/classes/java/main/core/game/content/activity/mta/CharmedWarriorDialogue.class new file mode 100644 index 000000000..ef19180db Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/CharmedWarriorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/EnchantmentGuardianDialogue.class b/Server/build/classes/java/main/core/game/content/activity/mta/EnchantmentGuardianDialogue.class new file mode 100644 index 000000000..d630dc5bd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/EnchantmentGuardianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/EntranceGuardianDialogue.class b/Server/build/classes/java/main/core/game/content/activity/mta/EntranceGuardianDialogue.class new file mode 100644 index 000000000..350467bb8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/EntranceGuardianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/GraveyardGuardianDialogue.class b/Server/build/classes/java/main/core/game/content/activity/mta/GraveyardGuardianDialogue.class new file mode 100644 index 000000000..c266e27e4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/GraveyardGuardianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$1.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$1.class new file mode 100644 index 000000000..711f59074 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$2.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$2.class new file mode 100644 index 000000000..d3a5ba99f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$3.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$3.class new file mode 100644 index 000000000..7fdd60eaa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$MTAShopPlugin.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$MTAShopPlugin.class new file mode 100644 index 000000000..8c9226342 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop$MTAShopPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop.class new file mode 100644 index 000000000..9b2e00382 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAShop.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$1.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$1.class new file mode 100644 index 000000000..86d79d190 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$2.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$2.class new file mode 100644 index 000000000..01def82bb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$3.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$3.class new file mode 100644 index 000000000..b3332465c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$4.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$4.class new file mode 100644 index 000000000..8d531f000 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAType.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType.class new file mode 100644 index 000000000..53b51589c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAType.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MTAZone.class b/Server/build/classes/java/main/core/game/content/activity/mta/MTAZone.class new file mode 100644 index 000000000..d87bb9e9b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MTAZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MageTrainingArenaPlugin.class b/Server/build/classes/java/main/core/game/content/activity/mta/MageTrainingArenaPlugin.class new file mode 100644 index 000000000..0abf30e25 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MageTrainingArenaPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/MazeGuardianDialogue.class b/Server/build/classes/java/main/core/game/content/activity/mta/MazeGuardianDialogue.class new file mode 100644 index 000000000..005173d95 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/MazeGuardianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/ProgressHatDialogue.class b/Server/build/classes/java/main/core/game/content/activity/mta/ProgressHatDialogue.class new file mode 100644 index 000000000..af8375bc1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/ProgressHatDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/RewardsGuardianDialogue.class b/Server/build/classes/java/main/core/game/content/activity/mta/RewardsGuardianDialogue.class new file mode 100644 index 000000000..d350bc399 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/RewardsGuardianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/TelekineticGrabSpell$1.class b/Server/build/classes/java/main/core/game/content/activity/mta/TelekineticGrabSpell$1.class new file mode 100644 index 000000000..55dec7840 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/TelekineticGrabSpell$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/TelekineticGrabSpell.class b/Server/build/classes/java/main/core/game/content/activity/mta/TelekineticGrabSpell.class new file mode 100644 index 000000000..32d831a0f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/TelekineticGrabSpell.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/TelekineticGuardianDialogue.class b/Server/build/classes/java/main/core/game/content/activity/mta/TelekineticGuardianDialogue.class new file mode 100644 index 000000000..6443bbfb3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/TelekineticGuardianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone$1.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone$1.class new file mode 100644 index 000000000..d40e1a2e4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone$AlchemistItem.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone$AlchemistItem.class new file mode 100644 index 000000000..d8757a5b6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone$AlchemistItem.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone$AlchemistSession.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone$AlchemistSession.class new file mode 100644 index 000000000..8252a89ce Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone$AlchemistSession.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone.class new file mode 100644 index 000000000..4c8a4f9e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/AlchemistZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$1.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$1.class new file mode 100644 index 000000000..5b8335086 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$2.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$2.class new file mode 100644 index 000000000..7169ee310 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$3.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$3.class new file mode 100644 index 000000000..6d1719d8e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$Shapes.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$Shapes.class new file mode 100644 index 000000000..1bc236bf8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone$Shapes.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone.class new file mode 100644 index 000000000..2d82fd75d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/EnchantingZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/GraveyardZone$1.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/GraveyardZone$1.class new file mode 100644 index 000000000..8f9bc3dc4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/GraveyardZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/GraveyardZone$BoneType.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/GraveyardZone$BoneType.class new file mode 100644 index 000000000..088be6210 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/GraveyardZone$BoneType.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/GraveyardZone.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/GraveyardZone.class new file mode 100644 index 000000000..6a36c19f1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/GraveyardZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$1.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$1.class new file mode 100644 index 000000000..57a1c00ac Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$2.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$2.class new file mode 100644 index 000000000..56df1066e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$3.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$3.class new file mode 100644 index 000000000..bc7ab58b1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$Maze.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$Maze.class new file mode 100644 index 000000000..cb01d0150 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone$Maze.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone.class b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone.class new file mode 100644 index 000000000..ad969a25c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/mta/impl/TelekineticZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$1.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$1.class new file mode 100644 index 000000000..1780da894 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$2.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$2.class new file mode 100644 index 000000000..c3f056ae2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$PartyBalloon$1.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$PartyBalloon$1.class new file mode 100644 index 000000000..35a36f50e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$PartyBalloon$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$PartyBalloon.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$PartyBalloon.class new file mode 100644 index 000000000..9f788cde7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager$PartyBalloon.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager.class new file mode 100644 index 000000000..3c8f57a4c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/BalloonManager.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer$ChestCloseEvent.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer$ChestCloseEvent.class new file mode 100644 index 000000000..72bed3d12 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer$ChestCloseEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer$DepositContainer$PartyDepositListener.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer$DepositContainer$PartyDepositListener.class new file mode 100644 index 000000000..e922e5f98 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer$DepositContainer$PartyDepositListener.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer$DepositContainer.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer$DepositContainer.class new file mode 100644 index 000000000..4d53b0198 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer$DepositContainer.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer.class new file mode 100644 index 000000000..cd02cf95f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/ChestViewer.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$1.class new file mode 100644 index 000000000..367ee5257 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$2.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$2.class new file mode 100644 index 000000000..19436fff2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$DepositInterfaceHandler$1.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$DepositInterfaceHandler$1.class new file mode 100644 index 000000000..f9b1fb563 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$DepositInterfaceHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$DepositInterfaceHandler$2.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$DepositInterfaceHandler$2.class new file mode 100644 index 000000000..338546146 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$DepositInterfaceHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$DepositInterfaceHandler.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$DepositInterfaceHandler.class new file mode 100644 index 000000000..0eb36aaa3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin$DepositInterfaceHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin.class b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin.class new file mode 100644 index 000000000..23e2fe3ce Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/partyroom/PartyRoomPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCIslandZone.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCIslandZone.class new file mode 100644 index 000000000..da34b6a60 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCIslandZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCLanderZone.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCLanderZone.class new file mode 100644 index 000000000..616d110a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCLanderZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCObjectHandler.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCObjectHandler.class new file mode 100644 index 000000000..b466aef5b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCObjectHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCPortalNPC.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCPortalNPC.class new file mode 100644 index 000000000..ac738e2a7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCPortalNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCSquireNPC.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCSquireNPC.class new file mode 100644 index 000000000..47c799206 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PCSquireNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$1.class new file mode 100644 index 000000000..16559d518 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$2.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$2.class new file mode 100644 index 000000000..57108ae6d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$3.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$3.class new file mode 100644 index 000000000..8d2a48837 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$BoatType.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$BoatType.class new file mode 100644 index 000000000..a4e32ddf0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin$BoatType.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin.class new file mode 100644 index 000000000..87d4ea0f5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlActivityPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlSession.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlSession.class new file mode 100644 index 000000000..c33296450 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlSession.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlSquire.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlSquire.class new file mode 100644 index 000000000..17b0490d4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/PestControlSquire.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/VoidSealPlugin.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/VoidSealPlugin.class new file mode 100644 index 000000000..35cf06ccd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/VoidSealPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCDefilerNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCDefilerNPC$1.class new file mode 100644 index 000000000..50f790595 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCDefilerNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCDefilerNPC.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCDefilerNPC.class new file mode 100644 index 000000000..d8e341400 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCDefilerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC$1.class new file mode 100644 index 000000000..ec16d0b44 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC$2.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC$2.class new file mode 100644 index 000000000..6e12ed935 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.class new file mode 100644 index 000000000..bc6b9046d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCShifterNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCShifterNPC$1.class new file mode 100644 index 000000000..dc5a09651 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCShifterNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCShifterNPC$2.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCShifterNPC$2.class new file mode 100644 index 000000000..5228519c9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCShifterNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCShifterNPC.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCShifterNPC.class new file mode 100644 index 000000000..0c2f79886 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCShifterNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC$1.class new file mode 100644 index 000000000..8f98ceb65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC$2.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC$2.class new file mode 100644 index 000000000..a21fbcc72 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.class new file mode 100644 index 000000000..d2d5668d2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSplatterNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSplatterNPC$1.class new file mode 100644 index 000000000..58e6d7176 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSplatterNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSplatterNPC.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSplatterNPC.class new file mode 100644 index 000000000..51bd9cf3a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCSplatterNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCTorcherNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCTorcherNPC$1.class new file mode 100644 index 000000000..26854f570 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCTorcherNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCTorcherNPC.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCTorcherNPC.class new file mode 100644 index 000000000..f1f920749 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/PCTorcherNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/TorcherSpell.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/TorcherSpell.class new file mode 100644 index 000000000..104dd219b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/monsters/TorcherSpell.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.class new file mode 100644 index 000000000..cdaef9b45 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$1.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$1.class new file mode 100644 index 000000000..8ad09647e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$1.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$1.class new file mode 100644 index 000000000..0003c4947 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$10.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$10.class new file mode 100644 index 000000000..b677a62d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$10.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$2.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$2.class new file mode 100644 index 000000000..26a143c5a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$3.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$3.class new file mode 100644 index 000000000..919f9b074 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$4.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$4.class new file mode 100644 index 000000000..303f3ce41 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$5.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$5.class new file mode 100644 index 000000000..e286f771b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$6.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$6.class new file mode 100644 index 000000000..e2bded51f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$6.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$7.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$7.class new file mode 100644 index 000000000..68e2544e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$7.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$8.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$8.class new file mode 100644 index 000000000..713554673 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$8.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$9.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$9.class new file mode 100644 index 000000000..aa692e2a0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward$9.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward.class new file mode 100644 index 000000000..314af386c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface$Reward.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface.class new file mode 100644 index 000000000..817912ee6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/PCRewardInterface.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/VoidKnightDialogue.class b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/VoidKnightDialogue.class new file mode 100644 index 000000000..a6189eef1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pestcontrol/reward/VoidKnightDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$1.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$1.class new file mode 100644 index 000000000..d3438f740 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$ElnockExchangeInterfaceHandler$ElnockExchange$1.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$ElnockExchangeInterfaceHandler$ElnockExchange$1.class new file mode 100644 index 000000000..b5cd9eb35 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$ElnockExchangeInterfaceHandler$ElnockExchange$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$ElnockExchangeInterfaceHandler$ElnockExchange.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$ElnockExchangeInterfaceHandler$ElnockExchange.class new file mode 100644 index 000000000..436f00ceb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$ElnockExchangeInterfaceHandler$ElnockExchange.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$ElnockExchangeInterfaceHandler.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$ElnockExchangeInterfaceHandler.class new file mode 100644 index 000000000..470c20e8d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue$ElnockExchangeInterfaceHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue.class new file mode 100644 index 000000000..e80cc7e2c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/ElnockInquisitorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/FairyAerykaDialogue.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/FairyAerykaDialogue.class new file mode 100644 index 000000000..c2a7ed462 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/FairyAerykaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/ImpDefenderNPC.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/ImpDefenderNPC.class new file mode 100644 index 000000000..05e1bae3f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/ImpDefenderNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$1.class new file mode 100644 index 000000000..c60c7cddb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$2.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$2.class new file mode 100644 index 000000000..702423ce4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$PuroOptionHandler.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$PuroOptionHandler.class new file mode 100644 index 000000000..a00631ee4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$PuroOptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$WheatSet.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$WheatSet.class new file mode 100644 index 000000000..a1fdfd216 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin$WheatSet.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin.class new file mode 100644 index 000000000..0a7723d41 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/PuroPuroPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/puropuro/WanderingImplingDialogue.class b/Server/build/classes/java/main/core/game/content/activity/puropuro/WanderingImplingDialogue.class new file mode 100644 index 000000000..f7cd5bae6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/puropuro/WanderingImplingDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/GuardMummyDialogue.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/GuardMummyDialogue.class new file mode 100644 index 000000000..099f3f4fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/GuardMummyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderObject.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderObject.class new file mode 100644 index 000000000..905b72ebc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderObject.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderObjectManager.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderObjectManager.class new file mode 100644 index 000000000..c22d96f22 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderObjectManager.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderZones$PlunderZone.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderZones$PlunderZone.class new file mode 100644 index 000000000..135a8aa07 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderZones$PlunderZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderZones.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderZones.class new file mode 100644 index 000000000..41bf091f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PlunderZones.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidOptionHandler$1.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidOptionHandler$1.class new file mode 100644 index 000000000..98773d0de Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidOptionHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidOptionHandler.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidOptionHandler.class new file mode 100644 index 000000000..e1345271c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidOptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.class new file mode 100644 index 000000000..04cfe72d1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderMummyNPC.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderMummyNPC.class new file mode 100644 index 000000000..62c4a34f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderMummyNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderNPC$1.class new file mode 100644 index 000000000..c051821ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.class new file mode 100644 index 000000000..45809698c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderRoom.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderRoom.class new file mode 100644 index 000000000..fe2bc9f98 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderRoom.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderSwarmNPC.class b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderSwarmNPC.class new file mode 100644 index 000000000..f1b940538 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/pyramidplunder/PyramidPlunderSwarmNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/BoxOfHealthDialogue.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/BoxOfHealthDialogue.class new file mode 100644 index 000000000..90fc01e37 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/BoxOfHealthDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/CradleOfLifeDialogue.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/CradleOfLifeDialogue.class new file mode 100644 index 000000000..a286a13a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/CradleOfLifeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/GiftOfPeaceDialogue.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/GiftOfPeaceDialogue.class new file mode 100644 index 000000000..4f6b50bef Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/GiftOfPeaceDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/GrainOfPlentyDialogue.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/GrainOfPlentyDialogue.class new file mode 100644 index 000000000..be8a0296f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/GrainOfPlentyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$1.class new file mode 100644 index 000000000..c557ab76a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$2.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$2.class new file mode 100644 index 000000000..17d5ae9e4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$ExplorerDialogue.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$ExplorerDialogue.class new file mode 100644 index 000000000..9ce199404 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$ExplorerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$StrongholdComponentPlugin.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$StrongholdComponentPlugin.class new file mode 100644 index 000000000..0075db4e2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$StrongholdComponentPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$StrongholdDialogue.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$StrongholdDialogue.class new file mode 100644 index 000000000..e67af82a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin$StrongholdDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.class new file mode 100644 index 000000000..00b81e6f1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/GuardDialoguePlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/GuardDialoguePlugin$1.class new file mode 100644 index 000000000..95443a1c4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/GuardDialoguePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/GuardDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/GuardDialoguePlugin.class new file mode 100644 index 000000000..0ab10b3bf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/GuardDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PSOptionHandler$1.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PSOptionHandler$1.class new file mode 100644 index 000000000..ad2cecf71 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PSOptionHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PSOptionHandler.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PSOptionHandler.class new file mode 100644 index 000000000..972aab2b3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PSOptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$1.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$1.class new file mode 100644 index 000000000..0d7c15db1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$1.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$1.class new file mode 100644 index 000000000..1e77ab066 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$2.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$2.class new file mode 100644 index 000000000..aa148da3f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$3.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$3.class new file mode 100644 index 000000000..b7dc22257 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$4.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$4.class new file mode 100644 index 000000000..81ae75cc7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$5.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$5.class new file mode 100644 index 000000000..275e86ccf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$6.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$6.class new file mode 100644 index 000000000..09a201e94 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$6.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$7.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$7.class new file mode 100644 index 000000000..a23bc1edb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions$7.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions.class new file mode 100644 index 000000000..a4099d7cd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest$TestQuestions.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest.class new file mode 100644 index 000000000..7e625e018 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/ProfessorHenryDialogue.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/ProfessorHenryDialogue.class new file mode 100644 index 000000000..36f651a01 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/ProfessorHenryDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/SafetyMapZone.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/SafetyMapZone.class new file mode 100644 index 000000000..1c69c48b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/SafetyMapZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin$JailPlaques$1.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin$JailPlaques$1.class new file mode 100644 index 000000000..9a72b08b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin$JailPlaques$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin$JailPlaques$2.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin$JailPlaques$2.class new file mode 100644 index 000000000..04e10cb49 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin$JailPlaques$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin$JailPlaques.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin$JailPlaques.class new file mode 100644 index 000000000..34db9ba60 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin$JailPlaques.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.class b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.class new file mode 100644 index 000000000..59aa745d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC$1.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC$1.class new file mode 100644 index 000000000..70f7cf66e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC$2.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC$2.class new file mode 100644 index 000000000..072f2e93a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC$CombatAction.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC$CombatAction.class new file mode 100644 index 000000000..16eec644b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC$CombatAction.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.class new file mode 100644 index 000000000..13ae3ff42 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin$1.class new file mode 100644 index 000000000..b12d2607d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin$2.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin$2.class new file mode 100644 index 000000000..711a3bd53 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin$3.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin$3.class new file mode 100644 index 000000000..a3a1382f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.class new file mode 100644 index 000000000..dd0f2a8a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin$1.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin$1.class new file mode 100644 index 000000000..2c210c0dd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin$2.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin$2.class new file mode 100644 index 000000000..11167656e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin.class b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin.class new file mode 100644 index 000000000..243c25f0e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/WarriorsGuild$ClaimTokenDialogue.class b/Server/build/classes/java/main/core/game/content/activity/wguild/WarriorsGuild$ClaimTokenDialogue.class new file mode 100644 index 000000000..2b227438f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/WarriorsGuild$ClaimTokenDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/WarriorsGuild.class b/Server/build/classes/java/main/core/game/content/activity/wguild/WarriorsGuild.class new file mode 100644 index 000000000..0b40c0206 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/WarriorsGuild.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimatedArmour.class b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimatedArmour.class new file mode 100644 index 000000000..70ba30d0f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimatedArmour.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom$1.class b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom$1.class new file mode 100644 index 000000000..4efa97f53 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom$2.class b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom$2.class new file mode 100644 index 000000000..6292a0986 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom$ArmourSet.class b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom$ArmourSet.class new file mode 100644 index 000000000..fb1ab57c2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom$ArmourSet.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom.class b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom.class new file mode 100644 index 000000000..b8395f100 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/animator/AnimationRoom.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom$1.class b/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom$1.class new file mode 100644 index 000000000..88091cca4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom$2$1.class b/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom$2$1.class new file mode 100644 index 000000000..2dd2ae337 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom$2.class b/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom$2.class new file mode 100644 index 000000000..88585e590 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom.class b/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom.class new file mode 100644 index 000000000..723a06831 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/barrel/BarrelRoom.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$1$1.class b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$1$1.class new file mode 100644 index 000000000..9f0963a9d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$1.class b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$1.class new file mode 100644 index 000000000..64d80e5f9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$2.class b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$2.class new file mode 100644 index 000000000..a3fffdb6e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$3.class b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$3.class new file mode 100644 index 000000000..054f3d950 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$CatapultAttack.class b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$CatapultAttack.class new file mode 100644 index 000000000..076c6dc1c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom$CatapultAttack.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom.class b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom.class new file mode 100644 index 000000000..0bcd4d174 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/catapult/CatapultRoom.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom$1.class b/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom$1.class new file mode 100644 index 000000000..6619c3a30 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom$2.class b/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom$2.class new file mode 100644 index 000000000..39c20eb13 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom$KamfreenaDial.class b/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom$KamfreenaDial.class new file mode 100644 index 000000000..3f2c56839 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom$KamfreenaDial.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom.class b/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom.class new file mode 100644 index 000000000..10deb0099 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/cyclopes/CyclopesRoom.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/dummy/DummyRoom$1.class b/Server/build/classes/java/main/core/game/content/activity/wguild/dummy/DummyRoom$1.class new file mode 100644 index 000000000..c0fe6c10f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/dummy/DummyRoom$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/dummy/DummyRoom$Dummy.class b/Server/build/classes/java/main/core/game/content/activity/wguild/dummy/DummyRoom$Dummy.class new file mode 100644 index 000000000..5c4b3d5d5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/dummy/DummyRoom$Dummy.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/dummy/DummyRoom.class b/Server/build/classes/java/main/core/game/content/activity/wguild/dummy/DummyRoom.class new file mode 100644 index 000000000..e018e3fc1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/dummy/DummyRoom.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom$1$1.class b/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom$1$1.class new file mode 100644 index 000000000..5ee387193 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom$1.class b/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom$1.class new file mode 100644 index 000000000..de8430069 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom$2.class b/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom$2.class new file mode 100644 index 000000000..faa40fa43 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom.class b/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom.class new file mode 100644 index 000000000..bd888a4fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/activity/wguild/shot/ShotPutRoom.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/AntiMacroDialogue$1.class b/Server/build/classes/java/main/core/game/content/ame/AntiMacroDialogue$1.class new file mode 100644 index 000000000..e295348c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/AntiMacroDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/AntiMacroDialogue.class b/Server/build/classes/java/main/core/game/content/ame/AntiMacroDialogue.class new file mode 100644 index 000000000..d2d91a412 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/AntiMacroDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/AntiMacroEvent.class b/Server/build/classes/java/main/core/game/content/ame/AntiMacroEvent.class new file mode 100644 index 000000000..a3c1a606f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/AntiMacroEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/AntiMacroHandler.class b/Server/build/classes/java/main/core/game/content/ame/AntiMacroHandler.class new file mode 100644 index 000000000..e891b3604 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/AntiMacroHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/AntiMacroNPC$1.class b/Server/build/classes/java/main/core/game/content/ame/AntiMacroNPC$1.class new file mode 100644 index 000000000..3ba685001 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/AntiMacroNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/AntiMacroNPC$2.class b/Server/build/classes/java/main/core/game/content/ame/AntiMacroNPC$2.class new file mode 100644 index 000000000..3d3a0c154 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/AntiMacroNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/AntiMacroNPC.class b/Server/build/classes/java/main/core/game/content/ame/AntiMacroNPC.class new file mode 100644 index 000000000..8eeed1702 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/AntiMacroNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/ExperienceMonitor.class b/Server/build/classes/java/main/core/game/content/ame/ExperienceMonitor.class new file mode 100644 index 000000000..3d8ad8c96 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/ExperienceMonitor.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/drilldemon/DrillDemonEvent$1.class b/Server/build/classes/java/main/core/game/content/ame/events/drilldemon/DrillDemonEvent$1.class new file mode 100644 index 000000000..5085faada Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/drilldemon/DrillDemonEvent$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/drilldemon/DrillDemonEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/drilldemon/DrillDemonEvent.class new file mode 100644 index 000000000..e8a0e2df1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/drilldemon/DrillDemonEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/drilldemon/SergeantDamienNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/drilldemon/SergeantDamienNPC.class new file mode 100644 index 000000000..c78e5d1a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/drilldemon/SergeantDamienNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/drunkdwarf/DrunkDwarfEvent$DrunkDwarfDialogue.class b/Server/build/classes/java/main/core/game/content/ame/events/drunkdwarf/DrunkDwarfEvent$DrunkDwarfDialogue.class new file mode 100644 index 000000000..2f3d8bd7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/drunkdwarf/DrunkDwarfEvent$DrunkDwarfDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/drunkdwarf/DrunkDwarfEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/drunkdwarf/DrunkDwarfEvent.class new file mode 100644 index 000000000..3f0f1ccd8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/drunkdwarf/DrunkDwarfEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/drunkdwarf/DrunkenDwarfNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/drunkdwarf/DrunkenDwarfNPC.class new file mode 100644 index 000000000..389bb0e4f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/drunkdwarf/DrunkenDwarfNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/evilchicken/EvilChickenNPC$1.class b/Server/build/classes/java/main/core/game/content/ame/events/evilchicken/EvilChickenNPC$1.class new file mode 100644 index 000000000..633e81e60 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/evilchicken/EvilChickenNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/evilchicken/EvilChickenNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/evilchicken/EvilChickenNPC.class new file mode 100644 index 000000000..8488aa43f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/evilchicken/EvilChickenNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/evilchicken/EvilChickenRandomEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/evilchicken/EvilChickenRandomEvent.class new file mode 100644 index 000000000..52804fec0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/evilchicken/EvilChickenRandomEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$1.class b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$1.class new file mode 100644 index 000000000..81b1ae20c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$2.class b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$2.class new file mode 100644 index 000000000..2c0d9b24a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$3.class b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$3.class new file mode 100644 index 000000000..b9e976c06 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$4.class b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$4.class new file mode 100644 index 000000000..bef9ab3cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent.class new file mode 100644 index 000000000..b05860637 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/MollyDialogue.class b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/MollyDialogue.class new file mode 100644 index 000000000..52aa90bd5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/MollyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/TwinClothColor.class b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/TwinClothColor.class new file mode 100644 index 000000000..5a818f7a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/eviltwin/TwinClothColor.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/genie/GenieNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/genie/GenieNPC.class new file mode 100644 index 000000000..4e99a713d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/genie/GenieNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/genie/GenieRandomEvent$GenieDialogue.class b/Server/build/classes/java/main/core/game/content/ame/events/genie/GenieRandomEvent$GenieDialogue.class new file mode 100644 index 000000000..734f9e4f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/genie/GenieRandomEvent$GenieDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/genie/GenieRandomEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/genie/GenieRandomEvent.class new file mode 100644 index 000000000..f3e40693b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/genie/GenieRandomEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/lostandfound/LostFoundRandomEvent$1$1.class b/Server/build/classes/java/main/core/game/content/ame/events/lostandfound/LostFoundRandomEvent$1$1.class new file mode 100644 index 000000000..da4cdd222 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/lostandfound/LostFoundRandomEvent$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/lostandfound/LostFoundRandomEvent$1.class b/Server/build/classes/java/main/core/game/content/ame/events/lostandfound/LostFoundRandomEvent$1.class new file mode 100644 index 000000000..8b6daf9df Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/lostandfound/LostFoundRandomEvent$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/lostandfound/LostFoundRandomEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/lostandfound/LostFoundRandomEvent.class new file mode 100644 index 000000000..a9b00ed1c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/lostandfound/LostFoundRandomEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/lostpirate/CapnHandEvent$CapnHandDialogue.class b/Server/build/classes/java/main/core/game/content/ame/events/lostpirate/CapnHandEvent$CapnHandDialogue.class new file mode 100644 index 000000000..fc04e2c67 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/lostpirate/CapnHandEvent$CapnHandDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/lostpirate/CapnHandEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/lostpirate/CapnHandEvent.class new file mode 100644 index 000000000..9bbfbb170 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/lostpirate/CapnHandEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/lostpirate/CapnHandNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/lostpirate/CapnHandNPC.class new file mode 100644 index 000000000..087a900ff Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/lostpirate/CapnHandNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterDialogue$QuizSet.class b/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterDialogue$QuizSet.class new file mode 100644 index 000000000..aa58e3179 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterDialogue$QuizSet.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterDialogue.class b/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterDialogue.class new file mode 100644 index 000000000..1237559a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterEvent.class new file mode 100644 index 000000000..23f991773 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterNPC.class new file mode 100644 index 000000000..2ae420088 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/quizmaster/QuizMasterNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineEvent$RickTurpentineDialogue.class b/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineEvent$RickTurpentineDialogue.class new file mode 100644 index 000000000..e31230471 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineEvent$RickTurpentineDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineEvent.class new file mode 100644 index 000000000..73c39fece Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineNPC$1.class b/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineNPC$1.class new file mode 100644 index 000000000..846152afd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineNPC.class new file mode 100644 index 000000000..63262603f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/rickturpentine/RickTurpentineNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/rivertroll/RiverTrollEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/rivertroll/RiverTrollEvent.class new file mode 100644 index 000000000..5476926d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/rivertroll/RiverTrollEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/rivertroll/RiverTrollNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/rivertroll/RiverTrollNPC.class new file mode 100644 index 000000000..96ea1c801 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/rivertroll/RiverTrollNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/shade/ShadeEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/shade/ShadeEvent.class new file mode 100644 index 000000000..31cb708d1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/shade/ShadeEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/shade/ShadeNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/shade/ShadeNPC.class new file mode 100644 index 000000000..bb7ce9539 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/shade/ShadeNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/treespirit/TreeSpiritEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/treespirit/TreeSpiritEvent.class new file mode 100644 index 000000000..f7c4327d8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/treespirit/TreeSpiritEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/treespirit/TreeSpiritRandomNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/treespirit/TreeSpiritRandomNPC.class new file mode 100644 index 000000000..98ed4a007 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/treespirit/TreeSpiritRandomNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/zombie/ZombieAmeNPC.class b/Server/build/classes/java/main/core/game/content/ame/events/zombie/ZombieAmeNPC.class new file mode 100644 index 000000000..953436225 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/zombie/ZombieAmeNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ame/events/zombie/ZombieEvent.class b/Server/build/classes/java/main/core/game/content/ame/events/zombie/ZombieEvent.class new file mode 100644 index 000000000..6593dd61d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ame/events/zombie/ZombieEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/BarbarianMix.class b/Server/build/classes/java/main/core/game/content/consumable/BarbarianMix.class new file mode 100644 index 000000000..b03075900 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/BarbarianMix.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/Cake.class b/Server/build/classes/java/main/core/game/content/consumable/Cake.class new file mode 100644 index 000000000..9dd51899d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/Cake.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/Consumable.class b/Server/build/classes/java/main/core/game/content/consumable/Consumable.class new file mode 100644 index 000000000..afe090e9e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/Consumable.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/ConsumableEffect.class b/Server/build/classes/java/main/core/game/content/consumable/ConsumableEffect.class new file mode 100644 index 000000000..a980791af Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/ConsumableEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/Consumables.class b/Server/build/classes/java/main/core/game/content/consumable/Consumables.class new file mode 100644 index 000000000..597d03f1f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/Consumables.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/Drink.class b/Server/build/classes/java/main/core/game/content/consumable/Drink.class new file mode 100644 index 000000000..0ea143ff5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/Drink.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/FakeConsumable.class b/Server/build/classes/java/main/core/game/content/consumable/FakeConsumable.class new file mode 100644 index 000000000..03ac995d5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/FakeConsumable.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/Food.class b/Server/build/classes/java/main/core/game/content/consumable/Food.class new file mode 100644 index 000000000..5b96f7286 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/Food.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/HalfableFood.class b/Server/build/classes/java/main/core/game/content/consumable/HalfableFood.class new file mode 100644 index 000000000..632f8b6dc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/HalfableFood.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/Potion.class b/Server/build/classes/java/main/core/game/content/consumable/Potion.class new file mode 100644 index 000000000..2848940aa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/Potion.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/AchievementEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/AchievementEffect.class new file mode 100644 index 000000000..62e5a760b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/AchievementEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/DamageEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/DamageEffect.class new file mode 100644 index 000000000..9455aaa35 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/DamageEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/DraynorCabbageEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/DraynorCabbageEffect.class new file mode 100644 index 000000000..2e4bd05de Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/DraynorCabbageEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/DwarvenRockCakeEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/DwarvenRockCakeEffect.class new file mode 100644 index 000000000..f1c5f965f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/DwarvenRockCakeEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/EnergyEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/EnergyEffect.class new file mode 100644 index 000000000..1db6ab110 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/EnergyEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/HealingEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/HealingEffect.class new file mode 100644 index 000000000..d8fca02a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/HealingEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/KebabEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/KebabEffect.class new file mode 100644 index 000000000..147267ff3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/KebabEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/KegOfBeerEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/KegOfBeerEffect.class new file mode 100644 index 000000000..6bb8f7fc2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/KegOfBeerEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/MatureWmbEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/MatureWmbEffect.class new file mode 100644 index 000000000..8834eec05 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/MatureWmbEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/MultiEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/MultiEffect.class new file mode 100644 index 000000000..edca22442 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/MultiEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/NettleTeaEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/NettleTeaEffect.class new file mode 100644 index 000000000..c40f02507 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/NettleTeaEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/PercentHeal.class b/Server/build/classes/java/main/core/game/content/consumable/effects/PercentHeal.class new file mode 100644 index 000000000..fb3f94b9a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/PercentHeal.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/PercentageHealthEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/PercentageHealthEffect.class new file mode 100644 index 000000000..d0592518e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/PercentageHealthEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/PoisonEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/PoisonEffect.class new file mode 100644 index 000000000..e2ff5b881 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/PoisonEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/PoisonKarambwanEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/PoisonKarambwanEffect.class new file mode 100644 index 000000000..75e5ed04b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/PoisonKarambwanEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/PrayerEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/PrayerEffect.class new file mode 100644 index 000000000..57e396680 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/PrayerEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/RandomEnergyEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/RandomEnergyEffect.class new file mode 100644 index 000000000..f9e000ae1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/RandomEnergyEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/RandomHealthEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/RandomHealthEffect.class new file mode 100644 index 000000000..66d9d9545 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/RandomHealthEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/RandomPrayerEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/RandomPrayerEffect.class new file mode 100644 index 000000000..480e31992 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/RandomPrayerEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/RandomSkillEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/RandomSkillEffect.class new file mode 100644 index 000000000..a1f73f50c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/RandomSkillEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/RemoveStateEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/RemoveStateEffect.class new file mode 100644 index 000000000..6c49961d5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/RemoveStateEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/RestoreEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/RestoreEffect.class new file mode 100644 index 000000000..95849beda Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/RestoreEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/RockCakeEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/RockCakeEffect.class new file mode 100644 index 000000000..e885aae03 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/RockCakeEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/SetAttributeEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/SetAttributeEffect.class new file mode 100644 index 000000000..2265a57a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/SetAttributeEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/SkillEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/SkillEffect.class new file mode 100644 index 000000000..adf74ac4d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/SkillEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/SmellingUgthankiKebabEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/SmellingUgthankiKebabEffect.class new file mode 100644 index 000000000..2201a9171 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/SmellingUgthankiKebabEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/SuperKebabEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/SuperKebabEffect.class new file mode 100644 index 000000000..2c15c7727 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/SuperKebabEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/TroubleBrewingRumEffect$1.class b/Server/build/classes/java/main/core/game/content/consumable/effects/TroubleBrewingRumEffect$1.class new file mode 100644 index 000000000..bb024b180 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/TroubleBrewingRumEffect$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/TroubleBrewingRumEffect$2.class b/Server/build/classes/java/main/core/game/content/consumable/effects/TroubleBrewingRumEffect$2.class new file mode 100644 index 000000000..1c6bcccf3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/TroubleBrewingRumEffect$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/TroubleBrewingRumEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/TroubleBrewingRumEffect.class new file mode 100644 index 000000000..267ec2dc1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/TroubleBrewingRumEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/UgthankiKebabEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/UgthankiKebabEffect.class new file mode 100644 index 000000000..30357fbc9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/UgthankiKebabEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/consumable/effects/WizardsMindBombEffect.class b/Server/build/classes/java/main/core/game/content/consumable/effects/WizardsMindBombEffect.class new file mode 100644 index 000000000..fa1ccc035 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/consumable/effects/WizardsMindBombEffect.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$1.class b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$1.class new file mode 100644 index 000000000..268246453 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$BluePhatItem.class b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$BluePhatItem.class new file mode 100644 index 000000000..53a72abb7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$BluePhatItem.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$DBRecordingNPC.class b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$DBRecordingNPC.class new file mode 100644 index 000000000..058dd8730 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$DBRecordingNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$RecordingPulse.class b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$RecordingPulse.class new file mode 100644 index 000000000..e12b3d888 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin$RecordingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin.class b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin.class new file mode 100644 index 000000000..0ac22956b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/DBRCutscenePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin$BrugsenBursenDialogue$1.class b/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin$BrugsenBursenDialogue$1.class new file mode 100644 index 000000000..35f1846f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin$BrugsenBursenDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin$BrugsenBursenDialogue.class b/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin$BrugsenBursenDialogue.class new file mode 100644 index 000000000..6002895a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin$BrugsenBursenDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin$TutorialInterfacePlugin.class b/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin$TutorialInterfacePlugin.class new file mode 100644 index 000000000..cc47de6b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin$TutorialInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin.class b/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin.class new file mode 100644 index 000000000..3970ecfc7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/GECutscenePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/JulietCutscenePlugin.class b/Server/build/classes/java/main/core/game/content/cutscene/JulietCutscenePlugin.class new file mode 100644 index 000000000..f9ec0b783 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/JulietCutscenePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/JulietDialogue$1.class b/Server/build/classes/java/main/core/game/content/cutscene/JulietDialogue$1.class new file mode 100644 index 000000000..ba1a2538a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/JulietDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/JulietDialogue$2.class b/Server/build/classes/java/main/core/game/content/cutscene/JulietDialogue$2.class new file mode 100644 index 000000000..1a0e84eb8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/JulietDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/JulietDialogue.class b/Server/build/classes/java/main/core/game/content/cutscene/JulietDialogue.class new file mode 100644 index 000000000..041e0842b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/JulietDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/OrganCutScene$1.class b/Server/build/classes/java/main/core/game/content/cutscene/OrganCutScene$1.class new file mode 100644 index 000000000..a3da1c0cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/OrganCutScene$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/OrganCutScene$2.class b/Server/build/classes/java/main/core/game/content/cutscene/OrganCutScene$2.class new file mode 100644 index 000000000..ed0cbe673 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/OrganCutScene$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/OrganCutScene.class b/Server/build/classes/java/main/core/game/content/cutscene/OrganCutScene.class new file mode 100644 index 000000000..8f0e8e320 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/OrganCutScene.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin$RomeoDialogue$1.class b/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin$RomeoDialogue$1.class new file mode 100644 index 000000000..c7a3e8ea6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin$RomeoDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin$RomeoDialogue$2.class b/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin$RomeoDialogue$2.class new file mode 100644 index 000000000..4a677ef32 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin$RomeoDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin$RomeoDialogue.class b/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin$RomeoDialogue.class new file mode 100644 index 000000000..7937d23f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin$RomeoDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin.class b/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin.class new file mode 100644 index 000000000..d8dc62557 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/cutscene/RJCutscenePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AablaDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/AablaDialogue$1.class new file mode 100644 index 000000000..e51a0eb6b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AablaDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AablaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/AablaDialogue.class new file mode 100644 index 000000000..cd573d0d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AablaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AbbotLangleyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/AbbotLangleyDialogue.class new file mode 100644 index 000000000..72b8e1246 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AbbotLangleyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ActivateEnchantedGem.class b/Server/build/classes/java/main/core/game/content/dialogue/ActivateEnchantedGem.class new file mode 100644 index 000000000..426984b00 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ActivateEnchantedGem.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AeonisigRaispher.class b/Server/build/classes/java/main/core/game/content/dialogue/AeonisigRaispher.class new file mode 100644 index 000000000..081f95005 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AeonisigRaispher.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AggieDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/AggieDialogue.class new file mode 100644 index 000000000..c74ec2475 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AggieDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AhabDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/AhabDialogue.class new file mode 100644 index 000000000..df8c83b50 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AhabDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AjjatDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/AjjatDialoguePlugin.class new file mode 100644 index 000000000..6cfd6c22d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AjjatDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AleckDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/AleckDialogue.class new file mode 100644 index 000000000..d8a2672de Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AleckDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AlfonseWaiterDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/AlfonseWaiterDialogue.class new file mode 100644 index 000000000..babce71a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AlfonseWaiterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AmbassadorFernook.class b/Server/build/classes/java/main/core/game/content/dialogue/AmbassadorFernook.class new file mode 100644 index 000000000..2844f80f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AmbassadorFernook.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AnjaDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/AnjaDialoguePlugin.class new file mode 100644 index 000000000..aaaa89dce Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AnjaDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AnnaIsaakson.class b/Server/build/classes/java/main/core/game/content/dialogue/AnnaIsaakson.class new file mode 100644 index 000000000..7e95ad320 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AnnaIsaakson.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/AntonDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/AntonDialogue.class new file mode 100644 index 000000000..d3aa87a76 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/AntonDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ApothecaryDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ApothecaryDialogue.class new file mode 100644 index 000000000..71a5d134f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ApothecaryDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ArchaeologicalExpertDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ArchaeologicalExpertDialogue.class new file mode 100644 index 000000000..ca9068c64 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ArchaeologicalExpertDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ArdougneBaker.class b/Server/build/classes/java/main/core/game/content/dialogue/ArdougneBaker.class new file mode 100644 index 000000000..613a419d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ArdougneBaker.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ArdougneShopKeeperPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/ArdougneShopKeeperPlugin.class new file mode 100644 index 000000000..d80dace6e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ArdougneShopKeeperPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BKListenDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BKListenDialogue.class new file mode 100644 index 000000000..06acf7e07 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BKListenDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BananaCrateDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BananaCrateDialogue.class new file mode 100644 index 000000000..acd22c2fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BananaCrateDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BanditCampBartenderDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BanditCampBartenderDialogue.class new file mode 100644 index 000000000..dea6c872f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BanditCampBartenderDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BankerTutorDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BankerTutorDialogue.class new file mode 100644 index 000000000..febcf1d15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BankerTutorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BaraekDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BaraekDialogue.class new file mode 100644 index 000000000..29f839a90 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BaraekDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BarbarianDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BarbarianDialogue.class new file mode 100644 index 000000000..5365b8b31 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BarbarianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BarfyBill.class b/Server/build/classes/java/main/core/game/content/dialogue/BarfyBill.class new file mode 100644 index 000000000..f3eee8ae9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BarfyBill.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BarkerDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BarkerDialogue.class new file mode 100644 index 000000000..e03d769ae Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BarkerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BeaverDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BeaverDialogue.class new file mode 100644 index 000000000..19a48c3c4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BeaverDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BennyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BennyDialogue.class new file mode 100644 index 000000000..67ead8e06 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BennyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BernaldDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BernaldDialogue.class new file mode 100644 index 000000000..bd4806c93 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BernaldDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BettyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BettyDialogue.class new file mode 100644 index 000000000..3983ca70c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BettyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BillTeachDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BillTeachDialogue.class new file mode 100644 index 000000000..811f59e6d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BillTeachDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BobBarterDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BobBarterDialogue.class new file mode 100644 index 000000000..bea55931c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BobBarterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BootDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BootDialogue.class new file mode 100644 index 000000000..1aadf14f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BootDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BorderGuardDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BorderGuardDialogue.class new file mode 100644 index 000000000..bdf30c9f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BorderGuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BreocaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BreocaDialogue.class new file mode 100644 index 000000000..7e050396e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BreocaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BrianArcheryDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BrianArcheryDialogue.class new file mode 100644 index 000000000..afd67e52b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BrianArcheryDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BrianORichardDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BrianORichardDialogue.class new file mode 100644 index 000000000..77a5e3e89 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BrianORichardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BrimhavenBartenderDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BrimhavenBartenderDialogue.class new file mode 100644 index 000000000..0503213db Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BrimhavenBartenderDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BrimhavenPirateDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BrimhavenPirateDialogue.class new file mode 100644 index 000000000..5f253d894 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BrimhavenPirateDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BrosDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BrosDialogue.class new file mode 100644 index 000000000..6877b13af Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BrosDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BrotherJeredDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BrotherJeredDialogue.class new file mode 100644 index 000000000..8e6285948 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BrotherJeredDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/BurthorpeSoldierDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/BurthorpeSoldierDialogue.class new file mode 100644 index 000000000..da5820583 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/BurthorpeSoldierDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CabinBoyJenkins.class b/Server/build/classes/java/main/core/game/content/dialogue/CabinBoyJenkins.class new file mode 100644 index 000000000..61d19a945 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CabinBoyJenkins.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CallistoCubDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CallistoCubDialogue.class new file mode 100644 index 000000000..20d0af30e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CallistoCubDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CamelDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/CamelDialoguePlugin.class new file mode 100644 index 000000000..ae90f951c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CamelDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CamelotGuardDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CamelotGuardDialogue.class new file mode 100644 index 000000000..afec14c63 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CamelotGuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CandleSellerPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/CandleSellerPlugin.class new file mode 100644 index 000000000..c88554184 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CandleSellerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CapeMerchantDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CapeMerchantDialogue.class new file mode 100644 index 000000000..4a7f80c3a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CapeMerchantDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CapnIzzyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CapnIzzyDialogue.class new file mode 100644 index 000000000..f2f245660 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CapnIzzyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CaptainBarnabyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CaptainBarnabyDialogue.class new file mode 100644 index 000000000..d25221033 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CaptainBarnabyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CaptainBentleyDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/CaptainBentleyDialogue$1.class new file mode 100644 index 000000000..32f307344 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CaptainBentleyDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CaptainBentleyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CaptainBentleyDialogue.class new file mode 100644 index 000000000..53cf141eb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CaptainBentleyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CaptainDalburDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CaptainDalburDialogue.class new file mode 100644 index 000000000..78a96b687 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CaptainDalburDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CaptainShanksDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CaptainShanksDialogue.class new file mode 100644 index 000000000..0921a83dd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CaptainShanksDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CassieDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CassieDialogue.class new file mode 100644 index 000000000..924ba62c0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CassieDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CaveMonk.class b/Server/build/classes/java/main/core/game/content/dialogue/CaveMonk.class new file mode 100644 index 000000000..3db72571c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CaveMonk.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CeolburgDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CeolburgDialogue.class new file mode 100644 index 000000000..f338463a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CeolburgDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ChaosElementalJRDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ChaosElementalJRDialogue.class new file mode 100644 index 000000000..daa6645ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ChaosElementalJRDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CharlieTheTrampDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CharlieTheTrampDialogue.class new file mode 100644 index 000000000..41f19caf3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CharlieTheTrampDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ChemistDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ChemistDialogue.class new file mode 100644 index 000000000..bf51752ec Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ChemistDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ConeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ConeDialogue.class new file mode 100644 index 000000000..a7b920cdd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ConeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CookingTutorDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CookingTutorDialogue.class new file mode 100644 index 000000000..e0468ca3f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CookingTutorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CraftingTutorDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CraftingTutorDialogue.class new file mode 100644 index 000000000..30c3b02e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CraftingTutorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CuffsDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CuffsDialogue.class new file mode 100644 index 000000000..874a817fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CuffsDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/CustomsOfficerDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/CustomsOfficerDialogue.class new file mode 100644 index 000000000..7986d20d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/CustomsOfficerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DSChestDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DSChestDialogue.class new file mode 100644 index 000000000..2f3349952 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DSChestDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DairyChurnDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DairyChurnDialogue.class new file mode 100644 index 000000000..1d19548c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DairyChurnDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DairyChurnOptionPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/DairyChurnOptionPlugin.class new file mode 100644 index 000000000..e15e44f1c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DairyChurnOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DavonDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DavonDialogue.class new file mode 100644 index 000000000..81a82bb04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DavonDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DelMontyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DelMontyDialogue.class new file mode 100644 index 000000000..7dbb550da Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DelMontyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DenulthDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DenulthDialogue.class new file mode 100644 index 000000000..ea673e720 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DenulthDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DestroyItemPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/DestroyItemPlugin.class new file mode 100644 index 000000000..78d03d49c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DestroyItemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DialogueAction.class b/Server/build/classes/java/main/core/game/content/dialogue/DialogueAction.class new file mode 100644 index 000000000..2da6a118e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DialogueAction.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DialogueInterpreter.class b/Server/build/classes/java/main/core/game/content/dialogue/DialogueInterpreter.class new file mode 100644 index 000000000..72db7c5b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DialogueInterpreter.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/DialoguePlugin.class new file mode 100644 index 000000000..c7afd428b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DiangoDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DiangoDialogue.class new file mode 100644 index 000000000..89dfac25e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DiangoDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DismissDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/DismissDialoguePlugin.class new file mode 100644 index 000000000..8f118d0ae Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DismissDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DommikDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DommikDialogue.class new file mode 100644 index 000000000..be0a91bb0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DommikDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DonieDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DonieDialogue.class new file mode 100644 index 000000000..c9e8757a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DonieDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DoomsayerDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DoomsayerDialogue.class new file mode 100644 index 000000000..f9485688c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DoomsayerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DoorPerilDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DoorPerilDialogue.class new file mode 100644 index 000000000..8bd965763 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DoorPerilDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DoricDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DoricDialogue.class new file mode 100644 index 000000000..413d896d1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DoricDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DrHarlowDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DrHarlowDialogue.class new file mode 100644 index 000000000..d1a33b8d3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DrHarlowDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DrOnglewipDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DrOnglewipDialogue.class new file mode 100644 index 000000000..149685b02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DrOnglewipDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DragonShieldDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DragonShieldDialogue.class new file mode 100644 index 000000000..03b11cf8e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DragonShieldDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DraulLeptoc.class b/Server/build/classes/java/main/core/game/content/dialogue/DraulLeptoc.class new file mode 100644 index 000000000..7078c47f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DraulLeptoc.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DraynorBankGuard.class b/Server/build/classes/java/main/core/game/content/dialogue/DraynorBankGuard.class new file mode 100644 index 000000000..88a22916a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DraynorBankGuard.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DrezelDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DrezelDialogue.class new file mode 100644 index 000000000..9b27735fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DrezelDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DrezelMonumentDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DrezelMonumentDialogue.class new file mode 100644 index 000000000..11f17f108 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DrezelMonumentDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DrokarDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DrokarDialogue.class new file mode 100644 index 000000000..61ac05c0f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DrokarDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DumpContainer.class b/Server/build/classes/java/main/core/game/content/dialogue/DumpContainer.class new file mode 100644 index 000000000..77ec2e631 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DumpContainer.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DunstanDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DunstanDialogue.class new file mode 100644 index 000000000..b47c2ab7b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DunstanDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/DwarfShopDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/DwarfShopDialogue.class new file mode 100644 index 000000000..084b30d3f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/DwarfShopDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EadburgDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/EadburgDialogue.class new file mode 100644 index 000000000..4ec0f3853 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EadburgDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EblisDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/EblisDialogue.class new file mode 100644 index 000000000..bab8c2951 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EblisDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EdgevilleMonkDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/EdgevilleMonkDialogue.class new file mode 100644 index 000000000..09284cbcc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EdgevilleMonkDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EdgevilleShopKeeperDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/EdgevilleShopKeeperDialogue.class new file mode 100644 index 000000000..5af51c5c9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EdgevilleShopKeeperDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EllamariaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/EllamariaDialogue.class new file mode 100644 index 000000000..54fe60c74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EllamariaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EllyTheCamelDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/EllyTheCamelDialogue.class new file mode 100644 index 000000000..80efaeaf8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EllyTheCamelDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EmeraldBenedictDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/EmeraldBenedictDialogue.class new file mode 100644 index 000000000..2130bdd0f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EmeraldBenedictDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EnchantTiaraDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/EnchantTiaraDialogue$1.class new file mode 100644 index 000000000..0deb0c113 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EnchantTiaraDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EnchantTiaraDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/EnchantTiaraDialogue.class new file mode 100644 index 000000000..d1dac764a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EnchantTiaraDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EntranaChurchMonk.class b/Server/build/classes/java/main/core/game/content/dialogue/EntranaChurchMonk.class new file mode 100644 index 000000000..9e78664e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EntranaChurchMonk.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ErnestDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ErnestDialogue.class new file mode 100644 index 000000000..d4d7ca1cd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ErnestDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/EventLocatorDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/EventLocatorDialoguePlugin.class new file mode 100644 index 000000000..8bf5b89a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/EventLocatorDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ExplorerJackDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ExplorerJackDialogue.class new file mode 100644 index 000000000..556bed503 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ExplorerJackDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FacialExpression.class b/Server/build/classes/java/main/core/game/content/dialogue/FacialExpression.class new file mode 100644 index 000000000..39ac8a9c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FacialExpression.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FadliDialogue$FadliPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/FadliDialogue$FadliPlugin.class new file mode 100644 index 000000000..6ecda2281 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FadliDialogue$FadliPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FadliDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FadliDialogue.class new file mode 100644 index 000000000..b4cd7f2c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FadliDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FaladorGardenerDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FaladorGardenerDialogue.class new file mode 100644 index 000000000..8563ecd50 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FaladorGardenerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FaladorManHouseDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FaladorManHouseDialogue.class new file mode 100644 index 000000000..10d2f54bd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FaladorManHouseDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FaladorShopKeeperDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FaladorShopKeeperDialogue.class new file mode 100644 index 000000000..bb10a92c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FaladorShopKeeperDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FaladorSquireDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FaladorSquireDialogue.class new file mode 100644 index 000000000..560916d8f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FaladorSquireDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FaladorWomenParkDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FaladorWomenParkDialogue.class new file mode 100644 index 000000000..3443b35d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FaladorWomenParkDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FamiliarDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/FamiliarDialoguePlugin.class new file mode 100644 index 000000000..ffcc1d647 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FamiliarDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FaridMorrisaneDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FaridMorrisaneDialogue.class new file mode 100644 index 000000000..80318ca01 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FaridMorrisaneDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FatherLawrenceDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FatherLawrenceDialogue.class new file mode 100644 index 000000000..062c45d0c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FatherLawrenceDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FenitasDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FenitasDialogue.class new file mode 100644 index 000000000..1af82cbbf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FenitasDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FilelioDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FilelioDialogue.class new file mode 100644 index 000000000..564d064c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FilelioDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FishingTutorDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FishingTutorDialogue.class new file mode 100644 index 000000000..51bc6db4d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FishingTutorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FlynnDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FlynnDialogue.class new file mode 100644 index 000000000..608c687da Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FlynnDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FortressGuardDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FortressGuardDialogue.class new file mode 100644 index 000000000..3cdba8fde Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FortressGuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FortunatoDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FortunatoDialogue.class new file mode 100644 index 000000000..80e37b69f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FortunatoDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FredTheFarmer.class b/Server/build/classes/java/main/core/game/content/dialogue/FredTheFarmer.class new file mode 100644 index 000000000..19206e1fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FredTheFarmer.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FrincosDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FrincosDialogue.class new file mode 100644 index 000000000..6fced4ebb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FrincosDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FritzGlassBlowerDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/FritzGlassBlowerDialogue.class new file mode 100644 index 000000000..f42c5b062 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FritzGlassBlowerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/FurTradePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/FurTradePlugin.class new file mode 100644 index 000000000..f58b41431 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/FurTradePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GWDKnightDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/GWDKnightDialogue$1.class new file mode 100644 index 000000000..897eadb4e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GWDKnightDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GWDKnightDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GWDKnightDialogue.class new file mode 100644 index 000000000..8c8aafca5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GWDKnightDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GalahadDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GalahadDialogue.class new file mode 100644 index 000000000..54ecd3fca Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GalahadDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GamFredDialoue.class b/Server/build/classes/java/main/core/game/content/dialogue/GamFredDialoue.class new file mode 100644 index 000000000..b8110c29e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GamFredDialoue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GarvDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GarvDialogue.class new file mode 100644 index 000000000..3272f8633 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GarvDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GeeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GeeDialogue.class new file mode 100644 index 000000000..e6ae220c9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GeeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GemMerchantDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GemMerchantDialogue.class new file mode 100644 index 000000000..46585ce10 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GemMerchantDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GemTradeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GemTradeDialogue.class new file mode 100644 index 000000000..fbf8de2b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GemTradeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GerrantDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GerrantDialogue.class new file mode 100644 index 000000000..f28c19797 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GerrantDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GertrudeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GertrudeDialogue.class new file mode 100644 index 000000000..0d96bc6f6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GertrudeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue$1.class new file mode 100644 index 000000000..b28c342a9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue$2.class b/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue$2.class new file mode 100644 index 000000000..57ef2c039 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue$3.class b/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue$3.class new file mode 100644 index 000000000..618804a91 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue.class new file mode 100644 index 000000000..ddfaec4f1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GertrudesCatDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GhommalDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GhommalDialogue.class new file mode 100644 index 000000000..b8e7edd72 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GhommalDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GnomeSpiritTreeDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/GnomeSpiritTreeDialogue$1.class new file mode 100644 index 000000000..2651eaee0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GnomeSpiritTreeDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GnomeSpiritTreeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GnomeSpiritTreeDialogue.class new file mode 100644 index 000000000..5e78e4860 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GnomeSpiritTreeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GnomeTrainerPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/GnomeTrainerPlugin.class new file mode 100644 index 000000000..ac50edd49 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GnomeTrainerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GoblinVillageDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GoblinVillageDialogue.class new file mode 100644 index 000000000..0f32d8b78 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GoblinVillageDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GoblinVillageGuardDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GoblinVillageGuardDialogue.class new file mode 100644 index 000000000..95ad59936 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GoblinVillageGuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GodswordDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GodswordDialogue.class new file mode 100644 index 000000000..ad2d0ad27 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GodswordDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GraardoorJRDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GraardoorJRDialogue.class new file mode 100644 index 000000000..0c9ea205e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GraardoorJRDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GrandExchangeClerk.class b/Server/build/classes/java/main/core/game/content/dialogue/GrandExchangeClerk.class new file mode 100644 index 000000000..b685295f9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GrandExchangeClerk.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GrandExchangeTutor.class b/Server/build/classes/java/main/core/game/content/dialogue/GrandExchangeTutor.class new file mode 100644 index 000000000..3d6932c7b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GrandExchangeTutor.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GregoryDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GregoryDialogue.class new file mode 100644 index 000000000..68f43e349 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GregoryDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GrimgnashDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GrimgnashDialogue.class new file mode 100644 index 000000000..b1ebafd14 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GrimgnashDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GruborDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GruborDialogue.class new file mode 100644 index 000000000..abe1dd8e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GruborDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GrumDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GrumDialogue.class new file mode 100644 index 000000000..b0b49a51a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GrumDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GuidorsWifeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GuidorsWifeDialogue.class new file mode 100644 index 000000000..f161cbf1a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GuidorsWifeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/GunthorBraveDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/GunthorBraveDialogue.class new file mode 100644 index 000000000..a88eb7535 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/GunthorBraveDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HairdresserDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HairdresserDialogue.class new file mode 100644 index 000000000..08bed8ba6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HairdresserDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HansDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/HansDialoguePlugin.class new file mode 100644 index 000000000..64cc74f73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HansDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HariDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HariDialogue.class new file mode 100644 index 000000000..2ba3466e6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HariDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HarlanDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HarlanDialogue.class new file mode 100644 index 000000000..dc2871154 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HarlanDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HarrallakMenarous.class b/Server/build/classes/java/main/core/game/content/dialogue/HarrallakMenarous.class new file mode 100644 index 000000000..11515afa1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HarrallakMenarous.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HarryDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HarryDialogue.class new file mode 100644 index 000000000..304c51a62 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HarryDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HassanDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HassanDialogue.class new file mode 100644 index 000000000..efd8a24b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HassanDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HeadChefDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HeadChefDialogue.class new file mode 100644 index 000000000..98edbef13 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HeadChefDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HengelDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/HengelDialoguePlugin.class new file mode 100644 index 000000000..eb8e29917 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HengelDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HeronDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HeronDialogue.class new file mode 100644 index 000000000..efe275847 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HeronDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HerquinDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HerquinDialogue.class new file mode 100644 index 000000000..a91fb4efa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HerquinDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HettyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HettyDialogue.class new file mode 100644 index 000000000..a88a5b9d2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HettyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HicktonDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HicktonDialogue.class new file mode 100644 index 000000000..12e33f205 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HicktonDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HighPriestDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HighPriestDialogue.class new file mode 100644 index 000000000..4a3970f81 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HighPriestDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HildDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HildDialogue.class new file mode 100644 index 000000000..43a72680f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HildDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HistanDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HistanDialogue.class new file mode 100644 index 000000000..c08d1d35f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HistanDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HiylikMynaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HiylikMynaDialogue.class new file mode 100644 index 000000000..8511c3625 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HiylikMynaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HofutThandDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HofutThandDialogue.class new file mode 100644 index 000000000..735799ef1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HofutThandDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HoodedMonkDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HoodedMonkDialogue.class new file mode 100644 index 000000000..aae3908bb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HoodedMonkDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HooknosedJackDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HooknosedJackDialogue.class new file mode 100644 index 000000000..ce3e0cf7b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HooknosedJackDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HorvikDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HorvikDialogue.class new file mode 100644 index 000000000..d3c18af27 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HorvikDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HuntingExpert.class b/Server/build/classes/java/main/core/game/content/dialogue/HuntingExpert.class new file mode 100644 index 000000000..4bb6ec36f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HuntingExpert.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HuraDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HuraDialogue.class new file mode 100644 index 000000000..b140842ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HuraDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/HygdDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/HygdDialogue.class new file mode 100644 index 000000000..f856f2af2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/HygdDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/IcyCavernDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/IcyCavernDialogue.class new file mode 100644 index 000000000..1b1770fdf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/IcyCavernDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/IgnatiusVulcanDialogue$IgnatiusVulcanNPC.class b/Server/build/classes/java/main/core/game/content/dialogue/IgnatiusVulcanDialogue$IgnatiusVulcanNPC.class new file mode 100644 index 000000000..b28ec2a79 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/IgnatiusVulcanDialogue$IgnatiusVulcanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/IgnatiusVulcanDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/IgnatiusVulcanDialogue.class new file mode 100644 index 000000000..66fa4f42a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/IgnatiusVulcanDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/InformationclerkMuseumDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/InformationclerkMuseumDialogue.class new file mode 100644 index 000000000..ac1624fea Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/InformationclerkMuseumDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/IrinaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/IrinaDialogue.class new file mode 100644 index 000000000..71c6c6b0e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/IrinaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JackSeagullDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/JackSeagullDialogue.class new file mode 100644 index 000000000..c19206dfd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JackSeagullDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JaraahDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/JaraahDialogue.class new file mode 100644 index 000000000..ef290f0ec Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JaraahDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JatixDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/JatixDialogue.class new file mode 100644 index 000000000..9f45ec9d3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JatixDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JeffDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/JeffDialogue.class new file mode 100644 index 000000000..f699058c2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JeffDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JiminuaDialogue$JiminuaUnnoteHandler.class b/Server/build/classes/java/main/core/game/content/dialogue/JiminuaDialogue$JiminuaUnnoteHandler.class new file mode 100644 index 000000000..4b2e04faa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JiminuaDialogue$JiminuaUnnoteHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JiminuaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/JiminuaDialogue.class new file mode 100644 index 000000000..ca6457d6c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JiminuaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JoeGuardDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/JoeGuardDialogue.class new file mode 100644 index 000000000..bd44c41e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JoeGuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JosephDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/JosephDialogue.class new file mode 100644 index 000000000..17ae2498c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JosephDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JossikDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/JossikDialogue.class new file mode 100644 index 000000000..ac722e0aa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JossikDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/JungleForesterDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/JungleForesterDialogue.class new file mode 100644 index 000000000..b95ed295c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/JungleForesterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KalebDialgoue.class b/Server/build/classes/java/main/core/game/content/dialogue/KalebDialgoue.class new file mode 100644 index 000000000..c1c2a7f38 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KalebDialgoue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KalebParamaya.class b/Server/build/classes/java/main/core/game/content/dialogue/KalebParamaya.class new file mode 100644 index 000000000..62e4d389c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KalebParamaya.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KamfreenaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KamfreenaDialogue.class new file mode 100644 index 000000000..ade9abf37 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KamfreenaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KanelDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KanelDialogue.class new file mode 100644 index 000000000..a2f273af7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KanelDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KangaiMauDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KangaiMauDialogue.class new file mode 100644 index 000000000..9c098d323 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KangaiMauDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KaqemeexDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KaqemeexDialogue.class new file mode 100644 index 000000000..abde791e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KaqemeexDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KaramajaManDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KaramajaManDialogue.class new file mode 100644 index 000000000..65c1194a9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KaramajaManDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KarimDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KarimDialogue.class new file mode 100644 index 000000000..511ab488a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KarimDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KayleeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KayleeDialogue.class new file mode 100644 index 000000000..bc31e6d65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KayleeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KeyMasterDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/KeyMasterDialoguePlugin.class new file mode 100644 index 000000000..f37c06faf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KeyMasterDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KittenInteractDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/KittenInteractDialogue$1.class new file mode 100644 index 000000000..cc7c5bf7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KittenInteractDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KittenInteractDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KittenInteractDialogue.class new file mode 100644 index 000000000..9edf7f632 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KittenInteractDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KlarenseDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KlarenseDialogue.class new file mode 100644 index 000000000..b6e043de7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KlarenseDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KreeJrDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KreeJrDialogue.class new file mode 100644 index 000000000..56a1acde2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KreeJrDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/KrilJRDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/KrilJRDialogue.class new file mode 100644 index 000000000..96e837a08 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/KrilJRDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LakkiDwarfDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LakkiDwarfDialogue.class new file mode 100644 index 000000000..536b11dea Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LakkiDwarfDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LarxusDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LarxusDialogue.class new file mode 100644 index 000000000..0c5ff9bb0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LarxusDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LeatherCraftDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/LeatherCraftDialogue$1.class new file mode 100644 index 000000000..7ed38273d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LeatherCraftDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LeatherCraftDialogue$2.class b/Server/build/classes/java/main/core/game/content/dialogue/LeatherCraftDialogue$2.class new file mode 100644 index 000000000..a75ff2ecd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LeatherCraftDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LeatherCraftDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LeatherCraftDialogue.class new file mode 100644 index 000000000..3692670f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LeatherCraftDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LeelaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LeelaDialogue.class new file mode 100644 index 000000000..00cf14dc4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LeelaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LeonDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LeonDialogue.class new file mode 100644 index 000000000..f055f0a78 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LeonDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LidioDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LidioDialogue.class new file mode 100644 index 000000000..562e338e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LidioDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LillyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LillyDialogue.class new file mode 100644 index 000000000..a03ace2ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LillyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LitaraDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LitaraDialogue.class new file mode 100644 index 000000000..1c2bfe07c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LitaraDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LokarSearunnerDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/LokarSearunnerDialogue$1.class new file mode 100644 index 000000000..cd5b7e6c2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LokarSearunnerDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LokarSearunnerDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LokarSearunnerDialogue.class new file mode 100644 index 000000000..ef19976dc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LokarSearunnerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LongbowBenDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LongbowBenDialogue.class new file mode 100644 index 000000000..8313c6da1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LongbowBenDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LouiLegsDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LouiLegsDialogue.class new file mode 100644 index 000000000..dc8886303 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LouiLegsDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LoweDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LoweDialogue.class new file mode 100644 index 000000000..878635ff8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LoweDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LubufuDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LubufuDialogue.class new file mode 100644 index 000000000..34858aca7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LubufuDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LucyPartyRoomDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/LucyPartyRoomDialoguePlugin.class new file mode 100644 index 000000000..8b6d90cc2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LucyPartyRoomDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeGuideDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeGuideDialogue.class new file mode 100644 index 000000000..ca9890fa7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeGuideDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeJailGuard.class b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeJailGuard.class new file mode 100644 index 000000000..4c341575e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeJailGuard.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeSwampArcher.class b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeSwampArcher.class new file mode 100644 index 000000000..bc539f7b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeSwampArcher.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeSwampMonk.class b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeSwampMonk.class new file mode 100644 index 000000000..99ba533df Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeSwampMonk.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeSwampWizard.class b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeSwampWizard.class new file mode 100644 index 000000000..141d93312 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LumbridgeSwampWizard.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/LuthasDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/LuthasDialogue.class new file mode 100644 index 000000000..521f4e28f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/LuthasDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MagicStoreDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MagicStoreDialogue.class new file mode 100644 index 000000000..fcde7d618 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MagicStoreDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MagicTutorDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MagicTutorDialogue.class new file mode 100644 index 000000000..57fe06812 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MagicTutorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MakeOverMageDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MakeOverMageDialogue.class new file mode 100644 index 000000000..b2ae977ca Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MakeOverMageDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MalakDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MalakDialogue.class new file mode 100644 index 000000000..ce8bbf212 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MalakDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MamaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MamaDialogue.class new file mode 100644 index 000000000..486de2382 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MamaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ManDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/ManDialoguePlugin.class new file mode 100644 index 000000000..8b8c89782 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ManDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ManorFountainDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ManorFountainDialogue.class new file mode 100644 index 000000000..89a140b2c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ManorFountainDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MartinTheMasterGardener.class b/Server/build/classes/java/main/core/game/content/dialogue/MartinTheMasterGardener.class new file mode 100644 index 000000000..06d3467ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MartinTheMasterGardener.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MartinThwaitDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/MartinThwaitDialogue$1.class new file mode 100644 index 000000000..ffff57494 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MartinThwaitDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MartinThwaitDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MartinThwaitDialogue.class new file mode 100644 index 000000000..2e377ca2a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MartinThwaitDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MathiasFlaconryDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MathiasFlaconryDialogue.class new file mode 100644 index 000000000..410647d57 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MathiasFlaconryDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MazionDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MazionDialogue.class new file mode 100644 index 000000000..527b7b5b2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MazionDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MeleeShopDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/MeleeShopDialoguePlugin.class new file mode 100644 index 000000000..65db1f154 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MeleeShopDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MiningGuildDwarf.class b/Server/build/classes/java/main/core/game/content/dialogue/MiningGuildDwarf.class new file mode 100644 index 000000000..b3a7e0f10 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MiningGuildDwarf.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MiningSkillCapeDwarfDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MiningSkillCapeDwarfDialogue.class new file mode 100644 index 000000000..1e1912c81 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MiningSkillCapeDwarfDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MiningtutorDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MiningtutorDialogue.class new file mode 100644 index 000000000..5bfe33bab Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MiningtutorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MissSchismDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MissSchismDialogue.class new file mode 100644 index 000000000..b0b013deb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MissSchismDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MithGrappleDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/MithGrappleDialogue$1.class new file mode 100644 index 000000000..e5e7b9faa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MithGrappleDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MithGrappleDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MithGrappleDialogue.class new file mode 100644 index 000000000..942179235 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MithGrappleDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsDialogue$1.class new file mode 100644 index 000000000..e197375c9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsDialogue.class new file mode 100644 index 000000000..1a2981fad Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsPlugin$1.class b/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsPlugin$1.class new file mode 100644 index 000000000..d7d35d8ef Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsPlugin.class new file mode 100644 index 000000000..412dbfea7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MithrilSeedsPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MonkOfEntranaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MonkOfEntranaDialogue.class new file mode 100644 index 000000000..0f35741a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MonkOfEntranaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MonkeyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MonkeyDialogue.class new file mode 100644 index 000000000..047514f30 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MonkeyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MorganDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MorganDialogue.class new file mode 100644 index 000000000..aadb48d9c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MorganDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MubarizDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MubarizDialogue.class new file mode 100644 index 000000000..2188cca2d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MubarizDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/MurkyMattDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/MurkyMattDialogue.class new file mode 100644 index 000000000..052e9b4eb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/MurkyMattDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/NarfsDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/NarfsDialogue.class new file mode 100644 index 000000000..f6de321c7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/NarfsDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/NikitiaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/NikitiaDialogue.class new file mode 100644 index 000000000..b417c2aaa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/NikitiaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/NurmofDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/NurmofDialogue.class new file mode 100644 index 000000000..88241d554 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/NurmofDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/OcaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/OcaDialogue.class new file mode 100644 index 000000000..03be0841a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/OcaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/OliviaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/OliviaDialogue.class new file mode 100644 index 000000000..ebaa7af54 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/OliviaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/OllieTheCamelDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/OllieTheCamelDialogue.class new file mode 100644 index 000000000..be114601c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/OllieTheCamelDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/OracleDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/OracleDialogue.class new file mode 100644 index 000000000..456cbc000 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/OracleDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/OutpostSquireDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/OutpostSquireDialogue.class new file mode 100644 index 000000000..64b8e9fc6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/OutpostSquireDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PartyPeteDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/PartyPeteDialoguePlugin.class new file mode 100644 index 000000000..1af12b0c0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PartyPeteDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PatchyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PatchyDialogue.class new file mode 100644 index 000000000..b2e6648a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PatchyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PeksaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PeksaDialogue.class new file mode 100644 index 000000000..1b57f7e14 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PeksaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PendaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PendaDialogue.class new file mode 100644 index 000000000..f44b0d02d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PendaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PetshopOwnerTaverly.class b/Server/build/classes/java/main/core/game/content/dialogue/PetshopOwnerTaverly.class new file mode 100644 index 000000000..afbdffa88 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PetshopOwnerTaverly.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PhantuwtiFantstuwiFarSight.class b/Server/build/classes/java/main/core/game/content/dialogue/PhantuwtiFantstuwiFarSight.class new file mode 100644 index 000000000..2eff416f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PhantuwtiFantstuwiFarSight.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PhillipaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PhillipaDialogue.class new file mode 100644 index 000000000..8da449192 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PhillipaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PhilopDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PhilopDialogue.class new file mode 100644 index 000000000..86e425743 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PhilopDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PikkupstixDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PikkupstixDialogue.class new file mode 100644 index 000000000..e2736493c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PikkupstixDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PirateJackieDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PirateJackieDialogue.class new file mode 100644 index 000000000..3f5104bd5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PirateJackieDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PortSarimBartenderDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PortSarimBartenderDialogue.class new file mode 100644 index 000000000..633a2e903 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PortSarimBartenderDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PortSarimBrianDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PortSarimBrianDialogue.class new file mode 100644 index 000000000..cbfde0fc1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PortSarimBrianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PoxDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PoxDialogue.class new file mode 100644 index 000000000..8333cd70a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PoxDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PrayerTutorDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PrayerTutorDialogue.class new file mode 100644 index 000000000..d55fb817f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PrayerTutorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PrinceAliDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/PrinceAliDialogue$1.class new file mode 100644 index 000000000..f93d5cee7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PrinceAliDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PrinceAliDialogue$2.class b/Server/build/classes/java/main/core/game/content/dialogue/PrinceAliDialogue$2.class new file mode 100644 index 000000000..0107450f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PrinceAliDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PrinceAliDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PrinceAliDialogue.class new file mode 100644 index 000000000..491e3f75b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PrinceAliDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/PrinceBlackDragonDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/PrinceBlackDragonDialogue.class new file mode 100644 index 000000000..e71fc79de Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/PrinceBlackDragonDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ProfessorOddensteinPlugin$1.class b/Server/build/classes/java/main/core/game/content/dialogue/ProfessorOddensteinPlugin$1.class new file mode 100644 index 000000000..66590985e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ProfessorOddensteinPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ProfessorOddensteinPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/ProfessorOddensteinPlugin.class new file mode 100644 index 000000000..c7cfbf2ab Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ProfessorOddensteinPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/QuarterMasterDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/QuarterMasterDialogue.class new file mode 100644 index 000000000..abc886293 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/QuarterMasterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RanaelDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RanaelDialogue.class new file mode 100644 index 000000000..e9c69ca8d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RanaelDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RangedTutorDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RangedTutorDialogue.class new file mode 100644 index 000000000..0a2dc9d84 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RangedTutorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ReadbeardFrankDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ReadbeardFrankDialogue.class new file mode 100644 index 000000000..4cfcafc5c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ReadbeardFrankDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ReffDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ReffDialogue.class new file mode 100644 index 000000000..12296a3ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ReffDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ReloboBlinyoDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ReloboBlinyoDialogue.class new file mode 100644 index 000000000..1b0c60580 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ReloboBlinyoDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ResearcherDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ResearcherDialogue.class new file mode 100644 index 000000000..01a4dc214 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ResearcherDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RimmingtonShopKeeperDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RimmingtonShopKeeperDialogue.class new file mode 100644 index 000000000..49371d13e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RimmingtonShopKeeperDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RockGolemDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RockGolemDialogue.class new file mode 100644 index 000000000..6963dbb5a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RockGolemDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RoladDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RoladDialogue.class new file mode 100644 index 000000000..021ac76c0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RoladDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RomilyWeaklaxDialogue$PieReward.class b/Server/build/classes/java/main/core/game/content/dialogue/RomilyWeaklaxDialogue$PieReward.class new file mode 100644 index 000000000..a60625faa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RomilyWeaklaxDialogue$PieReward.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RomilyWeaklaxDialogue$RomilyWildPieHandler.class b/Server/build/classes/java/main/core/game/content/dialogue/RomilyWeaklaxDialogue$RomilyWildPieHandler.class new file mode 100644 index 000000000..9bb635d74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RomilyWeaklaxDialogue$RomilyWildPieHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RomilyWeaklaxDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RomilyWeaklaxDialogue.class new file mode 100644 index 000000000..abfbd9f07 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RomilyWeaklaxDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RoomikDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RoomikDialogue.class new file mode 100644 index 000000000..acbe5907d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RoomikDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RufusDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RufusDialogue.class new file mode 100644 index 000000000..c9b594ef9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RufusDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue$RugDestination$1.class b/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue$RugDestination$1.class new file mode 100644 index 000000000..363197ae0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue$RugDestination$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue$RugDestination.class b/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue$RugDestination.class new file mode 100644 index 000000000..a96e99ab9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue$RugDestination.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue$RugMerchantPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue$RugMerchantPlugin.class new file mode 100644 index 000000000..3818e0dcf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue$RugMerchantPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue.class new file mode 100644 index 000000000..460d00a87 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RugMerchantDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/RustyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/RustyDialogue.class new file mode 100644 index 000000000..f3fe9837d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/RustyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SabreenDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SabreenDialogue.class new file mode 100644 index 000000000..cdc5957d0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SabreenDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SandyDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SandyDialogue.class new file mode 100644 index 000000000..a08177628 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SandyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SanfewDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SanfewDialogue.class new file mode 100644 index 000000000..d6f70070b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SanfewDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SaniDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SaniDialogue.class new file mode 100644 index 000000000..0d6a2bc61 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SaniDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SanibochDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SanibochDialogue.class new file mode 100644 index 000000000..76d1c1961 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SanibochDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SarahFarmingPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/SarahFarmingPlugin.class new file mode 100644 index 000000000..6836b787a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SarahFarmingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SawmillOperator.class b/Server/build/classes/java/main/core/game/content/dialogue/SawmillOperator.class new file mode 100644 index 000000000..29b0feece Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SawmillOperator.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SbottDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SbottDialogue.class new file mode 100644 index 000000000..c7e1f6daf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SbottDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ScavvoDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ScavvoDialogue.class new file mode 100644 index 000000000..0142b0713 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ScavvoDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ScorpiasOffspringDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ScorpiasOffspringDialogue.class new file mode 100644 index 000000000..b36d3544e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ScorpiasOffspringDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SeamanDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/SeamanDialoguePlugin.class new file mode 100644 index 000000000..c78a7632c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SeamanDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SeerBartenderDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SeerBartenderDialogue.class new file mode 100644 index 000000000..3f1a2a20b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SeerBartenderDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SeerDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/SeerDialoguePlugin.class new file mode 100644 index 000000000..178804519 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SeerDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SeravelDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SeravelDialogue.class new file mode 100644 index 000000000..fde4fbcc7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SeravelDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ServantDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ServantDialogue.class new file mode 100644 index 000000000..27729f621 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ServantDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SethGroatsDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SethGroatsDialogue.class new file mode 100644 index 000000000..2ca8b96f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SethGroatsDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ShanomiDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ShanomiDialogue.class new file mode 100644 index 000000000..a59099096 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ShanomiDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ShantayDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/ShantayDialogue$1.class new file mode 100644 index 000000000..7af14b5f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ShantayDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ShantayDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ShantayDialogue.class new file mode 100644 index 000000000..33c151530 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ShantayDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ShantayGuard$1.class b/Server/build/classes/java/main/core/game/content/dialogue/ShantayGuard$1.class new file mode 100644 index 000000000..68274bfb9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ShantayGuard$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ShantayGuard.class b/Server/build/classes/java/main/core/game/content/dialogue/ShantayGuard.class new file mode 100644 index 000000000..996c5cc5b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ShantayGuard.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ShilopDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ShilopDialogue.class new file mode 100644 index 000000000..62e68bbae Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ShilopDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ShopkeeperDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ShopkeeperDialogue.class new file mode 100644 index 000000000..901b8069e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ShopkeeperDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SigmundDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SigmundDialogue.class new file mode 100644 index 000000000..893aeb92e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SigmundDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SigurdDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SigurdDialogue.class new file mode 100644 index 000000000..2f0e42f95 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SigurdDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SilkMerchantPlugin$1.class b/Server/build/classes/java/main/core/game/content/dialogue/SilkMerchantPlugin$1.class new file mode 100644 index 000000000..7998f9829 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SilkMerchantPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SilkMerchantPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/SilkMerchantPlugin.class new file mode 100644 index 000000000..cdadc75f5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SilkMerchantPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SilkTradeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SilkTradeDialogue.class new file mode 100644 index 000000000..a1a978a05 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SilkTradeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SilverMechantPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/SilverMechantPlugin.class new file mode 100644 index 000000000..bf1cbfbb6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SilverMechantPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SimonTempleton.class b/Server/build/classes/java/main/core/game/content/dialogue/SimonTempleton.class new file mode 100644 index 000000000..650cbe4a1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SimonTempleton.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SimpleDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/SimpleDialoguePlugin.class new file mode 100644 index 000000000..eea590387 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SimpleDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SimpleEntityMessage.class b/Server/build/classes/java/main/core/game/content/dialogue/SimpleEntityMessage.class new file mode 100644 index 000000000..5dba9755b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SimpleEntityMessage.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SirReniteeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SirReniteeDialogue.class new file mode 100644 index 000000000..35a22d453 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SirReniteeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SirTiffyCashienDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SirTiffyCashienDialogue.class new file mode 100644 index 000000000..4b704d5c4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SirTiffyCashienDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SirVyvinDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SirVyvinDialogue.class new file mode 100644 index 000000000..bc052934b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SirVyvinDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SkillDialoguePlugin$1.class b/Server/build/classes/java/main/core/game/content/dialogue/SkillDialoguePlugin$1.class new file mode 100644 index 000000000..7ca193c40 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SkillDialoguePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SkillDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/SkillDialoguePlugin.class new file mode 100644 index 000000000..3280bac91 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SkillDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SkullSceptreDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SkullSceptreDialogue.class new file mode 100644 index 000000000..acbed4cb0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SkullSceptreDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SloaneDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SloaneDialogue.class new file mode 100644 index 000000000..f787fe572 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SloaneDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SmithingApparenticeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SmithingApparenticeDialogue.class new file mode 100644 index 000000000..ea05ca9be Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SmithingApparenticeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SofiyaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SofiyaDialogue.class new file mode 100644 index 000000000..40242c39e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SofiyaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SorcceresDialouge$1.class b/Server/build/classes/java/main/core/game/content/dialogue/SorcceresDialouge$1.class new file mode 100644 index 000000000..f4f3a6469 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SorcceresDialouge$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SorcceresDialouge.class b/Server/build/classes/java/main/core/game/content/dialogue/SorcceresDialouge.class new file mode 100644 index 000000000..fde50c412 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SorcceresDialouge.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SpellbookSwapDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SpellbookSwapDialogue.class new file mode 100644 index 000000000..bd679ba20 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SpellbookSwapDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SpiceSellerPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/SpiceSellerPlugin.class new file mode 100644 index 000000000..79537e89d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SpiceSellerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SpiritGraahkDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SpiritGraahkDialogue.class new file mode 100644 index 000000000..207add97e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SpiritGraahkDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SpiritKyattDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SpiritKyattDialogue.class new file mode 100644 index 000000000..ade088938 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SpiritKyattDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SquireDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SquireDialogue.class new file mode 100644 index 000000000..06759b126 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SquireDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SquireMagicDialougue.class b/Server/build/classes/java/main/core/game/content/dialogue/SquireMagicDialougue.class new file mode 100644 index 000000000..f5ce4b202 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SquireMagicDialougue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SquireTypeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SquireTypeDialogue.class new file mode 100644 index 000000000..8a5cd91b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SquireTypeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/StankersDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/StankersDialogue.class new file mode 100644 index 000000000..9f9816ab4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/StankersDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SurgeonGeneralTafani.class b/Server/build/classes/java/main/core/game/content/dialogue/SurgeonGeneralTafani.class new file mode 100644 index 000000000..e17d2bae8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SurgeonGeneralTafani.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SurokMagis.class b/Server/build/classes/java/main/core/game/content/dialogue/SurokMagis.class new file mode 100644 index 000000000..962c8108e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SurokMagis.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/SvetlanaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/SvetlanaDialogue.class new file mode 100644 index 000000000..a49396282 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/SvetlanaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TakiDwarfDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TakiDwarfDialogue.class new file mode 100644 index 000000000..b6ac2abf5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TakiDwarfDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TarquinDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TarquinDialogue.class new file mode 100644 index 000000000..1d12a91fb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TarquinDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TaxidermistDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TaxidermistDialogue.class new file mode 100644 index 000000000..057197da3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TaxidermistDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TeaSellerDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TeaSellerDialogue.class new file mode 100644 index 000000000..d7b547e53 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TeaSellerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TeegidDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TeegidDialogue.class new file mode 100644 index 000000000..1ad6c55af Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TeegidDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ThessaliaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ThessaliaDialogue.class new file mode 100644 index 000000000..f0b1f051e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ThessaliaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ThuroDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ThuroDialogue.class new file mode 100644 index 000000000..a2ee75776 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ThuroDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TostigDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TostigDialogue.class new file mode 100644 index 000000000..66e600672 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TostigDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TownCrierDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/TownCrierDialogue$1.class new file mode 100644 index 000000000..10119eeb1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TownCrierDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TownCrierDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TownCrierDialogue.class new file mode 100644 index 000000000..11ce5a997 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TownCrierDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TraderCrewmemberDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TraderCrewmemberDialogue.class new file mode 100644 index 000000000..9408db4de Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TraderCrewmemberDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TraibornDialogue$1.class b/Server/build/classes/java/main/core/game/content/dialogue/TraibornDialogue$1.class new file mode 100644 index 000000000..88e025727 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TraibornDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TraibornDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TraibornDialogue.class new file mode 100644 index 000000000..64212ea73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TraibornDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/TrampDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/TrampDialogue.class new file mode 100644 index 000000000..0225f45b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/TrampDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/UliziusDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/UliziusDialogue.class new file mode 100644 index 000000000..1140a1223 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/UliziusDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ValaineDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ValaineDialogue.class new file mode 100644 index 000000000..5b1d52829 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ValaineDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/VanessaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/VanessaDialogue.class new file mode 100644 index 000000000..e004197e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/VanessaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/VanstromKlause.class b/Server/build/classes/java/main/core/game/content/dialogue/VanstromKlause.class new file mode 100644 index 000000000..609627d10 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/VanstromKlause.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/VelorinaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/VelorinaDialogue.class new file mode 100644 index 000000000..d315d6b9f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/VelorinaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/VenenatisSpiderlingDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/VenenatisSpiderlingDialogue.class new file mode 100644 index 000000000..78ac85111 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/VenenatisSpiderlingDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/VeronicaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/VeronicaDialogue.class new file mode 100644 index 000000000..b77f7666d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/VeronicaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/VetionJRDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/VetionJRDialogue.class new file mode 100644 index 000000000..6b57131de Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/VetionJRDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/WayneDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/WayneDialogue.class new file mode 100644 index 000000000..af5231972 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/WayneDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/WhiteKnightDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/WhiteKnightDialoguePlugin.class new file mode 100644 index 000000000..f9e497552 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/WhiteKnightDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/WiloughDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/WiloughDialogue.class new file mode 100644 index 000000000..96a8aecbe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/WiloughDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/WiseOldManDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/WiseOldManDialogue.class new file mode 100644 index 000000000..eccb94c2e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/WiseOldManDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/WoodsmanTutorDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/WoodsmanTutorDialogue.class new file mode 100644 index 000000000..442672e28 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/WoodsmanTutorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/WydinDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/WydinDialogue.class new file mode 100644 index 000000000..5c74ee419 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/WydinDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/YadvigaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/YadvigaDialogue.class new file mode 100644 index 000000000..bffd7d891 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/YadvigaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/YuriDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/YuriDialogue.class new file mode 100644 index 000000000..9971f6f85 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/YuriDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ZahwaDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ZahwaDialogue.class new file mode 100644 index 000000000..4a79b05fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ZahwaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ZamboDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ZamboDialogue.class new file mode 100644 index 000000000..fec202686 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ZamboDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ZekeDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ZekeDialogue.class new file mode 100644 index 000000000..d67aa8264 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ZekeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/ZilyanaJRDialogue.class b/Server/build/classes/java/main/core/game/content/dialogue/ZilyanaJRDialogue.class new file mode 100644 index 000000000..5a38da2c4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/ZilyanaJRDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/book/Book.class b/Server/build/classes/java/main/core/game/content/dialogue/book/Book.class new file mode 100644 index 000000000..8c0178764 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/book/Book.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/book/BookLine.class b/Server/build/classes/java/main/core/game/content/dialogue/book/BookLine.class new file mode 100644 index 000000000..83617c242 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/book/BookLine.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/book/GrimDiary.class b/Server/build/classes/java/main/core/game/content/dialogue/book/GrimDiary.class new file mode 100644 index 000000000..d52ebd5f5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/book/GrimDiary.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/book/KeldagrimRuleBook.class b/Server/build/classes/java/main/core/game/content/dialogue/book/KeldagrimRuleBook.class new file mode 100644 index 000000000..7ed355e49 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/book/KeldagrimRuleBook.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/book/Page.class b/Server/build/classes/java/main/core/game/content/dialogue/book/Page.class new file mode 100644 index 000000000..c31e75f3b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/book/Page.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/book/PageSet.class b/Server/build/classes/java/main/core/game/content/dialogue/book/PageSet.class new file mode 100644 index 000000000..cefb4c698 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/book/PageSet.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/book/SecurityBookPlugin.class b/Server/build/classes/java/main/core/game/content/dialogue/book/SecurityBookPlugin.class new file mode 100644 index 000000000..6db9e688f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/book/SecurityBookPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/dialogue/book/StrongholdNotes.class b/Server/build/classes/java/main/core/game/content/dialogue/book/StrongholdNotes.class new file mode 100644 index 000000000..e5a1b5950 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/dialogue/book/StrongholdNotes.class differ diff --git a/Server/build/classes/java/main/core/game/content/eco/EcoStatus.class b/Server/build/classes/java/main/core/game/content/eco/EcoStatus.class new file mode 100644 index 000000000..879c51763 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/eco/EcoStatus.class differ diff --git a/Server/build/classes/java/main/core/game/content/eco/EconomyManagement.class b/Server/build/classes/java/main/core/game/content/eco/EconomyManagement.class new file mode 100644 index 000000000..afb34375a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/eco/EconomyManagement.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/BirdNest.class b/Server/build/classes/java/main/core/game/content/global/BirdNest.class new file mode 100644 index 000000000..9e8d2d856 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/BirdNest.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/Bones.class b/Server/build/classes/java/main/core/game/content/global/Bones.class new file mode 100644 index 000000000..65b3f0352 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/Bones.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/BossKillCounter.class b/Server/build/classes/java/main/core/game/content/global/BossKillCounter.class new file mode 100644 index 000000000..287e6ca19 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/BossKillCounter.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/Dyes.class b/Server/build/classes/java/main/core/game/content/global/Dyes.class new file mode 100644 index 000000000..f78fe7df7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/Dyes.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/EnchantedJewellery$1.class b/Server/build/classes/java/main/core/game/content/global/EnchantedJewellery$1.class new file mode 100644 index 000000000..3494b0b7a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/EnchantedJewellery$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/EnchantedJewellery.class b/Server/build/classes/java/main/core/game/content/global/EnchantedJewellery.class new file mode 100644 index 000000000..c5d1b0a05 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/EnchantedJewellery.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/GodBook.class b/Server/build/classes/java/main/core/game/content/global/GodBook.class new file mode 100644 index 000000000..30fc10333 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/GodBook.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/GodType$1$1.class b/Server/build/classes/java/main/core/game/content/global/GodType$1$1.class new file mode 100644 index 000000000..23ba20d3e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/GodType$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/GodType$1.class b/Server/build/classes/java/main/core/game/content/global/GodType$1.class new file mode 100644 index 000000000..c93ac63b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/GodType$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/GodType.class b/Server/build/classes/java/main/core/game/content/global/GodType.class new file mode 100644 index 000000000..61b796333 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/GodType.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/Lamps.class b/Server/build/classes/java/main/core/game/content/global/Lamps.class new file mode 100644 index 000000000..6153a805b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/Lamps.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/LightSource.class b/Server/build/classes/java/main/core/game/content/global/LightSource.class new file mode 100644 index 000000000..f0f43efa2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/LightSource.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/RepairItem.class b/Server/build/classes/java/main/core/game/content/global/RepairItem.class new file mode 100644 index 000000000..90ae230b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/RepairItem.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/Skillcape.class b/Server/build/classes/java/main/core/game/content/global/Skillcape.class new file mode 100644 index 000000000..913c0c5c2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/Skillcape.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/SkillcapePerks.class b/Server/build/classes/java/main/core/game/content/global/SkillcapePerks.class new file mode 100644 index 000000000..45d49be42 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/SkillcapePerks.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/SkillingPets.class b/Server/build/classes/java/main/core/game/content/global/SkillingPets.class new file mode 100644 index 000000000..85c14280e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/SkillingPets.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$1.class b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$1.class new file mode 100644 index 000000000..bc5948c30 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$ClimbDialogue$1.class b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$ClimbDialogue$1.class new file mode 100644 index 000000000..1e4e0a245 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$ClimbDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$ClimbDialogue$2.class b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$ClimbDialogue$2.class new file mode 100644 index 000000000..a7aebfab5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$ClimbDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$ClimbDialogue.class b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$ClimbDialogue.class new file mode 100644 index 000000000..c935ace07 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler$ClimbDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler.class b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler.class new file mode 100644 index 000000000..93d0383a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/ClimbActionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/DigAction.class b/Server/build/classes/java/main/core/game/content/global/action/DigAction.class new file mode 100644 index 000000000..066f70dd5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/DigAction.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/DigSpadeHandler$1.class b/Server/build/classes/java/main/core/game/content/global/action/DigSpadeHandler$1.class new file mode 100644 index 000000000..dfc63e82d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/DigSpadeHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/DigSpadeHandler.class b/Server/build/classes/java/main/core/game/content/global/action/DigSpadeHandler.class new file mode 100644 index 000000000..f563ea88f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/DigSpadeHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler$1.class b/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler$1.class new file mode 100644 index 000000000..d423233a9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler$2.class b/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler$2.class new file mode 100644 index 000000000..1078fc34b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler$3.class b/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler$3.class new file mode 100644 index 000000000..73adbbf0f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler.class b/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler.class new file mode 100644 index 000000000..475262ca3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/DoorActionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/DropItemHandler.class b/Server/build/classes/java/main/core/game/content/global/action/DropItemHandler.class new file mode 100644 index 000000000..4a9294b3d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/DropItemHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/EquipHandler.class b/Server/build/classes/java/main/core/game/content/global/action/EquipHandler.class new file mode 100644 index 000000000..ed2cbed02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/EquipHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/LadderAchievementCheck.class b/Server/build/classes/java/main/core/game/content/global/action/LadderAchievementCheck.class new file mode 100644 index 000000000..68e9bac28 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/LadderAchievementCheck.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/SpecialLadders$1.class b/Server/build/classes/java/main/core/game/content/global/action/SpecialLadders$1.class new file mode 100644 index 000000000..989e841d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/SpecialLadders$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/SpecialLadders$2.class b/Server/build/classes/java/main/core/game/content/global/action/SpecialLadders$2.class new file mode 100644 index 000000000..c2222896c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/SpecialLadders$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/action/SpecialLadders.class b/Server/build/classes/java/main/core/game/content/global/action/SpecialLadders.class new file mode 100644 index 000000000..9110f9434 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/action/SpecialLadders.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/presets/Preset.class b/Server/build/classes/java/main/core/game/content/global/presets/Preset.class new file mode 100644 index 000000000..d4fc85737 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/presets/Preset.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/presets/PresetManager.class b/Server/build/classes/java/main/core/game/content/global/presets/PresetManager.class new file mode 100644 index 000000000..1bc6d9238 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/presets/PresetManager.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/report/AbuseReport.class b/Server/build/classes/java/main/core/game/content/global/report/AbuseReport.class new file mode 100644 index 000000000..8665ff31a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/report/AbuseReport.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/report/Rule.class b/Server/build/classes/java/main/core/game/content/global/report/Rule.class new file mode 100644 index 000000000..4169c8ee4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/report/Rule.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/shop/Shop.class b/Server/build/classes/java/main/core/game/content/global/shop/Shop.class new file mode 100644 index 000000000..3cac1c1b2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/shop/Shop.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/shop/ShopViewer$ShopCloseEvent.class b/Server/build/classes/java/main/core/game/content/global/shop/ShopViewer$ShopCloseEvent.class new file mode 100644 index 000000000..3c2834d76 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/shop/ShopViewer$ShopCloseEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/shop/ShopViewer.class b/Server/build/classes/java/main/core/game/content/global/shop/ShopViewer.class new file mode 100644 index 000000000..298231fa4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/shop/ShopViewer.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/MinigameGroupFinder$MinigameOptions.class b/Server/build/classes/java/main/core/game/content/global/travel/MinigameGroupFinder$MinigameOptions.class new file mode 100644 index 000000000..7354faaa0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/MinigameGroupFinder$MinigameOptions.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/MinigameGroupFinder.class b/Server/build/classes/java/main/core/game/content/global/travel/MinigameGroupFinder.class new file mode 100644 index 000000000..2b94f8b27 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/MinigameGroupFinder.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/canoe/Canoe.class b/Server/build/classes/java/main/core/game/content/global/travel/canoe/Canoe.class new file mode 100644 index 000000000..f84797666 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/canoe/Canoe.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$1.class b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$1.class new file mode 100644 index 000000000..3e0a09d2a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$2.class b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$2.class new file mode 100644 index 000000000..2ef8cab44 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$3.class b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$3.class new file mode 100644 index 000000000..972c6f433 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$4.class b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$4.class new file mode 100644 index 000000000..13da76a6f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$5.class b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$5.class new file mode 100644 index 000000000..e7bbbe3eb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension.class b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension.class new file mode 100644 index 000000000..0e6e4605b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeExtension.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeStation$1.class b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeStation$1.class new file mode 100644 index 000000000..0da67e20c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeStation$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeStation.class b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeStation.class new file mode 100644 index 000000000..260ec1613 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/canoe/CanoeStation.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/glider/GliderPulse.class b/Server/build/classes/java/main/core/game/content/global/travel/glider/GliderPulse.class new file mode 100644 index 000000000..05100fed6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/glider/GliderPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/glider/Gliders.class b/Server/build/classes/java/main/core/game/content/global/travel/glider/Gliders.class new file mode 100644 index 000000000..6e5f7207c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/glider/Gliders.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipCharter$Destination$1.class b/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipCharter$Destination$1.class new file mode 100644 index 000000000..a3adc76d8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipCharter$Destination$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipCharter$Destination.class b/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipCharter$Destination.class new file mode 100644 index 000000000..0acbf151d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipCharter$Destination.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipCharter.class b/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipCharter.class new file mode 100644 index 000000000..28dc69537 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipCharter.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipTravelPulse.class b/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipTravelPulse.class new file mode 100644 index 000000000..645ef64e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/ship/ShipTravelPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/travel/ship/Ships.class b/Server/build/classes/java/main/core/game/content/global/travel/ship/Ships.class new file mode 100644 index 000000000..7b7b00f4c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/travel/ship/Ships.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ScoreboardEntry.class b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ScoreboardEntry.class new file mode 100644 index 000000000..292f0668a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ScoreboardEntry.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ScoreboardHandler.class b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ScoreboardHandler.class new file mode 100644 index 000000000..534aa917b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ScoreboardHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ScoreboardManager.class b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ScoreboardManager.class new file mode 100644 index 000000000..1a6d81bbf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ScoreboardManager.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ShootingStarScoreboard.class b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ShootingStarScoreboard.class new file mode 100644 index 000000000..aec5561d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/ShootingStarScoreboard.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/StarChartPlugin$StarChartOptions.class b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/StarChartPlugin$StarChartOptions.class new file mode 100644 index 000000000..6b43583d2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/StarChartPlugin$StarChartOptions.class differ diff --git a/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/StarChartPlugin.class b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/StarChartPlugin.class new file mode 100644 index 000000000..a4136bf76 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/global/worldevents/shootingstar/StarChartPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/HolidayEvent.class b/Server/build/classes/java/main/core/game/content/holiday/HolidayEvent.class new file mode 100644 index 000000000..40196fe40 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/HolidayEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/HolidayItem$1.class b/Server/build/classes/java/main/core/game/content/holiday/HolidayItem$1.class new file mode 100644 index 000000000..1a99c7978 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/HolidayItem$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/HolidayItem.class b/Server/build/classes/java/main/core/game/content/holiday/HolidayItem.class new file mode 100644 index 000000000..2661977ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/HolidayItem.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/HolidayType.class b/Server/build/classes/java/main/core/game/content/holiday/HolidayType.class new file mode 100644 index 000000000..a98759539 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/HolidayType.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/ItemLimitation.class b/Server/build/classes/java/main/core/game/content/holiday/ItemLimitation.class new file mode 100644 index 000000000..120ff8a48 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/ItemLimitation.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$ChristmasEventOptionPlugin$1.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$ChristmasEventOptionPlugin$1.class new file mode 100644 index 000000000..2c80f9619 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$ChristmasEventOptionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$ChristmasEventOptionPlugin.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$ChristmasEventOptionPlugin.class new file mode 100644 index 000000000..fc9d2bd4d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$ChristmasEventOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$PeltOptionHandler$1.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$PeltOptionHandler$1.class new file mode 100644 index 000000000..2be2620e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$PeltOptionHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$PeltOptionHandler.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$PeltOptionHandler.class new file mode 100644 index 000000000..695bb1259 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$PeltOptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$QueenOfSnowDialogue.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$QueenOfSnowDialogue.class new file mode 100644 index 000000000..2a5d2c373 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$QueenOfSnowDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowImpDialogue.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowImpDialogue.class new file mode 100644 index 000000000..25641749e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowImpDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowballItemPlugin.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowballItemPlugin.class new file mode 100644 index 000000000..39c9ddb17 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowballItemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanHatComponentPlugin.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanHatComponentPlugin.class new file mode 100644 index 000000000..4fd469068 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanHatComponentPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanItemHandler$1.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanItemHandler$1.class new file mode 100644 index 000000000..3db09d3ff Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanItemHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanItemHandler$SnowmanDialogue.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanItemHandler$SnowmanDialogue.class new file mode 100644 index 000000000..a9b3beeae Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanItemHandler$SnowmanDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanItemHandler.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanItemHandler.class new file mode 100644 index 000000000..389e009e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanItemHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanNPC.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanNPC.class new file mode 100644 index 000000000..c734e745a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent$SnowmanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent.class b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent.class new file mode 100644 index 000000000..651afa214 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/christmas/ChristmasEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$BasketofEggsPlugin.class b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$BasketofEggsPlugin.class new file mode 100644 index 000000000..c241769a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$BasketofEggsPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$ChocolateEggPlugin.class b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$ChocolateEggPlugin.class new file mode 100644 index 000000000..63be4f298 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$ChocolateEggPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterBunnyDialogue$1.class b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterBunnyDialogue$1.class new file mode 100644 index 000000000..b492419a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterBunnyDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterBunnyDialogue$2.class b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterBunnyDialogue$2.class new file mode 100644 index 000000000..671c4faad Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterBunnyDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterBunnyDialogue.class b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterBunnyDialogue.class new file mode 100644 index 000000000..87a5d8593 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterBunnyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterItemPlugin.class b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterItemPlugin.class new file mode 100644 index 000000000..5249035a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$EasterItemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$RubberchickenPlugin.class b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$RubberchickenPlugin.class new file mode 100644 index 000000000..94f1eac26 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent$RubberchickenPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent.class b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent.class new file mode 100644 index 000000000..6ba1e04b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/easter/BasketofEggsEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$1.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$1.class new file mode 100644 index 000000000..547565fa7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$10.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$10.class new file mode 100644 index 000000000..f099a8f1c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$10.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$2.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$2.class new file mode 100644 index 000000000..241155654 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$3.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$3.class new file mode 100644 index 000000000..40116cb57 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$4.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$4.class new file mode 100644 index 000000000..07aa38c64 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$5.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$5.class new file mode 100644 index 000000000..e9eaf79f2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$6.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$6.class new file mode 100644 index 000000000..d15c5d91d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$6.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$7.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$7.class new file mode 100644 index 000000000..578dce4ab Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$7.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$8.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$8.class new file mode 100644 index 000000000..e75cfb662 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$8.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$9.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$9.class new file mode 100644 index 000000000..58dcacde6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$9.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DarkPortalHandler$DarkPortalDialogue$1.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DarkPortalHandler$DarkPortalDialogue$1.class new file mode 100644 index 000000000..99d13f71c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DarkPortalHandler$DarkPortalDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DarkPortalHandler$DarkPortalDialogue.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DarkPortalHandler$DarkPortalDialogue.class new file mode 100644 index 000000000..3fa9b6742 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DarkPortalHandler$DarkPortalDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DarkPortalHandler.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DarkPortalHandler.class new file mode 100644 index 000000000..954605879 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DarkPortalHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DeathPortalZone.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DeathPortalZone.class new file mode 100644 index 000000000..a6ec5b637 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$DeathPortalZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimItem.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimItem.class new file mode 100644 index 000000000..cfae51827 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimItem.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimItemHandler.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimItemHandler.class new file mode 100644 index 000000000..cf0c56988 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimItemHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimReaperDialogue$1.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimReaperDialogue$1.class new file mode 100644 index 000000000..0676041ef Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimReaperDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimReaperDialogue.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimReaperDialogue.class new file mode 100644 index 000000000..8ee60eaf6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$GrimReaperDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue$1.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue$1.class new file mode 100644 index 000000000..9af506005 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue$2.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue$2.class new file mode 100644 index 000000000..88c009303 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue$3.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue$3.class new file mode 100644 index 000000000..cbf905f65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue.class new file mode 100644 index 000000000..f1d849f6c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherNPC.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherNPC.class new file mode 100644 index 000000000..993f9791d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent$MuncherNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent.class b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent.class new file mode 100644 index 000000000..9c2d1c9c0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/holiday/halloween/DeathMansionEvent.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/PluginInteraction.class b/Server/build/classes/java/main/core/game/content/quest/PluginInteraction.class new file mode 100644 index 000000000..3ff2ac9a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/PluginInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/PluginInteractionManager$1.class b/Server/build/classes/java/main/core/game/content/quest/PluginInteractionManager$1.class new file mode 100644 index 000000000..0880ad5a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/PluginInteractionManager$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/PluginInteractionManager$InteractionType.class b/Server/build/classes/java/main/core/game/content/quest/PluginInteractionManager$InteractionType.class new file mode 100644 index 000000000..ac81e494f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/PluginInteractionManager$InteractionType.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/PluginInteractionManager.class b/Server/build/classes/java/main/core/game/content/quest/PluginInteractionManager.class new file mode 100644 index 000000000..1d7599097 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/PluginInteractionManager.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/DoricsQuest.class b/Server/build/classes/java/main/core/game/content/quest/free/DoricsQuest.class new file mode 100644 index 000000000..5347088d3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/DoricsQuest.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/ErnestTheChicken$ErnestChickenNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/ErnestTheChicken$ErnestChickenNPC.class new file mode 100644 index 000000000..7a21a3abe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/ErnestTheChicken$ErnestChickenNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/ErnestTheChicken$ErnestNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/ErnestTheChicken$ErnestNPC.class new file mode 100644 index 000000000..7347ad941 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/ErnestTheChicken$ErnestNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/ErnestTheChicken.class b/Server/build/classes/java/main/core/game/content/quest/free/ErnestTheChicken.class new file mode 100644 index 000000000..429d88e9b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/ErnestTheChicken.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/ImpCatcher.class b/Server/build/classes/java/main/core/game/content/quest/free/ImpCatcher.class new file mode 100644 index 000000000..017d89097 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/ImpCatcher.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/RomeoJuliet.class b/Server/build/classes/java/main/core/game/content/quest/free/RomeoJuliet.class new file mode 100644 index 000000000..af5a53373 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/RomeoJuliet.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/RuneMysteries.class b/Server/build/classes/java/main/core/game/content/quest/free/RuneMysteries.class new file mode 100644 index 000000000..9e6e37f62 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/RuneMysteries.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/SheepShearer.class b/Server/build/classes/java/main/core/game/content/quest/free/SheepShearer.class new file mode 100644 index 000000000..d5167c8ae Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/SheepShearer.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/TheKnightsSword.class b/Server/build/classes/java/main/core/game/content/quest/free/TheKnightsSword.class new file mode 100644 index 000000000..bf7ec5bd8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/TheKnightsSword.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/VampireSlayer.class b/Server/build/classes/java/main/core/game/content/quest/free/VampireSlayer.class new file mode 100644 index 000000000..1b39d2276 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/VampireSlayer.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/WitchsPotion.class b/Server/build/classes/java/main/core/game/content/quest/free/WitchsPotion.class new file mode 100644 index 000000000..89d2b05a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/WitchsPotion.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKCabbagePlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKCabbagePlugin.class new file mode 100644 index 000000000..6039e9249 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKCabbagePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin$1.class new file mode 100644 index 000000000..73fecfd0a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin$2.class b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin$2.class new file mode 100644 index 000000000..2cf586112 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin.class new file mode 100644 index 000000000..54d2d9f8d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.class b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.class new file mode 100644 index 000000000..986f1b518 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/SirAmikVarzeDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/SirAmikVarzeDialogue.class new file mode 100644 index 000000000..4258e1d9e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/blackknightsfortress/SirAmikVarzeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DSlayerDrainPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DSlayerDrainPlugin.class new file mode 100644 index 000000000..621ab16e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DSlayerDrainPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayer$CaptainRovinDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayer$CaptainRovinDialogue.class new file mode 100644 index 000000000..10d3b1526 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayer$CaptainRovinDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayer.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayer.class new file mode 100644 index 000000000..0fc452030 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayer.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DarkWizardNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DarkWizardNPC.class new file mode 100644 index 000000000..b32f5bc30 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DarkWizardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DelrithDialoguePlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DelrithDialoguePlugin$1.class new file mode 100644 index 000000000..a52c2565b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DelrithDialoguePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DelrithDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DelrithDialoguePlugin.class new file mode 100644 index 000000000..092fb7cf7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DelrithDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DelrithNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DelrithNPC.class new file mode 100644 index 000000000..ea5347932 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DelrithNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DenathDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DenathDialogue$1.class new file mode 100644 index 000000000..6f4b74ef3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DenathDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DenathDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DenathDialogue.class new file mode 100644 index 000000000..3d0458d04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene$DenathDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene.class new file mode 100644 index 000000000..d52e5a35d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.class new file mode 100644 index 000000000..25ee36d20 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/GypsyArisDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/GypsyArisDialogue$1.class new file mode 100644 index 000000000..658a73ab2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/GypsyArisDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/GypsyArisDialogue$2.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/GypsyArisDialogue$2.class new file mode 100644 index 000000000..58201121e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/GypsyArisDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/GypsyArisDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/GypsyArisDialogue.class new file mode 100644 index 000000000..9bc87be58 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/GypsyArisDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/SirPyrsinDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/SirPyrsinDialogue$1.class new file mode 100644 index 000000000..44c9f54bf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/SirPyrsinDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/SirPyrsinDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/SirPyrsinDialogue.class new file mode 100644 index 000000000..5174ece38 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/SirPyrsinDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/TraibornDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/TraibornDialogue$1.class new file mode 100644 index 000000000..cb5060f11 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/TraibornDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/TraibornDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/TraibornDialogue.class new file mode 100644 index 000000000..95944868d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/TraibornDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/WallyCutscenePlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/WallyCutscenePlugin.class new file mode 100644 index 000000000..2256fe8a0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/demonslayer/WallyCutscenePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/CrandorMapPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/CrandorMapPlugin.class new file mode 100644 index 000000000..a203dbd39 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/CrandorMapPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DSChestDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DSChestDialogue.class new file mode 100644 index 000000000..30cf95cb3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DSChestDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DSMagicDoorPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DSMagicDoorPlugin.class new file mode 100644 index 000000000..4144aeea4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DSMagicDoorPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DSNedNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DSNedNPC.class new file mode 100644 index 000000000..63b354350 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DSNedNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayer$1.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayer$1.class new file mode 100644 index 000000000..f7802514b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayer$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayer.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayer.class new file mode 100644 index 000000000..fee73b1b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayer.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$1.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$1.class new file mode 100644 index 000000000..60a76d00b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$BobingPulse.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$BobingPulse.class new file mode 100644 index 000000000..8d0856da5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$BobingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$1.class new file mode 100644 index 000000000..5d83b2c4b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$2.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$2.class new file mode 100644 index 000000000..449e8b1df Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$3.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$3.class new file mode 100644 index 000000000..70c0eaf95 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$4.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$4.class new file mode 100644 index 000000000..079bcfe6d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$5.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$5.class new file mode 100644 index 000000000..2bcbb5ae2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$6.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$6.class new file mode 100644 index 000000000..b0b45cf28 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue$6.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue.class new file mode 100644 index 000000000..c6d83eabe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene$DSNedDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene.class new file mode 100644 index 000000000..8f50dbe86 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.class new file mode 100644 index 000000000..d12b6ab19 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DukeHoracioDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DukeHoracioDialogue.class new file mode 100644 index 000000000..e6a76d9de Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/DukeHoracioDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$1.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$1.class new file mode 100644 index 000000000..4093c9b10 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$2.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$2.class new file mode 100644 index 000000000..68b713add Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$3.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$3.class new file mode 100644 index 000000000..330e724d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$ElvargCombatSwingHandler.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$ElvargCombatSwingHandler.class new file mode 100644 index 000000000..18b2102ad Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC$ElvargCombatSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC.class new file mode 100644 index 000000000..78d2db079 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ElvargNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/GuildmasterDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/GuildmasterDialogue.class new file mode 100644 index 000000000..6b9ac7845 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/GuildmasterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeDemonNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeDemonNPC.class new file mode 100644 index 000000000..9ccca9a19 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeDemonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeGhostNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeGhostNPC.class new file mode 100644 index 000000000..1f1206845 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeGhostNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeSkeletonNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeSkeletonNPC.class new file mode 100644 index 000000000..1f4d9d084 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeSkeletonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeZombieNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeZombieNPC.class new file mode 100644 index 000000000..ea6991d1d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MazeZombieNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MeldarMadNPC$MeldarSwingHandler.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MeldarMadNPC$MeldarSwingHandler.class new file mode 100644 index 000000000..52ea14c50 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MeldarMadNPC$MeldarSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MeldarMadNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MeldarMadNPC.class new file mode 100644 index 000000000..25e6a4a71 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/MeldarMadNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/NedDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/NedDialogue.class new file mode 100644 index 000000000..82cc47eb9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/NedDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/OziachDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/OziachDialogue.class new file mode 100644 index 000000000..613a5f74f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/OziachDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/WormbrainDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/WormbrainDialogue.class new file mode 100644 index 000000000..993301065 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/WormbrainDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/WormbrainNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/WormbrainNPC.class new file mode 100644 index 000000000..ed6433b83 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/WormbrainNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ZombieRatNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ZombieRatNPC.class new file mode 100644 index 000000000..c06faf4d2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/dragonslayer/ZombieRatNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene$GoblinGeneralDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene$GoblinGeneralDialogue$1.class new file mode 100644 index 000000000..1b5868818 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene$GoblinGeneralDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene$GoblinGeneralDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene$GoblinGeneralDialogue.class new file mode 100644 index 000000000..54fa0aa58 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene$GoblinGeneralDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene.class new file mode 100644 index 000000000..b759c8d43 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.class new file mode 100644 index 000000000..9157959d0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin$GoblinMailPlugin$Dyes.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin$GoblinMailPlugin$Dyes.class new file mode 100644 index 000000000..f82bafac0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin$GoblinMailPlugin$Dyes.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin$GoblinMailPlugin$GoblinMail.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin$GoblinMailPlugin$GoblinMail.class new file mode 100644 index 000000000..bb01e56b2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin$GoblinMailPlugin$GoblinMail.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin$GoblinMailPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin$GoblinMailPlugin.class new file mode 100644 index 000000000..4365d0298 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin$GoblinMailPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.class new file mode 100644 index 000000000..f2b615345 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GrubFoot.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GrubFoot.class new file mode 100644 index 000000000..352f3c329 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GrubFoot.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GrubfootDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GrubfootDialogue.class new file mode 100644 index 000000000..26bb891fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/goblindiplomacy/GrubfootDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/piratestreasure/PiratesTreasure.class b/Server/build/classes/java/main/core/game/content/quest/free/piratestreasure/PiratesTreasure.class new file mode 100644 index 000000000..06a101554 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/piratestreasure/PiratesTreasure.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/piratestreasure/PiratesTreasurePlugin$TreasureDigPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/piratestreasure/PiratesTreasurePlugin$TreasureDigPlugin.class new file mode 100644 index 000000000..4da30ea6e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/piratestreasure/PiratesTreasurePlugin$TreasureDigPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/piratestreasure/PiratesTreasurePlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/piratestreasure/PiratesTreasurePlugin.class new file mode 100644 index 000000000..01a61b699 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/piratestreasure/PiratesTreasurePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/LadyKeliDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/LadyKeliDialogue.class new file mode 100644 index 000000000..33d8934b7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/LadyKeliDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/LadyKeliNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/LadyKeliNPC.class new file mode 100644 index 000000000..b4d319204 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/LadyKeliNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/PrinceAliRescue.class b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/PrinceAliRescue.class new file mode 100644 index 000000000..845b03258 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/PrinceAliRescue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/PrinceAliRescuePlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/PrinceAliRescuePlugin.class new file mode 100644 index 000000000..9a9f8da1b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/PrinceAliRescuePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/WigDyePlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/WigDyePlugin.class new file mode 100644 index 000000000..b5baaa805 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/princealirescue/WigDyePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/CertificatePlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/CertificatePlugin.class new file mode 100644 index 000000000..6245ae005 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/CertificatePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/CuratorHaigHalenDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/CuratorHaigHalenDialogue.class new file mode 100644 index 000000000..3c8ca7fc3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/CuratorHaigHalenDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/JohnnyBeardNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/JohnnyBeardNPC.class new file mode 100644 index 000000000..dc3d0a2d5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/JohnnyBeardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/JonnytheBeardPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/JonnytheBeardPlugin.class new file mode 100644 index 000000000..6ea35959e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/JonnytheBeardPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/KatrineDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/KatrineDialogue.class new file mode 100644 index 000000000..bbbfaf7bf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/KatrineDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/KingRoaldDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/KingRoaldDialogue.class new file mode 100644 index 000000000..ccb1972f1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/KingRoaldDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ReldoDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ReldoDialogue.class new file mode 100644 index 000000000..93afd68cb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ReldoDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ShieldArravPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ShieldArravPlugin.class new file mode 100644 index 000000000..b46a846ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ShieldArravPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ShieldofArrav.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ShieldofArrav.class new file mode 100644 index 000000000..2ab86037d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ShieldofArrav.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ShieldofArravBook.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ShieldofArravBook.class new file mode 100644 index 000000000..d9d49155b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/ShieldofArravBook.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/StravenDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/StravenDialogue.class new file mode 100644 index 000000000..cf9854d17 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/StravenDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/WeaponsMasterDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/WeaponsMasterDialogue.class new file mode 100644 index 000000000..29a1f0e7c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/shieldofarrav/WeaponsMasterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/FatherAereckDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/FatherAereckDialogue.class new file mode 100644 index 000000000..7046a89a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/FatherAereckDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/FatherUhrneyDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/FatherUhrneyDialogue.class new file mode 100644 index 000000000..3d0c0e429 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/FatherUhrneyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhost.class b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhost.class new file mode 100644 index 000000000..cab43fabf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhost.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostDialogue.class b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostDialogue.class new file mode 100644 index 000000000..717430fc5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin$1.class new file mode 100644 index 000000000..f2a713887 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin$RestlessGhostNPC.class b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin$RestlessGhostNPC.class new file mode 100644 index 000000000..29915f5c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin$RestlessGhostNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.class new file mode 100644 index 000000000..0cfc0abd0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostSkull.class b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostSkull.class new file mode 100644 index 000000000..72f2a033a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/RestlessGhostSkull.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/SkullDropPlugin.class b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/SkullDropPlugin.class new file mode 100644 index 000000000..b0396fc43 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/free/therestlessghost/SkullDropPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/DruidicRitual$1.class b/Server/build/classes/java/main/core/game/content/quest/members/DruidicRitual$1.class new file mode 100644 index 000000000..3aaa454cd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/DruidicRitual$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/DruidicRitual.class b/Server/build/classes/java/main/core/game/content/quest/members/DruidicRitual.class new file mode 100644 index 000000000..108a6132d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/DruidicRitual.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/GertrudesCat.class b/Server/build/classes/java/main/core/game/content/quest/members/GertrudesCat.class new file mode 100644 index 000000000..f3a042cb8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/GertrudesCat.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/PriestInPeril.class b/Server/build/classes/java/main/core/game/content/quest/members/PriestInPeril.class new file mode 100644 index 000000000..5e0ed5884 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/PriestInPeril.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/WolfWhistle.class b/Server/build/classes/java/main/core/game/content/quest/members/WolfWhistle.class new file mode 100644 index 000000000..ab34111fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/WolfWhistle.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceDialogue.class new file mode 100644 index 000000000..041598620 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$1.class new file mode 100644 index 000000000..ed6cdf690 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$2.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$2.class new file mode 100644 index 000000000..6f19c0ae0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$3.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$3.class new file mode 100644 index 000000000..5eaca6a8b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$4.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$4.class new file mode 100644 index 000000000..38310127c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$5.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$5.class new file mode 100644 index 000000000..2226670e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$ChickenCatchScene.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$ChickenCatchScene.class new file mode 100644 index 000000000..3c5539d06 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue$ChickenCatchScene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.class new file mode 100644 index 000000000..32a893c23 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.class new file mode 100644 index 000000000..96ee4420b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$1.class new file mode 100644 index 000000000..40c1b9f06 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$ContainerHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$ContainerHandler.class new file mode 100644 index 000000000..2f82bf623 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$ContainerHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$HammerMagnetPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$HammerMagnetPlugin$1.class new file mode 100644 index 000000000..ae23a361e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$HammerMagnetPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$HammerMagnetPlugin$2.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$HammerMagnetPlugin$2.class new file mode 100644 index 000000000..e066d7b69 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$HammerMagnetPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$HammerMagnetPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$HammerMagnetPlugin.class new file mode 100644 index 000000000..b888ed157 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$HammerMagnetPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$ResearchNoteHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$ResearchNoteHandler.class new file mode 100644 index 000000000..8e6f25c94 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$ResearchNoteHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$UndeadTreePlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$UndeadTreePlugin$1.class new file mode 100644 index 000000000..0b71e5a3f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$UndeadTreePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$UndeadTreePlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$UndeadTreePlugin.class new file mode 100644 index 000000000..026fc1f9a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin$UndeadTreePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.class new file mode 100644 index 000000000..2bc9cf7c2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AvaDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AvaDialogue.class new file mode 100644 index 000000000..b6ae598bf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AvaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin$DisableDevicePlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin$DisableDevicePlugin.class new file mode 100644 index 000000000..067ce1aec Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin$DisableDevicePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.class new file mode 100644 index 000000000..1469e528a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/OldCronDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/OldCronDialogue.class new file mode 100644 index 000000000..693d3cca3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/OldCronDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/WitchDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/WitchDialogue.class new file mode 100644 index 000000000..879cdeea6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/animalmagnetism/WitchDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBane$JournalEntries.class b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBane$JournalEntries.class new file mode 100644 index 000000000..bfede4d9b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBane$JournalEntries.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBane.class b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBane.class new file mode 100644 index 000000000..da35e8aac Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBane.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin$1$1.class b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin$1$1.class new file mode 100644 index 000000000..5d963089f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin$1.class new file mode 100644 index 000000000..8378c1730 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin$SoulsBaneRiftRopeHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin$SoulsBaneRiftRopeHandler.class new file mode 100644 index 000000000..2bf268178 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin$SoulsBaneRiftRopeHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin.class new file mode 100644 index 000000000..b813d470f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CannonBallPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CannonBallPlugin$1.class new file mode 100644 index 000000000..1d52c6438 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CannonBallPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CannonBallPlugin$CannonBallPulse.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CannonBallPlugin$CannonBallPulse.class new file mode 100644 index 000000000..8cca0b50c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CannonBallPlugin$CannonBallPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CannonBallPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CannonBallPlugin.class new file mode 100644 index 000000000..08704df3e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CannonBallPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CaptainLawgofDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CaptainLawgofDialogue.class new file mode 100644 index 000000000..97dddd460 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CaptainLawgofDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CaptainLawgofNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CaptainLawgofNPC.class new file mode 100644 index 000000000..b4599ea25 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/CaptainLawgofNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannon.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannon.class new file mode 100644 index 000000000..fc22db364 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannon.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$1.class new file mode 100644 index 000000000..2d7bd2373 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$2$1.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$2$1.class new file mode 100644 index 000000000..8834fe64c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$2.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$2.class new file mode 100644 index 000000000..6d4d6513c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$3.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$3.class new file mode 100644 index 000000000..95c75a731 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$4.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$4.class new file mode 100644 index 000000000..f2f3712bb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler$1.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler$1.class new file mode 100644 index 000000000..a5bb10a1b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler$Part.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler$Part.class new file mode 100644 index 000000000..d7a12912a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler$Part.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler$Tool.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler$Tool.class new file mode 100644 index 000000000..717b1fd04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler$Tool.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler.class new file mode 100644 index 000000000..acc10e50c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin$ToolKitHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin.class new file mode 100644 index 000000000..c183915b6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/LollkDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/LollkDialogue.class new file mode 100644 index 000000000..429c3ff99 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/LollkDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/NulodionDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/NulodionDialogue.class new file mode 100644 index 000000000..28036a922 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/dwarfcannon/NulodionDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/BigDaveDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/BigDaveDialogue.class new file mode 100644 index 000000000..45aa17da5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/BigDaveDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/BonzoDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/BonzoDialogue.class new file mode 100644 index 000000000..632839ccb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/BonzoDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/DwarfDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/DwarfDialogue.class new file mode 100644 index 000000000..3ab58cf4f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/DwarfDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FenceInteraction$1.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FenceInteraction$1.class new file mode 100644 index 000000000..0c42477b7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FenceInteraction$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FenceInteraction$SqueezePulse.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FenceInteraction$SqueezePulse.class new file mode 100644 index 000000000..23a8e1043 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FenceInteraction$SqueezePulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FenceInteraction.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FenceInteraction.class new file mode 100644 index 000000000..7a7eb55a0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FenceInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContest.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContest.class new file mode 100644 index 000000000..9840387e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContest.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$1.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$1.class new file mode 100644 index 000000000..7fa243d24 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$FishingPulse$1.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$FishingPulse$1.class new file mode 100644 index 000000000..6db393413 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$FishingPulse$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$FishingPulse.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$FishingPulse.class new file mode 100644 index 000000000..0c3db620e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$FishingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse$1.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse$1.class new file mode 100644 index 000000000..82b49c3f9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse$2.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse$2.class new file mode 100644 index 000000000..33a1701e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse$3.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse$3.class new file mode 100644 index 000000000..251d543cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse.class new file mode 100644 index 000000000..a3eca558f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene$SwitchPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene.class new file mode 100644 index 000000000..4dfa5840c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingContestCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$1.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$1.class new file mode 100644 index 000000000..050e0c530 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$2.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$2.class new file mode 100644 index 000000000..d3ecf782f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$3.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$3.class new file mode 100644 index 000000000..14dcd8653 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$4.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$4.class new file mode 100644 index 000000000..20c3ba34b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.class new file mode 100644 index 000000000..4dc097918 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/ForesterDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/ForesterDialogue.class new file mode 100644 index 000000000..258413dda Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/ForesterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction$1.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction$1.class new file mode 100644 index 000000000..5f2d2280b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction$2.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction$2.class new file mode 100644 index 000000000..94500eec6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.class new file mode 100644 index 000000000..4f3ad0412 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GateInteraction$1.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GateInteraction$1.class new file mode 100644 index 000000000..2806df2b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GateInteraction$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GateInteraction$2.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GateInteraction$2.class new file mode 100644 index 000000000..d31306ad4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GateInteraction$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GateInteraction.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GateInteraction.class new file mode 100644 index 000000000..efebd5c38 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/GateInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/JoshuaDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/JoshuaDialogue.class new file mode 100644 index 000000000..49aaa2f54 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/JoshuaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/MorrisDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/MorrisDialogue.class new file mode 100644 index 000000000..8425b987e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/MorrisDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/SinisterStrangerDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/SinisterStrangerDialogue.class new file mode 100644 index 000000000..1f27282f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/SinisterStrangerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/StairInteraction$1.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/StairInteraction$1.class new file mode 100644 index 000000000..d6e57cd9f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/StairInteraction$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/StairInteraction.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/StairInteraction.class new file mode 100644 index 000000000..7f2e47a46 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/StairInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/VineInteraction$1.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/VineInteraction$1.class new file mode 100644 index 000000000..adc0cd759 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/VineInteraction$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/VineInteraction.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/VineInteraction.class new file mode 100644 index 000000000..5ee3f80d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/VineInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/grandpaJack.class b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/grandpaJack.class new file mode 100644 index 000000000..ae0a8e35d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/fishingcontest/grandpaJack.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/icthlarinslittlehelper/WandererDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/icthlarinslittlehelper/WandererDialogue.class new file mode 100644 index 000000000..f1bf583af Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/icthlarinslittlehelper/WandererDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$1.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$1.class new file mode 100644 index 000000000..43ac5e854 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$1$1.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$1$1.class new file mode 100644 index 000000000..d389e43fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$1.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$1.class new file mode 100644 index 000000000..9ca7ab2bf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$2$1.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$2$1.class new file mode 100644 index 000000000..4066b506c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$2.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$2.class new file mode 100644 index 000000000..2bd9c4cd3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective.class new file mode 100644 index 000000000..65e939b67 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion$JungleObjective.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion.class new file mode 100644 index 000000000..7d7bc57d3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotion.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotionPlugin$JogreCavernDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotionPlugin$JogreCavernDialogue.class new file mode 100644 index 000000000..350a6596a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotionPlugin$JogreCavernDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotionPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotionPlugin.class new file mode 100644 index 000000000..7bee1a868 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/JunglePotionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/TrufitusDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/TrufitusDialogue.class new file mode 100644 index 000000000..621040fc8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/junglepotion/TrufitusDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/lostcity/DramenStaffPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/DramenStaffPlugin.class new file mode 100644 index 000000000..5fa19af28 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/DramenStaffPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/lostcity/LostCity.class b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/LostCity.class new file mode 100644 index 000000000..3cce82379 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/LostCity.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/lostcity/LostCityPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/LostCityPlugin$1.class new file mode 100644 index 000000000..2fa46dbc2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/LostCityPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/lostcity/LostCityPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/LostCityPlugin.class new file mode 100644 index 000000000..d9bbe1edb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/LostCityPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/lostcity/ShamusDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/ShamusDialogue.class new file mode 100644 index 000000000..69ef1ab82 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/ShamusDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/lostcity/TreeSpiritNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/TreeSpiritNPC.class new file mode 100644 index 000000000..cee8b7fa2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/TreeSpiritNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/lostcity/WarriorDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/WarriorDialogue.class new file mode 100644 index 000000000..731d1e151 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/lostcity/WarriorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/ArheinShopDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/ArheinShopDialogue.class new file mode 100644 index 000000000..76f93b930 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/ArheinShopDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/BeggarDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/BeggarDialogue.class new file mode 100644 index 000000000..8efbd7005 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/BeggarDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue$1.class new file mode 100644 index 000000000..04e0da477 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.class new file mode 100644 index 000000000..293869565 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/CrateCutscenePlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/CrateCutscenePlugin.class new file mode 100644 index 000000000..0deea37c0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/CrateCutscenePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/KingArthurDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/KingArthurDialogue.class new file mode 100644 index 000000000..903d24cf3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/KingArthurDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystal.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystal.class new file mode 100644 index 000000000..e0088a049 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystal.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalOptionPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalOptionPlugin.class new file mode 100644 index 000000000..d789eb844 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$1.class new file mode 100644 index 000000000..e1a3581bc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$BeggarNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$BeggarNPC.class new file mode 100644 index 000000000..81a0ab07e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$BeggarNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$MerlinCrystalDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$MerlinCrystalDialogue.class new file mode 100644 index 000000000..c83aed36e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$MerlinCrystalDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$MerlinCrystalItemHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$MerlinCrystalItemHandler.class new file mode 100644 index 000000000..86dc44dc3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$MerlinCrystalItemHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$ThrantaxNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$ThrantaxNPC.class new file mode 100644 index 000000000..c9aa9a4c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin$ThrantaxNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.class new file mode 100644 index 000000000..2a4c1bda9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/RenegadeKnightDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/RenegadeKnightDialogue.class new file mode 100644 index 000000000..dc6138007 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/RenegadeKnightDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirGawainDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirGawainDialogue.class new file mode 100644 index 000000000..358fdf932 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirGawainDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirKayDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirKayDialogue.class new file mode 100644 index 000000000..177ae0d1f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirKayDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirLancelotDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirLancelotDialogue.class new file mode 100644 index 000000000..743ab76ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirLancelotDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirLucan.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirLucan.class new file mode 100644 index 000000000..c600d5b8e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirLucan.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirMordredNPC$1.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirMordredNPC$1.class new file mode 100644 index 000000000..aefeb1c0a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirMordredNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirMordredNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirMordredNPC.class new file mode 100644 index 000000000..bc8fa0c65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirMordredNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirPalomedes.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirPalomedes.class new file mode 100644 index 000000000..e80aa4f5c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/SirPalomedes.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.class new file mode 100644 index 000000000..d52123460 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/ThrantaxDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/ThrantaxDialogue.class new file mode 100644 index 000000000..91cea3932 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/merlinscrystal/ThrantaxDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/ElunedDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/ElunedDialogue.class new file mode 100644 index 000000000..123733794 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/ElunedDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/IslwynDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/IslwynDialogue.class new file mode 100644 index 000000000..886ae428f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/IslwynDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC$1.class b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC$1.class new file mode 100644 index 000000000..a2a5f1b99 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.class new file mode 100644 index 000000000..088dda394 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElves.class b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElves.class new file mode 100644 index 000000000..5c71a7c87 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElves.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElvesObstacles.class b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElvesObstacles.class new file mode 100644 index 000000000..9862c3b7b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElvesObstacles.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElvesPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElvesPlugin$1.class new file mode 100644 index 000000000..f0fb5b734 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElvesPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElvesPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElvesPlugin.class new file mode 100644 index 000000000..76de9bd21 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/rovingelves/RovingElvesPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/GateInteractionHandler$1.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/GateInteractionHandler$1.class new file mode 100644 index 000000000..af720c440 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/GateInteractionHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/GateInteractionHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/GateInteractionHandler.class new file mode 100644 index 000000000..ac2cc2ffc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/GateInteractionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HalgriveDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HalgriveDialogue.class new file mode 100644 index 000000000..7b80f4d99 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HalgriveDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HerderSheepNPC$1.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HerderSheepNPC$1.class new file mode 100644 index 000000000..d2b2e7e39 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HerderSheepNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HerderSheepNPC$2.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HerderSheepNPC$2.class new file mode 100644 index 000000000..fc572eaf7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HerderSheepNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HerderSheepNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HerderSheepNPC.class new file mode 100644 index 000000000..edfdda37d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/HerderSheepNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/IncineratorHandler$1.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/IncineratorHandler$1.class new file mode 100644 index 000000000..ece6555cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/IncineratorHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/IncineratorHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/IncineratorHandler.class new file mode 100644 index 000000000..a50c0cb3b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/IncineratorHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/OrbonDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/OrbonDialogue.class new file mode 100644 index 000000000..58bcd833f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/OrbonDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/ProdActionHandler$1.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/ProdActionHandler$1.class new file mode 100644 index 000000000..ae0ef97b7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/ProdActionHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/ProdActionHandler$2.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/ProdActionHandler$2.class new file mode 100644 index 000000000..58b478f31 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/ProdActionHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/ProdActionHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/ProdActionHandler.class new file mode 100644 index 000000000..0f3c0c3af Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/ProdActionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepHerder.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepHerder.class new file mode 100644 index 000000000..4e35612b3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepHerder.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepPoisonHandler$1.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepPoisonHandler$1.class new file mode 100644 index 000000000..d637990b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepPoisonHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepPoisonHandler$2.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepPoisonHandler$2.class new file mode 100644 index 000000000..ad32a50b3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepPoisonHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepPoisonHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepPoisonHandler.class new file mode 100644 index 000000000..cc9fc1d18 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/sheepherder/SheepPoisonHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AlShabimDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AlShabimDialogue.class new file mode 100644 index 000000000..bab819857 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AlShabimDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue$1.class new file mode 100644 index 000000000..e64bbf0dc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue$AnaBarrelHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue$AnaBarrelHandler.class new file mode 100644 index 000000000..cf219c388 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue$AnaBarrelHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue$AnaNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue$AnaNPC.class new file mode 100644 index 000000000..ece3c3f17 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue$AnaNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue.class new file mode 100644 index 000000000..5f3bc13ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/AnaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/BedabinNomadDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/BedabinNomadDialogue.class new file mode 100644 index 000000000..c14c6da36 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/BedabinNomadDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/CaptainSiadDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/CaptainSiadDialogue.class new file mode 100644 index 000000000..41ba8902e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/CaptainSiadDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/DesertGuardDialogue$DesertGuardNPC$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/DesertGuardDialogue$DesertGuardNPC$1.class new file mode 100644 index 000000000..d630aec15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/DesertGuardDialogue$DesertGuardNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/DesertGuardDialogue$DesertGuardNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/DesertGuardDialogue$DesertGuardNPC.class new file mode 100644 index 000000000..2aec2aa7b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/DesertGuardDialogue$DesertGuardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.class new file mode 100644 index 000000000..3e548dccd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/IrenaDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/IrenaDialogue.class new file mode 100644 index 000000000..4880fc363 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/IrenaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MaleSlaveDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MaleSlaveDialogue$1.class new file mode 100644 index 000000000..57e0c9a70 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MaleSlaveDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MaleSlaveDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MaleSlaveDialogue.class new file mode 100644 index 000000000..296c28021 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MaleSlaveDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue$MercenaryCaptain.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue$MercenaryCaptain.class new file mode 100644 index 000000000..4bc54b46a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue$MercenaryCaptain.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.class new file mode 100644 index 000000000..338ec8f75 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MercenaryDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MercenaryDialogue.class new file mode 100644 index 000000000..606608447 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MercenaryDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MineSlaveNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MineSlaveNPC.class new file mode 100644 index 000000000..959d109a6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MineSlaveNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MinecartDriverDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MinecartDriverDialogue.class new file mode 100644 index 000000000..54adea179 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MinecartDriverDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MiningCampZone$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MiningCampZone$1.class new file mode 100644 index 000000000..41258bce5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MiningCampZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MiningCampZone.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MiningCampZone.class new file mode 100644 index 000000000..fb38656e9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/MiningCampZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/RowdySlaveNPC$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/RowdySlaveNPC$1.class new file mode 100644 index 000000000..2f1126abe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/RowdySlaveNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.class new file mode 100644 index 000000000..9c944dfbf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrap$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrap$1.class new file mode 100644 index 000000000..029778c0a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrap$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrap.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrap.class new file mode 100644 index 000000000..7ac333ab3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrap.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$1.class new file mode 100644 index 000000000..f517b592e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$2.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$2.class new file mode 100644 index 000000000..ff4a14197 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$3.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$3.class new file mode 100644 index 000000000..1f8bdd872 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$4.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$4.class new file mode 100644 index 000000000..3cbcfef81 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$5.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$5.class new file mode 100644 index 000000000..7f9dfa043 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$6.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$6.class new file mode 100644 index 000000000..b163642a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$6.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler$1.class new file mode 100644 index 000000000..33f0483c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler$AnnaCartCutscene$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler$AnnaCartCutscene$1.class new file mode 100644 index 000000000..c46329455 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler$AnnaCartCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler$AnnaCartCutscene.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler$AnnaCartCutscene.class new file mode 100644 index 000000000..cd30fed94 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler$AnnaCartCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler.class new file mode 100644 index 000000000..44037b628 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$AnnaCartHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BarrelDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BarrelDialogue$1.class new file mode 100644 index 000000000..08c77b08a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BarrelDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BarrelDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BarrelDialogue.class new file mode 100644 index 000000000..225cc29d3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BarrelDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$AnnaWinchHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$AnnaWinchHandler.class new file mode 100644 index 000000000..39031c955 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$AnnaWinchHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$BedabinAnvilDialogue$ProtoTypePulse.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$BedabinAnvilDialogue$ProtoTypePulse.class new file mode 100644 index 000000000..81453c720 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$BedabinAnvilDialogue$ProtoTypePulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$BedabinAnvilDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$BedabinAnvilDialogue.class new file mode 100644 index 000000000..5b8ffb450 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$BedabinAnvilDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$PrototypeDartHandler$ProtoTypeDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$PrototypeDartHandler$ProtoTypeDialogue.class new file mode 100644 index 000000000..910a7480a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$PrototypeDartHandler$ProtoTypeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$PrototypeDartHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$PrototypeDartHandler.class new file mode 100644 index 000000000..349ac26f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler$PrototypeDartHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler.class new file mode 100644 index 000000000..c4a1706dc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinAnvilHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinKeyHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinKeyHandler.class new file mode 100644 index 000000000..65ff18771 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$BedabinKeyHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$CartDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$CartDialogue$1.class new file mode 100644 index 000000000..efda93a51 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$CartDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$CartDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$CartDialogue.class new file mode 100644 index 000000000..10fcc24b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$CartDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue$1.class new file mode 100644 index 000000000..3244860e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue$MiningCartCutscene$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue$MiningCartCutscene$1.class new file mode 100644 index 000000000..6a5ac5985 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue$MiningCartCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue$MiningCartCutscene.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue$MiningCartCutscene.class new file mode 100644 index 000000000..aacc855d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue$MiningCartCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue.class new file mode 100644 index 000000000..41eb559f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$MineCartDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$WinchCutscene$1.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$WinchCutscene$1.class new file mode 100644 index 000000000..60050c720 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$WinchCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$WinchCutscene.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$WinchCutscene.class new file mode 100644 index 000000000..f1da37b0f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$WinchCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$WinchDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$WinchDialogue.class new file mode 100644 index 000000000..6187d5d01 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin$WinchDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.class new file mode 100644 index 000000000..5451a0307 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/AlmeraDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/AlmeraDialogue.class new file mode 100644 index 000000000..9a291217b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/AlmeraDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/BookOnBaxtorianPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/BookOnBaxtorianPlugin.class new file mode 100644 index 000000000..7d4d9b124 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/BookOnBaxtorianPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/GolrieDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/GolrieDialogue.class new file mode 100644 index 000000000..c8d8d2a0d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/GolrieDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/HadleyDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/HadleyDialogue.class new file mode 100644 index 000000000..bea5bb3a6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/HadleyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/HudonDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/HudonDialogue.class new file mode 100644 index 000000000..a04c73997 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/HudonDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterFall.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterFall.class new file mode 100644 index 000000000..fbd8a3efe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterFall.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$1.class new file mode 100644 index 000000000..d117c1dc5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$2.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$2.class new file mode 100644 index 000000000..db2aee64b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$3.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$3.class new file mode 100644 index 000000000..bb95630a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$4.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$4.class new file mode 100644 index 000000000..ccc9be8e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$1$1.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$1$1.class new file mode 100644 index 000000000..72c9a3493 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$1.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$1.class new file mode 100644 index 000000000..6a54781c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$2.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$2.class new file mode 100644 index 000000000..70dda4b74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$3.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$3.class new file mode 100644 index 000000000..00e671b69 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$4.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$4.class new file mode 100644 index 000000000..f52881746 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$5.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$5.class new file mode 100644 index 000000000..bd1f337b3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler.class new file mode 100644 index 000000000..3c511eecd Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin$WaterfallUseWithHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin.class new file mode 100644 index 000000000..ac7748a4f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallTreeDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallTreeDialogue$1.class new file mode 100644 index 000000000..4763eec73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallTreeDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallTreeDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallTreeDialogue.class new file mode 100644 index 000000000..912d042fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/waterfallquest/WaterfallTreeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/AnnaJonesDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/AnnaJonesDialogue.class new file mode 100644 index 000000000..627720bda Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/AnnaJonesDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/KingRoaldNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/KingRoaldNPC.class new file mode 100644 index 000000000..c42087fe9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/KingRoaldNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/OutlawNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/OutlawNPC.class new file mode 100644 index 000000000..3da30a11c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/OutlawNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.class new file mode 100644 index 000000000..82bc1984c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.class new file mode 100644 index 000000000..da2a557ef Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$1.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$1.class new file mode 100644 index 000000000..37bc479e6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$2.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$2.class new file mode 100644 index 000000000..9c08d72ac Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$3.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$3.class new file mode 100644 index 000000000..f6e4874f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$4.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$4.class new file mode 100644 index 000000000..06167e505 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$5.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$5.class new file mode 100644 index 000000000..116ff83af Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$6.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$6.class new file mode 100644 index 000000000..f90888b7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene$6.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene.class new file mode 100644 index 000000000..4116d0908 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin$1.class new file mode 100644 index 000000000..513991262 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin$FolderHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin$FolderHandler.class new file mode 100644 index 000000000..7f77bbc0d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin$FolderHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin$MetalWandHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin$MetalWandHandler.class new file mode 100644 index 000000000..3d036673b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin$MetalWandHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.class new file mode 100644 index 000000000..1cf313240 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.class b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.class new file mode 100644 index 000000000..35cdf2dcb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/BallInteraction$1.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/BallInteraction$1.class new file mode 100644 index 000000000..4d73b9e8a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/BallInteraction$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/BallInteraction.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/BallInteraction.class new file mode 100644 index 000000000..978c66e54 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/BallInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/BoyDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/BoyDialoguePlugin.class new file mode 100644 index 000000000..1c2b6e132 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/BoyDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/MouseNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/MouseNPC.class new file mode 100644 index 000000000..1feac168b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/MouseNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/NoraTHaggNPC$1.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/NoraTHaggNPC$1.class new file mode 100644 index 000000000..38be08c88 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/NoraTHaggNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/NoraTHaggNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/NoraTHaggNPC.class new file mode 100644 index 000000000..006863756 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/NoraTHaggNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsDiaryBook.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsDiaryBook.class new file mode 100644 index 000000000..e92c24bae Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsDiaryBook.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsExperimentNPC$ExperimentType$1.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsExperimentNPC$ExperimentType$1.class new file mode 100644 index 000000000..2465261bc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsExperimentNPC$ExperimentType$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsExperimentNPC$ExperimentType.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsExperimentNPC$ExperimentType.class new file mode 100644 index 000000000..40bb9b608 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsExperimentNPC$ExperimentType.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.class new file mode 100644 index 000000000..44ce26904 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHouse.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHouse.class new file mode 100644 index 000000000..bb6bce804 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHouse.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin$1.class new file mode 100644 index 000000000..d1a175ca2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin$WitchsHouseUseWithHandler$1.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin$WitchsHouseUseWithHandler$1.class new file mode 100644 index 000000000..48de32a69 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin$WitchsHouseUseWithHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin$WitchsHouseUseWithHandler.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin$WitchsHouseUseWithHandler.class new file mode 100644 index 000000000..c8746c913 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin$WitchsHouseUseWithHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin.class b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin.class new file mode 100644 index 000000000..0840ff8e7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/members/witchshouse/WitchsHousePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue$1.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue$1.class new file mode 100644 index 000000000..cd36e8f9b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.class new file mode 100644 index 000000000..f22605dcc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.class new file mode 100644 index 000000000..c0e1f1b2a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$1.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$1.class new file mode 100644 index 000000000..1b349a60c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$1.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$1.class new file mode 100644 index 000000000..8b17f149c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$10.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$10.class new file mode 100644 index 000000000..666162047 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$10.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$2.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$2.class new file mode 100644 index 000000000..16384c3cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$3.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$3.class new file mode 100644 index 000000000..91571a64f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$4.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$4.class new file mode 100644 index 000000000..46d82ee30 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$5.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$5.class new file mode 100644 index 000000000..9646a3430 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$6.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$6.class new file mode 100644 index 000000000..4db31146d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$6.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$7.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$7.class new file mode 100644 index 000000000..a5f051041 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$7.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$8.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$8.class new file mode 100644 index 000000000..16d6702a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$8.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$9$1.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$9$1.class new file mode 100644 index 000000000..7c012f3dc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$9$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$9.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$9.class new file mode 100644 index 000000000..0c5d5f396 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType$9.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType.class new file mode 100644 index 000000000..13a3d8940 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin$BarcrawlType.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin.class new file mode 100644 index 000000000..a86f243b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/DakhThoulanAegisDialogue.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/DakhThoulanAegisDialogue.class new file mode 100644 index 000000000..580800840 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/DakhThoulanAegisDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.class new file mode 100644 index 000000000..d907b2426 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/MishkalunDornDialogue.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/MishkalunDornDialogue.class new file mode 100644 index 000000000..d96aa14b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/MishkalunDornDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SilasDahcsnuDialogue.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SilasDahcsnuDialogue.class new file mode 100644 index 000000000..c30effb44 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SilasDahcsnuDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SurokMagisDialogue$SurokCutscene$SurokScene.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SurokMagisDialogue$SurokCutscene$SurokScene.class new file mode 100644 index 000000000..b1aef22c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SurokMagisDialogue$SurokCutscene$SurokScene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SurokMagisDialogue$SurokCutscene.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SurokMagisDialogue$SurokCutscene.class new file mode 100644 index 000000000..3a3888a15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SurokMagisDialogue$SurokCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SurokMagisDialogue.class b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SurokMagisDialogue.class new file mode 100644 index 000000000..ffc074c9d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/miniquest/surok/SurokMagisDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/CellarMapZone.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/CellarMapZone.class new file mode 100644 index 000000000..206661bf4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/CellarMapZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene$1.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene$1.class new file mode 100644 index 000000000..85bd8c365 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene$FightPulse.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene$FightPulse.class new file mode 100644 index 000000000..223758022 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene$FightPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene.class new file mode 100644 index 000000000..4c5cafcc3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/SirVantDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/SirVantDialogue.class new file mode 100644 index 000000000..d643f103b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/learningtheropes/SirVantDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/BasicStarter.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/BasicStarter.class new file mode 100644 index 000000000..db0649460 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/BasicStarter.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/BrotherBraceDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/BrotherBraceDialogue.class new file mode 100644 index 000000000..2b750a9cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/BrotherBraceDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CharacterDesign$1.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CharacterDesign$1.class new file mode 100644 index 000000000..539900b18 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CharacterDesign$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CharacterDesign$2.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CharacterDesign$2.class new file mode 100644 index 000000000..83777a1d4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CharacterDesign$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CharacterDesign.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CharacterDesign.class new file mode 100644 index 000000000..918ce8c24 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CharacterDesign.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CombatInstructorDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CombatInstructorDialogue.class new file mode 100644 index 000000000..61eccc93a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/CombatInstructorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/FinancialAdvisorDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/FinancialAdvisorDialogue.class new file mode 100644 index 000000000..ac1c1153d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/FinancialAdvisorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/MasterChefDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/MasterChefDialogue.class new file mode 100644 index 000000000..562f8fda5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/MasterChefDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/MiningInstructorDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/MiningInstructorDialogue.class new file mode 100644 index 000000000..35c880785 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/MiningInstructorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/QuestGuideDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/QuestGuideDialogue.class new file mode 100644 index 000000000..b91f7ecb1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/QuestGuideDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/RSGuideDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/RSGuideDialogue.class new file mode 100644 index 000000000..716658e05 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/RSGuideDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/SurvivalExpertDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/SurvivalExpertDialogue.class new file mode 100644 index 000000000..435a40be5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/SurvivalExpertDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialBook.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialBook.class new file mode 100644 index 000000000..b3633a6d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialBook.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialCompletionDialogue.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialCompletionDialogue.class new file mode 100644 index 000000000..17073c0fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialCompletionDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialIslandPlugin.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialIslandPlugin.class new file mode 100644 index 000000000..60d00f62d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialIslandPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialSession$DelayPulse.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialSession$DelayPulse.class new file mode 100644 index 000000000..c0580a07b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialSession$DelayPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialSession.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialSession.class new file mode 100644 index 000000000..b891176b7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialSession.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$1$1.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$1$1.class new file mode 100644 index 000000000..9183b4fb1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$1.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$1.class new file mode 100644 index 000000000..76e576451 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$10.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$10.class new file mode 100644 index 000000000..61d5069c4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$10.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$11.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$11.class new file mode 100644 index 000000000..e0ca6fcb8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$11.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$12.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$12.class new file mode 100644 index 000000000..e68ad7c6d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$12.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$13.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$13.class new file mode 100644 index 000000000..fae7b4ebb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$13.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$14.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$14.class new file mode 100644 index 000000000..a2dffe4f6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$14.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$15.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$15.class new file mode 100644 index 000000000..bf359d875 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$15.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$16.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$16.class new file mode 100644 index 000000000..bd588b8c9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$16.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$17.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$17.class new file mode 100644 index 000000000..607f28d98 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$17.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$18.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$18.class new file mode 100644 index 000000000..e9dd53c8c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$18.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$19.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$19.class new file mode 100644 index 000000000..6947a449e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$19.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$2.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$2.class new file mode 100644 index 000000000..8b36828ff Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$20.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$20.class new file mode 100644 index 000000000..57df5071c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$20.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$21.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$21.class new file mode 100644 index 000000000..f807fef53 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$21.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$22.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$22.class new file mode 100644 index 000000000..b76bdb963 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$22.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$23.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$23.class new file mode 100644 index 000000000..162fe0cbf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$23.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$24.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$24.class new file mode 100644 index 000000000..a8f2fa84c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$24.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$25.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$25.class new file mode 100644 index 000000000..d60b3d5e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$25.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$26.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$26.class new file mode 100644 index 000000000..868d7e079 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$26.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$27.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$27.class new file mode 100644 index 000000000..12ced2aa0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$27.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$28.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$28.class new file mode 100644 index 000000000..7bded268a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$28.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$29.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$29.class new file mode 100644 index 000000000..1462fa1a1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$29.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$3.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$3.class new file mode 100644 index 000000000..66f9ac4ae Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$30.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$30.class new file mode 100644 index 000000000..ba793fb6d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$30.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$31.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$31.class new file mode 100644 index 000000000..0fbaa2e03 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$31.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$32.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$32.class new file mode 100644 index 000000000..4ea8d317d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$32.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$33.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$33.class new file mode 100644 index 000000000..159624e15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$33.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$34.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$34.class new file mode 100644 index 000000000..4c5dbc518 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$34.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$35.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$35.class new file mode 100644 index 000000000..884b68437 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$35.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$36.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$36.class new file mode 100644 index 000000000..b69f4c2ad Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$36.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$37.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$37.class new file mode 100644 index 000000000..d2f7e792f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$37.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$38.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$38.class new file mode 100644 index 000000000..bac71d32b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$38.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$39.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$39.class new file mode 100644 index 000000000..ee5af9dba Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$39.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$4.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$4.class new file mode 100644 index 000000000..d975bf001 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$4.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$40.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$40.class new file mode 100644 index 000000000..c1be173c7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$40.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$41.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$41.class new file mode 100644 index 000000000..bfc8348a0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$41.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$42.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$42.class new file mode 100644 index 000000000..558ec994b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$42.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$43.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$43.class new file mode 100644 index 000000000..35cc7cc16 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$43.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$44.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$44.class new file mode 100644 index 000000000..a50c1f5d2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$44.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$45.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$45.class new file mode 100644 index 000000000..15e24ca63 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$45.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$46.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$46.class new file mode 100644 index 000000000..27571f994 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$46.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$47.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$47.class new file mode 100644 index 000000000..ee1183360 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$47.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$48.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$48.class new file mode 100644 index 000000000..687901f8f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$48.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$49.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$49.class new file mode 100644 index 000000000..330caee4d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$49.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$5.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$5.class new file mode 100644 index 000000000..51376873c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$5.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$50.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$50.class new file mode 100644 index 000000000..30df2f644 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$50.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$51.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$51.class new file mode 100644 index 000000000..1bf98a115 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$51.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$52.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$52.class new file mode 100644 index 000000000..25136756d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$52.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$53.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$53.class new file mode 100644 index 000000000..33ac40efe Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$53.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$54.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$54.class new file mode 100644 index 000000000..e5fbd1291 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$54.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$55.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$55.class new file mode 100644 index 000000000..42427946e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$55.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$56.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$56.class new file mode 100644 index 000000000..0595d371d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$56.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$57.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$57.class new file mode 100644 index 000000000..e2a262440 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$57.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$58.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$58.class new file mode 100644 index 000000000..81c05fd65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$58.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$59.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$59.class new file mode 100644 index 000000000..000d3c41b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$59.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$6.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$6.class new file mode 100644 index 000000000..c355fae74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$6.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$60.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$60.class new file mode 100644 index 000000000..2f5d428f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$60.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$61.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$61.class new file mode 100644 index 000000000..f33c1b00a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$61.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$62.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$62.class new file mode 100644 index 000000000..e226e305c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$62.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$63.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$63.class new file mode 100644 index 000000000..cc2eec05e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$63.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$64.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$64.class new file mode 100644 index 000000000..8d979b7e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$64.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$65.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$65.class new file mode 100644 index 000000000..907a88c32 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$65.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$66.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$66.class new file mode 100644 index 000000000..ab5184ed2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$66.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$67.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$67.class new file mode 100644 index 000000000..a32f9cb88 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$67.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$68.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$68.class new file mode 100644 index 000000000..7c53915f2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$68.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$69.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$69.class new file mode 100644 index 000000000..d54d7bbe8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$69.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$7.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$7.class new file mode 100644 index 000000000..f768b8d8e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$7.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$70.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$70.class new file mode 100644 index 000000000..d2f9e4189 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$70.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$71.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$71.class new file mode 100644 index 000000000..4f67f2544 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$71.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$72.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$72.class new file mode 100644 index 000000000..f3a694204 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$72.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$8.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$8.class new file mode 100644 index 000000000..1fc6ce8f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$8.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$9.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$9.class new file mode 100644 index 000000000..018fc503e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage$9.class differ diff --git a/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage.class b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage.class new file mode 100644 index 000000000..c6f530606 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/quest/tutorials/tutorialisland/TutorialStage.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/ClueLevel$1.class b/Server/build/classes/java/main/core/game/content/ttrail/ClueLevel$1.class new file mode 100644 index 000000000..8d1db94fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/ClueLevel$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/ClueLevel.class b/Server/build/classes/java/main/core/game/content/ttrail/ClueLevel.class new file mode 100644 index 000000000..8f64a55c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/ClueLevel.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/ClueScrollPlugin.class b/Server/build/classes/java/main/core/game/content/ttrail/ClueScrollPlugin.class new file mode 100644 index 000000000..45892e461 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/ClueScrollPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/CoordinateCluePlugin.class b/Server/build/classes/java/main/core/game/content/ttrail/CoordinateCluePlugin.class new file mode 100644 index 000000000..c5c147713 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/CoordinateCluePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/CoordinateClueScroll.class b/Server/build/classes/java/main/core/game/content/ttrail/CoordinateClueScroll.class new file mode 100644 index 000000000..f8a3d6547 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/CoordinateClueScroll.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/EmoteCluePlugin.class b/Server/build/classes/java/main/core/game/content/ttrail/EmoteCluePlugin.class new file mode 100644 index 000000000..e50869f0c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/EmoteCluePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/EmoteClueScroll.class b/Server/build/classes/java/main/core/game/content/ttrail/EmoteClueScroll.class new file mode 100644 index 000000000..add35200e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/EmoteClueScroll.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/MapCluePlugin.class b/Server/build/classes/java/main/core/game/content/ttrail/MapCluePlugin.class new file mode 100644 index 000000000..faf5604d2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/MapCluePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/MapClueScroll$MapDigAction.class b/Server/build/classes/java/main/core/game/content/ttrail/MapClueScroll$MapDigAction.class new file mode 100644 index 000000000..e909bd725 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/MapClueScroll$MapDigAction.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/MapClueScroll.class b/Server/build/classes/java/main/core/game/content/ttrail/MapClueScroll.class new file mode 100644 index 000000000..57754d642 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/MapClueScroll.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/SaradominWizardNPC.class b/Server/build/classes/java/main/core/game/content/ttrail/SaradominWizardNPC.class new file mode 100644 index 000000000..881e61848 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/SaradominWizardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailManager.class b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailManager.class new file mode 100644 index 000000000..8437ec1a9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailManager.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin$ClueItemPlugin.class b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin$ClueItemPlugin.class new file mode 100644 index 000000000..e67682581 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin$ClueItemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin$SextantComponentPlugin.class b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin$SextantComponentPlugin.class new file mode 100644 index 000000000..fb044eb27 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin$SextantComponentPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin$TTrailOptionHandler.class b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin$TTrailOptionHandler.class new file mode 100644 index 000000000..adc686c41 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin$TTrailOptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin.class b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin.class new file mode 100644 index 000000000..fda945af5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/TreasureTrailPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/UriNPC$UriDialogue.class b/Server/build/classes/java/main/core/game/content/ttrail/UriNPC$UriDialogue.class new file mode 100644 index 000000000..e32ecd914 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/UriNPC$UriDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/UriNPC.class b/Server/build/classes/java/main/core/game/content/ttrail/UriNPC.class new file mode 100644 index 000000000..23095b427 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/UriNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/ttrail/ZamorakWizardNPC.class b/Server/build/classes/java/main/core/game/content/ttrail/ZamorakWizardNPC.class new file mode 100644 index 000000000..d7834ddf9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/ttrail/ZamorakWizardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/CairnIslandZone.class b/Server/build/classes/java/main/core/game/content/zone/CairnIslandZone.class new file mode 100644 index 000000000..6dbba17ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/CairnIslandZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/ChaosTunnelZone$1.class b/Server/build/classes/java/main/core/game/content/zone/ChaosTunnelZone$1.class new file mode 100644 index 000000000..89d499d9f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/ChaosTunnelZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/ChaosTunnelZone.class b/Server/build/classes/java/main/core/game/content/zone/ChaosTunnelZone.class new file mode 100644 index 000000000..74a816a21 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/ChaosTunnelZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/CrandorZone.class b/Server/build/classes/java/main/core/game/content/zone/CrandorZone.class new file mode 100644 index 000000000..607e6bc48 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/CrandorZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/DesertZone$1.class b/Server/build/classes/java/main/core/game/content/zone/DesertZone$1.class new file mode 100644 index 000000000..2c41083a7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/DesertZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/DesertZone.class b/Server/build/classes/java/main/core/game/content/zone/DesertZone.class new file mode 100644 index 000000000..ec8a59953 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/DesertZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/DraynorMansionCourtyardZone.class b/Server/build/classes/java/main/core/game/content/zone/DraynorMansionCourtyardZone.class new file mode 100644 index 000000000..09b3dcda0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/DraynorMansionCourtyardZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/DraynorMarketZone.class b/Server/build/classes/java/main/core/game/content/zone/DraynorMarketZone.class new file mode 100644 index 000000000..42d3547c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/DraynorMarketZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/FredsFarmHouseZone.class b/Server/build/classes/java/main/core/game/content/zone/FredsFarmHouseZone.class new file mode 100644 index 000000000..3831dd21d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/FredsFarmHouseZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/IcePathZone$1.class b/Server/build/classes/java/main/core/game/content/zone/IcePathZone$1.class new file mode 100644 index 000000000..65c72cd45 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/IcePathZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/IcePathZone.class b/Server/build/classes/java/main/core/game/content/zone/IcePathZone.class new file mode 100644 index 000000000..e9ac19365 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/IcePathZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/TzhaarZone.class b/Server/build/classes/java/main/core/game/content/zone/TzhaarZone.class new file mode 100644 index 000000000..7b3e1081c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/TzhaarZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$1.class b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$1.class new file mode 100644 index 000000000..a7f194051 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$MandrithDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$MandrithDialoguePlugin.class new file mode 100644 index 000000000..0b943e997 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$MandrithDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$PilesDialoguePlugin.class b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$PilesDialoguePlugin.class new file mode 100644 index 000000000..172b27d7a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$PilesDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$PilesItemHandler.class b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$PilesItemHandler.class new file mode 100644 index 000000000..59cb6fbef Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$PilesItemHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$RuniteGolemMinePulse.class b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$RuniteGolemMinePulse.class new file mode 100644 index 000000000..07625ec89 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$RuniteGolemMinePulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$RuniteGolemNPC.class b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$RuniteGolemNPC.class new file mode 100644 index 000000000..f447012d3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone$RuniteGolemNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone.class b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone.class new file mode 100644 index 000000000..7d63a96a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/WildernessAreaZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/YanilleAgilityDungeon$1.class b/Server/build/classes/java/main/core/game/content/zone/YanilleAgilityDungeon$1.class new file mode 100644 index 000000000..e2e7b9fd5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/YanilleAgilityDungeon$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/YanilleAgilityDungeon$SalarinTwistedNPC.class b/Server/build/classes/java/main/core/game/content/zone/YanilleAgilityDungeon$SalarinTwistedNPC.class new file mode 100644 index 000000000..5cac4ae8b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/YanilleAgilityDungeon$SalarinTwistedNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/YanilleAgilityDungeon.class b/Server/build/classes/java/main/core/game/content/zone/YanilleAgilityDungeon.class new file mode 100644 index 000000000..f5b857736 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/YanilleAgilityDungeon.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/fremmenik/FremmenikPlugin.class b/Server/build/classes/java/main/core/game/content/zone/fremmenik/FremmenikPlugin.class new file mode 100644 index 000000000..c6258c3a1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/fremmenik/FremmenikPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/neitiznot/MawnisBurowgarDialogue.class b/Server/build/classes/java/main/core/game/content/zone/neitiznot/MawnisBurowgarDialogue.class new file mode 100644 index 000000000..cb7793c48 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/neitiznot/MawnisBurowgarDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/neitiznot/NeitiznotZone.class b/Server/build/classes/java/main/core/game/content/zone/neitiznot/NeitiznotZone.class new file mode 100644 index 000000000..f9230c7c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/neitiznot/NeitiznotZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/neitiznot/ThakkradYakDialogue.class b/Server/build/classes/java/main/core/game/content/zone/neitiznot/ThakkradYakDialogue.class new file mode 100644 index 000000000..77f813d70 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/neitiznot/ThakkradYakDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/neitiznot/YakArmourPlugin$1.class b/Server/build/classes/java/main/core/game/content/zone/neitiznot/YakArmourPlugin$1.class new file mode 100644 index 000000000..1511b6bc3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/neitiznot/YakArmourPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/neitiznot/YakArmourPlugin$YakArmourPulse.class b/Server/build/classes/java/main/core/game/content/zone/neitiznot/YakArmourPlugin$YakArmourPulse.class new file mode 100644 index 000000000..e09cfe970 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/neitiznot/YakArmourPlugin$YakArmourPulse.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/neitiznot/YakArmourPlugin.class b/Server/build/classes/java/main/core/game/content/zone/neitiznot/YakArmourPlugin.class new file mode 100644 index 000000000..9bd6e0f51 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/neitiznot/YakArmourPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/EctoplasmFillPlugin$1.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/EctoplasmFillPlugin$1.class new file mode 100644 index 000000000..46ba936ac Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/EctoplasmFillPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/EctoplasmFillPlugin.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/EctoplasmFillPlugin.class new file mode 100644 index 000000000..fbf79ec63 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/EctoplasmFillPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostDiscipleDialogue.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostDiscipleDialogue.class new file mode 100644 index 000000000..60f581a9f Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostDiscipleDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostInkeeperDialogue.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostInkeeperDialogue.class new file mode 100644 index 000000000..d40269c1b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostInkeeperDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostSailorDialogue.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostSailorDialogue.class new file mode 100644 index 000000000..ff6e526a6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostSailorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostVillagerDialogue.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostVillagerDialogue.class new file mode 100644 index 000000000..162bb4e70 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GhostVillagerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/GravingasNPC$GravingasDialogue.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GravingasNPC$GravingasDialogue.class new file mode 100644 index 000000000..cf95a3a7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GravingasNPC$GravingasDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/GravingasNPC.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GravingasNPC.class new file mode 100644 index 000000000..8af959bd7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/GravingasNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/NecrovarusDialogue.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/NecrovarusDialogue.class new file mode 100644 index 000000000..b7b233339 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/NecrovarusDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$1.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$1.class new file mode 100644 index 000000000..345b385f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$2.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$2.class new file mode 100644 index 000000000..9d14acca8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$3.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$3.class new file mode 100644 index 000000000..1b0a435e7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$3.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$BoneLoaderHandler.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$BoneLoaderHandler.class new file mode 100644 index 000000000..b8fbf753e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone$BoneLoaderHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone.class new file mode 100644 index 000000000..bc8fdb207 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/PhasmatysZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/phasmatys/TokenCollectOption.class b/Server/build/classes/java/main/core/game/content/zone/phasmatys/TokenCollectOption.class new file mode 100644 index 000000000..801565a7c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/phasmatys/TokenCollectOption.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/rellekka/JarvaldDialogue$1.class b/Server/build/classes/java/main/core/game/content/zone/rellekka/JarvaldDialogue$1.class new file mode 100644 index 000000000..8721e3a9c Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/rellekka/JarvaldDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/rellekka/JarvaldDialogue.class b/Server/build/classes/java/main/core/game/content/zone/rellekka/JarvaldDialogue.class new file mode 100644 index 000000000..35982127e Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/rellekka/JarvaldDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/rellekka/LightHousePlugin.class b/Server/build/classes/java/main/core/game/content/zone/rellekka/LightHousePlugin.class new file mode 100644 index 000000000..f41732204 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/rellekka/LightHousePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/rellekka/MariaGunnarsDialogue.class b/Server/build/classes/java/main/core/game/content/zone/rellekka/MariaGunnarsDialogue.class new file mode 100644 index 000000000..c99bcfdba Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/rellekka/MariaGunnarsDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone$1.class b/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone$1.class new file mode 100644 index 000000000..3600d5adb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone$2.class b/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone$2.class new file mode 100644 index 000000000..b467becf7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone$RellekaOptionHandler.class b/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone$RellekaOptionHandler.class new file mode 100644 index 000000000..73ba35119 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone$RellekaOptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone.class b/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone.class new file mode 100644 index 000000000..3c728373a Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/rellekka/RellekkaZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/rellekka/SailorDialogue.class b/Server/build/classes/java/main/core/game/content/zone/rellekka/SailorDialogue.class new file mode 100644 index 000000000..f5179bcea Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/rellekka/SailorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/DagannothKingNPC$DagType.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/DagannothKingNPC$DagType.class new file mode 100644 index 000000000..e63fa2a39 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/DagannothKingNPC$DagType.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/DagannothKingNPC.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/DagannothKingNPC.class new file mode 100644 index 000000000..34b40a8fb Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/DagannothKingNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/SpinolypNPC$SpinolpySwingHandler.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/SpinolypNPC$SpinolpySwingHandler.class new file mode 100644 index 000000000..e82327944 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/SpinolypNPC$SpinolpySwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/SpinolypNPC.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/SpinolypNPC.class new file mode 100644 index 000000000..085fe4b68 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/SpinolypNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$1$1.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$1$1.class new file mode 100644 index 000000000..0c07e2897 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$1.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$1.class new file mode 100644 index 000000000..db6816838 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$2.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$2.class new file mode 100644 index 000000000..78d1557bc Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$2.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$DoorSupportNPC.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$DoorSupportNPC.class new file mode 100644 index 000000000..1ffa7c28b Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$DoorSupportNPC.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$DungeonOptionHandler.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$DungeonOptionHandler.class new file mode 100644 index 000000000..9478554c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone$DungeonOptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone.class new file mode 100644 index 000000000..62f7acfbf Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthDungeonZone.class differ diff --git a/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthIslandZone.class b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthIslandZone.class new file mode 100644 index 000000000..b5e1268fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/content/zone/wbisland/WaterBirthIslandZone.class differ diff --git a/Server/build/classes/java/main/core/game/ge/BuyingLimitation.class b/Server/build/classes/java/main/core/game/ge/BuyingLimitation.class new file mode 100644 index 000000000..f06e92cb5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/ge/BuyingLimitation.class differ diff --git a/Server/build/classes/java/main/core/game/ge/GEGuidePrice$GuideItem.class b/Server/build/classes/java/main/core/game/ge/GEGuidePrice$GuideItem.class new file mode 100644 index 000000000..51fca7955 Binary files /dev/null and b/Server/build/classes/java/main/core/game/ge/GEGuidePrice$GuideItem.class differ diff --git a/Server/build/classes/java/main/core/game/ge/GEGuidePrice$GuideType.class b/Server/build/classes/java/main/core/game/ge/GEGuidePrice$GuideType.class new file mode 100644 index 000000000..34788ebe0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/ge/GEGuidePrice$GuideType.class differ diff --git a/Server/build/classes/java/main/core/game/ge/GEGuidePrice.class b/Server/build/classes/java/main/core/game/ge/GEGuidePrice.class new file mode 100644 index 000000000..f69b52bec Binary files /dev/null and b/Server/build/classes/java/main/core/game/ge/GEGuidePrice.class differ diff --git a/Server/build/classes/java/main/core/game/ge/GEItemSet.class b/Server/build/classes/java/main/core/game/ge/GEItemSet.class new file mode 100644 index 000000000..74946e780 Binary files /dev/null and b/Server/build/classes/java/main/core/game/ge/GEItemSet.class differ diff --git a/Server/build/classes/java/main/core/game/ge/GrandExchangeDatabase.class b/Server/build/classes/java/main/core/game/ge/GrandExchangeDatabase.class new file mode 100644 index 000000000..997631056 Binary files /dev/null and b/Server/build/classes/java/main/core/game/ge/GrandExchangeDatabase.class differ diff --git a/Server/build/classes/java/main/core/game/ge/GrandExchangeEntry.class b/Server/build/classes/java/main/core/game/ge/GrandExchangeEntry.class new file mode 100644 index 000000000..b7b698ab5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/ge/GrandExchangeEntry.class differ diff --git a/Server/build/classes/java/main/core/game/ge/OfferState.class b/Server/build/classes/java/main/core/game/ge/OfferState.class new file mode 100644 index 000000000..afbd3075c Binary files /dev/null and b/Server/build/classes/java/main/core/game/ge/OfferState.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/DestinationFlag$1.class b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$1.class new file mode 100644 index 000000000..acde36915 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/DestinationFlag$2.class b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$2.class new file mode 100644 index 000000000..134f0ed09 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/DestinationFlag$3.class b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$3.class new file mode 100644 index 000000000..e3f9df694 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/DestinationFlag$4.class b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$4.class new file mode 100644 index 000000000..85c7b9b34 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$4.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/DestinationFlag$5.class b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$5.class new file mode 100644 index 000000000..80d156d0d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/DestinationFlag$5.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/DestinationFlag.class b/Server/build/classes/java/main/core/game/interaction/DestinationFlag.class new file mode 100644 index 000000000..da8844c4c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/DestinationFlag.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/Interaction$1.class b/Server/build/classes/java/main/core/game/interaction/Interaction$1.class new file mode 100644 index 000000000..bd79f9baf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/Interaction$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/Interaction$2.class b/Server/build/classes/java/main/core/game/interaction/Interaction$2.class new file mode 100644 index 000000000..3dcb9b81e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/Interaction$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/Interaction$3.class b/Server/build/classes/java/main/core/game/interaction/Interaction$3.class new file mode 100644 index 000000000..51db0f77c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/Interaction$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/Interaction$4.class b/Server/build/classes/java/main/core/game/interaction/Interaction$4.class new file mode 100644 index 000000000..51cbcc984 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/Interaction$4.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/Interaction.class b/Server/build/classes/java/main/core/game/interaction/Interaction.class new file mode 100644 index 000000000..2bf375feb Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/Interaction.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/MovementPulse$1.class b/Server/build/classes/java/main/core/game/interaction/MovementPulse$1.class new file mode 100644 index 000000000..9b5936942 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/MovementPulse$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/MovementPulse.class b/Server/build/classes/java/main/core/game/interaction/MovementPulse.class new file mode 100644 index 000000000..ea32e232e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/MovementPulse.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/NodeUsageEvent.class b/Server/build/classes/java/main/core/game/interaction/NodeUsageEvent.class new file mode 100644 index 000000000..7b3608fd0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/NodeUsageEvent.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/Option.class b/Server/build/classes/java/main/core/game/interaction/Option.class new file mode 100644 index 000000000..aa29935ad Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/Option.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/OptionHandler.class b/Server/build/classes/java/main/core/game/interaction/OptionHandler.class new file mode 100644 index 000000000..843fa384f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/OptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/SpecialGroundInteraction.class b/Server/build/classes/java/main/core/game/interaction/SpecialGroundInteraction.class new file mode 100644 index 000000000..6ff67c07f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/SpecialGroundInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/SpecialGroundItems.class b/Server/build/classes/java/main/core/game/interaction/SpecialGroundItems.class new file mode 100644 index 000000000..86c46d911 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/SpecialGroundItems.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/UseWithHandler$1.class b/Server/build/classes/java/main/core/game/interaction/UseWithHandler$1.class new file mode 100644 index 000000000..ccba2a492 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/UseWithHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/UseWithHandler$2.class b/Server/build/classes/java/main/core/game/interaction/UseWithHandler$2.class new file mode 100644 index 000000000..5dfe14312 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/UseWithHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/UseWithHandler$3.class b/Server/build/classes/java/main/core/game/interaction/UseWithHandler$3.class new file mode 100644 index 000000000..f0d9fa606 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/UseWithHandler$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/UseWithHandler.class b/Server/build/classes/java/main/core/game/interaction/UseWithHandler.class new file mode 100644 index 000000000..249ecb09c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/UseWithHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/BedabinPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/BedabinPlugin.class new file mode 100644 index 000000000..82e4e0027 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/BedabinPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/BrimhavenDungeonPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/city/BrimhavenDungeonPlugin$1.class new file mode 100644 index 000000000..46bf44b2d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/BrimhavenDungeonPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/BrimhavenDungeonPlugin$2.class b/Server/build/classes/java/main/core/game/interaction/city/BrimhavenDungeonPlugin$2.class new file mode 100644 index 000000000..d3d1769a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/BrimhavenDungeonPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/BrimhavenDungeonPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/BrimhavenDungeonPlugin.class new file mode 100644 index 000000000..0a5b96fbc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/BrimhavenDungeonPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/BurthorpePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/BurthorpePlugin.class new file mode 100644 index 000000000..aa0ee3b95 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/BurthorpePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/CamelotNodePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/CamelotNodePlugin.class new file mode 100644 index 000000000..61567b7f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/CamelotNodePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/DraynorManorPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/city/DraynorManorPlugin$1.class new file mode 100644 index 000000000..cd0d5eff3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/DraynorManorPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/DraynorManorPlugin$2.class b/Server/build/classes/java/main/core/game/interaction/city/DraynorManorPlugin$2.class new file mode 100644 index 000000000..cc5bb0b25 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/DraynorManorPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/DraynorManorPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/DraynorManorPlugin.class new file mode 100644 index 000000000..4b593d369 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/DraynorManorPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin$TelescopeCutscene$1.class b/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin$TelescopeCutscene$1.class new file mode 100644 index 000000000..2a99c6208 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin$TelescopeCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin$TelescopeCutscene$EndDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin$TelescopeCutscene$EndDialogue.class new file mode 100644 index 000000000..9e1e86829 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin$TelescopeCutscene$EndDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin$TelescopeCutscene.class b/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin$TelescopeCutscene.class new file mode 100644 index 000000000..7652a1fdf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin$TelescopeCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin.class new file mode 100644 index 000000000..73fa4e4a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/DraynorNodePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/EdgevilleNodePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/EdgevilleNodePlugin.class new file mode 100644 index 000000000..dd0098cc5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/EdgevilleNodePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/EntranaObjectPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/EntranaObjectPlugin.class new file mode 100644 index 000000000..1988426a7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/EntranaObjectPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/FaladorNodePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/city/FaladorNodePlugin$1.class new file mode 100644 index 000000000..eb36382c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/FaladorNodePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/FaladorNodePlugin$2.class b/Server/build/classes/java/main/core/game/interaction/city/FaladorNodePlugin$2.class new file mode 100644 index 000000000..4ed996763 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/FaladorNodePlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/FaladorNodePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/FaladorNodePlugin.class new file mode 100644 index 000000000..07be53c3c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/FaladorNodePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/GnomeStrongholdPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/city/GnomeStrongholdPlugin$1.class new file mode 100644 index 000000000..e86204b24 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/GnomeStrongholdPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/GnomeStrongholdPlugin$2.class b/Server/build/classes/java/main/core/game/interaction/city/GnomeStrongholdPlugin$2.class new file mode 100644 index 000000000..1bccde438 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/GnomeStrongholdPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/GnomeStrongholdPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/GnomeStrongholdPlugin.class new file mode 100644 index 000000000..15d84607c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/GnomeStrongholdPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin$1.class new file mode 100644 index 000000000..fd59773ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin$2$1.class b/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin$2$1.class new file mode 100644 index 000000000..bea21a0d1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin$2.class b/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin$2.class new file mode 100644 index 000000000..a11e0410e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin.class new file mode 100644 index 000000000..86b20a8fc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/HamHideoutPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/HomePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/HomePlugin.class new file mode 100644 index 000000000..98588145c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/HomePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/KaramajaOptionPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/city/KaramajaOptionPlugin$1.class new file mode 100644 index 000000000..a8bf011e9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/KaramajaOptionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/KaramajaOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/KaramajaOptionPlugin.class new file mode 100644 index 000000000..f4057af2d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/KaramajaOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/KhardianDesertPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/KhardianDesertPlugin.class new file mode 100644 index 000000000..188b3fa2f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/KhardianDesertPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/LumbridgeNodePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/city/LumbridgeNodePlugin$1.class new file mode 100644 index 000000000..aa38e24b2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/LumbridgeNodePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/LumbridgeNodePlugin$ArcheryTargetPulse.class b/Server/build/classes/java/main/core/game/interaction/city/LumbridgeNodePlugin$ArcheryTargetPulse.class new file mode 100644 index 000000000..f8ed705e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/LumbridgeNodePlugin$ArcheryTargetPulse.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/LumbridgeNodePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/LumbridgeNodePlugin.class new file mode 100644 index 000000000..2ca378d81 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/LumbridgeNodePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/LunarIslePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/LunarIslePlugin.class new file mode 100644 index 000000000..03cc2247c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/LunarIslePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/MonasteryPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/MonasteryPlugin.class new file mode 100644 index 000000000..578876745 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/MonasteryPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/PortSarimPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/city/PortSarimPlugin$1.class new file mode 100644 index 000000000..daa9b944d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/PortSarimPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/PortSarimPlugin$2.class b/Server/build/classes/java/main/core/game/interaction/city/PortSarimPlugin$2.class new file mode 100644 index 000000000..141c752d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/PortSarimPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/PortSarimPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/PortSarimPlugin.class new file mode 100644 index 000000000..1b4f89564 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/PortSarimPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/RCGuildMap.class b/Server/build/classes/java/main/core/game/interaction/city/RCGuildMap.class new file mode 100644 index 000000000..a6cee989b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/RCGuildMap.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/RCGuildPortal.class b/Server/build/classes/java/main/core/game/interaction/city/RCGuildPortal.class new file mode 100644 index 000000000..e28c8ffeb Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/RCGuildPortal.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/ShiloVillagePlugin$VillageCartDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/ShiloVillagePlugin$VillageCartDialogue.class new file mode 100644 index 000000000..036698f85 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/ShiloVillagePlugin$VillageCartDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/ShiloVillagePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/ShiloVillagePlugin.class new file mode 100644 index 000000000..beac81dd6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/ShiloVillagePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/SophanemPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/SophanemPlugin.class new file mode 100644 index 000000000..c2a29cc3d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/SophanemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TaverlyDungeonPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/TaverlyDungeonPlugin.class new file mode 100644 index 000000000..b998ca351 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TaverlyDungeonPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$1.class new file mode 100644 index 000000000..5b403ca37 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$SabaDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$SabaDialogue.class new file mode 100644 index 000000000..b40379daa Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$SabaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$TenzingDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$TenzingDialogue.class new file mode 100644 index 000000000..90a72dbea Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$TenzingDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$TrollNPC.class b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$TrollNPC.class new file mode 100644 index 000000000..d6602edd5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$TrollNPC.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WarningCutscene$1.class b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WarningCutscene$1.class new file mode 100644 index 000000000..dbb1e1233 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WarningCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WarningCutscene.class b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WarningCutscene.class new file mode 100644 index 000000000..e466a0d32 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WarningCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WarningZone.class b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WarningZone.class new file mode 100644 index 000000000..a95a3eca6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WarningZone.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WoundedSoldier.class b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WoundedSoldier.class new file mode 100644 index 000000000..aaa32714c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin$WoundedSoldier.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin.class new file mode 100644 index 000000000..7a8c467b7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TrollheimPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TzhaarCityPlugin$TzhaarDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/TzhaarCityPlugin$TzhaarDialogue.class new file mode 100644 index 000000000..628a1d1d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TzhaarCityPlugin$TzhaarDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/TzhaarCityPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/TzhaarCityPlugin.class new file mode 100644 index 000000000..dc8878a1e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/TzhaarCityPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/VarrockNodePlugin$KnockatDoorDialogue$1.class b/Server/build/classes/java/main/core/game/interaction/city/VarrockNodePlugin$KnockatDoorDialogue$1.class new file mode 100644 index 000000000..20c4c095d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/VarrockNodePlugin$KnockatDoorDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/VarrockNodePlugin$KnockatDoorDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/VarrockNodePlugin$KnockatDoorDialogue.class new file mode 100644 index 000000000..3454dd050 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/VarrockNodePlugin$KnockatDoorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/VarrockNodePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/VarrockNodePlugin.class new file mode 100644 index 000000000..1602cf87f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/VarrockNodePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WildernessPlugin$KBDPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/WildernessPlugin$KBDPlugin.class new file mode 100644 index 000000000..a8be3bfb1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WildernessPlugin$KBDPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WildernessPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/WildernessPlugin.class new file mode 100644 index 000000000..bfbfc1312 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WildernessPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$AuburyDialoguePlugin.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$AuburyDialoguePlugin.class new file mode 100644 index 000000000..86d5ab02a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$AuburyDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$SedridorDialogue$1.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$SedridorDialogue$1.class new file mode 100644 index 000000000..335057a27 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$SedridorDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$SedridorDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$SedridorDialogue.class new file mode 100644 index 000000000..01d66ae15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$SedridorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardDialogue$1.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardDialogue$1.class new file mode 100644 index 000000000..ad525fcc2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardDialogue$SplitBark.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardDialogue$SplitBark.class new file mode 100644 index 000000000..49787f6fb Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardDialogue$SplitBark.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardDialogue.class new file mode 100644 index 000000000..b36586f91 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardGrayzagDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardGrayzagDialogue.class new file mode 100644 index 000000000..052eb1b5a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardGrayzagDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardMisgogDialogue$1.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardMisgogDialogue$1.class new file mode 100644 index 000000000..504442345 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardMisgogDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardMisgogDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardMisgogDialogue.class new file mode 100644 index 000000000..12955d20e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardMisgogDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardTowerDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardTowerDialogue.class new file mode 100644 index 000000000..21c3cf492 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardTowerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardtowerWizardNPC.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardtowerWizardNPC.class new file mode 100644 index 000000000..9349e03c0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin$WizardtowerWizardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin.class new file mode 100644 index 000000000..e4eac8e0a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/WizardTowerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/ZanarisPlugin$MagicDoorDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/ZanarisPlugin$MagicDoorDialogue.class new file mode 100644 index 000000000..622594665 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/ZanarisPlugin$MagicDoorDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/ZanarisPlugin.class b/Server/build/classes/java/main/core/game/interaction/city/ZanarisPlugin.class new file mode 100644 index 000000000..683874aef Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/ZanarisPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/falador/WineOfZamorakInteraction.class b/Server/build/classes/java/main/core/game/interaction/city/falador/WineOfZamorakInteraction.class new file mode 100644 index 000000000..5e4c7d9f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/falador/WineOfZamorakInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/lumbridge/CowFieldSign$SignDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/CowFieldSign$SignDialogue.class new file mode 100644 index 000000000..674e5617f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/CowFieldSign$SignDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/lumbridge/CowFieldSign.class b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/CowFieldSign.class new file mode 100644 index 000000000..82a212e1c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/CowFieldSign.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/lumbridge/CowPenZone.class b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/CowPenZone.class new file mode 100644 index 000000000..a798a9f3b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/CowPenZone.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/lumbridge/FredChest.class b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/FredChest.class new file mode 100644 index 000000000..850859054 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/FredChest.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/lumbridge/GnomeCopterSign$SignDialogue.class b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/GnomeCopterSign$SignDialogue.class new file mode 100644 index 000000000..e5c64cb75 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/GnomeCopterSign$SignDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/lumbridge/GnomeCopterSign.class b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/GnomeCopterSign.class new file mode 100644 index 000000000..b90de5a53 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/lumbridge/GnomeCopterSign.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/city/portsarim/AhabBeerInteraction.class b/Server/build/classes/java/main/core/game/interaction/city/portsarim/AhabBeerInteraction.class new file mode 100644 index 000000000..9666c8501 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/city/portsarim/AhabBeerInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/AgilityTicketInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/AgilityTicketInterface.class new file mode 100644 index 000000000..f42aea3e4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/AgilityTicketInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/AutocastSelectPlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/AutocastSelectPlugin.class new file mode 100644 index 000000000..1b1cd9085 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/AutocastSelectPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/BankPinInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/BankPinInterface.class new file mode 100644 index 000000000..7abc3cf0b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/BankPinInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/BoltEnchantingInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/BoltEnchantingInterface$1.class new file mode 100644 index 000000000..b42bb047b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/BoltEnchantingInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/BoltEnchantingInterface$Bolts.class b/Server/build/classes/java/main/core/game/interaction/inter/BoltEnchantingInterface$Bolts.class new file mode 100644 index 000000000..55e1276b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/BoltEnchantingInterface$Bolts.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/BoltEnchantingInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/BoltEnchantingInterface.class new file mode 100644 index 000000000..aeee73258 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/BoltEnchantingInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/CanoeInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/CanoeInterfacePlugin.class new file mode 100644 index 000000000..8d6792684 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/CanoeInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/CharacterDesignInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/CharacterDesignInterface.class new file mode 100644 index 000000000..9ad7f504a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/CharacterDesignInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/ClanInterfacePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/inter/ClanInterfacePlugin$1.class new file mode 100644 index 000000000..7513467ae Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/ClanInterfacePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/ClanInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/ClanInterfacePlugin.class new file mode 100644 index 000000000..3925f8ffb Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/ClanInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/CombatTabInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/CombatTabInterface$1.class new file mode 100644 index 000000000..2deed91ca Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/CombatTabInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/CombatTabInterface$2.class b/Server/build/classes/java/main/core/game/interaction/inter/CombatTabInterface$2.class new file mode 100644 index 000000000..d8309a6e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/CombatTabInterface$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/CombatTabInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/CombatTabInterface.class new file mode 100644 index 000000000..1d445ec1a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/CombatTabInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/CrystalKeyChestPlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/CrystalKeyChestPlugin.class new file mode 100644 index 000000000..77ac884f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/CrystalKeyChestPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/DeathInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/DeathInterfacePlugin.class new file mode 100644 index 000000000..18423822e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/DeathInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/EllisDialogue.class b/Server/build/classes/java/main/core/game/interaction/inter/EllisDialogue.class new file mode 100644 index 000000000..661c7f579 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/EllisDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/EmoteTabInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/EmoteTabInterface.class new file mode 100644 index 000000000..0f23104fc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/EmoteTabInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$1.class new file mode 100644 index 000000000..0ee9b7e4c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$2.class b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$2.class new file mode 100644 index 000000000..631562783 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$3.class b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$3.class new file mode 100644 index 000000000..4b189a119 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$4.class b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$4.class new file mode 100644 index 000000000..c5de5356b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$4.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$5.class b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$5.class new file mode 100644 index 000000000..a78ffe9c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$5.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$6.class b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$6.class new file mode 100644 index 000000000..b791748d2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface$6.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface.class new file mode 100644 index 000000000..37555147b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/EquipmentInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GameInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/GameInterface.class new file mode 100644 index 000000000..4b5822f6f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GameInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GlassInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/GlassInterface$1.class new file mode 100644 index 000000000..869f8f6e1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GlassInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GlassInterface$2.class b/Server/build/classes/java/main/core/game/interaction/inter/GlassInterface$2.class new file mode 100644 index 000000000..9c7339dae Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GlassInterface$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GlassInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/GlassInterface.class new file mode 100644 index 000000000..92191810c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GlassInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GliderInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/GliderInterface.class new file mode 100644 index 000000000..dac5af167 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GliderInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface$1.class new file mode 100644 index 000000000..f88eab3e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface$2.class b/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface$2.class new file mode 100644 index 000000000..d6281bfbd Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface$3.class b/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface$3.class new file mode 100644 index 000000000..49bc55d67 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface.class new file mode 100644 index 000000000..5d822031e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GrandExchangeInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/GravePurchaseInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/GravePurchaseInterface.class new file mode 100644 index 000000000..77b0740ac Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/GravePurchaseInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/JewelleryInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/JewelleryInterface$1.class new file mode 100644 index 000000000..f53b405cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/JewelleryInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/JewelleryInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/JewelleryInterface.class new file mode 100644 index 000000000..3f377ff7c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/JewelleryInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/LeatherCraftInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/LeatherCraftInterface$1.class new file mode 100644 index 000000000..130caf9cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/LeatherCraftInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/LeatherCraftInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/LeatherCraftInterface.class new file mode 100644 index 000000000..9b0325fcf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/LeatherCraftInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/LeatherCraftPlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/LeatherCraftPlugin.class new file mode 100644 index 000000000..47a2255de Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/LeatherCraftPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/LoginInterfacePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/inter/LoginInterfacePlugin$1.class new file mode 100644 index 000000000..da2f4df46 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/LoginInterfacePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/LoginInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/LoginInterfacePlugin.class new file mode 100644 index 000000000..de6a3a8c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/LoginInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/LogoutInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/LogoutInterface.class new file mode 100644 index 000000000..61d7a27fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/LogoutInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/MagicBookInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/MagicBookInterface.class new file mode 100644 index 000000000..cb7437f37 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/MagicBookInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/MusicTabInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/MusicTabInterface.class new file mode 100644 index 000000000..c680294bc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/MusicTabInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/MysticStaffEnchantingPlugin$EnchantedStaff.class b/Server/build/classes/java/main/core/game/interaction/inter/MysticStaffEnchantingPlugin$EnchantedStaff.class new file mode 100644 index 000000000..c3f77ad85 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/MysticStaffEnchantingPlugin$EnchantedStaff.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/MysticStaffEnchantingPlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/MysticStaffEnchantingPlugin.class new file mode 100644 index 000000000..fe4e8dcb7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/MysticStaffEnchantingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface$1.class new file mode 100644 index 000000000..f554c08ca Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface$2.class b/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface$2.class new file mode 100644 index 000000000..917aa82a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface$ViewCloseEvent.class b/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface$ViewCloseEvent.class new file mode 100644 index 000000000..e088af1c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface$ViewCloseEvent.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface.class new file mode 100644 index 000000000..621ae3e99 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/OrbViewingInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/PlayerExamineInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/PlayerExamineInterfacePlugin.class new file mode 100644 index 000000000..5f8d7e914 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/PlayerExamineInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/PrayerTabInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/PrayerTabInterface.class new file mode 100644 index 000000000..2c2c787d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/PrayerTabInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/QuestTabInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/QuestTabInterface.class new file mode 100644 index 000000000..5096ff04f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/QuestTabInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/RequestAssistInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/RequestAssistInterface.class new file mode 100644 index 000000000..1b756e3e1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/RequestAssistInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SawmillPlankInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/SawmillPlankInterface$1.class new file mode 100644 index 000000000..f65642881 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SawmillPlankInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SawmillPlankInterface$Plank.class b/Server/build/classes/java/main/core/game/interaction/inter/SawmillPlankInterface$Plank.class new file mode 100644 index 000000000..c19f317f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SawmillPlankInterface$Plank.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SawmillPlankInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/SawmillPlankInterface.class new file mode 100644 index 000000000..d12a74520 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SawmillPlankInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SettingTabInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/SettingTabInterface.class new file mode 100644 index 000000000..e3f38f00f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SettingTabInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/ShipCharterInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/ShipCharterInterface.class new file mode 100644 index 000000000..719e73531 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/ShipCharterInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/ShoppingPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/inter/ShoppingPlugin$1.class new file mode 100644 index 000000000..bb22a9b05 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/ShoppingPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/ShoppingPlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/ShoppingPlugin.class new file mode 100644 index 000000000..1785fbfd9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/ShoppingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SilverInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/SilverInterface$1.class new file mode 100644 index 000000000..666d1df58 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SilverInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SilverInterface$2.class b/Server/build/classes/java/main/core/game/interaction/inter/SilverInterface$2.class new file mode 100644 index 000000000..de87f9d36 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SilverInterface$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SilverInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/SilverInterface.class new file mode 100644 index 000000000..603487cb4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SilverInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SkillInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/SkillInterface.class new file mode 100644 index 000000000..19f32d288 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SkillInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SkillTabInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/SkillTabInterface$1.class new file mode 100644 index 000000000..e228e483d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SkillTabInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SkillTabInterface$SkillConfig.class b/Server/build/classes/java/main/core/game/interaction/inter/SkillTabInterface$SkillConfig.class new file mode 100644 index 000000000..7c1d6a791 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SkillTabInterface$SkillConfig.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SkillTabInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/SkillTabInterface.class new file mode 100644 index 000000000..8e69ad819 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SkillTabInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SmeltingInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/SmeltingInterface$1.class new file mode 100644 index 000000000..e1793f4ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SmeltingInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SmeltingInterface$BarButton.class b/Server/build/classes/java/main/core/game/interaction/inter/SmeltingInterface$BarButton.class new file mode 100644 index 000000000..ec5c5fc90 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SmeltingInterface$BarButton.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SmeltingInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/SmeltingInterface.class new file mode 100644 index 000000000..0f9b09d79 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SmeltingInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SmithingInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/SmithingInterface$1.class new file mode 100644 index 000000000..7af5bafd6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SmithingInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SmithingInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/SmithingInterface.class new file mode 100644 index 000000000..aace69a94 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SmithingInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SpinningInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/SpinningInterface$1.class new file mode 100644 index 000000000..e59260ac5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SpinningInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/SpinningInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/SpinningInterface.class new file mode 100644 index 000000000..f94739311 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/SpinningInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/TanningInterface$1.class b/Server/build/classes/java/main/core/game/interaction/inter/TanningInterface$1.class new file mode 100644 index 000000000..978f814f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/TanningInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/TanningInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/TanningInterface.class new file mode 100644 index 000000000..4c3451f11 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/TanningInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/TradeInterfacePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/inter/TradeInterfacePlugin$1.class new file mode 100644 index 000000000..9438e9e3c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/TradeInterfacePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/TradeInterfacePlugin$2.class b/Server/build/classes/java/main/core/game/interaction/inter/TradeInterfacePlugin$2.class new file mode 100644 index 000000000..8202b7a6d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/TradeInterfacePlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/TradeInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/inter/TradeInterfacePlugin.class new file mode 100644 index 000000000..513e850cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/TradeInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/inter/WorldMapInterface.class b/Server/build/classes/java/main/core/game/interaction/inter/WorldMapInterface.class new file mode 100644 index 000000000..2b0af4829 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/inter/WorldMapInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/BirdNestPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/BirdNestPlugin.class new file mode 100644 index 000000000..83846c13f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/BirdNestPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/BookreadOption.class b/Server/build/classes/java/main/core/game/interaction/item/BookreadOption.class new file mode 100644 index 000000000..37123aec5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/BookreadOption.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/CasketPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/CasketPlugin.class new file mode 100644 index 000000000..6e0cce9ae Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/CasketPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/ConsumableOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/ConsumableOptionPlugin.class new file mode 100644 index 000000000..e4b5d4c90 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/ConsumableOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/DiangoItemPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/DiangoItemPlugin$1.class new file mode 100644 index 000000000..4b17a34cd Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/DiangoItemPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/DiangoItemPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/DiangoItemPlugin.class new file mode 100644 index 000000000..c1fdfd725 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/DiangoItemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/DragonfireShieldPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/DragonfireShieldPlugin$1.class new file mode 100644 index 000000000..6ac93ab66 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/DragonfireShieldPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/DragonfireShieldPlugin$DFSItemPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/DragonfireShieldPlugin$DFSItemPlugin.class new file mode 100644 index 000000000..b22e9259e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/DragonfireShieldPlugin$DFSItemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/DragonfireShieldPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/DragonfireShieldPlugin.class new file mode 100644 index 000000000..8b9b2dce0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/DragonfireShieldPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/DustHandPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/DustHandPlugin.class new file mode 100644 index 000000000..57be71392 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/DustHandPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/EmptyOptionPlugin$EmptyItem.class b/Server/build/classes/java/main/core/game/interaction/item/EmptyOptionPlugin$EmptyItem.class new file mode 100644 index 000000000..e8ecd10fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/EmptyOptionPlugin$EmptyItem.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/EmptyOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/EmptyOptionPlugin.class new file mode 100644 index 000000000..2dfaa385f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/EmptyOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/EnchantedGemPlugin$JewelleryDialogue.class b/Server/build/classes/java/main/core/game/interaction/item/EnchantedGemPlugin$JewelleryDialogue.class new file mode 100644 index 000000000..61244cb37 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/EnchantedGemPlugin$JewelleryDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/EnchantedGemPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/EnchantedGemPlugin.class new file mode 100644 index 000000000..031842c39 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/EnchantedGemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/EnchantedJewelleryPlugin$JewelleryDialogue.class b/Server/build/classes/java/main/core/game/interaction/item/EnchantedJewelleryPlugin$JewelleryDialogue.class new file mode 100644 index 000000000..2118b2005 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/EnchantedJewelleryPlugin$JewelleryDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/EnchantedJewelleryPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/EnchantedJewelleryPlugin.class new file mode 100644 index 000000000..a8f3a3e2f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/EnchantedJewelleryPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/ExplorersRingPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/ExplorersRingPlugin.class new file mode 100644 index 000000000..dded37ed9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/ExplorersRingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/FaladorShieldPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/FaladorShieldPlugin$1.class new file mode 100644 index 000000000..cf91b723d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/FaladorShieldPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/FaladorShieldPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/FaladorShieldPlugin.class new file mode 100644 index 000000000..f996b28c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/FaladorShieldPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$AquariumPlugin$TinyNetHandler.class b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$AquariumPlugin$TinyNetHandler.class new file mode 100644 index 000000000..0a976fa6f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$AquariumPlugin$TinyNetHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$AquariumPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$AquariumPlugin.class new file mode 100644 index 000000000..a7e3dfb9e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$AquariumPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$FeedPetFishHandler.class b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$FeedPetFishHandler.class new file mode 100644 index 000000000..2a050fb4d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$FeedPetFishHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$FishbowlDialogue.class b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$FishbowlDialogue.class new file mode 100644 index 000000000..67b13c099 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin$FishbowlDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin.class new file mode 100644 index 000000000..2c8380c9b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/FishbowlPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GnomeCopterPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/GnomeCopterPlugin.class new file mode 100644 index 000000000..b841c1a4e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GnomeCopterPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GnomecopterTicket.class b/Server/build/classes/java/main/core/game/interaction/item/GnomecopterTicket.class new file mode 100644 index 000000000..a676027c4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GnomecopterTicket.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$GodBookDialogue$1.class b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$GodBookDialogue$1.class new file mode 100644 index 000000000..847aaeff0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$GodBookDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$GodBookDialogue.class b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$GodBookDialogue.class new file mode 100644 index 000000000..530152443 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$GodBookDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$GodBookItem.class b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$GodBookItem.class new file mode 100644 index 000000000..0aaac08da Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$GodBookItem.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$PageHandler.class b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$PageHandler.class new file mode 100644 index 000000000..f1e5fa275 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$PageHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$SymbolBlessHandler$1.class b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$SymbolBlessHandler$1.class new file mode 100644 index 000000000..7ba9060ff Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$SymbolBlessHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$SymbolBlessHandler.class b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$SymbolBlessHandler.class new file mode 100644 index 000000000..cd0aa7b12 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin$SymbolBlessHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin.class new file mode 100644 index 000000000..78c4cf990 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GodBookPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/GodswordDismantlePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/GodswordDismantlePlugin.class new file mode 100644 index 000000000..8e65603c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/GodswordDismantlePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/HerbBoxPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/HerbBoxPlugin.class new file mode 100644 index 000000000..9ddd833c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/HerbBoxPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/HouseTeleTabOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/HouseTeleTabOptionPlugin.class new file mode 100644 index 000000000..a57ef15c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/HouseTeleTabOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/LampPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/LampPlugin.class new file mode 100644 index 000000000..2b626286c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/LampPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/MorphItemPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/MorphItemPlugin$1.class new file mode 100644 index 000000000..bdf705114 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/MorphItemPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/MorphItemPlugin$MorphInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/MorphItemPlugin$MorphInterfacePlugin.class new file mode 100644 index 000000000..257f8b730 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/MorphItemPlugin$MorphInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/MorphItemPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/MorphItemPlugin.class new file mode 100644 index 000000000..f5ac376ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/MorphItemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/NewComerMapPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/NewComerMapPlugin.class new file mode 100644 index 000000000..dd28c55f2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/NewComerMapPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/NewsPaperPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/NewsPaperPlugin.class new file mode 100644 index 000000000..92d996d54 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/NewsPaperPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/OysterPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/OysterPlugin.class new file mode 100644 index 000000000..b89b61b45 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/OysterPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/PharoahSceptre$SceptreDialog$1.class b/Server/build/classes/java/main/core/game/interaction/item/PharoahSceptre$SceptreDialog$1.class new file mode 100644 index 000000000..37c5a079a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/PharoahSceptre$SceptreDialog$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/PharoahSceptre$SceptreDialog.class b/Server/build/classes/java/main/core/game/interaction/item/PharoahSceptre$SceptreDialog.class new file mode 100644 index 000000000..ca69481f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/PharoahSceptre$SceptreDialog.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/PharoahSceptre.class b/Server/build/classes/java/main/core/game/interaction/item/PharoahSceptre.class new file mode 100644 index 000000000..8e8817022 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/PharoahSceptre.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/PickupPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/PickupPlugin.class new file mode 100644 index 000000000..35b16cf44 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/PickupPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/QuestCapePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/QuestCapePlugin.class new file mode 100644 index 000000000..a06684e55 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/QuestCapePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/RingUnchargePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/RingUnchargePlugin.class new file mode 100644 index 000000000..28cb6acc3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/RingUnchargePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/RunePackPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/RunePackPlugin.class new file mode 100644 index 000000000..abd3b4192 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/RunePackPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/SilverSicklePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/SilverSicklePlugin.class new file mode 100644 index 000000000..032aead23 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/SilverSicklePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/SkullSceptreOption.class b/Server/build/classes/java/main/core/game/interaction/item/SkullSceptreOption.class new file mode 100644 index 000000000..c8b321729 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/SkullSceptreOption.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/SpadeDigOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/SpadeDigOptionPlugin.class new file mode 100644 index 000000000..758b40a03 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/SpadeDigOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/StarterPackPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/StarterPackPlugin.class new file mode 100644 index 000000000..be43e2b1a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/StarterPackPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/TeleTabsOptionPlugin$TeleTabs.class b/Server/build/classes/java/main/core/game/interaction/item/TeleTabsOptionPlugin$TeleTabs.class new file mode 100644 index 000000000..c379879f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/TeleTabsOptionPlugin$TeleTabs.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/TeleTabsOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/TeleTabsOptionPlugin.class new file mode 100644 index 000000000..227858706 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/TeleTabsOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/TeleportCrystalPlugin$TeleportCrystalDialogue.class b/Server/build/classes/java/main/core/game/interaction/item/TeleportCrystalPlugin$TeleportCrystalDialogue.class new file mode 100644 index 000000000..41cb107f1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/TeleportCrystalPlugin$TeleportCrystalDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/TeleportCrystalPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/TeleportCrystalPlugin.class new file mode 100644 index 000000000..b3a5755b6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/TeleportCrystalPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/ToyHorsePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/ToyHorsePlugin.class new file mode 100644 index 000000000..5b1efd348 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/ToyHorsePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/brawling_gloves/BrawlingGloves.class b/Server/build/classes/java/main/core/game/interaction/item/brawling_gloves/BrawlingGloves.class new file mode 100644 index 000000000..31ab26bd2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/brawling_gloves/BrawlingGloves.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.class b/Server/build/classes/java/main/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.class new file mode 100644 index 000000000..e453a26ac Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/ChocatriceCape.class b/Server/build/classes/java/main/core/game/interaction/item/toys/ChocatriceCape.class new file mode 100644 index 000000000..85e3df545 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/ChocatriceCape.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/DiangoOptionHandler.class b/Server/build/classes/java/main/core/game/interaction/item/toys/DiangoOptionHandler.class new file mode 100644 index 000000000..eb9e36b19 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/DiangoOptionHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/DiangoReclaimInterface.class b/Server/build/classes/java/main/core/game/interaction/item/toys/DiangoReclaimInterface.class new file mode 100644 index 000000000..2367ab3ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/DiangoReclaimInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/MarionettePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/toys/MarionettePlugin.class new file mode 100644 index 000000000..f5df61ace Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/MarionettePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/ReindeerHatPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/toys/ReindeerHatPlugin.class new file mode 100644 index 000000000..d03c4c8a0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/ReindeerHatPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$1$1.class b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$1$1.class new file mode 100644 index 000000000..26962007e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$1.class new file mode 100644 index 000000000..2b0334aa3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$SnowGlobeInterface$1.class b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$SnowGlobeInterface$1.class new file mode 100644 index 000000000..21fd1aef2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$SnowGlobeInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$SnowGlobeInterface.class b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$SnowGlobeInterface.class new file mode 100644 index 000000000..93c00f675 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin$SnowGlobeInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin.class new file mode 100644 index 000000000..48cc1b6c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/SnowGlobePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/YoyoPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/toys/YoyoPlugin.class new file mode 100644 index 000000000..fa558e801 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/YoyoPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/toys/ZombieHeadPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/toys/ZombieHeadPlugin.class new file mode 100644 index 000000000..e0fdd8894 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/toys/ZombieHeadPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/ChestKeyPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/ChestKeyPlugin.class new file mode 100644 index 000000000..c074e1194 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/ChestKeyPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/CrystalKeyCreatePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/CrystalKeyCreatePlugin.class new file mode 100644 index 000000000..66ec32be0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/CrystalKeyCreatePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin$1.class new file mode 100644 index 000000000..b84741f71 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin$DarkBowCleanPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin$DarkBowCleanPlugin$1.class new file mode 100644 index 000000000..93146c440 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin$DarkBowCleanPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin$DarkBowCleanPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin$DarkBowCleanPlugin.class new file mode 100644 index 000000000..47c29d66e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin$DarkBowCleanPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin.class new file mode 100644 index 000000000..382375c75 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/DarkBowDyePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/FirelighterPlugin$FireLighter.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/FirelighterPlugin$FireLighter.class new file mode 100644 index 000000000..61504453e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/FirelighterPlugin$FireLighter.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/FirelighterPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/FirelighterPlugin.class new file mode 100644 index 000000000..966088f3b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/FirelighterPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/FishfoodPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/FishfoodPlugin$1.class new file mode 100644 index 000000000..32442bb13 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/FishfoodPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/FishfoodPlugin$FishFoodUses.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/FishfoodPlugin$FishFoodUses.class new file mode 100644 index 000000000..ff6007416 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/FishfoodPlugin$FishFoodUses.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/FishfoodPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/FishfoodPlugin.class new file mode 100644 index 000000000..1ee231d02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/FishfoodPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin$Fruit.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin$Fruit.class new file mode 100644 index 000000000..7827a9493 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin$Fruit.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin$FruitCuttingDialogue$1.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin$FruitCuttingDialogue$1.class new file mode 100644 index 000000000..e3b1c4937 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin$FruitCuttingDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin$FruitCuttingDialogue.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin$FruitCuttingDialogue.class new file mode 100644 index 000000000..a521ff162 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin$FruitCuttingDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin.class new file mode 100644 index 000000000..95a718f8c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/FruitCuttingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/GodswordHiltAttachPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/GodswordHiltAttachPlugin.class new file mode 100644 index 000000000..2c9f43eaf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/GodswordHiltAttachPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin$1.class new file mode 100644 index 000000000..52f42ef8f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin$GraniteMaulRevertHandler$1.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin$GraniteMaulRevertHandler$1.class new file mode 100644 index 000000000..cac64f9ec Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin$GraniteMaulRevertHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin$GraniteMaulRevertHandler.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin$GraniteMaulRevertHandler.class new file mode 100644 index 000000000..fd6f6e261 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin$GraniteMaulRevertHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin.class new file mode 100644 index 000000000..486b9cfab Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteMaulPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteSplittingPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteSplittingPlugin.class new file mode 100644 index 000000000..aeabdcde3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/GraniteSplittingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/ImpJarCreatePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/ImpJarCreatePlugin.class new file mode 100644 index 000000000..1c9720564 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/ImpJarCreatePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/KaramjanSilkPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/KaramjanSilkPlugin.class new file mode 100644 index 000000000..3f30f2a91 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/KaramjanSilkPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/LavaScalePlugin$AntifireMakePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/LavaScalePlugin$AntifireMakePlugin.class new file mode 100644 index 000000000..074b01bf4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/LavaScalePlugin$AntifireMakePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/LavaScalePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/LavaScalePlugin.class new file mode 100644 index 000000000..faa8dff3b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/LavaScalePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/MakeGlassInterfacePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/MakeGlassInterfacePlugin$1.class new file mode 100644 index 000000000..751c32473 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/MakeGlassInterfacePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/MakeGlassInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/MakeGlassInterfacePlugin.class new file mode 100644 index 000000000..03229b0ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/MakeGlassInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonRemovePlugin$PoisonedWeapon.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonRemovePlugin$PoisonedWeapon.class new file mode 100644 index 000000000..1f88afa86 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonRemovePlugin$PoisonedWeapon.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonRemovePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonRemovePlugin.class new file mode 100644 index 000000000..ffe13706a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonRemovePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonWeaponPlugin$PoisonedWeapon.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonWeaponPlugin$PoisonedWeapon.class new file mode 100644 index 000000000..76e994eb9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonWeaponPlugin$PoisonedWeapon.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonWeaponPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonWeaponPlugin.class new file mode 100644 index 000000000..59f892c0e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/PoisonWeaponPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/SeasonedSardinePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/SeasonedSardinePlugin.class new file mode 100644 index 000000000..9a89074df Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/SeasonedSardinePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/SkullSceptrePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/SkullSceptrePlugin.class new file mode 100644 index 000000000..16c4a2fcc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/SkullSceptrePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/SoftclayPlugin$1$1.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/SoftclayPlugin$1$1.class new file mode 100644 index 000000000..c83567ce0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/SoftclayPlugin$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/SoftclayPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/SoftclayPlugin$1.class new file mode 100644 index 000000000..5f7c1bad2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/SoftclayPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/SoftclayPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/SoftclayPlugin.class new file mode 100644 index 000000000..9584a7622 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/SoftclayPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withitem/WaterSkinPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withitem/WaterSkinPlugin.class new file mode 100644 index 000000000..2ec9fc676 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withitem/WaterSkinPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withnpc/ForestersArmsCiderPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withnpc/ForestersArmsCiderPlugin.class new file mode 100644 index 000000000..b30f1995d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withnpc/ForestersArmsCiderPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withnpc/GertrudeCatUsePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withnpc/GertrudeCatUsePlugin$1.class new file mode 100644 index 000000000..8a13b51e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withnpc/GertrudeCatUsePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withnpc/GertrudeCatUsePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withnpc/GertrudeCatUsePlugin.class new file mode 100644 index 000000000..979533391 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withnpc/GertrudeCatUsePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withnpc/KingArthurPoisonChalicePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withnpc/KingArthurPoisonChalicePlugin.class new file mode 100644 index 000000000..60d4037fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withnpc/KingArthurPoisonChalicePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withnpc/LadyKeliRopePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withnpc/LadyKeliRopePlugin.class new file mode 100644 index 000000000..3f47737a9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withnpc/LadyKeliRopePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withnpc/NeedleCowPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withnpc/NeedleCowPlugin.class new file mode 100644 index 000000000..14da44fb5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withnpc/NeedleCowPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withnpc/StrayDogBonesPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withnpc/StrayDogBonesPlugin.class new file mode 100644 index 000000000..a808b89a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withnpc/StrayDogBonesPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/BankUnnotePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/BankUnnotePlugin.class new file mode 100644 index 000000000..365e51ecf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/BankUnnotePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/CauldronOfThunder.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/CauldronOfThunder.class new file mode 100644 index 000000000..3dd28af32 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/CauldronOfThunder.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/DragonPlatebody.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/DragonPlatebody.class new file mode 100644 index 000000000..01c4be9c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/DragonPlatebody.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/EctophialFillPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/EctophialFillPlugin$1.class new file mode 100644 index 000000000..81c350c6b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/EctophialFillPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/EctophialFillPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/EctophialFillPlugin.class new file mode 100644 index 000000000..a63115ebb Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/EctophialFillPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/GWDEntranceRopeUsage.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/GWDEntranceRopeUsage.class new file mode 100644 index 000000000..8a782142d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/GWDEntranceRopeUsage.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/GildedAltarPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/GildedAltarPlugin.class new file mode 100644 index 000000000..54a1160b0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/GildedAltarPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/HairdresserCheesePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/HairdresserCheesePlugin$1.class new file mode 100644 index 000000000..346228d8c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/HairdresserCheesePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/HairdresserCheesePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/HairdresserCheesePlugin.class new file mode 100644 index 000000000..ccaf4e4d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/HairdresserCheesePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/IncubatorPlugin$IncubatorEggHandler.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/IncubatorPlugin$IncubatorEggHandler.class new file mode 100644 index 000000000..96d3d40c7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/IncubatorPlugin$IncubatorEggHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/IncubatorPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/IncubatorPlugin.class new file mode 100644 index 000000000..b53fac94a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/IncubatorPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/KaramajaBananaCrate.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/KaramajaBananaCrate.class new file mode 100644 index 000000000..b1fc049af Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/KaramajaBananaCrate.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/PoisonFountainPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/PoisonFountainPlugin$1.class new file mode 100644 index 000000000..d0554cead Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/PoisonFountainPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/PoisonFountainPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/PoisonFountainPlugin.class new file mode 100644 index 000000000..92c9aaa73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/PoisonFountainPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/PriestInPerilUsePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/PriestInPerilUsePlugin.class new file mode 100644 index 000000000..ad982a498 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/PriestInPerilUsePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SandSourcePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SandSourcePlugin$1.class new file mode 100644 index 000000000..d20eb4f81 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SandSourcePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SandSourcePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SandSourcePlugin.class new file mode 100644 index 000000000..b210287c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SandSourcePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SapCollectPlugin$SapEmptyPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SapCollectPlugin$SapEmptyPlugin.class new file mode 100644 index 000000000..270e45b85 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SapCollectPlugin$SapEmptyPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SapCollectPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SapCollectPlugin.class new file mode 100644 index 000000000..4eb3a34d4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SapCollectPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SmithingPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SmithingPlugin$1.class new file mode 100644 index 000000000..c118ad7a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SmithingPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SmithingPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SmithingPlugin.class new file mode 100644 index 000000000..09b7f2711 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SmithingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SpiritShieldBlessPlugin$SpiritShieldMakePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SpiritShieldBlessPlugin$SpiritShieldMakePlugin$1.class new file mode 100644 index 000000000..8bdf9e8c7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SpiritShieldBlessPlugin$SpiritShieldMakePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SpiritShieldBlessPlugin$SpiritShieldMakePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SpiritShieldBlessPlugin$SpiritShieldMakePlugin.class new file mode 100644 index 000000000..bc5318c02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SpiritShieldBlessPlugin$SpiritShieldMakePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.class new file mode 100644 index 000000000..749abf148 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/SwampHoleRopePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/SwampHoleRopePlugin.class new file mode 100644 index 000000000..9536c2fcd Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/SwampHoleRopePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/TutorialItemHandler$1.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/TutorialItemHandler$1.class new file mode 100644 index 000000000..9f83203b7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/TutorialItemHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/TutorialItemHandler.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/TutorialItemHandler.class new file mode 100644 index 000000000..a3b3da895 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/TutorialItemHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSkinHandler$1.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSkinHandler$1.class new file mode 100644 index 000000000..92b9d6508 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSkinHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSkinHandler.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSkinHandler.class new file mode 100644 index 000000000..f978b0a58 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSkinHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin$WaterRecipient$1.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin$WaterRecipient$1.class new file mode 100644 index 000000000..bae65692b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin$WaterRecipient$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin$WaterRecipient$2.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin$WaterRecipient$2.class new file mode 100644 index 000000000..9e5f5d8f9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin$WaterRecipient$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin$WaterRecipient.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin$WaterRecipient.class new file mode 100644 index 000000000..0d09669f5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin$WaterRecipient.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin.class b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin.class new file mode 100644 index 000000000..8a936c724 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withobject/WaterSourcePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withplayer/ChristmasCrackerUsage.class b/Server/build/classes/java/main/core/game/interaction/item/withplayer/ChristmasCrackerUsage.class new file mode 100644 index 000000000..e4daf44f5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withplayer/ChristmasCrackerUsage.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/item/withplayer/FieldRationUsage.class b/Server/build/classes/java/main/core/game/interaction/item/withplayer/FieldRationUsage.class new file mode 100644 index 000000000..f6d9e92c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/item/withplayer/FieldRationUsage.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/AlKahridLeafletPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/AlKahridLeafletPlugin.class new file mode 100644 index 000000000..7ac8b5538 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/AlKahridLeafletPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/AlkharidHealPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/AlkharidHealPlugin.class new file mode 100644 index 000000000..3027b9e0b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/AlkharidHealPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/BogrogPlugin$BogrogDialogue.class b/Server/build/classes/java/main/core/game/interaction/npc/BogrogPlugin$BogrogDialogue.class new file mode 100644 index 000000000..9f0440ff5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/BogrogPlugin$BogrogDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/BogrogPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/BogrogPlugin.class new file mode 100644 index 000000000..271913375 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/BogrogPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeOptionPlugin.class new file mode 100644 index 000000000..9b093eb4c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeTrainNPC$1.class b/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeTrainNPC$1.class new file mode 100644 index 000000000..51500a2cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeTrainNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeTrainNPC$2.class b/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeTrainNPC$2.class new file mode 100644 index 000000000..4280b1414 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeTrainNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeTrainNPC.class b/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeTrainNPC.class new file mode 100644 index 000000000..27f98afbd Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/BurthorpeTrainNPC.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/CanafisWereWolfPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/npc/CanafisWereWolfPlugin$1.class new file mode 100644 index 000000000..885b9af73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/CanafisWereWolfPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/CanafisWereWolfPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/CanafisWereWolfPlugin.class new file mode 100644 index 000000000..7d726f5d8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/CanafisWereWolfPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/CustomsOfficerPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/CustomsOfficerPlugin.class new file mode 100644 index 000000000..32dc3c030 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/CustomsOfficerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/DoomsayerTogglePlugin$WarningMessagePlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/DoomsayerTogglePlugin$WarningMessagePlugin.class new file mode 100644 index 000000000..a8149f56d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/DoomsayerTogglePlugin$WarningMessagePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/DoomsayerTogglePlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/DoomsayerTogglePlugin.class new file mode 100644 index 000000000..e4cf3b13f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/DoomsayerTogglePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/GabootyTrade.class b/Server/build/classes/java/main/core/game/interaction/npc/GabootyTrade.class new file mode 100644 index 000000000..3810c4764 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/GabootyTrade.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/GameInstructorPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/GameInstructorPlugin.class new file mode 100644 index 000000000..1995005f6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/GameInstructorPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/GliderPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/GliderPlugin.class new file mode 100644 index 000000000..172b3ed4e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/GliderPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/HairCutPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/HairCutPlugin.class new file mode 100644 index 000000000..5386d9f02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/HairCutPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/NPCDisturbPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/NPCDisturbPlugin.class new file mode 100644 index 000000000..e000c24ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/NPCDisturbPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/NPCTalkPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/NPCTalkPlugin.class new file mode 100644 index 000000000..71eec5a3b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/NPCTalkPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/NPCTradePlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/NPCTradePlugin.class new file mode 100644 index 000000000..011d84398 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/NPCTradePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/RechargeSceptre$RechargeDialogue.class b/Server/build/classes/java/main/core/game/interaction/npc/RechargeSceptre$RechargeDialogue.class new file mode 100644 index 000000000..1a704a505 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/RechargeSceptre$RechargeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/RechargeSceptre.class b/Server/build/classes/java/main/core/game/interaction/npc/RechargeSceptre.class new file mode 100644 index 000000000..9567997a7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/RechargeSceptre.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/RoavarDialogue.class b/Server/build/classes/java/main/core/game/interaction/npc/RoavarDialogue.class new file mode 100644 index 000000000..2a1f4f7a0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/RoavarDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/RoavarOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/RoavarOptionPlugin.class new file mode 100644 index 000000000..94ff046c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/RoavarOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SanibochPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/SanibochPlugin.class new file mode 100644 index 000000000..c4b13a8d3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SanibochPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SawmillOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/SawmillOptionPlugin.class new file mode 100644 index 000000000..cd12b7b41 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SawmillOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SeamanPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/SeamanPlugin.class new file mode 100644 index 000000000..dcfa9f6d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SeamanPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SecurityGuardPlugin$SecurityGuardDialogue.class b/Server/build/classes/java/main/core/game/interaction/npc/SecurityGuardPlugin$SecurityGuardDialogue.class new file mode 100644 index 000000000..e16836c55 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SecurityGuardPlugin$SecurityGuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SecurityGuardPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/SecurityGuardPlugin.class new file mode 100644 index 000000000..d379b5e97 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SecurityGuardPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ShantayOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/ShantayOptionPlugin.class new file mode 100644 index 000000000..075d7caaa Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ShantayOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SheepShearPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/npc/SheepShearPlugin$1.class new file mode 100644 index 000000000..9afcd36b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SheepShearPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SheepShearPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/SheepShearPlugin.class new file mode 100644 index 000000000..830cf9cc5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SheepShearPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ShipCharterNPCPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/ShipCharterNPCPlugin.class new file mode 100644 index 000000000..714416ad6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ShipCharterNPCPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ShooAwayStrayDogPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/ShooAwayStrayDogPlugin.class new file mode 100644 index 000000000..a9785765d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ShooAwayStrayDogPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SimonScepterInteraction.class b/Server/build/classes/java/main/core/game/interaction/npc/SimonScepterInteraction.class new file mode 100644 index 000000000..d4f9dc42d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SimonScepterInteraction.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SpiritGraahkOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/SpiritGraahkOptionPlugin.class new file mode 100644 index 000000000..4be956c68 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SpiritGraahkOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/SpiritKyattOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/SpiritKyattOptionPlugin.class new file mode 100644 index 000000000..8047ee593 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/SpiritKyattOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/TanningNPC.class b/Server/build/classes/java/main/core/game/interaction/npc/TanningNPC.class new file mode 100644 index 000000000..761b3472f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/TanningNPC.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ThessaliaPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/ThessaliaPlugin.class new file mode 100644 index 000000000..06a0dcd83 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ThessaliaPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin$ZaffDialogue.class b/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin$ZaffDialogue.class new file mode 100644 index 000000000..5d46067ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin$ZaffDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin$ZaffStaveDialogue$1.class b/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin$ZaffStaveDialogue$1.class new file mode 100644 index 000000000..3f3de4c54 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin$ZaffStaveDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin$ZaffStaveDialogue.class b/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin$ZaffStaveDialogue.class new file mode 100644 index 000000000..b403a3817 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin$ZaffStaveDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin.class new file mode 100644 index 000000000..12b2ae268 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ZaffPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ZahurOptionPlugin$ZahurDialoguePlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/ZahurOptionPlugin$ZahurDialoguePlugin.class new file mode 100644 index 000000000..a37cd3f86 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ZahurOptionPlugin$ZahurDialoguePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/ZahurOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/ZahurOptionPlugin.class new file mode 100644 index 000000000..4e3bdee70 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/ZahurOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/bob/BobDialogue$BarrowsEquipment$BarrowsFullEquipment.class b/Server/build/classes/java/main/core/game/interaction/npc/bob/BobDialogue$BarrowsEquipment$BarrowsFullEquipment.class new file mode 100644 index 000000000..b2368f301 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/bob/BobDialogue$BarrowsEquipment$BarrowsFullEquipment.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/bob/BobDialogue$BarrowsEquipment.class b/Server/build/classes/java/main/core/game/interaction/npc/bob/BobDialogue$BarrowsEquipment.class new file mode 100644 index 000000000..f4a1a3c85 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/bob/BobDialogue$BarrowsEquipment.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/bob/BobDialogue.class b/Server/build/classes/java/main/core/game/interaction/npc/bob/BobDialogue.class new file mode 100644 index 000000000..0caafcfee Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/bob/BobDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/bob/BobRepairItem.class b/Server/build/classes/java/main/core/game/interaction/npc/bob/BobRepairItem.class new file mode 100644 index 000000000..8ae48c293 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/bob/BobRepairItem.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticeDialogue$1.class b/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticeDialogue$1.class new file mode 100644 index 000000000..7dcab40d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticeDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticeDialogue.class b/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticeDialogue.class new file mode 100644 index 000000000..e5be5cff5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin$SorceressStairs.class b/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin$SorceressStairs.class new file mode 100644 index 000000000..69dbd2f34 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin$SorceressStairs.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.class b/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.class new file mode 100644 index 000000000..568b01de5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$1.class new file mode 100644 index 000000000..58d25b233 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankDepositInterface$1.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankDepositInterface$1.class new file mode 100644 index 000000000..9094af97f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankDepositInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankDepositInterface$2.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankDepositInterface$2.class new file mode 100644 index 000000000..94e404ddc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankDepositInterface$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankDepositInterface.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankDepositInterface.class new file mode 100644 index 000000000..52b081afd Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankDepositInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankNPC.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankNPC.class new file mode 100644 index 000000000..d0756bc14 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankNPC.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankNPCPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankNPCPlugin.class new file mode 100644 index 000000000..54b639bd4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankNPCPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankerDialogue.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankerDialogue.class new file mode 100644 index 000000000..131e5d1ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$1.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$1.class new file mode 100644 index 000000000..99831a92e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$2.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$2.class new file mode 100644 index 000000000..e3548bc40 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$3.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$3.class new file mode 100644 index 000000000..028a87b43 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$4.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$4.class new file mode 100644 index 000000000..6e325aa91 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface$4.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface.class new file mode 100644 index 000000000..1250304cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin$BankingInterface.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin.class new file mode 100644 index 000000000..840fc6a65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BankingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BarrowsBoatPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/BarrowsBoatPlugin$1.class new file mode 100644 index 000000000..102e6f5b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BarrowsBoatPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BarrowsBoatPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/BarrowsBoatPlugin.class new file mode 100644 index 000000000..b3ef3e5aa Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BarrowsBoatPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BarrowsTunnelShortcut.class b/Server/build/classes/java/main/core/game/interaction/object/BarrowsTunnelShortcut.class new file mode 100644 index 000000000..3ad19a3c4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BarrowsTunnelShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BeehivePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/BeehivePlugin$1.class new file mode 100644 index 000000000..90b9f95cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BeehivePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BeehivePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/BeehivePlugin.class new file mode 100644 index 000000000..e72ad2c20 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BeehivePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BrassKeyDoorPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/BrassKeyDoorPlugin.class new file mode 100644 index 000000000..42b17b207 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BrassKeyDoorPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BrokenCartBypass$1.class b/Server/build/classes/java/main/core/game/interaction/object/BrokenCartBypass$1.class new file mode 100644 index 000000000..6539185aa Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BrokenCartBypass$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BrokenCartBypass.class b/Server/build/classes/java/main/core/game/interaction/object/BrokenCartBypass.class new file mode 100644 index 000000000..f5eb9ae12 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BrokenCartBypass.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/BuyCrateOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/BuyCrateOptionPlugin.class new file mode 100644 index 000000000..466bbbb6f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/BuyCrateOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CanoeOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/CanoeOptionPlugin.class new file mode 100644 index 000000000..21c880798 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CanoeOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CavadaBerriesPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/CavadaBerriesPlugin.class new file mode 100644 index 000000000..1f5ea123b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CavadaBerriesPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ChampionsArenaPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/ChampionsArenaPlugin.class new file mode 100644 index 000000000..0fa6fd999 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ChampionsArenaPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ChampionsGuildDoor.class b/Server/build/classes/java/main/core/game/interaction/object/ChampionsGuildDoor.class new file mode 100644 index 000000000..f4aaeceb7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ChampionsGuildDoor.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ChefGuildDoorPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/ChefGuildDoorPlugin.class new file mode 100644 index 000000000..5a3ec4e83 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ChefGuildDoorPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CowMilkingPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/CowMilkingPlugin$1.class new file mode 100644 index 000000000..b75d1fcdb Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CowMilkingPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CowMilkingPlugin$BucketHandler.class b/Server/build/classes/java/main/core/game/interaction/object/CowMilkingPlugin$BucketHandler.class new file mode 100644 index 000000000..7218fd063 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CowMilkingPlugin$BucketHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CowMilkingPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/CowMilkingPlugin.class new file mode 100644 index 000000000..d6f8a00b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CowMilkingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CrystalChestPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/CrystalChestPlugin$1.class new file mode 100644 index 000000000..a877bef57 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CrystalChestPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CrystalChestPlugin$Reward.class b/Server/build/classes/java/main/core/game/interaction/object/CrystalChestPlugin$Reward.class new file mode 100644 index 000000000..f9b30f4d5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CrystalChestPlugin$Reward.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CrystalChestPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/CrystalChestPlugin.class new file mode 100644 index 000000000..79aa1cc61 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CrystalChestPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CrystalKeyObjectPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/CrystalKeyObjectPlugin.class new file mode 100644 index 000000000..140308aeb Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CrystalKeyObjectPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/CulinomancerChestPliugin.class b/Server/build/classes/java/main/core/game/interaction/object/CulinomancerChestPliugin.class new file mode 100644 index 000000000..04710f1a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/CulinomancerChestPliugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/DoogleLeafPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/DoogleLeafPlugin.class new file mode 100644 index 000000000..cbdd041d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/DoogleLeafPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/DoorManagingPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/DoorManagingPlugin.class new file mode 100644 index 000000000..2c32007d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/DoorManagingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/DropPartyLeverOptionPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/DropPartyLeverOptionPlugin$1.class new file mode 100644 index 000000000..2a9d9eb37 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/DropPartyLeverOptionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/DropPartyLeverOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/DropPartyLeverOptionPlugin.class new file mode 100644 index 000000000..d07e3d38d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/DropPartyLeverOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/DummyAttackPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/DummyAttackPlugin.class new file mode 100644 index 000000000..aeca152b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/DummyAttackPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$Lever.class b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$Lever.class new file mode 100644 index 000000000..a71f0983a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$Lever.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverCacheExtension$1.class b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverCacheExtension$1.class new file mode 100644 index 000000000..749af17c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverCacheExtension$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverCacheExtension$2.class b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverCacheExtension$2.class new file mode 100644 index 000000000..2b2fc3027 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverCacheExtension$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverCacheExtension.class b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverCacheExtension.class new file mode 100644 index 000000000..50729c434 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverCacheExtension.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverZone.class b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverZone.class new file mode 100644 index 000000000..577cdf8a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin$LeverZone.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin.class new file mode 100644 index 000000000..28fd86f75 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ErnestTheChickenPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/FieldPickingPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/FieldPickingPlugin$1.class new file mode 100644 index 000000000..078db59f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/FieldPickingPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/FieldPickingPlugin$PickingPlant.class b/Server/build/classes/java/main/core/game/interaction/object/FieldPickingPlugin$PickingPlant.class new file mode 100644 index 000000000..abb25f4c7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/FieldPickingPlugin$PickingPlant.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/FieldPickingPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/FieldPickingPlugin.class new file mode 100644 index 000000000..7a7f24a2f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/FieldPickingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin$FillPotHandler.class b/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin$FillPotHandler.class new file mode 100644 index 000000000..cff102764 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin$FillPotHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin$FlourExtension.class b/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin$FlourExtension.class new file mode 100644 index 000000000..d2a05d7e1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin$FlourExtension.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin$GrainHopperPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin$GrainHopperPlugin.class new file mode 100644 index 000000000..ee97e0c69 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin$GrainHopperPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin.class new file mode 100644 index 000000000..c36929313 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/FlourMakingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/GnomeSpiritTreePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/GnomeSpiritTreePlugin.class new file mode 100644 index 000000000..80869a364 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/GnomeSpiritTreePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/GoblinVillagePopulationPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/GoblinVillagePopulationPlugin.class new file mode 100644 index 000000000..21d382936 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/GoblinVillagePopulationPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/GrandExchangePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangePlugin$1.class new file mode 100644 index 000000000..26951c381 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/GrandExchangePlugin$GENPCPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangePlugin$GENPCPlugin.class new file mode 100644 index 000000000..46a6d8952 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangePlugin$GENPCPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/GrandExchangePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangePlugin.class new file mode 100644 index 000000000..9b8080f34 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/GrandExchangeShortcut$1.class b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangeShortcut$1.class new file mode 100644 index 000000000..333f8bb2c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangeShortcut$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/GrandExchangeShortcut$2.class b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangeShortcut$2.class new file mode 100644 index 000000000..b2f697471 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangeShortcut$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/GrandExchangeShortcut.class b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangeShortcut.class new file mode 100644 index 000000000..a029b1963 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/GrandExchangeShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/GuidorDoorPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/GuidorDoorPlugin.class new file mode 100644 index 000000000..65da69ae0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/GuidorDoorPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/HaystackPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/HaystackPlugin.class new file mode 100644 index 000000000..068ab5988 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/HaystackPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/JangerBerryPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/JangerBerryPlugin$1.class new file mode 100644 index 000000000..e841a480d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/JangerBerryPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/JangerBerryPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/JangerBerryPlugin.class new file mode 100644 index 000000000..d2d804493 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/JangerBerryPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/KalphiteEntranceHandler$1.class b/Server/build/classes/java/main/core/game/interaction/object/KalphiteEntranceHandler$1.class new file mode 100644 index 000000000..601cc75d4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/KalphiteEntranceHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/KalphiteEntranceHandler$2.class b/Server/build/classes/java/main/core/game/interaction/object/KalphiteEntranceHandler$2.class new file mode 100644 index 000000000..91c34e642 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/KalphiteEntranceHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/KalphiteEntranceHandler.class b/Server/build/classes/java/main/core/game/interaction/object/KalphiteEntranceHandler.class new file mode 100644 index 000000000..c538a0b10 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/KalphiteEntranceHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/KhardianInteractionPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/KhardianInteractionPlugin.class new file mode 100644 index 000000000..07be4dccb Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/KhardianInteractionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LadderManagingPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/LadderManagingPlugin.class new file mode 100644 index 000000000..0ec6556a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LadderManagingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LavaMazePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/LavaMazePlugin.class new file mode 100644 index 000000000..deb1d5302 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LavaMazePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LookAtOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/LookAtOptionPlugin.class new file mode 100644 index 000000000..d37a1000d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LookAtOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LumberYardCratePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/LumberYardCratePlugin.class new file mode 100644 index 000000000..96d13d3fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LumberYardCratePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$1.class new file mode 100644 index 000000000..c1077cce9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$FishMongerDialogue.class b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$FishMongerDialogue.class new file mode 100644 index 000000000..8e49e489f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$FishMongerDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$LightCreatureHandler.class b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$LightCreatureHandler.class new file mode 100644 index 000000000..2d0a1a8fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$LightCreatureHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$LightCreatureNPC.class b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$LightCreatureNPC.class new file mode 100644 index 000000000..09976d68f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin$LightCreatureNPC.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin.class new file mode 100644 index 000000000..a6a76670d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeBasementPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/LumbridgeSwampHolePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeSwampHolePlugin.class new file mode 100644 index 000000000..a9b90253d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/LumbridgeSwampHolePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ModeratorObject.class b/Server/build/classes/java/main/core/game/interaction/object/ModeratorObject.class new file mode 100644 index 000000000..ed15204f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ModeratorObject.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/MossGiantRopePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/MossGiantRopePlugin.class new file mode 100644 index 000000000..b04a9e6df Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/MossGiantRopePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/MoyrtniaSwampPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/MoyrtniaSwampPlugin.class new file mode 100644 index 000000000..8fb027d16 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/MoyrtniaSwampPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/MuseumGatePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/MuseumGatePlugin.class new file mode 100644 index 000000000..6aa55c433 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/MuseumGatePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/PortsObjectPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/PortsObjectPlugin.class new file mode 100644 index 000000000..40545ac65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/PortsObjectPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/PriestInPerilOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/PriestInPerilOptionPlugin.class new file mode 100644 index 000000000..3ed89a5b1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/PriestInPerilOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin$1.class new file mode 100644 index 000000000..58a27eeb6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin$2.class b/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin$2.class new file mode 100644 index 000000000..619602405 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin$3.class b/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin$3.class new file mode 100644 index 000000000..fea0678b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin.class new file mode 100644 index 000000000..5a435108e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ProspectOrePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$1.class new file mode 100644 index 000000000..c0683486f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$2.class b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$2.class new file mode 100644 index 000000000..8a72c0826 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$FerociousBarbarianNPC.class b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$FerociousBarbarianNPC.class new file mode 100644 index 000000000..af690633f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$FerociousBarbarianNPC.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$LogType.class b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$LogType.class new file mode 100644 index 000000000..9bfa42e7f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin$LogType.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin.class new file mode 100644 index 000000000..db4ff01d8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/PyreSitePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ReadSignPostPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/ReadSignPostPlugin$1.class new file mode 100644 index 000000000..eb71c4c98 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ReadSignPostPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ReadSignPostPlugin$Signs.class b/Server/build/classes/java/main/core/game/interaction/object/ReadSignPostPlugin$Signs.class new file mode 100644 index 000000000..601000038 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ReadSignPostPlugin$Signs.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ReadSignPostPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/ReadSignPostPlugin.class new file mode 100644 index 000000000..858ccedf9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ReadSignPostPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/RedberryBushPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/RedberryBushPlugin.class new file mode 100644 index 000000000..c8709773f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/RedberryBushPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/RomeoQuestPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/RomeoQuestPlugin.class new file mode 100644 index 000000000..73e2e75ce Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/RomeoQuestPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/RuneCraftingGuildObjects.class b/Server/build/classes/java/main/core/game/interaction/object/RuneCraftingGuildObjects.class new file mode 100644 index 000000000..74fd60936 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/RuneCraftingGuildObjects.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/SearchOptionPlugin$Search.class b/Server/build/classes/java/main/core/game/interaction/object/SearchOptionPlugin$Search.class new file mode 100644 index 000000000..8d43aa54d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/SearchOptionPlugin$Search.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/SearchOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/SearchOptionPlugin.class new file mode 100644 index 000000000..fbb21fe13 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/SearchOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/SeersCageUnlockPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/SeersCageUnlockPlugin.class new file mode 100644 index 000000000..e4337d572 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/SeersCageUnlockPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ShantayPassPlugin$ShantayComponentPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/ShantayPassPlugin$ShantayComponentPlugin.class new file mode 100644 index 000000000..0ab64865e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ShantayPassPlugin$ShantayComponentPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ShantayPassPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/ShantayPassPlugin.class new file mode 100644 index 000000000..d51f7a351 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ShantayPassPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/SilverCastingInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/SilverCastingInterfacePlugin.class new file mode 100644 index 000000000..280d87fc1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/SilverCastingInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/SinclairFlourBarrelPlugin$FlourHandler.class b/Server/build/classes/java/main/core/game/interaction/object/SinclairFlourBarrelPlugin$FlourHandler.class new file mode 100644 index 000000000..76fccb36d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/SinclairFlourBarrelPlugin$FlourHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/SinclairFlourBarrelPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/SinclairFlourBarrelPlugin.class new file mode 100644 index 000000000..585e47945 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/SinclairFlourBarrelPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/SlashWebPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/SlashWebPlugin.class new file mode 100644 index 000000000..099ae267b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/SlashWebPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/SlayerDangerSignPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/SlayerDangerSignPlugin.class new file mode 100644 index 000000000..828c854e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/SlayerDangerSignPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/SpinSpinningWheelPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/SpinSpinningWheelPlugin.class new file mode 100644 index 000000000..2d1f3ce6a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/SpinSpinningWheelPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ThievingGuidePlugin$1$1.class b/Server/build/classes/java/main/core/game/interaction/object/ThievingGuidePlugin$1$1.class new file mode 100644 index 000000000..fec129461 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ThievingGuidePlugin$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ThievingGuidePlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/ThievingGuidePlugin$1.class new file mode 100644 index 000000000..d31db0989 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ThievingGuidePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/ThievingGuidePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/ThievingGuidePlugin.class new file mode 100644 index 000000000..42b9c201e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/ThievingGuidePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/TollGateOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/TollGateOptionPlugin.class new file mode 100644 index 000000000..0b4231d39 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/TollGateOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/VampireSlayerPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/VampireSlayerPlugin.class new file mode 100644 index 000000000..5f60e58f2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/VampireSlayerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WantedPoster.class b/Server/build/classes/java/main/core/game/interaction/object/WantedPoster.class new file mode 100644 index 000000000..e58b49559 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WantedPoster.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$1.class new file mode 100644 index 000000000..002edd8c9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverDialogue.class b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverDialogue.class new file mode 100644 index 000000000..6d6b4b5b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverSets$1.class b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverSets$1.class new file mode 100644 index 000000000..2a3f52d7a Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverSets$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverSets$2.class b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverSets$2.class new file mode 100644 index 000000000..a8ba36c18 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverSets$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverSets.class b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverSets.class new file mode 100644 index 000000000..dd94e5e8d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin$LeverSets.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin.class new file mode 100644 index 000000000..ce05055ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WildernessLeverPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WildernessObeliskPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/WildernessObeliskPlugin$1.class new file mode 100644 index 000000000..26312de2e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WildernessObeliskPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WildernessObeliskPlugin$Obelisk.class b/Server/build/classes/java/main/core/game/interaction/object/WildernessObeliskPlugin$Obelisk.class new file mode 100644 index 000000000..204d2adab Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WildernessObeliskPlugin$Obelisk.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WildernessObeliskPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/WildernessObeliskPlugin.class new file mode 100644 index 000000000..dd9f9844b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WildernessObeliskPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WitchsPotionPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/WitchsPotionPlugin.class new file mode 100644 index 000000000..9ec32428c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WitchsPotionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/WydinDoorPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/WydinDoorPlugin.class new file mode 100644 index 000000000..4c8c0d9b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/WydinDoorPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$1.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$1.class new file mode 100644 index 000000000..0d639e26b Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$2.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$2.class new file mode 100644 index 000000000..0d8da4d09 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$3$1.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$3$1.class new file mode 100644 index 000000000..59a1893e9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$3$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$3.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$3.class new file mode 100644 index 000000000..ef0332fc3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$4.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$4.class new file mode 100644 index 000000000..26a90bd68 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler$4.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler.class new file mode 100644 index 000000000..b0fa5a5c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCHandler.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$1.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$1.class new file mode 100644 index 000000000..c49693ab7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$2.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$2.class new file mode 100644 index 000000000..04d8efaff Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$3.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$3.class new file mode 100644 index 000000000..94647a93f Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$4.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$4.class new file mode 100644 index 000000000..d774ff0fc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$4.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$5.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$5.class new file mode 100644 index 000000000..a23c83a43 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$5.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$6.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$6.class new file mode 100644 index 000000000..65b6076bf Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$6.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$7.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$7.class new file mode 100644 index 000000000..1b98f70e6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$7.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$8.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$8.class new file mode 100644 index 000000000..54bd11624 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution$8.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution.class new file mode 100644 index 000000000..aac1ddcc6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCRevolution.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCZone.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCZone.class new file mode 100644 index 000000000..969150c21 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DMCZone.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DwarfMultiCannonPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DwarfMultiCannonPlugin$1.class new file mode 100644 index 000000000..abcbb0fd1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DwarfMultiCannonPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.class new file mode 100644 index 000000000..bcdc15faa Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$1.class new file mode 100644 index 000000000..67696fe60 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$2.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$2.class new file mode 100644 index 000000000..d06858e40 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$3.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$3.class new file mode 100644 index 000000000..e7de5985e Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$3.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$HerbDefinition.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$HerbDefinition.class new file mode 100644 index 000000000..8e05287f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$HerbDefinition.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$OsmanDialogue.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$OsmanDialogue.class new file mode 100644 index 000000000..645f03a09 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$OsmanDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$SeasonDefinitions.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$SeasonDefinitions.class new file mode 100644 index 000000000..b10904b30 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$SeasonDefinitions.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$SqirkJuicePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$SqirkJuicePlugin.class new file mode 100644 index 000000000..f4a4fc01c Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$SqirkJuicePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$SqirkMakingDialogue.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$SqirkMakingDialogue.class new file mode 100644 index 000000000..c961ff520 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin$SqirkMakingDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin.class new file mode 100644 index 000000000..4a080f0e2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/GardenObjectsPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/sorceress/SorceressGardenObject.class b/Server/build/classes/java/main/core/game/interaction/object/sorceress/SorceressGardenObject.class new file mode 100644 index 000000000..f9934ec04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/sorceress/SorceressGardenObject.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/wildyditch/WildernessDitchPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/object/wildyditch/WildernessDitchPlugin$1.class new file mode 100644 index 000000000..e9bcbad46 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/wildyditch/WildernessDitchPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/wildyditch/WildernessDitchPlugin.class b/Server/build/classes/java/main/core/game/interaction/object/wildyditch/WildernessDitchPlugin.class new file mode 100644 index 000000000..3703d7268 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/wildyditch/WildernessDitchPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.class b/Server/build/classes/java/main/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.class new file mode 100644 index 000000000..d8ba9e77d Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/player/AttackOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/player/AttackOptionPlugin.class new file mode 100644 index 000000000..331828dc4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/player/AttackOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/player/ExamineOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/player/ExamineOptionPlugin.class new file mode 100644 index 000000000..8cd5d4eb8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/player/ExamineOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/player/FollowOptionPlugin$1.class b/Server/build/classes/java/main/core/game/interaction/player/FollowOptionPlugin$1.class new file mode 100644 index 000000000..e96880834 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/player/FollowOptionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/player/FollowOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/player/FollowOptionPlugin.class new file mode 100644 index 000000000..48acef8bc Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/player/FollowOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/player/LoginValidationPlugin.class b/Server/build/classes/java/main/core/game/interaction/player/LoginValidationPlugin.class new file mode 100644 index 000000000..a97554c82 Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/player/LoginValidationPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/interaction/player/RequestOptionPlugin.class b/Server/build/classes/java/main/core/game/interaction/player/RequestOptionPlugin.class new file mode 100644 index 000000000..72a8884ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/interaction/player/RequestOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/Node.class b/Server/build/classes/java/main/core/game/node/Node.class new file mode 100644 index 000000000..b39c28e7f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/Node.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/Entity$1.class b/Server/build/classes/java/main/core/game/node/entity/Entity$1.class new file mode 100644 index 000000000..ce4cf834c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/Entity$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/Entity$2.class b/Server/build/classes/java/main/core/game/node/entity/Entity$2.class new file mode 100644 index 000000000..fab76697d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/Entity$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/Entity$3.class b/Server/build/classes/java/main/core/game/node/entity/Entity$3.class new file mode 100644 index 000000000..3b4189693 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/Entity$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/Entity$4.class b/Server/build/classes/java/main/core/game/node/entity/Entity$4.class new file mode 100644 index 000000000..7081f3c7c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/Entity$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/Entity$5.class b/Server/build/classes/java/main/core/game/node/entity/Entity$5.class new file mode 100644 index 000000000..a5d70897b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/Entity$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/Entity.class b/Server/build/classes/java/main/core/game/node/entity/Entity.class new file mode 100644 index 000000000..862c0510b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/Entity.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/BattleState.class b/Server/build/classes/java/main/core/game/node/entity/combat/BattleState.class new file mode 100644 index 000000000..2fbf25b30 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/BattleState.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/CombatSpell.class b/Server/build/classes/java/main/core/game/node/entity/combat/CombatSpell.class new file mode 100644 index 000000000..675752d67 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/CombatSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/CombatStyle.class b/Server/build/classes/java/main/core/game/node/entity/combat/CombatStyle.class new file mode 100644 index 000000000..18032e440 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/CombatStyle.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/DeathTask.class b/Server/build/classes/java/main/core/game/node/entity/combat/DeathTask.class new file mode 100644 index 000000000..98394e8e9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/DeathTask.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler$1.class b/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler$1.class new file mode 100644 index 000000000..0d286a9b6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler$HitsplatType.class b/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler$HitsplatType.class new file mode 100644 index 000000000..bea54aceb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler$HitsplatType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler$Impact.class b/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler$Impact.class new file mode 100644 index 000000000..05172ebeb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler$Impact.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler.class new file mode 100644 index 000000000..2f4c7d173 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/ImpactHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/InteractionType.class b/Server/build/classes/java/main/core/game/node/entity/combat/InteractionType.class new file mode 100644 index 000000000..0ef3e046b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/InteractionType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/Ammunition.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/Ammunition.class new file mode 100644 index 000000000..5295e6608 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/Ammunition.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$1.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$1.class new file mode 100644 index 000000000..c89486f0f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$2.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$2.class new file mode 100644 index 000000000..bb7f2e797 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$3.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$3.class new file mode 100644 index 000000000..3736aaec4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$4.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$4.class new file mode 100644 index 000000000..d82c2cfd8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$5.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$5.class new file mode 100644 index 000000000..cb5bbb484 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$6.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$6.class new file mode 100644 index 000000000..9b41ae397 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet.class new file mode 100644 index 000000000..7844cdd15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/ArmourSet.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$1.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$1.class new file mode 100644 index 000000000..c7f379efe Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$10.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$10.class new file mode 100644 index 000000000..8646940ac Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$10.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$2.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$2.class new file mode 100644 index 000000000..466939285 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$3.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$3.class new file mode 100644 index 000000000..32c88a689 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$4.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$4.class new file mode 100644 index 000000000..2ac3ffd89 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$5.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$5.class new file mode 100644 index 000000000..7a3f10877 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$6.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$6.class new file mode 100644 index 000000000..c3923b4ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$7.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$7.class new file mode 100644 index 000000000..6ec7b608b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$7.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$8.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$8.class new file mode 100644 index 000000000..cc44825f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$8.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$9.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$9.class new file mode 100644 index 000000000..604694584 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect$9.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect.class new file mode 100644 index 000000000..25c3d2dca Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/BoltEffect.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/DefaultCombatSpell.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/DefaultCombatSpell.class new file mode 100644 index 000000000..10980ba06 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/DefaultCombatSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/DegradableEquipment.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/DegradableEquipment.class new file mode 100644 index 000000000..6b08ef25e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/DegradableEquipment.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$1.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$1.class new file mode 100644 index 000000000..456c7c4e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$2.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$2.class new file mode 100644 index 000000000..c5e50878e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$3.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$3.class new file mode 100644 index 000000000..69e2e5427 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$4.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$4.class new file mode 100644 index 000000000..5ae3b5874 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType.class new file mode 100644 index 000000000..7194ce9d2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/FireType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/RangeWeapon.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/RangeWeapon.class new file mode 100644 index 000000000..2bf323a77 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/RangeWeapon.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$1.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$1.class new file mode 100644 index 000000000..0895b0d31 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$10.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$10.class new file mode 100644 index 000000000..f1178d2d8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$10.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$11.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$11.class new file mode 100644 index 000000000..29ac3473b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$11.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$12.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$12.class new file mode 100644 index 000000000..2c1677b8b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$12.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$13.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$13.class new file mode 100644 index 000000000..d7e5b8c18 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$13.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$2.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$2.class new file mode 100644 index 000000000..5599af651 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$3.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$3.class new file mode 100644 index 000000000..8e0ea8caa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$4.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$4.class new file mode 100644 index 000000000..ea045d3da Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$5.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$5.class new file mode 100644 index 000000000..d9471bb8f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$6.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$6.class new file mode 100644 index 000000000..5a72fccf7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$7.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$7.class new file mode 100644 index 000000000..7701aa4c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$7.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$8.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$8.class new file mode 100644 index 000000000..fbf09645b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$8.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$9.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$9.class new file mode 100644 index 000000000..e705b4246 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType$9.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType.class new file mode 100644 index 000000000..fce993ea1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SpellType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SwitchAttack.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SwitchAttack.class new file mode 100644 index 000000000..8f26abf77 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/SwitchAttack.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/Weapon$WeaponType.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/Weapon$WeaponType.class new file mode 100644 index 000000000..df4d5dacd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/Weapon$WeaponType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/Weapon.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/Weapon.class new file mode 100644 index 000000000..8393c6bb5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/Weapon.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/WeaponInterface$AttackStyle.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/WeaponInterface$AttackStyle.class new file mode 100644 index 000000000..7a2e92648 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/WeaponInterface$AttackStyle.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/WeaponInterface$WeaponInterfaces.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/WeaponInterface$WeaponInterfaces.class new file mode 100644 index 000000000..d9d029a67 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/WeaponInterface$WeaponInterfaces.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/equipment/WeaponInterface.class b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/WeaponInterface.class new file mode 100644 index 000000000..caf4800c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/equipment/WeaponInterface.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/handlers/ChinchompaSwingHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/handlers/ChinchompaSwingHandler.class new file mode 100644 index 000000000..1faea10a0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/handlers/ChinchompaSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/handlers/DragonfireSwingHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/handlers/DragonfireSwingHandler.class new file mode 100644 index 000000000..bc118a891 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/handlers/DragonfireSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/AncientMaceSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/AncientMaceSpecialHandler.class new file mode 100644 index 000000000..a84c59f25 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/AncientMaceSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/BackstabSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/BackstabSpecialHandler.class new file mode 100644 index 000000000..4172c9206 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/BackstabSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler$1.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler$1.class new file mode 100644 index 000000000..2e2ecb852 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler$2.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler$2.class new file mode 100644 index 000000000..3907a104c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler$3.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler$3.class new file mode 100644 index 000000000..5da3c736b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler.class new file mode 100644 index 000000000..a30e49c36 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/ChainhitSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/CleaveSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/CleaveSpecialHandler.class new file mode 100644 index 000000000..50956865e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/CleaveSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/ClobberSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/ClobberSpecialHandler.class new file mode 100644 index 000000000..c15d59694 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/ClobberSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/DescentOfDarknessSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/DescentOfDarknessSpecialHandler.class new file mode 100644 index 000000000..07c28d813 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/DescentOfDarknessSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/EnergyDrainSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/EnergyDrainSpecialHandler.class new file mode 100644 index 000000000..3a7cf1133 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/EnergyDrainSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/ExcaliburSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/ExcaliburSpecialHandler.class new file mode 100644 index 000000000..787231fb3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/ExcaliburSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/FeintSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/FeintSpecialHandler.class new file mode 100644 index 000000000..d0c19e6b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/FeintSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/HealingBladeSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/HealingBladeSpecialHandler.class new file mode 100644 index 000000000..2e44d31e7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/HealingBladeSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/IceCleaveSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/IceCleaveSpecialHandler.class new file mode 100644 index 000000000..1ad336314 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/IceCleaveSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/ImpaleSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/ImpaleSpecialHandler.class new file mode 100644 index 000000000..ff9d57994 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/ImpaleSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/JudgementSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/JudgementSpecialHandler.class new file mode 100644 index 000000000..994ea7f32 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/JudgementSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/PowershotSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/PowershotSpecialHandler.class new file mode 100644 index 000000000..5e237f59d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/PowershotSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/PowerstabSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/PowerstabSpecialHandler.class new file mode 100644 index 000000000..cdbcf7846 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/PowerstabSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/PunctureSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/PunctureSpecialHandler.class new file mode 100644 index 000000000..b985ea85e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/PunctureSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/QuickSmashSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/QuickSmashSpecialHandler.class new file mode 100644 index 000000000..3811f9ca7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/QuickSmashSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/RampageSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/RampageSpecialHandler.class new file mode 100644 index 000000000..14d7cc1b0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/RampageSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/SaradominsLightningHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/SaradominsLightningHandler.class new file mode 100644 index 000000000..946dacc7a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/SaradominsLightningHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/SeverSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/SeverSpecialHandler.class new file mode 100644 index 000000000..ff245fe32 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/SeverSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/ShatterSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/ShatterSpecialHandler.class new file mode 100644 index 000000000..74462ed8d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/ShatterSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/ShoveSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/ShoveSpecialHandler.class new file mode 100644 index 000000000..3ffa3e293 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/ShoveSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/SliceAndDiceSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/SliceAndDiceSpecialHandler.class new file mode 100644 index 000000000..be6eccad3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/SliceAndDiceSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/SmashSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/SmashSpecialHandler.class new file mode 100644 index 000000000..227a2af39 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/SmashSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/SnapshotSpecialHandler$1.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/SnapshotSpecialHandler$1.class new file mode 100644 index 000000000..25e82dc21 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/SnapshotSpecialHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/SnapshotSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/SnapshotSpecialHandler.class new file mode 100644 index 000000000..2da7bf844 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/SnapshotSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/SnipeSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/SnipeSpecialHandler.class new file mode 100644 index 000000000..9924bfbd4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/SnipeSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/SpearWallSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/SpearWallSpecialHandler.class new file mode 100644 index 000000000..83e1abc7c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/SpearWallSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/SweepSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/SweepSpecialHandler.class new file mode 100644 index 000000000..d5a3929b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/SweepSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/special/WarstrikeSpecialHandler.class b/Server/build/classes/java/main/core/game/node/entity/combat/special/WarstrikeSpecialHandler.class new file mode 100644 index 000000000..447c5f44c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/special/WarstrikeSpecialHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/AirSpell.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/AirSpell.class new file mode 100644 index 000000000..743905a0c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/AirSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/BindSpell.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/BindSpell.class new file mode 100644 index 000000000..dddc0ae7f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/BindSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/BloodSpells.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/BloodSpells.class new file mode 100644 index 000000000..14bb296d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/BloodSpells.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/CrumbleUndead.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/CrumbleUndead.class new file mode 100644 index 000000000..fef7dd815 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/CrumbleUndead.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/CurseSpells$1.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/CurseSpells$1.class new file mode 100644 index 000000000..084e2f9be Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/CurseSpells$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/CurseSpells.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/CurseSpells.class new file mode 100644 index 000000000..81e8a44fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/CurseSpells.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/EarthSpell.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/EarthSpell.class new file mode 100644 index 000000000..51e5615a7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/EarthSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/FireSpell.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/FireSpell.class new file mode 100644 index 000000000..11b5e8b04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/FireSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/GodSpells.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/GodSpells.class new file mode 100644 index 000000000..781e1659f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/GodSpells.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/IbanBlast.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/IbanBlast.class new file mode 100644 index 000000000..518fcc8f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/IbanBlast.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/IceSpells.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/IceSpells.class new file mode 100644 index 000000000..cee124e26 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/IceSpells.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/MagicDart.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/MagicDart.class new file mode 100644 index 000000000..c2c5eaa29 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/MagicDart.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/MiasmicSpells.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/MiasmicSpells.class new file mode 100644 index 000000000..569650b6e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/MiasmicSpells.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/ShadowSpells.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/ShadowSpells.class new file mode 100644 index 000000000..1b84aa4dc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/ShadowSpells.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/SmokeSpells.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/SmokeSpells.class new file mode 100644 index 000000000..e0bee6f84 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/SmokeSpells.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/SonicWaveSpell.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/SonicWaveSpell.class new file mode 100644 index 000000000..90fe1ed60 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/SonicWaveSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/SpellBlocks.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/SpellBlocks.class new file mode 100644 index 000000000..a2b50e608 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/SpellBlocks.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/combat/spell/WaterSpell.class b/Server/build/classes/java/main/core/game/node/entity/combat/spell/WaterSpell.class new file mode 100644 index 000000000..abf7bb96c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/combat/spell/WaterSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/impl/Animator$Priority.class b/Server/build/classes/java/main/core/game/node/entity/impl/Animator$Priority.class new file mode 100644 index 000000000..2e742bb82 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/impl/Animator$Priority.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/impl/Animator.class b/Server/build/classes/java/main/core/game/node/entity/impl/Animator.class new file mode 100644 index 000000000..e3e0376f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/impl/Animator.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/impl/ForceMovement.class b/Server/build/classes/java/main/core/game/node/entity/impl/ForceMovement.class new file mode 100644 index 000000000..846346eee Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/impl/ForceMovement.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/impl/GameAttributes.class b/Server/build/classes/java/main/core/game/node/entity/impl/GameAttributes.class new file mode 100644 index 000000000..b7bea837c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/impl/GameAttributes.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/impl/Projectile.class b/Server/build/classes/java/main/core/game/node/entity/impl/Projectile.class new file mode 100644 index 000000000..5696eb187 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/impl/Projectile.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/impl/Properties.class b/Server/build/classes/java/main/core/game/node/entity/impl/Properties.class new file mode 100644 index 000000000..c4cf2614d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/impl/Properties.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/impl/PulseManager$1.class b/Server/build/classes/java/main/core/game/node/entity/impl/PulseManager$1.class new file mode 100644 index 000000000..5e4ebef7f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/impl/PulseManager$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/impl/PulseManager.class b/Server/build/classes/java/main/core/game/node/entity/impl/PulseManager.class new file mode 100644 index 000000000..2682c2b0c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/impl/PulseManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/impl/WalkingQueue.class b/Server/build/classes/java/main/core/game/node/entity/impl/WalkingQueue.class new file mode 100644 index 000000000..f13b9866e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/impl/WalkingQueue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/lock/ActionLocks.class b/Server/build/classes/java/main/core/game/node/entity/lock/ActionLocks.class new file mode 100644 index 000000000..36615675a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/lock/ActionLocks.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/lock/Lock.class b/Server/build/classes/java/main/core/game/node/entity/lock/Lock.class new file mode 100644 index 000000000..33695e320 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/lock/Lock.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/lock/LockElapse.class b/Server/build/classes/java/main/core/game/node/entity/lock/LockElapse.class new file mode 100644 index 000000000..54c2268e6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/lock/LockElapse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/AbstractNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/AbstractNPC.class new file mode 100644 index 000000000..4669a19d3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/AbstractNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/IdleAbstractNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/IdleAbstractNPC.class new file mode 100644 index 000000000..99a1d41e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/IdleAbstractNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/Metamorphosis.class b/Server/build/classes/java/main/core/game/node/entity/npc/Metamorphosis.class new file mode 100644 index 000000000..d384a8f73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/Metamorphosis.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/NPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/NPC$1.class new file mode 100644 index 000000000..4173fc867 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/NPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/NPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/NPC.class new file mode 100644 index 000000000..62b4b283e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/NPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/agg/AggressiveBehavior$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/agg/AggressiveBehavior$1.class new file mode 100644 index 000000000..313fc557c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/agg/AggressiveBehavior$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/agg/AggressiveBehavior.class b/Server/build/classes/java/main/core/game/node/entity/npc/agg/AggressiveBehavior.class new file mode 100644 index 000000000..088e31a2b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/agg/AggressiveBehavior.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/agg/AggressiveHandler.class b/Server/build/classes/java/main/core/game/node/entity/npc/agg/AggressiveHandler.class new file mode 100644 index 000000000..779c82906 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/agg/AggressiveHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$1.class new file mode 100644 index 000000000..72c2b5331 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$2.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$2.class new file mode 100644 index 000000000..1f87075d1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$3.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$3.class new file mode 100644 index 000000000..03eaaef97 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$4$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$4$1.class new file mode 100644 index 000000000..e96c3bab5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$4$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$4.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$4.class new file mode 100644 index 000000000..1f854b2d0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$5.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$5.class new file mode 100644 index 000000000..091ba35e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC.class new file mode 100644 index 000000000..e9fdb4aa6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/GiantMoleNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC$1.class new file mode 100644 index 000000000..cd5f36104 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC$KQCombatSwingHandler$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC$KQCombatSwingHandler$1.class new file mode 100644 index 000000000..834d9dad5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC$KQCombatSwingHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC$KQCombatSwingHandler.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC$KQCombatSwingHandler.class new file mode 100644 index 000000000..7271c06eb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC$KQCombatSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC.class new file mode 100644 index 000000000..b8bcd707a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/KalphiteQueenNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TormentedDemonNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TormentedDemonNPC$1.class new file mode 100644 index 000000000..5a1134a45 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TormentedDemonNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TormentedDemonNPC$TormentedDemonSwingHandler.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TormentedDemonNPC$TormentedDemonSwingHandler.class new file mode 100644 index 000000000..2071787fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TormentedDemonNPC$TormentedDemonSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TormentedDemonNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TormentedDemonNPC.class new file mode 100644 index 000000000..76e8e6b54 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TormentedDemonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TzRekJadNPC$TzRekJadDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TzRekJadNPC$TzRekJadDialogue.class new file mode 100644 index 000000000..904b7e65d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TzRekJadNPC$TzRekJadDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TzRekJadNPC$TzhaarMejJalDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TzRekJadNPC$TzhaarMejJalDialogue.class new file mode 100644 index 000000000..6fae1b52d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TzRekJadNPC$TzhaarMejJalDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TzRekJadNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TzRekJadNPC.class new file mode 100644 index 000000000..7f4a8043e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/TzRekJadNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC$CombatHandler$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC$CombatHandler$1.class new file mode 100644 index 000000000..2a1b91145 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC$CombatHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC$CombatHandler$2.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC$CombatHandler$2.class new file mode 100644 index 000000000..3c77df511 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC$CombatHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC$CombatHandler.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC$CombatHandler.class new file mode 100644 index 000000000..4e8b882f9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC$CombatHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC.class new file mode 100644 index 000000000..cc467c8b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/DarkEnergyCoreNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/DarkEnergyCoreNPC$1.class new file mode 100644 index 000000000..2d191a47d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/DarkEnergyCoreNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/DarkEnergyCoreNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/DarkEnergyCoreNPC.class new file mode 100644 index 000000000..7c14ec17d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/corp/DarkEnergyCoreNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC$ChaosCombatHandler$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC$ChaosCombatHandler$1.class new file mode 100644 index 000000000..91fc529ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC$ChaosCombatHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC$ChaosCombatHandler$2.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC$ChaosCombatHandler$2.class new file mode 100644 index 000000000..361cc79e4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC$ChaosCombatHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC$ChaosCombatHandler.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC$ChaosCombatHandler.class new file mode 100644 index 000000000..f4aabc166 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC$ChaosCombatHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.class new file mode 100644 index 000000000..e0b5f36ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC$1.class new file mode 100644 index 000000000..9215f41ec Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC$KBDCombatSwingHandler.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC$KBDCombatSwingHandler.class new file mode 100644 index 000000000..ca33c5573 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC$KBDCombatSwingHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.class new file mode 100644 index 000000000..d021e9666 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AlKharidShopKeeperDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AlKharidShopKeeperDialogue.class new file mode 100644 index 000000000..ef1535a02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AlKharidShopKeeperDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AlTheCamelDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AlTheCamelDialogue.class new file mode 100644 index 000000000..3668a1f21 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AlTheCamelDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AliMorrisaneDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AliMorrisaneDialogue.class new file mode 100644 index 000000000..e9ebc8b97 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AliMorrisaneDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AliTheLeafletDropper.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AliTheLeafletDropper.class new file mode 100644 index 000000000..1e314c93c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/alkharid/AliTheLeafletDropper.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/falador/gardensupplier.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/falador/gardensupplier.class new file mode 100644 index 000000000..81a33f89d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/falador/gardensupplier.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/AliTheCarter.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/AliTheCarter.class new file mode 100644 index 000000000..56f61c8db Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/AliTheCarter.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/ArtimeusDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/ArtimeusDialogue.class new file mode 100644 index 000000000..dc059abfb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/ArtimeusDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Awusah.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Awusah.class new file mode 100644 index 000000000..a71862ae4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Awusah.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Ghaslor.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Ghaslor.class new file mode 100644 index 000000000..08d5ca929 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Ghaslor.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Kazemde$KazemdeDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Kazemde$KazemdeDialogue.class new file mode 100644 index 000000000..c4a4c5d97 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Kazemde$KazemdeDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Kazemde.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Kazemde.class new file mode 100644 index 000000000..2dace8a7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Kazemde.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Rokuh$RokuhDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Rokuh$RokuhDialogue.class new file mode 100644 index 000000000..481935621 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Rokuh$RokuhDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Rokuh.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Rokuh.class new file mode 100644 index 000000000..803b25318 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Rokuh.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Seddu.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Seddu.class new file mode 100644 index 000000000..f29163bc2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/nardah/Seddu.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliCamelMan.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliCamelMan.class new file mode 100644 index 000000000..965418933 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliCamelMan.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler$AliTheCamelDialogue$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler$AliTheCamelDialogue$1.class new file mode 100644 index 000000000..4650e5f7b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler$AliTheCamelDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler$AliTheCamelDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler$AliTheCamelDialogue.class new file mode 100644 index 000000000..fde9ab876 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler$AliTheCamelDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler.class new file mode 100644 index 000000000..6a051d1da Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheKebabSeller.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheKebabSeller.class new file mode 100644 index 000000000..ccec624d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/AliTheKebabSeller.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/BlackJackSeller.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/BlackJackSeller.class new file mode 100644 index 000000000..d8c098a01 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/BlackJackSeller.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/DesertBandit$BanditDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/DesertBandit$BanditDialogue.class new file mode 100644 index 000000000..b911dfbda Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/DesertBandit$BanditDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/DesertBandit.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/DesertBandit.class new file mode 100644 index 000000000..ed0a3017d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/DesertBandit.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/SnakeCharmerBasket$AliTheSnakeCharmer.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/SnakeCharmerBasket$AliTheSnakeCharmer.class new file mode 100644 index 000000000..269a060b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/SnakeCharmerBasket$AliTheSnakeCharmer.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/SnakeCharmerBasket.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/SnakeCharmerBasket.class new file mode 100644 index 000000000..7c85fff73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/SnakeCharmerBasket.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/StreetUrchinDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/StreetUrchinDialogue.class new file mode 100644 index 000000000..302ae3a5a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/pollnivneach/StreetUrchinDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/KlenterNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/KlenterNPC.class new file mode 100644 index 000000000..f54ee6d6f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/KlenterNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/SphinxDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/SphinxDialogue.class new file mode 100644 index 000000000..8eec3cba9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/SphinxDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/TarikDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/TarikDialogue.class new file mode 100644 index 000000000..f1c89a431 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/TarikDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/WallShortcut$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/WallShortcut$1.class new file mode 100644 index 000000000..0314bc613 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/WallShortcut$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/WallShortcut.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/WallShortcut.class new file mode 100644 index 000000000..5cd59b7a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/sophanem/WallShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/tzhaar/TzHaarMejJah.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/tzhaar/TzHaarMejJah.class new file mode 100644 index 000000000..31b036268 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/tzhaar/TzHaarMejJah.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/tzhaar/TzHaarMejKah.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/tzhaar/TzHaarMejKah.class new file mode 100644 index 000000000..0ad23c2c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/tzhaar/TzHaarMejKah.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/MuseumGuardDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/MuseumGuardDialogue.class new file mode 100644 index 000000000..16e4cfea6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/MuseumGuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/MuseumGuardVarrockDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/MuseumGuardVarrockDialogue.class new file mode 100644 index 000000000..705986b76 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/MuseumGuardVarrockDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/MuseumHistorianDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/MuseumHistorianDialogue.class new file mode 100644 index 000000000..02cd48807 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/MuseumHistorianDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/SchoolchildMuseumDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/SchoolchildMuseumDialogue.class new file mode 100644 index 000000000..4e7d0b01a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/SchoolchildMuseumDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumDialogue.class new file mode 100644 index 000000000..c1b0f6892 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumMaleDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumMaleDialogue.class new file mode 100644 index 000000000..9a548bc9d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumMaleDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockBartenderDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockBartenderDialogue.class new file mode 100644 index 000000000..53f67fdfa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockBartenderDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockBrokenCart.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockBrokenCart.class new file mode 100644 index 000000000..32aadcbcb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockBrokenCart.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockCookDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockCookDialogue.class new file mode 100644 index 000000000..af4853e42 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockCookDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockEastBartenderDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockEastBartenderDialogue.class new file mode 100644 index 000000000..cf2e1bf2d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockEastBartenderDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockGateGuardDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockGateGuardDialogue.class new file mode 100644 index 000000000..e3b804a37 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockGateGuardDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockSwordShopDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockSwordShopDialogue.class new file mode 100644 index 000000000..a45105f62 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/city/varrock/VarrockSwordShopDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/drop/DropFrequency.class b/Server/build/classes/java/main/core/game/node/entity/npc/drop/DropFrequency.class new file mode 100644 index 000000000..24fe73476 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/drop/DropFrequency.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/drop/NPCDropTables.class b/Server/build/classes/java/main/core/game/node/entity/npc/drop/NPCDropTables.class new file mode 100644 index 000000000..05439f355 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/drop/NPCDropTables.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/drop/RareDropTable.class b/Server/build/classes/java/main/core/game/node/entity/npc/drop/RareDropTable.class new file mode 100644 index 000000000..3b240ec71 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/drop/RareDropTable.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/drop/SharedTables.class b/Server/build/classes/java/main/core/game/node/entity/npc/drop/SharedTables.class new file mode 100644 index 000000000..a04eb354b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/drop/SharedTables.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AbyssalLurkerNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AbyssalLurkerNPC.class new file mode 100644 index 000000000..6ba9f4ab0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AbyssalLurkerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AbyssalParasiteNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AbyssalParasiteNPC.class new file mode 100644 index 000000000..06338b709 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AbyssalParasiteNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AbyssalTitanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AbyssalTitanNPC.class new file mode 100644 index 000000000..49c390a9a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AbyssalTitanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AlbinoRatNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AlbinoRatNPC.class new file mode 100644 index 000000000..a02cd4817 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/AlbinoRatNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ArcticBearNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ArcticBearNPC.class new file mode 100644 index 000000000..d52eee4f6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ArcticBearNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BabyChinchompaNPC$BabyChinchompaDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BabyChinchompaNPC$BabyChinchompaDialogue.class new file mode 100644 index 000000000..06f73f1da Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BabyChinchompaNPC$BabyChinchompaDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BabyChinchompaNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BabyChinchompaNPC.class new file mode 100644 index 000000000..268b6c6fb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BabyChinchompaNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BarkerToadNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BarkerToadNPC.class new file mode 100644 index 000000000..a65fd4db0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BarkerToadNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BeaverNPC$1$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BeaverNPC$1$1.class new file mode 100644 index 000000000..4897d233d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BeaverNPC$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BeaverNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BeaverNPC$1.class new file mode 100644 index 000000000..1351c3d87 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BeaverNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BeaverNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BeaverNPC.class new file mode 100644 index 000000000..1c4fedd01 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BeaverNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BloatedLeechNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BloatedLeechNPC.class new file mode 100644 index 000000000..06ffcecca Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BloatedLeechNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BullAntNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BullAntNPC.class new file mode 100644 index 000000000..a0b94a8bf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BullAntNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BunyipNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BunyipNPC$1.class new file mode 100644 index 000000000..b35d32581 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BunyipNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BunyipNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BunyipNPC.class new file mode 100644 index 000000000..20da95d48 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/BunyipNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$1.class new file mode 100644 index 000000000..6620ffe6b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritCockatrice.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritCockatrice.class new file mode 100644 index 000000000..5e82d782a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritCockatrice.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritCoraxatrice.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritCoraxatrice.class new file mode 100644 index 000000000..3f56990ec Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritCoraxatrice.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritGuthatrice.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritGuthatrice.class new file mode 100644 index 000000000..5911dbcef Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritGuthatrice.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritPengatrice.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritPengatrice.class new file mode 100644 index 000000000..57cc038aa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritPengatrice.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritVulatrice.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritVulatrice.class new file mode 100644 index 000000000..e6b4e58a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritVulatrice.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritZamatrice.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritZamatrice.class new file mode 100644 index 000000000..2a9e8e06b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC$SpiritZamatrice.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.class new file mode 100644 index 000000000..e2a118e66 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CompostMoundNPC$CompostBucketPlugin.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CompostMoundNPC$CompostBucketPlugin.class new file mode 100644 index 000000000..2928f4e6b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CompostMoundNPC$CompostBucketPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CompostMoundNPC$CompostMoundDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CompostMoundNPC$CompostMoundDialogue.class new file mode 100644 index 000000000..774bfcacb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CompostMoundNPC$CompostMoundDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CompostMoundNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CompostMoundNPC.class new file mode 100644 index 000000000..814cd85b2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/CompostMoundNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DesertWyrmNPC$1$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DesertWyrmNPC$1$1.class new file mode 100644 index 000000000..4d909a554 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DesertWyrmNPC$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DesertWyrmNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DesertWyrmNPC$1.class new file mode 100644 index 000000000..c815b8403 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DesertWyrmNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DesertWyrmNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DesertWyrmNPC.class new file mode 100644 index 000000000..3845e4d8f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DesertWyrmNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DreadfowlNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DreadfowlNPC$1.class new file mode 100644 index 000000000..eececee62 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DreadfowlNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DreadfowlNPC$2.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DreadfowlNPC$2.class new file mode 100644 index 000000000..2dc43ee7f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DreadfowlNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DreadfowlNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DreadfowlNPC.class new file mode 100644 index 000000000..b75aab6e4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/DreadfowlNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/EvilTurnipNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/EvilTurnipNPC.class new file mode 100644 index 000000000..ab6ff9095 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/EvilTurnipNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FireTitanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FireTitanNPC.class new file mode 100644 index 000000000..8df1855f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FireTitanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ForgeRegentNPC$ForgeRegentFiremake$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ForgeRegentNPC$ForgeRegentFiremake$1.class new file mode 100644 index 000000000..cd26d9e3c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ForgeRegentNPC$ForgeRegentFiremake$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ForgeRegentNPC$ForgeRegentFiremake.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ForgeRegentNPC$ForgeRegentFiremake.class new file mode 100644 index 000000000..0d40a0015 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ForgeRegentNPC$ForgeRegentFiremake.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ForgeRegentNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ForgeRegentNPC.class new file mode 100644 index 000000000..1bf36fabe Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ForgeRegentNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FruitBatNPC$1$1Pair.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FruitBatNPC$1$1Pair.class new file mode 100644 index 000000000..237bed168 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FruitBatNPC$1$1Pair.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FruitBatNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FruitBatNPC$1.class new file mode 100644 index 000000000..d0c107722 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FruitBatNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FruitBatNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FruitBatNPC.class new file mode 100644 index 000000000..af9089db8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/FruitBatNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GeyserTitanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GeyserTitanNPC.class new file mode 100644 index 000000000..11da3a0d2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GeyserTitanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GiantChinchompaNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GiantChinchompaNPC$1.class new file mode 100644 index 000000000..a0c4c9f90 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GiantChinchompaNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GiantChinchompaNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GiantChinchompaNPC.class new file mode 100644 index 000000000..a841350fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GiantChinchompaNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GiantEntNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GiantEntNPC.class new file mode 100644 index 000000000..bd4f71506 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GiantEntNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GraniteCrabNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GraniteCrabNPC.class new file mode 100644 index 000000000..9a7cb75b0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GraniteCrabNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GraniteLobsterNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GraniteLobsterNPC.class new file mode 100644 index 000000000..7ba397795 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/GraniteLobsterNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/HoneyBadgerNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/HoneyBadgerNPC.class new file mode 100644 index 000000000..1d7101e38 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/HoneyBadgerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/HydraNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/HydraNPC.class new file mode 100644 index 000000000..73c747bf8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/HydraNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IbisNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IbisNPC$1.class new file mode 100644 index 000000000..f32c6d1f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IbisNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IbisNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IbisNPC.class new file mode 100644 index 000000000..84ad4fee5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IbisNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IceTitanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IceTitanNPC.class new file mode 100644 index 000000000..2134340ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IceTitanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IronTitanNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IronTitanNPC$1.class new file mode 100644 index 000000000..5b3a7afd4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IronTitanNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IronTitanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IronTitanNPC.class new file mode 100644 index 000000000..69c8b407f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/IronTitanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/KalphiteNPC$KalphitePrincessDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/KalphiteNPC$KalphitePrincessDialogue.class new file mode 100644 index 000000000..bce09111a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/KalphiteNPC$KalphitePrincessDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/KalphiteNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/KalphiteNPC.class new file mode 100644 index 000000000..4a84fa07c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/KalphiteNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/KaramthulhuOverlordNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/KaramthulhuOverlordNPC.class new file mode 100644 index 000000000..e0fddb01c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/KaramthulhuOverlordNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/LavaTitanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/LavaTitanNPC.class new file mode 100644 index 000000000..fd2355295 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/LavaTitanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MacawNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MacawNPC$1.class new file mode 100644 index 000000000..a2bd3a0b6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MacawNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MacawNPC$MacawDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MacawNPC$MacawDialogue.class new file mode 100644 index 000000000..50318ea40 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MacawNPC$MacawDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MacawNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MacawNPC.class new file mode 100644 index 000000000..ad6984039 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MacawNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MagpieNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MagpieNPC.class new file mode 100644 index 000000000..7d6a366b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MagpieNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$1.class new file mode 100644 index 000000000..e16a44b6f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$AdamantMinotaurNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$AdamantMinotaurNPC.class new file mode 100644 index 000000000..b540ddb1c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$AdamantMinotaurNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$BronzeMinotaurNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$BronzeMinotaurNPC.class new file mode 100644 index 000000000..2a488a027 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$BronzeMinotaurNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$IronMinotaurNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$IronMinotaurNPC.class new file mode 100644 index 000000000..c7dd7c501 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$IronMinotaurNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$MithrilMinotaurNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$MithrilMinotaurNPC.class new file mode 100644 index 000000000..d3594a93d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$MithrilMinotaurNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$RuneMinotaurNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$RuneMinotaurNPC.class new file mode 100644 index 000000000..2f814e3d8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$RuneMinotaurNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$SteelMinotaurNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$SteelMinotaurNPC.class new file mode 100644 index 000000000..81cc36d3b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC$SteelMinotaurNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.class new file mode 100644 index 000000000..daa9480e7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MossTitanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MossTitanNPC.class new file mode 100644 index 000000000..0be3e3a86 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/MossTitanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ObsidianGolemNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ObsidianGolemNPC.class new file mode 100644 index 000000000..5fce1b083 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ObsidianGolemNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PackYakNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PackYakNPC.class new file mode 100644 index 000000000..aa83cfbbb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PackYakNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PrayingMantisNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PrayingMantisNPC.class new file mode 100644 index 000000000..195f98cfb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PrayingMantisNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PyreLordNPC$PyreLordFiremake$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PyreLordNPC$PyreLordFiremake$1.class new file mode 100644 index 000000000..005b4d732 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PyreLordNPC$PyreLordFiremake$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PyreLordNPC$PyreLordFiremake.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PyreLordNPC$PyreLordFiremake.class new file mode 100644 index 000000000..2870113cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PyreLordNPC$PyreLordFiremake.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PyreLordNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PyreLordNPC.class new file mode 100644 index 000000000..0aa8d7c16 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/PyreLordNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/RavenousLocustNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/RavenousLocustNPC.class new file mode 100644 index 000000000..fbee07ec6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/RavenousLocustNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SmokeDevilNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SmokeDevilNPC$1.class new file mode 100644 index 000000000..df0aae2ce Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SmokeDevilNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SmokeDevilNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SmokeDevilNPC.class new file mode 100644 index 000000000..9536eb484 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SmokeDevilNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SnakelingNPC$PetSnakelingDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SnakelingNPC$PetSnakelingDialogue.class new file mode 100644 index 000000000..59261fbe4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SnakelingNPC$PetSnakelingDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SnakelingNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SnakelingNPC.class new file mode 100644 index 000000000..a63741bdd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SnakelingNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritCobraNPC$Egg.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritCobraNPC$Egg.class new file mode 100644 index 000000000..ba536f2d1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritCobraNPC$Egg.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritCobraNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritCobraNPC.class new file mode 100644 index 000000000..dc6fbbb4f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritCobraNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritDagannothNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritDagannothNPC.class new file mode 100644 index 000000000..475c7c38a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritDagannothNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritGraahkNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritGraahkNPC.class new file mode 100644 index 000000000..f45984860 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritGraahkNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritJellyNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritJellyNPC.class new file mode 100644 index 000000000..9587ee19d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritJellyNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritKalphiteNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritKalphiteNPC$1.class new file mode 100644 index 000000000..e18b69cff Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritKalphiteNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritKalphiteNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritKalphiteNPC.class new file mode 100644 index 000000000..8aec62807 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritKalphiteNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritKyattNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritKyattNPC.class new file mode 100644 index 000000000..e5d6fe83b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritKyattNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.class new file mode 100644 index 000000000..32ccc4a7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritMosquitoNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritMosquitoNPC.class new file mode 100644 index 000000000..08caed74d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritMosquitoNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritPengatriceNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritPengatriceNPC.class new file mode 100644 index 000000000..63ba7c6be Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritPengatriceNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritScorpionNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritScorpionNPC.class new file mode 100644 index 000000000..522e93f91 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritScorpionNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritSpiderNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritSpiderNPC.class new file mode 100644 index 000000000..d3edf5e4c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritSpiderNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritTerrorbirdNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritTerrorbirdNPC.class new file mode 100644 index 000000000..bb96d028d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritTerrorbirdNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritTzKihNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritTzKihNPC.class new file mode 100644 index 000000000..a348154e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritTzKihNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritWolfNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritWolfNPC$1.class new file mode 100644 index 000000000..dc75f3937 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritWolfNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritWolfNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritWolfNPC.class new file mode 100644 index 000000000..98b8b65f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SpiritWolfNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SteelTitanNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SteelTitanNPC$1.class new file mode 100644 index 000000000..2bf34740e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SteelTitanNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SteelTitanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SteelTitanNPC.class new file mode 100644 index 000000000..0c301a9dd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SteelTitanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/StrangerPlantNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/StrangerPlantNPC.class new file mode 100644 index 000000000..72bce7ec6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/StrangerPlantNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SwampTitanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SwampTitanNPC.class new file mode 100644 index 000000000..3eea2aeb3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/SwampTitanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/TalonBeastNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/TalonBeastNPC.class new file mode 100644 index 000000000..853e231a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/TalonBeastNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ThornySnailNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ThornySnailNPC$1.class new file mode 100644 index 000000000..8e10fac6a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ThornySnailNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ThornySnailNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ThornySnailNPC.class new file mode 100644 index 000000000..41a8329f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/ThornySnailNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/UnicornStallionNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/UnicornStallionNPC$1.class new file mode 100644 index 000000000..e5a435083 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/UnicornStallionNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/UnicornStallionNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/UnicornStallionNPC.class new file mode 100644 index 000000000..22207a465 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/UnicornStallionNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VampireBatNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VampireBatNPC.class new file mode 100644 index 000000000..a239cacc1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VampireBatNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VetionNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VetionNPC.class new file mode 100644 index 000000000..a571d2f71 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VetionNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$1.class new file mode 100644 index 000000000..123f2494b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidRavagerNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidRavagerNPC.class new file mode 100644 index 000000000..eb858f0c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidRavagerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidShifterNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidShifterNPC.class new file mode 100644 index 000000000..d41784f33 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidShifterNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidSpinnerNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidSpinnerNPC.class new file mode 100644 index 000000000..f6724570e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidSpinnerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidTorcherNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidTorcherNPC$1.class new file mode 100644 index 000000000..3c6def507 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidTorcherNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidTorcherNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidTorcherNPC.class new file mode 100644 index 000000000..cb33676d1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC$VoidTorcherNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC.class new file mode 100644 index 000000000..ee24a0cf1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/VoidFamiliarNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/WarTortoiseNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/WarTortoiseNPC.class new file mode 100644 index 000000000..38170dff3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/WarTortoiseNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/familiar/WolpertingerNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/WolpertingerNPC.class new file mode 100644 index 000000000..96efe8816 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/familiar/WolpertingerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/AntonNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/AntonNPC.class new file mode 100644 index 000000000..04d261ece Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/AntonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ArmourSuitNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ArmourSuitNPC$1.class new file mode 100644 index 000000000..64fbbce8a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ArmourSuitNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ArmourSuitNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ArmourSuitNPC.class new file mode 100644 index 000000000..e546eabb9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ArmourSuitNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BarbarianNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BarbarianNPC.class new file mode 100644 index 000000000..a9e0ac93b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BarbarianNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BennyNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BennyNPC.class new file mode 100644 index 000000000..721bc5372 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BennyNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BlackKnightNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BlackKnightNPC.class new file mode 100644 index 000000000..6cefaf3f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BlackKnightNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$1.class new file mode 100644 index 000000000..90451055b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$2$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$2$1.class new file mode 100644 index 000000000..a9c8e645f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$2$2.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$2$2.class new file mode 100644 index 000000000..078858a5b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$2$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$2.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$2.class new file mode 100644 index 000000000..02f5a0ef1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$BorkCutscene$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$BorkCutscene$1.class new file mode 100644 index 000000000..90af9d1e2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$BorkCutscene$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$BorkCutscene.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$BorkCutscene.class new file mode 100644 index 000000000..de2ef775a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$BorkCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$DagonDialogue.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$DagonDialogue.class new file mode 100644 index 000000000..1305c7bd8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$DagonDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$DagonElite.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$DagonElite.class new file mode 100644 index 000000000..62e70ecfb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$DagonElite.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$OrkLegion.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$OrkLegion.class new file mode 100644 index 000000000..0c096671d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC$OrkLegion.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC.class new file mode 100644 index 000000000..45d4f6d54 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/BorkNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/CatableponNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/CatableponNPC.class new file mode 100644 index 000000000..88a18df21 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/CatableponNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ChromaticDragonNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ChromaticDragonNPC.class new file mode 100644 index 000000000..a11c747bc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ChromaticDragonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/CitizenNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/CitizenNPC.class new file mode 100644 index 000000000..75dff4e96 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/CitizenNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/CowNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/CowNPC.class new file mode 100644 index 000000000..40013c3e7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/CowNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/DarkWizardNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/DarkWizardNPC.class new file mode 100644 index 000000000..a732b3d77 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/DarkWizardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/DraynorTreeNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/DraynorTreeNPC.class new file mode 100644 index 000000000..8d9c0f764 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/DraynorTreeNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/DuckNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/DuckNPC.class new file mode 100644 index 000000000..125a1b292 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/DuckNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalMonsterNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalMonsterNPC.class new file mode 100644 index 000000000..c6b57d59b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalMonsterNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalWizardNPC$MaligniusMortifer$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalWizardNPC$MaligniusMortifer$1.class new file mode 100644 index 000000000..987859aa7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalWizardNPC$MaligniusMortifer$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalWizardNPC$MaligniusMortifer.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalWizardNPC$MaligniusMortifer.class new file mode 100644 index 000000000..d903e10cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalWizardNPC$MaligniusMortifer.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalWizardNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalWizardNPC.class new file mode 100644 index 000000000..a14db89e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ElementalWizardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/FishingNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/FishingNPC.class new file mode 100644 index 000000000..b008f7f91 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/FishingNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/GoblinVillageNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/GoblinVillageNPC.class new file mode 100644 index 000000000..4d10e46b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/GoblinVillageNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/GraveStoneNPC$GraveStonePlugin.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/GraveStoneNPC$GraveStonePlugin.class new file mode 100644 index 000000000..af586c912 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/GraveStoneNPC$GraveStonePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/GraveStoneNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/GraveStoneNPC.class new file mode 100644 index 000000000..d753ff899 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/GraveStoneNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/GuardNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/GuardNPC.class new file mode 100644 index 000000000..f601624c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/GuardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/HansNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/HansNPC.class new file mode 100644 index 000000000..9a3192fb5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/HansNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/HighwayManNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/HighwayManNPC.class new file mode 100644 index 000000000..61ac97e57 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/HighwayManNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/IceGiantNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/IceGiantNPC.class new file mode 100644 index 000000000..d9ceb7c2f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/IceGiantNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/JogreNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/JogreNPC.class new file mode 100644 index 000000000..57ee1ccb9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/JogreNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/KamfreenaNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/KamfreenaNPC.class new file mode 100644 index 000000000..3a0dedad9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/KamfreenaNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/LumberKittenNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/LumberKittenNPC.class new file mode 100644 index 000000000..4b13bff2b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/LumberKittenNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/LumbridgeInstructorNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/LumbridgeInstructorNPC.class new file mode 100644 index 000000000..8f27da9ef Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/LumbridgeInstructorNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/LumbridgeSwampGiantRatNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/LumbridgeSwampGiantRatNPC.class new file mode 100644 index 000000000..3ec3a8321 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/LumbridgeSwampGiantRatNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/MetalDragonNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/MetalDragonNPC.class new file mode 100644 index 000000000..ced75fb4a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/MetalDragonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/MonkNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/MonkNPC$1.class new file mode 100644 index 000000000..9df01b998 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/MonkNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/MonkNPC$CombatAction.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/MonkNPC$CombatAction.class new file mode 100644 index 000000000..5eec12e04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/MonkNPC$CombatAction.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/MonkNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/MonkNPC.class new file mode 100644 index 000000000..c3d14af38 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/MonkNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/RasoloNPC$RosaloDialouge.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/RasoloNPC$RosaloDialouge.class new file mode 100644 index 000000000..4f6511f03 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/RasoloNPC$RosaloDialouge.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/RasoloNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/RasoloNPC.class new file mode 100644 index 000000000..7878c11a6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/RasoloNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/RatNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/RatNPC.class new file mode 100644 index 000000000..e140d70f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/RatNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/RatTutorialNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/RatTutorialNPC.class new file mode 100644 index 000000000..6b0cadb7c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/RatTutorialNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/RockCrabNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/RockCrabNPC$1.class new file mode 100644 index 000000000..c6a0652bc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/RockCrabNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/RockCrabNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/RockCrabNPC.class new file mode 100644 index 000000000..011eb95df Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/RockCrabNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ShanomiNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ShanomiNPC.class new file mode 100644 index 000000000..3ae9f55fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ShanomiNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/SheepNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/SheepNPC.class new file mode 100644 index 000000000..b5fb31e6c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/SheepNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ShopNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ShopNPC.class new file mode 100644 index 000000000..17f1c02b0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ShopNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/SkippyNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/SkippyNPC.class new file mode 100644 index 000000000..36872df6b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/SkippyNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/SorceressElementalNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/SorceressElementalNPC$1.class new file mode 100644 index 000000000..850e094cb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/SorceressElementalNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/SorceressElementalNPC$ElementalDefinition.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/SorceressElementalNPC$ElementalDefinition.class new file mode 100644 index 000000000..dac590960 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/SorceressElementalNPC$ElementalDefinition.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/SorceressElementalNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/SorceressElementalNPC.class new file mode 100644 index 000000000..644997dd8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/SorceressElementalNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/StrayDogNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/StrayDogNPC$1.class new file mode 100644 index 000000000..d88b17510 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/StrayDogNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/StrayDogNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/StrayDogNPC.class new file mode 100644 index 000000000..cc6d87f47 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/StrayDogNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/Student.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/Student.class new file mode 100644 index 000000000..9ceb6bdf5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/Student.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ThrowerTrollNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ThrowerTrollNPC$1.class new file mode 100644 index 000000000..86c4be6cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ThrowerTrollNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ThrowerTrollNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ThrowerTrollNPC.class new file mode 100644 index 000000000..e4f42d413 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ThrowerTrollNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/TribesmanNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/TribesmanNPC.class new file mode 100644 index 000000000..2ee5eb2b7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/TribesmanNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/TutorialChickenNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/TutorialChickenNPC.class new file mode 100644 index 000000000..ac5fae24c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/TutorialChickenNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/VampireSlayerNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/VampireSlayerNPC.class new file mode 100644 index 000000000..30dc76eba Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/VampireSlayerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/WerewolfNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/WerewolfNPC.class new file mode 100644 index 000000000..135cd17a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/WerewolfNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/ZombieNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/ZombieNPC.class new file mode 100644 index 000000000..879abf370 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/ZombieNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/other/akharanu.class b/Server/build/classes/java/main/core/game/node/entity/npc/other/akharanu.class new file mode 100644 index 000000000..48a473d58 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/other/akharanu.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/quest/gertrudes_cat/FluffNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/quest/gertrudes_cat/FluffNPC.class new file mode 100644 index 000000000..0be958793 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/quest/gertrudes_cat/FluffNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC$1.class new file mode 100644 index 000000000..dca6dc32b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.class new file mode 100644 index 000000000..66fedb819 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/quest/priest_in_peril/MonkOfZamorakNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/quest/priest_in_peril/MonkOfZamorakNPC.class new file mode 100644 index 000000000..fd3e6228d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/quest/priest_in_peril/MonkOfZamorakNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/quest/priest_in_peril/TempleGuardianNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/quest/priest_in_peril/TempleGuardianNPC.class new file mode 100644 index 000000000..6d893ec0d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/quest/priest_in_peril/TempleGuardianNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/quest/romeo__juliet/JulietNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/quest/romeo__juliet/JulietNPC.class new file mode 100644 index 000000000..d124e4e98 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/quest/romeo__juliet/JulietNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/quest/romeo__juliet/RomeoNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/quest/romeo__juliet/RomeoNPC.class new file mode 100644 index 000000000..2b3ab8fcd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/quest/romeo__juliet/RomeoNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/revenant/CorruptEquipment.class b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/CorruptEquipment.class new file mode 100644 index 000000000..b3d862a4a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/CorruptEquipment.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/revenant/PVPEquipment.class b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/PVPEquipment.class new file mode 100644 index 000000000..3fbc2ccad Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/PVPEquipment.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantCombatHandler.class b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantCombatHandler.class new file mode 100644 index 000000000..9b7898233 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantCombatHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantNPC.class b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantNPC.class new file mode 100644 index 000000000..7717b1574 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantPlugin.class b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantPlugin.class new file mode 100644 index 000000000..954579a54 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantType.class b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantType.class new file mode 100644 index 000000000..887aca054 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/npc/revenant/RevenantType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/Player$1wardrobePulse$1.class b/Server/build/classes/java/main/core/game/node/entity/player/Player$1wardrobePulse$1.class new file mode 100644 index 000000000..4c2c8ca7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/Player$1wardrobePulse$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/Player$1wardrobePulse.class b/Server/build/classes/java/main/core/game/node/entity/player/Player$1wardrobePulse.class new file mode 100644 index 000000000..3bda56e78 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/Player$1wardrobePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/Player.class b/Server/build/classes/java/main/core/game/node/entity/player/Player.class new file mode 100644 index 000000000..1d40fe875 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/Player.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/ClientInfo.class b/Server/build/classes/java/main/core/game/node/entity/player/info/ClientInfo.class new file mode 100644 index 000000000..c37dd1c65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/ClientInfo.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/PlayerDetails.class b/Server/build/classes/java/main/core/game/node/entity/player/info/PlayerDetails.class new file mode 100644 index 000000000..11205e0c4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/PlayerDetails.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/RenderInfo.class b/Server/build/classes/java/main/core/game/node/entity/player/info/RenderInfo.class new file mode 100644 index 000000000..0f0407a37 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/RenderInfo.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/Rights$1.class b/Server/build/classes/java/main/core/game/node/entity/player/info/Rights$1.class new file mode 100644 index 000000000..7995ed13f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/Rights$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/Rights.class b/Server/build/classes/java/main/core/game/node/entity/player/info/Rights.class new file mode 100644 index 000000000..01c1fe5be Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/Rights.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/UIDInfo.class b/Server/build/classes/java/main/core/game/node/entity/player/info/UIDInfo.class new file mode 100644 index 000000000..ded0995b6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/UIDInfo.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/login/LoginConfiguration$1.class b/Server/build/classes/java/main/core/game/node/entity/player/info/login/LoginConfiguration$1.class new file mode 100644 index 000000000..8824cea10 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/login/LoginConfiguration$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/login/LoginConfiguration.class b/Server/build/classes/java/main/core/game/node/entity/player/info/login/LoginConfiguration.class new file mode 100644 index 000000000..ccbe86a63 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/login/LoginConfiguration.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/login/LoginType.class b/Server/build/classes/java/main/core/game/node/entity/player/info/login/LoginType.class new file mode 100644 index 000000000..b3e02249e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/login/LoginType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/login/PlayerParser.class b/Server/build/classes/java/main/core/game/node/entity/player/info/login/PlayerParser.class new file mode 100644 index 000000000..f432a990c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/login/PlayerParser.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/login/Response.class b/Server/build/classes/java/main/core/game/node/entity/player/info/login/Response.class new file mode 100644 index 000000000..930a7bb69 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/login/Response.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/login/SavingModule.class b/Server/build/classes/java/main/core/game/node/entity/player/info/login/SavingModule.class new file mode 100644 index 000000000..04607b3de Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/login/SavingModule.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/portal/Icon.class b/Server/build/classes/java/main/core/game/node/entity/player/info/portal/Icon.class new file mode 100644 index 000000000..3ce1eae02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/portal/Icon.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/info/portal/PlayerSQLManager.class b/Server/build/classes/java/main/core/game/node/entity/player/info/portal/PlayerSQLManager.class new file mode 100644 index 000000000..4f9566ef4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/info/portal/PlayerSQLManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/ActivityData.class b/Server/build/classes/java/main/core/game/node/entity/player/link/ActivityData.class new file mode 100644 index 000000000..eb71d30ce Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/ActivityData.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$1.class new file mode 100644 index 000000000..27db8a44f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$2.class b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$2.class new file mode 100644 index 000000000..7b27b4a76 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus$1.class new file mode 100644 index 000000000..16442b30d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus$2.class b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus$2.class new file mode 100644 index 000000000..fa973f3c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus$3.class b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus$3.class new file mode 100644 index 000000000..290ddfb9d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus.class b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus.class new file mode 100644 index 000000000..58bc6f6ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager$PinStatus.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager.class new file mode 100644 index 000000000..a968f0e5d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/BankPinManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/ConfigurationManager$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/ConfigurationManager$1.class new file mode 100644 index 000000000..bea87ef9b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/ConfigurationManager$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/ConfigurationManager$Configuration.class b/Server/build/classes/java/main/core/game/node/entity/player/link/ConfigurationManager$Configuration.class new file mode 100644 index 000000000..84aacb568 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/ConfigurationManager$Configuration.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/ConfigurationManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/ConfigurationManager.class new file mode 100644 index 000000000..c50d3b397 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/ConfigurationManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/GlobalData.class b/Server/build/classes/java/main/core/game/node/entity/player/link/GlobalData.class new file mode 100644 index 000000000..f572c3b82 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/GlobalData.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/HintIconManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/HintIconManager.class new file mode 100644 index 000000000..e353d05a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/HintIconManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/InterfaceManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/InterfaceManager.class new file mode 100644 index 000000000..3bb4cfcf9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/InterfaceManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/IronmanManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/IronmanManager.class new file mode 100644 index 000000000..c8d0da032 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/IronmanManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/IronmanMode.class b/Server/build/classes/java/main/core/game/node/entity/player/link/IronmanMode.class new file mode 100644 index 000000000..1e5a76830 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/IronmanMode.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/PacketDispatch$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/PacketDispatch$1.class new file mode 100644 index 000000000..f10061cb9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/PacketDispatch$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/PacketDispatch.class b/Server/build/classes/java/main/core/game/node/entity/player/link/PacketDispatch.class new file mode 100644 index 000000000..f6576cb39 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/PacketDispatch.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/QuestData.class b/Server/build/classes/java/main/core/game/node/entity/player/link/QuestData.class new file mode 100644 index 000000000..2f2f6334b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/QuestData.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/RunScript.class b/Server/build/classes/java/main/core/game/node/entity/player/link/RunScript.class new file mode 100644 index 000000000..f834e4e5f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/RunScript.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/SavedData.class b/Server/build/classes/java/main/core/game/node/entity/player/link/SavedData.class new file mode 100644 index 000000000..81e771adc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/SavedData.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/Settings$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/Settings$1.class new file mode 100644 index 000000000..c8ea46f17 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/Settings$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/Settings.class b/Server/build/classes/java/main/core/game/node/entity/player/link/Settings.class new file mode 100644 index 000000000..9dd5fadda Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/Settings.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/SkullManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/SkullManager.class new file mode 100644 index 000000000..65048cac3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/SkullManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/SpellBookManager$SpellBook.class b/Server/build/classes/java/main/core/game/node/entity/player/link/SpellBookManager$SpellBook.class new file mode 100644 index 000000000..af0163122 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/SpellBookManager$SpellBook.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/SpellBookManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/SpellBookManager.class new file mode 100644 index 000000000..40b772825 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/SpellBookManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$1.class new file mode 100644 index 000000000..4e346c317 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportSettings.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportSettings.class new file mode 100644 index 000000000..90ed43642 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportSettings.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$1$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$1$1.class new file mode 100644 index 000000000..12df854f4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$1.class new file mode 100644 index 000000000..3deeb3be3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$10$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$10$1.class new file mode 100644 index 000000000..237e2ec3c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$10$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$10.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$10.class new file mode 100644 index 000000000..ff7fd099e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$10.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$11$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$11$1.class new file mode 100644 index 000000000..12bf27687 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$11$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$11.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$11.class new file mode 100644 index 000000000..c269cebe9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$11.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$12$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$12$1.class new file mode 100644 index 000000000..483d2061f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$12$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$12.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$12.class new file mode 100644 index 000000000..4d632e886 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$12.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$13$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$13$1.class new file mode 100644 index 000000000..003e2741d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$13$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$13.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$13.class new file mode 100644 index 000000000..902e2f015 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$13.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$14$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$14$1.class new file mode 100644 index 000000000..35c70667b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$14$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$14.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$14.class new file mode 100644 index 000000000..f597f5d4a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$14.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$15$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$15$1.class new file mode 100644 index 000000000..6d7b34837 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$15$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$15.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$15.class new file mode 100644 index 000000000..f300eb4f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$15.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$2$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$2$1.class new file mode 100644 index 000000000..c50783844 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$2.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$2.class new file mode 100644 index 000000000..586f27a7c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$3$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$3$1.class new file mode 100644 index 000000000..a18133ff7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$3$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$3.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$3.class new file mode 100644 index 000000000..658419085 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$4$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$4$1.class new file mode 100644 index 000000000..6881393c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$4$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$4.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$4.class new file mode 100644 index 000000000..0f944481c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$5$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$5$1.class new file mode 100644 index 000000000..0efbffdd8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$5$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$5.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$5.class new file mode 100644 index 000000000..dfa75e60f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$6$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$6$1.class new file mode 100644 index 000000000..612770d57 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$6$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$6.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$6.class new file mode 100644 index 000000000..db8998346 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$7$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$7$1.class new file mode 100644 index 000000000..c9339177d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$7$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$7.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$7.class new file mode 100644 index 000000000..93c0e6d7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$7.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$8$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$8$1.class new file mode 100644 index 000000000..36140246f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$8$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$8.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$8.class new file mode 100644 index 000000000..fcece6974 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$8.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$9$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$9$1.class new file mode 100644 index 000000000..c4cdfd66a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$9$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$9.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$9.class new file mode 100644 index 000000000..99494dd26 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType$9.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType.class new file mode 100644 index 000000000..b67986048 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager$TeleportType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager.class new file mode 100644 index 000000000..10785fc67 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/TeleportManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/WarningMessages$WarningMessage.class b/Server/build/classes/java/main/core/game/node/entity/player/link/WarningMessages$WarningMessage.class new file mode 100644 index 000000000..d83268c13 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/WarningMessages$WarningMessage.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/WarningMessages.class b/Server/build/classes/java/main/core/game/node/entity/player/link/WarningMessages.class new file mode 100644 index 000000000..fced2520a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/WarningMessages.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/Appearance$AppearanceCache.class b/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/Appearance$AppearanceCache.class new file mode 100644 index 000000000..6ba8d581d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/Appearance$AppearanceCache.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/Appearance.class b/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/Appearance.class new file mode 100644 index 000000000..19b2df565 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/Appearance.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/BodyPart.class b/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/BodyPart.class new file mode 100644 index 000000000..c8f9518ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/BodyPart.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/Gender.class b/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/Gender.class new file mode 100644 index 000000000..3f972c841 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/appearance/Gender.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/audio/Audio.class b/Server/build/classes/java/main/core/game/node/entity/player/link/audio/Audio.class new file mode 100644 index 000000000..fe0fa9953 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/audio/Audio.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/audio/AudioManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/audio/AudioManager.class new file mode 100644 index 000000000..d773f3466 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/audio/AudioManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/diary/AchievementDiary.class b/Server/build/classes/java/main/core/game/node/entity/player/link/diary/AchievementDiary.class new file mode 100644 index 000000000..4fcdf75e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/diary/AchievementDiary.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/diary/AchievementDiaryManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/diary/AchievementDiaryManager.class new file mode 100644 index 000000000..99136decc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/diary/AchievementDiaryManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/diary/DiaryType.class b/Server/build/classes/java/main/core/game/node/entity/player/link/diary/DiaryType.class new file mode 100644 index 000000000..8faf1b618 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/diary/DiaryType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/diary/MysteriousStatueZone.class b/Server/build/classes/java/main/core/game/node/entity/player/link/diary/MysteriousStatueZone.class new file mode 100644 index 000000000..83f2a31cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/diary/MysteriousStatueZone.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/EmoteManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/EmoteManager.class new file mode 100644 index 000000000..0e5efd643 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/EmoteManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$1.class new file mode 100644 index 000000000..dd614cfd5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$2.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$2.class new file mode 100644 index 000000000..10e360f27 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$3.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$3.class new file mode 100644 index 000000000..8c1ef6e86 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$4.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$4.class new file mode 100644 index 000000000..b74cabf8f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$5.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$5.class new file mode 100644 index 000000000..c6c387c1f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$6.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$6.class new file mode 100644 index 000000000..534d36521 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$7.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$7.class new file mode 100644 index 000000000..5a54ebd0a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$7.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$8.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$8.class new file mode 100644 index 000000000..9454fba64 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$8.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$9$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$9$1.class new file mode 100644 index 000000000..bac27a95a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$9$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$9.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$9.class new file mode 100644 index 000000000..4802921b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes$9.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes.class b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes.class new file mode 100644 index 000000000..9412c2a07 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/emote/Emotes.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/grave/GraveManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/grave/GraveManager.class new file mode 100644 index 000000000..24b5bfec7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/grave/GraveManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/grave/GraveType.class b/Server/build/classes/java/main/core/game/node/entity/player/link/grave/GraveType.class new file mode 100644 index 000000000..d0d2da44d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/grave/GraveType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/music/MusicEntry.class b/Server/build/classes/java/main/core/game/node/entity/player/link/music/MusicEntry.class new file mode 100644 index 000000000..05b69184c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/music/MusicEntry.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/music/MusicPlayer.class b/Server/build/classes/java/main/core/game/node/entity/player/link/music/MusicPlayer.class new file mode 100644 index 000000000..77a5829b1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/music/MusicPlayer.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/music/MusicZone.class b/Server/build/classes/java/main/core/game/node/entity/player/link/music/MusicZone.class new file mode 100644 index 000000000..13318004c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/music/MusicZone.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/DrainTask.class b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/DrainTask.class new file mode 100644 index 000000000..dec0c779a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/DrainTask.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/Prayer.class b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/Prayer.class new file mode 100644 index 000000000..18789c32a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/Prayer.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerCategory.class b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerCategory.class new file mode 100644 index 000000000..021aa8927 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerCategory.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerType$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerType$1.class new file mode 100644 index 000000000..1a1ab896b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerType$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerType$2.class b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerType$2.class new file mode 100644 index 000000000..ddd66d642 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerType$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerType.class b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerType.class new file mode 100644 index 000000000..23de41535 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/prayer/PrayerType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/quest/Quest.class b/Server/build/classes/java/main/core/game/node/entity/player/link/quest/Quest.class new file mode 100644 index 000000000..aca29a3bd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/quest/Quest.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/quest/QuestRepository.class b/Server/build/classes/java/main/core/game/node/entity/player/link/quest/QuestRepository.class new file mode 100644 index 000000000..569eef710 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/quest/QuestRepository.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/RequestManager.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/RequestManager.class new file mode 100644 index 000000000..f2ea8569b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/RequestManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/RequestModule.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/RequestModule.class new file mode 100644 index 000000000..ed4c9bfcd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/RequestModule.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/RequestType.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/RequestType.class new file mode 100644 index 000000000..3bfe11c62 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/RequestType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/assist/AssistSession$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/assist/AssistSession$1.class new file mode 100644 index 000000000..08854cd99 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/assist/AssistSession$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/assist/AssistSession.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/assist/AssistSession.class new file mode 100644 index 000000000..83a1fa0e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/assist/AssistSession.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeCloseEvent.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeCloseEvent.class new file mode 100644 index 000000000..724262410 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeCloseEvent.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeContainer$1.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeContainer$1.class new file mode 100644 index 000000000..6f0c9dd31 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeContainer$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeContainer$TradeListener.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeContainer$TradeListener.class new file mode 100644 index 000000000..c98dd6999 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeContainer$TradeListener.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeContainer.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeContainer.class new file mode 100644 index 000000000..d1887779a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeContainer.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeModule.class b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeModule.class new file mode 100644 index 000000000..bebffc206 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/request/trade/TradeModule.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/skillertasks/Difficulty.class b/Server/build/classes/java/main/core/game/node/entity/player/link/skillertasks/Difficulty.class new file mode 100644 index 000000000..b57ade9d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/skillertasks/Difficulty.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/skillertasks/SkillTasks.class b/Server/build/classes/java/main/core/game/node/entity/player/link/skillertasks/SkillTasks.class new file mode 100644 index 000000000..f7688fbab Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/skillertasks/SkillTasks.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/skillertasks/SkillerTasks.class b/Server/build/classes/java/main/core/game/node/entity/player/link/skillertasks/SkillerTasks.class new file mode 100644 index 000000000..f862e6507 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/skillertasks/SkillerTasks.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/PKPackage.class b/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/PKPackage.class new file mode 100644 index 000000000..1fb3d0f48 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/PKPackage.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/PKScoreBoard.class b/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/PKScoreBoard.class new file mode 100644 index 000000000..26ac02b18 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/PKScoreBoard.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/PKTitle.class b/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/PKTitle.class new file mode 100644 index 000000000..d047821a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/PKTitle.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/SpawnData.class b/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/SpawnData.class new file mode 100644 index 000000000..2acb8c24b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/player/link/spawn/SpawnData.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/LevelUp.class b/Server/build/classes/java/main/core/game/node/entity/skill/LevelUp.class new file mode 100644 index 000000000..31b1e456f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/LevelUp.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/SkillBonus.class b/Server/build/classes/java/main/core/game/node/entity/skill/SkillBonus.class new file mode 100644 index 000000000..ba1fce42f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/SkillBonus.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/SkillPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/SkillPulse.class new file mode 100644 index 000000000..ff5246ae6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/SkillPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/SkillRestoration.class b/Server/build/classes/java/main/core/game/node/entity/skill/SkillRestoration.class new file mode 100644 index 000000000..f60cae421 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/SkillRestoration.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/Skills.class b/Server/build/classes/java/main/core/game/node/entity/skill/Skills.class new file mode 100644 index 000000000..aeef2f2bf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/Skills.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityCourse.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityCourse.class new file mode 100644 index 000000000..382ef464e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityCourse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$1.class new file mode 100644 index 000000000..c62f61ea6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$2.class new file mode 100644 index 000000000..9ec71a4a7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$3.class new file mode 100644 index 000000000..d3074c1d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$4.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$4.class new file mode 100644 index 000000000..bac146d4b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$5.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$5.class new file mode 100644 index 000000000..4137b3cd8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$6.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$6.class new file mode 100644 index 000000000..1f3985d19 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$7.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$7.class new file mode 100644 index 000000000..65369fb00 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$7.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$8.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$8.class new file mode 100644 index 000000000..3d8d11296 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler$8.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler.class new file mode 100644 index 000000000..e2a0faecb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityShortcut.class new file mode 100644 index 000000000..589022856 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/AgilityShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BladeTrap$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BladeTrap$1.class new file mode 100644 index 000000000..8d266d7c2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BladeTrap$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BladeTrap.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BladeTrap.class new file mode 100644 index 000000000..1b15c47ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BladeTrap.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena$1.class new file mode 100644 index 000000000..349195838 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena$PlankSet.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena$PlankSet.class new file mode 100644 index 000000000..d96924ed5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena$PlankSet.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena.class new file mode 100644 index 000000000..20c535260 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$1.class new file mode 100644 index 000000000..9b0f07723 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$2.class new file mode 100644 index 000000000..dac85c639 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$3.class new file mode 100644 index 000000000..2489577a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$4.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$4.class new file mode 100644 index 000000000..b2b1fad59 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$5.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$5.class new file mode 100644 index 000000000..c30799a21 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$6.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$6.class new file mode 100644 index 000000000..72c45816e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$7.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$7.class new file mode 100644 index 000000000..48e74f1e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$7.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$8.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$8.class new file mode 100644 index 000000000..68618fe1b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse$8.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.class new file mode 100644 index 000000000..c0aefc397 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/DartTrap$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/DartTrap$1.class new file mode 100644 index 000000000..eadbf513c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/DartTrap$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/DartTrap.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/DartTrap.class new file mode 100644 index 000000000..ffd383532 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/DartTrap.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/FloorSpikes$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/FloorSpikes$1.class new file mode 100644 index 000000000..a001e7a4d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/FloorSpikes$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.class new file mode 100644 index 000000000..aea6069c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/PressurePad$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/PressurePad$1.class new file mode 100644 index 000000000..1b35adbba Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/PressurePad$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/PressurePad.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/PressurePad.class new file mode 100644 index 000000000..7fc3b7001 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/PressurePad.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/SpinningBlades$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/SpinningBlades$1.class new file mode 100644 index 000000000..c10f09376 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/SpinningBlades$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.class new file mode 100644 index 000000000..d31cd4c50 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$1.class new file mode 100644 index 000000000..7ca28d03c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$2.class new file mode 100644 index 000000000..f2ee2ca2b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$3.class new file mode 100644 index 000000000..a451354d8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$4.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$4.class new file mode 100644 index 000000000..f1807d042 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$5.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$5.class new file mode 100644 index 000000000..fec5d4374 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.class new file mode 100644 index 000000000..d25e3f200 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidZone.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidZone.class new file mode 100644 index 000000000..d9ea6fba5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/AgilityPyramidZone.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC$1.class new file mode 100644 index 000000000..e850bf468 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC$2.class new file mode 100644 index 000000000..17997d150 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC$MovingBlockTrap.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC$MovingBlockTrap.class new file mode 100644 index 000000000..ec649b7bd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC$MovingBlockTrap.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC.class new file mode 100644 index 000000000..f205d91ff Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$1.class new file mode 100644 index 000000000..0278ec791 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$2.class new file mode 100644 index 000000000..5ae32ca24 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$3.class new file mode 100644 index 000000000..e63c792fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$BlockSets.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$BlockSets.class new file mode 100644 index 000000000..6b52ef430 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock$BlockSets.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock.class new file mode 100644 index 000000000..414c30ce8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/pyramid/RollingBlock.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/AlKharidPitShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/AlKharidPitShortcut.class new file mode 100644 index 000000000..86b9d0fb9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/AlKharidPitShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/BarSqueezeShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/BarSqueezeShortcut.class new file mode 100644 index 000000000..d7a1cbc13 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/BarSqueezeShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/CrumblingWallShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/CrumblingWallShortcut.class new file mode 100644 index 000000000..4a38064e9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/CrumblingWallShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FaladorGrapplePlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FaladorGrapplePlugin$1.class new file mode 100644 index 000000000..de8615a04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FaladorGrapplePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FaladorGrapplePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FaladorGrapplePlugin.class new file mode 100644 index 000000000..7d246c0a1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FaladorGrapplePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FenceJumpShortcut$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FenceJumpShortcut$1.class new file mode 100644 index 000000000..d9b1734eb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FenceJumpShortcut$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FenceJumpShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FenceJumpShortcut.class new file mode 100644 index 000000000..c1b8af3ff Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/FenceJumpShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/KaramjaGrapple$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/KaramjaGrapple$1.class new file mode 100644 index 000000000..87cdccf3d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/KaramjaGrapple$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/KaramjaGrapple.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/KaramjaGrapple.class new file mode 100644 index 000000000..6f979b22a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/KaramjaGrapple.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/LogBalanceShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/LogBalanceShortcut.class new file mode 100644 index 000000000..5fcb8446a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/LogBalanceShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut$1.class new file mode 100644 index 000000000..3a105cdd9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.class new file mode 100644 index 000000000..612265640 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/RopeSwing.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/RopeSwing.class new file mode 100644 index 000000000..8036cf156 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/RopeSwing.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut$1.class new file mode 100644 index 000000000..e6d415042 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut$2$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut$2$1.class new file mode 100644 index 000000000..0bf96cd0c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut$2.class new file mode 100644 index 000000000..0e0bb1dc1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut.class new file mode 100644 index 000000000..3e9e984c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StileShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut$1.class new file mode 100644 index 000000000..c1ec6d2d5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut$2.class new file mode 100644 index 000000000..58e40a2cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut.class new file mode 100644 index 000000000..bd04aca8b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut$1.class new file mode 100644 index 000000000..0db2753d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut$2.class new file mode 100644 index 000000000..bd93be7f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut.class new file mode 100644 index 000000000..85262dca7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/WaterOrbGrapple$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/WaterOrbGrapple$1.class new file mode 100644 index 000000000..d326499de Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/WaterOrbGrapple$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/WaterOrbGrapple.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/WaterOrbGrapple.class new file mode 100644 index 000000000..91f68a918 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/WaterOrbGrapple.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/YanilleGrapple$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/YanilleGrapple$1.class new file mode 100644 index 000000000..484f87717 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/YanilleGrapple$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/YanilleGrapple.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/YanilleGrapple.class new file mode 100644 index 000000000..3d23a1230 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/YanilleGrapple.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/ZanarisSqueezeShortcut.class b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/ZanarisSqueezeShortcut.class new file mode 100644 index 000000000..7396b7d10 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/agility/shortcuts/ZanarisSqueezeShortcut.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildHotspot.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildHotspot.class new file mode 100644 index 000000000..7052b14f1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildHotspot.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildHotspotType.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildHotspotType.class new file mode 100644 index 000000000..a1b633308 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildHotspotType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildOptionPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildOptionPlugin$1.class new file mode 100644 index 000000000..a6bebbfd1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildOptionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildOptionPlugin$RemoveDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildOptionPlugin$RemoveDialogue.class new file mode 100644 index 000000000..e37820e9b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildOptionPlugin$RemoveDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildOptionPlugin.class new file mode 100644 index 000000000..24e31072d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildRoomDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildRoomDialogue.class new file mode 100644 index 000000000..b2cc09c02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildRoomDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildingUtils$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildingUtils$1.class new file mode 100644 index 000000000..06ddc0c04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildingUtils$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildingUtils$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildingUtils$2.class new file mode 100644 index 000000000..7a4bb9527 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildingUtils$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildingUtils.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildingUtils.class new file mode 100644 index 000000000..13dbdbb7e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/BuildingUtils.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/ConstructionGuideBook.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/ConstructionGuideBook.class new file mode 100644 index 000000000..4505df57f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/ConstructionGuideBook.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/ConstructionInterface.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/ConstructionInterface.class new file mode 100644 index 000000000..e44dc9d3e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/ConstructionInterface.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestRequirement.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestRequirement.class new file mode 100644 index 000000000..52ef26abc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestRequirement.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$1.class new file mode 100644 index 000000000..1a44fde95 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$2.class new file mode 100644 index 000000000..d377bb143 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$3.class new file mode 100644 index 000000000..35c749d17 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$4.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$4.class new file mode 100644 index 000000000..2d7c3623f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$5.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$5.class new file mode 100644 index 000000000..2aa4736fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$6.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$6.class new file mode 100644 index 000000000..dba23b2b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$7.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$7.class new file mode 100644 index 000000000..0d0fb5f7f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$7.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$8.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$8.class new file mode 100644 index 000000000..be8c30dbc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$8.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$9.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$9.class new file mode 100644 index 000000000..b553e7b7c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType$9.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType.class new file mode 100644 index 000000000..2c0240b2e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/CrestType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/Decoration.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/Decoration.class new file mode 100644 index 000000000..e3237858c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/Decoration.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/EstateAgentDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/EstateAgentDialogue.class new file mode 100644 index 000000000..ac87d27f2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/EstateAgentDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseLocation.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseLocation.class new file mode 100644 index 000000000..ddd6bf95e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseLocation.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseManager$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseManager$1.class new file mode 100644 index 000000000..a97591566 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseManager$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseManager$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseManager$2.class new file mode 100644 index 000000000..f89bfcf67 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseManager$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseManager.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseManager.class new file mode 100644 index 000000000..7453153b8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseZone.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseZone.class new file mode 100644 index 000000000..8391a030f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HouseZone.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/HousingStyle.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HousingStyle.class new file mode 100644 index 000000000..18835ddf9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/HousingStyle.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/NailType.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/NailType.class new file mode 100644 index 000000000..4990d6720 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/NailType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/PortalOptionPlugin$PortalDialogue$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/PortalOptionPlugin$PortalDialogue$1.class new file mode 100644 index 000000000..302eb6ef7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/PortalOptionPlugin$PortalDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/PortalOptionPlugin$PortalDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/PortalOptionPlugin$PortalDialogue.class new file mode 100644 index 000000000..25bae9477 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/PortalOptionPlugin$PortalDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/PortalOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/PortalOptionPlugin.class new file mode 100644 index 000000000..a7cd6cb28 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/PortalOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/RemovalDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/RemovalDialogue.class new file mode 100644 index 000000000..ad6c17b75 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/RemovalDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/Room$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/Room$1.class new file mode 100644 index 000000000..7d5381af6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/Room$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/Room.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/Room.class new file mode 100644 index 000000000..81824921c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/Room.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/RoomBuilder$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/RoomBuilder$1.class new file mode 100644 index 000000000..3ce478ba4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/RoomBuilder$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/RoomBuilder.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/RoomBuilder.class new file mode 100644 index 000000000..ec540ac8f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/RoomBuilder.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/RoomProperties.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/RoomProperties.class new file mode 100644 index 000000000..4b5cb9f73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/RoomProperties.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/Servant.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/Servant.class new file mode 100644 index 000000000..57b73f1c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/Servant.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/ServantType.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/ServantType.class new file mode 100644 index 000000000..75b6f297d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/ServantType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/BeerBarrelPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/BeerBarrelPlugin.class new file mode 100644 index 000000000..77c64f139 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/BeerBarrelPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/ChairBenchPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/ChairBenchPlugin$1.class new file mode 100644 index 000000000..baa879e74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/ChairBenchPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/ChairBenchPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/ChairBenchPlugin.class new file mode 100644 index 000000000..2dca70e28 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/ChairBenchPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/FireplacePlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/FireplacePlugin$1.class new file mode 100644 index 000000000..023aad670 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/FireplacePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/FireplacePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/FireplacePlugin.class new file mode 100644 index 000000000..0b00cc803 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/FireplacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$BuildDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$BuildDialogue.class new file mode 100644 index 000000000..f97b8e333 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$BuildDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$ClimbPohLadder$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$ClimbPohLadder$1.class new file mode 100644 index 000000000..7197c0ffc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$ClimbPohLadder$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$ClimbPohLadder$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$ClimbPohLadder$2.class new file mode 100644 index 000000000..02d4ec733 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$ClimbPohLadder$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$ClimbPohLadder.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$ClimbPohLadder.class new file mode 100644 index 000000000..e2253b32b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin$ClimbPohLadder.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin.class new file mode 100644 index 000000000..ebc53cbad Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/StaircasePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/bedroom/ClockPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/bedroom/ClockPlugin.class new file mode 100644 index 000000000..3f8898e71 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/bedroom/ClockPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/chapel/BoneOfferPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/chapel/BoneOfferPlugin$1.class new file mode 100644 index 000000000..8de1ab4cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/chapel/BoneOfferPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/chapel/BoneOfferPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/chapel/BoneOfferPlugin.class new file mode 100644 index 000000000..b40ffc6ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/chapel/BoneOfferPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/chapel/TorchLightPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/chapel/TorchLightPlugin.class new file mode 100644 index 000000000..7c4deb363 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/chapel/TorchLightPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/combatroom/CombatRing.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/combatroom/CombatRing.class new file mode 100644 index 000000000..590b6808a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/combatroom/CombatRing.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/BeerBarrelPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/BeerBarrelPlugin.class new file mode 100644 index 000000000..020ee9ad0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/BeerBarrelPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin$LarderDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin$LarderDialogue.class new file mode 100644 index 000000000..002279ad8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin$LarderDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.class new file mode 100644 index 000000000..47ff81bd5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin$ShelfDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin$ShelfDialogue.class new file mode 100644 index 000000000..e306d5788 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin$ShelfDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.class new file mode 100644 index 000000000..8a336bcd0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin$DirectPortalDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin$DirectPortalDialogue.class new file mode 100644 index 000000000..277c40af6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin$DirectPortalDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin$Locations.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin$Locations.class new file mode 100644 index 000000000..3765b8222 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin$Locations.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.class new file mode 100644 index 000000000..de069bc97 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin$1.class new file mode 100644 index 000000000..94f741e75 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin$2.class new file mode 100644 index 000000000..1ac761eb5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin.class new file mode 100644 index 000000000..5e73057f1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin$1.class new file mode 100644 index 000000000..7ab2a3824 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin$ClockmakerBenchDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin$ClockmakerBenchDialogue.class new file mode 100644 index 000000000..7f35cb8f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin$ClockmakerBenchDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin$Craftable.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin$Craftable.class new file mode 100644 index 000000000..776c84bee Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin$Craftable.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.class new file mode 100644 index 000000000..08365b9d0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin$1.class new file mode 100644 index 000000000..098658a2c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin$ToolDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin$ToolDialogue.class new file mode 100644 index 000000000..60f5c4a36 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin$ToolDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin$ToolStore.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin$ToolStore.class new file mode 100644 index 000000000..9753dea74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin$ToolStore.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.class new file mode 100644 index 000000000..e85ff5a68 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue$1.class new file mode 100644 index 000000000..0f43c6640 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue$2.class new file mode 100644 index 000000000..7dee92dd5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue$3.class new file mode 100644 index 000000000..b36fd959d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue.class new file mode 100644 index 000000000..4e1de9bdf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantPlugin.class new file mode 100644 index 000000000..cf1580bc0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/HouseServantPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/StonemasonPlugin$SupplyStore.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/StonemasonPlugin$SupplyStore.class new file mode 100644 index 000000000..ce5b7b7fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/StonemasonPlugin$SupplyStore.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/StonemasonPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/StonemasonPlugin.class new file mode 100644 index 000000000..2bd3852c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/construction/npc/StonemasonPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CakeMakingPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CakeMakingPlugin.class new file mode 100644 index 000000000..f45429b6a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CakeMakingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CoconutMakePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CoconutMakePlugin.class new file mode 100644 index 000000000..894c52d2a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CoconutMakePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CookableItems.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CookableItems.class new file mode 100644 index 000000000..f9a5d0536 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CookableItems.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CookingRecipePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CookingRecipePlugin.class new file mode 100644 index 000000000..be786e396 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CookingRecipePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CookingRewrite.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CookingRewrite.class new file mode 100644 index 000000000..928a6877d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/CookingRewrite.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/FireOptionPotteryPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/FireOptionPotteryPlugin.class new file mode 100644 index 000000000..cd582cb06 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/FireOptionPotteryPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/FoodCookingDialogue$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/FoodCookingDialogue$1.class new file mode 100644 index 000000000..32a212807 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/FoodCookingDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/FoodCookingDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/FoodCookingDialogue.class new file mode 100644 index 000000000..a0e737ab3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/FoodCookingDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/IntentionalBurnPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/IntentionalBurnPulse.class new file mode 100644 index 000000000..f9f70f685 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/IntentionalBurnPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/MakeDoughPlugin$MakeDoughDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/MakeDoughPlugin$MakeDoughDialogue.class new file mode 100644 index 000000000..d4e3a665c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/MakeDoughPlugin$MakeDoughDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/MakeDoughPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/MakeDoughPlugin.class new file mode 100644 index 000000000..efa72eafd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/MakeDoughPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/MakeStewPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/MakeStewPlugin.class new file mode 100644 index 000000000..c6e2196c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/MakeStewPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/NettleTeaPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/NettleTeaPlugin.class new file mode 100644 index 000000000..58069a7c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/NettleTeaPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/NettleWaterPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/NettleWaterPlugin.class new file mode 100644 index 000000000..c2dcdfeb6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/NettleWaterPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/PieCookingPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/PieCookingPulse.class new file mode 100644 index 000000000..eab6c16c2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/PieCookingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/PieShellPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/PieShellPlugin.class new file mode 100644 index 000000000..a93bcc1a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/PieShellPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/PizzaCookingPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/PizzaCookingPulse.class new file mode 100644 index 000000000..48b0f6b0b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/PizzaCookingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/SkeweredFoodPlugin$SkeweredSet.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/SkeweredFoodPlugin$SkeweredSet.class new file mode 100644 index 000000000..55a9de3ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/SkeweredFoodPlugin$SkeweredSet.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/SkeweredFoodPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/SkeweredFoodPlugin.class new file mode 100644 index 000000000..5e220a7d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/SkeweredFoodPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/StandardCookingPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/StandardCookingPulse.class new file mode 100644 index 000000000..5178682e9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/StandardCookingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/WatermelonSlicePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/WatermelonSlicePlugin.class new file mode 100644 index 000000000..e6ce4a22f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/WatermelonSlicePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/WineFermentPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/WineFermentPlugin.class new file mode 100644 index 000000000..6fe9e7b76 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/WineFermentPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.class new file mode 100644 index 000000000..b7aa64bac Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/dairy/DairyProduct.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/dairy/DairyProduct.class new file mode 100644 index 000000000..76db42bf5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/dairy/DairyProduct.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/fermenting/WineFermentingPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/fermenting/WineFermentingPulse.class new file mode 100644 index 000000000..d26755e4b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/fermenting/WineFermentingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/OomlieWrap.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/OomlieWrap.class new file mode 100644 index 000000000..7927b8c2b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/OomlieWrap.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/Recipe.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/Recipe.class new file mode 100644 index 000000000..1448b8539 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/Recipe.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/cake/ChocolateCake.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/cake/ChocolateCake.class new file mode 100644 index 000000000..28b1172f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/cake/ChocolateCake.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/PieRecipe.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/PieRecipe.class new file mode 100644 index 000000000..19c468f75 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/PieRecipe.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/AdmiralPie.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/AdmiralPie.class new file mode 100644 index 000000000..39d46930c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/AdmiralPie.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/ApplePie.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/ApplePie.class new file mode 100644 index 000000000..03641785c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/ApplePie.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/FishPie.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/FishPie.class new file mode 100644 index 000000000..9b8c1a4cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/FishPie.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/GardenPie.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/GardenPie.class new file mode 100644 index 000000000..3719bad69 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/GardenPie.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/MeatPie.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/MeatPie.class new file mode 100644 index 000000000..0fc728277 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/MeatPie.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/MudPie.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/MudPie.class new file mode 100644 index 000000000..f929b051b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/MudPie.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/RedberryPie.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/RedberryPie.class new file mode 100644 index 000000000..ff6226f74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/RedberryPie.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/SummerPie.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/SummerPie.class new file mode 100644 index 000000000..ac3b2e6a1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/SummerPie.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/WildPie.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/WildPie.class new file mode 100644 index 000000000..6cc3c14a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pie/impl/WildPie.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/PizzaRecipe.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/PizzaRecipe.class new file mode 100644 index 000000000..203301121 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/PizzaRecipe.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/AnchovyPizza.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/AnchovyPizza.class new file mode 100644 index 000000000..e6c2a6416 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/AnchovyPizza.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/MeatPizza.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/MeatPizza.class new file mode 100644 index 000000000..0690e6812 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/MeatPizza.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/PineapplePizza.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/PineapplePizza.class new file mode 100644 index 000000000..ec4462d28 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/PineapplePizza.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/PlainPizza.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/PlainPizza.class new file mode 100644 index 000000000..bf999307c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/pizza/impl/PlainPizza.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/PotatoRecipe.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/PotatoRecipe.class new file mode 100644 index 000000000..57bdfd23f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/PotatoRecipe.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/ButterPotato.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/ButterPotato.class new file mode 100644 index 000000000..a6896cb1c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/ButterPotato.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/CheesePotato.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/CheesePotato.class new file mode 100644 index 000000000..7f25a98c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/CheesePotato.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/ChilliPotato.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/ChilliPotato.class new file mode 100644 index 000000000..d351db5c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/ChilliPotato.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/EggPotato.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/EggPotato.class new file mode 100644 index 000000000..a7077023d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/EggPotato.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/MushroomPotato.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/MushroomPotato.class new file mode 100644 index 000000000..1370b9466 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/MushroomPotato.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/TunaPotato.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/TunaPotato.class new file mode 100644 index 000000000..2ad2c2a14 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/potato/impl/TunaPotato.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/stew/CurryRecipe.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/stew/CurryRecipe.class new file mode 100644 index 000000000..a2bc2610a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/stew/CurryRecipe.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/stew/StewRecipe.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/stew/StewRecipe.class new file mode 100644 index 000000000..b83e8e1c2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/stew/StewRecipe.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/ToppingRecipe.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/ToppingRecipe.class new file mode 100644 index 000000000..76b2cc9c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/ToppingRecipe.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/ChilliConCarne.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/ChilliConCarne.class new file mode 100644 index 000000000..cc3386888 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/ChilliConCarne.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedOnion.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedOnion.class new file mode 100644 index 000000000..3d2b76525 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedOnion.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedTuna.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedTuna.class new file mode 100644 index 000000000..5a165db20 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedTuna.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/EggAndTomato.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/EggAndTomato.class new file mode 100644 index 000000000..c14490767 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/EggAndTomato.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/MushroomAndOnion.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/MushroomAndOnion.class new file mode 100644 index 000000000..60b21c00b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/MushroomAndOnion.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/SlicedMushroom.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/SlicedMushroom.class new file mode 100644 index 000000000..020b4a51e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/SlicedMushroom.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/SpicySauce.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/SpicySauce.class new file mode 100644 index 000000000..da867fe45 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/SpicySauce.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/TunaAndCorn.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/TunaAndCorn.class new file mode 100644 index 000000000..f5082daae Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/TunaAndCorn.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/UncookedEgg.class b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/UncookedEgg.class new file mode 100644 index 000000000..c29509a5d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/cooking/recipe/topping/impl/UncookedEgg.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/AmuletStringingPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/AmuletStringingPlugin.class new file mode 100644 index 000000000..a192f0fc3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/AmuletStringingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/BattleStaves.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/BattleStaves.class new file mode 100644 index 000000000..9c55fc9ce Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/BattleStaves.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/BattlestaveMakePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/BattlestaveMakePlugin.class new file mode 100644 index 000000000..3e322c7f9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/BattlestaveMakePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/ChiselLimestonePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/ChiselLimestonePlugin.class new file mode 100644 index 000000000..e889c40c9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/ChiselLimestonePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/GemCutPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/GemCutPlugin$1.class new file mode 100644 index 000000000..a24698b77 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/GemCutPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/GemCutPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/GemCutPlugin.class new file mode 100644 index 000000000..ab048a5e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/GemCutPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/GlassProduct.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/GlassProduct.class new file mode 100644 index 000000000..61067b9fb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/GlassProduct.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/JewelleryCraftPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/JewelleryCraftPlugin.class new file mode 100644 index 000000000..8f5d14c55 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/JewelleryCraftPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/MoltenGlassMakePlugin$MoltenGlassPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/MoltenGlassMakePlugin$MoltenGlassPulse.class new file mode 100644 index 000000000..54f0a47a7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/MoltenGlassMakePlugin$MoltenGlassPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/MoltenGlassMakePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/MoltenGlassMakePlugin.class new file mode 100644 index 000000000..3f5c06f1b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/MoltenGlassMakePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$1.class new file mode 100644 index 000000000..aa6201b8f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$FireOvenPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$FireOvenPlugin$1.class new file mode 100644 index 000000000..55aa76af5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$FireOvenPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$FireOvenPlugin$FireUseHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$FireOvenPlugin$FireUseHandler.class new file mode 100644 index 000000000..7738e5dfb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$FireOvenPlugin$FireUseHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$FireOvenPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$FireOvenPlugin.class new file mode 100644 index 000000000..a699cb13a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin$FireOvenPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin.class new file mode 100644 index 000000000..4dba82b14 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/PotteryPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SilverProduct.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SilverProduct.class new file mode 100644 index 000000000..154bd82b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SilverProduct.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SilverStringingPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SilverStringingPlugin.class new file mode 100644 index 000000000..d318ffef9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SilverStringingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnakeSkinPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnakeSkinPlugin$1.class new file mode 100644 index 000000000..346a89d2d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnakeSkinPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnakeSkinPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnakeSkinPlugin.class new file mode 100644 index 000000000..024202382 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnakeSkinPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnelmCraftPlugin$SnelmCraftPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnelmCraftPlugin$SnelmCraftPulse.class new file mode 100644 index 000000000..440588be3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnelmCraftPlugin$SnelmCraftPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnelmCraftPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnelmCraftPlugin.class new file mode 100644 index 000000000..080ce604d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/SnelmCraftPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StitchCraftPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StitchCraftPlugin.class new file mode 100644 index 000000000..426a191cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StitchCraftPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin$1.class new file mode 100644 index 000000000..dc0e3616e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin$StudArmourPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin$StudArmourPulse.class new file mode 100644 index 000000000..44a21224f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin$StudArmourPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin$StuddedArmour.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin$StuddedArmour.class new file mode 100644 index 000000000..b11f1104c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin$StuddedArmour.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin.class new file mode 100644 index 000000000..dcb0ab057 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/StuddedArmourPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/TanningProduct.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/TanningProduct.class new file mode 100644 index 000000000..de5409dbd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/TanningProduct.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin$1.class new file mode 100644 index 000000000..27ca7ef04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin$WeavePulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin$WeavePulse.class new file mode 100644 index 000000000..478491f65 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin$WeavePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin$WeavingItem.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin$WeavingItem.class new file mode 100644 index 000000000..7913cb443 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin$WeavingItem.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin.class new file mode 100644 index 000000000..1367f76c3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/WeaveOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/DragonCraftPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/DragonCraftPulse.class new file mode 100644 index 000000000..88d925086 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/DragonCraftPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/HardCraftPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/HardCraftPulse.class new file mode 100644 index 000000000..76aed5c6a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/HardCraftPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/LeatherCrafting$DragonHide.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/LeatherCrafting$DragonHide.class new file mode 100644 index 000000000..7e0b368a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/LeatherCrafting$DragonHide.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/LeatherCrafting$SoftLeather.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/LeatherCrafting$SoftLeather.class new file mode 100644 index 000000000..4d686223a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/LeatherCrafting$SoftLeather.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/LeatherCrafting.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/LeatherCrafting.class new file mode 100644 index 000000000..ff5a537c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/LeatherCrafting.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/SnakeSkin.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/SnakeSkin.class new file mode 100644 index 000000000..75a7f4edb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/SnakeSkin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/SnakeSkinPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/SnakeSkinPulse.class new file mode 100644 index 000000000..13724242b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/SnakeSkinPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/SoftCraftPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/SoftCraftPulse.class new file mode 100644 index 000000000..2de1f346f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/armour/SoftCraftPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/gem/GemCutPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/gem/GemCutPulse.class new file mode 100644 index 000000000..d12c1a9e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/gem/GemCutPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/gem/Gems.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/gem/Gems.class new file mode 100644 index 000000000..e34a0abca Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/gem/Gems.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/jewellery/JewelleryCrafting$JewelleryItem.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/jewellery/JewelleryCrafting$JewelleryItem.class new file mode 100644 index 000000000..60c384286 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/jewellery/JewelleryCrafting$JewelleryItem.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/jewellery/JewelleryCrafting.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/jewellery/JewelleryCrafting.class new file mode 100644 index 000000000..2c9f51169 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/jewellery/JewelleryCrafting.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/jewellery/JewelleryPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/jewellery/JewelleryPulse.class new file mode 100644 index 000000000..daf7869ae Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/jewellery/JewelleryPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/limestone/ChiselLimestonePulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/limestone/ChiselLimestonePulse.class new file mode 100644 index 000000000..60c75cd14 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/limestone/ChiselLimestonePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/pottery/FirePotteryPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/pottery/FirePotteryPulse.class new file mode 100644 index 000000000..96490688a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/pottery/FirePotteryPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/pottery/PotteryItem.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/pottery/PotteryItem.class new file mode 100644 index 000000000..fd96ce7ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/pottery/PotteryItem.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/pottery/PotteryPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/pottery/PotteryPulse.class new file mode 100644 index 000000000..4811a7d02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/pottery/PotteryPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/spinning/SpinningItem.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/spinning/SpinningItem.class new file mode 100644 index 000000000..9d989bfe6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/spinning/SpinningItem.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/crafting/spinning/SpinningPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/spinning/SpinningPulse.class new file mode 100644 index 000000000..3e8dd4ffb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/crafting/spinning/SpinningPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/FireMakingOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/FireMakingOptionPlugin.class new file mode 100644 index 000000000..056f5d4d0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/FireMakingOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/FireMakingPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/FireMakingPulse.class new file mode 100644 index 000000000..c3e8f9542 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/FireMakingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/LightLogPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/LightLogPlugin.class new file mode 100644 index 000000000..1cee9ffa2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/LightLogPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/Log.class b/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/Log.class new file mode 100644 index 000000000..41f1ad4eb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/firemaking/Log.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fishing/Fish.class b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/Fish.class new file mode 100644 index 000000000..9712e166f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/Fish.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishSpots.class b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishSpots.class new file mode 100644 index 000000000..a8ff53827 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishSpots.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingOption.class b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingOption.class new file mode 100644 index 000000000..5cadc3c08 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingOption.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingOptionPlugin.class new file mode 100644 index 000000000..e80028549 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingPulse$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingPulse$1.class new file mode 100644 index 000000000..1fa006744 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingPulse$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingPulse$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingPulse$2.class new file mode 100644 index 000000000..d90702b2e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingPulse$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingPulse.class new file mode 100644 index 000000000..addc04fc1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingSpot.class b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingSpot.class new file mode 100644 index 000000000..1d1bb027b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fishing/FishingSpot.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/ArrowCreatePlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/ArrowCreatePlugin$1.class new file mode 100644 index 000000000..999f38ecc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/ArrowCreatePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/ArrowCreatePlugin$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/ArrowCreatePlugin$2.class new file mode 100644 index 000000000..4e8ba4002 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/ArrowCreatePlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/ArrowCreatePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/ArrowCreatePlugin.class new file mode 100644 index 000000000..22ddc8c92 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/ArrowCreatePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$ArrowHeads.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$ArrowHeads.class new file mode 100644 index 000000000..0812722e9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$ArrowHeads.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Bolts.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Bolts.class new file mode 100644 index 000000000..add9a4e06 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Bolts.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Darts.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Darts.class new file mode 100644 index 000000000..baae92926 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Darts.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$FletchingItems.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$FletchingItems.class new file mode 100644 index 000000000..b03f25d2a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$FletchingItems.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$GemBolts.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$GemBolts.class new file mode 100644 index 000000000..e6af9069a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$GemBolts.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Items.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Items.class new file mode 100644 index 000000000..361c0d307 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Items.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Limb.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Limb.class new file mode 100644 index 000000000..46436ff78 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$Limb.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$String.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$String.class new file mode 100644 index 000000000..f76427537 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching$String.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching.class new file mode 100644 index 000000000..6fc9eefad Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/Fletching.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin$1.class new file mode 100644 index 000000000..0aad4f513 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin$2.class new file mode 100644 index 000000000..0fc3eea74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin$3.class new file mode 100644 index 000000000..7e1c3138d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin.class new file mode 100644 index 000000000..711a78d15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPulse$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPulse$1.class new file mode 100644 index 000000000..f72c7fa85 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPulse$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPulse.class new file mode 100644 index 000000000..75eecdeb2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/FletchingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/GemBoltPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/GemBoltPlugin$1.class new file mode 100644 index 000000000..c38bdbf11 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/GemBoltPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/GemBoltPlugin$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/GemBoltPlugin$2.class new file mode 100644 index 000000000..2c33bd0d0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/GemBoltPlugin$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/GemBoltPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/GemBoltPlugin.class new file mode 100644 index 000000000..6ba9aa2d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/GemBoltPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/MakeCrossbowPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/MakeCrossbowPlugin$1.class new file mode 100644 index 000000000..c73ad1c27 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/MakeCrossbowPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/MakeCrossbowPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/MakeCrossbowPlugin.class new file mode 100644 index 000000000..cbe70fe34 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/MakeCrossbowPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/MithGrapplePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/MithGrapplePlugin.class new file mode 100644 index 000000000..838a72cb6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/MithGrapplePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/StringbowPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/StringbowPlugin$1.class new file mode 100644 index 000000000..5cda71e24 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/StringbowPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/StringbowPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/StringbowPlugin.class new file mode 100644 index 000000000..ba8416557 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/StringbowPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.class new file mode 100644 index 000000000..74d0718af Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/arrow/HeadlessArrowPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/arrow/HeadlessArrowPulse.class new file mode 100644 index 000000000..86ddbbf31 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/arrow/HeadlessArrowPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.class new file mode 100644 index 000000000..8f8f80b25 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/bow/StringPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/bow/StringPulse.class new file mode 100644 index 000000000..99f5ac0e6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/bow/StringPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/crossbow/Limb.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/crossbow/Limb.class new file mode 100644 index 000000000..3e034cc7b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/crossbow/Limb.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/crossbow/LimbPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/crossbow/LimbPulse.class new file mode 100644 index 000000000..870ae6f9f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/crossbow/LimbPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/darts/Dart.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/darts/Dart.class new file mode 100644 index 000000000..d06ae771d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/darts/Dart.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/darts/DartPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/darts/DartPulse.class new file mode 100644 index 000000000..04b7c280c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/darts/DartPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/gem/Gem.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/gem/Gem.class new file mode 100644 index 000000000..e76780649 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/gem/Gem.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/gem/GemBoltPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/gem/GemBoltPulse.class new file mode 100644 index 000000000..b2e476a83 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/gem/GemBoltPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/grapple/GrapplePulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/grapple/GrapplePulse.class new file mode 100644 index 000000000..c6775fcef Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/fletching/items/grapple/GrapplePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/gather/GatheringSkillOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/gather/GatheringSkillOptionPlugin.class new file mode 100644 index 000000000..3d7d810cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/gather/GatheringSkillOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/gather/GatheringSkillPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/gather/GatheringSkillPulse.class new file mode 100644 index 000000000..921068ce8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/gather/GatheringSkillPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/gather/SkillingResource.class b/Server/build/classes/java/main/core/game/node/entity/skill/gather/SkillingResource.class new file mode 100644 index 000000000..e01851bab Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/gather/SkillingResource.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/gather/SkillingTool.class b/Server/build/classes/java/main/core/game/node/entity/skill/gather/SkillingTool.class new file mode 100644 index 000000000..cd7fa5331 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/gather/SkillingTool.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/gather/mining/MiningNode.class b/Server/build/classes/java/main/core/game/node/entity/skill/gather/mining/MiningNode.class new file mode 100644 index 000000000..8ff4f89a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/gather/mining/MiningNode.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/gather/woodcutting/WoodcuttingNode.class b/Server/build/classes/java/main/core/game/node/entity/skill/gather/woodcutting/WoodcuttingNode.class new file mode 100644 index 000000000..95be809ff Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/gather/woodcutting/WoodcuttingNode.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/gather/woodcutting/WoodcuttingSkillPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/gather/woodcutting/WoodcuttingSkillPulse.class new file mode 100644 index 000000000..d132393d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/gather/woodcutting/WoodcuttingSkillPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/BarbarianMixPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/BarbarianMixPlugin.class new file mode 100644 index 000000000..e6ca786a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/BarbarianMixPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/BarbarianPotion.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/BarbarianPotion.class new file mode 100644 index 000000000..0c174bdce Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/BarbarianPotion.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/FinishedPotion.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/FinishedPotion.class new file mode 100644 index 000000000..24045db72 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/FinishedPotion.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/FinishedPotionPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/FinishedPotionPlugin$1.class new file mode 100644 index 000000000..45f1febaf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/FinishedPotionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/FinishedPotionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/FinishedPotionPlugin.class new file mode 100644 index 000000000..29828b48a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/FinishedPotionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/GenericPotion.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/GenericPotion.class new file mode 100644 index 000000000..858347f18 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/GenericPotion.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/GrindingItem.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/GrindingItem.class new file mode 100644 index 000000000..2ba72e812 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/GrindingItem.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbCleanPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbCleanPlugin.class new file mode 100644 index 000000000..1da9abd4c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbCleanPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbTarPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbTarPlugin$1.class new file mode 100644 index 000000000..eac396847 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbTarPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbTarPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbTarPlugin.class new file mode 100644 index 000000000..7efd1b785 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbTarPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbTarPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbTarPulse.class new file mode 100644 index 000000000..3d5955587 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerbTarPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerblorePulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerblorePulse.class new file mode 100644 index 000000000..8a634fdde Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/HerblorePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/Herbs.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/Herbs.class new file mode 100644 index 000000000..936de5b57 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/Herbs.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/MakeSuperCombatPotionPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/MakeSuperCombatPotionPlugin$1.class new file mode 100644 index 000000000..f99dbb15d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/MakeSuperCombatPotionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/MakeSuperCombatPotionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/MakeSuperCombatPotionPlugin.class new file mode 100644 index 000000000..069881c72 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/MakeSuperCombatPotionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/MassDecantingPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/MassDecantingPlugin.class new file mode 100644 index 000000000..34ddcc243 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/MassDecantingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/PotionDecantingPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/PotionDecantingPlugin.class new file mode 100644 index 000000000..cbb73cccc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/PotionDecantingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/SuperCombatPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/SuperCombatPulse.class new file mode 100644 index 000000000..43db328df Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/SuperCombatPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/SwampToadPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/SwampToadPlugin.class new file mode 100644 index 000000000..65c96ea9b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/SwampToadPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/Tars.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/Tars.class new file mode 100644 index 000000000..e6629268d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/Tars.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/UnfinishedPotion.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/UnfinishedPotion.class new file mode 100644 index 000000000..d7dea15ab Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/UnfinishedPotion.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/UnfinishedPotionPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/UnfinishedPotionPlugin$1.class new file mode 100644 index 000000000..87dc8ecc0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/UnfinishedPotionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/herblore/UnfinishedPotionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/UnfinishedPotionPlugin.class new file mode 100644 index 000000000..b1e6b8e83 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/herblore/UnfinishedPotionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/BoxTrapNode.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/BoxTrapNode.class new file mode 100644 index 000000000..37c5bbeac Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/BoxTrapNode.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/DeadfallSetting.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/DeadfallSetting.class new file mode 100644 index 000000000..259f9905f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/DeadfallSetting.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/FalconryActivityPlugin$FalconryPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/FalconryActivityPlugin$FalconryPlugin$1.class new file mode 100644 index 000000000..44f5883cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/FalconryActivityPlugin$FalconryPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/FalconryActivityPlugin$FalconryPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/FalconryActivityPlugin$FalconryPlugin.class new file mode 100644 index 000000000..d89f7fd57 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/FalconryActivityPlugin$FalconryPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/FalconryActivityPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/FalconryActivityPlugin.class new file mode 100644 index 000000000..eb03f42c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/FalconryActivityPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterGear.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterGear.class new file mode 100644 index 000000000..2303dbd7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterGear.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterManager.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterManager.class new file mode 100644 index 000000000..c2acb3d27 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterNPC.class new file mode 100644 index 000000000..df968918c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$1.class new file mode 100644 index 000000000..eccd577c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterItemPlugin$ReleaseType$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterItemPlugin$ReleaseType$1.class new file mode 100644 index 000000000..22ff6c533 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterItemPlugin$ReleaseType$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterItemPlugin$ReleaseType.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterItemPlugin$ReleaseType.class new file mode 100644 index 000000000..3d7555617 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterItemPlugin$ReleaseType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterItemPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterItemPlugin.class new file mode 100644 index 000000000..2eb56f177 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterItemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterNetPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterNetPlugin.class new file mode 100644 index 000000000..fb0995663 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HunterNetPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HuntingItemUseWithHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HuntingItemUseWithHandler.class new file mode 100644 index 000000000..1754001d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin$HuntingItemUseWithHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin.class new file mode 100644 index 000000000..09354e54e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/HunterPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpBoxPlugin$ImpBoxDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpBoxPlugin$ImpBoxDialogue.class new file mode 100644 index 000000000..28c91fb42 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpBoxPlugin$ImpBoxDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpBoxPlugin$ImpInterfaceHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpBoxPlugin$ImpInterfaceHandler.class new file mode 100644 index 000000000..5e9c64d86 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpBoxPlugin$ImpInterfaceHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpBoxPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpBoxPlugin.class new file mode 100644 index 000000000..36deca0fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpBoxPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpetuousImpulses.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpetuousImpulses.class new file mode 100644 index 000000000..edddd35c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImpetuousImpulses.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImplingNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImplingNPC$1.class new file mode 100644 index 000000000..e48e0c5cb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImplingNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImplingNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImplingNPC.class new file mode 100644 index 000000000..262011a73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/ImplingNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/MagicBoxSetting.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/MagicBoxSetting.class new file mode 100644 index 000000000..49271d657 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/MagicBoxSetting.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/NetTrapSetting$NetTrap.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/NetTrapSetting$NetTrap.class new file mode 100644 index 000000000..c80c6f9e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/NetTrapSetting$NetTrap.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/NetTrapSetting.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/NetTrapSetting.class new file mode 100644 index 000000000..2ebae79ef Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/NetTrapSetting.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapCreatePulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapCreatePulse.class new file mode 100644 index 000000000..c6832953f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapCreatePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapDismantlePulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapDismantlePulse.class new file mode 100644 index 000000000..b9c61dd8d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapDismantlePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapHook.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapHook.class new file mode 100644 index 000000000..c86619747 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapHook.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapNode.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapNode.class new file mode 100644 index 000000000..e203348ec Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapNode.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapSetting$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapSetting$1.class new file mode 100644 index 000000000..1ba6f3f5d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapSetting$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapSetting.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapSetting.class new file mode 100644 index 000000000..a78d96262 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapSetting.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapWrapper.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapWrapper.class new file mode 100644 index 000000000..fc5587b83 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/TrapWrapper.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/Traps$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/Traps$1.class new file mode 100644 index 000000000..1431edc7b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/Traps$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/Traps.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/Traps.class new file mode 100644 index 000000000..cd48f6762 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/Traps.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/BNetNode.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/BNetNode.class new file mode 100644 index 000000000..a5dbea517 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/BNetNode.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/BNetPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/BNetPulse.class new file mode 100644 index 000000000..659abb425 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/BNetPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/BNetTypes.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/BNetTypes.class new file mode 100644 index 000000000..d698774bc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/BNetTypes.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/ImplingNode.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/ImplingNode.class new file mode 100644 index 000000000..98bd7c35c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/bnet/ImplingNode.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/falconry/FalconCatch.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/falconry/FalconCatch.class new file mode 100644 index 000000000..4fb3a1a9c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/falconry/FalconCatch.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/falconry/FalconryCatchPulse$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/falconry/FalconryCatchPulse$1.class new file mode 100644 index 000000000..78c9955e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/falconry/FalconryCatchPulse$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/hunter/falconry/FalconryCatchPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/falconry/FalconryCatchPulse.class new file mode 100644 index 000000000..409d90010 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/hunter/falconry/FalconryCatchPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/ChargeOrbSpells$ChargeOrbPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ChargeOrbSpells$ChargeOrbPulse.class new file mode 100644 index 000000000..bb3374602 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ChargeOrbSpells$ChargeOrbPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/ChargeOrbSpells.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ChargeOrbSpells.class new file mode 100644 index 000000000..a2bf25918 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ChargeOrbSpells.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/ChargeSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ChargeSpell.class new file mode 100644 index 000000000..58c76ca5c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ChargeSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/CombinationRune.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/CombinationRune.class new file mode 100644 index 000000000..55c466c90 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/CombinationRune.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/EnchantCrossbowSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/EnchantCrossbowSpell.class new file mode 100644 index 000000000..88c39a91c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/EnchantCrossbowSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/HouseTeleportPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/HouseTeleportPlugin.class new file mode 100644 index 000000000..066c94b93 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/HouseTeleportPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/MagicSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/MagicSpell.class new file mode 100644 index 000000000..7241e6e81 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/MagicSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/MagicStaff.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/MagicStaff.class new file mode 100644 index 000000000..34d1e3600 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/MagicStaff.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/ModernTeleportPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ModernTeleportPlugin.class new file mode 100644 index 000000000..c31a24ec3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ModernTeleportPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/Runes.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/Runes.class new file mode 100644 index 000000000..c21c043db Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/Runes.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/SuperheatSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/SuperheatSpell.class new file mode 100644 index 000000000..cbaab3065 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/SuperheatSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/TeleblockSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/TeleblockSpell.class new file mode 100644 index 000000000..8aa2f7e20 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/TeleblockSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/TeleotherSpells$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/TeleotherSpells$1.class new file mode 100644 index 000000000..e77bafb4a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/TeleotherSpells$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/TeleotherSpells.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/TeleotherSpells.class new file mode 100644 index 000000000..35e1f72c7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/TeleotherSpells.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/ancient/AncientTeleportPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ancient/AncientTeleportPlugin.class new file mode 100644 index 000000000..730157a5e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/ancient/AncientTeleportPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/BakePieSpell$LunarPiePulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/BakePieSpell$LunarPiePulse.class new file mode 100644 index 000000000..e4ce207b1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/BakePieSpell$LunarPiePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/BakePieSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/BakePieSpell.class new file mode 100644 index 000000000..c31a52f1c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/BakePieSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CureGroupSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CureGroupSpell.class new file mode 100644 index 000000000..56c632e6a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CureGroupSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CureMeSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CureMeSpell.class new file mode 100644 index 000000000..f221b7af8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CureMeSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CureOtherSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CureOtherSpell.class new file mode 100644 index 000000000..b32d909b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CureOtherSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CurePlantSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CurePlantSpell.class new file mode 100644 index 000000000..c81ac1255 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/CurePlantSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/DreamSpell$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/DreamSpell$1.class new file mode 100644 index 000000000..6c6f3e439 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/DreamSpell$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/DreamSpell$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/DreamSpell$2.class new file mode 100644 index 000000000..63395dbdf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/DreamSpell$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/DreamSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/DreamSpell.class new file mode 100644 index 000000000..fbc5d78cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/DreamSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/EnergyTransferSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/EnergyTransferSpell.class new file mode 100644 index 000000000..400fa66f6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/EnergyTransferSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/FertileSoilSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/FertileSoilSpell.class new file mode 100644 index 000000000..d9cc4fa68 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/FertileSoilSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HealSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HealSpell.class new file mode 100644 index 000000000..4a1b9a4cb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HealSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HumidifySpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HumidifySpell.class new file mode 100644 index 000000000..fe1710d89 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HumidifySpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HunterKitSpell$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HunterKitSpell$1.class new file mode 100644 index 000000000..550018053 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HunterKitSpell$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HunterKitSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HunterKitSpell.class new file mode 100644 index 000000000..2d5f87499 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/HunterKitSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/LunarTeleportPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/LunarTeleportPlugin.class new file mode 100644 index 000000000..6f6a03581 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/LunarTeleportPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/MagicImbueSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/MagicImbueSpell.class new file mode 100644 index 000000000..081464c77 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/MagicImbueSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/MonsterExamineSpell$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/MonsterExamineSpell$1.class new file mode 100644 index 000000000..f00c6af02 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/MonsterExamineSpell$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/MonsterExamineSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/MonsterExamineSpell.class new file mode 100644 index 000000000..ce54f1514 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/MonsterExamineSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/NPContactSpell$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/NPContactSpell$1.class new file mode 100644 index 000000000..f79473fa8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/NPContactSpell$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/NPContactSpell$NPCContact.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/NPContactSpell$NPCContact.class new file mode 100644 index 000000000..d0a337e32 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/NPContactSpell$NPCContact.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/NPContactSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/NPContactSpell.class new file mode 100644 index 000000000..eb7ff6d0a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/NPContactSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/PlankMeSpell$Plank.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/PlankMeSpell$Plank.class new file mode 100644 index 000000000..f31a85213 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/PlankMeSpell$Plank.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/PlankMeSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/PlankMeSpell.class new file mode 100644 index 000000000..74a1b9aee Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/PlankMeSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/SpellbookSwapSpell$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/SpellbookSwapSpell$1.class new file mode 100644 index 000000000..9010273cf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/SpellbookSwapSpell$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/SpellbookSwapSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/SpellbookSwapSpell.class new file mode 100644 index 000000000..6c66dfcb7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/SpellbookSwapSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatBoostSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatBoostSpell.class new file mode 100644 index 000000000..0f52e4718 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatBoostSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatRestoreSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatRestoreSpell.class new file mode 100644 index 000000000..b188b16ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatRestoreSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatSpySpell$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatSpySpell$1.class new file mode 100644 index 000000000..8b9650f0a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatSpySpell$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatSpySpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatSpySpell.class new file mode 100644 index 000000000..7ddc251be Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StatSpySpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StringJewellerySpell$LunarStringPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StringJewellerySpell$LunarStringPulse.class new file mode 100644 index 000000000..a8e660940 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StringJewellerySpell$LunarStringPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StringJewellerySpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StringJewellerySpell.class new file mode 100644 index 000000000..f57a89168 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/StringJewellerySpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/SuperglassMakeSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/SuperglassMakeSpell.class new file mode 100644 index 000000000..33eb9f4f9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/SuperglassMakeSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/VengeanceSpell.class b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/VengeanceSpell.class new file mode 100644 index 000000000..05d7667fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/magic/lunar/VengeanceSpell.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/prayer/BoneBuryingOptionPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/BoneBuryingOptionPlugin$1.class new file mode 100644 index 000000000..69c28ead6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/BoneBuryingOptionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/prayer/BoneBuryingOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/BoneBuryingOptionPlugin.class new file mode 100644 index 000000000..af57e7074 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/BoneBuryingOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$1.class new file mode 100644 index 000000000..4dfd21862 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$Altar$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$Altar$1.class new file mode 100644 index 000000000..4c4f44d1d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$Altar$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$Altar$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$Altar$2.class new file mode 100644 index 000000000..796584313 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$Altar$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$Altar.class b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$Altar.class new file mode 100644 index 000000000..0b4c15b12 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin$Altar.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin.class new file mode 100644 index 000000000..e2e881fcb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/prayer/PrayerAltarPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Altar.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Altar.class new file mode 100644 index 000000000..b02ad9503 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Altar.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/CombinationRune.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/CombinationRune.class new file mode 100644 index 000000000..dd2af00c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/CombinationRune.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/CombinationRunePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/CombinationRunePlugin.class new file mode 100644 index 000000000..48cc6625c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/CombinationRunePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/EnchantTiaraPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/EnchantTiaraPlugin.class new file mode 100644 index 000000000..a17cd4840 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/EnchantTiaraPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/EnchantTiaraPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/EnchantTiaraPulse.class new file mode 100644 index 000000000..6dec53d73 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/EnchantTiaraPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/MysteriousRuin.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/MysteriousRuin.class new file mode 100644 index 000000000..cd6bf27d6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/MysteriousRuin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/MysteriousRuinPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/MysteriousRuinPlugin$1.class new file mode 100644 index 000000000..8214d73c7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/MysteriousRuinPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/MysteriousRuinPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/MysteriousRuinPlugin.class new file mode 100644 index 000000000..dbb766281 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/MysteriousRuinPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Rune.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Rune.class new file mode 100644 index 000000000..cea56e556 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Rune.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RuneCraftPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RuneCraftPulse.class new file mode 100644 index 000000000..fd3e78738 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RuneCraftPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RunePouch.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RunePouch.class new file mode 100644 index 000000000..53ea12b6c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RunePouch.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RunecraftingPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RunecraftingPlugin$1.class new file mode 100644 index 000000000..239caf33f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RunecraftingPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.class new file mode 100644 index 000000000..13786598f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Talisman.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Talisman.class new file mode 100644 index 000000000..7b0f296cc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Talisman.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Tiara.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Tiara.class new file mode 100644 index 000000000..643f27cf8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/Tiara.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/TiaraPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/TiaraPlugin.class new file mode 100644 index 000000000..234db9123 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/TiaraPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$1.class new file mode 100644 index 000000000..bf67aefd5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$1$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$1$1.class new file mode 100644 index 000000000..e0173cde3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$1.class new file mode 100644 index 000000000..b26c86f17 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$2$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$2$1.class new file mode 100644 index 000000000..e6284d61f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$2.class new file mode 100644 index 000000000..f10cfc877 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$3$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$3$1.class new file mode 100644 index 000000000..3eb6cfe84 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$3$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$3.class new file mode 100644 index 000000000..f35dab8f2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$4$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$4$1.class new file mode 100644 index 000000000..e24846e28 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$4$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$4.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$4.class new file mode 100644 index 000000000..2393090cd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$5$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$5$1.class new file mode 100644 index 000000000..975e2aa03 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$5$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$5.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$5.class new file mode 100644 index 000000000..4381f9cdc Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$6.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$6.class new file mode 100644 index 000000000..58f287ad1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle.class new file mode 100644 index 000000000..9f52870d5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin$AbbysalObstacle.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.class new file mode 100644 index 000000000..aff8e13f5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssalNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssalNPC.class new file mode 100644 index 000000000..5ced29351 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/AbyssalNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/DarkMageDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/DarkMageDialogue.class new file mode 100644 index 000000000..3a9db68a7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/DarkMageDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/ZamorakMageDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/ZamorakMageDialogue.class new file mode 100644 index 000000000..a851e057f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/runecrafting/abyss/ZamorakMageDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AberrantSpectreNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AberrantSpectreNPC$1.class new file mode 100644 index 000000000..33d5a8ff9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AberrantSpectreNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AberrantSpectreNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AberrantSpectreNPC.class new file mode 100644 index 000000000..a0ded92a3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AberrantSpectreNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AbyssalDemonNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AbyssalDemonNPC$1.class new file mode 100644 index 000000000..b9c730b70 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AbyssalDemonNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AbyssalDemonNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AbyssalDemonNPC.class new file mode 100644 index 000000000..631e9acca Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/AbyssalDemonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BansheeNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BansheeNPC$1.class new file mode 100644 index 000000000..d852e3bec Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BansheeNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BansheeNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BansheeNPC.class new file mode 100644 index 000000000..818253995 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BansheeNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BasiliskNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BasiliskNPC.class new file mode 100644 index 000000000..c77cdc321 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BasiliskNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BrutalDragonNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BrutalDragonNPC.class new file mode 100644 index 000000000..dea7864ce Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BrutalDragonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BugSwarmNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BugSwarmNPC.class new file mode 100644 index 000000000..9ece5662d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BugSwarmNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BuglanternPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BuglanternPlugin$1.class new file mode 100644 index 000000000..6383f808e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BuglanternPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BuglanternPlugin$LightLanternPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BuglanternPlugin$LightLanternPlugin.class new file mode 100644 index 000000000..9b2224847 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BuglanternPlugin$LightLanternPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BuglanternPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BuglanternPlugin.class new file mode 100644 index 000000000..534a62588 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/BuglanternPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CaveBugNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CaveBugNPC.class new file mode 100644 index 000000000..51e6e3ff5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CaveBugNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CaveHorrorNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CaveHorrorNPC$1.class new file mode 100644 index 000000000..af0311ef0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CaveHorrorNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CaveHorrorNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CaveHorrorNPC.class new file mode 100644 index 000000000..e9d7d098e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CaveHorrorNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CockatriceNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CockatriceNPC.class new file mode 100644 index 000000000..e8b5e51aa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/CockatriceNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DesertLizardPlugin$DezertLizardNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DesertLizardPlugin$DezertLizardNPC.class new file mode 100644 index 000000000..10854b09d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DesertLizardPlugin$DezertLizardNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DesertLizardPlugin$IcecoolerPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DesertLizardPlugin$IcecoolerPlugin.class new file mode 100644 index 000000000..c1305a81b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DesertLizardPlugin$IcecoolerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DesertLizardPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DesertLizardPlugin.class new file mode 100644 index 000000000..4d474a9b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DesertLizardPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DustDevilNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DustDevilNPC$1.class new file mode 100644 index 000000000..aee6b04fb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DustDevilNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DustDevilNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DustDevilNPC.class new file mode 100644 index 000000000..ab80bee9d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/DustDevilNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/EnchantedGemDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/EnchantedGemDialogue.class new file mode 100644 index 000000000..128f7919a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/EnchantedGemDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Equipment$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Equipment$1.class new file mode 100644 index 000000000..537e262a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Equipment$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Equipment$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Equipment$2.class new file mode 100644 index 000000000..c163ba8f9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Equipment$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Equipment.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Equipment.class new file mode 100644 index 000000000..2a032926a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Equipment.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin$FishingExplosiveHandler$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin$FishingExplosiveHandler$1.class new file mode 100644 index 000000000..7826ce46e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin$FishingExplosiveHandler$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin$FishingExplosiveHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin$FishingExplosiveHandler.class new file mode 100644 index 000000000..fca63e183 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin$FishingExplosiveHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin$MogreNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin$MogreNPC.class new file mode 100644 index 000000000..f8fe62736 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin$MogreNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin.class new file mode 100644 index 000000000..de2fca43b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/FishingExplosivePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/GargoyleNPC$RockHammerHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/GargoyleNPC$RockHammerHandler.class new file mode 100644 index 000000000..d4c868850 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/GargoyleNPC$RockHammerHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/GargoyleNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/GargoyleNPC.class new file mode 100644 index 000000000..8e9d59239 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/GargoyleNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/InfernalMageNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/InfernalMageNPC.class new file mode 100644 index 000000000..36e344055 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/InfernalMageNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/KuraskNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/KuraskNPC.class new file mode 100644 index 000000000..86cb94c4d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/KuraskNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Master$Task.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Master$Task.class new file mode 100644 index 000000000..58e730cc1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Master$Task.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Master.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Master.class new file mode 100644 index 000000000..ebe129b03 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Master.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/MirrorShieldHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/MirrorShieldHandler.class new file mode 100644 index 000000000..9f4870c9d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/MirrorShieldHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/MithrilDragonNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/MithrilDragonNPC$1.class new file mode 100644 index 000000000..10ec20e21 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/MithrilDragonNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/MithrilDragonNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/MithrilDragonNPC.class new file mode 100644 index 000000000..8d05f60ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/MithrilDragonNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/NechryaelNPC$DeathSpawnNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/NechryaelNPC$DeathSpawnNPC.class new file mode 100644 index 000000000..cc126e5ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/NechryaelNPC$DeathSpawnNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/NechryaelNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/NechryaelNPC.class new file mode 100644 index 000000000..6a6eed0a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/NechryaelNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/RockSlugPlugin$RockSlugNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/RockSlugPlugin$RockSlugNPC.class new file mode 100644 index 000000000..e83a11fba Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/RockSlugPlugin$RockSlugNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/RockSlugPlugin$SaltBagHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/RockSlugPlugin$SaltBagHandler.class new file mode 100644 index 000000000..c8aaf6cb5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/RockSlugPlugin$SaltBagHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/RockSlugPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/RockSlugPlugin.class new file mode 100644 index 000000000..c458f7f7e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/RockSlugPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SkeletalWyvernNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SkeletalWyvernNPC.class new file mode 100644 index 000000000..38b75bd5f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SkeletalWyvernNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerManager.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerManager.class new file mode 100644 index 000000000..e319a458c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerMasterDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerMasterDialogue.class new file mode 100644 index 000000000..e3371ac68 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerMasterDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerPlugin$1.class new file mode 100644 index 000000000..531eb2104 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerPlugin.class new file mode 100644 index 000000000..75bb1cee0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin$SlayerHelmCraftPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin$SlayerHelmCraftPlugin$1.class new file mode 100644 index 000000000..61c0a2f7e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin$SlayerHelmCraftPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin$SlayerHelmCraftPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin$SlayerHelmCraftPlugin.class new file mode 100644 index 000000000..0e0730c10 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin$SlayerHelmCraftPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin$SlayerMasterPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin$SlayerMasterPlugin.class new file mode 100644 index 000000000..34ae948b9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin$SlayerMasterPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin.class new file mode 100644 index 000000000..810364219 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerRewardPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerTowerPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerTowerPlugin.class new file mode 100644 index 000000000..4a0863c6a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerTowerPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerTowerZone.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerTowerZone.class new file mode 100644 index 000000000..6b51b6025 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/SlayerTowerZone.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Tasks.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Tasks.class new file mode 100644 index 000000000..deb35f91b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/Tasks.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/TurothNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/TurothNPC.class new file mode 100644 index 000000000..835b013c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/TurothNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/WaterFiendNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/WaterFiendNPC.class new file mode 100644 index 000000000..9f534dd60 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/WaterFiendNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$1$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$1$1.class new file mode 100644 index 000000000..d82ea27eb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$1.class new file mode 100644 index 000000000..a3ffb06d7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$2$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$2$1.class new file mode 100644 index 000000000..a31924dd4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$2$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$2.class new file mode 100644 index 000000000..5527b63b0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$3.class new file mode 100644 index 000000000..cd88492ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern.class new file mode 100644 index 000000000..c397ad82a Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/AncientCavern.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon$1.class new file mode 100644 index 000000000..4df733daf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.class new file mode 100644 index 000000000..3c213e194 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon$WallBeastNPC$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon$WallBeastNPC$1.class new file mode 100644 index 000000000..393bd3583 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon$WallBeastNPC$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon$WallBeastNPC.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon$WallBeastNPC.class new file mode 100644 index 000000000..742e56935 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon$WallBeastNPC.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.class new file mode 100644 index 000000000..3a87825e4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon$1.class new file mode 100644 index 000000000..9a29d1c64 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon$2.class new file mode 100644 index 000000000..60b46f3aa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.class b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.class new file mode 100644 index 000000000..9725c6597 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/BarType.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/BarType.class new file mode 100644 index 000000000..dc187cfaf Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/BarType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/Bars.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/Bars.class new file mode 100644 index 000000000..4c134a5f2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/Bars.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/FurnaceOptionPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/FurnaceOptionPlugin$1.class new file mode 100644 index 000000000..08daeaec4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/FurnaceOptionPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/FurnaceOptionPlugin$SmeltUseWithHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/FurnaceOptionPlugin$SmeltUseWithHandler.class new file mode 100644 index 000000000..d13eb8906 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/FurnaceOptionPlugin$SmeltUseWithHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/FurnaceOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/FurnaceOptionPlugin.class new file mode 100644 index 000000000..38e1c9254 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/FurnaceOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/SmithingBuilder.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/SmithingBuilder.class new file mode 100644 index 000000000..e384a4814 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/SmithingBuilder.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/SmithingPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/SmithingPulse.class new file mode 100644 index 000000000..24e1034fe Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/SmithingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/SmithingType.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/SmithingType.class new file mode 100644 index 000000000..c18a3ef31 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/SmithingType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/smelting/Bar.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/smelting/Bar.class new file mode 100644 index 000000000..7c0fec0ee Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/smelting/Bar.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/smithing/smelting/SmeltingPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/smelting/SmeltingPulse.class new file mode 100644 index 000000000..8005fcae6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/smithing/smelting/SmeltingPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/ObeliskOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/ObeliskOptionPlugin.class new file mode 100644 index 000000000..30f0afa15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/ObeliskOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreationPlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreationPlugin$1.class new file mode 100644 index 000000000..c39dc3f16 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreationPlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreationPlugin$ObeliskHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreationPlugin$ObeliskHandler.class new file mode 100644 index 000000000..e003f7579 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreationPlugin$ObeliskHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreationPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreationPlugin.class new file mode 100644 index 000000000..e4342fcd1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreationPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreator$CreatePulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreator$CreatePulse.class new file mode 100644 index 000000000..c2efacf72 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreator$CreatePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreator$SummoningNode.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreator$SummoningNode.class new file mode 100644 index 000000000..dd1b24859 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreator$SummoningNode.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreator.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreator.class new file mode 100644 index 000000000..1f181d923 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningCreator.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningPouch.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningPouch.class new file mode 100644 index 000000000..3edc5f177 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningPouch.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningScroll.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningScroll.class new file mode 100644 index 000000000..81bcef3cd Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningScroll.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTabPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTabPlugin.class new file mode 100644 index 000000000..65523e373 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTabPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$1.class new file mode 100644 index 000000000..5f80b84ab Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$2.class new file mode 100644 index 000000000..23a126de6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$3.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$3.class new file mode 100644 index 000000000..60d4ad85c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$4.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$4.class new file mode 100644 index 000000000..b60414740 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$5.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$5.class new file mode 100644 index 000000000..4f253dcac Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$5.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$6.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$6.class new file mode 100644 index 000000000..a37d58061 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue$6.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue.class new file mode 100644 index 000000000..22a447c4e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene$FluffyDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene.class new file mode 100644 index 000000000..a6ab7a019 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom$FluffyCutscene.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom.class new file mode 100644 index 000000000..ce9ecafd9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/SummoningTrainingRoom.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenBeast$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenBeast$1.class new file mode 100644 index 000000000..0aafd0220 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenBeast$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenBeast.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenBeast.class new file mode 100644 index 000000000..edcaa548d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenBeast.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenContainerListener.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenContainerListener.class new file mode 100644 index 000000000..23bdac201 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenContainerListener.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenInterfacePlugin$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenInterfacePlugin$1.class new file mode 100644 index 000000000..51267b360 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenInterfacePlugin$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenInterfacePlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenInterfacePlugin.class new file mode 100644 index 000000000..066170b6e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/BurdenInterfacePlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Familiar$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Familiar$1.class new file mode 100644 index 000000000..061012e25 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Familiar$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Familiar$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Familiar$2.class new file mode 100644 index 000000000..43893d247 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Familiar$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Familiar.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Familiar.class new file mode 100644 index 000000000..12c8e4f8c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Familiar.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarFeedPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarFeedPlugin.class new file mode 100644 index 000000000..74830c90b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarFeedPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarItemOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarItemOptionPlugin.class new file mode 100644 index 000000000..8362507eb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarItemOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarManager.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarManager.class new file mode 100644 index 000000000..79d4565ce Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarNPCOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarNPCOptionPlugin.class new file mode 100644 index 000000000..093f8729d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarNPCOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarSpecial.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarSpecial.class new file mode 100644 index 000000000..65c0eec11 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/FamiliarSpecial.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Forager.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Forager.class new file mode 100644 index 000000000..c2bf2e048 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/Forager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewDialogue.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewDialogue.class new file mode 100644 index 000000000..1b4cdb72f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewDialogue.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer$1.class new file mode 100644 index 000000000..95abc3a3b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer$2.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer$2.class new file mode 100644 index 000000000..e4ff07c95 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer$ViewType.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer$ViewType.class new file mode 100644 index 000000000..deb332f81 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer$ViewType.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer.class new file mode 100644 index 000000000..cb7d74bf3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/RemoteViewer.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/SummonFamiliarPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/SummonFamiliarPlugin.class new file mode 100644 index 000000000..1ed199785 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/familiar/SummonFamiliarPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/IncubatorEgg.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/IncubatorEgg.class new file mode 100644 index 000000000..5d5fb60ef Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/IncubatorEgg.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/Pet.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/Pet.class new file mode 100644 index 000000000..c4ac6b5f1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/Pet.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/PetDetails.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/PetDetails.class new file mode 100644 index 000000000..7206d29ab Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/PetDetails.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/Pets.class b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/Pets.class new file mode 100644 index 000000000..1832c1745 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/summoning/pet/Pets.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/thieving/PickableDoorHandler$PickableDoor.class b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/PickableDoorHandler$PickableDoor.class new file mode 100644 index 000000000..090da82c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/PickableDoorHandler$PickableDoor.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/thieving/PickableDoorHandler.class b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/PickableDoorHandler.class new file mode 100644 index 000000000..ae188b92b Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/PickableDoorHandler.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/thieving/PickpocketPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/PickpocketPulse.class new file mode 100644 index 000000000..b3a0d053c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/PickpocketPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/thieving/Stall.class b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/Stall.class new file mode 100644 index 000000000..ee980d395 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/Stall.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/thieving/StallThiefPulse.class b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/StallThiefPulse.class new file mode 100644 index 000000000..881cbbf59 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/StallThiefPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievableChestPlugin$Chest$1.class b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievableChestPlugin$Chest$1.class new file mode 100644 index 000000000..e06312359 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievableChestPlugin$Chest$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievableChestPlugin$Chest.class b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievableChestPlugin$Chest.class new file mode 100644 index 000000000..c043eb4fb Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievableChestPlugin$Chest.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievableChestPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievableChestPlugin.class new file mode 100644 index 000000000..58325fe9c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievableChestPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievingOptionPlugin.class b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievingOptionPlugin.class new file mode 100644 index 000000000..6f783e6c8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/skill/thieving/ThievingOptionPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/EntityState.class b/Server/build/classes/java/main/core/game/node/entity/state/EntityState.class new file mode 100644 index 000000000..75dd19e29 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/EntityState.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/StateManager.class b/Server/build/classes/java/main/core/game/node/entity/state/StateManager.class new file mode 100644 index 000000000..722c697e1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/StateManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/StatePulse.class b/Server/build/classes/java/main/core/game/node/entity/state/StatePulse.class new file mode 100644 index 000000000..75d174b5d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/StatePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/impl/FireResistantPulse.class b/Server/build/classes/java/main/core/game/node/entity/state/impl/FireResistantPulse.class new file mode 100644 index 000000000..5c4f1d727 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/impl/FireResistantPulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/impl/FrozenStatePulse.class b/Server/build/classes/java/main/core/game/node/entity/state/impl/FrozenStatePulse.class new file mode 100644 index 000000000..4a0696eb7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/impl/FrozenStatePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/impl/MiasmicStatePulse.class b/Server/build/classes/java/main/core/game/node/entity/state/impl/MiasmicStatePulse.class new file mode 100644 index 000000000..e9cafd40e Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/impl/MiasmicStatePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/impl/PoisonStatePulse.class b/Server/build/classes/java/main/core/game/node/entity/state/impl/PoisonStatePulse.class new file mode 100644 index 000000000..2e1d90eb7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/impl/PoisonStatePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/impl/SkullStatePulse.class b/Server/build/classes/java/main/core/game/node/entity/state/impl/SkullStatePulse.class new file mode 100644 index 000000000..9c4a9cd8c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/impl/SkullStatePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/impl/StunStatePulse.class b/Server/build/classes/java/main/core/game/node/entity/state/impl/StunStatePulse.class new file mode 100644 index 000000000..eb5b1176d Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/impl/StunStatePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/entity/state/impl/TeleblockStatePulse.class b/Server/build/classes/java/main/core/game/node/entity/state/impl/TeleblockStatePulse.class new file mode 100644 index 000000000..97e5e189f Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/entity/state/impl/TeleblockStatePulse.class differ diff --git a/Server/build/classes/java/main/core/game/node/item/ChanceItem.class b/Server/build/classes/java/main/core/game/node/item/ChanceItem.class new file mode 100644 index 000000000..df937aca9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/item/ChanceItem.class differ diff --git a/Server/build/classes/java/main/core/game/node/item/GroundItem.class b/Server/build/classes/java/main/core/game/node/item/GroundItem.class new file mode 100644 index 000000000..42a3d89f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/item/GroundItem.class differ diff --git a/Server/build/classes/java/main/core/game/node/item/GroundItemManager.class b/Server/build/classes/java/main/core/game/node/item/GroundItemManager.class new file mode 100644 index 000000000..5990417fa Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/item/GroundItemManager.class differ diff --git a/Server/build/classes/java/main/core/game/node/item/Item.class b/Server/build/classes/java/main/core/game/node/item/Item.class new file mode 100644 index 000000000..48301f84c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/item/Item.class differ diff --git a/Server/build/classes/java/main/core/game/node/item/ItemPlugin.class b/Server/build/classes/java/main/core/game/node/item/ItemPlugin.class new file mode 100644 index 000000000..416a20f49 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/item/ItemPlugin.class differ diff --git a/Server/build/classes/java/main/core/game/node/item/WeightedChanceItem.class b/Server/build/classes/java/main/core/game/node/item/WeightedChanceItem.class new file mode 100644 index 000000000..7c5d62308 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/item/WeightedChanceItem.class differ diff --git a/Server/build/classes/java/main/core/game/node/object/Constructed.class b/Server/build/classes/java/main/core/game/node/object/Constructed.class new file mode 100644 index 000000000..8dba8a313 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/object/Constructed.class differ diff --git a/Server/build/classes/java/main/core/game/node/object/GameObject.class b/Server/build/classes/java/main/core/game/node/object/GameObject.class new file mode 100644 index 000000000..cb18d9601 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/object/GameObject.class differ diff --git a/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$1.class b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$1.class new file mode 100644 index 000000000..fea5adae5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$1.class differ diff --git a/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$2.class b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$2.class new file mode 100644 index 000000000..49a739fb5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$2.class differ diff --git a/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$3.class b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$3.class new file mode 100644 index 000000000..0eea137d0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$3.class differ diff --git a/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$4.class b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$4.class new file mode 100644 index 000000000..97621be10 Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder$4.class differ diff --git a/Server/build/classes/java/main/core/game/node/object/ObjectBuilder.class b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder.class new file mode 100644 index 000000000..8cdd01e1c Binary files /dev/null and b/Server/build/classes/java/main/core/game/node/object/ObjectBuilder.class differ diff --git a/Server/build/classes/java/main/core/game/system/SystemConfig.class b/Server/build/classes/java/main/core/game/system/SystemConfig.class new file mode 100644 index 000000000..0f5947f5a Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/SystemConfig.class differ diff --git a/Server/build/classes/java/main/core/game/system/SystemManager$1.class b/Server/build/classes/java/main/core/game/system/SystemManager$1.class new file mode 100644 index 000000000..c74710d74 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/SystemManager$1.class differ diff --git a/Server/build/classes/java/main/core/game/system/SystemManager.class b/Server/build/classes/java/main/core/game/system/SystemManager.class new file mode 100644 index 000000000..60a837612 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/SystemManager.class differ diff --git a/Server/build/classes/java/main/core/game/system/SystemShutdownHook.class b/Server/build/classes/java/main/core/game/system/SystemShutdownHook.class new file mode 100644 index 000000000..0d412e724 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/SystemShutdownHook.class differ diff --git a/Server/build/classes/java/main/core/game/system/SystemState.class b/Server/build/classes/java/main/core/game/system/SystemState.class new file mode 100644 index 000000000..984271e93 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/SystemState.class differ diff --git a/Server/build/classes/java/main/core/game/system/SystemTermination.class b/Server/build/classes/java/main/core/game/system/SystemTermination.class new file mode 100644 index 000000000..25ae1e293 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/SystemTermination.class differ diff --git a/Server/build/classes/java/main/core/game/system/SystemUpdate$1.class b/Server/build/classes/java/main/core/game/system/SystemUpdate$1.class new file mode 100644 index 000000000..3704d826b Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/SystemUpdate$1.class differ diff --git a/Server/build/classes/java/main/core/game/system/SystemUpdate.class b/Server/build/classes/java/main/core/game/system/SystemUpdate.class new file mode 100644 index 000000000..81d474343 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/SystemUpdate.class differ diff --git a/Server/build/classes/java/main/core/game/system/command/CommandSet$1.class b/Server/build/classes/java/main/core/game/system/command/CommandSet$1.class new file mode 100644 index 000000000..f1dbc6ced Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/command/CommandSet$1.class differ diff --git a/Server/build/classes/java/main/core/game/system/command/CommandSet$2.class b/Server/build/classes/java/main/core/game/system/command/CommandSet$2.class new file mode 100644 index 000000000..7560260e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/command/CommandSet$2.class differ diff --git a/Server/build/classes/java/main/core/game/system/command/CommandSet$3.class b/Server/build/classes/java/main/core/game/system/command/CommandSet$3.class new file mode 100644 index 000000000..b32f454d9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/command/CommandSet$3.class differ diff --git a/Server/build/classes/java/main/core/game/system/command/CommandSet$4.class b/Server/build/classes/java/main/core/game/system/command/CommandSet$4.class new file mode 100644 index 000000000..3b8151693 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/command/CommandSet$4.class differ diff --git a/Server/build/classes/java/main/core/game/system/command/CommandSet.class b/Server/build/classes/java/main/core/game/system/command/CommandSet.class new file mode 100644 index 000000000..6bdac63b1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/command/CommandSet.class differ diff --git a/Server/build/classes/java/main/core/game/system/communication/ClanEntry.class b/Server/build/classes/java/main/core/game/system/communication/ClanEntry.class new file mode 100644 index 000000000..0e54536e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/communication/ClanEntry.class differ diff --git a/Server/build/classes/java/main/core/game/system/communication/ClanMember.class b/Server/build/classes/java/main/core/game/system/communication/ClanMember.class new file mode 100644 index 000000000..13772f347 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/communication/ClanMember.class differ diff --git a/Server/build/classes/java/main/core/game/system/communication/ClanRank.class b/Server/build/classes/java/main/core/game/system/communication/ClanRank.class new file mode 100644 index 000000000..1762ceefa Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/communication/ClanRank.class differ diff --git a/Server/build/classes/java/main/core/game/system/communication/ClanRepository.class b/Server/build/classes/java/main/core/game/system/communication/ClanRepository.class new file mode 100644 index 000000000..ed5e8907c Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/communication/ClanRepository.class differ diff --git a/Server/build/classes/java/main/core/game/system/communication/CommunicationInfo$1.class b/Server/build/classes/java/main/core/game/system/communication/CommunicationInfo$1.class new file mode 100644 index 000000000..4d2414c0f Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/communication/CommunicationInfo$1.class differ diff --git a/Server/build/classes/java/main/core/game/system/communication/CommunicationInfo.class b/Server/build/classes/java/main/core/game/system/communication/CommunicationInfo.class new file mode 100644 index 000000000..45d28d214 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/communication/CommunicationInfo.class differ diff --git a/Server/build/classes/java/main/core/game/system/communication/Contact.class b/Server/build/classes/java/main/core/game/system/communication/Contact.class new file mode 100644 index 000000000..5215f8df1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/communication/Contact.class differ diff --git a/Server/build/classes/java/main/core/game/system/monitor/DuplicationLog.class b/Server/build/classes/java/main/core/game/system/monitor/DuplicationLog.class new file mode 100644 index 000000000..50ce64de7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/monitor/DuplicationLog.class differ diff --git a/Server/build/classes/java/main/core/game/system/monitor/ExceptionLog.class b/Server/build/classes/java/main/core/game/system/monitor/ExceptionLog.class new file mode 100644 index 000000000..c8ccad82f Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/monitor/ExceptionLog.class differ diff --git a/Server/build/classes/java/main/core/game/system/monitor/MessageLog.class b/Server/build/classes/java/main/core/game/system/monitor/MessageLog.class new file mode 100644 index 000000000..ee41187af Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/monitor/MessageLog.class differ diff --git a/Server/build/classes/java/main/core/game/system/monitor/PlayerMonitor.class b/Server/build/classes/java/main/core/game/system/monitor/PlayerMonitor.class new file mode 100644 index 000000000..61f0513f6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/monitor/PlayerMonitor.class differ diff --git a/Server/build/classes/java/main/core/game/system/mysql/SQLColumn.class b/Server/build/classes/java/main/core/game/system/mysql/SQLColumn.class new file mode 100644 index 000000000..8788e1c04 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/mysql/SQLColumn.class differ diff --git a/Server/build/classes/java/main/core/game/system/mysql/SQLEntryHandler.class b/Server/build/classes/java/main/core/game/system/mysql/SQLEntryHandler.class new file mode 100644 index 000000000..9f354d6c5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/mysql/SQLEntryHandler.class differ diff --git a/Server/build/classes/java/main/core/game/system/mysql/SQLManager.class b/Server/build/classes/java/main/core/game/system/mysql/SQLManager.class new file mode 100644 index 000000000..4aab8c077 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/mysql/SQLManager.class differ diff --git a/Server/build/classes/java/main/core/game/system/mysql/SQLTable.class b/Server/build/classes/java/main/core/game/system/mysql/SQLTable.class new file mode 100644 index 000000000..c92185dfb Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/mysql/SQLTable.class differ diff --git a/Server/build/classes/java/main/core/game/system/mysql/impl/HighscoreSQLHandler.class b/Server/build/classes/java/main/core/game/system/mysql/impl/HighscoreSQLHandler.class new file mode 100644 index 000000000..8eabb52a4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/mysql/impl/HighscoreSQLHandler.class differ diff --git a/Server/build/classes/java/main/core/game/system/mysql/impl/PlayerLogSQLHandler.class b/Server/build/classes/java/main/core/game/system/mysql/impl/PlayerLogSQLHandler.class new file mode 100644 index 000000000..765705335 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/mysql/impl/PlayerLogSQLHandler.class differ diff --git a/Server/build/classes/java/main/core/game/system/mysql/impl/PlayerSQLHandler.class b/Server/build/classes/java/main/core/game/system/mysql/impl/PlayerSQLHandler.class new file mode 100644 index 000000000..11729e1ae Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/mysql/impl/PlayerSQLHandler.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/InstructionType.class b/Server/build/classes/java/main/core/game/system/script/InstructionType.class new file mode 100644 index 000000000..08c2eeeff Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/InstructionType.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/MethodCall.class b/Server/build/classes/java/main/core/game/system/script/MethodCall.class new file mode 100644 index 000000000..45188d7ed Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/MethodCall.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/ParamCall.class b/Server/build/classes/java/main/core/game/system/script/ParamCall.class new file mode 100644 index 000000000..c9912d201 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/ParamCall.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/ScriptBuilder.class b/Server/build/classes/java/main/core/game/system/script/ScriptBuilder.class new file mode 100644 index 000000000..1cd14b9c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/ScriptBuilder.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/ScriptCompiler$1.class b/Server/build/classes/java/main/core/game/system/script/ScriptCompiler$1.class new file mode 100644 index 000000000..5dd165b92 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/ScriptCompiler$1.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/ScriptCompiler.class b/Server/build/classes/java/main/core/game/system/script/ScriptCompiler.class new file mode 100644 index 000000000..7175800e3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/ScriptCompiler.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/ScriptContext.class b/Server/build/classes/java/main/core/game/system/script/ScriptContext.class new file mode 100644 index 000000000..438ec3a3f Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/ScriptContext.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/ScriptEntry.class b/Server/build/classes/java/main/core/game/system/script/ScriptEntry.class new file mode 100644 index 000000000..1548d4b2d Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/ScriptEntry.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/ScriptManager.class b/Server/build/classes/java/main/core/game/system/script/ScriptManager.class new file mode 100644 index 000000000..043d4e1cd Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/ScriptManager.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/ScriptType.class b/Server/build/classes/java/main/core/game/system/script/ScriptType.class new file mode 100644 index 000000000..a00437b53 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/ScriptType.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/build/DialogueScriptBuilder.class b/Server/build/classes/java/main/core/game/system/script/build/DialogueScriptBuilder.class new file mode 100644 index 000000000..ec2bd5569 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/build/DialogueScriptBuilder.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/AddItemInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/AddItemInstruction.class new file mode 100644 index 000000000..b4c77649b Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/AddItemInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/CheckRandomCondition.class b/Server/build/classes/java/main/core/game/system/script/context/CheckRandomCondition.class new file mode 100644 index 000000000..9c2b8a6f8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/CheckRandomCondition.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/InvItemCondition.class b/Server/build/classes/java/main/core/game/system/script/context/InvItemCondition.class new file mode 100644 index 000000000..8b53bd9fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/InvItemCondition.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/ItemMessageInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/ItemMessageInstruction.class new file mode 100644 index 000000000..dbfae5ab9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/ItemMessageInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/NPCDialInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/NPCDialInstruction.class new file mode 100644 index 000000000..867b5a8b5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/NPCDialInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/OptionDialInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/OptionDialInstruction.class new file mode 100644 index 000000000..3c2b85005 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/OptionDialInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/PDialInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/PDialInstruction.class new file mode 100644 index 000000000..5896dc582 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/PDialInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/PMessageInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/PMessageInstruction.class new file mode 100644 index 000000000..0bf2788a5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/PMessageInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/PauseInstruction$1.class b/Server/build/classes/java/main/core/game/system/script/context/PauseInstruction$1.class new file mode 100644 index 000000000..589f2c145 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/PauseInstruction$1.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/PauseInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/PauseInstruction.class new file mode 100644 index 000000000..5d786740f Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/PauseInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/PlainMessageInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/PlainMessageInstruction.class new file mode 100644 index 000000000..5ab00750a Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/PlainMessageInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/RemoveItemInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/RemoveItemInstruction.class new file mode 100644 index 000000000..091873cf8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/RemoveItemInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/SetAttributeInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/SetAttributeInstruction.class new file mode 100644 index 000000000..66b2db605 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/SetAttributeInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/SetRandomInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/SetRandomInstruction.class new file mode 100644 index 000000000..263ebb009 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/SetRandomInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/ShopInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/ShopInstruction.class new file mode 100644 index 000000000..7b119fc3e Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/ShopInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/StartActivityInstruction.class b/Server/build/classes/java/main/core/game/system/script/context/StartActivityInstruction.class new file mode 100644 index 000000000..a748fe37d Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/StartActivityInstruction.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/context/WGuildTokenCondition.class b/Server/build/classes/java/main/core/game/system/script/context/WGuildTokenCondition.class new file mode 100644 index 000000000..c4a718034 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/context/WGuildTokenCondition.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/exc/InvalidGOTOException.class b/Server/build/classes/java/main/core/game/system/script/exc/InvalidGOTOException.class new file mode 100644 index 000000000..9008fcde9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/exc/InvalidGOTOException.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/exc/InvalidInstructionException.class b/Server/build/classes/java/main/core/game/system/script/exc/InvalidInstructionException.class new file mode 100644 index 000000000..239f01b9f Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/exc/InvalidInstructionException.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/exc/InvalidInterpreterException.class b/Server/build/classes/java/main/core/game/system/script/exc/InvalidInterpreterException.class new file mode 100644 index 000000000..9c93599e7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/exc/InvalidInterpreterException.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/exc/ScriptException.class b/Server/build/classes/java/main/core/game/system/script/exc/ScriptException.class new file mode 100644 index 000000000..b8bdc315d Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/exc/ScriptException.class differ diff --git a/Server/build/classes/java/main/core/game/system/script/exc/UnknownScriptException.class b/Server/build/classes/java/main/core/game/system/script/exc/UnknownScriptException.class new file mode 100644 index 000000000..4504494aa Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/script/exc/UnknownScriptException.class differ diff --git a/Server/build/classes/java/main/core/game/system/security/EncryptionManager$BCrypt.class b/Server/build/classes/java/main/core/game/system/security/EncryptionManager$BCrypt.class new file mode 100644 index 000000000..c5ea234f7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/security/EncryptionManager$BCrypt.class differ diff --git a/Server/build/classes/java/main/core/game/system/security/EncryptionManager.class b/Server/build/classes/java/main/core/game/system/security/EncryptionManager.class new file mode 100644 index 000000000..e6c4742fc Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/security/EncryptionManager.class differ diff --git a/Server/build/classes/java/main/core/game/system/task/ItemLogoutTask.class b/Server/build/classes/java/main/core/game/system/task/ItemLogoutTask.class new file mode 100644 index 000000000..dc93200e8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/task/ItemLogoutTask.class differ diff --git a/Server/build/classes/java/main/core/game/system/task/LocationLogoutTask.class b/Server/build/classes/java/main/core/game/system/task/LocationLogoutTask.class new file mode 100644 index 000000000..11ed1975c Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/task/LocationLogoutTask.class differ diff --git a/Server/build/classes/java/main/core/game/system/task/LogoutTask.class b/Server/build/classes/java/main/core/game/system/task/LogoutTask.class new file mode 100644 index 000000000..5aff0a487 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/task/LogoutTask.class differ diff --git a/Server/build/classes/java/main/core/game/system/task/MovementHook.class b/Server/build/classes/java/main/core/game/system/task/MovementHook.class new file mode 100644 index 000000000..ccd600b6b Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/task/MovementHook.class differ diff --git a/Server/build/classes/java/main/core/game/system/task/NodeTask$1.class b/Server/build/classes/java/main/core/game/system/task/NodeTask$1.class new file mode 100644 index 000000000..678382afc Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/task/NodeTask$1.class differ diff --git a/Server/build/classes/java/main/core/game/system/task/NodeTask.class b/Server/build/classes/java/main/core/game/system/task/NodeTask.class new file mode 100644 index 000000000..1aa3f75e5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/task/NodeTask.class differ diff --git a/Server/build/classes/java/main/core/game/system/task/Pulse.class b/Server/build/classes/java/main/core/game/system/task/Pulse.class new file mode 100644 index 000000000..e2eecd399 Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/task/Pulse.class differ diff --git a/Server/build/classes/java/main/core/game/system/task/TaskExecutor.class b/Server/build/classes/java/main/core/game/system/task/TaskExecutor.class new file mode 100644 index 000000000..9bf22db5a Binary files /dev/null and b/Server/build/classes/java/main/core/game/system/task/TaskExecutor.class differ diff --git a/Server/build/classes/java/main/core/game/world/GameType.class b/Server/build/classes/java/main/core/game/world/GameType.class new file mode 100644 index 000000000..74fd049e0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/GameType.class differ diff --git a/Server/build/classes/java/main/core/game/world/callback/CallBack.class b/Server/build/classes/java/main/core/game/world/callback/CallBack.class new file mode 100644 index 000000000..25291e93b Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/callback/CallBack.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/BuildRegionChunk.class b/Server/build/classes/java/main/core/game/world/map/BuildRegionChunk.class new file mode 100644 index 000000000..a50d1286b Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/BuildRegionChunk.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/Direction.class b/Server/build/classes/java/main/core/game/world/map/Direction.class new file mode 100644 index 000000000..d120d28b1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/Direction.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/Location.class b/Server/build/classes/java/main/core/game/world/map/Location.class new file mode 100644 index 000000000..3e0ae2f0e Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/Location.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/MapDistance.class b/Server/build/classes/java/main/core/game/world/map/MapDistance.class new file mode 100644 index 000000000..0c8855a15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/MapDistance.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/Point.class b/Server/build/classes/java/main/core/game/world/map/Point.class new file mode 100644 index 000000000..933585b22 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/Point.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/Region$1.class b/Server/build/classes/java/main/core/game/world/map/Region$1.class new file mode 100644 index 000000000..93d9ebf8b Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/Region$1.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/Region.class b/Server/build/classes/java/main/core/game/world/map/Region.class new file mode 100644 index 000000000..12662e2f6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/Region.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/RegionChunk.class b/Server/build/classes/java/main/core/game/world/map/RegionChunk.class new file mode 100644 index 000000000..833d7e1fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/RegionChunk.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/RegionManager.class b/Server/build/classes/java/main/core/game/world/map/RegionManager.class new file mode 100644 index 000000000..8b5b12b58 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/RegionManager.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/RegionPlane.class b/Server/build/classes/java/main/core/game/world/map/RegionPlane.class new file mode 100644 index 000000000..6b07f332d Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/RegionPlane.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/Viewport.class b/Server/build/classes/java/main/core/game/world/map/Viewport.class new file mode 100644 index 000000000..8b426f092 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/Viewport.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/build/DynamicRegion.class b/Server/build/classes/java/main/core/game/world/map/build/DynamicRegion.class new file mode 100644 index 000000000..e1c76af7d Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/build/DynamicRegion.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/build/LandscapeParser.class b/Server/build/classes/java/main/core/game/world/map/build/LandscapeParser.class new file mode 100644 index 000000000..92998cbe9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/build/LandscapeParser.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/build/MapscapeParser.class b/Server/build/classes/java/main/core/game/world/map/build/MapscapeParser.class new file mode 100644 index 000000000..230a0d7e9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/build/MapscapeParser.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/build/RegionFlags.class b/Server/build/classes/java/main/core/game/world/map/build/RegionFlags.class new file mode 100644 index 000000000..ab1afb7a2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/build/RegionFlags.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/path/ClipMaskSupplier.class b/Server/build/classes/java/main/core/game/world/map/path/ClipMaskSupplier.class new file mode 100644 index 000000000..1eee0ac59 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/path/ClipMaskSupplier.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/path/DumbPathfinder$1.class b/Server/build/classes/java/main/core/game/world/map/path/DumbPathfinder$1.class new file mode 100644 index 000000000..f1d237a3c Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/path/DumbPathfinder$1.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/path/DumbPathfinder.class b/Server/build/classes/java/main/core/game/world/map/path/DumbPathfinder.class new file mode 100644 index 000000000..d076e29ec Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/path/DumbPathfinder.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/path/Path.class b/Server/build/classes/java/main/core/game/world/map/path/Path.class new file mode 100644 index 000000000..1048df6a8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/path/Path.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/path/Pathfinder.class b/Server/build/classes/java/main/core/game/world/map/path/Pathfinder.class new file mode 100644 index 000000000..e2acd4187 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/path/Pathfinder.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/path/ProjectilePathfinder$1.class b/Server/build/classes/java/main/core/game/world/map/path/ProjectilePathfinder$1.class new file mode 100644 index 000000000..4ad5083fd Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/path/ProjectilePathfinder$1.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/path/ProjectilePathfinder.class b/Server/build/classes/java/main/core/game/world/map/path/ProjectilePathfinder.class new file mode 100644 index 000000000..6cfa2f12e Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/path/ProjectilePathfinder.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/MapZone.class b/Server/build/classes/java/main/core/game/world/map/zone/MapZone.class new file mode 100644 index 000000000..7b7c801d8 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/MapZone.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/RegionZone.class b/Server/build/classes/java/main/core/game/world/map/zone/RegionZone.class new file mode 100644 index 000000000..d3772add4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/RegionZone.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/Zone.class b/Server/build/classes/java/main/core/game/world/map/zone/Zone.class new file mode 100644 index 000000000..da3bc31f3 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/Zone.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/ZoneBorders.class b/Server/build/classes/java/main/core/game/world/map/zone/ZoneBorders.class new file mode 100644 index 000000000..505e1d373 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/ZoneBorders.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/ZoneBuilder.class b/Server/build/classes/java/main/core/game/world/map/zone/ZoneBuilder.class new file mode 100644 index 000000000..09f95681b Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/ZoneBuilder.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/ZoneMonitor.class b/Server/build/classes/java/main/core/game/world/map/zone/ZoneMonitor.class new file mode 100644 index 000000000..a28f75bf2 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/ZoneMonitor.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/ZoneRestriction.class b/Server/build/classes/java/main/core/game/world/map/zone/ZoneRestriction.class new file mode 100644 index 000000000..1b522f70c Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/ZoneRestriction.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/ZoneType.class b/Server/build/classes/java/main/core/game/world/map/zone/ZoneType.class new file mode 100644 index 000000000..39816a438 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/ZoneType.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/impl/BankZone.class b/Server/build/classes/java/main/core/game/world/map/zone/impl/BankZone.class new file mode 100644 index 000000000..50246a26c Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/impl/BankZone.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/impl/DarkZone$1$1.class b/Server/build/classes/java/main/core/game/world/map/zone/impl/DarkZone$1$1.class new file mode 100644 index 000000000..17b6d6bc4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/impl/DarkZone$1$1.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/impl/DarkZone$1.class b/Server/build/classes/java/main/core/game/world/map/zone/impl/DarkZone$1.class new file mode 100644 index 000000000..3d5cb30ca Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/impl/DarkZone$1.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/impl/DarkZone.class b/Server/build/classes/java/main/core/game/world/map/zone/impl/DarkZone.class new file mode 100644 index 000000000..af2151fa5 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/impl/DarkZone.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/impl/KaramjaZone.class b/Server/build/classes/java/main/core/game/world/map/zone/impl/KaramjaZone.class new file mode 100644 index 000000000..5fac475f0 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/impl/KaramjaZone.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/impl/ModeratorZone.class b/Server/build/classes/java/main/core/game/world/map/zone/impl/ModeratorZone.class new file mode 100644 index 000000000..fb12cdd38 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/impl/ModeratorZone.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/impl/MultiwayCombatZone.class b/Server/build/classes/java/main/core/game/world/map/zone/impl/MultiwayCombatZone.class new file mode 100644 index 000000000..da2241d15 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/impl/MultiwayCombatZone.class differ diff --git a/Server/build/classes/java/main/core/game/world/map/zone/impl/WildernessZone.class b/Server/build/classes/java/main/core/game/world/map/zone/impl/WildernessZone.class new file mode 100644 index 000000000..4bf7ee059 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/map/zone/impl/WildernessZone.class differ diff --git a/Server/build/classes/java/main/core/game/world/objectparser/ObjectParser.class b/Server/build/classes/java/main/core/game/world/objectparser/ObjectParser.class new file mode 100644 index 000000000..f83818596 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/objectparser/ObjectParser.class differ diff --git a/Server/build/classes/java/main/core/game/world/repository/InitializationEntry.class b/Server/build/classes/java/main/core/game/world/repository/InitializationEntry.class new file mode 100644 index 000000000..9ba8e9a7f Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/repository/InitializationEntry.class differ diff --git a/Server/build/classes/java/main/core/game/world/repository/InitializingNodeList.class b/Server/build/classes/java/main/core/game/world/repository/InitializingNodeList.class new file mode 100644 index 000000000..6b82304b7 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/repository/InitializingNodeList.class differ diff --git a/Server/build/classes/java/main/core/game/world/repository/NodeList.class b/Server/build/classes/java/main/core/game/world/repository/NodeList.class new file mode 100644 index 000000000..377a1d1c6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/repository/NodeList.class differ diff --git a/Server/build/classes/java/main/core/game/world/repository/NodeListIterator.class b/Server/build/classes/java/main/core/game/world/repository/NodeListIterator.class new file mode 100644 index 000000000..629dcb812 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/repository/NodeListIterator.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/FlagContext.class b/Server/build/classes/java/main/core/game/world/update/flag/FlagContext.class new file mode 100644 index 000000000..56c24e9ea Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/FlagContext.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/PlayerFlags.class b/Server/build/classes/java/main/core/game/world/update/flag/PlayerFlags.class new file mode 100644 index 000000000..eea347897 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/PlayerFlags.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/UpdateFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/UpdateFlag.class new file mode 100644 index 000000000..3fffe544b Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/UpdateFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/chunk/AnimateObjectUpdateFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/chunk/AnimateObjectUpdateFlag.class new file mode 100644 index 000000000..5206fc72e Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/chunk/AnimateObjectUpdateFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/chunk/GraphicUpdateFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/chunk/GraphicUpdateFlag.class new file mode 100644 index 000000000..1521a016f Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/chunk/GraphicUpdateFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/chunk/ItemUpdateFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/chunk/ItemUpdateFlag.class new file mode 100644 index 000000000..a6941ca12 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/chunk/ItemUpdateFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/chunk/ObjectUpdateFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/chunk/ObjectUpdateFlag.class new file mode 100644 index 000000000..2d5499b5d Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/chunk/ObjectUpdateFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/chunk/ProjectileUpdateFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/chunk/ProjectileUpdateFlag.class new file mode 100644 index 000000000..e6a754a0e Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/chunk/ProjectileUpdateFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/context/Animation.class b/Server/build/classes/java/main/core/game/world/update/flag/context/Animation.class new file mode 100644 index 000000000..8418603c1 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/context/Animation.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/context/ChatMessage.class b/Server/build/classes/java/main/core/game/world/update/flag/context/ChatMessage.class new file mode 100644 index 000000000..beb6d955f Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/context/ChatMessage.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/context/Graphics.class b/Server/build/classes/java/main/core/game/world/update/flag/context/Graphics.class new file mode 100644 index 000000000..c3f0ca3b4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/context/Graphics.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/context/HitMark.class b/Server/build/classes/java/main/core/game/world/update/flag/context/HitMark.class new file mode 100644 index 000000000..bdc6240ba Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/context/HitMark.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCAnimation.class b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCAnimation.class new file mode 100644 index 000000000..d2a12e656 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCAnimation.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCFaceEntity.class b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCFaceEntity.class new file mode 100644 index 000000000..d96fb79a9 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCFaceEntity.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCFaceLocation.class b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCFaceLocation.class new file mode 100644 index 000000000..6863f1961 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCFaceLocation.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCForceChat.class b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCForceChat.class new file mode 100644 index 000000000..d3aa6e3fb Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCForceChat.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCGraphic.class b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCGraphic.class new file mode 100644 index 000000000..73679352b Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCGraphic.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCHitFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCHitFlag.class new file mode 100644 index 000000000..12905b22d Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCHitFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCHitFlag1.class b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCHitFlag1.class new file mode 100644 index 000000000..a70630ff4 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCHitFlag1.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCSwitchId.class b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCSwitchId.class new file mode 100644 index 000000000..4bde1c545 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/npc/NPCSwitchId.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/AnimationFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/player/AnimationFlag.class new file mode 100644 index 000000000..f42ea1722 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/AnimationFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/AppearanceFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/player/AppearanceFlag.class new file mode 100644 index 000000000..01f16d31c Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/AppearanceFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/ChatFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/player/ChatFlag.class new file mode 100644 index 000000000..5ed756c70 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/ChatFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/FaceEntityFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/player/FaceEntityFlag.class new file mode 100644 index 000000000..4c1895453 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/FaceEntityFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/FaceLocationFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/player/FaceLocationFlag.class new file mode 100644 index 000000000..ae3cc014b Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/FaceLocationFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/ForceChatFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/player/ForceChatFlag.class new file mode 100644 index 000000000..590c7f04d Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/ForceChatFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/ForceMovementFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/player/ForceMovementFlag.class new file mode 100644 index 000000000..4c1436099 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/ForceMovementFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/GraphicFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/player/GraphicFlag.class new file mode 100644 index 000000000..df5323ae6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/GraphicFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/HitUpdateFlag.class b/Server/build/classes/java/main/core/game/world/update/flag/player/HitUpdateFlag.class new file mode 100644 index 000000000..4d65a0d3e Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/HitUpdateFlag.class differ diff --git a/Server/build/classes/java/main/core/game/world/update/flag/player/HitUpdateFlag1.class b/Server/build/classes/java/main/core/game/world/update/flag/player/HitUpdateFlag1.class new file mode 100644 index 000000000..bde5d60e6 Binary files /dev/null and b/Server/build/classes/java/main/core/game/world/update/flag/player/HitUpdateFlag1.class differ diff --git a/Server/build/classes/java/main/core/gui/ConsoleFrame.class b/Server/build/classes/java/main/core/gui/ConsoleFrame.class new file mode 100644 index 000000000..96e53f705 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/ConsoleFrame.class differ diff --git a/Server/build/classes/java/main/core/gui/ConsoleTab.class b/Server/build/classes/java/main/core/gui/ConsoleTab.class new file mode 100644 index 000000000..bb99c959b Binary files /dev/null and b/Server/build/classes/java/main/core/gui/ConsoleTab.class differ diff --git a/Server/build/classes/java/main/core/gui/component/ConsoleLogger.class b/Server/build/classes/java/main/core/gui/component/ConsoleLogger.class new file mode 100644 index 000000000..d09d4888e Binary files /dev/null and b/Server/build/classes/java/main/core/gui/component/ConsoleLogger.class differ diff --git a/Server/build/classes/java/main/core/gui/component/PlayerViewer.class b/Server/build/classes/java/main/core/gui/component/PlayerViewer.class new file mode 100644 index 000000000..e59513080 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/component/PlayerViewer.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$1.class b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$1.class new file mode 100644 index 000000000..257bb0074 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$1.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$2.class b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$2.class new file mode 100644 index 000000000..2cf7b4097 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$2.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$3.class b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$3.class new file mode 100644 index 000000000..52a688cb4 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$3.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$4.class b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$4.class new file mode 100644 index 000000000..30d1c669a Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$4.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$5.class b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$5.class new file mode 100644 index 000000000..83e2648ba Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab$5.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab.class b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab.class new file mode 100644 index 000000000..17cbb966e Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/GrandExchangeTab.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/PlayerTab$1.class b/Server/build/classes/java/main/core/gui/tab/PlayerTab$1.class new file mode 100644 index 000000000..965071f72 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/PlayerTab$1.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/PlayerTab.class b/Server/build/classes/java/main/core/gui/tab/PlayerTab.class new file mode 100644 index 000000000..3953d838f Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/PlayerTab.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/StatisticsTab$1.class b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$1.class new file mode 100644 index 000000000..c1a647d43 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$1.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/StatisticsTab$2.class b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$2.class new file mode 100644 index 000000000..5f2c87b54 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$2.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/StatisticsTab$3.class b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$3.class new file mode 100644 index 000000000..4858bc3ae Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$3.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/StatisticsTab$4.class b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$4.class new file mode 100644 index 000000000..eb825aa7d Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$4.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/StatisticsTab$StatsTextPane.class b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$StatsTextPane.class new file mode 100644 index 000000000..c3cd1cd1a Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/StatisticsTab$StatsTextPane.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/StatisticsTab.class b/Server/build/classes/java/main/core/gui/tab/StatisticsTab.class new file mode 100644 index 000000000..d3c42835f Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/StatisticsTab.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/UtilityTab$1.class b/Server/build/classes/java/main/core/gui/tab/UtilityTab$1.class new file mode 100644 index 000000000..e6112db73 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/UtilityTab$1.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/UtilityTab$2.class b/Server/build/classes/java/main/core/gui/tab/UtilityTab$2.class new file mode 100644 index 000000000..a86c57a42 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/UtilityTab$2.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/UtilityTab$3.class b/Server/build/classes/java/main/core/gui/tab/UtilityTab$3.class new file mode 100644 index 000000000..5d706d10e Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/UtilityTab$3.class differ diff --git a/Server/build/classes/java/main/core/gui/tab/UtilityTab.class b/Server/build/classes/java/main/core/gui/tab/UtilityTab.class new file mode 100644 index 000000000..0603557f9 Binary files /dev/null and b/Server/build/classes/java/main/core/gui/tab/UtilityTab.class differ diff --git a/Server/build/classes/java/main/core/net/Constants.class b/Server/build/classes/java/main/core/net/Constants.class new file mode 100644 index 000000000..2705a9b11 Binary files /dev/null and b/Server/build/classes/java/main/core/net/Constants.class differ diff --git a/Server/build/classes/java/main/core/net/EventProducer.class b/Server/build/classes/java/main/core/net/EventProducer.class new file mode 100644 index 000000000..7378065dc Binary files /dev/null and b/Server/build/classes/java/main/core/net/EventProducer.class differ diff --git a/Server/build/classes/java/main/core/net/IoEventHandler.class b/Server/build/classes/java/main/core/net/IoEventHandler.class new file mode 100644 index 000000000..0f24fba14 Binary files /dev/null and b/Server/build/classes/java/main/core/net/IoEventHandler.class differ diff --git a/Server/build/classes/java/main/core/net/IoReadEvent.class b/Server/build/classes/java/main/core/net/IoReadEvent.class new file mode 100644 index 000000000..1ca46d23d Binary files /dev/null and b/Server/build/classes/java/main/core/net/IoReadEvent.class differ diff --git a/Server/build/classes/java/main/core/net/IoSession$1.class b/Server/build/classes/java/main/core/net/IoSession$1.class new file mode 100644 index 000000000..e12c533a4 Binary files /dev/null and b/Server/build/classes/java/main/core/net/IoSession$1.class differ diff --git a/Server/build/classes/java/main/core/net/IoSession.class b/Server/build/classes/java/main/core/net/IoSession.class new file mode 100644 index 000000000..8f80f94f2 Binary files /dev/null and b/Server/build/classes/java/main/core/net/IoSession.class differ diff --git a/Server/build/classes/java/main/core/net/IoWriteEvent.class b/Server/build/classes/java/main/core/net/IoWriteEvent.class new file mode 100644 index 000000000..f23533c42 Binary files /dev/null and b/Server/build/classes/java/main/core/net/IoWriteEvent.class differ diff --git a/Server/build/classes/java/main/core/net/JS5Queue$1.class b/Server/build/classes/java/main/core/net/JS5Queue$1.class new file mode 100644 index 000000000..a7ce20801 Binary files /dev/null and b/Server/build/classes/java/main/core/net/JS5Queue$1.class differ diff --git a/Server/build/classes/java/main/core/net/JS5Queue.class b/Server/build/classes/java/main/core/net/JS5Queue.class new file mode 100644 index 000000000..fd9c02132 Binary files /dev/null and b/Server/build/classes/java/main/core/net/JS5Queue.class differ diff --git a/Server/build/classes/java/main/core/net/NioReactor.class b/Server/build/classes/java/main/core/net/NioReactor.class new file mode 100644 index 000000000..e4a5d00f6 Binary files /dev/null and b/Server/build/classes/java/main/core/net/NioReactor.class differ diff --git a/Server/build/classes/java/main/core/net/ServerSocketConnection.class b/Server/build/classes/java/main/core/net/ServerSocketConnection.class new file mode 100644 index 000000000..331f12d1f Binary files /dev/null and b/Server/build/classes/java/main/core/net/ServerSocketConnection.class differ diff --git a/Server/build/classes/java/main/core/net/amsc/MSEventHandler.class b/Server/build/classes/java/main/core/net/amsc/MSEventHandler.class new file mode 100644 index 000000000..72bb1e30e Binary files /dev/null and b/Server/build/classes/java/main/core/net/amsc/MSEventHandler.class differ diff --git a/Server/build/classes/java/main/core/net/amsc/MSPacketRepository$1.class b/Server/build/classes/java/main/core/net/amsc/MSPacketRepository$1.class new file mode 100644 index 000000000..7fd5eec41 Binary files /dev/null and b/Server/build/classes/java/main/core/net/amsc/MSPacketRepository$1.class differ diff --git a/Server/build/classes/java/main/core/net/amsc/MSPacketRepository.class b/Server/build/classes/java/main/core/net/amsc/MSPacketRepository.class new file mode 100644 index 000000000..d331698c3 Binary files /dev/null and b/Server/build/classes/java/main/core/net/amsc/MSPacketRepository.class differ diff --git a/Server/build/classes/java/main/core/net/amsc/ManagementServerState.class b/Server/build/classes/java/main/core/net/amsc/ManagementServerState.class new file mode 100644 index 000000000..0c2dfbbeb Binary files /dev/null and b/Server/build/classes/java/main/core/net/amsc/ManagementServerState.class differ diff --git a/Server/build/classes/java/main/core/net/amsc/WorldCommunicator$1.class b/Server/build/classes/java/main/core/net/amsc/WorldCommunicator$1.class new file mode 100644 index 000000000..a5030102a Binary files /dev/null and b/Server/build/classes/java/main/core/net/amsc/WorldCommunicator$1.class differ diff --git a/Server/build/classes/java/main/core/net/amsc/WorldCommunicator.class b/Server/build/classes/java/main/core/net/amsc/WorldCommunicator.class new file mode 100644 index 000000000..688f3891f Binary files /dev/null and b/Server/build/classes/java/main/core/net/amsc/WorldCommunicator.class differ diff --git a/Server/build/classes/java/main/core/net/amsc/WorldStatistics.class b/Server/build/classes/java/main/core/net/amsc/WorldStatistics.class new file mode 100644 index 000000000..01b277a89 Binary files /dev/null and b/Server/build/classes/java/main/core/net/amsc/WorldStatistics.class differ diff --git a/Server/build/classes/java/main/core/net/event/GameReadEvent.class b/Server/build/classes/java/main/core/net/event/GameReadEvent.class new file mode 100644 index 000000000..436dc4133 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/GameReadEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/GameWriteEvent$1.class b/Server/build/classes/java/main/core/net/event/GameWriteEvent$1.class new file mode 100644 index 000000000..861992c9d Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/GameWriteEvent$1.class differ diff --git a/Server/build/classes/java/main/core/net/event/GameWriteEvent.class b/Server/build/classes/java/main/core/net/event/GameWriteEvent.class new file mode 100644 index 000000000..61e31c3d9 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/GameWriteEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/HSReadEvent.class b/Server/build/classes/java/main/core/net/event/HSReadEvent.class new file mode 100644 index 000000000..43e809f29 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/HSReadEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/HSWriteEvent.class b/Server/build/classes/java/main/core/net/event/HSWriteEvent.class new file mode 100644 index 000000000..a3387fd39 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/HSWriteEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/JS5ReadEvent.class b/Server/build/classes/java/main/core/net/event/JS5ReadEvent.class new file mode 100644 index 000000000..cd6e5d431 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/JS5ReadEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/JS5WriteEvent.class b/Server/build/classes/java/main/core/net/event/JS5WriteEvent.class new file mode 100644 index 000000000..829bf454b Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/JS5WriteEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/LoginWriteEvent.class b/Server/build/classes/java/main/core/net/event/LoginWriteEvent.class new file mode 100644 index 000000000..2337bd83f Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/LoginWriteEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/MSHSReadEvent.class b/Server/build/classes/java/main/core/net/event/MSHSReadEvent.class new file mode 100644 index 000000000..f536005e1 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/MSHSReadEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/MSHSWriteEvent.class b/Server/build/classes/java/main/core/net/event/MSHSWriteEvent.class new file mode 100644 index 000000000..9e7696952 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/MSHSWriteEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/MSReadEvent.class b/Server/build/classes/java/main/core/net/event/MSReadEvent.class new file mode 100644 index 000000000..7f2c3e717 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/MSReadEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/MSWriteEvent$1.class b/Server/build/classes/java/main/core/net/event/MSWriteEvent$1.class new file mode 100644 index 000000000..fb89c5f71 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/MSWriteEvent$1.class differ diff --git a/Server/build/classes/java/main/core/net/event/MSWriteEvent.class b/Server/build/classes/java/main/core/net/event/MSWriteEvent.class new file mode 100644 index 000000000..9072c6c08 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/MSWriteEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/RegistryReadEvent.class b/Server/build/classes/java/main/core/net/event/RegistryReadEvent.class new file mode 100644 index 000000000..f4d2677a1 Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/RegistryReadEvent.class differ diff --git a/Server/build/classes/java/main/core/net/event/RegistryWriteEvent.class b/Server/build/classes/java/main/core/net/event/RegistryWriteEvent.class new file mode 100644 index 000000000..b93cc4c7c Binary files /dev/null and b/Server/build/classes/java/main/core/net/event/RegistryWriteEvent.class differ diff --git a/Server/build/classes/java/main/core/net/lobby/WorldDefinition.class b/Server/build/classes/java/main/core/net/lobby/WorldDefinition.class new file mode 100644 index 000000000..612f77594 Binary files /dev/null and b/Server/build/classes/java/main/core/net/lobby/WorldDefinition.class differ diff --git a/Server/build/classes/java/main/core/net/lobby/WorldList.class b/Server/build/classes/java/main/core/net/lobby/WorldList.class new file mode 100644 index 000000000..e255db020 Binary files /dev/null and b/Server/build/classes/java/main/core/net/lobby/WorldList.class differ diff --git a/Server/build/classes/java/main/core/net/packet/Context.class b/Server/build/classes/java/main/core/net/packet/Context.class new file mode 100644 index 000000000..bf4546dfd Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/Context.class differ diff --git a/Server/build/classes/java/main/core/net/packet/IncomingPacket.class b/Server/build/classes/java/main/core/net/packet/IncomingPacket.class new file mode 100644 index 000000000..8d27344ad Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/IncomingPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/IoBuffer.class b/Server/build/classes/java/main/core/net/packet/IoBuffer.class new file mode 100644 index 000000000..f11a6418c Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/IoBuffer.class differ diff --git a/Server/build/classes/java/main/core/net/packet/OutgoingPacket.class b/Server/build/classes/java/main/core/net/packet/OutgoingPacket.class new file mode 100644 index 000000000..ffd1ac85b Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/OutgoingPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/PacketHeader.class b/Server/build/classes/java/main/core/net/packet/PacketHeader.class new file mode 100644 index 000000000..bdac44dca Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/PacketHeader.class differ diff --git a/Server/build/classes/java/main/core/net/packet/PacketRepository.class b/Server/build/classes/java/main/core/net/packet/PacketRepository.class new file mode 100644 index 000000000..43daaae16 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/PacketRepository.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/AccessMaskContext.class b/Server/build/classes/java/main/core/net/packet/context/AccessMaskContext.class new file mode 100644 index 000000000..4e51b1e00 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/AccessMaskContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/AnimateInterfaceContext.class b/Server/build/classes/java/main/core/net/packet/context/AnimateInterfaceContext.class new file mode 100644 index 000000000..6fcc2afc4 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/AnimateInterfaceContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/AnimateObjectContext.class b/Server/build/classes/java/main/core/net/packet/context/AnimateObjectContext.class new file mode 100644 index 000000000..d3fee0979 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/AnimateObjectContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/AreaPositionContext.class b/Server/build/classes/java/main/core/net/packet/context/AreaPositionContext.class new file mode 100644 index 000000000..91f6b2d0d Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/AreaPositionContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/BuildItemContext.class b/Server/build/classes/java/main/core/net/packet/context/BuildItemContext.class new file mode 100644 index 000000000..c15ab3ead Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/BuildItemContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/BuildObjectContext.class b/Server/build/classes/java/main/core/net/packet/context/BuildObjectContext.class new file mode 100644 index 000000000..bb3129186 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/BuildObjectContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/CSConfigContext.class b/Server/build/classes/java/main/core/net/packet/context/CSConfigContext.class new file mode 100644 index 000000000..264017379 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/CSConfigContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/CameraContext$CameraType.class b/Server/build/classes/java/main/core/net/packet/context/CameraContext$CameraType.class new file mode 100644 index 000000000..0786eaebd Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/CameraContext$CameraType.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/CameraContext.class b/Server/build/classes/java/main/core/net/packet/context/CameraContext.class new file mode 100644 index 000000000..193039ebe Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/CameraContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/ChildPositionContext.class b/Server/build/classes/java/main/core/net/packet/context/ChildPositionContext.class new file mode 100644 index 000000000..dcf39e7e3 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/ChildPositionContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/ClanContext.class b/Server/build/classes/java/main/core/net/packet/context/ClanContext.class new file mode 100644 index 000000000..b4312f098 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/ClanContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/ClearChunkContext.class b/Server/build/classes/java/main/core/net/packet/context/ClearChunkContext.class new file mode 100644 index 000000000..842769d1f Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/ClearChunkContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/ConfigContext.class b/Server/build/classes/java/main/core/net/packet/context/ConfigContext.class new file mode 100644 index 000000000..167c5d5e3 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/ConfigContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/ContactContext.class b/Server/build/classes/java/main/core/net/packet/context/ContactContext.class new file mode 100644 index 000000000..5f70d7a2e Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/ContactContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/ContainerContext.class b/Server/build/classes/java/main/core/net/packet/context/ContainerContext.class new file mode 100644 index 000000000..a96f4999d Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/ContainerContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/DefaultContext.class b/Server/build/classes/java/main/core/net/packet/context/DefaultContext.class new file mode 100644 index 000000000..a7c44415e Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/DefaultContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/DisplayModelContext$ModelType.class b/Server/build/classes/java/main/core/net/packet/context/DisplayModelContext$ModelType.class new file mode 100644 index 000000000..7ed0b44f5 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/DisplayModelContext$ModelType.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/DisplayModelContext.class b/Server/build/classes/java/main/core/net/packet/context/DisplayModelContext.class new file mode 100644 index 000000000..9105f2e3a Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/DisplayModelContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/DynamicSceneContext.class b/Server/build/classes/java/main/core/net/packet/context/DynamicSceneContext.class new file mode 100644 index 000000000..2f2057cd2 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/DynamicSceneContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/GameMessageContext.class b/Server/build/classes/java/main/core/net/packet/context/GameMessageContext.class new file mode 100644 index 000000000..ebb3d9c0a Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/GameMessageContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/GrandExchangeContext.class b/Server/build/classes/java/main/core/net/packet/context/GrandExchangeContext.class new file mode 100644 index 000000000..ff1c159ba Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/GrandExchangeContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/HintIconContext.class b/Server/build/classes/java/main/core/net/packet/context/HintIconContext.class new file mode 100644 index 000000000..146e24586 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/HintIconContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/IntegerContext.class b/Server/build/classes/java/main/core/net/packet/context/IntegerContext.class new file mode 100644 index 000000000..5cf062e6a Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/IntegerContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/InteractionOptionContext.class b/Server/build/classes/java/main/core/net/packet/context/InteractionOptionContext.class new file mode 100644 index 000000000..a9623693f Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/InteractionOptionContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/InterfaceConfigContext.class b/Server/build/classes/java/main/core/net/packet/context/InterfaceConfigContext.class new file mode 100644 index 000000000..90c232bce Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/InterfaceConfigContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/InterfaceContext.class b/Server/build/classes/java/main/core/net/packet/context/InterfaceContext.class new file mode 100644 index 000000000..cb3689976 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/InterfaceContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/LocationContext.class b/Server/build/classes/java/main/core/net/packet/context/LocationContext.class new file mode 100644 index 000000000..c6e992947 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/LocationContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/MessageContext.class b/Server/build/classes/java/main/core/net/packet/context/MessageContext.class new file mode 100644 index 000000000..1e42ba969 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/MessageContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/MinimapStateContext.class b/Server/build/classes/java/main/core/net/packet/context/MinimapStateContext.class new file mode 100644 index 000000000..7f951f2e8 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/MinimapStateContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/MusicContext.class b/Server/build/classes/java/main/core/net/packet/context/MusicContext.class new file mode 100644 index 000000000..ff085962d Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/MusicContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/PlayerContext.class b/Server/build/classes/java/main/core/net/packet/context/PlayerContext.class new file mode 100644 index 000000000..d0792068a Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/PlayerContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/PositionedGraphicContext.class b/Server/build/classes/java/main/core/net/packet/context/PositionedGraphicContext.class new file mode 100644 index 000000000..ea33ef268 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/PositionedGraphicContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/RunScriptContext.class b/Server/build/classes/java/main/core/net/packet/context/RunScriptContext.class new file mode 100644 index 000000000..b203cffd6 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/RunScriptContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/SceneGraphContext.class b/Server/build/classes/java/main/core/net/packet/context/SceneGraphContext.class new file mode 100644 index 000000000..39f0fb364 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/SceneGraphContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/SkillContext.class b/Server/build/classes/java/main/core/net/packet/context/SkillContext.class new file mode 100644 index 000000000..3d7584617 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/SkillContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/StringContext.class b/Server/build/classes/java/main/core/net/packet/context/StringContext.class new file mode 100644 index 000000000..9ab380d18 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/StringContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/SystemUpdateContext.class b/Server/build/classes/java/main/core/net/packet/context/SystemUpdateContext.class new file mode 100644 index 000000000..4baf7133a Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/SystemUpdateContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/WalkOptionContext.class b/Server/build/classes/java/main/core/net/packet/context/WalkOptionContext.class new file mode 100644 index 000000000..5aa1869cf Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/WalkOptionContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/context/WindowsPaneContext.class b/Server/build/classes/java/main/core/net/packet/context/WindowsPaneContext.class new file mode 100644 index 000000000..c7fe213bb Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/context/WindowsPaneContext.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ActionButtonPacket$1.class b/Server/build/classes/java/main/core/net/packet/in/ActionButtonPacket$1.class new file mode 100644 index 000000000..58952d7c1 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ActionButtonPacket$1.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ActionButtonPacket.class b/Server/build/classes/java/main/core/net/packet/in/ActionButtonPacket.class new file mode 100644 index 000000000..432745f47 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ActionButtonPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/CameraMovementPacket.class b/Server/build/classes/java/main/core/net/packet/in/CameraMovementPacket.class new file mode 100644 index 000000000..77018e436 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/CameraMovementPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ChatPacket$1.class b/Server/build/classes/java/main/core/net/packet/in/ChatPacket$1.class new file mode 100644 index 000000000..de9c62609 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ChatPacket$1.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ChatPacket.class b/Server/build/classes/java/main/core/net/packet/in/ChatPacket.class new file mode 100644 index 000000000..df2162a97 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ChatPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ChatSettingsPacket.class b/Server/build/classes/java/main/core/net/packet/in/ChatSettingsPacket.class new file mode 100644 index 000000000..b053633a7 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ChatSettingsPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ClanPacketHandler.class b/Server/build/classes/java/main/core/net/packet/in/ClanPacketHandler.class new file mode 100644 index 000000000..1c6832d27 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ClanPacketHandler.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ClientFocusPacket.class b/Server/build/classes/java/main/core/net/packet/in/ClientFocusPacket.class new file mode 100644 index 000000000..bea880f8a Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ClientFocusPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/CommandPacket.class b/Server/build/classes/java/main/core/net/packet/in/CommandPacket.class new file mode 100644 index 000000000..02f2c0e66 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/CommandPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/CommunicationPacket.class b/Server/build/classes/java/main/core/net/packet/in/CommunicationPacket.class new file mode 100644 index 000000000..abacb7d1f Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/CommunicationPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/DisplayUpdatePacket.class b/Server/build/classes/java/main/core/net/packet/in/DisplayUpdatePacket.class new file mode 100644 index 000000000..6c635f762 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/DisplayUpdatePacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/DummyPacket.class b/Server/build/classes/java/main/core/net/packet/in/DummyPacket.class new file mode 100644 index 000000000..f2088302d Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/DummyPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ExaminePacket.class b/Server/build/classes/java/main/core/net/packet/in/ExaminePacket.class new file mode 100644 index 000000000..ce5fe1caf Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ExaminePacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/GrandExchangePacket.class b/Server/build/classes/java/main/core/net/packet/in/GrandExchangePacket.class new file mode 100644 index 000000000..fdc150483 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/GrandExchangePacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/IdlePacketHandler.class b/Server/build/classes/java/main/core/net/packet/in/IdlePacketHandler.class new file mode 100644 index 000000000..a1798b589 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/IdlePacketHandler.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/InteractionPacket$1.class b/Server/build/classes/java/main/core/net/packet/in/InteractionPacket$1.class new file mode 100644 index 000000000..513e6826f Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/InteractionPacket$1.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/InteractionPacket.class b/Server/build/classes/java/main/core/net/packet/in/InteractionPacket.class new file mode 100644 index 000000000..8b52549a4 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/InteractionPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/InterfaceUseOnPacket$1.class b/Server/build/classes/java/main/core/net/packet/in/InterfaceUseOnPacket$1.class new file mode 100644 index 000000000..74fb14d8e Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/InterfaceUseOnPacket$1.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/InterfaceUseOnPacket.class b/Server/build/classes/java/main/core/net/packet/in/InterfaceUseOnPacket.class new file mode 100644 index 000000000..3140266b7 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/InterfaceUseOnPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ItemActionPacket$1.class b/Server/build/classes/java/main/core/net/packet/in/ItemActionPacket$1.class new file mode 100644 index 000000000..9584287aa Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ItemActionPacket$1.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ItemActionPacket$2.class b/Server/build/classes/java/main/core/net/packet/in/ItemActionPacket$2.class new file mode 100644 index 000000000..700798ea3 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ItemActionPacket$2.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ItemActionPacket.class b/Server/build/classes/java/main/core/net/packet/in/ItemActionPacket.class new file mode 100644 index 000000000..d5905beca Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ItemActionPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/MapClosedPacket.class b/Server/build/classes/java/main/core/net/packet/in/MapClosedPacket.class new file mode 100644 index 000000000..92915f38e Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/MapClosedPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/MouseClickPacket.class b/Server/build/classes/java/main/core/net/packet/in/MouseClickPacket.class new file mode 100644 index 000000000..3d2ee9599 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/MouseClickPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/MusicPacketHandler.class b/Server/build/classes/java/main/core/net/packet/in/MusicPacketHandler.class new file mode 100644 index 000000000..546490105 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/MusicPacketHandler.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/PingPacketHandler.class b/Server/build/classes/java/main/core/net/packet/in/PingPacketHandler.class new file mode 100644 index 000000000..5cc02248c Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/PingPacketHandler.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/RegionChangePacket.class b/Server/build/classes/java/main/core/net/packet/in/RegionChangePacket.class new file mode 100644 index 000000000..215fbf2c0 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/RegionChangePacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/ReportAbusePacket.class b/Server/build/classes/java/main/core/net/packet/in/ReportAbusePacket.class new file mode 100644 index 000000000..80dfb5764 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/ReportAbusePacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/RunScriptPacketHandler.class b/Server/build/classes/java/main/core/net/packet/in/RunScriptPacketHandler.class new file mode 100644 index 000000000..be5e04453 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/RunScriptPacketHandler.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/SlotSwitchPacket.class b/Server/build/classes/java/main/core/net/packet/in/SlotSwitchPacket.class new file mode 100644 index 000000000..5208d208d Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/SlotSwitchPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/UpdateInterfaceCounter.class b/Server/build/classes/java/main/core/net/packet/in/UpdateInterfaceCounter.class new file mode 100644 index 000000000..d5daf6385 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/UpdateInterfaceCounter.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/WalkPacket$1.class b/Server/build/classes/java/main/core/net/packet/in/WalkPacket$1.class new file mode 100644 index 000000000..494881960 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/WalkPacket$1.class differ diff --git a/Server/build/classes/java/main/core/net/packet/in/WalkPacket.class b/Server/build/classes/java/main/core/net/packet/in/WalkPacket.class new file mode 100644 index 000000000..8256ba7d4 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/in/WalkPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/AccessMask.class b/Server/build/classes/java/main/core/net/packet/out/AccessMask.class new file mode 100644 index 000000000..b32c79303 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/AccessMask.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/AnimateInterface.class b/Server/build/classes/java/main/core/net/packet/out/AnimateInterface.class new file mode 100644 index 000000000..d42ab1ac5 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/AnimateInterface.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/AnimateObjectPacket.class b/Server/build/classes/java/main/core/net/packet/out/AnimateObjectPacket.class new file mode 100644 index 000000000..f02640052 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/AnimateObjectPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/AudioPacket.class b/Server/build/classes/java/main/core/net/packet/out/AudioPacket.class new file mode 100644 index 000000000..fba26655d Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/AudioPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/BuildDynamicScene.class b/Server/build/classes/java/main/core/net/packet/out/BuildDynamicScene.class new file mode 100644 index 000000000..18ae3e2e2 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/BuildDynamicScene.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/CSConfigPacket.class b/Server/build/classes/java/main/core/net/packet/out/CSConfigPacket.class new file mode 100644 index 000000000..fdf21d968 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/CSConfigPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/CameraViewPacket$1.class b/Server/build/classes/java/main/core/net/packet/out/CameraViewPacket$1.class new file mode 100644 index 000000000..215935b25 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/CameraViewPacket$1.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/CameraViewPacket.class b/Server/build/classes/java/main/core/net/packet/out/CameraViewPacket.class new file mode 100644 index 000000000..9b136fd1b Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/CameraViewPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/ClearGroundItem.class b/Server/build/classes/java/main/core/net/packet/out/ClearGroundItem.class new file mode 100644 index 000000000..13ed8b3db Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/ClearGroundItem.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/ClearMinimapFlag.class b/Server/build/classes/java/main/core/net/packet/out/ClearMinimapFlag.class new file mode 100644 index 000000000..63e00aecc Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/ClearMinimapFlag.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/ClearObject.class b/Server/build/classes/java/main/core/net/packet/out/ClearObject.class new file mode 100644 index 000000000..7c4996e20 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/ClearObject.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/ClearRegionChunk.class b/Server/build/classes/java/main/core/net/packet/out/ClearRegionChunk.class new file mode 100644 index 000000000..e8f70e452 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/ClearRegionChunk.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/CloseInterface.class b/Server/build/classes/java/main/core/net/packet/out/CloseInterface.class new file mode 100644 index 000000000..ae883cadd Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/CloseInterface.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/CommunicationMessage.class b/Server/build/classes/java/main/core/net/packet/out/CommunicationMessage.class new file mode 100644 index 000000000..e090b3e6a Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/CommunicationMessage.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/Config.class b/Server/build/classes/java/main/core/net/packet/out/Config.class new file mode 100644 index 000000000..c796648c3 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/Config.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/ConstructGroundItem.class b/Server/build/classes/java/main/core/net/packet/out/ConstructGroundItem.class new file mode 100644 index 000000000..3047fb2ab Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/ConstructGroundItem.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/ConstructObject.class b/Server/build/classes/java/main/core/net/packet/out/ConstructObject.class new file mode 100644 index 000000000..bd6909010 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/ConstructObject.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/ContactPackets.class b/Server/build/classes/java/main/core/net/packet/out/ContactPackets.class new file mode 100644 index 000000000..7853fcf17 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/ContactPackets.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/ContainerPacket.class b/Server/build/classes/java/main/core/net/packet/out/ContainerPacket.class new file mode 100644 index 000000000..4dc56b2fc Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/ContainerPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/DisplayModel$1.class b/Server/build/classes/java/main/core/net/packet/out/DisplayModel$1.class new file mode 100644 index 000000000..e7efc7765 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/DisplayModel$1.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/DisplayModel.class b/Server/build/classes/java/main/core/net/packet/out/DisplayModel.class new file mode 100644 index 000000000..9b7b2ec5e Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/DisplayModel.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/GameMessage.class b/Server/build/classes/java/main/core/net/packet/out/GameMessage.class new file mode 100644 index 000000000..552fec301 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/GameMessage.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/GrandExchangePacket.class b/Server/build/classes/java/main/core/net/packet/out/GrandExchangePacket.class new file mode 100644 index 000000000..566387c8d Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/GrandExchangePacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/HintIcon.class b/Server/build/classes/java/main/core/net/packet/out/HintIcon.class new file mode 100644 index 000000000..e26a8d7a5 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/HintIcon.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/InstancedLocationUpdate.class b/Server/build/classes/java/main/core/net/packet/out/InstancedLocationUpdate.class new file mode 100644 index 000000000..6a5bcc224 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/InstancedLocationUpdate.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/InteractionOption.class b/Server/build/classes/java/main/core/net/packet/out/InteractionOption.class new file mode 100644 index 000000000..1601b12cb Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/InteractionOption.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/Interface.class b/Server/build/classes/java/main/core/net/packet/out/Interface.class new file mode 100644 index 000000000..9a3fc989a Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/Interface.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/InterfaceConfig.class b/Server/build/classes/java/main/core/net/packet/out/InterfaceConfig.class new file mode 100644 index 000000000..37dbedc16 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/InterfaceConfig.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/LoginPacket.class b/Server/build/classes/java/main/core/net/packet/out/LoginPacket.class new file mode 100644 index 000000000..c393675f3 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/LoginPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/Logout.class b/Server/build/classes/java/main/core/net/packet/out/Logout.class new file mode 100644 index 000000000..4a229d8f9 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/Logout.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/MinimapState.class b/Server/build/classes/java/main/core/net/packet/out/MinimapState.class new file mode 100644 index 000000000..0658cbb51 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/MinimapState.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/MusicPacket.class b/Server/build/classes/java/main/core/net/packet/out/MusicPacket.class new file mode 100644 index 000000000..f4c3d8feb Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/MusicPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/PingPacket.class b/Server/build/classes/java/main/core/net/packet/out/PingPacket.class new file mode 100644 index 000000000..fed2db452 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/PingPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/PositionedGraphic.class b/Server/build/classes/java/main/core/net/packet/out/PositionedGraphic.class new file mode 100644 index 000000000..eff569f1c Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/PositionedGraphic.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/RepositionChild.class b/Server/build/classes/java/main/core/net/packet/out/RepositionChild.class new file mode 100644 index 000000000..d5f8e88b8 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/RepositionChild.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/RunEnergy.class b/Server/build/classes/java/main/core/net/packet/out/RunEnergy.class new file mode 100644 index 000000000..123febaac Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/RunEnergy.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/RunScriptPacket.class b/Server/build/classes/java/main/core/net/packet/out/RunScriptPacket.class new file mode 100644 index 000000000..b85e9e6fa Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/RunScriptPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/SetWalkOption.class b/Server/build/classes/java/main/core/net/packet/out/SetWalkOption.class new file mode 100644 index 000000000..a505fae19 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/SetWalkOption.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/SkillLevel.class b/Server/build/classes/java/main/core/net/packet/out/SkillLevel.class new file mode 100644 index 000000000..1cc3d6630 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/SkillLevel.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/StringPacket.class b/Server/build/classes/java/main/core/net/packet/out/StringPacket.class new file mode 100644 index 000000000..6bac6d534 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/StringPacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/SystemUpdatePacket.class b/Server/build/classes/java/main/core/net/packet/out/SystemUpdatePacket.class new file mode 100644 index 000000000..c3517e6b9 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/SystemUpdatePacket.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/UpdateAreaPosition.class b/Server/build/classes/java/main/core/net/packet/out/UpdateAreaPosition.class new file mode 100644 index 000000000..1448d3a4b Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/UpdateAreaPosition.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/UpdateClanChat.class b/Server/build/classes/java/main/core/net/packet/out/UpdateClanChat.class new file mode 100644 index 000000000..65e3233c8 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/UpdateClanChat.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/UpdateGroundItemAmount.class b/Server/build/classes/java/main/core/net/packet/out/UpdateGroundItemAmount.class new file mode 100644 index 000000000..15bd64f46 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/UpdateGroundItemAmount.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/UpdateRandomFile.class b/Server/build/classes/java/main/core/net/packet/out/UpdateRandomFile.class new file mode 100644 index 000000000..e8bf4d4b0 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/UpdateRandomFile.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/UpdateSceneGraph.class b/Server/build/classes/java/main/core/net/packet/out/UpdateSceneGraph.class new file mode 100644 index 000000000..a8e02f87e Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/UpdateSceneGraph.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/WeightUpdate.class b/Server/build/classes/java/main/core/net/packet/out/WeightUpdate.class new file mode 100644 index 000000000..37521c5fe Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/WeightUpdate.class differ diff --git a/Server/build/classes/java/main/core/net/packet/out/WindowsPane.class b/Server/build/classes/java/main/core/net/packet/out/WindowsPane.class new file mode 100644 index 000000000..094829108 Binary files /dev/null and b/Server/build/classes/java/main/core/net/packet/out/WindowsPane.class differ diff --git a/Server/build/classes/java/main/core/net/producer/GameEventProducer.class b/Server/build/classes/java/main/core/net/producer/GameEventProducer.class new file mode 100644 index 000000000..7c83d4b93 Binary files /dev/null and b/Server/build/classes/java/main/core/net/producer/GameEventProducer.class differ diff --git a/Server/build/classes/java/main/core/net/producer/HSEventProducer.class b/Server/build/classes/java/main/core/net/producer/HSEventProducer.class new file mode 100644 index 000000000..527bb6b3a Binary files /dev/null and b/Server/build/classes/java/main/core/net/producer/HSEventProducer.class differ diff --git a/Server/build/classes/java/main/core/net/producer/JS5EventProducer.class b/Server/build/classes/java/main/core/net/producer/JS5EventProducer.class new file mode 100644 index 000000000..38462c525 Binary files /dev/null and b/Server/build/classes/java/main/core/net/producer/JS5EventProducer.class differ diff --git a/Server/build/classes/java/main/core/net/producer/LoginEventProducer.class b/Server/build/classes/java/main/core/net/producer/LoginEventProducer.class new file mode 100644 index 000000000..662898d37 Binary files /dev/null and b/Server/build/classes/java/main/core/net/producer/LoginEventProducer.class differ diff --git a/Server/build/classes/java/main/core/net/producer/MSEventProducer.class b/Server/build/classes/java/main/core/net/producer/MSEventProducer.class new file mode 100644 index 000000000..78edb1433 Binary files /dev/null and b/Server/build/classes/java/main/core/net/producer/MSEventProducer.class differ diff --git a/Server/build/classes/java/main/core/net/producer/MSHSEventProducer.class b/Server/build/classes/java/main/core/net/producer/MSHSEventProducer.class new file mode 100644 index 000000000..9f9384384 Binary files /dev/null and b/Server/build/classes/java/main/core/net/producer/MSHSEventProducer.class differ diff --git a/Server/build/classes/java/main/core/net/producer/RegistryEventProducer.class b/Server/build/classes/java/main/core/net/producer/RegistryEventProducer.class new file mode 100644 index 000000000..993d4071c Binary files /dev/null and b/Server/build/classes/java/main/core/net/producer/RegistryEventProducer.class differ diff --git a/Server/build/classes/java/main/core/net/registry/AccountRegister$1.class b/Server/build/classes/java/main/core/net/registry/AccountRegister$1.class new file mode 100644 index 000000000..f9d458cfe Binary files /dev/null and b/Server/build/classes/java/main/core/net/registry/AccountRegister$1.class differ diff --git a/Server/build/classes/java/main/core/net/registry/AccountRegister$2.class b/Server/build/classes/java/main/core/net/registry/AccountRegister$2.class new file mode 100644 index 000000000..79b6ef50d Binary files /dev/null and b/Server/build/classes/java/main/core/net/registry/AccountRegister$2.class differ diff --git a/Server/build/classes/java/main/core/net/registry/AccountRegister.class b/Server/build/classes/java/main/core/net/registry/AccountRegister.class new file mode 100644 index 000000000..6bf0a68c7 Binary files /dev/null and b/Server/build/classes/java/main/core/net/registry/AccountRegister.class differ diff --git a/Server/build/classes/java/main/core/net/registry/RegistryDetails.class b/Server/build/classes/java/main/core/net/registry/RegistryDetails.class new file mode 100644 index 000000000..1c8690c52 Binary files /dev/null and b/Server/build/classes/java/main/core/net/registry/RegistryDetails.class differ diff --git a/Server/build/classes/java/main/core/net/registry/RegistryResponse.class b/Server/build/classes/java/main/core/net/registry/RegistryResponse.class new file mode 100644 index 000000000..91235bd63 Binary files /dev/null and b/Server/build/classes/java/main/core/net/registry/RegistryResponse.class differ diff --git a/Server/build/classes/java/main/core/plugin/CorePluginTypes/ManagerPlugin.class b/Server/build/classes/java/main/core/plugin/CorePluginTypes/ManagerPlugin.class new file mode 100644 index 000000000..c85303b1d Binary files /dev/null and b/Server/build/classes/java/main/core/plugin/CorePluginTypes/ManagerPlugin.class differ diff --git a/Server/build/classes/java/main/core/plugin/CorePluginTypes/Managers.class b/Server/build/classes/java/main/core/plugin/CorePluginTypes/Managers.class new file mode 100644 index 000000000..2df8543f5 Binary files /dev/null and b/Server/build/classes/java/main/core/plugin/CorePluginTypes/Managers.class differ diff --git a/Server/build/classes/java/main/core/plugin/CorePluginTypes/StartupPlugin.class b/Server/build/classes/java/main/core/plugin/CorePluginTypes/StartupPlugin.class new file mode 100644 index 000000000..7ac630b73 Binary files /dev/null and b/Server/build/classes/java/main/core/plugin/CorePluginTypes/StartupPlugin.class differ diff --git a/Server/build/classes/java/main/core/plugin/Initializable.class b/Server/build/classes/java/main/core/plugin/Initializable.class new file mode 100644 index 000000000..1e5cb661b Binary files /dev/null and b/Server/build/classes/java/main/core/plugin/Initializable.class differ diff --git a/Server/build/classes/java/main/core/plugin/Plugin.class b/Server/build/classes/java/main/core/plugin/Plugin.class new file mode 100644 index 000000000..977e241c0 Binary files /dev/null and b/Server/build/classes/java/main/core/plugin/Plugin.class differ diff --git a/Server/build/classes/java/main/core/plugin/PluginManifest.class b/Server/build/classes/java/main/core/plugin/PluginManifest.class new file mode 100644 index 000000000..348d8345b Binary files /dev/null and b/Server/build/classes/java/main/core/plugin/PluginManifest.class differ diff --git a/Server/build/classes/java/main/core/plugin/PluginType.class b/Server/build/classes/java/main/core/plugin/PluginType.class new file mode 100644 index 000000000..bbeefa17a Binary files /dev/null and b/Server/build/classes/java/main/core/plugin/PluginType.class differ diff --git a/Server/build/classes/java/main/core/tools/PlayerLoader.class b/Server/build/classes/java/main/core/tools/PlayerLoader.class new file mode 100644 index 000000000..f524ac567 Binary files /dev/null and b/Server/build/classes/java/main/core/tools/PlayerLoader.class differ diff --git a/Server/build/classes/java/main/core/tools/RSAKeyGen.class b/Server/build/classes/java/main/core/tools/RSAKeyGen.class new file mode 100644 index 000000000..f77c7a5d2 Binary files /dev/null and b/Server/build/classes/java/main/core/tools/RSAKeyGen.class differ diff --git a/Server/build/classes/java/main/core/tools/RandomFunction.class b/Server/build/classes/java/main/core/tools/RandomFunction.class new file mode 100644 index 000000000..7eedb53d4 Binary files /dev/null and b/Server/build/classes/java/main/core/tools/RandomFunction.class differ diff --git a/Server/build/classes/java/main/core/tools/StringUtils.class b/Server/build/classes/java/main/core/tools/StringUtils.class new file mode 100644 index 000000000..911eccf01 Binary files /dev/null and b/Server/build/classes/java/main/core/tools/StringUtils.class differ diff --git a/Server/build/classes/java/main/core/tools/TimeStamp.class b/Server/build/classes/java/main/core/tools/TimeStamp.class new file mode 100644 index 000000000..4dff6f132 Binary files /dev/null and b/Server/build/classes/java/main/core/tools/TimeStamp.class differ diff --git a/Server/build/classes/java/main/core/tools/Vector3d.class b/Server/build/classes/java/main/core/tools/Vector3d.class new file mode 100644 index 000000000..dec5efe84 Binary files /dev/null and b/Server/build/classes/java/main/core/tools/Vector3d.class differ diff --git a/Server/build/classes/java/main/core/tools/mysql/Database.class b/Server/build/classes/java/main/core/tools/mysql/Database.class new file mode 100644 index 000000000..927968f14 Binary files /dev/null and b/Server/build/classes/java/main/core/tools/mysql/Database.class differ diff --git a/Server/build/classes/java/main/core/tools/mysql/DatabaseManager.class b/Server/build/classes/java/main/core/tools/mysql/DatabaseManager.class new file mode 100644 index 000000000..d2d4c8d88 Binary files /dev/null and b/Server/build/classes/java/main/core/tools/mysql/DatabaseManager.class differ diff --git a/Server/build/classes/java/main/core/tools/mysql/Query.class b/Server/build/classes/java/main/core/tools/mysql/Query.class new file mode 100644 index 000000000..ebb2fbaca Binary files /dev/null and b/Server/build/classes/java/main/core/tools/mysql/Query.class differ diff --git a/Server/build/classes/java/main/core/tools/mysql/Results.class b/Server/build/classes/java/main/core/tools/mysql/Results.class new file mode 100644 index 000000000..8c8cd0ba3 Binary files /dev/null and b/Server/build/classes/java/main/core/tools/mysql/Results.class differ diff --git a/Server/build/classes/java/main/plugin/ai/AIPBuilder.class b/Server/build/classes/java/main/plugin/ai/AIPBuilder.class new file mode 100644 index 000000000..238e0a4d1 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/AIPBuilder.class differ diff --git a/Server/build/classes/java/main/plugin/ai/AIPControlDialogue.class b/Server/build/classes/java/main/plugin/ai/AIPControlDialogue.class new file mode 100644 index 000000000..1553e50d2 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/AIPControlDialogue.class differ diff --git a/Server/build/classes/java/main/plugin/ai/AIPlayer$1.class b/Server/build/classes/java/main/plugin/ai/AIPlayer$1.class new file mode 100644 index 000000000..7b6d47747 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/AIPlayer$1.class differ diff --git a/Server/build/classes/java/main/plugin/ai/AIPlayer$2.class b/Server/build/classes/java/main/plugin/ai/AIPlayer$2.class new file mode 100644 index 000000000..fe869f9d0 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/AIPlayer$2.class differ diff --git a/Server/build/classes/java/main/plugin/ai/AIPlayer.class b/Server/build/classes/java/main/plugin/ai/AIPlayer.class new file mode 100644 index 000000000..0409131a9 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/AIPlayer.class differ diff --git a/Server/build/classes/java/main/plugin/ai/ArtificialSession.class b/Server/build/classes/java/main/plugin/ai/ArtificialSession.class new file mode 100644 index 000000000..aa110dbaa Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/ArtificialSession.class differ diff --git a/Server/build/classes/java/main/plugin/ai/general/scriptrepository/Script.class b/Server/build/classes/java/main/plugin/ai/general/scriptrepository/Script.class new file mode 100644 index 000000000..5396a7cc8 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/general/scriptrepository/Script.class differ diff --git a/Server/build/classes/java/main/plugin/ai/lumbridge/DeadIdler.class b/Server/build/classes/java/main/plugin/ai/lumbridge/DeadIdler.class new file mode 100644 index 000000000..36efcffa5 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/lumbridge/DeadIdler.class differ diff --git a/Server/build/classes/java/main/plugin/ai/lumbridge/LumbridgeBotHandler.class b/Server/build/classes/java/main/plugin/ai/lumbridge/LumbridgeBotHandler.class new file mode 100644 index 000000000..0cc1d4892 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/lumbridge/LumbridgeBotHandler.class differ diff --git a/Server/build/classes/java/main/plugin/ai/pvmbots/DragonKiller.class b/Server/build/classes/java/main/plugin/ai/pvmbots/DragonKiller.class new file mode 100644 index 000000000..21725d84b Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/pvmbots/DragonKiller.class differ diff --git a/Server/build/classes/java/main/plugin/ai/pvmbots/GiantMoleBot.class b/Server/build/classes/java/main/plugin/ai/pvmbots/GiantMoleBot.class new file mode 100644 index 000000000..84ba1f78a Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/pvmbots/GiantMoleBot.class differ diff --git a/Server/build/classes/java/main/plugin/ai/pvmbots/LowestBot.class b/Server/build/classes/java/main/plugin/ai/pvmbots/LowestBot.class new file mode 100644 index 000000000..9edbac55e Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/pvmbots/LowestBot.class differ diff --git a/Server/build/classes/java/main/plugin/ai/pvmbots/NoobBot.class b/Server/build/classes/java/main/plugin/ai/pvmbots/NoobBot.class new file mode 100644 index 000000000..42641bc63 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/pvmbots/NoobBot.class differ diff --git a/Server/build/classes/java/main/plugin/ai/pvmbots/PvMBots.class b/Server/build/classes/java/main/plugin/ai/pvmbots/PvMBots.class new file mode 100644 index 000000000..d3263bb41 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/pvmbots/PvMBots.class differ diff --git a/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPActions$1.class b/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPActions$1.class new file mode 100644 index 000000000..d08a5111e Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPActions$1.class differ diff --git a/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPActions$2.class b/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPActions$2.class new file mode 100644 index 000000000..2dddd2787 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPActions$2.class differ diff --git a/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPActions.class b/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPActions.class new file mode 100644 index 000000000..8950905d1 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPActions.class differ diff --git a/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPBuilderUtils.class b/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPBuilderUtils.class new file mode 100644 index 000000000..d30af3c10 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/pvp/PVPAIPBuilderUtils.class differ diff --git a/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPActions$1.class b/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPActions$1.class new file mode 100644 index 000000000..3ad5b5695 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPActions$1.class differ diff --git a/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPActions.class b/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPActions.class new file mode 100644 index 000000000..ef772ba17 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPActions.class differ diff --git a/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPManager$1.class b/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPManager$1.class new file mode 100644 index 000000000..8e3299724 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPManager$1.class differ diff --git a/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPManager.class b/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPManager.class new file mode 100644 index 000000000..e1ce5d232 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/resource/ResourceAIPManager.class differ diff --git a/Server/build/classes/java/main/plugin/ai/resource/task/ResourceTask.class b/Server/build/classes/java/main/plugin/ai/resource/task/ResourceTask.class new file mode 100644 index 000000000..2501a0a38 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/resource/task/ResourceTask.class differ diff --git a/Server/build/classes/java/main/plugin/ai/resource/task/ResourceTasks$1.class b/Server/build/classes/java/main/plugin/ai/resource/task/ResourceTasks$1.class new file mode 100644 index 000000000..3cd422b22 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/resource/task/ResourceTasks$1.class differ diff --git a/Server/build/classes/java/main/plugin/ai/resource/task/ResourceTasks.class b/Server/build/classes/java/main/plugin/ai/resource/task/ResourceTasks.class new file mode 100644 index 000000000..46d94f37c Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/resource/task/ResourceTasks.class differ diff --git a/Server/build/classes/java/main/plugin/ai/skillingbot/SkillingBot.class b/Server/build/classes/java/main/plugin/ai/skillingbot/SkillingBot.class new file mode 100644 index 000000000..37ec393e9 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/skillingbot/SkillingBot.class differ diff --git a/Server/build/classes/java/main/plugin/ai/skillingbot/SkillingBotsBuilder.class b/Server/build/classes/java/main/plugin/ai/skillingbot/SkillingBotsBuilder.class new file mode 100644 index 000000000..66300e8be Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/skillingbot/SkillingBotsBuilder.class differ diff --git a/Server/build/classes/java/main/plugin/ai/system/GlobalAIManager.class b/Server/build/classes/java/main/plugin/ai/system/GlobalAIManager.class new file mode 100644 index 000000000..c837f037a Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/system/GlobalAIManager.class differ diff --git a/Server/build/classes/java/main/plugin/ai/system/android/CombatDroid.class b/Server/build/classes/java/main/plugin/ai/system/android/CombatDroid.class new file mode 100644 index 000000000..ddc31d3a9 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/system/android/CombatDroid.class differ diff --git a/Server/build/classes/java/main/plugin/ai/system/android/GatheringDroid.class b/Server/build/classes/java/main/plugin/ai/system/android/GatheringDroid.class new file mode 100644 index 000000000..e9b30f438 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/system/android/GatheringDroid.class differ diff --git a/Server/build/classes/java/main/plugin/ai/system/predicate/Predicate$1.class b/Server/build/classes/java/main/plugin/ai/system/predicate/Predicate$1.class new file mode 100644 index 000000000..b1d9f9219 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/system/predicate/Predicate$1.class differ diff --git a/Server/build/classes/java/main/plugin/ai/system/predicate/Predicate.class b/Server/build/classes/java/main/plugin/ai/system/predicate/Predicate.class new file mode 100644 index 000000000..8a3a20b22 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/system/predicate/Predicate.class differ diff --git a/Server/build/classes/java/main/plugin/ai/system/predicate/PredicateType.class b/Server/build/classes/java/main/plugin/ai/system/predicate/PredicateType.class new file mode 100644 index 000000000..84886c251 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/system/predicate/PredicateType.class differ diff --git a/Server/build/classes/java/main/plugin/ai/system/predicate/impl/AppearancePredicate.class b/Server/build/classes/java/main/plugin/ai/system/predicate/impl/AppearancePredicate.class new file mode 100644 index 000000000..b5c203c16 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/system/predicate/impl/AppearancePredicate.class differ diff --git a/Server/build/classes/java/main/plugin/ai/wilderness/PvPBotsBuilder.class b/Server/build/classes/java/main/plugin/ai/wilderness/PvPBotsBuilder.class new file mode 100644 index 000000000..77a99c73d Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/wilderness/PvPBotsBuilder.class differ diff --git a/Server/build/classes/java/main/plugin/ai/wilderness/WildernessBot.class b/Server/build/classes/java/main/plugin/ai/wilderness/WildernessBot.class new file mode 100644 index 000000000..0f290d467 Binary files /dev/null and b/Server/build/classes/java/main/plugin/ai/wilderness/WildernessBot.class differ diff --git a/Server/build/classes/java/main/plugin/drops/DropPlugin.class b/Server/build/classes/java/main/plugin/drops/DropPlugin.class new file mode 100644 index 000000000..9915cf095 Binary files /dev/null and b/Server/build/classes/java/main/plugin/drops/DropPlugin.class differ diff --git a/Server/build/classes/java/main/plugin/drops/DropPlugins.class b/Server/build/classes/java/main/plugin/drops/DropPlugins.class new file mode 100644 index 000000000..9643cdf86 Binary files /dev/null and b/Server/build/classes/java/main/plugin/drops/DropPlugins.class differ diff --git a/Server/build/classes/java/main/plugin/drops/mystery_box/MysteryBoxDropper.class b/Server/build/classes/java/main/plugin/drops/mystery_box/MysteryBoxDropper.class new file mode 100644 index 000000000..e5974f6a6 Binary files /dev/null and b/Server/build/classes/java/main/plugin/drops/mystery_box/MysteryBoxDropper.class differ diff --git a/Server/build/classes/java/main/plugin/drops/mystery_box/MysteryBoxPlugin.class b/Server/build/classes/java/main/plugin/drops/mystery_box/MysteryBoxPlugin.class new file mode 100644 index 000000000..7c40ddee9 Binary files /dev/null and b/Server/build/classes/java/main/plugin/drops/mystery_box/MysteryBoxPlugin.class differ diff --git a/Server/build/classes/kotlin/main/GatheringJobs.class b/Server/build/classes/kotlin/main/GatheringJobs.class new file mode 100644 index 000000000..a3dba6b5a Binary files /dev/null and b/Server/build/classes/kotlin/main/GatheringJobs.class differ diff --git a/Server/build/classes/kotlin/main/META-INF/server.kotlin_module b/Server/build/classes/kotlin/main/META-INF/server.kotlin_module new file mode 100644 index 000000000..c260ba5a8 Binary files /dev/null and b/Server/build/classes/kotlin/main/META-INF/server.kotlin_module differ diff --git a/Server/build/classes/kotlin/main/SlayingJob.class b/Server/build/classes/kotlin/main/SlayingJob.class new file mode 100644 index 000000000..32ec1150c Binary files /dev/null and b/Server/build/classes/kotlin/main/SlayingJob.class differ diff --git a/Server/build/classes/kotlin/main/core/JSONUtils$Companion.class b/Server/build/classes/kotlin/main/core/JSONUtils$Companion.class new file mode 100644 index 000000000..7fd36918c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/JSONUtils$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/JSONUtils.class b/Server/build/classes/kotlin/main/core/JSONUtils.class new file mode 100644 index 000000000..bfcc97671 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/JSONUtils.class differ diff --git a/Server/build/classes/kotlin/main/core/Server$main$1.class b/Server/build/classes/kotlin/main/core/Server$main$1.class new file mode 100644 index 000000000..cc7a449c4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/Server$main$1.class differ diff --git a/Server/build/classes/kotlin/main/core/Server$main$2.class b/Server/build/classes/kotlin/main/core/Server$main$2.class new file mode 100644 index 000000000..33bdc04ef Binary files /dev/null and b/Server/build/classes/kotlin/main/core/Server$main$2.class differ diff --git a/Server/build/classes/kotlin/main/core/Server.class b/Server/build/classes/kotlin/main/core/Server.class new file mode 100644 index 000000000..abf73de9e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/Server.class differ diff --git a/Server/build/classes/kotlin/main/core/ServerConstants$Companion.class b/Server/build/classes/kotlin/main/core/ServerConstants$Companion.class new file mode 100644 index 000000000..52f3540ac Binary files /dev/null and b/Server/build/classes/kotlin/main/core/ServerConstants$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/ServerConstants.class b/Server/build/classes/kotlin/main/core/ServerConstants.class new file mode 100644 index 000000000..a191b83cf Binary files /dev/null and b/Server/build/classes/kotlin/main/core/ServerConstants.class differ diff --git a/Server/build/classes/kotlin/main/core/game/Varbit.class b/Server/build/classes/kotlin/main/core/game/Varbit.class new file mode 100644 index 000000000..517765209 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/Varbit.class differ diff --git a/Server/build/classes/kotlin/main/core/game/Varp.class b/Server/build/classes/kotlin/main/core/game/Varp.class new file mode 100644 index 000000000..3f4396b7c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/Varp.class differ diff --git a/Server/build/classes/kotlin/main/core/game/VarpManager.class b/Server/build/classes/kotlin/main/core/game/VarpManager.class new file mode 100644 index 000000000..3b2eb0a19 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/VarpManager.class differ diff --git a/Server/build/classes/kotlin/main/core/game/camerautils/CameraUtils.class b/Server/build/classes/kotlin/main/core/game/camerautils/CameraUtils.class new file mode 100644 index 000000000..3620fc965 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/camerautils/CameraUtils.class differ diff --git a/Server/build/classes/kotlin/main/core/game/camerautils/PlayerCamera.class b/Server/build/classes/kotlin/main/core/game/camerautils/PlayerCamera.class new file mode 100644 index 000000000..6e5b70559 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/camerautils/PlayerCamera.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeacon$Companion.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeacon$Companion.class new file mode 100644 index 000000000..19238ac6a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeacon$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeacon.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeacon.class new file mode 100644 index 000000000..cf31e9793 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeacon.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$WhenMappings.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$WhenMappings.class new file mode 100644 index 000000000..208d39f65 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$fillBeacon$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$fillBeacon$1.class new file mode 100644 index 000000000..5ca36398f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$fillBeacon$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$lightBeacon$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$lightBeacon$1.class new file mode 100644 index 000000000..eba105051 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$lightBeacon$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$restoreBeacon$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$restoreBeacon$1.class new file mode 100644 index 000000000..3f91b1634 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler$restoreBeacon$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler.class new file mode 100644 index 000000000..c7c7f74f1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandlerKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandlerKt.class new file mode 100644 index 000000000..c80eda668 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUBeaconHandlerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler$Companion.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler$Companion.class new file mode 100644 index 000000000..e8c13b07c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler$RepairClimbObject.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler$RepairClimbObject.class new file mode 100644 index 000000000..a92d4d0d2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler$RepairClimbObject.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler$WhenMappings.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler$WhenMappings.class new file mode 100644 index 000000000..804b52cbb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler.class new file mode 100644 index 000000000..5088a2cca Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFURepairClimbHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession$AFULogoutPlugin.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession$AFULogoutPlugin.class new file mode 100644 index 000000000..a1815f08d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession$AFULogoutPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession$BeaconTimer.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession$BeaconTimer.class new file mode 100644 index 000000000..fefd4c069 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession$BeaconTimer.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession$init$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession$init$1.class new file mode 100644 index 000000000..a28cc322d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession$init$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession.class new file mode 100644 index 000000000..0e461522f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/AFUSession.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/BeaconState.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/BeaconState.class new file mode 100644 index 000000000..6664972fe Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/BeaconState.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/BeaconTenderDialogue.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/BeaconTenderDialogue.class new file mode 100644 index 000000000..870ec331b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/BeaconTenderDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/BeaconTenderDialogueKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/BeaconTenderDialogueKt.class new file mode 100644 index 000000000..ef2251f30 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/allfiredup/BeaconTenderDialogueKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/barrows/RewardChest.class b/Server/build/classes/kotlin/main/core/game/content/activity/barrows/RewardChest.class new file mode 100644 index 000000000..bff6e3257 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/barrows/RewardChest.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivity$configure$1$pulse$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivity$configure$1$pulse$1.class new file mode 100644 index 000000000..ef2f9245d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivity$configure$1$pulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivity$configure$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivity$configure$1.class new file mode 100644 index 000000000..baf4a752c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivity$configure$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivity.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivity.class new file mode 100644 index 000000000..13eeaec8b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivity.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivityKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivityKt.class new file mode 100644 index 000000000..b6130122c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerActivityKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$1.class new file mode 100644 index 000000000..77584cdb2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$2.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$2.class new file mode 100644 index 000000000..b9e9aaf8e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$3.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$3.class new file mode 100644 index 000000000..f6c68a791 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler.class new file mode 100644 index 000000000..97f443089 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOverlay.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOverlay.class new file mode 100644 index 000000000..1f9b75f37 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOverlay.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOverlayKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOverlayKt.class new file mode 100644 index 000000000..b958964e1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerOverlayKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface.class new file mode 100644 index 000000000..b53775f0e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSession$SwapBoatPulse.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSession$SwapBoatPulse.class new file mode 100644 index 000000000..30fb0930f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSession$SwapBoatPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSession$TrawlerPulse.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSession$TrawlerPulse.class new file mode 100644 index 000000000..3ad8e5af0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSession$TrawlerPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSession.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSession.class new file mode 100644 index 000000000..18768648b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSession.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSessionKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSessionKt.class new file mode 100644 index 000000000..4426208d0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/FishingTrawlerSessionKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/NetLootDialogue.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/NetLootDialogue.class new file mode 100644 index 000000000..85a2c9098 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/NetLootDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/NetRepairDialogue.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/NetRepairDialogue.class new file mode 100644 index 000000000..b83c4ea15 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/NetRepairDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/TrawlerLogoutPlugin.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/TrawlerLogoutPlugin.class new file mode 100644 index 000000000..6cd908e23 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/TrawlerLogoutPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/TrawlerLoot.class b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/TrawlerLoot.class new file mode 100644 index 000000000..a8d211466 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fishingtrawler/TrawlerLoot.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fog/FogInteractionHandler$ClimbPulse.class b/Server/build/classes/kotlin/main/core/game/content/activity/fog/FogInteractionHandler$ClimbPulse.class new file mode 100644 index 000000000..83f68c914 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fog/FogInteractionHandler$ClimbPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fog/FogInteractionHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/fog/FogInteractionHandler.class new file mode 100644 index 000000000..22ca68443 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fog/FogInteractionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/fog/ReggieDialogue.class b/Server/build/classes/kotlin/main/core/game/content/activity/fog/ReggieDialogue.class new file mode 100644 index 000000000..6858a38e0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/fog/ReggieDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/DeliveryBoxHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/DeliveryBoxHandler.class new file mode 100644 index 000000000..7985f5bbc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/DeliveryBoxHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandler$RewardTokenActivationDialogue$DeliveryPulse.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandler$RewardTokenActivationDialogue$DeliveryPulse.class new file mode 100644 index 000000000..eedafc1a9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandler$RewardTokenActivationDialogue$DeliveryPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandler$RewardTokenActivationDialogue.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandler$RewardTokenActivationDialogue.class new file mode 100644 index 000000000..89ed42d57 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandler$RewardTokenActivationDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandler.class new file mode 100644 index 000000000..0482e2968 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandlerKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandlerKt.class new file mode 100644 index 000000000..2fe753f71 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GCRewardTokenHandlerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeCookingConstantsKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeCookingConstantsKt.class new file mode 100644 index 000000000..75224ef2a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeCookingConstantsKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeCookingJob.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeCookingJob.class new file mode 100644 index 000000000..a59e503c7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeCookingJob.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeTipper$LEVEL.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeTipper$LEVEL.class new file mode 100644 index 000000000..fb9ff03d9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeTipper$LEVEL.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeTipper$WhenMappings.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeTipper$WhenMappings.class new file mode 100644 index 000000000..65921571b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeTipper$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeTipper.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeTipper.class new file mode 100644 index 000000000..980ede571 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/GnomeTipper.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker$cook$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker$cook$1.class new file mode 100644 index 000000000..008336c44 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker$cook$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker.class new file mode 100644 index 000000000..13ebb468e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFiller.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFiller.class new file mode 100644 index 000000000..b64772747 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFiller.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFillerKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFillerKt.class new file mode 100644 index 000000000..3097d2647 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFillerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaGarnisher.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaGarnisher.class new file mode 100644 index 000000000..2eb1871be Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaGarnisher.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface$CookedProduct.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface$CookedProduct.class new file mode 100644 index 000000000..47d7d9845 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface$CookedProduct.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface.class new file mode 100644 index 000000000..ccc693ef3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaInterfaceKt.class new file mode 100644 index 000000000..74375ecf7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler.class new file mode 100644 index 000000000..ec18d09a2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker$cook$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker$cook$1.class new file mode 100644 index 000000000..c7a2c7e72 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker$cook$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker.class new file mode 100644 index 000000000..280f39d48 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlGarnisher.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlGarnisher.class new file mode 100644 index 000000000..842c6e54a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlGarnisher.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface$PreparedProduct.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface$PreparedProduct.class new file mode 100644 index 000000000..e4807f295 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface$PreparedProduct.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface.class new file mode 100644 index 000000000..8cb670904 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlPrepareHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlPrepareHandler.class new file mode 100644 index 000000000..1e22de320 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomeBowlPrepareHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFiller.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFiller.class new file mode 100644 index 000000000..7d0dce91c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFiller.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFillerKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFillerKt.class new file mode 100644 index 000000000..ae4cad89c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFillerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCooker$CookedDrinks.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCooker$CookedDrinks.class new file mode 100644 index 000000000..5569230ff Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCooker$CookedDrinks.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCooker$cook$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCooker$cook$1.class new file mode 100644 index 000000000..9b6dd2bfc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCooker$cook$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCooker.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCooker.class new file mode 100644 index 000000000..f1498d0f7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCooker.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCookerKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCookerKt.class new file mode 100644 index 000000000..b5d10caf1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailCookerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher$FinishedDrinks.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher$FinishedDrinks.class new file mode 100644 index 000000000..ecc737a96 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher$FinishedDrinks.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher.class new file mode 100644 index 000000000..caa057e00 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailFinisherKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailFinisherKt.class new file mode 100644 index 000000000..0b81092c4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailFinisherKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailShakerHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailShakerHandler.class new file mode 100644 index 000000000..6d5755220 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/CocktailShakerHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface$FruitCocktail.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface$FruitCocktail.class new file mode 100644 index 000000000..e5179bb18 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface$FruitCocktail.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface.class new file mode 100644 index 000000000..4f55bc838 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterfaceKt.class new file mode 100644 index 000000000..4bcf9d051 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin$PouredDrink.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin$PouredDrink.class new file mode 100644 index 000000000..534aa0516 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin$PouredDrink.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin.class new file mode 100644 index 000000000..d657a37cc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/PourMixerPluginKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/PourMixerPluginKt.class new file mode 100644 index 000000000..63e60bc07 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/cocktails/PourMixerPluginKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker$cook$1.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker$cook$1.class new file mode 100644 index 000000000..a4dd87958 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker$cook$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker.class new file mode 100644 index 000000000..d3faf88fe Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCookerKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCookerKt.class new file mode 100644 index 000000000..6b71484c0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCookerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyGarnisher.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyGarnisher.class new file mode 100644 index 000000000..da9848ec1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyGarnisher.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface$HalfMadeCrunchy.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface$HalfMadeCrunchy.class new file mode 100644 index 000000000..69a9477d0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface$HalfMadeCrunchy.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface.class new file mode 100644 index 000000000..82fc5a75b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterfaceKt.class new file mode 100644 index 000000000..1236d85f0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandler.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandler.class new file mode 100644 index 000000000..b643efe92 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandlerKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandlerKt.class new file mode 100644 index 000000000..9babb4c56 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandlerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFiller.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFiller.class new file mode 100644 index 000000000..bfec43e3f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFiller.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFillerKt.class b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFillerKt.class new file mode 100644 index 000000000..736a1df89 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFillerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/mta/EnchantSpell$Companion.class b/Server/build/classes/kotlin/main/core/game/content/activity/mta/EnchantSpell$Companion.class new file mode 100644 index 000000000..a9550a216 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/mta/EnchantSpell$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/mta/EnchantSpell.class b/Server/build/classes/kotlin/main/core/game/content/activity/mta/EnchantSpell.class new file mode 100644 index 000000000..63af56f49 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/mta/EnchantSpell.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/pestcontrol/PestControlHelper$BoatInfo.class b/Server/build/classes/kotlin/main/core/game/content/activity/pestcontrol/PestControlHelper$BoatInfo.class new file mode 100644 index 000000000..b5b65260e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/pestcontrol/PestControlHelper$BoatInfo.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/pestcontrol/PestControlHelper.class b/Server/build/classes/kotlin/main/core/game/content/activity/pestcontrol/PestControlHelper.class new file mode 100644 index 000000000..55352f3bd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/pestcontrol/PestControlHelper.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/pyramidplunder/PlunderSession$PlunderPulse.class b/Server/build/classes/kotlin/main/core/game/content/activity/pyramidplunder/PlunderSession$PlunderPulse.class new file mode 100644 index 000000000..f9b5496b8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/pyramidplunder/PlunderSession$PlunderPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/activity/pyramidplunder/PlunderSession.class b/Server/build/classes/kotlin/main/core/game/content/activity/pyramidplunder/PlunderSession.class new file mode 100644 index 000000000..ec283b36f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/activity/pyramidplunder/PlunderSession.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyEvent$SandwichLadyNPC$handleTickActions$followPulse.class b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyEvent$SandwichLadyNPC$handleTickActions$followPulse.class new file mode 100644 index 000000000..fd9eb3e35 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyEvent$SandwichLadyNPC$handleTickActions$followPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyEvent$SandwichLadyNPC.class b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyEvent$SandwichLadyNPC.class new file mode 100644 index 000000000..45c293da5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyEvent$SandwichLadyNPC.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyEvent.class b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyEvent.class new file mode 100644 index 000000000..b693f2a49 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyEvent.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyHandler$handle$MoveTo.class b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyHandler$handle$MoveTo.class new file mode 100644 index 000000000..a48701142 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyHandler$handle$MoveTo.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyHandler.class b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyHandler.class new file mode 100644 index 000000000..74344b55f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyInterface.class b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyInterface.class new file mode 100644 index 000000000..a38331ff0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/ame/events/SandwichLadyInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/consumable/effects/RestoreSummoning.class b/Server/build/classes/kotlin/main/core/game/content/consumable/effects/RestoreSummoning.class new file mode 100644 index 000000000..ba703a18d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/consumable/effects/RestoreSummoning.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AberabDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AberabDialogue.class new file mode 100644 index 000000000..64a3ac9f6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AberabDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AchiettiesDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AchiettiesDialogue.class new file mode 100644 index 000000000..ee643a10b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AchiettiesDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AfflictedDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AfflictedDialogue.class new file mode 100644 index 000000000..4b7a69335 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AfflictedDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AfrahDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AfrahDialogue.class new file mode 100644 index 000000000..1a99d7a75 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AfrahDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AgilityBossDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AgilityBossDialogue.class new file mode 100644 index 000000000..dbb7af5ac Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AgilityBossDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AgmundiDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AgmundiDialogue.class new file mode 100644 index 000000000..962a87781 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AgmundiDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneJrDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneJrDialogue.class new file mode 100644 index 000000000..55e427d6e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneJrDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogue$GnomeRestaurantPulse.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogue$GnomeRestaurantPulse.class new file mode 100644 index 000000000..eb924fca0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogue$GnomeRestaurantPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogue$getJob$1.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogue$getJob$1.class new file mode 100644 index 000000000..3ac0e7dc5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogue$getJob$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogue.class new file mode 100644 index 000000000..12d1b985a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogueKt.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogueKt.class new file mode 100644 index 000000000..5d71e8fcf Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AluftGianneSnrDialogueKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/AsyffDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/AsyffDialogue.class new file mode 100644 index 000000000..78e1cbaf1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/AsyffDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/BlurberryDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/BlurberryDialogue.class new file mode 100644 index 000000000..8f9e2016a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/BlurberryDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/BrotherBordissDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/BrotherBordissDialogue.class new file mode 100644 index 000000000..c52eb5475 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/BrotherBordissDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/ElsieDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/ElsieDialogue.class new file mode 100644 index 000000000..1a3e96cef Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/ElsieDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/GabootyDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/GabootyDialogue.class new file mode 100644 index 000000000..2599bbb1b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/GabootyDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/GeoffreyDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/GeoffreyDialogue.class new file mode 100644 index 000000000..990b81c55 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/GeoffreyDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/IffieDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/IffieDialogue.class new file mode 100644 index 000000000..9bdb8573d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/IffieDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/LegendsGuardDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/LegendsGuardDialogue.class new file mode 100644 index 000000000..ff87f5350 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/LegendsGuardDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/LensaDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/LensaDialogue.class new file mode 100644 index 000000000..4e7865302 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/LensaDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/MistagDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/MistagDialogue.class new file mode 100644 index 000000000..bfa36c645 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/MistagDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/OttoGodblessedDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/OttoGodblessedDialogue.class new file mode 100644 index 000000000..05ed0c5a5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/OttoGodblessedDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$Companion.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$Companion.class new file mode 100644 index 000000000..392f74ddc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$Companion.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$Companion.class new file mode 100644 index 000000000..eb064c7d9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FIVE_OPTION.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FIVE_OPTION.class new file mode 100644 index 000000000..b20341e88 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FIVE_OPTION.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FOUR_OPTION.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FOUR_OPTION.class new file mode 100644 index 000000000..76e28ae74 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FOUR_OPTION.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$ONE_OPTION.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$ONE_OPTION.class new file mode 100644 index 000000000..13406c044 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$ONE_OPTION.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$THREE_OPTION.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$THREE_OPTION.class new file mode 100644 index 000000000..024a61813 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$THREE_OPTION.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$TWO_OPTION.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$TWO_OPTION.class new file mode 100644 index 000000000..91d8aeb5d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue$TWO_OPTION.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue.class new file mode 100644 index 000000000..96e2faa90 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler$SkillDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler.class new file mode 100644 index 000000000..b4b3490fe Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/SkillDialogueHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/ThormacDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/ThormacDialogue.class new file mode 100644 index 000000000..f6c392e30 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/ThormacDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/WysonTheGardenerDialogue$Companion.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/WysonTheGardenerDialogue$Companion.class new file mode 100644 index 000000000..98fe531cb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/WysonTheGardenerDialogue$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/dialogue/WysonTheGardenerDialogue.class b/Server/build/classes/kotlin/main/core/game/content/dialogue/WysonTheGardenerDialogue.class new file mode 100644 index 000000000..ef5eff1a2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/dialogue/WysonTheGardenerDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/action/PickupHandler.class b/Server/build/classes/kotlin/main/core/game/content/global/action/PickupHandler.class new file mode 100644 index 000000000..2c991dc1e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/action/PickupHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport$Wizard$Companion.class b/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport$Wizard$Companion.class new file mode 100644 index 000000000..36285e6e6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport$Wizard$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport$Wizard.class b/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport$Wizard.class new file mode 100644 index 000000000..f572c7fe2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport$Wizard.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport$teleport$1.class b/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport$teleport$1.class new file mode 100644 index 000000000..bbef46e5f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport$teleport$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport.class b/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport.class new file mode 100644 index 000000000..b8c20e553 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/travel/EssenceTeleport.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/PluginSet.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/PluginSet.class new file mode 100644 index 000000000..e1217e42b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/PluginSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEvent.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEvent.class new file mode 100644 index 000000000..8adda84a1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEvent.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEventInitializer$newInstance$1.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEventInitializer$newInstance$1.class new file mode 100644 index 000000000..0c3e075ea Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEventInitializer$newInstance$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEventInitializer.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEventInitializer.class new file mode 100644 index 000000000..7c28f328b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEventInitializer.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEvents.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEvents.class new file mode 100644 index 000000000..694a88e05 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/WorldEvents.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/holiday/CandyRewardPlugin.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/holiday/CandyRewardPlugin.class new file mode 100644 index 000000000..2cfa541b8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/holiday/CandyRewardPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/holiday/GrimDialogue.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/holiday/GrimDialogue.class new file mode 100644 index 000000000..2e0a3f30c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/holiday/GrimDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/holiday/SimpleHalloweenEvent.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/holiday/SimpleHalloweenEvent.class new file mode 100644 index 000000000..02d6aa426 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/holiday/SimpleHalloweenEvent.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/LarryHandler$handle$10.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/LarryHandler$handle$10.class new file mode 100644 index 000000000..8e3ce4bed Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/LarryHandler$handle$10.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/LarryHandler$handle$HintPulse.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/LarryHandler$handle$HintPulse.class new file mode 100644 index 000000000..f9c60efa9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/LarryHandler$handle$HintPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/LarryHandler.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/LarryHandler.class new file mode 100644 index 000000000..e657cca40 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/LarryHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/NotebookHandler.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/NotebookHandler.class new file mode 100644 index 000000000..376cd7005 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/NotebookHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent$PenguinRegeneration.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent$PenguinRegeneration.class new file mode 100644 index 000000000..da4f4dc07 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent$PenguinRegeneration.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent.class new file mode 100644 index 000000000..f84d7bcf6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinManager$Companion.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinManager$Companion.class new file mode 100644 index 000000000..de57b35ae Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinManager$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinManager.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinManager.class new file mode 100644 index 000000000..66764c745 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinManager.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpawner$Penguin.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpawner$Penguin.class new file mode 100644 index 000000000..58b453cda Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpawner$Penguin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpawner.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpawner.class new file mode 100644 index 000000000..bc5dd755f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpawner.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler$SpyPulse.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler$SpyPulse.class new file mode 100644 index 000000000..14b797773 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler$SpyPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler$handle$movePulse.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler$handle$movePulse.class new file mode 100644 index 000000000..9c286bffd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler$handle$movePulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler.class new file mode 100644 index 000000000..f9b059d25 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStar.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStar.class new file mode 100644 index 000000000..ad19a0a4f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStar.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarCommands.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarCommands.class new file mode 100644 index 000000000..557fbd460 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarCommands.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarEvent$StarPulse.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarEvent$StarPulse.class new file mode 100644 index 000000000..0f0cfa336 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarEvent$StarPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarEvent.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarEvent.class new file mode 100644 index 000000000..683ddb461 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarEvent.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarLogin.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarLogin.class new file mode 100644 index 000000000..700aa4bee Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarLogin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarMiningPulse.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarMiningPulse.class new file mode 100644 index 000000000..a078f5867 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarMiningPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler$Companion.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler$Companion.class new file mode 100644 index 000000000..461ee0d27 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler.class new file mode 100644 index 000000000..cec771b93 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarType.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarType.class new file mode 100644 index 000000000..e7b53978f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/ShootingStarType.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/StarSpriteDialogue.class b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/StarSpriteDialogue.class new file mode 100644 index 000000000..d62dcdc1f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/global/worldevents/shootingstar/StarSpriteDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/jobs/JobManager.class b/Server/build/classes/kotlin/main/core/game/content/jobs/JobManager.class new file mode 100644 index 000000000..dda8ba46e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/jobs/JobManager.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/jobs/WorkForOptionHandler$CancelJobDialogue.class b/Server/build/classes/kotlin/main/core/game/content/jobs/WorkForOptionHandler$CancelJobDialogue.class new file mode 100644 index 000000000..e33926479 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/jobs/WorkForOptionHandler$CancelJobDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/jobs/WorkForOptionHandler.class b/Server/build/classes/kotlin/main/core/game/content/jobs/WorkForOptionHandler.class new file mode 100644 index 000000000..0df1e26c6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/jobs/WorkForOptionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/CooksAssistant.class b/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/CooksAssistant.class new file mode 100644 index 000000000..fb0109488 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/CooksAssistant.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/GillieGroatsDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/GillieGroatsDialogue.class new file mode 100644 index 000000000..ebb2e97a3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/GillieGroatsDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/LumbridgeCookDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/LumbridgeCookDialogue.class new file mode 100644 index 000000000..99ef4cc4d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/LumbridgeCookDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/MillieMillerDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/MillieMillerDialogue.class new file mode 100644 index 000000000..3131ec3c7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/free/cooksassistant/MillieMillerDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/allfiredup/AllFiredUp.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/allfiredup/AllFiredUp.class new file mode 100644 index 000000000..ec9b4e8ab Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/allfiredup/AllFiredUp.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue.class new file mode 100644 index 000000000..d61a10f55 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/allfiredup/SquireFyreDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/allfiredup/SquireFyreDialogue.class new file mode 100644 index 000000000..3a60c881e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/allfiredup/SquireFyreDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/asoulsbane/SoulsBaneLaunaDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/asoulsbane/SoulsBaneLaunaDialogue.class new file mode 100644 index 000000000..e3f06dc61 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/asoulsbane/SoulsBaneLaunaDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.class new file mode 100644 index 000000000..5e83d976c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorker.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorker.class new file mode 100644 index 000000000..68ca3188a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorker.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/BranchFletcher$BranchFletchingPulse.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/BranchFletcher$BranchFletchingPulse.class new file mode 100644 index 000000000..08acbd2be Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/BranchFletcher$BranchFletchingPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/BranchFletcher.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/BranchFletcher.class new file mode 100644 index 000000000..0067b7b93 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/BranchFletcher.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/ChieftanBrundt.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/ChieftanBrundt.class new file mode 100644 index 000000000..b60d29fbf Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/ChieftanBrundt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue.class new file mode 100644 index 000000000..30f5c45a7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/Draugen.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/Draugen.class new file mode 100644 index 000000000..e57ee2fcc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/Draugen.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/KegOnKegAction$handle$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/KegOnKegAction$handle$1.class new file mode 100644 index 000000000..e92c916a5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/KegOnKegAction$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/KegOnKegAction.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/KegOnKegAction.class new file mode 100644 index 000000000..0f14d41fb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/KegOnKegAction.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/LalliDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/LalliDialogue.class new file mode 100644 index 000000000..bec7594fd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/LalliDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/ManniDialogue$DrinkingPulse.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/ManniDialogue$DrinkingPulse.class new file mode 100644 index 000000000..c8932b7c3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/ManniDialogue$DrinkingPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/ManniDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/ManniDialogue.class new file mode 100644 index 000000000..e32e5bf92 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/ManniDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/OlafTheBard.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/OlafTheBard.class new file mode 100644 index 000000000..a7a0e0b54 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/OlafTheBard.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/PipeInserter$handle$toPipePulse.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/PipeInserter$handle$toPipePulse.class new file mode 100644 index 000000000..de94140b0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/PipeInserter$handle$toPipePulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/PipeInserter.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/PipeInserter.class new file mode 100644 index 000000000..86059c1de Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/PipeInserter.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/PoisonSalesman.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/PoisonSalesman.class new file mode 100644 index 000000000..70f6598c9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/PoisonSalesman.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.class new file mode 100644 index 000000000..b2afd56b3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler$ChoppingPulse.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler$ChoppingPulse.class new file mode 100644 index 000000000..978aef030 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler$ChoppingPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler$handle$toTreePulse.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler$handle$toTreePulse.class new file mode 100644 index 000000000..fe37e3a86 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler$handle$toTreePulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler.class new file mode 100644 index 000000000..d2cdc9c5a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenLadder.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenLadder.class new file mode 100644 index 000000000..5cc0da438 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenLadder.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenPortals$destRoom.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenPortals$destRoom.class new file mode 100644 index 000000000..d0bc5c132 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenPortals$destRoom.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenPortals$handle$toPortal.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenPortals$handle$toPortal.class new file mode 100644 index 000000000..3b5213cba Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenPortals$handle$toPortal.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenPortals.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenPortals.class new file mode 100644 index 000000000..e3614d611 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenPortals.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.class new file mode 100644 index 000000000..cfed35b22 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/TalismanHandler$handle$DraugenPulse.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/TalismanHandler$handle$DraugenPulse.class new file mode 100644 index 000000000..d460e91a7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/TalismanHandler$handle$DraugenPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/TalismanHandler.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/TalismanHandler.class new file mode 100644 index 000000000..420877ef9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/TalismanHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/TinderboxOnBomb.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/TinderboxOnBomb.class new file mode 100644 index 000000000..429dbd12d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thefremenniktrials/TinderboxOnBomb.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPC.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPC.class new file mode 100644 index 000000000..65402b5ff Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPC.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveRockHandler.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveRockHandler.class new file mode 100644 index 000000000..66a0f475c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveRockHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveZone$trigger$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveZone$trigger$1.class new file mode 100644 index 000000000..90d0f5027 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveZone$trigger$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveZone.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveZone.class new file mode 100644 index 000000000..d78f574a8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/CaveZone.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/DorgCbowEquipPlugin.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/DorgCbowEquipPlugin.class new file mode 100644 index 000000000..1f41fdb1b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/DorgCbowEquipPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/GoblinFollower$travel$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/GoblinFollower$travel$1.class new file mode 100644 index 000000000..a47d28856 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/GoblinFollower$travel$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/GoblinFollower.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/GoblinFollower.class new file mode 100644 index 000000000..4ecd72402 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/GoblinFollower.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace$open$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace$open$1.class new file mode 100644 index 000000000..92859e0de Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace.class new file mode 100644 index 000000000..c09fc2924 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/KazgarDialogue.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/KazgarDialogue.class new file mode 100644 index 000000000..911d17fef Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/KazgarDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribe.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribe.class new file mode 100644 index 000000000..135a1b07f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribe.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$1.class new file mode 100644 index 000000000..9661d57cf Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$2.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$2.class new file mode 100644 index 000000000..cfd707050 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$3.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$3.class new file mode 100644 index 000000000..704a9b117 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$4.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$4.class new file mode 100644 index 000000000..08e31416b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$5.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$5.class new file mode 100644 index 000000000..12c2eb3d4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$5.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$1.class new file mode 100644 index 000000000..2fdbfc7bd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$1.class new file mode 100644 index 000000000..8ca7c5a42 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$1.class new file mode 100644 index 000000000..501981dee Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$2$pulse$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$2$pulse$1.class new file mode 100644 index 000000000..52f6876c8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$2$pulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$2.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$2.class new file mode 100644 index 000000000..2d8baf96e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1.class new file mode 100644 index 000000000..19c9947f0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1.class new file mode 100644 index 000000000..96f672584 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1.class new file mode 100644 index 000000000..e8f98cc9f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1.class new file mode 100644 index 000000000..6cb549105 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2.class new file mode 100644 index 000000000..91273b533 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1.class new file mode 100644 index 000000000..08e8de17e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1.class new file mode 100644 index 000000000..5fcab5e4a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1.class new file mode 100644 index 000000000..31bcea7e0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1.class new file mode 100644 index 000000000..ee992bfc7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1.class new file mode 100644 index 000000000..45cdec2e2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1.class new file mode 100644 index 000000000..1e69b044b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2.class new file mode 100644 index 000000000..3ccdcc15f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6.class new file mode 100644 index 000000000..20620e1cd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1.class new file mode 100644 index 000000000..0e0b16b4e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene.class new file mode 100644 index 000000000..d597d30f3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutscene.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutsceneKt.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutsceneKt.class new file mode 100644 index 000000000..a40c77c83 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeCutsceneKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeOptionHandler.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeOptionHandler.class new file mode 100644 index 000000000..633261717 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeOptionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeOptionHandlerKt.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeOptionHandlerKt.class new file mode 100644 index 000000000..7daf23b2e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/LostTribeOptionHandlerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickaxeOnRubble$handle$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickaxeOnRubble$handle$1.class new file mode 100644 index 000000000..13e6dcc59 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickaxeOnRubble$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickaxeOnRubble.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickaxeOnRubble.class new file mode 100644 index 000000000..4ac47857f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickaxeOnRubble.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickpocketSigmund$handle$1.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickpocketSigmund$handle$1.class new file mode 100644 index 000000000..4f6bccc86 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickpocketSigmund$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickpocketSigmund.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickpocketSigmund.class new file mode 100644 index 000000000..5ebea6763 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/PickpocketSigmund.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/SigmundChestHandler.class b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/SigmundChestHandler.class new file mode 100644 index 000000000..17c3a0113 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/quest/members/thelosttribe/SigmundChestHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/CartConductorDialogue.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/CartConductorDialogue.class new file mode 100644 index 000000000..564106f72 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/CartConductorDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/CartConductorDialogueKt.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/CartConductorDialogueKt.class new file mode 100644 index 000000000..62159201c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/CartConductorDialogueKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/DwarvenBoatmanDialogue.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/DwarvenBoatmanDialogue.class new file mode 100644 index 000000000..cfb96f928 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/DwarvenBoatmanDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/GETrapdoorDialogue.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/GETrapdoorDialogue.class new file mode 100644 index 000000000..9131ec264 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/GETrapdoorDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/KeldagrimCartMethods.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/KeldagrimCartMethods.class new file mode 100644 index 000000000..f7b5d99f7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/KeldagrimCartMethods.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/KeldagrimOptionHandlers.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/KeldagrimOptionHandlers.class new file mode 100644 index 000000000..740350988 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/KeldagrimOptionHandlers.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/KeldagrimPluginKt.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/KeldagrimPluginKt.class new file mode 100644 index 000000000..910e79d72 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/KeldagrimPluginKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldDialogue.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldDialogue.class new file mode 100644 index 000000000..f56e82326 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldKt.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldKt.class new file mode 100644 index 000000000..3e26cb6df Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldOptionHandler.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldOptionHandler.class new file mode 100644 index 000000000..1047db359 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldOptionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface$open$1.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface$open$1.class new file mode 100644 index 000000000..67427fbda Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface.class new file mode 100644 index 000000000..3ead1395d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterfaceKt.class new file mode 100644 index 000000000..37e46066e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/TravelFromKeldagrimPulse.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/TravelFromKeldagrimPulse.class new file mode 100644 index 000000000..b9dc77db4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/TravelFromKeldagrimPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/TravelToKeldagrimPulse.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/TravelToKeldagrimPulse.class new file mode 100644 index 000000000..8e962c138 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/TravelToKeldagrimPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/travelPulse.class b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/travelPulse.class new file mode 100644 index 000000000..e3bde6044 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/content/zone/keldagrim/travelPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/BotPrices$Companion.class b/Server/build/classes/kotlin/main/core/game/ge/BotPrices$Companion.class new file mode 100644 index 000000000..4448850c1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/BotPrices$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/BotPrices.class b/Server/build/classes/kotlin/main/core/game/ge/BotPrices.class new file mode 100644 index 000000000..b61f93b5d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/BotPrices.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/GEAutoStock$Companion.class b/Server/build/classes/kotlin/main/core/game/ge/GEAutoStock$Companion.class new file mode 100644 index 000000000..27bcdb21f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/GEAutoStock$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/GEAutoStock.class b/Server/build/classes/kotlin/main/core/game/ge/GEAutoStock.class new file mode 100644 index 000000000..21d6fd76b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/GEAutoStock.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/GrandExchangeOffer.class b/Server/build/classes/kotlin/main/core/game/ge/GrandExchangeOffer.class new file mode 100644 index 000000000..d9f3c3a91 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/GrandExchangeOffer.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/OfferManager$Companion.class b/Server/build/classes/kotlin/main/core/game/ge/OfferManager$Companion.class new file mode 100644 index 000000000..654449682 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/OfferManager$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/OfferManager.class b/Server/build/classes/kotlin/main/core/game/ge/OfferManager.class new file mode 100644 index 000000000..e308009f1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/OfferManager.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$Companion.class b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$Companion.class new file mode 100644 index 000000000..01ac121eb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$open$1.class b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$open$1.class new file mode 100644 index 000000000..e84b4d175 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$openItemSets$1.class b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$openItemSets$1.class new file mode 100644 index 000000000..45af6ef4c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$openItemSets$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$openItemSets$2.class b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$openItemSets$2.class new file mode 100644 index 000000000..b4a8ab818 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$openItemSets$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$openSearch$1.class b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$openSearch$1.class new file mode 100644 index 000000000..fb7327fbd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$openSearch$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$sendConfiguration$1.class b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$sendConfiguration$1.class new file mode 100644 index 000000000..54317d05c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange$sendConfiguration$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange.class b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange.class new file mode 100644 index 000000000..33bd841a6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/ge/PlayerGrandExchange.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/CorporealBeastWarningInterface$Companion.class b/Server/build/classes/kotlin/main/core/game/interaction/CorporealBeastWarningInterface$Companion.class new file mode 100644 index 000000000..727e8b30f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/CorporealBeastWarningInterface$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/CorporealBeastWarningInterface.class b/Server/build/classes/kotlin/main/core/game/interaction/CorporealBeastWarningInterface.class new file mode 100644 index 000000000..acc6d9471 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/CorporealBeastWarningInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/FOGRewardsInterface$ShopItem.class b/Server/build/classes/kotlin/main/core/game/interaction/FOGRewardsInterface$ShopItem.class new file mode 100644 index 000000000..c0d736703 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/FOGRewardsInterface$ShopItem.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/FOGRewardsInterface.class b/Server/build/classes/kotlin/main/core/game/interaction/FOGRewardsInterface.class new file mode 100644 index 000000000..01c1628f7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/FOGRewardsInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/ItemOnBankBooth$handle$1.class b/Server/build/classes/kotlin/main/core/game/interaction/ItemOnBankBooth$handle$1.class new file mode 100644 index 000000000..a90ccc1f7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/ItemOnBankBooth$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/ItemOnBankBooth.class b/Server/build/classes/kotlin/main/core/game/interaction/ItemOnBankBooth.class new file mode 100644 index 000000000..f057b748e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/ItemOnBankBooth.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/QCRepository$WhenMappings.class b/Server/build/classes/kotlin/main/core/game/interaction/QCRepository$WhenMappings.class new file mode 100644 index 000000000..f8db46540 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/QCRepository$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/QCRepository$sendQC$1.class b/Server/build/classes/kotlin/main/core/game/interaction/QCRepository$sendQC$1.class new file mode 100644 index 000000000..6cfa1d78d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/QCRepository$sendQC$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/QCRepository.class b/Server/build/classes/kotlin/main/core/game/interaction/QCRepository.class new file mode 100644 index 000000000..e6ee20c10 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/QCRepository.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/QCRepositoryKt.class b/Server/build/classes/kotlin/main/core/game/interaction/QCRepositoryKt.class new file mode 100644 index 000000000..6d75eb8a6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/QCRepositoryKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/city/IsafdarPlugin.class b/Server/build/classes/kotlin/main/core/game/interaction/city/IsafdarPlugin.class new file mode 100644 index 000000000..cfa9523c5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/city/IsafdarPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/city/MorytaniaPlugin.class b/Server/build/classes/kotlin/main/core/game/interaction/city/MorytaniaPlugin.class new file mode 100644 index 000000000..d46d94b08 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/city/MorytaniaPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/ChocatriceIncubationInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/ChocatriceIncubationInterfaceKt.class new file mode 100644 index 000000000..5f5dc969c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/ChocatriceIncubationInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/ExperienceInterface$Companion.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/ExperienceInterface$Companion.class new file mode 100644 index 000000000..e7bfcf414 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/ExperienceInterface$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/ExperienceInterface.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/ExperienceInterface.class new file mode 100644 index 000000000..ccd5af4d7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/ExperienceInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRing$Companion.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRing$Companion.class new file mode 100644 index 000000000..19546e269 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRing$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRing.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRing.class new file mode 100644 index 000000000..00a404177 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRing.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterface$confirm$1.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterface$confirm$1.class new file mode 100644 index 000000000..09658f480 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterface$confirm$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterface$open$1.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterface$open$1.class new file mode 100644 index 000000000..a93dce359 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterface$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterface.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterface.class new file mode 100644 index 000000000..6c2c1e195 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterfaceKt.class new file mode 100644 index 000000000..c1b08ee86 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FairyRingInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterface$FUR_CLOTHING.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterface$FUR_CLOTHING.class new file mode 100644 index 000000000..0387d8c04 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterface$FUR_CLOTHING.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterface$open$1.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterface$open$1.class new file mode 100644 index 000000000..97ab39168 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterface$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterface.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterface.class new file mode 100644 index 000000000..00eaa8dff Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterfaceKt.class new file mode 100644 index 000000000..b9b881a62 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/FurClothingInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/HairDresserInterface$open$1.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/HairDresserInterface$open$1.class new file mode 100644 index 000000000..7613709a5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/HairDresserInterface$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/HairDresserInterface.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/HairDresserInterface.class new file mode 100644 index 000000000..378a8fa73 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/HairDresserInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/HairDresserInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/HairDresserInterfaceKt.class new file mode 100644 index 000000000..1723c05f8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/HairDresserInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/IncubationInterface.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/IncubationInterface.class new file mode 100644 index 000000000..f965b6f89 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/IncubationInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/MakeOverInterface$open$1.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/MakeOverInterface$open$1.class new file mode 100644 index 000000000..98b192d56 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/MakeOverInterface$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/MakeOverInterface.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/MakeOverInterface.class new file mode 100644 index 000000000..b7312b7c7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/MakeOverInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/MakeOverInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/MakeOverInterfaceKt.class new file mode 100644 index 000000000..0be898b39 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/MakeOverInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/PuppyInterfacePlugin$Companion.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/PuppyInterfacePlugin$Companion.class new file mode 100644 index 000000000..a6c03d14f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/PuppyInterfacePlugin$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/PuppyInterfacePlugin.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/PuppyInterfacePlugin.class new file mode 100644 index 000000000..1ff8daa95 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/PuppyInterfacePlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface$WhenMappings.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface$WhenMappings.class new file mode 100644 index 000000000..de46746ff Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface$colorType.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface$colorType.class new file mode 100644 index 000000000..eb0e2d936 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface$colorType.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface$open$1.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface$open$1.class new file mode 100644 index 000000000..7eecc7432 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface.class new file mode 100644 index 000000000..85b5c6029 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterfaceKt.class new file mode 100644 index 000000000..4efaa8fb7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/inter/ThessaliaInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/BraceletOfClayPlugin.class b/Server/build/classes/kotlin/main/core/game/interaction/item/BraceletOfClayPlugin.class new file mode 100644 index 000000000..3978e6498 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/BraceletOfClayPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/EnchantJewelleryTabOption$handle$1.class b/Server/build/classes/kotlin/main/core/game/interaction/item/EnchantJewelleryTabOption$handle$1.class new file mode 100644 index 000000000..0362a3036 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/EnchantJewelleryTabOption$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/EnchantJewelleryTabOption.class b/Server/build/classes/kotlin/main/core/game/interaction/item/EnchantJewelleryTabOption.class new file mode 100644 index 000000000..3d72a399c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/EnchantJewelleryTabOption.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/EnchantJewelleryTabOptionKt.class b/Server/build/classes/kotlin/main/core/game/interaction/item/EnchantJewelleryTabOptionKt.class new file mode 100644 index 000000000..8a3a1bf1b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/EnchantJewelleryTabOptionKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandler$LaunchPulse.class b/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandler$LaunchPulse.class new file mode 100644 index 000000000..673cb4c64 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandler$LaunchPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandler$SquashPulse.class b/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandler$SquashPulse.class new file mode 100644 index 000000000..007973ee1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandler$SquashPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandler.class b/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandler.class new file mode 100644 index 000000000..a82fea597 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandlerKt.class b/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandlerKt.class new file mode 100644 index 000000000..817a497ef Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/GrandSeedPodHandlerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyer$Cape$Companion.class b/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyer$Cape$Companion.class new file mode 100644 index 000000000..b8c1f8495 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyer$Cape$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyer$Cape.class b/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyer$Cape.class new file mode 100644 index 000000000..438a12277 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyer$Cape.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyer.class b/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyer.class new file mode 100644 index 000000000..ae786ae51 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyer.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyerKt.class b/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyerKt.class new file mode 100644 index 000000000..10536ddbc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/withitem/CapeDyerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/withobject/CoalTrucksHandler$useCoalWithTruck.class b/Server/build/classes/kotlin/main/core/game/interaction/item/withobject/CoalTrucksHandler$useCoalWithTruck.class new file mode 100644 index 000000000..a7799e867 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/withobject/CoalTrucksHandler$useCoalWithTruck.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/item/withobject/CoalTrucksHandler.class b/Server/build/classes/kotlin/main/core/game/interaction/item/withobject/CoalTrucksHandler.class new file mode 100644 index 000000000..479ca7ae0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/item/withobject/CoalTrucksHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/npc/BogrogPouchSwapper$handle$$inlined$also$lambda$1.class b/Server/build/classes/kotlin/main/core/game/interaction/npc/BogrogPouchSwapper$handle$$inlined$also$lambda$1.class new file mode 100644 index 000000000..4268cf245 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/npc/BogrogPouchSwapper$handle$$inlined$also$lambda$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/npc/BogrogPouchSwapper.class b/Server/build/classes/kotlin/main/core/game/interaction/npc/BogrogPouchSwapper.class new file mode 100644 index 000000000..fb4d21dc4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/npc/BogrogPouchSwapper.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/DemonTauntHandler.class b/Server/build/classes/kotlin/main/core/game/interaction/object/DemonTauntHandler.class new file mode 100644 index 000000000..6128b6ad6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/DemonTauntHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/FairyRingPlugin.class b/Server/build/classes/kotlin/main/core/game/interaction/object/FairyRingPlugin.class new file mode 100644 index 000000000..3f618f7bc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/FairyRingPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/FairyRingPluginKt.class b/Server/build/classes/kotlin/main/core/game/interaction/object/FairyRingPluginKt.class new file mode 100644 index 000000000..03a6c07f2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/FairyRingPluginKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse$Rewards.class b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse$Rewards.class new file mode 100644 index 000000000..b35d8404d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse$Rewards.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse$Type.class b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse$Type.class new file mode 100644 index 000000000..9a068b377 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse$Type.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse$WhenMappings.class b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse$WhenMappings.class new file mode 100644 index 000000000..4dac59bad Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse.class b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse.class new file mode 100644 index 000000000..569253d76 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler$ChestPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler.class b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler.class new file mode 100644 index 000000000..55d964597 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/GutanothChestOptionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/JungleBushHandler$handle$1.class b/Server/build/classes/kotlin/main/core/game/interaction/object/JungleBushHandler$handle$1.class new file mode 100644 index 000000000..1a2c25617 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/JungleBushHandler$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/JungleBushHandler.class b/Server/build/classes/kotlin/main/core/game/interaction/object/JungleBushHandler.class new file mode 100644 index 000000000..f753ed121 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/JungleBushHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/object/MuddyChestHandler.class b/Server/build/classes/kotlin/main/core/game/interaction/object/MuddyChestHandler.class new file mode 100644 index 000000000..ccdf8bca2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/object/MuddyChestHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPlugin$handle$1.class b/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPlugin$handle$1.class new file mode 100644 index 000000000..b73b5d5a0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPlugin$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPlugin$handle$2.class b/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPlugin$handle$2.class new file mode 100644 index 000000000..38ecbe0c9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPlugin$handle$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPlugin.class b/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPlugin.class new file mode 100644 index 000000000..05be95d37 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPluginKt.class b/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPluginKt.class new file mode 100644 index 000000000..aa8659dc2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/interaction/player/PeltOptionPluginKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse$1.class new file mode 100644 index 000000000..60c44615e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse$Companion$swing$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse$Companion$swing$1.class new file mode 100644 index 000000000..7a936d537 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse$Companion$swing$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse$Companion.class new file mode 100644 index 000000000..ab626da69 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse.class new file mode 100644 index 000000000..886273758 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatSwingHandler$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatSwingHandler$Companion.class new file mode 100644 index 000000000..b5d0f30c7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatSwingHandler$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatSwingHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatSwingHandler.class new file mode 100644 index 000000000..48f615b45 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/CombatSwingHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/equipment/EquipmentDegrader$StaticDegrader.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/equipment/EquipmentDegrader$StaticDegrader.class new file mode 100644 index 000000000..ca838dd44 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/equipment/EquipmentDegrader$StaticDegrader.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/equipment/EquipmentDegrader.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/equipment/EquipmentDegrader.class new file mode 100644 index 000000000..1377e9b80 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/equipment/EquipmentDegrader.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MagicSwingHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MagicSwingHandler.class new file mode 100644 index 000000000..cbb5b371e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MagicSwingHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MeleeSwingHandler$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MeleeSwingHandler$Companion.class new file mode 100644 index 000000000..5c587782b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MeleeSwingHandler$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MeleeSwingHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MeleeSwingHandler.class new file mode 100644 index 000000000..de556ab93 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MeleeSwingHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MultiSwingHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MultiSwingHandler.class new file mode 100644 index 000000000..026d428f2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/MultiSwingHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/RangeSwingHandler$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/RangeSwingHandler$Companion.class new file mode 100644 index 000000000..2a2d3b820 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/RangeSwingHandler$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/RangeSwingHandler$impact$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/RangeSwingHandler$impact$1.class new file mode 100644 index 000000000..b590cbe21 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/RangeSwingHandler$impact$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/RangeSwingHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/RangeSwingHandler.class new file mode 100644 index 000000000..8021e57d9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/RangeSwingHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/SalamanderSwingHandler$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/SalamanderSwingHandler$Companion.class new file mode 100644 index 000000000..652cc06b8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/SalamanderSwingHandler$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/SalamanderSwingHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/SalamanderSwingHandler.class new file mode 100644 index 000000000..89da83c5a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/handlers/SalamanderSwingHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/combat/special/LiquefySpecialHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/combat/special/LiquefySpecialHandler.class new file mode 100644 index 000000000..3b998e9f1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/combat/special/LiquefySpecialHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/equipment/BarrowsEquipmentRegister.class b/Server/build/classes/kotlin/main/core/game/node/entity/equipment/BarrowsEquipmentRegister.class new file mode 100644 index 000000000..fc278647c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/equipment/BarrowsEquipmentRegister.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/equipment/PVPEquipmentRegister.class b/Server/build/classes/kotlin/main/core/game/node/entity/equipment/PVPEquipmentRegister.class new file mode 100644 index 000000000..d7a15945d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/equipment/PVPEquipmentRegister.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/equipment/SnowballEquipmentPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/equipment/SnowballEquipmentPlugin.class new file mode 100644 index 000000000..a9f558e45 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/equipment/SnowballEquipmentPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/alkharid/AliTheFarmerDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/alkharid/AliTheFarmerDialogue.class new file mode 100644 index 000000000..a065487e8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/alkharid/AliTheFarmerDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/alkharid/AliTheGuard.class b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/alkharid/AliTheGuard.class new file mode 100644 index 000000000..9f921e3c0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/alkharid/AliTheGuard.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/alkharid/AliTheSmithDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/alkharid/AliTheSmithDialogue.class new file mode 100644 index 000000000..1357ae99c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/alkharid/AliTheSmithDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/pollnivneach/AliTheHagDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/pollnivneach/AliTheHagDialogue.class new file mode 100644 index 000000000..9a50a590e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/pollnivneach/AliTheHagDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/pollnivneach/AliTheMayorDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/pollnivneach/AliTheMayorDialogue.class new file mode 100644 index 000000000..ffbd3f5bc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/pollnivneach/AliTheMayorDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/pollnivneach/AliTheOperator.class b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/pollnivneach/AliTheOperator.class new file mode 100644 index 000000000..dfbf6b754 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/npc/city/pollnivneach/AliTheOperator.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/npc/other/AlKharidWarriorNPC$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/npc/other/AlKharidWarriorNPC$Companion.class new file mode 100644 index 000000000..9af6c1369 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/npc/other/AlKharidWarriorNPC$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/npc/other/AlKharidWarriorNPC$WarriorOptionPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/npc/other/AlKharidWarriorNPC$WarriorOptionPlugin.class new file mode 100644 index 000000000..2e44a8aa8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/npc/other/AlKharidWarriorNPC$WarriorOptionPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/npc/other/AlKharidWarriorNPC.class b/Server/build/classes/kotlin/main/core/game/node/entity/npc/other/AlKharidWarriorNPC.class new file mode 100644 index 000000000..a99ce42e5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/npc/other/AlKharidWarriorNPC.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser$Companion.class new file mode 100644 index 000000000..2d832032e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser$initialize$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser$initialize$1.class new file mode 100644 index 000000000..025b291e2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser$initialize$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser$reconnect$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser$reconnect$1.class new file mode 100644 index 000000000..307aaad6b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser$reconnect$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser.class new file mode 100644 index 000000000..3c6e948dc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/LoginParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$1.class new file mode 100644 index 000000000..721887adf Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$2.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$2.class new file mode 100644 index 000000000..a644bb052 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$3.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$3.class new file mode 100644 index 000000000..74d57798d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$4.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$4.class new file mode 100644 index 000000000..ff48ed6a7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1.class new file mode 100644 index 000000000..f9db76415 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser$parse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser.class new file mode 100644 index 000000000..609ded220 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaveParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$a$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$a$1.class new file mode 100644 index 000000000..ebce3b712 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$a$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$b$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$b$1.class new file mode 100644 index 000000000..ef07e34be Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$b$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$c$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$c$1.class new file mode 100644 index 000000000..27ff0feb0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$c$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$d$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$d$1.class new file mode 100644 index 000000000..f57a67184 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1$d$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1.class new file mode 100644 index 000000000..580e8a331 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$populate$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$save$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$save$1.class new file mode 100644 index 000000000..d349ce9ae Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$save$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$saveStateManager$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$saveStateManager$1.class new file mode 100644 index 000000000..ee324b9c5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver$saveStateManager$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver.class new file mode 100644 index 000000000..8417d6e0a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/login/PlayerSaver.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/stats/StatAttributeKeysKt.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/stats/StatAttributeKeysKt.class new file mode 100644 index 000000000..4441f6154 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/stats/StatAttributeKeysKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/stats/StatsCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/stats/StatsCommandSet$defineCommands$1.class new file mode 100644 index 000000000..5cb85e69e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/stats/StatsCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/info/stats/StatsCommandSet.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/stats/StatsCommandSet.class new file mode 100644 index 000000000..dd2dc41d5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/info/stats/StatsCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/player/link/diary/DiaryLevel.class b/Server/build/classes/kotlin/main/core/game/node/entity/player/link/diary/DiaryLevel.class new file mode 100644 index 000000000..c1bbf5e4e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/player/link/diary/DiaryLevel.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse$BarbarianGuardDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse$BarbarianGuardDialogue.class new file mode 100644 index 000000000..c25870030 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse$BarbarianGuardDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse$Companion.class new file mode 100644 index 000000000..1a13813bb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse$getSwimPulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse$getSwimPulse$1.class new file mode 100644 index 000000000..6fc41db3b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse$getSwimPulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse.class new file mode 100644 index 000000000..9b99afdc8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/BarbarianOutpostCourse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/GnomeStrongholdCourse$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/GnomeStrongholdCourse$Companion.class new file mode 100644 index 000000000..91d8bbcef Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/GnomeStrongholdCourse$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/GnomeStrongholdCourse.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/GnomeStrongholdCourse.class new file mode 100644 index 000000000..ceb8c3dd2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/GnomeStrongholdCourse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$Companion.class new file mode 100644 index 000000000..f09fd6a69 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleEntranceObstacle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleEntranceObstacle$1.class new file mode 100644 index 000000000..28a226c4f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleEntranceObstacle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleLogBalance$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleLogBalance$1.class new file mode 100644 index 000000000..181756034 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleLogBalance$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handlePipe$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handlePipe$1.class new file mode 100644 index 000000000..f74dd7180 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handlePipe$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleRockClimb$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleRockClimb$1.class new file mode 100644 index 000000000..8d66fcd1d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleRockClimb$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleSteppingStones$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleSteppingStones$1.class new file mode 100644 index 000000000..5e971390c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse$handleSteppingStones$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse.class new file mode 100644 index 000000000..e7a441a73 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/WildernessCourse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut$run$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut$run$1.class new file mode 100644 index 000000000..2f358a458 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut$run$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut.class new file mode 100644 index 000000000..9cebc3a30 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/PipeShortcut$run$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/PipeShortcut$run$1.class new file mode 100644 index 000000000..aaac7658d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/PipeShortcut$run$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/PipeShortcut.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/PipeShortcut.class new file mode 100644 index 000000000..26f074f75 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/PipeShortcut.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/RockClimbShortcut.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/RockClimbShortcut.class new file mode 100644 index 000000000..04897a950 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/RockClimbShortcut.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$Companion.class new file mode 100644 index 000000000..f8b6fd406 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$SteppingStoneInstance.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$SteppingStoneInstance.class new file mode 100644 index 000000000..62cb7be6e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$SteppingStoneInstance.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$handle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$handle$1.class new file mode 100644 index 000000000..3ad30ab03 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut.class new file mode 100644 index 000000000..a2fa5c22e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/Hotspot.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/Hotspot.class new file mode 100644 index 000000000..2c74e64ad Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/Hotspot.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin$Companion.class new file mode 100644 index 000000000..f3a1c2fc6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin.class new file mode 100644 index 000000000..4dfdffae2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/bedroom/ShavingStandHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/bedroom/ShavingStandHandler.class new file mode 100644 index 000000000..056609e6d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/bedroom/ShavingStandHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/bedroom/WardrobeHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/bedroom/WardrobeHandler.class new file mode 100644 index 000000000..4753dd93b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/bedroom/WardrobeHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPlugin.class new file mode 100644 index 000000000..917206562 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPluginKt.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPluginKt.class new file mode 100644 index 000000000..2681e60f9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPluginKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/costume/ToyBoxPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/costume/ToyBoxPlugin.class new file mode 100644 index 000000000..a1d4f11c0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/costume/ToyBoxPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.class new file mode 100644 index 000000000..dd4748b4d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$Companion.class new file mode 100644 index 000000000..b9e6c6926 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabButton$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabButton$Companion.class new file mode 100644 index 000000000..d3e330139 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabButton$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabButton.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabButton.class new file mode 100644 index 000000000..86fd2abc7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabButton.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabInterface$handle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabInterface$handle$1.class new file mode 100644 index 000000000..b5fff6a57 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabInterface$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabInterface.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabInterface.class new file mode 100644 index 000000000..bdaa56f00 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$TeleTabInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$handle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$handle$1.class new file mode 100644 index 000000000..b3d909c04 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin.class new file mode 100644 index 000000000..db32f9418 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/LecternPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin$Companion.class new file mode 100644 index 000000000..8a3e3f7b3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin$handle$$inlined$also$lambda$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin$handle$$inlined$also$lambda$1.class new file mode 100644 index 000000000..ca6c45658 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin$handle$$inlined$also$lambda$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin.class new file mode 100644 index 000000000..f24e51d37 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand$RepairDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand$RepairDialogue.class new file mode 100644 index 000000000..e85c18253 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand$RepairDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand.class new file mode 100644 index 000000000..09e85e650 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/cooking/ChocolateBarCutter$handle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/cooking/ChocolateBarCutter$handle$1.class new file mode 100644 index 000000000..64ccced68 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/cooking/ChocolateBarCutter$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/cooking/ChocolateBarCutter.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/cooking/ChocolateBarCutter.class new file mode 100644 index 000000000..ca0650156 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/cooking/ChocolateBarCutter.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LanternCrafting.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LanternCrafting.class new file mode 100644 index 000000000..462b43572 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LanternCrafting.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisher.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisher.class new file mode 100644 index 000000000..89f5b2d41 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisher.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSourceLighter.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSourceLighter.class new file mode 100644 index 000000000..f9872408f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSourceLighter.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSources$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSources$Companion.class new file mode 100644 index 000000000..b6a98e359 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSources$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSources.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSources.class new file mode 100644 index 000000000..54029febf Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/crafting/lightsources/LightSources.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBin.class new file mode 100644 index 000000000..57f193e01 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBinOptionHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBinOptionHandler.class new file mode 100644 index 000000000..b7d3ac36a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBinOptionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBins$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBins$Companion.class new file mode 100644 index 000000000..93926bd8f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBins$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBins.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBins.class new file mode 100644 index 000000000..58adfaa02 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostBins.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostType.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostType.class new file mode 100644 index 000000000..cc3ea4385 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CompostType.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CropHarvester$handle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CropHarvester$handle$1.class new file mode 100644 index 000000000..14f2f5a63 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CropHarvester$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CropHarvester.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CropHarvester.class new file mode 100644 index 000000000..c8df4a42a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/CropHarvester.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/DigUpPatchDialogue$handle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/DigUpPatchDialogue$handle$1.class new file mode 100644 index 000000000..c9164fc8e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/DigUpPatchDialogue$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/DigUpPatchDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/DigUpPatchDialogue.class new file mode 100644 index 000000000..ab86bba07 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/DigUpPatchDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FarmingPatch$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FarmingPatch$Companion.class new file mode 100644 index 000000000..42d7bc2af Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FarmingPatch$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FarmingPatch.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FarmingPatch.class new file mode 100644 index 000000000..8f15e927d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FarmingPatch.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FruitAndBerryPicker$handle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FruitAndBerryPicker$handle$1.class new file mode 100644 index 000000000..1eee2afa7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FruitAndBerryPicker$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FruitAndBerryPicker.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FruitAndBerryPicker.class new file mode 100644 index 000000000..b87779eda Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/FruitAndBerryPicker.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/HealthChecker$WhenMappings.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/HealthChecker$WhenMappings.class new file mode 100644 index 000000000..d257187ae Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/HealthChecker$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/HealthChecker.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/HealthChecker.class new file mode 100644 index 000000000..24238bce9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/HealthChecker.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/InspectionHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/InspectionHandler.class new file mode 100644 index 000000000..fb49d0195 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/InspectionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Patch$WhenMappings.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Patch$WhenMappings.class new file mode 100644 index 000000000..4b5b64da3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Patch$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Patch.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Patch.class new file mode 100644 index 000000000..765dcc145 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Patch.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/PatchRaker$rake$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/PatchRaker$rake$1.class new file mode 100644 index 000000000..4ea2b5940 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/PatchRaker$rake$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/PatchRaker.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/PatchRaker.class new file mode 100644 index 000000000..cc47a2df9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/PatchRaker.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/PatchType.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/PatchType.class new file mode 100644 index 000000000..611db488d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/PatchType.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Plantable$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Plantable$Companion.class new file mode 100644 index 000000000..647469536 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Plantable$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Plantable.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Plantable.class new file mode 100644 index 000000000..31b773a53 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/Plantable.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/ToolLeprechaunInterface$open$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/ToolLeprechaunInterface$open$1.class new file mode 100644 index 000000000..0b1eac9bb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/ToolLeprechaunInterface$open$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/ToolLeprechaunInterface.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/ToolLeprechaunInterface.class new file mode 100644 index 000000000..6295a69c4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/ToolLeprechaunInterface.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/ToolLeprechaunInterfaceKt.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/ToolLeprechaunInterfaceKt.class new file mode 100644 index 000000000..06a9fe7e1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/ToolLeprechaunInterfaceKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler$handle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler$handle$1.class new file mode 100644 index 000000000..8ab2a41a9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler$handle$2.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler$handle$2.class new file mode 100644 index 000000000..ca1b27caa Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler$handle$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler$handle$3.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler$handle$3.class new file mode 100644 index 000000000..c66b0b55f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler$handle$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler.class new file mode 100644 index 000000000..a1171cec7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithBinHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$1.class new file mode 100644 index 000000000..3c4c18d2a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$2.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$2.class new file mode 100644 index 000000000..b808b41a5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$3.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$3.class new file mode 100644 index 000000000..e31c30952 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$4.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$4.class new file mode 100644 index 000000000..07ba6ee40 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler$handle$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler.class new file mode 100644 index 000000000..99048cfb4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/farming/UseWithPatchHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse$Companion.class new file mode 100644 index 000000000..18c221f59 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse.class new file mode 100644 index 000000000..b9278f5e0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/gather/PickaxeRepairPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/gather/PickaxeRepairPlugin.class new file mode 100644 index 000000000..722858b24 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/gather/PickaxeRepairPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/gather/mining/MiningSkillPulse$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/gather/mining/MiningSkillPulse$Companion.class new file mode 100644 index 000000000..bfea8269f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/gather/mining/MiningSkillPulse$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/gather/mining/MiningSkillPulse.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/gather/mining/MiningSkillPulse.class new file mode 100644 index 000000000..c5dfc4f61 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/gather/mining/MiningSkillPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin$Companion.class new file mode 100644 index 000000000..d8afabdd7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin$handle$handler$1$create$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin$handle$handler$1$create$1.class new file mode 100644 index 000000000..644770b3d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin$handle$handler$1$create$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin$handle$handler$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin$handle$handler$1.class new file mode 100644 index 000000000..430fa55fc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin$handle$handler$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin.class new file mode 100644 index 000000000..438d039ae Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/herblore/GrindItemPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/CommonKebbitEast.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/CommonKebbitEast.class new file mode 100644 index 000000000..55dd74329 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/CommonKebbitEast.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/CommonKebbitWest.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/CommonKebbitWest.class new file mode 100644 index 000000000..8dfc338f8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/CommonKebbitWest.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/HunterTracking$reward$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/HunterTracking$reward$1.class new file mode 100644 index 000000000..0f1cba018 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/HunterTracking$reward$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/HunterTracking.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/HunterTracking.class new file mode 100644 index 000000000..9c7dea46d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/HunterTracking.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/PolarKebbitHunting.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/PolarKebbitHunting.class new file mode 100644 index 000000000..edd20bcf1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/PolarKebbitHunting.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/TrailDefinition.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/TrailDefinition.class new file mode 100644 index 000000000..7a5b02299 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/TrailDefinition.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/TrailType.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/TrailType.class new file mode 100644 index 000000000..272c2b9c6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/hunter/tracking/TrailType.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/runecrafting/PouchManager$RCPouch.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/runecrafting/PouchManager$RCPouch.class new file mode 100644 index 000000000..ea6cd79db Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/runecrafting/PouchManager$RCPouch.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/runecrafting/PouchManager.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/runecrafting/PouchManager.class new file mode 100644 index 000000000..e5f5d865b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/runecrafting/PouchManager.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/runecrafting/RunePouchPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/runecrafting/RunePouchPlugin.class new file mode 100644 index 000000000..cfd11bac3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/runecrafting/RunePouchPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/Skillcape$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/Skillcape$Companion.class new file mode 100644 index 000000000..c11aea905 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/Skillcape$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/Skillcape.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/Skillcape.class new file mode 100644 index 000000000..09681dd1b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/Skillcape.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPlugin.class new file mode 100644 index 000000000..e4f429a4a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin.class new file mode 100644 index 000000000..8bc0cbdde Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$1.class new file mode 100644 index 000000000..3f66b1a78 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$2.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$2.class new file mode 100644 index 000000000..d50b464c6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$3.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$3.class new file mode 100644 index 000000000..315ad4103 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$Companion$WhenMappings.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$Companion$WhenMappings.class new file mode 100644 index 000000000..ede261c7e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$Companion$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$Companion.class new file mode 100644 index 000000000..f0f756774 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$MagicCapeDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$MagicCapeDialogue.class new file mode 100644 index 000000000..c8e2f14e0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$MagicCapeDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$RCCapeDialogue.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$RCCapeDialogue.class new file mode 100644 index 000000000..1d503ee0d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks$RCCapeDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks.class new file mode 100644 index 000000000..187b58ec9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/skillcapeperks/SkillcapePerks.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$Companion$1$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$Companion$1$1.class new file mode 100644 index 000000000..5ce3f0f81 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$Companion$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$Companion$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$Companion$1.class new file mode 100644 index 000000000..c59d9d1c1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$Companion$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$Companion.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$Companion.class new file mode 100644 index 000000000..f64df6a66 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$getRandomLoot$2.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$getRandomLoot$2.class new file mode 100644 index 000000000..dce2bc920 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket$getRandomLoot$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket.class b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket.class new file mode 100644 index 000000000..fa1157178 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/skill/thieving/Pickpocket.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/PlayerState.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/PlayerState.class new file mode 100644 index 000000000..ad3bc101a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/PlayerState.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/State.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/State.class new file mode 100644 index 000000000..02ea4b318 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/State.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/StateRepository.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/StateRepository.class new file mode 100644 index 000000000..2501717f0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/StateRepository.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/AvaDeviceState$createPulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/AvaDeviceState$createPulse$1.class new file mode 100644 index 000000000..2a36eb669 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/AvaDeviceState$createPulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/AvaDeviceState.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/AvaDeviceState.class new file mode 100644 index 000000000..7227d90de Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/AvaDeviceState.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/DiseasedState$createPulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/DiseasedState$createPulse$1.class new file mode 100644 index 000000000..26fee526f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/DiseasedState$createPulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/DiseasedState.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/DiseasedState.class new file mode 100644 index 000000000..53ff44c22 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/DiseasedState.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/FarmingState$createPulse$1$pulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/FarmingState$createPulse$1$pulse$1.class new file mode 100644 index 000000000..598004a71 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/FarmingState$createPulse$1$pulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/FarmingState$createPulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/FarmingState$createPulse$1.class new file mode 100644 index 000000000..ee2e90e6c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/FarmingState$createPulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/FarmingState.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/FarmingState.class new file mode 100644 index 000000000..df8898f4e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/FarmingState.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/GodspellChargedState$createPulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/GodspellChargedState$createPulse$1.class new file mode 100644 index 000000000..30215d92e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/GodspellChargedState$createPulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/GodspellChargedState.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/GodspellChargedState.class new file mode 100644 index 000000000..da4412528 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/GodspellChargedState.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/IncubatorState$createPulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/IncubatorState$createPulse$1.class new file mode 100644 index 000000000..cadba2cd4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/IncubatorState$createPulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/IncubatorState.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/IncubatorState.class new file mode 100644 index 000000000..1fec77eb3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/IncubatorState.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/ShootingStarState$createPulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/ShootingStarState$createPulse$1.class new file mode 100644 index 000000000..edd547d3d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/ShootingStarState$createPulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/ShootingStarState.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/ShootingStarState.class new file mode 100644 index 000000000..37c10c69d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/ShootingStarState.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/SkulledState$createPulse$1.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/SkulledState$createPulse$1.class new file mode 100644 index 000000000..983467ebd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/SkulledState$createPulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/SkulledState.class b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/SkulledState.class new file mode 100644 index 000000000..ec2275f70 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/node/entity/state/newsys/states/SkulledState.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/SystemLogger.class b/Server/build/classes/kotlin/main/core/game/system/SystemLogger.class new file mode 100644 index 000000000..0c5167202 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/SystemLogger.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/Command$Privilege.class b/Server/build/classes/kotlin/main/core/game/system/command/Command$Privilege.class new file mode 100644 index 000000000..085c2a0b8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/Command$Privilege.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/Command.class b/Server/build/classes/kotlin/main/core/game/system/command/Command.class new file mode 100644 index 000000000..4c069098a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/Command.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/CommandMapping.class b/Server/build/classes/kotlin/main/core/game/system/command/CommandMapping.class new file mode 100644 index 000000000..29b52b93e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/CommandMapping.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/CommandPlugin$Companion.class b/Server/build/classes/kotlin/main/core/game/system/command/CommandPlugin$Companion.class new file mode 100644 index 000000000..5ece1710e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/CommandPlugin$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/CommandPlugin.class b/Server/build/classes/kotlin/main/core/game/system/command/CommandPlugin.class new file mode 100644 index 000000000..dc2815d56 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/CommandPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/CommandSystem$Companion.class b/Server/build/classes/kotlin/main/core/game/system/command/CommandSystem$Companion.class new file mode 100644 index 000000000..f1dd3968e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/CommandSystem$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/CommandSystem.class b/Server/build/classes/kotlin/main/core/game/system/command/CommandSystem.class new file mode 100644 index 000000000..42eb34d5b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/CommandSystem.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/MapDumpCommand$Companion.class b/Server/build/classes/kotlin/main/core/game/system/command/MapDumpCommand$Companion.class new file mode 100644 index 000000000..175f26a64 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/MapDumpCommand$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/MapDumpCommand.class b/Server/build/classes/kotlin/main/core/game/system/command/MapDumpCommand.class new file mode 100644 index 000000000..471e7e7c9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/MapDumpCommand.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/AIPCommandPlugin$parse$2.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/AIPCommandPlugin$parse$2.class new file mode 100644 index 000000000..0d32a0e98 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/AIPCommandPlugin$parse$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/AIPCommandPlugin.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/AIPCommandPlugin.class new file mode 100644 index 000000000..9bf900a5c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/AIPCommandPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/SimpleDumpingCommands.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/SimpleDumpingCommands.class new file mode 100644 index 000000000..96df1071c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/SimpleDumpingCommands.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$1.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$1.class new file mode 100644 index 000000000..0e1e51fa1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$2.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$2.class new file mode 100644 index 000000000..765c0f37a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$3.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$3.class new file mode 100644 index 000000000..c62cf1270 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$4.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$4.class new file mode 100644 index 000000000..d6d334529 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$5.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$5.class new file mode 100644 index 000000000..fa611bf6c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$5.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$6.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$6.class new file mode 100644 index 000000000..8ef09d61b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$6.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$7.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$7.class new file mode 100644 index 000000000..3db6d1116 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand$parse$7.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand.class b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand.class new file mode 100644 index 000000000..2c6982f50 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/oldsys/VisualCommand.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RPUseWithNPCDialogue.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RPUseWithNPCDialogue.class new file mode 100644 index 000000000..6023ca2a3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RPUseWithNPCDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RPUseWithPlayerDialogue.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RPUseWithPlayerDialogue.class new file mode 100644 index 000000000..e83d222bc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RPUseWithPlayerDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue$handle$1.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue$handle$1.class new file mode 100644 index 000000000..c718e2764 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue$handle$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue$handle$2.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue$handle$2.class new file mode 100644 index 000000000..48f650361 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue$handle$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue$handle$4.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue$handle$4.class new file mode 100644 index 000000000..cfa42e6b5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue$handle$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue.class new file mode 100644 index 000000000..ced0d02f5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.class new file mode 100644 index 000000000..d3f2cbf2b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandlerKt.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandlerKt.class new file mode 100644 index 000000000..e66d1e3b1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoOptionHandlerKt.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue$handle$6.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue$handle$6.class new file mode 100644 index 000000000..e2d29a9fe Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue$handle$6.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue$handle$7.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue$handle$7.class new file mode 100644 index 000000000..cdc81b9ba Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue$handle$7.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.class new file mode 100644 index 000000000..6ead3671e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoUseWithHandler.class b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoUseWithHandler.class new file mode 100644 index 000000000..e78e9c57a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/rottenpotato/RottenPotatoUseWithHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$1.class new file mode 100644 index 000000000..c0bd71f6d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$2$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$2$1.class new file mode 100644 index 000000000..603aac2ab Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$2$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$2.class new file mode 100644 index 000000000..91df72e84 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$3.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$3.class new file mode 100644 index 000000000..3a65d12bd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$4.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$4.class new file mode 100644 index 000000000..f155f86cd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet$defineCommands$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet.class new file mode 100644 index 000000000..4590dae34 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/AnimationCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$1$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$1$1.class new file mode 100644 index 000000000..55239ba79 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$1.class new file mode 100644 index 000000000..05064635c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$2$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$2$1.class new file mode 100644 index 000000000..2190d6735 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$2$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$2.class new file mode 100644 index 000000000..75bf21714 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$3.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$3.class new file mode 100644 index 000000000..1401688d3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet$defineCommands$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet.class new file mode 100644 index 000000000..6a22f595b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/BottingCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/CommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/CommandSet.class new file mode 100644 index 000000000..796f06180 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/CommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet$defineCommands$1.class new file mode 100644 index 000000000..768b0f5c9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet$defineCommands$2.class new file mode 100644 index 000000000..e23d8dd02 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet$defineCommands$3.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet$defineCommands$3.class new file mode 100644 index 000000000..98c131053 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet$defineCommands$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet.class new file mode 100644 index 000000000..35f77d401 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/ConfigCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/DevelopmentCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/DevelopmentCommandSet$defineCommands$1.class new file mode 100644 index 000000000..3e89c602a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/DevelopmentCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/DevelopmentCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/DevelopmentCommandSet.class new file mode 100644 index 000000000..9f4d1699c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/DevelopmentCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$1.class new file mode 100644 index 000000000..e059bdc3f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$2.class new file mode 100644 index 000000000..facbd34bc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$3.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$3.class new file mode 100644 index 000000000..2e5a40de1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$4.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$4.class new file mode 100644 index 000000000..8ce7019cc Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$5.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$5.class new file mode 100644 index 000000000..b7ce0936b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$5.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$6.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$6.class new file mode 100644 index 000000000..a19dacaeb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$6.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$7$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$7$1.class new file mode 100644 index 000000000..4f791bed7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$7$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$7.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$7.class new file mode 100644 index 000000000..e970a0970 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$7.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$8.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$8.class new file mode 100644 index 000000000..77062e148 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet$defineCommands$8.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet.class new file mode 100644 index 000000000..1574d3331 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/FunCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$1.class new file mode 100644 index 000000000..db0e8c4de Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$10.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$10.class new file mode 100644 index 000000000..4718985e3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$10.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$11$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$11$1.class new file mode 100644 index 000000000..8b3a77cd9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$11$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$11.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$11.class new file mode 100644 index 000000000..db33b605b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$11.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$12.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$12.class new file mode 100644 index 000000000..0551e7408 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$12.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$13.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$13.class new file mode 100644 index 000000000..5945394e1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$13.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$14.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$14.class new file mode 100644 index 000000000..545b86642 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$14.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$15.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$15.class new file mode 100644 index 000000000..66317e439 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$15.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$16.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$16.class new file mode 100644 index 000000000..14f8c3c81 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$16.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$17.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$17.class new file mode 100644 index 000000000..eef44592d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$17.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$18.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$18.class new file mode 100644 index 000000000..7c56d5b7d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$18.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$19.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$19.class new file mode 100644 index 000000000..bfcb91e2c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$19.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$2.class new file mode 100644 index 000000000..7fefc0024 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$20.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$20.class new file mode 100644 index 000000000..06a95cae5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$20.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$21.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$21.class new file mode 100644 index 000000000..3b44daf5e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$21.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$22.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$22.class new file mode 100644 index 000000000..605c2441a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$22.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$23.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$23.class new file mode 100644 index 000000000..19cbb425a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$23.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$24.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$24.class new file mode 100644 index 000000000..a7748897b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$24.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$25.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$25.class new file mode 100644 index 000000000..71d99bed0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$25.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$26.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$26.class new file mode 100644 index 000000000..33486fe97 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$26.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$27.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$27.class new file mode 100644 index 000000000..cde01ac48 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$27.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$28.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$28.class new file mode 100644 index 000000000..cc699696a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$28.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$3.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$3.class new file mode 100644 index 000000000..5614082be Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$4.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$4.class new file mode 100644 index 000000000..d3e9ffa00 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$5.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$5.class new file mode 100644 index 000000000..26858fb6b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$5.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$6.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$6.class new file mode 100644 index 000000000..f0db07188 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$6.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$7.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$7.class new file mode 100644 index 000000000..eac5ca7f0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$7.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$8.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$8.class new file mode 100644 index 000000000..a3f1ac53c Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$8.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$9.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$9.class new file mode 100644 index 000000000..47ad075c0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet$defineCommands$9.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet.class new file mode 100644 index 000000000..e7ea5623e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MiscCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/ModerationCommandSet$defineCommands$1$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/ModerationCommandSet$defineCommands$1$1.class new file mode 100644 index 000000000..19fc366fa Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/ModerationCommandSet$defineCommands$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/ModerationCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/ModerationCommandSet$defineCommands$1.class new file mode 100644 index 000000000..2f21f9b2b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/ModerationCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/ModerationCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/ModerationCommandSet.class new file mode 100644 index 000000000..97bf9fe33 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/ModerationCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MusicCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MusicCommandSet$defineCommands$1.class new file mode 100644 index 000000000..31ff9247a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MusicCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MusicCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MusicCommandSet$defineCommands$2.class new file mode 100644 index 000000000..fc0d82525 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MusicCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/MusicCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/MusicCommandSet.class new file mode 100644 index 000000000..c2771df5d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/MusicCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$1.class new file mode 100644 index 000000000..b3d28bfcb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$2.class new file mode 100644 index 000000000..28b95a4f0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$3.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$3.class new file mode 100644 index 000000000..9e518d883 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$4.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$4.class new file mode 100644 index 000000000..5d5fb2c59 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet$defineCommands$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet.class new file mode 100644 index 000000000..a5c8d3df1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/QuestCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SlayerCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SlayerCommandSet$defineCommands$1.class new file mode 100644 index 000000000..f7209786a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SlayerCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SlayerCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SlayerCommandSet$defineCommands$2.class new file mode 100644 index 000000000..4a692f681 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SlayerCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SlayerCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SlayerCommandSet.class new file mode 100644 index 000000000..a1e719c5f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SlayerCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet$defineCommands$1.class new file mode 100644 index 000000000..16e984164 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet$defineCommands$2.class new file mode 100644 index 000000000..db23cd9a8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet$defineCommands$3.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet$defineCommands$3.class new file mode 100644 index 000000000..3c2c869f7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet$defineCommands$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet.class new file mode 100644 index 000000000..112fe2199 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SpawnCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$1.class new file mode 100644 index 000000000..344248f4e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$2.class new file mode 100644 index 000000000..9133698a8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$3.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$3.class new file mode 100644 index 000000000..426b13818 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$4.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$4.class new file mode 100644 index 000000000..6142520fb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet$defineCommands$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet.class new file mode 100644 index 000000000..43b8ed881 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/SystemCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$1.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$1.class new file mode 100644 index 000000000..81e13750b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$2.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$2.class new file mode 100644 index 000000000..529735835 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$3.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$3.class new file mode 100644 index 000000000..4a4d5bc8b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$4.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$4.class new file mode 100644 index 000000000..2000e0177 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$4.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$5.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$5.class new file mode 100644 index 000000000..39e6a01a2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet$defineCommands$5.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet.class b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet.class new file mode 100644 index 000000000..5736b308e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/command/sets/TeleportCommandSet.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$postPlugin$1$1.class b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$postPlugin$1$1.class new file mode 100644 index 000000000..90b6e078e Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$postPlugin$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$postPlugin$1$2.class b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$postPlugin$1$2.class new file mode 100644 index 000000000..53a3436d2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$postPlugin$1$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$postPlugin$1.class b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$postPlugin$1.class new file mode 100644 index 000000000..0aa1440da Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$postPlugin$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$prePlugin$1$1.class b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$prePlugin$1$1.class new file mode 100644 index 000000000..1802f07f3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$prePlugin$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$prePlugin$1$2.class b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$prePlugin$1$2.class new file mode 100644 index 000000000..4dcc37777 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$prePlugin$1$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$prePlugin$1.class b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$prePlugin$1.class new file mode 100644 index 000000000..e8f082f07 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser$prePlugin$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser.class b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser.class new file mode 100644 index 000000000..39312ceb5 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ConfigParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/DoorConfigLoader$Companion.class b/Server/build/classes/kotlin/main/core/game/system/config/DoorConfigLoader$Companion.class new file mode 100644 index 000000000..10f1e67bd Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/DoorConfigLoader$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/DoorConfigLoader$Door.class b/Server/build/classes/kotlin/main/core/game/system/config/DoorConfigLoader$Door.class new file mode 100644 index 000000000..3c562856b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/DoorConfigLoader$Door.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/DoorConfigLoader.class b/Server/build/classes/kotlin/main/core/game/system/config/DoorConfigLoader.class new file mode 100644 index 000000000..796fced9a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/DoorConfigLoader.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/DropTableParser.class b/Server/build/classes/kotlin/main/core/game/system/config/DropTableParser.class new file mode 100644 index 000000000..1884c72d7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/DropTableParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/GroundSpawnLoader$GroundSpawn$respawn$1.class b/Server/build/classes/kotlin/main/core/game/system/config/GroundSpawnLoader$GroundSpawn$respawn$1.class new file mode 100644 index 000000000..f6fe8afb6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/GroundSpawnLoader$GroundSpawn$respawn$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/GroundSpawnLoader$GroundSpawn.class b/Server/build/classes/kotlin/main/core/game/system/config/GroundSpawnLoader$GroundSpawn.class new file mode 100644 index 000000000..a95f630ce Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/GroundSpawnLoader$GroundSpawn.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/GroundSpawnLoader.class b/Server/build/classes/kotlin/main/core/game/system/config/GroundSpawnLoader.class new file mode 100644 index 000000000..8f90c5603 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/GroundSpawnLoader.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/InterfaceConfigParser.class b/Server/build/classes/kotlin/main/core/game/system/config/InterfaceConfigParser.class new file mode 100644 index 000000000..b232d8dd9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/InterfaceConfigParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ItemConfigParser$Companion.class b/Server/build/classes/kotlin/main/core/game/system/config/ItemConfigParser$Companion.class new file mode 100644 index 000000000..e7c152ebe Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ItemConfigParser$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ItemConfigParser.class b/Server/build/classes/kotlin/main/core/game/system/config/ItemConfigParser.class new file mode 100644 index 000000000..2995f7c26 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ItemConfigParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/MusicConfigLoader.class b/Server/build/classes/kotlin/main/core/game/system/config/MusicConfigLoader.class new file mode 100644 index 000000000..2d936ec0a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/MusicConfigLoader.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/NPCConfigParser$Companion.class b/Server/build/classes/kotlin/main/core/game/system/config/NPCConfigParser$Companion.class new file mode 100644 index 000000000..0e5616315 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/NPCConfigParser$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/NPCConfigParser.class b/Server/build/classes/kotlin/main/core/game/system/config/NPCConfigParser.class new file mode 100644 index 000000000..2f70bf200 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/NPCConfigParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/NPCSpawner.class b/Server/build/classes/kotlin/main/core/game/system/config/NPCSpawner.class new file mode 100644 index 000000000..a3e460977 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/NPCSpawner.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ObjectConfigParser.class b/Server/build/classes/kotlin/main/core/game/system/config/ObjectConfigParser.class new file mode 100644 index 000000000..8eec63af1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ObjectConfigParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/RangedConfigLoader.class b/Server/build/classes/kotlin/main/core/game/system/config/RangedConfigLoader.class new file mode 100644 index 000000000..6f011c391 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/RangedConfigLoader.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ServerConfigParser.class b/Server/build/classes/kotlin/main/core/game/system/config/ServerConfigParser.class new file mode 100644 index 000000000..20c9fb428 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ServerConfigParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ShopParser$Companion.class b/Server/build/classes/kotlin/main/core/game/system/config/ShopParser$Companion.class new file mode 100644 index 000000000..40bb8ddf4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ShopParser$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/ShopParser.class b/Server/build/classes/kotlin/main/core/game/system/config/ShopParser.class new file mode 100644 index 000000000..04d1b25ab Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/ShopParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/XteaParser$Companion.class b/Server/build/classes/kotlin/main/core/game/system/config/XteaParser$Companion.class new file mode 100644 index 000000000..01b7cab70 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/XteaParser$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/system/config/XteaParser.class b/Server/build/classes/kotlin/main/core/game/system/config/XteaParser.class new file mode 100644 index 000000000..457149e18 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/system/config/XteaParser.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/DeadlockDetector$run$1.class b/Server/build/classes/kotlin/main/core/game/world/DeadlockDetector$run$1.class new file mode 100644 index 000000000..d24f5cc89 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/DeadlockDetector$run$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/DeadlockDetector.class b/Server/build/classes/kotlin/main/core/game/world/DeadlockDetector.class new file mode 100644 index 000000000..b2a4184ce Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/DeadlockDetector.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/GameSettings$Companion.class b/Server/build/classes/kotlin/main/core/game/world/GameSettings$Companion.class new file mode 100644 index 000000000..a41f4aa8f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/GameSettings$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/GameSettings.class b/Server/build/classes/kotlin/main/core/game/world/GameSettings.class new file mode 100644 index 000000000..f80e1a679 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/GameSettings.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/GameWorld$prompt$1.class b/Server/build/classes/kotlin/main/core/game/world/GameWorld$prompt$1.class new file mode 100644 index 000000000..0ac0fbfd0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/GameWorld$prompt$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/GameWorld$prompt$2.class b/Server/build/classes/kotlin/main/core/game/world/GameWorld$prompt$2.class new file mode 100644 index 000000000..bdad4f7ed Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/GameWorld$prompt$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1$1.class b/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1$1.class new file mode 100644 index 000000000..d5f5dc07d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1$2.class b/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1$2.class new file mode 100644 index 000000000..ed1121a95 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1$3.class b/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1$3.class new file mode 100644 index 000000000..296d86ab3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1$3.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1.class b/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1.class new file mode 100644 index 000000000..ec2b11c1f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/GameWorld$pulse$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/GameWorld.class b/Server/build/classes/kotlin/main/core/game/world/GameWorld.class new file mode 100644 index 000000000..17245b1b2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/GameWorld.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/ImmerseWorld$init$1.class b/Server/build/classes/kotlin/main/core/game/world/ImmerseWorld$init$1.class new file mode 100644 index 000000000..397ceac2f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/ImmerseWorld$init$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/ImmerseWorld.class b/Server/build/classes/kotlin/main/core/game/world/ImmerseWorld.class new file mode 100644 index 000000000..0700cde13 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/ImmerseWorld.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/PulseRunner.class b/Server/build/classes/kotlin/main/core/game/world/PulseRunner.class new file mode 100644 index 000000000..1bbb3d39a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/PulseRunner.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/callback/CallbackHub.class b/Server/build/classes/kotlin/main/core/game/world/callback/CallbackHub.class new file mode 100644 index 000000000..3fd22dfd6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/callback/CallbackHub.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/map/path/SmartPathfinder.class b/Server/build/classes/kotlin/main/core/game/world/map/path/SmartPathfinder.class new file mode 100644 index 000000000..fb3f16788 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/map/path/SmartPathfinder.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/repository/DisconnectionQueue$DisconnectionEntry.class b/Server/build/classes/kotlin/main/core/game/world/repository/DisconnectionQueue$DisconnectionEntry.class new file mode 100644 index 000000000..8b3ae6d1b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/repository/DisconnectionQueue$DisconnectionEntry.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/repository/DisconnectionQueue$finish$1.class b/Server/build/classes/kotlin/main/core/game/world/repository/DisconnectionQueue$finish$1.class new file mode 100644 index 000000000..14ca3f215 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/repository/DisconnectionQueue$finish$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/repository/DisconnectionQueue.class b/Server/build/classes/kotlin/main/core/game/world/repository/DisconnectionQueue.class new file mode 100644 index 000000000..06477e11b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/repository/DisconnectionQueue.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/repository/Repository.class b/Server/build/classes/kotlin/main/core/game/world/repository/Repository.class new file mode 100644 index 000000000..c9fd9dfd1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/repository/Repository.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/MapChunkRenderer.class b/Server/build/classes/kotlin/main/core/game/world/update/MapChunkRenderer.class new file mode 100644 index 000000000..59741befb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/MapChunkRenderer.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/NPCRenderer.class b/Server/build/classes/kotlin/main/core/game/world/update/NPCRenderer.class new file mode 100644 index 000000000..e5e89a3a1 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/NPCRenderer.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/PlayerRenderer.class b/Server/build/classes/kotlin/main/core/game/world/update/PlayerRenderer.class new file mode 100644 index 000000000..d81226669 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/PlayerRenderer.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/UpdateMasks$Companion.class b/Server/build/classes/kotlin/main/core/game/world/update/UpdateMasks$Companion.class new file mode 100644 index 000000000..7b9adf41a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/UpdateMasks$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/UpdateMasks.class b/Server/build/classes/kotlin/main/core/game/world/update/UpdateMasks.class new file mode 100644 index 000000000..84c296f31 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/UpdateMasks.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$Companion.class b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$Companion.class new file mode 100644 index 000000000..c04e21e05 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$end$1.class b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$end$1.class new file mode 100644 index 000000000..be68fa0b7 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$end$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$end$2.class b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$end$2.class new file mode 100644 index 000000000..697aecdeb Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$end$2.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$run$1$1.class b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$run$1$1.class new file mode 100644 index 000000000..af1e112c0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$run$1$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$run$1.class b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$run$1.class new file mode 100644 index 000000000..143d520a2 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence$run$1.class differ diff --git a/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence.class b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence.class new file mode 100644 index 000000000..88e6aeb5f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/game/world/update/UpdateSequence.class differ diff --git a/Server/build/classes/kotlin/main/core/net/event/LoginReadEvent$Companion$decodeWorld$1.class b/Server/build/classes/kotlin/main/core/net/event/LoginReadEvent$Companion$decodeWorld$1.class new file mode 100644 index 000000000..00387142b Binary files /dev/null and b/Server/build/classes/kotlin/main/core/net/event/LoginReadEvent$Companion$decodeWorld$1.class differ diff --git a/Server/build/classes/kotlin/main/core/net/event/LoginReadEvent$Companion.class b/Server/build/classes/kotlin/main/core/net/event/LoginReadEvent$Companion.class new file mode 100644 index 000000000..64b1b337a Binary files /dev/null and b/Server/build/classes/kotlin/main/core/net/event/LoginReadEvent$Companion.class differ diff --git a/Server/build/classes/kotlin/main/core/net/event/LoginReadEvent.class b/Server/build/classes/kotlin/main/core/net/event/LoginReadEvent.class new file mode 100644 index 000000000..8c3b5b4a0 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/net/event/LoginReadEvent.class differ diff --git a/Server/build/classes/kotlin/main/core/net/packet/in/ItemOnGroundItemPacket$decode$1.class b/Server/build/classes/kotlin/main/core/net/packet/in/ItemOnGroundItemPacket$decode$1.class new file mode 100644 index 000000000..db64e45fa Binary files /dev/null and b/Server/build/classes/kotlin/main/core/net/packet/in/ItemOnGroundItemPacket$decode$1.class differ diff --git a/Server/build/classes/kotlin/main/core/net/packet/in/ItemOnGroundItemPacket.class b/Server/build/classes/kotlin/main/core/net/packet/in/ItemOnGroundItemPacket.class new file mode 100644 index 000000000..53f4926f3 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/net/packet/in/ItemOnGroundItemPacket.class differ diff --git a/Server/build/classes/kotlin/main/core/net/packet/in/QCPacketType.class b/Server/build/classes/kotlin/main/core/net/packet/in/QCPacketType.class new file mode 100644 index 000000000..9bdc73522 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/net/packet/in/QCPacketType.class differ diff --git a/Server/build/classes/kotlin/main/core/net/packet/in/QuickChatPacketHandler$WhenMappings.class b/Server/build/classes/kotlin/main/core/net/packet/in/QuickChatPacketHandler$WhenMappings.class new file mode 100644 index 000000000..2fc7e8b81 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/net/packet/in/QuickChatPacketHandler$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/net/packet/in/QuickChatPacketHandler.class b/Server/build/classes/kotlin/main/core/net/packet/in/QuickChatPacketHandler.class new file mode 100644 index 000000000..e1feb67da Binary files /dev/null and b/Server/build/classes/kotlin/main/core/net/packet/in/QuickChatPacketHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/CorePluginTypes/XPGainPlugin.class b/Server/build/classes/kotlin/main/core/plugin/CorePluginTypes/XPGainPlugin.class new file mode 100644 index 000000000..82fbd98cf Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/CorePluginTypes/XPGainPlugin.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/CorePluginTypes/XPGainPlugins.class b/Server/build/classes/kotlin/main/core/plugin/CorePluginTypes/XPGainPlugins.class new file mode 100644 index 000000000..861f62f22 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/CorePluginTypes/XPGainPlugins.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/PluginManager$WhenMappings.class b/Server/build/classes/kotlin/main/core/plugin/PluginManager$WhenMappings.class new file mode 100644 index 000000000..dc2a4758d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/PluginManager$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/PluginManager$load$1.class b/Server/build/classes/kotlin/main/core/plugin/PluginManager$load$1.class new file mode 100644 index 000000000..59435f2f8 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/PluginManager$load$1.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/PluginManager.class b/Server/build/classes/kotlin/main/core/plugin/PluginManager.class new file mode 100644 index 000000000..bff184ec4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/PluginManager.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/FishOnAltar$moveToPulse.class b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/FishOnAltar$moveToPulse.class new file mode 100644 index 000000000..0e0878a5f Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/FishOnAltar$moveToPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/FishOnAltar$spiritPulse.class b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/FishOnAltar$spiritPulse.class new file mode 100644 index 000000000..337cf3b8d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/FishOnAltar$spiritPulse.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/FishOnAltar.class b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/FishOnAltar.class new file mode 100644 index 000000000..e51c58d02 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/FishOnAltar.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/LyreOptionHandler$telePulse.class b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/LyreOptionHandler$telePulse.class new file mode 100644 index 000000000..45ec96923 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/LyreOptionHandler$telePulse.class differ diff --git a/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/LyreOptionHandler.class b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/LyreOptionHandler.class new file mode 100644 index 000000000..61dad042d Binary files /dev/null and b/Server/build/classes/kotlin/main/core/plugin/quest/fremtrials/LyreOptionHandler.class differ diff --git a/Server/build/classes/kotlin/main/core/tools/Interfaces.class b/Server/build/classes/kotlin/main/core/tools/Interfaces.class new file mode 100644 index 000000000..ed1cbfde4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/tools/Interfaces.class differ diff --git a/Server/build/classes/kotlin/main/core/tools/Items.class b/Server/build/classes/kotlin/main/core/tools/Items.class new file mode 100644 index 000000000..8019c11df Binary files /dev/null and b/Server/build/classes/kotlin/main/core/tools/Items.class differ diff --git a/Server/build/classes/kotlin/main/core/tools/TickUtilsKt.class b/Server/build/classes/kotlin/main/core/tools/TickUtilsKt.class new file mode 100644 index 000000000..92f7b39f9 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/tools/TickUtilsKt.class differ diff --git a/Server/build/classes/kotlin/main/core/tools/stringtools/StringToolsKt.class b/Server/build/classes/kotlin/main/core/tools/stringtools/StringToolsKt.class new file mode 100644 index 000000000..769adaea4 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/tools/stringtools/StringToolsKt.class differ diff --git a/Server/build/classes/kotlin/main/core/worker/MajorUpdateWorker$start$1.class b/Server/build/classes/kotlin/main/core/worker/MajorUpdateWorker$start$1.class new file mode 100644 index 000000000..4c11a72d6 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/worker/MajorUpdateWorker$start$1.class differ diff --git a/Server/build/classes/kotlin/main/core/worker/MajorUpdateWorker.class b/Server/build/classes/kotlin/main/core/worker/MajorUpdateWorker.class new file mode 100644 index 000000000..b2b603599 Binary files /dev/null and b/Server/build/classes/kotlin/main/core/worker/MajorUpdateWorker.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/AIRepository$Companion.class b/Server/build/classes/kotlin/main/plugin/ai/AIRepository$Companion.class new file mode 100644 index 000000000..89717e3d0 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/AIRepository$Companion.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/AIRepository.class b/Server/build/classes/kotlin/main/plugin/ai/AIRepository.class new file mode 100644 index 000000000..7dcc179ba Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/AIRepository.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/GeneralBotCreator$BotScriptPulse.class b/Server/build/classes/kotlin/main/plugin/ai/general/GeneralBotCreator$BotScriptPulse.class new file mode 100644 index 000000000..3de3b6930 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/GeneralBotCreator$BotScriptPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/GeneralBotCreator$TransitionPulse.class b/Server/build/classes/kotlin/main/plugin/ai/general/GeneralBotCreator$TransitionPulse.class new file mode 100644 index 000000000..6528a470b Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/GeneralBotCreator$TransitionPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/GeneralBotCreator.class b/Server/build/classes/kotlin/main/plugin/ai/general/GeneralBotCreator.class new file mode 100644 index 000000000..cf7a64ea4 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/GeneralBotCreator.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$BottingOverlay.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$BottingOverlay.class new file mode 100644 index 000000000..ff32bf441 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$BottingOverlay.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$bankItem$BankingPulse.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$bankItem$BankingPulse.class new file mode 100644 index 000000000..59dd3a460 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$bankItem$BankingPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$buyFromGE$1$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$buyFromGE$1$1.class new file mode 100644 index 000000000..e826857fc Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$buyFromGE$1$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$buyFromGE$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$buyFromGE$1.class new file mode 100644 index 000000000..25609a7a5 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$buyFromGE$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$randomWalkTo$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$randomWalkTo$1.class new file mode 100644 index 000000000..8a3a57428 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$randomWalkTo$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$sellAllOnGe$toCounterPulseAll.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$sellAllOnGe$toCounterPulseAll.class new file mode 100644 index 000000000..00b2d419a Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$sellAllOnGe$toCounterPulseAll.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$sellAllOnGeAdv$toCounterPulseAll.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$sellAllOnGeAdv$toCounterPulseAll.class new file mode 100644 index 000000000..613bdd8d6 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$sellAllOnGeAdv$toCounterPulseAll.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$sellOnGE$toCounterPulse.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$sellOnGE$toCounterPulse.class new file mode 100644 index 000000000..c2e6564f0 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$sellOnGE$toCounterPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$teleport$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$teleport$1.class new file mode 100644 index 000000000..916b6fcb4 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$teleport$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$teleportToGE$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$teleportToGE$1.class new file mode 100644 index 000000000..b052f8510 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$teleportToGE$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$walkTo$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$walkTo$1.class new file mode 100644 index 000000000..9b04176a7 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$walkTo$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$walkToIterator$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$walkToIterator$1.class new file mode 100644 index 000000000..34061b16f Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI$walkToIterator$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI.class b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI.class new file mode 100644 index 000000000..7116d9cc1 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/ScriptAPI.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$State.class new file mode 100644 index 000000000..11919f87a Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$WhenMappings.class new file mode 100644 index 000000000..5edf539ff Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$tick$1.class new file mode 100644 index 000000000..ab2f66a7e Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$tick$BankingPulse.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$tick$BankingPulse.class new file mode 100644 index 000000000..a857bef46 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$tick$BankingPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$tick$GEPulse.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$tick$GEPulse.class new file mode 100644 index 000000000..14c429d1c Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer$tick$GEPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer.class new file mode 100644 index 000000000..e7fe70661 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Adventurer.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller$State.class new file mode 100644 index 000000000..edc60be72 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller$WhenMappings.class new file mode 100644 index 000000000..8f1d1d2c5 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller$tick$1.class new file mode 100644 index 000000000..0ff9ea9c5 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller.class new file mode 100644 index 000000000..b7784c8ae Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ChickenKiller.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$BankingPulse.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$BankingPulse.class new file mode 100644 index 000000000..5d9d5794e Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$BankingPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$State.class new file mode 100644 index 000000000..e7e7031ea Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$WhenMappings.class new file mode 100644 index 000000000..d008629db Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$tick$1.class new file mode 100644 index 000000000..7e89b078a Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner.class new file mode 100644 index 000000000..711a282e4 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CoalMiner.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$State.class new file mode 100644 index 000000000..0cd4eb5ce Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$WhenMappings.class new file mode 100644 index 000000000..f6362afdb Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$tick$1.class new file mode 100644 index 000000000..95832580d Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$tick$2.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$tick$2.class new file mode 100644 index 000000000..81b7d0baa Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller$tick$2.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller.class new file mode 100644 index 000000000..e02e0d03d Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/CowKiller.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher$State.class new file mode 100644 index 000000000..c2a24b0eb Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher$WhenMappings.class new file mode 100644 index 000000000..80518d167 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher$tick$1.class new file mode 100644 index 000000000..6042c71d5 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher.class new file mode 100644 index 000000000..543662980 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorFisher.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows$State.class new file mode 100644 index 000000000..39f8ffbfb Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows$WhenMappings.class new file mode 100644 index 000000000..5a96f4796 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows$tick$1.class new file mode 100644 index 000000000..e4695ceb1 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows.class new file mode 100644 index 000000000..363edcadd Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/DraynorWillows.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FarmerThiever.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FarmerThiever.class new file mode 100644 index 000000000..c7b5dd619 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FarmerThiever.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FletchingBankstander$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FletchingBankstander$State.class new file mode 100644 index 000000000..126eeac72 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FletchingBankstander$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FletchingBankstander$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FletchingBankstander$WhenMappings.class new file mode 100644 index 000000000..9f5f0c088 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FletchingBankstander$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FletchingBankstander.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FletchingBankstander.class new file mode 100644 index 000000000..c290ca6ef Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/FletchingBankstander.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$Assignment.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$Assignment.class new file mode 100644 index 000000000..ea71c0fe2 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$Assignment.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$State.class new file mode 100644 index 000000000..5cd921bd7 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$Task.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$Task.class new file mode 100644 index 000000000..0ca4596b9 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$Task.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$TaskHub.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$TaskHub.class new file mode 100644 index 000000000..c25775b4d Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$TaskHub.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$WhenMappings.class new file mode 100644 index 000000000..6eb486a30 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$tick$1.class new file mode 100644 index 000000000..c1c1108a5 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$tick$2.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$tick$2.class new file mode 100644 index 000000000..195d60410 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot$tick$2.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot.class new file mode 100644 index 000000000..e06f176a2 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GenericSlayerBot.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GlassBlowingBankstander$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GlassBlowingBankstander$State.class new file mode 100644 index 000000000..ed0628923 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GlassBlowingBankstander$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GlassBlowingBankstander$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GlassBlowingBankstander$WhenMappings.class new file mode 100644 index 000000000..ac44caacf Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GlassBlowingBankstander$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GlassBlowingBankstander.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GlassBlowingBankstander.class new file mode 100644 index 000000000..8d154599c Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GlassBlowingBankstander.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$MageSwinger.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$MageSwinger.class new file mode 100644 index 000000000..a90aaa8a7 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$MageSwinger.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$MeleeSwinger.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$MeleeSwinger.class new file mode 100644 index 000000000..ae2e043cb Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$MeleeSwinger.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$RangeSwinger.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$RangeSwinger.class new file mode 100644 index 000000000..a16e2c3a7 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$RangeSwinger.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$State.class new file mode 100644 index 000000000..0f7cba223 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$WhenMappings.class new file mode 100644 index 000000000..3ec002439 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$tick$2.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$tick$2.class new file mode 100644 index 000000000..2159c16c6 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$tick$2.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$tick$3.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$tick$3.class new file mode 100644 index 000000000..7fe491735 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller$tick$3.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller.class new file mode 100644 index 000000000..cf51f4d7f Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/GreenDragonKiller.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Idler.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Idler.class new file mode 100644 index 000000000..424640c83 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/Idler.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$Sets.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$Sets.class new file mode 100644 index 000000000..a138f5411 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$Sets.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$State.class new file mode 100644 index 000000000..cd52c1f50 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$WhenMappings.class new file mode 100644 index 000000000..9cbe11444 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$tick$1.class new file mode 100644 index 000000000..54e0d5f10 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$tick$BankingPulse.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$tick$BankingPulse.class new file mode 100644 index 000000000..1126ad2fb Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher$tick$BankingPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher.class new file mode 100644 index 000000000..1534e5ec5 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/LobsterCatcher.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ManThiever.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ManThiever.class new file mode 100644 index 000000000..2f82d3773 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ManThiever.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/NonBankingMiner.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/NonBankingMiner.class new file mode 100644 index 000000000..2f63c11f5 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/NonBankingMiner.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/PlayerCompatible.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/PlayerCompatible.class new file mode 100644 index 000000000..85798c6d7 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/PlayerCompatible.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/PlayerScripts$PlayerScript.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/PlayerScripts$PlayerScript.class new file mode 100644 index 000000000..384e38f8f Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/PlayerScripts$PlayerScript.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/PlayerScripts.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/PlayerScripts.class new file mode 100644 index 000000000..660142191 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/PlayerScripts.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ScriptDescription.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ScriptDescription.class new file mode 100644 index 000000000..567a75c11 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ScriptDescription.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ScriptIdentifier.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ScriptIdentifier.class new file mode 100644 index 000000000..8562eb8e5 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ScriptIdentifier.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ScriptName.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ScriptName.class new file mode 100644 index 000000000..8f807a940 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/ScriptName.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$State.class new file mode 100644 index 000000000..7ef6e825d Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$WhenMappings.class new file mode 100644 index 000000000..074b53ff9 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$tick$2.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$tick$2.class new file mode 100644 index 000000000..c921d4bd0 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$tick$2.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$tick$3.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$tick$3.class new file mode 100644 index 000000000..237366236 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax$tick$3.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax.class new file mode 100644 index 000000000..5455c6efe Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersFlax.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees$State.class new file mode 100644 index 000000000..89d40786f Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees$WhenMappings.class new file mode 100644 index 000000000..c370b3e0c Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees$tick$1.class new file mode 100644 index 000000000..234590862 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees.class new file mode 100644 index 000000000..6f4e813aa Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SeersMagicTrees.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$Sets.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$Sets.class new file mode 100644 index 000000000..8160eff23 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$Sets.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$State.class new file mode 100644 index 000000000..7b0930405 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$WhenMappings.class new file mode 100644 index 000000000..9f41b3e75 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$tick$BankingPulse.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$tick$BankingPulse.class new file mode 100644 index 000000000..1763a2f2f Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher$tick$BankingPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher.class new file mode 100644 index 000000000..f05cacf54 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/SharkCatcher.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner$State.class new file mode 100644 index 000000000..d5ac95623 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner$WhenMappings.class new file mode 100644 index 000000000..682918176 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner$tick$1.class new file mode 100644 index 000000000..2acb32ba6 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner.class new file mode 100644 index 000000000..68b5b6b53 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockEssenceMiner.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$State.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$State.class new file mode 100644 index 000000000..675717e79 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$WhenMappings.class new file mode 100644 index 000000000..f0bbf0586 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$tick$1.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$tick$1.class new file mode 100644 index 000000000..f7a6c79a0 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$tick$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$tick$2.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$tick$2.class new file mode 100644 index 000000000..9a1d5ca7d Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither$tick$2.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither.class b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither.class new file mode 100644 index 000000000..dee722cf3 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/general/scriptrepository/VarrockSmither.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatState$randomWalkTo$1.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatState$randomWalkTo$1.class new file mode 100644 index 000000000..51bafeb94 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatState$randomWalkTo$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatState$walkToIterator$1.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatState$walkToIterator$1.class new file mode 100644 index 000000000..83f1c7db8 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatState$walkToIterator$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatState.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatState.class new file mode 100644 index 000000000..d27dbfad0 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatState.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate$randomWalkTo$1.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate$randomWalkTo$1.class new file mode 100644 index 000000000..fd771e5ec Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate$randomWalkTo$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate$walkToIterator$1.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate$walkToIterator$1.class new file mode 100644 index 000000000..3fe609f63 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate$walkToIterator$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate.class new file mode 100644 index 000000000..3b7c1229a Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot$Companion.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot$Companion.class new file mode 100644 index 000000000..dd7299240 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot$Companion.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot$State.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot$State.class new file mode 100644 index 000000000..90c03548a Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot$WhenMappings.class new file mode 100644 index 000000000..a1ab9427c Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot.class new file mode 100644 index 000000000..2b82b47cb Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2$Companion.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2$Companion.class new file mode 100644 index 000000000..0b6e250d9 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2$Companion.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2$State.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2$State.class new file mode 100644 index 000000000..38f955ec3 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2$State.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2$WhenMappings.class new file mode 100644 index 000000000..e70802b31 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2.class b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2.class new file mode 100644 index 000000000..25b905898 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/minigamebots/pestcontrol/PestControlTestBot2.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBot.class b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBot.class new file mode 100644 index 000000000..f91662ff6 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBot.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler$Tier.class b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler$Tier.class new file mode 100644 index 000000000..f52a8575e Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler$Tier.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler$Type.class b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler$Type.class new file mode 100644 index 000000000..3876a8279 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler$Type.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler$WhenMappings.class new file mode 100644 index 000000000..e7f678493 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler.class b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler.class new file mode 100644 index 000000000..c32c8e5bf Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/CombatBotAssembler.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/pvmbots/PvMBotsBuilder$Companion$immersiveSpawns$1.class b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/PvMBotsBuilder$Companion$immersiveSpawns$1.class new file mode 100644 index 000000000..b707b0f7b Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/PvMBotsBuilder$Companion$immersiveSpawns$1.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/pvmbots/PvMBotsBuilder$Companion.class b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/PvMBotsBuilder$Companion.class new file mode 100644 index 000000000..cf5f68d1d Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/PvMBotsBuilder$Companion.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/pvmbots/PvMBotsBuilder.class b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/PvMBotsBuilder.class new file mode 100644 index 000000000..3f4b668df Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/pvmbots/PvMBotsBuilder.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/skillingbot/SkillingBotAssembler$Wealth.class b/Server/build/classes/kotlin/main/plugin/ai/skillingbot/SkillingBotAssembler$Wealth.class new file mode 100644 index 000000000..5828089df Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/skillingbot/SkillingBotAssembler$Wealth.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/skillingbot/SkillingBotAssembler$WhenMappings.class b/Server/build/classes/kotlin/main/plugin/ai/skillingbot/SkillingBotAssembler$WhenMappings.class new file mode 100644 index 000000000..98f3ff2e4 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/skillingbot/SkillingBotAssembler$WhenMappings.class differ diff --git a/Server/build/classes/kotlin/main/plugin/ai/skillingbot/SkillingBotAssembler.class b/Server/build/classes/kotlin/main/plugin/ai/skillingbot/SkillingBotAssembler.class new file mode 100644 index 000000000..65d5cb996 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/ai/skillingbot/SkillingBotAssembler.class differ diff --git a/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/BarbFishingPulse.class b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/BarbFishingPulse.class new file mode 100644 index 000000000..b0e55f6f6 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/BarbFishingPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/BarbFishingSpot.class b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/BarbFishingSpot.class new file mode 100644 index 000000000..61278358c Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/BarbFishingSpot.class differ diff --git a/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/FishCuttingPulse.class b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/FishCuttingPulse.class new file mode 100644 index 000000000..2567803fc Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/FishCuttingPulse.class differ diff --git a/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/KnifeWithFish.class b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/KnifeWithFish.class new file mode 100644 index 000000000..f78b84c70 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/KnifeWithFish.class differ diff --git a/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/OptionHandlers.class b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/OptionHandlers.class new file mode 100644 index 000000000..d7ad4bee2 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/OptionHandlers.class differ diff --git a/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/SpotManager$Companion.class b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/SpotManager$Companion.class new file mode 100644 index 000000000..34c48bd8d Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/SpotManager$Companion.class differ diff --git a/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/SpotManager.class b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/SpotManager.class new file mode 100644 index 000000000..4862ac9ea Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/SpotManager.class differ diff --git a/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/SpotManagerKt.class b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/SpotManagerKt.class new file mode 100644 index 000000000..0a913d85e Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/barbtraining/fishing/SpotManagerKt.class differ diff --git a/Server/build/classes/kotlin/main/plugin/creditshop/CreditShop.class b/Server/build/classes/kotlin/main/plugin/creditshop/CreditShop.class new file mode 100644 index 000000000..84c3c5828 Binary files /dev/null and b/Server/build/classes/kotlin/main/plugin/creditshop/CreditShop.class differ diff --git a/Server/build/kotlin/compileKotlin/build-history.bin b/Server/build/kotlin/compileKotlin/build-history.bin new file mode 100644 index 000000000..88beec802 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/build-history.bin differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab new file mode 100644 index 000000000..94fe678d9 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream new file mode 100644 index 000000000..3fa4bac9d --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream @@ -0,0 +1 @@ +/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/NotebookHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheMayorDialogue.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersMagicTrees.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaGarnisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler.ktb/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/camerautils/CameraUtils.kt\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBot.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheSmithDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LanternCrafting.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/WardrobeHandler.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/GroundSpawnLoader.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/CooksAssistant.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptName.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/CombatSwingHandler.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimCartMethods.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveRockHandler.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/EquipmentDegrader.ktQ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/Varbit.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AsyffDialogue.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaveParser.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CoalMiner.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/PolarKebbitHunting.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderSession.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/DemonTauntHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisher.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/PlayerGrandExchange.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/AvaDeviceState.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneJrDialogue.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/cooking/ChocolateBarCutter.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/MakeOverInterface.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryLevel.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/GnomeStrongholdCourse.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FletchingBankstander.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandler.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GCRewardTokenHandler.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/MusicConfigLoader.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/MusicCommandSet.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LyreOptionHandler.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/FurClothingInterface.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/DwarvenBoatmanDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TinderboxOnBomb.ktQ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/Items.kt]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/GameSettings.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithPatchHandler.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/city/MorytaniaPlugin.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/DoorConfigLoader.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/RangeSwingHandler.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersFlax.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/CommandPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPlugin.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CowKiller.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/LumbridgeCookDialogue.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FarmerThiever.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerScripts.ktW/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/BotPrices.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStar.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/KnifeWithFish.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheOperator.ktU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/TickUtils.kt]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/ImmerseWorld.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/Patch.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/ThessaliaInterface.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/GutanothChestPlugin.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlIntermediateBot.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/DeadlockDetector.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneSnrDialogue.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/SkulledState.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/player/PeltOptionPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitWest.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/SquireFyreDialogue.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaver.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheGuard.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/consumable/effects/RestoreSummoning.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/stringtools/StringTools.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyNPC.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotAssembler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSources.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/KazgarDialogue.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/BarbFishingPulse.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithPlayerDialogue.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithNPCDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface.ktd/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/GeneralBotCreator.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/ThormacDialogue.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/FishCuttingPulse.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler.ktb/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/TableDump.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/SoulsBaneLaunaDialogue.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/npc/BogrogPouchSwapper.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/RockClimbShortcut.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/ItemOnBankBooth.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/equipment/BarrowsEquipmentRegister.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchType.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyInterface.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GlassBlowingBankstander.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribe.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/action/PickupHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/OlafTheBard.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/in/QuickChatPacketHandler.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/mta/EnchantSpell.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/DropTableParser.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickpocketSigmund.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveZone.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/gather/PickaxeRepairPlugin.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fog/FogInteractionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorker.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatAttributeKeys.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlHelper.kt]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/creditshop/CreditShop.kte/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/callback/CallbackHub.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorWillows.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/FarmingPatch.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/ShavingStandHandler.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/State.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/FunCommandSet.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/PolarKebbitHunting.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarEvent.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fog/ReggieDialogue.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/oldsys/VisualCommand.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/impl/GatheringJob.ktY/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/GEAutoStock.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenPortals.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/EnchantJewelleryTabOption.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeOptionHandler.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/NPCSpawner.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/QCRepository.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerActivity.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyGarnisher.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/travel/EssenceTeleport.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/city/IsafdarPlugin.kt`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/GrandExchangeOffer.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AgilityBossDialogue.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/Plantable.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ShopParser.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEventInitializer.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/LobsterCatcher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/CandyRewardPlugin.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/GrimDialogue.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/TrailDefinition.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/OptionHandlers.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/ExperienceInterface.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GreenDragonKiller.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/CorePluginTypes/XPGainPlugins.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/other/AlKharidWarriorPlugin.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/HunterTracking.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/RangedConfigLoader.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/AnimationCommandSet.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/withobject/CoalTrucksHandler.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GenericSlayerBot.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/SlayerCommandSet.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/oldsys/SimpleDumpingCommands.ktW/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/AIRepository.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockEssenceMiner.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/equipment/SnowballEquipmentPlugin.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginParser.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AfflictedDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlPrepareHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailCooker.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouchPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/FarmingState.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptIdentifier.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/costume/ToyBoxPlugin.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SharkCatcher.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/IncubatorState.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingConstants.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ItemConfigParser.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MeleeSwingHandler.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Adventurer.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarCommands.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarMiningPulse.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatState.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/TrawlerLoot.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/StateRepository.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFiller.ktb/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/JobManager.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/WorkForOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FishOnAltar.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/MapDumpCommand.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/MapChunkRenderer.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/SkillDialogueHandler.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/CommandSet.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/SpawnCommandSet.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/PlayerRenderer.ktV/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/Interfaces.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/FairyRingInterface.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/FairyRingPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FremennikTrials.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/impl/SlayingJob.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/BraceletOfClayPlugin.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/BarbarianOutpostCourse.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/LensaDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/CombatPulse.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/path/SmartPathfinder.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/SpotManager.ktU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/ServerConstants.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindItemPlugin.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/MiscCommandSet.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinManager.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LalliDialogue.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeaconHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/ConfigCommandSet.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/PuppyInterfacePlugin.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatsCommandSet.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/FOGRewardsInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/repository/DisconnectionQueue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/OttoGodblessedDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpawner.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/MuddyChestHandler.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AfrahDialogue.ktL/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/Server.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/ChocatriceIncubationInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/LecternPlugin.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ChickenKiller.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/GabootyDialogue.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/GoblinFollower.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOverlay.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/GeoffreyDialogue.ktZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/OfferManager.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Idler.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/PlayerState.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/CartConductorDialogue.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerCompatible.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyHandler.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/QuestCommandSet.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PipeInserter.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFiller.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AchiettiesDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/CommandSystem.kt^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/SystemLogger.ktV/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/VarpManager.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlNoviceBot.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/NonBankingMiner.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailShakerHandler.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/ModerationCommandSet.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CropHarvester.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/XteaParser.kt\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/PulseRunner.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheHagDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/NPCConfigParser.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceLighter.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeTipper.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchRaker.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/SystemCommandSet.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/InterfaceConfigParser.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ObjectConfigParser.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/StarSpriteDialogue.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorFisher.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/DigUpPatchDialogue.kte/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ConfigParser.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/equipment/PVPEquipmentRegister.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickaxeOnRubble.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeacon.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AberabDialogue.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ServerConfigParser.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/MistagDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/KegOnKegAction.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/Draugen.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/NPCRenderer.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/Command.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/camerautils/PlayerCamera.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/repository/Repository.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PoisonSalesman.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ManThiever.kt\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/ScriptAPI.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/SimpleHalloweenEvent.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockSmither.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBotsBuilder.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/Hotspot.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/barrows/RewardChest.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/Skillcape.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningSkillPulse.kt^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/event/LoginReadEvent.ktZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/GameWorld.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/Reinald.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BranchFletcher.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/BlurberryDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/SalamanderSwingHandler.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/JungleBushHandler.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/LarryHandler.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptDescription.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/thieving/Pickpocket.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/WildernessCourse.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/GodspellChargedState.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MagicSwingHandler.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/ShootingStarState.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/PipeShortcut.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/GrandSeedPodHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenLadder.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/BeaconTenderDialogue.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/LegendsGuardDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/GillieGroatsDialogue.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/in/ItemOnGroundItemPacket.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ManniDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeCutscene.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/oldsys/AIPCommandPlugin.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUSession.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/PouchManager.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/DorgCbowEquipPlugin.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/DevelopmentCommandSet.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/city/falador/MakeoverMageInterface.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFURepairClimbHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitEast.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/special/LiquefySpecialHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/MillieMillerDialogue.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MultiSwingHandler.kte/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBotAssembler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerSession.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TalismanHandler.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/WysonTheGardenerDialogue.ktO/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/Varp.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/ElsieDialogue.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AgmundiDialogue.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/UpdateMasks.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/IffieDialogue.ktZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/PluginManager.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFiller.kt^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/worker/MajorUpdateWorker.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/withitem/CapeDyer.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/TeleportCommandSet.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/CorporealBeastWarningInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPC.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/InspectionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoUseWithHandler.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEvent.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheFarmerDialogue.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingJob.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/DeliveryBoxHandler.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/BrotherBordissDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlGarnisher.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/DiseasedState.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/UpdateSequence.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/AllFiredUp.ktO/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/JSONUtils.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarLogin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/SigmundChestHandler.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/HairDresserInterface.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/BottingCommandSet.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapePerks.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/HealthChecker.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/FruitAndBerryPicker.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostType.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBin.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBins.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithBinHandler.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBinOptionHandler.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/ToolLeprechaunInterface.kt \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len new file mode 100644 index 000000000..e246fe2ab Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.len new file mode 100644 index 000000000..adeed5b0a Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values new file mode 100644 index 000000000..d84a65051 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.at new file mode 100644 index 000000000..30e569d75 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.s new file mode 100644 index 000000000..6bcafadc8 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab.values.s @@ -0,0 +1 @@ +EC?C3 \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i new file mode 100644 index 000000000..a73321d54 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/inputs/source-to-output.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab new file mode 100644 index 000000000..485e6cdda Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream new file mode 100644 index 000000000..f5aedc6dc --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream @@ -0,0 +1,2 @@ + GatheringJobs +SlayingJob0core.game.system.command.oldsys.AIPCommandPlugin5core.game.system.command.oldsys.SimpleDumpingCommands-core.game.system.command.oldsys.VisualCommand@core.game.content.activity.gnomecooking.cocktails.CocktailCookerMcore.game.content.activity.gnomecooking.cocktails.CocktailCooker.CookedDrinksBcore.game.content.activity.gnomecooking.cocktails.CocktailFinisherQcore.game.content.activity.gnomecooking.cocktails.CocktailFinisher.FinishedDrinksGcore.game.content.activity.gnomecooking.cocktails.CocktailShakerHandlerHcore.game.content.activity.gnomecooking.cocktails.GnomeCocktailInterfaceVcore.game.content.activity.gnomecooking.cocktails.GnomeCocktailInterface.FruitCocktailAcore.game.content.activity.gnomecooking.cocktails.PourMixerPluginMcore.game.content.activity.gnomecooking.cocktails.PourMixerPlugin.PouredDrink6core.game.node.entity.skill.cooking.ChocolateBarCutter/core.game.interaction.item.BraceletOfClayPlugin4core.game.interaction.item.EnchantJewelleryTabOption.core.game.interaction.item.GrandSeedPodHandler:core.game.interaction.item.GrandSeedPodHandler.LaunchPulse:core.game.interaction.item.GrandSeedPodHandler.SquashPulse!core.game.camerautils.CameraUtils"core.game.camerautils.PlayerCameracore.game.content.global.worldevents.penguinhns.PenguinManagerHcore.game.content.global.worldevents.penguinhns.PenguinManager.Companion>core.game.content.global.worldevents.penguinhns.PenguinSpawnerFcore.game.content.global.worldevents.penguinhns.PenguinSpawner.PenguinDcore.game.content.global.worldevents.penguinhns.PenguinSpyingHandlerMcore.game.content.global.worldevents.penguinhns.PenguinSpyingHandler.SpyPulse8core.game.node.entity.combat.equipment.EquipmentDegraderGcore.game.node.entity.combat.equipment.EquipmentDegrader.StaticDegrader-core.game.world.repository.DisconnectionQueue@core.game.world.repository.DisconnectionQueue.DisconnectionEntry%core.game.world.repository.Repository.core.game.node.entity.state.newsys.PlayerState(core.game.node.entity.state.newsys.State2core.game.node.entity.state.newsys.StateRepository7core.game.interaction.item.withobject.CoalTrucksHandlerHcore.game.interaction.item.withobject.CoalTrucksHandler.useCoalWithTruckWcore.game.node.entity.skill.construction.decoration.portalchamber.PortalChamberDialogue.plugin.ai.minigamebots.pestcontrol.CombatState:plugin.ai.minigamebots.pestcontrol.CombatStateIntermediate6plugin.ai.minigamebots.pestcontrol.PestControlTestBot2core.game.system.command.rottenpotato.RottenPotatoRSHDDialogue@core.game.system.command.rottenpotato.RottenPotatoUseWithHandler)core.net.packet.in.ItemOnGroundItemPacket)core.net.packet.in.QuickChatPacketHandlercore.net.packet.in.QCPacketType6core.game.content.zone.keldagrim.CartConductorDialogue7core.game.content.zone.keldagrim.DwarvenBoatmanDialogue,core.game.content.zone.keldagrim.travelPulse5core.game.content.zone.keldagrim.KeldagrimCartMethods9core.game.content.zone.keldagrim.TravelFromKeldagrimPulse7core.game.content.zone.keldagrim.TravelToKeldagrimPulse8core.game.content.zone.keldagrim.KeldagrimOptionHandlers3core.game.content.zone.keldagrim.GETrapdoorDialogue0core.game.content.zone.keldagrim.ReinaldDialogue5core.game.content.zone.keldagrim.ReinaldOptionHandlerAcore.game.content.zone.keldagrim.ReinaldSmithingEmporiumInterface8core.game.node.entity.equipment.BarrowsEquipmentRegister4core.game.node.entity.equipment.PVPEquipmentRegister7core.game.node.entity.equipment.SnowballEquipmentPlugin@core.game.content.activity.fishingtrawler.FishingTrawlerActivityEcore.game.content.activity.fishingtrawler.FishingTrawlerOptionHandler9core.game.content.activity.fishingtrawler.NetLootDialogue;core.game.content.activity.fishingtrawler.NetRepairDialogue?core.game.content.activity.fishingtrawler.FishingTrawlerOverlayGcore.game.content.activity.fishingtrawler.FishingTrawlerRewardInterface?core.game.content.activity.fishingtrawler.FishingTrawlerSessionMcore.game.content.activity.fishingtrawler.FishingTrawlerSession.SwapBoatPulseLcore.game.content.activity.fishingtrawler.FishingTrawlerSession.TrawlerPulse=core.game.content.activity.fishingtrawler.TrawlerLogoutPlugin5core.game.content.activity.fishingtrawler.TrawlerLoot:core.game.node.entity.skill.agility.BarbarianOutpostCourseQcore.game.node.entity.skill.agility.BarbarianOutpostCourse.BarbarianGuardDialogueDcore.game.node.entity.skill.agility.BarbarianOutpostCourse.Companion9core.game.node.entity.skill.agility.GnomeStrongholdCourseCcore.game.node.entity.skill.agility.GnomeStrongholdCourse.Companion4core.game.node.entity.skill.agility.WildernessCourse>core.game.node.entity.skill.agility.WildernessCourse.Companion5core.game.content.quest.members.allfiredup.AllFiredUp@core.game.content.quest.members.allfiredup.BlazeSharpeyeDialogue=core.game.content.quest.members.allfiredup.SquireFyreDialogueEcore.game.content.quest.members.thefremenniktrials.AskeladdenDialogueFcore.game.content.quest.members.thefremenniktrials.BeerOnCouncilWorkerAcore.game.content.quest.members.thefremenniktrials.BranchFletcherVcore.game.content.quest.members.thefremenniktrials.BranchFletcher.BranchFletchingPulseAcore.game.content.quest.members.thefremenniktrials.ChieftanBrundtHcore.game.content.quest.members.thefremenniktrials.CouncilWorkerDialogue:core.game.content.quest.members.thefremenniktrials.DraugenAcore.game.content.quest.members.thefremenniktrials.KegOnKegAction@core.game.content.quest.members.thefremenniktrials.LalliDialogue@core.game.content.quest.members.thefremenniktrials.ManniDialogueNcore.game.content.quest.members.thefremenniktrials.ManniDialogue.DrinkingPulse>core.game.content.quest.members.thefremenniktrials.OlafTheBard?core.game.content.quest.members.thefremenniktrials.PipeInserterAcore.game.content.quest.members.thefremenniktrials.PoisonSalesmanCcore.game.content.quest.members.thefremenniktrials.SigliTheHuntsmanEcore.game.content.quest.members.thefremenniktrials.SwayingTreeHandlerScore.game.content.quest.members.thefremenniktrials.SwayingTreeHandler.ChoppingPulse@core.game.content.quest.members.thefremenniktrials.SwensenLadderAcore.game.content.quest.members.thefremenniktrials.SwensenPortalsJcore.game.content.quest.members.thefremenniktrials.SwensenPortals.destRoomFcore.game.content.quest.members.thefremenniktrials.SwensenTheNavigatorBcore.game.content.quest.members.thefremenniktrials.TalismanHandlerBcore.game.content.quest.members.thefremenniktrials.TinderboxOnBombAcore.game.node.entity.skill.crafting.lightsources.LanternCraftingIcore.game.node.entity.skill.crafting.lightsources.LightSourceExtinguisherDcore.game.node.entity.skill.crafting.lightsources.LightSourceLighter>core.game.node.entity.skill.crafting.lightsources.LightSourcesHcore.game.node.entity.skill.crafting.lightsources.LightSources.Companion-plugin.ai.general.scriptrepository.Adventurer3plugin.ai.general.scriptrepository.Adventurer.State0plugin.ai.general.scriptrepository.ChickenKiller6plugin.ai.general.scriptrepository.ChickenKiller.State,plugin.ai.general.scriptrepository.CoalMiner9plugin.ai.general.scriptrepository.CoalMiner.BankingPulse2plugin.ai.general.scriptrepository.CoalMiner.State,plugin.ai.general.scriptrepository.CowKiller2plugin.ai.general.scriptrepository.CowKiller.State0plugin.ai.general.scriptrepository.DraynorFisher6plugin.ai.general.scriptrepository.DraynorFisher.State1plugin.ai.general.scriptrepository.DraynorWillows7plugin.ai.general.scriptrepository.DraynorWillows.State0plugin.ai.general.scriptrepository.FarmerThiever7plugin.ai.general.scriptrepository.FletchingBankstander=plugin.ai.general.scriptrepository.FletchingBankstander.State3plugin.ai.general.scriptrepository.GenericSlayerBot9plugin.ai.general.scriptrepository.GenericSlayerBot.State8plugin.ai.general.scriptrepository.GenericSlayerBot.Task;plugin.ai.general.scriptrepository.GenericSlayerBot.TaskHub>plugin.ai.general.scriptrepository.GenericSlayerBot.Assignment:plugin.ai.general.scriptrepository.GlassBlowingBankstander@plugin.ai.general.scriptrepository.GlassBlowingBankstander.State4plugin.ai.general.scriptrepository.GreenDragonKiller:plugin.ai.general.scriptrepository.GreenDragonKiller.StateAplugin.ai.general.scriptrepository.GreenDragonKiller.MeleeSwinger@plugin.ai.general.scriptrepository.GreenDragonKiller.MageSwingerAplugin.ai.general.scriptrepository.GreenDragonKiller.RangeSwinger(plugin.ai.general.scriptrepository.Idler1plugin.ai.general.scriptrepository.LobsterCatcher6plugin.ai.general.scriptrepository.LobsterCatcher.Sets7plugin.ai.general.scriptrepository.LobsterCatcher.State-plugin.ai.general.scriptrepository.ManThiever2plugin.ai.general.scriptrepository.NonBankingMiner3plugin.ai.general.scriptrepository.PlayerCompatible0plugin.ai.general.scriptrepository.PlayerScripts=plugin.ai.general.scriptrepository.PlayerScripts.PlayerScript4plugin.ai.general.scriptrepository.ScriptDescription3plugin.ai.general.scriptrepository.ScriptIdentifier-plugin.ai.general.scriptrepository.ScriptName,plugin.ai.general.scriptrepository.SeersFlax2plugin.ai.general.scriptrepository.SeersFlax.State2plugin.ai.general.scriptrepository.SeersMagicTrees8plugin.ai.general.scriptrepository.SeersMagicTrees.State/plugin.ai.general.scriptrepository.SharkCatcher4plugin.ai.general.scriptrepository.SharkCatcher.Sets5plugin.ai.general.scriptrepository.SharkCatcher.State6plugin.ai.general.scriptrepository.VarrockEssenceMinercore.game.interaction.CorporealBeastWarningInterface.Companion)core.game.interaction.FOGRewardsInterface2core.game.interaction.FOGRewardsInterface.ShopItem%core.game.interaction.ItemOnBankBooth"core.game.interaction.QCRepository7core.game.node.entity.player.info.stats.StatsCommandSet0core.game.node.entity.skill.construction.Hotspot8core.game.node.entity.state.newsys.states.AvaDeviceState7core.game.node.entity.state.newsys.states.DiseasedState6core.game.node.entity.state.newsys.states.FarmingState>core.game.node.entity.state.newsys.states.GodspellChargedState8core.game.node.entity.state.newsys.states.IncubatorState;core.game.node.entity.state.newsys.states.ShootingStarState6core.game.node.entity.state.newsys.states.SkulledState#plugin.ai.general.GeneralBotCreator2plugin.ai.general.GeneralBotCreator.BotScriptPulse3plugin.ai.general.GeneralBotCreator.TransitionPulseplugin.ai.general.ScriptAPI*plugin.ai.general.ScriptAPI.BottingOverlay$core.game.world.callback.CallbackHub0core.game.content.ame.events.SandwichLadyHandler2core.game.content.ame.events.SandwichLadyInterface.core.game.content.ame.events.SandwichLadyEvent>core.game.content.ame.events.SandwichLadyEvent.SandwichLadyNPC>core.game.content.global.worldevents.holiday.CandyRewardPlugin9core.game.content.global.worldevents.holiday.GrimDialogueAcore.game.content.global.worldevents.holiday.SimpleHalloweenEvent(core.game.world.map.path.SmartPathfindercore.JSONUtilscore.JSONUtils.Companion core.Servercore.ServerConstantscore.ServerConstants.Companion7core.game.node.entity.combat.handlers.MagicSwingHandler7core.game.node.entity.combat.handlers.MeleeSwingHandlerAcore.game.node.entity.combat.handlers.MeleeSwingHandler.Companion7core.game.node.entity.combat.handlers.MultiSwingHandler7core.game.node.entity.combat.handlers.RangeSwingHandlerAcore.game.node.entity.combat.handlers.RangeSwingHandler.Companioncore.game.node.entity.skill.hunter.tracking.PolarKebbitHunting;core.game.node.entity.skill.hunter.tracking.TrailDefinition5core.game.node.entity.skill.hunter.tracking.TrailType?core.game.content.activity.gnomecooking.battas.GnomeBattaCookerCcore.game.content.activity.gnomecooking.battas.GnomeBattaDishFillerBcore.game.content.activity.gnomecooking.battas.GnomeBattaGarnisherBcore.game.content.activity.gnomecooking.battas.GnomeBattaInterfacePcore.game.content.activity.gnomecooking.battas.GnomeBattaInterface.CookedProductGcore.game.content.activity.gnomecooking.battas.GnomeBattaPrepareHandler3core.game.node.entity.player.info.login.LoginParser=core.game.node.entity.player.info.login.LoginParser.Companion8core.game.node.entity.player.info.login.PlayerSaveParser3core.game.node.entity.player.info.login.PlayerSaver5core.game.content.consumable.effects.RestoreSummoningcore.game.node.entity.skill.herblore.GrindItemPlugin.Companion*plugin.ai.skillingbot.SkillingBotAssembler1plugin.ai.skillingbot.SkillingBotAssembler.Wealth:core.game.node.entity.combat.special.LiquefySpecialHandler4core.game.node.entity.skill.skillcapeperks.Skillcape>core.game.node.entity.skill.skillcapeperks.Skillcape.CompanionCcore.game.node.entity.skill.skillcapeperks.SkillcapeEquipmentPluginAcore.game.node.entity.skill.skillcapeperks.SkillcapeOperatePlugin9core.game.node.entity.skill.skillcapeperks.SkillcapePerksKcore.game.node.entity.skill.skillcapeperks.SkillcapePerks.MagicCapeDialogueHcore.game.node.entity.skill.skillcapeperks.SkillcapePerks.RCCapeDialogueCcore.game.node.entity.skill.skillcapeperks.SkillcapePerks.CompanionJcore.game.node.entity.skill.construction.decoration.ConstructionDoorPluginTcore.game.node.entity.skill.construction.decoration.ConstructionDoorPlugin.Companion,core.game.interaction.item.withitem.CapeDyer1core.game.interaction.item.withitem.CapeDyer.Cape;core.game.interaction.item.withitem.CapeDyer.Cape.Companion'core.game.world.update.MapChunkRenderer"core.game.world.update.NPCRenderer%core.game.world.update.PlayerRenderer"core.game.world.update.UpdateMasks,core.game.world.update.UpdateMasks.Companion%core.game.world.update.UpdateSequence/core.game.world.update.UpdateSequence.Companion(core.plugin.quest.fremtrials.FishOnAltar4core.plugin.quest.fremtrials.FishOnAltar.moveToPulse4core.plugin.quest.fremtrials.FishOnAltar.spiritPulse.core.plugin.quest.fremtrials.LyreOptionHandler8core.plugin.quest.fremtrials.LyreOptionHandler.telePulse-core.game.interaction.player.PeltOptionPlugin)core.game.content.dialogue.AberabDialogue-core.game.content.dialogue.AchiettiesDialogue,core.game.content.dialogue.AfflictedDialogue(core.game.content.dialogue.AfrahDialogue.core.game.content.dialogue.AgilityBossDialogue*core.game.content.dialogue.AgmundiDialogue0core.game.content.dialogue.AluftGianneJrDialogue1core.game.content.dialogue.AluftGianneSnrDialogueFcore.game.content.dialogue.AluftGianneSnrDialogue.GnomeRestaurantPulse(core.game.content.dialogue.AsyffDialogue,core.game.content.dialogue.BlurberryDialogue1core.game.content.dialogue.BrotherBordissDialogue(core.game.content.dialogue.ElsieDialogue*core.game.content.dialogue.GabootyDialogue+core.game.content.dialogue.GeoffreyDialogue(core.game.content.dialogue.IffieDialogue/core.game.content.dialogue.LegendsGuardDialogue(core.game.content.dialogue.LensaDialogue)core.game.content.dialogue.MistagDialogue1core.game.content.dialogue.OttoGodblessedDialogue/core.game.content.dialogue.SkillDialogueHandler=core.game.content.dialogue.SkillDialogueHandler.SkillDialogueHcore.game.content.dialogue.SkillDialogueHandler.SkillDialogue.ONE_OPTIONHcore.game.content.dialogue.SkillDialogueHandler.SkillDialogue.TWO_OPTIONJcore.game.content.dialogue.SkillDialogueHandler.SkillDialogue.THREE_OPTIONIcore.game.content.dialogue.SkillDialogueHandler.SkillDialogue.FOUR_OPTIONIcore.game.content.dialogue.SkillDialogueHandler.SkillDialogue.FIVE_OPTIONGcore.game.content.dialogue.SkillDialogueHandler.SkillDialogue.Companion9core.game.content.dialogue.SkillDialogueHandler.Companion*core.game.content.dialogue.ThormacDialogue3core.game.content.dialogue.WysonTheGardenerDialogue=core.game.content.dialogue.WysonTheGardenerDialogue.Companion(core.game.interaction.city.IsafdarPlugin*core.game.interaction.city.MorytaniaPlugin!core.game.content.jobs.JobManager+core.game.content.jobs.WorkForOptionHandler=core.game.content.jobs.WorkForOptionHandler.CancelJobDialoguecore.game.system.SystemLoggerHcore.game.node.entity.skill.construction.decoration.costume.ToyBoxPluginOcore.game.node.entity.skill.construction.decoration.chapel.ShieldBlessingPlugin1core.game.node.entity.skill.farming.CropHarvester6core.game.node.entity.skill.farming.DigUpPatchDialogue0core.game.node.entity.skill.farming.FarmingPatch:core.game.node.entity.skill.farming.FarmingPatch.Companion5core.game.node.entity.skill.farming.InspectionHandler)core.game.node.entity.skill.farming.Patch.core.game.node.entity.skill.farming.PatchRaker-core.game.node.entity.skill.farming.PatchType-core.game.node.entity.skill.farming.Plantable7core.game.node.entity.skill.farming.Plantable.Companion7core.game.node.entity.skill.farming.UseWithPatchHandler>core.game.content.global.worldevents.shootingstar.ShootingStarBcore.game.content.global.worldevents.shootingstar.ShootingStarTypeFcore.game.content.global.worldevents.shootingstar.ShootingStarCommandsCcore.game.content.global.worldevents.shootingstar.ShootingStarEventMcore.game.content.global.worldevents.shootingstar.ShootingStarEvent.StarPulseCcore.game.content.global.worldevents.shootingstar.ShootingStarLoginIcore.game.content.global.worldevents.shootingstar.ShootingStarMiningPulseKcore.game.content.global.worldevents.shootingstar.ShootingStarOptionHandlerUcore.game.content.global.worldevents.shootingstar.ShootingStarOptionHandler.CompanionDcore.game.content.global.worldevents.shootingstar.StarSpriteDialoguecore.worker.MajorUpdateWorker?core.game.content.quest.members.thelosttribe.CaveGoblinMinerNPCcore.game.content.quest.members.thelosttribe.LostTribeCutsceneCcore.game.content.quest.members.thelosttribe.LostTribeOptionHandlercore.game.content.quest.members.thelosttribe.PickpocketSigmund@core.game.content.quest.members.thelosttribe.SigmundChestHandlerplugin.creditshop.CreditShopcore.gui.ConsoleFramecore.game.ge.BuyingLimitation)core.game.node.entity.impl.GameAttributes/core.game.node.entity.player.link.prayer.Prayer6core.game.node.entity.player.link.ConfigurationManager.core.game.content.dialogue.DialogueInterpreter-core.game.container.access.InterfaceContainercore.net.packet.IncomingPacket)core.plugin.CorePluginTypes.ManagerPlugin0core.game.system.communication.CommunicationInfocore.plugin.Plugin#core.net.amsc.ManagementServerState%core.game.content.global.SkillingPets(core.game.content.global.BossKillCountercore.net.IoReadEvent?core.game.node.entity.player.link.diary.AchievementDiaryManager1core.game.node.entity.combat.equipment.Ammunition>core.game.content.quest.tutorials.tutorialisland.TutorialStage0core.game.node.entity.combat.equipment.SpellType%core.game.interaction.DestinationFlag+core.game.container.impl.EquipmentContainer'core.game.node.entity.state.EntityState/core.game.node.entity.npc.agg.AggressiveHandlercore.game.content.eco.EcoStatus&core.game.node.entity.skill.SkillPulseUcore.game.node.entity.skill.construction.decoration.portalchamber.PortalChamberPlugin2core.game.node.entity.player.link.InterfaceManager)core.game.node.entity.skill.slayer.Master3core.game.world.update.flag.player.FaceLocationFlag,core.game.node.entity.player.info.RenderInfocore.game.node.entity.Entity7core.game.node.entity.skill.runecrafting.MysteriousRuin,core.game.node.entity.skill.magic.MagicSpell'core.game.node.entity.impl.WalkingQueue(core.game.node.entity.player.info.Rights@core.game.content.quest.PluginInteractionManager.InteractionTypecore.game.ge.GEItemSet7core.game.node.entity.combat.ImpactHandler.HitsplatTypecore.game.container.Container(core.game.content.consumable.Consumables%core.game.node.entity.lock.LockElapse%core.game.node.entity.npc.AbstractNPC2core.game.node.entity.player.link.music.MusicEntry&core.game.node.entity.state.StatePulse8core.game.node.entity.skill.fletching.Fletching.GemBolts$core.game.world.map.zone.ZoneMonitor3core.game.node.entity.player.link.prayer.PrayerType)core.game.world.map.path.ClipMaskSupplier:core.game.node.entity.player.info.login.LoginConfiguration)core.game.content.quest.PluginInteraction0core.game.node.entity.skill.construction.Servant0core.game.node.entity.combat.equipment.ArmourSet#core.game.node.entity.impl.Animatorcore.game.world.map.RegionChunkplugin.ai.AIPBuilder1core.game.node.entity.combat.ImpactHandler.Impact,core.game.node.entity.npc.drop.RareDropTable1core.game.node.entity.player.info.login.LoginType-core.game.node.entity.skill.construction.Room)core.game.interaction.npc.bob.BobDialogue'core.game.content.global.SkillcapePerks4core.game.node.entity.player.link.audio.AudioManagercore.game.world.map.Location-core.game.node.entity.player.link.audio.Audio core.net.amsc.MSPacketRepository+core.game.node.entity.player.link.SavedData&core.game.container.impl.BankContainercore.plugin.PluginType)core.game.content.dialogue.DialoguePlugin/core.game.node.entity.skill.fletching.Fletchingcore.net.packet.Context)core.game.node.entity.skill.smithing.Bars3core.game.node.entity.skill.agility.AgilityShortcut$core.cache.def.impl.ObjectDefinition)core.game.content.activity.CutscenePlugincore.cache.Cache.core.game.node.entity.skill.runecrafting.Altar/core.game.container.access.BitregisterAssembler-core.game.world.update.flag.context.AnimationGcore.game.node.entity.combat.equipment.WeaponInterface.WeaponInterfaces'core.game.content.consumable.Consumable@core.game.content.quest.tutorials.tutorialisland.CharacterDesign.core.game.content.global.travel.glider.Gliders.core.game.node.entity.player.link.emote.Emotes#plugin.ai.wilderness.PvPBotsBuilder1core.game.content.global.action.DoorActionHandler,core.game.world.update.flag.context.Graphics'core.game.content.eco.EconomyManagement core.game.world.map.zone.MapZonecore.game.node.item.GroundItem#core.game.component.ComponentPlugin1core.game.node.entity.combat.equipment.BoltEffect6core.game.interaction.item.toys.DiangoReclaimInterface"core.cache.def.impl.ItemDefinitionplugin.ai.pvp.PVPAIPActions/core.game.world.repository.InitializingNodeList(core.game.node.entity.impl.ForceMovement:core.game.node.entity.skill.crafting.spinning.SpinningItemcore.game.world.map.zone.Zone+core.game.content.dialogue.FacialExpression-core.game.node.entity.player.link.quest.Quest plugin.ai.pvp.PVPAIPBuilderUtils4core.game.node.entity.player.info.login.PlayerParsercore.net.Constantscore.game.ge.OfferState:core.game.content.quest.miniquest.barcrawl.BarcrawlManagercore.tools.StringUtils#core.game.interaction.MovementPulse*core.game.content.activity.ActivityManagercore.cache.misc.Container2core.game.node.entity.player.link.SpellBookManager,core.game.world.map.zone.impl.WildernessZoneplugin.ai.pvmbots.PvMBotscore.game.node.Node$core.cache.def.impl.VarbitDefinition#core.game.node.object.ObjectBuilder&core.game.content.activity.mta.MTAZone0core.game.content.quest.PluginInteractionManager"core.game.system.task.TaskExecutorcore.game.system.SystemUpdatecore.game.system.SystemState/core.game.world.update.flag.context.ChatMessage#core.game.interaction.OptionHandler%core.game.node.entity.impl.Projectile1core.game.node.entity.player.link.TeleportManager$core.game.interaction.UseWithHandler7core.game.node.entity.skill.construction.RoomProperties#core.game.system.command.CommandSet/core.game.node.entity.skill.gather.SkillingTool(core.game.node.entity.skill.slayer.Tasks#core.game.content.global.RepairItem!core.game.world.callback.CallBack:core.game.node.entity.skill.summoning.familiar.BurdenBeast$core.game.world.map.zone.ZoneBuilder(core.game.node.entity.combat.CombatStyle-core.game.content.consumable.ConsumableEffectcore.net.amsc.WorldCommunicatorcore.game.world.map.Region9core.game.node.entity.player.info.portal.PlayerSQLManager5core.game.node.entity.skill.construction.HousingStylecore.game.world.map.Point7core.game.node.entity.skill.summoning.familiar.Familiar1core.game.node.entity.skill.herblore.GrindingItem$core.plugin.CorePluginTypes.Managers3core.game.node.entity.skill.construction.Decoration5core.game.node.entity.skill.construction.BuildHotspot5core.game.content.quest.members.asoulsbane.ASoulsBane core.Util0core.game.node.entity.player.link.IronmanManager$core.game.interaction.NodeUsageEvent2core.game.content.global.action.ClimbActionHandlercore.game.system.task.NodeTask(core.game.node.entity.combat.CombatSpell core.net.packet.PacketRepository>core.game.node.entity.player.link.TeleportManager.TeleportType-core.game.content.ttrail.TreasureTrailManager7core.game.node.entity.player.link.appearance.Appearance-core.game.node.entity.skill.summoning.pet.Pet!core.game.content.global.BirdNestcore.game.node.entity.skill.fletching.Fletching.FletchingItems2core.game.node.entity.combat.equipment.RangeWeapon6core.game.node.entity.combat.equipment.WeaponInterface9core.game.interaction.item.brawling_gloves.BrawlingGloves@core.game.content.quest.tutorials.tutorialisland.TutorialSession1core.game.world.update.flag.player.AppearanceFlagcore.game.component.Component*core.game.node.entity.player.link.Settings7core.game.node.entity.player.link.quest.QuestRepository,core.game.node.entity.player.link.GlobalData&core.game.content.activity.mta.MTAType4core.game.node.entity.skill.gather.mining.MiningNode@core.game.content.activity.pestcontrol.PestControlActivityPlugin)core.game.content.ttrail.ClueScrollPluginCcore.game.content.global.worldevents.shootingstar.ScoreboardManager'core.game.node.entity.skill.magic.Runes0core.game.node.entity.player.info.login.Response6core.game.node.entity.skill.construction.HouseLocation-core.game.node.entity.player.link.IronmanMode8core.game.node.entity.combat.equipment.Weapon.WeaponType#core.game.world.repository.NodeList#core.game.node.entity.player.Player3core.game.node.entity.player.link.music.MusicPlayercore.game.world.map.Direction!core.game.component.InterfaceTypecore.net.NioReactor"core.game.ge.GrandExchangeDatabase core.game.content.global.GodType#core.game.world.map.path.Pathfindercore.cache.def.Definition1core.game.node.entity.player.link.diary.DiaryType1core.game.node.entity.skill.construction.NailType4core.game.node.entity.skill.summoning.pet.PetDetails:core.game.node.entity.player.link.BankPinManager.PinStatus3core.game.node.entity.player.link.appearance.Gender)core.game.content.activity.ActivityPlugin0core.net.packet.context.CameraContext.CameraTypecore.net.packet.PacketHeader-core.game.node.entity.combat.equipment.Weaponcore.game.system.SystemManager-core.game.system.communication.ClanRepository)core.game.node.entity.player.info.UIDInfo$core.game.content.ame.AntiMacroEvent(core.game.node.entity.combat.BattleState+core.game.node.entity.player.link.RunScript4core.game.node.entity.player.link.grave.GraveManager"core.game.content.ttrail.ClueLevel*core.game.node.entity.combat.ImpactHandlercore.game.ge.GrandExchangeEntry%plugin.ai.resource.ResourceAIPActions1core.game.node.entity.skill.crafting.GlassProduct4core.game.node.entity.skill.summoning.SummoningPouchcore.game.node.entity.npc.NPC4core.game.node.entity.player.link.emote.EmoteManager8core.game.node.entity.player.link.diary.AchievementDiary+core.game.system.security.EncryptionManager,core.game.node.entity.impl.Animator.Priority2core.game.node.entity.skill.agility.AgilityHandler1core.game.node.entity.skill.agility.AgilityCourse core.game.node.object.GameObject@core.game.interaction.item.brawling_gloves.BrawlingGlovesManagercore.game.node.item.ChanceItemcore.net.IoSession4core.game.node.entity.player.info.login.SavingModule&core.game.node.entity.lock.ActionLocks'core.game.world.map.build.DynamicRegion.core.game.node.entity.player.link.SkullManager!core.game.interaction.Interaction*core.game.interaction.inter.GlassInterface0core.game.node.entity.skill.slayer.SlayerManager,core.game.node.entity.npc.drop.DropFrequency'core.game.world.update.flag.PlayerFlagscore.net.packet.IoBuffer#core.game.system.monitor.MessageLog"core.game.node.entity.skill.Skills core.tools.mysql.DatabaseManagercore.game.content.global.Dyescore.game.world.map.path.Path)plugin.ai.general.scriptrepository.Scriptcore.game.interaction.Option(core.game.node.entity.state.StateManager9core.game.content.activity.mta.impl.EnchantingZone.Shapes&core.game.content.ame.AntiMacroHandler&core.game.node.entity.combat.DeathTaskcore.game.node.item.ItemPlugincore.tools.TimeStamp(core.game.world.map.zone.ZoneRestrictioncore.cache.CacheFileManagercore.tools.RandomFunction$core.game.world.map.zone.ZoneBordersplugin.ai.pvmbots.NoobBot!core.game.world.map.RegionManager8core.game.interaction.item.TeleTabsOptionPlugin.TeleTabs5core.game.node.entity.skill.summoning.SummoningScroll'core.game.system.monitor.DuplicationLog>core.game.node.entity.skill.summoning.familiar.FamiliarManager%core.game.container.ContainerListenerBcore.game.node.entity.combat.equipment.WeaponInterface.AttackStylecore.game.world.map.Viewport0core.game.node.entity.player.link.BankPinManager/core.game.node.entity.player.info.PlayerDetails&core.game.world.update.flag.UpdateFlag+core.game.node.entity.player.link.QuestData.core.game.node.entity.player.link.ActivityData)plugin.ai.skillingbot.SkillingBotsBuilderplugin.ai.pvmbots.DragonKiller6core.game.node.entity.skill.summoning.pet.IncubatorEgg%core.cache.misc.ContainersInformation!core.cache.def.impl.NPCDefinition5core.game.node.entity.skill.construction.HouseManager5core.game.node.entity.player.link.appearance.BodyPart"core.game.content.global.shop.Shop,core.game.node.entity.npc.drop.NPCDropTables%core.game.node.item.GroundItemManager4core.game.node.entity.skill.construction.ServantTypecore.cache.crypto.ISAACCipher0core.game.node.entity.player.link.PacketDispatch&core.cache.misc.buffer.ByteBufferUtils%core.net.packet.context.CameraContext)core.game.content.dialogue.DialogueActioncore.cache.ServerStoreplugin.ai.AIPlayercore.game.component.CloseEvent:core.game.node.entity.combat.equipment.DegradableEquipment&core.game.system.mysql.SQLEntryHandler)core.plugin.CorePluginTypes.StartupPlugin9core.game.content.activity.pestcontrol.PestControlSession:core.game.interaction.npc.bob.BobDialogue.BarrowsEquipmentcore.game.world.map.RegionPlanecore.plugin.PluginManifest&core.game.system.monitor.PlayerMonitor3core.game.node.entity.combat.equipment.SwitchAttack2core.game.node.entity.skill.runecrafting.RunePouch2core.game.content.activity.mta.impl.EnchantingZone%core.game.node.entity.impl.PropertiesOcore.game.interaction.npc.bob.BobDialogue.BarrowsEquipment.BarrowsFullEquipment'core.game.node.entity.impl.PulseManager1core.game.node.entity.player.link.grave.GraveType1core.game.node.entity.skill.farming.HealthCheckerDcore.game.node.entity.skill.gather.woodcutting.WoodcuttingSkillPulse7core.game.node.entity.skill.farming.FruitAndBerryPicker/core.game.node.entity.skill.farming.CompostType.core.game.node.entity.skill.farming.CompostBin/core.game.node.entity.skill.farming.CompostBins9core.game.node.entity.skill.farming.CompostBins.Companion5core.game.node.entity.skill.farming.UseWithBinHandler#core.net.packet.in.ItemActionPacket;core.game.node.entity.skill.farming.CompostBinOptionHandler$core.net.packet.in.InteractionPacket;core.game.node.entity.skill.farming.ToolLeprechaunInterface \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len new file mode 100644 index 000000000..4a4044ded Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len new file mode 100644 index 000000000..48fdc8f01 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values new file mode 100644 index 000000000..77144529f Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at new file mode 100644 index 000000000..c2486c0d2 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.s new file mode 100644 index 000000000..454154d2d --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.s @@ -0,0 +1 @@ +BE_ \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i new file mode 100644 index 000000000..508368003 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab new file mode 100644 index 000000000..4424d4f30 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream new file mode 100644 index 000000000..8f4c7a7fb Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream.len new file mode 100644 index 000000000..bba171db4 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.len new file mode 100644 index 000000000..9911af505 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values new file mode 100644 index 000000000..cba0e30f2 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.at new file mode 100644 index 000000000..0a23147bb Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.s new file mode 100644 index 000000000..8c4b1c248 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab.values.s @@ -0,0 +1 @@ +ܼѸ \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i new file mode 100644 index 000000000..af21a7c36 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/constants.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab new file mode 100644 index 000000000..da8d57663 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream new file mode 100644 index 000000000..e93d56e22 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream @@ -0,0 +1,2 @@ + GatheringJobs +SlayingJob0core/game/system/command/oldsys/AIPCommandPlugin8core/game/system/command/oldsys/AIPCommandPlugin$parse$25core/game/system/command/oldsys/SimpleDumpingCommands-core/game/system/command/oldsys/VisualCommand5core/game/system/command/oldsys/VisualCommand$parse$15core/game/system/command/oldsys/VisualCommand$parse$25core/game/system/command/oldsys/VisualCommand$parse$35core/game/system/command/oldsys/VisualCommand$parse$45core/game/system/command/oldsys/VisualCommand$parse$55core/game/system/command/oldsys/VisualCommand$parse$65core/game/system/command/oldsys/VisualCommand$parse$7@core/game/content/activity/gnomecooking/cocktails/CocktailCookerMcore/game/content/activity/gnomecooking/cocktails/CocktailCooker$CookedDrinksGcore/game/content/activity/gnomecooking/cocktails/CocktailCooker$cook$1Bcore/game/content/activity/gnomecooking/cocktails/CocktailCookerKtBcore/game/content/activity/gnomecooking/cocktails/CocktailFinisherQcore/game/content/activity/gnomecooking/cocktails/CocktailFinisher$FinishedDrinksDcore/game/content/activity/gnomecooking/cocktails/CocktailFinisherKtGcore/game/content/activity/gnomecooking/cocktails/CocktailShakerHandlerHcore/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterfaceVcore/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface$FruitCocktailJcore/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterfaceKtAcore/game/content/activity/gnomecooking/cocktails/PourMixerPluginMcore/game/content/activity/gnomecooking/cocktails/PourMixerPlugin$PouredDrinkCcore/game/content/activity/gnomecooking/cocktails/PourMixerPluginKt6core/game/node/entity/skill/cooking/ChocolateBarCutter?core/game/node/entity/skill/cooking/ChocolateBarCutter$handle$1/core/game/interaction/item/BraceletOfClayPlugin4core/game/interaction/item/EnchantJewelleryTabOption=core/game/interaction/item/EnchantJewelleryTabOption$handle$16core/game/interaction/item/EnchantJewelleryTabOptionKt.core/game/interaction/item/GrandSeedPodHandler:core/game/interaction/item/GrandSeedPodHandler$LaunchPulse:core/game/interaction/item/GrandSeedPodHandler$SquashPulse0core/game/interaction/item/GrandSeedPodHandlerKt!core/game/camerautils/CameraUtils"core/game/camerautils/PlayerCameracore/game/content/global/worldevents/penguinhns/PenguinManagerHcore/game/content/global/worldevents/penguinhns/PenguinManager$Companion>core/game/content/global/worldevents/penguinhns/PenguinSpawnerFcore/game/content/global/worldevents/penguinhns/PenguinSpawner$PenguinDcore/game/content/global/worldevents/penguinhns/PenguinSpyingHandlerMcore/game/content/global/worldevents/penguinhns/PenguinSpyingHandler$SpyPulseUcore/game/content/global/worldevents/penguinhns/PenguinSpyingHandler$handle$movePulse8core/game/node/entity/combat/equipment/EquipmentDegraderGcore/game/node/entity/combat/equipment/EquipmentDegrader$StaticDegrader-core/game/world/repository/DisconnectionQueue@core/game/world/repository/DisconnectionQueue$DisconnectionEntry6core/game/world/repository/DisconnectionQueue$finish$1%core/game/world/repository/Repository.core/game/node/entity/state/newsys/PlayerState(core/game/node/entity/state/newsys/State2core/game/node/entity/state/newsys/StateRepository$core/tools/stringtools/StringToolsKt7core/game/interaction/item/withobject/CoalTrucksHandlerHcore/game/interaction/item/withobject/CoalTrucksHandler$useCoalWithTruckWcore/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.plugin/ai/minigamebots/pestcontrol/CombatState=plugin/ai/minigamebots/pestcontrol/CombatState$randomWalkTo$1?plugin/ai/minigamebots/pestcontrol/CombatState$walkToIterator$1:plugin/ai/minigamebots/pestcontrol/CombatStateIntermediateIplugin/ai/minigamebots/pestcontrol/CombatStateIntermediate$randomWalkTo$1Kplugin/ai/minigamebots/pestcontrol/CombatStateIntermediate$walkToIterator$16plugin/ai/minigamebots/pestcontrol/PestControlTestBot2core/game/system/command/rottenpotato/RottenPotatoRSHDDialogueGcore/game/system/command/rottenpotato/RottenPotatoRSHDDialogue$handle$6Gcore/game/system/command/rottenpotato/RottenPotatoRSHDDialogue$handle$7@core/game/system/command/rottenpotato/RottenPotatoUseWithHandler)core/net/packet/in/ItemOnGroundItemPacket2core/net/packet/in/ItemOnGroundItemPacket$decode$1)core/net/packet/in/QuickChatPacketHandler6core/net/packet/in/QuickChatPacketHandler$WhenMappingscore/net/packet/in/QCPacketType6core/game/content/zone/keldagrim/CartConductorDialogue8core/game/content/zone/keldagrim/CartConductorDialogueKt7core/game/content/zone/keldagrim/DwarvenBoatmanDialogue,core/game/content/zone/keldagrim/travelPulse5core/game/content/zone/keldagrim/KeldagrimCartMethods9core/game/content/zone/keldagrim/TravelFromKeldagrimPulse7core/game/content/zone/keldagrim/TravelToKeldagrimPulse8core/game/content/zone/keldagrim/KeldagrimOptionHandlers3core/game/content/zone/keldagrim/GETrapdoorDialogue2core/game/content/zone/keldagrim/KeldagrimPluginKt0core/game/content/zone/keldagrim/ReinaldDialogue5core/game/content/zone/keldagrim/ReinaldOptionHandler*core/game/content/zone/keldagrim/ReinaldKtAcore/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterfaceHcore/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface$open$1Ccore/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterfaceKt8core/game/node/entity/equipment/BarrowsEquipmentRegister4core/game/node/entity/equipment/PVPEquipmentRegister7core/game/node/entity/equipment/SnowballEquipmentPlugin@core/game/content/activity/fishingtrawler/FishingTrawlerActivityLcore/game/content/activity/fishingtrawler/FishingTrawlerActivity$configure$1Tcore/game/content/activity/fishingtrawler/FishingTrawlerActivity$configure$1$pulse$1Bcore/game/content/activity/fishingtrawler/FishingTrawlerActivityKtEcore/game/content/activity/fishingtrawler/FishingTrawlerOptionHandlerNcore/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$1Ncore/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$2Ncore/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler$handle$39core/game/content/activity/fishingtrawler/NetLootDialogue;core/game/content/activity/fishingtrawler/NetRepairDialogue?core/game/content/activity/fishingtrawler/FishingTrawlerOverlayAcore/game/content/activity/fishingtrawler/FishingTrawlerOverlayKtGcore/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface?core/game/content/activity/fishingtrawler/FishingTrawlerSessionMcore/game/content/activity/fishingtrawler/FishingTrawlerSession$SwapBoatPulseLcore/game/content/activity/fishingtrawler/FishingTrawlerSession$TrawlerPulse=core/game/content/activity/fishingtrawler/TrawlerLogoutPluginAcore/game/content/activity/fishingtrawler/FishingTrawlerSessionKt5core/game/content/activity/fishingtrawler/TrawlerLoot:core/game/node/entity/skill/agility/BarbarianOutpostCourseQcore/game/node/entity/skill/agility/BarbarianOutpostCourse$BarbarianGuardDialogueIcore/game/node/entity/skill/agility/BarbarianOutpostCourse$getSwimPulse$1Dcore/game/node/entity/skill/agility/BarbarianOutpostCourse$Companion9core/game/node/entity/skill/agility/GnomeStrongholdCourseCcore/game/node/entity/skill/agility/GnomeStrongholdCourse$Companion4core/game/node/entity/skill/agility/WildernessCourseMcore/game/node/entity/skill/agility/WildernessCourse$handleEntranceObstacle$1Acore/game/node/entity/skill/agility/WildernessCourse$handlePipe$1Kcore/game/node/entity/skill/agility/WildernessCourse$handleSteppingStones$1Gcore/game/node/entity/skill/agility/WildernessCourse$handleLogBalance$1Fcore/game/node/entity/skill/agility/WildernessCourse$handleRockClimb$1>core/game/node/entity/skill/agility/WildernessCourse$Companion5core/game/content/quest/members/allfiredup/AllFiredUp@core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue=core/game/content/quest/members/allfiredup/SquireFyreDialogueEcore/game/content/quest/members/thefremenniktrials/AskeladdenDialogueFcore/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorkerAcore/game/content/quest/members/thefremenniktrials/BranchFletcherVcore/game/content/quest/members/thefremenniktrials/BranchFletcher$BranchFletchingPulseAcore/game/content/quest/members/thefremenniktrials/ChieftanBrundtHcore/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue:core/game/content/quest/members/thefremenniktrials/DraugenAcore/game/content/quest/members/thefremenniktrials/KegOnKegActionJcore/game/content/quest/members/thefremenniktrials/KegOnKegAction$handle$1@core/game/content/quest/members/thefremenniktrials/LalliDialogue@core/game/content/quest/members/thefremenniktrials/ManniDialogueNcore/game/content/quest/members/thefremenniktrials/ManniDialogue$DrinkingPulse>core/game/content/quest/members/thefremenniktrials/OlafTheBard?core/game/content/quest/members/thefremenniktrials/PipeInserterRcore/game/content/quest/members/thefremenniktrials/PipeInserter$handle$toPipePulseAcore/game/content/quest/members/thefremenniktrials/PoisonSalesmanCcore/game/content/quest/members/thefremenniktrials/SigliTheHuntsmanEcore/game/content/quest/members/thefremenniktrials/SwayingTreeHandlerScore/game/content/quest/members/thefremenniktrials/SwayingTreeHandler$ChoppingPulseXcore/game/content/quest/members/thefremenniktrials/SwayingTreeHandler$handle$toTreePulse@core/game/content/quest/members/thefremenniktrials/SwensenLadderAcore/game/content/quest/members/thefremenniktrials/SwensenPortalsJcore/game/content/quest/members/thefremenniktrials/SwensenPortals$destRoomQcore/game/content/quest/members/thefremenniktrials/SwensenPortals$handle$toPortalFcore/game/content/quest/members/thefremenniktrials/SwensenTheNavigatorBcore/game/content/quest/members/thefremenniktrials/TalismanHandlerVcore/game/content/quest/members/thefremenniktrials/TalismanHandler$handle$DraugenPulseBcore/game/content/quest/members/thefremenniktrials/TinderboxOnBombAcore/game/node/entity/skill/crafting/lightsources/LanternCraftingIcore/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisherDcore/game/node/entity/skill/crafting/lightsources/LightSourceLighter>core/game/node/entity/skill/crafting/lightsources/LightSourcesHcore/game/node/entity/skill/crafting/lightsources/LightSources$Companion-plugin/ai/general/scriptrepository/Adventurer3plugin/ai/general/scriptrepository/Adventurer$State:plugin/ai/general/scriptrepository/Adventurer$WhenMappings4plugin/ai/general/scriptrepository/Adventurer$tick$1:plugin/ai/general/scriptrepository/Adventurer$tick$GEPulse?plugin/ai/general/scriptrepository/Adventurer$tick$BankingPulse0plugin/ai/general/scriptrepository/ChickenKiller6plugin/ai/general/scriptrepository/ChickenKiller$State=plugin/ai/general/scriptrepository/ChickenKiller$WhenMappings7plugin/ai/general/scriptrepository/ChickenKiller$tick$1,plugin/ai/general/scriptrepository/CoalMiner9plugin/ai/general/scriptrepository/CoalMiner$BankingPulse2plugin/ai/general/scriptrepository/CoalMiner$State9plugin/ai/general/scriptrepository/CoalMiner$WhenMappings3plugin/ai/general/scriptrepository/CoalMiner$tick$1,plugin/ai/general/scriptrepository/CowKiller2plugin/ai/general/scriptrepository/CowKiller$State9plugin/ai/general/scriptrepository/CowKiller$WhenMappings3plugin/ai/general/scriptrepository/CowKiller$tick$13plugin/ai/general/scriptrepository/CowKiller$tick$20plugin/ai/general/scriptrepository/DraynorFisher6plugin/ai/general/scriptrepository/DraynorFisher$State=plugin/ai/general/scriptrepository/DraynorFisher$WhenMappings7plugin/ai/general/scriptrepository/DraynorFisher$tick$11plugin/ai/general/scriptrepository/DraynorWillows7plugin/ai/general/scriptrepository/DraynorWillows$State>plugin/ai/general/scriptrepository/DraynorWillows$WhenMappings8plugin/ai/general/scriptrepository/DraynorWillows$tick$10plugin/ai/general/scriptrepository/FarmerThiever7plugin/ai/general/scriptrepository/FletchingBankstander=plugin/ai/general/scriptrepository/FletchingBankstander$StateDplugin/ai/general/scriptrepository/FletchingBankstander$WhenMappings3plugin/ai/general/scriptrepository/GenericSlayerBot9plugin/ai/general/scriptrepository/GenericSlayerBot$State8plugin/ai/general/scriptrepository/GenericSlayerBot$Task;plugin/ai/general/scriptrepository/GenericSlayerBot$TaskHub>plugin/ai/general/scriptrepository/GenericSlayerBot$Assignment@plugin/ai/general/scriptrepository/GenericSlayerBot$WhenMappings:plugin/ai/general/scriptrepository/GenericSlayerBot$tick$1:plugin/ai/general/scriptrepository/GenericSlayerBot$tick$2:plugin/ai/general/scriptrepository/GlassBlowingBankstander@plugin/ai/general/scriptrepository/GlassBlowingBankstander$StateGplugin/ai/general/scriptrepository/GlassBlowingBankstander$WhenMappings4plugin/ai/general/scriptrepository/GreenDragonKiller:plugin/ai/general/scriptrepository/GreenDragonKiller$StateAplugin/ai/general/scriptrepository/GreenDragonKiller$MeleeSwinger@plugin/ai/general/scriptrepository/GreenDragonKiller$MageSwingerAplugin/ai/general/scriptrepository/GreenDragonKiller$RangeSwingerAplugin/ai/general/scriptrepository/GreenDragonKiller$WhenMappings;plugin/ai/general/scriptrepository/GreenDragonKiller$tick$2;plugin/ai/general/scriptrepository/GreenDragonKiller$tick$3(plugin/ai/general/scriptrepository/Idler1plugin/ai/general/scriptrepository/LobsterCatcher6plugin/ai/general/scriptrepository/LobsterCatcher$Sets7plugin/ai/general/scriptrepository/LobsterCatcher$State>plugin/ai/general/scriptrepository/LobsterCatcher$WhenMappingsCplugin/ai/general/scriptrepository/LobsterCatcher$tick$BankingPulse8plugin/ai/general/scriptrepository/LobsterCatcher$tick$1-plugin/ai/general/scriptrepository/ManThiever2plugin/ai/general/scriptrepository/NonBankingMiner3plugin/ai/general/scriptrepository/PlayerCompatible0plugin/ai/general/scriptrepository/PlayerScripts=plugin/ai/general/scriptrepository/PlayerScripts$PlayerScript4plugin/ai/general/scriptrepository/ScriptDescription3plugin/ai/general/scriptrepository/ScriptIdentifier-plugin/ai/general/scriptrepository/ScriptName,plugin/ai/general/scriptrepository/SeersFlax2plugin/ai/general/scriptrepository/SeersFlax$State9plugin/ai/general/scriptrepository/SeersFlax$WhenMappings3plugin/ai/general/scriptrepository/SeersFlax$tick$23plugin/ai/general/scriptrepository/SeersFlax$tick$32plugin/ai/general/scriptrepository/SeersMagicTrees8plugin/ai/general/scriptrepository/SeersMagicTrees$State?plugin/ai/general/scriptrepository/SeersMagicTrees$WhenMappings9plugin/ai/general/scriptrepository/SeersMagicTrees$tick$1/plugin/ai/general/scriptrepository/SharkCatcher4plugin/ai/general/scriptrepository/SharkCatcher$Sets5plugin/ai/general/scriptrepository/SharkCatcher$Stateplugin/ai/general/scriptrepository/VarrockSmither$WhenMappings8plugin/ai/general/scriptrepository/VarrockSmither$tick$18plugin/ai/general/scriptrepository/VarrockSmither$tick$28core/game/content/activity/pestcontrol/PestControlHelperAcore/game/content/activity/pestcontrol/PestControlHelper$BoatInfo:core/game/node/entity/skill/gather/mining/MiningSkillPulseDcore/game/node/entity/skill/gather/mining/MiningSkillPulse$Companion/core/game/content/global/travel/EssenceTeleport6core/game/content/global/travel/EssenceTeleport$Wizard@core/game/content/global/travel/EssenceTeleport$Wizard$Companion:core/game/content/global/travel/EssenceTeleport$teleport$1.core/game/content/activity/barrows/RewardChestHcore/game/node/entity/skill/construction/decoration/workshop/ArmourStandWcore/game/node/entity/skill/construction/decoration/workshop/ArmourStand$RepairDialoguecore/net/event/LoginReadEvent'core/net/event/LoginReadEvent$Companion5core/net/event/LoginReadEvent$Companion$decodeWorld$1core/tools/Interfacescore/tools/Itemscore/tools/TickUtilsKt+core/game/content/activity/mta/EnchantSpell5core/game/content/activity/mta/EnchantSpell$Companion4core/game/interaction/CorporealBeastWarningInterface>core/game/interaction/CorporealBeastWarningInterface$Companion)core/game/interaction/FOGRewardsInterface2core/game/interaction/FOGRewardsInterface$ShopItem%core/game/interaction/ItemOnBankBooth.core/game/interaction/ItemOnBankBooth$handle$1"core/game/interaction/QCRepository/core/game/interaction/QCRepository$WhenMappings+core/game/interaction/QCRepository$sendQC$1$core/game/interaction/QCRepositoryKt;core/game/node/entity/player/info/stats/StatAttributeKeysKt7core/game/node/entity/player/info/stats/StatsCommandSetHcore/game/node/entity/player/info/stats/StatsCommandSet$defineCommands$10core/game/node/entity/skill/construction/Hotspot8core/game/node/entity/state/newsys/states/AvaDeviceStateFcore/game/node/entity/state/newsys/states/AvaDeviceState$createPulse$17core/game/node/entity/state/newsys/states/DiseasedStateEcore/game/node/entity/state/newsys/states/DiseasedState$createPulse$16core/game/node/entity/state/newsys/states/FarmingStateDcore/game/node/entity/state/newsys/states/FarmingState$createPulse$1Lcore/game/node/entity/state/newsys/states/FarmingState$createPulse$1$pulse$1>core/game/node/entity/state/newsys/states/GodspellChargedStateLcore/game/node/entity/state/newsys/states/GodspellChargedState$createPulse$18core/game/node/entity/state/newsys/states/IncubatorStateFcore/game/node/entity/state/newsys/states/IncubatorState$createPulse$1;core/game/node/entity/state/newsys/states/ShootingStarStateIcore/game/node/entity/state/newsys/states/ShootingStarState$createPulse$16core/game/node/entity/state/newsys/states/SkulledStateDcore/game/node/entity/state/newsys/states/SkulledState$createPulse$1#plugin/ai/general/GeneralBotCreator2plugin/ai/general/GeneralBotCreator$BotScriptPulse3plugin/ai/general/GeneralBotCreator$TransitionPulseplugin/ai/general/ScriptAPI*plugin/ai/general/ScriptAPI$BottingOverlay$plugin/ai/general/ScriptAPI$walkTo$1*plugin/ai/general/ScriptAPI$randomWalkTo$1,plugin/ai/general/ScriptAPI$walkToIterator$1*plugin/ai/general/ScriptAPI$teleportToGE$13plugin/ai/general/ScriptAPI$sellOnGE$toCounterPulse9plugin/ai/general/ScriptAPI$sellAllOnGe$toCounterPulseAllcore/game/content/ame/events/SandwichLadyHandler$handle$MoveTo2core/game/content/ame/events/SandwichLadyInterface.core/game/content/ame/events/SandwichLadyEvent>core/game/content/ame/events/SandwichLadyEvent$SandwichLadyNPC\core/game/content/ame/events/SandwichLadyEvent$SandwichLadyNPC$handleTickActions$followPulse>core/game/content/global/worldevents/holiday/CandyRewardPlugin9core/game/content/global/worldevents/holiday/GrimDialogueAcore/game/content/global/worldevents/holiday/SimpleHalloweenEvent(core/game/world/map/path/SmartPathfindercore/JSONUtilscore/JSONUtils$Companion core/Servercore/Server$main$1core/Server$main$2core/ServerConstantscore/ServerConstants$Companion7core/game/node/entity/combat/handlers/MagicSwingHandler7core/game/node/entity/combat/handlers/MeleeSwingHandlerAcore/game/node/entity/combat/handlers/MeleeSwingHandler$Companion7core/game/node/entity/combat/handlers/MultiSwingHandler7core/game/node/entity/combat/handlers/RangeSwingHandler@core/game/node/entity/combat/handlers/RangeSwingHandler$impact$1Acore/game/node/entity/combat/handlers/RangeSwingHandler$Companioncore/game/content/activity/gnomecooking/GCRewardTokenHandlerKt?core/game/content/activity/gnomecooking/GnomeCookingConstantsKt7core/game/content/activity/gnomecooking/GnomeCookingJob3core/game/content/activity/gnomecooking/GnomeTipper9core/game/content/activity/gnomecooking/GnomeTipper$LEVEL@core/game/content/activity/gnomecooking/GnomeTipper$WhenMappings@core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcutFcore/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut$run$1:core/game/node/entity/skill/agility/shortcuts/PipeShortcut@core/game/node/entity/skill/agility/shortcuts/PipeShortcut$run$1?core/game/node/entity/skill/agility/shortcuts/RockClimbShortcutCcore/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcutYcore/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$SteppingStoneInstanceLcore/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$handle$1Mcore/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$Companioncore/game/node/entity/skill/hunter/tracking/PolarKebbitHunting;core/game/node/entity/skill/hunter/tracking/TrailDefinition5core/game/node/entity/skill/hunter/tracking/TrailType?core/game/content/activity/gnomecooking/battas/GnomeBattaCookerFcore/game/content/activity/gnomecooking/battas/GnomeBattaCooker$cook$1Ccore/game/content/activity/gnomecooking/battas/GnomeBattaDishFillerEcore/game/content/activity/gnomecooking/battas/GnomeBattaDishFillerKtBcore/game/content/activity/gnomecooking/battas/GnomeBattaGarnisherBcore/game/content/activity/gnomecooking/battas/GnomeBattaInterfacePcore/game/content/activity/gnomecooking/battas/GnomeBattaInterface$CookedProductDcore/game/content/activity/gnomecooking/battas/GnomeBattaInterfaceKtGcore/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler3core/game/node/entity/player/info/login/LoginParser@core/game/node/entity/player/info/login/LoginParser$initialize$1?core/game/node/entity/player/info/login/LoginParser$reconnect$1=core/game/node/entity/player/info/login/LoginParser$Companion8core/game/node/entity/player/info/login/PlayerSaveParser@core/game/node/entity/player/info/login/PlayerSaveParser$parse$1Bcore/game/node/entity/player/info/login/PlayerSaveParser$parse$1$1Bcore/game/node/entity/player/info/login/PlayerSaveParser$parse$1$2Bcore/game/node/entity/player/info/login/PlayerSaveParser$parse$1$3Bcore/game/node/entity/player/info/login/PlayerSaveParser$parse$1$43core/game/node/entity/player/info/login/PlayerSaver>core/game/node/entity/player/info/login/PlayerSaver$populate$1Bcore/game/node/entity/player/info/login/PlayerSaver$populate$1$a$1Bcore/game/node/entity/player/info/login/PlayerSaver$populate$1$b$1Bcore/game/node/entity/player/info/login/PlayerSaver$populate$1$c$1Bcore/game/node/entity/player/info/login/PlayerSaver$populate$1$d$1:core/game/node/entity/player/info/login/PlayerSaver$save$1Fcore/game/node/entity/player/info/login/PlayerSaver$saveStateManager$15core/game/content/consumable/effects/RestoreSummoningcore/game/system/command/sets/FunCommandSet$defineCommands$7$1core/game/system/command/sets/MiscCommandSet$defineCommands$10>core/game/system/command/sets/MiscCommandSet$defineCommands$11@core/game/system/command/sets/MiscCommandSet$defineCommands$11$1>core/game/system/command/sets/MiscCommandSet$defineCommands$12>core/game/system/command/sets/MiscCommandSet$defineCommands$13>core/game/system/command/sets/MiscCommandSet$defineCommands$14>core/game/system/command/sets/MiscCommandSet$defineCommands$15>core/game/system/command/sets/MiscCommandSet$defineCommands$16>core/game/system/command/sets/MiscCommandSet$defineCommands$17>core/game/system/command/sets/MiscCommandSet$defineCommands$18>core/game/system/command/sets/MiscCommandSet$defineCommands$19>core/game/system/command/sets/MiscCommandSet$defineCommands$20>core/game/system/command/sets/MiscCommandSet$defineCommands$21>core/game/system/command/sets/MiscCommandSet$defineCommands$22>core/game/system/command/sets/MiscCommandSet$defineCommands$23>core/game/system/command/sets/MiscCommandSet$defineCommands$24>core/game/system/command/sets/MiscCommandSet$defineCommands$25>core/game/system/command/sets/MiscCommandSet$defineCommands$26>core/game/system/command/sets/MiscCommandSet$defineCommands$272core/game/system/command/sets/ModerationCommandSetCcore/game/system/command/sets/ModerationCommandSet$defineCommands$1Ecore/game/system/command/sets/ModerationCommandSet$defineCommands$1$1-core/game/system/command/sets/MusicCommandSet>core/game/system/command/sets/MusicCommandSet$defineCommands$1>core/game/system/command/sets/MusicCommandSet$defineCommands$2-core/game/system/command/sets/QuestCommandSet>core/game/system/command/sets/QuestCommandSet$defineCommands$1>core/game/system/command/sets/QuestCommandSet$defineCommands$2>core/game/system/command/sets/QuestCommandSet$defineCommands$3>core/game/system/command/sets/QuestCommandSet$defineCommands$4.core/game/system/command/sets/SlayerCommandSet?core/game/system/command/sets/SlayerCommandSet$defineCommands$1?core/game/system/command/sets/SlayerCommandSet$defineCommands$2-core/game/system/command/sets/SpawnCommandSet>core/game/system/command/sets/SpawnCommandSet$defineCommands$1>core/game/system/command/sets/SpawnCommandSet$defineCommands$2>core/game/system/command/sets/SpawnCommandSet$defineCommands$3.core/game/system/command/sets/SystemCommandSet?core/game/system/command/sets/SystemCommandSet$defineCommands$1?core/game/system/command/sets/SystemCommandSet$defineCommands$2?core/game/system/command/sets/SystemCommandSet$defineCommands$3?core/game/system/command/sets/SystemCommandSet$defineCommands$40core/game/system/command/sets/TeleportCommandSetAcore/game/system/command/sets/TeleportCommandSet$defineCommands$1Acore/game/system/command/sets/TeleportCommandSet$defineCommands$2Acore/game/system/command/sets/TeleportCommandSet$defineCommands$3Acore/game/system/command/sets/TeleportCommandSet$defineCommands$4Acore/game/system/command/sets/TeleportCommandSet$defineCommands$54core/game/node/entity/skill/herblore/GrindItemPluginEcore/game/node/entity/skill/herblore/GrindItemPlugin$handle$handler$1Ncore/game/node/entity/skill/herblore/GrindItemPlugin$handle$handler$1$create$1>core/game/node/entity/skill/herblore/GrindItemPlugin$Companion*plugin/ai/skillingbot/SkillingBotAssembler1plugin/ai/skillingbot/SkillingBotAssembler$Wealth7plugin/ai/skillingbot/SkillingBotAssembler$WhenMappings:core/game/node/entity/combat/special/LiquefySpecialHandler4core/game/node/entity/skill/skillcapeperks/Skillcape>core/game/node/entity/skill/skillcapeperks/Skillcape$CompanionCcore/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPluginAcore/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin9core/game/node/entity/skill/skillcapeperks/SkillcapePerks;core/game/node/entity/skill/skillcapeperks/SkillcapePerks$1;core/game/node/entity/skill/skillcapeperks/SkillcapePerks$2;core/game/node/entity/skill/skillcapeperks/SkillcapePerks$3Kcore/game/node/entity/skill/skillcapeperks/SkillcapePerks$MagicCapeDialogueHcore/game/node/entity/skill/skillcapeperks/SkillcapePerks$RCCapeDialogueCcore/game/node/entity/skill/skillcapeperks/SkillcapePerks$CompanionPcore/game/node/entity/skill/skillcapeperks/SkillcapePerks$Companion$WhenMappingsJcore/game/node/entity/skill/construction/decoration/ConstructionDoorPluginTcore/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin$Companion,core/game/interaction/item/withitem/CapeDyer1core/game/interaction/item/withitem/CapeDyer$Cape;core/game/interaction/item/withitem/CapeDyer$Cape$Companion.core/game/interaction/item/withitem/CapeDyerKt'core/game/world/update/MapChunkRenderer"core/game/world/update/NPCRenderer%core/game/world/update/PlayerRenderer"core/game/world/update/UpdateMasks,core/game/world/update/UpdateMasks$Companion%core/game/world/update/UpdateSequence+core/game/world/update/UpdateSequence$run$1-core/game/world/update/UpdateSequence$run$1$1+core/game/world/update/UpdateSequence$end$1+core/game/world/update/UpdateSequence$end$2/core/game/world/update/UpdateSequence$Companion(core/plugin/quest/fremtrials/FishOnAltar4core/plugin/quest/fremtrials/FishOnAltar$moveToPulse4core/plugin/quest/fremtrials/FishOnAltar$spiritPulse.core/plugin/quest/fremtrials/LyreOptionHandler8core/plugin/quest/fremtrials/LyreOptionHandler$telePulse-core/game/interaction/player/PeltOptionPlugin6core/game/interaction/player/PeltOptionPlugin$handle$16core/game/interaction/player/PeltOptionPlugin$handle$2/core/game/interaction/player/PeltOptionPluginKt)core/game/content/dialogue/AberabDialogue-core/game/content/dialogue/AchiettiesDialogue,core/game/content/dialogue/AfflictedDialogue(core/game/content/dialogue/AfrahDialogue.core/game/content/dialogue/AgilityBossDialogue*core/game/content/dialogue/AgmundiDialogue0core/game/content/dialogue/AluftGianneJrDialogue1core/game/content/dialogue/AluftGianneSnrDialogueFcore/game/content/dialogue/AluftGianneSnrDialogue$GnomeRestaurantPulse:core/game/content/dialogue/AluftGianneSnrDialogue$getJob$13core/game/content/dialogue/AluftGianneSnrDialogueKt(core/game/content/dialogue/AsyffDialogue,core/game/content/dialogue/BlurberryDialogue1core/game/content/dialogue/BrotherBordissDialogue(core/game/content/dialogue/ElsieDialogue*core/game/content/dialogue/GabootyDialogue+core/game/content/dialogue/GeoffreyDialogue(core/game/content/dialogue/IffieDialogue/core/game/content/dialogue/LegendsGuardDialogue(core/game/content/dialogue/LensaDialogue)core/game/content/dialogue/MistagDialogue1core/game/content/dialogue/OttoGodblessedDialogue/core/game/content/dialogue/SkillDialogueHandler=core/game/content/dialogue/SkillDialogueHandler$SkillDialogueHcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$ONE_OPTIONHcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$TWO_OPTIONJcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$THREE_OPTIONIcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FOUR_OPTIONIcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FIVE_OPTIONGcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$Companion9core/game/content/dialogue/SkillDialogueHandler$Companion*core/game/content/dialogue/ThormacDialogue3core/game/content/dialogue/WysonTheGardenerDialogue=core/game/content/dialogue/WysonTheGardenerDialogue$Companion(core/game/interaction/city/IsafdarPlugin*core/game/interaction/city/MorytaniaPlugin!core/game/content/jobs/JobManager+core/game/content/jobs/WorkForOptionHandler=core/game/content/jobs/WorkForOptionHandler$CancelJobDialoguecore/game/system/SystemLoggerHcore/game/node/entity/skill/construction/decoration/costume/ToyBoxPluginOcore/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPluginQcore/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPluginKt1core/game/node/entity/skill/farming/CropHarvester:core/game/node/entity/skill/farming/CropHarvester$handle$16core/game/node/entity/skill/farming/DigUpPatchDialogue?core/game/node/entity/skill/farming/DigUpPatchDialogue$handle$10core/game/node/entity/skill/farming/FarmingPatch:core/game/node/entity/skill/farming/FarmingPatch$Companion5core/game/node/entity/skill/farming/InspectionHandler)core/game/node/entity/skill/farming/Patch.core/game/node/entity/skill/farming/PatchRaker5core/game/node/entity/skill/farming/PatchRaker$rake$1-core/game/node/entity/skill/farming/PatchType-core/game/node/entity/skill/farming/Plantable7core/game/node/entity/skill/farming/Plantable$Companion7core/game/node/entity/skill/farming/UseWithPatchHandler@core/game/node/entity/skill/farming/UseWithPatchHandler$handle$1>core/game/content/global/worldevents/shootingstar/ShootingStarBcore/game/content/global/worldevents/shootingstar/ShootingStarTypeFcore/game/content/global/worldevents/shootingstar/ShootingStarCommandsCcore/game/content/global/worldevents/shootingstar/ShootingStarEventMcore/game/content/global/worldevents/shootingstar/ShootingStarEvent$StarPulseCcore/game/content/global/worldevents/shootingstar/ShootingStarLoginIcore/game/content/global/worldevents/shootingstar/ShootingStarMiningPulseKcore/game/content/global/worldevents/shootingstar/ShootingStarOptionHandlerUcore/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler$CompanionDcore/game/content/global/worldevents/shootingstar/StarSpriteDialoguecore/worker/MajorUpdateWorker%core/worker/MajorUpdateWorker$start$1?core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPCcore/game/content/quest/members/thelosttribe/LostTribeCutsceneEcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1Mcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$1Mcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$2Mcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$3Mcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$4Mcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$5Mcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6Ocore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$1Ocore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2Wcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1Ycore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1[core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1]core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1_core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1acore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1ccore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$1ccore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2ecore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1gcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1ocore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1qcore/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1score/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$1score/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$2{core/game/content/quest/members/thelosttribe/LostTribeCutscene$open$1$pulse$6$2$pulse$1$1$1$1$1$1$2$1$1$pulse$1$1$2$pulse$1@core/game/content/quest/members/thelosttribe/LostTribeCutsceneKtCcore/game/content/quest/members/thelosttribe/LostTribeOptionHandlerEcore/game/content/quest/members/thelosttribe/LostTribeOptionHandlerKtcore/game/content/quest/members/thelosttribe/PickpocketSigmundGcore/game/content/quest/members/thelosttribe/PickpocketSigmund$handle$1@core/game/content/quest/members/thelosttribe/SigmundChestHandlerplugin/creditshop/CreditShop6core/game/node/entity/skill/farming/Patch$WhenMappings1core/game/node/entity/skill/farming/HealthChecker>core/game/node/entity/skill/farming/HealthChecker$WhenMappings7core/game/node/entity/skill/farming/FruitAndBerryPicker@core/game/node/entity/skill/farming/FruitAndBerryPicker$handle$1/core/game/node/entity/skill/farming/CompostType.core/game/node/entity/skill/farming/CompostBin/core/game/node/entity/skill/farming/CompostBins9core/game/node/entity/skill/farming/CompostBins$Companion5core/game/node/entity/skill/farming/UseWithBinHandler>core/game/node/entity/skill/farming/UseWithBinHandler$handle$1>core/game/system/command/sets/MiscCommandSet$defineCommands$28;core/game/node/entity/skill/farming/CompostBinOptionHandler>core/game/node/entity/skill/farming/UseWithBinHandler$handle$2>core/game/node/entity/skill/farming/UseWithBinHandler$handle$3@core/game/node/entity/skill/farming/UseWithPatchHandler$handle$2@core/game/node/entity/skill/farming/UseWithPatchHandler$handle$3@core/game/node/entity/skill/farming/UseWithPatchHandler$handle$4;core/game/node/entity/skill/farming/ToolLeprechaunInterface=core/game/node/entity/skill/farming/ToolLeprechaunInterfaceKtBcore/game/node/entity/skill/farming/ToolLeprechaunInterface$open$1 \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len new file mode 100644 index 000000000..d394a1312 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len new file mode 100644 index 000000000..14da9e8a6 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values new file mode 100644 index 000000000..5a7065dfd Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at new file mode 100644 index 000000000..54ab75547 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.s new file mode 100644 index 000000000..d332a1236 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.s @@ -0,0 +1 @@ +2-* \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i new file mode 100644 index 000000000..f452d890a Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab new file mode 100644 index 000000000..d4e04c32b Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream new file mode 100644 index 000000000..e72a5d42a --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream @@ -0,0 +1 @@ +core/gui/ConsoleFramecore/game/ge/BuyingLimitation)core/game/node/entity/impl/GameAttributes/core/game/node/entity/player/link/prayer/Prayer6core/game/node/entity/player/link/ConfigurationManager.core/game/content/dialogue/DialogueInterpreter-core/game/container/access/InterfaceContainercore/net/packet/IncomingPacket)core/plugin/CorePluginTypes/ManagerPlugin0core/game/system/communication/CommunicationInfocore/plugin/Plugin#core/net/amsc/ManagementServerState%core/game/content/global/SkillingPets(core/game/content/global/BossKillCountercore/net/IoReadEvent?core/game/node/entity/player/link/diary/AchievementDiaryManager1core/game/node/entity/combat/equipment/Ammunition>core/game/content/quest/tutorials/tutorialisland/TutorialStage0core/game/node/entity/combat/equipment/SpellType%core/game/interaction/DestinationFlag+core/game/container/impl/EquipmentContainer'core/game/node/entity/state/EntityState/core/game/node/entity/npc/agg/AggressiveHandlercore/game/content/eco/EcoStatus&core/game/node/entity/skill/SkillPulseUcore/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin2core/game/node/entity/player/link/InterfaceManager)core/game/node/entity/skill/slayer/Master3core/game/world/update/flag/player/FaceLocationFlag,core/game/node/entity/player/info/RenderInfocore/game/node/entity/Entity7core/game/node/entity/skill/runecrafting/MysteriousRuin,core/game/node/entity/skill/magic/MagicSpell'core/game/node/entity/impl/WalkingQueue(core/game/node/entity/player/info/Rights@core/game/content/quest/PluginInteractionManager$InteractionTypecore/game/ge/GEItemSet7core/game/node/entity/combat/ImpactHandler$HitsplatTypecore/game/container/Container(core/game/content/consumable/Consumables%core/game/node/entity/lock/LockElapse%core/game/node/entity/npc/AbstractNPC2core/game/node/entity/player/link/music/MusicEntry&core/game/node/entity/state/StatePulse8core/game/node/entity/skill/fletching/Fletching$GemBolts$core/game/world/map/zone/ZoneMonitor3core/game/node/entity/player/link/prayer/PrayerType)core/game/world/map/path/ClipMaskSupplier:core/game/node/entity/player/info/login/LoginConfiguration)core/game/content/quest/PluginInteraction0core/game/node/entity/skill/construction/Servant0core/game/node/entity/combat/equipment/ArmourSet#core/game/node/entity/impl/Animatorcore/game/world/map/RegionChunkplugin/ai/AIPBuilder1core/game/node/entity/combat/ImpactHandler$Impact,core/game/node/entity/npc/drop/RareDropTable1core/game/node/entity/player/info/login/LoginType-core/game/node/entity/skill/construction/Room)core/game/interaction/npc/bob/BobDialogue'core/game/content/global/SkillcapePerks4core/game/node/entity/player/link/audio/AudioManagercore/game/world/map/Location-core/game/node/entity/player/link/audio/Audio core/net/amsc/MSPacketRepository+core/game/node/entity/player/link/SavedData&core/game/container/impl/BankContainercore/plugin/PluginType)core/game/content/dialogue/DialoguePlugin/core/game/node/entity/skill/fletching/Fletchingcore/net/packet/Context)core/game/node/entity/skill/smithing/Bars3core/game/node/entity/skill/agility/AgilityShortcut$core/cache/def/impl/ObjectDefinition)core/game/content/activity/CutscenePlugincore/cache/Cache.core/game/node/entity/skill/runecrafting/Altar/core/game/container/access/BitregisterAssembler-core/game/world/update/flag/context/AnimationGcore/game/node/entity/combat/equipment/WeaponInterface$WeaponInterfaces'core/game/content/consumable/Consumable@core/game/content/quest/tutorials/tutorialisland/CharacterDesign.core/game/content/global/travel/glider/Gliders.core/game/node/entity/player/link/emote/Emotes#plugin/ai/wilderness/PvPBotsBuilder1core/game/content/global/action/DoorActionHandler,core/game/world/update/flag/context/Graphics'core/game/content/eco/EconomyManagement core/game/world/map/zone/MapZonecore/game/node/item/GroundItem#core/game/component/ComponentPlugin1core/game/node/entity/combat/equipment/BoltEffect6core/game/interaction/item/toys/DiangoReclaimInterface"core/cache/def/impl/ItemDefinitionplugin/ai/pvp/PVPAIPActions/core/game/world/repository/InitializingNodeList(core/game/node/entity/impl/ForceMovement:core/game/node/entity/skill/crafting/spinning/SpinningItemcore/game/world/map/zone/Zone+core/game/content/dialogue/FacialExpression-core/game/node/entity/player/link/quest/Quest plugin/ai/pvp/PVPAIPBuilderUtils4core/game/node/entity/player/info/login/PlayerParsercore/net/Constantscore/game/ge/OfferState:core/game/content/quest/miniquest/barcrawl/BarcrawlManagercore/tools/StringUtils#core/game/interaction/MovementPulse*core/game/content/activity/ActivityManagercore/cache/misc/Container2core/game/node/entity/player/link/SpellBookManager,core/game/world/map/zone/impl/WildernessZoneplugin/ai/pvmbots/PvMBotscore/game/node/Node$core/cache/def/impl/VarbitDefinition#core/game/node/object/ObjectBuilder&core/game/content/activity/mta/MTAZone0core/game/content/quest/PluginInteractionManager"core/game/system/task/TaskExecutorcore/game/system/SystemUpdatecore/game/system/SystemState/core/game/world/update/flag/context/ChatMessage#core/game/interaction/OptionHandler%core/game/node/entity/impl/Projectile1core/game/node/entity/player/link/TeleportManager$core/game/interaction/UseWithHandler7core/game/node/entity/skill/construction/RoomProperties#core/game/system/command/CommandSet/core/game/node/entity/skill/gather/SkillingTool(core/game/node/entity/skill/slayer/Tasks#core/game/content/global/RepairItem!core/game/world/callback/CallBack:core/game/node/entity/skill/summoning/familiar/BurdenBeast$core/game/world/map/zone/ZoneBuilder(core/game/node/entity/combat/CombatStyle-core/game/content/consumable/ConsumableEffectcore/net/amsc/WorldCommunicatorcore/game/world/map/Region9core/game/node/entity/player/info/portal/PlayerSQLManager5core/game/node/entity/skill/construction/HousingStylecore/game/world/map/Point7core/game/node/entity/skill/summoning/familiar/Familiar1core/game/node/entity/skill/herblore/GrindingItem$core/plugin/CorePluginTypes/Managers3core/game/node/entity/skill/construction/Decoration5core/game/node/entity/skill/construction/BuildHotspot5core/game/content/quest/members/asoulsbane/ASoulsBane core/Util0core/game/node/entity/player/link/IronmanManager$core/game/interaction/NodeUsageEvent2core/game/content/global/action/ClimbActionHandlercore/game/system/task/NodeTask(core/game/node/entity/combat/CombatSpell core/net/packet/PacketRepository>core/game/node/entity/player/link/TeleportManager$TeleportType-core/game/content/ttrail/TreasureTrailManager7core/game/node/entity/player/link/appearance/Appearance-core/game/node/entity/skill/summoning/pet/Pet!core/game/content/global/BirdNestcore/game/node/entity/skill/fletching/Fletching$FletchingItems2core/game/node/entity/combat/equipment/RangeWeapon6core/game/node/entity/combat/equipment/WeaponInterface9core/game/interaction/item/brawling_gloves/BrawlingGloves@core/game/content/quest/tutorials/tutorialisland/TutorialSession1core/game/world/update/flag/player/AppearanceFlagcore/game/component/Component*core/game/node/entity/player/link/Settings7core/game/node/entity/player/link/quest/QuestRepository,core/game/node/entity/player/link/GlobalData&core/game/content/activity/mta/MTAType4core/game/node/entity/skill/gather/mining/MiningNode@core/game/content/activity/pestcontrol/PestControlActivityPlugin)core/game/content/ttrail/ClueScrollPluginCcore/game/content/global/worldevents/shootingstar/ScoreboardManager'core/game/node/entity/skill/magic/Runes0core/game/node/entity/player/info/login/Response6core/game/node/entity/skill/construction/HouseLocation-core/game/node/entity/player/link/IronmanMode8core/game/node/entity/combat/equipment/Weapon$WeaponType#core/game/world/repository/NodeList#core/game/node/entity/player/Player3core/game/node/entity/player/link/music/MusicPlayercore/game/world/map/Direction!core/game/component/InterfaceTypecore/net/NioReactor"core/game/ge/GrandExchangeDatabase core/game/content/global/GodType#core/game/world/map/path/Pathfindercore/cache/def/Definition1core/game/node/entity/player/link/diary/DiaryType1core/game/node/entity/skill/construction/NailType4core/game/node/entity/skill/summoning/pet/PetDetails:core/game/node/entity/player/link/BankPinManager$PinStatus3core/game/node/entity/player/link/appearance/Gender)core/game/content/activity/ActivityPlugin0core/net/packet/context/CameraContext$CameraTypecore/net/packet/PacketHeader-core/game/node/entity/combat/equipment/Weaponcore/game/system/SystemManager-core/game/system/communication/ClanRepository)core/game/node/entity/player/info/UIDInfo$core/game/content/ame/AntiMacroEvent(core/game/node/entity/combat/BattleState+core/game/node/entity/player/link/RunScript4core/game/node/entity/player/link/grave/GraveManager"core/game/content/ttrail/ClueLevel*core/game/node/entity/combat/ImpactHandlercore/game/ge/GrandExchangeEntry%plugin/ai/resource/ResourceAIPActions1core/game/node/entity/skill/crafting/GlassProduct4core/game/node/entity/skill/summoning/SummoningPouchcore/game/node/entity/npc/NPC4core/game/node/entity/player/link/emote/EmoteManager8core/game/node/entity/player/link/diary/AchievementDiary+core/game/system/security/EncryptionManager,core/game/node/entity/impl/Animator$Priority2core/game/node/entity/skill/agility/AgilityHandler1core/game/node/entity/skill/agility/AgilityCourse core/game/node/object/GameObject@core/game/interaction/item/brawling_gloves/BrawlingGlovesManagercore/game/node/item/ChanceItemcore/net/IoSession4core/game/node/entity/player/info/login/SavingModule&core/game/node/entity/lock/ActionLocks'core/game/world/map/build/DynamicRegion.core/game/node/entity/player/link/SkullManager!core/game/interaction/Interaction*core/game/interaction/inter/GlassInterface0core/game/node/entity/skill/slayer/SlayerManager,core/game/node/entity/npc/drop/DropFrequency'core/game/world/update/flag/PlayerFlagscore/net/packet/IoBuffer#core/game/system/monitor/MessageLog"core/game/node/entity/skill/Skills core/tools/mysql/DatabaseManagercore/game/content/global/Dyescore/game/world/map/path/Path)plugin/ai/general/scriptrepository/Scriptcore/game/interaction/Option(core/game/node/entity/state/StateManager9core/game/content/activity/mta/impl/EnchantingZone$Shapes&core/game/content/ame/AntiMacroHandler&core/game/node/entity/combat/DeathTaskcore/game/node/item/ItemPlugincore/tools/TimeStamp(core/game/world/map/zone/ZoneRestrictioncore/cache/CacheFileManagercore/tools/RandomFunction$core/game/world/map/zone/ZoneBordersplugin/ai/pvmbots/NoobBot!core/game/world/map/RegionManager8core/game/interaction/item/TeleTabsOptionPlugin$TeleTabs5core/game/node/entity/skill/summoning/SummoningScroll'core/game/system/monitor/DuplicationLog>core/game/node/entity/skill/summoning/familiar/FamiliarManager%core/game/container/ContainerListenerBcore/game/node/entity/combat/equipment/WeaponInterface$AttackStylecore/game/world/map/Viewport0core/game/node/entity/player/link/BankPinManager/core/game/node/entity/player/info/PlayerDetails&core/game/world/update/flag/UpdateFlag+core/game/node/entity/player/link/QuestData.core/game/node/entity/player/link/ActivityData)plugin/ai/skillingbot/SkillingBotsBuilderplugin/ai/pvmbots/DragonKiller6core/game/node/entity/skill/summoning/pet/IncubatorEgg%core/cache/misc/ContainersInformation!core/cache/def/impl/NPCDefinition5core/game/node/entity/skill/construction/HouseManager5core/game/node/entity/player/link/appearance/BodyPart"core/game/content/global/shop/Shop,core/game/node/entity/npc/drop/NPCDropTables%core/game/node/item/GroundItemManager4core/game/node/entity/skill/construction/ServantTypecore/cache/crypto/ISAACCipher0core/game/node/entity/player/link/PacketDispatch&core/cache/misc/buffer/ByteBufferUtils%core/net/packet/context/CameraContext)core/game/content/dialogue/DialogueActioncore/cache/ServerStoreplugin/ai/AIPlayercore/game/component/CloseEvent:core/game/node/entity/combat/equipment/DegradableEquipment&core/game/system/mysql/SQLEntryHandler)core/plugin/CorePluginTypes/StartupPlugin9core/game/content/activity/pestcontrol/PestControlSession:core/game/interaction/npc/bob/BobDialogue$BarrowsEquipmentcore/game/world/map/RegionPlanecore/plugin/PluginManifest&core/game/system/monitor/PlayerMonitor3core/game/node/entity/combat/equipment/SwitchAttack2core/game/node/entity/skill/runecrafting/RunePouch2core/game/content/activity/mta/impl/EnchantingZone%core/game/node/entity/impl/PropertiesOcore/game/interaction/npc/bob/BobDialogue$BarrowsEquipment$BarrowsFullEquipment'core/game/node/entity/impl/PulseManager1core/game/node/entity/player/link/grave/GraveTypeDcore/game/node/entity/skill/gather/woodcutting/WoodcuttingSkillPulse#core/net/packet/in/ItemActionPacket$core/net/packet/in/InteractionPacket \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream.len new file mode 100644 index 000000000..c59a80204 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.len new file mode 100644 index 000000000..fe2e9ca53 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values new file mode 100644 index 000000000..8903e98ad Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values.at new file mode 100644 index 000000000..6300f16fb Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values.s new file mode 100644 index 000000000..faa3bef0d --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values.s @@ -0,0 +1 @@ +љΏ܄ʞ˚ي \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i new file mode 100644 index 000000000..1fff92955 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab new file mode 100644 index 000000000..51a202e34 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream new file mode 100644 index 000000000..5783b511b Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len new file mode 100644 index 000000000..39f6c43d3 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.len new file mode 100644 index 000000000..41d6c24bc Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.values.at new file mode 100644 index 000000000..2857f1042 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab_i new file mode 100644 index 000000000..2112295fa Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/package-parts.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab new file mode 100644 index 000000000..dbc214950 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream new file mode 100644 index 000000000..38a954962 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream @@ -0,0 +1,2 @@ + GatheringJobs +SlayingJob0core/game/system/command/oldsys/AIPCommandPlugin5core/game/system/command/oldsys/SimpleDumpingCommands-core/game/system/command/oldsys/VisualCommand@core/game/content/activity/gnomecooking/cocktails/CocktailCookerMcore/game/content/activity/gnomecooking/cocktails/CocktailCooker$CookedDrinksBcore/game/content/activity/gnomecooking/cocktails/CocktailCookerKtBcore/game/content/activity/gnomecooking/cocktails/CocktailFinisherQcore/game/content/activity/gnomecooking/cocktails/CocktailFinisher$FinishedDrinksDcore/game/content/activity/gnomecooking/cocktails/CocktailFinisherKtGcore/game/content/activity/gnomecooking/cocktails/CocktailShakerHandlerHcore/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterfaceVcore/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface$FruitCocktailJcore/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterfaceKtAcore/game/content/activity/gnomecooking/cocktails/PourMixerPluginMcore/game/content/activity/gnomecooking/cocktails/PourMixerPlugin$PouredDrinkCcore/game/content/activity/gnomecooking/cocktails/PourMixerPluginKt6core/game/node/entity/skill/cooking/ChocolateBarCutter/core/game/interaction/item/BraceletOfClayPlugin4core/game/interaction/item/EnchantJewelleryTabOption6core/game/interaction/item/EnchantJewelleryTabOptionKt.core/game/interaction/item/GrandSeedPodHandler:core/game/interaction/item/GrandSeedPodHandler$LaunchPulse:core/game/interaction/item/GrandSeedPodHandler$SquashPulse0core/game/interaction/item/GrandSeedPodHandlerKt!core/game/camerautils/CameraUtils"core/game/camerautils/PlayerCameracore/game/content/global/worldevents/penguinhns/PenguinManagerHcore/game/content/global/worldevents/penguinhns/PenguinManager$Companion>core/game/content/global/worldevents/penguinhns/PenguinSpawnerFcore/game/content/global/worldevents/penguinhns/PenguinSpawner$PenguinDcore/game/content/global/worldevents/penguinhns/PenguinSpyingHandlerMcore/game/content/global/worldevents/penguinhns/PenguinSpyingHandler$SpyPulse8core/game/node/entity/combat/equipment/EquipmentDegraderGcore/game/node/entity/combat/equipment/EquipmentDegrader$StaticDegrader-core/game/world/repository/DisconnectionQueue@core/game/world/repository/DisconnectionQueue$DisconnectionEntry%core/game/world/repository/Repository.core/game/node/entity/state/newsys/PlayerState(core/game/node/entity/state/newsys/State2core/game/node/entity/state/newsys/StateRepository$core/tools/stringtools/StringToolsKt7core/game/interaction/item/withobject/CoalTrucksHandlerHcore/game/interaction/item/withobject/CoalTrucksHandler$useCoalWithTruckWcore/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.plugin/ai/minigamebots/pestcontrol/CombatState:plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate6plugin/ai/minigamebots/pestcontrol/PestControlTestBot2core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue@core/game/system/command/rottenpotato/RottenPotatoUseWithHandler)core/net/packet/in/ItemOnGroundItemPacket)core/net/packet/in/QuickChatPacketHandlercore/net/packet/in/QCPacketType6core/game/content/zone/keldagrim/CartConductorDialogue8core/game/content/zone/keldagrim/CartConductorDialogueKt7core/game/content/zone/keldagrim/DwarvenBoatmanDialogue,core/game/content/zone/keldagrim/travelPulse5core/game/content/zone/keldagrim/KeldagrimCartMethods9core/game/content/zone/keldagrim/TravelFromKeldagrimPulse7core/game/content/zone/keldagrim/TravelToKeldagrimPulse8core/game/content/zone/keldagrim/KeldagrimOptionHandlers3core/game/content/zone/keldagrim/GETrapdoorDialogue2core/game/content/zone/keldagrim/KeldagrimPluginKt0core/game/content/zone/keldagrim/ReinaldDialogue5core/game/content/zone/keldagrim/ReinaldOptionHandler*core/game/content/zone/keldagrim/ReinaldKtAcore/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterfaceCcore/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterfaceKt8core/game/node/entity/equipment/BarrowsEquipmentRegister4core/game/node/entity/equipment/PVPEquipmentRegister7core/game/node/entity/equipment/SnowballEquipmentPlugin@core/game/content/activity/fishingtrawler/FishingTrawlerActivityBcore/game/content/activity/fishingtrawler/FishingTrawlerActivityKtEcore/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler9core/game/content/activity/fishingtrawler/NetLootDialogue;core/game/content/activity/fishingtrawler/NetRepairDialogue?core/game/content/activity/fishingtrawler/FishingTrawlerOverlayAcore/game/content/activity/fishingtrawler/FishingTrawlerOverlayKtGcore/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface?core/game/content/activity/fishingtrawler/FishingTrawlerSessionMcore/game/content/activity/fishingtrawler/FishingTrawlerSession$SwapBoatPulseLcore/game/content/activity/fishingtrawler/FishingTrawlerSession$TrawlerPulse=core/game/content/activity/fishingtrawler/TrawlerLogoutPluginAcore/game/content/activity/fishingtrawler/FishingTrawlerSessionKt5core/game/content/activity/fishingtrawler/TrawlerLoot:core/game/node/entity/skill/agility/BarbarianOutpostCourseQcore/game/node/entity/skill/agility/BarbarianOutpostCourse$BarbarianGuardDialogueDcore/game/node/entity/skill/agility/BarbarianOutpostCourse$Companion9core/game/node/entity/skill/agility/GnomeStrongholdCourseCcore/game/node/entity/skill/agility/GnomeStrongholdCourse$Companion4core/game/node/entity/skill/agility/WildernessCourse>core/game/node/entity/skill/agility/WildernessCourse$Companion5core/game/content/quest/members/allfiredup/AllFiredUp@core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue=core/game/content/quest/members/allfiredup/SquireFyreDialogueEcore/game/content/quest/members/thefremenniktrials/AskeladdenDialogueFcore/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorkerAcore/game/content/quest/members/thefremenniktrials/BranchFletcherVcore/game/content/quest/members/thefremenniktrials/BranchFletcher$BranchFletchingPulseAcore/game/content/quest/members/thefremenniktrials/ChieftanBrundtHcore/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue:core/game/content/quest/members/thefremenniktrials/DraugenAcore/game/content/quest/members/thefremenniktrials/KegOnKegAction@core/game/content/quest/members/thefremenniktrials/LalliDialogue@core/game/content/quest/members/thefremenniktrials/ManniDialogueNcore/game/content/quest/members/thefremenniktrials/ManniDialogue$DrinkingPulse>core/game/content/quest/members/thefremenniktrials/OlafTheBard?core/game/content/quest/members/thefremenniktrials/PipeInserterAcore/game/content/quest/members/thefremenniktrials/PoisonSalesmanCcore/game/content/quest/members/thefremenniktrials/SigliTheHuntsmanEcore/game/content/quest/members/thefremenniktrials/SwayingTreeHandlerScore/game/content/quest/members/thefremenniktrials/SwayingTreeHandler$ChoppingPulse@core/game/content/quest/members/thefremenniktrials/SwensenLadderAcore/game/content/quest/members/thefremenniktrials/SwensenPortalsJcore/game/content/quest/members/thefremenniktrials/SwensenPortals$destRoomFcore/game/content/quest/members/thefremenniktrials/SwensenTheNavigatorBcore/game/content/quest/members/thefremenniktrials/TalismanHandlerBcore/game/content/quest/members/thefremenniktrials/TinderboxOnBombAcore/game/node/entity/skill/crafting/lightsources/LanternCraftingIcore/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisherDcore/game/node/entity/skill/crafting/lightsources/LightSourceLighter>core/game/node/entity/skill/crafting/lightsources/LightSourcesHcore/game/node/entity/skill/crafting/lightsources/LightSources$Companion-plugin/ai/general/scriptrepository/Adventurer3plugin/ai/general/scriptrepository/Adventurer$State0plugin/ai/general/scriptrepository/ChickenKiller6plugin/ai/general/scriptrepository/ChickenKiller$State,plugin/ai/general/scriptrepository/CoalMiner9plugin/ai/general/scriptrepository/CoalMiner$BankingPulse2plugin/ai/general/scriptrepository/CoalMiner$State,plugin/ai/general/scriptrepository/CowKiller2plugin/ai/general/scriptrepository/CowKiller$State0plugin/ai/general/scriptrepository/DraynorFisher6plugin/ai/general/scriptrepository/DraynorFisher$State1plugin/ai/general/scriptrepository/DraynorWillows7plugin/ai/general/scriptrepository/DraynorWillows$State0plugin/ai/general/scriptrepository/FarmerThiever7plugin/ai/general/scriptrepository/FletchingBankstander=plugin/ai/general/scriptrepository/FletchingBankstander$State3plugin/ai/general/scriptrepository/GenericSlayerBot9plugin/ai/general/scriptrepository/GenericSlayerBot$State8plugin/ai/general/scriptrepository/GenericSlayerBot$Task;plugin/ai/general/scriptrepository/GenericSlayerBot$TaskHub>plugin/ai/general/scriptrepository/GenericSlayerBot$Assignment:plugin/ai/general/scriptrepository/GlassBlowingBankstander@plugin/ai/general/scriptrepository/GlassBlowingBankstander$State4plugin/ai/general/scriptrepository/GreenDragonKiller:plugin/ai/general/scriptrepository/GreenDragonKiller$StateAplugin/ai/general/scriptrepository/GreenDragonKiller$MeleeSwinger@plugin/ai/general/scriptrepository/GreenDragonKiller$MageSwingerAplugin/ai/general/scriptrepository/GreenDragonKiller$RangeSwinger(plugin/ai/general/scriptrepository/Idler1plugin/ai/general/scriptrepository/LobsterCatcher6plugin/ai/general/scriptrepository/LobsterCatcher$Sets7plugin/ai/general/scriptrepository/LobsterCatcher$State-plugin/ai/general/scriptrepository/ManThiever2plugin/ai/general/scriptrepository/NonBankingMiner3plugin/ai/general/scriptrepository/PlayerCompatible0plugin/ai/general/scriptrepository/PlayerScripts=plugin/ai/general/scriptrepository/PlayerScripts$PlayerScript4plugin/ai/general/scriptrepository/ScriptDescription3plugin/ai/general/scriptrepository/ScriptIdentifier-plugin/ai/general/scriptrepository/ScriptName,plugin/ai/general/scriptrepository/SeersFlax2plugin/ai/general/scriptrepository/SeersFlax$State2plugin/ai/general/scriptrepository/SeersMagicTrees8plugin/ai/general/scriptrepository/SeersMagicTrees$State/plugin/ai/general/scriptrepository/SharkCatcher4plugin/ai/general/scriptrepository/SharkCatcher$Sets5plugin/ai/general/scriptrepository/SharkCatcher$State6plugin/ai/general/scriptrepository/VarrockEssenceMinercore/game/interaction/CorporealBeastWarningInterface$Companion)core/game/interaction/FOGRewardsInterface2core/game/interaction/FOGRewardsInterface$ShopItem%core/game/interaction/ItemOnBankBooth"core/game/interaction/QCRepository$core/game/interaction/QCRepositoryKt;core/game/node/entity/player/info/stats/StatAttributeKeysKt7core/game/node/entity/player/info/stats/StatsCommandSet0core/game/node/entity/skill/construction/Hotspot8core/game/node/entity/state/newsys/states/AvaDeviceState7core/game/node/entity/state/newsys/states/DiseasedState6core/game/node/entity/state/newsys/states/FarmingState>core/game/node/entity/state/newsys/states/GodspellChargedState8core/game/node/entity/state/newsys/states/IncubatorState;core/game/node/entity/state/newsys/states/ShootingStarState6core/game/node/entity/state/newsys/states/SkulledState#plugin/ai/general/GeneralBotCreator2plugin/ai/general/GeneralBotCreator$BotScriptPulse3plugin/ai/general/GeneralBotCreator$TransitionPulseplugin/ai/general/ScriptAPI*plugin/ai/general/ScriptAPI$BottingOverlay$core/game/world/callback/CallbackHub0core/game/content/ame/events/SandwichLadyHandler2core/game/content/ame/events/SandwichLadyInterface.core/game/content/ame/events/SandwichLadyEvent>core/game/content/ame/events/SandwichLadyEvent$SandwichLadyNPC>core/game/content/global/worldevents/holiday/CandyRewardPlugin9core/game/content/global/worldevents/holiday/GrimDialogueAcore/game/content/global/worldevents/holiday/SimpleHalloweenEvent(core/game/world/map/path/SmartPathfindercore/JSONUtilscore/JSONUtils$Companion core/Servercore/ServerConstantscore/ServerConstants$Companion7core/game/node/entity/combat/handlers/MagicSwingHandler7core/game/node/entity/combat/handlers/MeleeSwingHandlerAcore/game/node/entity/combat/handlers/MeleeSwingHandler$Companion7core/game/node/entity/combat/handlers/MultiSwingHandler7core/game/node/entity/combat/handlers/RangeSwingHandlerAcore/game/node/entity/combat/handlers/RangeSwingHandler$Companioncore/game/content/activity/gnomecooking/GCRewardTokenHandlerKt?core/game/content/activity/gnomecooking/GnomeCookingConstantsKt7core/game/content/activity/gnomecooking/GnomeCookingJob3core/game/content/activity/gnomecooking/GnomeTipper9core/game/content/activity/gnomecooking/GnomeTipper$LEVEL@core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut:core/game/node/entity/skill/agility/shortcuts/PipeShortcut?core/game/node/entity/skill/agility/shortcuts/RockClimbShortcutCcore/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcutYcore/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$SteppingStoneInstanceMcore/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut$Companioncore/game/node/entity/skill/hunter/tracking/PolarKebbitHunting;core/game/node/entity/skill/hunter/tracking/TrailDefinition5core/game/node/entity/skill/hunter/tracking/TrailType?core/game/content/activity/gnomecooking/battas/GnomeBattaCookerCcore/game/content/activity/gnomecooking/battas/GnomeBattaDishFillerEcore/game/content/activity/gnomecooking/battas/GnomeBattaDishFillerKtBcore/game/content/activity/gnomecooking/battas/GnomeBattaGarnisherBcore/game/content/activity/gnomecooking/battas/GnomeBattaInterfacePcore/game/content/activity/gnomecooking/battas/GnomeBattaInterface$CookedProductDcore/game/content/activity/gnomecooking/battas/GnomeBattaInterfaceKtGcore/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler3core/game/node/entity/player/info/login/LoginParser=core/game/node/entity/player/info/login/LoginParser$Companion8core/game/node/entity/player/info/login/PlayerSaveParser3core/game/node/entity/player/info/login/PlayerSaver5core/game/content/consumable/effects/RestoreSummoningcore/game/node/entity/skill/herblore/GrindItemPlugin$Companion*plugin/ai/skillingbot/SkillingBotAssembler1plugin/ai/skillingbot/SkillingBotAssembler$Wealth:core/game/node/entity/combat/special/LiquefySpecialHandler4core/game/node/entity/skill/skillcapeperks/Skillcape>core/game/node/entity/skill/skillcapeperks/Skillcape$CompanionCcore/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPluginAcore/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin9core/game/node/entity/skill/skillcapeperks/SkillcapePerksKcore/game/node/entity/skill/skillcapeperks/SkillcapePerks$MagicCapeDialogueHcore/game/node/entity/skill/skillcapeperks/SkillcapePerks$RCCapeDialogueCcore/game/node/entity/skill/skillcapeperks/SkillcapePerks$CompanionJcore/game/node/entity/skill/construction/decoration/ConstructionDoorPluginTcore/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin$Companion,core/game/interaction/item/withitem/CapeDyer1core/game/interaction/item/withitem/CapeDyer$Cape;core/game/interaction/item/withitem/CapeDyer$Cape$Companion.core/game/interaction/item/withitem/CapeDyerKt'core/game/world/update/MapChunkRenderer"core/game/world/update/NPCRenderer%core/game/world/update/PlayerRenderer"core/game/world/update/UpdateMasks,core/game/world/update/UpdateMasks$Companion%core/game/world/update/UpdateSequence/core/game/world/update/UpdateSequence$Companion(core/plugin/quest/fremtrials/FishOnAltar4core/plugin/quest/fremtrials/FishOnAltar$moveToPulse4core/plugin/quest/fremtrials/FishOnAltar$spiritPulse.core/plugin/quest/fremtrials/LyreOptionHandler8core/plugin/quest/fremtrials/LyreOptionHandler$telePulse-core/game/interaction/player/PeltOptionPlugin/core/game/interaction/player/PeltOptionPluginKt)core/game/content/dialogue/AberabDialogue-core/game/content/dialogue/AchiettiesDialogue,core/game/content/dialogue/AfflictedDialogue(core/game/content/dialogue/AfrahDialogue.core/game/content/dialogue/AgilityBossDialogue*core/game/content/dialogue/AgmundiDialogue0core/game/content/dialogue/AluftGianneJrDialogue1core/game/content/dialogue/AluftGianneSnrDialogueFcore/game/content/dialogue/AluftGianneSnrDialogue$GnomeRestaurantPulse3core/game/content/dialogue/AluftGianneSnrDialogueKt(core/game/content/dialogue/AsyffDialogue,core/game/content/dialogue/BlurberryDialogue1core/game/content/dialogue/BrotherBordissDialogue(core/game/content/dialogue/ElsieDialogue*core/game/content/dialogue/GabootyDialogue+core/game/content/dialogue/GeoffreyDialogue(core/game/content/dialogue/IffieDialogue/core/game/content/dialogue/LegendsGuardDialogue(core/game/content/dialogue/LensaDialogue)core/game/content/dialogue/MistagDialogue1core/game/content/dialogue/OttoGodblessedDialogue/core/game/content/dialogue/SkillDialogueHandler=core/game/content/dialogue/SkillDialogueHandler$SkillDialogueHcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$ONE_OPTIONHcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$TWO_OPTIONJcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$THREE_OPTIONIcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FOUR_OPTIONIcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$FIVE_OPTIONGcore/game/content/dialogue/SkillDialogueHandler$SkillDialogue$Companion9core/game/content/dialogue/SkillDialogueHandler$Companion*core/game/content/dialogue/ThormacDialogue3core/game/content/dialogue/WysonTheGardenerDialogue=core/game/content/dialogue/WysonTheGardenerDialogue$Companion(core/game/interaction/city/IsafdarPlugin*core/game/interaction/city/MorytaniaPlugin!core/game/content/jobs/JobManager+core/game/content/jobs/WorkForOptionHandler=core/game/content/jobs/WorkForOptionHandler$CancelJobDialoguecore/game/system/SystemLoggerHcore/game/node/entity/skill/construction/decoration/costume/ToyBoxPluginOcore/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPluginQcore/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPluginKt1core/game/node/entity/skill/farming/CropHarvester6core/game/node/entity/skill/farming/DigUpPatchDialogue0core/game/node/entity/skill/farming/FarmingPatch:core/game/node/entity/skill/farming/FarmingPatch$Companion5core/game/node/entity/skill/farming/InspectionHandler)core/game/node/entity/skill/farming/Patch.core/game/node/entity/skill/farming/PatchRaker-core/game/node/entity/skill/farming/PatchType-core/game/node/entity/skill/farming/Plantable7core/game/node/entity/skill/farming/Plantable$Companion7core/game/node/entity/skill/farming/UseWithPatchHandler>core/game/content/global/worldevents/shootingstar/ShootingStarBcore/game/content/global/worldevents/shootingstar/ShootingStarTypeFcore/game/content/global/worldevents/shootingstar/ShootingStarCommandsCcore/game/content/global/worldevents/shootingstar/ShootingStarEventMcore/game/content/global/worldevents/shootingstar/ShootingStarEvent$StarPulseCcore/game/content/global/worldevents/shootingstar/ShootingStarLoginIcore/game/content/global/worldevents/shootingstar/ShootingStarMiningPulseKcore/game/content/global/worldevents/shootingstar/ShootingStarOptionHandlerUcore/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler$CompanionDcore/game/content/global/worldevents/shootingstar/StarSpriteDialoguecore/worker/MajorUpdateWorker?core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPCcore/game/content/quest/members/thelosttribe/LostTribeCutscene@core/game/content/quest/members/thelosttribe/LostTribeCutsceneKtCcore/game/content/quest/members/thelosttribe/LostTribeOptionHandlerEcore/game/content/quest/members/thelosttribe/LostTribeOptionHandlerKtcore/game/content/quest/members/thelosttribe/PickpocketSigmund@core/game/content/quest/members/thelosttribe/SigmundChestHandlerplugin/creditshop/CreditShop.kotlin_module1core/game/node/entity/skill/farming/HealthChecker7core/game/node/entity/skill/farming/FruitAndBerryPicker/core/game/node/entity/skill/farming/CompostType.core/game/node/entity/skill/farming/CompostBin/core/game/node/entity/skill/farming/CompostBins9core/game/node/entity/skill/farming/CompostBins$Companion5core/game/node/entity/skill/farming/UseWithBinHandler;core/game/node/entity/skill/farming/CompostBinOptionHandler;core/game/node/entity/skill/farming/ToolLeprechaunInterface=core/game/node/entity/skill/farming/ToolLeprechaunInterfaceKt \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len new file mode 100644 index 000000000..4ddc05aa1 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.len new file mode 100644 index 000000000..58a501561 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values new file mode 100644 index 000000000..42b388089 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at new file mode 100644 index 000000000..a1413ebc1 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.s new file mode 100644 index 000000000..5757e50b2 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab.values.s @@ -0,0 +1 @@ +ҟܱxxxxxxxKBLCN-688 \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i new file mode 100644 index 000000000..843af862f Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/proto.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab new file mode 100644 index 000000000..2360ba533 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream new file mode 100644 index 000000000..389e95b0d --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream @@ -0,0 +1 @@ +O/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/JSONUtils.ktL/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/Server.ktU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/ServerConstants.ktQ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/Varbit.ktO/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/Varp.ktV/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/VarpManager.ktb/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/camerautils/CameraUtils.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/camerautils/PlayerCamera.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeacon.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeaconHandler.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFURepairClimbHandler.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUSession.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/BeaconTenderDialogue.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/barrows/RewardChest.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerActivity.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOverlay.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerSession.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/TrawlerLoot.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fog/FogInteractionHandler.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fog/ReggieDialogue.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/DeliveryBoxHandler.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GCRewardTokenHandler.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingConstants.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingJob.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeTipper.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFiller.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaGarnisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlGarnisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlPrepareHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFiller.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailCooker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailShakerHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyGarnisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFiller.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/mta/EnchantSpell.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlHelper.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderSession.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyHandler.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyInterface.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyNPC.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/consumable/effects/RestoreSummoning.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AberabDialogue.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AchiettiesDialogue.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AfflictedDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AfrahDialogue.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AgilityBossDialogue.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AgmundiDialogue.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneJrDialogue.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneSnrDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AsyffDialogue.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/BlurberryDialogue.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/BrotherBordissDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/ElsieDialogue.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/GabootyDialogue.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/GeoffreyDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/IffieDialogue.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/LegendsGuardDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/LensaDialogue.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/MistagDialogue.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/OttoGodblessedDialogue.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/SkillDialogueHandler.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/ThormacDialogue.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/WysonTheGardenerDialogue.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/action/PickupHandler.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/travel/EssenceTeleport.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEvent.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEventInitializer.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/CandyRewardPlugin.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/GrimDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/SimpleHalloweenEvent.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/LarryHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/NotebookHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinManager.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpawner.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStar.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarCommands.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarEvent.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarLogin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarMiningPulse.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/StarSpriteDialogue.ktb/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/JobManager.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/WorkForOptionHandler.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/impl/GatheringJob.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/impl/SlayingJob.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/CooksAssistant.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/GillieGroatsDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/LumbridgeCookDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/MillieMillerDialogue.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/AllFiredUp.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/SquireFyreDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/SoulsBaneLaunaDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BranchFletcher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/Draugen.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FishOnAltar.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/KegOnKegAction.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LalliDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LyreOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ManniDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/OlafTheBard.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PipeInserter.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PoisonSalesman.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenLadder.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenPortals.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TalismanHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TinderboxOnBomb.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPC.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveRockHandler.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveZone.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/DorgCbowEquipPlugin.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/GoblinFollower.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/KazgarDialogue.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribe.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeCutscene.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeOptionHandler.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickaxeOnRubble.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickpocketSigmund.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/SigmundChestHandler.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/CartConductorDialogue.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/DwarvenBoatmanDialogue.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimCartMethods.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimPlugin.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/Reinald.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface.ktW/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/BotPrices.ktY/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/GEAutoStock.kt`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/GrandExchangeOffer.ktZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/OfferManager.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/PlayerGrandExchange.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/CorporealBeastWarningInterface.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/FOGRewardsInterface.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/ItemOnBankBooth.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/QCRepository.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/city/IsafdarPlugin.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/city/MorytaniaPlugin.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/ChocatriceIncubationInterface.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/ExperienceInterface.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/FairyRingInterface.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/FurClothingInterface.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/HairDresserInterface.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/MakeOverInterface.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/PuppyInterfacePlugin.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/ThessaliaInterface.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/BraceletOfClayPlugin.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/EnchantJewelleryTabOption.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/GrandSeedPodHandler.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/withitem/CapeDyer.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/withobject/CoalTrucksHandler.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/npc/BogrogPouchSwapper.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/DemonTauntHandler.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/FairyRingPlugin.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/GutanothChestPlugin.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/JungleBushHandler.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/MuddyChestHandler.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/player/PeltOptionPlugin.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/CombatPulse.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/CombatSwingHandler.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/EquipmentDegrader.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MagicSwingHandler.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MeleeSwingHandler.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MultiSwingHandler.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/RangeSwingHandler.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/SalamanderSwingHandler.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/special/LiquefySpecialHandler.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/equipment/BarrowsEquipmentRegister.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/equipment/PVPEquipmentRegister.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/equipment/SnowballEquipmentPlugin.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheFarmerDialogue.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheGuard.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheSmithDialogue.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheHagDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheMayorDialogue.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheOperator.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/other/AlKharidWarriorPlugin.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginParser.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaveParser.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaver.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatAttributeKeys.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatsCommandSet.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryLevel.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/BarbarianOutpostCourse.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/GnomeStrongholdCourse.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/WildernessCourse.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/PipeShortcut.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/RockClimbShortcut.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/Hotspot.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/ShavingStandHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/WardrobeHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/costume/ToyBoxPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/LecternPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/cooking/ChocolateBarCutter.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LanternCrafting.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceLighter.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSources.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CropHarvester.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/DigUpPatchDialogue.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/FarmingPatch.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/InspectionHandler.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/Patch.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchRaker.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchType.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/Plantable.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithPatchHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/gather/PickaxeRepairPlugin.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningSkillPulse.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindItemPlugin.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitEast.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitWest.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/HunterTracking.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/PolarKebbitHunting.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/TrailDefinition.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/PouchManager.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouchPlugin.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/Skillcape.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapePerks.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/thieving/Pickpocket.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/PlayerState.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/State.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/StateRepository.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/AvaDeviceState.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/DiseasedState.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/FarmingState.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/GodspellChargedState.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/IncubatorState.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/ShootingStarState.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/SkulledState.kt^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/SystemLogger.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/Command.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/CommandPlugin.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/CommandSystem.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/MapDumpCommand.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/oldsys/AIPCommandPlugin.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/oldsys/SimpleDumpingCommands.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/oldsys/VisualCommand.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithNPCDialogue.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithPlayerDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoUseWithHandler.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/AnimationCommandSet.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/BottingCommandSet.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/CommandSet.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/ConfigCommandSet.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/DevelopmentCommandSet.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/FunCommandSet.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/MiscCommandSet.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/ModerationCommandSet.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/MusicCommandSet.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/QuestCommandSet.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/SlayerCommandSet.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/SpawnCommandSet.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/SystemCommandSet.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/TeleportCommandSet.kte/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ConfigParser.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/DoorConfigLoader.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/DropTableParser.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/GroundSpawnLoader.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/InterfaceConfigParser.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ItemConfigParser.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/MusicConfigLoader.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/NPCConfigParser.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/NPCSpawner.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ObjectConfigParser.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/RangedConfigLoader.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ServerConfigParser.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ShopParser.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/XteaParser.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/DeadlockDetector.kt]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/GameSettings.ktZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/GameWorld.kt]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/ImmerseWorld.kt\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/PulseRunner.kte/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/callback/CallbackHub.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/path/SmartPathfinder.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/repository/DisconnectionQueue.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/repository/Repository.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/MapChunkRenderer.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/NPCRenderer.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/PlayerRenderer.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/UpdateMasks.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/UpdateSequence.kt^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/event/LoginReadEvent.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/in/ItemOnGroundItemPacket.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/in/QuickChatPacketHandler.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/CorePluginTypes/XPGainPlugins.ktZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/PluginManager.ktV/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/Interfaces.ktQ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/Items.ktU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/TickUtils.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/stringtools/StringTools.kt^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/worker/MajorUpdateWorker.ktW/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/AIRepository.ktd/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/GeneralBotCreator.kt\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/ScriptAPI.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Adventurer.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ChickenKiller.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CoalMiner.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CowKiller.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorFisher.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorWillows.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FarmerThiever.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FletchingBankstander.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GenericSlayerBot.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GlassBlowingBankstander.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GreenDragonKiller.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Idler.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/LobsterCatcher.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ManThiever.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/NonBankingMiner.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerCompatible.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerScripts.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptDescription.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptIdentifier.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptName.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersFlax.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersMagicTrees.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SharkCatcher.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockEssenceMiner.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockSmither.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatState.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlIntermediateBot.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlNoviceBot.kt\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBot.kte/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBotAssembler.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBotsBuilder.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotAssembler.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/BarbFishingPulse.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/FishCuttingPulse.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/KnifeWithFish.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/OptionHandlers.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/SpotManager.kt]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/creditshop/CreditShop.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/PluginInteractionManager.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/TeleportManager.javau/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/SpellBookManager.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/fletching/Fletching.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/Weapon.javam/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/ImpactHandler.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/impl/Animator.javay/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/WeaponInterface.javas/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/BankPinManager.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/context/CameraContext.javau/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/mta/impl/EnchantingZone.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/npc/bob/BobDialogue.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FremennikTrials.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/city/falador/MakeoverMageInterface.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/PolarKebbitHunting.ktb/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/TableDump.ktX/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/gui/ConsoleFrame.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/BuyingLimitation.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/impl/GameAttributes.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/Prayer.javay/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/ConfigurationManager.javaq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/DialogueInterpreter.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/container/access/InterfaceContainer.javaa/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/IncomingPacket.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/CorePluginTypes/ManagerPlugin.javas/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/communication/CommunicationInfo.javaU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/Plugin.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/amsc/ManagementServerState.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/SkillingPets.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/BossKillCounter.javaW/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/IoReadEvent.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/diary/AchievementDiaryManager.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/Ammunition.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialStage.javas/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/SpellType.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/DestinationFlag.javan/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/container/impl/EquipmentContainer.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/EntityState.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/agg/AggressiveHandler.javab/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/eco/EcoStatus.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/SkillPulse.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.javau/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/InterfaceManager.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Master.javav/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/flag/player/FaceLocationFlag.javao/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/RenderInfo.java_/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/Entity.javaz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/MysteriousRuin.javao/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/magic/MagicSpell.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/impl/WalkingQueue.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/Rights.javaY/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/GEItemSet.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/container/Container.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/consumable/Consumables.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/lock/LockElapse.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/AbstractNPC.javau/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicEntry.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/StatePulse.javag/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/zone/ZoneMonitor.javav/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/PrayerType.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/path/ClipMaskSupplier.java}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginConfiguration.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/PluginInteraction.javas/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/Servant.javas/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/ArmourSet.javab/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/RegionChunk.javaW/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/AIPBuilder.javao/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/drop/RareDropTable.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginType.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/Room.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/SkillcapePerks.javaw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/audio/AudioManager.java_/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/Location.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/audio/Audio.javac/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/amsc/MSPacketRepository.javan/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/SavedData.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/container/impl/BankContainer.javaY/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/PluginType.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/DialoguePlugin.javaZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/Context.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/smithing/Bars.javav/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityShortcut.javag/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/def/impl/ObjectDefinition.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/CutscenePlugin.javaS/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/Cache.javaq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Altar.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/container/access/BitregisterAssembler.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/flag/context/Animation.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/consumable/Consumable.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/CharacterDesign.javaq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/travel/glider/Gliders.javaq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/emote/Emotes.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/wilderness/PvPBotsBuilder.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/action/DoorActionHandler.javao/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/flag/context/Graphics.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/eco/EconomyManagement.javac/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/zone/MapZone.javaa/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/item/GroundItem.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/component/ComponentPlugin.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/BoltEffect.javay/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/toys/DiangoReclaimInterface.javae/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/def/impl/ItemDefinition.java^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvp/PVPAIPActions.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/repository/InitializingNodeList.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/impl/ForceMovement.java}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/spinning/SpinningItem.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/zone/Zone.javan/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/FacialExpression.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/quest/Quest.javac/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvp/PVPAIPBuilderUtils.javaw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerParser.javaU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/Constants.javaZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/OfferState.java}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.javaY/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/StringUtils.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/MovementPulse.javam/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/ActivityManager.java\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/misc/Container.javao/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/zone/impl/WildernessZone.java\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBots.javaV/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/Node.javag/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/def/impl/VarbitDefinition.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/object/ObjectBuilder.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/mta/MTAZone.javae/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/task/TaskExecutor.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/SystemUpdate.java_/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/SystemState.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/flag/context/ChatMessage.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/OptionHandler.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/impl/Projectile.javag/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/UseWithHandler.javaz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/RoomProperties.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/CommandSet.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/gather/SkillingTool.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Tasks.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/RepairItem.javad/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/callback/CallBack.java}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenBeast.javag/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/zone/ZoneBuilder.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/CombatStyle.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/consumable/ConsumableEffect.javab/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/amsc/WorldCommunicator.java]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/Region.java|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/portal/PlayerSQLManager.javax/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/HousingStyle.java\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/Point.javaz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/Familiar.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindingItem.javag/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/CorePluginTypes/Managers.javav/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/Decoration.javax/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildHotspot.javax/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/ASoulsBane.javaL/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/Util.javas/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/IronmanManager.javag/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/NodeUsageEvent.javau/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/action/ClimbActionHandler.javaa/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/task/NodeTask.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/CombatSpell.javac/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/PacketRepository.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ttrail/TreasureTrailManager.javaz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/Appearance.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/Pet.javad/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/BirdNest.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/component/ComponentDefinition.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/zone/impl/DarkZone.javao/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/InteractionType.java[/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/item/Item.java^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/task/Pulse.javad/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/mysql/SQLManager.javaa/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/GiantMoleBot.javaq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/Pets.javau/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/RangeWeapon.java|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/brawling_gloves/BrawlingGloves.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialSession.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/flag/player/AppearanceFlag.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/component/Component.javam/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/Settings.javaz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/quest/QuestRepository.javao/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/GlobalData.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/mta/MTAType.javaw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningNode.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlActivityPlugin.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ttrail/ClueScrollPlugin.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardManager.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/magic/Runes.javas/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/Response.javay/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseLocation.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/IronmanMode.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/repository/NodeList.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/Player.javav/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicPlayer.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/Direction.javad/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/component/InterfaceType.javaV/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/NioReactor.javae/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/GrandExchangeDatabase.javac/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/GodType.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/path/Pathfinder.java\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/def/Definition.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryType.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/NailType.javaw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/PetDetails.javav/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/Gender.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/ActivityPlugin.java_/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/PacketHeader.javaa/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/SystemManager.javap/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/communication/ClanRepository.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/UIDInfo.javag/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/AntiMacroEvent.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/BattleState.javan/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/RunScript.javaw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/grave/GraveManager.javae/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ttrail/ClueLevel.javab/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/GrandExchangeEntry.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/resource/ResourceAIPActions.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/GlassProduct.javaw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningPouch.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/NPC.javaw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/emote/EmoteManager.java{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/diary/AchievementDiary.javan/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/security/EncryptionManager.javau/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityHandler.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityCourse.javac/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/object/GameObject.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.javaa/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/item/ChanceItem.javaU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/IoSession.javaw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/SavingModule.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/lock/ActionLocks.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/build/DynamicRegion.javaq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/SkullManager.javad/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/Interaction.javam/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/GlassInterface.javas/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerManager.javao/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/drop/DropFrequency.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/flag/PlayerFlags.java[/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/IoBuffer.javaf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/monitor/MessageLog.javae/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/Skills.javac/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/mysql/DatabaseManager.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/Dyes.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/path/Path.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Script.java_/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/Option.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/StateManager.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/AntiMacroHandler.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/DeathTask.javaa/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/item/ItemPlugin.javaW/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/TimeStamp.javak/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/zone/ZoneRestriction.java^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/CacheFileManager.java\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/RandomFunction.javag/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/zone/ZoneBorders.java\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/NoobBot.javad/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/RegionManager.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/TeleTabsOptionPlugin.javax/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningScroll.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/monitor/DuplicationLog.java/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarManager.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/container/ContainerListener.java_/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/Viewport.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/PlayerDetails.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/flag/UpdateFlag.javan/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/QuestData.javaq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/ActivityData.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotsBuilder.javaa/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/DragonKiller.javay/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/IncubatorEgg.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/misc/ContainersInformation.javad/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/def/impl/NPCDefinition.javax/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseManager.javax/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/BodyPart.javae/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/shop/Shop.javao/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/drop/NPCDropTables.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/item/GroundItemManager.javaw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/ServantType.java`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/crypto/ISAACCipher.javas/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/PacketDispatch.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/misc/buffer/ByteBufferUtils.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/DialogueAction.javaY/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/cache/ServerStore.javaU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/AIPlayer.javaa/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/component/CloseEvent.java}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/DegradableEquipment.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/mysql/SQLEntryHandler.javal/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/CorePluginTypes/StartupPlugin.java|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlSession.javab/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/RegionPlane.java]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/PluginManifest.javai/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/monitor/PlayerMonitor.javav/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/SwitchAttack.javau/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouch.javah/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/impl/Properties.javaj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/impl/PulseManager.javat/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/grave/GraveType.javar/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/HealthChecker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/gather/woodcutting/WoodcuttingSkillPulse.javax/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/FruitAndBerryPicker.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostType.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBin.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBins.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithBinHandler.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/in/ItemActionPacket.java|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBinOptionHandler.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/in/InteractionPacket.java|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/ToolLeprechaunInterface.kt \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len new file mode 100644 index 000000000..253a49d5a Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.len new file mode 100644 index 000000000..1944b04ff Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values new file mode 100644 index 000000000..468b82cf0 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at new file mode 100644 index 000000000..14ea7c113 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.s new file mode 100644 index 000000000..0f34c8e1b --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab.values.s @@ -0,0 +1 @@ +}͊ \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i new file mode 100644 index 000000000..6b78aeb56 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab new file mode 100644 index 000000000..afbb3a583 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream new file mode 100644 index 000000000..eb9547f2b Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len new file mode 100644 index 000000000..9d5b25796 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.len new file mode 100644 index 000000000..86c9c3e3e Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values new file mode 100644 index 000000000..e288ef171 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.at new file mode 100644 index 000000000..3a745867f --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.at @@ -0,0 +1 @@ +eractionPacket%$core.cache.def.impl.ObjectDefinition%)$core.cache.def.impl.ObjectDefinition%w$core.net.packet.in.InteractionPacketr;core.game.node.entity.skill.farming.CompostBinOptionHandler5core.game.node.entity.skill.farming.InspectionHandler6u5core.game.node.entity.skill.farming.InspectionHandler685core.game.node.entity.skill.farming.InspectionHandler7 6core.game.node.entity.state.newsys.states.FarmingState6r5core.game.node.entity.skill.farming.InspectionHandler<;core.game.node.entity.skill.farming.ToolLeprechaunInterface<@;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface<>;core.game.node.entity.skill.farming.ToolLeprechaunInterface \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.s new file mode 100644 index 000000000..0cc176b57 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab.values.s @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i new file mode 100644 index 000000000..24348d7d8 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/subtypes.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab new file mode 100644 index 000000000..c0f15abba Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream new file mode 100644 index 000000000..e895ba765 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream @@ -0,0 +1,2 @@ + GatheringJobs +SlayingJob0core.game.system.command.oldsys.AIPCommandPlugin5core.game.system.command.oldsys.SimpleDumpingCommands-core.game.system.command.oldsys.VisualCommand@core.game.content.activity.gnomecooking.cocktails.CocktailCookerMcore.game.content.activity.gnomecooking.cocktails.CocktailCooker.CookedDrinksBcore.game.content.activity.gnomecooking.cocktails.CocktailFinisherQcore.game.content.activity.gnomecooking.cocktails.CocktailFinisher.FinishedDrinksGcore.game.content.activity.gnomecooking.cocktails.CocktailShakerHandlerHcore.game.content.activity.gnomecooking.cocktails.GnomeCocktailInterfaceVcore.game.content.activity.gnomecooking.cocktails.GnomeCocktailInterface.FruitCocktailAcore.game.content.activity.gnomecooking.cocktails.PourMixerPluginMcore.game.content.activity.gnomecooking.cocktails.PourMixerPlugin.PouredDrink6core.game.node.entity.skill.cooking.ChocolateBarCutter/core.game.interaction.item.BraceletOfClayPlugin4core.game.interaction.item.EnchantJewelleryTabOption.core.game.interaction.item.GrandSeedPodHandler:core.game.interaction.item.GrandSeedPodHandler.LaunchPulse:core.game.interaction.item.GrandSeedPodHandler.SquashPulsecore.game.system.command.rottenpotato.RottenPotatoRSHDDialogue)core.net.packet.in.ItemOnGroundItemPacket)core.net.packet.in.QuickChatPacketHandlercore.net.packet.in.QCPacketType6core.game.content.zone.keldagrim.CartConductorDialogue7core.game.content.zone.keldagrim.DwarvenBoatmanDialogue,core.game.content.zone.keldagrim.travelPulse9core.game.content.zone.keldagrim.TravelFromKeldagrimPulse7core.game.content.zone.keldagrim.TravelToKeldagrimPulse8core.game.content.zone.keldagrim.KeldagrimOptionHandlers3core.game.content.zone.keldagrim.GETrapdoorDialogue0core.game.content.zone.keldagrim.ReinaldDialogue5core.game.content.zone.keldagrim.ReinaldOptionHandlerAcore.game.content.zone.keldagrim.ReinaldSmithingEmporiumInterface8core.game.node.entity.equipment.BarrowsEquipmentRegister4core.game.node.entity.equipment.PVPEquipmentRegister7core.game.node.entity.equipment.SnowballEquipmentPlugin@core.game.content.activity.fishingtrawler.FishingTrawlerActivityEcore.game.content.activity.fishingtrawler.FishingTrawlerOptionHandler9core.game.content.activity.fishingtrawler.NetLootDialogue;core.game.content.activity.fishingtrawler.NetRepairDialogueGcore.game.content.activity.fishingtrawler.FishingTrawlerRewardInterfaceMcore.game.content.activity.fishingtrawler.FishingTrawlerSession.SwapBoatPulseLcore.game.content.activity.fishingtrawler.FishingTrawlerSession.TrawlerPulse=core.game.content.activity.fishingtrawler.TrawlerLogoutPlugin:core.game.node.entity.skill.agility.BarbarianOutpostCourseQcore.game.node.entity.skill.agility.BarbarianOutpostCourse.BarbarianGuardDialogue9core.game.node.entity.skill.agility.GnomeStrongholdCourse4core.game.node.entity.skill.agility.WildernessCourse5core.game.content.quest.members.allfiredup.AllFiredUp@core.game.content.quest.members.allfiredup.BlazeSharpeyeDialogue=core.game.content.quest.members.allfiredup.SquireFyreDialogueEcore.game.content.quest.members.thefremenniktrials.AskeladdenDialogueFcore.game.content.quest.members.thefremenniktrials.BeerOnCouncilWorkerAcore.game.content.quest.members.thefremenniktrials.BranchFletcherVcore.game.content.quest.members.thefremenniktrials.BranchFletcher.BranchFletchingPulseAcore.game.content.quest.members.thefremenniktrials.ChieftanBrundtHcore.game.content.quest.members.thefremenniktrials.CouncilWorkerDialogue:core.game.content.quest.members.thefremenniktrials.DraugenAcore.game.content.quest.members.thefremenniktrials.KegOnKegAction@core.game.content.quest.members.thefremenniktrials.LalliDialogue@core.game.content.quest.members.thefremenniktrials.ManniDialogueNcore.game.content.quest.members.thefremenniktrials.ManniDialogue.DrinkingPulse>core.game.content.quest.members.thefremenniktrials.OlafTheBard?core.game.content.quest.members.thefremenniktrials.PipeInserterAcore.game.content.quest.members.thefremenniktrials.PoisonSalesmanCcore.game.content.quest.members.thefremenniktrials.SigliTheHuntsmanEcore.game.content.quest.members.thefremenniktrials.SwayingTreeHandlerScore.game.content.quest.members.thefremenniktrials.SwayingTreeHandler.ChoppingPulse@core.game.content.quest.members.thefremenniktrials.SwensenLadderAcore.game.content.quest.members.thefremenniktrials.SwensenPortalsFcore.game.content.quest.members.thefremenniktrials.SwensenTheNavigatorBcore.game.content.quest.members.thefremenniktrials.TalismanHandlerBcore.game.content.quest.members.thefremenniktrials.TinderboxOnBombAcore.game.node.entity.skill.crafting.lightsources.LanternCraftingIcore.game.node.entity.skill.crafting.lightsources.LightSourceExtinguisherDcore.game.node.entity.skill.crafting.lightsources.LightSourceLighter>core.game.node.entity.skill.crafting.lightsources.LightSources-plugin.ai.general.scriptrepository.Adventurer3plugin.ai.general.scriptrepository.Adventurer.State0plugin.ai.general.scriptrepository.ChickenKiller6plugin.ai.general.scriptrepository.ChickenKiller.State,plugin.ai.general.scriptrepository.CoalMiner9plugin.ai.general.scriptrepository.CoalMiner.BankingPulse2plugin.ai.general.scriptrepository.CoalMiner.State,plugin.ai.general.scriptrepository.CowKiller2plugin.ai.general.scriptrepository.CowKiller.State0plugin.ai.general.scriptrepository.DraynorFisher6plugin.ai.general.scriptrepository.DraynorFisher.State1plugin.ai.general.scriptrepository.DraynorWillows7plugin.ai.general.scriptrepository.DraynorWillows.State0plugin.ai.general.scriptrepository.FarmerThiever7plugin.ai.general.scriptrepository.FletchingBankstander=plugin.ai.general.scriptrepository.FletchingBankstander.State3plugin.ai.general.scriptrepository.GenericSlayerBot9plugin.ai.general.scriptrepository.GenericSlayerBot.State8plugin.ai.general.scriptrepository.GenericSlayerBot.Task;plugin.ai.general.scriptrepository.GenericSlayerBot.TaskHub:plugin.ai.general.scriptrepository.GlassBlowingBankstander@plugin.ai.general.scriptrepository.GlassBlowingBankstander.State4plugin.ai.general.scriptrepository.GreenDragonKiller:plugin.ai.general.scriptrepository.GreenDragonKiller.StateAplugin.ai.general.scriptrepository.GreenDragonKiller.MeleeSwinger@plugin.ai.general.scriptrepository.GreenDragonKiller.MageSwingerAplugin.ai.general.scriptrepository.GreenDragonKiller.RangeSwinger(plugin.ai.general.scriptrepository.Idler1plugin.ai.general.scriptrepository.LobsterCatcher6plugin.ai.general.scriptrepository.LobsterCatcher.Sets7plugin.ai.general.scriptrepository.LobsterCatcher.State-plugin.ai.general.scriptrepository.ManThiever2plugin.ai.general.scriptrepository.NonBankingMiner3plugin.ai.general.scriptrepository.PlayerCompatible4plugin.ai.general.scriptrepository.ScriptDescription3plugin.ai.general.scriptrepository.ScriptIdentifier-plugin.ai.general.scriptrepository.ScriptName,plugin.ai.general.scriptrepository.SeersFlax2plugin.ai.general.scriptrepository.SeersFlax.State2plugin.ai.general.scriptrepository.SeersMagicTrees8plugin.ai.general.scriptrepository.SeersMagicTrees.State/plugin.ai.general.scriptrepository.SharkCatcher4plugin.ai.general.scriptrepository.SharkCatcher.Sets5plugin.ai.general.scriptrepository.SharkCatcher.State6plugin.ai.general.scriptrepository.VarrockEssenceMinercore.game.node.entity.state.newsys.states.GodspellChargedState8core.game.node.entity.state.newsys.states.IncubatorState;core.game.node.entity.state.newsys.states.ShootingStarState6core.game.node.entity.state.newsys.states.SkulledState2plugin.ai.general.GeneralBotCreator.BotScriptPulse3plugin.ai.general.GeneralBotCreator.TransitionPulse0core.game.content.ame.events.SandwichLadyHandler2core.game.content.ame.events.SandwichLadyInterface.core.game.content.ame.events.SandwichLadyEvent>core.game.content.ame.events.SandwichLadyEvent.SandwichLadyNPC>core.game.content.global.worldevents.holiday.CandyRewardPlugin9core.game.content.global.worldevents.holiday.GrimDialogueAcore.game.content.global.worldevents.holiday.SimpleHalloweenEvent(core.game.world.map.path.SmartPathfinder7core.game.node.entity.combat.handlers.MagicSwingHandler7core.game.node.entity.combat.handlers.MeleeSwingHandler7core.game.node.entity.combat.handlers.MultiSwingHandler7core.game.node.entity.combat.handlers.RangeSwingHandlercore.game.node.entity.skill.hunter.tracking.PolarKebbitHunting5core.game.node.entity.skill.hunter.tracking.TrailType?core.game.content.activity.gnomecooking.battas.GnomeBattaCookerCcore.game.content.activity.gnomecooking.battas.GnomeBattaDishFillerBcore.game.content.activity.gnomecooking.battas.GnomeBattaGarnisherBcore.game.content.activity.gnomecooking.battas.GnomeBattaInterfacePcore.game.content.activity.gnomecooking.battas.GnomeBattaInterface.CookedProductGcore.game.content.activity.gnomecooking.battas.GnomeBattaPrepareHandler3core.game.node.entity.player.info.login.LoginParser5core.game.content.consumable.effects.RestoreSummoningcore.game.content.quest.members.thelosttribe.LostTribeCutsceneCcore.game.content.quest.members.thelosttribe.LostTribeOptionHandlercore.game.content.quest.members.thelosttribe.PickpocketSigmund@core.game.content.quest.members.thelosttribe.SigmundChestHandlerplugin.creditshop.CreditShopcore.gui.ConsoleFrame6core.game.node.entity.player.link.ConfigurationManager)core.plugin.CorePluginTypes.ManagerPlugin#core.net.amsc.ManagementServerState%core.game.content.global.SkillingPets(core.game.content.global.BossKillCountercore.net.IoReadEvent?core.game.node.entity.player.link.diary.AchievementDiaryManager>core.game.content.quest.tutorials.tutorialisland.TutorialStage0core.game.node.entity.combat.equipment.SpellType+core.game.container.impl.EquipmentContainer'core.game.node.entity.state.EntityStatecore.game.content.eco.EcoStatus&core.game.node.entity.skill.SkillPulseUcore.game.node.entity.skill.construction.decoration.portalchamber.PortalChamberPlugin)core.game.node.entity.skill.slayer.Master3core.game.world.update.flag.player.FaceLocationFlagcore.game.node.entity.Entity7core.game.node.entity.skill.runecrafting.MysteriousRuin,core.game.node.entity.skill.magic.MagicSpell(core.game.node.entity.player.info.Rights@core.game.content.quest.PluginInteractionManager.InteractionTypecore.game.ge.GEItemSet7core.game.node.entity.combat.ImpactHandler.HitsplatType(core.game.content.consumable.Consumables%core.game.node.entity.npc.AbstractNPC&core.game.node.entity.state.StatePulse8core.game.node.entity.skill.fletching.Fletching.GemBolts3core.game.node.entity.player.link.prayer.PrayerType)core.game.content.quest.PluginInteraction0core.game.node.entity.skill.construction.Servant0core.game.node.entity.combat.equipment.ArmourSet1core.game.node.entity.player.info.login.LoginType)core.game.interaction.npc.bob.BobDialogue'core.game.content.global.SkillcapePerkscore.game.world.map.Location+core.game.node.entity.player.link.SavedData&core.game.container.impl.BankContainercore.plugin.PluginType)core.game.content.dialogue.DialoguePlugin)core.game.node.entity.skill.smithing.Bars3core.game.node.entity.skill.agility.AgilityShortcut$core.cache.def.impl.ObjectDefinition)core.game.content.activity.CutscenePlugin.core.game.node.entity.skill.runecrafting.AltarGcore.game.node.entity.combat.equipment.WeaponInterface.WeaponInterfaces'core.game.content.consumable.Consumable.core.game.content.global.travel.glider.Gliders.core.game.node.entity.player.link.emote.Emotes core.game.world.map.zone.MapZonecore.game.node.item.GroundItem#core.game.component.ComponentPlugin1core.game.node.entity.combat.equipment.BoltEffect6core.game.interaction.item.toys.DiangoReclaimInterface"core.cache.def.impl.ItemDefinition/core.game.world.repository.InitializingNodeList(core.game.node.entity.impl.ForceMovement:core.game.node.entity.skill.crafting.spinning.SpinningItem+core.game.content.dialogue.FacialExpression-core.game.node.entity.player.link.quest.Questcore.game.ge.OfferState:core.game.content.quest.miniquest.barcrawl.BarcrawlManager#core.game.interaction.MovementPulse2core.game.node.entity.player.link.SpellBookManager,core.game.world.map.zone.impl.WildernessZoneplugin.ai.pvmbots.PvMBots&core.game.content.activity.mta.MTAZonecore.game.system.SystemUpdatecore.game.system.SystemState#core.game.interaction.OptionHandler$core.game.interaction.UseWithHandler7core.game.node.entity.skill.construction.RoomProperties#core.game.system.command.CommandSet/core.game.node.entity.skill.gather.SkillingTool(core.game.node.entity.skill.slayer.Tasks#core.game.content.global.RepairItem:core.game.node.entity.skill.summoning.familiar.BurdenBeast$core.game.world.map.zone.ZoneBuilder(core.game.node.entity.combat.CombatStyle5core.game.node.entity.skill.construction.HousingStyle7core.game.node.entity.skill.summoning.familiar.Familiar1core.game.node.entity.skill.herblore.GrindingItem3core.game.node.entity.skill.construction.Decoration5core.game.node.entity.skill.construction.BuildHotspot5core.game.content.quest.members.asoulsbane.ASoulsBane0core.game.node.entity.player.link.IronmanManager(core.game.node.entity.combat.CombatSpell>core.game.node.entity.player.link.TeleportManager.TeleportType-core.game.content.ttrail.TreasureTrailManager7core.game.node.entity.player.link.appearance.Appearance-core.game.node.entity.skill.summoning.pet.Pet!core.game.content.global.BirdNestcore.game.node.entity.skill.fletching.Fletching.FletchingItems6core.game.node.entity.combat.equipment.WeaponInterface9core.game.interaction.item.brawling_gloves.BrawlingGloves1core.game.world.update.flag.player.AppearanceFlag7core.game.node.entity.player.link.quest.QuestRepository,core.game.node.entity.player.link.GlobalData&core.game.content.activity.mta.MTAType4core.game.node.entity.skill.gather.mining.MiningNode@core.game.content.activity.pestcontrol.PestControlActivityPlugin)core.game.content.ttrail.ClueScrollPlugin'core.game.node.entity.skill.magic.Runes0core.game.node.entity.player.info.login.Response6core.game.node.entity.skill.construction.HouseLocation-core.game.node.entity.player.link.IronmanMode8core.game.node.entity.combat.equipment.Weapon.WeaponType#core.game.world.repository.NodeList#core.game.node.entity.player.Player3core.game.node.entity.player.link.music.MusicPlayercore.game.world.map.Direction!core.game.component.InterfaceTypecore.net.NioReactor core.game.content.global.GodType1core.game.node.entity.player.link.diary.DiaryType1core.game.node.entity.skill.construction.NailType4core.game.node.entity.skill.summoning.pet.PetDetails:core.game.node.entity.player.link.BankPinManager.PinStatus3core.game.node.entity.player.link.appearance.Gender)core.game.content.activity.ActivityPlugin0core.net.packet.context.CameraContext.CameraTypecore.net.packet.PacketHeader$core.game.content.ame.AntiMacroEvent4core.game.node.entity.player.link.grave.GraveManager"core.game.content.ttrail.ClueLevel1core.game.node.entity.skill.crafting.GlassProduct4core.game.node.entity.skill.summoning.SummoningPouchcore.game.node.entity.npc.NPC4core.game.node.entity.player.link.emote.EmoteManager8core.game.node.entity.player.link.diary.AchievementDiary,core.game.node.entity.impl.Animator.Priority1core.game.node.entity.skill.agility.AgilityCourse core.game.node.object.GameObject@core.game.interaction.item.brawling_gloves.BrawlingGlovesManagercore.game.node.item.ChanceItem'core.game.world.map.build.DynamicRegion*core.game.interaction.inter.GlassInterface0core.game.node.entity.skill.slayer.SlayerManager,core.game.node.entity.npc.drop.DropFrequencycore.game.content.global.Dyes(core.game.node.entity.state.StateManager9core.game.content.activity.mta.impl.EnchantingZone.Shapes&core.game.content.ame.AntiMacroHandler&core.game.node.entity.combat.DeathTaskcore.game.node.item.ItemPlugin(core.game.world.map.zone.ZoneRestrictionplugin.ai.pvmbots.NoobBot8core.game.interaction.item.TeleTabsOptionPlugin.TeleTabs5core.game.node.entity.skill.summoning.SummoningScroll'core.game.system.monitor.DuplicationLog>core.game.node.entity.skill.summoning.familiar.FamiliarManager0core.game.node.entity.player.link.BankPinManager&core.game.world.update.flag.UpdateFlag+core.game.node.entity.player.link.QuestData.core.game.node.entity.player.link.ActivityData)plugin.ai.skillingbot.SkillingBotsBuilderplugin.ai.pvmbots.DragonKiller6core.game.node.entity.skill.summoning.pet.IncubatorEgg!core.cache.def.impl.NPCDefinition5core.game.node.entity.skill.construction.HouseManager5core.game.node.entity.player.link.appearance.BodyPart4core.game.node.entity.skill.construction.ServantType%core.net.packet.context.CameraContextplugin.ai.AIPlayer:core.game.node.entity.combat.equipment.DegradableEquipment)core.plugin.CorePluginTypes.StartupPlugincore.plugin.PluginManifest&core.game.system.monitor.PlayerMonitor2core.game.node.entity.skill.runecrafting.RunePouch2core.game.content.activity.mta.impl.EnchantingZoneOcore.game.interaction.npc.bob.BobDialogue.BarrowsEquipment.BarrowsFullEquipment1core.game.node.entity.player.link.grave.GraveType1core.game.node.entity.skill.farming.HealthCheckerDcore.game.node.entity.skill.gather.woodcutting.WoodcuttingSkillPulse7core.game.node.entity.skill.farming.FruitAndBerryPicker/core.game.node.entity.skill.farming.CompostType/core.game.node.entity.skill.farming.CompostBins#core.net.packet.in.ItemActionPacket;core.game.node.entity.skill.farming.CompostBinOptionHandler$core.net.packet.in.InteractionPacket;core.game.node.entity.skill.farming.ToolLeprechaunInterface \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len new file mode 100644 index 000000000..de606c92e Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.len new file mode 100644 index 000000000..93a347a84 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.values.at new file mode 100644 index 000000000..bf9066026 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i new file mode 100644 index 000000000..de24bd898 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/jvm/kotlin/supertypes.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab new file mode 100644 index 000000000..0c6930c8b --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/counters.tab @@ -0,0 +1,2 @@ +486 +109 \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab new file mode 100644 index 000000000..5cdded6a7 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream new file mode 100644 index 000000000..5db980a03 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream @@ -0,0 +1 @@ +O/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/JSONUtils.ktL/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/Server.ktU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/ServerConstants.ktQ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/Varbit.ktO/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/Varp.ktV/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/VarpManager.ktb/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/camerautils/CameraUtils.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/camerautils/PlayerCamera.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeacon.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeaconHandler.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFURepairClimbHandler.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUSession.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/allfiredup/BeaconTenderDialogue.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/barrows/RewardChest.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerActivity.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOverlay.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerSession.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/TrawlerLoot.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fog/FogInteractionHandler.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/fog/ReggieDialogue.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/DeliveryBoxHandler.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GCRewardTokenHandler.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingConstants.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingJob.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeTipper.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFiller.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaGarnisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlGarnisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlPrepareHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFiller.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailCooker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailShakerHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyGarnisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFiller.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/mta/EnchantSpell.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlHelper.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderSession.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyHandler.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyInterface.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyNPC.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/consumable/effects/RestoreSummoning.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AberabDialogue.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AchiettiesDialogue.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AfflictedDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AfrahDialogue.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AgilityBossDialogue.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AgmundiDialogue.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneJrDialogue.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneSnrDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/AsyffDialogue.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/BlurberryDialogue.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/BrotherBordissDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/ElsieDialogue.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/GabootyDialogue.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/GeoffreyDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/IffieDialogue.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/LegendsGuardDialogue.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/LensaDialogue.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/MistagDialogue.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/OttoGodblessedDialogue.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/SkillDialogueHandler.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/ThormacDialogue.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/dialogue/WysonTheGardenerDialogue.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/action/PickupHandler.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/travel/EssenceTeleport.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEvent.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEventInitializer.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/CandyRewardPlugin.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/GrimDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/SimpleHalloweenEvent.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/LarryHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/NotebookHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinManager.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpawner.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStar.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarCommands.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarEvent.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarLogin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarMiningPulse.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/StarSpriteDialogue.ktb/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/JobManager.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/WorkForOptionHandler.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/impl/GatheringJob.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/jobs/impl/SlayingJob.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/CooksAssistant.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/GillieGroatsDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/LumbridgeCookDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/MillieMillerDialogue.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/AllFiredUp.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/SquireFyreDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/SoulsBaneLaunaDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorker.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BranchFletcher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/Draugen.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FishOnAltar.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/KegOnKegAction.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LalliDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LyreOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ManniDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/OlafTheBard.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PipeInserter.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PoisonSalesman.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenLadder.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenPortals.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TalismanHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TinderboxOnBomb.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPC.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveRockHandler.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveZone.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/DorgCbowEquipPlugin.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/GoblinFollower.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/KazgarDialogue.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribe.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeCutscene.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeOptionHandler.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickaxeOnRubble.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickpocketSigmund.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/SigmundChestHandler.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/CartConductorDialogue.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/DwarvenBoatmanDialogue.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimCartMethods.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimPlugin.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/Reinald.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface.ktW/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/BotPrices.ktY/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/GEAutoStock.kt`/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/GrandExchangeOffer.ktZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/OfferManager.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/ge/PlayerGrandExchange.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/CorporealBeastWarningInterface.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/FOGRewardsInterface.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/ItemOnBankBooth.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/QCRepository.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/city/IsafdarPlugin.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/city/MorytaniaPlugin.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/ChocatriceIncubationInterface.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/ExperienceInterface.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/FairyRingInterface.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/FurClothingInterface.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/HairDresserInterface.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/MakeOverInterface.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/PuppyInterfacePlugin.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/inter/ThessaliaInterface.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/BraceletOfClayPlugin.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/EnchantJewelleryTabOption.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/GrandSeedPodHandler.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/withitem/CapeDyer.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/item/withobject/CoalTrucksHandler.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/npc/BogrogPouchSwapper.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/DemonTauntHandler.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/FairyRingPlugin.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/GutanothChestPlugin.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/JungleBushHandler.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/object/MuddyChestHandler.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/interaction/player/PeltOptionPlugin.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/CombatPulse.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/CombatSwingHandler.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/equipment/EquipmentDegrader.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MagicSwingHandler.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MeleeSwingHandler.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MultiSwingHandler.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/RangeSwingHandler.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/handlers/SalamanderSwingHandler.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/combat/special/LiquefySpecialHandler.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/equipment/BarrowsEquipmentRegister.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/equipment/PVPEquipmentRegister.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/equipment/SnowballEquipmentPlugin.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheFarmerDialogue.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheGuard.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheSmithDialogue.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheHagDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheMayorDialogue.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheOperator.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/npc/other/AlKharidWarriorPlugin.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginParser.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaveParser.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaver.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatAttributeKeys.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatsCommandSet.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryLevel.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/BarbarianOutpostCourse.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/GnomeStrongholdCourse.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/WildernessCourse.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/PipeShortcut.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/RockClimbShortcut.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/Hotspot.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/ShavingStandHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/WardrobeHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/costume/ToyBoxPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/LecternPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/cooking/ChocolateBarCutter.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LanternCrafting.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisher.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceLighter.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSources.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CropHarvester.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/DigUpPatchDialogue.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/FarmingPatch.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/InspectionHandler.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/Patch.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchRaker.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchType.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/Plantable.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithPatchHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/gather/PickaxeRepairPlugin.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningSkillPulse.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindItemPlugin.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitEast.kt}/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitWest.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/HunterTracking.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/PolarKebbitHunting.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/TrailDefinition.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/PouchManager.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouchPlugin.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/Skillcape.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPlugin.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin.ktz/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapePerks.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/thieving/Pickpocket.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/PlayerState.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/State.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/StateRepository.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/AvaDeviceState.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/DiseasedState.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/FarmingState.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/GodspellChargedState.kty/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/IncubatorState.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/ShootingStarState.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/SkulledState.kt^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/SystemLogger.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/Command.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/CommandPlugin.ktg/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/CommandSystem.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/MapDumpCommand.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/oldsys/AIPCommandPlugin.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/oldsys/SimpleDumpingCommands.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/oldsys/VisualCommand.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithNPCDialogue.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithPlayerDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoUseWithHandler.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/AnimationCommandSet.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/BottingCommandSet.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/CommandSet.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/ConfigCommandSet.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/DevelopmentCommandSet.ktl/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/FunCommandSet.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/MiscCommandSet.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/ModerationCommandSet.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/MusicCommandSet.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/QuestCommandSet.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/SlayerCommandSet.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/SpawnCommandSet.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/SystemCommandSet.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/command/sets/TeleportCommandSet.kte/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ConfigParser.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/DoorConfigLoader.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/DropTableParser.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/GroundSpawnLoader.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/InterfaceConfigParser.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ItemConfigParser.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/MusicConfigLoader.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/NPCConfigParser.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/NPCSpawner.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ObjectConfigParser.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/RangedConfigLoader.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ServerConfigParser.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/ShopParser.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/system/config/XteaParser.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/DeadlockDetector.kt]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/GameSettings.ktZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/GameWorld.kt]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/ImmerseWorld.kt\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/PulseRunner.kte/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/callback/CallbackHub.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/map/path/SmartPathfinder.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/repository/DisconnectionQueue.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/repository/Repository.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/MapChunkRenderer.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/NPCRenderer.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/PlayerRenderer.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/UpdateMasks.ktf/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/world/update/UpdateSequence.kt^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/event/LoginReadEvent.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/in/ItemOnGroundItemPacket.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/net/packet/in/QuickChatPacketHandler.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/CorePluginTypes/XPGainPlugins.ktZ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/plugin/PluginManager.ktV/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/Interfaces.ktQ/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/Items.ktU/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/TickUtils.ktc/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/tools/stringtools/StringTools.kt^/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/worker/MajorUpdateWorker.ktW/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/AIRepository.ktd/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/GeneralBotCreator.kt\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/ScriptAPI.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Adventurer.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ChickenKiller.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CoalMiner.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CowKiller.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorFisher.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorWillows.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FarmerThiever.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FletchingBankstander.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GenericSlayerBot.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GlassBlowingBankstander.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GreenDragonKiller.kti/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Idler.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/LobsterCatcher.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ManThiever.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/NonBankingMiner.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerCompatible.ktq/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerScripts.ktu/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptDescription.ktt/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptIdentifier.ktn/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptName.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersFlax.kts/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersMagicTrees.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SharkCatcher.ktw/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockEssenceMiner.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockSmither.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatState.kt{/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate.kt~/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlIntermediateBot.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlNoviceBot.kt\/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBot.kte/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBotAssembler.kta/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBotsBuilder.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotAssembler.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/BarbFishingPulse.ktm/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/FishCuttingPulse.ktj/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/KnifeWithFish.ktk/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/OptionHandlers.kth/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/barbtraining/fishing/SpotManager.kt]/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/plugin/creditshop/CreditShop.ktr/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/HealthChecker.ktx/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/FruitAndBerryPicker.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostType.kto/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBin.ktp/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBins.ktv/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithBinHandler.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBinOptionHandler.kt|/home/ceik/IdeaProjects/2009scape/Server/src/main/java/Server/core/game/node/entity/skill/farming/ToolLeprechaunInterface.kt \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream.len new file mode 100644 index 000000000..030321d69 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.len new file mode 100644 index 000000000..59bd2ee62 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.values.at new file mode 100644 index 000000000..369aff363 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i new file mode 100644 index 000000000..ebaa9ce8c Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/file-to-id.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab new file mode 100644 index 000000000..ccd0ecf21 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream new file mode 100644 index 000000000..f5dbd3732 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream.len new file mode 100644 index 000000000..55ea8d5b4 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.len new file mode 100644 index 000000000..47851a6cc Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values new file mode 100644 index 000000000..05084be50 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.at new file mode 100644 index 000000000..1c730174f Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.s new file mode 100644 index 000000000..f2dcc5152 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab.values.s @@ -0,0 +1 @@ +T \ No newline at end of file diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i new file mode 100644 index 000000000..e0652b644 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len new file mode 100644 index 000000000..131e26574 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/id-to-file.tab_i.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab new file mode 100644 index 000000000..22594a611 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream new file mode 100644 index 000000000..acd46e664 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len new file mode 100644 index 000000000..e67d97ded Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.keystream.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len new file mode 100644 index 000000000..5deb7a8ff Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.len differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values new file mode 100644 index 000000000..39be0a419 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.at b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.at new file mode 100644 index 000000000..56d8f6136 Binary files /dev/null and b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.at differ diff --git a/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.s b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.s new file mode 100644 index 000000000..c0ba7a4d2 --- /dev/null +++ b/Server/build/kotlin/compileKotlin/caches-jvm/lookups/lookups.tab.values.s @@ -0,0 +1 @@ +߃yɑuڗ؟wZ@jAheN|hMy]N\_N{VMXMLt_CKUNOK}:ۑ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Server/data/RDT.xml b/Server/data/RDT.xml new file mode 100644 index 000000000..176a86439 --- /dev/null +++ b/Server/data/RDT.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Server/data/botdata/botnames.txt b/Server/data/botdata/botnames.txt new file mode 100644 index 000000000..ff8479c13 --- /dev/null +++ b/Server/data/botdata/botnames.txt @@ -0,0 +1,8429 @@ +Sow Love +Srogi Wujek +Czar +Puglet +Pappanopolis +Asterlyte +Sidocahn +Desigium +Spunknik +SPLEEBTEZ +RealRicFlair +3xDestroyer +DaemonTool +DIY Ele +Darkflash15 +ImZorp +Grafvs +MMitchh +Cic321 +Respaze +Falconz420 +xI3reeze +Sazzarull +Lehoir +DailySharts +Lt_Torch +WonkyShlonky +IronBeanz +Toreransu +TzTok-1gBud +Sweatscaper +Psysyk +uppahoods +dandy man +Legikt +ScoobiedO0 +My Gentiles +BabyB +Lavafrost +Seriousruss +FatalXfire +LadyStarlite +Dreamguy +Lestersaurus +agent_of_fox +NtQuiteRamb0 +Hexxjan +MayanFuror +RaspyLemon +tRIPdoubt +aku aku1212 +Gangnrad +Luzu +bdz +Deathit55 +Ding-A-Ling2 +CannoliBoi +Legion2410 +Orthago +Lrauq +Overrated +NikkiQT +L3sius +Zack0ry +TBSG-Baine +Arrowmind +Deathcloude +Ynka +B5l +Lann +C0c0nUt +Impriznd +Spoonay +Hardlesas +Iblushh +un1versa1 +RIpuim +Hazed +Erinus +darkxaotik +WispyWolf +cunnys +NFed +Infobese +Goblinborn +AHHSCHMEEEEE +Thomarse +FacelessBoyd +Moska +GuyHarvey +Folfox +Sabina +kyurem_vrah +Tutoroo +Fctillidie +Kezmaya +xenvzi +FriendlyJo +Hegelund +Fallenchamps +Novahria +Antweezy +Qoki +Budwise +zwint +O56 +Gargoyle79 +sunaert +MartnShkreli +Zehbu +Gizmoed +FabiScape +iCheezedOff +SmokerOfDank +RalvekZul +s3nna +Kita +CloudT +Elasticy +Raje +Uranus +Anthony5002 +ugivahrimjob +usma6100 +firemadara +YuckFou +Hashiiirama +Stureplan +Charmoul +Pyfa +RZAlex +s1ayerg0d +Glo-Tank +Donchz +SquidSquad +Vuuututututu +ThinPeepoSad +Praecellemus +6TMG +Plugatron +Pinkywinky9b +Ragnell56 +Twntythree23 +SirCapper +ilike2gamble +Demco +Gopuppy +TheCollected +Stinkwiener +Envvi +flyingfather +Chopemania +Siggie +IVIugginz +Linsunt +Tupoopsa +henzer +MichaelScott +Tine +Jayhawk225 +iRekt +SnekInMyBewt +LightRigger +1Hunnid +Maniwani +Burnardo +Bmart +Aureou +SUPERSET q +Slapmeister +DSyndrome +Big Arms Ben +SlayzyDayz +1badprogram +CFoodBisc +Kraq +Agentbunny1 +Looted +Edwarriorx +RapidCycling +XKappaX +PVMGrim +Zip Lynx +ExtractorX +ED9 +Noolbort +Aedon +Zioo +Neanderthal +swordsplay62 +Getfck3dup +Maroon5 +AHarmlesKitn +Wreckanism +GiveMeMaul +Homelander +Nuke Rofl +rdx +Zenytum +Westwich +KidLeaderKTY +vengedurmom +LelSickMeme +Griffoo +Fukinnnn +DonnieAssie +Kimbu +TheDyr61 +Nocarred +Rusty99 +LonelyOnT0p +riilis +Hardwaring +Farsight2 +AskMeDolCare +MrCoolSkills +HarryTheWhte +duMonster +CaptainLuker +RMAC-97 +JohnnyBeanz +pipratoos +6l7 +StoryofPete +ElPoyoSenpai +Egorous +Remiejj-BV +ElitePvmer +HumanToxin +Aladfar +Daley_Dose +ScottsTotlol +bakkerbtw +Butlergunner +GilgaGaming +MakeNotes +asibioass +benjiswaggod +Mentalmissy +Tricomb +noswaL +i r muffin +Kayzielol +Henkkawaa +AvidTech +Syndrious +ThiccDaddyXL +XTCarlo +Grenenjah +Wuteng +Tonka742 +iZorru +ItsFinn +Sugmabum +Lifezajoke +Chicanery +ProLegend +ChilidogBank +BADPanda2 +Yabui +DraggSlayaa +Freesoul +Gjerloew +chongsbong +EvenMater +idkgoogleit +Ak5u +Simon Jnrr +beenus42 +zWxLF +brizzle +Kuhvon +bigpompom +BoobyHill +Vesryn +Chocomalo14 +TheAdzz +Erg129 +Dabbadank +DrDruen +superr +imBetter123 +Kuler +Kuler +brothervoid7 +retrrd +Whiteboy016 +Diampromidi +OhJezuz +Sumuinen +SAUCEnJUICE +justLush +Elchapo24 +Zardua +Keit +Kalu1337 +MuffinActual +actofvalor24 +reitan2k +rthgo200 +Walktellfox +hulrikon94 +Zelnite53 +JeJoat +0n7 +Swaxel +Teetoh +Moul +Bionycle +Jonxsy +Nhyrenn +core63 +Wripzi +Dekul +xeravier +Biscuitnipz +GrommrUK +Sw3Frost +Macedo +SmokinBlunts +System_Fail +Pasadinas +Fly-TheW +famousbutnot +HalfAb0rted +Anaphylaxiss +Carcinoid +Ast 360 +kaljunaama +snakehuntr94 +Magic_Elmo1 +Marklyft +Mintvolcano +JungleKitty +triple pre +Romic +Heinamies +Kungfuu000 +Rahdyxc +Kaylizz +Lewdberrypie +6pathsofpein +BillyNotRlly +HoopaLoopz +Adorations +Tsumikitty +MaybeMitch +JRxs +SimplySendIt +Mannowrath +WeTsHaDoW +bugsijs +NormanBates +Meeeseek +Slorkie +Schweigende +Dunwall +JulmaJoe +DJMileyCyrus +iKristov +Pb Fe +demaguz +Elliebus23 +B Minor +PlumTickler +steadiskill +JoRouss +Iron Masuli +thinker +Kyersago +Spiderhead +Gijsbart +Calvin +Diamonds lit +EngelNacht +Otyugh +Kitsunemimi +YeaAiiiiite +Bhakli +Sidewinder15 +Unsainted +Brittanys +Luskidoo +Binny +The0G +Lbuzz +CraftyRunes +Eitsei +sticky clay +FuggleQuest +Requilog +bedburn +ChichaBabby +TeddysMoo +Niels1608 +dcPain +Workin +DarKSsoul69 +Raab +DlONNE +SiRzZ Zeref +Jc_TheCops +Lettuce_8 +fudkingname +BeatboxRS +brtsbrg +Manantti123 +loloharqia +Hotadelchic +Protectlilb9 +Tiazen +BeaterGod +HeresALlama +ouououuoouuu +Cleatis +Nova Rez +Yu Stinkipu2 +Merricat +BSven-B +IronKapp +PreNew +Xerona +Evrybodypays +Undeadd +DobbyGotPwnd +Aerros +DigBicker +PuseSlayer +csramsus +Fantikerz +NovaNova_v1 +Enphadei +yacobson99 +Reload +viktoras300 +Killgor138 +Barstukas +D0NPABLO +KingLeonidas +7042 +Elephanten +I Dizz I +BainoLad +Oximas +namtar elite +Galamx +MidniteGreen +1jbone +aphr0 +FrodoBogues +RequireBone +Scimmy2face +xMardy +IronJakeT +joey0343 +Mage7master7 +JimmyBuns +RiftOversoul +Trunker +Adamanta +ToastMal0ne +Pandeh +Colzy +Jamzylockz +Dan-Reijden +Santhacine +Dwake +Danex85 +CG MindPr0 +7th February +CompleteSpud +Seto292 +CandyFlipin +Doajiggi +neocritter +Mosbol +Nuwanda +FLgoob +F0ZI +Kourk +Cuti +Spermlet +Rowoep +Magnusungam +Strugl +Thunder Gate +lunch roll +BowlCutMonty +Woody8 +heuj speulen +Madaddam +jossejoks123 +Headgaskets +5639 +Fire Fiesta +Cornbuddy +zCocoa +cash pls +Greaterbeing +arengs +Zairx +Lucasmelo11 +slajdaren +JimmahDean +hiiggiinss_5 +pontlarge +MuchosAssias +Rngclown +SatanicFart +Wruumze +iojerfwpjiof +Rinsumageast +Techno9 +SleanClate +Xolun +CtCandyRandy +Gomsugo +Assload +BichoFeote +Ajeti +Aedreius +ellran +GatoNaranja +Outsider058 +Dedressing +Dunnill +R0R0R +silentical +IronVegtable +HereFor_Beer +im solo rose +Honeyyyy +Mahzius +Hold3nMc +BlackPyramid +XAAXAA +Michairon +MnkyDLufy +ChivZz +Faerindel +Suzshenron +SaturnHippo +Elite387 +skaiii +NobleVespo +Kirthor +Cosaintus +NyxxiePixxie +Px_7UX8Cy8 +Kaser +RealScythe +will_mello +leewhiffy +MyLoveFaith +Gontr +Mobz +Danniel +ScottJ +Titsferdayz +Heat +Loeffen +Bazz0r +0niichan +Patmantheman +Indrias1 +Upriser +BamfJoe +Pritje +Bussino +Donnieduke +Lanzlol +PeppiEnSossi +aaahChu +goGETTER87 +Sharing +monkeywilly +MrPowers +GucciBalboa +iPvM_Soul +Slise745 +WelbyBree +b-ray29 +duhpho +Tanza +ogteleblock +WeaIth +xDieter +Yekhsad +iGlowGreen +H0B0 +WestTxBoyz +blueWagonMan +Boxacle +Rihmakallo5 +gggochu +Cheepnis +Chinchoopa +Scoopie +MajorMammoth +Stupsus +Judddy +Syncshot +Im_Stone126 +4it +Placedoemax +JuiceUSA +Zwei_02 +Artychurro +SooUnlucky +IHaveAWifey +look4clues +EsterKai +OG H4zed +Ge0rgeburton +Boostedd +Cesema +TrainingDays +Zavinor +DadamoSte +Zixxen +Evo9 +CieloQueen +Misticwok +Dellamor +boratas13 +Floogan33 +Roebie1 +LostMoon +Vaull +Sk1llzy_RS +Solan +v3kz +Evillized +Bonduwel +Moniez +Detriment +Choicess +xHades +Makeboy +OrionDragon +c-ross93 +dog22 +Character252 +Googleisme +Carkosa +Nasrullah +Guelph +Caracal +YomamaPro +Hegert +TBonFirstCoX +colafanboy +Lucidfever +Potoo +JagerBombski +Eldia +Fishoii +buryafriend +St0oge +Velgreed +x8mz3hg7zm5f +Flopez +lREKEEN +Spoodersussi +0miseGo +JSco +Dff +7 Trouts +Poofpooh +Lonksu +Australiaz +itsGLD +Spaget1111 +OGBloodFam +JusticeSven +PhriarPhace +Crittx +MyNameIsCole +Beugsmate +BkGime +SonBuns +KronicPlague +Wolwa +mtash96 +NietzscheJR +siimzz97 +DrBeast +lrh +Happyfrog12 +LlHAPIIRAKKA +Audylinks +AGorski +Snorklarn +Krystalbead +Kryoge777 +liberteeeee +pleadtha5th +M0ON +Donald Dumps +SpideyC +T0othbrush +Edwin Ownz +Komai +Boookuh +CallMeSofD +LightB0ne +i0 strength +LeccaJr +KingCudii +uTBER +Deviljin583 +xli +lm2fas4u +AlexODaGreat +Jadavius +RunRonRun +Villanovan +gladwin97 +Scharnhorst +elefantsrul +DabInMyEye +Kunsel +Kid K O N G +Submug +Secwai +ScaryVacoom +Danoj +guttsberserk +Xanfan +YorickMorty +Knowledge +Quaffle9 +Stoffins +Jonnisjoen +TruckersLife +dark0hawk +VeganVibes +97DEF +AussieSparta +Propas +AnotherName +Zealicious +Gehrman +TenebrisMeam +TheValuable +VlNTER +TURDENATOR +184910381412 +OppaSky +99S2HP +Barrowry +realAxu +DatGuySteve +Lord Vioarr +Lowlux +BaccaM +yolomuffin +Luigihbk +WlLL +Liberaxa +Jordan030592 +iSteele +farva5001 +KxNoTTz +evoshiva +FeelinHappy +xBeerbear +HDGamerLewis +Thelvereas +Teledogs +Ritrole1 +Maxell +JoeGas +Swollbroham +PapaJohn +Nassim +Neverender27 +JayjayNeo01 +ThaLawl +Silentzsword +Xenofile +Arrandarls +Lolitsleeroy +Karnivore +Olvi +Demising +Lion0fZion +StirG29 +Meramon +Lewir +Daddyplease +AppySauce4 +rubtuge +JCutler +TMG +trucker74 +Nbba +goku9172 +xpeyotex +AlMusallam95 +darkgirl79 +MizzFrizz +Summit603 +xt0 +Khazad Dum +ArcticMank +Aloha +SquirtyHersh +weedsmoke163 +HshBrwnClwn +241196 +PauletteRose +Slayerburger +sgg9779 +Arslen +Big Binotte +MUMM0 +Jusfat +Zuremate +Ulyanyx +IronGez +Mgw +Subwrx +thezucc +Gamboy46 +Rizzzyisback +Sunscape6 +Frogwork +Yundastan +Jahbby +Doodled +Jet3010 +Gavita +lCEBERGSLIM +CookieV3 +EnjoiAssault +fartsogood +SogSteelrock +StratusQc +Slayyer59 +BLXCKPINK +MarxTheMyth +Amatsukaze +Arnear +ArsonScape +Maul 0n Top +MommaCuz +AGP3 +klacen +Eposs +Nitt +AlivenHappy +Sverd +Scurrilous +frogmeme420x +skyelar27 +Claca +maksavelat +Resilient +Wahpan +Chillagalet +Frohobo +vissiman +Slayic +tallest +charlyzard +s0ultage +AlfaQ +Spruit +Senturia +spicke21 +imflavio +Milleks +Shame +DocVamp +CanChem +Alcerathe +YoSinNow +KoffieBoer +NinjasDark3 +Word2urmum +Krypsiss +ZoroRoronoa +Boxio +Kattarui +Spellgoth +BR00KES +VeryAvgRNG +Darthrodger +elderimpking +IctCat +Shoopdiesel +ShakaLakaInU +GEEZ0 +IronUnkilled +SchwanzLord +Killertribes +Lavadude42 +Silanz +GCMidlane +Doofe +BumPounder +Kaloex +WouterMarni +Sikskilla +verlord +Hurtigmads +Mauler_rocks +OGWhitePanda +XigZig +Casmatos +Aquaileo +BraBraBrad +Pauleee +Nurdal +tyguy +QueenOfCorn +Stoneator +Heywaddup +Squeakes_x +Mushrooms1 +fhisher9 +HaddlingOS +Leadfeathers +greenfleet1 +Careo +zer0sirisFHK +Nottarg +Fam Chi Boy +BV Martyr +Bj0rnsson +Kennyollie +McDongles +Colgate777 +Just Alright +Chiccbacca +FireAF +Tooomo +Erabeus +unlucky2020 +despotroast +Hollsyy +Aleous +Akmore720 +AnExperiment +TheNerve +ScorpioBoy +RosinHead710 +Flashbane +KonteNeuker +Sild +Wh1teSox +Macoinho +Toat +Padrew +Awezm +Typisch +Zeveria +WhyCantIPick +Pocy2 +MyNameIs +Iron Brinnie +Lighterfalz +jobljobl123 +Jack Reipan +kahleparta +Avlek +Lenfart +Snipor +ImTinyRiick +RegularPlank +Eldereon +Hjaldr +Mikebaker417 +J1ub +Leprincias +Zinixon +Tardysoap +Gzo +D Derbles +kingcuzh +b0rn2grill +Zhinky +Tenorman +FarFarOut +Paramost +Khune +Onebuc +Tinzo +Papicito +Muahhahaa +geusjj +Hazsle +IMnotQ +IronHammy +Absol-EX +Lez +karelzzzz +Kenesu +Opex +pinna67 +Urkchar +ControlAll +Thulean +Oikeisto +RahbHurt +Trillotani +Kez0 +1stlrfan +1845 +Skryze +Johanbtw +All Fore One +ALonelySpoon +donmaners +SZP-Qlimax +Feelsbadkapp +Jaka On Can +JamalBobaman +TyeMeUp +Iron Tutnin +Nichy +J3S5E +BlueFrogsOP +bbones +Areimer0606 +Iron G0liath +Vreaper +Hhmm45 +FinickySquid +Ninjymate +ThumbBwana +Bajkami +Simmi091 +I h8 farming +Jimbly +DingDongDell +SirDeimos +Afkwarrio6 +celliott94 +Massterduel +ENimmo +Xiff +Kijucatm +Arfex +Laftonn +Naviaux +ILOVEUBRAT +DontTellFeds +Eucaryptus +Creenen +PepsiTwist +habitus +GoldenArm647 +V3n3natis +TR0X +Ren_Otori +Christidog +SaltasVolfas +Klariany +Zeldaza +AVW +JohnWick39 +l_Thunder_l +Fev +SappieWappie +OSReaper +Yorga +ratzzzzzzzzz +zirreael +Conquar +Mayvex +BigYitties +notbennie +DaCatBeam +xMonkey +iamzed +RagToRiches +supnoobs10 +ElitesEyes +ovox +Juezz90 +TwistedGuard +Twisted_Ry +Fpr +Sandhog +mrkaramazov +Gankster +pur3gh0st99 +BlakTooth +M1NG3_GOO +Jeremiahlewi +HammZ +whoawhoami +deivvn +Chariot +Dhor +FailFish +Serori +sondrep +Im Christian +CHOPSTlCKS +Sleet56 +2olon +WayS1de +Zyleta +ARESCREED23 +Tulppu +Skinyoualive +karambaa69 +Tosetti +callmeqel +Damn +jonnetuinen1 +Tempthric +Kaltsu +Brech +LargeExpLamp +Hextra0rdnry +BR9 +freepknub337 +FatalReign +Kdash +9AO +SleazySEAL +DrHugecookie +RNGVRNG +Zephyrot +FiendinLo +187er +Zanakkusu +FTB +Dizza +MayhemMakers +TheMayne +rubengouveia +Aidann +DIETDRDIET +B Victor B +IronRait +Enrico +Seanii +Diz_OG +Vize Senpai +Orrey +Crayzee +xSweetHopex +Gnight +Yaboitrek +Uber Logan +ascott1 +grinschen +Pwca +Callmekee +Hunkadoris +Zixcon +Inaaya +HAXERFUGGv2 +xxpurskillxx +za33erklan +Leanlce44 +Xname4 +Dreiriez_69 +skipz1419 +madara666 +DrKushBurner +Guilles123 +Lvl30Ditto +Splasher +Fluxee +Snibzy +Godwise +Eusiriito +FingerBang +Gallaxy +Hardman +Freddiep +Imasin +allluminati +shumili +PepegaScape +iPvmForBank +Bville23 +geitz4 +Predaxx +iPatrickN +ChipRain +Heko +MRM +Blacktide1 +Prisimenu +MELAN00MA +Masylvain +Vehru +Manletti +gonsoLE +deadlyone69 +JannaMain73 +littlemc14 +Megnificent +Graveless +Stalphie +nuopisa +xBenny +Tournx72 +Zioh +Zpizz +Relloktion +SwollSoul +Br4w +EskimoFro +Alexander0k +Valdomiro B +Muggerman3 +sukc +Verbo +Jazo +Chef Bu Fang +Diamond2192 +SleepySus +Rizos +Hempopotamus +Syncire +ose420 +Somix +Kakashi69 +xVenomx9 +Iron Tinman +CheecHnChong +i 0nly skill +Bone Ur Hole +Carmillae +grandslamhit +Ba6y +RoyalD3sire +Applev2 +Justinkai +LeMoopey +xH1ckz +Sapin +Falloutah +SaintMilk +Iralimir +alpalmchal +Hespus +7lO +WAQQQ +Dexterity +Lx1I +wonniwonkaka +RedkaWodbull +mausre +BooleanSpl1t +MRButter +Delten +lazzabazza11 +Bp2 +Xzil +MeadowFall +Duuni-Pete +Deerboy7I7 +KuroKama +SuBRifleS +Millionsppl +MuchGpWaste +Sika-Mika +flapdrol2000 +Ironeyy +lionking-PVM +Aquellex +Nitroalkenes +Dains +brecht181 +JustJake +ChristyCloud +KeepoKeisari +TheMuel +spozz +RoBoRhino +SG8 +Abocrate +Viera22 +Dagsi27 +IanT +Mikeygirl94 +Hesson +JordyM +Psybae +EfficientBot +Wilters +Sarro +Dharoc +Rayner91 +LogHog8 +Purplekills +Saphie +littlebumble +Scotteh +dsvgs +Ravedeath +Renas +Daymien +Spookytoot +Jsnn +lampen69 +51Highlander +Deluvial +TOLIPTSET +Blaaaaake +Jostle +wesley 256 +CANNONlNG +Symba12 +Chingie +Chingie +BestDIzzyNA +Necrokingns +Int0mieli +Hobodude67 +Dhae +BasedHeru +7cm +Mole +SpBongile +Murder +Lifehunt +slurpy40 +ZeroGravity3 +Legacy-Blade +Wolfjob +Iron xyN +souldrainer +KaiserRS +Tungsten +Recyr +Apocryphe +Schlynn +AHMETJACKSON +RevenantBoy +smallmichell +BIGHEADSMASH +Broodoos +MrQuaker +OctarineJake +ECCIES +refurb99 +KarsanHAM +Maxiu +SDemotivated +Brotatochip +Clawdius +specuri +Ironman idk +cameliorate +Spodey +ClutchFlipsy +BigBustUp +BarsasBoom +meurtpo +Sixcess +Zenithina +RandomLemon1 +scaffidi +Denclosure +Kalico Cat +Maxerder +iTzGoinInDry +Jonessy +Reclaimar +woopingcrab +Hispeeed +Ocellari +bashong +XxPoliSwagxX +Doobe +Maeda +RuneBri +Schneyy +ironderp +F7VD3 +Ripsnorter69 +GrinoReigns +Lohkey +Hardcome +RoSki +TheRealIdean +Tsukihi +Milk Sausage +SleepyPlantz +herbibear +sendu2edge +GodsSyndrome +gularies +Maxiorek1200 +u dead now07 +Stillen +tyler1041 +IronLepaus +Preso +ThatBoiii +Ares1701 +MusterShelby +Trogbite +Iuckk +byEmilsson +Fogpun +Loveskillin +Ouze +VapinTiger +batseflats +Pawlmeister +Wwalrus +Idk Why PvM +Sirnuclear +Quimbo +cmm6364 +Dyoung116 +NathJeaL +Divin3RS +Axies +Fluxery +Alkene +cloudroamer +OrganicOnion +Smeklius +Furo +Vatix +kokinaattori +Snifflematt +Qombat +fxck versace +Fillifjonken +Vailokas +M4tte +Haruto +Michel647 +Sjappy +RAUTA ARTO +xoRUNExo +Tidders +ww4 +Andrewjaay +Agronyss +PaleCocoon +Nurselie +bam-BA-lamb +SlLPH +Peopledud +MaxNeander +Slaphead28 +KryyptCeepR +Alabandus +Jjar127 +adPEXtwinDnG +nickdv +Fyron +Zwiers +Lufidius +Flupbaster +Smilts +Poentje420 +TheBrundone +Ozzerro +Rectophobia +Frenmiir +Bonar +baglokale +KevlarX +DeadPickle +Funkafiend +KillinxLivin +Gilindur +plebhunter69 +circa445 +ChevyB1998 +AKI-47 +Archahl +Synepxo +Kernalpotato +Th3uns +RiyuK +Bernache +Clem585 +KoreaBread +Rygo111 +ItsNiels +MartinGameTV +SneakKhajit +iniu +B4llista +xttx +Mepthadr0ne +Berkis +KungFury01 +PewTheMeow +Bambi0326 +Dioden +seppes121 +8balknowsall +QcumBear +CoffeeIsBest +ThatSickBoi +scape for 1 +NotAlright +Brisiinger +Starlighte +Haissi20 +260sheepdog +fmPalm +Delskiii +Vladek284 +Kylanater +xxSabin09xx +Nerbles +cowpoo99 +Brys Journey +Lalundi +Kazave +VividAzura +iDrebin +Mezane +Taikanz +Frietjecurry +lXl +Ballotaa +832arba +T-city +Aromipesa +hclirongang +1Fbs +HeroToby +W0SS +Kragjay +6mat +Pur3death2 +Mk60 +Deemush +DV trekpik +i-i-istutter +DarthSpliffs +KeB4NG +Khiru +ogned +Skotten +Maxedlegacy +TheBassIsRaw +Barkki +GAMMAGARD +forcestealer +Reaks +Bioavailable +Epods WifeY +Felinaed +Ozzio +BIapa +Riii +Celebio +Promepheus +Ih8myRNG +Emmet1156 +Tree50 +BeThankfulll +aTinyChimp +Suomiprkl +Unlucky +3x3i +LettuceLegs +SandwichBag +SimplyFresh +Hearne +Emmaes +Takea12 +RaaWa +forevercc +Stebs69 +0samaBdabbin +qtf +e500 +ELFlikeaBOSS +Milhous +sliim +RandyBanger +LinedFury +Koulupummi +Celadus24 +THUMBTHUCKER +Stinker +GE0RG3WKUSH +MediocreMatt +IdleWhale +Demander +Tempz +Teh Only God +95EliasAw +Brocaine +EZ-Y +TheLampKing +DanGur27 +TanqueRamos +Doxxme +meskil +soulkamikazi +Rcer +Fruta +Zeithex +HowIing +Jungle175 +Rochette +Effril +ChargeN +Sothe1 +Kenozh +zurcc +Forsworn66 +Phi184 +ISuperStarI +Ronbiara +Iceb +iiDrackidii +Yawan +Filthy Bird +Eatbananana +HIKI VALUU +q0d +WikiLiex +PvMCerlow +Moscosung +thrakataluk +qwu +AnAmerican +Iron Griss +XSandwich18 +quickster61 +b5 s4 0000 +slobthyknob +TheHungOne +Ijoinedthis +SanSheng +PresidentMo +LordPh1L +Dinger30 +Jexlo +containment +Zaane +G4M3OV3R +Stuffmypanda +Festiva +Zappman123 +BasicBilbo +Jayzar +Zoommaster97 +FishyBrines +Zamowrecked +cad5112 +Deivukas 69 +Noxiti +AlchKids4Gp +Tuerro +Xaud +Swedushi +xZITOx +Fereekelor +Z-TheReaper +Trooperke +Bennybooom +cheetboyx90 +HgH2 +Mista 1337 +NoLifeSincRS +JETSNBEERS +StrokeMuh +Hidole555 +Elyam +nahbo +Oikis +Rustynice +Ruzy +VitaLemonTea +Marcooow +Erlksson +Joopaul +Illwil +Supernate91 +LikeCinnamon +svennepen +Illbeyourcat +ShadeSlay +ThundaJunk +Satchyl +Gilnash +beliver96 +TryAltF4 +Stregano +DJOFULLIN +Solarys +Sh00t3r2O2O +Ledgendairy +Alberthorn +Dalundo +Scraex +Ashieboyyy +Skundos +Telluric +Explaindeath +OSRvape +Infero +WhiteWolf216 +x Zela +UGam3zOS +CreateNoPain +Apetamer +Tomarti +shasd whip +Taavik6iv +Aintos +AngryWizard +Broomi +ILoveSeaFood +Pk3r Range 7 +VitaMineralz +Wauzemaus +853 +Fojin +spritelum +OneClickMan +Napanderii +Lowy +Listeffect +BuzzMax +13LACK0N3 +290x +SlayingDave +OhMyShoulder +Sirmordred44 +Gavbin +Hattnn +Martinside +Landofzoa +cobraslyer +Ceppt Irn +ThaDragonSM +Bilybil +Dryya +Woodys +whoppinknob +sprits +Rafnar0G +Nosetkl +HahnSuperDry +Guwapp +Hobgoblins +J001_jf1 +lilchiken +TankProphecy +critiode +MaxHare +Wiltings +Vonty +SeniorLep +Patojo +Vynlx +ISoLaTIIon +SkyKnight +M_Sariol +perckey +I ll fail +2 h p +Raaban +Bob19922 +Nuhapiippu +Komijn +grandpashome +GrimyIndica +TheRealKyle9 +R3vq +TuNxZbs +Grummmy +2woke +emuulzzz +TTTSpiceTTT +Coquettish +Sharoxi +FlyPap3rr +Masterrgod +MrGibbletts +Techno177 +FamousPixels +MF DC +FishFingerz +Just1n Sane +Bear32 +DiaRelent +MANSlKKA +ARNGCantrell +Bluebears +Orange1213 +SanPaid +XoXdr34mzXoX +Incapacitory +JordHarris +Booxia3 +Ado12322 +L2love +MatoPotato +Maxjuhhhh19 +Rei-chan +Soap013 +BlueMeanEyes +maxrevenue +Slaats +HavU +Xfebruari23X +Loadstar +Tornjak +razorwheels1 +Tryactin +Schoonzoon +Scottyx +T0mbak +OrngeManBad +BlairChan +MentalAbacus +Iron Alabama +Shrikems +Splarf +Twaste +tanklesss +Odonodb +StrenIron +Matty Gibbs +6ft +Ungolianty +Crazytree +Greatwhite62 +Ratrace12345 +Ogmj +SIKKaudio +Ro The Boat +SvartaOdhner +sleepysleeky +Zelatrix +BigBlackCats +Hexication +kire7693 +oxoxoxoxox +Kothu +Hellafly +Keyashes +Kewlaidman +Keidy9 +alkaizerx +Snike4 +Jhebs +Vickies +CARROLLYZER +cheesy05 +SonArtorias +Klacky +wh1tey95 +Watafara +MAAAAK +xRipple +JamesCUFC +jayst1n +TDPred +Wixsie +Jin Oh +Grimalkinn +ImpactPewPew +Ry Jones 21 +lukewarmrod +RPK +Taunos +MinipeTh +Kingeri +Galdysa +KlazBooy +itsa_feature +Fire Kaped +Dopeturtle +Dovahkyng +MordLacaroni +Chap Zachman +Quahzai +Xbox kid 99 +Runnn +Sapphirebear +Hmmingbird +ssyd +DesertEagle +Trynottodie2 +Swimfatman +Finding_Mary +Lord Tarkus +Graros +Edelbae +PrimexReborn +Joebobinator +Pilodro +Supdude +ControneX +PubicThumb +Moon7I8 +Vekie +MysticRiver +Nzy +Digi1al +darius_v_2 +aSwiftyBoi +Zynthe +HawksMama +Maksukka +deketamingo +Epix_x +BabySas +Fyszz +Ochrie +MiIIenia +Trick-demon +Chimera364 +beanbag173 +Veeena +Hackett116 +Gimbli102 +Claud420 +N1NJASK1LLZZ +jre257 +Dankdynasty +Vezka +IMPlayerjohn +Cybernautron +Angel Vlad +RexM +1827 +Degas +Opticplex +Turner Coach +Slayflake +Afghanistan +Txyus +MomICantPaus +AuStarZ +Samps0n +Kephan +brotherkjell +zeroz136 +Kozyshack +Raft15 +conig +Nrse +Reputism +RivenGasm +Flyboyray +tbrey24 +LemonLube420 +Keef Supreme +MintEastwood +Astrali +general_a3 +Oldburnzy +Nt0y +SemperOP +HcGon +Dlorean +iYunis +Metamushroom +DStroud +Iron Hugge +pvm bioodz +TwilightPony +Toffer_99 +iron xarcher +Luucy +MrMell0w +iDerpo +HolyDugong +Patella +Cauterised +lobi +Hakuryuu +Archaea582 +e pinke +DePope +TN_Biscuits +Angel4killin +Dgalaga +Mcgingerpony +DedZap +MorganAtkins +Hectic Mic +HybridSanta +LinkKing +PendulumC +M0RG0TH +Fitsit +angrydump +Sansos +queundas +TheBandit777 +Kotaki95 +ThanaWee +tjappko +Wylyne +Wobos +Parameters +Shaykolade +GamingVapor +IAmArcade +Dogan +Durooo +Eucleides +Wcs139 +Chopin +FeMattsheets +Elenaki +Blixtslag +mangay123 +pvm-owning +M4gnus666 +Broadboat +mynamesDog +Au92 +Alty2 +Toris +Ziqs +LuckyEmerald +1272172 +lilmasterOG +Darkhal +Poohead92 +VictheStud +44U +TwojaStara +Rixhy +Marsg +x GS Cookies +07Ash +arreydn +Breivig +GummyTushie +Monkadile +Dill0n +COM3THAZINE +lmplode +Shivoc +GucciDang +nyareet +Rozzaa +MiniDrew +Joe420buddy +Donaldfact +KGee +Voltz Tzkek +Ajuus +Porta Pro +ComeAtMeBruh +mazzahS +zuenzima +Herbilicious +IHuntKoalas +GerAmi +2girls1troll +Mayweather +Liquidat0r +HellaKush420 +Drenzek +GodlyThug +Jaiden184 +svrN +SunaLAD +Nedward +Unavailable +Alting +Reeet +Branden +Bulte +i praise mvp +Kuroshin4 +Biku +k3yblade +mohak45 +Orodyn +PITFIGHT +Zerkism +Ezarc HCIM +Pwnbaa +Squall44444 +yechu +CoreyCarlaw +JovyGaming +Kiiwityty +Daksu +HitdeBongz +xoKt +BigMo +BuckNastyy +AdrianMMO +killd0zer666 +CrazyStuff +Sp3nC +gabba-jabba +Ph0g +derrybarry +CaptainOboy +WildAbandon +Bwananabread +TheRealMidus +0g_player +Volai +Trrrpfosdss +Pesoprkl +Reizzaz +Jappo +PVMramranch +smirqqel +Thunder Dog +killedual0t +Active-Bombi +Eyeofdeath3 +Celestron +lGuess +Kolton +JMiddd +Taringa +Lehmo +Shuiin +Zanity +Mulle-mek +Keenar +teakte00 +Edelweise +Stocktone +Slurggi +Lycstoned +Neurophys +C11 H15 NO2 +Turiak +ge1uk +pk_by_me +snoxxyl +ThatLuck +KorbolJestem +Novem +Overtus +NullObject +RunninBlood1 +Jrby +Kazatan1245 +mayhemrs +C-Dom +Arzi +Ivain +Hashtagz +Tailsnake +NoobishAct2 +DiveMedic +Conjay +urza +Imakuni0 +Akilled +Tashee +Reyko +iKushUp +Christoker +Dougoboy +Daleferd +GourdPicker +Premz +Marn3y +darthv102 +Sunsa +xDevastor +Atroo +Brendvn +Panoople +Swanheart +Gas +Jowalll +HBTurpin +Ruthers +HowAboutNeup +deZoet +Revx +Gp On Me +Covvboyz +olsyboi +IronmanFookz +Envyy +Wartt +Darda09 +Triforce13 +Cleanbutt13 +Komarov26 +Tuckerajf +Smilf +Pyro_OO1 +WowAUnicorn +Yannis +MitchRap +MC Cheep +IronDong +hellofpures +peliken2 +Sadystic +Masonitte +MrQuick1 +burnsalinas +Hisblore +Zafaron +ImNooblit +Wheremeballs +TechContraps +istealyoloot +Juggerthot +Prima +Zevosh +clevesbch2 +Forteh +Dumbells +NurgleBurgle +TzTok-Jeffy +Taker +FatBoySwag69 +ConradK +Plorky +zouse +Athaw +Ixala +Halloman71 +KAKAGUATE0 +Sizer +Netmn15 +Velbain +Grants2004 +Dragonbait4 +Mugarooni +O0l +OpaJei +Slymax +Gkm +Tautvif +Caregiver +Rahjer +1CA +BeverGT +Abernasty +Haz +SizeMan +7emptest +t-painn +Backus +goblinsyler +XMZ +Nuna +Rivalguy25 +Lejoon +ClydeBarrow +Jedah +final dip +Pans_Gaming +McSuperNoob +roflbaker +HighOnPlants +Mez-qt +ariman22 +Froya +The Iron Era +RichGuy X +snoppen97 +akae +spankmoi +barkmeat +Popfumes +Chugger +Elementality +4Sale399 +05venom04 +Santeri333 +Stackieks +PeeledBanana +Musschoot +Brvte +BBarnzeyy +Cowrat +Sleepybear +Mysticvaa +xNerevar +juwgrehg8w30 +Mouldied +Nordo +Calcusource +Bored_IRon5 +Jonnems +Odeee +ir0nschlong +A MeatStick +Khao +Dorman Jr +Ididit33 +CliveTrotter +FerrumPawn +AndSo +F0REIN +MrBeerNTits +LordLambo91 +Inflnite +patrol +Pregnant +Drayheart +Melchuzz +Lingwood +MAGA1292011 +Beastman642 +Grimsomebody +Activeshot +Deathhope666 +DrProfess0r +snuskfet +Prodigy 99 +Gidionn +DamDude +Mattyflight +iLoveYou3OOO +Occulent92 +Stickers +Hungarry208 +Dathx +tooowise +big tree 63 +Zamorangue +maggpagg +SkillzGainz +look2thepast +ManOfGold +RyeEx +Vga +NukeDuke98 +17_FLHXS +Diapeetikko +Nimloth_666 +Addderall +FearTheBear +Denssoni +bajj +Torned +ENAC +Chrisible +eazybreazy +Cenpie +ViiViiVii +A93 +Euphael +Pubeless +Sindo +Nuigaia +NoDayMercy +Kaporkchop +Tigerwolf +Cliffyy +Hakozuka +svenskeren80 +IHaveToQuit +Iron SteveB +iron cuzibro +Benni2345 +Drairi +BobTheDaddy +Khleb +Lazyie_KiD +DaquanNiguan +Riboku +Cuult +TheAvenger56 +Minty28 +Veinin +Perchlorate +IronNexuss +pugginSpooky +p2pell +Samaji +Zemps +Fairr Enough +egirl qt314 +Dezerthuntar +poseidon0928 +Vikram +Elemntsk8ter +SoSimPol +batchela +Borethil +Urakas +Offka +jef skhiii +catsarepeopl +Aimdur +Pathways +ErzaGames +Vendet27 +KnowPurpose +PBD +Madslasher30 +Z1k +ReignOfThor +NickOSRS +Jrogo +bigchoocher +NJZ +Bleak House +KingGrekus +generalneos +Kahvikuppi +Bwanner +pumpkinslaye +firebrotha2 +SHIDDED0N +Tubbless +chubysack +TTBtw +HuckUsAHandy +Draind +PeerTheSeer +Hodvik +Cannibble +IronSmurfff +Gamaiiron +SteveGuy241 +deesnertz +iFatalFoei +Daykillz +Alpinetree +Bwana-senpai +TheF1ash +Undulaatti94 +riuCooler +RHK Ezze +T_Swishh +Stago +Jahmerica +RichHarambe9 +Dception +I LOTR I +Cherba +jusiuke +PJ Salt +ironandwhine +WhatSheZed +Verjj +O l m e w +Asterus +Sleepiness +Stamuhnuh +Snoot Boops +LauQT +IronShadow5 +MRHD +Cooldesert2 +TomatoAndEgg +MrAwesomeNL +Bredbeddle +batje vier +boodje1993 +PappaPizza +Chronomancer +Pumuckl +Jakrojan +Sykeaux +PoopLoser420 +DurtyFish HC +LeMoonMan +Zanwk +19088ml +JDEP +kindocool +Guwaap +Jerec +Niseraru +Suzakuin +Quzzini +Anna Rosanna +Rufie +Aidios +iiHydra +TwitchFear +3amf +Mila +packmas +Mahalusa +glica +A99 +Beaan +Ahab +Montagne +FraJoLaaa +SenorMarcSux +Blommer1 +Valorise +k0ed y0oh +Suxe +Acefalcon3 +SNAlIlIlIlIL +Maxime5100 +odafan +A7MED +holdenrulz6 +iLuckout +Juntti463 +JR05E +Soolo +Kyrdaar +Riippptttt +Glut +WhenYouCute +5Aces +Saosiiin +Exhibition +SurgeHunter +Kinkyy +BIaded +FER0C1OUS +Tittsnbiches +RSLtSgtZen +Roytang5 +ThatGuyJordy +Brickerino +Hudsy +Nidraugas +UrPureSucks +Tunafish69 +Front +crew-z +Kelly +Karekano +1800BetsOff +530 +razzdnutz +D0NE0 +PurpleNinjja +Blakkeyy +Saran +Practical +Wasup725 +Vapeape1 +crownchyfled +YodaEvans +Pauk +MURMELl +danielfanacc +ribalibali +Adelaw +ProdigyTape +Vasdeffernce +Metallproz +RightKnight5 +CHIEFWHALE +Bobakadush +Palmboom +Sub_Void +Sheq +anxiousbeef +Volcanos +Bromerly +lllPeppalll +Trace +Avoinmieli +Thugg +The_Dave666 +Rollsie +FriskyPainal +Zedd180 +Extra +Flippar +f3n1kz +Frufoo +neuber +DssHimself +PoseidonDrip +Ebrahem2004 +mippim +Nocando +Matheor +KitsiKitty +Birkenstocks +Doogyplumm +Phatman348 +Islefalls +Elnuma +minyhitsk0 +EdgarAlnGrow +Protectorate +BurningKushh +Boeing MAX +Guala +Turbie +Chilcos +Verokostaja +Tijn040 +Dokarius +Hbx +Brownecakes +Matematikk +Mooksy +venzano +youralterego +shliure +SnakeSpec +StagnantAlt +M0NALISA +Mammad +SoldUrDad4GP +deperni Jr +PeterButts +Doritomancer +Mitologas +Hitchens +Reaper0321 +Skerp_Perp +ripbobthecat +Dark_Auth +Craftes +LukiOne +TitPoker +MRWHlTE +marketmoney +Czivend123 +punchlineNL +CykPyk +DynamicDuo +Criyosphinx +Besty +Aktii +Cyox +Whosyourmac +BossMann +Blacklmp +Banzu +Rot3x +Kiyoko +Silent too +Valzor +HalfHawaiian +5YP +DeFatCactus +BlueMuff1n +SooCrispyy +WarmManBlast +Nikko +Workath +PitterPattr +Ben Standish +Amos1500 +GramsaySan +Bankaiz +solfam +meth0d +PengMaster +SpliceTFY6H +Te +Fluenz +Squonking +Utsuwu +vertztheone +blvckstvrr +billyjoewo +Joonayoyo +Doggiezz +Musuwu +napkins r us +Haphazzardz +urfault +tdufflebags +NeonM1d +Edson +BalIsackt1ts +Geno2566 +Coachsharter +1994 +Katetuotto +Bodyguerdson +xWillx93 +XTIF +Macromage1 +ColonColitis +rxbi +Petless +Frvnk +Homepage +HVSG73373535 +LumbyCastle +thilygoose69 +Izone_Kev +KungFuhr3r +JBGard +ProSKatona +CHlLDS +TheZoracks +Themenchman +FoamDemon1 +Flirz +nuggeets +Monkie +Rastaclat +Ioyal +Bautista I +xozoca +Htx +Soloman50 +Especkt +Kimoja +iLoner +poolbadger +Badasseness +Naxtzi +MerryTuesday +RadFeenix +12bar_ty +Runeukko431 +SnackJack +Zyrok +hammade +INTERMEDlATE +Arr n Geesus +Rpo +Tekknow +keatonboss +FrozenMosin +Jackyboiii +FoxVex +Sheivattu +MrGainz +Tiftanlar +chimonas +Olivas +k0nna +PetroX77 +Bessone +Ghostiami1 +Omnicide97 +Cnwalker +ashster25 +ashster25 +Bettuh +Golden2Aim +mmmmmmnmmnm +Vorschlag +Forgetmenot +OnTheEdge +SilvaAlzir42 +Inxo +Simeeon +Broko +scerp +MrGrind +Lempsu +Munkinut +BlindByron +Ruby5001 +Valmar +Gyroman +Qrischin +Tater +Mokkis +Lord Buud +denzarr +RoseGold_A +Finalbrk +NoBankIRL +Shazu00 +Genocidal +JarOfCookies +Highfish +Xoir +SeeYou +Opticplex07 +Cyrax314 +0verhaul +Guri77 +Strokemon +Vt Flavourss +Guardian726 +Wurj +ThemanwhoisB +Gosustyle +Hobie +irradiated +buh6969 +Summond +Esquelito +Shampoe +MexiePie +Oziarch +spam123 +madpaul1 +GeneralMo +Daborn92 +xlr704 +Sign +iekgaa +Ekxo +FuNrikoz +Guest738 +Bobby Brawl +partypossum +HellAngel +Wrektem +daPeanut +WyvernBreath +Jordaneee +wweadge2 +2841280 +Kifsa +BoredMalamut +Smurfingt0n +Monkees80 +VeteranGamer +Rng4Display +Ketwards +Sceneryy +HunterPandav +Snowii +UrNansMan +ladyspartin +oldsports +Stealy Boi +kylop +Tay3rell +Epic_Knight0 +MustBeGanja +WubbaRs +Chipz +vegiitto +Shimosh +stella1 +Firulay18 +1Buck1Love +Crushertaco +morgf +WhereTheCats +130rk +Xillious +Mofleminator +InThe90s +bombadinski +LtJan +Oulusta +Patetisk +BungusBoi +iTzTyLeRXD +Doken +jimbob1 +CryptoKitty +Chaottic +ScaryShadows +amagna +King1631 +is skimpin +Scryzen +Indigo640 +IronVikzo +quiver81 +Ommy +Ranarrseole +Ajamian +Shiramasen +Gregobeast69 +Malvian +K44K +Rekkaboi +Karaf +Yachiri +Janer +F14 +Dietch +TheGreenBowl +WtfJad +catsntatts +Huntindawg2 +Astrophe +Mumriken +rwr +Hakafissken +Knaksaucage +Illest Logic +dr4ll1m +Danlord3222 +Vorkscaping +Ricksking +ThePTWY +Ayetg +RipePineappl +SoloFletcher +Juranja +Earl131 +sixanddagger +718m +SoloDynamix +55mg +ForWeAreMany +KAL-JML +Luckybamboo1 +vbhos +Adss +Warhammer70 +Trennel7 +Bomtastic +Chevron +Syphikins +ParasoxX +TheNinjaH0b0 +Swadloon +Diddmeister +Compilacion +OutofQontrol +Boson +v0i kehveli +Patchley +lnformed +Utini +scoobydooby9 +Cerberus98 +CoffeeBarrel +Estafeta1 +Teknoid +Tes Iron +Zolrisma +ThaDankantor +IronDeadBoy +Jennn +GRAB-A-LEAF +Lockski +ProjectGamma +K-Diddy +Airexz +Mathisse +DeeLizard +DoctorTsom +Resupplying +Burials +Rokushoo +tenac +EARLYoCUYLER +GalGadotsBF +champinjon +Jalite +Eqwity +IronKaboom +Jella +Angalad +pRiesty +JabbasHut +Sandman1 +Booll05 +Plips +Andremagico7 +Smeared +zendendead +Cwioktopus +Waonnman +bincho420 +zakaru9999 +Tashkas 007 +Kelwus3 +Othelllo +Talcron +Enrich +IIamaman +Leerjet +Arizotal +Lucie SkyDia +WhiskyVault +jackjester +Selling ROTS +LeesusChrist +Sangers +afkvsehp +Kendlang1 +GorillaMon3Y +Rajat76 +Uncy Duncy +Gleep +Kaspuhh +GodlikeOne +Nyx296 +H501 +R1ghtupth3r3 +onespringday +G Ape +Farmertree +LikeABrother +Tiny Bagel +Fy12e +WolfLucifer +The Hobo +Yoyo502 +IronBurnsRed +Roastedsteak +Balneum Anas +XV73J +Syck Memes +Losel +Dream-layer +illuminavi +MeideC94_BB +CRlTIC +SirSwaggzz +Veddunreal +Iron Vexzed +Kleiades +SupDutch +Jxcx +Legosas11 +matthew6500 +Core OS +BWheatZ +madman456789 +Baked_Beagle +Gumiibear +Alno +FO-LAZY +Vaandah +Gaarden +Kosmckid +BigPapaDank +Omw +GfRsIGotAGf +Slaydo +Tink +Volgos +sticky holes +Unit +Dakotas +WillG +Varsii +Youxi37 +Phai +NEWFISHMATE +D1ZZY +LsummerC +iHenry +FoodEmperor +Blouch +POGPOGPOG +osgp +FD3S_RX7 +Lightaxo +Hens +Juffo +CumOnGuys +Brinsgr +Bigballsac +M I Z Z O U +Splash-8 +HT Hero King +R0bbby +Sain +NakedTwister +LMFAOIRL +Teegious +RainbowBeast +Medicides +Overcame +M4D399 +matzRRR +trojan break +Lme +ROLLinPEACE +MarlonisGod +MarthProMonk +Gayim +Theoatrix +Jeemis +Trained Fish +SensualSnail +0ggyy +Budzliteyear +Bigripper420 +JayPortal +Latitude +LLol +Pheasant +M40A +Devilbong420 +Ayzo +Positivar +Arcnan +QnBumbleBee +james68889 +kitashan +Feebee +Sentrosi +Jeffro +2m3 +mountcaedo +Haighy +honeywheat +beatthebot +Dennyispro +Remillia +Dani007 +Toxic017 +BerryInBooty +LetBrettBang +Onehidefrog +WH1TECHAP3L +SmokingFlax +burnindank +GATECRASH +CokeShoveler +monkieturd +Raresocks +Mellow6 +Gawkss +SuaNorte +Sainola +Susurrous +Jeffie381 +st4k3l0rd +alphabosss +ChiliTurd +ibr4him +kingblackops +SundyWundy +Heckstrm +Egoistic +Xuxy97 +HelemaalMooi +Big Mike +ForzaGTx +OtherJackets +MrJohnnyx +Muttadale +JDT +Nattraps +moneypants +Tacklebox +Atomyze +Dkzz +Sophlex +Illumee +SomeDirtyOar +DangerBear +Arxanec +Yeoubi +Nakuz +ZeOblitz +Susilapsi +rbootsGOD +afkdontattac +V4V +godsmack69 +Badgalriri +Numismatist +Kidalien +Lelott +Cersey +Zedek +xbw +Kharos +PkGoW +Mr_Kadir007 +osrstimex +JKuyaa +Refleksi +Traumahh +Weebmurderer +kica7 +thematrixgg +PutItInDeeep +Rle +Pihl +Eurovizija +TwistsedT +Giddy Cowboy +Iuxio +Osgub +Ylulawo +IGN0RANCE +Eldrek +Slidz +Scarfade +OSRSQuests +StembaWalker +InsaneBobbie +Nakkimauno +Marsmash +Kooch50 +MemoryCard +Whiskerfish +ltsYourBoi +S1SU +Tohveli +024elyograG +Plsmrlizard +AndroidFox +Aprella +TheIsamaru +Solaryohm +kkangaroo +0600 +NaviRio +fp4bank +RepresentRS +Swordman1173 +marrciee +DlPLO +DieAntwoord +Nahkamestari +FourZone3 +90tegguy +Absorpt +Smoke2Fly +A Lava Lamp +flowerbunz +Bluternite +Gamerplaya7 +Chinolc +Mistify +UltraJack +JimAdler +Jen0va +Object62 +only4pvm +LietuvosOSRS +Jorlund +OhhTiS +B-Lal +killconey84 +Cupthebooty +Vinopenkki +Cambeezy +munoz316 +Madam305 +crep +G0LDIE +Kimano +SalsaMurango +GuntherNese +iDontWinSad +SkoomaPls +JayDaddy313 +Cruixiote +Kalashnikova +Trap_Capo +dayoh +IronMountain +Goatmelk +DennisWilbur +JubbaTheHut +Intensifyyy +ThreeOneNine +Mary j4n3 +Artesna +Khaant +Mirek +Drswole +BibleTrump +Thejessman1 +Bosw8er +Eadles +roldan_one +Shady78 +2MinNoodles +Rellnquish +c04 +xDuckyV +gamesalright +Aflamed +Iceyou90 +ApartAbyss +Hazla +Brodie827 +SakooR +Bullseye414 +Hellodummy +Reloox +7amowdahli +Slurpez +Reverenciar +Jubilations +Jo0l +zyeetz +Plumper +Radia7ion +void-e-d +DopplerDank +Moordaap3 +Meowmagic +Grazzak +Jglove +Gammel Mand +Larsjns +Clynelish +matis6080 +Daniels +Buckner20 +WeenieHut +Thueh +Kaliumoxide +youngwings +Strauss +Marblez +TheAllSorts +Lukiss +GoatOfWar +KeltonThaGod +Kelen +GanjaGhandhi +Garnet Gust +Dareya2 +swagscape666 +San0 +CH3CKMYSW4G +slayer92 +arvothepure +MrCian +topgun 17 +Therens1 +JDlion +Gnarlysurfer +QYC +Praisemyrng +noahcous +McDouble +Beaukaki +Reel_Arphios +TSMsOAZ +D3v1lBoy +KapeVing +saltycups +UrJustXpToMe +Germaan +Mappl1n +Tomsdk +Drip To Hard +Brak +Chub n Tuck +Bhangre +PeeJayPlayz +djhonnyc22 +hOsujaRS +Fuzzy1918 +MOOSEM3AT +Zyer +Qxevym1 +Emilharen +LtCastiel +ElroyFTW +Sole226 +Cheetas +Flash3200 +99Juuling +TheTruthOnly +MyLastGo +KingstoAces +Z1pn_xD +DirectDsLcul +Kegern +Akimbo Gmaul +Cyclone2498 +Cellectric +Dystopias +WipeRZ +Kilamanjaro +WillfulNomad +Vbiqve +Finklestein +MrNikeKush +superbuds +Tenderrrrr +Chilaxinman +YouWontScare +K1ller5169 +Skorned +Sighlent +Flakkas +FlatEarth361 +Missvmk +OneFunkies +Gog +BazzleB +Actt +Botsii +bambii69 +FrodoRS +Sorado6 +PapaJoyce13 +ComradSergey +DrogeBanane +Funpeople5 +Hyttynen +Tombea07 +1powerhydra +Ra1d +Mickeyr4nge +Quaerd +742617OOOO27 +Acuila +Waydens +PaintBoxx +duffman1992 +Wizzti +Iron Rikyu +ShySphincter +UndeadElk333 +3aboobs +Foumy6 +Baldorr +pogglewogger +r4cky +TyrannicaI +Jlova +Tsuchan311 +Hugh Jazzhol +AverageDink +Ronch +GeneralLudd +Gtotgt +Vorare +EnigmaWR +Shadsnp2017 +NWHL +KikRox420 +rossdark1234 +SaltedCorona +Edgykid +Pureanger728 +Niahl +Yarne +AaaBiiCee +Iron Zul Mox +Cheffrey +Merces +Seved223 +RoyyyAfca +Teksti-TV666 +BurnhamAll12 +FlatAssPlank +Udingus +OhNo +crenux1st +Kaze8HerOut +TwistedBr0 +InhumanBTW +BeetchAustin +DontDieSans +Challandria +hey im ben +fkn seale +Jovilius +Xutera +RubsSandwich +Gnarnold +Outbid +Aloittelija +Hadeees +Aretx +Yst +Rikalero +Pwnslayibex +Shev64 +Stackin Dosh +Mazzacre +KEKLERO +Shadow Flare +Half Volley +Zackly +Camion +Rick420blaze +Devinchi +Swordmast756 +Chesscape420 +Quantuh +Westleafer +iKitz +Sylist +oGreene +IcedScrabble +Killerdog HC +Bekutma +Iron_Slippy +Rongrongie +Agnar472 +Sleeep +pieater_314 +Haffamilleon +Totaldumm +pokemonsunim +Pennywise070 +TheDeadMann +Demon Plate +YuugeJohnson +TrikyCutworm +abis +Enginerd07 +Mordenumero2 +kurdikana +Five +6dr3w9 +komari_k +Sukoru_VIII +Ziincor +Ydrasil +Eulogise +Celikanen +Acidylia +Sqe3zy +Tisalia +stoned84 +M0RGE +Iron Ghosgar +Ottzor +IronKyloman +HazDownz +AgentOrnox +Pqm +MajorOwnz +Seta +Atoz +GuthixIsBae +Posemann +Livepan +GodSlayer422 +Iaminsanemax +DyslexicTree +Cycloner5 +Pothaaai +M I T H O X +Daremo +K0tleciokas +KhatrickZain +Kiruzonu +Danktrees +SpiceyBoy39 +DeGreen +C3Pz +Skaduw99 +LilDilly420 +vNicholas +Zfp +CATsmoothies +Sadass +Pazzo-Repack +Yowzer +Firenova +Warmouth +Afkillz +Acardi +Overload_inc +CasinoProblm +livil +OSSoulwars +Yamata +OG_Westside +bouwjaar1990 +road2broke +lYungPlaguel +Grayden +CCCO +Cubans +Awwtis +drug_yew +MyNAm3BubBA +Vom +Jagdpanther +Serpula +Gjonunaki +vizzN +RothesLatrin +Rustix +Hemmii +LuisFarm +Sbraga +iMellek +Jublian +Twum +oooopsiee +Avinosis +holdadoor +aejfd +TOASTA +budabaii +Az PVM +YungMoistGod +Go Do One M8 +Nyam2 +Nenah +KingSizeD1CK +NipseyHpvm +Gufix +TopGunt +A15 +D7NNY +The_Zob +Loserscape +Banerz +TinderMatch +RelivinYouth +Arusas +MiTDro +Purtherapist +FlNARKY +Nidmann +MrGixxer +Kiero +9ussy +SlayEeryDay +rusvet +ooli +Guzas +IVIxtthew +Lexdegekte +Crispy Bac0n +Zanryu +Chance2Skill +Budget +atoma619 +Iamearth +Skillzzz +MikeChang +4The_Horde +KingRobStark +H2GivesUTheD +PulpFlctlon +Memeologist +captn_dabbin +Magiok +Narris69 +forkheals +GoldenEye69 +MetallikDeth +dynastyzero +Hotsbo +Shaymuz +AurelionROW +Zabini +Bunjamino +VooLis +Creator409 +Dude12677 +SirRebs +real-derin +Tatimary +Trulieve +777slayer777 +KiIIa4realz +Larryz +HecticGinger +Slayosaur +Hypn0se +MK-HARDSTYLE +FMLshes17 +ohioisonfire +pulpfree +vkv +7AYL0R +Glukoosi +Bringtheheat +Slides +mrwoffy2 +Bear Savage +Vlada +Varulven +Mateusz1210 +STRlDERMAN +emvelienenko +Zuzas23 +Niawag +Teckie16 +Garbagexd +imbutz +Dylann070 +Opatsuno +Schiller1994 +Obanana +flax somker +Self +CBas +Ocachobee +Tommmo +MikazuAugus +LordCoffee2k +Moorleey +Aussome +VoHiYo_Nami +DhRecka +Judybats +cyxxa +goodlife +JerryMina +Oi +RustySimon +IlINard0IlI +allzeras +MrRidder +l-l-L_l-lL_l +forrestriley +McDizzle15 +Laogai +DarkEmerald +kidsteve18 +death0183 +Jcourt1 +Zathul +Ezwa +Leetroopa +Your Amity +familypp22 +Snekkerboden +J0seph +proud2bbalin +Hallonkram +Flare Grylls +Tealer +Virunypel +Lifes12Rules +b4Mb00B0NGG0 +DayOff2JOff +L1ncoln +Xantiasto +The_Dunster +wjsn +xZuk +Tomtom032 +HolaBurrito +double99 +Ketnet +thotortiana +Benstjohn +LeeGavGav +3dderino +Ripsin +Migou +00 LemonHaze +Tyberium +AIixs +RogretheOger +clubsammich +Kanagawa +Nupayne +Springii +HankTheTank2 +Beast +CapnMeliodas +Rai_3 +Rullmane +a_SaladKing +Hexenkonig +Myams +Danletics +Exiriam +steckubnU +Plot786 +Holyfuk +Multrix +Putyte1 +FullerACL +Tacotueaday +Cathuntdog +GetWreckdSon +cursed_angeI +ironikcronik +slayerfrog57 +Grod15 +Fawz +OSRSZ3US +Rejey8 +Jerayou +fatalzick92 +0lb +fernibosh +mehloncoly +twiztid5000 +WitlessFox +onex +Steanox +Heee +zmakisan +Petriq +Streepken419 +SanHolo +DrWoolyNips +50bitsnka +Altamonte +Nonc +DamSplash +osbhuda +Papukaia +Antee294 +blaze59 +marrab +OurPage +Drikon +Vall +Co_do_blyat +Meur +justinttu +px yra +PSRB +YelllowFlash +Zarkoz +Lizinginis +Sachets +Rifen +AJ_24 +McSomf +Avex +Mycreation1 +Threno +Mickyy +Cahors +Anq +UKnowItsB +Rawr +BestSenpai +Nightsharp +PattMyGun +Stigiam +gIassy +KareemPie1 +Samzor +Straubrey +YoIronManBtw +WigWacker +DimJangle +elliott1650 +J S 2 M +oOoITITIoOo +half +touhutimppa +Fridelis +Anidien +bragegutten +Boost736 +MIX0R +seriouslee98 +Klaskdeng +Qrwewa +xDab of Iron +Linerz +IronIsNoJoke +joohhhnnn +Thedriesj11 +Tramfix +Angel5 +Iron Tonski +AlpacaMyBags +Melcoor +jokerpoker +Spin911 +GypsyAvenger +real boyo +Sackofeyes +Ramathorn +Jacy59 +Asymmetry +Ianyaboii +Vanss +BaalZvuv +Ichi +StarKist +Tinfoilhat +notepad14 +Gigabit +Iniys +G1adiador +Caniz +Nosorow +LoboStark1 +Mer Train +DumbMatt +Suhado +Rofie +firework19 +DontHoldBack +MissingRNG +Fenomeno11 +Arid +Sephiore +Chrisob +Pseudo +Seffer Kover +John Muir +StyxHatred +Jirou Kyouka +Kazuuhiro +FramedJunior +Mikeey +Siimse +lazyhitman +AboveHonor +DrBigSang +flatbroke +Juktes +CL3O +ThePardos +HydroBlast +Spektur +ZeroDignity +Sneak Dissin +chickenbyrd +Wolf_Hunter +ImSane +Yewp +Hock Baws +ligma2 +apou +Chip Black +Tejmaster +Purka11 +RecentKill +Reliinqish +Ninetales4 +Saus +Seracid +WizardSleeve +holypalo +GodDmntNappa +Lavvv +1802M +Stagmuss +dibdibdibdib +Rayjin_Storm +CallMeKeen +Muchly +Yuiku +Jepuzeka +Paznos6 +1085 +magesticx +Lyngo +PzzaPredator +Felamar +bo3rke +Emnitylol +IUntradeable +Ironstone +Boothanqq +Bedeh +PotBurner420 +itsmewarreng +Aerzo +Zirvzaa +Gvjordan +NitroCrate +Afrojofe +HexMage +Dangeruss +SektorQ +NopePope +Lifal +QuietStorm44 +ShinMalphur +Zaixii +Xarious +Novaqueen +Rez +RlPMYMANX +CRY0GENIC +gypzys +Ferrggette +xComposure +Fritz +Dankdank96 +QPness +MasterNeigh +MiceMan +Khoosh +MuasBtw +BO0MERSO0NER +Chronepsis +bearjack +Bones2Peach +Blastrune995 +JokuHeppu +Ironpasta1 +clancy272 +Kevthebos +QN +Jaddok +HahaYes +iain19 +Nasuuu +TaintSaint69 +Fallendude55 +Jack1 +1520sedgwick +Arturis +Gerrmz +CmarBeast +FazeSkilling +ChickeNOG +Soraaxle +JuryRigging +rekkerboi420 +Daquicker +Claymor +Bookless +Rusticus +ThievingL +Toonic +Samubidladin +ASSEATHER69 +Verdux +TortugaBooga +Meelays +BADDONE +Slaughta +ilegalTruble +Pook +Kodai +Ramsas +RangeGawd +WARLOCKTIN +Kaunopihlaja +Drone347 +Fourlifee +3Miller3 +NansBeaver +Deny92345 +Heartlock +TDX +Jstnn +Bizness +Caprius +skuccy +xReckless +LvlUpUrself +Dogsume +Xgz +ferkyy +Tubmasta95 +NachuiTuda +TOMMonyzzz +IIlIIoIIlII +Nostalgimon +OGLman416 +ArenaRebuild +335K +ThruDaStorm +smithdarts +Killed145 +GeneKapp +Noon +SoldMyRNG +Deon +Lblacc +Nebbo +Karim4lol +ItsAllOgreM8 +Gloop +FilthyOreo +Invisioners +Dragonboy691 +TheLewhole +Melee_Range +0mfgcows +Slayhades383 +libertador +Mouteo +LetsRouQ +Alchaline +2Fast2Fuego +2th7 +JustFollow +Uncaged1776 +Nethada +G0LDC0AST +WilmaCokfit +Lvl100cheese +acerkush +Sandwichfish +tony el gros +Snoopy +zenyte4money +Countwert +Bilboro +KENO_GUY69 +Xazz12 +DunDiddly69 +Joontah +Snaggapus +WeRageAsTwo +FireyDragons +coxchambers +Storys +BigBankTake +DontBotNerds +AwwSeriously +godofvoid +Naakkeri94 +GoDrinkWater +spx +Sjenkie +CXF +Mirin_Gloots +Sleeps +LENZ +Rs_ReeCe +Roidsy +FistMeTrump +22harry +KafHaYaAinSa +SYMBI0TE +NoobWrecker +Cinderhulker +Nickool4 +RanarrScape +Hilo +warestoteles +Chyna +Jaunius +Sturminator3 +Yeeska +Tamjam +Kareir +zBonesz +Hompski +Buddaball +Stnyzky +Ravency +iEuph +VOREVERAIONV +Grindcorr +Egganator1 +TheDayman +Candrok +Odssy +Ef1 +Kodywithac +Mr_Manchello +Deadness +Mitus +Pureloot21 +AreYouPepega +hellobob488 +NoDealEU +EasyRNG +KNIKERSNIFFA +Griffey +Hagenees +Qgc +MariosPeach +Oswaldorun +Empyre +Jayksie +Gargath286 +D0nte +Artz +e1ght +LumberStevo +Thrilbo +SqueegeeLord +Soctch +Termoil +r0jasss +CruelVictory +Myuk +ZerkInDaYard +Meerca +Imgrazy +Marmp +Lumiaris +Saiin +Nowuh +darkjustin54 +LoneStarWit +freeheadbutt +Socca +Odeon +aalucard +Billa +Ba1i +Oldemark +lordbong +FLOR1DA +IcarusRS +Tschinelas +Alosthawaiin +TallChair +imaybegod +00000 +Akashy +Tukeldaja +Pecki +VarockVirgin +slight7 +Katski +Naruto +TheCondemned +Kewnsauce +HiGHFLYER +Eng1and +TR75 +QueenJada +itachi9113 +DrinkPapaMlk +HungSolo45 +Hidaki +Parabolic +alvinhic +thebestgf +Acq +Charben +Diablosis +Mauler4500 +Vayda +Bloodshade +OsteoSoon +TheKolector +Steeermy +Muad_Dib +Zjv +Sean278 +NeedInternet +AuRoyce +TheOperative +skinny227419 +Baladend +keesie7 +Kratos-Arepa +NickaClassic +Chri5ty +Luccaa +Conterfeit +LostlSoul +Aestana +S3ID +Tydigidy +Kelgone +C0WK +Diskmedel +stranglege +Ozziemate +GonjaMon +Nex1s +Latero123 +m-moi +Jimb0bMaster +Sysf +Purple-Broly +Samsoniene +Drivious +ksap69 +3nps +F SONY +KS04rs1 +Fettisdagen +IronNinja13 +Huule +HazyHerb +Runepalmu +Swagslicer +Deysean +Ozcred +Raxen Light +Apop +Untameable +Decca +Servia +EatULive_666 +ImAdam +Koomorang +Horus1701 +Zmancool +Theruler333 +Aaalmost +Sallad +loginxtor +brika +samothon +IlpOG +flipdoggydog +xegaF +robilo123 +Antidope +OsBrody +pummi984 +AlwaysQuest +Leckie12 +AgileLlama +Dihl +ICNK +Sucjk +Sponch +Defloat +An old Gnome +Wodka +mychaelven +Wild Rivers +Rawest +Aviiation +Cvrkster +Codemax +Narthalion +evanthenewb +Wyan +PTKNT +Killemall +Tromal +steeveee +krioyo +Mr noli Fe +Arkysh +Amuzzzr +KlNGY +Loreland +Lillyz +vLachieAU +THCGods +FearMyTM26 +Bucito +Abrils +SpecialGuest +Arcas3 +laqsative +TangerineFly +Ganthorains +Haunter12123 +GurningPills +Neefey +Pinkyx0xo +squatlownslo +ikrr +HolyGhost +MlKE +bantrok +Mark1ta +DRD31 +Piety Prease +Psiklone +MufffinKing +Turtlebutt +Xestox +datweekaz74 +WildSF +PeetrusEst +Scare077 +Jri +Keldran +bosscat56 +ForeverLost +Kevbro9 +FortniteRox +WickedKlowns +IronGoneNorm +Flydol +wombo_zombo +OutOfBreath +ANDERDAPLUG +IronHomer +TortiIIa +Sharpeyy +Spangebob +canman794 +ByteMeM8 +TurangaNui +GetMeOut +Kuran +Carna +wikedfix +CJlivin11 +Echo4211 +Helta9 +Roffy +Inqku +jake92 +XxJIMBUSKID +Ryann737 +IronRobbo +EastSyde +assaultvests +DannyDeleto6 +Iron Ohboy +DadLeft +Bawjaws +GekkaJohn +Eggtooth1 +fortyfour44 +gewoonhendri +Antifa4figs +Lakeshire +BlackCloud +M1gos +420tarmslyng +Iskolar +CptSankara +Divinez +SpottedBass +Zoanthids +NezFix +Watson92 +SaltyPilgrim +LordGuthanPK +ArcherYew +Creator1212 +Fjolle Mate +MP17 +stoodzy +thealemdar92 +Kargas +Meatspot +J05 +GeneDenim +tthe +Oyugock +Uunijutsku +R0yksopp +swampwitchx +WhatAThot +rythail1 +Moccamuna +Munkea +WiganRS +IronSabo +BRACULA +YaOldHeffer +TheLionn +Cadov +IronOrca +Stenicki +Flyy +Kunaphela +Classickxd +Tesseria +Qurix +Oxiduck +Coshie +SaltInTheCut +HammerTime29 +Gaiy +Moppeharry +damo332 +ImQuorra +MrFlizz +cutemuppit +Kalveo +Safiir +Schneidster7 +RedRegent +GingerUnit49 +Tamadra +HandleofJD +Ajaxius +WetDreamMeme +SlumberGoose +E-S-T19XX +bigz4p +SnoWorm +Strepski +Lease0fLife +RHCP-Solo +Impurest678 +RougeThief02 +Roadbiker15 +Wutru +ETF +Awowegei +Zygy +JuostenKustu +HCgenes +steveagogoo +Juhiiis +Vloxx +PapuIsThatU +Leroyvdk +Ironred33 +Wreckon +GuruOz3 +Sfannie +420kushmanxx +Leadley +Wardle101 +Haiten +DylanFx +Codfish808 +Siamogale +ChuckDogg +Clardy2 +Tokedaddy +Murogrim +Logos13 +tatarsauce +MoIon Iabe +Tabesco +yaboyalex +Duw +Mowgli13 +Mikerockshhh +XoutofRunes +jmusilli11 +Keyori +Wurgon +Henkerddd420 +famousdavies +DeadPuto +gtrpower3 +arcvnaxiii +RiverOut +HCaturbate +Purp1eWizard +CheckTheWiki +Howson +tittyjuggler +Liutkemenas +Ryns +NoblesForRec +HidesHerEyes +Tactical-RSP +AdamBonar +Kerbeth +Humbleherb +MadDogged +BlitzedBoss +Its Me Dave +Sedap +Jakey +FR1T +FF_GhiLLi +Weyerbacher +LennyPro +Jacobro +STALlN +Drenzi +zero gd +Evytt +g o o w +siNusas +KebabWrap +Own617 +alexs99s +iPerfectoX +FugDisFugDat +fukduelarena +KingBailey +goldiepawper +Pyzdalupi +VngH +BestJester +Wsupden +Vitreous +islugo +l3W0FPI +eujamaispkei +D E F Q O N +Pirelly +ThunderBirdz +Horstel +Beavis825 +Neppe +xTransfer +McDanky42O +Nartens +OjibweJohn +coatria +Kraz3d +k9i +EelsUpInside +Baami +xDijon +AhegaoShawty +23CD +tru3 +Mystearica +Pinkberg +Respire +Theoneburger +BluSPANKSyou +Mylos +EstevamStain +Phasing +GtheSquid +Zwlr +Ch0c0tac0 +BuddahCheese +POMP3Y +56667 +USSpaceForce +Emirdagliii +Megatrax +SharpyClaw +iLuvMyMilf +SURPRlSED +Kalavothe +Judlmin +Mental4Metal +Haxoonie +Eusheen +ggwpezgame +Specz +Sxstyl +clac +Kenny6397 +HopeSmolDicc +troutking96 +WyvernSlayer +Crimewave +Hrm +Agni +RlFK +SuNnY_AuStiN +bobby45153 +Funkiboy2 +Canserber0 +madnijz +Hoyah +Dopatopia +Humanist +pvmrob +Benzema1 +Acko +DaDude +JACK3DJOHNNY +Hope4TheBest +DonWonTon420 +maon +HeavensStorm +JoMoe +alecbeats +MrManny +Goph +TCHAMl +Jom +NicholasRage +IVICMXCIII +MRGAMEZ +weppend +Lohan +KG8 +Nels0N +Havottaja +KerfDaddy +Fireweed1111 +zarehp +Loli-Remain +TarzanNinja +Charloi +Shakuuuur +Kralik +Teqq +HecklerNKoch +Denizenn +Catflap +to_o +Coldvepz +Malteadita +LifeIsRockie +Delic +LoneCorp +Saryit +Elqnaattori +QlKNQFRDNUQF +qiyamah +Kinkybuns +Railee +ROCKYY +MyRifleMyGun +BigEar +Bongsnboobs +nVox +TKfromNC +Drawll +MrObliverate +NaiiSha +ht9 +Leftytexan +videogamer +Jr Metro +Detrimental +efren189 +Wesley +5H4NKS +TristV1 +Frost_PvM +Du5tin 3 +Skywalkingyo +JMack +HatiFnattt +Atonic +Chiefss +Daenrys +ITIassacre +Furu +Clambam +sissijuustox +Some mad dog +NFV +Seande4 +B0GLA +Sclass707 +ImaCraftHor +Falconf1 +Pixkekoa +vork4sh +insaned17 +Webdow +Hoggormen +Aventy +LusyTheGoat +ironwortel +Ghostlyowns +GNULinux +YouGotSeabed +Wingless +TheAssailant +Cantu +EmmaEmma +Radsurlak +ChugMyPPot +KushWizdom +Dankstanky +Dimples +SmallBrained +Chikinbone +Ricanmonkey +fwft07 +Gorg +SicSolaFide +oBugz +PwnTommy +hoangbach456 +TreeNut11 +Sikauss +i Stugbert i +Soulplay Gee +RagucciRafa +Frei +Starrlightss +LegendSuz +Morelos +Dragoonalfa +DaftDemon +Keydiss +Nesuvarzytas +Huevote +anoldfatdude +Eskeleto9 +Iron_Sukulo +Permuh +horkkaaja18 +lIIIlIlIIII +DomYouAll +bIrkaoff +swaggb0y0wnz +Freya +Green Guru42 +4D Entity +Stiltz +Manardog +iamgreatrng +Zachawy +Tjbakel +Mindlet +Cwab +diguper +Varixed +Drewfuss32 +LazyDevon +Zeedith +RCM +GBJackieWang +kdw27 +MR UDZ +Wizfujin +ProxDemSox +Hallucin8d +Muki +DeadDogRed +Zer0mancer +Kakoji +RBNY +AetherEra +DaddyLemming +PALAK1KO +datboi2456 +drillbit_10 +ohia +Solo Sirva +Edsy +Z0ops +Fapricorn +Plunkton +Painovoima +ItsFlooo +00000z1 +Iron Meydon +Bonkers517 +Zarliona +Multiplying +Hagedis +ilapaR +mcrane1202 +Hunter10139 +Nyler +Flipzzzup +Solo Xenopus +MilkyGalaxy +rockhead7746 +Yentelke1998 +CJoaboneP +Fasterman +Norton_Gman +VorGole +Ox310 +novali1 +Bur eye on +Elf King Leg +RawRyan +Dbeatz +Mankitten +tobinoo +SneekyBeeky +Soft Dump +Wwx +n3u +Takfil +dmh3464 +Jay024 +Nex Is My X +Matthewwww +IEATEDYU +MarkBuns +Diclo Force +InfamousEvil +CameronNeal +obican +Ironkaka +Nssc +Secretly_Bad +BionicKing +Saskel +XeNeaxaxa +hexergeralt +Beeline +Spria +Fawka516 +MysticStrega +Tjabalabaaa +CalmCombo +Mousenn +Absolutism +DriftVolvo +IPumpkin +ViisYsiKuus +Xanthophylle +paulmacawk +blue cat69 +Gardenia +IRowForUCD +Varsa +3erzerk +Wolvesy +RunescepxDD +ManzGotViewz +Smurfukas +Kapiaine69 +Bondz +Kizza +Mygraine +TheWrongName +D2nzo +homie jaquan +Commiefornia +Zackology +WeAreMoksi +Psy13m +Mr_Schmeckle +2cbrein +KaiXin +Day Lightz +T7I +Suedezor +Baals +Mcdally +Haavard +ratboysteve +7rad3 +Gunwil +GebwellB +Jelbringer +Mrslipkn0t +Quonloo +pizzerr +Cappei +Inefishient +Neonke +Huswan +Protege +NieveIrwin +Sack_Lunch +Skopusnik +Mougi +RoyalPurps +RyanKristoph +chent +Jyppedi1992 +JSplash +Stranger56 +Obsel +I3rucex +M30z +Goriox +MolllyPop +Strabz +fsteve +gotzeeben +3bobyshmurda +Zaraffa +thatthicksix +Toysalami +MknlC +C18H27NO3 +nappera +Puggzy +Hutros +Draconian111 +DontSassMe1 +Muskets +Hoooka +Drecy +ImbuedFart +wtfix +Neroxcen +Frostmourne +dopeyaf +Wood Choppin +sashamii +Flaskepost +2ual +xSynn +CesarPalace +IPunchKids +FillyFilly12 +Matrixpachi +Warmantus +Kool Iron +Mackadee +Tilur +car oussel +Schout +TrodOnLego +Whatz Trade +iPunchCones +Venereology +PFalciparum +ohh_man200 +Mectofion +En Jernmand +Iron Nellz +PeatMoss +ProdigyThief +Maela +ShellBeRight +FeManlett +Giskardr +Flamaha +KnusCaboose +Charlez +Rolann +Fe Hellpuppy +Fearengineer +Ruto +Jefry +Edga64 +Datis +Wissfx1 +markypoo +Dagger93 +ClexOrie +IronJamesG +Dton +CowChum +VVanderer +Carnadova +ItIsWedsDude +Quacamole +HC Diego +GanjaRhino +Thrustaxe1 +Nex2169 +Harvardista +Stapper6 +HephaestusRS +Fenix Downs +BenderBuilda +WolframOxide +Jordnn +Kyloman +chatandinan +mellaa98 +Fe Pyles XV +Pnia +asdsdafsa +DayJarVu +Oifey +Ragnarok96 +Tuvisitt +noskilljoe +WannaBeE-tje +CowzGoMoopy +Ninevolz2 +smushman +AshenSughar +kryptocookie +Inimene1020 +Ginyuu +NEEDAMETHYST +Autilon +FeedMePlants +Palt +nikler +Viturbio +Karmaa +LuckyKroketa +Alternatee +iManiac +BARRAGENOW +Jokar +Bearsfan5455 +P1zzaTheHutt +bloodtheatre +Lysandra +JamesJ2019 +Tabagie +Rockrets +KnightMike +TormentingU +EDGV1L +Venom00 +6T9sofine +3-age +2Guys1Wyvern +2ndpanz +chillscape99 +TakeUhSeat +runedongs783 +Wxyz +Slypes +soggywaffel9 +DuTson +TheBigZofNYC +Doll +Faultty +AL2 +AngryMvP +Joltism +IIflemishII +Tbh +iTunder +Reemov3d +Klengie +Dudeimblazez +Inedibles +orangetree34 +Panera +Liberate +Kangst3r +Alegrete +0416347345 +MasterThresh +SmiteForAgs +Drakonid +FallenSlayer +Sxves +wwTakun +itsaart +outsourced +Rzasa +Huhm0ng +Pyro420Kush +Cooj +Dank Bud God +Zeekheart +SureDeth +Kindaddy +Offers +justwin4head +Morch +frostkatss +149122089147 +GeertWillows +Jecob +Toivo_43 +WhaleeWatch +Noxia +1183kenny +ljjjt +FrankiesAlt +Transfer +Xoobs +XinXani +Jmies +DoodleCraver +Volkrah +Moysey +Bohejmen +Macre demia +AshLad94 +Ellise29 +Canta +CAKESNIFFER +Checkmate +smrgn +Pisatronas +William2133 +Jamyroo531 +Fanatiker +Nadund +iPete +Irid +YakYak +kkDV +mims2dank4me +Popkorni +Qualities +gran chorizo +Delusionnn +trytohuntme +PoolboyFiji +PEEKYNUMBER1 +Noodle Soups +Plexasaurus +RabbitsDong +Alemao +AmyMacdonald +Sabu549 +Akusti +TFreeze +MrNoBank +BubblesGO +Marmita99 +Kochelas +Ibanezx99 +Nakke176 +Sabbatix +DannyK +5parrow +PaskaneHomo +EddieMercury +Slasher0708 +Cornish +Figmentx +Sir NichoIas +mudbitedlite +Yenom +Frostbiter +Heeling +DieselPump +IIPrincesaII +GeneralJosh +Bahn +Paul90333 +Teotl +sharto86 +WaaduuuHek +Llirik +Zeplin1 +Hankzilla +IVIaybe +TopsyTurve +zedzke +kokimon +Wahido11 +Cruzty +Gabriel61198 +Xendel +2danny1 +Zmanonthego +whiskey bow +AlchedMyLife +MichaelB +Dosk +Znked +AkumaPenguin +Dizho +Vaealin +PWNJoLee +Wingoficarus +Can Berry +MindfulGnome +Jante +Taplop +l0H3aV3nLy0l +Fredanbetty +shoot162 +Darzix +Tice300 +Kasraa +simmeg +ixJake +LavendrGoons +Dynloris +Ninorc +Jibajaba +F1skemann +1nsane str5 +turboed son +cookieman +Azuuure +levendi +Ussin +Karkanii +Octavia +Aguanator +Puylayer +Zle +TheDaedalus +MlL +xBlackDahlia +od1np1ck +Examon +Beckyboo308 +Durumoomoo +Plaininsane +InfernalPRO +Nabroleon +Larkypoo +Sonc +Doboner +Arhedel +Wyliecoyote2 +LavaKitty +Killaowns +DeepInUrMum +Toycutter +Luper +Garbar6 +Stenfen +xRemyLacroix +Charlieb9 +Tom Fn Brady +ziyi_wangler +ASpacejunky +Robbbana +AgiNagii +Stedy +DuYorick +ravioliwren +Its_A45c +Sukotto-Sama +RagingReddit +HotAsianCuti +xGigz +BonnieTHICCC +fatpapi +Ideekay +Paliperidone +TBoyd4138 +OneFive +kejo +NorCalGreens +Chugging +loveT0spooge +ddSyndrome +Kebintotero +Aelos +Cacoadragon +GodKingJT +Champiion +Iron MTUT +PossumPally +Jetsmoke +Falladis +iAIex +Skelethon +DlAMONDS +SerenShadows +krikenator +OdensWinterG +IneedPVM +JulieFromHR +SkyFlyPie +Gooda4 +Emus +Akolyta +Doc_Hershey +DevilOfheavn +Runester9999 +Butzaf06 +Sylph Rings +shantyklawsh +Gekolian +Midday +GIBBO96 +Froomey +SilenceSC2 +Runboof +Fluffy chair +Cyclopedia +Sirtippy23 +Lombachs +HitOnRun +alittlepig +skorthen +Sakkyun +Imbune +Taberknackle +samwise1133 +pl3d +NotShaneska +Kodax +Xbalan +P3RLICH +April 8 1997 +Ljudmila +Blakeeeeee +PackingCope +Neye +Nhimzo +7x8 +Kelso523 +Hamsterslayr +A WILDR0NNY +Mojojojo171 +Cotched +nfb +urondelekk +Coolmanafo +Bulldawg1289 +Spookyou +Sir_massmo +BeanozZ +Jygers +Eleandil +ARTIZN +actlater +Silvado +Bow2ThyQueen +Lucky Lukey +IAmRichard +Desinger +Veritasium +Fewest +IronMatty +hcgoldslaye +nitsuj315 +AMRSY +Fareham +ZamPeZu +Revolving +AgileRj +TmSmT +Spudge +Chinanumber1 +Carsillas +Chocoblow +IvanMullet +ccvtw +BustyBabe420 +IamRichPutin +Parciparla +Jaooa +upwindnofear +Sillyibexe +FarAke +Kattnis +CandyKing420 +Ckale +Poyig +stupidcape +Zgrite +Ttffdd +g1n00tj3 +LilHorny +FaladorabIe +FerrousWolfe +Dreddshott +IHQueenI +Ciszak1996 +Gwellz +G6Wizard +Nwkz +Starryfina +OneManTeam +Roanen97 +Tommy2Tick +Eukaryote +Ashlyce +Monnual +Froloox +Yodati +Catdog1280 +Lunizzzz +Savage Mind +ossaciM +Died4Hides +LoneMage +Baliboosca +FeDestroyed +acceleratism +ShrimpStick +IGoogledIt +Big Grorb +CaptainCox +Bakkis +JoseLargeD +Cuppalimmy +Gibboh +RubyLvledUp +TheDawg +DankDylShpil +Dxscoveries +Iron2Pickaxe +Xeldin +Iron Scolew +LilUziBlyat +OPIronman +dommegekke1 +100Cl +Acenr +Prelash +WorldsGr8est +Tyepo +TwistedxAura +JoeyDabs +MrGaalis +immef +AlphaFeeb +PlsAName +FN2187 +Ershayzz +MystiCool +Dolphinl1ck +win we must +InCyson +N0blelegend +Metzz +Arlorict +JBux +IronFefe +reflexlols +RDJ94 +porkchop-kun +Hocpuck +xXJoshUKXxHD +br0wnardRS +Onbekende +spoonyg +MeesKees +FMarshalBill +OnePlus6Btw +3PL +StoneDwarf +Whitefire68 +DeltaPapa +Bairac +Zegetable +deathax10 +An Iron Butt +Zeroswift +TomHilRigour +Speedy9921 +Dongsalad +jewjoking +HavocRavage +Dailiana +Tranziztance +oatenz +Randy Rolex +Player35254 +IronLegend +ReeferKeefer +MrOctapus +TrippyReefer +schetts +Dogzie +Bunceylad +mr10inches +BATH0RY +ironinfinite +visualduck +zohcysp +Iris_1904 +ALevel115 +Bazukashrimp +Liitokissa +Plebiside +Kharn +MangeMeister +Art Dayne +Bleasi +Tralan +kinobi +GladePlugIns +KillaSilence +Patta1 +ccc kyle BTW +Laglet +iMartin11 +Strikingvipr +PickleKez +AngelicVixen +Schuck +Live4thefigh +RUlS +UIM Pepper +NewBoy4321 +IronRassi +Curry Storm +hiunknown +18cast1935 +Verelya +Ajinz +Gundrak +Shiranaii +Lynxes +agic +Quessswho +Joeyjoe600 +SeriousLip +IronClarkey +brewi +cMehuu +Try2IronMan +OSRASS +hopOFFbish +Trivi Beast +LJP +Navraj +Polkapolkka +MattSeal7 +Dadi415 +CurlyTwist +Deadarrow99 +Lotu15 +TimSkilling +Randomized +Efnie +Dafo322 +Jimosine +Megalo +Halfway +Hesienberg +Eliptats +Kgm +Tainoo1 +snowysonic +humpmedumpty +deadcentred +Pajita +alsobosspros +Runeiro +iEvergarden +Phobias +Dragneel +iUberz +Yeeetscape +2TH3MAX +bungaku +KindaDerpy +Stixc +GenoJuice +Gunnolvur +BabyJIREN +Naoka +MaxSAVAGERY +Ag0b +dharokjonsin +Grimms Baane +R0bain +KenKaniffCT +resU +visuna +krillzscape +BurnzWhnIPvp +gonarusinat +ImIntense +Wendyy +Traxxed +Geoffry +Dmoe +KaIOKENRAGE +graftosh +Sudan7a7 +UncleDaddiii +Dikken +Salmon +Linnara +Enginaer +Yerkinoff +Jorster +Purkkatukka +ZaPhiRoxD +Jordz_King +Jobbyqq +Alohas +Opts +STZY +themrgiggles +sickGeneral +WyldeKirito +ShinyNoctowl +HGCduke +Sparkles +24c +KRonHusker +De_lemme10 +DJMuscleBram +LostSauce +MrIWontMax +Suadela +x47 +B1G_D1ESEL +vaghairs +Meteora +FrankyyTanky +Plez +suwo +6bt +Bub Josh +Gnu +C-11 +Wessen +OnthatGrindd +EdgarKing +LostDude28 +SoulUnleash +MARLB0RO +LuckyMatch +Moonjock +YoshisStory +Spidersnot8 +oksen32 +Shaper +2InchPnisher +Deny +noek1 +Maester +R_andy13 +Raggedy Jeeb +Butthxle +rawheadshot +3Ticks +Scourging +Monumental +KARANISGAY +holden21 +AximusMax +BlZZ +CentraIka +Kisle +Confined +Havac +TheNexu +LoliChan +Invokers +Hartree +Dezi-VII +SUBAROO +TjockaBengt +Zetani +Onkelleif +PlzRnGesus +Craftsmen +D00DLES +Pebblez +Penthera +hzpascal +K-epan +Hulvatonta +PackAnother1 +DjWalkzz +Hng +Mag1c_W33d +AlfaAleksi +Seany4444 +RagingTroll +CUMBANDIT900 +sdzl +4Tune +Ludomo +RestInPce +Coolavatar1 +Coolavatar1 +Gannicusproo +redwagon9 +RoadBoat +Obsidian222 +nioem +PH1SH3DB4N +valeriaT3amo +LordOfHarems +Obscuremelon +Batzz +DannyPho +Kapsaluun +FuzzyDonkey +SupremeDanz +Kazaz +zoan +Duxt +jekkujaba +Pussy is Op +PeacandLove +Nostos +478k +Vilke +8O8O8O8O8O8O +ka6 +Sizashi +belgibeer +Persephatta +Tamber +Redael +Glennyboy +Mattitude420 +Glow +Supo +duff skill +EvilTriumphs +Cache +XxKaakkimusx +Neganeogami +ex_shadow +InnerBliss +ogogog +Rigged1 +Tewwer +RikvWesting +Teeqy +Tawa +Afu +Silicon Z +CrusH-HK +MattLeedz +HawaiiMadez +Kirbngo +MichaelScarn +Turha +Dixed +VBH +nosemar +kavinskie +pwnnya +Xflowerz1 +Toxic Emre +Mirith +Flock43 +PregnantSock +N0ID +Elyysian +Jonsamma +PencilVesta +ImTaegan +1stHCwasPKED +Slokei +ze4l +Gyanzin +R3Dtjee +FaNNtastix +Ruut +SceneGfX +Vigilamus +Oumu +zygis323 +Xaryn +Smpli +Ziggydog7 +CustomGFX +Restrial +miltryguy248 +Taelos +Ville921 +HeadHuunter +oAlsen +hub154 +Gomham +Kinjello +DevinTheDude +Riiggs +Arithe +Br5andon +bottomfeed +KarazySS4 +Mango1997 +Nusky +Forest93 +Syracusa +Psychodeathk +Pugasaur +Eostrix +Zuibbi +Dovahkiintim +ImMAdBro +oljon112 +Tijuude +Seantjl +MCKenny91 +AlexxisTexas +Hodort +Problemski +Steenkoe +Sorcerer5555 +paccerz +IronManSux +Brocepticon +puregluttony +D4nnyy +Siraxis3310 +Teff +Travish +Kcnny +Zephylius +Landyll +Rokki +Greyhunter +arookie +Mrjli +grashuis +123bear5 +neenisneen +RubenD +hikipastori +BallinBamf +Kleptic +Fkluzac +Verdantys +FlashYellow +Testate +MoonYagami +Jonnysniper +Frostyyyman +AKinkyMonkey +Korail +fighttme +Glorfsaus +MrNatee +PlatinumHerb +Yeeetist +Surkastunut +WorldWarTwo +Gnomeplay +Zyyra +albiguerra +Dot_Tea +StaIemate +outohere2k +jjpanther95 +CookiMan +AJTracey +J2ck +Rorr +Drunknhiiiii +OsBlackBolt +FreeFryBread +yung inf +EdibleSnow +Samadier +xXBlitzO +DancingForGP +Ydorog +Aksu596 +namelessRS +AQ COCUGU +iBallr +TeeSchaf +sSpring +fabsku +illenials +Explosia +nutes +Bugazzi +Realpk2004 +BlueRanger +JensenRS +Lampyy +Avsendesora +jodilynne +Composing +DylanWad +Satchmoi +Solo2424 +Klementtii +scidder123 +Skertt +Mercules +evidencez +iGotDds +oddfinn +iiGallardoo +Zamzico +Goinvokeman +Fixions +RobDirkson +Kalash556 +Mancino +PoloG +RavingElf +YaBoiSlip +Bower +Chickenneth +Capos +DeEgis +ToTheRanch +RiderOfRohan +Mooner +Kenpo +OhDannyBoii +x_Goddess_xz +GoPlayOutsid +SonneTeufel +SilverTeej +Kolade123 +ChinaInBox17 +AshBash +Uit +Gameboyjr +ironkendall +Kelvin2GWW +IronMarty +Jim38iron +pletsjer +DogmanJones +LearnCatMeow +PhantomVS +Boyyo +Supersam142 +FireGiant +Dohace +Ryokojin +Pain deliver +ap1ska +Enabled +0neski +phonon +Kicker +Gimlocke +SCOTUS John +Ysh +rob nagle +Iron Kngs +U N X +oORagnarOo +Gremoir +soggybread4u +The_Jimmy +Trizak +Xwoprl +turn the 6 +cby +Garena +Piripaque +Scratchzilla +bota2 +Hot_Farmer99 +GFHL +Bendak +zacharial +MikeM +msimmo93 +PepeHang +sppoh +akipf +Memeshake +Trenl +wrsrule +Grimwold2 +Plece +EIf +Bottrill +7scaryfire +Gomut +YYose +turntBurrito +Fe KabooM +Cyroenix +virtualsucks +Warstroy +Mugen +TzTok-Ladz +J0UF +Jorsne +dubdubbronco +Laneeta +Munire +ZeroZero +Woodson +NamesAreMeh +myexdidntrs +FrunktheHunk +YoungThugga +Zikry +DW24 +Sutho15 +hammu666 +VoodooCells +Vereco +Wharncliffe +GarbageEater +Toastie +Im relapsing +Riickkert +Menza +samuraigod13 +Jennacydal +dessverre +Elshi +Namelus +loliconflict +SpreadButter +ls32o0 +Zairin +MahSeed +Dragnipurake +Totaled3 +2girlz1jbird +Rx-ll +21SavageX2C +Sinasappel +KidSativa +WINNINGrng +Dorse +Keloo +RipRoidie +UnkindledTwo +Trim +PrivateSmorc +Adhurim +HB0 +Irithe +SH1TGAME +Suing +HEAVYWORK +AoooA +XORB +Pu-94 +Raptz +BlueLegendzz +Qnon +Arthesus +Morqan +GlZ +Altifueled +Anthiex +Starwulf +ganjah lord +dasor012 +pixelpeat +kakes +Imperdoavel +pro90 +liltunechi +AVOCAD0O00OO +Apexist +VORKl +tpe +FattyTerps +Phyronex +IFernedYou +Worland +Spoka +frothsy +Remix +closeline194 +Distard +Azzz +BlueRose91 +Lyna +Contendedd +MilkToast +nigriV +z0nk +delboy1964 +Misty12 +Robpar6 +c73 +TheBong2 +Marlin1993 +HaveAGood1 +Geskar +8ass +Drazart5 +NITR00 +Crr +SeemsFair +Mythicat +Metaling +Kippenbro +Thorvesta +Absynthial +DanMaxd +Me3lem +Batesanator +Xaussiemaulx +drwilly92 +elDiablo666 +ValheraUK +Pyrl +handi9900 +asdasdasdf1 +Patronique +Dahrmata +Xick +Blindblinker +Kokkugoburin +Austyn +Wee Seapy +Abortuary +TWITTERSUPP +BaronConey +Jimpertje +Amazarashi +cookiekill +Xenses +Blimpysaur +wildcheery77 +Purescarybuu +Hubli +ValgeHunt07 +UrScr3wed +PutMeInCo4ch +Mikethafarm +xVoidRange +eLqTLN +TheRealBew +ard lad 06 +Pvm M0lz2 +Gurilovich +Pepclub101 +KittyMeow83 +Veersnof +Raicun +WingsXIcarus +WhiteProdigy +DanAye +starshoppinn +FunkyBoy4444 +DawnfaIl +Ragnariukas +Froemelke +Shozen +xSlysoft +VengeanceTR +Anabolic h1t +Deathscyt56 +REKTmlg99op +Tyom +Tokkie01 +vaderex-1 +Trippinsac +Tmoe123 +GlRLS +Muutz +Tonester03 +Impedance +Fadge7 +Ez4u2say +CaraDuraMC +wutzgood +SaYeon +stephvn +LachysMain +Lare240 +Rilah1212 +TimeZebra +Janikowski +Paarty +Swords +llIIIlIIIlII +Larso +OJ AVENGER +Tomtastrophe +Erectus Croc +Intresenting +Roozom +Vims +Zhava +Juint +iOwnU4ss +fishnforfun +KonaTheGent +kurtebener +NickTSMITW +Sby +dmolishall +Jerak +dabtchel +Changes +Gregsdabomb +Mole1 +Shelios +Mewww +1312AFCA +Wartika +Figes +Chicopee +GoblinLevel1 +EternityEndz +melborn44 +akbennyboy +Acolytes +NiceMarkMark +Killamemsta +dj_khaaaled +lzh +Muzbo +Gadwall +Almost_124 +bumpyD +L0RDGAINS +UrbanMerza +JAlDYN +Rotagilla +I R N B R U +UNEX1ST +vega591 +nostalgiaeng +Ebgame2 +KristySlays +ililliiilli +Manafont +JustinFromVA +JAYJ51 +JonHDgamer +Viiksi-Vallu +Danxdoo1 +Eckou +Docrates69 +Khayri Demon +samqwop +AR15ONA +Sevalt +GodsZombies +sir skau +SrslyTired +AssBuster21 +Skaryth +Radiohead66 +TrilogyXO +PrrMeowPrr +RalorLeetor +Zentra +TLTBT +Philosophia +Roerbakei +Dontyoudoit1 +Spleaner +Yorinky +Qc-Elfmage +43technetium +10000Fists +victoriauwu +ShellLeeBee +Lukytisz +Nemerrr +DaddysLoad +Swirly248 +Coldhound591 +Kriszx +Dranty +Zonse +Dirun +3Il +Pieck +kastekann007 +Flowiey +DonDennis94 +Kusle +jonnywormy99 +Wantsome909 +d3mot10n +Maind +J0hnnyQ +MadeInAfrica +Sandbar +DiiK +Karskeinmies +EasyWhale +Bladypus +vJordxn +DeltaCloud +Snakebite37 +Jellisme_99 +Jmaster402 +Gvzy +Lawlimon +NLFreakky +FILLME +Taekwon-Do +Jobber +MFI +DjSpicyNuts +OhHaiMark +loucks +Thugbug808 +AssCumPooPee +guyhasaname +Gothicking70 +YuriandWeed +Ne3po +TheBong +Olmlit +gege4646 +alimpweenus +Lure2G +Rodnirt +Creamp +Manttt +BatFat +llStevell +Corizz +sirpoopball5 +Mardzz +ClevelandOH +Biohazard541 +shawnn1 +Pipposan +macflag +Sarrz +Matholemeu +MyFitPal +Blakely +Abou3Fiddy +LoisGriffin1 +theMatan123 +wispykarma +kingrizzla2 +Necrosauruss +AnEpicWookie +H0RSEFIGHTER +TheCapist +Rezz79 +NickisBackyo +Moms_Spagett +Bobvill +xLynn +WayneStated +Lupah +Erikci Jr +riku230 +Darkang3lpkx +Sir Epic 3rd +Frazia +Goragtong +Suola +armyofkids +A1KMAN +iJesslag +Magc +Iron Mapes +MADRNGJACK +xH4rry +Ozaiii +Fietsen +Phoibos +Juisy +dp23wnnabe +Paduann +LilBirb +Stillmatic18 +Mand1ng0 +Boshby +Thoradin +1000 Antz +Crewcial +afkingRS +Andipyrus +GenGraardor +Valorpoint +Horozu +machurrohard +22btc +lejhobs +Green_Matcha +Sink +Nikkerpoo +Colossus 5 +Tongo +Trejoracine +Cruel Cub +Sqwarka +BellsOfWar +Kongz +CommunistMoo +RotiPrata +buldog89 +Wilnafe +Surlygrump2 +YourPaperm8 +Xolca +eetuliiniBTW +NovaDragonX +Unknownchuck +Ironicer +Topstad +SSS-Latch +Scorialator +Chapels +Purebish +xTwister +gianni025 +Goooby +DiscoFever +Darthshea +Sacck +TheFlopyTaco +Naxiius +Awilkins4231 +Zantaril +Dat2eWoord +darkclues +Jern Tarzan +brisingr vin +Martika +Brenkolovski +OkayTwilly +lopiwer +NinjaSpeed +FatKidHougie +Eazy_Peazy16 +IronBankFull +crzybrady +RiceWrangler +VividDreamss +N0B4Marri4g3 +AlCaponee +Popovich +Lost Tadpole +Baltoth +XSapocalypse +AbyssalEmu +Drgreenthumz +Knightrainy +SugaNoCoffee +LadyStorm83 +Iron Hroth +Oompy +zubor1 +EikAyZ +Airomatren +SilverRizlas +Lefonzeee +Dystxpian +ztkfps +bronzenohkie +ZodiacIsTed +8JT +Ironn_69 +Anjigami +DoctorCoc +Boagrious +ocruT +Geologistic +Warwick 1080 +2Tits +RoadSpartan +Sossumafia +WhippyMong +16le +Josh Tsutola +TehBriBri +Nuirokay +Dragonvirse +COYMauves +Mezzito +ManBearPiggy +mac_moneyy +EvanWilliams +Eclardyne +Pelaa +Crocalu +Sivior000 +Koopley +greenm4444 +Elbs +hm08 +Spoorwijk +skyffoxx +Parvovirus +RealShyGuy +B1ackJack +Secho +ralliss +A1rhook +Iron Gios +Viiiral +Kellarivelho +Gorgonsolo +Little Snor +meekmook +MrDarkBlue +Sohanisgay +XeroBlitzAce +RestoredIron +Miega +Knabbelbaars +JackoPogU +uglyandfat +SpeedPony44 +Gladeandy +Razoriginal +DaemonGunner +UpRoaRs +CrazedAfro +BledReborn +RSPup +OxideIon +Azur_I +ScuttleAway +Jerom21 +Wa Wa Master +Juheniqus +Therealhook +Thrillhousee +Iron Uakti +TheJosephe +JaayC +v-yordan0702 +Dipdadronan +Sl yx +AchillesFist +Aquatik +TranquilGod +Sohl +MoofinnMan +OffsetPaul +BOOPlNG +Spyrooooooo +D4H4EK3YSM +Twet +Hunnets +BashiraTHC +Cogstyle +Organics +Defaultbomb +Exaz +Getsu +Clouted +Shongrislomg +B0Q +Chkn +Proviro +ILLUMINATIS +Wtf_Stake +skzs912lav +Kumeku +MintWestwood +limona5 +Wagada +CYP450 +Arkavos +R8 +Tyranids +WeedDoctor +Zerrilis +Danleypa +Leimstiift +Q2B +dan +Barnz +Laopac +lnkd +zKamp +VorkathsMate +WatermelonTV +tentacion +ItsClout +Portrays +nayo123jo +Zarov +Maniek +KnarfeRS +Lion-021 +Sepper +lexicon7 +pop-tato +Prosit +hestakuken +Lewison +Autophagy +HitherDither +ggroeffus +Zfsalt +Idontlikejad +aut1st1c +BukesCarKey +shroudyroudy +Puud +jhonlee48 +Iaffan +BigRedDog +AutumnKevegy +Kappa Dog420 +jochieboy6 +Millerlite95 +McNeal +Rexun +tbaballers +Sciario +PaulD +MrOriginal25 +Laviuthen +KriegFleisch +DontTouchIt +iAUSSIE +rhiller83 +BobaNeZmogus +Resident +OuiDaddy +Jugalator +DazednConfsd +JoKerRtheGOD +Doriva +HungLow30 +BaconBlunts +camrbidge +Coan +StrokmyGroot +SlappaBogan +Tmoe +SoyJuanEuro +Brian-senpai +PGmeupe93 +0lurker0 +DrumsSpace +DanernesLys +marioswe7 +Brewdo +Captcha +DaJaVu +blueergon059 +Aleffy +Marsal +Lap0tai +Alvislt +Olios +AMST +Noxied +deetuu +Takeitilslay +ryppyreika +Jewy +Freestylin +Beuglord +SwoleBadguy +Zoltanious +Knight5247 +Hydration +Hord +photolstamp +Swatfighter7 +connor420sit +Laceinyoface +TheRanger +Alltiana +Xylr +stainalt +kingerr +Kursdragon +Malqy +Finsho +IPkdYourBank +xHartliss +Bevaun +Pokergod720 +Rebelqt +BigDaddyEddy +AndersenXo +Sugge +ShadowBoy001 +Festis +skaterdogz +johnbie69 +Tokin99 +Skeff +Redza14 +Teurastamo +Cirmit +mlgb +Zadior +Dramyre +Liuo +Hambzy +TripssAcid +pir0tekniq +PotionFayD +seachrome +GH95 +Death0fyou +GEtItFrAnK +Honeytrippin +wrong ranger +Paracleis +UgranDag +Doadles +Villllu +ltsMiller +Corsa +Nelvian +Lihtsurelik +luolapeikko +rebirthofyay +Speedball1 +Grrim +Templaris +GWPH69 +Scorchbeast +Naftininkas +G0D Richard +SuperJuicy +DolphinPucci +Piffen +TiXN +Portvakt +TGOBS +Jotjemenotje +Rcc +ShabooBopWoW +Supsep +Quizzy Dee +WinexBlaze +bigschlong33 +HCsndr +Plexx +Buschhhhhhhh +Ewan BTW +U1Q +targ119 +Daloomi +Randomguy38 +MaddAntelope +GTFOIMGAMIN +lpman +Blusaunders +0rphaned +Waifus +Powerlines +Laxx +Pappa Mauly +Wimm +Saradontmin +Zeusvdl +lemeborrowgp +Pikkets +iDeathlok +CoreyNKH +Korisas +PepeLaughing +Andyn9 +R00M +Plz LD Nat5 +peepoGamer +MarioTennis +para1911 +Sjeb +GrandErected +LittjeterRS +Domantass +Redflame +meerks +kechhunter69 +ShamanJon +Dr_Olusegun +hawkesbay +Skilll +ManWT +Veilious +jackLonghorn +Hittimestari +DabsWithDan +Deftones +TsukiAkuma +lAnomaIy +iamvoldemort +SAAB_Toxic +dannytjuhhh +J0rdo117 +Lullie +Omarinski +Painb0ws +Polite +Pandiman +DeeezNats +SlaySir +P3RKELE +Drunk Jake +VPixels +Emasterone +807 +luthas +Picklzz +jorfee +Rosv0 +Karmah +KingKongKoen +Fingerlegs +Make Carrion +BartBelly +IgorBogdanof +BuyingRsGfs +Made4Slaying +MrJonMan +Piratey +Fascia +KarilSummer +Vyagruhh +David2699 +91CAL +Dominaton +und3adedd +Diggernick32 +Lucil +Laowens43920 +Loophole336 +casperium +Booped +GiantConker +kirby421blzt +Hrungiir +Dazzz +Ased +AskingCard69 +timaye56 +Pulkjes +Alfonga +IIsaac +Obedar +Kylianvb +UmUUmuUmU +deathchecks +K_sak +Versatio +lepetitpois +LoPintos +Faiu +Marcoli64 +Knakenstein +Thomas +JGlen97 +Drakesh12 +DoubleDeezus +freeze4peeps +BDrichard +Splyce +Judie +Iron W1nk +Drummaboy276 +Nexgen +Bayman +Senarii +Prokopios +iamonfiyaaaa +Jakermeister +Feathereli +Lukse +Im Outt +Frosty751 +kloh510 +MrMonsterrr +Overclockers +Ptyh +Awendana +DoMeHardNan +Zylco +Weshzz +KingDweebus +Rugg0064 +XCShark +Spajina +Mentally Moo +VanillaSwirl +PhantomFiend +Cheimuu +TzTok-Joka +Metadragon +Mikkon +bonna1994 +Englebassen +lightfader96 +F1K +Pieterjan +Planken bos +FranciscoJ32 +MrOceanic +Thebano +Chriiiis +Pollofrit0 +Wiggoth +Glennzii +Ryzema +FlLTHYYYYYY +GrumpyFire +wonder_wenis +Cooki3Crumb +Darkphil007 +Akyle +OneProNoober +XgodofironX +IronPills +Korpokkur +SoVeryInvis +M1M +NMOS_giant +Raptorsin6ix +Female Henry +silveraze123 +IronLaffin +Batsborkair +woxzard +Dydapynk +Iron Kalde +Slo w th +KoalaBwala +Yavrum +Carolan +Deformedhell +One life lad +Splitarellie +Nixby +Bethevoid +Iron Zilong +Rhette +Philkwl +Elynescence +SirCoolAsian +scytheXI +Psycho11111 +Stolen Grunt +HcHoopla +CasualIron69 +Flyguy13 +Xilamz +13ert1 +TheBowJob +KingFlugal +Churlrunone +orb in bag +Slyfocs +TastyToilet +Dubspeck +NaofumiLTU +Justinolk +Mafooma +Jazzjr89 +KruttGutten +ballenbak +KentWasTaken +PeaceNLove31 +Caekrus +Francine1225 +TheVnom +Queerzzly +prut257 +IronBrad +level-596 +oooRush99ooo +Rocklore +Dibbu +Salte 55 +Got my DD214 +inldgwetrust +lucky female +SoloMishMosh +Embossis +RealJonner +Unorthodoxfo +Lego Fisher +j e company +Patrician +carrus65 +Rasput1n2k13 +Nexil +Teabz +Spooxky +EdibleChickn +D A M N L0L +FairyFeind +cimsoK +TheFizzCC +mild farm +HiLumbridge +Zechuchith +Sidabras +Shonion +Yomdo +KrakaJ +SonOfDecay +Solid Stache +tuhdhuderr +Geo Geo +Spry +Psyc Paladin +FXF_Tails +Gravew0rm +WitteLijnen +SirLunarias +konch99 +GusMagnel +Wildapple +Sk8rgrl474 +Reimie0x +FutureKaiden +Zahnae +CrazyShrimp +hc_karadeniz +Danomeva +Burgerr +Dogestyle +Ronco6 +JZX1O0 +Lemke +imm0rtalb0ng +BerrieFan +Charmos +CaptZilyana +Blindspott +Zetrus +Stox7k +ArrowTank +MaQtPie +5xr2 +themaestrox +Shultzy +SoStronk +Dynomite +Zigzagoonfmt +DaRKi +JxyStorm +Bunryl +Ikastovizski +BrandonLarge +Sybe +Fireheart470 +TrueBank +ElysianError +kingdale26 +AndyG223 +Dairychuk +Choobcob +SECDEF +Mumspaghetti +Z4phy +TDRS +kingswood +AJsk +Marinez +Antipathic +MrJoestar +olindaelostz +wanolo +TravisThott +Zuburus +jibmask +MrsPurpTurt +m4ge4life4 +Fosh +BonesNAltars +Dogslayer420 +Deadpaal +l8tenite +T3vas +tmahones +Scuto +Baggyshaw +spaceonion44 +Nestl3 +Swurl +Reince +1nVaSioN +Tinsmith +Synced +Smittyk15 +ThisPieIsDry +Snowscythe +woesh0 +B0ngbutter +Plane4611 +Rismani +Tonfa +RoyalMess +A_Wuh +Ondra969 +UseToBeGood +Uh-0h +DOOMBRlNGER +omegaOnepump +TwitchSeljan +Bhalobashi +AncientMagus +Grobaz +mkl782 +Diade +DaftPun +Azez +smasher12121 +Replo +1942 +VersGrind +justamemerr +swooinc +GodlyLeecher +NihilistScum +liz_mar70 +Kelohonka +GHEEESE +WestFlag +marcmaralou +Kevb0t +WraithSx +Allkune +baitmem8 +Drrrrunk +SomalianRats +Kiirii +IrieLuDa +TechiePicker +minatokill +TheMaadKing +Deive +Woul +Kawakuboku +Mrburnsss +durgs +Aeikora +Versalix +myballskin +AlphaCoderXI +HypaDunkTv +skatermatt91 +TheDampBush +Goldie47 +AndiVT +Steve51 +krakkakkak +Squanchhy +Payne_Trayne +Polllie +Assmazing +Majehjk +GotchuXL +willmott +paulimvitor +PoppaChoonie +Stradarts +Zonum_Knight +PolakYT +English +J4gga +FLoKii +Purelybo0ty6 +ColdReign +Hezbullah +Ro2no +amay +Zeeyk +Neutronas +LSDDS +AlexHill +politieman +STERGS +Radrieldor +Stela +TrippyScapee +Vasuki +Jsony +Theconn +Beersmack +JimmyValmer7 +skunkskillzz +kcmeatlover +swearwords69 +Sinixx +DoraSweetass +DorseHong +TomatoTom9 +Elemyra +R0n13L +MrAmazing +grizzy77 +Slewwyy +Josh2Godly +DrtyBusDr1vr +RTLadNumber4 +memephis +sorrymatey +Bearsarefrie +Dab_nScape +Zugs +LantadymeRey +XxRXZ60xX +iusedtosleep +Triplet +Forgived +wertyer2 +FeIII +Workahaulix +m4ttay +LvI3stak3 +elfje185 +Xelian +Bellum50 +Sharmac +Woedipoe +SpowSaus +HoarderMan +JuiBoi +willie432 +Dymass +Hypersomnia +WheresPurple +Hyperdeath20 +HatchetOG +Pulli +sk0me +Thoakline +Twizler74 +De stoutsten +Tachycardy +Snowvof +CarnifexVeil +altehnub +Ninja Cow Jr +hulken532 +Golembaby +yinghao870 +Im Tibbz +Snorlax9030 +Homealot +MageFish +Khaleeeesi +EpicReefer +Duplicated +WuTangflame +SequissuAnau +Bezbi +Joz6 +x iNtrigue +Sightlines +CynAcolyte +Naternater +2006nope +Insanityzz +The_Hillboy +Savilahti99 +ltsuki +Kikyo101 +Aylia +f1elder +fjw +YouOverThink +wizkid499 +Shivers888 +Trottero +jouv +Bonden +DalaiLlama +Taz762009 +Kasprzak1 +Shocka +Reductive +Armadyllo +IronOsiriss +DaBears +Drewbber +i420u +Homegrowe +Jrabbat +strnagetamer +Cherno-byl +Weszie +Freakxx +Coltrainz1 +Ashwin07 +Peeshuuu +Alicander +UIM Thor +Bonnaroovian +NunsRtight +00yungsung1 +SirBoma +NotAStreamer +Ibongtoke +Belsey +Asubu +beanieton +RvrseGiraffe +Tz-Ket-Kush +SlottedPig +JJRicky +killerline +SheepTrainer +GotABigDoing +lukek22 +FreeTeli2Lum +elli +WeedOverWax +xExclusive +Deakz +SimulatedYou +Bootlesape +G0LDENB0Y +Iron Peg +SpicyMemeGod +Geebster +Iron Beabs +Plank2G +Masin +Harriganrace +blobaman +PdaddyReborn +FfsImAfk +Keylock +BlazingSid +Moving20 +HAOKIMALONE +Suolane +xSecret +DwarfSailing +BongRat420 +YunnT +mr shroom +look1nAzz +DormiNdaExp +Involk +Hespori +Chxmpanzee +ShrekLovr +maupz +0netruememe +StankBreath +Spw +Collin892 +Essylle +larsnjun +iron_day54 +SoUhBtw +Gensha +Runeranta1 +Lordalbert0 +URAMESHl +brianknight7 +Touchmydig +NotSoHCZoro +b0btehcool +Stillblazing +Netjes +Newst0nekid +oClay +GotTheTool +Odsza +ascipulus +Young Tango +Paehkisfe +Avrahm +Zaxcord +Stolen Herbs +Intherial +Frankers +Bajcolado +BubbleOLuke +FilthyPixels +Darthodium +iioktb +ketchupfles +herkimer +Nikez +Baconpancake +Stryneguten2 +101evil101 +Jehdin +Gezang +Jeangaboudle +BigSpook +HashtagGOALS +Babafasa +Luuk420 +vSpectre +Powerdude153 +Bcgod +Zararod +Rj8532 +RavishUndead +Jaamm +Iron l2asta +NoAntiVenom +Calb_Potta +Connavar +MestreGlados +bouquetboy +Tri9py_J +YodasNo1Fan +ketawuss +Nelybynature +TomAce +MediocreTime +bofflepopper +ThisAintSkil +DeltaEpsilon +BornToTrade +Spengineer +Grimy H +Seenoevil +vbehn44 +Lucivert +TheRevRip +Kleatus +IronDubzy +Ketanator +DrMatthie +RustyFoot +Now +BuzzL1teBeer +Bisher +TylerOSRS +BorkingCorp +NewDad +vPikis +Korelivia +betonimuna +larvacorium +SiebScho +Green0ktober +E-Hubble +MyronAynes +DonkeySocks +redditlucio +Izvorul +er2002 +Viyrew +Iron Chombre +Nonreal +MyNameIsKent +Marleyy +ASuperDood +Fe Nail +Bunzosteele +DosKadenas +Knurrbauch +Oldizjr +SgtBuurman +Strix Tactic +Mierdapier +drickvatten +DeathByRC +FalscherHase +xSword +Pattyrick8 +Closeshots +vampiremiyo +Kiraga +Fe-ranator +IQUICA +StringsLogic +Fairex +theFish +Anthilll +Schlanged +Bervoets +ntarallucci +Argilla +mikefizzled +CaptainDredd +Oskinathor +seamondemon +0smasher0 +GhostHouse +9fj +ZALCANOPET +Urock16 +realpcooktho +Helson Ryse +NosferatuBoi +SirHines +Stealthweed +Champagnole +Jeththe +fenimore133 +Thyclops +Rider_99 +Jimbi +eazygps +runeika +Range4Free +disdudsauf +Slayer7515 +Polarus +fbah2 +Brandonx188 +level-103 +Lucifer_link +litheum +Ownd +Perrault +Manyi +Mercys +Xalrir +Jenessa +3rdAgeSlayer +Taffarell +CbarDaKing +xpwast3d +Zameul +71rc +PvMNotorious +Rangedly +JustRenne +Ramztad +T-Hugs +HADYYY +swed +beberfan69 +Sierzy +dtfmslogan +SlayForFame +Aluspalvelu +arexmeister +Dunadane +Crazystevee +Pr1MaL +Digironimo +bossy momma +byrny +Bigborncrazy +Barhoor +Gsef +Barbyte97 +Funny-King03 +gothorian +G3RM4N +Lemursnore +LawOfBirds +InsaneIee +clabby +kevpurp +IQT +Fernando-Frv +ClanChats +marshyymarsh +Mdzvwz +SogxNeutro +ElevatedSoul +Panda Godz +ChozenGod +Bellicus +ItsOleGreg +lady-yoshi78 +vippaa +Nuparu22 +da jiin +Obby Cam +Tempoctrl +bombycrahan +AMAWM +NLDeluXe +keekluulz +Nixi_NL +Billington +Scarves +Tomxi +Defence42 +archyiop +62steeplist +zclx +SquatNation +EzUnReal +Shanfew +Fireknight0 +Coolmintoreo +Aver4ge +Gnorc +carlwalter +Koekebakker +Camosaur +Onidhre +Flexatronic +KaiokenRyan +CLIIllIIllIT +Runboy25s +fan3to +skyz +Zachulous +BUILD PONYS +Bluntmore +Rubee +Warmly +SI4 +EasyTurbo +Najda +Tarki +falsehope +Claypops +Lyse +twitterclans +Moq +Thiccapedia +Hamis +Gameboylight +Rawssss +TorontoOVO +Thotalopolis +MrSirOne +KmartWorker +Nakuz0r +DropTopWizop +Bokeva +Miqote +KruimeIkoek +Onesecafk +Madrock01 +Wallerz +Sage Vegas +aezthetic1 +Eldonskii +Concentrates +Gunsmith95 +juicy jones +UNC0RN +RoyLay +Latanoprost +CostlyOne +Huugo35 +Cefiro +ekcivtec +KingZac +ObscureLogic +smChi +MangJoe +MR_MAITO +klojo103 +ThirdEye +Dimaa +xVektor +Imawizardm8 +Ice in Vodka +Tsjok +Jonezey3 +HydrosFather +Fuertote_17 +Parappa +Alcarnia +Toasterly +Meltok +Palad1um +HelloDottie +Bercuckle +dark hays +dark5pac3r +Tstiffy_15 +Nolzzz +Storybot +DonaledTrump +Darkskiller +StonedTTD +KempBush +Goosely +Lape +DjentleSoul +Harryalt +HuntnCoFTB +AFTW +BIGBADWILLY +cowpker4life +Alboy +Eljaaa +FiftyFive +Tztok-Met-Al +StingWisher +Ltman42 +bushkada +Burnstown +PullOutRange +RiKoCheP +Honru +Skachoo +Lonz +Terrorise +Grimnitro +Apportant +FuRiouSs +Sylveon700 +Giroza +WarSoc +MightyOrange +zazyga +Bayern_pvm1 +AverageDesk2 +Haydor +Cyuh +PvM Boganeer +Achievement +Bennny0_o +ElderRyu +Inhinyero +Radja333 +Odyssey310 +leechyGP +Cathays +Rmz +Panqueques +Feedback +travym66 +Lorttomies99 +Superjim111 +Exodusty +SanodersNL +JoeTheGod +Berrzerk +assoffire +Iguaani +Kakua +MonkeyHeadAF +AnonDoctore +Konnie +Abov +iyyghg +KingRustyVII +L4rry +IceSparro +LordNorden +Aayraz +OnDeaTHrow +styrkekram +S0lomon44 +Swingers +FreeFreeze +REZlN +Armchairs +pxls +Gozpot +UhhhBoneless +DOOMSlayer +krakodile +Etardoron +Uip +DiaThresh +CaptinA +Bufubu +DeTrixzz +Determind888 +Mackdizzle99 +Thick4Head +AHriMTaLeZ +HegXDXD +Bastermate +Its_Fonte +H3nti3 +Total Pede +JDBass +Peevy +Soccermom02 +2n8 +ZeroXJD +that1stoner +MetalGear +iVz +Smartyross +Confidentiel +Goodole +NlMBY +Skullking199 +Albuun +Qemi +Celiac +Mein lron +Bluewarthog +Azzaar +Gnomeputone +Sammjoey +saintffs +SteveSnow15 +HellsRavage2 +Asterlad +Pantaloon +alfhershey +RikSavage +jordlar +YoHighRoller +Shtankybruce +KaMi_RnG +WarOnOurMind +VeitiKKa +N0 H34RT +sitonmaface7 +xTrigger +teini_horo +Legened248 +Ikillu247 +MrWorldwidee +RunesCrafted +OK Thug +NapoleanBra +BR0CE +Kush420s +UsedApplePie +sploobie +Bachelour +Blue_speed +Symphonicx +Rakun Rakan +infragant +Daanncorr +Jmjake +Socrates001 +Madeweine +SprayM0re +Tr0gdor +Fe Qlimax +Iron Elyon +Donwcpot +Generol55 +ThyVonR +rubikslayer +Mike745638 +Garthoon +ejobs +BigDaddyT85 +ScaredOfAll +DoktorBarber +Socrates +Bebexx +BearByte +loveNfungus +Jayders +Rogue nr2 +IM Maccy +E4as +Verkyz +TacoWithGuac +Danol +Eva-O1 +Muppz +Sinner_Blue +Tebowowns +OhManOhJeez +jhy +KonosubaAqua +ALonelyTaco +LukeOS +Agressie +AhiPoke +ScreamSavor +Fire10910 +Molemountain +Strr +Pasiiba90 +Yesze +zeddicus676 +LeKinguin +Screeb +RedTwisted +PoachedLion +BATATUNGA +Ohseeya +OneTera +MrJTheIron +AardbeiSoep +Misty7632 +FigaroTheCat +Iron Seagz +Kizone +InfinityMan +Camperfish +Gooziky +Ismo54 +MrTibberfitz +IronLankzey +Ironboba9993 +AllusionTens +orkans +pyro255 +Stonedtime +EricPrydz +Osjuicey +LostOnThePCT +acuile +Lord Mjosh +Sunyikata +Helldog946 +PrintedCash +knani +Benqqu +130SS +Coo +BornTwoGrind +GonFeeshin +Blombo +akaExploit +Camhanaich +Sleepercell +Wojtas +EyeHaveToPoo +IronSpiderZ +TomMerrilin +AutoEmp +whispery +Pergert +pizzaforce33 +Tapirslayer6 +Karethaeis +Hillzy +TheIronVault +CR4ZYH34D +Claudiu +Kurohige-Jm +Dvsk +Wreckzu +MadxMonsta +lamepun3than +roldunogene +Pseudonimas +Crimsoncaim +HCmunchies +Ysdragos +Kluftritter +Iron Franchi +MrMose911 +Envx1 +830 +Laphloredos +SoloTibbs +Acemanjam +LakeMonYew +daedbent +plebminister +Rislearn +Tusc +Gytisr9 +Kage Boshi +BarryBanaan +richarb14 +IronOxideMan +cubezor99 +ImGodd +Muffinkyutie +6620 +RunFreek +Mezzalarry +U Ded Boi +IronBosse +Nommmy +JTM33 +WaveSkill +ILoveAstolfo +Wuzzi99 +Vueko +Talvedon +Disconnecct +Goat512 +Synn +Zurius +ForNostalgi +Erbyss +Disentombed +McStarley +large pox +Exonaut +RiskinPixelz +Duravillidad +GrandmasterT +I3ox +quazepam +Maween +ibbenbueren +SemiReliable +Chromadorr +Dohenus +Benmiester44 +Shortstop819 +Imidril +Dalkz +FuAiluue +Jdoggy2018 +Slick +Eliwood225 +Tink200345 +Kaimanll3kav +IFRC +ArtofKush +zensix +120u +Jungkook +Balarezo +Extrovert +XX3 +Mordy +Vodke +Zeug +TiramisuTart +Narvalow +Bubbz +ERJ145XR +AlwaysPoor +42O42O +MkLeo +FMGbrien +suhuan123 +Jezkoz +AnjaPija +Travis473 +0Giesel42O +Garrothis +Chromalox +Nolifepvm +yeahboi9992 +Wooz +PeytyPoo +magicmike117 +versacejean5 +Mokke-senpai +KiluaZoldyk +7pm +ARRIVISTEZ +6PaperJoint +badsadmac +Gavrot +Dualerz +Maybemnam +RSPSisBETTER +Blizzartd +Dolormight +alwrighty +Bakron +laks +Sneakymag3 +Buriial +DarkMerliin +Hilk +SootSpritez +chemistmike +voxi6 +4Kath +HOOLlGANS +SaintBurgs +fastsalmon34 +Gold M40A3 +S-525 +Dafney +PetPlease +Bubzs +Met +klampo +ButterSyrup +JustPertti +JakeSteFarm +Leo2 +3III +MrsJonesUFT +Y0Q +CallMeTipz +Santasos +JamesDaWizar +AeroxAces +Dylanm504 +Randeaux +VEGANDIET +Magepkmega69 +Weight +Coolxkidz +mooofy +gronoc +Magik773 +RWSDOUG +xSPAGHETTIx +Joshmaster31 +Drbeto11 +Farah +Shanee-oo +Wintage +callmeson +Masandalf +Stealthcy +Squaw +Dank Tigzy +AllRubyMoi +Vesley +Ebbitten +Ninfia +FireAnRescue +Tywonia +GoldieOne +NuclearShift +PapieLexus +zwah +Cyn2k +Hawkear +AlwayzSol +Arathir +GodSaidGrind +izmibence +SAWPREME +FlaccidWhip +QuirkyPurple +FuryJunky +vlyn +Ipod5412 +BBV +AreYouMyMumm +Ropemaker +Leecherboy +Exright +Koollpop +Gold-Ileana +drxfluffeeee +No53 +Hayesy +BigSikTv +IceNineKiIIs +1k_0 +bitten by +RumbleYT +Cyruscomrad +sharingbox +Rsn_Dillon +toqs1986 +KngBlkDrogon +BlazedRanarr +Epicurus4 +Ene +Ratlordmax +Heartquake +ImMaxy +sdfsd125 +Piscolaz +Wrekdum +Chaser959 +First_Viking +CarimsEygon +LabbattSplat +ITIaddy +Tryuumph +LooseLesley +Tully03 +BigMav0416 +chicknsoup3 +Klanks +nivk420 +TacticalFart +apenzoon +LP Smokie +Africagamer1 +MasonJarr +iJamPancake +Raiskausrapu +Victorp75 +Guadanha +Top Milk +Snatchquatch +Alharbi +Polaar +ringosting0 +Goby358 +Ryleegh +Seculish +Flowzyy +superj4 +Timbeettius +megoodpvmer +Snuift +Leavepigrun +Quti +big bojangle +wsodonnell76 +Slayer314 +Flawzin +NateDoge +4gottenvoid +patriciogmz +CH3 +5hayWh1te +Bluerope14 +Strikes +Gorathe +ChickenRings +Lloydyy +Alenac +gaypoika08 +gOWObs +devonjt1 +The Crogamer +MiniNinjo +Maury +Woolly +BillyRay +Saraziel +Nunac +I Am Vono +CrimsonCow +Israels +XCortezX +TheRsBug +EkkoThresh +Salista +Silavex +jamaz8 +Clunker +BeetchJeemmy +Denglish +AGRONOMlST +darkhex0 +JoJo79 +Jfleeze +Nerdcore +Cumsquatch +SmileyCyrus +DTown420 +H3NNESSEY +Boulli120 +I3ubbles +TommyGunn204 +Elit +fartass +33zero2 +Stephenns +finerunes7 +Conpetgrebe +jordymans +pigusvaistai +ThiccSkips +CheddLaurent +Chiksan +Johuab +IxHunt3rxI +Humblenobody +Nonsense +BOlNEXTDOOR +JLF +Fyresam +LetsGetSmity +Wreckin4Days +Villanovaguy +xXCaBiDeXx +Kevali +Slaqk +Kongklunk +Espada_Vx +CalmYourBits +toxicsaitama +Ellphie +4kV +Seighilde +HankoAJ +gabbe314 +BigMilkerz +TheEvlManRay +thiseku +Lastinis +Statykk +MusicalMurdR +99hh +Hildr +Nailed Hard +Kov0s +KiiDSKOLiO +Capt420 +Rushana +n00btube +Emad +Slemmy +DBKangaroo +Canadiehn +Endor +kingkong1211 +JoXuh +9yearoldpops +IncomingGank +Grimmauld +thes5016 +lJoynerl +Shot1200 +HappyPandaXD +Unprofitable +Gluehbirne +Ruhtrik +iScream03 +WhereAreWe +LottaPotAgo +Lionhrt +UnholyAbyss +Zamorizzle +Decerate +FaBeSCa +Savpryan +Flyhll +illotex +PigDOG 669 +AH Energy +FeelslronMan +FittyBuck +WarmLoaf +PvM_Nugg +tommybun +AstroYogurt +HeroicDesire +Finaltank +Actaeor +Muilpeer +PogChampagne +Lkoi +MrSusans +ItsHosef +Term +Infase +Kenleyy_TM +Jebroni +Herbogus +Rizzhole +StrollerBaby +8v +logger2222 +IAMBillNye +oerinn +Beelzebubby5 +Zw3d +Lildirt +bigl +Alexbrock +HeisenBergW +VB24PK +Juqqernaut +FROO00OO0ZEN +Kenyann +BeforeDeth +Artillion1 +AslanMaximus +JustBob +Nivex +Cliphanger1 +Woozie400 +Hookr +Onya +Zatch175 +Narx4 +ukwolf1 +lunamelina +seppevb +Darkfanime +RunNhideZom +Timespacing +Stevo29 +Os SMDJ +MikeMontana +g0d slayer19 +grindin2bond +Akomatic +xSillyCybinx +MajQ +Aeganor +Yerrrrey +Marleth +kuro 275 +Oder +S0ldern +KingJelore +mustypill0w +Iron Request +Mineraal +Saty +CHULIGAN911 +Vud +MrPige0nz +Hoptilicus +Soloyo +Sh4dowfox +kylehwog +PvmQ +TheTerug +Abool +Neekomata +Roy385 +Wormeater66 +lilliilillil +Iron Laplace +0verdrinking +Zwwwnbeast +Sazme +Betta1009 +Ironman Jowe +IM_Queeffing +K9lenny +Wrigzer +Migalos +XeroBone +dragneel132 +Yerico Tsu +xTerpenes +Dusansss +RehlapzZ +TrollinPony +bottypedpsw +cDive +Noizex +Devstated +Charltonb +N0rse_k1ng +warcauser33 +dragonizer11 +asedviss +Shogaol +Averex +UknowPotter +Radini +FreedomUP +B00SY +Strav +Uberamazing +Rny +Calipso +bigblade28 +imCodehh +femiketyson +Achernar +Sim Aero +Teyrill +Hajj12 +Glazmeister +Tupla Olut +Frodoinc1 +deadmeadow +Gergery +MFSTEVE +TURM0IL22 +Tunaking420 +Fomble +oClairebearo +Bigred8616 +Turtle7 +Ryoma +DeadlyBatz +Zavorak +Emithyst +excitedz +MrBryne +Procedures +Herbacist +Thepiefour +ChoppinWork +NoBans +Painta +Dioxis6 +Trivit +Micromelo1 \ No newline at end of file diff --git a/Server/data/botdata/getnames.sh b/Server/data/botdata/getnames.sh new file mode 100755 index 000000000..cce1c43da --- /dev/null +++ b/Server/data/botdata/getnames.sh @@ -0,0 +1,4 @@ +for i in {6000..6500} +do + wget -O- "https://secure.runescape.com/m=hiscore_oldschool/overall.ws?table=0&page=$i" | grep user1= | sed 's/^.*user1=//'| sed 's/".*$//' | grep -v "Binary" >> botnames.txt +done diff --git a/Server/data/botdata/namesandarmor.txt b/Server/data/botdata/namesandarmor.txt new file mode 100644 index 000000000..1759f1600 --- /dev/null +++ b/Server/data/botdata/namesandarmor.txt @@ -0,0 +1,335 @@ +XMR BTC ETH:7:0:0:0:841:0:0:0:0:0:0:1061:0: +SpinnerYOU:8:0:0:0:1277:0:1171:0:0:0:0:0:0: +im-rahha:58:0:0:0:0:0:0:0:0:0:0:0:0: +newvicn:20:0:0:0:0:0:0:0:0:0:0:0:0: +KnocktdafOut:101:0:0:0:0:0:0:0:0:0:0:0:0: +Powndrake196:3:0:0:0:0:0:0:0:0:0:0:0:0: +muppemxx:3:1038:0:0:0:0:0:0:0:0:0:0:0: +GGraft:32:1949:4335:1725:1329:546:20166:0:548:0:2922:1061:0: +OdymX:3:0:0:0:1293:1101:1175:0:1067:0:1063:0:0: +jesusj17:48:0:4391:0:843:0:0:0:0:0:2932:1061:0: +Raningblast3:3:0:0:0:1351:0:0:0:0:0:0:0:0: +65fatknife:3:0:0:0:0:0:0:0:0:0:0:0:0: +NeobilkDark:23:0:0:0:1203:0:1173:0:0:0:0:0:0: +TROXZ144POXZ:56:1161:0:1009:1301:1123:1197:0:1073:0:0:0:0: +xXMakiaXx:80:0:0:0:1381:0:0:0:1033:0:0:0:0: +Molebats1209:3:0:0:0:0:0:0:0:0:0:0:0:0: +64 Wise 1978:3:0:0:0:0:0:0:0:0:0:0:0:0: +Clue Mimic:3:0:3781:0:0:0:0:0:0:0:2922:2914:0: +claymus14:30:1157:0:0:1329:1115:1193:0:1069:0:0:0:0: +xAlexGGotYaX:10:1949:0:0:1277:0:1171:0:0:0:0:0:0: +Morerule1367:3:0:0:0:0:0:0:0:0:0:0:0:0: +77shiny1198:3:0:0:0:0:0:0:0:0:0:0:0:0: +YaelColins:40:0:0:552:9703:0:9704:0:0:0:0:0:0: +casacoima10:12:0:0:0:1277:0:1171:0:0:0:0:0:0: +MenMaster:20:0:0:0:1205:0:0:0:0:0:0:0:0: +M0L1NTR0N3:44:1949:0:1725:1357:1005:9704:0:1095:0:0:1061:0: +fdsfwrfW2E:40:0:0:0:1277:0:1171:0:0:0:0:0:0: +Lewt Bags:58:1155:4351:21149:1387:1117:1189:0:1075:0:1065:4119:0: +bierfietsss:72:1163:1019:1731:1333:1127:1201:0:1079:0:1059:9005:0: +TaDeDeBeShPa:3:0:0:0:0:0:0:0:0:0:0:0:0: +Soonride2043:3:0:0:0:0:0:0:0:0:0:0:0:0: +KolSinRa6944:3:0:0:0:0:0:0:0:0:0:0:0:0: +BoCaRefVaCyI:3:0:0:0:0:0:0:0:0:0:0:0:0: +Gerloc55:43:0:0:0:1387:0:13660:0:0:0:0:9006:0: +ChMaIvCrJanL:3:0:0:0:0:0:0:0:0:0:0:0:0: +Happier Dog:44:7136:20214:10366:1387:1844:0:0:1845:0:11858:1846:0: +emachorrr:3:0:0:0:1277:0:0:0:0:0:0:0:0: +MIDNIGHTHOUR:63:1042:0:1710:10156:6322:4156:0:1099:0:11120:0:0: +LilOmni:6:0:0:0:0:0:0:0:0:0:0:1061:0: +wef6qwe4r561:3:0:0:0:0:0:0:0:0:0:0:0:0: +Sister 13:3:12600:9793:0:20590:6186:24325:0:13288:0:0:23285:0: +IsidraJr:58:0:0:0:0:0:0:0:0:0:0:0:0: +BeDeMaSa0891:3:0:0:0:0:0:0:0:0:0:0:0:0: +JustSkillezZ:50:1017:0:0:1387:426:0:0:428:0:0:0:0: +Elcangri11:39:1017:1007:1727:1381:1035:1199:0:1033:0:1059:1061:0: +haroldas 99r:13:1017:1019:1731:843:0:0:0:1015:0:1059:1061:0: +Day Dreamer2:47:1145:0:1727:1355:1123:7352:0:1091:0:0:0:0: +venepower:67:1017:0:1731:1381:577:0:0:1033:0:1059:0:0: +GOOL19207:59:1163:0:0:1333:1123:1201:0:1079:0:0:0:0: +T A L 3 N T:67:10452:12197:6585:11785:544:12610:0:2497:0:11133:12598:0: +xz Team:30:579:4371:0:1387:577:0:0:1033:0:21816:626:0: +lWontEverDie:96:0:0:0:853:7370:0:0:1099:0:0:0:0: +WooJ:122:2986:9808:1704:3053:13106:0:0:0:0:11140:13131:0: +Zaliukas19:7:1153:1031:1478:1323:1115:1175:0:1067:0:0:0:0: +Marian Nasir:3:0:0:0:0:0:0:0:0:0:0:0:0: +laitukas29:3:0:0:0:0:0:0:0:0:0:0:0:0: +AFRODITA-23:38:0:0:0:0:0:0:0:0:0:0:0:0: +Monrojas:50:0:1029:1725:1381:0:0:0:1099:0:1065:1061:0: +stejler:114:21266:6570:19553:4151:21301:12954:0:21304:0:7462:11840:0: +Loamjytuner:3:0:0:0:0:0:0:0:0:0:0:0:0: +u smoke mid:92:12293:10499:10364:1387:1121:1197:0:1071:0:1065:11840:0: +MIMIYEEET:64:0:10499:0:861:0:0:0:0:0:0:0:0: +hamnndoza:3:1153:0:0:11709:1115:1191:0:1067:0:1063:1061:0: +4virgin:112:0:0:0:1275:0:0:0:0:0:0:0:0: +LSASORI-666:60:579:0:1731:1387:577:0:0:1011:0:0:1061:0: +12evil2175:4:0:0:0:0:0:0:0:0:0:0:0:0: +Rushkaril208:71:1153:0:1478:1331:1119:1191:0:1067:0:7595:0:0: +sneksk13:49:0:0:0:0:0:0:0:0:0:0:0:0: +M i m e s:53:0:0:0:1387:3058:0:0:3059:0:0:3061:0: +llego crispy:54:9925:0:22692:853:1123:0:0:1073:0:9922:24313:0: +dami420:71:3486:20214:1731:12389:3481:3488:0:3483:0:23261:1061:0: +Vjx:59:12455:1019:10366:1387:12451:13660:0:12447:0:2912:1061:0: +jonko_08:39:1161:0:1731:1387:1123:1197:0:1073:0:1063:1061:0: +Oliverg1995:36:6188:4351:0:837:6654:0:0:0:0:2922:0:0: +TErko SKs:20:1017:0:0:1383:0:1173:0:0:0:0:0:0: +e t h x n:67:0:0:0:1387:6654:0:0:6181:0:7595:9005:0: +Beretsand522:85:5554:0:1710:21646:5553:0:0:5555:0:5556:5557:0: +ApS Squirrel:55:1163:4325:1731:1333:1113:1201:0:1079:0:2942:1061:0: +Acazandra:60:579:4407:1727:1387:577:0:0:1011:0:24311:1061:0: +BybisTasei:112:1169:1027:1731:1387:1135:24325:0:1099:0:1065:1061:0: +WelshPro2:47:1053:0:1725:1333:544:0:0:542:0:0:1061:0: +ElwinLeong:46:1044:0:1654:851:7364:0:0:1099:0:1065:7596:0: +Squaawk:99:0:6568:0:0:0:0:0:0:0:11126:0:0: +Bread1991:4:1155:0:0:1293:1117:1171:0:1075:0:0:0:0: +Tzaska:112:1949:9781:0:6562:11854:22322:0:11856:0:11858:11860:0: +honkah0nka:120:0:0:0:1359:0:0:0:0:0:0:0:0: +VitsEco:64:7394:23300:1731:1387:7390:13660:0:7378:0:1065:23291:0: +Emer Jhon 19:62:0:0:0:1381:1035:0:0:1033:0:0:0:0: +Roberthx:55:1163:0:1725:1333:1113:1201:0:1079:0:0:0:0: +Nikitakitz:33:12283:4371:1478:1285:12277:12281:0:12285:0:11079:3061:0: +DNoancy76:3:0:0:0:0:0:0:0:0:0:0:0:0: +black chinin:34:0:0:0:0:0:0:0:0:0:0:0:0: +NO0MEERCYY:106:0:0:0:0:0:0:0:0:0:0:0:0: +Kekava:89:11862:1019:7803:1327:1125:1195:0:1077:0:0:3061:0: +Finis34:76:24305:23410:10364:1387:24307:24325:0:24309:0:24311:24313:0: +SSSniperWolf:53:23101:23099:0:11709:23369:2589:0:23095:0:23091:23093:0: +HazeyJ:49:0:0:21314:11707:0:0:0:0:0:0:4121:0: +dontbrkrules:45:0:0:0:1387:0:0:0:0:0:0:0:0: +s46gs4g6s5dg:3:0:0:0:0:0:0:0:0:0:0:0:0: +PuRe_ReVs97:39:1169:0:1704:8880:1129:0:0:1099:0:2487:0:0: +DrakenHamer:108:0:0:0:1381:1035:0:0:1033:0:0:0:0: +VoHoTi816863:3:0:0:0:0:0:0:0:0:0:0:0:0: +H 2 P:63:1053:13679:21314:1387:22695:24325:0:13288:0:0:13286:0: +Leviathan Sr:3:0:1007:0:13328:6654:0:0:6655:0:0:0:0: +Chuka Ryori:102:0:0:0:1387:0:0:0:0:0:0:0:0: +5g4sg4sg4sg:3:0:0:0:0:0:0:0:0:0:0:0:0: +Elroyfct19:8:1949:0:0:0:0:1173:0:0:0:0:0:0: +PureEffectQ:37:1161:1019:1725:1331:1123:1540:0:1073:0:1059:1061:0: +rowcharger2:58:2613:0:0:1387:2607:2611:0:3475:0:1065:0:0: +Redrani1:33:1038:0:0:0:0:0:0:0:0:0:0:0: +ottn ook eem:76:12639:9757:0:4934:13104:0:0:6185:0:0:6666:0: +UzairScape:52:0:0:0:1387:0:0:0:0:0:0:0:0: +Ultiwarriors:65:1169:4379:1731:853:1135:0:0:1099:0:1065:9006:0: +kilaSTR:21:579:4345:1725:1329:577:0:0:1081:0:0:1061:0: +homeboijones:22:0:0:0:0:0:0:0:0:0:0:0:0: +Jcc1992:9:1157:0:0:1353:1119:1193:0:1069:0:2922:0:0: +Rsk venom:69:24288:0:12002:12000:24291:6889:0:24294:0:6922:6920:0: +Paptor986:68:1949:1027:1731:1333:1113:0:0:1079:0:2902:1061:0: +BigDuncan69:42:1161:1031:1478:1333:1123:1199:0:1073:0:2922:9006:0: +Gril:34:579:0:1727:1381:581:0:0:542:0:0:0:0: +54 27:69:1163:4351:1725:1385:1113:1201:0:1079:0:1065:1061:0: +treghar:3:0:0:0:0:0:0:0:0:0:0:0:0: +TreeWise Ben:59:1017:0:1727:1387:546:0:0:548:0:0:0:0: +ladiabla6666:59:0:0:0:0:0:0:0:0:0:0:0:0: +Joekeltje05:42:1055:4399:1727:1381:1035:0:0:1033:0:0:1061:0: +Cykelpump94:68:0:0:0:1381:1035:0:0:1033:0:0:0:0: +ToP WinG:61:0:0:11113:9185:0:0:0:0:0:0:0:0: +Smigol89:75:12504:10499:1704:9185:2503:1540:0:2497:0:2491:6328:0: +6d54fd4d5:3:0:0:0:0:0:0:0:0:0:0:0:0: +JaDeLashKriT:3:0:0:0:0:0:0:0:0:0:0:0:0: +Devskii:64:1169:9783:1731:853:1129:0:0:1099:0:1065:1061:0: +AliArcher22:107:1163:4371:1725:1333:1127:1201:0:1079:0:1065:1061:0: +Y0URN0TREADY:21:11847:0:10364:667:23097:13660:0:9923:0:23091:9921:0: +Kepler16b:15:1153:0:552:1267:1115:1191:0:6181:0:1059:0:0: +JamitusDeath:63:1163:1019:0:1333:1127:1201:0:1079:0:2902:1061:0: +blib vbob:3:0:0:0:0:0:0:0:0:0:0:0:0: +FighterMan3D:3:0:0:0:1265:0:1173:0:0:0:0:0:0: +dustyturnip:54:1163:0:1478:1333:2599:1201:0:1079:0:0:9006:0: +Cucilo:63:0:0:0:0:0:0:0:0:0:0:0:0: +BrrrrCold:53:2657:1007:1731:1333:2653:2659:0:3478:0:2912:9006:0: +Nv-BlackMind:88:24315:24207:0:1271:24317:0:0:24319:0:24321:24323:0: +kjuse:71:1038:0:1731:0:9924:0:0:9923:0:9922:1837:0: +Archie b:73:12453:6568:10364:1381:7390:2621:0:7386:0:2912:11840:0: +lamarcelazaz:112:0:0:0:0:0:0:0:0:0:0:0:0: +Soni Evil:3:0:0:0:1351:0:0:0:0:0:0:0:0: +Ubertas:91:0:4323:1727:1387:0:0:0:0:0:0:3061:0: +bholehairz:24:579:4365:1727:1381:577:0:0:1011:0:2932:1061:0: +I P0p ZanZ:41:579:0:1727:1387:0:0:0:0:0:0:0:0: +mr 7ranks:94:0:0:0:0:0:0:0:0:0:0:0:0: +weedmam44:89:0:0:0:0:0:0:0:0:0:0:0:0: +Bort Goth:54:1042:4387:1478:23330:23215:7348:0:2617:0:1059:9005:0: +godkin94:43:12231:4407:1662:1387:12225:12233:0:12227:0:2922:1061:0: +zznjujkuiy:3:0:0:0:0:0:0:0:0:0:0:0:0: +Snakenaldo:30:1155:0:1731:1359:1117:1173:0:1075:0:1059:1061:0: +Osmar-Rvn:75:12455:23297:10364:1387:12451:24325:0:12447:0:0:9921:0: +J U Q:3:11850:11852:1708:10010:11854:0:0:11856:0:10075:11860:0: +batrinhos:45:6182:4349:1478:1387:6654:0:0:7380:0:1065:9005:0: +d5fd45fdfd43:3:0:0:0:0:0:0:0:0:0:0:0:0: +mhxomklo:64:12013:0:0:1275:12014:0:0:12015:0:21345:12016:0: +Jaxaloth:42:1153:0:10364:1331:1115:1191:0:1081:0:0:0:0: +DuctileMarro:5:0:0:552:1277:0:1171:0:0:0:0:0:0: +FirmGrandma:124:22326:6570:19553:22978:22327:22322:0:22328:0:22981:7159:0: +Andr3ws:51:0:0:0:0:0:0:0:0:0:2902:7596:0: +Motel IlIIlI:54:0:0:0:0:0:0:0:0:0:0:0:0: +Its yeboii:98:12434:19697:19720:1387:19958:3842:0:19964:0:4105:23285:0: +TheOverdraft:118:0:0:0:0:0:0:0:0:0:0:0:0: +jbl092191:85:2665:4357:0:0:2661:2667:0:2663:0:6720:6328:0: +NewSummerVI:79:12600:23300:10366:23279:20199:13660:0:2593:0:23091:12891:0: +hambargaman:80:1040:0:0:1387:9924:0:0:9923:0:0:9921:0: +Ivyone42:35:0:13679:0:0:0:13660:0:0:0:0:0:0: +grumpy troll:116:0:0:0:0:0:0:0:0:0:0:0:0: +xRektify:93:0:0:11107:6739:0:0:0:0:0:0:0:0: +bramboom:5:0:4407:0:1351:0:0:0:0:0:0:0:0: +wrap a joint:94:2627:9795:1725:1333:1113:0:0:1079:0:2491:11840:0: +leegon1:85:0:0:0:0:0:0:0:0:0:0:0:0: +koekeroekoe1:94:21298:6568:11128:0:21301:12954:0:21304:0:11122:11840:0: +maryamgee123:10:1153:1019:0:1381:0:1191:0:0:0:0:0:0: +zazuke2019:53:22689:13679:22692:853:22695:0:0:1099:0:0:22701:0: +Mrmeanbow:97:1163:23297:1725:1333:1127:1201:0:1079:0:0:0:0: +MagicBunny01:47:1949:0:0:0:1757:0:0:0:0:0:0:0: +el frinchy:49:0:0:0:0:0:0:0:0:0:0:0:0: +Ninja1901:50:6188:13679:0:1387:0:0:0:0:0:0:0:0: +Dilk Mud:81:12241:6570:1725:1333:12235:1191:0:1067:0:0:0:0: +zELGLw:5:0:0:0:1277:0:1171:0:0:0:0:0:0: +DeMeLo139067:3:0:0:0:0:0:0:0:0:0:0:0:0: +Sun Rocks:49:2613:0:0:1381:1035:1201:0:1033:0:0:0:0: +Black Arkan:42:2605:0:0:1331:2599:2603:0:12279:0:1063:1061:0: +xxrreexxrex:3:0:4365:0:0:0:0:0:0:0:0:0:0: +Kingdavid370:16:0:0:0:1349:0:0:0:0:0:0:0:0: +OTEguQ:5:0:0:0:1205:0:1171:0:0:0:0:1061:0: +OnlYMrSmItH:3:12845:0:22692:1419:6184:0:0:6185:0:13287:13286:0: +DinkelBrot:14:1048:13679:0:0:20184:13660:0:20187:0:3060:1837:0: +Voidsux:98:0:0:0:1359:544:0:0:542:0:0:0:0: +worchafts:3:0:0:1654:0:0:0:0:0:0:0:0:0: +1k sand crab:79:1038:23297:0:10010:1035:12335:0:1033:0:0:11840:0: +Gopherslane:101:0:0:0:0:0:0:0:0:0:0:0:0: +Firehit2:28:1165:1019:0:1329:1125:1195:0:0:0:0:1061:0: +BeanSw3de:71:2595:4335:0:1387:2591:2597:0:2593:0:24311:3061:0: +rarebreed28:42:579:0:0:1387:577:0:0:1033:0:0:0:0: +Mullac255:50:0:1019:1731:1381:6184:1540:0:6185:0:1059:1061:0: +680m:110:0:0:0:0:0:0:0:0:0:0:0:0: +Niffou:7:1153:0:0:1323:1115:1191:0:1067:0:0:0:0: +AlessandlawD:4:0:0:0:0:0:0:0:0:0:0:0:0: +chandelaaaa:52:0:0:0:1275:0:0:0:0:0:1580:0:0: +kevkeassel:8:1153:1007:1478:1323:1115:1191:0:1067:0:1059:1061:0: +RockMauler:57:0:0:0:0:0:0:0:0:0:0:0:0: +Apothus14:43:0:0:0:1387:0:0:0:0:0:0:0:0: +lilibthx3:3:0:0:0:0:0:0:0:0:0:0:0:0: +Choc Luvr:48:1949:0:0:1333:0:0:0:13288:0:1059:1061:0: +ALXNDR B:60:0:0:0:0:0:0:0:0:0:0:0:0: +crisalida1:29:0:0:0:1351:0:0:0:0:0:0:0:0: +doynana:25:1157:0:1718:2402:1129:1177:0:1095:0:1063:1061:0: +homer_1993:64:1163:4365:1731:853:1113:0:0:1099:0:1065:1061:0: +Kos Emak lol:80:1163:4367:1725:853:1135:0:0:1079:0:1065:24313:0: +chinowaggon:42:1153:0:1725:853:1101:0:0:1099:0:1065:0:0: +Raised Wood:40:1159:0:0:1333:1121:1197:0:1071:0:0:0:0: +PalavaMaa:3:21859:13679:22692:22684:0:13660:0:0:0:13287:13286:0: +adroit4559:3:0:0:0:0:0:0:0:0:0:0:0:0: +SensaiKush:85:10828:6568:6585:0:0:0:0:0:0:0:11840:0: +Neba Brat:70:0:0:0:0:0:0:0:0:0:0:0:0: +Zartharias:55:1165:0:0:1333:1125:1195:0:1077:0:0:0:0: +lioooooooooo:38:0:0:0:0:0:0:0:0:0:0:0:0: +Julle2900:54:0:0:0:0:0:0:0:0:0:0:0:0: +ItsSpectrum:92:0:0:0:0:0:0:0:0:0:0:0:0: +Pinkjoe_369:68:6182:0:0:1275:6180:0:0:6181:0:0:0:0: +iD3CAP1TATE:86:1050:0:1731:0:0:0:0:0:0:1065:23285:0: +0wnbyme0:80:2665:4355:0:1387:2661:2667:0:2663:0:1065:9005:0: +whodis1:11:1153:4351:1725:1325:1115:1191:0:1067:0:0:1061:0: +V-Caracas:75:0:0:0:1211:0:0:0:0:0:0:0:0: +Jackawoo:24:1153:1019:1009:1323:1101:1191:0:1081:0:1059:0:0: +yorwys:76:0:0:0:1357:0:0:0:2617:0:0:0:0: +ashwoog:8:0:0:0:0:0:0:0:0:0:0:0:0: +Belly111:57:1169:0:1725:1373:1129:0:0:1099:0:1065:1061:0: +rolexeshh:54:0:0:0:1381:0:0:0:0:0:0:0:0: +Flamingasz:39:1040:23297:1660:1273:0:0:0:0:0:0:0:0: +TooFreeBoy:38:1159:0:1725:1329:1121:1197:0:1071:0:7595:1061:0: +el capibara:64:0:1019:0:0:0:0:0:0:0:0:0:0: +maName1999:43:1169:0:1725:853:1115:0:0:1099:0:1065:0:0: +noobmager69:13:579:4397:1727:1381:577:0:0:1011:0:1063:1061:0: +Greg lad:53:1153:4315:1725:1373:1115:1191:0:1081:0:0:1061:0: +420 McWaffle:42:1169:4339:0:853:1129:0:0:1099:0:1065:0:0: +SwappingSpit:56:1053:4351:1725:853:1101:0:0:1099:0:1065:1061:0: +og Swervinn:74:0:0:0:0:0:0:0:0:0:0:0:0: +yurmari:41:0:0:0:1351:0:13660:0:0:0:0:0:0: +mrintensely8:120:0:0:0:0:0:0:0:0:0:0:0:0: +65s4gs6g:3:0:0:0:0:0:0:0:0:0:0:0:0: +Yippi kaye:32:5533:0:0:0:0:13660:0:0:0:0:0:0: +E D U A R DO:58:5533:0:552:1381:23404:0:0:1099:0:0:0:0: +RichBichLily:57:0:0:1710:20590:0:0:0:0:0:0:0:0: +ee PILLERI:94:0:0:0:0:0:0:0:0:0:0:0:0: +el tor001:84:0:0:1712:1381:0:0:0:0:0:0:0:0: +Ill have tht:49:6188:4325:1725:20155:1129:0:0:1099:0:1065:1061:0: +Li-Fan Wei:61:2665:1023:1731:853:2661:0:0:3479:0:1065:0:0: +CrsipDaddy69:62:1163:0:1731:1333:1127:1201:0:1079:0:1065:0:0: +50 Crow 2195:4:0:0:0:1351:0:0:0:0:0:0:0:0: +Nonce No:42:24315:13679:1725:853:24317:0:0:1099:0:1065:24323:0: +c6z0urhtkxou:3:0:0:0:0:0:0:0:0:0:0:0:0: +capulina 12:71:0:0:0:1359:0:0:0:0:0:0:0:0: +atti zuen:27:579:1019:1727:1387:577:0:0:0:0:0:0:0: +Wildmake:25:1153:1019:1725:1331:1101:1191:0:1067:0:0:1061:0: +iGod Butcher:69:2627:1027:1731:1333:1127:2629:0:2625:0:0:22701:0: +imma warlock:25:1153:0:0:1381:1115:1191:0:1067:0:1063:1061:0: +Kingviking11:50:1169:1021:1725:853:1115:0:0:1099:0:1065:1061:0: +Hookhda1995:51:1153:4365:1725:1333:1115:0:0:1067:0:0:1061:0: +OptusWIFI:27:0:4409:1727:1381:1035:0:0:1033:0:0:1061:0: +No Chance G:58:0:0:1725:853:1101:0:0:1099:0:1065:1061:0: +19F10V7XUA3L:3:0:0:0:0:0:0:0:0:0:0:0:0: +Karamjanda23:50:1169:4393:1731:853:1109:0:0:1099:0:1065:1061:0: +Duskthrow39:34:1017:4405:1478:853:1035:0:0:1099:0:0:1061:0: +skitzatics:36:0:0:1725:1331:0:0:0:1099:0:1065:0:0: +Vi Vinner:59:1153:1027:1725:853:1115:0:0:1099:0:1065:1061:0: +666 sauce:56:0:3789:10364:1333:0:0:0:0:0:1065:6666:0: +Purple Sclm:54:1169:24207:1725:853:1101:0:0:1099:0:1065:1061:0: +69leo:55:1163:1027:1478:1303:23392:1201:0:1079:0:0:0:0: +125i:77:1163:4345:1725:1333:1127:1201:0:1079:0:1065:1061:0: +Shady_4720:29:1017:4345:1727:1381:544:0:0:542:0:0:1061:0: +gotitondeck:30:1169:1019:1725:853:1129:0:0:1097:0:2912:1061:0: +Crispy chips:78:1163:1027:1731:853:1113:0:0:1099:0:1065:24313:0: +PlzRisk More:45:12518:4389:1725:853:1101:0:0:7378:0:1065:1837:0: +P K Bash Man:56:1169:0:1725:853:1129:0:0:1099:0:1065:1061:0: +Kieran2809:18:0:0:0:1355:0:0:0:0:0:0:1061:0: +Yes I m New:79:2665:1019:1731:1333:2661:2667:0:2663:0:1065:9006:0: +HMAY4QQ37YGB:3:0:0:0:0:0:0:0:0:0:0:0:0: +Soul Dig 934:50:1153:0:0:1323:1115:1191:0:1067:0:1059:1061:0: +Mr Medicated:63:1157:1027:1725:853:1119:0:0:1099:0:1065:1061:0: +Troll2k:4:1153:0:0:1277:1129:1171:0:0:0:0:1061:0: +Protect Hope:62:2665:1027:10364:853:2669:0:0:2655:0:2489:11840:0: +ITS ME KDP:14:0:0:1731:0:0:0:0:0:0:1063:1061:0: +anastasiaemp:28:1153:0:0:1277:1103:1173:0:1087:0:0:0:0: +Aka Flying:45:5527:4367:1725:853:0:0:0:0:0:1065:6666:0: +llSlayerlI:47:1169:4385:1725:853:1129:0:0:1099:0:1065:1061:0: +jO9hurley:61:1163:1021:1725:1333:1113:1201:0:1079:0:2912:1061:0: +lilaf:43:1169:0:1725:1319:1129:0:0:1099:0:1065:0:0: +Logamconner:3:0:0:0:0:0:0:0:0:0:0:0:0: +dunnbros1:64:1169:4383:1725:853:1129:0:0:1099:0:1065:1061:0: +345458472110:101:1169:4407:1725:853:1133:0:0:1099:0:1065:1061:0: +Blonkalex23:61:1163:0:1725:1333:1127:1201:0:1079:0:0:1061:0: +0hide0cry:67:0:0:1731:853:1129:0:0:1097:0:1063:0:0: +Magemac99:27:579:4365:0:1387:577:1177:0:1011:0:0:0:0: +Alcap0ny:54:1153:0:0:0:1105:0:0:1067:0:2932:1061:0: +WISDJGJJ5CK4:3:0:0:0:0:0:0:0:0:0:0:0:0: +Confiteor:81:0:0:0:853:0:0:0:0:0:0:0:0: +x Obey the:68:579:0:1727:1333:577:0:0:542:0:0:0:0: +sicriona:103:1163:1023:1725:1333:1127:1201:0:1079:0:2922:1061:0: +Deleo Hostem:74:2619:9753:1731:23334:2661:2659:0:2663:0:1065:2914:0: +K E N N O:89:10294:0:1731:1333:7372:0:0:1093:0:1065:1061:0: +T3CHe:47:579:0:1731:1333:577:0:0:1099:0:1063:0:0: +Kaiju_X:72:1169:0:1731:853:544:0:0:1099:0:1065:0:0: +Junior_steez:68:0:0:1725:1333:544:0:0:542:0:2912:1061:0: +BllI1C:52:1169:0:1725:853:1129:0:0:1099:0:1065:1061:0: +Husky Fellow:53:6335:20217:1725:853:1129:0:0:7380:0:1065:23288:0: +w33d pk u:73:1169:4373:1725:853:1135:0:0:1099:0:1065:1061:0: +Gl Im Ninat:55:1169:4333:1725:853:0:0:0:1099:0:1065:1061:0: +12iownu:56:579:0:1725:1333:577:0:0:1099:0:1065:0:0: +TernoWildust:87:0:0:1731:1381:577:0:0:542:0:1065:0:0: +xongbax:57:1169:4347:1725:853:1129:0:0:1099:0:1065:1061:0: +G0DS Of Edge:76:2673:1027:1731:1333:2669:2675:0:2671:0:1065:1061:0: +Slashz:46:1169:4351:0:853:1129:0:0:1099:0:1065:0:0: +MicKy242:66:579:1021:0:1333:1121:1197:0:1085:0:1059:1061:0: +God trust:70:0:0:1725:1333:544:0:0:1099:0:1065:0:0: +Nodak Josh:69:12283:13679:1731:853:7362:0:0:7378:0:1065:1061:0: +ryuga attak:66:1163:0:1725:1333:1113:1201:0:1079:0:0:1061:0: +OldeEnglish:74:1163:0:1731:1333:1127:0:0:1079:0:0:0:0: +Vettige Sam:28:6656:0:1654:0:6654:0:0:6655:0:2902:0:0: +sitdown:61:1169:0:1704:868:1129:0:0:2497:0:2491:1837:0: +Zamppaliin:57:0:0:0:0:0:0:0:0:0:0:0:0: +kuchar23:94:1163:1019:1725:853:1135:0:0:1079:0:1065:1061:0: +Tyuio594:69:0:0:0:0:0:0:0:0:0:0:0:0: +oZeZo:90:0:0:0:1359:0:0:0:0:0:0:0:0: +Mrmagicmatt:50:1153:4377:1725:1333:1115:0:0:1067:0:1059:1061:0: +iism0ke:51:1169:4325:1725:853:1129:0:0:1099:0:1065:626:0: +Dzestiz:3:5533:0:21314:20779:0:24325:0:3059:0:3060:3061:0: +Justiniksass:3:0:0:0:0:0:0:0:0:0:0:0:0: +rag 1:66:2619:23410:1731:853:2661:0:0:2663:0:1065:23285:0: + diff --git a/Server/data/botdata/namesandarmorscript b/Server/data/botdata/namesandarmorscript new file mode 100644 index 000000000..25b000097 --- /dev/null +++ b/Server/data/botdata/namesandarmorscript @@ -0,0 +1,78 @@ +/* + +This script is run with OSBot. Created by Red Bracket. + +namesandarmor.txt has the following format: +name:cblevel:helmet:cape:neck:weapon:chest:shield:unknown:legs:unknown:gloves:boots: + +*/ + + +import org.osbot.rs07.api.def.ItemDefinition; +import org.osbot.rs07.api.model.Player; +import org.osbot.rs07.script.Script; +import org.osbot.rs07.script.ScriptManifest; + +import java.io.*; +import java.util.ArrayList; + +@ScriptManifest(name = "Fetch data10", author = "b4", version = 2, logo = "", info = "info") +public class Reader extends Script { + + private ArrayList names = new ArrayList<>(); + + @Override + public int onLoop() { + Player p = getPlayers().closest(o -> !names.contains(o.getName())); + if (p != null) + { + names.add(p.getName()); + String equipment = getOthersEquipment(p); + //Format: + //name:cblevel:helmet:cape:neck:weapon:chest:shield:unknown:legs:unknown:gloves:boots: + log2(p.getName() + + ":" + p.getCombatLevel() + + ":" + equipment); + } + return 50; + } + + private void log2(String msg) + { + try { + log(msg); + FileReader fr = new FileReader(getDirectoryData() + "Data.txt"); + BufferedReader br = new BufferedReader(fr); + for (String line; (line = br.readLine()) != null; ) { + if (line.split(":")[0].equals(msg.split(":")[0])) + { + log("Not adding that one, since we already have it"); + return; + } + } + + + FileWriter fw = new FileWriter(getDirectoryData() + "Data.txt", true); + BufferedWriter bw = new BufferedWriter(fw); + PrintWriter out = new PrintWriter(bw); + out.println(msg); + out.close(); + } catch (Exception e) { + log(e); + } + } + + private String getOthersEquipment(Player p) { + String equipmentList = ""; + if(p != null) { + int[] equipment = p.getDefinition().getAppearance(); + for (int value : equipment) { + if (value - 512 > 0) + equipmentList += ItemDefinition.forId(value - 512).getId() + ":"; + else + equipmentList += 0 + ":"; + } + } + return equipmentList; + } +} diff --git a/Server/data/botdata/pestcontrolcopies.txt b/Server/data/botdata/pestcontrolcopies.txt new file mode 100644 index 000000000..0fd766388 --- /dev/null +++ b/Server/data/botdata/pestcontrolcopies.txt @@ -0,0 +1,38 @@ +#Format: +#name:cblevel:helmet:cape:neck:weapon:chest:shield:unknown:legs:unknown:gloves:boots: +SirKermit:138:1149:6568:6585:4587:10564:6524:0:4585:0:1059:1061: +ceikry:110:1149:6568:6585:4587:10564:6524:0:4585:0:1059:1061: +loving puppy:95:11665:6568:6585:4587:8839:14767:0:8840:0:8842:1061: +rattle63:83:14096:10499:6585:4151:14094:14767:0:14095:0:8842:1061: +baluga:110:10828:6568:6585:4151:3140:6524:0:4087:0:8842:11732: +crabcake:115:10828:10446:6585:4151:10564:6524:0:4087:0:8842:11732: +Red:94:121:6568:10354:6585:10564:0:0:4087:0:1059:11732: +puglet:120:10828:6568:6585:11696:4757:0:0:8840:0:1059:3105: +linux:101:10828:10069:6585:4151:3140:14767:0:4087:0:1059:3105: +sicriona:103:1163:1023:6585:1333:1127:1201:0:1079:0:2922:1061:0: +czar:110:1149:6568:6585:4587:10564:6524:0:4585:0:1059:1061: +Alex:95:11665:6568:6585:4587:8839:14767:0:8840:0:8842:1061: +RedSparr0w:83:1149:6568:6585:4587:10564:6524:0:4585:0:1059:1061: +Summer:110:10828:6568:6585:4151:3140:6524:0:4087:0:8842:11732: +RedBracket:115:10828:10446:6585:13477:10564:6524:0:4087:0:8842:11732: +Woah:94:1163:6568:6585:13477:10564:0:0:4087:0:1059:11732: +SirKermit:130:10828:6568:6585:13477:4757:0:0:8840:0:1059:3105: +ceikry:95:10828:10069:6585:4151:3140:14767:0:4087:0:1059:3105: +SirKermit:138:1149:6568:6585:4587:10564:6524:0:4585:0:1059:1061: +ceikry:110:1149:6568:6585:4587:10564:6524:0:4585:0:1059:1061: +loving puppy:95:11665:6568:6585:4587:8839:14767:0:8840:0:8842:1061: +rattle63:83:14096:10499:6585:4151:14094:14767:0:14095:0:8842:1061: +baluga:110:10828:6568:6585:4151:3140:6524:0:4087:0:8842:11732: +crabcake:115:10828:10446:6585:4151:10564:6524:0:4087:0:8842:11732: +Red:94:121:6568:10354:6585:10564:0:0:4087:0:1059:11732: +puglet:120:10828:6568:6585:11696:4757:0:0:8840:0:1059:3105: +linux:101:10828:10069:6585:4151:3140:14767:0:4087:0:1059:3105: +sicriona:103:1163:1023:6585:1333:1127:1201:0:1079:0:2922:1061:0: +czar:110:1149:6568:6585:4587:10564:6524:0:4585:0:1059:1061: +Alex:95:11665:6568:6585:4587:8839:14767:0:8840:0:8842:1061: +RedSparr0w:83:1149:6568:6585:4587:10564:6524:0:4585:0:1059:1061: +Summer:110:10828:6568:6585:4151:3140:6524:0:4087:0:8842:11732: +RedBracket:115:10828:10446:6585:13477:10564:6524:0:4087:0:8842:11732: +Woah:94:1163:6568:6585:13477:10564:0:0:4087:0:1059:11732: +SirKermit:130:10828:6568:6585:13477:4757:0:0:8840:0:1059:3105: +ceikry:95:10828:10069:6585:4151:3140:14767:0:4087:0:1059:3105: \ No newline at end of file diff --git a/Server/data/configs/ammo_configs.json b/Server/data/configs/ammo_configs.json new file mode 100644 index 000000000..fef8c7d5e --- /dev/null +++ b/Server/data/configs/ammo_configs.json @@ -0,0 +1,1730 @@ +[ + { + "itemId": "78", + "name": "Ice arrows", + "start_graphic": "25,96", + "darkbow_graphic": "1110,96", + "projectile": "16,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "598", + "name": "Bronze fire arrows", + "start_graphic": "26,96", + "darkbow_graphic": "1113,96", + "projectile": "17,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "732", + "name": "Holy water", + "start_graphic": "193,0", + "darkbow_graphic": "", + "projectile": "192,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "800", + "name": "Bronze thrownaxe", + "start_graphic": "43,96", + "darkbow_graphic": "", + "projectile": "36,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "801", + "name": "Iron thrownaxe", + "start_graphic": "42,96", + "darkbow_graphic": "", + "projectile": "35,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "802", + "name": "Steel thrownaxe", + "start_graphic": "44,96", + "darkbow_graphic": "", + "projectile": "37,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "803", + "name": "Mithril thrownaxe", + "start_graphic": "45,96", + "darkbow_graphic": "", + "projectile": "38,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "804", + "name": "Adamant thrownaxe", + "start_graphic": "46,96", + "darkbow_graphic": "", + "projectile": "39,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "805", + "name": "Rune thrownaxe", + "start_graphic": "48,96", + "darkbow_graphic": "", + "projectile": "41,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "806", + "name": "Bronze dart", + "start_graphic": "232,96", + "darkbow_graphic": "", + "projectile": "226,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "807", + "name": "Iron dart", + "start_graphic": "233,96", + "darkbow_graphic": "", + "projectile": "227,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "808", + "name": "Steel dart", + "start_graphic": "234,96", + "darkbow_graphic": "", + "projectile": "228,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "809", + "name": "Mithril dart", + "start_graphic": "235,96", + "darkbow_graphic": "", + "projectile": "229,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "810", + "name": "Adamant dart", + "start_graphic": "236,96", + "darkbow_graphic": "", + "projectile": "230,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "811", + "name": "Rune dart", + "start_graphic": "237,96", + "darkbow_graphic": "", + "projectile": "231,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "812", + "name": "Bronze dart(p)", + "start_graphic": "232,96", + "darkbow_graphic": "", + "projectile": "226,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "813", + "name": "Iron dart(p)", + "start_graphic": "233,96", + "darkbow_graphic": "", + "projectile": "227,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "814", + "name": "Steel dart(p)", + "start_graphic": "234,96", + "darkbow_graphic": "", + "projectile": "228,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "815", + "name": "Mithril dart(p)", + "start_graphic": "235,96", + "darkbow_graphic": "", + "projectile": "229,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "816", + "name": "Adamant dart(p)", + "start_graphic": "236,96", + "darkbow_graphic": "", + "projectile": "230,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "817", + "name": "Rune dart(p)", + "start_graphic": "237,96", + "darkbow_graphic": "", + "projectile": "231,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "825", + "name": "Bronze javelin", + "start_graphic": "206,96", + "darkbow_graphic": "", + "projectile": "200,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "826", + "name": "Iron javelin", + "start_graphic": "207,96", + "darkbow_graphic": "", + "projectile": "201,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "827", + "name": "Steel javelin", + "start_graphic": "208,96", + "darkbow_graphic": "", + "projectile": "202,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "828", + "name": "Mithril javelin", + "start_graphic": "209,96", + "darkbow_graphic": "", + "projectile": "203,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "829", + "name": "Adamant javelin", + "start_graphic": "210,96", + "darkbow_graphic": "", + "projectile": "204,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "830", + "name": "Rune javelin", + "start_graphic": "211,96", + "darkbow_graphic": "", + "projectile": "205,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "831", + "name": "Bronze javelin(p)", + "start_graphic": "206,96", + "darkbow_graphic": "", + "projectile": "200,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "832", + "name": "Iron javelin(p)", + "start_graphic": "207,96", + "darkbow_graphic": "", + "projectile": "201,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "833", + "name": "Steel javelin(p)", + "start_graphic": "208,96", + "darkbow_graphic": "", + "projectile": "202,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "834", + "name": "Mithril javelin(p)", + "start_graphic": "209,96", + "darkbow_graphic": "", + "projectile": "203,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "835", + "name": "Adamant javelin(p)", + "start_graphic": "210,96", + "darkbow_graphic": "", + "projectile": "204,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "836", + "name": "Rune javelin(p)", + "start_graphic": "211,96", + "darkbow_graphic": "", + "projectile": "205,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "863", + "name": "Iron knife", + "start_graphic": "220,96", + "darkbow_graphic": "", + "projectile": "213,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "864", + "name": "Bronze knife", + "start_graphic": "219,96", + "darkbow_graphic": "", + "projectile": "212,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "865", + "name": "Steel knife", + "start_graphic": "221,96", + "darkbow_graphic": "", + "projectile": "214,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "866", + "name": "Mithril knife", + "start_graphic": "223,96", + "darkbow_graphic": "", + "projectile": "216,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "867", + "name": "Adamant knife", + "start_graphic": "224,96", + "darkbow_graphic": "", + "projectile": "217,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "868", + "name": "Rune knife", + "start_graphic": "225,96", + "darkbow_graphic": "", + "projectile": "218,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "869", + "name": "Black knife", + "start_graphic": "222,96", + "darkbow_graphic": "", + "projectile": "215,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "870", + "name": "Bronze knife(p)", + "start_graphic": "219,96", + "darkbow_graphic": "", + "projectile": "212,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "871", + "name": "Iron knife(p)", + "start_graphic": "220,96", + "darkbow_graphic": "", + "projectile": "213,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "872", + "name": "Steel knife(p)", + "start_graphic": "221,96", + "darkbow_graphic": "", + "projectile": "214,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "873", + "name": "Mithril knife(p)", + "start_graphic": "223,96", + "darkbow_graphic": "", + "projectile": "216,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "874", + "name": "Black knife(p)", + "start_graphic": "222,96", + "darkbow_graphic": "", + "projectile": "215,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "875", + "name": "Adamant knife(p)", + "start_graphic": "224,96", + "darkbow_graphic": "", + "projectile": "217,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "876", + "name": "Rune knife(p)", + "start_graphic": "225,96", + "darkbow_graphic": "", + "projectile": "218,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "877", + "name": "Bronze bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "878", + "name": "Bronze bolts(p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "28" + }, + { + "itemId": "879", + "name": "Opal bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "880", + "name": "Pearl bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "882", + "name": "Bronze arrow", + "start_graphic": "19,96", + "darkbow_graphic": "1104,96", + "projectile": "10,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "883", + "name": "Bronze arrow(p)", + "start_graphic": "19,96", + "darkbow_graphic": "1104,96", + "projectile": "10,40,36,41,46,5,0", + "poison_damage": "28" + }, + { + "itemId": "884", + "name": "Iron arrow", + "start_graphic": "18,96", + "darkbow_graphic": "1105,96", + "projectile": "9,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "885", + "name": "Iron arrow(p)", + "start_graphic": "18,96", + "darkbow_graphic": "1105,96", + "projectile": "9,40,36,41,46,5,0", + "poison_damage": "28" + }, + { + "itemId": "886", + "name": "Steel arrow", + "start_graphic": "20,96", + "darkbow_graphic": "1106,96", + "projectile": "11,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "887", + "name": "Steel arrow(p)", + "start_graphic": "20,96", + "darkbow_graphic": "1106,96", + "projectile": "11,40,36,41,46,5,0", + "poison_damage": "28" + }, + { + "itemId": "888", + "name": "Mithril arrow", + "start_graphic": "21,96", + "darkbow_graphic": "1107,96", + "projectile": "12,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "889", + "name": "Mithril arrow(p)", + "start_graphic": "21,96", + "darkbow_graphic": "1107,96", + "projectile": "12,40,36,41,46,5,0", + "poison_damage": "28" + }, + { + "itemId": "890", + "name": "Adamant arrow", + "start_graphic": "22,96", + "darkbow_graphic": "1108,96", + "projectile": "13,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "891", + "name": "Adamant arrow(p)", + "start_graphic": "22,96", + "darkbow_graphic": "1108,96", + "projectile": "13,40,36,41,46,5,0", + "poison_damage": "28" + }, + { + "itemId": "892", + "name": "Rune arrow", + "start_graphic": "24,96", + "darkbow_graphic": "1109,96", + "projectile": "15,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "893", + "name": "Rune arrow(p)", + "start_graphic": "24,96", + "darkbow_graphic": "1109,96", + "projectile": "15,40,36,41,46,5,0", + "poison_damage": "28" + }, + { + "itemId": "2532", + "name": "Iron fire arrows", + "start_graphic": "26,96", + "darkbow_graphic": "1113,96", + "projectile": "17,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "2534", + "name": "Steel fire arrows", + "start_graphic": "26,96", + "darkbow_graphic": "1113,96", + "projectile": "17,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "2536", + "name": "Mithril fire arrows", + "start_graphic": "26,96", + "darkbow_graphic": "1113,96", + "projectile": "17,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "2538", + "name": "Adamant fire arrows", + "start_graphic": "26,96", + "darkbow_graphic": "1113,96", + "projectile": "17,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "2540", + "name": "Rune fire arrows", + "start_graphic": "26,96", + "darkbow_graphic": "1113,96", + "projectile": "17,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "2866", + "name": "Ogre arrow", + "start_graphic": "243,96", + "darkbow_graphic": "", + "projectile": "242,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "3093", + "name": "Black dart", + "start_graphic": "273,96", + "darkbow_graphic": "", + "projectile": "227,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "3094", + "name": "Black dart(p)", + "start_graphic": "273,96", + "darkbow_graphic": "", + "projectile": "227,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "4160", + "name": "Broad arrow", + "start_graphic": "325,96", + "darkbow_graphic": "1112,96", + "projectile": "326,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4212", + "name": "New crystal bow", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4214", + "name": "Crystal bow full", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4215", + "name": "Crystal bow 9/10", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4216", + "name": "Crystal bow 8/10", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4217", + "name": "Crystal bow 7/10", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4218", + "name": "Crystal bow 6/10", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4219", + "name": "Crystal bow 5/10", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4220", + "name": "Crystal bow 4/10", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4221", + "name": "Crystal bow 3/10", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4222", + "name": "Crystal bow 2/10", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4223", + "name": "Crystal bow 1/10", + "start_graphic": "250,96", + "darkbow_graphic": "", + "projectile": "249,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4740", + "name": "Bolt rack", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "4778", + "name": "Iron brutal", + "start_graphic": "18,96", + "darkbow_graphic": "", + "projectile": "9,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4783", + "name": "Steel brutal", + "start_graphic": "20,96", + "darkbow_graphic": "", + "projectile": "11,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4788", + "name": "Black brutal", + "start_graphic": "18,96", + "darkbow_graphic": "", + "projectile": "9,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4793", + "name": "Mithril brutal", + "start_graphic": "21,96", + "darkbow_graphic": "", + "projectile": "12,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4798", + "name": "Adamant brutal", + "start_graphic": "22,96", + "darkbow_graphic": "", + "projectile": "13,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "4803", + "name": "Rune brutal", + "start_graphic": "24,96", + "darkbow_graphic": "", + "projectile": "15,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "5616", + "name": "Bronze arrow(p+)", + "start_graphic": "19,96", + "darkbow_graphic": "1104,96", + "projectile": "10,40,36,41,46,5,0", + "poison_damage": "38" + }, + { + "itemId": "5617", + "name": "Iron arrow(p+)", + "start_graphic": "18,96", + "darkbow_graphic": "1105,96", + "projectile": "9,40,36,41,46,5,0", + "poison_damage": "38" + }, + { + "itemId": "5618", + "name": "Steel arrow(p+)", + "start_graphic": "20,96", + "darkbow_graphic": "1106,96", + "projectile": "11,40,36,41,46,5,0", + "poison_damage": "38" + }, + { + "itemId": "5619", + "name": "Mithril arrow(p+)", + "start_graphic": "21,96", + "darkbow_graphic": "1107,96", + "projectile": "12,40,36,41,46,5,0", + "poison_damage": "38" + }, + { + "itemId": "5620", + "name": "Adamant arrow(p+)", + "start_graphic": "22,96", + "darkbow_graphic": "1108,96", + "projectile": "13,40,36,41,46,5,0", + "poison_damage": "38" + }, + { + "itemId": "5621", + "name": "Rune arrow(p+)", + "start_graphic": "19,96", + "darkbow_graphic": "", + "projectile": "10,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "5622", + "name": "Bronze arrow(p++)", + "start_graphic": "19,96", + "darkbow_graphic": "1104,96", + "projectile": "10,40,36,41,46,5,0", + "poison_damage": "48" + }, + { + "itemId": "5623", + "name": "Iron arrow(p++)", + "start_graphic": "18,96", + "darkbow_graphic": "1105,96", + "projectile": "9,40,36,41,46,5,0", + "poison_damage": "48" + }, + { + "itemId": "5624", + "name": "Steel arrow(p++)", + "start_graphic": "20,96", + "darkbow_graphic": "1106,96", + "projectile": "11,40,36,41,46,5,0", + "poison_damage": "48" + }, + { + "itemId": "5625", + "name": "Mithril arrow(p++)", + "start_graphic": "21,96", + "darkbow_graphic": "1107,96", + "projectile": "12,40,36,41,46,5,0", + "poison_damage": "48" + }, + { + "itemId": "5626", + "name": "Adamant arrow(p++)", + "start_graphic": "22,96", + "darkbow_graphic": "1108,96", + "projectile": "13,40,36,41,46,5,0", + "poison_damage": "48" + }, + { + "itemId": "5627", + "name": "Rune arrow(p++)", + "start_graphic": "24,96", + "darkbow_graphic": "1109,96", + "projectile": "15,40,36,41,46,5,0", + "poison_damage": "48" + }, + { + "itemId": "5628", + "name": "Bronze dart(p+)", + "start_graphic": "232,96", + "darkbow_graphic": "", + "projectile": "226,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5629", + "name": "Iron dart(p+)", + "start_graphic": "233,96", + "darkbow_graphic": "", + "projectile": "227,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5630", + "name": "Steel dart(p+)", + "start_graphic": "235,96", + "darkbow_graphic": "", + "projectile": "229,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5631", + "name": "Black dart(p+)", + "start_graphic": "273,96", + "darkbow_graphic": "", + "projectile": "227,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5633", + "name": "Adamant dart(p+)", + "start_graphic": "236,96", + "darkbow_graphic": "", + "projectile": "230,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5634", + "name": "Rune dart(p+)", + "start_graphic": "237,96", + "darkbow_graphic": "", + "projectile": "231,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5635", + "name": "Bronze dart(p++)", + "start_graphic": "232,96", + "darkbow_graphic": "", + "projectile": "226,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5636", + "name": "Iron dart(p++)", + "start_graphic": "233,96", + "darkbow_graphic": "", + "projectile": "227,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5637", + "name": "Steel dart(p++)", + "start_graphic": "234,96", + "darkbow_graphic": "", + "projectile": "228,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5638", + "name": "Black dart(p++)", + "start_graphic": "273,96", + "darkbow_graphic": "", + "projectile": "227,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5639", + "name": "Mithril dart(p++)", + "start_graphic": "235,96", + "darkbow_graphic": "", + "projectile": "229,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5640", + "name": "Adamant dart(p++)", + "start_graphic": "236,96", + "darkbow_graphic": "", + "projectile": "230,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5641", + "name": "Rune dart(p++)", + "start_graphic": "237,96", + "darkbow_graphic": "", + "projectile": "231,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5642", + "name": "Bronze javelin(p+)", + "start_graphic": "206,96", + "darkbow_graphic": "", + "projectile": "200,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5643", + "name": "Iron javelin(p+)", + "start_graphic": "207,96", + "darkbow_graphic": "", + "projectile": "201,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5644", + "name": "Steel javelin(p+)", + "start_graphic": "208,96", + "darkbow_graphic": "", + "projectile": "202,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5645", + "name": "Mithril javelin(p+)", + "start_graphic": "209,96", + "darkbow_graphic": "", + "projectile": "203,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5646", + "name": "Adamant javelin(p+)", + "start_graphic": "210,96", + "darkbow_graphic": "", + "projectile": "204,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5647", + "name": "Rune javelin(p+)", + "start_graphic": "211,96", + "darkbow_graphic": "", + "projectile": "205,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5648", + "name": "Bronze jav\\'n(p++)", + "start_graphic": "206,96", + "darkbow_graphic": "", + "projectile": "200,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5649", + "name": "Iron javelin(p++)", + "start_graphic": "207,96", + "darkbow_graphic": "", + "projectile": "201,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5650", + "name": "Steel javelin(p++)", + "start_graphic": "208,96", + "darkbow_graphic": "", + "projectile": "202,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5651", + "name": "Mithril javelin(p++)", + "start_graphic": "209,96", + "darkbow_graphic": "", + "projectile": "203,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5652", + "name": "Adamant javelin(p++)", + "start_graphic": "210,96", + "darkbow_graphic": "", + "projectile": "204,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5653", + "name": "Rune javelin(p++)", + "start_graphic": "211,96", + "darkbow_graphic": "", + "projectile": "205,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5654", + "name": "Bronze knife(p+)", + "start_graphic": "219,96", + "darkbow_graphic": "", + "projectile": "212,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5655", + "name": "Iron knife(p+)", + "start_graphic": "220,96", + "darkbow_graphic": "", + "projectile": "213,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5656", + "name": "Steel knife(p+)", + "start_graphic": "221,96", + "darkbow_graphic": "", + "projectile": "214,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5657", + "name": "Mithril knife(p+)", + "start_graphic": "223,96", + "darkbow_graphic": "", + "projectile": "216,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5658", + "name": "Black knife(p+)", + "start_graphic": "222,96", + "darkbow_graphic": "", + "projectile": "215,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5659", + "name": "Adamant knife(p+)", + "start_graphic": "224,96", + "darkbow_graphic": "", + "projectile": "217,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5660", + "name": "Rune knife(p+)", + "start_graphic": "225,96", + "darkbow_graphic": "", + "projectile": "218,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "5661", + "name": "Bronze knife(p++)", + "start_graphic": "219,96", + "darkbow_graphic": "", + "projectile": "212,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5662", + "name": "Iron knife(p++)", + "start_graphic": "220,96", + "darkbow_graphic": "", + "projectile": "213,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5663", + "name": "Steel knife(p++)", + "start_graphic": "221,96", + "darkbow_graphic": "", + "projectile": "214,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5664", + "name": "Mithril knife(p++)", + "start_graphic": "223,96", + "darkbow_graphic": "", + "projectile": "216,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5665", + "name": "Black knife(p++)", + "start_graphic": "222,96", + "darkbow_graphic": "", + "projectile": "215,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5666", + "name": "Adamant knife(p++)", + "start_graphic": "224,96", + "darkbow_graphic": "", + "projectile": "217,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "5667", + "name": "Rune knife(p++)", + "start_graphic": "225,96", + "darkbow_graphic": "", + "projectile": "218,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "6061", + "name": "Bronze bolts(p+)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "38" + }, + { + "itemId": "6062", + "name": "Bronze bolts(p++)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "48" + }, + { + "itemId": "6522", + "name": "Toktz-xil-ul", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "442,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "8882", + "name": "Bone bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9139", + "name": "Blurite bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9140", + "name": "Iron bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9141", + "name": "Steel bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9142", + "name": "Mithril bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9143", + "name": "Adamant bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9144", + "name": "Rune bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9236", + "name": "Opal bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9237", + "name": "Jade bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9238", + "name": "Pearl bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9239", + "name": "Topaz bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9240", + "name": "Sapphire bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9241", + "name": "Emerald bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9242", + "name": "Ruby bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9243", + "name": "Diamond bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9244", + "name": "Dragon bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9245", + "name": "Onyx bolts (e)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9286", + "name": "Blurite bolts(p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "28" + }, + { + "itemId": "9287", + "name": "Iron bolts (p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "28" + }, + { + "itemId": "9288", + "name": "Steel bolts (p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "28" + }, + { + "itemId": "9289", + "name": "Mithril bolts (p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "28" + }, + { + "itemId": "9290", + "name": "Adamant bolts (p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "28" + }, + { + "itemId": "9291", + "name": "Runite bolts (p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "28" + }, + { + "itemId": "9293", + "name": "Blurite bolts(p+)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "38" + }, + { + "itemId": "9294", + "name": "Iron bolts(p+)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "38" + }, + { + "itemId": "9295", + "name": "Steel bolts(p+)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "38" + }, + { + "itemId": "9296", + "name": "Mithril bolts(p+)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "38" + }, + { + "itemId": "9297", + "name": "Adamant bolts(p+)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "38" + }, + { + "itemId": "9298", + "name": "Runite bolts(p+)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "38" + }, + { + "itemId": "9300", + "name": "Blurite bolts(p++)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "48" + }, + { + "itemId": "9301", + "name": "Iron bolts(p++)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "48" + }, + { + "itemId": "9302", + "name": "Steel bolts(p++)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "48" + }, + { + "itemId": "9303", + "name": "Mithril bolts(p++)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "48" + }, + { + "itemId": "9304", + "name": "Adamant bolts(p++)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "48" + }, + { + "itemId": "9305", + "name": "Runite bolts(p++)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "48" + }, + { + "itemId": "9335", + "name": "Jade bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9336", + "name": "Topaz bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9337", + "name": "Sapphire bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9338", + "name": "Emerald bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9339", + "name": "Ruby bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9340", + "name": "Diamond bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9341", + "name": "Dragon bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9342", + "name": "Onyx bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "9706", + "name": "Training arrows", + "start_graphic": "806,96", + "darkbow_graphic": "806,96", + "projectile": "805,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "10033", + "name": "Chinchompa", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "908,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "10034", + "name": "Red chinchompa", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "909,40,36,45,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "10158", + "name": "Kebbit bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "10159", + "name": "Long kebbit bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "11212", + "name": "Dragon arrow", + "start_graphic": "1116,96", + "darkbow_graphic": "1114,96", + "projectile": "1120,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "11217", + "name": "Dragon fire arrows", + "start_graphic": "26,96", + "darkbow_graphic": "1113,96", + "projectile": "17,40,36,41,46,5,0", + "poison_damage": "0" + }, + { + "itemId": "11227", + "name": "Dragon arrow(p)", + "start_graphic": "1116,96", + "darkbow_graphic": "1114,96", + "projectile": "1120,40,36,41,46,5,0", + "poison_damage": "28" + }, + { + "itemId": "11228", + "name": "Dragon arrow(p+)", + "start_graphic": "1116,96", + "darkbow_graphic": "1114,96", + "projectile": "1120,40,36,41,46,5,0", + "poison_damage": "38" + }, + { + "itemId": "11229", + "name": "Dragon arrow(p++)", + "start_graphic": "1116,96", + "darkbow_graphic": "1114,96", + "projectile": "1120,40,36,41,46,5,0", + "poison_damage": "48" + }, + { + "itemId": "11230", + "name": "Dragon dart", + "start_graphic": "1123,96", + "darkbow_graphic": "", + "projectile": "1122,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "11231", + "name": "Dragon dart(p)", + "start_graphic": "1123,96", + "darkbow_graphic": "", + "projectile": "1122,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "11233", + "name": "Dragon dart(p+)", + "start_graphic": "1123,96", + "darkbow_graphic": "", + "projectile": "1122,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "11234", + "name": "Dragon dart(p++)", + "start_graphic": "1123,96", + "darkbow_graphic": "", + "projectile": "1122,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "13083", + "name": "Black bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "13084", + "name": "Black bolts(p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "28" + }, + { + "itemId": "13085", + "name": "Black bolts(p+)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "38" + }, + { + "itemId": "13086", + "name": "Black bolts(p++)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "48" + }, + { + "itemId": "13280", + "name": "Broad-tipped bolts", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "27,38,36,41,32,5,0", + "poison_damage": "0" + }, + { + "itemId": "13879", + "name": "Morrigan\\'s javelin", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "1837,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "13880", + "name": "Morrigan\\'s javelin(p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "1837,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "13881", + "name": "Morrigan\\'s javelin(p+)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "1837,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "13882", + "name": "Morrigan\\'s javelin(p++)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "1837,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "13883", + "name": "Morrigan\\'s throwing axe", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "1839,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "13953", + "name": "Corrupt morrigan\\'s javelin", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "1837,40,36,32,32,15,0", + "poison_damage": "0" + }, + { + "itemId": "13954", + "name": "C. morrigan\\'s javelin (p)", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "1837,40,36,32,32,15,0", + "poison_damage": "28" + }, + { + "itemId": "13955", + "name": "C. morrigan\\'s javelin (p+)", + "start_graphic": "1837,96", + "darkbow_graphic": "", + "projectile": "1840,40,36,32,32,15,0", + "poison_damage": "38" + }, + { + "itemId": "13956", + "name": "C. morrigan\\'s javelin (p++)", + "start_graphic": "1837,96", + "darkbow_graphic": "", + "projectile": "1840,40,36,32,32,15,0", + "poison_damage": "48" + }, + { + "itemId": "13957", + "name": "C. morrigan\\'s throwing axe", + "start_graphic": "-1,0", + "darkbow_graphic": "", + "projectile": "1839,40,36,32,32,15,0", + "poison_damage": "0" + } +] diff --git a/Server/data/configs/door_configs.json b/Server/data/configs/door_configs.json new file mode 100644 index 000000000..1cbec114d --- /dev/null +++ b/Server/data/configs/door_configs.json @@ -0,0 +1,3092 @@ +[ + { + "id": "3", + "replaceId": "1531", + "fence": "false", + "metal": "false" + }, + { + "id": "4", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "24", + "replaceId": "8791", + "fence": "false", + "metal": "false" + }, + { + "id": "59", + "replaceId": "1534", + "fence": "false", + "metal": "false" + }, + { + "id": "71", + "replaceId": "1517", + "fence": "false", + "metal": "false" + }, + { + "id": "72", + "replaceId": "1520", + "fence": "false", + "metal": "false" + }, + { + "id": "73", + "replaceId": "4425", + "fence": "false", + "metal": "false" + }, + { + "id": "74", + "replaceId": "4426", + "fence": "false", + "metal": "false" + }, + { + "id": "81", + "replaceId": "11712", + "fence": "false", + "metal": "false" + }, + { + "id": "82", + "replaceId": "11715", + "fence": "false", + "metal": "false" + }, + { + "id": "89", + "replaceId": "1560", + "fence": "false", + "metal": "true" + }, + { + "id": "90", + "replaceId": "1560", + "fence": "false", + "metal": "true" + }, + { + "id": "92", + "replaceId": "17317", + "fence": "false", + "metal": "false" + }, + { + "id": "93", + "replaceId": "12445", + "fence": "false", + "metal": "false" + }, + { + "id": "94", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "95", + "replaceId": "1560", + "fence": "false", + "metal": "true" + }, + { + "id": "99", + "replaceId": "14750", + "fence": "false", + "metal": "false" + }, + { + "id": "102", + "replaceId": "13002", + "fence": "false", + "metal": "false" + }, + { + "id": "166", + "replaceId": "1556", + "fence": "false", + "metal": "false" + }, + { + "id": "167", + "replaceId": "1552", + "fence": "false", + "metal": "false" + }, + { + "id": "883", + "replaceId": "7051", + "fence": "false", + "metal": "false" + }, + { + "id": "1512", + "replaceId": "1515", + "fence": "false", + "metal": "false" + }, + { + "id": "1513", + "replaceId": "1514", + "fence": "false", + "metal": "false" + }, + { + "id": "1516", + "replaceId": "1517", + "fence": "false", + "metal": "false" + }, + { + "id": "1519", + "replaceId": "1520", + "fence": "false", + "metal": "false" + }, + { + "id": "1530", + "replaceId": "1531", + "fence": "false", + "metal": "false" + }, + { + "id": "1533", + "replaceId": "1534", + "fence": "false", + "metal": "false" + }, + { + "id": "1536", + "replaceId": "1537", + "fence": "false", + "metal": "false" + }, + { + "id": "1539", + "replaceId": "1540", + "fence": "false", + "metal": "true" + }, + { + "id": "1542", + "replaceId": "1543", + "fence": "false", + "metal": "true" + }, + { + "id": "1544", + "replaceId": "1545", + "fence": "false", + "metal": "true" + }, + { + "id": "1551", + "replaceId": "1552", + "fence": "true", + "metal": "false" + }, + { + "id": "1553", + "replaceId": "1552", + "fence": "true", + "metal": "false" + }, + { + "id": "1557", + "replaceId": "1560", + "fence": "false", + "metal": "true" + }, + { + "id": "1558", + "replaceId": "1560", + "fence": "true", + "metal": "true" + }, + { + "id": "1573", + "replaceId": "1574", + "fence": "false", + "metal": "false" + }, + { + "id": "1575", + "replaceId": "1576", + "fence": "false", + "metal": "false" + }, + { + "id": "1589", + "replaceId": "1561", + "fence": "true", + "metal": "true" + }, + { + "id": "1590", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "1591", + "replaceId": "1531", + "fence": "false", + "metal": "false" + }, + { + "id": "1595", + "replaceId": "1531", + "fence": "false", + "metal": "false" + }, + { + "id": "1596", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "1597", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "1598", + "replaceId": "1556", + "fence": "false", + "metal": "false" + }, + { + "id": "1599", + "replaceId": "1556", + "fence": "false", + "metal": "false" + }, + { + "id": "1804", + "replaceId": "1531", + "fence": "false", + "metal": "false" + }, + { + "id": "1805", + "replaceId": "15535", + "fence": "false", + "metal": "false" + }, + { + "id": "1991", + "replaceId": "1545", + "fence": "false", + "metal": "true" + }, + { + "id": "2000", + "replaceId": "1537", + "fence": "false", + "metal": "false" + }, + { + "id": "2002", + "replaceId": "1537", + "fence": "false", + "metal": "false" + }, + { + "id": "2025", + "replaceId": "1534", + "fence": "false", + "metal": "false" + }, + { + "id": "2034", + "replaceId": "1531", + "fence": "false", + "metal": "false" + }, + { + "id": "2036", + "replaceId": "1531", + "fence": "false", + "metal": "false" + }, + { + "id": "2039", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2041", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2050", + "replaceId": "15511", + "fence": "false", + "metal": "false" + }, + { + "id": "2051", + "replaceId": "15513", + "fence": "false", + "metal": "false" + }, + { + "id": "2054", + "replaceId": "24375", + "fence": "false", + "metal": "false" + }, + { + "id": "2058", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2060", + "replaceId": "1561", + "fence": "false", + "metal": "false" + }, + { + "id": "2069", + "replaceId": "23339", + "fence": "false", + "metal": "false" + }, + { + "id": "2115", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2116", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2154", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2155", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2184", + "replaceId": "7260", + "fence": "false", + "metal": "false" + }, + { + "id": "2307", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2308", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2309", + "replaceId": "1540", + "fence": "false", + "metal": "true" + }, + { + "id": "2338", + "replaceId": "35631", + "fence": "false", + "metal": "false" + }, + { + "id": "2391", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2392", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2397", + "replaceId": "24383", + "fence": "false", + "metal": "false" + }, + { + "id": "2398", + "replaceId": "24379", + "fence": "false", + "metal": "false" + }, + { + "id": "2399", + "replaceId": "36319", + "fence": "false", + "metal": "false" + }, + { + "id": "2406", + "replaceId": "2407", + "fence": "false", + "metal": "false" + }, + { + "id": "2416", + "replaceId": "2417", + "fence": "false", + "metal": "false" + }, + { + "id": "2427", + "replaceId": "36864", + "fence": "false", + "metal": "false" + }, + { + "id": "2428", + "replaceId": "36359", + "fence": "false", + "metal": "false" + }, + { + "id": "2429", + "replaceId": "36343", + "fence": "false", + "metal": "false" + }, + { + "id": "2430", + "replaceId": "36853", + "fence": "false", + "metal": "false" + }, + { + "id": "2431", + "replaceId": "36848", + "fence": "false", + "metal": "false" + }, + { + "id": "2432", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2433", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2438", + "replaceId": "3728", + "fence": "false", + "metal": "false" + }, + { + "id": "2439", + "replaceId": "3727", + "fence": "false", + "metal": "false" + }, + { + "id": "2526", + "replaceId": "24377", + "fence": "false", + "metal": "true" + }, + { + "id": "2528", + "replaceId": "24935", + "fence": "false", + "metal": "false" + }, + { + "id": "2534", + "replaceId": "2998", + "fence": "false", + "metal": "false" + }, + { + "id": "2535", + "replaceId": "2998", + "fence": "false", + "metal": "false" + }, + { + "id": "2537", + "replaceId": "24932", + "fence": "false", + "metal": "false" + }, + { + "id": "2546", + "replaceId": "2547", + "fence": "false", + "metal": "false" + }, + { + "id": "2548", + "replaceId": "2549", + "fence": "false", + "metal": "false" + }, + { + "id": "2550", + "replaceId": "27989", + "fence": "false", + "metal": "false" + }, + { + "id": "2551", + "replaceId": "30865", + "fence": "false", + "metal": "false" + }, + { + "id": "2552", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2553", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2554", + "replaceId": "26916", + "fence": "false", + "metal": "false" + }, + { + "id": "2555", + "replaceId": "1537", + "fence": "false", + "metal": "false" + }, + { + "id": "2556", + "replaceId": "25417", + "fence": "false", + "metal": "false" + }, + { + "id": "2557", + "replaceId": "1543", + "fence": "false", + "metal": "true" + }, + { + "id": "2558", + "replaceId": "25717", + "fence": "false", + "metal": "false" + }, + { + "id": "2559", + "replaceId": "25820", + "fence": "false", + "metal": "false" + }, + { + "id": "2595", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "2621", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "2622", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "2624", + "replaceId": "2549", + "fence": "false", + "metal": "false" + }, + { + "id": "2625", + "replaceId": "2549", + "fence": "false", + "metal": "false" + }, + { + "id": "2626", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "2627", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "2628", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "2631", + "replaceId": "1545", + "fence": "false", + "metal": "true" + }, + { + "id": "2673", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2674", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2705", + "replaceId": "25643", + "fence": "false", + "metal": "false" + }, + { + "id": "2706", + "replaceId": "25719", + "fence": "false", + "metal": "false" + }, + { + "id": "2712", + "replaceId": "36865", + "fence": "false", + "metal": "false" + }, + { + "id": "2786", + "replaceId": "20088", + "fence": "false", + "metal": "true" + }, + { + "id": "2787", + "replaceId": "20087", + "fence": "false", + "metal": "false" + }, + { + "id": "2788", + "replaceId": "20090", + "fence": "false", + "metal": "true" + }, + { + "id": "2789", + "replaceId": "20089", + "fence": "false", + "metal": "false" + }, + { + "id": "2814", + "replaceId": "1561", + "fence": "false", + "metal": "false" + }, + { + "id": "2815", + "replaceId": "1561", + "fence": "false", + "metal": "false" + }, + { + "id": "2861", + "replaceId": "15535", + "fence": "false", + "metal": "false" + }, + { + "id": "2862", + "replaceId": "24815", + "fence": "false", + "metal": "false" + }, + { + "id": "2863", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "2865", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2866", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2882", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2883", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "2997", + "replaceId": "2998", + "fence": "false", + "metal": "false" + }, + { + "id": "3014", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3015", + "replaceId": "3727", + "fence": "true", + "metal": "false" + }, + { + "id": "3016", + "replaceId": "3727", + "fence": "true", + "metal": "false" + }, + { + "id": "3017", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3018", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3019", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3020", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "3021", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "3022", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "3023", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "3024", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3025", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3026", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3027", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3197", + "replaceId": "3727", + "fence": "false", + "metal": "false" + }, + { + "id": "3198", + "replaceId": "3727", + "fence": "false", + "metal": "false" + }, + { + "id": "3270", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3506", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "3507", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "3725", + "replaceId": "3727", + "fence": "false", + "metal": "false" + }, + { + "id": "3726", + "replaceId": "3727", + "fence": "true", + "metal": "false" + }, + { + "id": "3743", + "replaceId": "17090", + "fence": "false", + "metal": "false" + }, + { + "id": "3745", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3746", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "3747", + "replaceId": "1534", + "fence": "false", + "metal": "false" + }, + { + "id": "3763", + "replaceId": "3764", + "fence": "false", + "metal": "true" + }, + { + "id": "3776", + "replaceId": "3777", + "fence": "false", + "metal": "false" + }, + { + "id": "4148", + "replaceId": "4248", + "fence": "false", + "metal": "false" + }, + { + "id": "4165", + "replaceId": "4697", + "fence": "false", + "metal": "false" + }, + { + "id": "4166", + "replaceId": "7374", + "fence": "false", + "metal": "false" + }, + { + "id": "4247", + "replaceId": "21342", + "fence": "false", + "metal": "false" + }, + { + "id": "4311", + "replaceId": "4139", + "fence": "true", + "metal": "false" + }, + { + "id": "4312", + "replaceId": "4140", + "fence": "false", + "metal": "false" + }, + { + "id": "4423", + "replaceId": "4429", + "fence": "false", + "metal": "false" + }, + { + "id": "4424", + "replaceId": "11382", + "fence": "false", + "metal": "false" + }, + { + "id": "4427", + "replaceId": "11380", + "fence": "false", + "metal": "false" + }, + { + "id": "4428", + "replaceId": "4430", + "fence": "false", + "metal": "false" + }, + { + "id": "4487", + "replaceId": "4492", + "fence": "false", + "metal": "false" + }, + { + "id": "4490", + "replaceId": "4491", + "fence": "false", + "metal": "false" + }, + { + "id": "4629", + "replaceId": "4630", + "fence": "false", + "metal": "false" + }, + { + "id": "4631", + "replaceId": "4630", + "fence": "false", + "metal": "false" + }, + { + "id": "4632", + "replaceId": "4634", + "fence": "false", + "metal": "false" + }, + { + "id": "4633", + "replaceId": "4634", + "fence": "false", + "metal": "false" + }, + { + "id": "4636", + "replaceId": "4639", + "fence": "false", + "metal": "false" + }, + { + "id": "4637", + "replaceId": "4639", + "fence": "false", + "metal": "false" + }, + { + "id": "4638", + "replaceId": "4639", + "fence": "false", + "metal": "false" + }, + { + "id": "4640", + "replaceId": "4639", + "fence": "false", + "metal": "false" + }, + { + "id": "4696", + "replaceId": "21343", + "fence": "false", + "metal": "false" + }, + { + "id": "4962", + "replaceId": "3271", + "fence": "false", + "metal": "false" + }, + { + "id": "4963", + "replaceId": "17092", + "fence": "false", + "metal": "false" + }, + { + "id": "4964", + "replaceId": "17094", + "fence": "false", + "metal": "false" + }, + { + "id": "5126", + "replaceId": "5128", + "fence": "false", + "metal": "false" + }, + { + "id": "5172", + "replaceId": "1545", + "fence": "false", + "metal": "true" + }, + { + "id": "5183", + "replaceId": "5188", + "fence": "false", + "metal": "false" + }, + { + "id": "5186", + "replaceId": "5187", + "fence": "false", + "metal": "false" + }, + { + "id": "5244", + "replaceId": "5245", + "fence": "false", + "metal": "false" + }, + { + "id": "5501", + "replaceId": "8821", + "fence": "false", + "metal": "true" + }, + { + "id": "5667", + "replaceId": "26207", + "fence": "false", + "metal": "false" + }, + { + "id": "5803", + "replaceId": "4173", + "fence": "false", + "metal": "false" + }, + { + "id": "5804", + "replaceId": "5132", + "fence": "false", + "metal": "false" + }, + { + "id": "5805", + "replaceId": "7435", + "fence": "false", + "metal": "false" + }, + { + "id": "5806", + "replaceId": "5268", + "fence": "false", + "metal": "false" + }, + { + "id": "6100", + "replaceId": "6101", + "fence": "false", + "metal": "false" + }, + { + "id": "6102", + "replaceId": "6103", + "fence": "false", + "metal": "false" + }, + { + "id": "6104", + "replaceId": "6105", + "fence": "false", + "metal": "false" + }, + { + "id": "6106", + "replaceId": "6107", + "fence": "false", + "metal": "false" + }, + { + "id": "6108", + "replaceId": "6107", + "fence": "false", + "metal": "false" + }, + { + "id": "6110", + "replaceId": "6111", + "fence": "false", + "metal": "false" + }, + { + "id": "6112", + "replaceId": "6113", + "fence": "false", + "metal": "false" + }, + { + "id": "6114", + "replaceId": "6113", + "fence": "false", + "metal": "false" + }, + { + "id": "6451", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "6452", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "6624", + "replaceId": "6626", + "fence": "false", + "metal": "false" + }, + { + "id": "6625", + "replaceId": "6627", + "fence": "false", + "metal": "false" + }, + { + "id": "6975", + "replaceId": "6976", + "fence": "false", + "metal": "false" + }, + { + "id": "6977", + "replaceId": "6109", + "fence": "false", + "metal": "false" + }, + { + "id": "7049", + "replaceId": "7051", + "fence": "false", + "metal": "false" + }, + { + "id": "7050", + "replaceId": "23919", + "fence": "true", + "metal": "false" + }, + { + "id": "7222", + "replaceId": "7260", + "fence": "false", + "metal": "false" + }, + { + "id": "7259", + "replaceId": "7260", + "fence": "false", + "metal": "false" + }, + { + "id": "7274", + "replaceId": "5245", + "fence": "false", + "metal": "false" + }, + { + "id": "7302", + "replaceId": "5245", + "fence": "false", + "metal": "false" + }, + { + "id": "7317", + "replaceId": "5245", + "fence": "false", + "metal": "false" + }, + { + "id": "7320", + "replaceId": "5245", + "fence": "false", + "metal": "false" + }, + { + "id": "7323", + "replaceId": "5245", + "fence": "false", + "metal": "false" + }, + { + "id": "7326", + "replaceId": "5245", + "fence": "false", + "metal": "false" + }, + { + "id": "7354", + "replaceId": "5245", + "fence": "false", + "metal": "false" + }, + { + "id": "7373", + "replaceId": "7374", + "fence": "false", + "metal": "false" + }, + { + "id": "8695", + "replaceId": "8696", + "fence": "false", + "metal": "false" + }, + { + "id": "8786", + "replaceId": "11708", + "fence": "false", + "metal": "false" + }, + { + "id": "8787", + "replaceId": "10261", + "fence": "false", + "metal": "false" + }, + { + "id": "8788", + "replaceId": "1545", + "fence": "false", + "metal": "true" + }, + { + "id": "8789", + "replaceId": "11710", + "fence": "false", + "metal": "false" + }, + { + "id": "8810", + "replaceId": "8812", + "fence": "false", + "metal": "false" + }, + { + "id": "8811", + "replaceId": "8813", + "fence": "true", + "metal": "false" + }, + { + "id": "8818", + "replaceId": "8819", + "fence": "false", + "metal": "false" + }, + { + "id": "8820", + "replaceId": "8821", + "fence": "false", + "metal": "true" + }, + { + "id": "9562", + "replaceId": "9564", + "fence": "false", + "metal": "true" + }, + { + "id": "9563", + "replaceId": "9564", + "fence": "false", + "metal": "true" + }, + { + "id": "10260", + "replaceId": "10261", + "fence": "false", + "metal": "false" + }, + { + "id": "10262", + "replaceId": "10263", + "fence": "false", + "metal": "false" + }, + { + "id": "10264", + "replaceId": "10265", + "fence": "false", + "metal": "false" + }, + { + "id": "10325", + "replaceId": "10327", + "fence": "false", + "metal": "false" + }, + { + "id": "10431", + "replaceId": "37996", + "fence": "false", + "metal": "false" + }, + { + "id": "10527", + "replaceId": "10528", + "fence": "false", + "metal": "false" + }, + { + "id": "10529", + "replaceId": "10530", + "fence": "false", + "metal": "false" + }, + { + "id": "11196", + "replaceId": "10327", + "fence": "false", + "metal": "false" + }, + { + "id": "11197", + "replaceId": "4639", + "fence": "false", + "metal": "false" + }, + { + "id": "11379", + "replaceId": "11380", + "fence": "false", + "metal": "false" + }, + { + "id": "11381", + "replaceId": "11380", + "fence": "false", + "metal": "false" + }, + { + "id": "11483", + "replaceId": "11708", + "fence": "false", + "metal": "false" + }, + { + "id": "11616", + "replaceId": "11617", + "fence": "false", + "metal": "false" + }, + { + "id": "11707", + "replaceId": "11708", + "fence": "false", + "metal": "false" + }, + { + "id": "11709", + "replaceId": "11710", + "fence": "false", + "metal": "false" + }, + { + "id": "11711", + "replaceId": "11710", + "fence": "false", + "metal": "false" + }, + { + "id": "11713", + "replaceId": "11712", + "fence": "false", + "metal": "false" + }, + { + "id": "11714", + "replaceId": "11715", + "fence": "false", + "metal": "false" + }, + { + "id": "11716", + "replaceId": "11722", + "fence": "false", + "metal": "false" + }, + { + "id": "11721", + "replaceId": "11723", + "fence": "false", + "metal": "false" + }, + { + "id": "11993", + "replaceId": "11994", + "fence": "false", + "metal": "false" + }, + { + "id": "12045", + "replaceId": "12046", + "fence": "false", + "metal": "false" + }, + { + "id": "12047", + "replaceId": "12048", + "fence": "false", + "metal": "false" + }, + { + "id": "12348", + "replaceId": "10327", + "fence": "false", + "metal": "false" + }, + { + "id": "12349", + "replaceId": "11382", + "fence": "false", + "metal": "false" + }, + { + "id": "12350", + "replaceId": "11382", + "fence": "false", + "metal": "false" + }, + { + "id": "12444", + "replaceId": "12445", + "fence": "false", + "metal": "false" + }, + { + "id": "12446", + "replaceId": "12447", + "fence": "false", + "metal": "false" + }, + { + "id": "12448", + "replaceId": "12449", + "fence": "false", + "metal": "false" + }, + { + "id": "12761", + "replaceId": "11617", + "fence": "false", + "metal": "false" + }, + { + "id": "12816", + "replaceId": "12988", + "fence": "false", + "metal": "false" + }, + { + "id": "12817", + "replaceId": "12989", + "fence": "false", + "metal": "false" + }, + { + "id": "12986", + "replaceId": "7051", + "fence": "true", + "metal": "false" + }, + { + "id": "12987", + "replaceId": "7052", + "fence": "true", + "metal": "false" + }, + { + "id": "13001", + "replaceId": "34353", + "fence": "false", + "metal": "false" + }, + { + "id": "13006", + "replaceId": "13008", + "fence": "false", + "metal": "false" + }, + { + "id": "13007", + "replaceId": "13009", + "fence": "false", + "metal": "false" + }, + { + "id": "13015", + "replaceId": "13018", + "fence": "false", + "metal": "false" + }, + { + "id": "13016", + "replaceId": "13017", + "fence": "false", + "metal": "false" + }, + { + "id": "13094", + "replaceId": "13095", + "fence": "false", + "metal": "false" + }, + { + "id": "13096", + "replaceId": "13097", + "fence": "false", + "metal": "false" + }, + { + "id": "13100", + "replaceId": "13103", + "fence": "false", + "metal": "false" + }, + { + "id": "13101", + "replaceId": "13102", + "fence": "false", + "metal": "false" + }, + { + "id": "13107", + "replaceId": "13108", + "fence": "false", + "metal": "false" + }, + { + "id": "13109", + "replaceId": "13110", + "fence": "false", + "metal": "false" + }, + { + "id": "13118", + "replaceId": "13120", + "fence": "false", + "metal": "false" + }, + { + "id": "13119", + "replaceId": "13121", + "fence": "false", + "metal": "false" + }, + { + "id": "13314", + "replaceId": "13315", + "fence": "false", + "metal": "false" + }, + { + "id": "13317", + "replaceId": "13318", + "fence": "false", + "metal": "true" + }, + { + "id": "13320", + "replaceId": "13321", + "fence": "false", + "metal": "true" + }, + { + "id": "13323", + "replaceId": "13324", + "fence": "false", + "metal": "true" + }, + { + "id": "13326", + "replaceId": "13327", + "fence": "false", + "metal": "false" + }, + { + "id": "13344", + "replaceId": "13350", + "fence": "false", + "metal": "false" + }, + { + "id": "13345", + "replaceId": "13351", + "fence": "false", + "metal": "false" + }, + { + "id": "13346", + "replaceId": "13352", + "fence": "false", + "metal": "true" + }, + { + "id": "13347", + "replaceId": "13353", + "fence": "false", + "metal": "true" + }, + { + "id": "13348", + "replaceId": "13354", + "fence": "false", + "metal": "true" + }, + { + "id": "13349", + "replaceId": "13355", + "fence": "false", + "metal": "true" + }, + { + "id": "14233", + "replaceId": "14234", + "fence": "true", + "metal": "false" + }, + { + "id": "14235", + "replaceId": "14236", + "fence": "true", + "metal": "false" + }, + { + "id": "14237", + "replaceId": "14238", + "fence": "true", + "metal": "false" + }, + { + "id": "14239", + "replaceId": "14240", + "fence": "true", + "metal": "false" + }, + { + "id": "14241", + "replaceId": "14242", + "fence": "true", + "metal": "false" + }, + { + "id": "14243", + "replaceId": "14244", + "fence": "true", + "metal": "false" + }, + { + "id": "14245", + "replaceId": "14248", + "fence": "true", + "metal": "false" + }, + { + "id": "14247", + "replaceId": "14246", + "fence": "true", + "metal": "false" + }, + { + "id": "14749", + "replaceId": "14750", + "fence": "false", + "metal": "false" + }, + { + "id": "14751", + "replaceId": "14754", + "fence": "false", + "metal": "false" + }, + { + "id": "14752", + "replaceId": "14753", + "fence": "false", + "metal": "false" + }, + { + "id": "14923", + "replaceId": "17115", + "fence": "false", + "metal": "false" + }, + { + "id": "14982", + "replaceId": "24930", + "fence": "false", + "metal": "false" + }, + { + "id": "15056", + "replaceId": "14924", + "fence": "false", + "metal": "false" + }, + { + "id": "15204", + "replaceId": "15205", + "fence": "false", + "metal": "false" + }, + { + "id": "15510", + "replaceId": "15511", + "fence": "true", + "metal": "false" + }, + { + "id": "15512", + "replaceId": "15513", + "fence": "true", + "metal": "false" + }, + { + "id": "15514", + "replaceId": "15515", + "fence": "true", + "metal": "false" + }, + { + "id": "15516", + "replaceId": "15517", + "fence": "true", + "metal": "false" + }, + { + "id": "15536", + "replaceId": "15535", + "fence": "false", + "metal": "false" + }, + { + "id": "15641", + "replaceId": "15642", + "fence": "false", + "metal": "false" + }, + { + "id": "15644", + "replaceId": "15645", + "fence": "false", + "metal": "false" + }, + { + "id": "15647", + "replaceId": "15648", + "fence": "false", + "metal": "false" + }, + { + "id": "15650", + "replaceId": "15645", + "fence": "false", + "metal": "false" + }, + { + "id": "15653", + "replaceId": "15654", + "fence": "false", + "metal": "false" + }, + { + "id": "15759", + "replaceId": "14750", + "fence": "false", + "metal": "false" + }, + { + "id": "16774", + "replaceId": "16777", + "fence": "false", + "metal": "false" + }, + { + "id": "16776", + "replaceId": "16777", + "fence": "false", + "metal": "false" + }, + { + "id": "16778", + "replaceId": "16779", + "fence": "false", + "metal": "false" + }, + { + "id": "17089", + "replaceId": "17090", + "fence": "false", + "metal": "false" + }, + { + "id": "17091", + "replaceId": "17092", + "fence": "false", + "metal": "false" + }, + { + "id": "17093", + "replaceId": "17092", + "fence": "false", + "metal": "false" + }, + { + "id": "17114", + "replaceId": "17115", + "fence": "false", + "metal": "false" + }, + { + "id": "17316", + "replaceId": "17317", + "fence": "false", + "metal": "false" + }, + { + "id": "17600", + "replaceId": "18031", + "fence": "false", + "metal": "false" + }, + { + "id": "17601", + "replaceId": "18032", + "fence": "false", + "metal": "false" + }, + { + "id": "17973", + "replaceId": "18031", + "fence": "false", + "metal": "false" + }, + { + "id": "18091", + "replaceId": "18032", + "fence": "false", + "metal": "false" + }, + { + "id": "18092", + "replaceId": "18032", + "fence": "false", + "metal": "false" + }, + { + "id": "18168", + "replaceId": "11617", + "fence": "false", + "metal": "false" + }, + { + "id": "18489", + "replaceId": "18490", + "fence": "false", + "metal": "true" + }, + { + "id": "18698", + "replaceId": "18699", + "fence": "false", + "metal": "false" + }, + { + "id": "18700", + "replaceId": "18701", + "fence": "false", + "metal": "false" + }, + { + "id": "20391", + "replaceId": "28518", + "fence": "false", + "metal": "true" + }, + { + "id": "21065", + "replaceId": "21161", + "fence": "false", + "metal": "false" + }, + { + "id": "21160", + "replaceId": "21161", + "fence": "false", + "metal": "false" + }, + { + "id": "21162", + "replaceId": "21161", + "fence": "false", + "metal": "false" + }, + { + "id": "21164", + "replaceId": "21161", + "fence": "false", + "metal": "false" + }, + { + "id": "21340", + "replaceId": "21342", + "fence": "false", + "metal": "false" + }, + { + "id": "21341", + "replaceId": "21342", + "fence": "false", + "metal": "false" + }, + { + "id": "21397", + "replaceId": "21398", + "fence": "false", + "metal": "true" + }, + { + "id": "21399", + "replaceId": "21402", + "fence": "false", + "metal": "true" + }, + { + "id": "21400", + "replaceId": "21401", + "fence": "false", + "metal": "true" + }, + { + "id": "21403", + "replaceId": "21404", + "fence": "true", + "metal": "true" + }, + { + "id": "21405", + "replaceId": "21406", + "fence": "true", + "metal": "true" + }, + { + "id": "21505", + "replaceId": "21506", + "fence": "false", + "metal": "false" + }, + { + "id": "21507", + "replaceId": "21508", + "fence": "false", + "metal": "false" + }, + { + "id": "21600", + "replaceId": "21601", + "fence": "false", + "metal": "false" + }, + { + "id": "22435", + "replaceId": "22436", + "fence": "false", + "metal": "false" + }, + { + "id": "22437", + "replaceId": "22438", + "fence": "false", + "metal": "false" + }, + { + "id": "22779", + "replaceId": "22778", + "fence": "false", + "metal": "false" + }, + { + "id": "22914", + "replaceId": "22913", + "fence": "false", + "metal": "false" + }, + { + "id": "22921", + "replaceId": "22920", + "fence": "false", + "metal": "true" + }, + { + "id": "23056", + "replaceId": "24685", + "fence": "false", + "metal": "false" + }, + { + "id": "23216", + "replaceId": "23217", + "fence": "true", + "metal": "true" + }, + { + "id": "23338", + "replaceId": "23339", + "fence": "false", + "metal": "false" + }, + { + "id": "23340", + "replaceId": "23341", + "fence": "false", + "metal": "false" + }, + { + "id": "23342", + "replaceId": "23343", + "fence": "false", + "metal": "false" + }, + { + "id": "23378", + "replaceId": "23339", + "fence": "false", + "metal": "false" + }, + { + "id": "23917", + "replaceId": "23918", + "fence": "true", + "metal": "false" + }, + { + "id": "24369", + "replaceId": "24373", + "fence": "true", + "metal": "false" + }, + { + "id": "24370", + "replaceId": "24374", + "fence": "true", + "metal": "false" + }, + { + "id": "24376", + "replaceId": "24377", + "fence": "false", + "metal": "false" + }, + { + "id": "24378", + "replaceId": "24377", + "fence": "false", + "metal": "false" + }, + { + "id": "24381", + "replaceId": "24379", + "fence": "false", + "metal": "false" + }, + { + "id": "24384", + "replaceId": "24383", + "fence": "false", + "metal": "false" + }, + { + "id": "24560", + "replaceId": "15515", + "fence": "false", + "metal": "false" + }, + { + "id": "24561", + "replaceId": "15517", + "fence": "false", + "metal": "false" + }, + { + "id": "24565", + "replaceId": "36316", + "fence": "false", + "metal": "false" + }, + { + "id": "24567", + "replaceId": "36318", + "fence": "false", + "metal": "false" + }, + { + "id": "24686", + "replaceId": "24685", + "fence": "false", + "metal": "false" + }, + { + "id": "24816", + "replaceId": "24815", + "fence": "false", + "metal": "false" + }, + { + "id": "24931", + "replaceId": "24930", + "fence": "false", + "metal": "false" + }, + { + "id": "24933", + "replaceId": "24932", + "fence": "false", + "metal": "false" + }, + { + "id": "24936", + "replaceId": "24935", + "fence": "false", + "metal": "false" + }, + { + "id": "25418", + "replaceId": "25417", + "fence": "false", + "metal": "false" + }, + { + "id": "25594", + "replaceId": "25639", + "fence": "false", + "metal": "false" + }, + { + "id": "25595", + "replaceId": "25639", + "fence": "false", + "metal": "false" + }, + { + "id": "25638", + "replaceId": "25639", + "fence": "false", + "metal": "false" + }, + { + "id": "25640", + "replaceId": "25641", + "fence": "false", + "metal": "false" + }, + { + "id": "25642", + "replaceId": "25643", + "fence": "false", + "metal": "false" + }, + { + "id": "25716", + "replaceId": "25717", + "fence": "false", + "metal": "false" + }, + { + "id": "25718", + "replaceId": "25719", + "fence": "false", + "metal": "false" + }, + { + "id": "25748", + "replaceId": "25791", + "fence": "false", + "metal": "false" + }, + { + "id": "25750", + "replaceId": "25789", + "fence": "false", + "metal": "false" + }, + { + "id": "25788", + "replaceId": "25641", + "fence": "false", + "metal": "false" + }, + { + "id": "25790", + "replaceId": "25639", + "fence": "false", + "metal": "false" + }, + { + "id": "25799", + "replaceId": "25800", + "fence": "false", + "metal": "false" + }, + { + "id": "25804", + "replaceId": "25805", + "fence": "false", + "metal": "false" + }, + { + "id": "25806", + "replaceId": "25807", + "fence": "false", + "metal": "false" + }, + { + "id": "25813", + "replaceId": "25816", + "fence": "false", + "metal": "false" + }, + { + "id": "25814", + "replaceId": "25815", + "fence": "false", + "metal": "false" + }, + { + "id": "25819", + "replaceId": "25820", + "fence": "false", + "metal": "false" + }, + { + "id": "25825", + "replaceId": "25826", + "fence": "false", + "metal": "false" + }, + { + "id": "25827", + "replaceId": "25828", + "fence": "false", + "metal": "false" + }, + { + "id": "25876", + "replaceId": "25877", + "fence": "false", + "metal": "true" + }, + { + "id": "26130", + "replaceId": "26132", + "fence": "false", + "metal": "false" + }, + { + "id": "26131", + "replaceId": "26133", + "fence": "false", + "metal": "true" + }, + { + "id": "26425", + "replaceId": "2521", + "fence": "false", + "metal": "false" + }, + { + "id": "26426", + "replaceId": "26852", + "fence": "false", + "metal": "false" + }, + { + "id": "26427", + "replaceId": "26851", + "fence": "false", + "metal": "false" + }, + { + "id": "26428", + "replaceId": "2520", + "fence": "false", + "metal": "false" + }, + { + "id": "26560", + "replaceId": "26561", + "fence": "false", + "metal": "true" + }, + { + "id": "26706", + "replaceId": "26707", + "fence": "false", + "metal": "true" + }, + { + "id": "26787", + "replaceId": "8821", + "fence": "false", + "metal": "false" + }, + { + "id": "26808", + "replaceId": "26916", + "fence": "false", + "metal": "false" + }, + { + "id": "26810", + "replaceId": "26916", + "fence": "false", + "metal": "false" + }, + { + "id": "26906", + "replaceId": "26907", + "fence": "false", + "metal": "false" + }, + { + "id": "26908", + "replaceId": "26909", + "fence": "false", + "metal": "false" + }, + { + "id": "26910", + "replaceId": "26911", + "fence": "false", + "metal": "false" + }, + { + "id": "26913", + "replaceId": "26914", + "fence": "false", + "metal": "false" + }, + { + "id": "26917", + "replaceId": "26916", + "fence": "false", + "metal": "false" + }, + { + "id": "27065", + "replaceId": "1561", + "fence": "true", + "metal": "true" + }, + { + "id": "27066", + "replaceId": "1561", + "fence": "false", + "metal": "true" + }, + { + "id": "27846", + "replaceId": "27851", + "fence": "false", + "metal": "false" + }, + { + "id": "27848", + "replaceId": "27853", + "fence": "true", + "metal": "false" + }, + { + "id": "27852", + "replaceId": "27851", + "fence": "true", + "metal": "false" + }, + { + "id": "27854", + "replaceId": "27853", + "fence": "false", + "metal": "false" + }, + { + "id": "27988", + "replaceId": "27989", + "fence": "false", + "metal": "false" + }, + { + "id": "28407", + "replaceId": "28408", + "fence": "false", + "metal": "false" + }, + { + "id": "28409", + "replaceId": "28410", + "fence": "false", + "metal": "false" + }, + { + "id": "28514", + "replaceId": "28518", + "fence": "true", + "metal": "true" + }, + { + "id": "28589", + "replaceId": "28588", + "fence": "false", + "metal": "false" + }, + { + "id": "28690", + "replaceId": "28692", + "fence": "false", + "metal": "true" + }, + { + "id": "28691", + "replaceId": "28693", + "fence": "false", + "metal": "true" + }, + { + "id": "29261", + "replaceId": "29262", + "fence": "false", + "metal": "true" + }, + { + "id": "29315", + "replaceId": "29317", + "fence": "false", + "metal": "true" + }, + { + "id": "29316", + "replaceId": "29322", + "fence": "false", + "metal": "true" + }, + { + "id": "29319", + "replaceId": "29318", + "fence": "false", + "metal": "true" + }, + { + "id": "29320", + "replaceId": "29321", + "fence": "false", + "metal": "true" + }, + { + "id": "29575", + "replaceId": "30865", + "fence": "false", + "metal": "false" + }, + { + "id": "29732", + "replaceId": "30865", + "fence": "false", + "metal": "false" + }, + { + "id": "30116", + "replaceId": "30117", + "fence": "true", + "metal": "false" + }, + { + "id": "30118", + "replaceId": "30119", + "fence": "true", + "metal": "false" + }, + { + "id": "30120", + "replaceId": "30121", + "fence": "true", + "metal": "false" + }, + { + "id": "30122", + "replaceId": "30123", + "fence": "true", + "metal": "false" + }, + { + "id": "30124", + "replaceId": "30125", + "fence": "true", + "metal": "false" + }, + { + "id": "30126", + "replaceId": "30127", + "fence": "true", + "metal": "false" + }, + { + "id": "30128", + "replaceId": "30129", + "fence": "true", + "metal": "false" + }, + { + "id": "30130", + "replaceId": "30131", + "fence": "true", + "metal": "false" + }, + { + "id": "30503", + "replaceId": "18031", + "fence": "false", + "metal": "false" + }, + { + "id": "30864", + "replaceId": "30865", + "fence": "false", + "metal": "false" + }, + { + "id": "31340", + "replaceId": "31341", + "fence": "false", + "metal": "false" + }, + { + "id": "31342", + "replaceId": "31343", + "fence": "false", + "metal": "false" + }, + { + "id": "31534", + "replaceId": "31535", + "fence": "false", + "metal": "true" + }, + { + "id": "31808", + "replaceId": "31809", + "fence": "false", + "metal": "false" + }, + { + "id": "31811", + "replaceId": "31812", + "fence": "false", + "metal": "false" + }, + { + "id": "31814", + "replaceId": "31816", + "fence": "false", + "metal": "false" + }, + { + "id": "31815", + "replaceId": "31816", + "fence": "false", + "metal": "false" + }, + { + "id": "31818", + "replaceId": "31816", + "fence": "false", + "metal": "false" + }, + { + "id": "31819", + "replaceId": "31817", + "fence": "false", + "metal": "false" + }, + { + "id": "31820", + "replaceId": "31821", + "fence": "false", + "metal": "false" + }, + { + "id": "31822", + "replaceId": "31823", + "fence": "false", + "metal": "false" + }, + { + "id": "31825", + "replaceId": "31824", + "fence": "false", + "metal": "false" + }, + { + "id": "31827", + "replaceId": "31826", + "fence": "false", + "metal": "false" + }, + { + "id": "31830", + "replaceId": "31829", + "fence": "false", + "metal": "true" + }, + { + "id": "31832", + "replaceId": "31831", + "fence": "false", + "metal": "true" + }, + { + "id": "31838", + "replaceId": "31839", + "fence": "false", + "metal": "true" + }, + { + "id": "31841", + "replaceId": "31842", + "fence": "false", + "metal": "false" + }, + { + "id": "31844", + "replaceId": "31845", + "fence": "false", + "metal": "true" + }, + { + "id": "33060", + "replaceId": "31828", + "fence": "false", + "metal": "false" + }, + { + "id": "34005", + "replaceId": "31845", + "fence": "false", + "metal": "true" + }, + { + "id": "34042", + "replaceId": "34043", + "fence": "false", + "metal": "true" + }, + { + "id": "34044", + "replaceId": "34045", + "fence": "false", + "metal": "false" + }, + { + "id": "34046", + "replaceId": "6115", + "fence": "false", + "metal": "true" + }, + { + "id": "34234", + "replaceId": "34808", + "fence": "false", + "metal": "false" + }, + { + "id": "34312", + "replaceId": "34313", + "fence": "false", + "metal": "false" + }, + { + "id": "34354", + "replaceId": "34353", + "fence": "false", + "metal": "false" + }, + { + "id": "34779", + "replaceId": "34777", + "fence": "true", + "metal": "false" + }, + { + "id": "34780", + "replaceId": "34778", + "fence": "false", + "metal": "false" + }, + { + "id": "34805", + "replaceId": "34808", + "fence": "false", + "metal": "false" + }, + { + "id": "34806", + "replaceId": "34808", + "fence": "false", + "metal": "false" + }, + { + "id": "34807", + "replaceId": "34808", + "fence": "false", + "metal": "false" + }, + { + "id": "34809", + "replaceId": "34808", + "fence": "false", + "metal": "false" + }, + { + "id": "34811", + "replaceId": "34813", + "fence": "false", + "metal": "false" + }, + { + "id": "34812", + "replaceId": "34813", + "fence": "false", + "metal": "false" + }, + { + "id": "34816", + "replaceId": "34818", + "fence": "false", + "metal": "false" + }, + { + "id": "34817", + "replaceId": "34813", + "fence": "false", + "metal": "false" + }, + { + "id": "34819", + "replaceId": "34820", + "fence": "false", + "metal": "false" + }, + { + "id": "34822", + "replaceId": "34823", + "fence": "false", + "metal": "false" + }, + { + "id": "34825", + "replaceId": "34826", + "fence": "false", + "metal": "false" + }, + { + "id": "34827", + "replaceId": "34828", + "fence": "false", + "metal": "false" + }, + { + "id": "35241", + "replaceId": "35242", + "fence": "false", + "metal": "false" + }, + { + "id": "35243", + "replaceId": "15651", + "fence": "false", + "metal": "false" + }, + { + "id": "35540", + "replaceId": "35541", + "fence": "false", + "metal": "false" + }, + { + "id": "35630", + "replaceId": "35631", + "fence": "false", + "metal": "false" + }, + { + "id": "35991", + "replaceId": "36021", + "fence": "false", + "metal": "false" + }, + { + "id": "36022", + "replaceId": "36021", + "fence": "false", + "metal": "false" + }, + { + "id": "36315", + "replaceId": "36342", + "fence": "false", + "metal": "false" + }, + { + "id": "36317", + "replaceId": "36340", + "fence": "false", + "metal": "false" + }, + { + "id": "36320", + "replaceId": "36319", + "fence": "false", + "metal": "false" + }, + { + "id": "36339", + "replaceId": "36358", + "fence": "false", + "metal": "false" + }, + { + "id": "36341", + "replaceId": "36356", + "fence": "false", + "metal": "false" + }, + { + "id": "36344", + "replaceId": "36343", + "fence": "false", + "metal": "false" + }, + { + "id": "36355", + "replaceId": "36356", + "fence": "false", + "metal": "false" + }, + { + "id": "36357", + "replaceId": "36356", + "fence": "false", + "metal": "false" + }, + { + "id": "36360", + "replaceId": "36359", + "fence": "false", + "metal": "false" + }, + { + "id": "36844", + "replaceId": "36845", + "fence": "false", + "metal": "false" + }, + { + "id": "36846", + "replaceId": "36848", + "fence": "false", + "metal": "false" + }, + { + "id": "36847", + "replaceId": "36848", + "fence": "false", + "metal": "false" + }, + { + "id": "36851", + "replaceId": "36853", + "fence": "false", + "metal": "false" + }, + { + "id": "36852", + "replaceId": "36853", + "fence": "false", + "metal": "false" + }, + { + "id": "36856", + "replaceId": "36858", + "fence": "false", + "metal": "false" + }, + { + "id": "36857", + "replaceId": "36859", + "fence": "false", + "metal": "false" + }, + { + "id": "36862", + "replaceId": "36864", + "fence": "false", + "metal": "false" + }, + { + "id": "36863", + "replaceId": "36864", + "fence": "false", + "metal": "false" + }, + { + "id": "36913", + "replaceId": "36912", + "fence": "true", + "metal": "false" + }, + { + "id": "36915", + "replaceId": "36914", + "fence": "true", + "metal": "false" + }, + { + "id": "36917", + "replaceId": "36916", + "fence": "true", + "metal": "false" + }, + { + "id": "36919", + "replaceId": "36918", + "fence": "true", + "metal": "false" + }, + { + "id": "36999", + "replaceId": "37000", + "fence": "false", + "metal": "false" + }, + { + "id": "37002", + "replaceId": "37003", + "fence": "false", + "metal": "false" + }, + { + "id": "37352", + "replaceId": "37351", + "fence": "true", + "metal": "false" + }, + { + "id": "37354", + "replaceId": "37353", + "fence": "false", + "metal": "false" + }, + { + "id": "37995", + "replaceId": "37996", + "fence": "false", + "metal": "false" + }, + { + "id": "38124", + "replaceId": "38123", + "fence": "false", + "metal": "false" + }, + { + "id": "38141", + "replaceId": "38142", + "fence": "false", + "metal": "false" + } +] diff --git a/Server/data/configs/drop_tables.json b/Server/data/configs/drop_tables.json new file mode 100644 index 000000000..fa67815c4 --- /dev/null +++ b/Server/data/configs/drop_tables.json @@ -0,0 +1,64094 @@ +[ + { + "ids": "0", + "main": [], + "charm": [], + "default": [] + }, + { + "ids": "1,2,3,16,24,170,351,359,663,726,727,728,729,730,1086,2675,3223,3224,3225,3915,5923", + "main": [ + { + "minAmount": "7", + "weight": "25", + "id": "555", + "maxAmount": "7" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "2", + "weight": "5", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "7", + "weight": "5", + "id": "559", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "877", + "maxAmount": "12" + }, + { + "minAmount": "7", + "weight": "25", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2699", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "4,5,6,25,352,353,354,360,361,362,363,2776,3226,3227,5924", + "main": [ + { + "minAmount": "7", + "weight": "50", + "id": "877", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "25", + "id": "882", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "25", + "id": "555", + "maxAmount": "7" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "2", + "weight": "5", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "7", + "weight": "5", + "id": "559", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "400" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2703", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "7,1377,1757,1758,1759,1760,1761,7128,7129,7130", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "5345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5329", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5331", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5323", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5322", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5321", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "12148", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "556", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "25", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "3", + "weight": "25", + "id": "877", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5320", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2678", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "15" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "8,282,2674,2696,5926,5927,5928,5929", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "882", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "877", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "877", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "863", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "562", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "557", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "554", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "558", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2747", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "436", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "9,32,206,296,297,298,299,344,345,346,368,678,812,887,1142,1143,1144,1145,1146,1147,1148,1149,1150,1296,1297,1374,1805,1806,2699,2700,2701,2702,2703,2704,2705,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,3228,3229,3230,3231,3232,3233,3241,3407,3408,3715,3941,3942,4257,4258,4259,4260,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,4311,4336,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5489,5490,5491,5492,5800,5801,5919,5920,6183,6184,6190,6498,6499,6500,6501,6502,6503,7142", + "main": [ + { + "minAmount": "4", + "weight": "50", + "id": "5318", + "maxAmount": "6" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5322", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5323", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5321", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "50", + "id": "556", + "maxAmount": "6" + }, + { + "minAmount": "3", + "weight": "50", + "id": "557", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "50", + "id": "554", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1458", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "561", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "50", + "id": "884", + "maxAmount": "12" + }, + { + "minAmount": "2", + "weight": "50", + "id": "9140", + "maxAmount": "18" + }, + { + "minAmount": "125", + "weight": "25", + "id": "882", + "maxAmount": "125" + }, + { + "minAmount": "1", + "weight": "25", + "id": "886", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "50", + "id": "1987", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1947", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "5", + "id": "1947", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2857", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "173", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "12,3246,3247,3248,3249,3250,3251,3252,3253,3255,3256,3257,3258,3259,3260,3261,3262,3263,5909", + "main": [ + { + "minAmount": "2", + "weight": "25", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "4510", + "weight": "25", + "id": "558", + "maxAmount": "4510" + }, + { + "minAmount": "5", + "weight": "25", + "id": "554", + "maxAmount": "5" + }, + { + "minAmount": "8", + "weight": "25", + "id": "554", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1375", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "882", + "maxAmount": "18" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1420", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "884", + "maxAmount": "8" + }, + { + "minAmount": "58", + "weight": "50", + "id": "995", + "maxAmount": "315" + }, + { + "minAmount": "1", + "weight": "50", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2142", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "948", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "9004", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1595", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2714", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "956", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2677", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "13,652,1263,5195,5196,5197", + "main": [ + { + "minAmount": "5", + "weight": "50", + "id": "556", + "maxAmount": "5" + }, + { + "minAmount": "12", + "weight": "50", + "id": "556", + "maxAmount": "12" + }, + { + "minAmount": "5", + "weight": "50", + "id": "554", + "maxAmount": "5" + }, + { + "minAmount": "12", + "weight": "50", + "id": "554", + "maxAmount": "12" + }, + { + "minAmount": "5", + "weight": "50", + "id": "555", + "maxAmount": "5" + }, + { + "minAmount": "12", + "weight": "50", + "id": "555", + "maxAmount": "12" + }, + { + "minAmount": "5", + "weight": "50", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "12", + "weight": "50", + "id": "557", + "maxAmount": "12" + }, + { + "minAmount": "5", + "weight": "50", + "id": "559", + "maxAmount": "5" + }, + { + "minAmount": "12", + "weight": "50", + "id": "559", + "maxAmount": "12" + }, + { + "minAmount": "5", + "weight": "50", + "id": "558", + "maxAmount": "5" + }, + { + "minAmount": "12", + "weight": "50", + "id": "558", + "maxAmount": "12" + }, + { + "minAmount": "2", + "weight": "5", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "10", + "weight": "5", + "id": "562", + "maxAmount": "10" + }, + { + "minAmount": "2", + "weight": "5", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "579", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "577", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "579", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "15", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "18", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "556", + "maxAmount": "1" + }, + { + "minAmount": "9", + "weight": "50", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "6", + "weight": "50", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "4", + "weight": "50", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "5", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "50", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "50", + "id": "877", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1137", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "50", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2683", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "19,1092,3348,3349,3350", + "main": [ + { + "minAmount": "20", + "weight": "50", + "id": "555", + "maxAmount": "47" + }, + { + "minAmount": "9", + "weight": "50", + "id": "559", + "maxAmount": "24" + }, + { + "minAmount": "5", + "weight": "50", + "id": "558", + "maxAmount": "5" + }, + { + "minAmount": "7", + "weight": "50", + "id": "558", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "5" + }, + { + "minAmount": "4", + "weight": "25", + "id": "561", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "565", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "888", + "maxAmount": "5" + }, + { + "minAmount": "7", + "weight": "50", + "id": "888", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "25", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "7", + "weight": "25", + "id": "890", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "5321", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5323", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "200" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1933", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2335", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2351", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "20,365,2256", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "50", + "id": "555", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "2" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1458", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2833", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "21", + "main": [ + { + "minAmount": "200", + "weight": "50", + "id": "995", + "maxAmount": "200" + }, + { + "minAmount": "300", + "weight": "50", + "id": "995", + "maxAmount": "300" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "569", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1601", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "23,26", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2703", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "38,39,675", + "main": [ + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "56" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "41,288,951,1017,1401,1402,2313,2314,2315", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2138", + "maxAmount": "1" + }, + { + "minAmount": "11", + "weight": "50", + "id": "314", + "maxAmount": "30" + } + ] + }, + { + "ids": "49,3586,6210", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "2727", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "50,2642", + "description": "King Black Dragon", + "main": [ + { + "minAmount": "1", + "weight": "125", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "125", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "300", + "weight": "125", + "id": "554", + "maxAmount": "300" + }, + { + "minAmount": "300", + "weight": "125", + "id": "556", + "maxAmount": "300" + }, + { + "minAmount": "30", + "weight": "50", + "id": "565", + "maxAmount": "30" + }, + { + "minAmount": "50", + "weight": "50", + "id": "560", + "maxAmount": "50" + }, + { + "minAmount": "30", + "weight": "75", + "id": "563", + "maxAmount": "50" + }, + { + "minAmount": "690", + "weight": "100", + "id": "884", + "maxAmount": "690" + }, + { + "minAmount": "10", + "weight": "50", + "id": "9144", + "maxAmount": "25" + }, + { + "minAmount": "5", + "weight": "100", + "id": "11232", + "maxAmount": "14" + }, + { + "minAmount": "1", + "weight": "75", + "id": "11237", + "maxAmount": "14" + }, + { + "minAmount": "1", + "weight": "75", + "id": "1737", + "maxAmount": "1" + }, + { + "minAmount": "150", + "weight": "75", + "id": "1516", + "maxAmount": "150" + }, + { + "minAmount": "4", + "weight": "125", + "id": "385", + "maxAmount": "4" + }, + { + "minAmount": "100", + "weight": "100", + "id": "445", + "maxAmount": "100" + }, + { + "minAmount": "3", + "weight": "50", + "id": "9431", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2361", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11286", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1747", + "maxAmount": "1" + } + ] + }, + { + "ids": "52,4665,4666", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "534", + "maxAmount": "1" + } + ] + }, + { + "ids": "53,4669,4670,4671,4672", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1315", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "50", + "id": "828", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1369", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "892", + "maxAmount": "4" + }, + { + "minAmount": "8", + "weight": "25", + "id": "811", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "563", + "maxAmount": "4" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "50", + "id": "995", + "maxAmount": "690" + }, + { + "minAmount": "3", + "weight": "25", + "id": "1897", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2727", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1749", + "maxAmount": "1" + } + ] + }, + { + "ids": "54,4673,4674,4675,4676", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1369", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1315", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "16", + "weight": "50", + "id": "810", + "maxAmount": "16" + }, + { + "minAmount": "30", + "weight": "50", + "id": "829", + "maxAmount": "30" + }, + { + "minAmount": "2", + "weight": "25", + "id": "868", + "maxAmount": "2" + }, + { + "minAmount": "10", + "weight": "25", + "id": "811", + "maxAmount": "10" + }, + { + "minAmount": "75", + "weight": "5", + "id": "556", + "maxAmount": "75" + }, + { + "minAmount": "15", + "weight": "5", + "id": "565", + "maxAmount": "15" + }, + { + "minAmount": "45", + "weight": "5", + "id": "560", + "maxAmount": "45" + }, + { + "minAmount": "50", + "weight": "5", + "id": "554", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "5", + "id": "563", + "maxAmount": "12" + }, + { + "minAmount": "45", + "weight": "5", + "id": "563", + "maxAmount": "45" + }, + { + "minAmount": "67", + "weight": "5", + "id": "561", + "maxAmount": "79" + }, + { + "minAmount": "90", + "weight": "5", + "id": "562", + "maxAmount": "90" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2361", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "129", + "weight": "50", + "id": "995", + "maxAmount": "3000" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1897", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12480", + "maxAmount": "1" + }, + { + "minAmount": "129", + "weight": "1", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11286", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1747", + "maxAmount": "1" + } + ] + }, + { + "ids": "55,4681,4682,4683,4684,5178", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "75", + "weight": "50", + "id": "555", + "maxAmount": "75" + }, + { + "minAmount": "15", + "weight": "25", + "id": "561", + "maxAmount": "15" + }, + { + "minAmount": "37", + "weight": "25", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "5", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "11", + "weight": "50", + "id": "995", + "maxAmount": "454" + }, + { + "minAmount": "1", + "weight": "25", + "id": "449", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2735", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1751", + "maxAmount": "1" + } + ] + }, + { + "ids": "59,60,4400", + "main": [ + { + "minAmount": "4", + "weight": "25", + "id": "556", + "maxAmount": "6" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "7", + "weight": "25", + "id": "559", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "25", + "id": "877", + "maxAmount": "8" + }, + { + "minAmount": "4", + "weight": "25", + "id": "882", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "5", + "id": "839", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1189", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2307", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "1955", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1009", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "229", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "61,1004,1221,1473,1474,4401,7207", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "62,1478,2491,2492,6376,6377", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "808", + "maxAmount": "1" + }, + { + "minAmount": "13", + "weight": "25", + "id": "557", + "maxAmount": "13" + }, + { + "minAmount": "20", + "weight": "25", + "id": "9141", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11766", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11767", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11768", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11769", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11764", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "63", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "64", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "71", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1307", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3190", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1375", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "807", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1155", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1075", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1101", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2689", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2731", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "73,74,75,76,419,420,421,422,423,424,1826,2714,2863,2866,2869,2878,3622,4392,4393,4394,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5375,5376,5377,5378,5379,5380,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,6099,6100,6131", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1189", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1420", + "maxAmount": "1" + }, + { + "minAmount": "58", + "weight": "25", + "id": "884", + "maxAmount": "58" + }, + { + "minAmount": "5", + "weight": "50", + "id": "886", + "maxAmount": "32" + }, + { + "minAmount": "12", + "weight": "25", + "id": "888", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "559", + "maxAmount": "11" + }, + { + "minAmount": "4", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "556", + "maxAmount": "3" + }, + { + "minAmount": "7", + "weight": "25", + "id": "554", + "maxAmount": "84" + }, + { + "minAmount": "5", + "weight": "25", + "id": "558", + "maxAmount": "7" + }, + { + "minAmount": "5", + "weight": "25", + "id": "561", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6476", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7863", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "82" + }, + { + "minAmount": "5", + "weight": "50", + "id": "313", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "966", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1594", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2331", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "77", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "78,1005,2482,3711", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7829", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "530", + "maxAmount": "1" + } + ] + }, + { + "ids": "81,397,955,1767,3309", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2132", + "maxAmount": "1" + } + ] + }, + { + "ids": "82,4694,4695,4696,4697,6101", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1195", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "554", + "maxAmount": "120" + }, + { + "minAmount": "6", + "weight": "25", + "id": "562", + "maxAmount": "24" + }, + { + "minAmount": "3", + "weight": "5", + "id": "560", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "630" + }, + { + "minAmount": "1", + "weight": "25", + "id": "445", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2831", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "83,4698,4699,4700,4701", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1073", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1317", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "630" + }, + { + "minAmount": "75", + "weight": "50", + "id": "554", + "maxAmount": "75" + }, + { + "minAmount": "15", + "weight": "50", + "id": "562", + "maxAmount": "15" + }, + { + "minAmount": "5", + "weight": "50", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "25", + "id": "1734", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "84,677,4702,4703,4704,4705", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1283", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "50", + "id": "556", + "maxAmount": "75" + }, + { + "minAmount": "7", + "weight": "25", + "id": "565", + "maxAmount": "7" + }, + { + "minAmount": "37", + "weight": "50", + "id": "554", + "maxAmount": "40" + }, + { + "minAmount": "10", + "weight": "50", + "id": "562", + "maxAmount": "10" + }, + { + "minAmount": "3", + "weight": "5", + "id": "563", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "5", + "id": "454", + "maxAmount": "20" + }, + { + "minAmount": "132", + "weight": "50", + "id": "995", + "maxAmount": "1100" + }, + { + "minAmount": "1", + "weight": "25", + "id": "379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "133", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "86,87,446,950,4395,4922,4923,4924,4925,4926,4927,4942,4943,4944,4945", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2134", + "maxAmount": "1" + } + ] + }, + { + "ids": "88,224,4928,4929,4936,4937", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "2134", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "89,987", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7821", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "237", + "maxAmount": "1" + } + ] + }, + { + "ids": "90,91,92,93,459,1471,2036,2037,2715,3151,3291,3581,4384,4385,4386,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5365,5366,5367,5368,5381,5385,5386,5387,5388,5389,5390,5391,5392,5411,5412,5422,6091,6092,6093,6764,6765,6766,6767,6768", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1137", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "882", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1420", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "884", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "25", + "id": "884", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "886", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "50", + "id": "556", + "maxAmount": "15" + }, + { + "minAmount": "2", + "weight": "50", + "id": "555", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "50", + "id": "557", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "50", + "id": "554", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "558", + "maxAmount": "25" + }, + { + "minAmount": "3", + "weight": "25", + "id": "562", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "560", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "65" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1925", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1947", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2853", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3036", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "175", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "155", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "94,3844,3850,3851", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1013", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "50", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "27", + "weight": "50", + "id": "995", + "maxAmount": "434" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1625", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1934", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2351", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "5", + "id": "532", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "95,142,1330,4413,4414,6047,6048,6049", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7830", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2859", + "maxAmount": "1" + } + ] + }, + { + "ids": "96,97", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "2859", + "maxAmount": "1" + } + ] + }, + { + "ids": "99,3582,6374", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "100,101,102,444,445,1769,1770,1771,1772,1773,1774,1775,1776,2274,2275,2276,2277,2278,2279,2280,2281,2678,2679,2680,2681,3264,3265,3266,3267,3726,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4407,4408,4409,4410,4411,4412,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4499,4633,4634,4635,4636,4637,5855,5856,6125,6126,6132,6133,6279,6280,6281,6282,6283,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6490,6491,6492,6493,6494,6495,7964", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "16", + "weight": "50", + "id": "882", + "maxAmount": "16" + }, + { + "minAmount": "8", + "weight": "50", + "id": "877", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1237", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1173", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1103", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1155", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1189", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1277", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1009", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "884", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "5", + "id": "825", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1153", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2307", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2138", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "556", + "maxAmount": "10" + }, + { + "minAmount": "27", + "weight": "50", + "id": "559", + "maxAmount": "27" + }, + { + "minAmount": "4", + "weight": "5", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "50", + "id": "555", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "25", + "id": "558", + "maxAmount": "19" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "562", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "561", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1949", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "50", + "id": "288", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1987", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10999", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7812", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9057", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9054", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2703", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "438", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "105,1195", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7815", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "948", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2136", + "maxAmount": "1" + } + ] + }, + { + "ids": "106", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7815", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "948", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2136", + "maxAmount": "1" + } + ] + }, + { + "ids": "110,1582,1583,1584,1585,1586,7003,7004", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1393", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "25", + "id": "892", + "maxAmount": "42" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "37", + "weight": "50", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "50", + "weight": "50", + "id": "554", + "maxAmount": "50" + }, + { + "minAmount": "150", + "weight": "50", + "id": "554", + "maxAmount": "150" + }, + { + "minAmount": "5", + "weight": "25", + "id": "562", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "565", + "maxAmount": "5" + }, + { + "minAmount": "24", + "weight": "25", + "id": "563", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "15" + }, + { + "minAmount": "25", + "weight": "50", + "id": "995", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7872", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "117", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "987", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "111,3072,4685,4686,4687", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1067", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1195", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1428", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "50", + "id": "555", + "maxAmount": "12" + }, + { + "minAmount": "24", + "weight": "50", + "id": "558", + "maxAmount": "24" + }, + { + "minAmount": "37", + "weight": "50", + "id": "559", + "maxAmount": "37" + }, + { + "minAmount": "2", + "weight": "50", + "id": "564", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "6", + "weight": "25", + "id": "561", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "5", + "id": "560", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "5", + "id": "565", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "450" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7875", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1963", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2829", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "112,1587,1588,1681,4534,4688,4706", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1389", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1285", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "50", + "id": "886", + "maxAmount": "30" + }, + { + "minAmount": "15", + "weight": "50", + "id": "884", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1287", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1179", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1193", + "maxAmount": "1" + }, + { + "minAmount": "18", + "weight": "50", + "id": "556", + "maxAmount": "18" + }, + { + "minAmount": "3", + "weight": "50", + "id": "564", + "maxAmount": "3" + }, + { + "minAmount": "27", + "weight": "50", + "id": "557", + "maxAmount": "27" + }, + { + "minAmount": "6", + "weight": "50", + "id": "561", + "maxAmount": "6" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "25", + "id": "562", + "maxAmount": "7" + }, + { + "minAmount": "13", + "weight": "5", + "id": "560", + "maxAmount": "13" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4206", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "500" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7871", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1969", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "113,6268", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1237", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1239", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "827", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "50", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "50", + "id": "561", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1533", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1525", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "2114", + "maxAmount": "2" + }, + { + "minAmount": "22", + "weight": "50", + "id": "6306", + "maxAmount": "22" + }, + { + "minAmount": "22", + "weight": "50", + "id": "995", + "maxAmount": "22" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7847", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "532", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "526", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1963", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2843", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3125", + "maxAmount": "1" + } + ] + }, + { + "ids": "114", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7844", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "115,374,2801,3419", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7844", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "116,4291,4292,6078,6079,6080,6081,6269,6270", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1424", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1283", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1217", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "869", + "maxAmount": "19" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1430", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1317", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "5", + "id": "886", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1101", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1153", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "5", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "5", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "558", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "5", + "id": "558", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "5", + "id": "564", + "maxAmount": "3" + }, + { + "minAmount": "7", + "weight": "5", + "id": "555", + "maxAmount": "7" + }, + { + "minAmount": "15", + "weight": "5", + "id": "554", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5101", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5318", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "5309", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "473" + }, + { + "minAmount": "1", + "weight": "50", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2737", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "2" + } + ] + }, + { + "ids": "117,4689,4690,4691,4692,4693", + "main": [ + { + "minAmount": "3", + "weight": "50", + "id": "884", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1153", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "886", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "888", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "7", + "weight": "50", + "id": "555", + "maxAmount": "7" + }, + { + "minAmount": "15", + "weight": "50", + "id": "554", + "maxAmount": "15" + }, + { + "minAmount": "2", + "weight": "50", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "6", + "weight": "25", + "id": "561", + "maxAmount": "6" + }, + { + "minAmount": "3", + "weight": "50", + "id": "558", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5306", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "8", + "weight": "50", + "id": "5319", + "maxAmount": "8" + }, + { + "minAmount": "2", + "weight": "50", + "id": "5323", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "5307", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5321", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5308", + "maxAmount": "3" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "50", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "118,120,121,382,582,3219,3220,3221,3268,3269,3270,3271,3272,3273,3274,3275,3294,3295,4316,5880,5881,5882,5883,5884,5885", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1265", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1267", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1375", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1363", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "877", + "maxAmount": "2" + }, + { + "minAmount": "11", + "weight": "25", + "id": "877", + "maxAmount": "11" + }, + { + "minAmount": "4", + "weight": "50", + "id": "995", + "maxAmount": "4" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1913", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "119,2423", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "10" + }, + { + "minAmount": "12", + "weight": "50", + "id": "556", + "maxAmount": "12" + }, + { + "minAmount": "24", + "weight": "50", + "id": "556", + "maxAmount": "24" + }, + { + "minAmount": "37", + "weight": "50", + "id": "558", + "maxAmount": "37" + }, + { + "minAmount": "3", + "weight": "50", + "id": "564", + "maxAmount": "3" + }, + { + "minAmount": "6", + "weight": "50", + "id": "564", + "maxAmount": "6" + }, + { + "minAmount": "10", + "weight": "25", + "id": "562", + "maxAmount": "10" + }, + { + "minAmount": "37", + "weight": "25", + "id": "562", + "maxAmount": "37" + }, + { + "minAmount": "9", + "weight": "25", + "id": "561", + "maxAmount": "9" + }, + { + "minAmount": "18", + "weight": "25", + "id": "561", + "maxAmount": "18" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "6", + "weight": "25", + "id": "563", + "maxAmount": "6" + }, + { + "minAmount": "3", + "weight": "5", + "id": "560", + "maxAmount": "3" + }, + { + "minAmount": "6", + "weight": "5", + "id": "560", + "maxAmount": "6" + }, + { + "minAmount": "25", + "weight": "50", + "id": "995", + "maxAmount": "25" + }, + { + "minAmount": "47", + "weight": "50", + "id": "995", + "maxAmount": "47" + }, + { + "minAmount": "1", + "weight": "50", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "991", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1985", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1982", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "122,123,2685,2686,2687,2688,3583,4898,6275", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1237", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "826", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1241", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "555", + "maxAmount": "2" + }, + { + "minAmount": "6", + "weight": "25", + "id": "559", + "maxAmount": "6" + }, + { + "minAmount": "7", + "weight": "25", + "id": "554", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "25", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5318", + "maxAmount": "8" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5323", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5306", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "288", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "25", + "id": "6306", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "124", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "50", + "id": "557", + "maxAmount": "12" + }, + { + "minAmount": "60", + "weight": "50", + "id": "557", + "maxAmount": "60" + }, + { + "minAmount": "2", + "weight": "50", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "50", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "6", + "weight": "50", + "id": "561", + "maxAmount": "6" + }, + { + "minAmount": "3", + "weight": "25", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "45", + "weight": "5", + "id": "556", + "maxAmount": "45" + }, + { + "minAmount": "6", + "weight": "5", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "12" + }, + { + "minAmount": "24", + "weight": "50", + "id": "995", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1385", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1241", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6808", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "125,145,3073", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1363", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "888", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1428", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "890", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "25", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1195", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "892", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "9185", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "564", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "50", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "50", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "50", + "id": "563", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "565", + "maxAmount": "50" + }, + { + "minAmount": "24", + "weight": "5", + "id": "558", + "maxAmount": "24" + }, + { + "minAmount": "2", + "weight": "5", + "id": "4694", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "15" + }, + { + "minAmount": "465", + "weight": "50", + "id": "995", + "maxAmount": "465" + }, + { + "minAmount": "1", + "weight": "5", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2853", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "126", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1428", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "5", + "id": "888", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "50", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "50", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "25", + "id": "561", + "maxAmount": "10" + }, + { + "minAmount": "2", + "weight": "5", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1641", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "127", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "1363", + "maxAmount": "1" + } + ] + }, + { + "ids": "128,1479,1875,4343", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7862", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "130", + "main": [ + { + "minAmount": "21", + "weight": "50", + "id": "557", + "maxAmount": "21" + }, + { + "minAmount": "22", + "weight": "50", + "id": "557", + "maxAmount": "22" + }, + { + "minAmount": "1", + "weight": "50", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "565", + "maxAmount": "3" + }, + { + "minAmount": "15", + "weight": "50", + "id": "562", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "563", + "maxAmount": "13" + }, + { + "minAmount": "4", + "weight": "25", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "99", + "weight": "5", + "id": "562", + "maxAmount": "99" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3030", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5949", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "143", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7054", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7210", + "maxAmount": "1" + }, + { + "minAmount": "323", + "weight": "5", + "id": "995", + "maxAmount": "525" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2843", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "100", + "id": "886", + "maxAmount": "26" + }, + { + "minAmount": "12", + "weight": "100", + "id": "802", + "maxAmount": "21" + } + ] + }, + { + "ids": "132,1463,1464,1487,2301,4344,4363,5852,6943,7211,7213,7215,7217,7219,7221,7223,7225,7227", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7856", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3186", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "3166", + "maxAmount": "1" + } + ] + }, + { + "ids": "133", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7821", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "237", + "maxAmount": "1" + } + ] + }, + { + "ids": "143", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "2859", + "maxAmount": "1" + } + ] + }, + { + "ids": "8349,8350,8351,8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "40", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "386", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5298", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5104", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5299", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "200", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "202", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "204", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "206", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "210", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "212", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "214", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "216", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2486", + "maxAmount": "11" + }, + { + "minAmount": "3", + "weight": "50", + "id": "1602", + "maxAmount": "5" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2362", + "maxAmount": "7" + }, + { + "minAmount": "20", + "weight": "50", + "id": "560", + "maxAmount": "40" + }, + { + "minAmount": "20", + "weight": "50", + "id": "563", + "maxAmount": "45" + }, + { + "minAmount": "4", + "weight": "50", + "id": "1443", + "maxAmount": "4" + }, + { + "minAmount": "3000", + "weight": "75", + "id": "995", + "maxAmount": "15000" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5302", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "10", + "id": "1149", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5303", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "218", + "maxAmount": "11" + }, + { + "minAmount": "10", + "weight": "25", + "id": "565", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "1", + "id": "14484", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "14474", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "14476", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "14472", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "158", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "869", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "564", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "45", + "weight": "25", + "id": "556", + "maxAmount": "45" + }, + { + "minAmount": "2", + "weight": "50", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "163,164,2781", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2169", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2102", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2128", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2120", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2164", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2026", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2167", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2025", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2166", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2807", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2171", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2023", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "172,174,3242,3243,3244,3245,4658,4659,4660,4661", + "main": [ + { + "minAmount": "10", + "weight": "50", + "id": "557", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "557", + "maxAmount": "18" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "556", + "maxAmount": "18" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "555", + "maxAmount": "18" + }, + { + "minAmount": "10", + "weight": "50", + "id": "554", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "554", + "maxAmount": "18" + }, + { + "minAmount": "10", + "weight": "50", + "id": "558", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "558", + "maxAmount": "18" + }, + { + "minAmount": "10", + "weight": "50", + "id": "559", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "559", + "maxAmount": "18" + }, + { + "minAmount": "4", + "weight": "50", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "5", + "weight": "50", + "id": "562", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "561", + "maxAmount": "5" + }, + { + "minAmount": "3", + "weight": "50", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "564", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "50", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "50", + "id": "565", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1383", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "581", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "1017", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "987", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "173", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "175,2697,7161,7162", + "main": [ + { + "minAmount": "4", + "weight": "25", + "id": "877", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "6", + "weight": "25", + "id": "555", + "maxAmount": "6" + }, + { + "minAmount": "5", + "weight": "25", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "9", + "weight": "5", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "954", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2705", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "178,179,2751,2777,2778,6189", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1153", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1424", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "888", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1283", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1125", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1077", + "maxAmount": "1" + }, + { + "minAmount": "29", + "weight": "25", + "id": "558", + "maxAmount": "29" + }, + { + "minAmount": "10", + "weight": "25", + "id": "557", + "maxAmount": "10" + }, + { + "minAmount": "9", + "weight": "25", + "id": "559", + "maxAmount": "9" + }, + { + "minAmount": "7", + "weight": "25", + "id": "564", + "maxAmount": "7" + }, + { + "minAmount": "46", + "weight": "25", + "id": "562", + "maxAmount": "46" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "34", + "weight": "25", + "id": "563", + "maxAmount": "34" + }, + { + "minAmount": "6", + "weight": "5", + "id": "561", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "5", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "23", + "weight": "5", + "id": "5323", + "maxAmount": "23" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5321", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "500" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1933", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "181,2547,7105", + "description": "Chaos Druids - Low Level Herb supplies", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "20", + "id": "222", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "238", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "226", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "1939", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "224", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "1581", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "1976", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "10", + "id": "240", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "2152", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "9737", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "219", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "50", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "9", + "weight": "50", + "id": "559", + "maxAmount": "9" + }, + { + "minAmount": "9", + "weight": "50", + "id": "556", + "maxAmount": "36" + }, + { + "minAmount": "9", + "weight": "50", + "id": "557", + "maxAmount": "9" + }, + { + "minAmount": "12", + "weight": "50", + "id": "558", + "maxAmount": "12" + }, + { + "minAmount": "3", + "weight": "25", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "50", + "id": "9142", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "50", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1594", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1137", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1627", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "182,183,184,185,2695,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,3190,3191,3192,3193,3194,3195,3196,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356", + "main": [ + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "10" + }, + { + "minAmount": "9", + "weight": "50", + "id": "557", + "maxAmount": "9" + }, + { + "minAmount": "5", + "weight": "50", + "id": "554", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "50", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "50", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1321", + "maxAmount": "1" + }, + { + "minAmount": "9", + "weight": "50", + "id": "882", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9140", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "877", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1115", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "995", + "maxAmount": "55" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1025", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1949", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "186,7106,7107,7108,7109,7110,7111,7112,7113,7114", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1137", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "167", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "187", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "25", + "weight": "50", + "id": "995", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "5", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1523", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2699", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "191,2496,2497", + "main": [ + { + "minAmount": "10", + "weight": "25", + "id": "828", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1237", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1241", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "827", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1525", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1533", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "3188", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "6306", + "maxAmount": "62" + }, + { + "minAmount": "1", + "weight": "25", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1933", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2829", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "192", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1151", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1420", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1426", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "882", + "maxAmount": "8" + }, + { + "minAmount": "2", + "weight": "50", + "id": "558", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "555", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "557", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "5", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "50", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "325", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "193", + "description": "Chaos Druid Warriors - Low end herb supplies", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "222", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "238", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "226", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1939", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "224", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1581", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1976", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "40", + "id": "240", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2152", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "9737", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "2" + }, + { + "minAmount": "12", + "weight": "50", + "id": "556", + "maxAmount": "12" + }, + { + "minAmount": "36", + "weight": "50", + "id": "556", + "maxAmount": "36" + }, + { + "minAmount": "9", + "weight": "50", + "id": "557", + "maxAmount": "9" + }, + { + "minAmount": "12", + "weight": "50", + "id": "554", + "maxAmount": "12" + }, + { + "minAmount": "3", + "weight": "25", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "3" + }, + { + "minAmount": "13", + "weight": "50", + "id": "995", + "maxAmount": "13" + }, + { + "minAmount": "1", + "weight": "50", + "id": "235", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "225", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "167", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "199", + "main": [ + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2142", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1595", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "948", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1621", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1617", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "202", + "main": [ + { + "minAmount": "12", + "weight": "25", + "id": "559", + "maxAmount": "12" + }, + { + "minAmount": "3", + "weight": "5", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "30", + "weight": "25", + "id": "555", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1175", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1177", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "120", + "weight": "50", + "id": "995", + "maxAmount": "300" + }, + { + "minAmount": "1", + "weight": "25", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "5", + "id": "374", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2851", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "203", + "main": [ + { + "minAmount": "12", + "weight": "25", + "id": "559", + "maxAmount": "12" + }, + { + "minAmount": "30", + "weight": "25", + "id": "555", + "maxAmount": "30" + }, + { + "minAmount": "3", + "weight": "5", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "5", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "69" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2696", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "5", + "id": "374", + "maxAmount": "5" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "204", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "150" + }, + { + "minAmount": "3", + "weight": "25", + "id": "442", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "374", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2857", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "205", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "50", + "id": "555", + "maxAmount": "12" + }, + { + "minAmount": "36", + "weight": "5", + "id": "554", + "maxAmount": "36" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1217", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "9142", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "5", + "id": "830", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1137", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "50", + "id": "167", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "221", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "555", + "maxAmount": "1" + }, + { + "minAmount": "24", + "weight": "50", + "id": "563", + "maxAmount": "24" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "15", + "weight": "25", + "id": "554", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1153", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5324", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "830", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "347,348,357,369,370,371,372,717,718,719,2349,2350,2351,2373,2374,2784,3216", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1506", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6065", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6067", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6068", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6070", + "maxAmount": "1" + } + ] + }, + { + "ids": "412", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7833", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "438,439,440,441,442,443,655,4470", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "561", + "maxAmount": "22" + }, + { + "minAmount": "1", + "weight": "1", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1617", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1621", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "946", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "490,1958,1959,1961,1962,1963,1964,1965,1966,1967,1968,2015,2016,2017,2018,2019,6753,6754,6755,6756,6757,6758,6759,6760", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4675", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1673", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1654", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1635", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1696", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1639", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2566", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1727", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1656", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11072", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "405", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "970", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "9032", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1939", + "maxAmount": "17" + }, + { + "minAmount": "1", + "weight": "50", + "id": "950", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "5", + "id": "2007", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2835", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6808", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "609,4603,4604,4605,4606", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "556", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "562", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "557", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "561", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "554", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "882", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "886", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5324", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1947", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5318", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "667", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "780", + "maxAmount": "1" + } + ] + }, + { + "ids": "708,709,1531,6211", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "877", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1949", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1944", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2138", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2307", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2142", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1933", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1759", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1474", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1470", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1476", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1472", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2146", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1947", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "753", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1735", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1925", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1929", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1935", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1937", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "195", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1931", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "956", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1927", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "9442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "579", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "749", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1081", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "857", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1430", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1428", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1193", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1424", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1143", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "9145", + "maxAmount": "5" + }, + { + "minAmount": "20", + "weight": "50", + "id": "886", + "maxAmount": "20" + }, + { + "minAmount": "5", + "weight": "25", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "3", + "weight": "25", + "id": "565", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "25", + "id": "565", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9419", + "maxAmount": "2" + }, + { + "minAmount": "10", + "weight": "25", + "id": "808", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "25", + "id": "865", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "5", + "id": "9144", + "maxAmount": "10" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2356", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11443", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11465", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "106", + "weight": "50", + "id": "995", + "maxAmount": "467" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1515", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2827", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "750", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "11371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1081", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1430", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1428", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1193", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1424", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "857", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "9145", + "maxAmount": "5" + }, + { + "minAmount": "20", + "weight": "50", + "id": "886", + "maxAmount": "20" + }, + { + "minAmount": "5", + "weight": "25", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "3", + "weight": "25", + "id": "565", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "25", + "id": "565", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9419", + "maxAmount": "2" + }, + { + "minAmount": "10", + "weight": "25", + "id": "808", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "25", + "id": "865", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "5", + "id": "9144", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2356", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11443", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11465", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "106", + "weight": "50", + "id": "995", + "maxAmount": "106" + }, + { + "minAmount": "142", + "weight": "50", + "id": "995", + "maxAmount": "142" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1515", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2819", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "751", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "865", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1424", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "857", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "808", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1430", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1428", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1081", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1193", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "20", + "weight": "25", + "id": "886", + "maxAmount": "20" + }, + { + "minAmount": "5", + "weight": "25", + "id": "9145", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "25", + "id": "9144", + "maxAmount": "10" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "3", + "weight": "25", + "id": "565", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "25", + "id": "565", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1515", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2823", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11443", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11465", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "752", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1428", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1430", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11367", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11369", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11375", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1193", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1081", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "50", + "id": "867", + "maxAmount": "20" + }, + { + "minAmount": "10", + "weight": "25", + "id": "892", + "maxAmount": "10" + }, + { + "minAmount": "2", + "weight": "50", + "id": "9419", + "maxAmount": "2" + }, + { + "minAmount": "10", + "weight": "25", + "id": "9144", + "maxAmount": "10" + }, + { + "minAmount": "5", + "weight": "50", + "id": "9145", + "maxAmount": "5" + }, + { + "minAmount": "6", + "weight": "25", + "id": "560", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11467", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11465", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11507", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11505", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11475", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11473", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "106", + "weight": "5", + "id": "995", + "maxAmount": "106" + }, + { + "minAmount": "10", + "weight": "25", + "id": "533", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "383", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "385", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "2355", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "2360", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2362", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2364", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "857", + "maxAmount": "1" + }, + { + "minAmount": "13", + "weight": "25", + "id": "1515", + "maxAmount": "13" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2849", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "839,6050,6051", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "2859", + "maxAmount": "1" + } + ] + }, + { + "ids": "840", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1861", + "maxAmount": "1" + } + ] + }, + { + "ids": "852,5174", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "870", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "877", + "main": [ + { + "minAmount": "8", + "weight": "25", + "id": "556", + "maxAmount": "8" + }, + { + "minAmount": "2", + "weight": "25", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "4", + "weight": "25", + "id": "882", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "886", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "6", + "weight": "25", + "id": "995", + "maxAmount": "35" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1448", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "878", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1137", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "25", + "id": "556", + "maxAmount": "8" + }, + { + "minAmount": "3", + "weight": "25", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "6", + "weight": "5", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "25", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "6", + "weight": "50", + "id": "995", + "maxAmount": "30" + }, + { + "minAmount": "4", + "weight": "25", + "id": "882", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "886", + "maxAmount": "2" + }, + { + "minAmount": "8", + "weight": "25", + "id": "886", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "941,4677,4678,4679,4680", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "75", + "weight": "50", + "id": "555", + "maxAmount": "150" + }, + { + "minAmount": "37", + "weight": "50", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "15", + "weight": "50", + "id": "561", + "maxAmount": "15" + }, + { + "minAmount": "30", + "weight": "50", + "id": "561", + "maxAmount": "30" + }, + { + "minAmount": "3", + "weight": "50", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "11", + "weight": "50", + "id": "995", + "maxAmount": "440" + }, + { + "minAmount": "1", + "weight": "50", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "449", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1753", + "maxAmount": "1" + } + ] + }, + { + "ids": "988", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "25", + "id": "555", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "25", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2353", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1490", + "maxAmount": "1" + } + ] + }, + { + "ids": "989", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "25", + "id": "555", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2353", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "990", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "25", + "id": "555", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "25", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2359", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1490", + "maxAmount": "1" + } + ] + }, + { + "ids": "998", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1497", + "maxAmount": "1" + } + ] + }, + { + "ids": "999", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1498", + "maxAmount": "1" + } + ] + }, + { + "ids": "1000", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1499", + "maxAmount": "1" + } + ] + }, + { + "ids": "1002", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1410", + "maxAmount": "1" + } + ] + }, + { + "ids": "1007", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1397", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1399", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1393", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1395", + "maxAmount": "1" + }, + { + "minAmount": "60", + "weight": "50", + "id": "556", + "maxAmount": "60" + }, + { + "minAmount": "189", + "weight": "50", + "id": "556", + "maxAmount": "189" + }, + { + "minAmount": "79", + "weight": "50", + "id": "557", + "maxAmount": "79" + }, + { + "minAmount": "86", + "weight": "50", + "id": "557", + "maxAmount": "86" + }, + { + "minAmount": "51", + "weight": "50", + "id": "554", + "maxAmount": "51" + }, + { + "minAmount": "180", + "weight": "50", + "id": "554", + "maxAmount": "180" + }, + { + "minAmount": "86", + "weight": "50", + "id": "555", + "maxAmount": "86" + }, + { + "minAmount": "107", + "weight": "50", + "id": "555", + "maxAmount": "107" + }, + { + "minAmount": "8", + "weight": "25", + "id": "565", + "maxAmount": "8" + }, + { + "minAmount": "25", + "weight": "25", + "id": "564", + "maxAmount": "25" + }, + { + "minAmount": "45", + "weight": "25", + "id": "560", + "maxAmount": "45" + }, + { + "minAmount": "9", + "weight": "25", + "id": "563", + "maxAmount": "9" + }, + { + "minAmount": "12", + "weight": "25", + "id": "561", + "maxAmount": "12" + }, + { + "minAmount": "28", + "weight": "25", + "id": "561", + "maxAmount": "28" + }, + { + "minAmount": "77", + "weight": "50", + "id": "995", + "maxAmount": "77" + }, + { + "minAmount": "89", + "weight": "50", + "id": "995", + "maxAmount": "89" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1016,1550", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2876", + "maxAmount": "1" + }, + { + "minAmount": "11", + "weight": "100", + "id": "314", + "maxAmount": "30" + } + ] + }, + { + "ids": "1019", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "554", + "maxAmount": "20" + }, + { + "minAmount": "2", + "weight": "50", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "560", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "50", + "id": "995", + "maxAmount": "42" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1387", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "1021", + "main": [ + { + "minAmount": "15", + "weight": "50", + "id": "556", + "maxAmount": "20" + }, + { + "minAmount": "2", + "weight": "50", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "50", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "560", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1022", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "555", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "50", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "50", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "560", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1383", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "227", + "maxAmount": "1" + } + ] + }, + { + "ids": "1023,1220,1223,1225,6214", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "50", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2837", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1029,6056", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "855", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1097", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1901", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7178", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "247", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "1539", + "maxAmount": "5" + }, + { + "minAmount": "4", + "weight": "50", + "id": "1784", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1523", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7936", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5970", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1777", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1761", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "8778", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "133", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2347", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1030,6057", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2011", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2327", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1897", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5004", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1883", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "247", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "380", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "386", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7170", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5755", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7178", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7188", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "5", + "id": "10137", + "maxAmount": "5" + }, + { + "minAmount": "6", + "weight": "5", + "id": "7179", + "maxAmount": "6" + }, + { + "minAmount": "3", + "weight": "5", + "id": "374", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10136", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5406", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2007", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5970", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "3145", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "3143", + "maxAmount": "2" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1032,6059", + "main": [ + { + "minAmount": "4", + "weight": "50", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "1330", + "weight": "50", + "id": "555", + "maxAmount": "1330" + }, + { + "minAmount": "25", + "weight": "50", + "id": "558", + "maxAmount": "25" + }, + { + "minAmount": "30", + "weight": "50", + "id": "556", + "maxAmount": "30" + }, + { + "minAmount": "28", + "weight": "50", + "id": "559", + "maxAmount": "30" + }, + { + "minAmount": "50", + "weight": "50", + "id": "554", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "50", + "id": "7937", + "maxAmount": "35" + }, + { + "minAmount": "20", + "weight": "50", + "id": "1436", + "maxAmount": "20" + }, + { + "minAmount": "4", + "weight": "25", + "id": "564", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "4695", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "4696", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "4698", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "4694", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "5", + "id": "4699", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "5", + "id": "4697", + "maxAmount": "4" + }, + { + "minAmount": "7", + "weight": "5", + "id": "565", + "maxAmount": "7" + }, + { + "minAmount": "11", + "weight": "5", + "id": "566", + "maxAmount": "11" + }, + { + "minAmount": "13", + "weight": "5", + "id": "563", + "maxAmount": "13" + }, + { + "minAmount": "13", + "weight": "5", + "id": "561", + "maxAmount": "13" + }, + { + "minAmount": "13", + "weight": "5", + "id": "560", + "maxAmount": "13" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1033,6060", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1273", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2493", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10083", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5970", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "2358", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "5", + "id": "450", + "maxAmount": "10" + }, + { + "minAmount": "30", + "weight": "50", + "id": "556", + "maxAmount": "57" + }, + { + "minAmount": "20", + "weight": "25", + "id": "7936", + "maxAmount": "35" + }, + { + "minAmount": "1", + "weight": "25", + "id": "237", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1601", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5760", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7208", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "8779", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5321", + "maxAmount": "3" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1035,6062", + "main": [ + { + "minAmount": "3", + "weight": "50", + "id": "1701", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "1732", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2569", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "3391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "2571", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5541", + "maxAmount": "1" + }, + { + "minAmount": "6", + "weight": "50", + "id": "1748", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "25", + "id": "2364", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1603", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "5", + "id": "1602", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5287", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "987", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "985", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12121", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1052,1053,3606,3607,3608,3609,3610,3611", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1420", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "830", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1189", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "559", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "556", + "maxAmount": "3" + }, + { + "minAmount": "7", + "weight": "25", + "id": "554", + "maxAmount": "7" + }, + { + "minAmount": "4", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "5", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "125" + }, + { + "minAmount": "7", + "weight": "50", + "id": "313", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7218", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1087", + "main": [ + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "9" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "877", + "maxAmount": "12" + }, + { + "minAmount": "7", + "weight": "25", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7767", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1096", + "main": [ + { + "minAmount": "16", + "weight": "25", + "id": "561", + "maxAmount": "16" + }, + { + "minAmount": "25", + "weight": "25", + "id": "557", + "maxAmount": "25" + }, + { + "minAmount": "65", + "weight": "25", + "id": "557", + "maxAmount": "65" + }, + { + "minAmount": "4", + "weight": "25", + "id": "563", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1183", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "362", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "454", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1097", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1183", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "563", + "maxAmount": "4" + }, + { + "minAmount": "80", + "weight": "25", + "id": "557", + "maxAmount": "80" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1098", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "80", + "weight": "25", + "id": "557", + "maxAmount": "80" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1101,1102,1103,1104,1105", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "35", + "weight": "50", + "id": "995", + "maxAmount": "35" + }, + { + "minAmount": "25", + "weight": "25", + "id": "557", + "maxAmount": "25" + }, + { + "minAmount": "45", + "weight": "25", + "id": "557", + "maxAmount": "45" + }, + { + "minAmount": "7", + "weight": "25", + "id": "561", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "5", + "id": "454", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1106,1107,1108,1109,1110,1111,1112,1138", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5323", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1183", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "50", + "id": "561", + "maxAmount": "7" + }, + { + "minAmount": "25", + "weight": "50", + "id": "557", + "maxAmount": "25" + }, + { + "minAmount": "45", + "weight": "50", + "id": "557", + "maxAmount": "45" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "35", + "weight": "50", + "id": "995", + "maxAmount": "35" + }, + { + "minAmount": "3", + "weight": "50", + "id": "454", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7884", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1115,1116,1117", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1183", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "830", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "16", + "weight": "50", + "id": "561", + "maxAmount": "16" + }, + { + "minAmount": "4", + "weight": "50", + "id": "563", + "maxAmount": "4" + }, + { + "minAmount": "25", + "weight": "25", + "id": "557", + "maxAmount": "25" + }, + { + "minAmount": "65", + "weight": "25", + "id": "557", + "maxAmount": "65" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "360", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "454", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "995", + "maxAmount": "20" + }, + { + "minAmount": "40", + "weight": "25", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1118,1119,1120,1121,1122,1123,1124", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "35", + "weight": "50", + "id": "995", + "maxAmount": "35" + }, + { + "minAmount": "7", + "weight": "50", + "id": "561", + "maxAmount": "7" + }, + { + "minAmount": "25", + "weight": "50", + "id": "557", + "maxAmount": "25" + }, + { + "minAmount": "45", + "weight": "50", + "id": "557", + "maxAmount": "45" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "454", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7884", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1130,1131,1132,1133,1134", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "35", + "weight": "50", + "id": "995", + "maxAmount": "35" + }, + { + "minAmount": "25", + "weight": "25", + "id": "557", + "maxAmount": "25" + }, + { + "minAmount": "45", + "weight": "25", + "id": "557", + "maxAmount": "45" + }, + { + "minAmount": "7", + "weight": "25", + "id": "561", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "5", + "id": "454", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1153,1156", + "main": [ + { + "minAmount": "11", + "weight": "50", + "id": "556", + "maxAmount": "19" + }, + { + "minAmount": "11", + "weight": "50", + "id": "555", + "maxAmount": "19" + }, + { + "minAmount": "11", + "weight": "50", + "id": "557", + "maxAmount": "19" + }, + { + "minAmount": "11", + "weight": "50", + "id": "554", + "maxAmount": "19" + }, + { + "minAmount": "2", + "weight": "25", + "id": "555", + "maxAmount": "2" + }, + { + "minAmount": "7", + "weight": "25", + "id": "554", + "maxAmount": "7" + }, + { + "minAmount": "6", + "weight": "25", + "id": "559", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "25", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1837", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1835", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1833", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1329", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1143", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1131", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "826", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1823", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3138", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1783", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1154", + "main": [ + { + "minAmount": "60", + "weight": "50", + "id": "554", + "maxAmount": "60" + }, + { + "minAmount": "12", + "weight": "25", + "id": "562", + "maxAmount": "12" + }, + { + "minAmount": "3", + "weight": "25", + "id": "560", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "561", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "5", + "id": "554", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1146", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "240" + }, + { + "minAmount": "1", + "weight": "5", + "id": "995", + "maxAmount": "450" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1823", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "75", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "75", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "75", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1155,1157", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1183", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1285", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1331", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "25", + "id": "556", + "maxAmount": "50" + }, + { + "minAmount": "7", + "weight": "25", + "id": "565", + "maxAmount": "19" + }, + { + "minAmount": "37", + "weight": "25", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "45", + "weight": "25", + "id": "563", + "maxAmount": "45" + }, + { + "minAmount": "18", + "weight": "25", + "id": "560", + "maxAmount": "18" + }, + { + "minAmount": "28", + "weight": "25", + "id": "560", + "maxAmount": "28" + }, + { + "minAmount": "10", + "weight": "25", + "id": "562", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "829", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "42", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "28", + "weight": "50", + "id": "995", + "maxAmount": "3000" + }, + { + "minAmount": "12", + "weight": "25", + "id": "379", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "157", + "maxAmount": "1" + }, + { + "minAmount": "24", + "weight": "25", + "id": "3139", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1158,1159,1160,3835,3836,4234", + "description": "Kalphite Queen", + "main": [ + { + "minAmount": "2", + "weight": "50", + "id": "1247", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1301", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "3053", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "10", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1113", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3140", + "maxAmount": "1" + }, + { + "minAmount": "500", + "weight": "50", + "id": "888", + "maxAmount": "500" + }, + { + "minAmount": "1", + "weight": "50", + "id": "884", + "maxAmount": "355" + }, + { + "minAmount": "1", + "weight": "50", + "id": "886", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "50", + "id": "892", + "maxAmount": "100" + }, + { + "minAmount": "250", + "weight": "75", + "id": "565", + "maxAmount": "300" + }, + { + "minAmount": "200", + "weight": "75", + "id": "561", + "maxAmount": "285" + }, + { + "minAmount": "20", + "weight": "75", + "id": "563", + "maxAmount": "45" + }, + { + "minAmount": "250", + "weight": "75", + "id": "563", + "maxAmount": "250" + }, + { + "minAmount": "200", + "weight": "50", + "id": "560", + "maxAmount": "300" + }, + { + "minAmount": "200", + "weight": "50", + "id": "564", + "maxAmount": "300" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1607", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1605", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1603", + "maxAmount": "1" + }, + { + "minAmount": "40", + "weight": "25", + "id": "414", + "maxAmount": "40" + }, + { + "minAmount": "20", + "weight": "50", + "id": "246", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1731", + "maxAmount": "1" + }, + { + "minAmount": "341", + "weight": "50", + "id": "995", + "maxAmount": "75000" + }, + { + "minAmount": "7", + "weight": "50", + "id": "379", + "maxAmount": "7" + }, + { + "minAmount": "714", + "weight": "50", + "id": "385", + "maxAmount": "714" + }, + { + "minAmount": "1", + "weight": "10", + "id": "2729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1183,1184,1201,2359,2360,2361,2362,7438,7439,7440,7441", + "main": [ + { + "minAmount": "70", + "weight": "50", + "id": "555", + "maxAmount": "70" + }, + { + "minAmount": "37", + "weight": "25", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "12", + "weight": "25", + "id": "561", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1099", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1135", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1065", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "385", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "397", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "50", + "id": "995", + "maxAmount": "427" + }, + { + "minAmount": "1", + "weight": "50", + "id": "6103", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "449", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6102", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2747", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1196,1197", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7815", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "948", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2136", + "maxAmount": "1" + } + ] + }, + { + "ids": "1198", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "2859", + "maxAmount": "1" + } + ] + }, + { + "ids": "1200,1203,1204,1206,4649,7120", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1073", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1135", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1065", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1099", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "220" + }, + { + "minAmount": "75", + "weight": "25", + "id": "554", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "361", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "25", + "id": "562", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "1734", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1218", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1458", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7881", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1219", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2827", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1227,1232", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "3345", + "maxAmount": "1" + } + ] + }, + { + "ids": "1228,1233", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3367", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "3347", + "maxAmount": "1" + } + ] + }, + { + "ids": "1229,1234", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "3349", + "maxAmount": "1" + } + ] + }, + { + "ids": "1230,1235", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3367", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "3351", + "maxAmount": "1" + } + ] + }, + { + "ids": "1231", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "3353", + "maxAmount": "1" + } + ] + }, + { + "ids": "1240", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3396", + "maxAmount": "1" + } + ] + }, + { + "ids": "1241", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3396", + "maxAmount": "1" + } + ] + }, + { + "ids": "1255,1256", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "25", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "5", + "weight": "25", + "id": "877", + "maxAmount": "11" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "110", + "weight": "5", + "id": "313", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2681", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1257,1258,1261,1262", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "25", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "5", + "weight": "25", + "id": "877", + "maxAmount": "11" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "110", + "weight": "5", + "id": "313", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2686", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1264", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1397", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1395", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1399", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1393", + "maxAmount": "1" + }, + { + "minAmount": "189", + "weight": "25", + "id": "556", + "maxAmount": "189" + }, + { + "minAmount": "196", + "weight": "25", + "id": "556", + "maxAmount": "196" + }, + { + "minAmount": "42", + "weight": "25", + "id": "555", + "maxAmount": "42" + }, + { + "minAmount": "126", + "weight": "25", + "id": "555", + "maxAmount": "126" + }, + { + "minAmount": "79", + "weight": "25", + "id": "557", + "maxAmount": "79" + }, + { + "minAmount": "86", + "weight": "25", + "id": "557", + "maxAmount": "86" + }, + { + "minAmount": "51", + "weight": "25", + "id": "554", + "maxAmount": "51" + }, + { + "minAmount": "180", + "weight": "25", + "id": "554", + "maxAmount": "180" + }, + { + "minAmount": "25", + "weight": "25", + "id": "564", + "maxAmount": "25" + }, + { + "minAmount": "28", + "weight": "25", + "id": "561", + "maxAmount": "28" + }, + { + "minAmount": "30", + "weight": "25", + "id": "561", + "maxAmount": "30" + }, + { + "minAmount": "9", + "weight": "25", + "id": "563", + "maxAmount": "9" + }, + { + "minAmount": "10", + "weight": "25", + "id": "563", + "maxAmount": "10" + }, + { + "minAmount": "45", + "weight": "25", + "id": "560", + "maxAmount": "45" + }, + { + "minAmount": "8", + "weight": "25", + "id": "565", + "maxAmount": "8" + }, + { + "minAmount": "40", + "weight": "25", + "id": "565", + "maxAmount": "40" + }, + { + "minAmount": "7789", + "weight": "25", + "id": "995", + "maxAmount": "7789" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1265,1267", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1265", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1267", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "826", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "50", + "id": "554", + "maxAmount": "7" + }, + { + "minAmount": "4", + "weight": "25", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "562", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "995", + "maxAmount": "498" + }, + { + "minAmount": "1", + "weight": "50", + "id": "407", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "402", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "5", + "id": "403", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "411", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "409", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1969", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "453", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "436", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "438", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "10" + }, + { + "minAmount": "5", + "weight": "25", + "id": "45", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "9187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2678", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "405", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1306", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1337", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1335", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "16" + }, + { + "minAmount": "1", + "weight": "50", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1925", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "229", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "247", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2700", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3690", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1307", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "229", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "247", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1925", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1337", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1335", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "438", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "436", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "440", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2680", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3690", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1308", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1337", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1335", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3757", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3758", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3748", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "436", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "50", + "id": "438", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "50", + "id": "440", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "16" + }, + { + "minAmount": "1", + "weight": "50", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "229", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1925", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "247", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1582", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3690", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2716", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,2455,2456,2887,2888,3591", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2677", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1390", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1521,1522,1523", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "10937", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12162", + "maxAmount": "1" + } + ] + }, + { + "ids": "1524,1525,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744,5745,5746,5747", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7863", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10940", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10945", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10941", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10933", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7666", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3365", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "3367", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "25", + "id": "884", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "886", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1291", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "558", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12163", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "960", + "maxAmount": "1" + } + ] + }, + { + "ids": "1539", + "main": [ + { + "minAmount": "5", + "weight": "25", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "25", + "id": "995", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2747", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1137", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "25", + "id": "556", + "maxAmount": "15" + }, + { + "minAmount": "9", + "weight": "25", + "id": "555", + "maxAmount": "9" + }, + { + "minAmount": "5", + "weight": "25", + "id": "562", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1558,1559,1951,1952,1953,1954,1955,1956,6052", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "2859", + "maxAmount": "1" + } + ] + }, + { + "ids": "1560,1561,1562,1563,1564,1565,1566", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1125", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "25", + "weight": "50", + "id": "565", + "maxAmount": "25" + }, + { + "minAmount": "15", + "weight": "50", + "id": "560", + "maxAmount": "15" + }, + { + "minAmount": "65", + "weight": "50", + "id": "555", + "maxAmount": "65" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "20", + "weight": "50", + "id": "995", + "maxAmount": "200" + }, + { + "minAmount": "1", + "weight": "50", + "id": "359", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "380", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "453", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1589,3588,4667,4668", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "534", + "maxAmount": "1" + } + ] + }, + { + "ids": "1590", + "main": [ + { + "minAmount": "30", + "weight": "50", + "id": "829", + "maxAmount": "30" + }, + { + "minAmount": "60", + "weight": "50", + "id": "829", + "maxAmount": "60" + }, + { + "minAmount": "16", + "weight": "25", + "id": "810", + "maxAmount": "16" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1315", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1369", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9142", + "maxAmount": "8" + }, + { + "minAmount": "10", + "weight": "25", + "id": "9142", + "maxAmount": "10" + }, + { + "minAmount": "2", + "weight": "25", + "id": "868", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "25", + "id": "868", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "830", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "563", + "maxAmount": "10" + }, + { + "minAmount": "45", + "weight": "50", + "id": "563", + "maxAmount": "45" + }, + { + "minAmount": "50", + "weight": "25", + "id": "554", + "maxAmount": "150" + }, + { + "minAmount": "15", + "weight": "25", + "id": "565", + "maxAmount": "15" + }, + { + "minAmount": "30", + "weight": "25", + "id": "565", + "maxAmount": "30" + }, + { + "minAmount": "67", + "weight": "25", + "id": "561", + "maxAmount": "67" + }, + { + "minAmount": "25", + "weight": "25", + "id": "560", + "maxAmount": "25" + }, + { + "minAmount": "45", + "weight": "25", + "id": "560", + "maxAmount": "45" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2363", + "maxAmount": "1" + }, + { + "minAmount": "168", + "weight": "50", + "id": "995", + "maxAmount": "3000" + }, + { + "minAmount": "1", + "weight": "25", + "id": "373", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2735", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "100", + "id": "2349", + "maxAmount": "5" + } + ] + }, + { + "ids": "1591", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1317", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1183", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "830", + "maxAmount": "8" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9143", + "maxAmount": "12" + }, + { + "minAmount": "9", + "weight": "25", + "id": "811", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "25", + "id": "868", + "maxAmount": "7" + }, + { + "minAmount": "150", + "weight": "5", + "id": "886", + "maxAmount": "150" + }, + { + "minAmount": "2", + "weight": "5", + "id": "9144", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "5", + "id": "9144", + "maxAmount": "4" + }, + { + "minAmount": "15", + "weight": "50", + "id": "565", + "maxAmount": "15" + }, + { + "minAmount": "3", + "weight": "25", + "id": "566", + "maxAmount": "5" + }, + { + "minAmount": "15", + "weight": "5", + "id": "560", + "maxAmount": "15" + }, + { + "minAmount": "45", + "weight": "5", + "id": "560", + "maxAmount": "45" + }, + { + "minAmount": "25", + "weight": "5", + "id": "562", + "maxAmount": "25" + }, + { + "minAmount": "50", + "weight": "5", + "id": "562", + "maxAmount": "50" + }, + { + "minAmount": "60", + "weight": "5", + "id": "561", + "maxAmount": "79" + }, + { + "minAmount": "45", + "weight": "5", + "id": "563", + "maxAmount": "45" + }, + { + "minAmount": "90", + "weight": "5", + "id": "563", + "maxAmount": "90" + }, + { + "minAmount": "2", + "weight": "25", + "id": "2361", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2442", + "maxAmount": "1" + }, + { + "minAmount": "270", + "weight": "50", + "id": "995", + "maxAmount": "270" + }, + { + "minAmount": "550", + "weight": "50", + "id": "995", + "maxAmount": "550" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2011", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9431", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11286", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "100", + "id": "2351", + "maxAmount": "5" + } + ] + }, + { + "ids": "1592,3590", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "50", + "id": "565", + "maxAmount": "20" + }, + { + "minAmount": "7", + "weight": "50", + "id": "830", + "maxAmount": "7" + }, + { + "minAmount": "5", + "weight": "25", + "id": "566", + "maxAmount": "5" + }, + { + "minAmount": "9", + "weight": "25", + "id": "811", + "maxAmount": "12" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9144", + "maxAmount": "14" + }, + { + "minAmount": "7", + "weight": "25", + "id": "868", + "maxAmount": "7" + }, + { + "minAmount": "470", + "weight": "50", + "id": "995", + "maxAmount": "12650" + }, + { + "minAmount": "1", + "weight": "50", + "id": "9431", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2011", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2741", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11286", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "100", + "id": "2353", + "maxAmount": "5" + } + ] + }, + { + "ids": "1593,1594", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1600,1601,1602,1603", + "main": [ + { + "minAmount": "9", + "weight": "50", + "id": "557", + "maxAmount": "10" + }, + { + "minAmount": "12", + "weight": "50", + "id": "554", + "maxAmount": "12" + }, + { + "minAmount": "3", + "weight": "50", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5319", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5324", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5320", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12148", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "223", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "235", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "3" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1604,1605,1606,1607", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "207", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "209", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "211", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "213", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3051", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3053", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1073", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "278", + "weight": "25", + "id": "995", + "maxAmount": "487" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4103", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1608,1609,4229", + "main": [ + { + "minAmount": "5", + "weight": "25", + "id": "561", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "25", + "id": "560", + "maxAmount": "6" + }, + { + "minAmount": "4", + "weight": "25", + "id": "558", + "maxAmount": "16" + }, + { + "minAmount": "5", + "weight": "25", + "id": "9143", + "maxAmount": "19" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4160", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "239", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "225", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1963", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "50", + "id": "2114", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2289", + "maxAmount": "1" + }, + { + "minAmount": "22", + "weight": "50", + "id": "995", + "maxAmount": "748" + }, + { + "minAmount": "20", + "weight": "50", + "id": "1780", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "50", + "id": "161", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "25", + "id": "526", + "maxAmount": "12" + }, + { + "minAmount": "12", + "weight": "25", + "id": "532", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4111", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "13290", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7978", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1610,1827,6389", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4153", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "37", + "weight": "50", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "75", + "weight": "50", + "id": "554", + "maxAmount": "75" + }, + { + "minAmount": "15", + "weight": "50", + "id": "562", + "maxAmount": "15" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "11", + "weight": "50", + "id": "995", + "maxAmount": "498" + }, + { + "minAmount": "35", + "weight": "25", + "id": "7937", + "maxAmount": "35" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2359", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2353", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "1734", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4101", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2737", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1611", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4153", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "37", + "weight": "50", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "75", + "weight": "50", + "id": "554", + "maxAmount": "75" + }, + { + "minAmount": "15", + "weight": "50", + "id": "562", + "maxAmount": "15" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "11", + "weight": "50", + "id": "995", + "maxAmount": "498" + }, + { + "minAmount": "35", + "weight": "25", + "id": "7937", + "maxAmount": "35" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2359", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2353", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "1734", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2731", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1612", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1420", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "556", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "6", + "weight": "50", + "id": "562", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "7", + "weight": "25", + "id": "554", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "13", + "weight": "50", + "id": "995", + "maxAmount": "13" + }, + { + "minAmount": "26", + "weight": "50", + "id": "995", + "maxAmount": "35" + }, + { + "minAmount": "13", + "weight": "50", + "id": "7937", + "maxAmount": "13" + }, + { + "minAmount": "23", + "weight": "50", + "id": "7937", + "maxAmount": "23" + }, + { + "minAmount": "7", + "weight": "50", + "id": "313", + "maxAmount": "7" + }, + { + "minAmount": "15", + "weight": "50", + "id": "313", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2713", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1613", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1073", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4131", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "50", + "id": "560", + "maxAmount": "10" + }, + { + "minAmount": "3", + "weight": "25", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "37", + "weight": "25", + "id": "562", + "maxAmount": "37" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1144", + "weight": "50", + "id": "995", + "maxAmount": "1144" + }, + { + "minAmount": "132", + "weight": "50", + "id": "995", + "maxAmount": "132" + }, + { + "minAmount": "1", + "weight": "50", + "id": "361", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "1734", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2723", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "1615,4230", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1283", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4151", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "50", + "id": "556", + "maxAmount": "50" + }, + { + "minAmount": "7", + "weight": "50", + "id": "565", + "maxAmount": "7" + }, + { + "minAmount": "10", + "weight": "50", + "id": "562", + "maxAmount": "10" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "9", + "weight": "50", + "id": "995", + "maxAmount": "3000" + }, + { + "minAmount": "1", + "weight": "50", + "id": "379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "60", + "weight": "50", + "id": "7937", + "maxAmount": "60" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "133", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2727", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "1616,1617,4228", + "main": [ + { + "minAmount": "75", + "weight": "50", + "id": "555", + "maxAmount": "175" + }, + { + "minAmount": "15", + "weight": "25", + "id": "561", + "maxAmount": "45" + }, + { + "minAmount": "12", + "weight": "25", + "id": "562", + "maxAmount": "12" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "11", + "weight": "50", + "id": "995", + "maxAmount": "495" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7899", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1452", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "449", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2813", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1618,1619,6215", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4125", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "60", + "weight": "50", + "id": "554", + "maxAmount": "60" + }, + { + "minAmount": "3", + "weight": "25", + "id": "565", + "maxAmount": "3" + }, + { + "minAmount": "10", + "weight": "25", + "id": "565", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "10" + }, + { + "minAmount": "40", + "weight": "50", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "25", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "526", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "532", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "532", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1635", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2677", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1620,1621,4227", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "826", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4117", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "555", + "maxAmount": "2" + }, + { + "minAmount": "7", + "weight": "50", + "id": "554", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "50", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "50", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "50", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "50", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5308", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "50", + "id": "5309", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "50", + "id": "5323", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5321", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5096", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "12109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2851", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7983", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1622,1623,1626,1627,1628,1629,1630", + "main": [ + { + "minAmount": "5", + "weight": "50", + "id": "557", + "maxAmount": "42" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1436", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "50", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5305", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5308", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5323", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5321", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1913", + "maxAmount": "1" + }, + { + "minAmount": "23", + "weight": "25", + "id": "995", + "maxAmount": "23" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1624", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "50", + "id": "892", + "maxAmount": "12" + }, + { + "minAmount": "24", + "weight": "50", + "id": "892", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2489", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1399", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "5", + "id": "830", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "1", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "37", + "weight": "50", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "150", + "weight": "50", + "id": "554", + "maxAmount": "150" + }, + { + "minAmount": "5", + "weight": "25", + "id": "562", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "566", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "566", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "15" + }, + { + "minAmount": "25", + "weight": "50", + "id": "995", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1883", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "3140", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "1631,1632", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "15", + "weight": "25", + "id": "561", + "maxAmount": "45" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "3" + }, + { + "minAmount": "44", + "weight": "50", + "id": "995", + "maxAmount": "44" + }, + { + "minAmount": "88", + "weight": "50", + "id": "995", + "maxAmount": "88" + }, + { + "minAmount": "1", + "weight": "50", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "13290", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "13290", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2725", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1633,1634,1635,1636,6216", + "main": [ + { + "minAmount": "30", + "weight": "50", + "id": "554", + "maxAmount": "30" + }, + { + "minAmount": "60", + "weight": "50", + "id": "554", + "maxAmount": "60" + }, + { + "minAmount": "12", + "weight": "50", + "id": "562", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "560", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1387", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "886", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "10" + }, + { + "minAmount": "40", + "weight": "50", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "50", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2809", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "1637,1638,1639,1640,1641,1642", + "main": [ + { + "minAmount": "15", + "weight": "25", + "id": "562", + "maxAmount": "15" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "5", + "id": "555", + "maxAmount": "21" + }, + { + "minAmount": "7", + "weight": "5", + "id": "565", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "11", + "weight": "50", + "id": "995", + "maxAmount": "497" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "5", + "id": "1734", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1643,1644,1645,1646,1647", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1387", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3053", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1401", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "50", + "id": "557", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "50", + "id": "554", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "554", + "maxAmount": "18" + }, + { + "minAmount": "7", + "weight": "50", + "id": "560", + "maxAmount": "7" + }, + { + "minAmount": "4", + "weight": "25", + "id": "565", + "maxAmount": "4" + }, + { + "minAmount": "7", + "weight": "25", + "id": "565", + "maxAmount": "7" + }, + { + "minAmount": "10", + "weight": "25", + "id": "556", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "25", + "id": "556", + "maxAmount": "18" + }, + { + "minAmount": "18", + "weight": "25", + "id": "558", + "maxAmount": "18" + }, + { + "minAmount": "10", + "weight": "25", + "id": "555", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "25", + "id": "555", + "maxAmount": "18" + }, + { + "minAmount": "18", + "weight": "25", + "id": "559", + "maxAmount": "18" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4099", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4107", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2725", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1648,1649,1650,1651,1652,1653,1654,1655,1656,1657", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1059", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2902", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2922", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2912", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2942", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3799", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4155", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1635", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1639", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1641", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "442" + }, + { + "minAmount": "1", + "weight": "25", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1665,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6212,6213", + "main": [ + { + "minAmount": "5", + "weight": "50", + "id": "2138", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "50", + "id": "2132", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2136", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "25", + "id": "886", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1329", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "830", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "10" + }, + { + "minAmount": "90", + "weight": "50", + "id": "995", + "maxAmount": "90" + }, + { + "minAmount": "1", + "weight": "50", + "id": "6814", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "958", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7868", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2839", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "245", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "983", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1925", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "453", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "2859", + "maxAmount": "1" + } + ] + }, + { + "ids": "1691,5211", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "4287", + "maxAmount": "1" + } + ] + }, + { + "ids": "1692", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "100", + "id": "314", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "100", + "id": "4289", + "maxAmount": "1" + } + ] + }, + { + "ids": "1698", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "6", + "weight": "50", + "id": "555", + "maxAmount": "6" + }, + { + "minAmount": "7", + "weight": "50", + "id": "559", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "612" + }, + { + "minAmount": "1", + "weight": "25", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1710,1711,1712", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "697", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "686", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4170", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "882", + "maxAmount": "8" + }, + { + "minAmount": "4", + "weight": "25", + "id": "886", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1265", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1267", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1269", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "19" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1625", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1627", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "321", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2138", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1739", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "688", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1511", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2716", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "314", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1734", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5323", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5324", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2370", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1713,4329", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2677", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1714,1715,1716,1717,4318,4320", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "882", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1265", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1267", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "886", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1269", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4170", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "21" + }, + { + "minAmount": "1", + "weight": "50", + "id": "319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2138", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "314", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1734", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1511", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1625", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "686", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "697", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2714", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1627", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "688", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2677", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "1752,1753,6109,6110,6111", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "2128", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2102", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2171", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2120", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2166", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2169", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2164", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7878", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1766,1768,2310", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "1739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2132", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1795,1796,1797", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1814,1815,1816,1817,1818", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1822,1823,1824,1825,5752,5753,5754,5755,5756,5757,5758,5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,5769,5783,5785,5873,5874,5875,5876,5877,5878", + "main": [ + { + "minAmount": "6", + "weight": "50", + "id": "555", + "maxAmount": "6" + }, + { + "minAmount": "7", + "weight": "25", + "id": "559", + "maxAmount": "7" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "13", + "weight": "25", + "id": "558", + "maxAmount": "19" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "877", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5016", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5018", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1009", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1237", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1173", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7907", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1949", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2307", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "10999", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "288", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1101", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2698", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "49" + }, + { + "minAmount": "3", + "weight": "25", + "id": "1987", + "maxAmount": "3" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1828", + "main": [ + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "2" + }, + { + "minAmount": "30", + "weight": "50", + "id": "995", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "50", + "id": "4517", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "561", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "22", + "weight": "25", + "id": "884", + "maxAmount": "22" + }, + { + "minAmount": "45", + "weight": "25", + "id": "886", + "maxAmount": "45" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "564", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1969", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1829", + "main": [ + { + "minAmount": "12", + "weight": "25", + "id": "555", + "maxAmount": "12" + }, + { + "minAmount": "12", + "weight": "25", + "id": "557", + "maxAmount": "12" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7910", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "100", + "id": "526", + "maxAmount": "2" + } + ] + }, + { + "ids": "1830,2469,2470,2471,2472,2473,2689,3300,3783", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5004", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "5004", + "maxAmount": "5" + }, + { + "minAmount": "6", + "weight": "50", + "id": "555", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11766", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11767", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11768", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11769", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11764", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "4517", + "maxAmount": "1" + } + ] + }, + { + "ids": "1831", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1155", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4121", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "15", + "weight": "25", + "id": "555", + "maxAmount": "15" + }, + { + "minAmount": "7", + "weight": "25", + "id": "559", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "596", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4540", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2691", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "1939", + "maxAmount": "6" + } + ] + }, + { + "ids": "1832,5750", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "223", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "235", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "10978", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4529", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "36", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "555", + "maxAmount": "167" + }, + { + "minAmount": "1", + "weight": "50", + "id": "557", + "maxAmount": "147" + }, + { + "minAmount": "1", + "weight": "25", + "id": "554", + "maxAmount": "91" + }, + { + "minAmount": "1", + "weight": "25", + "id": "561", + "maxAmount": "8" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "36" + }, + { + "minAmount": "1", + "weight": "50", + "id": "10978", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2692", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1395", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "1874", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7862", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1935,1936,1937,1938,1939,1940,1941,1942", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1125", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "25", + "weight": "50", + "id": "565", + "maxAmount": "25" + }, + { + "minAmount": "15", + "weight": "50", + "id": "560", + "maxAmount": "15" + }, + { + "minAmount": "65", + "weight": "50", + "id": "555", + "maxAmount": "65" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "20", + "weight": "50", + "id": "995", + "maxAmount": "200" + }, + { + "minAmount": "1", + "weight": "50", + "id": "359", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "380", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "453", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "1960,5360", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4675", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1673", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1654", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1635", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1696", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1639", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2566", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1727", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1656", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11072", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "405", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "970", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "9032", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1939", + "maxAmount": "17" + }, + { + "minAmount": "1", + "weight": "50", + "id": "950", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "5", + "id": "2007", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2827", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6808", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "1976", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1991", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "995", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "3032", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2428", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2432", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "113", + "maxAmount": "1" + } + ] + }, + { + "ids": "1994", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7914", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1995", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "9052", + "maxAmount": "1" + } + ] + }, + { + "ids": "1996,3675,3676,6792,6946,7320,7322,7324,7326,7328", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7911", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11965", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2031", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "2032", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2033,4920,4921", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7824", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2035", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "2044,2045,2046,2047,2048,2049,2051,2052,2053,2054,2055", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7850", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2696", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "4850", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "4812", + "maxAmount": "1" + } + ] + }, + { + "ids": "2058", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1189", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1420", + "maxAmount": "1" + }, + { + "minAmount": "58", + "weight": "25", + "id": "884", + "maxAmount": "58" + }, + { + "minAmount": "5", + "weight": "50", + "id": "886", + "maxAmount": "32" + }, + { + "minAmount": "12", + "weight": "25", + "id": "888", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "559", + "maxAmount": "11" + }, + { + "minAmount": "4", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "556", + "maxAmount": "3" + }, + { + "minAmount": "7", + "weight": "25", + "id": "554", + "maxAmount": "84" + }, + { + "minAmount": "5", + "weight": "25", + "id": "558", + "maxAmount": "7" + }, + { + "minAmount": "5", + "weight": "25", + "id": "561", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6476", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7863", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "82" + }, + { + "minAmount": "5", + "weight": "50", + "id": "313", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "966", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1594", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2331", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2069,2070,2071,2072,2075,2076,2077,2078", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "440", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7907", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5014", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2073,2074", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "5016", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5018", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1153", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5014", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1101", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "50", + "id": "995", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7907", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "590", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2124,2126", + "main": [ + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2737", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "2130,2131,2132,2133,3276,3277,3278,3279", + "main": [ + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1375", + "maxAmount": "1" + }, + { + "minAmount": "6", + "weight": "25", + "id": "877", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1337", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1265", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "995", + "maxAmount": "42" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2841", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3801", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1929", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2134,2135,2136,2232", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1337", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1335", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "35", + "weight": "50", + "id": "995", + "maxAmount": "57" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3801", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1929", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2805", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2234,2235", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5280", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "2239,2240,2316,2317", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2263", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7936", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "7937", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "50", + "id": "7937", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "50", + "id": "7937", + "maxAmount": "10" + }, + { + "minAmount": "25", + "weight": "50", + "id": "7937", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2821", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1452", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1458", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5516", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "12161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "25", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "2264", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7936", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "7937", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "50", + "id": "7937", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "50", + "id": "7937", + "maxAmount": "10" + }, + { + "minAmount": "25", + "weight": "50", + "id": "7937", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2821", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1452", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1458", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5516", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "12161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "25", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "2265", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5521", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7936", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "7937", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "50", + "id": "7937", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "50", + "id": "7937", + "maxAmount": "10" + }, + { + "minAmount": "25", + "weight": "50", + "id": "7937", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2821", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1452", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1458", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5516", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "12161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "25", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "2452,2885", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "555", + "maxAmount": "39" + }, + { + "minAmount": "2", + "weight": "50", + "id": "557", + "maxAmount": "37" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1452", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1125", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6151", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "27", + "weight": "50", + "id": "995", + "maxAmount": "27" + }, + { + "minAmount": "28", + "weight": "50", + "id": "995", + "maxAmount": "28" + }, + { + "minAmount": "1", + "weight": "50", + "id": "377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "405", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2817", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2454", + "main": [ + { + "minAmount": "16", + "weight": "50", + "id": "995", + "maxAmount": "38" + }, + { + "minAmount": "2", + "weight": "50", + "id": "314", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "327", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "555", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "407", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "411", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2678", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2457,2884", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "554", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "556", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "50", + "id": "555", + "maxAmount": "10" + }, + { + "minAmount": "4", + "weight": "50", + "id": "557", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "50", + "id": "562", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "564", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "561", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "560", + "maxAmount": "10" + }, + { + "minAmount": "4", + "weight": "25", + "id": "565", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "9", + "weight": "50", + "id": "7937", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "50", + "id": "886", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6167", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6153", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "353", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "5", + "id": "995", + "maxAmount": "489" + }, + { + "minAmount": "1", + "weight": "5", + "id": "359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2839", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2489,2490", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "6287", + "maxAmount": "1" + } + ] + }, + { + "ids": "2591,2592,2593,2594,2595,2596,2597,7753", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1387", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "6568", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "6526", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "557", + "maxAmount": "80" + }, + { + "minAmount": "10", + "weight": "50", + "id": "554", + "maxAmount": "80" + }, + { + "minAmount": "10", + "weight": "25", + "id": "556", + "maxAmount": "80" + }, + { + "minAmount": "10", + "weight": "25", + "id": "555", + "maxAmount": "80" + }, + { + "minAmount": "5", + "weight": "25", + "id": "562", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "561", + "maxAmount": "8" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "560", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4697", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "5", + "id": "4699", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "6529", + "maxAmount": "700" + }, + { + "minAmount": "1", + "weight": "50", + "id": "12168", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9194", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "5", + "id": "7936", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "2598,2599,2600,2601,2602,2603,7754,7767,7768,7769", + "main": [ + { + "minAmount": "150", + "weight": "50", + "id": "6529", + "maxAmount": "800" + }, + { + "minAmount": "1", + "weight": "50", + "id": "12168", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "12168", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "1775", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "161", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "1780", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "1744", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "1741", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "1738", + "maxAmount": "8" + }, + { + "minAmount": "2", + "weight": "5", + "id": "7936", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "9194", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "2604,2605,2606,2607,2608,2609,7755", + "main": [ + { + "minAmount": "9", + "weight": "1", + "id": "6522", + "maxAmount": "9" + }, + { + "minAmount": "11", + "weight": "1", + "id": "6522", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "1", + "id": "6523", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "6525", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "6524", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "6568", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "167", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "50", + "id": "6529", + "maxAmount": "1500" + }, + { + "minAmount": "2", + "weight": "50", + "id": "12168", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9194", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "2610,2611,2612,2613,2614,2615,2616,2624,2625", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "6528", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1393", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "6524", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "6568", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "167", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "161", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "50", + "id": "6529", + "maxAmount": "1900" + }, + { + "minAmount": "1", + "weight": "50", + "id": "12168", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7054", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "7054", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9194", + "maxAmount": "4" + }, + { + "minAmount": "5", + "weight": "5", + "id": "7936", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "2683", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "882", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "877", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "562", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "558", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "554", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2701", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2684", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "882", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "877", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "562", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "558", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "557", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2691", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2698", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1153", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1424", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "888", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1283", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1125", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1077", + "maxAmount": "1" + }, + { + "minAmount": "29", + "weight": "25", + "id": "558", + "maxAmount": "29" + }, + { + "minAmount": "10", + "weight": "25", + "id": "557", + "maxAmount": "10" + }, + { + "minAmount": "9", + "weight": "25", + "id": "559", + "maxAmount": "9" + }, + { + "minAmount": "7", + "weight": "25", + "id": "564", + "maxAmount": "7" + }, + { + "minAmount": "46", + "weight": "25", + "id": "562", + "maxAmount": "46" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "34", + "weight": "25", + "id": "563", + "maxAmount": "34" + }, + { + "minAmount": "6", + "weight": "5", + "id": "561", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "5", + "id": "5324", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "23", + "weight": "5", + "id": "5323", + "maxAmount": "23" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5321", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "500" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1933", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2706,3421,3424,4346", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7536", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7538", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "407", + "maxAmount": "2" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "7518", + "maxAmount": "1" + } + ] + }, + { + "ids": "2707,2708,6115,6116", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7889", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2709", + "main": [ + { + "minAmount": "4", + "weight": "50", + "id": "554", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "2710", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "555", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "100", + "id": "555", + "maxAmount": "10" + } + ] + }, + { + "ids": "2711", + "main": [ + { + "minAmount": "5", + "weight": "50", + "id": "557", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1440", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "2712", + "main": [ + { + "minAmount": "4", + "weight": "50", + "id": "556", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5527", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "2717", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1013", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "50", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "27", + "weight": "50", + "id": "995", + "maxAmount": "434" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1625", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1934", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2351", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "5", + "id": "532", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2783", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1367", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11235", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1183", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "562", + "maxAmount": "10" + }, + { + "minAmount": "7", + "weight": "50", + "id": "565", + "maxAmount": "7" + }, + { + "minAmount": "47", + "weight": "25", + "id": "556", + "maxAmount": "47" + }, + { + "minAmount": "3", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "2" + }, + { + "minAmount": "64", + "weight": "50", + "id": "995", + "maxAmount": "64" + }, + { + "minAmount": "95", + "weight": "50", + "id": "995", + "maxAmount": "95" + }, + { + "minAmount": "1", + "weight": "25", + "id": "121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "385", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1456", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "2803", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "441", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "454", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5324", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5323", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "554", + "maxAmount": "42" + }, + { + "minAmount": "5", + "weight": "50", + "id": "561", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "1831", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1829", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1827", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1825", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1971", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "1823", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2804,2805,2806", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "441", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "454", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5324", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5323", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "554", + "maxAmount": "42" + }, + { + "minAmount": "5", + "weight": "50", + "id": "561", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "1831", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1829", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1827", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1825", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1971", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "1823", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2807,2808", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "441", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "454", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5324", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "50", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5323", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "554", + "maxAmount": "42" + }, + { + "minAmount": "5", + "weight": "50", + "id": "561", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "1831", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1829", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1827", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1825", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1971", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "1823", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2837,2838,2839,2840,2841,2842,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1329", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1209", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "9141", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "50", + "id": "556", + "maxAmount": "3" + }, + { + "minAmount": "23", + "weight": "25", + "id": "555", + "maxAmount": "23" + }, + { + "minAmount": "6", + "weight": "25", + "id": "559", + "maxAmount": "6" + }, + { + "minAmount": "7", + "weight": "25", + "id": "562", + "maxAmount": "7" + }, + { + "minAmount": "5", + "weight": "25", + "id": "564", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "38", + "weight": "50", + "id": "995", + "maxAmount": "46" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6716", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "313", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6721", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7863", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2843,2844,2845,2846,2847,2848", + "main": [ + { + "minAmount": "17", + "weight": "25", + "id": "555", + "maxAmount": "17" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "50", + "id": "559", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "556", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7863", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6716", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "50", + "id": "313", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6721", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "2850", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "2880", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "2881", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3757", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6724", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20", + "id": "6739", + "maxAmount": "1" + }, + { + "minAmount": "218", + "weight": "50", + "id": "884", + "maxAmount": "590" + }, + { + "minAmount": "54", + "weight": "50", + "id": "886", + "maxAmount": "98" + }, + { + "minAmount": "214", + "weight": "35", + "id": "863", + "maxAmount": "500" + }, + { + "minAmount": "54", + "weight": "35", + "id": "865", + "maxAmount": "90" + }, + { + "minAmount": "31", + "weight": "35", + "id": "866", + "maxAmount": "69" + }, + { + "minAmount": "7", + "weight": "25", + "id": "805", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "830", + "maxAmount": "10" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9144", + "maxAmount": "14" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2489", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6133", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6135", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3758", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3748", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3749", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "385", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "246", + "weight": "75", + "id": "995", + "maxAmount": "3000" + }, + { + "minAmount": "1", + "weight": "50", + "id": "45", + "maxAmount": "3" + }, + { + "minAmount": "94", + "weight": "25", + "id": "1516", + "maxAmount": "94" + }, + { + "minAmount": "91", + "weight": "25", + "id": "1518", + "maxAmount": "125" + }, + { + "minAmount": "1", + "weight": "50", + "id": "413", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "314", + "maxAmount": "200" + }, + { + "minAmount": "1", + "weight": "5", + "id": "9431", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2725", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6733", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "6729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6155", + "maxAmount": "1" + } + ] + }, + { + "ids": "2882", + "main": [ + { + "minAmount": "1", + "weight": "75", + "id": "1397", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "75", + "id": "1399", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "75", + "id": "1395", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6562", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1392", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "20", + "id": "6739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1439", + "maxAmount": "80" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1441", + "maxAmount": "80" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1445", + "maxAmount": "80" + }, + { + "minAmount": "155", + "weight": "25", + "id": "556", + "maxAmount": "155" + }, + { + "minAmount": "32", + "weight": "25", + "id": "4698", + "maxAmount": "32" + }, + { + "minAmount": "22", + "weight": "25", + "id": "560", + "maxAmount": "85" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3758", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3748", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3755", + "maxAmount": "1" + }, + { + "minAmount": "256", + "weight": "75", + "id": "995", + "maxAmount": "3000" + }, + { + "minAmount": "50", + "weight": "75", + "id": "7937", + "maxAmount": "100" + }, + { + "minAmount": "150", + "weight": "50", + "id": "7937", + "maxAmount": "150" + }, + { + "minAmount": "1", + "weight": "75", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6731", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "6729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6155", + "maxAmount": "1" + } + ] + }, + { + "ids": "2883", + "main": [ + { + "minAmount": "1", + "weight": "55", + "id": "3757", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1343", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1315", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20", + "id": "6739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1193", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3758", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3748", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6737", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6735", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2570", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6130", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "25", + "weight": "25", + "id": "448", + "maxAmount": "25" + }, + { + "minAmount": "100", + "weight": "25", + "id": "454", + "maxAmount": "100" + }, + { + "minAmount": "150", + "weight": "5", + "id": "441", + "maxAmount": "150" + }, + { + "minAmount": "15", + "weight": "5", + "id": "2354", + "maxAmount": "38" + }, + { + "minAmount": "5", + "weight": "25", + "id": "365", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "373", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "385", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "75", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "75", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "156", + "weight": "75", + "id": "995", + "maxAmount": "3000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "6729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6155", + "maxAmount": "1" + } + ] + }, + { + "ids": "2889", + "main": [ + { + "minAmount": "5", + "weight": "50", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "9", + "weight": "50", + "id": "555", + "maxAmount": "9" + }, + { + "minAmount": "4", + "weight": "50", + "id": "7936", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1454", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "886", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "50", + "id": "884", + "maxAmount": "17" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3757", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5318", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5324", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5322", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12148", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "50", + "id": "401", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "403", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "590", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1781", + "maxAmount": "1" + }, + { + "minAmount": "355", + "weight": "25", + "id": "995", + "maxAmount": "355" + }, + { + "minAmount": "1", + "weight": "25", + "id": "231", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2819", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "3068,3069,3070,3071", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1285", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1399", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6809", + "maxAmount": "1" + }, + { + "minAmount": "250", + "weight": "25", + "id": "7937", + "maxAmount": "250" + }, + { + "minAmount": "225", + "weight": "25", + "id": "556", + "maxAmount": "225" + }, + { + "minAmount": "120", + "weight": "25", + "id": "555", + "maxAmount": "150" + }, + { + "minAmount": "80", + "weight": "25", + "id": "562", + "maxAmount": "80" + }, + { + "minAmount": "45", + "weight": "25", + "id": "563", + "maxAmount": "45" + }, + { + "minAmount": "2", + "weight": "25", + "id": "565", + "maxAmount": "11" + }, + { + "minAmount": "20", + "weight": "5", + "id": "566", + "maxAmount": "20" + }, + { + "minAmount": "35", + "weight": "25", + "id": "560", + "maxAmount": "40" + }, + { + "minAmount": "8", + "weight": "50", + "id": "9142", + "maxAmount": "39" + }, + { + "minAmount": "7", + "weight": "50", + "id": "9143", + "maxAmount": "99" + }, + { + "minAmount": "5", + "weight": "50", + "id": "9144", + "maxAmount": "44" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5295", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "50", + "id": "995", + "maxAmount": "420" + }, + { + "minAmount": "3", + "weight": "25", + "id": "379", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "133", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "9465", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11286", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6809", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1399", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1618", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "25", + "id": "1620", + "maxAmount": "10" + }, + { + "minAmount": "75", + "weight": "25", + "id": "568", + "maxAmount": "75" + }, + { + "minAmount": "200", + "weight": "25", + "id": "441", + "maxAmount": "200" + }, + { + "minAmount": "35", + "weight": "50", + "id": "1514", + "maxAmount": "35" + }, + { + "minAmount": "36", + "weight": "25", + "id": "892", + "maxAmount": "36" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "6812", + "maxAmount": "1" + } + ] + }, + { + "ids": "3153", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1387", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4123", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "562", + "maxAmount": "30" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "90" + }, + { + "minAmount": "3", + "weight": "25", + "id": "560", + "maxAmount": "3" + }, + { + "minAmount": "30", + "weight": "50", + "id": "995", + "maxAmount": "30" + }, + { + "minAmount": "40", + "weight": "50", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "50", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2815", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "3200", + "description": "Chaos Elemental", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2739", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "250", + "weight": "50", + "id": "562", + "maxAmount": "250" + }, + { + "minAmount": "300", + "weight": "50", + "id": "809", + "maxAmount": "300" + }, + { + "minAmount": "500", + "weight": "25", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "1", + "weight": "25", + "id": "560", + "maxAmount": "125" + }, + { + "minAmount": "75", + "weight": "25", + "id": "565", + "maxAmount": "75" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2442", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2297", + "maxAmount": "3" + }, + { + "minAmount": "10", + "weight": "50", + "id": "265", + "maxAmount": "10" + }, + { + "minAmount": "5", + "weight": "25", + "id": "361", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5940", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5952", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "526", + "maxAmount": "4" + }, + { + "minAmount": "5", + "weight": "50", + "id": "530", + "maxAmount": "5" + }, + { + "minAmount": "3", + "weight": "50", + "id": "532", + "maxAmount": "3" + }, + { + "minAmount": "7500", + "weight": "25", + "id": "995", + "maxAmount": "7500" + }, + { + "minAmount": "1", + "weight": "25", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "534", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1462", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "3201,3202", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1397", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1393", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1387", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1401", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "556", + "maxAmount": "17" + }, + { + "minAmount": "18", + "weight": "50", + "id": "554", + "maxAmount": "45" + }, + { + "minAmount": "4", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "50", + "id": "561", + "maxAmount": "37" + }, + { + "minAmount": "2", + "weight": "25", + "id": "4694", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "11", + "weight": "50", + "id": "995", + "maxAmount": "200" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "569", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "1781", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "3222", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "25", + "id": "555", + "maxAmount": "7" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "2", + "weight": "5", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "7", + "weight": "5", + "id": "559", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "50", + "id": "877", + "maxAmount": "12" + }, + { + "minAmount": "7", + "weight": "25", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2702", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "3237", + "main": [ + { + "minAmount": "2", + "weight": "50", + "id": "877", + "maxAmount": "12" + }, + { + "minAmount": "7", + "weight": "25", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "13" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2714", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "3238", + "main": [ + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "25", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "50", + "id": "877", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "995", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2707", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "3239", + "main": [ + { + "minAmount": "7", + "weight": "25", + "id": "882", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "25", + "id": "877", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "557", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "6", + "weight": "25", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "995", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "25", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2680", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "3240,5025,5048", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "995", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "25", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2684", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "3340", + "description": "Giant Mole", + "main": [ + { + "minAmount": "105", + "weight": "50", + "id": "556", + "maxAmount": "105" + }, + { + "minAmount": "1", + "weight": "20", + "id": "232", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "20", + "id": "12110", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "20", + "id": "222", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "20", + "id": "238", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "15", + "id": "2971", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "20", + "id": "10110", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "20", + "id": "226", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "20", + "id": "9018", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "20", + "id": "224", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "15", + "id": "240", + "maxAmount": "10" + }, + { + "minAmount": "105", + "weight": "50", + "id": "554", + "maxAmount": "105" + }, + { + "minAmount": "15", + "weight": "50", + "id": "565", + "maxAmount": "15" + }, + { + "minAmount": "7", + "weight": "50", + "id": "560", + "maxAmount": "7" + }, + { + "minAmount": "15", + "weight": "25", + "id": "563", + "maxAmount": "15" + }, + { + "minAmount": "690", + "weight": "25", + "id": "884", + "maxAmount": "690" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1369", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1725", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "385", + "maxAmount": "5" + }, + { + "minAmount": "100", + "weight": "25", + "id": "1516", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2735", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "413", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "7416", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "7418", + "maxAmount": "6" + } + ] + }, + { + "ids": "3346,3347", + "main": [ + { + "minAmount": "2", + "weight": "25", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "10", + "weight": "25", + "id": "563", + "maxAmount": "50" + }, + { + "minAmount": "15", + "weight": "25", + "id": "557", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5323", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5305", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5308", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5098", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5307", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5306", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5096", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5099", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7432", + "maxAmount": "1" + }, + { + "minAmount": "44", + "weight": "25", + "id": "995", + "maxAmount": "44" + }, + { + "minAmount": "64", + "weight": "25", + "id": "995", + "maxAmount": "64" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6035", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2970", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "3376", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "145", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "534", + "maxAmount": "1" + } + ] + }, + { + "ids": "3406,6217,7714,7715", + "main": [ + { + "minAmount": "2", + "weight": "50", + "id": "882", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "50", + "id": "877", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1155", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1277", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1265", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "884", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1101", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1267", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "886", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1269", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1383", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "288", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1913", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1891", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6794", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "556", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "555", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "5", + "id": "562", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1718", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2700", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6691", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "193", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1716", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "5", + "id": "2", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "3587", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "7844", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "3697,3698,3699,3700,3701,3702,3703,3704,3705", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "60", + "weight": "50", + "id": "556", + "maxAmount": "60" + }, + { + "minAmount": "9", + "weight": "25", + "id": "562", + "maxAmount": "9" + }, + { + "minAmount": "4", + "weight": "25", + "id": "564", + "maxAmount": "4" + }, + { + "minAmount": "20", + "weight": "25", + "id": "555", + "maxAmount": "20" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "25", + "id": "888", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1329", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1265", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "50", + "id": "995", + "maxAmount": "20" + }, + { + "minAmount": "50", + "weight": "50", + "id": "995", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "3706,3710", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "3707", + "main": [ + { + "minAmount": "10", + "weight": "25", + "id": "378", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "383", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "384", + "maxAmount": "3" + }, + { + "minAmount": "8", + "weight": "25", + "id": "384", + "maxAmount": "8" + }, + { + "minAmount": "18", + "weight": "25", + "id": "350", + "maxAmount": "18" + }, + { + "minAmount": "9", + "weight": "25", + "id": "372", + "maxAmount": "9" + }, + { + "minAmount": "18", + "weight": "5", + "id": "2135", + "maxAmount": "18" + }, + { + "minAmount": "10", + "weight": "50", + "id": "557", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "557", + "maxAmount": "18" + }, + { + "minAmount": "7", + "weight": "50", + "id": "560", + "maxAmount": "7" + }, + { + "minAmount": "10", + "weight": "25", + "id": "555", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "25", + "id": "555", + "maxAmount": "18" + }, + { + "minAmount": "18", + "weight": "25", + "id": "556", + "maxAmount": "18" + }, + { + "minAmount": "4", + "weight": "25", + "id": "565", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11037", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2134", + "maxAmount": "1" + } + ] + }, + { + "ids": "3808,3819", + "main": [ + { + "minAmount": "10", + "weight": "50", + "id": "5324", + "maxAmount": "29" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5101", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "5", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "5", + "id": "5319", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5322", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5096", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5097", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5099", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5103", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5308", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5305", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5323", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5098", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5309", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5307", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5320", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2150", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2114", + "maxAmount": "1" + }, + { + "minAmount": "16", + "weight": "50", + "id": "1968", + "maxAmount": "101" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2253", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2064", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1458", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "10", + "weight": "25", + "id": "557", + "maxAmount": "14" + }, + { + "minAmount": "5", + "weight": "5", + "id": "566", + "maxAmount": "11" + }, + { + "minAmount": "12", + "weight": "50", + "id": "886", + "maxAmount": "23" + }, + { + "minAmount": "6", + "weight": "25", + "id": "888", + "maxAmount": "13" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7939", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10995", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6333", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6332", + "maxAmount": "4" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "100", + "id": "526", + "maxAmount": "3" + } + ] + }, + { + "ids": "3815", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "3939", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "4695", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "25", + "id": "555", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1452", + "maxAmount": "3" + }, + { + "minAmount": "24", + "weight": "50", + "id": "995", + "maxAmount": "24" + }, + { + "minAmount": "32", + "weight": "50", + "id": "995", + "maxAmount": "32" + }, + { + "minAmount": "1", + "weight": "5", + "id": "405", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "5", + "id": "313", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "25", + "id": "571", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "402", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "404", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "377", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "363", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "50", + "id": "411", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "823", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "46", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "46", + "maxAmount": "3" + }, + { + "minAmount": "14", + "weight": "25", + "id": "4160", + "maxAmount": "14" + }, + { + "minAmount": "1", + "weight": "5", + "id": "413", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2853", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "3940", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5103", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "405", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "363", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "377", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "25", + "id": "401", + "maxAmount": "4" + }, + { + "minAmount": "5", + "weight": "25", + "id": "401", + "maxAmount": "5" + }, + { + "minAmount": "4", + "weight": "25", + "id": "4160", + "maxAmount": "4" + }, + { + "minAmount": "5", + "weight": "25", + "id": "4160", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "5", + "id": "823", + "maxAmount": "2" + }, + { + "minAmount": "15", + "weight": "25", + "id": "403", + "maxAmount": "15" + }, + { + "minAmount": "50", + "weight": "25", + "id": "313", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4695", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "411", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "411", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "46", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "571", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "25", + "id": "555", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2747", + "maxAmount": "1" + }, + { + "minAmount": "250", + "weight": "50", + "id": "995", + "maxAmount": "250" + }, + { + "minAmount": "3000", + "weight": "50", + "id": "995", + "maxAmount": "3000" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1621", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1617", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "987", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "985", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1631", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1615", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "5", + "id": "830", + "maxAmount": "5" + }, + { + "minAmount": "20", + "weight": "5", + "id": "829", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1247", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "5", + "id": "1216", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2366", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "200", + "weight": "25", + "id": "9143", + "maxAmount": "200" + }, + { + "minAmount": "150", + "weight": "5", + "id": "9342", + "maxAmount": "150" + }, + { + "minAmount": "150", + "weight": "5", + "id": "892", + "maxAmount": "200" + }, + { + "minAmount": "500", + "weight": "5", + "id": "892", + "maxAmount": "500" + }, + { + "minAmount": "200", + "weight": "5", + "id": "1392", + "maxAmount": "200" + }, + { + "minAmount": "1000", + "weight": "5", + "id": "574", + "maxAmount": "1000" + }, + { + "minAmount": "1000", + "weight": "5", + "id": "570", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "25", + "weight": "25", + "id": "1441", + "maxAmount": "35" + }, + { + "minAmount": "25", + "weight": "25", + "id": "1443", + "maxAmount": "35" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1452", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "500", + "weight": "25", + "id": "7937", + "maxAmount": "15000" + }, + { + "minAmount": "47", + "weight": "5", + "id": "561", + "maxAmount": "77" + }, + { + "minAmount": "20", + "weight": "5", + "id": "566", + "maxAmount": "20" + }, + { + "minAmount": "45", + "weight": "5", + "id": "563", + "maxAmount": "45" + }, + { + "minAmount": "50", + "weight": "5", + "id": "560", + "maxAmount": "50" + }, + { + "minAmount": "121", + "weight": "5", + "id": "560", + "maxAmount": "121" + }, + { + "minAmount": "50", + "weight": "5", + "id": "565", + "maxAmount": "50" + }, + { + "minAmount": "125", + "weight": "25", + "id": "372", + "maxAmount": "250" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "372", + "maxAmount": "1000" + }, + { + "minAmount": "250", + "weight": "25", + "id": "384", + "maxAmount": "500" + }, + { + "minAmount": "150", + "weight": "25", + "id": "533", + "maxAmount": "500" + }, + { + "minAmount": "150", + "weight": "25", + "id": "454", + "maxAmount": "7500" + }, + { + "minAmount": "150", + "weight": "25", + "id": "450", + "maxAmount": "800" + }, + { + "minAmount": "100", + "weight": "5", + "id": "443", + "maxAmount": "100" + }, + { + "minAmount": "100", + "weight": "5", + "id": "452", + "maxAmount": "100" + }, + { + "minAmount": "1000", + "weight": "5", + "id": "2362", + "maxAmount": "7000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2364", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "5", + "id": "2364", + "maxAmount": "50" + }, + { + "minAmount": "33", + "weight": "25", + "id": "258", + "maxAmount": "33" + }, + { + "minAmount": "25", + "weight": "25", + "id": "2999", + "maxAmount": "250" + }, + { + "minAmount": "30", + "weight": "25", + "id": "3001", + "maxAmount": "120" + }, + { + "minAmount": "10", + "weight": "25", + "id": "270", + "maxAmount": "100" + }, + { + "minAmount": "250", + "weight": "5", + "id": "6686", + "maxAmount": "250" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5321", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "6" + }, + { + "minAmount": "10", + "weight": "5", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "31" + }, + { + "minAmount": "100", + "weight": "5", + "id": "1516", + "maxAmount": "20000" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "3943", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "23", + "weight": "25", + "id": "995", + "maxAmount": "23" + }, + { + "minAmount": "32", + "weight": "25", + "id": "995", + "maxAmount": "32" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2809", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "823", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "46", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "25", + "id": "4160", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "571", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "25", + "id": "555", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4695", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "25", + "id": "313", + "maxAmount": "50" + }, + { + "minAmount": "2", + "weight": "25", + "id": "363", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "405", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "7959", + "maxAmount": "1" + } + ] + }, + { + "ids": "4226", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1059", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2902", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2922", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2912", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2942", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3799", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4155", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1635", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1639", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1641", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "442" + }, + { + "minAmount": "1", + "weight": "25", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "4327", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "882", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1351", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1265", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1349", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1267", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "886", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1269", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4170", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "21" + }, + { + "minAmount": "1", + "weight": "50", + "id": "319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2138", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "314", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1734", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1511", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1625", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "686", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "697", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2704", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1627", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "688", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1739", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "4348,4349,4350,4351,4352", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1335", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "826", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1239", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "561", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "560", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5319", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5324", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5322", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5320", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12148", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "441", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "6334", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "6332", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2115", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "526", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "532", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "5", + "id": "8778", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2811", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "4353,4354,4355,4356,4357", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1247", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "8901", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5324", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5319", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12148", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5320", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5322", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "561", + "maxAmount": "6" + }, + { + "minAmount": "50", + "weight": "5", + "id": "554", + "maxAmount": "50" + }, + { + "minAmount": "44", + "weight": "50", + "id": "995", + "maxAmount": "495" + }, + { + "minAmount": "1", + "weight": "50", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "6334", + "maxAmount": "4" + }, + { + "minAmount": "2", + "weight": "25", + "id": "6332", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2743", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "4381,4382,4383", + "main": [ + { + "minAmount": "5", + "weight": "25", + "id": "890", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "869", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "565", + "maxAmount": "11" + }, + { + "minAmount": "2", + "weight": "50", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "10", + "weight": "50", + "id": "560", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5098", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7082", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "500" + }, + { + "minAmount": "15", + "weight": "25", + "id": "1437", + "maxAmount": "15" + }, + { + "minAmount": "15", + "weight": "25", + "id": "7937", + "maxAmount": "15" + }, + { + "minAmount": "3", + "weight": "25", + "id": "448", + "maxAmount": "14" + }, + { + "minAmount": "1", + "weight": "5", + "id": "187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2723", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9008", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "4389,4390,4391", + "main": [ + { + "minAmount": "3", + "weight": "50", + "id": "559", + "maxAmount": "12" + }, + { + "minAmount": "2", + "weight": "50", + "id": "4696", + "maxAmount": "23" + }, + { + "minAmount": "42", + "weight": "50", + "id": "554", + "maxAmount": "42" + }, + { + "minAmount": "5", + "weight": "50", + "id": "561", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "499" + }, + { + "minAmount": "1", + "weight": "50", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "441", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "9011", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "4397,4398,4399", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "888", + "maxAmount": "17" + }, + { + "minAmount": "5", + "weight": "50", + "id": "890", + "maxAmount": "14" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "329", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "373", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "25", + "id": "1437", + "maxAmount": "15" + }, + { + "minAmount": "30", + "weight": "25", + "id": "1437", + "maxAmount": "30" + }, + { + "minAmount": "7", + "weight": "50", + "id": "555", + "maxAmount": "7" + }, + { + "minAmount": "15", + "weight": "50", + "id": "7937", + "maxAmount": "15" + }, + { + "minAmount": "15", + "weight": "25", + "id": "554", + "maxAmount": "15" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "4" + }, + { + "minAmount": "7", + "weight": "25", + "id": "562", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5318", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "5318", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5319", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5324", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5322", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5320", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "12148", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "25", + "id": "12148", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "14", + "weight": "50", + "id": "995", + "maxAmount": "221" + }, + { + "minAmount": "1", + "weight": "50", + "id": "221", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "596", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2849", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "454", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9010", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "4404,4405,4406", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1155", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "884", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "25", + "id": "869", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1205", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "882", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1237", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "439", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "437", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "7937", + "maxAmount": "15" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1437", + "maxAmount": "30" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "469" + }, + { + "minAmount": "1", + "weight": "25", + "id": "558", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "555", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9007", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2142", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2683", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "4418,6218", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1083", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "3192", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "802", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "803", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "27", + "weight": "50", + "id": "995", + "maxAmount": "27" + }, + { + "minAmount": "97", + "weight": "50", + "id": "995", + "maxAmount": "97" + }, + { + "minAmount": "1", + "weight": "50", + "id": "9016", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2570", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2737", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "4456,4457,4458,4459,6271,6272,6273,6274", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1307", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3190", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1309", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1375", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "807", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1155", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1075", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1101", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2684", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2731", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "4527,4528,4529,4530,4531,4532,4533", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "9079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2727", + "maxAmount": "1" + }, + { + "minAmount": "325", + "weight": "5", + "id": "995", + "maxAmount": "400" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "4546", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1025", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "4577", + "main": [ + { + "minAmount": "3", + "weight": "25", + "id": "2998", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3000", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "751", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "9469", + "maxAmount": "10" + }, + { + "minAmount": "8", + "weight": "25", + "id": "9475", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4605", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "985", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "987", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5075", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "4585", + "main": [ + { + "minAmount": "10", + "weight": "25", + "id": "564", + "maxAmount": "19" + }, + { + "minAmount": "16", + "weight": "25", + "id": "562", + "maxAmount": "27" + }, + { + "minAmount": "9", + "weight": "25", + "id": "561", + "maxAmount": "15" + }, + { + "minAmount": "7", + "weight": "25", + "id": "563", + "maxAmount": "18" + }, + { + "minAmount": "7", + "weight": "25", + "id": "560", + "maxAmount": "13" + }, + { + "minAmount": "6", + "weight": "25", + "id": "565", + "maxAmount": "10" + }, + { + "minAmount": "5", + "weight": "25", + "id": "566", + "maxAmount": "11" + }, + { + "minAmount": "51", + "weight": "25", + "id": "7936", + "maxAmount": "97" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1624", + "maxAmount": "16" + }, + { + "minAmount": "3", + "weight": "25", + "id": "1622", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "1620", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1617", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2998", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3000", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "751", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "25", + "id": "9469", + "maxAmount": "15" + }, + { + "minAmount": "8", + "weight": "25", + "id": "9475", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "985", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "4805,4806,4807,4808,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4849,4850,4851,4852,7606,7607,7608,7609,7614,7615,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631,7632,7633,7634,7635,7682,7683,7684,7685,7691,7692,7693,7694,7695,7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "560", + "maxAmount": "25" + }, + { + "minAmount": "10", + "weight": "50", + "id": "565", + "maxAmount": "15" + }, + { + "minAmount": "80", + "weight": "50", + "id": "554", + "maxAmount": "80" + }, + { + "minAmount": "4", + "weight": "25", + "id": "200", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "202", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "206", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "204", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "208", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "212", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "210", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "216", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "214", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "218", + "maxAmount": "4" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1240" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3385", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3387", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "13157", + "maxAmount": "1" + } + ] + }, + { + "ids": "4930,4931,4933,4934", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "9735", + "maxAmount": "1" + } + ] + }, + { + "ids": "4932,4935", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "9735", + "maxAmount": "1" + } + ] + }, + { + "ids": "5088", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "10129", + "maxAmount": "1" + } + ] + }, + { + "ids": "5116", + "main": [], + "charm": [], + "default": [] + }, + { + "ids": "5250,5254", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "16", + "weight": "25", + "id": "890", + "maxAmount": "16" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "5", + "id": "892", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "565", + "maxAmount": "5" + }, + { + "minAmount": "37", + "weight": "25", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "3", + "weight": "5", + "id": "564", + "maxAmount": "3" + }, + { + "minAmount": "20", + "weight": "5", + "id": "4699", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "9735", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "363", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "5", + "id": "10143", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "5251,5252,5255,5256", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "16", + "weight": "25", + "id": "890", + "maxAmount": "16" + }, + { + "minAmount": "7", + "weight": "25", + "id": "892", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "4699", + "maxAmount": "20" + }, + { + "minAmount": "37", + "weight": "25", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "5", + "weight": "25", + "id": "565", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "60", + "weight": "50", + "id": "995", + "maxAmount": "302" + }, + { + "minAmount": "1", + "weight": "25", + "id": "363", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "9738", + "maxAmount": "3" + }, + { + "minAmount": "6", + "weight": "5", + "id": "10143", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "5361", + "main": [ + { + "minAmount": "90", + "weight": "50", + "id": "555", + "maxAmount": "90" + }, + { + "minAmount": "4", + "weight": "50", + "id": "565", + "maxAmount": "12" + }, + { + "minAmount": "9", + "weight": "25", + "id": "560", + "maxAmount": "19" + }, + { + "minAmount": "3", + "weight": "25", + "id": "4695", + "maxAmount": "10" + }, + { + "minAmount": "3", + "weight": "25", + "id": "4698", + "maxAmount": "9" + }, + { + "minAmount": "3", + "weight": "25", + "id": "4694", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "90", + "weight": "50", + "id": "888", + "maxAmount": "90" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1111", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9419", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1343", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1383", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1395", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "25", + "id": "9337", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2487", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "445", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "448", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "454", + "maxAmount": "8" + }, + { + "minAmount": "2", + "weight": "25", + "id": "2359", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1624", + "maxAmount": "4" + }, + { + "minAmount": "5", + "weight": "25", + "id": "377", + "maxAmount": "12" + }, + { + "minAmount": "3", + "weight": "25", + "id": "383", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "385", + "maxAmount": "1" + }, + { + "minAmount": "97", + "weight": "50", + "id": "995", + "maxAmount": "692" + }, + { + "minAmount": "5", + "weight": "50", + "id": "572", + "maxAmount": "10" + }, + { + "minAmount": "20", + "weight": "25", + "id": "232", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "25", + "id": "407", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "402", + "maxAmount": "29" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "228", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6672", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "193", + "maxAmount": "1" + }, + { + "minAmount": "11", + "weight": "5", + "id": "2", + "maxAmount": "27" + }, + { + "minAmount": "1", + "weight": "5", + "id": "6691", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2737", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "555", + "maxAmount": "1" + } + ] + }, + { + "ids": "5362", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "11373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1317", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "565", + "maxAmount": "20" + }, + { + "minAmount": "35", + "weight": "50", + "id": "4699", + "maxAmount": "35" + }, + { + "minAmount": "37", + "weight": "25", + "id": "4694", + "maxAmount": "37" + }, + { + "minAmount": "17", + "weight": "25", + "id": "561", + "maxAmount": "17" + }, + { + "minAmount": "34", + "weight": "25", + "id": "556", + "maxAmount": "34" + }, + { + "minAmount": "15", + "weight": "25", + "id": "563", + "maxAmount": "15" + }, + { + "minAmount": "45", + "weight": "25", + "id": "563", + "maxAmount": "45" + }, + { + "minAmount": "8", + "weight": "25", + "id": "890", + "maxAmount": "8" + }, + { + "minAmount": "8", + "weight": "25", + "id": "805", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "829", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "25", + "id": "867", + "maxAmount": "8" + }, + { + "minAmount": "90", + "weight": "5", + "id": "888", + "maxAmount": "90" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1813" + }, + { + "minAmount": "5", + "weight": "25", + "id": "448", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2011", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2725", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "100", + "id": "1753", + "maxAmount": "2" + } + ] + }, + { + "ids": "5363", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "14", + "weight": "50", + "id": "811", + "maxAmount": "14" + }, + { + "minAmount": "8", + "weight": "50", + "id": "830", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "9144", + "maxAmount": "27" + }, + { + "minAmount": "8", + "weight": "25", + "id": "868", + "maxAmount": "18" + }, + { + "minAmount": "8", + "weight": "25", + "id": "892", + "maxAmount": "42" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1247", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "27", + "weight": "50", + "id": "565", + "maxAmount": "27" + }, + { + "minAmount": "10", + "weight": "25", + "id": "566", + "maxAmount": "10" + }, + { + "minAmount": "4", + "weight": "5", + "id": "563", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11465", + "maxAmount": "1" + }, + { + "minAmount": "283", + "weight": "50", + "id": "995", + "maxAmount": "8441" + }, + { + "minAmount": "1", + "weight": "25", + "id": "385", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2743", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11338", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "2363", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "1", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11286", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11335", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "536", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "100", + "id": "2359", + "maxAmount": "3" + } + ] + }, + { + "ids": "5414", + "main": [], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "952", + "maxAmount": "1" + } + ] + }, + { + "ids": "5415,5416", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10589", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "75", + "weight": "50", + "id": "555", + "maxAmount": "75" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "15", + "weight": "25", + "id": "561", + "maxAmount": "15" + }, + { + "minAmount": "37", + "weight": "25", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "44", + "weight": "50", + "id": "995", + "maxAmount": "200" + }, + { + "minAmount": "440", + "weight": "50", + "id": "995", + "maxAmount": "440" + }, + { + "minAmount": "1", + "weight": "50", + "id": "449", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2725", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "5417,5418", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10589", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "75", + "weight": "50", + "id": "555", + "maxAmount": "75" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "15", + "weight": "25", + "id": "561", + "maxAmount": "15" + }, + { + "minAmount": "37", + "weight": "25", + "id": "554", + "maxAmount": "37" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "44", + "weight": "50", + "id": "995", + "maxAmount": "200" + }, + { + "minAmount": "440", + "weight": "50", + "id": "995", + "maxAmount": "440" + }, + { + "minAmount": "1", + "weight": "50", + "id": "449", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2727", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "5473,5521,5525", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5100", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1343", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "557", + "maxAmount": "60" + }, + { + "minAmount": "1", + "weight": "25", + "id": "561", + "maxAmount": "8" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "7" + }, + { + "minAmount": "35", + "weight": "50", + "id": "995", + "maxAmount": "352" + }, + { + "minAmount": "1", + "weight": "25", + "id": "384", + "maxAmount": "8" + }, + { + "minAmount": "3", + "weight": "25", + "id": "354", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "454", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "25", + "id": "402", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1760", + "maxAmount": "42" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "5474,5522,5526", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "830", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1343", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "807", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "557", + "maxAmount": "60" + }, + { + "minAmount": "4", + "weight": "25", + "id": "561", + "maxAmount": "10" + }, + { + "minAmount": "3", + "weight": "5", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "402", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "50", + "id": "1760", + "maxAmount": "41" + }, + { + "minAmount": "3", + "weight": "25", + "id": "354", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "454", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "5", + "id": "384", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "5475,5523,5527", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1343", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "557", + "maxAmount": "60" + }, + { + "minAmount": "5", + "weight": "25", + "id": "561", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "35", + "weight": "50", + "id": "995", + "maxAmount": "300" + }, + { + "minAmount": "2", + "weight": "5", + "id": "384", + "maxAmount": "8" + }, + { + "minAmount": "13", + "weight": "5", + "id": "454", + "maxAmount": "13" + }, + { + "minAmount": "4", + "weight": "50", + "id": "402", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "50", + "id": "1760", + "maxAmount": "41" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "5476,5524,5528", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1119", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3122", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "557", + "maxAmount": "60" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "12" + }, + { + "minAmount": "7", + "weight": "25", + "id": "561", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "200" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1759", + "maxAmount": "42" + }, + { + "minAmount": "3", + "weight": "25", + "id": "453", + "maxAmount": "6" + }, + { + "minAmount": "3", + "weight": "25", + "id": "353", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "25", + "id": "401", + "maxAmount": "5" + }, + { + "minAmount": "6", + "weight": "25", + "id": "383", + "maxAmount": "7" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "5529", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "10818", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "10814", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "10816", + "maxAmount": "1" + } + ] + }, + { + "ids": "5593", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "10877", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10859", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "100", + "id": "5001", + "maxAmount": "10" + } + ] + }, + { + "ids": "5594", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "10879", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10859", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "100", + "id": "223", + "maxAmount": "7" + } + ] + }, + { + "ids": "5595", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "10859", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "5", + "id": "2138", + "maxAmount": "4" + }, + { + "minAmount": "8", + "weight": "5", + "id": "2138", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "10880", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "100", + "id": "314", + "maxAmount": "40" + }, + { + "minAmount": "100", + "weight": "100", + "id": "314", + "maxAmount": "100" + } + ] + }, + { + "ids": "5596", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "10881", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10859", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "100", + "id": "7566", + "maxAmount": "7" + } + ] + }, + { + "ids": "5597", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "10882", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "10859", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "100", + "id": "221", + "maxAmount": "4" + }, + { + "minAmount": "6", + "weight": "100", + "id": "221", + "maxAmount": "6" + } + ] + }, + { + "ids": "5603", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "10878", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10859", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "100", + "id": "237", + "maxAmount": "4" + } + ] + }, + { + "ids": "5627,5628", + "main": [ + { + "minAmount": "2", + "weight": "50", + "id": "9141", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1329", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "23", + "weight": "50", + "id": "555", + "maxAmount": "23" + }, + { + "minAmount": "6", + "weight": "50", + "id": "559", + "maxAmount": "6" + }, + { + "minAmount": "7", + "weight": "25", + "id": "562", + "maxAmount": "7" + }, + { + "minAmount": "5", + "weight": "25", + "id": "564", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "5", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7863", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7157", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "50", + "id": "995", + "maxAmount": "65" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1025", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "313", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "987", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "985", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1621", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1617", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "5751", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "557", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "50", + "id": "555", + "maxAmount": "13" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4698", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "5", + "id": "564", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "5", + "id": "561", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "10978", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "995", + "maxAmount": "444" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7416", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2714", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2677", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "5842,5843,5844,5845,5846,5847,5848,5849,5850,5851", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "9", + "weight": "25", + "id": "558", + "maxAmount": "9" + }, + { + "minAmount": "6", + "weight": "25", + "id": "555", + "maxAmount": "6" + }, + { + "minAmount": "5", + "weight": "25", + "id": "557", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "5" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "954", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "313", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1965", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "946", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "11008", + "maxAmount": "1" + } + ] + }, + { + "ids": "5859", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2677", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "5860", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2677", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "5993", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "557", + "maxAmount": "3" + }, + { + "minAmount": "11", + "weight": "25", + "id": "555", + "maxAmount": "11" + }, + { + "minAmount": "11", + "weight": "25", + "id": "562", + "maxAmount": "11" + }, + { + "minAmount": "3", + "weight": "25", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1407", + "maxAmount": "1" + }, + { + "minAmount": "57", + "weight": "25", + "id": "995", + "maxAmount": "57" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1385", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7416", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2725", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7893", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "11205", + "maxAmount": "1" + } + ] + }, + { + "ids": "5996", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "5331", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "2", + "weight": "100", + "id": "532", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "100", + "id": "11210", + "maxAmount": "1" + } + ] + }, + { + "ids": "6028", + "main": [ + { + "minAmount": "5", + "weight": "50", + "id": "2138", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "50", + "id": "2132", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "50", + "id": "2136", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1993", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1353", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "25", + "id": "886", + "maxAmount": "50" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1329", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "830", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "10" + }, + { + "minAmount": "90", + "weight": "50", + "id": "995", + "maxAmount": "90" + }, + { + "minAmount": "1", + "weight": "50", + "id": "6814", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "958", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7868", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "245", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "983", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1925", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "2859", + "maxAmount": "1" + } + ] + }, + { + "ids": "6053,6063", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "6328", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "3385", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "3391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "3101", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "6313", + "maxAmount": "1" + }, + { + "minAmount": "70", + "weight": "50", + "id": "892", + "maxAmount": "70" + }, + { + "minAmount": "70", + "weight": "50", + "id": "811", + "maxAmount": "70" + }, + { + "minAmount": "40", + "weight": "50", + "id": "868", + "maxAmount": "40" + }, + { + "minAmount": "50", + "weight": "50", + "id": "805", + "maxAmount": "50" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9342", + "maxAmount": "2" + }, + { + "minAmount": "4", + "weight": "5", + "id": "9194", + "maxAmount": "4" + }, + { + "minAmount": "1016", + "weight": "50", + "id": "1747", + "maxAmount": "1016" + }, + { + "minAmount": "4", + "weight": "50", + "id": "140", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "5938", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "6155", + "maxAmount": "3" + }, + { + "minAmount": "4", + "weight": "5", + "id": "2364", + "maxAmount": "4" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6054,6064", + "main": [ + { + "minAmount": "2", + "weight": "5", + "id": "1705", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5547", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "1703", + "maxAmount": "3" + }, + { + "minAmount": "100", + "weight": "50", + "id": "11212", + "maxAmount": "500" + }, + { + "minAmount": "3", + "weight": "50", + "id": "9341", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "1215", + "maxAmount": "3" + }, + { + "minAmount": "105", + "weight": "25", + "id": "11230", + "maxAmount": "350" + }, + { + "minAmount": "105", + "weight": "50", + "id": "11232", + "maxAmount": "350" + }, + { + "minAmount": "100", + "weight": "50", + "id": "11237", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "9193", + "maxAmount": "49" + }, + { + "minAmount": "111", + "weight": "50", + "id": "535", + "maxAmount": "297" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5316", + "maxAmount": "1" + }, + { + "minAmount": "52", + "weight": "25", + "id": "537", + "maxAmount": "99" + }, + { + "minAmount": "3", + "weight": "25", + "id": "1616", + "maxAmount": "6" + }, + { + "minAmount": "6", + "weight": "5", + "id": "5300", + "maxAmount": "6" + }, + { + "minAmount": "5", + "weight": "5", + "id": "7219", + "maxAmount": "15" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6103", + "main": [ + { + "minAmount": "323", + "weight": "50", + "id": "995", + "maxAmount": "323" + }, + { + "minAmount": "1", + "weight": "50", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1515", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2851", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11359", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6104", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1081", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1143", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1193", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1424", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "857", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9419", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "50", + "id": "9145", + "maxAmount": "5" + }, + { + "minAmount": "20", + "weight": "50", + "id": "886", + "maxAmount": "20" + }, + { + "minAmount": "10", + "weight": "25", + "id": "808", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "25", + "id": "865", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2356", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11443", + "maxAmount": "1" + }, + { + "minAmount": "106", + "weight": "50", + "id": "995", + "maxAmount": "106" + }, + { + "minAmount": "142", + "weight": "50", + "id": "995", + "maxAmount": "142" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2809", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11337", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1515", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6105", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1515", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1081", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "865", + "maxAmount": "10" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2354", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "25", + "id": "9145", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "5", + "id": "9419", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11443", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2356", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "857", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "5", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2821", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6106", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "106", + "weight": "50", + "id": "995", + "maxAmount": "142" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2356", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9419", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2839", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11359", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6107", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1424", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "857", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "886", + "maxAmount": "20" + }, + { + "minAmount": "5", + "weight": "25", + "id": "9145", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "25", + "id": "9419", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "5", + "id": "808", + "maxAmount": "10" + }, + { + "minAmount": "10", + "weight": "5", + "id": "865", + "maxAmount": "10" + }, + { + "minAmount": "5", + "weight": "5", + "id": "890", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1191", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1193", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1143", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1197", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "106", + "weight": "50", + "id": "995", + "maxAmount": "323" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11443", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2354", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2356", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1515", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "444", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "565", + "maxAmount": "3" + }, + { + "minAmount": "5", + "weight": "25", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2841", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6203", + "description": "Zammy God War Boss", + "main": [ + { + "minAmount": "1", + "weight": "500", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "200", + "id": "224", + "maxAmount": "36" + }, + { + "minAmount": "1", + "weight": "150", + "id": "6050", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6052", + "maxAmount": "16" + }, + { + "minAmount": "1", + "weight": "200", + "id": "244", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "150", + "id": "246", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "150", + "id": "3139", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "150", + "id": "248", + "maxAmount": "32" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6694", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "125", + "id": "6019", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11716", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "49", + "id": "11736", + "maxAmount": "1" + }, + { + "minAmount": "120", + "weight": "500", + "id": "560", + "maxAmount": "125" + }, + { + "minAmount": "80", + "weight": "250", + "id": "565", + "maxAmount": "90" + }, + { + "minAmount": "1", + "weight": "500", + "id": "1123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "500", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "500", + "id": "145", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "500", + "id": "3026", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "500", + "id": "157", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "500", + "id": "189", + "maxAmount": "3" + }, + { + "minAmount": "19362", + "weight": "500", + "id": "995", + "maxAmount": "19362" + }, + { + "minAmount": "3", + "weight": "250", + "id": "5302", + "maxAmount": "3" + }, + { + "minAmount": "10", + "weight": "250", + "id": "2486", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "9", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "9", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "9", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "13", + "id": "11708", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "2735", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "6204", + "main": [ + { + "minAmount": "98", + "weight": "250", + "id": "808", + "maxAmount": "98" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11736", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11716", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "500", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "250", + "id": "245", + "maxAmount": "7" + }, + { + "minAmount": "98", + "weight": "250", + "id": "886", + "maxAmount": "98" + }, + { + "minAmount": "3", + "weight": "250", + "id": "385", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "250", + "id": "7060", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "250", + "id": "157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "189", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "2747", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "6206", + "main": [ + { + "minAmount": "96", + "weight": "250", + "id": "808", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11736", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11716", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1300", + "weight": "500", + "id": "995", + "maxAmount": "1500" + }, + { + "minAmount": "95", + "weight": "250", + "id": "886", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "250", + "id": "565", + "maxAmount": "10" + }, + { + "minAmount": "5", + "weight": "250", + "id": "560", + "maxAmount": "10" + }, + { + "minAmount": "2", + "weight": "250", + "id": "7060", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "250", + "id": "157", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "250", + "id": "245", + "maxAmount": "10" + }, + { + "minAmount": "2", + "weight": "250", + "id": "385", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2747", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "6208", + "main": [ + { + "minAmount": "98", + "weight": "250", + "id": "808", + "maxAmount": "98" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11736", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11716", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "250", + "id": "245", + "maxAmount": "10" + }, + { + "minAmount": "3", + "weight": "250", + "id": "385", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "250", + "id": "7060", + "maxAmount": "2" + }, + { + "minAmount": "98", + "weight": "250", + "id": "886", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "250", + "id": "157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "2731", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "592", + "maxAmount": "1" + } + ] + }, + { + "ids": "6219,6229,6255,6277", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1428", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1355", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1279", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3202", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1317", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1243", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1071", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1059", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1195", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1081", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2747", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6220,6230,6256,6276", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "886", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "50", + "id": "884", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "50", + "id": "882", + "maxAmount": "58" + }, + { + "minAmount": "1", + "weight": "25", + "id": "559", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "892", + "maxAmount": "5" + }, + { + "minAmount": "3", + "weight": "25", + "id": "890", + "maxAmount": "12" + }, + { + "minAmount": "5", + "weight": "50", + "id": "40", + "maxAmount": "5" + }, + { + "minAmount": "12", + "weight": "50", + "id": "53", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "50", + "id": "687", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "50", + "id": "1778", + "maxAmount": "7" + }, + { + "minAmount": "11", + "weight": "50", + "id": "57", + "maxAmount": "11" + }, + { + "minAmount": "12", + "weight": "50", + "id": "57", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "50", + "id": "843", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "851", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "43", + "maxAmount": "13" + }, + { + "minAmount": "1", + "weight": "5", + "id": "861", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2729", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6221,6231,6257,6278", + "main": [ + { + "minAmount": "11", + "weight": "50", + "id": "556", + "maxAmount": "11" + }, + { + "minAmount": "13", + "weight": "50", + "id": "556", + "maxAmount": "13" + }, + { + "minAmount": "5", + "weight": "50", + "id": "555", + "maxAmount": "5" + }, + { + "minAmount": "9", + "weight": "50", + "id": "555", + "maxAmount": "9" + }, + { + "minAmount": "4", + "weight": "50", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "9", + "weight": "50", + "id": "561", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "25", + "id": "562", + "maxAmount": "6" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "9075", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "4695", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4696", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "4698", + "maxAmount": "2" + }, + { + "minAmount": "5", + "weight": "25", + "id": "559", + "maxAmount": "5" + }, + { + "minAmount": "12", + "weight": "25", + "id": "559", + "maxAmount": "12" + }, + { + "minAmount": "5", + "weight": "25", + "id": "558", + "maxAmount": "5" + }, + { + "minAmount": "7", + "weight": "25", + "id": "554", + "maxAmount": "7" + }, + { + "minAmount": "2", + "weight": "25", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "23", + "weight": "50", + "id": "7937", + "maxAmount": "23" + }, + { + "minAmount": "5", + "weight": "25", + "id": "175", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2727", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6222", + "description": "Armadyl God War Boss", + "main": [ + { + "minAmount": "1", + "weight": "500", + "id": "9185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "200", + "id": "224", + "maxAmount": "36" + }, + { + "minAmount": "1", + "weight": "150", + "id": "6050", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6052", + "maxAmount": "16" + }, + { + "minAmount": "1", + "weight": "200", + "id": "244", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "150", + "id": "246", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "150", + "id": "3139", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "150", + "id": "248", + "maxAmount": "32" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6694", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "125", + "id": "6019", + "maxAmount": "24" + }, + { + "minAmount": "18", + "weight": "500", + "id": "9144", + "maxAmount": "25" + }, + { + "minAmount": "500", + "weight": "250", + "id": "558", + "maxAmount": "601" + }, + { + "minAmount": "2", + "weight": "250", + "id": "9244", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "500", + "id": "2503", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "16", + "id": "11718", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "16", + "id": "11720", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "16", + "id": "11722", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "250", + "id": "163", + "maxAmount": "3" + }, + { + "minAmount": "18000", + "weight": "500", + "id": "995", + "maxAmount": "21000" + }, + { + "minAmount": "5", + "weight": "500", + "id": "218", + "maxAmount": "22" + }, + { + "minAmount": "3", + "weight": "500", + "id": "5303", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "250", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "2743", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "5315", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "8", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "8", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "8", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "989", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "12", + "id": "11702", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "314", + "maxAmount": "16" + } + ] + }, + { + "ids": "6223", + "main": [ + { + "minAmount": "1", + "weight": "1", + "id": "11720", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11718", + "maxAmount": "1" + }, + { + "minAmount": "95", + "weight": "500", + "id": "886", + "maxAmount": "100" + }, + { + "minAmount": "15", + "weight": "250", + "id": "4697", + "maxAmount": "25" + }, + { + "minAmount": "2", + "weight": "250", + "id": "391", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "250", + "id": "7058", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "250", + "id": "7056", + "maxAmount": "3" + }, + { + "minAmount": "95", + "weight": "500", + "id": "808", + "maxAmount": "100" + }, + { + "minAmount": "1300", + "weight": "500", + "id": "995", + "maxAmount": "1500" + }, + { + "minAmount": "2", + "weight": "250", + "id": "6693", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "250", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11722", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6225", + "main": [ + { + "minAmount": "1", + "weight": "1", + "id": "11720", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11718", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "250", + "id": "7056", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "250", + "id": "391", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "250", + "id": "7058", + "maxAmount": "3" + }, + { + "minAmount": "13", + "weight": "500", + "id": "4697", + "maxAmount": "25" + }, + { + "minAmount": "95", + "weight": "500", + "id": "808", + "maxAmount": "100" + }, + { + "minAmount": "95", + "weight": "500", + "id": "886", + "maxAmount": "100" + }, + { + "minAmount": "1300", + "weight": "500", + "id": "995", + "maxAmount": "1500" + }, + { + "minAmount": "2", + "weight": "500", + "id": "6693", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "500", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2727", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11722", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6227", + "main": [ + { + "minAmount": "2", + "weight": "250", + "id": "391", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "250", + "id": "7058", + "maxAmount": "3" + }, + { + "minAmount": "1006", + "weight": "500", + "id": "995", + "maxAmount": "1500" + }, + { + "minAmount": "2", + "weight": "250", + "id": "6693", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "250", + "id": "2725", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11720", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11718", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11722", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "50", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246", + "main": [ + { + "minAmount": "15", + "weight": "50", + "id": "556", + "maxAmount": "30" + }, + { + "minAmount": "30", + "weight": "50", + "id": "555", + "maxAmount": "30" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "9", + "weight": "25", + "id": "561", + "maxAmount": "9" + }, + { + "minAmount": "5", + "weight": "25", + "id": "558", + "maxAmount": "5" + }, + { + "minAmount": "11", + "weight": "25", + "id": "565", + "maxAmount": "11" + }, + { + "minAmount": "3", + "weight": "25", + "id": "562", + "maxAmount": "3" + }, + { + "minAmount": "16", + "weight": "25", + "id": "562", + "maxAmount": "16" + }, + { + "minAmount": "12", + "weight": "25", + "id": "559", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "50", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "4", + "weight": "50", + "id": "2362", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "5", + "id": "9431", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "373", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "175", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "314", + "maxAmount": "7" + } + ] + }, + { + "ids": "6247", + "description": "Saradomin God War Boss", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "11730", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "200", + "id": "224", + "maxAmount": "36" + }, + { + "minAmount": "1", + "weight": "150", + "id": "6050", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6052", + "maxAmount": "16" + }, + { + "minAmount": "1", + "weight": "200", + "id": "244", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "150", + "id": "246", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "150", + "id": "3139", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "150", + "id": "248", + "maxAmount": "32" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6694", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "125", + "id": "6019", + "maxAmount": "24" + }, + { + "minAmount": "36", + "weight": "500", + "id": "811", + "maxAmount": "40" + }, + { + "minAmount": "96", + "weight": "500", + "id": "563", + "maxAmount": "105" + }, + { + "minAmount": "1", + "weight": "500", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "1123", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "500", + "id": "207", + "maxAmount": "5" + }, + { + "minAmount": "2", + "weight": "500", + "id": "5295", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "250", + "id": "2434", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "250", + "id": "6687", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "250", + "id": "2442", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "250", + "id": "3024", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5316", + "maxAmount": "1" + }, + { + "minAmount": "361", + "weight": "500", + "id": "995", + "maxAmount": "10300" + }, + { + "minAmount": "10301", + "weight": "500", + "id": "995", + "maxAmount": "20300" + }, + { + "minAmount": "6", + "weight": "250", + "id": "1602", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "9", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "9", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "9", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "2733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "13", + "id": "11706", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6248", + "main": [ + { + "minAmount": "95", + "weight": "500", + "id": "808", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11730", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "500", + "id": "563", + "maxAmount": "10" + }, + { + "minAmount": "97", + "weight": "500", + "id": "886", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "500", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1300", + "weight": "500", + "id": "995", + "maxAmount": "2000" + }, + { + "minAmount": "5", + "weight": "500", + "id": "231", + "maxAmount": "5" + }, + { + "minAmount": "6", + "weight": "250", + "id": "237", + "maxAmount": "6" + }, + { + "minAmount": "3", + "weight": "250", + "id": "7946", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "250", + "id": "2745", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6250", + "main": [ + { + "minAmount": "95", + "weight": "500", + "id": "808", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11730", + "maxAmount": "1" + }, + { + "minAmount": "95", + "weight": "500", + "id": "886", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "250", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1300", + "weight": "500", + "id": "995", + "maxAmount": "1500" + }, + { + "minAmount": "4", + "weight": "250", + "id": "231", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "250", + "id": "7218", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2727", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6252", + "main": [ + { + "minAmount": "1", + "weight": "1", + "id": "11730", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1300", + "weight": "500", + "id": "995", + "maxAmount": "1500" + }, + { + "minAmount": "1", + "weight": "250", + "id": "592", + "maxAmount": "1" + }, + { + "minAmount": "6", + "weight": "250", + "id": "237", + "maxAmount": "6" + }, + { + "minAmount": "5", + "weight": "250", + "id": "231", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "250", + "id": "7218", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "2735", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6254", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2747", + "maxAmount": "1" + } + ] + }, + { + "ids": "6258,6259", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2747", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6260", + "description": "Bandos God War Boss", + "main": [ + { + "minAmount": "1", + "weight": "500", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "200", + "id": "224", + "maxAmount": "36" + }, + { + "minAmount": "1", + "weight": "150", + "id": "6050", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6052", + "maxAmount": "16" + }, + { + "minAmount": "1", + "weight": "200", + "id": "244", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "150", + "id": "246", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "150", + "id": "3139", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "150", + "id": "248", + "maxAmount": "32" + }, + { + "minAmount": "1", + "weight": "100", + "id": "6694", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "125", + "id": "6019", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "250", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "250", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "500", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "16", + "id": "11724", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "16", + "id": "11726", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "19", + "id": "11728", + "maxAmount": "1" + }, + { + "minAmount": "60", + "weight": "250", + "id": "561", + "maxAmount": "70" + }, + { + "minAmount": "15", + "weight": "500", + "id": "450", + "maxAmount": "20" + }, + { + "minAmount": "115", + "weight": "500", + "id": "454", + "maxAmount": "120" + }, + { + "minAmount": "19902", + "weight": "500", + "id": "995", + "maxAmount": "21000" + }, + { + "minAmount": "1", + "weight": "500", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "250", + "id": "1514", + "maxAmount": "20" + }, + { + "minAmount": "3", + "weight": "250", + "id": "3024", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "250", + "id": "3052", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "250", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "8", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "8", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "8", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "12", + "id": "11704", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "2741", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "4834", + "maxAmount": "1" + } + ] + }, + { + "ids": "6261", + "main": [ + { + "minAmount": "95", + "weight": "500", + "id": "808", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11724", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11726", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11728", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "25", + "weight": "500", + "id": "564", + "maxAmount": "30" + }, + { + "minAmount": "20", + "weight": "500", + "id": "561", + "maxAmount": "28" + }, + { + "minAmount": "95", + "weight": "500", + "id": "886", + "maxAmount": "100" + }, + { + "minAmount": "1300", + "weight": "500", + "id": "995", + "maxAmount": "1450" + }, + { + "minAmount": "1", + "weight": "500", + "id": "9741", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "500", + "id": "1025", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "500", + "id": "385", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "500", + "id": "7054", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2735", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6263", + "main": [ + { + "minAmount": "95", + "weight": "500", + "id": "808", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11724", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11726", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11728", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "25", + "weight": "500", + "id": "564", + "maxAmount": "30" + }, + { + "minAmount": "95", + "weight": "500", + "id": "886", + "maxAmount": "100" + }, + { + "minAmount": "1300", + "weight": "500", + "id": "995", + "maxAmount": "1500" + }, + { + "minAmount": "5", + "weight": "500", + "id": "225", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "500", + "id": "1917", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "500", + "id": "1971", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "500", + "id": "385", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "500", + "id": "9741", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "500", + "id": "1025", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "500", + "id": "7054", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2733", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6265", + "main": [ + { + "minAmount": "95", + "weight": "500", + "id": "808", + "maxAmount": "100" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11724", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11726", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11728", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11710", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "11714", + "maxAmount": "1" + }, + { + "minAmount": "25", + "weight": "500", + "id": "564", + "maxAmount": "30" + }, + { + "minAmount": "15", + "weight": "500", + "id": "561", + "maxAmount": "20" + }, + { + "minAmount": "95", + "weight": "500", + "id": "886", + "maxAmount": "100" + }, + { + "minAmount": "1300", + "weight": "500", + "id": "995", + "maxAmount": "1500" + }, + { + "minAmount": "1", + "weight": "500", + "id": "9741", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "500", + "id": "1025", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "500", + "id": "385", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "500", + "id": "7054", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2741", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332", + "main": [ + { + "minAmount": "24", + "weight": "50", + "id": "556", + "maxAmount": "60" + }, + { + "minAmount": "12", + "weight": "50", + "id": "557", + "maxAmount": "36" + }, + { + "minAmount": "4", + "weight": "25", + "id": "560", + "maxAmount": "28" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "566", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "16", + "weight": "50", + "id": "9190", + "maxAmount": "24" + }, + { + "minAmount": "16", + "weight": "50", + "id": "9191", + "maxAmount": "24" + }, + { + "minAmount": "16", + "weight": "50", + "id": "9192", + "maxAmount": "24" + }, + { + "minAmount": "5", + "weight": "50", + "id": "9143", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1343", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "9144", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "479" + }, + { + "minAmount": "23", + "weight": "50", + "id": "314", + "maxAmount": "99" + }, + { + "minAmount": "10", + "weight": "50", + "id": "1939", + "maxAmount": "52" + }, + { + "minAmount": "1", + "weight": "50", + "id": "449", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2185", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2187", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1458", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "384", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6296,6297", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1343", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "449", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "448", + "maxAmount": "9" + }, + { + "minAmount": "6", + "weight": "50", + "id": "454", + "maxAmount": "16" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1458", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1462", + "maxAmount": "1" + }, + { + "minAmount": "49", + "weight": "5", + "id": "556", + "maxAmount": "49" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10995", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "3209", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "50", + "id": "995", + "maxAmount": "180" + }, + { + "minAmount": "10", + "weight": "50", + "id": "1939", + "maxAmount": "32" + }, + { + "minAmount": "2", + "weight": "25", + "id": "1968", + "maxAmount": "54" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2187", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "7939", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "6363,6364", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "100" + }, + { + "minAmount": "3", + "weight": "50", + "id": "379", + "maxAmount": "3" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6365,6366", + "main": [ + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "100" + }, + { + "minAmount": "10", + "weight": "25", + "id": "1777", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "849", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "847", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "25", + "id": "886", + "maxAmount": "10" + }, + { + "minAmount": "20", + "weight": "5", + "id": "888", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "5", + "id": "861", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6378", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5319", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5320", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2108", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3142", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5972", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5984", + "maxAmount": "1" + }, + { + "minAmount": "1020", + "weight": "50", + "id": "314", + "maxAmount": "1020" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1515", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "227", + "maxAmount": "1" + }, + { + "minAmount": "12", + "weight": "25", + "id": "6306", + "maxAmount": "18" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2747", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11766", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11767", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11768", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11769", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11764", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6379", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5322", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "5320", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "5", + "id": "5323", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5288", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "556", + "maxAmount": "48" + }, + { + "minAmount": "28", + "weight": "50", + "id": "555", + "maxAmount": "28" + }, + { + "minAmount": "1", + "weight": "50", + "id": "557", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "50", + "id": "561", + "maxAmount": "15" + }, + { + "minAmount": "2", + "weight": "25", + "id": "560", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "380", + "weight": "5", + "id": "995", + "maxAmount": "380" + }, + { + "minAmount": "2", + "weight": "50", + "id": "5504", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "235", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "454", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "6306", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2823", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6380", + "main": [ + { + "minAmount": "5", + "weight": "50", + "id": "554", + "maxAmount": "5" + }, + { + "minAmount": "6", + "weight": "50", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "50", + "id": "4696", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "50", + "id": "561", + "maxAmount": "2" + }, + { + "minAmount": "9", + "weight": "50", + "id": "561", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "25", + "id": "563", + "maxAmount": "1" + }, + { + "minAmount": "9", + "weight": "25", + "id": "563", + "maxAmount": "9" + }, + { + "minAmount": "10", + "weight": "25", + "id": "557", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "566", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "5", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5288", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "6306", + "maxAmount": "23" + }, + { + "minAmount": "1", + "weight": "25", + "id": "440", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "5504", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "453", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "5", + "id": "235", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2817", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11766", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11767", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11768", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11769", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11764", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "6381,6383", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "562", + "maxAmount": "2" + }, + { + "minAmount": "8", + "weight": "25", + "id": "562", + "maxAmount": "10" + }, + { + "minAmount": "32", + "weight": "25", + "id": "555", + "maxAmount": "32" + }, + { + "minAmount": "35", + "weight": "25", + "id": "555", + "maxAmount": "35" + }, + { + "minAmount": "1", + "weight": "25", + "id": "566", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "247", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2815", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "6468", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "841", + "maxAmount": "1" + }, + { + "minAmount": "28", + "weight": "50", + "id": "882", + "maxAmount": "28" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1422", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1389", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1381", + "maxAmount": "1" + }, + { + "minAmount": "68", + "weight": "50", + "id": "555", + "maxAmount": "68" + }, + { + "minAmount": "6", + "weight": "50", + "id": "554", + "maxAmount": "6" + }, + { + "minAmount": "6", + "weight": "50", + "id": "557", + "maxAmount": "6" + }, + { + "minAmount": "12", + "weight": "25", + "id": "556", + "maxAmount": "12" + }, + { + "minAmount": "33", + "weight": "25", + "id": "558", + "maxAmount": "33" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1438", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1448", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1167", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1061", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1059", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1103", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1173", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1635", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1654", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1673", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1718", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1729", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1727", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "436", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "438", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2349", + "maxAmount": "1" + }, + { + "minAmount": "225", + "weight": "50", + "id": "995", + "maxAmount": "225" + }, + { + "minAmount": "400", + "weight": "50", + "id": "995", + "maxAmount": "400" + }, + { + "minAmount": "1042", + "weight": "50", + "id": "1734", + "maxAmount": "1042" + }, + { + "minAmount": "10", + "weight": "50", + "id": "314", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1741", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "50", + "id": "313", + "maxAmount": "50" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6512,6513,6514,6515,6516,6517,6518,6519", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1341", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1345", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1361", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1141", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1145", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5291", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5300", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5304", + "maxAmount": "1" + }, + { + "minAmount": "8", + "weight": "50", + "id": "995", + "maxAmount": "8" + }, + { + "minAmount": "35", + "weight": "50", + "id": "995", + "maxAmount": "35" + }, + { + "minAmount": "7", + "weight": "50", + "id": "561", + "maxAmount": "7" + }, + { + "minAmount": "25", + "weight": "50", + "id": "557", + "maxAmount": "25" + }, + { + "minAmount": "45", + "weight": "50", + "id": "557", + "maxAmount": "45" + }, + { + "minAmount": "2", + "weight": "25", + "id": "563", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "454", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "7884", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "6604,6635,6655,6666,6677,6697,6703,6715", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [] + }, + { + "ids": "6605,6612,6616,6620,6636,6637,6638,6639,6651,6656,6657,6658,6667,6678,6679,6680,6681,6693,6698,6699,6704,6705,6706,6707,6716,6717,6718,6719", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [] + }, + { + "ids": "6606,6621,6628,6640,6659,6682,6694,6708,6720", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [] + }, + { + "ids": "6607,6609,6614,6617,6625,6632,6644,6663,6675,6686,6701,6712,6724,6728", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [] + }, + { + "ids": "6608,6642,6661,6684,6710,6722,6727", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [] + }, + { + "ids": "6610,6615,6618,6624,6626,6629,6633,6648,6653,6664,6670,6672,6690,6696,6702,6713,6725,6729", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [] + }, + { + "ids": "6611,6619,6627,6630,6634,6650,6654,6665,6673,6676,6692,6714,6726,6730", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + }, + { + "minAmount": "200", + "weight": "25", + "id": "995", + "maxAmount": "5000" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [] + }, + { + "ids": "6613,6623,6643,6652,6662,6669,6671,6674,6685,6695,6700,6711,6723", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + }, + { + "minAmount": "200", + "weight": "25", + "id": "995", + "maxAmount": "5000" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [ + ] + }, + { + "ids": "6622,6631,6641,6660,6668,6683,6709,6721", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "200", + "weight": "25", + "id": "995", + "maxAmount": "5000" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [ + ] + }, + { + "ids": "6645,6687", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [ + ] + }, + { + "ids": "6646,6688", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [ + ] + }, + { + "ids": "6647,6689", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [ + ] + }, + { + "ids": "6649,6691", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [ + ] + }, + { + "ids": "6761,6762,6763", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "886", + "maxAmount": "23" + }, + { + "minAmount": "1", + "weight": "25", + "id": "890", + "maxAmount": "14" + }, + { + "minAmount": "1", + "weight": "50", + "id": "9142", + "maxAmount": "14" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1321", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1329", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "808", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1241", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "857", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "565", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "560", + "maxAmount": "10" + }, + { + "minAmount": "75", + "weight": "25", + "id": "554", + "maxAmount": "75" + }, + { + "minAmount": "25", + "weight": "25", + "id": "4699", + "maxAmount": "25" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "2354", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "2357", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "2356", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "106", + "weight": "50", + "id": "995", + "maxAmount": "323" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1835", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1641", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "161", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1833", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "954", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "946", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11986", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9419", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "9737", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "9745", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2831", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6773", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "5", + "id": "830", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "554", + "maxAmount": "1" + }, + { + "minAmount": "24", + "weight": "25", + "id": "890", + "maxAmount": "24" + }, + { + "minAmount": "8", + "weight": "25", + "id": "10143", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "25", + "id": "562", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "37", + "weight": "5", + "id": "4699", + "maxAmount": "37" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11986", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "9735", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2727", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6774", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "24", + "weight": "5", + "id": "890", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "9", + "weight": "25", + "id": "892", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "373", + "maxAmount": "1" + }, + { + "minAmount": "7", + "weight": "25", + "id": "565", + "maxAmount": "7" + }, + { + "minAmount": "20", + "weight": "25", + "id": "4699", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2735", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "9735", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "987", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10143", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11986", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "985", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1621", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1621", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1607", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1605", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1603", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1823", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6777", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "7" + }, + { + "minAmount": "20", + "weight": "25", + "id": "4699", + "maxAmount": "20" + }, + { + "minAmount": "5", + "weight": "25", + "id": "564", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "24", + "weight": "25", + "id": "890", + "maxAmount": "24" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "9", + "weight": "25", + "id": "892", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1391", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1623", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1621", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1619", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1617", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "373", + "maxAmount": "1" + }, + { + "minAmount": "15", + "weight": "50", + "id": "995", + "maxAmount": "15" + }, + { + "minAmount": "29", + "weight": "50", + "id": "995", + "maxAmount": "29" + }, + { + "minAmount": "3", + "weight": "25", + "id": "9735", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2733", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "10143", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "11986", + "maxAmount": "1" + } + ] + }, + { + "ids": "6778", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "3385", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3387", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3389", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3393", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "30", + "weight": "25", + "id": "561", + "maxAmount": "30" + }, + { + "minAmount": "20", + "weight": "25", + "id": "4699", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "7" + }, + { + "minAmount": "5", + "weight": "25", + "id": "564", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "24", + "weight": "25", + "id": "890", + "maxAmount": "24" + }, + { + "minAmount": "9", + "weight": "25", + "id": "892", + "maxAmount": "9" + }, + { + "minAmount": "200", + "weight": "5", + "id": "9143", + "maxAmount": "200" + }, + { + "minAmount": "1", + "weight": "25", + "id": "371", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "365", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "9052", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "363", + "maxAmount": "1" + }, + { + "minAmount": "60", + "weight": "25", + "id": "995", + "maxAmount": "500" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11986", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1623", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1621", + "maxAmount": "2" + }, + { + "minAmount": "3", + "weight": "25", + "id": "9735", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2727", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6945,7319,7321,7323,7325,7327", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "7911", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11965", + "maxAmount": "1" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "6998,6999", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1187", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1249", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1305", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1377", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1434", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "3204", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4087", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "4585", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4587", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "7158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1712", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2572", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11126", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11732", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1079", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1093", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1127", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1275", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1289", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1319", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1347", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1373", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1432", + "maxAmount": "1" + }, + { + "minAmount": "100", + "weight": "25", + "id": "7937", + "maxAmount": "1000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "563", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "565", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "560", + "maxAmount": "500" + }, + { + "minAmount": "50", + "weight": "25", + "id": "454", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2677", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1602", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "25", + "id": "2358", + "maxAmount": "125" + }, + { + "minAmount": "5", + "weight": "50", + "id": "114", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "25", + "id": "208", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "50", + "id": "450", + "maxAmount": "75" + }, + { + "minAmount": "1", + "weight": "5", + "id": "452", + "maxAmount": "5" + }, + { + "minAmount": "5", + "weight": "25", + "id": "3050", + "maxAmount": "15" + }, + { + "minAmount": "10", + "weight": "25", + "id": "232", + "maxAmount": "500" + }, + { + "minAmount": "20", + "weight": "50", + "id": "554", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "500" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "500" + }, + { + "minAmount": "5", + "weight": "25", + "id": "1516", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "25", + "id": "392", + "maxAmount": "250" + }, + { + "minAmount": "100", + "weight": "50", + "id": "995", + "maxAmount": "1000" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5315", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5316", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5300", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5289", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5288", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "5318", + "maxAmount": "50" + }, + { + "minAmount": "100", + "weight": "25", + "id": "9144", + "maxAmount": "100" + }, + { + "minAmount": "300", + "weight": "25", + "id": "9143", + "maxAmount": "300" + }, + { + "minAmount": "150", + "weight": "25", + "id": "892", + "maxAmount": "150" + }, + { + "minAmount": "100", + "weight": "25", + "id": "441", + "maxAmount": "500" + }, + { + "minAmount": "1000", + "weight": "25", + "id": "12183", + "maxAmount": "15000" + }, + { + "minAmount": "50", + "weight": "25", + "id": "386", + "maxAmount": "100" + }, + { + "minAmount": "5", + "weight": "25", + "id": "7061", + "maxAmount": "20" + } + ], + "charm": [ + { + "minAmount": "4", + "weight": "100", + "id": "12158", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12159", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12160", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "100", + "id": "12163", + "maxAmount": "4" + } + ], + "default": [ + ] + }, + { + "ids": "7078", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "12570", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2745", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "7079,7080", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "12570", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "7081,7082", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "12570", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1239", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10976", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "10977", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "532", + "maxAmount": "1" + } + ] + }, + { + "ids": "7133,7134", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2741", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "7135", + "main": [ + { + "minAmount": "1", + "weight": "5", + "id": "2739", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "7138,7139,7140", + "main": [ + { + "minAmount": "1", + "weight": "1", + "id": "14497", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "14499", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "14501", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "557", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "557", + "maxAmount": "18" + }, + { + "minAmount": "10", + "weight": "50", + "id": "556", + "maxAmount": "36" + }, + { + "minAmount": "10", + "weight": "50", + "id": "559", + "maxAmount": "36" + }, + { + "minAmount": "10", + "weight": "50", + "id": "554", + "maxAmount": "36" + }, + { + "minAmount": "10", + "weight": "50", + "id": "555", + "maxAmount": "18" + }, + { + "minAmount": "10", + "weight": "50", + "id": "558", + "maxAmount": "10" + }, + { + "minAmount": "18", + "weight": "50", + "id": "558", + "maxAmount": "18" + }, + { + "minAmount": "4", + "weight": "25", + "id": "561", + "maxAmount": "4" + }, + { + "minAmount": "4", + "weight": "25", + "id": "562", + "maxAmount": "4" + }, + { + "minAmount": "3", + "weight": "25", + "id": "563", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "25", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "2", + "weight": "25", + "id": "565", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1442", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1444", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1379", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "995", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "995", + "maxAmount": "2" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "7158", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1139", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "556", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "50", + "id": "554", + "maxAmount": "11" + }, + { + "minAmount": "1", + "weight": "50", + "id": "555", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "995", + "maxAmount": "30" + }, + { + "minAmount": "2", + "weight": "50", + "id": "454", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "25", + "id": "225", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "223", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1621", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1617", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1607", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "7159", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1391", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "50", + "id": "448", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "454", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "564", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "50", + "id": "561", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "50", + "id": "562", + "maxAmount": "18" + }, + { + "minAmount": "1", + "weight": "50", + "id": "557", + "maxAmount": "22" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "7160", + "main": [ + { + "minAmount": "1", + "weight": "25", + "id": "1143", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1185", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1165", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "560", + "maxAmount": "15" + }, + { + "minAmount": "1", + "weight": "50", + "id": "563", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "50", + "id": "554", + "maxAmount": "65" + }, + { + "minAmount": "1", + "weight": "25", + "id": "565", + "maxAmount": "16" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5104", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5311", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5100", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5323", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5298", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5281", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5280", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5301", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5297", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5299", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5292", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5293", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5296", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5294", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "12176", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5295", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5303", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5302", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "5321", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "448", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "450", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1621", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1617", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "50", + "id": "995", + "maxAmount": "493" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2679", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2841", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [], + "default": [] + }, + { + "ids": "7640", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1179", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1195", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5100", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5104", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5323", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5281", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "564", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "560", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "4695", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "4697", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "4696", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "4694", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11072", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11074", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11076", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1641", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11085", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11092", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1643", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11095", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3049", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "313", + "maxAmount": "10" + }, + { + "minAmount": "20", + "weight": "50", + "id": "1539", + "maxAmount": "20" + }, + { + "minAmount": "10", + "weight": "50", + "id": "4821", + "maxAmount": "10" + }, + { + "minAmount": "750", + "weight": "5", + "id": "995", + "maxAmount": "750" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2359", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "7641", + "main": [ + { + "minAmount": "1", + "weight": "50", + "id": "1059", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1179", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1195", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1325", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1635", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1637", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1639", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11069", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "11072", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1641", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11076", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "11074", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11085", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11092", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11088", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1643", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11095", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "11115", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "50", + "id": "564", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "560", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "5", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "5", + "id": "4695", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "4697", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "4696", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "4694", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5322", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5100", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "50", + "id": "5320", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5323", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5105", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "5106", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5104", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5105", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "5", + "id": "5281", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "3049", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "10", + "weight": "50", + "id": "313", + "maxAmount": "10" + }, + { + "minAmount": "20", + "weight": "50", + "id": "1539", + "maxAmount": "20" + }, + { + "minAmount": "10", + "weight": "50", + "id": "4821", + "maxAmount": "10" + }, + { + "minAmount": "750", + "weight": "5", + "id": "995", + "maxAmount": "750" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [] + }, + { + "ids": "7642,7643", + "main": [ + { + "minAmount": "6", + "weight": "50", + "id": "892", + "maxAmount": "6" + }, + { + "minAmount": "10", + "weight": "50", + "id": "867", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1357", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1331", + "maxAmount": "1" + }, + { + "minAmount": "2", + "weight": "25", + "id": "868", + "maxAmount": "2" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1333", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "4125", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1181", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1109", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1111", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1183", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "4129", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1147", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1149", + "maxAmount": "1" + }, + { + "minAmount": "50", + "weight": "50", + "id": "556", + "maxAmount": "50" + }, + { + "minAmount": "50", + "weight": "50", + "id": "557", + "maxAmount": "50" + }, + { + "minAmount": "50", + "weight": "50", + "id": "554", + "maxAmount": "50" + }, + { + "minAmount": "10", + "weight": "50", + "id": "7936", + "maxAmount": "10" + }, + { + "minAmount": "20", + "weight": "50", + "id": "562", + "maxAmount": "20" + }, + { + "minAmount": "5", + "weight": "50", + "id": "560", + "maxAmount": "5" + }, + { + "minAmount": "6", + "weight": "25", + "id": "565", + "maxAmount": "30" + }, + { + "minAmount": "3", + "weight": "25", + "id": "454", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "445", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "448", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "450", + "maxAmount": "1" + }, + { + "minAmount": "3", + "weight": "25", + "id": "5001", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "25", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "203", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "2485", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "217", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "250", + "weight": "50", + "id": "995", + "maxAmount": "250" + }, + { + "minAmount": "1", + "weight": "25", + "id": "163", + "maxAmount": "1" + }, + { + "minAmount": "20", + "weight": "5", + "id": "1539", + "maxAmount": "20" + }, + { + "minAmount": "1", + "weight": "5", + "id": "31", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "8133", + "description": "Corporeal Beast", + "main": [ + { + "minAmount": "1", + "weight": "2", + "id": "13746", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "2", + "id": "13748", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "1", + "id": "13750", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "2", + "id": "13752", + "maxAmount": "1" + }, + { + "minAmount": "10000", + "weight": "125", + "id": "995", + "maxAmount": "20000" + }, + { + "minAmount": "20000", + "weight": "100", + "id": "995", + "maxAmount": "30000" + }, + { + "minAmount": "30000", + "weight": "50", + "id": "995", + "maxAmount": "50000" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1624", + "maxAmount": "10" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1622", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "100", + "id": "1620", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "75", + "id": "1618", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "5", + "id": "2366", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1250", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "70", + "id": "13734", + "maxAmount": "1" + }, + { + "minAmount": "750", + "weight": "75", + "id": "890", + "maxAmount": "750" + }, + { + "minAmount": "250", + "weight": "175", + "id": "9144", + "maxAmount": "250" + }, + { + "minAmount": "2000", + "weight": "100", + "id": "2", + "maxAmount": "2000" + }, + { + "minAmount": "175", + "weight": "100", + "id": "9245", + "maxAmount": "175" + }, + { + "minAmount": "2500", + "weight": "100", + "id": "7937", + "maxAmount": "2500" + }, + { + "minAmount": "250", + "weight": "100", + "id": "563", + "maxAmount": "250" + }, + { + "minAmount": "500", + "weight": "100", + "id": "564", + "maxAmount": "500" + }, + { + "minAmount": "209", + "weight": "125", + "id": "560", + "maxAmount": "300" + }, + { + "minAmount": "250", + "weight": "80", + "id": "566", + "maxAmount": "250" + }, + { + "minAmount": "70", + "weight": "80", + "id": "384", + "maxAmount": "70" + }, + { + "minAmount": "120", + "weight": "80", + "id": "240", + "maxAmount": "120" + }, + { + "minAmount": "120", + "weight": "80", + "id": "9738", + "maxAmount": "120" + }, + { + "minAmount": "24", + "weight": "25", + "id": "5321", + "maxAmount": "24" + }, + { + "minAmount": "10", + "weight": "100", + "id": "5295", + "maxAmount": "10" + }, + { + "minAmount": "30", + "weight": "75", + "id": "7061", + "maxAmount": "30" + }, + { + "minAmount": "40", + "weight": "75", + "id": "2449", + "maxAmount": "40" + }, + { + "minAmount": "1", + "weight": "25", + "id": "13754", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "13", + "weight": "100", + "id": "12158", + "maxAmount": "13" + }, + { + "minAmount": "13", + "weight": "100", + "id": "12159", + "maxAmount": "13" + }, + { + "minAmount": "13", + "weight": "100", + "id": "12160", + "maxAmount": "13" + }, + { + "minAmount": "13", + "weight": "100", + "id": "12163", + "maxAmount": "13" + } + ], + "default": [] + }, + { + "ids": "8149,8150,8151", + "description": "Armoured Zombies - Has amazing herb table at the bottom", + "main": [ + { + "minAmount": "4", + "weight": "25", + "id": "888", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1424", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "25", + "id": "1199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "1163", + "maxAmount": "1" + }, + { + "minAmount": "6", + "weight": "25", + "id": "564", + "maxAmount": "6" + }, + { + "minAmount": "12", + "weight": "25", + "id": "562", + "maxAmount": "12" + }, + { + "minAmount": "3", + "weight": "25", + "id": "561", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "565", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "560", + "maxAmount": "3" + }, + { + "minAmount": "3", + "weight": "25", + "id": "7937", + "maxAmount": "12" + }, + { + "minAmount": "1", + "weight": "25", + "id": "222", + "maxAmount": "4" + }, + { + "minAmount": "1", + "weight": "20", + "id": "961", + "maxAmount": "9" + }, + { + "minAmount": "1", + "weight": "10", + "id": "8779", + "maxAmount": "5" + }, + { + "minAmount": "1", + "weight": "3", + "id": "1617", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3", + "id": "1621", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "6", + "id": "8781", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "3", + "id": "313", + "maxAmount": "7" + }, + { + "minAmount": "1", + "weight": "30", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "213", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "215", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "5", + "id": "217", + "maxAmount": "1" + } + ], + "charm": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12158", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12160", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "12163", + "maxAmount": "1" + } + ], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1076,1077", + "main": [ + { + "minAmount": "1", + "weight": "300", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "70", + "id": "1339", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "40", + "id": "1343", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "33", + "id": "1121", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "7", + "id": "1159", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "1071", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "1446", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "30", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "400", + "id": "995", + "maxAmount": "23" + }, + { + "minAmount": "23", + "weight": "100", + "id": "995", + "maxAmount": "38" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1073,1074", + "main": [ + { + "minAmount": "1", + "weight": "200", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "70", + "id": "1097", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "30", + "id": "1099", + "maxAmount": "1" + }, + { + "minAmount": "14", + "weight": "50", + "id": "11700", + "maxAmount": "14" + }, + { + "minAmount": "1", + "weight": "20", + "id": "847", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "849", + "maxAmount": "1" + }, + { + "minAmount": "17", + "weight": "50", + "id": "11686", + "maxAmount": "17" + }, + { + "minAmount": "1", + "weight": "30", + "id": "11694", + "maxAmount": "3" + }, + { + "minAmount": "1", + "weight": "20", + "id": "11697", + "maxAmount": "3" + }, + { + "minAmount": "2", + "weight": "100", + "id": "11688", + "maxAmount": "8" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1440", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "30", + "id": "447", + "maxAmount": "1" + }, + { + "minAmount": "5", + "weight": "240", + "id": "995", + "maxAmount": "23" + }, + { + "minAmount": "23", + "weight": "100", + "id": "995", + "maxAmount": "38" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1065", + "main": [ + { + "minAmount": "1", + "weight": "100", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "80", + "id": "1157", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "30", + "id": "3097", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "3098", + "maxAmount": "1" + }, + { + "minAmount": "6", + "weight": "50", + "id": "3093", + "maxAmount": "6" + }, + { + "minAmount": "6", + "weight": "50", + "id": "869", + "maxAmount": "6" + }, + { + "minAmount": "1", + "weight": "100", + "id": "2353", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20", + "id": "2359", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "100", + "id": "199", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "201", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "207", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "205", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "30", + "id": "209", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20", + "id": "211", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "565", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50", + "id": "1623", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "30", + "id": "1621", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "20", + "id": "1619", + "maxAmount": "1" + }, + { + "minAmount": "24", + "weight": "100", + "id": "995", + "maxAmount": "70" + }, + { + "minAmount": "70", + "weight": "50", + "id": "995", + "maxAmount": "180" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "1044,1045,1046", + "main": [ + { + "minAmount": "1", + "weight": "600", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "14", + "weight": "400", + "id": "995", + "maxAmount": "30" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "188,189,190", + "main": [ + { + "minAmount": "1", + "weight": "500", + "id": "0", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "10", + "id": "1033", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "40", + "id": "1035", + "maxAmount": "1" + }, + { + "minAmount": "24", + "weight": "400", + "id": "995", + "maxAmount": "64" + }, + { + "minAmount": "64", + "weight": "50", + "id": "995", + "maxAmount": "94" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "201", + "description": "Jailer - Black Knight Base - Add Jail Key for Quest when it is added.", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "141", + "description": "Big Wolf", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "2859", + "maxAmount": "1" + } + ] + }, + { + "ids": "1455,1456,1459,1460,1465", + "description": "Ape Atoll - Monkies", + "main": [], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "3179", + "maxAmount": "1" + } + ] + }, + { + "ids": "1904,6368,6367,912,913,914,255,256,27,34,35,689,690,691,3814,3816,4402,4403", + "description": "Menaphite Thug 1904, Zamorak Mage 6338-6367, Battle Mage 912-914, Khazard Guard 255-256, Archer, Watchman, Soldier, Tower Archer 689-691, Gnome Archer, Gnome Mage, Scorpion 4402-4403", + "main": [ + { + "minAmount": "4", + "weight": "50", + "id": "995", + "maxAmount": "34" + } + ], + "charm": [], + "default": [ + { + "minAmount": "1", + "weight": "100", + "id": "526", + "maxAmount": "1" + } + ] + }, + { + "ids": "61,47", + "description": "Empty table for certain NPC", + "main": [], + "charm": [], + "default": [] + } +] diff --git a/Server/data/configs/ground_spawns.json b/Server/data/configs/ground_spawns.json new file mode 100644 index 000000000..145d087af --- /dev/null +++ b/Server/data/configs/ground_spawns.json @@ -0,0 +1,518 @@ +[ + { + "item_id": "28", + "loc_data": "{1,2807,3450,0,7864410}" + }, + { + "item_id": "33", + "loc_data": "{1,2547,3114,0,983050}-{1,3208,3395,1,3932190}" + }, + { + "item_id": "39", + "loc_data": "{1,2672,3433,0,7209050}" + }, + { + "item_id": "88", + "loc_data": "{1,2654,9767,0,4587583}" + }, + { + "item_id": "223", + "loc_data": "{1,3128,9956,0,7864410}-{1,3129,9954,0,7864410}-{1,3126,9958,0,7864410}-{1,3117,9951,0,7864410}-{1,3118,9948,0,7864410}-{1,3119,9949,0,7864410}-{1,3179,9881,0,7864410}-{1,3177,9880,0,7864410}" + }, + { + "item_id": "229", + "loc_data": "{1,2809,3342,0,7864420}-{1,2808,3343,0,7864420}-{1,2588,3090,2,7209050}-{1,2587,3090,2,7209050}-{1,3195,3849,0,6553660}-{1,3186,3836,0,6553660}" + }, + { + "item_id": "231", + "loc_data": "{1,2905,3297,0,1310730}-{1,2907,3295,0,1310730}-{1,2553,3751,0,7864410}-{1,2553,3754,0,7864410}-{1,2552,3757,0,7864410}-{1,2546,3763,0,7864410}-{1,2542,3765,0,7864410}-{1,2540,3765,0,7864410}-{1,2528,3716,0,7864410}-{1,2501,3727,0,7864410}-{1,2502,3726,0,7864410}-{1,2501,3729,0,7864410}-{1,2500,3730,0,7864410}-{1,2500,3731,0,7864410}-{1,2501,3732,0,7864410}-{1,2503,3733,0,7864410}-{1,2504,3732,0,7864410}-{1,2506,3731,0,7864410}-{1,2529,3735,0,7864410}-{1,2531,3736,0,7864410}-{1,2527,3746,0,7864410}-{1,2525,3751,0,7864410}-{1,2532,3762,0,7864410}-{1,2503,3757,0,5898270}-{1,2502,3756,0,5898270}-{1,2502,3754,0,5898270}-{1,2502,3752,0,5898270}-{1,2503,3751,0,5898270}-{1,2505,3753,0,5898270}" + }, + { + "item_id": "239", + "loc_data": "{1,3217,3812,0,196610}-{1,3210,3808,0,196610}" + }, + { + "item_id": "243", + "loc_data": "{1,2912,9809,0,3932190}-{1,2914,9802,0,3932190}-{1,2912,9800,0,3932190}-{1,2908,9807,0,3932190}-{1,2911,9804,0,3932190}-{1,2904,9798,0,3932190}-{1,2905,9804,0,3932190}-{1,2901,9806,0,3932190}-{1,2909,9799,0,3932190}" + }, + { + "item_id": "245", + "loc_data": "{1,2931,3515,0,4587570}" + }, + { + "item_id": "247", + "loc_data": "{1,2512,3080,0,5898270}-{1,2517,3082,0,5898270}-{1,2509,3088,0,5898270}-{1,2508,3084,0,5898270}" + }, + { + "item_id": "272", + "loc_data": "{1,3108,3356,1,10485900}" + }, + { + "item_id": "273", + "loc_data": "{1,3097,3366,0,10485900}" + }, + { + "item_id": "276", + "loc_data": "{1,3111,3367,0,4587570}" + }, + { + "item_id": "277", + "loc_data": "{1,3092,9755,0,4587570}" + }, + { + "item_id": "278", + "loc_data": "{1,2604,3358,0,4587570}" + }, + { + "item_id": "301", + "loc_data": "{1,2608,3397,0,7209050}" + }, + { + "item_id": "303", + "loc_data": "{1,3245,3155,0,10485900}-{1,3244,3159,0,10485900}" + }, + { + "item_id": "305", + "loc_data": "{1,2605,3395,0,7209050}" + }, + { + "item_id": "307", + "loc_data": "{1,2860,3335,0,13762750}" + }, + { + "item_id": "311", + "loc_data": "{1,2605,3396,0,7209050}" + }, + { + "item_id": "347", + "loc_data": "{1,2563,9511,0,5898270}" + }, + { + "item_id": "357", + "loc_data": "{1,2820,3453,0,7209050}" + }, + { + "item_id": "401", + "loc_data": "{1,2803,3382,0,11796640}-{1,2804,3380,0,11796640}-{1,2805,3381,0,11796640}-{1,2805,3384,0,11796640}-{1,2804,3385,0,11796640}-{1,2810,3387,0,11796640}-{1,2809,3388,0,11796640}-{1,2807,3384,0,11796640}-{1,2807,3386,0,11796640}-{1,2809,33885,0,11796640}-{1,2864,3195,0,11796640}-{1,2764,3131,0,11796640}-{1,2753,3125,0,11796640}-{1,2757,3109,0,11796640}-{1,2896,3119,0,5898290}" + }, + { + "item_id": "444", + "loc_data": "{1,3195,9821,0,11141270}-{1,3231,3739,0,19661050}-{1,3236,3741,0,19661050}" + }, + { + "item_id": "480", + "loc_data": "{1,3298,3313,0,5898270}" + }, + { + "item_id": "526", + "loc_data": "{1,2831,9766,0,7864410}-{1,2829,9764,0,7864410}-{1,2510,3080,0,5898270}-{1,2516,3084,0,5898270}-{1,2509,3090,0,5898270}-{1,2512,3084,0,5898270}-{1,2510,3084,0,5898270}-{1,2505,3114,0,5898270}-{1,2507,3116,0,5898270}-{1,2503,3118,0,5898270}-{1,2510,3114,0,5898270}-{1,3238,3606,0,9830500}-{1,3236,3605,0,9830500}-{1,3238,3603,0,9830500}-{1,3240,3603,0,9830500}-{1,3242,3604,0,9830500}-{1,3244,3611,0,9830500}-{1,3247,3614,0,9830500}-{1,3238,3610,0,9830500}-{1,3238,3608,0,9830500}" + }, + { + "item_id": "528", + "loc_data": "{1,3182,3848,0,6553650}-{1,3178,3851,0,6553660}-{1,3179,3853,0,6553660}-{1,3185,3857,0,6553660}-{1,3187,3853,0,6553660}-{1,3211,3822,0,6553660}-{1,3212,3819,0,6553660}-{1,3217,3816,0,6553660}-{1,3218,3813,0,6553660}" + }, + { + "item_id": "542", + "loc_data": "{1,3059,3488,1,7209050}" + }, + { + "item_id": "544", + "loc_data": "{1,3059,3487,1,7209050}" + }, + { + "item_id": "554", + "loc_data": "{1,3303,3311,0,5898270}-{1,3026,3636,0,19661000}" + }, + { + "item_id": "555", + "loc_data": "{1,3297,3316,0,5898270}-{1,3028,3636,0,19661000}" + }, + { + "item_id": "556", + "loc_data": "{1,2938,3158,0,8519790}-{1,3030,3636,0,19661000}" + }, + { + "item_id": "557", + "loc_data": "{1,3032,3636,0,19661000}" + }, + { + "item_id": "558", + "loc_data": "{1,3206,3208,0,5898280}-{1,3023,3640,0,19661000}" + }, + { + "item_id": "559", + "loc_data": "{1,3089,3866,0,5898270}-{1,3021,3637,0,19661000}-{1,3233,3573,0,19661000}-{1,3234,3578,0,19661000}-{1,3230,3582,0,19661000}" + }, + { + "item_id": "562", + "loc_data": "{1,3021,3640,0,19661000}" + }, + { + "item_id": "590", + "loc_data": "{1,3112,3369,2,10485900}-{1,3209,3734,0,13107300}" + }, + { + "item_id": "687", + "loc_data": "{1,2655,3424,0,6553680}-{1,2665,3424,0,6553680}-{1,2669,3423,0,6553680}-{1,2668,3419,0,6553680}-{1,2671,3420,0,6553680}-{1,2677,3423,0,6553680}-{1,2676,3425,0,6553680}-{1,2676,3422,0,6553680}-{1,2679,3424,0,6553680}-{1,2678,3426,0,6553680}-{1,2679,3423,0,6553680}-{1,2680,3424,0,6553680}-{1,2672,3427,0,6553680}-{1,2676,3430,0,6553680}-{1,2673,3428,0,6553680}-{1,2670,3437,0,6553680}" + }, + { + "item_id": "712", + "loc_data": "{1,2887,3412,0,5898270}-{1,2903,3441,0,5898270}" + }, + { + "item_id": "767", + "loc_data": "{1,3245,3385,1,4587570}-{1,3243,3383,1,4587570}" + }, + { + "item_id": "882", + "loc_data": "{1,3205,3227,0,10485900}-{1,2957,3205,0,5898270}-{1,2944,3332,0,5898270}-{1,3104,3599,0,13107300}-{1,3103,3596,0,13107300}-{1,3100,3593,0,13107300}-{1,3096,3595,0,13107300}-{1,3094,3598,0,13107300}-{1,3100,3609,0,13107300}-{1,3104,3610,0,13107300}-{1,3107,3611,0,13107300}-{1,3108,3603,0,13107300}" + }, + { + "item_id": "946", + "loc_data": "{1,3218,9887,0,6553680}-{1,3205,3212,0,6553680}-{1,3215,9625,0,6553680}-{1,3224,3202,0,6553680}-{1,2903,3148,0,6553680}-{1,2820,3450,0,7209050}-{1,3218,3416,1,7864410}-{1,3106,3956,0,5242940}-{1,2566,9526,0,5898270}" + }, + { + "item_id": "952", + "loc_data": "{1,3120,3359,0,8519790}-{1,2981,3370,0,9830490}-{1,3572,3312,0,3276830}-{1,3571,3310,0,3276830}-{1,3218,3412,1,5898270}" + }, + { + "item_id": "954", + "loc_data": "{1,2094,3152,0,11141270}" + }, + { + "item_id": "960", + "loc_data": "{1,2846,3383,0,11796640}-{1,2848,3383,0,11796640}-{1,2851,3239,0,11796640}-{1,2847,3238,0,11796640}-{1,2845,3232,0,11796640}-{1,2856,3231,0,11796640}-{1,2857,3236,0,11796640}-{1,3216,3665,0,16384200}-{1,3224,3668,0,16384200}-{1,3245,3678,0,16384200}-{1,3230,3686,0,16384200}-{1,3216,3677,0,16384200}-{1,3219,3680,0,16384200}" + }, + { + "item_id": "966", + "loc_data": "{1,3237,3696,0,13107350}" + }, + { + "item_id": "970", + "loc_data": "{1,3290,3033,1,7864410}" + }, + { + "item_id": "983", + "loc_data": "{1,3131,9862,0,7209050}" + }, + { + "item_id": "995", + "loc_data": "{3,3195,9834,0,11141270}-{4,3195,9820,0,11141270}-{66,3191,9821,0,11141270}-{56,3190,9819,0,11141270}-{26,3188,9819,0,11141270}-{26,3188,9820,0,11141270}-{35,3189,9819,0,11141270}-{384,3224,3830,0,6553650}-{384,3220,3824,0,6553650}-{2,3106,3547,0,13107300}-{1,3104,3558,0,13107300}-{1,3106,3534,0,13107300}-{2,3101,3564,0,13107300}-{4,3103,3579,0,13107300}-{2,3234,3560,0,13107300}" + }, + { + "item_id": "1005", + "loc_data": "{1,3014,3227,0,3276830}-{1,3009,3204,0,3276830}" + }, + { + "item_id": "1059", + "loc_data": "{1,3242,3385,1,7209050}-{1,3097,3486,0,7864410}-{1,3148,3177,0,5898270}" + }, + { + "item_id": "1061", + "loc_data": "{1,3244,3386,1,13762750}-{1,3208,9620,0,13762750}-{1,3210,9615,0,13762750}-{1,3111,3159,0,13762750}-{1,3112,3155,0,7864420}-{1,3302,3190,0,5898270}" + }, + { + "item_id": "1119", + "loc_data": "{1,3084,3859,0,6553660}" + }, + { + "item_id": "1137", + "loc_data": "{1,3242,3688,0,13107350}" + }, + { + "item_id": "1139", + "loc_data": "{1,3122,3360,0,13762750}" + }, + { + "item_id": "1171", + "loc_data": "{1,3217,3514,0,2949150}" + }, + { + "item_id": "1191", + "loc_data": "{1,3250,3797,0,13107350}" + }, + { + "item_id": "1203", + "loc_data": "{1,3242,3383,1,17039600}-{1,3248,3245,0,13107380}-{1,3216,3695,0,13107350}" + }, + { + "item_id": "1205", + "loc_data": "{1,3213,3216,1,13762750}" + }, + { + "item_id": "1207", + "loc_data": "{1,3213,3682,0,13107300}" + }, + { + "item_id": "1217", + "loc_data": "{1,3180,3821,0,6553660}" + }, + { + "item_id": "1265", + "loc_data": "{1,3081,3429,0,6553650}-{1,3288,9442,0,7864410}-{1,3288,9431,0,7864410}-{1,2963,3216,0,5898270}" + }, + { + "item_id": "1321", + "loc_data": "{1,2965,3211,1,5898270}" + }, + { + "item_id": "1351", + "loc_data": "{1,2795,3161,0,17039600}-{1,2970,3376,1,5898270}" + }, + { + "item_id": "1385", + "loc_data": "{1,3099,3862,0,58983299}" + }, + { + "item_id": "1422", + "loc_data": "{1,3320,3137,0,11141270}" + }, + { + "item_id": "1511", + "loc_data": "{1,3205,3226,2,11796640}-{1,3205,3224,2,11796640}-{1,3208,3225,2,11796640}-{1,3209,3224,2,11796640}-{1,3106,3160,0,11796640}-{1,3106,3159,0,11796640}-{1,3105,3159,0,11796640}-{1,2958,3205,0,5898270}-{1,2959,3205,0,5898270}" + }, + { + "item_id": "1523", + "loc_data": "{1,2614,9570,0,5898270}" + }, + { + "item_id": "1573", + "loc_data": "{1,2740,3637,0,5898270}-{1,2736,3638,0,5898270}-{1,2735,3636,0,5898270}-{1,2743,3636,0,5898270}-{1,2739,3634,0,5898270}-{1,2743,3640,0,5898270}-{1,2741,3639,0,5898270}-{1,2736,3641,0,5898270}-{1,2738,3641,0,5898270}-{1,2734,3640,0,5898270}-{1,2738,3636,0,5898270}" + }, + { + "item_id": "1592", + "loc_data": "{1,2935,3283,1,7209050}" + }, + { + "item_id": "1595", + "loc_data": "{1,2928,3290,0,7209050}" + }, + { + "item_id": "1597", + "loc_data": "{1,2932,3287,1,7209050}" + }, + { + "item_id": "1599", + "loc_data": "{1,2931,3287,1,7209050}" + }, + { + "item_id": "1607", + "loc_data": "{1,3169,3887,0,32768400}-{1,3169,3887,0,32768400}" + }, + { + "item_id": "1641", + "loc_data": "{1,3196,9822,0,11141270}" + }, + { + "item_id": "1654", + "loc_data": "{1,3192,9821,0,11141270}" + }, + { + "item_id": "1734", + "loc_data": "{1,3286,3491,0,4587570}" + }, + { + "item_id": "1735", + "loc_data": "{1,3192,3272,0,10485900}-{1,3126,3356,0,10485900}-{1,2930,3285,1,7209050}-{1,3152,3306,0,5898270}" + }, + { + "item_id": "1755", + "loc_data": "{1,2935,3286,0,7209050}" + }, + { + "item_id": "1785", + "loc_data": "{1,2822,3355,0,11141270}" + }, + { + "item_id": "1887", + "loc_data": "{1,3141,3452,1,7209050}" + }, + { + "item_id": "1917", + "loc_data": "{1,2799,3156,0,11141270}-{1,2796,3165,0,11141270}-{1,3080,3438,0,4587565}-{1,3286,3033,1,7864410}-{1,3077,3439,0,5898270}-{1,3077,3443,0,5898270}-{1,3049,3257,0,11141270}" + }, + { + "item_id": "1919", + "loc_data": "{1,2798,3156,0,11141270}-{1,2799,3155,0,11141270}-{1,2795,3160,0,11141270}-{1,2798,3160,0,11141270}-{1,2798,3161,0,11141270}-{1,2795,3165,0,11141270}-{1,2794,3165,0,11141270}" + }, + { + "item_id": "1921", + "loc_data": "{1,3291,3034,0,7209050}" + }, + { + "item_id": "1923", + "loc_data": "{1,3208,3214,0,6553680}-{1,3140,3452,1,7209050}" + }, + { + "item_id": "1925", + "loc_data": "{1,3225,3294,0,6553680}-{1,3121,3359,0,6553660}-{1,3216,9625,0,6553680}-{1,3026,3289,0,6553680}-{1,2958,3510,0,6553680}-{1,3221,3497,1,6553680}-{1,2958,3510,0,6553680}-{1,3222,3491,1,6553680}-{1,3307,3195,0,5898270}" + }, + { + "item_id": "1929", + "loc_data": "{1,2820,3452,0,7209050}-{1,2823,3449,0,7209050}" + }, + { + "item_id": "1931", + "loc_data": "{1,3209,3214,0,6553680}-{1,3144,3449,2,7209050}-{1,3166,3310,0,7864410}" + }, + { + "item_id": "1935", + "loc_data": "{1,3211,3212,0,6553680}-{1,3211,9625,0,6553680}-{1,2905,3146,0,6553680}-{1,2936,3292,0,7209050}-{1,3142,3447,2,7209050}" + }, + { + "item_id": "1939", + "loc_data": "{1,3193,3181,0,11141270}-{1,3194,3168,0,11141270}-{1,3191,3162,0,11141270}-{1,3189,3163,0,11141270}-{1,3185,3161,0,11141270}-{1,3182,3165,0,11141270}-{1,3172,3166,0,11141270}-{1,3170,3167,0,11141270}-{1,3164,3169,0,11141270}-{1,3171,3177,0,11141270}-{1,3173,3178,0,11141270}-{1,3164,3180,0,11141270}-{1,3165,3187,0,11141270}-{1,3171,3191,0,11141270}-{1,3178,3190,0,11141270}-{1,3181,3193,0,11141270}-{1,3182,3181,0,11141270}-{1,3493,3408,0,3932190}-{1,3494,3402,0,3932190}-{1,3494,3396,0,3932190}-{1,3499,3401,0,3932190}" + }, + { + "item_id": "1944", + "loc_data": "{1,3229,3299,0,3604515}-{1,3226,3301,0,3604515}-{1,3191,3276,0,3604515}-{1,2853,3370,0,3604515}-{1,2852,3369,0,3604515}-{1,2851,3372,0,3604515}-{1,3015,3295,0,5898270}-{1,3016,3295,0,5898270}" + }, + { + "item_id": "1955", + "loc_data": "{1,3141,3447,1,7209050}-{1,3140,3447,1,7209050}-{1,3141,3447,2,7209050}" + }, + { + "item_id": "1963", + "loc_data": "{1,2907,3146,0,11141270}-{1,3009,3207,0,11141270}" + }, + { + "item_id": "1965", + "loc_data": "{1,3217,9622,0,7209050}" + }, + { + "item_id": "1971", + "loc_data": "{1,2843,3369,0,11796640}" + }, + { + "item_id": "1973", + "loc_data": "{1,3143,3453,0,5242920}" + }, + { + "item_id": "1982", + "loc_data": "{1,3085,3261,0,11141270}-{1,3039,3706,0,1310735}" + }, + { + "item_id": "1985", + "loc_data": "{1,3083,3260,0,11141270}-{1,3039,3707,0,1310735}" + }, + { + "item_id": "1987", + "loc_data": "{1,3237,9761,0,7209050}-{1,3144,3450,2,7209050}" + }, + { + "item_id": "1993", + "loc_data": "{1,3291,3033,1,7864410}" + }, + { + "item_id": "2140", + "loc_data": "{1,2971,3382,1,5898270}" + }, + { + "item_id": "2142", + "loc_data": "{1,3080,3443,0,5898270}-{1,3077,3441,0,5898270}" + }, + { + "item_id": "2150", + "loc_data": "{1,2418,3511,0,3932190}-{1,2417,3512,0,3932190}-{1,2416,3512,0,5898270}-{1,2412,3511,0,5898270}-{1,2411,3519,0,5898270}-{1,2415,3518,0,5898270}-{1,2417,3516,0,5898270}-{1,2417,3515,0,5898270}-{1,2421,3519,0,5898270}-{1,2424,3517,0,5898270}-{1,2424,3514,0,5898270}-{1,2428,3510,0,5898270}-{1,2407,3516,0,5898270}-{1,2907,3393,0,5898270}-{1,2903,3400,0,5898270}-{1,2908,3410,0,5898270}" + }, + { + "item_id": "2162", + "loc_data": "{1,2425,3515,0,5898270}-{1,2415,3517,0,5898270}-{1,2414,3518,0,5898270}-{1,2419,3511,0,5898270}-{1,2415,3511,0,5898270}-{1,2414,3510,0,5898270}-{1,2427,3508,0,5898270}-{1,2426,3507,0,5898270}-{1,2408,3518,0,5898270}-{1,2896,3414,0,5898270}" + }, + { + "item_id": "2313", + "loc_data": "{1,3142,3447,1,7209050}-{1,2820,3455,0,7209050}-{1,3222,3494,0,7864410}" + }, + { + "item_id": "2347", + "loc_data": "{1,2934,3286,0,7209050}-{1,2579,3463,0,5242920}-{1,2975,3368,1,5898270}" + }, + { + "item_id": "2357", + "loc_data": "{1,3192,9822,0,11141270}" + }, + { + "item_id": "2398", + "loc_data": "{1,2517,3049,0,6553650}-{1,2511,3045,0,6553650}" + }, + { + "item_id": "2407", + "loc_data": "{1,2935,3460,0,5}" + }, + { + "item_id": "2408", + "loc_data": "{1,2903,3471,0,5}" + }, + { + "item_id": "3109", + "loc_data": "{1,2893,3565,0,1441794}" + }, + { + "item_id": "3110", + "loc_data": "{1,2893,3564,0,1441794}" + }, + { + "item_id": "3111", + "loc_data": "{1,2893,3561,0,1441794}" + }, + { + "item_id": "3112", + "loc_data": "{1,2893,3563,0,1441794}" + }, + { + "item_id": "3113", + "loc_data": "{1,2893,3562,0,1441794}" + }, + { + "item_id": "3138", + "loc_data": "{1,3463,9478,2,3932205}-{1,3461,9480,2,3932205}-{1,3461,9482,2,3932205}-{1,3461,9484,2,3932205}" + }, + { + "item_id": "3711", + "loc_data": "{1,2660,3676,0,196}" + }, + { + "item_id": "3803", + "loc_data": "{1,2658,3676,0,1966}" + }, + { + "item_id": "3805", + "loc_data": "{1,2659,3676,0,196}" + }, + { + "item_id": "4707", + "loc_data": "{1,3571,3312,0,3932200}" + }, + { + "item_id": "5523", + "loc_data": "{1,2935,3282,1,7209050}" + }, + { + "item_id": "6291", + "loc_data": "{1,2681,3111,0,5898270}-{1,2673,3112,0,5898270}-{1,2674,3094,0,5898270}-{1,2671,3089,0,5898270}" + }, + { + "item_id": "6662", + "loc_data": "{1,2984,3112,0,8519770}" + }, + { + "item_id": "6663", + "loc_data": "{1,2984,3114,0,8519770}" + }, + { + "item_id": "11065", + "loc_data": "{1,2928,3289,0,7209050}" + }, + { + "item_id": "12494", + "loc_data": "{1,2762,2973,0,7864380}" + }, + { + "item_id": "5008", + "loc_data": "{1,3230,9609,0,300}" + }, + { + "item_id": "4619", + "loc_data": "{1,2713,4913,0,2}" + } +] diff --git a/Server/data/configs/interface_configs.json b/Server/data/configs/interface_configs.json new file mode 100644 index 000000000..a5f64ee10 --- /dev/null +++ b/Server/data/configs/interface_configs.json @@ -0,0 +1,716 @@ +[ + { + "id": "5", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "12", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "13", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "15", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "24", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "64", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "65", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "66", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "67", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "74", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "92", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "0" + }, + { + "id": "94", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "96", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "98", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "102", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "107", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "115", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "118", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "126", + "interfaceType": "1", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "131", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "137", + "interfaceType": "7", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "140", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "149", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "3" + }, + { + "id": "172", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "173", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "174", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "175", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "176", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "177", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "182", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "14" + }, + { + "id": "187", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "13" + }, + { + "id": "192", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "6" + }, + { + "id": "193", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "6" + }, + { + "id": "198", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "210", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "211", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "212", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "213", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "228", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "230", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "232", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "234", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "236", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "241", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "242", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "243", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "244", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "259", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "2" + }, + { + "id": "261", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "11" + }, + { + "id": "271", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "5" + }, + { + "id": "274", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "2" + }, + { + "id": "303", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "304", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "305", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "306", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "307", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "309", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "311", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "312", + "interfaceType": "7", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "319", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "320", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "1" + }, + { + "id": "324", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "336", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "371", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "372", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "373", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "380", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "381", + "interfaceType": "8", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "387", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "4" + }, + { + "id": "389", + "interfaceType": "6", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "395", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "398", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "407", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "408", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "411", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "4" + }, + { + "id": "421", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "430", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "6" + }, + { + "id": "464", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "12" + }, + { + "id": "482", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "498", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "516", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "519", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "532", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "541", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "548", + "interfaceType": "5", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "549", + "interfaceType": "5", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "550", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "8" + }, + { + "id": "551", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "9" + }, + { + "id": "553", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "582", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "589", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "10" + }, + { + "id": "597", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "598", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "599", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "601", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "620", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "621", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "630", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "638", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "644", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "648", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "656", + "interfaceType": "1", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "660", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "662", + "interfaceType": "2", + "walkable": "true", + "tabIndex": "7" + }, + { + "id": "665", + "interfaceType": "1", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "667", + "interfaceType": "0", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "668", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "670", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "695", + "interfaceType": "7", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "698", + "interfaceType": "7", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "701", + "interfaceType": "7", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "703", + "interfaceType": "7", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "706", + "interfaceType": "7", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "711", + "interfaceType": "7", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "735", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "740", + "interfaceType": "4", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "746", + "interfaceType": "5", + "walkable": "true", + "tabIndex": "-1" + }, + { + "id": "755", + "interfaceType": "5", + "walkable": "false", + "tabIndex": "-1" + }, + { + "id": "763", + "interfaceType": "3", + "walkable": "false", + "tabIndex": "-1" + } +] diff --git a/Server/data/configs/item_configs.json b/Server/data/configs/item_configs.json new file mode 100644 index 000000000..0c005ca68 --- /dev/null +++ b/Server/data/configs/item_configs.json @@ -0,0 +1,138641 @@ +[ + { + "id": "0", + "name": "Dwarf remains", + "examine": "The body of a Dwarf savaged by Goblins.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1", + "name": "Toolkit", + "examine": "Good for repairing a broken cannon.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I got this from Captain Lawgof.", + "shop_price": "1", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2", + "name": "Cannonball", + "examine": "Ammo for the Dwarf Cannon.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "381", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3", + "name": "Nulodion's notes", + "examine": "Construction notes for Dwarf cannon ammo.", + "shop_price": "1", + "weight": "0.02", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4", + "name": "Ammo mould", + "examine": "Used to make cannon ammunition.", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "requirements": "{13,35}", + "weight": "4.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5", + "name": "Instruction manual", + "examine": "An old note book.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "20", + "weight": "0.51", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6", + "name": "Cannon base", + "examine": "The cannon is built on this.", + "tradeable": "true", + "low_alchemy": "75000", + "high_alchemy": "112500", + "shop_price": "187500", + "grand_exchange_price": "189000", + "weight": "7", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7", + "name": "Cannon base", + "tradeable": "true", + "low_alchemy": "75000", + "high_alchemy": "112500", + "shop_price": "187500", + "grand_exchange_price": "189000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8", + "name": "Cannon stand", + "examine": "The mounting for the multicannon.", + "tradeable": "true", + "low_alchemy": "75000", + "high_alchemy": "112500", + "shop_price": "187500", + "grand_exchange_price": "185000", + "weight": "7", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9", + "name": "Cannon stand", + "tradeable": "true", + "low_alchemy": "75000", + "high_alchemy": "112500", + "shop_price": "187500", + "grand_exchange_price": "185000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10", + "name": "Cannon barrels", + "examine": "The barrels for the multicannon.", + "tradeable": "true", + "low_alchemy": "75000", + "high_alchemy": "112500", + "shop_price": "187500", + "grand_exchange_price": "187000", + "weight": "7", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11", + "name": "Cannon barrels", + "tradeable": "true", + "low_alchemy": "75000", + "high_alchemy": "112500", + "shop_price": "187500", + "grand_exchange_price": "187000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12", + "name": "Cannon furnace", + "examine": "This powers the multicannon.", + "tradeable": "true", + "low_alchemy": "75000", + "high_alchemy": "112500", + "shop_price": "187500", + "grand_exchange_price": "175200", + "weight": "7", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13", + "name": "Cannon furnace", + "tradeable": "true", + "low_alchemy": "75000", + "high_alchemy": "112500", + "shop_price": "187500", + "grand_exchange_price": "175200", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14", + "name": "Railing", + "examine": "A metal railing replacement.", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "15", + "name": "Holy table napkin", + "examine": "A cloth given to me by Sir Galahad.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "16", + "name": "Magic whistle", + "examine": "A small tin whistle.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "17", + "name": "Grail bell", + "examine": "I wonder what happens when I ring it?", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "18", + "name": "Magic gold feather", + "examine": "It will point the way for me.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "20", + "name": "White cog", + "examine": "A cog from some machinery.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "21", + "name": "Black cog", + "examine": "A cog from some machinery.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "22", + "name": "Blue cog", + "examine": "A cog from some machinery.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "23", + "name": "Red cog", + "examine": "A cog from some machinery.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "24", + "name": "Rat poison", + "examine": "Doesn't look very tasty.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "25", + "name": "Red vine worm", + "examine": "Wormy.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "26", + "name": "Fishing trophy", + "examine": "Hemenster fishing contest trophy.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "27", + "name": "Fishing pass", + "examine": "Pass to the Hemenster fishing contest.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "28", + "name": "Insect repellent", + "examine": "Drives away all known 6 legged creatures.", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "121", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "30", + "name": "Bucket of wax", + "examine": "It's a bucket of wax.", + "low_alchemy": "2", + "high_alchemy": "3", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "32", + "name": "Lit black candle", + "examine": "A spooky candle.", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "33", + "name": "Lit candle", + "examine": "A candle.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "24", + "grand_exchange_price": "104", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "34", + "name": "Lit candle", + "examine": "A candle.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "24", + "grand_exchange_price": "104", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "35", + "name": "Excalibur", + "examine": "This used to belong to King Arthur.", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "render_anim": "2554", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "20,29,-2,0,0,0,3,2,1,0,0,25,0,0,0", + "weapon_interface": "6", + "has_special": "true", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "36", + "name": "Candle", + "examine": "A candle.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "24", + "grand_exchange_price": "119", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "37", + "name": "Candle", + "tradeable": "true", + "grand_exchange_price": "119", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "38", + "name": "Black candle", + "examine": "A spooky candle.", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "39", + "name": "Bronze arrowtips", + "examine": "I can make an arrow with these.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "16", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "40", + "name": "Iron arrowtips", + "examine": "I can make an arrow with these.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "26", + "grand_exchange_price": "23", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "41", + "name": "Steel arrowtips", + "examine": "I can make an arrow with these.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "36", + "grand_exchange_price": "63", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "42", + "name": "Mithril arrowtips", + "examine": "I can make an arrow with these.", + "tradeable": "true", + "low_alchemy": "27", + "high_alchemy": "40", + "shop_price": "68", + "grand_exchange_price": "74", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "43", + "name": "Adamant arrowtips", + "examine": "I can make an arrow with these.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "160", + "grand_exchange_price": "185", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "44", + "name": "Rune arrowtips", + "examine": "I can make an arrow with these.", + "tradeable": "true", + "low_alchemy": "184", + "high_alchemy": "276", + "shop_price": "460", + "grand_exchange_price": "839", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "45", + "name": "Opal bolt tips", + "examine": "Opal bolt tips.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "grand_exchange_price": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "46", + "name": "Pearl bolt tips", + "examine": "Pearl bolt tips.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "grand_exchange_price": "5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "47", + "name": "Barb bolttips", + "examine": "I can make bolts with these.", + "tradeable": "true", + "low_alchemy": "38", + "high_alchemy": "57", + "destroy": "true", + "tradeable": "false", + "shop_price": "114", + "grand_exchange_price": "44", + "ge_buy_limit": "10000", + "archery_ticket_price": "5", + "durability": null + }, + { + "id": "48", + "name": "Longbow (u)", + "examine": "An unstrung longbow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "14", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "49", + "name": "Longbow (u)", + "tradeable": "true", + "grand_exchange_price": "14", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "50", + "name": "Shortbow (u)", + "examine": "I need to find a string for this.", + "tradeable": "true", + "low_alchemy": "9", + "high_alchemy": "13", + "grand_exchange_price": "5", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "51", + "name": "Shortbow (u)", + "tradeable": "true", + "grand_exchange_price": "5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "52", + "name": "Arrow shaft", + "examine": "A wooden arrow shaft", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "grand_exchange_price": "21", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "53", + "name": "Headless arrow", + "examine": "A wooden arrow shaft with flights attached.", + "tradeable": "true", + "grand_exchange_price": "56", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "54", + "name": "Oak shortbow (u)", + "examine": "An unstrung oak bow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "7", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "55", + "name": "Oak shortbow (u)", + "tradeable": "true", + "grand_exchange_price": "7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "56", + "name": "Oak longbow (u)", + "examine": "An unstrung oak longbow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "20", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "57", + "name": "Oak longbow (u)", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "58", + "name": "Willow longbow (u)", + "examine": "An unstrung willow longbow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "64", + "grand_exchange_price": "46", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "59", + "name": "Willow longbow (u)", + "tradeable": "true", + "grand_exchange_price": "46", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "60", + "name": "Willow shortbow (u)", + "examine": "An unstrung willow shortbow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "16", + "grand_exchange_price": "20", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "61", + "name": "Willow shortbow (u)", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "62", + "name": "Maple longbow (u)", + "examine": "An unstrung maple bow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "128", + "high_alchemy": "192", + "grand_exchange_price": "94", + "weight": "1.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "63", + "name": "Maple longbow (u)", + "tradeable": "true", + "grand_exchange_price": "94", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "64", + "name": "Maple shortbow (u)", + "examine": "An unstrung maple bow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "56", + "weight": "0.9", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "65", + "name": "Maple shortbow (u)", + "tradeable": "true", + "grand_exchange_price": "56", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "66", + "name": "Yew longbow (u)", + "examine": "An unstrung yew longbow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "256", + "high_alchemy": "384", + "grand_exchange_price": "468", + "weight": "1.32", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "67", + "name": "Yew longbow (u)", + "tradeable": "true", + "grand_exchange_price": "468", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "68", + "name": "Yew shortbow (u)", + "examine": "An unstrung yew shortbow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "158", + "weight": "1.32", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "69", + "name": "Yew shortbow (u)", + "tradeable": "true", + "grand_exchange_price": "158", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "70", + "name": "Magic longbow (u)", + "examine": "An unstrung magic longbow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "512", + "high_alchemy": "768", + "shop_price": "931", + "grand_exchange_price": "1246", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "71", + "name": "Magic longbow (u)", + "tradeable": "true", + "grand_exchange_price": "1246", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "72", + "name": "Magic shortbow (u)", + "examine": "An unstrung magic shortbow; I need a bowstring for this.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "shop_price": "890", + "grand_exchange_price": "745", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "73", + "name": "Magic shortbow (u)", + "tradeable": "true", + "grand_exchange_price": "745", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "74", + "name": "Khazard helmet", + "examine": "A helmet, as worn by the minions of General Khazard.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "I can borrow another from the armoury near the Fight Arena.", + "shop_price": "10", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,4,5,3,0,0,0,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "75", + "name": "Khazard armour", + "examine": "Armour, as worn by the minions of General Khazard.", + "low_alchemy": "4", + "high_alchemy": "7", + "destroy_message": "I can borrow another from the armoury near the Fight Arena.", + "shop_price": "12", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,9,11,10,0,0,0,0,0,0,0", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "76", + "name": "Khazard cell keys", + "examine": "These keys open the cells at the Khazard Fight Arena. (Fight Arena)", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The lazy guard probably has a spare set...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "77", + "name": "Khali brew", + "examine": "A bottle of Khazard's worst brew.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Angor, the Khazard barman, has a stock of Khali brew.", + "shop_price": "5", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "78", + "name": "Ice arrows", + "examine": "Can only be fired from yew, magic, or dark bows.", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Can only be fired from yew, magic, dark or twisted bows.", + "shop_price": "2", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,16", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "84", + "name": "Staff of armadyl", + "examine": "The power in this staff causes it to vibrate gently.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "render_anim": "2553", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "85", + "name": "Shiny key", + "examine": "It catches the light! (Temple of Ikov)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "86", + "name": "Pendant of lucien", + "examine": "An amulet made by Lucien.", + "low_alchemy": "4", + "high_alchemy": "7", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "87", + "name": "Armadyl pendant", + "examine": "Yet another amulet.", + "low_alchemy": "4", + "high_alchemy": "7", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "88", + "name": "Boots of lightness", + "examine": "Magic boots that make you lighter than normal.", + "low_alchemy": "2", + "high_alchemy": "3", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "weight": "-4.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "89", + "name": "Boots of lightness", + "examine": "Magic boots that make you lighter than normal.", + "low_alchemy": "2", + "high_alchemy": "3", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "weight": "0.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "90", + "name": "Child's blanket", + "examine": "It's very soft!", + "low_alchemy": "2", + "high_alchemy": "3", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "91", + "name": "Guam potion(unf)", + "examine": "I need another ingredient to finish this guam potion.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "285", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "92", + "name": "Guam potion(unf)", + "tradeable": "true", + "grand_exchange_price": "285", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "93", + "name": "Marrentill potion(unf)", + "examine": "I need another ingredient to finish this marrentill potion.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "43", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "94", + "name": "Marrentill potion(unf)", + "tradeable": "true", + "grand_exchange_price": "43", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "95", + "name": "Tarromin potion(unf)", + "examine": "I need another ingredient to finish this tarromin potion.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "287", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "96", + "name": "Tarromin potion(unf)", + "tradeable": "true", + "grand_exchange_price": "287", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "97", + "name": "Harralander potion(unf)", + "examine": "I need another ingredient to finish this potion.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "64", + "grand_exchange_price": "435", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "98", + "name": "Harralander potion(unf)", + "tradeable": "true", + "grand_exchange_price": "435", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "99", + "name": "Ranarr potion(unf)", + "examine": "I need another ingredient to finish this ranarr potion.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "4823", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "100", + "name": "Ranarr potion(unf)", + "tradeable": "true", + "grand_exchange_price": "4823", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "101", + "name": "Irit potion(unf)", + "examine": "I need another ingredient to finish this irit potion.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "2243", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "102", + "name": "Irit potion(unf)", + "tradeable": "true", + "grand_exchange_price": "2243", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "103", + "name": "Avantoe potion(unf)", + "examine": "I need another ingredient to finish this avantoe potion.", + "tradeable": "true", + "low_alchemy": "19", + "high_alchemy": "28", + "grand_exchange_price": "3831", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "104", + "name": "Avantoe potion(unf)", + "tradeable": "true", + "grand_exchange_price": "3831", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "105", + "name": "Kwuarm potion(unf)", + "examine": "I need another ingredient to finish this kwuarm potion.", + "tradeable": "true", + "low_alchemy": "21", + "high_alchemy": "32", + "grand_exchange_price": "1833", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "106", + "name": "Kwuarm potion(unf)", + "tradeable": "true", + "grand_exchange_price": "1833", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "107", + "name": "Cadantine potion(unf)", + "examine": "I need another ingredient to finish this cadantine potion.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "39", + "grand_exchange_price": "1844", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "108", + "name": "Cadantine potion(unf)", + "tradeable": "true", + "grand_exchange_price": "1844", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "109", + "name": "Dwarf weed potion(unf)", + "examine": "I need another ingredient to finish this dwarf weed potion.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "grand_exchange_price": "6740", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "110", + "name": "Dwarf weed potion(unf)", + "tradeable": "true", + "grand_exchange_price": "6740", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "111", + "name": "Torstol potion(unf)", + "examine": "I need another ingredient to finish this torstol potion.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "14500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "112", + "name": "Torstol potion(unf)", + "tradeable": "true", + "grand_exchange_price": "14500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "113", + "name": "Strength potion(4)", + "examine": "X doses of Strength potion.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "780", + "grand_exchange_price": "1041", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "114", + "name": "Strength potion(4)", + "tradeable": "true", + "grand_exchange_price": "1041", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "115", + "name": "Strength potion(3)", + "examine": "X doses of Strength potion.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "780", + "grand_exchange_price": "812", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "116", + "name": "Strength potion(3)", + "tradeable": "true", + "grand_exchange_price": "812", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "117", + "name": "Strength potion(2)", + "examine": "X doses of Strength potion.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "780", + "grand_exchange_price": "656", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "118", + "name": "Strength potion(2)", + "tradeable": "true", + "grand_exchange_price": "656", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "119", + "name": "Strength potion(1)", + "examine": "X doses of Strength potion.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "780", + "grand_exchange_price": "355", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "120", + "name": "Strength potion(1)", + "tradeable": "true", + "grand_exchange_price": "355", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "121", + "name": "Attack potion(3)", + "examine": "X doses of Attack potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "shop_price": "560", + "grand_exchange_price": "195", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "122", + "name": "Attack potion(3)", + "tradeable": "true", + "grand_exchange_price": "195", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "123", + "name": "Attack potion(2)", + "examine": "X doses of Attack potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "shop_price": "560", + "grand_exchange_price": "113", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "124", + "name": "Attack potion(2)", + "tradeable": "true", + "grand_exchange_price": "113", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "125", + "name": "Attack potion(1)", + "examine": "X doses of Attack potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "shop_price": "560", + "grand_exchange_price": "197", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "126", + "name": "Attack potion(1)", + "tradeable": "true", + "grand_exchange_price": "197", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "127", + "name": "Restore potion(3)", + "examine": "X dose(s) of restore potion.", + "tradeable": "true", + "low_alchemy": "35", + "high_alchemy": "52", + "shop_price": "139", + "grand_exchange_price": "59", + "weight": "0.03", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "128", + "name": "Restore potion(3)", + "tradeable": "true", + "grand_exchange_price": "59", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "129", + "name": "Restore potion(2)", + "examine": "X dose(s) of restore potion.", + "tradeable": "true", + "low_alchemy": "35", + "high_alchemy": "52", + "shop_price": "139", + "grand_exchange_price": "35", + "weight": "0.03", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "130", + "name": "Restore potion(2)", + "tradeable": "true", + "grand_exchange_price": "35", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "131", + "name": "Restore potion(1)", + "examine": "X dose(s) of restore potion.", + "tradeable": "true", + "low_alchemy": "35", + "high_alchemy": "52", + "shop_price": "139", + "grand_exchange_price": "21", + "weight": "0.03", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "132", + "name": "Restore potion(1)", + "tradeable": "true", + "grand_exchange_price": "21", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "133", + "name": "Defence potion(3)", + "examine": "(x) doses of Defence Potion.", + "tradeable": "true", + "low_alchemy": "352", + "high_alchemy": "528", + "shop_price": "114", + "grand_exchange_price": "323", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "134", + "name": "Defence potion(3)", + "tradeable": "true", + "grand_exchange_price": "323", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "135", + "name": "Defence potion(2)", + "examine": "(x) doses of Defence Potion.", + "tradeable": "true", + "low_alchemy": "352", + "high_alchemy": "528", + "shop_price": "114", + "grand_exchange_price": "247", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "136", + "name": "Defence potion(2)", + "tradeable": "true", + "grand_exchange_price": "247", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "137", + "name": "Defence potion(1)", + "examine": "(x) doses of Defence Potion.", + "tradeable": "true", + "low_alchemy": "352", + "high_alchemy": "528", + "shop_price": "114", + "grand_exchange_price": "148", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "138", + "name": "Defence potion(1)", + "tradeable": "true", + "grand_exchange_price": "148", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "139", + "name": "Prayer potion(3)", + "examine": "(X) doses of Prayer restore potion.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "91", + "grand_exchange_price": "4134", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "140", + "name": "Prayer potion(3)", + "tradeable": "true", + "grand_exchange_price": "4134", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "141", + "name": "Prayer potion(2)", + "examine": "(X) doses of Prayer restore potion.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "91", + "grand_exchange_price": "2868", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "142", + "name": "Prayer potion(2)", + "tradeable": "true", + "grand_exchange_price": "2868", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "143", + "name": "Prayer potion(1)", + "examine": "(X) doses of Prayer restore potion.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "91", + "grand_exchange_price": "1353", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "144", + "name": "Prayer potion(1)", + "tradeable": "true", + "grand_exchange_price": "1353", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "145", + "name": "Super attack(3)", + "examine": "X dose(s) of super Attack potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "691", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "146", + "name": "Super attack(3)", + "tradeable": "true", + "grand_exchange_price": "691", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "147", + "name": "Super attack(2)", + "examine": "X dose(s) of super Attack potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "451", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "148", + "name": "Super attack(2)", + "tradeable": "true", + "grand_exchange_price": "451", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "149", + "name": "Super attack(1)", + "examine": "X dose(s) of super Attack potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "243", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "150", + "name": "Super attack(1)", + "tradeable": "true", + "grand_exchange_price": "243", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "151", + "name": "Fishing potion(3)", + "examine": "X doses of Fishing potion.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "40", + "weight": "0.03", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "152", + "name": "Fishing potion(3)", + "tradeable": "true", + "grand_exchange_price": "40", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "153", + "name": "Fishing potion(2)", + "examine": "X doses of Fishing potion.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "56", + "weight": "0.03", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "154", + "name": "Fishing potion(2)", + "tradeable": "true", + "grand_exchange_price": "56", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "155", + "name": "Fishing potion(1)", + "examine": "X doses of Fishing potion.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "87", + "weight": "0.03", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "156", + "name": "Fishing potion(1)", + "tradeable": "true", + "grand_exchange_price": "87", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "157", + "name": "Super strength(3)", + "examine": "X dose(s) of super Strength potion.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "grand_exchange_price": "1679", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "158", + "name": "Super strength(3)", + "tradeable": "true", + "grand_exchange_price": "1679", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "159", + "name": "Super strength(2)", + "examine": "X dose(s) of super Strength potion.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "grand_exchange_price": "1164", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "160", + "name": "Super strength(2)", + "tradeable": "true", + "grand_exchange_price": "1164", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "161", + "name": "Super strength(1)", + "examine": "X dose(s) of super Strength potion.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "grand_exchange_price": "603", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "162", + "name": "Super strength(1)", + "tradeable": "true", + "grand_exchange_price": "603", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "163", + "name": "Super defence(3)", + "examine": "X dose(s) of super Defence potion.", + "tradeable": "true", + "low_alchemy": "105", + "high_alchemy": "158", + "grand_exchange_price": "113", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "164", + "name": "Super defence(3)", + "tradeable": "true", + "grand_exchange_price": "113", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "165", + "name": "Super defence(2)", + "examine": "X dose(s) of super Defence potion.", + "tradeable": "true", + "low_alchemy": "105", + "high_alchemy": "158", + "grand_exchange_price": "65", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "166", + "name": "Super defence(2)", + "tradeable": "true", + "grand_exchange_price": "65", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "167", + "name": "Super defence(1)", + "examine": "X dose(s) of super Defence potion.", + "tradeable": "true", + "low_alchemy": "105", + "high_alchemy": "158", + "grand_exchange_price": "41", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "168", + "name": "Super defence(1)", + "tradeable": "true", + "grand_exchange_price": "41", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "169", + "name": "Ranging potion(3)", + "examine": "X doses of ranging potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "6224", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "170", + "name": "Ranging potion(3)", + "tradeable": "true", + "grand_exchange_price": "6224", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "171", + "name": "Ranging potion(2)", + "examine": "X doses of ranging potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "4330", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "172", + "name": "Ranging potion(2)", + "tradeable": "true", + "grand_exchange_price": "4330", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "173", + "name": "Ranging potion(1)", + "examine": "X doses of ranging potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "2068", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "174", + "name": "Ranging potion(1)", + "tradeable": "true", + "grand_exchange_price": "2068", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "175", + "name": "Antipoison(3)", + "examine": "X doses of antipoison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "shop_price": "375", + "grand_exchange_price": "1239", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "176", + "name": "Antipoison(3)", + "tradeable": "true", + "grand_exchange_price": "1239", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "177", + "name": "Antipoison(2)", + "examine": "X doses of antipoison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "shop_price": "375", + "grand_exchange_price": "822", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "178", + "name": "Antipoison(2)", + "tradeable": "true", + "grand_exchange_price": "822", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "179", + "name": "Antipoison(1)", + "examine": "X doses of antipoison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "shop_price": "375", + "grand_exchange_price": "460", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "180", + "name": "Antipoison(1)", + "tradeable": "true", + "grand_exchange_price": "460", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "181", + "name": "Super antipoison(3)", + "examine": "X dose(s) of super anti poison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "872", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "182", + "name": "Super antipoison(3)", + "tradeable": "true", + "grand_exchange_price": "872", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "183", + "name": "Super antipoison(2)", + "examine": "X dose(s) of super anti poison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "509", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "184", + "name": "Super antipoison(2)", + "tradeable": "true", + "grand_exchange_price": "509", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "185", + "name": "Super antipoison(1)", + "examine": "X dose(s) of super anti poison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "366", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "186", + "name": "Super antipoison(1)", + "tradeable": "true", + "grand_exchange_price": "366", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "187", + "name": "Weapon poison", + "examine": "For use on daggers and projectiles.", + "tradeable": "true", + "low_alchemy": "57", + "high_alchemy": "86", + "grand_exchange_price": "33", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "188", + "name": "Weapon poison", + "tradeable": "true", + "grand_exchange_price": "33", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "189", + "name": "Zamorak brew(3)", + "examine": "X dose[s] of Zamorak brew.", + "tradeable": "true", + "low_alchemy": "70", + "high_alchemy": "105", + "grand_exchange_price": "1818", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "190", + "name": "Zamorak brew(3)", + "tradeable": "true", + "grand_exchange_price": "1818", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "191", + "name": "Zamorak brew(2)", + "examine": "X dose[s] of Zamorak brew.", + "tradeable": "true", + "low_alchemy": "70", + "high_alchemy": "105", + "grand_exchange_price": "1004", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "192", + "name": "Zamorak brew(2)", + "tradeable": "true", + "grand_exchange_price": "1004", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "193", + "name": "Zamorak brew(1)", + "examine": "X dose[s] of Zamorak brew.", + "tradeable": "true", + "low_alchemy": "70", + "high_alchemy": "105", + "grand_exchange_price": "1175", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "194", + "name": "Zamorak brew(1)", + "tradeable": "true", + "grand_exchange_price": "1175", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "195", + "name": "Potion", + "examine": "This is meant to be good for spots.", + "tradeable": "true", + "grand_exchange_price": "117", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "196", + "name": "Potion", + "tradeable": "true", + "grand_exchange_price": "117", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "197", + "name": "Poison chalice", + "examine": "Stankers gives out these strange cocktails for free.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "39", + "grand_exchange_price": "124", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "198", + "name": "Poison chalice", + "tradeable": "true", + "grand_exchange_price": "124", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "199", + "name": "Grimy guam", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "155", + "requirements": "{3,15}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "200", + "name": "Grimy guam", + "tradeable": "true", + "grand_exchange_price": "155", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "201", + "name": "Grimy marrentill", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "26", + "requirements": "{5,15}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "202", + "name": "Grimy marrentill", + "tradeable": "true", + "grand_exchange_price": "26", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "203", + "name": "Grimy tarromin", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "151", + "requirements": "{11,15}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "204", + "name": "Grimy tarromin", + "tradeable": "true", + "grand_exchange_price": "151", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "205", + "name": "Grimy harralander", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "275", + "requirements": "{20,15}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "206", + "name": "Grimy harralander", + "tradeable": "true", + "grand_exchange_price": "275", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "207", + "name": "Grimy ranarr", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "4909", + "requirements": "{15,25}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "208", + "name": "Grimy ranarr", + "tradeable": "true", + "grand_exchange_price": "4909", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "209", + "name": "Grimy irit", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "2034", + "requirements": "{15,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "210", + "name": "Grimy irit", + "tradeable": "true", + "grand_exchange_price": "2034", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "211", + "name": "Grimy avantoe", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "3789", + "requirements": "{15,48}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "212", + "name": "Grimy avantoe", + "tradeable": "true", + "grand_exchange_price": "3789", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "213", + "name": "Grimy kwuarm", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "1665", + "requirements": "{15,54}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "214", + "name": "Grimy kwuarm", + "tradeable": "true", + "grand_exchange_price": "1665", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "215", + "name": "Grimy cadantine", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "1582", + "requirements": "{15,65}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "216", + "name": "Grimy cadantine", + "tradeable": "true", + "grand_exchange_price": "1582", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "217", + "name": "Grimy dwarf weed", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "6934", + "requirements": "{15,70}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "218", + "name": "Grimy dwarf weed", + "tradeable": "true", + "grand_exchange_price": "6934", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "219", + "name": "Grimy torstol", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "8200", + "requirements": "{15,75}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "220", + "name": "Grimy torstol", + "tradeable": "true", + "grand_exchange_price": "35800", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "221", + "name": "Eye of newt", + "examine": "It seems to be looking at me.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "27", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "222", + "name": "Eye of newt", + "tradeable": "true", + "grand_exchange_price": "27", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "223", + "name": "Red spiders' eggs", + "examine": "Ewww!", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "grand_exchange_price": "888", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "224", + "name": "Red spiders' eggs", + "tradeable": "true", + "grand_exchange_price": "888", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "225", + "name": "Limpwurt root", + "examine": "The root of a limpwurt plant.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "grand_exchange_price": "1984", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "226", + "name": "Limpwurt root", + "tradeable": "true", + "grand_exchange_price": "1984", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "227", + "name": "Vial of water", + "examine": "A glass vial containing water.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "35", + "weight": "0.02", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "228", + "name": "Vial of water", + "tradeable": "true", + "grand_exchange_price": "35", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "229", + "name": "Vial", + "examine": "An empty glass vial.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "230", + "name": "Vial", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "231", + "name": "Snape grass", + "examine": "Strange spiky grass.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "67", + "grand_exchange_price": "318", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "232", + "name": "Snape grass", + "tradeable": "true", + "grand_exchange_price": "318", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "233", + "name": "Pestle and mortar", + "examine": "I can grind things for potions in this.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "38", + "weight": "0.05", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "234", + "name": "Pestle and mortar", + "tradeable": "true", + "grand_exchange_price": "38", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "235", + "name": "Unicorn horn dust", + "examine": "Finely ground horn of Unicorn.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "2460", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "236", + "name": "Unicorn horn dust", + "tradeable": "true", + "grand_exchange_price": "2460", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "237", + "name": "Unicorn horn", + "examine": "This horn has restorative properties.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "2481", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "238", + "name": "Unicorn horn", + "tradeable": "true", + "grand_exchange_price": "2481", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "239", + "name": "White berries", + "examine": "Sour berries, used in potions.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "1438", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "240", + "name": "White berries", + "tradeable": "true", + "grand_exchange_price": "1438", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "241", + "name": "Dragon scale dust", + "examine": "Finely ground scale of Dragon.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "31", + "grand_exchange_price": "1336", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "242", + "name": "Dragon scale dust", + "tradeable": "true", + "grand_exchange_price": "1336", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "243", + "name": "Blue dragon scale", + "examine": "A large shiny scale.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "1244", + "weight": "0.01", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "244", + "name": "Blue dragon scale", + "tradeable": "true", + "grand_exchange_price": "1244", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "245", + "name": "Wine of zamorak", + "examine": "An evil wine that is often found in chaos temples.", + "tradeable": "true", + "grand_exchange_price": "2768", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "246", + "name": "Wine of zamorak", + "tradeable": "true", + "grand_exchange_price": "2768", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "247", + "name": "Jangerberries", + "examine": "They don't look very ripe.", + "tradeable": "true", + "grand_exchange_price": "83", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "248", + "name": "Jangerberries", + "tradeable": "true", + "grand_exchange_price": "83", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "249", + "name": "Clean guam", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "182", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "250", + "name": "Clean guam", + "tradeable": "true", + "grand_exchange_price": "182", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "251", + "name": "Clean marrentill", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "23", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "252", + "name": "Clean marrentill", + "tradeable": "true", + "grand_exchange_price": "23", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "253", + "name": "Clean tarromin", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "144", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "254", + "name": "Clean tarromin", + "tradeable": "true", + "grand_exchange_price": "144", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "255", + "name": "Clean harralander", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "275", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "256", + "name": "Clean harralander", + "tradeable": "true", + "grand_exchange_price": "275", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "257", + "name": "Clean ranarr", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "4930", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "258", + "name": "Clean ranarr", + "tradeable": "true", + "grand_exchange_price": "4930", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "259", + "name": "Clean irit", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "2072", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "260", + "name": "Clean irit", + "tradeable": "true", + "grand_exchange_price": "2072", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "261", + "name": "Clean avantoe", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "19", + "high_alchemy": "28", + "grand_exchange_price": "3812", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "262", + "name": "Clean avantoe", + "tradeable": "true", + "grand_exchange_price": "3812", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "263", + "name": "Clean kwuarm", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "21", + "high_alchemy": "32", + "grand_exchange_price": "1641", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "264", + "name": "Clean kwuarm", + "tradeable": "true", + "grand_exchange_price": "1641", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "265", + "name": "Clean cadantine", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "39", + "grand_exchange_price": "1585", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "266", + "name": "Clean cadantine", + "tradeable": "true", + "grand_exchange_price": "1585", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "267", + "name": "Clean dwarf weed", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "grand_exchange_price": "6925", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "268", + "name": "Clean dwarf weed", + "tradeable": "true", + "grand_exchange_price": "6925", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "269", + "name": "Clean torstol", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "grand_exchange_price": "8400", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "270", + "name": "Clean torstol", + "tradeable": "true", + "grand_exchange_price": "35900", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "271", + "name": "Pressure gauge", + "examine": "It looks like part of a machine", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "272", + "name": "Fish food", + "examine": "A box of fish food / Keeps your pet fish strong and healthy.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "274", + "name": "Poisoned fish food", + "examine": "This isn't good for fish.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to make more in Draynor Manor.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "275", + "name": "Key", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "276", + "name": "Rubber tube", + "examine": "It's slightly charred.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "277", + "name": "Oil can", + "examine": "It's pretty full.", + "low_alchemy": "1", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "278", + "name": "Cattleprod", + "examine": "A sharp cattleprod.", + "low_alchemy": "1", + "high_alchemy": "1", + "equipment_slot": "3", + "bonuses": "4,2,-4,1,0,0,0,0,1,0,0,3,0,0,0", + "weapon_interface": "5", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "279", + "name": "Sheep feed", + "examine": "Councillor Halgrive gave me this to kill some sheep.", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "280", + "name": "Sheep bones (1)", + "examine": "The suspicious-looking remains of a suspicious-looking sheep.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "281", + "name": "Sheep bones (2)", + "examine": "The suspicious-looking remains of a suspicious-looking sheep.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "282", + "name": "Sheep bones (3)", + "examine": "The suspicious-looking remains of a suspicious-looking sheep.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "283", + "name": "Sheep bones (4)", + "examine": "The suspicious-looking remains of a suspicious-looking sheep.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "284", + "name": "Plague jacket", + "examine": "This should protect me from the plague, I hope!", + "low_alchemy": "20", + "high_alchemy": "30", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "285", + "name": "Plague trousers", + "examine": "A thick pair of leather trousers. or These should protect me from the plague, I hope!", + "low_alchemy": "20", + "high_alchemy": "30", + "equipment_slot": "7", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "286", + "name": "Orange goblin mail", + "examine": "Armour designed to fit goblins.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "4", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "287", + "name": "Blue goblin mail", + "examine": "Armour designed to fit goblins.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "4", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "288", + "name": "Goblin mail", + "examine": "Armour designed to fit goblins.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "16", + "grand_exchange_price": "398", + "equipment_slot": "4", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "289", + "name": "Goblin mail", + "tradeable": "true", + "grand_exchange_price": "398", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "290", + "name": "Research package", + "examine": "This contains some vital research results.", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "291", + "name": "Notes", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "292", + "name": "Book on baxtorian", + "examine": "A book on elven history in northern RuneScape.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "294", + "name": "Glarial's pebble", + "examine": "A small pebble with elven inscription.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "295", + "name": "Glarial's amulet", + "examine": "A bright green gem set in a necklace.", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "296", + "name": "Glarial's urn", + "examine": "An urn containing Glarial's ashes./An empty urn made for Glarial's ashes.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "297", + "name": "Glarial's urn", + "examine": "An urn containing Glarial's ashes./An empty urn made for Glarial's ashes.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "299", + "name": "Mithril seeds", + "examine": "Magical seeds in a mithril case.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "300", + "grand_exchange_price": "623", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "300", + "name": "Rat's tail", + "examine": "A bit of rat.", + "low_alchemy": "1", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "301", + "name": "Lobster pot", + "examine": "Useful for catching lobsters.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "100", + "requirements": "{10,40}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "302", + "name": "Lobster pot", + "tradeable": "true", + "grand_exchange_price": "100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "303", + "name": "Small fishing net", + "examine": "Useful for catching small fish.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "40", + "grand_exchange_price": "397", + "weight": "4.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "304", + "name": "Small fishing net", + "tradeable": "true", + "grand_exchange_price": "397", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "305", + "name": "Big fishing net", + "examine": "Useful for catching lots of fish.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "329", + "requirements": "{16,10}", + "weight": "8.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "306", + "name": "Big fishing net", + "tradeable": "true", + "grand_exchange_price": "329", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "307", + "name": "Fishing rod", + "examine": "Useful for catching sardine or herring.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "74", + "requirements": "{5,10}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "308", + "name": "Fishing rod", + "tradeable": "true", + "grand_exchange_price": "74", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "309", + "name": "Fly fishing rod", + "examine": "Useful for catching salmon or trout.In Daemonhiem: Just add feathers.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "123", + "requirements": "{20,10}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "310", + "name": "Fly fishing rod", + "tradeable": "true", + "grand_exchange_price": "123", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "311", + "name": "Harpoon", + "examine": "Useful for catching big fish.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "shop_price": "45", + "grand_exchange_price": "235", + "requirements": "{10,35}", + "weight": "1.3", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "312", + "name": "Harpoon", + "tradeable": "true", + "grand_exchange_price": "235", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "313", + "name": "Fishing bait", + "examine": "For use with a fishing rod.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "314", + "name": "Feather", + "examine": "Used for fly fishing.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "24", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "315", + "name": "Shrimps", + "examine": "Some nicely cooked shrimp.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "9", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "316", + "name": "Shrimps", + "tradeable": "true", + "grand_exchange_price": "9", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "317", + "name": "Raw shrimps", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "7", + "weight": "0.5", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "318", + "name": "Raw shrimps", + "tradeable": "true", + "grand_exchange_price": "7", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "319", + "name": "Anchovies", + "examine": "Some nicely cooked anchovies.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "26", + "weight": "0.1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "320", + "name": "Anchovies", + "tradeable": "true", + "grand_exchange_price": "26", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "321", + "name": "Raw anchovies", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "16", + "grand_exchange_price": "11", + "weight": "0.1", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "322", + "name": "Raw anchovies", + "tradeable": "true", + "grand_exchange_price": "11", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "324", + "name": "Burnt fish", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "325", + "name": "Sardine", + "examine": "Some nicely cooked Sardines.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "12", + "weight": "0.12", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "326", + "name": "Sardine", + "tradeable": "true", + "grand_exchange_price": "12", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "327", + "name": "Raw sardine", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "7", + "grand_exchange_price": "31", + "weight": "0.12", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "328", + "name": "Raw sardine", + "tradeable": "true", + "grand_exchange_price": "31", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "329", + "name": "Salmon", + "examine": "Some nicely cooked salmon.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "88", + "grand_exchange_price": "278", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "330", + "name": "Salmon", + "tradeable": "true", + "grand_exchange_price": "278", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "331", + "name": "Raw salmon", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "55", + "shop_price": "36", + "grand_exchange_price": "172", + "weight": "0.5", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "332", + "name": "Raw salmon", + "tradeable": "true", + "grand_exchange_price": "172", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "333", + "name": "Trout", + "examine": "Some nicely cooked trout.", + "tradeable": "true", + "low_alchemy": "27", + "high_alchemy": "40", + "shop_price": "7", + "grand_exchange_price": "172", + "weight": "0.4", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "334", + "name": "Trout", + "tradeable": "true", + "grand_exchange_price": "172", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "335", + "name": "Raw trout", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "7", + "grand_exchange_price": "67", + "weight": "0.4", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "336", + "name": "Raw trout", + "tradeable": "true", + "grand_exchange_price": "67", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "337", + "name": "Giant carp", + "examine": "Some nicely cooked giant carp.", + "low_alchemy": "20", + "high_alchemy": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "338", + "name": "Raw giant carp", + "examine": "I should try cooking this.", + "low_alchemy": "20", + "high_alchemy": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "339", + "name": "Cod", + "examine": "Some nicely cooked fish.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "49", + "grand_exchange_price": "19", + "weight": "0.33", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "340", + "name": "Cod", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "341", + "name": "Raw cod", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "49", + "grand_exchange_price": "29", + "weight": "0.4", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "342", + "name": "Raw cod", + "tradeable": "true", + "grand_exchange_price": "29", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "344", + "name": "Burnt fish", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "345", + "name": "Raw herring", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "63", + "weight": "0.5", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "346", + "name": "Raw herring", + "tradeable": "true", + "grand_exchange_price": "63", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "347", + "name": "Herring", + "examine": "Some nicely cooked herring.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "6", + "grand_exchange_price": "23", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "348", + "name": "Herring", + "tradeable": "true", + "grand_exchange_price": "23", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "349", + "name": "Raw pike", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "72", + "weight": "0.5", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "350", + "name": "Raw pike", + "tradeable": "true", + "grand_exchange_price": "72", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "351", + "name": "Pike", + "examine": "Some nicely cooked pike.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "94", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "352", + "name": "Pike", + "tradeable": "true", + "grand_exchange_price": "94", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "353", + "name": "Raw mackerel", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "26", + "grand_exchange_price": "14", + "weight": "0.3", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "354", + "name": "Raw mackerel", + "tradeable": "true", + "grand_exchange_price": "14", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "355", + "name": "Mackerel", + "examine": "Some nicely cooked fish.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "10", + "shop_price": "23", + "grand_exchange_price": "5", + "weight": "0.3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "356", + "name": "Mackerel", + "tradeable": "true", + "grand_exchange_price": "5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "358", + "name": "Burnt fish", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "359", + "name": "Raw tuna", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "210", + "weight": "0.379", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "360", + "name": "Raw tuna", + "tradeable": "true", + "grand_exchange_price": "210", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "361", + "name": "Tuna", + "examine": "Wow, this is a big fish.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "shop_price": "126", + "grand_exchange_price": "281", + "weight": "0.4", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "362", + "name": "Tuna", + "tradeable": "true", + "grand_exchange_price": "281", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "363", + "name": "Raw bass", + "examine": "Wow, this is a big fish.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "grand_exchange_price": "490", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "364", + "name": "Raw bass", + "tradeable": "true", + "grand_exchange_price": "490", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "365", + "name": "Bass", + "examine": "Wow, this is a big fish.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "shop_price": "270", + "grand_exchange_price": "330", + "weight": "0.3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "366", + "name": "Bass", + "tradeable": "true", + "grand_exchange_price": "330", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "368", + "name": "Burnt fish", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "370", + "name": "Burnt fish", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "371", + "name": "Raw swordfish", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "136", + "high_alchemy": "204", + "grand_exchange_price": "513", + "weight": "0.5", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "372", + "name": "Raw swordfish", + "tradeable": "true", + "grand_exchange_price": "513", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "373", + "name": "Swordfish", + "examine": "I'd better be careful eating this!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "shop_price": "400", + "grand_exchange_price": "501", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "374", + "name": "Swordfish", + "tradeable": "true", + "grand_exchange_price": "501", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "376", + "name": "Burnt swordfish", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "377", + "name": "Raw lobster", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "322", + "weight": "0.4", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "378", + "name": "Raw lobster", + "tradeable": "true", + "grand_exchange_price": "322", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "379", + "name": "Lobster", + "examine": "This looks tricky to eat.", + "tradeable": "true", + "low_alchemy": "107", + "high_alchemy": "160", + "shop_price": "107", + "grand_exchange_price": "334", + "weight": "0.3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "380", + "name": "Lobster", + "tradeable": "true", + "grand_exchange_price": "334", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "382", + "name": "Burnt lobster", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "383", + "name": "Raw shark", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "1615", + "weight": "0.7", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "384", + "name": "Raw shark", + "tradeable": "true", + "grand_exchange_price": "1615", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "385", + "name": "Shark", + "examine": "I'd better be careful eating this.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "1682", + "weight": "0.6", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "386", + "name": "Shark", + "tradeable": "true", + "grand_exchange_price": "1682", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "388", + "name": "Burnt shark", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "389", + "name": "Raw manta ray", + "examine": "Tastier when cooked.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "2114", + "weight": "0.4", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "390", + "name": "Raw manta ray", + "tradeable": "true", + "grand_exchange_price": "2114", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "391", + "name": "Manta ray", + "examine": "Mmmm...this looks tasty!", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "2552", + "weight": "0.4", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "392", + "name": "Manta ray", + "tradeable": "true", + "grand_exchange_price": "2552", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "394", + "name": "Burnt manta ray", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "395", + "name": "Raw sea turtle", + "examine": "Looks wrinkly.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "2397", + "weight": "0.4", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "396", + "name": "Raw sea turtle", + "tradeable": "true", + "grand_exchange_price": "2397", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "397", + "name": "Sea turtle", + "examine": "Tasty!", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "2486", + "weight": "0.35", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "398", + "name": "Sea turtle", + "tradeable": "true", + "grand_exchange_price": "2486", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "400", + "name": "Burnt sea turtle", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "401", + "name": "Seaweed", + "examine": "Slightly damp seaweed.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "5", + "grand_exchange_price": "780", + "weight": "0.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "402", + "name": "Seaweed", + "tradeable": "true", + "grand_exchange_price": "780", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "403", + "name": "Edible seaweed", + "examine": "Slightly damp seaweed.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "291", + "weight": "0.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "404", + "name": "Edible seaweed", + "tradeable": "true", + "grand_exchange_price": "291", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "405", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "4162", + "weight": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "406", + "name": "Casket", + "tradeable": "true", + "grand_exchange_price": "4162", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "407", + "name": "Oyster", + "examine": "Its a rare oyster.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "23", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "408", + "name": "Oyster", + "tradeable": "true", + "grand_exchange_price": "23", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "409", + "name": "Empty oyster", + "examine": "Aww, it's empty.", + "low_alchemy": "2", + "high_alchemy": "3", + "weight": "0.08", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "410", + "name": "Empty oyster", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "411", + "name": "Oyster pearl", + "examine": "I could work wonders with a chisel on this pearl.", + "tradeable": "true", + "low_alchemy": "44", + "high_alchemy": "67", + "shop_price": "44", + "grand_exchange_price": "18", + "equipment_slot": "5", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "412", + "name": "Oyster pearl", + "tradeable": "true", + "grand_exchange_price": "18", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "413", + "name": "Oyster pearls", + "examine": "I could work wonders with a chisel on these pearls.", + "tradeable": "true", + "low_alchemy": "560", + "high_alchemy": "840", + "grand_exchange_price": "639", + "equipment_slot": "5", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "414", + "name": "Oyster pearls", + "tradeable": "true", + "grand_exchange_price": "639", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "415", + "name": "Ethenea", + "examine": "An expensive colourless liquid.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "416", + "name": "Liquid honey", + "examine": "This isn't worth much.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "417", + "name": "Sulphuric broline", + "examine": "It's highly poisonous.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "418", + "name": "Plague sample", + "examine": "Probably best I don't keep this too long.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "419", + "name": "Touch paper", + "examine": "A special kind of paper.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "420", + "name": "Distillator", + "examine": "Apparently it distills.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "421", + "name": "Lathas' amulet", + "examine": "Yup. It's an amulet.", + "low_alchemy": "4", + "high_alchemy": "6", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "422", + "name": "Bird feed", + "examine": "Birds love this stuff!", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "424", + "name": "Pigeon cage", + "examine": "(empty) It's empty... (full) It's full of pigeons.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "425", + "name": "Pigeon cage", + "examine": "(empty) It's empty... (full) It's full of pigeons.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "426", + "name": "Priest gown", + "grand_exchange_price": "55", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,3,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "427", + "name": "Priest gown", + "tradeable": "true", + "grand_exchange_price": "55", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "428", + "name": "Priest gown", + "grand_exchange_price": "14", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,3,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "429", + "name": "Priest gown", + "tradeable": "true", + "grand_exchange_price": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "430", + "name": "Doctors' gown", + "examine": "Medical looking.", + "low_alchemy": "16", + "high_alchemy": "24", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "431", + "name": "Karamjan rum", + "examine": "A very strong spirit brewed in Karamja.", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "27", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "433", + "name": "Pirate message", + "examine": "Pirates don't have the best handwriting...", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "434", + "name": "Clay", + "examine": "Some hard dry clay.", + "tradeable": "true", + "grand_exchange_price": "406", + "weight": "1", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "435", + "name": "Clay", + "tradeable": "true", + "grand_exchange_price": "406", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "436", + "name": "Copper ore", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "58", + "weight": "2", + "ge_buy_limit": "25000", + "tokkul_price": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "437", + "name": "Copper ore", + "tradeable": "true", + "grand_exchange_price": "58", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "438", + "name": "Tin ore", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "46", + "weight": "2.25", + "ge_buy_limit": "25000", + "tokkul_price": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "439", + "name": "Tin ore", + "tradeable": "true", + "grand_exchange_price": "46", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "440", + "name": "Iron ore", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "10", + "grand_exchange_price": "396", + "weight": "2.25", + "ge_buy_limit": "25000", + "tokkul_price": "25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "441", + "name": "Iron ore", + "tradeable": "true", + "grand_exchange_price": "396", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "442", + "name": "Silver ore", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "shop_price": "82", + "grand_exchange_price": "205", + "weight": "2", + "ge_buy_limit": "25000", + "tokkul_price": "112", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "443", + "name": "Silver ore", + "tradeable": "true", + "grand_exchange_price": "205", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "444", + "name": "Gold ore", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "319", + "weight": "2.2", + "ge_buy_limit": "25000", + "tokkul_price": "225", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "445", + "name": "Gold ore", + "tradeable": "true", + "grand_exchange_price": "319", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "446", + "name": "'perfect' gold ore", + "examine": "This needs refining.", + "low_alchemy": "60", + "high_alchemy": "90", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "447", + "name": "Mithril ore", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "97", + "shop_price": "243", + "grand_exchange_price": "369", + "weight": "1.75", + "ge_buy_limit": "25000", + "tokkul_price": "243", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "448", + "name": "Mithril ore", + "tradeable": "true", + "grand_exchange_price": "369", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "449", + "name": "Adamantite ore", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "shop_price": "1300", + "grand_exchange_price": "1622", + "weight": "2.7", + "ge_buy_limit": "25000", + "tokkul_price": "600", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "450", + "name": "Adamantite ore", + "tradeable": "true", + "grand_exchange_price": "1622", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "451", + "name": "Runite ore", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "1280", + "high_alchemy": "1920", + "grand_exchange_price": "10300", + "weight": "2.25", + "ge_buy_limit": "25000", + "tokkul_price": "4800", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "452", + "name": "Runite ore", + "tradeable": "true", + "grand_exchange_price": "10300", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "453", + "name": "Coal", + "examine": "Hmm a non-renewable energy source!", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "grand_exchange_price": "315", + "weight": "2.25", + "ge_buy_limit": "25000", + "tokkul_price": "67", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "454", + "name": "Coal", + "tradeable": "true", + "grand_exchange_price": "315", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "455", + "name": "Barcrawl card", + "examine": "The official Alfred Grimhand bar crawl card.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "456", + "name": "Scorpion cage", + "examine": "It's empty!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Thormac to get another cage.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "457", + "name": "Scorpion cage", + "examine": "It's empty!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Thormac to get another cage.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "458", + "name": "Scorpion cage", + "examine": "It's empty!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Thormac to get another cage.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "459", + "name": "Scorpion cage", + "examine": "It's empty!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Thormac to get another cage.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "460", + "name": "Scorpion cage", + "examine": "It's empty!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Thormac to get another cage.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "461", + "name": "Scorpion cage", + "examine": "It's empty!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Thormac to get another cage.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "462", + "name": "Scorpion cage", + "examine": "It's empty!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Thormac to get another cage.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "463", + "name": "Scorpion cage", + "examine": "It's empty!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Thormac to get another cage.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "464", + "name": "Strange fruit", + "examine": "Found on strange plants that grow around Karamja.", + "tradeable": "true", + "grand_exchange_price": "403", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "465", + "name": "Strange fruit", + "tradeable": "true", + "grand_exchange_price": "403", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "466", + "name": "Pickaxe handle", + "examine": "Useless without the head.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "shop_price": "1", + "equipment_slot": "3", + "attack_audios": "2508,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "467", + "name": "Pickaxe handle", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "468", + "name": "Broken pickaxe", + "examine": "Nurmof can fix this for me.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "attack_audios": "2508,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "469", + "name": "Broken pickaxe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "470", + "name": "Broken pickaxe", + "examine": "Nurmof can fix this for me.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "attack_audios": "2508,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "471", + "name": "Broken pickaxe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "472", + "name": "Broken pickaxe", + "examine": "Nurmof can fix this for me.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "attack_audios": "2508,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "473", + "name": "Broken pickaxe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "474", + "name": "Broken pickaxe", + "examine": "Nurmof can fix this for me.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "attack_audios": "2508,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "475", + "name": "Broken pickaxe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "476", + "name": "Broken pickaxe", + "examine": "Nurmof can fix this for me.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "attack_audios": "2508,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "477", + "name": "Broken pickaxe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "478", + "name": "Broken pickaxe", + "examine": "Nurmof can fix this for me.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "attack_audios": "2508,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "479", + "name": "Broken pickaxe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "480", + "name": "Bronze pick head", + "examine": "It's missing a handle.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "481", + "name": "Bronze pick head", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "482", + "name": "Iron pick head", + "examine": "It's missing a handle.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "483", + "name": "Iron pick head", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "484", + "name": "Steel pick head", + "examine": "It's missing a handle.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "485", + "name": "Steel pick head", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "486", + "name": "Mithril pick head", + "examine": "It's missing a handle.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "487", + "name": "Mithril pick head", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "488", + "name": "Adamant pick head", + "examine": "It's missing a handle.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "489", + "name": "Adamant pick head", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "490", + "name": "Rune pick head", + "examine": "It's missing a handle.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "491", + "name": "Rune pick head", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "492", + "name": "Picture", + "examine": "Useless without the head.", + "tradeable": "true", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "493", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "494", + "name": "Broken axe", + "examine": "Bob can fix this broken (metal) axe for me.", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "495", + "name": "Broken axe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "496", + "name": "Broken axe", + "examine": "Bob can fix this broken (metal) axe for me.", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "497", + "name": "Broken axe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "498", + "name": "Broken axe", + "examine": "Bob can fix this broken (metal) axe for me.", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "499", + "name": "Broken axe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "500", + "name": "Broken axe", + "examine": "Bob can fix this broken (metal) axe for me.", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "501", + "name": "Broken axe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "502", + "name": "Broken axe", + "examine": "Bob can fix this broken (metal) axe for me.", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "503", + "name": "Broken axe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "504", + "name": "Broken axe", + "examine": "Bob can fix this broken (metal) axe for me.", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "505", + "name": "Broken axe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "506", + "name": "Broken axe", + "examine": "Bob can fix this broken (metal) axe for me.", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "507", + "name": "Broken axe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "508", + "name": "Picture", + "examine": "A piece of ancient goblin hatchet.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "509", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "510", + "name": "Picture", + "examine": "A piece of ancient goblin hatchet.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "511", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "512", + "name": "Picture", + "examine": "A piece of ancient goblin hatchet.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "513", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "514", + "name": "Picture", + "examine": "A piece of ancient goblin hatchet.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "515", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "516", + "name": "Picture", + "examine": "A piece of ancient goblin hatchet.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "517", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "518", + "name": "Picture", + "examine": "A piece of ancient goblin hatchet.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "519", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "520", + "name": "Picture", + "examine": "A piece of ancient goblin hatchet.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "521", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "522", + "name": "Enchanted beef", + "examine": "I don't fancy eating this now.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "523", + "name": "Enchanted rat meat", + "examine": "I don't fancy eating this now.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "524", + "name": "Enchanted bear meat", + "examine": "I don't fancy eating this now.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "525", + "name": "Enchanted chicken", + "examine": "I don't fancy eating this now.", + "low_alchemy": "1", + "high_alchemy": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "526", + "name": "Bones", + "tradeable": "true", + "shop_price": "190", + "grand_exchange_price": "190", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "527", + "name": "Bones", + "tradeable": "true", + "shop_price": "190", + "grand_exchange_price": "190", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "528", + "name": "Burnt bones", + "examine": "Bones are for burying!", + "tradeable": "true", + "grand_exchange_price": "329", + "weight": "0.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "529", + "name": "Burnt bones", + "tradeable": "true", + "grand_exchange_price": "329", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "530", + "name": "Bat bones", + "examine": "Ew it's a pile of bones.", + "tradeable": "true", + "grand_exchange_price": "354", + "weight": "0.3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "531", + "name": "Bat bones", + "tradeable": "true", + "grand_exchange_price": "354", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "532", + "name": "Big bones", + "examine": "Normal: Ew, it's a pile of bones.", + "tradeable": "true", + "shop_price": "593", + "grand_exchange_price": "593", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "533", + "name": "Big bones", + "tradeable": "true", + "shop_price": "593", + "grand_exchange_price": "593", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "534", + "name": "Babydragon bones", + "examine": "Ew, it's a pile of bones.", + "tradeable": "true", + "grand_exchange_price": "1357", + "weight": "0.7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "535", + "name": "Babydragon bones", + "tradeable": "true", + "grand_exchange_price": "1357", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "536", + "name": "Dragon bones", + "examine": "These would feed a dog for months.", + "tradeable": "true", + "grand_exchange_price": "4065", + "weight": "1.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "537", + "name": "Dragon bones", + "tradeable": "true", + "grand_exchange_price": "4065", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "538", + "name": "Druid's robe", + "examine": "When the druids and Taverley as a whole were first graphically updated, the Druid robes themselves did not receive a graphical update, nor were they updated when the Troll Warzone update was released.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "168", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,4,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "539", + "name": "Druid's robe", + "tradeable": "true", + "grand_exchange_price": "168", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "540", + "name": "Druid's robe", + "examine": "When the druids and Taverley as a whole were first graphically updated, the Druid robes themselves did not receive a graphical update, nor were they updated when the Troll Warzone update was released.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "328", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,4,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "541", + "name": "Druid's robe", + "tradeable": "true", + "grand_exchange_price": "328", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "542", + "name": "Monk's robe", + "grand_exchange_price": "528", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,5,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "543", + "name": "Monk's robe", + "tradeable": "true", + "grand_exchange_price": "528", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "544", + "name": "Monk's robe", + "grand_exchange_price": "1495", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,6,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "545", + "name": "Monk's robe", + "tradeable": "true", + "grand_exchange_price": "1495", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "546", + "name": "Shade robe", + "examine": "I feel closer to the gods when I am wearing this. (Top) If a shade had knees, this would keep them nice and warm. (Bottom)", + "low_alchemy": "28", + "high_alchemy": "42", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,5,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "548", + "name": "Shade robe", + "examine": "I feel closer to the gods when I am wearing this. (Top) If a shade had knees, this would keep them nice and warm. (Bottom)", + "low_alchemy": "28", + "high_alchemy": "42", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,4,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "550", + "name": "Newcomer map", + "examine": "Issued by RuneScape Council to all new citizens.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "123", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "551", + "name": "Newcomer map", + "tradeable": "true", + "grand_exchange_price": "123", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "552", + "name": "Ghostspeak amulet", + "examine": "Normal: It lets me talk to ghosts.", + "tradeable": "false", + "low_alchemy": "14", + "high_alchemy": "21", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "553", + "name": "Ghost's skull", + "examine": "Ooooh spooky!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you get rid of the skull you'll have to search for it again.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "554", + "name": "Fire rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "39", + "ge_buy_limit": "25000", + "tokkul_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "555", + "name": "Water rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "15", + "ge_buy_limit": "25000", + "tokkul_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "556", + "name": "Air rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "37", + "ge_buy_limit": "25000", + "tokkul_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "557", + "name": "Earth rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "25", + "ge_buy_limit": "25000", + "tokkul_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "558", + "name": "Mind rune", + "examine": "Used for basic missile spells.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "6", + "ge_buy_limit": "25000", + "tokkul_price": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "559", + "name": "Body rune", + "examine": "Used for Curse spells", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "16", + "grand_exchange_price": "6", + "ge_buy_limit": "25000", + "tokkul_price": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "560", + "name": "Death rune", + "examine": "Used for medium missile spells.", + "tradeable": "true", + "low_alchemy": "41", + "high_alchemy": "62", + "shop_price": "310", + "grand_exchange_price": "433", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "561", + "name": "Nature rune", + "examine": "Used for alchemy spells.", + "tradeable": "true", + "low_alchemy": "49", + "high_alchemy": "74", + "shop_price": "372", + "grand_exchange_price": "228", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "562", + "name": "Chaos rune", + "examine": "Used for small missile spells.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "28", + "shop_price": "140", + "grand_exchange_price": "54", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "563", + "name": "Law rune", + "examine": "Used for teleport spells.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "shop_price": "378", + "grand_exchange_price": "349", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "564", + "name": "Cosmic rune", + "examine": "Used for enchant spells.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "46", + "shop_price": "232", + "grand_exchange_price": "158", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "565", + "name": "Blood rune", + "examine": "Used for large missile spells.", + "tradeable": "true", + "low_alchemy": "73", + "high_alchemy": "110", + "shop_price": "550", + "grand_exchange_price": "408", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "566", + "name": "Soul rune", + "examine": "Used for high level curse spells.", + "tradeable": "true", + "low_alchemy": "54", + "high_alchemy": "82", + "shop_price": "400", + "grand_exchange_price": "187", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "567", + "name": "Unpowered orb", + "examine": "I'd prefer it if it was powered.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "561", + "weight": "0.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "568", + "name": "Unpowered orb", + "tradeable": "true", + "grand_exchange_price": "561", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "569", + "name": "Fire orb", + "examine": "A magic glowing orb.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "2346", + "weight": "0.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "570", + "name": "Fire orb", + "tradeable": "true", + "grand_exchange_price": "2346", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "571", + "name": "Water orb", + "examine": "A magic glowing orb.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "2024", + "weight": "0.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "572", + "name": "Water orb", + "tradeable": "true", + "grand_exchange_price": "2024", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "573", + "name": "Air orb", + "examine": "A magic glowing orb.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "2162", + "weight": "0.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "574", + "name": "Air orb", + "tradeable": "true", + "grand_exchange_price": "2162", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "575", + "name": "Earth orb", + "examine": "A magic glowing orb.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "2208", + "weight": "0.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "576", + "name": "Earth orb", + "tradeable": "true", + "grand_exchange_price": "2208", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "577", + "name": "Wizard robe", + "examine": "I can do magic better in this.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "4", + "grand_exchange_price": "1840", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "578", + "name": "Wizard robe", + "tradeable": "true", + "grand_exchange_price": "1840", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "579", + "name": "Wizard hat", + "examine": "A silly pointed hat.", + "tradeable": "true", + "low_alchemy": "0", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "361", + "equipment_slot": "0", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", + "weight": "0.45", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "580", + "name": "Wizard hat", + "tradeable": "true", + "low_alchemy": "0", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "361", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "581", + "name": "Black robe", + "examine": "I can do magic better in this.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "shop_price": "5", + "grand_exchange_price": "1364", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "582", + "name": "Black robe", + "tradeable": "true", + "grand_exchange_price": "1364", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "583", + "name": "Bailing bucket", + "examine": "Empty: It's a bailing bucket. Full: It's a bailing bucket full of salty water.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "584", + "name": "Bailing bucket", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "585", + "name": "Bailing bucket", + "examine": "Empty: It's a bailing bucket. Full: It's a bailing bucket full of salty water.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "586", + "name": "Bailing bucket", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "587", + "name": "Orb of protection", + "examine": "A strange glowing green orb.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "588", + "name": "Orbs of protection", + "examine": "Two strange glowing green orbs.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "589", + "name": "Gnome amulet", + "examine": "It's an amulet of protection given to me by the Gnomes.", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,13,13,13,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "590", + "name": "Tinderbox", + "examine": "Useful for lighting a fire.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "118", + "weight": "0.05", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "591", + "name": "Tinderbox", + "tradeable": "true", + "grand_exchange_price": "118", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "592", + "name": "Ashes", + "examine": "A heap of ashes.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "368", + "weight": "0.056", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "593", + "name": "Ashes", + "tradeable": "true", + "grand_exchange_price": "368", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "594", + "name": "Lit torch", + "examine": "A lit home-made torch.", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "596", + "name": "Unlit torch", + "examine": "An unlit home-made torch.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "1", + "grand_exchange_price": "1", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "597", + "name": "Unlit torch", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "598", + "name": "Bronze fire arrows", + "examine": "unlit: Arrows with bronze heads and oil-soaked cloth. lit: An easy to make, bronze-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "162", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "600", + "name": "Astronomy book", + "examine": "A book on the history of astronomy in RuneScape.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "658", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "601", + "name": "Goblin kitchen key", + "examine": "A small key for a large door.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another, down in the dungeon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "602", + "name": "Lens mould", + "examine": "An unusual clay mould in the shape of a disc.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to get another down in the Dungeon", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "603", + "name": "Observatory lens", + "examine": "A perfectly circular disc of glass.", + "low_alchemy": "1", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "604", + "name": "Bone shard", + "examine": "A slender bone shard given to you by Zadimus.", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "605", + "name": "Bone key", + "examine": "A key fashioned from a shard of bone. (Shilo Village)", + "shop_price": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "606", + "name": "Stone-plaque", + "examine": "A stone plaque with carved letters in it.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "607", + "name": "Tattered scroll", + "examine": "An ancient tattered scroll.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "608", + "name": "Crumpled scroll", + "examine": "An ancient crumpled scroll.", + "shop_price": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "609", + "name": "Rashiliyia corpse", + "examine": "The remains of the Zombie Queen.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "610", + "name": "Zadimus corpse", + "examine": "The remains of Zadimus.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "611", + "name": "Locating crystal", + "examine": "A magical crystal sphere.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "612", + "name": "Locating crystal", + "examine": "A magical crystal sphere.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "613", + "name": "Locating crystal", + "examine": "A magical crystal sphere.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "614", + "name": "Locating crystal", + "examine": "A magical crystal sphere.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "615", + "name": "Locating crystal", + "examine": "A magical crystal sphere.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "616", + "name": "Beads of the dead", + "examine": "A curious looking neck ornament.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You made the beads of the dead during the Shilo Village quest. You can get another from Yanni Salika in Shilo Village for 1200 gold.", + "shop_price": "1200", + "equipment_slot": "2", + "bonuses": "1,1,1,1,1,1,1,1,1,1,1,1,1,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "617", + "name": "Coins", + "examine": "100,000 or more: \"X x coins\" where X is the exact number of coins in the stack.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "618", + "name": "Bone beads", + "examine": "Beads carved out of a bone.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "619", + "name": "Paramaya ticket", + "examine": "Allows you to rest in the luxurious Paramayer[sic] Inn.", + "shop_price": "35", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "620", + "name": "Paramaya ticket", + "examine": "Allows you to rest in the luxurious Paramayer[sic] Inn.", + "shop_price": "35", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "621", + "name": "Ship ticket", + "examine": "Sold in Shilo Village for passage on the 'Lady of the Waves'.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "623", + "name": "Sword pommel", + "examine": "An ivory sword pommel.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "624", + "name": "Bervirius notes", + "examine": "Notes taken from the tomb of Bervirius.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "625", + "name": "Wampum belt", + "examine": "A decorated belt used to trade information between distant villages.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "626", + "name": "Boots", + "grand_exchange_price": "558", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "627", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "558", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "628", + "name": "Boots", + "grand_exchange_price": "397", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "629", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "397", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "630", + "name": "Boots", + "grand_exchange_price": "612", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "631", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "612", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "632", + "name": "Boots", + "grand_exchange_price": "496", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "633", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "496", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "634", + "name": "Boots", + "grand_exchange_price": "226", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "635", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "226", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "636", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "265", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "637", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "265", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "638", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "235", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "639", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "235", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "640", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "447", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "641", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "447", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "642", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "396", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "643", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "396", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "644", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "70", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "645", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "70", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "646", + "name": "Robe bottoms", + "grand_exchange_price": "249", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "647", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "249", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "648", + "name": "Robe bottoms", + "grand_exchange_price": "210", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "649", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "210", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "650", + "name": "Robe bottoms", + "grand_exchange_price": "453", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "651", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "453", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "652", + "name": "Robe bottoms", + "grand_exchange_price": "348", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "653", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "348", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "654", + "name": "Robe bottoms", + "grand_exchange_price": "92", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "655", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "92", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "656", + "name": "Hat", + "grand_exchange_price": "677", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "657", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "677", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "658", + "name": "Hat", + "grand_exchange_price": "480", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "659", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "480", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "660", + "name": "Hat", + "grand_exchange_price": "421", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "661", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "421", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "662", + "name": "Hat", + "grand_exchange_price": "1102", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "663", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "1102", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "664", + "name": "Hat", + "grand_exchange_price": "295", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "665", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "295", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "666", + "name": "Portrait", + "examine": "Picture of a posing Paladin.", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "667", + "name": "Blurite sword", + "examine": "A Faladian Knight's sword.", + "low_alchemy": "80", + "high_alchemy": "120", + "stand_anim": "809", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "292", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "9,14,-2,0,0,0,3,2,0,0,0,10,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "668", + "name": "Blurite ore", + "examine": "Definitely blue.", + "low_alchemy": "1", + "high_alchemy": "1", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "669", + "name": "Specimen jar", + "examine": "A receptacle for specimens!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "670", + "name": "Specimen brush", + "examine": "A small brush used to clean rock samples.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "671", + "name": "Animal skull", + "examine": "A carefully-kept-safe skull sample.", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "672", + "name": "Special cup", + "examine": "A special cup.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "673", + "name": "Teddy", + "examine": "A lucky mascot.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "674", + "name": "Cracked sample", + "examine": "A roughly shaped piece of rock.", + "tradeable": "true", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "675", + "name": "Rock pick", + "examine": "A small pick for digging.", + "high_alchemy": "1", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "676", + "name": "Trowel", + "examine": "Used for digging!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "677", + "name": "Panning tray", + "examine": "An empty tray for panning./This tray contains mud.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "678", + "name": "Panning tray", + "examine": "An empty tray for panning./This tray contains mud.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "679", + "name": "Panning tray", + "examine": "An empty tray for panning./This tray contains mud.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "680", + "name": "Nuggets", + "examine": "Pure, lovely gold!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "681", + "name": "Ancient talisman", + "examine": "An unusual symbol as yet unidentified by the archaeological expert.", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "682", + "name": "Unstamped letter", + "examine": "A letter waiting to be stamped.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "683", + "name": "Sealed letter", + "examine": "A sealed letter of recommendation.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "684", + "name": "Belt buckle", + "examine": "Used to hold up trousers!", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "685", + "name": "Old boot", + "examine": "Phew!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "686", + "name": "Rusty sword", + "examine": "A decent-enough weapon gone rusty.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "687", + "name": "Broken arrow", + "examine": "This must have been shot at high speed.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "688", + "name": "Buttons", + "examine": "Not Dick Whittington's helper at all!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "689", + "name": "Broken staff", + "examine": "I pity the poor person beaten with this!", + "tradeable": "true", + "attack_audios": "2555,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "690", + "name": "Picture", + "examine": "Smashed glass.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "691", + "name": "Level 1 certificate", + "examine": "The owner has passed Earth Sciences Level 1 exam.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "692", + "name": "Level 2 certificate", + "examine": "The owner has passed Earth Sciences Level 2 exam.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "693", + "name": "Level 3 certificate", + "examine": "The owner has passed Earth Sciences Level 3 exam.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "694", + "name": "Ceramic remains", + "examine": "Smashing!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "695", + "name": "Old tooth", + "examine": "Now, if I could just find a tooth fairy to sell this to...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "696", + "name": "Invitation letter", + "examine": "A letter inviting me to use the private digging shafts.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "697", + "name": "Damaged armour", + "examine": "It would be hard to repair this!", + "weight": "7.75", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "698", + "name": "Broken armour", + "examine": "Armour left over from a great fight.", + "weight": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "699", + "name": "Stone tablet", + "examine": "An old stone slab with writing on it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "700", + "name": "Chemical powder", + "examine": "An acrid chemical.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "701", + "name": "Ammonium nitrate", + "examine": "An acrid chemical.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "702", + "name": "Unidentified liquid", + "examine": "A strong chemical.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "703", + "name": "Nitroglycerin", + "examine": "A strong chemical.", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "704", + "name": "Ground charcoal", + "examine": "Charcoal - crushed to small pieces!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "707", + "name": "Chemical compound", + "examine": "A mixture of strong chemicals.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "708", + "name": "Arcenia root", + "examine": "The root of an arcenia plant.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "710", + "name": "Vase", + "examine": "An unusually shaped vase. You can see something glinting inside.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "711", + "name": "Book on chemicals", + "examine": "It's about chemicals, judging from its cover.", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "712", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "714", + "name": "Radimus notes", + "examine": "Notes given to you by Radimus Erkle, it includes a partially completed map.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "715", + "name": "Radimus notes", + "examine": "Notes given to you by Radimus Erkle, it includes a partially completed map.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "716", + "name": "Bull roarer", + "examine": "It makes a loud but interesting sound when swung in the air.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "717", + "name": "Scrawled note", + "examine": "A scrawled note with spidery writing on it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "718", + "name": "A scribbled note", + "examine": "A scrawled note with spidery writing on it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "719", + "name": "Scrumpled note", + "examine": "A scrawled note with spidery writing on it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "720", + "name": "Sketch", + "examine": "A rough sketch of a bowl shaped vessel given to you by Gujuo.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "721", + "name": "Gold bowl", + "examine": "A specially made bowl constructed out of pure gold.", + "low_alchemy": "280", + "high_alchemy": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "722", + "name": "Blessed gold bowl", + "examine": "A specially made bowl constructed out of pure gold and blessed.", + "low_alchemy": "280", + "high_alchemy": "420", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "723", + "name": "Golden bowl", + "examine": "A blessed golden bowl. It has pure sacred water in it.", + "low_alchemy": "280", + "high_alchemy": "420", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "724", + "name": "Golden bowl", + "examine": "A blessed golden bowl. It has pure sacred water in it.", + "low_alchemy": "280", + "high_alchemy": "420", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "725", + "name": "Golden bowl", + "examine": "A blessed golden bowl. It has pure sacred water in it.", + "low_alchemy": "280", + "high_alchemy": "420", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "726", + "name": "Golden bowl", + "examine": "A blessed golden bowl. It has pure sacred water in it.", + "low_alchemy": "280", + "high_alchemy": "420", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "727", + "name": "Hollow reed", + "examine": "One of nature's pipes.", + "high_alchemy": "1", + "weight": "0.012", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "728", + "name": "Hollow reed", + "examine": "One of nature's pipes.", + "high_alchemy": "1", + "weight": "0.012", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "729", + "name": "Shamans tome", + "examine": "It looks like the Shamans personal notes...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "730", + "name": "Binding book", + "examine": "An ancient tome on Demonology.", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "731", + "name": "Enchanted vial", + "examine": "An enchanted empty glass vial.", + "destroy": "true", + "tradeable": "false", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "732", + "name": "Holy water", + "examine": "A vial of holy water, good against certain demons.", + "equipment_slot": "3", + "bonuses": "0,0,0,0,12,0,0,0,0,0,0,0,0,0,24", + "weapon_interface": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "733", + "name": "Smashed glass", + "examine": "Fragments of a broken container.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "735", + "name": "Yommi tree seeds", + "examine": "These need to be germinated before they can be used. / These are germinated and ready to be planted in fertile soil.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "736", + "name": "Yommi tree seeds", + "examine": "These need to be germinated before they can be used. / These are germinated and ready to be planted in fertile soil.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "737", + "name": "Snakeweed mixture", + "examine": "A Snakeweed mixture, needs another ingredient.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "738", + "name": "Ardrigal mixture", + "examine": "It's a mixture of ardrigal and water. Needs another ingredient.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "739", + "name": "Bravery potion", + "examine": "A bravery potion for which Gujuo gave you the details, let's hope it works.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "740", + "name": "Blue hat", + "examine": "A silly, blue pointed hat.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "160", + "grand_exchange_price": "472", + "equipment_slot": "0", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "741", + "name": "Chunk of crystal", + "examine": "It looks like it's been snapped off of something.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "742", + "name": "Hunk of crystal", + "examine": "It looks like it's been snapped off of something.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "743", + "name": "Lump of crystal", + "examine": "It looks like it's been snapped off of something.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "744", + "name": "Heart crystal", + "examine": "A heart shaped crystal.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "745", + "name": "Heart crystal", + "examine": "A heart shaped crystal.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "746", + "name": "Dark dagger", + "examine": "A black obsidian dagger, it has a strange aura about it.", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,0,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,400,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "747", + "name": "Glowing dagger", + "examine": "A black obsidian dagger, it has a strange aura about it - it seems to be glowing.", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,0,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,400,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "748", + "name": "Holy force", + "examine": "A powerful spell for good.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "749", + "name": "Yommi totem", + "examine": "A well carved totem pole made from the trunk of a Yommi tree.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "750", + "name": "Gilded totem", + "examine": "A gilded totem pole from the Kharazi tribe.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "751", + "name": "Gnomeball", + "examine": "A common gnomeball, obtained by playing gnomeball.", + "tradeable": "true", + "equipment_slot": "3", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "752", + "name": "Gnomeball", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "753", + "name": "Cadava berries", + "examine": "Poisonous berries.", + "tradeable": "true", + "grand_exchange_price": "42", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "754", + "name": "Cadava berries", + "tradeable": "true", + "grand_exchange_price": "42", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "756", + "name": "Cadava potion", + "examine": "This potion will most certainly almost kill you.", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "759", + "name": "Weapon store key", + "examine": "Phoenix Gang weapon store key.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "760", + "name": "Weapon store key", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "761", + "name": "Intel report", + "examine": "An intelligence report.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "destroy_message": "You'll have to kill Jonny the beard in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "763", + "name": "Broken shield", + "examine": "Half of the Shield of Arrav.", + "destroy": "true", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "765", + "name": "Broken shield", + "examine": "Half of the Shield of Arrav.", + "destroy": "true", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "767", + "name": "Phoenix crossbow", + "examine": "Second-rate crossbow, former property of the Phoenix Gang.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "bonuses": "0,0,0,0,6,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "768", + "name": "Phoenix crossbow", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "769", + "name": "Certificate", + "examine": "Entrance certificate to the Imperial Guard.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "771", + "name": "Dramen branch", + "examine": "A limb of the fabled Dramen tree.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another branch if you chop the dramen tree underneath Entrana again.", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "772", + "name": "Dramen staff", + "examine": "Crafted from a Dramen tree branch.", + "tradeable": "false", + "low_alchemy": "6", + "high_alchemy": "9", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-1,-1,10,10,0,2,3,1,10,0,0,10,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "773", + "name": "'perfect' ring", + "examine": "A perfect ruby ring.", + "low_alchemy": "810", + "high_alchemy": "1215", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "774", + "name": "'perfect' necklace", + "examine": "A perfect ruby necklace.", + "low_alchemy": "870", + "high_alchemy": "1305", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "775", + "name": "Cooking gauntlets", + "examine": "These gauntlets empower with a greater ability to cook fish.", + "low_alchemy": "75000", + "high_alchemy": "75000", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another set of Cooking gauntlets from Dimintheis.", + "equipment_slot": "9", + "bonuses": "2,2,2,0,0,8,9,7,0,0,3,2,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "776", + "name": "Goldsmith gauntlets", + "examine": "These gauntlets empower the bearer whilst making gold.", + "low_alchemy": "75000", + "high_alchemy": "75000", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another set of Goldsmith gauntlets from Dimintheis.", + "equipment_slot": "9", + "bonuses": "2,2,2,0,0,8,9,7,0,0,3,2,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "777", + "name": "Chaos gauntlets", + "examine": "These gauntlets empower spell casters.", + "low_alchemy": "75000", + "high_alchemy": "75000", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another set of Chaos gauntlets from Dimintheis.", + "equipment_slot": "9", + "bonuses": "2,2,2,0,0,8,9,7,0,0,3,2,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "778", + "name": "Family gauntlets", + "examine": "My reward for assisting the Fitzharmon family.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "9", + "bonuses": "2,2,2,0,0,8,9,7,0,0,0,2,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "779", + "name": "Crest part", + "examine": "A fragment of the Fitzharmon family crest.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "780", + "name": "Crest part", + "examine": "A fragment of the Fitzharmon family crest.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "781", + "name": "Crest part", + "examine": "A fragment of the Fitzharmon family crest.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "783", + "name": "Bark sample", + "examine": "A sample of the bark from the Grand Tree.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "784", + "name": "Translation book", + "examine": "A book to translate the ancient gnome language into English.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "785", + "name": "Glough's journal", + "examine": "Perhaps I should read it and see what Glough is up to!", + "high_alchemy": "1", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "786", + "name": "Hazelmere's scroll", + "examine": "Hazelmere wrote something down on this scroll.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "787", + "name": "Lumber order", + "examine": "An order from the Karamja shipyard.", + "high_alchemy": "1", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "788", + "name": "Glough's key", + "examine": "The key to Glough's chest.", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "789", + "name": "Twigs", + "examine": "Twigs bound together in the shape of a (Z/U/T/O).", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "790", + "name": "Twigs", + "examine": "Twigs bound together in the shape of a (Z/U/T/O).", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "791", + "name": "Twigs", + "examine": "Twigs bound together in the shape of a (Z/U/T/O).", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "792", + "name": "Twigs", + "examine": "Twigs bound together in the shape of a (Z/U/T/O).", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "793", + "name": "Daconia rock", + "examine": "An ancient rock with strange magical properties.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "794", + "name": "Invasion plans", + "examine": "These are plans for an invasion!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "795", + "name": "War ship", + "examine": "A model of a Karamja warship", + "high_alchemy": "1", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "0.01", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "800", + "name": "Bronze thrownaxe", + "examine": "A finely balanced throwing axe.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "3", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,4,0,0,0,0,0,0,0,0,0,5", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "801", + "name": "Iron thrownaxe", + "examine": "A finely balanced throwing axe.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "shop_price": "13", + "grand_exchange_price": "14", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,7", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "802", + "name": "Steel thrownaxe", + "examine": "A finely balanced throwing axe.", + "tradeable": "true", + "low_alchemy": "15", + "high_alchemy": "22", + "shop_price": "38", + "grand_exchange_price": "60", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,11", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,5}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "803", + "name": "Mithril thrownaxe", + "examine": "A finely balanced throwing axe.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "shop_price": "105", + "grand_exchange_price": "135", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,12,0,0,0,0,0,0,0,0,0,16", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,20}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "804", + "name": "Adamant thrownaxe", + "examine": "A finely balanced throwing axe.", + "tradeable": "true", + "low_alchemy": "104", + "high_alchemy": "157", + "shop_price": "262", + "grand_exchange_price": "138", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,17,0,0,0,0,0,0,0,0,0,23", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "805", + "name": "Rune thrownaxe", + "examine": "A finely balanced throwing axe.", + "tradeable": "true", + "low_alchemy": "176", + "high_alchemy": "264", + "shop_price": "698", + "grand_exchange_price": "243", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,26,0,0,0,0,0,0,0,0,0,36", + "weapon_interface": "18", + "has_special": "true", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,40}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "806", + "name": "Bronze dart", + "examine": "A deadly throwing dart with a bronze tip.", + "tradeable": "true", + "grand_exchange_price": "53", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,3,0,0,0,0,0,0,0,0,0,1", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "807", + "name": "Iron dart", + "examine": "A deadly throwing dart with an iron tip.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "59", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,4,0,0,0,0,0,0,0,0,0,3", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "808", + "name": "Steel dart", + "examine": "A deadly throwing dart with a steel tip.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "50", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,4", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,5}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "809", + "name": "Mithril dart", + "examine": "A deadly throwing dart with a mithril tip.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "68", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,7", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,20}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "810", + "name": "Adamant dart", + "examine": "A deadly throwing dart with an adamantite tip.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "39", + "grand_exchange_price": "96", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,11,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "811", + "name": "Rune dart", + "examine": "A deadly throwing dart with a rune tip.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "grand_exchange_price": "122", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,15,0,0,0,0,0,0,0,0,0,14", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "812", + "name": "Bronze dart(p)", + "examine": "A deadly throwing dart with a bronze tip.", + "tradeable": "true", + "grand_exchange_price": "66", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,3,0,0,0,0,0,0,0,0,0,1", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "813", + "name": "Iron dart(p)", + "examine": "A deadly throwing dart with an iron tip.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "66", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,4,0,0,0,0,0,0,0,0,0,3", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "814", + "name": "Steel dart(p)", + "examine": "A deadly throwing dart with a steel tip.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "75", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,4", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,5}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "815", + "name": "Mithril dart(p)", + "examine": "A deadly throwing dart with a mithril tip.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "65", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,7", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,20}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "816", + "name": "Adamant dart(p)", + "examine": "A deadly throwing dart with an adamantite tip.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "39", + "grand_exchange_price": "75", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,11,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "817", + "name": "Rune dart(p)", + "examine": "A deadly throwing dart with a rune tip.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "grand_exchange_price": "110", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,15,0,0,0,0,0,0,0,0,0,14", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "818", + "name": "Poisoned dart(p)", + "equipment_slot": "3", + "attack_audios": "2547,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "819", + "name": "Bronze dart tip", + "examine": "A deadly looking dart tip made of bronze - needs feathers for flight.", + "tradeable": "true", + "grand_exchange_price": "24", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "820", + "name": "Iron dart tip", + "examine": "A deadly looking dart tip made of iron - needs feathers for flight.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "19", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "821", + "name": "Steel dart tip", + "examine": "A deadly looking dart tip made of steel - needs feathers for flight.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "66", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "822", + "name": "Mithril dart tip", + "examine": "A deadly looking dart tip made of mithril - needs feathers for flight.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "grand_exchange_price": "97", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "823", + "name": "Adamant dart tip", + "examine": "A deadly looking dart tip made of adamantite - needs feathers for flight.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "grand_exchange_price": "212", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "824", + "name": "Rune dart tip", + "examine": "A deadly looking dart tip made of runite - needs feathers for flight.", + "tradeable": "true", + "low_alchemy": "70", + "high_alchemy": "105", + "grand_exchange_price": "498", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "825", + "name": "Bronze javelin", + "examine": "A bronze-tipped javelin.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "6", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,6", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "826", + "name": "Iron javelin", + "examine": "An iron-tipped javelin.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "2", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "827", + "name": "Steel javelin", + "examine": "A steel-tipped javelin.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "22", + "shop_price": "37", + "grand_exchange_price": "19", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,12,0,0,0,0,0,0,0,0,0,12", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,5}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "828", + "name": "Mithril javelin", + "examine": "A mithril tipped javelin.", + "tradeable": "true", + "low_alchemy": "39", + "high_alchemy": "58", + "shop_price": "79", + "grand_exchange_price": "25", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,17,0,0,0,0,0,0,0,0,0,18", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,20}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "829", + "name": "Adamant javelin", + "examine": "An adamant tipped javelin.", + "tradeable": "true", + "low_alchemy": "98", + "high_alchemy": "147", + "shop_price": "100", + "grand_exchange_price": "51", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,24,0,0,0,0,0,0,0,0,0,28", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "100", + "durability": null + }, + { + "id": "830", + "name": "Rune javelin", + "examine": "A rune tipped javelin.", + "tradeable": "true", + "low_alchemy": "249", + "high_alchemy": "374", + "shop_price": "624", + "grand_exchange_price": "186", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,38,0,0,0,0,0,0,0,0,0,42", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,40}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "831", + "name": "Bronze javelin(p)", + "examine": "A bronze-tipped javelin.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "19", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,6", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "832", + "name": "Iron javelin(p)", + "examine": "An iron-tipped javelin.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "19", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "833", + "name": "Steel javelin(p)", + "examine": "A steel-tipped javelin.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "22", + "shop_price": "37", + "grand_exchange_price": "34", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,12,0,0,0,0,0,0,0,0,0,12", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,5}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "834", + "name": "Mithril javelin(p)", + "examine": "A mithril tipped javelin.", + "tradeable": "true", + "low_alchemy": "39", + "high_alchemy": "58", + "shop_price": "79", + "grand_exchange_price": "44", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,17,0,0,0,0,0,0,0,0,0,18", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,20}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "835", + "name": "Adamant javelin(p)", + "examine": "An adamant tipped javelin.", + "tradeable": "true", + "low_alchemy": "98", + "high_alchemy": "147", + "shop_price": "100", + "grand_exchange_price": "88", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,24,0,0,0,0,0,0,0,0,0,28", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "836", + "name": "Rune javelin(p)", + "examine": "A rune tipped javelin.", + "tradeable": "true", + "low_alchemy": "249", + "high_alchemy": "374", + "shop_price": "624", + "grand_exchange_price": "256", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,38,0,0,0,0,0,0,0,0,0,42", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,40}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "837", + "name": "Crossbow", + "examine": "This fires crossbow bolts.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "shop_price": "70", + "grand_exchange_price": "276", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,6,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_anims": "4230,4230,4230,4230", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "weight": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "838", + "name": "Crossbow", + "tradeable": "true", + "grand_exchange_price": "276", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "839", + "name": "Longbow", + "examine": "A nice sturdy bow.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "shop_price": "80", + "grand_exchange_price": "55", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "weight": "1.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "840", + "name": "Longbow", + "tradeable": "true", + "grand_exchange_price": "55", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "841", + "name": "Shortbow", + "examine": "A shortbow made of wood.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "79", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "weight": "1.33", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "842", + "name": "Shortbow", + "tradeable": "true", + "grand_exchange_price": "79", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "843", + "name": "Oak shortbow", + "examine": "A shortbow made out of oak, still effective.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "164", + "grand_exchange_price": "54", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,14,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,5}", + "weight": "1.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "844", + "name": "Oak shortbow", + "tradeable": "true", + "grand_exchange_price": "54", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "845", + "name": "Oak longbow", + "examine": "A nice sturdy bow made out of oak.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "160", + "grand_exchange_price": "132", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,14,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,5}", + "weight": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "846", + "name": "Oak longbow", + "tradeable": "true", + "grand_exchange_price": "132", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "847", + "name": "Willow longbow", + "examine": "A nice sturdy bow made out of willow.", + "tradeable": "true", + "low_alchemy": "128", + "high_alchemy": "192", + "shop_price": "320", + "grand_exchange_price": "132", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,20,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,20}", + "weight": "1.5", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "848", + "name": "Willow longbow", + "tradeable": "true", + "grand_exchange_price": "132", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "849", + "name": "Willow shortbow", + "examine": "A shortbow made out of willow, still effective.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "106", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,20,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,20}", + "weight": "1", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "850", + "name": "Willow shortbow", + "tradeable": "true", + "grand_exchange_price": "106", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "851", + "name": "Maple longbow", + "examine": "A nice sturdy bow made out of maple.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "256", + "high_alchemy": "384", + "shop_price": "640", + "grand_exchange_price": "320", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,29,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,30}", + "weight": "1.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "852", + "name": "Maple longbow", + "tradeable": "true", + "grand_exchange_price": "320", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "853", + "name": "Maple shortbow", + "examine": "A shortbow made out of maple, still effective.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "shop_price": "400", + "grand_exchange_price": "290", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,29,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,30}", + "weight": "1", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "854", + "name": "Maple shortbow", + "tradeable": "true", + "grand_exchange_price": "290", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "855", + "name": "Yew longbow", + "examine": "A nice sturdy bow made out of yew.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "512", + "high_alchemy": "768", + "shop_price": "674", + "grand_exchange_price": "706", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,47,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,40}", + "weight": "1.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "856", + "name": "Yew longbow", + "tradeable": "true", + "grand_exchange_price": "706", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "857", + "name": "Yew shortbow", + "examine": "A shortbow made out of yew, still effective.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "422", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,47,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,40}", + "weight": "1", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "858", + "name": "Yew shortbow", + "tradeable": "true", + "grand_exchange_price": "422", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "859", + "name": "Magic longbow", + "examine": "A nice sturdy magical bow.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "1024", + "high_alchemy": "1536", + "shop_price": "1270", + "grand_exchange_price": "1437", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,69,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,50}", + "weight": "1.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "860", + "name": "Magic longbow", + "tradeable": "true", + "grand_exchange_price": "1437", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "861", + "name": "Magic shortbow", + "examine": "Short and magical, but still effective.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "640", + "high_alchemy": "960", + "shop_price": "5600", + "grand_exchange_price": "959", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,69,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,50}", + "weight": "1.3", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "862", + "name": "Magic shortbow", + "tradeable": "true", + "grand_exchange_price": "959", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "863", + "name": "Iron knife", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "34", + "shop_price": "58", + "grand_exchange_price": "87", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,4", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "864", + "name": "Bronze knife", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "73", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,4,0,0,0,0,0,0,0,0,0,3", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "865", + "name": "Steel knife", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "27", + "high_alchemy": "40", + "shop_price": "68", + "grand_exchange_price": "136", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,7", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "866", + "name": "Mithril knife", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "16", + "grand_exchange_price": "201", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,11,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,20}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "867", + "name": "Adamant knife", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "40", + "grand_exchange_price": "421", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,15,0,0,0,0,0,0,0,0,0,14", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "868", + "name": "Rune knife", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "66", + "high_alchemy": "100", + "grand_exchange_price": "1132", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,25,0,0,0,0,0,0,0,0,0,24", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "869", + "name": "Black knife", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "11", + "shop_price": "15", + "grand_exchange_price": "95", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,10,0,0,0,0,0,0,0,0,0,8", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,10}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "870", + "name": "Bronze knife(p)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "73", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,4,0,0,0,0,0,0,0,0,0,3", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "871", + "name": "Iron knife(p)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "34", + "shop_price": "58", + "grand_exchange_price": "88", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,4", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "872", + "name": "Steel knife(p)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "27", + "high_alchemy": "40", + "shop_price": "68", + "grand_exchange_price": "124", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,7", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "873", + "name": "Mithril knife(p)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "16", + "grand_exchange_price": "226", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,11,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,20}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "874", + "name": "Black knife(p)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "11", + "shop_price": "15", + "grand_exchange_price": "69", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,10,0,0,0,0,0,0,0,0,0,8", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,10}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "875", + "name": "Adamant knife(p)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "40", + "grand_exchange_price": "503", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,15,0,0,0,0,0,0,0,0,0,14", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "876", + "name": "Rune knife(p)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "66", + "high_alchemy": "100", + "grand_exchange_price": "1374", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,25,0,0,0,0,0,0,0,0,0,24", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "877", + "name": "Bronze bolts", + "examine": "Bronze crossbow bolts.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "12", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "878", + "name": "Bronze bolts(p)", + "examine": "Bronze crossbow bolts.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "38", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "879", + "name": "Opal bolts", + "examine": "Opal tipped bronze crossbow bolts", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "grand_exchange_price": "5", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,14", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "880", + "name": "Pearl bolts", + "examine": "Pearl tipped Iron crossbow bolts.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "grand_exchange_price": "32", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,48", + "requirements": "{4,26}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "881", + "name": "Barbed bolts", + "examine": "Great if you have a crossbow!", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "80", + "grand_exchange_price": "42", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,12", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "882", + "name": "Bronze arrow", + "examine": "Arrows with bronze heads.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "7", + "grand_exchange_price": "10", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "883", + "name": "Bronze arrow(p)", + "examine": "Arrows with bronze heads.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "7", + "grand_exchange_price": "39", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "884", + "name": "Iron arrow", + "examine": "Arrows with iron heads.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "10", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "885", + "name": "Iron arrow(p)", + "examine": "Arrows with iron heads.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "41", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "886", + "name": "Steel arrow", + "examine": "Arrows with steel heads.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "shop_price": "46", + "grand_exchange_price": "25", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,16", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "887", + "name": "Steel arrow(p)", + "examine": "Arrows with steel heads.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "shop_price": "46", + "grand_exchange_price": "69", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,16", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "888", + "name": "Mithril arrow", + "examine": "Arrows with mithril heads.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "shop_price": "76", + "grand_exchange_price": "30", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,22", + "requirements": "{4,20}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "889", + "name": "Mithril arrow(p)", + "examine": "Arrows with mithril heads.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "shop_price": "76", + "grand_exchange_price": "69", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,22", + "requirements": "{4,20}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "890", + "name": "Adamant arrow", + "examine": "Arrows with adamantite heads.", + "tradeable": "true", + "low_alchemy": "68", + "high_alchemy": "103", + "shop_price": "172", + "grand_exchange_price": "111", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,31", + "requirements": "{4,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "891", + "name": "Adamant arrow(p)", + "examine": "Arrows with adamantite heads.", + "tradeable": "true", + "low_alchemy": "68", + "high_alchemy": "103", + "shop_price": "172", + "grand_exchange_price": "109", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,31", + "requirements": "{4,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "892", + "name": "Rune arrow", + "examine": "Arrows with rune heads.", + "tradeable": "true", + "low_alchemy": "204", + "high_alchemy": "306", + "shop_price": "510", + "grand_exchange_price": "212", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,49", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "40", + "durability": null + }, + { + "id": "893", + "name": "Rune arrow(p)", + "examine": "Arrows with rune heads.", + "tradeable": "true", + "low_alchemy": "204", + "high_alchemy": "306", + "shop_price": "510", + "grand_exchange_price": "257", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,49", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "942", + "name": "Bronze fire arrows", + "examine": "unlit: Arrows with bronze heads and oil-soaked cloth. lit: An easy to make, bronze-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "228", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "943", + "name": "Worm", + "examine": "Some meaty worms.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "944", + "name": "Worm", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "945", + "name": "Throwing rope", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "946", + "name": "Knife", + "examine": "A dangerous looking knife.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "25", + "grand_exchange_price": "32", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "947", + "name": "Knife", + "tradeable": "true", + "grand_exchange_price": "32", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "948", + "name": "Bear fur", + "examine": "This would make warm clothing.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "4", + "grand_exchange_price": "9", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "949", + "name": "Bear fur", + "tradeable": "true", + "grand_exchange_price": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "950", + "name": "Silk", + "examine": "It's a sheet of silk.", + "tradeable": "true", + "low_alchemy": "22", + "high_alchemy": "33", + "shop_price": "21", + "grand_exchange_price": "27", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "951", + "name": "Silk", + "tradeable": "true", + "grand_exchange_price": "27", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "952", + "name": "Spade", + "examine": "A slightly muddy spade. / Popular with farmers and treasure hunters.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "5", + "grand_exchange_price": "117", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "953", + "name": "Spade", + "tradeable": "true", + "grand_exchange_price": "117", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "954", + "name": "Rope", + "examine": "A coil of rope.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "shop_price": "18", + "grand_exchange_price": "96", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "955", + "name": "Rope", + "tradeable": "true", + "grand_exchange_price": "96", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "956", + "name": "Flier", + "examine": "Get your axes from Bob's Axes.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "958", + "name": "Grey wolf fur", + "examine": "This would make warm clothing.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "70", + "grand_exchange_price": "34", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "959", + "name": "Grey wolf fur", + "tradeable": "true", + "grand_exchange_price": "34", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "960", + "name": "Plank", + "examine": "A plank of wood!", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "grand_exchange_price": "234", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "961", + "name": "Plank", + "tradeable": "true", + "grand_exchange_price": "234", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "962", + "name": "Christmas cracker", + "examine": "I need to pull this.", + "tradeable": "true", + "grand_exchange_price": "15", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "963", + "name": "Christmas cracker", + "tradeable": "true", + "grand_exchange_price": "1900000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "966", + "name": "Tile", + "examine": "A fraction of a roof.", + "weight": "0.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "970", + "name": "Papyrus", + "examine": "Used for making notes.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "15", + "grand_exchange_price": "153", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "971", + "name": "Papyrus", + "tradeable": "true", + "grand_exchange_price": "153", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "972", + "name": "Papyrus", + "examine": "Used for making notes.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "15", + "grand_exchange_price": "163", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "973", + "name": "Charcoal", + "examine": "A lump of charcoal.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "shop_price": "45", + "grand_exchange_price": "272", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "974", + "name": "Charcoal", + "tradeable": "true", + "grand_exchange_price": "272", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "975", + "name": "Machete", + "examine": "A jungle specific slashing device.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "52", + "grand_exchange_price": "619", + "render_anim": "2554", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,6,-2,0,0,0,0,0,0,0,0,5,0,0,0", + "weapon_interface": "6", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "976", + "name": "Machete", + "tradeable": "true", + "grand_exchange_price": "619", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "978", + "name": "Cooking pot", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "981", + "name": "Disk of returning", + "examine": "Used to get out of Thordur's blackhole.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "shop_price": "10", + "grand_exchange_price": "298000000", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "982", + "name": "Disk of returning", + "tradeable": "true", + "grand_exchange_price": "298000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "983", + "name": "Brass key", + "examine": "A key found on the floor of Edgeville Dungeon.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "547", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "984", + "name": "Brass key", + "tradeable": "true", + "grand_exchange_price": "547", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "985", + "name": "Tooth half of a key", + "examine": "The tooth end of the mysterious Crystal key. Can you find the other half?", + "tradeable": "true", + "grand_exchange_price": "24900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "986", + "name": "Tooth half of a key", + "tradeable": "true", + "grand_exchange_price": "24900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "987", + "name": "Loop half of a key", + "examine": "The loop end of the mysterious Crystal key. Can you find the other half?", + "tradeable": "true", + "grand_exchange_price": "21100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "988", + "name": "Loop half of a key", + "tradeable": "true", + "grand_exchange_price": "21100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "989", + "name": "Crystal key", + "examine": "A mysterious key for a mysterious chest.", + "tradeable": "true", + "grand_exchange_price": "48700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "990", + "name": "Crystal key", + "tradeable": "true", + "grand_exchange_price": "48700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "991", + "name": "Muddy key", + "examine": "It looks like the key to a chest", + "tradeable": "true", + "grand_exchange_price": "4971", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "992", + "name": "Muddy key", + "tradeable": "true", + "grand_exchange_price": "4971", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "993", + "name": "Sinister key", + "examine": "You get a sense of dread from this key.", + "tradeable": "true", + "grand_exchange_price": "54600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "994", + "name": "Sinister key", + "tradeable": "true", + "grand_exchange_price": "54600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "995", + "name": "Coins", + "examine": "100,000 or more: \"X x coins\" where X is the exact number of coins in the stack.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1005", + "name": "White apron", + "examine": "A mostly clean apron.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "93", + "equipment_slot": "4", + "weight": "0.45", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1006", + "name": "White apron", + "tradeable": "true", + "grand_exchange_price": "93", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1007", + "name": "Cape", + "examine": "A bright red cape.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "shop_price": "20", + "grand_exchange_price": "187", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1008", + "name": "Cape", + "tradeable": "true", + "grand_exchange_price": "187", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1009", + "name": "Brass necklace", + "examine": "I'd prefer a gold one.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "65", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1010", + "name": "Brass necklace", + "tradeable": "true", + "grand_exchange_price": "65", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1011", + "name": "Blue skirt", + "examine": "Leg covering favored by women and wizards.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "208", + "equipment_slot": "7", + "bonuses": "0,0,0,1,0,0,0,0,1,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1012", + "name": "Blue skirt", + "tradeable": "true", + "grand_exchange_price": "208", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1013", + "name": "Pink skirt", + "examine": "A ladies skirt.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "216", + "equipment_slot": "7", + "bonuses": "0,0,0,1,0,0,0,0,1,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1014", + "name": "Pink skirt", + "tradeable": "true", + "grand_exchange_price": "216", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1015", + "name": "Black skirt", + "examine": "Clothing favoured by women and dark wizards.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "30", + "equipment_slot": "7", + "bonuses": "0,0,0,1,0,0,0,0,1,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1016", + "name": "Black skirt", + "tradeable": "true", + "grand_exchange_price": "30", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1017", + "name": "Wizard hat", + "examine": "A silly pointed hat.", + "tradeable": "true", + "low_alchemy": "0", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "280", + "equipment_slot": "0", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1018", + "name": "Wizard hat", + "tradeable": "true", + "grand_exchange_price": "280", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1019", + "name": "Cape", + "examine": "A warm black cape.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "shop_price": "20", + "grand_exchange_price": "209", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1020", + "name": "Cape", + "tradeable": "true", + "grand_exchange_price": "209", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1021", + "name": "Cape", + "examine": "A thick blue cape.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "shop_price": "20", + "grand_exchange_price": "504", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1022", + "name": "Cape", + "tradeable": "true", + "grand_exchange_price": "504", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1023", + "name": "Cape", + "examine": "A thick yellow cape.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "shop_price": "20", + "grand_exchange_price": "439", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1024", + "name": "Cape", + "tradeable": "true", + "grand_exchange_price": "439", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1025", + "name": "Eyepatch", + "examine": "A black piece of cloth on a string.", + "tradeable": "true", + "low_alchemy": "0", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "111", + "equipment_slot": "0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1026", + "name": "Eyepatch", + "tradeable": "true", + "grand_exchange_price": "111", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1027", + "name": "Cape", + "examine": "A thick green cape.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "shop_price": "20", + "grand_exchange_price": "1061", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1028", + "name": "Cape", + "tradeable": "true", + "grand_exchange_price": "1061", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1029", + "name": "Cape", + "examine": "A thick purple cape.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "shop_price": "20", + "grand_exchange_price": "955", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1030", + "name": "Cape", + "tradeable": "true", + "grand_exchange_price": "955", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1031", + "name": "Cape", + "examine": "A thick orange cape.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "shop_price": "20", + "grand_exchange_price": "1656", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1032", + "name": "Cape", + "tradeable": "true", + "grand_exchange_price": "1656", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1033", + "name": "Zamorak robe", + "examine": "A robe worn by worshippers of Zamorak.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "2481", + "equipment_slot": "7", + "bonuses": "0,0,0,2,0,0,0,0,3,0,0,0,3,0,0", + "weight": "0.9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1034", + "name": "Zamorak robe", + "tradeable": "true", + "grand_exchange_price": "2481", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1035", + "name": "Zamorak robe", + "examine": "A robe worn by worshippers of Zamorak.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "40", + "grand_exchange_price": "1259", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,2,0,0,0,0,3,0,3,0,3,0,0", + "weight": "0.9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1036", + "name": "Zamorak robe", + "tradeable": "true", + "grand_exchange_price": "1259", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1037", + "name": "Bunny ears", + "examine": "A rabbit-like adornment.", + "low_alchemy": "0", + "high_alchemy": "0", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get a replacement from Diango.", + "shop_price": "1", + "equipment_slot": "0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1038", + "name": "Red partyhat", + "examine": "A nice hat from a cracker.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "0", + "high_alchemy": "0", + "shop_price": "1", + "grand_exchange_price": "10", + "equipment_slot": "0", + "weight": "0.05", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1039", + "name": "Red partyhat", + "tradeable": "true", + "grand_exchange_price": "1500000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1040", + "name": "Yellow partyhat", + "examine": "A nice hat from a cracker.", + "tradeable": "true", + "lendable": "true", + "shop_price": "1", + "grand_exchange_price": "10", + "equipment_slot": "0", + "weight": "0.05", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1041", + "name": "Yellow partyhat", + "tradeable": "true", + "grand_exchange_price": "1200000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1042", + "name": "Blue partyhat", + "examine": "A nice hat from a cracker.", + "tradeable": "true", + "lendable": "true", + "shop_price": "1", + "grand_exchange_price": "10", + "equipment_slot": "0", + "weight": "0.05", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1043", + "name": "Blue partyhat", + "tradeable": "true", + "grand_exchange_price": "2100000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1044", + "name": "Green partyhat", + "examine": "A nice hat from a cracker.", + "tradeable": "true", + "lendable": "true", + "shop_price": "1", + "grand_exchange_price": "10", + "equipment_slot": "0", + "weight": "0.05", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1045", + "name": "Green partyhat", + "tradeable": "true", + "grand_exchange_price": "1300000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1046", + "name": "Purple partyhat", + "examine": "A nice hat from a cracker.", + "tradeable": "true", + "lendable": "true", + "shop_price": "1", + "grand_exchange_price": "10", + "equipment_slot": "0", + "weight": "0.05", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1047", + "name": "Purple partyhat", + "tradeable": "true", + "grand_exchange_price": "1000000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1048", + "name": "White partyhat", + "examine": "A nice hat from a cracker.", + "tradeable": "true", + "lendable": "true", + "shop_price": "1", + "grand_exchange_price": "10", + "equipment_slot": "0", + "weight": "0.05", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1049", + "name": "White partyhat", + "tradeable": "true", + "grand_exchange_price": "2000000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1050", + "name": "Santa hat", + "examine": "It's a Santa hat.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "1", + "grand_exchange_price": "5", + "equipment_slot": "0", + "weight": "0.1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1051", + "name": "Santa hat", + "tradeable": "true", + "grand_exchange_price": "112600000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1052", + "name": "Cape of legends", + "examine": "The cape worn by members of the Legends Guild.", + "low_alchemy": "180", + "high_alchemy": "270", + "shop_price": "450", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,7,7,7,7,7,7,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1053", + "name": "Green h'ween mask", + "examine": "Aaaarrrghhh ... I'm a monster.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "15", + "grand_exchange_price": "98000000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1054", + "name": "Green h'ween mask", + "tradeable": "true", + "grand_exchange_price": "98000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1055", + "name": "Blue h'ween mask", + "examine": "Aaaarrrghhh ... I'm a monster.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "15", + "grand_exchange_price": "115900000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1056", + "name": "Blue h'ween mask", + "tradeable": "true", + "grand_exchange_price": "115900000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1057", + "name": "Red h'ween mask", + "examine": "Aaaarrrghhh ... I'm a monster.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "15", + "grand_exchange_price": "154300000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1058", + "name": "Red h'ween mask", + "tradeable": "true", + "grand_exchange_price": "154300000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1059", + "name": "Leather gloves", + "examine": "These will keep my hands warm!", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "12", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "weight": "0.23", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1060", + "name": "Leather gloves", + "tradeable": "true", + "grand_exchange_price": "12", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1061", + "name": "Leather boots", + "examine": "Comfortable leather boots.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "144", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "weight": "0.34", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1062", + "name": "Leather boots", + "tradeable": "true", + "grand_exchange_price": "144", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1063", + "name": "Leather vambraces", + "examine": "Better than no armour!", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "shop_price": "18", + "grand_exchange_price": "13", + "equipment_slot": "9", + "bonuses": "0,0,0,0,4,2,2,1,0,0,0,0,0,0,0", + "weight": "0.22", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1064", + "name": "Leather vambraces", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1065", + "name": "Green d'hide vambraces", + "examine": "Made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "1000", + "high_alchemy": "1500", + "shop_price": "2500", + "grand_exchange_price": "1407", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,8,3,2,4,2,0,0,0,0,0,0", + "requirements": "{4,40}", + "weight": "0.28", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1066", + "name": "Green d'hide vambraces", + "tradeable": "true", + "grand_exchange_price": "1407", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1067", + "name": "Iron platelegs", + "examine": "These look pretty heavy.", + "tradeable": "true", + "low_alchemy": "112", + "high_alchemy": "168", + "shop_price": "280", + "grand_exchange_price": "55", + "equipment_slot": "7", + "absorb": "1,0,1", + "bonuses": "0,0,0,-21,-7,11,10,10,-4,10,0,0,0,0,0", + "weight": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1068", + "name": "Iron platelegs", + "tradeable": "true", + "grand_exchange_price": "55", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1069", + "name": "Steel platelegs", + "examine": "These look pretty heavy.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "grand_exchange_price": "426", + "equipment_slot": "7", + "absorb": "1,0,1", + "bonuses": "0,0,0,-21,-7,17,16,15,-4,16,2,0,0,0,0", + "requirements": "{1,5}", + "weight": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1070", + "name": "Steel platelegs", + "tradeable": "true", + "grand_exchange_price": "426", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1071", + "name": "Mithril platelegs", + "examine": "These look pretty heavy.", + "tradeable": "true", + "low_alchemy": "1040", + "high_alchemy": "1560", + "shop_price": "2600", + "grand_exchange_price": "1391", + "equipment_slot": "7", + "absorb": "1,0,2", + "bonuses": "0,0,0,-21,-7,24,22,20,-4,22,5,0,0,0,0", + "requirements": "{1,20}", + "weight": "7.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1072", + "name": "Mithril platelegs", + "tradeable": "true", + "grand_exchange_price": "1391", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1073", + "name": "Adamant platelegs", + "examine": "These look pretty heavy.", + "tradeable": "true", + "low_alchemy": "2560", + "high_alchemy": "3840", + "shop_price": "6464", + "grand_exchange_price": "3649", + "equipment_slot": "7", + "absorb": "1,0,3", + "bonuses": "0,0,0,-21,-7,33,31,29,-4,31,10,0,0,0,0", + "requirements": "{1,30}", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1074", + "name": "Adamant platelegs", + "tradeable": "true", + "grand_exchange_price": "3649", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1075", + "name": "Bronze platelegs", + "examine": "These look pretty heavy.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "shop_price": "80", + "grand_exchange_price": "34", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,8,7,6,-4,7,0,0,0,0,0", + "weight": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1076", + "name": "Bronze platelegs", + "tradeable": "true", + "grand_exchange_price": "34", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1077", + "name": "Black platelegs", + "examine": "These look pretty heavy", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "1920", + "grand_exchange_price": "4995", + "equipment_slot": "7", + "absorb": "1,0,2", + "bonuses": "0,0,0,-21,-7,21,20,19,-4,20,3,0,0,0,0", + "requirements": "{1,10}", + "weight": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1078", + "name": "Black platelegs", + "tradeable": "true", + "grand_exchange_price": "4995", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1079", + "name": "Rune platelegs", + "examine": "These look pretty heavy.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "shop_price": "64000", + "grand_exchange_price": "38500", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1080", + "name": "Rune platelegs", + "tradeable": "true", + "grand_exchange_price": "38500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1081", + "name": "Iron plateskirt", + "examine": "Designer leg protection.", + "tradeable": "true", + "low_alchemy": "112", + "high_alchemy": "168", + "shop_price": "280", + "grand_exchange_price": "86", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,11,10,10,-4,10,0,0,0,0,0", + "weight": "8.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1082", + "name": "Iron plateskirt", + "tradeable": "true", + "grand_exchange_price": "86", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1083", + "name": "Steel plateskirt", + "examine": "Designer leg protection.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "grand_exchange_price": "514", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,17,16,15,-4,16,2,0,0,0,0", + "requirements": "{1,5}", + "weight": "8.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1084", + "name": "Steel plateskirt", + "tradeable": "true", + "grand_exchange_price": "514", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1085", + "name": "Mithril plateskirt", + "examine": "Designer leg protection.", + "tradeable": "true", + "low_alchemy": "1040", + "high_alchemy": "1560", + "shop_price": "2600", + "grand_exchange_price": "1339", + "equipment_slot": "7", + "absorb": "1,0,2", + "bonuses": "0,0,0,-21,-7,24,22,20,-4,22,5,0,0,0,0", + "requirements": "{1,20}", + "weight": "7.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1086", + "name": "Mithril plateskirt", + "tradeable": "true", + "grand_exchange_price": "1339", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1087", + "name": "Bronze plateskirt", + "examine": "Designer leg protection.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "shop_price": "80", + "grand_exchange_price": "113", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,8,7,6,-4,7,0,0,0,0,0", + "weight": "8.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1088", + "name": "Bronze plateskirt", + "tradeable": "true", + "grand_exchange_price": "113", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1089", + "name": "Black plateskirt", + "examine": "Designer leg protection.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "1920", + "grand_exchange_price": "2180", + "equipment_slot": "7", + "absorb": "1,0,2", + "bonuses": "0,0,0,-21,-7,21,20,19,-4,20,3,0,0,0,0", + "requirements": "{1,10}", + "weight": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1090", + "name": "Black plateskirt", + "tradeable": "true", + "grand_exchange_price": "2180", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1091", + "name": "Adamant plateskirt", + "examine": "Designer leg protection.", + "tradeable": "true", + "low_alchemy": "2560", + "high_alchemy": "3840", + "shop_price": "6464", + "grand_exchange_price": "3610", + "equipment_slot": "7", + "absorb": "1,0,3", + "bonuses": "0,0,0,-21,-7,33,31,29,-4,31,10,0,0,0,0", + "requirements": "{1,30}", + "weight": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1092", + "name": "Adamant plateskirt", + "tradeable": "true", + "grand_exchange_price": "3610", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1093", + "name": "Rune plateskirt", + "examine": "Designer leg protection.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "shop_price": "64000", + "grand_exchange_price": "38100", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "requirements": "{1,40}", + "weight": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1094", + "name": "Rune plateskirt", + "tradeable": "true", + "grand_exchange_price": "38100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1095", + "name": "Leather chaps", + "examine": "Better than no armour!", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "23", + "grand_exchange_price": "5", + "equipment_slot": "7", + "bonuses": "0,0,0,0,4,2,2,1,0,0,0,0,0,0,0", + "weight": "3", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1096", + "name": "Leather chaps", + "tradeable": "true", + "grand_exchange_price": "5", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1097", + "name": "Studded chaps", + "examine": "Those studs should provide a bit more protection.", + "tradeable": "true", + "low_alchemy": "300", + "high_alchemy": "450", + "shop_price": "750", + "grand_exchange_price": "377", + "equipment_slot": "7", + "absorb": "0,2,1", + "bonuses": "0,0,0,-5,6,15,16,17,6,16,5,0,0,0,0", + "requirements": "{4,20}", + "weight": "4.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1098", + "name": "Studded chaps", + "tradeable": "true", + "grand_exchange_price": "377", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1099", + "name": "Green d'hide chaps", + "examine": "100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "1560", + "high_alchemy": "2340", + "shop_price": "3900", + "grand_exchange_price": "2228", + "equipment_slot": "7", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,8,22,16,24,8,22,15,0,0,0,0", + "requirements": "{4,40}", + "weight": "5.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1100", + "name": "Green d'hide chaps", + "tradeable": "true", + "grand_exchange_price": "2228", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1101", + "name": "Iron chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "low_alchemy": "84", + "high_alchemy": "126", + "shop_price": "210", + "grand_exchange_price": "76", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,0,10,15,19,-3,12,5,0,0,0,0", + "weight": "6.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1102", + "name": "Iron chainbody", + "tradeable": "true", + "grand_exchange_price": "76", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1103", + "name": "Bronze chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "60", + "grand_exchange_price": "37", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,0,7,11,13,-3,9,5,0,0,0,0", + "weight": "6.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1104", + "name": "Bronze chainbody", + "tradeable": "true", + "grand_exchange_price": "37", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1105", + "name": "Steel chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "low_alchemy": "300", + "high_alchemy": "450", + "shop_price": "750", + "grand_exchange_price": "265", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,0,17,25,30,-3,19,5,0,0,0,0", + "requirements": "{1,5}", + "weight": "6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1106", + "name": "Steel chainbody", + "tradeable": "true", + "grand_exchange_price": "265", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1107", + "name": "Black chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "low_alchemy": "576", + "high_alchemy": "864", + "shop_price": "1440", + "grand_exchange_price": "961", + "equipment_slot": "4", + "absorb": "1,0,2", + "bonuses": "0,0,0,-15,0,22,32,39,-3,24,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "6.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1108", + "name": "Black chainbody", + "tradeable": "true", + "grand_exchange_price": "961", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1109", + "name": "Mithril chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "low_alchemy": "780", + "high_alchemy": "1170", + "shop_price": "1950", + "grand_exchange_price": "963", + "equipment_slot": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-15,0,25,35,42,-3,27,20,0,0,0,0", + "requirements": "{1,20}", + "weight": "5.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1110", + "name": "Mithril chainbody", + "tradeable": "true", + "grand_exchange_price": "963", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1111", + "name": "Adamant chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "low_alchemy": "1920", + "high_alchemy": "2880", + "shop_price": "4800", + "grand_exchange_price": "2731", + "equipment_slot": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-15,0,36,50,61,-3,38,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "7.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1112", + "name": "Adamant chainbody", + "tradeable": "true", + "grand_exchange_price": "2731", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1113", + "name": "Rune chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "50000", + "grand_exchange_price": "29800", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-15,0,63,72,78,-3,65,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "6.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1114", + "name": "Rune chainbody", + "tradeable": "true", + "grand_exchange_price": "29800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1115", + "name": "Iron platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "shop_price": "560", + "grand_exchange_price": "434", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,21,20,12,-6,20,5,0,0,0,0", + "weight": "9.95", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1116", + "name": "Iron platebody", + "tradeable": "true", + "grand_exchange_price": "434", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1117", + "name": "Bronze platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "160", + "grand_exchange_price": "36", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,15,14,9,-6,14,5,0,0,0,0", + "weight": "9.5", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1118", + "name": "Bronze platebody", + "tradeable": "true", + "grand_exchange_price": "36", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1119", + "name": "Steel platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "2000", + "grand_exchange_price": "1077", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,32,31,24,-6,31,5,0,0,0,0", + "requirements": "{1,5}", + "weight": "9.9", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1120", + "name": "Steel platebody", + "tradeable": "true", + "grand_exchange_price": "1077", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1121", + "name": "Mithril platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "low_alchemy": "2080", + "high_alchemy": "3120", + "shop_price": "5200", + "grand_exchange_price": "2965", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-30,-10,46,44,38,-6,44,20,0,0,0,0", + "requirements": "{1,20}", + "weight": "8.6", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1122", + "name": "Mithril platebody", + "tradeable": "true", + "grand_exchange_price": "2965", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1123", + "name": "Adamant platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "low_alchemy": "6656", + "high_alchemy": "9984", + "shop_price": "16256", + "grand_exchange_price": "9790", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-30,-10,65,63,55,-6,63,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "11", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1124", + "name": "Adamant platebody", + "tradeable": "true", + "grand_exchange_price": "9790", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1125", + "name": "Black platebody", + "examine": "Provides Excellent protection.", + "tradeable": "true", + "low_alchemy": "1536", + "high_alchemy": "2304", + "shop_price": "3840", + "grand_exchange_price": "4915", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,2", + "bonuses": "0,0,0,-30,-10,41,40,30,-6,40,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "9.9", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1126", + "name": "Black platebody", + "tradeable": "true", + "grand_exchange_price": "4915", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1127", + "name": "Rune platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "shop_price": "65000", + "grand_exchange_price": "38800", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "9.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1128", + "name": "Rune platebody", + "tradeable": "true", + "grand_exchange_price": "38800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1129", + "name": "Leather body", + "examine": "Better than no armour!", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "34", + "equipment_slot": "4", + "bonuses": "0,0,0,-2,2,8,9,10,4,9,5,0,0,0,0", + "weight": "2.7", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1130", + "name": "Leather body", + "tradeable": "true", + "grand_exchange_price": "34", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1131", + "name": "Hardleather body", + "examine": "Harder than normal leather.", + "tradeable": "true", + "low_alchemy": "68", + "high_alchemy": "102", + "shop_price": "170", + "grand_exchange_price": "43", + "equipment_slot": "4", + "absorb": "0,2,1", + "bonuses": "0,0,0,-4,8,12,15,18,6,15,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "3.6", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1132", + "name": "Hardleather body", + "tradeable": "true", + "grand_exchange_price": "43", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1133", + "name": "Studded body", + "examine": "These studs should provide a bit more protection.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "414", + "equipment_slot": "4", + "absorb": "0,3,1", + "bonuses": "0,0,0,-4,8,18,25,22,8,25,20,0,0,0,0", + "requirements": "{1,20}-{4,20}", + "weight": "5", + "ge_buy_limit": "1000", + "archery_ticket_price": "150", + "durability": null + }, + { + "id": "1134", + "name": "Studded body", + "tradeable": "true", + "grand_exchange_price": "414", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1135", + "name": "Green d'hide body", + "examine": "Made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "3120", + "high_alchemy": "4680", + "shop_price": "7800", + "grand_exchange_price": "4544", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,15,40,32,45,20,40,40,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "6.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "2400", + "durability": null + }, + { + "id": "1136", + "name": "Green d'hide body", + "tradeable": "true", + "grand_exchange_price": "4544", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1137", + "name": "Iron med helm", + "examine": "A medium sized helmet.", + "tradeable": "true", + "low_alchemy": "33", + "high_alchemy": "50", + "shop_price": "84", + "grand_exchange_price": "22", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,4,5,3,-1,4,0,0,0,0,0", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1138", + "name": "Iron med helm", + "tradeable": "true", + "grand_exchange_price": "22", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1139", + "name": "Bronze med helm", + "examine": "A medium sized helmet.", + "tradeable": "true", + "low_alchemy": "9", + "high_alchemy": "14", + "shop_price": "24", + "grand_exchange_price": "39", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,3,4,2,-1,3,0,0,0,0,0", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1140", + "name": "Bronze med helm", + "tradeable": "true", + "grand_exchange_price": "39", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1141", + "name": "Steel med helm", + "examine": "A medium sized helmet.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "52", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,3,0,0,0,0", + "requirements": "{1,5}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1142", + "name": "Steel med helm", + "tradeable": "true", + "grand_exchange_price": "52", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1143", + "name": "Mithril med helm", + "examine": "A medium sized helmet.", + "tradeable": "true", + "low_alchemy": "312", + "high_alchemy": "468", + "shop_price": "780", + "grand_exchange_price": "272", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,10,11,9,-1,10,5,0,0,0,0", + "requirements": "{1,20}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1144", + "name": "Mithril med helm", + "tradeable": "true", + "grand_exchange_price": "272", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1145", + "name": "Adamant med helm", + "examine": "A medium sized helmet.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "1920", + "grand_exchange_price": "1024", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-3,-1,14,15,13,-1,14,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1146", + "name": "Adamant med helm", + "tradeable": "true", + "grand_exchange_price": "1024", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1147", + "name": "Rune med helm", + "examine": "A medium sized helmet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "7680", + "high_alchemy": "11520", + "shop_price": "19200", + "grand_exchange_price": "11400", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-3,-1,22,23,21,-1,22,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1148", + "name": "Rune med helm", + "tradeable": "true", + "grand_exchange_price": "11400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1149", + "name": "Dragon med helm", + "examine": "Makes the wearer pretty intimidating.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "60500", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,4", + "bonuses": "0,0,0,-3,-1,33,35,32,-1,34,10,0,0,0,0", + "requirements": "{1,60}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1150", + "name": "Dragon med helm", + "tradeable": "true", + "grand_exchange_price": "60500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1151", + "name": "Black med helm", + "examine": "A medium sized helmet.", + "tradeable": "true", + "low_alchemy": "230", + "high_alchemy": "345", + "shop_price": "530", + "grand_exchange_price": "242", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,4,0,0,0,0", + "requirements": "{1,10}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1152", + "name": "Black med helm", + "tradeable": "true", + "grand_exchange_price": "242", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1153", + "name": "Iron full helm", + "examine": "A full face helmet.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "92", + "shop_price": "61", + "grand_exchange_price": "56", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,6,7,5,-1,6,0,0,0,0,0", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1154", + "name": "Iron full helm", + "tradeable": "true", + "grand_exchange_price": "56", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1155", + "name": "Bronze full helm", + "examine": "A full face helmet.", + "tradeable": "true", + "low_alchemy": "17", + "high_alchemy": "26", + "shop_price": "44", + "grand_exchange_price": "67", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,4,5,3,-1,4,0,0,0,0,0", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1156", + "name": "Bronze full helm", + "tradeable": "true", + "grand_exchange_price": "67", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1157", + "name": "Steel full helm", + "examine": "A full face helmet.", + "tradeable": "true", + "low_alchemy": "220", + "high_alchemy": "330", + "shop_price": "550", + "grand_exchange_price": "195", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "requirements": "{1,5}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1158", + "name": "Steel full helm", + "tradeable": "true", + "grand_exchange_price": "195", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1159", + "name": "Mithril full helm", + "examine": "A full face helmet.", + "tradeable": "true", + "low_alchemy": "572", + "high_alchemy": "858", + "shop_price": "1430", + "grand_exchange_price": "675", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,13,14,11,-1,13,5,0,0,0,0", + "requirements": "{1,20}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1160", + "name": "Mithril full helm", + "tradeable": "true", + "grand_exchange_price": "675", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1161", + "name": "Adamant full helm", + "examine": "A full face helmet.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "shop_price": "3520", + "grand_exchange_price": "1911", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1162", + "name": "Adamant full helm", + "tradeable": "true", + "grand_exchange_price": "1911", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1163", + "name": "Rune full helm", + "examine": "A full face helmet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "20900", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1164", + "name": "Rune full helm", + "tradeable": "true", + "grand_exchange_price": "20900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1165", + "name": "Black full helm", + "examine": "A full face helmet.", + "tradeable": "true", + "low_alchemy": "548", + "high_alchemy": "823", + "shop_price": "1372", + "grand_exchange_price": "731", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,4,0,0,0,0", + "requirements": "{1,10}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1166", + "name": "Black full helm", + "tradeable": "true", + "grand_exchange_price": "731", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1167", + "name": "Leather cowl", + "examine": "Better than no armour!", + "tradeable": "true", + "low_alchemy": "9", + "high_alchemy": "14", + "shop_price": "24", + "grand_exchange_price": "9", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,1,2,3,4,2,3,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1168", + "name": "Leather cowl", + "tradeable": "true", + "grand_exchange_price": "9", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1169", + "name": "Coif", + "examine": "Light weight head protection.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "56", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,5,0,0,0,0", + "requirements": "{4,20}", + "weight": "0.9", + "ge_buy_limit": "5000", + "archery_ticket_price": "100", + "durability": null + }, + { + "id": "1170", + "name": "Coif", + "tradeable": "true", + "grand_exchange_price": "56", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1171", + "name": "Wooden shield", + "examine": "A solid wooden shield.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "483", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,4,5,3,1,4,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1172", + "name": "Wooden shield", + "tradeable": "true", + "grand_exchange_price": "483", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1173", + "name": "Bronze sq shield", + "examine": "A medium square shield.", + "tradeable": "true", + "low_alchemy": "19", + "high_alchemy": "28", + "shop_price": "48", + "grand_exchange_price": "12", + "equipment_slot": "5", + "bonuses": "0,0,0,-6,-2,5,6,4,0,5,0,0,0,0,0", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1174", + "name": "Bronze sq shield", + "tradeable": "true", + "grand_exchange_price": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1175", + "name": "Iron sq shield", + "examine": "A medium square shield.", + "tradeable": "true", + "low_alchemy": "67", + "high_alchemy": "100", + "shop_price": "168", + "grand_exchange_price": "39", + "equipment_slot": "5", + "bonuses": "0,0,0,-6,-2,8,9,7,0,8,1,0,0,0,0", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1176", + "name": "Iron sq shield", + "tradeable": "true", + "grand_exchange_price": "39", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1177", + "name": "Steel sq shield", + "examine": "A medium square shield.", + "tradeable": "true", + "low_alchemy": "240", + "high_alchemy": "360", + "shop_price": "600", + "grand_exchange_price": "185", + "equipment_slot": "5", + "bonuses": "0,0,0,-6,-2,12,13,11,0,12,4,0,0,0,0", + "requirements": "{1,5}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1178", + "name": "Steel sq shield", + "tradeable": "true", + "grand_exchange_price": "185", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1179", + "name": "Black sq shield", + "examine": "A medium square shield.", + "tradeable": "true", + "low_alchemy": "460", + "high_alchemy": "691", + "shop_price": "1463", + "grand_exchange_price": "511", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,15,16,14,0,15,9,0,0,0,0", + "requirements": "{1,10}", + "weight": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1180", + "name": "Black sq shield", + "tradeable": "true", + "grand_exchange_price": "511", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1181", + "name": "Mithril sq shield", + "examine": "A medium square shield.", + "tradeable": "true", + "low_alchemy": "624", + "high_alchemy": "936", + "shop_price": "1560", + "grand_exchange_price": "744", + "equipment_slot": "5", + "absorb": "2,0,4", + "bonuses": "0,0,0,-6,-2,17,19,15,0,17,18,0,0,0,0", + "requirements": "{1,20}", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1182", + "name": "Mithril sq shield", + "tradeable": "true", + "grand_exchange_price": "744", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1183", + "name": "Adamant sq shield", + "examine": "A medium square shield.", + "tradeable": "true", + "low_alchemy": "1536", + "high_alchemy": "2304", + "grand_exchange_price": "2136", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-6,-2,24,26,22,0,24,25,0,0,0,0", + "requirements": "{1,30}", + "weight": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1184", + "name": "Adamant sq shield", + "tradeable": "true", + "grand_exchange_price": "2136", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1185", + "name": "Rune sq shield", + "examine": "A medium square shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "15360", + "high_alchemy": "23040", + "grand_exchange_price": "22800", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-6,-2,38,40,36,0,38,35,0,0,0,0", + "requirements": "{1,40}", + "weight": "3.64", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1186", + "name": "Rune sq shield", + "tradeable": "true", + "grand_exchange_price": "22800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1187", + "name": "Dragon sq shield", + "examine": "An ancient and powerful looking Dragon Square shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "grand_exchange_price": "431900", + "equipment_slot": "5", + "absorb": "5,0,11", + "bonuses": "0,0,0,-6,-2,50,52,48,0,50,50,0,0,0,0", + "requirements": "{1,60}", + "weight": "3", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1188", + "name": "Dragon sq shield", + "tradeable": "true", + "grand_exchange_price": "431900", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1189", + "name": "Bronze kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "27", + "high_alchemy": "40", + "shop_price": "86", + "grand_exchange_price": "18", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,5,7,6,-1,6,1,0,0,0,0", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1190", + "name": "Bronze kiteshield", + "tradeable": "true", + "grand_exchange_price": "18", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1191", + "name": "Iron kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "95", + "high_alchemy": "142", + "shop_price": "233", + "grand_exchange_price": "57", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,8,10,9,-1,9,2,0,0,0,0", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1192", + "name": "Iron kiteshield", + "tradeable": "true", + "grand_exchange_price": "57", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1193", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "354", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "requirements": "{1,5}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1194", + "name": "Steel kiteshield", + "tradeable": "true", + "grand_exchange_price": "354", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1195", + "name": "Black kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "848", + "high_alchemy": "1272", + "shop_price": "2121", + "grand_exchange_price": "3311", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1196", + "name": "Black kiteshield", + "tradeable": "true", + "grand_exchange_price": "3311", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1197", + "name": "Mithril kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "884", + "high_alchemy": "1326", + "grand_exchange_price": "1128", + "equipment_slot": "5", + "absorb": "2,0,4", + "bonuses": "0,0,0,-8,-2,18,22,20,-1,20,20,0,0,0,0", + "requirements": "{1,20}", + "weight": "4.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1198", + "name": "Mithril kiteshield", + "tradeable": "true", + "grand_exchange_price": "1128", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1199", + "name": "Adamant kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "3066", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "5.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1200", + "name": "Adamant kiteshield", + "tradeable": "true", + "grand_exchange_price": "3066", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1201", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "35600", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1202", + "name": "Rune kiteshield", + "tradeable": "true", + "grand_exchange_price": "35600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1203", + "name": "Iron dagger", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "38", + "grand_exchange_price": "35", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,4,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1204", + "name": "Iron dagger", + "tradeable": "true", + "grand_exchange_price": "35", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1205", + "name": "Bronze dagger", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "11", + "grand_exchange_price": "105", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,2,-4,1,0,0,0,0,1,0,0,3,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1206", + "name": "Bronze dagger", + "tradeable": "true", + "grand_exchange_price": "105", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1207", + "name": "Steel dagger", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "shop_price": "135", + "grand_exchange_price": "17", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "8,4,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,5}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1208", + "name": "Steel dagger", + "tradeable": "true", + "grand_exchange_price": "17", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1209", + "name": "Mithril dagger", + "examine": "A dangerous dagger.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "130", + "grand_exchange_price": "71", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "11,5,-4,1,0,0,0,0,1,0,0,10,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,20}", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1210", + "name": "Mithril dagger", + "tradeable": "true", + "grand_exchange_price": "71", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1211", + "name": "Adamant dagger", + "examine": "Short and deadly.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "shop_price": "816", + "grand_exchange_price": "300", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "15,8,-4,1,0,0,0,0,1,0,0,14,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,30}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1212", + "name": "Adamant dagger", + "tradeable": "true", + "grand_exchange_price": "300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1213", + "name": "Rune dagger", + "examine": "A powerful dagger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "shop_price": "8000", + "grand_exchange_price": "4642", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "25,12,-4,1,0,0,0,0,1,0,0,24,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,40}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1214", + "name": "Rune dagger", + "tradeable": "true", + "grand_exchange_price": "4642", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1215", + "name": "Dragon dagger", + "examine": "A powerful dagger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "shop_price": "60000", + "grand_exchange_price": "17700", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,60}", + "weight": "0.4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1216", + "name": "Dragon dagger", + "tradeable": "true", + "grand_exchange_price": "17700", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1217", + "name": "Black dagger", + "examine": "A vicious black dagger.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "shop_price": "240", + "grand_exchange_price": "79", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,10}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1218", + "name": "Black dagger", + "tradeable": "true", + "grand_exchange_price": "79", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1219", + "name": "Iron dagger(p)", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "38", + "grand_exchange_price": "56", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,4,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1220", + "name": "Iron dagger(p)", + "tradeable": "true", + "grand_exchange_price": "56", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1221", + "name": "Bronze dagger(p)", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "11", + "grand_exchange_price": "86", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,2,-4,1,0,0,0,0,1,0,0,3,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1222", + "name": "Bronze dagger(p)", + "tradeable": "true", + "grand_exchange_price": "86", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1223", + "name": "Steel dagger(p)", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "shop_price": "135", + "grand_exchange_price": "98", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "8,4,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,5}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1224", + "name": "Steel dagger(p)", + "tradeable": "true", + "grand_exchange_price": "98", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1225", + "name": "Mithril dagger(p)", + "examine": "A dangerous dagger.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "130", + "grand_exchange_price": "129", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "11,5,-4,1,0,0,0,0,1,0,0,10,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,20}", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1226", + "name": "Mithril dagger(p)", + "tradeable": "true", + "grand_exchange_price": "129", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1227", + "name": "Adamant dagger(p)", + "examine": "Short and deadly.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "shop_price": "816", + "grand_exchange_price": "365", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "15,8,-4,1,0,0,0,0,1,0,0,14,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,30}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1228", + "name": "Adamant dagger(p)", + "tradeable": "true", + "grand_exchange_price": "365", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1229", + "name": "Rune dagger(p)", + "examine": "A powerful dagger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "shop_price": "8000", + "grand_exchange_price": "4831", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "25,12,-4,1,0,0,0,0,1,0,0,24,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,40}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1230", + "name": "Rune dagger(p)", + "tradeable": "true", + "grand_exchange_price": "4831", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1231", + "name": "Dragon dagger(p)", + "examine": "A powerful dagger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "shop_price": "60000", + "grand_exchange_price": "17600", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,60}", + "weight": "0.4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1232", + "name": "Dragon dagger(p)", + "tradeable": "true", + "grand_exchange_price": "17600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1233", + "name": "Black dagger(p)", + "examine": "A vicious black dagger.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "shop_price": "240", + "grand_exchange_price": "67", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,10}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1234", + "name": "Black dagger(p)", + "tradeable": "true", + "grand_exchange_price": "67", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1235", + "name": "Poisoned dagger(p)", + "render_anim": "2584", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1236", + "name": "Poisoned dagger(p)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1237", + "name": "Bronze spear", + "examine": "A bronze tipped spear.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "26", + "grand_exchange_price": "858", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,5,5,0,0,1,1,0,0,0,0,6,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1238", + "name": "Bronze spear", + "tradeable": "true", + "grand_exchange_price": "858", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1239", + "name": "Iron spear", + "examine": "An iron tipped spear.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "209", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,8,8,0,0,1,1,0,0,0,0,10,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1240", + "name": "Iron spear", + "tradeable": "true", + "grand_exchange_price": "209", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1241", + "name": "Steel spear", + "examine": "A steel tipped spear.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "grand_exchange_price": "340", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,12,12,0,0,1,1,0,0,0,0,12,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "requirements": "{0,5}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1242", + "name": "Steel spear", + "tradeable": "true", + "grand_exchange_price": "340", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1243", + "name": "Mithril spear", + "examine": "A mithril tipped spear.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "353", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,1,1,0,0,0,0,18,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "requirements": "{0,20}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1244", + "name": "Mithril spear", + "tradeable": "true", + "grand_exchange_price": "353", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1245", + "name": "Adamant spear", + "examine": "An adamant tipped spear.", + "tradeable": "true", + "low_alchemy": "832", + "high_alchemy": "1248", + "grand_exchange_price": "1191", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "24,24,24,0,0,1,1,0,0,0,0,28,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1246", + "name": "Adamant spear", + "tradeable": "true", + "grand_exchange_price": "1191", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1247", + "name": "Rune spear", + "examine": "A rune tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "grand_exchange_price": "12200", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "36,36,36,0,0,1,1,0,0,0,0,42,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "requirements": "{0,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1248", + "name": "Rune spear", + "tradeable": "true", + "grand_exchange_price": "12200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1249", + "name": "Dragon spear", + "examine": "A dragon tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24960", + "high_alchemy": "37440", + "grand_exchange_price": "37200", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "requirements": "{0,60}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1250", + "name": "Dragon spear", + "tradeable": "true", + "grand_exchange_price": "37200", + "defence_anim": "2079", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1251", + "name": "Bronze spear(p)", + "examine": "A bronze tipped spear.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "389", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,5,5,0,0,1,1,0,0,0,0,6,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1252", + "name": "Bronze spear(p)", + "tradeable": "true", + "grand_exchange_price": "389", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1253", + "name": "Iron spear(p)", + "examine": "An iron tipped spear.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "212", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,8,8,0,0,1,1,0,0,0,0,10,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1254", + "name": "Iron spear(p)", + "tradeable": "true", + "grand_exchange_price": "212", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1255", + "name": "Steel spear(p)", + "examine": "A steel tipped spear.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "grand_exchange_price": "136", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,12,12,0,0,1,1,0,0,0,0,12,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "requirements": "{0,5}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1256", + "name": "Steel spear(p)", + "tradeable": "true", + "grand_exchange_price": "136", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1257", + "name": "Mithril spear(p)", + "examine": "A mithril tipped spear.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "350", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,1,1,0,0,0,0,18,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "requirements": "{0,20}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1258", + "name": "Mithril spear(p)", + "tradeable": "true", + "grand_exchange_price": "350", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1259", + "name": "Adamant spear(p)", + "examine": "An adamant tipped spear.", + "tradeable": "true", + "low_alchemy": "832", + "high_alchemy": "1248", + "grand_exchange_price": "1004", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "24,24,24,0,0,1,1,0,0,0,0,28,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1260", + "name": "Adamant spear(p)", + "tradeable": "true", + "grand_exchange_price": "1004", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1261", + "name": "Rune spear(p)", + "examine": "A rune tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "grand_exchange_price": "12400", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "36,36,36,0,0,1,1,0,0,0,0,42,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "requirements": "{0,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1262", + "name": "Rune spear(p)", + "tradeable": "true", + "grand_exchange_price": "12400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1263", + "name": "Dragon spear(p)", + "examine": "A dragon tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24960", + "high_alchemy": "37440", + "grand_exchange_price": "39700", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "attack_anims": "428,2081,429,428", + "defence_anim": "2079", + "requirements": "{0,60}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1264", + "name": "Dragon spear(p)", + "tradeable": "true", + "grand_exchange_price": "39700", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1265", + "name": "Bronze pickaxe", + "examine": "Used for mining.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "17", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "4,-2,2,0,0,0,1,0,0,0,0,5,0,0,0", + "weapon_interface": "4", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "attack_audios": "2508,2508,2508,2508", + "weight": "2.25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1266", + "name": "Bronze pickaxe", + "tradeable": "true", + "grand_exchange_price": "17", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1267", + "name": "Iron pickaxe", + "examine": "Used for mining.", + "tradeable": "true", + "low_alchemy": "56", + "high_alchemy": "84", + "shop_price": "140", + "grand_exchange_price": "200", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,-2,3,0,0,0,1,0,0,0,0,7,0,0,0", + "weapon_interface": "4", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "attack_audios": "2508,2508,2508,2508", + "weight": "2.25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1268", + "name": "Iron pickaxe", + "tradeable": "true", + "grand_exchange_price": "200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1269", + "name": "Steel pickaxe", + "examine": "Used for mining.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "500", + "grand_exchange_price": "571", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,-2,6,0,0,0,1,0,0,0,0,9,0,0,0", + "weapon_interface": "4", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "attack_audios": "2508,2508,2508,2508", + "requirements": "{0,5}", + "weight": "2.25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1270", + "name": "Steel pickaxe", + "tradeable": "true", + "grand_exchange_price": "571", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1271", + "name": "Adamant pickaxe", + "examine": "Used for mining.", + "tradeable": "true", + "low_alchemy": "1280", + "high_alchemy": "1920", + "shop_price": "3200", + "grand_exchange_price": "1782", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,-2,15,0,0,0,1,0,0,0,0,19,0,0,0", + "weapon_interface": "4", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "attack_audios": "2508,2508,2508,2508", + "requirements": "{0,30}-{14,31}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1272", + "name": "Adamant pickaxe", + "tradeable": "true", + "grand_exchange_price": "1782", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1273", + "name": "Mithril pickaxe", + "examine": "Used for mining.", + "tradeable": "true", + "low_alchemy": "520", + "high_alchemy": "780", + "shop_price": "1300", + "grand_exchange_price": "611", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,-2,10,0,0,0,1,0,0,0,0,13,0,0,0", + "weapon_interface": "4", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "attack_audios": "2508,2508,2508,2508", + "requirements": "{0,20}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1274", + "name": "Mithril pickaxe", + "tradeable": "true", + "grand_exchange_price": "611", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1275", + "name": "Rune pickaxe", + "examine": "Used for mining.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "12800", + "high_alchemy": "19200", + "shop_price": "32000", + "grand_exchange_price": "19500", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "26,-2,24,0,0,0,1,0,0,0,0,29,0,0,0", + "weapon_interface": "4", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "attack_audios": "2508,2508,2508,2508", + "requirements": "{0,40}-{14,41}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1276", + "name": "Rune pickaxe", + "tradeable": "true", + "grand_exchange_price": "19500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1277", + "name": "Bronze sword", + "examine": "A razor sharp sword.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "33", + "grand_exchange_price": "13", + "stand_anim": "813", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,3,-2,0,0,0,2,1,0,0,0,5,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,381,390,381", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1278", + "name": "Bronze sword", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1279", + "name": "Iron sword", + "examine": "A razor sharp sword.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "shop_price": "91", + "grand_exchange_price": "17", + "stand_anim": "813", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "6,4,-2,0,0,0,2,1,0,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,381,390,381", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1280", + "name": "Iron sword", + "tradeable": "true", + "grand_exchange_price": "17", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1281", + "name": "Steel sword", + "examine": "A razor sharp sword.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "412", + "grand_exchange_price": "79", + "stand_anim": "813", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "11,8,-2,0,0,0,2,1,0,0,0,12,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,381,390,381", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,5}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1282", + "name": "Steel sword", + "tradeable": "true", + "grand_exchange_price": "79", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1283", + "name": "Black sword", + "examine": "A razor sharp sword.", + "tradeable": "true", + "low_alchemy": "249", + "high_alchemy": "374", + "shop_price": "624", + "grand_exchange_price": "197", + "stand_anim": "813", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "14,10,-2,0,0,0,2,1,0,0,0,12,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,381,390,381", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,10}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1284", + "name": "Black sword", + "tradeable": "true", + "grand_exchange_price": "197", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1285", + "name": "Mithril sword", + "examine": "A razor sharp sword.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "shop_price": "266", + "grand_exchange_price": "313", + "stand_anim": "813", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "16,11,-2,0,0,0,2,1,0,0,0,17,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,381,390,381", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,20}", + "weight": "1.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1286", + "name": "Mithril sword", + "tradeable": "true", + "grand_exchange_price": "313", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1287", + "name": "Adamant sword", + "examine": "A razor sharp sword.", + "tradeable": "true", + "low_alchemy": "832", + "high_alchemy": "1248", + "shop_price": "2080", + "grand_exchange_price": "1046", + "stand_anim": "813", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "23,18,-2,0,0,0,2,1,0,0,0,24,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,381,390,381", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,30}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1288", + "name": "Adamant sword", + "tradeable": "true", + "grand_exchange_price": "1046", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1289", + "name": "Rune sword", + "examine": "A razor sharp sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "shop_price": "20800", + "grand_exchange_price": "12300", + "stand_anim": "813", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "38,26,-2,0,0,0,2,1,0,0,0,39,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,381,390,381", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,40}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1290", + "name": "Rune sword", + "tradeable": "true", + "grand_exchange_price": "12300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1291", + "name": "Bronze longsword", + "examine": "A razor sharp longsword.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "23", + "grand_exchange_price": "14", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "4,5,-2,0,0,0,3,2,0,0,0,7,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1292", + "name": "Bronze longsword", + "tradeable": "true", + "grand_exchange_price": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1293", + "name": "Iron longsword", + "examine": "A razor sharp longsword.", + "tradeable": "true", + "low_alchemy": "56", + "high_alchemy": "84", + "shop_price": "177", + "grand_exchange_price": "22", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "6,8,-2,0,0,0,3,2,0,0,0,10,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1294", + "name": "Iron longsword", + "tradeable": "true", + "grand_exchange_price": "22", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1295", + "name": "Steel longsword", + "examine": "A razor sharp longsword.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "500", + "grand_exchange_price": "147", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "9,14,-2,0,0,0,3,2,0,0,0,16,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,5}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1296", + "name": "Steel longsword", + "tradeable": "true", + "grand_exchange_price": "147", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1297", + "name": "Black longsword", + "examine": "A razor sharp longsword.", + "tradeable": "true", + "low_alchemy": "384", + "high_alchemy": "576", + "shop_price": "960", + "grand_exchange_price": "384", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "13,18,-2,0,0,0,3,2,0,0,0,16,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,10}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1298", + "name": "Black longsword", + "tradeable": "true", + "grand_exchange_price": "384", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1299", + "name": "Mithril longsword", + "examine": "A razor sharp longsword.", + "tradeable": "true", + "low_alchemy": "520", + "high_alchemy": "780", + "shop_price": "1074", + "grand_exchange_price": "602", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "15,20,-2,0,0,0,3,2,0,0,0,22,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,20}", + "weight": "1.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1300", + "name": "Mithril longsword", + "tradeable": "true", + "grand_exchange_price": "602", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1301", + "name": "Adamant longsword", + "examine": "A razor sharp longsword.", + "tradeable": "true", + "low_alchemy": "1280", + "high_alchemy": "1920", + "shop_price": "3200", + "grand_exchange_price": "1808", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "20,29,-2,0,0,0,3,2,0,0,0,31,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1302", + "name": "Adamant longsword", + "tradeable": "true", + "grand_exchange_price": "1808", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1303", + "name": "Rune longsword", + "examine": "A razor sharp longsword", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "12800", + "high_alchemy": "19200", + "shop_price": "32000", + "grand_exchange_price": "19000", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "38,47,-2,0,0,0,3,2,0,0,0,49,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,40}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1304", + "name": "Rune longsword", + "tradeable": "true", + "grand_exchange_price": "19000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1305", + "name": "Dragon longsword", + "examine": "A very powerful sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "shop_price": "100000", + "grand_exchange_price": "60200", + "stand_anim": "809", + "stand_turn_anim": "823", + "walk_anim": "1146", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "58,69,-2,0,0,0,3,2,0,0,0,71,0,0,0", + "weapon_interface": "6", + "has_special": "true", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,60}", + "weight": "1.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1306", + "name": "Dragon longsword", + "tradeable": "true", + "grand_exchange_price": "60200", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1307", + "name": "Bronze 2h sword", + "examine": "A two-handed sword.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "shop_price": "160", + "grand_exchange_price": "89", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,9,8,-4,0,0,0,0,0,-1,0,10,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "2503,0,2504,0", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1308", + "name": "Bronze 2h sword", + "tradeable": "true", + "grand_exchange_price": "89", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1309", + "name": "Iron 2h sword", + "examine": "A two handed sword.", + "tradeable": "true", + "low_alchemy": "112", + "high_alchemy": "168", + "shop_price": "260", + "grand_exchange_price": "32", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,13,10,-4,0,0,0,0,0,-1,0,14,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "2503,0,2504,0", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1310", + "name": "Iron 2h sword", + "tradeable": "true", + "grand_exchange_price": "32", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1311", + "name": "Steel 2h sword", + "examine": "A two handed sword.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "grand_exchange_price": "411", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,21,16,-4,0,0,0,0,0,-1,0,22,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "2503,0,2504,0", + "requirements": "{0,5}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1312", + "name": "Steel 2h sword", + "tradeable": "true", + "grand_exchange_price": "411", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1313", + "name": "Black 2h sword", + "examine": "A two-handed sword.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "2400", + "grand_exchange_price": "1031", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,27,21,-4,0,0,0,0,0,-1,0,26,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "2503,0,2504,0", + "requirements": "{0,10}", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1314", + "name": "Black 2h sword", + "tradeable": "true", + "grand_exchange_price": "1031", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1315", + "name": "Mithril 2h sword", + "examine": "A two-handed sword.", + "tradeable": "true", + "low_alchemy": "1040", + "high_alchemy": "1560", + "shop_price": "3000", + "grand_exchange_price": "1396", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,30,24,-4,0,0,0,0,0,-1,0,31,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "2503,0,2504,0", + "requirements": "{0,20}", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1316", + "name": "Mithril 2h sword", + "tradeable": "true", + "grand_exchange_price": "1396", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1317", + "name": "Adamant 2h sword", + "examine": "A two-handed sword.", + "tradeable": "true", + "low_alchemy": "2560", + "high_alchemy": "3840", + "shop_price": "6400", + "grand_exchange_price": "3577", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,43,30,-4,0,0,0,0,0,-1,0,44,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "2503,0,2504,0", + "requirements": "{0,30}", + "weight": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1318", + "name": "Adamant 2h sword", + "tradeable": "true", + "grand_exchange_price": "3577", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1319", + "name": "Rune 2h sword", + "examine": "A two handed sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "shop_price": "40000", + "grand_exchange_price": "38200", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,69,50,-4,0,0,0,0,0,-1,0,70,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "2503,0,2504,0", + "requirements": "{0,40}", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1320", + "name": "Rune 2h sword", + "tradeable": "true", + "grand_exchange_price": "38200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1321", + "name": "Bronze scimitar", + "examine": "A vicious, curved sword.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "40", + "grand_exchange_price": "13", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "1,7,-2,0,0,0,1,0,0,0,0,6,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1322", + "name": "Bronze scimitar", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1323", + "name": "Iron scimitar", + "examine": "A vicious, curved sword.", + "tradeable": "true", + "low_alchemy": "44", + "high_alchemy": "67", + "shop_price": "112", + "grand_exchange_price": "30", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "2,10,-2,0,0,0,1,0,0,0,0,9,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1324", + "name": "Iron scimitar", + "tradeable": "true", + "grand_exchange_price": "30", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1325", + "name": "Steel scimitar", + "examine": "A vicious, curved sword.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "shop_price": "400", + "grand_exchange_price": "101", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "3,15,-2,0,0,0,1,0,0,0,0,14,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "requirements": "{0,5}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1326", + "name": "Steel scimitar", + "tradeable": "true", + "grand_exchange_price": "101", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1327", + "name": "Black scimitar", + "examine": "A vicious, curved sword.", + "tradeable": "true", + "low_alchemy": "307", + "high_alchemy": "460", + "grand_exchange_price": "4498", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,19,-2,0,0,0,1,0,0,0,0,14,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "requirements": "{0,10}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1328", + "name": "Black scimitar", + "tradeable": "true", + "grand_exchange_price": "4498", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1329", + "name": "Mithril scimitar", + "examine": "A vicious, curved sword.", + "tradeable": "true", + "low_alchemy": "416", + "high_alchemy": "624", + "shop_price": "1040", + "grand_exchange_price": "469", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "5,21,-2,0,0,0,1,0,0,0,0,20,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "requirements": "{0,20}", + "weight": "1.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1330", + "name": "Mithril scimitar", + "tradeable": "true", + "grand_exchange_price": "469", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1331", + "name": "Adamant scimitar", + "examine": "A viciously curved sword", + "tradeable": "true", + "low_alchemy": "1024", + "high_alchemy": "1536", + "shop_price": "2304", + "grand_exchange_price": "1525", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "6,29,-2,0,0,0,1,0,0,0,0,28,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1332", + "name": "Adamant scimitar", + "tradeable": "true", + "grand_exchange_price": "1525", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1333", + "name": "Rune scimitar", + "examine": "A vicious, curved sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "10240", + "high_alchemy": "15360", + "grand_exchange_price": "15200", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "7,45,-2,0,0,0,1,0,0,0,0,44,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "requirements": "{0,40}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1334", + "name": "Rune scimitar", + "tradeable": "true", + "grand_exchange_price": "15200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1335", + "name": "Iron warhammer", + "examine": "I don't think it's intended for joinery.", + "tradeable": "true", + "low_alchemy": "89", + "high_alchemy": "134", + "shop_price": "224", + "grand_exchange_price": "20", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1430", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,11,-4,0,0,0,0,0,0,0,9,0,0,0", + "weapon_interface": "10", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "attack_audios": "2504,0,0,0", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1336", + "name": "Iron warhammer", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1337", + "name": "Bronze warhammer", + "examine": "I don't think it's intended for joinery.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "59", + "grand_exchange_price": "16", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1430", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,10,-4,0,0,0,0,0,0,0,8,0,0,0", + "weapon_interface": "10", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "attack_audios": "2504,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1338", + "name": "Bronze warhammer", + "tradeable": "true", + "grand_exchange_price": "16", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1339", + "name": "Steel warhammer", + "examine": "I don't think it's intended for joinery.", + "tradeable": "true", + "low_alchemy": "256", + "high_alchemy": "384", + "shop_price": "832", + "grand_exchange_price": "283", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1430", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,18,-4,0,0,0,0,0,0,0,16,0,0,0", + "weapon_interface": "10", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "attack_audios": "2504,0,0,0", + "requirements": "{0,5}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1340", + "name": "Steel warhammer", + "tradeable": "true", + "grand_exchange_price": "283", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1341", + "name": "Black warhammer", + "examine": "I don't think it's intended for joinery.", + "tradeable": "true", + "low_alchemy": "509", + "high_alchemy": "764", + "shop_price": "1274", + "grand_exchange_price": "562", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1430", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,22,-4,0,0,0,0,0,0,0,19,0,0,0", + "weapon_interface": "10", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "attack_audios": "2504,0,0,0", + "requirements": "{0,10}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1342", + "name": "Black warhammer", + "tradeable": "true", + "grand_exchange_price": "562", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1343", + "name": "Mithril warhammer", + "examine": "I don't think it's intended for joinery.", + "tradeable": "true", + "low_alchemy": "863", + "high_alchemy": "1294", + "shop_price": "2158", + "grand_exchange_price": "1071", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1430", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,25,-4,0,0,0,0,0,0,0,20,0,0,0", + "weapon_interface": "10", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "attack_audios": "2504,0,0,0", + "requirements": "{0,20}", + "weight": "1.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1344", + "name": "Mithril warhammer", + "tradeable": "true", + "grand_exchange_price": "1071", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1345", + "name": "Adamant warhammer", + "examine": "I don't think it's intended for joinery.", + "tradeable": "true", + "low_alchemy": "2142", + "high_alchemy": "3213", + "shop_price": "5356", + "grand_exchange_price": "2996", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1430", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,33,-4,0,0,0,0,0,0,0,31,0,0,0", + "weapon_interface": "10", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "attack_audios": "2504,0,0,0", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1346", + "name": "Adamant warhammer", + "tradeable": "true", + "grand_exchange_price": "2996", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1347", + "name": "Rune warhammer", + "examine": "I don't think it's intended for joinery.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16600", + "high_alchemy": "24900", + "shop_price": "41000", + "grand_exchange_price": "24600", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1430", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,53,-4,0,0,0,0,0,0,0,48,0,0,0", + "weapon_interface": "10", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "attack_audios": "2504,0,0,0", + "requirements": "{0,40}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1348", + "name": "Rune warhammer", + "tradeable": "true", + "grand_exchange_price": "24600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1349", + "name": "Iron axe", + "examine": "A woodcutter's hatchet.", + "tradeable": "true", + "low_alchemy": "22", + "high_alchemy": "33", + "shop_price": "56", + "grand_exchange_price": "8", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-2,5,3,0,0,0,1,0,0,0,0,7,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1350", + "name": "Iron axe", + "tradeable": "true", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1351", + "name": "Bronze axe", + "examine": "A woodcutter's hatchet.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "20", + "grand_exchange_price": "44", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-2,4,2,0,0,0,1,0,0,0,0,5,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "weight": "1.35", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1352", + "name": "Bronze axe", + "tradeable": "true", + "grand_exchange_price": "44", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1353", + "name": "Steel axe", + "examine": "A woodcutter's hatchet.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "36", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-2,8,6,0,0,0,1,0,0,0,0,9,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,5}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1354", + "name": "Steel axe", + "tradeable": "true", + "grand_exchange_price": "36", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1355", + "name": "Mithril axe", + "examine": "A powerful hatchet.", + "tradeable": "true", + "low_alchemy": "208", + "high_alchemy": "312", + "shop_price": "660", + "grand_exchange_price": "141", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-2,12,10,0,0,0,1,0,0,0,0,13,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,20}", + "weight": "1.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1356", + "name": "Mithril axe", + "tradeable": "true", + "grand_exchange_price": "141", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1357", + "name": "Adamant axe", + "examine": "A powerful hatchet.", + "tradeable": "true", + "low_alchemy": "512", + "high_alchemy": "768", + "shop_price": "1625", + "grand_exchange_price": "592", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-2,17,15,0,0,0,1,0,0,0,0,19,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,30}-{8,31}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1358", + "name": "Adamant axe", + "tradeable": "true", + "grand_exchange_price": "592", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1359", + "name": "Rune axe", + "examine": "A powerful hatchet.", + "tradeable": "true", + "low_alchemy": "5120", + "high_alchemy": "7680", + "grand_exchange_price": "7495", + "render_anim": "2586", + "equipment_slot": "3", + "bonuses": "-2,26,24,0,0,0,1,0,0,0,0,29,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,40}-{8,41}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1360", + "name": "Rune axe", + "tradeable": "true", + "grand_exchange_price": "7495", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1361", + "name": "Black axe", + "examine": "A sinister looking hatchet.", + "tradeable": "true", + "low_alchemy": "153", + "high_alchemy": "230", + "grand_exchange_price": "335", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-2,10,8,0,0,0,1,0,0,0,0,12,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,10}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1362", + "name": "Black axe", + "tradeable": "true", + "grand_exchange_price": "335", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1363", + "name": "Iron battleaxe", + "examine": "A vicious looking axe.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "109", + "shop_price": "182", + "grand_exchange_price": "21", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,8,5,0,0,0,0,0,0,-1,0,13,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1364", + "name": "Iron battleaxe", + "tradeable": "true", + "grand_exchange_price": "21", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1365", + "name": "Steel battleaxe", + "examine": "A vicious looking axe.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "shop_price": "650", + "grand_exchange_price": "208", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,16,11,0,0,0,0,0,0,-1,0,20,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,5}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1366", + "name": "Steel battleaxe", + "tradeable": "true", + "grand_exchange_price": "208", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1367", + "name": "Black battleaxe", + "examine": "A vicious looking axe.", + "tradeable": "true", + "low_alchemy": "499", + "high_alchemy": "748", + "shop_price": "1248", + "grand_exchange_price": "556", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,20,15,0,0,0,0,0,0,-1,0,24,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,10}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1368", + "name": "Black battleaxe", + "tradeable": "true", + "grand_exchange_price": "556", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1369", + "name": "Mithril battleaxe", + "examine": "A vicious looking axe.", + "tradeable": "true", + "low_alchemy": "676", + "high_alchemy": "1014", + "shop_price": "1690", + "grand_exchange_price": "809", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,22,17,0,0,0,0,0,0,-1,0,29,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,20}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1370", + "name": "Mithril battleaxe", + "tradeable": "true", + "grand_exchange_price": "809", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1371", + "name": "Adamant battleaxe", + "examine": "A vicious looking axe.", + "tradeable": "true", + "low_alchemy": "1664", + "high_alchemy": "2496", + "shop_price": "4160", + "grand_exchange_price": "2311", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,31,26,0,0,0,0,0,0,-1,0,41,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,30}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1372", + "name": "Adamant battleaxe", + "tradeable": "true", + "grand_exchange_price": "2311", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1373", + "name": "Rune battleaxe", + "examine": "A vicious looking axe.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16640", + "high_alchemy": "24960", + "grand_exchange_price": "24800", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,48,43,0,0,0,0,0,0,-1,0,64,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,40}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1374", + "name": "Rune battleaxe", + "tradeable": "true", + "grand_exchange_price": "24800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1375", + "name": "Bronze battleaxe", + "examine": "A vicious looking axe.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "31", + "shop_price": "52", + "grand_exchange_price": "15", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,6,3,0,0,0,0,0,0,-1,0,9,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1376", + "name": "Bronze battleaxe", + "tradeable": "true", + "grand_exchange_price": "15", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1377", + "name": "Dragon battleaxe", + "examine": "A vicious looking axe.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80000", + "high_alchemy": "120000", + "shop_price": "200000", + "grand_exchange_price": "123200", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,70,65,0,0,0,0,0,0,-1,0,85,0,0,0", + "weapon_interface": "2", + "has_special": "true", + "attack_anims": "395,395,401,395", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "2.7", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1378", + "name": "Dragon battleaxe", + "tradeable": "true", + "grand_exchange_price": "123200", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "2.7", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1379", + "name": "Staff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "15", + "grand_exchange_price": "37", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1380", + "name": "Staff", + "tradeable": "true", + "grand_exchange_price": "37", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1381", + "name": "Staff of air", + "examine": "A Magical staff.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "1500", + "grand_exchange_price": "784", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,10,0,2,3,1,10,0,0,3,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1382", + "name": "Staff of air", + "tradeable": "true", + "grand_exchange_price": "784", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1383", + "name": "Staff of water", + "examine": "A Magical staff.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "1500", + "grand_exchange_price": "890", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,10,0,2,3,1,10,0,0,3,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1384", + "name": "Staff of water", + "tradeable": "true", + "grand_exchange_price": "890", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1385", + "name": "Staff of earth", + "examine": "A Magical staff.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "1500", + "grand_exchange_price": "879", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "1,-1,9,10,0,2,3,1,10,0,0,5,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1386", + "name": "Staff of earth", + "tradeable": "true", + "grand_exchange_price": "879", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1387", + "name": "Staff of fire", + "examine": "A Magical staff.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "1500", + "grand_exchange_price": "1330", + "stand_anim": "809", + "stand_turn_anim": "1209", + "walk_anim": "1146", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "3,-1,9,10,0,2,3,1,10,0,0,6,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1388", + "name": "Staff of fire", + "tradeable": "true", + "grand_exchange_price": "1330", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1389", + "name": "Magic staff", + "examine": "A Magical staff.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "58", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "2,-1,10,10,0,2,3,1,10,0,0,7,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1390", + "name": "Magic staff", + "tradeable": "true", + "grand_exchange_price": "58", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1391", + "name": "Battlestaff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "shop_price": "7000", + "grand_exchange_price": "7963", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,30}-{6,30}", + "weight": "2.25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1392", + "name": "Battlestaff", + "tradeable": "true", + "grand_exchange_price": "7963", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1393", + "name": "Fire battlestaff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "6200", + "high_alchemy": "9300", + "shop_price": "19600", + "grand_exchange_price": "9113", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,30}-{6,30}", + "weight": "2.25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1394", + "name": "Fire battlestaff", + "tradeable": "true", + "grand_exchange_price": "9113", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1395", + "name": "Water battlestaff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "6200", + "high_alchemy": "9300", + "grand_exchange_price": "9122", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,30}-{6,30}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1396", + "name": "Water battlestaff", + "tradeable": "true", + "grand_exchange_price": "9122", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1397", + "name": "Air battlestaff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "6200", + "high_alchemy": "9300", + "shop_price": "7000", + "grand_exchange_price": "8982", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,30}-{6,30}", + "weight": "2.25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1398", + "name": "Air battlestaff", + "tradeable": "true", + "grand_exchange_price": "8982", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1399", + "name": "Earth battlestaff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "6200", + "high_alchemy": "9300", + "shop_price": "1500", + "grand_exchange_price": "9041", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,30}-{6,30}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1400", + "name": "Earth battlestaff", + "tradeable": "true", + "grand_exchange_price": "9041", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1401", + "name": "Mystic fire staff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "17000", + "high_alchemy": "25500", + "grand_exchange_price": "25400", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,40}-{6,40}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1402", + "name": "Mystic fire staff", + "tradeable": "true", + "grand_exchange_price": "25400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1403", + "name": "Mystic water staff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "17000", + "high_alchemy": "25500", + "grand_exchange_price": "24800", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,40}-{6,40}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1404", + "name": "Mystic water staff", + "tradeable": "true", + "grand_exchange_price": "24800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1405", + "name": "Mystic air staff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "17000", + "high_alchemy": "25500", + "grand_exchange_price": "25100", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,40}-{6,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1406", + "name": "Mystic air staff", + "tradeable": "true", + "grand_exchange_price": "25100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1407", + "name": "Mystic earth staff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "17000", + "high_alchemy": "25500", + "shop_price": "40000", + "grand_exchange_price": "25400", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,40}-{6,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1408", + "name": "Mystic earth staff", + "tradeable": "true", + "grand_exchange_price": "25400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1409", + "name": "Iban's staff", + "examine": "An ancient staff, formerly the property of Iban.", + "low_alchemy": "17000", + "high_alchemy": "25500", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1410", + "name": "Iban's staff", + "examine": "An ancient staff, formerly the property of Iban.", + "low_alchemy": "17000", + "high_alchemy": "25500", + "attack_speed": "5", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1412", + "name": "Farmer's fork", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1413", + "name": "Halberd", + "attack_speed": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1414", + "name": "Halberd", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1415", + "name": "Warhammer", + "attack_speed": "6", + "attack_audios": "2504,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1416", + "name": "Warhammer", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1417", + "name": "Javelin", + "attack_speed": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1418", + "name": "Javelin", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1419", + "name": "Scythe", + "examine": "It's a Scythe.", + "stand_anim": "847", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1383", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "3,8,3,0,0,0,3,1,0,0,0,10,0,0,0", + "weapon_interface": "22", + "two_handed": "true", + "attack_anims": "382,382,382,382", + "defence_anim": "383", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1420", + "name": "Iron mace", + "examine": "A spiky mace.", + "tradeable": "true", + "low_alchemy": "25", + "high_alchemy": "37", + "shop_price": "80", + "grand_exchange_price": "7", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "4,-2,9,0,0,0,0,0,0,0,0,7,1,0,0", + "weapon_interface": "8", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1421", + "name": "Iron mace", + "tradeable": "true", + "grand_exchange_price": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1422", + "name": "Bronze mace", + "examine": "A spiky mace.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "shop_price": "18", + "grand_exchange_price": "12", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "1,-2,6,0,0,0,0,0,0,0,0,5,1,0,0", + "weapon_interface": "8", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "weight": "1.79", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1423", + "name": "Bronze mace", + "tradeable": "true", + "grand_exchange_price": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1424", + "name": "Steel mace", + "examine": "A spiky mace.", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "shop_price": "225", + "grand_exchange_price": "31", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-2,13,0,0,0,0,0,0,0,0,11,2,0,0", + "weapon_interface": "8", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "requirements": "{0,5}", + "weight": "1.79", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1425", + "name": "Steel mace", + "tradeable": "true", + "grand_exchange_price": "31", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1426", + "name": "Black mace", + "examine": "A spiky mace.", + "tradeable": "true", + "low_alchemy": "172", + "high_alchemy": "258", + "grand_exchange_price": "954", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,-2,16,0,0,0,0,0,0,0,0,13,2,0,0", + "weapon_interface": "8", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "requirements": "{0,10}", + "weight": "1.79", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1427", + "name": "Black mace", + "tradeable": "true", + "grand_exchange_price": "954", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1428", + "name": "Mithril mace", + "examine": "A spiky mace.", + "tradeable": "true", + "low_alchemy": "234", + "high_alchemy": "351", + "shop_price": "585", + "grand_exchange_price": "157", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "11,-2,18,0,0,0,0,0,0,0,0,16,3,0,0", + "weapon_interface": "8", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "requirements": "{0,20}", + "weight": "1.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1429", + "name": "Mithril mace", + "tradeable": "true", + "grand_exchange_price": "157", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1430", + "name": "Adamant mace", + "examine": "A spiky mace.", + "tradeable": "true", + "low_alchemy": "576", + "high_alchemy": "864", + "shop_price": "1440", + "grand_exchange_price": "673", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "13,-2,25,0,0,0,0,0,0,0,0,23,3,0,0", + "weapon_interface": "8", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1431", + "name": "Adamant mace", + "tradeable": "true", + "grand_exchange_price": "673", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1432", + "name": "Rune mace", + "examine": "A spiky mace.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "5760", + "high_alchemy": "8640", + "shop_price": "14400", + "grand_exchange_price": "8380", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "20,-2,39,0,0,0,0,0,0,0,0,36,4,0,0", + "weapon_interface": "8", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "requirements": "{0,40}", + "weight": "1.79", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1433", + "name": "Rune mace", + "tradeable": "true", + "grand_exchange_price": "8380", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1434", + "name": "Dragon mace", + "examine": "A spiky mace.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "50000", + "grand_exchange_price": "29300", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "40,-2,60,0,0,0,0,0,0,0,0,55,5,0,0", + "weapon_interface": "8", + "has_special": "true", + "attack_anims": "401,401,400,401", + "defence_anim": "403", + "requirements": "{0,60}", + "weight": "1.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1435", + "name": "Dragon mace", + "tradeable": "true", + "grand_exchange_price": "29300", + "requirements": "{0,60}", + "weight": "1.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1436", + "name": "Rune essence", + "examine": "An uncharged Rune Stone.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "1", + "grand_exchange_price": "40", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1437", + "name": "Rune essence", + "tradeable": "true", + "grand_exchange_price": "40", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1438", + "name": "Air talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "50", + "grand_exchange_price": "404", + "weight": "1", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1439", + "name": "Air talisman", + "tradeable": "true", + "grand_exchange_price": "404", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1440", + "name": "Earth talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "50", + "grand_exchange_price": "785", + "requirements": "{9,20}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1441", + "name": "Earth talisman", + "tradeable": "true", + "grand_exchange_price": "785", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1442", + "name": "Fire talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "50", + "grand_exchange_price": "4140", + "requirements": "{14,20}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1443", + "name": "Fire talisman", + "tradeable": "true", + "grand_exchange_price": "4140", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1444", + "name": "Water talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "50", + "grand_exchange_price": "7975", + "requirements": "{5,20}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1445", + "name": "Water talisman", + "tradeable": "true", + "grand_exchange_price": "7975", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1446", + "name": "Body talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "50", + "grand_exchange_price": "1373", + "requirements": "{20,20}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1447", + "name": "Body talisman", + "tradeable": "true", + "grand_exchange_price": "1373", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1448", + "name": "Mind talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "50", + "grand_exchange_price": "285", + "requirements": "{2,20}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1449", + "name": "Mind talisman", + "tradeable": "true", + "grand_exchange_price": "285", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1450", + "name": "Blood talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "3178", + "requirements": "{20,77}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1451", + "name": "Blood talisman", + "tradeable": "true", + "grand_exchange_price": "3178", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1452", + "name": "Chaos talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "125", + "grand_exchange_price": "605", + "requirements": "{20,35}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1453", + "name": "Chaos talisman", + "tradeable": "true", + "grand_exchange_price": "605", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1454", + "name": "Cosmic talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "125", + "grand_exchange_price": "785", + "requirements": "{20,27}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1455", + "name": "Cosmic talisman", + "tradeable": "true", + "grand_exchange_price": "785", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1456", + "name": "Death talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "2501", + "requirements": "{20,65}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1457", + "name": "Death talisman", + "tradeable": "true", + "grand_exchange_price": "2501", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1458", + "name": "Law talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "125", + "grand_exchange_price": "1219", + "requirements": "{20,54}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1459", + "name": "Law talisman", + "tradeable": "true", + "grand_exchange_price": "1219", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1461", + "name": "Soul talisman", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1462", + "name": "Nature talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "125", + "grand_exchange_price": "1596", + "requirements": "{20,44}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1463", + "name": "Nature talisman", + "tradeable": "true", + "grand_exchange_price": "1596", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1464", + "name": "Archery ticket", + "examine": "I can exchange this for equipment.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "9", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1465", + "name": "Weapon poison", + "examine": "For use on daggers and projectiles.", + "tradeable": "true", + "low_alchemy": "57", + "high_alchemy": "86", + "grand_exchange_price": "36", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1467", + "name": "Damp sticks", + "examine": "Some damp wooden sticks.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1468", + "name": "Dry sticks", + "examine": "Some dry wooden sticks.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1469", + "name": "Broken glass", + "examine": "Smashed glass.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1470", + "name": "Red bead", + "examine": "A small round red bead.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "169", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1471", + "name": "Red bead", + "tradeable": "true", + "grand_exchange_price": "169", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1472", + "name": "Yellow bead", + "examine": "A small round yellow bead.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "249", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1473", + "name": "Yellow bead", + "tradeable": "true", + "grand_exchange_price": "249", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1474", + "name": "Black bead", + "examine": "A small round black bead.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "229", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1475", + "name": "Black bead", + "tradeable": "true", + "grand_exchange_price": "229", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1476", + "name": "White bead", + "examine": "A small round white bead.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "1530", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1477", + "name": "White bead", + "tradeable": "true", + "grand_exchange_price": "1530", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1478", + "name": "Amulet of accuracy", + "examine": "Wizard Mizgog sells these aim-enhancing amulets.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "1000", + "grand_exchange_price": "2870", + "equipment_slot": "2", + "bonuses": "4,4,4,4,4,0,0,0,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1479", + "name": "Amulet of accuracy", + "tradeable": "true", + "grand_exchange_price": "2870", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1481", + "name": "Orb of light", + "examine": "A magical sphere that glimmers within.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1482", + "name": "Orb of light", + "examine": "A magical sphere that glimmers within.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1483", + "name": "Orb of light", + "examine": "A magical sphere that glimmers within.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1484", + "name": "Orb of light", + "examine": "A magical sphere that glimmers within.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1485", + "name": "Damp cloth", + "examine": "A damp, wet cloth.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1486", + "name": "Piece of railing", + "examine": "A broken piece of railing.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1487", + "name": "Unicorn horn", + "examine": "This horn has restorative properties.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "1159", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1488", + "name": "Paladin's badge", + "examine": "A coat of arms of the Ardougne Paladins.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1489", + "name": "Paladin's badge", + "examine": "A coat of arms of the Ardougne Paladins.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1490", + "name": "Paladin's badge", + "examine": "A coat of arms of the Ardougne Paladins.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1491", + "name": "Witch's cat", + "examine": "On the ground: Curiosity has yet to kill this one...", + "weight": "1.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1492", + "name": "Doll of iban", + "examine": "A simple doll with Iban's likeness.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1493", + "name": "Old journal", + "examine": "An account of the last times of someone.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1494", + "name": "History of iban", + "examine": "The tale of Iban.", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1495", + "name": "Klank's gauntlets", + "examine": "Strong dwarvish gloves.", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5000", + "equipment_slot": "9", + "bonuses": "2,2,2,0,0,8,9,7,0,0,5,2,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1496", + "name": "Iban's dove", + "examine": "I thought you only saw these in pairs?", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1497", + "name": "Amulet of othanian", + "examine": "A mystical demonic amulet.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1498", + "name": "Amulet of doomion", + "examine": "A mystical demonic amulet.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1499", + "name": "Amulet of holthion", + "examine": "A mystical demonic amulet.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1500", + "name": "Iban's shadow", + "examine": "A strange dark liquid.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1501", + "name": "Dwarf brew", + "examine": "Smells stronger than most spirits.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1502", + "name": "Iban's ashes", + "examine": "The burnt remains of Iban.", + "weight": "0.056", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1503", + "name": "Warrant", + "examine": "A search warrant for a house in West Ardougne.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1504", + "name": "Hangover cure", + "examine": "It doesn't look very tasty.", + "high_alchemy": "1", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1505", + "name": "A magic scroll", + "examine": "Maybe I should read this...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1506", + "name": "Gas mask", + "examine": "Stops me from breathing nasty stuff!", + "high_alchemy": "1", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1507", + "name": "A small key", + "examine": "Quite a small key (Plague City).", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1508", + "name": "A scruffy note", + "examine": "It seems to say \"hongorer lure\"...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1510", + "name": "Picture", + "examine": "A picture of a lady called Elena.", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1511", + "name": "Logs", + "examine": "A number of wooden logs.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "279", + "weight": "2", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1512", + "name": "Logs", + "tradeable": "true", + "grand_exchange_price": "279", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1513", + "name": "Magic logs", + "examine": "Logs cut from a magic tree.", + "tradeable": "true", + "low_alchemy": "128", + "high_alchemy": "192", + "grand_exchange_price": "1581", + "weight": "2", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1514", + "name": "Magic logs", + "tradeable": "true", + "grand_exchange_price": "1581", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1515", + "name": "Yew logs", + "examine": "Logs cut from a yew tree.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "grand_exchange_price": "532", + "weight": "2", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1516", + "name": "Yew logs", + "tradeable": "true", + "grand_exchange_price": "532", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1517", + "name": "Maple logs", + "examine": "Logs cut from a maple tree.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "20", + "weight": "2", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1518", + "name": "Maple logs", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1519", + "name": "Willow logs", + "examine": "Logs cut from a willow tree.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "11", + "weight": "2", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1520", + "name": "Willow logs", + "tradeable": "true", + "grand_exchange_price": "11", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1521", + "name": "Oak logs", + "examine": "Logs cut from an Oak Tree.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "153", + "weight": "2", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1522", + "name": "Oak logs", + "tradeable": "true", + "grand_exchange_price": "153", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1523", + "name": "Lockpick", + "examine": "For picking tough locks.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "1311", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1524", + "name": "Lockpick", + "tradeable": "true", + "grand_exchange_price": "1311", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1525", + "name": "Grimy snake weed", + "examine": "I need to clean this herb before I can use it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1526", + "name": "Clean snake weed", + "examine": "A fresh herb.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1527", + "name": "Grimy ardrigal", + "examine": "I need to clean this herb before I can use it.", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1528", + "name": "Clean ardrigal", + "examine": "A fresh herb.", + "low_alchemy": "2", + "high_alchemy": "3", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1529", + "name": "Grimy sito foil", + "examine": "I need to clean this herb before I can use it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1530", + "name": "Clean sito foil", + "examine": "A fresh herb.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1531", + "name": "Grimy volencia moss", + "examine": "I need to clean this herb before I can use it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1532", + "name": "Clean volencia moss", + "examine": "A fresh herb.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1533", + "name": "Grimy rogue's purse", + "examine": "I need to clean this herb before I can use it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1534", + "name": "Clean rogue's purse", + "examine": "A fresh herb.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1535", + "name": "Map part", + "examine": "A piece of map.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1536", + "name": "Map part", + "examine": "A piece of map.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1537", + "name": "Map part", + "examine": "A piece of map.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1538", + "name": "Crandor map", + "examine": "A map of the route to Crandor.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1539", + "name": "Steel nails", + "examine": "Keeps things in place fairly permanently.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "31", + "shop_price": "52", + "grand_exchange_price": "59", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1540", + "name": "Anti-dragon shield", + "examine": "This provides partial protection from dragon-breath attacks.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "637", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,7,9,8,2,8,0,0,0,0,0", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1541", + "name": "Anti-dragon shield", + "tradeable": "true", + "grand_exchange_price": "637", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1542", + "name": "Maze key", + "examine": "A key to Melzar's Maze.", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1549", + "name": "Stake", + "examine": "A very pointy stick.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from Dr Harlow in the Blue Moon Inn of Varrock.", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1550", + "name": "Garlic", + "examine": "Deters vampires.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1551", + "name": "Garlic", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1552", + "name": "Doogle sardine", + "examine": "Sardine flavoured with doogle leaves.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1555", + "name": "Pet kitten", + "examine": "This kitten seems to like you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1556", + "name": "Pet kitten", + "examine": "This kitten seems to like you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1557", + "name": "Pet kitten", + "examine": "This kitten seems to like you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1558", + "name": "Pet kitten", + "examine": "This kitten seems to like you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1559", + "name": "Pet kitten", + "examine": "This kitten seems to like you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1560", + "name": "Pet kitten", + "examine": "This kitten seems to like you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1561", + "name": "Pet cat", + "examine": "This cat definitely likes you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1562", + "name": "Pet cat", + "examine": "This cat definitely likes you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1563", + "name": "Pet cat", + "examine": "This cat definitely likes you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1564", + "name": "Pet cat", + "examine": "This cat definitely likes you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1565", + "name": "Pet cat", + "examine": "This cat definitely likes you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1566", + "name": "Pet cat", + "examine": "This cat definitely likes you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1567", + "name": "Overgrown cat", + "examine": "This cat is so well fed it can hardly move.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1568", + "name": "Overgrown cat", + "examine": "This cat is so well fed it can hardly move.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1569", + "name": "Overgrown cat", + "examine": "This cat is so well fed it can hardly move.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1570", + "name": "Overgrown cat", + "examine": "This cat is so well fed it can hardly move.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1571", + "name": "Overgrown cat", + "examine": "This cat is so well fed it can hardly move.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1572", + "name": "Overgrown cat", + "examine": "This cat is so well fed it can hardly move.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1573", + "name": "Doogle leaves", + "examine": "A tasty herb good for seasoning.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1575", + "name": "Cat training medal", + "examine": "For feline training expertise.", + "low_alchemy": "140", + "high_alchemy": "210", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1577", + "name": "Pete's candlestick", + "examine": "Candlestick used during Heroes' Quest.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1578", + "name": "Pete's candlestick", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1579", + "name": "Thieves' armband", + "examine": "This denotes a Master Thief.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1580", + "name": "Ice gloves", + "examine": "These will keep my hands cold!", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,3,4,0,2,2,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1581", + "name": "Blamish snail slime", + "examine": "Yuck.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1582", + "name": "Blamish oil", + "examine": "Made from the finest snail slime.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1583", + "name": "Fire feather", + "examine": "Firebird feather.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1584", + "name": "Id papers", + "examine": "Apparently my name is Hartigan", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1585", + "name": "Oily fishing rod", + "examine": "Useful for catching lava eels.", + "low_alchemy": "6", + "high_alchemy": "9", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1586", + "name": "Miscellaneous key", + "examine": "This is of use in completing Heroes' Quest. (Heroes' Quest)", + "tradeable": "true", + "weight": "0.01", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1587", + "name": "Miscellaneous key", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1588", + "name": "Grips' key ring", + "examine": "The key I got from Grip. (Heroes' Quest)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1590", + "name": "Dusty key", + "examine": "I wonder what this unlocks. (Heroes' Quest)", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1591", + "name": "Jail key", + "examine": "Key to a cell. (Heroes' Quest)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1592", + "name": "Ring mould", + "examine": "Used to make gold rings.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "316", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1593", + "name": "Ring mould", + "tradeable": "true", + "grand_exchange_price": "316", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1594", + "name": "Unholy mould", + "examine": "Used to make unholy symbols.", + "low_alchemy": "80", + "high_alchemy": "120", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1595", + "name": "Amulet mould", + "examine": "Used to make gold amulets.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "288", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1596", + "name": "Amulet mould", + "tradeable": "true", + "grand_exchange_price": "288", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1597", + "name": "Necklace mould", + "examine": "Used to make gold necklaces.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "269", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1598", + "name": "Necklace mould", + "tradeable": "true", + "grand_exchange_price": "269", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1599", + "name": "Holy mould", + "examine": "Used to make holy symbols of Saradomin.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "504", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1600", + "name": "Holy mould", + "tradeable": "true", + "grand_exchange_price": "504", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1601", + "name": "Diamond", + "examine": "This looks valuable.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "14800", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1602", + "name": "Diamond", + "tradeable": "true", + "grand_exchange_price": "14800", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1603", + "name": "Ruby", + "examine": "This looks valuable.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "400", + "grand_exchange_price": "1598", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1604", + "name": "Ruby", + "tradeable": "true", + "grand_exchange_price": "1598", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1605", + "name": "Emerald", + "examine": "This looks valuable.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "350", + "grand_exchange_price": "853", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1606", + "name": "Emerald", + "tradeable": "true", + "grand_exchange_price": "853", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1607", + "name": "Sapphire", + "examine": "This looks valuable.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "175", + "grand_exchange_price": "520", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1608", + "name": "Sapphire", + "tradeable": "true", + "grand_exchange_price": "520", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1609", + "name": "Opal", + "examine": "A semi precious stone.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "41", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1610", + "name": "Opal", + "tradeable": "true", + "grand_exchange_price": "41", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1611", + "name": "Jade", + "grand_exchange_price": "83", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1612", + "name": "Jade", + "tradeable": "true", + "grand_exchange_price": "83", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1613", + "name": "Red topaz", + "examine": "A semi precious stone.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "103", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1614", + "name": "Red topaz", + "tradeable": "true", + "grand_exchange_price": "103", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1615", + "name": "Dragonstone", + "examine": "This looks valuable.", + "tradeable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "75000", + "grand_exchange_price": "27400", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1616", + "name": "Dragonstone", + "tradeable": "true", + "grand_exchange_price": "27400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1617", + "name": "Uncut diamond", + "examine": "An uncut diamond.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "20000", + "ge_buy_limit": "500", + "tokkul_price": "300", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1618", + "name": "Uncut diamond", + "tradeable": "true", + "grand_exchange_price": "20000", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1619", + "name": "Uncut ruby", + "examine": "An uncut ruby.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "4970", + "ge_buy_limit": "1000", + "tokkul_price": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1620", + "name": "Uncut ruby", + "tradeable": "true", + "grand_exchange_price": "4970", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1621", + "name": "Uncut emerald", + "examine": "An uncut emerald.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "2621", + "ge_buy_limit": "1000", + "tokkul_price": "75", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1622", + "name": "Uncut emerald", + "tradeable": "true", + "grand_exchange_price": "2621", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1623", + "name": "Uncut sapphire", + "examine": "An uncut sapphire.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "25", + "grand_exchange_price": "1851", + "ge_buy_limit": "1000", + "tokkul_price": "37", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1624", + "name": "Uncut sapphire", + "tradeable": "true", + "grand_exchange_price": "1851", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1625", + "name": "Uncut opal", + "examine": "An uncut opal.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "65", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1626", + "name": "Uncut opal", + "tradeable": "true", + "grand_exchange_price": "65", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1627", + "name": "Uncut jade", + "examine": "An uncut jade.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "138", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1628", + "name": "Uncut jade", + "tradeable": "true", + "grand_exchange_price": "138", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1629", + "name": "Uncut red topaz", + "examine": "An uncut red topaz.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "279", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1630", + "name": "Uncut red topaz", + "tradeable": "true", + "grand_exchange_price": "279", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1631", + "name": "Uncut dragonstone", + "examine": "An uncut dragonstone.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "75000", + "grand_exchange_price": "31700", + "weight": "0.3", + "ge_buy_limit": "100", + "tokkul_price": "1500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1632", + "name": "Uncut dragonstone", + "tradeable": "true", + "grand_exchange_price": "31700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1633", + "name": "Crushed gem", + "examine": "This gem is crushed and broken.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1634", + "name": "Crushed gem", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1635", + "name": "Gold ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "destroy": "true", + "grand_exchange_price": "165", + "equipment_slot": "12", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1636", + "name": "Gold ring", + "tradeable": "true", + "grand_exchange_price": "165", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1637", + "name": "Sapphire ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "grand_exchange_price": "561", + "equipment_slot": "12", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1638", + "name": "Sapphire ring", + "tradeable": "true", + "grand_exchange_price": "561", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1639", + "name": "Emerald ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "grand_exchange_price": "884", + "equipment_slot": "12", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1640", + "name": "Emerald ring", + "tradeable": "true", + "grand_exchange_price": "884", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1641", + "name": "Ruby ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "810", + "high_alchemy": "1215", + "shop_price": "2025", + "grand_exchange_price": "1110", + "equipment_slot": "12", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1642", + "name": "Ruby ring", + "tradeable": "true", + "grand_exchange_price": "1110", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1643", + "name": "Diamond ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "1410", + "high_alchemy": "2115", + "shop_price": "3172", + "grand_exchange_price": "4416", + "equipment_slot": "12", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1644", + "name": "Diamond ring", + "tradeable": "true", + "grand_exchange_price": "4416", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1645", + "name": "Dragonstone ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "shop_price": "7750", + "grand_exchange_price": "26700", + "equipment_slot": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1646", + "name": "Dragonstone ring", + "tradeable": "true", + "grand_exchange_price": "26700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1649", + "name": "Sapphire ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "grand_exchange_price": "547", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1650", + "name": "Emerald ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "grand_exchange_price": "993", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1651", + "name": "Ruby ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "810", + "high_alchemy": "1215", + "shop_price": "2025", + "grand_exchange_price": "1125", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1652", + "name": "Diamond ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "1410", + "high_alchemy": "2115", + "shop_price": "3172", + "grand_exchange_price": "3622", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1653", + "name": "Dragonstone ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "shop_price": "7750", + "grand_exchange_price": "19606", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1654", + "name": "Gold necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "180", + "high_alchemy": "270", + "shop_price": "450", + "grand_exchange_price": "185", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1655", + "name": "Gold necklace", + "tradeable": "true", + "grand_exchange_price": "185", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1656", + "name": "Sapphire necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "945", + "grand_exchange_price": "534", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1657", + "name": "Sapphire necklace", + "tradeable": "true", + "grand_exchange_price": "534", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1658", + "name": "Emerald necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "570", + "high_alchemy": "855", + "shop_price": "1425", + "grand_exchange_price": "781", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1659", + "name": "Emerald necklace", + "tradeable": "true", + "grand_exchange_price": "781", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1660", + "name": "Ruby necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "870", + "high_alchemy": "1305", + "shop_price": "870", + "grand_exchange_price": "1276", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1661", + "name": "Ruby necklace", + "tradeable": "true", + "grand_exchange_price": "1276", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1662", + "name": "Diamond necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "1470", + "high_alchemy": "2205", + "shop_price": "3307", + "grand_exchange_price": "14300", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1663", + "name": "Diamond necklace", + "tradeable": "true", + "grand_exchange_price": "14300", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1664", + "name": "Dragon necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "7350", + "high_alchemy": "11025", + "grand_exchange_price": "26000", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1665", + "name": "Dragon necklace", + "tradeable": "true", + "grand_exchange_price": "26000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1668", + "name": "Sapphire necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "945", + "grand_exchange_price": "532", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1669", + "name": "Emerald necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "570", + "high_alchemy": "855", + "shop_price": "1425", + "grand_exchange_price": "741", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1670", + "name": "Ruby necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "870", + "high_alchemy": "1305", + "shop_price": "870", + "grand_exchange_price": "1194", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1671", + "name": "Diamond necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "1470", + "high_alchemy": "2205", + "shop_price": "3307", + "grand_exchange_price": "9795", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1672", + "name": "Dragon necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "7350", + "high_alchemy": "11025", + "grand_exchange_price": "23010", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1673", + "name": "Gold amulet", + "examine": "A plain gold amulet.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "shop_price": "350", + "grand_exchange_price": "172", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1674", + "name": "Gold amulet", + "tradeable": "true", + "grand_exchange_price": "172", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1675", + "name": "Sapphire amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "810", + "grand_exchange_price": "473", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1676", + "name": "Sapphire amulet", + "tradeable": "true", + "grand_exchange_price": "473", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1677", + "name": "Emerald amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "1147", + "grand_exchange_price": "695", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1678", + "name": "Emerald amulet", + "tradeable": "true", + "grand_exchange_price": "695", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1679", + "name": "Ruby amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "810", + "high_alchemy": "1215", + "destroy": "true", + "shop_price": "2025", + "grand_exchange_price": "1268", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1680", + "name": "Ruby amulet", + "tradeable": "true", + "grand_exchange_price": "1268", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1681", + "name": "Diamond amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "1410", + "high_alchemy": "2115", + "shop_price": "3307", + "grand_exchange_price": "3359", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1682", + "name": "Diamond amulet", + "tradeable": "true", + "grand_exchange_price": "3359", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1683", + "name": "Dragonstone ammy", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "26900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1684", + "name": "Dragonstone ammy", + "tradeable": "true", + "grand_exchange_price": "26900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1687", + "name": "Sapphire amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "810", + "grand_exchange_price": "417", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1688", + "name": "Emerald amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "1147", + "grand_exchange_price": "648", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1689", + "name": "Ruby amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "810", + "high_alchemy": "1215", + "destroy": "true", + "shop_price": "2025", + "grand_exchange_price": "1098", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1690", + "name": "Diamond amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "1410", + "high_alchemy": "2115", + "shop_price": "3307", + "grand_exchange_price": "1993", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1691", + "name": "Dragonstone ammy", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "18436", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1692", + "name": "Gold amulet", + "examine": "A plain gold amulet.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "shop_price": "350", + "grand_exchange_price": "137", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1693", + "name": "Gold amulet", + "tradeable": "true", + "grand_exchange_price": "137", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1694", + "name": "Sapphire amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "810", + "grand_exchange_price": "435", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1695", + "name": "Sapphire amulet", + "tradeable": "true", + "grand_exchange_price": "435", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1696", + "name": "Emerald amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "1147", + "grand_exchange_price": "659", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1697", + "name": "Emerald amulet", + "tradeable": "true", + "grand_exchange_price": "659", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1698", + "name": "Ruby amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "810", + "high_alchemy": "1215", + "destroy": "true", + "shop_price": "2025", + "grand_exchange_price": "1115", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1699", + "name": "Ruby amulet", + "tradeable": "true", + "grand_exchange_price": "1115", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1700", + "name": "Diamond amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "1410", + "high_alchemy": "2115", + "shop_price": "3307", + "grand_exchange_price": "2706", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1701", + "name": "Diamond amulet", + "tradeable": "true", + "grand_exchange_price": "2706", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1702", + "name": "Dragonstone ammy", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "27100", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1703", + "name": "Dragonstone ammy", + "tradeable": "true", + "grand_exchange_price": "27100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1704", + "name": "Amulet of glory", + "examine": "Uncharged: A very powerful dragonstone amulet. 1-4 charges: A dragonstone amulet with X magic charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "28000", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1705", + "name": "Amulet of glory", + "tradeable": "true", + "grand_exchange_price": "28000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1706", + "name": "Amulet of glory(1)", + "examine": "Uncharged: A very powerful dragonstone amulet. 1-4 charges: A dragonstone amulet with X magic charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "1", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1707", + "name": "Amulet of glory(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1708", + "name": "Amulet of glory(2)", + "examine": "Uncharged: A very powerful dragonstone amulet. 1-4 charges: A dragonstone amulet with X magic charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "1", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1709", + "name": "Amulet of glory(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1710", + "name": "Amulet of glory(3)", + "examine": "Uncharged: A very powerful dragonstone amulet. 1-4 charges: A dragonstone amulet with X magic charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "1", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1711", + "name": "Amulet of glory(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1712", + "name": "Amulet of glory(4)", + "examine": "Uncharged: A very powerful dragonstone amulet. 1-4 charges: A dragonstone amulet with X magic charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "29300", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1713", + "name": "Amulet of glory(4)", + "tradeable": "true", + "grand_exchange_price": "29300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1714", + "name": "Unstrung symbol", + "examine": "It needs a string so I can wear it.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "83", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1715", + "name": "Unstrung symbol", + "tradeable": "true", + "grand_exchange_price": "83", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1716", + "name": "Unblessed symbol", + "examine": "A symbol of Saradomin.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "120", + "grand_exchange_price": "29", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1717", + "name": "Unblessed symbol", + "tradeable": "true", + "grand_exchange_price": "29", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1718", + "name": "Holy symbol", + "examine": "A blessed holy symbol of Saradomin.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "88", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,2,2,2,2,2,3,0,8,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1719", + "name": "Holy symbol", + "tradeable": "true", + "grand_exchange_price": "88", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1720", + "name": "Unstrung emblem", + "examine": "It needs a string so I can wear it.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "178", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1721", + "name": "Unstrung emblem", + "tradeable": "true", + "grand_exchange_price": "178", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1722", + "name": "Unpowered symbol", + "examine": "An unholy symbol of Zamorak.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "120", + "grand_exchange_price": "24", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1723", + "name": "Unpowered symbol", + "tradeable": "true", + "grand_exchange_price": "24", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1724", + "name": "Unholy symbol", + "examine": "An unholy symbol of Zamorak.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "135", + "grand_exchange_price": "57", + "equipment_slot": "2", + "bonuses": "2,2,2,2,2,0,0,0,0,0,0,0,8,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1725", + "name": "Amulet of strength", + "examine": "An enchanted ruby amulet.", + "tradeable": "true", + "low_alchemy": "810", + "high_alchemy": "1215", + "grand_exchange_price": "1247", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,10,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1726", + "name": "Amulet of strength", + "tradeable": "true", + "grand_exchange_price": "1247", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1727", + "name": "Amulet of magic", + "examine": "An enchanted sapphire amulet of magic.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "900", + "grand_exchange_price": "519", + "equipment_slot": "2", + "bonuses": "0,0,0,10,0,0,0,0,0,0,0,0,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1728", + "name": "Amulet of magic", + "tradeable": "true", + "grand_exchange_price": "519", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1729", + "name": "Amulet of defence", + "examine": "An enchanted emerald amulet of protection.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "1275", + "grand_exchange_price": "721", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,7,7,7,7,7,7,0,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1730", + "name": "Amulet of defence", + "tradeable": "true", + "grand_exchange_price": "721", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1731", + "name": "Amulet of power", + "examine": "An enchanted diamond amulet of power.", + "tradeable": "true", + "low_alchemy": "1410", + "high_alchemy": "2115", + "shop_price": "3525", + "grand_exchange_price": "2573", + "equipment_slot": "2", + "bonuses": "6,6,6,6,6,6,6,6,6,6,6,6,1,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1732", + "name": "Amulet of power", + "tradeable": "true", + "grand_exchange_price": "2573", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1733", + "name": "Needle", + "examine": "Used with a thread to make clothes.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "5", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1734", + "name": "Thread", + "examine": "Use with a needle to make clothes.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1735", + "name": "Shears", + "examine": "For shearing sheep.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "76", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1736", + "name": "Shears", + "tradeable": "true", + "grand_exchange_price": "76", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1737", + "name": "Wool", + "examine": "I think this came from a sheep.", + "tradeable": "true", + "grand_exchange_price": "160", + "weight": "0.14", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1738", + "name": "Wool", + "tradeable": "true", + "grand_exchange_price": "160", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1739", + "name": "Cowhide", + "examine": "I should take this to the tannery.", + "tradeable": "true", + "grand_exchange_price": "516", + "weight": "2.7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1740", + "name": "Cowhide", + "tradeable": "true", + "grand_exchange_price": "516", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1741", + "name": "Leather", + "examine": "It's a piece of leather.", + "tradeable": "true", + "grand_exchange_price": "638", + "weight": "2.25", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1742", + "name": "Leather", + "tradeable": "true", + "grand_exchange_price": "638", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1743", + "name": "Hard leather", + "examine": "It's a piece of hard leather.", + "tradeable": "true", + "grand_exchange_price": "640", + "weight": "3.1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1744", + "name": "Hard leather", + "tradeable": "true", + "grand_exchange_price": "640", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1745", + "name": "Green d-leather", + "examine": "It's a piece of prepared green dragon hide.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "2237", + "weight": "3.1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1746", + "name": "Green d-leather", + "tradeable": "true", + "grand_exchange_price": "2237", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1747", + "name": "Black dragonhide", + "examine": "The scaly rough hide from a Black Dragon.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "5802", + "weight": "3.1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1748", + "name": "Black dragonhide", + "tradeable": "true", + "grand_exchange_price": "5802", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1749", + "name": "Red dragonhide", + "examine": "The scaly rough hide from a red dragon.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "3539", + "weight": "3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1750", + "name": "Red dragonhide", + "tradeable": "true", + "grand_exchange_price": "3539", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1751", + "name": "Blue dragonhide", + "examine": "The scaly rough hide from a blue dragon.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "2473", + "weight": "3.1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1752", + "name": "Blue dragonhide", + "tradeable": "true", + "grand_exchange_price": "2473", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1753", + "name": "Green dragonhide", + "examine": "The scaly rough hide from a green dragon.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "1933", + "weight": "3.1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1754", + "name": "Green dragonhide", + "tradeable": "true", + "grand_exchange_price": "1933", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1755", + "name": "Chisel", + "examine": "Good for detailed crafting.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "20", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1756", + "name": "Chisel", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1757", + "name": "Brown apron", + "examine": "A mostly clean apron.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "74", + "equipment_slot": "4", + "weight": "0.45", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1758", + "name": "Brown apron", + "tradeable": "true", + "grand_exchange_price": "74", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1759", + "name": "Ball of wool", + "examine": "Spun from sheeps' wool.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "115", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1760", + "name": "Ball of wool", + "tradeable": "true", + "grand_exchange_price": "115", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1761", + "name": "Soft clay", + "examine": "Clay soft enough to mould.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "487", + "weight": "0.9", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1762", + "name": "Soft clay", + "tradeable": "true", + "grand_exchange_price": "487", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1763", + "name": "Red dye", + "examine": "A little bottle of red dye.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "1374", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1764", + "name": "Red dye", + "tradeable": "true", + "grand_exchange_price": "1374", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1765", + "name": "Yellow dye", + "examine": "A little bottle of yellow dye.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "549", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1766", + "name": "Yellow dye", + "tradeable": "true", + "grand_exchange_price": "549", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1767", + "name": "Blue dye", + "examine": "A little bottle of blue dye", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "642", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1768", + "name": "Blue dye", + "tradeable": "true", + "grand_exchange_price": "642", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1769", + "name": "Orange dye", + "examine": "A little bottle of orange dye.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "1258", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1770", + "name": "Orange dye", + "tradeable": "true", + "grand_exchange_price": "1258", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1771", + "name": "Green dye", + "examine": "A little bottle of green dye.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "503", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1772", + "name": "Green dye", + "tradeable": "true", + "grand_exchange_price": "503", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1773", + "name": "Purple dye", + "examine": "A little bottle of purple dye.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "288", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1774", + "name": "Purple dye", + "tradeable": "true", + "grand_exchange_price": "288", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1775", + "name": "Molten glass", + "examine": "Hot glass ready to be blown into useful objects.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "924", + "weight": "0.9", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1776", + "name": "Molten glass", + "tradeable": "true", + "grand_exchange_price": "924", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1777", + "name": "Bow string", + "examine": "I need a bow stave to attach this to.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "223", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1778", + "name": "Bow string", + "tradeable": "true", + "grand_exchange_price": "223", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1779", + "name": "Flax", + "examine": "A plant cultivated for fibres (ground); I should use this with a spinning wheel (item).", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "73", + "grand_exchange_price": "73", + "weight": "0.4", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1780", + "name": "Flax", + "tradeable": "true", + "grand_exchange_price": "73", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1781", + "name": "Soda ash", + "examine": "One of the ingredients for making glass.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "575", + "weight": "0.09", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1782", + "name": "Soda ash", + "tradeable": "true", + "grand_exchange_price": "575", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1783", + "name": "Bucket of sand", + "examine": "One of the ingredients for making glass.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "265", + "weight": "2.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1784", + "name": "Bucket of sand", + "tradeable": "true", + "grand_exchange_price": "265", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1785", + "name": "Glassblowing pipe", + "examine": "Used to form molten glass into useful items.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "5", + "grand_exchange_price": "195", + "weight": "0.05", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1786", + "name": "Glassblowing pipe", + "tradeable": "true", + "grand_exchange_price": "195", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1787", + "name": "Unfired pot", + "examine": "I need to put this in a pottery oven.", + "tradeable": "true", + "grand_exchange_price": "53", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1788", + "name": "Unfired pot", + "tradeable": "true", + "grand_exchange_price": "53", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1789", + "name": "Unfired pie dish", + "examine": "I need to put this in a pottery oven.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "96", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1790", + "name": "Unfired pie dish", + "tradeable": "true", + "grand_exchange_price": "96", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1791", + "name": "Unfired bowl", + "examine": "I need to put this in a pottery oven.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "32", + "grand_exchange_price": "194", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1792", + "name": "Unfired bowl", + "tradeable": "true", + "grand_exchange_price": "194", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1793", + "name": "Woad leaf", + "examine": "A slightly bluish leaf.", + "tradeable": "true", + "shop_price": "15", + "grand_exchange_price": "57", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1794", + "name": "Bronze wire", + "examine": "Useful for crafting items.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "249", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1795", + "name": "Bronze wire", + "tradeable": "true", + "grand_exchange_price": "249", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1796", + "name": "Silver necklace", + "examine": "Anna's shiny silver coated necklace.", + "equipment_slot": "2", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1797", + "name": "Silver necklace", + "examine": "Anna's shiny silver coated necklace.", + "equipment_slot": "2", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1798", + "name": "Silver cup", + "examine": "Bob's shiny silver coated tea cup.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1799", + "name": "Silver cup", + "examine": "Bob's shiny silver coated tea cup.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1800", + "name": "Silver bottle", + "examine": "Carol's shiny silver coated bottle.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1801", + "name": "Silver bottle", + "examine": "Carol's shiny silver coated bottle.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1802", + "name": "Silver book", + "examine": "David's shiny silver coated book.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1803", + "name": "Silver book", + "examine": "David's shiny silver coated book.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1804", + "name": "Silver needle", + "examine": "Elizabeth's shiny silver coated needle.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1805", + "name": "Silver needle", + "examine": "Elizabeth's shiny silver coated needle.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1806", + "name": "Silver pot", + "examine": "Frank's shiny silver coated pot.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1807", + "name": "Silver pot", + "examine": "Frank's shiny silver coated pot.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1808", + "name": "Criminal's thread", + "examine": "Some (colour) thread found at the murder scene.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1809", + "name": "Criminal's thread", + "examine": "Some (colour) thread found at the murder scene.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1810", + "name": "Criminal's thread", + "examine": "Some (colour) thread found at the murder scene.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1811", + "name": "Flypaper", + "examine": "A piece of fly paper. It's sticky.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1812", + "name": "Pungent pot", + "examine": "A pot found at the murder scene, with a sickly odour.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1813", + "name": "Criminal's dagger", + "examine": "A flimsy-looking dagger found at the crime scene./A flimsy looking dagger found at the crime scene coated with a thin layer of flour.", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1814", + "name": "Criminal's dagger", + "examine": "A flimsy-looking dagger found at the crime scene./A flimsy looking dagger found at the crime scene coated with a thin layer of flour.", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1815", + "name": "Killer's print", + "examine": "The fingerprints of the murderer.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1816", + "name": "Anna's print", + "examine": "An imprint of Anna's fingerprint.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1817", + "name": "Bob's print", + "examine": "An imprint of Bob's fingerprint.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1818", + "name": "Carol's print", + "examine": "An imprint of Carol's fingerprint.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1819", + "name": "David's print", + "examine": "An imprint of David's fingerprint.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1820", + "name": "Elizabeth's print", + "examine": "An imprint of Elizabeth's fingerprint.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1821", + "name": "Frank's print", + "examine": "An imprint of Frank's fingerprint.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1822", + "name": "Unknown print", + "examine": "An unidentified fingerprint taken from the murder weapon.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1823", + "name": "Waterskin(4)", + "examine": "A full waterskin with four portions of water.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "184", + "weight": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1824", + "name": "Waterskin(4)", + "tradeable": "true", + "grand_exchange_price": "184", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1825", + "name": "Waterskin(3)", + "examine": "A nearly full waterskin with three portions of water.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "4", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1826", + "name": "Waterskin(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1827", + "name": "Waterskin(2)", + "examine": "A half empty waterskin with two portions of water.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "4", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1828", + "name": "Waterskin(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1829", + "name": "Waterskin(1)", + "examine": "A nearly empty waterskin with one portion of water.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "4", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1830", + "name": "Waterskin(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1831", + "name": "Waterskin(0)", + "examine": "A completely empty waterskin - you'll need to fill it up.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "93", + "weight": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1832", + "name": "Waterskin(0)", + "tradeable": "true", + "grand_exchange_price": "93", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1833", + "name": "Desert shirt", + "examine": "A cool, light desert shirt.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "40", + "grand_exchange_price": "93", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1834", + "name": "Desert shirt", + "tradeable": "true", + "grand_exchange_price": "93", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1835", + "name": "Desert robe", + "examine": "A cool, light desert robe.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "40", + "grand_exchange_price": "74", + "equipment_slot": "7", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1836", + "name": "Desert robe", + "tradeable": "true", + "grand_exchange_price": "74", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1837", + "name": "Desert boots", + "examine": "Comfortable desert shoes.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "257", + "equipment_slot": "10", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1838", + "name": "Desert boots", + "tradeable": "true", + "grand_exchange_price": "257", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1839", + "name": "Metal key", + "examine": "This key is crudely made. It came from the mining camp Mercenary Captain.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1840", + "name": "Cell door key", + "examine": "A metallic key, usually used by prison guards. (Tourist Trap)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1841", + "name": "Barrel", + "examine": "An empty barrel/A Splendid barrel.", + "tradeable": "true", + "grand_exchange_price": "206", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1842", + "name": "Ana in a barrel", + "examine": "Inventory: A mining barrel with Ana in it.While in the mine cart: It's Ana... in a barrel... in a mine cart.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1843", + "name": "Wrought iron key", + "examine": "This key unlocks a very sturdy gate. Ana gave me this key. (Tourist Trap)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1844", + "name": "Slave shirt", + "examine": "A filthy, smelly, flea infested shirt.", + "low_alchemy": "16", + "high_alchemy": "24", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1845", + "name": "Slave robe", + "examine": "A filthy, smelly, flea infested robe.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "7", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1846", + "name": "Slave boots", + "examine": "A set of filthy, smelly, flea infested desert slave boots.", + "equipment_slot": "10", + "weight": "0.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1847", + "name": "Scrumpled paper", + "examine": "A piece of paper with barely legible writing - looks like a recipe!", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1848", + "name": "Shantay disclaimer", + "examine": "Very important information.", + "high_alchemy": "1", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1849", + "name": "Prototype dart", + "examine": "A prototype throwing dart.", + "destroy": "true", + "tradeable": "false", + "attack_audios": "2547,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1850", + "name": "Technical plans", + "examine": "Plans of a technical nature.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1851", + "name": "Tenti pineapple", + "examine": "The most delicious of pineapples.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1852", + "name": "Bedabin key", + "examine": "A key to the chest in Captain Siad's room.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1853", + "name": "Prototype dart tip", + "examine": "A protoype dart tip - it looks deadly.", + "destroy": "true", + "tradeable": "false", + "attack_audios": "2547,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1854", + "name": "Shantay pass", + "examine": "Allows you to pass through the Shantay pass into the Kharid Desert.", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1856", + "name": "Guide book", + "examine": "A Tourist's Guide to Ardougne.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1857", + "name": "Totem", + "examine": "The Rantuki tribe's totem.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1858", + "name": "Address label", + "examine": "It says 'To Lord Handelmort, Handelmort Mansion'.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1859", + "name": "Raw ugthanki meat", + "examine": "I need to cook this first / Freshly cooked ugthanki meat.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "486", + "weight": "0.75", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1860", + "name": "Raw ugthanki meat", + "tradeable": "true", + "grand_exchange_price": "486", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1861", + "name": "Ugthanki meat", + "examine": "I need to cook this first / Freshly cooked ugthanki meat.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "687", + "weight": "0.75", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1862", + "name": "Ugthanki meat", + "tradeable": "true", + "grand_exchange_price": "687", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1863", + "name": "Pitta dough", + "examine": "I need to cook this.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "9", + "grand_exchange_price": "90", + "weight": "0.14", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1864", + "name": "Pitta dough", + "tradeable": "true", + "grand_exchange_price": "90", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1865", + "name": "Pitta bread", + "examine": "Nicely baked pitta bread. Needs more ingredients to make a kebab.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "22", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1866", + "name": "Pitta bread", + "tradeable": "true", + "grand_exchange_price": "22", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1868", + "name": "Burnt pitta bread", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1869", + "name": "Chopped tomato", + "examine": "A mixture of tomatoes in a bowl.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "90", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1870", + "name": "Chopped tomato", + "tradeable": "true", + "grand_exchange_price": "90", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1871", + "name": "Chopped onion", + "examine": "A mixture of onions in a bowl.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "142", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1872", + "name": "Chopped onion", + "tradeable": "true", + "grand_exchange_price": "142", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1873", + "name": "Chopped ugthanki", + "examine": "Strips of ugthanki meat in a bowl.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "348", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1874", + "name": "Chopped ugthanki", + "tradeable": "true", + "grand_exchange_price": "348", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1875", + "name": "Onion & tomato", + "examine": "A mixture of chopped onions and tomatoes in a bowl", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "31", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1876", + "name": "Onion & tomato", + "tradeable": "true", + "grand_exchange_price": "31", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1877", + "name": "Ugthanki & onion", + "examine": "A mixture of chopped onions and ugthanki meat in a bowl.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "26", + "grand_exchange_price": "330", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1878", + "name": "Ugthanki & onion", + "tradeable": "true", + "grand_exchange_price": "330", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1879", + "name": "Ugthanki & tomato", + "examine": "A mixture of chopped tomatoes and ugthanki meat in a bowl.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "grand_exchange_price": "331", + "weight": "0.25", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1880", + "name": "Ugthanki & tomato", + "tradeable": "true", + "grand_exchange_price": "331", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1881", + "name": "Kebab mix", + "examine": "A mixture of chopped tomatoes, onions and ugthanki meat in a bowl", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "5", + "grand_exchange_price": "412", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1882", + "name": "Kebab mix", + "tradeable": "true", + "grand_exchange_price": "412", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1883", + "name": "Ugthanki kebab", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "2027", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1884", + "name": "Ugthanki kebab", + "tradeable": "true", + "grand_exchange_price": "2027", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1885", + "name": "Ugthanki kebab", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "1499", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1886", + "name": "Ugthanki kebab", + "tradeable": "true", + "grand_exchange_price": "1499", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1887", + "name": "Cake tin", + "examine": "Useful for baking cakes.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "20", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1888", + "name": "Cake tin", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1889", + "name": "Uncooked cake", + "examine": "Now all I need to do is cook it.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "559", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1890", + "name": "Uncooked cake", + "tradeable": "true", + "grand_exchange_price": "559", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1891", + "name": "Cake", + "examine": "A plain sponge cake.", + "tradeable": "true", + "shop_price": "50", + "grand_exchange_price": "155", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1892", + "name": "Cake", + "tradeable": "true", + "grand_exchange_price": "155", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1893", + "name": "2/3 cake", + "examine": "A plain sponge cake.", + "tradeable": "true", + "shop_price": "50", + "grand_exchange_price": "39", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1894", + "name": "2/3 cake", + "tradeable": "true", + "grand_exchange_price": "39", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1895", + "name": "Slice of cake", + "examine": "A plain sponge cake.", + "tradeable": "true", + "shop_price": "50", + "grand_exchange_price": "32", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1896", + "name": "Slice of cake", + "tradeable": "true", + "grand_exchange_price": "32", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1897", + "name": "Chocolate cake", + "examine": "This looks very tasty.", + "tradeable": "true", + "grand_exchange_price": "416", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1898", + "name": "Chocolate cake", + "tradeable": "true", + "grand_exchange_price": "416", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1899", + "name": "2/3 chocolate cake", + "examine": "This looks very tasty.", + "tradeable": "true", + "grand_exchange_price": "181", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1900", + "name": "2/3 chocolate cake", + "tradeable": "true", + "grand_exchange_price": "181", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1901", + "name": "Chocolate slice", + "examine": "This looks very tasty.", + "tradeable": "true", + "grand_exchange_price": "13", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1902", + "name": "Chocolate slice", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1904", + "name": "Burnt cake", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1905", + "name": "Asgarnian ale", + "examine": "Probably the finest readily-available ale in Asgarnia.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "190", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1906", + "name": "Asgarnian ale", + "tradeable": "true", + "grand_exchange_price": "190", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1907", + "name": "Wizard's mind bomb", + "examine": "It's got strange bubbles in it.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "171", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1908", + "name": "Wizard's mind bomb", + "tradeable": "true", + "grand_exchange_price": "171", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1909", + "name": "Greenman's ale", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "828", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1910", + "name": "Greenman's ale", + "tradeable": "true", + "grand_exchange_price": "828", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1911", + "name": "Dragon bitter", + "examine": "A glass of bitter.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "487", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1912", + "name": "Dragon bitter", + "tradeable": "true", + "grand_exchange_price": "487", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1913", + "name": "Dwarven stout", + "examine": "A pint of thick dark beer.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "212", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1914", + "name": "Dwarven stout", + "tradeable": "true", + "grand_exchange_price": "212", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1915", + "name": "Grog", + "examine": "A murky glass full of your average, everyday pirate slosh.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "19", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1916", + "name": "Grog", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1917", + "name": "Beer", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "202", + "equipment_slot": "3", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1918", + "name": "Beer", + "tradeable": "true", + "grand_exchange_price": "202", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1919", + "name": "Beer glass", + "examine": "I need to fill this with beer.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "1", + "grand_exchange_price": "10", + "weight": "0.05", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1920", + "name": "Beer glass", + "tradeable": "true", + "grand_exchange_price": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1921", + "name": "Bowl of water", + "examine": "It's a bowl of water.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "97", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1922", + "name": "Bowl of water", + "tradeable": "true", + "grand_exchange_price": "97", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1923", + "name": "Bowl", + "examine": "Useful for mixing things.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "34", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1924", + "name": "Bowl", + "tradeable": "true", + "grand_exchange_price": "34", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1925", + "name": "Bucket", + "examine": "It's an empty bucket.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "30", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1926", + "name": "Bucket", + "tradeable": "true", + "grand_exchange_price": "30", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1927", + "name": "Bucket of milk", + "examine": "It's a bucket of milk.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "shop_price": "12", + "grand_exchange_price": "103", + "weight": "2.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1928", + "name": "Bucket of milk", + "tradeable": "true", + "grand_exchange_price": "103", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1929", + "name": "Bucket of water", + "examine": "Common bucket: It's a bucket of water.2008 Easter event: It's a bucket of water from the Easter Bunny's warren. Regular bucket filled from Braindeath Island: It's a bucket of... water?", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "72", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1930", + "name": "Bucket of water", + "tradeable": "true", + "grand_exchange_price": "72", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1931", + "name": "Empty pot", + "examine": "This pot is empty.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "6", + "weight": "0.45", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1932", + "name": "Empty pot", + "tradeable": "true", + "grand_exchange_price": "6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1933", + "name": "Pot of flour", + "examine": "There is flour in this pot.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "172", + "weight": "1.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1934", + "name": "Pot of flour", + "tradeable": "true", + "grand_exchange_price": "172", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1935", + "name": "Jug", + "examine": "This jug is empty.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "29", + "weight": "0.4", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1936", + "name": "Jug", + "tradeable": "true", + "grand_exchange_price": "29", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1937", + "name": "Jug of water", + "examine": "It's full of water.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "87", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1938", + "name": "Jug of water", + "tradeable": "true", + "grand_exchange_price": "87", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1939", + "name": "Swamp tar", + "examine": "A foul smelling thick tar like substance.", + "tradeable": "true", + "grand_exchange_price": "103", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1940", + "name": "Raw swamp paste", + "examine": "A tar-like substance mixed with flour and warmed.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "38", + "grand_exchange_price": "342", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1941", + "name": "Swamp paste", + "examine": "A tar-like substance mixed with flour and warmed.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "38", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1942", + "name": "Potato", + "examine": "This could be used to make a good stew.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "11", + "grand_exchange_price": "91", + "weight": "0.5", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1943", + "name": "Potato", + "tradeable": "true", + "grand_exchange_price": "91", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1944", + "name": "Egg", + "examine": "A nice fresh egg.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "1", + "grand_exchange_price": "99", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1945", + "name": "Egg", + "tradeable": "true", + "grand_exchange_price": "99", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1946", + "name": "Flour", + "examine": "There is flour in this pot.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "162", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1947", + "name": "Grain", + "examine": "Some wheat heads.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "7", + "weight": "0.6", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1948", + "name": "Grain", + "tradeable": "true", + "grand_exchange_price": "7", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1949", + "name": "Chef's hat", + "examine": "What a silly hat.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "233", + "equipment_slot": "0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1950", + "name": "Chef's hat", + "tradeable": "true", + "grand_exchange_price": "233", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1951", + "name": "Redberries", + "examine": "Very bright red berries.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "337", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1952", + "name": "Redberries", + "tradeable": "true", + "grand_exchange_price": "337", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1953", + "name": "Pastry dough", + "examine": "Potentially pastry.", + "tradeable": "true", + "grand_exchange_price": "433", + "weight": "0.16", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1954", + "name": "Pastry dough", + "tradeable": "true", + "grand_exchange_price": "433", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1955", + "name": "Cooking apple", + "examine": "Keeps the doctor away.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "36", + "grand_exchange_price": "353", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1956", + "name": "Cooking apple", + "tradeable": "true", + "grand_exchange_price": "353", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1957", + "name": "Onion", + "examine": "A strong smelling onion.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "shop_price": "12", + "grand_exchange_price": "8", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1958", + "name": "Onion", + "tradeable": "true", + "grand_exchange_price": "8", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1959", + "name": "Pumpkin", + "examine": "Happy Halloween.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "273600000", + "weight": "0.5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1960", + "name": "Pumpkin", + "tradeable": "true", + "grand_exchange_price": "273600000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1961", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "80400000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1962", + "name": "Easter egg", + "tradeable": "true", + "grand_exchange_price": "80400000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1963", + "name": "Banana", + "examine": "Mmm this looks tasty.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "263", + "equipment_slot": "3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1964", + "name": "Banana", + "tradeable": "true", + "grand_exchange_price": "263", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1965", + "name": "Cabbage", + "examine": "On ground: Cabbage... yuck!In inventory: Yuck, I don't like cabbage.", + "tradeable": "true", + "grand_exchange_price": "41", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1966", + "name": "Cabbage", + "tradeable": "true", + "grand_exchange_price": "41", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1967", + "name": "Cabbage", + "examine": "On ground: Cabbage... yuck!In inventory: Yuck, I don't like cabbage.", + "tradeable": "true", + "grand_exchange_price": "55", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1968", + "name": "Cabbage", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1969", + "name": "Spinach roll", + "examine": "A home made spinach thing.", + "shop_price": "1", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1971", + "name": "Kebab", + "examine": "A meaty kebab.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "1", + "grand_exchange_price": "97", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1972", + "name": "Kebab", + "tradeable": "true", + "grand_exchange_price": "97", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1973", + "name": "Chocolate bar", + "examine": "Mmmmmmm chocolate.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "295", + "equipment_slot": "5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1974", + "name": "Chocolate bar", + "tradeable": "true", + "grand_exchange_price": "295", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1975", + "name": "Chocolate dust", + "examine": "It's ground-up chocolate.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "370", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1976", + "name": "Chocolate dust", + "tradeable": "true", + "grand_exchange_price": "370", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1977", + "name": "Chocolatey milk", + "examine": "Milk with chocolate in it.", + "low_alchemy": "1", + "high_alchemy": "1", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1978", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1979", + "name": "Cup of tea", + "tradeable": "true", + "grand_exchange_price": "30", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1980", + "name": "Empty cup", + "examine": "An empty cup.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "1", + "grand_exchange_price": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1981", + "name": "Empty cup", + "tradeable": "true", + "grand_exchange_price": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1982", + "name": "Tomato", + "examine": "This would make good ketchup.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "25", + "grand_exchange_price": "159", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1983", + "name": "Tomato", + "tradeable": "true", + "grand_exchange_price": "159", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1984", + "name": "Rotten apple", + "examine": "Rotten to the core!", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1985", + "name": "Cheese", + "examine": "It's got holes in it.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "3", + "grand_exchange_price": "188", + "weight": "0.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1986", + "name": "Cheese", + "tradeable": "true", + "grand_exchange_price": "188", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1987", + "name": "Grapes", + "examine": "Good grapes for wine making.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "1510", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1988", + "name": "Grapes", + "tradeable": "true", + "grand_exchange_price": "1510", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1989", + "name": "Half full wine jug", + "examine": "An optimist would say it is half full.", + "tradeable": "true", + "grand_exchange_price": "227700000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1990", + "name": "Half full wine jug", + "tradeable": "true", + "grand_exchange_price": "227700000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1991", + "name": "Jug of bad wine", + "examine": "Oh dear, this wine is terrible!", + "high_alchemy": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1992", + "name": "Jug of bad wine", + "examine": "Oh dear, this wine is terrible!", + "high_alchemy": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1993", + "name": "Jug of wine", + "examine": "It's full of wine.", + "tradeable": "true", + "low_alchemy": "51", + "high_alchemy": "76", + "shop_price": "128", + "grand_exchange_price": "36", + "weight": "1.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1994", + "name": "Jug of wine", + "tradeable": "true", + "grand_exchange_price": "36", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1995", + "name": "Unfermented wine", + "examine": "This wine needs to ferment before it can be drunk.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1996", + "name": "Unfermented wine", + "examine": "This wine needs to ferment before it can be drunk.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1997", + "name": "Incomplete stew", + "grand_exchange_price": "177", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1998", + "name": "Incomplete stew", + "tradeable": "true", + "grand_exchange_price": "177", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "1999", + "name": "Incomplete stew", + "grand_exchange_price": "210", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2000", + "name": "Incomplete stew", + "tradeable": "true", + "grand_exchange_price": "210", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2001", + "name": "Uncooked stew", + "examine": "I need to cook this.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "1", + "grand_exchange_price": "600", + "weight": "1", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2002", + "name": "Uncooked stew", + "tradeable": "true", + "grand_exchange_price": "600", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2003", + "name": "Stew", + "examine": "It's a meat and potato stew.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "20", + "grand_exchange_price": "1133", + "weight": "1.5", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2004", + "name": "Stew", + "tradeable": "true", + "grand_exchange_price": "1133", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2006", + "name": "Burnt stew", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2007", + "name": "Spice", + "examine": "This could liven up an otherwise bland stew.", + "tradeable": "true", + "low_alchemy": "92", + "high_alchemy": "138", + "shop_price": "230", + "grand_exchange_price": "277", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2008", + "name": "Spice", + "tradeable": "true", + "grand_exchange_price": "277", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2009", + "name": "Uncooked curry", + "examine": "I need to cook this.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "1382", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2010", + "name": "Uncooked curry", + "tradeable": "true", + "grand_exchange_price": "1382", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2011", + "name": "Curry", + "examine": "It's a spicy hot curry.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "1001", + "weight": "1.5", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2012", + "name": "Curry", + "tradeable": "true", + "grand_exchange_price": "1001", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2014", + "name": "Burnt curry", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2015", + "name": "Vodka", + "examine": "An absolutely clear spirit sold by well-stocked bars.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "366", + "weight": "0.25", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2016", + "name": "Vodka", + "tradeable": "true", + "grand_exchange_price": "366", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2017", + "name": "Whisky", + "examine": "This Draynor malt is sold by well-stocked bars.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "68", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2018", + "name": "Whisky", + "tradeable": "true", + "grand_exchange_price": "68", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2019", + "name": "Gin", + "examine": "A strong spirit that tastes of Juniper; sold at well-stocked bars.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "2", + "grand_exchange_price": "184", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2020", + "name": "Gin", + "tradeable": "true", + "grand_exchange_price": "184", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2021", + "name": "Brandy", + "examine": "A strong spirit best served in a large glass.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "146", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2022", + "name": "Brandy", + "tradeable": "true", + "grand_exchange_price": "146", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2023", + "name": "Cocktail guide", + "examine": "A book on tree gnome cocktails.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "5", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2024", + "name": "Cocktail guide", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2025", + "name": "Cocktail shaker", + "examine": "Used for mixing cocktails.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2026", + "name": "Cocktail glass", + "examine": "For sipping cocktails.", + "tradeable": "true", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2027", + "name": "Cocktail glass", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2028", + "name": "Premade blurb' sp.", + "examine": "A premade Blurberry Special.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "70", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2029", + "name": "Premade blurb' sp.", + "tradeable": "true", + "grand_exchange_price": "70", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2030", + "name": "Premade choc s'dy", + "examine": "A premade Chocolate Saturday.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "13", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2031", + "name": "Premade choc s'dy", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2032", + "name": "Premade dr' dragon", + "examine": "A premade Drunk Dragon.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "34", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2033", + "name": "Premade dr' dragon", + "tradeable": "true", + "grand_exchange_price": "34", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2034", + "name": "Premade fr' blast", + "examine": "A premade Fruit Blast.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "48", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2035", + "name": "Premade fr' blast", + "tradeable": "true", + "grand_exchange_price": "48", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2036", + "name": "Premade p' punch", + "examine": "A premade Pineapple Punch.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "40", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2037", + "name": "Premade p' punch", + "tradeable": "true", + "grand_exchange_price": "40", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2038", + "name": "Premade sgg", + "examine": "A premade Short Green Guy.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "33", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2039", + "name": "Premade sgg", + "tradeable": "true", + "grand_exchange_price": "33", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2040", + "name": "Premade wiz blz'd", + "examine": "A Premade Wizard Blizzard.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "26", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2041", + "name": "Premade wiz blz'd", + "tradeable": "true", + "grand_exchange_price": "26", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2042", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2043", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2044", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2045", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2046", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2047", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2048", + "name": "Pineapple punch", + "examine": "A fresh healthy fruit mix.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "285", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2049", + "name": "Pineapple punch", + "tradeable": "true", + "grand_exchange_price": "285", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2050", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2051", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2052", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2053", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2054", + "name": "Wizard blizzard", + "examine": "This looks like a strange mix.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "774", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2055", + "name": "Wizard blizzard", + "tradeable": "true", + "grand_exchange_price": "774", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2056", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2057", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2058", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2059", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2060", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2061", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2062", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2063", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2064", + "name": "Blurberry special", + "examine": "Looks good... smells strong.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "5468", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2065", + "name": "Blurberry special", + "tradeable": "true", + "grand_exchange_price": "5468", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2066", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2067", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2068", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2069", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2070", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2071", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2072", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2073", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2074", + "name": "Choc saturday", + "examine": "A warm creamy alcoholic beverage", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "272", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2075", + "name": "Choc saturday", + "tradeable": "true", + "grand_exchange_price": "272", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2076", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2077", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2078", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2079", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2080", + "name": "Short green guy", + "examine": "A Short Green Guy... looks good.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "756", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2081", + "name": "Short green guy", + "tradeable": "true", + "grand_exchange_price": "756", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2082", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2083", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2084", + "name": "Fruit blast", + "examine": "A cool refreshing fruit mix.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "1802", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2085", + "name": "Fruit blast", + "tradeable": "true", + "grand_exchange_price": "1802", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2086", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2087", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2088", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2089", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2090", + "name": "Picture", + "examine": "This cocktail is just missing those little finishing touches.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2091", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2092", + "name": "Drunk dragon", + "examine": "A warm creamy alcoholic beverage", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "506", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2093", + "name": "Drunk dragon", + "tradeable": "true", + "grand_exchange_price": "506", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2094", + "name": "Picture", + "examine": "I'm not completely sure what this contains.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2095", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2096", + "name": "Picture", + "examine": "I'm not completely sure what this contains.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2097", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2098", + "name": "Picture", + "examine": "I'm not completely sure what this contains.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2099", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2100", + "name": "Picture", + "examine": "I'm not completely sure what this contains.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2101", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2102", + "name": "Lemon", + "examine": "A common fruit, popularly used in cocktails.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "86", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2103", + "name": "Lemon", + "tradeable": "true", + "grand_exchange_price": "86", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2104", + "name": "Lemon chunks", + "examine": "The not-too-surprising result of using a knife with a lemon!", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "29", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2105", + "name": "Lemon chunks", + "tradeable": "true", + "grand_exchange_price": "29", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2106", + "name": "Lemon slices", + "examine": "The not-too-surprising result of using a knife with a lemon!", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "16", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2107", + "name": "Lemon slices", + "tradeable": "true", + "grand_exchange_price": "16", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2108", + "name": "Orange", + "examine": "A common fruit.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "shop_price": "70", + "grand_exchange_price": "930", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2109", + "name": "Orange", + "tradeable": "true", + "grand_exchange_price": "930", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2110", + "name": "Orange chunks", + "examine": "Fresh chunks of orange.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "46", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2111", + "name": "Orange chunks", + "tradeable": "true", + "grand_exchange_price": "46", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2112", + "name": "Orange slices", + "examine": "Fresh orange slices.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "163", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2113", + "name": "Orange slices", + "tradeable": "true", + "grand_exchange_price": "163", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2114", + "name": "Pineapple", + "examine": "It can be cut up into something more manageable with a knife.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "45", + "weight": "0.15", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2115", + "name": "Pineapple", + "tradeable": "true", + "grand_exchange_price": "45", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2116", + "name": "Pineapple chunks", + "examine": "Fresh chunks of pineapple.", + "tradeable": "true", + "grand_exchange_price": "86", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2117", + "name": "Pineapple chunks", + "tradeable": "true", + "grand_exchange_price": "86", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2118", + "name": "Pineapple ring", + "examine": "The not-too-surprising result of using a knife with a pineapple!", + "tradeable": "true", + "grand_exchange_price": "25", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2119", + "name": "Pineapple ring", + "tradeable": "true", + "grand_exchange_price": "25", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2120", + "name": "Lime", + "examine": "A common fruit, popularly used in cocktails.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "78", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2121", + "name": "Lime", + "tradeable": "true", + "grand_exchange_price": "78", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2122", + "name": "Lime chunks", + "examine": "Fresh chunks of lime.", + "tradeable": "true", + "grand_exchange_price": "16", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2123", + "name": "Lime chunks", + "tradeable": "true", + "grand_exchange_price": "16", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2124", + "name": "Lime slices", + "examine": "The not-too-surprising result of using a knife with a lime!", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "25", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2125", + "name": "Lime slices", + "tradeable": "true", + "grand_exchange_price": "25", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2126", + "name": "Dwellberries", + "examine": "Some rather pretty blue berries picked from a dwellberry bush.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "10", + "grand_exchange_price": "144", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2127", + "name": "Dwellberries", + "tradeable": "true", + "grand_exchange_price": "144", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2128", + "name": "Equa leaves", + "examine": "A common ingredient in gnome cuisine.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "275", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2129", + "name": "Equa leaves", + "tradeable": "true", + "grand_exchange_price": "275", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2130", + "name": "Pot of cream", + "examine": "Fresh cream.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "11", + "shop_price": "2", + "grand_exchange_price": "58", + "weight": "0.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2131", + "name": "Pot of cream", + "tradeable": "true", + "grand_exchange_price": "58", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2132", + "name": "Raw beef", + "examine": "I need to cook this first.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "35", + "shop_price": "58", + "grand_exchange_price": "282", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2133", + "name": "Raw beef", + "tradeable": "true", + "grand_exchange_price": "282", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2134", + "name": "Raw rat meat", + "examine": "I need to cook this first.", + "tradeable": "true", + "low_alchemy": "15", + "high_alchemy": "23", + "shop_price": "1", + "grand_exchange_price": "85", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2135", + "name": "Raw rat meat", + "tradeable": "true", + "grand_exchange_price": "85", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2136", + "name": "Raw bear meat", + "examine": "I need to cook this first.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "307", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2137", + "name": "Raw bear meat", + "tradeable": "true", + "grand_exchange_price": "307", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2138", + "name": "Raw chicken", + "examine": "I need to cook this first.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "60", + "grand_exchange_price": "386", + "weight": "0.15", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2139", + "name": "Raw chicken", + "tradeable": "true", + "grand_exchange_price": "386", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2140", + "name": "Cooked chicken", + "examine": "Mmm this looks tasty.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "shop_price": "5", + "grand_exchange_price": "70", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2141", + "name": "Cooked chicken", + "tradeable": "true", + "grand_exchange_price": "70", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2142", + "name": "Cooked meat", + "examine": "Mmm this looks tasty.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "5", + "grand_exchange_price": "111", + "weight": "0.25", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2143", + "name": "Cooked meat", + "tradeable": "true", + "grand_exchange_price": "111", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2145", + "name": "Burnt chicken", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2146", + "name": "Burnt meat", + "examine": "Oh dear, it's totally burnt!", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2147", + "name": "Burnt meat", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2148", + "name": "Raw lava eel", + "examine": "A very strange eel.", + "low_alchemy": "60", + "high_alchemy": "90", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2149", + "name": "Lava eel", + "examine": "Strange, it looks cooler now it's been cooked.", + "low_alchemy": "60", + "high_alchemy": "90", + "weight": "0.15", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2150", + "name": "Swamp toad", + "examine": "A slippery little blighter.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "750", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2151", + "name": "Swamp toad", + "tradeable": "true", + "grand_exchange_price": "750", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2152", + "name": "Toad's legs", + "examine": "They're a gnome delicacy apparently.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "661", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2153", + "name": "Toad's legs", + "tradeable": "true", + "grand_exchange_price": "661", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2154", + "name": "Picture", + "examine": "They're a gnome delicacy apparently.", + "tradeable": "true", + "high_alchemy": "1", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2155", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2156", + "name": "Spicy toad's legs", + "examine": "They're a gnome delicacy apparently.", + "tradeable": "true", + "high_alchemy": "1", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2157", + "name": "Spicy toad's legs", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2158", + "name": "Seasoned legs", + "examine": "They're a gnome delicacy apparently.", + "tradeable": "true", + "high_alchemy": "1", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2159", + "name": "Seasoned legs", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2160", + "name": "Spicy worm", + "examine": "They're a gnome delicacy apparently.", + "tradeable": "true", + "high_alchemy": "1", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2161", + "name": "Spicy worm", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2162", + "name": "King worm", + "examine": "They're a gnome delicacy apparently.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "24", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2163", + "name": "King worm", + "tradeable": "true", + "grand_exchange_price": "24", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2164", + "name": "Batta tin", + "examine": "A deep tin used to make gnome battas in.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "1", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2165", + "name": "Crunchy tray", + "examine": "A shallow tray used to make crunchies in.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2166", + "name": "Gnomebowl mould", + "examine": "A large ovenproof bowl.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2167", + "name": "Gianne's cook book", + "examine": "Aluft Gianne's favourite dishes.", + "tradeable": "true", + "high_alchemy": "1", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2168", + "name": "Gianne's cook book", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2169", + "name": "Gnome spice", + "examine": "It's Aluft Gianne's secret mix of spices.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "28", + "weight": "0.14", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2170", + "name": "Gnome spice", + "tradeable": "true", + "grand_exchange_price": "28", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2171", + "name": "Gianne dough", + "examine": "It's made from a secret recipe.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "13", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2172", + "name": "Gianne dough", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2173", + "name": "Picture", + "examine": "This gnome bowl doesn't look very appetizing.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2174", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2176", + "name": "Burnt gnomebowl", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2177", + "name": "Half baked bowl", + "examine": "This gnomebowl is in the early stages of preparation.", + "high_alchemy": "1", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2178", + "name": "Raw gnomebowl", + "examine": "This gnomebowl needs cooking.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2179", + "name": "Picture", + "examine": "This unfinished XX needs YY.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2180", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2181", + "name": "Picture", + "examine": "This unfinished XX needs YY.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2182", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2183", + "name": "Picture", + "examine": "This unfinished XX needs YY.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2184", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2185", + "name": "Chocolate bomb", + "examine": "Full of creamy, chocolately goodness.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "450", + "grand_exchange_price": "4400", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2186", + "name": "Chocolate bomb", + "tradeable": "true", + "grand_exchange_price": "4400", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2187", + "name": "Tangled toads' legs", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "2321", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2188", + "name": "Tangled toads' legs", + "tradeable": "true", + "grand_exchange_price": "2321", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2189", + "name": "Picture", + "examine": "This unfinished XX needs YY.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2190", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2191", + "name": "Worm hole", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "454", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2192", + "name": "Worm hole", + "tradeable": "true", + "grand_exchange_price": "454", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2193", + "name": "Picture", + "examine": "This unfinished XX needs YY.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2194", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2195", + "name": "Veg ball", + "examine": "This looks pretty healthy.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "481", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2196", + "name": "Veg ball", + "tradeable": "true", + "grand_exchange_price": "481", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2197", + "name": "Odd crunchies", + "examine": "These crunchies don't look very appetising.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2198", + "name": "Odd crunchies", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2200", + "name": "Burnt crunchies", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2201", + "name": "Half baked crunchy", + "examine": "This crunchy is in the early stages of preparation.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2202", + "name": "Raw crunchies", + "examine": "These crunchies need cooking.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "163", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2203", + "name": "Picture", + "examine": "This XX crunchy needs garnishing with YY.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2204", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2205", + "name": "Worm crunchies", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "80", + "grand_exchange_price": "255", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2206", + "name": "Worm crunchies", + "tradeable": "true", + "grand_exchange_price": "255", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2207", + "name": "Picture", + "examine": "This XX crunchy needs garnishing with YY.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2208", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2209", + "name": "Chocchip crunchies", + "examine": "Yum... smells good.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "70", + "grand_exchange_price": "816", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2210", + "name": "Chocchip crunchies", + "tradeable": "true", + "grand_exchange_price": "816", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2211", + "name": "Picture", + "examine": "This XX crunchy needs garnishing with YY.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2212", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2213", + "name": "Spicy crunchies", + "examine": "Yum...smells spicy.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "70", + "grand_exchange_price": "101", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2214", + "name": "Spicy crunchies", + "tradeable": "true", + "grand_exchange_price": "101", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2215", + "name": "Picture", + "examine": "This XX crunchy needs garnishing with YY.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2216", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2217", + "name": "Toad crunchies", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1228", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2218", + "name": "Toad crunchies", + "tradeable": "true", + "grand_exchange_price": "1228", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2219", + "name": "Premade w'm batta", + "examine": "A premade Worm Batta.", + "tradeable": "true", + "low_alchemy": "78", + "high_alchemy": "117", + "grand_exchange_price": "130", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2220", + "name": "Premade w'm batta", + "tradeable": "true", + "grand_exchange_price": "130", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2221", + "name": "Premade t'd batta", + "examine": "A Premade Toad Batta.", + "tradeable": "true", + "low_alchemy": "78", + "high_alchemy": "117", + "grand_exchange_price": "127", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2222", + "name": "Premade t'd batta", + "tradeable": "true", + "grand_exchange_price": "127", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2223", + "name": "Premade c+t batta", + "examine": "A Premade Cheese and Tomato Batta.", + "tradeable": "true", + "low_alchemy": "78", + "high_alchemy": "117", + "grand_exchange_price": "137", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2224", + "name": "Premade c+t batta", + "tradeable": "true", + "grand_exchange_price": "137", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2225", + "name": "Premade fr't batta", + "examine": "A premade Fruit Batta.", + "tradeable": "true", + "low_alchemy": "78", + "high_alchemy": "117", + "grand_exchange_price": "131", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2226", + "name": "Premade fr't batta", + "tradeable": "true", + "grand_exchange_price": "131", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2227", + "name": "Premade veg batta", + "examine": "A Premade Vegetable Batta.", + "tradeable": "true", + "low_alchemy": "78", + "high_alchemy": "117", + "grand_exchange_price": "134", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2228", + "name": "Premade veg batta", + "tradeable": "true", + "grand_exchange_price": "134", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2229", + "name": "Premade choc bomb", + "examine": "A premade Chocolate Bomb.", + "tradeable": "true", + "low_alchemy": "180", + "high_alchemy": "270", + "grand_exchange_price": "1227", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2230", + "name": "Premade choc bomb", + "tradeable": "true", + "grand_exchange_price": "1227", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2231", + "name": "Premade ttl", + "examine": "A premade Tangled Toads Legs.", + "tradeable": "true", + "low_alchemy": "180", + "high_alchemy": "270", + "grand_exchange_price": "867", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2232", + "name": "Premade ttl", + "tradeable": "true", + "grand_exchange_price": "867", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2233", + "name": "Premade worm hole", + "examine": "A premade Worm Hole.", + "tradeable": "true", + "low_alchemy": "108", + "high_alchemy": "162", + "grand_exchange_price": "237", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2234", + "name": "Premade worm hole", + "tradeable": "true", + "grand_exchange_price": "237", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2235", + "name": "Premade veg ball", + "examine": "A premade Vegetable Ball.", + "tradeable": "true", + "low_alchemy": "108", + "high_alchemy": "162", + "grand_exchange_price": "233", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2236", + "name": "Premade veg ball", + "tradeable": "true", + "grand_exchange_price": "233", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2237", + "name": "Premade w'm crun", + "examine": "Some Premade Worm Crunchies.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "76", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2238", + "name": "Premade w'm crun", + "tradeable": "true", + "grand_exchange_price": "76", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2239", + "name": "Premade ch' crunch", + "examine": "Some Premade chocchip crunchies.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "grand_exchange_price": "95", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2240", + "name": "Premade ch' crunch", + "tradeable": "true", + "grand_exchange_price": "95", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2241", + "name": "Premade s'y crunch", + "examine": "Some premade Spicy Crunchies.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "grand_exchange_price": "103", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2242", + "name": "Premade s'y crunch", + "tradeable": "true", + "grand_exchange_price": "103", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2243", + "name": "Premade t'd crunch", + "examine": "Some premade Toad Crunchies.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "shop_price": "80", + "grand_exchange_price": "43", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2244", + "name": "Premade t'd crunch", + "tradeable": "true", + "grand_exchange_price": "43", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2245", + "name": "Picture", + "examine": "This batta doesn't look very appetising.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2246", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2248", + "name": "Burnt batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2249", + "name": "Half baked batta", + "examine": "This gnome batta is in the early stages of preparation.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2250", + "name": "Raw batta", + "examine": "This gnome batta needs cooking.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2251", + "name": "Picture", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2252", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2253", + "name": "Worm batta", + "examine": "It actually smells quite good.", + "tradeable": "true", + "grand_exchange_price": "140", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2254", + "name": "Worm batta", + "tradeable": "true", + "grand_exchange_price": "140", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2255", + "name": "Toad batta", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "78", + "grand_exchange_price": "271", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2256", + "name": "Toad batta", + "tradeable": "true", + "grand_exchange_price": "271", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2257", + "name": "Picture", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2258", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2259", + "name": "Cheese+tom batta", + "examine": "This smells really good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "260", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2260", + "name": "Cheese+tom batta", + "tradeable": "true", + "grand_exchange_price": "260", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2261", + "name": "Unfinished batta", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2262", + "name": "Unfinished batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2263", + "name": "Unfinished batta", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2264", + "name": "Unfinished batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2265", + "name": "Unfinished batta", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2266", + "name": "Unfinished batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2267", + "name": "Unfinished batta", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2268", + "name": "Unfinished batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2269", + "name": "Unfinished batta", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2270", + "name": "Unfinished batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2271", + "name": "Unfinished batta", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2272", + "name": "Unfinished batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2273", + "name": "Unfinished batta", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2274", + "name": "Unfinished batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2275", + "name": "Picture", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2276", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2277", + "name": "Fruit batta", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "303", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2278", + "name": "Fruit batta", + "tradeable": "true", + "grand_exchange_price": "303", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2279", + "name": "Picture", + "examine": "This XX batta needs garnishing with YY.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2280", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2281", + "name": "Vegetable batta", + "examine": "Well... It looks healthy.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "240", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2282", + "name": "Vegetable batta", + "tradeable": "true", + "grand_exchange_price": "240", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2283", + "name": "Pizza base", + "examine": "I need to add some tomato next.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "418", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2284", + "name": "Pizza base", + "tradeable": "true", + "grand_exchange_price": "418", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2285", + "name": "Incomplete pizza", + "examine": "I need to add some cheese next.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "366", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2286", + "name": "Incomplete pizza", + "tradeable": "true", + "grand_exchange_price": "366", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2287", + "name": "Uncooked pizza", + "examine": "This needs cooking", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "1141", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2288", + "name": "Uncooked pizza", + "tradeable": "true", + "grand_exchange_price": "1141", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2289", + "name": "Plain pizza", + "examine": "A cheese and tomato pizza. (Whole)Half of this plain pizza has been eaten. (Half)", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "1357", + "weight": "0.66", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2290", + "name": "Plain pizza", + "tradeable": "true", + "grand_exchange_price": "1357", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2291", + "name": "1/2 plain pizza", + "examine": "A cheese and tomato pizza. (Whole)Half of this plain pizza has been eaten. (Half)", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "238", + "weight": "0.66", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2292", + "name": "1/2 plain pizza", + "tradeable": "true", + "grand_exchange_price": "238", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2293", + "name": "Meat pizza", + "examine": "A pizza with bits of meat on it. (Whole) Half of this meat pizza has been eaten. (Half)", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "1012", + "weight": "0.83", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2294", + "name": "Meat pizza", + "tradeable": "true", + "grand_exchange_price": "1012", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2295", + "name": "1/2 meat pizza", + "examine": "A pizza with bits of meat on it. (Whole) Half of this meat pizza has been eaten. (Half)", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "339", + "weight": "0.83", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2296", + "name": "1/2 meat pizza", + "tradeable": "true", + "grand_exchange_price": "339", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2297", + "name": "Anchovy pizza", + "examine": "A pizza with anchovies. (Whole) Half of this anchovy pizza has been eaten. (Half)", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "1573", + "weight": "0.83", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2298", + "name": "Anchovy pizza", + "tradeable": "true", + "grand_exchange_price": "1573", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2299", + "name": "1/2 anchovy pizza", + "examine": "A pizza with anchovies. (Whole) Half of this anchovy pizza has been eaten. (Half)", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "44", + "weight": "0.83", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2300", + "name": "1/2 anchovy pizza", + "tradeable": "true", + "grand_exchange_price": "44", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2301", + "name": "Pineapple pizza", + "examine": "A pizza with bits of pineapple on it. (Whole)Half of this pineapple pizza has been eaten. (Half)", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "1469", + "weight": "0.83", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2302", + "name": "Pineapple pizza", + "tradeable": "true", + "grand_exchange_price": "1469", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2303", + "name": "1/2 p'apple pizza", + "grand_exchange_price": "156", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2304", + "name": "1/2 p'apple pizza", + "tradeable": "true", + "grand_exchange_price": "156", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2306", + "name": "Burnt pizza", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2307", + "name": "Bread dough", + "examine": "Some uncooked dough.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "158", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2308", + "name": "Bread dough", + "tradeable": "true", + "grand_exchange_price": "158", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2309", + "name": "Bread", + "examine": "Nice crispy bread.", + "tradeable": "true", + "low_alchemy": "9", + "high_alchemy": "14", + "shop_price": "24", + "grand_exchange_price": "110", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2310", + "name": "Bread", + "tradeable": "true", + "grand_exchange_price": "110", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2312", + "name": "Burnt bread", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2313", + "name": "Pie dish", + "examine": "Deceptively pie shaped.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "174", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2314", + "name": "Pie dish", + "tradeable": "true", + "grand_exchange_price": "174", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2315", + "name": "Pie shell", + "examine": "I need to find a filling for this pie.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "887", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2316", + "name": "Pie shell", + "tradeable": "true", + "grand_exchange_price": "887", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2317", + "name": "Uncooked apple pie", + "examine": "This would be much tastier cooked.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "781", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2318", + "name": "Uncooked apple pie", + "tradeable": "true", + "grand_exchange_price": "781", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2319", + "name": "Uncooked meat pie", + "examine": "This would be much healthier cooked.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "747", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2320", + "name": "Uncooked meat pie", + "tradeable": "true", + "grand_exchange_price": "747", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2321", + "name": "Uncooked berry pie", + "examine": "This would be much more appetising cooked.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "802", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2322", + "name": "Uncooked berry pie", + "tradeable": "true", + "grand_exchange_price": "802", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2323", + "name": "Apple pie", + "examine": "Mmm Apple pie. (Whole)Mmm half an apple pie. (Half)", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "140", + "grand_exchange_price": "246", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2324", + "name": "Apple pie", + "tradeable": "true", + "grand_exchange_price": "246", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2325", + "name": "Redberry pie", + "examine": "Looks tasty. (Whole)So tasty I kept some for later. (Half)", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "534", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2326", + "name": "Redberry pie", + "tradeable": "true", + "grand_exchange_price": "534", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2327", + "name": "Meat pie", + "tradeable": "true", + "shop_price": "16", + "grand_exchange_price": "160", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2328", + "name": "Meat pie", + "tradeable": "true", + "grand_exchange_price": "160", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2330", + "name": "Burnt pie", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2331", + "name": "Half a meat pie", + "tradeable": "true", + "shop_price": "16", + "grand_exchange_price": "174", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2332", + "name": "Half a meat pie", + "tradeable": "true", + "grand_exchange_price": "174", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2333", + "name": "Half a redberry pie", + "examine": "Looks tasty. (Whole)So tasty I kept some for later. (Half)", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "248", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2334", + "name": "Half a redberry pie", + "tradeable": "true", + "grand_exchange_price": "248", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2335", + "name": "Half an apple pie", + "examine": "Mmm Apple pie. (Whole)Mmm half an apple pie. (Half)", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "140", + "grand_exchange_price": "146", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2336", + "name": "Half an apple pie", + "tradeable": "true", + "grand_exchange_price": "146", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2337", + "name": "Raw oomlie", + "examine": "Raw meat from the oomlie bird.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "155", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2338", + "name": "Raw oomlie", + "tradeable": "true", + "grand_exchange_price": "155", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2339", + "name": "Palm leaf", + "examine": "A thick green palm leaf used by natives to cook meat.", + "low_alchemy": "2", + "high_alchemy": "3", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2340", + "name": "Palm leaf", + "examine": "A thick green palm leaf used by natives to cook meat.", + "low_alchemy": "2", + "high_alchemy": "3", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2341", + "name": "Wrapped oomlie", + "examine": "Oomlie meat in a palm leaf pouch. It just needs to be cooked.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "grand_exchange_price": "814", + "weight": "0.25", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2342", + "name": "Wrapped oomlie", + "tradeable": "true", + "grand_exchange_price": "814", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2343", + "name": "Cooked oomlie wrap", + "examine": "Deliciously cooked oomlie meat in a palm leaf pouch.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "grand_exchange_price": "1126", + "weight": "0.25", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2344", + "name": "Cooked oomlie wrap", + "tradeable": "true", + "grand_exchange_price": "1126", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2346", + "name": "Burnt oomlie wrap", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2347", + "name": "Hammer", + "examine": "Good for hitting things!", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "shop_price": "13", + "grand_exchange_price": "37", + "weight": "0.9", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2348", + "name": "Hammer", + "tradeable": "true", + "grand_exchange_price": "37", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2349", + "name": "Bronze bar", + "examine": "It's a bar of bronze.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "10", + "grand_exchange_price": "268", + "weight": "1.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2350", + "name": "Bronze bar", + "tradeable": "true", + "grand_exchange_price": "268", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2351", + "name": "Iron bar", + "examine": "It's a bar of iron.", + "tradeable": "true", + "low_alchemy": "11", + "high_alchemy": "16", + "grand_exchange_price": "493", + "weight": "1.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2352", + "name": "Iron bar", + "tradeable": "true", + "grand_exchange_price": "493", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2353", + "name": "Steel bar", + "examine": "It's a bar of steel.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "1266", + "weight": "1.81", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2354", + "name": "Steel bar", + "tradeable": "true", + "grand_exchange_price": "1266", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2355", + "name": "Silver bar", + "examine": "It's a bar of silver.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "274", + "weight": "1.81", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2356", + "name": "Silver bar", + "tradeable": "true", + "grand_exchange_price": "274", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2357", + "name": "Gold bar", + "examine": "It's a bar of gold.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "107", + "weight": "1.81", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2358", + "name": "Gold bar", + "tradeable": "true", + "grand_exchange_price": "107", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2359", + "name": "Mithril bar", + "examine": "It's a bar of mithril.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "120", + "grand_exchange_price": "1920", + "weight": "1.6", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2360", + "name": "Mithril bar", + "tradeable": "true", + "grand_exchange_price": "1920", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2361", + "name": "Adamantite bar", + "examine": "It's a bar of adamant.", + "tradeable": "true", + "low_alchemy": "256", + "high_alchemy": "384", + "grand_exchange_price": "3306", + "weight": "2.04", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2362", + "name": "Adamantite bar", + "tradeable": "true", + "grand_exchange_price": "3306", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2363", + "name": "Runite bar", + "examine": "It's a bar of rune.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "grand_exchange_price": "13300", + "weight": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2364", + "name": "Runite bar", + "tradeable": "true", + "grand_exchange_price": "13300", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2365", + "name": "'perfect' gold bar", + "examine": "It's a 'perfect' golden bar.", + "low_alchemy": "120", + "high_alchemy": "180", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2366", + "name": "Shield left half", + "examine": "The left half of a Dragon Square Shield.", + "tradeable": "true", + "low_alchemy": "44000", + "high_alchemy": "66000", + "grand_exchange_price": "65800", + "requirements": "{13,60}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2367", + "name": "Shield left half", + "tradeable": "true", + "grand_exchange_price": "65800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2368", + "name": "Shield right half", + "examine": "The right half of a dragon square shield.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "shop_price": "750000", + "grand_exchange_price": "743100", + "requirements": "{13,60}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2369", + "name": "Shield right half", + "tradeable": "true", + "grand_exchange_price": "743100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2370", + "name": "Steel studs", + "examine": "A set of studs for leather armour.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "100", + "grand_exchange_price": "792", + "weight": "1", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2371", + "name": "Steel studs", + "tradeable": "true", + "grand_exchange_price": "792", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2372", + "name": "Ogre relic", + "examine": "An old statue of an ogre warrior.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This item will likely break if you put it down, and you will have to go looking for another one.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2373", + "name": "Relic part 1", + "examine": "Part of an ogre relic.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This item will likely break if you put it down here and you will have to go looking for another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2374", + "name": "Relic part 2", + "examine": "Part of an ogre relic.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This item will likely break if you put it down here and you will have to go looking for another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2375", + "name": "Relic part 3", + "examine": "Part of an ogre relic.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This item will likely break if you put it down here and you will have to go looking for another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2376", + "name": "Skavid map", + "examine": "It's a map.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This item will likely break if you put it down here and you will have to go looking for another.", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2377", + "name": "Ogre tooth", + "examine": "Very tooth-like.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This item will likely break if you put it down here and you will have to go looking for another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2378", + "name": "Toban's key", + "examine": "Formerly the property of the ogre, Toban", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This item will likely break if you put it down here and you will have to go looking for another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2379", + "name": "Rock cake", + "examine": "Handy if you want to break all your teeth.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2384", + "name": "Fingernails", + "examine": "Eeeeyeeew!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This item will likely break if you put it down here, and you will have to go looking for another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2385", + "name": "Old robe", + "examine": "I can't wear this old thing.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2386", + "name": "Unusual armour", + "examine": "Looks kind of useless.", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2387", + "name": "Damaged dagger", + "examine": "Pointy.", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2388", + "name": "Tattered eye patch", + "examine": "Useless as an eye patch.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2389", + "name": "Vial", + "examine": "An empty glass vial.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2390", + "name": "Vial", + "examine": "An empty glass vial.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2391", + "name": "Ground bat bones", + "examine": "Let's see it fly, now!", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "350", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2392", + "name": "Ground bat bones", + "tradeable": "true", + "grand_exchange_price": "350", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2393", + "name": "Toban's gold", + "examine": "It's a stolen bar of gold.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This item will likely break if you put it down here and you will have to go looking for another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2394", + "name": "Potion", + "examine": "This is meant to be good for spots.", + "tradeable": "true", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "157", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2395", + "name": "Magic ogre potion", + "examine": "A dangerous magical liquid.", + "low_alchemy": "48", + "high_alchemy": "72", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2396", + "name": "Spell scroll", + "examine": "A spell is written on this parchment.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2397", + "name": "Shaman robe", + "examine": "A tattered old robe.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2398", + "name": "Cave nightshade", + "examine": "Deadly.", + "low_alchemy": "12", + "high_alchemy": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2402", + "name": "Silverlight", + "examine": "The magical sword 'Silverlight'. / The magical sword 'Silverlight', stained black with mushroom ink. (during Shadow of the Storm)", + "low_alchemy": "20", + "high_alchemy": "30", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "9,14,-2,0,0,0,3,2,1,0,0,12,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "388", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2403", + "name": "Hazeel scroll", + "examine": "Scroll containing a powerful enchantment of restoration.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2405", + "name": "Carnillean armour", + "examine": "Decorative armour; an heirloom of the Carnillean family.", + "low_alchemy": "26", + "high_alchemy": "39", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,20,14,8,0,0,5,0,0,0,0", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2406", + "name": "Hazeel's mark", + "examine": "A sign of my commitment to Hazeel.", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2407", + "name": "Ball", + "examine": "A child's ball.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2409", + "name": "Door key", + "examine": "A key to the Witch's house's front door. (Witch's House)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2410", + "name": "Magnet", + "examine": "A very attractive magnet.", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2412", + "name": "Saradomin cape", + "examine": "A cape from the almighty god Saradomin.", + "tradeable": "false", + "low_alchemy": "40", + "high_alchemy": "60", + "equipment_slot": "1", + "bonuses": "0,0,0,10,0,1,1,2,10,0,5,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2413", + "name": "Guthix cape", + "examine": "A cape from the almighty god Guthix.", + "tradeable": "false", + "low_alchemy": "40", + "high_alchemy": "60", + "equipment_slot": "1", + "bonuses": "0,0,0,10,0,1,1,2,10,0,5,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2414", + "name": "Zamorak cape", + "examine": "A cape from the almighty god Zamorak.", + "tradeable": "false", + "low_alchemy": "40", + "high_alchemy": "60", + "equipment_slot": "1", + "bonuses": "0,0,0,10,0,1,1,2,10,0,5,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2415", + "name": "Saradomin staff", + "examine": "A magical staff imbued with the power of Saradomin.", + "tradeable": "false", + "low_alchemy": "32000", + "high_alchemy": "48000", + "shop_price": "80000", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-1,-1,6,6,0,2,3,1,6,0,0,2,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2416", + "name": "Guthix staff", + "examine": "A magical staff imbued with the power of Guthix.", + "tradeable": "false", + "low_alchemy": "32000", + "high_alchemy": "48000", + "shop_price": "80000", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-1,-1,6,6,0,2,3,1,6,0,0,2,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2417", + "name": "Zamorak staff", + "examine": "A magical staff imbued with the power of Zamorak.", + "tradeable": "false", + "low_alchemy": "32000", + "high_alchemy": "48000", + "shop_price": "80000", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-1,-1,6,6,0,2,3,1,6,0,0,2,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2419", + "name": "Wig", + "examine": "A grey woollen wig.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2421", + "name": "Wig", + "examine": "A grey woollen wig.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2422", + "name": "Blue partyhat", + "examine": "A nice hat from a cracker.", + "lendable": "true", + "grand_exchange_price": "2147483647", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2423", + "name": "Key print", + "examine": "Imprint of a key in a lump of clay.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2424", + "name": "Paste", + "examine": "A bottle of skin coloured paste.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2425", + "name": "Picture", + "attack_audios": "2704,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2427", + "name": "Burnt oomlie", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2428", + "name": "Attack potion(4)", + "examine": "X doses of Attack potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "shop_price": "8002", + "grand_exchange_price": "275", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2429", + "name": "Attack potion(4)", + "tradeable": "true", + "grand_exchange_price": "275", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2430", + "name": "Restore potion(4)", + "examine": "X dose(s) of restore potion.", + "tradeable": "true", + "low_alchemy": "35", + "high_alchemy": "52", + "shop_price": "139", + "grand_exchange_price": "101", + "weight": "0.03", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2431", + "name": "Restore potion(4)", + "tradeable": "true", + "grand_exchange_price": "101", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2432", + "name": "Defence potion(4)", + "examine": "(x) doses of Defence Potion.", + "tradeable": "true", + "low_alchemy": "352", + "high_alchemy": "528", + "shop_price": "7832", + "grand_exchange_price": "448", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2433", + "name": "Defence potion(4)", + "tradeable": "true", + "grand_exchange_price": "448", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2434", + "name": "Prayer potion(4)", + "examine": "(X) doses of Prayer restore potion.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "91", + "grand_exchange_price": "5687", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2435", + "name": "Prayer potion(4)", + "tradeable": "true", + "grand_exchange_price": "5687", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2436", + "name": "Super attack(4)", + "examine": "X dose(s) of super Attack potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "8000", + "grand_exchange_price": "898", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2437", + "name": "Super attack(4)", + "tradeable": "true", + "shop_price": "8000", + "grand_exchange_price": "898", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2438", + "name": "Fishing potion(4)", + "examine": "X doses of Fishing potion.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "73", + "weight": "0.03", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2439", + "name": "Fishing potion(4)", + "tradeable": "true", + "grand_exchange_price": "73", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2440", + "name": "Super strength(4)", + "examine": "X dose(s) of super Strength potion.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "shop_price": "8000", + "grand_exchange_price": "2278", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2441", + "name": "Super strength(4)", + "tradeable": "true", + "shop_price": "8000", + "grand_exchange_price": "2278", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2442", + "name": "Super defence(4)", + "examine": "X dose(s) of super Defence potion.", + "tradeable": "true", + "low_alchemy": "105", + "high_alchemy": "158", + "shop_price": "7000", + "grand_exchange_price": "153", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2443", + "name": "Super defence(4)", + "tradeable": "true", + "shop_price": "7000", + "grand_exchange_price": "153", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2444", + "name": "Ranging potion(4)", + "examine": "X doses of ranging potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "8317", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2445", + "name": "Ranging potion(4)", + "tradeable": "true", + "grand_exchange_price": "8317", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2446", + "name": "Antipoison(4)", + "examine": "X doses of antipoison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "shop_price": "375", + "grand_exchange_price": "1624", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2447", + "name": "Antipoison(4)", + "tradeable": "true", + "grand_exchange_price": "1624", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2448", + "name": "Super antipoison(4)", + "examine": "X dose(s) of super anti poison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "1062", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2449", + "name": "Super antipoison(4)", + "tradeable": "true", + "grand_exchange_price": "1062", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2450", + "name": "Zamorak brew(4)", + "examine": "X dose[s] of Zamorak brew.", + "tradeable": "true", + "low_alchemy": "70", + "high_alchemy": "105", + "grand_exchange_price": "2838", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2451", + "name": "Zamorak brew(4)", + "tradeable": "true", + "grand_exchange_price": "2838", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2452", + "name": "Antifire potion(4)", + "examine": "X dose(s) of anti-firebreath potion.", + "tradeable": "true", + "low_alchemy": "105", + "high_alchemy": "158", + "grand_exchange_price": "4743", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2453", + "name": "Antifire potion(4)", + "tradeable": "true", + "grand_exchange_price": "4743", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2454", + "name": "Antifire potion(3)", + "examine": "X dose(s) of anti-firebreath potion.", + "tradeable": "true", + "low_alchemy": "105", + "high_alchemy": "158", + "grand_exchange_price": "3518", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2455", + "name": "Antifire potion(3)", + "tradeable": "true", + "grand_exchange_price": "3518", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2456", + "name": "Antifire potion(2)", + "examine": "X dose(s) of anti-firebreath potion.", + "tradeable": "true", + "low_alchemy": "105", + "high_alchemy": "158", + "grand_exchange_price": "2291", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2457", + "name": "Antifire potion(2)", + "tradeable": "true", + "grand_exchange_price": "2291", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2458", + "name": "Antifire potion(1)", + "examine": "X dose(s) of anti-firebreath potion.", + "tradeable": "true", + "low_alchemy": "105", + "high_alchemy": "158", + "grand_exchange_price": "1099", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2459", + "name": "Antifire potion(1)", + "tradeable": "true", + "grand_exchange_price": "1099", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2460", + "name": "Flowers", + "examine": "A posy of flowers.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "704", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "381,381,381,381", + "defence_anim": "403", + "attack_audios": "2566", + "weight": "0.02", + "ge_buy_limit": "100", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2461", + "name": "Flowers", + "tradeable": "true", + "grand_exchange_price": "704", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2462", + "name": "Flowers", + "examine": "A posy of flowers.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "704", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "381,381,381,381", + "defence_anim": "403", + "attack_audios": "2566", + "weight": "0.02", + "ge_buy_limit": "100", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2463", + "name": "Flowers", + "tradeable": "true", + "grand_exchange_price": "704", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2464", + "name": "Flowers", + "examine": "A posy of flowers.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "638", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "381,381,381,381", + "defence_anim": "403", + "attack_audios": "2566", + "weight": "0.02", + "ge_buy_limit": "100", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2465", + "name": "Flowers", + "tradeable": "true", + "grand_exchange_price": "638", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2466", + "name": "Flowers", + "examine": "A posy of flowers.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "629", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "381,381,381,381", + "defence_anim": "403", + "attack_audios": "2566", + "weight": "0.02", + "ge_buy_limit": "100", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2467", + "name": "Flowers", + "tradeable": "true", + "grand_exchange_price": "629", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2468", + "name": "Flowers", + "examine": "A posy of flowers.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "639", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "381,381,381,381", + "defence_anim": "403", + "attack_audios": "2566", + "weight": "0.02", + "ge_buy_limit": "100", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2469", + "name": "Flowers", + "tradeable": "true", + "grand_exchange_price": "639", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2470", + "name": "Flowers", + "examine": "A posy of flowers.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "613", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "381,381,381,381", + "defence_anim": "403", + "attack_audios": "2566", + "weight": "0.02", + "ge_buy_limit": "100", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2471", + "name": "Flowers", + "tradeable": "true", + "grand_exchange_price": "613", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2472", + "name": "Flowers", + "examine": "A posy of flowers.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "711", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "381,381,381,381", + "defence_anim": "403", + "attack_audios": "2566", + "weight": "0.02", + "ge_buy_limit": "100", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2473", + "name": "Flowers", + "tradeable": "true", + "grand_exchange_price": "711", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2474", + "name": "Flowers", + "examine": "A posy of flowers.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "48700", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "381,381,381,381", + "defence_anim": "403", + "attack_audios": "2566", + "weight": "0.02", + "ge_buy_limit": "100", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2475", + "name": "Flowers", + "tradeable": "true", + "grand_exchange_price": "48700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2476", + "name": "Flowers", + "examine": "A posy of flowers.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "5975", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "381,381,381,381", + "defence_anim": "403", + "attack_audios": "2566", + "weight": "0.02", + "ge_buy_limit": "100", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2477", + "name": "Flowers", + "tradeable": "true", + "grand_exchange_price": "5975", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2481", + "name": "Clean lantadyme", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "40", + "grand_exchange_price": "7274", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2482", + "name": "Clean lantadyme", + "tradeable": "true", + "grand_exchange_price": "7274", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2483", + "name": "Lantadyme potion(unf)", + "examine": "I need another ingredient to finish this lantadyme potion.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "40", + "grand_exchange_price": "6940", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2484", + "name": "Lantadyme potion(unf)", + "tradeable": "true", + "grand_exchange_price": "6940", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2485", + "name": "Grimy lantadyme", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "7210", + "requirements": "{15,67}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2486", + "name": "Grimy lantadyme", + "tradeable": "true", + "grand_exchange_price": "7210", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2487", + "name": "Blue d'hide vamb", + "examine": "Made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1705", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,9,4,3,5,4,0,4,0,0,0,0", + "requirements": "{4,50}", + "weight": "0.2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2488", + "name": "Blue d'hide vamb", + "tradeable": "true", + "grand_exchange_price": "1705", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2489", + "name": "Red d'hide vamb", + "examine": "Vambraces made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "1440", + "high_alchemy": "2160", + "grand_exchange_price": "2046", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,10,5,4,6,6,0,5,0,0,0,0", + "requirements": "{4,60}", + "weight": "0.25", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2490", + "name": "Red d'hide vamb", + "tradeable": "true", + "grand_exchange_price": "2046", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2491", + "name": "Black d'hide vamb", + "examine": "Vambraces made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "1728", + "high_alchemy": "2592", + "grand_exchange_price": "2506", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,11,6,5,7,8,0,6,0,0,0,0", + "requirements": "{4,70}", + "weight": "0.25", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2492", + "name": "Black d'hide vamb", + "tradeable": "true", + "grand_exchange_price": "2506", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2493", + "name": "Blue d'hide chaps", + "examine": "Made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "1728", + "high_alchemy": "2592", + "grand_exchange_price": "2504", + "equipment_slot": "7", + "absorb": "0,5,2", + "bonuses": "0,0,0,-10,11,25,19,27,14,25,20,0,0,0,0", + "requirements": "{4,50}", + "weight": "5.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2494", + "name": "Blue d'hide chaps", + "tradeable": "true", + "grand_exchange_price": "2504", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2495", + "name": "Red d'hide chaps", + "examine": "Made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "2072", + "high_alchemy": "3108", + "grand_exchange_price": "3142", + "equipment_slot": "7", + "absorb": "0,6,3", + "bonuses": "0,0,0,-10,14,28,22,30,20,28,25,0,0,0,0", + "requirements": "{4,60}", + "weight": "5.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2496", + "name": "Red d'hide chaps", + "tradeable": "true", + "grand_exchange_price": "3142", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2497", + "name": "Black d'hide chaps", + "examine": "Made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "2488", + "high_alchemy": "3732", + "grand_exchange_price": "4744", + "equipment_slot": "7", + "absorb": "0,7,3", + "bonuses": "0,0,0,-10,17,31,25,33,28,31,30,0,0,0,0", + "requirements": "{4,70}", + "weight": "5.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2498", + "name": "Black d'hide chaps", + "tradeable": "true", + "grand_exchange_price": "4744", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2499", + "name": "Blue d'hide body", + "examine": "Made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "3744", + "high_alchemy": "5616", + "grand_exchange_price": "5420", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,20,45,37,50,30,45,45,0,0,0,0", + "requirements": "{1,40}-{4,50}", + "weight": "6.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2500", + "name": "Blue d'hide body", + "tradeable": "true", + "grand_exchange_price": "5420", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2501", + "name": "Red d'hide body", + "examine": "Made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4492", + "high_alchemy": "6738", + "grand_exchange_price": "6680", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,25,50,42,55,40,50,50,0,0,0,0", + "requirements": "{1,40}-{4,60}", + "weight": "6.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2502", + "name": "Red d'hide body", + "tradeable": "true", + "grand_exchange_price": "6680", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2503", + "name": "Black d'hide body", + "examine": "Made from 100% real dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "5392", + "high_alchemy": "8088", + "grand_exchange_price": "8098", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,50,55,55,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "weight": "6.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2504", + "name": "Black d'hide body", + "tradeable": "true", + "grand_exchange_price": "8098", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2505", + "name": "Blue d-leather", + "examine": "It's a piece of prepared blue dragonhide.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "grand_exchange_price": "2888", + "weight": "3.1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2506", + "name": "Blue d-leather", + "tradeable": "true", + "grand_exchange_price": "2888", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2507", + "name": "Red dragon leather", + "examine": "It's a piece of prepared red dragonhide.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "4464", + "weight": "3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2508", + "name": "Red dragon leather", + "tradeable": "true", + "grand_exchange_price": "4464", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2509", + "name": "Black d-leather", + "examine": "It's a piece of prepared black dragonhide.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "6664", + "weight": "3.1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2510", + "name": "Black d-leather", + "tradeable": "true", + "grand_exchange_price": "6664", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2511", + "name": "Logs", + "examine": "A number of wooden logs.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "124", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2513", + "name": "Dragon chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "100000", + "high_alchemy": "150000", + "grand_exchange_price": "2902937", + "absorb": "4,0,9", + "bonuses": "0,0,0,-15,0,81,93,98,-3,82,50,0,0,0,0", + "weight": "6.8", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2514", + "name": "Raw shrimps", + "examine": "I should try cooking this.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "6", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2515", + "name": "Raw shrimps", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2516", + "name": "Pot of flour", + "examine": "There is flour in this pot.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "162", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2517", + "name": "Pot of flour", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2518", + "name": "Rotten tomato", + "examine": "Pretty smelly.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2519", + "name": "Rotten tomato", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2520", + "name": "Toy horsey", + "examine": "An inexpensive white/black/grey/brown toy horse.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2521", + "name": "Toy horsey", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2522", + "name": "Toy horsey", + "examine": "An inexpensive white/black/grey/brown toy horse.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2523", + "name": "Toy horsey", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2524", + "name": "Toy horsey", + "examine": "An inexpensive white/black/grey/brown toy horse.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2525", + "name": "Toy horsey", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2526", + "name": "Toy horsey", + "examine": "An inexpensive white/black/grey/brown toy horse.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2527", + "name": "Toy horsey", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2528", + "name": "Lamp", + "examine": "Wonder what happens if I rub it...", + "weight": "0.1", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2529", + "name": "Orb of light", + "examine": "A magical sphere that glimmers within.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2530", + "name": "Bones", + "tradeable": "true", + "shop_price": "140", + "grand_exchange_price": "140", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2531", + "name": "Bones", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2532", + "name": "Iron fire arrows", + "examine": "unlit: Arrows with iron heads and oil-soaked cloth. lit: An easy to make, iron-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "316", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2533", + "name": "Iron fire arrows", + "examine": "unlit: Arrows with iron heads and oil-soaked cloth. lit: An easy to make, iron-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "305", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2534", + "name": "Steel fire arrows", + "examine": "unlit: Arrows with steel heads and oil-soaked cloth. lit: An easy to make, steel-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "325", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,16", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2535", + "name": "Steel fire arrows", + "examine": "unlit: Arrows with steel heads and oil-soaked cloth. lit: An easy to make, steel-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "327", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,16", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2536", + "name": "Mithril fire arrows", + "examine": "unlit: Arrows with mithril heads and oil-soaked cloth. lit: An easy to make, mithril-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "9", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,22", + "requirements": "{4,20}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2537", + "name": "Mithril fire arrows", + "examine": "unlit: Arrows with mithril heads and oil-soaked cloth. lit: An easy to make, mithril-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "63", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,22", + "requirements": "{4,20}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2538", + "name": "Adamant fire arrows", + "examine": "unlit: Arrows with adamant heads and oil-soaked cloth.lit: An easy-to-make, Adamant-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "90", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,31", + "requirements": "{4,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2539", + "name": "Adamant fire arrows", + "examine": "unlit: Arrows with adamant heads and oil-soaked cloth.lit: An easy-to-make, Adamant-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "127", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,31", + "requirements": "{4,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2540", + "name": "Rune fire arrows", + "examine": "An easy to make, rune-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "539", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,49", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2541", + "name": "Rune fire arrows", + "examine": "An easy to make, rune-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "682", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,49", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2550", + "name": "Ring of recoil", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "grand_exchange_price": "943", + "equipment_slot": "12", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2551", + "name": "Ring of recoil", + "tradeable": "true", + "grand_exchange_price": "943", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2552", + "name": "Ring of duelling(8)", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "770", + "grand_exchange_price": "1237", + "equipment_slot": "12", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2553", + "name": "Ring of duelling(8)", + "tradeable": "true", + "grand_exchange_price": "1237", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2554", + "name": "Ring of duelling(7)", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "770", + "grand_exchange_price": "8", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2555", + "name": "Ring of duelling(7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2556", + "name": "Ring of duelling(6)", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "770", + "grand_exchange_price": "8", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2557", + "name": "Ring of duelling(6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2558", + "name": "Ring of duelling(5)", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "770", + "grand_exchange_price": "8", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2559", + "name": "Ring of duelling(5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2560", + "name": "Ring of duelling(4)", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "770", + "grand_exchange_price": "8", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2561", + "name": "Ring of duelling(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2562", + "name": "Ring of duelling(3)", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "770", + "grand_exchange_price": "8", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2563", + "name": "Ring of duelling(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2564", + "name": "Ring of duelling(2)", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "770", + "grand_exchange_price": "8", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2565", + "name": "Ring of duelling(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2566", + "name": "Ring of duelling(1)", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "510", + "high_alchemy": "765", + "shop_price": "770", + "grand_exchange_price": "594", + "equipment_slot": "12", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2567", + "name": "Ring of duelling(1)", + "tradeable": "true", + "grand_exchange_price": "594", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2568", + "name": "Ring of forging", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "810", + "high_alchemy": "1215", + "grand_exchange_price": "1103", + "equipment_slot": "12", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2569", + "name": "Ring of forging", + "tradeable": "true", + "grand_exchange_price": "1103", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2570", + "name": "Ring of life", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "1410", + "high_alchemy": "2115", + "shop_price": "3000", + "grand_exchange_price": "4540", + "equipment_slot": "12", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2571", + "name": "Ring of life", + "tradeable": "true", + "grand_exchange_price": "4540", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2572", + "name": "Ring of wealth", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2573", + "name": "Ring of wealth", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2574", + "name": "Sextant", + "examine": "Used by navigators to find their position in RuneScape.", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2575", + "name": "Watch", + "examine": "A fine looking time piece.", + "low_alchemy": "40", + "high_alchemy": "60", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2576", + "name": "Chart", + "examine": "A navigator's chart of RuneScape.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2577", + "name": "Ranger boots", + "examine": "Lightweight boots ideal for rangers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "13900000", + "equipment_slot": "10", + "bonuses": "0,0,0,-10,8,2,3,4,2,0,10,0,0,0,0", + "requirements": "{4,40}", + "weight": "0.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2578", + "name": "Ranger boots", + "tradeable": "true", + "grand_exchange_price": "13900000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2579", + "name": "Wizard boots", + "examine": "Slightly magical boots.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "747300", + "equipment_slot": "10", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,0,0,0", + "requirements": "{6,20}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2580", + "name": "Wizard boots", + "tradeable": "true", + "grand_exchange_price": "747300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2581", + "name": "Robin hood hat", + "examine": "Endorsed by Robin Hood.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "180", + "high_alchemy": "270", + "grand_exchange_price": "4400000", + "equipment_slot": "0", + "bonuses": "0,0,0,-10,8,4,6,8,4,4,7,0,0,0,0", + "requirements": "{4,40}", + "weight": "0.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2582", + "name": "Robin hood hat", + "tradeable": "true", + "grand_exchange_price": "4400000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2583", + "name": "Black platebody (t)", + "examine": "Black platebody with trim.", + "tradeable": "true", + "low_alchemy": "1536", + "high_alchemy": "2304", + "grand_exchange_price": "74900", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,2", + "bonuses": "0,0,0,-30,-10,41,40,30,-6,40,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "9.07", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2584", + "name": "Black platebody (t)", + "tradeable": "true", + "grand_exchange_price": "74900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2585", + "name": "Black platelegs (t)", + "examine": "Black platelegs with trim.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "grand_exchange_price": "39900", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,21,20,19,-4,20,3,0,0,0,0", + "requirements": "{1,10}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2586", + "name": "Black platelegs (t)", + "tradeable": "true", + "grand_exchange_price": "39900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2587", + "name": "Black full helm(t)", + "examine": "Black full helmet with trim.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "82200", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,4,0,0,0,0", + "requirements": "{1,10}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2588", + "name": "Black full helm(t)", + "tradeable": "true", + "grand_exchange_price": "82200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2589", + "name": "Black kiteshield (t)", + "examine": "Black kiteshield with trim.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "shop_price": "2072", + "grand_exchange_price": "73000", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2590", + "name": "Black kiteshield (t)", + "tradeable": "true", + "grand_exchange_price": "73000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2591", + "name": "Black platebody (g)", + "examine": "Black platebody with gold trim.", + "tradeable": "true", + "low_alchemy": "1536", + "high_alchemy": "2304", + "grand_exchange_price": "589000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,2", + "bonuses": "0,0,0,-30,-10,41,40,30,-6,40,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "9.07", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2592", + "name": "Black platebody (g)", + "tradeable": "true", + "grand_exchange_price": "589000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2593", + "name": "Black platelegs (g)", + "examine": "Black platelegs with gold trim.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "grand_exchange_price": "216700", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,21,20,19,-4,20,3,0,0,0,0", + "requirements": "{1,10}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2594", + "name": "Black platelegs (g)", + "tradeable": "true", + "grand_exchange_price": "216700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2595", + "name": "Black full helm(g)", + "examine": "Black full helmet with gold trim.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "364800", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,4,0,0,0,0", + "requirements": "{1,10}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2596", + "name": "Black full helm(g)", + "tradeable": "true", + "grand_exchange_price": "364800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2597", + "name": "Black kiteshield (g)", + "examine": "Black kiteshield with gold trim.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "grand_exchange_price": "355600", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2598", + "name": "Black kiteshield (g)", + "tradeable": "true", + "grand_exchange_price": "355600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2599", + "name": "Adam platebody (t)", + "examine": "Adamant platebody with trim.", + "tradeable": "true", + "low_alchemy": "5120", + "high_alchemy": "7680", + "grand_exchange_price": "104000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-30,-10,65,63,55,-6,63,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "9.07", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2600", + "name": "Adam platebody (t)", + "tradeable": "true", + "grand_exchange_price": "104000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2601", + "name": "Adam platelegs (t)", + "examine": "These look heavy", + "tradeable": "true", + "low_alchemy": "2560", + "high_alchemy": "3840", + "shop_price": "6464", + "grand_exchange_price": "23200", + "equipment_slot": "7", + "absorb": "1,0,3", + "bonuses": "0,0,0,-21,-7,33,31,29,-4,31,10,0,0,0,0", + "requirements": "{1,30}", + "weight": "10", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2602", + "name": "Adam platelegs (t)", + "tradeable": "true", + "grand_exchange_price": "23200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2603", + "name": "Adam kiteshield (t)", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "49100", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "5.8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2604", + "name": "Adam kiteshield (t)", + "tradeable": "true", + "grand_exchange_price": "49100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2605", + "name": "Adam full helm(t)", + "examine": "Adamant full helm with trim", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "85000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "2.7", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2606", + "name": "Adam full helm(t)", + "tradeable": "true", + "grand_exchange_price": "85000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2607", + "name": "Adam platebody (g)", + "examine": "Adamant platebody with gold trim.", + "tradeable": "true", + "low_alchemy": "5120", + "high_alchemy": "7680", + "grand_exchange_price": "359500", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-30,-10,65,63,55,-6,63,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "9.07", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2608", + "name": "Adam platebody (g)", + "tradeable": "true", + "grand_exchange_price": "359500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2609", + "name": "Adam platelegs (g)", + "examine": "Adamant platelegs with gold trim.", + "tradeable": "true", + "low_alchemy": "2560", + "high_alchemy": "3840", + "shop_price": "6464", + "grand_exchange_price": "94300", + "equipment_slot": "7", + "absorb": "1,0,3", + "bonuses": "0,0,0,-21,-7,33,31,29,-4,31,10,0,0,0,0", + "requirements": "{1,30}", + "weight": "10", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2610", + "name": "Adam platelegs (g)", + "tradeable": "true", + "grand_exchange_price": "94300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2611", + "name": "Adam kiteshield (g)", + "examine": "Adamant kiteshield with gold trim.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "170100", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "6", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2612", + "name": "Adam kiteshield (g)", + "tradeable": "true", + "grand_exchange_price": "170100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2613", + "name": "Adam full helm(g)", + "examine": "Adamant full helmet with gold trim.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "222400", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "2.7", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2614", + "name": "Adam full helm(g)", + "tradeable": "true", + "grand_exchange_price": "222400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2615", + "name": "Rune platebody (g)", + "examine": "Rune platebody with gold trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "426200", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "9.07", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2616", + "name": "Rune platebody (g)", + "tradeable": "true", + "grand_exchange_price": "426200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2617", + "name": "Rune platelegs (g)", + "examine": "Rune platelegs with gold trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "shop_price": "64000", + "grand_exchange_price": "243400", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2618", + "name": "Rune platelegs (g)", + "tradeable": "true", + "grand_exchange_price": "243400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2619", + "name": "Rune full helm(g)", + "examine": "Rune full helmet with gold trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "shop_price": "35000", + "grand_exchange_price": "506800", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2620", + "name": "Rune full helm(g)", + "tradeable": "true", + "grand_exchange_price": "506800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2621", + "name": "Rune kiteshield (g)", + "examine": "Rune kiteshield with gold trim", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "392700", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2622", + "name": "Rune kiteshield (g)", + "tradeable": "true", + "grand_exchange_price": "392700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2623", + "name": "Rune platebody (t)", + "examine": "Rune platebody with trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "162700", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "9.07", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2624", + "name": "Rune platebody (t)", + "tradeable": "true", + "grand_exchange_price": "162700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2625", + "name": "Rune platelegs (t)", + "examine": "Rune platelegs with trim!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "95400", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2626", + "name": "Rune platelegs (t)", + "tradeable": "true", + "grand_exchange_price": "95400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2627", + "name": "Rune full helm (t)", + "examine": "Rune full helmet with trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "216600", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.7", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2628", + "name": "Rune full helm (t)", + "tradeable": "true", + "grand_exchange_price": "216600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2629", + "name": "Rune kiteshield (t)", + "examine": "A large, metal shield with a nice trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "160300", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2630", + "name": "Rune kiteshield (t)", + "tradeable": "true", + "grand_exchange_price": "160300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2631", + "name": "Highwayman mask", + "examine": "Your money or your life!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "83500", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2632", + "name": "Highwayman mask", + "tradeable": "true", + "grand_exchange_price": "83500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2633", + "name": "Blue beret", + "examine": "Parlez-vous francais? (Do you speak French?)", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "34300", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2634", + "name": "Blue beret", + "tradeable": "true", + "grand_exchange_price": "34300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2635", + "name": "Black beret", + "examine": "Parlez-vous francais?(Do you speak French?)", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "117500", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2636", + "name": "Black beret", + "tradeable": "true", + "grand_exchange_price": "117500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2637", + "name": "White beret", + "examine": "Parlez-vous francais? (Do you speak French?)", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "328000", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2638", + "name": "White beret", + "tradeable": "true", + "grand_exchange_price": "328000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2639", + "name": "Tan cavalier", + "examine": "All for one and one for all!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "29100", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2640", + "name": "Tan cavalier", + "tradeable": "true", + "grand_exchange_price": "29100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2641", + "name": "Dark cavalier", + "examine": "All for one and one for all!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "23600", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2642", + "name": "Dark cavalier", + "tradeable": "true", + "grand_exchange_price": "23600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2643", + "name": "Black cavalier", + "examine": "All for one and one for all!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "384500", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2644", + "name": "Black cavalier", + "tradeable": "true", + "grand_exchange_price": "384500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2645", + "name": "Red headband", + "examine": "A minimalist's hat.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "91300", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2646", + "name": "Red headband", + "tradeable": "true", + "grand_exchange_price": "91300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2647", + "name": "Black headband", + "examine": "A minimalist's hat.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "32900", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2648", + "name": "Black headband", + "tradeable": "true", + "grand_exchange_price": "32900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2649", + "name": "Brown headband", + "examine": "A minimalist's hat.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "17800", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2650", + "name": "Brown headband", + "tradeable": "true", + "grand_exchange_price": "17800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2651", + "name": "Pirate's hat", + "examine": "Shiver me timbers!", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "82500", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2652", + "name": "Pirate's hat", + "tradeable": "true", + "grand_exchange_price": "82500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2653", + "name": "Zamorak platebody", + "examine": "Rune platebody in the colours of Zamorak.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "809000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,1,0,1", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2654", + "name": "Zamorak platebody", + "tradeable": "true", + "grand_exchange_price": "809000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2655", + "name": "Zamorak platelegs", + "examine": "Rune platelegs in the colours of Zamorak.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "281500", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,1,0,1", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2656", + "name": "Zamorak platelegs", + "tradeable": "true", + "grand_exchange_price": "281500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2657", + "name": "Zamorak full helm", + "examine": "A full helmet in the colours of Zamorak.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "601500", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,1,0,1", + "requirements": "{1,40}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2658", + "name": "Zamorak full helm", + "tradeable": "true", + "grand_exchange_price": "601500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2659", + "name": "Zamorak kiteshield", + "examine": "A Rune kiteshield in the colours of Zamorak.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "499500", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2660", + "name": "Zamorak kiteshield", + "tradeable": "true", + "grand_exchange_price": "499500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2661", + "name": "Saradomin platebody", + "examine": "Rune platebody in the colours of Saradomin.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "1600000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,1,0,1", + "requirements": "{1,40}", + "weight": "9.07", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2662", + "name": "Saradomin platebody", + "tradeable": "true", + "grand_exchange_price": "1600000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2663", + "name": "Saradomin platelegs", + "examine": "Rune platelegs in the colours of Saradomin!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "444000", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,1", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2664", + "name": "Saradomin platelegs", + "tradeable": "true", + "grand_exchange_price": "444000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2665", + "name": "Saradomin full helm", + "examine": "Rune full helmet in the colours of Saradomin.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "1100000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,1,0,1", + "requirements": "{1,40}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2666", + "name": "Saradomin full helm", + "tradeable": "true", + "grand_exchange_price": "1100000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2667", + "name": "Saradomin kiteshield", + "examine": "Rune kiteshield in the colours of Saradomin.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "795900", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5.4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2668", + "name": "Saradomin kiteshield", + "tradeable": "true", + "grand_exchange_price": "795900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2669", + "name": "Guthix platebody", + "examine": "Rune platebody in the colours of Guthix.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "307900", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,1,0,0", + "requirements": "{1,40}", + "weight": "9.07", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2670", + "name": "Guthix platebody", + "tradeable": "true", + "grand_exchange_price": "307900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2671", + "name": "Guthix platelegs", + "examine": "Rune platelegs in the colours of Guthix.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "169900", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,1,0,1", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2672", + "name": "Guthix platelegs", + "tradeable": "true", + "grand_exchange_price": "169900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2673", + "name": "Guthix full helm", + "examine": "A rune full helmet in the colours of Guthix.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "323100", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,1,0,0", + "requirements": "{1,40}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2674", + "name": "Guthix full helm", + "tradeable": "true", + "grand_exchange_price": "323100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2675", + "name": "Guthix kiteshield", + "examine": "Rune kiteshield in the colours of Guthix.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "247300", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5.4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2676", + "name": "Guthix kiteshield", + "tradeable": "true", + "grand_exchange_price": "247300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2677", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2678", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2679", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2680", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2681", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2682", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2683", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2684", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2685", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2686", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2687", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2688", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2689", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2690", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2691", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2692", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2693", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2694", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2695", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2696", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2697", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2698", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2699", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2700", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2701", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2702", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2703", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2704", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2705", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2706", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2707", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2708", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2709", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2710", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2711", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2712", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2713", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2714", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2715", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2716", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2717", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2718", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2719", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2720", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2721", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2722", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2723", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2724", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2725", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2726", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2727", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2728", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2729", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2730", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2731", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2732", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2733", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2734", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2735", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2736", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2737", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2738", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2739", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2740", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2741", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2742", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2743", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2744", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2745", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2746", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2747", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2748", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2773", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2774", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2775", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2776", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2777", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2778", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2779", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2780", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2781", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2782", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2783", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2784", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2785", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2786", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2787", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2788", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2789", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2790", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2791", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2792", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2793", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2794", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2795", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2796", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2797", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2798", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2799", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2800", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2801", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2802", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2803", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2804", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2805", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2806", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2807", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2808", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2809", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2810", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2811", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2812", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2813", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2814", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2815", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2816", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2817", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2818", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2819", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2820", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2821", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2822", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2823", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2824", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2825", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2826", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2827", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2828", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2829", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2830", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2831", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2833", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2835", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2837", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2839", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2841", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2842", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2843", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2844", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2845", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2846", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2847", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2848", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2849", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2850", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2851", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2852", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2853", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2854", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2855", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2856", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2857", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2858", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2859", + "name": "Wolf bones", + "examine": "Bones of a recently slain wolf.", + "tradeable": "true", + "grand_exchange_price": "1266", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2860", + "name": "Wolf bones", + "tradeable": "true", + "grand_exchange_price": "1266", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2861", + "name": "Wolfbone arrowtips", + "examine": "I can make an ogre arrow with these.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "5", + "grand_exchange_price": "5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2862", + "name": "Achey tree logs", + "examine": "These logs are longer than normal.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "169", + "weight": "1", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2863", + "name": "Achey tree logs", + "tradeable": "true", + "grand_exchange_price": "169", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2864", + "name": "Ogre arrow shaft", + "examine": "A wooden arrow shaft", + "tradeable": "true", + "grand_exchange_price": "47", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2865", + "name": "Flighted ogre arrow", + "examine": "An ogre arrow with four flights attached.", + "tradeable": "true", + "grand_exchange_price": "172", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2866", + "name": "Ogre arrow", + "examine": "A large ogre arrow with a bone tip.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "25", + "grand_exchange_price": "49", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,22", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2871", + "name": "Ogre bellows", + "examine": "A large pair of ogre bellows. If filled with gas (1-3): A large pair of ogre bellows, it has x load(s) of swamp gas in it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2872", + "name": "Ogre bellows (3)", + "examine": "A large pair of ogre bellows. If filled with gas (1-3): A large pair of ogre bellows, it has x load(s) of swamp gas in it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2873", + "name": "Ogre bellows (2)", + "examine": "A large pair of ogre bellows. If filled with gas (1-3): A large pair of ogre bellows, it has x load(s) of swamp gas in it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2874", + "name": "Ogre bellows (1)", + "examine": "A large pair of ogre bellows. If filled with gas (1-3): A large pair of ogre bellows, it has x load(s) of swamp gas in it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2875", + "name": "Bloated toad", + "examine": "An inflated toad.", + "destroy": "true", + "tradeable": "false", + "weight": "0.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2876", + "name": "Raw chompy", + "examine": "I need to cook this first.", + "tradeable": "true", + "low_alchemy": "34", + "high_alchemy": "51", + "grand_exchange_price": "2145", + "weight": "10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2877", + "name": "Raw chompy", + "tradeable": "true", + "grand_exchange_price": "2145", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2878", + "name": "Cooked chompy", + "examine": "It might look delicious to an ogre.Roasted chompy bird.", + "tradeable": "true", + "low_alchemy": "52", + "high_alchemy": "78", + "shop_price": "130", + "grand_exchange_price": "95", + "weight": "10", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2879", + "name": "Cooked chompy", + "tradeable": "true", + "grand_exchange_price": "95", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2881", + "name": "Ruined chompy", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2882", + "name": "Seasoned chompy", + "examine": "It has been deliciously seasoned to taste wonderful for ogres.", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2883", + "name": "Ogre bow", + "examine": "More powerful than a normal bow, useful against large game birds.", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "500", + "equipment_slot": "3", + "attack_speed": "8", + "bonuses": "0,0,0,0,38,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_audios": "2700,0,0,0", + "requirements": "{4,30}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2886", + "name": "Battered book", + "examine": "Book of the elemental shield.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2887", + "name": "Battered key", + "examine": "An old battered key. (Elemental Workshop I)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2888", + "name": "A stone bowl", + "examine": "This is an empty stone bowl. / This is a stone bowl full of lava.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2889", + "name": "A stone bowl", + "examine": "This is an empty stone bowl. / This is a stone bowl full of lava.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2890", + "name": "Elemental shield", + "examine": "A shield made in the Elemental Workshop.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "2000", + "grand_exchange_price": "709", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,0,0,0,6,0,0,0,0,0,0", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2891", + "name": "Elemental shield", + "tradeable": "true", + "grand_exchange_price": "709", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2892", + "name": "Elemental ore", + "examine": "This needs refining.", + "low_alchemy": "2", + "high_alchemy": "3", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2894", + "name": "Boots", + "grand_exchange_price": "1570", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2895", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "1570", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2896", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "867", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2897", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "867", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2898", + "name": "Robe bottoms", + "grand_exchange_price": "741", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2899", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "741", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2900", + "name": "Hat", + "grand_exchange_price": "844", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2901", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "844", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2902", + "name": "Gloves", + "grand_exchange_price": "1039", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2903", + "name": "Gloves", + "tradeable": "true", + "grand_exchange_price": "1039", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2904", + "name": "Boots", + "grand_exchange_price": "1359", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2905", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "1359", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2906", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "958", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2907", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "958", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2908", + "name": "Robe bottoms", + "grand_exchange_price": "474", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2909", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "474", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2910", + "name": "Hat", + "grand_exchange_price": "1445", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2911", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "1445", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2912", + "name": "Gloves", + "grand_exchange_price": "1254", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2913", + "name": "Gloves", + "tradeable": "true", + "grand_exchange_price": "1254", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2914", + "name": "Boots", + "grand_exchange_price": "1054", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2915", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "1054", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2916", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "789", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2917", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "789", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2918", + "name": "Robe bottoms", + "grand_exchange_price": "603", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2919", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "603", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2920", + "name": "Hat", + "grand_exchange_price": "997", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2921", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "997", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2922", + "name": "Gloves", + "grand_exchange_price": "1221", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2923", + "name": "Gloves", + "tradeable": "true", + "grand_exchange_price": "1221", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2924", + "name": "Boots", + "grand_exchange_price": "737", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2925", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "737", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2926", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "504", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2927", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "504", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2928", + "name": "Robe bottoms", + "grand_exchange_price": "637", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2929", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "637", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2930", + "name": "Hat", + "grand_exchange_price": "925", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2931", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "925", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2932", + "name": "Gloves", + "grand_exchange_price": "1829", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2933", + "name": "Gloves", + "tradeable": "true", + "grand_exchange_price": "1829", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2934", + "name": "Boots", + "grand_exchange_price": "988", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2935", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "988", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2936", + "name": "Robe top", + "examine": "The ultimate in gnome design, now in [colour].", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "925", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2937", + "name": "Robe top", + "tradeable": "true", + "grand_exchange_price": "925", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2938", + "name": "Robe bottoms", + "grand_exchange_price": "927", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2939", + "name": "Robe bottoms", + "tradeable": "true", + "grand_exchange_price": "927", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2940", + "name": "Hat", + "grand_exchange_price": "1209", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2941", + "name": "Hat", + "tradeable": "true", + "grand_exchange_price": "1209", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2942", + "name": "Gloves", + "grand_exchange_price": "634", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2943", + "name": "Gloves", + "tradeable": "true", + "grand_exchange_price": "634", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2944", + "name": "Golden key", + "examine": "A key made from solid gold", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2945", + "name": "Iron key", + "examine": "A key made of solid iron.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2946", + "name": "Golden tinderbox", + "examine": "A replica tinderbox made of solid gold.", + "low_alchemy": "120", + "high_alchemy": "180", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2947", + "name": "Golden candle", + "examine": "A replica candle made of solid gold.", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2948", + "name": "Golden pot", + "examine": "A replica pot made of solid gold.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2949", + "name": "Golden hammer", + "examine": "A replica hammer made of solid gold.", + "destroy": "true", + "tradeable": "false", + "attack_speed": "4", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2951", + "name": "Golden needle", + "examine": "A replica needle made of solid gold.", + "low_alchemy": "120", + "high_alchemy": "180", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2952", + "name": "Wolfbane", + "examine": "A silver dagger that can prevent werewolves changing form.", + "tradeable": "false", + "low_alchemy": "120", + "high_alchemy": "180", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "11,5,-4,1,0,0,0,0,1,0,1,10,5,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,401,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2953", + "name": "Bucket of water", + "examine": "It's a bucket of water.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "74", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2954", + "name": "Bucket of water", + "examine": "It's a bucket of water.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "74", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2955", + "name": "Moonlight mead", + "examine": "A foul smelling brew.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "16", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2956", + "name": "Moonlight mead", + "tradeable": "true", + "grand_exchange_price": "16", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2957", + "name": "Druid pouch", + "examine": "A druid pouch.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2958", + "name": "Druid pouch", + "examine": "A druid pouch.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2959", + "name": "Rotten food", + "examine": "Erhhh! It stinks.", + "tradeable": "true", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2960", + "name": "Rotten food", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2961", + "name": "Silver sickle", + "examine": "It's a silver sickle.", + "tradeable": "true", + "low_alchemy": "70", + "high_alchemy": "105", + "grand_exchange_price": "28", + "equipment_slot": "3", + "bonuses": "0,0,0,0,0,0,1,1,1,1,0,1,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "weight": "1.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2962", + "name": "Silver sickle", + "tradeable": "true", + "grand_exchange_price": "28", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2963", + "name": "Silver sickle(b)", + "examine": "It's a blessed silver sickle.", + "low_alchemy": "100", + "high_alchemy": "150", + "equipment_slot": "3", + "bonuses": "0,0,0,0,0,0,1,1,1,1,0,1,5,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2964", + "name": "Washing bowl", + "examine": "Used for washing your face, amongst other things.", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "1", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2966", + "name": "Mirror", + "examine": "A small mirror, probably used for grooming.", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2968", + "name": "Druidic spell", + "examine": "A druidic spell given to you freely by the spirit of Filliman Tarlock.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2969", + "name": "A used spell", + "examine": "A used druidic spell given to you freely by the spirit of Filliman Tarlock.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2970", + "name": "Mort myre fungus", + "examine": "A mushroom from the swamps of Mort Myre.", + "tradeable": "true", + "grand_exchange_price": "915", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2971", + "name": "Mort myre fungus", + "tradeable": "true", + "grand_exchange_price": "915", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2972", + "name": "Mort myre stem", + "examine": "A cutting from a budding branch.", + "tradeable": "true", + "grand_exchange_price": "338", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2973", + "name": "Mort myre stem", + "tradeable": "true", + "grand_exchange_price": "338", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2974", + "name": "Mort myre pear", + "examine": "A pear picked from a dying bush in Mort Myre.", + "tradeable": "true", + "grand_exchange_price": "975", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2975", + "name": "Mort myre pear", + "tradeable": "true", + "grand_exchange_price": "975", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2976", + "name": "Sickle mould", + "examine": "Used to make sickles.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "498", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2977", + "name": "Sickle mould", + "tradeable": "true", + "grand_exchange_price": "498", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2978", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2979", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2980", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2981", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2982", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2983", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2984", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2985", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2986", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2987", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2988", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2989", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2990", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2991", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2992", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2993", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2994", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2995", + "name": "Chompy bird hat", + "examine": "A symbol of your chompy bird hunting prowess.", + "equipment_slot": "0", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2996", + "name": "Agility arena ticket", + "examine": "I can exchange these for further experience or items.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2997", + "name": "Pirate's hook", + "examine": "You should see the shark...", + "tradeable": "true", + "low_alchemy": "35", + "high_alchemy": "53", + "shop_price": "800", + "grand_exchange_price": "1500000", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,1,5,3,0,0,1,0,0,0,0", + "weight": "0.3", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2998", + "name": "Clean toadflax", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "19", + "high_alchemy": "28", + "shop_price": "3", + "grand_exchange_price": "4056", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "2999", + "name": "Clean toadflax", + "tradeable": "true", + "grand_exchange_price": "4056", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3000", + "name": "Clean snapdragon", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "35", + "shop_price": "10", + "grand_exchange_price": "10500", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3001", + "name": "Clean snapdragon", + "tradeable": "true", + "grand_exchange_price": "10500", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3002", + "name": "Toadflax potion(unf)", + "examine": "I need another ingredient to finish this toadflax potion.", + "tradeable": "true", + "low_alchemy": "19", + "high_alchemy": "28", + "grand_exchange_price": "3988", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3003", + "name": "Toadflax potion(unf)", + "tradeable": "true", + "grand_exchange_price": "3988", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3004", + "name": "Snapdragon potion(unf)", + "examine": "I need another ingredient to finish this snapdragon potion.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "35", + "grand_exchange_price": "9588", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3005", + "name": "Snapdragon potion(unf)", + "tradeable": "true", + "grand_exchange_price": "9588", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3006", + "name": "Firework", + "examine": "Keep out of reach of children and familiars.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3007", + "name": "Firework", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3008", + "name": "Energy potion(4)", + "examine": "X doses of energy potion.", + "tradeable": "true", + "low_alchemy": "44", + "high_alchemy": "66", + "shop_price": "145", + "grand_exchange_price": "33", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3009", + "name": "Energy potion(4)", + "tradeable": "true", + "grand_exchange_price": "33", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3010", + "name": "Energy potion(3)", + "examine": "X doses of energy potion.", + "tradeable": "true", + "low_alchemy": "44", + "high_alchemy": "66", + "shop_price": "145", + "grand_exchange_price": "18", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3011", + "name": "Energy potion(3)", + "tradeable": "true", + "grand_exchange_price": "18", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3012", + "name": "Energy potion(2)", + "examine": "X doses of energy potion.", + "tradeable": "true", + "low_alchemy": "44", + "high_alchemy": "66", + "shop_price": "145", + "grand_exchange_price": "11", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3013", + "name": "Energy potion(2)", + "tradeable": "true", + "grand_exchange_price": "11", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3014", + "name": "Energy potion(1)", + "examine": "X doses of energy potion.", + "tradeable": "true", + "low_alchemy": "44", + "high_alchemy": "66", + "shop_price": "145", + "grand_exchange_price": "25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3015", + "name": "Energy potion(1)", + "tradeable": "true", + "grand_exchange_price": "25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3016", + "name": "Super energy(4)", + "examine": "X dose(s) of super energy potion.", + "tradeable": "true", + "low_alchemy": "92", + "high_alchemy": "138", + "shop_price": "4000", + "grand_exchange_price": "3088", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3017", + "name": "Super energy(4)", + "tradeable": "true", + "shop_price": "4000", + "grand_exchange_price": "3088", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3018", + "name": "Super energy(3)", + "examine": "X dose(s) of super energy potion.", + "tradeable": "true", + "low_alchemy": "92", + "high_alchemy": "138", + "grand_exchange_price": "2485", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3019", + "name": "Super energy(3)", + "tradeable": "true", + "grand_exchange_price": "2485", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3020", + "name": "Super energy(2)", + "examine": "X dose(s) of super energy potion.", + "tradeable": "true", + "low_alchemy": "92", + "high_alchemy": "138", + "grand_exchange_price": "1592", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3021", + "name": "Super energy(2)", + "tradeable": "true", + "grand_exchange_price": "1592", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3022", + "name": "Super energy(1)", + "examine": "X dose(s) of super energy potion.", + "tradeable": "true", + "low_alchemy": "92", + "high_alchemy": "138", + "grand_exchange_price": "1432", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3023", + "name": "Super energy(1)", + "tradeable": "true", + "grand_exchange_price": "1432", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3024", + "name": "Super restore(4)", + "examine": "X dose(s) of super restore potion.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "shop_price": "12000", + "grand_exchange_price": "11500", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3025", + "name": "Super restore(4)", + "tradeable": "true", + "shop_price": "12000", + "grand_exchange_price": "11500", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3026", + "name": "Super restore(3)", + "examine": "X dose(s) of super restore potion.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "grand_exchange_price": "8690", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3027", + "name": "Super restore(3)", + "tradeable": "true", + "grand_exchange_price": "8690", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3028", + "name": "Super restore(2)", + "examine": "X dose(s) of super restore potion.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "grand_exchange_price": "5637", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3029", + "name": "Super restore(2)", + "tradeable": "true", + "grand_exchange_price": "5637", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3030", + "name": "Super restore(1)", + "examine": "X dose(s) of super restore potion.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "grand_exchange_price": "2606", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3031", + "name": "Super restore(1)", + "tradeable": "true", + "grand_exchange_price": "2606", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3032", + "name": "Agility potion(4)", + "examine": "(X) doses of Agility potion.", + "tradeable": "true", + "grand_exchange_price": "276", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3033", + "name": "Agility potion(4)", + "tradeable": "true", + "grand_exchange_price": "276", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3034", + "name": "Agility potion(3)", + "examine": "(X) doses of Agility potion.", + "tradeable": "true", + "grand_exchange_price": "148", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3035", + "name": "Agility potion(3)", + "tradeable": "true", + "grand_exchange_price": "148", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3036", + "name": "Agility potion(2)", + "examine": "(X) doses of Agility potion.", + "tradeable": "true", + "grand_exchange_price": "115", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3037", + "name": "Agility potion(2)", + "tradeable": "true", + "grand_exchange_price": "115", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3038", + "name": "Agility potion(1)", + "examine": "(X) doses of Agility potion.", + "tradeable": "true", + "grand_exchange_price": "306", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3039", + "name": "Agility potion(1)", + "tradeable": "true", + "grand_exchange_price": "306", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3040", + "name": "Magic potion(4)", + "examine": "X dose(s) of Magic potion.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "7214", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3041", + "name": "Magic potion(4)", + "tradeable": "true", + "grand_exchange_price": "7214", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3042", + "name": "Magic potion(3)", + "examine": "X dose(s) of Magic potion.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "5285", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3043", + "name": "Magic potion(3)", + "tradeable": "true", + "grand_exchange_price": "5285", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3044", + "name": "Magic potion(2)", + "examine": "X dose(s) of Magic potion.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "3697", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3045", + "name": "Magic potion(2)", + "tradeable": "true", + "grand_exchange_price": "3697", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3046", + "name": "Magic potion(1)", + "examine": "X dose(s) of Magic potion.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "1826", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3047", + "name": "Magic potion(1)", + "tradeable": "true", + "grand_exchange_price": "1826", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3048", + "name": "Pirate's hook", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3049", + "name": "Grimy toadflax", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "3996", + "requirements": "{15,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3050", + "name": "Grimy toadflax", + "tradeable": "true", + "grand_exchange_price": "3996", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3051", + "name": "Grimy snapdragon", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "10500", + "requirements": "{15,59}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3052", + "name": "Grimy snapdragon", + "tradeable": "true", + "grand_exchange_price": "10500", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3053", + "name": "Lava battlestaff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "6800", + "high_alchemy": "10200", + "grand_exchange_price": "9985", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,30}-{6,30}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3054", + "name": "Mystic lava staff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "shop_price": "160", + "grand_exchange_price": "34100", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,40}-{6,40}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3055", + "name": "Lava battlestaff", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3056", + "name": "Mystic lava staff", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3057", + "name": "Mime mask", + "examine": "A mime would wear this.", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3058", + "name": "Mime top", + "examine": "A mime would wear these.", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3059", + "name": "Mime legs", + "examine": "A mime would wear these.", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3060", + "name": "Mime gloves", + "examine": "A mime would wear these.", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3061", + "name": "Mime boots", + "examine": "A mime would wear these.", + "equipment_slot": "10", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3062", + "name": "Strange box", + "examine": "It seems to be humming...", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3093", + "name": "Black dart", + "examine": "A deadly throwing dart with a black tip.", + "tradeable": "true", + "grand_exchange_price": "628", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,7,0,0,0,0,0,0,0,0,0,6", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,10}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3094", + "name": "Black dart(p)", + "examine": "A deadly throwing dart with a black tip.", + "tradeable": "true", + "grand_exchange_price": "740", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,7,0,0,0,0,0,0,0,0,0,6", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,10}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3095", + "name": "Bronze claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "low_alchemy": "19", + "high_alchemy": "28", + "shop_price": "48", + "grand_exchange_price": "702", + "render_anim": "2583", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "3,4,-4,0,0,1,2,1,0,0,0,5,0,0,0", + "weapon_interface": "9", + "two_handed": "true", + "attack_anims": "390,390,390,390", + "defence_anim": "397", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3096", + "name": "Iron claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "13", + "render_anim": "2583", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,6,-4,0,0,2,3,1,0,0,0,7,0,0,0", + "weapon_interface": "9", + "two_handed": "true", + "attack_anims": "390,390,390,390", + "defence_anim": "397", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3097", + "name": "Steel claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "low_alchemy": "70", + "high_alchemy": "105", + "shop_price": "175", + "grand_exchange_price": "20", + "render_anim": "2583", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "8,11,-4,0,0,3,6,2,0,0,0,12,0,0,0", + "weapon_interface": "9", + "two_handed": "true", + "attack_anims": "390,390,390,390", + "defence_anim": "397", + "requirements": "{0,5}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3098", + "name": "Black claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "low_alchemy": "144", + "high_alchemy": "216", + "grand_exchange_price": "940", + "render_anim": "2583", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,14,-4,0,0,4,7,2,0,0,0,14,0,0,0", + "weapon_interface": "9", + "two_handed": "true", + "attack_anims": "390,390,390,390", + "defence_anim": "397", + "requirements": "{0,10}", + "weight": "6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3099", + "name": "Mithril claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "low_alchemy": "190", + "high_alchemy": "285", + "grand_exchange_price": "114", + "render_anim": "2583", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "11,16,-4,0,0,4,8,2,0,0,0,17,0,0,0", + "weapon_interface": "9", + "two_handed": "true", + "attack_anims": "390,390,390,390", + "defence_anim": "397", + "requirements": "{0,20}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3100", + "name": "Adamant claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "low_alchemy": "480", + "high_alchemy": "720", + "grand_exchange_price": "649", + "render_anim": "2583", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "18,23,-4,0,0,6,12,3,0,0,0,24,0,0,0", + "weapon_interface": "9", + "two_handed": "true", + "attack_anims": "390,390,390,390", + "defence_anim": "397", + "requirements": "{0,30}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3101", + "name": "Rune claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4800", + "high_alchemy": "7200", + "grand_exchange_price": "6939", + "render_anim": "2583", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "26,38,-4,0,0,10,19,5,0,0,0,39,0,0,0", + "weapon_interface": "9", + "has_special": "true", + "two_handed": "true", + "attack_anims": "390,390,390,390", + "defence_anim": "397", + "requirements": "{0,40}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3102", + "name": "Combination", + "examine": "The combination to Burthorpe Castle's equipment room.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3103", + "name": "Iou", + "examine": "The guard wrote the IOU on the back of some paper.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3104", + "name": "Secret way map", + "examine": "This map shows the secret way up to Death Plateau.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3105", + "name": "Climbing boots", + "examine": "Boots made for general climbing; rocks a speciality.", + "low_alchemy": "4", + "high_alchemy": "7", + "destroy": "true", + "shop_price": "1900", + "grand_exchange_price": "51400", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,2,0,0,0", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3106", + "name": "Climbing boots", + "tradeable": "true", + "grand_exchange_price": "51400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3107", + "name": "Spiked boots", + "examine": "Climbing boots with spikes.", + "low_alchemy": "12", + "high_alchemy": "18", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,2,0,0,0", + "weight": "0.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3109", + "name": "Stone ball", + "examine": "Place on the stone mechanism in the right order to open the door.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3110", + "name": "Stone ball", + "examine": "Place on the stone mechanism in the right order to open the door.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3111", + "name": "Stone ball", + "examine": "Place on the stone mechanism in the right order to open the door.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3112", + "name": "Stone ball", + "examine": "Place on the stone mechanism in the right order to open the door.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3113", + "name": "Stone ball", + "examine": "Place on the stone mechanism in the right order to open the door.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3114", + "name": "Certificate", + "examine": "Entrance certificate to the Imperial Guard.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3115", + "name": "Bronze claws", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3116", + "name": "Iron claws", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3117", + "name": "Steel claws", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3118", + "name": "Black claws", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3119", + "name": "Mithril claws", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3120", + "name": "Adamant claws", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3121", + "name": "Rune claws", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3122", + "name": "Granite shield", + "examine": "A solid stone shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "22400", + "high_alchemy": "33600", + "grand_exchange_price": "34800", + "equipment_slot": "5", + "absorb": "5,0,10", + "bonuses": "0,0,0,-12,-8,40,42,38,0,65,50,0,0,0,0", + "requirements": "{1,50}-{2,50}", + "weight": "6.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3123", + "name": "Shaikahan bones", + "examine": "Large glistening bones which glow with a pale yellow aura.", + "tradeable": "true", + "grand_exchange_price": "1975", + "weight": "1.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3124", + "name": "Shaikahan bones", + "tradeable": "true", + "grand_exchange_price": "1975", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3125", + "name": "Jogre bones", + "examine": "Fairly big bones which smell distinctly of Jogre.", + "tradeable": "true", + "grand_exchange_price": "1023", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3126", + "name": "Jogre bones", + "tradeable": "true", + "grand_exchange_price": "1023", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3127", + "name": "Burnt jogre bones", + "examine": "These blackened Jogre bones have been somehow burnt.", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3128", + "name": "Pasty jogre bones", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3129", + "name": "Pasty jogre bones", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3130", + "name": "Marinated j' bones", + "examine": "Burnt Jogre bones marinated in lovely Karambwanji sauce. Perfect./Burnt Jogre bones marinated in lovely Karabwanji sauce. Not quite right.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3131", + "name": "Pasty jogre bones", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3132", + "name": "Pasty jogre bones", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3133", + "name": "Marinated j' bones", + "examine": "Burnt Jogre bones marinated in lovely Karambwanji sauce. Perfect./Burnt Jogre bones marinated in lovely Karabwanji sauce. Not quite right.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3134", + "name": "Granite shield", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3136", + "name": "Cell key 1", + "examine": "The key to the troll prison.", + "destroy": "true", + "tradeable": "false", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3137", + "name": "Cell key 2", + "examine": "The key to the troll prison.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3138", + "name": "Potato cactus", + "examine": "How am I supposed to eat that?!", + "tradeable": "true", + "grand_exchange_price": "1834", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3139", + "name": "Potato cactus", + "tradeable": "true", + "grand_exchange_price": "1834", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3140", + "name": "Dragon chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "100000", + "high_alchemy": "150000", + "grand_exchange_price": "4300000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-15,0,81,93,98,-3,82,50,0,0,0,0", + "requirements": "{1,60}", + "weight": "6.8", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3141", + "name": "Dragon chainbody", + "tradeable": "true", + "grand_exchange_price": "4300000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3142", + "name": "Raw karambwan", + "examine": "A raw green octopus.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "440", + "grand_exchange_price": "1775", + "weight": "0.5", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3143", + "name": "Raw karambwan", + "tradeable": "true", + "grand_exchange_price": "1775", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3144", + "name": "Cooked karambwan", + "examine": "Cooked octopus.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "460", + "grand_exchange_price": "1455", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3145", + "name": "Cooked karambwan", + "tradeable": "true", + "grand_exchange_price": "1455", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3146", + "name": "Poison karambwan", + "examine": "Cooked octopus. It looks poorly cooked and quite dangerous.", + "low_alchemy": "100", + "high_alchemy": "150", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3147", + "name": "Cooked karambwan", + "examine": "Cooked octopus.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "460", + "grand_exchange_price": "906", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3149", + "name": "Burnt karambwan", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3150", + "name": "Raw karambwanji", + "examine": "Small brightly coloured tropical fish.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3151", + "name": "Karambwanji", + "examine": "Small brightly coloured tropical fish.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "0.99", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3152", + "name": "Karambwan paste", + "examine": "Freshly made octopus paste. It smells quite nauseating.", + "low_alchemy": "6", + "high_alchemy": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3153", + "name": "Karambwan paste", + "examine": "Freshly made octopus paste. It smells quite nauseating.", + "low_alchemy": "6", + "high_alchemy": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3154", + "name": "Karambwan paste", + "examine": "Freshly made octopus paste. It smells quite nauseating.", + "low_alchemy": "6", + "high_alchemy": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3155", + "name": "Karambwanji paste", + "examine": "This paste smells of raw fish./This paste smells of cooked fish.", + "low_alchemy": "6", + "high_alchemy": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3156", + "name": "Karambwanji paste", + "examine": "This paste smells of raw fish./This paste smells of cooked fish.", + "low_alchemy": "6", + "high_alchemy": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3157", + "name": "Karambwan vessel", + "examine": "A wide bodied and thin necked vessel, encrusted with sea salt. / The Karambwan Vessel is loaded with Karambwanji", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "221", + "equipment_slot": "3", + "requirements": "{10,65}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3158", + "name": "Karambwan vessel", + "tradeable": "true", + "grand_exchange_price": "221", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3159", + "name": "Karambwan vessel", + "examine": "A wide bodied and thin necked vessel, encrusted with sea salt. / The Karambwan Vessel is loaded with Karambwanji", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "240", + "requirements": "{10,65}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3160", + "name": "Karambwan vessel", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3161", + "name": "Crafting manual", + "examine": "A set of instructions explaining how to construct a Karambwan vessel", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3162", + "name": "Sliced banana", + "examine": "You swear you had more than three slices before.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "38", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3163", + "name": "Sliced banana", + "tradeable": "true", + "grand_exchange_price": "38", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3164", + "name": "Karamjan rum", + "examine": "A very strong spirit brewed in Karamja.", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "27", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3165", + "name": "Karamjan rum", + "examine": "A very strong spirit brewed in Karamja.", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "27", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3166", + "name": "Monkey corpse", + "examine": "It's the body of a dead monkey.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3167", + "name": "Monkey skin", + "examine": "It's the skin of a (hopefully) dead monkey.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3168", + "name": "Seaweed sandwich", + "examine": "A 'Seaweed in Monkey Skin' sandwich. Perfect for statue repair.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3169", + "name": "Stuffed monkey", + "examine": "A body of a dead monkey, tastefully stuffed with seaweed.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3170", + "name": "Bronze spear(kp)", + "examine": "A bronze tipped spear.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "266", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,5,5,0,0,1,1,0,0,0,0,6,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3171", + "name": "Iron spear(kp)", + "examine": "An iron tipped spear.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "304", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,8,8,0,0,1,1,0,0,0,0,10,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3172", + "name": "Steel spear(kp)", + "examine": "A steel tipped spear.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "grand_exchange_price": "503", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,12,12,0,0,1,1,0,0,0,0,12,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,5}", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3173", + "name": "Mithril spear(kp)", + "examine": "A mithril tipped spear.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "368", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,1,1,0,0,0,0,18,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,20}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3174", + "name": "Adamant spear(kp)", + "examine": "An adamant tipped spear.", + "tradeable": "true", + "low_alchemy": "832", + "high_alchemy": "1248", + "grand_exchange_price": "1093", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "24,24,24,0,0,1,1,0,0,0,0,28,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,30}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3175", + "name": "Rune spear(kp)", + "examine": "A rune tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "grand_exchange_price": "12089", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "36,36,36,0,0,1,1,0,0,0,0,42,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,40}", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3176", + "name": "Dragon spear(kp)", + "examine": "A dragon tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24960", + "high_alchemy": "37440", + "grand_exchange_price": "37446", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,60}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3177", + "name": "Picture", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3178", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3179", + "name": "Monkey bones", + "examine": "These are small/medium sized monkey bones.", + "tradeable": "true", + "grand_exchange_price": "383", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3180", + "name": "Monkey bones", + "examine": "These are small/medium sized monkey bones.", + "tradeable": "true", + "grand_exchange_price": "383", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3181", + "name": "Monkey bones", + "examine": "These are small/medium sized monkey bones.", + "tradeable": "true", + "grand_exchange_price": "383", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3182", + "name": "Monkey bones", + "examine": "These are small/medium sized monkey bones.", + "tradeable": "true", + "grand_exchange_price": "383", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3183", + "name": "Monkey bones", + "examine": "These are small/medium sized monkey bones.", + "tradeable": "true", + "grand_exchange_price": "588", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3184", + "name": "Monkey bones", + "tradeable": "true", + "grand_exchange_price": "588", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3185", + "name": "Monkey bones", + "examine": "These are small/medium sized monkey bones.", + "tradeable": "true", + "grand_exchange_price": "383", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3186", + "name": "Monkey bones", + "examine": "These are small/medium sized monkey bones.", + "tradeable": "true", + "grand_exchange_price": "383", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3187", + "name": "Bones", + "tradeable": "true", + "shop_price": "140", + "grand_exchange_price": "140", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3188", + "name": "Cleaning cloth", + "examine": "A piece of silk which can be used to remove poison from weapons.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "60", + "grand_exchange_price": "286", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3189", + "name": "Cleaning cloth", + "tradeable": "true", + "grand_exchange_price": "286", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3190", + "name": "Bronze halberd", + "examine": "A bronze halberd.", + "tradeable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "shop_price": "104", + "grand_exchange_price": "522", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "7,8,0,-4,0,-1,1,2,0,0,0,8,0,0,0", + "weapon_interface": "15", + "two_handed": "true", + "attack_anims": "440,440,412,440", + "defence_anim": "430", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3191", + "name": "Bronze halberd", + "tradeable": "true", + "grand_exchange_price": "522", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3192", + "name": "Iron halberd", + "examine": "An iron halberd.", + "tradeable": "true", + "low_alchemy": "145", + "high_alchemy": "218", + "shop_price": "364", + "grand_exchange_price": "124", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "9,12,0,-4,0,-1,1,2,0,0,0,12,0,0,0", + "weapon_interface": "15", + "two_handed": "true", + "attack_anims": "440,440,412,440", + "defence_anim": "430", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3193", + "name": "Iron halberd", + "tradeable": "true", + "grand_exchange_price": "124", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3194", + "name": "Steel halberd", + "examine": "A steel halberd.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1300", + "grand_exchange_price": "726", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "14,19,0,-4,0,-1,2,3,0,0,0,20,0,0,0", + "weapon_interface": "15", + "two_handed": "true", + "attack_anims": "440,440,412,440", + "defence_anim": "430", + "requirements": "{0,5}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3195", + "name": "Steel halberd", + "tradeable": "true", + "grand_exchange_price": "726", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3196", + "name": "Black halberd", + "examine": "A black halberd.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "2496", + "grand_exchange_price": "4344", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "19,25,0,-4,0,-1,2,3,0,0,0,20,0,0,0", + "weapon_interface": "15", + "two_handed": "true", + "attack_anims": "440,440,412,440", + "defence_anim": "430", + "requirements": "{0,5}-{2,10}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3197", + "name": "Black halberd", + "tradeable": "true", + "grand_exchange_price": "4344", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3198", + "name": "Mithril halberd", + "examine": "A mithril halberd.", + "tradeable": "true", + "low_alchemy": "1352", + "high_alchemy": "2028", + "shop_price": "3380", + "grand_exchange_price": "6995", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "22,28,0,-4,0,-1,2,4,0,0,0,29,0,0,0", + "weapon_interface": "15", + "two_handed": "true", + "attack_anims": "440,440,412,440", + "defence_anim": "430", + "requirements": "{0,20}-{2,10}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3199", + "name": "Mithril halberd", + "tradeable": "true", + "grand_exchange_price": "6995", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3200", + "name": "Adamant halberd", + "examine": "An adamant halberd.", + "tradeable": "true", + "low_alchemy": "3328", + "high_alchemy": "4992", + "shop_price": "8320", + "grand_exchange_price": "4690", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "28,41,0,-4,0,-1,3,4,0,0,0,42,0,0,0", + "weapon_interface": "15", + "two_handed": "true", + "attack_anims": "440,440,412,440", + "defence_anim": "430", + "requirements": "{0,30}-{2,15}", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3201", + "name": "Adamant halberd", + "tradeable": "true", + "grand_exchange_price": "4690", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3202", + "name": "Rune halberd", + "examine": "A rune halberd.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "51200", + "high_alchemy": "76800", + "shop_price": "128000", + "grand_exchange_price": "77100", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "48,67,0,-4,0,-1,4,5,0,0,0,68,0,0,0", + "weapon_interface": "15", + "two_handed": "true", + "attack_anims": "440,440,412,440", + "defence_anim": "430", + "requirements": "{0,40}-{2,20}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3203", + "name": "Rune halberd", + "tradeable": "true", + "grand_exchange_price": "77100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3204", + "name": "Dragon halberd", + "examine": "A dragon halberd.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "130000", + "high_alchemy": "195000", + "shop_price": "325000", + "grand_exchange_price": "201000", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "70,95,0,-4,0,-1,4,5,0,0,0,89,0,0,0", + "weapon_interface": "15", + "has_special": "true", + "two_handed": "true", + "attack_anims": "440,440,412,440", + "defence_anim": "430", + "requirements": "{0,60}-{2,30}", + "weight": "3.1", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3205", + "name": "Dragon halberd", + "tradeable": "true", + "grand_exchange_price": "201000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3206", + "name": "King's message", + "examine": "A summons from King Lathas.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3207", + "name": "Iorwerths message", + "examine": "A letter for King Lathas from Lord Iorwerth.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3208", + "name": "Crystal pendant", + "examine": "Lord Iorwerth's crystal pendant.", + "low_alchemy": "4", + "high_alchemy": "6", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3209", + "name": "Sulphur", + "examine": "A piece of chemical formation.", + "weight": "0.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3211", + "name": "Limestone", + "examine": "Some limestone.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "4", + "grand_exchange_price": "238", + "weight": "2.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3212", + "name": "Limestone", + "tradeable": "true", + "grand_exchange_price": "238", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3213", + "name": "Quicklime", + "examine": "Some quicklime.", + "low_alchemy": "1", + "high_alchemy": "2", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3214", + "name": "Pot of quicklime", + "examine": "A pot of ground quicklime.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3215", + "name": "Ground sulphur", + "examine": "A pile of ground sulphur.", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "160", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3216", + "name": "Barrel", + "examine": "An empty barrel/A Splendid barrel.", + "tradeable": "true", + "grand_exchange_price": "207", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3217", + "name": "Barrel", + "tradeable": "true", + "grand_exchange_price": "207", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3218", + "name": "Barrel bomb", + "examine": "A fused barrel full of fire oil.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3219", + "name": "Barrel bomb", + "examine": "A fused barrel full of fire oil.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3220", + "name": "Barrel of coal-tar", + "examine": "A barrel full of coal-tar.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3221", + "name": "Barrel of naphtha", + "examine": "A barrel full of naphtha.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3222", + "name": "Naphtha mix", + "examine": "A barrel full of naphtha and sulphur./A barrel full of naphtha and quicklime.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3223", + "name": "Naphtha mix", + "examine": "A barrel full of naphtha and sulphur./A barrel full of naphtha and quicklime.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3224", + "name": "Strip of cloth", + "examine": "A strip of cloth.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3226", + "name": "Raw rabbit", + "examine": "Might taste better cooked.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "67", + "grand_exchange_price": "312", + "weight": "0.1", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3227", + "name": "Raw rabbit", + "tradeable": "true", + "grand_exchange_price": "312", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3228", + "name": "Cooked rabbit", + "examine": "Mmm this looks tasty.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "11", + "shop_price": "19", + "grand_exchange_price": "35", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3229", + "name": "Cooked rabbit", + "tradeable": "true", + "grand_exchange_price": "35", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3230", + "name": "Big book of bangs", + "examine": "A book by Mel Achy.", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3232", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3234", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3236", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3238", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3239", + "name": "Bark", + "examine": "Bark from a hollow tree.", + "tradeable": "true", + "grand_exchange_price": "23", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3240", + "name": "Bark", + "tradeable": "true", + "grand_exchange_price": "23", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3241", + "name": "Man", + "examine": "One of RuneScape's many citizens. In Karamja or South of Falador: One of RuneScape's many citizens, apparently trying to be an explorer. In Lumbridge: One of Lumbridge's many citizens. In a Falador home: One of RuneScape's many citizens. He looks worried ", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3243", + "name": "Farmer", + "examine": "He grows crops in the area.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3247", + "name": "Rogue", + "examine": "Rogueish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3249", + "name": "Guard", + "examine": "Varies, refer below.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3251", + "name": "Knight of ardougne", + "examine": "A member of Ardougne's militia.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3253", + "name": "Watchman", + "examine": "The strong arm of the law.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3255", + "name": "Paladin", + "examine": "A holy warrior.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3259", + "name": "Hero", + "examine": "Heroic!", + "attack_speed": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3261", + "name": "Goutweed", + "examine": "A pale, tough looking herb.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3262", + "name": "Troll thistle", + "examine": "It's tough and spiky.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3263", + "name": "Dried thistle", + "examine": "It'll be easier to grind now.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3264", + "name": "Ground thistle", + "examine": "It's ready for mixing.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3265", + "name": "Troll potion", + "examine": "It's part of Eadgar's plan.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3266", + "name": "Drunk parrot", + "examine": "It's rather drunk.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3267", + "name": "Dirty robe", + "examine": "It's dirty and smelly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3268", + "name": "Fake man", + "examine": "It's good enough to fool a troll.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3269", + "name": "Storeroom key", + "examine": "The key to the Trollheim storeroom.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3270", + "name": "Alco-chunks", + "examine": "Pineapple chunks dipped in a strong liquor.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3325", + "name": "Vampire dust", + "examine": "That used to be a vampyre!", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "381", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3326", + "name": "Vampire dust", + "tradeable": "true", + "grand_exchange_price": "381", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3327", + "name": "Myre snelm", + "examine": "An easy-to-make, marshy-coloured, Mort Myre snail shell helmet.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "56", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,0,0,0,0,0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3328", + "name": "Myre snelm", + "tradeable": "true", + "grand_exchange_price": "56", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3329", + "name": "Blood'n'tar snelm", + "examine": "Rounded: A red and black snail shell helmet. Pointed: A red and black pointed snail shell helmet.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "291", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,0,0,0,0,0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3330", + "name": "Blood'n'tar snelm", + "tradeable": "true", + "grand_exchange_price": "291", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3331", + "name": "Ochre snelm", + "examine": "An easy-to-make, muddy-yellow, Mort Myre snail shell helmet.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "57", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3332", + "name": "Ochre snelm", + "tradeable": "true", + "grand_exchange_price": "57", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3333", + "name": "Bruise blue snelm", + "examine": "A moody blue snail shell helmet, mort myre snail shell helm", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "73", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,0,0,0,0,0", + "weight": "1.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3334", + "name": "Bruise blue snelm", + "tradeable": "true", + "grand_exchange_price": "73", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3335", + "name": "Broken bark snelm", + "examine": "An easy-to-make, orange-and-bark coloured, Mort Myre snail shell helmet.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "63", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,0,0,0,0,0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3336", + "name": "Broken bark snelm", + "tradeable": "true", + "grand_exchange_price": "63", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3337", + "name": "Myre snelm", + "examine": "An easy-to-make, marshy-coloured, Mort Myre snail shell helmet.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "58", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,0,0,0,0,0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3338", + "name": "Myre snelm", + "tradeable": "true", + "grand_exchange_price": "58", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3339", + "name": "Blood'n'tar snelm", + "examine": "Rounded: A red and black snail shell helmet. Pointed: A red and black pointed snail shell helmet.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "147", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,0,0,0,0,0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3340", + "name": "Blood'n'tar snelm", + "tradeable": "true", + "grand_exchange_price": "147", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3341", + "name": "Ochre snelm", + "examine": "An easy-to-make, muddy-yellow, Mort Myre snail shell helmet.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "54", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3342", + "name": "Ochre snelm", + "tradeable": "true", + "grand_exchange_price": "54", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3343", + "name": "Bruise blue snelm", + "examine": "A moody blue snail shell helmet, mort myre snail shell helm", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "248", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,0,0,0,0,0", + "weight": "1.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3344", + "name": "Bruise blue snelm", + "tradeable": "true", + "grand_exchange_price": "248", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3345", + "name": "Blamish myre shell", + "examine": "An easy-to-make, 'myre'-coloured, Mort Myre snail shell; looks protective.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "155", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3346", + "name": "Blamish myre shell", + "tradeable": "true", + "grand_exchange_price": "155", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3347", + "name": "Blamish red shell", + "examine": "An easy-to-make, red, Mort myre snail shell; looks protective.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "590", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3348", + "name": "Blamish red shell", + "tradeable": "true", + "grand_exchange_price": "590", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3349", + "name": "Blamish ochre shell", + "examine": "An easy-to-make, muddy-yellow, Mort Myre snail shell; looks protective.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "134", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3350", + "name": "Blamish ochre shell", + "tradeable": "true", + "grand_exchange_price": "134", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3351", + "name": "Blamish blue shell", + "examine": "An easy-to-make, blue, Mort Myre snail shell; looks protective.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "230", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3352", + "name": "Blamish blue shell", + "tradeable": "true", + "grand_exchange_price": "230", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3353", + "name": "Blamish bark shell", + "examine": "An easy-to-make, bark-coloured, Mort Myre snail shell; looks protective.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "195", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3354", + "name": "Blamish bark shell", + "tradeable": "true", + "grand_exchange_price": "195", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3355", + "name": "Blamish myre shell", + "examine": "An easy-to-make, 'myre'-coloured, Mort Myre snail shell; looks protective.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "145", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3356", + "name": "Blamish myre shell", + "tradeable": "true", + "grand_exchange_price": "145", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3357", + "name": "Blamish red shell", + "examine": "An easy-to-make, red, Mort myre snail shell; looks protective.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "614", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3358", + "name": "Blamish red shell", + "tradeable": "true", + "grand_exchange_price": "614", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3359", + "name": "Blamish ochre shell", + "examine": "An easy-to-make, muddy-yellow, Mort Myre snail shell; looks protective.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "173", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3360", + "name": "Blamish ochre shell", + "tradeable": "true", + "grand_exchange_price": "173", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3361", + "name": "Blamish blue shell", + "examine": "An easy-to-make, blue, Mort Myre snail shell; looks protective.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "874", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3362", + "name": "Blamish blue shell", + "tradeable": "true", + "grand_exchange_price": "874", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3363", + "name": "Thin snail", + "examine": "The thin, slimy corpse of a deceased giant snail.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "74", + "grand_exchange_price": "2047", + "weight": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3364", + "name": "Thin snail", + "tradeable": "true", + "grand_exchange_price": "2047", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3365", + "name": "Lean snail", + "examine": "The lean, slimy corspe of a dead snail.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "958", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3366", + "name": "Lean snail", + "tradeable": "true", + "grand_exchange_price": "958", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3367", + "name": "Fat snail", + "examine": "The fat, slimy, corpse of a deceased giant snail.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "160", + "grand_exchange_price": "971", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3368", + "name": "Fat snail", + "tradeable": "true", + "grand_exchange_price": "971", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3369", + "name": "Thin snail meat", + "examine": "A succulently slimy piece of sumptuous snail.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "833", + "weight": "3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3370", + "name": "Thin snail meat", + "tradeable": "true", + "grand_exchange_price": "833", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3371", + "name": "Lean snail meat", + "examine": "A succulently slimey slice of sumptuous snail.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "251", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3372", + "name": "Lean snail meat", + "tradeable": "true", + "grand_exchange_price": "251", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3373", + "name": "Fat snail meat", + "examine": "A succulently slimy slice of sumptuous snail.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "603", + "weight": "4.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3374", + "name": "Fat snail meat", + "tradeable": "true", + "grand_exchange_price": "603", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3376", + "name": "Burnt snail", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3377", + "name": "Sample bottle", + "examine": "An empty sample bottle.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3378", + "name": "Sample bottle", + "tradeable": "true", + "grand_exchange_price": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3379", + "name": "Slimy eel", + "examine": "A slime covered eel - yuck!", + "tradeable": "true", + "grand_exchange_price": "358", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3380", + "name": "Slimy eel", + "tradeable": "true", + "grand_exchange_price": "358", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3381", + "name": "Cooked slimy eel", + "examine": "A cooked slimy eel - not delicious, but pretty nutritious.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "grand_exchange_price": "274", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3382", + "name": "Cooked slimy eel", + "tradeable": "true", + "grand_exchange_price": "274", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3385", + "name": "Splitbark helm", + "examine": "A wooden helmet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "5993", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,3,-2,10,9,11,3,0,7,0,0,0,0", + "requirements": "{1,40}-{6,40}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3386", + "name": "Splitbark helm", + "tradeable": "true", + "grand_exchange_price": "5993", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3387", + "name": "Splitbark body", + "examine": "Provides good protection.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "grand_exchange_price": "26700", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,10,-10,36,26,42,15,0,40,0,0,0,0", + "requirements": "{1,40}-{6,40}", + "weight": "4.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3388", + "name": "Splitbark body", + "tradeable": "true", + "grand_exchange_price": "26700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3389", + "name": "Splitbark legs", + "examine": "These should protect my legs.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16000", + "high_alchemy": "24000", + "grand_exchange_price": "43700", + "equipment_slot": "7", + "absorb": "4,2,0", + "bonuses": "0,0,0,7,-7,22,20,25,10,0,15,0,0,0,0", + "requirements": "{1,40}-{6,40}", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3390", + "name": "Splitbark legs", + "tradeable": "true", + "grand_exchange_price": "43700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3391", + "name": "Splitbark gauntlets", + "examine": "These should keep my hands safe.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "grand_exchange_price": "2786", + "equipment_slot": "9", + "bonuses": "0,0,0,2,-1,3,2,4,2,0,3,0,0,0,0", + "requirements": "{1,40}-{6,40}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3392", + "name": "Splitbark gauntlets", + "tradeable": "true", + "grand_exchange_price": "2786", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3393", + "name": "Splitbark boots", + "examine": "Wooden foot protection.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "grand_exchange_price": "3808", + "equipment_slot": "10", + "bonuses": "0,0,0,2,-1,3,2,4,2,0,9,0,0,0,0", + "requirements": "{1,40}-{6,40}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3394", + "name": "Splitbark boots", + "tradeable": "true", + "grand_exchange_price": "3808", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3396", + "name": "Loar remains", + "examine": "The remains of a deadly shade.", + "tradeable": "true", + "grand_exchange_price": "18", + "weight": "1.35", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3397", + "name": "Loar remains", + "tradeable": "true", + "grand_exchange_price": "18", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3398", + "name": "Phrin remains", + "examine": "The remains of a deadly shade.", + "tradeable": "true", + "grand_exchange_price": "249", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3399", + "name": "Phrin remains", + "tradeable": "true", + "grand_exchange_price": "249", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3400", + "name": "Riyl remains", + "examine": "The remains of a deadly shade.", + "tradeable": "true", + "grand_exchange_price": "138", + "weight": "1.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3401", + "name": "Riyl remains", + "tradeable": "true", + "grand_exchange_price": "138", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3402", + "name": "Asyn remains", + "examine": "The remains of a deadly shade.", + "tradeable": "true", + "grand_exchange_price": "334", + "weight": "1.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3403", + "name": "Asyn remains", + "tradeable": "true", + "grand_exchange_price": "334", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3404", + "name": "Fiyr remains", + "examine": "The remains of a deadly shade.", + "tradeable": "true", + "grand_exchange_price": "5264", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3405", + "name": "Fiyr remains", + "tradeable": "true", + "grand_exchange_price": "5264", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3406", + "name": "Ash potion(unf)", + "examine": "I need another ingredient to finish this potion.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "137", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3407", + "name": "Ash potion(unf)", + "tradeable": "true", + "grand_exchange_price": "137", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3408", + "name": "Serum 207 (4)", + "examine": "X doses serum 207 as described in Herbi Flax's diary.", + "low_alchemy": "5", + "high_alchemy": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3410", + "name": "Serum 207 (3)", + "examine": "X doses serum 207 as described in Herbi Flax's diary.", + "low_alchemy": "5", + "high_alchemy": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3412", + "name": "Serum 207 (2)", + "examine": "X doses serum 207 as described in Herbi Flax's diary.", + "low_alchemy": "5", + "high_alchemy": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3414", + "name": "Serum 207 (1)", + "examine": "X doses serum 207 as described in Herbi Flax's diary.", + "low_alchemy": "5", + "high_alchemy": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3416", + "name": "Serum 208 (4)", + "examine": "X doses permanent serum 208 as described in Herbi Flax's diary.", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "208", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3417", + "name": "Serum 208 (3)", + "examine": "X doses permanent serum 208 as described in Herbi Flax's diary.", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "208", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3418", + "name": "Serum 208 (2)", + "examine": "X doses permanent serum 208 as described in Herbi Flax's diary.", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "208", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3419", + "name": "Serum 208 (1)", + "examine": "X doses permanent serum 208 as described in Herbi Flax's diary.", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "208", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3420", + "name": "Limestone brick", + "examine": "A well carved limestone brick.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "21", + "grand_exchange_price": "178", + "weight": "1.3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3421", + "name": "Limestone brick", + "tradeable": "true", + "grand_exchange_price": "178", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3422", + "name": "Olive oil(4)", + "examine": "X doses of olive oil.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "26", + "grand_exchange_price": "678", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3423", + "name": "Olive oil(4)", + "tradeable": "true", + "grand_exchange_price": "678", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3424", + "name": "Olive oil(3)", + "examine": "X doses of olive oil.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "26", + "grand_exchange_price": "413", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3425", + "name": "Olive oil(3)", + "tradeable": "true", + "grand_exchange_price": "413", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3426", + "name": "Olive oil(2)", + "examine": "X doses of olive oil.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "26", + "grand_exchange_price": "173", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3427", + "name": "Olive oil(2)", + "tradeable": "true", + "grand_exchange_price": "173", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3428", + "name": "Olive oil(1)", + "examine": "X doses of olive oil.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "26", + "grand_exchange_price": "110", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3429", + "name": "Olive oil(1)", + "tradeable": "true", + "grand_exchange_price": "110", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3430", + "name": "Sacred oil(4)", + "examine": "Sacred oil.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "3587", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3431", + "name": "Sacred oil(4)", + "tradeable": "true", + "grand_exchange_price": "3587", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3432", + "name": "Sacred oil(3)", + "examine": "Sacred oil.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "2596", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3433", + "name": "Sacred oil(3)", + "tradeable": "true", + "grand_exchange_price": "2596", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3434", + "name": "Sacred oil(2)", + "examine": "Sacred oil.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "1713", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3435", + "name": "Sacred oil(2)", + "tradeable": "true", + "grand_exchange_price": "1713", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3436", + "name": "Sacred oil(1)", + "examine": "Sacred oil.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "1846", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3437", + "name": "Sacred oil(1)", + "tradeable": "true", + "grand_exchange_price": "1846", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3438", + "name": "Pyre logs", + "examine": "Funeral logs used for burning loars.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "853", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3439", + "name": "Pyre logs", + "tradeable": "true", + "grand_exchange_price": "853", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3440", + "name": "Oak pyre logs", + "examine": "Oak logs prepared with sacred oil for a funeral pyre.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "1122", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3441", + "name": "Oak pyre logs", + "tradeable": "true", + "grand_exchange_price": "1122", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3442", + "name": "Willow pyre logs", + "examine": "Willow logs prepared with sacred oil for a funeral pyre.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "1164", + "weight": "1.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3443", + "name": "Willow pyre logs", + "tradeable": "true", + "grand_exchange_price": "1164", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3444", + "name": "Maple pyre logs", + "examine": "Maple logs prepared with sacred oil for a funeral pyre.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "grand_exchange_price": "3313", + "weight": "1.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3445", + "name": "Maple pyre logs", + "tradeable": "true", + "grand_exchange_price": "3313", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3446", + "name": "Yew pyre logs", + "examine": "Yew logs prepared with sacred oil for a funeral pyre.", + "tradeable": "true", + "low_alchemy": "192", + "high_alchemy": "288", + "grand_exchange_price": "4424", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3447", + "name": "Yew pyre logs", + "tradeable": "true", + "grand_exchange_price": "4424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3448", + "name": "Magic pyre logs", + "examine": "Magic logs prepared with sacred oil for a funeral pyre.", + "tradeable": "true", + "low_alchemy": "256", + "high_alchemy": "384", + "grand_exchange_price": "5611", + "weight": "1.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3449", + "name": "Magic pyre logs", + "tradeable": "true", + "grand_exchange_price": "5611", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3450", + "name": "Bronze key red", + "examine": "A bronze key with a blood-red painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3451", + "name": "Bronze key brown", + "examine": "A bronze key with a brown painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3452", + "name": "Bronze key crimson", + "examine": "A bronze key with a crimson painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3453", + "name": "Bronze key black", + "examine": "A bronze key with a black painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3454", + "name": "Bronze key purple", + "examine": "A bronze key with a purple painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3455", + "name": "Steel key red", + "examine": "A steel key with a blood-red painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3456", + "name": "Steel key brown", + "examine": "A steel key with a brown painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3457", + "name": "Steel key crimson", + "examine": "A steel key with a crimson painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3458", + "name": "Steel key black", + "examine": "A steel key with a black painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3459", + "name": "Steel key purple", + "examine": "A steel key with a purple painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3460", + "name": "Black key red", + "examine": "A black key with a blood-red painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3461", + "name": "Black key brown", + "examine": "A black key with a brown painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3462", + "name": "Black key crimson", + "examine": "A black key with a crimson painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3463", + "name": "Black key black", + "examine": "A black key with a black painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3464", + "name": "Black key purple", + "examine": "A black key with a purple painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3465", + "name": "Silver key red", + "examine": "A silver key with a blood-red painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3466", + "name": "Silver key brown", + "examine": "A silver key with a brown painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3467", + "name": "Silver key crimson", + "examine": "A silver key with a crimson painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3468", + "name": "Silver key black", + "examine": "A silver key with a black painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3469", + "name": "Silver key purple", + "examine": "A silver key with a purple painted eyelet. (Shades of Mort'ton)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3470", + "name": "Fine cloth", + "examine": "Amazingly untouched by time.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "956", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3471", + "name": "Fine cloth", + "tradeable": "true", + "grand_exchange_price": "956", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3472", + "name": "Black plateskirt (t)", + "examine": "Black plateskirt with trim.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "grand_exchange_price": "3077", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,21,20,19,-4,20,3,0,0,0,0", + "requirements": "{1,10}", + "weight": "8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3473", + "name": "Black plateskirt (g)", + "examine": "Black plateskirt with gold trim.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "grand_exchange_price": "10600", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,21,20,19,-4,20,3,0,0,0,0", + "requirements": "{1,10}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3474", + "name": "Adam plateskirt (t)", + "examine": "Adamant plateskirt with trim.", + "tradeable": "true", + "low_alchemy": "2560", + "high_alchemy": "3840", + "grand_exchange_price": "4403", + "equipment_slot": "7", + "absorb": "1,0,3", + "bonuses": "0,0,0,-21,-7,33,31,29,-4,31,10,0,0,0,0", + "requirements": "{1,30}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3475", + "name": "Adam plateskirt (g)", + "examine": "Adamant plateskirt with gold trim.", + "tradeable": "true", + "low_alchemy": "2560", + "high_alchemy": "3840", + "grand_exchange_price": "11000", + "equipment_slot": "7", + "absorb": "1,0,3", + "bonuses": "0,0,0,-21,-7,33,31,29,-4,31,10,0,0,0,0", + "requirements": "{1,30}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3476", + "name": "Rune plateskirt (g)", + "examine": "Rune plateskirt with gold trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "42500", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3477", + "name": "Rune plateskirt (t)", + "examine": "Rune plateskirt with trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "shop_price": "81280", + "grand_exchange_price": "38300", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "requirements": "{1,40}", + "weight": "8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3478", + "name": "Zamorak plateskirt", + "examine": "Rune plateskirt in the colours of Zamorak.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "42000", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,1,0,1", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3479", + "name": "Saradomin plateskirt", + "examine": "Rune plateskirt in the colours of Saradomin.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "44000", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,1,0,1", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3480", + "name": "Guthix plateskirt", + "examine": "Rune plateskirt in the colours of Guthix.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "39100", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,1,0,0", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3481", + "name": "Gilded platebody", + "examine": "Rune platebody with complete gold trim & plating.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "2500000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "10", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3482", + "name": "Gilded platebody", + "tradeable": "true", + "grand_exchange_price": "2500000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3483", + "name": "Gilded platelegs", + "examine": "Rune platelegs with gold plate.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "2200000", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3484", + "name": "Gilded platelegs", + "tradeable": "true", + "grand_exchange_price": "2200000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3485", + "name": "Gilded plateskirt", + "examine": "Rune plateskirt with gold plate.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "162300", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3486", + "name": "Gilded full helm", + "examine": "Rune full helmet with gold plate.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "477200", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3487", + "name": "Gilded full helm", + "tradeable": "true", + "grand_exchange_price": "477200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3488", + "name": "Gilded kiteshield", + "examine": "Rune kiteshield with gold plate.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "515400", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3489", + "name": "Gilded kiteshield", + "tradeable": "true", + "grand_exchange_price": "515400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3490", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3491", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3492", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3493", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3494", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3495", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3496", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3497", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3498", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3499", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3500", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3501", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3502", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3503", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3504", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3505", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3506", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3507", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3508", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3509", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3510", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3511", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3512", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3513", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3514", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3515", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3516", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3517", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3518", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3519", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3520", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3521", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3522", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3523", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3524", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3525", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3526", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3527", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3528", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3529", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3530", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3531", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3532", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3533", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3534", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3535", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3536", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3537", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3538", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3539", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3540", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3541", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3542", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3543", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3544", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3545", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3546", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3547", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3548", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3549", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3550", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3551", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3552", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3553", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3554", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3555", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3556", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3557", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3558", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3559", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3560", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3561", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3562", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3563", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3564", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3565", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3566", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3567", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3568", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3569", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3570", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3571", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3572", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3573", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3574", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3575", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3576", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3577", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3578", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3579", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3580", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3581", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3582", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3583", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3584", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3585", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3586", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3587", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3588", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3589", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3590", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3591", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3592", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3593", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3594", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3595", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3596", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3597", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3598", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3599", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3600", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3601", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3602", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3603", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3604", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3605", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3607", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3609", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3610", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3611", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3612", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3613", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3614", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3615", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3616", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3617", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3618", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3668", + "name": "Black plateskirt (t)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3669", + "name": "Black plateskirt (g)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3670", + "name": "Adam plateskirt (t)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3671", + "name": "Adam plateskirt (g)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3672", + "name": "Rune plateskirt (g)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3673", + "name": "Rune plateskirt (t)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3674", + "name": "Zamorak plateskirt", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3675", + "name": "Saradomin plateskirt", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3676", + "name": "Guthix plateskirt", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3677", + "name": "Gilded plateskirt", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3678", + "name": "Flamtaer hammer", + "examine": "An exquisitely shaped tool specially designed for fixing temples.", + "low_alchemy": "5200", + "high_alchemy": "7800", + "shop_price": "13000", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3685", + "name": "Picture", + "examine": "A sealed letter of recommendation.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3688", + "name": "Unstrung lyre", + "examine": "It's almost a musical instrument.", + "equipment_slot": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3689", + "name": "Lyre", + "examine": "This will teleport me to Rellekka when I play it. A musical intrument that I can magically play.", + "low_alchemy": "400", + "high_alchemy": "600", + "equipment_slot": "3", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3690", + "name": "Enchanted lyre", + "examine": "This will teleport me to Rellekka when I play it. A musical intrument that I can magically play.", + "low_alchemy": "400", + "high_alchemy": "600", + "equipment_slot": "3", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3691", + "name": "Enchanted lyre(1)", + "examine": "This will teleport me to Rellekka when I play it. A musical intrument that I can magically play.", + "low_alchemy": "400", + "high_alchemy": "600", + "equipment_slot": "3", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3692", + "name": "Branch", + "examine": "I can use this to make a lyre.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3693", + "name": "Golden fleece", + "examine": "I can spin this into golden wool.", + "shop_price": "1000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3694", + "name": "Golden wool", + "examine": "I can use this to make a lyre.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3695", + "name": "Pet rock", + "examine": "The lowest maintenance pet you will ever have.", + "stand_anim": "6657", + "stand_turn_anim": "6661", + "walk_anim": "6658", + "run_anim": "6660", + "turn180_anim": "6659", + "turn90cw_anim": "6662", + "turn90ccw_anim": "6663", + "render_anim": "792", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3696", + "name": "Hunters' talisman", + "examine": "Talisman to bind the Draugen.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3697", + "name": "Hunters' talisman", + "examine": "Talisman to bind the Draugen.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3698", + "name": "Exotic flower", + "examine": "Some flowers from a distant land.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3699", + "name": "Fremennik ballad", + "examine": "A hauntingly beautiful love ballad.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3700", + "name": "Sturdy boots", + "examine": "A pair of sturdy made custom boots.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3701", + "name": "Tracking map", + "examine": "Could probably be a bit clearer?", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3702", + "name": "Custom bow string", + "examine": "A finely crafted string for a custom bow", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3703", + "name": "Unusual fish", + "examine": "An extremely odd, non-edible fish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3704", + "name": "Sea fishing map", + "examine": "Map showing the best fishing spots out at sea.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3705", + "name": "Weather forecast", + "examine": "An estimate of expected local weather conditions.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3706", + "name": "Champions token", + "examine": "Shows the wearer is worthy of the Champions table.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3707", + "name": "Legendary cocktail", + "examine": "Probably the greatest cocktail in the world.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3708", + "name": "Fiscal statement", + "examine": "A signed statement promising a reduction on sales tax.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3709", + "name": "Promissory note", + "examine": "A legally binding contract promising not to enter the longhall.", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3710", + "name": "Warriors' contract", + "examine": "This employment contract is for a warrior to act as a bodyguard.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3711", + "name": "Keg of beer", + "examine": "A lot of beer in a barrel.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "325", + "grand_exchange_price": "1555", + "weight": "20", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3712", + "name": "Low alcohol keg", + "examine": "Suspiciously close to beer, but without the side effects.", + "weight": "20", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3713", + "name": "Strange object", + "examine": "It's some kind of weird little parcel thing.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3714", + "name": "Lit strange object", + "examine": "It's some kind of weird little parcel thing.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3715", + "name": "Picture", + "examine": "A red coloured disk, apparently made out of wood.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3716", + "name": "Picture", + "examine": "A red coloured disk, apparently made out of wood.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3718", + "name": "Magnet", + "examine": "A very attractive magnet.", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3719", + "name": "Thread", + "examine": "Some blue thread.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3720", + "name": "Pick", + "examine": "A small pick for cracking small objects.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3721", + "name": "Ship toy", + "examine": "Might be fun to play with in the bath.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3722", + "name": "Full bucket", + "examine": "It's a bucket of salty water.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3723", + "name": "4/5ths full bucket", + "examine": "This bucket is eighty percent full. It has a 5 painted on its side.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3724", + "name": "3/5ths full bucket", + "examine": "This bucket is sixty percent full. It has a 5 painted on its side.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3725", + "name": "2/5ths full bucket", + "examine": "This bucket is forty percent full. It has a 5 painted on its side.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3726", + "name": "1/5ths full bucket", + "examine": "This bucket is twenty percent full. It has a 5 painted on its side.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3727", + "name": "Empty bucket", + "examine": "It's an empty bucket.", + "tradeable": "true", + "high_alchemy": "1", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "2", + "grand_exchange_price": "50", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3728", + "name": "Frozen bucket", + "examine": "This bucket of water is frozen solid.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3729", + "name": "Full jug", + "examine": "This jug is completely full. It has a 3 painted on its side.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3730", + "name": "2/3rds full jug", + "examine": "This jug is two thirds full. It has a 3 painted on its side.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3731", + "name": "1/3rds full jug", + "examine": "This jug is one third full. It has a 3 painted on its side.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3732", + "name": "Empty jug", + "examine": "This jug is empty.", + "tradeable": "true", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "1", + "grand_exchange_price": "164", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3733", + "name": "Frozen jug", + "examine": "This jug of water is frozen solid.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3734", + "name": "Vase", + "examine": "An unusually shaped vase. You can see something glinting inside.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3735", + "name": "Vase of water", + "examine": "An unusually shaped vase full of water. You can see something glinting inside.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3736", + "name": "Frozen vase", + "examine": "An unusually shaped vase full of ice. You can see something glinting inside.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3737", + "name": "Vase lid", + "examine": "This looks like a lid to some kind of container.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3738", + "name": "Sealed vase", + "examine": "The lid is screwed on tightly. ", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3739", + "name": "Sealed vase", + "examine": "The lid is screwed on tightly. It is full of water.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3740", + "name": "Sealed vase", + "examine": "The lid is screwed on tightly. It is very cold. ", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3741", + "name": "Frozen key", + "examine": "A small, cold key.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3742", + "name": "Red herring", + "examine": "The colouring on it seems to be some kind of sticky goop.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3743", + "name": "Red disk", + "examine": "A red coloured disk, apparently made out of wood.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3744", + "name": "Wooden disk", + "examine": "A simple looking disk made of wood.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3745", + "name": "Seer's key", + "examine": "The key to leave the Seer's house.", + "destroy": "true", + "tradeable": "false", + "shop_price": "27", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3746", + "name": "Sticky red goop", + "examine": "Yup, it's sticky, it's red and it's goop.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3747", + "name": "Sticky red goop", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3748", + "name": "Fremennik helm", + "examine": "A sturdy helm worn only by Fremennik clan members.", + "low_alchemy": "2600", + "high_alchemy": "3900", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3749", + "name": "Archer helm", + "examine": "This helmet is worn by archers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "48900", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "-5,-5,-5,-5,6,6,8,10,6,6,0,0,0,0,0", + "requirements": "{1,45}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3750", + "name": "Archer helm", + "tradeable": "true", + "grand_exchange_price": "48900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3751", + "name": "Berserker helm", + "examine": "This helmet is worn by berserkers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "60900", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-5,-5,31,29,33,0,30,7,3,0,0,0", + "requirements": "{1,45}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3752", + "name": "Berserker helm", + "tradeable": "true", + "grand_exchange_price": "60900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3753", + "name": "Warrior helm", + "examine": "This helm is worn by warriors.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "50700", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,5,0,-5,-5,31,33,29,0,30,7,0,0,0,0", + "requirements": "{1,45}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3754", + "name": "Warrior helm", + "tradeable": "true", + "grand_exchange_price": "50700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3755", + "name": "Farseer helm", + "examine": "This helm is worn by farseers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "47900", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "-5,-5,-5,6,-5,8,10,12,6,0,7,0,0,0,0", + "requirements": "{1,45}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3756", + "name": "Farseer helm", + "tradeable": "true", + "grand_exchange_price": "47900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3757", + "name": "Fremennik blade", + "examine": "A sword used only by Fremennik warriors.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "6,29,-2,0,0,0,1,0,0,0,0,28,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3758", + "name": "Fremennik shield", + "examine": "A shield worn by Fremennik warriors.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "destroy": "true", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3759", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "697", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3760", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "697", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3761", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "54", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3762", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "54", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3763", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "581", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3764", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "581", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3765", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "912", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3766", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "912", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3767", + "name": "Fremennik shirt", + "examine": "The latest in Fremennik fashion.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "325", + "grand_exchange_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3768", + "name": "Fremennik shirt", + "tradeable": "true", + "grand_exchange_price": "100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3769", + "name": "Fremennik shirt", + "examine": "The latest in Fremennik fashion.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "325", + "grand_exchange_price": "486", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3770", + "name": "Fremennik shirt", + "tradeable": "true", + "grand_exchange_price": "486", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3771", + "name": "Fremennik shirt", + "examine": "The latest in Fremennik fashion.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "325", + "grand_exchange_price": "242", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3772", + "name": "Fremennik shirt", + "tradeable": "true", + "grand_exchange_price": "242", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3773", + "name": "Fremennik shirt", + "examine": "The latest in Fremennik fashion.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "325", + "grand_exchange_price": "500", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3774", + "name": "Fremennik shirt", + "tradeable": "true", + "grand_exchange_price": "500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3775", + "name": "Fremennik shirt", + "examine": "The latest in Fremennik fashion.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "325", + "grand_exchange_price": "450", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3776", + "name": "Fremennik shirt", + "tradeable": "true", + "grand_exchange_price": "450", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3777", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "674", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3778", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "674", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3779", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "809", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3780", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "809", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3781", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "632", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3782", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "632", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3783", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "517", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3784", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "517", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3785", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "398", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3786", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "398", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3787", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "283", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3788", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "283", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3789", + "name": "Fremennik cloak", + "examine": "The latest fashion in Rellekka.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "grand_exchange_price": "966", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3790", + "name": "Fremennik cloak", + "tradeable": "true", + "grand_exchange_price": "966", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3791", + "name": "Fremennik boots", + "examine": "Very stylish!", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "shop_price": "650", + "grand_exchange_price": "205", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3792", + "name": "Fremennik boots", + "tradeable": "true", + "grand_exchange_price": "205", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3793", + "name": "Fremennik robe", + "examine": "The latest fashion of Rellekka.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "shop_price": "650", + "grand_exchange_price": "1191", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3794", + "name": "Fremennik robe", + "tradeable": "true", + "grand_exchange_price": "1191", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3795", + "name": "Fremennik skirt", + "examine": "The latest fashion of Rellekka.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "shop_price": "650", + "grand_exchange_price": "663", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3796", + "name": "Fremennik skirt", + "tradeable": "true", + "grand_exchange_price": "663", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3797", + "name": "Fremennik hat", + "examine": "A silly pointed hat.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "shop_price": "650", + "grand_exchange_price": "2380", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3798", + "name": "Fremennik hat", + "tradeable": "true", + "grand_exchange_price": "2380", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3799", + "name": "Gloves", + "grand_exchange_price": "172", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,1,0,0,0,0", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3800", + "name": "Gloves", + "tradeable": "true", + "grand_exchange_price": "172", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3801", + "name": "Keg of beer", + "examine": "A lot of beer in a barrel. Beer in a barrel - a specialty of the Fremennik Province.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "325", + "grand_exchange_price": "1817", + "weight": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3802", + "name": "Keg of beer", + "tradeable": "true", + "grand_exchange_price": "1817", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3803", + "name": "Beer", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "393", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3804", + "name": "Beer", + "tradeable": "true", + "grand_exchange_price": "393", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3805", + "name": "Tankard", + "examine": "A big cup for a big thirst.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "26", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3806", + "name": "Tankard", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3827", + "name": "Saradomin page 1", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "1400000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3828", + "name": "Saradomin page 2", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "686000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3829", + "name": "Saradomin page 3", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "522800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3830", + "name": "Saradomin page 4", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "629500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3831", + "name": "Zamorak page 1", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "7100000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3832", + "name": "Zamorak page 2", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "5400000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3833", + "name": "Zamorak page 3", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "4700000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3834", + "name": "Zamorak page 4", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "5900000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3835", + "name": "Guthix page 1", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "1200000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3836", + "name": "Guthix page 2", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "997100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3837", + "name": "Guthix page 3", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "953100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3838", + "name": "Guthix page 4", + "examine": "This seems to have been torn from a book...", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "1000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3839", + "name": "Damaged book", + "examine": "An incomplete book of Saradomin/Guthix/Zamorak/Bandos/ArmadylAn incomplete ancient book", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "5000", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,5,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3840", + "name": "Holy book", + "examine": "The Holy book of Saradomin.", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "5000", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,8,8,8,8,8,8,0,5,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3841", + "name": "Damaged book", + "examine": "An incomplete book of Saradomin/Guthix/Zamorak/Bandos/ArmadylAn incomplete ancient book", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "5000", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,5,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3842", + "name": "Unholy book", + "examine": "The unholy book of Zamorak.", + "low_alchemy": "80", + "high_alchemy": "120", + "equipment_slot": "5", + "bonuses": "8,8,8,8,8,0,0,0,0,0,0,0,5,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3843", + "name": "Damaged book", + "examine": "An incomplete book of Saradomin/Guthix/Zamorak/Bandos/ArmadylAn incomplete ancient book", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "5000", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,5,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3844", + "name": "Book of balance", + "examine": "The holy book of Guthix.", + "low_alchemy": "80", + "high_alchemy": "120", + "equipment_slot": "5", + "bonuses": "4,4,4,4,4,4,4,4,4,4,4,0,5,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3847", + "name": "Manual", + "examine": "Looks like some kind of manual.", + "destroy": "true", + "tradeable": "false", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3848", + "name": "Lighthouse key", + "examine": "A key to the front door of the lighthouse. (Horror from the Deep)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3849", + "name": "Rusty casket", + "examine": "Looks old and rusty...", + "destroy": "true", + "tradeable": "false", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3852", + "name": "Unholy symbol", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3853", + "name": "Games necklace(8)", + "examine": "An enchanted necklace.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "490", + "grand_exchange_price": "852", + "equipment_slot": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3854", + "name": "Games necklace(8)", + "tradeable": "true", + "grand_exchange_price": "852", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3855", + "name": "Games necklace(7)", + "examine": "An enchanted necklace.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "490", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3856", + "name": "Games necklace(7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3857", + "name": "Games necklace(6)", + "examine": "An enchanted necklace.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "490", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3858", + "name": "Games necklace(6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3859", + "name": "Games necklace(5)", + "examine": "An enchanted necklace.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "490", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3860", + "name": "Games necklace(5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3861", + "name": "Games necklace(4)", + "examine": "An enchanted necklace.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "490", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3862", + "name": "Games necklace(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3863", + "name": "Games necklace(3)", + "examine": "An enchanted necklace.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "490", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3864", + "name": "Games necklace(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3865", + "name": "Games necklace(2)", + "examine": "An enchanted necklace.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "490", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3866", + "name": "Games necklace(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3867", + "name": "Games necklace(1)", + "examine": "An enchanted necklace.", + "tradeable": "true", + "low_alchemy": "420", + "high_alchemy": "630", + "shop_price": "490", + "grand_exchange_price": "2093", + "equipment_slot": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3868", + "name": "Games necklace(1)", + "tradeable": "true", + "grand_exchange_price": "2093", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3893", + "name": "Stool", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3894", + "name": "Awful anthem", + "examine": "It's not very good.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3895", + "name": "Good anthem", + "examine": "Much better.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3896", + "name": "Treaty", + "examine": "Just needs the King's signature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3897", + "name": "Giant nib", + "examine": "For making a giant pen.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3898", + "name": "Giant pen", + "examine": "The king should be able to use this.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3899", + "name": "Iron sickle", + "examine": "Not as good as a pet frog.", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "15", + "equipment_slot": "3", + "bonuses": "0,0,0,0,0,0,1,1,1,1,0,1,0,0,0", + "weapon_interface": "6", + "weight": "1.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "3901", + "name": "Ghrim's book", + "examine": "Managing Thine Kingdom for Noobes by A. Ghrim.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4001", + "name": "Hardy gout tuber", + "examine": "A pile of gout tubers suitable for use in mountainous terrain.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4002", + "name": "Spare controls", + "examine": "It looks like some kind of control panel.", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4004", + "name": "Gnome royal seal", + "examine": "It's the official Gnome Royal Seal, signed by King Narode Shareen.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4005", + "name": "Narnode's orders", + "examine": "Unreadable orders handwritten by King Narnode Shareen.", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4006", + "name": "Monkey dentures", + "examine": "Magical monkey talking dentures! What more can we say? Ook!", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4007", + "name": "Enchanted bar", + "examine": "A gold bar with a talkative monkey spirit.", + "low_alchemy": "320", + "high_alchemy": "480", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4008", + "name": "Eye of gnome", + "examine": "It's... the eye of a gnome! Now what on earth could one do with this?", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4009", + "name": "Eye of gnome", + "examine": "It's... the eye of a gnome! Now what on earth could one do with this?", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4012", + "name": "Monkey nuts", + "examine": "They are Monkey Nuts. Yummy.", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4014", + "name": "Monkey bar", + "examine": "It's a monkey bar. It looks highly nutritious.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4016", + "name": "Banana stew", + "examine": "It's a bowl full of mushy banana", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4020", + "name": "M'amulet mould", + "examine": "It's an amulet mould shaped like a monkey head.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4021", + "name": "M'speak amulet", + "examine": "It's an unstrung Amulet of Monkey Speak. It makes vague chattering noises.", + "equipment_slot": "2", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4022", + "name": "M'speak amulet", + "examine": "It's an unstrung Amulet of Monkey Speak. It makes vague chattering noises.", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4023", + "name": "Monkey talisman", + "examine": "A magic talisman in shape of a monkey head.", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "weight": "1.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4024", + "name": "Monkey greegree", + "examine": "A magical talisman in the shape of a Karamjan monkey head.", + "low_alchemy": "200", + "high_alchemy": "300", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4025", + "name": "Monkey greegree", + "examine": "A magical talisman in the shape of a Karamjan monkey head.", + "low_alchemy": "200", + "high_alchemy": "300", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4026", + "name": "Monkey greegree", + "examine": "A magical talisman in the shape of a Karamjan monkey head.", + "low_alchemy": "200", + "high_alchemy": "300", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4027", + "name": "Monkey greegree", + "examine": "A magical talisman in the shape of a Karamjan monkey head.", + "low_alchemy": "200", + "high_alchemy": "300", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4028", + "name": "Monkey greegree", + "examine": "A magical talisman in the shape of a Karamjan monkey head.", + "low_alchemy": "200", + "high_alchemy": "300", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4029", + "name": "Monkey greegree", + "examine": "A magical talisman in the shape of a Karamjan monkey head.", + "low_alchemy": "200", + "high_alchemy": "300", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4030", + "name": "Monkey greegree", + "examine": "A magical talisman in the shape of a Karamjan monkey head.", + "low_alchemy": "200", + "high_alchemy": "300", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4031", + "name": "Monkey greegree", + "examine": "A magical talisman in the shape of a Karamjan monkey head.", + "low_alchemy": "200", + "high_alchemy": "300", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4032", + "name": "Dummy", + "examine": "I can train on this", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4034", + "name": "Monkey skull", + "examine": "It's a very ancient skull from some kind of ape.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4035", + "name": "10th squad sigil", + "examine": "It is the official sigil of the 10th squad of the Royal Guard.", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4037", + "name": "Saradomin banner", + "examine": "The Holy Team Standard", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4038", + "name": "Saradomin banner", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4039", + "name": "Zamorak banner", + "examine": "The Zamorak team's flag.", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4040", + "name": "Zamorak banner", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4041", + "name": "Hooded cloak", + "examine": "The colours of Saradomin/Zamorak.", + "destroy": "true", + "tradeable": "false", + "equipment_slot": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4042", + "name": "Hooded cloak", + "examine": "The colours of Saradomin/Zamorak.", + "destroy": "true", + "tradeable": "false", + "equipment_slot": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4044", + "name": "Rock", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4045", + "name": "Explosive potion", + "examine": "I could use this to destroy things...", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4046", + "name": "Explosive potion", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4047", + "name": "Climbing rope", + "examine": "A coil of rope.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4048", + "name": "Climbing rope", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4049", + "name": "Bandages", + "examine": "A box of bandages for healing.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4050", + "name": "Bandages", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4051", + "name": "Toolkit", + "examine": "Good for repairing a broken cannon.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4052", + "name": "Toolkit", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4053", + "name": "Barricade", + "examine": "Handy for hindering the enemy team's movement.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4054", + "name": "Barricade", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4055", + "name": "Castlewars manual", + "examine": "It's a manual for Castle Wars", + "shop_price": "5", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4067", + "name": "Castle wars ticket", + "examine": "I can exchange these for further items.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4068", + "name": "Decorative sword", + "examine": "A very decorative sword.", + "low_alchemy": "520", + "high_alchemy": "780", + "shop_price": "50", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "bonuses": "13,18,-2,0,0,0,3,2,0,0,0,16,0,0,0", + "weapon_interface": "6", + "requirements": "{0,5}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4069", + "name": "Decorative armour", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,32,31,24,-6,31,5,0,0,0,0", + "requirements": "{1,5}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4070", + "name": "Decorative armour", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,17,16,15,-4,16,2,0,0,0,0", + "requirements": "{1,5}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4071", + "name": "Decorative helm", + "examine": "A very decorative helm.", + "low_alchemy": "312", + "high_alchemy": "468", + "shop_price": "40", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,7,8,6,-1,7,3,0,0,0,0", + "requirements": "{1,5}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4072", + "name": "Decorative shield", + "examine": "A very decorative shield.", + "shop_price": "60", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "requirements": "{1,5}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4073", + "name": "Damp tinderbox", + "examine": "Not so useful for lighting a fire.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4074", + "name": "Damp tinderbox", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4075", + "name": "Glowing fungus", + "examine": "A bizarre fungus. It glows with a pale blue light.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4077", + "name": "Crystal-mine key", + "examine": "A key I found in the lower levels of the Morytanian mines. (Haunted Mine) / As the 'Innocent-looking key': A shiny key sitting quietly on a crate.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4078", + "name": "Zealot's key", + "examine": "I stole this from a Saradominist I met South of Mort'ton.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4079", + "name": "Yo-yo", + "examine": "A gift from Santa.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4081", + "name": "Salve amulet", + "examine": "Increases the wearer's strength and accuracy by 15% when fighting the undead.", + "low_alchemy": "75000", + "high_alchemy": "75000", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,3,3,3,0,0,3,0,3,0,0", + "weight": "0.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4082", + "name": "Salve shard", + "examine": "An unstrung crystal imbued with the power of Saradomin.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4083", + "name": "Sled", + "examine": "Unwaxed: It needs waxing before I can use it. Waxed: A waxed sled.", + "low_alchemy": "70", + "high_alchemy": "105", + "equipment_slot": "3", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4084", + "name": "Sled", + "examine": "Unwaxed: It needs waxing before I can use it. Waxed: A waxed sled.", + "low_alchemy": "70", + "high_alchemy": "105", + "stand_anim": "1461", + "stand_turn_anim": "1468", + "walk_anim": "1468", + "run_anim": "1468", + "turn180_anim": "1468", + "turn90cw_anim": "1468", + "turn90ccw_anim": "1468", + "render_anim": "1119", + "equipment_slot": "3", + "attack_speed": "4", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4085", + "name": "Wax", + "examine": "I can use this to wax my sled.", + "low_alchemy": "6", + "high_alchemy": "9", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4086", + "name": "Trollweiss", + "examine": "These pale flowers have a pungent odour.", + "low_alchemy": "2", + "high_alchemy": "3", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4087", + "name": "Dragon platelegs", + "examine": "Looks pretty heavy.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "108000", + "high_alchemy": "162000", + "grand_exchange_price": "190500", + "equipment_slot": "7", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,68,66,63,-4,65,20,0,0,0,0", + "requirements": "{1,60}", + "weight": "9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4088", + "name": "Dragon platelegs", + "tradeable": "true", + "grand_exchange_price": "190500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4089", + "name": "Mystic hat", + "examine": "Blue: A magical hat. ", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "grand_exchange_price": "13700", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4090", + "name": "Mystic hat", + "tradeable": "true", + "grand_exchange_price": "13700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4091", + "name": "Mystic robe top", + "examine": "The upper half of a magical robe.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "shop_price": "120000", + "grand_exchange_price": "72100", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,20,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4092", + "name": "Mystic robe top", + "tradeable": "true", + "grand_exchange_price": "72100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4093", + "name": "Mystic robe bottom", + "examine": "The lower half of a magical robe.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "shop_price": "80000", + "grand_exchange_price": "47700", + "equipment_slot": "7", + "absorb": "4,2,0", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4094", + "name": "Mystic robe bottom", + "tradeable": "true", + "grand_exchange_price": "47700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4095", + "name": "Mystic gloves", + "examine": "Magical gloves.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "grand_exchange_price": "5913", + "equipment_slot": "9", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4096", + "name": "Mystic gloves", + "tradeable": "true", + "grand_exchange_price": "5913", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4097", + "name": "Mystic boots", + "examine": "Magical boots.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "grand_exchange_price": "6303", + "equipment_slot": "10", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4098", + "name": "Mystic boots", + "tradeable": "true", + "grand_exchange_price": "6303", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4099", + "name": "Mystic hat", + "examine": "Black: A magical hat. ", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "grand_exchange_price": "16700", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4100", + "name": "Mystic hat", + "tradeable": "true", + "grand_exchange_price": "16700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4101", + "name": "Mystic robe top", + "examine": "The upper half of a magical robe.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "shop_price": "120000", + "grand_exchange_price": "75100", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,20,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4102", + "name": "Mystic robe top", + "tradeable": "true", + "grand_exchange_price": "75100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4103", + "name": "Mystic robe bottom", + "examine": "The lower half of a magical robe.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "shop_price": "80000", + "grand_exchange_price": "50700", + "equipment_slot": "7", + "absorb": "4,2,0", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4104", + "name": "Mystic robe bottom", + "tradeable": "true", + "grand_exchange_price": "50700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4105", + "name": "Mystic gloves", + "examine": "Dark magical gloves.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "grand_exchange_price": "8913", + "equipment_slot": "9", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4106", + "name": "Mystic gloves", + "tradeable": "true", + "grand_exchange_price": "8913", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4107", + "name": "Mystic boots", + "examine": "Magical boots.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "grand_exchange_price": "9303", + "equipment_slot": "10", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4108", + "name": "Mystic boots", + "tradeable": "true", + "grand_exchange_price": "9303", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4109", + "name": "Mystic hat", + "examine": "White: A magical hat. ", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "grand_exchange_price": "16700", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4110", + "name": "Mystic hat", + "tradeable": "true", + "grand_exchange_price": "16700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4111", + "name": "Mystic robe top", + "examine": "The upper half of a magical robe.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "shop_price": "120000", + "grand_exchange_price": "75100", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,20,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4112", + "name": "Mystic robe top", + "tradeable": "true", + "grand_exchange_price": "75100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4113", + "name": "Mystic robe bottom", + "examine": "The lower half of a magical robe.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "shop_price": "80000", + "grand_exchange_price": "50700", + "equipment_slot": "7", + "absorb": "4,2,0", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4114", + "name": "Mystic robe bottom", + "tradeable": "true", + "grand_exchange_price": "50700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4115", + "name": "Mystic gloves", + "examine": "Bright magical gloves.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "grand_exchange_price": "8913", + "equipment_slot": "9", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4116", + "name": "Mystic gloves", + "tradeable": "true", + "grand_exchange_price": "8913", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4117", + "name": "Mystic boots", + "examine": "Magical boots.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "grand_exchange_price": "9303", + "equipment_slot": "10", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "requirements": "{1,20}-{6,20}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4118", + "name": "Mystic boots", + "tradeable": "true", + "grand_exchange_price": "9303", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4119", + "name": "Bronze boots", + "examine": "These will protect my feet.", + "tradeable": "true", + "low_alchemy": "9", + "high_alchemy": "14", + "grand_exchange_price": "359", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,1,2,3,0,0,0,0,0,0,0", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4120", + "name": "Bronze boots", + "tradeable": "true", + "grand_exchange_price": "359", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4121", + "name": "Iron boots", + "examine": "These will protect my feet.", + "tradeable": "true", + "low_alchemy": "33", + "high_alchemy": "50", + "grand_exchange_price": "17000", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,2,3,4,0,0,0,0,0,0,0", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4122", + "name": "Iron boots", + "tradeable": "true", + "grand_exchange_price": "17000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4123", + "name": "Steel boots", + "examine": "These will protect my feet.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "258", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,5,6,7,0,0,5,0,0,0,0", + "requirements": "{1,5}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4124", + "name": "Steel boots", + "tradeable": "true", + "grand_exchange_price": "258", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4125", + "name": "Black boots", + "examine": "These will protect my feet.", + "tradeable": "true", + "low_alchemy": "230", + "high_alchemy": "345", + "grand_exchange_price": "317", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,7,8,9,0,0,7,0,0,0,0", + "requirements": "{1,10}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4126", + "name": "Black boots", + "tradeable": "true", + "grand_exchange_price": "317", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4127", + "name": "Mithril boots", + "examine": "These will protect my feet.", + "tradeable": "true", + "low_alchemy": "312", + "high_alchemy": "468", + "grand_exchange_price": "580", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,8,9,10,0,0,8,0,0,0,0", + "requirements": "{1,20}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4128", + "name": "Mithril boots", + "tradeable": "true", + "grand_exchange_price": "580", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4129", + "name": "Adamant boots", + "examine": "These will protect my feet.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "grand_exchange_price": "1336", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,10,11,12,0,0,9,1,0,0,0", + "requirements": "{1,30}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4130", + "name": "Adamant boots", + "tradeable": "true", + "grand_exchange_price": "1336", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4131", + "name": "Rune boots", + "examine": "These will protect my feet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "5000", + "high_alchemy": "7500", + "grand_exchange_price": "7474", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,12,13,14,0,0,10,2,0,0,0", + "requirements": "{1,40}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4132", + "name": "Rune boots", + "tradeable": "true", + "grand_exchange_price": "7474", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4133", + "name": "Crawling hand", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4134", + "name": "Cave crawler", + "examine": "A spiky crawling critter. (level 23) Not very tasty-looking. (level 138)", + "attack_speed": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4135", + "name": "Banshee", + "examine": "A tortured screaming soul.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4136", + "name": "Rockslug", + "examine": "The slime of evil.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4137", + "name": "Cockatrice", + "examine": "The winged reptile.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4138", + "name": "Pyrefiend", + "examine": "A small fire demon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4139", + "name": "Basilisk", + "examine": "The eyes of evil.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4140", + "name": "Infernal mage", + "examine": "An evil magic user.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4141", + "name": "Bloodveld", + "examine": "The tongue of evil.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4142", + "name": "Jelly", + "examine": "• Needs cream.....• Wibbly.• Wobbly...• There's always room for jelly.• Doesn't look so tough...• Looks scared to see me.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4143", + "name": "Turoth", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4144", + "name": "Abberant spectre", + "examine": "A very smelly ghost.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4145", + "name": "Dust devil", + "examine": "The vacuumed face of evil.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4146", + "name": "Kurask", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4147", + "name": "Gargoyle", + "examine": "Flies like a rock.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4148", + "name": "Nechryael", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4149", + "name": "Abyssal demon", + "examine": "A denizen of the Abyss!", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4150", + "name": "Broad arrows", + "examine": "Arrows with a wider than normal tip.", + "low_alchemy": "36", + "high_alchemy": "54", + "shop_price": "90", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,28,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4151", + "name": "Abyssal whip", + "examine": "A weapon from the Abyss.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy_message": "", + "grand_exchange_price": "413500", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "1660", + "run_anim": "1661", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "620", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,82,0,0,0,0,0,0,0,0,0,82,0,0,0", + "weapon_interface": "11", + "has_special": "true", + "attack_anims": "1658,1658,1658,1658", + "defence_anim": "1659", + "attack_audios": "2720,0,0,0", + "requirements": "{0,70}", + "weight": "0.45", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4152", + "name": "Abyssal whip", + "tradeable": "true", + "grand_exchange_price": "413500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4153", + "name": "Granite maul", + "examine": "Simplicity is the best weapon.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "29900", + "stand_anim": "1662", + "stand_turn_anim": "823", + "walk_anim": "1663", + "run_anim": "1664", + "turn180_anim": "1663", + "turn90cw_anim": "1663", + "turn90ccw_anim": "1663", + "render_anim": "27", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "0,0,81,0,0,0,0,0,0,0,0,79,0,0,0", + "weapon_interface": "10", + "has_special": "true", + "two_handed": "true", + "attack_anims": "1665,1665,1665,1665", + "defence_anim": "1666", + "attack_audios": "2714,0,0,0", + "requirements": "{0,50}-{2,50}", + "weight": "4.5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4154", + "name": "Granite maul", + "tradeable": "true", + "grand_exchange_price": "29900", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4155", + "name": "Enchanted gem", + "examine": "I can contact the Slayer Masters with this.", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4156", + "name": "Mirror shield", + "examine": "I can just about see things in this shield's reflection.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "5000", + "grand_exchange_price": "3318", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,10,15,5,5,10,5,0,0,0,0", + "requirements": "{1,20}-{18,25}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4157", + "name": "Mirror shield", + "tradeable": "true", + "grand_exchange_price": "3318", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4158", + "name": "Leaf-bladed spear", + "examine": "A spear with a leaf-shaped point.", + "low_alchemy": "12400", + "high_alchemy": "18600", + "shop_price": "31000", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "47,42,36,0,0,1,1,0,0,0,0,50,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,55}-{18,50}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4159", + "name": "Leaf-bladed spear", + "examine": "A spear with a leaf-shaped point.", + "low_alchemy": "12400", + "high_alchemy": "18600", + "shop_price": "31000", + "equipment_slot": "3", + "attack_speed": "5", + "requirements": "{0,55}-{18,50}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4160", + "name": "Broad arrow", + "examine": "Arrows with a wider than normal tip.", + "low_alchemy": "36", + "high_alchemy": "54", + "shop_price": "90", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,28", + "requirements": "{18,55}-{4,50}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4161", + "name": "Bag of salt", + "examine": "A bag of salt.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4162", + "name": "Rock hammer", + "examine": "I can even smash stone with this.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "500", + "grand_exchange_price": "140", + "equipment_slot": "3", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4163", + "name": "Rock hammer", + "tradeable": "true", + "grand_exchange_price": "140", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4164", + "name": "Face mask", + "examine": "Stops me breathing in too much dust.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "615", + "equipment_slot": "0", + "requirements": "{18,10}", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4165", + "name": "Face mask", + "tradeable": "true", + "grand_exchange_price": "615", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4166", + "name": "Earmuffs", + "examine": "These will protect my ears from loud noise.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "484", + "equipment_slot": "0", + "requirements": "{18,15}", + "weight": "2.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4167", + "name": "Earmuffs", + "tradeable": "true", + "grand_exchange_price": "484", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4168", + "name": "Nose peg", + "examine": "Protects me from any bad smells.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "523", + "equipment_slot": "0", + "requirements": "{18,60}", + "weight": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4169", + "name": "Nose peg", + "tradeable": "true", + "grand_exchange_price": "523", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4170", + "name": "Slayer's staff", + "examine": "An old and magical staff.", + "tradeable": "true", + "low_alchemy": "8400", + "high_alchemy": "12600", + "shop_price": "21000", + "grand_exchange_price": "12100", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "7,-1,25,12,0,2,3,1,10,0,0,35,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{18,55}-{6,50}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4171", + "name": "Slayer's staff", + "tradeable": "true", + "grand_exchange_price": "12100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4172", + "name": "Broad arrows", + "examine": "Arrows with a wider than normal tip.", + "low_alchemy": "36", + "high_alchemy": "54", + "shop_price": "90", + "equipment_slot": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4173", + "name": "Broad arrows", + "examine": "Arrows with a wider than normal tip.", + "low_alchemy": "36", + "high_alchemy": "54", + "shop_price": "90", + "equipment_slot": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4174", + "name": "Broad arrows", + "examine": "Arrows with a wider than normal tip.", + "low_alchemy": "36", + "high_alchemy": "54", + "shop_price": "90", + "equipment_slot": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4175", + "name": "Broad arrows", + "examine": "Arrows with a wider than normal tip.", + "low_alchemy": "36", + "high_alchemy": "54", + "shop_price": "90", + "equipment_slot": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4178", + "name": "Abyssal whip", + "examine": "A weapon from the Abyss.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "grand_exchange_price": "388392", + "render_anim": "620", + "attack_speed": "4", + "bonuses": "0,82,0,0,0,0,0,0,0,0,0,82,0,0,0", + "weight": "0.45", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4179", + "name": "Stick", + "examine": "A big, bad troll.", + "attack_speed": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4180", + "name": "Dragon platelegs", + "examine": "Looks pretty heavy.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "108000", + "high_alchemy": "162000", + "grand_exchange_price": "165900", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,68,66,63,-4,65,20,0,0,0,0", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4181", + "name": "Mouth grip", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4182", + "name": "Goutweed", + "examine": "A pale, tough looking herb.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4183", + "name": "Star amulet", + "examine": "A six-pointed marble and obsidian amulet", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4184", + "name": "Cavern key", + "examine": "Upon close examination, this seems to be a key.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4185", + "name": "Tower key", + "examine": "Upon close examination, this seems to be a key.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4186", + "name": "Shed key", + "examine": "Upon close examination, this seems to be a key.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4187", + "name": "Marble amulet", + "examine": "Triangular in shape, made from marble, and as large as your hand.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4188", + "name": "Obsidian amulet", + "examine": "Triangular in shape, made from obsidian, and as large as your hand.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4189", + "name": "Garden cane", + "examine": "A length of garden cane.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4190", + "name": "Garden brush", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4191", + "name": "Extended brush", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4192", + "name": "Extended brush", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4193", + "name": "Extended brush", + "examine": "See article", + "equipment_slot": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4195", + "name": "Arms", + "examine": "A pair of limp, dead arms.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4196", + "name": "Legs", + "examine": "A pair of lifeless, rotting legs.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4197", + "name": "Decapitated head", + "examine": "No brain: A gruesome, decapitated head, whose brain has rotted away. Brain: A gruesome, decapitated head - its eyes stare lifelessly at nothing.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4198", + "name": "Decapitated head", + "examine": "No brain: A gruesome, decapitated head, whose brain has rotted away. Brain: A gruesome, decapitated head - its eyes stare lifelessly at nothing.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4199", + "name": "Pickled brain", + "examine": "A pickled brain, submerged inside a jar of vinegar.", + "shop_price": "50", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4200", + "name": "Conductor mould", + "examine": "A mould for making silver lightning conductors.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4201", + "name": "Conductor", + "examine": "A silver lightning conductor.", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4202", + "name": "Ring of charos", + "examine": "Unactivated: The Ring of charos.Activated: The power within this ring has been activated.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Another can be received from pickpocketing Dr. Fenkenstrain in the tower.", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4205", + "name": "Consecration seed", + "examine": "This consecration seed looks grey and dead.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4206", + "name": "Consecration seed", + "examine": "This consecration seed looks grey and dead.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4207", + "name": "Crystal seed", + "examine": "This crystal seed looks grey and dead.", + "tradeable": "true", + "grand_exchange_price": "92600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4208", + "name": "Crystal seed", + "tradeable": "true", + "grand_exchange_price": "92600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4209", + "name": "Cadarn lineage", + "examine": "A book on Cadarn clan history.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4212", + "name": "New crystal bow", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "905300", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,70}-{4,50}", + "weight": "1.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4213", + "name": "New crystal bow", + "tradeable": "true", + "grand_exchange_price": "905300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4214", + "name": "Crystal bow full", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,100,0,0,0,0,0,0,0,0,0,70", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,50}-{4,70}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4215", + "name": "Crystal bow 9/10", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,96,0,0,0,0,0,0,0,0,0,68", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,50}-{4,70}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4216", + "name": "Crystal bow 8/10", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,92,0,0,0,0,0,0,0,0,0,66", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,50}-{4,70}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4217", + "name": "Crystal bow 7/10", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,88,0,0,0,0,0,0,0,0,0,64", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,70}-{4,50}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4218", + "name": "Crystal bow 6/10", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,84,0,0,0,0,0,0,0,0,0,62", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,70}-{4,50}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4219", + "name": "Crystal bow 5/10", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,80,0,0,0,0,0,0,0,0,0,60", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,70}-{4,50}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4220", + "name": "Crystal bow 4/10", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,76,0,0,0,0,0,0,0,0,0,58", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,70}-{4,50}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4221", + "name": "Crystal bow 3/10", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,72,0,0,0,0,0,0,0,0,0,56", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,70}-{4,50}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4222", + "name": "Crystal bow 2/10", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,68,0,0,0,0,0,0,0,0,0,54", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,50}-{4,70}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4223", + "name": "Crystal bow 1/10", + "examine": "A nice sturdy magical bow.", + "shop_price": "900000", + "grand_exchange_price": "901019", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,64,0,0,0,0,0,0,0,0,0,52", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{16,50}-{4,70}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4224", + "name": "New crystal shield", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "756900", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4225", + "name": "Crystal shield full", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,51,54,53,0,80,70,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4226", + "name": "Crystal shield 9/10", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,49,52,51,0,78,68,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4227", + "name": "Crystal shield 8/10", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,47,50,49,0,76,66,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4228", + "name": "Crystal shield 7/10", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,45,48,47,0,74,65,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4229", + "name": "Crystal shield 6/10", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,43,46,45,0,72,63,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4230", + "name": "Crystal shield 5/10", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,41,44,43,0,70,61,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4231", + "name": "Crystal shield 4/10", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,39,42,41,0,68,59,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4232", + "name": "Crystal shield 3/10", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,37,40,39,0,66,58,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4233", + "name": "Crystal shield 2/10", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,35,38,37,0,64,56,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4234", + "name": "Crystal shield 1/10", + "examine": "A nice sturdy crystal shield.", + "shop_price": "750000", + "grand_exchange_price": "749305", + "equipment_slot": "5", + "absorb": "6,0,12", + "bonuses": "0,0,0,-10,-10,33,36,35,0,62,54,0,0,0,0", + "requirements": "{1,50}-{16,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4235", + "name": "New crystal shield", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4236", + "name": "Signed oak bow", + "examine": "This bow has been signed by Robin, Master Bowman.", + "low_alchemy": "64", + "high_alchemy": "96", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,14,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "requirements": "{4,5}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4237", + "name": "Nettle-water", + "examine": "It's a bowl of water, with some nettles in it.", + "low_alchemy": "1", + "high_alchemy": "2", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4239", + "name": "Nettle tea", + "examine": "It's a bowl of (milky) nettle tea.", + "low_alchemy": "1", + "high_alchemy": "2", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4240", + "name": "Nettle tea", + "examine": "It's a bowl of (milky) nettle tea.", + "low_alchemy": "1", + "high_alchemy": "2", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4241", + "name": "Nettles", + "examine": "(In inventory) A handful of nettles (In ground) I better not get stung/I wouldn't like to get stung/I wish I could sting other people/Dock leaves at the ready/These may hurt/nettles sting my leggies(Draynor Village nettles)", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4242", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4243", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4244", + "name": "Porcelain cup", + "examine": "A porcelain cup.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4245", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4246", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4247", + "name": "Mystical robes", + "examine": "The Robes of Necrovarus.", + "weight": "2.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4248", + "name": "Book of haricanto", + "examine": "The Book of Haricanto.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4249", + "name": "Translation manual", + "examine": "A translation manual.", + "shop_price": "32", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4250", + "name": "Ghostspeak amulet", + "examine": "Normal: It lets me talk to ghosts.", + "low_alchemy": "14", + "high_alchemy": "21", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4251", + "name": "Ectophial", + "examine": "The Ectophial.", + "tradeable": "false", + "high_alchemy": "1", + "destroy_message": "The Ectophial will smash if you drop it. Velorina can replace it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4252", + "name": "Ectophial", + "examine": "The Ectophial.", + "tradeable": "false", + "high_alchemy": "1", + "destroy_message": "The Ectophial will smash if you drop it. Velorina can replace it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4253", + "name": "Model ship", + "examine": "A small wooden ship. / A small wooden ship with a silk flag.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4254", + "name": "Model ship", + "examine": "A small wooden ship. / A small wooden ship with a silk flag.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4255", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4256", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4257", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4258", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4259", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4260", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4261", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4262", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4263", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4264", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4265", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4266", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4267", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4268", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4269", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4270", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4271", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4272", + "name": "Bone key", + "examine": "A key fashioned from a shard of bone. (Shilo Village)", + "shop_price": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4274", + "name": "Map scrap", + "examine": "A section from some kind of map.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4275", + "name": "Map scrap", + "examine": "A section from some kind of map.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4276", + "name": "Map scrap", + "examine": "A section from some kind of map.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4277", + "name": "Treasure map", + "examine": "A complete treasure map.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4278", + "name": "Ecto-token", + "examine": "A token with ectoplasm on it.", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4283", + "name": "Petition form", + "examine": "A scroll of paper containing signatures.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4284", + "name": "Bedsheet", + "examine": "Before Ectofuntus: It's a bedsheet.After Ectofuntus: It's an ectoplasm-covered bedsheet.", + "equipment_slot": "0", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4285", + "name": "Bedsheet", + "examine": "Before Ectofuntus: It's a bedsheet.After Ectofuntus: It's an ectoplasm-covered bedsheet.", + "equipment_slot": "0", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4286", + "name": "Bucket of slime", + "examine": "It's a bucket of ectoplasm.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4287", + "name": "Raw beef", + "examine": "I need to cook this first.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "35", + "shop_price": "58", + "grand_exchange_price": "440", + "weight": "0.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4288", + "name": "Raw beef", + "tradeable": "true", + "grand_exchange_price": "440", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4289", + "name": "Raw chicken", + "examine": "I need to cook this first.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "60", + "grand_exchange_price": "263", + "weight": "0.15", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4290", + "name": "Raw chicken", + "tradeable": "true", + "grand_exchange_price": "263", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4291", + "name": "Cooked chicken", + "examine": "Mmm this looks tasty.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "shop_price": "5", + "grand_exchange_price": "59", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4292", + "name": "Cooked chicken", + "tradeable": "true", + "grand_exchange_price": "59", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4293", + "name": "Cooked meat", + "examine": "Mmm this looks tasty.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "5", + "grand_exchange_price": "74", + "weight": "0.25", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4294", + "name": "Cooked meat", + "tradeable": "true", + "grand_exchange_price": "74", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4295", + "name": "Female h.a.m.", + "examine": "A member of the 'Humans Against Monsters' group.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4297", + "name": "Male h.a.m.", + "examine": "A member of the 'Humans Against Monsters' group.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4298", + "name": "Ham shirt", + "examine": "The label says 'Vivid Crimson', but it looks like pink to me!", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "grand_exchange_price": "19", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4299", + "name": "Ham shirt", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4300", + "name": "Ham robe", + "examine": "The label says 'Vivid Crimson', but it looks like pink to me!", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "grand_exchange_price": "11", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4301", + "name": "Ham robe", + "tradeable": "true", + "grand_exchange_price": "11", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4302", + "name": "Ham hood", + "examine": "Light-weight head protection and eye shield.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "grand_exchange_price": "400", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,0,1,2,0,1,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4303", + "name": "Ham hood", + "tradeable": "true", + "grand_exchange_price": "400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4304", + "name": "Ham cloak", + "examine": "A HAM cape.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "grand_exchange_price": "25", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4305", + "name": "Ham cloak", + "tradeable": "true", + "grand_exchange_price": "25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4306", + "name": "H.a.m logo", + "examine": "A badge for the HAM cult.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "grand_exchange_price": "63", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4307", + "name": "H.a.m logo", + "tradeable": "true", + "grand_exchange_price": "63", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4308", + "name": "Gloves", + "grand_exchange_price": "59", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4309", + "name": "Gloves", + "tradeable": "true", + "grand_exchange_price": "59", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4310", + "name": "Boots", + "grand_exchange_price": "323", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4311", + "name": "Boots", + "tradeable": "true", + "grand_exchange_price": "323", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4313", + "name": "Crystal of seren", + "examine": "A book on elven crystal.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4315", + "name": "Team-1 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "2342", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4316", + "name": "Team-1 cape", + "tradeable": "true", + "grand_exchange_price": "2342", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4317", + "name": "Team-2 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1145", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4318", + "name": "Team-2 cape", + "tradeable": "true", + "grand_exchange_price": "1145", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4319", + "name": "Team-3 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "141", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4320", + "name": "Team-3 cape", + "tradeable": "true", + "grand_exchange_price": "141", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4321", + "name": "Team-4 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "973", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4322", + "name": "Team-4 cape", + "tradeable": "true", + "grand_exchange_price": "973", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4323", + "name": "Team-5 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1294", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4324", + "name": "Team-5 cape", + "tradeable": "true", + "grand_exchange_price": "1294", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4325", + "name": "Team-6 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "124", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4326", + "name": "Team-6 cape", + "tradeable": "true", + "grand_exchange_price": "124", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4327", + "name": "Team-7 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1264", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4328", + "name": "Team-7 cape", + "tradeable": "true", + "grand_exchange_price": "1264", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4329", + "name": "Team-8 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1824", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4330", + "name": "Team-8 cape", + "tradeable": "true", + "grand_exchange_price": "1824", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4331", + "name": "Team-9 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "841", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4332", + "name": "Team-9 cape", + "tradeable": "true", + "grand_exchange_price": "841", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4333", + "name": "Team-10 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1127", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4334", + "name": "Team-10 cape", + "tradeable": "true", + "grand_exchange_price": "1127", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4335", + "name": "Team-11 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "2011", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4336", + "name": "Team-11 cape", + "tradeable": "true", + "grand_exchange_price": "2011", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4337", + "name": "Team-12 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1591", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4338", + "name": "Team-12 cape", + "tradeable": "true", + "grand_exchange_price": "1591", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4339", + "name": "Team-13 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "308", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4340", + "name": "Team-13 cape", + "tradeable": "true", + "grand_exchange_price": "308", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4341", + "name": "Team-14 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1504", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4342", + "name": "Team-14 cape", + "tradeable": "true", + "grand_exchange_price": "1504", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4343", + "name": "Team-15 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1462", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4344", + "name": "Team-15 cape", + "tradeable": "true", + "grand_exchange_price": "1462", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4345", + "name": "Team-16 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "313", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4346", + "name": "Team-16 cape", + "tradeable": "true", + "grand_exchange_price": "313", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4347", + "name": "Team-17 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1231", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4348", + "name": "Team-17 cape", + "tradeable": "true", + "grand_exchange_price": "1231", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4349", + "name": "Team-18 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1678", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4350", + "name": "Team-18 cape", + "tradeable": "true", + "grand_exchange_price": "1678", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4351", + "name": "Team-19 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1041", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4352", + "name": "Team-19 cape", + "tradeable": "true", + "grand_exchange_price": "1041", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4353", + "name": "Team-20 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "703", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4354", + "name": "Team-20 cape", + "tradeable": "true", + "grand_exchange_price": "703", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4355", + "name": "Team-21 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1292", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4356", + "name": "Team-21 cape", + "tradeable": "true", + "grand_exchange_price": "1292", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4357", + "name": "Team-22 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1368", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4358", + "name": "Team-22 cape", + "tradeable": "true", + "grand_exchange_price": "1368", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4359", + "name": "Team-23 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "280", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4360", + "name": "Team-23 cape", + "tradeable": "true", + "grand_exchange_price": "280", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4361", + "name": "Team-24 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1512", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4362", + "name": "Team-24 cape", + "tradeable": "true", + "grand_exchange_price": "1512", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4363", + "name": "Team-25 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1395", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4364", + "name": "Team-25 cape", + "tradeable": "true", + "grand_exchange_price": "1395", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4365", + "name": "Team-26 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "191", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4366", + "name": "Team-26 cape", + "tradeable": "true", + "grand_exchange_price": "191", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4367", + "name": "Team-27 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1420", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4368", + "name": "Team-27 cape", + "tradeable": "true", + "grand_exchange_price": "1420", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4369", + "name": "Team-28 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1920", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4370", + "name": "Team-28 cape", + "tradeable": "true", + "grand_exchange_price": "1920", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4371", + "name": "Team-29 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1175", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4372", + "name": "Team-29 cape", + "tradeable": "true", + "grand_exchange_price": "1175", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4373", + "name": "Team-30 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "552", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4374", + "name": "Team-30 cape", + "tradeable": "true", + "grand_exchange_price": "552", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4375", + "name": "Team-31 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1385", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4376", + "name": "Team-31 cape", + "tradeable": "true", + "grand_exchange_price": "1385", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4377", + "name": "Team-32 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1168", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4378", + "name": "Team-32 cape", + "tradeable": "true", + "grand_exchange_price": "1168", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4379", + "name": "Team-33 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "211", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4380", + "name": "Team-33 cape", + "tradeable": "true", + "grand_exchange_price": "211", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4381", + "name": "Team-34 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1128", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4382", + "name": "Team-34 cape", + "tradeable": "true", + "grand_exchange_price": "1128", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4383", + "name": "Team-35 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1140", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4384", + "name": "Team-35 cape", + "tradeable": "true", + "grand_exchange_price": "1140", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4385", + "name": "Team-36 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "84", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4386", + "name": "Team-36 cape", + "tradeable": "true", + "grand_exchange_price": "84", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4387", + "name": "Team-37 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1010", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4388", + "name": "Team-37 cape", + "tradeable": "true", + "grand_exchange_price": "1010", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4389", + "name": "Team-38 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1833", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4390", + "name": "Team-38 cape", + "tradeable": "true", + "grand_exchange_price": "1833", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4391", + "name": "Team-39 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "914", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4392", + "name": "Team-39 cape", + "tradeable": "true", + "grand_exchange_price": "914", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4393", + "name": "Team-40 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "582", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4394", + "name": "Team-40 cape", + "tradeable": "true", + "grand_exchange_price": "582", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4395", + "name": "Team-41 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1471", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4396", + "name": "Team-41 cape", + "tradeable": "true", + "grand_exchange_price": "1471", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4397", + "name": "Team-42 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1072", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4398", + "name": "Team-42 cape", + "tradeable": "true", + "grand_exchange_price": "1072", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4399", + "name": "Team-43 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "298", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4400", + "name": "Team-43 cape", + "tradeable": "true", + "grand_exchange_price": "298", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4401", + "name": "Team-44 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1268", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4402", + "name": "Team-44 cape", + "tradeable": "true", + "grand_exchange_price": "1268", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4403", + "name": "Team-45 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1371", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4404", + "name": "Team-45 cape", + "tradeable": "true", + "grand_exchange_price": "1371", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4405", + "name": "Team-46 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "140", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4406", + "name": "Team-46 cape", + "tradeable": "true", + "grand_exchange_price": "140", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4407", + "name": "Team-47 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1233", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4408", + "name": "Team-47 cape", + "tradeable": "true", + "grand_exchange_price": "1233", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4409", + "name": "Team-48 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1836", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4410", + "name": "Team-48 cape", + "tradeable": "true", + "grand_exchange_price": "1836", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4411", + "name": "Team-49 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "1185", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4412", + "name": "Team-49 cape", + "tradeable": "true", + "grand_exchange_price": "1185", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4413", + "name": "Team-50 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "708", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4414", + "name": "Team-50 cape", + "tradeable": "true", + "grand_exchange_price": "708", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4415", + "name": "Blunt axe", + "examine": "A jungle forester's blunt hatchet.", + "low_alchemy": "22", + "high_alchemy": "33", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4416", + "name": "Herbal tincture", + "examine": "A strong medicinal brew for heavy chests.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4417", + "name": "Guthix rest(4)", + "examine": "A cup of Guthix rest.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "223", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4418", + "name": "Guthix rest(4)", + "tradeable": "true", + "grand_exchange_price": "223", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4419", + "name": "Guthix rest(3)", + "examine": "A cup of Guthix rest.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "134", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4420", + "name": "Guthix rest(3)", + "tradeable": "true", + "grand_exchange_price": "134", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4421", + "name": "Guthix rest(2)", + "examine": "A cup of Guthix rest.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "83", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4422", + "name": "Guthix rest(2)", + "tradeable": "true", + "grand_exchange_price": "83", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4423", + "name": "Guthix rest(1)", + "examine": "A cup of Guthix rest.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "44", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4424", + "name": "Guthix rest(1)", + "tradeable": "true", + "grand_exchange_price": "44", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4425", + "name": "Stodgy mattress", + "examine": "A half-filled feather mattress.", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4426", + "name": "Comfy mattress", + "examine": "A comfy-looking feather mattress.", + "weight": "15", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4427", + "name": "Iron oxide", + "examine": "Looks like a bunch of rust to me.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4428", + "name": "Animate rock scroll", + "examine": "An animate rock spell is written on this parchment.", + "low_alchemy": "20", + "high_alchemy": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4430", + "name": "Directionals", + "examine": "The weathervane directions should now work.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4432", + "name": "Ornament", + "examine": "A fixed weathervane ornament.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4434", + "name": "Weathervane pillar", + "examine": "A fixed weathervane rotating pillar.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4435", + "name": "Weather report", + "examine": "Clear skies ahead, with some chance of showers, thunderstorms, ice and hail.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4436", + "name": "Airtight pot", + "examine": "This is pretty well sealed.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "245", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4437", + "name": "Airtight pot", + "tradeable": "true", + "grand_exchange_price": "245", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4438", + "name": "Unfired pot lid", + "examine": "This needs firing, then it should fit on a normal-sized pot.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "16", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4439", + "name": "Unfired pot lid", + "tradeable": "true", + "grand_exchange_price": "16", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4440", + "name": "Pot lid", + "examine": "This should fit on a normal-sized pot.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4441", + "name": "Pot lid", + "tradeable": "true", + "grand_exchange_price": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4442", + "name": "Breathing salts", + "examine": "An airtight pot with something inside, most likely breathing salts.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4443", + "name": "Chicken cage", + "examine": "A large cage for transporting chickens.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4444", + "name": "Sharpened axe", + "examine": "A jungle forester's super sharp axe.", + "low_alchemy": "22", + "high_alchemy": "33", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4445", + "name": "Red mahogany log", + "examine": "Some mahogany logs which have been professionally cured.", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4446", + "name": "Steel key ring", + "examine": "I can store my keys here.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another key ring from Yanni Salika in Shilo Village.", + "shop_price": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4447", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4456", + "name": "Bowl of hot water", + "examine": "It's a bowl of hot water.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "111", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4457", + "name": "Bowl of hot water", + "tradeable": "true", + "grand_exchange_price": "111", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4458", + "name": "Cup of water", + "examine": "A cup of water.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "36", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4459", + "name": "Cup of water", + "tradeable": "true", + "grand_exchange_price": "36", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4460", + "name": "Cup of hot water", + "examine": "It's hot!", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "102", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4461", + "name": "Cup of hot water", + "tradeable": "true", + "grand_exchange_price": "102", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4462", + "name": "Ruined herb tea", + "examine": "A ruined herb tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4463", + "name": "Ruined herb tea", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4464", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "13", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4465", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4466", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "13", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4467", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4468", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4469", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4470", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4471", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4472", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "17", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4473", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "17", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4474", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "18", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4475", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "18", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4476", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "18", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4477", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "18", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4478", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "46", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4479", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "46", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4480", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "41", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4481", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "41", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4482", + "name": "Herb tea mix", + "examine": "See article", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "43", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4483", + "name": "Herb tea mix", + "tradeable": "true", + "grand_exchange_price": "43", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4484", + "name": "Safety guarantee", + "examine": "The strange characters supposedly grant Svidi safe passage into Rellekka.", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4485", + "name": "White pearl", + "examine": "This fruit is known as White Pearl. Should taste good.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4486", + "name": "White pearl seed", + "examine": "You can grow this seed even in cold mountain ranges!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4487", + "name": "Half a rock", + "examine": "It's a piece of the Ancient Rock of the mountain people. It's still just a stone.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4488", + "name": "Corpse of woman", + "examine": "The corpse of a woman who died long ago.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4489", + "name": "Asleif's necklace", + "examine": "This used to belong to Asleif, daughter of the mountain camp chieftain.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4490", + "name": "Mud", + "examine": "Marginally better than egg on your face.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4492", + "name": "Muddy rock", + "examine": "A muddy rock.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4494", + "name": "Pole", + "examine": "It's just a long stick, really.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4495", + "name": "Pole", + "examine": "It's just a long stick, really.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4496", + "name": "Broken pole", + "examine": "Splintered into pieces, it has become completely useless to you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4498", + "name": "Rope", + "examine": "A coil of rope.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "shop_price": "18", + "grand_exchange_price": "101", + "equipment_slot": "3", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4499", + "name": "Rope", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4500", + "name": "Pole", + "examine": "It's just a long stick, really.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4501", + "name": "Pole", + "examine": "It's just a long stick, really.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4502", + "name": "Bearhead", + "examine": "Quite ferocious looking.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Hamal, the Chieftain of the Mountain Camp, can replace this.", + "shop_price": "3000", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-3,12,14,10,7,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4503", + "name": "Decorative sword", + "examine": "A very decorative sword.", + "low_alchemy": "520", + "high_alchemy": "780", + "shop_price": "50", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "bonuses": "15,20,-2,0,0,0,3,2,0,0,0,22,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,20}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4504", + "name": "Decorative armour", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,46,44,38,-6,44,20,0,0,0,0", + "requirements": "{1,20}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4505", + "name": "Decorative armour", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,24,22,20,-4,22,5,0,0,0,0", + "requirements": "{1,20}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4506", + "name": "Decorative helm", + "examine": "A very decorative helm.", + "low_alchemy": "312", + "high_alchemy": "468", + "shop_price": "40", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,10,11,9,-1,10,5,0,0,0,0", + "requirements": "{1,20}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4507", + "name": "Decorative shield", + "examine": "A very decorative shield.", + "shop_price": "60", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,18,22,20,-1,20,20,0,0,0,0", + "requirements": "{1,20}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4508", + "name": "Decorative sword", + "examine": "A very decorative sword.", + "low_alchemy": "520", + "high_alchemy": "780", + "shop_price": "50", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "bonuses": "20,29,-2,0,0,0,3,2,0,0,0,31,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,30}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4509", + "name": "Decorative armour", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,65,63,55,-6,63,30,0,0,0,0", + "requirements": "{1,30}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4510", + "name": "Decorative armour", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,33,31,29,-4,31,10,0,0,0,0", + "requirements": "{1,30}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4511", + "name": "Decorative helm", + "examine": "A very decorative helm.", + "low_alchemy": "312", + "high_alchemy": "468", + "shop_price": "40", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,14,15,13,-1,14,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4512", + "name": "Decorative shield", + "examine": "A very decorative shield.", + "shop_price": "60", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "requirements": "{1,30}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4513", + "name": "Castlewars hood", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,0,1,2,0,1,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4514", + "name": "Castlewars cloak", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4515", + "name": "Castlewars hood", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,0,1,2,0,1,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4516", + "name": "Castlewars cloak", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4517", + "name": "Giant frog legs", + "examine": "This could feed a family of gnomes for a week!", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "970", + "weight": "0.4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4518", + "name": "Giant frog legs", + "tradeable": "true", + "grand_exchange_price": "970", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4522", + "name": "Oil lamp", + "examine": "Empty: An oil lamp with no oil in it.Filled: Not the genie sort.", + "tradeable": "true", + "low_alchemy": "11", + "high_alchemy": "16", + "shop_price": "10", + "grand_exchange_price": "1575", + "requirements": "{12,11}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4523", + "name": "Oil lamp", + "tradeable": "true", + "grand_exchange_price": "1575", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4524", + "name": "Oil lamp", + "examine": "Empty: An oil lamp with no oil in it.Filled: Not the genie sort.", + "tradeable": "true", + "low_alchemy": "11", + "high_alchemy": "16", + "shop_price": "10", + "grand_exchange_price": "2", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4525", + "name": "Oil lamp", + "examine": "Empty: An oil lamp with no oil in it.Filled: Not the genie sort.", + "tradeable": "true", + "low_alchemy": "11", + "high_alchemy": "16", + "shop_price": "10", + "grand_exchange_price": "2", + "requirements": "{12,11}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4526", + "name": "Oil lamp", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4527", + "name": "Candle lantern", + "examine": "Lit: A flickering candle in a glass cage.Unlit: a candle in a glass cage.Without candle: Put a candle in to complete it.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "39", + "requirements": "{4,11}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4528", + "name": "Candle lantern", + "tradeable": "true", + "grand_exchange_price": "39", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4529", + "name": "Candle lantern", + "examine": "Lit: A flickering candle in a glass cage.Unlit: a candle in a glass cage.Without candle: Put a candle in to complete it.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "431", + "requirements": "{4,11}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4530", + "name": "Candle lantern", + "tradeable": "true", + "grand_exchange_price": "431", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4531", + "name": "Candle lantern", + "examine": "Lit: A flickering candle in a glass cage.Unlit: a candle in a glass cage.Without candle: Put a candle in to complete it.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "1", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4532", + "name": "Candle lantern", + "examine": "Lit: A flickering candle in a glass cage.Unlit: a candle in a glass cage.Without candle: Put a candle in to complete it.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "1", + "requirements": "{4,11}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4533", + "name": "Candle lantern", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4534", + "name": "Candle lantern", + "examine": "Lit: A flickering candle in a glass cage.Unlit: a candle in a glass cage.Without candle: Put a candle in to complete it.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "1", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4535", + "name": "Oil lantern", + "examine": "Unfuelled: Put oil in to complete it. Unlit: An unlit oil lantern. Lit: It lights your way through the dark places of the earth.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "grand_exchange_price": "12", + "requirements": "{11,26}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4536", + "name": "Oil lantern", + "tradeable": "true", + "grand_exchange_price": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4537", + "name": "Oil lantern", + "examine": "Unfuelled: Put oil in to complete it. Unlit: An unlit oil lantern. Lit: It lights your way through the dark places of the earth.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "grand_exchange_price": "218", + "requirements": "{11,26}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4538", + "name": "Oil lantern", + "tradeable": "true", + "grand_exchange_price": "218", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4539", + "name": "Oil lantern", + "examine": "Unfuelled: Put oil in to complete it. Unlit: An unlit oil lantern. Lit: It lights your way through the dark places of the earth.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "grand_exchange_price": "198", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4540", + "name": "Oil lantern frame", + "examine": "Add the glass to complete.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "shop_price": "43", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4541", + "name": "Oil lantern frame", + "tradeable": "true", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4542", + "name": "Lantern lens", + "examine": "A roughly circular disc of glass.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "shop_price": "88", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4543", + "name": "Lantern lens", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4544", + "name": "Bullseye lantern", + "examine": "A sturdy steel lantern casting a bright beam.", + "low_alchemy": "168", + "high_alchemy": "252", + "shop_price": "400", + "grand_exchange_price": "88", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4545", + "name": "Bullseye lantern", + "tradeable": "true", + "grand_exchange_price": "88", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4546", + "name": "Bullseye lantern", + "examine": "A sturdy steel lantern casting a bright beam.", + "low_alchemy": "168", + "high_alchemy": "252", + "shop_price": "400", + "grand_exchange_price": "158", + "requirements": "{11,49}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4547", + "name": "Bullseye lantern", + "tradeable": "true", + "grand_exchange_price": "158", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4548", + "name": "Bullseye lantern", + "examine": "A sturdy steel lantern casting a bright beam.", + "low_alchemy": "168", + "high_alchemy": "252", + "shop_price": "400", + "grand_exchange_price": "1345", + "requirements": "{11,49}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4549", + "name": "Bullseye lantern", + "tradeable": "true", + "grand_exchange_price": "1345", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4550", + "name": "Bullseye lantern", + "examine": "A sturdy steel lantern casting a bright beam.", + "low_alchemy": "168", + "high_alchemy": "252", + "shop_price": "400", + "grand_exchange_price": "1235", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4551", + "name": "Spiny helmet", + "examine": "You don't want to wear it inside-out.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "shop_price": "650", + "grand_exchange_price": "774", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "requirements": "{1,5}-{18,35}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4552", + "name": "Spiny helmet", + "tradeable": "true", + "grand_exchange_price": "774", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4558", + "name": "Blue sweets", + "examine": "Remember to brush after eating!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4559", + "name": "Deep blue sweets", + "examine": "Remember to brush after eating!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4560", + "name": "White sweets", + "examine": "Remember to brush after eating!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4561", + "name": "Purple sweets", + "examine": "Remember to brush after eating!", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "10037", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4562", + "name": "Red sweets", + "examine": "Remember to brush after eating!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4563", + "name": "Green sweets", + "examine": "Remember to brush after eating!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4564", + "name": "Pink sweets", + "examine": "Remember to brush after eating!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4565", + "name": "Basket of eggs", + "examine": "Hand them out to spread the Easter happiness.", + "destroy": "true", + "tradeable": "false", + "stand_anim": "1837", + "stand_turn_anim": "823", + "walk_anim": "1836", + "run_anim": "1836", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1426", + "equipment_slot": "3", + "weapon_interface": "12", + "bankable": "false", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4566", + "name": "Rubber chicken", + "examine": "Perhaps not the most powerful weapon in RuneScape.", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "attack_anims": "1833,1833,1833,1833", + "defence_anim": "1834", + "weight": "0.4", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4567", + "name": "Gold helmet", + "examine": "Made of gold and white gold.", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,0,10,20,0,10,6,0,0,0,0", + "weight": "31.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4568", + "name": "Dwarven lore", + "examine": "This book is almost falling apart, you'll have to handle it quite carefully.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4569", + "name": "Book page 1", + "examine": "A missing page from Rolad's book! It seems to be the first one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4570", + "name": "Book page 2", + "examine": "A missing page from Rolad's book! It seems to be the second one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4571", + "name": "Book page 3", + "examine": "A missing page from Rolad's book! It seems to be the third one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4572", + "name": "Pages", + "examine": "A collection of missing pages from Rolad's book!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4573", + "name": "Pages", + "examine": "A collection of missing pages from Rolad's book!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4574", + "name": "Base schematics", + "examine": "These are the base schematics of a dwarven multicannon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4580", + "name": "Black spear", + "examine": "A black tipped spear.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "536", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "15,15,15,0,0,1,1,0,0,0,0,16,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,10}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4581", + "name": "Black spear", + "tradeable": "true", + "grand_exchange_price": "536", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4582", + "name": "Black spear(p)", + "examine": "A black tipped spear.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "2808", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "15,15,15,0,0,1,1,0,0,0,0,16,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,10}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4583", + "name": "Black spear(p)", + "tradeable": "true", + "grand_exchange_price": "2808", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4584", + "name": "Black spear(kp)", + "examine": "A black tipped spear.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "309", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "15,15,15,0,0,1,1,0,0,0,0,16,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,10}", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4585", + "name": "Dragon plateskirt", + "examine": "This looks pretty heavy.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "108000", + "high_alchemy": "162000", + "grand_exchange_price": "161000", + "equipment_slot": "7", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,68,66,63,-4,65,20,0,0,0,0", + "requirements": "{1,60}", + "weight": "9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4586", + "name": "Dragon plateskirt", + "tradeable": "true", + "grand_exchange_price": "161000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4587", + "name": "Dragon scimitar", + "examine": "A vicious, curved sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "shop_price": "100000", + "grand_exchange_price": "65400", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "8,67,-2,0,0,0,1,0,0,0,0,66,0,0,0", + "weapon_interface": "6", + "has_special": "true", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "requirements": "{0,60}", + "weight": "1.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4588", + "name": "Dragon scimitar", + "tradeable": "true", + "grand_exchange_price": "65400", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4589", + "name": "Keys", + "examine": "Keys to the Mayor's house. (The Feud)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4590", + "name": "Jewels", + "examine": "The Mayor of Pollnivneach's wife's jewels.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4591", + "name": "Karidian headpiece", + "examine": "Wear it on your head.", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4593", + "name": "Fake beard", + "examine": "Makes me itch.", + "tradeable": "true", + "shop_price": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4597", + "name": "Note", + "examine": "Swap this note at any bank for the equivalent item.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4598", + "name": "Note", + "examine": "Swap this note at any bank for the equivalent item.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4599", + "name": "Oak-blackjack", + "examine": "A handy little club made out of oak.", + "shop_price": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,2,0,0,0", + "weapon_interface": "10", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4600", + "name": "Willow-blackjack", + "examine": "A handy little club made out of willow.", + "tradeable": "true", + "low_alchemy": "240", + "high_alchemy": "360", + "shop_price": "600", + "grand_exchange_price": "321", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,8,0,0,0", + "weapon_interface": "10", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4601", + "name": "Ugthanki dung", + "examine": "Dung of the Camelus Horribleus variety.", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4602", + "name": "Ugthanki dung", + "examine": "Dung of the Camelus Horribleus variety.", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4603", + "name": "Receipt", + "examine": "A receipt for one 'Camelus Horribleus", + "shop_price": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4604", + "name": "Hag's poison", + "examine": "A red viscous liquid in a vial.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4605", + "name": "Snake charm", + "examine": "Makes a hissing sound.", + "high_alchemy": "1", + "equipment_slot": "3", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4606", + "name": "Snake basket", + "examine": "This is used to hold snakes.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4607", + "name": "Snake basket full", + "examine": "This basket contains a snake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4608", + "name": "Super kebab", + "examine": "A meaty and very hot kebab.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "5", + "grand_exchange_price": "403", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4609", + "name": "Super kebab", + "tradeable": "true", + "grand_exchange_price": "403", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4610", + "name": "Red hot sauce", + "examine": "The bottle feels warm.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4611", + "name": "Desert disguise", + "examine": "A disguise suitable for the desert.", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4612", + "name": "Willow-blackjack", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4613", + "name": "Spinning plate", + "examine": "It has a picture of a dragon on it.", + "low_alchemy": "30", + "high_alchemy": "45", + "shop_price": "75", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4614", + "name": "Broken plate", + "examine": "Alas...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4616", + "name": "Varmen's notes", + "examine": "An archaeologist's notes.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4617", + "name": "Display cabinet key", + "examine": "The museum curator's key (The Golem).", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4619", + "name": "Strange implement", + "examine": "It's pretty, but you wish you knew what it was.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4620", + "name": "Black mushroom", + "examine": "It looks horrible.On ground: Not good for eating.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4621", + "name": "Phoenix feather", + "examine": "A long feather patterned like a flame.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4622", + "name": "Black mushroom ink", + "examine": "Black ink made out of mushrooms.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4623", + "name": "Phoenix quill pen", + "examine": "A phoenix feather dipped in ink.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4624", + "name": "Golem program", + "examine": "It reads 'YOUR TASK IS DONE'.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4627", + "name": "Bandit's brew", + "examine": "A cheeky little lager from the Bandit Camp.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "shop_price": "650", + "grand_exchange_price": "1133", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4628", + "name": "Bandit's brew", + "tradeable": "true", + "grand_exchange_price": "1133", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4654", + "name": "Etchings", + "examine": "A copy of the engravings found on a mysterious stone tablet.", + "low_alchemy": "100", + "high_alchemy": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4655", + "name": "Translation", + "examine": "A rough translation made from archaeological etchings.", + "low_alchemy": "100", + "high_alchemy": "150", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4656", + "name": "Warm key", + "examine": "This key is unusally warm to the touch.", + "low_alchemy": "100", + "high_alchemy": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4657", + "name": "Ring of visibility", + "examine": "A ring that allows you to see things that are normally invisible.", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4658", + "name": "Silver pot", + "examine": "Frank's shiny silver coated pot.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4659", + "name": "Blessed pot", + "examine": "A silver pot made by Ruantun and blessed on Entrana.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4660", + "name": "Silver pot", + "examine": "Frank's shiny silver coated pot.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4661", + "name": "Blessed pot", + "examine": "A silver pot made by Ruantun and blessed on Entrana.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4662", + "name": "Silver pot", + "examine": "Frank's shiny silver coated pot.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4663", + "name": "Blessed pot", + "examine": "A silver pot made by Ruantun and blessed on Entrana.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4664", + "name": "Silver pot", + "examine": "Frank's shiny silver coated pot.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4665", + "name": "Blessed pot", + "examine": "A silver pot made by Ruantun and blessed on Entrana.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4666", + "name": "Silver pot", + "examine": "Frank's shiny silver coated pot.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4667", + "name": "Blessed pot", + "examine": "A silver pot made by Ruantun and blessed on Entrana.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4668", + "name": "Garlic powder", + "examine": "Finely ground garlic powder.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4670", + "name": "Blood diamond", + "examine": "The Diamond of Blood.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4671", + "name": "Ice diamond", + "examine": "The Diamond of Ice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4672", + "name": "Smoke diamond", + "examine": "The Diamond of Smoke.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4673", + "name": "Shadow diamond", + "examine": "The Diamond of Shadow.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4674", + "name": "Gilded cross", + "examine": "An old and strangely shaped metal cross.", + "low_alchemy": "100", + "high_alchemy": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4675", + "name": "Ancient staff", + "examine": "A magical staff of ancient origin...", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "shop_price": "80000", + "grand_exchange_price": "59300", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,-1,40,15,0,2,3,1,15,0,0,50,-1,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,50}-{6,50}", + "weight": "2.25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4676", + "name": "Ancient staff", + "tradeable": "true", + "grand_exchange_price": "59300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4677", + "name": "Catspeak amulet", + "examine": "It's an amulet of cat speak. It makes vague purring noises.", + "equipment_slot": "2", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4678", + "name": "Canopic jar", + "examine": "Varies. See Types", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4679", + "name": "Canopic jar", + "examine": "Varies. See Types", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4680", + "name": "Canopic jar", + "examine": "Varies. See Types", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4681", + "name": "Canopic jar", + "examine": "Varies. See Types", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4682", + "name": "Holy symbol", + "examine": "A blessed holy symbol of Saradomin.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "112", + "bonuses": "0,0,0,0,0,2,2,2,2,2,3,0,0,8,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4683", + "name": "Unholy symbol", + "examine": "An unholy symbol of Zamorak.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "135", + "grand_exchange_price": "52", + "bonuses": "2,2,2,2,2,0,0,0,0,0,0,0,0,8,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4684", + "name": "Linen", + "examine": "One sheet of mummy wrap.", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4686", + "name": "Embalming manual", + "examine": "Little book of embalming by Bod E. Wrapper.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4687", + "name": "Bucket of sap", + "examine": "It's a bucket of sap.", + "low_alchemy": "12", + "high_alchemy": "18", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4689", + "name": "Pile of salt", + "examine": "A little heap of salt.", + "low_alchemy": "8", + "high_alchemy": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4691", + "name": "Sphinx's token", + "examine": "Miniature golden statue of a sphinx.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4692", + "name": "Gold leaf", + "examine": "A very delicate sheet of gold.", + "tradeable": "true", + "low_alchemy": "52000", + "high_alchemy": "78000", + "shop_price": "130000", + "grand_exchange_price": "132580", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4693", + "name": "Full bucket", + "examine": "It's a bucket of salty water.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4694", + "name": "Steam rune", + "examine": "A combined Water and Fire Rune.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "11151", + "grand_exchange_price": "48", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4695", + "name": "Mist rune", + "examine": "A combined air and water rune.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "11151", + "grand_exchange_price": "249", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4696", + "name": "Dust rune", + "examine": "A combined Air and Earth Rune.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "11151", + "grand_exchange_price": "20", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4697", + "name": "Smoke rune", + "examine": "A combined Air and Fire Rune.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "11151", + "grand_exchange_price": "148", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4698", + "name": "Mud rune", + "examine": "A combined Earth and Water rune.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "11151", + "grand_exchange_price": "657", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4699", + "name": "Lava rune", + "examine": "A combined earth and fire rune.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "11151", + "grand_exchange_price": "49", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4700", + "name": "Sapphire lantern", + "examine": "Unfuelled: You need to add lamp oil before you can use it. Unlit: A bullseye lantern with a sapphire for a lens. Lit: A lantern casting a bright blue beam.", + "low_alchemy": "240", + "high_alchemy": "360", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4701", + "name": "Sapphire lantern", + "examine": "Unfuelled: You need to add lamp oil before you can use it. Unlit: A bullseye lantern with a sapphire for a lens. Lit: A lantern casting a bright blue beam.", + "low_alchemy": "240", + "high_alchemy": "360", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4702", + "name": "Sapphire lantern", + "examine": "Unfuelled: You need to add lamp oil before you can use it. Unlit: A bullseye lantern with a sapphire for a lens. Lit: A lantern casting a bright blue beam.", + "low_alchemy": "240", + "high_alchemy": "360", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4703", + "name": "Magic stone", + "examine": "A magic stone to make high-level furniture.", + "tradeable": "true", + "low_alchemy": "390000", + "high_alchemy": "585000", + "shop_price": "975000", + "grand_exchange_price": "977755", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4704", + "name": "Stone bowl", + "examine": "A magic stone bowl for catching the tears of Guthix.", + "destroy": "true", + "tradeable": "false", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4707", + "name": "Crumbling tome", + "examine": "This book must be really old!", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4708", + "name": "Ahrim's hood", + "examine": "Ahrim The Blighted's Hood.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "94300", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "5,2,0", + "bonuses": "0,0,0,6,-2,15,13,16,6,0,15,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "0.9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4709", + "name": "Ahrim's hood", + "tradeable": "true", + "grand_exchange_price": "94300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4710", + "name": "Ahrim's staff", + "examine": "Ahrim the Blighted's quarterstaff.", + "tradeable": "true", + "low_alchemy": "34000", + "high_alchemy": "51000", + "grand_exchange_price": "69500", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "12,-1,65,15,0,3,5,2,15,0,0,68,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,70}-{6,70}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4711", + "name": "Ahrim's staff", + "tradeable": "true", + "grand_exchange_price": "69500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4712", + "name": "Ahrim's robetop", + "examine": "Ahrim the Blighted's armoured robe top.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "1000000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "10,5,0", + "bonuses": "0,0,0,30,-10,52,37,63,30,0,60,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4713", + "name": "Ahrim's robetop", + "tradeable": "true", + "grand_exchange_price": "1000000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4714", + "name": "Ahrim's robeskirt", + "examine": "Ahrim the Blighted's armoured robe skirt.", + "tradeable": "true", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "1700000", + "equipment_slot": "7", + "absorb": "7,3,0", + "bonuses": "0,0,0,22,-7,33,30,36,22,0,30,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "12", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4715", + "name": "Ahrim's robeskirt", + "tradeable": "true", + "grand_exchange_price": "1700000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4716", + "name": "Dharok's helm", + "examine": "Dharok The Wretched's Helmet", + "tradeable": "true", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "1300000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-3,-1,45,48,44,-1,51,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "1", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": "1" + }, + { + "id": "4717", + "name": "Dharok's helm", + "tradeable": "true", + "grand_exchange_price": "1300000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4718", + "name": "Dharok's greataxe", + "examine": "Dharok the Wretched's Greataxe.", + "tradeable": "true", + "low_alchemy": "83200", + "high_alchemy": "124800", + "grand_exchange_price": "516900", + "stand_anim": "2065", + "stand_turn_anim": "823", + "walk_anim": "2064", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,103,95,-4,0,0,0,0,0,-1,0,105,0,0,0", + "weapon_interface": "2", + "two_handed": "true", + "attack_anims": "2067,2067,2066,2067", + "defence_anim": "424", + "requirements": "{0,70}-{2,70}", + "weight": "13", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4719", + "name": "Dharok's greataxe", + "tradeable": "true", + "grand_exchange_price": "516900", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4720", + "name": "Dharok's platebody", + "examine": "Dharok the Wretched's platebody.", + "tradeable": "true", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "511400", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9.9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4721", + "name": "Dharok's platebody", + "tradeable": "true", + "grand_exchange_price": "511400", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4722", + "name": "Dharok's platelegs", + "examine": "Dharok the wretched's plate leg armour.", + "tradeable": "true", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "748800", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "10", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4723", + "name": "Dharok's platelegs", + "tradeable": "true", + "grand_exchange_price": "748800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4724", + "name": "Guthan's helm", + "examine": "Guthan the Infested's helm.", + "tradeable": "true", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "396300", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4725", + "name": "Guthan's helm", + "tradeable": "true", + "grand_exchange_price": "396300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4726", + "name": "Guthan's warspear", + "examine": "Guthan The Infested's Warspear.", + "tradeable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "588400", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "75,75,75,0,0,7,7,7,0,0,0,75,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,70}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4727", + "name": "Guthan's warspear", + "tradeable": "true", + "grand_exchange_price": "588400", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4728", + "name": "Guthan's platebody", + "examine": "Guthan the Infested's platebody armour.", + "tradeable": "true", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "316800", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4729", + "name": "Guthan's platebody", + "tradeable": "true", + "grand_exchange_price": "316800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4730", + "name": "Guthan's chainskirt", + "examine": "Guthan the Infested's chainskirt.", + "tradeable": "true", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "315600", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-14,-7,75,72,73,-4,82,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4731", + "name": "Guthan's chainskirt", + "tradeable": "true", + "grand_exchange_price": "315600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4732", + "name": "Karil's coif", + "examine": "Karil the Tainted's coif.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "38900", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "0,5,2", + "bonuses": "0,0,0,-1,3,6,9,12,6,10,15,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4733", + "name": "Karil's coif", + "tradeable": "true", + "grand_exchange_price": "38900", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4734", + "name": "Karil's crossbow", + "examine": "Karil the Tainted's repeating crossbow.", + "tradeable": "true", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "188000", + "stand_anim": "2074", + "stand_turn_anim": "823", + "walk_anim": "2076", + "run_anim": "2077", + "turn180_anim": "2076", + "turn90cw_anim": "2076", + "turn90ccw_anim": "2076", + "render_anim": "372", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,84,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "two_handed": "true", + "attack_anims": "2075,2075,2075,2075", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,70}", + "weight": "2", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4735", + "name": "Karil's crossbow", + "tradeable": "true", + "grand_exchange_price": "188000", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4736", + "name": "Karil's leathertop", + "examine": "Karil the Tainted's leatherbody.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "1800000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,10,5", + "bonuses": "0,0,0,-15,30,47,42,50,65,57,60,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "6", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4737", + "name": "Karil's leathertop", + "tradeable": "true", + "grand_exchange_price": "1800000", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4738", + "name": "Karil's leatherskirt", + "examine": "Karil the Tainted's leather skirt.", + "tradeable": "true", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "217000", + "equipment_slot": "7", + "absorb": "0,7,3", + "bonuses": "0,0,0,-10,17,26,20,28,35,33,30,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4739", + "name": "Karil's leatherskirt", + "tradeable": "true", + "grand_exchange_price": "217000", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4740", + "name": "Bolt rack", + "examine": "Must need a special type of crossbow to use this.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "420", + "grand_exchange_price": "238", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,55", + "requirements": "{4,70}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4745", + "name": "Torag's helm", + "examine": "Torag the Corrupted's helm.", + "tradeable": "true", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "139000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4746", + "name": "Torag's helm", + "tradeable": "true", + "grand_exchange_price": "139000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4747", + "name": "Torag's hammers", + "examine": "Torag the Corrupted's twin hammers.", + "tradeable": "true", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "111600", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-4,-4,85,-4,0,0,0,0,0,0,0,72,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "attack_anims": "2068,2068,2068,2068", + "defence_anim": "424", + "attack_audios": "1332,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4748", + "name": "Torag's hammers", + "tradeable": "true", + "grand_exchange_price": "111600", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4749", + "name": "Torag's platebody", + "examine": "Torag the Corrupted's plate body armour.", + "tradeable": "true", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "346200", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4750", + "name": "Torag's platebody", + "tradeable": "true", + "grand_exchange_price": "346200", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4751", + "name": "Torag's platelegs", + "examine": "Torag the Corrupted's plate leg armour.", + "tradeable": "true", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "427200", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4752", + "name": "Torag's platelegs", + "tradeable": "true", + "grand_exchange_price": "427200", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4753", + "name": "Verac's helm", + "examine": "Verac the Defiled's helm.", + "tradeable": "true", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "687200", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,0,56,15,0,3,0,0", + "requirements": "{1,70}", + "weight": "1", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4754", + "name": "Verac's helm", + "tradeable": "true", + "grand_exchange_price": "687200", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4755", + "name": "Verac's flail", + "examine": "Verac the Defiled's Flail.", + "tradeable": "true", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "135500", + "stand_anim": "1832", + "stand_turn_anim": "823", + "walk_anim": "1830", + "run_anim": "1831", + "turn180_anim": "2060", + "turn90cw_anim": "2060", + "turn90ccw_anim": "2060", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "68,-2,82,0,0,0,0,0,0,0,0,72,6,0,0", + "weapon_interface": "8", + "two_handed": "true", + "attack_anims": "2062,2062,2062,2062", + "defence_anim": "424", + "attack_audios": "1323,0,0,0", + "requirements": "{0,70}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4756", + "name": "Verac's flail", + "tradeable": "true", + "grand_exchange_price": "135500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4757", + "name": "Verac's brassard", + "examine": "Verac the Defiled's brassard.", + "tradeable": "true", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "270000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-6,-2,81,95,85,0,81,60,0,5,0,0", + "requirements": "{1,70}", + "weight": "5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4758", + "name": "Verac's brassard", + "tradeable": "true", + "grand_exchange_price": "270000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4759", + "name": "Verac's plateskirt", + "examine": "Verac the Defiled's plate skirt.", + "tradeable": "true", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "411400", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,0,84,30,0,4,0,0", + "requirements": "{1,70}", + "weight": "5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4760", + "name": "Verac's plateskirt", + "tradeable": "true", + "grand_exchange_price": "411400", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4773", + "name": "Bronze brutal", + "examine": "Blunt bronze arrow...ouch", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "39", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,11", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4778", + "name": "Iron brutal", + "examine": "Blunt iron arrow...ouch", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "14", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,13", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4783", + "name": "Steel brutal", + "examine": "Blunt steel arrow...ouch", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "20", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,19", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4788", + "name": "Black brutal", + "examine": "Blunt black arrow...ouch", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "grand_exchange_price": "63", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,22", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4793", + "name": "Mithril brutal", + "examine": "Blunt mithril arrow...ouch", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "20", + "grand_exchange_price": "80", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,34", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4798", + "name": "Adamant brutal", + "examine": "Blunt adamant arrow...ouch", + "tradeable": "true", + "low_alchemy": "38", + "high_alchemy": "57", + "grand_exchange_price": "154", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,45", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4803", + "name": "Rune brutal", + "examine": "Blunt rune arrow...ouch", + "tradeable": "true", + "low_alchemy": "180", + "high_alchemy": "270", + "shop_price": "180", + "grand_exchange_price": "188", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,60", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4808", + "name": "Black prism", + "examine": "A very black prism.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4809", + "name": "Torn page", + "examine": "A half torn necromantic page.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4810", + "name": "Ruined backpack", + "examine": "It's about to fall apart.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4811", + "name": "Dragon inn tankard", + "examine": "A white ceramic mug with a dragon insignia.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4812", + "name": "Zogre bones", + "examine": "A pile of Zombie Ogre bones.", + "tradeable": "true", + "grand_exchange_price": "1167", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4813", + "name": "Zogre bones", + "tradeable": "true", + "grand_exchange_price": "1167", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4814", + "name": "Sithik portrait", + "examine": "A classic realist charcoal portrait of Sithik.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4815", + "name": "Sithik portrait", + "examine": "A classic realist charcoal portrait of Sithik.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4816", + "name": "Signed portrait", + "examine": "A signed classic realist charcoal portrait of Sithik.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4817", + "name": "Book of portraiture", + "examine": "A book explaining the art of portraiture.", + "equipment_slot": "5", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4818", + "name": "Ogre artefact", + "examine": "An ancient ogre artefact-resembling a large heavy helm.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4819", + "name": "Bronze nails", + "examine": "Keeps things in place fairly permanently.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "4", + "grand_exchange_price": "16", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4820", + "name": "Iron nails", + "examine": "Keeps things in place fairly permanently.", + "tradeable": "true", + "low_alchemy": "13", + "high_alchemy": "19", + "shop_price": "33", + "grand_exchange_price": "16", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4821", + "name": "Black nails", + "examine": "Keeps things in place fairly permanently.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "grand_exchange_price": "13", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4822", + "name": "Mithril nails", + "examine": "Keeps things in place fairly permanently.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "grand_exchange_price": "35", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4823", + "name": "Adamantite nails", + "examine": "Keeps things in place fairly permanently.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "grand_exchange_price": "87", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4824", + "name": "Rune nails", + "examine": "Keeps things in place fairly permanently.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "grand_exchange_price": "114", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4825", + "name": "Unstrung comp bow", + "examine": "An unstrung composite ogre bow.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "447", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4826", + "name": "Unstrung comp bow", + "tradeable": "true", + "grand_exchange_price": "447", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4827", + "name": "Comp ogre bow", + "examine": "A composite ogre bow.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "shop_price": "180", + "grand_exchange_price": "225", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,38,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,30}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4828", + "name": "Comp ogre bow", + "tradeable": "true", + "grand_exchange_price": "225", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4829", + "name": "Book of 'h.a.m", + "examine": "A book of H.A.M. affiliation", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4830", + "name": "Fayrg bones", + "examine": "Ancient ogre bones from the ogre burial tomb.", + "tradeable": "true", + "grand_exchange_price": "5931", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4831", + "name": "Fayrg bones", + "tradeable": "true", + "grand_exchange_price": "5931", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4832", + "name": "Raurg bones", + "examine": "Ancient ogre bones from the ogre burial tomb.", + "tradeable": "true", + "grand_exchange_price": "7093", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4833", + "name": "Raurg bones", + "tradeable": "true", + "grand_exchange_price": "7093", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4834", + "name": "Ourg bones", + "examine": "Ancient ogre bones from the burial tomb.", + "tradeable": "true", + "grand_exchange_price": "16300", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4835", + "name": "Ourg bones", + "tradeable": "true", + "grand_exchange_price": "16300", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4836", + "name": "Strange potion", + "examine": "Some strange liquid given to you by Zavistic Rarve.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4837", + "name": "Necromancy book", + "examine": "A book of necromantic spells.", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4838", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4839", + "name": "Ogre gate key", + "examine": "A key to some sort of special tomb area.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4840", + "name": "Rogue's purse potion(unf)", + "examine": "I need another ingredient to finish this rogue's purse potion.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "2194", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4841", + "name": "Rogue's purse potion(unf)", + "tradeable": "true", + "grand_exchange_price": "2194", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4842", + "name": "Relicym's balm(4)", + "examine": "X doses of Relicym's balm, which helps cure disease.", + "tradeable": "true", + "shop_price": "200", + "grand_exchange_price": "1430", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4843", + "name": "Relicym's balm(4)", + "tradeable": "true", + "grand_exchange_price": "1430", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4844", + "name": "Relicym's balm(3)", + "examine": "X doses of Relicym's balm, which helps cure disease.", + "tradeable": "true", + "shop_price": "200", + "grand_exchange_price": "654", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4845", + "name": "Relicym's balm(3)", + "tradeable": "true", + "grand_exchange_price": "654", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4846", + "name": "Relicym's balm(2)", + "examine": "X doses of Relicym's balm, which helps cure disease.", + "tradeable": "true", + "shop_price": "200", + "grand_exchange_price": "325", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4847", + "name": "Relicym's balm(2)", + "tradeable": "true", + "grand_exchange_price": "325", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4848", + "name": "Relicym's balm(1)", + "examine": "X doses of Relicym's balm, which helps cure disease.", + "tradeable": "true", + "shop_price": "200", + "grand_exchange_price": "204", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4849", + "name": "Relicym's balm(1)", + "tradeable": "true", + "grand_exchange_price": "204", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4850", + "name": "Ogre coffin key", + "examine": "A key which opens a coffin!", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "1963", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4851", + "name": "Ogre coffin key", + "tradeable": "true", + "grand_exchange_price": "1963", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4852", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4853", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4854", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4855", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4856", + "name": "Ahrim's hood 100", + "examine": "Ahrim The Blighted's Hood.", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "77678", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "5,2,0", + "bonuses": "0,0,0,6,-2,15,13,16,6,0,15,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4857", + "name": "Ahrim's hood 75", + "examine": "Ahrim The Blighted's Hood.", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "77678", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "5,2,0", + "bonuses": "0,0,0,6,-2,15,13,16,6,0,15,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4858", + "name": "Ahrim's hood 50", + "examine": "Ahrim The Blighted's Hood.", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "77678", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "5,2,0", + "bonuses": "0,0,0,6,-2,15,13,16,6,0,15,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4859", + "name": "Ahrim's hood 25", + "examine": "Ahrim The Blighted's Hood.", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "77678", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "5,2,0", + "bonuses": "0,0,0,6,-2,15,13,16,6,0,15,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4860", + "name": "Ahrim's hood 0", + "examine": "Ahrim The Blighted's Hood.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "51700", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "5,2,0", + "requirements": "{1,70}-{6,70}", + "weight": "0.9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4861", + "name": "Ahrim's hood 0", + "tradeable": "true", + "grand_exchange_price": "51700", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4862", + "name": "Ahrim's staff 100", + "examine": "Ahrim the Blighted's quarterstaff.", + "low_alchemy": "34000", + "high_alchemy": "51000", + "grand_exchange_price": "50655", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "12,-1,65,15,0,3,5,2,15,0,0,68,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,70}-{6,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4863", + "name": "Ahrim's staff 75", + "examine": "Ahrim the Blighted's quarterstaff.", + "low_alchemy": "34000", + "high_alchemy": "51000", + "grand_exchange_price": "50655", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "12,-1,65,15,0,3,5,2,15,0,0,68,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,70}-{6,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4864", + "name": "Ahrim's staff 50", + "examine": "Ahrim the Blighted's quarterstaff.", + "low_alchemy": "34000", + "high_alchemy": "51000", + "grand_exchange_price": "50655", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "12,-1,65,15,0,3,5,2,15,0,0,68,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,70}-{6,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4865", + "name": "Ahrim's staff 25", + "examine": "Ahrim the Blighted's quarterstaff.", + "low_alchemy": "34000", + "high_alchemy": "51000", + "grand_exchange_price": "50655", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "12,-1,65,15,0,3,5,2,15,0,0,68,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "{0,70}-{6,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4866", + "name": "Ahrim's staff 0", + "examine": "Ahrim the Blighted's quarterstaff.", + "tradeable": "true", + "low_alchemy": "34000", + "high_alchemy": "51000", + "grand_exchange_price": "50600", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "requirements": "{0,70}-{6,70}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4867", + "name": "Ahrim's staff 0", + "tradeable": "true", + "grand_exchange_price": "50600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4868", + "name": "Ahrim's top 100", + "examine": "Ahrim the Blighted's armoured robe top.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "1458307", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "10,5,0", + "bonuses": "0,0,0,30,-10,52,37,63,30,0,60,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4869", + "name": "Ahrim's top 75", + "examine": "Ahrim the Blighted's armoured robe top.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "1458307", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "10,5,0", + "bonuses": "0,0,0,30,-10,52,37,63,30,0,60,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4870", + "name": "Ahrim's top 50", + "examine": "Ahrim the Blighted's armoured robe top.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "1458307", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "10,5,0", + "bonuses": "0,0,0,30,-10,52,37,63,30,0,60,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4871", + "name": "Ahrim's top 25", + "examine": "Ahrim the Blighted's armoured robe top.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "1458307", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "10,5,0", + "bonuses": "0,0,0,30,-10,52,37,63,30,0,60,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4872", + "name": "Ahrim's top 0", + "examine": "Ahrim the Blighted's armoured robe top.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "1100000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "10,5,0", + "requirements": "{1,70}-{6,70}", + "weight": "5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4873", + "name": "Ahrim's top 0", + "tradeable": "true", + "grand_exchange_price": "1100000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4874", + "name": "Ahrim's skirt 100", + "examine": "Ahrim the Blighted's armoured robe skirt.", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "1561591", + "equipment_slot": "7", + "absorb": "7,3,0", + "bonuses": "0,0,0,22,-7,33,30,36,22,0,30,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4875", + "name": "Ahrim's skirt 75", + "examine": "Ahrim the Blighted's armoured robe skirt.", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "1561591", + "equipment_slot": "7", + "absorb": "7,3,0", + "bonuses": "0,0,0,22,-7,33,30,36,22,0,30,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4876", + "name": "Ahrim's skirt 50", + "examine": "Ahrim the Blighted's armoured robe skirt.", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "1561591", + "equipment_slot": "7", + "absorb": "7,3,0", + "bonuses": "0,0,0,22,-7,33,30,36,22,0,30,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4877", + "name": "Ahrim's skirt 25", + "examine": "Ahrim the Blighted's armoured robe skirt.", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "1561591", + "equipment_slot": "7", + "absorb": "7,3,0", + "bonuses": "0,0,0,22,-7,33,30,36,22,0,30,0,0,0,0", + "requirements": "{1,70}-{6,70}", + "weight": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4878", + "name": "Ahrim's skirt 0", + "examine": "Ahrim the Blighted's armoured robe skirt.", + "tradeable": "true", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "1500000", + "equipment_slot": "7", + "absorb": "7,3,0", + "requirements": "{1,70}-{6,70}", + "weight": "12", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4879", + "name": "Ahrim's skirt 0", + "tradeable": "true", + "grand_exchange_price": "1500000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4880", + "name": "Dharok's helm 100", + "examine": "Dharok The Wretched's Helmet", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "1355582", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-3,-1,45,48,44,-1,51,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4881", + "name": "Dharok's helm 75", + "examine": "Dharok The Wretched's Helmet", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "1355582", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-3,-1,45,48,44,-1,51,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4882", + "name": "Dharok's helm 50", + "examine": "Dharok The Wretched's Helmet", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "1355582", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-3,-1,45,48,44,-1,51,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4883", + "name": "Dharok's helm 25", + "examine": "Dharok The Wretched's Helmet", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "1355582", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-3,-1,45,48,44,-1,51,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4884", + "name": "Dharok's helm 0", + "examine": "Dharok The Wretched's Helmet", + "tradeable": "true", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "1300000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "requirements": "{1,70}", + "weight": "1", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4885", + "name": "Dharok's helm 0", + "tradeable": "true", + "grand_exchange_price": "1300000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4886", + "name": "Dharok's axe 100", + "examine": "Dharok the Wretched's Greataxe.", + "low_alchemy": "83200", + "high_alchemy": "124800", + "grand_exchange_price": "454500", + "stand_anim": "2065", + "stand_turn_anim": "823", + "walk_anim": "2064", + "run_anim": "824", + "turn180_anim": "2064", + "turn90cw_anim": "2064", + "turn90ccw_anim": "2064", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,103,95,-4,0,0,0,0,0,-1,0,105,0,0,0", + "weapon_interface": "2", + "two_handed": "true", + "attack_anims": "2067,2067,2066,2067", + "defence_anim": "424", + "attack_audios": "1320,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4887", + "name": "Dharok's axe 75", + "examine": "Dharok the Wretched's Greataxe.", + "low_alchemy": "83200", + "high_alchemy": "124800", + "grand_exchange_price": "454500", + "stand_anim": "2065", + "stand_turn_anim": "823", + "walk_anim": "2064", + "run_anim": "824", + "turn180_anim": "2064", + "turn90cw_anim": "2064", + "turn90ccw_anim": "2064", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,103,95,-4,0,0,0,0,0,-1,0,105,0,0,0", + "weapon_interface": "2", + "two_handed": "true", + "attack_anims": "2067,2067,2066,2067", + "defence_anim": "424", + "attack_audios": "1320,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4888", + "name": "Dharok's axe 50", + "examine": "Dharok the Wretched's Greataxe.", + "low_alchemy": "83200", + "high_alchemy": "124800", + "grand_exchange_price": "454500", + "stand_anim": "2065", + "stand_turn_anim": "823", + "walk_anim": "2064", + "run_anim": "824", + "turn180_anim": "2064", + "turn90cw_anim": "2064", + "turn90ccw_anim": "2064", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,103,95,-4,0,0,0,0,0,-1,0,105,0,0,0", + "weapon_interface": "2", + "two_handed": "true", + "attack_anims": "2067,2067,2066,2067", + "defence_anim": "424", + "attack_audios": "1320,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4889", + "name": "Dharok's axe 25", + "examine": "Dharok the Wretched's Greataxe.", + "low_alchemy": "83200", + "high_alchemy": "124800", + "grand_exchange_price": "454500", + "stand_anim": "2065", + "stand_turn_anim": "823", + "walk_anim": "2064", + "run_anim": "824", + "turn180_anim": "2064", + "turn90cw_anim": "2064", + "turn90ccw_anim": "2064", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,103,95,-4,0,0,0,0,0,-1,0,105,0,0,0", + "weapon_interface": "2", + "two_handed": "true", + "attack_anims": "2067,2067,2066,2067", + "defence_anim": "424", + "attack_audios": "1320,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4890", + "name": "Dharok's axe 0", + "examine": "Dharok the Wretched's Greataxe.", + "tradeable": "true", + "low_alchemy": "83200", + "high_alchemy": "124800", + "grand_exchange_price": "442600", + "stand_anim": "2065", + "stand_turn_anim": "823", + "walk_anim": "2064", + "run_anim": "824", + "turn180_anim": "2064", + "turn90cw_anim": "2064", + "turn90ccw_anim": "2064", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "7", + "weapon_interface": "2", + "two_handed": "true", + "attack_audios": "1320,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "13", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4891", + "name": "Dharok's axe 0", + "tradeable": "true", + "grand_exchange_price": "442600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4892", + "name": "Dharok's body 100", + "examine": "Dharok the Wretched's platebody.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "481600", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4893", + "name": "Dharok's body 75", + "examine": "Dharok the Wretched's platebody.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "481600", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4894", + "name": "Dharok's body 50", + "examine": "Dharok the Wretched's platebody.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "481600", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4895", + "name": "Dharok's body 25", + "examine": "Dharok the Wretched's platebody.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "481600", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4896", + "name": "Dharok's body 0", + "examine": "Dharok the Wretched's platebody.", + "tradeable": "true", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "438200", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "requirements": "{1,70}", + "weight": "9.9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4897", + "name": "Dharok's body 0", + "tradeable": "true", + "grand_exchange_price": "438200", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4898", + "name": "Dharok's legs 100", + "examine": "Dharok the wretched's plate leg armour.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "897451", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4899", + "name": "Dharok's legs 75", + "examine": "Dharok the wretched's plate leg armour.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "897451", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4900", + "name": "Dharok's legs 50", + "examine": "Dharok the wretched's plate leg armour.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "897451", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4901", + "name": "Dharok's legs 25", + "examine": "Dharok the wretched's plate leg armour.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "897451", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4902", + "name": "Dharok's legs 0", + "examine": "Dharok the wretched's plate leg armour.", + "tradeable": "true", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "676000", + "equipment_slot": "7", + "absorb": "3,0,7", + "requirements": "{1,70}", + "weight": "10", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4903", + "name": "Dharok's legs 0", + "tradeable": "true", + "grand_exchange_price": "676000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4904", + "name": "Guthan's helm 100", + "examine": "Guthan the Infested's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "232455", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4905", + "name": "Guthan's helm 75", + "examine": "Guthan the Infested's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "232455", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4906", + "name": "Guthan's helm 50", + "examine": "Guthan the Infested's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "232455", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4907", + "name": "Guthan's helm 25", + "examine": "Guthan the Infested's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "232455", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4908", + "name": "Guthan's helm 0", + "examine": "Guthan the Infested's helm.", + "tradeable": "true", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "368200", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "requirements": "{1,70}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4909", + "name": "Guthan's helm 0", + "tradeable": "true", + "grand_exchange_price": "368200", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4910", + "name": "Guthan's spear 100", + "examine": "Guthan The Infested's Warspear.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "371782", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "75,75,75,0,0,7,7,7,0,0,0,75,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "attack_audios": "1316,0,0,0", + "requirements": "{0,70}", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4911", + "name": "Guthan's spear 75", + "examine": "Guthan The Infested's Warspear.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "371782", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "75,75,75,0,0,7,7,7,0,0,0,75,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "attack_audios": "1316,0,0,0", + "requirements": "{0,70}", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4912", + "name": "Guthan's spear 50", + "examine": "Guthan The Infested's Warspear.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "371782", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "75,75,75,0,0,7,7,7,0,0,0,75,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "attack_audios": "1316,0,0,0", + "requirements": "{0,70}", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4913", + "name": "Guthan's spear 25", + "examine": "Guthan The Infested's Warspear.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "371782", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "75,75,75,0,0,7,7,7,0,0,0,75,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "attack_audios": "1316,0,0,0", + "requirements": "{0,70}", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4914", + "name": "Guthan's spear 0", + "examine": "Guthan The Infested's Warspear.", + "tradeable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "379500", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "weapon_interface": "14", + "two_handed": "true", + "attack_audios": "1316,0,0,0", + "requirements": "{0,70}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4915", + "name": "Guthan's spear 0", + "tradeable": "true", + "grand_exchange_price": "379500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4916", + "name": "Guthan's body 100", + "examine": "Guthan the Infested's platebody armour.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "241605", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4917", + "name": "Guthan's body 75", + "examine": "Guthan the Infested's platebody armour.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "241605", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4918", + "name": "Guthan's body 50", + "examine": "Guthan the Infested's platebody armour.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "241605", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4919", + "name": "Guthan's body 25", + "examine": "Guthan the Infested's platebody armour.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "241605", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4920", + "name": "Guthan's body 0", + "examine": "Guthan the Infested's platebody armour.", + "tradeable": "true", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "245900", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "requirements": "{1,70}", + "weight": "9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4921", + "name": "Guthan's body 0", + "tradeable": "true", + "grand_exchange_price": "245900", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4922", + "name": "Guthan's skirt 100", + "examine": "Guthan the Infested's chainskirt.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "224030", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-14,-7,75,72,73,-4,82,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4923", + "name": "Guthan's skirt 75", + "examine": "Guthan the Infested's chainskirt.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "224030", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-14,-7,75,72,73,-4,82,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4924", + "name": "Guthan's skirt 50", + "examine": "Guthan the Infested's chainskirt.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "224030", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-14,-7,75,72,73,-4,82,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4925", + "name": "Guthan's skirt 25", + "examine": "Guthan the Infested's chainskirt.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "224030", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-14,-7,75,72,73,-4,82,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4926", + "name": "Guthan's skirt 0", + "examine": "Guthan the Infested's chainskirt.", + "tradeable": "true", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "240900", + "equipment_slot": "7", + "absorb": "3,0,7", + "requirements": "{1,70}", + "weight": "8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4927", + "name": "Guthan's skirt 0", + "tradeable": "true", + "grand_exchange_price": "240900", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4928", + "name": "Karil's coif 100", + "examine": "Karil the Tainted's coif.", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "7520", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "0,5,2", + "bonuses": "0,0,0,-1,3,6,9,12,6,10,15,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4929", + "name": "Karil's coif 75", + "examine": "Karil the Tainted's coif.", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "7520", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "0,5,2", + "bonuses": "0,0,0,-1,3,6,9,12,6,10,15,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4930", + "name": "Karil's coif 50", + "examine": "Karil the Tainted's coif.", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "7520", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "0,5,2", + "bonuses": "0,0,0,-1,3,6,9,12,6,10,15,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4931", + "name": "Karil's coif 25", + "examine": "Karil the Tainted's coif.", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "7520", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "0,5,2", + "bonuses": "0,0,0,-1,3,6,9,12,6,10,15,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4932", + "name": "Karil's coif 0", + "examine": "Karil the Tainted's coif.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "7557", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "0,5,2", + "requirements": "{1,70}-{4,70}", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4933", + "name": "Karil's coif 0", + "tradeable": "true", + "grand_exchange_price": "7557", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4934", + "name": "Karil's x-bow 100", + "examine": "Karil the Tainted's repeating crossbow.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "108029", + "stand_anim": "2074", + "stand_turn_anim": "823", + "walk_anim": "2076", + "run_anim": "2077", + "turn180_anim": "2076", + "turn90cw_anim": "2076", + "turn90ccw_anim": "2076", + "render_anim": "372", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,84,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "two_handed": "true", + "attack_anims": "2075,2075,2075,2075", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4935", + "name": "Karil's x-bow 75", + "examine": "Karil the Tainted's repeating crossbow.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "108029", + "stand_anim": "2074", + "stand_turn_anim": "823", + "walk_anim": "2076", + "run_anim": "2077", + "turn180_anim": "2076", + "turn90cw_anim": "2076", + "turn90ccw_anim": "2076", + "render_anim": "372", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,84,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "two_handed": "true", + "attack_anims": "2075,2075,2075,2075", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4936", + "name": "Karil's x-bow 50", + "examine": "Karil the Tainted's repeating crossbow.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "108029", + "stand_anim": "2074", + "stand_turn_anim": "823", + "walk_anim": "2076", + "run_anim": "2077", + "turn180_anim": "2076", + "turn90cw_anim": "2076", + "turn90ccw_anim": "2076", + "render_anim": "372", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,84,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "two_handed": "true", + "attack_anims": "2075,2075,2075,2075", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4937", + "name": "Karil's x-bow 25", + "examine": "Karil the Tainted's repeating crossbow.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "108029", + "stand_anim": "2074", + "stand_turn_anim": "823", + "walk_anim": "2076", + "run_anim": "2077", + "turn180_anim": "2076", + "turn90cw_anim": "2076", + "turn90ccw_anim": "2076", + "render_anim": "372", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,84,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "two_handed": "true", + "attack_anims": "2075,2075,2075,2075", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4938", + "name": "Karil's x-bow 0", + "examine": "Karil the Tainted's repeating crossbow.", + "tradeable": "true", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "106300", + "stand_anim": "2074", + "stand_turn_anim": "823", + "walk_anim": "2076", + "run_anim": "2077", + "turn180_anim": "2076", + "turn90cw_anim": "2076", + "turn90ccw_anim": "2076", + "render_anim": "372", + "equipment_slot": "3", + "attack_speed": "4", + "weapon_interface": "17", + "two_handed": "true", + "requirements": "{4,70}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4939", + "name": "Karil's x-bow 0", + "tradeable": "true", + "grand_exchange_price": "106300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4940", + "name": "Karil's top 100", + "examine": "Karil the Tainted's leatherbody.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "983428", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,10,5", + "bonuses": "0,0,0,-15,30,47,42,50,65,57,60,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4941", + "name": "Karil's top 75", + "examine": "Karil the Tainted's leatherbody.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "983428", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,10,5", + "bonuses": "0,0,0,-15,30,47,42,50,65,57,60,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4942", + "name": "Karil's top 50", + "examine": "Karil the Tainted's leatherbody.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "983428", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,10,5", + "bonuses": "0,0,0,-15,30,47,42,50,65,57,60,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4943", + "name": "Karil's top 25", + "examine": "Karil the Tainted's leatherbody.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "983428", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,10,5", + "bonuses": "0,0,0,-15,30,47,42,50,65,57,60,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4944", + "name": "Karil's top 0", + "examine": "Karil the Tainted's leatherbody.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "grand_exchange_price": "1500000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,10,5", + "requirements": "{1,70}-{4,70}", + "weight": "6", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4945", + "name": "Karil's top 0", + "tradeable": "true", + "grand_exchange_price": "1500000", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4946", + "name": "Karil's skirt 100", + "examine": "Karil the Tainted's leather skirt.", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "85135", + "equipment_slot": "7", + "absorb": "0,7,3", + "bonuses": "0,0,0,-10,17,26,20,28,35,33,30,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4947", + "name": "Karil's skirt 75", + "examine": "Karil the Tainted's leather skirt.", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "85135", + "equipment_slot": "7", + "absorb": "0,7,3", + "bonuses": "0,0,0,-10,17,26,20,28,35,33,30,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4948", + "name": "Karil's skirt 50", + "examine": "Karil the Tainted's leather skirt.", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "85135", + "equipment_slot": "7", + "absorb": "0,7,3", + "bonuses": "0,0,0,-10,17,26,20,28,35,33,30,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4949", + "name": "Karil's skirt 25", + "examine": "Karil the Tainted's leather skirt.", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "85135", + "equipment_slot": "7", + "absorb": "0,7,3", + "bonuses": "0,0,0,-10,17,26,20,28,35,33,30,0,0,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4950", + "name": "Karil's skirt 0", + "examine": "Karil the Tainted's leather skirt.", + "tradeable": "true", + "low_alchemy": "18800", + "high_alchemy": "28200", + "grand_exchange_price": "153100", + "equipment_slot": "7", + "absorb": "0,7,3", + "requirements": "{1,70}-{4,70}", + "weight": "2", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4951", + "name": "Karil's skirt 0", + "tradeable": "true", + "grand_exchange_price": "153100", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4952", + "name": "Torag's helm 100", + "examine": "Torag the Corrupted's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "71798", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4953", + "name": "Torag's helm 75", + "examine": "Torag the Corrupted's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "71798", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4954", + "name": "Torag's helm 50", + "examine": "Torag the Corrupted's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "71798", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4955", + "name": "Torag's helm 25", + "examine": "Torag the Corrupted's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "71798", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,-1,62,15,0,0,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4956", + "name": "Torag's helm 0", + "examine": "Torag the Corrupted's helm.", + "tradeable": "true", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "78200", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "requirements": "{1,70}", + "weight": "5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4957", + "name": "Torag's helm 0", + "tradeable": "true", + "grand_exchange_price": "78200", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4958", + "name": "Torag's hammer 100", + "examine": "Torag the Corrupted's twin hammers.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95800", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-4,-4,85,-4,0,0,0,0,0,0,0,72,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "attack_anims": "2068,2068,2068,2068", + "defence_anim": "424", + "attack_audios": "1332,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4959", + "name": "Torag's hammer 75", + "examine": "Torag the Corrupted's twin hammers.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95800", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-4,-4,85,-4,0,0,0,0,0,0,0,72,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "attack_anims": "2068,2068,2068,2068", + "defence_anim": "424", + "attack_audios": "1332,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4960", + "name": "Torag's hammer 50", + "examine": "Torag the Corrupted's twin hammers.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95800", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-4,-4,85,-4,0,0,0,0,0,0,0,72,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "attack_anims": "2068,2068,2068,2068", + "defence_anim": "424", + "attack_audios": "1332,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4961", + "name": "Torag's hammer 25", + "examine": "Torag the Corrupted's twin hammers.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95800", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-4,-4,85,-4,0,0,0,0,0,0,0,72,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "attack_anims": "2068,2068,2068,2068", + "defence_anim": "424", + "attack_audios": "1332,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4962", + "name": "Torag's hammer 0", + "examine": "Torag the Corrupted's twin hammers.", + "tradeable": "true", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95600", + "equipment_slot": "3", + "attack_speed": "5", + "weapon_interface": "10", + "two_handed": "true", + "attack_audios": "1332,0,0,0", + "requirements": "{0,70}-{2,70}", + "weight": "3", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4963", + "name": "Torag's hammer 0", + "tradeable": "true", + "grand_exchange_price": "95600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4964", + "name": "Torag's body 100", + "examine": "Torag the Corrupted's plate body armour.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "297733", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4965", + "name": "Torag's body 75", + "examine": "Torag the Corrupted's plate body armour.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "297733", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4966", + "name": "Torag's body 50", + "examine": "Torag the Corrupted's plate body armour.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "297733", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4967", + "name": "Torag's body 25", + "examine": "Torag the Corrupted's plate body armour.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "297733", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-30,-10,122,120,107,-6,132,60,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4968", + "name": "Torag's body 0", + "examine": "Torag the Corrupted's plate body armour.", + "tradeable": "true", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "271600", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "requirements": "{1,70}", + "weight": "9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4969", + "name": "Torag's body 0", + "tradeable": "true", + "grand_exchange_price": "271600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4970", + "name": "Torag's legs 100", + "examine": "Torag the Corrupted's plate leg armour.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "384813", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4971", + "name": "Torag's legs 75", + "examine": "Torag the Corrupted's plate leg armour.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "384813", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4972", + "name": "Torag's legs 50", + "examine": "Torag the Corrupted's plate leg armour.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "384813", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4973", + "name": "Torag's legs 25", + "examine": "Torag the Corrupted's plate leg armour.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "384813", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,-4,92,30,0,0,0,0", + "requirements": "{1,70}", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4974", + "name": "Torag's legs 0", + "examine": "Torag the Corrupted's plate leg armour.", + "tradeable": "true", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "371300", + "equipment_slot": "7", + "absorb": "3,0,7", + "requirements": "{1,70}", + "weight": "9", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4975", + "name": "Torag's legs 0", + "tradeable": "true", + "grand_exchange_price": "371300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4976", + "name": "Verac's helm 100", + "examine": "Verac the Defiled's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "459537", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,0,56,15,0,3,0,0", + "requirements": "{1,70}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4977", + "name": "Verac's helm 75", + "examine": "Verac the Defiled's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "459537", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,0,56,15,0,3,0,0", + "requirements": "{1,70}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4978", + "name": "Verac's helm 50", + "examine": "Verac the Defiled's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "459537", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,0,56,15,0,3,0,0", + "requirements": "{1,70}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4979", + "name": "Verac's helm 25", + "examine": "Verac the Defiled's helm.", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "459537", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "bonuses": "0,0,0,-6,-2,55,58,54,0,56,15,0,3,0,0", + "requirements": "{1,70}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4980", + "name": "Verac's helm 0", + "examine": "Verac the Defiled's helm.", + "tradeable": "true", + "low_alchemy": "41200", + "high_alchemy": "61800", + "grand_exchange_price": "648900", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,5", + "requirements": "{1,70}", + "weight": "1", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4981", + "name": "Verac's helm 0", + "tradeable": "true", + "grand_exchange_price": "648900", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4982", + "name": "Verac's flail 100", + "examine": "Verac the Defiled's Flail.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95474", + "stand_anim": "1832", + "stand_turn_anim": "823", + "walk_anim": "1830", + "run_anim": "1831", + "turn180_anim": "2060", + "turn90cw_anim": "2060", + "turn90ccw_anim": "2060", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "68,-2,82,0,0,0,0,0,0,0,0,72,6,0,0", + "weapon_interface": "8", + "two_handed": "true", + "attack_anims": "2062,2062,2062,2062", + "defence_anim": "424", + "attack_audios": "1323,0,0,0", + "requirements": "{0,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4983", + "name": "Verac's flail 75", + "examine": "Verac the Defiled's Flail.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95474", + "stand_anim": "1832", + "stand_turn_anim": "823", + "walk_anim": "1830", + "run_anim": "1831", + "turn180_anim": "2060", + "turn90cw_anim": "2060", + "turn90ccw_anim": "2060", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "68,-2,82,0,0,0,0,0,0,0,0,72,6,0,0", + "weapon_interface": "8", + "two_handed": "true", + "attack_anims": "2062,2062,2062,2062", + "defence_anim": "424", + "attack_audios": "1323,0,0,0", + "requirements": "{0,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4984", + "name": "Verac's flail 50", + "examine": "Verac the Defiled's Flail.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95474", + "stand_anim": "1832", + "stand_turn_anim": "823", + "walk_anim": "1830", + "run_anim": "1831", + "turn180_anim": "2060", + "turn90cw_anim": "2060", + "turn90ccw_anim": "2060", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "68,-2,82,0,0,0,0,0,0,0,0,72,6,0,0", + "weapon_interface": "8", + "two_handed": "true", + "attack_anims": "2062,2062,2062,2062", + "defence_anim": "424", + "attack_audios": "1323,0,0,0", + "requirements": "{0,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4985", + "name": "Verac's flail 25", + "examine": "Verac the Defiled's Flail.", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95474", + "stand_anim": "1832", + "stand_turn_anim": "823", + "walk_anim": "1830", + "run_anim": "1831", + "turn180_anim": "2060", + "turn90cw_anim": "2060", + "turn90ccw_anim": "2060", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "68,-2,82,0,0,0,0,0,0,0,0,72,6,0,0", + "weapon_interface": "8", + "two_handed": "true", + "attack_anims": "2062,2062,2062,2062", + "defence_anim": "424", + "attack_audios": "1323,0,0,0", + "requirements": "{0,70}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4986", + "name": "Verac's flail 0", + "examine": "Verac the Defiled's Flail.", + "tradeable": "true", + "low_alchemy": "64000", + "high_alchemy": "96000", + "grand_exchange_price": "95500", + "stand_anim": "1832", + "stand_turn_anim": "823", + "walk_anim": "1830", + "run_anim": "1831", + "turn180_anim": "2060", + "turn90cw_anim": "2060", + "turn90ccw_anim": "2060", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "weapon_interface": "8", + "two_handed": "true", + "attack_audios": "1323,0,0,0", + "requirements": "{0,70}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4987", + "name": "Verac's flail 0", + "tradeable": "true", + "grand_exchange_price": "95500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4988", + "name": "Verac's top 100", + "examine": "Verac the Defiled's brassard.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "177963", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-6,-2,81,95,85,0,81,60,0,5,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4989", + "name": "Verac's top 75", + "examine": "Verac the Defiled's brassard.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "177963", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-6,-2,81,95,85,0,81,60,0,5,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4990", + "name": "Verac's top 50", + "examine": "Verac the Defiled's brassard.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "177963", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-6,-2,81,95,85,0,81,60,0,5,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4991", + "name": "Verac's top 25", + "examine": "Verac the Defiled's brassard.", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "177963", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-6,-2,81,95,85,0,81,60,0,5,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4992", + "name": "Verac's top 0", + "examine": "Verac the Defiled's brassard.", + "tradeable": "true", + "low_alchemy": "112000", + "high_alchemy": "168000", + "grand_exchange_price": "174000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "5,0,10", + "requirements": "{1,70}", + "weight": "5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4993", + "name": "Verac's top 0", + "tradeable": "true", + "grand_exchange_price": "174000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4994", + "name": "Verac's skirt 100", + "examine": "Verac the Defiled's plate skirt.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "297540", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,0,84,30,0,4,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4995", + "name": "Verac's skirt 75", + "examine": "Verac the Defiled's plate skirt.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "297540", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,0,84,30,0,4,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4996", + "name": "Verac's skirt 50", + "examine": "Verac the Defiled's plate skirt.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "297540", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,0,84,30,0,4,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4997", + "name": "Verac's skirt 25", + "examine": "Verac the Defiled's plate skirt.", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "297540", + "equipment_slot": "7", + "absorb": "3,0,7", + "bonuses": "0,0,0,-21,-7,85,82,83,0,84,30,0,4,0,0", + "requirements": "{1,70}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4998", + "name": "Verac's skirt 0", + "examine": "Verac the Defiled's plate skirt.", + "tradeable": "true", + "low_alchemy": "110000", + "high_alchemy": "165000", + "grand_exchange_price": "321600", + "equipment_slot": "7", + "absorb": "3,0,7", + "requirements": "{1,70}", + "weight": "5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "4999", + "name": "Verac's skirt 0", + "tradeable": "true", + "grand_exchange_price": "321600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5001", + "name": "Raw cave eel", + "examine": "It's incredibly slimy.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "373", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5003", + "name": "Cave eel", + "examine": "It's a bit slimy.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "164", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5004", + "name": "Frog spawn", + "examine": "That's disgusting!", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5005", + "name": "Raw cave eel", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5006", + "name": "Burnt cave eel", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5007", + "name": "Cave eel", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5009", + "name": "Goblin symbol book", + "examine": "A book about the ancient goblin tribes.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5011", + "name": "Silverware", + "examine": "You found the Lumbridge silverware in the HAM cave.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5012", + "name": "Peace treaty", + "examine": "A peace treaty between Lumbridge and the Cave Goblins.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5013", + "name": "Mining helmet", + "examine": "Unlit: A helmet with an unlit lamp on it. Lit: A helmet with a lamp on it.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "900", + "grand_exchange_price": "380", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,4,5,3,-1,4,0,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5014", + "name": "Mining helmet", + "examine": "Unlit: A helmet with an unlit lamp on it. Lit: A helmet with a lamp on it.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "900", + "grand_exchange_price": "342", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,4,5,3,-1,4,0,0,0,0,0", + "requirements": "{11,65}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5015", + "name": "Mining helmet", + "tradeable": "true", + "grand_exchange_price": "342", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5016", + "name": "Bone spear", + "examine": "Basic but brutal!", + "tradeable": "true", + "low_alchemy": "240", + "high_alchemy": "360", + "shop_price": "600", + "grand_exchange_price": "219", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "11,11,11,0,0,1,1,0,0,0,0,13,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5017", + "name": "Bone spear", + "tradeable": "true", + "grand_exchange_price": "219", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5018", + "name": "Bone club", + "examine": "Basic but brutal!", + "tradeable": "true", + "low_alchemy": "240", + "high_alchemy": "360", + "shop_price": "600", + "grand_exchange_price": "384", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,16,-4,0,0,0,0,0,0,0,15,0,0,0", + "weapon_interface": "10", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5019", + "name": "Bone club", + "tradeable": "true", + "grand_exchange_price": "384", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5020", + "name": "Minecart ticket", + "examine": "A ticket to take you from the dwarven mines under Ice Mountain to Keldagrim.", + "shop_price": "150", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5021", + "name": "Minecart ticket", + "examine": "A ticket to take you from the dwarven mines under Ice Mountain to Keldagrim.", + "shop_price": "150", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5022", + "name": "Minecart ticket", + "examine": "A ticket to take you from the dwarven mines under Ice Mountain to Keldagrim.", + "shop_price": "150", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5023", + "name": "Minecart ticket", + "examine": "A ticket to take you from the dwarven mines under Ice Mountain to Keldagrim.", + "shop_price": "150", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5024", + "name": "Woven top", + "examine": "Blue top, very tiny.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "shop_price": "812", + "grand_exchange_price": "710", + "remove_sleeves": "true", + "equipment_slot": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5025", + "name": "Woven top", + "tradeable": "true", + "grand_exchange_price": "710", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5026", + "name": "Woven top", + "examine": "Blue top, very tiny.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "shop_price": "812", + "grand_exchange_price": "908", + "remove_sleeves": "true", + "equipment_slot": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5027", + "name": "Woven top", + "tradeable": "true", + "grand_exchange_price": "908", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5028", + "name": "Woven top", + "examine": "Blue top, very tiny.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "shop_price": "812", + "grand_exchange_price": "1357", + "remove_sleeves": "true", + "equipment_slot": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5029", + "name": "Woven top", + "tradeable": "true", + "grand_exchange_price": "1357", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5030", + "name": "Shirt", + "grand_exchange_price": "867", + "remove_sleeves": "true", + "equipment_slot": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5031", + "name": "Shirt", + "tradeable": "true", + "grand_exchange_price": "867", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5032", + "name": "Shirt", + "grand_exchange_price": "1023", + "remove_sleeves": "true", + "equipment_slot": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5033", + "name": "Shirt", + "tradeable": "true", + "grand_exchange_price": "1023", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5034", + "name": "Shirt", + "grand_exchange_price": "1282", + "remove_sleeves": "true", + "equipment_slot": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5035", + "name": "Shirt", + "tradeable": "true", + "grand_exchange_price": "1282", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5036", + "name": "Trousers", + "grand_exchange_price": "746", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5037", + "name": "Trousers", + "tradeable": "true", + "grand_exchange_price": "746", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5038", + "name": "Trousers", + "grand_exchange_price": "378", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5039", + "name": "Trousers", + "tradeable": "true", + "grand_exchange_price": "378", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5040", + "name": "Trousers", + "grand_exchange_price": "442", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5041", + "name": "Trousers", + "tradeable": "true", + "grand_exchange_price": "442", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5042", + "name": "Shorts", + "grand_exchange_price": "1191", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5043", + "name": "Shorts", + "tradeable": "true", + "grand_exchange_price": "1191", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5044", + "name": "Shorts", + "grand_exchange_price": "1229", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5045", + "name": "Shorts", + "tradeable": "true", + "grand_exchange_price": "1229", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5046", + "name": "Shorts", + "grand_exchange_price": "2582", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5047", + "name": "Shorts", + "tradeable": "true", + "grand_exchange_price": "2582", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5048", + "name": "Skirt", + "grand_exchange_price": "681", + "equipment_slot": "7", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5049", + "name": "Skirt", + "tradeable": "true", + "grand_exchange_price": "681", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5050", + "name": "Skirt", + "grand_exchange_price": "1151", + "equipment_slot": "7", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5051", + "name": "Skirt", + "tradeable": "true", + "grand_exchange_price": "1151", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5052", + "name": "Skirt", + "grand_exchange_price": "803", + "equipment_slot": "7", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5053", + "name": "Skirt", + "tradeable": "true", + "grand_exchange_price": "803", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5054", + "name": "Dwarf", + "examine": "A short angry guy.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5055", + "name": "Dwarf", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5056", + "name": "Dwarven battleaxe", + "examine": "This looks very rusty and worn;", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5057", + "name": "Dwarven battleaxe", + "examine": "This looks very rusty and worn;", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5058", + "name": "Dwarven battleaxe", + "examine": "This looks very rusty and worn;", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5059", + "name": "Dwarven battleaxe", + "examine": "This looks very rusty and worn;", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5060", + "name": "Dwarven battleaxe", + "examine": "This looks very rusty and worn;", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5061", + "name": "Dwarven battleaxe", + "examine": "This looks very rusty and worn;", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5062", + "name": "Left boot", + "examine": "One of a pair I assume.", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5063", + "name": "Right boot", + "examine": "A good looking boot, for the right foot. Literally.", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5064", + "name": "Exquisite boots", + "examine": "A lovely pair of boots.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5065", + "name": "Book on costumes", + "examine": "An old library book. It bears the title 'Scholars to Dwarven Costumes'.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5066", + "name": "Meeting notes", + "examine": "These notes are from a meeting of the Keldagrim Consortium.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5067", + "name": "Exquisite clothes", + "examine": "Clothes for the sculptor's model.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5068", + "name": "Master farmer", + "examine": "A master at farming.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5070", + "name": "Bird's nest", + "tradeable": "false", + "examine": "Full: ", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5071", + "name": "Bird's nest", + "tradeable": "false", + "examine": "Full: ", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5072", + "name": "Bird's nest", + "tradeable": "false", + "examine": "Full: ", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5073", + "name": "Bird's nest", + "examine": "Full: ", + "tradeable": "false", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5074", + "name": "Bird's nest", + "examine": "Full: ", + "tradeable": "false", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5075", + "name": "Bird's nest", + "examine": "Full: ", + "tradeable": "false", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5076", + "name": "Bird's egg", + "examine": "A red bird's egg.", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5077", + "name": "Bird's egg", + "examine": "A blue bird's egg.", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5078", + "name": "Bird's egg", + "examine": "A green bird's egg.", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5096", + "name": "Marigold seed", + "examine": "A marigold seed - plant in flower patch.", + "tradeable": "true", + "shop_price": "84", + "grand_exchange_price": "8", + "requirements": "{2,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5097", + "name": "Rosemary seed", + "examine": "A rosemary seed - plant in flower patch.", + "tradeable": "true", + "shop_price": "98", + "grand_exchange_price": "3", + "requirements": "{11,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5098", + "name": "Nasturtium seed", + "examine": "A nasturtium seed - plant in flower patch.", + "tradeable": "true", + "shop_price": "14", + "grand_exchange_price": "1", + "requirements": "{24,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5099", + "name": "Woad seed", + "examine": "A woad seed - plant in flower patch.", + "tradeable": "true", + "grand_exchange_price": "1", + "requirements": "{19,25}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5100", + "name": "Limpwurt seed", + "examine": "A limpwurt seed - plant in flower patch.", + "tradeable": "true", + "shop_price": "70", + "grand_exchange_price": "273", + "requirements": "{19,26}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5101", + "name": "Redberry seed", + "examine": "A redberry seed - Plant in a bush patch.", + "tradeable": "true", + "grand_exchange_price": "1", + "requirements": "{10,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5102", + "name": "Cadavaberry seed", + "examine": "A cadavaberry seed - Plant in a bush patch.", + "tradeable": "true", + "grand_exchange_price": "1", + "requirements": "{22,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5103", + "name": "Dwellberry seed", + "examine": "A dwellberry seed - Plant in a bush patch.", + "tradeable": "true", + "grand_exchange_price": "1", + "requirements": "{19,36}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5104", + "name": "Jangerberry seed", + "examine": "A jangerberry bush seed - plant in a bush patch.", + "tradeable": "true", + "shop_price": "22", + "grand_exchange_price": "2", + "requirements": "{19,48}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5105", + "name": "Whiteberry seed", + "examine": "A whiteberry bush seed - plant in a bush patch.", + "tradeable": "true", + "grand_exchange_price": "8", + "requirements": "{19,59}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5106", + "name": "Poison ivy seed", + "examine": "A poison ivy bush seed - plant in a bush patch.", + "tradeable": "true", + "grand_exchange_price": "38", + "requirements": "{19,70}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5280", + "name": "Cactus seed", + "examine": "A Cactus seed - plant in a cactus patch.", + "tradeable": "true", + "shop_price": "29", + "grand_exchange_price": "10", + "requirements": "{19,55}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5281", + "name": "Belladonna seed", + "examine": "Also known as Deadly Nightshade - plant in a belladonna patch.", + "tradeable": "true", + "grand_exchange_price": "24", + "requirements": "{19,63}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5282", + "name": "Mushroom spore", + "grand_exchange_price": "2", + "requirements": "{19,53}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5283", + "name": "Apple tree seed", + "examine": "Plant this in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "4", + "requirements": "{19,27}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5284", + "name": "Banana tree seed", + "examine": "Plant this in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "5", + "requirements": "{19,33}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5285", + "name": "Orange tree seed", + "examine": "Plant this in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "30", + "requirements": "{19,39}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5286", + "name": "Curry tree seed", + "examine": "Plant this in a plant pot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "265", + "requirements": "{19,42}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5287", + "name": "Pineapple seed", + "examine": "Plant this in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "13700", + "requirements": "{19,51}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5288", + "name": "Papaya tree seed", + "examine": "Plant this in a plant pot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "41200", + "requirements": "{19,57}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5289", + "name": "Palm tree seed", + "examine": "Plant in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "shop_price": "35000", + "grand_exchange_price": "105100", + "requirements": "{19,68}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5290", + "name": "Calquat tree seed", + "examine": "Plant in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "shop_price": "35000", + "grand_exchange_price": "32000", + "requirements": "{19,72}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5291", + "name": "Guam seed", + "examine": "A guam seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "5", + "requirements": "{9,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5292", + "name": "Marrentill seed", + "examine": "A marrentill seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "5", + "requirements": "{14,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5293", + "name": "Tarromin seed", + "examine": "A tarromin seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "1", + "requirements": "{19,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5294", + "name": "Harralander seed", + "examine": "A harralander seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "4", + "requirements": "{19,26}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5295", + "name": "Ranarr seed", + "examine": "A Ranarr seed - plant in a herb patch.", + "tradeable": "true", + "shop_price": "4000", + "grand_exchange_price": "9489", + "requirements": "{19,32}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5296", + "name": "Toadflax seed", + "examine": "A toadflax seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "2980", + "requirements": "{19,38}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5297", + "name": "Irit seed", + "examine": "An irit seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "181", + "requirements": "{19,44}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5298", + "name": "Avantoe seed", + "examine": "An avantoe seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "2492", + "requirements": "{19,50}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5299", + "name": "Kwuarm seed", + "examine": "A kwuarm seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "537", + "requirements": "{19,56}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5300", + "name": "Snapdragon seed", + "examine": "A snapdragon seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "47800", + "requirements": "{19,62}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5301", + "name": "Cadantine seed", + "examine": "A cadantine seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "1253", + "requirements": "{19,67}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5302", + "name": "Lantadyme seed", + "examine": "A lantadyme seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "37100", + "requirements": "{19,73}", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5303", + "name": "Dwarf weed seed", + "examine": "A dwarf weed seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "41900", + "requirements": "{19,79}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5304", + "name": "Torstol seed", + "examine": "A Torstol seed - plant in a herb patch.", + "tradeable": "true", + "grand_exchange_price": "302300", + "requirements": "{19,85}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5305", + "name": "Barley seed", + "examine": "A barley seed - plant in a hops patch.", + "tradeable": "true", + "shop_price": "38", + "grand_exchange_price": "1", + "requirements": "{3,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5306", + "name": "Jute seed", + "examine": "A jute seed - plant in a hops patch.", + "tradeable": "true", + "shop_price": "86", + "grand_exchange_price": "2", + "requirements": "{13,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5307", + "name": "Hammerstone seed", + "examine": "A hammerstone hop seed - plant in a hops patch.", + "tradeable": "true", + "shop_price": "52", + "grand_exchange_price": "1", + "requirements": "{4,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5308", + "name": "Asgarnian seed", + "examine": "An Asgarnian hop seed - plant in a hops patch.", + "tradeable": "true", + "shop_price": "60", + "grand_exchange_price": "1", + "requirements": "{8,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5309", + "name": "Yanillian seed", + "examine": "A yanillian hop seed - plant in a hops patch.", + "tradeable": "true", + "shop_price": "210", + "grand_exchange_price": "11", + "requirements": "{16,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5310", + "name": "Krandorian seed", + "examine": "A krandorian hop seed - plant in a hops patch.", + "tradeable": "true", + "shop_price": "8", + "grand_exchange_price": "1", + "requirements": "{21,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5311", + "name": "Wildblood seed", + "examine": "A wildblood hop seed - plant in a hops patch.", + "tradeable": "true", + "shop_price": "14", + "grand_exchange_price": "12", + "requirements": "{19,28}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5312", + "name": "Acorn", + "examine": "Plant this in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "shop_price": "100", + "grand_exchange_price": "22", + "requirements": "{15,19}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5313", + "name": "Willow seed", + "examine": "Plant this in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "945", + "requirements": "{19,30}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5314", + "name": "Maple seed", + "examine": "Plant this in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "35400", + "requirements": "{19,45}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5315", + "name": "Yew seed", + "examine": "Plant this in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "81900", + "requirements": "{19,60}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5316", + "name": "Magic seed", + "examine": "Plant this in a plantpot of soil to grow a sapling.", + "tradeable": "true", + "grand_exchange_price": "276900", + "requirements": "{19,75}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5317", + "name": "Spirit seed", + "examine": "Plant this in a plant pot of soil to grow a sapling.", + "shop_price": "55000", + "requirements": "{19,83}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5318", + "name": "Potato seed", + "examine": "A potato seed - plant in an allotment.", + "tradeable": "true", + "shop_price": "8", + "grand_exchange_price": "1", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5319", + "name": "Onion seed", + "examine": "An onion seed - plant in an allotment.", + "tradeable": "true", + "shop_price": "10", + "grand_exchange_price": "1", + "requirements": "{5,19}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5320", + "name": "Sweetcorn seed", + "examine": "A sweetcorn seed - plant in an allotment.", + "tradeable": "true", + "grand_exchange_price": "2", + "requirements": "{20,19}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5321", + "name": "Watermelon seed", + "examine": "A watermelon seed - plant in an allotment.", + "tradeable": "true", + "shop_price": "56", + "grand_exchange_price": "2491", + "requirements": "{19,47}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5322", + "name": "Tomato seed", + "examine": "A tomato seed - plant in an allotment.", + "tradeable": "true", + "shop_price": "10", + "grand_exchange_price": "1", + "requirements": "{12,19}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5323", + "name": "Strawberry seed", + "examine": "A strawberry seed - plant in an allotment.", + "tradeable": "true", + "grand_exchange_price": "240", + "requirements": "{19,31}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5324", + "name": "Cabbage seed", + "examine": "A cabbage seed - plant in an allotment.", + "tradeable": "true", + "shop_price": "25", + "grand_exchange_price": "1", + "requirements": "{7,19}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5325", + "name": "Gardening trowel", + "examine": "Not suitable for archaeological digs.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "shop_price": "12", + "grand_exchange_price": "106", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5326", + "name": "Gardening trowel", + "tradeable": "true", + "grand_exchange_price": "106", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5327", + "name": "Spade handle", + "examine": "I need to attach this to its head.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5328", + "name": "Spade head", + "examine": "I need to attach this to its handle.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5329", + "name": "Secateurs", + "examine": "Good for pruning away diseased leaves.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "204", + "equipment_slot": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5330", + "name": "Secateurs", + "tradeable": "true", + "grand_exchange_price": "204", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5331", + "name": "Watering can", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "298", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5332", + "name": "Watering can", + "tradeable": "true", + "grand_exchange_price": "298", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5333", + "name": "Watering can(1)", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "206", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5334", + "name": "Watering can(2)", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "206", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5335", + "name": "Watering can(3)", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "206", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5336", + "name": "Watering can(4)", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "206", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5337", + "name": "Watering can(5)", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "206", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5338", + "name": "Watering can(6)", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "206", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5339", + "name": "Watering can(7)", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "206", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5340", + "name": "Watering can(8)", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "206", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5341", + "name": "Rake", + "examine": "Use this to clear weeds.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "99", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5342", + "name": "Rake", + "tradeable": "true", + "grand_exchange_price": "99", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5343", + "name": "Seed dibber", + "examine": "Use this to plant seeds with.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "117", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5344", + "name": "Seed dibber", + "tradeable": "true", + "grand_exchange_price": "117", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5345", + "name": "Gardening boots", + "examine": "A pair of gardening boots.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "3186", + "equipment_slot": "10", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5346", + "name": "Gardening boots", + "tradeable": "true", + "grand_exchange_price": "3186", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5347", + "name": "Rake handle", + "examine": "I need to reattach this to its head.", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5348", + "name": "Rake head", + "examine": "I need to reattach this to its handle.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5350", + "name": "Plant pot", + "examine": "A plant pot filled with soil.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "20", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5351", + "name": "Plant pot", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5352", + "name": "Unfired plant pot", + "examine": "An unfired plant pot.", + "tradeable": "true", + "shop_price": "9", + "grand_exchange_price": "7", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5353", + "name": "Unfired plant pot", + "tradeable": "true", + "grand_exchange_price": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5354", + "name": "Plant pot", + "examine": "A plant pot filled with soil.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "340", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5355", + "name": "Plant pot", + "tradeable": "true", + "grand_exchange_price": "340", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5356", + "name": "Plant pot", + "examine": "A plant pot filled with soil.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "243", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5357", + "name": "Plant pot", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5358", + "name": "Oak seedling", + "examine": "An acorn has been sown and watered in this plant pot.", + "shop_price": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5359", + "name": "Willow seedling", + "examine": "A willow tree seed has been sown and watered in this plant pot", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5360", + "name": "Maple seedling", + "examine": "A maple tree has been sown (and watered) in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5361", + "name": "Yew seedling", + "examine": "A yew seed has been sown in the plant pot", + "high_alchemy": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5362", + "name": "Magic seedling", + "examine": "A magic tree seed has been sown and watered in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5363", + "name": "Spirit seedling", + "examine": "A spirit seedling is growing in this pot. It has been sown and watered.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5364", + "name": "Oak seedling", + "examine": "An acorn has been sown and watered in this plant pot.", + "shop_price": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5365", + "name": "Willow seedling", + "examine": "A willow tree seed has been sown and watered in this plant pot", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5366", + "name": "Maple seedling", + "examine": "A maple tree has been sown (and watered) in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5367", + "name": "Yew seedling", + "examine": "A yew seed has been sown in the plant pot", + "high_alchemy": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5368", + "name": "Magic seedling", + "examine": "A magic tree seed has been sown and watered in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5369", + "name": "Spirit seedling", + "examine": "A spirit seedling is growing in this pot. It has been sown and watered.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5370", + "name": "Oak sapling", + "examine": "This sapling is ready to be planted in a tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5371", + "name": "Willow sapling", + "examine": "This sapling is ready to be replanted in a tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5372", + "name": "Maple sapling", + "examine": "This sapling is ready to be planted in a tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5373", + "name": "Yew sapling", + "examine": "This sapling is ready to be planted in a tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5374", + "name": "Magic sapling", + "examine": "This sapling is ready to be planted in a tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5375", + "name": "Spirit sapling", + "examine": "This sapling is ready to be planted in a tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5376", + "name": "Basket", + "examine": "An empty fruit basket.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5377", + "name": "Basket", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5378", + "name": "Apples(1)", + "examine": "A fruit basket filled with apples.", + "tradeable": "true", + "grand_exchange_price": "1889", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5379", + "name": "Apples(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5380", + "name": "Apples(2)", + "examine": "A fruit basket filled with apples.", + "tradeable": "true", + "grand_exchange_price": "1889", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5381", + "name": "Apples(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5382", + "name": "Apples(3)", + "examine": "A fruit basket filled with apples.", + "tradeable": "true", + "grand_exchange_price": "1889", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5383", + "name": "Apples(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5384", + "name": "Apples(4)", + "examine": "A fruit basket filled with apples.", + "tradeable": "true", + "grand_exchange_price": "1889", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5385", + "name": "Apples(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5386", + "name": "Apples(5)", + "examine": "A fruit basket filled with apples.", + "tradeable": "true", + "grand_exchange_price": "2448", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5387", + "name": "Apples(5)", + "tradeable": "true", + "grand_exchange_price": "2448", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5388", + "name": "Oranges(1)", + "examine": "A fruit basket filled with oranges", + "tradeable": "true", + "grand_exchange_price": "3823", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5389", + "name": "Oranges(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5390", + "name": "Oranges(2)", + "examine": "A fruit basket filled with oranges", + "tradeable": "true", + "grand_exchange_price": "3823", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5391", + "name": "Oranges(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5392", + "name": "Oranges(3)", + "examine": "A fruit basket filled with oranges", + "tradeable": "true", + "grand_exchange_price": "3823", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5393", + "name": "Oranges(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5394", + "name": "Oranges(4)", + "examine": "A fruit basket filled with oranges", + "tradeable": "true", + "grand_exchange_price": "3823", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5395", + "name": "Oranges(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5396", + "name": "Oranges(5)", + "examine": "A common fruit.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "shop_price": "70", + "grand_exchange_price": "5649", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5397", + "name": "Oranges(5)", + "tradeable": "true", + "grand_exchange_price": "5649", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5398", + "name": "Strawberries(1)", + "examine": "A fruit basket filled with strawberries.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "5", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5399", + "name": "Strawberries(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5400", + "name": "Strawberries(2)", + "examine": "A fruit basket filled with strawberries.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "5", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5401", + "name": "Strawberries(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5402", + "name": "Strawberries(3)", + "examine": "A fruit basket filled with strawberries.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "5", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5403", + "name": "Strawberries(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5404", + "name": "Strawberries(4)", + "examine": "A fruit basket filled with strawberries.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "5", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5405", + "name": "Strawberries(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5406", + "name": "Strawberries(5)", + "examine": "A fruit basket filled with strawberries.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "406", + "weight": "0.25", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5407", + "name": "Strawberries(5)", + "tradeable": "true", + "grand_exchange_price": "406", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5408", + "name": "Bananas(1)", + "examine": "A fruit basket filled with bananas.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1064", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5409", + "name": "Bananas(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5410", + "name": "Bananas(2)", + "examine": "A fruit basket filled with bananas.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1064", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5411", + "name": "Bananas(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5412", + "name": "Bananas(3)", + "examine": "A fruit basket filled with bananas.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1064", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5413", + "name": "Bananas(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5414", + "name": "Bananas(4)", + "examine": "Mmm this looks tasty.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "171", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5415", + "name": "Bananas(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5416", + "name": "Bananas(5)", + "examine": "Mmm this looks tasty.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "1637", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5417", + "name": "Bananas(5)", + "tradeable": "true", + "grand_exchange_price": "1637", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5418", + "name": "Empty sack", + "examine": "An empty sack.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "45", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5419", + "name": "Empty sack", + "tradeable": "true", + "grand_exchange_price": "45", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5420", + "name": "Potatoes(1)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1276", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5421", + "name": "Potatoes(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5422", + "name": "Potatoes(2)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1276", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5423", + "name": "Potatoes(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5424", + "name": "Potatoes(3)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1276", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5425", + "name": "Potatoes(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5426", + "name": "Potatoes(4)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1276", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5427", + "name": "Potatoes(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5428", + "name": "Potatoes(5)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1276", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5429", + "name": "Potatoes(5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5430", + "name": "Potatoes(6)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1276", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5431", + "name": "Potatoes(6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5432", + "name": "Potatoes(7)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1276", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5433", + "name": "Potatoes(7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5434", + "name": "Potatoes(8)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1276", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5435", + "name": "Potatoes(8)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5436", + "name": "Potatoes(9)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1276", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5437", + "name": "Potatoes(9)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5438", + "name": "Potatoes(10)", + "examine": "There are <number of potatoes> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1052", + "weight": "0.9", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5439", + "name": "Potatoes(10)", + "tradeable": "true", + "grand_exchange_price": "1052", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5440", + "name": "Onions(1)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "589", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5441", + "name": "Onions(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5442", + "name": "Onions(2)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "589", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5443", + "name": "Onions(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5444", + "name": "Onions(3)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "589", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5445", + "name": "Onions(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5446", + "name": "Onions(4)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "589", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5447", + "name": "Onions(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5448", + "name": "Onions(5)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "589", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5449", + "name": "Onions(5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5450", + "name": "Onions(6)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "589", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5451", + "name": "Onions(6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5452", + "name": "Onions(7)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "589", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5453", + "name": "Onions(7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5454", + "name": "Onions(8)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "589", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5455", + "name": "Onions(8)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5456", + "name": "Onions(9)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "589", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5457", + "name": "Onions(9)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5458", + "name": "Onions(10)", + "examine": "There are/is (1-10) onion(s) in this sack.", + "tradeable": "true", + "grand_exchange_price": "489", + "weight": "0.9", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5459", + "name": "Onions(10)", + "tradeable": "true", + "grand_exchange_price": "489", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5460", + "name": "Cabbages(1)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1304", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5461", + "name": "Cabbages(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5462", + "name": "Cabbages(2)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1304", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5463", + "name": "Cabbages(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5464", + "name": "Cabbages(3)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1304", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5465", + "name": "Cabbages(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5466", + "name": "Cabbages(4)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1304", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5467", + "name": "Cabbages(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5468", + "name": "Cabbages(5)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1304", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5469", + "name": "Cabbages(5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5470", + "name": "Cabbages(6)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1304", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5471", + "name": "Cabbages(6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5472", + "name": "Cabbages(7)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1304", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5473", + "name": "Cabbages(7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5474", + "name": "Cabbages(8)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1304", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5475", + "name": "Cabbages(8)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5476", + "name": "Cabbages(9)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "1304", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5477", + "name": "Cabbages(9)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5478", + "name": "Cabbages(10)", + "examine": "There are <number of cabbages> in this sack.", + "tradeable": "true", + "grand_exchange_price": "917", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5479", + "name": "Cabbages(10)", + "tradeable": "true", + "grand_exchange_price": "917", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5480", + "name": "Apple seedling", + "examine": "An apple tree has been sown (and watered) in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5481", + "name": "Banana seedling", + "examine": "A banana tree seed has been sown and watered in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5482", + "name": "Orange seedling", + "examine": "An orange tree seed has been sown (and watered)in this plant pot.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5483", + "name": "Curry seedling", + "examine": "A curry seed has been sown and watered in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5484", + "name": "Pineapple seedling", + "examine": "A pineapple tree has been sown (and watered) in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5485", + "name": "Papaya seedling", + "examine": "This needs watering before it will grow.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5486", + "name": "Palm seedling", + "examine": "This sapling is ready to be replanted in a fruit tree patch.", + "weight": "0.66", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5487", + "name": "Calquat seedling", + "examine": "A calquat tree has been sown (and watered) in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5488", + "name": "Apple seedling", + "examine": "An apple tree has been sown (and watered) in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5489", + "name": "Banana seedling", + "examine": "A banana tree seed has been sown and watered in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5490", + "name": "Orange seedling", + "examine": "An orange tree seed has been sown (and watered)in this plant pot.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5491", + "name": "Curry seedling", + "examine": "A curry seed has been sown and watered in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5492", + "name": "Pineapple seedling", + "examine": "A pineapple tree has been sown (and watered) in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5493", + "name": "Papaya seedling", + "examine": "This needs watering before it will grow.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5494", + "name": "Palm seedling", + "examine": "This sapling is ready to be replanted in a fruit tree patch.", + "weight": "0.66", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5495", + "name": "Calquat seedling", + "examine": "A calquat tree has been sown (and watered) in this plant pot.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5496", + "name": "Apple sapling", + "examine": "This sapling is ready to be replanted in a fruit tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5497", + "name": "Banana sapling", + "examine": "This sapling is ready to be replanted in a fruit tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5498", + "name": "Orange sapling", + "examine": "This sapling is ready to be replanted in a fruit tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5499", + "name": "Curry sapling", + "examine": "This sapling is ready to be replanted in a fruit tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5500", + "name": "Pineapple sapling", + "examine": "This sapling is ready to be replanted in a fruit tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5501", + "name": "Papaya sapling", + "examine": "This sapling is ready to be replanted in a fruit tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5502", + "name": "Palm sapling", + "examine": "This sapling is ready to be replanted in a fruit tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5503", + "name": "Calquat sapling", + "examine": "This sapling is ready to be planted in a tree patch.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5504", + "name": "Strawberry", + "examine": "A freshly picked strawberry.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "grand_exchange_price": "23", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5505", + "name": "Strawberry", + "tradeable": "true", + "grand_exchange_price": "23", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5506", + "name": "Old man's message", + "examine": "The Wise Old Man of Draynor Village asked you to take this to someone.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5507", + "name": "Strange book", + "examine": "A tatty old book belonging to the Wise Old Man of Draynor Village.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5508", + "name": "Book of folklore", + "examine": "A tatty old book belonging to the Wise Old Man of Draynor Village.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5509", + "name": "Small pouch", + "examine": "A small pouch used for storing essence.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5510", + "name": "Medium pouch", + "examine": "A medium-sized pouch used for storing essence.", + "low_alchemy": "120", + "high_alchemy": "180", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5511", + "name": "Medium pouch", + "examine": "A medium-sized pouch used for storing essence.", + "low_alchemy": "120", + "high_alchemy": "180", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5512", + "name": "Large pouch", + "examine": "A large pouch used for storing essence.", + "low_alchemy": "240", + "high_alchemy": "360", + "shop_price": "25000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5513", + "name": "Large pouch", + "examine": "A large pouch used for storing essence.", + "low_alchemy": "240", + "high_alchemy": "360", + "shop_price": "25000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5514", + "name": "Giant pouch", + "examine": "A giant-sized pouch used for storing essence.", + "low_alchemy": "480", + "high_alchemy": "720", + "shop_price": "50000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5515", + "name": "Giant pouch", + "examine": "A giant-sized pouch used for storing essence.", + "low_alchemy": "480", + "high_alchemy": "720", + "shop_price": "50000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5516", + "name": "Elemental talisman", + "examine": "A mysterious power emanates from the talisman...", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "186900", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5517", + "name": "Elemental talisman", + "tradeable": "true", + "grand_exchange_price": "186900", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5518", + "name": "Scrying orb", + "examine": "When empty:", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5519", + "name": "Scrying orb", + "examine": "When empty:", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5520", + "name": "Abyssal book", + "examine": "Some research notes on abyssal space.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5521", + "name": "Binding necklace", + "examine": "A necklace embedded with mystical power.", + "tradeable": "true", + "low_alchemy": "570", + "high_alchemy": "855", + "grand_exchange_price": "720", + "equipment_slot": "2", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5522", + "name": "Binding necklace", + "tradeable": "true", + "grand_exchange_price": "720", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5523", + "name": "Tiara mould", + "examine": "A mould for tiaras.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "grand_exchange_price": "315", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5524", + "name": "Tiara mould", + "tradeable": "true", + "grand_exchange_price": "315", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5525", + "name": "Tiara", + "examine": "Makes me feel like a Princess.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "13", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5526", + "name": "Tiara", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5527", + "name": "Air tiara", + "examine": "A tiara infused with the properties of air.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "5", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5528", + "name": "Air tiara", + "tradeable": "true", + "grand_exchange_price": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5529", + "name": "Mind tiara", + "examine": "A tiara infused with the properties of the mind.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "10", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5530", + "name": "Mind tiara", + "tradeable": "true", + "grand_exchange_price": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5531", + "name": "Water tiara", + "examine": "A tiara infused with the properties of water.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "1351", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5532", + "name": "Water tiara", + "tradeable": "true", + "grand_exchange_price": "1351", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5533", + "name": "Body tiara", + "examine": "A tiara infused with the properties of the body.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "5", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5534", + "name": "Body tiara", + "tradeable": "true", + "grand_exchange_price": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5535", + "name": "Earth tiara", + "examine": "A tiara infused with the properties of the earth.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "4", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5536", + "name": "Earth tiara", + "tradeable": "true", + "grand_exchange_price": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5537", + "name": "Fire tiara", + "examine": "A tiara infused with the properties of fire.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "8", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5538", + "name": "Fire tiara", + "tradeable": "true", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5539", + "name": "Cosmic tiara", + "examine": "A tiara infused with the properties of the cosmos.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "8", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5540", + "name": "Cosmic tiara", + "tradeable": "true", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5541", + "name": "Nature tiara", + "examine": "A tiara infused with the properties of nature.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "10", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5542", + "name": "Nature tiara", + "tradeable": "true", + "grand_exchange_price": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5543", + "name": "Chaos tiara", + "examine": "A tiara infused with the properties of chaos.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "10", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5544", + "name": "Chaos tiara", + "tradeable": "true", + "grand_exchange_price": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5545", + "name": "Law tiara", + "examine": "A tiara infused with the properties of law.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "11", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5546", + "name": "Law tiara", + "tradeable": "true", + "grand_exchange_price": "11", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5547", + "name": "Death tiara", + "examine": "A tiara infused with the properties of death.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "65", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5548", + "name": "Death tiara", + "tradeable": "true", + "grand_exchange_price": "65", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5549", + "name": "Blood tiara", + "examine": "A tiara infused with the properties of Blood.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "1058", + "equipment_slot": "0", + "requirements": "", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5550", + "name": "Blood tiara", + "tradeable": "true", + "grand_exchange_price": "1058", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5551", + "name": "Soul tiara", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5552", + "name": "Soul tiara", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5553", + "name": "Rogue top", + "examine": "Black banded leather armour, a rogue's dream!", + "low_alchemy": "250", + "high_alchemy": "375", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,10,10,10,10,5,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5554", + "name": "Rogue mask", + "examine": "Black banded leather armour, a rogue's dream!", + "low_alchemy": "150", + "high_alchemy": "225", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,5,5,5,5,5,0,0,0,0,0", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5555", + "name": "Rogue trousers", + "examine": "Black banded leather armour, a rogue's dream!", + "low_alchemy": "200", + "high_alchemy": "300", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,7,7,7,7,7,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5556", + "name": "Rogue gloves", + "examine": "Black banded leather gloves, a rogue's dream!", + "low_alchemy": "100", + "high_alchemy": "150", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,2,2,2,2,2,2,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5557", + "name": "Rogue boots", + "examine": "Black banded leather boots, a rogue's dream!", + "low_alchemy": "100", + "high_alchemy": "150", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,2,2,2,2,2,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5558", + "name": "Rogue kit", + "examine": "It can do almost anything!", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "35", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5559", + "name": "Flash powder", + "examine": "A small satchel of bright powder!", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5560", + "name": "Stethoscope", + "examine": "A useful hearing aid.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5561", + "name": "Mystic jewel", + "examine": "I can escape the Maze with this!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5568", + "name": "Picture", + "examine": "A fraction of a roof.", + "weight": "0.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5574", + "name": "Initiate sallet", + "examine": "An initiate Temple Knight's helm.", + "tradeable": "true", + "low_alchemy": "2400", + "high_alchemy": "3600", + "shop_price": "6000", + "grand_exchange_price": "3512", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,13,14,11,-1,13,5,0,3,0,0", + "requirements": "{1,20}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5575", + "name": "Initiate hauberk", + "examine": "An initiate Temple Knight's Armour.", + "tradeable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "grand_exchange_price": "5776", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-30,-10,46,44,38,-6,44,20,0,6,0,0", + "requirements": "{1,20}", + "weight": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5576", + "name": "Initiate cuisse", + "examine": "An initiate Temple Knight's leg armour.", + "tradeable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "shop_price": "8000", + "grand_exchange_price": "4574", + "equipment_slot": "7", + "absorb": "1,0,2", + "bonuses": "0,0,0,-21,-7,24,22,20,-4,22,5,0,5,0,0", + "requirements": "{1,20}", + "weight": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5577", + "name": "Cupric sulphate", + "examine": "A vial of something labelled 'Cupric Sulfate'.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5578", + "name": "Acetic acid", + "examine": "A vial of something labelled 'Acetic Acid'.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5579", + "name": "Gypsum", + "examine": "A vial of something labelled 'Gypsum'.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5580", + "name": "Sodium chloride", + "examine": "A vial of something labelled 'Sodium Chloride'.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5581", + "name": "Nitrous oxide", + "examine": "A vial of something labelled 'Nitrous Oxide'.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5582", + "name": "Vial of liquid", + "examine": "A vial of something labelled Dihydrogen Monoxide.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5583", + "name": "Tin ore powder", + "examine": "A vial of something labelled 'Powdered Tin Ore'.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5584", + "name": "Cupric ore powder", + "examine": "A vial of something labelled 'Powdered Cupric Ore'.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5586", + "name": "Metal spade", + "examine": "It's a metal spade without a handle.", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5587", + "name": "Metal spade", + "examine": "It's a metal spade without a handle.", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5588", + "name": "Alchemical notes", + "examine": "Looks like a pretty boring read.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5592", + "name": "Tin", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "42", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5593", + "name": "Tin", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "42", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5594", + "name": "Tin", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "42", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5595", + "name": "Tin", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "42", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5596", + "name": "Tin", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "42", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5597", + "name": "Tin", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "42", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5598", + "name": "Tin", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "42", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5599", + "name": "Tin", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "42", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5600", + "name": "Tin", + "examine": "This needs refining.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "42", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5601", + "name": "Chisel", + "examine": "Good for detailed crafting.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "33", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5602", + "name": "Bronze wire", + "examine": "Useful for crafting items.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "237", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5603", + "name": "Shears", + "examine": "For shearing sheep.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "41", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5604", + "name": "Magnet", + "examine": "A very attractive magnet.", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5605", + "name": "Knife", + "examine": "A dangerous looking knife.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "25", + "grand_exchange_price": "102", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5606", + "name": "Makeover voucher", + "examine": "I can exchange this for one free makeover with the makeover mage.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5607", + "name": "Grain", + "examine": "Some wheat heads.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "20", + "equipment_slot": "1", + "weight": "0.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5608", + "name": "Fox", + "examine": "A cunning animal.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5609", + "name": "Chicken", + "examine": "Normal: Yep. Definitely a chicken.", + "equipment_slot": "5", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5610", + "name": "Hourglass", + "examine": "There's not much sand left in the top half...", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5611", + "name": "Initiate sallet", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5612", + "name": "Initiate hauberk", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5613", + "name": "Initiate cuisse", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5614", + "name": "Magic carpet", + "stand_anim": "330", + "stand_turn_anim": "330", + "walk_anim": "330", + "run_anim": "330", + "turn180_anim": "330", + "turn90cw_anim": "330", + "turn90ccw_anim": "330", + "render_anim": "191", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5615", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5616", + "name": "Bronze arrow(p+)", + "examine": "Arrows with bronze heads.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "7", + "grand_exchange_price": "127", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5617", + "name": "Iron arrow(p+)", + "examine": "Arrows with iron heads.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "138", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5618", + "name": "Steel arrow(p+)", + "examine": "Arrows with steel heads.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "shop_price": "46", + "grand_exchange_price": "159", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,16", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5619", + "name": "Mithril arrow(p+)", + "examine": "Arrows with mithril heads.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "shop_price": "76", + "grand_exchange_price": "176", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,22", + "requirements": "{4,20}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5620", + "name": "Adamant arrow(p+)", + "examine": "Arrows with adamantite heads.", + "tradeable": "true", + "low_alchemy": "68", + "high_alchemy": "103", + "shop_price": "172", + "grand_exchange_price": "211", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,31", + "requirements": "{4,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5621", + "name": "Rune arrow(p+)", + "examine": "Arrows with rune heads.", + "tradeable": "true", + "low_alchemy": "204", + "high_alchemy": "306", + "shop_price": "510", + "grand_exchange_price": "415", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,49", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5622", + "name": "Bronze arrow(p++)", + "examine": "Arrows with bronze heads.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "7", + "grand_exchange_price": "1076", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,7", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5623", + "name": "Iron arrow(p++)", + "examine": "Arrows with iron heads.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "1037", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5624", + "name": "Steel arrow(p++)", + "examine": "Arrows with steel heads.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "shop_price": "46", + "grand_exchange_price": "1038", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,16", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5625", + "name": "Mithril arrow(p++)", + "examine": "Arrows with mithril heads.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "shop_price": "76", + "grand_exchange_price": "718", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,22", + "requirements": "{4,20}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5626", + "name": "Adamant arrow(p++)", + "examine": "Arrows with adamantite heads.", + "tradeable": "true", + "low_alchemy": "68", + "high_alchemy": "103", + "shop_price": "172", + "grand_exchange_price": "101", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,31", + "requirements": "{4,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5627", + "name": "Rune arrow(p++)", + "examine": "Arrows with rune heads.", + "tradeable": "true", + "low_alchemy": "204", + "high_alchemy": "306", + "shop_price": "510", + "grand_exchange_price": "1300", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,49", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5628", + "name": "Bronze dart(p+)", + "examine": "A deadly throwing dart with a bronze tip.", + "tradeable": "true", + "grand_exchange_price": "162", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,3,0,0,0,0,0,0,0,0,0,1", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5629", + "name": "Iron dart(p+)", + "examine": "A deadly throwing dart with an iron tip.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "164", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,4,0,0,0,0,0,0,0,0,0,3", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5630", + "name": "Steel dart(p+)", + "examine": "A deadly throwing dart with a steel tip.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "173", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,4", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,5}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5631", + "name": "Black dart(p+)", + "examine": "A deadly throwing dart with a black tip.", + "tradeable": "true", + "grand_exchange_price": "822", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,7,0,0,0,0,0,0,0,0,0,6", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,10}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5632", + "name": "Mithril dart(p+)", + "examine": "A deadly throwing dart with a mithril tip.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "196", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,7", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,20}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5633", + "name": "Adamant dart(p+)", + "examine": "A deadly throwing dart with an adamantite tip.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "39", + "grand_exchange_price": "244", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,11,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5634", + "name": "Rune dart(p+)", + "examine": "A deadly throwing dart with a rune tip.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "grand_exchange_price": "370", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,15,0,0,0,0,0,0,0,0,0,14", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5635", + "name": "Bronze dart(p++)", + "examine": "A deadly throwing dart with a bronze tip.", + "tradeable": "true", + "grand_exchange_price": "1733", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,3,0,0,0,0,0,0,0,0,0,1", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5636", + "name": "Iron dart(p++)", + "examine": "A deadly throwing dart with an iron tip.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1687", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,4,0,0,0,0,0,0,0,0,0,3", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5637", + "name": "Steel dart(p++)", + "examine": "A deadly throwing dart with a steel tip.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "1654", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,4", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,5}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5638", + "name": "Black dart(p++)", + "examine": "A deadly throwing dart with a black tip.", + "tradeable": "true", + "grand_exchange_price": "2422", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,7,0,0,0,0,0,0,0,0,0,6", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,10}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5639", + "name": "Mithril dart(p++)", + "examine": "A deadly throwing dart with a mithril tip.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "1660", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,7", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,20}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5640", + "name": "Adamant dart(p++)", + "examine": "A deadly throwing dart with an adamantite tip.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "39", + "grand_exchange_price": "1352", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,11,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,30}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5641", + "name": "Rune dart(p++)", + "examine": "A deadly throwing dart with a rune tip.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "grand_exchange_price": "1109", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,15,0,0,0,0,0,0,0,0,0,14", + "weapon_interface": "18", + "attack_anims": "582,582,582,582", + "defence_anim": "424", + "attack_audios": "2547,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5642", + "name": "Bronze javelin(p+)", + "examine": "A bronze-tipped javelin.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "115", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,6", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5643", + "name": "Iron javelin(p+)", + "examine": "An iron-tipped javelin.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "112", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5644", + "name": "Steel javelin(p+)", + "examine": "A steel-tipped javelin.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "22", + "shop_price": "37", + "grand_exchange_price": "128", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,12,0,0,0,0,0,0,0,0,0,12", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,5}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5645", + "name": "Mithril javelin(p+)", + "examine": "A mithril tipped javelin.", + "tradeable": "true", + "low_alchemy": "39", + "high_alchemy": "58", + "shop_price": "79", + "grand_exchange_price": "141", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,17,0,0,0,0,0,0,0,0,0,18", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,20}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5646", + "name": "Adamant javelin(p+)", + "grand_exchange_price": "179", + "equipment_slot": "3", + "bonuses": "0,0,0,0,24,0,0,0,0,0,0,0,0,0,28", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,30}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5647", + "name": "Rune javelin(p+)", + "examine": "A rune tipped javelin.", + "tradeable": "true", + "low_alchemy": "249", + "high_alchemy": "374", + "shop_price": "624", + "grand_exchange_price": "302", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,38,0,0,0,0,0,0,0,0,0,42", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5648", + "name": "Bronze jav'n(p++)", + "examine": "A bronze-tipped javelin.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "1755", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,6", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5649", + "name": "Iron javelin(p++)", + "examine": "An iron-tipped javelin.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "1756", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5650", + "name": "Steel javelin(p++)", + "examine": "A steel-tipped javelin.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "22", + "shop_price": "37", + "grand_exchange_price": "1769", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,12,0,0,0,0,0,0,0,0,0,12", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,5}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5651", + "name": "Mithril javelin(p++)", + "examine": "A mithril tipped javelin.", + "tradeable": "true", + "low_alchemy": "39", + "high_alchemy": "58", + "shop_price": "79", + "grand_exchange_price": "1736", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,17,0,0,0,0,0,0,0,0,0,18", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,20}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5652", + "name": "Adamant javelin(p++)", + "grand_exchange_price": "1514", + "equipment_slot": "3", + "bonuses": "0,0,0,0,24,0,0,0,0,0,0,0,0,0,28", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,30}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5653", + "name": "Rune javelin(p++)", + "examine": "A rune tipped javelin.", + "tradeable": "true", + "low_alchemy": "249", + "high_alchemy": "374", + "shop_price": "624", + "grand_exchange_price": "1521", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,38,0,0,0,0,0,0,0,0,0,42", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "requirements": "{4,40}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5654", + "name": "Bronze knife(p+)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "164", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,4,0,0,0,0,0,0,0,0,0,3", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5655", + "name": "Iron knife(p+)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "34", + "shop_price": "58", + "grand_exchange_price": "170", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,4", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5656", + "name": "Steel knife(p+)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "27", + "high_alchemy": "40", + "shop_price": "68", + "grand_exchange_price": "212", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,7", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5657", + "name": "Mithril knife(p+)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "16", + "grand_exchange_price": "330", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,11,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,20}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5658", + "name": "Black knife(p+)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "11", + "shop_price": "15", + "grand_exchange_price": "66", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,10,0,0,0,0,0,0,0,0,0,8", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,10}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5659", + "name": "Adamant knife(p+)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "40", + "grand_exchange_price": "609", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,15,0,0,0,0,0,0,0,0,0,14", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5660", + "name": "Rune knife(p+)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "66", + "high_alchemy": "100", + "grand_exchange_price": "1511", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,25,0,0,0,0,0,0,0,0,0,24", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5661", + "name": "Bronze knife(p++)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "1514", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,4,0,0,0,0,0,0,0,0,0,3", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5662", + "name": "Iron knife(p++)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "34", + "shop_price": "58", + "grand_exchange_price": "1212", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,5,0,0,0,0,0,0,0,0,0,4", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5663", + "name": "Steel knife(p++)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "27", + "high_alchemy": "40", + "shop_price": "68", + "grand_exchange_price": "1579", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,7", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,5}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5664", + "name": "Mithril knife(p++)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "16", + "grand_exchange_price": "1368", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,11,0,0,0,0,0,0,0,0,0,10", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,20}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5665", + "name": "Black knife(p++)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "11", + "shop_price": "15", + "grand_exchange_price": "103", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,10,0,0,0,0,0,0,0,0,0,8", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,10}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5666", + "name": "Adamant knife(p++)", + "grand_exchange_price": "1505", + "equipment_slot": "3", + "bonuses": "0,0,0,0,15,0,0,0,0,0,0,0,0,0,14", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,30}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5667", + "name": "Rune knife(p++)", + "examine": "A finely balanced throwing knife.", + "tradeable": "true", + "low_alchemy": "66", + "high_alchemy": "100", + "grand_exchange_price": "2207", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,25,0,0,0,0,0,0,0,0,0,24", + "weapon_interface": "18", + "attack_anims": "806,806,806,806", + "defence_anim": "424", + "attack_audios": "2704,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5668", + "name": "Iron dagger(p+)", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "38", + "grand_exchange_price": "483", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,4,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5669", + "name": "Iron dagger(p+)", + "tradeable": "true", + "grand_exchange_price": "483", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5670", + "name": "Bronze dagger(p+)", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "11", + "grand_exchange_price": "350", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,2,-4,1,0,0,0,0,1,0,0,3,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5671", + "name": "Bronze dagger(p+)", + "tradeable": "true", + "grand_exchange_price": "350", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5672", + "name": "Steel dagger(p+)", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "shop_price": "135", + "grand_exchange_price": "575", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "8,4,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,5}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5673", + "name": "Steel dagger(p+)", + "tradeable": "true", + "grand_exchange_price": "575", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5674", + "name": "Mithril dagger(p+)", + "examine": "A dangerous dagger.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "130", + "grand_exchange_price": "538", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "11,5,-4,1,0,0,0,0,1,0,0,10,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,20}", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5675", + "name": "Mithril dagger(p+)", + "tradeable": "true", + "grand_exchange_price": "538", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5676", + "name": "Adamant dagger(p+)", + "grand_exchange_price": "800", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "15,8,-4,1,0,0,0,0,1,0,0,14,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,30}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5677", + "name": "Adamant dagger(p+)", + "tradeable": "true", + "grand_exchange_price": "800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5678", + "name": "Rune dagger(p+)", + "examine": "A powerful dagger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "shop_price": "8000", + "grand_exchange_price": "4538", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "25,12,-4,1,0,0,0,0,1,0,0,24,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,40}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5679", + "name": "Rune dagger(p+)", + "tradeable": "true", + "grand_exchange_price": "4538", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5680", + "name": "Dragon dagger(p+)", + "examine": "A powerful dagger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "shop_price": "60000", + "grand_exchange_price": "16800", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,60}", + "weight": "0.4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5681", + "name": "Dragon dagger(p+)", + "tradeable": "true", + "grand_exchange_price": "16800", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5682", + "name": "Black dagger(p+)", + "examine": "A vicious black dagger.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "shop_price": "240", + "grand_exchange_price": "664", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,10}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5683", + "name": "Black dagger(p+)", + "tradeable": "true", + "grand_exchange_price": "664", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5684", + "name": "Poison dagger(p+)", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5685", + "name": "Poison dagger(p+)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5686", + "name": "Iron dagger(p++)", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "38", + "grand_exchange_price": "4128", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,4,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5687", + "name": "Iron dagger(p++)", + "tradeable": "true", + "grand_exchange_price": "4128", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5688", + "name": "Br'ze dagger(p++)", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "11", + "grand_exchange_price": "5088", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,2,-4,1,0,0,0,0,1,0,0,3,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5689", + "name": "Br'ze dagger(p++)", + "tradeable": "true", + "grand_exchange_price": "5088", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5690", + "name": "Steel dagger(p++)", + "examine": "Short but pointy.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "shop_price": "135", + "grand_exchange_price": "4729", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "8,4,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,5}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5691", + "name": "Steel dagger(p++)", + "tradeable": "true", + "grand_exchange_price": "4729", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5692", + "name": "Mithril dagger(p++)", + "examine": "A dangerous dagger.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "130", + "grand_exchange_price": "3476", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "11,5,-4,1,0,0,0,0,1,0,0,10,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,20}", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5693", + "name": "Mithril dagger(p++)", + "tradeable": "true", + "grand_exchange_price": "3476", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5694", + "name": "Adamant dagger(p++)", + "grand_exchange_price": "4612", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "15,8,-4,1,0,0,0,0,1,0,0,14,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,30}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5695", + "name": "Adamant dagger(p++)", + "tradeable": "true", + "grand_exchange_price": "4612", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5696", + "name": "Rune dagger(p++)", + "examine": "A powerful dagger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "shop_price": "8000", + "grand_exchange_price": "5061", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "25,12,-4,1,0,0,0,0,1,0,0,24,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,40}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5697", + "name": "Rune dagger(p++)", + "tradeable": "true", + "grand_exchange_price": "5061", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5698", + "name": "Dragon dagger(p++)", + "examine": "A powerful dagger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "shop_price": "60000", + "grand_exchange_price": "20300", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,60}", + "weight": "0.4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5699", + "name": "Dragon dagger(p++)", + "tradeable": "true", + "grand_exchange_price": "20300", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5700", + "name": "Black dagger(p++)", + "examine": "A vicious black dagger.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "shop_price": "240", + "grand_exchange_price": "4921", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,10}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5701", + "name": "Black dagger(p++)", + "tradeable": "true", + "grand_exchange_price": "4921", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5702", + "name": "Poison dagger(p++)", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,0,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5703", + "name": "Poison dagger(p++)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5704", + "name": "Bronze spear(p+)", + "examine": "A bronze tipped spear.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "861", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,5,5,0,0,1,1,0,0,0,0,6,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5705", + "name": "Bronze spear(p+)", + "tradeable": "true", + "grand_exchange_price": "861", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5706", + "name": "Iron spear(p+)", + "examine": "An iron tipped spear.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "676", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,8,8,0,0,1,1,0,0,0,0,10,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5707", + "name": "Iron spear(p+)", + "tradeable": "true", + "grand_exchange_price": "676", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5708", + "name": "Steel spear(p+)", + "examine": "A steel tipped spear.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "grand_exchange_price": "596", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,12,12,0,0,1,1,0,0,0,0,12,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,5}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5709", + "name": "Steel spear(p+)", + "tradeable": "true", + "grand_exchange_price": "596", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5710", + "name": "Mithril spear(p+)", + "examine": "A mithril tipped spear.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "802", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,1,1,0,0,0,0,18,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,20}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5711", + "name": "Mithril spear(p+)", + "tradeable": "true", + "grand_exchange_price": "802", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5712", + "name": "Adamant spear(p+)", + "examine": "An adamant tipped spear.", + "tradeable": "true", + "low_alchemy": "832", + "high_alchemy": "1248", + "grand_exchange_price": "1394", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "24,24,24,0,0,1,1,0,0,0,0,28,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5713", + "name": "Adamant spear(p+)", + "tradeable": "true", + "grand_exchange_price": "1394", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5714", + "name": "Rune spear(p+)", + "examine": "A rune tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "grand_exchange_price": "12500", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "36,36,36,0,0,1,1,0,0,0,0,42,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5715", + "name": "Rune spear(p+)", + "tradeable": "true", + "grand_exchange_price": "12500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5716", + "name": "Dragon spear(p+)", + "examine": "A dragon tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24960", + "high_alchemy": "37440", + "grand_exchange_price": "41800", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,60}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5717", + "name": "Dragon spear(p+)", + "tradeable": "true", + "grand_exchange_price": "41800", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5718", + "name": "Bronze spear(p++)", + "examine": "A bronze tipped spear.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "7557", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,5,5,0,0,1,1,0,0,0,0,6,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5719", + "name": "Bronze spear(p++)", + "tradeable": "true", + "grand_exchange_price": "7557", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5720", + "name": "Iron spear(p++)", + "examine": "An iron tipped spear.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "8394", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,8,8,0,0,1,1,0,0,0,0,10,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5721", + "name": "Iron spear(p++)", + "tradeable": "true", + "grand_exchange_price": "8394", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5722", + "name": "Steel spear(p++)", + "examine": "A steel tipped spear.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "grand_exchange_price": "8336", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,12,12,0,0,1,1,0,0,0,0,12,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,5}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5723", + "name": "Steel spear(p++)", + "tradeable": "true", + "grand_exchange_price": "8336", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5724", + "name": "Mithril spear(p++)", + "examine": "A mithril tipped spear.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "7035", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,1,1,0,0,0,0,18,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,20}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5725", + "name": "Mithril spear(p++)", + "tradeable": "true", + "grand_exchange_price": "7035", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5726", + "name": "Adamant spear(p++)", + "grand_exchange_price": "7530", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "24,24,24,0,0,1,1,0,0,0,0,28,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,30}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5727", + "name": "Adamant spear(p++)", + "tradeable": "true", + "grand_exchange_price": "7530", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5728", + "name": "Rune spear(p++)", + "examine": "A rune tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "grand_exchange_price": "17700", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "36,36,36,0,0,1,1,0,0,0,0,42,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5729", + "name": "Rune spear(p++)", + "tradeable": "true", + "grand_exchange_price": "17700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5730", + "name": "Dragon spear(p++)", + "examine": "A dragon tipped spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24960", + "high_alchemy": "37440", + "grand_exchange_price": "37800", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,60}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5731", + "name": "Dragon spear(p++)", + "tradeable": "true", + "grand_exchange_price": "37800", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5732", + "name": "Stool", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5733", + "name": "Rotten potato", + "examine": "Yuk!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5734", + "name": "Black spear(p+)", + "examine": "A black tipped spear.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "3351", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "15,15,15,0,0,1,1,0,0,0,0,16,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,10}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5735", + "name": "Black spear(p+)", + "tradeable": "true", + "grand_exchange_price": "3351", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5736", + "name": "Black spear(p++)", + "examine": "A black tipped spear.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "9065", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "15,15,15,0,0,1,1,0,0,0,0,16,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "requirements": "{0,10}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5737", + "name": "Black spear(p++)", + "tradeable": "true", + "grand_exchange_price": "9065", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5738", + "name": "Woad leaf", + "examine": "A slightly bluish leaf.", + "tradeable": "true", + "shop_price": "15", + "grand_exchange_price": "19", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5739", + "name": "Asgarnian ale(m)", + "examine": "This looks a good deal stronger than normal Asgarnian ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "459", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5740", + "name": "Asgarnian ale(m)", + "tradeable": "true", + "grand_exchange_price": "459", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5741", + "name": "Mature wmb", + "examine": "This looks a good deal stronger than normal Wizards Mind Bomb.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1193", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5742", + "name": "Mature wmb", + "tradeable": "true", + "grand_exchange_price": "1193", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5743", + "name": "Greenman's ale(m)", + "examine": "This looks a good deal stronger than normal Greenman's Ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "65400", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5744", + "name": "Greenman's ale(m)", + "tradeable": "true", + "grand_exchange_price": "65400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5745", + "name": "Dragon bitter(m)", + "examine": "This looks a good deal stronger than normal Dragon Bitter.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "2458", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5746", + "name": "Dragon bitter(m)", + "tradeable": "true", + "grand_exchange_price": "2458", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5747", + "name": "Dwarven stout(m)", + "examine": "This looks a good deal stronger than normal dwarven stout.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "56400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5748", + "name": "Dwarven stout(m)", + "tradeable": "true", + "grand_exchange_price": "56400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5749", + "name": "Moonlight mead(m)", + "examine": "This looks a good deal stronger than normal Moonlight Mead.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5750", + "name": "Moonlight mead(m)", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5751", + "name": "Axeman's folly", + "examine": "This might help me chop harder.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "890", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5752", + "name": "Axeman's folly", + "tradeable": "true", + "grand_exchange_price": "890", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5753", + "name": "Axeman's folly(m)", + "examine": "This looks a good deal stronger than a normal Axeman's Folly.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "26000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5754", + "name": "Axeman's folly(m)", + "tradeable": "true", + "grand_exchange_price": "26000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5755", + "name": "Chef's delight", + "examine": "A fruity, full-bodied ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "3694", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5756", + "name": "Chef's delight", + "tradeable": "true", + "grand_exchange_price": "3694", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5757", + "name": "Chef's delight(m)", + "examine": "This looks a good deal stronger than normal Chef's Delight.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "42800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5758", + "name": "Chef's delight(m)", + "tradeable": "true", + "grand_exchange_price": "42800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5759", + "name": "Slayer's respite", + "examine": "Ale with bite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5760", + "name": "Slayer's respite", + "tradeable": "true", + "grand_exchange_price": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5761", + "name": "Slayer's respite(m)", + "examine": "This looks a good deal stronger than normal Slayer's Respite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1748", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5762", + "name": "Slayer's respite(m)", + "tradeable": "true", + "grand_exchange_price": "1748", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5763", + "name": "Cider", + "examine": "A glass of Cider", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "1279", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5764", + "name": "Cider", + "tradeable": "true", + "grand_exchange_price": "1279", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5765", + "name": "Mature cider", + "examine": "This looks a good deal stronger than normal cider.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "3614", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5766", + "name": "Mature cider", + "tradeable": "true", + "grand_exchange_price": "3614", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5767", + "name": "Ale yeast", + "examine": "A pot filled with ale yeast.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "5", + "grand_exchange_price": "59", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5768", + "name": "Ale yeast", + "tradeable": "true", + "grand_exchange_price": "59", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5769", + "name": "Calquat keg", + "examine": "Sliced and hollowed out to form a keg.", + "tradeable": "true", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5770", + "name": "Calquat keg", + "tradeable": "true", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5771", + "name": "Dwarven stout(1)", + "examine": "A pint of thick dark beer.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "1934", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5772", + "name": "Dwarven stout(1)", + "tradeable": "true", + "grand_exchange_price": "1934", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5773", + "name": "Dwarven stout(2)", + "examine": "A pint of thick dark beer.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "3214", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5774", + "name": "Dwarven stout(2)", + "tradeable": "true", + "grand_exchange_price": "3214", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5775", + "name": "Dwarven stout(3)", + "examine": "A pint of thick dark beer.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "4886", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5776", + "name": "Dwarven stout(3)", + "tradeable": "true", + "grand_exchange_price": "4886", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5777", + "name": "Dwarven stout(4)", + "examine": "A pint of thick dark beer.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "5159", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5778", + "name": "Dwarven stout(4)", + "tradeable": "true", + "grand_exchange_price": "5159", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5779", + "name": "Asgarnian ale(1)", + "examine": "Probably the finest readily-available ale in Asgarnia.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "3344", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5780", + "name": "Asgarnian ale(1)", + "tradeable": "true", + "grand_exchange_price": "3344", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5781", + "name": "Asgarnian ale(2)", + "examine": "Probably the finest readily-available ale in Asgarnia.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "6103", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5782", + "name": "Asgarnian ale(2)", + "tradeable": "true", + "grand_exchange_price": "6103", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5783", + "name": "Asgarnian ale(3)", + "examine": "Probably the finest readily-available ale in Asgarnia.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "9230", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5784", + "name": "Asgarnian ale(3)", + "tradeable": "true", + "grand_exchange_price": "9230", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5785", + "name": "Asgarnian ale(4)", + "examine": "Probably the finest readily-available ale in Asgarnia.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "12900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5786", + "name": "Asgarnian ale(4)", + "tradeable": "true", + "grand_exchange_price": "12900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5787", + "name": "Greenmans ale(1)", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "3441", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5788", + "name": "Greenmans ale(1)", + "tradeable": "true", + "grand_exchange_price": "3441", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5789", + "name": "Greenmans ale(2)", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "4670", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5790", + "name": "Greenmans ale(2)", + "tradeable": "true", + "grand_exchange_price": "4670", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5791", + "name": "Greenmans ale(3)", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "7654", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5792", + "name": "Greenmans ale(3)", + "tradeable": "true", + "grand_exchange_price": "7654", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5793", + "name": "Greenmans ale(4)", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "6317", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5794", + "name": "Greenmans ale(4)", + "tradeable": "true", + "grand_exchange_price": "6317", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5795", + "name": "Mind bomb(1)", + "examine": "It's got strange bubbles in it.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "1495", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5796", + "name": "Mind bomb(1)", + "tradeable": "true", + "grand_exchange_price": "1495", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5797", + "name": "Mind bomb(2)", + "examine": "It's got strange bubbles in it.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "2721", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5798", + "name": "Mind bomb(2)", + "tradeable": "true", + "grand_exchange_price": "2721", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5799", + "name": "Mind bomb(3)", + "examine": "It's got strange bubbles in it.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "4038", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5800", + "name": "Mind bomb(3)", + "tradeable": "true", + "grand_exchange_price": "4038", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5801", + "name": "Mind bomb(4)", + "examine": "It's got strange bubbles in it.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "5166", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5802", + "name": "Mind bomb(4)", + "tradeable": "true", + "grand_exchange_price": "5166", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5803", + "name": "Dragon bitter(1)", + "examine": "A glass of bitter.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "1673", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5804", + "name": "Dragon bitter(1)", + "tradeable": "true", + "grand_exchange_price": "1673", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5805", + "name": "Dragon bitter(2)", + "examine": "A glass of bitter.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "3259", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5806", + "name": "Dragon bitter(2)", + "tradeable": "true", + "grand_exchange_price": "3259", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5807", + "name": "Dragon bitter(3)", + "examine": "A glass of bitter.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "4845", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5808", + "name": "Dragon bitter(3)", + "tradeable": "true", + "grand_exchange_price": "4845", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5809", + "name": "Dragon bitter(4)", + "examine": "A glass of bitter.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "5924", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5810", + "name": "Dragon bitter(4)", + "tradeable": "true", + "grand_exchange_price": "5924", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5811", + "name": "Moonlight mead(1)", + "examine": "A foul smelling brew.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "1298", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5812", + "name": "Moonlight mead(1)", + "tradeable": "true", + "grand_exchange_price": "1298", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5813", + "name": "Moonlight mead(2)", + "examine": "A foul smelling brew.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "2510", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5814", + "name": "Moonlight mead(2)", + "tradeable": "true", + "grand_exchange_price": "2510", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5815", + "name": "Moonlight mead(3)", + "examine": "A foul smelling brew.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "3721", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5816", + "name": "Moonlight mead(3)", + "tradeable": "true", + "grand_exchange_price": "3721", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5817", + "name": "Moonlight mead(4)", + "examine": "A foul smelling brew.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "4883", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5818", + "name": "Moonlight mead(4)", + "tradeable": "true", + "grand_exchange_price": "4883", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5819", + "name": "Axeman's folly(1)", + "examine": "This might help me chop harder.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "3333", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5820", + "name": "Axeman's folly(1)", + "tradeable": "true", + "grand_exchange_price": "3333", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5821", + "name": "Axeman's folly(2)", + "examine": "This might help me chop harder.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "6093", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5822", + "name": "Axeman's folly(2)", + "tradeable": "true", + "grand_exchange_price": "6093", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5823", + "name": "Axeman's folly(3)", + "examine": "This might help me chop harder.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "8978", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5824", + "name": "Axeman's folly(3)", + "tradeable": "true", + "grand_exchange_price": "8978", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5825", + "name": "Axeman's folly(4)", + "examine": "This might help me chop harder.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "9212", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5826", + "name": "Axeman's folly(4)", + "tradeable": "true", + "grand_exchange_price": "9212", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5827", + "name": "Chef's delight(1)", + "examine": "A fruity, full-bodied ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "3851", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5828", + "name": "Chef's delight(1)", + "tradeable": "true", + "grand_exchange_price": "3851", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5829", + "name": "Chef's delight(2)", + "examine": "A fruity, full-bodied ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "6589", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5830", + "name": "Chef's delight(2)", + "tradeable": "true", + "grand_exchange_price": "6589", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5831", + "name": "Chef's delight(3)", + "examine": "A fruity, full-bodied ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "9536", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5832", + "name": "Chef's delight(3)", + "tradeable": "true", + "grand_exchange_price": "9536", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5833", + "name": "Chef's delight(4)", + "examine": "A fruity, full-bodied ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "13200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5834", + "name": "Chef's delight(4)", + "tradeable": "true", + "grand_exchange_price": "13200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5835", + "name": "Slayer's respite(1)", + "examine": "Ale with bite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1127", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5836", + "name": "Slayer's respite(1)", + "tradeable": "true", + "grand_exchange_price": "1127", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5837", + "name": "Slayer's respite(2)", + "examine": "Ale with bite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "2168", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5838", + "name": "Slayer's respite(2)", + "tradeable": "true", + "grand_exchange_price": "2168", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5839", + "name": "Slayer's respite(3)", + "examine": "Ale with bite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "3209", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5840", + "name": "Slayer's respite(3)", + "tradeable": "true", + "grand_exchange_price": "3209", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5841", + "name": "Slayer's respite(4)", + "examine": "Ale with bite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "3582", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5842", + "name": "Slayer's respite(4)", + "tradeable": "true", + "grand_exchange_price": "3582", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5843", + "name": "Cider(1)", + "examine": "A glass of Cider", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "6040", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5844", + "name": "Cider(1)", + "tradeable": "true", + "grand_exchange_price": "6040", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5845", + "name": "Cider(2)", + "examine": "A glass of Cider", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "11000", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5846", + "name": "Cider(2)", + "tradeable": "true", + "grand_exchange_price": "11000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5847", + "name": "Cider(3)", + "examine": "A glass of Cider", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "15400", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5848", + "name": "Cider(3)", + "tradeable": "true", + "grand_exchange_price": "15400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5849", + "name": "Cider(4)", + "examine": "A glass of Cider", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "18900", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5850", + "name": "Cider(4)", + "tradeable": "true", + "grand_exchange_price": "18900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5851", + "name": "Dwarven stout(m1)", + "examine": "This looks a good deal stronger than normal dwarven stout.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "44600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5852", + "name": "Dwarven stout(m1)", + "tradeable": "true", + "grand_exchange_price": "44600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5853", + "name": "Dwarven stout(m2)", + "examine": "This looks a good deal stronger than normal dwarven stout.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "68900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5854", + "name": "Dwarven stout(m2)", + "tradeable": "true", + "grand_exchange_price": "68900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5855", + "name": "Dwarven stout(m3)", + "examine": "This looks a good deal stronger than normal dwarven stout.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "98800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5856", + "name": "Dwarven stout(m3)", + "tradeable": "true", + "grand_exchange_price": "98800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5857", + "name": "Dwarven stout(m4)", + "examine": "This looks a good deal stronger than normal dwarven stout.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "237400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5858", + "name": "Dwarven stout(m4)", + "tradeable": "true", + "grand_exchange_price": "237400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5859", + "name": "Asgarnian ale(m1)", + "examine": "This looks a good deal stronger than normal Asgarnian ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1697", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5860", + "name": "Asgarnian ale(m1)", + "tradeable": "true", + "grand_exchange_price": "1697", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5861", + "name": "Asgarnian ale(m2)", + "examine": "This looks a good deal stronger than normal Asgarnian ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "3307", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5862", + "name": "Asgarnian ale(m2)", + "tradeable": "true", + "grand_exchange_price": "3307", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5863", + "name": "Asgarnian ale(m3)", + "examine": "This looks a good deal stronger than normal Asgarnian ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "4917", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5864", + "name": "Asgarnian ale(m3)", + "tradeable": "true", + "grand_exchange_price": "4917", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5865", + "name": "Asgarnian ale(m4)", + "examine": "This looks a good deal stronger than normal Asgarnian ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "6778", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5866", + "name": "Asgarnian ale(m4)", + "tradeable": "true", + "grand_exchange_price": "6778", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5867", + "name": "Greenmans ale(m1)", + "examine": "This looks a good deal stronger than normal Greenman's Ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "57600", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5868", + "name": "Greenmans ale(m1)", + "tradeable": "true", + "grand_exchange_price": "57600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5869", + "name": "Greenmans ale(m2)", + "examine": "This looks a good deal stronger than normal Greenman's Ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "92000", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5870", + "name": "Greenmans ale(m2)", + "tradeable": "true", + "grand_exchange_price": "92000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5871", + "name": "Greenmans ale(m3)", + "examine": "This looks a good deal stronger than normal Greenman's Ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "136700", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5872", + "name": "Greenmans ale(m3)", + "tradeable": "true", + "grand_exchange_price": "136700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5873", + "name": "Greenmans ale(m4)", + "examine": "This looks a good deal stronger than normal Greenman's Ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "231700", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5874", + "name": "Greenmans ale(m4)", + "tradeable": "true", + "grand_exchange_price": "231700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5875", + "name": "Mind bomb(m1)", + "examine": "This looks a good deal stronger than normal Wizards Mind Bomb.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "3032", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5876", + "name": "Mind bomb(m1)", + "tradeable": "true", + "grand_exchange_price": "3032", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5877", + "name": "Mind bomb(m2)", + "examine": "This looks a good deal stronger than normal Wizards Mind Bomb.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "5977", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5878", + "name": "Mind bomb(m2)", + "tradeable": "true", + "grand_exchange_price": "5977", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5879", + "name": "Mind bomb(m3)", + "examine": "This looks a good deal stronger than normal Wizards Mind Bomb.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "8922", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5880", + "name": "Mind bomb(m3)", + "tradeable": "true", + "grand_exchange_price": "8922", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5881", + "name": "Mind bomb(m4)", + "examine": "This looks a good deal stronger than normal Wizards Mind Bomb.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "12700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5882", + "name": "Mind bomb(m4)", + "tradeable": "true", + "grand_exchange_price": "12700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5883", + "name": "Dragon bitter(m1)", + "examine": "This looks a good deal stronger than normal Dragon Bitter.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "2125", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5884", + "name": "Dragon bitter(m1)", + "tradeable": "true", + "grand_exchange_price": "2125", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5885", + "name": "Dragon bitter(m2)", + "examine": "This looks a good deal stronger than normal Dragon Bitter.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "4163", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5886", + "name": "Dragon bitter(m2)", + "tradeable": "true", + "grand_exchange_price": "4163", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5887", + "name": "Dragon bitter(m3)", + "examine": "This looks a good deal stronger than normal Dragon Bitter.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "6201", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5888", + "name": "Dragon bitter(m3)", + "tradeable": "true", + "grand_exchange_price": "6201", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5889", + "name": "Dragon bitter(m4)", + "examine": "This looks a good deal stronger than normal Dragon Bitter.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "8834", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5890", + "name": "Dragon bitter(m4)", + "tradeable": "true", + "grand_exchange_price": "8834", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5891", + "name": "M'light mead(m1)", + "examine": "A foul smelling brew.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "1315", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5892", + "name": "M'light mead(m1)", + "tradeable": "true", + "grand_exchange_price": "1315", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5893", + "name": "M'light mead(m2)", + "examine": "This looks a good deal stronger than normal Moonlight Mead.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "2543", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5894", + "name": "M'light mead(m2)", + "tradeable": "true", + "grand_exchange_price": "2543", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5895", + "name": "M'light mead(m3)", + "examine": "This looks a good deal stronger than normal Moonlight Mead.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "3771", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5896", + "name": "M'light mead(m3)", + "tradeable": "true", + "grand_exchange_price": "3771", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5897", + "name": "M'light mead(m4)", + "examine": "This looks a good deal stronger than normal Moonlight Mead.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "5000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5898", + "name": "M'light mead(m4)", + "tradeable": "true", + "grand_exchange_price": "5000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5899", + "name": "Axeman's folly(m1)", + "examine": "This looks a good deal stronger than a normal Axeman's Folly.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "13500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5900", + "name": "Axeman's folly(m1)", + "tradeable": "true", + "grand_exchange_price": "13500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5901", + "name": "Axeman's folly(m2)", + "examine": "This looks a good deal stronger than a normal Axeman's Folly.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "24800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5902", + "name": "Axeman's folly(m2)", + "tradeable": "true", + "grand_exchange_price": "24800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5903", + "name": "Axeman's folly(m3)", + "examine": "This looks a good deal stronger than a normal Axeman's Folly.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "37300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5904", + "name": "Axeman's folly(m3)", + "tradeable": "true", + "grand_exchange_price": "37300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5905", + "name": "Axeman's folly(m4)", + "examine": "This might help me chop harder.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "60700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5906", + "name": "Axeman's folly(m4)", + "tradeable": "true", + "grand_exchange_price": "60700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5907", + "name": "Chef's delight(m1)", + "examine": "A fruity, full-bodied ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "18000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5908", + "name": "Chef's delight(m1)", + "tradeable": "true", + "grand_exchange_price": "18000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5909", + "name": "Chef's delight(m2)", + "examine": "This looks a good deal stronger than normal Chef's Delight.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "34300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5910", + "name": "Chef's delight(m2)", + "tradeable": "true", + "grand_exchange_price": "34300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5911", + "name": "Chef's delight(m3)", + "examine": "This looks a good deal stronger than normal Chef's Delight.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "51000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5912", + "name": "Chef's delight(m3)", + "tradeable": "true", + "grand_exchange_price": "51000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5913", + "name": "Chef's delight(m4)", + "examine": "This looks a good deal stronger than normal Chef's Delight.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "98600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5914", + "name": "Chef's delight(m4)", + "tradeable": "true", + "grand_exchange_price": "98600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5915", + "name": "Slayer respite(m1)", + "examine": "This looks a good deal stronger than normal Slayer's Respite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "3672", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5916", + "name": "Slayer respite(m1)", + "tradeable": "true", + "grand_exchange_price": "3672", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5917", + "name": "Slayer respite(m2)", + "examine": "This looks a good deal stronger than normal Slayer's Respite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "7258", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5918", + "name": "Slayer respite(m2)", + "tradeable": "true", + "grand_exchange_price": "7258", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5919", + "name": "Slayer respite(m3)", + "examine": "This looks a good deal stronger than normal Slayer's Respite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "10800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5920", + "name": "Slayer respite(m3)", + "tradeable": "true", + "grand_exchange_price": "10800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5921", + "name": "Slayer respite(m4)", + "examine": "This looks a good deal stronger than normal Slayer's Respite.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "15300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5922", + "name": "Slayer respite(m4)", + "tradeable": "true", + "grand_exchange_price": "15300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5923", + "name": "Cider(m1)", + "examine": "This looks a good deal stronger than normal cider.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "2966", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5924", + "name": "Cider(m1)", + "tradeable": "true", + "grand_exchange_price": "2966", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5925", + "name": "Cider(m2)", + "examine": "This looks a good deal stronger than normal cider.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "5845", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5926", + "name": "Cider(m2)", + "tradeable": "true", + "grand_exchange_price": "5845", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5927", + "name": "Cider(m3)", + "examine": "This looks a good deal stronger than normal cider.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "8724", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5928", + "name": "Cider(m3)", + "tradeable": "true", + "grand_exchange_price": "8724", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5929", + "name": "Cider(m4)", + "examine": "This looks a good deal stronger than normal cider.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "11900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5930", + "name": "Cider(m4)", + "tradeable": "true", + "grand_exchange_price": "11900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5931", + "name": "Jute fibre", + "examine": "I can weave this to make sacks.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "532", + "weight": "0.2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5932", + "name": "Jute fibre", + "tradeable": "true", + "grand_exchange_price": "532", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5933", + "name": "Willow branch", + "examine": "A branch from a willow tree.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1255", + "weight": "0.9", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5934", + "name": "Willow branch", + "tradeable": "true", + "grand_exchange_price": "1255", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5935", + "name": "Coconut milk", + "examine": "A vial filled with coconut milk.", + "tradeable": "true", + "grand_exchange_price": "1307", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5937", + "name": "Weapon poison+", + "examine": "A vial of extra-strong weapon poison, for spears and daggers.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "605", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5938", + "name": "Weapon poison+", + "tradeable": "true", + "grand_exchange_price": "605", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5940", + "name": "Weapon poison++", + "examine": "A vial of super strong weapon poison, for spears and daggers.", + "tradeable": "true", + "low_alchemy": "172", + "high_alchemy": "259", + "grand_exchange_price": "4817", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5941", + "name": "Weapon poison++", + "tradeable": "true", + "grand_exchange_price": "4817", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5943", + "name": "Antipoison+(4)", + "examine": "N doses of extra-stong antipoison potion", + "tradeable": "true", + "low_alchemy": "144", + "high_alchemy": "216", + "grand_exchange_price": "1032", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5944", + "name": "Antipoison+(4)", + "tradeable": "true", + "grand_exchange_price": "1032", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5945", + "name": "Antipoison+(3)", + "examine": "N doses of extra-stong antipoison potion", + "tradeable": "true", + "low_alchemy": "144", + "high_alchemy": "216", + "grand_exchange_price": "1499", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5946", + "name": "Antipoison+(3)", + "tradeable": "true", + "grand_exchange_price": "1499", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5947", + "name": "Antipoison+(2)", + "examine": "N doses of extra-stong antipoison potion", + "tradeable": "true", + "low_alchemy": "144", + "high_alchemy": "216", + "grand_exchange_price": "1316", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5948", + "name": "Antipoison+(2)", + "tradeable": "true", + "grand_exchange_price": "1316", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5949", + "name": "Antipoison+(1)", + "examine": "N doses of extra-stong antipoison potion", + "tradeable": "true", + "low_alchemy": "144", + "high_alchemy": "216", + "grand_exchange_price": "1599", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5950", + "name": "Antipoison+(1)", + "tradeable": "true", + "grand_exchange_price": "1599", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5952", + "name": "Antipoison++(4)", + "examine": "X doses of a super-strong antipoison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "1138", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5953", + "name": "Antipoison++(4)", + "tradeable": "true", + "grand_exchange_price": "1138", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5954", + "name": "Antipoison++(3)", + "examine": "X doses of a super-strong antipoison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "1071", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5955", + "name": "Antipoison++(3)", + "tradeable": "true", + "grand_exchange_price": "1071", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5956", + "name": "Antipoison++(2)", + "examine": "X doses of a super-strong antipoison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "632", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5957", + "name": "Antipoison++(2)", + "tradeable": "true", + "grand_exchange_price": "632", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5958", + "name": "Antipoison++(1)", + "examine": "X doses of a super-strong antipoison potion.", + "tradeable": "true", + "low_alchemy": "115", + "high_alchemy": "172", + "grand_exchange_price": "821", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5959", + "name": "Antipoison++(1)", + "tradeable": "true", + "grand_exchange_price": "821", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5960", + "name": "Tomatoes(1)", + "examine": "A basket filled with tomatoes.", + "tradeable": "true", + "grand_exchange_price": "663", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5961", + "name": "Tomatoes(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5962", + "name": "Tomatoes(2)", + "examine": "A basket filled with tomatoes.", + "tradeable": "true", + "grand_exchange_price": "663", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5963", + "name": "Tomatoes(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5964", + "name": "Tomatoes(3)", + "examine": "A basket filled with tomatoes.", + "tradeable": "true", + "grand_exchange_price": "663", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5965", + "name": "Tomatoes(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5966", + "name": "Tomatoes(4)", + "examine": "A basket filled with tomatoes.", + "tradeable": "true", + "grand_exchange_price": "663", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5967", + "name": "Tomatoes(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5968", + "name": "Tomatoes(5)", + "examine": "A basket filled with tomatoes.", + "tradeable": "true", + "grand_exchange_price": "335", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5969", + "name": "Tomatoes(5)", + "tradeable": "true", + "grand_exchange_price": "335", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5970", + "name": "Curry leaf", + "examine": "I could make a spicy curry with this.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "11", + "grand_exchange_price": "318", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5971", + "name": "Curry leaf", + "tradeable": "true", + "grand_exchange_price": "318", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5972", + "name": "Papaya fruit", + "examine": "Looks delicious.", + "tradeable": "true", + "low_alchemy": "25", + "high_alchemy": "38", + "grand_exchange_price": "2074", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5973", + "name": "Papaya fruit", + "tradeable": "true", + "grand_exchange_price": "2074", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5974", + "name": "Coconut", + "examine": "It's a coconut.", + "tradeable": "true", + "low_alchemy": "34", + "high_alchemy": "52", + "grand_exchange_price": "2568", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5975", + "name": "Coconut", + "tradeable": "true", + "grand_exchange_price": "2568", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5976", + "name": "Coconut", + "examine": "It's a coconut.", + "tradeable": "true", + "low_alchemy": "34", + "high_alchemy": "52", + "grand_exchange_price": "1258", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5977", + "name": "Coconut", + "tradeable": "true", + "grand_exchange_price": "1258", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5978", + "name": "Coconut shell", + "examine": "All the milk has been removed.", + "tradeable": "true", + "grand_exchange_price": "54", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5979", + "name": "Coconut shell", + "tradeable": "true", + "grand_exchange_price": "54", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5980", + "name": "Calquat fruit", + "examine": "This is the largest fruit I've ever seen.", + "tradeable": "true", + "low_alchemy": "21", + "high_alchemy": "32", + "grand_exchange_price": "43", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5981", + "name": "Calquat fruit", + "tradeable": "true", + "grand_exchange_price": "43", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5982", + "name": "Watermelon", + "examine": "A juicy watermelon.", + "tradeable": "true", + "low_alchemy": "19", + "high_alchemy": "28", + "shop_price": "48", + "grand_exchange_price": "41", + "weight": "0.111", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5983", + "name": "Watermelon", + "tradeable": "true", + "grand_exchange_price": "41", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5984", + "name": "Watermelon slice", + "examine": "A slice of watermelon.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "40", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5985", + "name": "Watermelon slice", + "tradeable": "true", + "grand_exchange_price": "40", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5986", + "name": "Sweetcorn", + "examine": "Raw sweetcorn.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "5", + "grand_exchange_price": "19", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5987", + "name": "Sweetcorn", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5988", + "name": "Cooked sweetcorn", + "examine": "Delicious cooked sweetcorn.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "5", + "grand_exchange_price": "15", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5989", + "name": "Cooked sweetcorn", + "tradeable": "true", + "grand_exchange_price": "15", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5991", + "name": "Burnt sweetcorn", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5992", + "name": "Apple mush", + "examine": "A bucket of apple mush.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "grand_exchange_price": "425", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5993", + "name": "Apple mush", + "tradeable": "true", + "grand_exchange_price": "425", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5994", + "name": "Hammerstone hops", + "examine": "A handful of Hammerstone hops.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "14", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5995", + "name": "Hammerstone hops", + "tradeable": "true", + "grand_exchange_price": "14", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5996", + "name": "Asgarnian hops", + "examine": "A handful of Asgarnian hops.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "2", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5997", + "name": "Asgarnian hops", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5998", + "name": "Yanillian hops", + "examine": "A handful of Yanillian hops.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "grand_exchange_price": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "5999", + "name": "Yanillian hops", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6000", + "name": "Krandorian hops", + "examine": "A handful of Krandorian hops.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "4", + "grand_exchange_price": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6001", + "name": "Krandorian hops", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6002", + "name": "Wildblood hops", + "examine": "A handful of wildblood hops.", + "tradeable": "true", + "grand_exchange_price": "66", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6003", + "name": "Wildblood hops", + "tradeable": "true", + "grand_exchange_price": "66", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6004", + "name": "Mushroom", + "grand_exchange_price": "219", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6005", + "name": "Mushroom", + "tradeable": "true", + "grand_exchange_price": "219", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6006", + "name": "Barley", + "examine": "A handful of Barley.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "211", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6007", + "name": "Barley", + "tradeable": "true", + "grand_exchange_price": "211", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6008", + "name": "Barley malt", + "examine": "A handful of barley malt.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "410", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6009", + "name": "Barley malt", + "tradeable": "true", + "grand_exchange_price": "410", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6010", + "name": "Marigolds", + "examine": "A bunch of marigolds.", + "tradeable": "true", + "grand_exchange_price": "3326", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6011", + "name": "Marigolds", + "tradeable": "true", + "grand_exchange_price": "3326", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6012", + "name": "Nasturtiums", + "examine": "A bunch of nasturtiums.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "52", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6013", + "name": "Nasturtiums", + "tradeable": "true", + "grand_exchange_price": "52", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6014", + "name": "Rosemary", + "examine": "Some rosemary.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "29", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6015", + "name": "Rosemary", + "tradeable": "true", + "grand_exchange_price": "29", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6016", + "name": "Cactus spine", + "examine": "Don't prick yourself with this.", + "tradeable": "true", + "grand_exchange_price": "6990", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6017", + "name": "Cactus spine", + "tradeable": "true", + "grand_exchange_price": "6990", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6018", + "name": "Poison ivy berries", + "examine": "They look sweet and juicy, but only a fool would eat them.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "39", + "grand_exchange_price": "399", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6019", + "name": "Poison ivy berries", + "tradeable": "true", + "grand_exchange_price": "399", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6020", + "name": "Leaves", + "examine": "A pile of leaves.", + "tradeable": "true", + "grand_exchange_price": "152", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6021", + "name": "Leaves", + "tradeable": "true", + "grand_exchange_price": "152", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6022", + "name": "Leaves", + "examine": "A pile of leaves.", + "tradeable": "true", + "grand_exchange_price": "27", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6023", + "name": "Leaves", + "tradeable": "true", + "grand_exchange_price": "27", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6024", + "name": "Leaves", + "examine": "A pile of leaves.", + "tradeable": "true", + "grand_exchange_price": "21", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6025", + "name": "Leaves", + "tradeable": "true", + "grand_exchange_price": "21", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6026", + "name": "Leaves", + "examine": "A pile of leaves.", + "tradeable": "true", + "grand_exchange_price": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6027", + "name": "Leaves", + "tradeable": "true", + "grand_exchange_price": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6028", + "name": "Leaves", + "examine": "A pile of leaves.", + "tradeable": "true", + "grand_exchange_price": "11", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6029", + "name": "Leaves", + "tradeable": "true", + "grand_exchange_price": "11", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6030", + "name": "Leaves", + "examine": "A pile of leaves.", + "tradeable": "true", + "grand_exchange_price": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6031", + "name": "Leaves", + "tradeable": "true", + "grand_exchange_price": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6032", + "name": "Compost", + "examine": "Good for plants, helps them grow.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "97", + "weight": "3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6033", + "name": "Compost", + "tradeable": "true", + "grand_exchange_price": "97", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6034", + "name": "Supercompost", + "examine": "Super-good for the smallest or largest of plants.", + "tradeable": "true", + "low_alchemy": "34", + "high_alchemy": "51", + "grand_exchange_price": "909", + "weight": "3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6035", + "name": "Supercompost", + "tradeable": "true", + "grand_exchange_price": "909", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6036", + "name": "Plant cure", + "examine": "Use this on plants to cure disease.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "25", + "grand_exchange_price": "170", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6037", + "name": "Plant cure", + "tradeable": "true", + "grand_exchange_price": "170", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6038", + "name": "Magic string", + "examine": "I could use this to make jewellery.", + "tradeable": "true", + "grand_exchange_price": "1078", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6039", + "name": "Magic string", + "tradeable": "true", + "grand_exchange_price": "1078", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6040", + "name": "Amulet of nature", + "examine": "An Amulet of Nature.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to create a new amulet if you destroy this one.", + "equipment_slot": "2", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6041", + "name": "Pre-nature amulet", + "examine": "Strung with the root of a Magic Tree. If I enchant this it will become an amulet of nature.", + "tradeable": "true", + "grand_exchange_price": "1996", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6042", + "name": "Pre-nature amulet", + "tradeable": "true", + "grand_exchange_price": "1996", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6043", + "name": "Oak roots", + "examine": "The roots of the Oak tree.", + "tradeable": "true", + "grand_exchange_price": "60", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6044", + "name": "Oak roots", + "tradeable": "true", + "grand_exchange_price": "60", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6045", + "name": "Willow roots", + "examine": "The roots of the Willow tree.", + "tradeable": "true", + "grand_exchange_price": "41", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6046", + "name": "Willow roots", + "tradeable": "true", + "grand_exchange_price": "41", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6047", + "name": "Maple roots", + "examine": "The roots of the Maple tree.", + "tradeable": "true", + "grand_exchange_price": "40", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6048", + "name": "Maple roots", + "tradeable": "true", + "grand_exchange_price": "40", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6049", + "name": "Yew roots", + "examine": "The roots of a yew tree", + "tradeable": "true", + "grand_exchange_price": "570", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6050", + "name": "Yew roots", + "tradeable": "true", + "grand_exchange_price": "570", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6051", + "name": "Magic roots", + "examine": "The roots of a magic tree.", + "tradeable": "true", + "grand_exchange_price": "5853", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6052", + "name": "Magic roots", + "tradeable": "true", + "grand_exchange_price": "5853", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6054", + "name": "Spirit roots", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6055", + "name": "Weeds", + "examine": "A handful of weeds.", + "tradeable": "true", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6056", + "name": "Weeds", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6057", + "name": "Hay sack", + "examine": "A sack filled with hay. / This sack of hay has a bronze spear sticking through it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6058", + "name": "Hay sack", + "examine": "A sack filled with hay. / This sack of hay has a bronze spear sticking through it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6059", + "name": "Scarecrow", + "examine": "This should scare the birds.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6060", + "name": "Stool", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6061", + "name": "Bronze bolts(p+)", + "examine": "Bronze crossbow bolts.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "134", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6062", + "name": "Bronze bolts(p++)", + "examine": "Bronze crossbow bolts.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "1162", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,10", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6064", + "name": "Bloody mourner top", + "examine": "How do I wash blood stains out?", + "low_alchemy": "8", + "high_alchemy": "12", + "weight": "2.72", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6065", + "name": "Mourner top", + "examine": "A thick heavy leather top.", + "low_alchemy": "60", + "high_alchemy": "90", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6066", + "name": "Mourner trousers", + "examine": "Damaged: These are in need of a good tailor.Repaired: A pair of mourner trousers.", + "low_alchemy": "8", + "high_alchemy": "12", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6067", + "name": "Mourner trousers", + "examine": "Damaged: These are in need of a good tailor.Repaired: A pair of mourner trousers.", + "low_alchemy": "8", + "high_alchemy": "12", + "equipment_slot": "7", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6068", + "name": "Mourner gloves", + "examine": "These will keep my hands warm.", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "160", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "weight": "2.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6069", + "name": "Mourner boots", + "examine": "Comfortable leather boots.", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "160", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "weight": "1.36", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6070", + "name": "Mourner cloak", + "examine": "A dull brown cape.", + "low_alchemy": "20", + "high_alchemy": "30", + "equipment_slot": "1", + "weight": "2.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6071", + "name": "Mourner letter", + "examine": "A letter of recommendation.", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6072", + "name": "Tegid's soap", + "examine": "A bar of soap taken from Tegid.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6073", + "name": "Prifddinas' history", + "examine": "A book on the history of Prifddinas.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6075", + "name": "Eastern discovery", + "examine": "A book on the exploration of the eastern realm.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6077", + "name": "Eastern settlement", + "examine": "A book on the settlement of the eastern realm.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6079", + "name": "The great divide", + "examine": "A book about the great divide.", + "high_alchemy": "1", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6081", + "name": "Broken device", + "examine": "A strange broken device of gnomic design.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6082", + "name": "Fixed device", + "examine": "A device for firing dye.", + "low_alchemy": "60", + "high_alchemy": "90", + "stand_anim": "2316", + "stand_turn_anim": "2321", + "walk_anim": "2317", + "run_anim": "2322", + "turn180_anim": "2318", + "turn90cw_anim": "2319", + "turn90ccw_anim": "2320", + "render_anim": "284", + "equipment_slot": "3", + "attack_speed": "4", + "weapon_interface": "20", + "two_handed": "true", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6083", + "name": "Tarnished key", + "examine": "This key has seen a lot of use. (Mourning's Ends Part I)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6085", + "name": "Red dye bellows", + "examine": "A large pair of ogre bellows filled with red dye.", + "low_alchemy": "8", + "high_alchemy": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6086", + "name": "Blue dye bellows", + "examine": "A large pair of ogre bellows filled with blue dye.", + "low_alchemy": "8", + "high_alchemy": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6087", + "name": "Yellow dye bellows", + "examine": "A large pair of ogre bellows filled with yellow dye.", + "low_alchemy": "8", + "high_alchemy": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6088", + "name": "Green dye bellows", + "examine": "A large pair of ogre bellows filled with green dye.", + "low_alchemy": "8", + "high_alchemy": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6089", + "name": "Blue toad", + "examine": "A blue dye filled toad.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6090", + "name": "Red toad", + "examine": "A red dye filled toad.", + "weight": "0.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6091", + "name": "Yellow toad", + "examine": "A yellow dye filled toad.", + "weight": "0.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6092", + "name": "Green toad", + "examine": "A green dye filled toad.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6093", + "name": "Rotten apples", + "examine": "A barrel full of rotten apples.", + "weight": "17", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6094", + "name": "Apple barrel", + "examine": "A barrel full of mushed apples.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6095", + "name": "Naphtha apple mix", + "examine": "A barrel full of rotten apples and naptha.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6096", + "name": "Toxic naphtha", + "examine": "A barrel full of toxic naphtha.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6097", + "name": "Sieve", + "examine": "It's a sieve.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6098", + "name": "Toxic powder", + "examine": "A pile of toxic powder.", + "low_alchemy": "20", + "high_alchemy": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6099", + "name": "Teleport crystal (4)", + "examine": "A tiny crystal enchanted to return the user to Lletya.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6100", + "name": "Teleport crystal (3)", + "examine": "A tiny crystal enchanted to return the user to Lletya.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6101", + "name": "Teleport crystal (2)", + "examine": "A tiny crystal enchanted to return the user to Lletya.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6102", + "name": "Teleport crystal (1)", + "examine": "A tiny crystal enchanted to return the user to Lletya.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6103", + "name": "Tiny elf crystal", + "examine": "A tiny Elf crystal, I need to have this re-enchanted", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6104", + "name": "New key", + "examine": "This key is newly cut. (Mourning's Ends Part II)", + "weight": "0.33", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6106", + "name": "Ghostly boots", + "examine": "They seem to be not quite of this world...", + "low_alchemy": "120", + "high_alchemy": "180", + "equipment_slot": "10", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6107", + "name": "Ghostly robe", + "examine": "Varies", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,5,0,0,0,0,5,0,5,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6108", + "name": "Ghostly robe", + "examine": "Varies", + "equipment_slot": "7", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6109", + "name": "Ghostly hood", + "examine": "A ghostly hood, fit for a ghostly head.", + "low_alchemy": "120", + "high_alchemy": "180", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6110", + "name": "Ghostly gloves", + "examine": "They seem to fade in and out of existence...", + "low_alchemy": "120", + "high_alchemy": "180", + "equipment_slot": "9", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6111", + "name": "Ghostly cloak", + "examine": "Made of a strange, ghostly material...", + "low_alchemy": "100", + "high_alchemy": "150", + "equipment_slot": "1", + "bonuses": "0,0,0,5,0,0,0,0,5,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6112", + "name": "Kelda seed", + "examine": "Kelda hop seeds can only be grown underground!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Return to the drunken dwarf's drunken relative to get your seeds back.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6113", + "name": "Kelda hops", + "examine": "A handful of Kelda Hops.", + "low_alchemy": "1", + "high_alchemy": "2", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Return to the Keldagrim palace gardener to get your hops back.", + "weight": "0.01", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6118", + "name": "Kelda stout", + "examine": "A pint of bluish beer.", + "high_alchemy": "1", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6119", + "name": "Square stone", + "examine": "There is a strange [green/yellow] marking on this stone.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6120", + "name": "Square stone", + "examine": "There is a strange [green/yellow] marking on this stone.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6122", + "name": "A chair", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6123", + "name": "Beer glass", + "examine": "I need to fill this with beer.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "1", + "grand_exchange_price": "25", + "equipment_slot": "3", + "weight": "0.05", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6124", + "name": "Coconut milk", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6125", + "name": "Enchanted lyre(2)", + "examine": "This will teleport me to Rellekka when I play it. A musical intrument that I can magically play.", + "low_alchemy": "400", + "high_alchemy": "600", + "equipment_slot": "3", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6126", + "name": "Enchanted lyre(3)", + "examine": "This will teleport me to Rellekka when I play it. A musical intrument that I can magically play.", + "low_alchemy": "400", + "high_alchemy": "600", + "equipment_slot": "3", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6127", + "name": "Enchanted lyre(4)", + "examine": "This will teleport me to Rellekka when I play it. A musical intrument that I can magically play.", + "low_alchemy": "400", + "high_alchemy": "600", + "equipment_slot": "3", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6128", + "name": "Rock-shell helm", + "examine": "Protective headwear made from crabs. Better than it sounds.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "21000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,6,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6129", + "name": "Rock-shell plate", + "grand_exchange_price": "40600", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,30,0,0,0,0", + "requirements": "{1,40}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6130", + "name": "Rock-shell legs", + "examine": "Some tough leggings made from rock crab parts.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "39400", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,10,0,0,0,0", + "requirements": "{1,40}", + "weight": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6131", + "name": "Spined helm", + "examine": "A helm fit for any Fremennik ranger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24000", + "high_alchemy": "36000", + "grand_exchange_price": "35800", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "-6,-6,-6,-6,6,6,6,6,6,0,6,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6132", + "name": "Spined helm", + "tradeable": "true", + "grand_exchange_price": "35800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6133", + "name": "Spined body", + "examine": "A constant reminder that I'm above a Dagannoth in the food chain.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "3000", + "high_alchemy": "4500", + "grand_exchange_price": "4386", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,15,40,32,45,20,40,30,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6134", + "name": "Spined body", + "tradeable": "true", + "grand_exchange_price": "4386", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6135", + "name": "Spined chaps", + "examine": "Stylish leg armour for rangers with a lingering smell of raw fish...", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "1560", + "high_alchemy": "2340", + "grand_exchange_price": "2132", + "equipment_slot": "7", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,8,22,16,24,8,22,10,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6136", + "name": "Spined chaps", + "tradeable": "true", + "grand_exchange_price": "2132", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6137", + "name": "Skeletal helm", + "examine": "Make your foes cower by wearing a skull as a helmet!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "29500", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,2,-2,10,9,11,3,0,6,0,0,0,0", + "requirements": "{1,40}-{6,40}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6138", + "name": "Skeletal helm", + "tradeable": "true", + "grand_exchange_price": "29500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6139", + "name": "Skeletal top", + "examine": "The bones in this armour seems to vibrate with a magic quality...", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "grand_exchange_price": "27800", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,8,-10,35,25,42,15,0,30,0,0,0,0", + "requirements": "{1,40}-{6,40}", + "weight": "4.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6140", + "name": "Skeletal top", + "tradeable": "true", + "grand_exchange_price": "27800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6141", + "name": "Skeletal bottoms", + "examine": "A superior set of strengthened slacks for any self respecting seer.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16000", + "high_alchemy": "24000", + "grand_exchange_price": "23600", + "equipment_slot": "7", + "absorb": "4,2,0", + "bonuses": "0,0,0,6,-7,22,20,24,10,0,10,0,0,0,0", + "requirements": "{1,40}-{6,40}", + "weight": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6142", + "name": "Skeletal bottoms", + "tradeable": "true", + "grand_exchange_price": "23600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6143", + "name": "Spined boots", + "examine": "Some finely crafted Fremennik boots, made from spined dagannoth hide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "1671", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,1,0,0,0,0", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6144", + "name": "Spined boots", + "tradeable": "true", + "grand_exchange_price": "1671", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6145", + "name": "Rock-shell boots", + "examine": "Some Fremennik boots, made from the shards of a rock crab's shell.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "756", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,1,0,0,0,0", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6146", + "name": "Rock-shell boots", + "tradeable": "true", + "grand_exchange_price": "756", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6147", + "name": "Skeletal boots", + "examine": "Some finely crafted Fremennik boots, made from the bones of a Wallasalki.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "4958", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,1,1,0,0,1,0,0,0,0", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6148", + "name": "Skeletal boots", + "tradeable": "true", + "grand_exchange_price": "4958", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6149", + "name": "Spined gloves", + "examine": "Fremennik gloves stitched together from spined dagannoth hide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "955", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6150", + "name": "Spined gloves", + "tradeable": "true", + "grand_exchange_price": "955", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6151", + "name": "Rock-shell gloves", + "examine": "Fremennik gloves stitched together from rock crab shell shards.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "951", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6152", + "name": "Rock-shell gloves", + "tradeable": "true", + "grand_exchange_price": "951", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6153", + "name": "Skeletal gloves", + "examine": "Fremennik gloves stitched together from wallasalki bones fragments.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "grand_exchange_price": "21800", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6154", + "name": "Skeletal gloves", + "tradeable": "true", + "grand_exchange_price": "21800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6155", + "name": "Dagannoth hide", + "examine": "A sturdy piece of dagannoth hide.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "3978", + "weight": "3.1", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6156", + "name": "Dagannoth hide", + "tradeable": "true", + "grand_exchange_price": "3978", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6157", + "name": "Rock-shell chunk", + "examine": "A spherical chunk of rock-shell.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "7371", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6158", + "name": "Rock-shell chunk", + "tradeable": "true", + "grand_exchange_price": "7371", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6159", + "name": "Rock-shell shard", + "examine": "A curved piece of rock-shell.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "11300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6160", + "name": "Rock-shell shard", + "tradeable": "true", + "grand_exchange_price": "11300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6161", + "name": "Rock-shell splinter", + "examine": "A slim piece of rock-shell.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "16100", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6162", + "name": "Rock-shell splinter", + "tradeable": "true", + "grand_exchange_price": "16100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6163", + "name": "Skull piece", + "examine": "A fearsome looking skull.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "9859", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6164", + "name": "Skull piece", + "tradeable": "true", + "grand_exchange_price": "9859", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6165", + "name": "Ribcage piece", + "examine": "A slightly damaged ribcage.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "11300", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6166", + "name": "Ribcage piece", + "tradeable": "true", + "grand_exchange_price": "11300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6167", + "name": "Fibula piece", + "examine": "An interesting looking bone shard.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "10300", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6168", + "name": "Fibula piece", + "tradeable": "true", + "grand_exchange_price": "10300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6169", + "name": "Circular hide", + "examine": "A toughened chunk of dagannoth hide.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "23400", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6170", + "name": "Circular hide", + "tradeable": "true", + "grand_exchange_price": "23400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6171", + "name": "Flattened hide", + "examine": "A tattered chunk of dagannoth hide.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "502", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6172", + "name": "Flattened hide", + "tradeable": "true", + "grand_exchange_price": "502", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6173", + "name": "Stretched hide", + "examine": "A weathered chunk of dagannoth hide.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "398", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6174", + "name": "Stretched hide", + "tradeable": "true", + "grand_exchange_price": "398", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6175", + "name": "Rock-shell helm", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6176", + "name": "Rock-shell plate", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6177", + "name": "Rock-shell legs", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6178", + "name": "Raw pheasant", + "examine": "I need to cook this first.", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6179", + "name": "Raw pheasant", + "examine": "I need to cook this first.", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6180", + "name": "Lederhosen top", + "examine": "A leather strapped top.", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6181", + "name": "Lederhosen shorts", + "examine": "Brown leather shorts with bright white socks?", + "equipment_slot": "7", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6182", + "name": "Lederhosen hat", + "examine": "A hat with a goat's hair attached.", + "remove_head": "true", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6183", + "name": "Frog token", + "examine": "I can use this at the Varrock clothes shop.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6184", + "name": "Prince tunic", + "examine": "Very posh!", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6185", + "name": "Prince leggings", + "examine": "Very posh!", + "equipment_slot": "7", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6186", + "name": "Princess blouse", + "examine": "Very posh!", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6187", + "name": "Princess skirt", + "examine": "Very posh!", + "equipment_slot": "7", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6188", + "name": "Frog mask", + "examine": "Now that's just silly.", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6199", + "name": "Mystery box", + "examine": "Could there be something valuable in here?", + "weight": "1", + "point_price": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6200", + "name": "Raw fishlike thing", + "examine": "A raw...fish? Is this a fish??", + "destroy": "true", + "tradeable": "false", + "destroy_message": "A ghastly fish", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6201", + "name": "Picture", + "examine": "Fish-tastic!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6202", + "name": "Fishlike thing", + "examine": "It's a fish-like thing that appears to already be cooked. It looks disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "A ghastly fish", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6204", + "name": "Raw fishlike thing", + "examine": "A raw...fish? Is this a fish??", + "destroy": "true", + "tradeable": "false", + "destroy_message": "A ghastly fish", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6206", + "name": "Fishlike thing", + "examine": "It's a fish-like thing that appears to already be cooked. It looks disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "A ghastly fish", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6208", + "name": "Man speak amulet", + "examine": "It's an amulet of Man speak. It makes vague grunting noises.", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6209", + "name": "Small fishing net", + "examine": "Useful for catching small fish.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "40", + "grand_exchange_price": "433", + "weight": "4.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6211", + "name": "Teak pyre logs", + "examine": "Teak logs prepared with sacred oil for a funeral pyre.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "3365", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6212", + "name": "Teak pyre logs", + "tradeable": "true", + "grand_exchange_price": "3365", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6213", + "name": "Mahogany pyre log", + "examine": "Mahogany logs prepared with sacred oil for a funeral pyre.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "3574", + "weight": "1.3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6214", + "name": "Mahogany pyre log", + "tradeable": "true", + "grand_exchange_price": "3574", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6215", + "name": "Broodoo shield (10)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "2007", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6216", + "name": "Broodoo shield (10)", + "tradeable": "true", + "grand_exchange_price": "2007", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6217", + "name": "Broodoo shield (9)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6218", + "name": "Broodoo shield (9)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6219", + "name": "Broodoo shield (8)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6220", + "name": "Broodoo shield (8)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6221", + "name": "Broodoo shield (7)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6222", + "name": "Broodoo shield (7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6223", + "name": "Broodoo shield (6)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6224", + "name": "Broodoo shield (6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6225", + "name": "Broodoo shield (5)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6226", + "name": "Broodoo shield (5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6227", + "name": "Broodoo shield (4)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6228", + "name": "Broodoo shield (4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6229", + "name": "Broodoo shield (3)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6230", + "name": "Broodoo shield (3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6231", + "name": "Broodoo shield (2)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6232", + "name": "Broodoo shield (2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6233", + "name": "Broodoo shield (1)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6234", + "name": "Broodoo shield (1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6235", + "name": "Broodoo shield", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "2572", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6236", + "name": "Broodoo shield", + "tradeable": "true", + "grand_exchange_price": "2572", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6237", + "name": "Broodoo shield (10)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "2200", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6238", + "name": "Broodoo shield (10)", + "tradeable": "true", + "grand_exchange_price": "2200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6239", + "name": "Broodoo shield (9)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6240", + "name": "Broodoo shield (9)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6241", + "name": "Broodoo shield (8)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6242", + "name": "Broodoo shield (8)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6243", + "name": "Broodoo shield (7)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6244", + "name": "Broodoo shield (7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6245", + "name": "Broodoo shield (6)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6246", + "name": "Broodoo shield (6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6247", + "name": "Broodoo shield (5)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6248", + "name": "Broodoo shield (5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6249", + "name": "Broodoo shield (4)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6250", + "name": "Broodoo shield (4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6251", + "name": "Broodoo shield (3)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6252", + "name": "Broodoo shield (3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6253", + "name": "Broodoo shield (2)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6254", + "name": "Broodoo shield (2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6255", + "name": "Broodoo shield (1)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6256", + "name": "Broodoo shield (1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6257", + "name": "Broodoo shield", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "2731", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6258", + "name": "Broodoo shield", + "tradeable": "true", + "grand_exchange_price": "2731", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6259", + "name": "Broodoo shield (10)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1494", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6260", + "name": "Broodoo shield (10)", + "tradeable": "true", + "grand_exchange_price": "1494", + "attack_anims": "7060", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6261", + "name": "Broodoo shield (9)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6262", + "name": "Broodoo shield (9)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6263", + "name": "Broodoo shield (8)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6264", + "name": "Broodoo shield (8)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6265", + "name": "Broodoo shield (7)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6266", + "name": "Broodoo shield (7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6267", + "name": "Broodoo shield (6)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6268", + "name": "Broodoo shield (6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6269", + "name": "Broodoo shield (5)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6270", + "name": "Broodoo shield (5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6271", + "name": "Broodoo shield (4)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6272", + "name": "Broodoo shield (4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6273", + "name": "Broodoo shield (3)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6274", + "name": "Broodoo shield (3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6275", + "name": "Broodoo shield (2)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6276", + "name": "Broodoo shield (2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6277", + "name": "Broodoo shield (1)", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6278", + "name": "Broodoo shield (1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6279", + "name": "Broodoo shield", + "examine": "A scary broodoo shield.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "2957", + "equipment_slot": "5", + "absorb": "4,2,0", + "bonuses": "0,0,0,3,-7,10,10,15,5,0,20,0,5,0,0", + "requirements": "{1,25}-{6,25}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6280", + "name": "Broodoo shield", + "tradeable": "true", + "grand_exchange_price": "2957", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6281", + "name": "Thatch spar light", + "examine": "A wooden pole for use in primitive construction.", + "tradeable": "true", + "grand_exchange_price": "1", + "equipment_slot": "5", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6282", + "name": "Thatch spar light", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6283", + "name": "Thatch spar med", + "examine": "A wooden pole for use in primitive construction.", + "tradeable": "true", + "grand_exchange_price": "2", + "equipment_slot": "5", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6284", + "name": "Thatch spar med", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6285", + "name": "Thatch spar dense", + "examine": "A wooden pole for use in primitive construction.", + "tradeable": "true", + "grand_exchange_price": "3", + "equipment_slot": "5", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6286", + "name": "Thatch spar dense", + "tradeable": "true", + "grand_exchange_price": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6287", + "name": "Snake hide", + "examine": "Scaly but not slimy!", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "grand_exchange_price": "2084", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6288", + "name": "Snake hide", + "tradeable": "true", + "grand_exchange_price": "2084", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6289", + "name": "Snakeskin", + "examine": "Scaley but not slimy!", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "2019", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6290", + "name": "Snakeskin", + "tradeable": "true", + "grand_exchange_price": "2019", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6291", + "name": "Spider carcass", + "examine": "Its creeping days are over!", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "1949", + "weight": "0.8", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6292", + "name": "Spider carcass", + "tradeable": "true", + "grand_exchange_price": "1949", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6293", + "name": "Spider on stick", + "examine": "Raw: A raw spider threaded onto a skewer stick.Cooked: A nicely roasted spider threaded onto a skewer stick.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "207", + "weight": "0.9", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6294", + "name": "Spider on stick", + "tradeable": "true", + "grand_exchange_price": "207", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6295", + "name": "Spider on shaft", + "examine": "A raw spider threaded onto an arrow shaft. (Raw) A nicely roasted spider threaded onto an arrow shaft. (Cooked) A badly burnt spider threaded onto a charred arrow shaft. (Burnt)", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "40", + "grand_exchange_price": "106", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6296", + "name": "Spider on shaft", + "tradeable": "true", + "grand_exchange_price": "106", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6297", + "name": "Spider on stick", + "examine": "Raw: A raw spider threaded onto a skewer stick.Cooked: A nicely roasted spider threaded onto a skewer stick.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "54", + "weight": "0.9", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6298", + "name": "Spider on stick", + "tradeable": "true", + "grand_exchange_price": "54", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6299", + "name": "Spider on shaft", + "examine": "A raw spider threaded onto an arrow shaft. (Raw) A nicely roasted spider threaded onto an arrow shaft. (Cooked) A badly burnt spider threaded onto a charred arrow shaft. (Burnt)", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "40", + "grand_exchange_price": "78", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6300", + "name": "Spider on shaft", + "tradeable": "true", + "grand_exchange_price": "78", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6302", + "name": "Burnt spider", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6303", + "name": "Spider on shaft", + "examine": "A raw spider threaded onto an arrow shaft. (Raw) A nicely roasted spider threaded onto an arrow shaft. (Cooked) A badly burnt spider threaded onto a charred arrow shaft. (Burnt)", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "40", + "grand_exchange_price": "106", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6304", + "name": "Spider on shaft", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6305", + "name": "Skewer stick", + "examine": "A sharp pointed stick, quite resistant to fire.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6306", + "name": "Trading sticks", + "examine": "Karamja currency.", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6311", + "name": "Gout tuber", + "examine": "Plant this in a herb patch to grow Goutweed.", + "tradeable": "true", + "grand_exchange_price": "6991", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6312", + "name": "Gout tuber", + "tradeable": "true", + "grand_exchange_price": "6991", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6313", + "name": "Opal machete", + "examine": "A jungle specific slashing device.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "500", + "grand_exchange_price": "179", + "render_anim": "2554", + "equipment_slot": "3", + "bonuses": "0,8,-2,0,0,0,1,1,0,0,0,4,0,0,0", + "weapon_interface": "6", + "weight": "1.35", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6314", + "name": "Opal machete", + "tradeable": "true", + "grand_exchange_price": "179", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6315", + "name": "Jade machete", + "examine": "A jungle specific slashing device.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "grand_exchange_price": "4473", + "render_anim": "2554", + "equipment_slot": "3", + "bonuses": "0,11,-2,0,0,0,1,1,0,0,0,6,0,0,0", + "weapon_interface": "6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6316", + "name": "Jade machete", + "tradeable": "true", + "grand_exchange_price": "4473", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6317", + "name": "Red topaz machete", + "examine": "A jungle specific slashing device.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "2000", + "grand_exchange_price": "8774", + "render_anim": "2554", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,16,-2,0,0,0,1,1,0,0,0,10,0,0,0", + "weapon_interface": "6", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6318", + "name": "Red topaz machete", + "tradeable": "true", + "grand_exchange_price": "8774", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6319", + "name": "Proboscis", + "examine": "A giant mosquito's proboscis: aerodynamic, sharp and pointy!", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "9733", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6322", + "name": "Snakeskin body", + "examine": "Made from 100% real snakeskin.", + "tradeable": "true", + "low_alchemy": "500", + "high_alchemy": "750", + "shop_price": "1588", + "grand_exchange_price": "23100", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,4,2", + "bonuses": "0,0,0,-5,12,25,28,32,15,35,30,0,0,0,0", + "requirements": "{1,30}-{4,30}", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6323", + "name": "Snakeskin body", + "tradeable": "true", + "grand_exchange_price": "23100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6324", + "name": "Snakeskin chaps", + "examine": "Made from 100% real snake.", + "tradeable": "true", + "low_alchemy": "470", + "high_alchemy": "705", + "grand_exchange_price": "702", + "equipment_slot": "7", + "absorb": "0,3,1", + "bonuses": "0,0,0,-5,6,8,8,10,4,10,10,0,0,0,0", + "requirements": "{1,30}-{4,30}", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6325", + "name": "Snakeskin chaps", + "tradeable": "true", + "grand_exchange_price": "702", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6326", + "name": "Snakeskin bandana", + "examine": "Lightweight head protection.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "871", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,2,1", + "bonuses": "0,0,0,-5,4,2,4,4,2,2,6,0,0,0,0", + "requirements": "{1,30}-{4,30}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6327", + "name": "Snakeskin bandana", + "tradeable": "true", + "grand_exchange_price": "871", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6328", + "name": "Snakeskin boots", + "examine": "Made from snakes.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "10800", + "equipment_slot": "10", + "bonuses": "0,0,0,-10,3,1,1,2,1,0,9,0,0,0,0", + "requirements": "{1,30}-{4,30}", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6329", + "name": "Snakeskin boots", + "tradeable": "true", + "grand_exchange_price": "10800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6330", + "name": "Snakeskin v'brace", + "examine": "Made from 100% real snake.", + "tradeable": "true", + "low_alchemy": "173", + "high_alchemy": "260", + "grand_exchange_price": "914", + "equipment_slot": "9", + "bonuses": "0,0,0,-5,6,2,2,2,1,0,1,0,0,0,0", + "requirements": "{1,30}-{4,30}", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6331", + "name": "Snakeskin v'brace", + "tradeable": "true", + "grand_exchange_price": "914", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6332", + "name": "Mahogany logs", + "examine": "Some well-cut mahogany logs.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "503", + "weight": "1.33", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6333", + "name": "Teak logs", + "examine": "Some well-cut teak logs.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "92", + "weight": "1.35", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6334", + "name": "Teak logs", + "tradeable": "true", + "grand_exchange_price": "92", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6335", + "name": "Tribal mask", + "examine": "A ceremonial wooden mask.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "1306", + "equipment_slot": "0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6336", + "name": "Tribal mask", + "tradeable": "true", + "grand_exchange_price": "1306", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6337", + "name": "Tribal mask", + "examine": "A ceremonial wooden mask.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "997", + "equipment_slot": "0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6338", + "name": "Tribal mask", + "tradeable": "true", + "grand_exchange_price": "997", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6339", + "name": "Tribal mask", + "examine": "A ceremonial wooden mask.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "1018", + "equipment_slot": "0", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6340", + "name": "Tribal mask", + "tradeable": "true", + "grand_exchange_price": "1018", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6341", + "name": "Tribal top", + "examine": "Local dress.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "3331", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6342", + "name": "Tribal top", + "tradeable": "true", + "grand_exchange_price": "3331", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6343", + "name": "Villager robe", + "examine": "A brightly coloured robe prized by the Tai Bwo Wannai peoples.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "250", + "grand_exchange_price": "1382", + "equipment_slot": "7", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6344", + "name": "Villager robe", + "tradeable": "true", + "grand_exchange_price": "1382", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6345", + "name": "Villager hat", + "examine": "A brightly coloured hat prized by the Tai Bwo Wannai peoples.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "2337", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6346", + "name": "Villager hat", + "tradeable": "true", + "grand_exchange_price": "2337", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6347", + "name": "Villager armband", + "examine": "A <colour> armband, as worn by the Tai Bwo Wannai locals.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "150", + "grand_exchange_price": "734", + "equipment_slot": "9", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6348", + "name": "Villager armband", + "tradeable": "true", + "grand_exchange_price": "734", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6349", + "name": "Villager sandals", + "examine": "A brightly coloured pair of local sandals.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "grand_exchange_price": "2793", + "equipment_slot": "10", + "weight": "0.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6350", + "name": "Villager sandals", + "tradeable": "true", + "grand_exchange_price": "2793", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6351", + "name": "Tribal top", + "examine": "Local dress.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "3171", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6352", + "name": "Tribal top", + "tradeable": "true", + "grand_exchange_price": "3171", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6353", + "name": "Villager robe", + "examine": "A brightly coloured robe prized by the Tai Bwo Wannai peoples.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "250", + "grand_exchange_price": "1416", + "equipment_slot": "7", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6354", + "name": "Villager robe", + "tradeable": "true", + "grand_exchange_price": "1416", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6355", + "name": "Villager hat", + "examine": "A brightly coloured hat prized by the Tai Bwo Wannai peoples.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "2785", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6356", + "name": "Villager hat", + "tradeable": "true", + "grand_exchange_price": "2785", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6357", + "name": "Villager sandals", + "examine": "A brightly coloured pair of local sandals.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "grand_exchange_price": "944", + "equipment_slot": "10", + "weight": "0.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6358", + "name": "Villager sandals", + "tradeable": "true", + "grand_exchange_price": "944", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6359", + "name": "Villager armband", + "examine": "A <colour> armband, as worn by the Tai Bwo Wannai locals.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "150", + "grand_exchange_price": "672", + "equipment_slot": "9", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6360", + "name": "Villager armband", + "tradeable": "true", + "grand_exchange_price": "672", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6361", + "name": "Tribal top", + "examine": "Local dress.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "2484", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6362", + "name": "Tribal top", + "tradeable": "true", + "grand_exchange_price": "2484", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6363", + "name": "Villager robe", + "examine": "A brightly coloured robe prized by the Tai Bwo Wannai peoples.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "250", + "grand_exchange_price": "499", + "equipment_slot": "7", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6364", + "name": "Villager robe", + "tradeable": "true", + "grand_exchange_price": "499", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6365", + "name": "Villager hat", + "examine": "A brightly coloured hat prized by the Tai Bwo Wannai peoples.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "2440", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6366", + "name": "Villager hat", + "tradeable": "true", + "grand_exchange_price": "2440", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6367", + "name": "Villager sandals", + "examine": "A brightly coloured pair of local sandals.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "grand_exchange_price": "1479", + "equipment_slot": "10", + "weight": "0.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6368", + "name": "Villager sandals", + "tradeable": "true", + "grand_exchange_price": "1479", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6369", + "name": "Villager armband", + "examine": "A <colour> armband, as worn by the Tai Bwo Wannai locals.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "150", + "grand_exchange_price": "823", + "equipment_slot": "9", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6370", + "name": "Villager armband", + "tradeable": "true", + "grand_exchange_price": "823", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6371", + "name": "Tribal top", + "examine": "Local dress.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "2683", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6372", + "name": "Tribal top", + "tradeable": "true", + "grand_exchange_price": "2683", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6373", + "name": "Villager robe", + "examine": "A brightly coloured robe prized by the Tai Bwo Wannai peoples.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "250", + "grand_exchange_price": "331", + "equipment_slot": "7", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6374", + "name": "Villager robe", + "tradeable": "true", + "grand_exchange_price": "331", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6375", + "name": "Villager hat", + "examine": "A brightly coloured hat prized by the Tai Bwo Wannai peoples.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "3010", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6376", + "name": "Villager hat", + "tradeable": "true", + "grand_exchange_price": "3010", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6377", + "name": "Villager sandals", + "examine": "A brightly coloured pair of local sandals.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "grand_exchange_price": "2310", + "equipment_slot": "10", + "weight": "0.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6378", + "name": "Villager sandals", + "tradeable": "true", + "grand_exchange_price": "2310", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6379", + "name": "Villager armband", + "examine": "A <colour> armband, as worn by the Tai Bwo Wannai locals.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "150", + "grand_exchange_price": "1697", + "equipment_slot": "9", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6380", + "name": "Villager armband", + "tradeable": "true", + "grand_exchange_price": "1697", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6382", + "name": "Fez", + "examine": "A fez hat. Juss like that.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "24", + "grand_exchange_price": "690", + "equipment_slot": "0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6383", + "name": "Fez", + "tradeable": "true", + "grand_exchange_price": "690", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6384", + "name": "Desert top", + "examine": "A bit itchy.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "15", + "grand_exchange_price": "649", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6385", + "name": "Desert top", + "tradeable": "true", + "grand_exchange_price": "649", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6386", + "name": "Desert robes", + "examine": "Has a coarse hard wearing texture.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "25", + "grand_exchange_price": "533", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6387", + "name": "Desert robes", + "tradeable": "true", + "grand_exchange_price": "533", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6388", + "name": "Desert top", + "examine": "A bit itchy.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "15", + "grand_exchange_price": "1016", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6389", + "name": "Desert top", + "tradeable": "true", + "grand_exchange_price": "1016", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6390", + "name": "Desert legs", + "examine": "Better than factor 50 sun cream.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "25", + "grand_exchange_price": "515", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6391", + "name": "Desert legs", + "tradeable": "true", + "grand_exchange_price": "515", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6392", + "name": "Menap headgear", + "examine": "Good for keeping the sun off my neck.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "35", + "grand_exchange_price": "531", + "remove_head": "true", + "equipment_slot": "0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6393", + "name": "Menap headgear", + "tradeable": "true", + "grand_exchange_price": "531", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6394", + "name": "Menaphite top", + "examine": "Colourful.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "650", + "remove_sleeves": "true", + "equipment_slot": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6395", + "name": "Menaphite top", + "tradeable": "true", + "grand_exchange_price": "650", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6396", + "name": "Menaphite robe", + "examine": "A cool light Menaphite robe.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "40", + "grand_exchange_price": "440", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6397", + "name": "Menaphite robe", + "tradeable": "true", + "grand_exchange_price": "440", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6398", + "name": "Menap action kilt", + "examine": "Look at those nobbily knees.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "246", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6399", + "name": "Menap action kilt", + "tradeable": "true", + "grand_exchange_price": "246", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6400", + "name": "Menap headgear", + "examine": "Good for keeping the sun off my neck.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "35", + "grand_exchange_price": "484", + "remove_head": "true", + "equipment_slot": "0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6401", + "name": "Menap headgear", + "tradeable": "true", + "grand_exchange_price": "484", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6402", + "name": "Menaphite top", + "examine": "Colourful.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "557", + "remove_sleeves": "true", + "equipment_slot": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6403", + "name": "Menaphite top", + "tradeable": "true", + "grand_exchange_price": "557", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6404", + "name": "Menaphite robe", + "examine": "A cool light Menaphite robe.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "40", + "grand_exchange_price": "449", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6405", + "name": "Menaphite robe", + "tradeable": "true", + "grand_exchange_price": "449", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6406", + "name": "Menap action kilt", + "examine": "Look at those nobbily knees.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "236", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6407", + "name": "Menap action kilt", + "tradeable": "true", + "grand_exchange_price": "236", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6408", + "name": "Oak blackjack(o)", + "examine": "An offensive blackjack.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "shop_price": "400", + "grand_exchange_price": "852", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,4,0,0,0,0,0,0,0,0,4,0,0,0", + "weapon_interface": "10", + "requirements": "{17,10}-{0,10}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6409", + "name": "Oak blackjack(o)", + "tradeable": "true", + "grand_exchange_price": "852", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6410", + "name": "Oak blackjack(d)", + "examine": "An defensive blackjack.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "818", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,0,4,0,0,0,4,0,0,0", + "weapon_interface": "10", + "requirements": "{17,10}-{1,10}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6411", + "name": "Oak blackjack(d)", + "tradeable": "true", + "grand_exchange_price": "818", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6412", + "name": "Willow blackjack(o)", + "examine": "An offensive blackjack.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "1418", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,8,0,0,0,0,0,0,0,0,8,0,0,0", + "weapon_interface": "10", + "requirements": "{17,20}-{0,20}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6413", + "name": "Willow blackjack(o)", + "tradeable": "true", + "grand_exchange_price": "1418", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6414", + "name": "Willow blackjack(d)", + "examine": "A defensive blackjack.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "1285", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,0,8,0,0,0,8,0,0,0", + "weapon_interface": "10", + "requirements": "{17,20}-{1,20}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6415", + "name": "Willow blackjack(d)", + "tradeable": "true", + "grand_exchange_price": "1285", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6416", + "name": "Maple blackjack", + "examine": "A solid bit of maple.", + "tradeable": "true", + "low_alchemy": "480", + "high_alchemy": "720", + "shop_price": "1200", + "grand_exchange_price": "1432", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,20,0,0,0", + "weapon_interface": "10", + "requirements": "{17,30}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6417", + "name": "Maple blackjack", + "tradeable": "true", + "grand_exchange_price": "1432", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6418", + "name": "Maple blackjack(o)", + "examine": "An offensive blackjack.", + "tradeable": "true", + "low_alchemy": "640", + "high_alchemy": "960", + "shop_price": "1600", + "grand_exchange_price": "2079", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,24,0,0,0,0,0,0,0,0,20,0,0,0", + "weapon_interface": "10", + "requirements": "{17,30}-{0,30}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6419", + "name": "Maple blackjack(o)", + "tradeable": "true", + "grand_exchange_price": "2079", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6420", + "name": "Maple blackjack(d)", + "examine": "A defensive blackjack.", + "tradeable": "true", + "low_alchemy": "640", + "high_alchemy": "960", + "shop_price": "952", + "grand_exchange_price": "2407", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,0,24,0,0,0,20,0,0,0", + "weapon_interface": "10", + "requirements": "{17,30}-{1,30}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6421", + "name": "Maple blackjack(d)", + "tradeable": "true", + "grand_exchange_price": "2407", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6422", + "name": "Air rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6423", + "name": "Air rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6424", + "name": "Water rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6425", + "name": "Water rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6426", + "name": "Earth rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6427", + "name": "Earth rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6428", + "name": "Fire rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "16", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6429", + "name": "Fire rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6430", + "name": "Chaos rune", + "examine": "Used for small missile spells.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "28", + "shop_price": "140", + "grand_exchange_price": "65", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6431", + "name": "Chaos rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6432", + "name": "Death rune", + "examine": "Used for medium missile spells.", + "tradeable": "true", + "low_alchemy": "41", + "high_alchemy": "62", + "shop_price": "310", + "grand_exchange_price": "399", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6433", + "name": "Death rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6434", + "name": "Law rune", + "examine": "Used for teleport spells.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "shop_price": "378", + "grand_exchange_price": "277", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6435", + "name": "Law rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6436", + "name": "Mind rune", + "examine": "Used for basic missile spells.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6437", + "name": "Mind rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6438", + "name": "Body rune", + "examine": "Used for Curse spells", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "16", + "grand_exchange_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6439", + "name": "Body rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6448", + "name": "Spadeful of coke", + "examine": "A spadeful of refined coal.", + "high_alchemy": "1", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6453", + "name": "White rose seed", + "examine": "A white rosebush seed.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "28.928", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6454", + "name": "Red rose seed", + "examine": "A red rosebush seed.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6455", + "name": "Pink rose seed", + "examine": "A pink rosebush seed.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6456", + "name": "Vine seed", + "examine": "A grapevine seed.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get some more Burthorpe vine seeds from Berald in Taverly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6457", + "name": "Delphinium seed", + "examine": "A delphinium seed.", + "low_alchemy": "1", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6460", + "name": "Snowdrop seed", + "examine": "A snowdrop seed.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6461", + "name": "White tree shoot", + "examine": "Shoot: A shoot that has been cut from a dying White Tree.Plant pot: A young White Tree sapling.Plant pot after watering: This shoot from a White Tree has been watered and will soon grow.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6462", + "name": "White tree shoot", + "examine": "Shoot: A shoot that has been cut from a dying White Tree.Plant pot: A young White Tree sapling.Plant pot after watering: This shoot from a White Tree has been watered and will soon grow.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6463", + "name": "White tree shoot", + "examine": "Shoot: A shoot that has been cut from a dying White Tree.Plant pot: A young White Tree sapling.Plant pot after watering: This shoot from a White Tree has been watered and will soon grow.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6464", + "name": "White tree sapling", + "examine": "A young White Tree sapling", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6465", + "name": "Ring of charos(a)", + "examine": "Unactivated: The Ring of charos.Activated: The power within this ring has been activated.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Another can be received from pickpocketing Dr. Fenkenstrain in the tower.", + "equipment_slot": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6466", + "name": "Rune shards", + "examine": "A rune essence chip that has been broken into shards.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6467", + "name": "Rune dust", + "examine": "Crushed rune essence.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6468", + "name": "Plant cure", + "examine": "Use this on plants to cure disease.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "25", + "grand_exchange_price": "199", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6469", + "name": "White tree fruit", + "examine": "Looks delicious.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6470", + "name": "Compost potion(4)", + "examine": "Pour this onto compost to make it into super-compost.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "grand_exchange_price": "11500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6471", + "name": "Compost potion(4)", + "tradeable": "true", + "grand_exchange_price": "11500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6472", + "name": "Compost potion(3)", + "examine": "Pour this onto compost to make it into super-compost.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "grand_exchange_price": "6804", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6473", + "name": "Compost potion(3)", + "tradeable": "true", + "grand_exchange_price": "6804", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6474", + "name": "Compost potion(2)", + "examine": "Pour this onto compost to make it into super-compost.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "grand_exchange_price": "3338", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6475", + "name": "Compost potion(2)", + "tradeable": "true", + "grand_exchange_price": "3338", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6476", + "name": "Compost potion(1)", + "examine": "Pour this onto compost to make it into super-compost.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "grand_exchange_price": "1734", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6477", + "name": "Compost potion(1)", + "tradeable": "true", + "grand_exchange_price": "1734", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6478", + "name": "Trolley", + "examine": "I can use this to move heavy objects. (or) An empty trolley.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another one from Queen Ellamaria", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6479", + "name": "List", + "examine": "A list of things that I must collect for Queen Ellamaria.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another list from Queen Ellamaria in Varrock", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6522", + "name": "Toktz-xil-ul", + "examine": "A razor sharp ring of obsidian.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "375", + "grand_exchange_price": "340", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,69,0,0,0,0,0,0,0,0,0,49", + "weapon_interface": "18", + "attack_anims": "2614,2614,2614,2614", + "defence_anim": "424", + "requirements": "{4,60}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6523", + "name": "Toktz-xil-ak", + "examine": "A razor sharp sword of obsidian.", + "tradeable": "true", + "low_alchemy": "16000", + "high_alchemy": "24000", + "shop_price": "60000", + "grand_exchange_price": "30200", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "47,38,-2,0,0,2,3,0,0,0,0,49,0,0,0", + "weapon_interface": "5", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "1.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6524", + "name": "Toktz-ket-xil", + "examine": "A spiked shield of Obsidian.", + "tradeable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "shop_price": "67500", + "grand_exchange_price": "34700", + "equipment_slot": "5", + "absorb": "5,0,11", + "bonuses": "0,0,0,-12,-8,40,42,38,0,65,60,5,0,0,0", + "requirements": "{1,60}", + "weight": "3.6", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6525", + "name": "Toktz-xil-ek", + "examine": "A large knife of Obsidian.", + "tradeable": "true", + "low_alchemy": "10000", + "high_alchemy": "15000", + "shop_price": "37500", + "grand_exchange_price": "16900", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "16,48,0,0,0,0,0,0,0,0,0,39,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "0.4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6526", + "name": "Toktz-mej-tal", + "examine": "A staff of obsidian.", + "tradeable": "true", + "low_alchemy": "14000", + "high_alchemy": "21000", + "shop_price": "52500", + "grand_exchange_price": "26300", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "15,-1,55,15,0,10,15,5,15,0,0,55,5,0,0", + "weapon_interface": "1", + "two_handed": "true", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,60}-{6,60}", + "weight": "1", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6527", + "name": "Tzhaar-ket-em", + "examine": "A mace of obsidian.", + "tradeable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "shop_price": "45000", + "grand_exchange_price": "22600", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-4,-4,62,0,0,0,0,0,0,0,0,56,0,0,0", + "weapon_interface": "10", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "1.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6528", + "name": "Tzhaar-ket-om", + "examine": "A maul of obsidian.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "75000", + "grand_exchange_price": "31000", + "stand_anim": "1662", + "stand_turn_anim": "823", + "walk_anim": "1663", + "run_anim": "1664", + "turn180_anim": "1663", + "turn90cw_anim": "1663", + "turn90ccw_anim": "1663", + "render_anim": "27", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "0,0,80,-4,0,0,0,0,0,0,0,85,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "attack_anims": "2661,2661,2661,2661", + "defence_anim": "1666", + "attack_audios": "2520,0,0,0", + "requirements": "{2,60}", + "weight": "3.6", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6529", + "name": "Tokkul", + "examine": "It's a Token of some kind made from Obsidian.", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6535", + "name": "Toktz-xil-ak", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6536", + "name": "Toktz-ket-xil", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6537", + "name": "Toktz-xil-ek", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6538", + "name": "Toktz-mej-tal", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6539", + "name": "Tzhaar-ket-em", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6540", + "name": "Tzhaar-ket-om", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6541", + "name": "Mouse toy", + "examine": "An Advanced Combat Training Device.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get a replacement mouse toy by speaking to Bob, the Jagex cat.", + "equipment_slot": "3", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6542", + "name": "Present", + "examine": "Thanks for all your help! Love, Bob & Neite.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will not get a replacement for the present. Open it for your reward.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6543", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6544", + "name": "Catspeak amulet(e)", + "examine": "It's an amulet of cat speak. It makes vague purring noises.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Amulet of Catspeak from the Sphinx in Sophanem.", + "equipment_slot": "2", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6545", + "name": "Chores", + "examine": "A list of chores that Bob gave you to do.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You have completed the chores; you can safely destroy the list.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6546", + "name": "Recipe", + "examine": "It says on the back 'My favourite recipe.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You found the recipe in Unferth's bookcase, which is in his Burthorpe house, you will be able to get a replacement.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6547", + "name": "Doctors hat", + "examine": "A mirror helps reflect light on the subject.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Doctor's hat from the Apothecary in Varrock.", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6548", + "name": "Nurse hat", + "examine": "A nurse's hat, but does it have healing powers?", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Nurse's hat from the Apothecary in Varrock.", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6549", + "name": "Lazy cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6550", + "name": "Lazy cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6551", + "name": "Lazy cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6552", + "name": "Lazy cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6553", + "name": "Lazy cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6554", + "name": "Lazy cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6555", + "name": "Wily cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6556", + "name": "Wily cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6557", + "name": "Wily cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6558", + "name": "Wily cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6559", + "name": "Wily cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6560", + "name": "Wily cat", + "examine": "Inventory: Wild. (wily)Lethargic. (lazy)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6562", + "name": "Mud battlestaff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "6800", + "high_alchemy": "10200", + "grand_exchange_price": "368700", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "requirements": "{0,30}-{6,30}", + "weight": "2.2", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6563", + "name": "Mystic mud staff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "shop_price": "40000", + "grand_exchange_price": "423100", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "requirements": "{0,40}-{6,40}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6564", + "name": "Onyx ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "80400", + "high_alchemy": "120600", + "grand_exchange_price": "6609743", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6565", + "name": "Onyx necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "80400", + "high_alchemy": "120600", + "grand_exchange_price": "4501000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6566", + "name": "Onyx amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "80800", + "high_alchemy": "121200", + "grand_exchange_price": "9058124", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6568", + "name": "Obsidian cape", + "examine": "A cape woven of obsidian plates.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24000", + "high_alchemy": "36000", + "shop_price": "90000", + "grand_exchange_price": "42000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6569", + "name": "Obsidian cape", + "tradeable": "true", + "grand_exchange_price": "42000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6570", + "name": "Fire cape", + "examine": "A cape of fire.", + "tradeable": "false", + "low_alchemy": "24000", + "high_alchemy": "36000", + "equipment_slot": "1", + "bonuses": "1,1,1,1,1,11,11,11,11,11,11,4,2,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6571", + "name": "Uncut onyx", + "examine": "An uncut onyx.", + "tradeable": "true", + "low_alchemy": "120000", + "high_alchemy": "180000", + "shop_price": "2700000", + "grand_exchange_price": "10700000", + "ge_buy_limit": "100", + "tokkul_price": "300000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6572", + "name": "Uncut onyx", + "tradeable": "true", + "grand_exchange_price": "10700000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6573", + "name": "Onyx", + "examine": "This looks valuable.", + "tradeable": "true", + "low_alchemy": "120000", + "high_alchemy": "180000", + "grand_exchange_price": "10700000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6574", + "name": "Onyx", + "tradeable": "true", + "grand_exchange_price": "10700000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6575", + "name": "Onyx ring", + "examine": "A valuable ring.", + "tradeable": "true", + "low_alchemy": "80400", + "high_alchemy": "120600", + "grand_exchange_price": "11900000", + "equipment_slot": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6576", + "name": "Onyx ring", + "tradeable": "true", + "grand_exchange_price": "11900000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6577", + "name": "Onyx necklace", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "80400", + "high_alchemy": "120600", + "grand_exchange_price": "4500000", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6578", + "name": "Onyx necklace", + "tradeable": "true", + "grand_exchange_price": "4500000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6579", + "name": "Onyx amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "80800", + "high_alchemy": "121200", + "grand_exchange_price": "9058124", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6580", + "name": "Onyx amulet", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6581", + "name": "Onyx amulet", + "examine": "I wonder if I can get this enchanted.", + "tradeable": "true", + "low_alchemy": "80800", + "high_alchemy": "121200", + "grand_exchange_price": "10900000", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6582", + "name": "Onyx amulet", + "tradeable": "true", + "grand_exchange_price": "10900000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6583", + "name": "Ring of stone", + "examine": "An enchanted ring.", + "tradeable": "true", + "low_alchemy": "80800", + "high_alchemy": "121200", + "grand_exchange_price": "803700", + "equipment_slot": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6584", + "name": "Ring of stone", + "tradeable": "true", + "grand_exchange_price": "803700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6585", + "name": "Amulet of fury", + "examine": "A very powerful onyx amulet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80800", + "high_alchemy": "121200", + "grand_exchange_price": "9200000", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,15,15,15,15,15,15,8,5,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6586", + "name": "Amulet of fury", + "tradeable": "true", + "grand_exchange_price": "9200000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6587", + "name": "White claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "low_alchemy": "144", + "high_alchemy": "216", + "shop_price": "360", + "grand_exchange_price": "1013", + "render_anim": "2583", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,14,-4,0,0,4,7,2,0,0,0,14,1,0,0", + "weapon_interface": "9", + "two_handed": "true", + "attack_anims": "390,390,390,390", + "defence_anim": "397", + "requirements": "{0,10}-{5,10}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6588", + "name": "White claws", + "tradeable": "true", + "grand_exchange_price": "1013", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6589", + "name": "White battleaxe", + "examine": "A vicious looking axe.", + "tradeable": "true", + "low_alchemy": "499", + "high_alchemy": "748", + "shop_price": "1248", + "grand_exchange_price": "1459", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,20,15,0,0,0,0,0,0,-1,0,24,1,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "requirements": "{0,10}-{5,10}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6590", + "name": "White battleaxe", + "tradeable": "true", + "grand_exchange_price": "1459", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6591", + "name": "White dagger", + "examine": "A vicious white dagger.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "shop_price": "240", + "grand_exchange_price": "479", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,1,0,0", + "weapon_interface": "5", + "attack_anims": "400,400,400,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,10}-{5,10}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6592", + "name": "White dagger", + "tradeable": "true", + "grand_exchange_price": "479", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6593", + "name": "White dagger(p)", + "examine": "A vicious white dagger.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "shop_price": "240", + "grand_exchange_price": "497", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,1,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,10}-{5,10}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6594", + "name": "White dagger(p)", + "tradeable": "true", + "grand_exchange_price": "497", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6595", + "name": "White dagger(p+)", + "examine": "A vicious white dagger.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "shop_price": "240", + "grand_exchange_price": "982", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,1,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,10}-{5,10}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6596", + "name": "White dagger(p+)", + "tradeable": "true", + "grand_exchange_price": "982", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6597", + "name": "White dagger(p++)", + "examine": "A vicious white dagger.", + "tradeable": "true", + "low_alchemy": "96", + "high_alchemy": "144", + "shop_price": "240", + "grand_exchange_price": "8422", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "10,5,-4,1,0,0,0,0,1,0,0,7,1,0,0", + "weapon_interface": "5", + "attack_audios": "2517,2517,2500,2517", + "requirements": "{0,10}-{5,10}", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6598", + "name": "White dagger(p++)", + "tradeable": "true", + "grand_exchange_price": "8422", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6599", + "name": "White halberd", + "examine": "A white halberd.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "1920", + "grand_exchange_price": "1834", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "19,25,0,-4,0,-1,2,3,0,0,0,20,1,0,0", + "weapon_interface": "15", + "two_handed": "true", + "attack_anims": "440,440,412,440", + "defence_anim": "430", + "requirements": "{0,10}-{5,10}", + "weight": "3.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6600", + "name": "White halberd", + "tradeable": "true", + "grand_exchange_price": "1834", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6601", + "name": "White mace", + "examine": "A spiky mace.", + "tradeable": "true", + "low_alchemy": "172", + "high_alchemy": "259", + "shop_price": "432", + "grand_exchange_price": "481", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,-2,16,0,0,0,0,0,0,0,0,13,3,0,0", + "weapon_interface": "8", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,10}-{5,10}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6602", + "name": "White mace", + "tradeable": "true", + "grand_exchange_price": "481", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6603", + "name": "White magic staff", + "examine": "A Magical staff.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "650", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "2,-1,10,10,0,2,3,1,10,0,0,7,1,0,0", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "requirements": "{0,10}-{5,10}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6604", + "name": "White magic staff", + "tradeable": "true", + "grand_exchange_price": "650", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6605", + "name": "White sword", + "examine": "A razor sharp sword.", + "tradeable": "true", + "low_alchemy": "249", + "high_alchemy": "374", + "shop_price": "624", + "grand_exchange_price": "1187", + "stand_anim": "813", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "14,10,-2,0,0,0,2,1,0,0,0,12,1,0,0", + "weapon_interface": "5", + "attack_anims": "381,390,390,390", + "defence_anim": "397", + "requirements": "{0,10}-{5,10}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6606", + "name": "White sword", + "tradeable": "true", + "grand_exchange_price": "1187", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6607", + "name": "White longsword", + "examine": "A razor sharp longsword.", + "tradeable": "true", + "low_alchemy": "384", + "high_alchemy": "576", + "shop_price": "960", + "grand_exchange_price": "2060", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "13,18,-2,0,0,0,3,2,0,0,0,16,1,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,10}-{5,10}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6608", + "name": "White longsword", + "tradeable": "true", + "grand_exchange_price": "2060", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6609", + "name": "White 2h sword", + "examine": "A two handed sword.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "1920", + "grand_exchange_price": "4029", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,27,21,-4,0,0,0,0,0,-1,0,26,1,0,0", + "weapon_interface": "7", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "2503,0,2504,0", + "requirements": "{0,10}-{5,10}", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6610", + "name": "White 2h sword", + "tradeable": "true", + "grand_exchange_price": "4029", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6611", + "name": "White scimitar", + "examine": "A vicious, curved sword.", + "tradeable": "true", + "low_alchemy": "307", + "high_alchemy": "460", + "shop_price": "768", + "grand_exchange_price": "1404", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,19,-2,0,0,0,1,0,0,0,0,14,1,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "requirements": "{0,10}-{5,10}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6612", + "name": "White scimitar", + "tradeable": "true", + "grand_exchange_price": "1404", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6613", + "name": "White warhammer", + "examine": "I don't think it's intended for joinery.", + "tradeable": "true", + "low_alchemy": "392", + "high_alchemy": "588", + "shop_price": "980", + "grand_exchange_price": "1178", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,22,-4,0,0,0,0,0,0,0,19,1,0,0", + "weapon_interface": "10", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "attack_audios": "2504,0,0,0", + "requirements": "{0,10}-{5,10}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6614", + "name": "White warhammer", + "tradeable": "true", + "grand_exchange_price": "1178", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6615", + "name": "White chainbody", + "examine": "A series of connected metal rings.", + "tradeable": "true", + "low_alchemy": "576", + "high_alchemy": "864", + "shop_price": "1440", + "grand_exchange_price": "788", + "equipment_slot": "4", + "absorb": "1,0,2", + "bonuses": "0,0,0,-15,0,22,32,39,-3,24,10,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "6.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6616", + "name": "White chainbody", + "tradeable": "true", + "grand_exchange_price": "788", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6617", + "name": "White platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "low_alchemy": "1536", + "high_alchemy": "2304", + "shop_price": "3840", + "grand_exchange_price": "5837", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,2", + "bonuses": "0,0,0,-30,-10,41,40,30,-6,40,10,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "9.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6618", + "name": "White platebody", + "tradeable": "true", + "grand_exchange_price": "5837", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6619", + "name": "White boots", + "examine": "These will protect my feet.", + "tradeable": "true", + "low_alchemy": "230", + "high_alchemy": "345", + "shop_price": "576", + "grand_exchange_price": "1016", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,7,8,9,0,0,7,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6620", + "name": "White boots", + "tradeable": "true", + "grand_exchange_price": "1016", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6621", + "name": "White med helm", + "examine": "A medium sized helmet.", + "tradeable": "true", + "low_alchemy": "230", + "high_alchemy": "345", + "shop_price": "576", + "grand_exchange_price": "853", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,4,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "1.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6622", + "name": "White med helm", + "tradeable": "true", + "grand_exchange_price": "853", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6623", + "name": "White full helm", + "examine": "A full face helmet.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "shop_price": "1056", + "grand_exchange_price": "2624", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,4,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "2.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6624", + "name": "White full helm", + "tradeable": "true", + "grand_exchange_price": "2624", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6625", + "name": "White platelegs", + "examine": "Big, white and heavy looking.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "1920", + "grand_exchange_price": "2115", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,21,20,19,-4,20,3,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6626", + "name": "White platelegs", + "tradeable": "true", + "grand_exchange_price": "2115", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6627", + "name": "White plateskirt", + "examine": "Big, white, and heavy looking.", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "1920", + "grand_exchange_price": "2000", + "equipment_slot": "7", + "bonuses": "0,0,0,-21,-7,21,20,19,-4,20,3,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "8.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6628", + "name": "White plateskirt", + "tradeable": "true", + "grand_exchange_price": "2000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6629", + "name": "White gloves", + "examine": "These will keep my hands warm!", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "2036", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6630", + "name": "White gloves", + "tradeable": "true", + "grand_exchange_price": "2036", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6631", + "name": "White sq shield", + "examine": "A medium square shield.", + "tradeable": "true", + "low_alchemy": "460", + "high_alchemy": "691", + "shop_price": "1152", + "grand_exchange_price": "1360", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,15,16,14,0,15,9,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6632", + "name": "White sq shield", + "tradeable": "true", + "grand_exchange_price": "1360", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6633", + "name": "White kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "shop_price": "1632", + "grand_exchange_price": "2390", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,1,0,0", + "requirements": "{1,10}-{5,10}", + "weight": "5.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6634", + "name": "White kiteshield", + "tradeable": "true", + "grand_exchange_price": "2390", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6635", + "name": "Commorb", + "examine": "A Temple Knight Communication Orb. Top Secret! / Use this to stay in touch with Korasi and Jessika. (A Void Dance version) / Tyr's commorb, given to him by Sir Tiffy. (Tyr's commorb)", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6636", + "name": "Solus's hat", + "examine": "Proof that I have defeated the evil mage Solus.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6637", + "name": "Dark beast", + "examine": "From a darker dimension.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6638", + "name": "Colour wheel", + "examine": "A key to the nature of light itself. (Mourning's Ends Part II)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6639", + "name": "Hand mirror", + "examine": "A small hand mirror.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Resetting the light maze will generate a new mirror.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6641", + "name": "Yellow crystal", + "examine": "A yellow crystal.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Resetting the light maze will generate a new crystal.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6643", + "name": "Cyan crystal", + "examine": "A cyan crystal.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Resetting the light maze will generate a new crystal.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6644", + "name": "Blue crystal", + "examine": "A blue crystal.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Resetting the light maze will generate a new crystal.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6646", + "name": "Fractured crystal", + "examine": "A fractured crystal, one of the edges is clear.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Resetting the light maze will generate a new crystal.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6647", + "name": "Fractured crystal", + "examine": "A fractured crystal, one of the edges is clear.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Resetting the light maze will generate a new crystal.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6648", + "name": "Item list", + "examine": "It's a list of items I need to collect.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another list from Thorgel.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6649", + "name": "Edern's journal", + "examine": "The journal of Nissyen Edern.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6650", + "name": "Blackened crystal", + "examine": "A blackened crystal sample.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6651", + "name": "Newly made crystal", + "examine": "A newly formed crystal / A warm energy radiates from this crystal.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6652", + "name": "Newly made crystal", + "examine": "A newly formed crystal / A warm energy radiates from this crystal.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6653", + "name": "Crystal trinket", + "examine": "A small Crystal trinket.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Crystal trinket from Arianwyn in Lletya.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6654", + "name": "Camo top", + "examine": "Examine what?", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6655", + "name": "Camo bottoms", + "examine": "Examine what?", + "equipment_slot": "7", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6656", + "name": "Camo helmet", + "examine": "Examine what?", + "equipment_slot": "0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6657", + "name": "Camo top", + "examine": "Examine what?", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6658", + "name": "Camo bottoms", + "examine": "Examine what?", + "equipment_slot": "7", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6659", + "name": "Camo helmet", + "examine": "Examine what?", + "equipment_slot": "0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6660", + "name": "Fishing explosive", + "examine": "The jar keeps shaking... I'm scared.", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "60", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6661", + "name": "Mogre", + "examine": "An angry Ogre in a funny hat.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6662", + "name": "Broken fishing rod", + "examine": "This fishing rod seems to have been bitten in half.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6663", + "name": "Forlorn boot", + "examine": "It seems someone vacated this boot in a hurry.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6664", + "name": "Fishing explosive", + "examine": "The jar keeps shaking... I'm scared.", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "60", + "requirements": "{18,32}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6665", + "name": "Mudskipper hat", + "examine": "Fishy, damp and smelly.", + "equipment_slot": "0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6666", + "name": "Flippers", + "examine": "Strangely uncomfortable flippers.", + "equipment_slot": "10", + "bonuses": "-2,-2,-2,0,0,0,1,1,0,0,0,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6667", + "name": "Fishbowl", + "examine": "An empty fishbowl.", + "tradeable": "true", + "grand_exchange_price": "431", + "weight": "1.3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6668", + "name": "Fishbowl", + "examine": "A fishless fishbowl.", + "tradeable": "true", + "grand_exchange_price": "619", + "weight": "2.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6669", + "name": "Fishbowl", + "examine": "A fishless fishbowl with some seaweed.", + "tradeable": "true", + "grand_exchange_price": "619", + "weight": "2.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6670", + "name": "Fishbowl", + "examine": "A fishbowl with a Tiny Bluefish in it.", + "tradeable": "true", + "grand_exchange_price": "619", + "weight": "2.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6671", + "name": "Fishbowl", + "examine": "A fishbowl with a Tiny Greenfish in it.", + "tradeable": "true", + "grand_exchange_price": "619", + "weight": "2.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6672", + "name": "Fishbowl", + "examine": "A fishbowl with a Tiny Spinefish in it.", + "tradeable": "true", + "grand_exchange_price": "619", + "weight": "2.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6673", + "name": "Fishbowl and net", + "examine": "An empty fishbowl in a net.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6674", + "name": "Tiny net", + "examine": "A tiny net for grabbing tiny fish.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "shop_price": "10", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6675", + "name": "An empty box", + "examine": "'Ingredients: Ground Guam and Ground Seaweed.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6677", + "name": "Guam in a box", + "examine": "'Ingredients: Ground Guam and Ground Seaweed.' Well, I have the Guam Leaf...", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6678", + "name": "Guam in a box?", + "examine": "'Ingredients: Ground Guam and Ground Seaweed.' Well, I have the Guam Leaf...", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6679", + "name": "Seaweed in a box", + "examine": "'Ingredients: Ground Guam and Ground Seaweed.' Well, I have the Seaweed...", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6680", + "name": "Seaweed in a box?", + "examine": "'Ingredients: Ground Guam and Ground Seaweed.' Well, I have the Seaweed...", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6681", + "name": "Ground guam", + "examine": "One of the ingredients for making fish food.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6682", + "name": "Ground guam", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6683", + "name": "Ground seaweed", + "examine": "One of the ingredients for making fish food.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6684", + "name": "Ground seaweed", + "tradeable": "true", + "grand_exchange_price": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6685", + "name": "Saradomin brew(4)", + "examine": "A Saradomin Brew.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "121", + "grand_exchange_price": "15300", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6686", + "name": "Saradomin brew(4)", + "tradeable": "true", + "grand_exchange_price": "15300", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6687", + "name": "Saradomin brew(3)", + "examine": "A Saradomin Brew.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "121", + "grand_exchange_price": "11400", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6688", + "name": "Saradomin brew(3)", + "tradeable": "true", + "grand_exchange_price": "11400", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6689", + "name": "Saradomin brew(2)", + "examine": "A Saradomin Brew.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "121", + "grand_exchange_price": "7566", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6690", + "name": "Saradomin brew(2)", + "tradeable": "true", + "grand_exchange_price": "7566", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6691", + "name": "Saradomin brew(1)", + "examine": "A Saradomin Brew.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "121", + "grand_exchange_price": "3783", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6692", + "name": "Saradomin brew(1)", + "tradeable": "true", + "grand_exchange_price": "3783", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6693", + "name": "Crushed nest", + "examine": "It's a crushed bird's nest.", + "tradeable": "true", + "grand_exchange_price": "10500", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6694", + "name": "Crushed nest", + "tradeable": "true", + "grand_exchange_price": "10500", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6695", + "name": "Desert lizard", + "examine": "\"A cold-blooded creature, partial to warmth.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6696", + "name": "Ice cooler", + "examine": "Contains ice-cold water.", + "shop_price": "1", + "requirements": "{22,18}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6697", + "name": "Pat of butter", + "examine": "A pat of freshly churned butter.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "5", + "grand_exchange_price": "405", + "weight": "0.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6698", + "name": "Pat of butter", + "tradeable": "true", + "grand_exchange_price": "405", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6700", + "name": "Burnt potato", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6701", + "name": "Baked potato", + "examine": "It'd taste even better with some toppings.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "326", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6702", + "name": "Baked potato", + "tradeable": "true", + "grand_exchange_price": "326", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6703", + "name": "Potato with butter", + "examine": "A baked potato with butter.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "745", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6704", + "name": "Potato with butter", + "tradeable": "true", + "grand_exchange_price": "745", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6705", + "name": "Potato with cheese", + "examine": "A baked potato with butter and cheese.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "shop_price": "350", + "grand_exchange_price": "604", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6706", + "name": "Potato with cheese", + "tradeable": "true", + "grand_exchange_price": "604", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6707", + "name": "Camulet", + "examine": "An amulet of Camel-speak. It makes vague braying noises.", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6708", + "name": "Slayer gloves", + "examine": "Especially good against diseased arachnids.", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "bonuses": "0,0,0,0,0,4,5,3,0,0,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6709", + "name": "Fever spider", + "examine": "A bunch of legs, eyes and teeth.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6710", + "name": "Blindweed seed", + "examine": "A blindweed seed - plant in a Blindweed patch.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6711", + "name": "Blindweed", + "examine": "An inedible, foul smelling herb.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6712", + "name": "Bucket of water", + "examine": "Common bucket: It's a bucket of water.2008 Easter event: It's a bucket of water from the Easter Bunny's warren. Regular bucket filled from Braindeath Island: It's a bucket of... water?", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "74", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6713", + "name": "Wrench", + "examine": "A heavy metal wrench.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6714", + "name": "Holy wrench", + "examine": "A shining paragon of wrenchly virtue.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6715", + "name": "Sluglings", + "examine": "They look at you balefully. 'Feed us...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6716", + "name": "Karamthulhu", + "examine": "A sinister looking squid.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6717", + "name": "Karamthulhu", + "examine": "A sinister looking squid.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6718", + "name": "Fever spider body", + "examine": "A diseased deceased Fever Spider. Handle with care.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6719", + "name": "Unsanitary swill", + "examine": "Sorry, I mean a bucket of 'rum'.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6720", + "name": "Slayer gloves", + "examine": "Especially good against diseased arachnids.", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,4,5,3,0,0,1,0,0,0,0", + "requirements": "{18,42}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6721", + "name": "Rusty scimitar", + "examine": "A decent enough weapon gone rusty.", + "attack_audios": "2500,0,2517,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6722", + "name": "Zombie head", + "examine": "Alas...I hardly knew him.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6723", + "name": "Fishbowl", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6724", + "name": "Seercull", + "examine": "An ancient Fremennik bow that was once used to battle the Moon Clan.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "grand_exchange_price": "12200", + "render_anim": "2588", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,69,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "requirements": "{4,50}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6725", + "name": "Seercull", + "tradeable": "true", + "grand_exchange_price": "12200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6726", + "name": "Mud battlestaff", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6727", + "name": "Mystic mud staff", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6728", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6729", + "name": "Dagannoth bones", + "examine": "These would feed a dogfish for months!", + "tradeable": "true", + "grand_exchange_price": "9616", + "weight": "1.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6730", + "name": "Dagannoth bones", + "tradeable": "true", + "grand_exchange_price": "9616", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6731", + "name": "Seers ring", + "examine": "A mysterious ring that can fill the wearer with magical power...", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "478800", + "equipment_slot": "12", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,0,0,0", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6732", + "name": "Seers ring", + "tradeable": "true", + "grand_exchange_price": "478800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6733", + "name": "Archers ring", + "examine": "A fabled ring that improves the wearer's skill with a bow...", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "1400000", + "equipment_slot": "12", + "bonuses": "0,0,0,0,4,0,0,0,0,4,0,0,0,0,0", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6734", + "name": "Archers ring", + "tradeable": "true", + "grand_exchange_price": "1400000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6735", + "name": "Warrior ring", + "examine": "A legendary ring once worn by Fremennik warriors.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "178100", + "equipment_slot": "12", + "bonuses": "0,4,0,0,0,0,4,0,0,0,0,0,0,0,0", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6736", + "name": "Warrior ring", + "tradeable": "true", + "grand_exchange_price": "178100", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6737", + "name": "Berserker ring", + "examine": "A ring reputed to bring out a berserk fury in its wearer.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "2700000", + "equipment_slot": "12", + "bonuses": "0,0,0,0,0,0,0,4,0,0,0,4,0,0,0", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6738", + "name": "Berserker ring", + "tradeable": "true", + "grand_exchange_price": "2700000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6739", + "name": "Dragon axe", + "examine": "A very powerful hatchet.", + "tradeable": "true", + "low_alchemy": "22000", + "high_alchemy": "33000", + "grand_exchange_price": "813100", + "render_anim": "2586", + "equipment_slot": "3", + "bonuses": "-2,38,32,0,0,0,1,0,0,0,0,42,0,0,0", + "weapon_interface": "2", + "has_special": "true", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "requirements": "{0,60}-{8,61}", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6740", + "name": "Dragon axe", + "tradeable": "true", + "grand_exchange_price": "813100", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6741", + "name": "Broken axe", + "examine": "Bob can fix this broken (metal) axe for me.", + "low_alchemy": "160", + "high_alchemy": "160", + "equipment_slot": "3", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6742", + "name": "Broken axe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6744", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6745", + "name": "Silverlight", + "examine": "The magical sword 'Silverlight'. / The magical sword 'Silverlight', stained black with mushroom ink. (during Shadow of the Storm)", + "low_alchemy": "20", + "high_alchemy": "30", + "render_anim": "2554", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "9,14,-2,0,0,0,3,2,1,0,0,12,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6746", + "name": "Darklight", + "examine": "The magical sword Silverlight, enhanced with the blood of Agrith-Naar.", + "low_alchemy": "200", + "high_alchemy": "300", + "render_anim": "2554", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,16,-2,0,0,0,3,2,2,0,0,13,0,0,0", + "weapon_interface": "6", + "has_special": "true", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6747", + "name": "Demonic sigil mould", + "examine": "Used to make the sigil of the demon Agrith-Naar.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6748", + "name": "Demonic sigil", + "examine": "A sigil used for the summoning of the demon Agrith-Naar.", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6749", + "name": "Demonic tome", + "examine": "Will this book help in summoning Agrith-Naar?", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6750", + "name": "Black desert shirt", + "examine": "A desert shirt stained black with mushroom ink.", + "low_alchemy": "16", + "high_alchemy": "24", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6752", + "name": "Black desert robe", + "examine": "A desert robe stained black with mushroom ink.", + "low_alchemy": "12", + "high_alchemy": "18", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6754", + "name": "Enchanted key", + "examine": "It changes temperature as I walk. (Meeting History)", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Hopefully Erin has a copy!", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6760", + "name": "Guthix mjolnir", + "examine": "A Guthix Mjolnir.", + "tradeable": "true", + "low_alchemy": "250", + "high_alchemy": "375", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "250", + "grand_exchange_price": "2875", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,11,0,0,0,0,0,0,0,0,14,0,0,0", + "weapon_interface": "3", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6761", + "name": "Guthix mjolnir", + "tradeable": "true", + "grand_exchange_price": "2875", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6762", + "name": "Saradomin mjolnir", + "examine": "A Saradomin Mjolnir.", + "tradeable": "true", + "low_alchemy": "250", + "high_alchemy": "375", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "250", + "grand_exchange_price": "17200", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,11,0,0,0,0,0,0,0,0,14,0,0,0", + "weapon_interface": "3", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6763", + "name": "Saradomin mjolnir", + "tradeable": "true", + "grand_exchange_price": "17200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6764", + "name": "Zamorak mjolnir", + "examine": "A Zamorak mjolnir.", + "tradeable": "true", + "low_alchemy": "250", + "high_alchemy": "375", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "4115", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,11,0,0,0,0,0,0,0,0,14,0,0,0", + "weapon_interface": "3", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6765", + "name": "Zamorak mjolnir", + "tradeable": "true", + "grand_exchange_price": "4115", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6766", + "name": "Cat antipoison", + "examine": "Antipoison for Pox.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6768", + "name": "Poisoned cheese", + "examine": "A little more smelly than usual.", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6769", + "name": "Music scroll", + "examine": "Charming.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another sheet of music by talking to the snakecharmer of Pollnivneach.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6770", + "name": "Directions", + "examine": "Jimmy Dazzler's directions.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another set of directions to the party by talking to Jimmy Dazzler.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6771", + "name": "Pot of weeds", + "examine": "Contains garden weeds.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6772", + "name": "Smouldering pot", + "examine": "Contains slowly burning garden weeds.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6773", + "name": "Rat pole", + "examine": "A pole for putting rats on.", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6774", + "name": "Rat pole", + "examine": "A pole with one rat on it.", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6775", + "name": "Rat pole", + "examine": "A pole with two rats on it.", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6776", + "name": "Rat pole", + "examine": "A pole with three rats on it.", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6777", + "name": "Rat pole", + "examine": "A pole with four rats on it.", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6778", + "name": "Rat pole", + "examine": "A pole with five rats on it.", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6779", + "name": "Rat pole", + "examine": "A pole with six rats on it.", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6780", + "name": "Menaphite thug", + "examine": "Menaphite thug.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6786", + "name": "Robe of elidinis", + "examine": "This looks quite old.", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6787", + "name": "Robe of elidinis", + "examine": "This looks quite old.", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6788", + "name": "Torn robe", + "examine": "This robe is too torn to wear.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6789", + "name": "Torn robe", + "examine": "This robe is too torn to wear.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6790", + "name": "Shoes", + "equipment_slot": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6791", + "name": "Sole", + "examine": "Awusah's Sole.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6792", + "name": "Ancestral key", + "examine": "An ancient key from the shrine in Nardah. (Spirits of the Elid)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6793", + "name": "Ballad", + "examine": "The Ballad of Jaresh.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6794", + "name": "Choc-ice", + "examine": "A tasty treat from Nardah - better eat this before it melts.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "210", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6795", + "name": "Choc-ice", + "tradeable": "true", + "grand_exchange_price": "210", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6796", + "name": "Lamp", + "examine": "Wonder what happens if I rub it...", + "weight": "0.1", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6797", + "name": "Watering can", + "examine": "See article", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "8", + "grand_exchange_price": "206", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6798", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6799", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6800", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6801", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6802", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6803", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6804", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6805", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6806", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6807", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6808", + "name": "Champion scroll", + "examine": "A scroll once used by a champion.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6809", + "name": "Granite legs", + "examine": "These look pretty heavy.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26400", + "high_alchemy": "39600", + "grand_exchange_price": "39400", + "equipment_slot": "7", + "absorb": "2,0,5", + "bonuses": "0,0,0,-31,-18,43,45,41,-4,68,20,0,0,0,0", + "requirements": "{1,50}-{2,50}", + "weight": "15", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6810", + "name": "Bonemeal", + "examine": "A pot of crushed [type of bones].", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6811", + "name": "Skeletal wyvern", + "examine": "A very dangerous pile of animated Wyvern bones.", + "attack_speed": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6812", + "name": "Wyvern bones", + "examine": "Bones of a huge flying creature.", + "tradeable": "true", + "grand_exchange_price": "4845", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6813", + "name": "Granite legs", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6814", + "name": "Fur", + "examine": "This would make warm clothing.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "20", + "grand_exchange_price": "90", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6815", + "name": "Fur", + "tradeable": "true", + "grand_exchange_price": "90", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6816", + "name": "Wyvern bones", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6817", + "name": "Slender blade", + "examine": "A slender two-handed sword.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "two_handed": "true", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6818", + "name": "Bow-sword", + "examine": "A sharp sword that can also fire arrows.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can make a replacement.", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6819", + "name": "Large pouch", + "examine": "A large pouch used for storing essence.", + "low_alchemy": "240", + "high_alchemy": "360", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "25000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6820", + "name": "Relic", + "examine": "It seems to have pieces missing. After Temple at Senntisten quest: The assassin's plunder from the church on Entrana.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can get another from the assassin beside the winch that leads down into Senntisten temple.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6821", + "name": "Orb", + "examine": "This looks valuable.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6822", + "name": "Star bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6823", + "name": "Star bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6824", + "name": "Star bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6825", + "name": "Star bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6826", + "name": "Star bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6827", + "name": "Star bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6828", + "name": "Box bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6829", + "name": "Box bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6830", + "name": "Box bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6831", + "name": "Box bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6832", + "name": "Box bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6833", + "name": "Box bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6834", + "name": "Diamond bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6835", + "name": "Diamond bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6836", + "name": "Diamond bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6837", + "name": "Diamond bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6838", + "name": "Diamond bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6839", + "name": "Diamond bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6840", + "name": "Tree bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6841", + "name": "Tree bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6842", + "name": "Tree bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6843", + "name": "Tree bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6844", + "name": "Tree bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6845", + "name": "Tree bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6846", + "name": "Bell bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6847", + "name": "Bell bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6848", + "name": "Bell bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6849", + "name": "Bell bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6850", + "name": "Bell bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6851", + "name": "Bell bauble", + "examine": "See individual articles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6852", + "name": "Puppet box", + "examine": "A box for storing completed puppets.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6853", + "name": "Bauble box", + "examine": "A box for storing painted baubles.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6854", + "name": "Puppet box", + "examine": "A box for storing completed puppets.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6855", + "name": "Bauble box", + "examine": "A box for storing painted baubles.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6856", + "name": "Bobble hat", + "examine": "A woolly bobble hat.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another hat from Diango in the Draynor Market.", + "equipment_slot": "0", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6857", + "name": "Bobble scarf", + "examine": "A woolly scarf.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "2", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6858", + "name": "Jester hat", + "examine": "A woolly Jester hat.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another hat from Diango in the Draynor Market.", + "shop_price": "160", + "equipment_slot": "0", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6859", + "name": "Jester scarf", + "examine": "A woolly jester scarf.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Jester scarf from Diango.", + "equipment_slot": "2", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6860", + "name": "Tri-jester hat", + "examine": "A woolly triple bobble jester hat.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You may get another from Diango in Draynor Village.", + "equipment_slot": "0", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6861", + "name": "Tri-jester scarf", + "examine": "A woolly jester scarf.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another jester scarf from Diango in the Draynor Market.", + "equipment_slot": "2", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6862", + "name": "Woolly hat", + "examine": "A woolly tobogganing hat.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another hat from Diango in the Draynor Market.", + "equipment_slot": "0", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6863", + "name": "Woolly scarf", + "examine": "A woolly tobogganing scarf.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "2", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6864", + "name": "Marionette handle", + "examine": "The controlling part of a marionette.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6865", + "name": "Blue marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another marionette in Diango's workshop by the trap door.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6866", + "name": "Green marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another marionette in Diango's workshop by the trap door.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6867", + "name": "Red marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another marionette in Diango's workshop by the trap door.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6868", + "name": "Blue marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6869", + "name": "Green marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6870", + "name": "Red marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6871", + "name": "Red marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6872", + "name": "Red marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6873", + "name": "Red marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6874", + "name": "Red marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6875", + "name": "Blue marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6876", + "name": "Blue marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6877", + "name": "Blue marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6878", + "name": "Blue marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6879", + "name": "Green marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6880", + "name": "Green marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6881", + "name": "Green marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6882", + "name": "Green marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6883", + "name": "Peach", + "examine": "A tasty fruit.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6885", + "name": "Progress hat", + "examine": "A magic training arena progress hat", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6886", + "name": "Progress hat", + "examine": "A magic training arena progress hat", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6887", + "name": "Progress hat", + "examine": "A magic training arena progress hat", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6888", + "name": "Guardian statue", + "examine": "A guardian of the arena.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6889", + "name": "Mage's book", + "examine": "The magical book of the Mage.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "3800000", + "equipment_slot": "5", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,0,0", + "requirements": "{6,60}", + "weight": "1", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6890", + "name": "Mage's book", + "tradeable": "true", + "grand_exchange_price": "3800000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6891", + "name": "Arena book", + "examine": "A book about the Training Arena.", + "shop_price": "200", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6893", + "name": "Leather boots", + "examine": "Comfortable leather boots.", + "tradeable": "true", + "shop_price": "6", + "grand_exchange_price": "189", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "weight": "0.3", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6894", + "name": "Adamant kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "grand_exchange_price": "3084", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "weight": "5.8", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6895", + "name": "Adamant med helm", + "examine": "A medium sized helmet.", + "tradeable": "true", + "grand_exchange_price": "1049", + "absorb": "1,0,2", + "bonuses": "0,0,0,-3,-1,14,15,13,-1,14,6,0,0,0,0", + "weight": "1.8", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6896", + "name": "Emerald", + "examine": "This looks valuable.", + "tradeable": "true", + "shop_price": "350", + "grand_exchange_price": "644", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6897", + "name": "Rune longsword", + "examine": "A razor sharp longsword", + "tradeable": "true", + "lendable": "true", + "shop_price": "32000", + "grand_exchange_price": "18938", + "attack_speed": "5", + "bonuses": "38,47,-2,0,0,0,3,2,0,0,0,49,0,0,0", + "attack_audios": "2500,2500,2517,2500", + "weight": "1.8", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6898", + "name": "Cylinder", + "examine": "A green cylinder", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6899", + "name": "Cube", + "examine": "A yellow cube", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6900", + "name": "Icosahedron", + "examine": "A blue icosahedron.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6901", + "name": "Pentamid", + "examine": "A red pentamid.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6902", + "name": "Orb", + "examine": "This looks valuable.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6903", + "name": "Dragonstone", + "examine": "This looks valuable.", + "tradeable": "true", + "weight": "0.3", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6904", + "name": "Animals' bones", + "examine": "Various animals' bones.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6905", + "name": "Animals' bones", + "examine": "Various animals' bones.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6906", + "name": "Animals' bones", + "examine": "Various animals' bones.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6907", + "name": "Animals' bones", + "examine": "Various animals' bones.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6908", + "name": "Beginner wand", + "examine": "A beginner level wand", + "tradeable": "true", + "low_alchemy": "480", + "high_alchemy": "720", + "shop_price": "303030030", + "grand_exchange_price": "11500", + "stand_anim": "809", + "stand_turn_anim": "823", + "walk_anim": "1146", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1426", + "equipment_slot": "3", + "bonuses": "0,0,0,5,0,0,0,0,5,0,0,0,0,0,0", + "weapon_interface": "1", + "requirements": "{6,45}", + "weight": "0.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6909", + "name": "Beginner wand", + "tradeable": "true", + "grand_exchange_price": "11500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6910", + "name": "Apprentice wand", + "examine": "An apprentice level wand.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "606060060", + "grand_exchange_price": "82000", + "stand_anim": "809", + "stand_turn_anim": "823", + "walk_anim": "1146", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1426", + "equipment_slot": "3", + "bonuses": "0,0,0,10,0,0,0,0,10,0,0,0,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "requirements": "{6,50}", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6911", + "name": "Apprentice wand", + "tradeable": "true", + "grand_exchange_price": "82000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6912", + "name": "Teacher wand", + "examine": "A teacher level wand.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "944100", + "stand_anim": "809", + "stand_turn_anim": "823", + "walk_anim": "1146", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1426", + "equipment_slot": "3", + "bonuses": "0,0,0,15,0,0,0,0,15,0,0,0,0,0,0", + "weapon_interface": "1", + "requirements": "{6,55}", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6913", + "name": "Teacher wand", + "tradeable": "true", + "grand_exchange_price": "944100", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6914", + "name": "Master wand", + "examine": "A master level wand.", + "tradeable": "true", + "low_alchemy": "1000", + "high_alchemy": "1500", + "grand_exchange_price": "1700000", + "stand_anim": "8980", + "stand_turn_anim": "823", + "walk_anim": "1146", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1426", + "equipment_slot": "3", + "bonuses": "0,0,0,20,0,0,0,0,20,0,0,0,0,0,0", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "requirements": "{6,60}", + "weight": "0.1", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6915", + "name": "Master wand", + "tradeable": "true", + "grand_exchange_price": "1700000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6916", + "name": "Infinity top", + "examine": "Mystical robes.", + "tradeable": "true", + "low_alchemy": "56000", + "high_alchemy": "84000", + "grand_exchange_price": "3300000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,22,0,0,0,0,22,0,20,0,0,0,0", + "requirements": "{1,50}-{6,25}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6917", + "name": "Infinity top", + "tradeable": "true", + "grand_exchange_price": "3300000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6918", + "name": "Infinity hat", + "examine": "A mystic hat.", + "tradeable": "true", + "low_alchemy": "6800", + "high_alchemy": "10200", + "grand_exchange_price": "1800000", + "equipment_slot": "0", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,0,0,0,6,0,7,0,0,0,0", + "requirements": "{1,50}-{6,25}", + "weight": "0.4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6919", + "name": "Infinity hat", + "tradeable": "true", + "grand_exchange_price": "1800000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6920", + "name": "Infinity boots", + "examine": "Mystical boots.", + "tradeable": "true", + "low_alchemy": "4800", + "high_alchemy": "7200", + "destroy": "true", + "tradeable": "false", + "grand_exchange_price": "1200000", + "equipment_slot": "10", + "bonuses": "0,0,0,5,0,0,0,0,5,0,5,0,0,0,0", + "requirements": "{1,50}-{6,25}", + "weight": "0.4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6921", + "name": "Infinity boots", + "tradeable": "true", + "grand_exchange_price": "1200000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6922", + "name": "Infinity gloves", + "examine": "Mystical gloves.", + "tradeable": "true", + "low_alchemy": "4800", + "high_alchemy": "7200", + "grand_exchange_price": "1900000", + "equipment_slot": "9", + "bonuses": "0,0,0,5,0,0,0,0,5,0,0,0,0,0,0", + "requirements": "{1,50}-{6,25}", + "weight": "0.4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6923", + "name": "Infinity gloves", + "tradeable": "true", + "grand_exchange_price": "1900000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6924", + "name": "Infinity bottoms", + "examine": "Mystical robes.", + "tradeable": "true", + "low_alchemy": "36000", + "high_alchemy": "54000", + "grand_exchange_price": "2500000", + "equipment_slot": "7", + "absorb": "2,1,0", + "bonuses": "0,0,0,17,0,0,0,0,17,0,17,0,0,0,0", + "requirements": "{1,50}-{6,25}", + "weight": "1.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6925", + "name": "Infinity bottoms", + "tradeable": "true", + "grand_exchange_price": "2500000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6926", + "name": "Bones to peaches", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "983", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6945", + "name": "Sandy hand", + "examine": "A severed hand covered with sand.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6946", + "name": "Beer-soaked hand", + "examine": "A severed hand dripping with beer.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to the Guard Captain in Yanille to get another beer soaked hand.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6947", + "name": "Bert's rota", + "examine": "A copy of a work rota.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Bert to replace this Rota.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6948", + "name": "Sandy's rota", + "examine": "An original work rota.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Search Sandy's office in Brimhaven for another Rota.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6949", + "name": "A magic scroll", + "examine": "Maybe I should read this...", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6950", + "name": "Magical orb", + "examine": "An ordinary looking scrying orb.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Zavistic Rarve to replace your magical orb.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6951", + "name": "Magical orb (a)", + "examine": "This magical scrying orb pulsates as it stores information.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Zavistic Rarve to replace your magical orb.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6952", + "name": "Truth serum", + "examine": "Fluid sloshes innocently in this vial.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Betty in Port Sarim to get another bottle of truth serum.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6953", + "name": "Bottled water", + "examine": "A bottle of water.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Betty in Port Sarim to get another bottle.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6954", + "name": "Redberry juice", + "examine": "Redberry juice sloshes around in this vial, waiting for white berries to be added.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Betty in Port Sarim to get another bottle to make some more red berry juice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6955", + "name": "Pink dye", + "examine": "A vial of pink dye.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Betty in Port Sarim to make more pink dye.", + "shop_price": "20", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6956", + "name": "Rose-tinted lens", + "examine": "This lens has a pinkish tinge to it.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Betty in Port Sarim to get another bottle to make the lens again.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6957", + "name": "Wizard's head", + "examine": "A decapitated, sand-covered head.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Mazion near the sandpit on Entrana to find the Wizard Head again.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6958", + "name": "Sand", + "examine": "A handful of sand from Sandy's pocket.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6959", + "name": "Cape", + "examine": "Use pink dye on a cape and this is what you get!", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "tradeable": "false", + "shop_price": "20", + "grand_exchange_price": "919", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6960", + "name": "Cape", + "tradeable": "true", + "grand_exchange_price": "919", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6961", + "name": "Baguette", + "examine": "A freshly baked baguette.", + "low_alchemy": "10", + "high_alchemy": "15", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6962", + "name": "Triangle sandwich", + "examine": "A freshly made triangle sandwich.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "110", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6963", + "name": "Roll", + "examine": "A freshly made roll.", + "low_alchemy": "10", + "high_alchemy": "15", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6964", + "name": "Coins", + "examine": "100,000 or more: \"X x coins\" where X is the exact number of coins in the stack.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6965", + "name": "Square sandwich", + "examine": "A freshly made square sandwich.", + "low_alchemy": "10", + "high_alchemy": "15", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6967", + "name": "Dragon med helm", + "examine": "Makes the wearer pretty intimidating.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "61200", + "absorb": "2,0,4", + "bonuses": "0,0,0,-3,-1,33,35,32,-1,34,10,0,0,0,0", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6968", + "name": "Triangle sandwich", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6969", + "name": "Shark", + "examine": "I'd better be careful eating this.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "694", + "weight": "0.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6970", + "name": "Pyramid top", + "examine": "It's a solid gold pyramid!", + "weight": "11", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6971", + "name": "Sandstone (1kg)", + "examine": "A large chunk of sandstone.", + "tradeable": "true", + "grand_exchange_price": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6972", + "name": "Sandstone (1kg)", + "tradeable": "true", + "grand_exchange_price": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6973", + "name": "Sandstone (2kg)", + "examine": "A large chunk of sandstone.", + "tradeable": "true", + "grand_exchange_price": "27", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6974", + "name": "Sandstone (2kg)", + "tradeable": "true", + "grand_exchange_price": "27", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6975", + "name": "Sandstone (5kg)", + "examine": "A large chunk of sandstone.", + "tradeable": "true", + "grand_exchange_price": "30", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6976", + "name": "Sandstone (5kg)", + "tradeable": "true", + "grand_exchange_price": "30", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6977", + "name": "Sandstone (10kg)", + "examine": "A large chunk of sandstone.", + "tradeable": "true", + "grand_exchange_price": "120", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6978", + "name": "Sandstone (10kg)", + "tradeable": "true", + "grand_exchange_price": "120", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6979", + "name": "Granite (500g)", + "examine": "See article", + "tradeable": "true", + "grand_exchange_price": "304", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6980", + "name": "Granite (500g)", + "tradeable": "true", + "grand_exchange_price": "304", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6981", + "name": "Granite (2kg)", + "examine": "See article", + "tradeable": "true", + "grand_exchange_price": "845", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6982", + "name": "Granite (2kg)", + "tradeable": "true", + "grand_exchange_price": "845", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6983", + "name": "Granite (5kg)", + "examine": "See article", + "tradeable": "true", + "grand_exchange_price": "2153", + "equipment_slot": "5", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6984", + "name": "Granite (5kg)", + "tradeable": "true", + "grand_exchange_price": "2153", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6985", + "name": "Sandstone (20kg)", + "examine": "A huge twenty-kilo block of sandstone.", + "destroy": "true", + "destroy_message": "You can make another 20 kg block by giving enough stone to Lazim.", + "weight": "20", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6986", + "name": "Sandstone (32kg)", + "examine": "A huge thirty-two-kilo block of sandstone.", + "destroy": "true", + "destroy_message": "You can make another 32 kg sandstone block by giving enough stone to Lazim.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6987", + "name": "Sandstone body", + "examine": "The body of a sandstone statue.", + "destroy": "true", + "destroy_message": "You can make another statue body by giving Lazim 20 kg of stone and then crafting it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6988", + "name": "Sandstone base", + "examine": "The base and legs of a sandstone statue.", + "destroy": "true", + "destroy_message": "You can make another statue base by giving Lazim 32 kg of stone and then crafting it.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6993", + "name": "Z sigil", + "examine": "A metal sigil in the shape of a Z.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6994", + "name": "M sigil", + "examine": "A metal sigil in the shape of an M.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6995", + "name": "R sigil", + "examine": "A metal sigil in the shape of an R.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6996", + "name": "K sigil", + "examine": "A metal sigil in the shape of a K.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6997", + "name": "Stone left arm", + "examine": "The left arm of a large stone statue.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the statue's left arm back from Lazim.", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6998", + "name": "Stone right arm", + "examine": "The right arm of a large stone statue.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the statue's right arm back from Lazim.", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "6999", + "name": "Stone left leg", + "examine": "The left leg of a large stone statue.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the statue's left leg back from Lazim.", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7000", + "name": "Stone right leg", + "examine": "The right leg of a large stone statue.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the statue's right leg back from Lazim.", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7001", + "name": "Camel mould (p)", + "examine": "A positive clay mould of a camel's head.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can make another positive mould by using soft clay on the pedestal in Enakhra's temple.", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7003", + "name": "Camel mask", + "examine": "Blend in in the desert.", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7004", + "name": "Chisel", + "examine": "Good for detailed crafting.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "33", + "equipment_slot": "3", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7051", + "name": "Unlit bug lantern", + "examine": "A lantern to aid attacking Harpie bugs.", + "tradeable": "true", + "low_alchemy": "52", + "high_alchemy": "78", + "shop_price": "130", + "grand_exchange_price": "466", + "equipment_slot": "5", + "requirements": "{18,33}-{11,33}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7052", + "name": "Unlit bug lantern", + "tradeable": "true", + "grand_exchange_price": "466", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7053", + "name": "Lit bug lantern", + "examine": "A lantern to aid attacking Harpie bugs.", + "low_alchemy": "52", + "high_alchemy": "78", + "shop_price": "130", + "equipment_slot": "5", + "requirements": "{18,33}", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7054", + "name": "Chilli potato", + "examine": "A baked potato with chilli con carne", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "grand_exchange_price": "415", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7055", + "name": "Chilli potato", + "tradeable": "true", + "grand_exchange_price": "415", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7056", + "name": "Egg potato", + "examine": "A baked potato with egg and tomato.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "grand_exchange_price": "441", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7057", + "name": "Egg potato", + "tradeable": "true", + "grand_exchange_price": "441", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7058", + "name": "Mushroom potato", + "examine": "A baked potato with mushroom and onions.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "grand_exchange_price": "1165", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7059", + "name": "Mushroom potato", + "tradeable": "true", + "grand_exchange_price": "1165", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7060", + "name": "Tuna potato", + "examine": "A baked potato with tuna and sweetcorn.", + "tradeable": "true", + "low_alchemy": "45", + "high_alchemy": "67", + "grand_exchange_price": "2134", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7061", + "name": "Tuna potato", + "tradeable": "true", + "grand_exchange_price": "2134", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7062", + "name": "Chilli con carne", + "examine": "A bowl of meat in chilli-con-carne sauce.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "grand_exchange_price": "215", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7063", + "name": "Chilli con carne", + "tradeable": "true", + "grand_exchange_price": "215", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7064", + "name": "Egg and tomato", + "examine": "A bowl of scrambled eggs and tomato", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "grand_exchange_price": "126", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7065", + "name": "Egg and tomato", + "tradeable": "true", + "grand_exchange_price": "126", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7066", + "name": "Mushroom & onion", + "examine": "A bowl of fried mushroom and onions.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "27", + "grand_exchange_price": "368", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7067", + "name": "Mushroom & onion", + "tradeable": "true", + "grand_exchange_price": "368", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7068", + "name": "Tuna and corn", + "examine": "A bowl of cooked tuna and sweetcorn.", + "tradeable": "true", + "low_alchemy": "45", + "high_alchemy": "67", + "grand_exchange_price": "514", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7069", + "name": "Tuna and corn", + "tradeable": "true", + "grand_exchange_price": "514", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7070", + "name": "Minced meat", + "examine": "A bowl of finely minced meat.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "22", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7071", + "name": "Minced meat", + "tradeable": "true", + "grand_exchange_price": "22", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7072", + "name": "Spicy sauce", + "examine": "A bowl of spicy sauce.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "5", + "grand_exchange_price": "70", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7073", + "name": "Spicy sauce", + "tradeable": "true", + "grand_exchange_price": "70", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7074", + "name": "Chopped garlic", + "examine": "A bowl of chopped garlic.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "grand_exchange_price": "39", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7075", + "name": "Chopped garlic", + "tradeable": "true", + "grand_exchange_price": "39", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7076", + "name": "Uncooked egg", + "examine": "A bowl of uncooked egg.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "34", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7077", + "name": "Uncooked egg", + "tradeable": "true", + "grand_exchange_price": "34", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7078", + "name": "Scrambled egg", + "examine": "A bowl of scrambled egg.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "24", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7079", + "name": "Scrambled egg", + "tradeable": "true", + "grand_exchange_price": "24", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7080", + "name": "Sliced mushrooms", + "examine": "A bowl of sliced Bittercap mushrooms.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "25", + "grand_exchange_price": "149", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7081", + "name": "Sliced mushrooms", + "tradeable": "true", + "grand_exchange_price": "149", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7082", + "name": "Fried mushrooms", + "examine": "A bowl of fried Bittercap mushrooms.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "25", + "grand_exchange_price": "189", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7083", + "name": "Fried mushrooms", + "tradeable": "true", + "grand_exchange_price": "189", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7084", + "name": "Fried onions", + "examine": "A bowl of sliced, fried onions.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "grand_exchange_price": "40", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7085", + "name": "Fried onions", + "tradeable": "true", + "grand_exchange_price": "40", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7086", + "name": "Chopped tuna", + "examine": "A bowl of finely chopped tuna.", + "tradeable": "true", + "low_alchemy": "41", + "high_alchemy": "62", + "grand_exchange_price": "233", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7087", + "name": "Chopped tuna", + "tradeable": "true", + "grand_exchange_price": "233", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7088", + "name": "Sweetcorn", + "examine": "Raw sweetcorn.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "5", + "grand_exchange_price": "110", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7089", + "name": "Sweetcorn", + "tradeable": "true", + "grand_exchange_price": "110", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7091", + "name": "Burnt egg", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7093", + "name": "Burnt onion", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7095", + "name": "Burnt mushroom", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7108", + "name": "Gunpowder", + "examine": "Best keep this away from naked flames.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7109", + "name": "Fuse", + "examine": "A fuse.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7110", + "name": "Stripy pirate shirt", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "48", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7111", + "name": "Stripy pirate shirt", + "tradeable": "true", + "grand_exchange_price": "48", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7112", + "name": "Pirate bandana", + "examine": "Essential pirate wear.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "714", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7113", + "name": "Pirate bandana", + "tradeable": "true", + "grand_exchange_price": "714", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7114", + "name": "Pirate boots", + "examine": "Not for land lubbers.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "shop_price": "350", + "grand_exchange_price": "2530", + "equipment_slot": "10", + "weight": "4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7115", + "name": "Pirate boots", + "tradeable": "true", + "grand_exchange_price": "2530", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7116", + "name": "Pirate leggings", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "shop_price": "350", + "grand_exchange_price": "77", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7117", + "name": "Pirate leggings", + "tradeable": "true", + "grand_exchange_price": "77", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7118", + "name": "Canister", + "examine": "A cannister holding shrapnel.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7120", + "name": "Ramrod", + "examine": "For cleaning and packing the cannon.", + "destroy": "true", + "tradeable": "false", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7121", + "name": "Repair plank", + "examine": "A plank of wood to repair the hull with.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7122", + "name": "Stripy pirate shirt", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "904", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7123", + "name": "Stripy pirate shirt", + "tradeable": "true", + "grand_exchange_price": "904", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7124", + "name": "Pirate bandana", + "examine": "Essential pirate wear.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "340", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7125", + "name": "Pirate bandana", + "tradeable": "true", + "grand_exchange_price": "340", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7126", + "name": "Pirate leggings", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "shop_price": "350", + "grand_exchange_price": "187", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7127", + "name": "Pirate leggings", + "tradeable": "true", + "grand_exchange_price": "187", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7128", + "name": "Stripy pirate shirt", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "744", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7129", + "name": "Stripy pirate shirt", + "tradeable": "true", + "grand_exchange_price": "744", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7130", + "name": "Pirate bandana", + "examine": "Essential pirate wear.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "154", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7131", + "name": "Pirate bandana", + "tradeable": "true", + "grand_exchange_price": "154", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7132", + "name": "Pirate leggings", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "shop_price": "350", + "grand_exchange_price": "253", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7133", + "name": "Pirate leggings", + "tradeable": "true", + "grand_exchange_price": "253", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7134", + "name": "Stripy pirate shirt", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "grand_exchange_price": "421", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7135", + "name": "Stripy pirate shirt", + "tradeable": "true", + "grand_exchange_price": "421", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7136", + "name": "Pirate bandana", + "examine": "Essential pirate wear.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "469", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7137", + "name": "Pirate bandana", + "tradeable": "true", + "grand_exchange_price": "469", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7138", + "name": "Pirate leggings", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "shop_price": "350", + "grand_exchange_price": "83", + "equipment_slot": "7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7139", + "name": "Pirate leggings", + "tradeable": "true", + "grand_exchange_price": "83", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7140", + "name": "Lucky cutlass", + "examine": "Feels quite lucky.", + "low_alchemy": "1024", + "high_alchemy": "1536", + "shop_price": "2560", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "5,20,0,-5,0,6,6,6,0,0,0,25,0,0,0", + "weapon_interface": "6", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7141", + "name": "Harry's cutlass", + "examine": "I hope he doesn't want it back.", + "low_alchemy": "416", + "high_alchemy": "624", + "shop_price": "1040", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "3,14,0,-5,0,4,4,4,0,0,0,22,0,0,0", + "weapon_interface": "6", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7142", + "name": "Rapier", + "examine": "The very butcher of a silk button.", + "low_alchemy": "10240", + "high_alchemy": "15360", + "shop_price": "25600", + "render_anim": "2622", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "45,7,-2,0,0,0,1,0,0,0,0,44,0,0,0", + "weapon_interface": "5", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7143", + "name": "Plunder", + "examine": "Looks valuable.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7144", + "name": "Book o' piracy", + "examine": "By Cap'n Hook-Hand Morrisane.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7145", + "name": "Cannon barrel", + "examine": "A working cannon barrel.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7146", + "name": "Broken cannon", + "examine": "Not likely to work again.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7148", + "name": "Repair plank", + "examine": "A plank of wood to repair the hull with.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7149", + "name": "Canister", + "examine": "A cannister holding shrapnel.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7150", + "name": "Tacks", + "examine": "Useful for pinning up paintings.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7155", + "name": "Rope", + "examine": "A coil of rope.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "shop_price": "18", + "grand_exchange_price": "101", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7156", + "name": "Tinderbox", + "examine": "Useful for lighting a fire.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "121", + "weight": "0.05", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7157", + "name": "Braindeath 'rum", + "examine": "I think it is eating through the bottle.", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7158", + "name": "Dragon 2h sword", + "examine": "A two-handed dragon sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "88000", + "high_alchemy": "132000", + "grand_exchange_price": "1000000", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,92,80,-4,0,0,0,0,0,-1,0,93,0,0,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "2503,0,2504,0", + "requirements": "{0,60}", + "weight": "3", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7159", + "name": "Insulated boots", + "examine": "They're heavily insulated wellies.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "269", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,1,1,0,0,1,0,0,0,0,0", + "requirements": "{18,37}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7160", + "name": "Killerwatt", + "examine": "Before being attacked: A ball of Electrical energy.", + "attack_speed": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7161", + "name": "Insulated boots", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7162", + "name": "Pie recipe book", + "examine": "Lots of pie recipes for me to try.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "62", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7163", + "name": "Pie recipe book", + "tradeable": "true", + "grand_exchange_price": "62", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7164", + "name": "Part mud pie", + "examine": "All the good of the earth.", + "tradeable": "true", + "low_alchemy": "21", + "high_alchemy": "32", + "shop_price": "54", + "grand_exchange_price": "77", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7165", + "name": "Part mud pie", + "tradeable": "true", + "grand_exchange_price": "77", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7166", + "name": "Part mud pie", + "examine": "All the good of the earth.", + "tradeable": "true", + "low_alchemy": "21", + "high_alchemy": "32", + "shop_price": "54", + "grand_exchange_price": "284", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7167", + "name": "Part mud pie", + "tradeable": "true", + "grand_exchange_price": "284", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7168", + "name": "Raw mud pie", + "examine": "Needs to be baked before I can use it.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "16", + "grand_exchange_price": "1625", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7169", + "name": "Raw mud pie", + "tradeable": "true", + "grand_exchange_price": "1625", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7170", + "name": "Mud pie", + "examine": "All the good of the earth.", + "tradeable": "true", + "low_alchemy": "21", + "high_alchemy": "32", + "shop_price": "54", + "grand_exchange_price": "2024", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "weapon_interface": "13", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7171", + "name": "Mud pie", + "tradeable": "true", + "grand_exchange_price": "2024", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7172", + "name": "Part garden pie", + "examine": "What I wouldn't give for a good steak about now...", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "94", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7173", + "name": "Part garden pie", + "tradeable": "true", + "grand_exchange_price": "94", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7174", + "name": "Part garden pie", + "examine": "What I wouldn't give for a good steak about now...", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "150", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7175", + "name": "Part garden pie", + "tradeable": "true", + "grand_exchange_price": "150", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7176", + "name": "Raw garden pie", + "examine": "Needs cooking before I eat it.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "grand_exchange_price": "1052", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7177", + "name": "Raw garden pie", + "tradeable": "true", + "grand_exchange_price": "1052", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7178", + "name": "Garden pie", + "examine": "What I wouldn't give for a good steak about now...", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "1667", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7179", + "name": "Garden pie", + "tradeable": "true", + "grand_exchange_price": "1667", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7180", + "name": "Half a garden pie", + "examine": "What I wouldn't give for a good steak about now...", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "442", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7181", + "name": "Half a garden pie", + "tradeable": "true", + "grand_exchange_price": "442", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7182", + "name": "Part fish pie", + "examine": "Bounty of the sea.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "51", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7183", + "name": "Part fish pie", + "tradeable": "true", + "grand_exchange_price": "51", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7184", + "name": "Part fish pie", + "examine": "Bounty of the sea.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "691", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7185", + "name": "Part fish pie", + "tradeable": "true", + "grand_exchange_price": "691", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7186", + "name": "Raw fish pie", + "examine": "Raw fish is risky, better cook it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "1198", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7187", + "name": "Raw fish pie", + "tradeable": "true", + "grand_exchange_price": "1198", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7188", + "name": "Fish pie", + "examine": "Bounty of the sea.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "121", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7189", + "name": "Fish pie", + "tradeable": "true", + "grand_exchange_price": "121", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7190", + "name": "Half a fish pie", + "examine": "Bounty of the sea.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "56", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7191", + "name": "Half a fish pie", + "tradeable": "true", + "grand_exchange_price": "56", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7192", + "name": "Part admiral pie", + "examine": "Much tastier than a normal fish pie.", + "tradeable": "true", + "grand_exchange_price": "159", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7193", + "name": "Part admiral pie", + "tradeable": "true", + "grand_exchange_price": "159", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7194", + "name": "Part admiral pie", + "examine": "Much tastier than a normal fish pie.", + "tradeable": "true", + "grand_exchange_price": "537", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7195", + "name": "Part admiral pie", + "tradeable": "true", + "grand_exchange_price": "537", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7196", + "name": "Raw admiral pie", + "examine": "This would taste a lot better cooked.", + "tradeable": "true", + "low_alchemy": "62", + "high_alchemy": "93", + "grand_exchange_price": "1813", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7197", + "name": "Raw admiral pie", + "tradeable": "true", + "grand_exchange_price": "1813", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7198", + "name": "Admiral pie", + "examine": "Much tastier than a normal fish pie.", + "tradeable": "true", + "grand_exchange_price": "532", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7199", + "name": "Admiral pie", + "tradeable": "true", + "grand_exchange_price": "532", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7200", + "name": "Half an admiral pie", + "examine": "Much tastier than a normal fish pie.", + "tradeable": "true", + "grand_exchange_price": "184", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7201", + "name": "Half an admiral pie", + "tradeable": "true", + "grand_exchange_price": "184", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7202", + "name": "Part wild pie", + "examine": "A triumph of man over nature.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "126", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7203", + "name": "Part wild pie", + "tradeable": "true", + "grand_exchange_price": "126", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7204", + "name": "Part wild pie", + "examine": "A triumph of man over nature.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "1116", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7205", + "name": "Part wild pie", + "tradeable": "true", + "grand_exchange_price": "1116", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7206", + "name": "Raw wild pie", + "examine": "Good as it looks, I'd better cook it.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "3787", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7207", + "name": "Raw wild pie", + "tradeable": "true", + "grand_exchange_price": "3787", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7208", + "name": "Wild pie", + "examine": "A triumph of man over nature.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "1322", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7209", + "name": "Wild pie", + "tradeable": "true", + "grand_exchange_price": "1322", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7210", + "name": "Half a wild pie", + "examine": "A triumph of man over nature.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "112", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7211", + "name": "Half a wild pie", + "tradeable": "true", + "grand_exchange_price": "112", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7212", + "name": "Part summer pie", + "examine": "All the fruits of a very small forest.", + "tradeable": "true", + "low_alchemy": "56", + "high_alchemy": "84", + "grand_exchange_price": "495", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7213", + "name": "Part summer pie", + "tradeable": "true", + "grand_exchange_price": "495", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7214", + "name": "Part summer pie", + "examine": "All the fruits of a very small forest.", + "tradeable": "true", + "low_alchemy": "56", + "high_alchemy": "84", + "grand_exchange_price": "980", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7215", + "name": "Part summer pie", + "tradeable": "true", + "grand_exchange_price": "980", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7216", + "name": "Raw summer pie", + "examine": "Fresh fruit may be good for you, but I should really cook this.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "grand_exchange_price": "2577", + "weight": "0.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7217", + "name": "Raw summer pie", + "tradeable": "true", + "grand_exchange_price": "2577", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7218", + "name": "Summer pie", + "examine": "All the fruits of a very small forest.", + "tradeable": "true", + "low_alchemy": "56", + "high_alchemy": "84", + "grand_exchange_price": "1288", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7219", + "name": "Summer pie", + "tradeable": "true", + "grand_exchange_price": "1288", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7220", + "name": "Half a summer pie", + "examine": "All the fruits of a very small forest.", + "tradeable": "true", + "low_alchemy": "56", + "high_alchemy": "84", + "grand_exchange_price": "430", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7221", + "name": "Half a summer pie", + "tradeable": "true", + "grand_exchange_price": "430", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7222", + "name": "Burnt rabbit", + "examine": "Mmm this looks tasty.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "11", + "shop_price": "19", + "grand_exchange_price": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7223", + "name": "Roast rabbit", + "examine": "A delicious looking piece of roast rabbit.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "25", + "grand_exchange_price": "37", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7224", + "name": "Skewered rabbit", + "examine": "Might taste better cooked.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "67", + "grand_exchange_price": "112", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7225", + "name": "Iron spit", + "examine": "An iron spit.", + "tradeable": "true", + "low_alchemy": "25", + "high_alchemy": "38", + "shop_price": "81", + "grand_exchange_price": "18", + "weight": "1.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7227", + "name": "Burnt chompy", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7228", + "name": "Cooked chompy", + "examine": "It might look delicious to an ogre.Roasted chompy bird.", + "tradeable": "true", + "low_alchemy": "52", + "high_alchemy": "78", + "shop_price": "130", + "grand_exchange_price": "164", + "weight": "10", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7229", + "name": "Cooked chompy", + "tradeable": "true", + "grand_exchange_price": "164", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7230", + "name": "Skewered chompy", + "examine": "A skewered chompy bird.", + "low_alchemy": "59", + "high_alchemy": "89", + "destroy": "true", + "grand_exchange_price": "294", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7231", + "name": "Burnt rabbit", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7232", + "name": "Roast rabbit", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7233", + "name": "Skewered rabbit", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7234", + "name": "Iron spit", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7235", + "name": "Skewered chompy", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7236", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7237", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7238", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7239", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7240", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7241", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7242", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7243", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7244", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7245", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7246", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7247", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7248", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7249", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7250", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7251", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7252", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7253", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7254", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7255", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7256", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7257", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7258", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7259", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7260", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7261", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7262", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7263", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7264", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7265", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7266", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7267", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7268", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7269", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7270", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7271", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7272", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7273", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7274", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7275", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7276", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7277", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7278", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7279", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7280", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7281", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7282", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7283", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7284", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7285", + "name": "Challenge scroll", + "examine": "I need to answer this correctly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7286", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7287", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7288", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7289", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7290", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7291", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7292", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7293", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7294", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7295", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7296", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7298", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7300", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7301", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7303", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7304", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7305", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7306", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7307", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7308", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7309", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7310", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7311", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7312", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7313", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7314", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7315", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7316", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7317", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7318", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7319", + "name": "Red boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "36600", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7320", + "name": "Red boater", + "tradeable": "true", + "grand_exchange_price": "36600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7321", + "name": "Orange boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "16600", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7322", + "name": "Orange boater", + "tradeable": "true", + "grand_exchange_price": "16600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7323", + "name": "Green boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "43000", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7324", + "name": "Green boater", + "tradeable": "true", + "grand_exchange_price": "43000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7325", + "name": "Blue boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "37600", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7326", + "name": "Blue boater", + "tradeable": "true", + "grand_exchange_price": "37600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7327", + "name": "Black boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "41700", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7328", + "name": "Black boater", + "tradeable": "true", + "grand_exchange_price": "41700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7329", + "name": "Red firelighter", + "examine": "Makes firelighting a lot easier.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "93", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7330", + "name": "Green firelighter", + "examine": "Makes firelighting a lot easier.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "94", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7331", + "name": "Blue firelighter", + "examine": "Makes firelighting a lot easier.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "113", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7332", + "name": "Black shield(h1)", + "examine": "A black kitesheild with a heraldic design.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "grand_exchange_price": "14300", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7333", + "name": "Black shield(h1)", + "tradeable": "true", + "grand_exchange_price": "14300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7334", + "name": "Adamant shield(h1)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "16400", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7335", + "name": "Adamant shield(h1)", + "tradeable": "true", + "grand_exchange_price": "16400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7336", + "name": "Rune shield(h1)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "34200", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5.4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7337", + "name": "Rune shield(h1)", + "tradeable": "true", + "grand_exchange_price": "34200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7338", + "name": "Black shield(h2)", + "examine": "A black kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "6530", + "high_alchemy": "9795", + "grand_exchange_price": "9797", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7339", + "name": "Black shield(h2)", + "tradeable": "true", + "grand_exchange_price": "9797", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7340", + "name": "Adamant shield(h2)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "3248", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7341", + "name": "Adamant shield(h2)", + "tradeable": "true", + "grand_exchange_price": "3248", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7342", + "name": "Rune shield(h2)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32400", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5.4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7343", + "name": "Rune shield(h2)", + "tradeable": "true", + "grand_exchange_price": "32400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7344", + "name": "Black shield(h3)", + "examine": "A black shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "grand_exchange_price": "7405", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7345", + "name": "Black shield(h3)", + "tradeable": "true", + "grand_exchange_price": "7405", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7346", + "name": "Adamant shield(h3)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "5271", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7347", + "name": "Adamant shield(h3)", + "tradeable": "true", + "grand_exchange_price": "5271", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7348", + "name": "Rune shield(h3)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32700", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7349", + "name": "Rune shield(h3)", + "tradeable": "true", + "grand_exchange_price": "32700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7350", + "name": "Black shield(h4)", + "examine": "A black shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "grand_exchange_price": "5572", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7351", + "name": "Black shield(h4)", + "tradeable": "true", + "grand_exchange_price": "5572", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7352", + "name": "Adamant shield(h4)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "3366", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7353", + "name": "Adamant shield(h4)", + "tradeable": "true", + "grand_exchange_price": "3366", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7354", + "name": "Rune shield(h4)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32500", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7355", + "name": "Rune shield(h4)", + "tradeable": "true", + "grand_exchange_price": "32500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7356", + "name": "Black shield(h5)", + "examine": "A black shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "grand_exchange_price": "7159", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,0,0,0", + "requirements": "{1,10}", + "weight": "4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7357", + "name": "Black shield(h5)", + "tradeable": "true", + "grand_exchange_price": "7159", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7358", + "name": "Adamant shield(h5)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "6328", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,0,0,0", + "requirements": "{1,30}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7359", + "name": "Adamant shield(h5)", + "tradeable": "true", + "grand_exchange_price": "6328", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7360", + "name": "Rune shield(h5)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32400", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "requirements": "{1,40}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7361", + "name": "Rune shield(h5)", + "tradeable": "true", + "grand_exchange_price": "32400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7362", + "name": "Studded body (g)", + "examine": "Those studs should provide a bit more protection. Nice trim too!", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "grand_exchange_price": "101600", + "equipment_slot": "4", + "absorb": "0,3,1", + "bonuses": "0,0,0,-4,8,18,25,22,8,25,20,0,0,0,0", + "requirements": "{1,20}-{4,20}", + "weight": "5.4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7363", + "name": "Studded body (g)", + "tradeable": "true", + "grand_exchange_price": "101600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7364", + "name": "Studded body (t)", + "examine": "Those studs should provide a bit more protection. Nice trim too!", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "grand_exchange_price": "27300", + "equipment_slot": "4", + "absorb": "0,3,1", + "bonuses": "0,0,0,-4,8,18,25,22,8,25,20,0,0,0,0", + "requirements": "{1,20}-{4,20}", + "weight": "5.4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7365", + "name": "Studded body (t)", + "tradeable": "true", + "grand_exchange_price": "27300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7366", + "name": "Studded chaps (g)", + "examine": "Those studs should provide a bit more protection. Nice trim too!", + "tradeable": "true", + "low_alchemy": "300", + "high_alchemy": "450", + "grand_exchange_price": "114600", + "equipment_slot": "7", + "absorb": "0,2,1", + "bonuses": "0,0,0,-5,6,15,16,17,6,16,5,0,0,0,0", + "requirements": "{4,20}", + "weight": "4.5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7367", + "name": "Studded chaps (g)", + "tradeable": "true", + "grand_exchange_price": "114600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7368", + "name": "Studded chaps (t)", + "examine": "Those studs should provide a bit more protection. Nice trim, too!", + "tradeable": "true", + "low_alchemy": "300", + "high_alchemy": "450", + "grand_exchange_price": "36800", + "equipment_slot": "7", + "absorb": "0,2,1", + "bonuses": "0,0,0,-5,6,15,16,17,6,16,5,0,0,0,0", + "requirements": "{4,20}", + "weight": "4.5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7369", + "name": "Studded chaps (t)", + "tradeable": "true", + "grand_exchange_price": "36800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7370", + "name": "D'hide body(g)", + "grand_exchange_price": "212400", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,15,40,32,45,20,40,40,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7371", + "name": "D'hide body(g)", + "tradeable": "true", + "grand_exchange_price": "212400", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7372", + "name": "D'hide body (t)", + "grand_exchange_price": "38800", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,15,40,32,45,20,40,40,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7373", + "name": "D'hide body (t)", + "tradeable": "true", + "grand_exchange_price": "38800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7374", + "name": "D'hide body (g)", + "grand_exchange_price": "6883", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,20,45,37,50,30,45,45,0,0,0,0", + "requirements": "{1,50}-{4,40}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7375", + "name": "D'hide body (g)", + "tradeable": "true", + "grand_exchange_price": "6883", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7376", + "name": "D'hide body (t)", + "grand_exchange_price": "5268", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,20,45,37,50,30,45,45,0,0,0,0", + "requirements": "{1,50}-{4,40}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7377", + "name": "D'hide body (t)", + "tradeable": "true", + "grand_exchange_price": "5268", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7378", + "name": "D'hide chaps (g)", + "grand_exchange_price": "1300000", + "equipment_slot": "7", + "bonuses": "0,0,0,-10,8,22,16,24,8,22,15,0,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7379", + "name": "D'hide chaps (g)", + "tradeable": "true", + "grand_exchange_price": "1300000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7380", + "name": "D'hide chaps (t)", + "grand_exchange_price": "304300", + "equipment_slot": "7", + "bonuses": "0,0,0,-10,8,22,16,24,8,22,15,0,0,0,0", + "requirements": "{4,40}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7381", + "name": "D'hide chaps (t)", + "tradeable": "true", + "grand_exchange_price": "304300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7382", + "name": "D'hide chaps (g)", + "grand_exchange_price": "21300", + "equipment_slot": "7", + "bonuses": "0,0,0,-10,11,25,19,27,14,25,20,0,0,0,0", + "requirements": "{4,50}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7383", + "name": "D'hide chaps (g)", + "tradeable": "true", + "grand_exchange_price": "21300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7384", + "name": "D'hide chaps (t)", + "grand_exchange_price": "2554", + "equipment_slot": "7", + "bonuses": "0,0,0,-10,11,25,19,27,14,25,20,0,0,0,0", + "requirements": "{4,50}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7385", + "name": "D'hide chaps (t)", + "tradeable": "true", + "grand_exchange_price": "2554", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7386", + "name": "Blue skirt (g)", + "examine": "Leg covering favoured by women and wizards. With a colourful trim!", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "298900", + "equipment_slot": "7", + "bonuses": "0,0,0,1,0,0,0,0,1,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7387", + "name": "Blue skirt (g)", + "tradeable": "true", + "grand_exchange_price": "298900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7388", + "name": "Blue skirt (t)", + "examine": "Leg covering favoured by women and wizards. With a colourful trim!", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "126800", + "equipment_slot": "7", + "bonuses": "0,0,0,1,0,0,0,0,1,0,0,0,0,0,0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7389", + "name": "Blue skirt (t)", + "tradeable": "true", + "grand_exchange_price": "126800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7390", + "name": "Wizard robe (g)", + "examine": "I can practise magic better in this.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "1200000", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7391", + "name": "Wizard robe (g)", + "tradeable": "true", + "grand_exchange_price": "1200000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7392", + "name": "Wizard robe (t)", + "examine": "I can do magic better in this.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "244600", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7393", + "name": "Wizard robe (t)", + "tradeable": "true", + "grand_exchange_price": "244600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7394", + "name": "Wizard hat (g)", + "examine": "A silly pointed hat with colourful trim.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "1400000", + "equipment_slot": "0", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7395", + "name": "Wizard hat (g)", + "tradeable": "true", + "grand_exchange_price": "1400000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7396", + "name": "Wizard hat (t)", + "examine": "A silly pointed hat, with colourful trim.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "352700", + "equipment_slot": "0", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", + "weight": "0.4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7397", + "name": "Wizard hat (t)", + "tradeable": "true", + "grand_exchange_price": "352700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7398", + "name": "Enchanted robe", + "examine": "Enchanted Wizards robes.", + "tradeable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "grand_exchange_price": "50000", + "equipment_slot": "7", + "absorb": "2,1,0", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,0,0", + "requirements": "{1,40}-{6,20}", + "weight": "1.8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7399", + "name": "Enchanted top", + "examine": "Enchanted Wizards robes.", + "tradeable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "grand_exchange_price": "75100", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,20,0,0,0,0", + "requirements": "{1,40}-{6,20}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7400", + "name": "Enchanted hat", + "examine": "A three pointed hat of magic.", + "tradeable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "grand_exchange_price": "8845", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,0,0,0", + "requirements": "{1,40}-{6,20}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7401", + "name": "Enchanted robe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7402", + "name": "Enchanted top", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7403", + "name": "Enchanted hat", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7404", + "name": "Red logs", + "examine": "A number of chemical covered wooden logs.", + "low_alchemy": "1", + "high_alchemy": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7405", + "name": "Green logs", + "examine": "A number of chemical covered wooden logs.", + "low_alchemy": "1", + "high_alchemy": "2", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7406", + "name": "Blue logs", + "examine": "A number of chemical covered wooden logs.", + "low_alchemy": "1", + "high_alchemy": "2", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7407", + "name": "Dragon 2h sword", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7408", + "name": "Draynor skull", + "examine": "I shouldn't joke; this is a grave matter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I found this in a grave at Draynor Manor.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7409", + "name": "Magic secateurs", + "examine": "The only way to kill a Tanglefoot.", + "low_alchemy": "75000", + "high_alchemy": "75000", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I'll chat to Malignius Mortifer if I want another pair.", + "shop_price": "40000", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,9,-5,1,0,0,1,0,1,0,0,1,0,0,0", + "weapon_interface": "5", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7410", + "name": "Queen's secateurs", + "examine": "Contains the Fairy Queen's magical essence.", + "destroy_message": "I can always find another Tanglefoot if I need more.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7411", + "name": "Symptoms list", + "examine": "A list of the Fairy Queen's symptoms.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7413", + "name": "Bird's nest", + "examine": "Full: ", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7414", + "name": "Paddle", + "equipment_slot": "3", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7415", + "name": "Paddle", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7416", + "name": "Mole claw", + "examine": "A mole claw.", + "tradeable": "true", + "low_alchemy": "240", + "high_alchemy": "360", + "grand_exchange_price": "11800", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7417", + "name": "Mole claw", + "tradeable": "true", + "grand_exchange_price": "11800", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7418", + "name": "Mole skin", + "examine": "The skin of a large mole.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "12000", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7419", + "name": "Mole skin", + "tradeable": "true", + "grand_exchange_price": "12000", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7420", + "name": "Mutated zygomite", + "examine": "A fun guy. No wait, that's awful. Plus it doesn't even make sense. (As Fungi) A bouncy fungus. (Level 74) A fun guy. No wait, that's awful.. (Level 86)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7421", + "name": "Fungicide spray 10", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7422", + "name": "Fungicide spray 9", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7423", + "name": "Fungicide spray 8", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7424", + "name": "Fungicide spray 7", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7425", + "name": "Fungicide spray 6", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7426", + "name": "Fungicide spray 5", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7427", + "name": "Fungicide spray 4", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7428", + "name": "Fungicide spray 3", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7429", + "name": "Fungicide spray 2", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7430", + "name": "Fungicide spray 1", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7431", + "name": "Fungicide spray 0", + "examine": "Pumps fungicide.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "3332", + "stand_turn_anim": "823", + "walk_anim": "3334", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "618", + "equipment_slot": "3", + "requirements": "{18,57}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7432", + "name": "Fungicide", + "examine": "Does exactly what it says on the tin. (Kills Fungi.)", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "requirements": "{18,57}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7433", + "name": "Wooden spoon", + "examine": "Spoooooon!", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "shop_price": "35", + "grand_exchange_price": "44", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "4,5,-2,0,0,0,3,2,0,0,0,7,0,0,0", + "weapon_interface": "6", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7434", + "name": "Wooden spoon", + "tradeable": "true", + "grand_exchange_price": "44", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7435", + "name": "Egg whisk", + "examine": "A large whisk of death.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "45", + "grand_exchange_price": "11", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,4,0,0,0", + "weapon_interface": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7436", + "name": "Egg whisk", + "tradeable": "true", + "grand_exchange_price": "11", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7437", + "name": "Spork", + "examine": "Use the spork.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "shop_price": "292", + "grand_exchange_price": "196", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "11,8,-2,0,0,0,2,1,0,0,0,12,0,0,0", + "weapon_interface": "5", + "requirements": "{0,10}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7438", + "name": "Spork", + "tradeable": "true", + "grand_exchange_price": "196", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7439", + "name": "Spatula", + "examine": "A large spatula... of doom!", + "tradeable": "true", + "low_alchemy": "768", + "high_alchemy": "1152", + "shop_price": "1728", + "grand_exchange_price": "953", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,27,21,-4,0,0,0,0,0,-1,0,22,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "requirements": "{0,10}", + "weight": "3.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7440", + "name": "Spatula", + "tradeable": "true", + "grand_exchange_price": "953", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7441", + "name": "Frying pan", + "examine": "Looks like it's non-stick too!", + "tradeable": "true", + "low_alchemy": "664", + "high_alchemy": "996", + "shop_price": "1494", + "grand_exchange_price": "836", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,25,-4,0,0,0,0,0,0,0,20,0,0,0", + "weapon_interface": "10", + "requirements": "{0,20}", + "weight": "1.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7442", + "name": "Frying pan", + "tradeable": "true", + "grand_exchange_price": "836", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7443", + "name": "Skewer", + "examine": "Generally used for impaling fresh meat.", + "tradeable": "true", + "low_alchemy": "1280", + "high_alchemy": "1920", + "shop_price": "2880", + "grand_exchange_price": "1712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "20,29,-2,0,0,0,3,2,0,0,0,31,0,0,0", + "weapon_interface": "6", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7444", + "name": "Skewer", + "tradeable": "true", + "grand_exchange_price": "1712", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7445", + "name": "Rolling pin", + "examine": "That's how I roll!", + "tradeable": "true", + "low_alchemy": "5760", + "high_alchemy": "8640", + "shop_price": "12960", + "grand_exchange_price": "8445", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "20,-2,39,0,0,0,0,0,0,0,0,36,4,0,0", + "weapon_interface": "10", + "requirements": "{0,40}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7446", + "name": "Rolling pin", + "tradeable": "true", + "grand_exchange_price": "8445", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7447", + "name": "Kitchen knife", + "examine": "A sharp, dependable knife, for filleting meat.", + "tradeable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "shop_price": "8000", + "grand_exchange_price": "4686", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "25,12,-4,1,0,0,0,0,1,0,0,24,0,0,0", + "weapon_interface": "5", + "attack_audios": "2704,0,0,0", + "requirements": "{0,40}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7448", + "name": "Kitchen knife", + "tradeable": "true", + "grand_exchange_price": "4686", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7449", + "name": "Meat tenderiser", + "examine": "Often used to soften tough meat up.", + "tradeable": "true", + "low_alchemy": "16600", + "high_alchemy": "24900", + "shop_price": "41500", + "grand_exchange_price": "24700", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-4,-4,53,-4,0,0,0,0,0,0,0,48,0,0,0", + "weapon_interface": "10", + "attack_anims": "2067,2066,2068", + "defence_anim": "1666", + "requirements": "{0,40}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7450", + "name": "Meat tenderiser", + "tradeable": "true", + "grand_exchange_price": "24700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7451", + "name": "Cleaver", + "examine": "An effective tool for chopping tough meat.", + "tradeable": "true", + "low_alchemy": "10240", + "high_alchemy": "15360", + "shop_price": "24040", + "grand_exchange_price": "15000", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "7,45,-2,0,0,0,1,0,0,0,0,44,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "requirements": "{0,40}", + "weight": "0.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7452", + "name": "Cleaver", + "tradeable": "true", + "grand_exchange_price": "15000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7453", + "name": "Gloves", + "examine": "A pair of plain gloves.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "equipment_slot": "9", + "bonuses": "1,1,1,1,1,1,1,1,1,1,1,1,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7454", + "name": "Gloves", + "examine": "A pair of bronze-coloured gloves.", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "9", + "bonuses": "2,2,2,1,2,2,2,2,1,2,1,2,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7455", + "name": "Gloves", + "examine": "A pair of iron-coloured gloves.", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "325", + "equipment_slot": "9", + "bonuses": "3,3,3,2,3,3,3,3,2,3,2,3,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7456", + "name": "Gloves", + "examine": "A pair of steel-coloured gloves.", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "500", + "equipment_slot": "9", + "bonuses": "4,4,4,2,4,4,4,4,2,4,2,4,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7457", + "name": "Gloves", + "examine": "A pair of black-coloured gloves.", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "equipment_slot": "9", + "bonuses": "5,5,5,3,5,5,5,5,3,5,3,5,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7458", + "name": "Gloves", + "examine": "A pair of mithril-coloured gloves.", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "1500", + "equipment_slot": "9", + "bonuses": "6,6,6,3,6,6,6,6,3,6,3,6,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7459", + "name": "Gloves", + "examine": "A pair of adamant-coloured gloves.", + "low_alchemy": "1000", + "high_alchemy": "1500", + "shop_price": "2500", + "equipment_slot": "9", + "bonuses": "7,7,7,4,7,7,7,7,4,7,4,7,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7460", + "name": "Gloves", + "examine": "A pair of rune-coloured gloves.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "5000", + "equipment_slot": "9", + "bonuses": "8,8,8,4,8,8,8,8,4,8,4,8,0,0,0", + "requirements": "{1,13}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7461", + "name": "Gloves", + "examine": "A pair of dragon-coloured gloves.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "shop_price": "100000", + "equipment_slot": "9", + "bonuses": "9,9,9,5,9,9,9,9,5,9,5,9,0,0,0", + "requirements": "{1,41}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7462", + "name": "Gloves", + "examine": "A pair of Barrows-themed gloves.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "shop_price": "100000", + "equipment_slot": "9", + "bonuses": "12,12,12,6,12,12,12,12,6,12,6,12,0,0,0", + "requirements": "{1,41}", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7463", + "name": "Cornflour", + "examine": "It's cornflour in a pot.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7464", + "name": "Book on chickens", + "examine": "A tatty old book belonging to the Wise Old Man of Draynor Village.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7465", + "name": "Vanilla pod", + "examine": "Surprise, it looks like a vanilla pod.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7466", + "name": "Cornflour", + "examine": "It's cornflour in a pot.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7468", + "name": "Pot of cornflour", + "examine": "It's cornflour in a pot.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7470", + "name": "Cornflour mixture", + "examine": "A mixture of milk, cream and cornflour.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I'll have to get all the ingredients again.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7471", + "name": "Milky mixture", + "examine": "It's a bucket of milk and cream.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I'll have to get all the ingredients again.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7472", + "name": "Cinnamon", + "examine": "Some cinnamon sticks.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7476", + "name": "Brulee supreme", + "examine": "A pot of brulee supreme.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7477", + "name": "Evil chicken's egg", + "examine": "What came first, the chicken or...", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7478", + "name": "Dragon token", + "examine": "It's got a dragon on it.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I got this by killing a Black Dragon. It might be hard to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7479", + "name": "Spicy stew", + "examine": "It's a meat and potato stew with fancy seasoning.", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7480", + "name": "Red spice (4)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7481", + "name": "Red spice (3)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7482", + "name": "Red spice (2)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7483", + "name": "Red spice (1)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7484", + "name": "Orange spice (4)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7485", + "name": "Orange spice (3)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7486", + "name": "Orange spice (2)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7487", + "name": "Orange spice (1)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7488", + "name": "Brown spice (4)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7489", + "name": "Brown spice (3)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7490", + "name": "Brown spice (2)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7491", + "name": "Brown spice (1)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7492", + "name": "Yellow spice (4)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7493", + "name": "Yellow spice (3)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7494", + "name": "Yellow spice (2)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7495", + "name": "Yellow spice (1)", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7496", + "name": "Empty spice shaker", + "examine": "Allows for equal distribution of spice.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7497", + "name": "Dirty blast", + "examine": "A cool refreshing fruit mix. With ash in for some reason.", + "low_alchemy": "12", + "high_alchemy": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7498", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7499", + "name": "Evil dave", + "examine": "He seems to like wearing black.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7500", + "name": "Dwarf", + "examine": "A short angry guy.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7502", + "name": "Lumbridge guide", + "examine": "He provides new players with useful information.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7504", + "name": "Osman", + "examine": "He looks a little shifty.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7505", + "name": "Pirate pete", + "examine": "A shifty-looking character.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7506", + "name": "Sir amik varze", + "examine": "Leader of the White Knights.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7507", + "name": "Skrach", + "examine": "He's been frozen in time.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7508", + "name": "Asgoldian ale", + "examine": "There appears to be a coin in the bottom. Liked by dwarves.", + "high_alchemy": "1", + "shop_price": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7509", + "name": "Dwarven rock cake", + "examine": "Hot: A strange looking cake. Cooled: Cool and heavy as a brick. Only for dwarf consumption.", + "weight": "8.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7510", + "name": "Dwarven rock cake", + "examine": "Hot: A strange looking cake. Cooled: Cool and heavy as a brick. Only for dwarf consumption.", + "weight": "8.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7511", + "name": "Slop of compromise", + "examine": "Two out of two goblin generals prefer it!", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7512", + "name": "Soggy bread", + "examine": "Previously a nice crispy loaf of bread. Now just kind of icky.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7513", + "name": "Spicy maggots", + "examine": "They clearly taste so much better this way!", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7514", + "name": "Dyed orange", + "examine": "Orange slices which have been dyed, but it looks more like they died.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7515", + "name": "Breadcrumbs", + "examine": "Glad these aren't in my bed.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7516", + "name": "Kelp", + "examine": "Those leaves look useful!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7517", + "name": "Ground kelp", + "examine": "Kelp flakes. Smells of the sea.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7518", + "name": "Crab meat", + "examine": "A smelly meat.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7519", + "name": "Crab meat", + "examine": "A smelly meat.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7521", + "name": "Cooked crab meat", + "examine": "Nice and Tasty!", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "219", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7522", + "name": "Cooked crab meat", + "tradeable": "true", + "grand_exchange_price": "219", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7523", + "name": "Cooked crab meat", + "examine": "Nice and Tasty!", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "226", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7524", + "name": "Cooked crab meat", + "examine": "Nice and Tasty!", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "226", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7525", + "name": "Cooked crab meat", + "examine": "Nice and Tasty!", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "226", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7526", + "name": "Cooked crab meat", + "examine": "Nice and Tasty!", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "226", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7527", + "name": "Ground crab meat", + "examine": "A smelly paste.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7528", + "name": "Ground cod", + "examine": "A smelly paste.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7529", + "name": "Raw fishcake", + "examine": "Would taste nicer if I cooked it.", + "low_alchemy": "40", + "high_alchemy": "60", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7530", + "name": "Cooked fishcake", + "examine": "Mmmm, reminds me of the seaside.", + "low_alchemy": "40", + "high_alchemy": "60", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7532", + "name": "Mudskipper hide", + "examine": "Hmmm, what can I use this for?", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7534", + "name": "Fishbowl helmet", + "examine": "You'll look daft, but at least you won't drown!", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7535", + "name": "Diving apparatus", + "examine": "I'll need a helmet to make this work.", + "equipment_slot": "1", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7536", + "name": "Fresh crab claw", + "examine": "Fresh off the crab itself.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7537", + "name": "Crab claw", + "examine": "If it is good enough for crabs, it's good enough for me.", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,3,4,2,0,0,1,1,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7538", + "name": "Fresh crab shell", + "examine": "Fresh off the crab itself.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7539", + "name": "Crab helmet", + "examine": "If it's good enough for crabs, it's good enough for me!", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,4,5,3,-1,4,0,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7540", + "name": "Broken crab claw", + "examine": "Darn, it's useless now.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7541", + "name": "Broken crab shell", + "examine": "Darn, it's useless now.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7542", + "name": "Cake of guidance", + "examine": "Imbued with knowledge itself.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Maybe Traiborn will have another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7543", + "name": "Raw guide cake", + "examine": "Now all I need to do is cook it.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7544", + "name": "Enchanted egg", + "examine": "Egg containing knowledge.", + "low_alchemy": "1", + "high_alchemy": "2", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7545", + "name": "Enchanted milk", + "examine": "Guiding milk.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7546", + "name": "Enchanted flour", + "examine": "A pot of special flour.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7547", + "name": "Druid pouch", + "examine": "A druid pouch.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7548", + "name": "Potato seed", + "examine": "A potato seed - plant in an allotment.", + "tradeable": "true", + "shop_price": "8", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7549", + "name": "Potato seed", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7550", + "name": "Onion seed", + "examine": "An onion seed - plant in an allotment.", + "tradeable": "true", + "shop_price": "10", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7551", + "name": "Onion seed", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7552", + "name": "Mithril arrow", + "examine": "Arrows with mithril heads.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "shop_price": "76", + "grand_exchange_price": "24", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,22,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7553", + "name": "Mithril arrow", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7554", + "name": "Fire rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "16", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7555", + "name": "Fire rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7556", + "name": "Water rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7557", + "name": "Water rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7558", + "name": "Air rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "17", + "grand_exchange_price": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7559", + "name": "Air rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7560", + "name": "Chaos rune", + "examine": "Used for small missile spells.", + "tradeable": "true", + "low_alchemy": "18", + "high_alchemy": "28", + "shop_price": "140", + "grand_exchange_price": "65", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7561", + "name": "Chaos rune", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7562", + "name": "Tomato seed", + "examine": "A tomato seed - plant in an allotment.", + "tradeable": "true", + "shop_price": "10", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7563", + "name": "Tomato seed", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7564", + "name": "Balloon toad", + "examine": "An inflated toad tied to a rock like a balloon.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7565", + "name": "Balloon toad", + "examine": "An inflated toad tied to a rock like a balloon.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7566", + "name": "Raw jubbly", + "examine": "The uncooked meat of a Jubbly bird.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "422", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7567", + "name": "Raw jubbly", + "tradeable": "true", + "grand_exchange_price": "422", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7568", + "name": "Cooked jubbly", + "examine": "Lovely jubbly!", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "944", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7569", + "name": "Cooked jubbly", + "tradeable": "true", + "grand_exchange_price": "944", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7571", + "name": "Burnt jubbly", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7572", + "name": "Red banana", + "examine": "Like a banana only redder.", + "low_alchemy": "2", + "high_alchemy": "3", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7573", + "name": "Tchiki monkey nuts", + "examine": "Like monkey nuts only tchikier.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7574", + "name": "Sliced red banana", + "examine": "Perfect for stuffing snakes.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7575", + "name": "Tchiki nut paste", + "examine": "Mixing this with jam would just be wrong.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7576", + "name": "Snake corpse", + "examine": "Like a snake only not alive.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7577", + "name": "Raw stuffed snake", + "examine": "This snake is stuffed right up.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7578", + "name": "Odd stuffed snake", + "examine": "Is this really what you wanted to do?", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7579", + "name": "Stuffed snake", + "examine": "Fit for a Monkey King. (cooked)", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7581", + "name": "Overgrown hellcat", + "examine": "Your hellish pet cat!!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7582", + "name": "Hell cat", + "examine": "Your hellish pet cat!!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7583", + "name": "Hell-kitten", + "examine": "Your hellish pet cat!!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7585", + "name": "Wily hellcat", + "examine": "Your hellish pet cat!!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7586", + "name": "Dummy", + "examine": "I can train on this", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7587", + "name": "Coffin", + "examine": "Filled with items. Like a bank, but spookier!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7588", + "name": "Coffin", + "examine": "Filled with items. Like a bank, but spookier!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7589", + "name": "Coffin", + "examine": "Filled with items. Like a bank, but spookier!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7590", + "name": "Coffin", + "examine": "Filled with items. Like a bank, but spookier!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7591", + "name": "Coffin", + "examine": "Filled with items. Like a bank, but spookier!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7592", + "name": "Zombie shirt", + "examine": "Aside from the braaaains on the lapel, it's still quite good.", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7593", + "name": "Zombie trousers", + "examine": "Good for a shamble about town.", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7594", + "name": "Zombie mask", + "examine": "I look 40,000 years old in this...", + "low_alchemy": "8", + "high_alchemy": "12", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7595", + "name": "Zombie gloves", + "examine": "Smells pretty funky.", + "low_alchemy": "8", + "high_alchemy": "12", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7596", + "name": "Zombie boots", + "examine": "Thrilling.", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "160", + "equipment_slot": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7597", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7598", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7599", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7600", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7601", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7602", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7603", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7604", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7605", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7606", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7607", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7608", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7609", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7610", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7611", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7612", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7613", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7614", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7615", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7616", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7617", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7618", + "name": "Item", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7620", + "name": "Silvthrill rod", + "examine": "A silvery rod of mithril and silver with sapphire on top.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7622", + "name": "Bucket of rubble", + "examine": "A bucket partially filled with rubble. / A bucket totally filled with rubble.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7624", + "name": "Bucket of rubble", + "examine": "A bucket partially filled with rubble. / A bucket totally filled with rubble.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7626", + "name": "Bucket of rubble", + "examine": "A bucket partially filled with rubble. / A bucket totally filled with rubble.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7628", + "name": "Plaster fragment", + "examine": "A fragment of plaster with some impressions on it.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another plaster fragment by exploring near the Inn in Burgh de Rott.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7629", + "name": "Dusty scroll", + "examine": "An ancient tattered scroll.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another scroll by exploring near the Inn in Burgh de Rott.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7632", + "name": "Temple library key", + "examine": "A key for the Temple Library. (In Aid of the Myreque)", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another temple key by talking to Drezel.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7633", + "name": "Ancient book", + "examine": "The unholy book of a forgotten god.", + "destroy_message": "You can get another Ancient Book by searching the library in the temple on the Salve.", + "shop_price": "5000", + "bonuses": "4,4,4,6,0,4,4,4,6,0,2,0,0,5,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7634", + "name": "Battered tome", + "examine": "An ancient history book.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Crumbling tome by searching the library in the temple on the Salve.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7635", + "name": "Leather book", + "examine": "An ancient leather-bound tome.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Leather book by searching the library in the temple on the Salve.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7636", + "name": "Rod dust", + "examine": "Rod of Ivandis dust.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7637", + "name": "Silvthrill rod", + "examine": "A silvery rod of mithril and silver with sapphire on top.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7638", + "name": "Silvthrill rod", + "examine": "A silvery rod of mithril and silver with sapphire on top.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7639", + "name": "Rod of ivandis(10)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7640", + "name": "Rod of ivandis(9)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7641", + "name": "Rod of ivandis(8)", + "examine": "A fully charged rod. (if less than 10) A partialy charged rod.", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7642", + "name": "Rod of ivandis(7)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7643", + "name": "Rod of ivandis(6)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7644", + "name": "Rod of ivandis(5)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7645", + "name": "Rod of ivandis(4)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7646", + "name": "Rod of ivandis(3)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7647", + "name": "Rod of ivandis(2)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7648", + "name": "Rod of ivandis(1)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "1", + "has_special": "true", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7649", + "name": "Rod clay mould", + "examine": "Rod of Ivandis mould.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "You can make another one of these by using clay on Ivandis' coffin.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7650", + "name": "Silver dust", + "examine": "It's ground up silver.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "316", + "weight": "0.33", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7651", + "name": "Silver dust", + "tradeable": "true", + "grand_exchange_price": "316", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7652", + "name": "Guthix balance(unf)", + "grand_exchange_price": "96", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7653", + "name": "Guthix balance(unf)", + "tradeable": "true", + "grand_exchange_price": "96", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7654", + "name": "Guthix balance(unf)", + "grand_exchange_price": "77", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7655", + "name": "Guthix balance(unf)", + "tradeable": "true", + "grand_exchange_price": "77", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7656", + "name": "Guthix balance(unf)", + "grand_exchange_price": "58", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7657", + "name": "Guthix balance(unf)", + "tradeable": "true", + "grand_exchange_price": "58", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7658", + "name": "Guthix balance(unf)", + "grand_exchange_price": "30", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7659", + "name": "Guthix balance(unf)", + "tradeable": "true", + "grand_exchange_price": "30", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7660", + "name": "Guthix balance(4)", + "examine": "A potion of harralander, red spiders eggs, garlic and silver dust.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "140", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7661", + "name": "Guthix balance(4)", + "tradeable": "true", + "grand_exchange_price": "140", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7662", + "name": "Guthix balance(3)", + "examine": "A potion of harralander, red spiders eggs, garlic and silver dust.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "168", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7663", + "name": "Guthix balance(3)", + "tradeable": "true", + "grand_exchange_price": "168", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7664", + "name": "Guthix balance(2)", + "examine": "A potion of harralander, red spiders eggs, garlic and silver dust.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "132", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7665", + "name": "Guthix balance(2)", + "tradeable": "true", + "grand_exchange_price": "132", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7666", + "name": "Guthix balance(1)", + "examine": "A potion of harralander, red spiders eggs, garlic and silver dust.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "66", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7667", + "name": "Guthix balance(1)", + "tradeable": "true", + "grand_exchange_price": "66", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7668", + "name": "Gadderhammer", + "examine": "A specially crafted hammer with strange markings on it.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "3000", + "grand_exchange_price": "1615", + "stand_anim": "1662", + "stand_turn_anim": "823", + "walk_anim": "1663", + "run_anim": "1664", + "turn180_anim": "1663", + "turn90cw_anim": "1663", + "turn90ccw_anim": "1663", + "render_anim": "27", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-4,-4,35,-4,0,0,0,0,0,0,0,35,0,0,0", + "weapon_interface": "10", + "two_handed": "true", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7669", + "name": "Gadderhammer", + "tradeable": "true", + "grand_exchange_price": "1615", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7671", + "name": "Boxing gloves", + "examine": "I think they look a bit silly.", + "stand_anim": "3677", + "stand_turn_anim": "823", + "walk_anim": "3680", + "run_anim": "824", + "turn180_anim": "3680", + "turn90cw_anim": "3680", + "turn90ccw_anim": "3680", + "render_anim": "1386", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "weapon_interface": "9", + "two_handed": "true", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7673", + "name": "Boxing gloves", + "examine": "I think they look a bit silly.", + "stand_anim": "3677", + "stand_turn_anim": "823", + "walk_anim": "3680", + "run_anim": "824", + "turn180_anim": "3680", + "turn90cw_anim": "3680", + "turn90ccw_anim": "3680", + "render_anim": "1386", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "weapon_interface": "9", + "two_handed": "true", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7675", + "name": "Wooden sword", + "examine": "A less-than razor sharp sword.", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,3,-2,0,0,0,2,1,0,0,0,5,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7676", + "name": "Wooden shield", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7677", + "name": "Treasure stone", + "examine": "It knows where the treasure is.", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7678", + "name": "Prize key", + "examine": "You can use this to open the prize chest!", + "shop_price": "160", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7679", + "name": "Pugel", + "examine": "A good tool for bashing someone.", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7680", + "name": "Pugel", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7681", + "name": "Game book", + "examine": "Party Pete's Bumper Book Of Games", + "tradeable": "true", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7682", + "name": "Hoop", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7683", + "name": "Hoop", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7684", + "name": "Dart", + "equipment_slot": "3", + "attack_speed": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7685", + "name": "Dart", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7686", + "name": "Bow and arrow", + "equipment_slot": "3", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7687", + "name": "Bow and arrow", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7688", + "name": "Kettle", + "examine": "The kettle is empty.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7689", + "name": "Kettle", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7690", + "name": "Full kettle", + "examine": "It's full of cold water.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7691", + "name": "Hot kettle", + "examine": "It's full of boiling water.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7692", + "name": "Pot of tea (4)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7693", + "name": "Pot of tea (4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7694", + "name": "Pot of tea (3)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7695", + "name": "Pot of tea (3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7696", + "name": "Pot of tea (2)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7697", + "name": "Pot of tea (2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7698", + "name": "Pot of tea (1)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7699", + "name": "Pot of tea (1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7700", + "name": "Teapot with leaves", + "examine": "Add boiling water to make a tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7701", + "name": "Teapot with leaves", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7702", + "name": "Teapot", + "examine": "This teapot is empty.", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7703", + "name": "Teapot", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7704", + "name": "Pot of tea (4)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7705", + "name": "Pot of tea (4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7706", + "name": "Pot of tea (3)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7707", + "name": "Pot of tea (3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7708", + "name": "Pot of tea (2)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7709", + "name": "Pot of tea (2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7710", + "name": "Pot of tea (1)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7711", + "name": "Pot of tea (1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7712", + "name": "Teapot with leaves", + "examine": "Add boiling water to make a tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7713", + "name": "Teapot with leaves", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7714", + "name": "Teapot", + "examine": "This teapot is empty.", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7715", + "name": "Teapot", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7716", + "name": "Pot of tea (4)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7717", + "name": "Pot of tea (4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7718", + "name": "Pot of tea (3)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7719", + "name": "Pot of tea (3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7720", + "name": "Pot of tea (2)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7721", + "name": "Pot of tea (2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7722", + "name": "Pot of tea (1)", + "examine": "I'd really like a nice cup of tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7723", + "name": "Pot of tea (1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7724", + "name": "Teapot with leaves", + "examine": "Add boiling water to make a tea.", + "weight": "1.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7725", + "name": "Teapot with leaves", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7726", + "name": "Teapot", + "examine": "This teapot is empty.", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7727", + "name": "Teapot", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7728", + "name": "Empty cup", + "examine": "An empty cup.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "1", + "grand_exchange_price": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7729", + "name": "Empty cup", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7730", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7731", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7732", + "name": "Porcelain cup", + "examine": "A porcelain cup.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7733", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7734", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7735", + "name": "Porcelain cup", + "examine": "A porcelain cup.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7736", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7737", + "name": "Cup of tea", + "examine": "A nice cup of tea.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "30", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7738", + "name": "Tea leaves", + "examine": "Mmm, how about a nice cup of tea?", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7739", + "name": "Tea leaves", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7740", + "name": "Beer", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "151", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7741", + "name": "Beer", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7742", + "name": "Beer glass", + "examine": "I need to fill this with beer.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "1", + "grand_exchange_price": "25", + "weight": "0.05", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7743", + "name": "Beer glass", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7744", + "name": "Asgarnian ale", + "examine": "Probably the finest readily-available ale in Asgarnia.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "131", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7745", + "name": "Asgarnian ale", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7746", + "name": "Greenman's ale", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "569", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7747", + "name": "Greenman's ale", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7748", + "name": "Dragon bitter", + "examine": "A glass of bitter.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "523", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7749", + "name": "Dragon bitter", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7750", + "name": "Moonlight mead", + "examine": "A foul smelling brew.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "14", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7751", + "name": "Moonlight mead", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7752", + "name": "Cider", + "examine": "A glass of Cider", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "1539", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7753", + "name": "Cider", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7754", + "name": "Chef's delight", + "examine": "A fruity, full-bodied ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "2371", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7755", + "name": "Chef's delight", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7756", + "name": "Paintbrush", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7757", + "name": "Paintbrush", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7758", + "name": "Rusty sword", + "examine": "A decent-enough weapon gone rusty.", + "equipment_slot": "3", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7759", + "name": "Toy soldier", + "examine": "Nice bit of crafting.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "grand_exchange_price": "3140", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7760", + "name": "Toy soldier", + "tradeable": "true", + "grand_exchange_price": "3140", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7761", + "name": "Toy soldier (wound)", + "examine": "Nice bit of crafting.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "grand_exchange_price": "3123", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7762", + "name": "Toy soldier (wound)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7763", + "name": "Toy doll", + "examine": "In inventory: Nice bit of crafting! When released: Nice bit of crafting that...", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "3236", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7764", + "name": "Toy doll", + "tradeable": "true", + "grand_exchange_price": "3236", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7765", + "name": "Toy doll (wound)", + "examine": "In inventory: Nice bit of crafting! When released: Nice bit of crafting that...", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "3289", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7766", + "name": "Toy doll (wound)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7767", + "name": "Toy mouse", + "examine": "Nice bit of crafting!", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "1705", + "grand_exchange_price": "3384", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7768", + "name": "Toy mouse", + "tradeable": "true", + "grand_exchange_price": "3384", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7769", + "name": "Toy mouse (wound)", + "examine": "Nice bit of crafting!", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "1705", + "grand_exchange_price": "3484", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7770", + "name": "Toy mouse (wound)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7771", + "name": "Clockwork cat", + "examine": "Inventory: Nice bit of crafting!As a follower: An amazing piece of crafting.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "grand_exchange_price": "2930", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7772", + "name": "Clockwork cat", + "tradeable": "true", + "grand_exchange_price": "2930", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7773", + "name": "Branch", + "examine": "I can use this to make a lyre.", + "equipment_slot": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7774", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7775", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7776", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7777", + "name": "Long vine", + "examine": "A long section of vine made up of lots of shorter sections.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7778", + "name": "Short vine", + "examine": "A short section of vines.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7779", + "name": "Fishing tome", + "examine": "A tome of learning that focuses on the Fishing skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7780", + "name": "Fishing tome", + "examine": "A tome of learning that focuses on the Fishing skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7781", + "name": "Fishing tome", + "examine": "A tome of learning that focuses on the Fishing skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7782", + "name": "Agility tome", + "examine": "A tome of learning that focuses on Agility.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7783", + "name": "Agility tome", + "examine": "A tome of learning that focuses on Agility.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7784", + "name": "Agility tome", + "examine": "A tome of learning that focuses on Agility.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7785", + "name": "Thieving tome", + "examine": "A tome of learning that focuses on the Thieving skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7786", + "name": "Thieving tome", + "examine": "A tome of learning that focuses on the Thieving skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7787", + "name": "Thieving tome", + "examine": "A tome of learning that focuses on the Thieving skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7788", + "name": "Slayer tome", + "examine": "A tome of learning which focuses on the Slayer skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7789", + "name": "Slayer tome", + "examine": "A tome of learning which focuses on the Slayer skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7790", + "name": "Slayer tome", + "examine": "A tome of learning which focuses on the Slayer skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7791", + "name": "Mining tome", + "examine": "A tome of learning that focuses on the Mining skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "160", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7792", + "name": "Mining tome", + "examine": "A tome of learning that focuses on the Mining skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "160", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7793", + "name": "Mining tome", + "examine": "A tome of learning that focuses on the Mining skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "160", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7794", + "name": "Firemaking tome", + "examine": "A tome of learning that focuses on Firemaking.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7795", + "name": "Firemaking tome", + "examine": "A tome of learning that focuses on Firemaking.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7796", + "name": "Firemaking tome", + "examine": "A tome of learning that focuses on Firemaking.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7797", + "name": "Woodcutting tome", + "examine": "A tome of learning that focuses on the Woodcutting skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "160", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7798", + "name": "Woodcutting tome", + "examine": "A tome of learning that focuses on the Woodcutting skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "160", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7799", + "name": "Woodcutting tome", + "examine": "A tome of learning that focuses on the Woodcutting skill.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "160", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7800", + "name": "Snail shell", + "examine": "A shell from a giant snail.", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7801", + "name": "Snake hide", + "examine": "Scaly but not slimy!", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "grand_exchange_price": "1618", + "weight": "0.5", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7802", + "name": "Snake hide", + "tradeable": "true", + "grand_exchange_price": "1618", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7803", + "name": "Yin yang amulet", + "examine": "A non-magical copy of the make-over mage's amulet.", + "shop_price": "100", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7804", + "name": "Picture", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "0,0,11,0,0,0,0,0,0,0,0,14,0,0,0", + "weapon_interface": "3", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7805", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7806", + "name": "Anger sword", + "examine": "A heavy duty sword.", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "20,20,20,0,0,0,2,1,0,0,0,5,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,390,390,390", + "defence_anim": "397", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7807", + "name": "Anger battleaxe", + "examine": "A heavy duty axe.", + "equipment_slot": "3", + "bonuses": "20,20,20,0,0,0,0,0,0,-1,0,13,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7808", + "name": "Anger mace", + "examine": "A heavy duty mace.", + "equipment_slot": "3", + "bonuses": "20,20,20,0,0,0,0,0,0,0,0,5,1,0,0", + "weapon_interface": "8", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7809", + "name": "Anger spear", + "examine": "A heavy duty spear.", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "20,20,20,0,0,1,1,0,0,0,0,6,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7810", + "name": "Jug of vinegar", + "examine": "This wine clearly did not age well.", + "shop_price": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7811", + "name": "Pot of vinegar", + "examine": "Well, this pot is certainly full of vinegar and no mistake.", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7812", + "name": "Goblin skull", + "examine": "This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7813", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7814", + "name": "Goblin skull", + "examine": "This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7815", + "name": "Bear ribs", + "examine": "This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7816", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7817", + "name": "Bear ribs", + "examine": "This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7818", + "name": "Ram skull", + "examine": "Unpolished: This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7819", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7820", + "name": "Ram skull", + "examine": "Unpolished: This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7821", + "name": "Unicorn bone", + "examine": "This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7822", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7823", + "name": "Unicorn bone", + "examine": "This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7824", + "name": "Giant rat bone", + "examine": "This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7825", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7826", + "name": "Giant rat bone", + "examine": "This needs a good polish.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7827", + "name": "Giant bat wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7828", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7829", + "name": "Giant bat wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7830", + "name": "Wolf bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7831", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7832", + "name": "Wolf bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7833", + "name": "Bat wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7834", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7835", + "name": "Bat wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7836", + "name": "Rat bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7837", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7838", + "name": "Rat bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7839", + "name": "Baby dragon bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7840", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7841", + "name": "Baby dragon bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7842", + "name": "Ogre ribs", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7843", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7844", + "name": "Ogre ribs", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7845", + "name": "Jogre bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7846", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7847", + "name": "Jogre bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7848", + "name": "Zogre bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7849", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7850", + "name": "Zogre bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7851", + "name": "Mogre bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7852", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7853", + "name": "Mogre bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7854", + "name": "Monkey paw", + "examine": "This needs a good polish./ This belongs in a museum!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7855", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7856", + "name": "Monkey paw", + "examine": "This needs a good polish./ This belongs in a museum!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7857", + "name": "Dagannoth ribs", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7858", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7859", + "name": "Dagannoth ribs", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7860", + "name": "Snake spine", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7861", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7862", + "name": "Snake spine", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7863", + "name": "Zombie bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7864", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7865", + "name": "Zombie bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7866", + "name": "Werewolf bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7867", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7868", + "name": "Werewolf bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7869", + "name": "Moss giant bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7870", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7871", + "name": "Moss giant bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7872", + "name": "Fire giant bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7873", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7874", + "name": "Fire giant bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7875", + "name": "Ice giant ribs", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7876", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7877", + "name": "Ice giant ribs", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7878", + "name": "Terrorbird wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7879", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7880", + "name": "Terrorbird wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7881", + "name": "Ghoul bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7882", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7883", + "name": "Ghoul bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7884", + "name": "Troll bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7885", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7886", + "name": "Troll bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7887", + "name": "Seagull wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7888", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7889", + "name": "Seagull wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7890", + "name": "Undead cow ribs", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7891", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7892", + "name": "Undead cow ribs", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7893", + "name": "Experiment bone", + "examine": "Unpolished: This needs a good polish. Polished: This bone belongs in a museum!", + "shop_price": "160", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7894", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7895", + "name": "Experiment bone", + "examine": "Unpolished: This needs a good polish. Polished: This bone belongs in a museum!", + "shop_price": "160", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7896", + "name": "Rabbit bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7897", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7898", + "name": "Rabbit bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7899", + "name": "Basilisk bone", + "examine": "Dirty:This bone needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7900", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7901", + "name": "Basilisk bone", + "examine": "Dirty:This bone needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7902", + "name": "Desert lizard bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7903", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7904", + "name": "Desert lizard bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7905", + "name": "Cave goblin skull", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7906", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7907", + "name": "Cave goblin skull", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7908", + "name": "Big frog leg", + "examine": "This needs a good polish.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7909", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7910", + "name": "Big frog leg", + "examine": "This needs a good polish.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7911", + "name": "Vulture wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7912", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7913", + "name": "Vulture wing", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7914", + "name": "Jackal bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7915", + "name": "Bone in vinegar", + "examine": "See article", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7916", + "name": "Jackal bone", + "examine": "This needs a good polish.", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7917", + "name": "Ram skull helm", + "examine": "Makes me feel baaad to the bone.", + "destroy_message": "The ram skull helm looks like it will fall apart if you drop it. You would have to go to the Odd Old Man for a replacement.", + "equipment_slot": "0", + "bonuses": "0,0,0,0,-2,19,21,16,0,19,6,0,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7918", + "name": "Bonesack", + "examine": "The Bonesack is a little old item that protects like leather.", + "destroy_message": "The bonesack looks like it will fall apart if you drop it. You would have to go to the Odd Old Man for a replacement.", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,4,4,4,4,4,4,0,0,0,0", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7919", + "name": "Bottle of wine", + "examine": "A very good vintage.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "500", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7920", + "name": "Bottle of wine", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7921", + "name": "Empty wine bottle", + "examine": "This one has clearly been taken down and passed around.", + "high_alchemy": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7922", + "name": "Al kharid flyer", + "examine": "The money off voucher has expired.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7927", + "name": "Easter ring", + "examine": "A ring given to you by the Easter Bunny.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7928", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7929", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7930", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7931", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7932", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7933", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7934", + "name": "Field ration", + "examine": "A field ration to help your wounds go away.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "390", + "grand_exchange_price": "171", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7935", + "name": "Field ration", + "tradeable": "true", + "grand_exchange_price": "171", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7936", + "name": "Pure essence", + "examine": "An uncharged Rune Stone of extra capability.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "1", + "grand_exchange_price": "109", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7937", + "name": "Pure essence", + "tradeable": "true", + "grand_exchange_price": "109", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7939", + "name": "Tortoise shell", + "examine": "A word in your shell-like.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "13600", + "weight": "6.8", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7940", + "name": "Tortoise shell", + "tradeable": "true", + "grand_exchange_price": "13600", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7941", + "name": "Iron sheet", + "examine": "A sturdy sheet of iron.", + "low_alchemy": "12", + "high_alchemy": "18", + "weight": "1.75", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7942", + "name": "Fresh monkfish", + "examine": "Perfect for storing. Not so good for eating.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7943", + "name": "Fresh monkfish", + "examine": "Perfect for storing. Not so good for eating.", + "low_alchemy": "4", + "high_alchemy": "6", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7944", + "name": "Raw monkfish", + "examine": "I should try cooking this./Freshly caught. Needs cooking. (Fresh Monkfish)", + "tradeable": "true", + "low_alchemy": "92", + "high_alchemy": "138", + "grand_exchange_price": "618", + "weight": "0.4", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7945", + "name": "Raw monkfish", + "tradeable": "true", + "grand_exchange_price": "618", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7946", + "name": "Monkfish", + "examine": "A tasty fish.", + "tradeable": "true", + "low_alchemy": "92", + "high_alchemy": "138", + "grand_exchange_price": "617", + "weight": "0.4", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7947", + "name": "Monkfish", + "tradeable": "true", + "grand_exchange_price": "617", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7949", + "name": "Burnt monkfish", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7950", + "name": "Bone seeds", + "examine": "A highly portable army of skeletal magic.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7951", + "name": "Herman's book", + "examine": "A book taken from the desk of Herman Caranos.", + "destroy": "true", + "tradeable": "false", + "shop_price": "160", + "weight": "0.09", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7952", + "name": "Picture", + "examine": "Useless without the head.", + "tradeable": "true", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7953", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7955", + "name": "Burnt shrimp", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7956", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7957", + "name": "White apron", + "examine": "A mostly clean apron.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "169", + "weight": "0.45", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7958", + "name": "Mining prop", + "examine": "A prop for holding up a tunnel roof.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7959", + "name": "Heavy box", + "examine": "A box full of stolen Etceterian items.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get your box back by talking to the guard by the dungeon entrance in Etceteria.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7960", + "name": "Empty box", + "examine": "It says 'To the dungeons' on the side.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7961", + "name": "Burnt diary", + "examine": "A diary with one/two/three/four/five page(s).", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7962", + "name": "Burnt diary", + "examine": "A diary with one/two/three/four/five page(s).", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7963", + "name": "Burnt diary", + "examine": "A diary with one/two/three/four/five page(s).", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7964", + "name": "Burnt diary", + "examine": "A diary with one/two/three/four/five page(s).", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7965", + "name": "Burnt diary", + "examine": "A diary with one/two/three/four/five page(s).", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7967", + "name": "Engine", + "examine": "A dwarf-made coal engine. It looks very sturdy.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7969", + "name": "Pulley beam", + "examine": "A beam with a pulley attached.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7970", + "name": "Long pulley beam", + "examine": "A long beam with a pulley attached.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7971", + "name": "Longer pulley beam", + "examine": "A very long beam with a pulley attached.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7972", + "name": "Lift manual", + "examine": "The manual for an AMCE Lift-In-A-Box.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7973", + "name": "Beam", + "examine": "A wooden beam.", + "low_alchemy": "2", + "high_alchemy": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7975", + "name": "Crawling hand", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7976", + "name": "Cockatrice head", + "examine": "I should get it stuffed!", + "low_alchemy": "800", + "high_alchemy": "1200", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7977", + "name": "Basilisk head", + "examine": "I should get it stuffed!", + "low_alchemy": "1600", + "high_alchemy": "2400", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7978", + "name": "Kurask head", + "examine": "I should get it stuffed!", + "low_alchemy": "2400", + "high_alchemy": "3600", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7979", + "name": "Abyssal head", + "examine": "I should get it stuffed!", + "low_alchemy": "4800", + "high_alchemy": "7200", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7980", + "name": "Kbd heads", + "examine": "I should get it stuffed!", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7981", + "name": "Kq head", + "examine": "I should get it stuffed!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7982", + "name": "Crawling hand", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7983", + "name": "Cockatrice head", + "examine": "I should get it stuffed!", + "low_alchemy": "800", + "high_alchemy": "1200", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7984", + "name": "Basilisk head", + "examine": "I should get it stuffed!", + "low_alchemy": "1600", + "high_alchemy": "2400", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7985", + "name": "Kurask head", + "examine": "I should get it stuffed!", + "low_alchemy": "2400", + "high_alchemy": "3600", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7986", + "name": "Abyssal head", + "examine": "I should get it stuffed!", + "low_alchemy": "4800", + "high_alchemy": "7200", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7987", + "name": "Kbd heads", + "examine": "I should get it stuffed!", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7988", + "name": "Kq head", + "examine": "I should get it stuffed!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7989", + "name": "Big bass", + "examine": "Whopper! I should get this stuffed!", + "low_alchemy": "400", + "high_alchemy": "600", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7990", + "name": "Big bass", + "examine": "Whopper! I should get this stuffed!", + "low_alchemy": "400", + "high_alchemy": "600", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7991", + "name": "Big swordfish", + "examine": "Whopper! I should get this stuffed!", + "low_alchemy": "1000", + "high_alchemy": "1500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7992", + "name": "Big swordfish", + "examine": "Whopper! I should get this stuffed!", + "low_alchemy": "1000", + "high_alchemy": "1500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7993", + "name": "Big shark", + "examine": "Its a monster! I should get this stuffed!", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "0.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7994", + "name": "Big shark", + "examine": "Its a monster! I should get this stuffed!", + "low_alchemy": "2000", + "high_alchemy": "3000", + "weight": "0.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7995", + "name": "Arthur portrait", + "examine": "A portrait of King Arthur.", + "low_alchemy": "400", + "high_alchemy": "600", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7996", + "name": "Elena portrait", + "examine": "A portrait of Elena.", + "shop_price": "1000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7997", + "name": "Keldagrim portrait", + "examine": "A painting of the staute of King Alvis of Keldagrim", + "low_alchemy": "400", + "high_alchemy": "600", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "7998", + "name": "Misc. portrait", + "examine": "A portrait of Prince Brand and Princess Astrid of Miscellania.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8000", + "name": "Isafdar painting", + "examine": "The exotic land of the Elves.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "2000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8001", + "name": "Karamja painting", + "examine": "The tropical coast of karamja.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "2000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8002", + "name": "Lumbridge painting", + "examine": "Oxtable's famous painting of the Lumbridge water mill.", + "shop_price": "2000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8003", + "name": "Morytania painting", + "examine": "A painting of the spooky forests of morytania.", + "shop_price": "2000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8007", + "name": "Varrock teleport", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "low_alchemy": "1699", + "high_alchemy": "1700", + "shop_price": "2500", + "grand_exchange_price": "1341", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8008", + "name": "Lumbridge teleport", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "low_alchemy": "1699", + "high_alchemy": "1700", + "shop_price": "2500", + "grand_exchange_price": "1371", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8009", + "name": "Falador teleport", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "low_alchemy": "1699", + "high_alchemy": "1700", + "destroy": "true", + "shop_price": "2500", + "grand_exchange_price": "1414", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8010", + "name": "Camelot teleport", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "low_alchemy": "1699", + "high_alchemy": "1700", + "shop_price": "2500", + "grand_exchange_price": "1369", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8011", + "name": "Ardougne teleport", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "low_alchemy": "1699", + "high_alchemy": "1700", + "shop_price": "2500", + "grand_exchange_price": "1511", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8012", + "name": "Watchtower t'port", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "low_alchemy": "1699", + "high_alchemy": "1700", + "shop_price": "2500", + "grand_exchange_price": "1025", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8013", + "name": "Teleport to house", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "1426", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8014", + "name": "Bones to bananas", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "360", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8015", + "name": "Bones to peaches", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "620", + "ge_buy_limit": "200", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8016", + "name": "Enchant sapphire", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "343", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8017", + "name": "Enchant emerald", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "409", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8018", + "name": "Enchant ruby", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "207", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8019", + "name": "Enchant diamond", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "326", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8020", + "name": "Enchant dragonstn.", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "250", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8021", + "name": "Enchant onyx", + "examine": "A tablet containing a magic spell.", + "tradeable": "true", + "grand_exchange_price": "31", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8031", + "name": "Wooden bed", + "grand_exchange_price": "1918", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8032", + "name": "Oak bed", + "grand_exchange_price": "1631", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8033", + "name": "Large oak bed", + "grand_exchange_price": "1388", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8034", + "name": "Teak bed", + "grand_exchange_price": "1376", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8035", + "name": "Large teak bed", + "grand_exchange_price": "1996", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8036", + "name": "4-poster", + "grand_exchange_price": "1314", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8037", + "name": "Gilded 4-poster", + "grand_exchange_price": "274779", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8038", + "name": "Shoe box", + "grand_exchange_price": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8039", + "name": "Oak drawers", + "grand_exchange_price": "42", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8040", + "name": "Oak wardrobe", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8041", + "name": "Teak drawers", + "grand_exchange_price": "126", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8042", + "name": "Teak wardrobe", + "grand_exchange_price": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8043", + "name": "Mahogany 'drobe", + "grand_exchange_price": "102", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8044", + "name": "Gilded wardrobe", + "grand_exchange_price": "139452", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8045", + "name": "Shaving stand", + "grand_exchange_price": "510", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8046", + "name": "Oak shaving stand", + "grand_exchange_price": "449", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8047", + "name": "Oak dresser", + "grand_exchange_price": "147", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8048", + "name": "Teak dresser", + "grand_exchange_price": "478", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8049", + "name": "Fancy teak dresser", + "grand_exchange_price": "456", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8050", + "name": "Mahogany dresser", + "grand_exchange_price": "404", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8051", + "name": "Gilded dresser", + "grand_exchange_price": "140594", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8052", + "name": "Oak clock", + "grand_exchange_price": "367", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8053", + "name": "Teak clock", + "grand_exchange_price": "552", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8054", + "name": "Gilded clock", + "grand_exchange_price": "154310", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8085", + "name": "Suit of armour", + "examine": "When unanimated: A dusty old suit of armour. When animated: Aaargh, it's alive!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8108", + "name": "Wooden bench", + "grand_exchange_price": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8109", + "name": "Oak bench", + "grand_exchange_price": "131", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8110", + "name": "Carved oak bench", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8111", + "name": "Teak dining bench", + "grand_exchange_price": "17", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8112", + "name": "Carved teak bench", + "grand_exchange_price": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8113", + "name": "Mahogany bench", + "grand_exchange_price": "145", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8114", + "name": "Gilded bench", + "grand_exchange_price": "531526", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8115", + "name": "Wood dining table", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8116", + "name": "Oak dining table", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8117", + "name": "Carved oak table", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8118", + "name": "Teak table", + "grand_exchange_price": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8119", + "name": "Carved teak table", + "grand_exchange_price": "249", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8120", + "name": "Mahogany table", + "grand_exchange_price": "497", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8121", + "name": "Opulent table", + "grand_exchange_price": "394177", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8128", + "name": "Candles", + "examine": "A candle.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "shop_price": "24", + "grand_exchange_price": "104", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8131", + "name": "Skeleton guard", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8132", + "name": "Guard dog", + "examine": "He doesn't seem pleased to see me./Beware of the dog! (Construction)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8133", + "name": "Hobgoblin guard", + "examine": "He doesn't look very welcoming.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8134", + "name": "Baby red dragon", + "examine": "Young but still dangerous.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8135", + "name": "Huge spider", + "examine": "No spider could grow that big! It's unrealistic!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8137", + "name": "Hellhound", + "examine": "(Level 122)", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8139", + "name": "Kalphite soldier", + "examine": "I don't think insect repellent will work...", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8140", + "name": "Tok-xil", + "examine": "The Tok-Xil fires deadly spines out of its arm, projected by its own heat.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8142", + "name": "Steel dragon", + "examine": "Its scales seem to be made of steel.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8203", + "name": "Thorny hedge", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8204", + "name": "Nice hedge", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8205", + "name": "Small box hedge", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8206", + "name": "Topiary hedge", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "shop_price": "20000", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8207", + "name": "Fancy hedge", + "examine": "You can plant this in your garden.", + "low_alchemy": "10000", + "high_alchemy": "15000", + "shop_price": "25000", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8208", + "name": "Tall fancy hedge", + "examine": "You can plant this in your garden.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "50000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8210", + "name": "Rosemary", + "examine": "Some rosemary.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "20", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8214", + "name": "Marigolds", + "examine": "A bunch of marigolds.", + "tradeable": "true", + "grand_exchange_price": "3862", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8239", + "name": "Beer barrel", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8240", + "name": "Cider barrel", + "grand_exchange_price": "16860", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8241", + "name": "Asgarnian ale", + "examine": "Probably the finest readily-available ale in Asgarnia.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "131", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8242", + "name": "Greenman's ale", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "569", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8243", + "name": "Dragon bitter", + "examine": "A glass of bitter.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "523", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8244", + "name": "Chef's delight", + "examine": "A fruity, full-bodied ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "2371", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8246", + "name": "Wood kitchen table", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8247", + "name": "Oak kitchen table", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8248", + "name": "Teak kitchen table", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8260", + "name": "Crawling hand", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8261", + "name": "Cockatrice head", + "examine": "I should get it stuffed!", + "low_alchemy": "800", + "high_alchemy": "1200", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8262", + "name": "Basilisk head", + "examine": "I should get it stuffed!", + "low_alchemy": "1600", + "high_alchemy": "2400", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8263", + "name": "Kurask head", + "examine": "I should get it stuffed!", + "low_alchemy": "2400", + "high_alchemy": "3600", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8264", + "name": "Abyssal head", + "examine": "I should get it stuffed!", + "low_alchemy": "4800", + "high_alchemy": "7200", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8265", + "name": "Kbd heads", + "examine": "I should get it stuffed!", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8266", + "name": "Kq head", + "examine": "I should get it stuffed!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8272", + "name": "Runite armour", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8279", + "name": "Silverlight", + "examine": "The magical sword 'Silverlight'. / The magical sword 'Silverlight', stained black with mushroom ink. (during Shadow of the Storm)", + "low_alchemy": "20", + "high_alchemy": "30", + "attack_speed": "5", + "bonuses": "9,14,-2,0,0,0,3,2,1,0,0,12,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8280", + "name": "Excalibur", + "examine": "This used to belong to King Arthur.", + "low_alchemy": "80", + "high_alchemy": "120", + "attack_speed": "5", + "bonuses": "20,29,-2,0,0,0,3,2,1,0,0,25,0,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8281", + "name": "Darklight", + "examine": "The magical sword Silverlight, enhanced with the blood of Agrith-Naar.", + "low_alchemy": "200", + "high_alchemy": "300", + "attack_speed": "5", + "bonuses": "10,16,-2,0,0,0,3,2,2,0,0,13,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8282", + "name": "Anti-dragon shield", + "examine": "This provides partial protection from dragon-breath attacks.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "305", + "bonuses": "0,0,0,0,0,7,9,8,2,8,0,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8283", + "name": "Amulet of glory", + "examine": "Uncharged: A very powerful dragonstone amulet. 1-4 charges: A dragonstone amulet with X magic charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "1", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,0,3,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8284", + "name": "Cape of legends", + "examine": "The cape worn by members of the Legends Guild.", + "low_alchemy": "180", + "high_alchemy": "270", + "shop_price": "450", + "bonuses": "0,0,0,0,0,7,7,7,7,7,7,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8285", + "name": "King arthur", + "examine": "Legendary King of the Britons.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8286", + "name": "Elena", + "examine": "She looks concerned.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8305", + "name": "Rocnar", + "examine": "It's full of pent-up aggression.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8309", + "name": "Crude wooden chair", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8310", + "name": "Wooden chair", + "grand_exchange_price": "50", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8311", + "name": "Rocking chair", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8312", + "name": "Oak chair", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8313", + "name": "Oak armchair", + "grand_exchange_price": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8314", + "name": "Teak armchair", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8315", + "name": "Mahogany armchair", + "grand_exchange_price": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8319", + "name": "Wooden bookcase", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8320", + "name": "Oak bookcase", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8321", + "name": "Mahogany b'kcase", + "grand_exchange_price": "52", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8417", + "name": "Bagged dead tree", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "requirements": "{5,22}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8418", + "name": "Bagged dead tree", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8419", + "name": "Bagged nice tree", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "shop_price": "2000", + "requirements": "{10,22}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8420", + "name": "Bagged nice tree", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8421", + "name": "Bagged oak tree", + "requirements": "{15,22}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8422", + "name": "Bagged oak tree", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8423", + "name": "Bagged willow tree", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "shop_price": "10000", + "requirements": "{22,30}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8424", + "name": "Bagged willow tree", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8425", + "name": "Bagged maple tree", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "requirements": "{22,45}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8426", + "name": "Bagged maple tree", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8427", + "name": "Bagged yew tree", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "shop_price": "20000", + "requirements": "{22,60}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8428", + "name": "Bagged yew tree", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8429", + "name": "Bagged magic tree", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "50000", + "requirements": "{22,75}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8430", + "name": "Bagged magic tree", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8431", + "name": "Bagged plant 1", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "grand_exchange_price": "1345", + "weight": "10", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8432", + "name": "Bagged plant 1", + "tradeable": "true", + "grand_exchange_price": "1345", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8433", + "name": "Bagged plant 2", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "shop_price": "5000", + "requirements": "{6,22}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8434", + "name": "Bagged plant 2", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8435", + "name": "Bagged plant 3", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "shop_price": "10000", + "requirements": "{12,22}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8436", + "name": "Bagged plant 3", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8437", + "name": "Thorny hedge", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "5000", + "requirements": "{22,56}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8438", + "name": "Thorny hedge", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8439", + "name": "Nice hedge", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "requirements": "{22,60}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8440", + "name": "Nice hedge", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8441", + "name": "Small box hedge", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "requirements": "{22,64}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8442", + "name": "Small box hedge", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8443", + "name": "Topiary hedge", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "shop_price": "20000", + "requirements": "{22,68}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8444", + "name": "Topiary hedge", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8445", + "name": "Fancy hedge", + "examine": "You can plant this in your garden.", + "low_alchemy": "10000", + "high_alchemy": "15000", + "shop_price": "25000", + "requirements": "{22,72}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8446", + "name": "Fancy hedge", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8447", + "name": "Tall fancy hedge", + "examine": "You can plant this in your garden.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "50000", + "requirements": "{22,76}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8448", + "name": "Tall fancy hedge", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8449", + "name": "Tall box hedge", + "requirements": "{22,80}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8450", + "name": "Tall box hedge", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8451", + "name": "Bagged rosemary", + "requirements": "{22,66}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8452", + "name": "Bagged rosemary", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8453", + "name": "Bagged daffodils", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "requirements": "{22,71}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8454", + "name": "Bagged daffodils", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8455", + "name": "Bagged bluebells", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "requirements": "{22,76}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8456", + "name": "Bagged bluebells", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8457", + "name": "Bagged sunflower", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "5000", + "requirements": "{22,66}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8458", + "name": "Bagged sunflower", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8459", + "name": "Bagged marigolds", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "requirements": "{22,71}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8460", + "name": "Bagged marigolds", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8461", + "name": "Bagged roses", + "examine": "You can plant this in your garden.", + "tradeable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "requirements": "{22,76}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8462", + "name": "Bagged roses", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8463", + "name": "Construction guide", + "examine": "How to build a house.", + "tradeable": "true", + "shop_price": "160", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8464", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8466", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8468", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8470", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8472", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8474", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8476", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8478", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8480", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8482", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8484", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8486", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8488", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8490", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8492", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8494", + "name": "Rune heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8496", + "name": "Crude wooden chair", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8497", + "name": "Crude wooden chair", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8498", + "name": "Wooden chair", + "grand_exchange_price": "53", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8499", + "name": "Wooden chair", + "tradeable": "true", + "grand_exchange_price": "53", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8500", + "name": "Rocking chair", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8501", + "name": "Rocking chair", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8502", + "name": "Oak chair", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8503", + "name": "Oak chair", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8504", + "name": "Oak armchair", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8505", + "name": "Oak armchair", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8506", + "name": "Teak armchair", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8507", + "name": "Teak armchair", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8508", + "name": "Mahogany armchair", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8509", + "name": "Mahogany armchair", + "tradeable": "true", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8510", + "name": "Wooden bookcase", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8511", + "name": "Wooden bookcase", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8512", + "name": "Oak bookcase", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8513", + "name": "Oak bookcase", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8514", + "name": "Mahogany b'kcase", + "grand_exchange_price": "46", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8515", + "name": "Mahogany b'kcase", + "tradeable": "true", + "grand_exchange_price": "46", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8516", + "name": "Beer barrel", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8517", + "name": "Beer barrel", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8518", + "name": "Cider barrel", + "grand_exchange_price": "16900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8519", + "name": "Cider barrel", + "tradeable": "true", + "grand_exchange_price": "16900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8520", + "name": "Asgarnian ale", + "examine": "Probably the finest readily-available ale in Asgarnia.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "3", + "grand_exchange_price": "4586", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8521", + "name": "Asgarnian ale", + "tradeable": "true", + "grand_exchange_price": "4586", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8522", + "name": "Greenman's ale", + "examine": "A glass of frothy ale.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "8875", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8523", + "name": "Greenman's ale", + "tradeable": "true", + "grand_exchange_price": "8875", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8524", + "name": "Dragon bitter", + "examine": "A glass of bitter.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "10300", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8525", + "name": "Dragon bitter", + "tradeable": "true", + "grand_exchange_price": "10300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8526", + "name": "Chef's delight", + "examine": "A fruity, full-bodied ale.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "48800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8527", + "name": "Chef's delight", + "tradeable": "true", + "grand_exchange_price": "48800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8528", + "name": "Wood kitchen table", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8529", + "name": "Wood kitchen table", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8530", + "name": "Oak kitchen table", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8531", + "name": "Oak kitchen table", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8532", + "name": "Teak kitchen table", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8533", + "name": "Teak kitchen table", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8535", + "name": "Oak lectern", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8537", + "name": "Eagle lectern", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8539", + "name": "Demon lectern", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8541", + "name": "Teak eagle lectern", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8543", + "name": "Teak demon lectern", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8545", + "name": "Mahogany eagle", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8547", + "name": "Mahogany demon", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8548", + "name": "Wood dining table", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8549", + "name": "Wood dining table", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8550", + "name": "Oak dining table", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8551", + "name": "Oak dining table", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8552", + "name": "Carved oak table", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8553", + "name": "Carved oak table", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8554", + "name": "Teak table", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8555", + "name": "Teak table", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8556", + "name": "Carved teak table", + "grand_exchange_price": "245", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8557", + "name": "Carved teak table", + "tradeable": "true", + "grand_exchange_price": "245", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8558", + "name": "Mahogany table", + "grand_exchange_price": "575", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8559", + "name": "Mahogany table", + "tradeable": "true", + "grand_exchange_price": "575", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8560", + "name": "Opulent table", + "grand_exchange_price": "379100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8561", + "name": "Opulent table", + "tradeable": "true", + "grand_exchange_price": "379100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8562", + "name": "Wooden bench", + "grand_exchange_price": "15", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8563", + "name": "Wooden bench", + "tradeable": "true", + "grand_exchange_price": "15", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8564", + "name": "Oak bench", + "grand_exchange_price": "137", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8565", + "name": "Oak bench", + "tradeable": "true", + "grand_exchange_price": "137", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8566", + "name": "Carved oak bench", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8567", + "name": "Carved oak bench", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8568", + "name": "Teak dining bench", + "grand_exchange_price": "18", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8569", + "name": "Teak dining bench", + "tradeable": "true", + "grand_exchange_price": "18", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8570", + "name": "Carved teak bench", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8571", + "name": "Carved teak bench", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8572", + "name": "Mahogany bench", + "grand_exchange_price": "126", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8573", + "name": "Mahogany bench", + "tradeable": "true", + "grand_exchange_price": "126", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8574", + "name": "Gilded bench", + "grand_exchange_price": "517600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8575", + "name": "Gilded bench", + "tradeable": "true", + "grand_exchange_price": "517600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8576", + "name": "Wooden bed", + "grand_exchange_price": "1974", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8577", + "name": "Wooden bed", + "tradeable": "true", + "grand_exchange_price": "1974", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8578", + "name": "Oak bed", + "grand_exchange_price": "1775", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8579", + "name": "Oak bed", + "tradeable": "true", + "grand_exchange_price": "1775", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8580", + "name": "Large oak bed", + "grand_exchange_price": "1433", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8581", + "name": "Large oak bed", + "tradeable": "true", + "grand_exchange_price": "1433", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8582", + "name": "Teak bed", + "grand_exchange_price": "1442", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8583", + "name": "Teak bed", + "tradeable": "true", + "grand_exchange_price": "1442", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8584", + "name": "Large teak bed", + "grand_exchange_price": "2030", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8585", + "name": "Large teak bed", + "tradeable": "true", + "grand_exchange_price": "2030", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8586", + "name": "4-poster", + "grand_exchange_price": "1401", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8587", + "name": "4-poster", + "tradeable": "true", + "grand_exchange_price": "1401", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8588", + "name": "Gilded 4-poster", + "grand_exchange_price": "286700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8589", + "name": "Gilded 4-poster", + "tradeable": "true", + "grand_exchange_price": "286700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8590", + "name": "Oak clock", + "grand_exchange_price": "384", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8591", + "name": "Oak clock", + "tradeable": "true", + "grand_exchange_price": "384", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8592", + "name": "Teak clock", + "grand_exchange_price": "595", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8593", + "name": "Teak clock", + "tradeable": "true", + "grand_exchange_price": "595", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8594", + "name": "Gilded clock", + "grand_exchange_price": "156100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8595", + "name": "Gilded clock", + "tradeable": "true", + "grand_exchange_price": "156100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8596", + "name": "Shaving stand", + "grand_exchange_price": "510", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8597", + "name": "Shaving stand", + "tradeable": "true", + "grand_exchange_price": "510", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8598", + "name": "Oak shaving stand", + "grand_exchange_price": "455", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8599", + "name": "Oak shaving stand", + "tradeable": "true", + "grand_exchange_price": "455", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8600", + "name": "Oak dresser", + "grand_exchange_price": "147", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8601", + "name": "Oak dresser", + "tradeable": "true", + "grand_exchange_price": "147", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8602", + "name": "Teak dresser", + "grand_exchange_price": "478", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8603", + "name": "Teak dresser", + "tradeable": "true", + "grand_exchange_price": "478", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8604", + "name": "Fancy teak dresser", + "grand_exchange_price": "455", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8605", + "name": "Fancy teak dresser", + "tradeable": "true", + "grand_exchange_price": "455", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8606", + "name": "Mahogany dresser", + "grand_exchange_price": "399", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8607", + "name": "Mahogany dresser", + "tradeable": "true", + "grand_exchange_price": "399", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8608", + "name": "Gilded dresser", + "grand_exchange_price": "138800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8609", + "name": "Gilded dresser", + "tradeable": "true", + "grand_exchange_price": "138800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8610", + "name": "Shoe box", + "grand_exchange_price": "21", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8611", + "name": "Shoe box", + "tradeable": "true", + "grand_exchange_price": "21", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8612", + "name": "Oak drawers", + "grand_exchange_price": "47", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8613", + "name": "Oak drawers", + "tradeable": "true", + "grand_exchange_price": "47", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8614", + "name": "Oak wardrobe", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8615", + "name": "Oak wardrobe", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8616", + "name": "Teak drawers", + "grand_exchange_price": "132", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8617", + "name": "Teak drawers", + "tradeable": "true", + "grand_exchange_price": "132", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8618", + "name": "Teak wardrobe", + "grand_exchange_price": "13", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8619", + "name": "Teak wardrobe", + "tradeable": "true", + "grand_exchange_price": "13", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8620", + "name": "Mahogany 'drobe", + "grand_exchange_price": "98", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8621", + "name": "Mahogany 'drobe", + "tradeable": "true", + "grand_exchange_price": "98", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8622", + "name": "Gilded wardrobe", + "grand_exchange_price": "137700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8623", + "name": "Gilded wardrobe", + "tradeable": "true", + "grand_exchange_price": "137700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8625", + "name": "Crystal ball", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8627", + "name": "Elemental sphere", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8629", + "name": "Crystal of power", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8631", + "name": "Globe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8633", + "name": "Ornamental globe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8635", + "name": "Lunar globe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8637", + "name": "Celestial globe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8639", + "name": "Armillary sphere", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8641", + "name": "Small orrery", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8643", + "name": "Large orrery", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8645", + "name": "Wooden telescope", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8647", + "name": "Teak telescope", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8649", + "name": "Mahogany 'scope", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8650", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8652", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8654", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8656", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8658", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8660", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8662", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8664", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8666", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8668", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8670", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8672", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8674", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8676", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8678", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8680", + "name": "Banner", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8682", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8684", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8686", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8688", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8690", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8692", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8694", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8696", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8698", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8700", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8702", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8704", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8706", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8708", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8710", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8712", + "name": "Steel heraldic helm", + "examine": "The colours represent crest.", + "low_alchemy": "240", + "high_alchemy": "360", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8714", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8716", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8718", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8720", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8722", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8724", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8726", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8728", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8730", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8732", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8734", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8736", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8738", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8740", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8742", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8744", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32583", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8746", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8748", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8750", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8752", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8754", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8756", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8758", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8760", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8762", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8764", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8766", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8768", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8770", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8772", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8774", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8776", + "name": "Steel kiteshield", + "examine": "A large metal shield.", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "shop_price": "850", + "grand_exchange_price": "346", + "equipment_slot": "5", + "bonuses": "0,0,0,-8,-2,13,15,14,-1,14,5,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8778", + "name": "Oak plank", + "examine": "A plank of sturdy oak.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "660", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8779", + "name": "Oak plank", + "tradeable": "true", + "grand_exchange_price": "660", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8780", + "name": "Teak plank", + "examine": "A plank of fine teak.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "500", + "grand_exchange_price": "959", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8781", + "name": "Teak plank", + "tradeable": "true", + "grand_exchange_price": "959", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8782", + "name": "Mahogany plank", + "examine": "A plank of expensive mahogany.", + "tradeable": "true", + "low_alchemy": "600", + "high_alchemy": "900", + "shop_price": "1500", + "grand_exchange_price": "2286", + "weight": "0.8", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8783", + "name": "Mahogany plank", + "tradeable": "true", + "grand_exchange_price": "2286", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8784", + "name": "Gold leaf", + "examine": "A very delicate sheet of gold.", + "tradeable": "true", + "low_alchemy": "52000", + "high_alchemy": "78000", + "shop_price": "130000", + "grand_exchange_price": "133800", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8785", + "name": "Gold leaf", + "tradeable": "true", + "grand_exchange_price": "133800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8786", + "name": "Marble block", + "examine": "A beautifully carved marble block.", + "tradeable": "true", + "low_alchemy": "130000", + "high_alchemy": "195000", + "shop_price": "325000", + "grand_exchange_price": "324800", + "weight": "13.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8787", + "name": "Marble block", + "tradeable": "true", + "grand_exchange_price": "324800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8788", + "name": "Magic stone", + "examine": "A magic stone to make high-level furniture.", + "tradeable": "true", + "low_alchemy": "390000", + "high_alchemy": "585000", + "shop_price": "975000", + "grand_exchange_price": "980300", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8789", + "name": "Magic stone", + "tradeable": "true", + "grand_exchange_price": "980300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8790", + "name": "Bolt of cloth", + "examine": "A bolt of ordinary cloth.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "650", + "grand_exchange_price": "1090", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8791", + "name": "Bolt of cloth", + "tradeable": "true", + "grand_exchange_price": "1090", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8792", + "name": "Clockwork", + "examine": "A clockwork mechanism.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "1630", + "weight": "1", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8793", + "name": "Clockwork", + "tradeable": "true", + "grand_exchange_price": "1630", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8794", + "name": "Saw", + "examine": "Good for cutting wood.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "shop_price": "13", + "grand_exchange_price": "64", + "equipment_slot": "3", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8795", + "name": "Saw", + "tradeable": "true", + "grand_exchange_price": "64", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8836", + "name": "Mahogany logs", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8837", + "name": "Timber beam", + "examine": "A hefty beam of timber, perfect for building temples.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "29", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8838", + "name": "Timber beam", + "tradeable": "true", + "grand_exchange_price": "29", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8839", + "name": "Void knight top", + "examine": "Torso armour from the order of the Void Knights.", + "tradeable": "false", + "low_alchemy": "19200", + "high_alchemy": "28800", + "shop_price": "250", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,45,45,45,45,45,45,0,0,0,0", + "weight": "6.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8840", + "name": "Void knight robe", + "examine": "Leg armour of the order of the Void Knights.", + "tradeable": "false", + "low_alchemy": "18000", + "high_alchemy": "27000", + "shop_price": "250", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,30,30,30,30,30,15,0,0,0,0", + "weight": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8841", + "name": "Void knight mace", + "examine": "A mace used by the order of the Void Knights.", + "tradeable": "false", + "low_alchemy": "4800", + "high_alchemy": "7200", + "shop_price": "250", + "render_anim": "2553", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "22,0,41,8,0,2,2,2,2,2,0,38,6,0,0", + "weapon_interface": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8842", + "name": "Void knight gloves", + "examine": "Gloves as used by the order of the Void Knights.", + "tradeable": "false", + "low_alchemy": "2420", + "high_alchemy": "3631", + "shop_price": "150", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,6,6,6,6,6,6,0,0,0,0", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8844", + "name": "Bronze defender", + "examine": "A defensive weapon.", + "equipment_slot": "5", + "bonuses": "3,2,1,-3,-2,3,2,1,-3,-2,1,0,0,0,0", + "defence_anim": "4177", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8845", + "name": "Iron defender", + "examine": "A defensive weapon.", + "equipment_slot": "5", + "bonuses": "5,4,3,-3,-2,5,4,3,-3,-2,2,0,0,0,0", + "defence_anim": "4177", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8846", + "name": "Steel defender", + "examine": "A defensive weapon.", + "equipment_slot": "5", + "bonuses": "7,6,5,-3,-2,7,6,5,-3,-2,3,1,0,0,0", + "defence_anim": "4177", + "requirements": "{0,5}-{1,5}", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8847", + "name": "Black defender", + "examine": "A defensive weapon.", + "equipment_slot": "5", + "bonuses": "9,8,7,-3,-2,9,8,7,-3,-2,4,2,0,0,0", + "defence_anim": "4177", + "requirements": "{0,10}-{1,10}", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8848", + "name": "Mithril defender", + "examine": "A defensive weapon.", + "equipment_slot": "5", + "bonuses": "10,9,8,-3,-2,10,9,8,-3,-2,5,3,0,0,0", + "defence_anim": "4177", + "requirements": "{0,20}-{1,20}", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8849", + "name": "Adamant defender", + "examine": "A defensive weapon.", + "equipment_slot": "5", + "bonuses": "13,12,11,-3,-2,13,12,11,-3,-2,6,4,0,0,0", + "defence_anim": "4177", + "requirements": "{0,30}-{1,30}", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8850", + "name": "Rune defender", + "examine": "A defensive weapon.", + "equipment_slot": "5", + "bonuses": "20,19,18,-3,-2,20,19,18,-3,-2,8,5,0,0,0", + "defence_anim": "4177", + "requirements": "{0,40}-{1,40}", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8851", + "name": "Warrior guild token", + "examine": "Warrior Guild Token.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8856", + "name": "Defensive shield", + "examine": "Large, round, heavy shield.", + "equipment_slot": "5", + "bonuses": "0,0,0,-6,-2,8,9,7,0,8,0,0,0,0,0", + "weight": "3.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8858", + "name": "18lb shot", + "examine": "Just landed 18lb shot.", + "destroy": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8859", + "name": "22lb shot", + "examine": "Just landed 22lb shot.", + "destroy": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8860", + "name": "One barrel", + "examine": "To put on your head.", + "destroy": "true", + "equipment_slot": "0", + "weight": "4.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8861", + "name": "Two barrels", + "examine": "To put on your head.", + "destroy": "true", + "equipment_slot": "0", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8862", + "name": "Three barrels", + "examine": "To put on your head.", + "destroy": "true", + "equipment_slot": "0", + "weight": "13.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8863", + "name": "Four barrels", + "examine": "To put on your head.", + "destroy": "true", + "equipment_slot": "0", + "weight": "18.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8864", + "name": "Five barrels", + "examine": "To put on your head.", + "destroy": "true", + "equipment_slot": "0", + "weight": "22.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8865", + "name": "Ground ashes", + "examine": "A heap of finely ground ashes.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8869", + "name": "Iron key", + "examine": "A key made of solid iron.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8870", + "name": "Zanik", + "examine": "See article", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8871", + "name": "Crate with zanik", + "examine": "It's got Zanik in it.", + "destroy": "true", + "tradeable": "false", + "stand_anim": "4193", + "stand_turn_anim": "4194", + "walk_anim": "4194", + "run_anim": "4194", + "turn180_anim": "4194", + "turn90cw_anim": "4194", + "turn90ccw_anim": "4194", + "render_anim": "822", + "equipment_slot": "3", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8872", + "name": "Bone dagger", + "examine": "A powerful dagger.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "2000", + "grand_exchange_price": "2855", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,4,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "400,400,400,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8873", + "name": "Bone dagger", + "tradeable": "true", + "grand_exchange_price": "2855", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8874", + "name": "Bone dagger (p)", + "examine": "A powerful dagger.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "2000", + "grand_exchange_price": "3033", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,4,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "400,400,400,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8875", + "name": "Bone dagger (p)", + "tradeable": "true", + "grand_exchange_price": "3033", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8876", + "name": "Bone dagger (p+)", + "examine": "A powerful dagger.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "2000", + "grand_exchange_price": "3523", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,4,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "400,400,400,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8877", + "name": "Bone dagger (p+)", + "tradeable": "true", + "grand_exchange_price": "3523", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8878", + "name": "Bone dagger (p++)", + "examine": "A powerful dagger.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "2000", + "grand_exchange_price": "8337", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "5,3,-4,1,0,0,0,0,1,0,0,4,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "400,400,400,400", + "defence_anim": "378", + "attack_audios": "2517,2517,2500,2517", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8879", + "name": "Bone dagger (p++)", + "tradeable": "true", + "grand_exchange_price": "8337", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8880", + "name": "Dorgeshuun c'bow", + "examine": "This fires crossbow bolts.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "2000", + "grand_exchange_price": "1159", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,42,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "has_special": "true", + "attack_anims": "4230,4230,4230,4230", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,28}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8881", + "name": "Dorgeshuun c'bow", + "tradeable": "true", + "grand_exchange_price": "1159", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8882", + "name": "Bone bolts", + "examine": "Good if you have a bone crossbow!", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "12", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,49", + "requirements": "{4,28}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8887", + "name": "Zanik", + "examine": "See article", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8890", + "name": "Coins", + "examine": "100,000 or more: \"X x coins\" where X is the exact number of coins in the stack.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8900", + "name": "Cave horror", + "examine": "A horrible, emaciated ape like creature with beady red eyes.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8901", + "name": "Black mask (10)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "989400", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8902", + "name": "Black mask (10)", + "tradeable": "true", + "grand_exchange_price": "989400", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8903", + "name": "Black mask (9)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "583700", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8904", + "name": "Black mask (9)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8905", + "name": "Black mask (8)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "583700", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8906", + "name": "Black mask (8)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8907", + "name": "Black mask (7)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "583700", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8908", + "name": "Black mask (7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8909", + "name": "Black mask (6)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "583700", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8910", + "name": "Black mask (6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8911", + "name": "Black mask (5)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "583700", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8912", + "name": "Black mask (5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8913", + "name": "Black mask (4)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "583700", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8914", + "name": "Black mask (4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8915", + "name": "Black mask (3)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "583700", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8916", + "name": "Black mask (3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8917", + "name": "Black mask (2)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "583700", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8918", + "name": "Black mask (2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8919", + "name": "Black mask (1)", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "583700", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8920", + "name": "Black mask (1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8921", + "name": "Black mask", + "examine": "Charged: A magic cave horror mask.Uncharged: An inert-seeming cave horror mask.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "956100", + "equipment_slot": "0", + "bonuses": "0,0,0,-3,-1,9,10,8,-1,9,0,0,0,0,0", + "requirements": "{1,20}-{2,10}", + "weight": "10", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8922", + "name": "Black mask", + "tradeable": "true", + "grand_exchange_price": "956100", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8923", + "name": "Witchwood icon", + "examine": "A stick on a string... pure style.", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "900", + "equipment_slot": "2", + "bonuses": "0,0,0,1,0,0,0,0,0,0,0,0,1,0,0", + "requirements": "{18,35}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8924", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8925", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8926", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8927", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8928", + "name": "Hat and eyepatch", + "examine": "A pirate hat and a patch for the right eye.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "equipment_slot": "0", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8929", + "name": "Crabclaw and hook", + "examine": "Tied together so they don't come apart.", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "800", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,3,5,3,0,0,0,1,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8930", + "name": "Pipe section", + "examine": "Crude wooden pipe section.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8931", + "name": "Pipe section", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8932", + "name": "Lumber patch", + "examine": "Repairs made with this will be patchy at best.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8933", + "name": "Lumber patch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8934", + "name": "Scrapey tree logs", + "examine": "Slimy logs from the scrapey tree.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8935", + "name": "Scrapey tree logs", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8936", + "name": "Blue flowers", + "examine": "Very blue.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8937", + "name": "Blue flowers", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8938", + "name": "Red flowers", + "examine": "Very red.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8939", + "name": "Red flowers", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8943", + "name": "Blue monkey", + "examine": "Bluuuuuuuue Monkeeeeeeey!", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8944", + "name": "Blue monkey", + "examine": "Bluuuuuuuue Monkeeeeeeey!", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8945", + "name": "Blue monkey", + "examine": "Bluuuuuuuue Monkeeeeeeey!", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8946", + "name": "Red monkey", + "examine": "A well red monkey.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8947", + "name": "Red monkey", + "examine": "A well red monkey.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8948", + "name": "Red monkey", + "examine": "A well red monkey.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8949", + "name": "Pirate bandana", + "examine": "Essential pirate wear.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8950", + "name": "Pirate hat", + "examine": "Shiver me timbers!", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "83200", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8951", + "name": "Pieces of eight", + "examine": "Piratical currency.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8952", + "name": "Blue naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8953", + "name": "Green naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8954", + "name": "Red naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8955", + "name": "Brown naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8956", + "name": "Black naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8957", + "name": "Purple naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8958", + "name": "Grey naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8959", + "name": "Blue tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8960", + "name": "Green tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8961", + "name": "Red tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8962", + "name": "Brown tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8963", + "name": "Black tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8964", + "name": "Purple tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8965", + "name": "Grey tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8966", + "name": "Cutthroat flag", + "examine": "The flag of The Cutthroat.", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8967", + "name": "Guilded smile flag", + "examine": "The flag of The Guilded Smile.", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "attack_speed": "2", + "weapon_interface": "14", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8968", + "name": "Bronze fist flag", + "examine": "The flag of The Bronze Fist.", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "300", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8969", + "name": "Lucky shot flag", + "examine": "The flag of The Lucky Shot.", + "low_alchemy": "160", + "high_alchemy": "240", + "shop_price": "400", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8970", + "name": "Treasure flag", + "examine": "The flag of The Treasure Trove.", + "shop_price": "500", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8971", + "name": "Phasmatys flag", + "examine": "The flag of The Phasmatys Pride.", + "shop_price": "600", + "stand_anim": "1421", + "stand_turn_anim": "1426", + "walk_anim": "1422", + "run_anim": "1427", + "turn180_anim": "1423", + "turn90cw_anim": "1424", + "turn90ccw_anim": "1425", + "render_anim": "131", + "equipment_slot": "3", + "weapon_interface": "14", + "two_handed": "true", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8972", + "name": "Bowl of red water", + "examine": "A Bowl of red water.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8973", + "name": "Bowl of red water", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8974", + "name": "Bowl of blue water", + "examine": "A Bowl of blue water.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8975", + "name": "Bowl of blue water", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8976", + "name": "Bitternut", + "examine": "Monkeys seem to like throwing these.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8977", + "name": "Scrapey bark", + "examine": "Greasy bark from the scrapey tree.", + "weight": "1.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8978", + "name": "Scrapey bark", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8979", + "name": "Bridge section", + "examine": "Caution; not for use over troubled water.", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8980", + "name": "Bridge section", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8981", + "name": "Sweetgrubs", + "examine": "Better than sea slugs.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8982", + "name": "Sweetgrubs", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8986", + "name": "Bucket", + "examine": "It's an empty bucket.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "50", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8987", + "name": "Torch", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8988", + "name": "The stuff", + "examine": "Apparently good for brewing.", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8989", + "name": "Brewin' guide", + "examine": "A how-to of brewing and arson.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8990", + "name": "Brewin' guide", + "examine": "A how-to of brewing and arson.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8991", + "name": "Blue navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8992", + "name": "Green navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8993", + "name": "Red navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8994", + "name": "Brown navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8995", + "name": "Black navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8996", + "name": "Purple navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8997", + "name": "Grey navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8998", + "name": "Bandana and eyepatch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "8999", + "name": "Bandana and eyepatch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9000", + "name": "Bandana and eyepatch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9001", + "name": "Bandana and eyepatch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9002", + "name": "Hat and eyepatch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9003", + "name": "Security book", + "examine": "WARNING: Contains information which could make your account secure!", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9004", + "name": "Stronghold notes", + "examine": "Information regarding the Stronghold of Security.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "16", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9005", + "name": "Fancy boots", + "examine": "Very nice boots from the Stronghold of Security.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another pair of Fancy Boots from the Stronghold of Security", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,1,2,3,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9006", + "name": "Fighting boots", + "examine": "Very nice boots from the Stronghold of Security.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another pair of Fighting Boots from the Stronghold of Security.", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,1,2,3,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9007", + "name": "Right skull half", + "tradeable": "false", + "examine": "Ooooh spooky!", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9008", + "name": "Left skull half", + "examine": "Ooooh spooky!", + "destroy": "true", + "tradeable": "false", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9009", + "name": "Strange skull", + "tradeable": "false", + "examine": "Seems to be for use with a staff or sceptre of some sort.", + "weight": "1.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9010", + "name": "Top of sceptre", + "tradeable": "false", + "examine": "Top half of a broken sceptre.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9011", + "name": "Bottom of sceptre", + "tradeable": "false", + "examine": "Bottom half of a broken sceptre.", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9012", + "name": "Runed sceptre", + "tradeable": "false", + "examine": "Sceptre with runes on it, seems to be missing something.", + "weight": "3.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9013", + "name": "Skull sceptre", + "examine": "A fragile magical Sceptre.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another Sceptre by collecting all four pieces from the Stronghold of Security.", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-1,7,4,0,2,3,1,4,0,0,3,0,0,0", + "weapon_interface": "3", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9014", + "name": "Security book", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9015", + "name": "Stronghold notes", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9016", + "name": "Gorak claws", + "examine": "Oversized nail clippings.", + "low_alchemy": "60", + "high_alchemy": "90", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9017", + "name": "Star flower", + "examine": "A flower with magical properties.", + "low_alchemy": "30", + "high_alchemy": "45", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9018", + "name": "Gorak claw powder", + "examine": "Ground-down gorak claws.", + "low_alchemy": "60", + "high_alchemy": "90", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9020", + "name": "Queen's secateurs", + "examine": "Contains the Fairy Queen's magical essence.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9025", + "name": "Nuff's certificate", + "examine": "A scroll that says she's a healer, that's Fairy Nuff.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Maybe I can find another in Fairy Nuff's grotto.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9026", + "name": "Ivory comb", + "examine": "Simon Templeton at the Agility Pyramid will give me 50 coins for this.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "187", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9027", + "name": "Ivory comb", + "tradeable": "true", + "grand_exchange_price": "187", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9028", + "name": "Golden scarab", + "examine": "Simon Templeton at the Agility Pyramid will give me 1000 coins for this.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "513", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9029", + "name": "Golden scarab", + "tradeable": "true", + "grand_exchange_price": "513", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9030", + "name": "Stone scarab", + "examine": "Little ornament in the shape of a scarab.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "168", + "weight": "0.07", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9031", + "name": "Stone scarab", + "tradeable": "true", + "grand_exchange_price": "168", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9032", + "name": "Pottery scarab", + "examine": "A small pottery scarab.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "74", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9033", + "name": "Pottery scarab", + "tradeable": "true", + "grand_exchange_price": "74", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9034", + "name": "Golden statuette", + "examine": "A small golden statuette.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "740", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9035", + "name": "Golden statuette", + "tradeable": "true", + "grand_exchange_price": "740", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9036", + "name": "Pottery statuette", + "examine": "A small pottery statuette.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "97", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9037", + "name": "Pottery statuette", + "tradeable": "true", + "grand_exchange_price": "97", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9038", + "name": "Stone statuette", + "examine": "A small stone statuette.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "193", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9039", + "name": "Stone statuette", + "tradeable": "true", + "grand_exchange_price": "193", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9040", + "name": "Gold seal", + "examine": "Simon Templeton at the Agility Arena will give me 750 coins for this.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "379", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9041", + "name": "Gold seal", + "tradeable": "true", + "grand_exchange_price": "379", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9042", + "name": "Stone seal", + "examine": "Simon Templeton at the Agility Pyramid will give me 150 coins for this.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "147", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9043", + "name": "Stone seal", + "tradeable": "true", + "grand_exchange_price": "147", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9044", + "name": "Pharaoh's sceptre", + "examine": "Fully charged: This sceptre is fully charged.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "grand_exchange_price": "1000000", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,0,0,0", + "weapon_interface": "3", + "two_handed": "true", + "requirements": "{0,30}-{6,30}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9045", + "name": "Pharaoh's sceptre", + "tradeable": "true", + "grand_exchange_price": "1000000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9046", + "name": "Pharaoh's sceptre", + "examine": "Fully charged: This sceptre is fully charged.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "grand_exchange_price": "27", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,0,0,0", + "weapon_interface": "3", + "two_handed": "true", + "requirements": "{0,30}-{6,30}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9047", + "name": "Pharaoh's sceptre", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9048", + "name": "Pharaoh's sceptre", + "examine": "Fully charged: This sceptre is fully charged.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "grand_exchange_price": "27", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,0,0,0", + "weapon_interface": "3", + "two_handed": "true", + "requirements": "{0,30}-{6,30}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9049", + "name": "Pharaoh's sceptre", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9050", + "name": "Pharaoh's sceptre", + "examine": "Fully charged: This sceptre is fully charged.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "grand_exchange_price": "985800", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,0,0,0", + "weapon_interface": "3", + "two_handed": "true", + "requirements": "{0,30}-{6,30}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9051", + "name": "Pharaoh's sceptre", + "tradeable": "true", + "grand_exchange_price": "985800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9052", + "name": "Locust meat", + "examine": "Delicious and nutritious. Well, nutritious anyway.", + "tradeable": "true", + "grand_exchange_price": "68", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9053", + "name": "Locust meat", + "tradeable": "true", + "grand_exchange_price": "68", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9054", + "name": "Red goblin mail", + "examine": "Armour designed to fit goblins.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "4", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9055", + "name": "Black goblin mail", + "examine": "Armour designed to fit goblins.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "4", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9056", + "name": "Yellow goblin mail", + "examine": "Armour designed to fit goblins.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "4", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9057", + "name": "Green goblin mail", + "examine": "Armour designed to fit goblins.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "4", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9058", + "name": "Purple goblin mail", + "examine": "Armour designed to fit goblins.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "4", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9059", + "name": "Pink goblin mail", + "examine": "Armour designed to fit goblins.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "4", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9064", + "name": "Emerald lantern", + "examine": "A mystical lantern casting a green beam.", + "low_alchemy": "8", + "high_alchemy": "12", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9065", + "name": "Emerald lantern", + "examine": "A mystical lantern casting a green beam.", + "low_alchemy": "8", + "high_alchemy": "12", + "equipment_slot": "5", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9066", + "name": "Emerald lens", + "examine": "A roughly circular disc of glass.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9067", + "name": "Dream log", + "examine": "A log of my thoughts...", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9068", + "name": "Moonclan helm", + "examine": "Mystical headgear.", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "equipment_slot": "0", + "bonuses": "0,0,0,3,-5,3,3,3,3,-5,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9069", + "name": "Moonclan hat", + "examine": "A mystical hat.", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "equipment_slot": "0", + "bonuses": "0,0,0,3,-5,3,3,3,3,-5,0,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9070", + "name": "Moonclan armour", + "examine": "Provides good protection.", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,5,-10,5,5,5,5,-10,5,0,0,0,0", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9071", + "name": "Moonclan skirt", + "examine": "This should protect my legs.", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "equipment_slot": "7", + "bonuses": "0,0,0,5,-7,5,5,5,5,-7,0,0,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9072", + "name": "Moonclan gloves", + "examine": "These should keep my hands safe.", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "900", + "equipment_slot": "9", + "bonuses": "0,0,0,2,-5,2,2,2,2,-5,2,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9073", + "name": "Moonclan boots", + "examine": "Groovy foot protection.", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "900", + "equipment_slot": "10", + "bonuses": "0,0,0,2,-5,2,2,2,2,-5,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9074", + "name": "Moonclan cape", + "examine": "A mystical cape.", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "equipment_slot": "1", + "bonuses": "0,0,0,2,-2,0,1,1,2,-2,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9075", + "name": "Astral rune", + "examine": "Used for Lunar Spells", + "tradeable": "true", + "low_alchemy": "29", + "high_alchemy": "44", + "shop_price": "220", + "grand_exchange_price": "231", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9076", + "name": "Lunar ore", + "examine": "This needs refining", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9077", + "name": "Lunar bar", + "examine": "It's a bar of magic metal.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to mine another lunar ore and smelt it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9078", + "name": "Moonclan manual", + "examine": "A book of Moonclan history.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9079", + "name": "Suqah tooth", + "examine": "The tooth, the whole tooth, and nothing but the tooth.", + "low_alchemy": "8", + "high_alchemy": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9080", + "name": "Suqah hide", + "examine": "An untanned piece of suqah hide.", + "low_alchemy": "24", + "high_alchemy": "36", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9081", + "name": "Suqah leather", + "examine": "A piece of Suqah hide that has been expertly tanned into leather.", + "low_alchemy": "24", + "high_alchemy": "36", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9082", + "name": "Ground tooth", + "examine": "A ground Suqah tooth.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9083", + "name": "Seal of passage", + "examine": "A seal of passage issued by Brundt the Chieftain of the Fremennik.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Brundt the Chieftain will probably have another lying around somewhere anyway...", + "equipment_slot": "2", + "weight": "4.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9084", + "name": "Lunar staff", + "examine": "A Moonclan staff.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "30000", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "3,2,16,13,0,2,3,2,13,1,0,15,3,0,0", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9085", + "name": "Empty vial", + "examine": "A vessel for holding liquid.", + "destroy": "true", + "destroy_message": "You'll have to get another from the Oneiromancer.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9086", + "name": "Vial of water", + "examine": "A glass vial containing water.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "10", + "grand_exchange_price": "21", + "weight": "0.02", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9087", + "name": "Waking sleep vial", + "examine": "A vessel for dreaming while awake!", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9088", + "name": "Guam vial", + "examine": "A vessel with water and Guam inside.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9089", + "name": "Marr vial", + "examine": "A vessel with water and Marrentill inside.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9090", + "name": "Guam-marr vial", + "examine": "A vessel with water, guam and marrentill inside.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9091", + "name": "Lunar staff - pt1", + "examine": "A staff enchanted by air.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "-1,-1,10,10,0,2,3,1,10,0,0,10,0,0,0", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9092", + "name": "Lunar staff - pt2", + "examine": "A staff enchanted by air and fire.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "-1,-1,10,10,0,2,3,1,10,0,0,10,0,0,0", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9093", + "name": "Lunar staff - pt3", + "examine": "A staff enchanted by air, fire and water.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "-1,-1,10,10,0,2,3,1,10,0,0,10,0,0,0", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9094", + "name": "Kindling", + "examine": "Small bits of wood from the first magic tree!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9095", + "name": "Soaked kindling", + "examine": "Magic wood soaked with a potion of waking sleep. Groovy.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9096", + "name": "Lunar helm", + "examine": "A mystical helmet.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "15000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,3,-2,8,7,10,2,0,7,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9097", + "name": "Lunar torso", + "examine": "Provides good protection.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "120000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,10,-10,34,22,40,12,0,35,0,0,0,0", + "weight": "4.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9098", + "name": "Lunar legs", + "examine": "These should protect my legs.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "80000", + "equipment_slot": "7", + "absorb": "4,2,0", + "bonuses": "0,0,0,7,-7,20,19,23,9,0,20,0,0,0,0", + "weight": "3.65", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9099", + "name": "Lunar gloves", + "examine": "These should keep my hands safe.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "10000", + "equipment_slot": "9", + "bonuses": "0,0,0,4,-1,2,1,1,2,0,1,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9100", + "name": "Lunar boots", + "examine": "Mystical foot protection.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "10000", + "equipment_slot": "10", + "bonuses": "0,0,0,2,-1,1,2,2,2,0,2,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9101", + "name": "Lunar cape", + "examine": "Oooo pretty!", + "low_alchemy": "1", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "12000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9102", + "name": "Lunar amulet", + "examine": "Awesome.", + "low_alchemy": "12", + "high_alchemy": "18", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "4000", + "equipment_slot": "2", + "bonuses": "0,0,0,1,0,0,0,0,1,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9103", + "name": "A special tiara", + "examine": "I'll be the talk of the town with this... maybe.", + "low_alchemy": "12", + "high_alchemy": "18", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9104", + "name": "Lunar ring", + "examine": "A mysterious ring that can fill the wearer with magical power.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "2000", + "equipment_slot": "12", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9106", + "name": "Astral tiara", + "equipment_slot": "0", + "requirements": "", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9139", + "name": "Blurite bolts", + "examine": "Blurite crossbow bolts.", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,28", + "requirements": "{4,16}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9140", + "name": "Iron bolts", + "examine": "Iron crossbow bolts.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "60", + "grand_exchange_price": "41", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,46", + "requirements": "{4,26}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9141", + "name": "Steel bolts", + "examine": "Steel crossbow bolts.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "shop_price": "150", + "grand_exchange_price": "90", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,64", + "requirements": "{4,31}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9142", + "name": "Mithril bolts", + "examine": "Mithril crossbow bolts.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "32", + "grand_exchange_price": "108", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,82", + "requirements": "{4,36}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9143", + "name": "Adamant bolts", + "examine": "Adamantite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "34", + "shop_price": "23", + "grand_exchange_price": "210", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,100", + "requirements": "{4,46}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9144", + "name": "Rune bolts", + "examine": "Runite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "627", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,115", + "requirements": "{4,61}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9145", + "name": "Silver bolts", + "examine": "Silver crossbow bolts.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "8", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,36", + "requirements": "{4,26}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9174", + "name": "Bronze crossbow", + "examine": "A bronze crossbow.", + "tradeable": "true", + "low_alchemy": "29", + "high_alchemy": "43", + "shop_price": "92", + "grand_exchange_price": "29", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,18,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_anims": "4230,4230,4230,4230", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "weight": "4", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9175", + "name": "Bronze crossbow", + "tradeable": "true", + "grand_exchange_price": "29", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9176", + "name": "Blurite crossbow", + "examine": "A blurite crossbow.", + "low_alchemy": "37", + "high_alchemy": "55", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,30,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_audios": "2700,0,0,0", + "requirements": "{4,16}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9177", + "name": "Iron crossbow", + "examine": "An iron crossbow.", + "tradeable": "true", + "low_alchemy": "62", + "high_alchemy": "94", + "shop_price": "157", + "grand_exchange_price": "20", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,42,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_anims": "4230,4230,4230,4230", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,26}", + "weight": "4", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9178", + "name": "Iron crossbow", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9179", + "name": "Steel crossbow", + "examine": "A steel crossbow.", + "tradeable": "true", + "low_alchemy": "144", + "high_alchemy": "216", + "grand_exchange_price": "99", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,54,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_anims": "4230,4230,4230,4230", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,31}", + "weight": "5", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9180", + "name": "Steel crossbow", + "tradeable": "true", + "grand_exchange_price": "99", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9181", + "name": "Mith crossbow", + "grand_exchange_price": "355", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "bonuses": "0,0,0,0,66,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_anims": "4230,4230,4230,4230", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,36}", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9182", + "name": "Mith crossbow", + "tradeable": "true", + "grand_exchange_price": "355", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9183", + "name": "Adamant crossbow", + "examine": "An adamantite crossbow.", + "tradeable": "true", + "low_alchemy": "706", + "high_alchemy": "1060", + "shop_price": "2244", + "grand_exchange_price": "905", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,78,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_anims": "4230,4230,4230,4230", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,46}", + "weight": "6", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9184", + "name": "Adamant crossbow", + "tradeable": "true", + "grand_exchange_price": "905", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9185", + "name": "Rune crossbow", + "examine": "A runite crossbow.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6480", + "high_alchemy": "9720", + "shop_price": "16200", + "grand_exchange_price": "9706", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,90,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_anims": "4230,4230,4230,4230", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "requirements": "{4,61}", + "weight": "6", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9186", + "name": "Rune crossbow", + "tradeable": "true", + "grand_exchange_price": "9706", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9187", + "name": "Jade bolt tips", + "examine": "Jade bolt tips.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9188", + "name": "Topaz bolt tips", + "examine": "Red Topaz bolt tips.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "grand_exchange_price": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9189", + "name": "Sapphire bolt tips", + "examine": "Sapphire bolt tips.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "10", + "grand_exchange_price": "4", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9190", + "name": "Emerald bolt tips", + "examine": "Emerald bolt tips.", + "tradeable": "true", + "low_alchemy": "13", + "high_alchemy": "19", + "grand_exchange_price": "84", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9191", + "name": "Ruby bolt tips", + "examine": "Ruby bolt tips.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "40", + "grand_exchange_price": "159", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9192", + "name": "Diamond bolt tips", + "examine": "Diamond bolt tips.", + "tradeable": "true", + "low_alchemy": "53", + "high_alchemy": "79", + "grand_exchange_price": "1289", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9193", + "name": "Dragon bolt tips", + "examine": "Dragonstone bolt tips.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "2477", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9194", + "name": "Onyx bolt tips", + "examine": "Onyx bolt tips.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "13500", + "grand_exchange_price": "8096", + "ge_buy_limit": "10000", + "tokkul_price": "1500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9236", + "name": "Opal bolts (e)", + "examine": "Enchanted Opal tipped Bronze Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "4", + "grand_exchange_price": "10", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,14", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9237", + "name": "Jade bolts (e)", + "examine": "Enchanted Jade tipped Blurite Crossbow Bolts.", + "low_alchemy": "5", + "high_alchemy": "7", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,30", + "requirements": "{4,15}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9238", + "name": "Pearl bolts (e)", + "examine": "Enchanted Pearl tipped Iron Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "36", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,48", + "requirements": "{4,26}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9239", + "name": "Topaz bolts (e)", + "examine": "Enchanted Red Topaz tipped Steel Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "44", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,66", + "requirements": "{4,31}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9240", + "name": "Sapphire bolts (e)", + "examine": "Enchanted Sapphire tipped Mithril Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "103", + "grand_exchange_price": "95", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,83", + "requirements": "{4,36}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9241", + "name": "Emerald bolts (e)", + "examine": "Enchanted Emerald tipped Mithril Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "35", + "grand_exchange_price": "304", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,85", + "requirements": "{4,36}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9242", + "name": "Ruby bolts (e)", + "examine": "Enchanted Ruby tipped Adamantite Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "55", + "high_alchemy": "82", + "grand_exchange_price": "450", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,103", + "requirements": "{4,46}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9243", + "name": "Diamond bolts (e)", + "examine": "Enchanted Diamond tipped Adamantite Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "84", + "high_alchemy": "126", + "grand_exchange_price": "1631", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,105", + "requirements": "{4,46}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9244", + "name": "Dragon bolts (e)", + "examine": "Enchanted Dragonstone tipped Runite Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "425", + "high_alchemy": "637", + "grand_exchange_price": "3217", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,117", + "requirements": "{4,61}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9245", + "name": "Onyx bolts (e)", + "examine": "Enchanted Onyx tipped runite Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "grand_exchange_price": "8870", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,120", + "requirements": "{4,61}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9286", + "name": "Blurite bolts(p)", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,28", + "requirements": "{4,16}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9287", + "name": "Iron bolts (p)", + "examine": "Iron crossbow bolts.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "60", + "grand_exchange_price": "88", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,46", + "requirements": "{4,26}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9288", + "name": "Steel bolts (p)", + "examine": "Steel crossbow bolts.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "132", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,64", + "requirements": "{4,31}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9289", + "name": "Mithril bolts (p)", + "examine": "Mithril crossbow bolts.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "32", + "grand_exchange_price": "146", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,82", + "requirements": "{4,36}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9290", + "name": "Adamant bolts (p)", + "examine": "Adamantite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "23", + "high_alchemy": "34", + "shop_price": "23", + "grand_exchange_price": "302", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,100", + "requirements": "{4,46}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9291", + "name": "Runite bolts (p)", + "examine": "Runite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "734", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,115", + "requirements": "{4,61}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9292", + "name": "Silver bolts (p)", + "examine": "Silver crossbow bolts.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "34", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,36", + "requirements": "{4,26}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9293", + "name": "Blurite bolts(p+)", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,28", + "requirements": "{4,16}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9294", + "name": "Iron bolts(p+)", + "examine": "Iron crossbow bolts.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "60", + "grand_exchange_price": "185", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,46", + "requirements": "{4,26}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9295", + "name": "Steel bolts(p+)", + "examine": "Steel crossbow bolts.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "215", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,64", + "requirements": "{4,31}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9296", + "name": "Mithril bolts(p+)", + "examine": "Mithril crossbow bolts.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "32", + "grand_exchange_price": "296", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,82", + "requirements": "{4,36}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9297", + "name": "Adamant bolts(p+)", + "grand_exchange_price": "472", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,100", + "requirements": "{4,46}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9298", + "name": "Runite bolts(p+)", + "examine": "Runite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "1130", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,115", + "requirements": "{4,61}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9299", + "name": "Silver bolts(p+)", + "examine": "Silver crossbow bolts.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "129", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,36", + "requirements": "{4,26}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9300", + "name": "Blurite bolts(p++)", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,28", + "requirements": "{4,16}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9301", + "name": "Iron bolts(p++)", + "examine": "Iron crossbow bolts.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "60", + "grand_exchange_price": "1136", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,46", + "requirements": "{4,26}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9302", + "name": "Steel bolts(p++)", + "examine": "Steel crossbow bolts.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "1088", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,64", + "requirements": "{4,31}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9303", + "name": "Mithril bolts(p++)", + "examine": "Mithril crossbow bolts.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "32", + "grand_exchange_price": "903", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,82", + "requirements": "{4,36}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9304", + "name": "Adamant bolts(p++)", + "grand_exchange_price": "1043", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,100", + "requirements": "{4,46}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9305", + "name": "Runite bolts(p++)", + "examine": "Runite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "1581", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,115", + "requirements": "{4,61}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9306", + "name": "Silver bolts(p++)", + "examine": "Silver crossbow bolts.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "1211", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,36", + "requirements": "{4,26}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9335", + "name": "Jade bolts", + "examine": "Jade tipped blurite bolts.", + "low_alchemy": "5", + "high_alchemy": "7", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,30", + "requirements": "{4,16}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9336", + "name": "Topaz bolts", + "examine": "Red Topaz tipped Steel Crossbow Bolts.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "62", + "grand_exchange_price": "60", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,66", + "requirements": "{4,31}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9337", + "name": "Sapphire bolts", + "examine": "Sapphire tipped Mithril crossbow bolts.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "22", + "grand_exchange_price": "89", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,83", + "requirements": "{4,36}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9338", + "name": "Emerald bolts", + "examine": "Emerald tipped Mithril crossbow bolts.", + "tradeable": "true", + "low_alchemy": "21", + "high_alchemy": "31", + "grand_exchange_price": "177", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,85", + "requirements": "{4,36}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9339", + "name": "Ruby bolts", + "examine": "Ruby tipped Adamantite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "grand_exchange_price": "408", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,103", + "requirements": "{4,46}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9340", + "name": "Diamond bolts", + "examine": "Diamond tipped Adamantite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "115", + "grand_exchange_price": "1545", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,105", + "requirements": "{4,46}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9341", + "name": "Dragon bolts", + "examine": "Dragonstone tipped Runite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "386", + "high_alchemy": "580", + "grand_exchange_price": "3201", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,117", + "requirements": "{4,61}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9342", + "name": "Onyx bolts", + "examine": "Onyx tipped Runite crossbow bolts.", + "tradeable": "true", + "low_alchemy": "5453", + "high_alchemy": "8179", + "grand_exchange_price": "8752", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,120", + "requirements": "{4,61}", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9375", + "name": "Bronze bolts (unf)", + "examine": "Unfeathered bronze crossbow bolts.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9376", + "name": "Blurite bolts (unf)", + "examine": "Unfeathered blurite crossbow bolts.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9377", + "name": "Iron bolts (unf)", + "examine": "Unfeathered iron crossbow bolts.", + "tradeable": "true", + "shop_price": "2", + "grand_exchange_price": "14", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9378", + "name": "Steel bolts (unf)", + "examine": "Unfeathered steel crossbow bolts.", + "tradeable": "true", + "grand_exchange_price": "61", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9379", + "name": "Mithril bolts (unf)", + "examine": "Unfeathered mithril crossbow bolts.", + "tradeable": "true", + "grand_exchange_price": "115", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9380", + "name": "Adamant bolts(unf)", + "examine": "Unfeathered adamantite crossbow bolts.", + "tradeable": "true", + "grand_exchange_price": "266", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9381", + "name": "Runite bolts (unf)", + "examine": "Unfeathered runite crossbow bolts", + "tradeable": "true", + "grand_exchange_price": "1235", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9382", + "name": "Silver bolts (unf)", + "examine": "Unfeathered silver crossbow bolts.", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9415", + "name": "Grapple", + "examine": "A mithril grapple tipped bolt with a rope.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "1447", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9416", + "name": "Mith grapple tip", + "examine": "A mithril grapple tip.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "461", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9417", + "name": "Mith grapple tip", + "tradeable": "true", + "grand_exchange_price": "461", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9418", + "name": "Mith grapple", + "examine": "A mithril grapple tipped bolt with a rope.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "858", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9419", + "name": "Mith grapple", + "examine": "A mithril grapple tipped bolt with a rope.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "1470", + "equipment_slot": "13", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9420", + "name": "Bronze limbs", + "examine": "A pair of bronze crossbow limbs.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "20", + "grand_exchange_price": "49", + "equipment_slot": "5", + "requirements": "{9,9}", + "weight": "1", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9421", + "name": "Bronze limbs", + "tradeable": "true", + "grand_exchange_price": "49", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9422", + "name": "Blurite limbs", + "examine": "A pair of blurite crossbow limbs.", + "low_alchemy": "13", + "high_alchemy": "19", + "equipment_slot": "5", + "requirements": "{24,9}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9423", + "name": "Iron limbs", + "examine": "A pair of iron crossbow limbs.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "42", + "shop_price": "200", + "grand_exchange_price": "34", + "equipment_slot": "5", + "requirements": "{9,39}", + "weight": "1", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9424", + "name": "Iron limbs", + "tradeable": "true", + "grand_exchange_price": "34", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9425", + "name": "Steel limbs", + "examine": "A pair of steel crossbow limbs.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "shop_price": "900", + "grand_exchange_price": "97", + "equipment_slot": "5", + "requirements": "{9,46}", + "weight": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9426", + "name": "Steel limbs", + "tradeable": "true", + "grand_exchange_price": "97", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9427", + "name": "Mithril limbs", + "examine": "A pair of mithril crossbow limbs.", + "tradeable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "shop_price": "650", + "grand_exchange_price": "347", + "equipment_slot": "5", + "requirements": "{9,54}", + "weight": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9428", + "name": "Mithril limbs", + "tradeable": "true", + "grand_exchange_price": "347", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9429", + "name": "Adamantite limbs", + "examine": "A pair of adamantite crossbow limbs.", + "tradeable": "true", + "low_alchemy": "640", + "high_alchemy": "960", + "shop_price": "4800", + "grand_exchange_price": "1434", + "equipment_slot": "5", + "requirements": "{9,61}", + "weight": "3", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9430", + "name": "Adamantite limbs", + "tradeable": "true", + "grand_exchange_price": "1434", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9431", + "name": "Runite limbs", + "examine": "A pair of runite crossbow limbs.", + "tradeable": "true", + "low_alchemy": "6400", + "high_alchemy": "9600", + "grand_exchange_price": "9441", + "equipment_slot": "5", + "requirements": "{9,69}", + "weight": "3", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9432", + "name": "Runite limbs", + "tradeable": "true", + "grand_exchange_price": "9441", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9433", + "name": "Bolt pouch", + "examine": "A pouch for storing crossbow bolts.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "1500", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9434", + "name": "Bolt mould", + "examine": "A mould for creating silver crossbow bolts.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "25", + "grand_exchange_price": "409", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9435", + "name": "Bolt mould", + "tradeable": "true", + "grand_exchange_price": "409", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9436", + "name": "Sinew", + "examine": "I can use this to make a crossbow string.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "196", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9437", + "name": "Sinew", + "tradeable": "true", + "grand_exchange_price": "196", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9438", + "name": "Crossbow string", + "examine": "A string for a crossbow.", + "tradeable": "true", + "grand_exchange_price": "203", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9439", + "name": "Crossbow string", + "tradeable": "true", + "grand_exchange_price": "203", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9440", + "name": "Wooden stock", + "examine": "A wooden crossbow stock", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "8", + "grand_exchange_price": "1", + "equipment_slot": "3", + "requirements": "{9,9}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9441", + "name": "Wooden stock", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9442", + "name": "Oak stock", + "examine": "An oak crossbow stock.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "16", + "grand_exchange_price": "1", + "equipment_slot": "3", + "requirements": "{24,9}", + "weight": "3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9443", + "name": "Oak stock", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9444", + "name": "Willow stock", + "examine": "A willow crossbow stock.", + "tradeable": "true", + "low_alchemy": "21", + "high_alchemy": "31", + "shop_price": "21", + "grand_exchange_price": "3", + "equipment_slot": "3", + "requirements": "{9,39}", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9445", + "name": "Willow stock", + "tradeable": "true", + "grand_exchange_price": "3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9446", + "name": "Teak stock", + "examine": "A teak crossbow stock.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "46", + "shop_price": "231", + "grand_exchange_price": "6", + "equipment_slot": "3", + "requirements": "{9,46}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9447", + "name": "Teak stock", + "tradeable": "true", + "grand_exchange_price": "6", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9448", + "name": "Maple stock", + "examine": "A maple crossbow stock.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "7", + "equipment_slot": "3", + "requirements": "{9,54}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9449", + "name": "Maple stock", + "tradeable": "true", + "grand_exchange_price": "7", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9450", + "name": "Mahogany stock", + "examine": "A Mahogany crossbow stock.", + "tradeable": "true", + "low_alchemy": "53", + "high_alchemy": "79", + "grand_exchange_price": "23", + "equipment_slot": "3", + "requirements": "{9,61}", + "weight": "3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9451", + "name": "Mahogany stock", + "tradeable": "true", + "grand_exchange_price": "23", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9452", + "name": "Yew stock", + "examine": "A yew crossbow stock.", + "tradeable": "true", + "low_alchemy": "66", + "high_alchemy": "100", + "grand_exchange_price": "37", + "equipment_slot": "3", + "requirements": "{9,69}", + "weight": "3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9453", + "name": "Yew stock", + "tradeable": "true", + "grand_exchange_price": "37", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9454", + "name": "Bronze c'bow (u)", + "examine": "An unstrung bronze crossbow.", + "tradeable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "shop_price": "27", + "grand_exchange_price": "25", + "weight": "8", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9455", + "name": "Bronze c'bow (u)", + "tradeable": "true", + "grand_exchange_price": "25", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9456", + "name": "Blurite c'bow (u)", + "examine": "An unstrung blurite crossbow.", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "27", + "weight": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9457", + "name": "Iron c'bow (u)", + "examine": "An unstrung iron crossbow.", + "tradeable": "true", + "low_alchemy": "49", + "high_alchemy": "73", + "grand_exchange_price": "26", + "weight": "8", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9458", + "name": "Iron c'bow (u)", + "tradeable": "true", + "grand_exchange_price": "26", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9459", + "name": "Steel c'bow (u)", + "examine": "An unstrung steel crossbow.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "196", + "shop_price": "27", + "grand_exchange_price": "114", + "weight": "8", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9460", + "name": "Steel c'bow (u)", + "tradeable": "true", + "grand_exchange_price": "114", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9461", + "name": "Mithril c'bow (u)", + "examine": "An unstrung mithril crossbow.", + "tradeable": "true", + "low_alchemy": "300", + "high_alchemy": "450", + "shop_price": "27", + "grand_exchange_price": "330", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9462", + "name": "Mithril c'bow (u)", + "tradeable": "true", + "grand_exchange_price": "330", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9463", + "name": "Adamant c'bow (u)", + "examine": "An unstrung adamantite crossbow.", + "tradeable": "true", + "low_alchemy": "693", + "high_alchemy": "1039", + "shop_price": "693", + "grand_exchange_price": "1007", + "weight": "8", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9464", + "name": "Adamant c'bow (u)", + "tradeable": "true", + "grand_exchange_price": "1007", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9465", + "name": "Runite c'bow (u)", + "examine": "An unstrung runite crossbow.", + "tradeable": "true", + "low_alchemy": "6466", + "high_alchemy": "9700", + "shop_price": "4000", + "grand_exchange_price": "9493", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9466", + "name": "Runite c'bow (u)", + "tradeable": "true", + "grand_exchange_price": "9493", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9467", + "name": "Blurite bar", + "examine": "It's a bar of blurite.", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9468", + "name": "Sawdust", + "examine": "What is left over when a log is made into a plank.", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9469", + "name": "Grand seed pod", + "examine": "A seed pod of the Grand Tree.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "16200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9470", + "name": "Gnome scarf", + "examine": "A scarf. You feel your upper lip stiffening.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "1900000", + "equipment_slot": "2", + "weight": "0.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9471", + "name": "Gnome scarf", + "tradeable": "true", + "grand_exchange_price": "1900000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9472", + "name": "Gnome goggles", + "examine": "Tally Ho!", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "95800", + "equipment_slot": "0", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9473", + "name": "Gnome goggles", + "tradeable": "true", + "grand_exchange_price": "95800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9474", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9475", + "name": "Mint cake", + "examine": "It looks very minty.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "675", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9476", + "name": "Mint cake", + "tradeable": "true", + "grand_exchange_price": "675", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9477", + "name": "Aluft aloft box", + "examine": "You can check on your delivery details here", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9478", + "name": "Half made batta", + "examine": "This cheese & tomato batta needs baking (and garnishing with equa leaves).", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9479", + "name": "Unfinished batta", + "examine": "This cheese & tomato batta needs garnishing with equa leaves.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9480", + "name": "Half made batta", + "examine": "This fruit batta needs baking (and garnishing with gnome spices).", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9481", + "name": "Unfinished batta", + "examine": "This fruit batta needs garnishing with gnome spices.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9482", + "name": "Half made batta", + "examine": "This toad batta needs baking.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9483", + "name": "Half made batta", + "examine": "This veggie batta needs baking (and garnishing with equa leaves).", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9484", + "name": "Unfinished batta", + "examine": "This veggie batta needs garnishing with equa leaves.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9485", + "name": "Half made batta", + "examine": "This worm batta needs baking (and garnishing with equa leaves).", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9486", + "name": "Unfinished batta", + "examine": "This worm batta needs garnishing with equa leaves.", + "high_alchemy": "1", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9487", + "name": "Wizard blizzard", + "examine": "This looks like a strange mix.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "740", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9488", + "name": "Wizard blizzard", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9489", + "name": "Wizard blizzard", + "examine": "This looks like a strange mix.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "740", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9508", + "name": "Wizard blizzard", + "examine": "This looks like a strange mix.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "740", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9509", + "name": "Wizard blizzard", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9510", + "name": "Short green guy", + "examine": "A Short Green Guy... looks good.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "954", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9511", + "name": "Short green guy", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9512", + "name": "Pineapple punch", + "examine": "A fresh healthy fruit mix.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "287", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9513", + "name": "Pineapple punch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9514", + "name": "Fruit blast", + "examine": "A cool refreshing fruit mix.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "2276", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9515", + "name": "Fruit blast", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9516", + "name": "Drunk dragon", + "examine": "A warm creamy alcoholic beverage", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "577", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9517", + "name": "Drunk dragon", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9518", + "name": "Choc saturday", + "examine": "A warm creamy alcoholic beverage", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "28", + "grand_exchange_price": "281", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9519", + "name": "Choc saturday", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9520", + "name": "Blurberry special", + "examine": "Looks good... smells strong.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "30", + "grand_exchange_price": "27", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9521", + "name": "Blurberry special", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9522", + "name": "Batta tin", + "examine": "A deep tin used to make gnome battas in.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "1", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9523", + "name": "Batta tin", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9524", + "name": "Batta tin", + "examine": "A deep tin used to make gnome battas in.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "1", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9525", + "name": "Batta tin", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9527", + "name": "Fruit batta", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "310", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9528", + "name": "Fruit batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9529", + "name": "Toad batta", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "78", + "grand_exchange_price": "280", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9530", + "name": "Toad batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9531", + "name": "Worm batta", + "examine": "It actually smells quite good.", + "tradeable": "true", + "grand_exchange_price": "148", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9532", + "name": "Worm batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9533", + "name": "Vegetable batta", + "examine": "Well... It looks healthy.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "240", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9534", + "name": "Vegetable batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9535", + "name": "Cheese+tom batta", + "examine": "This smells really good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "266", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9536", + "name": "Cheese+tom batta", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9538", + "name": "Toad crunchies", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "2606", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9539", + "name": "Toad crunchies", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9540", + "name": "Spicy crunchies", + "examine": "Yum...smells spicy.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "70", + "grand_exchange_price": "99", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9541", + "name": "Spicy crunchies", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9542", + "name": "Worm crunchies", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "80", + "grand_exchange_price": "255", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9543", + "name": "Worm crunchies", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9544", + "name": "Chocchip crunchies", + "examine": "Yum... smells good.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "70", + "grand_exchange_price": "889", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9545", + "name": "Chocchip crunchies", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9547", + "name": "Worm hole", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "475", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9548", + "name": "Worm hole", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9549", + "name": "Veg ball", + "examine": "This looks pretty healthy.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "514", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9550", + "name": "Veg ball", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9551", + "name": "Tangled toads' legs", + "examine": "It actually smells quite good.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "2650", + "weight": "0.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9552", + "name": "Tangled toads' legs", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9553", + "name": "Chocolate bomb", + "examine": "Full of creamy, chocolately goodness.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "450", + "grand_exchange_price": "4704", + "weight": "0.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9554", + "name": "Chocolate bomb", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9558", + "name": "Half made bowl", + "examine": "This unfinished choco bomb needs baking, and final ingredients", + "high_alchemy": "1", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9559", + "name": "Half made bowl", + "examine": "This unfinished tangled toad legs bowl needs baking, and final ingredients", + "high_alchemy": "1", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9560", + "name": "Unfinished bowl", + "examine": "This unfinished choc bomb needs cream and chocolate dust.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9561", + "name": "Half made bowl", + "examine": "This unfinished veggie ball needs baking, and final ingredients", + "high_alchemy": "1", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9562", + "name": "Unfinished bowl", + "examine": "This unfinished veggie ball needs equa leaves.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9563", + "name": "Half made bowl", + "examine": "This unfinished worm hole needs baking, and final ingredients", + "high_alchemy": "1", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9564", + "name": "Unfinished bowl", + "examine": "This unfinished worm hole needs equa leaves.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9565", + "name": "Cocktail shaker", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9566", + "name": "Mixed blizzard", + "examine": "This wizzard blizzard needs pouring, a lime slice, and pineapple chunks.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9567", + "name": "Mixed sgg", + "examine": "This short green guy cocktail needs pouring, a lime slice and equa leaves.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9568", + "name": "Mixed blast", + "examine": "This fruit blast cocktail needs pouring and a lemon slice.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9569", + "name": "Mixed punch", + "examine": "This pineapple punch needs pouring, lime and pineapple chunks, and a orange slice.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9570", + "name": "Mixed blurberry special", + "examine": "This blurberry special needs pouring, orange and lemon chunks, a lime slice and equa leaves.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9577", + "name": "Half made crunchy", + "examine": "This choco chip crunchy needs baking and garnishing with chocolate dust.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9578", + "name": "Unfinished crunchy", + "examine": "This choco chip crunchy needs garnishing with chocolate dust.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9579", + "name": "Half made crunchy", + "examine": "This spicy crunchy needs baking and garnishing with gnome spices.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9580", + "name": "Unfinished crunchy", + "examine": "This spicy crunchy needs garnishing with gnome spices.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9581", + "name": "Half made crunchy", + "examine": "This toad crunchy needs baking and garnishing with equa leaves.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9582", + "name": "Unfinished crunchy", + "examine": "This toad crunchy needs garnishing with equa leaves.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9583", + "name": "Half made crunchy", + "examine": "This worm crunchy needs baking and garnishing with gnome spices.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9584", + "name": "Unfinished crunchy", + "examine": "This worm crunchy needs garnishing with gnome spices.", + "tradeable": "true", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9585", + "name": "Batta tin", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9586", + "name": "Crunchy tray", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9587", + "name": "Gnomebowl mould", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9588", + "name": "Raw crunchies", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9589", + "name": "Dossier", + "examine": "A dossier containing info on the Black Knight plot.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Speak to Sir Amik Varze at the beginning of the Black Knight's Fortress Quest.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9590", + "name": "Dossier", + "examine": "A dossier containing info on the Black Knight plot.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9592", + "name": "Magic glue", + "examine": "Glue made from tree sap and ground mud runes.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9593", + "name": "Weird gloop", + "examine": "This doesn't look like it will do anything interesting.", + "destroy": "true", + "tradeable": "false", + "weight": "2.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9594", + "name": "Ground mud runes", + "examine": "Mud runes ground into a powder.", + "destroy": "true", + "tradeable": "false", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9597", + "name": "Red circle", + "examine": "A red circular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9598", + "name": "Red triangle", + "examine": "A red triangular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9599", + "name": "Red square", + "examine": "A red square-shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9600", + "name": "Red pentagon", + "examine": "A red pentagon shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9601", + "name": "Orange circle", + "examine": "An orange circular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9602", + "name": "Orange triangle", + "examine": "An orange triangular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9603", + "name": "Orange square", + "examine": "An orange square-shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9604", + "name": "Orange pentagon", + "examine": "An orange pentagon shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9605", + "name": "Yellow circle", + "examine": "A yellow circular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9606", + "name": "Yellow triangle", + "examine": "A yellow triangular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9607", + "name": "Yellow square", + "examine": "A yellow square-shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9608", + "name": "Yellow pentagon", + "examine": "A yellow pentagon shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9609", + "name": "Green circle", + "examine": "A green circular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9610", + "name": "Green triangle", + "examine": "A green triangular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9611", + "name": "Green square", + "examine": "A green square shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9612", + "name": "Green pentagon", + "examine": "A green pentagon shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9613", + "name": "Blue circle", + "examine": "A blue circular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9614", + "name": "Blue triangle", + "examine": "A blue triangular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9615", + "name": "Blue square", + "examine": "A blue square shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9616", + "name": "Blue pentagon", + "examine": "A blue pentagon shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9617", + "name": "Indigo circle", + "examine": "An indigo circular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9618", + "name": "Indigo triangle", + "examine": "An indigo triangular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9619", + "name": "Indigo square", + "examine": "An indigo square shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9620", + "name": "Indigo pentagon", + "examine": "An indigo pentagon shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9621", + "name": "Violet circle", + "examine": "A violet circular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9622", + "name": "Violet triangle", + "examine": "A violet triangular crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9623", + "name": "Violet square", + "examine": "A violet square-shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9624", + "name": "Violet pentagon", + "examine": "A violet pentagon shaped crystalline disc.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9625", + "name": "Crystal saw", + "examine": "A magical saw.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Maybe Brimstail will have another...", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9626", + "name": "Small crystal seed", + "examine": "This small crystal seed looks grey and dead.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Maybe Brimstail will have another...", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9629", + "name": "Tyras helm", + "examine": "As used by King Tyras personal guard.", + "tradeable": "true", + "low_alchemy": "220", + "high_alchemy": "330", + "shop_price": "1265", + "grand_exchange_price": "1406", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "requirements": "{1,5}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9630", + "name": "Tyras helm", + "tradeable": "true", + "grand_exchange_price": "1406", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9632", + "name": "Daeyalt ore", + "examine": "This needs refining.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9634", + "name": "Vyrewatch top", + "examine": "Dressing like the Vyrewatch could be a useful disguise in the ghetto of Meiyerditch.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "635", + "grand_exchange_price": "2160", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9635", + "name": "Vyrewatch top", + "tradeable": "true", + "grand_exchange_price": "2160", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9636", + "name": "Vyrewatch legs", + "examine": "Dress like a powerful Vyrewatch!", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "635", + "grand_exchange_price": "1204", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9637", + "name": "Vyrewatch legs", + "tradeable": "true", + "grand_exchange_price": "1204", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9638", + "name": "Vyrewatch shoes", + "examine": "Dress like a powerful Vyrewatch!", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "shop_price": "635", + "grand_exchange_price": "2874", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9639", + "name": "Vyrewatch shoes", + "tradeable": "true", + "grand_exchange_price": "2874", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9640", + "name": "Citizen top", + "examine": "Could be used as a disguise in the ghetto of Meiyerditch.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "588", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9641", + "name": "Citizen top", + "tradeable": "true", + "grand_exchange_price": "588", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9642", + "name": "Citizen trousers", + "examine": "Could be used as a disguise in the ghetto of Meiyerditch.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "491", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9643", + "name": "Citizen trousers", + "tradeable": "true", + "grand_exchange_price": "491", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9644", + "name": "Citizen shoes", + "examine": "Could be used as a disguise in the ghetto of Meiyerditch.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "458", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9645", + "name": "Citizen shoes", + "tradeable": "true", + "grand_exchange_price": "458", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9646", + "name": "Castle sketch 1", + "examine": "Northern approach of the castle.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another sketch by using charcoal with papyrus, when on the wall near Castle Drakyn.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9647", + "name": "Castle sketch 2", + "examine": "Western approach of the castle.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another sketch by using charcoal with papyrus, when on the wall near Castle Drakyn.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9648", + "name": "Castle sketch 3", + "examine": "Southern approach of the castle.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another sketch by using charcoal with papyrus, when on the wall near Castle Drakyn.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9651", + "name": "Large ornate key", + "examine": "A key to some large, strange door.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9652", + "name": "Haemalchemy", + "examine": "A book called Haemalchemy Volume 1.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Unknown You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9653", + "name": "Sealed message", + "examine": "A sealed message from Safalaan to Valiaf.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Safalaan gave you this message; he would probably write out another one for you.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9654", + "name": "Door key", + "examine": "A key to the Witch's house's front door. (Witch's House)", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9655", + "name": "Ladder top", + "examine": "The top part of a ladder.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You found this ladder top on a wall section in the north of Meiyerditch; you can get another one there.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9656", + "name": "Tome of xp (3)", + "examine": "A tome of experience that awards 2000 XP per chapter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Tome of Experience from Veliaf in Burgh de Rott.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9657", + "name": "Tome of xp (2)", + "examine": "A tome of experience that awards 2000 XP per chapter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Tome of Experience from Veliaf in Burgh de Rott.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9658", + "name": "Tome of xp (1)", + "examine": "A tome of experience that awards 2000 XP per chapter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Tome of Experience from Veliaf in Burgh de Rott.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9659", + "name": "Bucket of water", + "examine": "Common bucket: It's a bucket of water.2008 Easter event: It's a bucket of water from the Easter Bunny's warren. Regular bucket filled from Braindeath Island: It's a bucket of... water?", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "74", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9660", + "name": "Bucket", + "examine": "It's an empty bucket.", + "tradeable": "true", + "high_alchemy": "1", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "2", + "grand_exchange_price": "50", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9662", + "name": "Shortcut key", + "examine": "A key allowing a shortcut into the Sanguinesti region. (Darkness of Hallowvale)", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Safalaan gave you this key as a reward for helping out in Meiyerditch, you can get another key from him.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9665", + "name": "Torch", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9666", + "name": "Pros'yte harness m", + "examine": "Unknown edit", + "tradeable": "true", + "shop_price": "25000", + "grand_exchange_price": "27500", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9667", + "name": "Pros'yte harness m", + "tradeable": "true", + "grand_exchange_price": "27500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9668", + "name": "Initiate harness m", + "examine": "Unknown edit", + "tradeable": "true", + "shop_price": "20000", + "grand_exchange_price": "22700", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9669", + "name": "Initiate harness m", + "tradeable": "true", + "grand_exchange_price": "22700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9670", + "name": "Pros'yte harness f", + "examine": "Unknown edit", + "tradeable": "true", + "shop_price": "25000", + "grand_exchange_price": "27900", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9671", + "name": "Pros'yte harness f", + "tradeable": "true", + "grand_exchange_price": "27900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9672", + "name": "Proselyte sallet", + "examine": "A Proselyte Temple Knight's helm.", + "tradeable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "shop_price": "8000", + "grand_exchange_price": "4619", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,4,0,0", + "requirements": "{1,30}-{5,20}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9673", + "name": "Proselyte sallet", + "tradeable": "true", + "grand_exchange_price": "4619", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9674", + "name": "Proselyte hauberk", + "examine": "A Proselyte Temple Knight's armour.", + "tradeable": "true", + "low_alchemy": "4800", + "high_alchemy": "7200", + "shop_price": "12000", + "grand_exchange_price": "7076", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-30,-10,65,63,55,-6,63,30,0,8,0,0", + "requirements": "{1,30}-{5,20}", + "weight": "8.6", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9675", + "name": "Proselyte hauberk", + "tradeable": "true", + "grand_exchange_price": "7076", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9676", + "name": "Proselyte cuisse", + "examine": "A Proselyte Temple Knight's leg armour", + "tradeable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "grand_exchange_price": "5923", + "equipment_slot": "7", + "absorb": "1,0,3", + "bonuses": "0,0,0,-21,-7,33,31,29,-4,31,10,0,5,0,0", + "requirements": "{1,30}-{5,20}", + "weight": "7.7", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9677", + "name": "Proselyte cuisse", + "tradeable": "true", + "grand_exchange_price": "5923", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9678", + "name": "Proselyte tasset", + "examine": "A Proselyte Temple Knight's leg armour.", + "tradeable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10", + "grand_exchange_price": "5730", + "equipment_slot": "7", + "absorb": "1,0,3", + "bonuses": "0,0,0,-21,-7,33,31,29,-4,31,10,0,5,0,0", + "requirements": "{1,30}-{5,20}", + "weight": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9679", + "name": "Proselyte tasset", + "tradeable": "true", + "grand_exchange_price": "5730", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9680", + "name": "Sea slug glue", + "examine": "A rendered down baby sea slug.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9681", + "name": "Commorb v2", + "examine": "A Temple Knight Communication Orb. Top Secret!", + "destroy_message": "As a security precaution, your CommOrb will automatically self", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9682", + "name": "Door transcription", + "examine": "A copy of the mysterious glyphs.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9683", + "name": "Dead sea slug", + "examine": "Dead sea slug, very sticky.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9684", + "name": "Page 1", + "examine": "A page from Maledict's holy book.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get this page from Mayor Hobb's Desk.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9685", + "name": "Page 2", + "examine": "A page from Maledict's holy book.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get this page from Ezekial Lovecraft.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9686", + "name": "Page 3", + "examine": "A page from Maledict's holy book.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will have to get the torn page from Col. O' Niall.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9687", + "name": "Fragment 1", + "examine": "A piece of torn page.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9688", + "name": "Fragment 2", + "examine": "A piece of torn page.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9689", + "name": "Fragment 3", + "examine": "A piece of torn page.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9690", + "name": "Blank water rune", + "examine": "A blank water rune.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure you wish to destroy this?", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9691", + "name": "Water rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "17", + "grand_exchange_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9692", + "name": "Blank air rune", + "examine": "A blank air rune.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure you wish to destroy this?", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9693", + "name": "Air rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "17", + "grand_exchange_price": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9694", + "name": "Blank earth rune", + "examine": "A blank earth rune.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure you wish to destroy this?", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9695", + "name": "Earth rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "17", + "grand_exchange_price": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9696", + "name": "Blank mind rune", + "examine": "A blank mind rune.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure you wish to destroy this?", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9697", + "name": "Mind rune", + "examine": "Used for basic missile spells.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "17", + "grand_exchange_price": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9698", + "name": "Blank fire rune", + "examine": "A blank fire rune.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure you wish to destroy this?", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9699", + "name": "Fire rune", + "examine": "One of the 4 basic elemental Runes.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "17", + "grand_exchange_price": "16", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9701", + "name": "Torch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9702", + "name": "Stick", + "examine": "A big, bad troll.", + "equipment_slot": "3", + "attack_speed": "6", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9703", + "name": "Training sword", + "examine": "Basic training sword.", + "shop_price": "35", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "4,3,-2,0,0,0,2,1,0,0,0,5,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,390,390,390", + "defence_anim": "397", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9704", + "name": "Training shield", + "examine": "Made of flimsy painted wood.", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,4,5,3,1,4,0,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9705", + "name": "Training bow", + "examine": "Light and flexible, good for a beginner.", + "destroy": "true", + "tradeable": "false", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,8,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "2700,0,0,0", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9706", + "name": "Training arrows", + "examine": "Standard training arrows.", + "destroy": "true", + "tradeable": "false", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9715", + "name": "Slashed book", + "examine": "Book of the elemental shield.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9717", + "name": "Beaten book", + "examine": "Book of the elemental helm.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9718", + "name": "Crane schematic", + "examine": "On the subject of lava dippers.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9719", + "name": "Lever schematic", + "examine": "A scroll with a lever schematic drawn on it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9720", + "name": "Crane claw", + "examine": "A crane claw.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9723", + "name": "Pipe", + "examine": "A pipe that belongs in a cannon stand.", + "destroy": "true", + "tradeable": "false", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9724", + "name": "Large cog", + "examine": "A large cog.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9725", + "name": "Medium cog", + "examine": "A medium cog.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9726", + "name": "Small cog", + "examine": "A small cog.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9727", + "name": "Primed bar", + "examine": "A primed elemental ingot.", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9728", + "name": "Elemental mind bar", + "examine": "An elemental mind ingot.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9729", + "name": "Elemental helmet", + "examine": "A helmet made in the Elemental Workshop.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "196", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,0,0,0,4,0,0,0,0,0,0", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9730", + "name": "Elemental helmet", + "tradeable": "true", + "grand_exchange_price": "196", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9731", + "name": "Mind shield", + "examine": "A shield made in the Elemental Workshop.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "8351", + "equipment_slot": "5", + "bonuses": "0,0,0,0,0,0,0,0,9,0,25,0,0,0,0", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9732", + "name": "Mind shield", + "tradeable": "true", + "grand_exchange_price": "8351", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9733", + "name": "Mind helmet", + "examine": "A helmet made in the Elemental Workshop.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "1200", + "grand_exchange_price": "1589", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,0,0,0,6,0,0,0,0,0,0", + "weight": "0.1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9734", + "name": "Mind helmet", + "tradeable": "true", + "grand_exchange_price": "1589", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9735", + "name": "Desert goat horn", + "examine": "Not much good for blowing.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "grand_exchange_price": "902", + "weight": "0.4", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9736", + "name": "Goat horn dust", + "examine": "Finely ground desert goat horn.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "grand_exchange_price": "1082", + "weight": "0.4", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9737", + "name": "Goat horn dust", + "tradeable": "true", + "grand_exchange_price": "1082", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9738", + "name": "Desert goat horn", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9739", + "name": "Combat potion(4)", + "examine": "X dose(s) of combat potion.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "207", + "grand_exchange_price": "45", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9740", + "name": "Combat potion(4)", + "tradeable": "true", + "grand_exchange_price": "45", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9741", + "name": "Combat potion(3)", + "examine": "X dose(s) of combat potion.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "207", + "grand_exchange_price": "25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9742", + "name": "Combat potion(3)", + "tradeable": "true", + "grand_exchange_price": "25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9743", + "name": "Combat potion(2)", + "examine": "X dose(s) of combat potion.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "207", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9744", + "name": "Combat potion(2)", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9745", + "name": "Combat potion(1)", + "examine": "X dose(s) of combat potion.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "shop_price": "207", + "grand_exchange_price": "72", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9746", + "name": "Combat potion(1)", + "tradeable": "true", + "grand_exchange_price": "72", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9747", + "name": "Attack cape", + "examine": "The cape worn by masters of attack.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9748", + "name": "Attack cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9749", + "name": "Attack hood", + "examine": "Attack skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9750", + "name": "Strength cape", + "examine": "The cape only worn by the strongest people.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9751", + "name": "Strength cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9752", + "name": "Strength hood", + "examine": "Strength skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9753", + "name": "Defence cape", + "examine": "The cape worn by masters of the art of Defence.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9754", + "name": "Defence cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9755", + "name": "Defence hood", + "examine": "Defence skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9756", + "name": "Ranging cape", + "examine": "The cape worn by master archers.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9757", + "name": "Ranging cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9758", + "name": "Ranging hood", + "examine": "Range skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9759", + "name": "Prayer cape", + "examine": "The cape worn by the most pious of heroes.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9760", + "name": "Prayer cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9761", + "name": "Prayer hood", + "examine": "Prayer skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9762", + "name": "Magic cape", + "examine": "The cape worn by the most powerful mages.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9763", + "name": "Magic cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9764", + "name": "Magic hood", + "examine": "Magic skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9765", + "name": "Runecraft cape", + "examine": "The cape worn by master runecrafters.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9766", + "name": "Runecraft cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9767", + "name": "Runecrafting hood", + "examine": "Runecrafting skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9768", + "name": "Hitpoints cape", + "examine": "The cape worn by well-constituted adventurers.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9769", + "name": "Hitpoints cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9770", + "name": "Hitpoints hood", + "examine": "Constitution skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9771", + "name": "Agility cape", + "examine": "The cape worn by the most agile of heroes.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9772", + "name": "Agility cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9773", + "name": "Agility hood", + "examine": "Agility skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9774", + "name": "Herblore cape", + "examine": "The cape worn by the most skilled at the art of herblore.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9775", + "name": "Herblore cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9776", + "name": "Herblore hood", + "examine": "Herblore skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9777", + "name": "Thieving cape", + "examine": "The cape worn by master thieves.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9778", + "name": "Thieving cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9779", + "name": "Thieving hood", + "examine": "Thieving skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9780", + "name": "Crafting cape", + "examine": "The cape worn by master craftworkers.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9781", + "name": "Crafting cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9782", + "name": "Crafting hood", + "examine": "Crafting skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9783", + "name": "Fletching cape", + "examine": "The cape worn by the best of fletchers.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9784", + "name": "Fletching cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9785", + "name": "Fletching hood", + "examine": "Fletching skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9786", + "name": "Slayer cape", + "examine": "The cape worn by slayer masters.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9787", + "name": "Slayer cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9788", + "name": "Slayer hood", + "examine": "Slayer skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9789", + "name": "Construct. cape", + "examine": "The cape worn by master builders.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9790", + "name": "Construct. cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9791", + "name": "Construct. hood", + "examine": "Construction skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9792", + "name": "Mining cape", + "examine": "The cape worn by the most skilled miners.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9793", + "name": "Mining cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9794", + "name": "Mining hood", + "examine": "Mining skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9795", + "name": "Smithing cape", + "examine": "The cape worn by master smiths.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9796", + "name": "Smithing cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9797", + "name": "Smithing hood", + "examine": "Smithing skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9798", + "name": "Fishing cape", + "examine": "The cape worn by the best fishermen.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9799", + "name": "Fishing cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9800", + "name": "Fishing hood", + "examine": "Fishing skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9801", + "name": "Cooking cape", + "examine": "The cape worn by the world's best chefs.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9802", + "name": "Cooking cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9803", + "name": "Cooking hood", + "examine": "Cooking skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9804", + "name": "Firemaking cape", + "examine": "The cape worn by master firelighters.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9805", + "name": "Firemaking cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9806", + "name": "Firemaking hood", + "examine": "Firemaking skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9807", + "name": "Woodcutting cape", + "examine": "The cape worn by master woodcutters (Obtaining level 99 skill)", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9808", + "name": "Woodcut. cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9809", + "name": "Woodcutting hood", + "examine": "Woodcutting skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9810", + "name": "Farming cape", + "examine": "The cape worn by master farmers.", + "tradeable": "false", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9811", + "name": "Farming cape(t)", + "tradeable": "false", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9812", + "name": "Farming hood", + "examine": "Farming skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9813", + "name": "Quest point cape", + "examine": "The cape worn by only the most experienced adventurers.", + "tradeable": "false", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9814", + "name": "Quest point hood", + "examine": "Quest skillcape hood.", + "tradeable": "false", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9815", + "name": "Bobble hat", + "examine": "A woolly bobble hat.", + "destroy": "true", + "tradeable": "false", + "equipment_slot": "0", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9816", + "name": "Bobble scarf", + "examine": "A woolly scarf.", + "equipment_slot": "2", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9817", + "name": "Oak cape rack", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9818", + "name": "Teak cape rack", + "grand_exchange_price": "88", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9819", + "name": "M'gany cape rack", + "grand_exchange_price": "120", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9820", + "name": "Gilded cape rack", + "grand_exchange_price": "136025", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9821", + "name": "Marble cape rack", + "grand_exchange_price": "328598", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9822", + "name": "Magical cape rack", + "grand_exchange_price": "979747", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9823", + "name": "Oak costume box", + "grand_exchange_price": "59", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9824", + "name": "Teak costume box", + "grand_exchange_price": "122", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9825", + "name": "Mahogany cos box", + "grand_exchange_price": "59", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9826", + "name": "Oak armour case", + "grand_exchange_price": "15", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9827", + "name": "Teak armour case", + "grand_exchange_price": "27", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9828", + "name": "M'gany arm'r case", + "grand_exchange_price": "90", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9829", + "name": "Oak magic wardrobe", + "grand_exchange_price": "103", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9830", + "name": "Carved oak magic wardrobe", + "grand_exchange_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9831", + "name": "Teak magic wardrobe", + "grand_exchange_price": "127", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9832", + "name": "Carved teak magic wardrobe", + "grand_exchange_price": "13", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9833", + "name": "Mahogany magic wardrobe", + "grand_exchange_price": "135", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9834", + "name": "Gilded magic wardrobe", + "grand_exchange_price": "137267", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9835", + "name": "Marble magic wardrobe", + "grand_exchange_price": "341567", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9836", + "name": "Oak toy box", + "grand_exchange_price": "21", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9837", + "name": "Teak toy box", + "grand_exchange_price": "151", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9838", + "name": "Mahogany toy box", + "grand_exchange_price": "20", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9839", + "name": "Oak treasure chest", + "grand_exchange_price": "21", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9840", + "name": "Teak treas' chest", + "grand_exchange_price": "157", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9841", + "name": "M'gany treas' chest", + "grand_exchange_price": "39", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9843", + "name": "Oak cape rack", + "grand_exchange_price": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9844", + "name": "Teak cape rack", + "grand_exchange_price": "92", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9845", + "name": "M'gany cape rack", + "grand_exchange_price": "111", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9846", + "name": "Gilded cape rack", + "grand_exchange_price": "130900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9847", + "name": "Marble cape rack", + "grand_exchange_price": "329500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9848", + "name": "Magical cape rack", + "grand_exchange_price": "1000000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9849", + "name": "Oak toy box", + "grand_exchange_price": "25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9850", + "name": "Teak toy box", + "grand_exchange_price": "165", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9851", + "name": "Mahogany toy box", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9852", + "name": "Oak magic wardrobe", + "grand_exchange_price": "111", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9853", + "name": "Carved oak magic wardrobe", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9854", + "name": "Teak magic wardrobe", + "grand_exchange_price": "133", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9855", + "name": "Carved teak magic wardrobe", + "grand_exchange_price": "15", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9856", + "name": "Mahogany magic wardrobe", + "grand_exchange_price": "129", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9857", + "name": "Gilded magic wardrobe", + "grand_exchange_price": "137700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9858", + "name": "Marble magic wardrobe", + "grand_exchange_price": "335800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9859", + "name": "Oak armour case", + "grand_exchange_price": "17", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9860", + "name": "Teak armour case", + "grand_exchange_price": "29", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9861", + "name": "M'gany arm'r case", + "grand_exchange_price": "88", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9862", + "name": "Oak treasure chest", + "grand_exchange_price": "24", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9863", + "name": "Teak treas' chest", + "grand_exchange_price": "164", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9864", + "name": "M'gany treas' chest", + "grand_exchange_price": "41", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9865", + "name": "Oak costume box", + "grand_exchange_price": "62", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9866", + "name": "Teak costume box", + "grand_exchange_price": "135", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9867", + "name": "Mahogany cos box", + "grand_exchange_price": "60", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9868", + "name": "Oak cape rack", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9869", + "name": "Teak cape rack", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9870", + "name": "M'gany cape rack", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9871", + "name": "Gilded cape rack", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9872", + "name": "Marble cape rack", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9873", + "name": "Magical cape rack", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9874", + "name": "Oak toy box", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9875", + "name": "Teak toy box", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9876", + "name": "Mahogany toy box", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9877", + "name": "Oak magic wardrobe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9878", + "name": "Carved oak magic wardrobe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9879", + "name": "Teak magic wardrobe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9880", + "name": "Carved teak magic wardrobe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9881", + "name": "Mahogany magic wardrobe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9882", + "name": "Gilded magic wardrobe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9883", + "name": "Marble magic wardrobe", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9884", + "name": "Oak armour case", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9885", + "name": "Teak armour case", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9886", + "name": "M'gany arm'r case", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9887", + "name": "Oak treasure chest", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9888", + "name": "Teak treas' chest", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9889", + "name": "M'gany treas' chest", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9890", + "name": "Oak costume box", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9891", + "name": "Teak costume box", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9892", + "name": "Mahogany cos box", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9901", + "name": "Goutweedy lump", + "examine": "A lump that at some point might have been a gout tuber.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9902", + "name": "Hardy gout tubers", + "examine": "A pile of gout tubers suitable for use in mountainous terrain.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9903", + "name": "Farming manual", + "examine": "Farmer Gricoller's Farming Manual.", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "tradeable": "false", + "destroy_message": "My Arm will probably have a spare copy.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9904", + "name": "Sailing book", + "examine": "A book for sailors.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9906", + "name": "Ghost buster 500", + "examine": "See article", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9907", + "name": "Ghost buster 500", + "examine": "See article", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9908", + "name": "Ghost buster 500", + "examine": "See article", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9909", + "name": "Ghost buster 500", + "examine": "See article", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9910", + "name": "Ghost buster 500", + "examine": "See article", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9911", + "name": "Ghost buster 500", + "examine": "See article", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9912", + "name": "Ghost buster 500", + "examine": "See article", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9913", + "name": "White destabiliser", + "examine": "A white destabiliser for use in a ghost buster.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9914", + "name": "Red destabiliser", + "examine": "A red destabiliser for use in a ghost buster.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9915", + "name": "Blue destabiliser", + "examine": "A blue destabiliser for use in a ghost buster.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9916", + "name": "Green destabiliser", + "examine": "A green destabiliser for use in a ghost buster.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9917", + "name": "Yellow destabiliser", + "examine": "A yellow destabiliser for use in a ghost buster.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9918", + "name": "Black destabiliser", + "examine": "A black destabiliser for use in a ghost buster.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9919", + "name": "Evil root", + "examine": "An angry-looking tree root.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9920", + "name": "Jack lantern mask", + "examine": "Better not light it!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Players may get another from Diango in Draynor Village.", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9921", + "name": "Skeleton boots", + "examine": "Skeleton feet.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "10", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9922", + "name": "Skeleton gloves", + "examine": "Some skeletal gloves.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "9", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9923", + "name": "Skeleton leggings", + "examine": "Does my pelvis look big in this?", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "7", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9924", + "name": "Skeleton shirt", + "examine": "The shirt of a fully body skeleton costume.", + "destroy_message": "You can reclaim this item from the place you found it.", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9925", + "name": "Skeleton mask", + "examine": "A scary skeleton mask.", + "destroy_message": "You can reclaim this item from the place you found it.", + "remove_head": "true", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9932", + "name": "Auguste's sapling", + "examine": "This sapling is ready to be replanted in a tree patch.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to buy another one from Auguste on Entrana.", + "shop_price": "30000", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9933", + "name": "Balloon structure", + "examine": "An incomplete origami balloon.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9934", + "name": "Origami balloon", + "examine": "An origami balloon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9935", + "name": "Yellow balloon", + "examine": "An origami balloon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9936", + "name": "Blue balloon", + "examine": "An origami balloon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9937", + "name": "Red balloon", + "examine": "An origami balloon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9938", + "name": "Orange balloon", + "examine": "An origami balloon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9939", + "name": "Green balloon", + "examine": "An origami balloon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9940", + "name": "Purple balloon", + "examine": "An origami balloon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9941", + "name": "Pink balloon", + "examine": "An origami balloon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9942", + "name": "Black balloon", + "examine": "An origami balloon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9943", + "name": "Sandbag", + "examine": "A bag full of sand.", + "equipment_slot": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9944", + "name": "Bomber jacket", + "examine": "For all your flying needs.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to visit Auguste on Entrana to get a new jacket.", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9945", + "name": "Bomber cap", + "examine": "The red baron would be jealous.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to visit Auguste on Entrana to get a new cap.", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9946", + "name": "Cap and goggles", + "examine": "For better flying vision.", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9947", + "name": "Old red disk", + "examine": "A red coloured disk that's seen better days.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9948", + "name": "Hunter cape", + "examine": "The cape worn by master hunters.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9949", + "name": "Hunter cape(t)", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9950", + "name": "Hunter hood", + "examine": "Hunter skillcape hood.", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9952", + "name": "Imp", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9953", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9954", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9955", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9956", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9957", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9958", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9959", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9960", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9961", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9962", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9963", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9964", + "name": "Kebbit", + "examine": "A little bigger than usual...", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9974", + "name": "Giant eagle", + "examine": "It appears to be protecting the nest.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9975", + "name": "Rabbit", + "examine": "Aww, how cute. ", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9977", + "name": "Red chinchompa", + "examine": "Even more volatile than its vegetarian counterpart.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "destroy": "true", + "grand_exchange_price": "796", + "attack_speed": "4", + "bonuses": "0,0,0,0,70,0,0,0,0,0,0,0,15,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9978", + "name": "Raw bird meat", + "examine": "This certainly needs cooking!", + "tradeable": "true", + "low_alchemy": "25", + "high_alchemy": "37", + "shop_price": "63", + "grand_exchange_price": "204", + "weight": "0.15", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9979", + "name": "Raw bird meat", + "tradeable": "true", + "grand_exchange_price": "204", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9980", + "name": "Roast bird meat", + "examine": "A nicely roasted bird.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "grand_exchange_price": "18", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9981", + "name": "Roast bird meat", + "tradeable": "true", + "grand_exchange_price": "18", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9983", + "name": "Burnt bird meat", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9984", + "name": "Skewered bird meat", + "examine": "This certainly needs cooking!", + "tradeable": "true", + "low_alchemy": "25", + "high_alchemy": "37", + "shop_price": "63", + "grand_exchange_price": "130", + "weight": "0.15", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9985", + "name": "Skewered bird meat", + "tradeable": "true", + "grand_exchange_price": "130", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9986", + "name": "Raw beast meat", + "examine": "A slab of raw beast meat.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "16", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9987", + "name": "Raw beast meat", + "tradeable": "true", + "grand_exchange_price": "16", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9988", + "name": "Roast beast meat", + "examine": "A delicious looking slab of roast beast.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "42", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9989", + "name": "Roast beast meat", + "tradeable": "true", + "grand_exchange_price": "42", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9991", + "name": "Burnt beast meat", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9992", + "name": "Skewered beast", + "examine": "Beast meat on a spit.", + "tradeable": "true", + "low_alchemy": "35", + "high_alchemy": "53", + "grand_exchange_price": "97", + "weight": "3.5", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9993", + "name": "Skewered beast", + "tradeable": "true", + "grand_exchange_price": "97", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9994", + "name": "Spicy tomato", + "examine": "A bowl of chopped tomatoes with an extra kick.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "324", + "weight": "0.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9995", + "name": "Spicy tomato", + "tradeable": "true", + "grand_exchange_price": "324", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9996", + "name": "Spicy minced meat", + "examine": "A bowl of chopped beef with an extra kick.", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "4", + "grand_exchange_price": "263", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9997", + "name": "Spicy minced meat", + "tradeable": "true", + "grand_exchange_price": "263", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9998", + "name": "Hunter potion(4)", + "examine": "X doses of hunter potion.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "566", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "9999", + "name": "Hunter potion(4)", + "tradeable": "true", + "grand_exchange_price": "566", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10000", + "name": "Hunter potion(3)", + "examine": "X doses of hunter potion.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "229", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10001", + "name": "Hunter potion(3)", + "tradeable": "true", + "grand_exchange_price": "229", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10002", + "name": "Hunter potion(2)", + "examine": "X doses of hunter potion.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "159", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10003", + "name": "Hunter potion(2)", + "tradeable": "true", + "grand_exchange_price": "159", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10004", + "name": "Hunter potion(1)", + "examine": "X doses of hunter potion.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "148", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10005", + "name": "Hunter potion(1)", + "tradeable": "true", + "grand_exchange_price": "148", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10006", + "name": "Bird snare", + "examine": "A simple bird catcher./There's something caught in it.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "6", + "grand_exchange_price": "2", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10007", + "name": "Bird snare", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10008", + "name": "Box trap", + "examine": "If a creature goes inside, then the box should slam shut.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "shop_price": "38", + "grand_exchange_price": "308", + "requirements": "{21,27}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10009", + "name": "Box trap", + "tradeable": "true", + "grand_exchange_price": "308", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10010", + "name": "Butterfly net", + "examine": "For catching butterflies...", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "24", + "grand_exchange_price": "1", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "weapon_interface": "10", + "requirements": "{15,21}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10011", + "name": "Butterfly net", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10012", + "name": "Butterfly jar", + "examine": "It's got little holes at the top.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "156", + "requirements": "{15,21}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10013", + "name": "Butterfly jar", + "tradeable": "true", + "grand_exchange_price": "156", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10014", + "name": "Black warlock", + "grand_exchange_price": "143", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10015", + "name": "Black warlock", + "tradeable": "true", + "grand_exchange_price": "143", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10016", + "name": "Snowy knight", + "grand_exchange_price": "227", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10017", + "name": "Snowy knight", + "tradeable": "true", + "grand_exchange_price": "227", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10018", + "name": "Sapphire glacialis", + "grand_exchange_price": "180", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10019", + "name": "Sapphire glacialis", + "tradeable": "true", + "grand_exchange_price": "180", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10020", + "name": "Ruby harvest", + "grand_exchange_price": "1270", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10021", + "name": "Ruby harvest", + "tradeable": "true", + "grand_exchange_price": "1270", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10023", + "name": "Falconer's glove", + "examine": "A very large, single leather glove", + "tradeable": "false", + "destroy": "true", + "shop_price": "500", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10024", + "name": "Falconer's glove", + "examine": "A very large, single leather glove", + "tradeable": "false", + "destroy": "true", + "shop_price": "500", + "stand_anim": "5160", + "stand_turn_anim": "5161", + "walk_anim": "5164", + "run_anim": "5168", + "turn180_anim": "5165", + "turn90cw_anim": "5166", + "turn90ccw_anim": "5167", + "render_anim": "1283", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,0,0,1,1,0,0,0,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10025", + "name": "Magic box", + "examine": "A magical catching box.", + "tradeable": "true", + "low_alchemy": "288", + "high_alchemy": "432", + "shop_price": "720", + "grand_exchange_price": "784", + "requirements": "{21,71}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10026", + "name": "Magic box", + "tradeable": "true", + "grand_exchange_price": "784", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10027", + "name": "Imp-in-a-box(2)", + "examine": "A magical catching box.", + "tradeable": "true", + "low_alchemy": "288", + "high_alchemy": "432", + "shop_price": "720", + "grand_exchange_price": "743", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10028", + "name": "Imp-in-a-box(1)", + "examine": "A magical catching box.", + "tradeable": "true", + "low_alchemy": "288", + "high_alchemy": "432", + "shop_price": "720", + "grand_exchange_price": "743", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10029", + "name": "Teasing stick", + "examine": "Reduces the risk of hand severage when poking large, vicious carnivores.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "1", + "grand_exchange_price": "1", + "equipment_slot": "3", + "bonuses": "7,8,0,-4,0,-1,1,2,0,0,0,8,0,0,0", + "weapon_interface": "6", + "requirements": "{21,31}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10030", + "name": "Teasing stick", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10031", + "name": "Rabbit snare", + "examine": "The snare will tighten around animals passing through.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "shop_price": "18", + "grand_exchange_price": "1", + "requirements": "{21,27}", + "weight": "0.02", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10032", + "name": "Rabbit snare", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10033", + "name": "Chinchompa", + "grand_exchange_price": "973", + "stand_anim": "3175", + "stand_turn_anim": "3177", + "walk_anim": "3177", + "run_anim": "3178", + "turn180_anim": "3177", + "turn90cw_anim": "3177", + "turn90ccw_anim": "3177", + "render_anim": "234", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,45,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "19", + "requirements": "{4,45}", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10034", + "name": "Red chinchompa", + "examine": "Even more volatile than its vegetarian counterpart.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "destroy": "true", + "grand_exchange_price": "1382", + "stand_anim": "3175", + "stand_turn_anim": "3177", + "walk_anim": "3177", + "run_anim": "3178", + "turn180_anim": "3177", + "turn90cw_anim": "3177", + "turn90ccw_anim": "3177", + "render_anim": "234", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,70,0,0,0,0,0,0,0,0,0,15", + "weapon_interface": "19", + "requirements": "{4,55}", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10035", + "name": "Kyatt legs", + "examine": "These should make me harder to spot in polar areas.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "449", + "equipment_slot": "7", + "bonuses": "0,0,0,0,-7,11,10,10,0,10,10,0,0,0,0", + "requirements": "{21,52}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10036", + "name": "Kyatt legs", + "tradeable": "true", + "grand_exchange_price": "449", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10037", + "name": "Kyatt top", + "examine": "This should make me harder to spot in polar areas.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "272", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,20,0,0,0,0", + "requirements": "{21,52}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10038", + "name": "Kyatt top", + "tradeable": "true", + "grand_exchange_price": "272", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10039", + "name": "Kyatt hat", + "examine": "This should make me harder to spot in polar areas.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "8338", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,-1,4,5,3,0,4,3,0,0,0,0", + "requirements": "{21,52}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10040", + "name": "Kyatt hat", + "tradeable": "true", + "grand_exchange_price": "8338", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10041", + "name": "Larupia legs", + "examine": "This should make me harder to spot in woodland and jungle areas.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "2889", + "equipment_slot": "7", + "bonuses": "0,0,0,0,-7,11,10,10,0,10,5,0,0,0,0", + "requirements": "{21,28}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10042", + "name": "Larupia legs", + "tradeable": "true", + "grand_exchange_price": "2889", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10043", + "name": "Larupia top", + "examine": "This should make me harder to spot in woodland and jungle areas.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "3232", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,10,0,0,0,0", + "requirements": "{21,28}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10044", + "name": "Larupia top", + "tradeable": "true", + "grand_exchange_price": "3232", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10045", + "name": "Larupia hat", + "examine": "This should make me harder to spot in woodland and jungle areas.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "7237", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,-1,4,5,3,0,4,5,0,0,0,0", + "requirements": "{21,28}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10046", + "name": "Larupia hat", + "tradeable": "true", + "grand_exchange_price": "7237", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10047", + "name": "Graahk legs", + "examine": "These should make me harder to spot in desert areas.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "150", + "grand_exchange_price": "266", + "equipment_slot": "7", + "bonuses": "0,0,0,0,-7,11,10,10,0,10,10,0,0,0,0", + "requirements": "{21,38}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10048", + "name": "Graahk legs", + "tradeable": "true", + "grand_exchange_price": "266", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10049", + "name": "Graahk top", + "examine": "This should make me harder to spot in desert areas.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "300", + "grand_exchange_price": "252", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,15,0,0,0,0", + "requirements": "{21,38}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10050", + "name": "Graahk top", + "tradeable": "true", + "grand_exchange_price": "252", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10051", + "name": "Graahk headdress", + "examine": "This should make me harder to spot in desert areas.", + "tradeable": "true", + "low_alchemy": "300", + "high_alchemy": "450", + "shop_price": "1", + "grand_exchange_price": "8445", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,-1,4,5,3,0,4,3,0,0,0,0", + "requirements": "{21,38}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10052", + "name": "Graahk headdress", + "tradeable": "true", + "grand_exchange_price": "8445", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10053", + "name": "Wood camo top", + "examine": "This should make me harder to spot in wooded areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "3527", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,5,0,0,0,0", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10054", + "name": "Wood camo top", + "tradeable": "true", + "grand_exchange_price": "3527", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10055", + "name": "Wood camo legs", + "examine": "These should make me harder to spot in wooded areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "3228", + "equipment_slot": "7", + "bonuses": "0,0,0,0,-7,11,10,10,0,10,0,0,0,0,0", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10056", + "name": "Wood camo legs", + "tradeable": "true", + "grand_exchange_price": "3228", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10057", + "name": "Jungle camo top", + "examine": "This should make me harder to spot in jungle areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "315", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,5,0,0,0,0", + "requirements": "{21,4}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10058", + "name": "Jungle camo top", + "tradeable": "true", + "grand_exchange_price": "315", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10059", + "name": "Jungle camo legs", + "examine": "These should make me harder to spot in jungle areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "462", + "equipment_slot": "7", + "bonuses": "0,0,0,0,-7,11,10,10,0,10,0,0,0,0,0", + "requirements": "{21,4}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10060", + "name": "Jungle camo legs", + "tradeable": "true", + "grand_exchange_price": "462", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10061", + "name": "Desert camo top", + "examine": "This should make me harder to spot in desert areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "541", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,10,0,0,0,0", + "requirements": "{21,10}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10062", + "name": "Desert camo top", + "tradeable": "true", + "grand_exchange_price": "541", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10063", + "name": "Desert camo legs", + "examine": "These should make me harder to spot in desert areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "910", + "equipment_slot": "7", + "bonuses": "0,0,0,0,-7,11,10,10,0,10,0,0,0,0,0", + "requirements": "{21,10}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10064", + "name": "Desert camo legs", + "tradeable": "true", + "grand_exchange_price": "910", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10065", + "name": "Polar camo top", + "examine": "This should make me harder to spot in polar areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "7990", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,5,0,0,0,0", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10066", + "name": "Polar camo top", + "tradeable": "true", + "grand_exchange_price": "7990", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10067", + "name": "Polar camo legs", + "examine": "These should make me harder to spot in polar areas", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "8389", + "equipment_slot": "7", + "bonuses": "0,0,0,0,-7,11,10,10,0,10,0,0,0,0,0", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10068", + "name": "Polar camo legs", + "tradeable": "true", + "grand_exchange_price": "8389", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10069", + "name": "Spotted cape", + "examine": "A surprisingly aerodynamic cape.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "1140", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "requirements": "{21,40}", + "weight": "-2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10070", + "name": "Spotted cape", + "tradeable": "true", + "grand_exchange_price": "1140", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10071", + "name": "Spottier cape", + "examine": "A really surprisingly aerodynamic cape.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "1262", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "requirements": "{21,66}", + "weight": "-4.5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10072", + "name": "Spottier cape", + "tradeable": "true", + "grand_exchange_price": "1262", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10073", + "name": "Spotted cape", + "examine": "A surprisingly aerodynamic cape.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "951", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "requirements": "{21,40}", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10074", + "name": "Spottier cape", + "examine": "A really surprisingly aerodynamic cape.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "881", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "requirements": "{21,66}", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10075", + "name": "Gloves of silence", + "examine": "Made from dark kebbit fur, these are perfect for tasks of a stealthier nature.", + "tradeable": "true", + "low_alchemy": "240", + "high_alchemy": "360", + "grand_exchange_price": "1063", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "requirements": "{21,54}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10076", + "name": "Gloves of silence", + "tradeable": "true", + "grand_exchange_price": "1063", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10077", + "name": "Spiky vambraces", + "examine": "Attack at your own risk.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "grand_exchange_price": "80", + "equipment_slot": "9", + "bonuses": "0,0,0,0,4,2,2,1,0,0,1,2,0,0,0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10078", + "name": "Spiky vambraces", + "tradeable": "true", + "grand_exchange_price": "80", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10079", + "name": "Green spiky vambs", + "examine": "Made from 100% real dragonhide. Now with added spikiness.", + "tradeable": "true", + "low_alchemy": "1000", + "high_alchemy": "1500", + "grand_exchange_price": "1353", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,8,3,2,4,2,0,3,2,0,0,0", + "requirements": "{4,40}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10080", + "name": "Green spiky vambs", + "tradeable": "true", + "grand_exchange_price": "1353", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10081", + "name": "Blue spiky vambs", + "examine": "Made from 100% real dragonhide. Now with added spikiness.", + "tradeable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "grand_exchange_price": "1773", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,9,4,3,5,4,0,4,2,0,0,0", + "requirements": "{4,50}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10082", + "name": "Blue spiky vambs", + "tradeable": "true", + "grand_exchange_price": "1773", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10083", + "name": "Red spiky vambs", + "examine": "Vambraces made from 100% real dragonhide. Now with added spikes.", + "tradeable": "true", + "low_alchemy": "1440", + "high_alchemy": "2160", + "grand_exchange_price": "1978", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,10,5,4,6,6,0,5,2,0,0,0", + "requirements": "{4,60}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10084", + "name": "Red spiky vambs", + "tradeable": "true", + "grand_exchange_price": "1978", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10085", + "name": "Black spiky vambs", + "examine": "Vambraces made from 100% real dragonhide. Now with added spikiness.", + "tradeable": "true", + "low_alchemy": "1728", + "high_alchemy": "2592", + "grand_exchange_price": "2727", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,11,6,5,7,8,0,6,2,0,0,0", + "requirements": "{4,70}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10086", + "name": "Black spiky vambs", + "tradeable": "true", + "grand_exchange_price": "2727", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10087", + "name": "Stripy feather", + "examine": "Attractive to other birds and hunters alike.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "20", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10088", + "name": "Red feather", + "examine": "A vivid red feather.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "3", + "grand_exchange_price": "23", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10089", + "name": "Blue feather", + "examine": "A cool blue feather.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "27", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10090", + "name": "Yellow feather", + "examine": "A bright yellow feather.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "grand_exchange_price": "36", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10091", + "name": "Orange feather", + "examine": "A fairly plain feather.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "shop_price": "6", + "grand_exchange_price": "25", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10093", + "name": "Tatty larupia fur", + "examine": "It's a shabby-looking larupia fur.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "43", + "grand_exchange_price": "1195", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10094", + "name": "Tatty larupia fur", + "tradeable": "true", + "grand_exchange_price": "1195", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10095", + "name": "Larupia fur", + "examine": "It's a perfect-looking larupia fur.", + "tradeable": "true", + "low_alchemy": "38", + "high_alchemy": "57", + "grand_exchange_price": "4986", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10096", + "name": "Larupia fur", + "tradeable": "true", + "grand_exchange_price": "4986", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10097", + "name": "Tatty graahk fur", + "examine": "It's a shabby-looking graahk fur.", + "tradeable": "true", + "low_alchemy": "43", + "high_alchemy": "64", + "grand_exchange_price": "28", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10098", + "name": "Tatty graahk fur", + "tradeable": "true", + "grand_exchange_price": "28", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10099", + "name": "Graahk fur", + "examine": "It's a perfect-looking graahk fur.", + "tradeable": "true", + "low_alchemy": "57", + "high_alchemy": "86", + "grand_exchange_price": "7574", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10100", + "name": "Graahk fur", + "tradeable": "true", + "grand_exchange_price": "7574", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10101", + "name": "Tatty kyatt fur", + "examine": "It's a shabby-looking kyatt fur.", + "tradeable": "true", + "low_alchemy": "57", + "high_alchemy": "86", + "grand_exchange_price": "23", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10102", + "name": "Tatty kyatt fur", + "tradeable": "true", + "grand_exchange_price": "23", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10103", + "name": "Kyatt fur", + "examine": "It's a perfect-looking kyatt fur.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "115", + "shop_price": "8000", + "grand_exchange_price": "11100", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10104", + "name": "Kyatt fur", + "tradeable": "true", + "grand_exchange_price": "11100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10105", + "name": "Kebbit spike", + "examine": "These bone spikes are both very tough and very sharp.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "154", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10106", + "name": "Kebbit spike", + "tradeable": "true", + "grand_exchange_price": "154", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10107", + "name": "Long kebbit spike", + "examine": "These bone spikes are both very tough and very sharp.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "1619", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10108", + "name": "Long kebbit spike", + "tradeable": "true", + "grand_exchange_price": "1619", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10109", + "name": "Kebbit teeth", + "examine": "A kebbit-sized set of dentures.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "grand_exchange_price": "894", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10110", + "name": "Kebbit teeth", + "tradeable": "true", + "grand_exchange_price": "894", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10111", + "name": "Kebbit teeth dust", + "examine": "Previously a kebbit-sized set of dentures.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "grand_exchange_price": "947", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10112", + "name": "Kebbit teeth dust", + "tradeable": "true", + "grand_exchange_price": "947", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10113", + "name": "Kebbit claws", + "examine": "More menacing when attached to the owner.", + "tradeable": "true", + "low_alchemy": "17", + "high_alchemy": "25", + "grand_exchange_price": "55", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10114", + "name": "Kebbit claws", + "tradeable": "true", + "grand_exchange_price": "55", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10115", + "name": "Dark kebbit fur", + "examine": "Sleek, silent, and furry.", + "tradeable": "true", + "low_alchemy": "84", + "high_alchemy": "126", + "grand_exchange_price": "92", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10116", + "name": "Dark kebbit fur", + "tradeable": "true", + "grand_exchange_price": "92", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10117", + "name": "Polar kebbit fur", + "examine": "A thick fur for a cold climate.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "7", + "shop_price": "12", + "grand_exchange_price": "3862", + "weight": "0.4", + "ge_buy_limit": "175", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10118", + "name": "Polar kebbit fur", + "tradeable": "true", + "grand_exchange_price": "3862", + "ge_buy_limit": "175", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10119", + "name": "Feldip weasel fur", + "examine": "Not actually from a weasel, but it is, at least, furry.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "3", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10120", + "name": "Feldip weasel fur", + "tradeable": "true", + "grand_exchange_price": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10121", + "name": "Common kebbit fur", + "examine": "Common fur from a common kebbit.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "grand_exchange_price": "1555", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10122", + "name": "Common kebbit fur", + "tradeable": "true", + "grand_exchange_price": "1555", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10123", + "name": "Desert devil fur", + "examine": "Sandy coloured kebbit fur.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "95", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10124", + "name": "Desert devil fur", + "tradeable": "true", + "grand_exchange_price": "95", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10125", + "name": "Spotted kebbit fur", + "examine": "Maybe this is why people think furry dice make you go faster.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10126", + "name": "Spotted kebbit fur", + "tradeable": "true", + "grand_exchange_price": "8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10127", + "name": "Dashing kebbit fur", + "examine": "Nature's equivalent of go-faster stripes.", + "tradeable": "true", + "low_alchemy": "108", + "high_alchemy": "162", + "grand_exchange_price": "69", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10128", + "name": "Dashing kebbit fur", + "tradeable": "true", + "grand_exchange_price": "69", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10129", + "name": "Barb-tail harpoon", + "examine": "A mighty Hunter weapon. One previous owner.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "grand_exchange_price": "19", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "9,4,-4,0,0,0,0,0,0,0,0,6,0,0,0", + "weapon_interface": "5", + "requirements": "{10,35}", + "weight": "1.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10130", + "name": "Barb-tail harpoon", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10132", + "name": "Strung rabbit foot", + "examine": "Not so lucky for the rabbit.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "789", + "equipment_slot": "2", + "requirements": "{21,24}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10133", + "name": "Strung rabbit foot", + "tradeable": "true", + "grand_exchange_price": "789", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10134", + "name": "Rabbit foot", + "examine": "This could be put on a string and worn for luck.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "543", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10135", + "name": "Rabbit foot", + "tradeable": "true", + "grand_exchange_price": "543", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10136", + "name": "Rainbow fish", + "examine": "Well, this would certainly add some colour to a meal.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "shop_price": "48", + "grand_exchange_price": "99", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10137", + "name": "Rainbow fish", + "tradeable": "true", + "grand_exchange_price": "99", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10138", + "name": "Raw rainbow fish", + "examine": "A colourful fish, attracted to colourful flies.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "grand_exchange_price": "236", + "weight": "5", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10139", + "name": "Raw rainbow fish", + "tradeable": "true", + "grand_exchange_price": "236", + "ge_buy_limit": "20000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10141", + "name": "Burnt rainbow fish", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10142", + "name": "Guam tar", + "examine": "A thick, foul-smelling, tar-like substance with a green tinge", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "28", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,16", + "requirements": "{0,30}-{4,30}-{6,30}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10143", + "name": "Marrentill tar", + "examine": "A thick, foul-smelling, tar-like substance with an orange tinge.", + "tradeable": "true", + "grand_exchange_price": "12", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,22", + "requirements": "{0,50}-{4,50}-{6,50}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10144", + "name": "Tarromin tar", + "examine": "A thick, foul-smelling, tar-like substance with a red tinge.", + "tradeable": "true", + "grand_exchange_price": "28", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,31", + "requirements": "{0,60}-{4,60}-{6,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10145", + "name": "Harralander tar", + "examine": "A dark, thick, foul-smelling, tar-like substance.", + "tradeable": "true", + "grand_exchange_price": "47", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,49", + "requirements": "{0,70}-{4,70}-{6,70}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10146", + "name": "Orange salamander", + "examine": "Slightly slimy, but kind of cute.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "shop_price": "127", + "grand_exchange_price": "6", + "stand_anim": "5246", + "stand_turn_anim": "823", + "walk_anim": "5245", + "run_anim": "824", + "turn180_anim": "5245", + "turn90cw_anim": "5245", + "turn90ccw_anim": "5245", + "render_anim": "1277", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,19,0,0,29,0,0,0,0,0,0,31,0,0,0", + "weapon_interface": "21", + "two_handed": "true", + "requirements": "{0,50}-{4,50}-{6,50}", + "weight": "4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10147", + "name": "Red salamander", + "examine": "Slightly slimy but certainly striking.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "destroy": "true", + "shop_price": "190", + "grand_exchange_price": "27", + "stand_anim": "5246", + "stand_turn_anim": "823", + "walk_anim": "5245", + "run_anim": "824", + "turn180_anim": "5245", + "turn90cw_anim": "5245", + "turn90ccw_anim": "5245", + "render_anim": "1277", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,37,0,0,47,0,0,0,0,0,0,49,0,0,0", + "weapon_interface": "21", + "two_handed": "true", + "requirements": "{0,60}-{4,60}-{6,60}", + "weight": "4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10148", + "name": "Black salamander", + "examine": "Slightly slimy and somewhat menacing.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "grand_exchange_price": "124", + "stand_anim": "5246", + "stand_turn_anim": "823", + "walk_anim": "5245", + "run_anim": "824", + "turn180_anim": "5245", + "turn90cw_anim": "5245", + "turn90ccw_anim": "5245", + "render_anim": "1277", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,59,0,0,69,0,0,0,0,0,0,71,0,0,0", + "weapon_interface": "21", + "two_handed": "true", + "requirements": "{0,70}-{4,70}-{6,70}", + "weight": "4", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10149", + "name": "Swamp lizard", + "examine": "A very slimy and generally disgusting green lizard.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy": "true", + "grand_exchange_price": "1802", + "stand_anim": "5246", + "stand_turn_anim": "823", + "walk_anim": "5245", + "run_anim": "824", + "turn180_anim": "5245", + "turn90cw_anim": "5245", + "turn90ccw_anim": "5245", + "render_anim": "1277", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,10,0,0,20,0,0,0,0,0,0,22,0,0,0", + "weapon_interface": "21", + "two_handed": "true", + "requirements": "{0,30}-{4,30}-{6,30}", + "weight": "4", + "ge_buy_limit": "2000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10150", + "name": "Noose wand", + "examine": "A noose on a stick.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "1", + "stand_anim": "5254", + "stand_turn_anim": "5252", + "walk_anim": "5250", + "run_anim": "5253", + "turn180_anim": "5251", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1279", + "equipment_slot": "3", + "attack_speed": "4", + "weapon_interface": "14", + "two_handed": "true", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10151", + "name": "Noose wand", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10156", + "name": "Hunters' crossbow", + "examine": "A weapon made of bone and wood.", + "tradeable": "true", + "low_alchemy": "520", + "high_alchemy": "780", + "shop_price": "1300", + "grand_exchange_price": "2496", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,0,0,0,55,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_audios": "2700,0,0,0", + "requirements": "{4,50}", + "weight": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10157", + "name": "Hunters' crossbow", + "tradeable": "true", + "grand_exchange_price": "2496", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10158", + "name": "Kebbit bolts", + "examine": "Bolts made from the spikes of a prickly kebbit.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "10", + "grand_exchange_price": "28", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,28", + "requirements": "{4,50}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10159", + "name": "Long kebbit bolts", + "examine": "Bolts made from the spikes of a razor-backed kebbit.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "352", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,38", + "requirements": "{4,50}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10160", + "name": "Orange salamander", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10161", + "name": "Red salamander", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10162", + "name": "Black salamander", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10163", + "name": "Swamp lizard", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10167", + "name": "Eagle feather", + "examine": "Probably a bit too big for fly fishing.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10171", + "name": "Eagle cape", + "examine": "A cape made from giant eagle feathers.", + "equipment_slot": "1", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10172", + "name": "Fake beak", + "examine": "A cheaply made fake beak.", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10173", + "name": "Bird book", + "examine": "The title reads 'William Oddity's Guide to the Avian.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10174", + "name": "Metal feather", + "examine": "A small feather made out of some sort of metal. The detail is exquisite.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another metal feather from the camp", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10176", + "name": "Silver feather", + "examine": "An intricate feather crafted from a silver-coloured metal of some sort.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another by inspecting the opening", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10177", + "name": "Bronze feather", + "examine": "An intricate feather crafted from a bronze-coloured metal of some sort.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another by taking from pedestal.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10178", + "name": "Odd bird seed", + "examine": "\"It looks like bird seed, but it's not quite right somehow.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10179", + "name": "Feathered journal", + "examine": "There's a feather glued to the front. \"Property of Arthur Artimus\".", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10180", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10181", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10182", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10183", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10184", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10185", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10186", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10187", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10188", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10189", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10190", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10191", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10192", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10193", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10194", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10195", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10196", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10197", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10198", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10199", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10200", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10201", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10202", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10203", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10204", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10205", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10206", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10207", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10208", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10209", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10210", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10211", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10212", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10213", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10214", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10215", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10216", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10217", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10218", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10219", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10220", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10221", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10222", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10223", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10224", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10225", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10226", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10227", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10228", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10229", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10230", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10231", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10232", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10233", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10234", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10235", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10236", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10237", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10238", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10239", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10240", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10241", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10242", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10243", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10244", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10245", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10246", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10247", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10248", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10249", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10250", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10251", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10252", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10253", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10254", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10255", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10256", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10257", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10258", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10259", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10260", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10261", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10262", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10263", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10264", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10265", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10266", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10267", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10268", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10269", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10270", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10271", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10272", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10273", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10274", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10275", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10276", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10277", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10278", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10279", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10280", + "name": "Willow comp bow", + "examine": "A powerful bow made from willow.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "136", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,22,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_audios": "2700,0,0,0", + "requirements": "{4,20}", + "weight": "1.8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10281", + "name": "Willow comp bow", + "tradeable": "true", + "grand_exchange_price": "136", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10282", + "name": "Yew comp bow", + "examine": "A powerful bow made from yew wood.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "720", + "high_alchemy": "1080", + "grand_exchange_price": "876", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,49,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "attack_audios": "2700,0,0,0", + "requirements": "{4,40}", + "weight": "1.8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10283", + "name": "Yew comp bow", + "tradeable": "true", + "grand_exchange_price": "876", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10284", + "name": "Magic comp bow", + "examine": "A powerful bow made from magic wood.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "1000", + "high_alchemy": "1500", + "grand_exchange_price": "1268", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,0,0,0,71,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "attack_audios": "2700,0,0,0", + "requirements": "{4,50}", + "weight": "1.3", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10285", + "name": "Magic comp bow", + "tradeable": "true", + "grand_exchange_price": "1268", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10286", + "name": "Rune helm (h1)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "23600", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "requirements": "{1,40}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10287", + "name": "Rune helm (h1)", + "tradeable": "true", + "grand_exchange_price": "23600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10288", + "name": "Rune helm (h2)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "20800", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "3", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10289", + "name": "Rune helm (h2)", + "tradeable": "true", + "grand_exchange_price": "20800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10290", + "name": "Rune helm (h3)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "20800", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10291", + "name": "Rune helm (h3)", + "tradeable": "true", + "grand_exchange_price": "20800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10292", + "name": "Rune helm (h4)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "21100", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10293", + "name": "Rune helm (h4)", + "tradeable": "true", + "grand_exchange_price": "21100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10294", + "name": "Rune helm (h5)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "24900", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10295", + "name": "Rune helm (h5)", + "tradeable": "true", + "grand_exchange_price": "24900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10296", + "name": "Adamant helm (h1)", + "examine": "An adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "31500", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "3", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10297", + "name": "Adamant helm (h1)", + "tradeable": "true", + "grand_exchange_price": "31500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10298", + "name": "Adamant helm (h2)", + "examine": "An adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "10100", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "3", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10299", + "name": "Adamant helm (h2)", + "tradeable": "true", + "grand_exchange_price": "10100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10300", + "name": "Adamant helm (h3)", + "examine": "An adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "8797", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "3", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10301", + "name": "Adamant helm (h3)", + "tradeable": "true", + "grand_exchange_price": "8797", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10302", + "name": "Adamant helm (h4)", + "examine": "An Adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "10900", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "3", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10303", + "name": "Adamant helm (h4)", + "tradeable": "true", + "grand_exchange_price": "10900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10304", + "name": "Adamant helm (h5)", + "examine": "An adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "17100", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "requirements": "{1,30}", + "weight": "3", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10305", + "name": "Adamant helm (h5)", + "tradeable": "true", + "grand_exchange_price": "17100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10306", + "name": "Black helm (h1)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "20400", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,4,0,0,0,0", + "requirements": "{1,10}", + "weight": "1.8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10307", + "name": "Black helm (h1)", + "tradeable": "true", + "grand_exchange_price": "20400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10308", + "name": "Black helm (h2)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "7033", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,4,0,0,0,0", + "requirements": "{1,10}", + "weight": "1.8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10309", + "name": "Black helm (h2)", + "tradeable": "true", + "grand_exchange_price": "7033", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10310", + "name": "Black helm (h3)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "7574", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,4,0,0,0,0", + "requirements": "{1,10}", + "weight": "1.8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10311", + "name": "Black helm (h3)", + "tradeable": "true", + "grand_exchange_price": "7574", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10312", + "name": "Black helm (h4)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "10100", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,4,0,0,0,0", + "requirements": "{1,10}", + "weight": "1.8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10313", + "name": "Black helm (h4)", + "tradeable": "true", + "grand_exchange_price": "10100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10314", + "name": "Black helm (h5)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "10400", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,4,0,0,0,0", + "requirements": "{1,10}", + "weight": "1.8", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10315", + "name": "Black helm (h5)", + "tradeable": "true", + "grand_exchange_price": "10400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10316", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "8196", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10317", + "name": "Bob shirt", + "tradeable": "true", + "grand_exchange_price": "8196", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10318", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "14700", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10319", + "name": "Bob shirt", + "tradeable": "true", + "grand_exchange_price": "14700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10320", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "8403", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10321", + "name": "Bob shirt", + "tradeable": "true", + "grand_exchange_price": "8403", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10322", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "9230", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10323", + "name": "Bob shirt", + "tradeable": "true", + "grand_exchange_price": "9230", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10324", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "8197", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10325", + "name": "Bob shirt", + "tradeable": "true", + "grand_exchange_price": "8197", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10326", + "name": "Purple firelighter", + "examine": "Makes firelighting a lot easier.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "112", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10327", + "name": "White firelighter", + "examine": "Makes firelighting a lot easier.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "167", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10328", + "name": "White logs", + "examine": "A number of chemical covered wooden logs.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10329", + "name": "Purple logs", + "examine": "A number of chemical covered wooden logs.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10330", + "name": "3rd age range top", + "examine": "Ancient range protection crafted from white dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "grand_exchange_price": "33900000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,60,55,52,0,0,0,0", + "requirements": "{1,65}-{4,45}", + "weight": "4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10331", + "name": "3rd age range top", + "tradeable": "true", + "grand_exchange_price": "33900000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10332", + "name": "3rd age range legs", + "examine": "Fabulously ancient range protection crafted from white dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16000", + "high_alchemy": "24000", + "grand_exchange_price": "20800000", + "equipment_slot": "7", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,17,31,25,33,30,31,25,0,0,0,0", + "requirements": "{1,65}-{4,45}", + "weight": "6", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10333", + "name": "3rd age range legs", + "tradeable": "true", + "grand_exchange_price": "20800000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10334", + "name": "3rd age range coif", + "examine": "Ancient range protection crafted from white dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "6100000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-2,9,4,7,10,5,8,12,0,0,0,0", + "requirements": "{1,65}-{4,45}", + "weight": "1", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10335", + "name": "3rd age range coif", + "tradeable": "true", + "grand_exchange_price": "6100000", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10336", + "name": "3rd age vambraces", + "examine": "Fabulously ancient range protection crafted from white dragonhide.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "86000", + "high_alchemy": "129000", + "grand_exchange_price": "7100000", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,11,6,5,7,9,0,5,0,0,0,0", + "requirements": "{1,65}-{4,45}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10337", + "name": "3rd age vambraces", + "tradeable": "true", + "grand_exchange_price": "7100000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10338", + "name": "3rd age robe top", + "examine": "Ancient mage protection enchanted in the Third-Age.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "grand_exchange_price": "66500000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "4,2,0", + "bonuses": "0,0,0,24,0,0,0,0,24,0,24,0,0,0,0", + "requirements": "{1,65}-{6,30}", + "weight": "2.5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10339", + "name": "3rd age robe top", + "tradeable": "true", + "grand_exchange_price": "66500000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10340", + "name": "3rd age robe", + "examine": "Ancient mage protection enchanted in the Third-Age.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16000", + "high_alchemy": "24000", + "grand_exchange_price": "31500000", + "equipment_slot": "7", + "absorb": "4,2,0", + "bonuses": "0,0,0,19,0,0,0,0,19,0,20,0,0,0,0", + "requirements": "{1,65}-{6,30}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10341", + "name": "3rd age robe", + "tradeable": "true", + "grand_exchange_price": "31500000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10342", + "name": "3rd age mage hat", + "examine": "Ancient mage protection enchanted in the Third-Age.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "21000000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,1,0", + "bonuses": "0,0,0,8,0,0,0,0,8,0,12,0,0,0,0", + "requirements": "{1,65}-{6,30}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10343", + "name": "3rd age mage hat", + "tradeable": "true", + "grand_exchange_price": "21000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10344", + "name": "3rd age amulet", + "examine": "Ancient mage protection enchanted in the Third-Age.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "grand_exchange_price": "20100000", + "equipment_slot": "2", + "bonuses": "0,0,0,15,0,0,0,0,10,0,0,0,0,0,0", + "requirements": "{1,65}-{6,30}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10345", + "name": "3rd age amulet", + "tradeable": "true", + "grand_exchange_price": "20100000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10346", + "name": "3rd age platelegs", + "examine": "Ancient armour beaten from magical silver.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80000", + "high_alchemy": "120000", + "grand_exchange_price": "92800000", + "equipment_slot": "7", + "absorb": "3,0,6", + "bonuses": "0,0,0,-25,-2,78,76,83,-5,75,25,0,0,0,0", + "requirements": "{1,65}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10347", + "name": "3rd age platelegs", + "tradeable": "true", + "grand_exchange_price": "92800000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10348", + "name": "3rd age platebody", + "examine": "Ancient armour beaten from magical silver.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80000", + "high_alchemy": "120000", + "grand_exchange_price": "86200000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-20,0,96,108,113,-4,97,52,0,0,0,0", + "requirements": "{1,65}", + "weight": "9", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10349", + "name": "3rd age platebody", + "tradeable": "true", + "grand_exchange_price": "86200000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10350", + "name": "3rd age full helmet", + "examine": "Ancient armour beaten from magical silver.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "36000", + "high_alchemy": "54000", + "grand_exchange_price": "41600000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,4", + "bonuses": "0,0,0,-5,-2,47,49,43,-3,48,12,0,0,0,0", + "requirements": "{1,65}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10351", + "name": "3rd age full helmet", + "tradeable": "true", + "grand_exchange_price": "41600000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10352", + "name": "3rd age kiteshield", + "examine": "Ancient armour beaten from magical silver.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "72000", + "high_alchemy": "108000", + "grand_exchange_price": "65100000", + "equipment_slot": "5", + "absorb": "5,0,11", + "bonuses": "0,0,0,-10,-4,63,65,61,-3,63,60,0,0,0,0", + "requirements": "{1,65}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10353", + "name": "3rd age kiteshield", + "tradeable": "true", + "grand_exchange_price": "65100000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10354", + "name": "Amulet of glory(t4)", + "examine": "A very powerful dragonstone amulet.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "233100", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10355", + "name": "Amulet of glory(t4)", + "tradeable": "true", + "grand_exchange_price": "233100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10356", + "name": "Amulet of glory(t3)", + "examine": "Uncharged: A very powerful dragonstone amulet. 1-4 charges: A dragonstone amulet with X magic charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "1", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10357", + "name": "Amulet of glory(t3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10358", + "name": "Amulet of glory(t2)", + "examine": "A very powerful dragonstone amulet.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "1", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10359", + "name": "Amulet of glory(t2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10360", + "name": "Amulet of glory(t1)", + "examine": "Uncharged: A very powerful dragonstone amulet. 1-4 charges: A dragonstone amulet with X magic charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "1", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10361", + "name": "Amulet of glory(t1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10362", + "name": "Amulet of glory(t)", + "examine": "A very powerful dragonstone amulet.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "223000", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10363", + "name": "Amulet of glory(t)", + "tradeable": "true", + "grand_exchange_price": "223000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10364", + "name": "Strength amulet(t)", + "examine": "An enchanted ruby amulet with a nice trim.", + "tradeable": "true", + "low_alchemy": "810", + "high_alchemy": "1215", + "grand_exchange_price": "819400", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,10,0,0,0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10365", + "name": "Strength amulet(t)", + "tradeable": "true", + "grand_exchange_price": "819400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10366", + "name": "Amulet of magic(t)", + "examine": "An enchanted sapphire amulet of magic.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "grand_exchange_price": "128700", + "equipment_slot": "2", + "bonuses": "0,0,0,10,0,0,0,0,0,0,0,0,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10367", + "name": "Amulet of magic(t)", + "tradeable": "true", + "grand_exchange_price": "128700", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10368", + "name": "Zamorak bracers", + "examine": "Zamorak blessed dragonhide vambraces.", + "tradeable": "true", + "low_alchemy": "1600", + "high_alchemy": "2400", + "grand_exchange_price": "116200", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,11,6,5,7,8,0,6,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10369", + "name": "Zamorak bracers", + "tradeable": "true", + "grand_exchange_price": "116200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10370", + "name": "Zamorak d'hide", + "examine": "Zamorak blessed dragonhide body armour.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "155200", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,50,55,55,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "weight": "6", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10371", + "name": "Zamorak d'hide", + "tradeable": "true", + "grand_exchange_price": "155200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10372", + "name": "Zamorak chaps", + "examine": "Zamorak blessed dragonhide chaps.", + "tradeable": "true", + "low_alchemy": "2400", + "high_alchemy": "3600", + "grand_exchange_price": "35100", + "equipment_slot": "7", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,17,31,25,33,28,31,30,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10373", + "name": "Zamorak chaps", + "tradeable": "true", + "grand_exchange_price": "35100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10374", + "name": "Zamorak coif", + "examine": "Zamorak blessed dragonhide coif.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "35900", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,7,4,7,10,4,8,8,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10375", + "name": "Zamorak coif", + "tradeable": "true", + "grand_exchange_price": "35900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10376", + "name": "Guthix bracers", + "examine": "Guthix blessed dragonhide vambraces.", + "tradeable": "true", + "low_alchemy": "2400", + "high_alchemy": "3600", + "grand_exchange_price": "3181", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,11,6,5,7,8,0,6,0,0,0,0", + "requirements": "{1,70}-{4,40}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10377", + "name": "Guthix bracers", + "tradeable": "true", + "grand_exchange_price": "3181", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10378", + "name": "Guthix dragonhide", + "examine": "Guthix blessed dragonhide body armour.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "shop_price": "13", + "grand_exchange_price": "39800", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,50,55,55,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "weight": "6", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10379", + "name": "Guthix dragonhide", + "tradeable": "true", + "grand_exchange_price": "39800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10380", + "name": "Guthix chaps", + "examine": "Guthix blessed dragonhide chaps.", + "tradeable": "true", + "low_alchemy": "2400", + "high_alchemy": "3600", + "grand_exchange_price": "7346", + "equipment_slot": "7", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,17,31,25,33,28,31,30,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "weight": "5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10381", + "name": "Guthix chaps", + "tradeable": "true", + "grand_exchange_price": "7346", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10382", + "name": "Guthix coif", + "examine": "Guthix blessed dragonhide coif.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "27500", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,7,4,7,10,4,8,8,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "weight": "0.85", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10383", + "name": "Guthix coif", + "tradeable": "true", + "grand_exchange_price": "27500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10384", + "name": "Saradomin bracers", + "examine": "Saradomin blessed dragonhide vambraces.", + "tradeable": "true", + "low_alchemy": "1600", + "high_alchemy": "2400", + "grand_exchange_price": "70800", + "equipment_slot": "9", + "bonuses": "0,0,0,-10,11,6,5,7,8,0,6,0,0,0,0", + "requirements": "{1,70}-{4,40}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10385", + "name": "Saradomin bracers", + "tradeable": "true", + "grand_exchange_price": "70800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10386", + "name": "Saradomin d'hide", + "examine": "Saradomin blessed dragonhide body armour.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "destroy": "true", + "shop_price": "13000", + "grand_exchange_price": "164100", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,50,55,55,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "weight": "6", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10387", + "name": "Saradomin d'hide", + "tradeable": "true", + "grand_exchange_price": "164100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10388", + "name": "Saradomin chaps", + "examine": "Saradomin blessed dragonhide chaps.", + "tradeable": "true", + "low_alchemy": "2400", + "high_alchemy": "3600", + "grand_exchange_price": "36600", + "equipment_slot": "7", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,17,31,25,33,28,31,30,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10389", + "name": "Saradomin chaps", + "tradeable": "true", + "grand_exchange_price": "36600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10390", + "name": "Saradomin coif", + "examine": "Saradomin blessed dragonhide coif.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "28000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,7,4,7,10,4,8,8,0,0,0,0", + "requirements": "{1,40}-{4,70}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10391", + "name": "Saradomin coif", + "tradeable": "true", + "grand_exchange_price": "28000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10392", + "name": "A powdered wig", + "examine": "A big 'do about nothing.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "45400", + "remove_head": "true", + "equipment_slot": "0", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10393", + "name": "A powdered wig", + "tradeable": "true", + "grand_exchange_price": "45400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10394", + "name": "Flared trousers", + "examine": "These'll help me stay alive.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "448900", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10395", + "name": "Flared trousers", + "tradeable": "true", + "grand_exchange_price": "448900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10396", + "name": "Pantaloons", + "examine": "Alas, someone has slashed my pantaloons.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "9863", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10397", + "name": "Pantaloons", + "tradeable": "true", + "grand_exchange_price": "9863", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10398", + "name": "Sleeping cap", + "examine": "A cap for wearing whil...zzzzzzzzz", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "276400", + "remove_head": "true", + "equipment_slot": "0", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10399", + "name": "Sleeping cap", + "tradeable": "true", + "grand_exchange_price": "276400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10400", + "name": "Black ele' shirt", + "examine": "A well made elegant mans' black shirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "921500", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10401", + "name": "Black ele' shirt", + "tradeable": "true", + "grand_exchange_price": "921500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10402", + "name": "Black ele' legs", + "examine": "A rather elegant black pair of pantaloons.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "270700", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10403", + "name": "Black ele' legs", + "tradeable": "true", + "grand_exchange_price": "270700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10404", + "name": "Red ele' shirt", + "examine": "A well made elegant men's red shirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "118600", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10405", + "name": "Red ele' shirt", + "tradeable": "true", + "grand_exchange_price": "118600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10406", + "name": "Red ele' legs", + "examine": "A rather elegant red pair of pantaloons.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "39400", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10407", + "name": "Red ele' legs", + "tradeable": "true", + "grand_exchange_price": "39400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10408", + "name": "Blue ele' shirt", + "examine": "A well made elegant mans' blue shirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "134700", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10409", + "name": "Blue ele' shirt", + "tradeable": "true", + "grand_exchange_price": "134700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10410", + "name": "Blue ele' legs", + "examine": "A rather elegant pair of men's blue pantaloons", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "80700", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10411", + "name": "Blue ele' legs", + "tradeable": "true", + "grand_exchange_price": "80700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10412", + "name": "Green ele' shirt", + "examine": "A well made elegant men's green shirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "162600", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10413", + "name": "Green ele' shirt", + "tradeable": "true", + "grand_exchange_price": "162600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10414", + "name": "Green ele' legs", + "examine": "A rather elegant green pair of men's pantaloons.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "36100", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10415", + "name": "Green ele' legs", + "tradeable": "true", + "grand_exchange_price": "36100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10416", + "name": "Purple ele' shirt", + "examine": "A well made elegant men's purple shirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "116200", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10417", + "name": "Purple ele' shirt", + "tradeable": "true", + "grand_exchange_price": "116200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10418", + "name": "Purple ele' legs", + "examine": "A rather elegant purple pair of pantaloons.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "73400", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10419", + "name": "Purple ele' legs", + "tradeable": "true", + "grand_exchange_price": "73400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10420", + "name": "White ele' blouse", + "examine": "A well made ladies' elegant white blouse.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "571500", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10421", + "name": "White ele' blouse", + "tradeable": "true", + "grand_exchange_price": "571500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10422", + "name": "White ele' skirt", + "examine": "A rather elegant white skirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "56600", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10423", + "name": "White ele' skirt", + "tradeable": "true", + "grand_exchange_price": "56600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10424", + "name": "Red ele' blouse", + "examine": "A well made elegant ladies' red blouse.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "15000", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10425", + "name": "Red ele' blouse", + "tradeable": "true", + "grand_exchange_price": "15000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10426", + "name": "Red ele' skirt", + "examine": "A rather elegant Red skirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "7132", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10427", + "name": "Red ele' skirt", + "tradeable": "true", + "grand_exchange_price": "7132", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10428", + "name": "Blue ele' blouse", + "examine": "A well made ladies' elegant blue blouse.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "22200", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10429", + "name": "Blue ele' blouse", + "tradeable": "true", + "grand_exchange_price": "22200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10430", + "name": "Blue ele' skirt", + "examine": "A rather elegant blue skirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "12200", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10431", + "name": "Blue ele' skirt", + "tradeable": "true", + "grand_exchange_price": "12200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10432", + "name": "Green ele' blouse", + "examine": "A well made ladies' elegant green blouse.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "12300", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10433", + "name": "Green ele' blouse", + "tradeable": "true", + "grand_exchange_price": "12300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10434", + "name": "Green ele' skirt", + "examine": "A rather elegant green skirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "10300", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10435", + "name": "Green ele' skirt", + "tradeable": "true", + "grand_exchange_price": "10300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10436", + "name": "Purple ele' blouse", + "examine": "A well made elegant ladies' purple blouse.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "22800", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10437", + "name": "Purple ele' blouse", + "tradeable": "true", + "grand_exchange_price": "22800", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10438", + "name": "Purple ele' skirt", + "examine": "A rather elegant purple skirt.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "16700", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10439", + "name": "Purple ele' skirt", + "tradeable": "true", + "grand_exchange_price": "16700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10440", + "name": "Saradomin crozier", + "examine": "A Saradomin crozier.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "grand_exchange_price": "8611", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,6,0,0", + "weapon_interface": "1", + "requirements": "{5,60}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10441", + "name": "Saradomin crozier", + "tradeable": "true", + "grand_exchange_price": "8611", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10442", + "name": "Guthix crozier", + "examine": "A Guthix crozier.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "grand_exchange_price": "2925", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,6,0,0", + "weapon_interface": "1", + "requirements": "{5,60}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10443", + "name": "Guthix crozier", + "tradeable": "true", + "grand_exchange_price": "2925", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10444", + "name": "Zamorak crozier", + "examine": "A Zamorak crozier.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "grand_exchange_price": "2794", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,25,10,0,2,3,1,10,0,0,32,6,0,0", + "weapon_interface": "1", + "requirements": "{5,60}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10445", + "name": "Zamorak crozier", + "tradeable": "true", + "grand_exchange_price": "2794", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10446", + "name": "Saradomin cloak", + "examine": "A Saradomin cloak.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "1200000", + "equipment_slot": "1", + "bonuses": "0,0,0,1,0,3,3,3,3,3,3,0,3,0,0", + "requirements": "{5,40}", + "weight": "0.4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10447", + "name": "Saradomin cloak", + "tradeable": "true", + "grand_exchange_price": "1200000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10448", + "name": "Guthix cloak", + "examine": "A Guthix cloak.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "391000", + "equipment_slot": "1", + "bonuses": "0,0,0,1,0,3,3,3,3,3,3,0,3,0,0", + "requirements": "{5,40}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10449", + "name": "Guthix cloak", + "tradeable": "true", + "grand_exchange_price": "391000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10450", + "name": "Zamorak cloak", + "examine": "A Zamorak cloak.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "1000000", + "equipment_slot": "1", + "bonuses": "0,0,0,1,0,3,3,3,3,3,3,0,3,0,0", + "requirements": "{5,40}", + "weight": "0.4", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10451", + "name": "Zamorak cloak", + "tradeable": "true", + "grand_exchange_price": "1000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10452", + "name": "Saradomin mitre", + "examine": "A Saradomin mitre.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "grand_exchange_price": "299200", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,5,0,0", + "requirements": "{5,40}-{6,40}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10453", + "name": "Saradomin mitre", + "tradeable": "true", + "grand_exchange_price": "299200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10454", + "name": "Guthix mitre", + "examine": "A Guthix mitre.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "grand_exchange_price": "130300", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,5,0,0", + "requirements": "{5,40}-{6,40}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10455", + "name": "Guthix mitre", + "tradeable": "true", + "grand_exchange_price": "130300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10456", + "name": "Zamorak mitre", + "examine": "A Zamorak mitre.", + "tradeable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "grand_exchange_price": "346500", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,5,0,0", + "requirements": "{5,40}-{6,40}", + "weight": "0.3", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10457", + "name": "Zamorak mitre", + "tradeable": "true", + "grand_exchange_price": "346500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10458", + "name": "Saradomin robe top", + "examine": "Blessed vestments of Saradomin.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "grand_exchange_price": "121400", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,4,0,0", + "requirements": "{5,20}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10459", + "name": "Saradomin robe top", + "tradeable": "true", + "grand_exchange_price": "121400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10460", + "name": "Zamorak robe top", + "examine": "Zamorak Vestments.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "grand_exchange_price": "154700", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,4,0,0", + "requirements": "{5,20}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10461", + "name": "Zamorak robe top", + "tradeable": "true", + "grand_exchange_price": "154700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10462", + "name": "Guthix robe top", + "examine": "Blessed vestments of Guthix.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "grand_exchange_price": "75200", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,4,0,0", + "requirements": "{5,20}", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10463", + "name": "Guthix robe top", + "tradeable": "true", + "grand_exchange_price": "75200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10464", + "name": "Saradomin robe legs", + "examine": "Leggings from the Saradomin Vestments.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "grand_exchange_price": "56300", + "equipment_slot": "7", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,4,0,0", + "requirements": "{5,20}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10465", + "name": "Saradomin robe legs", + "tradeable": "true", + "grand_exchange_price": "56300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10466", + "name": "Guthix robe legs", + "examine": "Leggings from the Guthix Vestments.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "grand_exchange_price": "56900", + "equipment_slot": "7", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,4,0,0", + "requirements": "{5,20}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10467", + "name": "Guthix robe legs", + "tradeable": "true", + "grand_exchange_price": "56900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10468", + "name": "Zamorak robe legs", + "examine": "Legs of the Zamorak Vestments.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "grand_exchange_price": "79400", + "equipment_slot": "7", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,4,0,0", + "requirements": "{5,20}", + "weight": "2.7", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10469", + "name": "Zamorak robe legs", + "tradeable": "true", + "grand_exchange_price": "79400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10470", + "name": "Saradomin stole", + "examine": "A Saradomin stole.", + "tradeable": "true", + "low_alchemy": "1000", + "high_alchemy": "1500", + "grand_exchange_price": "14000", + "equipment_slot": "2", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,10,0,0", + "requirements": "{5,60}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10471", + "name": "Saradomin stole", + "tradeable": "true", + "grand_exchange_price": "14000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10472", + "name": "Guthix stole", + "examine": "A blessed stole.", + "tradeable": "true", + "low_alchemy": "1000", + "high_alchemy": "1500", + "grand_exchange_price": "3849", + "equipment_slot": "2", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,10,0,0", + "requirements": "{5,60}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10473", + "name": "Guthix stole", + "tradeable": "true", + "grand_exchange_price": "3849", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10474", + "name": "Zamorak stole", + "examine": "A Zamorak stole.", + "tradeable": "true", + "low_alchemy": "1000", + "high_alchemy": "1500", + "grand_exchange_price": "13700", + "equipment_slot": "2", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,10,0,0", + "requirements": "{5,60}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10475", + "name": "Zamorak stole", + "tradeable": "true", + "grand_exchange_price": "13700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10476", + "name": "Purple sweets", + "examine": "Remember to brush after eating!", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "grand_exchange_price": "22700", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10485", + "name": "Scroll", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10486", + "name": "Empty sack", + "examine": "An empty sack.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "30", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10487", + "name": "Undead chicken", + "examine": "Yup, definitely a chicken...an undead chicken.", + "stand_anim": "5363", + "stand_turn_anim": "823", + "walk_anim": "5364", + "run_anim": "824", + "turn180_anim": "5438", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1171", + "equipment_slot": "3", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10488", + "name": "Selected iron", + "examine": "An iron bar supplied by an insane old crone.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Witch in Draynor supplies these bars.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10489", + "name": "Bar magnet", + "examine": "A magnet designed for undead chicken use.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another magnet using special bars. The Witch in Draynor supplies these bars.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10490", + "name": "Undead twigs", + "examine": "Were they trying to escape just then?", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can chop more wood from undead trees using my blessed axe.", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10491", + "name": "Blessed axe", + "examine": "It radiates purity but can still lop off heads.", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can obtain a replacement axe from the Burthorpe Slayer Master.", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "-2,12,10,0,0,0,1,0,0,0,0,13,2,0,0", + "weapon_interface": "2", + "weight": "1.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10492", + "name": "Research notes", + "examine": "These make no sense at all.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10493", + "name": "Translated notes", + "examine": "They still make no sense, but look more meaningful now.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10494", + "name": "A pattern", + "examine": "Attach tab A to button B then fold along line C...", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10495", + "name": "A container", + "examine": "A desirable residence for discerning, undead chickens.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10496", + "name": "Polished buttons", + "examine": "Shiny!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10498", + "name": "Ava's attractor", + "examine": "A bagged chicken ready to serve you, magnet in claw.", + "low_alchemy": "307", + "high_alchemy": "461", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can buy a replacement from Ava in Draynor Manor; she will charge me 999 coins for this service.", + "shop_price": "999", + "equipment_slot": "1", + "bonuses": "0,0,0,0,2,0,0,0,2,0,0,0,0,0,0", + "weight": "4.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10499", + "name": "Ava's accumulator", + "examine": "A superior bagged chicken ready to serve you, magnet in claw.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can obtain a replacement for this from Ava in Draynor Manor. She will need 999 coins to buy the lower", + "shop_price": "999", + "equipment_slot": "1", + "bonuses": "0,0,0,0,4,0,1,0,4,0,0,0,0,0,0", + "weight": "4.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10500", + "name": "Crone-made amulet", + "examine": "Allows the ghost farmer to talk to Alice - a breakthrough!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can obtain a replacement for this from the crone who lives west of the Port Phasmatys farm.", + "equipment_slot": "2", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10501", + "name": "Snowball", + "examine": "Made from snow. / It's a ball of snow! Uncanny. / How did this not melt in the box?", + "equipment_slot": "3", + "bonuses": "0,0,0,0,10,0,0,0,0,0,0,0,0,0,1", + "weapon_interface": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10506", + "name": "Gublinch shards", + "examine": "A gublinch frozen and crumbled into shards.", + "destroy": "true", + "tradeable": "false", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10507", + "name": "Reindeer hat", + "examine": "A reindeer hat and a matching flashing nose.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it. this item", + "remove_head": "true", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10508", + "name": "Wintumber tree", + "examine": "A wintumber tree for your player-owned house.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from Diango in Draynor Village.", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10509", + "name": "Snowball", + "examine": "Made from snow. / It's a ball of snow! Uncanny. / How did this not melt in the box?", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10510", + "name": "Snowball", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10511", + "name": "Zanaris choir", + "examine": "They're going to sing to you!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10513", + "name": "Crackers", + "examine": "Some dry crackers.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Unknown You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10514", + "name": "Tofu", + "examine": "A block of tofu.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10515", + "name": "Worms", + "examine": "Some meaty worms.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10516", + "name": "Attacker horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10517", + "name": "Attacker horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10518", + "name": "Attacker horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10519", + "name": "Attacker horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10520", + "name": "Attacker horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10521", + "name": "Collection bag", + "examine": "A very small/small/medium-sized/large/very large collection bag.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10522", + "name": "Collection bag", + "examine": "A very small/small/medium-sized/large/very large collection bag.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10523", + "name": "Collection bag", + "examine": "A very small/small/medium-sized/large/very large collection bag.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10524", + "name": "Collection bag", + "examine": "A very small/small/medium-sized/large/very large collection bag.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10525", + "name": "Collection bag", + "examine": "A very small/small/medium-sized/large/very large collection bag.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10526", + "name": "Healer horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10527", + "name": "Healer horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10528", + "name": "Healer horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10529", + "name": "Healer horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10530", + "name": "Healer horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10531", + "name": "Green egg", + "examine": "Used to poison your enemies!", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10532", + "name": "Red egg", + "examine": "Will explode when fired.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10533", + "name": "Blue egg", + "examine": "Stun your foes!", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10534", + "name": "Yellow egg", + "examine": "A yellow egg; it needs passing to the Healer to be poisoned!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10535", + "name": "Poisoned egg", + "examine": "A poisoned yellow egg; pass it to the Attacker for spikes to be added!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10536", + "name": "Spiked/pois. egg", + "examine": "A poisoned, spiky egg; pass to the defender for heating!", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10537", + "name": "Omega egg", + "examine": "A heated, poisoned, spiky egg; pass to the Collector for loading.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10538", + "name": "Defender horn", + "examine": "A horn to call others.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10539", + "name": "Poisoned tofu", + "examine": "Some poisoned tofu.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10540", + "name": "Poisoned worms", + "examine": "Some poisoned worms.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10541", + "name": "Poisoned meat", + "examine": "A poisoned leg of meat.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10542", + "name": "Healing vial(4)", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10543", + "name": "Healing vial(3)", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10544", + "name": "Healing vial(2)", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10545", + "name": "Healing vial(1)", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10546", + "name": "Healing vial", + "examine": "A full healing vial.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10547", + "name": "Healer hat", + "examine": "A Penance Healer hat.", + "shop_price": "275", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "-5,-5,-5,7,-5,6,8,10,8,0,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10548", + "name": "Fighter hat", + "examine": "A Penance Fighter hat.", + "low_alchemy": "7680", + "high_alchemy": "11520", + "shop_price": "275", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "5,5,5,-7,-7,30,32,28,-3,28,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10549", + "name": "Runner hat", + "examine": "A Penance Runner hat.", + "low_alchemy": "7680", + "high_alchemy": "11520", + "shop_price": "275", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,0,0,30,32,27,1,30,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10550", + "name": "Ranger hat", + "examine": "A Penance ranger hat.", + "low_alchemy": "7680", + "high_alchemy": "11520", + "shop_price": "275", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "-5,-5,-5,-5,7,7,10,11,5,9,7,0,0,0,0", + "requirements": "{1,40}", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10551", + "name": "Fighter torso", + "examine": "Penance Fighter torso armour.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "tradeable": "false", + "shop_price": "375", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,0,66,85,62,-6,67,40,4,0,0,0", + "requirements": "{1,40}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10552", + "name": "Runner boots", + "examine": "Boots made from a Penance Runner.", + "shop_price": "100", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,12,13,14,0,0,10,2,0,0,0", + "requirements": "{1,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10553", + "name": "Penance gloves", + "examine": "These gloves seem unbelievably light!", + "shop_price": "150", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,3,4,0,2,2,4,0,0,0", + "requirements": "{1,40}", + "weight": "-7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10554", + "name": "Penance gloves", + "examine": "These gloves seem unbelievably light!", + "shop_price": "150", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,0,3,4,0,2,2,4,0,0,0", + "requirements": "{1,40}", + "weight": "0.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10555", + "name": "Penance skirt", + "examine": "A skirt made from the skin of a Penance Ranger.", + "shop_price": "375", + "equipment_slot": "7", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,16,26,21,28,19,27,15,0,0,0,0", + "requirements": "{1,40}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10556", + "name": "Picture", + "equipment_slot": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10557", + "name": "Picture", + "equipment_slot": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10558", + "name": "Picture", + "equipment_slot": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10559", + "name": "Picture", + "equipment_slot": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10560", + "name": "Collector horn", + "examine": "A horn for communication with your team members.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10562", + "name": "Queen help book", + "examine": "A book about the Barbarian Assault Queen.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will have to ask Captain Cain for another.", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10564", + "name": "Granite body", + "examine": "Provides excellent protection.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "shop_price": "95000", + "grand_exchange_price": "126800", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "4,0,8", + "bonuses": "0,0,0,-22,-5,87,84,79,-6,97,45,0,0,0,0", + "requirements": "{1,50}-{2,50}", + "weight": "22.6", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10565", + "name": "Granite body", + "tradeable": "true", + "grand_exchange_price": "126800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10566", + "name": "Fire cape", + "examine": "A cape of fire.", + "tradeable": "false", + "low_alchemy": "24000", + "high_alchemy": "36000", + "equipment_slot": "1", + "bonuses": "1,1,1,1,1,11,11,11,11,11,11,4,2,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10567", + "name": "Picture", + "examine": "Mabob.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "grand_exchange_price": "2", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10568", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10569", + "name": "Picture", + "examine": "Mabob.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "grand_exchange_price": "2", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10570", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10571", + "name": "Picture", + "examine": "Mabob.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "grand_exchange_price": "2", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10572", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10573", + "name": "Picture", + "examine": "Mabob.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "grand_exchange_price": "2", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10574", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10575", + "name": "Picture", + "examine": "Mabob.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "grand_exchange_price": "2", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10576", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10577", + "name": "Picture", + "examine": "Mabob.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "grand_exchange_price": "2", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10578", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10579", + "name": "Picture", + "examine": "Mabob.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "grand_exchange_price": "2", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10580", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10581", + "name": "Keris", + "examine": "(Normal) A mystical-feeling dagger. (Poisoned) The twisted blade is covered with a nasty poison.", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another from Osman. You will then need to poison it.", + "render_anim": "2584", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "40,20,-10,2,0,0,0,0,2,0,0,30,2,0,0", + "weapon_interface": "5", + "attack_anims": "376,376,377,376", + "defence_anim": "378", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10582", + "name": "Keris(p)", + "destroy_message": "You can obtain another from Osman. You will then need to poison it.", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "40,20,-10,2,0,0,0,0,2,0,0,30,2,0,0", + "weapon_interface": "5", + "attack_anims": "376,376,377,376", + "defence_anim": "378", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10583", + "name": "Keris(p+)", + "destroy_message": "You can obtain another from Osman. You will then need to poison it.", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "40,20,-10,2,0,0,0,0,2,0,0,30,2,0,0", + "weapon_interface": "5", + "attack_anims": "376,376,377,376", + "defence_anim": "378", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10584", + "name": "Keris(p++)", + "destroy_message": "You can obtain another from Osman. You will then need to poison it.", + "render_anim": "2584", + "equipment_slot": "3", + "bonuses": "40,20,-10,2,0,0,0,0,2,0,0,30,2,0,0", + "weapon_interface": "5", + "attack_anims": "376,376,377,376", + "defence_anim": "378", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10586", + "name": "Combat lamp", + "examine": "A mystical lamp, engraved with scenes of carnage.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain a replacement lamp from the high priest in Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10587", + "name": "Tarn's diary", + "examine": "Tarn Razorlor's diary.", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I got this diary in Tarn's Lair, perhaps I can get another one there.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10588", + "name": "Salve amulet(e)", + "examine": "Increases the wearer's Strength and Attack by 20% when fighting the undead.", + "low_alchemy": "150000", + "high_alchemy": "150000", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,3,3,3,0,0,3,0,3,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10589", + "name": "Granite helm", + "examine": "A stone helmet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "18400", + "high_alchemy": "27600", + "grand_exchange_price": "28000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,4", + "bonuses": "0,0,0,-9,-7,31,33,29,-1,39,9,0,0,0,0", + "requirements": "{1,50}-{2,50}", + "weight": "4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10590", + "name": "Granite helm", + "tradeable": "true", + "grand_exchange_price": "28000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10591", + "name": "Terror dog", + "examine": "A terrifying dog beast.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10592", + "name": "Penguin bongos", + "examine": "Small drums.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can make another with tanned leather and a mahogany plank.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10593", + "name": "Cowbells", + "examine": "Every song needs a cowbell.", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10594", + "name": "Clockwork book", + "examine": "A book about clockwork mechanisms.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10595", + "name": "Clockwork suit", + "examine": "A clockwork penguin suit.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to make another one at your house. Speak to Larry to learn how to make one.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10596", + "name": "Clockwork suit", + "examine": "A clockwork penguin suit.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to make another one at your house. Speak to Larry to learn how to make one.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10600", + "name": "Kgp id card", + "examine": "So you can be a penguin too!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Noodle to get another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10601", + "name": "Mystic hat", + "examine": "Blue: A magical hat. ", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "grand_exchange_price": "1", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10602", + "name": "Mystic hat", + "examine": "Blue: A magical hat. ", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "grand_exchange_price": "1", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10603", + "name": "Mystic hat", + "examine": "Blue: A magical hat. ", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "shop_price": "15000", + "grand_exchange_price": "1", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10604", + "name": "Skeletal helm", + "examine": "Make your foes cower by wearing a skull as a helmet!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "25569", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,2,-2,10,9,11,3,0,0,0,0,0,0", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10605", + "name": "Infinity top", + "examine": "Mystical robes.", + "tradeable": "true", + "low_alchemy": "56000", + "high_alchemy": "84000", + "grand_exchange_price": "3932123", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,22,0,0,0,0,22,0,0,0,0,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10606", + "name": "Splitbark helm", + "examine": "A wooden helmet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "5623", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,3,-2,10,9,11,3,0,0,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10607", + "name": "Ghostly boots", + "examine": "They seem to be not quite of this world...", + "low_alchemy": "120", + "high_alchemy": "180", + "equipment_slot": "10", + "bonuses": "0,0,0,2,0,0,0,0,2,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10608", + "name": "Moonclan hat", + "examine": "A mystical hat.", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "equipment_slot": "0", + "bonuses": "0,0,0,3,-5,3,3,3,3,-5,0,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10609", + "name": "Lunar helm", + "examine": "A mystical helmet.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "15000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,3,-2,8,7,10,2,0,0,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10610", + "name": "Decorative armour", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,32,31,24,-6,31,5,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10611", + "name": "Void knight top", + "examine": "Torso armour from the order of the Void Knights.", + "tradeable": "false", + "low_alchemy": "19200", + "high_alchemy": "28800", + "shop_price": "250", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,40,40,40,40,40,0,0,0,0,0", + "weight": "6.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10612", + "name": "Rogue mask", + "examine": "Black banded leather armour, a rogue's dream!", + "low_alchemy": "150", + "high_alchemy": "225", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,5,5,5,5,5,0,0,0,0,0", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10613", + "name": "Rock-shell helm", + "examine": "Protective headwear made from crabs. Better than it sounds.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "24661", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,0,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10614", + "name": "Spined helm", + "examine": "A helm fit for any Fremennik ranger.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24000", + "high_alchemy": "36000", + "grand_exchange_price": "35640", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "-6,-6,-6,-6,6,6,6,6,6,0,0,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10615", + "name": "Tribal mask", + "examine": "A ceremonial wooden mask.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "1021", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10616", + "name": "Tribal mask", + "examine": "A ceremonial wooden mask.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "1021", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10617", + "name": "Tribal mask", + "examine": "A ceremonial wooden mask.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "1021", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10618", + "name": "White platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "low_alchemy": "1536", + "high_alchemy": "2304", + "shop_price": "3840", + "grand_exchange_price": "4595", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,2", + "bonuses": "0,0,0,-30,-10,41,40,30,-6,40,0,0,1,0,0", + "weight": "9.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10619", + "name": "Initiate hauberk", + "examine": "An initiate Temple Knight's Armour.", + "tradeable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "shop_price": "10000", + "grand_exchange_price": "5821", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-30,-10,46,44,38,-6,44,0,0,6,0,0", + "weight": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10620", + "name": "Proselyte hauberk", + "examine": "A Proselyte Temple Knight's armour.", + "tradeable": "true", + "low_alchemy": "4800", + "high_alchemy": "7200", + "shop_price": "12000", + "grand_exchange_price": "6960", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-30,-10,65,63,55,-6,63,0,0,8,0,0", + "weight": "8.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10621", + "name": "Mourner top", + "examine": "A thick heavy leather top.", + "low_alchemy": "60", + "high_alchemy": "90", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10622", + "name": "Kyatt top", + "examine": "This should make me harder to spot in polar areas.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "216", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,0,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10623", + "name": "Larupia top", + "examine": "This should make me harder to spot in woodland and jungle areas.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "1793", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,0,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10624", + "name": "Graahk top", + "examine": "This should make me harder to spot in desert areas.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "300", + "grand_exchange_price": "246", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,0,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10625", + "name": "Wood camo top", + "examine": "This should make me harder to spot in wooded areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "3883", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,0,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10626", + "name": "Jungle camo top", + "examine": "This should make me harder to spot in jungle areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "325", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,0,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10627", + "name": "Desert camo top", + "examine": "This should make me harder to spot in desert areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "606", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,0,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10628", + "name": "Polar camo top", + "examine": "This should make me harder to spot in polar areas.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "5614", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,10,15,19,0,12,0,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10629", + "name": "Mime mask", + "examine": "A mime would wear this.", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10630", + "name": "Princess blouse", + "examine": "Very posh!", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10631", + "name": "Zombie shirt", + "examine": "Aside from the braaaains on the lapel, it's still quite good.", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10632", + "name": "Camo top", + "examine": "Examine what?", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10633", + "name": "Lederhosen top", + "examine": "A leather strapped top.", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10634", + "name": "Shade robe", + "examine": "I feel closer to the gods when I am wearing this. (Top) If a shade had knees, this would keep them nice and warm. (Bottom)", + "low_alchemy": "28", + "high_alchemy": "42", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,5,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10635", + "name": "Cape of legends", + "examine": "The cape worn by members of the Legends Guild.", + "low_alchemy": "180", + "high_alchemy": "270", + "shop_price": "450", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,7,7,7,7,7,0,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10636", + "name": "Obsidian cape", + "examine": "A cape woven of obsidian plates.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24000", + "high_alchemy": "36000", + "shop_price": "90000", + "grand_exchange_price": "38500", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10637", + "name": "Fire cape", + "examine": "A cape of fire.", + "tradeable": "false", + "low_alchemy": "24000", + "high_alchemy": "36000", + "equipment_slot": "1", + "bonuses": "1,1,1,1,1,11,11,11,11,11,0,4,2,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10638", + "name": "Team-1 cape", + "examine": "Ooohhh look at the pretty colours...", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10639", + "name": "Attack cape", + "examine": "The cape worn by masters of attack.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10640", + "name": "Strength cape", + "examine": "The cape only worn by the strongest people.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10641", + "name": "Defence cape", + "examine": "The cape worn by masters of the art of Defence.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10642", + "name": "Ranging cape", + "examine": "The cape worn by master archers.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10643", + "name": "Prayer cape", + "examine": "The cape worn by the most pious of heroes.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10644", + "name": "Magic cape", + "examine": "The cape worn by the most powerful mages.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10645", + "name": "Runecraft cape", + "examine": "The cape worn by master runecrafters.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10646", + "name": "Hunter cape", + "examine": "The cape worn by master hunters.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10647", + "name": "Hitpoints cape", + "examine": "The cape worn by well-constituted adventurers.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10648", + "name": "Agility cape", + "examine": "The cape worn by the most agile of heroes.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10649", + "name": "Herblore cape", + "examine": "The cape worn by the most skilled at the art of herblore.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10650", + "name": "Thieving cape", + "examine": "The cape worn by master thieves.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10651", + "name": "Crafting cape", + "examine": "The cape worn by master craftworkers.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10652", + "name": "Fletching cape", + "examine": "The cape worn by the best of fletchers.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10653", + "name": "Slayer cape", + "examine": "The cape worn by slayer masters.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10654", + "name": "Construct. cape", + "examine": "The cape worn by master builders.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10655", + "name": "Mining cape", + "examine": "The cape worn by the most skilled miners.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10656", + "name": "Smithing cape", + "examine": "The cape worn by master smiths.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10657", + "name": "Fishing cape", + "examine": "The cape worn by the best fishermen.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10658", + "name": "Cooking cape", + "examine": "The cape worn by the world's best chefs.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10659", + "name": "Firemaking cape", + "examine": "The cape worn by master firelighters.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10660", + "name": "Woodcutting cape", + "examine": "The cape worn by master woodcutters (Obtaining level 99 skill)", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10661", + "name": "Farming cape", + "examine": "The cape worn by master farmers.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10662", + "name": "Quest point cape", + "examine": "The cape worn by only the most experienced adventurers.", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10663", + "name": "Spotted cape", + "examine": "A surprisingly aerodynamic cape.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "951", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10664", + "name": "Spottier cape", + "examine": "A really surprisingly aerodynamic cape.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "881", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10665", + "name": "Black shield(h1)", + "examine": "A black kitesheild with a heraldic design.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "grand_exchange_price": "15249", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,0,0,0,0,0", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10666", + "name": "Adamant shield(h1)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "16339", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,0,0,0,0,0", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10667", + "name": "Rune shield(h1)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "35300", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,0,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10668", + "name": "Black shield(h2)", + "examine": "A black kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "6530", + "high_alchemy": "9795", + "grand_exchange_price": "9751", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,0,0,0,0,0", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10669", + "name": "Adamant shield(h2)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "3353", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,0,0,0,0,0", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10670", + "name": "Rune shield(h2)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "31903", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,0,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10671", + "name": "Black shield(h3)", + "examine": "A black shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "grand_exchange_price": "6791", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,0,0,0,0,0", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10672", + "name": "Adamant shield(h3)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "5566", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,0,0,0,0,0", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10673", + "name": "Rune shield(h3)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32082", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,0,0,0,0,0", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10674", + "name": "Black shield(h4)", + "examine": "A black shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "grand_exchange_price": "5159", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,0,0,0,0,0", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10675", + "name": "Adamant shield(h4)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "3219", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,0,0,0,0,0", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10676", + "name": "Rune shield(h4)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "32351", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,0,0,0,0,0", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10677", + "name": "Black shield(h5)", + "examine": "A black shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "652", + "high_alchemy": "979", + "grand_exchange_price": "8451", + "equipment_slot": "5", + "absorb": "1,0,2", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,0,0,0,0,0", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10678", + "name": "Adamant shield(h5)", + "examine": "A shield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "2176", + "high_alchemy": "3264", + "grand_exchange_price": "5905", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,0,0,0,0,0", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10679", + "name": "Rune shield(h5)", + "examine": "A rune kiteshield with a heraldic design.", + "tradeable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "grand_exchange_price": "35200", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,0,0,0,0,0", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10680", + "name": "Studded body (g)", + "examine": "Those studs should provide a bit more protection. Nice trim too!", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "grand_exchange_price": "67430", + "equipment_slot": "4", + "absorb": "0,3,1", + "bonuses": "0,0,0,-4,8,18,25,22,8,25,0,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10681", + "name": "Studded body (t)", + "examine": "Those studs should provide a bit more protection. Nice trim too!", + "tradeable": "true", + "low_alchemy": "340", + "high_alchemy": "510", + "grand_exchange_price": "22400", + "equipment_slot": "4", + "absorb": "0,3,1", + "bonuses": "0,0,0,-4,8,18,25,22,8,25,0,0,0,0,0", + "weight": "5.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10682", + "name": "D'hide body(g)", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,15,40,32,45,20,40,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10683", + "name": "D'hide body (t)", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,15,40,32,45,20,40,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10684", + "name": "D'hide body (g)", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,20,45,37,50,30,45,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10685", + "name": "D'hide body (t)", + "equipment_slot": "4", + "bonuses": "0,0,0,-15,20,45,37,50,30,45,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10686", + "name": "Wizard robe (g)", + "examine": "I can practise magic better in this.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10687", + "name": "Wizard robe (t)", + "examine": "I can do magic better in this.", + "tradeable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10688", + "name": "Enchanted top", + "examine": "Enchanted Wizards robes.", + "tradeable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "grand_exchange_price": "72800", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,0,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10689", + "name": "Wizard boots", + "examine": "Slightly magical boots.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "763602", + "equipment_slot": "10", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10690", + "name": "Black platebody (t)", + "examine": "Black platebody with trim.", + "tradeable": "true", + "low_alchemy": "1536", + "high_alchemy": "2304", + "grand_exchange_price": "90744", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,2", + "bonuses": "0,0,0,-30,-10,41,40,30,-6,40,0,0,0,0,0", + "weight": "9.07", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10691", + "name": "Black platebody (g)", + "examine": "Black platebody with gold trim.", + "tradeable": "true", + "low_alchemy": "1536", + "high_alchemy": "2304", + "grand_exchange_price": "230800", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "1,0,2", + "bonuses": "0,0,0,-30,-10,41,40,30,-6,40,0,0,0,0,0", + "weight": "9.07", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10692", + "name": "Highwayman mask", + "examine": "Your money or your life!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "92519", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10693", + "name": "Blue beret", + "examine": "Parlez-vous francais? (Do you speak French?)", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "64066", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10694", + "name": "Black beret", + "examine": "Parlez-vous francais?(Do you speak French?)", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "158274", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10695", + "name": "White beret", + "examine": "Parlez-vous francais? (Do you speak French?)", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "grand_exchange_price": "281900", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10696", + "name": "Ranger boots", + "examine": "Lightweight boots ideal for rangers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "11781186", + "equipment_slot": "10", + "bonuses": "0,0,0,-10,8,2,3,4,2,0,0,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10697", + "name": "Adam platebody (t)", + "examine": "Adamant platebody with trim.", + "tradeable": "true", + "low_alchemy": "5120", + "high_alchemy": "7680", + "grand_exchange_price": "79300", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-30,-10,65,63,55,-6,63,0,0,0,0,0", + "weight": "9.07", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10698", + "name": "Adam platebody (g)", + "examine": "Adamant platebody with gold trim.", + "tradeable": "true", + "low_alchemy": "5120", + "high_alchemy": "7680", + "grand_exchange_price": "207912", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-30,-10,65,63,55,-6,63,0,0,0,0,0", + "weight": "9.07", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10699", + "name": "Black helm (h1)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "22022", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,0,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10700", + "name": "Black helm (h2)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "11700", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,0,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10701", + "name": "Black helm (h3)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "10424", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,0,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10702", + "name": "Black helm (h4)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "12717", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,0,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10703", + "name": "Black helm (h5)", + "examine": "A black helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "422", + "high_alchemy": "633", + "grand_exchange_price": "17852", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,12,13,10,-1,12,0,0,0,0,0", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10704", + "name": "Rune helm (h1)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "30298", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10705", + "name": "Rune helm (h2)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "26127", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,0,0,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10706", + "name": "Rune helm (h3)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "37333", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,0,0,0,0,0", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10707", + "name": "Rune helm (h4)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "29600", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,0,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10708", + "name": "Rune helm (h5)", + "examine": "A rune helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "41325", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,0,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10709", + "name": "Adamant helm (h1)", + "examine": "An adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "28407", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,0,0,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10710", + "name": "Adamant helm (h2)", + "examine": "An adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "9839", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,0,0,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10711", + "name": "Adamant helm (h3)", + "examine": "An adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "8485", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,0,0,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10712", + "name": "Adamant helm (h4)", + "examine": "An Adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "10774", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,0,0,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10713", + "name": "Adamant helm (h5)", + "examine": "An adamant helmet with a heraldic design.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "grand_exchange_price": "17390", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,0,0,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10714", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "8425", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10715", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "8425", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10716", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "8425", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10717", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "8425", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10718", + "name": "Bob shirt", + "examine": "See table", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "8425", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10719", + "name": "Amulet of glory(t)", + "examine": "A very powerful dragonstone amulet.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "1", + "equipment_slot": "2", + "bonuses": "10,10,10,10,10,3,3,3,3,3,3,6,3,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10720", + "name": "Guthix cape", + "examine": "A cape from the almighty god Guthix.", + "low_alchemy": "40", + "high_alchemy": "60", + "equipment_slot": "1", + "bonuses": "0,0,0,10,0,1,1,2,10,0,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10721", + "name": "Frog mask", + "examine": "Now that's just silly.", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10722", + "name": "Reindeer hat", + "examine": "A reindeer hat and a matching flashing nose.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from Diango in Draynor Village.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10723", + "name": "Jack lantern mask", + "examine": "Better not light it!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You may get another from Diango in Draynor Village.", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10724", + "name": "Skeleton boots", + "examine": "Skeleton feet.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "10", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10725", + "name": "Skeleton gloves", + "examine": "Some skeletal gloves.", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "9", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10726", + "name": "Skeleton leggings", + "examine": "Does my pelvis look big in this?", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "7", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10727", + "name": "Skeleton shirt", + "examine": "The shirt of a fully body skeleton costume.", + "destroy_message": "You can reclaim this item from the place you found it.", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10728", + "name": "Skeleton mask", + "examine": "A scary skeleton mask.", + "destroy_message": "You can reclaim this item from the place you found it.", + "remove_head": "true", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10729", + "name": "Easter ring", + "examine": "A ring given to you by the Easter Bunny.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10730", + "name": "Blue marionette", + "examine": "I've got no strings ... oh hang on!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another marionette in Diango's workshop by the trap door.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10731", + "name": "Zombie head", + "examine": "Alas...I hardly knew him.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10732", + "name": "Rubber chicken", + "examine": "Perhaps not the most powerful weapon in RuneScape.", + "stand_anim": "1832", + "stand_turn_anim": "823", + "walk_anim": "1830", + "run_anim": "824", + "turn180_anim": "1830", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "182", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "-100,-100,-50,0,0,0,0,0,0,0,0,-10,0,0,0", + "weapon_interface": "12", + "weight": "0.4", + "fun_weapon": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10733", + "name": "Yo-yo", + "examine": "A gift from Santa.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10734", + "name": "Bunny ears", + "examine": "A rabbit-like adornment.", + "equipment_slot": "0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10735", + "name": "Scythe", + "examine": "It's a Scythe.", + "stand_anim": "847", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1383", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "3,8,3,0,0,0,3,1,0,0,0,10,0,0,0", + "two_handed": "true", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10736", + "name": "Strength amulet(t)", + "examine": "An enchanted ruby amulet with a nice trim.", + "tradeable": "true", + "low_alchemy": "810", + "high_alchemy": "1215", + "grand_exchange_price": "443800", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,10,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10738", + "name": "Amulet of magic(t)", + "examine": "An enchanted sapphire amulet of magic.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "grand_exchange_price": "67158", + "equipment_slot": "2", + "bonuses": "0,0,0,10,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10740", + "name": "A powdered wig", + "examine": "A big 'do about nothing.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "36879", + "remove_head": "true", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10742", + "name": "Flared trousers", + "examine": "These'll help me stay alive.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "559284", + "equipment_slot": "7", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10744", + "name": "Pantaloons", + "examine": "Alas, someone has slashed my pantaloons.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "12022", + "equipment_slot": "7", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10746", + "name": "Sleeping cap", + "examine": "A cap for wearing whil...zzzzzzzzz", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "grand_exchange_price": "376084", + "remove_head": "true", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10748", + "name": "Elegant shirt", + "examine": "Blouse: A well made elegant ladies' [colour] blouse.Skirt: A rather elegant [colour] skirt.Shirt: A well made elegant mans' [colour] shirt.Legs: A rather elegant [colour] pair of pantaloons.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10750", + "name": "Elegant shirt", + "examine": "Blouse: A well made elegant ladies' [colour] blouse.Skirt: A rather elegant [colour] skirt.Shirt: A well made elegant mans' [colour] shirt.Legs: A rather elegant [colour] pair of pantaloons.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10752", + "name": "Elegant shirt", + "examine": "Blouse: A well made elegant ladies' [colour] blouse.Skirt: A rather elegant [colour] skirt.Shirt: A well made elegant mans' [colour] shirt.Legs: A rather elegant [colour] pair of pantaloons.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10754", + "name": "Elegant shirt", + "examine": "Blouse: A well made elegant ladies' [colour] blouse.Skirt: A rather elegant [colour] skirt.Shirt: A well made elegant mans' [colour] shirt.Legs: A rather elegant [colour] pair of pantaloons.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10756", + "name": "Elegant shirt", + "examine": "Blouse: A well made elegant ladies' [colour] blouse.Skirt: A rather elegant [colour] skirt.Shirt: A well made elegant mans' [colour] shirt.Legs: A rather elegant [colour] pair of pantaloons.", + "tradeable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10758", + "name": "Red boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "56600", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10760", + "name": "Orange boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "20300", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10762", + "name": "Green boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "59940", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10764", + "name": "Blue boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "54236", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10766", + "name": "Black boater", + "examine": "Stylish!", + "tradeable": "true", + "low_alchemy": "90", + "high_alchemy": "135", + "grand_exchange_price": "56495", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10768", + "name": "Red headband", + "examine": "A minimalist's hat.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "114319", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10770", + "name": "Black headband", + "examine": "A minimalist's hat.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "41778", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10772", + "name": "Brown headband", + "examine": "A minimalist's hat.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "grand_exchange_price": "21764", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10774", + "name": "Pirate's hat", + "examine": "Shiver me timbers!", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "83200", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10776", + "name": "Zamorak platebody", + "examine": "Rune platebody in the colours of Zamorak.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "647800", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,0", + "weight": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10778", + "name": "Saradomin plate", + "examine": "Rune platebody in the colours of Saradomin.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "1097689", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,0", + "weight": "9.07", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10780", + "name": "Guthix platebody", + "examine": "Rune platebody in the colours of Guthix.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "241600", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,1", + "weight": "9.07", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10782", + "name": "Gilded platebody", + "examine": "Rune platebody with complete gold trim & plating.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "1653821", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,0", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10784", + "name": "Saradomin robe top", + "examine": "Blessed vestments of Saradomin.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "grand_exchange_price": "106389", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10786", + "name": "Zamorak robe top", + "examine": "Zamorak Vestments.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "grand_exchange_price": "151000", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,4,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10788", + "name": "Guthix robe top", + "examine": "Blessed vestments of Guthix.", + "tradeable": "true", + "low_alchemy": "2800", + "high_alchemy": "4200", + "grand_exchange_price": "80181", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,4,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10790", + "name": "Zamorak d'hide", + "examine": "Zamorak blessed dragonhide body armour.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "grand_exchange_price": "84966", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,50,55,0,0,0,0,0", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10792", + "name": "Saradomin d'hide", + "examine": "Saradomin blessed dragonhide body armour.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "destroy": "true", + "shop_price": "13000", + "grand_exchange_price": "92762", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,50,55,0,0,0,0,0", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10794", + "name": "Guthix dragonhide", + "examine": "Guthix blessed dragonhide body armour.", + "tradeable": "true", + "low_alchemy": "5200", + "high_alchemy": "7800", + "shop_price": "13", + "grand_exchange_price": "22384", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,50,55,0,0,0,0,0", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10796", + "name": "Robin hood hat", + "examine": "Endorsed by Robin Hood.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "180", + "high_alchemy": "270", + "grand_exchange_price": "3070557", + "equipment_slot": "0", + "bonuses": "0,0,0,-10,8,4,6,8,4,4,0,0,0,0,0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10798", + "name": "Rune platebody (g)", + "examine": "Rune platebody with gold trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "231400", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,0", + "weight": "9.07", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10800", + "name": "Rune platebody (t)", + "examine": "Rune platebody with trim.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "grand_exchange_price": "61100", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,0,0,0,0,0", + "weight": "9.07", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10802", + "name": "Tan cavalier", + "examine": "All for one and one for all!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "56677", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10804", + "name": "Dark cavalier", + "examine": "All for one and one for all!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "18942", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10806", + "name": "Black cavalier", + "examine": "All for one and one for all!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "421305", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10808", + "name": "Arctic pyre logs", + "examine": "Arctic Pine logs prepared with sacred oil for a funeral pyre", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "3453", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10809", + "name": "Arctic pyre logs", + "tradeable": "true", + "grand_exchange_price": "3453", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10810", + "name": "Arctic pine logs", + "examine": "Log cut from an arctic pine.", + "tradeable": "true", + "low_alchemy": "14", + "high_alchemy": "21", + "grand_exchange_price": "90", + "equipment_slot": "5", + "weight": "2", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10811", + "name": "Arctic pine logs", + "tradeable": "true", + "grand_exchange_price": "90", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10812", + "name": "Split log", + "examine": "Used to repair bridges.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "18", + "weight": "1.8", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10813", + "name": "Split log", + "tradeable": "true", + "grand_exchange_price": "18", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10814", + "name": "Hair", + "examine": "I can spin this into rope.", + "tradeable": "true", + "low_alchemy": "48", + "high_alchemy": "72", + "shop_price": "120", + "grand_exchange_price": "113", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10815", + "name": "Hair", + "tradeable": "true", + "grand_exchange_price": "113", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10816", + "name": "Raw yak meat", + "examine": "I need to cook this.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "14", + "weight": "3", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10817", + "name": "Raw yak meat", + "tradeable": "true", + "grand_exchange_price": "14", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10818", + "name": "Yak-hide", + "examine": "Thakkrad, of Neitiznot, can cure this.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "grand_exchange_price": "301", + "weight": "0.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10819", + "name": "Yak-hide", + "tradeable": "true", + "grand_exchange_price": "301", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10820", + "name": "Cured yak-hide", + "examine": "Ready to be cut and sewn into armour.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "396", + "weight": "0.4", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10821", + "name": "Cured yak-hide", + "tradeable": "true", + "grand_exchange_price": "396", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10822", + "name": "Yak-hide armour", + "grand_exchange_price": "122", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-5,0,25,20,15,-2,25,5,0,0,0,0", + "requirements": "{1,20}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10823", + "name": "Yak-hide armour", + "tradeable": "true", + "grand_exchange_price": "122", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10824", + "name": "Yak-hide armour", + "grand_exchange_price": "83", + "equipment_slot": "7", + "bonuses": "0,0,0,-5,10,25,20,15,-2,10,0,0,0,0,0", + "requirements": "{1,20}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10825", + "name": "Yak-hide armour", + "tradeable": "true", + "grand_exchange_price": "83", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10826", + "name": "Fremennik round shield", + "examine": "A shield worn by Fremennik warriors.", + "low_alchemy": "2000", + "high_alchemy": "3000", + "destroy": "true", + "grand_exchange_price": "402", + "equipment_slot": "5", + "bonuses": "0,0,0,-10,-10,17,17,31,-4,33,20,0,0,0,0", + "requirements": "{1,25}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10827", + "name": "Fremennik round shield", + "tradeable": "true", + "grand_exchange_price": "402", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10828", + "name": "Helm of neitiznot", + "examine": "A gift from Neitiznot's Burgher.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "50000", + "grand_exchange_price": "44800", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,4", + "bonuses": "0,0,0,0,0,31,29,34,3,30,8,3,3,0,0", + "requirements": "{1,55}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10830", + "name": "Royal decree", + "examine": "The document is stamped with King Gjuki Sorvott IV's royal seal.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "King Sorvott of Jatizso will give you another one, grudgingly.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10831", + "name": "Empty tax bag", + "examine": "An empty tax bag.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure? You can replace it by talking to King Sorvott.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10836", + "name": "Silly jester hat", + "examine": "A silly hat with bells.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure? You can find another in King Sorvott's chest.", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,0,0,0,5,-5,0,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10837", + "name": "Silly jester top", + "examine": "A jester's jangly top.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure? You can find another in King Sorvott's chest.", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,0,0,5,-5,5,0,0,0,0", + "weight": "6.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10838", + "name": "Silly jester tights", + "examine": "Silly jester tights.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure? You can find another in King Sorvott's chest.", + "equipment_slot": "7", + "bonuses": "0,0,0,0,0,0,0,0,5,-5,0,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10839", + "name": "Silly jester boots", + "examine": "Silly jester boots.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure? You can find another in King Sorvott's chest.", + "equipment_slot": "10", + "bonuses": "0,0,0,0,0,0,0,0,5,-5,0,0,0,0,0", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10840", + "name": "A jester stick", + "equipment_slot": "3", + "bonuses": "0,0,0,0,0,0,0,0,5,-5,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10842", + "name": "Decapitated head", + "examine": "No brain: A gruesome, decapitated head, whose brain has rotted away. Brain: A gruesome, decapitated head - its eyes stare lifelessly at nothing.", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10843", + "name": "Helm of neitiznot", + "tradeable": "true", + "grand_exchange_price": "44800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10844", + "name": "Spring sq'irk", + "examine": "A slightly sq'irky, I mean quirky, fruit.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10845", + "name": "Summer sq'irk", + "examine": "A slightly sq'irky, I mean quirky, fruit.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10846", + "name": "Autumn sq'irk", + "examine": "A slightly sq'irky, I mean quirky, fruit.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10847", + "name": "Winter sq'irk", + "examine": "A slightly sq'irky, I mean quirky, fruit.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10848", + "name": "Spring sq'irkjuice", + "examine": "Made from 4 spring sq'irks.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10849", + "name": "Summer sq'irkjuice", + "examine": "Made from 2 summer sq'irks.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10850", + "name": "Autumn sq'irkjuice", + "examine": "Made from 3 autumn sq'irks.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10851", + "name": "Winter sq'irkjuice", + "examine": "Made from 5 winter sq'irks.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10856", + "name": "Sin seer's note", + "examine": "Her writing is too scrawled to make out what it says.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Sin Seer in Seers' Village to get another one.", + "shop_price": "40", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10857", + "name": "Severed leg", + "examine": "A severed human leg.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to General Khazard, near the Fremennik Province, to get another.", + "weight": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10858", + "name": "Shadow sword", + "examine": "A shadow sword.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another one by visiting the cave near the Fishing guild. A friendly ghost will replace it for you. You must be wearing a Ring of visibility, or you cannot get it back.", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7044", + "turn90ccw_anim": "7043", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-4,27,21,4,0,0,0,0,4,-1,0,26,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "weight": "3.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10859", + "name": "Tea flask", + "examine": "You can put nice, hot tea in it.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10860", + "name": "Tea flask", + "examine": "You can put nice, hot tea in it.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10861", + "name": "Tea flask", + "examine": "You can put nice, hot tea in it.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10862", + "name": "Hard hat", + "examine": "Can't get any safer than this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another within the Tower of Life!", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10863", + "name": "Builder's shirt", + "examine": "Very fetching.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another within the Tower of Life!", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10864", + "name": "Builder's trousers", + "examine": "Slightly tatty in my opinion.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another within the Tower of Life!", + "equipment_slot": "7", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10865", + "name": "Builder's boots", + "examine": "They'll offer good protection for my toes.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another within the Tower of Life!", + "equipment_slot": "10", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10866", + "name": "Rivets", + "examine": "Used to bolt things together.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10870", + "name": "Binding fluid", + "examine": "Some magical fluid to bind surfaces.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10871", + "name": "Pipe", + "examine": "A pipe that belongs in a cannon stand.", + "destroy": "true", + "tradeable": "false", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10872", + "name": "Pipe ring", + "examine": "A ring used to join two pipes together.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10873", + "name": "Metal sheet", + "examine": "A sheet of metal.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10874", + "name": "Coloured ball", + "examine": "Bound to have some use.", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10875", + "name": "Valve wheel", + "examine": "A wheel used to control valves.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10876", + "name": "Metal bar", + "examine": "Some unknown metal substance.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10877", + "name": "Plain satchel", + "examine": "I can keep my grub in here.", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "128", + "equipment_slot": "5", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10878", + "name": "Green satchel", + "examine": "I can keep my grub in here.", + "low_alchemy": "40", + "high_alchemy": "60", + "equipment_slot": "5", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10879", + "name": "Red satchel", + "examine": "I can keep my grub in here.", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "128", + "equipment_slot": "5", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10880", + "name": "Black satchel", + "examine": "I can keep my grub in here.", + "low_alchemy": "40", + "high_alchemy": "60", + "equipment_slot": "5", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10881", + "name": "Gold satchel", + "examine": "I can keep my grub in here.", + "low_alchemy": "40", + "high_alchemy": "60", + "equipment_slot": "5", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10882", + "name": "Rune satchel", + "examine": "I can keep my grub in here.", + "low_alchemy": "40", + "high_alchemy": "60", + "equipment_slot": "5", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10883", + "name": "Hard hat", + "examine": "Can't get any safer than this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another within the Tower of Life!", + "equipment_slot": "0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10884", + "name": "Fuse", + "examine": "A fuse.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10885", + "name": "Keg", + "examine": "A small keg of gunpowder.", + "weight": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10886", + "name": "Prayer book", + "examine": "Used to cure poison through prayer.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10887", + "name": "Barrelchest anchor", + "examine": "This is likely to put my back out... (when fixed) OR It's broken. I should see if a pirate smith can fix it. (when broken)", + "low_alchemy": "92000", + "high_alchemy": "138000", + "destroy_message": "If you drop the Anchor it will be destroyed, and you will need to get a new one from Brother Tranquillity, then pay Smith to re", + "stand_anim": "5869", + "stand_turn_anim": "823", + "walk_anim": "5867", + "run_anim": "5868", + "turn180_anim": "5867", + "turn90cw_anim": "5867", + "turn90ccw_anim": "5867", + "render_anim": "985", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "-2,10,92,0,0,0,0,0,0,0,0,100,0,0,0", + "weapon_interface": "8", + "has_special": "true", + "two_handed": "true", + "attack_anims": "5865,5865,5865,5865", + "defence_anim": "5866", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10888", + "name": "Barrelchest anchor", + "examine": "This is likely to put my back out... (when fixed) OR It's broken. I should see if a pirate smith can fix it. (when broken)", + "low_alchemy": "92000", + "high_alchemy": "138000", + "attack_speed": "6", + "bonuses": "-2,10,92,0,0,0,0,0,0,0,0,100,0,0,0", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10889", + "name": "Blessed lamp", + "examine": "This will answer my prayers.", + "destroy_message": "If you drop this lamp it will be destroyed, and you will need to see Brother Tranquility for another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10890", + "name": "Prayer book", + "examine": "Used to cure poison through prayer.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This book is old and delicate. You can reclaim this item from the place you found it.ping it here will destroy it and you will have to search the Edgeville Monastery bookcase for another.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10891", + "name": "Wooden cat", + "examine": "A wooden cat toy.", + "tradeable": "true", + "grand_exchange_price": "922", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10892", + "name": "Wooden cat", + "tradeable": "true", + "grand_exchange_price": "922", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10893", + "name": "Cranial clamp", + "examine": "A cranial clamp.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10894", + "name": "Brain tongs", + "examine": "Some tongs for use with brains.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10895", + "name": "Bell jar", + "examine": "A bell jar for covering things.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10896", + "name": "Wolf whistle", + "examine": "A silver whistle.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10897", + "name": "Shipping order", + "examine": "A shipping order list.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10898", + "name": "Keg", + "examine": "A small keg of gunpowder.", + "weight": "12", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10899", + "name": "Crate part", + "examine": "Part of a crate.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10904", + "name": "Skull staple", + "examine": "One skull staple.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10909", + "name": "Mixture - step 1(4)", + "examine": "This super restore and unicorn dust potion needs more ingredients.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "8420", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10910", + "name": "Mixture - step 1(4)", + "tradeable": "true", + "grand_exchange_price": "8420", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10911", + "name": "Mixture - step 1(3)", + "examine": "This super restore and unicorn dust potion needs more ingredients.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "6543", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10912", + "name": "Mixture - step 1(3)", + "tradeable": "true", + "grand_exchange_price": "6543", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10913", + "name": "Mixture - step 1(2)", + "examine": "This super restore and unicorn dust potion needs more ingredients.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "4335", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10914", + "name": "Mixture - step 1(2)", + "tradeable": "true", + "grand_exchange_price": "4335", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10915", + "name": "Mixture - step 1(1)", + "examine": "This super restore and unicorn dust potion needs more ingredients.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "2168", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10916", + "name": "Mixture - step 1(1)", + "tradeable": "true", + "grand_exchange_price": "2168", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10917", + "name": "Mixture - step 2(4)", + "examine": "This super restore, unicorn dust, snake weed potion needs more ingredients.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "8665", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10918", + "name": "Mixture - step 2(4)", + "tradeable": "true", + "grand_exchange_price": "8665", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10919", + "name": "Mixture - step 2(3)", + "examine": "This super restore, unicorn dust, snake weed potion needs more ingredients.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "6695", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10920", + "name": "Mixture - step 2(3)", + "tradeable": "true", + "grand_exchange_price": "6695", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10921", + "name": "Mixture - step 2(2)", + "examine": "This super restore, unicorn dust, snake weed potion needs more ingredients.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "4335", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10922", + "name": "Mixture - step 2(2)", + "tradeable": "true", + "grand_exchange_price": "4335", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10923", + "name": "Mixture - step 2(1)", + "examine": "This super restore, unicorn dust, snake weed potion needs more ingredients.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "2168", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10924", + "name": "Mixture - step 2(1)", + "tradeable": "true", + "grand_exchange_price": "2168", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10925", + "name": "Sanfew serum(4)", + "examine": "A \"X\" dose Sanfew Serum.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "15900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10926", + "name": "Sanfew serum(4)", + "tradeable": "true", + "grand_exchange_price": "15900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10927", + "name": "Sanfew serum(3)", + "examine": "A \"X\" dose Sanfew Serum.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "12000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10928", + "name": "Sanfew serum(3)", + "tradeable": "true", + "grand_exchange_price": "12000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10929", + "name": "Sanfew serum(2)", + "examine": "A \"X\" dose Sanfew Serum.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "10200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10930", + "name": "Sanfew serum(2)", + "tradeable": "true", + "grand_exchange_price": "10200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10931", + "name": "Sanfew serum(1)", + "examine": "A \"X\" dose Sanfew Serum.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "6114", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10932", + "name": "Sanfew serum(1)", + "tradeable": "true", + "grand_exchange_price": "6114", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10933", + "name": "Lumberjack boots", + "examine": "You certainly will be alright wearing these.", + "low_alchemy": "20", + "high_alchemy": "30", + "equipment_slot": "10", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10934", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10935", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10936", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10937", + "name": "Nail beast nails", + "examine": "The claws from a nail beast", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "203", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10938", + "name": "Nail beast nails", + "tradeable": "true", + "grand_exchange_price": "203", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10939", + "name": "Lumberjack top", + "examine": "You certainly will be alright wearing this.", + "low_alchemy": "20", + "high_alchemy": "30", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10940", + "name": "Lumberjack legs", + "examine": "You certainly will be alright wearing these.", + "low_alchemy": "20", + "high_alchemy": "30", + "equipment_slot": "7", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10941", + "name": "Lumberjack hat", + "examine": "You certainly will be alright wearing this.", + "low_alchemy": "20", + "high_alchemy": "30", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10942", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10943", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10944", + "name": "Reward token", + "examine": "Blue/Red/Yellow reward token exchanged at Burgh de Rott/Paterdomus.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Warning! If you destroy this item, you will lose ALL rewards that it relates to and you will have to make another trek in order to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10945", + "name": "Lumberjack top", + "examine": "You certainly will be alright wearing this.", + "low_alchemy": "20", + "high_alchemy": "30", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10950", + "name": "Skull staples", + "examine": "One skull staple.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10951", + "name": "Skull staples", + "examine": "One skull staple.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10952", + "name": "Slayer bell", + "examine": "Don't make anyone jump when you ring this!", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "shop_price": "150", + "grand_exchange_price": "57", + "requirements": "{18,39}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10953", + "name": "Slayer bell", + "tradeable": "true", + "grand_exchange_price": "57", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10954", + "name": "Frog-leather body", + "examine": "Armour made out of Frog hide.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "grand_exchange_price": "1797", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,3,1", + "bonuses": "0,0,0,-5,10,23,26,30,15,32,20,0,0,0,0", + "requirements": "{1,25}-{4,25}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10955", + "name": "Frog-leather body", + "tradeable": "true", + "grand_exchange_price": "1797", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10956", + "name": "Frog-leather chaps", + "examine": "Chaps made out of Frog hide.", + "tradeable": "true", + "low_alchemy": "360", + "high_alchemy": "540", + "shop_price": "900", + "grand_exchange_price": "361", + "equipment_slot": "7", + "absorb": "0,2,1", + "bonuses": "0,0,0,-5,2,7,7,9,4,9,5,0,0,0,0", + "requirements": "{1,25}-{4,25}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10957", + "name": "Frog-leather chaps", + "tradeable": "true", + "grand_exchange_price": "361", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10958", + "name": "Frog-leather boots", + "examine": "Boots made out of Frog hide.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "1156", + "equipment_slot": "10", + "bonuses": "0,0,0,-8,2,1,1,1,0,1,0,0,0,0,0", + "requirements": "{1,25}-{4,25}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10959", + "name": "Frog-leather boots", + "tradeable": "true", + "grand_exchange_price": "1156", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10960", + "name": "Green gloop soup", + "examine": "Thick and tasty soup.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10961", + "name": "Frogspawn gumbo", + "examine": "A big bowl of frogspawn gumbo.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10962", + "name": "Frogburger", + "examine": "A juicy frogburger.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10963", + "name": "Coated frogs' legs", + "examine": "Nice and crunchy.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10964", + "name": "Bat shish", + "examine": "Bat shish kebab.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10965", + "name": "Fingers", + "examine": "Wall beast fingers in a white fern sauce.", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10967", + "name": "Roast frog", + "examine": "A whole roasted frog.", + "low_alchemy": "20", + "high_alchemy": "30", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10968", + "name": "Mushrooms", + "examine": "Tasty saut??ed mushrooms.", + "low_alchemy": "20", + "high_alchemy": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10969", + "name": "Fillets", + "examine": "Chunky cave-crawler fillets.", + "low_alchemy": "20", + "high_alchemy": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10970", + "name": "Loach", + "examine": "Steamed cave pond loach.", + "low_alchemy": "20", + "high_alchemy": "30", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10971", + "name": "Eel sushi", + "examine": "Cave-eel sushi.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10972", + "name": "Dorgesh-kaan sphere", + "examine": "Oldak's Marvellous Moving-Over-Distance Sphere.", + "shop_price": "2", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10973", + "name": "Light orb", + "examine": "A component of cave goblin Magic.", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "grand_exchange_price": "90", + "requirements": "{11,52}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10974", + "name": "Light orb", + "tradeable": "true", + "grand_exchange_price": "90", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10975", + "name": "Spanner", + "examine": "A goblin wrench.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10976", + "name": "Long bone", + "examine": "A Construction bone.", + "shop_price": "1000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10977", + "name": "Curved bone", + "examine": "A curved Construction bone.", + "low_alchemy": "2", + "high_alchemy": "4", + "shop_price": "2000", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10978", + "name": "Swamp weed", + "examine": "Swamp weed found in the caves near Dorgesh-Kaan.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "292", + "weight": "0.2", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10979", + "name": "Swamp weed", + "tradeable": "true", + "grand_exchange_price": "292", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10980", + "name": "Empty light orb", + "examine": "Add a wire to complete it.", + "low_alchemy": "100", + "high_alchemy": "150", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10981", + "name": "Cave goblin wire", + "examine": "Wire found in Dorgesh-Kaan.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "grand_exchange_price": "988", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10982", + "name": "Cave goblin wire", + "tradeable": "true", + "grand_exchange_price": "988", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10983", + "name": "Cog", + "examine": "A cog. Broken: A broken cog.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another cog from the old power station.", + "shop_price": "160", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10984", + "name": "Cog", + "examine": "A cog. Broken: A broken cog.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another cog from the old power station.", + "shop_price": "160", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10985", + "name": "Fuse", + "examine": "A fuse.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10986", + "name": "Fuse", + "examine": "A fuse.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10987", + "name": "Meter", + "examine": "A meter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10988", + "name": "Meter", + "examine": "A meter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10989", + "name": "Capacitor", + "examine": "A capacitor.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10990", + "name": "Capacitor", + "examine": "A capacitor.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10993", + "name": "Powerbox", + "examine": "A powerbox. Broken: A broken powerbox.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another power box from the old power station.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10994", + "name": "Powerbox", + "examine": "A powerbox. Broken: A broken powerbox.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another power box from the old power station.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10995", + "name": "Perfect shell", + "examine": "A perfect example of a tortoise shell.", + "low_alchemy": "400", + "high_alchemy": "600", + "weight": "6.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10996", + "name": "Perfect snail shell", + "examine": "A perfect example of a snail shell.", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10997", + "name": "Molanisk", + "examine": "On wall: That white dot looks like an eye! Off wall: A strange mole-like being.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10998", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "10999", + "name": "Goblin book", + "examine": "A tattered goblin holy book.", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11001", + "name": "Dagon'hai history", + "examine": "The History of Dagon'hai.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to get another copy from the Varrock Palace Library if you destroy this one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11002", + "name": "Sin'keth's diary", + "examine": "The diary of Sin'keth Magis.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to get another copy from the Varrock Palace Library if you destroy this one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11003", + "name": "An empty folder", + "examine": "A folder for Rat's papers.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to ask Rat for another empty folder if you destroy this one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11006", + "name": "Used folder", + "examine": "A folder for rat's papers. It needs more pages.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11007", + "name": "Full folder", + "examine": "A full folder. You should take this back to Rat.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11008", + "name": "Rat's paper", + "examine": "A page of Rat's document.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to find more papers about the outlaws if you destroy this.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11009", + "name": "Rat's letter", + "examine": "A letter in a strange language.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to get another copy of the letter from Rat if you destroy this.", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11010", + "name": "Surok's letter", + "examine": "A letter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to ask Surok for another letter to Rat if you destroy this.", + "shop_price": "27", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11011", + "name": "Zaff's instructions", + "examine": "Instructions for the beacon ring.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11012", + "name": "Wand", + "examine": "A wand.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11013", + "name": "Infused wand", + "examine": "This wand is glowing with chaos magic.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11014", + "name": "Beacon ring", + "examine": "A magical ring.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to get another ring from Zaff if you destroy this one.", + "equipment_slot": "12", + "bonuses": "0,0,0,2,0,0,0,0,1,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11015", + "name": "Chicken head", + "examine": "Cock-a-doodle-do!", + "destroy": "true", + "tradeable": "false", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11016", + "name": "Chicken feet", + "examine": "Perfect for crossing the road.", + "destroy": "true", + "tradeable": "false", + "equipment_slot": "10", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11017", + "name": "Chicken wings", + "examine": "I look fowl in this.", + "destroy": "true", + "tradeable": "false", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11018", + "name": "Chicken legs", + "examine": "What's the matter, are you chicken?", + "destroy": "true", + "tradeable": "false", + "equipment_slot": "7", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11019", + "name": "Chicken feet", + "examine": "Perfect for crossing the road.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Diango to get another pair of chicken feet.", + "equipment_slot": "10", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11020", + "name": "Chicken wings", + "examine": "I look fowl in this.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Diango to get another set of chicken wings.", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11021", + "name": "Chicken head", + "examine": "Cock-a-doodle-do!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Diango to get another chicken head.", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11022", + "name": "Chicken legs", + "examine": "What's the matter, are you chicken?", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to speak to Diango to get another set of chicken legs.", + "equipment_slot": "7", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11023", + "name": "Magic egg", + "examine": "Let's see how far the rabbit hole goes.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11024", + "name": "Rabbit mould", + "examine": "Used for making chocolate rabbits.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11025", + "name": "Chocolate chunks", + "examine": "Some chocolate chunks.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11026", + "name": "Chocolate kebbit", + "examine": "Chocolatey kebbit goodness.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11027", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11028", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11029", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11030", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11031", + "name": "Damp planks", + "examine": "A number of dripping, waterlogged planks.", + "destroy_message": "These logs will be destroyed if you drop them and you will need to see Olaf Hradson to get some more.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11032", + "name": "Crude carving", + "examine": "A log with some squiggles carved into it.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11033", + "name": "Cruder carving", + "examine": "Another log with some sort of bird hacked into it.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11034", + "name": "Sven's last map", + "examine": "A faded map marking a cross next to a section of the landscape.", + "destroy_message": "This map will be destroyed if you drop it and you will need to see Olaf Hradson to get another.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11035", + "name": "Windswept logs", + "examine": "Logs taken from the exotic-looking windswept tree.", + "destroy_message": "These logs will be destroyed if you drop them and you will need to chop more from the windswept tree.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11037", + "name": "Brine sabre", + "examine": "A salty sword.", + "tradeable": "true", + "low_alchemy": "10400", + "high_alchemy": "15600", + "grand_exchange_price": "120200", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "7,47,-2,0,0,0,0,0,0,0,0,46,0,0,0", + "weapon_interface": "6", + "has_special": "true", + "requirements": "{0,40}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "attack_anims": "390,390,381,390", + "durability": null + }, + { + "id": "11038", + "name": "Brine sabre", + "tradeable": "true", + "grand_exchange_price": "120200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11044", + "name": "Rotten barrel", + "examine": "Looks like it might still float.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11045", + "name": "Rotten barrel", + "examine": "Looks like it might still float.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11046", + "name": "Rope", + "examine": "A coil of rope.", + "tradeable": "true", + "low_alchemy": "7", + "high_alchemy": "10", + "shop_price": "18", + "grand_exchange_price": "101", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11047", + "name": "Brine rat", + "examine": "Eww, a bald rat!", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11048", + "name": "Armour shard", + "examine": "A piece of ancient goblin armour.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11049", + "name": "Artefact", + "examine": "An ancient goblin object encrusted in dirt.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11050", + "name": "Axe head", + "examine": "It's missing a handle.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11051", + "name": "Artefact", + "examine": "An ancient goblin object encrusted in dirt.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11052", + "name": "Helmet fragment", + "examine": "A piece of ancient goblin helmet.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11053", + "name": "Artefact", + "examine": "An ancient goblin object encrusted in dirt.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11054", + "name": "Shield fragment", + "examine": "A piece of an ancient goblin shield.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11055", + "name": "Artefact", + "examine": "An ancient goblin object encrusted in dirt.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11056", + "name": "Sword fragment", + "examine": "A piece of an ancient goblin sword.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11057", + "name": "Artefact", + "examine": "An ancient goblin object encrusted in dirt.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11058", + "name": "Mace", + "attack_speed": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11059", + "name": "Artefact", + "examine": "An ancient goblin object encrusted in dirt.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11060", + "name": "Goblin village sphere", + "examine": "Oldak's marvellous Moving-over-distance Sphere", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "2", + "weight": "0.05", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11061", + "name": "Ancient mace", + "examine": "It has ancient goblin symbols on it.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "1000", + "grand_exchange_price": "4093", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,-2,16,0,0,0,0,0,0,0,0,14,3,0,0", + "weapon_interface": "8", + "has_special": "true", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,25}-{5,15}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11064", + "name": "Ancient mace", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11065", + "name": "Bracelet mould", + "examine": "Used to make gold bracelets.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "shop_price": "5", + "grand_exchange_price": "456", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11066", + "name": "Bracelet mould", + "tradeable": "true", + "grand_exchange_price": "456", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11069", + "name": "Gold bracelet", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "220", + "high_alchemy": "330", + "shop_price": "165", + "grand_exchange_price": "223", + "equipment_slot": "9", + "weight": "0.2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11070", + "name": "Gold bracelet", + "tradeable": "true", + "grand_exchange_price": "223", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11072", + "name": "Sapphire bracelet", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "460", + "high_alchemy": "690", + "shop_price": "1035", + "grand_exchange_price": "578", + "equipment_slot": "9", + "weight": "0.25", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11073", + "name": "Sapphire bracelet", + "tradeable": "true", + "grand_exchange_price": "578", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11074", + "name": "Bracelet of clay", + "examine": "Now I can become a potter.", + "tradeable": "true", + "low_alchemy": "506", + "high_alchemy": "759", + "shop_price": "506", + "grand_exchange_price": "644", + "equipment_slot": "9", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11075", + "name": "Bracelet of clay", + "tradeable": "true", + "grand_exchange_price": "644", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11076", + "name": "Emerald bracelet", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "610", + "high_alchemy": "915", + "grand_exchange_price": "786", + "equipment_slot": "9", + "weight": "0.2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11077", + "name": "Emerald bracelet", + "tradeable": "true", + "grand_exchange_price": "786", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11079", + "name": "Castlewar brace(3)", + "examine": "Must be worn as you enter the game to receive the bonus for that game.", + "tradeable": "true", + "low_alchemy": "670", + "high_alchemy": "1005", + "grand_exchange_price": "926", + "equipment_slot": "9", + "weight": "0.25", + "ge_buy_limit": "34464", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11080", + "name": "Castlewar brace(3)", + "tradeable": "true", + "grand_exchange_price": "926", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11081", + "name": "Castlewar brace(2)", + "examine": "Must be worn as you enter the game to receive the bonus for that game.", + "tradeable": "true", + "low_alchemy": "670", + "high_alchemy": "1005", + "grand_exchange_price": "3", + "equipment_slot": "9", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11082", + "name": "Castlewar brace(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11083", + "name": "Castlewar brace(1)", + "examine": "Must be worn as you enter the game to receive the bonus for that game.", + "tradeable": "true", + "low_alchemy": "670", + "high_alchemy": "1005", + "grand_exchange_price": "3484", + "equipment_slot": "9", + "weight": "0.25", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11084", + "name": "Castlewar brace(1)", + "tradeable": "true", + "grand_exchange_price": "3484", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11085", + "name": "Ruby bracelet", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "930", + "high_alchemy": "1395", + "shop_price": "2325", + "grand_exchange_price": "1271", + "equipment_slot": "9", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11086", + "name": "Ruby bracelet", + "tradeable": "true", + "grand_exchange_price": "1271", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11088", + "name": "Inoculation brace", + "examine": "It eases diseases!", + "tradeable": "true", + "low_alchemy": "1024", + "high_alchemy": "1536", + "grand_exchange_price": "1376", + "equipment_slot": "9", + "weight": "0.25", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11089", + "name": "Inoculation brace", + "tradeable": "true", + "grand_exchange_price": "1376", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11090", + "name": "Phoenix necklace", + "examine": "In case of emergency, wear necklace.", + "tradeable": "true", + "low_alchemy": "1620", + "high_alchemy": "2430", + "grand_exchange_price": "15400", + "equipment_slot": "2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11091", + "name": "Phoenix necklace", + "tradeable": "true", + "grand_exchange_price": "15400", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11092", + "name": "Diamond bracelet", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "1530", + "high_alchemy": "2295", + "shop_price": "3422", + "grand_exchange_price": "12100", + "equipment_slot": "9", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11093", + "name": "Diamond bracelet", + "tradeable": "true", + "grand_exchange_price": "12100", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11095", + "name": "Forinthry brace(5)", + "examine": "It repels revenants and helps you enter the Abyss.", + "tradeable": "true", + "low_alchemy": "1680", + "high_alchemy": "2520", + "grand_exchange_price": "15200", + "equipment_slot": "9", + "weight": "0.2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11096", + "name": "Forinthry brace(5)", + "tradeable": "true", + "grand_exchange_price": "15200", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11097", + "name": "Forinthry brace(4)", + "examine": "It repels revenants and helps you enter the Abyss.", + "tradeable": "true", + "low_alchemy": "1680", + "high_alchemy": "2520", + "grand_exchange_price": "5", + "equipment_slot": "9", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11098", + "name": "Forinthry brace(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11099", + "name": "Forinthry brace(3)", + "examine": "It repels revenants and helps you enter the Abyss.", + "tradeable": "true", + "low_alchemy": "1680", + "high_alchemy": "2520", + "grand_exchange_price": "5", + "equipment_slot": "9", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11100", + "name": "Forinthry brace(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11101", + "name": "Forinthry brace(2)", + "examine": "It repels revenants and helps you enter the Abyss.", + "tradeable": "true", + "low_alchemy": "1680", + "high_alchemy": "2520", + "grand_exchange_price": "5", + "equipment_slot": "9", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11102", + "name": "Forinthry brace(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11103", + "name": "Forinthry brace(1)", + "examine": "It repels revenants and helps you enter the Abyss.", + "tradeable": "true", + "low_alchemy": "1680", + "high_alchemy": "2520", + "grand_exchange_price": "2537", + "equipment_slot": "9", + "weight": "0.2", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11104", + "name": "Forinthry brace(1)", + "tradeable": "true", + "grand_exchange_price": "2537", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11105", + "name": "Skills necklace(4)", + "examine": "This will help me travel.", + "tradeable": "true", + "low_alchemy": "8080", + "high_alchemy": "12120", + "grand_exchange_price": "30400", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11106", + "name": "Skills necklace(4)", + "tradeable": "true", + "grand_exchange_price": "30400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11107", + "name": "Skills necklace(3)", + "examine": "This will help me travel.", + "tradeable": "true", + "low_alchemy": "8080", + "high_alchemy": "12120", + "grand_exchange_price": "1", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11108", + "name": "Skills necklace(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11109", + "name": "Skills necklace(2)", + "examine": "This will help me travel.", + "tradeable": "true", + "low_alchemy": "8080", + "high_alchemy": "12120", + "grand_exchange_price": "1", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11110", + "name": "Skills necklace(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11111", + "name": "Skills necklace(1)", + "examine": "This will help me travel.", + "tradeable": "true", + "low_alchemy": "8080", + "high_alchemy": "12120", + "grand_exchange_price": "1", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11112", + "name": "Skills necklace(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11113", + "name": "Skills necklace", + "examine": "This will help me travel.", + "tradeable": "true", + "low_alchemy": "8080", + "high_alchemy": "12120", + "grand_exchange_price": "28400", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11114", + "name": "Skills necklace", + "tradeable": "true", + "grand_exchange_price": "28400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11115", + "name": "Dragon bracelet", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "7650", + "high_alchemy": "11475", + "grand_exchange_price": "26000", + "equipment_slot": "9", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11116", + "name": "Dragon bracelet", + "tradeable": "true", + "grand_exchange_price": "26000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11118", + "name": "Combat bracelet(4)", + "examine": "You will need to recharge the bracelet at the Legends Guild.(uncharged) A handy way to get around.(charged)", + "tradeable": "true", + "low_alchemy": "8416", + "high_alchemy": "12624", + "grand_exchange_price": "29700", + "equipment_slot": "9", + "bonuses": "7,7,7,3,7,5,5,5,3,5,5,6,0,0,0", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11119", + "name": "Combat bracelet(4)", + "tradeable": "true", + "grand_exchange_price": "29700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11120", + "name": "Combat bracelet(3)", + "examine": "You will need to recharge the bracelet at the Legends Guild.(uncharged) A handy way to get around.(charged)", + "tradeable": "true", + "low_alchemy": "8416", + "high_alchemy": "12624", + "grand_exchange_price": "1", + "equipment_slot": "9", + "bonuses": "7,7,7,3,7,5,5,5,3,5,5,6,0,0,0", + "weight": "0.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11121", + "name": "Combat bracelet(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11122", + "name": "Combat bracelet(2)", + "examine": "You will need to recharge the bracelet at the Legends Guild.(uncharged) A handy way to get around.(charged)", + "tradeable": "true", + "low_alchemy": "8416", + "high_alchemy": "12624", + "grand_exchange_price": "1", + "equipment_slot": "9", + "bonuses": "7,7,7,3,7,5,5,5,3,5,5,6,0,0,0", + "weight": "0.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11123", + "name": "Combat bracelet(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11124", + "name": "Combat bracelet(1)", + "examine": "You will need to recharge the bracelet at the Legends Guild.(uncharged) A handy way to get around.(charged)", + "tradeable": "true", + "low_alchemy": "8416", + "high_alchemy": "12624", + "grand_exchange_price": "1", + "equipment_slot": "9", + "bonuses": "7,7,7,3,7,5,5,5,3,5,5,6,0,0,0", + "weight": "0.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11125", + "name": "Combat bracelet(1)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11126", + "name": "Combat bracelet", + "examine": "You will need to recharge the bracelet at the Legends Guild.(uncharged) A handy way to get around.(charged)", + "tradeable": "true", + "low_alchemy": "8416", + "high_alchemy": "12624", + "grand_exchange_price": "29000", + "equipment_slot": "9", + "bonuses": "7,7,7,3,7,5,5,5,3,5,5,6,0,0,0", + "weight": "0.3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11127", + "name": "Combat bracelet", + "tradeable": "true", + "grand_exchange_price": "29000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11128", + "name": "Berserker necklace", + "examine": "Makes obsidian weapons even stronger!", + "tradeable": "true", + "low_alchemy": "80400", + "high_alchemy": "120600", + "grand_exchange_price": "2400000", + "equipment_slot": "2", + "bonuses": "-10,-10,-10,0,0,-20,-20,-20,-20,-20,-20,7,3,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11129", + "name": "Berserker necklace", + "tradeable": "true", + "grand_exchange_price": "2400000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11130", + "name": "Onyx bracelet", + "examine": "I wonder if this is valuable.", + "tradeable": "true", + "low_alchemy": "80800", + "high_alchemy": "121200", + "shop_price": "80400", + "grand_exchange_price": "941200", + "equipment_slot": "9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11131", + "name": "Onyx bracelet", + "tradeable": "true", + "grand_exchange_price": "941200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11133", + "name": "Regen bracelet", + "examine": "Helps to restore your life points.", + "tradeable": "true", + "low_alchemy": "80800", + "high_alchemy": "121200", + "grand_exchange_price": "124200", + "equipment_slot": "9", + "bonuses": "8,8,8,3,7,6,6,6,3,6,5,7,0,0,0", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11134", + "name": "Regen bracelet", + "tradeable": "true", + "grand_exchange_price": "124200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11135", + "name": "Bomber jacket", + "examine": "For all your flying needs.", + "destroy": "true", + "tradeable": "false", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11136", + "name": "Karamja gloves 1", + "examine": "A pair of pale green Karamja gloves.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "9", + "bonuses": "1,1,1,1,1,1,1,1,1,1,1,1,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11137", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11138", + "name": "Karamja gloves 2", + "examine": "A pair of green Karamja gloves.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "9", + "bonuses": "1,1,1,1,1,1,1,1,1,1,1,1,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11139", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11140", + "name": "Karamja gloves 3", + "examine": "A pair of dark green Karamja gloves.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "equipment_slot": "9", + "bonuses": "1,1,1,1,1,1,1,1,1,1,1,1,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11141", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11151", + "name": "Dream vial (empty)", + "examine": "When empty: A vessel for holding liquid. Filled with water: A vessel containing water. Filled with Goutweed: A vessel containing water and goutweed.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11152", + "name": "Dream vial (water)", + "examine": "When empty: A vessel for holding liquid. Filled with water: A vessel containing water. Filled with Goutweed: A vessel containing water and goutweed.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11153", + "name": "Dream vial (herb)", + "examine": "When empty: A vessel for holding liquid. Filled with water: A vessel containing water. Filled with Goutweed: A vessel containing water and goutweed.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11154", + "name": "Dream potion", + "examine": "Potion of Shared Dreaming. One dream for two!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11155", + "name": "Ground astral rune", + "examine": "A ground astral rune.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11156", + "name": "Astral rune shards", + "examine": "An astral rune that has been broken into shards.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11157", + "name": "Dreamy lamp", + "examine": "A lunar-styled lamp. I wonder what's inside?", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11158", + "name": "Cyrisus's chest", + "examine": "Perfect for storing heavy things.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11159", + "name": "Hunter kit", + "examine": "A box of Hunter goodies.", + "tradeable": "true", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will have to create another using the Lunar Spellbook.", + "grand_exchange_price": "3", + "weight": "0.4", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11164", + "name": "Restored shield", + "examine": "Complete Shield of Arrav.", + "destroy": "true", + "destroy_message": "You'll need to get it back from Captain Rovin.", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11165", + "name": "Phoenix crossbow", + "examine": "Second-rate crossbow, former property of the Phoenix Gang.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "bonuses": "0,0,0,0,6,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_audios": "2700,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11166", + "name": "Phoenix crossbow", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11167", + "name": "Phoenix crossbow", + "examine": "Second-rate crossbow, former property of the Phoenix Gang.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "bonuses": "0,0,0,0,6,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_audios": "2700,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11168", + "name": "Phoenix crossbow", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11169", + "name": "Newspaper", + "examine": "A collection of written news on paper!", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "50", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11170", + "name": "Newspaper", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11171", + "name": "Newspaper", + "examine": "A collection of written news on paper!", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "50", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11172", + "name": "Newspaper", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11173", + "name": "Half certificate", + "examine": "I can use this to claim a reward from the King, if I get the other half.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Instead of destroying this I should get a friend to help me retrieve the other half.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11174", + "name": "Half certificate", + "examine": "I can use this to claim a reward from the King, if I get the other half.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Instead of destroying this I should get a friend to help me retrieve the other half.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11175", + "name": "Uncleaned find", + "examine": "A roughly-prepared archaeological find ready for cleaning.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another find from the pile in the cleaning area of Varrock Museum.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11179", + "name": "Old coin", + "examine": "An old looking coin.", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11180", + "name": "Ancient coin", + "examine": "A cracked and rusty looking coin.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11181", + "name": "Ancient symbol", + "examine": "A very old symbol of Saradomin.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11182", + "name": "Old symbol", + "examine": "An old symbol of Saradomin.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11183", + "name": "Old chipped vase", + "examine": "An old vase with Saradominist markings - it has been chipped.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11184", + "name": "Museum map", + "examine": "A map of Varrock Museum.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11185", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11186", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11187", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11188", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11189", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11190", + "name": "Digsite pendant (1)", + "examine": "An enchanted necklace.", + "low_alchemy": "960", + "high_alchemy": "1440", + "equipment_slot": "2", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11191", + "name": "Digsite pendant (2)", + "examine": "An enchanted necklace.", + "low_alchemy": "960", + "high_alchemy": "1440", + "equipment_slot": "2", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11192", + "name": "Digsite pendant (3)", + "examine": "An enchanted necklace.", + "low_alchemy": "960", + "high_alchemy": "1440", + "equipment_slot": "2", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11193", + "name": "Digsite pendant (4)", + "examine": "An enchanted necklace.", + "low_alchemy": "960", + "high_alchemy": "1440", + "equipment_slot": "2", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11194", + "name": "Digsite pendant (5)", + "examine": "An enchanted necklace.", + "low_alchemy": "960", + "high_alchemy": "1440", + "equipment_slot": "2", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11195", + "name": "Clean necklace", + "examine": "A recently-cleaned necklace.", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11196", + "name": "Griffin feather", + "examine": "One of Grimgnash's feathers.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11197", + "name": "Miazrqa's pendant", + "examine": "The pendant belonging to Miazrqa.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to try and find another pendant in the mouse hole if you destroy this.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11198", + "name": "Music sheet", + "examine": "A sheet of music.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to find another sheet of music in the witch's basement if you destroy this.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11199", + "name": "Rupert's helmet", + "examine": "A sturdy helmet that belonged to Rupert the beard.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to obtain another helmet from Rupert the Beard if you destroy this", + "shop_price": "60000", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11200", + "name": "Dwarven helmet", + "examine": "A sturdy helmet that belonged to Rupert the beard.", + "tradeable": "true", + "low_alchemy": "24000", + "high_alchemy": "36000", + "shop_price": "60000", + "grand_exchange_price": "35800", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,6,-2,-2,27,28,31,5,24,8,0,0,0,0", + "requirements": "{1,50}", + "weight": "1.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11201", + "name": "Dwarven helmet", + "tradeable": "true", + "grand_exchange_price": "35800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11202", + "name": "Shrinking recipe", + "examine": "A recipe for a shrinking potion.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to find another copy in the witch's basement if you destroy this.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11203", + "name": "To-do list", + "examine": "A list of tasks for the day.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to find another copy in the witch's basement if you destroy this.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11204", + "name": "Shrink-me-quick", + "examine": "Apparently it shrinks you. Very fast.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to make another shrinking potion if you destroy this.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11205", + "name": "Shrunk ogleroot", + "examine": "A shrunk ogleroot! How odd...", + "tradeable": "true", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "shop_price": "4", + "grand_exchange_price": "35", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11210", + "name": "Golden goblin", + "examine": "A shiny golden goblin. Strange!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11211", + "name": "Magic beans", + "examine": "A bag of magic beans.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to get another bag of beans from Sylas if you destroy this one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11212", + "name": "Dragon arrow", + "examine": "An arrow made using a dragon's talon.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "2674", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,60", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11217", + "name": "Dragon fire arrows", + "examine": "unlit: Arrows with dragon heads and oil-soaked cloth.lit: Dragon-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "3988", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,60", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11222", + "name": "Dragon fire arrows", + "examine": "unlit: Arrows with dragon heads and oil-soaked cloth.lit: Dragon-headed fire arrow.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "3834", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,60", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11227", + "name": "Dragon arrow(p)", + "examine": "An arrow made using a dragon's talon.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "3141", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,60", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11228", + "name": "Dragon arrow(p+)", + "examine": "An arrow made using a dragon's talon.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "2866", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,60", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11229", + "name": "Dragon arrow(p++)", + "examine": "An arrow made using a dragon's talon.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "3766", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,60", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11230", + "name": "Dragon dart", + "examine": "A deadly throwing dart with a dragon tip.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "315", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,18,0,0,0,0,0,0,0,0,0,20", + "weapon_interface": "18", + "attack_audios": "2547,0,0,0", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11231", + "name": "Dragon dart(p)", + "examine": "A deadly throwing dart with a dragon tip.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "445", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,18,0,0,0,0,0,0,0,0,0,20", + "weapon_interface": "18", + "attack_audios": "2547,0,0,0", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11232", + "name": "Dragon dart tip", + "examine": "A deadly looking dragon dart tip - needs feathers for flight.", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "746", + "attack_audios": "2547,0,0,0", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11233", + "name": "Dragon dart(p+)", + "examine": "A deadly throwing dart with a dragon tip.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "516", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,18,0,0,0,0,0,0,0,0,0,20", + "weapon_interface": "18", + "attack_audios": "2547,0,0,0", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11234", + "name": "Dragon dart(p++)", + "examine": "A deadly throwing dart with a dragon tip.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "1248", + "equipment_slot": "3", + "attack_speed": "3", + "bonuses": "0,0,0,0,18,0,0,0,0,0,0,0,0,0,20", + "weapon_interface": "18", + "attack_audios": "2547,0,0,0", + "requirements": "{4,60}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11235", + "name": "Dark bow", + "examine": "A bow from a darker dimension.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72001", + "grand_exchange_price": "143400", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "9", + "bonuses": "0,0,0,0,95,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "attack_anims": "426,426,426,426", + "defence_anim": "424", + "attack_audios": "3731,0,0,0", + "requirements": "{4,60}", + "weight": "1.9", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11236", + "name": "Dark bow", + "tradeable": "true", + "grand_exchange_price": "143400", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11237", + "name": "Dragon arrowtips", + "examine": "Dragon talons, usable as arrowheads.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "3391", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11238", + "name": "Baby impling jar", + "examine": "A baby impling in a jar. That's a bit cruel.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "529", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11239", + "name": "Baby impling jar", + "tradeable": "true", + "grand_exchange_price": "529", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11240", + "name": "Young impling jar", + "examine": "A young impling in a jar. Don't trap me, man.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "514", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11241", + "name": "Young impling jar", + "tradeable": "true", + "grand_exchange_price": "514", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11242", + "name": "Gourm' impling jar", + "examine": "A gourmet impling in a jar.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "677", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11243", + "name": "Gourm' impling jar", + "tradeable": "true", + "grand_exchange_price": "677", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11244", + "name": "Earth impling jar", + "examine": "Earth impling in a jar.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "1343", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11245", + "name": "Earth impling jar", + "tradeable": "true", + "grand_exchange_price": "1343", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11246", + "name": "Ess' impling jar", + "examine": "Essence impling in a jar.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "1266", + "weight": "2.2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11247", + "name": "Ess' impling jar", + "tradeable": "true", + "grand_exchange_price": "1266", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11248", + "name": "Eclectic impling jar", + "examine": "Eclectic impling in a jar.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "2943", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11249", + "name": "Eclectic impling jar", + "tradeable": "true", + "grand_exchange_price": "2943", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11250", + "name": "Nature impling jar", + "examine": "Nature impling in a jar.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "8593", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11251", + "name": "Nature impling jar", + "tradeable": "true", + "grand_exchange_price": "8593", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11252", + "name": "Magpie impling jar", + "examine": "Magpie impling in a jar.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "22900", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11253", + "name": "Magpie impling jar", + "tradeable": "true", + "grand_exchange_price": "22900", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11254", + "name": "Ninja impling jar", + "examine": "Ninja impling in a jar.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "21800", + "weight": "1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11255", + "name": "Ninja impling jar", + "tradeable": "true", + "grand_exchange_price": "21800", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11256", + "name": "Dragon impling jar", + "examine": "Dragon impling in a jar.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "grand_exchange_price": "423600", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11257", + "name": "Dragon impling jar", + "tradeable": "true", + "grand_exchange_price": "423600", + "ge_buy_limit": "500", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11258", + "name": "Jar generator", + "examine": "Creates butterfly and impling jars.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11259", + "name": "Magic butterfly net", + "examine": "For catching butterflies.", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will have to trade with Elnock to get a new magic butterfly net.", + "shop_price": "3", + "stand_anim": "6604", + "stand_turn_anim": "6611", + "walk_anim": "6607", + "run_anim": "6603", + "turn180_anim": "6608", + "turn90cw_anim": "6610", + "turn90ccw_anim": "6609", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "4", + "weapon_interface": "14", + "two_handed": "true", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11260", + "name": "Impling jar", + "examine": "It's got little holes in the top.", + "tradeable": "true", + "shop_price": "1", + "grand_exchange_price": "248", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11261", + "name": "Impling jar", + "tradeable": "true", + "grand_exchange_price": "248", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11262", + "name": "Imp repellent", + "examine": "Imps seem to hate this stuff. Can't say I blame them.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "3", + "grand_exchange_price": "1016", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11263", + "name": "Imp repellent", + "tradeable": "true", + "grand_exchange_price": "1016", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11264", + "name": "Anchovy oil", + "examine": "Omega 3 oil. Good for the brain, not so for the nose.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "grand_exchange_price": "601", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11265", + "name": "Anchovy oil", + "tradeable": "true", + "grand_exchange_price": "601", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11266", + "name": "Anchovy paste", + "examine": "Fish paste. Urk.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "57", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11267", + "name": "Picture", + "examine": "I can train on this", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11268", + "name": "Picture", + "examine": "I can train on this", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11269", + "name": "Picture", + "examine": "I can train on this", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11270", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11271", + "name": "Picture", + "examine": "I can train on this", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11272", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11273", + "name": "Impling scroll", + "examine": "Lets you easily identify your prey.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will have to ask Elnock for another one of these.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11274", + "name": "Ham shirt", + "examine": "The label says 'Vivid Crimson', but it looks like pink to me!", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "grand_exchange_price": "27", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,0,0,0,2,2,0,0,0,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11275", + "name": "Mith grapple", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11276", + "name": "Mith grapple", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11277", + "name": "Cavalier mask", + "examine": "I hope I don't meet any roundheads...", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "equipment_slot": "8", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11278", + "name": "Beret mask", + "examine": "Essential mime wear.", + "equipment_slot": "0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11279", + "name": "Elvarg's head", + "examine": "The severed head of the great dragon Elvarg!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can complete the quest by speaking to Oziach even if you do not have the head.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11280", + "name": "Cavalier and mask", + "examine": "I hope I don't meet any roundheads...", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11281", + "name": "Cavalier and mask", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11282", + "name": "Beret and mask", + "examine": "Essential mime wear.", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11283", + "name": "Dragonfire shield", + "examine": "A heavy shield with a snarling, draconic visage.", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "grand_exchange_price": "5653008", + "equipment_slot": "5", + "bonuses": "0,0,0,-10,-5,70,75,72,10,72,17,7,0,0,0", + "requirements": "{1,75}", + "weight": "7.2", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11284", + "name": "Dragonfire shield", + "examine": "A heavy shield with a snarling, draconic visage.", + "tradeable": "true", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "grand_exchange_price": "7700000", + "equipment_slot": "5", + "bonuses": "0,0,0,-10,-5,20,25,22,10,22,17,7,0,0,0", + "requirements": "{1,75}", + "weight": "7.2", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11285", + "name": "Dragonfire shield", + "tradeable": "true", + "grand_exchange_price": "7700000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11286", + "name": "Draconic visage", + "examine": "It looks like this could be attached to a shield somehow.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "grand_exchange_price": "8000000", + "weight": "1.8", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11287", + "name": "Draconic visage", + "tradeable": "true", + "grand_exchange_price": "8000000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11323", + "name": "Barbarian rod", + "examine": "A heavy barbarian Fishing rod.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11324", + "name": "Roe", + "examine": "Roe, or cheap fishy eggs.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "6", + "grand_exchange_price": "17", + "weight": "0.05", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11325", + "name": "Roe", + "tradeable": "true", + "grand_exchange_price": "17", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11326", + "name": "Caviar", + "examine": "Caviar, or expensive fishy eggs.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "370", + "weight": "0.05", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11327", + "name": "Caviar", + "tradeable": "true", + "grand_exchange_price": "370", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11328", + "name": "Leaping trout", + "examine": "A sad-looking trout.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "11", + "grand_exchange_price": "9", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11329", + "name": "Leaping trout", + "tradeable": "true", + "grand_exchange_price": "9", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11330", + "name": "Leaping salmon", + "examine": "Some non-tasty salmon.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "19", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11331", + "name": "Leaping salmon", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11332", + "name": "Leaping sturgeon", + "examine": "A bloated sturgeon.", + "tradeable": "true", + "low_alchemy": "30", + "high_alchemy": "45", + "grand_exchange_price": "151", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11333", + "name": "Leaping sturgeon", + "tradeable": "true", + "grand_exchange_price": "151", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11334", + "name": "Fish offcuts", + "examine": "Slices of inedible fish.", + "tradeable": "true", + "grand_exchange_price": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11335", + "name": "Dragon full helm", + "examine": "Protects your head and looks impressive too.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "60000", + "high_alchemy": "90000", + "grand_exchange_price": "51600000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "2,0,4", + "bonuses": "0,0,0,-6,-2,45,48,41,-1,46,12,0,0,0,0", + "requirements": "{1,60}", + "weight": "2", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11336", + "name": "Dragon full helm", + "tradeable": "true", + "grand_exchange_price": "51600000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11337", + "name": "Mangled bones", + "examine": "The bones of a barbarian warrior, slain by his fellow adventurers.", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "destroy_message": "I can gather more from the caverns below the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11338", + "name": "Chewed bones", + "examine": "The bones of a barbarian warrior, slain by vile dragons.", + "low_alchemy": "1", + "high_alchemy": "1", + "destroy": "true", + "destroy_message": "I can gather more from the caverns below the Baxtorian Lake.", + "weight": "9.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11339", + "name": "My notes", + "examine": "Records from my discoveries beneath the lake.", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can obtain another from Otto.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11340", + "name": "Barbarian skills", + "examine": "A record of Otto's instructions to me.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can obtain another from Otto.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11341", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11342", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11343", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11344", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11345", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11346", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11347", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11348", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11349", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11350", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11351", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11352", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11353", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11354", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11355", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11356", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11357", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11358", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11359", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11360", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11361", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11362", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11363", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11364", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11365", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11366", + "name": "Ancient page", + "examine": "Could a dragon have written this?; Tiny writing.;Smells disgusting.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another from the caverns beneath the Baxtorian Lake.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11367", + "name": "Bronze hasta", + "examine": "A bronze-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "204", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,5,5,0,0,-1,-1,-1,0,-1,0,6,0,0,0", + "weapon_interface": "14", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11368", + "name": "Bronze hasta", + "tradeable": "true", + "grand_exchange_price": "204", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11369", + "name": "Iron hasta", + "examine": "An iron-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "25", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,8,8,0,0,-2,-2,-2,0,-2,0,10,0,0,0", + "weapon_interface": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11370", + "name": "Iron hasta", + "tradeable": "true", + "grand_exchange_price": "25", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11371", + "name": "Steel hasta", + "examine": "A steel-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "grand_exchange_price": "93", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,12,12,0,0,-3,-3,-3,0,-3,0,12,0,0,0", + "weapon_interface": "14", + "requirements": "{0,5}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11372", + "name": "Steel hasta", + "tradeable": "true", + "grand_exchange_price": "93", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11373", + "name": "Mithril hasta", + "examine": "A mithril-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "357", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,-5,-5,-4,0,-5,0,18,0,0,0", + "weapon_interface": "14", + "requirements": "{0,20}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11374", + "name": "Mithril hasta", + "tradeable": "true", + "grand_exchange_price": "357", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11375", + "name": "Adamant hasta", + "examine": "An adamant-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "832", + "high_alchemy": "1248", + "grand_exchange_price": "1095", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "24,24,24,0,0,-6,-7,-5,0,-6,0,28,0,0,0", + "weapon_interface": "14", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11376", + "name": "Adamant hasta", + "tradeable": "true", + "grand_exchange_price": "1095", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11377", + "name": "Rune hasta", + "examine": "A rune-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "grand_exchange_price": "12300", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "36,36,36,0,0,-10,-10,-9,0,-10,0,42,0,0,0", + "weapon_interface": "14", + "requirements": "{0,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11378", + "name": "Rune hasta", + "tradeable": "true", + "grand_exchange_price": "12300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11379", + "name": "Bronze hasta(p)", + "examine": "A bronze-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "290", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,5,5,0,0,-1,-1,-1,0,-1,0,6,0,0,0", + "weapon_interface": "14", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11380", + "name": "Bronze hasta(p)", + "tradeable": "true", + "grand_exchange_price": "290", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11381", + "name": "Bronze hasta(kp)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "5,5,5,0,0,-1,-1,-1,0,-1,0,6,0,0,0", + "weapon_interface": "14", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11382", + "name": "Bronze hasta(p+)", + "examine": "A bronze-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "775", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,5,5,0,0,-1,-1,-1,0,-1,0,6,0,0,0", + "weapon_interface": "14", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11383", + "name": "Bronze hasta(p+)", + "tradeable": "true", + "grand_exchange_price": "775", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11384", + "name": "Bronze hasta(p++)", + "examine": "A bronze-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "8974", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "5,5,5,0,0,-1,-1,-1,0,-1,0,6,0,0,0", + "weapon_interface": "14", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11385", + "name": "Bronze hasta(p++)", + "tradeable": "true", + "grand_exchange_price": "8974", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11386", + "name": "Iron hasta(p)", + "examine": "An iron-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "99", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,8,8,0,0,-2,-2,-2,0,-2,0,10,0,0,0", + "weapon_interface": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11387", + "name": "Iron hasta(p)", + "tradeable": "true", + "grand_exchange_price": "99", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11388", + "name": "Iron hasta(kp)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "8,8,8,0,0,-2,-2,-2,0,-2,0,10,0,0,0", + "weapon_interface": "14", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11389", + "name": "Iron hasta(p+)", + "examine": "An iron-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "584", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,8,8,0,0,-2,-2,-2,0,-2,0,10,0,0,0", + "weapon_interface": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11390", + "name": "Iron hasta(p+)", + "tradeable": "true", + "grand_exchange_price": "584", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11391", + "name": "Iron hasta(p++)", + "examine": "An iron-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "8783", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "8,8,8,0,0,-2,-2,-2,0,-2,0,10,0,0,0", + "weapon_interface": "14", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11392", + "name": "Iron hasta(p++)", + "tradeable": "true", + "grand_exchange_price": "8783", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11393", + "name": "Steel hasta(p)", + "examine": "A steel-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "grand_exchange_price": "151", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,12,12,0,0,-3,-3,-3,0,-3,0,12,0,0,0", + "weapon_interface": "14", + "requirements": "{0,5}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11394", + "name": "Steel hasta(p)", + "tradeable": "true", + "grand_exchange_price": "151", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11395", + "name": "Steel hasta(kp)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "12,12,12,0,0,-3,-3,-3,0,-3,0,12,0,0,0", + "weapon_interface": "14", + "requirements": "{0,5}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11396", + "name": "Steel hasta(p+)", + "examine": "A steel-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "grand_exchange_price": "636", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,12,12,0,0,-3,-3,-3,0,-3,0,12,0,0,0", + "weapon_interface": "14", + "requirements": "{0,5}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11397", + "name": "Steel hasta(p+)", + "tradeable": "true", + "grand_exchange_price": "636", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11398", + "name": "Steel hasta(p++)", + "examine": "A steel-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "130", + "high_alchemy": "195", + "grand_exchange_price": "8835", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "12,12,12,0,0,-3,-3,-3,0,-3,0,12,0,0,0", + "weapon_interface": "14", + "requirements": "{0,5}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11399", + "name": "Steel hasta(p++)", + "tradeable": "true", + "grand_exchange_price": "8835", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11400", + "name": "Mithril hasta(p)", + "examine": "A mithril-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "440", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,-5,-5,-4,0,-5,0,18,0,0,0", + "weapon_interface": "14", + "requirements": "{0,20}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11401", + "name": "Mithril hasta(p)", + "tradeable": "true", + "grand_exchange_price": "440", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11402", + "name": "Mithril hasta(kp)", + "examine": "A mithril-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "353", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,-5,-5,-4,0,-5,0,18,0,0,0", + "weapon_interface": "14", + "requirements": "{0,20}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11403", + "name": "Mithril hasta(p+)", + "examine": "A mithril-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "925", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,-5,-5,-4,0,-5,0,18,0,0,0", + "weapon_interface": "14", + "requirements": "{0,20}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11404", + "name": "Mithril hasta(p+)", + "tradeable": "true", + "grand_exchange_price": "925", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11405", + "name": "Mithril hasta(p++)", + "examine": "A mithril-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "338", + "high_alchemy": "507", + "grand_exchange_price": "8711", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "17,17,17,0,0,-5,-5,-4,0,-5,0,18,0,0,0", + "weapon_interface": "14", + "requirements": "{0,20}", + "weight": "1.8", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11406", + "name": "Mithril hasta(p++)", + "tradeable": "true", + "grand_exchange_price": "8711", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11407", + "name": "Adamant hasta(p)", + "examine": "An adamant-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "832", + "high_alchemy": "1248", + "grand_exchange_price": "1154", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "24,24,24,0,0,-6,-7,-5,0,-6,0,28,0,0,0", + "weapon_interface": "14", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11408", + "name": "Adamant hasta(p)", + "tradeable": "true", + "grand_exchange_price": "1154", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11409", + "name": "Adamant hasta(kp)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "24,24,24,0,0,-6,-7,-5,0,-6,0,28,0,0,0", + "weapon_interface": "14", + "requirements": "{0,30}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11410", + "name": "Adamant hasta(p+)", + "examine": "An adamant-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "832", + "high_alchemy": "1248", + "grand_exchange_price": "1639", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "24,24,24,0,0,-6,-7,-5,0,-6,0,28,0,0,0", + "weapon_interface": "14", + "requirements": "{0,30}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11411", + "name": "Adamant hasta(p+)", + "tradeable": "true", + "grand_exchange_price": "1639", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11412", + "name": "Adamant hasta(p++)", + "grand_exchange_price": "9388", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "24,24,24,0,0,-6,-7,-5,0,-6,0,28,0,0,0", + "weapon_interface": "14", + "requirements": "{0,30}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11413", + "name": "Adamant hasta(p++)", + "tradeable": "true", + "grand_exchange_price": "9388", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11414", + "name": "Rune hasta(p)", + "examine": "A rune-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "grand_exchange_price": "12300", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "36,36,36,0,0,-10,-10,-9,0,-10,0,42,0,0,0", + "weapon_interface": "14", + "requirements": "{0,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11415", + "name": "Rune hasta(p)", + "tradeable": "true", + "grand_exchange_price": "12300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11416", + "name": "Rune hasta(kp)", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "bonuses": "36,36,36,0,0,-10,-10,-9,0,-10,0,42,0,0,0", + "weapon_interface": "14", + "requirements": "{0,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11417", + "name": "Rune hasta(p+)", + "examine": "A rune-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "grand_exchange_price": "12200", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "36,36,36,0,0,-10,-10,-9,0,-10,0,42,0,0,0", + "weapon_interface": "14", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11418", + "name": "Rune hasta(p+)", + "tradeable": "true", + "grand_exchange_price": "12200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11419", + "name": "Rune hasta(p++)", + "examine": "A rune-tipped, one-handed hasta.", + "tradeable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "grand_exchange_price": "15500", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "36,36,36,0,0,-10,-10,-9,0,-10,0,42,0,0,0", + "weapon_interface": "14", + "requirements": "{0,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11420", + "name": "Rune hasta(p++)", + "tradeable": "true", + "grand_exchange_price": "15500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11429", + "name": "Attack mix(2)", + "examine": "One/Two dose(s) of fishy attack potion", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "5", + "grand_exchange_price": "20", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11430", + "name": "Attack mix(2)", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11431", + "name": "Attack mix(1)", + "examine": "One/Two dose(s) of fishy attack potion", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "5", + "grand_exchange_price": "19", + "weight": "0.1", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11432", + "name": "Attack mix(1)", + "tradeable": "true", + "grand_exchange_price": "19", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11433", + "name": "Antipoison mix(2)", + "examine": "Two doses of fishy antipoison potion.", + "tradeable": "true", + "low_alchemy": "86", + "high_alchemy": "129", + "grand_exchange_price": "455", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11434", + "name": "Antipoison mix(2)", + "tradeable": "true", + "grand_exchange_price": "455", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11435", + "name": "Antipoison mix(1)", + "examine": "Two doses of fishy antipoison potion.", + "tradeable": "true", + "low_alchemy": "86", + "high_alchemy": "129", + "grand_exchange_price": "608", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11436", + "name": "Antipoison mix(1)", + "tradeable": "true", + "grand_exchange_price": "608", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11437", + "name": "Relicym's mix(2)", + "examine": "2 dose: Two doses of fishy Relicym's balm.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "264", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11438", + "name": "Relicym's mix(2)", + "tradeable": "true", + "grand_exchange_price": "264", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11439", + "name": "Relicym's mix(1)", + "examine": "2 dose: Two doses of fishy Relicym's balm.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "131", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11440", + "name": "Relicym's mix(1)", + "tradeable": "true", + "grand_exchange_price": "131", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11441", + "name": "Strength mix(1)", + "examine": "One/two doses of fishy strength potion.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "grand_exchange_price": "159", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11442", + "name": "Strength mix(1)", + "tradeable": "true", + "grand_exchange_price": "159", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11443", + "name": "Strength mix(2)", + "examine": "One/two doses of fishy strength potion.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "7", + "grand_exchange_price": "164", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11444", + "name": "Strength mix(2)", + "tradeable": "true", + "grand_exchange_price": "164", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11445", + "name": "Combat mix(2)", + "examine": "One/two doses of a fishy Combat potion", + "tradeable": "true", + "low_alchemy": "42", + "high_alchemy": "63", + "grand_exchange_price": "366", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11446", + "name": "Combat mix(2)", + "tradeable": "true", + "grand_exchange_price": "366", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11447", + "name": "Combat mix(1)", + "examine": "One/two doses of a fishy Combat potion", + "tradeable": "true", + "low_alchemy": "42", + "high_alchemy": "63", + "grand_exchange_price": "328", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11448", + "name": "Combat mix(1)", + "tradeable": "true", + "grand_exchange_price": "328", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11449", + "name": "Restore mix(2)", + "examine": "One/two dose(s) of fishy restore potion.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "39", + "grand_exchange_price": "17", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11450", + "name": "Restore mix(2)", + "tradeable": "true", + "grand_exchange_price": "17", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11451", + "name": "Restore mix(1)", + "examine": "One/two dose(s) of fishy restore potion.", + "tradeable": "true", + "low_alchemy": "26", + "high_alchemy": "39", + "grand_exchange_price": "24", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11452", + "name": "Restore mix(1)", + "tradeable": "true", + "grand_exchange_price": "24", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11453", + "name": "Energy mix(2)", + "examine": "One/two doses of fishy energy potion.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "43", + "grand_exchange_price": "248", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11454", + "name": "Energy mix(2)", + "tradeable": "true", + "grand_exchange_price": "248", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11455", + "name": "Energy mix(1)", + "examine": "One/two doses of fishy energy potion.", + "tradeable": "true", + "low_alchemy": "28", + "high_alchemy": "43", + "grand_exchange_price": "212", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11456", + "name": "Energy mix(1)", + "tradeable": "true", + "grand_exchange_price": "212", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11457", + "name": "Defence mix(2)", + "examine": "One/two doses of a fishy defence potion", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "887", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11458", + "name": "Defence mix(2)", + "tradeable": "true", + "grand_exchange_price": "887", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11459", + "name": "Defence mix(1)", + "examine": "One/two doses of a fishy defence potion", + "tradeable": "true", + "low_alchemy": "36", + "high_alchemy": "54", + "grand_exchange_price": "780", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11460", + "name": "Defence mix(1)", + "tradeable": "true", + "grand_exchange_price": "780", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11461", + "name": "Agility mix(2)", + "examine": "X doses of a fishy agility potion", + "tradeable": "true", + "grand_exchange_price": "388", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11462", + "name": "Agility mix(2)", + "tradeable": "true", + "grand_exchange_price": "388", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11463", + "name": "Agility mix(1)", + "examine": "X doses of a fishy agility potion", + "tradeable": "true", + "grand_exchange_price": "459", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11464", + "name": "Agility mix(1)", + "tradeable": "true", + "grand_exchange_price": "459", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11465", + "name": "Prayer mix(2)", + "examine": "One/two dose(s) of a fishy Prayer potion.", + "tradeable": "true", + "low_alchemy": "46", + "high_alchemy": "69", + "grand_exchange_price": "2761", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11466", + "name": "Prayer mix(2)", + "tradeable": "true", + "grand_exchange_price": "2761", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11467", + "name": "Prayer mix(1)", + "examine": "One/two dose(s) of a fishy Prayer potion.", + "tradeable": "true", + "low_alchemy": "46", + "high_alchemy": "69", + "grand_exchange_price": "1857", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11468", + "name": "Prayer mix(1)", + "tradeable": "true", + "grand_exchange_price": "1857", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11469", + "name": "Superattack mix(2)", + "examine": "one/two doses of fishy super attack potion", + "tradeable": "true", + "low_alchemy": "54", + "high_alchemy": "81", + "grand_exchange_price": "375", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11470", + "name": "Superattack mix(2)", + "tradeable": "true", + "grand_exchange_price": "375", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11471", + "name": "Superattack mix(1)", + "examine": "one/two doses of fishy super attack potion", + "tradeable": "true", + "low_alchemy": "54", + "high_alchemy": "81", + "grand_exchange_price": "516", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11472", + "name": "Superattack mix(1)", + "tradeable": "true", + "grand_exchange_price": "516", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11473", + "name": "Anti-p supermix(2)", + "examine": "One/Two dose(s) of fishy super antipoison potion.", + "tradeable": "true", + "low_alchemy": "86", + "high_alchemy": "129", + "grand_exchange_price": "613", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11474", + "name": "Anti-p supermix(2)", + "tradeable": "true", + "grand_exchange_price": "613", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11475", + "name": "Anti-p supermix(1)", + "examine": "One/Two dose(s) of fishy super antipoison potion.", + "tradeable": "true", + "low_alchemy": "86", + "high_alchemy": "129", + "grand_exchange_price": "1119", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11476", + "name": "Anti-p supermix(1)", + "tradeable": "true", + "grand_exchange_price": "1119", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11477", + "name": "Fishing mix(2)", + "examine": "One/Two Doses of fishy fishing potion.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "123", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11478", + "name": "Fishing mix(2)", + "tradeable": "true", + "grand_exchange_price": "123", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11479", + "name": "Fishing mix(1)", + "examine": "One/Two Doses of fishy fishing potion.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "87", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11480", + "name": "Fishing mix(1)", + "tradeable": "true", + "grand_exchange_price": "87", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11481", + "name": "Sup. energy mix(2)", + "examine": "One/Two doses of fishy super energy potion.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "grand_exchange_price": "1062", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11482", + "name": "Sup. energy mix(2)", + "tradeable": "true", + "grand_exchange_price": "1062", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11483", + "name": "Sup. energy mix(1)", + "examine": "One/Two doses of fishy super energy potion.", + "tradeable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "grand_exchange_price": "562", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11484", + "name": "Sup. energy mix(1)", + "tradeable": "true", + "grand_exchange_price": "562", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11485", + "name": "Sup. str. mix(2)", + "examine": "One/Two doses of fishy Super strength potion.", + "tradeable": "true", + "low_alchemy": "66", + "high_alchemy": "99", + "grand_exchange_price": "955", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11486", + "name": "Sup. str. mix(2)", + "tradeable": "true", + "grand_exchange_price": "955", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11487", + "name": "Sup. str. mix(1)", + "examine": "One/Two doses of fishy Super strength potion.", + "tradeable": "true", + "low_alchemy": "66", + "high_alchemy": "99", + "grand_exchange_price": "1040", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11488", + "name": "Sup. str. mix(1)", + "tradeable": "true", + "grand_exchange_price": "1040", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11489", + "name": "Magic ess. mix(2)", + "examine": "One/Two doses of fishy Magic essence potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "808", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11490", + "name": "Magic ess. mix(2)", + "tradeable": "true", + "grand_exchange_price": "808", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11491", + "name": "Magic ess. mix(1)", + "examine": "One/Two doses of fishy Magic essence potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "447", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11492", + "name": "Magic ess. mix(1)", + "tradeable": "true", + "grand_exchange_price": "447", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11493", + "name": "Sup. restore mix(2)", + "examine": "One/Two doses of fishy super restore potion.", + "tradeable": "true", + "low_alchemy": "66", + "high_alchemy": "99", + "grand_exchange_price": "3670", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11494", + "name": "Sup. restore mix(2)", + "tradeable": "true", + "grand_exchange_price": "3670", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11495", + "name": "Sup. restore mix(1)", + "examine": "One/Two doses of fishy super restore potion.", + "tradeable": "true", + "low_alchemy": "66", + "high_alchemy": "99", + "grand_exchange_price": "3104", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11496", + "name": "Sup. restore mix(1)", + "tradeable": "true", + "grand_exchange_price": "3104", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11497", + "name": "Sup. def. mix(2)", + "examine": "One/two doses of fishy super defence potion", + "tradeable": "true", + "low_alchemy": "79", + "high_alchemy": "118", + "grand_exchange_price": "38", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11498", + "name": "Sup. def. mix(2)", + "tradeable": "true", + "grand_exchange_price": "38", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11499", + "name": "Sup. def. mix(1)", + "examine": "One/two doses of fishy super defence potion", + "tradeable": "true", + "low_alchemy": "79", + "high_alchemy": "118", + "grand_exchange_price": "66", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11500", + "name": "Sup. def. mix(1)", + "tradeable": "true", + "grand_exchange_price": "66", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11501", + "name": "Antidote+ mix(2)", + "examine": "One/Two doses of fishy extra strength antidote potion.", + "tradeable": "true", + "grand_exchange_price": "1909", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11502", + "name": "Antidote+ mix(2)", + "tradeable": "true", + "grand_exchange_price": "1909", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11503", + "name": "Antidote+ mix(1)", + "examine": "One/Two doses of fishy extra strength antidote potion.", + "tradeable": "true", + "grand_exchange_price": "1330", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11504", + "name": "Antidote+ mix(1)", + "tradeable": "true", + "grand_exchange_price": "1330", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11505", + "name": "Antifire mix(2)", + "examine": "One/Two dose(s) of fishy anti-fire breath potion.", + "tradeable": "true", + "low_alchemy": "79", + "high_alchemy": "118", + "grand_exchange_price": "2048", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11506", + "name": "Antifire mix(2)", + "tradeable": "true", + "grand_exchange_price": "2048", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11507", + "name": "Antifire mix(1)", + "examine": "One/Two dose(s) of fishy anti-fire breath potion.", + "tradeable": "true", + "low_alchemy": "79", + "high_alchemy": "118", + "grand_exchange_price": "1444", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11508", + "name": "Antifire mix(1)", + "tradeable": "true", + "grand_exchange_price": "1444", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11509", + "name": "Ranging mix(2)", + "examine": "One/Two doses of fishy ranging potion.", + "tradeable": "true", + "low_alchemy": "86", + "high_alchemy": "129", + "grand_exchange_price": "2879", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11510", + "name": "Ranging mix(2)", + "tradeable": "true", + "grand_exchange_price": "2879", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11511", + "name": "Ranging mix(1)", + "examine": "One/Two doses of fishy ranging potion.", + "tradeable": "true", + "low_alchemy": "86", + "high_alchemy": "129", + "grand_exchange_price": "1880", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11512", + "name": "Ranging mix(1)", + "tradeable": "true", + "grand_exchange_price": "1880", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11513", + "name": "Magic mix(2)", + "examine": "One/Two doses of fishy magic potion.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "1022", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11514", + "name": "Magic mix(2)", + "tradeable": "true", + "grand_exchange_price": "1022", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11515", + "name": "Magic mix(1)", + "examine": "One/Two doses of fishy magic potion.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "1323", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11516", + "name": "Magic mix(1)", + "tradeable": "true", + "grand_exchange_price": "1323", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11517", + "name": "Hunting mix(2)", + "examine": "Doses of fishy hunting potion", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "5", + "grand_exchange_price": "146", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11518", + "name": "Hunting mix(2)", + "tradeable": "true", + "grand_exchange_price": "146", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11519", + "name": "Hunting mix(1)", + "examine": "Doses of fishy hunting potion", + "tradeable": "true", + "low_alchemy": "3", + "high_alchemy": "5", + "grand_exchange_price": "87", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11520", + "name": "Hunting mix(1)", + "tradeable": "true", + "grand_exchange_price": "87", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11521", + "name": "Zamorak mix(2)", + "examine": "One/Two doses of fishy Zamorak potion.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "665", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11522", + "name": "Zamorak mix(2)", + "tradeable": "true", + "grand_exchange_price": "665", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11523", + "name": "Zamorak mix(1)", + "examine": "One/Two doses of fishy Zamorak potion.", + "tradeable": "true", + "low_alchemy": "60", + "high_alchemy": "90", + "grand_exchange_price": "339", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11524", + "name": "Zamorak mix(1)", + "tradeable": "true", + "grand_exchange_price": "339", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11525", + "name": "Wimpy feather", + "examine": "More fluff than feather.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "grand_exchange_price": "325", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11640", + "name": "Book of knowledge", + "examine": "Educate yourself.", + "destroy_message": "If you drop this book it will be destroyed. You cannot replace it.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11655", + "name": "Astronomy book", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11656", + "name": "Glassblowing book", + "examine": "A book that explains the art of crafting items from glass.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "1", + "grand_exchange_price": "278", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11657", + "name": "Glassblowing book", + "tradeable": "true", + "grand_exchange_price": "278", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11663", + "name": "Void mage helm", + "examine": "A mage helm from the order of the Void Knights.", + "low_alchemy": "3940", + "high_alchemy": "5910", + "destroy": "true", + "tradeable": "false", + "shop_price": "200", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,6,6,6,6,6,6,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11664", + "name": "Void ranger helm", + "examine": "A ranger helm from the order of the Void Knights", + "tradeable": "false", + "low_alchemy": "3940", + "high_alchemy": "5910", + "shop_price": "200", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,6,6,6,6,6,6,0,0,0,0", + "weight": "3.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11665", + "name": "Void melee helm", + "examine": "A melee helm from the order of the Void Knights.", + "tradeable": "false", + "low_alchemy": "3940", + "high_alchemy": "5910", + "shop_price": "200", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,6,6,6,6,6,6,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11666", + "name": "Void seal(8)", + "tradeable": "false", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,1,1,1,1,1,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11667", + "name": "Void seal(7)", + "tradeable": "false", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,1,1,1,1,1,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11668", + "name": "Void seal(6)", + "tradeable": "false", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,1,1,1,1,1,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11669", + "name": "Void seal(5)", + "tradeable": "false", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,1,1,1,1,1,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11670", + "name": "Void seal(4)", + "tradeable": "false", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,1,1,1,1,1,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11671", + "name": "Void seal(3)", + "tradeable": "false", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,1,1,1,1,1,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11672", + "name": "Void seal(2)", + "tradeable": "false", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,1,1,1,1,1,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11673", + "name": "Void seal(1)", + "tradeable": "false", + "equipment_slot": "2", + "bonuses": "0,0,0,0,0,1,1,1,1,1,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11674", + "name": "Void mage helm", + "examine": "A mage helm from the order of the Void Knights.", + "low_alchemy": "3940", + "high_alchemy": "5910", + "destroy": "true", + "tradeable": "false", + "shop_price": "200", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,6,6,6,6,6,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11675", + "name": "Void ranger helm", + "examine": "A ranger helm from the order of the Void Knights", + "tradeable": "false", + "low_alchemy": "3940", + "high_alchemy": "5910", + "shop_price": "200", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,6,6,6,6,6,0,0,0,0,0", + "weight": "3.6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11676", + "name": "Void melee helm", + "examine": "A melee helm from the order of the Void Knights.", + "tradeable": "false", + "low_alchemy": "3940", + "high_alchemy": "5910", + "shop_price": "200", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,6,6,6,6,6,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11677", + "name": "Explorer's notes", + "examine": "\"Beyond Trollheim\" by Nestor Peregrine.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can find another book in the Keldagrim library.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11678", + "name": "Black knight helm", + "examine": "A black helm, too small for your head", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll need to visit the Sinclair Mansion to get another one.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11679", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11680", + "name": "Address form", + "examine": "A change of address form.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11681", + "name": "Scrap paper", + "examine": "It has something written on it.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11682", + "name": "Hair clip", + "examine": "I could use this to pick the lock.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11686", + "name": "Godsword shards", + "examine": "Godsword shards 1 and 2.Godsword shards 2 and 3.Godsword shards 1 and 3.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "grand_exchange_price": "331300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11687", + "name": "Godsword shards", + "tradeable": "true", + "grand_exchange_price": "331300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11688", + "name": "Godsword shards", + "examine": "Godsword shards 1 and 2.Godsword shards 2 and 3.Godsword shards 1 and 3.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "grand_exchange_price": "342100", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11689", + "name": "Godsword shards", + "tradeable": "true", + "grand_exchange_price": "342100", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11690", + "name": "Godsword blade", + "examine": "The blade for the ultimate weapon.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "grand_exchange_price": "466800", + "weight": "7.5", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11691", + "name": "Godsword blade", + "tradeable": "true", + "grand_exchange_price": "466800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11692", + "name": "Godsword shards", + "examine": "Godsword shards 1 and 2.Godsword shards 2 and 3.Godsword shards 1 and 3.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "grand_exchange_price": "348500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11693", + "name": "Godsword shards", + "tradeable": "true", + "grand_exchange_price": "348500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11694", + "name": "Armadyl godsword", + "examine": "A beautiful, heavy sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "500000", + "high_alchemy": "750000", + "grand_exchange_price": "28000000", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7043", + "turn90ccw_anim": "7044", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,132,80,0,0,0,0,0,0,0,0,132,8,0,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "3846,0,0,0", + "requirements": "{0,75}", + "weight": "10", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11695", + "name": "Armadyl godsword", + "tradeable": "true", + "grand_exchange_price": "28000000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11696", + "name": "Bandos godsword", + "examine": "A brutally heavy sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "500000", + "high_alchemy": "750000", + "grand_exchange_price": "3700000", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7043", + "turn90ccw_anim": "7044", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,132,80,0,0,0,0,0,0,0,0,132,8,0,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "3846,0,0,0", + "requirements": "{0,75}", + "weight": "10", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11697", + "name": "Bandos godsword", + "tradeable": "true", + "grand_exchange_price": "3700000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11698", + "name": "Saradomin godsword", + "examine": "A gracious, heavy sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "500000", + "high_alchemy": "750000", + "grand_exchange_price": "22000000", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7043", + "turn90ccw_anim": "7044", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,132,80,0,0,0,0,0,0,0,0,132,8,0,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "3846,0,0,0", + "requirements": "{0,75}", + "weight": "10", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11699", + "name": "Saradomin godsword", + "tradeable": "true", + "grand_exchange_price": "22000000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11700", + "name": "Zamorak godsword", + "examine": "A terrifying, heavy sword.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "500000", + "high_alchemy": "750000", + "grand_exchange_price": "6100000", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7043", + "turn90ccw_anim": "7044", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,132,80,0,0,0,0,0,0,0,0,132,8,0,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "3846,0,0,0", + "requirements": "{0,75}", + "weight": "10", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11701", + "name": "Zamorak godsword", + "tradeable": "true", + "grand_exchange_price": "6100000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11702", + "name": "Armadyl hilt", + "examine": "Brimming with potential.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "grand_exchange_price": "30600000", + "weight": "2.5", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11703", + "name": "Armadyl hilt", + "tradeable": "true", + "grand_exchange_price": "30600000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11704", + "name": "Bandos hilt", + "examine": "Brimming with potential.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "grand_exchange_price": "3300000", + "weight": "2.5", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11705", + "name": "Bandos hilt", + "tradeable": "true", + "grand_exchange_price": "3300000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11706", + "name": "Saradomin hilt", + "examine": "Brimming with potential.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "grand_exchange_price": "24900000", + "weight": "2.5", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11707", + "name": "Saradomin hilt", + "tradeable": "true", + "grand_exchange_price": "24900000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11708", + "name": "Zamorak hilt", + "examine": "Brimming with potential.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "grand_exchange_price": "6100000", + "weight": "2.5", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11709", + "name": "Zamorak hilt", + "tradeable": "true", + "grand_exchange_price": "6100000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11710", + "name": "Godsword shard 1", + "examine": "Part of the Godsword blade.", + "tradeable": "true", + "low_alchemy": "100000", + "high_alchemy": "150000", + "grand_exchange_price": "150200", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11711", + "name": "Godsword shard 1", + "tradeable": "true", + "grand_exchange_price": "150200", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11712", + "name": "Godsword shard 2", + "examine": "Part of the Godsword blade.", + "tradeable": "true", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "grand_exchange_price": "149100", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11713", + "name": "Godsword shard 2", + "tradeable": "true", + "grand_exchange_price": "149100", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11714", + "name": "Godsword shard 3", + "examine": "Part of the Godsword blade.", + "tradeable": "true", + "low_alchemy": "100000", + "high_alchemy": "150000", + "grand_exchange_price": "149800", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11715", + "name": "Godsword shard 3", + "tradeable": "true", + "grand_exchange_price": "149800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11716", + "name": "Zamorakian spear", + "examine": "An evil spear.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "5400000", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "85,65,65,0,0,13,13,12,0,13,0,75,2,0,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "requirements": "{0,70}", + "weight": "3", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11717", + "name": "Zamorakian spear", + "tradeable": "true", + "grand_exchange_price": "5400000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11718", + "name": "Armadyl helmet", + "examine": "A helmet of great craftmanship.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "grand_exchange_price": "4100000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,5,2", + "bonuses": "-5,-5,-5,-5,10,6,8,10,10,8,12,0,1,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "0.5", + "ge_buy_limit": "1", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11719", + "name": "Armadyl helmet", + "tradeable": "true", + "grand_exchange_price": "4100000", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11720", + "name": "Armadyl chestplate", + "examine": "A chestplate of great craftsmanship", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "24000", + "high_alchemy": "36000", + "grand_exchange_price": "14800000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "0,10,5", + "bonuses": "-7,-7,-7,-15,33,56,48,61,70,57,52,0,1,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "4", + "ge_buy_limit": "1", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11721", + "name": "Armadyl chestplate", + "tradeable": "true", + "grand_exchange_price": "14800000", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11722", + "name": "Armadyl plateskirt", + "examine": "A rune plateskirt in the colours of Armadyl.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "grand_exchange_price": "14800000", + "equipment_slot": "7", + "absorb": "2,0,4", + "bonuses": "-6,-6,-6,-10,20,32,26,34,40,33,25,0,1,0,0", + "requirements": "{1,70}-{4,70}", + "weight": "8", + "ge_buy_limit": "2", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11723", + "name": "Armadyl plateskirt", + "tradeable": "true", + "grand_exchange_price": "14800000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11724", + "name": "Bandos chestplate", + "examine": "A sturdy chestplate.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "106000", + "high_alchemy": "159000", + "grand_exchange_price": "14700000", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-15,-10,98,93,105,-6,133,52,4,1,0,0", + "requirements": "{1,65}", + "weight": "12", + "ge_buy_limit": "1", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11725", + "name": "Bandos chestplate", + "tradeable": "true", + "grand_exchange_price": "14700000", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11726", + "name": "Bandos tassets", + "examine": "A sturdy pair of tassets.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "109000", + "high_alchemy": "163500", + "grand_exchange_price": "15200000", + "equipment_slot": "7", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,71,63,66,-4,93,25,2,1,0,0", + "requirements": "{1,65}", + "weight": "8", + "ge_buy_limit": "1", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11727", + "name": "Bandos tassets", + "tradeable": "true", + "grand_exchange_price": "15200000", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11728", + "name": "Bandos boots", + "examine": "Some sturdy boots", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "10000", + "high_alchemy": "15000", + "grand_exchange_price": "111700", + "equipment_slot": "10", + "bonuses": "0,0,0,-5,-3,17,18,19,0,0,15,0,1,0,0", + "requirements": "{1,65}", + "weight": "6", + "ge_buy_limit": "1", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11729", + "name": "Bandos boots", + "tradeable": "true", + "grand_exchange_price": "111700", + "ge_buy_limit": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11730", + "name": "Saradomin sword", + "examine": "The incredible blade of an Icyene.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "52000", + "high_alchemy": "78000", + "grand_exchange_price": "5300000", + "stand_anim": "7047", + "stand_turn_anim": "7040", + "walk_anim": "7046", + "run_anim": "7039", + "turn180_anim": "7045", + "turn90cw_anim": "7043", + "turn90ccw_anim": "7044", + "render_anim": "124", + "equipment_slot": "3", + "attack_speed": "4", + "bonuses": "0,82,60,0,0,0,0,0,0,0,0,82,2,0,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "attack_anims": "7041,7041,7048,7049", + "defence_anim": "7050", + "attack_audios": "3846,0,0,0", + "requirements": "{0,70}", + "weight": "3", + "ge_buy_limit": "10", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11731", + "name": "Saradomin sword", + "tradeable": "true", + "grand_exchange_price": "5300000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11732", + "name": "Dragon boots", + "examine": "These will protect my feet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "grand_exchange_price": "95400", + "equipment_slot": "10", + "bonuses": "0,0,0,-3,-1,16,17,18,0,0,15,4,0,0,0", + "requirements": "{1,60}", + "weight": "1", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11733", + "name": "Dragon boots", + "tradeable": "true", + "grand_exchange_price": "95400", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11734", + "name": "Knight's notes", + "examine": "A scroll for Sir Tiffy. The wax seal is broken. / Before reading the scroll: A scroll for Sir Tiffy. It is sealed with a wax insignia.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11735", + "name": "Knight's notes", + "examine": "A scroll for Sir Tiffy. The wax seal is broken. / Before reading the scroll: A scroll for Sir Tiffy. It is sealed with a wax insignia.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11736", + "name": "Steam battlestaff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "6800", + "high_alchemy": "10200", + "grand_exchange_price": "231300", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "7,-1,28,10,0,2,3,1,10,0,0,35,0,0,0", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "requirements": "{0,30}-{6,30}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11737", + "name": "Steam battlestaff", + "tradeable": "true", + "grand_exchange_price": "231300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11738", + "name": "Mystic steam staff", + "examine": "It's a slightly magical stick.", + "tradeable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "grand_exchange_price": "267600", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "weapon_interface": "1", + "attack_audios": "2555,0,0,0", + "requirements": "{0,40}-{6,40}", + "weight": "2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11739", + "name": "Mystic steam staff", + "tradeable": "true", + "grand_exchange_price": "267600", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11741", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11743", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11745", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11747", + "name": "A key to a chest", + "examine": "This probably opens a chest in Golrie's caves. (Path of Glophrie)", + "destroy": "true", + "tradeable": "false", + "destroy_message": "There may be another in the chest where you found this.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11748", + "name": "Strongroom key", + "examine": "This opens the door into Golrie's strongroom. (Path of Glophrie)", + "destroy": "true", + "tradeable": "false", + "destroy_message": "There may be another in the chest where you found this.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11749", + "name": "Crystal chime", + "examine": "It makes a sound.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Maybe Brimstail will have another crystal seed you could grow into a chime.", + "equipment_slot": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11750", + "name": "Yewnock's notes", + "examine": "Notes written by Yewnock while copying Oaknock's machine.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "There may be another in the chest where you found this.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11753", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11754", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11755", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11756", + "name": "Varrock armour 1", + "examine": "Varrock Smithing armour.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to get a new set of armour from Rat Burgiss if you destroy this one.", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,15,14,9,-6,14,5,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11757", + "name": "Varrock armour 2", + "examine": "Varrock smithing armour.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to get a new set of armour from Reldo if you destroy this one.", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,21,20,12,-6,20,5,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11758", + "name": "Varrock armour 3", + "examine": "Varrock smithing armour.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to get a new set of armour from Vannaka if you destroy this one.", + "remove_sleeves": "true", + "equipment_slot": "4", + "bonuses": "0,0,0,-30,-10,32,31,24,-6,31,5,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11760", + "name": "Logs", + "examine": "A number of wooden logs.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "shop_price": "4", + "grand_exchange_price": "124", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11761", + "name": "Locked diary", + "examine": "A locked/unlocked diary.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the diary again from Sandy's desk.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11762", + "name": "Unlocked diary", + "examine": "A locked/unlocked diary.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the diary again from Sandy's desk.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11764", + "name": "Foot", + "examine": "A wizard's severed foot. You can tell by the robes.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the foot again from the creatures in the Jade Vine.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11766", + "name": "Left arm", + "examine": "\"A wizard's severed arm. You can tell by the robes.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the arm again from the creatures in the Jade Vine.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11767", + "name": "Right arm", + "examine": "A wizard's severed arm. You can tell by the robes.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the arm again from the creatures in the Jade Vine.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11768", + "name": "Left leg", + "examine": "A wizard's severed leg. You can tell by the robes.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the leg again from the creatures in the Jade Vine.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11769", + "name": "Right leg", + "examine": "A wizard's severed leg. You can tell by the robes.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the leg again from the creatures in the Jade Vine.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11770", + "name": "Root cutting", + "examine": "A root cutting.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11771", + "name": "Root cutting", + "examine": "A root cutting.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11772", + "name": "Root cutting", + "examine": "A root cutting.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11773", + "name": "Root cutting", + "examine": "A root cutting.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11774", + "name": "Root cutting", + "examine": "A root cutting.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11775", + "name": "Wilted cutting", + "examine": "A floppy root cutting. Quite dead.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11776", + "name": "Potted root", + "examine": "A potted root.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11777", + "name": "Sealed pot", + "examine": "This sealed pot contains your vine cutting - hopefully still alive.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get the sealed pot back by visiting Garth, the farmer on Karamja.", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11778", + "name": "Jade vine seed", + "examine": "A large seed.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11780", + "name": "The grim reaper's diary", + "examine": "Surely this holds many a dark tale...", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another from the Grim Reaper's house.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11781", + "name": "Grim's robe", + "examine": "Some of the Grim Reaper's garb.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Another can be found in the Grim Reaper's house.", + "weight": "1", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11782", + "name": "Last will and testament", + "examine": "Someone's Last Will and Testament.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another from the Grim Reaper's house.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11783", + "name": "Human bones", + "examine": "A tasty treat for Muncher.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another from the Grim Reaper's house.", + "weight": "1", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11784", + "name": "Servant's skull", + "examine": "Ooooh spooky!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another from the Grim Reaper's house.", + "weight": "1", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11785", + "name": "Hourglass", + "examine": "There's not much sand left in the top half...", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get a replacement from Diango in Draynor Village.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11786", + "name": "Scythe sharpener", + "examine": "Used to sharpen the blade of a scythe.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Another can be found in the Grim Reaper's house.", + "weight": "1", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11787", + "name": "Human eye", + "examine": "That's gross. Why am I carrying it around?", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another from the Grim Reaper's house.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11788", + "name": "'voice of doom' potion", + "examine": "A 'Voice of Doom' potion, used to deepen your voice.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You'll have to find another from the Grim Reaper's house.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11789", + "name": "Grim reaper hood", + "examine": "Allows me to imitate the harbinger of doom, the stealer of souls, the eternal end...", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You should be able to get another from Diango in Draynor Village.", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11790", + "name": "Grim reaper hood", + "examine": "Allows me to imitate the harbinger of doom, the stealer of souls, the eternal end...", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You should be able to get another from Diango in Draynor Village.", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11791", + "name": "White goblin mail", + "examine": "Armour designed to fit goblins.", + "low_alchemy": "16", + "high_alchemy": "24", + "equipment_slot": "4", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11792", + "name": "Grubfoot", + "examine": "Smaller than the average goblin. After The Chosen Commander: Oldak's new assistant.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11793", + "name": "Zanik", + "examine": "See article", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11794", + "name": "Plain of mud sphere", + "examine": "Oldak's Marvellous Moving-Over-Distance Sphere", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11795", + "name": "Ekeleshuun key", + "examine": "The key you stole from the Ekeleshuun priest.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Ekeleshuun priest probably has a spare.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11796", + "name": "Narogoshuun key", + "examine": "The key you stole from the Narogoshuun priest.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Narogoshuun priest probably has a spare.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11797", + "name": "Huzamogaarb key", + "examine": "The key you stole from the Huzamogaarb priest.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Huzamogaarb priest probably has a spare.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11798", + "name": "Saragorgak key", + "examine": "The key you stole from the Saragorgak priest.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Saragorgak priest probably has a spare.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11799", + "name": "Horogothgar key", + "examine": "The key you stole from the Horogothgar priest.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Horogothgar priest probably has a spare.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11800", + "name": "Yurkolgokh key", + "examine": "The key you stole from the Yurkolgokh priest.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Yurkolgokh priest probably has a spare.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11802", + "name": "Snothead's bone", + "examine": "\"An ancient goblin bone wrapped in fragments of priestly robes.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11803", + "name": "Snailfeet's bone", + "examine": "\"An ancient goblin bone wrapped in fragments of priestly robes.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11804", + "name": "Mosschin's bone", + "examine": "\"An ancient goblin bone wrapped in fragments of priestly robes.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11805", + "name": "Redeyes's bone", + "examine": "\"An ancient goblin bone wrapped in fragments of priestly robes.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11806", + "name": "Strongbones's bone", + "examine": "An ancient goblin bone wrapped in fragments of priestly robes.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11807", + "name": "Pharmakos berries", + "examine": "You can combine these with a toadflax to make a goblin transformation potion.", + "low_alchemy": "4", + "high_alchemy": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11808", + "name": "Whitefish", + "examine": "An ugly albino fish.", + "low_alchemy": "8", + "high_alchemy": "12", + "weight": "0.25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11809", + "name": "Goblin potion (4)", + "examine": "X doses of goblin transmogrification potion.", + "low_alchemy": "5", + "high_alchemy": "7", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11810", + "name": "Goblin potion (3)", + "examine": "X doses of goblin transmogrification potion.", + "low_alchemy": "5", + "high_alchemy": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11811", + "name": "Goblin potion (2)", + "examine": "X doses of goblin transmogrification potion.", + "low_alchemy": "5", + "high_alchemy": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11812", + "name": "Goblin potion (1)", + "examine": "X doses of goblin transmogrification potion.", + "low_alchemy": "5", + "high_alchemy": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11814", + "name": "Bronze armour set (l)", + "examine": "Grand Exchange set containing bronze full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "shop_price": "177", + "grand_exchange_price": "614", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11815", + "name": "Bronze armour set (l)", + "tradeable": "true", + "grand_exchange_price": "614", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11816", + "name": "Bronze armour set (sk)", + "examine": "Grand Exchange set containing bronze full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "shop_price": "177", + "grand_exchange_price": "938", + "bonuses": "0,0,0,-59,-19,27,26,18,-11,25,5,0,0,1,0", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11817", + "name": "Bronze armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "938", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11818", + "name": "Iron armour set (l)", + "examine": "Grand Exchange set containing iron full helm, platebody, legs, and kiteshield.", + "tradeable": "true", + "shop_price": "1022", + "grand_exchange_price": "1830", + "bonuses": "0,0,0,-65,-21,46,44,33,-12,45,7,0,0,0,0", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11819", + "name": "Iron armour set (l)", + "tradeable": "true", + "grand_exchange_price": "1830", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11820", + "name": "Iron armour set (sk)", + "examine": "Grand Exchange set containing iron full helm, platebody, skirt, and kiteshield.", + "tradeable": "true", + "shop_price": "1022", + "grand_exchange_price": "1711", + "bonuses": "0,0,0,-65,-21,46,44,33,-12,45,7,0,0,0,0", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11821", + "name": "Iron armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "1711", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11822", + "name": "Steel armour set (l)", + "examine": "Grand Exchange set containing steel full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "shop_price": "2365", + "grand_exchange_price": "3646", + "bonuses": "0,0,0,-65,-21,71,72,60,-12,70,15,0,0,0,0", + "requirements": "{5,1}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11823", + "name": "Steel armour set (l)", + "tradeable": "true", + "grand_exchange_price": "3646", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11824", + "name": "Steel armour set (sk)", + "examine": "Grand Exchange set containing steel full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "shop_price": "2365", + "grand_exchange_price": "3796", + "bonuses": "0,0,0,-65,-21,71,72,60,-12,70,15,0,0,0,0", + "requirements": "{5,1}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11825", + "name": "Steel armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "3796", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11826", + "name": "Black armour set (l)", + "examine": "Grand Exchange set containing Black full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "shop_price": "11286", + "grand_exchange_price": "18900", + "requirements": "{10,1}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11827", + "name": "Black armour set (l)", + "tradeable": "true", + "grand_exchange_price": "18900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11828", + "name": "Black armour set (sk)", + "examine": "Grand Exchange set containing a black full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "shop_price": "11286", + "grand_exchange_price": "14600", + "absorb": "2,0,4", + "bonuses": "0,0,0,-65,-21,91,92,78,-12,90,27,0,0,0,0", + "requirements": "{10,1}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11829", + "name": "Black armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "14600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11830", + "name": "Mithril armour set (l)", + "examine": "Grand Exchange set containing a mithril full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "shop_price": "15232", + "grand_exchange_price": "8764", + "absorb": "2,0,6", + "bonuses": "0,0,0,-65,-21,101,102,89,-12,97,52,0,0,0,0", + "requirements": "{20,1}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11831", + "name": "Mithril armour set (l)", + "tradeable": "true", + "grand_exchange_price": "8764", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11832", + "name": "Mithril armour set (sk)", + "examine": "Grand Exchange set containing a mithril full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "shop_price": "15232", + "grand_exchange_price": "7829", + "absorb": "2,0,5", + "bonuses": "0,0,0,-65,-21,101,102,89,-12,99,50,0,0,0,0", + "requirements": "{20,1}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11833", + "name": "Mithril armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "7829", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11834", + "name": "Adamant armour set (l)", + "examine": "Grand Exchange set containing an adamant full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "shop_price": "28276", + "grand_exchange_price": "20600", + "absorb": "7,0,15", + "bonuses": "0,0,0,-65,-21,144,146,129,-12,142,76,0,0,0,0", + "requirements": "{1,30}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11835", + "name": "Adamant armour set (l)", + "tradeable": "true", + "grand_exchange_price": "20600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11836", + "name": "Adamant armour set (sk)", + "examine": "Grand Exchange set containing an adamant full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "shop_price": "28276", + "grand_exchange_price": "21500", + "absorb": "7,0,15", + "bonuses": "0,0,0,-65,-21,144,146,129,-12,142,76,0,0,0,0", + "requirements": "{1,30}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11837", + "name": "Adamant armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "21500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11838", + "name": "Rune armour set (l)", + "examine": "Grand Exchange set containing a rune full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "shop_price": "136112", + "grand_exchange_price": "136300", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11839", + "name": "Rune armour set (l)", + "tradeable": "true", + "grand_exchange_price": "136300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11840", + "name": "Rune armour set (sk)", + "examine": "Grand Exchange set containing a rune full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "shop_price": "136112", + "grand_exchange_price": "140300", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11841", + "name": "Rune armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "140300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11842", + "name": "Dragon chain armour set (l)", + "grand_exchange_price": "4800000", + "requirements": "{1,60}", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11843", + "name": "Dragon chain armour set (l)", + "tradeable": "true", + "grand_exchange_price": "4800000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11844", + "name": "Dragon chain armour set (sk)", + "grand_exchange_price": "4600000", + "requirements": "{1,60}", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11845", + "name": "Dragon chain armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "4600000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11846", + "name": "Barrows - ahrim's set", + "examine": "Grand Exchange set containing Ahrim's robetop, robeskirt, hood, and staff.", + "tradeable": "true", + "grand_exchange_price": "3100000", + "requirements": "{0,70}-{1,70}-{6,70}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11847", + "name": "Barrows - ahrim's set", + "tradeable": "true", + "grand_exchange_price": "3100000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11848", + "name": "Barrows - dharok's set", + "examine": "Grand Exchange set containing Dharok's helm, body, legs and greataxe.", + "tradeable": "true", + "grand_exchange_price": "3100000", + "requirements": "{0,70}-{1,70}-{2,70}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11849", + "name": "Barrows - dharok's set", + "tradeable": "true", + "grand_exchange_price": "3100000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11850", + "name": "Barrows - guthan's set", + "examine": "Grand Exchange set containing Guthan's helm, platebody, chainskirt and warspear.", + "tradeable": "true", + "grand_exchange_price": "1600000", + "requirements": "{0,70}-{1,70}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11851", + "name": "Barrows - guthan's set", + "tradeable": "true", + "grand_exchange_price": "1600000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11852", + "name": "Barrows - karil's set", + "examine": "A Grand Exchange set containing Karil's coif, crossbow, leather body, and leather skirt.", + "tradeable": "true", + "grand_exchange_price": "2200000", + "requirements": "{1,70}-{4,70}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11853", + "name": "Barrows - karil's set", + "tradeable": "true", + "grand_exchange_price": "2200000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11854", + "name": "Barrows - torag's set", + "examine": "Grand Exchange set containing Torag's helm, body, legs and hammers.", + "tradeable": "true", + "grand_exchange_price": "1100000", + "requirements": "{0,70}-{1,70}-{2,70}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11855", + "name": "Barrows - torag's set", + "tradeable": "true", + "grand_exchange_price": "1100000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11856", + "name": "Barrows - verac's set", + "examine": "Grand Exchange set containing Verac's helm, brassard, plateskirt and flail.", + "tradeable": "true", + "grand_exchange_price": "1500000", + "requirements": "{0,70}-{1,70}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11857", + "name": "Barrows - verac's set", + "tradeable": "true", + "grand_exchange_price": "1500000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11858", + "name": "Third age melee set", + "examine": "Grand Exchange set containing a helm, body, legs and shield", + "tradeable": "true", + "grand_exchange_price": "388700000", + "requirements": "{1,65}", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11859", + "name": "Third age melee set", + "tradeable": "true", + "grand_exchange_price": "388700000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11860", + "name": "Third age ranger set", + "examine": "Grand Exchange set containing coif, body, chaps and vambraces.", + "tradeable": "true", + "grand_exchange_price": "87500000", + "requirements": "{1,45}-{4,65}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11861", + "name": "Third age ranger set", + "tradeable": "true", + "grand_exchange_price": "87500000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11862", + "name": "Third age mage set", + "examine": "Grand Exchange set containing a body, legs, amulet and hat", + "tradeable": "true", + "grand_exchange_price": "163100000", + "requirements": "{1,30}-{6,65}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11863", + "name": "Third age mage set", + "tradeable": "true", + "grand_exchange_price": "163100000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11864", + "name": "Green dragonhide set", + "examine": "Grand Exchange set containing body, chaps and vambraces.", + "tradeable": "true", + "shop_price": "9000", + "grand_exchange_price": "8932", + "absorb": "0,10,5", + "bonuses": "0,0,0,-40,31,65,50,73,30,62,58,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11865", + "name": "Green dragonhide set", + "tradeable": "true", + "grand_exchange_price": "8932", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11866", + "name": "Blue dragonhide set", + "examine": "Grand Exchange set containing body, chaps and vambraces.", + "tradeable": "true", + "shop_price": "12000", + "grand_exchange_price": "9062", + "requirements": "{1,40}-{4,50}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11867", + "name": "Blue dragonhide set", + "tradeable": "true", + "grand_exchange_price": "9062", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11868", + "name": "Red dragonhide set", + "examine": "Grand Exchange set containing body, chaps and vambraces.", + "tradeable": "true", + "shop_price": "15000", + "grand_exchange_price": "12800", + "requirements": "{1,40}-{4,60}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11869", + "name": "Red dragonhide set", + "tradeable": "true", + "grand_exchange_price": "12800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11870", + "name": "Black dragonhide set", + "examine": "Grand Exchange set containing body, chaps and vambraces.", + "tradeable": "true", + "shop_price": "40000", + "grand_exchange_price": "17600", + "requirements": "{1,40}-{4,70}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11871", + "name": "Black dragonhide set", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11872", + "name": "Mystic robes set", + "examine": "Grand Exchange set containing mystic hat, top, bottoms, gloves, and boots.", + "tradeable": "true", + "shop_price": "169143", + "grand_exchange_price": "163300", + "requirements": "{20,1}-{6,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11873", + "name": "Mystic robes set", + "tradeable": "true", + "grand_exchange_price": "163300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11874", + "name": "Infinity robes set", + "examine": "Grand Exchange set containing hat, top, bottoms, gloves, and boots", + "tradeable": "true", + "grand_exchange_price": "11000000", + "requirements": "{1,25}-{6,50}", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11875", + "name": "Infinity robes set", + "tradeable": "true", + "grand_exchange_price": "11000000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11876", + "name": "Splitbark armour set", + "examine": "Grand Exchange set containing a helm, body, boots, gauntlets and legs.", + "tradeable": "true", + "grand_exchange_price": "107400", + "absorb": "13,6,0", + "bonuses": "0,0,0,24,-21,74,59,86,32,0,74,0,0,0,0", + "requirements": "{1,40}-{6,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11877", + "name": "Splitbark armour set", + "tradeable": "true", + "grand_exchange_price": "107400", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11878", + "name": "Black trimmed armour set (l)", + "examine": "Grand Exchange set containing full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "341200", + "absorb": "2,0,4", + "bonuses": "0,0,0,-65,-21,91,92,77,-12,90,23,0,0,0,0", + "requirements": "{10,1}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11879", + "name": "Black trimmed armour set (l)", + "tradeable": "true", + "grand_exchange_price": "341200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11880", + "name": "Black trimmed armour set (sk)", + "examine": "Grand Exchange set containing full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "331600", + "absorb": "2,0,4", + "bonuses": "0,0,0,-65,-21,91,92,77,-12,90,23,0,0,0,0", + "requirements": "{10,1}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11881", + "name": "Black trimmed armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "331600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11882", + "name": "Black gold-trimmed armour set (l)", + "examine": "Grand Exchange set containing full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "1700000", + "requirements": "{10,1}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11883", + "name": "Black gold-trimmed armour set (l)", + "tradeable": "true", + "grand_exchange_price": "1700000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11884", + "name": "Black gold-trimmed armour set (sk)", + "examine": "Grand Exchange set containing full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "1300000", + "requirements": "{10,1}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11885", + "name": "Black gold-trimmed armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "1300000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11886", + "name": "Adamant trimmed armour set (l)", + "examine": "Grand Exchange set containing a full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "318100", + "requirements": "{1,30}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11887", + "name": "Adamant trimmed armour set (l)", + "tradeable": "true", + "grand_exchange_price": "318100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11888", + "name": "Adamant trimmed armour set (sk)", + "examine": "Grand Exchange set containing a full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "293700", + "requirements": "{1,30}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11889", + "name": "Adamant trimmed armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "293700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11890", + "name": "Adamant gold-trimmed armour set (l)", + "examine": "Grand Exchange set containing full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "949400", + "requirements": "{1,30}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11891", + "name": "Adamant gold-trimmed armour set (l)", + "tradeable": "true", + "grand_exchange_price": "949400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11892", + "name": "Adamant gold-trimmed armour set (sk)", + "examine": "Grand Exchange set containing full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "880500", + "requirements": "{1,30}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11893", + "name": "Adamant gold-trimmed armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "880500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11894", + "name": "Rune trimmed armour set (l)", + "examine": "Grand Exchange set containing a full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "702500", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11895", + "name": "Rune trimmed armour set (l)", + "tradeable": "true", + "grand_exchange_price": "702500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11896", + "name": "Rune trimmed armour set (sk)", + "examine": "Grand Exchange set containing a full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "675400", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11897", + "name": "Rune trimmed armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "675400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11898", + "name": "Rune gold-trimmed armour set (l)", + "examine": "Grand Exchange set containing a full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "1700000", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11899", + "name": "Rune gold-trimmed armour set (l)", + "tradeable": "true", + "grand_exchange_price": "1700000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11900", + "name": "Rune gold-trimmed armour set (sk)", + "examine": "Grand Exchange set containing a full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "1400000", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11901", + "name": "Rune gold-trimmed armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "1400000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11902", + "name": "Enchanted set", + "examine": "Grand Exchange set containing hat, robetops and bottoms", + "tradeable": "true", + "grand_exchange_price": "207200", + "requirements": "{20,1}-{6,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11903", + "name": "Enchanted set", + "tradeable": "true", + "grand_exchange_price": "207200", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11904", + "name": "Trimmed blue wizard set", + "examine": "Grand Exchange set containing hat, robetops and bottoms", + "tradeable": "true", + "grand_exchange_price": "877900", + "weight": "2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11905", + "name": "Trimmed blue wizard set", + "tradeable": "true", + "grand_exchange_price": "877900", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11906", + "name": "Gold-trimmed blue wizard set", + "examine": "Grand Exchange set containing hat, robe top and bottom", + "tradeable": "true", + "grand_exchange_price": "3100000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11907", + "name": "Gold-trimmed blue wizard set", + "tradeable": "true", + "grand_exchange_price": "3100000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11908", + "name": "Trimmed leather armour set", + "examine": "Grand Exchange set containing body and chaps", + "tradeable": "true", + "grand_exchange_price": "85100", + "requirements": "{20,4}", + "weight": "2.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11909", + "name": "Trimmed leather armour set", + "tradeable": "true", + "grand_exchange_price": "85100", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11910", + "name": "Gold-trimmed leather armour set", + "examine": "Grand Exchange set containing body and chaps", + "tradeable": "true", + "grand_exchange_price": "217200", + "requirements": "{20,4}", + "weight": "2.2", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11911", + "name": "Gold-trimmed leather armour set", + "tradeable": "true", + "grand_exchange_price": "217200", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11912", + "name": "Green d'hide trimmed set", + "examine": "Grand Exchange set containing body and chaps", + "tradeable": "true", + "grand_exchange_price": "371600", + "absorb": "0,10,5", + "bonuses": "0,0,0,-40,31,65,50,73,30,62,58,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11913", + "name": "Green d'hide trimmed set", + "tradeable": "true", + "grand_exchange_price": "371600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11914", + "name": "Green d'hide gold-trimmed set", + "examine": "Grand Exchange set containing body and chaps", + "tradeable": "true", + "grand_exchange_price": "1600000", + "absorb": "0,10,5", + "bonuses": "0,0,0,-40,31,65,50,73,30,62,58,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11915", + "name": "Green d'hide gold-trimmed set", + "tradeable": "true", + "grand_exchange_price": "1600000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11916", + "name": "Blue d'hide trimmed set", + "examine": "Grand Exchange set containing body and chaps", + "tradeable": "true", + "grand_exchange_price": "38300", + "requirements": "{1,40}-{4,50}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11917", + "name": "Blue d'hide trimmed set", + "tradeable": "true", + "grand_exchange_price": "38300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11918", + "name": "Blue d'hide gold-trimmed set", + "examine": "Grand Exchange set containing body and chaps.", + "tradeable": "true", + "grand_exchange_price": "50000", + "requirements": "{1,40}-{4,50}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11919", + "name": "Blue d'hide gold-trimmed set", + "tradeable": "true", + "grand_exchange_price": "50000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11920", + "name": "Green d'hide blessed set", + "examine": "Grand Exchange set containing body, chaps, bracers and coif.", + "tradeable": "true", + "grand_exchange_price": "179500", + "requirements": "{1,40}-{4,70}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11921", + "name": "Green d'hide blessed set", + "tradeable": "true", + "grand_exchange_price": "179500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11922", + "name": "Blue d'hide blessed set", + "examine": "Grand Exchange set containing body, chaps, bracers and coif.", + "tradeable": "true", + "grand_exchange_price": "477500", + "requirements": "{1,40}-{4,70}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11923", + "name": "Blue d'hide blessed set", + "tradeable": "true", + "grand_exchange_price": "477500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11924", + "name": "Red d'hide blessed set", + "examine": "Grand Exchange set containing body, chaps, bracers and coif.", + "tradeable": "true", + "grand_exchange_price": "585300", + "requirements": "{1,40}-{4,70}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11925", + "name": "Red d'hide blessed set", + "tradeable": "true", + "grand_exchange_price": "585300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11926", + "name": "Guthix armour set (l)", + "examine": "Grand Exchange set containing full helm, platebody, legs and shield.", + "tradeable": "true", + "grand_exchange_price": "1100000", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11927", + "name": "Guthix armour set (l)", + "tradeable": "true", + "grand_exchange_price": "1100000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11928", + "name": "Saradomin armour set (l)", + "examine": "Grand Exchange set containing full helm, platebody, legs and kiteshield", + "tradeable": "true", + "grand_exchange_price": "4000000", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11929", + "name": "Saradomin armour set (l)", + "tradeable": "true", + "grand_exchange_price": "4000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11930", + "name": "Zamorak armour set (l)", + "examine": "Grand Exchange set containing full helm, platebody, legs and kiteshield", + "tradeable": "true", + "grand_exchange_price": "2300000", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11931", + "name": "Zamorak armour set (l)", + "tradeable": "true", + "grand_exchange_price": "2300000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11932", + "name": "Guthix armour set (sk)", + "examine": "Grand Exchange set containing full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "1000000", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11933", + "name": "Guthix armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "1000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11934", + "name": "Saradomin armour set (sk)", + "examine": "Grand Exchange set containing full helm, platebody, skirt and kiteshield", + "tradeable": "true", + "grand_exchange_price": "3600000", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11935", + "name": "Saradomin armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "3600000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11936", + "name": "Zamorak armour set (sk)", + "examine": "Grand Exchange set containing a full helm, platebody, skirt and kiteshield", + "tradeable": "true", + "grand_exchange_price": "2000000", + "absorb": "9,0,20", + "bonuses": "0,0,0,-65,-21,207,209,192,-12,205,102,0,0,0,0", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11937", + "name": "Zamorak armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "2000000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11938", + "name": "Gilded armour set (l)", + "examine": "Grand Exchange set containing a full helm, platebody, legs and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "5900000", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11939", + "name": "Gilded armour set (l)", + "tradeable": "true", + "grand_exchange_price": "5900000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11940", + "name": "Gilded armour set (sk)", + "examine": "Grand Exchange set containing a full helm, platebody, skirt and kiteshield.", + "tradeable": "true", + "grand_exchange_price": "4300000", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11941", + "name": "Gilded armour set (sk)", + "tradeable": "true", + "grand_exchange_price": "4300000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11942", + "name": "Rockshell armour set", + "examine": "Grand Exchange set containing helm, platebody, legs, boots and gloves", + "tradeable": "true", + "grand_exchange_price": "145000", + "requirements": "{1,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11943", + "name": "Rockshell armour set", + "tradeable": "true", + "grand_exchange_price": "145000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11944", + "name": "Spined armour set", + "examine": "Grand Exchange set containing helm, body, chaps, boots and gloves", + "tradeable": "true", + "grand_exchange_price": "94500", + "absorb": "0,13,6", + "bonuses": "-6,-6,-6,-31,29,68,56,78,34,62,47,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11945", + "name": "Spined armour set", + "tradeable": "true", + "grand_exchange_price": "94500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11946", + "name": "Skeletal armour set", + "examine": "Grand Exchange set containing helm, top, bottoms, boots and gloves", + "tradeable": "true", + "grand_exchange_price": "145200", + "requirements": "{1,40}-{6,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11947", + "name": "Skeletal armour set", + "tradeable": "true", + "grand_exchange_price": "145200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11949", + "name": "Snow globe", + "examine": "A tiny model of Lumbridge Castle inside a glass dome.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from Diango in Draynor Village.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11950", + "name": "Snow globe", + "examine": "A tiny model of Lumbridge Castle inside a glass dome.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from Diango in Draynor Village.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11951", + "name": "Snowball", + "examine": "Made from snow. / It's a ball of snow! Uncanny. / How did this not melt in the box?", + "equipment_slot": "3", + "attack_speed": "4", + "weapon_interface": "18", + "attack_anims": "5063", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11952", + "name": "Ice sword", + "examine": "Add this to a snowman to make a snow warrior.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from a snow imp.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11953", + "name": "Winter staff", + "examine": "Add this to a snowman to make a snow mage.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from a snow imp.", + "attack_audios": "2555,0,0,0", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11954", + "name": "Holly bow", + "examine": "Add this to a snowman to make a snow ranger.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from a snow imp.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11955", + "name": "Barbarian snowman hat", + "examine": "Add this to a snowman to make a barbarian snowman.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from a snow imp.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11956", + "name": "Dragon snowman hat", + "examine": "It's actually made of cardboard, but it looks like a dragon full helm.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from a snow imp.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11957", + "name": "Dwarf snowman hat", + "examine": "Use this to make your snowman look like a dwarf.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from a snow imp.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11958", + "name": "Pirate snowman hat", + "examine": "Arr! Shiver me snowman!", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Talk to a snow imp to get another.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11959", + "name": "Snowman top hat", + "examine": "The most traditional snowman hat.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another from a snow imp.", + "bankable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11960", + "name": "Light mystic robes set", + "examine": "Grand Exchange set containing hat, top, bottoms, gloves, and boots", + "tradeable": "true", + "shop_price": "215431", + "grand_exchange_price": "487300", + "requirements": "{20,1}-{6,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11961", + "name": "Light mystic robes set", + "tradeable": "true", + "grand_exchange_price": "487300", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11962", + "name": "Dark mystic robes set", + "examine": "Grand Exchange set containing hat, top, bottoms, gloves, and boots", + "tradeable": "true", + "shop_price": "228541", + "grand_exchange_price": "294000", + "requirements": "{20,1}-{6,40}", + "weight": "2.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11963", + "name": "Dark mystic robes set", + "tradeable": "true", + "grand_exchange_price": "294000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11964", + "name": "Raven egg", + "examine": "I can hatch this in an incubator.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11965", + "name": "Vulture egg", + "examine": "I can hatch this in an incubator.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11966", + "name": "Bird's nest", + "examine": "Full: ", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11967", + "name": "Dwarf cannon set", + "examine": "Grand Exchange set containing cannon base, stand, barrels and furnace.", + "tradeable": "true", + "shop_price": "750000", + "grand_exchange_price": "718900", + "weight": "2.2", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11968", + "name": "Dwarf cannon set", + "tradeable": "true", + "grand_exchange_price": "718900", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11969", + "name": "Enchanted water tiara", + "examine": "A water tiara infused with water runes. Protects from the hot desert sun.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "If I destroy this it will disintegrate into its component parts and drop to the floor.", + "equipment_slot": "0", + "bonuses": "0,0,0,2,0,5,5,5,3,3,0,0,2,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11970", + "name": "Smelly crate", + "examine": "A crate full of distressed gear.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can obtain and fill another one from the archaeologist near Sophanem.", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11972", + "name": "Empty crate", + "examine": "An empty crate, ready for bronze gear.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11973", + "name": "Scabaras research", + "examine": "A book of research on Scabarite history.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can obtain another one from the archaeologist near Sophanem.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11974", + "name": "Artefact receipt", + "examine": "Issued by Simon Templeton.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can obtain another one from Simon Templeton.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11975", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11976", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11977", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11978", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11979", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11980", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11981", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11982", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11983", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11984", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11985", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11986", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11987", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11988", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11989", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11990", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11991", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11992", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11993", + "name": "Scabarite notes", + "examine": "See article", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can loot another one from the monsters in the areas east of Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11994", + "name": "Scabarite key", + "examine": "Newly made, but to an ancient pattern. (Dealing with Scabaras)", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can obtain another one from the archaeologists near Sophanem.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11995", + "name": "Oxidised dagger", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze dagger.", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11996", + "name": "Oxidised medium helm", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11997", + "name": "Oxidised sword", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze sword.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11998", + "name": "Oxidised scimitar", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze scimitar.", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "attack_audios": "2500,0,2517,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "11999", + "name": "Oxidised longsword", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze longsword.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12000", + "name": "Oxidised full helm", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze full helmet.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12001", + "name": "Oxidised square shield", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze square shield.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12002", + "name": "Oxidised chainbody", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze chainbody.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12003", + "name": "Oxidised kiteshield", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze kiteshield.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12004", + "name": "Oxidised two-handed sword", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze two", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12005", + "name": "Oxidised platelegs", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on some bronze platelegs.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12006", + "name": "Oxidised plateskirt", + "examine": "It has been oxidised.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "I can make another one by using camel dung on a bronze plateskirt.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12007", + "name": "Spirit terrorbird pouch", + "low_alchemy": "289", + "high_alchemy": "434", + "grand_exchange_price": "330", + "requirements": "{23,52}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12008", + "name": "Spirit terrorbird pouch", + "tradeable": "true", + "low_alchemy": "289", + "high_alchemy": "434", + "grand_exchange_price": "330", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12009", + "name": "Granite crab pouch", + "low_alchemy": "239", + "high_alchemy": "359", + "grand_exchange_price": "239", + "requirements": "{16,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12010", + "name": "Granite crab pouch", + "tradeable": "true", + "low_alchemy": "239", + "high_alchemy": "359", + "grand_exchange_price": "239", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12011", + "name": "Praying mantis pouch", + "low_alchemy": "1849", + "high_alchemy": "2774", + "grand_exchange_price": "2918", + "requirements": "{23,75}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12012", + "name": "Praying mantis pouch", + "tradeable": "true", + "low_alchemy": "1849", + "high_alchemy": "2774", + "grand_exchange_price": "2918", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12013", + "name": "Giant ent pouch", + "low_alchemy": "1409", + "high_alchemy": "2114", + "grand_exchange_price": "2167", + "requirements": "{23,78}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12014", + "name": "Giant ent pouch", + "tradeable": "true", + "low_alchemy": "1409", + "high_alchemy": "2114", + "grand_exchange_price": "2167", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12015", + "name": "Spirit cobra pouch", + "low_alchemy": "1329", + "high_alchemy": "1994", + "grand_exchange_price": "2018", + "requirements": "{23,63}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12016", + "name": "Spirit cobra pouch", + "tradeable": "true", + "low_alchemy": "1329", + "high_alchemy": "1994", + "grand_exchange_price": "2018", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12017", + "name": "Spirit dagannoth pouch", + "low_alchemy": "179", + "high_alchemy": "269", + "grand_exchange_price": "121", + "requirements": "{23,83}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12018", + "name": "Spirit dagannoth pouch", + "tradeable": "true", + "low_alchemy": "179", + "high_alchemy": "269", + "grand_exchange_price": "121", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12019", + "name": "Thorny snail pouch", + "low_alchemy": "259", + "high_alchemy": "389", + "grand_exchange_price": "248", + "requirements": "{13,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12020", + "name": "Thorny snail pouch", + "tradeable": "true", + "low_alchemy": "259", + "high_alchemy": "389", + "grand_exchange_price": "248", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12021", + "name": "Beaver pouch", + "low_alchemy": "889", + "high_alchemy": "1334", + "grand_exchange_price": "1268", + "requirements": "{23,33}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12022", + "name": "Beaver pouch", + "tradeable": "true", + "low_alchemy": "889", + "high_alchemy": "1334", + "grand_exchange_price": "1268", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12023", + "name": "Karam. overlord pouch", + "low_alchemy": "1609", + "high_alchemy": "2414", + "grand_exchange_price": "2520", + "requirements": "{23,58}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12024", + "name": "Karam. overlord pouch", + "tradeable": "true", + "low_alchemy": "1609", + "high_alchemy": "2414", + "grand_exchange_price": "2520", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12025", + "name": "Hydra pouch", + "low_alchemy": "1449", + "high_alchemy": "2174", + "grand_exchange_price": "2235", + "requirements": "{23,80}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12026", + "name": "Hydra pouch", + "tradeable": "true", + "low_alchemy": "1449", + "high_alchemy": "2174", + "grand_exchange_price": "2235", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12027", + "name": "Spirit jelly pouch", + "low_alchemy": "1679", + "high_alchemy": "2519", + "grand_exchange_price": "2641", + "requirements": "{23,55}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12028", + "name": "Spirit jelly pouch", + "tradeable": "true", + "low_alchemy": "1679", + "high_alchemy": "2519", + "grand_exchange_price": "2641", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12029", + "name": "Bunyip pouch", + "low_alchemy": "1269", + "high_alchemy": "1904", + "grand_exchange_price": "3506", + "requirements": "{23,68}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12030", + "name": "Bunyip pouch", + "tradeable": "true", + "low_alchemy": "1269", + "high_alchemy": "1904", + "grand_exchange_price": "3506", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12031", + "name": "War tortoise pouch", + "low_alchemy": "179", + "high_alchemy": "269", + "grand_exchange_price": "13200", + "requirements": "{23,67}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12032", + "name": "War tortoise pouch", + "tradeable": "true", + "low_alchemy": "179", + "high_alchemy": "269", + "grand_exchange_price": "13200", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12033", + "name": "Fruit bat pouch", + "low_alchemy": "1469", + "high_alchemy": "2204", + "grand_exchange_price": "2269", + "requirements": "{23,69}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12034", + "name": "Fruit bat pouch", + "tradeable": "true", + "low_alchemy": "1469", + "high_alchemy": "2204", + "grand_exchange_price": "2269", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12035", + "name": "Abyssal parasite pouch", + "low_alchemy": "1229", + "high_alchemy": "1844", + "grand_exchange_price": "4004", + "requirements": "{23,54}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12036", + "name": "Abyssal parasite pouch", + "tradeable": "true", + "low_alchemy": "1229", + "high_alchemy": "1844", + "grand_exchange_price": "4004", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12037", + "name": "Abyssal lurker pouch", + "low_alchemy": "1359", + "high_alchemy": "2039", + "grand_exchange_price": "5660", + "requirements": "{23,62}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12038", + "name": "Abyssal lurker pouch", + "tradeable": "true", + "low_alchemy": "1359", + "high_alchemy": "2039", + "grand_exchange_price": "5660", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12039", + "name": "Unicorn stallion pouch", + "low_alchemy": "1569", + "high_alchemy": "2354", + "grand_exchange_price": "2439", + "requirements": "{23,88}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12040", + "name": "Unicorn stallion pouch", + "tradeable": "true", + "low_alchemy": "1569", + "high_alchemy": "2354", + "grand_exchange_price": "2439", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12041", + "name": "Magpie pouch", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1559", + "requirements": "{23,47}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12042", + "name": "Magpie pouch", + "tradeable": "true", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1559", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12043", + "name": "Dreadfowl pouch", + "low_alchemy": "249", + "high_alchemy": "374", + "grand_exchange_price": "258", + "requirements": "{4,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12044", + "name": "Dreadfowl pouch", + "tradeable": "true", + "low_alchemy": "249", + "high_alchemy": "374", + "grand_exchange_price": "258", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12045", + "name": "Stranger plant pouch", + "low_alchemy": "1449", + "high_alchemy": "2174", + "grand_exchange_price": "2216", + "requirements": "{23,64}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12046", + "name": "Stranger plant pouch", + "tradeable": "true", + "low_alchemy": "1449", + "high_alchemy": "2174", + "grand_exchange_price": "2216", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12047", + "name": "Spirit wolf pouch", + "low_alchemy": "239", + "high_alchemy": "359", + "grand_exchange_price": "301", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12048", + "name": "Spirit wolf pouch", + "tradeable": "true", + "low_alchemy": "239", + "high_alchemy": "359", + "grand_exchange_price": "301", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12049", + "name": "Desert wyrm pouch", + "low_alchemy": "619", + "high_alchemy": "929", + "grand_exchange_price": "808", + "requirements": "{18,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12050", + "name": "Desert wyrm pouch", + "tradeable": "true", + "low_alchemy": "619", + "high_alchemy": "929", + "grand_exchange_price": "808", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12051", + "name": "Evil turnip pouch", + "low_alchemy": "1209", + "high_alchemy": "1814", + "grand_exchange_price": "1812", + "requirements": "{23,42}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12052", + "name": "Evil turnip pouch", + "tradeable": "true", + "low_alchemy": "1209", + "high_alchemy": "1814", + "grand_exchange_price": "1812", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12053", + "name": "Vampire bat pouch", + "low_alchemy": "979", + "high_alchemy": "1469", + "grand_exchange_price": "1416", + "requirements": "{23,31}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12054", + "name": "Vampire bat pouch", + "tradeable": "true", + "low_alchemy": "979", + "high_alchemy": "1469", + "grand_exchange_price": "1416", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12055", + "name": "Spirit scorpion pouch", + "low_alchemy": "739", + "high_alchemy": "1109", + "grand_exchange_price": "992", + "requirements": "{19,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12056", + "name": "Spirit scorpion pouch", + "tradeable": "true", + "low_alchemy": "739", + "high_alchemy": "1109", + "grand_exchange_price": "992", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12057", + "name": "Arctic bear pouch", + "low_alchemy": "309", + "high_alchemy": "464", + "grand_exchange_price": "332", + "requirements": "{23,71}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12058", + "name": "Arctic bear pouch", + "tradeable": "true", + "low_alchemy": "309", + "high_alchemy": "464", + "grand_exchange_price": "332", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12059", + "name": "Spirit spider pouch", + "low_alchemy": "249", + "high_alchemy": "374", + "grand_exchange_price": "2225", + "requirements": "{10,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12060", + "name": "Spirit spider pouch", + "tradeable": "true", + "low_alchemy": "249", + "high_alchemy": "374", + "grand_exchange_price": "2225", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12061", + "name": "Bloated leech pouch", + "low_alchemy": "1339", + "high_alchemy": "2009", + "grand_exchange_price": "2045", + "requirements": "{23,49}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12062", + "name": "Bloated leech pouch", + "tradeable": "true", + "low_alchemy": "1339", + "high_alchemy": "2009", + "grand_exchange_price": "2045", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12063", + "name": "Spirit kalphite pouch", + "low_alchemy": "679", + "high_alchemy": "1019", + "grand_exchange_price": "3746", + "requirements": "{23,25}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12064", + "name": "Spirit kalphite pouch", + "tradeable": "true", + "low_alchemy": "679", + "high_alchemy": "1019", + "grand_exchange_price": "3746", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12065", + "name": "Honey badger pouch", + "low_alchemy": "1009", + "high_alchemy": "1514", + "grand_exchange_price": "1470", + "requirements": "{23,32}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12066", + "name": "Honey badger pouch", + "tradeable": "true", + "low_alchemy": "1009", + "high_alchemy": "1514", + "grand_exchange_price": "1470", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12067", + "name": "Albino rat pouch", + "low_alchemy": "919", + "high_alchemy": "1379", + "grand_exchange_price": "1578", + "requirements": "{23,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12068", + "name": "Albino rat pouch", + "tradeable": "true", + "low_alchemy": "919", + "high_alchemy": "1379", + "grand_exchange_price": "1578", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12069", + "name": "Granite lobster pouch", + "low_alchemy": "1829", + "high_alchemy": "2744", + "grand_exchange_price": "2924", + "requirements": "{23,74}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12070", + "name": "Granite lobster pouch", + "tradeable": "true", + "low_alchemy": "1829", + "high_alchemy": "2744", + "grand_exchange_price": "2924", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12071", + "name": "Macaw pouch", + "low_alchemy": "949", + "high_alchemy": "1424", + "grand_exchange_price": "1375", + "requirements": "{23,41}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12072", + "name": "Macaw pouch", + "tradeable": "true", + "low_alchemy": "949", + "high_alchemy": "1424", + "grand_exchange_price": "1375", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12073", + "name": "Bronze minotaur pouch", + "low_alchemy": "1189", + "high_alchemy": "1784", + "grand_exchange_price": "1804", + "requirements": "{23,36}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12074", + "name": "Bronze minotaur pouch", + "tradeable": "true", + "low_alchemy": "1189", + "high_alchemy": "1784", + "grand_exchange_price": "1804", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12075", + "name": "Iron minotaur pouch", + "low_alchemy": "1419", + "high_alchemy": "2129", + "grand_exchange_price": "2216", + "requirements": "{23,46}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12076", + "name": "Iron minotaur pouch", + "tradeable": "true", + "low_alchemy": "1419", + "high_alchemy": "2129", + "grand_exchange_price": "2216", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12077", + "name": "Steel minotaur pouch", + "low_alchemy": "1579", + "high_alchemy": "2369", + "grand_exchange_price": "2529", + "requirements": "{23,56}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12078", + "name": "Steel minotaur pouch", + "tradeable": "true", + "low_alchemy": "1579", + "high_alchemy": "2369", + "grand_exchange_price": "2529", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12079", + "name": "Mithril minotaur pouch", + "low_alchemy": "1689", + "high_alchemy": "2534", + "grand_exchange_price": "2666", + "requirements": "{23,66}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12080", + "name": "Mithril minotaur pouch", + "tradeable": "true", + "low_alchemy": "1689", + "high_alchemy": "2534", + "grand_exchange_price": "2666", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12081", + "name": "Adamant minotaur pouch", + "low_alchemy": "1609", + "high_alchemy": "2414", + "grand_exchange_price": "2520", + "requirements": "{23,76}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12082", + "name": "Adamant minotaur pouch", + "tradeable": "true", + "low_alchemy": "1609", + "high_alchemy": "2414", + "grand_exchange_price": "2520", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12083", + "name": "Rune minotaur pouch", + "low_alchemy": "179", + "high_alchemy": "269", + "grand_exchange_price": "373", + "requirements": "{23,86}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12084", + "name": "Rune minotaur pouch", + "tradeable": "true", + "low_alchemy": "179", + "high_alchemy": "269", + "grand_exchange_price": "373", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12085", + "name": "Smoke devil pouch", + "low_alchemy": "1579", + "high_alchemy": "2369", + "grand_exchange_price": "2468", + "requirements": "{23,61}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12086", + "name": "Smoke devil pouch", + "tradeable": "true", + "low_alchemy": "1579", + "high_alchemy": "2369", + "grand_exchange_price": "2468", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12087", + "name": "Bull ant pouch", + "low_alchemy": "279", + "high_alchemy": "419", + "grand_exchange_price": "319", + "requirements": "{23,40}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12088", + "name": "Bull ant pouch", + "tradeable": "true", + "low_alchemy": "279", + "high_alchemy": "419", + "grand_exchange_price": "319", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12089", + "name": "Wolpertinger pouch", + "low_alchemy": "2199", + "high_alchemy": "3299", + "grand_exchange_price": "3625", + "requirements": "{23,92}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12090", + "name": "Wolpertinger pouch", + "tradeable": "true", + "low_alchemy": "2199", + "high_alchemy": "3299", + "grand_exchange_price": "3625", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12091", + "name": "Compost mound pouch", + "low_alchemy": "639", + "high_alchemy": "959", + "grand_exchange_price": "906", + "requirements": "{23,28}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12092", + "name": "Compost mound pouch", + "tradeable": "true", + "low_alchemy": "639", + "high_alchemy": "959", + "grand_exchange_price": "906", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12093", + "name": "Pack yak pouch", + "low_alchemy": "2279", + "high_alchemy": "3419", + "grand_exchange_price": "3696", + "requirements": "{23,96}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12094", + "name": "Pack yak pouch", + "tradeable": "true", + "low_alchemy": "2279", + "high_alchemy": "3419", + "grand_exchange_price": "3696", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12095", + "name": "Sp. cockatrice pouch", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1514", + "requirements": "{23,43}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12096", + "name": "Sp. cockatrice pouch", + "tradeable": "true", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1514", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12097", + "name": "Sp. guthatrice pouch", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1523", + "requirements": "{23,43}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12098", + "name": "Sp. guthatrice pouch", + "tradeable": "true", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1523", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12099", + "name": "Sp. saratrice pouch", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1492", + "requirements": "{23,43}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12100", + "name": "Sp. saratrice pouch", + "tradeable": "true", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1492", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12101", + "name": "Sp. zamatrice pouch", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1515", + "requirements": "{23,43}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12102", + "name": "Sp. zamatrice pouch", + "tradeable": "true", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1515", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12103", + "name": "Sp. pengatrice pouch", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1531", + "requirements": "{23,43}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12104", + "name": "Sp. pengatrice pouch", + "tradeable": "true", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "1531", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12105", + "name": "Sp. coraxatrice pouch", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "3085", + "requirements": "{23,43}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12106", + "name": "Sp. coraxatrice pouch", + "tradeable": "true", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "3085", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12107", + "name": "Sp. vulatrice pouch", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "3881", + "requirements": "{23,43}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12108", + "name": "Sp. vulatrice pouch", + "tradeable": "true", + "low_alchemy": "1049", + "high_alchemy": "1574", + "grand_exchange_price": "3881", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12109", + "name": "Cockatrice egg", + "examine": "A stripy brown egg.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "1053", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12110", + "name": "Cockatrice egg", + "tradeable": "true", + "grand_exchange_price": "1053", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12111", + "name": "Guthatrice egg", + "examine": "A stripy green egg.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "1171", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12112", + "name": "Guthatrice egg", + "tradeable": "true", + "grand_exchange_price": "1171", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12113", + "name": "Saratrice egg", + "examine": "A stripy blue egg.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "1080", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12114", + "name": "Saratrice egg", + "tradeable": "true", + "grand_exchange_price": "1080", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12115", + "name": "Zamatrice egg", + "examine": "A stripy red egg.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "1154", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12116", + "name": "Zamatrice egg", + "tradeable": "true", + "grand_exchange_price": "1154", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12117", + "name": "Pengatrice egg", + "examine": "A stripy grey egg.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "2676", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12118", + "name": "Pengatrice egg", + "tradeable": "true", + "grand_exchange_price": "2676", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12119", + "name": "Coraxatrice egg", + "examine": "A stripy black egg.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "2865", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12120", + "name": "Coraxatrice egg", + "tradeable": "true", + "grand_exchange_price": "2865", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12121", + "name": "Vulatrice egg", + "examine": "A stripy pink egg.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "18900", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12122", + "name": "Vulatrice egg", + "tradeable": "true", + "grand_exchange_price": "18900", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12123", + "name": "Barker toad pouch", + "low_alchemy": "279", + "high_alchemy": "419", + "grand_exchange_price": "293", + "requirements": "{23,66}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12124", + "name": "Barker toad pouch", + "tradeable": "true", + "low_alchemy": "279", + "high_alchemy": "419", + "grand_exchange_price": "293", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12125", + "name": "Flies", + "examine": "A swarm of little flies.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "97", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12126", + "name": "Flies", + "tradeable": "true", + "grand_exchange_price": "97", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12127", + "name": "Beetle bits", + "examine": "Some beetle bits.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "176", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12128", + "name": "Beetle bits", + "tradeable": "true", + "grand_exchange_price": "176", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12129", + "name": "Ground fishing bait", + "examine": "Good for feeding birds.", + "tradeable": "true", + "grand_exchange_price": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12130", + "name": "Nuts", + "examine": "Mmmm...nuts.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "shop_price": "10", + "grand_exchange_price": "673", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12131", + "name": "Nuts", + "tradeable": "true", + "grand_exchange_price": "673", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12132", + "name": "Truffle", + "examine": "Makes me want to do a truffle shuffle.", + "destroy": "true", + "tradeable": "false", + "weight": "28.928", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12133", + "name": "Truffle", + "tradeable": "true", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12134", + "name": "Evil turnip", + "examine": "An evil turnip.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "6750", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12135", + "name": "Evil turnip", + "tradeable": "true", + "grand_exchange_price": "6750", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12136", + "name": "2/3 evil turnip", + "examine": "An evil turnip.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "133", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12137", + "name": "2/3 evil turnip", + "tradeable": "true", + "grand_exchange_price": "133", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12138", + "name": "1/3 evil turnip", + "examine": "An evil turnip.", + "tradeable": "true", + "low_alchemy": "12", + "high_alchemy": "18", + "grand_exchange_price": "20", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12139", + "name": "1/3 evil turnip", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12140", + "name": "Summoning potion(4)", + "examine": "(X) doses of Summoning potion.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "114", + "grand_exchange_price": "4489", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12141", + "name": "Summoning potion(4)", + "tradeable": "true", + "grand_exchange_price": "4489", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12142", + "name": "Summoning potion(3)", + "examine": "(X) doses of Summoning potion.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "114", + "grand_exchange_price": "3320", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12143", + "name": "Summoning potion(3)", + "tradeable": "true", + "grand_exchange_price": "3320", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12144", + "name": "Summoning potion(2)", + "examine": "(X) doses of Summoning potion.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "114", + "grand_exchange_price": "1671", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12145", + "name": "Summoning potion(2)", + "tradeable": "true", + "grand_exchange_price": "1671", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12146", + "name": "Summoning potion(1)", + "examine": "(X) doses of Summoning potion.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "114", + "grand_exchange_price": "1576", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12147", + "name": "Summoning potion(1)", + "tradeable": "true", + "grand_exchange_price": "1576", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12148", + "name": "Evil turnip seed", + "examine": "Grows into the root-vegetable of all evil.", + "tradeable": "true", + "grand_exchange_price": "68", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12153", + "name": "Carved evil turnip", + "examine": "Utterly terrifying!", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "7101", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12154", + "name": "Carved evil turnip", + "tradeable": "true", + "grand_exchange_price": "7101", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12155", + "name": "Pouch", + "grand_exchange_price": "3", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12156", + "name": "Honeycomb", + "examine": "This is what bees craft.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "393", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12157", + "name": "Honeycomb", + "tradeable": "true", + "grand_exchange_price": "393", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12158", + "name": "Gold charm", + "examine": "A charm used to summon familiars.", + "tradeable": "false", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12159", + "name": "Green charm", + "examine": "A charm used to summon familiars.", + "tradeable": "false", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12160", + "name": "Crimson charm", + "examine": "A charm used to summon familiars.", + "tradeable": "false", + "low_alchemy": "1", + "high_alchemy": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12161", + "name": "Abyssal charm", + "examine": "A charm used to summon familiars", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12162", + "name": "Talon beast charm", + "examine": "A charm used to summon talon beasts.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12163", + "name": "Blue charm", + "examine": "A charm used to summon familiars.", + "tradeable": "false", + "low_alchemy": "1", + "high_alchemy": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12164", + "name": "Ravager charm", + "examine": "A charm needed to summon a Void ravager.", + "tradeable": "false", + "shop_price": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12165", + "name": "Shifter charm", + "examine": "A charm needed to summon a Void shifter.", + "tradeable": "false", + "shop_price": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12166", + "name": "Spinner charm", + "examine": "A charm needed to summon a Void Spinner.", + "tradeable": "false", + "shop_price": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12167", + "name": "Torcher charm", + "examine": "A charm needed to summon a Void torcher.", + "tradeable": "false", + "shop_price": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12168", + "name": "Obsidian charm", + "examine": "A charm used to summon familiars.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12169", + "name": "Summoning cape", + "examine": "The cape worn by master summoners.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12170", + "name": "Summoning cape(t)", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,4,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12171", + "name": "Summoning hood", + "examine": "Summoning skillcape hood.", + "shop_price": "99000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12172", + "name": "Clean spirit weed", + "examine": "A fresh herb.", + "tradeable": "true", + "low_alchemy": "9", + "high_alchemy": "14", + "grand_exchange_price": "3597", + "weight": "1", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12173", + "name": "Clean spirit weed", + "tradeable": "true", + "grand_exchange_price": "3597", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12174", + "name": "Grimy spirit weed", + "examine": "I need to clean this herb before I can use it.", + "tradeable": "true", + "grand_exchange_price": "3634", + "requirements": "{15,35}", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12175", + "name": "Grimy spirit weed", + "tradeable": "true", + "grand_exchange_price": "3634", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12176", + "name": "Spirit weed seed", + "examine": "A seed for spirit weed.", + "tradeable": "true", + "grand_exchange_price": "698", + "requirements": "{19,36}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12181", + "name": "Spirit weed potion(unf)", + "examine": "I need another ingredient to finish this spirit weed potion.", + "tradeable": "true", + "low_alchemy": "9", + "high_alchemy": "13", + "grand_exchange_price": "2963", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12182", + "name": "Spirit weed potion(unf)", + "tradeable": "true", + "grand_exchange_price": "2963", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12183", + "name": "Spirit shards", + "examine": "Shards of an obelisk.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "25", + "grand_exchange_price": "24", + "ge_buy_limit": "10000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12184", + "name": "Gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12185", + "name": "Saradomin owl", + "examine": "Chick: A fluffy chick.Bird: Lovely blue plumage.Owl: A fantastic saradomin owl.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12186", + "name": "Zamorak hawk", + "examine": "Chick: A fluffy chick.Bird: Lovely red plumage.Hawk: A stately zamorak hawk.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12187", + "name": "Guthix raptor", + "examine": "Chick: A fluffy chick.Bird: Lovely green plumage.Raptor: An impressive Guthix raptor.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12190", + "name": "Vulture", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12191", + "name": "Terrier puppy", + "examine": "A hyperactive little puppy. (Puppy)(Adult)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12192", + "name": "Greyhound puppy", + "examine": "This is one fast little pooch. (Puppy)An aerodynamic doggy. (Adult)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12193", + "name": "Labrador puppy", + "examine": "Puppy - Soft but strong... and cute.Adult - My most faithful friend.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12194", + "name": "Dalmatian puppy", + "examine": "Now, if only I could find another hundred... (Puppy)A purebred doggy. (Adult)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12195", + "name": "Sheepdog puppy", + "examine": "This little puppy is very quiet. (Puppy)Come by! Come by! (Adult)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12196", + "name": "Bulldog puppy", + "examine": "One proud little puppy. (Puppy)Looks like it's chewing a wasp. (Adult)", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12197", + "name": "Dragon hatchling", + "examine": "(hatchling) A hatchling <dragon colour> dragon.(baby) A bigger baby <colour> dragon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12198", + "name": "Baby giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12199", + "name": "Baby raccoon", + "examine": "(Baby) A stripy little baby raccoon.(Adult) He can run with us.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12200", + "name": "Squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12203", + "name": "Chameleon", + "examine": "It's a colour-coordinated lizard!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12204", + "name": "Antlers", + "examine": "Doors could be a problem, wearing these...", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "grand_exchange_price": "40", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,8,0,0,0,0", + "requirements": "{23,10}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12205", + "name": "Antlers", + "tradeable": "true", + "grand_exchange_price": "40", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12206", + "name": "Antlers (charged)", + "examine": "Doors could be a problem, wearing these...", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "grand_exchange_price": "50", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,8,0,0,0,0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12207", + "name": "Lizard skull", + "examine": "It's a little smelly in there.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "254", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,1,2,3,4,2,3,12,0,0,0,0", + "requirements": "{23,30}", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12208", + "name": "Lizard skull", + "tradeable": "true", + "grand_exchange_price": "254", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12209", + "name": "Lizard skull (charged)", + "examine": "It's a little smelly in there.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "211", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,0,1,2,3,4,2,3,12,0,0,0,0", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12210", + "name": "Feather headdress", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "234", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "requirements": "{4,50}-{23,20}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12211", + "name": "Feather headdress", + "tradeable": "true", + "grand_exchange_price": "234", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12212", + "name": "Feather headdress (charged)", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "107", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12213", + "name": "Feather headdress", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "662", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "requirements": "{4,50}-{23,20}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12214", + "name": "Feather headdress", + "tradeable": "true", + "grand_exchange_price": "662", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12215", + "name": "Feather headdress (charged)", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "107", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12216", + "name": "Feather headdress", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "90", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "requirements": "{4,50}-{23,20}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12217", + "name": "Feather headdress", + "tradeable": "true", + "grand_exchange_price": "90", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12218", + "name": "Feather headdress (charged)", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "107", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12219", + "name": "Feather headdress", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "107", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "requirements": "{4,50}-{23,20}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12220", + "name": "Feather headdress", + "tradeable": "true", + "grand_exchange_price": "107", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12221", + "name": "Feather headdress (charged)", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "107", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12222", + "name": "Feather headdress", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "211", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "requirements": "{4,50}-{23,20}", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12223", + "name": "Feather headdress", + "tradeable": "true", + "grand_exchange_price": "211", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12224", + "name": "Feather headdress (charged)", + "examine": "It's fun to go to the O-B-E-L-I-S-K!", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "grand_exchange_price": "107", + "equipment_slot": "0", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,20,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12294", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12296", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12298", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12300", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12302", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12304", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12306", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12308", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12310", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12312", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12314", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12316", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12318", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12320", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12322", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12324", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12326", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12328", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12330", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12332", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12334", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12336", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12338", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12340", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12342", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12344", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12346", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12348", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12350", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12352", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12354", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12356", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12358", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12360", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12362", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12364", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12366", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12368", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12370", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12372", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12374", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12376", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12378", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12380", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12382", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12384", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12386", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12388", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12390", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12392", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12394", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12396", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12398", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12400", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12402", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12404", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12406", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12408", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12410", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12412", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12414", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12416", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12418", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12420", + "name": "Pouch", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12422", + "name": "Herbcall scroll", + "low_alchemy": "94", + "high_alchemy": "142", + "grand_exchange_price": "96", + "requirements": "{23,41}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12423", + "name": "Fruitfall scroll", + "low_alchemy": "146", + "high_alchemy": "220", + "grand_exchange_price": "258", + "requirements": "{23,69}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12424", + "name": "Fish rain scroll", + "low_alchemy": "125", + "high_alchemy": "188", + "grand_exchange_price": "146", + "requirements": "{23,56}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12425", + "name": "Howl scroll", + "low_alchemy": "23", + "high_alchemy": "35", + "grand_exchange_price": "7", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12426", + "name": "Thieving fingers scroll", + "low_alchemy": "104", + "high_alchemy": "157", + "grand_exchange_price": "97", + "requirements": "{23,47}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12427", + "name": "Abyssal stealth scroll", + "low_alchemy": "135", + "high_alchemy": "203", + "grand_exchange_price": "533", + "requirements": "{23,62}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12428", + "name": "Egg spawn scroll", + "low_alchemy": "24", + "high_alchemy": "37", + "grand_exchange_price": "237", + "requirements": "{10,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12429", + "name": "Multichop scroll", + "low_alchemy": "88", + "high_alchemy": "133", + "grand_exchange_price": "97", + "requirements": "{23,33}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12430", + "name": "Cheese feast scroll", + "low_alchemy": "91", + "high_alchemy": "137", + "grand_exchange_price": "121", + "requirements": "{23,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12431", + "name": "Unburden scroll", + "low_alchemy": "27", + "high_alchemy": "41", + "grand_exchange_price": "39", + "requirements": "{23,40}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12432", + "name": "Venom shot scroll", + "low_alchemy": "73", + "high_alchemy": "110", + "grand_exchange_price": "72", + "requirements": "{19,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12433", + "name": "Insane ferocity scroll", + "low_alchemy": "100", + "high_alchemy": "151", + "grand_exchange_price": "99", + "requirements": "{23,32}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12434", + "name": "Healing aura scroll", + "low_alchemy": "156", + "high_alchemy": "235", + "grand_exchange_price": "299", + "requirements": "{23,88}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12435", + "name": "Winter storage scroll", + "low_alchemy": "227", + "high_alchemy": "341", + "grand_exchange_price": "428", + "requirements": "{23,96}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12436", + "name": "Oph. incubation scroll", + "low_alchemy": "132", + "high_alchemy": "199", + "grand_exchange_price": "223", + "requirements": "{23,63}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12437", + "name": "Magic focus scroll", + "low_alchemy": "219", + "high_alchemy": "329", + "grand_exchange_price": "419", + "requirements": "{23,92}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12438", + "name": "Swallow whole scroll", + "low_alchemy": "126", + "high_alchemy": "190", + "grand_exchange_price": "220", + "requirements": "{23,68}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12439", + "name": "Testudo scroll", + "low_alchemy": "17", + "high_alchemy": "26", + "grand_exchange_price": "269", + "requirements": "{23,67}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12440", + "name": "Generate compost scroll", + "low_alchemy": "63", + "high_alchemy": "95", + "grand_exchange_price": "47", + "requirements": "{23,28}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12441", + "name": "Tireless run scroll", + "low_alchemy": "28", + "high_alchemy": "43", + "grand_exchange_price": "35", + "requirements": "{23,52}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12442", + "name": "Regrowth scroll", + "low_alchemy": "144", + "high_alchemy": "217", + "grand_exchange_price": "174", + "requirements": "{23,80}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12443", + "name": "Call to arms scroll", + "low_alchemy": "90", + "high_alchemy": "136", + "grand_exchange_price": "1118", + "requirements": "{23,34}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12444", + "name": "Blood drain scroll", + "low_alchemy": "133", + "high_alchemy": "200", + "grand_exchange_price": "148", + "requirements": "{23,49}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12445", + "name": "Dreadfowl strike scroll", + "low_alchemy": "24", + "high_alchemy": "37", + "grand_exchange_price": "7", + "requirements": "{4,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12446", + "name": "Sandstorm scroll", + "low_alchemy": "67", + "high_alchemy": "101", + "grand_exchange_price": "122", + "requirements": "{23,25}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12447", + "name": "Vampire touch scroll", + "low_alchemy": "97", + "high_alchemy": "146", + "grand_exchange_price": "98", + "requirements": "{23,31}", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12448", + "name": "Evil flames scroll", + "low_alchemy": "120", + "high_alchemy": "181", + "grand_exchange_price": "123", + "requirements": "{23,42}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12449", + "name": "Crushing claw scroll", + "low_alchemy": "182", + "high_alchemy": "274", + "grand_exchange_price": "219", + "requirements": "{23,74}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12450", + "name": "Mantis strike scroll", + "grand_exchange_price": "221", + "requirements": "{23,75}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12451", + "name": "Arctic blast scroll", + "low_alchemy": "30", + "high_alchemy": "46", + "grand_exchange_price": "12", + "requirements": "{23,71}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12452", + "name": "Toad bark scroll", + "low_alchemy": "27", + "high_alchemy": "41", + "grand_exchange_price": "10", + "requirements": "{23,66}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12453", + "name": "Dissolve scroll", + "low_alchemy": "167", + "high_alchemy": "251", + "grand_exchange_price": "202", + "requirements": "{23,55}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12454", + "name": "Abyssal drain scroll", + "low_alchemy": "122", + "high_alchemy": "183", + "grand_exchange_price": "163", + "requirements": "{23,54}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12455", + "name": "Doomsphere scroll", + "low_alchemy": "160", + "high_alchemy": "241", + "grand_exchange_price": "198", + "requirements": "{23,58}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12456", + "name": "Spike shot scroll", + "low_alchemy": "17", + "high_alchemy": "26", + "grand_exchange_price": "9", + "requirements": "{23,83}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12457", + "name": "Acorn missile scroll", + "low_alchemy": "140", + "high_alchemy": "211", + "grand_exchange_price": "146", + "requirements": "{23,78}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12458", + "name": "Petrifying gaze scroll", + "low_alchemy": "104", + "high_alchemy": "157", + "grand_exchange_price": "97", + "requirements": "{23,43}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12459", + "name": "Slime spray scroll", + "low_alchemy": "184", + "high_alchemy": "277", + "grand_exchange_price": "10", + "requirements": "{13,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12460", + "name": "Electric lash scroll", + "low_alchemy": "61", + "high_alchemy": "92", + "grand_exchange_price": "47", + "requirements": "{18,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12461", + "name": "Bronze bull rush scroll", + "low_alchemy": "118", + "high_alchemy": "178", + "grand_exchange_price": "135", + "requirements": "{23,36}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12462", + "name": "Iron bull rush scroll", + "low_alchemy": "141", + "high_alchemy": "212", + "grand_exchange_price": "180", + "requirements": "{23,46}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12463", + "name": "Steel bull rush scroll", + "low_alchemy": "157", + "high_alchemy": "236", + "grand_exchange_price": "182", + "requirements": "{23,56}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12464", + "name": "Mith bull rush scroll", + "low_alchemy": "168", + "high_alchemy": "253", + "grand_exchange_price": "198", + "requirements": "{23,66}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12465", + "name": "Addy bull rush scroll", + "low_alchemy": "160", + "high_alchemy": "241", + "grand_exchange_price": "203", + "requirements": "{23,76}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12466", + "name": "Rune bull rush scroll", + "low_alchemy": "17", + "high_alchemy": "26", + "grand_exchange_price": "67", + "requirements": "{23,86}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12467", + "name": "Poisonous blast scroll", + "low_alchemy": "144", + "high_alchemy": "217", + "grand_exchange_price": "171", + "requirements": "{23,64}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12468", + "name": "Dust cloud scroll", + "low_alchemy": "157", + "high_alchemy": "236", + "grand_exchange_price": "170", + "requirements": "{23,61}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12469", + "name": "Hatchling dragon", + "examine": "(hatchling) A hatchling <dragon colour> dragon.(baby) A bigger baby <colour> dragon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12471", + "name": "Hatchling dragon", + "examine": "(hatchling) A hatchling <dragon colour> dragon.(baby) A bigger baby <colour> dragon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12473", + "name": "Hatchling dragon", + "examine": "(hatchling) A hatchling <dragon colour> dragon.(baby) A bigger baby <colour> dragon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12475", + "name": "Hatchling dragon", + "examine": "(hatchling) A hatchling <dragon colour> dragon.(baby) A bigger baby <colour> dragon.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12477", + "name": "Red dragon egg", + "examine": "This will hatch into a mighty dragon.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12478", + "name": "Blue dragon egg", + "examine": "This will hatch into a mighty dragon.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12479", + "name": "Green dragon egg", + "examine": "This will hatch into a mighty dragon.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12480", + "name": "Black dragon egg", + "examine": "This will hatch into a mighty dragon.", + "destroy": "true", + "tradeable": "false", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12481", + "name": "Baby penguin", + "examine": "(Baby) Can't fly and can barely walk, but adorable nonetheless. (adult) Emperor of all he surveys.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12483", + "name": "Penguin egg", + "examine": "I can hatch this in an Incubator.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12484", + "name": "Raven chick", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12485", + "name": "Raven", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12486", + "name": "Baby raccoon", + "examine": "(Baby) A stripy little baby raccoon.(Adult) He can run with us.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12487", + "name": "Raccoon", + "examine": "(Baby) A stripy little baby raccoon.(Adult) He can run with us.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12488", + "name": "Baby gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12489", + "name": "Gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12490", + "name": "Baby squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12491", + "name": "Squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12492", + "name": "Baby chameleon", + "examine": "It's a colour-coordinated lizard!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12493", + "name": "Chameleon", + "examine": "It's a colour-coordinated lizard!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12494", + "name": "Chameleon egg", + "examine": "A lizard's egg.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12495", + "name": "Chameleon egg", + "examine": "A lizard's egg.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12496", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12498", + "name": "Vulture chick", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12499", + "name": "Vulture", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12500", + "name": "Baby giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12501", + "name": "Giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12502", + "name": "Crunchy claw token", + "examine": "Apparently, this token is worth one baby giant crab to someone called Nung.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12503", + "name": "Saradomin chick", + "examine": "Chick: A fluffy chick.Bird: Lovely blue plumage.Owl: A fantastic saradomin owl.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12504", + "name": "Saradomin bird", + "examine": "Chick: A fluffy chick.Bird: Lovely blue plumage.Owl: A fantastic saradomin owl.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12505", + "name": "Saradomin owl", + "examine": "Chick: A fluffy chick.Bird: Lovely blue plumage.Owl: A fantastic saradomin owl.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12506", + "name": "Zamorak chick", + "examine": "Chick: A fluffy chick.Bird: Lovely red plumage.Hawk: A stately zamorak hawk.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12507", + "name": "Zamorak bird", + "examine": "Chick: A fluffy chick.Bird: Lovely red plumage.Hawk: A stately zamorak hawk.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12508", + "name": "Zamorak hawk", + "examine": "Chick: A fluffy chick.Bird: Lovely red plumage.Hawk: A stately zamorak hawk.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12509", + "name": "Guthix chick", + "examine": "Chick: A fluffy chick.Bird: Lovely green plumage.Raptor: An impressive Guthix raptor.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12510", + "name": "Guthix bird", + "examine": "Chick: A fluffy chick.Bird: Lovely green plumage.Raptor: An impressive Guthix raptor.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12511", + "name": "Guthix raptor", + "examine": "Chick: A fluffy chick.Bird: Lovely green plumage.Raptor: An impressive Guthix raptor.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12512", + "name": "Terrier puppy", + "examine": "A hyperactive little puppy. (Puppy)(Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12513", + "name": "Terrier", + "examine": "A hyperactive little puppy. (Puppy)(Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12514", + "name": "Greyhound puppy", + "examine": "This is one fast little pooch. (Puppy)An aerodynamic doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12515", + "name": "Greyhound", + "examine": "This is one fast little pooch. (Puppy)An aerodynamic doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12516", + "name": "Labrador puppy", + "examine": "Puppy - Soft but strong... and cute.Adult - My most faithful friend.", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12517", + "name": "Labrador", + "examine": "Puppy - Soft but strong... and cute.Adult - My most faithful friend.", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12518", + "name": "Dalmatian puppy", + "examine": "Now, if only I could find another hundred... (Puppy)A purebred doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12519", + "name": "Dalmatian", + "examine": "Now, if only I could find another hundred... (Puppy)A purebred doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12520", + "name": "Sheepdog puppy", + "examine": "This little puppy is very quiet. (Puppy)Come by! Come by! (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12521", + "name": "Sheepdog", + "examine": "This little puppy is very quiet. (Puppy)Come by! Come by! (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12522", + "name": "Bulldog puppy", + "examine": "One proud little puppy. (Puppy)Looks like it's chewing a wasp. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12523", + "name": "Bulldog", + "examine": "One proud little puppy. (Puppy)Looks like it's chewing a wasp. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12524", + "name": "Summoning cape", + "examine": "The cape worn by master summoners.", + "low_alchemy": "39600", + "high_alchemy": "59400", + "shop_price": "99000", + "equipment_slot": "1", + "bonuses": "0,0,0,0,0,9,9,9,9,9,0,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12527", + "name": "Gold charm", + "examine": "A charm used to summon familiars.", + "tradeable": "false", + "shop_price": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12528", + "name": "Trapdoor key", + "examine": "A key to Pikkupstix's trapdoor.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12530", + "name": "Spirit shards", + "examine": "Shards of an obelisk.", + "tradeable": "true", + "low_alchemy": "10", + "high_alchemy": "15", + "shop_price": "25", + "grand_exchange_price": "24", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12531", + "name": "Ibis pouch", + "low_alchemy": "1259", + "high_alchemy": "1889", + "grand_exchange_price": "1914", + "requirements": "{23,56}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12532", + "name": "Ibis pouch", + "tradeable": "true", + "low_alchemy": "1259", + "high_alchemy": "1889", + "grand_exchange_price": "1914", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12533", + "name": "Stony shell scroll", + "low_alchemy": "23", + "high_alchemy": "35", + "grand_exchange_price": "7", + "requirements": "{16,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12535", + "name": "Raw pawya meat", + "examine": "Meat from a creature that can be hunted in Isafdar.", + "tradeable": "true", + "low_alchemy": "200", + "high_alchemy": "300", + "grand_exchange_price": "7968", + "weight": "0.33", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12536", + "name": "Raw pawya meat", + "tradeable": "true", + "grand_exchange_price": "7968", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12538", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12539", + "name": "Grenwall spikes", + "examine": "Spikes from a grenwall.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "1704", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12545", + "name": "Picture", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12547", + "name": "Platypus", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12548", + "name": "Platypus", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12549", + "name": "Platypus", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12550", + "name": "Platypus", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12551", + "name": "Baby platypus", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12552", + "name": "Baby platypus", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12553", + "name": "Baby platypus", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12554", + "name": "Patrick", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12555", + "name": "Penelope", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12556", + "name": "Peter", + "examine": "I bet he can't wait until it's cooked.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12557", + "name": "Peanut", + "examine": "A most unlikely creature.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12558", + "name": "Mud", + "examine": "Marginally better than egg on your face.", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12559", + "name": "Ogre wig", + "examine": "The height of style?", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "50", + "grand_exchange_price": "1004", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12560", + "name": "Ogre wig", + "tradeable": "true", + "grand_exchange_price": "1004", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12561", + "name": "Ogre kilt", + "examine": "It's a little big on me.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "60", + "grand_exchange_price": "197", + "equipment_slot": "7", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12562", + "name": "Ogre kilt", + "tradeable": "true", + "grand_exchange_price": "197", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12563", + "name": "Ogre top", + "examine": "It's a little big on me.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "60", + "grand_exchange_price": "536", + "remove_sleeves": "true", + "equipment_slot": "4", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12564", + "name": "Ogre top", + "tradeable": "true", + "grand_exchange_price": "536", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12565", + "name": "Ogre boots", + "examine": "Good for stomping.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "shop_price": "60", + "grand_exchange_price": "420", + "equipment_slot": "10", + "weight": "3", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12566", + "name": "Ogre boots", + "tradeable": "true", + "grand_exchange_price": "420", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12567", + "name": "Diseased kebbit fur", + "examine": "It's a slightly sickly-looking fur.", + "tradeable": "true", + "low_alchemy": "24", + "high_alchemy": "36", + "grand_exchange_price": "1468", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12568", + "name": "Davy kebbit hat", + "examine": "A furry hat with an unnerving tail.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "grand_exchange_price": "3656", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12569", + "name": "Davy kebbit hat", + "tradeable": "true", + "grand_exchange_price": "3656", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12570", + "name": "Ogre club", + "examine": "A big piece of tree.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "grand_exchange_price": "77", + "stand_anim": "8683", + "stand_turn_anim": "823", + "walk_anim": "8684", + "run_anim": "8685", + "turn180_anim": "8684", + "turn90cw_anim": "8684", + "turn90ccw_anim": "8684", + "render_anim": "1157", + "equipment_slot": "3", + "attack_speed": "7", + "bonuses": "-6,-2,15,0,0,0,0,0,0,0,0,12,0,0,0", + "weapon_interface": "10", + "requirements": "{0,5}", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12571", + "name": "Ogre club", + "tradeable": "true", + "grand_exchange_price": "77", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12572", + "name": "Lavender", + "examine": "A delicate, sweet-smelling flower.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12573", + "name": "Lavender", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12574", + "name": "Fever grass", + "examine": "A stiff, pungent grass.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "31", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12575", + "name": "Fever grass", + "tradeable": "true", + "grand_exchange_price": "31", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12576", + "name": "Tansymum", + "examine": "A cheerful, aromatic flower.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12577", + "name": "Tansymum", + "tradeable": "true", + "grand_exchange_price": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12578", + "name": "Smouldering fever grass", + "examine": "A stiff, pungent grass.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "41", + "stand_anim": "8682", + "stand_turn_anim": "8682", + "walk_anim": "8681", + "run_anim": "8690", + "turn180_anim": "8681", + "turn90cw_anim": "8681", + "turn90ccw_anim": "8681", + "render_anim": "294", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12579", + "name": "Smouldering lavender", + "examine": "A delicate, sweet-smelling flower.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "29", + "stand_anim": "8682", + "stand_turn_anim": "8682", + "walk_anim": "8681", + "run_anim": "8690", + "turn180_anim": "8681", + "turn90cw_anim": "8681", + "turn90ccw_anim": "8681", + "render_anim": "294", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12580", + "name": "Smouldering tansymum", + "examine": "A cheerful, aromatic flower.", + "tradeable": "true", + "low_alchemy": "1", + "high_alchemy": "2", + "grand_exchange_price": "18", + "stand_anim": "8682", + "stand_turn_anim": "8682", + "walk_anim": "8681", + "run_anim": "8690", + "turn180_anim": "8681", + "turn90cw_anim": "8681", + "turn90ccw_anim": "8681", + "render_anim": "294", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12581", + "name": "Eucalyptus logs", + "examine": "Logs cut from a eucalyptus tree.", + "tradeable": "true", + "low_alchemy": "50", + "high_alchemy": "75", + "grand_exchange_price": "507", + "equipment_slot": "5", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12582", + "name": "Eucalyptus logs", + "tradeable": "true", + "grand_exchange_price": "507", + "ge_buy_limit": "25000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12583", + "name": "Eucalyptus pyre logs", + "examine": "Logs cut from a eucalyptus tree.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "3609", + "weight": "2", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12584", + "name": "Eucalyptus pyre logs", + "tradeable": "true", + "grand_exchange_price": "3609", + "ge_buy_limit": "1000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12588", + "name": "Primweed", + "examine": "A modest and mild plant.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "20", + "weight": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12589", + "name": "Primweed", + "tradeable": "true", + "grand_exchange_price": "20", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12590", + "name": "Stinkbloom", + "examine": "A pretty but putrid flower.", + "tradeable": "true", + "high_alchemy": "1", + "grand_exchange_price": "16", + "weight": "0.01", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12591", + "name": "Stinkbloom", + "tradeable": "true", + "grand_exchange_price": "16", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12592", + "name": "Diseased kebbit fur", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12593", + "name": "Catapult schematics", + "examine": "The plans for repairing the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can get another from the Tyras Camp catapult engineer.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12594", + "name": "Engineer's letter", + "examine": "General Hining wants me to deliver this to the Catapult Engineer.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can get another from General Hining in the Tyras Camp.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12595", + "name": "Sailor's hat", + "examine": "Taken from a drunken sailor in Port Sarim.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can always get another from the drunken sailor in Port Sarim.", + "equipment_slot": "0", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12596", + "name": "Metal catapult parts", + "examine": "Dwarf-made parts for repairing the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another set from Thaki the delivery dwarf in Port Sarim.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12597", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12598", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12599", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12600", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12601", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12602", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12603", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12604", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12605", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12606", + "name": "Mahogany catapult part", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you need to, you can make another from the Tyras Camp catapult engineer's schematics.", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12607", + "name": "Picture", + "examine": "Used to repair the Tyras Camp catapult.", + "destroy": "true", + "tradeable": "false", + "equipment_slot": "5", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12608", + "name": "Amulet of farming(1)", + "examine": "An amulet of Farming with 1 charge.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "271", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12609", + "name": "Amulet of farming(1)", + "tradeable": "true", + "grand_exchange_price": "271", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12610", + "name": "Amulet of farming(2)", + "examine": "An amulet of Farming with 2 charges.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12611", + "name": "Amulet of farming(2)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12612", + "name": "Amulet of farming(3)", + "examine": "An amulet of Farming with 3 charges.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12613", + "name": "Amulet of farming(3)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12614", + "name": "Amulet of farming(4)", + "examine": "An amulet of Farming with 4 charges.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12615", + "name": "Amulet of farming(4)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12616", + "name": "Amulet of farming(5)", + "examine": "An amulet of Farming with 5 charges.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12617", + "name": "Amulet of farming(5)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12618", + "name": "Amulet of farming(6)", + "examine": "An amulet of Farming with 6 charges.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12619", + "name": "Amulet of farming(6)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12620", + "name": "Amulet of farming(7)", + "examine": "An amulet of Farming with 7 charges.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "8", + "equipment_slot": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12621", + "name": "Amulet of farming(7)", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12622", + "name": "Amulet of farming(8)", + "examine": "An amulet of Farming with 8 charges.", + "tradeable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "shop_price": "200", + "grand_exchange_price": "210", + "equipment_slot": "2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12623", + "name": "Amulet of farming(8)", + "tradeable": "true", + "grand_exchange_price": "210", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12624", + "name": "Ogleroot", + "examine": "An ogleroot. How odd.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "shop_price": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12625", + "name": "Flag", + "examine": "A flag to put in the ground.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "500", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12626", + "name": "Test paper", + "examine": "Player Safety test", + "high_alchemy": "1", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You will need to get another exam paper from Professor Henry", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12627", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12628", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "Are you sure you want to destroy the lamp? You won't be able to get another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12629", + "name": "Safety gloves", + "examine": "Gloves from the Stronghold of Player Safety.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another pair of gloves from the chest in the Stronghold of Player Safety.", + "equipment_slot": "9", + "bonuses": "0,0,0,0,0,1,2,2,1,2,1,0,0,0,0", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12630", + "name": "Rubium", + "examine": "Be careful with this near water.", + "destroy_message": "Rubium is very unstable", + "shop_price": "10", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12631", + "name": "Toy train", + "examine": "(While on the ground) Kennith's lost toy. (While in your inventory) A wooden toy train.", + "destroy_message": "The train is tiny", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12632", + "name": "Note", + "examine": "Swap this note at any bank for the equivalent item.", + "tradeable": "true", + "low_alchemy": "160", + "high_alchemy": "160", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "160", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12633", + "name": "Super fishing explosive", + "examine": "The jar is shaking violently!", + "low_alchemy": "24", + "high_alchemy": "36", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12634", + "name": "Chocatrice cape", + "examine": "A thick, orange cape.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another chocatrice cape from Diango in Draynor Village.", + "equipment_slot": "1", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12635", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12636", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12637", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12638", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12639", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12640", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12641", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12642", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12643", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12644", + "name": "Easter egg", + "examine": "Happy Easter.", + "tradeable": "true", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy_message": "You can reclaim this item from the place you found it.", + "grand_exchange_price": "64747137", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12645", + "name": "Chocatrice cape", + "examine": "A thick, orange cape.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another chocatrice cape from Diango in Draynor Village.", + "equipment_slot": "1", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12646", + "name": "Chocolate egg", + "examine": "A chocolate egg wrapped in coloured foil.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12647", + "name": "Chocolate egg", + "examine": "A chocolate egg wrapped in coloured foil.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12648", + "name": "Chocolate egg", + "examine": "A chocolate egg wrapped in coloured foil.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12649", + "name": "Bucket", + "examine": "It's an empty bucket.", + "tradeable": "true", + "high_alchemy": "1", + "shop_price": "2", + "grand_exchange_price": "50", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12650", + "name": "Bucket of water", + "examine": "Common bucket: It's a bucket of water.2008 Easter event: It's a bucket of water from the Easter Bunny's warren. Regular bucket filled from Braindeath Island: It's a bucket of... water?", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "74", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12651", + "name": "Bucket of water", + "examine": "Common bucket: It's a bucket of water.2008 Easter event: It's a bucket of water from the Easter Bunny's warren. Regular bucket filled from Braindeath Island: It's a bucket of... water?", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "grand_exchange_price": "74", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12652", + "name": "Bucket of coal", + "examine": "It's a bucket of coal from the Easter Bunny's warren.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12653", + "name": "Bucket of coal", + "examine": "It's a bucket of coal from the Easter Bunny's warren.", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12654", + "name": "Cockatrice egg", + "examine": "A stripy brown egg.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "Are you sure you want to destroy this object?
You can get another in the Easter Bunny's warren.", + "grand_exchange_price": "1255", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12655", + "name": "Chocatrice egg", + "examine": "A cockatrice egg that has been dipped in molten chocolate.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Are you sure you want to destroy this object?
You can make another at the Easter Bunny's warren.", + "equipment_slot": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12657", + "name": "Chocolate chunks", + "examine": "Some chocolate chunks.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12658", + "name": "Adamant full helm (e)", + "examine": "A full face helmet.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "shop_price": "3520", + "grand_exchange_price": "1913", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12659", + "name": "Adamant full helm (charged)", + "examine": "A full face helmet.", + "tradeable": "true", + "low_alchemy": "1408", + "high_alchemy": "2112", + "shop_price": "3520", + "grand_exchange_price": "1913", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,2", + "bonuses": "0,0,0,-6,-2,19,21,16,-1,19,6,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12660", + "name": "Snakeskin bandana (e)", + "examine": "Lightweight head protection.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "1040", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,2,1", + "bonuses": "0,0,0,-5,4,2,4,4,2,2,6,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12661", + "name": "Snakeskin bandana (charged)", + "examine": "Lightweight head protection.", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "grand_exchange_price": "1040", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,2,1", + "bonuses": "0,0,0,-5,4,2,4,4,2,2,6,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12662", + "name": "Splitbark helm (e)", + "examine": "A wooden helmet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "5623", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,3,-2,10,9,11,3,0,7,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12663", + "name": "Splitbark helm (charged)", + "examine": "A wooden helmet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "grand_exchange_price": "5623", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,3,-2,10,9,11,3,0,7,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12664", + "name": "Rune full helm (e)", + "examine": "A full face helmet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "21200", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12665", + "name": "Rune full helm (charged)", + "examine": "A full face helmet.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "grand_exchange_price": "21200", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12666", + "name": "Dragon med helm (e)", + "examine": "Makes the wearer pretty intimidating.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "61200", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,4", + "bonuses": "0,0,0,-3,-1,33,35,32,-1,34,10,0,0,0,0", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12667", + "name": "Dragon med helm (charged)", + "examine": "Makes the wearer pretty intimidating.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "grand_exchange_price": "61200", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,4", + "bonuses": "0,0,0,-3,-1,33,35,32,-1,34,10,0,0,0,0", + "weight": "1.3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12668", + "name": "Lunar helm (e)", + "examine": "A mystical helmet.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "15000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,3,-2,8,7,10,2,0,7,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12669", + "name": "Lunar helm (charged)", + "examine": "A mystical helmet.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The Oneiromancer might be able to help you get another.", + "shop_price": "15000", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "0,0,0,3,-2,8,7,10,2,0,7,0,0,0,0", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12670", + "name": "Armadyl helmet (e)", + "examine": "A helmet of great craftmanship.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "grand_exchange_price": "3932989", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,5,2", + "bonuses": "-5,-5,-5,-5,10,6,8,10,10,8,12,0,1,0,0", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12671", + "name": "Armadyl helmet (charged)", + "examine": "A helmet of great craftmanship.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "grand_exchange_price": "3932989", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,5,2", + "bonuses": "-5,-5,-5,-5,10,6,8,10,10,8,12,0,1,0,0", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12672", + "name": "Archer helm (e)", + "examine": "This helmet is worn by archers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "41000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "-5,-5,-5,-5,6,6,8,10,6,6,0,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12673", + "name": "Archer helm (charged)", + "examine": "This helmet is worn by archers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "41000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "-5,-5,-5,-5,6,6,8,10,6,6,0,0,0,0,0", + "weight": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12674", + "name": "Berserker helm (e)", + "examine": "This helmet is worn by berserkers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "48800", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-5,-5,31,29,33,0,30,7,3,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12675", + "name": "Berserker helm (charged)", + "examine": "This helmet is worn by berserkers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "48800", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,0,0,-5,-5,31,29,33,0,30,7,3,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12676", + "name": "Warrior helm (e)", + "examine": "This helm is worn by warriors.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "48200", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,5,0,-5,-5,31,33,29,0,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12677", + "name": "Warrior helm (charged)", + "examine": "This helm is worn by warriors.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "48200", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "1,0,3", + "bonuses": "0,5,0,-5,-5,31,33,29,0,30,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12678", + "name": "Farseer helm (e)", + "examine": "This helm is worn by farseers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "46400", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "-5,-5,-5,6,-5,8,10,12,6,0,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12679", + "name": "Farseer helm (charged)", + "examine": "This helm is worn by farseers.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "shop_price": "78000", + "grand_exchange_price": "46400", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "3,1,0", + "bonuses": "-5,-5,-5,6,-5,8,10,12,6,0,7,0,0,0,0", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12680", + "name": "Helm of neitiznot (e)", + "examine": "A gift from Neitiznot's Burgher.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "50000", + "grand_exchange_price": "44831", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,4", + "bonuses": "0,0,0,0,0,31,29,34,3,30,8,3,3,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12681", + "name": "Helm of neitiznot (charged)", + "examine": "A gift from Neitiznot's Burgher.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "50000", + "grand_exchange_price": "44831", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "2,0,4", + "bonuses": "0,0,0,0,0,31,29,34,3,30,8,3,3,0,0", + "weight": "2.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12682", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12684", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12686", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12688", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12690", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12692", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12694", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12696", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12698", + "name": "Baby monkey", + "examine": "(Baby) It's a tiny, cheeky monkey. (Adult) Hide the bananas!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12700", + "name": "Terrier puppy", + "examine": "A hyperactive little puppy. (Puppy)(Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12701", + "name": "Terrier", + "examine": "A hyperactive little puppy. (Puppy)(Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12702", + "name": "Terrier puppy", + "examine": "A hyperactive little puppy. (Puppy)(Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12703", + "name": "Terrier", + "examine": "A hyperactive little puppy. (Puppy)(Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12704", + "name": "Greyhound puppy", + "examine": "This is one fast little pooch. (Puppy)An aerodynamic doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12705", + "name": "Greyhound", + "examine": "This is one fast little pooch. (Puppy)An aerodynamic doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12706", + "name": "Greyhound puppy", + "examine": "This is one fast little pooch. (Puppy)An aerodynamic doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12707", + "name": "Greyhound", + "examine": "This is one fast little pooch. (Puppy)An aerodynamic doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12708", + "name": "Labrador puppy", + "examine": "Puppy - Soft but strong... and cute.Adult - My most faithful friend.", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12709", + "name": "Labrador", + "examine": "Puppy - Soft but strong... and cute.Adult - My most faithful friend.", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12710", + "name": "Labrador puppy", + "examine": "Puppy - Soft but strong... and cute.Adult - My most faithful friend.", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12711", + "name": "Labrador", + "examine": "Puppy - Soft but strong... and cute.Adult - My most faithful friend.", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12712", + "name": "Dalmatian puppy", + "examine": "Now, if only I could find another hundred... (Puppy)A purebred doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12713", + "name": "Dalmatian", + "examine": "Now, if only I could find another hundred... (Puppy)A purebred doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12714", + "name": "Dalmatian puppy", + "examine": "Now, if only I could find another hundred... (Puppy)A purebred doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12715", + "name": "Dalmatian", + "examine": "Now, if only I could find another hundred... (Puppy)A purebred doggy. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12716", + "name": "Sheepdog puppy", + "examine": "This little puppy is very quiet. (Puppy)Come by! Come by! (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12717", + "name": "Sheepdog", + "examine": "This little puppy is very quiet. (Puppy)Come by! Come by! (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12718", + "name": "Sheepdog puppy", + "examine": "This little puppy is very quiet. (Puppy)Come by! Come by! (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12719", + "name": "Sheepdog", + "examine": "This little puppy is very quiet. (Puppy)Come by! Come by! (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12720", + "name": "Bulldog puppy", + "examine": "One proud little puppy. (Puppy)Looks like it's chewing a wasp. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12721", + "name": "Bulldog", + "examine": "One proud little puppy. (Puppy)Looks like it's chewing a wasp. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12722", + "name": "Bulldog puppy", + "examine": "One proud little puppy. (Puppy)Looks like it's chewing a wasp. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12723", + "name": "Bulldog", + "examine": "One proud little puppy. (Puppy)Looks like it's chewing a wasp. (Adult)", + "requirements": "{4,23}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12724", + "name": "Raven chick", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12725", + "name": "Raven", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12726", + "name": "Raven chick", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12727", + "name": "Raven", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12728", + "name": "Raven chick", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12729", + "name": "Raven", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12730", + "name": "Raven chick", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12731", + "name": "Raven", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12732", + "name": "Raven chick", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12733", + "name": "Raven", + "examine": "Chick: A raven chick.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12734", + "name": "Baby raccoon", + "examine": "(Baby) A stripy little baby raccoon.(Adult) He can run with us.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12735", + "name": "Raccoon", + "examine": "(Baby) A stripy little baby raccoon.(Adult) He can run with us.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12736", + "name": "Baby raccoon", + "examine": "(Baby) A stripy little baby raccoon.(Adult) He can run with us.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12737", + "name": "Raccoon", + "examine": "(Baby) A stripy little baby raccoon.(Adult) He can run with us.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12738", + "name": "Baby gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12739", + "name": "Baby gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12740", + "name": "Baby gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12741", + "name": "Baby gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12742", + "name": "Gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12743", + "name": "Gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12744", + "name": "Gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12745", + "name": "Gecko", + "examine": "(Baby) It's so adorably tiny! (Adult) How cute!", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12746", + "name": "Baby giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12747", + "name": "Giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12748", + "name": "Baby giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12749", + "name": "Giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12750", + "name": "Baby giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12751", + "name": "Giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12752", + "name": "Baby giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12753", + "name": "Giant crab", + "examine": "Baby: Little NipperAdult: Bigger Nipper.", + "requirements": "{23,40}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12754", + "name": "Baby squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12755", + "name": "Squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12756", + "name": "Baby squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12757", + "name": "Squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12758", + "name": "Baby squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12759", + "name": "Squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12760", + "name": "Baby squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12761", + "name": "Squirrel", + "examine": "Adult: An experienced nut-thief.Baby: A tiny nut-thief.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12763", + "name": "Baby penguin", + "examine": "(Baby) Can't fly and can barely walk, but adorable nonetheless. (adult) Emperor of all he surveys.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12765", + "name": "Baby penguin", + "examine": "(Baby) Can't fly and can barely walk, but adorable nonetheless. (adult) Emperor of all he surveys.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12766", + "name": "Vulture chick", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12767", + "name": "Vulture", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12768", + "name": "Vulture chick", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12769", + "name": "Vulture", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12770", + "name": "Vulture chick", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12771", + "name": "Vulture", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12772", + "name": "Vulture chick", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12773", + "name": "Vulture", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12774", + "name": "Vulture chick", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12775", + "name": "Vulture", + "examine": "If you see them circling: run.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12776", + "name": "Swamp titan pouch", + "low_alchemy": "1669", + "high_alchemy": "2504", + "grand_exchange_price": "2613", + "requirements": "{23,85}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12777", + "name": "Swamp titan pouch", + "tradeable": "true", + "low_alchemy": "1669", + "high_alchemy": "2504", + "grand_exchange_price": "2613", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12778", + "name": "Spirit mosquito pouch", + "low_alchemy": "179", + "high_alchemy": "269", + "grand_exchange_price": "130", + "requirements": "{17,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12779", + "name": "Spirit mosquito pouch", + "tradeable": "true", + "low_alchemy": "179", + "high_alchemy": "269", + "grand_exchange_price": "130", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12780", + "name": "Void spinner pouch", + "low_alchemy": "909", + "high_alchemy": "1364", + "grand_exchange_price": "16100", + "requirements": "{23,34}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12781", + "name": "Void spinner pouch", + "tradeable": "true", + "low_alchemy": "909", + "high_alchemy": "1364", + "grand_exchange_price": "16100", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12782", + "name": "Forge regent pouch", + "low_alchemy": "1579", + "high_alchemy": "2369", + "grand_exchange_price": "2458", + "requirements": "{23,76}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12783", + "name": "Forge regent pouch", + "tradeable": "true", + "low_alchemy": "1579", + "high_alchemy": "2369", + "grand_exchange_price": "2458", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12784", + "name": "Spirit larupia pouch", + "low_alchemy": "1719", + "high_alchemy": "2579", + "grand_exchange_price": "4097", + "requirements": "{23,57}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12785", + "name": "Spirit larupia pouch", + "tradeable": "true", + "low_alchemy": "1719", + "high_alchemy": "2579", + "grand_exchange_price": "4097", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12786", + "name": "Geyser titan pouch", + "low_alchemy": "2389", + "high_alchemy": "3584", + "grand_exchange_price": "3856", + "requirements": "{23,89}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12787", + "name": "Geyser titan pouch", + "tradeable": "true", + "low_alchemy": "2389", + "high_alchemy": "3584", + "grand_exchange_price": "3856", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12788", + "name": "Lava titan pouch", + "low_alchemy": "2359", + "high_alchemy": "3539", + "grand_exchange_price": "3840", + "requirements": "{23,83}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12789", + "name": "Lava titan pouch", + "tradeable": "true", + "low_alchemy": "2359", + "high_alchemy": "3539", + "grand_exchange_price": "3840", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12790", + "name": "Steel titan pouch", + "low_alchemy": "1949", + "high_alchemy": "2924", + "grand_exchange_price": "5800", + "requirements": "{23,99}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12791", + "name": "Steel titan pouch", + "tradeable": "true", + "low_alchemy": "1949", + "high_alchemy": "2924", + "grand_exchange_price": "5800", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12792", + "name": "Obsidian golem pouch", + "low_alchemy": "2119", + "high_alchemy": "3179", + "grand_exchange_price": "3436", + "requirements": "{23,73}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12793", + "name": "Obsidian golem pouch", + "tradeable": "true", + "low_alchemy": "2119", + "high_alchemy": "3179", + "grand_exchange_price": "3436", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12794", + "name": "Talon beast pouch", + "low_alchemy": "1909", + "high_alchemy": "2864", + "grand_exchange_price": "3017", + "requirements": "{23,77}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12795", + "name": "Talon beast pouch", + "tradeable": "true", + "low_alchemy": "1909", + "high_alchemy": "2864", + "grand_exchange_price": "3017", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12796", + "name": "Abyssal titan pouch", + "low_alchemy": "1299", + "high_alchemy": "1949", + "grand_exchange_price": "2991", + "requirements": "{23,93}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12797", + "name": "Abyssal titan pouch", + "tradeable": "true", + "low_alchemy": "1299", + "high_alchemy": "1949", + "grand_exchange_price": "2991", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12798", + "name": "Void torcher pouch", + "low_alchemy": "909", + "high_alchemy": "1364", + "grand_exchange_price": "18300", + "requirements": "{23,34}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12799", + "name": "Void torcher pouch", + "tradeable": "true", + "low_alchemy": "909", + "high_alchemy": "1364", + "grand_exchange_price": "18300", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12800", + "name": "Giant chinchompa pouch", + "low_alchemy": "1009", + "high_alchemy": "1514", + "grand_exchange_price": "1513", + "requirements": "{23,29}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12801", + "name": "Giant chinchompa pouch", + "tradeable": "true", + "low_alchemy": "1009", + "high_alchemy": "1514", + "grand_exchange_price": "1513", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12802", + "name": "Fire titan pouch", + "low_alchemy": "2149", + "high_alchemy": "3224", + "grand_exchange_price": "3567", + "requirements": "{23,79}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12803", + "name": "Fire titan pouch", + "tradeable": "true", + "low_alchemy": "2149", + "high_alchemy": "3224", + "grand_exchange_price": "3567", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12804", + "name": "Moss titan pouch", + "low_alchemy": "2189", + "high_alchemy": "3284", + "grand_exchange_price": "3548", + "requirements": "{23,79}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12805", + "name": "Moss titan pouch", + "tradeable": "true", + "low_alchemy": "2189", + "high_alchemy": "3284", + "grand_exchange_price": "3548", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12806", + "name": "Ice titan pouch", + "low_alchemy": "2149", + "high_alchemy": "3224", + "grand_exchange_price": "7184", + "requirements": "{23,79}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12807", + "name": "Ice titan pouch", + "tradeable": "true", + "low_alchemy": "2149", + "high_alchemy": "3224", + "grand_exchange_price": "7184", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12808", + "name": "Spirit tz-kih pouch", + "low_alchemy": "809", + "high_alchemy": "1214", + "grand_exchange_price": "1116", + "requirements": "{22,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12809", + "name": "Spirit tz-kih pouch", + "tradeable": "true", + "low_alchemy": "809", + "high_alchemy": "1214", + "grand_exchange_price": "1116", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12810", + "name": "Spirit graahk pouch", + "low_alchemy": "1709", + "high_alchemy": "2564", + "grand_exchange_price": "7919", + "requirements": "{23,57}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12811", + "name": "Spirit graahk pouch", + "tradeable": "true", + "low_alchemy": "1709", + "high_alchemy": "2564", + "grand_exchange_price": "7919", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12812", + "name": "Spirit kyatt pouch", + "low_alchemy": "1699", + "high_alchemy": "2549", + "grand_exchange_price": "13300", + "requirements": "{23,57}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12813", + "name": "Spirit kyatt pouch", + "tradeable": "true", + "low_alchemy": "1699", + "high_alchemy": "2549", + "grand_exchange_price": "13300", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12814", + "name": "Void shifter pouch", + "low_alchemy": "909", + "high_alchemy": "1364", + "grand_exchange_price": "18600", + "requirements": "{23,34}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12815", + "name": "Void shifter pouch", + "tradeable": "true", + "low_alchemy": "909", + "high_alchemy": "1364", + "grand_exchange_price": "18600", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12816", + "name": "Pyrelord pouch", + "low_alchemy": "1279", + "high_alchemy": "1919", + "grand_exchange_price": "1951", + "requirements": "{23,46}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12817", + "name": "Pyrelord pouch", + "tradeable": "true", + "low_alchemy": "1279", + "high_alchemy": "1919", + "grand_exchange_price": "1951", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12818", + "name": "Void ravager pouch", + "low_alchemy": "909", + "high_alchemy": "1364", + "grand_exchange_price": "10700", + "requirements": "{23,34}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12819", + "name": "Void ravager pouch", + "tradeable": "true", + "low_alchemy": "909", + "high_alchemy": "1364", + "grand_exchange_price": "10700", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12820", + "name": "Ravenous locust pouch", + "low_alchemy": "959", + "high_alchemy": "1439", + "grand_exchange_price": "1382", + "requirements": "{23,70}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12821", + "name": "Ravenous locust pouch", + "tradeable": "true", + "low_alchemy": "959", + "high_alchemy": "1439", + "grand_exchange_price": "1382", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12822", + "name": "Iron titan pouch", + "low_alchemy": "2149", + "high_alchemy": "3224", + "grand_exchange_price": "3470", + "requirements": "{23,95}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12823", + "name": "Iron titan pouch", + "tradeable": "true", + "low_alchemy": "2149", + "high_alchemy": "3224", + "grand_exchange_price": "3470", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12824", + "name": "Titan's con. scroll", + "low_alchemy": "214", + "high_alchemy": "322", + "grand_exchange_price": "380", + "requirements": "{23,79}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12825", + "name": "Steel of legends scroll", + "low_alchemy": "194", + "high_alchemy": "292", + "grand_exchange_price": "646", + "requirements": "{23,99}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12826", + "name": "Volcanic str. scroll", + "low_alchemy": "211", + "high_alchemy": "317", + "grand_exchange_price": "271", + "requirements": "{23,73}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12827", + "name": "Essence shipment scroll", + "low_alchemy": "129", + "high_alchemy": "194", + "grand_exchange_price": "310", + "requirements": "{23,93}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12828", + "name": "Iron within scroll", + "low_alchemy": "214", + "high_alchemy": "322", + "grand_exchange_price": "389", + "requirements": "{23,95}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12829", + "name": "Immense heat scroll", + "low_alchemy": "127", + "high_alchemy": "191", + "grand_exchange_price": "146", + "requirements": "{23,46}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12830", + "name": "Famine scroll", + "low_alchemy": "95", + "high_alchemy": "143", + "grand_exchange_price": "149", + "requirements": "{23,70}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12831", + "name": "Deadly claw scroll", + "low_alchemy": "190", + "high_alchemy": "286", + "grand_exchange_price": "245", + "requirements": "{23,77}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12832", + "name": "Swamp plague scroll", + "low_alchemy": "166", + "high_alchemy": "250", + "grand_exchange_price": "192", + "requirements": "{23,85}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12833", + "name": "Boil scroll", + "grand_exchange_price": "294", + "requirements": "{23,89}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12834", + "name": "Explode scroll", + "low_alchemy": "238", + "high_alchemy": "358", + "grand_exchange_price": "103", + "requirements": "{23,29}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12835", + "name": "Goad scroll", + "low_alchemy": "170", + "high_alchemy": "256", + "grand_exchange_price": "250", + "requirements": "{23,57}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12836", + "name": "Ambush scroll", + "low_alchemy": "169", + "high_alchemy": "254", + "grand_exchange_price": "1428", + "requirements": "{23,57}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12837", + "name": "Ebon thunder scroll", + "low_alchemy": "211", + "high_alchemy": "317", + "grand_exchange_price": "300", + "requirements": "{23,83}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12838", + "name": "Pester scroll", + "low_alchemy": "17", + "high_alchemy": "26", + "grand_exchange_price": "1", + "requirements": "{17,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12839", + "name": "Fireball assault scroll", + "low_alchemy": "80", + "high_alchemy": "121", + "grand_exchange_price": "78", + "requirements": "{22,23}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12840", + "name": "Rending scroll", + "low_alchemy": "171", + "high_alchemy": "257", + "grand_exchange_price": "196", + "requirements": "{23,57}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12841", + "name": "Inferno scroll", + "low_alchemy": "157", + "high_alchemy": "236", + "grand_exchange_price": "173", + "requirements": "{23,76}", + "ge_buy_limit": "5000", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12842", + "name": "Gnomecopter", + "stand_anim": "8964", + "stand_turn_anim": "8963", + "walk_anim": "8961", + "run_anim": "8963", + "turn180_anim": "8963", + "turn90cw_anim": "8963", + "turn90ccw_anim": "8963", + "equipment_slot": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12843", + "name": "Gnomecopter ticket", + "examine": "It tells gnomecopters where you wish to go.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This is for use with the gnomecopters, north of Lumbridge. Sasquine Huburns will give you another one.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12844", + "name": "Toy kite", + "examine": "A kite with a dragon on it.", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "stand_anim": "8981", + "stand_turn_anim": "8987", + "walk_anim": "8982", + "run_anim": "8986", + "turn180_anim": "8985", + "turn90cw_anim": "8983", + "turn90ccw_anim": "8984", + "render_anim": "593", + "equipment_slot": "3", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12845", + "name": "Stone of power", + "examine": "A stone used to gather energy.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "stand_anim": "8998", + "stand_turn_anim": "9000", + "walk_anim": "8997", + "run_anim": "9004", + "turn180_anim": "9001", + "turn90cw_anim": "9002", + "turn90ccw_anim": "9003", + "render_anim": "370", + "equipment_slot": "3", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12846", + "name": "Stone of power", + "examine": "A stone used to gather energy.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "stand_anim": "8998", + "stand_turn_anim": "9000", + "walk_anim": "8997", + "run_anim": "9004", + "turn180_anim": "9001", + "turn90cw_anim": "9002", + "turn90ccw_anim": "9003", + "render_anim": "370", + "equipment_slot": "3", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12847", + "name": "Stone of power", + "examine": "A stone used to gather energy.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "stand_anim": "8998", + "stand_turn_anim": "9000", + "walk_anim": "8997", + "run_anim": "9004", + "turn180_anim": "9001", + "turn90cw_anim": "9002", + "turn90ccw_anim": "9003", + "render_anim": "370", + "equipment_slot": "3", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12848", + "name": "Stone of power", + "examine": "A stone used to gather energy.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "stand_anim": "8998", + "stand_turn_anim": "9000", + "walk_anim": "8997", + "run_anim": "9004", + "turn180_anim": "9001", + "turn90cw_anim": "9002", + "turn90ccw_anim": "9003", + "render_anim": "370", + "equipment_slot": "3", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12849", + "name": "Stone of power", + "examine": "A stone used to gather energy.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can reclaim this item from the place you found it.", + "stand_anim": "8998", + "stand_turn_anim": "9000", + "walk_anim": "8997", + "run_anim": "9004", + "turn180_anim": "9001", + "turn90cw_anim": "9002", + "turn90ccw_anim": "9003", + "render_anim": "370", + "equipment_slot": "3", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12850", + "name": "Elemental rune", + "examine": "A generic elemental rune", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12851", + "name": "Catalytic rune", + "examine": "A generic non-elemental rune", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12852", + "name": "Fist of guthix token", + "examine": "A token awarded for taking part in the Fist of Guthix minigame.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12853", + "name": "Bandages", + "examine": "A box of bandages for healing.", + "tradeable": "true", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12855", + "name": "Tele-orb", + "examine": "Teleports you to the centre of the arena.", + "destroy_message": "You can reclaim this item from the place you found it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12856", + "name": "Irit gloves", + "examine": "A pair of mystical gloves.", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "75", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12857", + "name": "Avantoe gloves", + "examine": "A pair of mystical gloves.", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "100", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12858", + "name": "Kwuarm gloves", + "examine": "A pair of mystical gloves.", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "200", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12859", + "name": "Cadantine gloves", + "examine": "A pair of mystical gloves.", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "200", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12860", + "name": "Swordfish gloves", + "examine": "A pair of mystical gloves.", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "200", + "equipment_slot": "9", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12861", + "name": "Shark gloves", + "examine": "A pair of mystical gloves", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "200", + "equipment_slot": "9", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12862", + "name": "Dragon slayer gloves", + "examine": "A pair of mystical gloves.", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "200", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12863", + "name": "Air runecrafting gloves", + "examine": "A pair of mystical gloves.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can buy a new pair from the druids at the Fist of Guthix activity.", + "shop_price": "75", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12864", + "name": "Water runecrafting gloves", + "examine": "A pair of mystical gloves.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can buy a new pair from the druids at the Fist of Guthix activity.", + "shop_price": "75", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12865", + "name": "Earth runecrafting gloves", + "examine": "A pair of mystical gloves.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can buy a new pair from the druids at the Fist of Guthix minigame.", + "shop_price": "75", + "equipment_slot": "9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12866", + "name": "Battle hood 100", + "examine": "Its arcane power is waning.", + "tradeable": "false", + "low_alchemy": "10000", + "high_alchemy": "15000", + "shop_price": "250", + "grand_exchange_price": "70529", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "4,3,0", + "bonuses": "0,0,0,5,0,7,6,8,5,0,8,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12867", + "name": "Battle hood 80", + "examine": "Its arcane power is waning.", + "tradeable": "false", + "low_alchemy": "10000", + "high_alchemy": "15000", + "shop_price": "250", + "grand_exchange_price": "70529", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "4,3,0", + "bonuses": "0,0,0,5,0,7,6,8,5,0,8,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12868", + "name": "Battle hood 60", + "examine": "Its arcane power is waning.", + "tradeable": "false", + "low_alchemy": "10000", + "high_alchemy": "15000", + "shop_price": "250", + "grand_exchange_price": "70529", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "4,3,0", + "bonuses": "0,0,0,5,0,7,6,8,5,0,8,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12869", + "name": "Battle hood 40", + "examine": "Its arcane power is waning.", + "tradeable": "false", + "low_alchemy": "10000", + "high_alchemy": "15000", + "shop_price": "250", + "grand_exchange_price": "70529", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "4,3,0", + "bonuses": "0,0,0,5,0,7,6,8,5,0,8,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12870", + "name": "Battle hood 20", + "examine": "Its arcane power is waning.", + "tradeable": "false", + "low_alchemy": "10000", + "high_alchemy": "15000", + "shop_price": "250", + "grand_exchange_price": "70529", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "4,3,0", + "bonuses": "0,0,0,5,0,7,6,8,5,0,8,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12871", + "name": "Battle hood 0", + "examine": "Its arcane power is waning.", + "tradeable": "false", + "low_alchemy": "10000", + "high_alchemy": "15000", + "shop_price": "250", + "grand_exchange_price": "78900", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "4,3,0", + "bonuses": "0,0,0,2,0,3,2,3,2,0,3,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12872", + "name": "Battle hood 0", + "tradeable": "false", + "grand_exchange_price": "78900", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12873", + "name": "Battle robe top 100", + "examine": "Charged - A robe top infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "1500", + "grand_exchange_price": "537714", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,26,0,17,15,20,26,0,30,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12874", + "name": "Battle robe top 80", + "examine": "Charged - A robe top infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "1500", + "grand_exchange_price": "537714", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,26,0,17,15,20,26,0,30,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12875", + "name": "Battle robe top 60", + "examine": "Charged - A robe top infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "1500", + "grand_exchange_price": "537714", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,26,0,17,15,20,26,0,30,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12876", + "name": "Battle robe top 40", + "examine": "Charged - A robe top infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "1500", + "grand_exchange_price": "537714", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,26,0,17,15,20,26,0,30,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12877", + "name": "Battle robe top 20", + "examine": "Charged - A robe top infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "1500", + "grand_exchange_price": "537714", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,26,0,17,15,20,26,0,30,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12878", + "name": "Battle robe top 0", + "examine": "Charged - A robe top infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "1500", + "grand_exchange_price": "431400", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,7,0,4,4,5,7,0,8,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12879", + "name": "Battle robe top 0", + "tradeable": "false", + "grand_exchange_price": "431400", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12880", + "name": "Battle robe bottom 100", + "examine": "A robe bottom infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "16000", + "high_alchemy": "24000", + "shop_price": "1000", + "grand_exchange_price": "364878", + "equipment_slot": "7", + "absorb": "5,2,0", + "bonuses": "0,0,0,20,0,14,11,16,20,0,23,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12881", + "name": "Battle robe bottom 80", + "examine": "A robe bottom infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "16000", + "high_alchemy": "24000", + "shop_price": "1000", + "grand_exchange_price": "364878", + "equipment_slot": "7", + "absorb": "5,2,0", + "bonuses": "0,0,0,20,0,14,11,16,20,0,23,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12882", + "name": "Battle robe bottom 60", + "examine": "A robe bottom infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "16000", + "high_alchemy": "24000", + "shop_price": "1000", + "grand_exchange_price": "364878", + "equipment_slot": "7", + "absorb": "5,2,0", + "bonuses": "0,0,0,20,0,14,11,16,20,0,23,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12883", + "name": "Battle robe bottom 40", + "examine": "A robe bottom infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "16000", + "high_alchemy": "24000", + "shop_price": "1000", + "grand_exchange_price": "364878", + "equipment_slot": "7", + "absorb": "5,2,0", + "bonuses": "0,0,0,20,0,14,11,16,20,0,23,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12884", + "name": "Battle robe bottom 20", + "examine": "A robe bottom infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "16000", + "high_alchemy": "24000", + "shop_price": "1000", + "grand_exchange_price": "364878", + "equipment_slot": "7", + "absorb": "5,2,0", + "bonuses": "0,0,0,20,0,14,11,16,20,0,23,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12885", + "name": "Battle robe bottom 0", + "examine": "A robe bottom infused with arcane power, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "16000", + "high_alchemy": "24000", + "shop_price": "1000", + "grand_exchange_price": "538000", + "equipment_slot": "7", + "absorb": "5,2,0", + "bonuses": "0,0,0,6,0,4,3,4,6,0,7,0,0,0,0", + "requirements": "{1,60}-{6,50}", + "weight": "3", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12886", + "name": "Battle robe bottom 0", + "tradeable": "false", + "grand_exchange_price": "538000", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12887", + "name": "Druidic mage hood 100", + "examine": "A worn-out hood, formerly worn by the followers of Guthix.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "100", + "grand_exchange_price": "6915", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12888", + "name": "Druidic mage hood 80", + "examine": "A worn-out hood, formerly worn by the followers of Guthix.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "100", + "grand_exchange_price": "6915", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12889", + "name": "Druidic mage hood 60", + "examine": "A worn-out hood, formerly worn by the followers of Guthix.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "100", + "grand_exchange_price": "6915", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12890", + "name": "Druidic mage hood 40", + "examine": "A worn-out hood, formerly worn by the followers of Guthix.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "100", + "grand_exchange_price": "6915", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12891", + "name": "Druidic mage hood 20", + "examine": "A worn-out hood, formerly worn by the followers of Guthix.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "100", + "grand_exchange_price": "6915", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12892", + "name": "Druidic mage hood 0", + "examine": "A worn-out hood, formerly worn by the followers of Guthix.", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "100", + "grand_exchange_price": "8504", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,1,0,0,0,0,1,0,1,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "7", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12893", + "name": "Druidic mage hood 0", + "tradeable": "false", + "grand_exchange_price": "8504", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12894", + "name": "Druidic mage top 100", + "examine": "A magical robe top worn by followers of Guthix.", + "low_alchemy": "2400", + "high_alchemy": "3600", + "shop_price": "300", + "grand_exchange_price": "80273", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,0,0,0,7,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12895", + "name": "Druidic mage top 80", + "examine": "A magical robe top worn by followers of Guthix.", + "low_alchemy": "2400", + "high_alchemy": "3600", + "shop_price": "300", + "grand_exchange_price": "80273", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,0,0,0,7,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12896", + "name": "Druidic mage top 60", + "examine": "A magical robe top worn by followers of Guthix.", + "low_alchemy": "2400", + "high_alchemy": "3600", + "shop_price": "300", + "grand_exchange_price": "80273", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,0,0,0,7,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12897", + "name": "Druidic mage top 40", + "examine": "A magical robe top worn by followers of Guthix.", + "low_alchemy": "2400", + "high_alchemy": "3600", + "shop_price": "300", + "grand_exchange_price": "80273", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,0,0,0,7,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12898", + "name": "Druidic mage top 20", + "examine": "A magical robe top worn by followers of Guthix.", + "low_alchemy": "2400", + "high_alchemy": "3600", + "shop_price": "300", + "grand_exchange_price": "80273", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,0,0,0,7,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12899", + "name": "Druidic mage top 0", + "examine": "A magical robe top worn by followers of Guthix.", + "low_alchemy": "2400", + "high_alchemy": "3600", + "shop_price": "300", + "grand_exchange_price": "76300", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12900", + "name": "Druidic mage top 0", + "tradeable": "false", + "grand_exchange_price": "76300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12901", + "name": "Druidic mage bottom 100", + "examine": "A magical robe bottom worn by a person who follows Guthix.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "54532", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,0,0,0,6,0,6,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12902", + "name": "Druidic mage bottom 80", + "examine": "A magical robe bottom worn by a person who follows Guthix.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "54532", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,0,0,0,6,0,6,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12903", + "name": "Druidic mage bottom 60", + "examine": "A magical robe bottom worn by a person who follows Guthix.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "54532", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,0,0,0,6,0,6,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12904", + "name": "Druidic mage bottom 40", + "examine": "A magical robe bottom worn by a person who follows Guthix.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "54532", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,0,0,0,6,0,6,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12905", + "name": "Druidic mage bottom 20", + "examine": "A magical robe bottom worn by a person who follows Guthix.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "54532", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,0,0,0,6,0,6,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12906", + "name": "Druidic mage bottom 0", + "examine": "A magical robe bottom worn by a person who follows Guthix.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "60800", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,2,0,0,0,0,2,0,2,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12907", + "name": "Druidic mage bottom 0", + "tradeable": "false", + "grand_exchange_price": "60800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12908", + "name": "Adamant spikeshield 100", + "examine": "A spiked square shield.", + "tradeable": "true", + "low_alchemy": "1620", + "high_alchemy": "2430", + "shop_price": "50", + "grand_exchange_price": "2271", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-6,-2,25,27,23,0,25,26,1,0,0,0", + "requirements": "{1,35}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12909", + "name": "Adamant spikeshield 80", + "examine": "A spiked square shield.", + "tradeable": "true", + "low_alchemy": "1620", + "high_alchemy": "2430", + "shop_price": "50", + "grand_exchange_price": "2271", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-6,-2,25,27,23,0,25,26,1,0,0,0", + "requirements": "{1,35}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12910", + "name": "Adamant spikeshield 60", + "examine": "A spiked square shield.", + "tradeable": "true", + "low_alchemy": "1620", + "high_alchemy": "2430", + "shop_price": "50", + "grand_exchange_price": "2271", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-6,-2,25,27,23,0,25,26,1,0,0,0", + "requirements": "{1,35}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12911", + "name": "Adamant spikeshield 40", + "examine": "A spiked square shield.", + "tradeable": "true", + "low_alchemy": "1620", + "high_alchemy": "2430", + "shop_price": "50", + "grand_exchange_price": "2271", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-6,-2,25,27,23,0,25,26,1,0,0,0", + "requirements": "{1,35}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12912", + "name": "Adamant spikeshield 20", + "examine": "A spiked square shield.", + "tradeable": "true", + "low_alchemy": "1620", + "high_alchemy": "2430", + "shop_price": "50", + "grand_exchange_price": "2271", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-6,-2,25,27,23,0,25,26,1,0,0,0", + "requirements": "{1,35}", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12913", + "name": "Adamant spikeshield 0", + "examine": "Not so spiky anymore.", + "tradeable": "true", + "low_alchemy": "1620", + "high_alchemy": "2430", + "shop_price": "50", + "grand_exchange_price": "2718", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-6,-2,11,12,10,0,11,4,1,0,0,0", + "requirements": "{1,35}", + "weight": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12914", + "name": "Adamant spikeshield 0", + "examine": "Not so spiky anymore!", + "tradeable": "true", + "grand_exchange_price": "2718", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12915", + "name": "Adamant berserker shield 100", + "examine": "A large, spiked metal shield", + "tradeable": "true", + "low_alchemy": "2456", + "high_alchemy": "3684", + "shop_price": "100", + "grand_exchange_price": "19190", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,28,32,30,-1,30,31,2,0,0,0", + "requirements": "{1,35}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12916", + "name": "Adamant berserker shield 80", + "examine": "A large, spiked metal shield", + "tradeable": "true", + "low_alchemy": "2456", + "high_alchemy": "3684", + "shop_price": "100", + "grand_exchange_price": "19190", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,28,32,30,-1,30,31,2,0,0,0", + "requirements": "{1,35}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12917", + "name": "Adamant berserker shield 60", + "examine": "A large, spiked metal shield", + "tradeable": "true", + "low_alchemy": "2456", + "high_alchemy": "3684", + "shop_price": "100", + "grand_exchange_price": "19190", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,28,32,30,-1,30,31,2,0,0,0", + "requirements": "{1,35}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12918", + "name": "Adamant berserker shield 40", + "examine": "A large, spiked metal shield", + "tradeable": "true", + "low_alchemy": "2456", + "high_alchemy": "3684", + "shop_price": "100", + "grand_exchange_price": "19190", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,28,32,30,-1,30,31,2,0,0,0", + "requirements": "{1,35}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12919", + "name": "Adamant berserker shield 20", + "examine": "A large, spiked metal shield", + "tradeable": "true", + "low_alchemy": "2456", + "high_alchemy": "3684", + "shop_price": "100", + "grand_exchange_price": "19190", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,28,32,30,-1,30,31,2,0,0,0", + "requirements": "{1,35}", + "weight": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12920", + "name": "Adamant berserker shield 0", + "examine": "Not so spiky anymore!", + "tradeable": "true", + "low_alchemy": "2456", + "high_alchemy": "3684", + "shop_price": "100", + "grand_exchange_price": "23700", + "equipment_slot": "5", + "absorb": "3,0,6", + "bonuses": "0,0,0,-8,-2,12,14,13,-1,8,4,1,0,0,0", + "requirements": "{1,35}", + "weight": "7", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12921", + "name": "Adamant berserker shield 0", + "examine": "Not so spiky anymore!", + "tradeable": "true", + "grand_exchange_price": "23700", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12922", + "name": "Rune spikeshield 100", + "examine": "A spiked square shield.", + "tradeable": "true", + "low_alchemy": "2576", + "high_alchemy": "3864", + "shop_price": "200", + "grand_exchange_price": "57548", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-6,-2,39,41,37,0,39,36,3,0,0,0", + "requirements": "{1,45}", + "weight": "4", + "point_price": "35", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12923", + "name": "Rune spikeshield 80", + "examine": "A spiked square shield.", + "tradeable": "true", + "low_alchemy": "2576", + "high_alchemy": "3864", + "shop_price": "200", + "grand_exchange_price": "57548", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-6,-2,39,41,37,0,39,36,3,0,0,0", + "requirements": "{1,45}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12924", + "name": "Rune spikeshield 60", + "examine": "Uncharged: Not so spiky anymore.", + "tradeable": "true", + "low_alchemy": "2576", + "high_alchemy": "3864", + "shop_price": "200", + "grand_exchange_price": "57548", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-6,-2,39,41,37,0,39,36,3,0,0,0", + "requirements": "{1,45}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12925", + "name": "Rune spikeshield 40", + "examine": "A spiked square shield.", + "tradeable": "true", + "low_alchemy": "2576", + "high_alchemy": "3864", + "shop_price": "200", + "grand_exchange_price": "57548", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-6,-2,39,41,37,0,39,36,3,0,0,0", + "requirements": "{1,45}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12926", + "name": "Rune spikeshield 20", + "examine": "A spiked square shield.", + "tradeable": "true", + "low_alchemy": "2576", + "high_alchemy": "3864", + "shop_price": "200", + "grand_exchange_price": "57548", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-6,-2,39,41,37,0,39,36,3,0,0,0", + "requirements": "{1,45}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12927", + "name": "Rune spikeshield 0", + "examine": "Not so spiky anymore.", + "tradeable": "true", + "low_alchemy": "2576", + "high_alchemy": "3864", + "shop_price": "200", + "grand_exchange_price": "50500", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-6,-2,14,15,13,0,14,8,2,0,0,0", + "requirements": "{1,45}", + "weight": "4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12928", + "name": "Rune spikeshield 0", + "examine": "Not so spiky anymore.", + "tradeable": "true", + "grand_exchange_price": "50500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12929", + "name": "Rune berserker shield 100", + "examine": "A Large, spiked metal shield.", + "tradeable": "true", + "low_alchemy": "25760", + "high_alchemy": "38640", + "shop_price": "300", + "grand_exchange_price": "82000", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,45,49,47,-1,47,41,4,0,0,0", + "requirements": "{1,45}", + "weight": "6", + "point_price": "35", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12930", + "name": "Rune berserker shield 80", + "examine": "A Large, spiked metal shield.", + "tradeable": "true", + "low_alchemy": "25760", + "high_alchemy": "38640", + "shop_price": "300", + "grand_exchange_price": "82000", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,45,49,47,-1,47,41,4,0,0,0", + "requirements": "{1,45}", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12931", + "name": "Rune berserker shield 60", + "examine": "A Large, spiked metal shield.", + "tradeable": "true", + "low_alchemy": "25760", + "high_alchemy": "38640", + "shop_price": "300", + "grand_exchange_price": "82000", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,45,49,47,-1,47,41,4,0,0,0", + "requirements": "{1,45}", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12932", + "name": "Rune berserker shield 40", + "examine": "A Large, spiked metal shield.", + "tradeable": "true", + "low_alchemy": "25760", + "high_alchemy": "38640", + "shop_price": "300", + "grand_exchange_price": "82000", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,45,49,47,-1,47,41,4,0,0,0", + "requirements": "{1,45}", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12933", + "name": "Rune berserker shield 20", + "examine": "A Large, spiked metal shield.", + "tradeable": "true", + "low_alchemy": "25760", + "high_alchemy": "38640", + "shop_price": "300", + "grand_exchange_price": "82000", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,45,49,47,-1,47,41,4,0,0,0", + "requirements": "{1,45}", + "weight": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12934", + "name": "Rune berserker shield 0", + "examine": "Not so spiky anymore.", + "tradeable": "true", + "low_alchemy": "25760", + "high_alchemy": "38640", + "shop_price": "300", + "grand_exchange_price": "135300", + "equipment_slot": "5", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,16,18,17,-1,17,9,2,0,0,0", + "requirements": "{1,45}", + "weight": "6", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12935", + "name": "Rune berserker shield 0", + "examine": "Not so spiky anymore.", + "tradeable": "true", + "grand_exchange_price": "135300", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12936", + "name": "Green d'hide coif 100", + "examine": "A coif made of green dragonhide.", + "tradeable": "false", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "150", + "grand_exchange_price": "88084", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,4,4,6,8,4,5,4,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12937", + "name": "Green d'hide coif 80", + "examine": "A coif made of green dragonhide.", + "tradeable": "false", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "150", + "grand_exchange_price": "88084", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,4,4,6,8,4,5,4,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12938", + "name": "Green d'hide coif 60", + "examine": "A coif made of green dragonhide.", + "tradeable": "false", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "150", + "grand_exchange_price": "88084", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,4,4,6,8,4,5,4,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12939", + "name": "Green d'hide coif 40", + "examine": "A coif made of green dragonhide.", + "tradeable": "false", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "150", + "grand_exchange_price": "88084", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,4,4,6,8,4,5,4,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12940", + "name": "Green d'hide coif 20", + "examine": "A coif made of green dragonhide.", + "tradeable": "false", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "150", + "grand_exchange_price": "88084", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,4,4,6,8,4,5,4,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "0.9", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12941", + "name": "Green d'hide coif 0", + "examine": "A worn out coif made of green dragonhide.", + "tradeable": "false", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "150", + "grand_exchange_price": "92700", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,1,1,2,2,1,2,1,0,0,0,0", + "requirements": "{1,40}-{4,40}", + "weight": "0.9", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12942", + "name": "Green d'hide coif 0", + "tradeable": "false", + "examine": "A worn out coif made of green dragonhide.", + "grand_exchange_price": "92700", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12943", + "name": "Blue d'hide coif 100", + "examine": "A coif made of blue dragonhide.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "186985", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,5,4,6,8,4,6,5,0,0,0,0", + "requirements": "{1,50}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12944", + "name": "Blue d'hide coif 80", + "examine": "A coif made of blue dragonhide.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "186985", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,5,4,6,8,4,6,5,0,0,0,0", + "requirements": "{1,50}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12945", + "name": "Blue d'hide coif 60", + "examine": "Fully charged: A coif made of blue dragonhide. Fully degraded: A worn out coif made of blue dragonhide.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "186985", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,5,4,6,8,4,6,5,0,0,0,0", + "requirements": "{1,50}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12946", + "name": "Blue d'hide coif 40", + "examine": "A coif made of blue dragonhide.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "186985", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,5,4,6,8,4,6,5,0,0,0,0", + "requirements": "{1,50}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12947", + "name": "Blue d'hide coif 20", + "examine": "A coif made of blue dragonhide.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "186985", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,5,4,6,8,4,6,5,0,0,0,0", + "requirements": "{1,50}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12948", + "name": "Blue d'hide coif 0", + "examine": "A worn out coif made of blue dragonhide.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "200", + "grand_exchange_price": "131900", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,1,1,2,2,1,2,2,0,0,0,0", + "requirements": "{1,50}-{4,40}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12949", + "name": "Blue d'hide coif 0", + "tradeable": "false", + "examine": "A worn out coif made of blue dragonhide.", + "grand_exchange_price": "131900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12950", + "name": "Red d'hide coif 100", + "examine": "A coif made of red dragonhide.", + "tradeable": "false", + "low_alchemy": "1400", + "high_alchemy": "2100", + "shop_price": "300", + "grand_exchange_price": "230059", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,6,4,6,9,4,6,6,0,0,0,0", + "requirements": "{1,60}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12951", + "name": "Red d'hide coif 80", + "examine": "A coif made of red dragonhide.", + "tradeable": "false", + "low_alchemy": "1400", + "high_alchemy": "2100", + "shop_price": "300", + "grand_exchange_price": "230059", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,6,4,6,9,4,6,6,0,0,0,0", + "requirements": "{1,60}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12952", + "name": "Red d'hide coif 60", + "examine": "Fully charged: A coif made of red dragonhide.Fully degraded: A worn out coif made of red dragonhide.", + "tradeable": "false", + "low_alchemy": "1400", + "high_alchemy": "2100", + "shop_price": "300", + "grand_exchange_price": "230059", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,6,4,6,9,4,6,6,0,0,0,0", + "requirements": "{1,60}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12953", + "name": "Red d'hide coif 40", + "examine": "A coif made of red dragonhide.", + "tradeable": "false", + "low_alchemy": "1400", + "high_alchemy": "2100", + "shop_price": "300", + "grand_exchange_price": "230059", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,6,4,6,9,4,6,6,0,0,0,0", + "requirements": "{1,60}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12954", + "name": "Red d'hide coif 20", + "examine": "A coif made of red dragonhide.", + "tradeable": "false", + "low_alchemy": "1400", + "high_alchemy": "2100", + "shop_price": "300", + "grand_exchange_price": "230059", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,6,4,6,9,4,6,6,0,0,0,0", + "requirements": "{1,60}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12955", + "name": "Red d'hide coif 0", + "examine": "A worn out coif made of red dragonhide.", + "tradeable": "false", + "low_alchemy": "1400", + "high_alchemy": "2100", + "shop_price": "300", + "grand_exchange_price": "156600", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,2,1,2,3,1,2,2,0,0,0,0", + "requirements": "{1,60}-{4,40}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12956", + "name": "Red d'hide coif 0", + "tradeable": "false", + "examine": "A worn out coif made of red dragonhide.", + "grand_exchange_price": "156600", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12957", + "name": "Black d'hide coif 100", + "examine": "A coif made of black dragonhide.", + "tradeable": "false", + "low_alchemy": "2200", + "high_alchemy": "3300", + "shop_price": "500", + "grand_exchange_price": "379555", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,7,4,7,9,4,7,7,0,0,0,0", + "requirements": "{1,70}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12958", + "name": "Black d'hide coif 80", + "examine": "A coif made of black dragonhide.", + "tradeable": "false", + "low_alchemy": "2200", + "high_alchemy": "3300", + "shop_price": "500", + "grand_exchange_price": "379555", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,7,4,7,9,4,7,7,0,0,0,0", + "requirements": "{1,70}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12959", + "name": "Black d'hide coif 60", + "examine": "A coif made of black dragonhide.", + "tradeable": "false", + "low_alchemy": "2200", + "high_alchemy": "3300", + "shop_price": "500", + "grand_exchange_price": "379555", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,7,4,7,9,4,7,7,0,0,0,0", + "requirements": "{1,70}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12960", + "name": "Black d'hide coif 40", + "examine": "A coif made of black dragonhide.", + "tradeable": "false", + "low_alchemy": "2200", + "high_alchemy": "3300", + "shop_price": "500", + "grand_exchange_price": "379555", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,7,4,7,9,4,7,7,0,0,0,0", + "requirements": "{1,70}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12961", + "name": "Black d'hide coif 20", + "examine": "Fully charged: A coif made of black dragonhide. Fully degraded: A worn out coif made of black dragonhide.", + "tradeable": "false", + "low_alchemy": "2200", + "high_alchemy": "3300", + "shop_price": "500", + "grand_exchange_price": "379555", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,7,4,7,9,4,7,7,0,0,0,0", + "requirements": "{1,70}-{4,40}", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12962", + "name": "Black d'hide coif 0", + "examine": "A coif made of black dragonhide.", + "tradeable": "false", + "low_alchemy": "2200", + "high_alchemy": "3300", + "shop_price": "500", + "grand_exchange_price": "229000", + "remove_head": "true", + "equipment_slot": "0", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,3,1,3,3,1,2,3,0,0,0,0", + "requirements": "{1,70}-{4,40}", + "weight": "1", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12963", + "name": "Black d'hide coif 0", + "tradeable": "false", + "examine": "A coif made of black dragonhide.", + "grand_exchange_price": "229000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12964", + "name": "Combat hood 100", + "examine": "A magical hood, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "50", + "grand_exchange_price": "5661", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,1,1,1,3,0,4,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12965", + "name": "Combat hood 80", + "examine": "A magical hood, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "50", + "grand_exchange_price": "5661", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,1,1,1,3,0,4,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12966", + "name": "Combat hood 60", + "examine": "A magical hood, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "50", + "grand_exchange_price": "5661", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,1,1,1,3,0,4,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12967", + "name": "Combat hood 40", + "examine": "A magical hood, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "50", + "grand_exchange_price": "5661", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,1,1,1,3,0,4,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12968", + "name": "Combat hood 20", + "examine": "A magical hood, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "50", + "grand_exchange_price": "5661", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,3,0,1,1,1,3,0,4,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12969", + "name": "Combat hood 0", + "examine": "A magical hood, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "50", + "grand_exchange_price": "6511", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,1,0,0,0,0,1,0,2,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "0.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12970", + "name": "Combat hood 0", + "tradeable": "false", + "grand_exchange_price": "6511", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12971", + "name": "Combat robe top 100", + "examine": "A magical robe top, especially made for combat spells.", + "tradeable": "false", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "150", + "grand_exchange_price": "37700", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,1,1,1,7,0,8,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12972", + "name": "Combat robe top 80", + "examine": "A magical robe top, especially made for combat spells.", + "tradeable": "false", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "150", + "grand_exchange_price": "37700", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,1,1,1,7,0,8,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12973", + "name": "Combat robe top 60", + "examine": "A magical robe top, especially made for combat spells.", + "tradeable": "false", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "150", + "grand_exchange_price": "37700", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,1,1,1,7,0,8,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12974", + "name": "Combat robe top 40", + "examine": "A magical robe top, especially made for combat spells.", + "tradeable": "false", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "150", + "grand_exchange_price": "37700", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,1,1,1,7,0,8,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12975", + "name": "Combat robe top 20", + "examine": "A magical robe top, especially made for combat spells.", + "tradeable": "false", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "150", + "grand_exchange_price": "37700", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,7,0,1,1,1,7,0,8,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12976", + "name": "Combat robe top 0", + "examine": "A magical robe top, especially made for combat spells.", + "tradeable": "false", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "150", + "grand_exchange_price": "61500", + "remove_sleeves": "true", + "equipment_slot": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,4,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "4", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12977", + "name": "Combat robe top 0", + "tradeable": "false", + "grand_exchange_price": "61500", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12978", + "name": "Combat robe bottom 100", + "examine": "A magical robe bottom, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "1000", + "high_alchemy": "1500", + "shop_price": "100", + "grand_exchange_price": "50200", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,1,1,1,6,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12979", + "name": "Combat robe bottom 80", + "examine": "A magical robe bottom, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "1000", + "high_alchemy": "1500", + "shop_price": "100", + "grand_exchange_price": "50200", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,1,1,1,6,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12980", + "name": "Combat robe bottom 60", + "examine": "A magical robe bottom, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "1000", + "high_alchemy": "1500", + "shop_price": "100", + "grand_exchange_price": "50200", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,1,1,1,6,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12981", + "name": "Combat robe bottom 40", + "examine": "A magical robe bottom, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "1000", + "high_alchemy": "1500", + "shop_price": "100", + "grand_exchange_price": "50200", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,1,1,1,6,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12982", + "name": "Combat robe bottom 20", + "examine": "A magical robe bottom, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "1000", + "high_alchemy": "1500", + "shop_price": "100", + "grand_exchange_price": "50200", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,6,0,1,1,1,6,0,7,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12983", + "name": "Combat robe bottom 0", + "examine": "A magical robe bottom, especially created for combat spells.", + "tradeable": "false", + "low_alchemy": "1000", + "high_alchemy": "1500", + "shop_price": "100", + "grand_exchange_price": "47800", + "equipment_slot": "7", + "absorb": "1,0,0", + "bonuses": "0,0,0,2,0,0,0,0,2,0,3,0,0,0,0", + "requirements": "{1,20}-{6,10}", + "weight": "3", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12984", + "name": "Combat robe bottom 0", + "tradeable": "false", + "grand_exchange_price": "47800", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12985", + "name": "Bronze gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "3694", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,2,3,3,-1,2,2,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12986", + "name": "Worn-out bronze gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "15", + "grand_exchange_price": "3275", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,0,1,1,-1,0,1,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12987", + "name": "Worn-out bronze gauntlets", + "tradeable": "false", + "grand_exchange_price": "3275", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12988", + "name": "Iron gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "30", + "grand_exchange_price": "17339", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,3,4,4,-1,3,3,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12989", + "name": "Worn-out iron gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "120", + "high_alchemy": "180", + "shop_price": "30", + "grand_exchange_price": "16000", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,0,1,1,-1,0,1,0,0,0,0", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12990", + "name": "Worn-out iron gauntlets", + "tradeable": "false", + "grand_exchange_price": "16000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12991", + "name": "Steel gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "50", + "grand_exchange_price": "29844", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,4,5,5,-1,4,4,0,0,0,0", + "requirements": "{1,5}", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12992", + "name": "Worn-out steel gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "400", + "high_alchemy": "600", + "shop_price": "50", + "grand_exchange_price": "27000", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,1,1,1,-1,1,1,0,0,0,0", + "requirements": "{1,5}", + "weight": "10", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12993", + "name": "Worn-out steel gauntlets", + "tradeable": "false", + "grand_exchange_price": "27000", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12994", + "name": "Black gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "75", + "grand_exchange_price": "50808", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,5,6,6,-1,5,5,0,0,0,0", + "requirements": "{1,10}", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12995", + "name": "Worn-out black gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "800", + "high_alchemy": "1200", + "shop_price": "75", + "grand_exchange_price": "40100", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,1,2,2,-1,1,1,0,0,0,0", + "requirements": "{1,10}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12996", + "name": "Worn-out black gauntlets", + "tradeable": "false", + "grand_exchange_price": "40100", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12997", + "name": "Mithril gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "100", + "grand_exchange_price": "60064", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,6,7,7,-1,6,6,0,0,0,0", + "requirements": "{1,20}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12998", + "name": "Worn-out mithril gauntlets", + "examine": "I have to keep my hands safe!", + "low_alchemy": "1200", + "high_alchemy": "1800", + "shop_price": "100", + "grand_exchange_price": "54200", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,2,2,2,-1,2,2,0,0,0,0", + "requirements": "{1,20}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "12999", + "name": "Worn-out mithril gauntlets", + "tradeable": "false", + "grand_exchange_price": "54200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13000", + "name": "Adamant gauntlets", + "examine": "I have to keep my hands safe! Uncharged: A bit worse for wear.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "150", + "grand_exchange_price": "74526", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,8,9,9,-1,8,8,1,0,0,0", + "requirements": "{1,30}", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13001", + "name": "Worn-out adamant gauntlets", + "examine": "I have to keep my hands safe! Uncharged: A bit worse for wear.", + "tradeable": "false", + "low_alchemy": "2000", + "high_alchemy": "3000", + "shop_price": "150", + "grand_exchange_price": "71500", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,2,3,3,-1,2,2,0,0,0,0", + "requirements": "{1,30}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13002", + "name": "Worn-out adamant gauntlets", + "tradeable": "false", + "grand_exchange_price": "71500", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13003", + "name": "Rune gauntlets", + "examine": "Fully charged: I have to keep my hands safe! Worn-Out: A bit worse for wear.", + "low_alchemy": "3000", + "high_alchemy": "4500", + "shop_price": "200", + "grand_exchange_price": "95700", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,10,11,11,-1,10,10,2,0,0,0", + "requirements": "{1,40}", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13004", + "name": "Worn-out rune gauntlets", + "examine": "Fully charged: I have to keep my hands safe! Worn-Out: A bit worse for wear.", + "low_alchemy": "3000", + "high_alchemy": "4500", + "shop_price": "200", + "grand_exchange_price": "99900", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,3,4,4,-1,3,3,0,0,0,0", + "requirements": "{1,40}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13005", + "name": "Worn-out rune gauntlets", + "tradeable": "false", + "grand_exchange_price": "99900", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13006", + "name": "Dragon gauntlets", + "examine": "Uncharged: A bit worse for wear. Charged: I have to keep my hands safe!", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "300", + "grand_exchange_price": "214700", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,14,15,15,-1,14,14,3,0,0,0", + "requirements": "{1,60}", + "weight": "0.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13007", + "name": "Worn-out dragon gauntlets", + "examine": "Uncharged: A bit worse for wear. Charged: I have to keep my hands safe!", + "low_alchemy": "20000", + "high_alchemy": "30000", + "shop_price": "300", + "grand_exchange_price": "166200", + "equipment_slot": "9", + "bonuses": "0,0,0,-1,-1,4,5,5,-1,4,4,1,0,0,0", + "requirements": "{1,60}", + "weight": "0.2", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13008", + "name": "Worn-out dragon gauntlets", + "tradeable": "false", + "grand_exchange_price": "166200", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13010", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13011", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13012", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13013", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13014", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13015", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13016", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13017", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13018", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13019", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13020", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13021", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13022", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13023", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13024", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13025", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13026", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13027", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13028", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13029", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13030", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13031", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13032", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13033", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13034", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13035", + "name": "Puzzle box", + "examine": "I need to solve this.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy_message": "You can reclaim this item from the place you found it.", + "shop_price": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13036", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13037", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13038", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13039", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13040", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13041", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13042", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13043", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13044", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13045", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13046", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13047", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13048", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13049", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13050", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13051", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13052", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13053", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13054", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13055", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13056", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13057", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13058", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13059", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13060", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13061", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13062", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13063", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13064", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13065", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13066", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13067", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13068", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13069", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13070", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13071", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13072", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13074", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13075", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13076", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13077", + "name": "Casket", + "examine": "I hope there's treasure in it.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "grand_exchange_price": "3726", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13078", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13079", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13080", + "name": "Clue scroll", + "examine": "Depends on the type of clue you have(\"A set of instructions to be followed\". \"A clue!\".\"It points to great treasure!\". \" A place on the world map,but where?\", \"Perhaps someone at the observatory can teach me to navigate?\" \"Part of the world map, but whe", + "shop_price": "5000", + "tradeable": "false", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13081", + "name": "Black crossbow", + "examine": "A black crossbow.", + "tradeable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "261", + "stand_anim": "4591", + "stand_turn_anim": "823", + "walk_anim": "4226", + "run_anim": "4228", + "turn180_anim": "4227", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "175", + "equipment_slot": "3", + "attack_speed": "6", + "bonuses": "0,0,0,0,60,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "attack_audios": "2700,0,0,0", + "requirements": "{4,33}", + "weight": "5", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13082", + "name": "Black crossbow", + "tradeable": "true", + "grand_exchange_price": "261", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13083", + "name": "Black bolts", + "examine": "Black crossbow bolts.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "grand_exchange_price": "55", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,75", + "requirements": "{4,33}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13084", + "name": "Black bolts(p)", + "examine": "Black crossbow bolts.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "grand_exchange_price": "141", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,75", + "requirements": "{4,33}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13085", + "name": "Black bolts(p+)", + "examine": "Black crossbow bolts.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "grand_exchange_price": "233", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,75", + "requirements": "{4,33}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13086", + "name": "Black bolts(p++)", + "examine": "Black crossbow bolts.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "grand_exchange_price": "1690", + "equipment_slot": "13", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,75", + "requirements": "{4,33}", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13095", + "name": "Black cane", + "examine": "A sapphire-topped cane.", + "tradeable": "true", + "low_alchemy": "172", + "high_alchemy": "258", + "grand_exchange_price": "77000", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-2,16,0,0,0,0,0,0,0,0,13,2,0,0", + "weapon_interface": "10", + "requirements": "{0,8}", + "weight": "0.5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13096", + "name": "Black cane", + "tradeable": "true", + "grand_exchange_price": "77000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13097", + "name": "Adamant cane", + "examine": "A ruby-topped cane.", + "tradeable": "true", + "low_alchemy": "576", + "high_alchemy": "864", + "grand_exchange_price": "19100", + "equipment_slot": "3", + "bonuses": "0,-2,25,0,0,0,0,0,0,0,0,23,3,0,0", + "weapon_interface": "10", + "requirements": "{0,28}", + "weight": "0.5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13098", + "name": "Adamant cane", + "tradeable": "true", + "grand_exchange_price": "19100", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13099", + "name": "Rune cane", + "examine": "A diamond-topped cane.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "5760", + "high_alchemy": "8640", + "grand_exchange_price": "14500", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-2,39,0,0,0,0,0,0,0,0,36,4,0,0", + "weapon_interface": "10", + "requirements": "{0,38}", + "weight": "0.5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13100", + "name": "Rune cane", + "tradeable": "true", + "grand_exchange_price": "14500", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13101", + "name": "Top hat", + "examine": "Comes with a free rabbit!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "160400", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13102", + "name": "Top hat", + "tradeable": "true", + "grand_exchange_price": "160400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13103", + "name": "Pith helmet", + "examine": "Official explorer headgear!", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "85400", + "equipment_slot": "0", + "weight": "0.5", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13104", + "name": "Pith helmet", + "tradeable": "true", + "grand_exchange_price": "85400", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13105", + "name": "Spiked helmet", + "examine": "Spikier than normal.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "38300", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "requirements": "{1,5}", + "weight": "10", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13106", + "name": "Spiked helmet", + "tradeable": "true", + "grand_exchange_price": "38300", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13107", + "name": "Sheep mask", + "examine": "Shear elegance.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "296700", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13108", + "name": "Sheep mask", + "tradeable": "true", + "grand_exchange_price": "296700", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13109", + "name": "Penguin mask", + "examine": "I can get the look right, but can I do the waddle too?", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "633600", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13110", + "name": "Penguin mask", + "tradeable": "true", + "grand_exchange_price": "633600", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13111", + "name": "Bat mask", + "examine": "The bats have left the belltower.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "399000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13112", + "name": "Bat mask", + "tradeable": "true", + "grand_exchange_price": "399000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13113", + "name": "Cat mask", + "examine": "It's the year of the cat!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "1200000", + "remove_head": "true", + "equipment_slot": "0", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13114", + "name": "Cat mask", + "tradeable": "true", + "grand_exchange_price": "1200000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13115", + "name": "Wolf mask", + "examine": "I'm hungry like the wolf.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "1500000", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13116", + "name": "Wolf mask", + "tradeable": "true", + "grand_exchange_price": "1500000", + "ge_buy_limit": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13117", + "name": "Ivandis flail (30)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "attack_anims": "9097,9097,9097,9097", + "defence_anim": "9048", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13118", + "name": "Ivandis flail (29)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13119", + "name": "Ivandis flail(28)", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13120", + "name": "Ivandis flail (27)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13121", + "name": "Ivandis flail (26)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13122", + "name": "Ivandis flail (25)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13123", + "name": "Ivandis flail (24)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13124", + "name": "Ivandis flail (23)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13125", + "name": "Ivandis flail (22)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13126", + "name": "Ivandis flail (21)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13127", + "name": "Ivandis flail (20)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13128", + "name": "Ivandis flail (19)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13129", + "name": "Ivandis flail (18)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13130", + "name": "Ivandis flail (17)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13131", + "name": "Ivandis flail (16)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13132", + "name": "Ivandis flail (15)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13133", + "name": "Ivandis flail (14)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13134", + "name": "Ivandis flail (13)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13135", + "name": "Ivandis flail (12)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13136", + "name": "Ivandis flail (11)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13137", + "name": "Ivandis flail (10)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13138", + "name": "Ivandis flail (9)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13139", + "name": "Ivandis flail (8)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13140", + "name": "Ivandis flail (7)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13141", + "name": "Ivandis flail (6)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13142", + "name": "Ivandis flail (5)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13143", + "name": "Ivandis flail (4)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13144", + "name": "Ivandis flail (3)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13145", + "name": "Ivandis flail (2)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13146", + "name": "Ivandis flail (1)", + "examine": "At 30: A fully charged flail. At 29-6 charges: A partially charged flail. At 5-2 charges: A partially charged flail - it's nearly out of charges. At 1 charge: A partially charged flail - one last charge left.", + "low_alchemy": "400", + "high_alchemy": "600", + "stand_anim": "9049", + "stand_turn_anim": "823", + "walk_anim": "9051", + "run_anim": "9050", + "turn180_anim": "9052", + "turn90cw_anim": "9053", + "turn90ccw_anim": "9054", + "render_anim": "712", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,16,11,6,0,2,3,1,6,0,0,26,5,0,0", + "weapon_interface": "23", + "has_special": "true", + "two_handed": "true", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13147", + "name": "Flail dust", + "examine": "Flail of Ivandis dust.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13149", + "name": "Book page", + "examine": "A page ripped from a book; it looks like a map of some kind.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You found this page in the top floor of Paterdomus temple on an old table.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13151", + "name": "Combat book", + "examine": "A big book of combat techniques.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You got this book from a bunk bed in Sanguinesti Myreque base.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13153", + "name": "Chain link mould", + "examine": "Used to make a metal chain.", + "low_alchemy": "1", + "high_alchemy": "1", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13154", + "name": "Silvthril chain", + "examine": "A chain made from mithril and silver.", + "low_alchemy": "1", + "high_alchemy": "1", + "weight": "3", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13155", + "name": "Silver sickle emerald(b)", + "examine": "A blessed sickle with an emerald recessed into it.", + "low_alchemy": "1", + "high_alchemy": "1", + "equipment_slot": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13156", + "name": "Enchanted sickle emerald(b)", + "examine": "A blessed and enchanted silver sickle with an emerald recessed into it.", + "low_alchemy": "1", + "high_alchemy": "1", + "equipment_slot": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13157", + "name": "Vyre corpse", + "examine": "A Vyrewatch corpse. Just a husk, really.", + "low_alchemy": "1", + "high_alchemy": "1", + "weight": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13158", + "name": "Columbarium key", + "examine": "An ornate key: precise workmanship and an ethereal glow. (Legacy of Seergaze)", + "weight": "0.1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13159", + "name": "Ornate tomb key", + "examine": "An ornate key: precise workmanship and an ethereal glow. (Legacy of Seergaze)", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You got this key by cremating a Vyrewatch in the Paterdomus Columbarium.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13160", + "name": "Tome of xp 2nd ed (3)", + "examine": "A Tome of Experience (2nd Edition) that awards 2500 XP per chapter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Tome of Experience from Veliaf in Burgh de Rott.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13161", + "name": "Tome of xp 2nd ed (2)", + "examine": "A Tome of Experience (2nd Edition) that awards 2500 XP per chapter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Tome of Experience from Veliaf in Burgh de Rott.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13162", + "name": "Tome of xp 2nd ed (1)", + "examine": "A Tome of Experience (2nd Edition) that awards 2500 XP per chapter.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another Tome of Experience from Veliaf in Burgh de Rott.", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13163", + "name": "Black cane", + "examine": "A sapphire-topped cane.", + "tradeable": "true", + "low_alchemy": "172", + "high_alchemy": "258", + "grand_exchange_price": "115390", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-2,16,0,0,0,0,0,0,0,0,13,2,0,0", + "weapon_interface": "10", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13164", + "name": "Adamant cane", + "examine": "A ruby-topped cane.", + "tradeable": "true", + "low_alchemy": "576", + "high_alchemy": "864", + "grand_exchange_price": "18514", + "equipment_slot": "3", + "bonuses": "0,-2,25,0,0,0,0,0,0,0,0,23,3,0,0", + "weapon_interface": "10", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13165", + "name": "Rune cane", + "examine": "A diamond-topped cane.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "5760", + "high_alchemy": "8640", + "grand_exchange_price": "15023", + "equipment_slot": "3", + "attack_speed": "5", + "bonuses": "0,-2,39,0,0,0,0,0,0,0,0,36,4,0,0", + "weapon_interface": "10", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13166", + "name": "Top hat", + "examine": "Comes with a free rabbit!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "grand_exchange_price": "425919", + "equipment_slot": "0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13167", + "name": "Pith helmet", + "examine": "Official explorer headgear!", + "tradeable": "true", + "low_alchemy": "100", + "high_alchemy": "150", + "grand_exchange_price": "99682", + "remove_head": "true", + "equipment_slot": "0", + "weight": "0.5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13168", + "name": "Spiked helmet", + "examine": "Spikier than normal.", + "tradeable": "true", + "low_alchemy": "400", + "high_alchemy": "600", + "grand_exchange_price": "39643", + "remove_head": "true", + "equipment_slot": "0", + "bonuses": "0,0,0,-6,-2,9,10,7,-1,9,3,0,0,0,0", + "weight": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13169", + "name": "Sheep mask", + "examine": "Shear elegance.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "313558", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13170", + "name": "Penguin mask", + "examine": "I can get the look right, but can I do the waddle too?", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "609515", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13171", + "name": "Bat mask", + "examine": "The bats have left the belltower.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "371616", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13172", + "name": "Cat mask", + "examine": "It's the year of the cat!", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "1066648", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13173", + "name": "Wolf mask", + "examine": "I'm hungry like the wolf.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "grand_exchange_price": "1303443", + "remove_head": "true", + "equipment_slot": "0", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13174", + "name": "Blue navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13175", + "name": "Green navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13176", + "name": "Red navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13177", + "name": "Brown navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13178", + "name": "Black navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13179", + "name": "Purple navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13180", + "name": "Grey navy slacks", + "examine": "Not for slackers", + "low_alchemy": "40", + "high_alchemy": "60", + "shop_price": "100", + "equipment_slot": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13181", + "name": "Blue naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13182", + "name": "Green naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13183", + "name": "Red naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13184", + "name": "Brown naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13185", + "name": "Black naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13186", + "name": "Purple naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13187", + "name": "Grey naval shirt", + "examine": "...You can sail the seven seas...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "shop_price": "100", + "remove_sleeves": "true", + "equipment_slot": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13188", + "name": "Blue tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13189", + "name": "Green tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13190", + "name": "Red tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13191", + "name": "Brown tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13192", + "name": "Black tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13193", + "name": "Purple tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13194", + "name": "Grey tricorn hat", + "examine": "I could never look square in this.", + "low_alchemy": "20", + "high_alchemy": "30", + "shop_price": "50", + "remove_head": "true", + "equipment_slot": "0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13227", + "name": "Mysterious lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy_message": "If you drop this lamp, it will be destroyed. You can obtain another from Dunstan.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13230", + "name": "Icefiend net", + "examine": "Professor Arblenap gave you this net to catch the baby icefiends on Ice Mountain.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another net from Professor Arblenap on Ice Mountain.", + "equipment_slot": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13231", + "name": "Baby icefiend", + "examine": "You should give this to Professor Arblenap.", + "destroy": "true", + "tradeable": "false", + "equipment_slot": "3", + "weight": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13232", + "name": "Tent", + "examine": "The remains of the Oracle's tent on Ice Mountain.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "It will reappear near the bottom of Ice Mountain.", + "weight": "30", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13234", + "name": "Dwarven key", + "examine": "You took this key from Drorkar's pocket in the power station. (Perils of Ice Mountain)", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get it back by pickpocketing Drorkar again.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13238", + "name": "Treated oak plank", + "examine": "A plank of oak that has been treated to resist fire.", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13239", + "name": "Chisel", + "examine": "Good for detailed crafting.", + "tradeable": "true", + "low_alchemy": "5", + "high_alchemy": "8", + "shop_price": "14", + "grand_exchange_price": "33", + "weight": "0.4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13240", + "name": ".", + "tradeable": "true", + "equipment_slot": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13241", + "name": "Treated plank", + "examine": "A plank of oak that has been treated to resist fire.", + "weight": "0.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13242", + "name": ".", + "tradeable": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13243", + "name": "Stone tablet", + "examine": "An old stone slab with writing on it.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13244", + "name": "Tzhaar tourist guide", + "examine": "A book for those who want to visit the TzHaar city.", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13245", + "name": "Stone slab", + "examine": "A flawed block of obsidian from the Karamja volcano.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can mine more stone slabs in the TzHaar mine.", + "weight": "32", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13246", + "name": "Pillar", + "examine": "A support pillar.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get more pillars by crafting stone slabs from the TzHaar mine.", + "weight": "25", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13247", + "name": "Splat", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13248", + "name": "Splat", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13249", + "name": "Splat", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13250", + "name": "Splat", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13259", + "name": "Ranged path key", + "examine": "A key obtained in Catolax's tomb.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another from the mummy guardian in the undead slayer's tomb.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13260", + "name": "Magic path key", + "examine": "A key obtained in Catolax's tomb.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can obtain another from the mummy guardian in the undead slayer's tomb.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13263", + "name": "Slayer helmet", + "examine": "You don't want to wear it inside-out.", + "low_alchemy": "260", + "high_alchemy": "390", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "650", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,30,32,27,0,30,7,0,0,0,0", + "requirements": "{1,10}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13276", + "name": "Banshee voice", + "examine": "The remains of a banshee's scream.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13277", + "name": "Masked earmuffs", + "examine": "More of that crazy Slayer headgear.", + "low_alchemy": "160", + "high_alchemy": "240", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "400", + "remove_beard": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13278", + "name": "Broad arrow heads", + "examine": "For use against turoth and kurasks.", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "50", + "grand_exchange_price": "89", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13279", + "name": "Unfinished broad bolts", + "examine": "For use against turoth and kurasks.", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "50", + "grand_exchange_price": "17", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13280", + "name": "Broad-tipped bolts", + "examine": "For use against turoth and kurasks.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "50", + "grand_exchange_price": "34", + "equipment_slot": "13", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,135", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13281", + "name": "Ring of slaying(8)", + "examine": "An enchanted ring.", + "low_alchemy": "60", + "high_alchemy": "90", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13282", + "name": "Ring of slaying(7)", + "examine": "An enchanted ring.", + "low_alchemy": "60", + "high_alchemy": "90", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13283", + "name": "Ring of slaying(6)", + "examine": "An enchanted ring.", + "low_alchemy": "60", + "high_alchemy": "90", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13284", + "name": "Ring of slaying(5)", + "examine": "An enchanted ring.", + "low_alchemy": "60", + "high_alchemy": "90", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13285", + "name": "Ring of slaying(4)", + "examine": "An enchanted ring.", + "low_alchemy": "60", + "high_alchemy": "90", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13286", + "name": "Ring of slaying(3)", + "examine": "An enchanted ring.", + "low_alchemy": "60", + "high_alchemy": "90", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13287", + "name": "Ring of slaying(2)", + "examine": "An enchanted ring.", + "low_alchemy": "60", + "high_alchemy": "90", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13288", + "name": "Ring of slaying(1)", + "examine": "An enchanted ring.", + "low_alchemy": "60", + "high_alchemy": "90", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13290", + "name": "Leaf-bladed sword", + "examine": "A razor-sharp sword.", + "low_alchemy": "27200", + "high_alchemy": "40800", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "68000", + "grand_exchange_price": "43082", + "stand_anim": "813", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "67,62,0,0,0,0,0,0,0,0,0,50,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,381,390,381", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,55}-{18,50}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13291", + "name": "Leaf-bladed sword", + "examine": "A razor-sharp sword.", + "tradeable": "true", + "low_alchemy": "27200", + "high_alchemy": "40800", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "68000", + "grand_exchange_price": "43082", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13292", + "name": "Letter", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13293", + "name": "Plans", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13294", + "name": "Charcoal rubbing", + "examine": "A charcoal rubbing taken from 50% Luke.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop these plans, they will be lost and you will need to see Captain Donnie for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13295", + "name": "Frank's mark", + "examine": "Signature from Frank.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop Frank's mark, you will need to see him to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13296", + "name": "Crude lockpick", + "examine": "A device for opening locked doors.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop these lockpicks, you will need to look under the mattress to get another set.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13297", + "name": "Customs shirt", + "examine": "The top of a Custom Officer's uniform.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this shirt you will need to kill another Customs officer for a replacement.", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13298", + "name": "Customs trousers", + "examine": "The trousers of a Custom Officer's uniform.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop these trousers you will need to kill another Customs officer for a replacement.", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13299", + "name": "Customs hat", + "examine": "The hat of a Custom Officer's uniform.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this hat you will need to kill another Customs officer for a replacement.", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13300", + "name": "File", + "examine": "A folder containing all the marks I have gathered.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this file, it and all the marks inside it will be destroyed.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13301", + "name": "File", + "examine": "A folder containing all the marks I have gathered.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this file, it and all the marks inside it will be destroyed.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13302", + "name": "Brooch", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13303", + "name": "Izzy's mark", + "examine": "Signature from Izzy No-Beard.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop Izzy's No-Beard's mark, you will need to see him to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13304", + "name": "Key", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13305", + "name": "Crowbar", + "examine": "This could be useful.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this crowbar, you will need to get another from the chest on the sunken ship.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13307", + "name": "Idol of many heads", + "examine": "An idol. It has many heads.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop the idol, you will need to go diving to get another replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13308", + "name": "Bill teach's mark", + "examine": "Signature from Bill Teach.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop Bill Teach's mark, you will need to see him to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13309", + "name": "Paper", + "examine": "This is generally used for writing on.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this paper, you will need to call to the guards for a replacement. ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13310", + "name": "Confession", + "examine": "A written confession.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this note, you'll need to call the guards for replacement paper.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13311", + "name": "Note", + "examine": "Swap this note at any bank for the equivalent item.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13312", + "name": "Ink bottle", + "examine": "An empty ink bottle./This is full of ink.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this ink, you will need to call to the guards for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13313", + "name": "Inky paper", + "examine": "It's got ink all over it.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this paper you will need to call to the guards to replace it and the ink.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13314", + "name": "Ink bottle", + "examine": "An empty ink bottle./This is full of ink.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this ink, you will need to call to the guards for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13315", + "name": "Smashed bottle", + "examine": "It's smashed. I should mind my fingers.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this bottle, you will need to call to the guards for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13316", + "name": "Prison uniform top", + "examine": "The top part of a prisoner's uniform.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this top, then you will need to speak to the guards to get it replaced.", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13317", + "name": "Prison uniform trousers", + "examine": "The bottom part of a prisoner's uniform.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop these trousers, then you will need to speak to the guards to get it replaced.", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13318", + "name": "Fishy prison uniform top", + "examine": "It's covered in fish slop.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this top, you will need to speak to the guards to get it replaced, then find a way to get stew on it again.", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13319", + "name": "Tin cup", + "examine": "A standard prison-issue tin cup.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this cup it will be destroyed and you will have to pick up another.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13320", + "name": "Tin cup", + "examine": "A standard prison-issue tin cup.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this cup it will be destroyed and you will have to pick up another.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13321", + "name": "Pipe", + "examine": "A pipe that belongs in a cannon stand.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Destroy", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13322", + "name": "Accordion", + "examine": "", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this accordion, it will be destroyed and you will have to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13323", + "name": "Accordion", + "examine": "", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this accordion, it will be destroyed and you will have to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13324", + "name": "Accordion", + "examine": "", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this accordion, it will be destroyed and you will have to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13325", + "name": "Vacuum pump", + "examine": "A very crude vacuum pump.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this accordion, pipe and inky paper, it will all be destroyed and you will need to get all the items back again.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13326", + "name": "Vacuum pump and gull", + "examine": "It sounds like a law firm.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this, you will lose all the items you put in it, as well as the seagull.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13327", + "name": "Quill", + "examine": "From a bird - can be used for writing.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this quill, you will need to talk to the guard for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13328", + "name": "Inky quill", + "examine": "From a bird - can be used for writing. It has some ink on the tip.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Unknown ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13329", + "name": "File", + "examine": "A folder containing all the marks I have gathered.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this file, it and all the marks inside it will be destroyed.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13330", + "name": "File", + "examine": "A folder containing all the marks I have gathered.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this file, it and all the marks inside it will be destroyed.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13331", + "name": "Ex-parrot", + "examine": "A very dead rotten parrot.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this dead parrot, there is a chance that bad, bad things will happen to you - unless you see 50 Ships Mufassah for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13332", + "name": "Magical cage", + "examine": "It feels very cold to the touch.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this cage, you will need to see Bill Teach for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13333", + "name": "Ex-parrot in a magic cage", + "examine": "A very dead rotten parrot in a magical cage.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this dead parrot in a cage (and who wouldn't) then you will need to see ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13334", + "name": "Ex-ex-parrot in a magic cage", + "examine": "A very alive rotten parrot in a magic cage.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop the cage, the ex-ex-parrot will escape.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13335", + "name": "Ex-ex-parrot", + "examine": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13336", + "name": "Ex-ex-parrot", + "examine": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13337", + "name": "Pirate impling jar", + "examine": "A pirate impling in a jar.", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "shop_price": "50", + "grand_exchange_price": "7346", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13338", + "name": "Pirate impling jar", + "examine": "A pirate impling in a jar.", + "tradeable": "true", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this it will disappear. Are you sure you want to do this?", + "shop_price": "50", + "grand_exchange_price": "7346", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13339", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13340", + "name": "Bandana and eyepatches", + "examine": "A (colour) bandana and a patch for both eyes.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13341", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13342", + "name": "Bandana and eyepatches", + "examine": "A (colour) bandana and a patch for both eyes.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13343", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13344", + "name": "Bandana and eyepatches", + "examine": "A (colour) bandana and a patch for both eyes.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13345", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13346", + "name": "Bandana and eyepatches", + "examine": "A (colour) bandana and a patch for both eyes.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13347", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13348", + "name": "Bandana and eyepatches", + "examine": "A (colour) bandana and a patch for both eyes.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13349", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13350", + "name": "Bandana and eyepatches", + "examine": "A (colour) bandana and a patch for both eyes.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13351", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13352", + "name": "Bandana and eyepatches", + "examine": "A (colour) bandana and a patch for both eyes.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13353", + "name": "Double eyepatches", + "examine": "It's dark, and I'm wearing two patches. Hit it!", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13354", + "name": "Pirate hat and eyepatches", + "examine": "Two patches and a hat.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13355", + "name": "Left eyepatch", + "examine": "A patch for the left eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "grand_exchange_price": "23485", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13356", + "name": "Left eyepatch", + "examine": "A patch for the left eye.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "grand_exchange_price": "23485", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13357", + "name": "Pirate hat and eyepatch", + "examine": "A hat and a patch.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13358", + "name": "Stripy pirate shirt", + "examine": "", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "300", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13359", + "name": "Stripy pirate shirt", + "examine": "", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "300", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13360", + "name": "Stripy pirate shirt", + "examine": "", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "300", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13361", + "name": "Stripy pirate shirt", + "examine": "", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "300", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13362", + "name": "Stripy pirate shirt", + "examine": "", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "300", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13363", + "name": "Stripy pirate shirt", + "examine": "", + "tradeable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "300", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13364", + "name": "Pirate leggings", + "examine": "", + "low_alchemy": "140", + "high_alchemy": "210", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "350", + "grand_exchange_price": "1", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13365", + "name": "Pirate leggings", + "examine": "", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "350", + "grand_exchange_price": "1", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13366", + "name": "Pirate leggings", + "examine": "", + "low_alchemy": "140", + "high_alchemy": "210", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "350", + "grand_exchange_price": "1", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13367", + "name": "Pirate leggings", + "examine": "", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "350", + "grand_exchange_price": "1", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13368", + "name": "Pirate leggings", + "examine": "", + "low_alchemy": "140", + "high_alchemy": "210", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "350", + "grand_exchange_price": "1", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13369", + "name": "Pirate leggings", + "examine": "", + "tradeable": "true", + "low_alchemy": "140", + "high_alchemy": "210", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "350", + "grand_exchange_price": "1", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13370", + "name": "Bandana", + "examine": "Essential pirate wear.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13371", + "name": "Bandana", + "examine": "Essential pirate wear.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13372", + "name": "Bandana", + "examine": "Essential pirate wear.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13373", + "name": "Bandana", + "examine": "Essential pirate wear.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13374", + "name": "Bandana", + "examine": "Essential pirate wear.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13375", + "name": "Bandana", + "examine": "Essential pirate wear.", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13376", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13377", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13378", + "name": "Bandana and eyepatch", + "examine": "A (colour) bandana and a patch for the right eye.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "100", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13379", + "name": "Rock fragments", + "examine": "Some rock fragments.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Destroy", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13380", + "name": "Introduction letter", + "examine": "Note from Teach to Brass Hand Harry.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop the letter, it will be destroyed and you'll need to see Bill Teach for another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13381", + "name": "Broken hand", + "examine": "One of many broken hands.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The hand is already broken and dropping it will destroy it completely. You will need to see Brass Hand Harry for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13382", + "name": "Broken hand", + "examine": "One of many broken hands.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The hand is already broken and dropping it will destroy it completely. You will need to see Brass Hand Harry for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13383", + "name": "Broken hand", + "examine": "One of many broken hands.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The hand is already broken and dropping it will destroy it completely. You will need to see Brass Hand Harry for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13384", + "name": "Broken hand", + "examine": "One of many broken hands.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The hand is already broken and dropping it will destroy it completely. You will need to see Brass Hand Harry for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13385", + "name": "Broken hand", + "examine": "One of many broken hands.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "The hand is already broken and dropping it will destroy it completely. You will need to see Brass Hand Harry for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13386", + "name": "Fingers", + "examine": "Wall beast fingers in a white fern sauce.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13387", + "name": "Thumb", + "examine": "A brass thumb.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This hand part is small and delicate, and dropping it here will lose it. If you lose it, you will need to see Brass Hand Harry for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13388", + "name": "Hand", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13389", + "name": "Wrist", + "examine": "A brass wrist.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This hand part is small and delicate, and dropping it here will lose it. If you lose it, you will need to see Brass Hand Harry for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13390", + "name": "Brace", + "examine": "A brass brace.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "This hand part is small and delicate, and dropping it here will lose it. If you lose it, you will need to see Brass Hand Harry for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13391", + "name": "Brass hand", + "examine": "A completed brass hand.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this hand, you will destroy it and you will have to remake it from parts that Brass Hand Harry has.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13392", + "name": "Ink pad", + "examine": "It's soaked with ink.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this ink pad, you will lose it and will need to see Brass Hand Harry for a replacement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13393", + "name": "Inky hand", + "examine": "An inky brass hand.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this hand, you will destroy it and you will have to remake it from parts that Brass Hand Harry has.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13394", + "name": "Paper", + "examine": "This is generally used for writing on.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this paper, you will need to call to the guards for a replacement. ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13395", + "name": "Brass hand harry's mark", + "examine": "Handprint from Brass Hand Harry.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop Brass Hand Harry's mark, it will be destroyed and you need to see him to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13396", + "name": "Fake beard", + "examine": "Makes me itch.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13397", + "name": "Fake moustache and nose", + "examine": "It looks like someone has sneezed in it.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this disguise you will need to see Captain Braindeath for a replacement.", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13398", + "name": "Fake monocle, moustache and nose", + "examine": "Why is the monocle nailed to it?", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this disguise you will need to see Captain Braindeath for a replacement.", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13399", + "name": "Curly wig", + "examine": "You can barely see where it connected to the mop handle.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this disguise you will need to see Captain Braindeath for a replacement.", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13400", + "name": "Straight wig", + "examine": "It looks like it is part-dog, part-mould.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this disguise you will need to see Captain Braindeath for a replacement.", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13401", + "name": "Order", + "examine": "An order simply for 'rum'.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop this order for 'rum' you will need to speak to the Rusty Anchor barman to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13402", + "name": "Braindeath's mark", + "examine": "Signature of Captain Braindeath.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "If you drop Captain Braindeath's mark, you will need to speak to him to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13403", + "name": "Golden tinderbox", + "examine": "A replica tinderbox made of solid gold.", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "tradeable": "false", + "destroy_message": "Drop", + "shop_price": "300", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13405", + "name": "Dark bow", + "examine": "A bow from a darker dimension.", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "86850", + "render_anim": "303", + "attack_speed": "9", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,95,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13406", + "name": "Ancient staff", + "examine": "", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "59171", + "render_anim": "28", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "10,-1,40,15,0,2,3,1,15,0,5,50,0,-1,10", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13407", + "name": "Archer helm", + "examine": "This helmet is worn by archers.", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "46334", + "attack_speed": "4", + "absorb": "0,3,1", + "bonuses": "-5,-5,-5,-5,6,6,8,10,6,6,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13408", + "name": "Berserker helm", + "examine": "This helmet is worn by berserkers.", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "45978", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-5,-5,31,29,33,0,30,7,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13409", + "name": "Warrior helm", + "examine": "This helm is worn by warriors.", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "45664", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,5,0,-5,-5,31,33,29,0,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13410", + "name": "Farseer helm", + "examine": "This helm is worn by farseers.", + "lendable": "true", + "low_alchemy": "31200", + "high_alchemy": "46800", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "45989", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "-5,-5,-5,6,-5,8,10,12,6,0,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13411", + "name": "Rock-shell helm", + "examine": "Protective headwear made from crabs. Better than it sounds.", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "20378", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,6,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13412", + "name": "Rock-shell plate", + "examine": "A sturdy body armour made from rock crab pieces.", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "41788", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13413", + "name": "Rock-shell legs", + "examine": "Some tough leggings made from rock crab parts.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "37139", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13414", + "name": "Spined helm", + "examine": "A helm fit for any Fremennik ranger.", + "lendable": "true", + "low_alchemy": "24000", + "high_alchemy": "36000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "37724", + "attack_speed": "4", + "absorb": "0,3,1", + "bonuses": "0,-6,-6,-6,6,6,6,6,6,0,6,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13415", + "name": "Spined body", + "examine": "A constant reminder that I'm above a Dagannoth in the food chain.", + "lendable": "true", + "low_alchemy": "3000", + "high_alchemy": "4500", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "5773", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,15,40,32,45,20,40,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13416", + "name": "Spined chaps", + "examine": "Stylish leg armour for rangers with a lingering smell of raw fish...", + "lendable": "true", + "low_alchemy": "1560", + "high_alchemy": "2340", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2696", + "attack_speed": "4", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,8,22,16,24,8,22,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13417", + "name": "Skeletal helm", + "examine": "Make your foes cower by wearing a skull as a helmet!", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "39060", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,2,-2,10,9,11,3,0,6,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13418", + "name": "Skeletal top", + "examine": "The bones in this armour seems to vibrate with a magic quality...", + "lendable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "26289", + "attack_speed": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,8,-10,35,25,42,15,0,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13419", + "name": "Skeletal bottoms", + "examine": "A superior set of strengthened slacks for any self respecting seer.", + "lendable": "true", + "low_alchemy": "16000", + "high_alchemy": "24000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "24591", + "attack_speed": "4", + "absorb": "4,2,0", + "bonuses": "0,0,0,6,-7,22,20,24,10,0,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13420", + "name": "Spined boots", + "examine": "Some finely crafted Fremennik boots, made from spined dagannoth hide.", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "158181", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,1,1,0,0,0,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13421", + "name": "Rock-shell boots", + "examine": "Some Fremennik boots, made from the shards of a rock crab's shell.", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1358", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,1,1,0,0,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13422", + "name": "Skeletal boots", + "examine": "Some finely crafted Fremennik boots, made from the bones of a Wallasalki.", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "7788", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,1,1,0,0,1,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13423", + "name": "Spined gloves", + "examine": "Fremennik gloves stitched together from spined dagannoth hide.", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "3027", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,1,2,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13424", + "name": "Rock-shell gloves", + "examine": "Fremennik gloves stitched together from rock crab shell shards.", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "12839", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13425", + "name": "Skeletal gloves", + "examine": "Fremennik gloves stitched together from wallasalki bones fragments.", + "lendable": "true", + "low_alchemy": "260", + "high_alchemy": "390", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "25838", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,1,2,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13426", + "name": "Seers ring", + "examine": "A mysterious ring that can fill the wearer with magical power...", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "799703", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13427", + "name": "Archers ring", + "examine": "A fabled ring that improves the wearer's skill with a bow...", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "483521", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,4,0,0,0,0,4,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13428", + "name": "Warrior ring", + "examine": "A legendary ring once worn by Fremennik warriors.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "361302", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,4,0,0,0,0,4,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13429", + "name": "Berserker ring", + "examine": "A ring reputed to bring out a berserk fury in its wearer.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "963418", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,4,0,0,0,4,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13430", + "name": "Dragon 2h sword", + "examine": "A two-handed dragon sword.", + "lendable": "true", + "low_alchemy": "88000", + "high_alchemy": "132000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1024000", + "render_anim": "124", + "attack_speed": "7", + "absorb": "0,0,0", + "bonuses": "-4,92,80,-4,0,0,0,0,0,-1,0,93,0,0,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13431", + "name": "Crayfish cage", + "examine": "Useful for catching crayfish.", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "25", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13432", + "name": "Crayfish cage", + "examine": "Useful for catching crayfish.", + "tradeable": "true", + "low_alchemy": "8", + "high_alchemy": "12", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "25", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13433", + "name": "Crayfish", + "examine": "Some cooked crayfish. Eat it to heal.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "5", + "grand_exchange_price": "32", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13434", + "name": "Crayfish", + "examine": "Some cooked crayfish. Eat it to heal.", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "5", + "grand_exchange_price": "32", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13435", + "name": "Raw crayfish", + "examine": "I should try cooking this. Used in Cooking (1).", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "5", + "grand_exchange_price": "41", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13436", + "name": "Raw crayfish", + "examine": "I should try cooking this. Used in Cooking (1).", + "tradeable": "true", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "5", + "grand_exchange_price": "41", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13437", + "name": "Burnt crayfish", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13438", + "name": "Burnt crayfish", + "tradeable": "true", + "shop_price": "1", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13439", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13440", + "name": "Bag of runes", + "examine": "This is a bag of runes for Sir Vant.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13442", + "name": "Amulet of fury", + "examine": "A very powerful onyx amulet.", + "lendable": "true", + "low_alchemy": "80800", + "high_alchemy": "121200", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2285210", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "10,10,10,10,10,15,15,15,15,15,15,8,0,5,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13443", + "name": "Obsidian cape", + "examine": "A cape woven of obsidian plates.", + "lendable": "true", + "low_alchemy": "24000", + "high_alchemy": "36000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "56575", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,9,9,9,9,9,9,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13444", + "name": "Abyssal whip", + "examine": "A weapon from the Abyss.", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "114775", + "render_anim": "1578", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,82,0,0,0,0,0,0,0,0,0,82,0,0,0", + "weapon_interface": "11", + "has_special": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13445", + "name": "Granite maul", + "examine": "Simplicity is the best weapon.", + "lendable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "29584", + "render_anim": "27", + "attack_speed": "7", + "absorb": "0,0,0", + "bonuses": "0,0,81,0,0,0,0,0,0,0,0,79,0,0,0", + "weapon_interface": "10", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13446", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13447", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13448", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13449", + "name": "Dragon full helm", + "examine": "Protects your head and looks impressive too.", + "lendable": "true", + "low_alchemy": "60000", + "high_alchemy": "90000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "5756658", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-6,-2,45,48,41,-1,46,12,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13450", + "name": "Armadyl godsword", + "examine": "A beautiful, heavy sword.", + "lendable": "true", + "low_alchemy": "500000", + "high_alchemy": "750000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "7767458", + "render_anim": "1579", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,132,80,0,0,0,0,0,0,0,0,132,0,8,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13451", + "name": "Bandos godsword", + "examine": "A brutally heavy sword.", + "lendable": "true", + "low_alchemy": "500000", + "high_alchemy": "750000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1504919", + "render_anim": "1579", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,132,80,0,0,0,0,0,0,0,0,132,0,8,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13452", + "name": "Saradomin godsword", + "examine": "A gracious, heavy sword.", + "lendable": "true", + "low_alchemy": "500000", + "high_alchemy": "750000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "34966317", + "render_anim": "1579", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,132,80,0,0,0,0,0,0,0,0,132,0,8,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13453", + "name": "Zamorak godsword", + "examine": "A terrifying, heavy sword.", + "lendable": "true", + "low_alchemy": "500000", + "high_alchemy": "750000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2132037", + "render_anim": "1579", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,132,80,0,0,0,0,0,0,0,0,132,0,8,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13454", + "name": "Zamorakian spear", + "examine": "An evil spear.", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2070507", + "render_anim": "1581", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "85,65,65,0,0,13,13,12,0,13,0,75,0,2,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13455", + "name": "Armadyl helmet", + "examine": "A helmet of great craftmanship.", + "lendable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "3732060", + "attack_speed": "4", + "absorb": "0,5,2", + "bonuses": "-5,-5,-5,-5,10,6,6,10,10,8,12,0,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13456", + "name": "Armadyl chestplate", + "examine": "A chestplate of great craftsmanship", + "lendable": "true", + "low_alchemy": "24000", + "high_alchemy": "36000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "9628666", + "attack_speed": "4", + "absorb": "0,10,5", + "bonuses": "-7,-7,-7,-15,33,56,48,61,70,57,52,0,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13457", + "name": "Armadyl plateskirt", + "examine": "A chainskirt of great craftsmanship.", + "lendable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "9754868", + "attack_speed": "4", + "absorb": "0,7,3", + "bonuses": "-6,-6,-6,-10,20,32,26,34,40,33,25,0,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13458", + "name": "Bandos chestplate", + "examine": "A sturdy chestplate.", + "lendable": "true", + "low_alchemy": "106000", + "high_alchemy": "159000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "6460055", + "attack_speed": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-15,-10,98,93,105,-6,133,52,4,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13459", + "name": "Bandos tassets", + "examine": "A sturdy pair of tassets.", + "lendable": "true", + "low_alchemy": "109000", + "high_alchemy": "163500", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "4228256", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,71,63,66,-4,93,25,2,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13460", + "name": "Bandos boots", + "examine": "Some sturdy boots.", + "lendable": "true", + "low_alchemy": "10000", + "high_alchemy": "15000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1259091", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-5,-3,17,18,19,0,0,15,0,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13461", + "name": "Saradomin sword", + "examine": "The incredible blade of an Icyene.", + "lendable": "true", + "low_alchemy": "52000", + "high_alchemy": "78000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "850151", + "render_anim": "1579", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,82,60,0,0,0,0,0,0,0,0,82,0,2,0", + "weapon_interface": "7", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13462", + "name": "Dragon boots", + "examine": "These will protect my feet.", + "lendable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "17336", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-3,-1,16,17,18,0,0,15,4,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13463", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13464", + "name": "Task list", + "examine": "Doric's instructions for the task he gave you.", + "destroy": "true", + "tradeable": "false", + "destroy_message": "You can get another of these from Doric.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13465", + "name": "Dragon dagger", + "examine": "A powerful dagger.", + "lendable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "16744", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13466", + "name": "Dragon dagger(p)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "has_special": "true", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13467", + "name": "Dragon dagger(p+)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "has_special": "true", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13468", + "name": "Dragon dagger(p++)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "has_special": "true", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13469", + "name": "Rune axe", + "examine": "A powerful hatchet.", + "lendable": "true", + "low_alchemy": "5120", + "high_alchemy": "7680", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "7263", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "-2,26,24,0,0,0,1,0,0,0,0,29,0,0,0", + "weapon_interface": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13470", + "name": "Dragon axe", + "examine": "A very powerful hatchet.", + "lendable": "true", + "low_alchemy": "22000", + "high_alchemy": "33000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "3794577", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "-2,38,32,0,0,0,1,0,0,0,0,42,0,0,0", + "weapon_interface": "2", + "has_special": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13471", + "name": "Rune battleaxe", + "examine": "A vicious looking axe.", + "lendable": "true", + "low_alchemy": "16640", + "high_alchemy": "24960", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "23993", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "-2,48,43,0,0,0,0,0,0,-1,0,64,0,0,0", + "weapon_interface": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13472", + "name": "Dragon battleaxe", + "examine": "A vicious looking axe.", + "lendable": "true", + "low_alchemy": "80000", + "high_alchemy": "120000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "123019", + "render_anim": "2586", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "-2,70,65,0,0,0,0,0,0,-1,0,85,0,0,0", + "weapon_interface": "2", + "has_special": "true", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13473", + "name": "Rune warhammer", + "examine": "I don't think it's intended for joinery.", + "lendable": "true", + "low_alchemy": "16600", + "high_alchemy": "24900", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "24357", + "render_anim": "1430", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "-4,-4,53,-4,0,0,0,0,0,0,0,48,0,0,0", + "weapon_interface": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13474", + "name": "Rune longsword", + "examine": "A razor-sharp longsword", + "lendable": "true", + "low_alchemy": "12800", + "high_alchemy": "19200", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "18420", + "render_anim": "1582", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "38,47,-2,0,0,0,3,2,0,0,0,49,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13475", + "name": "Dragon longsword", + "examine": "A very powerful sword.", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "58355", + "render_anim": "1582", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "58,69,-2,0,0,0,3,2,0,0,0,71,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13476", + "name": "Rune scimitar", + "examine": "A vicious, curved sword.", + "lendable": "true", + "low_alchemy": "10240", + "high_alchemy": "15360", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "14690", + "render_anim": "1582", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "7,45,-2,0,0,0,1,0,0,0,0,44,0,0,0", + "weapon_interface": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13477", + "name": "Dragon scimitar", + "examine": "A vicious, curved sword.", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "60405", + "render_anim": "1928", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "8,67,-2,0,0,0,1,0,0,0,0,66,0,0,0", + "weapon_interface": "6", + "has_special": "true", + "attack_anims": "390,390,381,390", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13478", + "name": "Dragon halberd", + "examine": "A dragon halberd.", + "lendable": "true", + "low_alchemy": "130000", + "high_alchemy": "195000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "200189", + "render_anim": "28", + "attack_speed": "7", + "absorb": "0,0,0", + "bonuses": "70,95,0,-4,0,-1,4,5,0,0,0,89,0,0,0", + "weapon_interface": "15", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13479", + "name": "Dragon mace", + "examine": "A spiky mace.", + "lendable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "28817", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "40,-2,60,0,0,0,0,0,0,0,0,55,0,5,0", + "weapon_interface": "8", + "has_special": "true", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13480", + "name": "Rune pickaxe", + "examine": "Used for mining.", + "lendable": "true", + "low_alchemy": "12800", + "high_alchemy": "19200", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "18546", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "26,-2,24,0,0,0,1,0,0,0,0,29,0,0,0", + "weapon_interface": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13481", + "name": "Dragon chainbody", + "examine": "A series of connected metal rings.", + "lendable": "true", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2280904", + "attack_speed": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-15,0,81,93,98,-3,82,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13482", + "name": "Rune platebody", + "examine": "Provides excellent protection.", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "38062", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13483", + "name": "Green d'hide body", + "examine": "Made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "3120", + "high_alchemy": "4680", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "4373", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-20,15,40,32,45,20,40,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13484", + "name": "Blue d'hide body", + "examine": "Made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "3744", + "high_alchemy": "5616", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "5266", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,20,45,37,50,30,45,45,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13485", + "name": "Red d'hide body", + "examine": "Made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "4492", + "high_alchemy": "6738", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "6276", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,25,50,42,55,40,50,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13486", + "name": "Black d'hide body", + "examine": "Made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "5392", + "high_alchemy": "8088", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "7619", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,50,55,55,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13487", + "name": "Rune platelegs", + "examine": "These look pretty heavy.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "37355", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13488", + "name": "Dragon platelegs", + "examine": "Looks pretty heavy.", + "lendable": "true", + "low_alchemy": "108000", + "high_alchemy": "162000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "160755", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,68,66,63,-4,65,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13489", + "name": "Rune plateskirt", + "examine": "Designer leg protection.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "37248", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13490", + "name": "Dragon plateskirt", + "examine": "This looks pretty heavy.", + "lendable": "true", + "low_alchemy": "108000", + "high_alchemy": "162000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "161006", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,68,66,63,-4,65,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13491", + "name": "Green d'hide chaps", + "examine": "100% real dragonhide.", + "lendable": "true", + "low_alchemy": "1560", + "high_alchemy": "2340", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2037", + "attack_speed": "4", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,8,22,16,24,8,22,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13492", + "name": "Blue d'hide chaps", + "examine": "Made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "1728", + "high_alchemy": "2592", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2352", + "attack_speed": "4", + "absorb": "0,5,2", + "bonuses": "0,0,0,-10,11,25,19,27,14,25,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13493", + "name": "Red d'hide chaps", + "examine": "Made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "2072", + "high_alchemy": "3108", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2761", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-10,14,28,22,30,20,28,25,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13494", + "name": "Black d'hide chaps", + "examine": "Made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "2488", + "high_alchemy": "3732", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "3377", + "attack_speed": "4", + "absorb": "0,7,3", + "bonuses": "0,0,0,-10,17,31,25,33,28,31,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13495", + "name": "Dragon med helm", + "examine": "Makes the wearer pretty intimidating.", + "lendable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "59676", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-3,-1,33,35,32,-1,34,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13496", + "name": "Rune full helm", + "examine": "A full face helmet.", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "20388", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13497", + "name": "Green d'hide vamb", + "examine": "Made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "1000", + "high_alchemy": "1500", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1208", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-10,8,3,2,4,2,0,3,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13498", + "name": "Blue d'hide vamb", + "examine": "Made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "1200", + "high_alchemy": "1800", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1488", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-10,9,4,3,5,4,0,4,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13499", + "name": "Red d'hide vamb", + "examine": "Vambraces made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "1440", + "high_alchemy": "2160", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1714", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-10,10,5,4,6,6,0,5,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13500", + "name": "Black d'hide vamb", + "examine": "Vambraces made from 100% real dragonhide.", + "lendable": "true", + "low_alchemy": "1728", + "high_alchemy": "2592", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2208", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-10,11,6,5,7,8,0,6,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13501", + "name": "Splitbark helm", + "examine": "A wooden helmet.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "5210", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,3,-2,10,9,11,3,0,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13502", + "name": "Splitbark body", + "examine": "Provides good protection.", + "lendable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "27106", + "attack_speed": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,10,-10,36,26,42,15,0,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13503", + "name": "Splitbark legs", + "examine": "These should protect my legs.", + "lendable": "true", + "low_alchemy": "16000", + "high_alchemy": "24000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "56050", + "attack_speed": "4", + "absorb": "4,2,0", + "bonuses": "0,0,0,7,-7,22,20,25,10,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13504", + "name": "Splitbark gauntlets", + "examine": "These should keep my hands safe.", + "lendable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2442", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,2,-1,3,2,4,2,0,3,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13505", + "name": "Splitbark boots", + "examine": "Wooden foot protection.", + "lendable": "true", + "low_alchemy": "2000", + "high_alchemy": "3000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "6845", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,2,-1,3,2,4,2,0,9,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13506", + "name": "Dragon sq shield", + "examine": "An ancient and powerful looking Dragon Square shield.", + "lendable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "328356", + "attack_speed": "4", + "absorb": "5,0,11", + "bonuses": "0,0,0,-6,-2,50,52,48,0,50,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13507", + "name": "Rune kiteshield", + "examine": "A large metal shield.", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "31885", + "attack_speed": "4", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13508", + "name": "Mystic hat", + "examine": "Blue: A magical hat. ", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13509", + "name": "Mystic robe top", + "examine": "The upper half of a magical robe.", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13510", + "name": "Mystic robe bottom", + "examine": "The lower half of a magical robe.", + "lendable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "4,2,0", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13511", + "name": "Mystic gloves", + "examine": "Bright/Dark magical gloves.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13512", + "name": "Mystic boots", + "examine": "Magical boots.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13513", + "name": "Mystic hat", + "examine": "Blue: A magical hat. ", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13514", + "name": "Mystic robe top", + "examine": "The upper half of a magical robe.", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13515", + "name": "Mystic robe bottom", + "examine": "The lower half of a magical robe.", + "lendable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "4,2,0", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13516", + "name": "Mystic gloves", + "examine": "Bright/Dark magical gloves.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13517", + "name": "Mystic boots", + "examine": "Magical boots.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13518", + "name": "Mystic hat", + "examine": "Blue: A magical hat. ", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13519", + "name": "Mystic robe top", + "examine": "The upper half of a magical robe.", + "lendable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13520", + "name": "Mystic robe bottom", + "examine": "The lower half of a magical robe.", + "lendable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "4,2,0", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13521", + "name": "Mystic gloves", + "examine": "Bright/Dark magical gloves.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13522", + "name": "Mystic boots", + "examine": "Magical boots.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,0,0,0,3,0,3,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13523", + "name": "Maple longbow", + "examine": "A nice sturdy bow made out of maple.", + "lendable": "true", + "low_alchemy": "256", + "high_alchemy": "384", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "193", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,29,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13524", + "name": "Maple shortbow", + "examine": "A shortbow made out of maple, still effective.", + "lendable": "true", + "low_alchemy": "160", + "high_alchemy": "240", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "111", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,29,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13525", + "name": "Yew longbow", + "examine": "A nice sturdy bow made out of yew.", + "lendable": "true", + "low_alchemy": "512", + "high_alchemy": "768", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "486", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,47,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13526", + "name": "Yew shortbow", + "examine": "A shortbow made out of yew, still effective.", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "253", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,47,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13527", + "name": "Magic longbow", + "examine": "A nice sturdy magical bow.", + "lendable": "true", + "low_alchemy": "1024", + "high_alchemy": "1536", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1211", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,69,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13528", + "name": "Magic shortbow", + "examine": "Short and magical, but still effective.", + "lendable": "true", + "low_alchemy": "640", + "high_alchemy": "960", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "655", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,69,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13529", + "name": "Seercull", + "examine": "An ancient Fremennik bow that was once used to battle the Moon Clan.", + "lendable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "21698", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,69,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13530", + "name": "Rune crossbow", + "examine": "A runite crossbow.", + "lendable": "true", + "low_alchemy": "6480", + "high_alchemy": "9720", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "8890", + "render_anim": "175", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,90,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "17", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13531", + "name": "Red partyhat", + "examine": "A nice hat from a cracker.", + "lendable": "true", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1696744720", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13532", + "name": "Yellow partyhat", + "examine": "A nice hat from a cracker.", + "lendable": "true", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1314730495", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13533", + "name": "Blue partyhat", + "examine": "A nice hat from a cracker.", + "lendable": "true", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2147483647", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13534", + "name": "Green partyhat", + "examine": "A nice hat from a cracker.", + "lendable": "true", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1481913809", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13535", + "name": "Purple partyhat", + "examine": "A nice hat from a cracker.", + "lendable": "true", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1248900588", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13536", + "name": "White partyhat", + "examine": "A nice hat from a cracker.", + "lendable": "true", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2147473360", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13537", + "name": "Santa hat", + "examine": "It's a Santa hat.", + "lendable": "true", + "low_alchemy": "64", + "high_alchemy": "96", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "130433327", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13538", + "name": "Green h'ween mask", + "examine": "Aaaarrrghhh ... I'm a monster.", + "lendable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "104671288", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13539", + "name": "Blue h'ween mask", + "examine": "Aaaarrrghhh ... I'm a monster.", + "lendable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "127720943", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13540", + "name": "Red h'ween mask", + "examine": "Aaaarrrghhh ... I'm a monster.", + "lendable": "true", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "171640098", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13541", + "name": "Willow comp bow", + "examine": "A powerful bow made from willow.", + "lendable": "true", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2606", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,22,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13542", + "name": "Yew comp bow", + "examine": "A powerful bow made from yew wood.", + "lendable": "true", + "low_alchemy": "720", + "high_alchemy": "1080", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "588", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,49,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13543", + "name": "Magic comp bow", + "examine": "A powerful bow made from magic wood.", + "lendable": "true", + "low_alchemy": "1000", + "high_alchemy": "1500", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1345", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,71,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13544", + "name": "3rd age range top", + "examine": "Ancient range protection crafted from white dragonhide.", + "lendable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "74503559", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,30,55,47,60,60,55,52,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13545", + "name": "3rd age range legs", + "examine": "Fabulously ancient range protection crafted from white dragonhide.", + "lendable": "true", + "low_alchemy": "16000", + "high_alchemy": "24000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "47837515", + "attack_speed": "4", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,17,31,25,33,30,31,25,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13546", + "name": "3rd age range coif", + "examine": "Ancient range protection crafted from white dragonhide.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "9746895", + "attack_speed": "4", + "absorb": "0,3,1", + "bonuses": "0,0,0,-2,9,4,7,10,5,8,12,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13547", + "name": "3rd age vambraces", + "examine": "Fabulously ancient range protection crafted from white dragonhide.", + "lendable": "true", + "low_alchemy": "86000", + "high_alchemy": "129000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "6826420", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-11,11,6,5,7,9,0,5,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13548", + "name": "3rd age robe top", + "examine": "Ancient mage protection enchanted in the Third-Age.", + "lendable": "true", + "low_alchemy": "18000", + "high_alchemy": "27000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "138719269", + "attack_speed": "4", + "absorb": "4,2,0", + "bonuses": "0,0,0,24,0,0,0,0,24,0,24,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13549", + "name": "3rd age robe", + "examine": "Ancient mage protection enchanted in the Third-Age.", + "lendable": "true", + "low_alchemy": "16000", + "high_alchemy": "24000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "89961678", + "attack_speed": "4", + "absorb": "4,2,0", + "bonuses": "0,0,0,19,0,0,0,0,19,0,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13550", + "name": "3rd age mage hat", + "examine": "Ancient mage protection enchanted in the Third-Age.", + "lendable": "true", + "low_alchemy": "4000", + "high_alchemy": "6000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "14976830", + "attack_speed": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,8,0,0,0,0,8,0,12,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13551", + "name": "3rd age amulet", + "examine": "Ancient mage protection enchanted in the Third-Age.", + "lendable": "true", + "low_alchemy": "8000", + "high_alchemy": "12000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "35019596", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,15,0,0,0,0,10,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13552", + "name": "3rd age platelegs", + "examine": "Ancient armour beaten from magical silver.", + "lendable": "true", + "low_alchemy": "80000", + "high_alchemy": "120000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "244180930", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-25,-2,78,76,83,-5,75,25,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13553", + "name": "3rd age platebody", + "examine": "Ancient armour beaten from magical silver.", + "lendable": "true", + "low_alchemy": "80000", + "high_alchemy": "120000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "266509014", + "attack_speed": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-20,0,96,108,113,-4,97,52,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13554", + "name": "3rd age full helmet", + "examine": "Ancient armour beaten from magical silver.", + "lendable": "true", + "low_alchemy": "36000", + "high_alchemy": "54000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "50697678", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-5,-2,47,49,43,-3,48,12,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13555", + "name": "3rd age kiteshield", + "examine": "Ancient armour beaten from magical silver.", + "lendable": "true", + "low_alchemy": "72000", + "high_alchemy": "108000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "91262203", + "attack_speed": "4", + "absorb": "5,0,11", + "bonuses": "0,0,0,-10,-4,63,65,61,-3,63,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13556", + "name": "Ranger boots", + "examine": "Lightweight boots ideal for rangers.", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "6253527", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-10,8,2,3,4,2,0,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13557", + "name": "Wizard boots", + "examine": "Slightly magical boots.", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "388955", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13558", + "name": "Robin hood hat", + "examine": "Endorsed by Robin Hood.", + "lendable": "true", + "low_alchemy": "180", + "high_alchemy": "270", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1962571", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-10,8,4,6,8,4,4,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13560", + "name": "Explorer's ring 1", + "examine": "A Lumbridge explorer's ring.", + "destroy": "true", + "destroy_message": "You will have talk to Explorer Jack in Lumbridge if you destroy this one.", + "shop_price": "350", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,1,0,0,0,0,0,0,0,0,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13561", + "name": "Explorer's ring 2", + "examine": "A Lumbridge explorer's ring.", + "destroy": "true", + "destroy_message": "You will have talk to ", + "shop_price": "350", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,1,0,0,0,0,0,0,0,0,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13562", + "name": "Explorer's ring 3", + "examine": "A Lumbridge explorer's ring.", + "destroy": "true", + "destroy_message": "You will need to obtain a new ring from Ned in Draynor if you destroy this one.", + "shop_price": "350", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,1,0,0,0,0,0,0,0,0,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13563", + "name": "Button mushroom", + "examine": "An occasionally edible mushroom.", + "low_alchemy": "15", + "high_alchemy": "22", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "38", + "grand_exchange_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13564", + "name": "Button mushroom", + "examine": "An occasionally edible mushroom.", + "tradeable": "true", + "low_alchemy": "15", + "high_alchemy": "22", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "38", + "grand_exchange_price": "100", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13565", + "name": "Doll", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13566", + "name": "Jennica's ring", + "examine": "This magical ring once belonged to Summer's mother.", + "destroy": "true", + "destroy_message": "You may be able to find a new ring near where Summer stood outside the wilderness wall.", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13567", + "name": "Cursed magic logs", + "examine": "Logs cut from a cursed magic tree.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13568", + "name": "Cursed magic logs", + "examine": "Logs cut from a cursed magic tree.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13569", + "name": "Enchanted key notes", + "examine": "Notes on how to use the enchanted key.", + "destroy": "true", + "destroy_message": "Hopefully, Jorral will be able to return them.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13570", + "name": "Bowl", + "examine": "Useful for mixing things.", + "low_alchemy": "1", + "high_alchemy": "2", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "106", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13571", + "name": "Bucket of milk", + "examine": "It's a bucket of milk.", + "low_alchemy": "4", + "high_alchemy": "7", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "177", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13572", + "name": "Clean guam", + "examine": "A fresh herb.", + "low_alchemy": "1", + "high_alchemy": "1", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "595", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13573", + "name": "Bowl of honey", + "examine": "A bowlful of bees' precious product.", + "destroy": "true", + "destroy_message": "You'll have to start again from stratch.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13574", + "name": "Bowl of milk and honey", + "examine": "A bowlful of milk and honey.", + "destroy": "true", + "destroy_message": "You'll have to start again from stratch.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13575", + "name": "Bowl of milk, honey and guam", + "examine": "A bowl full of milk, honey and guam.", + "destroy": "true", + "destroy_message": "You'll have to start again from stratch.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13576", + "name": "Map of runescape", + "examine": "Your best impression of a map of RuneScape.", + "destroy": "true", + "destroy_message": "Hopefully, the family has more papyrus and charcoal.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13577", + "name": "Papyrus", + "examine": "Used for making notes.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "290", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13578", + "name": "Charcoal", + "examine": "A lump of charcoal.", + "low_alchemy": "18", + "high_alchemy": "27", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "296", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13579", + "name": "Spade", + "examine": "A slightly muddy spade. ", + "low_alchemy": "1", + "high_alchemy": "1", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "130", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13580", + "name": "Plant pot", + "examine": "A plant pot filled with soil.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13581", + "name": "Pear tree seedling", + "examine": "A seedling has been sown in this plant pot.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13582", + "name": "Mango tree seedling", + "examine": "A seedling has been sown in this plant pot.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13583", + "name": "Quince tree seedling", + "examine": "A seedling has been sown in this plant pot.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13584", + "name": "Lemon tree seedling", + "examine": "A seedling has been sown in this plant pot.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13585", + "name": "Avocado tree seedling", + "examine": "A seedling has been sown in this plant pot.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13586", + "name": "Plum tree seedling", + "examine": "A seedling has been sown in this plant pot.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13587", + "name": "Pestle and mortar", + "examine": "I can grind things for potions in this.", + "low_alchemy": "1", + "high_alchemy": "2", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "4", + "grand_exchange_price": "169", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13588", + "name": "Ground guam", + "examine": "One of the ingredients for making fish food.", + "high_alchemy": "1", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13589", + "name": "Bucket", + "examine": "It's an empty bucket. ", + "high_alchemy": "1", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2", + "grand_exchange_price": "39", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13591", + "name": "Enchanted key", + "examine": "It seems to change temperature as I walk. (Making History)", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13592", + "name": "A brooch", + "examine": "Some ladies jewellery.", + "destroy": "true", + "destroy_message": "Hopefully, you can find another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13593", + "name": "Old tome", + "examine": "It's falling apart, but full of knowledge.", + "destroy": "true", + "destroy_message": "You will not get another chance to read the book!", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13598", + "name": "Runecrafting guild teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13599", + "name": "Air altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13600", + "name": "Mind altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13601", + "name": "Water altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13602", + "name": "Earth altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13603", + "name": "Fire altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13604", + "name": "Body altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13605", + "name": "Cosmic altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13606", + "name": "Chaos altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13607", + "name": "Nature altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13608", + "name": "Law altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13609", + "name": "Death altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13610", + "name": "Blood altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13611", + "name": "Astral altar teleport", + "examine": "A tablet containing a magic spell.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13612", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13613", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13614", + "name": "Runecrafter robe", + "examine": "Heavy duty wizard robes.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,5,0,5,5,5,5,5,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13615", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13616", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13617", + "name": "Runecrafter skirt", + "examine": "A heavy-duty wizard robe.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,4,0,4,4,4,4,4,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13618", + "name": "Runecrafter gloves", + "examine": "Essence can be rough on the hands", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,2,0,2,2,2,2,2,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13619", + "name": "Runecrafter robe", + "examine": "Heavy duty wizard robes.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,5,0,5,5,5,5,5,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13620", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13621", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13622", + "name": "Runecrafter skirt", + "examine": "A heavy-duty wizard robe.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,4,0,4,4,4,4,4,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13623", + "name": "Runecrafter gloves", + "examine": "Essence can be rough on the hands", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,2,0,2,2,2,2,2,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13624", + "name": "Runecrafter robe", + "examine": "Heavy duty wizard robes.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,5,0,5,5,5,5,5,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13625", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13626", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13627", + "name": "Runecrafter skirt", + "examine": "A heavy-duty wizard robe.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,4,0,4,4,4,4,4,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13628", + "name": "Runecrafter gloves", + "examine": "Essence can be rough on the hands", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,2,0,2,2,2,2,2,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13629", + "name": "Runecrafting staff", + "examine": "Staff with a holder for a talisman on top.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "15", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,15,0,0,33,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13630", + "name": "Air talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,15,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13631", + "name": "Mind talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,15,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13632", + "name": "Water talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,16,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13633", + "name": "Earth talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,16,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13634", + "name": "Fire talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,16,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13635", + "name": "Body talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,15,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13636", + "name": "Cosmic talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,16,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13637", + "name": "Chaos talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,16,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13638", + "name": "Nature talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "No", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,16,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13639", + "name": "Law talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13640", + "name": "Death talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,16,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13641", + "name": "Blood talisman staff", + "examine": "A staff with a talisman on top.", + "low_alchemy": "600", + "high_alchemy": "900", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,16,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13642", + "name": "Omni-talisman staff", + "examine": "A staff with a talisman on top.", + "destroy": "true", + "destroy_message": "You will have to speak to Wizard Elriss to get another omni-talisman.", + "shop_price": "1500", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,-1,7,5,0,2,3,1,16,0,0,33,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13643", + "name": "Yellow attractor", + "examine": "Attracts Runecrafting energy orbs in the rune altars.", + "destroy": "true", + "destroy_message": "If you destroy this, you will leave the game.", + "shop_price": "20", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13644", + "name": "Yellow repeller", + "examine": "Repels Runecrafting energy orbs in the rune altars.", + "destroy": "true", + "destroy_message": "If you destroy this, you will leave the game.", + "shop_price": "20", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13645", + "name": "Green attractor", + "examine": "Attracts Runecrafting energy orbs in the rune altars.", + "destroy": "true", + "destroy_message": "If you destroy this, you will leave the game.", + "shop_price": "20", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13646", + "name": "Green repeller", + "examine": "Repels Runecrafting energy orbs in the rune altars.", + "destroy": "true", + "destroy_message": "If you destroy this, you will leave the game.", + "shop_price": "20", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13647", + "name": "Green barrier generator", + "examine": "It creates barriers.", + "destroy": "true", + "destroy_message": "If you destroy this, you will leave the game.", + "shop_price": "20", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13648", + "name": "Yellow barrier generator", + "examine": "It creates barriers.", + "destroy": "true", + "destroy_message": "If you destroy this, you will leave the game.", + "shop_price": "20", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13649", + "name": "Omni-talisman", + "examine": "Many mysterious powers emanate from the talisman.", + "destroy": "true", + "destroy_message": "You will have to speak to ", + "shop_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13650", + "name": "Runecrafting guild token", + "examine": "Wizard Elriss will exchange these for rewards.", + "destroy": "true", + "destroy_message": "Unknown ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13651", + "name": "Runecrafting guild token", + "examine": "Wizard Elriss will exchange these for rewards.", + "destroy": "true", + "destroy_message": "Unknown ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13652", + "name": "Runecrafting guild token", + "examine": "Wizard Elriss will exchange these for rewards.", + "destroy": "true", + "destroy_message": "Unknown ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13653", + "name": "Runecrafting guild token", + "examine": "Wizard Elriss will exchange these for rewards.", + "destroy": "true", + "destroy_message": "Unknown ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13654", + "name": "Runecrafting guild token", + "examine": "Wizard Elriss will exchange these for rewards.", + "destroy": "true", + "destroy_message": "Unknown ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13655", + "name": "Omni-tiara", + "examine": "A tiara infused with the properties of all talismans.", + "destroy": "true", + "destroy_message": "You will have to speak to Wizard Elriss to get another omni-talisman.", + "shop_price": "100", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13656", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13657", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13658", + "name": "Runecrafter hat", + "examine": "Comes with goggles, for extra safety while Runecrafting.", + "low_alchemy": "30", + "high_alchemy": "45", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,3,0,3,3,3,3,3,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13659", + "name": "Ring of fire", + "examine": "It burns, burns, burns...", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "To get another Ring of Fire, you need to keep six beacons alight simultaneously and then talk to King Roald.", + "shop_price": "100", + "equipment_slot": "12", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "point_price": "50", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13660", + "name": "Flame gloves", + "examine": "The hottest gloves in town.", + "destroy": "true", + "destroy_message": "To get another pair of Flame Gloves, you need to keep ten beacons alight simultaneously and then talk to King Roald.", + "shop_price": "200", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13661", + "name": "Inferno adze", + "examine": "Danger: risk of fire.", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "destroy_message": "To get another Inferno Adze, you need to keep all fourteen beacons alight simultaneously and then talk to King Roald.", + "shop_price": "300", + "render_anim": "1096", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "10,9,7,0,0,0,1,0,0,0,0,11,0,0,0", + "weapon_interface": "2", + "point_price": "75", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13662", + "name": "Fire beacon", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13663", + "name": "Circus ticket", + "examine": "Tear ticket to exit the circus.", + "destroy": "true", + "destroy_message": "The ticket says: Tearing this ticket will make you leave the circus. Choose wisely.", + "shop_price": "10", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13666", + "name": "Giant's hand", + "examine": "Let's give them a big hand!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another one.", + "shop_price": "10", + "render_anim": "326", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13667", + "name": "Clown hat", + "examine": "A clown hat!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13668", + "name": "Clown shirt", + "examine": "Buttoning this up is tricky.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13669", + "name": "Clown leggings", + "examine": "These are my funny pants.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13670", + "name": "Clown shoes", + "examine": "For helping clowns stay upright.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13671", + "name": "Tambourine", + "examine": "For making a happy noise.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "render_anim": "327", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13672", + "name": "Ringmaster hat", + "examine": "Very stylish.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another one.", + "shop_price": "10", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13673", + "name": "Ringmaster shirt", + "examine": "Fits nicely.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another one.", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13674", + "name": "Ringmaster pants", + "examine": "Very stylish.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another one.", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13675", + "name": "Ringmaster boots", + "examine": "Shiny.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another one.", + "shop_price": "10", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13676", + "name": "Mega-phonus", + "examine": "For shouting at people.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another one.", + "shop_price": "10", + "render_anim": "328", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13677", + "name": "Acrobat shirt", + "examine": "Stretchy.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13678", + "name": "Acrobat pants", + "examine": "Very tight fitting.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13679", + "name": "Acrobat shoes", + "examine": "These keep your feet off the floor.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13680", + "name": "Acrobat hood", + "examine": "Oh no, I'm bald! Just kidding.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13681", + "name": "Acrobat shirt", + "examine": "Stretchy.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13682", + "name": "Acrobat pants", + "examine": "Very tight fitting.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13683", + "name": "Acrobat shoes", + "examine": "These keep your feet off the floor.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13684", + "name": "Acrobat hood", + "examine": "Oh no, I'm bald! Just kidding.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13685", + "name": "A stylish hat", + "examine": "Very dapper!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13686", + "name": "A stylish hat", + "examine": "Very dapper!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13687", + "name": "A stylish hat", + "examine": "Very dapper!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13688", + "name": "A stylish hat", + "examine": "Very dapper!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13689", + "name": "A stylish hat", + "examine": "Very dapper!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13690", + "name": "A stylish hat", + "examine": "Very dapper!", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You will need to speak to the ringmaster to get another.", + "shop_price": "10", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13691", + "name": "Shirt", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13692", + "name": "Shirt", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13693", + "name": "Shirt", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13694", + "name": "Shirt", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13695", + "name": "Shirt", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13696", + "name": "Shirt", + "shop_price": "10", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13697", + "name": "Leggings", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13698", + "name": "Leggings", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13699", + "name": "Leggings", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13700", + "name": "Skirt", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13701", + "name": "Skirt", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13702", + "name": "Skirt", + "shop_price": "10", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13703", + "name": "Shoes", + "shop_price": "10", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13704", + "name": "Shoes", + "shop_price": "10", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13705", + "name": "Shoes", + "shop_price": "10", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13706", + "name": "Shoes", + "shop_price": "10", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13707", + "name": "Tightrope 101", + "examine": "Shows you the moves you need to succeed!", + "destroy": "true", + "destroy_message": "You can get another Tightrope 101 by speaking to the Agility assistant.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13708", + "name": "Tightrope 101", + "examine": "Shows you the moves you need to succeed!", + "tradeable": "true", + "destroy": "true", + "destroy_message": "You can get another Tightrope 101 by speaking to the Agility assistant.", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13709", + "name": "Balls (level 10 approx.)", + "examine": "An Agility level of 10 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13710", + "name": "Plates (level 20 approx.)", + "examine": "An Agility level of 20 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13711", + "name": "Eggs (level 30 approx.)", + "examine": "An Agility level of 30 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13712", + "name": "Knives (level 40 approx.)", + "examine": "An Agility level of 40 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13713", + "name": "Spades (level 50 approx.)", + "examine": "An Agility level of 50 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13714", + "name": "Tuna (level 60 approx.)", + "examine": "An Agility level of 60 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13715", + "name": "Soap (level 70 approx.)", + "examine": "An Agility level of 70 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13716", + "name": "Cannon balls (level 80 approx.)", + "examine": "An Agility level of 80 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13717", + "name": "Torches (level 90 approx.)", + "examine": "An Agility level of 90 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13718", + "name": "Chinchompas (level 99 approx.)", + "examine": "An Agility level of 99 is advised when juggling these.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13719", + "name": "Performance shortbow", + "examine": "Short, but effective.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "shop_price": "50", + "render_anim": "176", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13720", + "name": "Performance knife", + "examine": "A finely balanced throwing knife.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "shop_price": "14", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13721", + "name": "Performance throwing axe", + "examine": "A finely balanced throwing axe.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "shop_price": "4", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13722", + "name": "Performance arrow", + "examine": "Arrows with bronze heads.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "shop_price": "7", + "equipment_slot": "13", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13723", + "name": "Teleport spell", + "examine": "A tablet containing a Magic spell.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13724", + "name": "Levitation spell", + "examine": "A tablet containing a Magic spell.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13725", + "name": "Alchemy spell", + "examine": "A tablet containing a Magic spell.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13726", + "name": "Elemental spell", + "examine": "A tablet containing a Magic spell.", + "destroy": "true", + "destroy_message": "You can get another one from the equipment box for this performance.", + "shop_price": "100", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13727", + "name": "Stardust", + "examine": "Small, shiny bits of rock.", + "low_alchemy": "20", + "high_alchemy": "30", + "destroy": "true", + "destroy_message": "You can mine more if you find another crashed star.", + "shop_price": "50", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13732", + "name": "Spy notebook", + "examine": "Notes on the locations of penguin spies.", + "destroy": "true", + "destroy_message": "You will need to speak with Larry/Chuck at Ardougne Zoo to get another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13734", + "name": "Spirit shield", + "examine": "An ethereal shield.", + "tradeable": "true", + "low_alchemy": "28000", + "high_alchemy": "42000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "70000", + "grand_exchange_price": "39982", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,39,41,50,1,45,40,0,0,1,0", + "requirements": "{1,70}", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13735", + "name": "Spirit shield", + "examine": "An ethereal shield.", + "tradeable": "true", + "low_alchemy": "28000", + "high_alchemy": "42000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "70000", + "grand_exchange_price": "39982", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13736", + "name": "Blessed spirit shield", + "examine": "An ethereal shield that has been blessed with holy powers.", + "tradeable": "true", + "low_alchemy": "560000", + "high_alchemy": "840000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1400000", + "grand_exchange_price": "936814", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,53,55,73,2,52,65,0,0,3,0", + "requirements": "{1,70}-{5,60}", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13737", + "name": "Blessed spirit shield", + "examine": "An ethereal shield that has been blessed with holy powers.", + "tradeable": "true", + "low_alchemy": "560000", + "high_alchemy": "840000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1400000", + "grand_exchange_price": "936814", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13738", + "name": "Arcane spirit shield", + "examine": "An ethereal shield with an arcane sigil attached to it.", + "tradeable": "true", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2000000", + "grand_exchange_price": "15076199", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,20,0,53,55,73,2,52,65,0,0,3,0", + "requirements": "{1,75}-{6,65}-{5,70}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13739", + "name": "Arcane spirit shield", + "examine": "An ethereal shield with an arcane sigil attached to it.", + "tradeable": "true", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2000000", + "grand_exchange_price": "15076199", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13740", + "name": "Divine spirit shield", + "examine": "An ethereal shield with a divine sigil attached to it.", + "tradeable": "true", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2000000", + "grand_exchange_price": "40003587", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,63,65,75,2,57,65,0,0,3,0", + "requirements": "{1,75}-{5,75}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13741", + "name": "Divine spirit shield", + "examine": "An ethereal shield with a divine sigil attached to it.", + "tradeable": "true", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2000000", + "grand_exchange_price": "40003587", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13742", + "name": "Elysian spirit shield", + "examine": "An ethereal shield with an elysian sigil attached to it.", + "tradeable": "true", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2000000", + "grand_exchange_price": "28420591", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,63,65,75,2,57,65,0,0,3,0", + "requirements": "{1,75}-{5,75}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13743", + "name": "Elysian spirit shield", + "examine": "An ethereal shield with an elysian sigil attached to it.", + "tradeable": "true", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2000000", + "grand_exchange_price": "28420591", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13744", + "name": "Spectral spirit shield", + "examine": "An ethereal shield with a spectral sigil attached to it.", + "tradeable": "true", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2000000", + "grand_exchange_price": "3616112", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,53,55,73,30,52,65,0,0,3,0", + "requirements": "{1,75}-{5,70}-{6,65}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13745", + "name": "Spectral spirit shield", + "examine": "An ethereal shield with a spectral sigil attached to it.", + "tradeable": "true", + "low_alchemy": "800000", + "high_alchemy": "1200000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2000000", + "grand_exchange_price": "3616112", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13746", + "name": "Arcane sigil", + "examine": "A sigil in the shape of an arcane rune.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "19508553", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13747", + "name": "Arcane sigil", + "examine": "A sigil in the shape of an arcane rune.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "19508553", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13748", + "name": "Divine sigil", + "examine": "A sigil in the shape of a divine symbol.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "53026134", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13749", + "name": "Divine sigil", + "examine": "A sigil in the shape of a divine symbol.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "53026134", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13750", + "name": "Elysian sigil", + "examine": "A sigil marked with elysian signs.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "36159098", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13751", + "name": "Elysian sigil", + "examine": "A sigil marked with elysian signs.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "36159098", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13752", + "name": "Spectral sigil", + "examine": "A sigil tempered with spectral powers.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "3116720", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13753", + "name": "Spectral sigil", + "examine": "A sigil tempered with spectral powers.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "3116720", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13754", + "name": "Holy elixir", + "examine": "A bottle of holy elixir.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "950904", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13755", + "name": "Holy elixir", + "examine": "A bottle of holy elixir.", + "tradeable": "true", + "low_alchemy": "300000", + "high_alchemy": "450000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "750000", + "grand_exchange_price": "950904", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13756", + "name": "Cursed willow logs", + "examine": "Logs cut from cursed willow roots.", + "low_alchemy": "16", + "high_alchemy": "24", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "40", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13757", + "name": "Hartwin", + "examine": "A loyal scout of Varrock.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13758", + "name": "Grubby key", + "examine": "A key that was found while tracking zombies. (Defender of Varrock)", + "destroy": "true", + "destroy_message": "You'll have to keep searching trees near the zombie trails until you find another.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13759", + "name": "Scrap of paper", + "examine": "The location of ", + "destroy": "true", + "destroy_message": "You'll have to speak to Thurgo to find another.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13760", + "name": "Bottle", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13761", + "name": "Bottle of mist", + "examine": "A bottle of red mist.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13762", + "name": "List of elders", + "examine": "This lists each of the founding members of the ", + "destroy": "true", + "destroy_message": "You can get another from ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13763", + "name": "Cavalier and mask", + "examine": "I hope I don't meet any roundheads...", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13764", + "name": "Rune claws", + "examine": "A right hand fighting claw.", + "lendable": "true", + "low_alchemy": "2400", + "high_alchemy": "3600", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "6535", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "26,38,-4,0,0,10,19,5,0,0,0,39,0,0,0", + "weapon_interface": "9", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13765", + "name": "Rune dagger", + "examine": "A powerful dagger.", + "lendable": "true", + "low_alchemy": "3200", + "high_alchemy": "4800", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "4381", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "25,12,-4,1,0,0,0,0,1,0,0,24,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13766", + "name": "Rune dagger(p)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "25,12,-4,1,0,0,0,0,1,0,0,24,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13767", + "name": "Rune dagger(p+)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "25,12,-4,1,0,0,0,0,1,0,0,24,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13768", + "name": "Rune dagger(p++)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "25,12,-4,1,0,0,0,0,1,0,0,24,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13769", + "name": "Rune spear", + "examine": "A rune tipped spear.", + "lendable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "11317", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "36,36,36,0,0,1,1,0,0,0,0,42,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13770", + "name": "Dragon spear", + "examine": "A dragon tipped spear.", + "lendable": "true", + "low_alchemy": "24960", + "high_alchemy": "37440", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "36774", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13771", + "name": "Rune spear(p)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "36,36,36,0,0,1,1,0,0,0,0,42,0,0,0", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13772", + "name": "Dragon spear(p)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "has_special": "true", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13773", + "name": "Rune spear(p+)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "36,36,36,0,0,1,1,0,0,0,0,42,0,0,0", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13774", + "name": "Dragon spear(p+)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "has_special": "true", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13775", + "name": "Rune spear(p++)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "36,36,36,0,0,1,1,0,0,0,0,42,0,0,0", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13776", + "name": "Dragon spear(p++)", + "examine": "A picture of a lady called Elena.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "render_anim": "28", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "has_special": "true", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13777", + "name": "Rune sword", + "examine": "A razor-sharp sword.", + "lendable": "true", + "low_alchemy": "8320", + "high_alchemy": "12480", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "11849", + "render_anim": "1381", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "38,26,-2,0,0,0,2,1,0,0,0,39,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13778", + "name": "Rune 2h sword", + "examine": "A two handed sword.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "37511", + "render_anim": "124", + "attack_speed": "7", + "absorb": "0,0,0", + "bonuses": "-4,69,50,-4,0,0,0,0,0,-1,0,70,0,0,0", + "weapon_interface": "7", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13779", + "name": "Rune halberd", + "examine": "A rune halberd.", + "lendable": "true", + "low_alchemy": "51200", + "high_alchemy": "76800", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "74298", + "render_anim": "28", + "attack_speed": "7", + "absorb": "0,0,0", + "bonuses": "48,67,0,-4,0,-1,4,5,0,0,0,68,0,0,0", + "weapon_interface": "15", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13780", + "name": "Rune mace", + "examine": "A spiky mace.", + "lendable": "true", + "low_alchemy": "5760", + "high_alchemy": "8640", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "7917", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "20,-2,39,0,0,0,0,0,0,0,0,36,0,4,0", + "weapon_interface": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13781", + "name": "Rune chainbody", + "examine": "A series of connected metal rings.", + "lendable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "29145", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-15,0,63,72,78,-3,65,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13782", + "name": "Rune boots", + "examine": "These will protect my feet.", + "lendable": "true", + "low_alchemy": "5000", + "high_alchemy": "7500", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "7036", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-3,-1,12,13,14,0,0,10,2,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13783", + "name": "Rune med helm", + "examine": "A medium sized helmet.", + "lendable": "true", + "low_alchemy": "7680", + "high_alchemy": "11520", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "10678", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-3,-1,22,23,21,-1,22,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13784", + "name": "Granite helm", + "examine": "A stone helmet.", + "lendable": "true", + "low_alchemy": "18400", + "high_alchemy": "27600", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "26576", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-9,-7,31,33,29,-1,39,9,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13785", + "name": "Granite body", + "examine": "Provides excellent protection.", + "lendable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "136414", + "attack_speed": "4", + "absorb": "4,0,8", + "bonuses": "0,0,0,-22,-5,87,84,79,-6,97,45,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13786", + "name": "Granite legs", + "examine": "These look pretty heavy.", + "lendable": "true", + "low_alchemy": "26400", + "high_alchemy": "39600", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "72213", + "attack_speed": "4", + "absorb": "2,0,5", + "bonuses": "0,0,0,-31,-18,43,45,41,-4,68,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13787", + "name": "Rune sq shield", + "examine": "A medium square shield.", + "lendable": "true", + "low_alchemy": "15360", + "high_alchemy": "23040", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "22225", + "attack_speed": "4", + "absorb": "3,0,7", + "bonuses": "0,0,0,-6,-2,38,40,36,0,38,35,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13788", + "name": "Granite shield", + "examine": "A solid stone shield.", + "lendable": "true", + "low_alchemy": "22400", + "high_alchemy": "33600", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "32512", + "attack_speed": "4", + "absorb": "5,0,10", + "bonuses": "0,0,0,-12,-8,40,42,38,0,65,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13789", + "name": "A powdered wig", + "examine": "A big 'do about nothing.", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "42991", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13790", + "name": "Flared trousers", + "examine": "These'll help me stay alive.", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "811293", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13791", + "name": "Pantaloons", + "examine": "Alas, someone has slashed my pantaloons.", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "19286", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13792", + "name": "Sleeping cap", + "examine": "A cap for wearing whil...zzzzzzzzz", + "lendable": "true", + "low_alchemy": "800", + "high_alchemy": "1200", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "75357", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13793", + "name": "Rune cane", + "examine": "A diamond-topped cane.", + "lendable": "true", + "low_alchemy": "5760", + "high_alchemy": "8640", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "76692", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,-2,39,0,0,0,0,0,0,0,0,36,0,4,0", + "weapon_interface": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13794", + "name": "Top hat", + "examine": "Comes with a free rabbit!", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "333537", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13795", + "name": "Sheep mask", + "examine": "Shear elegance.", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "582969", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13796", + "name": "Penguin mask", + "examine": "I can get the look right, but can I do the waddle too?", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1159807", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13797", + "name": "Bat mask", + "examine": "The bats have left the belltower.", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "681595", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13798", + "name": "Cat mask", + "examine": "It's the year of the cat!", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2512014", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13799", + "name": "Wolf mask", + "examine": "I'm hungry like the wolf.", + "lendable": "true", + "low_alchemy": "320", + "high_alchemy": "480", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "3240770", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13800", + "name": "Rune platebody (g)", + "examine": "Rune platebody with gold trim.", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "343688", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13801", + "name": "Rune platelegs (g)", + "examine": "Rune platelegs with gold trim.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "drop", + "grand_exchange_price": "238139", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13802", + "name": "Rune plateskirt (g)", + "examine": "Rune plateskirt with gold trim.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "37616", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13803", + "name": "Rune full helm(g)", + "examine": "Rune full helmet with gold trim.", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "247877", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13804", + "name": "Rune kiteshield (g)", + "examine": "Rune kiteshield with gold trim", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "118205", + "attack_speed": "4", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13805", + "name": "Rune platebody (t)", + "examine": "Rune platebody with trim.", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "100586", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13806", + "name": "Rune platelegs (t)", + "examine": "Rune platelegs with trim!", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "81577", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13807", + "name": "Rune plateskirt (t)", + "examine": "Rune plateskirt with trim.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "37701", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13808", + "name": "Rune full helm (t)", + "examine": "Rune full helmet with trim.", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "95809", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13809", + "name": "Rune kiteshield (t)", + "examine": "A large, metal shield with a nice trim.", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "46469", + "attack_speed": "4", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13810", + "name": "Highwayman mask", + "examine": "Your money or your life!", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "252995", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13811", + "name": "Blue beret", + "examine": "Parlez-vous francais?", + "lendable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "135411", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13812", + "name": "Black beret", + "examine": "Parlez-vous francais?", + "lendable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "451371", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13813", + "name": "White beret", + "examine": "Parlez-vous Francais?", + "lendable": "true", + "low_alchemy": "32", + "high_alchemy": "48", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "704147", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13814", + "name": "Tan cavalier", + "examine": "All for one and one for all!", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "42014", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13815", + "name": "Dark cavalier", + "examine": "All for one and one for all!", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "61518", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13816", + "name": "Black cavalier", + "examine": "All for one and one for all!", + "lendable": "true", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "338530", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13817", + "name": "Red headband", + "examine": "A minimalist's hat.", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "159694", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13818", + "name": "Black headband", + "examine": "A minimalist's hat.", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "83543", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13819", + "name": "Brown headband", + "examine": "A minimalist's hat.", + "lendable": "true", + "low_alchemy": "16", + "high_alchemy": "24", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "26474", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13820", + "name": "Zamorak platebody", + "examine": "Rune platebody in the colours of Zamorak.", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "868398", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13821", + "name": "Zamorak platelegs", + "examine": "Rune platelegs in the colours of Zamorak.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "316989", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13822", + "name": "Zamorak plateskirt", + "examine": "Rune plateskirt in the colours of Zamorak.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "38597", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13823", + "name": "Zamorak full helm", + "examine": "A full helmet in the colours of Zamorak.", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "618480", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13824", + "name": "Zamorak kiteshield", + "examine": "A Rune kiteshield in the colours of Zamorak.", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "225574", + "attack_speed": "4", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13825", + "name": "Saradomin platebody", + "examine": "Rune platebody in the colours of Saradomin.", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1555099", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13826", + "name": "Saradomin platelegs", + "examine": "Rune platelegs in the colours of Saradomin!", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "376849", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13827", + "name": "Saradomin plateskirt", + "examine": "Rune plateskirt in the colours of Saradomin.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "53048", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13828", + "name": "Saradomin full helm", + "examine": "Rune full helmet in the colours of Saradomin.", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1025974", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13829", + "name": "Saradomin kiteshield", + "examine": "Rune kiteshield in the colours of Saradomin.", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "353916", + "attack_speed": "4", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13830", + "name": "Guthix platebody", + "examine": "Rune platebody in the colours of Guthix.", + "lendable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "406762", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13831", + "name": "Guthix platelegs", + "examine": "Rune platelegs in the colours of Guthix.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "181471", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13832", + "name": "Guthix plateskirt", + "examine": "Rune plateskirt in the colours of Guthix.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "38388", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13833", + "name": "Guthix full helm", + "examine": "A rune full helmet in the colours of Guthix.", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "399963", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13834", + "name": "Guthix kiteshield", + "examine": "Rune kiteshield in the colours of Guthix.", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "185266", + "attack_speed": "4", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13835", + "name": "Gilded platebody", + "examine": "Rune platebody with complete gold trim & plating.", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "2034838", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13836", + "name": "Gilded platelegs", + "examine": "Rune platelegs with gold plate.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1299758", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13837", + "name": "Gilded plateskirt", + "examine": "Rune plateskirt with gold plate.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "84191", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13838", + "name": "Gilded full helm", + "examine": "Rune full helmet with gold plate.", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1057068", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13839", + "name": "Gilded kiteshield", + "examine": "Rune kiteshield with gold plate.", + "lendable": "true", + "low_alchemy": "21760", + "high_alchemy": "32640", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "506093", + "attack_speed": "4", + "absorb": "3,0,7", + "bonuses": "0,0,0,-8,-2,44,48,46,-1,46,45,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13845", + "name": "Brawling gloves (melee)", + "examine": "A pair of gloves that gives you bonus Atk, Def, Str and LP xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13846", + "name": "Brawling gloves (ranged)", + "examine": "A pair of gloves that gives you bonus Ranged xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13847", + "name": "Brawling gloves (magic)", + "examine": "A pair of gloves that gives you bonus Magic xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13848", + "name": "Brawling gloves (prayer)", + "examine": "A pair of gloves that gives you bonus Prayer xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13849", + "name": "Brawling gloves (agility)", + "examine": "A pair of gloves that gives you bonus Agility xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13850", + "name": "Brawling gloves (wc)", + "examine": "A pair of gloves that gives you bonus Woodcutting xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13851", + "name": "Brawling gloves (fm)", + "examine": "A pair of gloves that gives you bonus Firemaking xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13852", + "name": "Brawling gloves (mining)", + "examine": "A pair of gloves that gives you bonus Mining xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13853", + "name": "Brawling gloves (hunter)", + "examine": "A pair of gloves that gives you bonus Hunting xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13854", + "name": "Brawling gloves (thieving)", + "examine": "A pair of gloves that gives you bonus Thieving xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13855", + "name": "Brawling gloves (smithing)", + "examine": "A pair of gloves that gives you bonus Smithing xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13856", + "name": "Brawling gloves (fishing)", + "examine": "A pair of gloves that gives you bonus Fishing xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13857", + "name": "Brawling gloves (cooking)", + "examine": "A pair of gloves that gives you bonus Cooking xp.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Your brawling gloves are fragile and will disappear if you drop them. Are you sure you want to drop them?", + "shop_price": "50000", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13858", + "name": "Zuriel's robe top", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "1412812", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "12,6,0", + "bonuses": "0,0,0,35,-10,63,45,74,35,0,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13859", + "name": "Zuriel's robe top", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "1412812", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13860", + "name": "Zuriel's robe top (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "1412812", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "12,6,0", + "bonuses": "0,0,0,35,-10,63,45,74,35,0,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13861", + "name": "Zuriel's robe bottom", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "986668", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,25,-7,38,35,44,24,0,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13862", + "name": "Zuriel's robe bottom", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "986668", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13863", + "name": "Zuriel's robe bottom (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "986668", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,25,-7,38,35,44,24,0,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13864", + "name": "Zuriel's hood", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "250000", + "grand_exchange_price": "361542", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,8,-2,20,16,22,8,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13865", + "name": "Zuriel's hood", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "250000", + "grand_exchange_price": "361542", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13866", + "name": "Zuriel's hood (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150000", + "grand_exchange_price": "361542", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,8,-2,20,16,22,8,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13867", + "name": "Zuriel's staff", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "2116989", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "13,-1,65,18,0,5,7,4,18,0,0,72,0,0,10", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13868", + "name": "Zuriel's staff", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "2116989", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13869", + "name": "Zuriel's staff (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "2116989", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "13,-1,65,18,0,5,7,4,18,0,0,72,0,0,10", + "weapon_interface": "1", + "attack_anims": "419,419,419,419", + "defence_anim": "420", + "attack_audios": "2555,0,0,0", + "requirements": "", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13870", + "name": "Morrigan's leather body", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "926341", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,12,6", + "bonuses": "0,0,0,-15,36,61,53,66,75,62,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13871", + "name": "Morrigan's leather body", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "926341", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13872", + "name": "Morrigan's leather body (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "926341", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,12,6", + "bonuses": "0,0,0,-15,36,61,53,66,75,62,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13873", + "name": "Morrigan's leather chaps", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop, Destroy after degrading.", + "shop_price": "500000", + "grand_exchange_price": "510395", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,8,4", + "bonuses": "0,0,0,-10,23,35,29,37,46,35,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13874", + "name": "Morrigan's leather chaps", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop, Destroy after degrading.", + "shop_price": "500000", + "grand_exchange_price": "510395", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13875", + "name": "Morrigan's leather chaps (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop, Destroy after degrading.", + "shop_price": "300000", + "grand_exchange_price": "510395", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,8,4", + "bonuses": "0,0,0,-10,23,35,29,37,46,35,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13876", + "name": "Morrigan's coif", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "250000", + "grand_exchange_price": "236411", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-5,13,8,11,14,8,12,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13877", + "name": "Morrigan's coif", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "250000", + "grand_exchange_price": "236411", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13878", + "name": "Morrigan's coif (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150000", + "grand_exchange_price": "236411", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-5,13,8,11,14,8,12,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13879", + "name": "Morrigan's javelin", + "examine": "A vicious javelin.", + "low_alchemy": "1600", + "high_alchemy": "2400", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "4000", + "grand_exchange_price": "19944", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,145,0,0", + "weapon_interface": "18", + "has_special": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13880", + "name": "Morrigan's javelin(p)", + "examine": "A vicious javelin.", + "low_alchemy": "1600", + "high_alchemy": "2400", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "10000", + "grand_exchange_price": "19944", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,145,0,0", + "weapon_interface": "18", + "has_special": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13881", + "name": "Morrigan's javelin(p+)", + "examine": "A vicious javelin.", + "low_alchemy": "1600", + "high_alchemy": "2400", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "10000", + "grand_exchange_price": "19944", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,145,0,0", + "weapon_interface": "18", + "has_special": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13882", + "name": "Morrigan's javelin(p++)", + "examine": "A vicious javelin.", + "low_alchemy": "1600", + "high_alchemy": "2400", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "10000", + "grand_exchange_price": "19944", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,145,0,0", + "weapon_interface": "18", + "has_special": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13883", + "name": "Morrigan's throwing axe", + "examine": "A vicious throwing axe.", + "low_alchemy": "1600", + "high_alchemy": "2400", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "4000", + "grand_exchange_price": "9994", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,93,0,0,0,0,0,0,0,117,0,0", + "weapon_interface": "18", + "has_special": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13884", + "name": "Statius's platebody", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "1619096", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "6,0,12", + "bonuses": "5,5,7,-30,-10,154,145,121,-6,157,60,5,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13885", + "name": "Statius's platebody", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "1619096", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13886", + "name": "Statius's platebody (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "1619096", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "6,0,12", + "bonuses": "5,5,7,-30,-10,154,145,121,-6,157,60,5,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13887", + "name": "Vesta's chainbody", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop, Destroy once it has been degraded.", + "shop_price": "500000", + "grand_exchange_price": "2154168", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "6,0,12", + "bonuses": "5,7,7,-15,0,120,131,145,-3,140,60,6,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13888", + "name": "Vesta's chainbody", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop, Destroy once it has been degraded.", + "shop_price": "500000", + "grand_exchange_price": "2154168", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13889", + "name": "Vesta's chainbody (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop, Destroy once it has been degraded.", + "shop_price": "300000", + "grand_exchange_price": "2154168", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "6,0,12", + "bonuses": "5,7,7,-15,0,120,131,145,-3,140,60,6,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13890", + "name": "Statius's platelegs", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "1735029", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "4,0,8", + "bonuses": "3,3,5,-21,-7,110,106,97,-4,121,30,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13891", + "name": "Statius's platelegs", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "1735029", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13892", + "name": "Statius's platelegs (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "1735029", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "4,0,8", + "bonuses": "3,3,5,-21,-7,110,106,97,-4,121,30,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13893", + "name": "Vesta's plateskirt", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "1860767", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "4,0,8", + "bonuses": "3,5,5,-17,-4,86,100,112,-2,118,30,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13894", + "name": "Vesta's plateskirt", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "500000", + "grand_exchange_price": "1860767", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13895", + "name": "Vesta's plateskirt (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "200000", + "high_alchemy": "300000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "1860767", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "4,0,8", + "bonuses": "3,5,5,-17,-4,86,100,112,-2,118,30,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13896", + "name": "Statius's full helm", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "250000", + "grand_exchange_price": "1301986", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "3,3,4,-6,-2,65,70,63,-1,71,15,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13897", + "name": "Statius's full helm", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "250000", + "grand_exchange_price": "1301986", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13898", + "name": "Statius' full helm (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "100000", + "high_alchemy": "150000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150000", + "grand_exchange_price": "1301986", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "3,3,4,-6,-2,65,70,63,-1,71,15,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13899", + "name": "Vesta's longsword", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "10464249", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "106,121,-2,0,0,1,4,3,0,0,0,118,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "381,390,390,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13900", + "name": "Vesta's longsword", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "10464249", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13901", + "name": "Vesta's longsword (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "10464249", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "106,121,-2,0,0,1,4,3,0,0,0,118,0,0,0", + "weapon_interface": "5", + "has_special": "true", + "attack_anims": "381,390,390,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,78}", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13902", + "name": "Statius's warhammer", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop, Destroy once it has been degraded.", + "shop_price": "300000", + "grand_exchange_price": "7424450", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "-4,-4,123,0,0,0,0,0,0,0,0,114,0,0,0", + "weapon_interface": "10", + "has_special": "true", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "attack_audios": "2504,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13903", + "name": "Statius's warhammer", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop, Destroy once it has been degraded.", + "shop_price": "300000", + "grand_exchange_price": "7424450", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13904", + "name": "Statius' warhammer (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop, Destroy once it has been degraded.", + "shop_price": "300000", + "grand_exchange_price": "7424450", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "1210", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "-4,-4,123,0,0,0,0,0,0,0,0,114,0,0,0", + "weapon_interface": "10", + "has_special": "true", + "attack_anims": "395,395,395,395", + "attack_audios": "2504,0,0,0", + "requirements": "", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13905", + "name": "Vesta's spear", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "5264612", + "stand_anim": "813", + "stand_turn_anim": "1209", + "walk_anim": "1205", + "run_anim": "1210", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "133,113,120,0,0,18,21,21,0,0,0,122,0,0,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "weight": "4.2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13906", + "name": "Vesta's spear", + "examine": "This item degrades in combat, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "300000", + "grand_exchange_price": "5264612", + "attack_speed": "4", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13907", + "name": "Vesta's spear (deg)", + "examine": "This item degrades in combat, and will turn to dust.", + "low_alchemy": "120000", + "high_alchemy": "180000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "180000", + "grand_exchange_price": "5264612", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "133,113,120,0,0,18,21,21,0,0,0,122,0,0,0", + "weapon_interface": "14", + "has_special": "true", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13908", + "name": "Corrupt statius's platebody", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "1897306", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "6,0,12", + "bonuses": "5,5,7,-10,-30,154,145,121,-6,157,60,5,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13909", + "name": "Corrupt statius's platebody", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "1897306", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13910", + "name": "Corrupt statius's platebody (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "1897306", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "6,0,12", + "bonuses": "5,5,7,-10,-30,154,145,121,-6,157,60,5,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13911", + "name": "Corrupt vesta's chainbody", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "2546175", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "6,0,12", + "bonuses": "5,7,7,-15,0,120,131,145,-3,140,60,6,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13912", + "name": "Corrupt vesta's chainbody", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "2546175", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13913", + "name": "Corrupt vesta's chainbody (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "2546175", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "6,0,12", + "bonuses": "5,7,7,-15,0,120,131,145,-3,140,60,6,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13914", + "name": "Corrupt statius's platelegs", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "1734527", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "4,0,8", + "bonuses": "3,3,5,-21,-7,110,106,97,-4,121,30,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13915", + "name": "Corrupt statius's platelegs", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "1734527", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13916", + "name": "Corrupt statius's platelegs (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "1734527", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "4,0,8", + "bonuses": "3,3,5,-21,-7,110,106,97,-4,121,30,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13917", + "name": "Corrupt vesta's plateskirt", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "1942627", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "4,0,8", + "bonuses": "3,5,5,-17,-4,86,100,112,-2,118,30,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13918", + "name": "Corrupt vesta's plateskirt", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "1942627", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13919", + "name": "Corrupt vesta's plateskirt (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "1942627", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "4,0,8", + "bonuses": "3,5,5,-17,-4,86,100,112,-2,118,30,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13920", + "name": "Corrupt statius's full helm", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "50000", + "grand_exchange_price": "1062835", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "3,3,4,-6,-2,65,70,63,-1,71,15,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13921", + "name": "Corrupt statius's full helm", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "50000", + "grand_exchange_price": "1062835", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13922", + "name": "Corrupt statius' full helm (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "1062835", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "3,3,4,-6,-2,65,70,63,-1,71,15,3,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13923", + "name": "Corrupt vesta's longsword", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "3739998", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "106,121,-2,0,0,1,4,3,0,0,0,118,0,0,0", + "weapon_interface": "5", + "attack_anims": "381,390,390,390", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13924", + "name": "Corrupt vesta's longsword", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "3739998", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1426", + "attack_speed": "4", + "attack_anims": "381,390,390,390", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13925", + "name": "C. vesta's longsword (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "3739998", + "stand_turn_anim": "823", + "walk_anim": "1205", + "run_anim": "824", + "turn180_anim": "1206", + "turn90cw_anim": "1207", + "turn90ccw_anim": "1208", + "render_anim": "1426", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "106,121,-2,0,0,1,4,3,0,0,0,118,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13926", + "name": "Corrupt statius's warhammer", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "3033516", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "-4,-4,123,0,0,0,0,0,0,0,0,114,0,0,0", + "weapon_interface": "8", + "defence_anim": "397", + "attack_audios": "395,395,395,395", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13927", + "name": "Corrupt statius's warhammer", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "3033516", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13928", + "name": "C. statius's warhammer (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "3033516", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "-4,-4,123,0,0,0,0,0,0,0,0,114,0,0,0", + "weapon_interface": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13929", + "name": "Corrupt vesta's spear", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "343474", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "133,113,120,0,0,18,21,21,0,0,0,122,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13930", + "name": "Corrupt vesta's spear", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "343474", + "attack_speed": "4", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13931", + "name": "Corrupt vesta's spear (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "30000", + "high_alchemy": "45000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "343474", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "133,113,120,0,0,18,21,21,0,0,0,122,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13932", + "name": "Corrupt zuriel's robe top", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "253230", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "12,6,0", + "bonuses": "0,0,0,35,-10,63,45,74,35,0,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13933", + "name": "Corrupt zuriel's robe top", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "253230", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13934", + "name": "Corrupt zuriel's robe top (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "253230", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "12,6,0", + "bonuses": "0,0,0,35,-10,63,45,74,35,0,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13935", + "name": "Corrupt zuriel's robe bottom", + "examine": "This item degrades while worn, and will turn to dust.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "121290", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,25,-7,38,35,44,24,0,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13936", + "name": "Corrupt zuriel's robe bottom", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "121290", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13937", + "name": "Corrupt zuriel's robe bottom (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "121290", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "8,4,0", + "bonuses": "0,0,0,25,-7,38,35,44,24,0,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13938", + "name": "Corrupt zuriel's hood", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "50000", + "grand_exchange_price": "43778", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,8,-2,20,16,22,8,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13939", + "name": "Corrupt zuriel's hood", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "50000", + "grand_exchange_price": "43778", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13940", + "name": "Corrupt zuriel's hood (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "43778", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,8,-2,20,16,22,8,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13941", + "name": "Corrupt zuriel's staff", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "28000", + "high_alchemy": "42000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "219418", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "13,-1,65,18,0,5,7,4,18,0,0,72,0,0,10", + "weapon_interface": "1", + "attack_anims": "2555,0,0,0", + "attack_audios": "2555,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13942", + "name": "Corrupt zuriel's staff", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "28000", + "high_alchemy": "42000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "219418", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13943", + "name": "Corrupt zuriel's staff (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "28000", + "high_alchemy": "42000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "70000", + "grand_exchange_price": "219418", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "13,-1,65,18,0,5,7,4,18,0,0,72,0,0,10", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13944", + "name": "Corrupt morrigan's leather body", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "387212", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,12,6", + "bonuses": "0,0,0,-15,36,61,53,66,75,62,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13945", + "name": "Corrupt morrigan's leather body", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "387212", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13946", + "name": "Corrupt morrigan's leather body (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "387212", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,12,6", + "bonuses": "0,0,0,-15,36,61,53,66,75,62,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13947", + "name": "Corrupt morrigan's leather chaps", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "84592", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,8,4", + "bonuses": "0,0,0,-10,23,35,29,37,46,35,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13948", + "name": "Corrupt morrigan's leather chaps", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "125000", + "grand_exchange_price": "84592", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13949", + "name": "Corrupt morrigan's leather chaps (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "50000", + "high_alchemy": "75000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75000", + "grand_exchange_price": "84592", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,8,4", + "bonuses": "0,0,0,-10,23,35,29,37,46,35,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13950", + "name": "Corrupt morrigan's coif", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "50000", + "grand_exchange_price": "63502", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-5,13,8,11,14,8,12,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13951", + "name": "Corrupt morrigan's coif", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "50000", + "grand_exchange_price": "63502", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13952", + "name": "Corrupt morrigan's coif (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "20000", + "high_alchemy": "30000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "63502", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-5,13,8,11,14,8,12,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13953", + "name": "Corrupt morrigan's javelin", + "examine": "A vicious javelin.", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1000", + "grand_exchange_price": "6752", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,145,0,0", + "weapon_interface": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13954", + "name": "C. morrigan's javelin (p)", + "examine": "A vicious javelin.", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "10000", + "grand_exchange_price": "6752", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,145,0,0", + "weapon_interface": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13955", + "name": "C. morrigan's javelin (p+)", + "examine": "A vicious javelin.", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "10000", + "grand_exchange_price": "6752", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,145,0,0", + "weapon_interface": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13956", + "name": "C. morrigan's javelin (p++)", + "examine": "A vicious javelin.", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "10000", + "grand_exchange_price": "6752", + "render_anim": "1381", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,105,0,0,0,0,0,0,0,145,0,0", + "weapon_interface": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13957", + "name": "C. morrigan's throwing axe", + "examine": "A vicious throwing axe.", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1000", + "grand_exchange_price": "5388", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,93,0,0,0,0,0,0,0,117,0,0", + "weapon_interface": "18", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13958", + "name": "Corrupt dragon chainbody", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "28800", + "high_alchemy": "43200", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "168278", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-15,0,81,93,98,-3,82,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13959", + "name": "Corrupt dragon chainbody", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "28800", + "high_alchemy": "43200", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "168278", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13960", + "name": "Corrupt dragon chainbody (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "28800", + "high_alchemy": "43200", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "72000", + "grand_exchange_price": "168278", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-15,0,81,93,98,-3,82,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13961", + "name": "Corrupt dragon med helm", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "14400", + "high_alchemy": "21600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60000", + "grand_exchange_price": "121835", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-3,-1,33,35,32,-1,34,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13962", + "name": "Corrupt dragon med helm", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "14400", + "high_alchemy": "21600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60000", + "grand_exchange_price": "121835", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13963", + "name": "Corrupt dragon med helm (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "14400", + "high_alchemy": "21600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "36000", + "grand_exchange_price": "121835", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-3,-1,33,35,32,-1,34,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13964", + "name": "Corrupt dragon sq shield", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "79703", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "5,0,11", + "bonuses": "0,0,0,-6,-2,50,52,48,0,50,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13965", + "name": "Corrupt dragon sq shield", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "79703", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13966", + "name": "Corrupt dragon sq shield (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "72000", + "grand_exchange_price": "79703", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "5,0,11", + "bonuses": "0,0,0,-6,-2,50,52,48,0,50,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13967", + "name": "Corrupt dragon plateskirt", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Destroy", + "shop_price": "120000", + "grand_exchange_price": "71066", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,68,66,63,-4,65,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13968", + "name": "Corrupt dragon plateskirt", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Destroy", + "shop_price": "120000", + "grand_exchange_price": "71066", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13969", + "name": "Corrupt dragon plateskirt (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Destroy", + "shop_price": "72000", + "grand_exchange_price": "71066", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,68,66,63,-4,65,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13970", + "name": "Corrupt dragon platelegs", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "87957", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,68,66,63,-4,65,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13971", + "name": "Corrupt dragon platelegs", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "87957", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13972", + "name": "Corrupt dragon platelegs (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "72000", + "grand_exchange_price": "87957", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-21,-7,68,66,63,-4,65,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13973", + "name": "Corrupt dragon battleaxe", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "28800", + "high_alchemy": "43200", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "332229", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "-2,70,65,0,0,0,0,0,-1,-1,0,85,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13974", + "name": "Corrupt dragon battleaxe", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "28800", + "high_alchemy": "43200", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "332229", + "render_anim": "2586", + "attack_speed": "4", + "bonuses": "-2,70,65,0,0,0,0,0,0,-1,0,85,0,0,0", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13975", + "name": "C. dragon battleaxe (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "28800", + "high_alchemy": "43200", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "72000", + "grand_exchange_price": "332229", + "render_anim": "2586", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "-2,70,65,0,0,0,0,0,-1,-1,0,85,0,0,0", + "weapon_interface": "2", + "attack_anims": "395,395,395,395", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "2.7", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13976", + "name": "Corrupt dragon dagger", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "33358", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "weapon_interface": "5", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13977", + "name": "Corrupt dragon dagger", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "33358", + "attack_speed": "4", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13978", + "name": "C. dragon dagger (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "18000", + "grand_exchange_price": "33358", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "40,25,-4,1,0,0,0,0,1,0,0,40,0,0,0", + "weapon_interface": "5", + "attack_anims": "396,396,395,396", + "defence_anim": "397", + "attack_audios": "2517,2517,2500,2517", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13979", + "name": "Corrupt dragon scimitar", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100000", + "grand_exchange_price": "338644", + "render_anim": "1928", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "8,67,-2,0,0,0,1,0,0,0,0,66,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,0,2517,0", + "requirements": "{0,60}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13980", + "name": "Corrupt dragon scimitar", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100000", + "grand_exchange_price": "338644", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13981", + "name": "C. dragon scimitar (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60000", + "grand_exchange_price": "338644", + "render_anim": "1928", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "8,67,-2,0,0,0,1,0,0,0,0,66,0,0,0", + "weapon_interface": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13982", + "name": "Corrupt dragon longsword", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100000", + "grand_exchange_price": "207053", + "render_anim": "1582", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "58,69,-2,0,0,0,3,2,1,0,0,71,0,0,0", + "weapon_interface": "5", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,60}", + "weight": "1.8", + "ge_buy_limit": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13983", + "name": "Corrupt dragon longsword", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100000", + "grand_exchange_price": "207053", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13984", + "name": "C. dragon longsword (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "40000", + "high_alchemy": "60000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60000", + "grand_exchange_price": "207053", + "render_anim": "1582", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "58,69,-2,0,0,0,3,2,1,0,0,71,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13985", + "name": "Corrupt dragon mace", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "50000", + "grand_exchange_price": "50096", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "40,-2,60,1,0,0,0,0,0,0,0,55,0,5,0", + "weapon_interface": "8", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13986", + "name": "Corrupt dragon mace", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "50000", + "grand_exchange_price": "50096", + "attack_speed": "4", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13987", + "name": "Corrupt dragon mace (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "50096", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "40,-2,60,1,0,0,0,0,0,0,0,55,0,5,0", + "weapon_interface": "8", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "requirements": "{0,60}", + "weight": "1.8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13988", + "name": "Corrupt dragon spear", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "8800", + "high_alchemy": "13200", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "40000", + "grand_exchange_price": "920922", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13989", + "name": "Corrupt dragon spear", + "examine": "This item degrades while worn, and will turn to dust.", + "tradeable": "true", + "low_alchemy": "8800", + "high_alchemy": "13200", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "40000", + "grand_exchange_price": "920922", + "attack_speed": "4", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "13990", + "name": "Corrupt dragon spear (deg)", + "examine": "This item degrades while worn, and will turn to dust.", + "low_alchemy": "8800", + "high_alchemy": "13200", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "24000", + "grand_exchange_price": "920922", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "55,55,55,0,0,5,5,5,5,5,0,60,0,0,0", + "weapon_interface": "14", + "two_handed": "true", + "attack_anims": "2080,2081,2082,2080", + "defence_anim": "2079", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14056", + "name": "Pvp worlds manual", + "examine": "A book about the Wilderness.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "destroy_message": "You can get another copy by searching bookshelves around RuneScape.", + "shop_price": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14057", + "name": "Broomstick", + "examine": "A threat to dusty corners everywhere.", + "low_alchemy": "10", + "high_alchemy": "15", + "destroy": "true", + "destroy_message": "You can obtain another by talking to Maggie the witch.", + "shop_price": "25", + "render_anim": "1072", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "8", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14058", + "name": "Goulash", + "examine": "What a curious and ghoulish smell!", + "high_alchemy": "1", + "destroy": "true", + "destroy_message": "If you drop the goulash, it will be destroyed. You can get some more by dipping a bowl into Maggie's cauldron.", + "shop_price": "2", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14061", + "name": "Magic unguent", + "examine": "Purple and pungent.", + "destroy": "true", + "destroy_message": "You can get another flask of magic unguent from the chest in Betty's basement.", + "shop_price": "2", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14062", + "name": "Broom ointment", + "examine": "To be used on brooms.", + "destroy": "true", + "destroy_message": "You can get another flask of broom ointment from Hetty in Rimmington.", + "shop_price": "2", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14064", + "name": "Newt", + "examine": "A newt from Hetty's basement.", + "destroy": "true", + "destroy_message": "If you release this newt, you can get another from the crate in Hetty's basement in Rimmington.", + "shop_price": "5", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14065", + "name": "Newt label", + "examine": "A label for a shipping crate.", + "destroy": "true", + "destroy_message": "You can get another newt label from Gus in Hetty's basement in Rimmington.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14066", + "name": "Toad label", + "examine": "A label for a shipping crate.", + "destroy": "true", + "destroy_message": "You can get another toad label from Gus in Hetty's basement in Rimmington.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14067", + "name": "Newts and toads label", + "examine": "A label for a shipping crate.", + "destroy": "true", + "destroy_message": "You can get another newt-and-toad label from Gus in Hetty's basement in Rimmington.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14068", + "name": "Betty's wand", + "examine": "Warm to the touch.", + "destroy": "true", + "destroy_message": "You can obtain another wand from the chest in Betty's basement.", + "shop_price": "15", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14069", + "name": "Magic slate", + "examine": "What a view!", + "destroy": "true", + "destroy_message": "If you destroy this item, you can get another from Lottie in Betty's basement.", + "shop_price": "2", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14070", + "name": "Reptile", + "examine": "Desert dweller.", + "destroy": "true", + "destroy_message": "If you release this creature, you will have to restart the puzzle in Betty's basement.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14071", + "name": "Blackbird", + "examine": "Bleak and beaky.", + "destroy": "true", + "destroy_message": "If you release this creature, you will have to restart the puzzle in Betty's basement.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14072", + "name": "Bat", + "examine": "An annoying flappy thing.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14073", + "name": "Spider", + "examine": "It's an extremely small brown spider, probably very poisonous.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14074", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14075", + "name": "Snail", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14076", + "name": "Warlock top", + "examine": "The height of warlock fashion.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "You can get another warlock top from Diango in Draynor Village.", + "shop_price": "15", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14077", + "name": "Warlock legs", + "examine": "Tattered but trendy.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "You can get another set of warlock legs from Diango in Draynor Village.", + "shop_price": "15", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14078", + "name": "Witch top", + "examine": "The height of witchly fashion.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "You can get another witch top from Diango in Draynor.", + "shop_price": "15", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14079", + "name": "Witch skirt", + "examine": "Tattered but trendy.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "You can get another witch top from Diango in Draynor.", + "shop_price": "15", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14080", + "name": "Witch cloak", + "examine": "Ragged but rugged.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "You can get another witch cloak from Diango in Draynor.", + "shop_price": "15", + "equipment_slot": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14081", + "name": "Warlock cloak", + "examine": "Ragged but rugged.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "You can get another warlock cloak from Diango in Draynor Village.", + "shop_price": "15", + "equipment_slot": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14082", + "name": "Popcorn ball", + "examine": "A sticky orb of popped corn.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14083", + "name": "Chocolate drop", + "examine": "Chocolatey goodness.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14084", + "name": "Wrapped candy", + "examine": "Sugary bliss.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14085", + "name": "Armadyl communiqu?", + "examine": "An urgent communiqu?? revealing important information.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14086", + "name": "Witch top", + "examine": "The height of witchly fashion.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "You can get another witch top from Diango in Draynor.", + "shop_price": "15", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14087", + "name": "Witch skirt", + "examine": "Tattered but trendy.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "You can get another witch top from Diango in Draynor.", + "shop_price": "15", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14088", + "name": "Witch cloak", + "examine": "Ragged but rugged.", + "low_alchemy": "6", + "high_alchemy": "9", + "destroy": "true", + "destroy_message": "You can get another witch cloak from Diango in Draynor.", + "shop_price": "15", + "equipment_slot": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14089", + "name": "Pet kitten", + "examine": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14090", + "name": "Pet cat", + "examine": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14091", + "name": "Lazy cat", + "examine": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14092", + "name": "Overgrown cat", + "examine": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14093", + "name": "Wily cat", + "examine": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14094", + "name": "Sacred clay platebody", + "examine": "The sacred clay top has transformed into a spiked, platemail body.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "43333", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-30,-10,82,80,72,-6,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14095", + "name": "Sacred clay platelegs", + "examine": "The sacred clay bottom has transformed into spiked, platemail legs.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "42667", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-21,-7,51,49,47,-4,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14096", + "name": "Sacred clay helm", + "examine": "The sacred clay hat has transformed into a spined helm.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "23467", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-6,-2,30,32,27,-1,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14097", + "name": "Sacred clay scimitar", + "examine": "The sacred clay weapon has transformed into a sharp scimitar.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "17066", + "render_anim": "1629", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "7,45,-2,0,0,0,1,0,0,0,0,44,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14098", + "name": "Volatile clay tool", + "examine": "This can turn into a variety of tools.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14099", + "name": "Volatile clay pickaxe", + "examine": "Your volatile tool wants to mine some rocks.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "4,-2,2,0,0,0,1,0,0,0,0,5,0,0,0", + "weapon_interface": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14100", + "name": "Volatile clay hatchet", + "examine": "Your volatile tool wants to cut some wood.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "-2,26,24,0,0,0,1,0,0,0,0,29,0,0,0", + "weapon_interface": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14101", + "name": "Volatile clay harpoon", + "examine": "Your volatile tool wants to spear some big fish.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14102", + "name": "Volatile clay butterfly net", + "examine": "Your volatile tool wants to catch some butterflies.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "render_anim": "158", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14103", + "name": "Volatile clay fletching knife", + "examine": "Your volatile tool wants to make some bows or arrows.", + "low_alchemy": "1", + "high_alchemy": "1", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14104", + "name": "Volatile clay hammer", + "examine": "Your volatile tool wants to work metal or build furniture.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14105", + "name": "Volatile clay needle", + "examine": "Your volatile tool wants to make some leather armour.", + "high_alchemy": "1", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14106", + "name": "Proto-tool", + "examine": "This can turn into a variety of tools.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14107", + "name": "Sacred clay pickaxe", + "examine": "Your sacred clay tool has transformed into a pickaxe.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "4,-2,2,0,0,0,1,0,0,0,0,5,0,0,0", + "weapon_interface": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14108", + "name": "Sacred clay hatchet", + "examine": "Your sacred clay tool has transformed into a hatchet.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "-2,4,2,0,0,0,1,0,0,0,0,5,0,0,0", + "weapon_interface": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14109", + "name": "Sacred clay harpoon", + "examine": "Your sacred clay tool has transformed into a harpoon.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14110", + "name": "Sacred clay butterfly net", + "examine": "Your sacred clay tool has transformed into a butterfly net.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1", + "render_anim": "158", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "4,-2,2,0,0,0,1,0,0,0,0,5,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14111", + "name": "Sacred clay fletching knife", + "examine": "The sacred clay has transformed into a knife.", + "high_alchemy": "1", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14112", + "name": "Sacred clay hammer", + "examine": "Your sacred clay tool has transformed into a hammer.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14113", + "name": "Sacred clay needle", + "examine": "The sacred clay has transformed into a needle.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "21333", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14114", + "name": "Sacred clay robe top", + "examine": "The sacred clay top has transformed into a heavy, magical robe.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "43333", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "6,3,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14115", + "name": "Sacred clay robe bottom", + "examine": "The sacred clay bottom has transformed into a heavy, magical robe.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "42667", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "4,2,0", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14116", + "name": "Sacred clay hat", + "examine": "The sacred clay hat has transformed into a wizard hat.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "23467", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14117", + "name": "Sacred clay staff", + "examine": "The sacred clay weapon has transformed into a magical staff.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "17066", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "10,-1,40,10,0,2,3,1,10,0,0,50,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14118", + "name": "Sacred clay body", + "examine": "The sacred clay top has transformed into a leather body.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "43333", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,6,3", + "bonuses": "0,0,0,-15,15,40,32,45,20,40,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14119", + "name": "Sacred clay chaps", + "examine": "The sacred clay bottom has been transformed into a set of chaps.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "42667", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,4,2", + "bonuses": "0,0,0,-10,8,22,16,24,8,22,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14120", + "name": "Sacred clay coif", + "examine": "The sacred clay hat has transformed into a coif.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "23467", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,3,1", + "bonuses": "0,0,0,-1,2,4,6,8,4,4,5,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14121", + "name": "Sacred clay bow", + "examine": "The sacred clay weapon has transformed into a bow.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "17066", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,47,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14122", + "name": "Pickaxe (class 1)", + "examine": "The sacred clay has become hard enough to chip stone.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "10,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14123", + "name": "Pickaxe (class 1)", + "examine": "The sacred clay has become hard enough to chip stone.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14124", + "name": "Pickaxe (class 2)", + "examine": "The sacred clay has become hard enough to chip stone.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "15,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14125", + "name": "Pickaxe (class 2)", + "examine": "The sacred clay has become hard enough to chip stone.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14126", + "name": "Pickaxe (class 3)", + "examine": "The sacred clay has become hard enough to chip stone.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "20,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14127", + "name": "Pickaxe (class 3)", + "examine": "The sacred clay has become hard enough to chip stone.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14128", + "name": "Pickaxe (class 4)", + "examine": "The sacred clay has become hard enough to chip stone.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "25,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14129", + "name": "Pickaxe (class 4)", + "examine": "The sacred clay has become hard enough to chip stone.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14130", + "name": "Pickaxe (class 5)", + "examine": "The sacred clay has become hard enough to chip stone.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "30,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14131", + "name": "Pickaxe (class 5)", + "examine": "The sacred clay has become hard enough to chip stone.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14132", + "name": "Hatchet (class 1)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,10,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14133", + "name": "Hatchet (class 1)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14134", + "name": "Hatchet (class 2)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,15,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14135", + "name": "Hatchet (class 2)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14136", + "name": "Hatchet (class 3)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,20,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14137", + "name": "Hatchet (class 3)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14138", + "name": "Hatchet (class 4)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,25,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14139", + "name": "Hatchet (class 4)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14140", + "name": "Hatchet (class 5)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,30,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "2", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14141", + "name": "Hatchet (class 5)", + "examine": "The sacred clay has become sharp enough to cut wood.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14142", + "name": "Harpoon (class 1)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "10,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14143", + "name": "Harpoon (class 1)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14144", + "name": "Harpoon (class 2)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "15,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14145", + "name": "Harpoon (class 2)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14146", + "name": "Harpoon (class 3)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "20,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14147", + "name": "Harpoon (class 3)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14148", + "name": "Harpoon (class 4)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "25,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14149", + "name": "Harpoon (class 4)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14150", + "name": "Harpoon (class 5)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "30,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14151", + "name": "Harpoon (class 5)", + "examine": "The sacred clay has become long enough to reach the depths of pools.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14152", + "name": "Butterfly net (class 1)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "render_anim": "158", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,10,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "14", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14153", + "name": "Butterfly net (class 1)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14154", + "name": "Butterfly net (class 2)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "render_anim": "158", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,15,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "14", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14155", + "name": "Butterfly net (class 2)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14156", + "name": "Butterfly net (class 3)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "render_anim": "158", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,20,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "14", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14157", + "name": "Butterfly net (class 3)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14158", + "name": "Butterfly net (class 4)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "render_anim": "158", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,25,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "14", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14159", + "name": "Butterfly net (class 4)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14160", + "name": "Butterfly net (class 5)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "render_anim": "158", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,30,0,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "14", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14161", + "name": "Butterfly net (class 5)", + "examine": "The sacred clay has become light enough to swing at floating shards.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14162", + "name": "Food (class 1)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14163", + "name": "Food (class 1)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14164", + "name": "Food (class 2)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14165", + "name": "Food (class 2)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14166", + "name": "Food (class 3)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14167", + "name": "Food (class 3)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14168", + "name": "Food (class 4)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14169", + "name": "Food (class 4)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14170", + "name": "Food (class 5)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14171", + "name": "Food (class 5)", + "examine": "The sacred clay has transformed into something bland, but edible.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14172", + "name": "Barrier (class 1)", + "examine": "The clay has transformed into an expandable wall.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14173", + "name": "Barrier (class 1)", + "examine": "The clay has transformed into an expandable wall.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14174", + "name": "Barrier (class 2)", + "examine": "The clay has transformed into an expandable wall.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14175", + "name": "Barrier (class 2)", + "examine": "The clay has transformed into an expandable wall.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14176", + "name": "Barrier (class 3)", + "examine": "The clay has transformed into an expandable wall.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14177", + "name": "Barrier (class 3)", + "examine": "The clay has transformed into an expandable wall.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14178", + "name": "Barrier (class 4)", + "examine": "The clay has transformed into an expandable wall.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14179", + "name": "Barrier (class 4)", + "examine": "The clay has transformed into an expandable wall.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14180", + "name": "Barrier (class 5)", + "examine": "The clay has transformed into an expandable wall.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14181", + "name": "Barrier (class 5)", + "examine": "The clay has transformed into an expandable wall.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14182", + "name": "Sacred clay (class 1)", + "examine": "Very low quality sacred clay.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "15", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14183", + "name": "Sacred clay (class 1)", + "examine": "Very low quality sacred clay.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "15", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14184", + "name": "Sacred clay (class 2)", + "examine": "Low quality sacred clay.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14185", + "name": "Sacred clay (class 2)", + "examine": "Low quality sacred clay.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14186", + "name": "Sacred clay (class 3)", + "examine": "Medium quality sacred clay.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "45", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14187", + "name": "Sacred clay (class 3)", + "examine": "Medium quality sacred clay.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "45", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14188", + "name": "Sacred clay (class 4)", + "examine": "High quality sacred clay.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14189", + "name": "Sacred clay (class 4)", + "examine": "High quality sacred clay.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14190", + "name": "Sacred clay (class 5)", + "examine": "Very high quality sacred clay.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14191", + "name": "Sacred clay (class 5)", + "examine": "Very high quality sacred clay.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "75", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14192", + "name": "Bow (class 1)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,55,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14193", + "name": "Bow (class 1)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14194", + "name": "Bow (class 2)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,90,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14195", + "name": "Bow (class 2)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14196", + "name": "Bow (class 3)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,135,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14197", + "name": "Bow (class 3)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14198", + "name": "Bow (class 4)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,180,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14199", + "name": "Bow (class 4)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14200", + "name": "Bow (class 5)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,225,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "16", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14201", + "name": "Bow (class 5)", + "examine": "The sacred clay has transformed into a wood-like substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14202", + "name": "Arrows (class 1)", + "examine": "The Sacred Clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "2", + "equipment_slot": "13", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,15,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14203", + "name": "Arrows (class 2)", + "examine": "The Sacred Clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "4", + "equipment_slot": "13", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,30,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14204", + "name": "Arrows (class 3)", + "examine": "The Sacred Clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "6", + "equipment_slot": "13", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,45,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14205", + "name": "Arrows (class 4)", + "examine": "The Sacred Clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "8", + "equipment_slot": "13", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,60,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14206", + "name": "Arrows (class 5)", + "examine": "The Sacred Clay has transformed into a wood-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "10", + "equipment_slot": "13", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,75,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14207", + "name": "Prayer potion(5)", + "examine": "(X) doses of Prayer restore potion.", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14208", + "name": "Prayer potion(5)", + "examine": "(X) doses of Prayer restore potion.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14209", + "name": "Prayer potion(4)", + "examine": "(X) doses of Prayer restore potion.", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14210", + "name": "Prayer potion(4)", + "examine": "(X) doses of Prayer restore potion.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14211", + "name": "Prayer potion(3)", + "examine": "(X) doses of Prayer restore potion.", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14212", + "name": "Prayer potion(3)", + "examine": "(X) doses of Prayer restore potion.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14213", + "name": "Prayer potion(2)", + "examine": "(X) doses of Prayer restore potion.", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14214", + "name": "Prayer potion(2)", + "examine": "(X) doses of Prayer restore potion.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14215", + "name": "Prayer potion(1)", + "examine": "(X) doses of Prayer restore potion.", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14216", + "name": "Prayer potion(1)", + "examine": "(X) doses of Prayer restore potion.", + "tradeable": "true", + "low_alchemy": "61", + "high_alchemy": "91", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14217", + "name": "Energy potion (5)", + "examine": "X doses of energy potion.", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14218", + "name": "Energy potion (5)", + "examine": "X doses of energy potion.", + "tradeable": "true", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14219", + "name": "Energy potion (4)", + "examine": "X doses of energy potion.", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14220", + "name": "Energy potion (4)", + "examine": "X doses of energy potion.", + "tradeable": "true", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14221", + "name": "Energy potion (3)", + "examine": "X doses of energy potion.", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14222", + "name": "Energy potion (3)", + "examine": "X doses of energy potion.", + "tradeable": "true", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14223", + "name": "Energy potion (2)", + "examine": "X doses of energy potion.", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14224", + "name": "Energy potion (2)", + "examine": "X doses of energy potion.", + "tradeable": "true", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14225", + "name": "Energy potion (1)", + "examine": "X doses of energy potion.", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14226", + "name": "Energy potion (1)", + "examine": "X doses of energy potion.", + "tradeable": "true", + "low_alchemy": "58", + "high_alchemy": "87", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14227", + "name": "Super attack(5)", + "examine": "X dose(s) of super Attack potion.", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14228", + "name": "Super attack(5)", + "examine": "X dose(s) of super Attack potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14229", + "name": "Super attack(4)", + "examine": "X dose(s) of super Attack potion.", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14230", + "name": "Super attack(4)", + "examine": "X dose(s) of super Attack potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14231", + "name": "Super attack(3)", + "examine": "X dose(s) of super Attack potion.", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14232", + "name": "Super attack(3)", + "examine": "X dose(s) of super Attack potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14233", + "name": "Super attack(2)", + "examine": "X dose(s) of super Attack potion.", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14234", + "name": "Super attack(2)", + "examine": "X dose(s) of super Attack potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14235", + "name": "Super attack(1)", + "examine": "X dose(s) of super Attack potion.", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14236", + "name": "Super attack(1)", + "examine": "X dose(s) of super Attack potion.", + "tradeable": "true", + "low_alchemy": "72", + "high_alchemy": "108", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14237", + "name": "Super strength(5)", + "examine": "X dose(s) of super Strength potion.", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14238", + "name": "Super strength(5)", + "examine": "X dose(s) of super Strength potion.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14239", + "name": "Super strength(4)", + "examine": "X dose(s) of super Strength potion.", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14240", + "name": "Super strength(4)", + "examine": "X dose(s) of super Strength potion.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14241", + "name": "Super strength(3)", + "examine": "X dose(s) of super Strength potion.", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14242", + "name": "Super strength(3)", + "examine": "X dose(s) of super Strength potion.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14243", + "name": "Super strength(2)", + "examine": "X dose(s) of super Strength potion.", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14244", + "name": "Super strength(2)", + "examine": "X dose(s) of super Strength potion.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14245", + "name": "Super strength(1)", + "examine": "X dose(s) of super Strength potion.", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14246", + "name": "Super strength(1)", + "examine": "X dose(s) of super Strength potion.", + "tradeable": "true", + "low_alchemy": "88", + "high_alchemy": "132", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14247", + "name": "Ranging potion(5)", + "examine": "4 doses of ranging potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14248", + "name": "Ranging potion(5)", + "examine": "4 doses of ranging potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14249", + "name": "Ranging potion(4)", + "examine": "4 doses of ranging potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14250", + "name": "Ranging potion(4)", + "examine": "4 doses of ranging potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14251", + "name": "Ranging potion(3)", + "examine": "4 doses of ranging potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14252", + "name": "Ranging potion(3)", + "examine": "4 doses of ranging potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14253", + "name": "Ranging potion(2)", + "examine": "4 doses of ranging potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14254", + "name": "Ranging potion(2)", + "examine": "4 doses of ranging potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14255", + "name": "Ranging potion(1)", + "examine": "4 doses of ranging potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14256", + "name": "Ranging potion(1)", + "examine": "4 doses of ranging potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14257", + "name": "Defence potion(5)", + "examine": "(x) doses of Defence Potion.", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14258", + "name": "Defence potion(5)", + "examine": "(x) doses of Defence Potion.", + "tradeable": "true", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14259", + "name": "Defence potion(4)", + "examine": "(x) doses of Defence Potion.", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14260", + "name": "Defence potion(4)", + "examine": "(x) doses of Defence Potion.", + "tradeable": "true", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14261", + "name": "Defence potion(3)", + "examine": "(x) doses of Defence Potion.", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14262", + "name": "Defence potion(3)", + "examine": "(x) doses of Defence Potion.", + "tradeable": "true", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14263", + "name": "Defence potion(2)", + "examine": "(x) doses of Defence Potion.", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14264", + "name": "Defence potion(2)", + "examine": "(x) doses of Defence Potion.", + "tradeable": "true", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14265", + "name": "Defence potion(1)", + "examine": "(x) doses of Defence Potion.", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14266", + "name": "Defence potion(1)", + "examine": "(x) doses of Defence Potion.", + "tradeable": "true", + "low_alchemy": "352", + "high_alchemy": "528", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14267", + "name": "Magic potion(5)", + "examine": "4 doses of Magic potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14268", + "name": "Magic potion(5)", + "examine": "4 doses of Magic potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14269", + "name": "Magic potion(4)", + "examine": "4 doses of Magic potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14270", + "name": "Magic potion(4)", + "examine": "4 doses of Magic potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14271", + "name": "Magic potion(3)", + "examine": "4 doses of Magic potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14272", + "name": "Magic potion(3)", + "examine": "4 doses of Magic potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14273", + "name": "Magic potion(2)", + "examine": "4 doses of Magic potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14274", + "name": "Magic potion(2)", + "examine": "4 doses of Magic potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14275", + "name": "Magic potion(1)", + "examine": "4 doses of Magic potion.", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14276", + "name": "Magic potion(1)", + "examine": "4 doses of Magic potion.", + "tradeable": "true", + "low_alchemy": "224", + "high_alchemy": "336", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14277", + "name": "Summoning potion(5)", + "examine": "(X) doses of Summoning potion.", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14278", + "name": "Summoning potion(5)", + "examine": "(X) doses of Summoning potion.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14279", + "name": "Summoning potion(4)", + "examine": "(X) doses of Summoning potion.", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14280", + "name": "Summoning potion(4)", + "examine": "(X) doses of Summoning potion.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14281", + "name": "Summoning potion(3)", + "examine": "(X) doses of Summoning potion.", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14282", + "name": "Summoning potion(3)", + "examine": "(X) doses of Summoning potion.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14283", + "name": "Summoning potion(2)", + "examine": "(X) doses of Summoning potion.", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14284", + "name": "Summoning potion(2)", + "examine": "(X) doses of Summoning potion.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14285", + "name": "Summoning potion(1)", + "examine": "(X) doses of Summoning potion.", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14286", + "name": "Summoning potion(1)", + "examine": "(X) doses of Summoning potion.", + "tradeable": "true", + "low_alchemy": "76", + "high_alchemy": "114", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "grand_exchange_price": "4", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14287", + "name": "Scimitar (class 1)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "render_anim": "1629", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,55,0,0,0,0,0,0,0,0,0,15,0,0,0", + "weapon_interface": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14288", + "name": "Scimitar (class 1)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14289", + "name": "Scimitar (class 2)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "render_anim": "1629", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,90,0,0,0,0,0,0,0,0,0,30,0,0,0", + "weapon_interface": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14290", + "name": "Scimitar (class 2)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14291", + "name": "Scimitar (class 3)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "render_anim": "1629", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,145,0,0,0,0,0,0,0,0,0,45,0,0,0", + "weapon_interface": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14292", + "name": "Scimitar (class 3)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14293", + "name": "Scimitar (class 4)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "render_anim": "1629", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,180,0,0,0,0,0,0,0,0,0,60,0,0,0", + "weapon_interface": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14294", + "name": "Scimitar (class 4)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14295", + "name": "Scimitar (class 5)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "render_anim": "1629", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,225,0,0,0,0,0,0,0,0,0,75,0,0,0", + "weapon_interface": "6", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14296", + "name": "Scimitar (class 5)", + "examine": "The sacred clay has transformed into a vicious, curved sword.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14297", + "name": "Dagger (class 1)", + "examine": "The sacred clay transformed into a sharp dagger.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "3", + "attack_speed": "3", + "absorb": "0,0,0", + "bonuses": "41,0,0,0,0,0,0,0,0,0,0,15,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14298", + "name": "Dagger (class 1)", + "examine": "The sacred clay transformed into a sharp dagger.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14299", + "name": "Dagger (class 2)", + "examine": "The sacred clay transformed into a sharp dagger.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "3", + "attack_speed": "3", + "absorb": "0,0,0", + "bonuses": "68,0,0,0,0,0,0,0,0,0,0,30,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14300", + "name": "Dagger (class 2)", + "examine": "The sacred clay transformed into a sharp dagger.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14301", + "name": "Dagger (class 3)", + "examine": "The sacred clay transformed into a sharp dagger.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "3", + "attack_speed": "3", + "absorb": "0,0,0", + "bonuses": "101,0,0,0,0,0,0,0,0,0,0,45,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14302", + "name": "Dagger (class 3)", + "examine": "The sacred clay transformed into a sharp dagger.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14303", + "name": "Dagger (class 4)", + "examine": "The sacred clay transformed into a sharp dagger.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "3", + "attack_speed": "3", + "absorb": "0,0,0", + "bonuses": "135,0,0,0,0,0,0,0,0,0,0,60,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14304", + "name": "Dagger (class 4)", + "examine": "The sacred clay transformed into a sharp dagger.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14305", + "name": "Dagger (class 5)", + "examine": "The sacred clay transformed into a sharp dagger.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "3", + "attack_speed": "3", + "absorb": "0,0,0", + "bonuses": "168,0,0,0,0,0,0,0,0,0,0,75,0,0,0", + "weapon_interface": "5", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14306", + "name": "Dagger (class 5)", + "examine": "The sacred clay transformed into a sharp dagger.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14307", + "name": "Warhammer (class 1)", + "examine": "The sacred clay has transformed into a heavy warhammer.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,83,0,0,0,0,0,0,0,0,15,0,0,0", + "weapon_interface": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14308", + "name": "Warhammer (class 1)", + "examine": "The sacred clay has transformed into a heavy warhammer.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14309", + "name": "Warhammer (class 2)", + "examine": "The sacred clay has transformed into a heavy warhammer.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,135,0,0,0,0,0,0,0,0,30,0,0,0", + "weapon_interface": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14310", + "name": "Warhammer (class 2)", + "examine": "The sacred clay has transformed into a heavy warhammer.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14311", + "name": "Warhammer (class 3)", + "examine": "The sacred clay has transformed into a heavy warhammer.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,202,0,0,0,0,0,0,0,0,45,0,0,0", + "weapon_interface": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14312", + "name": "Warhammer (class 3)", + "examine": "The sacred clay has transformed into a heavy warhammer.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14313", + "name": "Warhammer (class 4)", + "examine": "The Sacred Clay has transformed into a heavy warhammer.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,270,0,0,0,0,0,0,0,0,60,0,0,0", + "weapon_interface": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14314", + "name": "Warhammer (class 4)", + "examine": "The Sacred Clay has transformed into a heavy warhammer.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14315", + "name": "Warhammer (class 5)", + "examine": "The sacred clay has transformed into a heavy warhammer.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "3", + "attack_speed": "6", + "absorb": "0,0,0", + "bonuses": "0,0,338,0,0,0,0,0,0,0,0,75,0,0,0", + "weapon_interface": "10", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14316", + "name": "Warhammer (class 5)", + "examine": "The sacred clay has transformed into a heavy warhammer.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14317", + "name": "Robe top (class 1)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,20,0,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14318", + "name": "Robe top (class 1)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14319", + "name": "Robe top (class 2)", + "examine": "The sacred clay has transformed into a light, cloth-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,40,0,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14320", + "name": "Robe top (class 2)", + "examine": "The sacred clay has transformed into a light, cloth-like substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14321", + "name": "Robe top (class 3)", + "examine": "The sacred clay has transformed into a light, cloth-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,60,0,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14322", + "name": "Robe top (class 3)", + "examine": "The sacred clay has transformed into a light, cloth-like substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14323", + "name": "Robe top (class 4)", + "examine": "The sacred clay has transformed into a light, cloth-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,80,0,80,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14324", + "name": "Robe top (class 4)", + "examine": "The sacred clay has transformed into a light, cloth-like substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14325", + "name": "Robe top (class 5)", + "examine": "The sacred clay has transformed into a light, cloth-like substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,100,0,100,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14326", + "name": "Robe top (class 5)", + "examine": "The sacred clay has transformed into a light, cloth-like substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14327", + "name": "Robe bottom (class 1)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,15,0,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14328", + "name": "Robe bottom (class 1)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14329", + "name": "Robe bottom (class 2)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,30,0,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14330", + "name": "Robe bottom (class 2)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14331", + "name": "Robe bottom (class 3)", + "examine": "The sacred clay transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,45,0,45,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14332", + "name": "Robe bottom (class 3)", + "examine": "The sacred clay transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14333", + "name": "Robe bottom (class 4)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,60,0,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14334", + "name": "Robe bottom (class 4)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14335", + "name": "Robe bottom (class 5)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,75,0,75,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14336", + "name": "Robe bottom (class 5)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14337", + "name": "Hat (class 1)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,10,0,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14338", + "name": "Hat (class 1)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14339", + "name": "Hat (class 2)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,20,0,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14340", + "name": "Hat (class 2)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14341", + "name": "Hat (class 3)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,30,0,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14342", + "name": "Hat (class 3)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14343", + "name": "Hat (class 4)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,40,0,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14344", + "name": "Hat (class 4)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14345", + "name": "Hat (class 5)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,50,0,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14346", + "name": "Hat (class 5)", + "examine": "The sacred clay has transformed into a light, cloth-like material.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14347", + "name": "Platebody (class 1)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,20,20,20,-10,10,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14348", + "name": "Platebody (class 1)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14349", + "name": "Platebody (class 2)", + "examine": "The sacred clay transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,40,40,40,-10,20,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14350", + "name": "Platebody (class 2)", + "examine": "The sacred clay transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14351", + "name": "Platebody (class 3)", + "examine": "The sacred clay top has transformed into a spiked, platemail body.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,60,60,60,-10,30,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14352", + "name": "Platebody (class 3)", + "examine": "The sacred clay top has transformed into a spiked, platemail body.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14353", + "name": "Platebody (class 4)", + "examine": "The sacred clay top has transformed into a spiked, platemail body.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,80,80,80,-10,40,80,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14354", + "name": "Platebody (class 4)", + "examine": "The sacred clay top has transformed into a spiked, platemail body.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14355", + "name": "Platebody (class 5)", + "examine": "The sacred clay top has transformed into a spiked, platemail body.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,100,100,100,-10,50,100,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14356", + "name": "Platebody (class 5)", + "examine": "The sacred clay top has transformed into a spiked, platemail body.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14357", + "name": "Platelegs (class 1)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,15,15,15,-10,7,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14358", + "name": "Platelegs (class 1)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14359", + "name": "Platelegs (class 2)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,30,30,30,-10,15,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14360", + "name": "Platelegs (class 2)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14361", + "name": "Platelegs (class 3)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,45,45,45,-10,23,45,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14362", + "name": "Platelegs (class 3)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14363", + "name": "Platelegs (class 4)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,60,60,60,-10,30,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14364", + "name": "Platelegs (class 4)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14365", + "name": "Platelegs (class 5)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,75,75,75,-10,37,75,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14366", + "name": "Platelegs (class 5)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14367", + "name": "Helm (class 1)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,10,10,10,-10,5,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14368", + "name": "Helm (class 1)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14369", + "name": "Helm (class 2)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,20,20,20,-10,10,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14370", + "name": "Helm (class 2)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14371", + "name": "Helm (class 3)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,30,30,30,-10,15,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14372", + "name": "Helm (class 3)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14373", + "name": "Helm (class 4)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,40,40,40,-10,20,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14374", + "name": "Helm (class 4)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14375", + "name": "Helm (class 5)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-30,-10,50,50,50,-10,25,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14376", + "name": "Helm (class 5)", + "examine": "The sacred clay has transformed into a hard, metallic substance.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14377", + "name": "Staff (class 1)", + "examine": "The sacred clay has transformed into a light weight, magical stick.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,55,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14378", + "name": "Staff (class 1)", + "examine": "The sacred clay has transformed into a light weight, magical stick.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14379", + "name": "Staff (class 2)", + "examine": "The sacred clay has transformed into a light weight, magical stick.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,90,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14380", + "name": "Staff (class 2)", + "examine": "The sacred clay has transformed into a light weight, magical stick.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14381", + "name": "Staff (class 3)", + "examine": "The sacred clay has transformed into a lightweight, magical stick.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,135,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14382", + "name": "Staff (class 3)", + "examine": "The sacred clay has transformed into a lightweight, magical stick.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14383", + "name": "Staff (class 4)", + "examine": "The sacred clay has transformed into a lightweight, magical stick.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,180,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14384", + "name": "Staff (class 4)", + "examine": "The sacred clay has transformed into a lightweight, magical stick.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14385", + "name": "Staff (class 5)", + "examine": "The sacred clay has transformed into a lightweight, magical stick.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "render_anim": "28", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "0,0,0,225,0,0,0,0,0,0,0,0,0,0,0", + "weapon_interface": "1", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14386", + "name": "Staff (class 5)", + "examine": "The sacred clay has transformed into a lightweight, magical stick.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14387", + "name": "Cape", + "equipment_slot": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14389", + "name": "Cape", + "equipment_slot": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,1,1,0,2,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14391", + "name": "Leather body (class 1)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,10,10,10,10,20,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14392", + "name": "Leather body (class 1)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14393", + "name": "Leather body (class 2)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,20,20,20,20,40,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14394", + "name": "Leather body (class 2)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14395", + "name": "Leather body (class 3)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,30,30,30,30,60,60,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14396", + "name": "Leather body (class 3)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14397", + "name": "Leather body (class 4)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,40,40,40,40,80,80,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14398", + "name": "Leather body (class 4)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14399", + "name": "Leather body (class 5)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,50,50,50,50,100,100,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14400", + "name": "Leather body (class 5)", + "examine": "The sacred clay has transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14401", + "name": "Chaps (class 1)", + "examine": "The sacred clay transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,7,7,7,0,15,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14402", + "name": "Chaps (class 1)", + "examine": "The sacred clay transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14403", + "name": "Chaps (class 2)", + "examine": "The sacred clay transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,15,15,15,0,30,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14404", + "name": "Chaps (class 2)", + "examine": "The sacred clay transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14405", + "name": "Chaps (class 3)", + "examine": "The sacred clay transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,23,23,23,0,45,45,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14406", + "name": "Chaps (class 3)", + "examine": "The sacred clay transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14407", + "name": "Chaps (class 4)", + "examine": "The sacred clay transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,30,30,30,0,60,60,0,0,1,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14408", + "name": "Chaps (class 4)", + "examine": "The sacred clay transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14409", + "name": "Chaps (class 5)", + "examine": "The sacred clay transformed into a flexible mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,37,37,37,0,75,75,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14410", + "name": "Chaps (class 5)", + "examine": "The sacred clay transformed into a flexible mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14411", + "name": "Coif (class 1)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,5,5,5,0,10,10,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14412", + "name": "Coif (class 1)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14413", + "name": "Coif (class 2)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,10,10,10,0,20,20,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14414", + "name": "Coif (class 2)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14415", + "name": "Coif (class 3)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,15,15,15,0,30,30,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14416", + "name": "Coif (class 3)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14417", + "name": "Coif (class 4)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,20,20,20,0,40,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14418", + "name": "Coif (class 4)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14419", + "name": "Coif (class 5)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "remove_head": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,25,25,25,0,50,50,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14420", + "name": "Coif (class 5)", + "examine": "The sacred clay has transformed into a flexible, protective mesh.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14421", + "name": "Clay deposit scroll", + "shop_price": "30", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14422", + "name": "Sacred clay pouch (class 1)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14423", + "name": "Sacred clay pouch (class 1)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14424", + "name": "Sacred clay pouch (class 2)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14425", + "name": "Sacred clay pouch (class 2)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "60", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14426", + "name": "Sacred clay pouch (class 3)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14427", + "name": "Sacred clay pouch (class 3)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "90", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14428", + "name": "Sacred clay pouch (class 4)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14429", + "name": "Sacred clay pouch (class 4)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14430", + "name": "Sacred clay pouch (class 5)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14431", + "name": "Sacred clay pouch (class 5)", + "examine": "This scroll will make your familiar deposit its items at your base.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "150", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14432", + "name": "Null sacred clay", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14458", + "name": "Vine flower", + "examine": "A vine flower grown through magical means.", + "low_alchemy": "2", + "high_alchemy": "3", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14459", + "name": "Unconscious broav", + "examine": "Its unconscious, poor thing.", + "destroy": "true", + "destroy_message": "You caught this broav west of the Hunting Expert's home. You can catch another one with a trap baited with mort Myre Fungus.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14460", + "name": "Dirty laundry", + "examine": "Some dirty clothes that apparently belong to Movario.", + "low_alchemy": "4", + "high_alchemy": "6", + "destroy": "true", + "destroy_message": "You got these clothes from a washerman who lives near the Khazard battle arena.", + "shop_price": "10", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14461", + "name": "Waste-paper basket", + "examine": "A receptacle for rubbish.", + "destroy": "true", + "destroy_message": "You found this basket in Movario's base.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14462", + "name": "Ruby key", + "examine": "A superbly made key with a fine ruby inserted into it. (While Guthix Sleeps)", + "destroy": "true", + "destroy_message": "You found this key attached to the bottom of the bin in Movario's base.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14463", + "name": "Notes on pressure", + "examine": "A collection of notes made by an absent-minded fellow.", + "destroy": "true", + "destroy_message": "You found these notes in Movario's basement.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14464", + "name": "Movario's notes (volume 1)", + "examine": "A loose-leaf collection of research notes, found on Movario's study desk.", + "destroy": "true", + "destroy_message": "You found these notes loosely piled up on ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14465", + "name": "Movario's notes (volume 2)", + "examine": "A loose-leaf collection of research notes, found in Movario's bed chest.", + "destroy": "true", + "destroy_message": "You found these notes in Movario's bedchest, in his base of operations near the Khazard Battlefield.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14466", + "name": "Weight (1kg)", + "examine": "A 1kg weight.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14467", + "name": "Weight (2kg)", + "examine": "A 2kg weight.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14468", + "name": "Weight (5kg)", + "examine": "A 5kg weight.", + "destroy": "true", + "destroy_message": "Drop", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14469", + "name": "Strange key loop", + "examine": "The loop half of a strange key.", + "destroy": "true", + "destroy_message": "You can find another under the bed on the top level of Movario's base", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14470", + "name": "Strange key teeth", + "examine": "The teeth half of a strange key.", + "destroy": "true", + "destroy_message": "You can find another under the bed on the top level of Movario's base", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14471", + "name": "Dragonkin key", + "examine": "The completed dragonkin key.", + "destroy": "true", + "destroy_message": "You fused together two parts of a Dragonkin key which you obtained from Movario's base.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14472", + "name": "Ruined dragon armour lump", + "examine": "A badly damaged lump of dragon metal.", + "tradeable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "955683", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14473", + "name": "Ruined dragon armour lump", + "examine": "A badly damaged lump of dragon metal.", + "tradeable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "955683", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14474", + "name": "Ruined dragon armour slice", + "examine": "A badly damaged slice of dragon metal.", + "tradeable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "1761141", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14475", + "name": "Ruined dragon armour slice", + "examine": "A badly damaged slice of dragon metal.", + "tradeable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "1761141", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14476", + "name": "Ruined dragon armour shard", + "examine": "A badly damaged shard of dragon metal.", + "tradeable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "1090493", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14477", + "name": "Ruined dragon armour shard", + "examine": "A badly damaged shard of dragon metal.", + "tradeable": "true", + "low_alchemy": "12000", + "high_alchemy": "18000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "30000", + "grand_exchange_price": "1090493", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14478", + "name": "Blast fusion hammer", + "examine": "A very powerful Smithing hammer.", + "destroy": "true", + "destroy_message": "Drop", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14479", + "name": "Dragon platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "704000", + "high_alchemy": "1056000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1760000", + "grand_exchange_price": "4453643", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-30,0,109,107,97,-6,106,50,0,0,0,0", + "requirements": "{1,60}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14480", + "name": "Dragon platebody", + "examine": "Provides excellent protection.", + "tradeable": "true", + "low_alchemy": "704000", + "high_alchemy": "1056000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1760000", + "grand_exchange_price": "4453643", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14481", + "name": "Dragon platebody", + "examine": "Provides excellent protection.", + "lendable": "true", + "low_alchemy": "704000", + "high_alchemy": "1056000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "4453643", + "attack_speed": "4", + "absorb": "4,0,9", + "bonuses": "0,0,0,-30,0,109,107,97,-6,106,50,0,0,0,0", + "requirements": "{1,60}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14484", + "name": "Dragon claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "27000", + "high_alchemy": "40500", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "67500", + "grand_exchange_price": "1472441", + "render_anim": "2583", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "41,57,-4,0,0,13,26,7,0,0,0,56,0,0,0", + "weapon_interface": "9", + "has_special": "true", + "two_handed": "true", + "attack_anims": "393,393,1067,393", + "defence_anim": "397", + "requirements": "{0,60}", + "rare_item": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14485", + "name": "Dragon claws", + "examine": "A set of fighting claws.", + "tradeable": "true", + "low_alchemy": "27000", + "high_alchemy": "40500", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "67500", + "grand_exchange_price": "1472441", + "attack_speed": "4", + "two_handed": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14486", + "name": "Dragon claws", + "examine": "A set of fighting claws.", + "lendable": "true", + "low_alchemy": "27000", + "high_alchemy": "40500", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "1472441", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "41,57,-4,0,0,13,26,7,0,0,0,56,0,0,0", + "weapon_interface": "9", + "has_special": "true", + "two_handed": "true", + "requirements": "{0,60}", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14487", + "name": "Enriched snapdragon", + "examine": "An enriched snapdragon herb.", + "destroy": "true", + "destroy_message": "You grew this herb by planting an enriched snapdragon seed in the special herb patch on top of Falador castle.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14488", + "name": "Super truth serum", + "examine": "Fluid sloshes innocently in this vial.", + "destroy": "true", + "destroy_message": "You made this serum by mixing an enriched snapdragon into one of Betty's truth serums.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14489", + "name": "Suspect sketch", + "examine": "A sketch of the suspect known as Dark Squall.", + "destroy": "true", + "destroy_message": "You gained this item by having papyrus and charcoal in your inventory while interrogating a spy in Falador castle.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14490", + "name": "Elite black platelegs", + "examine": "These look pretty heavy, but very elite.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "65000", + "grand_exchange_price": "41559", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-14,-6,52,50,25,-1,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14491", + "name": "Elite black platelegs", + "examine": "These look pretty heavy, but very elite.", + "tradeable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "65000", + "grand_exchange_price": "41559", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14492", + "name": "Elite black platebody", + "examine": "Provides excellent protection, and is elite.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "64000", + "grand_exchange_price": "38275", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-20,-8,80,85,40,-2,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14493", + "name": "Elite black platebody", + "examine": "Provides excellent protection, and is elite.", + "tradeable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "64000", + "grand_exchange_price": "38275", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14494", + "name": "Elite black full helm", + "examine": "A full face helmet, and elite.", + "tradeable": "true", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "35200", + "grand_exchange_price": "30542", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-4,-2,31,33,15,0,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14495", + "name": "Elite black full helm", + "examine": "A full face helmet, and elite.", + "tradeable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "35200", + "grand_exchange_price": "30542", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14496", + "name": "Cell key", + "examine": "Opens the cells beneath the Black Knights' Fortress. (While Guthix Sleeps)", + "destroy": "true", + "destroy_message": "You got this key from the key rack in Dark Squall's base.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14497", + "name": "Dagon'hai robe top", + "examine": "A robe worn by members of the Dagon'hai.", + "tradeable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "71098", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "3,1,0", + "bonuses": "0,0,0,20,0,0,0,0,20,0,20,0,0,2,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14498", + "name": "Dagon'hai robe top", + "examine": "A robe worn by members of the Dagon'hai.", + "tradeable": "true", + "low_alchemy": "48000", + "high_alchemy": "72000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "120000", + "grand_exchange_price": "71098", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14499", + "name": "Dagon'hai hat", + "examine": "A hat worn by members of the Dagon'hai.", + "tradeable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "15000", + "grand_exchange_price": "9580", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "1,0,0", + "bonuses": "0,0,0,4,0,0,0,0,4,0,4,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14500", + "name": "Dagon'hai hat", + "examine": "A hat worn by members of the Dagon'hai.", + "tradeable": "true", + "low_alchemy": "6000", + "high_alchemy": "9000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "15000", + "grand_exchange_price": "9580", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14501", + "name": "Dagon'hai robe bottom", + "examine": "A robe worn by members of the Dagon'hai.", + "tradeable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "80000", + "grand_exchange_price": "45691", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "2,1,0", + "bonuses": "0,0,0,15,0,0,0,0,15,0,15,0,0,2,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14502", + "name": "Dagon'hai robe bottom", + "examine": "A robe worn by members of the Dagon'hai.", + "tradeable": "true", + "low_alchemy": "32000", + "high_alchemy": "48000", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "80000", + "grand_exchange_price": "45691", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14503", + "name": "Silif", + "examine": "Elite Black Knight armour adds to his stealthiness.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14504", + "name": "Silif", + "examine": "Elite Black Knight armour adds to his stealthiness.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14505", + "name": "Teleorb", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14506", + "name": "Enriched snapdragon seed", + "examine": "An enriched snapdragon seed. The herb that grows from this seed will be extra potent!", + "destroy": "true", + "destroy_message": "You created this by focusing the light onto a snapdragon seed from a rose tinted lens while in Betty's shop.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14507", + "name": "Dolmen", + "examine": "Part of a stone circle.", + "destroy": "true", + "destroy_message": "You got this by solving a puzzle in the a Guthixian temple near the Chasm of Tears.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14508", + "name": "Dolmen", + "examine": "Part of a stone circle.", + "destroy": "true", + "destroy_message": "You got this by solving a puzzle in the a Guthixian temple near the Chasm of Tears.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14509", + "name": "Dolmen", + "examine": "Part of a stone circle.", + "destroy": "true", + "destroy_message": "You got this by solving a puzzle in the a Guthixian temple near the Chasm of Tears.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14510", + "name": "Dolmen", + "examine": "Part of a stone circle.", + "destroy": "true", + "destroy_message": "You got this by solving a puzzle in the a Guthixian temple near the Chasm of Tears.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14511", + "name": "Dolmen", + "examine": "Part of a stone circle.", + "destroy": "true", + "destroy_message": "You got this by solving a puzzle in the a Guthixian temple near the Chasm of Tears.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14512", + "name": "Dolmen", + "examine": "Part of a stone circle.", + "destroy": "true", + "destroy_message": "You got this by solving a puzzle in the a Guthixian temple near the Chasm of Tears.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14513", + "name": "Dolmen", + "examine": "Part of a stone circle.", + "destroy": "true", + "destroy_message": "You got this by solving a puzzle in the a Guthixian temple near the Chasm of Tears.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14514", + "name": "Dolmen", + "examine": "Part of a stone circle.", + "destroy": "true", + "destroy_message": "You got this by solving a puzzle in the a Guthixian temple near the Chasm of Tears.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14515", + "name": "Air key", + "examine": "An elemental key of air.", + "destroy": "true", + "destroy_message": "You found this in the Chasm of Tears by using an air-orb on an etched wall section.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14516", + "name": "Earth key", + "examine": "An elemental key of earth.", + "destroy": "true", + "destroy_message": "You found this in the Chasm of Tears by using an earth-orb on an etched wall section.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14517", + "name": "Fire key", + "examine": "An elemental key of fire.", + "destroy": "true", + "destroy_message": "You found this in the Chasm of Tears by using an", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14518", + "name": "Water key", + "examine": "An elemental key of water.", + "destroy": "true", + "destroy_message": "You found this in the Chasm of Tears by using an", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14519", + "name": "Air key", + "examine": "An elemental key of air.", + "destroy": "true", + "destroy_message": "You found this in the Chasm of Tears by using an air-orb on an etched wall section.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14520", + "name": "Earth key", + "examine": "An elemental key of earth.", + "destroy": "true", + "destroy_message": "You found this in the Chasm of Tears by using an earth-orb on an etched wall section.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14521", + "name": "Fire key", + "examine": "An elemental key of fire.", + "destroy": "true", + "destroy_message": "You found this in the Chasm of Tears by using an", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14522", + "name": "Water key", + "examine": "An elemental key of water.", + "destroy": "true", + "destroy_message": "You found this in the Chasm of Tears by using an", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14525", + "name": "Dagon'hai robes set", + "examine": "Grand Exchange set containing a hat, top and bottoms.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "193541", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14526", + "name": "Dagon'hai robes set", + "examine": "Grand Exchange set containing a hat, top and bottoms.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "193541", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14527", + "name": "Elite black armour set", + "examine": "Grand Exchange set containing an elite black full helm, platebody and legs.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "140536", + "attack_speed": "4", + "absorb": "6,0,13", + "bonuses": "0,0,0,-38,-16,163,168,80,-3,159,62,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14528", + "name": "Elite black armour set", + "examine": "Grand Exchange set containing an elite black full helm, platebody and legs.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "140536", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14529", + "name": "Dragon plate armour set (l)", + "examine": "Grand Exchange set containing a dragon full helm, platebody, legs.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "10629814", + "attack_speed": "4", + "absorb": "9,0,19", + "bonuses": "0,0,0,-57,-9,222,221,201,-11,217,82,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14530", + "name": "Dragon plate armour set (l)", + "examine": "Grand Exchange set containing a dragon full helm, platebody, legs.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "10629814", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14531", + "name": "Dragon plate armour set (sk)", + "examine": "Grand Exchange set containing a dragon full helm, platebody, skirt.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "12243786", + "attack_speed": "4", + "absorb": "9,0,19", + "bonuses": "0,0,0,-57,-9,222,221,201,-11,217,82,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14532", + "name": "Dragon plate armour set (sk)", + "examine": "Grand Exchange set containing a dragon full helm, platebody, skirt.", + "tradeable": "true", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "20", + "grand_exchange_price": "12243786", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14533", + "name": "Broav", + "examine": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14534", + "name": "Strange teleorb", + "examine": "This orb can used to teleport people...somehow.", + "destroy": "true", + "destroy_message": "You gained this orb from Dark Squall's base. You can probably get another one from visiting the same place.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14536", + "name": "Turkey book", + "examine": "Notes on the locations of turkeys.", + "destroy": "true", + "destroy_message": "You will not be able to get the book back if you destroy it.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14537", + "name": "Cornucopia", + "examine": "", + "destroy": "true", + "destroy_message": "You will lose all food stored in the Cornucopia. You can get another empty one from Diango in Draynor Village.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14538", + "name": "Cornucopia", + "examine": "", + "destroy": "true", + "destroy_message": "You will lose all food stored in the Cornucopia. You can get another empty one from Diango in Draynor Village.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14539", + "name": "Raw turkey", + "examine": "", + "low_alchemy": "3", + "high_alchemy": "5", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14540", + "name": "Cooked turkey", + "examine": "Mmm, this looks tasty.", + "low_alchemy": "1", + "high_alchemy": "2", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14541", + "name": "Burnt turkey", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14542", + "name": "Raw turkey drumstick", + "examine": "I need to cook this first.", + "low_alchemy": "3", + "high_alchemy": "5", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14543", + "name": "Cooked turkey drumstick", + "examine": "Mmm, this looks tasty.", + "low_alchemy": "1", + "high_alchemy": "2", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14544", + "name": "Burnt turkey drumstick", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14570", + "name": "Cornucopia", + "examine": "", + "destroy": "true", + "destroy_message": "You will lose all food stored in the Cornucopia. You can get another empty one from Diango in Draynor Village.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14571", + "name": "Fremennik sea boots 1", + "examine": "Not-so-sturdy boots for northern winters.", + "destroy": "true", + "destroy_message": "", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-3,-1,2,3,4,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14572", + "name": "Fremennik sea boots 2", + "examine": "Sturdy boots for northern winters.", + "destroy": "true", + "destroy_message": "You can claim replacement Fremennik sea boots from Yrsa in Rellekka.", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-3,-1,8,9,10,0,0,8,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14573", + "name": "Fremennik sea boots 3", + "examine": "Very sturdy boots for northern winters.", + "destroy": "true", + "destroy_message": "", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-3,-1,10,11,12,0,0,9,1,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14574", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14575", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14576", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14577", + "name": "Falador shield 1", + "examine": "A buckler shield from Falador.", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "You will be able to get a replacement shield from Redbeard the Pirate in Port Sarim.", + "shop_price": "100", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-8,-2,17,19,18,-1,18,10,0,3,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14578", + "name": "Falador shield 2", + "examine": "A kiteshield from Falador.", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "destroy_message": "You will be able to get a replacement shield from the chemist in Rimmington.", + "shop_price": "200", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-8,-2,18,22,20,-1,20,20,0,5,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14579", + "name": "Falador shield 3", + "examine": "A tower shield from Falador.", + "low_alchemy": "120", + "high_alchemy": "180", + "destroy": "true", + "destroy_message": "You will be able to get a replacement shield from Sir Vyvin's squire in the White Knights' Castle.", + "shop_price": "300", + "equipment_slot": "5", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,-8,-2,27,31,29,-1,29,30,0,7,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14580", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "shop_price": "1000", + "tradeable": "false", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14581", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "shop_price": "5000", + "tradeable": "false", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14582", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "shop_price": "10000", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14583", + "name": "White lily", + "examine": "A white lily seed - plant in a flower patch.", + "destroy": "true", + "destroy_message": "Harvest (turns to ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14584", + "name": "Money crest voucher", + "examine": "I can take this to the Herald to get my money crest back for free.", + "destroy": "true", + "destroy_message": "You will not be able to replace this voucher - it is a one-time offer only!", + "shop_price": "500000", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14589", + "name": "White lily seed", + "examine": "A white lily seed - plant in a flower patch.", + "low_alchemy": "500", + "high_alchemy": "750", + "shop_price": "1250", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14590", + "name": "Enchanted lyre(5)", + "examine": "This will teleport me to Rellekka when I play it. ", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1000", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14591", + "name": "Enchanted lyre(6)", + "examine": "This will teleport me to Rellekka when I play it. ", + "low_alchemy": "400", + "high_alchemy": "600", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "1000", + "equipment_slot": "3", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14592", + "name": "Elite black platelegs", + "examine": "These look pretty heavy, but very elite.", + "lendable": "true", + "low_alchemy": "26000", + "high_alchemy": "39000", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "41559", + "attack_speed": "4", + "absorb": "2,0,4", + "bonuses": "0,0,0,-14,-6,52,50,25,-1,49,15,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14593", + "name": "Elite black platebody", + "examine": "Provides excellent protection, and is elite.", + "lendable": "true", + "low_alchemy": "25600", + "high_alchemy": "38400", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "38275", + "attack_speed": "4", + "absorb": "3,0,6", + "bonuses": "0,0,0,-20,-8,80,85,40,-2,80,40,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14594", + "name": "Elite black full helm", + "examine": "A full face helmet, and elite.", + "lendable": "true", + "low_alchemy": "14080", + "high_alchemy": "21120", + "destroy": "true", + "destroy_message": "Drop", + "grand_exchange_price": "30542", + "attack_speed": "4", + "absorb": "1,0,3", + "bonuses": "0,0,0,-4,-2,31,33,15,0,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14595", + "name": "Santa costume top", + "examine": "A red and jolly top.", + "destroy": "true", + "destroy_message": "You can get another from Diango in Draynor Village.", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14596", + "name": "Ice amulet", + "examine": "A spikey amulet made of ice crystals. It has been enchanted so it will not melt.", + "destroy": "true", + "destroy_message": "", + "equipment_slot": "2", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14597", + "name": "Stones", + "examine": "", + "destroy": "true", + "destroy_message": "You can probably get more in the last room of the yeti cave, in the Land of Snow.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14598", + "name": "Enchanted stones", + "examine": "According to the snow imps, this is enchanted, frozen yeti dung.", + "destroy": "true", + "destroy_message": "You will have to fetch more in the last room of the yeti cave, then get them enchanted by snow imps.", + "shop_price": "1", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14599", + "name": "Ice amulet", + "examine": "A spikey amulet made of ice crystals. It has been enchanted so it will not melt.", + "destroy": "true", + "destroy_message": "", + "equipment_slot": "2", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14600", + "name": "Santa costume top", + "examine": "A red and jolly top.", + "destroy": "true", + "destroy_message": "You can get another from Diango in Draynor Village.", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14601", + "name": "Santa costume top", + "examine": "A red and jolly top.", + "destroy": "true", + "destroy_message": "You can get another from Diango in Draynor Village.", + "remove_sleeves": "true", + "equipment_slot": "4", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14602", + "name": "Santa costume gloves", + "examine": "Some black and jolly gloves.", + "destroy": "true", + "destroy_message": "You can get another pair from Diango in Draynor Village.", + "equipment_slot": "9", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14603", + "name": "Santa costume legs", + "examine": "Some red and jolly legs.", + "destroy": "true", + "destroy_message": "You can get another from Diango in Draynor Village.", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14604", + "name": "Santa costume legs", + "examine": "Some red and jolly legs.", + "destroy": "true", + "destroy_message": "You can get another from Diango in Draynor Village.", + "equipment_slot": "7", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14605", + "name": "Santa costume boots", + "examine": "Some black and jolly boots.", + "destroy": "true", + "destroy_message": "You can get another pair from Diango in Draynor Village.", + "equipment_slot": "10", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14606", + "name": "Cinnamon twigs", + "examine": "Aromatic twigs from a cinnamon tree.", + "destroy": "true", + "destroy_message": "You harvested these from a tree in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14607", + "name": "Sassafras twigs", + "examine": "Aromatic twigs from a sassafras tree.", + "destroy": "true", + "destroy_message": "You harvested these from a tree in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14608", + "name": "Ailanthus twigs", + "examine": "Aromatic twigs from a ailanthus tree.", + "destroy": "true", + "destroy_message": "You harvested these from a tree in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14609", + "name": "Cedar twigs", + "examine": "Aromatic twigs from a cedar tree.", + "destroy": "true", + "destroy_message": "You harvested these from a tree in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14610", + "name": "Mastic twigs", + "examine": "Aromatic twigs from a mastic tree.", + "destroy": "true", + "destroy_message": "You harvested these from a tree in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14611", + "name": "Cinnamon weaving ribbon", + "examine": "Cinnamon twigs, fletched into ribbons of wood and ready to be woven.", + "destroy": "true", + "destroy_message": "You fletched this from twigs found in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14612", + "name": "Sassafras weaving ribbon", + "examine": "Sassafras twigs, fletched into ribbons of wood and ready to be woven.", + "destroy": "true", + "destroy_message": "You fletched this from twigs found in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14613", + "name": "Ailanthus weaving ribbon", + "examine": "Ailanthus twigs, fletched into ribbons of wood and ready to be woven.", + "destroy": "true", + "destroy_message": "You fletched this from twigs found in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14614", + "name": "Cedar weaving ribbon", + "examine": "Cedar twigs, fletched into ribbons of wood and ready to be woven.", + "destroy": "true", + "destroy_message": "You fletched this from twigs found in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14615", + "name": "Mastic weaving ribbon", + "examine": "Mastic twigs, fletched into ribbons of wood and ready to be woven.", + "destroy": "true", + "destroy_message": "You fletched this from twigs found in the phoenix's lair. You need one to complete the dungeon.", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14616", + "name": "Phoenix quill", + "examine": "A feather from a phoenix. Used in Summoning (72).", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "grand_exchange_price": "3431", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14617", + "name": "Phoenix quill", + "examine": "A feather from a phoenix. Used in Summoning (72).", + "tradeable": "true", + "low_alchemy": "40", + "high_alchemy": "60", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "100", + "grand_exchange_price": "3431", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14620", + "name": "Pouch", + "tradeable": "true", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14621", + "name": "Pouch", + "tradeable": "true", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14622", + "name": "Rise from the ashes scroll", + "shop_price": "498", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14623", + "name": "Phoenix pouch", + "tradeable": "true", + "shop_price": "4986", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14624", + "name": "Phoenix pouch", + "tradeable": "true", + "shop_price": "4986", + "attack_speed": "4", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14625", + "name": "Pouch", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14626", + "name": "Phoenix eggling", + "examine": "A baby phoenix and it's bad to the bone!", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14627", + "name": "Phoenix eggling", + "examine": "A baby phoenix and it's bad to the bone!", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14629", + "name": "Phoenix egg", + "examine": "I found this egg in the Phoenix's Lair, and clapped at it!", + "destroy": "true", + "destroy_message": "Unknown ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14630", + "name": "Cracked phoenix egg", + "examine": "I found this egg in the Phoenix's Lair, and kicked it!", + "destroy": "true", + "destroy_message": "Unknown ", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14631", + "name": "Seer's headband", + "examine": "A headband with an eye embroidered on it.", + "destroy": "true", + "destroy_message": "A player can get a new one by talking to any seer around Seer's village.", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,3,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14632", + "name": "Enhanced excalibur", + "examine": "This used to belong to King Arthur and has since been improved.", + "low_alchemy": "80", + "high_alchemy": "120", + "destroy": "true", + "destroy_message": "You can retrieve the Enhanced Excalibur from the Lady of the Lake for 500 coins.", + "shop_price": "200", + "stand_anim": "808", + "stand_turn_anim": "823", + "walk_anim": "819", + "run_anim": "824", + "turn180_anim": "820", + "turn90cw_anim": "821", + "turn90ccw_anim": "822", + "render_anim": "1", + "equipment_slot": "3", + "attack_speed": "5", + "absorb": "0,0,0", + "bonuses": "38,47,-2,0,0,0,3,2,1,0,0,45,0,0,0", + "weapon_interface": "6", + "attack_anims": "390,390,381,390", + "defence_anim": "397", + "attack_audios": "2500,2500,2517,2500", + "requirements": "{0,30}", + "has_special": "true", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14633", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14634", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14635", + "name": "Antique lamp", + "examine": "I wonder what happens if I rub it.", + "tradeable": "false", + "destroy": "true", + "destroy_message": "", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14636", + "name": "Slayer helmet (e)", + "examine": "You don't want to wear it inside-out.", + "low_alchemy": "260", + "high_alchemy": "390", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "650", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,30,32,27,0,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14637", + "name": "Slayer helmet (charged)", + "examine": "You don't want to wear it inside-out.", + "low_alchemy": "260", + "high_alchemy": "390", + "destroy": "true", + "destroy_message": "Drop", + "shop_price": "650", + "remove_head": "true", + "remove_beard": "true", + "equipment_slot": "0", + "attack_speed": "4", + "absorb": "0,0,0", + "bonuses": "0,0,0,0,0,30,32,27,0,30,7,0,0,0,0", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14638", + "name": "Ring of wealth", + "examine": "It can be charged at the Fountain of Rune.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "26000", + "equipment_slot": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14639", + "name": "Ring of wealth", + "examine": "It can be charged at the Fountain of Rune.", + "tradeable": "true", + "grand_exchange_price": "29800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14640", + "name": "Ring of wealth(1)", + "examine": "An enchanted ring with one teleport charge.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "27000", + "equipment_slot": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14641", + "name": "Ring of wealth(1)", + "examine": "An enchanted ring with one teleport charge.", + "tradeable": "true", + "grand_exchange_price": "29800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14642", + "name": "Ring of wealth(2)", + "examine": "An enchanted ring with two teleport charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "28000", + "equipment_slot": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14643", + "name": "Ring of wealth(2)", + "examine": "An enchanted ring with two teleport charges.", + "tradeable": "true", + "grand_exchange_price": "29800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14644", + "name": "Ring of wealth(3)", + "examine": "An enchanted ring with three teleport charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "30000", + "equipment_slot": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14645", + "name": "Ring of wealth(3)", + "examine": "An enchanted ring with three teleport charges.", + "tradeable": "true", + "grand_exchange_price": "29800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14646", + "name": "Ring of wealth(4)", + "examine": "An enchanted ring with four teleport charges.", + "tradeable": "true", + "low_alchemy": "7050", + "high_alchemy": "10575", + "grand_exchange_price": "35000", + "equipment_slot": "12", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + }, + { + "id": "14647", + "name": "Ring of wealth(4)", + "examine": "An enchanted ring with four teleport charges.", + "tradeable": "true", + "grand_exchange_price": "29800", + "ge_buy_limit": "100", + "archery_ticket_price": "0", + "durability": null + } +] diff --git a/Server/data/configs/music_configs.json b/Server/data/configs/music_configs.json new file mode 100644 index 000000000..a58cce5e7 --- /dev/null +++ b/Server/data/configs/music_configs.json @@ -0,0 +1,2252 @@ +[ + { + "id": "1", + "name": "Iban", + "indexId": "61", + "borders": "{2112,4544,2175,4607}" + }, + { + "id": "2", + "name": "Autumn Voyage", + "indexId": "17", + "borders": "{3200,3264,3263,3327}" + }, + { + "id": "3", + "name": "Unknown Land", + "indexId": "133", + "borders": "{3072,3200,3135,3263}" + }, + { + "id": "4", + "name": "Hell's Bells", + "indexId": "254", + "borders": "{2752,3712,2815,3775}" + }, + { + "id": "5", + "name": "Sad Meadow", + "indexId": "101", + "borders": "{2496,3264,2559,3327}-{2752,4672,2815,4735}" + }, + { + "id": "6", + "name": "Jolly-R", + "indexId": "65", + "borders": "{2752,3200,2815,3263}" + }, + { + "id": "7", + "name": "Overture", + "indexId": "92", + "borders": "{2688,3456,2751,3519}" + }, + { + "id": "8", + "name": "Wildwood", + "indexId": "256", + "borders": "{3072,3584,3135,3647}" + }, + { + "id": "9", + "name": "Kingdom", + "indexId": "190", + "borders": "{2816,3520,2879,3583}" + }, + { + "id": "10", + "name": "Moody", + "indexId": "87", + "borders": "{3136,3584,3199,3647}-{2368,3264,2431,3327}" + }, + { + "id": "11", + "name": "Spooky2", + "indexId": "218", + "borders": "{3392,9600,3455,9663}" + }, + { + "id": "12", + "name": "Long Way Home", + "indexId": "76", + "borders": "{2944,3200,3007,3263}" + }, + { + "id": "13", + "name": "Mage Arena", + "indexId": "78", + "borders": "{3072,3904,3135,3967}-{2496,4672,2559,4735}" + }, + { + "id": "14", + "name": "Witching", + "indexId": "145", + "borders": "{3264,3648,3327,3711}" + }, + { + "id": "15", + "name": "Workshop", + "indexId": "148", + "borders": "{3008,3328,3071,3391}" + }, + { + "id": "17", + "name": "Escape", + "indexId": "176", + "borders": "{2688,9664,2751,9727}" + }, + { + "id": "18", + "name": "Horizon", + "indexId": "60", + "borders": "{2880,3392,2943,3455}" + }, + { + "id": "19", + "name": "Arabique", + "indexId": "7", + "borders": "{2816,9792,2879,9855}" + }, + { + "id": "20", + "name": "Lullaby", + "indexId": "77", + "borders": "{3328,3392,3391,3455}-{2624,3520,2687,3583}" + }, + { + "id": "21", + "name": "Monarch Waltz", + "indexId": "86", + "borders": "{2688,3520,2751,3583}" + }, + { + "id": "22", + "name": "Gnome King", + "indexId": "51", + "borders": "{2432,3456,2495,3519}" + }, + { + "id": "24", + "name": "Attack1", + "indexId": "10", + "borders": "{2496,3200,2559,3263}" + }, + { + "id": "25", + "name": "Attack2", + "indexId": "11", + "borders": "{2816,9600,2879,9663}" + }, + { + "id": "26", + "name": "Attack3", + "indexId": "12", + "borders": "{3008,10240,3071,10303}" + }, + { + "id": "27", + "name": "Attack4", + "indexId": "13", + "borders": "{2560,3136,2623,3199}-{2560,9536,2623,9599}" + }, + { + "id": "28", + "name": "Attack5", + "indexId": "14", + "borders": "{2240,4672,2303,4735}" + }, + { + "id": "29", + "name": "Attack6", + "indexId": "15", + "borders": "{2560,9408,2623,9471}" + }, + { + "id": "30", + "name": "Voodoo Cult", + "indexId": "138", + "borders": "{2368,4672,2431,4735}-{2880,9280,2943,9343}" + }, + { + "id": "32", + "name": "Voyage", + "indexId": "139", + "borders": "{2496,3456,2559,3519}" + }, + { + "id": "33", + "name": "Gnome Village", + "indexId": "53", + "borders": "{2432,3392,2495,3455}" + }, + { + "id": "34", + "name": "Wonder", + "indexId": "146", + "borders": "{2944,3520,3007,3583}" + }, + { + "id": "35", + "name": "Sea Shanty2", + "indexId": "107", + "borders": "{3008,3200,3071,3263}" + }, + { + "id": "36", + "name": "Arabian", + "indexId": "4", + "borders": "{3264,3200,3327,3263}-{3392,3136,3455,3199}" + }, + { + "id": "37", + "name": "Deep Wildy", + "indexId": "32", + "borders": "{2944,3776,3007,3839}" + }, + { + "id": "38", + "name": "Trawler", + "indexId": "124", + "borders": "{1856,4800,1919,4863}" + }, + { + "id": "41", + "name": "Expecting", + "indexId": "41", + "borders": "{2432,3200,2495,3263}-{2432,9600,2495,9663}" + }, + { + "id": "42", + "name": "Wilderness2", + "indexId": "143", + "borders": "{3008,3776,3071,3839}" + }, + { + "id": "43", + "name": "Wilderness3", + "indexId": "144", + "borders": "{2944,3712,3007,3775}" + }, + { + "id": "45", + "name": "Venture2", + "indexId": "168", + "borders": "{3328,9728,3391,9791}" + }, + { + "id": "46", + "name": "Harmony2", + "indexId": "167", + "borders": "{3200,9600,3263,9663}" + }, + { + "id": "47", + "name": "Duel Arena", + "indexId": "164", + "borders": "{3328,3200,3391,3263}" + }, + { + "id": "48", + "name": "Morytania", + "indexId": "180", + "borders": "{3392,3456,3455,3519}" + }, + { + "id": "49", + "name": "Wander", + "indexId": "140", + "borders": "{3008,3264,3071,3327}" + }, + { + "id": "50", + "name": "Al Kharid", + "indexId": "1", + "borders": "{3264,3136,3327,3199}-{3328,3136,3391,3199}" + }, + { + "id": "51", + "name": "Trawler Minor", + "indexId": "125", + "borders": "{1920,4800,1983,4863}" + }, + { + "id": "52", + "name": "Serene", + "indexId": "109", + "borders": "{2944,3904,3007,3967}-{2944,10240,3007,10303}-{2816,4800,2879,4863}" + }, + { + "id": "53", + "name": "Royale", + "indexId": "99", + "borders": "{2880,9664,2943,9727}" + }, + { + "id": "54", + "name": "Scape Soft", + "indexId": "159", + "borders": "{2944,3392,3007,3455}" + }, + { + "id": "55", + "name": "High Seas", + "indexId": "59", + "borders": "{2752,3136,2815,3199}" + }, + { + "id": "56", + "name": "Doorways", + "indexId": "34", + "borders": "{3136,3520,3199,3583}" + }, + { + "id": "57", + "name": "Rune Essence", + "indexId": "100", + "borders": "{2880,4800,2943,4863}" + }, + { + "id": "58", + "name": "Nomad", + "indexId": "171", + "borders": "{2752,3072,2815,3135}" + }, + { + "id": "59", + "name": "Cursed", + "indexId": "186", + "borders": "{2368,9664,2431,9727}" + }, + { + "id": "60", + "name": "Lasting", + "indexId": "71", + "borders": "{2624,3392,2687,3455}" + }, + { + "id": "61", + "name": "Village", + "indexId": "182", + "borders": "{3456,3456,3519,3519}" + }, + { + "id": "62", + "name": "Newbie Melody", + "indexId": "89", + "borders": "{3052,3055,3155,3135}" + }, + { + "id": "63", + "name": "Chain of Command", + "indexId": "27", + "borders": "{2624,9728,2687,9791}-{2688,9792,2751,9855}" + }, + { + "id": "64", + "name": "Book of Spells", + "indexId": "23", + "borders": "{3136,3136,3199,3199}" + }, + { + "id": "65", + "name": "Miracle Dance", + "indexId": "85", + "borders": "{2752,4800,2815,4863}" + }, + { + "id": "66", + "name": "Legion", + "indexId": "72", + "borders": "{3008,3648,3071,3711}-{2496,3520,2559,3583}" + }, + { + "id": "67", + "name": "Close Quarters", + "indexId": "175", + "borders": "{3136,3712,3199,3775}-{1536,5760,1599,5823}" + }, + { + "id": "68", + "name": "Cavern", + "indexId": "26", + "borders": "{3008,10304,3071,10367}-{2560,9472,2623,9535}" + }, + { + "id": "69", + "name": "Egypt", + "indexId": "37", + "borders": "{3264,3072,3327,3135}" + }, + { + "id": "70", + "name": "Upcoming", + "indexId": "135", + "borders": "{2624,3200,2687,3263}" + }, + { + "id": "71", + "name": "Chompy Hunt", + "indexId": "178", + "borders": "{2624,2944,2687,3007}-{2624,9344,2687,9407}" + }, + { + "id": "72", + "name": "Fanfare", + "indexId": "44", + "borders": "{2944,3328,3007,3391}" + }, + { + "id": "73", + "name": "All's Fairy in Love and War", + "indexId": "436", + "borders": "" + }, + { + "id": "74", + "name": "Lightwalk", + "indexId": "74", + "borders": "{2752,3392,2815,3455}" + }, + { + "id": "75", + "name": "Venture", + "indexId": "136", + "borders": "{3328,3328,3391,3391}" + }, + { + "id": "76", + "name": "Harmony", + "indexId": "58", + "borders": "{3200,3200,3263,3263}" + }, + { + "id": "77", + "name": "Splendour", + "indexId": "113", + "borders": "{2880,3456,2943,3519}" + }, + { + "id": "78", + "name": "Reggae", + "indexId": "96", + "borders": "{2880,2880,2943,2943}" + }, + { + "id": "79", + "name": "The Desert", + "indexId": "120", + "borders": "{3136,3008,3199,3071}" + }, + { + "id": "80", + "name": "Soundscape", + "indexId": "111", + "borders": "{2432,2944,2495,3007}" + }, + { + "id": "81", + "name": "Wonderous", + "indexId": "147", + "borders": "{2624,3328,2687,3391}" + }, + { + "id": "82", + "name": "Waterfall", + "indexId": "141", + "borders": "{2496,3392,2559,3455}-{2496,9792,2559,9855}" + }, + { + "id": "83", + "name": "Big Chords", + "indexId": "22", + "borders": "{2496,3072,2559,3135}" + }, + { + "id": "84", + "name": "Dead Quiet", + "indexId": "181", + "borders": "{3392,3392,3455,3455}-{2304,4992,2367,5055}" + }, + { + "id": "85", + "name": "Vision", + "indexId": "137", + "borders": "{3072,3136,3135,3199}-{3072,9472,3135,9535}" + }, + { + "id": "87", + "name": "Ice Melody", + "indexId": "165", + "borders": "{2816,3456,2879,3519}" + }, + { + "id": "88", + "name": "Twilight", + "indexId": "179", + "borders": "{2688,9856,2751,9919}" + }, + { + "id": "89", + "name": "Reggae2", + "indexId": "97", + "borders": "{2880,3008,2943,3071}" + }, + { + "id": "90", + "name": "Ambient Jungle", + "indexId": "3", + "borders": "{2816,2944,2879,3007}" + }, + { + "id": "91", + "name": "Riverside", + "indexId": "98", + "borders": "{2688,3264,2751,3327}-{2112,3072,2175,3135}" + }, + { + "id": "92", + "name": "Sea Shanty", + "indexId": "106", + "borders": "{2880,3136,2943,3199}" + }, + { + "id": "93", + "name": "Parade", + "indexId": "93", + "borders": "{3264,3456,3327,3519}" + }, + { + "id": "94", + "name": "Tribal2", + "indexId": "129", + "borders": "{2880,2944,2943,3007}" + }, + { + "id": "95", + "name": "Intrepid", + "indexId": "64", + "borders": "{2304,9792,2367,9855}" + }, + { + "id": "96", + "name": "Inspiration", + "indexId": "63", + "borders": "{3008,3520,3071,3583}" + }, + { + "id": "97", + "name": "Hermit", + "indexId": "191", + "borders": "{2240,4736,2303,4799}" + }, + { + "id": "98", + "name": "Forever", + "indexId": "48", + "borders": "{3072,3456,3135,3519}-{3072,9856,3135,9919}" + }, + { + "id": "99", + "name": "Baroque", + "indexId": "20", + "borders": "{2624,3264,2687,3327}" + }, + { + "id": "100", + "name": "Beyond", + "indexId": "21", + "borders": "{2816,9856,2879,9919}-{2816,9920,2879,9983}" + }, + { + "id": "101", + "name": "Gnome Village2", + "indexId": "54", + "borders": "{2304,3392,2367,3455}" + }, + { + "id": "102", + "name": "Alone", + "indexId": "2", + "borders": "{3008,3456,3071,3519}-{2496,9600,2559,9663}" + }, + { + "id": "103", + "name": "Oriental", + "indexId": "91", + "borders": "{2880,9344,2943,9407}" + }, + { + "id": "104", + "name": "Camelot", + "indexId": "24", + "borders": "{2752,3456,2815,3519}" + }, + { + "id": "105", + "name": "Tomorrow", + "indexId": "163", + "borders": "{3008,3136,3071,3199}" + }, + { + "id": "106", + "name": "Expanse", + "indexId": "40", + "borders": "{3136,3904,3199,3967}-{3200,3328,3263,3391}-{3200,9728,3263,9791}" + }, + { + "id": "107", + "name": "Miles Away", + "indexId": "84", + "borders": "{2880,3264,2943,3327}-{2624,4672,2687,4735}" + }, + { + "id": "108", + "name": "Starlight", + "indexId": "116", + "borders": "{2944,9536,3007,9599}-{3200,9536,3263,9599}" + }, + { + "id": "109", + "name": "Theme", + "indexId": "123", + "borders": "{2560,3456,2623,3519}-{2496,9856,2559,9919}" + }, + { + "id": "110", + "name": "Serenade", + "indexId": "108", + "borders": "{2368,3136,2431,3199}" + }, + { + "id": "111", + "name": "Still Night", + "indexId": "118", + "borders": "{3264,3328,3327,3391}" + }, + { + "id": "112", + "name": "Gnomeball", + "indexId": "56", + "borders": "{2304,3456,2367,3519}" + }, + { + "id": "113", + "name": "Lightness", + "indexId": "73", + "borders": "{3072,3520,3135,3583}" + }, + { + "id": "114", + "name": "Jungly1", + "indexId": "67", + "borders": "{2752,2944,2815,3007}-{2752,9344,2815,9407}" + }, + { + "id": "115", + "name": "Jungly2", + "indexId": "68", + "borders": "{2688,3200,2751,3263}" + }, + { + "id": "116", + "name": "Greatness", + "indexId": "57", + "borders": "{3136,3328,3199,3391}" + }, + { + "id": "117", + "name": "Jungly3", + "indexId": "69", + "borders": "{2752,3008,2815,3071}" + }, + { + "id": "118", + "name": "Faerie", + "indexId": "43", + "borders": "{2368,4352,2431,4415}" + }, + { + "id": "119", + "name": "Fishing", + "indexId": "46", + "borders": "{2816,3392,2879,3455}" + }, + { + "id": "120", + "name": "Shining", + "indexId": "160", + "borders": "{3200,3712,3263,3775}" + }, + { + "id": "121", + "name": "Forbidden", + "indexId": "185", + "borders": "{3264,3520,3327,3583}" + }, + { + "id": "122", + "name": "Shine", + "indexId": "110", + "borders": "{3328,3264,3391,3327}" + }, + { + "id": "123", + "name": "Arabian2", + "indexId": "5", + "borders": "{3264,3264,3327,3327}" + }, + { + "id": "124", + "name": "Arabian3", + "indexId": "6", + "borders": "{3200,3072,3263,3135}" + }, + { + "id": "125", + "name": "Garden", + "indexId": "50", + "borders": "{3200,3392,3263,3455}" + }, + { + "id": "127", + "name": "Nightfall", + "indexId": "90", + "borders": "{3200,3904,3263,3967}-{2944,3264,3007,3327}" + }, + { + "id": "128", + "name": "Grumpy", + "indexId": "177", + "borders": "{2560,2944,2623,3007}" + }, + { + "id": "129", + "name": "Spooky Jungle", + "indexId": "115", + "borders": "{2752,2880,2815,2943}-{2880,9472,2943,9535}" + }, + { + "id": "130", + "name": "Tree Spirits", + "indexId": "126", + "borders": "{2304,3328,2367,3391}" + }, + { + "id": "131", + "name": "Understanding", + "indexId": "187", + "borders": "{2368,4800,2431,4863}" + }, + { + "id": "132", + "name": "Breeze", + "indexId": "194", + "borders": "{2240,3200,2303,3263}" + }, + { + "id": "133", + "name": "The Tower", + "indexId": "122", + "borders": "{2560,3328,2623,3391}-{2496,9728,2559,9791}" + }, + { + "id": "134", + "name": "La Mort", + "indexId": "192", + "borders": "{2176,4800,2239,4863}" + }, + { + "id": "138", + "name": "Emperor", + "indexId": "39", + "borders": "{2880,3200,2943,3263}-{2880,9600,2943,9663}" + }, + { + "id": "140", + "name": "Talking Forest", + "indexId": "119", + "borders": "{2624,3456,2687,3519}" + }, + { + "id": "141", + "name": "Barbarianism", + "indexId": "257", + "borders": "{3072,3392,3135,3455}-{3072,9792,3135,9855}" + }, + { + "id": "142", + "name": "Complication", + "indexId": "258", + "borders": "{2240,4800,2303,4863}" + }, + { + "id": "143", + "name": "Down to Earth", + "indexId": "259", + "borders": "{2624,4800,2687,4863}" + }, + { + "id": "144", + "name": "Scape Cave", + "indexId": "102", + "borders": "{3136,9856,3199,9919}-{3072,9536,3135,9599}" + }, + { + "id": "145", + "name": "Yesteryear", + "indexId": "161", + "borders": "{3200,3136,3263,3199}" + }, + { + "id": "146", + "name": "Zealot", + "indexId": "172", + "borders": "{2688,4800,2751,4863}" + }, + { + "id": "148", + "name": "Emotion", + "indexId": "38", + "borders": "{2496,3136,2559,3199}-{2560,4416,2623,4479}-{2496,9536,2559,9599}" + }, + { + "id": "149", + "name": "Principality", + "indexId": "188", + "borders": "{2880,3520,2943,3583}" + }, + { + "id": "151", + "name": "Start", + "indexId": "117", + "borders": "{3072,3264,3135,3327}" + }, + { + "id": "152", + "name": "Ballad of Enchantment", + "indexId": "19", + "borders": "{2560,3200,2623,3263}" + }, + { + "id": "153", + "name": "Expedition", + "indexId": "42", + "borders": "{2880,9984,2943,10047}" + }, + { + "id": "154", + "name": "Bone Dance", + "indexId": "183", + "borders": "{3392,3264,3455,3327}" + }, + { + "id": "155", + "name": "Neverland", + "indexId": "88", + "borders": "{2432,3328,2495,3391}" + }, + { + "id": "156", + "name": "Mausoleum", + "indexId": "184", + "borders": "{3392,9856,3455,9919}" + }, + { + "id": "157", + "name": "Medieval", + "indexId": "82", + "borders": "{3264,3392,3327,3455}" + }, + { + "id": "158", + "name": "Quest", + "indexId": "94", + "borders": "{2560,4800,2623,4863}" + }, + { + "id": "159", + "name": "Gaol", + "indexId": "49", + "borders": "{3008,3712,3071,3775}-{2496,3008,2559,3071}-{2496,9408,2559,9471}" + }, + { + "id": "160", + "name": "Army of Darkness", + "indexId": "8", + "borders": "{3008,3584,3071,3647}" + }, + { + "id": "161", + "name": "Long Ago", + "indexId": "75", + "borders": "{2624,3072,2687,3135}" + }, + { + "id": "162", + "name": "Tribal Background", + "indexId": "127", + "borders": "{2816,3072,2879,3135}-{2816,9472,2879,9535}" + }, + { + "id": "163", + "name": "Flute Salad", + "indexId": "47", + "borders": "{3136,3264,3199,3327}" + }, + { + "id": "164", + "name": "Landlubber", + "indexId": "169", + "borders": "{2688,3136,2751,3199}" + }, + { + "id": "165", + "name": "Tribal", + "indexId": "128", + "borders": "{2816,3008,2879,3071}" + }, + { + "id": "166", + "name": "Fanfare2", + "indexId": "162", + "borders": "{2944,3008,3007,3071}" + }, + { + "id": "167", + "name": "Fanfare3", + "indexId": "45", + "borders": "{2624,3136,2687,3199}" + }, + { + "id": "168", + "name": "Lonesome", + "indexId": "149", + "borders": "{3264,9408,3327,9471}" + }, + { + "id": "169", + "name": "Crystal Sword", + "indexId": "29", + "borders": "{3200,3520,3263,3583}-{2624,9664,2687,9727}" + }, + { + "id": "170", + "name": "The Shadow", + "indexId": "121", + "borders": "{2816,3200,2879,3263}" + }, + { + "id": "172", + "name": "Jungle Island", + "indexId": "66", + "borders": "{2816,3136,2879,3199}-{2816,2880,2879,2943}" + }, + { + "id": "173", + "name": "Dunjun", + "indexId": "36", + "borders": "{2880,9728,2943,9791}" + }, + { + "id": "174", + "name": "Desert Voyage", + "indexId": "33", + "borders": "{3264,2944,3327,3007}-{3328,3008,3391,3071}" + }, + { + "id": "175", + "name": "Spirit", + "indexId": "112", + "borders": "{3136,3392,3199,3455}" + }, + { + "id": "176", + "name": "Undercurrent", + "indexId": "170", + "borders": "{3072,3648,3135,3711}" + }, + { + "id": "177", + "name": "Adventure", + "indexId": "0", + "borders": "{3200,3456,3263,3519}" + }, + { + "id": "178", + "name": "Courage", + "indexId": "260", + "borders": "{2880,9792,2943,9855}" + }, + { + "id": "179", + "name": "Underground", + "indexId": "132", + "borders": "{3328,3584,3391,3647}-{2816,9728,2879,9791}" + }, + { + "id": "180", + "name": "Attention", + "indexId": "16", + "borders": "{2944,3136,3007,3199}" + }, + { + "id": "181", + "name": "Crystal Cave", + "indexId": "28", + "borders": "{2432,4416,2495,4479}" + }, + { + "id": "182", + "name": "Dangerous", + "indexId": "30", + "borders": "{3264,3776,3327,3839}-{3264,3712,3327,3775}" + }, + { + "id": "183", + "name": "Troubled", + "indexId": "131", + "borders": "{2944,3648,3007,3711}" + }, + { + "id": "184", + "name": "Magical Journey", + "indexId": "80", + "borders": "{2688,3392,2751,3455}" + }, + { + "id": "185", + "name": "Magic Dance", + "indexId": "79", + "borders": "{2560,3072,2623,3135}" + }, + { + "id": "186", + "name": "Arrival", + "indexId": "9", + "borders": "{2880,3328,2943,3391}" + }, + { + "id": "187", + "name": "Tremble", + "indexId": "189", + "borders": "{2816,3584,2879,3647}" + }, + { + "id": "188", + "name": "In the Manor", + "indexId": "62", + "borders": "{2560,3008,2623,3071}" + }, + { + "id": "190", + "name": "Heart and Mind", + "indexId": "174", + "borders": "{2496,4800,2559,4863}" + }, + { + "id": "191", + "name": "Knightly", + "indexId": "70", + "borders": "{2560,3264,2623,3327}" + }, + { + "id": "192", + "name": "Trinity", + "indexId": "130", + "borders": "{2688,3328,2751,3391}-{2688,9728,2751,9791}" + }, + { + "id": "193", + "name": "Mellow", + "indexId": "83", + "borders": "{2560,3392,2623,3455}" + }, + { + "id": "198", + "name": "Dagannoth Dawn", + "indexId": "365", + "borders": "{1792,4352,1855,4415}-{1920,4352,1983,4415}" + }, + { + "id": "241", + "name": "Stagnant", + "indexId": "193", + "borders": "{3456,3328,3519,3391}-{2176,4992,2239,5055}" + }, + { + "id": "242", + "name": "Time Out", + "indexId": "196", + "borders": "{2880,4544,2943,4607}" + }, + { + "id": "243", + "name": "Stratosphere", + "indexId": "195", + "borders": "{2112,4800,2175,4863}" + }, + { + "id": "244", + "name": "Waterlogged", + "indexId": "199", + "borders": "{3456,3392,3519,3455}-{1984,4992,2047,5055}" + }, + { + "id": "245", + "name": "Natural", + "indexId": "197", + "borders": "{3392,3328,3455,3391}-{2240,4992,2303,5055}" + }, + { + "id": "246", + "name": "Grotto", + "indexId": "198", + "borders": "{3392,9728,3455,9791}" + }, + { + "id": "247", + "name": "Artistry", + "indexId": "200", + "borders": "{1984,4736,2047,4799}" + }, + { + "id": "248", + "name": "Aztec", + "indexId": "201", + "borders": "{2752,9536,2815,9599}" + }, + { + "id": "251", + "name": "Forest", + "indexId": "203", + "borders": "{2240,3136,2303,3199}" + }, + { + "id": "252", + "name": "Elven Mist", + "indexId": "202", + "borders": "{2304,3200,2367,3263}" + }, + { + "id": "253", + "name": "Lost Soul", + "indexId": "204", + "borders": "{2240,3072,2303,3135}" + }, + { + "id": "254", + "name": "Meridian", + "indexId": "205", + "borders": "{2112,3136,2175,3199}" + }, + { + "id": "255", + "name": "Woodland", + "indexId": "206", + "borders": "{2112,3200,2175,3263}" + }, + { + "id": "256", + "name": "Overpass", + "indexId": "207", + "borders": "{2304,3264,2367,3327}" + }, + { + "id": "257", + "name": "Sojourn", + "indexId": "209", + "borders": "{2816,3648,2879,3711}" + }, + { + "id": "258", + "name": "Contest", + "indexId": "208", + "borders": "{2880,3584,2943,3647}" + }, + { + "id": "259", + "name": "Crystal Castle", + "indexId": "210", + "borders": "{2240,3264,2303,3327}" + }, + { + "id": "260", + "name": "Insect Queen", + "indexId": "212", + "borders": "{3456,9472,3519,9535}" + }, + { + "id": "261", + "name": "Marzipan", + "indexId": "211", + "borders": "{2752,10112,2815,10175}-{2816,10048,2879,10111}" + }, + { + "id": "262", + "name": "Righteousness", + "indexId": "223", + "borders": "{2432,4800,2495,4863}" + }, + { + "id": "263", + "name": "Bandit Camp", + "indexId": "214", + "borders": "{3136,2944,3199,3007}" + }, + { + "id": "264", + "name": "Mad Eadgar", + "indexId": "213", + "borders": "{2880,10048,2943,10111}" + }, + { + "id": "265", + "name": "Superstition", + "indexId": "261", + "borders": "{2752,9280,2815,9343}" + }, + { + "id": "266", + "name": "Bone Dry", + "indexId": "216", + "borders": "{3200,9344,3263,9407}" + }, + { + "id": "267", + "name": "Sunburn", + "indexId": "215", + "borders": "{3200,2944,3263,3007}-{3328,2880,3391,2943}" + }, + { + "id": "268", + "name": "Everywhere", + "indexId": "219", + "borders": "{2112,3264,2175,3327}" + }, + { + "id": "269", + "name": "Competition", + "indexId": "217", + "borders": "{2176,4928,2239,4991}" + }, + { + "id": "270", + "name": "Exposed", + "indexId": "220", + "borders": "{2176,3072,2239,3135}" + }, + { + "id": "271", + "name": "Well of Voyage", + "indexId": "469", + "borders": "{2304,9600,2367,9663}" + }, + { + "id": "272", + "name": "Alternative Root", + "indexId": "221", + "borders": "" + }, + { + "id": "277", + "name": "Haunted Mine", + "indexId": "222", + "borders": "{2752,4416,2815,4479}" + }, + { + "id": "278", + "name": "Deep Down", + "indexId": "224", + "borders": "{2688,4544,2751,4607}-{2688,4480,2751,4543}" + }, + { + "id": "282", + "name": "Chamber", + "indexId": "225", + "borders": "{2688,4416,2751,4479}-{2752,4480,2815,4543}" + }, + { + "id": "284", + "name": "Miscellania", + "indexId": "226", + "borders": "{2496,3840,2559,3903}" + }, + { + "id": "285", + "name": "Etcetera", + "indexId": "227", + "borders": "{2560,3840,2623,3903}" + }, + { + "id": "286", + "name": "Shadowland", + "indexId": "228", + "borders": "{3392,3200,3455,3263}-{3456,3264,3519,3327}-{2112,4992,2175,5055}" + }, + { + "id": "287", + "name": "Lair", + "indexId": "229", + "borders": "{3456,9664,3519,9727}" + }, + { + "id": "288", + "name": "Deadlands", + "indexId": "230", + "borders": "{3520,3456,3583,3519}" + }, + { + "id": "289", + "name": "Rellekka", + "indexId": "231", + "borders": "{2560,3648,2623,3711}" + }, + { + "id": "290", + "name": "Saga", + "indexId": "232", + "borders": "{2560,3584,2623,3647}" + }, + { + "id": "291", + "name": "Borderland", + "indexId": "233", + "borders": "{2688,3648,2751,3711}" + }, + { + "id": "292", + "name": "Stranded", + "indexId": "234", + "borders": "{2816,3712,2879,3775}-{2880,3712,2943,3775}" + }, + { + "id": "293", + "name": "Legend", + "indexId": "235", + "borders": "{2688,3584,2751,3647}" + }, + { + "id": "294", + "name": "Frostbite", + "indexId": "236", + "borders": "{2816,3776,2879,3839}" + }, + { + "id": "295", + "name": "Warrior", + "indexId": "237", + "borders": "{2624,10048,2687,10111}" + }, + { + "id": "296", + "name": "Technology", + "indexId": "238", + "borders": "{2560,4480,2623,4543}" + }, + { + "id": "303", + "name": "Monkey Madness", + "indexId": "239", + "borders": "{2752,2752,2815,2815}" + }, + { + "id": "304", + "name": "Marooned", + "indexId": "241", + "borders": "{2880,2688,2943,2751}-{3008,5440,3071,5503}" + }, + { + "id": "305", + "name": "Anywhere", + "indexId": "240", + "borders": "{2688,2752,2751,2815}" + }, + { + "id": "306", + "name": "Island Life", + "indexId": "242", + "borders": "{2688,2688,2751,2751}" + }, + { + "id": "307", + "name": "Temple", + "indexId": "243", + "borders": "{2752,9152,2815,9215}" + }, + { + "id": "311", + "name": "Showdown", + "indexId": "245", + "borders": "{2688,9152,2751,9215}" + }, + { + "id": "312", + "name": "Find My Way", + "indexId": "246", + "borders": "{2688,9088,2751,9151}" + }, + { + "id": "314", + "name": "Castle Wars", + "indexId": "247", + "borders": "{2368,3072,2431,3135}" + }, + { + "id": "316", + "name": "The Navigator", + "indexId": "255", + "borders": "{2624,9984,2687,10047}" + }, + { + "id": "317", + "name": "Melodrama", + "indexId": "248", + "borders": "{2432,3072,2495,3135}" + }, + { + "id": "318", + "name": "Ready for Battle", + "indexId": "249", + "borders": "{2368,9472,2431,9535}" + }, + { + "id": "319", + "name": "Stillness", + "indexId": "250", + "borders": "{3456,9792,3519,9855}" + }, + { + "id": "320", + "name": "Lighthouse", + "indexId": "251", + "borders": "{2496,3584,2559,3647}" + }, + { + "id": "322", + "name": "Out of the Deep", + "indexId": "253", + "borders": "{2496,9984,2559,10047}" + }, + { + "id": "323", + "name": "Underground Pass", + "indexId": "134", + "borders": "{2368,9536,2431,9599}" + }, + { + "id": "324", + "name": "Background", + "indexId": "18", + "borders": "{2752,3328,2815,3391}-{1920,4992,1983,5055}" + }, + { + "id": "325", + "name": "Cave Background", + "indexId": "25", + "borders": "{3008,9728,3071,9791}-{2944,9792,3007,9855}" + }, + { + "id": "326", + "name": "Dark", + "indexId": "31", + "borders": "{3328,3648,3391,3711}" + }, + { + "id": "327", + "name": "Dream", + "indexId": "35", + "borders": "{3136,3200,3199,3263}" + }, + { + "id": "328", + "name": "March", + "indexId": "81", + "borders": "{2496,3328,2559,3391}" + }, + { + "id": "329", + "name": "Regal", + "indexId": "95", + "borders": "{3264,3904,3327,3967}" + }, + { + "id": "330", + "name": "Cellar Song", + "indexId": "173", + "borders": "{3136,9792,3199,9855}" + }, + { + "id": "331", + "name": "Scape Sad", + "indexId": "104", + "borders": "{3264,3840,3327,3903}" + }, + { + "id": "332", + "name": "Scape Wild", + "indexId": "105", + "borders": "{3200,3648,3263,3711}-{3136,3840,3199,3903}" + }, + { + "id": "333", + "name": "Spooky", + "indexId": "114", + "borders": "{3072,3328,3135,3391}" + }, + { + "id": "334", + "name": "Pirates of Peril", + "indexId": "262", + "borders": "{3008,3904,3071,3967}" + }, + { + "id": "335", + "name": "Romancing the Crone", + "indexId": "264", + "borders": "{2752,3840,2815,3903}" + }, + { + "id": "336", + "name": "Dangerous Road", + "indexId": "263", + "borders": "{2816,9536,2879,9599}" + }, + { + "id": "337", + "name": "Faithless", + "indexId": "265", + "borders": "{3200,3584,3263,3647}" + }, + { + "id": "338", + "name": "Tiptoe", + "indexId": "266", + "borders": "{3072,9728,3135,9791}" + }, + { + "id": "339", + "name": "The Terrible Tower", + "indexId": "267", + "borders": "{3392,3520,3455,3583}" + }, + { + "id": "340", + "name": "Masquerade", + "indexId": "268", + "borders": "{2688,9984,2751,10047}" + }, + { + "id": "341", + "name": "The Slayer", + "indexId": "269", + "borders": "{2752,9984,2815,10047}" + }, + { + "id": "342", + "name": "Body Parts", + "indexId": "270", + "borders": "{3456,9920,3519,9983}" + }, + { + "id": "343", + "name": "Monster Melee", + "indexId": "272", + "borders": "{3136,9600,3199,9663}" + }, + { + "id": "344", + "name": "Fenkenstrain's Refrain", + "indexId": "271", + "borders": "{3456,3520,3519,3583}" + }, + { + "id": "345", + "name": "Barking Mad", + "indexId": "274", + "borders": "{3520,9856,3583,9919}" + }, + { + "id": "346", + "name": "Goblin Game", + "indexId": "252", + "borders": "{2560,9792,2623,9855}" + }, + { + "id": "347", + "name": "Fruits de Mer", + "indexId": "273", + "borders": "{2752,3264,2815,3327}" + }, + { + "id": "348", + "name": "Narnode's Theme", + "indexId": "513", + "borders": "{2432,9856,2495,9919}" + }, + { + "id": "351", + "name": "Dynasty", + "indexId": "275", + "borders": "{3328,2944,3391,3007}" + }, + { + "id": "352", + "name": "Scarab", + "indexId": "282", + "borders": "{3136,2880,3199,2943}" + }, + { + "id": "353", + "name": "Shipwrecked", + "indexId": "276", + "borders": "{3584,3520,3647,3583}" + }, + { + "id": "354", + "name": "Phasmatys", + "indexId": "277", + "borders": "{3648,9856,3711,9919}" + }, + { + "id": "355", + "name": "The Other Side", + "indexId": "278", + "borders": "{3648,3456,3711,3519}" + }, + { + "id": "356", + "name": "Settlement", + "indexId": "279", + "borders": "{2752,3648,2815,3711}" + }, + { + "id": "357", + "name": "Cave of Beasts", + "indexId": "280", + "borders": "{2752,10048,2815,10111}" + }, + { + "id": "358", + "name": "Dragontooth Island", + "indexId": "281", + "borders": "{3776,3520,3839,3583}" + }, + { + "id": "359", + "name": "Sarcophagus", + "indexId": "283", + "borders": "{3200,9280,3263,9343}" + }, + { + "id": "361", + "name": "Down Below", + "indexId": "284", + "borders": "{3072,9600,3135,9663}" + }, + { + "id": "362", + "name": "Karamja Jam", + "indexId": "286", + "borders": "{2688,9472,2751,9535}-{2688,9408,2751,9471}" + }, + { + "id": "363", + "name": "7th Realm", + "indexId": "285", + "borders": "{2624,9536,2687,9599}-{2624,9472,2687,9535}" + }, + { + "id": "364", + "name": "Pathways", + "indexId": "287", + "borders": "{2688,9536,2751,9599}" + }, + { + "id": "369", + "name": "Time to Mine", + "indexId": "289", + "borders": "{2816,10112,2879,10175}" + }, + { + "id": "370", + "name": "In Between", + "indexId": "290", + "borders": "{2496,4928,2559,4991}" + }, + { + "id": "372", + "name": "Far Away", + "indexId": "292", + "borders": "{2304,3136,2367,3199}" + }, + { + "id": "373", + "name": "Claustrophobia", + "indexId": "291", + "borders": "{2304,4928,2367,4991}" + }, + { + "id": "375", + "name": "Fight or Flight", + "indexId": "293", + "borders": "{1920,4608,1983,4671}" + }, + { + "id": "376", + "name": "Temple of Light", + "indexId": "294", + "borders": "{1856,4608,1919,4671}" + }, + { + "id": "377", + "name": "The Golem", + "indexId": "295", + "borders": "{3392,3072,3455,3135}-{3456,3072,3519,3135}" + }, + { + "id": "380", + "name": "Dance of the Undead", + "indexId": "298", + "borders": "{3520,3264,3583,3327}" + }, + { + "id": "381", + "name": "Dangerous Way", + "indexId": "299", + "borders": "{3520,9664,3583,9727}" + }, + { + "id": "383", + "name": "City of the Dead", + "indexId": "300", + "borders": "{3200,2752,3263,2815}-{3264,2752,3327,2815}" + }, + { + "id": "386", + "name": "Bandos Battalion", + "indexId": "492", + "borders": "{2820,5312,2849,5369}-{2849,5349,2880,5374}" + }, + { + "id": "387", + "name": "Sphinx", + "indexId": "302", + "borders": "{3264,2816,3327,2879}" + }, + { + "id": "388", + "name": "Mirage", + "indexId": "303", + "borders": "{3264,9152,3327,9215}" + }, + { + "id": "389", + "name": "Cave of the Goblins", + "indexId": "304", + "borders": "{3136,9536,3199,9599}" + }, + { + "id": "390", + "name": "Romper Chomper", + "indexId": "312", + "borders": "{2304,3008,2367,3071}" + }, + { + "id": "391", + "name": "Zamorak Zoo", + "indexId": "490", + "borders": "{2879,5340,2944,5366}-{2909,5316,2944,5340}" + }, + { + "id": "392", + "name": "Zogre Dance", + "indexId": "306", + "borders": "{2432,3008,2495,3071}" + }, + { + "id": "393", + "name": "Path of Peril", + "indexId": "307", + "borders": "{2624,5056,2687,5119}" + }, + { + "id": "394", + "name": "Wayward", + "indexId": "308", + "borders": "{2432,9408,2495,9471}" + }, + { + "id": "395", + "name": "Tale of Keldagrim", + "indexId": "309", + "borders": "{2880,10112,2943,10175}" + }, + { + "id": "396", + "name": "Land of the Dwarves", + "indexId": "310", + "borders": "{2816,10176,2879,10239}" + }, + { + "id": "397", + "name": "Tears of Guthix", + "indexId": "311", + "borders": "{3200,9472,3263,9535}" + }, + { + "id": "399", + "name": "Armageddon", + "indexId": "494", + "borders": "{2816,5248,2943,5375,[2823,5250,2844,5310]~,[2844,5250,2878,5280]~,[2879,5340,2944,5366]~,[2909,5316,2944,5340]~,[2820,5312,2849,5369]~,[2849,5349,2880,5374]~,[2885,5253,2934,5278]~,[2913,5278,2937,5306]}" + }, + { + "id": "401", + "name": "The Adventurer", + "indexId": "520", + "borders": "" + }, + { + "id": "402", + "name": "The Rogues' Den", + "indexId": "313", + "borders": "{2944,4928,3007,4991}-{3008,4928,3071,4991}" + }, + { + "id": "403", + "name": "The Far Side", + "indexId": "314", + "borders": "{3008,5056,3071,5119}" + }, + { + "id": "404", + "name": "Armadyl Alliance", + "indexId": "493", + "borders": "{2823,5250,2844,5310}-{2844,5250,2878,5280}" + }, + { + "id": "407", + "name": "The Lost Melody", + "indexId": "315", + "borders": "{3264,9600,3327,9663}" + }, + { + "id": "408", + "name": "Strength of Saradomin", + "indexId": "491", + "borders": "{2885,5253,2934,5278}-{2913,5278,2937,5306}" + }, + { + "id": "409", + "name": "Frogland", + "indexId": "336", + "borders": "{2432,4736,2495,4799}" + }, + { + "id": "411", + "name": "Evil Bob's Island", + "indexId": "316", + "borders": "{2496,4736,2559,4799}" + }, + { + "id": "412", + "name": "Into the Abyss", + "indexId": "317", + "borders": "{3008,4800,3071,4863}" + }, + { + "id": "413", + "name": "The Quiz Master", + "indexId": "318", + "borders": "{1920,4736,1983,4799}" + }, + { + "id": "418", + "name": "Corporal Punishment", + "indexId": "323", + "borders": "{3136,4800,3199,4863}" + }, + { + "id": "419", + "name": "Pheasant Peasant", + "indexId": "321", + "borders": "{2560,4736,2623,4799}" + }, + { + "id": "425", + "name": "The Chosen", + "indexId": "324", + "borders": "{2432,4928,2495,4991}" + }, + { + "id": "428", + "name": "Altar Ego", + "indexId": "501", + "borders": "{3264,4800,3327,4863}" + }, + { + "id": "432", + "name": "Grimly Fiendish", + "indexId": "509", + "borders": "{1600,4800,1663,4863}-{1664,4800,1727,4863}" + }, + { + "id": "434", + "name": "Have a Blast", + "indexId": "325", + "borders": "{1920,4928,1983,4991}" + }, + { + "id": "435", + "name": "Wilderness", + "indexId": "142", + "borders": "{2944,3584,3007,3647}-{3072,3712,3135,3775}" + }, + { + "id": "442", + "name": "Clan Wars", + "indexId": "515", + "borders": "" + }, + { + "id": "443", + "name": "Bounty Hunter Level 2", + "indexId": "518", + "borders": "{2944,5632,3135,5823}" + }, + { + "id": "444", + "name": "Bounty Hunter Level 1", + "indexId": "517", + "borders": "{2688,5632,2879,5823}" + }, + { + "id": "445", + "name": "Bounty Hunter Level 3", + "indexId": "519", + "borders": "{3200,5632,3391,5823}" + }, + { + "id": "447", + "name": "Over To Nardah", + "indexId": "328", + "borders": "{3392,2880,3455,2943}" + }, + { + "id": "448", + "name": "The Monsters Below", + "indexId": "329", + "borders": "{2432,10112,2495,10175}" + }, + { + "id": "456", + "name": "Animal Apogee", + "indexId": "504", + "borders": "" + }, + { + "id": "461", + "name": "The Desolate Isle", + "indexId": "330", + "borders": "{2496,3712,2559,3775}" + }, + { + "id": "462", + "name": "Spirits of Elid", + "indexId": "331", + "borders": "{3328,9536,3391,9599}" + }, + { + "id": "463", + "name": "Fire and Brimstone", + "indexId": "334", + "borders": "{2368,5120,2431,5183}" + }, + { + "id": "464", + "name": "The Genie", + "indexId": "332", + "borders": "{3328,9280,3391,9343}" + }, + { + "id": "465", + "name": "Desert Heat", + "indexId": "333", + "borders": "{3392,2944,3455,3007}" + }, + { + "id": "469", + "name": "In the Pits", + "indexId": "335", + "borders": "{2432,5120,2495,5183}" + }, + { + "id": "471", + "name": "Brew Hoo Hoo", + "indexId": "338", + "borders": "{3648,9920,3711,9983}" + }, + { + "id": "473", + "name": "TzHaar!", + "indexId": "339", + "borders": "{2368,5056,2431,5119}" + }, + { + "id": "475", + "name": "Wild Side", + "indexId": "340", + "borders": "{3008,3840,3071,3903}" + }, + { + "id": "476", + "name": "Dead Can Dance", + "indexId": "341", + "borders": "{3136,3648,3199,3711}" + }, + { + "id": "478", + "name": "The Cellar Dwellers", + "indexId": "342", + "borders": "{2496,9664,2559,9727}" + }, + { + "id": "479", + "name": "Jungle Troubles", + "indexId": "343", + "borders": "{2880,3072,2943,3135}" + }, + { + "id": "481", + "name": "Catch Me If You Can", + "indexId": "344", + "borders": "{2624,9600,2687,9663}" + }, + { + "id": "482", + "name": "Rat a Tat Tat", + "indexId": "345", + "borders": "{2880,5056,2943,5119}" + }, + { + "id": "489", + "name": "Bubble and Squeak", + "indexId": "347", + "borders": "{1920,4672,1983,4735}" + }, + { + "id": "490", + "name": "Sarim's Vermin", + "indexId": "348", + "borders": "{2944,9600,3007,9663}" + }, + { + "id": "491", + "name": "Rat Hunt", + "indexId": "349", + "borders": "{2816,5056,2879,5119}" + }, + { + "id": "496", + "name": "The Trade Parade", + "indexId": "555", + "borders": "{3136,3456,3199,3519}" + }, + { + "id": "497", + "name": "Aye Car Rum Ba", + "indexId": "351", + "borders": "{2112,5056,2175,5119}" + }, + { + "id": "498", + "name": "Blistering Barnacles", + "indexId": "352", + "borders": "{2112,5120,2175,5183}" + }, + { + "id": "500", + "name": "A New Menace", + "indexId": "522", + "borders": "" + }, + { + "id": "501", + "name": "Distant Land", + "indexId": "353", + "borders": "{3456,3136,3519,3199}" + }, + { + "id": "505", + "name": "Pharaoh's Tomb", + "indexId": "355", + "borders": "{3328,2816,3391,2879}-{3008,4672,3071,4735}" + }, + { + "id": "511", + "name": "In the Clink", + "indexId": "360", + "borders": "{2048,4416,2111,4479}" + }, + { + "id": "515", + "name": "Mudskipper Melody", + "indexId": "361", + "borders": "{2944,3072,3007,3135}" + }, + { + "id": "517", + "name": "Subterranea", + "indexId": "362", + "borders": "{2496,10112,2559,10175}" + }, + { + "id": "526", + "name": "Arma Gonna Get You", + "indexId": "592", + "borders": "" + }, + { + "id": "524", + "name": "Xenophobe", + "indexId": "366", + "borders": "{1856,4352,1919,4415}-{2880,4416,2943,4479}" + }, + { + "id": "528", + "name": "Victory is Mine", + "indexId": "368", + "borders": "{3136,9728,3199,9791}" + }, + { + "id": "529", + "name": "Woe of the Wyvern", + "indexId": "369", + "borders": "{3008,9536,3071,9599}" + }, + { + "id": "530", + "name": "In the Brine", + "indexId": "370", + "borders": "{3648,2944,3711,3007}" + }, + { + "id": "532", + "name": "Diango's Little Helpers", + "indexId": "371", + "borders": "{1984,4416,2047,4479}" + }, + { + "id": "542", + "name": "Lament", + "indexId": "381", + "borders": "{3072,9280,3135,9343}" + }, + { + "id": "544", + "name": "Making Waves", + "indexId": "378", + "borders": "{2304,3648,2367,3711}-{2304,3584,2367,3647}" + }, + { + "id": "555", + "name": "Ardougne Ago", + "indexId": "613", + "borders": "" + }, + { + "id": "569", + "name": "Undead Army", + "indexId": "607", + "borders": "{3200,9984,3263,10047}" + }, + { + "id": "571", + "name": "Art of Hocus-Pocus", + "indexId": "624", + "borders": "" + }, + { + "id": "573", + "name": "The Mad Mole", + "indexId": "393", + "borders": "{1728,5120,1791,5183}" + }, + { + "id": "575", + "name": "Chickened Out", + "indexId": "395", + "borders": "{2432,4352,2495,4415}" + }, + { + "id": "576", + "name": "Davy Jones's Locker", + "indexId": "394", + "borders": "{2944,9472,3007,9535}" + }, + { + "id": "583", + "name": "Chef Surprize", + "indexId": "399", + "borders": "{1856,5312,1919,5375}" + }, + { + "id": "586", + "name": "Everlasting Fire", + "indexId": "417", + "borders": "{3328,3904,3391,3967}" + }, + { + "id": "587", + "name": "Null and Void", + "indexId": "400", + "borders": "{2624,2624,2687,2687}" + }, + { + "id": "588", + "name": "Pest Control", + "indexId": "401", + "borders": "{2624,2560,2687,2623}" + }, + { + "id": "594", + "name": "No Way Out", + "indexId": "403", + "borders": "{3264,9792,3327,9855}-{3072,5184,3135,5247}-{3008,5184,3071,5247}" + }, + { + "id": "603", + "name": "Funny Bunnies", + "indexId": "406", + "borders": "{2432,5248,2495,5311}" + }, + { + "id": "604", + "name": "Assault and Battery", + "indexId": "407", + "borders": "" + }, + { + "id": "612", + "name": "Head to Head", + "indexId": "411", + "borders": "{1856,5120,1919,5183}" + }, + { + "id": "616", + "name": "Back to Life", + "indexId": "414", + "borders": "" + }, + { + "id": "634", + "name": "Warriors' Guild", + "indexId": "423", + "borders": "" + }, + { + "id": "964", + "name": "Too Many Cooks...", + "indexId": "398", + "borders": "{2944,9856,3007,9919}" + } +] diff --git a/Server/data/configs/npc_configs.json b/Server/data/configs/npc_configs.json new file mode 100644 index 000000000..2606f7ada --- /dev/null +++ b/Server/data/configs/npc_configs.json @@ -0,0 +1,73044 @@ +[ + { + "id": "0", + "name": "Hans", + "examine": "Servant of the Duke of Lumbridge.", + "lifepoints": "12", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": "0" + }, + { + "id": "1", + "name": "Man", + "examine": "One of 2009Scape's many citizens.", + "lifepoints": "10", + "attack_level": "3", + "strength_level": "1", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "weakness": "9", + "slayer_exp": "0", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2", + "name": "Man", + "examine": "One of 2009Scape's many citizens.", + "lifepoints": "10", + "attack_level": "3", + "strength_level": "1", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3", + "name": "Man", + "examine": "One of 2009Scape's many citizens.", + "lifepoints": "10", + "attack_level": "3", + "strength_level": "1", + "defence_level": "3", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "weakness": "9", + "slayer_exp": "0", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4", + "name": "Woman", + "examine": "One of 2009Scape's many citizens.", + "lifepoints": "10", + "attack_level": "3", + "strength_level": "1", + "defence_level": "3", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "5", + "name": "Woman", + "examine": "One of 2009Scape's many citizens.", + "lifepoints": "10", + "attack_level": "3", + "strength_level": "1", + "defence_level": "3", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "6", + "name": "Woman", + "examine": "One of 2009Scape's many citizens.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "1", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "7", + "name": "Farmer", + "examine": "He grows the crops in this area.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "8", + "name": "Thief", + "examine": "Known for his light-fingered qualities.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "9", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "10", + "name": "Schoolgirl", + "examine": "She looks happy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "11", + "name": "Tramp", + "examine": "A man down on his luck.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "12", + "name": "Barbarian", + "examine": "Not very civilised looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "safespot": null + }, + { + "id": "13", + "name": "Wizard", + "examine": "Slightly magical.", + "lifepoints": "14", + "attack_level": "1", + "strength_level": "1", + "defence_level": "12", + "range_level": "1", + "magic_level": "21", + "bonuses": "23,7,8,2,1,8,12,0,0,0,0,0,0,0,0", + "respawn_delay": "12", + "melee_animation": "2791", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "711", + "range_animation": "711", + "start_gfx": "2728", + "projectile": "2729", + "end_gfx": "2737", + "weakness": "3", + "slayer_exp": "0", + "combat_style": "2", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "14", + "name": "Druid", + "examine": "Loves nature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "15", + "name": "Warrior woman", + "examine": "Not very fashion conscious.", + "lifepoints": "20", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "16", + "name": "Man", + "examine": "One of the citizens of Al Kharid.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "18", + "name": "Al-Kharid warrior", + "examine": "Part of Al-Kharid's elite fighting force.", + "lifepoints": "19", + "attack_level": "7", + "strength_level": "15", + "defence_level": "5", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "390", + "defence_animation": "387", + "death_animation": "836", + "magic_animation": "390", + "range_animation": "390", + "weakness": "7", + "clue_level": "0", + "safespot": null + }, + { + "id": "19", + "name": "White Knight", + "examine": "Shiny armour!", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "8", + "melee_animation": "7042", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "20", + "name": "Paladin", + "examine": "A holy warrior.", + "lifepoints": "66", + "attack_level": "54", + "strength_level": "54", + "defence_level": "54", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "21", + "name": "Hero", + "examine": "Heroic!", + "lifepoints": "82", + "attack_level": "54", + "strength_level": "55", + "defence_level": "54", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "22", + "name": "Forester", + "examine": "They love the forests.", + "lifepoints": "17", + "attack_level": "14", + "strength_level": "13", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "4", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "23", + "name": "Knight of Ardougne", + "examine": "A member of Ardougne's militia.", + "lifepoints": "52", + "attack_level": "38", + "strength_level": "40", + "defence_level": "31", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "24", + "name": "Man", + "examine": "One of 2009Scape's many citizens.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "25", + "name": "Woman", + "examine": "One of 2009Scape's many citizens.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "26", + "name": "Knight of Ardougne", + "examine": "To protect and serve the populace of Ardougne.", + "lifepoints": "52", + "attack_level": "38", + "strength_level": "40", + "defence_level": "31", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "27", + "name": "Archer", + "examine": "Good with arrows.", + "lifepoints": "50", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "40", + "respawn_delay": "12", + "melee_animation": "426", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "426", + "range_animation": "426", + "start_gfx": "19", + "projectile": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "28", + "name": "Zoo keeper", + "examine": "Enjoys locking up animals in small pens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "29", + "name": "Chuck", + "examine": "He's a lumberjack, and he's ok.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "30", + "name": "Barman", + "examine": "Doesn't water down the beer too much.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "31", + "name": "Priest", + "examine": "A holy man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "32", + "name": "Guard", + "examine": "Keeps the peace... kind of.", + "lifepoints": "22", + "attack_level": "17", + "strength_level": "18", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "33", + "name": "Door man", + "examine": "What a boring job he has.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "34", + "name": "Watchman", + "examine": "Watches stuff. But who watches him?", + "lifepoints": "22", + "attack_level": "31", + "strength_level": "31", + "defence_level": "31", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "35", + "name": "Soldier", + "examine": "A soldier of the town of Yanille.", + "lifepoints": "22", + "attack_level": "26", + "strength_level": "25", + "defence_level": "26", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "36", + "name": "Wyson the gardener", + "examine": "The head gardener.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "37", + "name": "Sigbert the Adventurer", + "examine": "A bold knight famed for his travels.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "38", + "name": "Shipyard worker", + "examine": "Builds ships for a living.", + "lifepoints": "10", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "39", + "name": "Shipyard worker", + "examine": "Builds ships for a living.", + "lifepoints": "10", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "40", + "name": "Shark", + "examine": "Let's not go skinny dipping eh?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "41", + "name": "Chicken", + "examine": "Yep. Definitely a chicken.", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "6", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "5387", + "range_animation": "5387", + "weakness": "9", + "slayer_task": "7", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "42", + "name": "Sheep", + "examine": "Freshly sheared.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "43", + "name": "Sheep", + "examine": "White and fluffy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "44", + "name": "Banker", + "examine": "He can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "45", + "name": "Banker", + "examine": "She can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "46", + "name": "Duck", + "examine": "Quackers.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "3468", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "7", + "water_npc": "true", + "safespot": null + }, + { + "id": "47", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "2", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "3102,3104,3103", + "safespot": null + }, + { + "id": "48", + "name": "Oomlie bird", + "examine": "A jungle version of the chicken, but more vicious.", + "lifepoints": "40", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "5387", + "defence_animation": "0", + "death_animation": "5389", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "7", + "safespot": null + }, + { + "id": "49", + "name": "Hellhound", + "examine": "Hello, nice doggy...", + "lifepoints": "116", + "attack_level": "105", + "strength_level": "104", + "defence_level": "102", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "6562", + "defence_animation": "6563", + "death_animation": "6564", + "magic_animation": "6562", + "range_animation": "6562", + "weakness": "1", + "slayer_task": "43", + "slayer_exp": "116", + "clue_level": "2", + "combat_audio": "3717,3719,3718", + "safespot": null + }, + { + "id": "50", + "name": "King Black Dragon", + "examine": "The biggest, meanest dragon around.", + "lifepoints": "240", + "attack_level": "240", + "strength_level": "240", + "defence_level": "240", + "range_level": "1", + "magic_level": "240", + "bonuses": "0,0,0,0,0,70,90,90,80,70,0,0,0,0,0", + "respawn_delay": "50", + "agg_radius": "64", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "4", + "slayer_task": "9", + "slayer_exp": "258", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "51", + "name": "Baby dragon", + "examine": "A dragon covered in frost and ice.", + "lifepoints": "160", + "attack_level": "102", + "strength_level": "103", + "defence_level": "112", + "range_level": "80", + "magic_level": "116", + "bonuses": "124,130,137,184,176,128,168,145,104,54,0,0,0,0,0", + "respawn_delay": "25", + "weakness": "0", + "aggressive": "true", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "52", + "name": "Baby blue dragon", + "examine": "Young but still dangerous.", + "lifepoints": "50", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,30,50,50,40,30,0,0,0,0,0", + "weakness": "3", + "slayer_task": "11", + "slayer_exp": "50", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "53", + "name": "Red dragon", + "examine": "A big powerful dragon.", + "lifepoints": "140", + "attack_level": "130", + "strength_level": "130", + "defence_level": "130", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "68", + "slayer_exp": "143", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "54", + "name": "Black dragon", + "examine": "A fierce dragon with black scales!", + "lifepoints": "190", + "attack_level": "200", + "strength_level": "200", + "defence_level": "200", + "range_level": "1", + "magic_level": "100", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "9", + "slayer_exp": "200", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "55", + "name": "Blue dragon", + "examine": "A mother dragon.", + "lifepoints": "105", + "attack_level": "95", + "strength_level": "95", + "defence_level": "95", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "11", + "slayer_exp": "108", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "56", + "name": "Dryad", + "examine": "A wood nymph.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "57", + "name": "Fairy", + "examine": "A delicate creature from this strange realm.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "58", + "name": "Shadow spider", + "examine": "Is it a spider or is it a shadow?", + "lifepoints": "55", + "attack_level": "44", + "strength_level": "42", + "defence_level": "44", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "5327", + "defence_animation": "0", + "death_animation": "5329", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "76", + "slayer_exp": "55", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "59", + "name": "Giant spider", + "examine": "I think this spider has been genetically modified.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "5327", + "defence_animation": "0", + "death_animation": "5329", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "76", + "slayer_exp": "5", + "aggressive": "false", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "60", + "name": "Giant spider", + "examine": "I think this spider has been genetically modified.", + "lifepoints": "32", + "attack_level": "20", + "strength_level": "24", + "defence_level": "21", + "range_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "magic_animation": "5327", + "range_animation": "5327", + "weakness": "2", + "slayer_task": "76", + "slayer_exp": "33", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "61", + "name": "Spider", + "examine": "Incey wincey.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6249", + "defence_animation": "0", + "death_animation": "6251", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "76", + "slayer_exp": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "62", + "name": "Jungle spider", + "examine": "A barely visible deadly jungle spider.", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "37", + "defence_level": "35", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "poison_immune": "false", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "magic_animation": "5327", + "range_animation": "5327", + "weakness": "2", + "slayer_task": "76", + "slayer_exp": "50", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "63", + "name": "Deadly red spider", + "examine": "I think this spider has been genetically modified.", + "lifepoints": "35", + "attack_level": "30", + "strength_level": "25", + "defence_level": "30", + "range_level": "1", + "bonuses": "0,0,0,0,0,0,15,16,7,12,16,0,0,0,0", + "attack_speed": "4", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "magic_animation": "5327", + "range_animation": "5327", + "weakness": "2", + "slayer_task": "76", + "slayer_exp": "35", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "64", + "name": "Ice spider", + "examine": "I think this spider has been genetically modified.", + "lifepoints": "65", + "attack_level": "50", + "strength_level": "55", + "defence_level": "43", + "range_level": "1", + "bonuses": "0,0,0,0,0,0,20,17,12,13,13,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "5327", + "defence_animation": "0", + "death_animation": "5329", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "76", + "slayer_exp": "65", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "65", + "name": "Leprechaun", + "examine": "A funny little man normally associated with rainbows.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": null + }, + { + "id": "66", + "name": "Gnome", + "examine": "Like a mini man!", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": null + }, + { + "id": "67", + "name": "Gnome", + "examine": "Like a mini man!", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": null + }, + { + "id": "68", + "name": "Gnome", + "examine": "Like a mini man!", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": null + }, + { + "id": "69", + "name": "Lizard man", + "examine": "A scaly reptilian creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": null + }, + { + "id": "71", + "name": "Orc", + "examine": "A hideous malformed elf.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": null + }, + { + "id": "72", + "name": "Troll", + "examine": "A hideously deformed creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": null + }, + { + "id": "73", + "name": "Zombie", + "examine": "Dead man walking.", + "lifepoints": "22", + "attack_level": "8", + "strength_level": "9", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "5567", + "defence_animation": "5568", + "death_animation": "5569", + "slayer_task": "93", + "slayer_exp": "22", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "74", + "name": "Zombie", + "examine": "Dead woman walking.", + "lifepoints": "24", + "attack_level": "13", + "strength_level": "13", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "30", + "attack_speed": "4", + "melee_animation": "5578", + "defence_animation": "5579", + "death_animation": "5580", + "magic_animation": "5578", + "range_animation": "5578", + "slayer_task": "93", + "slayer_exp": "24", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "75", + "name": "Zombie", + "examine": "The walking dead.", + "lifepoints": "30", + "attack_level": "19", + "strength_level": "21", + "defence_level": "16", + "range_level": "1", + "respawn_delay": "30", + "attack_speed": "4", + "melee_animation": "5578", + "defence_animation": "5579", + "death_animation": "5580", + "magic_animation": "5578", + "range_animation": "5578", + "slayer_task": "93", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "76", + "name": "Zombie", + "examine": "The walking dead.", + "lifepoints": "30", + "attack_level": "19", + "strength_level": "21", + "defence_level": "16", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "slayer_task": "93", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "77", + "name": "Summoned Zombie", + "examine": "The living dead.", + "lifepoints": "22", + "attack_level": "8", + "strength_level": "9", + "defence_level": "10", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "5568", + "defence_animation": "0", + "death_animation": "5569", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "93", + "slayer_exp": "22", + "safespot": null + }, + { + "id": "78", + "name": "Giant bat", + "examine": "An annoying flappy thing.", + "lifepoints": "32", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "magic_level": "1", + "attack_speed": "4", + "melee_animation": "4915", + "defence_animation": "4916", + "death_animation": "4917", + "magic_animation": "4915", + "range_animation": "4915", + "weakness": "4", + "slayer_task": "5", + "slayer_exp": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "79", + "name": "Death wing", + "examine": "A shadowy, barely visible flying entity from some evil place.", + "lifepoints": "80", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "1", + "magic_level": "1", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "4915", + "defence_animation": "0", + "death_animation": "4917", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "5", + "slayer_exp": "80", + "aggressive": "true", + "safespot": null + }, + { + "id": "80", + "name": "Camel", + "examine": "Oh, it's a camel.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "81", + "name": "Cow", + "examine": "Converts grass to beef.", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "5850", + "death_animation": "5851", + "magic_animation": "5849", + "range_animation": "5849", + "weakness": "8", + "slayer_task": "20", + "slayer_exp": "8", + "combat_audio": "369,371,370", + "safespot": null + }, + { + "id": "82", + "name": "Lesser demon", + "examine": "Lesser, but still pretty big.", + "lifepoints": "81", + "attack_level": "68", + "strength_level": "70", + "defence_level": "71", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0", + "respawn_delay": "20", + "attack_speed": "4", + "melee_animation": "4630", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "4630", + "range_animation": "4630", + "weakness": "4", + "slayer_task": "56", + "slayer_exp": "79", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "83", + "name": "Greater demon", + "examine": "Big, red, and incredibly evil.", + "lifepoints": "89", + "attack_level": "76", + "strength_level": "78", + "defence_level": "81", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0", + "respawn_delay": "32", + "attack_speed": "4", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "68", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "40", + "slayer_exp": "87", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "84", + "name": "Black demon", + "examine": "A big, scary, jet-black demon.", + "lifepoints": "157", + "attack_level": "145", + "strength_level": "148", + "defence_level": "152", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0", + "respawn_delay": "38", + "attack_speed": "4", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "8", + "slayer_exp": "157", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "85", + "name": "Golem", + "examine": "A creature made from clay.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": null + }, + { + "id": "86", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "5", + "attack_level": "2", + "strength_level": "3", + "defence_level": "2", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "4933", + "range_animation": "4933", + "weakness": "8", + "slayer_task": "67", + "slayer_exp": "5", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "87", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "10", + "attack_level": "6", + "strength_level": "5", + "defence_level": "2", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "slayer_exp": "10", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "88", + "name": "Dungeon rat", + "examine": "A dirty rat.", + "lifepoints": "12", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "4", + "defence_animation": "0", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "slayer_exp": "12", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "89", + "name": "Unicorn", + "examine": "Horse with a horn.", + "lifepoints": "19", + "attack_level": "11", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "magic_level": "1", + "respawn_delay": "32", + "attack_speed": "4", + "melee_animation": "6376", + "defence_animation": "6375", + "death_animation": "6377", + "magic_animation": "6376", + "range_animation": "6376", + "weakness": "3", + "combat_audio": "496,498,497", + "safespot": null + }, + { + "id": "90", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "29", + "attack_level": "15", + "strength_level": "18", + "defence_level": "17", + "range_level": "1", + "respawn_delay": "32", + "attack_speed": "4", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "weakness": "8", + "slayer_task": "75", + "slayer_exp": "29", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "91", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "24", + "attack_level": "17", + "strength_level": "17", + "defence_level": "17", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "weakness": "8", + "slayer_task": "75", + "slayer_exp": "24", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "92", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "17", + "attack_level": "24", + "strength_level": "24", + "defence_level": "24", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "weakness": "8", + "slayer_task": "75", + "slayer_exp": "17", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "93", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "59", + "attack_level": "32", + "strength_level": "35", + "defence_level": "36", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "weakness": "8", + "slayer_task": "75", + "slayer_exp": "59", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "94", + "name": "Skeleton Mage", + "examine": "An undead worker of dark magic.", + "lifepoints": "17", + "attack_level": "14", + "strength_level": "14", + "defence_level": "14", + "range_level": "1", + "magic_level": "18", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "5487", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "5523", + "weakness": "3", + "slayer_task": "75", + "slayer_exp": "17", + "combat_style": "2", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "95", + "name": "Wolf", + "examine": "Not man's best friend.", + "lifepoints": "69", + "attack_level": "50", + "strength_level": "55", + "defence_level": "52", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "6559", + "death_animation": "6558", + "slayer_task": "92", + "slayer_exp": "69", + "combat_audio": "481,491,490", + "safespot": null + }, + { + "id": "96", + "name": "White wolf", + "examine": "A vicious mountain wolf.", + "lifepoints": "34", + "attack_level": "20", + "strength_level": "16", + "defence_level": "22", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "weakness": "9", + "slayer_task": "92", + "slayer_exp": "34", + "aggressive": "true", + "safespot": null + }, + { + "id": "97", + "name": "White wolf", + "examine": "A vicious mountain wolf.", + "lifepoints": "44", + "attack_level": "30", + "strength_level": "31", + "defence_level": "32", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "weakness": "7", + "slayer_task": "92", + "slayer_exp": "44", + "aggressive": "true", + "safespot": null + }, + { + "id": "98", + "name": "Dog", + "examine": "Bow wow.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "99", + "name": "Guard dog", + "examine": "He doesn't seem pleased to see me.", + "lifepoints": "49", + "attack_level": "35", + "strength_level": "36", + "defence_level": "37", + "range_level": "1", + "respawn_delay": "15", + "attack_speed": "4", + "melee_animation": "6562", + "defence_animation": "6563", + "death_animation": "6564", + "magic_animation": "6562", + "range_animation": "6562", + "weakness": "7", + "slayer_task": "27", + "slayer_exp": "49", + "aggressive": "true", + "safespot": null + }, + { + "id": "100", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "101", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "3", + "strength_level": "2", + "defence_level": "3", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "102", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "16", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "103", + "name": "Ghost", + "examine": "Eeek a ghost!", + "lifepoints": "13", + "attack_level": "6", + "strength_level": "7", + "defence_level": "6", + "range_level": "1", + "magic_level": "18", + "bonuses": "2,2,2,2,2,2,2,2,2,2,2,2,90,2,2", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "5540", + "defence_animation": "5541", + "death_animation": "5542", + "magic_animation": "5540", + "range_animation": "5540", + "weakness": "5", + "slayer_task": "36", + "slayer_exp": "25", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "104", + "name": "Ghost", + "examine": "Eeek! A ghost!", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "18", + "range_level": "1", + "magic_level": "18", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "0", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "36", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "105", + "name": "Grizzly bear", + "examine": "Eek! A bear!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4925", + "defence_animation": "0", + "death_animation": "4929", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "6", + "slayer_exp": "27", + "aggressive": "true", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "106", + "name": "Black bear", + "examine": "Eek! A bear!", + "lifepoints": "24", + "attack_level": "17", + "strength_level": "17", + "defence_level": "17", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4925", + "defence_animation": "0", + "death_animation": "4929", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "6", + "slayer_exp": "25", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "107", + "name": "Scorpion", + "lifepoints": "17", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6254", + "defence_animation": "6255", + "death_animation": "6256", + "slayer_exp": "17", + "aggressive": "true", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "108", + "name": "Poison Scorpion", + "examine": "It has a very vicious looking tail.", + "lifepoints": "17", + "attack_level": "1", + "strength_level": "1", + "defence_level": "35", + "range_level": "35", + "poison_amount": "3", + "respawn_delay": "60", + "melee_animation": "6254", + "defence_animation": "6255", + "death_animation": "6256", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "slayer_task": "71", + "poisonous": "true", + "aggressive": "true", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "109", + "name": "Pit Scorpion", + "examine": "Tiny", + "lifepoints": "57", + "attack_level": "1", + "strength_level": "1", + "defence_level": "40", + "range_level": "40", + "respawn_delay": "60", + "melee_animation": "6254", + "defence_animation": "6255", + "death_animation": "6256", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "slayer_task": "71", + "aggressive": "true", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "110", + "name": "Fire giant", + "examine": "A very large elemental adversary.", + "lifepoints": "111", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "4666", + "defence_animation": "4664", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "33", + "slayer_exp": "111", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "111", + "name": "Ice giant", + "examine": "He's got icicles in his beard.", + "lifepoints": "70", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4672", + "defence_animation": "0", + "death_animation": "4673", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "47", + "slayer_exp": "70", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "112", + "name": "Moss giant", + "examine": "His beard seems to have a life of its own.", + "lifepoints": "60", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4666", + "defence_animation": "4665", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "62", + "slayer_exp": "60", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "113", + "name": "Jogre", + "examine": "An aggressive humanoid.", + "lifepoints": "50", + "attack_level": "41", + "strength_level": "1", + "defence_level": "41", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "128", + "defence_animation": "129", + "death_animation": "131", + "magic_animation": "128", + "range_animation": "128", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "114", + "name": "Mogre", + "examine": "Big, ugly, and smelly.", + "lifepoints": "60", + "attack_level": "27", + "strength_level": "27", + "defence_level": "27", + "range_level": "27", + "magic_level": "27", + "bonuses": "15,15,10,20,40,15,50,50,50,20,50,58,0,0,0", + "respawn_delay": "25", + "attack_speed": "6", + "melee_animation": "359", + "defence_animation": "360", + "death_animation": "361", + "magic_animation": "359", + "range_animation": "359", + "aggressive": "true", + "safespot": null + }, + { + "id": "115", + "name": "Ogre", + "examine": "Big, ugly, and smelly.", + "lifepoints": "60", + "attack_level": "27", + "strength_level": "27", + "defence_level": "27", + "range_level": "27", + "magic_level": "27", + "bonuses": "15,15,10,20,40,15,50,50,50,20,50,58,0,0,0", + "respawn_delay": "25", + "attack_speed": "6", + "melee_animation": "359", + "defence_animation": "360", + "death_animation": "361", + "magic_animation": "359", + "range_animation": "359", + "aggressive": "true", + "safespot": null + }, + { + "id": "116", + "name": "Cyclops", + "examine": "Big, ugly, and smelly.", + "lifepoints": "75", + "attack_level": "65", + "strength_level": "65", + "defence_level": "35", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "359", + "defence_animation": "360", + "death_animation": "361", + "magic_animation": "359", + "range_animation": "359", + "weakness": "8", + "slayer_task": "44", + "slayer_exp": "75", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "117", + "name": "Hill Giant", + "examine": "A very large foe.", + "lifepoints": "35", + "attack_level": "18", + "strength_level": "22", + "defence_level": "26", + "range_level": "1", + "magic_level": "1", + "bonuses": "18,18,18,0,0,0,0,0,0,0,0,16,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "4652", + "range_animation": "4652", + "weakness": "6", + "slayer_task": "44", + "slayer_exp": "35", + "aggressive": "true", + "safespot": null + }, + { + "id": "118", + "name": "Dwarf", + "examine": "A short angry guy.", + "lifepoints": "10", + "attack_level": "7", + "strength_level": "7", + "defence_level": "7", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "119", + "name": "Chaos dwarf", + "examine": "A dwarf gone bad.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "aggressive": "true", + "safespot": null + }, + { + "id": "120", + "name": "Dwarf", + "examine": "A mountain dwelling short angry guy.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "121", + "name": "Dwarf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "122", + "name": "Hobgoblin", + "examine": "An ugly smelly creature.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "3", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "164", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "164", + "range_animation": "164", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "123", + "name": "Hobgoblin", + "examine": "An ugly smelly creature.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "164", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "164", + "range_animation": "164", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "124", + "name": "Earth warrior", + "examine": "A strange", + "lifepoints": "54", + "attack_level": "56", + "strength_level": "56", + "defence_level": "56", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "393", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "30", + "slayer_exp": "54", + "aggressive": "true", + "safespot": null + }, + { + "id": "125", + "name": "Ice warrior", + "examine": "A cold-hearted elemental warrior.", + "lifepoints": "59", + "attack_level": "39", + "strength_level": "39", + "defence_level": "39", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "451", + "defence_animation": "404", + "death_animation": "843", + "magic_animation": "451", + "range_animation": "451", + "weakness": "9", + "slayer_task": "48", + "slayer_exp": "59", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "126", + "name": "Otherworldly being", + "examine": "Looks pretty otherworldly to me!", + "lifepoints": "64", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "1", + "magic_level": "45", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "65", + "safespot": null + }, + { + "id": "127", + "name": "Magic axe", + "examine": "A magic axe with a mind of its own.", + "lifepoints": "75", + "attack_level": "53", + "strength_level": "53", + "defence_level": "53", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "185", + "defence_animation": "0", + "death_animation": "188", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "128", + "name": "Snake", + "examine": "A slithering serpent.", + "lifepoints": "5", + "attack_level": "4", + "strength_level": "4", + "defence_level": "4", + "range_level": "1", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "275", + "defence_animation": "0", + "death_animation": "278", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "131", + "name": "Penguin", + "examine": "An inhabitant of icy regions.", + "lifepoints": "8", + "attack_level": "6", + "strength_level": "6", + "defence_level": "6", + "range_level": "1", + "melee_animation": "5669", + "defence_animation": "0", + "death_animation": "5671", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "7", + "safespot": null + }, + { + "id": "132", + "name": "Monkey", + "examine": "Perhaps our oldest relatives?", + "lifepoints": "8", + "attack_level": "6", + "strength_level": "6", + "defence_level": "6", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "220", + "defence_animation": "0", + "death_animation": "223", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "61", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "133", + "name": "Black unicorn", + "examine": "A unicorn with a blackened heart.", + "lifepoints": "28", + "attack_level": "15", + "strength_level": "10", + "defence_level": "15", + "range_level": "1", + "magic_level": "24", + "attack_speed": "5", + "melee_animation": "6376", + "defence_animation": "6375", + "death_animation": "6377", + "magic_animation": "6376", + "range_animation": "6376", + "weakness": "3", + "combat_audio": "496,498,497", + "safespot": null + }, + { + "id": "134", + "name": "Poison spider", + "examine": "I think this spider has been magically modified.", + "lifepoints": "64", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "poison_amount": "6", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5327", + "defence_animation": "0", + "death_animation": "5329", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "76", + "poisonous": "true", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "137", + "name": "Terrorchick gnome", + "examine": "Aaw", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "138", + "name": "Terrorbird", + "examine": "A giant raptor.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1010", + "defence_animation": "0", + "death_animation": "1013", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "7", + "safespot": null + }, + { + "id": "139", + "name": "Terrorbird", + "lifepoints": "34", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1010", + "defence_animation": "1012", + "death_animation": "1013", + "safespot": null + }, + { + "id": "140", + "name": "Souless", + "examine": "A servant to Iban.", + "lifepoints": "47", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "338", + "defence_animation": "0", + "death_animation": "340", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "141", + "name": "Big Wolf", + "examine": "Must be the pack leader.", + "lifepoints": "44", + "attack_level": "31", + "strength_level": "31", + "defence_level": "31", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6559", + "defence_animation": "0", + "death_animation": "6558", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "92", + "slayer_exp": "74", + "aggressive": "true", + "safespot": null + }, + { + "id": "142", + "name": "Wolf", + "lifepoints": "69", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "6559", + "death_animation": "6558", + "slayer_exp": "34", + "combat_audio": "481,491,490", + "safespot": null + }, + { + "id": "143", + "name": "Jungle Wolf", + "examine": "A rare jungle wolf - specific to the Kharazi jungle.", + "lifepoints": "90", + "attack_level": "63", + "strength_level": "63", + "defence_level": "63", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6559", + "defence_animation": "0", + "death_animation": "6558", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "92", + "slayer_exp": "69", + "aggressive": "true", + "safespot": null + }, + { + "id": "144", + "name": "King Scorpion", + "examine": "Wow! Scorpions shouldn't grow that big.", + "lifepoints": "40", + "attack_level": "21", + "strength_level": "21", + "defence_level": "28", + "range_level": "28", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6254", + "defence_animation": "0", + "death_animation": "6256", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "71", + "slayer_exp": "17", + "aggressive": "true", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "145", + "name": "Ice warrior", + "examine": "A cold-hearted elemental warrior.", + "lifepoints": "59", + "attack_level": "39", + "strength_level": "1", + "defence_level": "39", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "451", + "defence_animation": "404", + "death_animation": "843", + "magic_animation": "451", + "range_animation": "451", + "slayer_exp": "59", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "146", + "name": "Gull", + "examine": "A sea bird.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "safespot": null + }, + { + "id": "147", + "name": "Cormorant", + "examine": "A sea bird.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "safespot": null + }, + { + "id": "148", + "name": "Pelican", + "examine": "A sea bird.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "safespot": null + }, + { + "id": "153", + "name": "Butterfly", + "examine": "These look much better in the wild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "154", + "name": "Butterfly", + "examine": "I love butterflies.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "158", + "name": "Shadow warrior", + "examine": "A fighter from the supernatural world. He's a shadow of his former self.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "394", + "defence_animation": "0", + "death_animation": "843", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "74", + "aggressive": "true", + "safespot": null + }, + { + "id": "159", + "name": "Gnome child", + "examine": "Small", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "191", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "160", + "name": "Gnome child", + "examine": "Seems to crawl the caves.", + "lifepoints": "21", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "bonuses": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "attack_speed": "5", + "melee_animation": "266", + "defence_animation": "267", + "death_animation": "265", + "magic_animation": "266", + "range_animation": "266", + "weakness": "9", + "safespot": null + }, + { + "id": "161", + "name": "Gnome child", + "examine": "Small", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "191", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "162", + "name": "Gnome trainer", + "examine": "He can advise on training.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "163", + "name": "Gnome guard", + "examine": "A tree gnome guard.", + "lifepoints": "54", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "melee_animation": "1218", + "defence_animation": "0", + "death_animation": "1224", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "164", + "name": "Gnome guard", + "examine": "A tree gnome guard.", + "lifepoints": "54", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "melee_animation": "192", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "168", + "name": "Gnome woman", + "examine": "A female gnome.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "191", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "combat_style": "1", + "safespot": null + }, + { + "id": "169", + "name": "Gnome woman", + "examine": "A female gnome.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "191", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "combat_style": "1", + "safespot": null + }, + { + "id": "170", + "name": "Man", + "examine": "One of RuneScape's many citizens", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "172", + "name": "Dark wizard", + "examine": "A practicer of dark arts.", + "lifepoints": "24", + "attack_level": "1", + "strength_level": "1", + "defence_level": "27", + "range_level": "1", + "magic_level": "27", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "711", + "range_animation": "0", + "prj_height": "3", + "weakness": "4", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "173", + "name": "Invrigar the Necromancer", + "examine": "An evil user of Magic powers", + "lifepoints": "42", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "safespot": null + }, + { + "id": "174", + "name": "Dark wizard", + "examine": "He works evil magic.", + "lifepoints": "12", + "attack_level": "1", + "strength_level": "1", + "defence_level": "24", + "range_level": "1", + "magic_level": "24", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "711", + "range_animation": "0", + "weakness": "4", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "175", + "name": "Mugger", + "examine": "He jumps out and attacks people.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "agg_radius": "2", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "176", + "name": "Witch", + "examine": "The hat's a dead give away.", + "lifepoints": "31", + "attack_level": "1", + "strength_level": "1", + "defence_level": "22", + "range_level": "1", + "magic_level": "22", + "melee_animation": "423", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "safespot": null + }, + { + "id": "178", + "name": "Black Knight", + "examine": "A dark-hearted knight.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "179", + "name": "Black Knight", + "lifepoints": "42", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "390", + "defence_animation": "388", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "180", + "name": "Highwayman", + "examine": "He holds up passers by.", + "lifepoints": "13", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "799", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "799", + "range_animation": "799", + "weakness": "7", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "181", + "name": "Chaos druid", + "examine": "A crazy, evil druid.", + "lifepoints": "20", + "attack_level": "20", + "strength_level": "20", + "defence_level": "10", + "range_level": "10", + "magic_level": "20", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "start_gfx": "105", + "projectile": "106", + "end_gfx": "107", + "weakness": "3", + "aggressive": "true", + "safespot": null + }, + { + "id": "182", + "name": "Pirate", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "183", + "name": "Pirate", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "184", + "name": "Pirate", + "lifepoints": "23", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "185", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "186", + "name": "Thug", + "examine": "Low on brains", + "lifepoints": "20", + "attack_level": "14", + "strength_level": "14", + "defence_level": "14", + "range_level": "1", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "safespot": null + }, + { + "id": "187", + "name": "Rogue", + "examine": "Rogueish.", + "lifepoints": "10", + "attack_level": "7", + "strength_level": "7", + "defence_level": "7", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "188", + "name": "Monk of Zamorak", + "examine": "An evil human cleric.", + "lifepoints": "44", + "attack_level": "1", + "strength_level": "1", + "defence_level": "31", + "range_level": "1", + "magic_level": "31", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "189", + "name": "Monk of Zamorak", + "examine": "An evil human cleric.", + "lifepoints": "47", + "attack_level": "1", + "strength_level": "1", + "defence_level": "33", + "range_level": "1", + "magic_level": "33", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "190", + "name": "Monk of Zamorak", + "examine": "An evil human cleric.", + "lifepoints": "55", + "attack_level": "1", + "strength_level": "1", + "defence_level": "39", + "range_level": "1", + "magic_level": "39", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "191", + "name": "Tribesman", + "examine": "A primitive warrior.", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "1", + "poison_amount": "11", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "poisonous": "true", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "192", + "name": "Dark warrior", + "examine": "A warrior of Darkness.", + "lifepoints": "10", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "bonuses": "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "451", + "defence_animation": "388", + "death_animation": "9055", + "weakness": "8", + "safespot": null + }, + { + "id": "193", + "name": "Chaos druid warrior", + "examine": "A crazy evil druid.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "194", + "name": "Necromancer", + "examine": "A crazy evil necromancer.", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "28", + "range_level": "1", + "magic_level": "28", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "safespot": null + }, + { + "id": "196", + "name": "Guard Bandit", + "examine": "Bandit Camp guard.", + "lifepoints": "28", + "attack_level": "1", + "strength_level": "1", + "defence_level": "20", + "range_level": "20", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "safespot": null + }, + { + "id": "198", + "name": "Guildmaster", + "examine": "Master of the Champions' Guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "199", + "name": "Gunthor the Brave", + "examine": "A mighty warrior!", + "lifepoints": "41", + "attack_level": "29", + "strength_level": "29", + "defence_level": "29", + "range_level": "1", + "melee_animation": "395", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "201", + "name": "Jailer", + "examine": "Guards prisoners for the black knights.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "202", + "name": "Black Heather", + "examine": "Has a fearsome scowl.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8" + }, + { + "id": "1631", + "name": "Rockslug", + "examine": "A rocky slug.", + "lifepoints": "30", + "attack_level": "24", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "attack_speed": "5", + "melee_animation": "1595", + "defence_animation": "1596", + "death_animation": "1597", + "magic_animation": "1595", + "range_animation": "1595", + "weakness": "7", + "slayer_task": "69", + "clue_level": "2", + "safespot": null + }, + { + "id": "1632", + "name": "Rockslug", + "examine": "A rocky slug.", + "lifepoints": "30", + "attack_level": "24", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "attack_speed": "5", + "melee_animation": "1595", + "defence_animation": "1596", + "death_animation": "1597", + "magic_animation": "1595", + "range_animation": "1595", + "weakness": "7", + "slayer_task": "69", + "clue_level": "2", + "safespot": null + }, + { + "id": "203", + "name": "Donny the Lad", + "examine": "Has a fearsome posture.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "204", + "name": "Speedy Keith", + "examine": "Nice hair.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "205", + "name": "Salarin the Twisted", + "examine": "A crazy evil druid.", + "lifepoints": "70", + "attack_level": "58", + "strength_level": "58", + "defence_level": "62", + "range_level": "1", + "bonuses": "45,50,43,55,39,31,19,28,33,22,22,15,13,9,8", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "206", + "name": "Guard", + "examine": "A dwarven guard.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "aggressive": "true", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "208", + "name": "Captain Lawgof", + "examine": "The head honcho around here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "210", + "name": "Grail Maiden", + "examine": "She looks serene.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "212", + "name": "King Percival", + "examine": "A former Knight of the Round Table.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "214", + "name": "Peasant", + "examine": "He looks unhappy...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "216", + "name": "High Priest", + "examine": "High Priest of Entrana.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "219", + "name": "Fisherman", + "examine": "It's a fisherman.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "220", + "name": "The Fisher King", + "examine": "He doesn't look very well...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "221", + "name": "Black Knight Titan", + "examine": "He looks mean and powerful.", + "lifepoints": "142", + "attack_level": "91", + "strength_level": "100", + "defence_level": "91", + "range_level": "1", + "magic_level": "1", + "bonuses": "27,27,27,0,0,18,27,18,1000,1000,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "7", + "melee_animation": "128", + "defence_animation": "0", + "death_animation": "131", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "222", + "name": "Monk", + "examine": "A holy man.", + "lifepoints": "14", + "attack_level": "7", + "strength_level": "7", + "defence_level": "10", + "range_level": "1", + "magic_level": "10", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "223", + "name": "Brother Kojo", + "examine": "A peaceful monk.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "224", + "name": "Dungeon rat", + "examine": "A dirty rat.", + "lifepoints": "11", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "0", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "230", + "name": "Grandpa Jack", + "examine": "He looks elderly.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "231", + "name": "Forester", + "examine": "He likes to cut down trees.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "233", + "name": "Fishing spot", + "examine": "I can fish here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "237", + "name": "Renegade Knight", + "examine": "He isn't very friendly.", + "lifepoints": "42", + "attack_level": "15", + "strength_level": "15", + "defence_level": "15", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6489", + "defence_animation": "0", + "death_animation": "6490", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "238", + "name": "Thrantax the Mighty", + "examine": "A terrifying spirit.", + "lifepoints": "142", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5540", + "defence_animation": "0", + "death_animation": "5542", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "246", + "name": "Teapotspout", + "examine": "Specialist meat transporter.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "2301", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "247", + "name": "Sir Mordred", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6489", + "defence_animation": "6488", + "death_animation": "6490", + "safespot": null + }, + { + "id": "251", + "name": "King Arthur", + "examine": "Legendary King of the Britons.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "253", + "name": "Khazard Guard", + "examine": "He's guarding the door.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "254", + "name": "Khazard Guard", + "examine": "He's been guarding the tavern for a bit too long.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "255", + "name": "Khazard Guard", + "examine": "His armour indicates he's a Khazard Guard.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "395", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "256", + "name": "Khazard Guard", + "examine": "His armour indicates he's a Khazard Guard.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "395", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "262", + "name": "Fightslave", + "examine": "A slave fighter. He looks mistreated and weak.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "269", + "name": "Bouncer", + "lifepoints": "116", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6581", + "defence_animation": "6578", + "death_animation": "6576", + "aggressive": "true", + "safespot": null + }, + { + "id": "270", + "name": "Khazard Ogre", + "examine": "Khazard's strongest ogre warrior.", + "lifepoints": "65", + "attack_level": "46", + "strength_level": "46", + "defence_level": "46", + "range_level": "1", + "melee_animation": "2100", + "defence_animation": "0", + "death_animation": "8576", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "271", + "name": "Khazard Scorpion", + "examine": "A large", + "lifepoints": "51", + "attack_level": "27", + "strength_level": "27", + "defence_level": "36", + "range_level": "36", + "melee_animation": "6254", + "defence_animation": "0", + "death_animation": "6256", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "aggressive": "true", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "274", + "name": "Guardian of Armadyl", + "examine": "A guard who has devoted their life to Armadyl.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "275", + "name": "Guardian of Armadyl", + "examine": "A guard who has devoted their life to Armadyl.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "277", + "name": "Fire Warrior of Lesarkus", + "examine": "Intimidating!", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "safespot": null + }, + { + "id": "278", + "name": "Cook", + "examine": "Lumbridge Castle's head cook.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "279", + "name": "Brother Omad", + "examine": "An old monk.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "280", + "name": "Brother Cedric", + "examine": "An old drunk monk.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "281", + "name": "Monk", + "examine": "An Ardougne Monk.", + "lifepoints": "5", + "attack_level": "4", + "strength_level": "4", + "defence_level": "4", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "282", + "name": "Thief", + "examine": "A dastardly blanket thief.", + "lifepoints": "21", + "attack_level": "15", + "strength_level": "15", + "defence_level": "15", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "283", + "name": "Head Thief", + "examine": "The head of the treacherous blanket stealing gang.", + "lifepoints": "25", + "attack_level": "18", + "strength_level": "18", + "defence_level": "18", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "284", + "name": "Doric", + "examine": "A dwarf smith. Quite handy with a hammer.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "285", + "name": "Veronica", + "examine": "She doesn't look too happy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "288", + "name": "Chicken", + "examine": "Yep. Definitely a chicken.", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "6", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "5387", + "range_animation": "5387", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "289", + "name": "Councillor Halgrive", + "examine": "An official of Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "290", + "name": "Doctor Orbon", + "examine": "A serious-looking doctor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "291", + "name": "Farmer Brumty", + "examine": "A farmer who's seen happier times.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "296", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7218", + "defence_animation": "0", + "death_animation": "7219", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "297", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7218", + "defence_animation": "0", + "death_animation": "7220", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "298", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7218", + "defence_animation": "0", + "death_animation": "7219", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "299", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "583", + "defence_animation": "0", + "death_animation": "7213", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "308", + "name": "Master fisher", + "examine": "The man in charge of the fishing guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "338", + "name": "Chancy", + "examine": "He's ready for a bet.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "339", + "name": "Chancy", + "examine": "He's ready for a bet.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "340", + "name": "Hops", + "examine": "He's drunk.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "341", + "name": "Hops", + "examine": "He's drunk.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "342", + "name": "Guidor's wife", + "examine": "She looks rather concerned.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "344", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "345", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "346", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "347", + "name": "Mourner", + "examine": "A mourner", + "lifepoints": "34", + "attack_level": "24", + "strength_level": "24", + "defence_level": "24", + "range_level": "1", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "348", + "name": "Mourner", + "examine": "A mourner", + "lifepoints": "34", + "attack_level": "24", + "strength_level": "24", + "defence_level": "24", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "351", + "name": "Man", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "352", + "name": "Woman", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "353", + "name": "Woman", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "354", + "name": "Woman", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "355", + "name": "Child", + "examine": "A child of West Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "358", + "name": "Priest", + "examine": "A holy man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "359", + "name": "Man", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "360", + "name": "Woman", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "361", + "name": "Woman", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "100", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "362", + "name": "Woman", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "363", + "name": "Woman", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "100", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "364", + "name": "King Lathas", + "examine": "King Lathas of East Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "365", + "name": "Paladin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "367", + "name": "Chemist", + "examine": "Smells very chemically...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "368", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "369", + "name": "Mourner", + "examine": "A mourner", + "lifepoints": "34", + "attack_level": "24", + "strength_level": "24", + "defence_level": "24", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "373", + "name": "Nurse Sarah", + "examine": "She's quite a looker!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "374", + "name": "Ogre", + "examine": "Big, ugly, and smelly.", + "lifepoints": "60", + "attack_level": "27", + "strength_level": "27", + "defence_level": "27", + "range_level": "27", + "magic_level": "27", + "bonuses": "15,15,10,20,40,15,50,50,50,20,50,58,0,0,0", + "respawn_delay": "25", + "attack_speed": "6", + "melee_animation": "359", + "defence_animation": "360", + "death_animation": "361", + "magic_animation": "359", + "range_animation": "359", + "weakness": "8", + "slayer_task": "64", + "aggressive": "true", + "safespot": null + }, + { + "id": "375", + "name": "Redbeard Frank", + "examine": "A pirate.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "380", + "name": "Customs officer", + "examine": "Inspects people's packages.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "382", + "name": "Dwarf", + "examine": "A dwarf who looks after the mining guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "384", + "name": "Barbarian guard", + "examine": "Not very civilised looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "385", + "name": "Kharid Scorpion", + "examine": "Looks vicious!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "386", + "name": "Kharid Scorpion", + "examine": "Looks vicious!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "387", + "name": "Kharid Scorpion", + "examine": "Looks vicious!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "388", + "name": "Seer", + "examine": "Could do with a shave...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "25", + "safespot": null + }, + { + "id": "390", + "name": "Big fish", + "examine": "A brightly coloured game bird.", + "lifepoints": "1", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "melee_animation": "2371", + "defence_animation": "0", + "death_animation": "2373", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "392", + "name": "River troll", + "examine": "A brightly coloured game bird.", + "lifepoints": "50", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "melee_animation": "2371", + "defence_animation": "0", + "death_animation": "2373", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "397", + "name": "Cow", + "examine": "Beefy.", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "5850", + "death_animation": "5851", + "magic_animation": "5849", + "range_animation": "5849", + "weakness": "8", + "slayer_task": "20", + "slayer_exp": "8", + "combat_audio": "369,371,370", + "safespot": null + }, + { + "id": "398", + "name": "Legends guard", + "examine": "A Legends Guild guard; he protects the entrance to the Legends Guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "401", + "name": "Jungle forester", + "examine": "He deals in exotic types of wood.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "402", + "name": "Jungle forester", + "examine": "She deals in exotic types of wood.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "411", + "name": "Swarm", + "examine": "Insects buzzing around.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "412", + "name": "Bat", + "examine": "Examine not added", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "2", + "range_level": "1", + "magic_level": "10", + "respawn_delay": "30", + "attack_speed": "5", + "death_animation": "4918", + "weakness": "4", + "slayer_task": "5", + "slayer_exp": "8", + "safespot": null + }, + { + "id": "419", + "name": "Zombie", + "examine": "Dead man walking.", + "lifepoints": "14", + "attack_level": "5", + "strength_level": "5", + "defence_level": "20", + "range_level": "5", + "magic_level": "5", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5578", + "range_animation": "5578", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "420", + "name": "Zombie", + "examine": "Dead man walking.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "40", + "range_level": "10", + "magic_level": "10", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5578", + "range_animation": "5578", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "421", + "name": "Zombie", + "examine": "Dead man walking.", + "lifepoints": "30", + "attack_level": "15", + "strength_level": "15", + "defence_level": "50", + "range_level": "15", + "magic_level": "15", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5578", + "range_animation": "5578", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "422", + "name": "Zombie", + "examine": "Dead man walking.", + "lifepoints": "79", + "attack_level": "45", + "strength_level": "45", + "defence_level": "60", + "range_level": "45", + "magic_level": "45", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5578", + "range_animation": "5578", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "423", + "name": "Zombie", + "examine": "Dead man walking.", + "lifepoints": "120", + "attack_level": "45", + "strength_level": "45", + "defence_level": "70", + "range_level": "45", + "magic_level": "35", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5578", + "range_animation": "5578", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "424", + "name": "Zombie", + "examine": "Dead man walking.", + "lifepoints": "159", + "attack_level": "45", + "strength_level": "45", + "defence_level": "90", + "range_level": "45", + "magic_level": "45", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5578", + "range_animation": "5578", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "425", + "name": "Shade", + "examine": "Dead but not gone.", + "lifepoints": "8", + "attack_level": "6", + "strength_level": "6", + "defence_level": "7", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "426", + "name": "Shade", + "examine": "Dead but not gone.", + "lifepoints": "17", + "attack_level": "20", + "strength_level": "20", + "defence_level": "30", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "427", + "name": "Shade", + "examine": "Dead but not gone.", + "lifepoints": "28", + "attack_level": "43", + "strength_level": "43", + "defence_level": "45", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "428", + "name": "Shade", + "examine": "Dead but not gone.", + "lifepoints": "42", + "attack_level": "74", + "strength_level": "74", + "defence_level": "80", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "429", + "name": "Shade", + "examine": "Dead but not gone.", + "lifepoints": "71", + "attack_level": "90", + "strength_level": "90", + "defence_level": "90", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "430", + "name": "Shade", + "examine": "Dead but not gone.", + "lifepoints": "100", + "attack_level": "150", + "strength_level": "150", + "defence_level": "105", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "435", + "name": "Fallen Man", + "examine": "I hope he's not dead!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "437", + "name": "Cap'n Izzy No-Beard", + "examine": "Entrance clerk for the Brimhaven Agility Arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "438", + "name": "Tree spirit", + "examine": "A very angry nymph.", + "lifepoints": "50", + "attack_level": "17", + "strength_level": "17", + "defence_level": "17", + "range_level": "1", + "magic_level": "1", + "attack_speed": "4", + "melee_animation": "94", + "defence_animation": "95", + "death_animation": "97", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "439", + "name": "Tree spirit", + "examine": "A very angry nymph.", + "lifepoints": "55", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "magic_level": "1", + "attack_speed": "4", + "melee_animation": "94", + "defence_animation": "95", + "death_animation": "97", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "440", + "name": "Tree spirit", + "examine": "A very angry nymph.", + "lifepoints": "60", + "attack_level": "48", + "strength_level": "48", + "defence_level": "48", + "range_level": "1", + "magic_level": "1", + "attack_speed": "4", + "melee_animation": "94", + "defence_animation": "95", + "death_animation": "97", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "441", + "name": "Tree spirit", + "examine": "A very angry nymph.", + "lifepoints": "86", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "attack_speed": "4", + "melee_animation": "94", + "defence_animation": "95", + "death_animation": "97", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "442", + "name": "Tree spirit", + "examine": "A very angry nymph.", + "lifepoints": "120", + "attack_level": "100", + "strength_level": "100", + "defence_level": "100", + "range_level": "1", + "magic_level": "1", + "attack_speed": "4", + "melee_animation": "94", + "defence_animation": "95", + "death_animation": "97", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "443", + "name": "Tree spirit", + "examine": "A very angry nymph.", + "lifepoints": "170", + "attack_level": "130", + "strength_level": "130", + "defence_level": "130", + "range_level": "1", + "magic_level": "1", + "attack_speed": "4", + "melee_animation": "94", + "defence_animation": "95", + "death_animation": "97", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "444", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "445", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "446", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "5", + "attack_level": "5", + "strength_level": "5", + "defence_level": "2", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "447", + "name": "Jail guard", + "examine": "I wonder who he's guarding?", + "lifepoints": "32", + "attack_level": "19", + "strength_level": "23", + "defence_level": "21", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "448", + "name": "Jail guard", + "examine": "I wonder who he's guarding?", + "lifepoints": "32", + "attack_level": "19", + "strength_level": "23", + "defence_level": "21", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "449", + "name": "Jail guard", + "examine": "I wonder who he's guarding?", + "lifepoints": "32", + "attack_level": "19", + "strength_level": "23", + "defence_level": "21", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "452", + "name": "Seth Groats", + "examine": "A large well built farmer.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "453", + "name": "Suit of armour", + "examine": "Aargh! It's alive!", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "456", + "name": "Father Aereck", + "examine": "He seems to be very devout.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "457", + "name": "Restless ghost", + "examine": "Eek! A ghost!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "458", + "name": "Father Urhney", + "examine": "Very holy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "459", + "name": "Skeleton", + "examine": "It rattles when it moves.", + "lifepoints": "14", + "attack_level": "3", + "strength_level": "3", + "defence_level": "5", + "range_level": "1", + "magic_level": "5", + "respawn_delay": "60", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "weakness": "3", + "slayer_task": "75", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "460", + "name": "Wizard Frumscone", + "examine": "A Wizard of the Magic Guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "461", + "name": "Magic Store owner", + "examine": "A Supplier of Magical items.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "462", + "name": "Wizard Distentor", + "examine": "Head of the Magic Guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "469", + "name": "King Bolren", + "examine": "It's a gnome. He looks important.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "470", + "name": "Commander Montai", + "examine": "It's a tree gnome.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "475", + "name": "Khazard trooper", + "examine": "It's one of General Khazard's warriors.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "476", + "name": "Khazard trooper", + "examine": "An open eye of World-gorger.", + "lifepoints": "11", + "attack_level": "1", + "strength_level": "1", + "defence_level": "5", + "range_level": "1", + "magic_level": "5", + "defence_animation": "0", + "magic_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "477", + "name": "Khazard warlord", + "examine": "He looks real nasty", + "lifepoints": "54", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "478", + "name": "Khazard commander", + "examine": "It's one of General Khazard's commanders.", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "479", + "name": "Gnome troop", + "examine": "It's a tree gnome trooper.", + "lifepoints": "45", + "attack_level": "24", + "strength_level": "24", + "defence_level": "32", + "range_level": "32", + "melee_animation": "190", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "safespot": null + }, + { + "id": "481", + "name": "Tracker gnome 1", + "examine": "It's a gnome who specialises in covert operations.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "482", + "name": "Tracker gnome 2", + "examine": "It's a gnome who specialises in covert operations.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "483", + "name": "Tracker gnome 3", + "examine": "It's a gnome who specialises in covert operations.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "485", + "name": "Local Gnome", + "examine": "It's a young tree gnome.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "487", + "name": "Giant", + "examine": "I guess he wants to be more than just the muscle.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "489", + "name": "Goblin guard", + "examine": "He doesn't look like he'd trust his own mother.", + "lifepoints": "28", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "melee_animation": "6199", + "defence_animation": "0", + "death_animation": "6190", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "490", + "name": "Mummy", + "examine": "If the mummy is at school", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "491", + "name": "Ghost", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5540", + "defence_animation": "5541", + "death_animation": "5542", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "492", + "name": "Spirit of Scorpius", + "examine": "The essence of evil.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "493", + "name": "Grave scorpion", + "examine": "A vicious", + "lifepoints": "10", + "attack_level": "5", + "strength_level": "5", + "defence_level": "7", + "range_level": "7", + "respawn_delay": "60", + "melee_animation": "6261", + "defence_animation": "0", + "death_animation": "6260", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "71", + "aggressive": "true", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "494", + "name": "Banker", + "examine": "He can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "495", + "name": "Banker", + "examine": "Good with money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "498", + "name": "Banker", + "examine": "Manages money momentarily.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "499", + "name": "Banker", + "examine": "He can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "502", + "name": "Undead one", + "examine": "A minion of Rashiliyia.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "safespot": null + }, + { + "id": "503", + "name": "Undead one", + "examine": "A minion of Rashiliyia.", + "lifepoints": "47", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "safespot": null + }, + { + "id": "504", + "name": "Undead one", + "examine": "The animated dead; one of Rashiliyia's minions.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "0", + "death_animation": "5569", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "505", + "name": "Undead one", + "examine": "The animated dead; one of Rashiliyia's minions.", + "lifepoints": "47", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5571", + "defence_animation": "0", + "death_animation": "5575", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "507", + "name": "Nazastarool", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "aggressive": "true", + "safespot": null + }, + { + "id": "508", + "name": "Nazastarool", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5507", + "defence_animation": "5508", + "death_animation": "5509", + "aggressive": "true", + "safespot": null + }, + { + "id": "509", + "name": "Nazastarool", + "lifepoints": "110", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "aggressive": "true", + "safespot": null + }, + { + "id": "518", + "name": "Captain Shanks", + "examine": "He's the Captain of the 'Lady of the Waves'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "519", + "name": "Bob", + "examine": "An expert on axes.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "520", + "name": "Shopkeeper", + "examine": "Sells stuff.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "521", + "name": "Shop assistant", + "examine": "Helps sell stuff.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "522", + "name": "Shopkeeper", + "examine": "Likes people spending money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "523", + "name": "Shop assistant", + "examine": "Likes helping sell stuff.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "524", + "name": "Shopkeeper", + "examine": "A product of a consumerist society.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "525", + "name": "Shop assistant", + "examine": "Likes you more", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "526", + "name": "Shopkeeper", + "examine": "A product of a consumerist society.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "527", + "name": "Shop assistant", + "examine": "Likes you more", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "530", + "name": "Shopkeeper", + "examine": "Has an interesting assortment of items for sale.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "531", + "name": "Shop assistant", + "examine": "Works on commission.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "532", + "name": "Shopkeeper", + "examine": "Like a grave keeper", + "lifepoints": "285", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "534", + "name": "Fairy shopkeeper", + "examine": "Sells stuff.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "535", + "name": "Fairy shop assistant", + "examine": "Sells stuff.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "539", + "name": "Silk trader", + "examine": "Very snappily dressed.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "540", + "name": "Gem trader", + "examine": "Makes his money selling rocks.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "542", + "name": "Louie Legs", + "examine": "For the finest in armoured legware.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "551", + "name": "Shopkeeper", + "examine": "Ironically", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "552", + "name": "Shop assistant", + "examine": "Helps the shopkeeper sell swords.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "554", + "name": "Fancy-dress shop owner", + "examine": "For the interesting clothing items you just can't find elsewhere.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "555", + "name": "Shopkeeper", + "examine": "Has a fine moustache.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "561", + "name": "Shopkeeper", + "examine": "Could stand to lose a few pounds.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "562", + "name": "Candle-maker", + "examine": "Has an odd smell about him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "567", + "name": "Fairy", + "examine": "Looks strange and mysterious.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "569", + "name": "Silver merchant", + "examine": "Looks fairly well fed.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "570", + "name": "Gem merchant", + "examine": "Seems very well-off.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "571", + "name": "Baker", + "examine": "So where are the butcher and the candlestick-maker?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "572", + "name": "Spice seller", + "examine": "Has a very exotic aroma about him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "573", + "name": "Fur trader", + "examine": "Knows how to keep warm in the winter.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "574", + "name": "Silk merchant", + "examine": "Seems very well-off.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "579", + "name": "Drogo dwarf", + "examine": "He runs a Mining store.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "582", + "name": "Dwarf", + "examine": "I wonder if he wants to buy my junk?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "595", + "name": "Tea seller", + "examine": "He seems to sell tea.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "596", + "name": "Fat Tony", + "examine": "A pizza expert; in both making and eating.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "598", + "name": "Hairdresser", + "examine": "Anyone fancy a trim?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "599", + "name": "Make-over Mage", + "examine": "Master of the mystical make-over.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "606", + "name": "Squire", + "examine": "Indentured servant of a Knight.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "609", + "name": "Fortress Guard", + "examine": "A generic evil henchman.", + "lifepoints": "37", + "attack_level": "26", + "strength_level": "26", + "defence_level": "26", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "610", + "name": "Black Knight Captain", + "examine": "One of the Black Knights.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "611", + "name": "Witch", + "examine": "The Black Knights' resident witch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "613", + "name": "Digsite workman", + "examine": "This person is working on the site.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "614", + "name": "Doug Deeping", + "examine": "This person is working on the site.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "617", + "name": "Student", + "examine": "A student busy studying the digsite.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "618", + "name": "Examiner", + "examine": "Upon examining the examiner you examine it is indeed an examiner!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "619", + "name": "Archaeological expert", + "examine": "An expert on archaeology.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "620", + "name": "Panning guide", + "examine": "A specialist in panning for gold.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "621", + "name": "Gnome baller", + "examine": "A professional gnome baller.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "633", + "name": "Gnome winger", + "examine": "A professional gnome baller.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "635", + "name": "Gnome ball referee", + "examine": "Keeps the game fair.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "638", + "name": "Apothecary", + "examine": "A dealer in potions.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "640", + "name": "Father Lawrence", + "examine": "A religious man... And occasional drunk.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "641", + "name": "Charlie the Tramp", + "examine": "Looks down on his luck.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "643", + "name": "Weaponsmaster", + "examine": "Looks kind of obsessive...", + "lifepoints": "42", + "attack_level": "15", + "strength_level": "15", + "defence_level": "15", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "645", + "name": "Jonny the beard", + "examine": "Looks kind of shifty...", + "lifepoints": "2", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "646", + "name": "Curator Haig Halen", + "examine": "Curator of the museum.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "648", + "name": "King Roald", + "examine": "Varrock's resident monarch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "649", + "name": "Archer", + "examine": "She looks quite experienced.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "650", + "name": "Warrior", + "examine": "He looks big and dumb.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "651", + "name": "Monk", + "examine": "He looks holy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "652", + "name": "Wizard", + "examine": "He looks kind of puny...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "prj_height": "3", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "655", + "name": "Tree spirit", + "examine": "Guardian of the dramen tree.", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "0", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "656", + "name": "Cave monk", + "examine": "Unsurprisingly monk like.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "657", + "name": "Monk of Entrana", + "examine": "Holy looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "658", + "name": "Monk of Entrana", + "examine": "Holy looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "659", + "name": "Party Pete", + "examine": "He likes to paaaarty!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "660", + "name": "Knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "663", + "name": "Man", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "665", + "name": "Boot", + "examine": "A short and angry dwarf.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "667", + "name": "Chronozon", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "aggressive": "true", + "safespot": null + }, + { + "id": "670", + "name": "King Narnode Shareen", + "examine": "An important looking gnome.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "674", + "name": "Foreman", + "examine": "The boss!", + "lifepoints": "28", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "677", + "name": "Black demon", + "examine": "A big, scary, jet-black demon.", + "lifepoints": "165", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "45,40,40,150,150,80,150,20,150,68,0,0,0,0,0", + "respawn_delay": "38", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "64", + "range_animation": "64", + "weakness": "7", + "slayer_task": "8", + "slayer_exp": "157", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "678", + "name": "Guard", + "examine": "Keeps order in the ranging guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "679", + "name": "Ranging Guild Doorman", + "examine": "The keeper of the gates to the ranging guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "680", + "name": "Leatherworker", + "examine": "An expert leatherworker.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "681", + "name": "Held vampyre juvinate", + "examine": "Mysterious swamp lights...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "682", + "name": "Armour salesman", + "examine": "Supplier of Rangers armour.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "683", + "name": "Bow and Arrow salesman", + "examine": "Supplier of Archery equipment.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "684", + "name": "Tower Advisor", + "examine": "Tower keeper and competition judge.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "688", + "name": "Tower Archer", + "examine": "Defender of the north tower.", + "lifepoints": "14", + "attack_level": "7", + "strength_level": "7", + "defence_level": "10", + "range_level": "10", + "respawn_delay": "60", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "689", + "name": "Tower Archer", + "examine": "Defender of the east tower.", + "lifepoints": "28", + "attack_level": "15", + "strength_level": "15", + "defence_level": "20", + "range_level": "20", + "respawn_delay": "60", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "690", + "name": "Tower Archer", + "examine": "Defender of the south tower.", + "lifepoints": "42", + "attack_level": "22", + "strength_level": "22", + "defence_level": "30", + "range_level": "30", + "respawn_delay": "60", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "691", + "name": "Tower Archer", + "examine": "Defender of the west tower.", + "lifepoints": "57", + "attack_level": "30", + "strength_level": "30", + "defence_level": "40", + "range_level": "40", + "respawn_delay": "60", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "692", + "name": "Tribal Weapon Salesman", + "examine": "Supplier of authentic throwing weapons.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "694", + "name": "Ticket Merchant", + "examine": "Sells equipment in exchange for archery tickets.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "705", + "name": "Melee tutor", + "examine": "Harlan, ready to teach swordplay.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "706", + "name": "Wizard Mizgog", + "examine": "An old wizard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "708", + "name": "Imp", + "examine": "A cheeky little imp.", + "lifepoints": "8", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "169", + "defence_animation": "170", + "death_animation": "172", + "magic_animation": "169", + "range_animation": "169", + "weakness": "7", + "combat_audio": "534,536,535", + "safespot": null + }, + { + "id": "709", + "name": "Imp", + "examine": "A cheeky little imp.", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "169", + "defence_animation": "170", + "death_animation": "172", + "magic_animation": "169", + "range_animation": "169", + "combat_audio": "534,536,535", + "safespot": null + }, + { + "id": "713", + "name": "Clerk", + "examine": "A bureaucratic administrator.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "714", + "name": "Edmond", + "examine": "It's an NPC.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "716", + "name": "Head mourner", + "examine": "In charge of people with silly outfits.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "720", + "name": "Recruiter", + "examine": "A member of the Ardougne Royal Army.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "726", + "name": "Man", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "727", + "name": "Man", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "728", + "name": "Man", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "729", + "name": "Man", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "730", + "name": "Man", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "731", + "name": "Bartender", + "examine": "I could get a beer from him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "732", + "name": "Bartender", + "examine": "I could get a beer from him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "735", + "name": "Bartender", + "examine": "I could get a beer from him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "737", + "name": "Bartender", + "examine": "I could get a beer from him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "738", + "name": "Bartender", + "examine": "I could get a beer from him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "739", + "name": "Bartender", + "examine": "I could get a beer from him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "741", + "name": "Duke Horacio", + "examine": "Duke Horacio of Lumbridge.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "742", + "name": "Elvarg", + "examine": "Roar! A dragon!", + "lifepoints": "80", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "bonuses": "0,0,0,0,0,20,40,40,30,20,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "agg_radius": "64", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "4642", + "aggressive": "true", + "safespot": null + }, + { + "id": "745", + "name": "Wormbrain", + "examine": "A badly-behaved goblin.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "6184", + "defence_animation": "0", + "death_animation": "6204", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "38", + "safespot": null + }, + { + "id": "749", + "name": "Angry barbarian spirit", + "examine": "He looks a tad upset.", + "lifepoints": "108", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6726", + "defence_animation": "0", + "death_animation": "6727", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "750", + "name": "Enraged barbarian spirit", + "examine": "He looks a tad upset.", + "lifepoints": "108", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6726", + "defence_animation": "0", + "death_animation": "6727", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "751", + "name": "Berserk barbarian spirit", + "examine": "He looks a tad upset.", + "lifepoints": "108", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6726", + "defence_animation": "0", + "death_animation": "6727", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "752", + "name": "Ferocious barbarian spirit", + "examine": "He looks a tad upset.", + "lifepoints": "190", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "80,100,60,70,85,70,70,90,60,100,50,90,90,0,0", + "respawn_delay": "60", + "melee_animation": "6726", + "defence_animation": "0", + "death_animation": "6727", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "753", + "name": "Melzar the Mad", + "examine": "He looks totally insane!", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "28", + "magic_level": "28", + "respawn_delay": "60", + "melee_animation": "423", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "757", + "name": "Count Draynor", + "examine": "Stop looking and run!", + "lifepoints": "4", + "attack_level": "20", + "strength_level": "1", + "defence_level": "20", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "aggressive": "true", + "safespot": null + }, + { + "id": "758", + "name": "Fred the Farmer", + "examine": "A well-fed farmer.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "767", + "name": "Crate", + "lifepoints": "88", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "192", + "defence_animation": "194", + "death_animation": "196", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "778", + "name": "Overgrown cat", + "lifepoints": "66", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "safespot": null + }, + { + "id": "785", + "name": "Civilian", + "examine": "A citizen of Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "786", + "name": "Civilian", + "examine": "A citizen of Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "787", + "name": "Civilian", + "examine": "A citizen of Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "790", + "name": "Letham", + "examine": "A gnome who's supposed to be cleaning up a mess.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "793", + "name": "Alfonse the waiter", + "examine": "Smartly dressed", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "794", + "name": "Charlie the cook", + "examine": "Distinctly cook-like.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "795", + "name": "Ice Queen", + "examine": "A cold hearted lady.", + "lifepoints": "157", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "798", + "name": "Velrak the explorer", + "examine": "He looks cold and hungry.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "799", + "name": "Pirate Guard", + "examine": "A morally ambiguous guard.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "800", + "name": "Fishing spot", + "examine": "It looks like there might be eels swimming in the lava.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "801", + "name": "Abbot Langley", + "examine": "A holy man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "802", + "name": "Brother Jered", + "examine": "A holy man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "803", + "name": "Monk", + "examine": "A holy man.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "804", + "name": "Tanner", + "examine": "Manufacturer of fine leathers.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "805", + "name": "Master Crafter", + "examine": "He's in charge of the Crafting Guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "806", + "name": "Donovan the Family Handyman", + "examine": "He looks very tired...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "812", + "name": "Guard", + "examine": "An officer of the Law.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "813", + "name": "Gossip", + "examine": "One of those people who love to gossip!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "820", + "name": "Poison Salesman", + "examine": "He sure likes to sell stuff!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "821", + "name": "Sinclair Guard dog", + "examine": "Big", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "825", + "name": "Male slave", + "examine": "It looks like he's been here a long time.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "827", + "name": "Rowdy slave", + "examine": "He looks a bit aggressive.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "830", + "name": "Mercenary Captain", + "examine": "He looks a bit aggressive.", + "lifepoints": "28", + "attack_level": "1", + "strength_level": "1", + "defence_level": "20", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "831", + "name": "Captain Siad", + "examine": "He's in control of the whole mining camp.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "833", + "name": "Bedabin Nomad", + "examine": "A Bedabin nomad", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "834", + "name": "Bedabin Nomad Guard", + "examine": "A Bedabin nomad guard - it looks like he's protecting an area.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "837", + "name": "Shantay Guard", + "examine": "He patrols the Shantay Pass.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "838", + "name": "Shantay Guard", + "examine": "He patrols the Shantay Pass.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "839", + "name": "Desert Wolf", + "examine": "A vicious desert wolf.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "melee_animation": "6559", + "defence_animation": "0", + "death_animation": "6558", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "92", + "safespot": null + }, + { + "id": "840", + "name": "Ugthanki", + "lifepoints": "46", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "death_animation": "9674", + "aggressive": "true", + "safespot": null + }, + { + "id": "841", + "name": "Mine cart driver", + "examine": "He looks busy attending to his cart.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "842", + "name": "Rowdy Guard", + "examine": "This pickaxe has been possessed by a dwarf ancestor spirit.", + "lifepoints": "400", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "185", + "defence_animation": "0", + "death_animation": "188", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "843", + "name": "RPDT employee", + "examine": "Inefficient looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "847", + "name": "Head chef", + "examine": "Despite his name", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "850", + "name": "Aluft Gianne snr.", + "examine": "The famous tree gnome chef.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "851", + "name": "Gnome Waiter", + "examine": "He can serve you gnome food.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "852", + "name": "Ogre chieftain", + "examine": "Tough-looking.", + "lifepoints": "331", + "attack_level": "58", + "strength_level": "58", + "defence_level": "58", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "64", + "safespot": null + }, + { + "id": "856", + "name": "Gorad", + "lifepoints": "81", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "safespot": null + }, + { + "id": "858", + "name": "Ogre guard", + "examine": "These ogres protect the city.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "64", + "safespot": null + }, + { + "id": "859", + "name": "Ogre guard", + "examine": "An ogre that guards.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "64", + "safespot": null + }, + { + "id": "862", + "name": "City guard", + "examine": "Tries to keep the peace.", + "lifepoints": "331", + "attack_level": "58", + "strength_level": "58", + "defence_level": "58", + "range_level": "1", + "melee_animation": "2100", + "defence_animation": "0", + "death_animation": "8576", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "64", + "safespot": null + }, + { + "id": "863", + "name": "Scared skavid", + "examine": "Frightened-looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "864", + "name": "Mad skavid", + "examine": "Looks mad.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "870", + "name": "Enclave guard", + "examine": "Big and ugly looking.", + "lifepoints": "331", + "attack_level": "58", + "strength_level": "58", + "defence_level": "58", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2100", + "defence_animation": "0", + "death_animation": "8576", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "64", + "safespot": null + }, + { + "id": "872", + "name": "Watchtower Wizard", + "examine": "The hat is a dead giveaway.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "873", + "name": "Ogre trader", + "examine": "Funnily enough", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "64", + "safespot": null + }, + { + "id": "874", + "name": "Ogre merchant", + "examine": "Funnily enough", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "64", + "safespot": null + }, + { + "id": "875", + "name": "Ogre trader", + "examine": "Funnily enough", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "64", + "safespot": null + }, + { + "id": "877", + "name": "Tower guard", + "examine": "Tries to keep the peace.", + "lifepoints": "97", + "attack_level": "17", + "strength_level": "17", + "defence_level": "17", + "range_level": "1", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "878", + "name": "Colonel Radick", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "879", + "name": "Delrith", + "lifepoints": "7", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "safespot": null + }, + { + "id": "884", + "name": "Captain Rovin", + "examine": "The head of the palace guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "885", + "name": "Ceril Carnillean", + "examine": "Head of the Carnillean household.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "887", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "893", + "name": "Clivet", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "811", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "894", + "name": "Hazeel Cultist", + "examine": "A member of the Hazeel cult.", + "lifepoints": "28", + "attack_level": "15", + "strength_level": "15", + "defence_level": "20", + "range_level": "1", + "magic_level": "20", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "895", + "name": "Boy", + "examine": "Children are just like real people...just smaller.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "897", + "name": "Witch's experiment", + "examine": "Looks unnatural.", + "lifepoints": "68", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "1", + "melee_animation": "255", + "defence_animation": "0", + "death_animation": "258", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "898", + "name": "Witch's experiment (second form)", + "examine": "Looks unnatural.", + "lifepoints": "97", + "attack_level": "17", + "strength_level": "17", + "defence_level": "17", + "range_level": "1", + "melee_animation": "5327", + "defence_animation": "0", + "death_animation": "5329", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "899", + "name": "Witch's experiment (third form)", + "examine": "Looks unnatural.", + "lifepoints": "154", + "attack_level": "27", + "strength_level": "27", + "defence_level": "27", + "range_level": "1", + "melee_animation": "4925", + "defence_animation": "0", + "death_animation": "4929", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "900", + "name": "Witch's experiment (fourth form)", + "examine": "Looks unnatural.", + "lifepoints": "200", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "melee_animation": "6559", + "defence_animation": "0", + "death_animation": "6558", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "904", + "name": "Chamber guardian", + "examine": "He hasn't seen much sun lately.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "905", + "name": "Kolodion", + "examine": "Runs the Mage Arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "907", + "name": "Kolodion", + "examine": "He's a shape-shifter", + "lifepoints": "3", + "attack_level": "42", + "strength_level": "1", + "defence_level": "20", + "range_level": "1", + "magic_level": "75", + "melee_animation": "811", + "defence_animation": "404", + "death_animation": "1816", + "slayer_exp": "0", + "combat_style": "2", + "safespot": null + }, + { + "id": "908", + "name": "Kolodion", + "examine": "He's a shape-shifter", + "lifepoints": "93", + "attack_level": "74", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "magic_level": "89", + "melee_animation": "132", + "defence_animation": "404", + "death_animation": "133", + "slayer_exp": "0", + "combat_style": "2", + "safespot": null + }, + { + "id": "909", + "name": "Kolodion", + "examine": "He's a shape-shifter", + "lifepoints": "93", + "attack_level": "74", + "strength_level": "1", + "defence_level": "28", + "range_level": "1", + "magic_level": "89", + "melee_animation": "5322", + "defence_animation": "5320", + "death_animation": "5323", + "slayer_exp": "0", + "combat_style": "2", + "safespot": null + }, + { + "id": "910", + "name": "Kolodion", + "examine": "He's a shape-shifter", + "lifepoints": "93", + "attack_level": "74", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "89", + "melee_animation": "811", + "defence_animation": "404", + "death_animation": "714", + "slayer_exp": "0", + "combat_style": "2", + "safespot": null + }, + { + "id": "911", + "name": "Kolodion", + "examine": "He's a shape-shifter", + "lifepoints": "112", + "attack_level": "85", + "strength_level": "1", + "defence_level": "35", + "range_level": "1", + "magic_level": "90", + "melee_animation": "69", + "defence_animation": "65", + "death_animation": "68", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "912", + "name": "Battle mage", + "examine": "He kills in the name of Zamorak.", + "lifepoints": "78", + "attack_level": "41", + "strength_level": "41", + "defence_level": "55", + "range_level": "1", + "magic_level": "55", + "respawn_delay": "60", + "melee_animation": "811", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "913", + "name": "Battle mage", + "examine": "He kills in the name of Saradomin.", + "lifepoints": "78", + "attack_level": "41", + "strength_level": "41", + "defence_level": "55", + "range_level": "1", + "magic_level": "55", + "respawn_delay": "60", + "melee_animation": "811", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_exp": "0", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "914", + "name": "Battle mage", + "examine": "He kills in the name of Guthix.", + "lifepoints": "78", + "attack_level": "41", + "strength_level": "41", + "defence_level": "55", + "range_level": "1", + "magic_level": "55", + "respawn_delay": "60", + "melee_animation": "197", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_exp": "0", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "916", + "name": "Joe", + "examine": "A crafter at the pinnacle of his art.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "917", + "name": "Jail guard", + "examine": "I wonder who he's guarding?", + "lifepoints": "32", + "attack_level": "19", + "strength_level": "23", + "defence_level": "21", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "923", + "name": "Hassan", + "examine": "The emir's chief advisor and physician.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "925", + "name": "Border Guard", + "examine": "Guards the border between Al Kharid and the Kingdom of Misthalin.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "931", + "name": "Jungle savage", + "examine": "An aggressive native of the Kharazi Jungle.", + "lifepoints": "62", + "attack_level": "44", + "strength_level": "44", + "defence_level": "44", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "934", + "name": "Nezikchened", + "lifepoints": "150", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "aggressive": "true", + "safespot": null + }, + { + "id": "938", + "name": "Ranalph Devere", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "aggressive": "true", + "safespot": null + }, + { + "id": "939", + "name": "Boulder", + "examine": "I wonder what this is doing here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "941", + "name": "Green dragon", + "examine": "Must be related to Elvarg.", + "lifepoints": "75", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "magic_level": "68", + "bonuses": "0,0,0,0,0,20,40,40,30,20,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "41", + "slayer_exp": "75", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "942", + "name": "Master chef", + "examine": "An expert on all things culinary.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "943", + "name": "Survival expert", + "examine": "Very much an outdoors type.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "944", + "name": "Combat instructor", + "examine": "An expert on all forms of combat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "945", + "name": "RuneScape guide", + "examine": "Your introduction to the world of RuneScape.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "946", + "name": "Magic instructor", + "examine": "A master of Magic.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "947", + "name": "Financial advisor", + "examine": "An official representative from the First National Bank of RuneScape.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "948", + "name": "Mining instructor", + "examine": "An expert on Mining-related skills.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "949", + "name": "Quest guide", + "examine": "Your introduction to the world of RuneScape.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "950", + "name": "Giant rat", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "951", + "name": "Chicken", + "examine": "Yep. Definitely a chicken.", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "6", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "5387", + "range_animation": "5387", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "954", + "name": "Brother Brace", + "examine": "A holy man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "955", + "name": "Cow", + "examine": "Converts grass to beef.", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "5850", + "death_animation": "5851", + "magic_animation": "5849", + "range_animation": "5849", + "weakness": "8", + "slayer_task": "20", + "slayer_exp": "8", + "combat_audio": "369,371,370", + "safespot": null + }, + { + "id": "956", + "name": "Drunken Dwarf", + "examine": "He's had a fair bit to drink...", + "lifepoints": "10", + "attack_level": "5", + "strength_level": "5", + "defence_level": "1", + "range_level": "6", + "magic_level": "20", + "attack_speed": "5", + "melee_animation": "99", + "defence_animation": "101", + "death_animation": "102", + "magic_animation": "99", + "range_animation": "99", + "start_gfx": "33", + "projectile": "33", + "slayer_exp": "0", + "combat_style": "1", + "prj_height": "45", + "safespot": null + }, + { + "id": "961", + "name": "Surgeon General Tafani", + "examine": "This doctor really knows her stuff.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "977", + "name": "Blessed spider", + "examine": "It's one of Iban's pets.", + "lifepoints": "42", + "attack_level": "22", + "strength_level": "22", + "defence_level": "30", + "range_level": "30", + "melee_animation": "5327", + "defence_animation": "0", + "death_animation": "5329", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "76", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "978", + "name": "Blessed giant rat", + "examine": "It's one of Iban's pet vermin.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "67", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "979", + "name": "Slave", + "examine": "A wretched slave of Iban.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "980", + "name": "Slave", + "examine": "A wretched slave of Iban.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "981", + "name": "Slave", + "examine": "A wretched slave of Iban.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "982", + "name": "Slave", + "examine": "A wretched slave of Iban.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "983", + "name": "Slave", + "examine": "A wretched slave of Iban.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "984", + "name": "Slave", + "examine": "A wretched slave of Iban.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "985", + "name": "Slave", + "examine": "A wretched slave of Iban.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "986", + "name": "Boulder", + "examine": "Precariously balanced...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "987", + "name": "Unicorn", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "496,498,497", + "safespot": null + }, + { + "id": "988", + "name": "Sir Jerro", + "lifepoints": "57", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "400", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "989", + "name": "Sir Carl", + "lifepoints": "57", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "400", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "990", + "name": "Sir Harry", + "lifepoints": "57", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "400", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "991", + "name": "Half-soulless", + "examine": "A creature empty of emotion.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "993", + "name": "Witch's cat", + "examine": "Curiosity is yet to kill this one...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "997", + "name": "Kalrag", + "examine": "A giant spider.", + "lifepoints": "91", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5319", + "defence_animation": "5320", + "death_animation": "5321", + "aggressive": "true", + "safespot": null + }, + { + "id": "998", + "name": "Othainian", + "examine": "One of the guardians of Iban.", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "aggressive": "true", + "safespot": null + }, + { + "id": "999", + "name": "Doomion", + "examine": "One of the guardians of Iban.", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "aggressive": "true", + "safespot": null + }, + { + "id": "1000", + "examine": "One of the guardians of Iban.", + "name": "Holthion", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "aggressive": "true", + "safespot": null + }, + { + "id": "1001", + "name": "Dark mage", + "examine": "A user of dark magic.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "1002", + "name": "Disciple of Iban", + "examine": "A dark magic user.", + "lifepoints": "45", + "attack_level": "24", + "strength_level": "24", + "defence_level": "32", + "range_level": "1", + "magic_level": "32", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "1004", + "name": "Spider", + "lifepoints": "2", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6249", + "defence_animation": "6250", + "death_animation": "6251", + "aggressive": "true", + "safespot": null + }, + { + "id": "1005", + "name": "Giant bat", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "8", + "safespot": null + }, + { + "id": "1007", + "name": "Zamorak wizard", + "examine": "A servant of Zamorak.", + "lifepoints": "73", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "magic_level": "60", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "811", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "811", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "aggressive": "true", + "spell_id": "43", + "safespot": null + }, + { + "id": "1009", + "name": "Poison spider", + "lifepoints": "64", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "poisonous": "true", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "1013", + "name": "Swamp toad", + "examine": "A green skinned croaker", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1015", + "name": "Iron pickaxe", + "examine": "Useful for hitting rocks.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "1017", + "name": "Chicken", + "examine": "Yep. Definitely a chicken.", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "6", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "5387", + "range_animation": "5387", + "weakness": "9", + "slayer_task": "7", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "1018", + "name": "Rooster", + "examine": "He rules the", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5387", + "defence_animation": "0", + "death_animation": "5389", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "7", + "safespot": null + }, + { + "id": "1019", + "name": "Fire elemental", + "examine": "A fire elemental.", + "lifepoints": "45", + "attack_level": "24", + "strength_level": "24", + "defence_level": "32", + "range_level": "1", + "magic_level": "32", + "respawn_delay": "60", + "melee_animation": "1029", + "defence_animation": "0", + "death_animation": "1031", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null, + "movement_radius": "4" + }, + { + "id": "1020", + "name": "Earth elemental", + "examine": "An earth elemental.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "melee_animation": "4868", + "defence_animation": "0", + "death_animation": "4870", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null, + "movement_radius": "4" + }, + { + "id": "1021", + "name": "Air elemental", + "examine": "An air elemental.", + "lifepoints": "45", + "attack_level": "24", + "strength_level": "24", + "defence_level": "32", + "range_level": "32", + "respawn_delay": "60", + "melee_animation": "1040", + "defence_animation": "0", + "death_animation": "1041", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "safespot": null, + "movement_radius": "4" + }, + { + "id": "1022", + "name": "Water elemental", + "examine": "A water elemental.", + "lifepoints": "45", + "attack_level": "24", + "strength_level": "24", + "defence_level": "32", + "range_level": "32", + "respawn_delay": "60", + "melee_animation": "1044", + "defence_animation": "0", + "death_animation": "1048", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "safespot": null, + "movement_radius": "4" + }, + { + "id": "1023", + "name": "Vampire", + "examine": "Could his name be 'Lurch'?", + "lifepoints": "50", + "attack_level": "52", + "strength_level": "1", + "defence_level": "52", + "range_level": "1", + "melee_animation": "7183", + "death_animation": "7185", + "slayer_exp": "50", + "clue_level": "1", + "safespot": null + }, + { + "id": "1044", + "name": "Monk of Zamorak", + "examine": "An evil human cleric.", + "lifepoints": "24", + "attack_level": "12", + "strength_level": "12", + "defence_level": "17", + "range_level": "1", + "magic_level": "17", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "aggressive": "true", + "safespot": null + }, + { + "id": "1045", + "name": "Monk of Zamorak", + "examine": "An evil human cleric.", + "lifepoints": "24", + "attack_level": "12", + "strength_level": "12", + "defence_level": "17", + "range_level": "1", + "magic_level": "17", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "aggressive": "true", + "safespot": null + }, + { + "id": "1046", + "name": "Monk of Zamorak", + "examine": "An evil human cleric.", + "lifepoints": "24", + "attack_level": "12", + "strength_level": "12", + "defence_level": "17", + "range_level": "1", + "magic_level": "17", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "aggressive": "true", + "safespot": null + }, + { + "id": "1052", + "name": "Ghast", + "examine": "Arrghhh... A Ghast.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "1053", + "name": "Ghast", + "examine": "Arrghhh... A Ghast.", + "lifepoints": "71", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "death_animation": "9467", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "1055", + "name": "Pirate Jackie the Fruit", + "examine": "Ticket trader for the Brimhaven Agility Arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "1057", + "name": "Strange watcher", + "examine": "A member of the audience.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1058", + "name": "Strange watcher", + "examine": "A member of the audience.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1059", + "name": "Strange watcher", + "examine": "A member of the audience.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1060", + "name": "Denulth", + "examine": "Commander of the Imperial Guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1061", + "name": "Sergeant", + "examine": "A sergeant of the Imperial Guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1063", + "name": "Soldier", + "examine": "A soldier of the Imperial Guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1064", + "name": "Soldier", + "examine": "A soldier of the Imperial Guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1065", + "name": "Soldier", + "examine": "A soldier of the Imperial Guard.", + "lifepoints": "55", + "attack_level": "44", + "strength_level": "44", + "defence_level": "44", + "range_level": "1", + "magic_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1066", + "name": "Soldier", + "examine": "A soldier of the Imperial Guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1067", + "name": "Soldier", + "examine": "A soldier of the Imperial Guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1068", + "name": "Soldier", + "examine": "A soldier of the Imperial Guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1069", + "name": "Soldier", + "examine": "A soldier of the Imperial Guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1073", + "name": "Archer", + "examine": "A Burthorpe Castle Archer.", + "lifepoints": "55", + "attack_level": "1", + "strength_level": "1", + "defence_level": "44", + "range_level": "44", + "magic_level": "1", + "bonuses": "54,68,75,72,67,81,54,35,35,0,0,0,0,0,0", + "respawn_delay": "12", + "melee_animation": "426", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "426", + "range_animation": "426", + "start_gfx": "19", + "projectile": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "1074", + "name": "Archer", + "examine": "A Burthorpe Castle Archer.", + "lifepoints": "55", + "attack_level": "1", + "strength_level": "1", + "defence_level": "44", + "range_level": "44", + "magic_level": "1", + "bonuses": "54,68,75,72,67,81,54,35,35,0,0,0,0,0,0", + "respawn_delay": "12", + "melee_animation": "426", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "426", + "range_animation": "426", + "start_gfx": "19", + "projectile": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "1076", + "name": "Guard", + "examine": "A Burthorpe Castle guard.", + "lifepoints": "44", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "magic_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1077", + "name": "Guard", + "examine": "A Burthorpe Castle guard.", + "lifepoints": "44", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "magic_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1081", + "name": "Servant", + "examine": "A servant for Prince Anlaf.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1085", + "name": "Ocga", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1086", + "name": "Man", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1087", + "name": "Penda", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1088", + "name": "Hygd", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1089", + "name": "Ceolburg", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1092", + "name": "White Knight", + "examine": "The knight seems to be watching something.", + "lifepoints": "38", + "attack_level": "27", + "strength_level": "27", + "defence_level": "27", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "8", + "melee_animation": "7042", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1095", + "name": "Rock", + "examine": "The biggest and baddest troll.", + "lifepoints": "90", + "attack_level": "63", + "strength_level": "63", + "defence_level": "63", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6523", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1096", + "name": "Stick", + "examine": "A big", + "lifepoints": "87", + "attack_level": "61", + "strength_level": "61", + "defence_level": "61", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1097", + "name": "Pee Hat", + "lifepoints": "126", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "safespot": null + }, + { + "id": "1098", + "name": "Kraka", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "1099", + "name": "Dung", + "examine": "Human is his speciality.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "1100", + "name": "Ash", + "examine": "Human is his speciality.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "1101", + "name": "Thrower Troll", + "examine": "Small for a troll, but mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "respawn_delay": "35", + "attack_speed": "7", + "agg_radius": "6", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1102", + "name": "Thrower Troll", + "examine": "Small for a troll, but mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "respawn_delay": "35", + "attack_speed": "7", + "agg_radius": "6", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1103", + "name": "Thrower Troll", + "examine": "Small for a troll, but mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "respawn_delay": "35", + "attack_speed": "7", + "agg_radius": "6", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1104", + "name": "Thrower Troll", + "examine": "Small for a troll, but mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "respawn_delay": "35", + "attack_speed": "7", + "agg_radius": "6", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1105", + "name": "Thrower Troll", + "examine": "Small for a troll, but mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "respawn_delay": "35", + "attack_speed": "7", + "agg_radius": "6", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1106", + "name": "Mountain troll", + "examine": "Small for a troll, but mean and ugly.", + "lifepoints": "90", + "attack_level": "53", + "strength_level": "20", + "defence_level": "53", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1107", + "name": "Mountain troll", + "examine": "Small for a troll, but mean and ugly.", + "lifepoints": "90", + "attack_level": "53", + "strength_level": "20", + "defence_level": "53", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1108", + "name": "Mountain troll", + "examine": "Small for a troll, but mean and ugly.", + "lifepoints": "90", + "attack_level": "53", + "strength_level": "20", + "defence_level": "53", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1109", + "name": "Mountain troll", + "examine": "Small for a troll, but mean and ugly.", + "lifepoints": "90", + "attack_level": "53", + "strength_level": "20", + "defence_level": "53", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1110", + "name": "Mountain troll", + "examine": "Small for a troll, but mean and ugly.", + "lifepoints": "90", + "attack_level": "53", + "strength_level": "20", + "defence_level": "53", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1111", + "name": "Mountain troll", + "examine": "Small for a troll, but mean and ugly.", + "lifepoints": "90", + "attack_level": "53", + "strength_level": "20", + "defence_level": "53", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1112", + "name": "Mountain troll", + "examine": "Small for a troll, but mean and ugly.", + "lifepoints": "90", + "attack_level": "53", + "strength_level": "20", + "defence_level": "53", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1115", + "name": "Troll general", + "examine": "One of the troll generals.", + "lifepoints": "92", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1116", + "name": "Troll general", + "examine": "One of the troll generals.", + "lifepoints": "92", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1117", + "name": "Troll general", + "examine": "One of the troll generals.", + "lifepoints": "92", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1118", + "name": "Troll spectator", + "examine": "He's watching the arena.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1119", + "name": "Troll spectator", + "examine": "He's watching the arena.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1120", + "name": "Troll spectator", + "examine": "He's watching the arena.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1121", + "name": "Troll spectator", + "examine": "He's watching the arena.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1122", + "name": "Troll spectator", + "examine": "He's watching the arena.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1123", + "name": "Troll spectator", + "examine": "He's watching the arena.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1124", + "name": "Troll spectator", + "examine": "He's watching the arena.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1125", + "name": "Dad", + "examine": "An unusually large troll.", + "lifepoints": "157", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1158", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1126", + "name": "Twig", + "examine": "He's guarding the cells.", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1127", + "name": "Berry", + "examine": "He's guarding the cells.", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1128", + "name": "Twig", + "examine": "He's guarding the cells.", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "melee_animation": "5821", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1129", + "name": "Berry", + "examine": "He's guarding the cells.", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1130", + "name": "Thrower troll", + "examine": "Small for a troll, but it's mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "7", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "start_gfx": "33", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "1131", + "name": "Thrower troll", + "examine": "Small for a troll, but it's mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "7", + "agg_radius": "6", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "start_gfx": "33", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "1132", + "name": "Thrower troll", + "examine": "Small for a troll, but it's mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "7", + "agg_radius": "6", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "start_gfx": "33", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "1133", + "name": "Thrower troll", + "examine": "Small for a troll, but it's mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "7", + "agg_radius": "6", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "start_gfx": "33", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "1134", + "name": "Thrower troll", + "examine": "Small for a troll, but it's mean, ugly and throws rocks.", + "lifepoints": "95", + "attack_level": "41", + "strength_level": "41", + "defence_level": "30", + "range_level": "40", + "bonuses": "30,60,40,40,50,70,50,0,0,0,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "7", + "agg_radius": "6", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "start_gfx": "33", + "projectile": "276", + "weakness": "0", + "slayer_task": "83", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "1135", + "name": "Cook", + "examine": "Human is his speciality.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1136", + "name": "Cook", + "examine": "Human is his speciality.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1137", + "name": "Cook", + "examine": "Human is his speciality.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1138", + "name": "Mountain troll", + "examine": "Small for a troll, but mean and ugly.", + "lifepoints": "90", + "attack_level": "53", + "strength_level": "20", + "defence_level": "53", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "284", + "defence_animation": "285", + "death_animation": "287", + "magic_animation": "284", + "range_animation": "284", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1139", + "name": "Mushroom", + "examine": "He's fast asleep.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1140", + "name": "Mountain goat", + "examine": "This beast doesn't need climbing boots.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1141", + "name": "Mountain goat", + "examine": "This beast doesn't need climbing boots.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1142", + "name": "Guard", + "examine": "He's guarding the storeroom.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1143", + "name": "Guard", + "examine": "He's guarding the storeroom.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1144", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1145", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1146", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1147", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1148", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1149", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1150", + "name": "Guard", + "examine": "He's guarding the goutweed.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1151", + "name": "Burntmeat", + "examine": "Human is his speciality.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1152", + "name": "Weird Old Man", + "examine": "What's he mumbling about?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1153", + "name": "Kalphite Worker", + "examine": "I don't think insect repellent will work...", + "lifepoints": "40", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "bonuses": "0,0,0,0,0,5,5,1,10,10,0,0,0,0,0", + "respawn_delay": "38", + "melee_animation": "6223", + "defence_animation": "6232", + "death_animation": "6230", + "magic_animation": "6223", + "range_animation": "6223", + "weakness": "7", + "slayer_task": "53", + "slayer_exp": "40", + "safespot": null + }, + { + "id": "1154", + "name": "Kalphite Soldier", + "examine": "I don't think insect repellent will work...", + "lifepoints": "90", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "1", + "bonuses": "0,0,0,0,0,25,25,5,50,50,0,0,0,0,0", + "respawn_delay": "60", + "melee_animation": "6224", + "defence_animation": "6227", + "death_animation": "6228", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "53", + "slayer_exp": "90", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "1155", + "name": "Kalphite Guardian", + "examine": "I don't think insect repellent will work...", + "lifepoints": "170", + "attack_level": "110", + "strength_level": "110", + "defence_level": "110", + "range_level": "1", + "bonuses": "0,0,0,0,0,25,25,5,50,50,0,0,0,0,0", + "respawn_delay": "65", + "attack_speed": "5", + "melee_animation": "6223", + "defence_animation": "6232", + "death_animation": "6230", + "magic_animation": "6223", + "range_animation": "6223", + "weakness": "7", + "slayer_task": "53", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "1156", + "name": "Kalphite Worker", + "examine": "I don't think insect repellent will work...", + "lifepoints": "40", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "bonuses": "0,0,0,0,0,5,5,1,10,10,0,0,0,0,0", + "respawn_delay": "38", + "melee_animation": "6223", + "defence_animation": "6232", + "death_animation": "6230", + "magic_animation": "6223", + "range_animation": "6223", + "weakness": "7", + "slayer_task": "53", + "slayer_exp": "40", + "safespot": null + }, + { + "id": "1157", + "name": "Kalphite Guardian", + "examine": "I don't think insect repellent will work...", + "lifepoints": "170", + "attack_level": "110", + "strength_level": "110", + "defence_level": "110", + "range_level": "1", + "bonuses": "0,0,0,0,0,25,25,5,50,50,0,0,0,0,0", + "respawn_delay": "65", + "attack_speed": "5", + "melee_animation": "6223", + "defence_animation": "6232", + "death_animation": "6230", + "magic_animation": "6223", + "range_animation": "6223", + "weakness": "7", + "slayer_task": "53", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "1158", + "name": "Kalphite Queen", + "examine": "I don't think insect repellent will work...", + "lifepoints": "255", + "attack_level": "300", + "strength_level": "300", + "defence_level": "300", + "range_level": "1", + "magic_level": "150", + "bonuses": "0,0,0,0,0,50,50,10,100,100,0,0,0,0,0", + "respawn_delay": "45", + "attack_speed": "4", + "agg_radius": "64", + "melee_animation": "6241", + "defence_animation": "6232", + "death_animation": "6242", + "magic_animation": "6241", + "range_animation": "6241", + "weakness": "10", + "slayer_task": "53", + "aggressive": "true", + "safespot": null + }, + { + "id": "1160", + "name": "Kalphite Queen", + "examine": "I don't think insect repellent will work...", + "lifepoints": "255", + "attack_level": "300", + "strength_level": "300", + "defence_level": "300", + "range_level": "1", + "magic_level": "150", + "bonuses": "0,0,0,0,0,100,100,100,10,10,0,0,0,0,0", + "respawn_delay": "0", + "attack_speed": "4", + "agg_radius": "64", + "melee_animation": "6235", + "defence_animation": "6234", + "death_animation": "6233", + "magic_animation": "6235", + "range_animation": "6235", + "weakness": "10", + "slayer_task": "53", + "aggressive": "true", + "safespot": null + }, + { + "id": "1161", + "name": "Kalphite Larva", + "examine": "I don't think insect repellent will work...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "53", + "aggressive": "true", + "safespot": null + }, + { + "id": "1172", + "name": "The Shaikahan", + "examine": "A huge beast", + "lifepoints": "100", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "313", + "defence_animation": "0", + "death_animation": "315", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "1183", + "name": "Elf warrior", + "examine": "He looks pretty handy with that bow.", + "lifepoints": "91", + "attack_level": "1", + "strength_level": "1", + "defence_level": "64", + "range_level": "72", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "start_gfx": "250", + "projectile": "249", + "weakness": "2", + "slayer_task": "31", + "combat_style": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "1184", + "name": "Elf warrior", + "examine": "I don't wanna be at the wrong end of that pike.", + "lifepoints": "85", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "31", + "clue_level": "2", + "safespot": null + }, + { + "id": "1185", + "name": "Elven city guard", + "examine": "An elven city guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1192", + "name": "Rabbit", + "examine": "A cute bunny rabbit.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6090", + "defence_animation": "0", + "death_animation": "6092", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1193", + "name": "Rabbit", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6090", + "defence_animation": "6091", + "death_animation": "6092", + "safespot": null + }, + { + "id": "1194", + "name": "Rabbit", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6090", + "defence_animation": "6091", + "death_animation": "6092", + "safespot": null + }, + { + "id": "1195", + "name": "Grizzly bear", + "examine": "It's an NPC.", + "lifepoints": "27", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4921", + "defence_animation": "4927", + "death_animation": "4929", + "slayer_exp": "0", + "aggressive": "true", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "1196", + "name": "Grizzly bear cub", + "examine": "Eek! A bear cub!", + "lifepoints": "30", + "attack_level": "21", + "strength_level": "21", + "defence_level": "21", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "6", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "1197", + "name": "Grizzly bear cub", + "lifepoints": "35", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "1198", + "name": "Dire Wolf", + "examine": "What big teeth you have.", + "lifepoints": "47", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "melee_animation": "6559", + "defence_animation": "0", + "death_animation": "6558", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "92", + "safespot": null + }, + { + "id": "1199", + "name": "Elf Tracker", + "examine": "An elf tracker.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1200", + "name": "Tyras guard", + "examine": "One of King Tyras's men.", + "lifepoints": "60", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "1201", + "name": "Elf warrior", + "examine": "I don't want to get on the wrong side of him.", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "426", + "defence_animation": "425", + "death_animation": "836", + "start_gfx": "250", + "projectile": "249", + "combat_style": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "1203", + "name": "Tyras guard", + "examine": "One of King Tyras's men.", + "lifepoints": "112", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1204", + "name": "Tyras guard", + "examine": "One of King Tyras's men.", + "lifepoints": "112", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1208", + "name": "Quartermaster", + "examine": "Responsible for the food and equipment of the troops.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1211", + "name": "Will o' the wisp", + "examine": "Mysterious swamp lights...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1216", + "name": "Parroty Pete", + "examine": "He seems strangely familiar...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1217", + "name": "Gardener", + "examine": "An old gardener.", + "lifepoints": "5", + "attack_level": "4", + "strength_level": "4", + "defence_level": "4", + "range_level": "1", + "melee_animation": "433", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "1218", + "name": "Ghoul", + "examine": "A scary, man eating ghoul.", + "lifepoints": "40", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "bonuses": "10,10,20,20,15,20,15,15,15,15,15,35,0,0,0", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "weakness": "9", + "slayer_task": "37", + "slayer_exp": "50", + "safespot": null + }, + { + "id": "1219", + "name": "Leech", + "examine": "Yuck! It's all slimy!", + "lifepoints": "60", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1273", + "defence_animation": "0", + "death_animation": "1272", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "1220", + "name": "Vampire", + "examine": "Could his name be 'Lurch'?", + "lifepoints": "50", + "attack_level": "52", + "strength_level": "1", + "defence_level": "52", + "range_level": "1", + "melee_animation": "7183", + "death_animation": "7185", + "slayer_exp": "50", + "clue_level": "1", + "safespot": null + }, + { + "id": "1223", + "name": "Vampire", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "40", + "clue_level": "1", + "safespot": null + }, + { + "id": "1225", + "name": "Vampire", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "1227", + "name": "Myre Blamish Snail", + "examine": "A marsh coloured blamish snail", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8143", + "defence_animation": "0", + "death_animation": "8144", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1228", + "name": "Blood Blamish Snail", + "examine": "A blood coloured blamish snail", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8143", + "defence_animation": "0", + "death_animation": "8144", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1229", + "name": "Ochre Blamish Snail", + "examine": "A muddy coloured blamish snail", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8143", + "defence_animation": "0", + "death_animation": "8144", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1230", + "name": "Bruise Blamish Snail", + "examine": "A bruise blue coloured blamish snail", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8143", + "defence_animation": "0", + "death_animation": "8144", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1231", + "name": "Bark Blamish Snail", + "examine": "A branch bark coloured blamish snail", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8143", + "defence_animation": "0", + "death_animation": "8144", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1232", + "name": "Myre Blamish Snail", + "examine": "A marsh coloured blamish snail", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8143", + "defence_animation": "0", + "death_animation": "8144", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1233", + "name": "Blood Blamish Snail", + "examine": "A blood coloured blamish snail", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8143", + "defence_animation": "0", + "death_animation": "8144", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1234", + "name": "Ochre Blamish Snail", + "examine": "A muddy coloured blamish snail", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8143", + "defence_animation": "0", + "death_animation": "8144", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1235", + "name": "Bruise Blamish Snail", + "examine": "A bruise blue coloured blamish snail", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8143", + "defence_animation": "0", + "death_animation": "8144", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1239", + "name": "Bedabin Nomad Fighter", + "examine": "A Bedabin nomad fighter - a sandy swordsman.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1240", + "name": "Loar Shadow", + "examine": "A shadowy sort of entity", + "lifepoints": "60", + "attack_level": "31", + "strength_level": "31", + "defence_level": "42", + "range_level": "1", + "magic_level": "42", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1241", + "name": "Loar Shade", + "examine": "The shadowy remains of a long departed soul.", + "lifepoints": "60", + "attack_level": "31", + "strength_level": "31", + "defence_level": "42", + "range_level": "1", + "magic_level": "42", + "respawn_delay": "60", + "melee_animation": "1283", + "defence_animation": "1284", + "death_animation": "1308", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1243", + "name": "Phrin Shadow", + "examine": "A shadowy sort of entity", + "lifepoints": "61", + "attack_level": "32", + "strength_level": "32", + "defence_level": "43", + "range_level": "1", + "magic_level": "43", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1244", + "name": "Phrin Shade", + "examine": "The shadowy remains of a long departed soul.", + "lifepoints": "61", + "attack_level": "32", + "strength_level": "32", + "defence_level": "43", + "range_level": "1", + "magic_level": "43", + "respawn_delay": "60", + "melee_animation": "1283", + "defence_animation": "0", + "death_animation": "1287", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1245", + "name": "Riyl Shadow", + "examine": "A shadowy sort of entity", + "lifepoints": "64", + "attack_level": "33", + "strength_level": "33", + "defence_level": "45", + "range_level": "1", + "magic_level": "45", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1246", + "name": "Riyl Shade", + "examine": "The shadowy remains of a long departed soul.", + "lifepoints": "64", + "attack_level": "33", + "strength_level": "33", + "defence_level": "45", + "range_level": "1", + "magic_level": "45", + "respawn_delay": "60", + "melee_animation": "1283", + "defence_animation": "0", + "death_animation": "1287", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1247", + "name": "Asyn Shadow", + "examine": "A shadowy sort of entity", + "lifepoints": "67", + "attack_level": "35", + "strength_level": "35", + "defence_level": "47", + "range_level": "1", + "magic_level": "47", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1248", + "name": "Asyn Shade", + "examine": "The shadowy remains of a long departed soul.", + "lifepoints": "67", + "attack_level": "35", + "strength_level": "35", + "defence_level": "47", + "range_level": "1", + "magic_level": "47", + "respawn_delay": "60", + "melee_animation": "1283", + "defence_animation": "0", + "death_animation": "1287", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1249", + "name": "Fiyr Shadow", + "examine": "A shadowy sort of entity", + "lifepoints": "70", + "attack_level": "36", + "strength_level": "36", + "defence_level": "49", + "range_level": "1", + "magic_level": "49", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1250", + "name": "Fiyr Shade", + "examine": "The shadowy remains of a long departed soul.", + "lifepoints": "70", + "attack_level": "36", + "strength_level": "36", + "defence_level": "49", + "range_level": "1", + "magic_level": "49", + "respawn_delay": "60", + "melee_animation": "1283", + "defence_animation": "0", + "death_animation": "1287", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "1257", + "name": "Afflicted", + "examine": "A local villager of Mort'ton.", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "1258", + "name": "Afflicted", + "examine": "A local villager of Mort'ton.", + "lifepoints": "62", + "attack_level": "44", + "strength_level": "44", + "defence_level": "44", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "1261", + "name": "Afflicted", + "examine": "A local villager of Mort'ton.", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "1262", + "name": "Afflicted", + "examine": "A local villager of Mort'ton.", + "lifepoints": "65", + "attack_level": "46", + "strength_level": "46", + "defence_level": "46", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "1263", + "name": "Wizard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1264", + "name": "Saradomin wizard", + "examine": "A follower of Saradomin.", + "lifepoints": "120", + "attack_level": "90", + "strength_level": "90", + "defence_level": "70", + "range_level": "70", + "magic_level": "90", + "respawn_delay": "60", + "melee_animation": "376", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "811", + "range_animation": "0", + "weakness": "3", + "poisonous": "true", + "aggressive": "true", + "spell_id": "41", + "safespot": null + }, + { + "id": "1265", + "name": "Rock Crab", + "examine": "No one likes crabs...", + "lifepoints": "51", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "bonuses": "-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75", + "attack_speed": "5", + "melee_animation": "1312", + "defence_animation": "1313", + "death_animation": "1314", + "magic_animation": "1312", + "range_animation": "1312", + "weakness": "7", + "clue_level": "0", + "safespot": null + }, + { + "id": "1266", + "name": "Rocks", + "examine": "A rocky outcrop.", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "1312", + "defence_animation": "1313", + "death_animation": "1314", + "magic_animation": "1312", + "range_animation": "1312", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "1267", + "name": "Rock Crab", + "examine": "No one likes crabs...", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "bonuses": "-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75,-75", + "attack_speed": "5", + "melee_animation": "1312", + "defence_animation": "1313", + "death_animation": "1314", + "magic_animation": "1312", + "range_animation": "1312", + "aggressive": "true", + "clue_level": "0", + "safespot": null + }, + { + "id": "1268", + "name": "Rocks", + "examine": "A rocky outcrop.", + "lifepoints": "50", + "attack_level": "4", + "strength_level": "1", + "defence_level": "4", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "1312", + "defence_animation": "1313", + "death_animation": "1314", + "magic_animation": "1312", + "range_animation": "1312", + "aggressive": "true", + "safespot": null + }, + { + "id": "1269", + "name": "Olaf the Bard", + "examine": "A Fremennik bard.", + "lifepoints": "50", + "attack_level": "10", + "strength_level": "1", + "defence_level": "8", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "1312", + "defence_animation": "1313", + "death_animation": "1314", + "magic_animation": "1312", + "range_animation": "1312", + "aggressive": "true", + "safespot": null + }, + { + "id": "1270", + "name": "Lalli", + "examine": "Distinctly troll-shaped.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1271", + "name": "Golden sheep", + "examine": "Freshly shorn.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1272", + "name": "Golden sheep", + "examine": "Lovely thick wool.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1273", + "name": "Fossegrimen", + "examine": "A powerful spirit that lives in this lake.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1274", + "name": "Ospak", + "examine": "Looks like he's had a few drinks already.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1275", + "name": "Styrmir", + "examine": "Doesn't look like the musical type.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1276", + "name": "Torbrund", + "examine": "Waiting for the show.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1277", + "name": "Fridgeir", + "examine": "He sits impatiently with his friends.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1278", + "name": "Longhall Bouncer", + "examine": "He's fat, he's round, he bounces on the ground. That's how he got the job.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1279", + "name": "The Draugen", + "examine": "A fearful spirit of the drowned.", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "1281", + "name": "Sigli the Huntsman", + "examine": "A Fremennik hunter.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1282", + "name": "Sigmund The Merchant", + "examine": "A Fremennik merchant.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1283", + "name": "Swensen the Navigator", + "examine": "A Fremennik navigator.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1286", + "name": "Manni the Reveller", + "examine": "Every innkeeper's best friend!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1287", + "name": "Council workman", + "examine": "Supposedly fixes things around RuneScape.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1288", + "name": "Peer the Seer", + "examine": "A Fremennik riddler.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1289", + "name": "Thorvald the Warrior", + "examine": "A Fremennik hero.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1290", + "name": "Koschei the deathless", + "examine": "Your challenge awaits! ", + "lifepoints": "14", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "1291", + "name": "Koschei the deathless", + "examine": "He lives again!", + "lifepoints": "14", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "1292", + "name": "Koschei the deathless", + "examine": "He keeps on living!", + "lifepoints": "14", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "1293", + "name": "Koschei the deathless", + "examine": "He just keeps on going.", + "lifepoints": "14", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "1294", + "name": "Brundt the Chieftain", + "examine": "The Fremennik tribe's chieftain.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1296", + "name": "Guard", + "examine": "Stands around and looks at stuff all day.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1297", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1298", + "name": "Town Guard", + "examine": "What a rubbish job he has.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1300", + "name": "A bartender.", + "examine": "The Longhall barkeep", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1301", + "name": "Yrsa", + "examine": "Pretty shabbily dressed for a clothes shop owner.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1302", + "name": "Fisherman", + "examine": "There's something fishy about this guy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1303", + "name": "Skulgrimen", + "examine": "Sells and makes weapons and armour.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1304", + "name": "Sailor", + "examine": "He's strong to the finish", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1305", + "name": "Agnar", + "examine": "One of Rellekka's many citizens.", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1306", + "name": "Freidir", + "examine": "One of Rellekka's many citizens.", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1307", + "name": "Borrokar", + "examine": "One of Rellekka's many citizens.", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1308", + "name": "Lanzig", + "examine": "One of Rellekka's many citizens.", + "lifepoints": "51", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1309", + "name": "Pontak", + "examine": "One of Rellekka's many citizens.", + "lifepoints": "51", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1313", + "name": "Sassilik", + "examine": "One of Rellekka's many citizens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1314", + "name": "Inga", + "examine": "One of Rellekka's many citizens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1315", + "name": "Fish monger", + "examine": "Fish-tastic!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1316", + "name": "Fur trader", + "examine": "I wonder what he does with all that fur?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1317", + "name": "Market Guard", + "examine": "Keeps the stalls secure.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1318", + "name": "Warrior", + "examine": "A hardened Fremennik warrior.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1319", + "name": "Fox", + "examine": "A cunning animal.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6562", + "defence_animation": "0", + "death_animation": "6570", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "1320", + "name": "Bunny", + "examine": "Hoppity", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1245", + "defence_animation": "0", + "death_animation": "1246", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1321", + "name": "Bunny", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1245", + "defence_animation": "1244", + "death_animation": "1246", + "safespot": null + }, + { + "id": "1326", + "name": "Bear Cub", + "examine": "Cute. But deadly.", + "lifepoints": "11", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "6", + "aggressive": "true", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "1327", + "name": "Bear Cub", + "examine": "Cute. But deadly.", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "1328", + "name": "Unicorn Foal", + "examine": "Horned horsey.", + "lifepoints": "14", + "attack_level": "6", + "strength_level": "6", + "defence_level": "6", + "range_level": "1", + "magic_level": "6", + "respawn_delay": "32", + "attack_speed": "5", + "melee_animation": "6376", + "defence_animation": "6375", + "death_animation": "6377", + "magic_animation": "6376", + "range_animation": "6376", + "weakness": "7", + "combat_audio": "496,498,497", + "safespot": null + }, + { + "id": "1329", + "name": "Black unicorn Foal", + "examine": "Cute but evil.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6376", + "defence_animation": "0", + "death_animation": "6377", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "combat_audio": "496,498,497", + "safespot": null + }, + { + "id": "1330", + "name": "Wolf", + "examine": "Fearsome predator found only in the Fremennik Province", + "lifepoints": "69", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6559", + "defence_animation": "0", + "death_animation": "6558", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "92", + "slayer_exp": "69", + "aggressive": "true", + "combat_audio": "481,491,490", + "safespot": null + }, + { + "id": "1338", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "70", + "attack_level": "80", + "strength_level": "80", + "defence_level": "70", + "range_level": "85", + "attack_speed": "5", + "melee_animation": "1340", + "defence_animation": "1341", + "death_animation": "1342", + "magic_animation": "1340", + "range_animation": "1340", + "projectile": "288", + "combat_style": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "1339", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "288", + "combat_style": "1", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "1340", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "288", + "combat_style": "1", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "1341", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "1342", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "1343", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "1344", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "1345", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "1346", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "1347", + "name": "Dagannoth", + "examine": "A horror from the ocean depths...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "1351", + "name": "Dagannoth mother", + "examine": "A horror from the ocean depths.", + "lifepoints": "128", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "0", + "death_animation": "1342", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "slayer_task": "24", + "aggressive": "true", + "safespot": null + }, + { + "id": "1352", + "name": "Dagannoth mother", + "examine": "A horror from the ocean depths.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "1353", + "name": "Dagannoth mother", + "examine": "A horror from the ocean depths.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "1354", + "name": "Dagannoth mother", + "examine": "A horror from the ocean depths.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "1355", + "name": "Dagannoth mother", + "examine": "A horror from the ocean depths.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "1356", + "name": "Dagannoth mother", + "examine": "A horror from the ocean depths.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "1360", + "name": "Banker", + "examine": "He seems happy to see you.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1367", + "name": "Skraeling", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "401", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1368", + "name": "Skraeling", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1369", + "name": "Fishmonger", + "examine": "Hmm", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1370", + "name": "Greengrocer", + "examine": "At least he eats his greens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1374", + "name": "Guard", + "examine": "He's guarding the throne room.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1377", + "name": "Farmer", + "examine": "He's cutting the wheat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1378", + "name": "Flower Girl", + "examine": "No-one would mistake her for a duchess.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1381", + "name": "Alrik", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1385", + "name": "Sailor", + "examine": "He's strong to the finish, because he eats cabbage.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1386", + "name": "Rannveig", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1388", + "name": "Valgerd", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1389", + "name": "Skraeling", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1390", + "name": "Broddi", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1391", + "name": "Skraeling", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1392", + "name": "Ragnvald", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "810", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1393", + "name": "Fishmonger", + "examine": "Hmm", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1394", + "name": "Greengrocer", + "examine": "At least he eats his greens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1395", + "name": "Lumberjack Leif", + "examine": "He's a lumberjack", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1396", + "name": "Miner Magnus", + "examine": "He's just mining his own business.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1397", + "name": "Fisherman Frodi", + "examine": "There's something fishy about him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1398", + "name": "Gardener Gunnhild", + "examine": "She's looking a bit weedy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1401", + "name": "Chicken", + "examine": "Yep. Definitely a chicken.", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "6", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "5387", + "range_animation": "5387", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "1402", + "name": "Chicken", + "examine": "Yep. Definitely a chicken.", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "6", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "5387", + "range_animation": "5387", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "1403", + "name": "Rooster", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "safespot": null + }, + { + "id": "1404", + "name": "Rabbit", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6090", + "defence_animation": "6091", + "death_animation": "6092", + "safespot": null + }, + { + "id": "1419", + "name": "Lumdo", + "examine": "There to help me make my bids.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1427", + "name": "G.L.O. Caranock", + "examine": "An official looking Gnome with small beady eyes.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1442", + "name": "Duke", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1383", + "defence_animation": "1393", + "death_animation": "1384", + "aggressive": "true", + "safespot": null + }, + { + "id": "1443", + "name": "Oipuis", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1383", + "defence_animation": "1393", + "death_animation": "1384", + "aggressive": "true", + "safespot": null + }, + { + "id": "1444", + "name": "Uyoro", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1383", + "defence_animation": "1393", + "death_animation": "1384", + "aggressive": "true", + "safespot": null + }, + { + "id": "1445", + "name": "Ouhai", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1383", + "defence_animation": "1387", + "death_animation": "1384", + "aggressive": "true", + "safespot": null + }, + { + "id": "1446", + "name": "Uodai", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1383", + "defence_animation": "1393", + "death_animation": "1384", + "aggressive": "true", + "safespot": null + }, + { + "id": "1447", + "name": "Padulah", + "lifepoints": "133", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1383", + "defence_animation": "1393", + "death_animation": "1384", + "aggressive": "true", + "safespot": null + }, + { + "id": "1451", + "name": "Sleeping Monkey", + "examine": "A rather sleepy looking guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1452", + "name": "Monkey Child", + "examine": "An adorable little monkey child.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1453", + "name": "The Monkey's Uncle", + "examine": "He looks like the Monkey's Uncle.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1454", + "name": "The Monkey's Aunt", + "examine": "She looks like the Monkey's Aunt.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1455", + "name": "Monkey Guard", + "examine": "A scimitar wielding ninja monkey.", + "lifepoints": "94", + "attack_level": "66", + "strength_level": "66", + "defence_level": "66", + "range_level": "1", + "melee_animation": "1392", + "defence_animation": "0", + "death_animation": "1384", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "61", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1456", + "name": "Monkey Archer", + "examine": "A bow wielding ninja monkey.", + "lifepoints": "82", + "attack_level": "43", + "strength_level": "43", + "defence_level": "58", + "range_level": "58", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "1394", + "weakness": "1", + "slayer_task": "61", + "combat_style": "1", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1457", + "name": "Monkey Archer", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1394", + "defence_animation": "1393", + "death_animation": "1384", + "combat_style": "1", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1458", + "name": "Monkey Archer", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1394", + "defence_animation": "1393", + "death_animation": "1384", + "combat_style": "1", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1459", + "name": "Monkey Guard", + "examine": "A huge brutish gorilla armoured with dangerous looking vambraces.", + "lifepoints": "130", + "attack_level": "100", + "strength_level": "130", + "defence_level": "90", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "1402", + "defence_animation": "1403", + "death_animation": "1404", + "magic_animation": "1402", + "range_animation": "1402", + "weakness": "8", + "slayer_task": "61", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1460", + "name": "Monkey Guard", + "examine": "A huge brutish gorilla armoured with dangerous looking vambraces.", + "lifepoints": "90", + "attack_level": "63", + "strength_level": "63", + "defence_level": "63", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "1402", + "defence_animation": "0", + "death_animation": "1404", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "61", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1461", + "name": "Elder Guard", + "examine": "A huge brutish gorilla stands here", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "61", + "aggressive": "true", + "safespot": null + }, + { + "id": "1463", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1464", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1465", + "name": "Monkey Zombie", + "examine": "A large and lumbering undead monkey.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "1383", + "defence_animation": "0", + "death_animation": "1384", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "61", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1466", + "name": "Monkey Zombie", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1392", + "defence_animation": "1393", + "death_animation": "1384", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1467", + "name": "Monkey Zombie", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1392", + "defence_animation": "1393", + "death_animation": "1384", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1469", + "name": "Monkey minder", + "examine": "He looks like the type of guy who would mind monkeys.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1471", + "name": "Skeleton", + "examine": "It looks just a bit... underfed.", + "lifepoints": "112", + "attack_level": "80", + "strength_level": "109", + "defence_level": "75", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "5519", + "defence_animation": "5520", + "death_animation": "5521", + "magic_animation": "5519", + "range_animation": "5519", + "weakness": "8", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "1472", + "name": "Jungle demon", + "examine": "A Greater Jungle demon. A magical aura emanates from its hide.", + "lifepoints": "428", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "respawn_delay": "60", + "attack_speed": "2", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "1473", + "name": "Spider", + "lifepoints": "2", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6249", + "defence_animation": "6250", + "death_animation": "6251", + "aggressive": "true", + "safespot": null + }, + { + "id": "1475", + "name": "Bird", + "examine": "It's a brightly coloured bird of the jungle.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "melee_animation": "6775", + "defence_animation": "0", + "death_animation": "6779", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "7", + "safespot": null + }, + { + "id": "1476", + "name": "Bird", + "examine": "It's a brightly coloured bird of the jungle. It flies very quickly.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "melee_animation": "6775", + "defence_animation": "0", + "death_animation": "6777", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "7", + "safespot": null + }, + { + "id": "1477", + "name": "Scorpion", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "17", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "1478", + "name": "Jungle spider", + "examine": "A very dangerous looking spider", + "lifepoints": "90", + "attack_level": "47", + "strength_level": "47", + "defence_level": "63", + "range_level": "63", + "respawn_delay": "60", + "melee_animation": "5327", + "defence_animation": "0", + "death_animation": "5329", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "76", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "1479", + "name": "Snake", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "1480", + "name": "Small ninja monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1481", + "name": "Medium ninja monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1483", + "name": "Bearded gorilla", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "1484", + "name": "Ancient monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1485", + "name": "Small zombie monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1486", + "name": "Large zombie monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1487", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "1521", + "name": "Nail beast", + "examine": "A huge nail beast. Its nails appear very sharp.", + "lifepoints": "550", + "attack_level": "150", + "strength_level": "150", + "defence_level": "20", + "range_level": "1", + "melee_animation": "5989", + "defence_animation": "0", + "death_animation": "5990", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1524", + "name": "Undead Lumberjack", + "examine": "He is one", + "lifepoints": "100", + "attack_level": "73", + "strength_level": "73", + "defence_level": "10", + "range_level": "1", + "melee_animation": "5970", + "defence_animation": "0", + "death_animation": "5972", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1528", + "name": "Zealot", + "examine": "His robes prominently display the star of Saradomin.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1531", + "name": "Imp", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "safespot": null + }, + { + "id": "1532", + "name": "Barricade", + "examine": "Handy for hindering the enemy team's movement.", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "poison_immune": "true", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "9658", + "magic_animation": "0", + "range_animation": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1533", + "name": "Barricade", + "examine": "Handy for hindering the enemy team's movement.", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "poison_immune": "true", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "9658", + "magic_animation": "0", + "range_animation": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "1534", + "name": "Barricade", + "examine": "Handy for hindering the enemy team's movement.", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "poison_immune": "true", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "9658", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1535", + "name": "Barricade", + "examine": "Handy for hindering the enemy team's movement.", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "poison_immune": "true", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "9658", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1536", + "name": "Possessed pickaxe", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "185", + "defence_animation": "186", + "death_animation": "188", + "aggressive": "true", + "safespot": null + }, + { + "id": "1537", + "name": "Haze", + "examine": "A strange disturbance in the air.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "1538", + "name": "Corpse", + "examine": "Well", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "75", + "aggressive": "true", + "safespot": null + }, + { + "id": "1539", + "name": "Skeletal miner", + "examine": "I don't think the pickaxe is for hitting rocks.", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "slayer_exp": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "1540", + "name": "Treus Dayth", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5540", + "defence_animation": "5541", + "death_animation": "5542", + "aggressive": "true", + "safespot": null + }, + { + "id": "1541", + "name": "Ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "25", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1549", + "name": "Ghost", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5540", + "defence_animation": "5541", + "death_animation": "5542", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1550", + "name": "Chompy bird", + "examine": "A large boisterous bird", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "2", + "melee_animation": "6761", + "defence_animation": "0", + "death_animation": "6762", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "7", + "safespot": null + }, + { + "id": "1551", + "name": "Mischievous ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1553", + "name": "Ug", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1556", + "name": "Arrg", + "lifepoints": "150", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "1557", + "name": "Ug", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1558", + "name": "Ice wolf", + "examine": "Not man's best friend.", + "lifepoints": "72", + "attack_level": "51", + "strength_level": "51", + "defence_level": "51", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6559", + "defence_animation": "0", + "death_animation": "6558", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "92", + "aggressive": "true", + "safespot": null + }, + { + "id": "1560", + "name": "Ice Troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1561", + "name": "Ice Troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1562", + "name": "Ice Troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1563", + "name": "Ice Troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1564", + "name": "Ice Troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1565", + "name": "Ice Troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1566", + "name": "Ice Troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1567", + "name": "Cyreg Paddlehorn", + "examine": "A tall and imposing man who's more than familiar with boating.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1575", + "name": "Skeleton Hellhound", + "examine": "A creature summoned by Vanstrom to kill the remaining Myreque.", + "lifepoints": "57", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6579", + "defence_animation": "0", + "death_animation": "6558", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "1582", + "name": "Fire giant", + "examine": "A very large elemental adversary.", + "lifepoints": "111", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "4666", + "defence_animation": "4664", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "33", + "slayer_exp": "111", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "1583", + "name": "Fire giant", + "examine": "A very large elemental adversary.", + "lifepoints": "111", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "4666", + "defence_animation": "4664", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "33", + "slayer_exp": "111", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "1584", + "name": "Fire giant", + "examine": "A very large elemental adversary.", + "lifepoints": "111", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "4666", + "defence_animation": "4664", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "33", + "slayer_exp": "111", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "1585", + "name": "Fire giant", + "examine": "A very large elemental adversary.", + "lifepoints": "111", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "4666", + "defence_animation": "4664", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "33", + "slayer_exp": "111", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "1586", + "name": "Fire giant", + "examine": "A very large elemental adversary.", + "lifepoints": "111", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "4666", + "defence_animation": "4664", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "33", + "slayer_exp": "111", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "1587", + "name": "Moss giant", + "examine": "His beard seems to have a life of its own.", + "lifepoints": "60", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4666", + "defence_animation": "4665", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "62", + "slayer_exp": "60", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "1588", + "name": "Moss giant", + "examine": "His beard seems to have a life of its own.", + "lifepoints": "60", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4666", + "defence_animation": "4665", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "62", + "slayer_exp": "60", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "1589", + "name": "Baby red dragon", + "examine": "Young but still dangerous.", + "lifepoints": "50", + "attack_level": "40", + "strength_level": "40", + "defence_level": "42", + "range_level": "1", + "magic_level": "40", + "bonuses": "50,40,64,60,30,45,40,40,20,40,40,20,0,0,0", + "respawn_delay": "32", + "attack_speed": "5", + "melee_animation": "25", + "defence_animation": "26", + "death_animation": "28", + "magic_animation": "25", + "range_animation": "25", + "weakness": "3", + "slayer_task": "68", + "aggressive": "true", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "1590", + "name": "Bronze dragon", + "examine": "Its scales seem to be made of bronze.", + "lifepoints": "122", + "attack_level": "112", + "strength_level": "112", + "defence_level": "112", + "range_level": "1", + "magic_level": "100", + "bonuses": "0,0,0,0,0,50,70,70,30,90,0,0,0,0,0", + "respawn_delay": "40", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "7", + "slayer_task": "13", + "slayer_exp": "125", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "1591", + "name": "Iron dragon", + "examine": "Its scales seem to be made of iron.", + "lifepoints": "165", + "attack_level": "165", + "strength_level": "165", + "defence_level": "165", + "range_level": "1", + "magic_level": "100", + "bonuses": "0,0,0,0,0,50,70,70,30,90,0,0,0,0,0", + "respawn_delay": "45", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "7", + "slayer_task": "50", + "slayer_exp": "173", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "1592", + "name": "Steel dragon", + "examine": "Its scales seem to be made of steel.", + "lifepoints": "210", + "attack_level": "215", + "strength_level": "215", + "defence_level": "215", + "range_level": "1", + "magic_level": "100", + "bonuses": "0,0,0,0,0,50,70,70,30,90,0,0,0,0,0", + "respawn_delay": "45", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "7", + "slayer_task": "80", + "slayer_exp": "221", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "1593", + "name": "Wild dog", + "examine": "An unsuitable pet.", + "lifepoints": "62", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "magic_level": "20", + "bonuses": "10,15,5,10,30,5,30,30,30,10,30,5,40,5,5", + "respawn_delay": "20", + "melee_animation": "6562", + "defence_animation": "6563", + "death_animation": "6564", + "magic_animation": "6562", + "range_animation": "6562", + "weakness": "7", + "slayer_task": "27", + "aggressive": "true", + "safespot": null + }, + { + "id": "1594", + "name": "Wild dog", + "examine": "Looks like it's got Rabies!", + "lifepoints": "62", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "magic_level": "20", + "bonuses": "10,15,5,10,30,5,30,30,30,10,30,5,40,5,5", + "respawn_delay": "20", + "melee_animation": "6562", + "defence_animation": "6563", + "death_animation": "6564", + "magic_animation": "6562", + "range_animation": "6562", + "aggressive": "true", + "safespot": null + }, + { + "id": "1600", + "name": "Cave crawler", + "examine": "A spiky crawling critter. ", + "lifepoints": "23", + "attack_level": "28", + "strength_level": "30", + "defence_level": "30", + "range_level": "38", + "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "266", + "defence_animation": "267", + "death_animation": "265", + "magic_animation": "266", + "range_animation": "266", + "weakness": "1", + "slayer_task": "16", + "slayer_exp": "22", + "poisonous": "true", + "safespot": null + }, + { + "id": "1601", + "name": "Cave crawler", + "examine": "A spiky crawling critter. ", + "lifepoints": "23", + "attack_level": "28", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "266", + "defence_animation": "267", + "death_animation": "265", + "magic_animation": "266", + "range_animation": "266", + "slayer_exp": "22", + "safespot": null + }, + { + "id": "1602", + "name": "Cave crawler", + "examine": "A spiky crawling critter. ", + "lifepoints": "23", + "attack_level": "28", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "266", + "defence_animation": "267", + "death_animation": "265", + "magic_animation": "266", + "range_animation": "266", + "slayer_exp": "22", + "safespot": null + }, + { + "id": "1603", + "name": "Cave crawler", + "examine": "A spiky crawling critter. ", + "lifepoints": "23", + "attack_level": "28", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "bonuses": "30,60,60,60,60,66,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "266", + "defence_animation": "267", + "death_animation": "265", + "magic_animation": "266", + "range_animation": "266", + "slayer_exp": "22", + "safespot": null + }, + { + "id": "1604", + "name": "Aberrant spectre", + "examine": "A very smelly ghost.", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "90", + "range_level": "1", + "magic_level": "105", + "bonuses": "0,0,0,0,0,20,20,20,0,15,0,0,0,0,0", + "melee_animation": "9466", + "defence_animation": "9468", + "death_animation": "9467", + "magic_animation": "9466", + "range_animation": "1507", + "start_gfx": "334", + "projectile": "335", + "end_gfx": "336", + "weakness": "5", + "slayer_task": "0", + "slayer_exp": "90", + "combat_style": "2", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "1605", + "name": "Aberrant spectre", + "examine": "A very smelly ghost.", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "90", + "range_level": "1", + "magic_level": "105", + "bonuses": "0,0,0,0,0,20,20,20,0,15,0,0,0,0,0", + "melee_animation": "9466", + "defence_animation": "9468", + "death_animation": "9467", + "magic_animation": "9466", + "range_animation": "1507", + "start_gfx": "334", + "projectile": "335", + "end_gfx": "336", + "weakness": "5", + "slayer_task": "0", + "slayer_exp": "90", + "combat_style": "2", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "1606", + "name": "Aberrant spectre", + "examine": "A very smelly ghost.", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "90", + "range_level": "1", + "magic_level": "105", + "bonuses": "0,0,0,0,0,20,20,20,0,15,0,0,0,0,0", + "melee_animation": "9466", + "defence_animation": "9468", + "death_animation": "9467", + "magic_animation": "9466", + "range_animation": "1507", + "start_gfx": "334", + "projectile": "335", + "end_gfx": "336", + "weakness": "5", + "slayer_task": "0", + "slayer_exp": "90", + "combat_style": "2", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "1607", + "name": "Aberrant spectre", + "examine": "A very smelly ghost.", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "90", + "range_level": "1", + "magic_level": "105", + "bonuses": "0,0,0,0,0,20,20,20,0,15,0,0,0,0,0", + "melee_animation": "9466", + "defence_animation": "9468", + "death_animation": "9467", + "magic_animation": "9466", + "range_animation": "1507", + "start_gfx": "334", + "projectile": "335", + "end_gfx": "336", + "weakness": "5", + "slayer_task": "0", + "slayer_exp": "90", + "combat_style": "2", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "1608", + "name": "Kurask", + "examine": "Large, heavy, with sharp things attached to its head.", + "lifepoints": "97", + "attack_level": "67", + "strength_level": "105", + "defence_level": "105", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,20,20,0,0,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "9439", + "defence_animation": "9441", + "death_animation": "9440", + "magic_animation": "9439", + "range_animation": "9439", + "slayer_exp": "97", + "aggressive": "true", + "safespot": null + }, + { + "id": "1609", + "name": "Kurask", + "examine": "Large, heavy, with sharp things attached to its head.", + "lifepoints": "97", + "attack_level": "67", + "strength_level": "105", + "defence_level": "105", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,20,20,0,0,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "9439", + "defence_animation": "9441", + "death_animation": "9440", + "magic_animation": "9439", + "range_animation": "9439", + "slayer_exp": "97", + "aggressive": "true", + "safespot": null + }, + { + "id": "1610", + "name": "Gargoyle", + "examine": "Flies like a rock.", + "lifepoints": "105", + "attack_level": "75", + "strength_level": "105", + "defence_level": "107", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "9454", + "defence_animation": "9455", + "death_animation": "1518", + "magic_animation": "1516", + "range_animation": "1516", + "slayer_exp": "105", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "1611", + "name": "Swarming turoth", + "examine": "Flies like a rock.", + "lifepoints": "105", + "attack_level": "45", + "strength_level": "104", + "defence_level": "42", + "range_level": "49", + "attack_speed": "5", + "melee_animation": "1516", + "defence_animation": "0", + "death_animation": "1518", + "magic_animation": "1516", + "range_animation": "1516", + "weakness": "0", + "slayer_task": "84", + "slayer_exp": "105", + "clue_level": "2", + "safespot": null + }, + { + "id": "1612", + "name": "Banshee", + "examine": "A tortured screaming soul.", + "lifepoints": "22", + "attack_level": "9", + "strength_level": "14", + "defence_level": "5", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "9449", + "defence_animation": "9451", + "death_animation": "9450", + "magic_animation": "1523", + "range_animation": "1523", + "slayer_exp": "22", + "aggressive": "true", + "clue_level": "0", + "safespot": null + }, + { + "id": "1613", + "name": "Nechryael", + "examine": "An evil death demon.", + "lifepoints": "105", + "attack_level": "97", + "strength_level": "97", + "defence_level": "105", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "9487", + "defence_animation": "9489", + "death_animation": "9488", + "magic_animation": "1528", + "range_animation": "1528", + "clue_level": "2", + "safespot": null + }, + { + "id": "1614", + "name": "Death spawn", + "examine": "An evil death spawn.", + "lifepoints": "60", + "attack_level": "67", + "strength_level": "7", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", + "poison_immune": "true", + "attack_speed": "4", + "melee_animation": "1540", + "defence_animation": "0", + "death_animation": "9460", + "magic_animation": "1540", + "range_animation": "1540", + "weakness": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "1615", + "name": "Abyssal demon", + "examine": "A denizen of the Abyss!", + "lifepoints": "150", + "attack_level": "97", + "strength_level": "67", + "defence_level": "135", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "1537", + "defence_animation": "0", + "death_animation": "1538", + "magic_animation": "1537", + "range_animation": "1537", + "weakness": "1", + "slayer_task": "1", + "slayer_exp": "150", + "clue_level": "2", + "safespot": null + }, + { + "id": "1616", + "name": "Basilisk", + "examine": "The eyes of evil.", + "lifepoints": "75", + "attack_level": "80", + "strength_level": "80", + "defence_level": "75", + "range_level": "75", + "magic_level": "75", + "attack_speed": "5", + "melee_animation": "260", + "defence_animation": "261", + "death_animation": "264", + "magic_animation": "260", + "range_animation": "260", + "slayer_exp": "75", + "safespot": null + }, + { + "id": "1617", + "name": "Basilisk", + "examine": "The eyes of evil.", + "lifepoints": "75", + "attack_level": "80", + "strength_level": "80", + "defence_level": "75", + "range_level": "75", + "magic_level": "75", + "attack_speed": "5", + "melee_animation": "260", + "defence_animation": "261", + "death_animation": "264", + "magic_animation": "260", + "range_animation": "260", + "slayer_exp": "75", + "safespot": null + }, + { + "id": "1618", + "name": "Bloodveld", + "examine": "The tongue of evil.", + "lifepoints": "120", + "attack_level": "75", + "strength_level": "45", + "defence_level": "30", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "9130", + "defence_animation": "9132", + "death_animation": "9131", + "magic_animation": "1552", + "range_animation": "1552", + "slayer_exp": "120", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "1619", + "name": "Bloodveld", + "examine": "The tongue of evil.", + "lifepoints": "120", + "attack_level": "75", + "strength_level": "45", + "defence_level": "30", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "9130", + "defence_animation": "9132", + "death_animation": "9131", + "magic_animation": "1552", + "range_animation": "1552", + "slayer_exp": "120", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "1620", + "name": "Cockatrice", + "examine": "The winged reptile.", + "lifepoints": "37", + "attack_level": "32", + "strength_level": "32", + "defence_level": "35", + "range_level": "32", + "bonuses": "30,30,30,30,30,35,0,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "7762", + "defence_animation": "7761", + "death_animation": "7763", + "magic_animation": "7762", + "range_animation": "7762", + "weakness": "2", + "slayer_task": "19", + "slayer_exp": "37", + "clue_level": "1", + "safespot": null + }, + { + "id": "1621", + "name": "Cockatrice", + "examine": "The winged reptile.", + "lifepoints": "37", + "attack_level": "32", + "strength_level": "32", + "defence_level": "35", + "range_level": "1", + "bonuses": "30,30,30,30,30,35,0,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "7762", + "defence_animation": "7761", + "death_animation": "7763", + "magic_animation": "7762", + "range_animation": "7762", + "slayer_exp": "37", + "clue_level": "1", + "safespot": null + }, + { + "id": "1622", + "name": "Turoth", + "examine": "It's one leg short!", + "lifepoints": "27", + "attack_level": "30", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "9471", + "defence_animation": "9473", + "death_animation": "9472", + "magic_animation": "9471", + "range_animation": "9471", + "safespot": null + }, + { + "id": "1623", + "name": "Turoth", + "examine": "It's one leg short!", + "lifepoints": "27", + "attack_level": "30", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "9471", + "defence_animation": "9473", + "death_animation": "9472", + "magic_animation": "9471", + "range_animation": "9471", + "safespot": null + }, + { + "id": "1624", + "name": "Dust devil", + "examine": "The vacuumed face of evil.", + "lifepoints": "105", + "attack_level": "105", + "strength_level": "70", + "defence_level": "40", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "1557", + "defence_animation": "1555", + "death_animation": "1558", + "magic_animation": "1557", + "range_animation": "1557", + "weakness": "2", + "slayer_task": "28", + "slayer_exp": "105", + "safespot": null + }, + { + "id": "1625", + "name": "Smokedevil", + "examine": "The cave-dwelling cousin of the dust devils.", + "lifepoints": "87", + "attack_level": "105", + "strength_level": "105", + "defence_level": "61", + "range_level": "61", + "melee_animation": "1557", + "defence_animation": "0", + "death_animation": "1558", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "28", + "safespot": null + }, + { + "id": "1626", + "name": "Turoth", + "examine": "It's one leg short!", + "lifepoints": "79", + "attack_level": "80", + "strength_level": "85", + "defence_level": "75", + "range_level": "75", + "magic_level": "75", + "attack_speed": "5", + "melee_animation": "9471", + "defence_animation": "9473", + "death_animation": "9472", + "magic_animation": "9471", + "range_animation": "9471", + "clue_level": "2", + "safespot": null + }, + { + "id": "1627", + "name": "Turoth", + "examine": "It's one leg short!", + "lifepoints": "79", + "attack_level": "80", + "strength_level": "85", + "defence_level": "75", + "range_level": "75", + "magic_level": "75", + "attack_speed": "5", + "melee_animation": "9471", + "defence_animation": "9473", + "death_animation": "9472", + "magic_animation": "9471", + "range_animation": "9471", + "clue_level": "2", + "safespot": null + }, + { + "id": "1628", + "name": "Turoth", + "examine": "It's one leg short!", + "lifepoints": "79", + "attack_level": "80", + "strength_level": "85", + "defence_level": "75", + "range_level": "75", + "magic_level": "75", + "attack_speed": "5", + "melee_animation": "9471", + "defence_animation": "9473", + "death_animation": "9472", + "magic_animation": "9471", + "range_animation": "9471", + "clue_level": "2", + "safespot": null + }, + { + "id": "1629", + "name": "Turoth", + "examine": "It's one leg short!", + "lifepoints": "79", + "attack_level": "80", + "strength_level": "85", + "defence_level": "75", + "range_level": "75", + "magic_level": "75", + "attack_speed": "5", + "melee_animation": "9471", + "defence_animation": "9473", + "death_animation": "9472", + "magic_animation": "9471", + "range_animation": "9471", + "clue_level": "2", + "safespot": null + }, + { + "id": "1630", + "name": "Turoth", + "examine": "It's one leg short!", + "lifepoints": "79", + "attack_level": "80", + "strength_level": "85", + "defence_level": "75", + "range_level": "75", + "magic_level": "75", + "attack_speed": "5", + "melee_animation": "9471", + "defence_animation": "9473", + "death_animation": "9472", + "magic_animation": "9471", + "range_animation": "9471", + "clue_level": "2", + "safespot": null + }, + { + "id": "1631", + "name": "Rockslug", + "examine": "A rocky slug.", + "lifepoints": "30", + "attack_level": "24", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "attack_speed": "5", + "melee_animation": "9506", + "defence_animation": "9508", + "death_animation": "9507", + "magic_animation": "9506", + "range_animation": "9506", + "weakness": "7", + "slayer_task": "69", + "clue_level": "2", + "safespot": null + }, + { + "id": "1632", + "name": "Rockslug", + "examine": "A rocky slug.", + "lifepoints": "30", + "attack_level": "24", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "attack_speed": "5", + "melee_animation": "9506", + "defence_animation": "9508", + "death_animation": "9507", + "magic_animation": "9506", + "range_animation": "9506", + "weakness": "7", + "slayer_task": "69", + "clue_level": "2", + "safespot": null + }, + { + "id": "1633", + "name": "Pyrefiend", + "examine": "A small fire demon.", + "lifepoints": "45", + "attack_level": "22", + "strength_level": "29", + "defence_level": "19", + "range_level": "19", + "magic_level": "10", + "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8080", + "defence_animation": "8084", + "death_animation": "8078", + "spawn_animation": "8081", + "weakness": "4", + "slayer_task": "66", + "slayer_exp": "45", + "clue_level": "1", + "safespot": null + }, + { + "id": "1634", + "name": "Pyrefiend", + "examine": "A small fire demon.", + "lifepoints": "45", + "attack_level": "22", + "strength_level": "29", + "defence_level": "19", + "range_level": "19", + "magic_level": "10", + "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8080", + "defence_animation": "8084", + "death_animation": "8078", + "spawn_animation": "8081", + "weakness": "4", + "slayer_task": "66", + "slayer_exp": "45", + "clue_level": "1", + "safespot": null + }, + { + "id": "1635", + "name": "Pyrefiend", + "examine": "A small fire demon.", + "lifepoints": "45", + "attack_level": "22", + "strength_level": "29", + "defence_level": "19", + "range_level": "19", + "magic_level": "10", + "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8080", + "defence_animation": "8084", + "death_animation": "8078", + "spawn_animation": "8081", + "weakness": "4", + "slayer_task": "66", + "slayer_exp": "45", + "clue_level": "1", + "safespot": null + }, + { + "id": "1636", + "name": "Pyrefiend", + "examine": "A small fire demon.", + "lifepoints": "45", + "attack_level": "22", + "strength_level": "29", + "defence_level": "19", + "range_level": "19", + "magic_level": "10", + "bonuses": "52,30,22,1,1,0,0,0,0,0,0,10,10,10,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8080", + "defence_animation": "8084", + "death_animation": "8078", + "spawn_animation": "8081", + "weakness": "4", + "slayer_task": "66", + "slayer_exp": "45", + "clue_level": "1", + "safespot": null + }, + { + "id": "1637", + "name": "Jelly", + "examine": "It's a Jelly.", + "lifepoints": "75", + "attack_level": "40", + "strength_level": "45", + "defence_level": "40", + "range_level": "40", + "magic_level": "40", + "attack_speed": "5", + "melee_animation": "8569", + "defence_animation": "8571", + "death_animation": "8570", + "magic_animation": "8569", + "range_animation": "8569", + "weakness": "2", + "slayer_task": "51", + "slayer_exp": "75", + "clue_level": "2", + "safespot": null + }, + { + "id": "1638", + "name": "Jelly", + "examine": "Doesn't look so tough...", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "49", + "range_level": "49", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8569", + "defence_animation": "0", + "death_animation": "8570", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "51", + "slayer_exp": "75", + "clue_level": "2", + "safespot": null + }, + { + "id": "1639", + "name": "Jelly", + "examine": "Wibbly.", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "49", + "range_level": "49", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8569", + "defence_animation": "0", + "death_animation": "8570", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "51", + "slayer_exp": "75", + "clue_level": "2", + "safespot": null + }, + { + "id": "1640", + "name": "Jelly", + "examine": "There's always room for jelly.", + "lifepoints": "140", + "attack_level": "1", + "strength_level": "1", + "defence_level": "49", + "range_level": "49", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8569", + "defence_animation": "0", + "death_animation": "8570", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "51", + "slayer_exp": "75", + "clue_level": "2", + "safespot": null + }, + { + "id": "1641", + "name": "Jelly", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8569", + "defence_animation": "8571", + "slayer_exp": "75", + "clue_level": "2", + "safespot": null + }, + { + "id": "1642", + "name": "Jelly", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8569", + "defence_animation": "8571", + "slayer_exp": "75", + "clue_level": "2", + "safespot": null + }, + { + "id": "1643", + "name": "Infernal Mage", + "examine": "An evil magic user.", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "75", + "bonuses": "0,0,0,0,0,0,0,0,40,0,0,0,0,0,0", + "respawn_delay": "12", + "melee_animation": "811", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "811", + "range_animation": "811", + "start_gfx": "99", + "projectile": "100", + "end_gfx": "101", + "weakness": "3", + "slayer_task": "49", + "combat_style": "2", + "safespot": null + }, + { + "id": "1644", + "name": "Infernal Mage", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "75", + "bonuses": "0,0,0,0,0,0,0,0,40,0,0,0,0,0,0", + "respawn_delay": "12", + "melee_animation": "811", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "811", + "range_animation": "811", + "start_gfx": "99", + "projectile": "100", + "end_gfx": "101", + "weakness": "3", + "slayer_task": "49", + "combat_style": "2", + "safespot": null + }, + { + "id": "1645", + "name": "Infernal Mage", + "examine": "An evil magic user.", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "75", + "bonuses": "0,0,0,0,0,0,0,0,40,0,0,0,0,0,0", + "respawn_delay": "12", + "melee_animation": "811", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "811", + "range_animation": "811", + "start_gfx": "99", + "projectile": "100", + "end_gfx": "101", + "weakness": "3", + "slayer_task": "49", + "combat_style": "2", + "safespot": null + }, + { + "id": "1646", + "name": "Infernal Mage", + "examine": "An evil magic user.", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "75", + "bonuses": "0,0,0,0,0,0,0,0,40,0,0,0,0,0,0", + "respawn_delay": "12", + "melee_animation": "811", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "811", + "range_animation": "811", + "start_gfx": "99", + "projectile": "100", + "end_gfx": "101", + "weakness": "3", + "slayer_task": "49", + "combat_style": "2", + "safespot": null + }, + { + "id": "1647", + "name": "Infernal Mage", + "examine": "An evil magic user.", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "75", + "bonuses": "0,0,0,0,0,0,0,0,40,0,0,0,0,0,0", + "respawn_delay": "12", + "melee_animation": "811", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "811", + "range_animation": "811", + "start_gfx": "99", + "projectile": "100", + "end_gfx": "101", + "weakness": "3", + "slayer_task": "49", + "combat_style": "2", + "safespot": null + }, + { + "id": "1648", + "name": "Crawling Hand", + "examine": "Now THAT'S handy.", + "lifepoints": "16", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "bonuses": "5,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "9125", + "defence_animation": "9127", + "death_animation": "9126", + "magic_animation": "9125", + "range_animation": "9125", + "weakness": "9", + "slayer_task": "21", + "slayer_exp": "19", + "safespot": null + }, + { + "id": "1649", + "name": "Crawling Hand", + "examine": "Gimmie five. Actually", + "lifepoints": "5", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9125", + "defence_animation": "0", + "death_animation": "9126", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "21", + "slayer_exp": "19", + "safespot": null + }, + { + "id": "1650", + "name": "Crawling Hand", + "examine": "Gimmie five. Actually", + "lifepoints": "5", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9125", + "defence_animation": "0", + "death_animation": "9126", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "21", + "safespot": null + }, + { + "id": "1651", + "name": "Crawling Hand", + "examine": "Gimmie five. Actually", + "lifepoints": "5", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9125", + "defence_animation": "0", + "death_animation": "9126", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "21", + "slayer_exp": "19", + "safespot": null + }, + { + "id": "1652", + "name": "Crawling Hand", + "examine": "Gimmie five. Actually", + "lifepoints": "5", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9125", + "defence_animation": "0", + "death_animation": "9126", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "21", + "slayer_exp": "19", + "safespot": null + }, + { + "id": "1653", + "name": "Crawling Hand", + "examine": "Now THAT's handy.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9444", + "defence_animation": "0", + "death_animation": "9445", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "21", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "1654", + "name": "Crawling Hand", + "examine": "I'm glad it's just the hand I can see...", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9444", + "defence_animation": "0", + "death_animation": "9445", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "21", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "1655", + "name": "Crawling Hand", + "examine": "A big severed hand.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9444", + "defence_animation": "0", + "death_animation": "9445", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "21", + "safespot": null + }, + { + "id": "1656", + "name": "Crawling Hand", + "examine": "Give the guy a big hand.....", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9444", + "defence_animation": "0", + "death_animation": "9445", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "21", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "1657", + "name": "Crawling Hand", + "examine": "A big severed hand.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9444", + "defence_animation": "0", + "death_animation": "9445", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "21", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "1658", + "name": "Robe Store owner", + "examine": "A Supplier of Magical robes.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1660", + "name": "Skullball Boss", + "examine": "He's in charge of the Skullball Course.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1661", + "name": "Agility Boss", + "examine": "He's in charge of the Agility Course.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1662", + "name": "Skullball Trainer", + "examine": "A skullball guide.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1663", + "name": "Agility Trainer", + "examine": "A werewolf agility trainer.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1665", + "name": "Werewolf", + "examine": "Looks like he's guarding a trapdoor...", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "safespot": null + }, + { + "id": "1675", + "name": "Gardener Ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1681", + "name": "Moss giant", + "examine": "His beard seems to have a life of its own.", + "lifepoints": "120", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "1", + "bonuses": "66,62,0,0,0,0,0,0,0,0,0,0,0,0,0", + "melee_animation": "4666", + "defence_animation": "4665", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "3", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "1686", + "name": "Ghost disciple", + "examine": "A ghost disciple.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1688", + "name": "Ak-Haranu", + "examine": "A trader from across the eastern sea.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "respawn_delay": "0", + "movement_radius": "2", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "0", + "start_height": "0", + "safespot": null + }, + { + "id": "1691", + "name": "Undead cow", + "examine": "It's an undead cow.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5849", + "defence_animation": "0", + "death_animation": "5851", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "20", + "safespot": null + }, + { + "id": "1692", + "name": "Undead chicken", + "examine": "Yep", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5387", + "defence_animation": "0", + "death_animation": "5389", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "7", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "1693", + "name": "Giant lobster", + "examine": "An extremely vicious lobster.", + "lifepoints": "128", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "6265", + "defence_animation": "0", + "death_animation": "6267", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "71", + "safespot": null + }, + { + "id": "1695", + "name": "Old crone", + "examine": "An old", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1696", + "name": "Old man", + "examine": "A creaky old man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1697", + "name": "Ghost villager", + "examine": "A spooky ghost villager.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1698", + "name": "Tortured soul", + "examine": "This poor soul cannot understand why it has not passed to the next world.", + "lifepoints": "85", + "attack_level": "28", + "strength_level": "28", + "defence_level": "38", + "range_level": "1", + "magic_level": "38", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "36", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "1699", + "name": "Ghost shopkeeper", + "examine": "Beware the ghostly shopkeeper's wares!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1700", + "name": "Ghost innkeeper", + "examine": "Doesn't look like the bar's open anymore.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1701", + "name": "Ghost farmer", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1702", + "name": "Ghost banker", + "examine": "A ghost banker.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1703", + "name": "Ghost sailor", + "examine": "A ghost sailor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1704", + "name": "Ghost captain", + "examine": "A ghostship captain.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1705", + "name": "Ghost captain", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1706", + "name": "Ghost guard", + "examine": "This ghost guards the gates of Port Phasmatys.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1707", + "name": "Ghost (?)", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1708", + "name": "Ghost (?)", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "1710", + "name": "H.A.M. Guard", + "examine": "A guard for the humans against monster group.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "clue_level": "0", + "safespot": null + }, + { + "id": "1711", + "name": "H.A.M. Guard", + "examine": "A guard for the humans against monster group.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "clue_level": "0", + "safespot": null + }, + { + "id": "1712", + "name": "H.A.M. Guard", + "examine": "A guard for the humans against monster group.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "clue_level": "0", + "safespot": null + }, + { + "id": "1713", + "name": "H.A.M. Deacon", + "examine": "A deacon in the Humans Against Monsters group. A rather enthusiastic chap.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "1714", + "name": "H.A.M. Member", + "examine": "A member of the 'Humans Against Monsters' group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "1715", + "name": "H.A.M. Member", + "examine": "A member of the 'Humans Against Monsters' group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "1716", + "name": "H.A.M. Member", + "examine": "A member of the 'Humans Against Monsters' group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "1717", + "name": "H.A.M. Member", + "examine": "A member of the 'Humans Against Monsters' group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "1718", + "name": "Jimmy the Chisel", + "examine": "A young man with a dark and mysterious past.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1739", + "name": "Oak", + "examine": "Manages the mill.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1740", + "name": "Yew", + "examine": "One of Sigmund's elite guards.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1741", + "name": "Evergreen", + "examine": "One of Sigmund's elite guards.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1742", + "name": "Evergreen", + "examine": "A member of Sigmund's H.A.M. splinter group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1743", + "name": "Evergreen", + "examine": "A member of Sigmund's H.A.M. splinter group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1744", + "name": "Tree", + "examine": "A member of Sigmund's H.A.M. splinter group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1745", + "name": "Dead tree", + "examine": "A member of Sigmund's H.A.M. splinter group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1746", + "name": "Achey Tree", + "examine": "A member of Sigmund's H.A.M. splinter group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1747", + "name": "Tree", + "examine": "A member of Sigmund's H.A.M. splinter group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1748", + "name": "Tree", + "examine": "A member of Sigmund's H.A.M. splinter group.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1751", + "name": "Terrorbird", + "lifepoints": "34", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1010", + "defence_animation": "1012", + "death_animation": "1013", + "safespot": null + }, + { + "id": "1752", + "name": "Mounted terrorbird gnome", + "examine": "These gnomes know how to get around!", + "lifepoints": "37", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6790", + "defence_animation": "0", + "death_animation": "6791", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "7", + "safespot": null + }, + { + "id": "1754", + "name": "Crow", + "examine": "A farmer's enemy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "safespot": null + }, + { + "id": "1757", + "name": "Farmer", + "examine": "He grows the crops in this area.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7181", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1758", + "name": "Farmer", + "examine": "He grows the crops in this area.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7181", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1759", + "name": "Farmer", + "examine": "Farming.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1760", + "name": "Farmer", + "examine": "He grows the crops in this area.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7181", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1761", + "name": "Farmer", + "examine": "Farming the wheat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1763", + "name": "Sheep", + "examine": "White and fluffy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1766", + "name": "Cow calf", + "examine": "Young, but still beefy.", + "lifepoints": "6", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "5850", + "death_animation": "5851", + "magic_animation": "5849", + "range_animation": "5849", + "slayer_exp": "8", + "combat_audio": "366,368,367", + "safespot": null + }, + { + "id": "1767", + "name": "Cow", + "examine": "Where beef comes from.", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "5850", + "death_animation": "5851", + "magic_animation": "5849", + "range_animation": "5849", + "weakness": "8", + "slayer_task": "20", + "slayer_exp": "8", + "combat_audio": "369,371,370", + "safespot": null + }, + { + "id": "1768", + "name": "Cow calf", + "examine": "Young, but still beefy.", + "lifepoints": "6", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "5850", + "death_animation": "5851", + "magic_animation": "5849", + "range_animation": "5849", + "slayer_exp": "8", + "combat_audio": "366,368,367", + "safespot": null + }, + { + "id": "1769", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "weakness": "7", + "slayer_task": "38", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1770", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "weakness": "7", + "slayer_task": "38", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1771", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "weakness": "7", + "slayer_task": "38", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1772", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "weakness": "7", + "slayer_task": "38", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1773", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "weakness": "7", + "slayer_task": "38", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1774", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "weakness": "7", + "slayer_task": "38", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1775", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "weakness": "7", + "slayer_task": "38", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1776", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "weakness": "7", + "slayer_task": "38", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1794", + "name": "Hammerspike Stoutbeard", + "examine": "He looks quite independent in an aggressive and business like way.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "1795", + "name": "Dwarf gang member", + "examine": "A short stout menacing fellow.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "29", + "safespot": null + }, + { + "id": "1796", + "name": "Dwarf gang member", + "examine": "A short stout menacing fellow.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "29", + "safespot": null + }, + { + "id": "1797", + "name": "Dwarf gang member", + "examine": "A short stout menacing fellow.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "29", + "safespot": null + }, + { + "id": "1802", + "name": "Slagilith", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1750", + "defence_animation": "1751", + "death_animation": "1752", + "aggressive": "true", + "safespot": null + }, + { + "id": "1803", + "name": "Rock pile", + "examine": "A pile of boulders.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1805", + "name": "Guard", + "examine": "He seems to be guarding a pile of rocks. Interesting job.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1806", + "name": "Guard", + "examine": "He seems to be guarding a single rock. Interesting job.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "1807", + "name": "Hamal the Chieftain", + "examine": "The Chieftain of the mountain camp.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1812", + "name": "The Kendal", + "examine": "Is that a bear... or a man?", + "lifepoints": "85", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "23", + "magic_level": "23", + "respawn_delay": "60", + "melee_animation": "1760", + "defence_animation": "0", + "death_animation": "1759", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "1813", + "name": "The Kendal", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1760", + "defence_animation": "1758", + "death_animation": "1759", + "aggressive": "true", + "safespot": null + }, + { + "id": "1814", + "name": "Camp dweller", + "examine": "One of the inhabitants of the camp.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1815", + "name": "Camp dweller", + "examine": "One of the inhabitants of the camp.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1816", + "name": "Camp dweller", + "examine": "One of the inhabitants of the camp.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1817", + "name": "Camp dweller", + "examine": "One of the inhabitants of the camp.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1818", + "name": "Camp dweller", + "examine": "One of the inhabitants of the camp.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1819", + "name": "Mountain Goat", + "examine": "Looks a little underfed.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1820", + "name": "Mountain Goat", + "examine": "This goat belongs to the mountain camp people.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1822", + "name": "Cave goblin", + "examine": "A goblin with big bulging eyes.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6001", + "defence_animation": "0", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1823", + "name": "Cave goblin", + "examine": "A goblin with big bulging eyes.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6001", + "defence_animation": "0", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1824", + "name": "Cave goblin", + "examine": "A goblin with big bulging eyes.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6001", + "defence_animation": "0", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1825", + "name": "Cave goblin", + "examine": "A goblin with big bulging eyes.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6001", + "defence_animation": "0", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "1827", + "name": "Gargoyle", + "examine": "Flies like a rock.", + "lifepoints": "105", + "attack_level": "75", + "strength_level": "105", + "defence_level": "107", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "9454", + "defence_animation": "9455", + "death_animation": "1518", + "magic_animation": "1516", + "range_animation": "1516", + "slayer_exp": "105", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "1828", + "name": "Giant frog", + "examine": "It didn't get that big eating flies!", + "lifepoints": "100", + "attack_level": "45", + "strength_level": "45", + "defence_level": "60", + "range_level": "32", + "bonuses": "10,10,10,10,10,10,1,10,10,10,10,37,0,0,0", + "attack_speed": "6", + "melee_animation": "1793", + "defence_animation": "1794", + "death_animation": "1795", + "magic_animation": "1793", + "range_animation": "1793", + "weakness": "1", + "safespot": null + }, + { + "id": "1829", + "name": "Big frog", + "examine": "It didn't get that big eating flies.", + "lifepoints": "37", + "attack_level": "1", + "strength_level": "1", + "defence_level": "26", + "range_level": "26", + "respawn_delay": "60", + "melee_animation": "1793", + "defence_animation": "0", + "death_animation": "1795", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "safespot": null + }, + { + "id": "1831", + "name": "Cave slime", + "examine": "A foul-smelling blob of protoplasm.", + "lifepoints": "27", + "attack_level": "1", + "strength_level": "1", + "defence_level": "19", + "range_level": "19", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "1789", + "defence_animation": "0", + "death_animation": "1792", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "slayer_task": "18", + "slayer_exp": "25", + "poisonous": "true", + "clue_level": "0", + "safespot": null + }, + { + "id": "1832", + "name": "Cave bug", + "examine": "A nasty crawling critter.", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "6", + "range_level": "6", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6079", + "defence_animation": "0", + "death_animation": "6082", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "15", + "slayer_exp": "5", + "safespot": null + }, + { + "id": "1833", + "name": "Cave bug larva", + "examine": "A little", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1834", + "name": "Candle seller", + "examine": "Has an odd smell about him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1840", + "name": "Dwarven Engineer", + "examine": "A short angry guy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1842", + "name": "Khorvak, a dwarven engineer", + "examine": "The little guy is having trouble standing up right.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1843", + "name": "Dwarven Ferryman", + "examine": "It's probably you who will be paying the ferryman.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1844", + "name": "Dwarven Ferryman", + "examine": "It's probably you who will be paying the ferryman.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1850", + "name": "Arzinian Avatar of Strength", + "examine": "It is the avatar of the Arzinian Being of Bordanzan", + "lifepoints": "114", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "melee_animation": "1840", + "defence_animation": "0", + "death_animation": "1841", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "1851", + "name": "Arzinian Avatar of Strength", + "lifepoints": "110", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1840", + "defence_animation": "1842", + "death_animation": "1843", + "aggressive": "true", + "safespot": null + }, + { + "id": "1852", + "name": "Arzinian Avatar of Strength", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1840", + "defence_animation": "1842", + "death_animation": "1843", + "aggressive": "true", + "safespot": null + }, + { + "id": "1853", + "name": "Arzinian Avatar of Ranging", + "examine": "It is the avatar of the Arzinian Being of Bordanzan", + "lifepoints": "114", + "attack_level": "30", + "strength_level": "30", + "defence_level": "40", + "range_level": "40", + "melee_animation": "1843", + "defence_animation": "0", + "death_animation": "1841", + "magic_animation": "0", + "range_animation": "1843", + "weakness": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "1854", + "name": "Arzinian Avatar of Ranging", + "lifepoints": "110", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1840", + "defence_animation": "1842", + "death_animation": "1843", + "aggressive": "true", + "safespot": null + }, + { + "id": "1855", + "name": "Arzinian Avatar of Ranging", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1840", + "defence_animation": "1842", + "death_animation": "1843", + "aggressive": "true", + "safespot": null + }, + { + "id": "1856", + "name": "Arzinian Avatar of Magic", + "examine": "It is the avatar of the Arzinian Being of Bordanzan", + "lifepoints": "114", + "attack_level": "30", + "strength_level": "30", + "defence_level": "40", + "range_level": "1", + "magic_level": "40", + "melee_animation": "1844", + "defence_animation": "0", + "death_animation": "1841", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "aggressive": "true", + "safespot": null + }, + { + "id": "1857", + "name": "Arzinian Avatar of Magic", + "lifepoints": "110", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1840", + "defence_animation": "1842", + "death_animation": "1843", + "aggressive": "true", + "safespot": null + }, + { + "id": "1858", + "name": "Arzinian Avatar of Magic", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1840", + "defence_animation": "1842", + "death_animation": "1843", + "aggressive": "true", + "safespot": null + }, + { + "id": "1859", + "name": "Arzinian Being of Bordanzan", + "examine": "It's the Arzinian Being", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1861", + "name": "Ranged Tutor", + "examine": "Nemarti looks ready to teach you about ranged combat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1863", + "name": "Drunken Ali", + "examine": "Drunk man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1864", + "name": "Ali The barman", + "examine": "A hassled looking barman.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1865", + "name": "Ali the Kebab seller", + "examine": "A kebab seller.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1866", + "name": "Market seller", + "examine": "A market stall keeper.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1867", + "name": "Ali the Camel Man", + "examine": "Ali the discount animal seller.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1868", + "name": "Street urchin", + "examine": "A mischievous looking child.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1871", + "name": "Ali the Hag", + "examine": "An old Hag named Alice.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1872", + "name": "Ali the Snake Charmer", + "examine": "A snake charmer.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "1873", + "name": "Ali the Camel", + "examine": "A foul tempered ugly lumpy yellow horse prone to spitting.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1874", + "name": "Desert snake", + "examine": "A slithering serpent.", + "lifepoints": "8", + "attack_level": "4", + "strength_level": "4", + "defence_level": "6", + "range_level": "6", + "respawn_delay": "60", + "melee_animation": "275", + "defence_animation": "0", + "death_animation": "278", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "1875", + "name": "Snake", + "examine": "A toothless old Snake.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "1885", + "name": "Bandit champion", + "examine": "A very tough-looking bandit.", + "lifepoints": "55", + "attack_level": "39", + "strength_level": "39", + "defence_level": "39", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "1886", + "name": "Cowardly Bandit", + "examine": "Probably the weakest bandit in the world ....ever.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1902", + "name": "Ali the Operator", + "examine": "Smooth operator.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "1904", + "name": "Menaphite Thug", + "examine": "Menaphite thug.", + "lifepoints": "41", + "attack_level": "29", + "strength_level": "29", + "defence_level": "29", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1905", + "name": "Menaphite Thug", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "1906", + "name": "Tough Guy", + "examine": "Tough looking Menaphite.", + "lifepoints": "114", + "attack_level": "39", + "strength_level": "39", + "defence_level": "39", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "1911", + "name": "Desert Phoenix", + "examine": "Definitely not a chicken.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1913", + "name": "Kamil", + "examine": "A tough-looking criminal.", + "lifepoints": "50", + "attack_level": "20", + "strength_level": "55", + "defence_level": "20", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "412", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "412", + "range_animation": "412", + "safespot": null + }, + { + "id": "1914", + "name": "Dessous", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "1915", + "name": "Dessous", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "1917", + "name": "Bandit shopkeeper", + "examine": "I guess he sells what he steals...?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1918", + "name": "Archaeologist", + "examine": "Hardened by the cutthroat world of archaeology.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1919", + "name": "Stranger", + "examine": "Very mysterious looking...", + "lifepoints": "82", + "attack_level": "58", + "strength_level": "58", + "defence_level": "58", + "range_level": "1", + "melee_animation": "377", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "1921", + "name": "Bartender", + "examine": "Looks like a rough-and-ready type.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1926", + "name": "Bandit", + "examine": "A tough-looking criminal.", + "lifepoints": "65", + "attack_level": "30", + "strength_level": "70", + "defence_level": "30", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "412", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "412", + "range_animation": "412", + "safespot": null + }, + { + "id": "1931", + "name": "Bandit", + "examine": "This is an NPC.", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "100", + "attack_speed": "5", + "melee_animation": "412", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "1935", + "name": "Ice troll", + "examine": "An ice troll.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1936", + "name": "Ice troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "91", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1937", + "name": "Ice troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "91", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1938", + "name": "Ice troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "91", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1939", + "name": "Ice troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "91", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1940", + "name": "Ice troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "91", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1941", + "name": "Ice troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "91", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "1942", + "name": "Ice troll", + "examine": "Brrrrr...he must be cold!", + "lifepoints": "91", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "83", + "safespot": null + }, + { + "id": "1951", + "name": "Ice wolf", + "examine": "Not a man's best friend.", + "lifepoints": "72", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "30", + "bonuses": "40,120,150,150,150,40,130,75,0,0,0,0,0,0,0", + "respawn_delay": "28", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "aggressive": "true", + "safespot": null + }, + { + "id": "1952", + "name": "Ice wolf", + "examine": "Not a man's best friend.", + "lifepoints": "72", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "30", + "bonuses": "40,120,150,150,150,40,130,75,0,0,0,0,0,0,0", + "respawn_delay": "28", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "aggressive": "true", + "safespot": null + }, + { + "id": "1953", + "name": "Ice wolf", + "examine": "Not a man's best friend.", + "lifepoints": "72", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "30", + "bonuses": "40,120,150,150,150,40,130,75,0,0,0,0,0,0,0", + "respawn_delay": "28", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "aggressive": "true", + "safespot": null + }, + { + "id": "1954", + "name": "Ice wolf", + "examine": "Not a man's best friend.", + "lifepoints": "72", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "30", + "bonuses": "40,120,150,150,150,40,130,75,0,0,0,0,0,0,0", + "respawn_delay": "28", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "aggressive": "true", + "safespot": null + }, + { + "id": "1955", + "name": "Ice wolf", + "examine": "Not a man's best friend.", + "lifepoints": "72", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "30", + "bonuses": "40,120,150,150,150,40,130,75,0,0,0,0,0,0,0", + "respawn_delay": "28", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "aggressive": "true", + "safespot": null + }, + { + "id": "1956", + "name": "Ice wolf", + "examine": "Not a man's best friend.", + "lifepoints": "72", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "30", + "bonuses": "40,120,150,150,150,40,130,75,0,0,0,0,0,0,0", + "respawn_delay": "28", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "aggressive": "true", + "safespot": null + }, + { + "id": "1958", + "name": "Mummy", + "examine": "Highly flammable!", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "5549", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1961", + "name": "Mummy", + "examine": "A tightly-wrapped monster.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "5549", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "1962", + "name": "Mummy", + "examine": "Spooky", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "poison_immune": "true", + "melee_animation": "5549", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1963", + "name": "Mummy", + "examine": "A victim of poor first aid.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "poison_immune": "true", + "melee_animation": "5549", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1964", + "name": "Mummy", + "examine": "But who's the daddy?", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "5549", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1965", + "name": "Mummy", + "examine": "A tightly-wrapped monster.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "5549", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1967", + "name": "Mummy", + "examine": "A victim of poor first aid.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "5549", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "1969", + "name": "Scarabs", + "examine": "I think they're some kind of beetle...", + "lifepoints": "88", + "attack_level": "62", + "strength_level": "62", + "defence_level": "62", + "range_level": "1", + "melee_animation": "1948", + "defence_animation": "0", + "death_animation": "1946", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "70", + "poisonous": "true", + "safespot": null + }, + { + "id": "1972", + "name": "Rasolo", + "examine": "A wandering merchant.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "safespot": null + }, + { + "id": "1973", + "name": "Giant skeleton", + "examine": "A giant skeleton.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "melee_animation": "5499", + "defence_animation": "0", + "death_animation": "5503", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "safespot": null + }, + { + "id": "1976", + "name": "Shadow Hound", + "examine": "Looks hungry!", + "lifepoints": "68", + "attack_level": "48", + "strength_level": "48", + "defence_level": "48", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6565", + "defence_animation": "0", + "death_animation": "6564", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "27", + "safespot": null + }, + { + "id": "1977", + "name": "Fareed", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "799", + "defence_animation": "434", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "1978", + "name": "Slave", + "examine": "A malnourished worker.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1979", + "name": "Slave", + "examine": "A malnourished worker.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1980", + "name": "Embalmer", + "examine": "A strange-smelling merchant.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1981", + "name": "Carpenter", + "examine": "A block of a man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1988", + "name": "Priest", + "examine": "Preach my brother!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "1991", + "name": "Possessed Priest", + "examine": "He has a dangerous glint in his eye.", + "lifepoints": "57", + "attack_level": "30", + "strength_level": "30", + "defence_level": "40", + "range_level": "40", + "respawn_delay": "60", + "melee_animation": "429", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "1993", + "name": "Crocodile", + "lifepoints": "63", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7588", + "defence_animation": "7590", + "death_animation": "7591", + "slayer_exp": "62", + "aggressive": "true", + "safespot": null + }, + { + "id": "1994", + "name": "Jackal", + "examine": "He has had his day.", + "lifepoints": "100", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6568", + "defence_animation": "0", + "death_animation": "6567", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "27", + "aggressive": "true", + "safespot": null + }, + { + "id": "1995", + "name": "Locust", + "examine": "Obnoxious", + "lifepoints": "34", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "2015", + "defence_animation": "0", + "death_animation": "2013", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "1997", + "name": "Plague frog", + "examine": "A very smelly frog.", + "lifepoints": "42", + "attack_level": "15", + "strength_level": "15", + "defence_level": "15", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1021", + "defence_animation": "0", + "death_animation": "1022", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "1998", + "name": "Plague cow", + "examine": "I might give the burgers a miss in this town.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "20", + "safespot": null + }, + { + "id": "1999", + "name": "Plague cow", + "examine": "I don't fancy eating any part of this.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "20", + "safespot": null + }, + { + "id": "2001", + "name": "Scarab swarm", + "examine": "I think they're some kind of beetle.", + "lifepoints": "900", + "attack_level": "9", + "strength_level": "9", + "defence_level": "9", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "2", + "melee_animation": "1948", + "defence_animation": "0", + "death_animation": "1946", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "70", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "2015", + "name": "Mummy", + "examine": "This mummy looks like it means business!", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5554", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "2016", + "name": "Mummy", + "examine": "An irate warrior-mummy.", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5554", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "2017", + "name": "Mummy", + "examine": "This mummy looks like it means business!", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5554", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "2018", + "name": "Mummy", + "examine": "An irate mummy.", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5554", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "2019", + "name": "Mummy", + "examine": "A wizened old warrior.", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5554", + "defence_animation": "0", + "death_animation": "5555", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "2021", + "name": "Light creature", + "examine": "A shimmering creature of blue light.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2024", + "name": "Strange Old Man", + "examine": "Wonder how long he's been here...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2025", + "name": "Ahrim the Blighted", + "examine": "A vengeful spirit corrupted by dark magic.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "100", + "range_level": "1", + "magic_level": "100", + "bonuses": "68,68,68,73,-19,103,85,117,73,0,0,68,0,0,0", + "attack_speed": "6", + "melee_animation": "1162", + "defence_animation": "420", + "death_animation": "7197", + "magic_animation": "1162", + "range_animation": "1162", + "start_gfx": "155", + "projectile": "156", + "end_gfx": "157", + "weakness": "3", + "combat_style": "2", + "aggressive": "true", + "start_height": "96", + "safespot": null + }, + { + "id": "2026", + "name": "Dharok the Wretched", + "examine": "A vengeful spirit corrupted by dark magic.", + "lifepoints": "100", + "attack_level": "100", + "strength_level": "100", + "defence_level": "100", + "range_level": "1", + "magic_level": "1", + "bonuses": "105,105,105,-58,-18,252,250,244,-11,249,0,105,0,0,0", + "respawn_delay": "0", + "attack_speed": "7", + "melee_animation": "2066", + "defence_animation": "2063", + "death_animation": "7197", + "magic_animation": "2066", + "range_animation": "2066", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "2027", + "name": "Guthan the Infested", + "examine": "A vengeful spirit corrupted by dark magic.", + "lifepoints": "100", + "attack_level": "100", + "strength_level": "100", + "defence_level": "100", + "range_level": "1", + "magic_level": "1", + "bonuses": "75,75,75,-50,-19,259,247,241,-11,-250,0,75,0,0,0", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "2080", + "defence_animation": "2079", + "death_animation": "7197", + "magic_animation": "2080", + "range_animation": "2080", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "2028", + "name": "Karil the Tainted", + "examine": "A vengeful spirit corrupted by dark magic.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "100", + "range_level": "100", + "magic_level": "1", + "bonuses": "0,0,0,-26,134,79,71,90,106,100,0,0,0,0,0", + "respawn_delay": "16", + "attack_speed": "4", + "melee_animation": "2075", + "defence_animation": "424", + "death_animation": "7197", + "magic_animation": "2075", + "range_animation": "2075", + "projectile": "27", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "2029", + "name": "Torag the Corrupted", + "examine": "A vengeful spirit corrupted by dark magic.", + "lifepoints": "100", + "attack_level": "100", + "strength_level": "100", + "defence_level": "100", + "range_level": "1", + "magic_level": "1", + "bonuses": "72,72,72,-33,-11,221,235,222,0,221,0,72,0,0,0", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "2068", + "defence_animation": "404", + "death_animation": "7197", + "magic_animation": "2068", + "range_animation": "2068", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "2030", + "name": "Verac the Defiled", + "examine": "A vengeful spirit corrupted by dark magic.", + "lifepoints": "100", + "attack_level": "100", + "strength_level": "100", + "defence_level": "100", + "range_level": "1", + "magic_level": "1", + "bonuses": "72,72,72,-42,-14,227,230,221,0,225,72,0,0,0,0", + "attack_speed": "5", + "melee_animation": "2062", + "defence_animation": "2063", + "death_animation": "7197", + "magic_animation": "2062", + "range_animation": "2062", + "weakness": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "2031", + "name": "Bloodworm", + "examine": "I think I should keep my distance..", + "lifepoints": "44", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "45", + "magic_level": "45", + "bonuses": "50,60,65,55,70,10,30,20,0,0,0,0,0,0,0", + "respawn_delay": "26", + "attack_speed": "6", + "melee_animation": "2070", + "defence_animation": "2072", + "death_animation": "2073", + "magic_animation": "2070", + "range_animation": "2070", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "2032", + "name": "Crypt rat", + "examine": "A nasty little rodent.", + "lifepoints": "35", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "35", + "magic_level": "35", + "bonuses": "35,50,35,40,55,15,20,0,0,0,0,0,0,0,0", + "respawn_delay": "20", + "melee_animation": "240", + "defence_animation": "241", + "death_animation": "243", + "magic_animation": "240", + "range_animation": "240", + "weakness": "9", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2033", + "name": "Giant crypt rat", + "examine": "A nasty overgrown rodent.", + "lifepoints": "70", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "bonuses": "45,75,68,78,75,20,45,25,0,0,0,0,0,0,0", + "respawn_delay": "30", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "4933", + "range_animation": "4933", + "weakness": "9", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2034", + "name": "Crypt spider", + "examine": "Incey wincey.", + "lifepoints": "60", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "45", + "magic_level": "45", + "bonuses": "30,55,35,65,65,20,50,5,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6249", + "defence_animation": "6250", + "death_animation": "6251", + "magic_animation": "6249", + "range_animation": "6249", + "weakness": "7", + "slayer_task": "76", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "2035", + "name": "Giant crypt spider", + "examine": "Not very incey wincey.", + "lifepoints": "80", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "bonuses": "55,80,45,85,75,25,60,25,0,0,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "5", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "magic_animation": "5327", + "range_animation": "5327", + "weakness": "7", + "slayer_task": "76", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "2036", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "72", + "attack_level": "62", + "strength_level": "50", + "defence_level": "62", + "range_level": "62", + "magic_level": "62", + "bonuses": "45,20,20,20,70,20,55,75,76,20,60,20,0,0,0", + "respawn_delay": "20", + "melee_animation": "5487", + "defence_animation": "5513", + "death_animation": "5491", + "magic_animation": "5487", + "range_animation": "5487", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "2037", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "72", + "attack_level": "62", + "strength_level": "62", + "defence_level": "62", + "range_level": "62", + "magic_level": "62", + "bonuses": "45,20,20,20,65,20,50,69,68,22,65,23,0,0,0", + "respawn_delay": "20", + "melee_animation": "5487", + "defence_animation": "5513", + "death_animation": "5491", + "magic_animation": "5487", + "range_animation": "5487", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "2044", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2045", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2046", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2047", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2048", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2049", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2050", + "name": "Skogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2051", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2052", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2053", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2054", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2055", + "name": "Zogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2056", + "name": "Skogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2057", + "name": "Skogre", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2058", + "name": "Hole in the wall", + "examine": "What could be hiding in that crack in the wall?", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "87", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2060", + "name": "Slash Bash", + "lifepoints": "103", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "2067", + "name": "Fishing spot", + "examine": "I can see fish swimming in the water.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2069", + "name": "Cave goblin miner", + "examine": "This one is slacking off.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2070", + "name": "Cave goblin miner", + "examine": "This one is slacking off.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2071", + "name": "Cave goblin miner", + "examine": "This one is slacking off.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2072", + "name": "Cave goblin miner", + "examine": "This one is slacking off.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2073", + "name": "Cave goblin guard", + "examine": "He protects the miners.", + "lifepoints": "21", + "attack_level": "15", + "strength_level": "15", + "defence_level": "15", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2074", + "name": "Cave goblin guard", + "examine": "He protects the miners.", + "lifepoints": "21", + "attack_level": "15", + "strength_level": "15", + "defence_level": "15", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2075", + "name": "Cave goblin miner", + "examine": "He's working hard!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2076", + "name": "Cave goblin miner", + "examine": "He's working hard!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2077", + "name": "Cave goblin miner", + "examine": "He's working hard!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2078", + "name": "Cave goblin miner", + "examine": "He's working hard!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "6008", + "death_animation": "6003", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2082", + "name": "Sigmund", + "examine": "Advisor to the Duke of Lumbridge.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2091", + "name": "Secretary", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "aggressive": "true", + "safespot": null + }, + { + "id": "2092", + "name": "Purple Pewter Secretary", + "examine": "The head secretary of the Purple Pewter mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2093", + "name": "Yellow Fortune Secretary", + "examine": "The head secretary of the Yellow Fortune mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2094", + "name": "Blue Opal Secretary", + "examine": "The head secretary of the Blue Opal mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2095", + "name": "Green Gemstone Secretary", + "examine": "The head secretary of the Green Gemstone mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2096", + "name": "White Chisel Secretary", + "examine": "The head secretary of the White Chisel mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2097", + "name": "Silver Cog Secretary", + "examine": "The head secretary of the Silver Cog mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2098", + "name": "Brown Engine Secretary", + "examine": "The head secretary of the Brown Engine mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2100", + "name": "Purple Pewter Director", + "examine": "One of the leaders of the business Consortium", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2101", + "name": "Blue Opal Director", + "examine": "One of the leaders of the business Consortium", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2102", + "name": "Yellow Fortune Director", + "examine": "One of the leaders of the business Consortium", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2103", + "name": "Green Gemstone Director", + "examine": "One of the leaders of the business Consortium", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2104", + "name": "White Chisel Director", + "examine": "One of the leaders of the business Consortium", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2105", + "name": "Silver Cog Director", + "examine": "One of the leaders of the business Consortium", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2106", + "name": "Brown Engine Director", + "examine": "One of the leaders of the business Consortium", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2109", + "name": "Trader", + "examine": "A trader for the Purple Pewter mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2110", + "name": "Trader", + "examine": "A trader for the Purple Pewter mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2111", + "name": "Trader", + "examine": "A trader for the Blue Opal mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2112", + "name": "Trader", + "examine": "A trader for the Blue Opal mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2113", + "name": "Trader", + "examine": "A trader for the Yellow Fortune mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2114", + "name": "Trader", + "examine": "A trader for the Yellow Fortune mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2115", + "name": "Trader", + "examine": "A trader for the Green Gemstone mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2116", + "name": "Trader", + "examine": "A trader for the Green Gemstone mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2117", + "name": "Trader", + "examine": "A trader for the White Chisel mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2118", + "name": "Trader", + "examine": "A trader for the White Chisel mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2119", + "name": "Trader", + "examine": "A trader for the Silver Cog mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2120", + "name": "Trader", + "examine": "A trader for the Silver Cog mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2121", + "name": "Trader", + "examine": "A trader for the Brown Engine mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2122", + "name": "Trader", + "examine": "A trader for the Brown Engine mining company.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2127", + "name": "Trade Referee", + "examine": "He is regulating the flow of goods on the trade floor and maintaining order.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2130", + "name": "Black Guard", + "examine": "A member of the Black Guard", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "2131", + "name": "Black Guard", + "examine": "A member of the Black Guard", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "2132", + "name": "Black Guard", + "examine": "A member of the Black Guard", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "2133", + "name": "Black Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "2134", + "name": "Black Guard Berserker", + "examine": "An elite member of the Black Guard.", + "lifepoints": "54", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "safespot": null + }, + { + "id": "2135", + "name": "Black Guard Berserker", + "examine": "An elite member of the Black Guard.", + "lifepoints": "54", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "safespot": null + }, + { + "id": "2136", + "name": "Black Guard Berserker", + "examine": "An elite member of the Black Guard.", + "lifepoints": "54", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "safespot": null + }, + { + "id": "2138", + "name": "Gnome traveller", + "examine": "A gnome traveller, visiting Keldagrim.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "force_talk": "Buying low-level skilling items!", + "safespot": null + }, + { + "id": "2140", + "name": "Dromund's cat", + "examine": "Very protective of his master... and his property.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2141", + "name": "Blasidar the sculptor", + "examine": "Makes sculptures.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2163", + "name": "Banker", + "examine": "A rather personable banker lady.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2164", + "name": "Banker", + "examine": "A rather serious old fella.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2165", + "name": "Librarian", + "examine": "He takes care of the library and its many books.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2167", + "name": "Customer", + "examine": "A customer looking for books.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2168", + "name": "Customer", + "examine": "Looks like a human traveler visiting the library.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2170", + "name": "Rind the gardener", + "examine": "He tends to the plants in the palace garden.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2171", + "name": "Factory Manager", + "examine": "Looks after the factory.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2172", + "name": "Factory Worker", + "examine": "Works hard at whatever it is he does.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2173", + "name": "Factory Worker", + "examine": "Works hard at whatever it is he does.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2174", + "name": "Factory Worker", + "examine": "Works hard at whatever it is he does.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2175", + "name": "Factory Worker", + "examine": "Works hard at whatever it is he does.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2177", + "name": "Inn Keeper", + "examine": "A rich landlord", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2178", + "name": "Barmaid", + "examine": "These Dwarf ladies are so attractive!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2180", + "name": "Cart conductor", + "examine": "He makes sure the carts don't run anyone over.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2181", + "name": "Cart conductor", + "examine": "He makes sure the carts don't run anyone over.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2182", + "name": "Cart conductor", + "examine": "He makes sure the carts don't run anyone over.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2183", + "name": "Cart conductor", + "examine": "He makes sure the carts don't run anyone over.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2184", + "name": "Cart conductor", + "examine": "He makes sure the carts don't run anyone over.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2185", + "name": "Cart conductor", + "examine": "Remember: don't drink and ride in mine carts.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2186", + "name": "Cart conductor", + "examine": "Keeps the line clear of traffic.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2187", + "name": "Rowdy dwarf", + "examine": "A loud", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2205", + "name": "Dwarven Boatman", + "examine": "You cannot see his ship", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2207", + "name": "Dwarven Miner", + "examine": "He carries a heavy load.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2234", + "name": "Master Farmer", + "examine": "A master at farming.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2235", + "name": "Master Farmer", + "examine": "A master at farming.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2236", + "name": "Market Guard", + "examine": "He guards the Draynor Market stalls from thieves.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "2237", + "name": "Gee", + "examine": "A local farmer. He may be able to provide some useful information.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2240", + "name": "Pig", + "examine": "There to help me make my bids.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2241", + "name": "Piglet", + "examine": "There to help me make my bids.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2242", + "name": "Piglet", + "examine": "Porcine.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2244", + "name": "Lumbridge Guide", + "examine": "He provides new players with useful information.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2245", + "name": "Khazard trooper", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "401", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "2246", + "name": "Khazard trooper", + "examine": "It's one of General Khazard's warriors.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "429", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "2247", + "name": "Gnome troop", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "190", + "defence_animation": "193", + "death_animation": "196", + "combat_style": "1", + "safespot": null + }, + { + "id": "2248", + "name": "Gnome troop", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "190", + "defence_animation": "193", + "death_animation": "196", + "combat_style": "1", + "safespot": null + }, + { + "id": "2256", + "name": "Paladin", + "lifepoints": "66", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "425", + "death_animation": "836", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2262", + "name": "Dark mage", + "examine": "An initiate of Zamorak.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2263", + "name": "Abyssal leech", + "examine": "A blood-drinking denizen of the abyss.", + "lifepoints": "74", + "attack_level": "1", + "strength_level": "1", + "defence_level": "52", + "range_level": "52", + "respawn_delay": "60", + "attack_speed": "3", + "melee_animation": "2181", + "defence_animation": "0", + "death_animation": "2183", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_exp": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2264", + "name": "Abyssal guardian", + "examine": "It seems to have eyes in the back of its head...", + "lifepoints": "50", + "attack_level": "65", + "strength_level": "96", + "defence_level": "65", + "range_level": "135", + "magic_level": "57", + "attack_speed": "6", + "melee_animation": "2186", + "defence_animation": "2188", + "death_animation": "2189", + "magic_animation": "2186", + "range_animation": "2186", + "weakness": "3", + "slayer_exp": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2265", + "name": "Abyssal walker", + "examine": "Apparently walks the abyss.", + "lifepoints": "95", + "attack_level": "60", + "strength_level": "116", + "defence_level": "55", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2192", + "defence_animation": "2193", + "death_animation": "2194", + "magic_animation": "2192", + "range_animation": "2192", + "weakness": "8", + "slayer_exp": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2267", + "name": "Rogue Guard", + "examine": "Sparkles the Tinsel Snake", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2269", + "name": "Rogue Guard", + "examine": "A snowman armed with a holly bow.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2271", + "name": "Emerald Benedict", + "examine": "A snowman armed with an ice sword.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2272", + "name": "Spin Blades", + "examine": "A snowman armed with a winter staff.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2274", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2275", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2276", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2277", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2278", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2279", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2280", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2281", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2285", + "name": "Sir Leye", + "lifepoints": "21", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "400", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "2288", + "name": "Miss Cheevers", + "examine": "An observer for the Temple Knights.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2289", + "name": "Ms. Hynn Terprett", + "examine": "An observer for the Temple Knights.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2291", + "name": "Rug Merchant", + "examine": "A carpet merchant.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2292", + "name": "Rug Merchant", + "examine": "A carpet merchant.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2293", + "name": "Rug Merchant", + "examine": "A man who deals in rugs.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2294", + "name": "Rug Merchant", + "examine": "A man who deals in rugs.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2301", + "name": "Monkey", + "examine": "Perhaps our oldest relatives.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "2309", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2310", + "name": "Cow calf", + "examine": "Young, but still beefy.", + "lifepoints": "6", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "5850", + "death_animation": "5851", + "magic_animation": "5849", + "range_animation": "5849", + "weakness": "8", + "slayer_task": "20", + "slayer_exp": "8", + "combat_audio": "366,368,367", + "safespot": null + }, + { + "id": "2311", + "name": "Sheepdog", + "examine": "Farmer/sheep liaison officer. Go on - give the dog a bone!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2312", + "name": "Rooster", + "examine": "He rules the", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2313", + "name": "Chicken", + "examine": "Yep. Definitely a chicken.", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "6", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "5387", + "range_animation": "5387", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2314", + "name": "Chicken", + "examine": "Yep. Definitely a chicken.", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "6", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "5387", + "range_animation": "5387", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2315", + "name": "Chicken", + "examine": "Yep. Definitely a chicken.", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "18", + "attack_speed": "6", + "melee_animation": "5387", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "5387", + "range_animation": "5387", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2316", + "name": "Pig", + "examine": "Swine.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2317", + "name": "Pig", + "examine": "Porker.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2318", + "name": "Piglet", + "examine": "Hog.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2319", + "name": "Piglet", + "examine": "Porcine.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2320", + "name": "Piglet", + "examine": "He has a certain bovine aroma.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2329", + "name": "Muncher", + "examine": "Only the Grim Reaper would have a pet like this.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2333", + "name": "Vasquen", + "examine": "Perhaps this farmer might look after your crops for you.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2342", + "name": "Fayeth", + "examine": "Perhaps this gardener might look after your crops for you.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2354", + "name": "Banker", + "examine": "He can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2355", + "name": "Banker", + "examine": "She can look after my money.", + "lifepoints": "476", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_style": "2", + "safespot": null + }, + { + "id": "2359", + "name": "Elf warrior", + "examine": "I don't wanna be at the wrong end of that pike.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "31", + "clue_level": "2", + "safespot": null + }, + { + "id": "2360", + "name": "Elf warrior", + "examine": "I don't wanna be at the wrong end of that pike.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "31", + "clue_level": "2", + "safespot": null + }, + { + "id": "2361", + "name": "Elf warrior", + "examine": "He looks pretty handy with that bow.", + "lifepoints": "91", + "attack_level": "1", + "strength_level": "1", + "defence_level": "64", + "range_level": "64", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "start_gfx": "250", + "projectile": "249", + "weakness": "2", + "slayer_task": "31", + "combat_style": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "2362", + "name": "Elf warrior", + "examine": "He looks pretty handy with that bow.", + "lifepoints": "91", + "attack_level": "1", + "strength_level": "1", + "defence_level": "64", + "range_level": "64", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "start_gfx": "250", + "projectile": "249", + "weakness": "2", + "slayer_task": "31", + "combat_style": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "2372", + "name": "Head mourner", + "examine": "A Mourner showing his true identity.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2373", + "name": "Mourner", + "examine": "A Mourner", + "lifepoints": "87", + "attack_level": "61", + "strength_level": "61", + "defence_level": "61", + "range_level": "1", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "31", + "aggressive": "true", + "safespot": null + }, + { + "id": "2397", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2398", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2399", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2400", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2401", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2402", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2423", + "name": "Chaos dwarf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "2436", + "name": "Jarvald", + "lifepoints": "10", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "9232", + "defence_animation": "9231", + "death_animation": "9230", + "safespot": null + }, + { + "id": "2439", + "name": "Askeladden", + "examine": "Looks like a wanna be Fremennik.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2443", + "name": "Door-support", + "examine": "This support is propping the door closed.", + "lifepoints": "0", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2452", + "name": "Giant Rock Crab", + "examine": "No one likes crabs... especially really big ones!", + "lifepoints": "97", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "2368", + "defence_animation": "0", + "death_animation": "1314", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "2453", + "name": "Boulder", + "examine": "Heavy rock!", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2454", + "name": "Dagannoth spawn", + "examine": "A teeny-tiny horror from the ocean depths...", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "0", + "death_animation": "1342", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "24", + "aggressive": "true", + "safespot": null + }, + { + "id": "2455", + "name": "Dagannoth", + "examine": "A spiny horror from the ocean depths...", + "lifepoints": "95", + "attack_level": "90", + "strength_level": "90", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "294", + "slayer_exp": "100", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2456", + "name": "Dagannoth", + "examine": "It's an NPC.", + "lifepoints": "70", + "attack_level": "90", + "strength_level": "90", + "defence_level": "60", + "range_level": "90", + "respawn_delay": "60", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "294", + "slayer_exp": "0", + "combat_style": "1", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2457", + "name": "Wallasalki", + "examine": "A fearsome magical creature from the deep..", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "2365", + "defence_animation": "2366", + "death_animation": "2367", + "magic_animation": "2365", + "combat_style": "2", + "aggressive": "true", + "spell_id": "48", + "safespot": null + }, + { + "id": "2463", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "19", + "attack_level": "5", + "strength_level": "5", + "defence_level": "20", + "range_level": "5", + "magic_level": "5", + "bonuses": "25,85,105,75,103,85,65,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2464", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "40", + "attack_level": "10", + "strength_level": "10", + "defence_level": "40", + "range_level": "10", + "magic_level": "10", + "bonuses": "35,105,125,95,128,105,85,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2465", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "60", + "attack_level": "15", + "strength_level": "15", + "defence_level": "50", + "range_level": "15", + "magic_level": "15", + "bonuses": "35,185,185,155,188,125,165,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2466", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "80", + "attack_level": "45", + "strength_level": "45", + "defence_level": "60", + "range_level": "45", + "magic_level": "25", + "bonuses": "45,235,235,205,238,145,165,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2467", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "105", + "attack_level": "45", + "strength_level": "45", + "defence_level": "70", + "range_level": "45", + "magic_level": "35", + "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2468", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "120", + "attack_level": "45", + "strength_level": "45", + "defence_level": "90", + "range_level": "45", + "magic_level": "45", + "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "weakness": "9", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2476", + "name": "Rick Turpentine", + "examine": "A Retired Highwayman", + "lifepoints": "10", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "20", + "magic_level": "30", + "bonuses": "30,20,10,20,20,30,30,10,20,10,30,30,20,30,20", + "attack_speed": "5", + "melee_animation": "4230", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "4230", + "range_animation": "4230", + "combat_style": "1", + "safespot": null + }, + { + "id": "2477", + "name": "Quiz Master", + "examine": "Apparently a master of quizzes!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2479", + "name": "Evil Bob", + "examine": "Hey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2481", + "name": "Servant", + "examine": "Servant of Evil Bob.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2482", + "name": "Giant bat", + "examine": "Annoying flappy thing.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "8", + "safespot": null + }, + { + "id": "2489", + "name": "Bush snake", + "examine": "A slithering serpent that likes to hide in the bush.", + "lifepoints": "87", + "attack_level": "1", + "strength_level": "1", + "defence_level": "61", + "range_level": "61", + "poison_amount": "11", + "respawn_delay": "60", + "melee_animation": "275", + "defence_animation": "0", + "death_animation": "278", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "poisonous": "true", + "aggressive": "true", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "2490", + "name": "Bush snake", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "poison_amount": "11", + "respawn_delay": "60", + "melee_animation": "275", + "defence_animation": "276", + "death_animation": "278", + "poisonous": "true", + "aggressive": "true", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "2491", + "name": "Jungle spider", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "2492", + "name": "Jungle spider", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "2493", + "name": "Large mosquito", + "examine": "A flying bloodsucker.", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "63", + "range_level": "63", + "melee_animation": "2397", + "defence_animation": "0", + "death_animation": "2398", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "safespot": null + }, + { + "id": "2494", + "name": "Mosquito swarm", + "examine": "A swarm of three highly agile mosquitoes.", + "lifepoints": "94", + "attack_level": "1", + "strength_level": "1", + "defence_level": "66", + "range_level": "66", + "melee_animation": "2397", + "defence_animation": "0", + "death_animation": "2398", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "safespot": null + }, + { + "id": "2495", + "name": "Mosquito swarm", + "examine": "A swarm of five highly agile mosquitoes.", + "lifepoints": "97", + "attack_level": "1", + "strength_level": "1", + "defence_level": "68", + "range_level": "68", + "melee_animation": "2397", + "defence_animation": "0", + "death_animation": "2398", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "safespot": null + }, + { + "id": "2496", + "name": "Tribesman", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "2497", + "name": "Tribesman", + "examine": "A vicious warrior.", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "poisonous": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2499", + "name": "Broodoo victim", + "examine": "An undead victim of some ancient murderous ritual; his skin appears deep green.", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "2501", + "name": "Broodoo victim", + "examine": "An undead victim of some ancient murderous ritual; his skin appears pale yellow.", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "2503", + "name": "Broodoo victim", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "810", + "defence_animation": "425", + "death_animation": "836", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "2539", + "name": "Cap'n Hand", + "examine": "He used to swashbuckle his away across the seven seas.", + "lifepoints": "10", + "attack_level": "30", + "strength_level": "10", + "defence_level": "10", + "range_level": "30", + "magic_level": "20", + "bonuses": "10,30,20,30,10,20,15,30,10,30,15,20,20,0,0", + "attack_speed": "5", + "melee_animation": "4230", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "4230", + "range_animation": "4230", + "combat_style": "1", + "safespot": null + }, + { + "id": "2547", + "name": "Chaos druid", + "examine": "A crazy, evil druid.", + "lifepoints": "20", + "attack_level": "20", + "strength_level": "20", + "defence_level": "10", + "range_level": "10", + "magic_level": "20", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "start_gfx": "105", + "projectile": "106", + "end_gfx": "107", + "weakness": "3", + "safespot": null + }, + { + "id": "2549", + "name": "Ali the dyer", + "examine": "A colourful character.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2553", + "name": "Blast Furnace Foreman", + "examine": "Looks after the blast furnace.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2571", + "name": "Market Guard", + "lifepoints": "23", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "400", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "2574", + "name": "Bank guard", + "examine": "He's guarding the bank.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2588", + "name": "Brother Althric", + "examine": "A holy man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2591", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2592", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2593", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2594", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2595", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2596", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2597", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2598", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2599", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2600", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2601", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2602", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2603", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2604", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,120,120,120,130,20,50,45,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2605", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,120,120,120,130,20,50,45,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2606", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,80,56,80,80,100,60,50,45,45,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "projectile": "442", + "combat_style": "1", + "safespot": null + }, + { + "id": "2607", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,120,120,120,130,20,50,45,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2608", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,120,120,120,130,20,50,45,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2609", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,80,56,80,80,100,60,50,45,45,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "projectile": "442", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "2610", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2611", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2612", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2613", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2614", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2615", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2616", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2627", + "name": "Tz-Kih", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "2628", + "name": "Tz-Kih", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "2629", + "name": "Tz-Kek", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "2630", + "name": "Tz-Kek", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "2631", + "name": "Tok-Xil", + "examine": "The Tok-Xil fires deadly spines out of its arm", + "lifepoints": "114", + "attack_level": "1", + "strength_level": "1", + "defence_level": "80", + "range_level": "80", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "2634", + "name": "Miss Schism", + "examine": "A busy-body who loves a bit of gossip.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2641", + "name": "Dragonkin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "2674", + "name": "Thief", + "examine": "Known for his light-fingered qualities.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "2675", + "name": "Man", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2677", + "name": "Highwayman", + "examine": "He holds up passers by.", + "lifepoints": "13", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "799", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "799", + "range_animation": "799", + "weakness": "7", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2678", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2679", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2680", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2681", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2682", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "2", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "3102,3104,3103", + "safespot": null + }, + { + "id": "2683", + "name": "Hengel", + "lifepoints": "7", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "2685", + "name": "Hobgoblin", + "examine": "An ugly smelly creature.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "164", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "164", + "range_animation": "164", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2686", + "name": "Hobgoblin", + "examine": "An ugly smelly creature.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "164", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "164", + "range_animation": "164", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2687", + "name": "Hobgoblin", + "examine": "An ugly smelly creature.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "164", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "164", + "range_animation": "164", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2688", + "name": "Hobgoblin", + "examine": "An ugly smelly creature, with a spear.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "163", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "163", + "range_animation": "163", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2689", + "name": "Frog", + "examine": "Didn't the mage say this procedure was totally safe?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2690", + "name": "Jack Seagull", + "examine": "A salty seafarer. Needs a wash.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2691", + "name": "Longbow Ben", + "examine": "A strange man with a strange name. Probably a strange past", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2693", + "name": "Duck", + "examine": "She quackers.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "3468", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "7", + "water_npc": "true", + "safespot": null + }, + { + "id": "2694", + "name": "Duckling", + "examine": "Mini quackers.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "3468", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "7", + "aggressive": "true", + "water_npc": "true", + "safespot": null + }, + { + "id": "2695", + "name": "Pirate", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2696", + "name": "Thief", + "examine": "Known for his light-fingered qualities.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "2697", + "name": "Mugger", + "examine": "He doesn't look so happy now he's in jail.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "2698", + "name": "Black knight", + "examine": "A dark-hearted knight.", + "lifepoints": "34", + "attack_level": "24", + "strength_level": "24", + "defence_level": "24", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "2699", + "name": "Guard", + "examine": "He's guarding the prison.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2700", + "name": "Guard", + "examine": "A prison guard.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2701", + "name": "Guard", + "examine": "A prison guard.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2702", + "name": "Guard", + "examine": "A prison guard.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2703", + "name": "Guard", + "examine": "A prison guard.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2704", + "name": "Guard", + "examine": "He's asleep.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2705", + "name": "Guard", + "examine": "Keeping an eye out for suspicious activity.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2706", + "name": "Crab", + "examine": "No one likes crabs...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2707", + "name": "Seagull", + "examine": "A sea bird.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2709", + "name": "Fire wizard", + "examine": "Caution: HOT!", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "18", + "range_level": "1", + "magic_level": "18", + "respawn_delay": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "2553", + "magic_animation": "711", + "start_gfx": "99", + "projectile": "100", + "end_gfx": "101", + "start_height": "80", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "safespot": null + }, + { + "id": "2710", + "name": "Water wizard", + "examine": "Hydro-power!", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "14", + "range_level": "1", + "magic_level": "14", + "respawn_delay": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "2553", + "magic_animation": "711", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "safespot": null + }, + { + "id": "2711", + "name": "Earth wizard", + "examine": "His hands are covered in mud. At least", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "16", + "range_level": "1", + "magic_level": "16", + "respawn_delay": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "2553", + "magic_animation": "711", + "start_gfx": "96", + "projectile": "97", + "end_gfx": "98", + "start_height": "80", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "safespot": null + }, + { + "id": "2712", + "name": "Air wizard", + "examine": "At least he looks solid enough to fight.", + "lifepoints": "17", + "attack_level": "1", + "strength_level": "1", + "defence_level": "12", + "range_level": "1", + "magic_level": "12", + "respawn_delay": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "2553", + "magic_animation": "711", + "range_animation": "0", + "start_gfx": "90", + "start_height": "80", + "projectile": "91", + "end_gfx": "92", + "weakness": "3", + "combat_style": "2", + "safespot": null + }, + { + "id": "2714", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2715", + "name": "Skeleton", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "2716", + "name": "Ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "25", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2717", + "name": "Skeleton mage", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "2718", + "name": "Betty", + "examine": "She'll store my items for me.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2725", + "name": "Otto Godblessed", + "examine": "A wise barbarian", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2728", + "name": "Monk of Entrana", + "examine": "Holy looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2729", + "name": "Monk of Entrana", + "examine": "Holy looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2731", + "name": "Monk of Entrana", + "examine": "Holy looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2732", + "name": "Master Crafter", + "examine": "He works in the Crafting Guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2733", + "name": "Master Crafter", + "examine": "He wanders around the Crafting Guild pretending to be working.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2734", + "name": "Tz-Kih", + "examine": "Hangs out in caves.", + "lifepoints": "10", + "attack_level": "30", + "strength_level": "27", + "defence_level": "11", + "range_level": "1", + "bonuses": "150,22,22,22,22,11,0,0,0,0,0,0,0,0,0", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "9232", + "defence_animation": "9231", + "death_animation": "9230", + "magic_animation": "9232", + "range_animation": "9232", + "aggressive": "true", + "safespot": null + }, + { + "id": "2735", + "name": "Tz-Kih", + "examine": "Hangs out in caves.", + "lifepoints": "10", + "attack_level": "30", + "strength_level": "27", + "defence_level": "11", + "range_level": "1", + "bonuses": "150,22,22,22,22,11,0,0,0,0,0,0,0,0,0", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "9232", + "defence_animation": "9231", + "death_animation": "9230", + "magic_animation": "9232", + "range_animation": "9232", + "aggressive": "true", + "safespot": null + }, + { + "id": "2736", + "name": "Tz-Kek", + "examine": "Looks like living lava...", + "lifepoints": "20", + "attack_level": "60", + "strength_level": "60", + "defence_level": "22", + "range_level": "20", + "magic_level": "20", + "bonuses": "80,45,45,45,45,22,0,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9233", + "defence_animation": "9235", + "death_animation": "9234", + "magic_animation": "9233", + "range_animation": "9233", + "aggressive": "true", + "safespot": null + }, + { + "id": "2737", + "name": "Tz-Kek", + "examine": "Looks like living lava...", + "lifepoints": "20", + "attack_level": "60", + "strength_level": "60", + "defence_level": "22", + "range_level": "20", + "magic_level": "20", + "bonuses": "80,45,45,45,45,22,0,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9233", + "defence_animation": "9235", + "death_animation": "9234", + "magic_animation": "9233", + "range_animation": "9233", + "aggressive": "true", + "safespot": null + }, + { + "id": "2738", + "name": "Tz-Kek", + "examine": "Looks like living lava...", + "lifepoints": "10", + "attack_level": "30", + "strength_level": "30", + "defence_level": "11", + "range_level": "1", + "bonuses": "60,22,22,22,22,11,0,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9233", + "defence_animation": "9235", + "death_animation": "9234", + "magic_animation": "9233", + "range_animation": "9233", + "safespot": null + }, + { + "id": "2739", + "name": "Tok-Xil", + "examine": "I don't like the look of those spines...", + "lifepoints": "40", + "attack_level": "80", + "strength_level": "80", + "defence_level": "45", + "range_level": "80", + "bonuses": "80,90,86,90,90,90,45,55,26,55,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9245", + "defence_animation": "9242", + "death_animation": "9239", + "magic_animation": "9245", + "range_animation": "9245", + "weakness": "4", + "safespot": null + }, + { + "id": "2740", + "name": "Tok-Xil", + "examine": "I don't like the look of those spines...", + "lifepoints": "40", + "attack_level": "80", + "strength_level": "80", + "defence_level": "45", + "range_level": "80", + "bonuses": "80,90,86,90,90,90,45,55,26,55,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9245", + "defence_animation": "9242", + "death_animation": "9239", + "magic_animation": "9245", + "range_animation": "9245", + "weakness": "4", + "safespot": null + }, + { + "id": "2741", + "name": "Yt-MejKot", + "examine": "Holy reptile...", + "lifepoints": "80", + "attack_level": "100", + "strength_level": "100", + "defence_level": "90", + "range_level": "1", + "bonuses": "100,180,180,180,180,90,97,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9252", + "defence_animation": "9249", + "death_animation": "9257", + "magic_animation": "9252", + "range_animation": "9252", + "aggressive": "true", + "safespot": null + }, + { + "id": "2742", + "name": "Yt-MejKot", + "examine": "Holy reptile...", + "lifepoints": "80", + "attack_level": "100", + "strength_level": "100", + "defence_level": "90", + "range_level": "1", + "bonuses": "100,180,180,180,180,90,97,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9252", + "defence_animation": "9249", + "death_animation": "9257", + "magic_animation": "9252", + "range_animation": "9252", + "aggressive": "true", + "safespot": null + }, + { + "id": "2743", + "name": "Ket-Zek", + "examine": "That's one hot dog!", + "lifepoints": "160", + "attack_level": "150", + "strength_level": "150", + "defence_level": "180", + "range_level": "1", + "magic_level": "150", + "bonuses": "180,180,280,280,280,250,140,152,131,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9265", + "defence_animation": "9268", + "death_animation": "9269", + "magic_animation": "9265", + "range_animation": "9265", + "safespot": null + }, + { + "id": "2744", + "name": "Ket-Zek", + "examine": "That's one hot dog!", + "lifepoints": "160", + "attack_level": "150", + "strength_level": "150", + "defence_level": "180", + "range_level": "1", + "magic_level": "150", + "bonuses": "180,180,280,280,280,250,140,152,131,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9265", + "defence_animation": "9268", + "death_animation": "9269", + "magic_animation": "9265", + "range_animation": "9265", + "safespot": null + }, + { + "id": "2745", + "name": "TzTok-Jad", + "examine": "This is going to hurt...", + "lifepoints": "250", + "attack_level": "640", + "strength_level": "960", + "defence_level": "480", + "range_level": "960", + "magic_level": "480", + "bonuses": "0,0,0,60,0,0,0,0,0,0,0,0,0,0,0", + "attack_speed": "8", + "agg_radius": "64", + "melee_animation": "9277", + "defence_animation": "9278", + "death_animation": "9279", + "magic_animation": "9277", + "range_animation": "9277", + "weakness": "10", + "slayer_exp": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2746", + "name": "Yt-HurKot", + "examine": "Mini Menace.", + "lifepoints": "40", + "attack_level": "75", + "strength_level": "75", + "defence_level": "75", + "range_level": "1", + "bonuses": "100,110,110,110,110,60,110,30,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9252", + "defence_animation": "9253", + "death_animation": "9257", + "magic_animation": "9252", + "range_animation": "9252", + "aggressive": "true", + "safespot": null + }, + { + "id": "2759", + "name": "null", + "examine": "She can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2776", + "name": "Woman", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "2779", + "name": "Ranger", + "examine": "A Ranger of the Temple Knights.", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2782", + "name": "Shadow", + "examine": "A shadow.", + "lifepoints": "100", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "2738", + "defence_animation": "0", + "death_animation": "2739", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "2783", + "name": "Dark beast", + "examine": "From a darker dimension.", + "lifepoints": "220", + "attack_level": "140", + "strength_level": "160", + "defence_level": "120", + "range_level": "1", + "magic_level": "160", + "bonuses": "0,0,0,0,0,30,40,100,90,100,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "2731", + "defence_animation": "2732", + "death_animation": "2733", + "magic_animation": "2731", + "range_animation": "2731", + "weakness": "4", + "slayer_task": "25", + "slayer_exp": "225", + "aggressive": "true", + "safespot": null + }, + { + "id": "2785", + "name": "Slave", + "examine": "Digging.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2786", + "name": "Slave", + "examine": "Digging.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2787", + "name": "Slave", + "examine": "Confused.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2790", + "name": "Sergeant Damien", + "examine": "Drill Sergeant from heck!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2792", + "name": "Tramp", + "examine": "A man down on his luck.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2801", + "name": "Ogre", + "examine": "An angry Ogre in a funny hat.", + "lifepoints": "48", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "359", + "defence_animation": "360", + "death_animation": "361", + "magic_animation": "359", + "range_animation": "359", + "aggressive": "true", + "safespot": null + }, + { + "id": "2802", + "name": "Gnome Coach", + "examine": "They just call him 'Coach'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2803", + "name": "Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "55", + "range_level": "55", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "slayer_exp": "40", + "aggressive": "true", + "safespot": null + }, + { + "id": "2804", + "name": "Desert Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "2805", + "name": "Desert Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "2806", + "name": "Desert Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "2807", + "name": "Small Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "15", + "attack_level": "1", + "strength_level": "1", + "defence_level": "15", + "range_level": "15", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "slayer_exp": "15", + "safespot": null + }, + { + "id": "2808", + "name": "Small Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "15", + "attack_level": "1", + "strength_level": "1", + "defence_level": "15", + "range_level": "15", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "aggressive": "true", + "safespot": null + }, + { + "id": "2809", + "name": "Al the Camel", + "examine": "A camel who has the soul of a poet.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2810", + "name": "Elly the Camel", + "examine": "A camel whose love is unrequited.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2811", + "name": "Ollie the Camel", + "examine": "A camel who wants to fly some day.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2812", + "name": "Cam the Camel", + "examine": "A camel who likes to rest.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2815", + "name": "Neferti the Camel", + "examine": "A camel who wants to see the world.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2825", + "name": "Pirate Pete", + "examine": "A shifty-looking character.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2826", + "name": "Pirate Pete", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2827", + "name": "Captain Braindeath", + "examine": "A shabby-looking leader.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2828", + "name": "50% Luke", + "examine": "Most of an angry", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2830", + "name": "Captain Donnie", + "examine": "I wonder if it was all the 'rum' that pickled him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2831", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2832", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2833", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2834", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2835", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2836", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2837", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2838", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2839", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2840", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2841", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2842", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2843", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2844", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2845", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2846", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2847", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2848", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2849", + "name": "Evil spirit", + "examine": "The pun was intended.", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "40", + "magic_level": "40", + "respawn_delay": "60", + "melee_animation": "2804", + "defence_animation": "0", + "death_animation": "2805", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "2850", + "name": "Fever spider", + "examine": "A bunch of legs, eyes and teeth.", + "lifepoints": "40", + "attack_level": "60", + "strength_level": "30", + "defence_level": "40", + "range_level": "1", + "bonuses": "0,0,0,0,0,20,15,10,15,15,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "5319", + "defence_animation": "0", + "death_animation": "5321", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "76", + "slayer_exp": "40", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "2851", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2852", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2853", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2854", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2855", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2856", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2857", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2858", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2863", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2866", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2869", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2878", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2880", + "name": "Dagannoth fledgeling", + "examine": "A knee-high horror from the ocean depths...", + "lifepoints": "74", + "attack_level": "52", + "strength_level": "52", + "defence_level": "52", + "range_level": "1", + "melee_animation": "1579", + "defence_animation": "0", + "death_animation": "1581", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "24", + "aggressive": "true", + "safespot": null + }, + { + "id": "2881", + "name": "Dagannoth Supreme", + "examine": "The Dagannoth King responsible for the death of Bukalla.", + "lifepoints": "255", + "attack_level": "255", + "strength_level": "255", + "defence_level": "128", + "range_level": "255", + "magic_level": "255", + "bonuses": "0,0,0,0,0,10,10,10,255,550,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "movement_radius": "8", + "agg_radius": "8", + "melee_animation": "2855", + "defence_animation": "2852", + "death_animation": "2856", + "projectile": "475", + "combat_style": "1", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "2882", + "name": "Dagannoth Prime", + "examine": "A legendary Dagannoth King, rumoured to fly on the North winds.", + "lifepoints": "255", + "attack_level": "255", + "strength_level": "255", + "defence_level": "255", + "range_level": "1", + "magic_level": "255", + "bonuses": "0,0,0,0,0,255,255,255,255,10,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "movement_radius": "8", + "agg_radius": "8", + "melee_animation": "2854", + "defence_animation": "2852", + "death_animation": "2856", + "combat_style": "2", + "aggressive": "true", + "clue_level": "2", + "spell_id": "48", + "safespot": null + }, + { + "id": "2883", + "name": "Dagannoth Rex", + "examine": "Firstborn of the legendary Dagannoth Kings.", + "lifepoints": "255", + "attack_level": "255", + "strength_level": "255", + "defence_level": "255", + "range_level": "255", + "magic_level": "1", + "bonuses": "0,0,0,0,0,255,255,255,10,255,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "movement_radius": "8", + "agg_radius": "8", + "melee_animation": "2853", + "defence_animation": "2852", + "death_animation": "2856", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "2884", + "name": "Wallasalki", + "examine": "A fearsome magical creature from the deep..", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "2365", + "defence_animation": "2366", + "death_animation": "2367", + "magic_animation": "2365", + "slayer_exp": "0", + "combat_style": "2", + "aggressive": "true", + "spell_id": "48", + "safespot": null + }, + { + "id": "2885", + "name": "Giant Rock Crab", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "1312", + "defence_animation": "1313", + "death_animation": "1314", + "aggressive": "true", + "safespot": null + }, + { + "id": "2886", + "name": "Boulder", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "safespot": null + }, + { + "id": "2887", + "name": "Dagannoth", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "288", + "combat_style": "1", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2888", + "name": "Dagannoth", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "288", + "combat_style": "1", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2889", + "name": "Rock lobster", + "examine": "It wasn't a rock... It was a rock lobster!", + "lifepoints": "150", + "attack_level": "80", + "strength_level": "135", + "defence_level": "70", + "range_level": "1", + "attack_speed": "8", + "melee_animation": "2860", + "defence_animation": "2861", + "death_animation": "2862", + "magic_animation": "2860", + "range_animation": "2860", + "weakness": "7", + "safespot": null + }, + { + "id": "2892", + "name": "Spinolyp", + "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "magic_level": "65", + "bonuses": "70,50,60,50,10,60,30,10,60,60,70,50,0,0,0", + "respawn_delay": "55", + "attack_speed": "6", + "agg_radius": "12", + "melee_animation": "2868", + "defence_animation": "2869", + "death_animation": "2866", + "magic_animation": "2866", + "range_animation": "2866", + "projectile": "294", + "slayer_exp": "0", + "combat_style": "2", + "aggressive": "true", + "spell_id": "14", + "safespot": null + }, + { + "id": "2894", + "name": "Spinolyp", + "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "magic_level": "65", + "bonuses": "70,50,60,50,10,60,30,10,60,60,70,50,0,0,0", + "respawn_delay": "55", + "attack_speed": "6", + "agg_radius": "12", + "melee_animation": "2868", + "defence_animation": "2869", + "death_animation": "2866", + "magic_animation": "2866", + "range_animation": "2866", + "projectile": "294", + "combat_style": "2", + "aggressive": "true", + "spell_id": "14", + "safespot": null + }, + { + "id": "2896", + "name": "Spinolyp", + "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "60", + "defence_level": "1", + "range_level": "70", + "magic_level": "65", + "bonuses": "70,50,60,50,10,60,30,10,60,60,70,50,0,0,0", + "respawn_delay": "55", + "attack_speed": "6", + "agg_radius": "12", + "melee_animation": "2868", + "defence_animation": "2869", + "death_animation": "2866", + "magic_animation": "2866", + "range_animation": "2866", + "projectile": "294", + "slayer_exp": "0", + "combat_style": "2", + "aggressive": "true", + "spell_id": "14", + "safespot": null + }, + { + "id": "2919", + "name": "Agrith Naar", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "aggressive": "true", + "safespot": null + }, + { + "id": "2931", + "name": "Ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "25", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2941", + "name": "The Beast", + "examine": "Who ate all the rats?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2945", + "name": "Bones", + "examine": "Lovely", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2948", + "name": "Hooknosed Jack", + "examine": "Obviously punches above his weight.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2949", + "name": "Jimmy Dazzler", + "examine": "Looks rich like an actor of sorts.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2950", + "name": "The Face", + "examine": "Once beautiful", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2952", + "name": "Smokin' Joe", + "examine": "What is he?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2958", + "name": "Silver merchant", + "examine": "Looks fairly well fed.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2962", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2963", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2964", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2965", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2966", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2967", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2968", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2969", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2970", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2971", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2972", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2973", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2980", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2981", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2982", + "name": "King rat", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2984", + "name": "Pusskins", + "examine": "Not a soft touch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2986", + "name": "Captain Tom", + "examine": "A not-so friendly", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2988", + "name": "Mittens", + "examine": "A fully grown feline.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2990", + "name": "Topsy", + "examine": "Cute and fluffy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2997", + "name": "Gertrude's cat", + "examine": "A friendly feline?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2998", + "name": "Gambler", + "examine": "Very well to do. I wonder what he's doing here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3001", + "name": "Gambler", + "examine": "Rich.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3002", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3003", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3004", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3005", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3006", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3007", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3008", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3009", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3010", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3011", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3012", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3013", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3014", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3015", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3016", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3017", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3018", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3021", + "name": "Tool leprechaun", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3022", + "name": "Genie", + "examine": "Phenomenal cosmic powers", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3026", + "name": "Black golem", + "examine": "An animated clay statue.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2917", + "defence_animation": "0", + "death_animation": "2919", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3027", + "name": "White golem", + "examine": "An animated clay statue.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "2917", + "defence_animation": "0", + "death_animation": "2919", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "3028", + "name": "Grey golem", + "examine": "An animated clay statue.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "2917", + "defence_animation": "0", + "death_animation": "2919", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3029", + "name": "Ghaslor the Elder", + "examine": "The oldest man in Nardah.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3030", + "name": "Ali the Carter", + "examine": "A water salesman from Pollnivneach.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3040", + "name": "Awusah the Mayor", + "examine": "The Mayor of Nardah.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3042", + "name": "Poltenip", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "3043", + "name": "Radat", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "3044", + "name": "Shiratti the Custodian", + "examine": "Custodian of the shrine to Elidinis.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3046", + "name": "Nardah Banker", + "examine": "A banker of Nardah.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3051", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3052", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3053", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3054", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3055", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3056", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3057", + "name": "Earth Warrior Champion", + "examine": "Champion of the earth warriors.", + "lifepoints": "72", + "attack_level": "51", + "strength_level": "51", + "defence_level": "51", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2951", + "defence_animation": "0", + "death_animation": "2946", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "3058", + "name": "Giant Champion", + "examine": "Champion of the giants.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6368", + "defence_animation": "0", + "death_animation": "6369", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_exp": "35", + "aggressive": "true", + "safespot": null + }, + { + "id": "3059", + "name": "Ghoul Champion", + "examine": "Champion of the ghouls.", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "50", + "aggressive": "true", + "safespot": null + }, + { + "id": "3060", + "name": "Goblin Champion", + "examine": "Champion of the goblins.", + "lifepoints": "17", + "attack_level": "6", + "strength_level": "6", + "defence_level": "12", + "range_level": "1", + "magic_level": "12", + "melee_animation": "6188", + "defence_animation": "0", + "death_animation": "6190", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3061", + "name": "Hobgoblin Champion", + "examine": "Champion of the hobgoblins.", + "lifepoints": "40", + "attack_level": "14", + "strength_level": "14", + "defence_level": "28", + "range_level": "28", + "respawn_delay": "60", + "defence_animation": "0", + "death_animation": "2958", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3062", + "name": "Imp Champion", + "examine": "Champion of the imps.", + "lifepoints": "10", + "attack_level": "7", + "strength_level": "7", + "defence_level": "7", + "range_level": "7", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5285", + "defence_animation": "0", + "death_animation": "172", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "3063", + "name": "Jogre Champion", + "examine": "Champion of the jogres.", + "lifepoints": "77", + "attack_level": "54", + "strength_level": "54", + "defence_level": "54", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2100", + "defence_animation": "0", + "death_animation": "8576", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "3064", + "name": "Lesser Demon Champion", + "examine": "Champion of the lesser demons.", + "lifepoints": "115", + "attack_level": "1", + "strength_level": "1", + "defence_level": "81", + "range_level": "1", + "magic_level": "81", + "respawn_delay": "60", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_exp": "79", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "3065", + "name": "Skeleton Champion", + "examine": "Champion of the skeletons.", + "lifepoints": "28", + "attack_level": "10", + "strength_level": "10", + "defence_level": "20", + "range_level": "20", + "respawn_delay": "60", + "melee_animation": "5512", + "defence_animation": "0", + "death_animation": "5514", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "combat_style": "1", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3066", + "name": "Zombies Champion", + "examine": "Champion of the zombies.", + "lifepoints": "37", + "attack_level": "26", + "strength_level": "26", + "defence_level": "26", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5581", + "defence_animation": "0", + "death_animation": "5575", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "3067", + "name": "Leon d'Cour", + "lifepoints": "123", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7049", + "defence_animation": "7050", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "3068", + "name": "Skeletal Wyvern", + "examine": "A very dangerous pile of animated Wyvern bones.", + "lifepoints": "200", + "attack_level": "125", + "strength_level": "116", + "defence_level": "120", + "range_level": "120", + "magic_level": "125", + "bonuses": "0,0,0,0,0,140,90,90,80,140,0,0,0,0,0", + "attack_speed": "6", + "agg_radius": "6", + "melee_animation": "2985", + "defence_animation": "2983", + "death_animation": "2987", + "magic_animation": "2985", + "range_animation": "2989", + "start_gfx": "499", + "projectile": "500", + "end_gfx": "501", + "weakness": "9", + "slayer_task": "95", + "slayer_exp": "210", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "3069", + "name": "Skeletal Wyvern", + "examine": "A very dangerous pile of animated Wyvern bones.", + "lifepoints": "200", + "attack_level": "125", + "strength_level": "116", + "defence_level": "120", + "range_level": "120", + "magic_level": "125", + "bonuses": "0,0,0,0,0,140,90,90,80,140,0,0,0,0,0", + "attack_speed": "6", + "agg_radius": "6", + "melee_animation": "2985", + "defence_animation": "2983", + "death_animation": "2987", + "magic_animation": "2985", + "range_animation": "2989", + "start_gfx": "499", + "projectile": "500", + "end_gfx": "501", + "weakness": "9", + "slayer_task": "95", + "slayer_exp": "210", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "3070", + "name": "Skeletal Wyvern", + "examine": "A very dangerous pile of animated Wyvern bones.", + "lifepoints": "200", + "attack_level": "125", + "strength_level": "116", + "defence_level": "120", + "range_level": "120", + "magic_level": "125", + "bonuses": "0,0,0,0,0,140,90,90,80,140,0,0,0,0,0", + "attack_speed": "6", + "agg_radius": "6", + "melee_animation": "2985", + "defence_animation": "2983", + "death_animation": "2987", + "magic_animation": "2985", + "range_animation": "2989", + "start_gfx": "499", + "projectile": "500", + "end_gfx": "501", + "weakness": "9", + "slayer_task": "95", + "slayer_exp": "210", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "3071", + "name": "Skeletal Wyvern", + "examine": "A very dangerous pile of animated Wyvern bones.", + "lifepoints": "200", + "attack_level": "125", + "strength_level": "116", + "defence_level": "120", + "range_level": "120", + "magic_level": "125", + "bonuses": "0,0,0,0,0,140,90,90,80,140,0,0,0,0,0", + "attack_speed": "6", + "agg_radius": "6", + "melee_animation": "2985", + "defence_animation": "2983", + "death_animation": "2987", + "magic_animation": "2985", + "range_animation": "2989", + "start_gfx": "499", + "projectile": "500", + "end_gfx": "501", + "weakness": "9", + "slayer_task": "95", + "slayer_exp": "210", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "3072", + "name": "Ice giant", + "examine": "He's got icicles in his beard.", + "lifepoints": "70", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4672", + "defence_animation": "0", + "death_animation": "4673", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "47", + "slayer_exp": "70", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "3073", + "name": "Ice warrior", + "examine": "A cold-hearted elemental warrior.", + "lifepoints": "59", + "attack_level": "39", + "strength_level": "1", + "defence_level": "39", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "451", + "defence_animation": "404", + "death_animation": "843", + "magic_animation": "451", + "range_animation": "451", + "slayer_exp": "59", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "3074", + "name": "Monk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3075", + "name": "Monk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3079", + "name": "Monk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3080", + "name": "Monk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3089", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3090", + "name": "", + "examine": "A mighty warrior", + "lifepoints": "24", + "attack_level": "17", + "strength_level": "17", + "defence_level": "17", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7048", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3091", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3094", + "name": "Flying Book", + "examine": "The book moves by itself!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3097", + "name": "Entrance Guardian", + "examine": "A guardian of the arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3098", + "name": "Telekinetic Guardian", + "examine": "A guardian of the arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3099", + "name": "Alchemy Guardian", + "examine": "A guardian of the arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3100", + "name": "Enchantment Guardian", + "examine": "A guardian of the arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3101", + "name": "Graveyard Guardian", + "examine": "A guardian of the arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3102", + "name": "Maze Guardian", + "examine": "A guardian of the arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3103", + "name": "Rewards Guardian", + "examine": "A guardian of the arena.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3104", + "name": "Charmed Warrior", + "examine": "Equipment that moves by itself!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3105", + "name": "Charmed Warrior", + "examine": "Equipment that moves by itself!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3106", + "name": "Charmed Warrior", + "examine": "Equipment that moves by itself!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3109", + "name": "Guard Captain", + "examine": "This guard looks rather drunk and has beer stains down his armour.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3121", + "name": "Balloon Animal", + "examine": "Looks after farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3122", + "name": "Balloon Animal", + "examine": "I saw the witchdoctor", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3123", + "name": "Simon Templeton", + "examine": "Looks like he's seen the inside of a few tombs.", + "lifepoints": "12", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "safespot": "0" + }, + { + "id": "3135", + "name": "Furnace grate", + "examine": "It seems to be blocked.", + "lifepoints": "0", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3150", + "name": "Knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3151", + "name": "Skeleton", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3153", + "name": "Harpie Bug Swarm", + "examine": "A swarm of bugs.", + "lifepoints": "64", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "respawn_delay": "60", + "melee_animation": "1584", + "defence_animation": "0", + "death_animation": "1585", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "42", + "slayer_exp": "25", + "combat_style": "1", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "3155", + "name": "Bill Teach", + "examine": "Bill Teach the pirate.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3167", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3168", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3169", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3170", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3171", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3172", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3173", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3174", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3175", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3176", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3177", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3178", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3179", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3180", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3181", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3182", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3183", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3184", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3185", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3186", + "name": "Pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3187", + "name": "Pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3188", + "name": "Pirate", + "examine": "Arghh matey!", + "lifepoints": "45", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,10,10,10,10,10,10,10,10,10", + "respawn_delay": "20", + "attack_speed": "5", + "defence_animation": "388", + "death_animation": "9055", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3189", + "name": "Pirate", + "examine": "Arghh matey!", + "lifepoints": "45", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,10,10,10,10,10,10,10,10,10", + "respawn_delay": "20", + "attack_speed": "5", + "defence_animation": "388", + "death_animation": "9055", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3190", + "name": "Pirate", + "examine": "Arghh matey!", + "lifepoints": "45", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,10,10,10,10,10,10,10,10,10", + "respawn_delay": "20", + "attack_speed": "5", + "defence_animation": "388", + "death_animation": "9055", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3191", + "name": "Pirate", + "examine": "Arghh matey!", + "lifepoints": "45", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,10,10,10,10,10,10,10,10,10", + "respawn_delay": "20", + "attack_speed": "5", + "defence_animation": "388", + "death_animation": "9055", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3192", + "name": "Pirate", + "examine": "Arghh matey!", + "lifepoints": "45", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,10,10,10,10,10,10,10,10,10", + "respawn_delay": "20", + "attack_speed": "5", + "defence_animation": "388", + "death_animation": "9055", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3193", + "name": "Pirate", + "examine": "Arghh matey!", + "lifepoints": "45", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,10,10,10,10,10,10,10,10,10", + "respawn_delay": "20", + "attack_speed": "5", + "defence_animation": "388", + "death_animation": "9055", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3194", + "name": "Pirate", + "examine": "Arghh matey!", + "lifepoints": "45", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,10,10,10,10,10,10,10,10,10", + "respawn_delay": "20", + "attack_speed": "5", + "defence_animation": "388", + "death_animation": "9055", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3195", + "name": "Pirate", + "examine": "Arghh matey!", + "lifepoints": "45", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,10,10,10,10,10,10,10,10,10", + "respawn_delay": "20", + "attack_speed": "5", + "defence_animation": "388", + "death_animation": "9055", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3196", + "name": "Pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "400", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3198", + "name": "Banker", + "examine": "He can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3199", + "name": "Banker", + "examine": "He can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3200", + "name": "Chaos Elemental", + "examine": "pUre A cHaOs of crEatuRe!", + "lifepoints": "250", + "attack_level": "270", + "strength_level": "270", + "defence_level": "270", + "range_level": "270", + "magic_level": "270", + "bonuses": "0,0,0,0,0,70,70,70,70,70,0,0,0,0,0", + "respawn_delay": "72", + "attack_speed": "5", + "movement_radius": "30", + "agg_radius": "16", + "melee_animation": "3146", + "defence_animation": "3149", + "death_animation": "3147", + "magic_animation": "5443", + "range_animation": "5443", + "start_gfx": "556", + "projectile": "557", + "end_gfx": "558", + "weakness": "4", + "aggressive": "true", + "safespot": "true" + }, + { + "id": "3201", + "name": "Killerwatt", + "lifepoints": "51", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "3", + "slayer_exp": "51", + "safespot": null + }, + { + "id": "3202", + "name": "Killerwatt", + "lifepoints": "51", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "3", + "slayer_exp": "51", + "safespot": null + }, + { + "id": "3203", + "name": "Storm Cloud", + "examine": "A very small storm!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3204", + "name": "Storm Cloud", + "examine": "A very small storm!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3216", + "name": "Mourner", + "examine": "A mourner", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3219", + "name": "Dwarf", + "examine": "Loves mining.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3220", + "name": "Dwarf", + "examine": "Loves mining.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3221", + "name": "Dwarf", + "examine": "Loves mining.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3222", + "name": "Drunken man", + "examine": "One of RuneScape's many citizens", + "lifepoints": "5", + "attack_level": "4", + "strength_level": "4", + "defence_level": "4", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "3223", + "name": "Man", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3224", + "name": "Man", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3225", + "name": "Man", + "examine": "One of RuneScape's many citizens. He looks worried about something.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3226", + "name": "Woman", + "lifepoints": "9", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "3227", + "name": "Woman", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "3228", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3229", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "18", + "attack_level": "1", + "strength_level": "1", + "defence_level": "13", + "range_level": "13", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "2075", + "weakness": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3230", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "395", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3231", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "18", + "attack_level": "1", + "strength_level": "1", + "defence_level": "13", + "range_level": "13", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3232", + "name": "Guard", + "examine": "Keeping an eye out for threats to the city.", + "lifepoints": "18", + "attack_level": "1", + "strength_level": "1", + "defence_level": "13", + "range_level": "13", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3233", + "name": "Guard", + "examine": "Keeping an eye out for threats to the city.", + "lifepoints": "18", + "attack_level": "1", + "strength_level": "1", + "defence_level": "13", + "range_level": "13", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3234", + "name": "Gardener", + "examine": "An old gardener.", + "lifepoints": "5", + "attack_level": "4", + "strength_level": "4", + "defence_level": "4", + "range_level": "1", + "melee_animation": "433", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "3235", + "name": "Apprentice workman", + "examine": "He's learning a trade.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3236", + "name": "Workman", + "examine": "A busy workman", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3237", + "name": "Cuffs", + "lifepoints": "7", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "3239", + "name": "Rusty", + "lifepoints": "7", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "3240", + "name": "Jeff", + "lifepoints": "7", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "3241", + "name": "Guard", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3242", + "name": "Dark wizard", + "examine": "A practicer of dark arts.", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "magic_level": "25", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "711", + "range_animation": "0", + "weakness": "4", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3243", + "name": "Dark wizard", + "examine": "A practicer of dark arts.", + "lifepoints": "38", + "attack_level": "1", + "strength_level": "1", + "defence_level": "27", + "range_level": "1", + "magic_level": "27", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "711", + "range_animation": "0", + "weakness": "4", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3244", + "name": "Dark wizard", + "examine": "A practicer of dark arts.", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "16", + "range_level": "1", + "magic_level": "16", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "711", + "range_animation": "0", + "weakness": "4", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3245", + "name": "Dark wizard", + "examine": "A practicer of dark arts.", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "16", + "range_level": "1", + "magic_level": "16", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "711", + "range_animation": "0", + "weakness": "4", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3246", + "name": "Barbarian", + "examine": "Alberich", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "2067", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3247", + "name": "Barbarian", + "examine": "Fafner", + "lifepoints": "18", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "7048", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "7048", + "range_animation": "7048", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3248", + "name": "Barbarian", + "examine": "Fasolt", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "2067", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3249", + "name": "Barbarian", + "examine": "Siegmund", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3250", + "name": "Barbarian", + "examine": "Siegfried", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "2067", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3251", + "name": "Barbarian", + "examine": "Lydspor", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "7048", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3252", + "name": "Barbarian", + "examine": "Hagen", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "2067", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3253", + "name": "Barbarian", + "examine": "Minarch", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3255", + "name": "Barbarian", + "examine": "Wotan", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3256", + "name": "Barbarian", + "examine": "Acelin", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3257", + "name": "Barbarian", + "examine": "Adelino", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "2067", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3258", + "name": "Barbarian", + "examine": "Adolpho", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3259", + "name": "Barbarian", + "examine": "Aitan", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3260", + "name": "Barbarian", + "examine": "Brunnhilde", + "lifepoints": "28", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3261", + "name": "Barbarian", + "examine": "Gutrune", + "lifepoints": "28", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3262", + "name": "Barbarian", + "examine": "Edelschwarz", + "lifepoints": "28", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3263", + "name": "Barbarian", + "examine": "Sieglinde", + "lifepoints": "20", + "attack_level": "22", + "strength_level": "20", + "defence_level": "22", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "428", + "defence_animation": "404", + "death_animation": "836", + "magic_animation": "428", + "range_animation": "428", + "weakness": "8", + "clue_level": "0", + "safespot": null + }, + { + "id": "3264", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3265", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3266", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3267", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "470,472,471", + "safespot": null + }, + { + "id": "3268", + "name": "Dwarf", + "examine": "A dwarven worker.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3269", + "name": "Dwarf", + "examine": "A dwarven worker.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3270", + "name": "Dwarf", + "examine": "A dwarven worker.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3271", + "name": "Dwarf", + "examine": "A dwarven worker.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3272", + "name": "Dwarf", + "examine": "A dwarven worker.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3273", + "name": "Dwarf", + "examine": "A dwarven worker.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3274", + "name": "Dwarf", + "examine": "A dwarven worker.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3275", + "name": "Dwarf", + "examine": "A dwarven worker.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3276", + "name": "Black Guard", + "examine": "A member of the Black Guard", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3277", + "name": "Black Guard", + "examine": "A member of the Black Guard", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3278", + "name": "Black Guard", + "examine": "A member of the Black Guard", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3279", + "name": "Black Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3280", + "name": "Engineering assistant", + "examine": "He looks busy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3282", + "name": "Engineer", + "examine": "He's building a cannon.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3283", + "name": "Squirrel", + "examine": "Bushy tail!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3286", + "name": "Raccoon", + "examine": "A raccoon.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3288", + "name": "Raccoon", + "examine": "A raccoon.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3291", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "11", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3293", + "name": "null", + "examine": "She'll store my items for me.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3294", + "name": "Dwarf", + "examine": "A dwarf who looks after the mining guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3295", + "name": "Dwarf", + "examine": "A dwarf who looks after the mining guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "3296", + "name": "Swan", + "examine": "A graceful bird.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3298", + "name": "Sweeper", + "examine": "Keeps this magic area tidy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "3299", + "name": "Martin the Master Gardener", + "examine": "A master at gardening.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3302", + "name": "Co-ordinator", + "examine": "Manages the fairies.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3304", + "name": "Fairy Godfather", + "examine": "I'm gonna make him an offer he can't refuse.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3307", + "name": "Gatekeeper", + "examine": "Guardian of the market gate.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3309", + "name": "Cow", + "examine": "Converts grass to beef.", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "5850", + "death_animation": "5851", + "magic_animation": "5849", + "range_animation": "5849", + "weakness": "8", + "slayer_task": "20", + "slayer_exp": "8", + "combat_audio": "369,371,370", + "safespot": null + }, + { + "id": "3313", + "name": "Tanglefoot", + "lifepoints": "102", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "safespot": null + }, + { + "id": "3319", + "name": "Baby tanglefoot", + "examine": "An animated shrub.", + "lifepoints": "58", + "attack_level": "1", + "strength_level": "1", + "defence_level": "41", + "range_level": "41", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "safespot": null + }, + { + "id": "3320", + "name": "Baby tanglefoot", + "examine": "An aggressive bush.", + "lifepoints": "58", + "attack_level": "1", + "strength_level": "1", + "defence_level": "41", + "range_level": "41", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "safespot": null + }, + { + "id": "3322", + "name": "Fairy chef", + "examine": "Likes to cook with mushrooms.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3327", + "name": "Jeremy Clerksin", + "examine": "Rather more tired than most.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3331", + "name": "Barfy Bill", + "examine": "Looks a little green around the gills.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3334", + "name": "Cavemouth", + "examine": "It's made of pure fire.", + "lifepoints": "1000", + "attack_level": "200", + "strength_level": "1500", + "defence_level": "500", + "range_level": "300", + "magic_level": "300", + "bonuses": "126,98,86,297,311,304,319,13,284,30,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "3340", + "name": "Giant Mole", + "examine": "Holy Mole-y!", + "lifepoints": "200", + "attack_level": "200", + "strength_level": "200", + "defence_level": "200", + "range_level": "1", + "magic_level": "200", + "bonuses": "0,0,0,0,0,60,80,100,80,60,0,0,0,0,0", + "respawn_delay": "56", + "attack_speed": "4", + "melee_animation": "3312", + "defence_animation": "3311", + "death_animation": "3310", + "magic_animation": "3312", + "range_animation": "3312", + "weakness": "7", + "safespot": null + }, + { + "id": "3341", + "name": "Baby Mole", + "examine": "I will call him", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "3344", + "name": "Fungi", + "examine": "A fun guy. No wait", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3345", + "name": "Fungi", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2775", + "death_animation": "2777", + "safespot": null + }, + { + "id": "3346", + "name": "Zygomite", + "examine": "A bouncy fungus.", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "42", + "range_level": "42", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "0", + "death_animation": "2777", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "slayer_task": "94", + "safespot": null + }, + { + "id": "3347", + "name": "Zygomite", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2775", + "death_animation": "2777", + "safespot": null + }, + { + "id": "3348", + "name": "White Knight", + "lifepoints": "53", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "8", + "melee_animation": "7049", + "defence_animation": "7050", + "death_animation": "836", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3349", + "name": "White Knight", + "lifepoints": "53", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "8", + "melee_animation": "7049", + "defence_animation": "7050", + "death_animation": "836", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3350", + "name": "White Knight", + "lifepoints": "53", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "8", + "melee_animation": "7049", + "defence_animation": "7050", + "death_animation": "836", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3366", + "name": "Evil Chicken", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "3367", + "name": "Evil Chicken", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "3368", + "name": "Evil Chicken", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "3369", + "name": "Evil Chicken", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "3370", + "name": "Evil Chicken", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "3371", + "name": "Evil Chicken", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "3375", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "117", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "0", + "melee_animation": "2299", + "defence_animation": "0", + "death_animation": "2301", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "slayer_task": "7", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "3376", + "name": "Baby black dragon", + "examine": "Young but still dangerous.", + "lifepoints": "50", + "attack_level": "80", + "strength_level": "80", + "defence_level": "42", + "range_level": "1", + "magic_level": "40", + "bonuses": "50,40,64,60,30,45,40,40,20,40,40,20,0,0,0", + "respawn_delay": "32", + "attack_speed": "5", + "melee_animation": "25", + "defence_animation": "26", + "death_animation": "28", + "magic_animation": "25", + "range_animation": "25", + "weakness": "3", + "slayer_task": "68", + "slayer_exp": "0", + "aggressive": "true", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "3378", + "name": "Evil Dave", + "examine": "He seems to like wearing black.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3382", + "name": "Hell-Rat", + "examine": "Vermin from the underworld.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "67", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3389", + "name": "Pirate Pete", + "examine": "A shifty-looking character.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3390", + "name": "Mountain Dwarf", + "examine": "He looks short and grumpy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "3391", + "name": "General Wartface", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3392", + "name": "General Bentnoze", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3393", + "name": "Lumbridge Guide", + "examine": "He provides new players with useful information.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3394", + "name": "Evil Dave", + "examine": "He seems to like wearing black.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3404", + "name": "null", + "examine": "Rutmir's assistant.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3406", + "name": "Icefiend", + "examine": "A small ice demon.", + "lifepoints": "171", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "46", + "aggressive": "true", + "clue_level": "0", + "safespot": null + }, + { + "id": "3407", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7218", + "defence_animation": "0", + "death_animation": "7219", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3408", + "name": "Guard", + "examine": "He tries to keep order around here.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "583", + "defence_animation": "0", + "death_animation": "7213", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3409", + "name": "Wild jade vine", + "examine": "A sentient plant - ready", + "lifepoints": "185", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "respawn_delay": "60", + "melee_animation": "7246", + "defence_animation": "0", + "death_animation": "7249", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "3410", + "name": "Wild jade vine", + "examine": "A sentient plant - ready", + "lifepoints": "185", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "respawn_delay": "60", + "melee_animation": "7246", + "defence_animation": "0", + "death_animation": "7249", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "3411", + "name": "Wild jade vine", + "examine": "A sentient plant - ready", + "lifepoints": "185", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "respawn_delay": "60", + "melee_animation": "7246", + "defence_animation": "0", + "death_animation": "7249", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "3412", + "name": "Wild jade vine", + "examine": "A sentient plant - ready", + "lifepoints": "185", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "respawn_delay": "60", + "melee_animation": "7246", + "defence_animation": "0", + "death_animation": "7249", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "3413", + "name": "Goblin Cook", + "examine": "He may be a funky cook", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3414", + "name": "Goblin Cook", + "examine": "More like a goblin cooked.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3415", + "name": "Goblin Cook", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3416", + "name": "Pirate Pete", + "examine": "He'll store my items for me.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3418", + "name": "Pirate Pete", + "examine": "He'll store my items for me.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3419", + "name": "Ogre", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "3420", + "name": "Mogre Guard", + "examine": "An angry Ogre in a highly amusing hat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3421", + "name": "Crab", + "examine": "Nice claw!", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "3428", + "defence_animation": "0", + "death_animation": "3430", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "3422", + "name": "Mudskipper", + "examine": "Not the most beautiful fish in the sea.", + "lifepoints": "34", + "attack_level": "24", + "strength_level": "24", + "defence_level": "24", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "3433", + "defence_animation": "0", + "death_animation": "3435", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "3423", + "name": "Mudskipper", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "3433", + "defence_animation": "3434", + "death_animation": "3435", + "safespot": null + }, + { + "id": "3424", + "name": "Crab", + "lifepoints": "18", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "3428", + "defence_animation": "3429", + "death_animation": "3430", + "safespot": null + }, + { + "id": "3425", + "name": "Fish", + "examine": "A Red Fantail.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3426", + "name": "Fish", + "examine": "A Red Fantail.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3427", + "name": "Fish", + "examine": "A Red Fantail.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3431", + "name": "Fish", + "examine": "An Angel Fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3432", + "name": "Fish", + "examine": "An Angel Fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3433", + "name": "Fish", + "examine": "An Angel Fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3434", + "name": "Fish", + "examine": "A Harlequin Fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3435", + "name": "Fish", + "examine": "A Harlequin Fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3436", + "name": "Fish", + "examine": "A Harlequin Fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3437", + "name": "Fish", + "examine": "A Discus Fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3438", + "name": "Fish", + "examine": "A Discus Fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3439", + "name": "Fish", + "examine": "A Discus Fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3443", + "name": "Fish", + "examine": "A shoal of Neon Tetra.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3444", + "name": "Fish", + "examine": "A shoal of Neon Tetra.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3445", + "name": "Fish", + "examine": "A shoal of Neon Tetra.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3449", + "name": "Lumbridge Guide", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "3450", + "name": "null", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "3451", + "name": "Lumbridge Guide", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "3463", + "name": "Skrach Uglogwee", + "examine": "What restful music!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3476", + "name": "Jubbly bird", + "examine": "A large boisterous bird", + "lifepoints": "11", + "attack_level": "6", + "strength_level": "6", + "defence_level": "8", + "range_level": "8", + "melee_animation": "6800", + "defence_animation": "0", + "death_animation": "6801", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "slayer_task": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "3478", + "name": "King Awowogei", + "lifepoints": "328", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "safespot": null + }, + { + "id": "3484", + "name": "Big Snake", + "examine": "A big snake.", + "lifepoints": "65", + "attack_level": "46", + "strength_level": "46", + "defence_level": "46", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "3538", + "defence_animation": "0", + "death_animation": "3540", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "poisonous": "true", + "aggressive": "true", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3491", + "name": "Culinaromancer", + "lifepoints": "140", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "3493", + "name": "Agrith-Na-Na", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "3501", + "defence_animation": "3500", + "death_animation": "3503", + "aggressive": "true", + "safespot": null + }, + { + "id": "3494", + "name": "Flambeed", + "lifepoints": "210", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1750", + "defence_animation": "1751", + "death_animation": "1752", + "aggressive": "true", + "safespot": null + }, + { + "id": "3495", + "name": "Karamel", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "3496", + "name": "Dessourt", + "lifepoints": "140", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "3507", + "defence_animation": "3505", + "death_animation": "3510", + "aggressive": "true", + "safespot": null + }, + { + "id": "3497", + "name": "Gelatinnoth Mother", + "examine": "Deadly AND fruity!", + "lifepoints": "139", + "attack_level": "48", + "strength_level": "48", + "defence_level": "65", + "range_level": "1", + "magic_level": "65", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "0", + "death_animation": "1342", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "3498", + "name": "Gelatinnoth Mother", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "3499", + "name": "Gelatinnoth Mother", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "3500", + "name": "Gelatinnoth Mother", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "3501", + "name": "Gelatinnoth Mother", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "3502", + "name": "Gelatinnoth Mother", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "1340", + "death_animation": "1342", + "aggressive": "true", + "safespot": null + }, + { + "id": "3509", + "name": "Sorin", + "examine": "Chronicler and regaler of your piratical exploits.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3514", + "name": "Vampyre Juvinate", + "examine": "An initiate juvenile vampyre.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3521", + "name": "Vampyre Juvinate", + "examine": "An initiate juvenile vampyre.", + "lifepoints": "64", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "respawn_delay": "60", + "melee_animation": "5783", + "defence_animation": "0", + "death_animation": "5798", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "3522", + "name": "Vampyre Juvinate", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5783", + "death_animation": "5798", + "aggressive": "true", + "safespot": null + }, + { + "id": "3523", + "name": "Vampyre Juvinate", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5783", + "death_animation": "5798", + "aggressive": "true", + "safespot": null + }, + { + "id": "3524", + "name": "Vampyre Juvinate", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5783", + "death_animation": "5798", + "aggressive": "true", + "safespot": null + }, + { + "id": "3525", + "name": "Vampyre Juvinate", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5783", + "death_animation": "5798", + "aggressive": "true", + "safespot": null + }, + { + "id": "3526", + "name": "Vampyre Juvinate", + "examine": "An initiate juvenile vampyre", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "46", + "range_level": "46", + "melee_animation": "6016", + "defence_animation": "0", + "death_animation": "6031", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "slayer_task": "86", + "safespot": null + }, + { + "id": "3527", + "name": "Held Vampyre Juvinate", + "examine": "A Juvinate vampyre", + "lifepoints": "64", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "5798", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "safespot": null + }, + { + "id": "3531", + "name": "Vampyre Juvenile", + "examine": "He looks really hungry!", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6276", + "defence_animation": "0", + "death_animation": "6781", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "86", + "safespot": null + }, + { + "id": "3532", + "name": "Vampyre Juvenile", + "examine": "She looks really hungry!", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6276", + "defence_animation": "0", + "death_animation": "6781", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "86", + "safespot": null + }, + { + "id": "3533", + "name": "Vampyre Juvenile", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6276", + "death_animation": "6781", + "safespot": null + }, + { + "id": "3534", + "name": "Held Vampyre Juvenile", + "examine": "He looks really hungry!", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "6781", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "86", + "safespot": null + }, + { + "id": "3577", + "name": "Juvinate", + "examine": "An initiate juvenile vampyre", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "46", + "range_level": "46", + "melee_animation": "6016", + "defence_animation": "0", + "death_animation": "6031", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "slayer_task": "86", + "safespot": null + }, + { + "id": "3579", + "name": "Sheep", + "examine": "Is it a sheep?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3581", + "name": "Skeleton", + "examine": "He guards the dungeon with the faithfulness of the undead.", + "lifepoints": "100", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5487", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3582", + "name": "Guard dog", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "49", + "safespot": null + }, + { + "id": "3583", + "name": "Hobgoblin", + "lifepoints": "29", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "164", + "defence_animation": "163", + "death_animation": "167", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3585", + "name": "Huge spider", + "examine": "No spider could grow that big! It's unrealistic!", + "lifepoints": "122", + "attack_level": "1", + "strength_level": "1", + "defence_level": "72", + "range_level": "72", + "respawn_delay": "60", + "melee_animation": "5319", + "defence_animation": "0", + "death_animation": "5321", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "3586", + "name": "Hellhound", + "examine": "Good doggy...", + "lifepoints": "134", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6562", + "defence_animation": "0", + "death_animation": "6576", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_exp": "116", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "3717,3719,3718", + "safespot": null + }, + { + "id": "3587", + "name": "Rantz", + "examine": "Big, ugly, and smelly.", + "lifepoints": "60", + "attack_level": "27", + "strength_level": "27", + "defence_level": "27", + "range_level": "27", + "magic_level": "27", + "bonuses": "15,15,10,20,40,15,50,50,50,20,50,58,0,0,0", + "respawn_delay": "25", + "attack_speed": "6", + "melee_animation": "359", + "defence_animation": "360", + "death_animation": "361", + "magic_animation": "359", + "range_animation": "359", + "aggressive": "true", + "safespot": null + }, + { + "id": "3588", + "name": "Baby red dragon", + "examine": "Young but still dangerous.", + "lifepoints": "50", + "attack_level": "40", + "strength_level": "40", + "defence_level": "42", + "range_level": "1", + "magic_level": "40", + "bonuses": "20,10,10,20,40,40,20,40,40,20,0,0,0,0,0", + "respawn_delay": "32", + "attack_speed": "5", + "melee_animation": "25", + "defence_animation": "26", + "death_animation": "28", + "magic_animation": "25", + "range_animation": "25", + "weakness": "8", + "aggressive": "true", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "3589", + "name": "Kalphite Soldier", + "examine": "I don't think insect repellent will work...", + "lifepoints": "114", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6223", + "defence_animation": "0", + "death_animation": "6228", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "3590", + "name": "Steel dragon", + "examine": "Its scales seem to be made of steel.", + "lifepoints": "210", + "attack_level": "234", + "strength_level": "229", + "defence_level": "238", + "range_level": "185", + "magic_level": "72", + "bonuses": "56,42,104,51,212,115,232,302,331,21,264,100,100,40,0", + "respawn_delay": "35", + "weakness": "8", + "slayer_exp": "221", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "3591", + "name": "Dagannoth", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "3593", + "name": "Demon", + "examine": "Arrgh! Look at its pointy teeth!", + "lifepoints": "107", + "attack_level": "75", + "strength_level": "75", + "defence_level": "75", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "3599", + "name": "Swamp snake", + "examine": "A large snake that thrives in swamps.", + "lifepoints": "121", + "attack_level": "35", + "strength_level": "33", + "defence_level": "40", + "range_level": "45", + "bonuses": "10,10,10,10,10,10,1,10,6,10,6,4,0,0,0", + "attack_speed": "5", + "melee_animation": "3538", + "defence_animation": "3539", + "death_animation": "3540", + "magic_animation": "3538", + "range_animation": "3538", + "weakness": "0", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3600", + "name": "Swamp snake", + "examine": "A large snake that thrives in swamps.", + "lifepoints": "121", + "attack_level": "60", + "strength_level": "50", + "defence_level": "60", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,1,10,6,10,6,4,0,0,0", + "attack_speed": "5", + "melee_animation": "3538", + "defence_animation": "3539", + "death_animation": "3540", + "magic_animation": "3538", + "range_animation": "3538", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3601", + "name": "Swamp snake", + "examine": "A large snake that thrives in swamps.", + "lifepoints": "121", + "attack_level": "35", + "strength_level": "33", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,1,10,6,10,6,4,0,0,0", + "attack_speed": "5", + "melee_animation": "3538", + "defence_animation": "3539", + "death_animation": "3540", + "magic_animation": "3538", + "range_animation": "3538", + "weakness": "7", + "slayer_task": "86", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3602", + "name": "Swamp snake", + "examine": "A large snake that thrives in swamps.", + "lifepoints": "121", + "attack_level": "35", + "strength_level": "33", + "defence_level": "40", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,1,10,6,10,6,4,0,0,0", + "attack_speed": "5", + "melee_animation": "3538", + "defence_animation": "3539", + "death_animation": "3540", + "magic_animation": "3538", + "range_animation": "3538", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3603", + "name": "Dead swamp snake", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3604", + "name": "Dead swamp snake", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3605", + "name": "Dead swamp snake", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3618", + "name": "Tentacle", + "examine": "I'm glad I can't see the rest of it!", + "lifepoints": "171", + "attack_level": "80", + "strength_level": "80", + "defence_level": "60", + "range_level": "80", + "magic_level": "80", + "respawn_delay": "60", + "melee_animation": "3618", + "defence_animation": "0", + "death_animation": "3620", + "magic_animation": "0", + "range_animation": "3618", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "3619", + "name": "Head", + "examine": "I'm glad I can't see the rest of it!", + "lifepoints": "171", + "attack_level": "85", + "strength_level": "85", + "defence_level": "60", + "range_level": "80", + "magic_level": "80", + "respawn_delay": "60", + "attack_speed": "10", + "melee_animation": "3731", + "defence_animation": "0", + "death_animation": "3733", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "3620", + "name": "Head", + "lifepoints": "150", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "10", + "melee_animation": "3731", + "defence_animation": "3732", + "death_animation": "3733", + "aggressive": "true", + "safespot": null + }, + { + "id": "3622", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "3634", + "name": "Fyiona Fray", + "examine": "A high-ranking Vyrewatch", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3645", + "name": "Angry bear", + "examine": "He looks a little on the cross side!", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "3646", + "name": "Angry unicorn", + "examine": "He looks a little on the cross side!", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "6376", + "defence_animation": "0", + "death_animation": "6377", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "496,498,497", + "safespot": null + }, + { + "id": "3647", + "name": "Angry giant rat", + "examine": "He looks a little on the cross side!", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "4933", + "defence_animation": "0", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3648", + "name": "Angry goblin", + "examine": "He looks a little on the cross side!", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "6185", + "defence_animation": "0", + "death_animation": "6182", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3649", + "name": "Fear reaper", + "examine": "AHHHHH!", + "lifepoints": "38", + "attack_level": "27", + "strength_level": "27", + "defence_level": "27", + "range_level": "1", + "melee_animation": "3812", + "defence_animation": "0", + "death_animation": "3813", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "3650", + "name": "Confusion beast", + "examine": "What on RuneScape is that?!?", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "melee_animation": "3818", + "defence_animation": "0", + "death_animation": "3821", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "3655", + "name": "Hopeless creature", + "examine": "A hopeless poor creature.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "3823", + "defence_animation": "0", + "death_animation": "3827", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "3661", + "name": "Angry unicorn", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "496,498,497", + "safespot": null + }, + { + "id": "3662", + "name": "Angry giant rat", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3663", + "name": "Angry goblin", + "examine": "He looks a little on the cross side!", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "6185", + "defence_animation": "0", + "death_animation": "6182", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3664", + "name": "Angry bear", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "3672", + "name": "Ram", + "examine": "Freshly sheared.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5341", + "defence_animation": "0", + "death_animation": "5343", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "3673", + "name": "Ram", + "examine": "White and shaggy.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5338", + "defence_animation": "0", + "death_animation": "5336", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "3675", + "name": "Vulture", + "examine": "If you see them circling", + "lifepoints": "54", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2019", + "defence_animation": "0", + "death_animation": "2021", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "3676", + "name": "Vulture", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2025", + "defence_animation": "2024", + "death_animation": "2026", + "safespot": null + }, + { + "id": "3680", + "name": "Ali the Leaflet Dropper", + "examine": "A young boy handing out flyers.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3697", + "name": "Skeleton fremennik", + "examine": "Could use a good meal.", + "lifepoints": "24", + "attack_level": "17", + "strength_level": "17", + "defence_level": "17", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6128", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3698", + "name": "Skeleton fremennik", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "400", + "defence_animation": "425", + "death_animation": "836", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3699", + "name": "Skeleton fremennik", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "400", + "defence_animation": "425", + "death_animation": "836", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3700", + "name": "Skeleton fremennik", + "examine": "He seems a little underweight.", + "lifepoints": "28", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6128", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3701", + "name": "Skeleton fremennik", + "examine": "He seems a little underweight.", + "lifepoints": "28", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6128", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3702", + "name": "Skeleton fremennik", + "lifepoints": "35", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3703", + "name": "Skeleton fremennik", + "examine": "He seems a little underweight.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6128", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3704", + "name": "Skeleton fremennik", + "examine": "He seems a little underweight.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6128", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3705", + "name": "Skeleton fremennik", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3706", + "name": "Ulfric", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6118", + "aggressive": "true", + "safespot": null + }, + { + "id": "3707", + "name": "Brine rat", + "examine": "Eww", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6117", + "defence_animation": "0", + "death_animation": "6115", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "67", + "slayer_exp": "50", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3709", + "name": "Boulder", + "examine": "A Wilderness fighter of massive repute.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3711", + "name": "Giant bat", + "examine": "An annoying flappy thing.", + "lifepoints": "32", + "attack_level": "12", + "strength_level": "12", + "defence_level": "32", + "range_level": "1", + "magic_level": "32", + "attack_speed": "6", + "melee_animation": "4915", + "defence_animation": "4916", + "death_animation": "4917", + "magic_animation": "4915", + "range_animation": "4915", + "weakness": "4", + "slayer_task": "5", + "slayer_exp": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "3715", + "name": "Guard", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3726", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3727", + "name": "Splatter", + "examine": "Don't burst its bubble!", + "lifepoints": "13", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "magic_level": "5", + "bonuses": "5,10,10,10,10,2,0,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3891", + "defence_animation": "3890", + "death_animation": "3888", + "magic_animation": "3891", + "range_animation": "3891", + "weakness": "8", + "safespot": null + }, + { + "id": "3728", + "name": "Splatter", + "examine": "Don't burst its bubble!", + "lifepoints": "23", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "magic_level": "10", + "bonuses": "10,15,15,15,15,5,0,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3891", + "defence_animation": "3890", + "death_animation": "3888", + "magic_animation": "3891", + "range_animation": "3891", + "safespot": null + }, + { + "id": "3729", + "name": "Splatter", + "examine": "Don't burst its bubble!", + "lifepoints": "23", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "10", + "bonuses": "15,20,20,20,20,8,0,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3891", + "defence_animation": "3890", + "death_animation": "3888", + "magic_animation": "3891", + "range_animation": "3891", + "safespot": null + }, + { + "id": "3730", + "name": "Splatter", + "examine": "Don't burst its bubble!", + "lifepoints": "23", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "magic_level": "15", + "bonuses": "20,25,25,25,25,10,0,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3891", + "defence_animation": "3890", + "death_animation": "3888", + "magic_animation": "3891", + "range_animation": "3891", + "safespot": null + }, + { + "id": "3731", + "name": "Splatter", + "examine": "Don't burst its bubble!", + "lifepoints": "23", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "magic_level": "20", + "bonuses": "25,30,30,30,30,15,0,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3891", + "defence_animation": "3890", + "death_animation": "3888", + "magic_animation": "3891", + "range_animation": "3891", + "safespot": null + }, + { + "id": "3732", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "23", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "magic_level": "14", + "bonuses": "20,25,20,40,40,40,40,5,18,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "3733", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "23", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "magic_level": "14", + "bonuses": "20,25,20,40,40,40,40,5,18,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "aggressive": "true", + "safespot": null + }, + { + "id": "3734", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "38", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "magic_level": "20", + "bonuses": "30,35,30,50,50,50,50,10,15,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "aggressive": "true", + "safespot": null + }, + { + "id": "3735", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "38", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "magic_level": "20", + "bonuses": "30,35,30,50,50,50,50,10,15,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "aggressive": "true", + "safespot": null + }, + { + "id": "3736", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "53", + "attack_level": "54", + "strength_level": "54", + "defence_level": "54", + "range_level": "1", + "magic_level": "25", + "bonuses": "35,40,35,60,60,60,60,20,15,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "aggressive": "true", + "safespot": null + }, + { + "id": "3737", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "53", + "attack_level": "54", + "strength_level": "54", + "defence_level": "54", + "range_level": "1", + "magic_level": "25", + "bonuses": "35,40,35,60,60,60,60,20,15,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "aggressive": "true", + "safespot": null + }, + { + "id": "3738", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "68", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "30", + "bonuses": "40,50,40,70,70,70,70,30,15,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "aggressive": "true", + "safespot": null + }, + { + "id": "3739", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "68", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "30", + "bonuses": "40,50,40,70,70,70,70,30,15,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "aggressive": "true", + "safespot": null + }, + { + "id": "3740", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "83", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "1", + "magic_level": "35", + "bonuses": "50,60,50,80,70,90,80,35,14,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "aggressive": "true", + "safespot": null + }, + { + "id": "3741", + "name": "Shifter", + "examine": "Nippy little thing!", + "lifepoints": "83", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "1", + "magic_level": "35", + "bonuses": "50,60,50,80,70,90,80,35,14,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "127", + "melee_animation": "3901", + "defence_animation": "3902", + "death_animation": "3903", + "magic_animation": "3901", + "range_animation": "3901", + "aggressive": "true", + "safespot": null + }, + { + "id": "3742", + "name": "Ravager", + "examine": "Worse than termites!", + "lifepoints": "23", + "attack_level": "15", + "strength_level": "30", + "defence_level": "15", + "range_level": "1", + "magic_level": "10", + "bonuses": "45,45,45,45,50,5,45,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "attack_speed": "5", + "melee_animation": "3915", + "defence_animation": "3916", + "death_animation": "3917", + "magic_animation": "3915", + "range_animation": "3915", + "weakness": "7", + "safespot": null + }, + { + "id": "3743", + "name": "Ravager", + "examine": "Worse than termites!", + "lifepoints": "38", + "attack_level": "20", + "strength_level": "40", + "defence_level": "20", + "range_level": "1", + "magic_level": "15", + "bonuses": "45,45,45,45,50,5,55,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "attack_speed": "5", + "melee_animation": "3915", + "defence_animation": "3916", + "death_animation": "3917", + "magic_animation": "3915", + "range_animation": "3915", + "safespot": null + }, + { + "id": "3744", + "name": "Ravager", + "examine": "Worse than termites!", + "lifepoints": "53", + "attack_level": "30", + "strength_level": "60", + "defence_level": "30", + "range_level": "1", + "magic_level": "20", + "bonuses": "45,55,55,55,50,10,45,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "attack_speed": "5", + "melee_animation": "3915", + "defence_animation": "3916", + "death_animation": "3917", + "magic_animation": "3915", + "range_animation": "3915", + "safespot": null + }, + { + "id": "3745", + "name": "Ravager", + "examine": "Worse than termites!", + "lifepoints": "53", + "attack_level": "45", + "strength_level": "75", + "defence_level": "45", + "range_level": "1", + "magic_level": "30", + "bonuses": "60,60,60,60,80,10,45,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "attack_speed": "5", + "melee_animation": "3915", + "defence_animation": "3916", + "death_animation": "3917", + "magic_animation": "3915", + "range_animation": "3915", + "safespot": null + }, + { + "id": "3746", + "name": "Ravager", + "examine": "Worse than termites!", + "lifepoints": "53", + "attack_level": "60", + "strength_level": "80", + "defence_level": "60", + "range_level": "1", + "magic_level": "40", + "bonuses": "65,70,70,70,90,20,56,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "attack_speed": "5", + "melee_animation": "3915", + "defence_animation": "3916", + "death_animation": "3917", + "magic_animation": "3915", + "range_animation": "3915", + "safespot": null + }, + { + "id": "3747", + "name": "Spinner", + "examine": "Eeewww!", + "lifepoints": "33", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "magic_level": "10", + "bonuses": "20,40,40,40,40,10,38,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "melee_animation": "3908", + "defence_animation": "3909", + "death_animation": "3910", + "magic_animation": "3908", + "range_animation": "3908", + "weakness": "6", + "safespot": null + }, + { + "id": "3748", + "name": "Spinner", + "examine": "Eeewww!", + "lifepoints": "50", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "15", + "bonuses": "30,60,60,60,60,15,38,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "melee_animation": "3908", + "defence_animation": "3909", + "death_animation": "3910", + "magic_animation": "3908", + "range_animation": "3908", + "safespot": null + }, + { + "id": "3749", + "name": "Spinner", + "examine": "Eeewww!", + "lifepoints": "67", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "magic_level": "20", + "bonuses": "50,70,70,70,70,20,38,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "melee_animation": "3908", + "defence_animation": "3909", + "death_animation": "3910", + "magic_animation": "3908", + "range_animation": "3908", + "safespot": null + }, + { + "id": "3750", + "name": "Spinner", + "examine": "Eeewww!", + "lifepoints": "101", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "magic_level": "30", + "bonuses": "60,100,100,100,100,30,25,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "melee_animation": "3908", + "defence_animation": "3909", + "death_animation": "3910", + "magic_animation": "3908", + "range_animation": "3908", + "safespot": null + }, + { + "id": "3751", + "name": "Spinner", + "examine": "Eeewww!", + "lifepoints": "84", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "magic_level": "25", + "bonuses": "55,80,80,80,85,25,30,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "melee_animation": "3908", + "defence_animation": "3909", + "death_animation": "3910", + "magic_animation": "3908", + "range_animation": "3908", + "safespot": null + }, + { + "id": "3752", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "18", + "attack_level": "1", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "magic_level": "25", + "bonuses": "30,30,30,30,15,30,40,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "weakness": "5", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3753", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "18", + "attack_level": "1", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "magic_level": "25", + "bonuses": "30,30,30,30,15,30,40,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3754", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "40", + "range_level": "1", + "magic_level": "40", + "bonuses": "45,40,40,40,25,35,35,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3755", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "40", + "range_level": "1", + "magic_level": "40", + "bonuses": "45,40,40,40,25,35,35,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3756", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "42", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "35,40,40,40,30,35,35,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3757", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "42", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "35,40,40,40,30,35,35,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3758", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "51", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "60", + "bonuses": "60,80,80,80,50,50,35,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3759", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "51", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "60", + "bonuses": "60,80,80,80,50,50,35,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3760", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "62", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "bonuses": "40,100,100,100,50,50,35,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3761", + "name": "Torcher", + "examine": "Burn, baby, burn!", + "lifepoints": "62", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "bonuses": "40,100,100,100,50,50,35,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3882", + "defence_animation": "3880", + "death_animation": "3881", + "magic_animation": "3882", + "range_animation": "3882", + "start_gfx": "646", + "projectile": "647", + "end_gfx": "648", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3762", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "27", + "attack_level": "1", + "strength_level": "1", + "defence_level": "25", + "range_level": "25", + "magic_level": "30", + "bonuses": "20,40,40,40,40,40,40,40,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "start_gfx": "657", + "projectile": "657", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3763", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "27", + "attack_level": "1", + "strength_level": "1", + "defence_level": "25", + "range_level": "25", + "magic_level": "30", + "bonuses": "20,40,40,40,40,40,40,40,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "projectile": "657", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3764", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "45", + "attack_level": "1", + "strength_level": "1", + "defence_level": "40", + "range_level": "40", + "magic_level": "40", + "bonuses": "30,50,60,60,60,60,40,40,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "start_gfx": "657", + "projectile": "657", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3765", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "45", + "attack_level": "1", + "strength_level": "1", + "defence_level": "40", + "range_level": "40", + "magic_level": "40", + "bonuses": "30,40,60,60,60,60,40,40,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "projectile": "657", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3766", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "62", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "bonuses": "35,65,70,70,70,70,40,40,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "start_gfx": "657", + "projectile": "657", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3767", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "62", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "bonuses": "35,65,70,70,70,70,40,40,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "projectile": "657", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3768", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "78", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "bonuses": "40,90,80,80,80,80,40,40,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "start_gfx": "657", + "projectile": "657", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3769", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "78", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "bonuses": "40,90,80,80,80,80,40,40,0,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "projectile": "657", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3770", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "97", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,100,100,100,120,100,40,40,80,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "start_gfx": "657", + "projectile": "657", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3771", + "name": "Defiler", + "examine": "Duck!", + "lifepoints": "97", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,100,100,100,120,100,40,40,80,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3920", + "defence_animation": "3921", + "death_animation": "3922", + "magic_animation": "3920", + "range_animation": "3920", + "projectile": "657", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3772", + "name": "Brawler", + "examine": "Mind your toes!", + "lifepoints": "53", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "magic_level": "14", + "bonuses": "45,45,50,50,50,50,50,15,50,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3896", + "defence_animation": "3895", + "death_animation": "3894", + "magic_animation": "3896", + "range_animation": "3896", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "3773", + "name": "Brawler", + "examine": "Mind your toes!", + "lifepoints": "83", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "magic_level": "21", + "bonuses": "45,45,60,50,50,50,50,15,50,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3896", + "defence_animation": "3895", + "death_animation": "3894", + "magic_animation": "3896", + "range_animation": "3896", + "aggressive": "true", + "safespot": null + }, + { + "id": "3774", + "name": "Brawler", + "examine": "Mind your toes!", + "lifepoints": "113", + "attack_level": "56", + "strength_level": "56", + "defence_level": "56", + "range_level": "1", + "magic_level": "32", + "bonuses": "45,45,60,80,80,80,80,25,50,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3896", + "defence_animation": "3895", + "death_animation": "3894", + "magic_animation": "3896", + "range_animation": "3896", + "aggressive": "true", + "safespot": null + }, + { + "id": "3775", + "name": "Brawler", + "examine": "Mind your toes!", + "lifepoints": "143", + "attack_level": "74", + "strength_level": "74", + "defence_level": "74", + "range_level": "1", + "magic_level": "38", + "bonuses": "45,45,60,60,60,60,60,20,50,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3896", + "defence_animation": "3895", + "death_animation": "3894", + "magic_animation": "3896", + "range_animation": "3896", + "aggressive": "true", + "safespot": null + }, + { + "id": "3776", + "name": "Brawler", + "examine": "Mind your toes!", + "lifepoints": "173", + "attack_level": "88", + "strength_level": "88", + "defence_level": "88", + "range_level": "1", + "magic_level": "45", + "bonuses": "45,45,80,100,100,100,100,30,46,0,0,0,0,0,0", + "respawn_delay": "120", + "melee_animation": "3896", + "defence_animation": "3895", + "death_animation": "3894", + "magic_animation": "3896", + "range_animation": "3896", + "aggressive": "true", + "safespot": null + }, + { + "id": "3777", + "name": "Doomsayer", + "examine": "Cheerful, helpful and optimistic, I'll bet.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3782", + "name": "Void Knight", + "examine": "A squire of balance.", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "80", + "range_level": "1", + "magic_level": "80", + "bonuses": "180,180,180,180,80,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "attack_speed": "5", + "safespot": null + }, + { + "id": "3783", + "name": "Frog", + "examine": "Long legged licker.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7260", + "defence_animation": "0", + "death_animation": "7256", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "poisonous": "true", + "safespot": null + }, + { + "id": "3784", + "name": "Void Knight", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "3785", + "name": "Void Knight", + "examine": "A squire of balance.", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "80", + "range_level": "1", + "magic_level": "80", + "bonuses": "180,180,180,180,80,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "120", + "attack_speed": "5", + "safespot": null + }, + { + "id": "3786", + "name": "Void Knight", + "examine": "A powerful knight of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3788", + "name": "Void Knight", + "examine": "A powerful knight of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3790", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3791", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3792", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3793", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3794", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3795", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3796", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3797", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3798", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3799", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3800", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3801", + "name": "Squire", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3802", + "name": "Squire (Novice)", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3805", + "name": "Postie Pete", + "examine": "Posts things.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3806", + "name": "Millie Miller", + "examine": "Miss Millicent Miller the Miller of Mill Lane Mill.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "safespot": null + }, + { + "id": "3807", + "name": "Gillie Groats", + "examine": "Gillie the Milkmaid milks cows. She's udderly fantastic at it.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "safespot": null + }, + { + "id": "3808", + "name": "Tortoise", + "examine": "Massive beast of War with extra Gnome.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "melee_animation": "3960", + "defence_animation": "0", + "death_animation": "3962", + "magic_animation": "0", + "range_animation": "3954", + "weakness": "6", + "safespot": null + }, + { + "id": "3809", + "name": "Captain Dalbur", + "examine": "Tally Ho!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3810", + "name": "Captain Bleemadge", + "examine": "Huzzah!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3811", + "name": "Captain Errdo", + "examine": "Up up and away!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3812", + "name": "Captain Klemfoodle", + "examine": "Up up and away!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3814", + "name": "Gnome Archer", + "examine": "A Gnome Arrow-chucker", + "lifepoints": "42", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "30", + "respawn_delay": "60", + "melee_animation": "190", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3815", + "name": "Gnome Driver", + "examine": "Yee haa!", + "lifepoints": "47", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "3969", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "3816", + "name": "Gnome Mage", + "examine": "A battle mage of the gnomish variety.", + "lifepoints": "48", + "attack_level": "1", + "strength_level": "1", + "defence_level": "34", + "range_level": "1", + "magic_level": "34", + "respawn_delay": "60", + "melee_animation": "3968", + "defence_animation": "0", + "death_animation": "196", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3818", + "name": "Trainer Nacklepen", + "examine": "The cruel tortoise trainer. Boo!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3819", + "name": "Tortoise", + "examine": "A large tortoise.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "melee_animation": "3960", + "defence_animation": "0", + "death_animation": "3962", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "3835", + "name": "Kalphite Queen", + "lifepoints": "255", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "6241", + "defence_animation": "6240", + "death_animation": "6242", + "aggressive": "true", + "safespot": null + }, + { + "id": "3836", + "name": "Kalphite Queen", + "lifepoints": "255", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "6234", + "defence_animation": "6237", + "death_animation": "6233", + "aggressive": "true", + "safespot": null + }, + { + "id": "3840", + "name": "Sea troll", + "examine": "An aquatic troll.", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "3843", + "name": "Sea troll", + "examine": "An aquatic troll.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "3844", + "name": "Skeleton Mage", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3847", + "name": "Sea Troll Queen", + "examine": "The mother of all sea trolls!", + "lifepoints": "428", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "respawn_delay": "60", + "melee_animation": "3991", + "defence_animation": "0", + "death_animation": "3993", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "3849", + "name": "Fishing spot", + "examine": "What have they done to him?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3850", + "name": "Skeleton Mage", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3851", + "name": "Skeleton Mage", + "examine": "A skeleton of dark magic.", + "lifepoints": "81", + "attack_level": "26", + "strength_level": "26", + "defence_level": "80", + "range_level": "85", + "magic_level": "85", + "bonuses": "30,30,45,10,30,30,30,30,30,30,30,30,30,30,40", + "poison_immune": "true", + "respawn_delay": "15", + "melee_animation": "5523", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5523", + "range_animation": "5523", + "start_gfx": "2713", + "projectile": "2718", + "end_gfx": "2723", + "weakness": "4", + "slayer_task": "75", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3915", + "name": "Man", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3916", + "name": "Carpenter Kjallak", + "examine": "His bark's worse than his blight.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3917", + "name": "Farmer Fromund", + "examine": "He looks a bit seedy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3939", + "name": "Sea Snake Young", + "examine": "Snake", + "lifepoints": "128", + "attack_level": "33", + "strength_level": "33", + "defence_level": "45", + "range_level": "45", + "respawn_delay": "60", + "melee_animation": "3538", + "defence_animation": "0", + "death_animation": "3540", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "slayer_task": "72", + "aggressive": "true", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3940", + "name": "Sea Snake Hatchling", + "examine": "A baby sea snake. Snaaaaaaake!", + "lifepoints": "100", + "attack_level": "33", + "strength_level": "33", + "defence_level": "45", + "range_level": "45", + "respawn_delay": "60", + "melee_animation": "3538", + "defence_animation": "0", + "death_animation": "3540", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "slayer_task": "72", + "aggressive": "true", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "3941", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3942", + "name": "Guard", + "examine": "He's guarding the entrance to the dungeons.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "3943", + "name": "Giant Sea Snake", + "examine": "A big snake that lives in the sea. How did it get in here?", + "lifepoints": "385", + "attack_level": "33", + "strength_level": "33", + "defence_level": "45", + "range_level": "45", + "respawn_delay": "60", + "melee_animation": "4040", + "defence_animation": "0", + "death_animation": "4039", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "aggressive": "true", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "4227", + "name": "Cockatrice", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "37", + "clue_level": "1", + "safespot": null + }, + { + "id": "4228", + "name": "Basilisk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "75", + "safespot": null + }, + { + "id": "4229", + "name": "Kurask", + "examine": "Large, heavy, with sharp things attached to its head.", + "lifepoints": "97", + "attack_level": "67", + "strength_level": "105", + "defence_level": "105", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,20,20,0,0,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "9439", + "defence_animation": "9441", + "death_animation": "9440", + "magic_animation": "9439", + "range_animation": "9439", + "slayer_exp": "97", + "aggressive": "true", + "safespot": null + }, + { + "id": "4230", + "name": "Abyssal demon", + "examine": "A denizen of the Abyss!", + "lifepoints": "150", + "attack_level": "97", + "strength_level": "67", + "defence_level": "135", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,20,20,20,0,20,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "1537", + "defence_animation": "0", + "death_animation": "1538", + "magic_animation": "1537", + "range_animation": "1537", + "weakness": "1", + "slayer_task": "1", + "slayer_exp": "150", + "clue_level": "2", + "safespot": null + }, + { + "id": "4243", + "name": "Demon butler", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4245", + "name": "Chief servant", + "examine": "Head of the servants' guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4246", + "name": "Taxidermist", + "examine": "She smells unpleasantly of chemicals.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4247", + "name": "Estate agent", + "examine": "A fancy businessman with a mighty fine hat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4248", + "name": "Stonemason", + "examine": "Someone has to get rid of all the stone they dug Keldagrim out of.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4250", + "name": "Sawmill operator", + "examine": "He changes the shape of wood.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4251", + "name": "Garden supplier", + "examine": "She has green fingers. (Not literally.)", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4252", + "name": "Macaroni Penguin", + "examine": "Beak areful with this one", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4257", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4258", + "name": "Guard", + "examine": "A dwarven guard.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "1", + "melee_animation": "99", + "defence_animation": "0", + "death_animation": "102", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "29", + "aggressive": "true", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4259", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4260", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4261", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4262", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4263", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4264", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4265", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4266", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4267", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4268", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4269", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4270", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4271", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4272", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4273", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4274", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4275", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4276", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4278", + "name": "Animated Bronze Armour", + "examine": "Animated bronze armour.", + "lifepoints": "10", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "bonuses": "3,3,3,3,1,3,1,3,3,3,3,8,10,8,3", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "386", + "defence_animation": "388", + "death_animation": "4167", + "magic_animation": "386", + "range_animation": "386", + "weakness": "7", + "safespot": null + }, + { + "id": "4279", + "name": "Animated Iron Armour", + "examine": "Animated iron armour.", + "lifepoints": "20", + "attack_level": "16", + "strength_level": "16", + "defence_level": "16", + "range_level": "1", + "bonuses": "6,6,6,6,2,6,6,6,6,6,6,2,25,2,3", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "386", + "defence_animation": "388", + "death_animation": "4167", + "magic_animation": "386", + "range_animation": "386", + "weakness": "7", + "safespot": null + }, + { + "id": "4280", + "name": "Animated Steel Armour", + "examine": "Animated steel armour.", + "lifepoints": "40", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "bonuses": "10,10,10,10,4,10,10,10,10,10,10,2,22,2,3", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "386", + "defence_animation": "388", + "death_animation": "4167", + "magic_animation": "386", + "range_animation": "386", + "weakness": "7", + "safespot": null + }, + { + "id": "4281", + "name": "Animated Black Armour", + "examine": "Animated black armour.", + "lifepoints": "60", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "15,15,15,15,5,15,6,15,15,16,15,5,27,5,3", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "386", + "defence_animation": "388", + "death_animation": "4167", + "magic_animation": "386", + "range_animation": "386", + "weakness": "7", + "safespot": null + }, + { + "id": "4282", + "name": "Animated Mithril Armour", + "examine": "Animated mithril armour.", + "lifepoints": "80", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,8,20,20,20,20,5,31,5,3", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "386", + "defence_animation": "388", + "death_animation": "4167", + "magic_animation": "386", + "range_animation": "386", + "weakness": "7", + "safespot": null + }, + { + "id": "4283", + "name": "Animated Adamant Armour", + "examine": "Animated adamant armour.", + "lifepoints": "99", + "attack_level": "65", + "strength_level": "65", + "defence_level": "75", + "range_level": "1", + "bonuses": "25,25,25,25,25,25,12,25,25,25,25,5,35,5,3", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "386", + "defence_animation": "388", + "death_animation": "4167", + "magic_animation": "386", + "range_animation": "386", + "weakness": "7", + "safespot": null + }, + { + "id": "4284", + "name": "Animated Rune Armour", + "examine": "Animated rune armour.", + "lifepoints": "118", + "attack_level": "75", + "strength_level": "75", + "defence_level": "85", + "range_level": "1", + "bonuses": "30,30,30,30,30,30,16,30,25,30,30,5,39,5,3", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "386", + "defence_animation": "388", + "death_animation": "4167", + "magic_animation": "386", + "range_animation": "386", + "weakness": "7", + "safespot": null + }, + { + "id": "4291", + "name": "Cyclops", + "examine": "A one-eyed man eater.", + "lifepoints": "75", + "attack_level": "65", + "strength_level": "65", + "defence_level": "35", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "44", + "slayer_exp": "75", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4292", + "name": "Cyclops", + "examine": "A one-eyed woman eater.", + "lifepoints": "100", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "slayer_task": "44", + "slayer_exp": "100", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4300", + "name": "Ref", + "examine": "He looks fair and reliable.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4301", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4302", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4303", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4304", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4305", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4306", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4307", + "name": "Guard", + "examine": "A guard for the humans against monster group.", + "lifepoints": "37", + "attack_level": "26", + "strength_level": "26", + "defence_level": "26", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4308", + "name": "Guard", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4309", + "name": "Guard", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4310", + "name": "Guard", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4311", + "name": "Guard", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4316", + "name": "Dwarf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "4318", + "name": "H.A.M. Member", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "safespot": null + }, + { + "id": "4320", + "name": "H.A.M. Member", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "safespot": null + }, + { + "id": "4329", + "name": "H.A.M. Deacon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "safespot": null + }, + { + "id": "4336", + "name": "Guard", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4343", + "name": "Snake", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "4344", + "name": "Monkey", + "lifepoints": "12", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "220", + "defence_animation": "221", + "death_animation": "223", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "4345", + "name": "Albino bat", + "examine": "It's all white by me.", + "lifepoints": "44", + "attack_level": "31", + "strength_level": "31", + "defence_level": "31", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4915", + "defence_animation": "0", + "death_animation": "4917", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "5", + "safespot": null + }, + { + "id": "4347", + "name": "Giant mosquito", + "examine": "A flying blood sucker.", + "lifepoints": "90", + "attack_level": "63", + "strength_level": "63", + "defence_level": "63", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "10", + "melee_animation": "2397", + "defence_animation": "0", + "death_animation": "2398", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "4348", + "name": "Jungle horror", + "examine": "A horrible", + "lifepoints": "68", + "attack_level": "48", + "strength_level": "48", + "defence_level": "48", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4235", + "defence_animation": "0", + "death_animation": "4233", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "52", + "slayer_exp": "45", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "4349", + "name": "Jungle horror", + "lifepoints": "45", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4234", + "defence_animation": "4232", + "death_animation": "4233", + "slayer_exp": "45", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "4350", + "name": "Jungle horror", + "examine": "A horrible", + "lifepoints": "68", + "attack_level": "48", + "strength_level": "48", + "defence_level": "48", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4235", + "defence_animation": "0", + "death_animation": "4233", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "52", + "slayer_exp": "45", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "4351", + "name": "Jungle horror", + "lifepoints": "45", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4234", + "defence_animation": "4232", + "death_animation": "4233", + "slayer_exp": "45", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "4352", + "name": "Jungle horror", + "lifepoints": "45", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4234", + "defence_animation": "4232", + "death_animation": "4233", + "slayer_exp": "45", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "4353", + "name": "Cave horror", + "aggressive":"true", + "examine": "A horrible, emaciated ape like creature with beady red eyes.", + "lifepoints": "55", + "attack_level": "80", + "strength_level": "77", + "defence_level": "62", + "range_level": "1", + "magic_level": "80", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "20", + "attack_speed": "4", + "melee_animation": "4234", + "defence_animation": "4232", + "death_animation": "4233", + "magic_animation": "4234", + "range_animation": "4234", + "weakness": "6", + "slayer_task": "17", + "slayer_exp": "55", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4354", + "name": "Cave horror", + "aggressive":"true", + "examine": "A horrible, emaciated ape like creature with beady red eyes.", + "lifepoints": "55", + "attack_level": "80", + "strength_level": "77", + "defence_level": "62", + "range_level": "1", + "magic_level": "80", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "20", + "attack_speed": "4", + "melee_animation": "4234", + "defence_animation": "4232", + "death_animation": "4233", + "magic_animation": "4234", + "range_animation": "4234", + "weakness": "6", + "slayer_task": "17", + "slayer_exp": "55", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4355", + "name": "Cave horror", + "aggressive":"true", + "examine": "A horrible, emaciated ape like creature with beady red eyes.", + "lifepoints": "55", + "attack_level": "80", + "strength_level": "77", + "defence_level": "62", + "range_level": "1", + "magic_level": "80", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "20", + "attack_speed": "4", + "melee_animation": "4234", + "defence_animation": "4232", + "death_animation": "4233", + "magic_animation": "4234", + "range_animation": "4234", + "weakness": "6", + "slayer_task": "17", + "slayer_exp": "55", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4356", + "name": "Cave horror", + "aggressive":"true", + "examine": "A horrible, emaciated ape like creature with beady red eyes.", + "lifepoints": "55", + "attack_level": "80", + "strength_level": "77", + "defence_level": "62", + "range_level": "1", + "magic_level": "80", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "20", + "attack_speed": "4", + "melee_animation": "4234", + "defence_animation": "4232", + "death_animation": "4233", + "magic_animation": "4234", + "range_animation": "4234", + "weakness": "6", + "slayer_task": "17", + "slayer_exp": "55", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4357", + "name": "Cave horror", + "aggressive":"true", + "examine": "A horrible, emaciated ape like creature with beady red eyes.", + "lifepoints": "55", + "attack_level": "80", + "strength_level": "77", + "defence_level": "62", + "range_level": "1", + "magic_level": "80", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "20", + "attack_speed": "4", + "melee_animation": "4234", + "defence_animation": "4232", + "death_animation": "4233", + "magic_animation": "4234", + "range_animation": "4234", + "weakness": "6", + "slayer_task": "17", + "slayer_exp": "55", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4359", + "name": "Patchy", + "examine": "Patchy the pirate.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4361", + "name": "Fancy Dan", + "examine": "A very flamboyant pirate.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4362", + "name": "Honest Jimmy", + "examine": "I can't wait to buy from a guy with Honest in his name...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4363", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "4371", + "name": "Blue Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "4372", + "name": "Red Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "4373", + "name": "Parrot", + "examine": "A colourful bird.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4375", + "name": "Security Guard", + "examine": "A retired RuneScape security guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4381", + "name": "Ankou", + "examine": "A bony ghost.", + "lifepoints": "60", + "attack_level": "50", + "strength_level": "69", + "defence_level": "50", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "slayer_exp": "60", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4382", + "name": "Ankou", + "examine": "A bony ghost.", + "lifepoints": "66", + "attack_level": "50", + "strength_level": "69", + "defence_level": "50", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "slayer_exp": "60", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4383", + "name": "Ankou", + "examine": "A bony ghost.", + "lifepoints": "66", + "attack_level": "60", + "strength_level": "74", + "defence_level": "55", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "slayer_exp": "60", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4384", + "name": "Skeleton", + "lifepoints": "68", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "4385", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "4386", + "name": "Skeleton", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "4387", + "name": "Ghost", + "lifepoints": "36", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5540", + "defence_animation": "5541", + "death_animation": "5542", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "4388", + "name": "Ghost", + "examine": "Eeek! A ghost!", + "lifepoints": "42", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "0", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "36", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "4389", + "name": "Flesh Crawler", + "examine": "I don't think insect repellent will work…", + "lifepoints": "25", + "attack_level": "60", + "strength_level": "2", + "defence_level": "10", + "range_level": "1", + "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", + "respawn_delay": "30", + "attack_speed": "3", + "melee_animation": "1184", + "defence_animation": "1186", + "death_animation": "1190", + "magic_animation": "1184", + "range_animation": "1184", + "weakness": "0", + "slayer_task": "34", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "4390", + "name": "Flesh Crawler", + "examine": "I don't think insect repellent will work…", + "lifepoints": "25", + "attack_level": "80", + "strength_level": "2", + "defence_level": "10", + "range_level": "1", + "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", + "respawn_delay": "30", + "attack_speed": "3", + "melee_animation": "1184", + "defence_animation": "1186", + "death_animation": "1190", + "magic_animation": "1184", + "range_animation": "1184", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "4391", + "name": "Flesh Crawler", + "examine": "I don't think insect repellent will work…", + "lifepoints": "25", + "attack_level": "100", + "strength_level": "2", + "defence_level": "10", + "range_level": "1", + "bonuses": "0,0,0,0,0,15,15,15,15,15,15,15,15,15,15", + "respawn_delay": "30", + "attack_speed": "3", + "melee_animation": "1184", + "defence_animation": "1186", + "death_animation": "1190", + "magic_animation": "1184", + "range_animation": "1184", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "4392", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "23", + "attack_level": "24", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "bonuses": "15,25,25,25,25,25,25,15,15,25,25,25,25,25,25", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "magic_animation": "5568", + "range_animation": "5568", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "4393", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "18", + "attack_level": "35", + "strength_level": "1", + "defence_level": "28", + "range_level": "1", + "bonuses": "15,25,28,28,25,28,28,15,15,28,25,25,25,25,25", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5579", + "death_animation": "5580", + "magic_animation": "5578", + "range_animation": "5578", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "4394", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "40", + "attack_level": "47", + "strength_level": "1", + "defence_level": "48", + "range_level": "1", + "bonuses": "35,45,45,45,45,45,45,35,35,45,45,45,45,45,45", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5579", + "death_animation": "5580", + "magic_animation": "5578", + "range_animation": "5578", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "4395", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "26", + "attack_level": "21", + "strength_level": "20", + "defence_level": "23", + "range_level": "1", + "bonuses": "19,15,15,34,36,38,33,31,30,14,0,0,0,0,0", + "attack_speed": "5", + "weakness": "9", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4396", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "2", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "3102,3104,3103", + "safespot": null + }, + { + "id": "4397", + "name": "Catablepon", + "examine": "Big Cow-like... But cows don't have serpent tails!", + "lifepoints": "50", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "magic_level": "38", + "bonuses": "5,20,15,3,10,20,10,10,20,15,23,25,15,25,10", + "respawn_delay": "74", + "attack_speed": "5", + "melee_animation": "4271", + "defence_animation": "4273", + "death_animation": "4270", + "magic_animation": "4272", + "slayer_exp": "50", + "aggressive": "true", + "clue_level": "1", + "spell_id": "7", + "safespot": null + }, + { + "id": "4398", + "name": "Catablepon", + "examine": "Big Cow-like... But cows don't have serpent tails!", + "lifepoints": "70", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "magic_level": "38", + "bonuses": "20,25,10,20,25,10,10,11,0,0,0,0,0,0,0", + "respawn_delay": "74", + "attack_speed": "5", + "melee_animation": "4271", + "defence_animation": "4273", + "death_animation": "4270", + "magic_animation": "4272", + "slayer_exp": "50", + "aggressive": "true", + "clue_level": "1", + "spell_id": "7", + "safespot": null + }, + { + "id": "4399", + "name": "Catablepon", + "examine": "Big Cow-like... But cows don't have serpent tails!", + "lifepoints": "50", + "attack_level": "40", + "strength_level": "58", + "defence_level": "38", + "range_level": "1", + "magic_level": "45", + "bonuses": "50,45,50,40,45,20,30,25,33,25,25,20,20,40,0", + "respawn_delay": "74", + "attack_speed": "5", + "melee_animation": "4271", + "defence_animation": "4273", + "death_animation": "4270", + "magic_animation": "4272", + "slayer_exp": "50", + "aggressive": "true", + "clue_level": "1", + "spell_id": "7", + "safespot": null + }, + { + "id": "4400", + "name": "Giant spider", + "examine": "I think this spider has been genetically modified.", + "lifepoints": "50", + "attack_level": "48", + "strength_level": "45", + "defence_level": "51", + "range_level": "1", + "bonuses": "19,21,19,62,45,51,54,63,60,18,0,0,0,0,0", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "magic_animation": "5327", + "range_animation": "5327", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "4401", + "name": "Spider", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6249", + "defence_animation": "6250", + "death_animation": "6251", + "aggressive": "true", + "safespot": null + }, + { + "id": "4402", + "name": "Scorpion", + "examine": "An extremely vicious scorpion.", + "lifepoints": "55", + "attack_level": "50", + "strength_level": "51", + "defence_level": "49", + "range_level": "1", + "bonuses": "12,23,10,51,32,62,29,54,48,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "6254", + "defence_animation": "6255", + "death_animation": "6256", + "magic_animation": "6254", + "range_animation": "6254", + "slayer_exp": "17", + "aggressive": "true", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "4403", + "name": "Scorpion", + "examine": "An extremely vicious scorpion.", + "lifepoints": "37", + "attack_level": "30", + "strength_level": "31", + "defence_level": "35", + "range_level": "1", + "bonuses": "15,16,12,32,19,38,18,34,32,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "6254", + "defence_animation": "6255", + "death_animation": "6256", + "magic_animation": "6254", + "range_animation": "6254", + "slayer_exp": "17", + "aggressive": "true", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "4404", + "name": "Minotaur", + "examine": "Examine not added", + "lifepoints": "11", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "bonuses": "8,8,10,8,8,10,8,8,8,10,8,8,8,8,8", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "4266", + "defence_animation": "4267", + "death_animation": "4265", + "magic_animation": "4266", + "range_animation": "4266", + "weakness": "7", + "slayer_task": "58", + "slayer_exp": "10", + "clue_level": "0", + "safespot": null + }, + { + "id": "4405", + "name": "Minotaur", + "examine": "Examine not added", + "lifepoints": "17", + "attack_level": "1", + "strength_level": "1", + "defence_level": "15", + "range_level": "1", + "bonuses": "11,11,13,11,11,13,11,11,11,13,11,11,11,11,11", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "4266", + "defence_animation": "4267", + "death_animation": "4265", + "magic_animation": "4266", + "range_animation": "4266", + "clue_level": "0", + "safespot": null + }, + { + "id": "4406", + "name": "Minotaur", + "examine": "Examine not added", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "19", + "range_level": "1", + "bonuses": "15,15,15,15,15,15,15,15,15,15,15,15,15,15,15", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "4266", + "defence_animation": "4267", + "death_animation": "4265", + "magic_animation": "4266", + "range_animation": "4266", + "slayer_exp": "22", + "clue_level": "0", + "safespot": null + }, + { + "id": "4407", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "5", + "range_level": "1", + "bonuses": "3,3,3,3,3,3,3,3,3,3,3,3,3,3,3", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4408", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "11", + "range_level": "1", + "bonuses": "8,8,8,8,8,8,8,8,8,8,8,8,8,8,8", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "16", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4409", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "9", + "range_level": "1", + "bonuses": "6,6,6,6,6,6,6,6,6,6,6,6,6,6,6", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "7", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4410", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "10", + "range_level": "1", + "bonuses": "8,8,8,8,8,8,8,8,8,8,8,8,8,8,8", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4411", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "17", + "range_level": "1", + "bonuses": "10,10,10,10,10,10,10,10,10,10,10,10,10,10,10", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4412", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "10", + "range_level": "1", + "bonuses": "8,8,8,8,8,8,8,8,8,8,8,8,8,8,8", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4413", + "name": "Wolf", + "examine": "Examine not added", + "lifepoints": "69", + "attack_level": "1", + "strength_level": "1", + "defence_level": "9", + "range_level": "1", + "bonuses": "7,7,7,7,7,7,7,7,7,7,7,7,7,7,7", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "6559", + "defence_animation": "6557", + "death_animation": "6558", + "magic_animation": "6559", + "range_animation": "6559", + "slayer_exp": "15", + "combat_audio": "481,491,490", + "safespot": null + }, + { + "id": "4414", + "name": "Wolf", + "examine": "Examine not added", + "lifepoints": "69", + "attack_level": "1", + "strength_level": "1", + "defence_level": "7", + "range_level": "1", + "bonuses": "5,5,5,5,5,5,5,5,5,5,5,5,5,5,5", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "6559", + "defence_animation": "6557", + "death_animation": "6558", + "magic_animation": "6559", + "range_animation": "6559", + "slayer_exp": "10", + "combat_audio": "481,491,490", + "safespot": null + }, + { + "id": "4415", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "2", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "3102,3104,3103", + "safespot": null + }, + { + "id": "4418", + "name": "Gorak", + "lifepoints": "112", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4300", + "defence_animation": "4301", + "death_animation": "4302", + "slayer_exp": "112", + "safespot": null + }, + { + "id": "4419", + "name": "Cosmic Being", + "examine": "A highly enlightened being.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4438", + "name": "Centaur", + "examine": "Horseplay.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4439", + "name": "Centaur", + "examine": "Half horse", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4440", + "name": "Stag", + "examine": "A noble creature!", + "lifepoints": "25", + "attack_level": "18", + "strength_level": "18", + "defence_level": "18", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6376", + "defence_animation": "0", + "death_animation": "6377", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "4441", + "name": "Wood Dryad", + "examine": "Twiggy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4455", + "name": "Fairy Fixit", + "examine": "Fairy ring maintenance division.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4457", + "name": "Ork", + "examine": "He works in the bank.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4458", + "name": "Ork", + "examine": "She works in the bank.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4459", + "name": "Ork", + "examine": "She works in the bank.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4470", + "name": "Tree spirit", + "examine": "A very angry nymph.", + "lifepoints": "12", + "attack_level": "9", + "strength_level": "9", + "defence_level": "9", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "94", + "defence_animation": "0", + "death_animation": "97", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4474", + "name": "Magic dummy", + "examine": "A magic training dummy", + "lifepoints": "15", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "94", + "defence_animation": "0", + "death_animation": "97", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4476", + "name": "Guardian mummy", + "examine": "Who's your mummy?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4479", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4480", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4481", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4482", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4483", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4484", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4485", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4486", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4487", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4488", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4489", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4490", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4491", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4492", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4494", + "name": "General Wartface", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4499", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4501", + "name": "Ethereal Man", + "examine": "Is he real or is it just my imagination?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4502", + "name": "Ethereal Lady", + "examine": "Does she really exist?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4503", + "name": "Ethereal Numerator", + "examine": "He reminds me of my old mathematics teacher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4504", + "name": "Ethereal Expert", + "examine": "The master of accomplishment.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4505", + "name": "Ethereal Perceptive", + "examine": "He knows what is possible.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4506", + "name": "Ethereal Guide", + "examine": "He knows the past", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4507", + "name": "Ethereal Fluke", + "examine": "Luck is probably on his side.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4509", + "name": "Me", + "examine": "It's like looking in the mirror.", + "lifepoints": "171", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4510", + "name": "Me", + "examine": "It's like looking in the mirror.", + "lifepoints": "171", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4511", + "name": "Oneiromancer", + "examine": "Spiritual leader of the Moonclan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4512", + "name": "House", + "examine": "The craziest house I ever did see!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4521", + "name": "Enchanted Broom", + "examine": "How does it see where to sweep?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4524", + "name": "Enchanted Bucket", + "examine": "I'm not sure if it's actually doing anything of use.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4527", + "name": "Suqah", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4388", + "defence_animation": "4384", + "death_animation": "4389", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4528", + "name": "Suqah", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4388", + "defence_animation": "4384", + "death_animation": "4389", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4529", + "name": "Suqah", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4388", + "defence_animation": "4384", + "death_animation": "4389", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4530", + "name": "Suqah", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4388", + "defence_animation": "4385", + "death_animation": "4389", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4531", + "name": "Suqah", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4388", + "defence_animation": "4385", + "death_animation": "4389", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4532", + "name": "Suqah", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4388", + "defence_animation": "4384", + "death_animation": "4389", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4533", + "name": "Suqah", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4388", + "defence_animation": "4384", + "death_animation": "4389", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "4534", + "name": "Moss giant", + "examine": "His beard seems to have a life of its own.", + "lifepoints": "85", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4666", + "defence_animation": "4665", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "62", + "slayer_exp": "85", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "4537", + "name": "Lokar Searunner", + "examine": "Either a very fremennikey pirate", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4539", + "name": "Cabin boy", + "examine": "I always wondered what that job description actually meant...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4540", + "name": "Captain Bentley", + "examine": "The High Priest has been transformed into an avatar of Bandos.", + "lifepoints": "214", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "60", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "4541", + "name": "'Beefy' Burns", + "examine": "A stickler for hygiene in the kitchen.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4542", + "name": "'Eagle-eye' Shultz", + "examine": "A keen-eyed lookout with a telescope.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4543", + "name": "First mate 'Davey-boy", + "examine": "First mate to Captain Bentley.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4545", + "name": "'Picarron' Pete", + "examine": "A pirate through and through.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4546", + "name": "Jake", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "4547", + "name": "Bedread the bold", + "examine": "He got his name from his favourite hobby. Reading about beds.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4548", + "name": "Wilson", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "4549", + "name": "Tommy 2-times", + "examine": "Nobody really knows why he's called Tommy 2-times...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4550", + "name": "Murky Pat", + "examine": "Don't look him straight in the eyes. He'll eat you alive!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4551", + "name": "Jack Sails", + "examine": "Nice beard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4554", + "name": "'Beedy-eye' Jones", + "examine": "Is he looking at me?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4555", + "name": "Jenny Blade", + "examine": "Yes", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4556", + "name": "'Lecherous' Lee", + "examine": "A low-down", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4557", + "name": "'Sticky' Sanders", + "examine": "Apparently his nickname comes from his fondness for jam.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4564", + "name": "Digsite workman", + "examine": "This person is working on the site.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4565", + "name": "Digsite workman", + "examine": "This person is working on the site.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4566", + "name": "Examiner", + "examine": "Upon examining the examiner you examine it is indeed an examiner!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4567", + "name": "Examiner", + "examine": "Upon examining the examiner you examine it is indeed an examiner!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4568", + "name": "Researcher", + "examine": "Must be hard at work.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4579", + "name": "Generic Diplomat", + "examine": "He makes pots.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4580", + "name": "Ambassador Gimblewap", + "examine": "He's very diplomatic.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4581", + "name": "Ambassador Spanfipple", + "examine": "Peaceful man!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4582", + "name": "Ambassador Ferrnook", + "examine": "Peaceful man!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4589", + "name": "Sorrn", + "examine": "Your common man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4590", + "name": "Mimm", + "examine": "Your common woman.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4593", + "name": "Portobello", + "examine": "Your common man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4594", + "name": "Captain Ninto", + "examine": "A gnome pilot off duty", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4595", + "name": "Captain Daerkin", + "examine": "A gnome pilot off duty", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4600", + "name": "Guard Vemmeldo", + "examine": "He looks alert and ready for action.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4603", + "name": "Fortress Guard", + "examine": "A generic evil henchman.", + "lifepoints": "37", + "attack_level": "26", + "strength_level": "26", + "defence_level": "26", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4604", + "name": "Fortress Guard", + "examine": "A generic evil henchman.", + "lifepoints": "37", + "attack_level": "26", + "strength_level": "26", + "defence_level": "26", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4605", + "name": "Fortress Guard", + "examine": "A generic evil henchman.", + "lifepoints": "37", + "attack_level": "26", + "strength_level": "26", + "defence_level": "26", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4606", + "name": "Fortress Guard", + "examine": "A generic evil henchman.", + "lifepoints": "37", + "attack_level": "26", + "strength_level": "26", + "defence_level": "26", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4607", + "name": "Black Cat", + "examine": "A witch's black cat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "4608", + "name": "Monk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4611", + "name": "Saboteur", + "examine": "Swine.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4615", + "name": "Evil creature", + "examine": "What is that thing!", + "lifepoints": "0", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "4633", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4634", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4635", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4636", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4637", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4638", + "name": "Gnome soldier", + "examine": "A little warrior.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4639", + "name": "Gnome soldier", + "examine": "A little warrior.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4640", + "name": "Gnome soldier", + "examine": "A little warrior.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4641", + "name": "Gnome soldier", + "examine": "A little warrior.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4642", + "name": "Gnome soldier", + "examine": "A little warrior.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4643", + "name": "Healthorg and tortoise", + "examine": "King Healthorg riding his War Tortoise.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4645", + "name": "Glouphrie the Untrusted", + "examine": "A weasly", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4650", + "name": "Trader Stan", + "examine": "With the prices he charges", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4651", + "name": "Trader Crewmember", + "examine": "Looks very stylish", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4652", + "name": "Trader Crewmember", + "examine": "That suit looks a little briny around the edges.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4653", + "name": "Trader Crewmember", + "examine": "First storm he is in that hat will blow away.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4654", + "name": "Trader Crewmember", + "examine": "She'll never be able to climb rigging in that.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4655", + "name": "Trader Crewmember", + "examine": "High heels on a ship? What is she thinking?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4656", + "name": "Trader Crewmember", + "examine": "The effect is sort of spoiled by all those tattoos.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "movement_radius": "710", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4658", + "name": "Dark wizard", + "examine": "A wizard of the Dark Arts.", + "lifepoints": "12", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "810", + "defence_animation": "425", + "death_animation": "836", + "magic_animation": "711", + "range_animation": "0", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4659", + "name": "Dark wizard", + "examine": "A wizard of the Dark Arts.", + "lifepoints": "12", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "810", + "defence_animation": "425", + "death_animation": "836", + "magic_animation": "711", + "range_animation": "0", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4660", + "name": "Dark wizard", + "examine": "A wizard of the Dark Arts.", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "810", + "defence_animation": "425", + "death_animation": "836", + "magic_animation": "711", + "range_animation": "0", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4661", + "name": "Dark wizard", + "examine": "A wizard of the Dark Arts.", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "15", + "range_level": "1", + "magic_level": "15", + "bonuses": "30,10,10,10,10,10,10,25,0,0,0,0,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "711", + "start_gfx": "2713", + "projectile": "2718", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4665", + "name": "Baby blue dragon", + "examine": "Young but still dangerous.", + "lifepoints": "50", + "attack_level": "40", + "strength_level": "40", + "defence_level": "42", + "range_level": "1", + "magic_level": "40", + "bonuses": "50,40,64,60,30,45,40,40,20,40,40,20,0,0,0", + "respawn_delay": "32", + "attack_speed": "5", + "melee_animation": "25", + "defence_animation": "26", + "death_animation": "28", + "magic_animation": "25", + "range_animation": "25", + "weakness": "3", + "slayer_task": "68", + "slayer_exp": "0", + "aggressive": "true", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4666", + "name": "Baby blue dragon", + "examine": "Young but still dangerous.", + "lifepoints": "51", + "attack_level": "45", + "strength_level": "45", + "defence_level": "48", + "range_level": "45", + "magic_level": "45", + "bonuses": "49,45,43,50,73,71,56,78,68,0,0,0,0,0,0", + "slayer_exp": "108", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4667", + "name": "Baby red dragon", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4668", + "name": "Baby red dragon", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4669", + "name": "Red dragon", + "examine": "A big powerful dragon.", + "lifepoints": "140", + "attack_level": "130", + "strength_level": "130", + "defence_level": "130", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "68", + "slayer_exp": "143", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4670", + "name": "Red dragon", + "examine": "A big powerful dragon.", + "lifepoints": "140", + "attack_level": "130", + "strength_level": "130", + "defence_level": "130", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "68", + "slayer_exp": "143", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4671", + "name": "Red dragon", + "examine": "A big powerful dragon.", + "lifepoints": "140", + "attack_level": "130", + "strength_level": "130", + "defence_level": "130", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "68", + "slayer_exp": "143", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4672", + "name": "Red dragon", + "examine": "A big powerful dragon.", + "lifepoints": "140", + "attack_level": "130", + "strength_level": "130", + "defence_level": "130", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "68", + "slayer_exp": "143", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4673", + "name": "Black dragon", + "examine": "A fierce dragon with black scales!", + "lifepoints": "190", + "attack_level": "200", + "strength_level": "200", + "defence_level": "200", + "range_level": "1", + "magic_level": "100", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "9", + "slayer_exp": "200", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4674", + "name": "Black dragon", + "examine": "A fierce dragon with black scales!", + "lifepoints": "190", + "attack_level": "200", + "strength_level": "200", + "defence_level": "200", + "range_level": "1", + "magic_level": "100", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "9", + "slayer_exp": "200", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4675", + "name": "Black dragon", + "examine": "A fierce dragon with black scales!", + "lifepoints": "190", + "attack_level": "200", + "strength_level": "200", + "defence_level": "200", + "range_level": "1", + "magic_level": "100", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "9", + "slayer_exp": "200", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4676", + "name": "Black dragon", + "examine": "A fierce dragon with black scales!", + "lifepoints": "190", + "attack_level": "200", + "strength_level": "200", + "defence_level": "200", + "range_level": "1", + "magic_level": "100", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "9", + "slayer_exp": "200", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4677", + "name": "Green dragon", + "examine": "Must be related to Elvarg.", + "lifepoints": "75", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "magic_level": "68", + "bonuses": "0,0,0,0,0,20,40,40,30,20,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "41", + "slayer_exp": "75", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4678", + "name": "Green dragon", + "examine": "Must be related to Elvarg.", + "lifepoints": "75", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "magic_level": "68", + "bonuses": "0,0,0,0,0,20,40,40,30,20,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "41", + "slayer_exp": "75", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4679", + "name": "Green dragon", + "examine": "Must be related to Elvarg.", + "lifepoints": "75", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "magic_level": "68", + "bonuses": "0,0,0,0,0,20,40,40,30,20,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "41", + "slayer_exp": "75", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4680", + "name": "Green dragon", + "examine": "Must be related to Elvarg.", + "lifepoints": "75", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "magic_level": "68", + "bonuses": "0,0,0,0,0,20,40,40,30,20,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "41", + "slayer_exp": "75", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4681", + "name": "Blue dragon", + "examine": "A mother dragon.", + "lifepoints": "105", + "attack_level": "95", + "strength_level": "95", + "defence_level": "95", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "11", + "slayer_exp": "108", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4682", + "name": "Blue dragon", + "examine": "A mother dragon.", + "lifepoints": "105", + "attack_level": "95", + "strength_level": "95", + "defence_level": "95", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "11", + "slayer_exp": "108", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4683", + "name": "Blue dragon", + "examine": "A mother dragon.", + "lifepoints": "105", + "attack_level": "95", + "strength_level": "95", + "defence_level": "95", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "11", + "slayer_exp": "108", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4684", + "name": "Blue dragon", + "examine": "A mother dragon.", + "lifepoints": "105", + "attack_level": "95", + "strength_level": "95", + "defence_level": "95", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "11", + "slayer_exp": "108", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "4685", + "name": "Ice giant", + "examine": "He's got icicles in his beard.", + "lifepoints": "70", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4672", + "defence_animation": "0", + "death_animation": "4673", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "47", + "slayer_exp": "70", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "4686", + "name": "Ice giant", + "examine": "He's got icicles in his beard.", + "lifepoints": "70", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4672", + "defence_animation": "0", + "death_animation": "4673", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "47", + "slayer_exp": "70", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "4687", + "name": "Ice giant", + "examine": "He's got icicles in his beard.", + "lifepoints": "70", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4672", + "defence_animation": "0", + "death_animation": "4673", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "47", + "slayer_exp": "70", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "4688", + "name": "Moss giant", + "examine": "His beard seems to have a life of its own.", + "lifepoints": "60", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4666", + "defence_animation": "4665", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "62", + "slayer_exp": "60", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "4689", + "name": "Hill Giant", + "examine": "A very large foe.", + "lifepoints": "35", + "attack_level": "18", + "strength_level": "22", + "defence_level": "26", + "range_level": "1", + "magic_level": "1", + "bonuses": "18,18,18,0,0,0,0,0,0,0,0,16,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "4652", + "range_animation": "4652", + "weakness": "6", + "slayer_task": "44", + "slayer_exp": "35", + "aggressive": "true", + "safespot": null + }, + { + "id": "4690", + "name": "Hill Giant", + "examine": "A very large foe.", + "lifepoints": "35", + "attack_level": "18", + "strength_level": "22", + "defence_level": "26", + "range_level": "1", + "magic_level": "1", + "bonuses": "18,18,18,0,0,0,0,0,0,0,0,16,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "4652", + "range_animation": "4652", + "weakness": "6", + "slayer_task": "44", + "slayer_exp": "35", + "aggressive": "true", + "safespot": null + }, + { + "id": "4691", + "name": "Hill Giant", + "examine": "A very large foe.", + "lifepoints": "35", + "attack_level": "18", + "strength_level": "22", + "defence_level": "26", + "range_level": "1", + "magic_level": "1", + "bonuses": "18,18,18,0,0,0,0,0,0,0,0,16,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "4652", + "range_animation": "4652", + "weakness": "6", + "slayer_task": "44", + "slayer_exp": "35", + "aggressive": "true", + "safespot": null + }, + { + "id": "4692", + "name": "Hill Giant", + "examine": "A very large foe.", + "lifepoints": "35", + "attack_level": "18", + "strength_level": "22", + "defence_level": "26", + "range_level": "1", + "magic_level": "1", + "bonuses": "18,18,18,0,0,0,0,0,0,0,0,16,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "4652", + "range_animation": "4652", + "weakness": "6", + "slayer_task": "44", + "slayer_exp": "35", + "aggressive": "true", + "safespot": null + }, + { + "id": "4693", + "name": "Hill Giant", + "examine": "A very large foe.", + "lifepoints": "35", + "attack_level": "18", + "strength_level": "22", + "defence_level": "26", + "range_level": "1", + "magic_level": "1", + "bonuses": "18,18,18,0,0,0,0,0,0,0,0,16,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "4652", + "range_animation": "4652", + "weakness": "6", + "slayer_task": "44", + "slayer_exp": "35", + "aggressive": "true", + "safespot": null + }, + { + "id": "4694", + "name": "Lesser demon", + "examine": "Lesser, but still pretty big.", + "lifepoints": "79", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "15,15,15,15,15,15,15,15,15,3,15,15,23,15,15", + "respawn_delay": "20", + "attack_speed": "6", + "melee_animation": "4630", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "4630", + "range_animation": "4630", + "weakness": "4", + "slayer_task": "56", + "slayer_exp": "79", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4695", + "name": "Lesser demon", + "examine": "Lesser, but still pretty big.", + "lifepoints": "79", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "15,15,15,15,15,15,15,15,15,3,15,15,23,15,15", + "respawn_delay": "20", + "attack_speed": "6", + "melee_animation": "4630", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "4630", + "range_animation": "4630", + "weakness": "4", + "slayer_task": "56", + "slayer_exp": "79", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4696", + "name": "Lesser demon", + "examine": "Lesser, but still pretty big.", + "lifepoints": "79", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "15,15,15,15,15,15,15,15,15,3,15,15,23,15,15", + "respawn_delay": "20", + "attack_speed": "6", + "melee_animation": "4630", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "4630", + "range_animation": "4630", + "weakness": "4", + "slayer_task": "56", + "slayer_exp": "79", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4697", + "name": "Lesser demon", + "examine": "Lesser, but still pretty big.", + "lifepoints": "79", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "15,15,15,15,15,15,15,15,15,3,15,15,23,15,15", + "respawn_delay": "20", + "attack_speed": "6", + "melee_animation": "4630", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "4630", + "range_animation": "4630", + "weakness": "4", + "slayer_task": "56", + "slayer_exp": "79", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4698", + "name": "Greater demon", + "examine": "Big, red, and incredibly evil.", + "lifepoints": "87", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", + "respawn_delay": "32", + "attack_speed": "5", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "68", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "40", + "slayer_exp": "87", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4699", + "name": "Greater demon", + "examine": "Big, red, and incredibly evil.", + "lifepoints": "87", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", + "respawn_delay": "32", + "attack_speed": "5", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "68", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "40", + "slayer_exp": "87", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4700", + "name": "Greater demon", + "examine": "Big, red, and incredibly evil.", + "lifepoints": "87", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", + "respawn_delay": "32", + "attack_speed": "5", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "68", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "40", + "slayer_exp": "87", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4701", + "name": "Greater demon", + "examine": "Big, red, and incredibly evil.", + "lifepoints": "87", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "bonuses": "30,20,20,30,20,50,50,50,10,50,20,0,0,0,0", + "respawn_delay": "32", + "attack_speed": "5", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "68", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "40", + "slayer_exp": "87", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4702", + "name": "Black demon", + "examine": "A big, scary, jet-black demon.", + "lifepoints": "165", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "45,40,40,150,150,80,150,20,150,68,0,0,0,0,0", + "respawn_delay": "38", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "8", + "slayer_exp": "157", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4703", + "name": "Black demon", + "examine": "A big, scary, jet-black demon.", + "lifepoints": "165", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "45,40,40,150,150,80,150,20,150,68,0,0,0,0,0", + "respawn_delay": "38", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "8", + "slayer_exp": "157", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4704", + "name": "Black demon", + "examine": "A big, scary, jet-black demon.", + "lifepoints": "165", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "45,40,40,150,150,80,150,20,150,68,0,0,0,0,0", + "respawn_delay": "38", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "8", + "slayer_exp": "157", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4705", + "name": "Black demon", + "examine": "A big, scary, jet-black demon.", + "lifepoints": "165", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "45,40,40,150,150,80,150,20,150,68,0,0,0,0,0", + "respawn_delay": "38", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "64", + "range_animation": "64", + "weakness": "4", + "slayer_task": "8", + "slayer_exp": "157", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "4706", + "name": "Moss giant", + "examine": "His beard seems to have a life of its own.", + "lifepoints": "85", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "magic_level": "1", + "bonuses": "33,33,33,0,0,0,0,0,0,0,0,31,0,0,0", + "respawn_delay": "30", + "attack_speed": "6", + "melee_animation": "4666", + "defence_animation": "4665", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "62", + "slayer_exp": "85", + "aggressive": "true", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "4707", + "name": "Magic Tutor", + "examine": "Mikasi looks ready to teach you about magic.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4708", + "name": "Old Man Ral", + "examine": "A flea-infested", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4716", + "name": "Trader Sven", + "examine": "A flea-infested black market trader.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4717", + "name": "Meiyerditch citizen", + "examine": "A flea-infested", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4718", + "name": "Meiyerditch citizen", + "examine": "A flea-infested", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4719", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4720", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4721", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4722", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4723", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4724", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4725", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4726", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4733", + "name": "Meiyerditch citizen", + "examine": "Cowardly mage.", + "lifepoints": "28", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "90", + "defence_animation": "0", + "magic_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "4734", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4735", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4736", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4737", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4738", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4739", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4740", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4741", + "name": "Meiyerditch citizen", + "examine": "This citizen looks pale", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4746", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4747", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4748", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4749", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4750", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4751", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4752", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4753", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4754", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4755", + "name": "A Meiyerditch child", + "examine": "A poor street urchin!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4756", + "name": "Meiyerditch miner", + "examine": "This citizen looks dirty and tired!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4757", + "name": "Meiyerditch miner", + "examine": "This citizen looks dirty and tired!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4759", + "name": "Meiyerditch miner", + "examine": "This citizen looks dirty and tired!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4765", + "name": "null", + "examine": "Some rubbish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4766", + "name": "Stray dog", + "examine": "Looks like it's got fleas!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4768", + "name": "Cat", + "examine": "A smelly cat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4772", + "name": "Juvinate guard", + "examine": "An initiate juvenile vampyre; a guard for the mining area.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "safespot": null + }, + { + "id": "4773", + "name": "Juvinate guard", + "examine": "An initiate juvenile vampyre; a guard for the mining area.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "safespot": null + }, + { + "id": "4774", + "name": "Vampyre juvenile", + "examine": "A juvenile vampyre.", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6276", + "defence_animation": "0", + "death_animation": "6781", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "4775", + "name": "Vampyre juvenile", + "examine": "A juvenile vampyre.", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6276", + "defence_animation": "0", + "death_animation": "6781", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "4776", + "name": "Vampyre juvinate", + "examine": "An initiate juvenile vampyre; seems to be a servant.", + "lifepoints": "62", + "attack_level": "1", + "strength_level": "1", + "defence_level": "44", + "range_level": "44", + "melee_animation": "5783", + "defence_animation": "0", + "death_animation": "5798", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "safespot": null + }, + { + "id": "4777", + "name": "Vampyre juvinate", + "examine": "An initiate juvenile vampyre.", + "lifepoints": "62", + "attack_level": "1", + "strength_level": "1", + "defence_level": "44", + "range_level": "44", + "melee_animation": "5783", + "defence_animation": "0", + "death_animation": "5798", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "safespot": null + }, + { + "id": "4778", + "name": "Held vampyre juvenile", + "examine": "A juvenile vampyre.", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "6781", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "4779", + "name": "Held vampyre juvenile", + "examine": "A juvenile vampyre.", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "6781", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "4780", + "name": "Held vampyre juvinate", + "examine": "An initiate juvenile vampyre; seems to be a servant.", + "lifepoints": "62", + "attack_level": "1", + "strength_level": "1", + "defence_level": "44", + "range_level": "44", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "5798", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "safespot": null + }, + { + "id": "4789", + "name": "Angry vampyre", + "examine": "An enraged vampyre!", + "lifepoints": "60", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "melee_animation": "6016", + "defence_animation": "0", + "death_animation": "6031", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "86", + "safespot": null + }, + { + "id": "4793", + "name": "Vanstrom Klause", + "lifepoints": "155", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "4796", + "name": "Vanstrom Klause", + "examine": "Not as strong as Thok.", + "lifepoints": "28", + "attack_level": "90", + "strength_level": "90", + "defence_level": "60", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "4805", + "name": "Vyrewatch", + "examine": "An evil", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4806", + "name": "Vyrewatch", + "examine": "An evil", + "lifepoints": "74", + "attack_level": "1", + "strength_level": "1", + "defence_level": "52", + "range_level": "1", + "magic_level": "52", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4807", + "name": "Vyrewatch", + "examine": "An evil", + "lifepoints": "77", + "attack_level": "1", + "strength_level": "1", + "defence_level": "54", + "range_level": "1", + "magic_level": "54", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4808", + "name": "Vyrewatch", + "examine": "An evil", + "lifepoints": "80", + "attack_level": "1", + "strength_level": "1", + "defence_level": "56", + "range_level": "1", + "magic_level": "56", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4810", + "name": "Flying female vampire", + "examine": "A very high-ranking vampyre.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "7524", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "4811", + "name": "Flying female vampire", + "examine": "A very high-ranking vampyre.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "7524", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "4812", + "name": "Flying female vampire", + "examine": "A very high-ranking vampyre.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "7524", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "4813", + "name": "Vyrewatch", + "examine": "A thirsty-looking", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "6783", + "defence_animation": "0", + "death_animation": "6861", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4814", + "name": "Vyrewatch", + "examine": "A thirsty-looking", + "lifepoints": "74", + "attack_level": "1", + "strength_level": "1", + "defence_level": "52", + "range_level": "1", + "magic_level": "52", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "6783", + "defence_animation": "0", + "death_animation": "6861", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4815", + "name": "Vyrewatch", + "examine": "A thirsty-looking", + "lifepoints": "77", + "attack_level": "1", + "strength_level": "1", + "defence_level": "54", + "range_level": "1", + "magic_level": "54", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "6783", + "defence_animation": "0", + "death_animation": "6861", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4816", + "name": "Vyrewatch", + "examine": "A thirsty-looking", + "lifepoints": "80", + "attack_level": "1", + "strength_level": "1", + "defence_level": "56", + "range_level": "1", + "magic_level": "56", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "6783", + "defence_animation": "0", + "death_animation": "6861", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4817", + "name": "Vyrewatch", + "examine": "An evil", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4818", + "name": "Vyrewatch", + "examine": "An evil", + "lifepoints": "74", + "attack_level": "1", + "strength_level": "1", + "defence_level": "52", + "range_level": "1", + "magic_level": "52", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4819", + "name": "Vyrewatch", + "examine": "An evil", + "lifepoints": "77", + "attack_level": "1", + "strength_level": "1", + "defence_level": "54", + "range_level": "1", + "magic_level": "54", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4820", + "name": "Vyrewatch", + "examine": "An evil", + "lifepoints": "80", + "attack_level": "1", + "strength_level": "1", + "defence_level": "56", + "range_level": "1", + "magic_level": "56", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4821", + "name": "Vyrewatch", + "examine": "A very high-ranking vampyre.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "7524", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "4822", + "name": "Vyrewatch", + "examine": "A very high-ranking vampyre.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "7524", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "4823", + "name": "Vyrewatch", + "examine": "A very high-ranking vampyre.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "7524", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "4824", + "name": "Vyrewatch", + "examine": "A very high-ranking vampyre.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "7524", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "4825", + "name": "Vyrewatch", + "examine": "A thirsty-looking", + "lifepoints": "71", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "6783", + "defence_animation": "0", + "death_animation": "6861", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4826", + "name": "Vyrewatch", + "examine": "A thirsty-looking", + "lifepoints": "74", + "attack_level": "1", + "strength_level": "1", + "defence_level": "52", + "range_level": "1", + "magic_level": "52", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "6783", + "defence_animation": "0", + "death_animation": "6861", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4827", + "name": "Vyrewatch", + "examine": "A thirsty-looking", + "lifepoints": "77", + "attack_level": "1", + "strength_level": "1", + "defence_level": "54", + "range_level": "1", + "magic_level": "54", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "6783", + "defence_animation": "0", + "death_animation": "6861", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4828", + "name": "Vyrewatch", + "examine": "A thirsty-looking", + "lifepoints": "80", + "attack_level": "1", + "strength_level": "1", + "defence_level": "56", + "range_level": "1", + "magic_level": "56", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "6783", + "defence_animation": "0", + "death_animation": "6861", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "4829", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4830", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4831", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4832", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4833", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4834", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4835", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4836", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4837", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4838", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4839", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4840", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4841", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4842", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4843", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4844", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4845", + "name": "Flying female vampire", + "examine": "A very high-ranking vampyre.", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7435", + "defence_animation": "0", + "death_animation": "7524", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "4847", + "name": "Flying female vampire", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4848", + "name": "Flying female vampire", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4849", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4850", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4851", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4852", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "4868", + "name": "Holgart", + "examine": "Her knives tickle Thok.", + "lifepoints": "28", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "90", + "defence_animation": "0", + "magic_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "4870", + "name": "Fisherman", + "examine": "Not Thok's pretty lass.", + "lifepoints": "28", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "90", + "defence_animation": "0", + "magic_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "4890", + "name": "Slug Prince", + "examine": "A child of aquatic evil.", + "lifepoints": "105", + "attack_level": "37", + "strength_level": "37", + "defence_level": "37", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4829", + "defence_animation": "0", + "death_animation": "4830", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "4893", + "name": "Giant Lobster", + "examine": "An extremely vicious lobster.", + "lifepoints": "82", + "attack_level": "29", + "strength_level": "29", + "defence_level": "29", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6265", + "defence_animation": "0", + "death_animation": "6267", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "71", + "aggressive": "true", + "safespot": null + }, + { + "id": "4894", + "name": "Sea slug", + "examine": "A rather nasty looking crustacean.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4898", + "name": "Hobgoblin", + "lifepoints": "29", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "164", + "defence_animation": "163", + "death_animation": "167", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "4899", + "name": "Cooking Tutor", + "examine": "Cordero looks ready to teach you how to cook.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4900", + "name": "Crafting Tutor", + "examine": "Cadmus, looking a little bit crafty.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4901", + "name": "Fishing Tutor", + "examine": "Finlay, mending a crayfish cage.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4902", + "name": "Mining Tutor", + "examine": "Monlum, surveying the rocks.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4903", + "name": "Prayer Tutor", + "examine": "Yauchomi, follower of Saradomin.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4904", + "name": "Smelting Tutor", + "examine": "Feoras looks a bit fiery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4906", + "name": "Woodcutting Tutor", + "examine": "Wilfred, a chip off the old block.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4907", + "name": "Bank Tutor", + "examine": "Barb, ready to teach you about banking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4909", + "name": "Fritz the Glassblower", + "examine": "His motives are see-through.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4910", + "name": "Earth elemental", + "lifepoints": "35", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "melee_animation": "4868", + "defence_animation": "4869", + "death_animation": "4870", + "aggressive": "true", + "safespot": null + }, + { + "id": "4911", + "name": "Elemental rock", + "examine": "An elemental rock.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "4920", + "name": "Giant crypt rat", + "examine": "Overgrown vermin.", + "lifepoints": "26", + "attack_level": "21", + "strength_level": "20", + "defence_level": "23", + "range_level": "1", + "bonuses": "19,15,15,34,36,38,33,31,30,14,0,0,0,0,0", + "attack_speed": "5", + "weakness": "9", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4921", + "name": "Giant crypt rat", + "examine": "A nasty overgrown rodent.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4922", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4923", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4924", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4925", + "name": "Giant rat", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4926", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "10", + "attack_level": "7", + "strength_level": "7", + "defence_level": "7", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4927", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "10", + "attack_level": "7", + "strength_level": "7", + "defence_level": "7", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4928", + "name": "Dungeon rat", + "examine": "Overgrown vermin.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4929", + "name": "Dungeon rat", + "examine": "Overgrown vermin.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4930", + "name": "Goat", + "examine": "They'll eat anything!", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5341", + "defence_animation": "0", + "death_animation": "5343", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "4931", + "name": "Goat", + "examine": "They'll eat anything!", + "lifepoints": "7", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5341", + "defence_animation": "0", + "death_animation": "5343", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "4932", + "name": "Billy Goat", + "examine": "They'll eat anything!", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5341", + "defence_animation": "0", + "death_animation": "5343", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "4933", + "name": "Goat", + "lifepoints": "21", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5341", + "defence_animation": "5342", + "death_animation": "5343", + "safespot": null + }, + { + "id": "4934", + "name": "Goat", + "lifepoints": "21", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5341", + "defence_animation": "5342", + "death_animation": "5343", + "safespot": null + }, + { + "id": "4935", + "name": "Billy Goat", + "lifepoints": "28", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5341", + "defence_animation": "5342", + "death_animation": "5343", + "safespot": null + }, + { + "id": "4936", + "name": "Dungeon rat", + "examine": "A dirty rat.", + "lifepoints": "11", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "0", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4937", + "name": "Dungeon rat", + "examine": "A dirty rat.", + "lifepoints": "11", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "0", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4938", + "name": "Angry giant rat", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4939", + "name": "Angry giant rat", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4940", + "name": "Angry giant rat", + "examine": "He looks a little on the cross side!", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "4933", + "defence_animation": "0", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "67", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4941", + "name": "Blessed giant rat", + "examine": "It's one of Iban's pet vermin.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "67", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4942", + "name": "Giant rat", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4943", + "name": "Giant rat", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4944", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "26", + "attack_level": "21", + "strength_level": "20", + "defence_level": "23", + "range_level": "1", + "bonuses": "19,15,15,34,36,38,33,31,30,14,0,0,0,0,0", + "attack_speed": "5", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4945", + "name": "Giant rat", + "examine": "Overgrown vermin.", + "lifepoints": "26", + "attack_level": "21", + "strength_level": "20", + "defence_level": "23", + "range_level": "1", + "bonuses": "19,15,15,34,36,38,33,31,30,14,0,0,0,0,0", + "attack_speed": "5", + "weakness": "9", + "slayer_task": "67", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "4947", + "name": "My Arm", + "examine": "Trollish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "83", + "safespot": null + }, + { + "id": "4962", + "name": "Captain Barnaby", + "examine": "An old sailor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4965", + "name": "Tool Leprechaun", + "examine": "It's a leprechaun sunbathing on a mountain.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "4971", + "name": "Baby Roc", + "examine": "A mountain-dwelling bird. Cute", + "lifepoints": "100", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5031", + "defence_animation": "0", + "death_animation": "5033", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "4972", + "name": "Giant Roc", + "examine": "A very", + "lifepoints": "285", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "60", + "melee_animation": "5024", + "defence_animation": "0", + "death_animation": "5027", + "magic_animation": "0", + "range_animation": "5025", + "weakness": "10", + "slayer_task": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "4975", + "name": "Male slave", + "examine": "It looks like he's been here a long time.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "4977", + "name": "Female slave", + "examine": "She looks like she's been down here a long time.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "4989", + "name": "Mercenary", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4990", + "name": "Mercenary", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4991", + "name": "Mercenary", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4992", + "name": "Mercenary", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "4993", + "name": "Guard", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4994", + "name": "Guard", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4995", + "name": "Guard", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4996", + "name": "Guard", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4997", + "name": "Guard", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4998", + "name": "Guard", + "examine": "He looks a bit aggressive.", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "4999", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5000", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5001", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5002", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5026", + "name": "Egg launcher", + "examine": "An apprentice.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5027", + "name": "Egg launcher", + "examine": "A tired old wizard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5028", + "name": "Egg launcher", + "examine": "An egg launcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5029", + "name": "Commander Connad", + "examine": "A slightly more approachable barbarian.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5030", + "name": "Captain Cain", + "examine": "He looks pretty mean.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5031", + "name": "Private Paldo", + "examine": "A stressed out barbarian private.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5032", + "name": "Private Pendron", + "examine": "A barbarian private.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5033", + "name": "Private Pierreb", + "examine": "A barbarian private.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5034", + "name": "Private Paldon", + "examine": "A barbarian private.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5035", + "name": "Major Attack", + "examine": "A barbarian army teacher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5036", + "name": "Major Collect", + "examine": "A barbarian army teacher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5037", + "name": "Major Defend", + "examine": "A barbarian army teacher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5038", + "name": "Major Heal", + "examine": "A barbarian army teacher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5039", + "name": "Sergeant Sambur", + "examine": "He's keeping a close eye on that nearby door.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5040", + "name": "Penance Fighter", + "examine": "What on RuneScape is that?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5041", + "name": "Penance Ranger", + "examine": "Shooty-shooty.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5042", + "name": "Penance Runner", + "examine": "He's making a run for it!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5043", + "name": "Penance Healer", + "examine": "A nasty piece of work.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5048", + "name": "Jeff", + "examine": "Not as strong as Thok.", + "lifepoints": "22", + "attack_level": "80", + "strength_level": "80", + "defence_level": "40", + "range_level": "80", + "magic_level": "80", + "melee_animation": "401", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5067", + "name": "Shark", + "examine": "Time to run away...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5072", + "name": "Tropical wagtail", + "examine": "It blends in very well with its surroundings.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "safespot": null + }, + { + "id": "5073", + "name": "Crimson swift", + "examine": "This bird obviously doesn't believe in subtlety.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "safespot": null + }, + { + "id": "5074", + "name": "Cerulean twitch", + "examine": "Best served ice cold.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "safespot": null + }, + { + "id": "5075", + "name": "Golden warbler", + "examine": "Actually", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "safespot": null + }, + { + "id": "5076", + "name": "Copper longtail", + "examine": "Nothing much to get in a flap about.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "safespot": null + }, + { + "id": "5079", + "name": "Chinchompa", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "safespot": null + }, + { + "id": "5080", + "name": "Carnivorous chinchompa", + "examine": "It looks fluffy and cute; it's probably deadly.", + "lifepoints": "10", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "2", + "magic_level": "2", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "5183", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5081", + "name": "Ferret", + "examine": "Wild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5082", + "name": "Black warlock", + "examine": "A black warlock. The air seems to distort wherever it passes.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5083", + "name": "Snowy knight", + "examine": "It's a snowy knight butterfly.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5084", + "name": "Sapphire glacialis", + "examine": "A sapphire glacialis. It doesn't look as pretentious as its name sounds.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5085", + "name": "Ruby harvest", + "examine": "It's a ruby harvest butterfly.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5086", + "name": "Prickly kebbit", + "examine": "Curls up into a ball to protect itself from attack.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5087", + "name": "Sabre-toothed kebbit", + "examine": "Now that's a big overbite.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5088", + "name": "Barb-tailed kebbit", + "examine": "It uses its tail to hunt and skewer fish.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5089", + "name": "Wild kebbit", + "examine": "That's a mean looking set of claws.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5097", + "name": "Gyr Falcon", + "examine": "Ha! Thok much stronger.", + "lifepoints": "22", + "attack_level": "80", + "strength_level": "80", + "defence_level": "40", + "range_level": "80", + "magic_level": "80", + "melee_animation": "395", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5098", + "name": "Spotted kebbit", + "examine": "It seems to be on a permanent sugar rush.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5099", + "name": "Dark kebbit", + "examine": "Quieter than a ninja mouse with slippers on.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5100", + "name": "Dashing kebbit", + "examine": "Now you see it; now you don't.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5103", + "name": "Sabre-toothed kyatt", + "examine": "It's just like a big, white, furry, deadly can opener.", + "lifepoints": "10", + "attack_level": "25", + "strength_level": "25", + "defence_level": "99", + "range_level": "1", + "respawn_delay": "10", + "attack_speed": "5", + "melee_animation": "5228", + "defence_animation": "404", + "death_animation": "5234", + "magic_animation": "5228", + "range_animation": "5228", + "safespot": null + }, + { + "id": "5104", + "name": "Spined larupia", + "examine": "If you tried to ride that, you'd just impale yourself!", + "lifepoints": "10", + "attack_level": "15", + "strength_level": "15", + "defence_level": "99", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5228", + "defence_animation": "404", + "death_animation": "5234", + "magic_animation": "5228", + "range_animation": "5228", + "safespot": null + }, + { + "id": "5105", + "name": "Horned graahk", + "examine": "Get in a graahk's way and you're going to know about it... however briefly.", + "lifepoints": "10", + "attack_level": "25", + "strength_level": "25", + "defence_level": "99", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5228", + "defence_animation": "404", + "death_animation": "5234", + "magic_animation": "5228", + "range_animation": "5228", + "safespot": null + }, + { + "id": "5106", + "name": "null", + "examine": "It's just like a big, white, furry, deadly can opener.", + "lifepoints": "10", + "attack_level": "20", + "strength_level": "20", + "defence_level": "40", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5228", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "5228", + "range_animation": "5228", + "safespot": null + }, + { + "id": "5112", + "name": "Hunting expert", + "examine": "He must be good at hunting; even his hair blends in with the surroundings.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5113", + "name": "Hunting expert", + "examine": "With all the furs", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5114", + "name": "Orange salamander", + "examine": "Slightly slimy but kind of cute.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5115", + "name": "Red salamander", + "examine": "Slightly slimy but certainly striking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5116", + "name": "Black salamander", + "examine": "Slightly slimy and somewhat menacing.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5117", + "name": "Swamp lizard", + "examine": "Very slimy and generally disgusting.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5120", + "name": "Eagle", + "examine": "A very large", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5130", + "name": "Desert eagle", + "examine": "A very large", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5131", + "name": "Jungle eagle", + "examine": "A very large", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5132", + "name": "Polar eagle", + "examine": "A very large", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5133", + "name": "Eagle", + "examine": "It seems to be protecting the nest.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5137", + "name": "Kebbit", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5304", + "defence_animation": "5305", + "aggressive": "true", + "safespot": null + }, + { + "id": "5140", + "name": "Boulder", + "examine": "Now", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5144", + "name": "Double agent", + "examine": "He's playing both sides!", + "lifepoints": "85", + "attack_level": "75", + "strength_level": "75", + "defence_level": "75", + "range_level": "1", + "magic_level": "75", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "5145", + "name": "Double agent", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "5146", + "name": "Li'l lamb", + "examine": "How cute!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5147", + "name": "Lamb", + "examine": "The black sheep of the family.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5162", + "name": "Sheep", + "examine": "White and fluffy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5163", + "name": "Sheep", + "examine": "White and fluffy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5166", + "name": "Mountain Goat", + "examine": "This goat belongs to the mountain camp people.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5167", + "name": "Mountain Goat", + "examine": "This goat belongs to the mountain camp people.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5168", + "name": "Ram", + "lifepoints": "4", + "examine": "White and shaggy.", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5338", + "defence_animation": "5337", + "death_animation": "5336", + "safespot": null + }, + { + "id": "5169", + "name": "Ram", + "lifepoints": "4", + "examine": "White and shaggy.", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5338", + "defence_animation": "5337", + "death_animation": "5336", + "safespot": null + }, + { + "id": "5170", + "name": "Ram", + "examine": "White and shaggy.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5338", + "defence_animation": "5337", + "death_animation": "5336", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5171", + "name": "Mountain goat", + "examine": "This beast doesn't need climbing boots.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5172", + "name": "Golden sheep", + "examine": "Freshly shorn.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5173", + "name": "Golden sheep", + "examine": "Lovely thick wool.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5176", + "name": "Ogre shaman", + "examine": "Seems intelligent... for an ogre.", + "lifepoints": "371", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "64", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "5178", + "name": "Blue dragon", + "examine": "A mother dragon.", + "lifepoints": "105", + "attack_level": "95", + "strength_level": "95", + "defence_level": "95", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,50,70,70,60,50,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "4", + "melee_animation": "80", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "80", + "range_animation": "80", + "weakness": "3", + "slayer_task": "11", + "slayer_exp": "108", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "5181", + "name": "Ogre shaman", + "examine": "Seems intelligent... for an ogre.", + "lifepoints": "371", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "64", + "safespot": null + }, + { + "id": "5184", + "name": "Ogre shaman", + "examine": "Seems intelligent... for an ogre.", + "lifepoints": "371", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "64", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "5187", + "name": "Ogre shaman", + "examine": "Seems intelligent... for an ogre.", + "lifepoints": "371", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "64", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "5188", + "name": "Saff Waldon", + "examine": "It's Nial", + "lifepoints": "165", + "attack_level": "58", + "strength_level": "58", + "defence_level": "58", + "range_level": "58", + "magic_level": "58", + "respawn_delay": "60", + "melee_animation": "8946", + "defence_animation": "0", + "death_animation": "8948", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5190", + "name": "Ogre shaman", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "5193", + "name": "Ogre shaman", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "5195", + "name": "Wizard", + "examine": "A wizard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5196", + "name": "Wizard", + "examine": "A wizard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5197", + "name": "Wizard", + "examine": "A wizard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5204", + "name": "Alice's husband", + "examine": "She needs to work out before facing Thok.", + "lifepoints": "22", + "attack_level": "80", + "strength_level": "80", + "defence_level": "40", + "range_level": "80", + "magic_level": "80", + "melee_animation": "7041", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5211", + "name": "Undead cow", + "examine": "Converts grass to beef.", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "5850", + "death_animation": "5851", + "magic_animation": "5849", + "range_animation": "5849", + "safespot": null + }, + { + "id": "5229", + "name": "Penance Ranger", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5395", + "defence_animation": "5396", + "death_animation": "5937", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "5237", + "name": "Penance Ranger", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5395", + "defence_animation": "5396", + "death_animation": "5937", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "5247", + "name": "Penance Queen", + "examine": "Run away! Run away!", + "lifepoints": "71", + "attack_level": "260", + "strength_level": "260", + "defence_level": "132", + "range_level": "116", + "respawn_delay": "60", + "melee_animation": "5411", + "defence_animation": "0", + "death_animation": "5412", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5248", + "name": "Queen spawn", + "examine": "What's it looking at?", + "lifepoints": "450", + "attack_level": "60", + "strength_level": "60", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5092", + "defence_animation": "0", + "death_animation": "5093", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5249", + "name": "Captain Errdo", + "examine": "He looks embarrassed", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5250", + "name": "Scarab mage", + "examine": "Part scarab", + "lifepoints": "77", + "attack_level": "40", + "strength_level": "40", + "defence_level": "54", + "range_level": "1", + "magic_level": "54", + "respawn_delay": "60", + "melee_animation": "7615", + "defence_animation": "0", + "death_animation": "7616", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "slayer_task": "70", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "5251", + "name": "Locust rider", + "examine": "A mounted lancer.", + "lifepoints": "77", + "attack_level": "54", + "strength_level": "54", + "defence_level": "54", + "range_level": "1", + "melee_animation": "7584", + "defence_animation": "0", + "death_animation": "7581", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "5252", + "name": "Locust rider", + "examine": "A mounted archer.", + "lifepoints": "77", + "attack_level": "40", + "strength_level": "40", + "defence_level": "54", + "range_level": "54", + "melee_animation": "5451", + "defence_animation": "0", + "death_animation": "7581", + "magic_animation": "0", + "range_animation": "5451", + "weakness": "2", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "5253", + "name": "Giant scarab", + "examine": "A huge scarab beast.", + "lifepoints": "571", + "attack_level": "62", + "strength_level": "62", + "defence_level": "62", + "range_level": "62", + "magic_level": "62", + "melee_animation": "5457", + "defence_animation": "0", + "death_animation": "5456", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "5254", + "name": "Scarab mage", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7615", + "defence_animation": "7617", + "death_animation": "7616", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "5258", + "name": "Banker", + "examine": "He can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5260", + "name": "Banker", + "examine": "She can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5270", + "name": "Sophanem guard", + "examine": "A guard of Sophanem.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5274", + "name": "Sophanem guard", + "examine": "A guard of Sophanem.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5277", + "name": "Menaphite guard", + "examine": "A guard of Menaphos.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5285", + "name": "Osman", + "examine": "Flings annoying splinters at Thok.", + "lifepoints": "22", + "attack_level": "80", + "strength_level": "80", + "defence_level": "40", + "range_level": "80", + "magic_level": "80", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5293", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5294", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5295", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5296", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5297", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5298", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5299", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5300", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5301", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5302", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5303", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5304", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5305", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "18", + "attack_level": "11", + "strength_level": "1", + "defence_level": "10", + "range_level": "1", + "bonuses": "6,15,15,15,15,15,15,6,6,15,15,15,15,15,15", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "magic_animation": "5568", + "range_animation": "5568", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5306", + "name": "Zombie", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5307", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "18", + "attack_level": "11", + "strength_level": "1", + "defence_level": "10", + "range_level": "1", + "bonuses": "6,15,15,15,15,15,15,6,6,15,15,15,15,15,15", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "magic_animation": "5568", + "range_animation": "5568", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5308", + "name": "Zombie", + "lifepoints": "24", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5309", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "40", + "attack_level": "15", + "strength_level": "1", + "defence_level": "16", + "range_level": "1", + "bonuses": "10,15,16,16,15,16,16,10,10,16,15,15,15,15,15", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5571", + "range_animation": "5571", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5310", + "name": "Zombie", + "lifepoints": "24", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5311", + "name": "Zombie", + "lifepoints": "24", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5312", + "name": "Zombie", + "lifepoints": "24", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5313", + "name": "Zombie", + "lifepoints": "24", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5314", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5315", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5316", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5317", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5318", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5319", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "40", + "attack_level": "15", + "strength_level": "1", + "defence_level": "20", + "range_level": "1", + "bonuses": "12,20,20,20,20,20,20,12,12,20,20,20,20,20,20", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5571", + "range_animation": "5571", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5320", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "40", + "attack_level": "18", + "strength_level": "1", + "defence_level": "20", + "range_level": "1", + "bonuses": "12,20,20,20,20,20,20,12,12,20,20,20,20,20,20", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5571", + "range_animation": "5571", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5321", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "40", + "attack_level": "18", + "strength_level": "1", + "defence_level": "20", + "range_level": "1", + "bonuses": "12,20,20,20,20,20,20,12,12,20,20,20,20,20,20", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5571", + "range_animation": "5571", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5322", + "name": "Zombie", + "examine": "Dead man walking.", + "lifepoints": "30", + "attack_level": "20", + "strength_level": "19", + "defence_level": "23", + "range_level": "1", + "bonuses": "21,19,20,42,44,34,41,38,40,21,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "magic_animation": "5571", + "range_animation": "5571", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5323", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5324", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5325", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5326", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5327", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5328", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5329", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5330", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5331", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5332", + "name": "Skeleton", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5333", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5334", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5335", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "24", + "attack_level": "11", + "strength_level": "11", + "defence_level": "1", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5336", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "24", + "attack_level": "11", + "strength_level": "11", + "defence_level": "1", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5337", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "23", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "weakness": "8", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5338", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "23", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "weakness": "8", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5339", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "23", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "weakness": "8", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5340", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "23", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "5485", + "defence_animation": "5489", + "death_animation": "5491", + "magic_animation": "5485", + "range_animation": "5485", + "weakness": "8", + "slayer_task": "75", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5341", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "60", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5499", + "defence_animation": "0", + "death_animation": "5503", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5342", + "name": "Ghost", + "examine": "Eeek! A ghost!", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "18", + "range_level": "1", + "magic_level": "18", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "0", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "36", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5343", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5344", + "name": "Ghost", + "examine": "Eeek! A ghost!", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "18", + "range_level": "1", + "magic_level": "18", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "0", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "36", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5345", + "name": "Ghost", + "examine": "Eeek! A ghost!", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "18", + "range_level": "1", + "magic_level": "18", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "0", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "36", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5346", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5347", + "name": "Ghost", + "examine": "Eeek! A ghost!", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "18", + "range_level": "1", + "magic_level": "18", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "0", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "36", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5348", + "name": "Ghost", + "examine": "Eeek! A ghost!", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "18", + "range_level": "1", + "magic_level": "18", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "0", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "36", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5349", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5350", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5351", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5352", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5353", + "name": "Undead one", + "examine": "A minion of Rashiliyia.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "safespot": null + }, + { + "id": "5354", + "name": "Undead one", + "examine": "A minion of Rashiliyia.", + "lifepoints": "47", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "melee_animation": "5487", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "safespot": null + }, + { + "id": "5355", + "name": "Undead one", + "examine": "The animated dead; one of Rashiliyia's minions.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "0", + "death_animation": "5569", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "5356", + "name": "Undead one", + "examine": "The animated dead; one of Rashiliyia's minions.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "0", + "death_animation": "5569", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "5357", + "name": "Undead one", + "examine": "The animated dead; one of Rashiliyia's minions.", + "lifepoints": "47", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5571", + "defence_animation": "0", + "death_animation": "5575", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "5358", + "name": "Undead one", + "examine": "The animated dead; one of Rashiliyia's minions.", + "lifepoints": "47", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5571", + "defence_animation": "0", + "death_animation": "5575", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "5359", + "name": "Giant skeleton", + "examine": "A giant skeleton.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "melee_animation": "5499", + "defence_animation": "0", + "death_animation": "5503", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "safespot": null + }, + { + "id": "5361", + "name": "Waterfiend", + "examine": "A fiendish embodiment of water.", + "lifepoints": "128", + "attack_level": "70", + "strength_level": "167", + "defence_level": "50", + "range_level": "167", + "magic_level": "77", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "1582", + "defence_animation": "1581", + "death_animation": "1580", + "magic_animation": "1582", + "range_animation": "1582", + "projectile": "16", + "weakness": "4", + "slayer_task": "90", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "5362", + "name": "Brutal green dragon", + "examine": "It appears to be intelligent and savage.", + "lifepoints": "175", + "attack_level": "268", + "strength_level": "168", + "defence_level": "168", + "range_level": "0", + "magic_level": "168", + "poison_immune": "true", + "attack_speed": "4", + "melee_animation": "91", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "91", + "range_animation": "91", + "weakness": "3", + "slayer_task": "41", + "slayer_exp": "183", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "5363", + "name": "Mithril dragon", + "examine": "Experimenting with mithril gone bad!", + "lifepoints": "254", + "attack_level": "268", + "strength_level": "268", + "defence_level": "268", + "range_level": "168", + "magic_level": "168", + "bonuses": "0,0,0,0,0,50,100,70,30,90,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "91", + "defence_animation": "89", + "death_animation": "92", + "magic_animation": "91", + "range_animation": "91", + "weakness": "8", + "slayer_task": "57", + "slayer_exp": "273", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "5364", + "name": "Confused barbarian", + "examine": "It appears to be intelligent and savage.", + "lifepoints": "175", + "attack_level": "70", + "strength_level": "167", + "defence_level": "50", + "range_level": "167", + "attack_speed": "6", + "weakness": "7", + "safespot": null + }, + { + "id": "5365", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5366", + "name": "Skeleton", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5367", + "name": "Skeleton", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5368", + "name": "Skeleton", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5369", + "name": "Ghost", + "lifepoints": "36", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5370", + "name": "Ghost", + "lifepoints": "36", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5371", + "name": "Ghost", + "lifepoints": "36", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5372", + "name": "Ghost", + "examine": "Why does it attack with twigs? Swords and axes much better.", + "lifepoints": "36", + "attack_level": "80", + "strength_level": "80", + "defence_level": "40", + "range_level": "80", + "magic_level": "80", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "426", + "weakness": "10", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5373", + "name": "Ghost", + "examine": "Are these twigs meant to hurt Thok?", + "lifepoints": "36", + "attack_level": "80", + "strength_level": "80", + "defence_level": "40", + "range_level": "80", + "magic_level": "80", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "426", + "weakness": "10", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5374", + "name": "Ghost", + "examine": "It thinks it scary. Thok show it scary.", + "lifepoints": "36", + "attack_level": "80", + "strength_level": "80", + "defence_level": "70", + "range_level": "80", + "magic_level": "80", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5375", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "23", + "attack_level": "25", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "bonuses": "15,25,25,25,25,25,25,15,15,25,25,25,25,25,25", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "magic_animation": "5568", + "range_animation": "5568", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5376", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "23", + "attack_level": "25", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "bonuses": "15,25,25,25,25,25,25,15,15,25,25,25,25,25,25", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "magic_animation": "5568", + "range_animation": "5568", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5377", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "30", + "attack_level": "38", + "strength_level": "1", + "defence_level": "28", + "range_level": "1", + "bonuses": "15,25,28,28,25,28,28,15,15,28,25,25,25,25,25", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5579", + "death_animation": "5580", + "magic_animation": "5578", + "range_animation": "5578", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5378", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "30", + "attack_level": "38", + "strength_level": "1", + "defence_level": "28", + "range_level": "1", + "bonuses": "15,25,28,28,25,28,28,15,15,28,25,25,25,25,25", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5579", + "death_animation": "5580", + "magic_animation": "5578", + "range_animation": "5578", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5379", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "40", + "attack_level": "47", + "strength_level": "1", + "defence_level": "48", + "range_level": "1", + "bonuses": "35,45,45,45,45,45,45,35,35,45,45,45,45,45,45", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5579", + "death_animation": "5580", + "magic_animation": "5578", + "range_animation": "5578", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5380", + "name": "Zombie", + "examine": "Examine not added", + "lifepoints": "40", + "attack_level": "47", + "strength_level": "1", + "defence_level": "48", + "range_level": "1", + "bonuses": "35,45,45,45,45,45,45,35,35,45,45,45,45,45,45", + "respawn_delay": "30", + "attack_speed": "5", + "melee_animation": "5578", + "defence_animation": "5579", + "death_animation": "5580", + "magic_animation": "5578", + "range_animation": "5578", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5381", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "88", + "attack_level": "62", + "strength_level": "62", + "defence_level": "62", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5382", + "name": "Animated steel armour", + "examine": "Animated steel armour.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "4167", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "5384", + "name": "Giant skeleton", + "examine": "Big and bony, just how I like them.", + "lifepoints": "100", + "attack_level": "95", + "strength_level": "95", + "defence_level": "85", + "range_level": "1", + "bonuses": "25,25,25,25,25,25,25,25,25,25,25,25,25,25,25", + "poison_immune": "true", + "attack_speed": "2", + "melee_animation": "5499", + "defence_animation": "5489", + "death_animation": "5503", + "magic_animation": "5499", + "range_animation": "5499", + "start_gfx": "2713", + "projectile": "2718", + "aggressive": "true", + "safespot": null + }, + { + "id": "5385", + "name": "Skeleton", + "examine": "A skeleton in a dress!", + "lifepoints": "81", + "attack_level": "1", + "strength_level": "1", + "defence_level": "57", + "range_level": "1", + "magic_level": "57", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5487", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5386", + "name": "Skeleton", + "examine": "Achingly thin.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5487", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5387", + "name": "Skeleton", + "examine": "Look: another skeleton.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5388", + "name": "Skeleton", + "examine": "That skeleton's grinning at me.", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5487", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5389", + "name": "Skeleton", + "examine": "He needs a tan.", + "lifepoints": "72", + "attack_level": "51", + "strength_level": "51", + "defence_level": "51", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5487", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5390", + "name": "Skeleton", + "examine": "How do you know if a skeleton's male or female?", + "lifepoints": "420", + "attack_level": "36", + "strength_level": "36", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5391", + "name": "Skeleton", + "examine": "He obviously hasn't realised he's dead.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5392", + "name": "Skeleton", + "examine": "Put some meat on those bones!", + "lifepoints": "74", + "attack_level": "52", + "strength_level": "52", + "defence_level": "52", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5393", + "name": "Zombie", + "lifepoints": "56", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5394", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5395", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5396", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5397", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5398", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5399", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5400", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5401", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5402", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5403", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5404", + "name": "Zombie", + "lifepoints": "92", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5568", + "defence_animation": "5567", + "death_animation": "5569", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5405", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5406", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5407", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5408", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5409", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5410", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "5411", + "name": "Skeleton", + "examine": "An angry skeleton.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5487", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5412", + "name": "Skeleton", + "examine": "Cross bones.", + "lifepoints": "81", + "attack_level": "57", + "strength_level": "57", + "defence_level": "57", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5413", + "name": "Possessed pickaxe", + "examine": "How does it move of its own accord?", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5591", + "defence_animation": "0", + "death_animation": "5592", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "5414", + "name": "Animated spade", + "examine": "How does it move of its own accord?", + "lifepoints": "74", + "attack_level": "52", + "strength_level": "52", + "defence_level": "52", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5597", + "defence_animation": "0", + "death_animation": "5596", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "5417", + "name": "Terror dog", + "examine": "A terrifying dog beast.", + "lifepoints": "134", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5625", + "defence_animation": "0", + "death_animation": "5628", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "slayer_task": "82", + "aggressive": "true", + "safespot": null + }, + { + "id": "5418", + "name": "Terror dog", + "lifepoints": "82", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5625", + "defence_animation": "5626", + "death_animation": "5627", + "aggressive": "true", + "safespot": null + }, + { + "id": "5420", + "name": "Tarn", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "5617", + "defence_animation": "5618", + "death_animation": "5619", + "aggressive": "true", + "safespot": null + }, + { + "id": "5421", + "name": "Mutant tarn", + "examine": "I preferred him when he was human.", + "lifepoints": "325", + "attack_level": "57", + "strength_level": "57", + "defence_level": "57", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "5617", + "defence_animation": "0", + "death_animation": "5619", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "5422", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "90", + "attack_level": "63", + "strength_level": "63", + "defence_level": "63", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5485", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "5439", + "name": "null", + "examine": "What restful music!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5442", + "name": "KGP Agent", + "examine": "What restful music!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5447", + "name": "Agility Instructor", + "examine": "Instructs agility.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5448", + "name": "Army Commander", + "examine": "An army commander.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5452", + "name": "Icelord", + "examine": "Sturdy cold being.", + "lifepoints": "42", + "attack_level": "22", + "strength_level": "22", + "defence_level": "30", + "range_level": "30", + "respawn_delay": "60", + "melee_animation": "5724", + "defence_animation": "0", + "death_animation": "5726", + "magic_animation": "0", + "range_animation": "5725", + "weakness": "0", + "slayer_task": "48", + "aggressive": "true", + "safespot": null + }, + { + "id": "5453", + "name": "Icelord", + "examine": "Sturdy cold being.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5724", + "defence_animation": "0", + "death_animation": "5726", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "48", + "aggressive": "true", + "safespot": null + }, + { + "id": "5454", + "name": "Icelord", + "examine": "Sturdy cold being.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5724", + "defence_animation": "0", + "death_animation": "5726", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "48", + "aggressive": "true", + "safespot": null + }, + { + "id": "5455", + "name": "Icelord", + "examine": "Sturdy cold being.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5724", + "defence_animation": "0", + "death_animation": "5726", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "48", + "aggressive": "true", + "safespot": null + }, + { + "id": "5472", + "name": "Ice Troll King", + "examine": "An impressive-looking troll.", + "lifepoints": "185", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "respawn_delay": "60", + "melee_animation": "5374", + "defence_animation": "0", + "death_animation": "5209", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "slayer_task": "83", + "aggressive": "true", + "safespot": null + }, + { + "id": "5473", + "name": "Ice troll runt", + "examine": "An ice troll youngling.", + "lifepoints": "54", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "5474", + "name": "Ice troll male", + "examine": "A male troll wielding a large club.", + "lifepoints": "70", + "attack_level": "49", + "strength_level": "49", + "defence_level": "49", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "5475", + "name": "Ice troll female", + "examine": "An ice troll with a bag of rocks.", + "lifepoints": "70", + "attack_level": "36", + "strength_level": "36", + "defence_level": "49", + "range_level": "49", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "5476", + "name": "Ice troll grunt", + "examine": "A large ice troll.", + "lifepoints": "70", + "attack_level": "49", + "strength_level": "49", + "defence_level": "49", + "range_level": "1", + "melee_animation": "4332", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "5478", + "name": "King Gjuki Sorvott IV", + "examine": "An ill-tempered king.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5480", + "name": "Thorkel Silkbeard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "5489", + "name": "Guard", + "examine": "A guard on insult duty.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5490", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5491", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5492", + "name": "Guard", + "examine": "One of King Sorvott's militia.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5497", + "name": "Miner", + "examine": "A miner at work.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5514", + "name": "Honour guard", + "examine": "The Burgher's protectors.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5516", + "name": "Honour guard", + "examine": "The Burgher's protectors.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "5517", + "name": "Honour guard", + "examine": "One of your militia.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "5521", + "name": "Ice troll runt", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "5522", + "name": "Ice troll male", + "lifepoints": "80", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "5523", + "name": "Ice troll female", + "lifepoints": "80", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "5525", + "name": "Ice troll runt", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "5526", + "name": "Ice troll male", + "lifepoints": "80", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "5527", + "name": "Ice troll female", + "lifepoints": "80", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "5529", + "name": "Yak", + "examine": "A hairy, smelly, grazing animal.", + "lifepoints": "50", + "attack_level": "3", + "strength_level": "7", + "defence_level": "30", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "5782", + "defence_animation": "5783", + "death_animation": "5784", + "magic_animation": "5782", + "range_animation": "5782", + "weakness": "7", + "safespot": null + }, + { + "id": "5531", + "name": "Sorceress", + "examine": "Antisocial.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5532", + "name": "Apprentice", + "examine": "Come", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5533", + "name": "Autumn Elemental", + "examine": "An autumn elemental.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5539", + "name": "Spring Elemental", + "examine": "A spring elemental.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5547", + "name": "Summer Elemental", + "examine": "A summer elemental.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5553", + "name": "Winter Elemental", + "examine": "A winter elemental.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5561", + "name": "Osman", + "examine": "It dare attack Pretty Lass? Thok crush its puny skull!", + "lifepoints": "157", + "attack_level": "95", + "strength_level": "95", + "defence_level": "50", + "range_level": "95", + "magic_level": "95", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5571", + "name": "Sin Seer", + "examine": "She's honest about the things you aren't.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5572", + "name": "Ghost", + "examine": "A Shadow Realm guardian.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "25", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "5581", + "name": "Homunculus", + "examine": "Is it male or female?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5584", + "name": "Cage", + "examine": "Strong", + "lifepoints": "85", + "attack_level": "95", + "strength_level": "95", + "defence_level": "70", + "range_level": "95", + "magic_level": "95", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5589", + "name": "'Black-eye", + "examine": "Famous for his fights.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5590", + "name": "'No fingers", + "examine": "Count them pinkies!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5591", + "name": "'Gummy", + "examine": "He wishes he had teeth.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5593", + "name": "Frogeel", + "examine": "Is it a frog", + "lifepoints": "70", + "attack_level": "36", + "strength_level": "36", + "defence_level": "49", + "range_level": "49", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5842", + "defence_animation": "0", + "death_animation": "5841", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "5594", + "name": "Spidine", + "lifepoints": "35", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "143", + "defence_animation": "144", + "death_animation": "146", + "safespot": null + }, + { + "id": "5595", + "name": "Swordchick", + "examine": "Definitely not a chicken or a swordfish.", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5387", + "defence_animation": "0", + "death_animation": "5389", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "5596", + "name": "Jubster", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6800", + "defence_animation": "6802", + "death_animation": "6801", + "aggressive": "true", + "safespot": null + }, + { + "id": "5597", + "name": "Newtroost", + "examine": "Since when did newts have beaks?", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2299", + "defence_animation": "0", + "death_animation": "2301", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "5603", + "name": "Unicow", + "examine": "Half unicorn", + "lifepoints": "58", + "attack_level": "30", + "strength_level": "30", + "defence_level": "41", + "range_level": "1", + "magic_level": "41", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5849", + "defence_animation": "0", + "death_animation": "5851", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "aggressive": "true", + "safespot": null + }, + { + "id": "5608", + "name": "Monk", + "examine": "Holier than thou.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5609", + "name": "Monk", + "examine": "Holier than thou.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5610", + "name": "Monk", + "examine": "Holier than thou.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5611", + "name": "Monk", + "examine": "Holier than thou.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5614", + "name": "Puffin", + "examine": "I'd prefer it if it were a muffin...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5619", + "name": "Monk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5620", + "name": "Monk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5621", + "name": "Monk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5622", + "name": "Monk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5627", + "name": "Sorebones", + "examine": "Bedside manner is a little lacking", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "melee_animation": "5643", + "defence_animation": "0", + "death_animation": "5658", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "safespot": null + }, + { + "id": "5628", + "name": "Sorebones", + "examine": "I hope his hands don't shake.", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "melee_animation": "5643", + "defence_animation": "0", + "death_animation": "5658", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "safespot": null + }, + { + "id": "5629", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5630", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5631", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5632", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5633", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5634", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5635", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5636", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5637", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5638", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5639", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5640", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5641", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5642", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5880", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5643", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5880", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5644", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5880", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5645", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5880", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5646", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5880", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5647", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5884", + "defence_animation": "0", + "death_animation": "5886", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5648", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5884", + "defence_animation": "0", + "death_animation": "5886", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5649", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5650", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5884", + "defence_animation": "0", + "death_animation": "5886", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5651", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5652", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5884", + "defence_animation": "0", + "death_animation": "5886", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5653", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5654", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5884", + "defence_animation": "0", + "death_animation": "5886", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5655", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5656", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5889", + "defence_animation": "0", + "death_animation": "5891", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5657", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5658", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5889", + "defence_animation": "0", + "death_animation": "5891", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5659", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5889", + "defence_animation": "0", + "death_animation": "5891", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5660", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5661", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5889", + "defence_animation": "0", + "death_animation": "5891", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5662", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5663", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5889", + "defence_animation": "0", + "death_animation": "5891", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5664", + "name": "Zombie pirate", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "5648", + "death_animation": "5649", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5665", + "name": "Zombie pirate", + "examine": "Aaaarg", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5889", + "defence_animation": "0", + "death_animation": "5891", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5666", + "name": "Barrelchest", + "examine": "It's trying to mash you flat! Less examine", + "lifepoints": "285", + "attack_level": "52", + "strength_level": "52", + "defence_level": "52", + "range_level": "52", + "magic_level": "52", + "respawn_delay": "60", + "melee_animation": "5895", + "defence_animation": "0", + "death_animation": "5898", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5680", + "name": "Undead Lumberjack", + "examine": "He is one", + "lifepoints": "100", + "attack_level": "73", + "strength_level": "73", + "defence_level": "10", + "range_level": "1", + "melee_animation": "5970", + "defence_animation": "0", + "death_animation": "5972", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5750", + "name": "Cave bug", + "examine": "A big", + "lifepoints": "93", + "attack_level": "1", + "strength_level": "1", + "defence_level": "9", + "range_level": "9", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6079", + "defence_animation": "0", + "death_animation": "6081", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "15", + "slayer_exp": "93", + "safespot": null + }, + { + "id": "5751", + "name": "Molanisk", + "examine": "A strange mole-like being.", + "lifepoints": "52", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6012", + "defence_animation": "6013", + "death_animation": "6014", + "slayer_exp": "52", + "clue_level": "1", + "safespot": null + }, + { + "id": "5752", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5753", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5754", + "name": "Cave goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5755", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5756", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5757", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5758", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5759", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5760", + "name": "Cave goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5761", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5762", + "name": "Cave goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5763", + "name": "Cave goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5764", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5765", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5766", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5767", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5768", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5769", + "name": "Cave goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5776", + "name": "Banker", + "examine": "Looks after cave goblin money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5777", + "name": "Banker", + "examine": "Looks after cave goblin money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5783", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5784", + "name": "Crate goblin", + "examine": "Taking a terribly important box from one place to another.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5785", + "name": "Cave goblin", + "examine": "One of the many citizens of Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5786", + "name": "Goblin scribe", + "examine": "Good at shorthand.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5800", + "name": "Guard", + "examine": "He keeps order in the city.", + "lifepoints": "60", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "0", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "38", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5801", + "name": "Guard", + "examine": "He keeps order in the city.", + "lifepoints": "60", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "melee_animation": "6007", + "defence_animation": "0", + "death_animation": "6003", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "38", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5803", + "name": "Young 'un", + "examine": "A goblin baby.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5805", + "name": "Nipper", + "examine": "A goblin baby.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5807", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5808", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5809", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5810", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5811", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5812", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5813", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5814", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5815", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5816", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5817", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5818", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5819", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5820", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5821", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5822", + "name": "Cave goblin child", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5823", + "name": "Spit goblin", + "examine": "Don't spit", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5824", + "name": "Goblin fish", + "examine": "A bug-eyed little goblin fish. How cute.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5827", + "name": "Moths", + "examine": "Annoying little flappy things.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5829", + "name": "Rabbit", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6090", + "defence_animation": "6091", + "death_animation": "6092", + "safespot": null + }, + { + "id": "5833", + "name": "Rat Burgiss", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "5842", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5843", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5844", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5845", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5846", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5847", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5848", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5849", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5850", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5851", + "name": "Outlaw", + "examine": "A mean looking outlaw. Don't get too close!", + "lifepoints": "32", + "attack_level": "23", + "strength_level": "23", + "defence_level": "23", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5852", + "name": "Monkey", + "examine": "Weird eyeball thing. Reminds Thok of breakfast.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "40", + "range_level": "60", + "magic_level": "60", + "melee_animation": "0", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "5854", + "name": "Bench", + "examine": "For sitting on.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5855", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5856", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5859", + "name": "H.A.M. Archer", + "examine": "He looks pretty skilled with that bow.", + "lifepoints": "57", + "attack_level": "15", + "strength_level": "15", + "defence_level": "20", + "range_level": "20", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "aggressive": "true", + "clue_level": "0", + "safespot": null + }, + { + "id": "5860", + "name": "H.A.M. Mage", + "examine": "He bristles with arcane power.", + "lifepoints": "57", + "attack_level": "15", + "strength_level": "15", + "defence_level": "20", + "range_level": "1", + "magic_level": "20", + "respawn_delay": "60", + "melee_animation": "429", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "aggressive": "true", + "clue_level": "0", + "safespot": null + }, + { + "id": "5861", + "name": "Zanik", + "examine": "No match for Thok. Silly demon.", + "lifepoints": "71", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "defence_animation": "0", + "magic_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5864", + "name": "Builder", + "examine": "A worker on the train link.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5865", + "name": "Builder", + "examine": "A worker on the train link.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5866", + "name": "Builder", + "examine": "A worker on the train link.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5867", + "name": "Builder", + "examine": "A worker on the train link.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5873", + "name": "Cave goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5874", + "name": "Cave goblin", + "examine": "A goblin with big", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5875", + "name": "Cave goblin", + "examine": "A goblin with big", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5876", + "name": "Cave goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5877", + "name": "Cave goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5878", + "name": "Cave goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5879", + "name": "Ticket goblin", + "examine": "He sells tickets to Keldagrim.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "38", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "5880", + "name": "Dwarf", + "examine": "A dwarf from Keldagrim.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "5881", + "name": "Dwarf", + "examine": "A dwarf from Keldagrim.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "5882", + "name": "Dwarf", + "examine": "A dwarf from Keldagrim.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "5883", + "name": "Dwarf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "5884", + "name": "Dwarf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "5885", + "name": "Dwarf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "5886", + "name": "Ticket dwarf", + "examine": "He sells tickets to Dorgesh-Kaan.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5902", + "name": "The Inadequacy", + "examine": "Are you good enough to fight?", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "respawn_delay": "60", + "melee_animation": "6318", + "defence_animation": "0", + "death_animation": "6322", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5903", + "name": "The Everlasting", + "examine": "Can you endure long enough?", + "lifepoints": "191", + "attack_level": "67", + "strength_level": "67", + "defence_level": "67", + "range_level": "67", + "magic_level": "67", + "respawn_delay": "60", + "melee_animation": "6345", + "defence_animation": "0", + "death_animation": "6347", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5904", + "name": "The Untouchable", + "examine": "Can you bring yourself to hurt another?", + "lifepoints": "100", + "attack_level": "65", + "strength_level": "65", + "defence_level": "75", + "range_level": "65", + "magic_level": "65", + "respawn_delay": "60", + "melee_animation": "6329", + "defence_animation": "0", + "death_animation": "6331", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5905", + "name": "The Illusive", + "examine": "What if you don't know how to win?", + "lifepoints": "90", + "attack_level": "63", + "strength_level": "63", + "defence_level": "63", + "range_level": "63", + "magic_level": "63", + "respawn_delay": "60", + "melee_animation": "6342", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5906", + "name": "A Doubt", + "examine": "You can't escape your inadequacy!", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6310", + "defence_animation": "0", + "death_animation": "6315", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "5908", + "name": "Dying tree", + "examine": "Dead stone defending a dead throne room.", + "lifepoints": "142", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "5909", + "name": "Barbarian", + "examine": "Don't let her arm-wrestle you for money.", + "lifepoints": "28", + "attack_level": "20", + "strength_level": "20", + "defence_level": "20", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "0", + "safespot": null + }, + { + "id": "5910", + "name": "Cook", + "examine": "A greasy", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5911", + "name": "Cook", + "examine": "He's suspiciously talented with a meat-cleaver.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5914", + "name": "Iffie", + "examine": "This grizzled soldier is here to distribute Rated Clan Wars badges.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5916", + "name": "Cleaner", + "examine": "Does what too many people aren't interested in doing.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5917", + "name": "Stray dog", + "examine": "A mangy mutt.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5919", + "name": "Guard", + "examine": "He tries to keep order around here. His bizarre uniform isn't helping.", + "lifepoints": "25", + "attack_level": "18", + "strength_level": "18", + "defence_level": "18", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6489", + "defence_animation": "0", + "death_animation": "6490", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5920", + "name": "Guard", + "examine": "He tries to keep order around here. His bizarre uniform isn't helping.", + "lifepoints": "25", + "attack_level": "18", + "strength_level": "18", + "defence_level": "18", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6489", + "defence_animation": "0", + "death_animation": "6490", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5921", + "name": "Trainee Guard", + "examine": "He's studying to be a guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "5922", + "name": "Captain", + "examine": "Trains the guards of the future.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5923", + "name": "Man", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "5924", + "name": "Woman", + "examine": "One of RuneScape's many citizens.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "5926", + "name": "Thief", + "examine": "Known for his light-fingered qualities.", + "lifepoints": "25", + "attack_level": "9", + "strength_level": "9", + "defence_level": "9", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5927", + "name": "Thief", + "examine": "Known for his light-fingered qualities.", + "lifepoints": "25", + "attack_level": "9", + "strength_level": "9", + "defence_level": "9", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5928", + "name": "Thief", + "examine": "Known for her light-fingered qualities.", + "lifepoints": "24", + "attack_level": "9", + "strength_level": "9", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5929", + "name": "Thief", + "examine": "Known for her light-fingered qualities.", + "lifepoints": "24", + "attack_level": "9", + "strength_level": "9", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "5930", + "name": "Art Critic Jacques", + "examine": "Jacques Netis - a slightly pompous art expert.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5931", + "name": "Historian Minas", + "examine": "Seth Minas - an aged expert in RuneScape history.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5938", + "name": "Information clerk", + "examine": "A lady with lots of information about the Museum.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5944", + "name": "Teacher and pupil", + "examine": "A teacher and one of his pupils.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5945", + "name": "Schoolboy", + "examine": "Looks kind of familiar.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5947", + "name": "Teacher and pupil", + "examine": "A teacher and one of her pupils.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5952", + "name": "Workman", + "examine": "Looks hard at work.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5954", + "name": "Workman", + "examine": "Could there be something exciting in his wheelbarrow?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5956", + "name": "Void Knight", + "examine": "A powerful knight of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5958", + "name": "Digsite workman", + "examine": "Wheelbarrow loader.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5959", + "name": "Barge workman", + "examine": "Working hard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5960", + "name": "Barge workman", + "examine": "Working hard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5961", + "name": "Barge workman", + "examine": "Working hard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5962", + "name": "Barge workman", + "examine": "Working hard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5963", + "name": "Barge foreman", + "examine": "Working hard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5966", + "name": "Natural historian", + "examine": "An aged expert in natural history.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5971", + "name": "Leech display", + "examine": "Bloodsuckers!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5972", + "name": "Sea slugs display", + "examine": "Slugs of the sea variety.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5973", + "name": "Snail display", + "examine": "A house on its back.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5974", + "name": "Monkey display", + "examine": "A cheeky little monkey.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "5975", + "name": "Lizard display", + "examine": "A scaly little fellow.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5976", + "name": "Penguin display", + "examine": "Nice suit.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5977", + "name": "Camel display", + "examine": "He's got the hump.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5978", + "name": "Terrorbird display", + "examine": "Terrifying!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5979", + "name": "Dragon display", + "examine": "Looks like a fire-breather.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "5980", + "name": "Wyvern display", + "examine": "Needs a good square meal.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5981", + "name": "Battle tortoise display", + "examine": "A huge beast.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5982", + "name": "Mole display", + "examine": "Loves making molehills.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "5986", + "name": "Workman", + "examine": "It hides in stone", + "lifepoints": "34", + "attack_level": "95", + "strength_level": "95", + "defence_level": "1", + "range_level": "95", + "magic_level": "95", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "5990", + "name": "Rupert the Beard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "5992", + "name": "Rupert the Beard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "5993", + "name": "Experiment No.2", + "examine": "A very odd looking creature.", + "lifepoints": "131", + "attack_level": "46", + "strength_level": "46", + "defence_level": "46", + "range_level": "46", + "magic_level": "46", + "respawn_delay": "60", + "melee_animation": "6513", + "defence_animation": "0", + "death_animation": "6512", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "5994", + "name": "Mouse", + "examine": "A huge mouse. It looks hungry...", + "lifepoints": "62", + "attack_level": "44", + "strength_level": "44", + "defence_level": "44", + "range_level": "1", + "melee_animation": "6519", + "defence_animation": "0", + "death_animation": "6521", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "5996", + "name": "Glod", + "lifepoints": "160", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6501", + "defence_animation": "6503", + "death_animation": "6502", + "aggressive": "true", + "safespot": null + }, + { + "id": "5999", + "name": "Rupert the Beard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "6001", + "name": "Rupert the Beard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "6006", + "name": "Werewolf", + "examine": "I wish the moon wasn't out!", + "lifepoints": "87", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,20,20,20", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6007", + "name": "Werewolf", + "examine": "I wish the moon wasn't out!", + "lifepoints": "87", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,20,20,20", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6008", + "name": "Werewolf", + "examine": "I wish the moon wasn't out!", + "lifepoints": "87", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,20,20,20", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6009", + "name": "Werewolf", + "examine": "I wish the moon wasn't out!", + "lifepoints": "87", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,20,20,20", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6010", + "name": "Werewolf", + "examine": "I wish the moon wasn't out!", + "lifepoints": "87", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,20,20,20", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6011", + "name": "Werewolf", + "examine": "I wish the moon wasn't out!", + "lifepoints": "87", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,20,20,20", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6012", + "name": "Werewolf", + "examine": "I wish the moon wasn't out!", + "lifepoints": "87", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,20,20,20", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6013", + "name": "Werewolf", + "examine": "I wish the moon wasn't out!", + "lifepoints": "87", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,20,20,20", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6014", + "name": "Werewolf", + "examine": "I wish the moon wasn't out!", + "lifepoints": "87", + "attack_level": "76", + "strength_level": "76", + "defence_level": "76", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,20,20,20", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6015", + "name": "Werewolf", + "examine": "Eek! A werewolf!", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "0", + "death_animation": "6537", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6016", + "name": "Werewolf", + "examine": "Eek! A werewolf!", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "0", + "death_animation": "6537", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6017", + "name": "Werewolf", + "examine": "Eek! A werewolf!", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "0", + "death_animation": "6537", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6018", + "name": "Werewolf", + "examine": "Eek! A werewolf!", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "0", + "death_animation": "6537", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6019", + "name": "Werewolf", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6020", + "name": "Werewolf", + "examine": "Eek! A werewolf!", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "0", + "death_animation": "6537", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6021", + "name": "Werewolf", + "examine": "Eek! A werewolf!", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "0", + "death_animation": "6537", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6022", + "name": "Werewolf", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6023", + "name": "Werewolf", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6024", + "name": "Werewolf", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6025", + "name": "Werewolf", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6026", + "name": "Boris", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6027", + "name": "Imre", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6028", + "name": "Yuri", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6029", + "name": "Joseph", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6030", + "name": "Nikolai", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6031", + "name": "Eduard", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6032", + "name": "Lev", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6033", + "name": "Georgy", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6034", + "name": "Svetlana", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6035", + "name": "Irina", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6036", + "name": "Alexis", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6037", + "name": "Milla", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6038", + "name": "Galina", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6039", + "name": "Sofiya", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6040", + "name": "Ksenia", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6041", + "name": "Yadviga", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6042", + "name": "Nikita", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6043", + "name": "Vera", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6044", + "name": "Zoja", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6045", + "name": "Liliya", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6046", + "name": "Big Wolf", + "lifepoints": "74", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6559", + "defence_animation": "6557", + "death_animation": "6558", + "slayer_exp": "74", + "aggressive": "true", + "safespot": null + }, + { + "id": "6047", + "name": "Wolf", + "examine": "A vicious mountain wolf.", + "lifepoints": "69", + "attack_level": "22", + "strength_level": "1", + "defence_level": "22", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "slayer_exp": "34", + "aggressive": "true", + "combat_audio": "481,491,490", + "safespot": null + }, + { + "id": "6048", + "name": "Wolf", + "examine": "Now it has no armour", + "lifepoints": "157", + "attack_level": "95", + "strength_level": "95", + "defence_level": "1", + "range_level": "95", + "magic_level": "95", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "slayer_exp": "34", + "aggressive": "true", + "combat_audio": "481,491,490", + "safespot": null + }, + { + "id": "6049", + "name": "Wolf", + "examine": "A big coward. Thok mocks scaredy man.", + "lifepoints": "100", + "attack_level": "75", + "strength_level": "75", + "defence_level": "75", + "range_level": "75", + "magic_level": "75", + "defence_animation": "0", + "magic_animation": "0", + "weakness": "10", + "slayer_exp": "34", + "aggressive": "true", + "combat_audio": "481,491,490", + "safespot": null + }, + { + "id": "6050", + "name": "Desert Wolf", + "examine": "A vicious desert wolf.", + "lifepoints": "55", + "attack_level": "20", + "strength_level": "20", + "defence_level": "5", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6558", + "magic_animation": "6579", + "range_animation": "6579", + "weakness": "9", + "slayer_task": "92", + "safespot": null + }, + { + "id": "6051", + "name": "Desert Wolf", + "examine": "A vicious desert wolf.", + "lifepoints": "55", + "attack_level": "20", + "strength_level": "20", + "defence_level": "5", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6558", + "magic_animation": "6579", + "range_animation": "6579", + "safespot": null + }, + { + "id": "6052", + "name": "Ice wolf", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6559", + "defence_animation": "6557", + "death_animation": "6558", + "aggressive": "true", + "safespot": null + }, + { + "id": "6054", + "name": "Dragon impling", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6064", + "name": "Dragon impling", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6072", + "name": "Fairy Aeryka", + "examine": "She tends the wheat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6073", + "name": "Wandering impling", + "examine": "He looks a little lost.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6074", + "name": "Imp defender", + "examine": "An angry little imp. Grrr.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "6078", + "name": "Cyclops", + "examine": "A one-eyed man eater.", + "lifepoints": "75", + "attack_level": "65", + "strength_level": "65", + "defence_level": "35", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "44", + "slayer_exp": "75", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6079", + "name": "Cyclops", + "examine": "A one-eyed woman eater.", + "lifepoints": "100", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "slayer_task": "44", + "slayer_exp": "100", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6080", + "name": "Cyclops", + "examine": "A one-eyed man eater.", + "lifepoints": "75", + "attack_level": "65", + "strength_level": "65", + "defence_level": "35", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "44", + "slayer_exp": "75", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6081", + "name": "Cyclops", + "examine": "A one-eyed woman eater.", + "lifepoints": "100", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "slayer_task": "44", + "slayer_exp": "100", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6088", + "name": "Zombie rat", + "examine": "Overgrown undead vermin.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4933", + "defence_animation": "0", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "67", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6089", + "name": "Zombie rat", + "examine": "Overgrown undead vermin.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4933", + "defence_animation": "0", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "67", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6090", + "name": "Zombie rat", + "examine": "Overgrown undead vermin.", + "lifepoints": "2", + "attack_level": "2", + "strength_level": "2", + "defence_level": "2", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "4933", + "defence_animation": "0", + "death_animation": "4935", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "67", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6091", + "name": "Skeleton", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6092", + "name": "Skeleton", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6093", + "name": "Skeleton", + "examine": "Could do with gaining a few pounds.", + "lifepoints": "12", + "attack_level": "9", + "strength_level": "9", + "defence_level": "9", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5487", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6094", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5540", + "defence_animation": "5541", + "death_animation": "5542", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "6095", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "6096", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "6097", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "6098", + "name": "Ghost", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5532", + "defence_animation": "5533", + "death_animation": "5534", + "slayer_exp": "25", + "aggressive": "true", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "6099", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "6100", + "name": "Zombie", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "6101", + "name": "Lesser demon", + "examine": "Lesser, but still pretty big.", + "lifepoints": "79", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "magic_level": "40", + "bonuses": "15,15,15,15,15,15,15,15,15,3,15,15,23,15,15", + "respawn_delay": "20", + "attack_speed": "6", + "melee_animation": "4630", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "4630", + "range_animation": "4630", + "weakness": "3", + "slayer_task": "56", + "slayer_exp": "79", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "6102", + "name": "Lost barbarian", + "examine": "His face is expressionless.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "6103", + "name": "Skeleton hero", + "examine": "An opponent from the grave. He seems unimpressed by your bone rummaging.", + "lifepoints": "75", + "attack_level": "53", + "strength_level": "53", + "defence_level": "53", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2067", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6104", + "name": "Skeleton brute", + "examine": "An ex-barbarian", + "lifepoints": "90", + "attack_level": "63", + "strength_level": "63", + "defence_level": "63", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6105", + "name": "Skeleton warlord", + "examine": "He's heartless.", + "lifepoints": "92", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2067", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6106", + "name": "Skeleton heavy", + "examine": "He's less heavy now.", + "lifepoints": "91", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6107", + "name": "Skeleton thug", + "examine": "Floats like an anvil", + "lifepoints": "87", + "attack_level": "61", + "strength_level": "61", + "defence_level": "61", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6108", + "name": "Entrana firebird", + "examine": "Probably not a chicken.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6811", + "defence_animation": "0", + "death_animation": "6812", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "slayer_task": "7", + "safespot": null + }, + { + "id": "6109", + "name": "Mounted terrorbird gnome", + "examine": "These gnomes know how to get around!", + "lifepoints": "54", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6790", + "defence_animation": "0", + "death_animation": "6791", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "7", + "safespot": null + }, + { + "id": "6110", + "name": "Mounted terrorbird gnome", + "lifepoints": "55", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6790", + "defence_animation": "6792", + "death_animation": "6791", + "safespot": null + }, + { + "id": "6111", + "name": "Mounted terrorbird gnome", + "lifepoints": "55", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6790", + "defence_animation": "6792", + "death_animation": "6791", + "safespot": null + }, + { + "id": "6112", + "name": "Ducklings", + "examine": "Aww", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "aggressive": "true", + "water_npc": "true", + "safespot": null + }, + { + "id": "6113", + "name": "Duck", + "lifepoints": "3", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "747", + "defence_animation": "3268", + "death_animation": "750", + "safespot": null + }, + { + "id": "6115", + "name": "Seagull", + "examine": "A messy bird.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "3467", + "defence_animation": "1014", + "death_animation": "3468", + "magic_animation": "3467", + "range_animation": "3467", + "weakness": "6", + "slayer_task": "7", + "safespot": null + }, + { + "id": "6116", + "name": "Seagull", + "examine": "A messy bird.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "3467", + "defence_animation": "1014", + "death_animation": "3468", + "magic_animation": "3467", + "range_animation": "3467", + "safespot": null + }, + { + "id": "6117", + "name": "Mr. Mordaut", + "examine": "Do not upset this teacher. You have been warned!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6118", + "name": "Observatory assistant", + "examine": "He helps the professor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6122", + "name": "Sleeping guard", + "examine": "Sleeping like an ugly baby.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6123", + "name": "Naghead", + "examine": "An old goblin hag.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6124", + "name": "Wagchin", + "examine": "A young goblin 'beauty'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6125", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6126", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6127", + "name": "Greasycheeks", + "examine": "Big appetite for a small creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6128", + "name": "Smellytoes", + "examine": "Likes drink a little too much.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6129", + "name": "Creakyknees", + "examine": "Lean and green.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6131", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "6132", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6133", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6134", + "name": "Dunce", + "examine": "This imp is clearly the class clown.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6135", + "name": "Town crier", + "examine": "Get useful information from this guy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6140", + "name": "Squire (Intermediate)", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6141", + "name": "Squire (Veteran)", + "examine": "A squire of balance.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6142", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6143", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "25", + "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6144", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6145", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6146", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6147", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "15", + "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6148", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6149", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "200", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6150", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "bonuses": "150,150,150,75,75,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6151", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "40", + "bonuses": "150,150,150,150,37,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6152", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "bonuses": "150,150,75,150,75,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6153", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "1", + "magic_level": "70", + "bonuses": "75,75,150,150,75,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6154", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6155", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "15", + "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6156", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6157", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "6159", + "name": "Workman", + "examine": "It is cold and solid. Thok will strap it to Marmaros's leg.", + "lifepoints": "114", + "attack_level": "50", + "strength_level": "50", + "defence_level": "65", + "range_level": "50", + "magic_level": "50", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "6169", + "name": "Squire", + "examine": "Squire to the Knights of the Round Table.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6170", + "name": "Sir Lancelot", + "lifepoints": "118", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "400", + "defence_animation": "422", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "6183", + "name": "Guard", + "examine": "An officer of the law.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6184", + "name": "Guard", + "examine": "An officer of the law.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6188", + "name": "Renegade knight", + "examine": "He isn't very friendly.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "6189", + "name": "Black Knight", + "examine": "A dark-hearted knight.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "6190", + "name": "Guard", + "examine": "Primping with combs and hair clips.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6198", + "name": "Sinclair", + "examine": "The name isn't just for show.", + "lifepoints": "85", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "6200", + "name": "Banker", + "examine": "He can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "safespot": null + }, + { + "id": "6201", + "name": "Knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6203", + "name": "K'ril Tsutsaroth", + "examine": "A servant of the god Zamorak. ", + "lifepoints": "255", + "attack_level": "340", + "strength_level": "300", + "defence_level": "270", + "range_level": "1", + "magic_level": "200", + "bonuses": "160,160,160,0,0,80,80,80,130,80,0,31,0,0,0", + "poison_immune": "true", + "respawn_delay": "120", + "attack_speed": "6", + "agg_radius": "64", + "melee_animation": "6945", + "defence_animation": "6944", + "death_animation": "6946", + "magic_animation": "6945", + "range_animation": "6945", + "weakness": "9", + "slayer_task": "40", + "slayer_exp": "350", + "poisonous": "true", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6204", + "name": "Tstanon Karlak", + "examine": "Destroyer of 1000 planes!", + "lifepoints": "142", + "attack_level": "124", + "strength_level": "118", + "defence_level": "125", + "range_level": "50", + "magic_level": "50", + "bonuses": "0,0,0,0,0,0,0,0,-5,0,0,14,0,0,0", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "6945", + "defence_animation": "6944", + "death_animation": "6946", + "magic_animation": "6945", + "range_animation": "6945", + "weakness": "9", + "slayer_task": "40", + "slayer_exp": "142", + "aggressive": "true", + "safespot": null + }, + { + "id": "6205", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6206", + "name": "Zakl'n Gritch", + "examine": "Scourge of light.", + "lifepoints": "150", + "attack_level": "83", + "strength_level": "76", + "defence_level": "127", + "range_level": "150", + "magic_level": "50", + "bonuses": "0,0,0,0,20,0,0,0,-5,0,0,0,0,0,0", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "7033", + "defence_animation": "6945", + "death_animation": "6946", + "magic_animation": "7033", + "range_animation": "7033", + "start_gfx": "1208", + "projectile": "1209", + "weakness": "0", + "slayer_task": "56", + "slayer_exp": "150", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6207", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6208", + "name": "Balfrug Kreeyath", + "examine": "Despoiler of Ullek.", + "lifepoints": "161", + "attack_level": "115", + "strength_level": "60", + "defence_level": "153", + "range_level": "1", + "magic_level": "150", + "bonuses": "0,0,0,0,0,0,0,0,10,0,0,0,0,0,0", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "7033", + "defence_animation": "6944", + "death_animation": "6946", + "magic_animation": "7033", + "range_animation": "7033", + "start_gfx": "1212", + "projectile": "1213", + "slayer_exp": "161", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "6209", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6210", + "name": "Hellhound", + "examine": "From the maws of hell.", + "lifepoints": "116", + "attack_level": "66", + "strength_level": "66", + "defence_level": "66", + "range_level": "1", + "bonuses": "50,70,30,30,60,30,60,60,50,60,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6579", + "defence_animation": "6578", + "death_animation": "6576", + "magic_animation": "6579", + "range_animation": "6579", + "weakness": "7", + "slayer_task": "43", + "slayer_exp": "116", + "aggressive": "true", + "clue_level": "2", + "combat_audio": "3717,3719,3718", + "safespot": null + }, + { + "id": "6211", + "name": "Imp", + "examine": "Have you checked your pockets lately?", + "lifepoints": "10", + "attack_level": "4", + "strength_level": "4", + "defence_level": "4", + "range_level": "1", + "bonuses": "10,5,5,10,10,10,10,10,10,0,0,0,0,0,0", + "melee_animation": "169", + "defence_animation": "170", + "death_animation": "172", + "magic_animation": "169", + "range_animation": "169", + "weakness": "7", + "aggressive": "true", + "combat_audio": "534,536,535", + "safespot": null + }, + { + "id": "6212", + "name": "Werewolf", + "examine": "He doesn't look pleased to see me.", + "lifepoints": "100", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "bonuses": "50,40,45,60,70,70,70,40,40,50,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6213", + "name": "Werewolf", + "examine": "He doesn't look pleased to see me.", + "lifepoints": "100", + "attack_level": "64", + "strength_level": "64", + "defence_level": "64", + "range_level": "1", + "bonuses": "50,40,45,60,70,70,70,40,40,50,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6536", + "defence_animation": "6538", + "death_animation": "6537", + "magic_animation": "6536", + "range_animation": "6536", + "weakness": "7", + "slayer_task": "91", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6214", + "name": "Vampire", + "examine": "It looks really hungry!", + "lifepoints": "60", + "attack_level": "44", + "strength_level": "44", + "defence_level": "44", + "range_level": "1", + "bonuses": "30,35,30,40,50,50,50,25,30,30,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "810", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "810", + "range_animation": "810", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6215", + "name": "Bloodveld", + "examine": "The tongue of evil.", + "lifepoints": "120", + "attack_level": "75", + "strength_level": "45", + "defence_level": "30", + "range_level": "1", + "attack_speed": "4", + "melee_animation": "9130", + "defence_animation": "9132", + "death_animation": "9131", + "magic_animation": "1552", + "range_animation": "1552", + "slayer_exp": "120", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6216", + "name": "Pyrefiend", + "examine": "A small fire demon.", + "lifepoints": "48", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "1", + "bonuses": "25,25,20,40,40,40,15,30,20,60,20,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "1582", + "defence_animation": "1581", + "death_animation": "1580", + "magic_animation": "1582", + "range_animation": "1582", + "weakness": "7", + "slayer_task": "66", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6217", + "name": "Icefiend", + "examine": "A small ice demon.", + "lifepoints": "15", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "bonuses": "5,5,5,5,10,10,10,10,10,10,5,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "8080", + "defence_animation": "8079", + "death_animation": "8078", + "magic_animation": "8080", + "range_animation": "8080", + "clue_level": "0", + "safespot": null + }, + { + "id": "6218", + "name": "Gorak", + "examine": "Those horns look pretty sharp...", + "lifepoints": "112", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "1", + "bonuses": "30,30,50,70,40,70,70,50,60,55,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "4300", + "defence_animation": "4301", + "death_animation": "4302", + "magic_animation": "4300", + "range_animation": "4300", + "weakness": "9", + "slayer_task": "39", + "slayer_exp": "112", + "aggressive": "true", + "safespot": null + }, + { + "id": "6219", + "name": "Spiritual warrior", + "examine": "Warrior of Zamorak.", + "lifepoints": "102", + "attack_level": "66", + "strength_level": "66", + "defence_level": "66", + "range_level": "1", + "bonuses": "40,60,60,60,60,20,50,55,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "1156", + "death_animation": "9055", + "magic_animation": "390", + "range_animation": "390", + "weakness": "6", + "slayer_task": "79", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6220", + "name": "Spiritual ranger", + "examine": "A ranger spirit dedicated to Zamorak.", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "70", + "bonuses": "50,70,50,50,50,70,50,85,85,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "426", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "426", + "range_animation": "426", + "start_gfx": "18", + "projectile": "9", + "weakness": "1", + "slayer_task": "78", + "combat_style": "1", + "aggressive": "true", + "start_height": "96", + "clue_level": "2", + "safespot": null + }, + { + "id": "6221", + "name": "Spiritual mage", + "examine": "A deadly servant of Zamorak.", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "61", + "range_level": "1", + "magic_level": "180", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "5", + "melee_animation": "811", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "811", + "range_animation": "811", + "projectile": "78", + "end_gfx": "78", + "weakness": "3", + "slayer_task": "77", + "combat_style": "2", + "aggressive": "true", + "end_height": "0", + "clue_level": "2", + "safespot": null + }, + { + "id": "6222", + "name": "Kree'arra", + "examine": "Graceful avatar of Armadyl.", + "lifepoints": "255", + "attack_level": "300", + "strength_level": "200", + "defence_level": "260", + "range_level": "380", + "magic_level": "200", + "bonuses": "136,136,136,0,120,180,180,180,200,200,0,12,0,0,0", + "poison_immune": "true", + "respawn_delay": "120", + "attack_speed": "3", + "agg_radius": "64", + "melee_animation": "6977", + "defence_animation": "6974", + "death_animation": "6975", + "magic_animation": "6977", + "range_animation": "6977", + "weakness": "10", + "slayer_exp": "357", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6223", + "name": "Wingman Skree", + "examine": "Graceful, bird-like creature.", + "lifepoints": "121", + "attack_level": "80", + "strength_level": "50", + "defence_level": "160", + "range_level": "100", + "magic_level": "150", + "bonuses": "45,45,45,0,0,0,0,0,0,0,0,25,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "6952", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6952", + "range_animation": "6952", + "projectile": "1199", + "weakness": "3", + "slayer_exp": "124", + "combat_style": "2", + "aggressive": "true", + "prj_height": "92", + "safespot": null + }, + { + "id": "6224", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6225", + "name": "Flockleader Geerin", + "examine": "Graceful, bird-like creature.", + "lifepoints": "132", + "attack_level": "80", + "strength_level": "80", + "defence_level": "175", + "range_level": "150", + "magic_level": "50", + "bonuses": "0,0,0,0,60,0,0,0,0,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "weakness": "4", + "slayer_exp": "133", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "safespot": null + }, + { + "id": "6226", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6227", + "name": "Flight Kilisa", + "examine": "Graceful, bird-like creature.", + "lifepoints": "133", + "attack_level": "124", + "strength_level": "118", + "defence_level": "175", + "range_level": "169", + "magic_level": "50", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,14,0,0,0", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "6954", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6954", + "range_animation": "6954", + "weakness": "6", + "slayer_exp": "133", + "aggressive": "true", + "safespot": null + }, + { + "id": "6228", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6229", + "name": "Spiritual warrior", + "examine": "A servant of Armadyl.", + "lifepoints": "98", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "68", + "bonuses": "40,40,50,50,20,50,50,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6954", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6954", + "range_animation": "6954", + "weakness": "6", + "slayer_task": "79", + "combat_style": "1", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6230", + "name": "Spiritual ranger", + "examine": "Armadyl's favourite servant.", + "lifepoints": "89", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "70", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "weakness": "4", + "slayer_task": "78", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6231", + "name": "Spiritual mage", + "examine": "A mage who serves Armadyl above all else - even death.", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "111", + "range_level": "1", + "magic_level": "150", + "bonuses": "0,0,0,0,0,9,12,5,45,28,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "5", + "melee_animation": "6952", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6952", + "range_animation": "6952", + "projectile": "1199", + "weakness": "4", + "slayer_task": "77", + "combat_style": "2", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6232", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "40", + "range_level": "40", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1191", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6233", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "83", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6234", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "86", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "50", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6235", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "86", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "50", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6236", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "55", + "range_level": "55", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6237", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "98", + "attack_level": "1", + "strength_level": "1", + "defence_level": "55", + "range_level": "55", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1191", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6238", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "124", + "attack_level": "1", + "strength_level": "1", + "defence_level": "65", + "range_level": "65", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6239", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "139", + "attack_level": "1", + "strength_level": "1", + "defence_level": "65", + "range_level": "65", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1191", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6240", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "63", + "attack_level": "1", + "strength_level": "1", + "defence_level": "40", + "range_level": "40", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1191", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6241", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "40", + "range_level": "40", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6242", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "83", + "attack_level": "1", + "strength_level": "1", + "defence_level": "40", + "range_level": "40", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6243", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "69", + "attack_level": "1", + "strength_level": "1", + "defence_level": "50", + "range_level": "50", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6244", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "55", + "range_level": "55", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6245", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "98", + "attack_level": "1", + "strength_level": "1", + "defence_level": "55", + "range_level": "55", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1190", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6246", + "name": "Aviansie", + "examine": "Graceful, bird-like creature.", + "lifepoints": "73", + "attack_level": "1", + "strength_level": "1", + "defence_level": "65", + "range_level": "65", + "bonuses": "60,50,60,50,65,65,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6953", + "defence_animation": "6955", + "death_animation": "6956", + "magic_animation": "6953", + "range_animation": "6953", + "projectile": "1191", + "combat_style": "1", + "aggressive": "true", + "prj_height": "92", + "clue_level": "2", + "safespot": null + }, + { + "id": "6247", + "name": "Commander Zilyana", + "examine": "Commander of Saradomin's forces. ", + "lifepoints": "255", + "attack_level": "280", + "strength_level": "196", + "defence_level": "300", + "range_level": "250", + "magic_level": "300", + "bonuses": "195,195,195,200,0,100,100,100,100,100,0,20,0,0,0", + "poison_immune": "true", + "respawn_delay": "120", + "attack_speed": "2", + "agg_radius": "64", + "melee_animation": "6964", + "defence_animation": "6966", + "death_animation": "6965", + "magic_animation": "6964", + "range_animation": "6964", + "weakness": "7", + "slayer_exp": "360", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6248", + "name": "Starlight", + "examine": "The bane of darkness.", + "lifepoints": "160", + "attack_level": "120", + "strength_level": "125", + "defence_level": "120", + "range_level": "1", + "magic_level": "125", + "bonuses": "60,60,60,0,0,12,14,13,5,13,0,10,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "agg_radius": "64", + "melee_animation": "6376", + "defence_animation": "6375", + "death_animation": "6377", + "magic_animation": "6376", + "range_animation": "6376", + "weakness": "7", + "slayer_exp": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "6249", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6250", + "name": "Growler", + "examine": "Defender of the faithful.", + "lifepoints": "146", + "attack_level": "100", + "strength_level": "101", + "defence_level": "120", + "range_level": "1", + "magic_level": "150", + "bonuses": "10,10,10,0,0,12,14,14,18,5,0,7,0,0,0", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "7019", + "defence_animation": "7017", + "death_animation": "7016", + "magic_animation": "7019", + "range_animation": "7019", + "start_gfx": "1184", + "projectile": "1185", + "end_gfx": "1186", + "slayer_exp": "0", + "combat_style": "2", + "aggressive": "true", + "prj_height": "0", + "safespot": null + }, + { + "id": "6251", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6252", + "name": "Bree", + "examine": "Champion of Truth.", + "lifepoints": "162", + "attack_level": "110", + "strength_level": "80", + "defence_level": "130", + "range_level": "150", + "magic_level": "80", + "bonuses": "10,10,10,0,0,12,14,14,18,5,0,7,0,0,0", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "7009", + "defence_animation": "7010", + "death_animation": "7011", + "magic_animation": "7009", + "range_animation": "7009", + "projectile": "1188", + "end_gfx": "24", + "weakness": "0", + "slayer_exp": "0", + "combat_style": "1", + "aggressive": "true", + "prj_height": "50", + "safespot": null + }, + { + "id": "6253", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6254", + "name": "Saradomin priest", + "examine": "A holy man wearing ancient clothing.", + "lifepoints": "89", + "attack_level": "1", + "strength_level": "1", + "defence_level": "60", + "range_level": "1", + "magic_level": "60", + "bonuses": "40,40,40,40,20,50,40,55,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "811", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "811", + "range_animation": "811", + "end_gfx": "76", + "weakness": "3", + "combat_style": "2", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "6255", + "name": "Spiritual warrior", + "examine": "Warrior of Saradomin.", + "lifepoints": "100", + "attack_level": "66", + "strength_level": "66", + "defence_level": "66", + "range_level": "1", + "bonuses": "40,60,60,60,60,20,50,45,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "1156", + "death_animation": "9055", + "magic_animation": "390", + "range_animation": "390", + "weakness": "8", + "slayer_task": "79", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6256", + "name": "Spiritual ranger", + "examine": "A ranger spirit dedicated to Saradomin.", + "lifepoints": "106", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "70", + "bonuses": "50,70,50,50,50,70,50,65,65,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "426", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "426", + "range_animation": "426", + "start_gfx": "18", + "projectile": "9", + "weakness": "0", + "slayer_task": "78", + "combat_style": "1", + "aggressive": "true", + "start_height": "96", + "clue_level": "2", + "safespot": null + }, + { + "id": "6257", + "name": "Spiritual mage", + "examine": "Saradomin's holy mage.", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "86", + "range_level": "1", + "magic_level": "160", + "bonuses": "0,0,0,0,0,8,7,3,16,2,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "5", + "melee_animation": "811", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "811", + "range_animation": "811", + "projectile": "76", + "end_gfx": "76", + "weakness": "4", + "slayer_task": "77", + "combat_style": "2", + "aggressive": "true", + "end_height": "0", + "clue_level": "2", + "safespot": null + }, + { + "id": "6258", + "name": "Knight of Saradomin", + "examine": "A valiant knight.", + "lifepoints": "135", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "bonuses": "40,40,40,40,50,20,40,50,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "407", + "defence_animation": "410", + "death_animation": "9055", + "magic_animation": "407", + "range_animation": "407", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "6259", + "name": "Knight of Saradomin", + "examine": "A valiant knight.", + "lifepoints": "108", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "bonuses": "40,40,40,40,50,20,40,65,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "401", + "defence_animation": "424", + "death_animation": "9055", + "magic_animation": "401", + "range_animation": "401", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "6260", + "name": "General Graardor", + "examine": "A huge war chief.", + "lifepoints": "255", + "attack_level": "280", + "strength_level": "350", + "defence_level": "250", + "range_level": "350", + "magic_level": "80", + "bonuses": "120,120,120,0,100,90,90,90,298,90,0,43,0,0,0", + "poison_immune": "true", + "respawn_delay": "120", + "attack_speed": "6", + "agg_radius": "64", + "melee_animation": "7060", + "defence_animation": "7061", + "death_animation": "7062", + "magic_animation": "7060", + "range_animation": "7060", + "weakness": "10", + "slayer_exp": "0", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6261", + "name": "Sergeant Strongstack", + "examine": "A battle-honed goblin. ", + "lifepoints": "128", + "attack_level": "124", + "strength_level": "118", + "defence_level": "126", + "range_level": "50", + "magic_level": "50", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,14,0,0,0", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "6154", + "defence_animation": "6155", + "death_animation": "6156", + "magic_animation": "6154", + "range_animation": "6154", + "weakness": "8", + "slayer_task": "38", + "aggressive": "true", + "safespot": null + }, + { + "id": "6262", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6263", + "name": "Sergeant Steelwill", + "examine": "A battle-honed goblin. ", + "lifepoints": "127", + "attack_level": "80", + "strength_level": "50", + "defence_level": "150", + "range_level": "1", + "magic_level": "150", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,6,0,0,0", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "6154", + "defence_animation": "6155", + "death_animation": "6156", + "magic_animation": "6154", + "range_animation": "6154", + "start_gfx": "1202", + "projectile": "1203", + "weakness": "3", + "slayer_task": "38", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "6264", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6265", + "name": "Sergeant Grimspike", + "examine": "A battle-honed goblin. ", + "lifepoints": "146", + "attack_level": "80", + "strength_level": "80", + "defence_level": "132", + "range_level": "150", + "magic_level": "50", + "bonuses": "0,0,0,0,20,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "50", + "attack_speed": "5", + "agg_radius": "64", + "melee_animation": "6154", + "defence_animation": "6155", + "death_animation": "6156", + "magic_animation": "6154", + "range_animation": "6154", + "projectile": "1206", + "weakness": "2", + "slayer_task": "38", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6266", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6267", + "name": "Fishing spot", + "examine": "Big, ugly, and smelly.", + "lifepoints": "60", + "attack_level": "27", + "strength_level": "27", + "defence_level": "27", + "range_level": "27", + "magic_level": "27", + "bonuses": "15,15,10,20,40,15,50,50,50,20,50,58,0,0,0", + "respawn_delay": "25", + "attack_speed": "6", + "melee_animation": "359", + "defence_animation": "360", + "death_animation": "361", + "magic_animation": "359", + "range_animation": "359", + "aggressive": "true", + "safespot": null + }, + { + "id": "6268", + "name": "Jogre", + "examine": "Green and aggressive.", + "lifepoints": "70", + "attack_level": "62", + "strength_level": "62", + "defence_level": "62", + "range_level": "1", + "bonuses": "10,20,20,20,20,20,10,20,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "6", + "melee_animation": "2936", + "defence_animation": "2937", + "death_animation": "2938", + "magic_animation": "2936", + "range_animation": "2936", + "weakness": "8", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "6269", + "name": "Cyclops", + "examine": "A one-eyed man-eater.", + "lifepoints": "110", + "attack_level": "60", + "strength_level": "70", + "defence_level": "48", + "range_level": "1", + "magic_level": "1", + "bonuses": "22,22,22,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "44", + "slayer_exp": "110", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6270", + "name": "Cyclops", + "examine": "A one-eyed man-eater.", + "lifepoints": "110", + "attack_level": "60", + "strength_level": "70", + "defence_level": "48", + "range_level": "1", + "magic_level": "1", + "bonuses": "22,22,22,0,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "4", + "melee_animation": "4652", + "defence_animation": "4651", + "death_animation": "4653", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "44", + "slayer_exp": "110", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6271", + "name": "Ork", + "examine": "Ugly, fierce and with a bad attitude.", + "lifepoints": "110", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "bonuses": "40,20,30,45,45,45,45,20,45,35,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "4320", + "defence_animation": "4322", + "death_animation": "4321", + "magic_animation": "4320", + "range_animation": "4320", + "weakness": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "6272", + "name": "Ork", + "examine": "Ugly, fierce and with a bad attitude.", + "lifepoints": "110", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "bonuses": "40,20,30,45,45,45,45,20,45,35,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "4320", + "defence_animation": "4322", + "death_animation": "4321", + "magic_animation": "4320", + "range_animation": "4320", + "aggressive": "true", + "safespot": null + }, + { + "id": "6273", + "name": "Ork", + "examine": "Ugly, fierce and with a bad attitude.", + "lifepoints": "110", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "bonuses": "40,20,30,45,45,45,45,20,45,35,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "4320", + "defence_animation": "4322", + "death_animation": "4321", + "magic_animation": "4320", + "range_animation": "4320", + "aggressive": "true", + "safespot": null + }, + { + "id": "6274", + "name": "Ork", + "examine": "Ugly, fierce and with a bad attitude.", + "lifepoints": "110", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "bonuses": "40,20,30,45,45,45,45,20,45,35,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "4320", + "defence_animation": "4322", + "death_animation": "4321", + "magic_animation": "4320", + "range_animation": "4320", + "aggressive": "true", + "safespot": null + }, + { + "id": "6275", + "name": "Hobgoblin", + "examine": "An ugly, smelly creature.", + "lifepoints": "52", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "1", + "bonuses": "20,30,30,30,30,30,10,30,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "164", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "164", + "range_animation": "164", + "weakness": "8", + "slayer_task": "45", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6276", + "name": "Spiritual ranger", + "examine": "The spirit of a ranger, serving bandos beyond death.", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "70", + "range_level": "70", + "bonuses": "30,50,30,30,50,60,50,40,40,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "4320", + "defence_animation": "4322", + "death_animation": "4321", + "magic_animation": "4320", + "range_animation": "4320", + "start_gfx": "95", + "projectile": "1195", + "weakness": "0", + "slayer_task": "78", + "combat_style": "1", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6277", + "name": "Spiritual warrior", + "examine": "A true servant of Bandos.", + "lifepoints": "131", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "1", + "bonuses": "50,40,45,60,60,60,60,20,50,60,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "4320", + "defence_animation": "4322", + "death_animation": "4321", + "magic_animation": "4320", + "range_animation": "4320", + "weakness": "8", + "slayer_task": "79", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6278", + "name": "Spiritual mage", + "examine": "One of Bandos' chosen.", + "lifepoints": "106", + "attack_level": "1", + "strength_level": "1", + "defence_level": "103", + "range_level": "1", + "magic_level": "142", + "bonuses": "0,0,0,0,0,12,14,13,35,13,0,0,0,0,0", + "respawn_delay": "25", + "attack_speed": "5", + "melee_animation": "4320", + "defence_animation": "4322", + "death_animation": "4321", + "magic_animation": "4320", + "range_animation": "4320", + "weakness": "4", + "slayer_task": "77", + "combat_style": "2", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6279", + "name": "Goblin", + "examine": "An ancient goblin.", + "lifepoints": "20", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "bonuses": "10,20,20,20,20,5,20,10,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "aggressive": "true", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6280", + "name": "Goblin", + "examine": "A warrior for Bandos.", + "lifepoints": "15", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "bonuses": "10,20,20,20,20,5,20,10,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "aggressive": "true", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6281", + "name": "Goblin", + "examine": "A soldier to the death.", + "lifepoints": "15", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "bonuses": "5,10,10,10,10,10,5,10,5,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6188", + "defence_animation": "6189", + "death_animation": "6190", + "magic_animation": "6188", + "range_animation": "6188", + "aggressive": "true", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6282", + "name": "Goblin", + "examine": "A soldier to the death.", + "lifepoints": "18", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "bonuses": "5,10,10,10,10,10,5,10,5,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6188", + "defence_animation": "6189", + "death_animation": "6190", + "magic_animation": "6188", + "range_animation": "6188", + "aggressive": "true", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6283", + "name": "Goblin", + "examine": "A warrior for Bandos.", + "lifepoints": "16", + "attack_level": "5", + "strength_level": "5", + "defence_level": "5", + "range_level": "1", + "bonuses": "10,20,20,20,20,5,20,10,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "16", + "aggressive": "true", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6285", + "name": "Warped terrorbird", + "examine": "You don't think you can harm this terrorbird.", + "lifepoints": "168", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "0", + "death_animation": "7109", + "magic_animation": "0", + "range_animation": "0", + "projectile": "1468", + "weakness": "1", + "slayer_task": "88", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6286", + "name": "Warped terrorbird", + "examine": "You don't think you can harm this terrorbird.", + "lifepoints": "168", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "0", + "death_animation": "7109", + "magic_animation": "0", + "range_animation": "0", + "projectile": "1468", + "weakness": "1", + "slayer_task": "88", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6287", + "name": "Warped terrorbird", + "examine": "You don't think you can harm this terrorbird.", + "lifepoints": "168", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "0", + "death_animation": "7109", + "magic_animation": "0", + "range_animation": "0", + "projectile": "1468", + "weakness": "1", + "slayer_task": "88", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6288", + "name": "Warped terrorbird", + "examine": "You don't think you can harm this terrorbird.", + "lifepoints": "168", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "0", + "death_animation": "7109", + "magic_animation": "0", + "range_animation": "0", + "projectile": "1468", + "weakness": "1", + "slayer_task": "88", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6289", + "name": "Warped terrorbird", + "examine": "You don't think you can harm this terrorbird.", + "lifepoints": "168", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "0", + "death_animation": "7109", + "magic_animation": "0", + "range_animation": "0", + "projectile": "1468", + "weakness": "1", + "slayer_task": "88", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6290", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6291", + "name": "Warped terrorbird", + "examine": "You don't think you can harm this terrorbird.", + "lifepoints": "168", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "0", + "death_animation": "7109", + "magic_animation": "0", + "range_animation": "0", + "projectile": "1468", + "weakness": "1", + "slayer_task": "88", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6292", + "name": "Warped terrorbird", + "examine": "You don't think you can harm this terrorbird.", + "lifepoints": "168", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "0", + "death_animation": "7109", + "magic_animation": "0", + "range_animation": "0", + "projectile": "1468", + "weakness": "1", + "slayer_task": "88", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6293", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6294", + "name": "Warped terrorbird", + "examine": "You don't think you can harm this terrorbird.", + "lifepoints": "308", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "0", + "death_animation": "7109", + "magic_animation": "0", + "range_animation": "0", + "projectile": "1468", + "weakness": "1", + "slayer_task": "88", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6295", + "name": "Warped terrorbird", + "examine": "You don't think you can harm this terrorbird.", + "lifepoints": "308", + "attack_level": "59", + "strength_level": "59", + "defence_level": "59", + "range_level": "59", + "magic_level": "59", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "0", + "death_animation": "7109", + "magic_animation": "0", + "range_animation": "0", + "projectile": "1468", + "weakness": "1", + "slayer_task": "88", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6296", + "name": "Warped tortoise", + "examine": "You don't think you can harm this creature.", + "lifepoints": "148", + "attack_level": "39", + "strength_level": "39", + "defence_level": "52", + "range_level": "1", + "magic_level": "52", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7093", + "defence_animation": "0", + "death_animation": "7091", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "slayer_task": "89", + "safespot": null + }, + { + "id": "6297", + "name": "Warped tortoise", + "lifepoints": "87", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7093", + "defence_animation": "7092", + "death_animation": "7091", + "safespot": null + }, + { + "id": "6306", + "name": "Bolrie", + "examine": "Annoyingly easy to squish.", + "lifepoints": "0", + "attack_level": "1", + "strength_level": "1", + "defence_level": "2", + "range_level": "2", + "magic_level": "2", + "melee_animation": "0", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "73", + "aggressive": "true", + "safespot": null + }, + { + "id": "6314", + "name": "Guard no. 21", + "examine": "She looks bored.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6315", + "name": "Guard no. 72", + "examine": "He looks even more bored.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6322", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6323", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6324", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6325", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6326", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6327", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6328", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6329", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6330", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6331", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6332", + "name": "Warped terrorbird", + "lifepoints": "154", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7108", + "defence_animation": "7110", + "death_animation": "7109", + "projectile": "1468", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6334", + "name": "Child", + "examine": "A child of West Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6335", + "name": "Child", + "examine": "A child of West Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6336", + "name": "Child", + "examine": "A child of West Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6337", + "name": "Child", + "examine": "A child of West Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6338", + "name": "Child", + "examine": "A child of West Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6339", + "name": "Child", + "examine": "A child of West Ardougne.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6344", + "name": "Child", + "examine": "Duck!", + "lifepoints": "92", + "attack_level": "48", + "strength_level": "48", + "defence_level": "65", + "range_level": "65", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "3920", + "defence_animation": "0", + "death_animation": "3922", + "magic_animation": "0", + "range_animation": "3920", + "weakness": "1", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6346", + "name": "Pirate", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6347", + "name": "Pirate", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6348", + "name": "Pirate", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6349", + "name": "Pirate", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6350", + "name": "Pirate", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6351", + "name": "Pirate", + "lifepoints": "23", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6352", + "name": "Pirate", + "lifepoints": "23", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6353", + "name": "Pirate", + "lifepoints": "23", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6354", + "name": "Pirate", + "lifepoints": "23", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6355", + "name": "Pirate", + "lifepoints": "23", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6356", + "name": "Pirate", + "lifepoints": "23", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6358", + "name": "Street urchin", + "examine": "The mother of all pests!", + "lifepoints": "1428", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "respawn_delay": "60", + "attack_speed": "6", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "6363", + "name": "Zamorak warrior", + "examine": "A warrior of Zamorak.", + "lifepoints": "62", + "attack_level": "44", + "strength_level": "44", + "defence_level": "44", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "6364", + "name": "Zamorak warrior", + "examine": "A warrior of Zamorak.", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "6365", + "name": "Zamorak ranger", + "examine": "A ranger of Zamorak.", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "46", + "range_level": "46", + "respawn_delay": "60", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "1", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6366", + "name": "Zamorak ranger", + "examine": "A ranger of Zamorak.", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "46", + "range_level": "46", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6367", + "name": "Zamorak mage", + "examine": "A mage of Zamorak.", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "49", + "range_level": "1", + "magic_level": "49", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "6368", + "name": "Zamorak mage", + "examine": "A mage of Zamorak.", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "49", + "range_level": "1", + "magic_level": "49", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "6369", + "name": "Cave lizard", + "examine": "A cave dweller.", + "lifepoints": "67", + "attack_level": "1", + "strength_level": "1", + "defence_level": "47", + "range_level": "47", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7207", + "defence_animation": "0", + "death_animation": "7205", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "6370", + "name": "Mage of Zamorak", + "examine": "A representative of the Z.M.I.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6371", + "name": "Zamorak crafter", + "examine": "A Z.M.I. runecrafter.", + "lifepoints": "27", + "attack_level": "19", + "strength_level": "19", + "defence_level": "19", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "safespot": null + }, + { + "id": "6372", + "name": "Zamorak crafter", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "6374", + "name": "Guard dog", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "49", + "safespot": null + }, + { + "id": "6376", + "name": "Jungle spider", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "6377", + "name": "Jungle spider", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "6378", + "name": "Tenacious toucan", + "examine": "I wouldn't want to be footing that bill.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6775", + "defence_animation": "0", + "death_animation": "6779", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "7", + "safespot": null + }, + { + "id": "6379", + "name": "Giant ant worker", + "examine": "I wonder how much he can lift.", + "lifepoints": "50", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7237", + "defence_animation": "0", + "death_animation": "7238", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "6380", + "name": "Giant ant soldier", + "examine": "Gi-ant-ant-ant-ant...", + "lifepoints": "71", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7237", + "defence_animation": "0", + "death_animation": "7238", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "6381", + "name": "Giant wasp", + "examine": "That stinger has to hurt...", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7242", + "defence_animation": "0", + "death_animation": "7244", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "6382", + "name": "Pernicious parrot", + "examine": "Polynomial - a parrot that goes without breakfast", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "6775", + "defence_animation": "0", + "death_animation": "6777", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "7", + "safespot": null + }, + { + "id": "6383", + "name": "Giant wasp", + "lifepoints": "37", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "7242", + "defence_animation": "7243", + "death_animation": "7244", + "aggressive": "true", + "safespot": null + }, + { + "id": "6385", + "name": "Karamjan Jungle eagle", + "examine": "A very large", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6389", + "name": "Gargoyle", + "examine": "Flies like a rock.", + "lifepoints": "105", + "attack_level": "75", + "strength_level": "105", + "defence_level": "107", + "range_level": "1", + "magic_level": "1", + "bonuses": "0,0,0,0,0,20,20,0,20,20,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "9454", + "defence_animation": "9455", + "death_animation": "1518", + "magic_animation": "1516", + "range_animation": "1516", + "slayer_exp": "105", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6390", + "name": "Grim Reaper", + "examine": "I wish I could tell where he was looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6402", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6403", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6404", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6405", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6406", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6407", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6408", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6409", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6410", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6411", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6412", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6413", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6414", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6415", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6416", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6417", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6418", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6419", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6420", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6421", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6422", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6423", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6424", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6425", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6426", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6427", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6428", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6429", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6430", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6431", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6432", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6433", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6434", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6435", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6436", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6437", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6438", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6439", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6440", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6441", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6442", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6443", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6444", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6445", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6446", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6447", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6448", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6449", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6450", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6451", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6452", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6453", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6454", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6455", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6456", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6457", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6458", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6459", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6460", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6461", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6462", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6463", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6464", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6465", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6466", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6467", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6469", + "name": "Snothead", + "examine": "A goblin high priest", + "lifepoints": "20", + "attack_level": "14", + "strength_level": "14", + "defence_level": "14", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7317", + "defence_animation": "0", + "death_animation": "6182", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "75", + "aggressive": "true", + "safespot": null + }, + { + "id": "6470", + "name": "Snailfeet", + "examine": "A goblin high priest", + "lifepoints": "25", + "attack_level": "13", + "strength_level": "13", + "defence_level": "18", + "range_level": "18", + "respawn_delay": "60", + "melee_animation": "7317", + "defence_animation": "0", + "death_animation": "6182", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "75", + "aggressive": "true", + "safespot": null + }, + { + "id": "6471", + "name": "Mosschin", + "examine": "A goblin high priest", + "lifepoints": "31", + "attack_level": "16", + "strength_level": "16", + "defence_level": "22", + "range_level": "1", + "magic_level": "22", + "melee_animation": "7317", + "defence_animation": "0", + "death_animation": "6182", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "75", + "aggressive": "true", + "safespot": null + }, + { + "id": "6472", + "name": "Redeyes", + "examine": "A goblin high priest", + "lifepoints": "37", + "attack_level": "19", + "strength_level": "19", + "defence_level": "26", + "range_level": "1", + "magic_level": "26", + "melee_animation": "7317", + "defence_animation": "0", + "death_animation": "6182", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "75", + "aggressive": "true", + "safespot": null + }, + { + "id": "6473", + "name": "Strongbones", + "examine": "A goblin high priest", + "lifepoints": "37", + "attack_level": "19", + "strength_level": "19", + "defence_level": "26", + "range_level": "1", + "magic_level": "26", + "respawn_delay": "60", + "melee_animation": "7317", + "defence_animation": "0", + "death_animation": "6182", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "75", + "aggressive": "true", + "safespot": null + }, + { + "id": "6482", + "name": "Priest", + "examine": "Priest of the Ekeleshuun tribe.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6488", + "name": "Preacher", + "examine": "He is expounding the word of the Big High War God.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6490", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6491", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6492", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6493", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6494", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6495", + "name": "Goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6496", + "name": "Goblin guard", + "examine": "He doesn't look very welcoming.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6497", + "name": "Goblin guard", + "examine": "He doesn't look very welcoming.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6498", + "name": "Guard", + "examine": "A guard wearing blue armour.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6499", + "name": "Guard", + "examine": "A guard wearing orange armour.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6500", + "name": "Guard", + "examine": "A guard wearing black armour.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6501", + "name": "Guard", + "examine": "A guard wearing white armour.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6502", + "name": "Guard", + "examine": "A guard wearing purple armour.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6503", + "name": "Guard", + "examine": "A guard wearing yellow armour.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6504", + "name": "Ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "25", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "6507", + "name": "Registrar 2", + "examine": "A very noble spider and attendant to the Queen.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6508", + "name": "Registrar 3", + "examine": "The highest ranking of the Spider Queen's servants.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6509", + "name": "Registrar 4", + "examine": "The head of the Spider Queen's army.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6510", + "name": "Jury", + "examine": "Trying hard to hide his identity.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6512", + "name": "Spectator", + "examine": "Sir Amik's loyal squire.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6514", + "name": "Spectator", + "examine": "A being of ore and minerals.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6516", + "name": "Spectator", + "examine": "A monkey on a mission.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6518", + "name": "Spectator", + "examine": "He works for Doric & Son.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "6521", + "name": "Grand Exchange Tutor", + "examine": "Gives an introduction to the Grand Exchange.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6523", + "name": "Farid Morrisane (ores)", + "examine": "The son of Ali M!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6524", + "name": "Bob Barter (herbs)", + "examine": "He's probably seen better days.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6525", + "name": "Murky Matt (runes)", + "examine": "You can never miss a pirate in disguise.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6526", + "name": "Relobo Blinyo (logs)", + "examine": "A tribal man", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6527", + "name": "Hofuthand (armour and weapons)", + "examine": "He's travelled a long way.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6536", + "name": "Registrar 5", + "examine": "Chief architect of the Spider Realm.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6543", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6544", + "name": "", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6558", + "name": "null", + "examine": "Tapping his feet and looking very bored.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6560", + "name": "null", + "examine": "A huge war chief. ", + "lifepoints": "254", + "attack_level": "250", + "strength_level": "251", + "defence_level": "250", + "range_level": "200", + "bonuses": "300,300,300,300,300,300,150,300,300,250,43,96,43,30,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "7061", + "death_animation": "7062", + "magic_animation": "422", + "range_animation": "422", + "aggressive": "true", + "safespot": null + }, + { + "id": "6604", + "name": "Revenant imp", + "examine": "The essence of an imp slain during the god wars.", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "10", + "defence_level": "10", + "range_level": "10", + "magic_level": "10", + "melee_animation": "7407", + "defence_animation": "7404", + "death_animation": "7408", + "spawn_animation": "7410", + "magic_animation": "7500", + "range_animation": "7501", + "slayer_exp": "10", + "combat_audio": "0,0,0", + "safespot": null + }, + { + "id": "6605", + "name": "Revenant goblin", + "examine": "The ghost of a goblin slain during the god wars.", + "lifepoints": "14", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "12", + "magic_level": "12", + "melee_animation": "7449", + "defence_animation": "7450", + "death_animation": "7448", + "spawn_animation": "7447", + "magic_animation": "7499", + "range_animation": "7513", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6606", + "name": "Revenant icefiend", + "examine": "The ghost of an icefiend slain during the God Wars.", + "lifepoints": "40", + "attack_level": "27", + "strength_level": "27", + "defence_level": "1", + "range_level": "27", + "magic_level": "27", + "attack_speed": "3", + "melee_animation": "7481", + "defence_animation": "7483", + "death_animation": "7482", + "spawn_animation": "7485", + "magic_animation": "7506", + "range_animation": "7519", + "slayer_exp": "40", + "clue_level": "1", + "safespot": null + }, + { + "id": "6607", + "name": "Revenant werewolf", + "examine": "The ghost of a Werewolf slain during the God wars.", + "lifepoints": "70", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "38", + "magic_level": "38", + "melee_animation": "7397", + "defence_animation": "7399", + "death_animation": "7398", + "spawn_animation": "7403", + "magic_animation": "7496", + "range_animation": "7521", + "clue_level": "2", + "safespot": null + }, + { + "id": "6608", + "name": "Revenant hobgoblin", + "examine": "The ghost of a hobgoblin slain during the God Wars.", + "lifepoints": "55", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "magic_level": "32", + "melee_animation": "7418", + "defence_animation": "7420", + "death_animation": "7419", + "magic_animation": "7503", + "range_animation": "7516", + "slayer_exp": "72", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6609", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6610", + "name": "Revenant ork", + "examine": "It's an NPC.", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "0", + "clue_level": "2", + "combat_audio": "0,0,0", + "safespot": null + }, + { + "id": "6611", + "name": "Revenant knight", + "examine": "A ghost of a knight slain during the God wars.", + "lifepoints": "142", + "attack_level": "80", + "strength_level": "80", + "defence_level": "80", + "range_level": "80", + "magic_level": "80", + "melee_animation": "7441", + "defence_animation": "7443", + "death_animation": "7442", + "spawn_animation": "7440", + "magic_animation": "7508", + "range_animation": "7522", + "slayer_exp": "143", + "clue_level": "2", + "safespot": null + }, + { + "id": "6612", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6613", + "name": "Revenant vampire", + "examine": "The ghost of a vampyre slain in the god wars.", + "lifepoints": "60", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "34", + "magic_level": "34", + "melee_animation": "7427", + "defence_animation": "7429", + "death_animation": "7428", + "spawn_animation": "7426", + "magic_animation": "7507", + "range_animation": "7520", + "slayer_exp": "60", + "clue_level": "1", + "safespot": null + }, + { + "id": "6614", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "0", + "clue_level": "2", + "combat_audio": "0,0,0", + "safespot": null + }, + { + "id": "6615", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6616", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6617", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6618", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6619", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6620", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6621", + "name": "Revenant icefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6622", + "name": "Revenant pyrefiend", + "examine": "The essence of a pyrefiend slain during the god wars.", + "lifepoints": "45", + "attack_level": "292", + "strength_level": "1", + "defence_level": "29", + "range_level": "29", + "magic_level": "29", + "attack_speed": "3", + "melee_animation": "7481", + "defence_animation": "7483", + "death_animation": "7482", + "spawn_animation": "7485", + "magic_animation": "7506", + "range_animation": "7519", + "slayer_exp": "48", + "clue_level": "1", + "safespot": null + }, + { + "id": "6623", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6624", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6625", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6626", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6627", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6628", + "name": "Revenant icefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6629", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6630", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6631", + "name": "Revenant pyrefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6632", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6633", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6634", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6635", + "name": "Revenant imp", + "examine": "The essence of an imp slain during the god wars.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "10", + "defence_level": "10", + "range_level": "10", + "magic_level": "10", + "melee_animation": "7407", + "defence_animation": "7403", + "death_animation": "7408", + "slayer_exp": "10", + "clue_level": "1", + "safespot": null + }, + { + "id": "6636", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6637", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6638", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6639", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6640", + "name": "Revenant icefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6641", + "name": "Revenant pyrefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6642", + "name": "Revenant hobgoblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6643", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6644", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6645", + "name": "Revenant cyclops", + "examine": "The ghost of a cyclops slain during the god wars.", + "lifepoints": "75", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "magic_level": "43", + "melee_animation": "7453", + "defence_animation": "7455", + "death_animation": "7454", + "spawn_animation": "7457", + "magic_animation": "7497", + "range_animation": "7510", + "weakness": "0", + "slayer_exp": "110", + "clue_level": "2", + "safespot": null + }, + { + "id": "6646", + "name": "Revenant hellhound", + "examine": "The essence of a hellhound slain during the god wars.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "1", + "range_level": "50", + "magic_level": "50", + "melee_animation": "7460", + "defence_animation": "7462", + "death_animation": "7461", + "spawn_animation": "7464", + "magic_animation": "7515", + "range_animation": "7501", + "slayer_exp": "80", + "clue_level": "2", + "combat_audio": "3717,3719,3718", + "safespot": null + }, + { + "id": "6647", + "name": "Revenant demon", + "examine": "The essence of a demon slain during the god wars.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "melee_animation": "7474", + "defence_animation": "7476", + "death_animation": "7475", + "spawn_animation": "7478", + "magic_animation": "7498", + "range_animation": "7512", + "slayer_exp": "0", + "clue_level": "2", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "6648", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6649", + "name": "Revenant dark beast", + "examine": "The ghost of a dark beast slain during the god wars..", + "lifepoints": "120", + "attack_level": "80", + "strength_level": "80", + "defence_level": "80", + "range_level": "80", + "melee_animation": "7467", + "defence_animation": "7469", + "death_animation": "7468", + "spawn_animation": "7471", + "magic_animation": "7515", + "range_animation": "7514", + "slayer_exp": "256", + "clue_level": "2", + "safespot": null + }, + { + "id": "6650", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6651", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6652", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6653", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6654", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6655", + "name": "Revenant imp", + "examine": "A tough looking dwarf.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "safespot": null + }, + { + "id": "6656", + "name": "Revenant goblin", + "examine": "A tough looking dwarf.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6657", + "name": "Revenant goblin", + "examine": "An ancient spirit has made itself at home within this suit of armour.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "47", + "defence_animation": "0", + "death_animation": "48", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6658", + "name": "Revenant goblin", + "examine": "An ancient spirit has made itself at home within this suit of armour.", + "lifepoints": "47", + "attack_level": "33", + "strength_level": "33", + "defence_level": "33", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "47", + "defence_animation": "0", + "death_animation": "48", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6659", + "name": "Revenant icefiend", + "examine": "An ancient spirit has made itself at home within this suit of armour.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "47", + "defence_animation": "0", + "death_animation": "48", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "clue_level": "1", + "safespot": null + }, + { + "id": "6660", + "name": "Revenant pyrefiend", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "47", + "defence_animation": "49", + "death_animation": "48", + "clue_level": "1", + "safespot": null + }, + { + "id": "6661", + "name": "Revenant hobgoblin", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "47", + "defence_animation": "49", + "death_animation": "48", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6662", + "name": "Revenant vampire", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "47", + "defence_animation": "49", + "death_animation": "48", + "clue_level": "1", + "safespot": null + }, + { + "id": "6663", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6664", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6665", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6666", + "name": "Revenant imp", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6667", + "name": "Revenant goblin", + "examine": "Pirate and discerning music critic.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6668", + "name": "Revenant pyrefiend", + "examine": "The most piratical penguin you ever did see.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "safespot": null + }, + { + "id": "6669", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6670", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6671", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6672", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6673", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6674", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6675", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6676", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6677", + "name": "Revenant imp", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6678", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6679", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6680", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6681", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6682", + "name": "Revenant icefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6683", + "name": "Revenant pyrefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6684", + "name": "Revenant hobgoblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6685", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6686", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6687", + "name": "Revenant cyclops", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6688", + "name": "Revenant hellhound", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "combat_audio": "3717,3719,3718", + "safespot": null + }, + { + "id": "6689", + "name": "Revenant demon", + "examine": "The essence of a demon slain during the god wars.", + "lifepoints": "750", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "melee_animation": "7474", + "defence_animation": "7476", + "death_animation": "7475", + "clue_level": "2", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "6690", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6691", + "name": "Revenant dark beast", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6692", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6693", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6694", + "name": "Revenant icefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6695", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6696", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6697", + "name": "Revenant imp", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6698", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6699", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6700", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6701", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6702", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6703", + "name": "Revenant imp", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6704", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6705", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6706", + "name": "Revenant goblin", + "examine": "He's not from around here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6707", + "name": "Revenant goblin", + "examine": "The leader of a long-forgotten band of mercenaries.", + "lifepoints": "514", + "attack_level": "1", + "strength_level": "1", + "defence_level": "78", + "range_level": "1", + "magic_level": "78", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "711", + "weakness": "3", + "aggressive": "true", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6708", + "name": "Revenant icefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6709", + "name": "Revenant pyrefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6710", + "name": "Revenant hobgoblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6711", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6712", + "name": "Revenant werewolf", + "examine": "It's trying to mash your house! Less examine", + "lifepoints": "285", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "melee_animation": "5894", + "defence_animation": "0", + "death_animation": "5898", + "magic_animation": "0", + "range_animation": "9618", + "weakness": "10", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "6713", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6714", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6715", + "name": "Revenant imp", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6716", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6717", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6718", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6719", + "name": "Revenant goblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6720", + "name": "Revenant icefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6721", + "name": "Revenant pyrefiend", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6722", + "name": "Revenant hobgoblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6723", + "name": "Revenant vampire", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "6724", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6725", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6726", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6727", + "name": "Revenant hobgoblin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "6728", + "name": "Revenant werewolf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6729", + "name": "Revenant ork", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6730", + "name": "Revenant knight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "6731", + "name": "Queen of Snow", + "examine": "Her lack of body heat is unsettling.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "movement_radius": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6739", + "name": "Snow imp", + "examine": "It looks right at home here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6740", + "name": "Snow", + "examine": "Snowflakes swirling in the wind.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6743", + "name": "Dragon snowman", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6745", + "name": "Pirate snowman", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6747", + "name": "Snow ranger", + "examine": "A snowman armed with a holly bow.", + "lifepoints": "30", + "attack_level": "30", + "strength_level": "1", + "defence_level": "10", + "range_level": "30", + "safespot": null + }, + { + "id": "6748", + "name": "Snow ranger", + "examine": "A snowman armed with an ice sword.", + "lifepoints": "20", + "attack_level": "30", + "strength_level": "1", + "defence_level": "10", + "range_level": "1", + "magic_level": "30", + "safespot": null + }, + { + "id": "6749", + "name": "Snow mage", + "examine": "A snowman armed with a winter staff.", + "lifepoints": "20", + "attack_level": "30", + "strength_level": "1", + "defence_level": "10", + "range_level": "30", + "safespot": null + }, + { + "id": "6761", + "name": "Dried zombie", + "examine": "Cut-down and dried.", + "lifepoints": "68", + "attack_level": "48", + "strength_level": "48", + "defence_level": "48", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "0", + "death_animation": "5569", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "93", + "safespot": null + }, + { + "id": "6762", + "name": "Dried zombie", + "examine": "Needs moisturising.", + "lifepoints": "68", + "attack_level": "48", + "strength_level": "48", + "defence_level": "48", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "0", + "death_animation": "5569", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "93", + "safespot": null + }, + { + "id": "6763", + "name": "Dried zombie", + "examine": "I bet it's parched.", + "lifepoints": "68", + "attack_level": "48", + "strength_level": "48", + "defence_level": "48", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5568", + "defence_animation": "0", + "death_animation": "5569", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "slayer_task": "93", + "safespot": null + }, + { + "id": "6764", + "name": "Skeleton", + "lifepoints": "97", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6765", + "name": "Skeleton", + "lifepoints": "108", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6766", + "name": "Skeleton", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6767", + "name": "Skeleton", + "lifepoints": "115", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6768", + "name": "Skeleton", + "lifepoints": "140", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "5513", + "death_animation": "5491", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "6769", + "name": "Doorman", + "examine": "A guard.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6770", + "name": "Giant scarab", + "examine": "A huge beast of a beetle.", + "lifepoints": "285", + "attack_level": "49", + "strength_level": "49", + "defence_level": "66", + "range_level": "66", + "melee_animation": "7596", + "defence_animation": "0", + "death_animation": "7595", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "6772", + "name": "Scarab larva", + "examine": "It's not quite small enough to stamp upon.", + "lifepoints": "25", + "attack_level": "18", + "strength_level": "18", + "defence_level": "18", + "range_level": "1", + "melee_animation": "7657", + "defence_animation": "0", + "death_animation": "7656", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "6773", + "name": "Scabaras ranger", + "examine": "Bred to shoot you down.", + "lifepoints": "157", + "attack_level": "41", + "strength_level": "41", + "defence_level": "55", + "range_level": "55", + "respawn_delay": "60", + "melee_animation": "7607", + "defence_animation": "0", + "death_animation": "7609", + "magic_animation": "0", + "range_animation": "7607", + "start_gfx": "18", + "projectile": "11", + "weakness": "2", + "slayer_task": "70", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6774", + "name": "Scabaras lancer", + "examine": "It might be angry...it's hard to tell.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7612", + "defence_animation": "0", + "death_animation": "7614", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "6776", + "name": "Scabaras locust", + "examine": "A giant", + "lifepoints": "78", + "attack_level": "41", + "strength_level": "41", + "defence_level": "55", + "range_level": "55", + "respawn_delay": "60", + "melee_animation": "7586", + "defence_animation": "0", + "death_animation": "7581", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "6777", + "name": "Locust lancer", + "examine": "Bouncy", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7584", + "defence_animation": "0", + "death_animation": "7581", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "6778", + "name": "Locust ranger", + "examine": "He'll have someone's eye out with that.", + "lifepoints": "78", + "attack_level": "41", + "strength_level": "41", + "defence_level": "55", + "range_level": "55", + "respawn_delay": "60", + "melee_animation": "5451", + "defence_animation": "0", + "death_animation": "7581", + "magic_animation": "0", + "range_animation": "5451", + "start_gfx": "18", + "projectile": "11", + "weakness": "2", + "slayer_task": "70", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "6779", + "name": "Crocodile", + "lifepoints": "72", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "7588", + "defence_animation": "7590", + "death_animation": "7591", + "slayer_exp": "62", + "aggressive": "true", + "safespot": null + }, + { + "id": "6780", + "name": "Scabaras mage", + "examine": "Part scarab", + "lifepoints": "78", + "attack_level": "41", + "strength_level": "41", + "defence_level": "55", + "range_level": "1", + "magic_level": "55", + "respawn_delay": "60", + "melee_animation": "7615", + "defence_animation": "0", + "death_animation": "7616", + "magic_animation": "0", + "range_animation": "0", + "weakness": "4", + "slayer_task": "70", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "6781", + "name": "Scabaras mage", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7620", + "defence_animation": "7617", + "death_animation": "7616", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "6785", + "name": "Clay golem", + "examine": "An animated clay statue.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6786", + "name": "Lead archaeologist Abigail", + "examine": "She looks a bit dirty from digging.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6787", + "name": "Assistant archaeologist Kerner", + "examine": "He looks a bit dusty from troweling.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6788", + "name": "High Priest of Scabaras", + "examine": "He exudes something like holiness.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6789", + "name": "High Priest of Scabaras", + "examine": "He exudes something like holiness.", + "lifepoints": "94", + "attack_level": "66", + "strength_level": "66", + "defence_level": "66", + "range_level": "66", + "magic_level": "66", + "melee_animation": "7612", + "defence_animation": "0", + "death_animation": "7614", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "slayer_task": "70", + "safespot": null + }, + { + "id": "6790", + "name": "High Priest of Scabaras", + "examine": "He exudes something like holiness.", + "lifepoints": "94", + "attack_level": "66", + "strength_level": "66", + "defence_level": "66", + "range_level": "66", + "magic_level": "66", + "melee_animation": "7607", + "defence_animation": "0", + "death_animation": "7609", + "magic_animation": "0", + "range_animation": "7607", + "weakness": "10", + "slayer_task": "70", + "safespot": null + }, + { + "id": "6794", + "name": "Spirit terrorbird", + "lifepoints": "233", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "1010", + "defence_animation": "1011", + "death_animation": "1012", + "safespot": null + }, + { + "id": "6795", + "name": "Spirit terrorbird", + "examine": "A bird. Literally terrifying.", + "lifepoints": "74", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "respawn_delay": "0", + "melee_animation": "1010", + "defence_animation": "0", + "death_animation": "1013", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6796", + "name": "Granite crab", + "examine": "Is it a stone? Is it a crab? No! It's Granite Crab!", + "lifepoints": "39", + "attack_level": "18", + "strength_level": "17", + "defence_level": "22", + "range_level": "16", + "magic_level": "13", + "bonuses": "16,9,5,12,4,11,57,53,61,12,45,22,0,0,0", + "respawn_delay": "50", + "attack_speed": "3", + "melee_animation": "8104", + "defence_animation": "8105", + "death_animation": "8106", + "magic_animation": "8104", + "range_animation": "8104", + "safespot": null + }, + { + "id": "6797", + "name": "Granite crab", + "examine": "Is it a stone? Is it a crab? No! It's Granite Crab!", + "lifepoints": "39", + "attack_level": "18", + "strength_level": "17", + "defence_level": "22", + "range_level": "16", + "magic_level": "13", + "bonuses": "16,9,5,12,4,11,57,53,61,12,45,22,0,0,0", + "respawn_delay": "50", + "attack_speed": "3", + "melee_animation": "8104", + "defence_animation": "8105", + "death_animation": "8106", + "magic_animation": "8104", + "range_animation": "8104", + "weakness": "10", + "safespot": null + }, + { + "id": "6798", + "name": "Praying mantis", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "8064", + "defence_animation": "8066", + "death_animation": "8065", + "safespot": null + }, + { + "id": "6799", + "name": "Praying mantis", + "examine": "Wax on", + "lifepoints": "107", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "respawn_delay": "0", + "melee_animation": "8069", + "defence_animation": "0", + "death_animation": "8065", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6800", + "name": "Giant ent", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7853", + "defence_animation": "7852", + "death_animation": "7854", + "safespot": null + }, + { + "id": "6801", + "name": "Giant ent", + "examine": "He ent such a bad guy.", + "lifepoints": "111", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "respawn_delay": "0", + "melee_animation": "7853", + "defence_animation": "0", + "death_animation": "7854", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6802", + "name": "Spirit cobra", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "8152", + "defence_animation": "8154", + "death_animation": "8153", + "safespot": null + }, + { + "id": "6803", + "name": "Spirit cobra", + "examine": "Serpentine.", + "lifepoints": "90", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "0", + "melee_animation": "8152", + "defence_animation": "0", + "death_animation": "8153", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6804", + "name": "Spirit dagannoth", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7786", + "defence_animation": "7785", + "death_animation": "7780", + "safespot": null + }, + { + "id": "6805", + "name": "Spirit dagannoth", + "examine": "Face the thing that should not be!", + "lifepoints": "115", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "respawn_delay": "0", + "melee_animation": "7786", + "defence_animation": "0", + "death_animation": "7780", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6806", + "name": "Thorny snail", + "examine": "A hermit slug.", + "lifepoints": "28", + "attack_level": "19", + "strength_level": "18", + "defence_level": "22", + "range_level": "21", + "magic_level": "18", + "bonuses": "47,50,52,52,54,49,13,3,13,4,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "55", + "attack_speed": "5", + "melee_animation": "8143", + "defence_animation": "8145", + "death_animation": "8143", + "magic_animation": "8143", + "range_animation": "8143", + "projectile": "1386", + "end_gfx": "1387", + "combat_style": "1", + "safespot": null + }, + { + "id": "6807", + "name": "Thorny snail", + "examine": "A hermit slug.", + "lifepoints": "28", + "attack_level": "19", + "strength_level": "18", + "defence_level": "22", + "range_level": "21", + "magic_level": "18", + "bonuses": "47,50,52,52,54,49,13,3,13,4,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "55", + "attack_speed": "5", + "melee_animation": "8143", + "defence_animation": "8145", + "death_animation": "8143", + "magic_animation": "8143", + "range_animation": "8143", + "projectile": "1386", + "end_gfx": "1387", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "6809", + "name": "Karamthulhu overlord", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7970", + "defence_animation": "7967", + "death_animation": "7979", + "combat_style": "2", + "safespot": null + }, + { + "id": "6810", + "name": "Karamthulhu overlord", + "examine": "Kneel before squid!", + "lifepoints": "82", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "respawn_delay": "0", + "melee_animation": "7963", + "defence_animation": "0", + "death_animation": "7964", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "2", + "safespot": null + }, + { + "id": "6811", + "name": "Hydra", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7935", + "defence_animation": "7936", + "death_animation": "7937", + "combat_style": "1", + "safespot": null + }, + { + "id": "6812", + "name": "Hydra", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7935", + "defence_animation": "7936", + "death_animation": "7937", + "combat_style": "1", + "safespot": null + }, + { + "id": "6813", + "name": "Bunyip", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7741", + "defence_animation": "7742", + "death_animation": "7740", + "safespot": null + }, + { + "id": "6814", + "name": "Bunyip", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7741", + "defence_animation": "7742", + "death_animation": "7740", + "safespot": null + }, + { + "id": "6815", + "name": "War tortoise", + "lifepoints": "348", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "8286", + "defence_animation": "8287", + "death_animation": "8285", + "combat_style": "1", + "safespot": null + }, + { + "id": "6816", + "name": "War tortoise", + "examine": "Definitely not teenaged", + "lifepoints": "95", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "0", + "melee_animation": "8286", + "defence_animation": "0", + "death_animation": "8285", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "6817", + "name": "Fruit bat", + "examine": "Fruity and bat-shaped. A winning combination!.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "safespot": null + }, + { + "id": "6818", + "name": "Abyssal parasite", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7675", + "defence_animation": "7670", + "death_animation": "7671", + "combat_style": "2", + "safespot": null + }, + { + "id": "6819", + "name": "Abyssal parasite", + "examine": "It's an extra-planar little blood hoover.", + "lifepoints": "77", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "respawn_delay": "0", + "melee_animation": "8910", + "defence_animation": "0", + "death_animation": "7671", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "2", + "safespot": null + }, + { + "id": "6820", + "name": "Abyssal lurker", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7680", + "defence_animation": "7681", + "death_animation": "7684", + "safespot": null + }, + { + "id": "6821", + "name": "Abyssal lurker", + "examine": "Lurking like only a lurker can.", + "lifepoints": "88", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "0", + "melee_animation": "7680", + "defence_animation": "0", + "death_animation": "7684", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6822", + "name": "Unicorn stallion", + "examine": "The pointiest horse on the planet.", + "lifepoints": "100", + "attack_level": "64", + "strength_level": "62", + "defence_level": "70", + "range_level": "72", + "magic_level": "69", + "bonuses": "48,59,43,52,104,52,116,123,134,46,127,4,0,0,0", + "poison_immune": "true", + "melee_animation": "6376", + "defence_animation": "6375", + "death_animation": "6377", + "magic_animation": "6376", + "range_animation": "6376", + "combat_audio": "496,498,497", + "safespot": null + }, + { + "id": "6823", + "name": "Unicorn stallion", + "examine": "The pointiest horse on the planet.", + "lifepoints": "100", + "attack_level": "64", + "strength_level": "62", + "defence_level": "70", + "range_level": "72", + "magic_level": "69", + "bonuses": "48,59,43,52,104,52,116,123,134,46,127,4,0,0,0", + "poison_immune": "true", + "melee_animation": "6376", + "defence_animation": "6375", + "death_animation": "6377", + "magic_animation": "6376", + "range_animation": "6376", + "weakness": "10", + "combat_audio": "496,498,497", + "safespot": null + }, + { + "id": "6824", + "name": "Magpie", + "lifepoints": "16", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "7810", + "defence_animation": "5388", + "death_animation": "8012", + "projectile": "1318", + "combat_style": "2", + "safespot": null + }, + { + "id": "6825", + "name": "Dreadfowl", + "examine": "Southern fried please!", + "lifepoints": "16", + "attack_level": "17", + "strength_level": "15", + "defence_level": "22", + "range_level": "16", + "magic_level": "23", + "bonuses": "16,15,29,12,39,13,41,35,29,39,47,2,2,2,7", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "melee_animation": "7810", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "7810", + "range_animation": "7810", + "projectile": "1318", + "combat_style": "2", + "safespot": null + }, + { + "id": "6826", + "name": "Dreadfowl", + "examine": "Southern fried please!", + "lifepoints": "16", + "attack_level": "17", + "strength_level": "15", + "defence_level": "22", + "range_level": "16", + "magic_level": "23", + "bonuses": "16,15,29,12,39,13,41,35,29,39,47,2,2,2,7", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "melee_animation": "7810", + "defence_animation": "5388", + "death_animation": "5389", + "magic_animation": "7810", + "range_animation": "7810", + "projectile": "1318", + "weakness": "10", + "combat_style": "2", + "safespot": null + }, + { + "id": "6827", + "name": "Stranger plant", + "examine": "It's mean and green.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "8208", + "defence_animation": "8205", + "death_animation": "8209", + "safespot": null + }, + { + "id": "6828", + "name": "Stranger plant", + "examine": "It's mean and green!", + "lifepoints": "91", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "8208", + "defence_animation": "0", + "death_animation": "8209", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6829", + "name": "Spirit wolf", + "examine": "Man's significantly less-domesticated friend.", + "lifepoints": "15", + "attack_level": "16", + "strength_level": "18", + "defence_level": "21", + "range_level": "9", + "magic_level": "7", + "bonuses": "12,7,4,10,23,5,29,27,16,12,13,17,0,0,0", + "attack_speed": "5", + "melee_animation": "8292", + "defence_animation": "8294", + "death_animation": "8295", + "magic_animation": "8292", + "range_animation": "8292", + "safespot": null + }, + { + "id": "6830", + "name": "Spirit wolf", + "examine": "Man's significantly less-domesticated friend.", + "lifepoints": "15", + "attack_level": "16", + "strength_level": "18", + "defence_level": "21", + "range_level": "9", + "magic_level": "7", + "bonuses": "12,7,4,10,23,5,29,27,16,12,13,17,0,0,0", + "attack_speed": "5", + "melee_animation": "8292", + "defence_animation": "8294", + "death_animation": "8295", + "magic_animation": "8292", + "range_animation": "8292", + "weakness": "10", + "safespot": null + }, + { + "id": "6831", + "name": "Desert wyrm", + "lifepoints": "47", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7795", + "defence_animation": "7796", + "death_animation": "7797", + "safespot": null + }, + { + "id": "6832", + "name": "Desert wyrm", + "examine": "Surprisingly slime-free.", + "lifepoints": "25", + "attack_level": "18", + "strength_level": "18", + "defence_level": "18", + "range_level": "18", + "magic_level": "18", + "respawn_delay": "0", + "melee_animation": "7795", + "defence_animation": "0", + "death_animation": "7797", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "6834", + "name": "Evil turnip", + "examine": "If you think he's evil", + "lifepoints": "60", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "42", + "magic_level": "42", + "melee_animation": "8248", + "defence_animation": "0", + "death_animation": "8250", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6835", + "name": "Vampire bat", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "8275", + "defence_animation": "8274", + "death_animation": "8276", + "safespot": null + }, + { + "id": "6836", + "name": "Vampire bat", + "examine": "It vants to suck my blood!", + "lifepoints": "44", + "attack_level": "31", + "strength_level": "31", + "defence_level": "31", + "range_level": "31", + "magic_level": "31", + "respawn_delay": "0", + "melee_animation": "8275", + "defence_animation": "0", + "death_animation": "8276", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6837", + "name": "Spirit scorpion", + "lifepoints": "67", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "6254", + "defence_animation": "6255", + "death_animation": "6256", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "6838", + "name": "Spirit scorpion", + "examine": "Salt and vinegaroon.", + "lifepoints": "27", + "attack_level": "19", + "strength_level": "19", + "defence_level": "19", + "range_level": "19", + "magic_level": "19", + "respawn_delay": "0", + "melee_animation": "6254", + "defence_animation": "0", + "death_animation": "6256", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_audio": "3611,3612,3610", + "safespot": null + }, + { + "id": "6839", + "name": "Arctic bear", + "examine": "Crikey! Look at the size of those teeth!", + "lifepoints": "10", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "bonuses": "90,50,50,60,90,80,50,30,40,100,0,0,0,0,0", + "respawn_delay": "0", + "melee_animation": "4925", + "defence_animation": "4928", + "death_animation": "4929", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "6840", + "name": "Arctic bear", + "examine": "Crikey! Look at the size of those teeth!", + "lifepoints": "101", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "respawn_delay": "0", + "melee_animation": "4925", + "defence_animation": "0", + "death_animation": "4929", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_audio": "498,500,499", + "safespot": null + }, + { + "id": "6841", + "name": "Spirit spider", + "examine": "Would scare anyone off their tuffet.", + "lifepoints": "18", + "attack_level": "17", + "strength_level": "16", + "defence_level": "17", + "range_level": "12", + "magic_level": "15", + "bonuses": "15,16,11,14,34,12,24,36,46,16,37,0,0,0,0", + "respawn_delay": "50", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "magic_animation": "5327", + "range_animation": "5327", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "6842", + "name": "Spirit spider", + "examine": "Would scare anyone off their tuffet.", + "lifepoints": "18", + "attack_level": "17", + "strength_level": "16", + "defence_level": "17", + "range_level": "12", + "magic_level": "15", + "bonuses": "15,16,11,14,34,12,24,36,46,16,37,0,0,0,0", + "respawn_delay": "50", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "magic_animation": "5327", + "range_animation": "5327", + "weakness": "10", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "6843", + "name": "Bloated leech", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7657", + "defence_animation": "7655", + "death_animation": "7656", + "safespot": null + }, + { + "id": "6844", + "name": "Bloated leech", + "examine": "It's like a little suction pump with eyes.", + "lifepoints": "70", + "attack_level": "49", + "strength_level": "49", + "defence_level": "49", + "range_level": "49", + "magic_level": "49", + "respawn_delay": "0", + "melee_animation": "7657", + "defence_animation": "0", + "death_animation": "7656", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6845", + "name": "Honey badger", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7928", + "defence_animation": "7927", + "death_animation": "7925", + "safespot": null + }, + { + "id": "6846", + "name": "Honey badger", + "examine": "Violent little so-and-so.", + "lifepoints": "45", + "attack_level": "32", + "strength_level": "32", + "defence_level": "32", + "range_level": "32", + "magic_level": "32", + "respawn_delay": "0", + "melee_animation": "7928", + "defence_animation": "0", + "death_animation": "7925", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6847", + "name": "Albino rat", + "examine": "The big cheese.", + "lifepoints": "68", + "attack_level": "31", + "strength_level": "28", + "defence_level": "32", + "range_level": "31", + "magic_level": "27", + "bonuses": "64,42,40,57,64,50,76,82,72,24,75,5,15,5,5", + "poison_immune": "true", + "respawn_delay": "50", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6848", + "name": "Albino rat", + "examine": "The big cheese.", + "lifepoints": "68", + "attack_level": "31", + "strength_level": "28", + "defence_level": "32", + "range_level": "31", + "magic_level": "27", + "bonuses": "64,42,40,57,64,50,76,82,72,24,75,5,15,5,5", + "poison_immune": "true", + "respawn_delay": "50", + "weakness": "10", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6849", + "name": "Granite lobster", + "examine": "Puts the 'crust' in 'crustacean'.", + "lifepoints": "10", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "bonuses": "93,90,65,90,30,40,50,50,60,40,0,0,0,0,0", + "respawn_delay": "0", + "melee_animation": "8112", + "defence_animation": "8114", + "death_animation": "8113", + "safespot": null + }, + { + "id": "6850", + "name": "Granite lobster", + "examine": "Puts the 'crust' in 'crustacean'.", + "lifepoints": "105", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "respawn_delay": "0", + "melee_animation": "8112", + "defence_animation": "0", + "death_animation": "8113", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6851", + "name": "Macaw", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "death_animation": "8012", + "safespot": null + }, + { + "id": "6852", + "name": "Macaw", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "death_animation": "8012", + "safespot": null + }, + { + "id": "6853", + "name": "Bronze minotaur", + "examine": "He's just a big bully.", + "lifepoints": "15", + "attack_level": "31", + "strength_level": "1", + "defence_level": "31", + "range_level": "31", + "magic_level": "31", + "bonuses": "15,20,10,15,10,5,35,0,0,0,0,0,0,0,0", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "8023", + "death_animation": "8025", + "combat_style": "1", + "safespot": null + }, + { + "id": "6854", + "name": "Bronze minotaur", + "examine": "He's just a big bully.", + "lifepoints": "51", + "attack_level": "15", + "strength_level": "15", + "defence_level": "15", + "range_level": "15", + "magic_level": "15", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "0", + "death_animation": "8025", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "6855", + "name": "Iron minotaur", + "lifepoints": "24", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "8023", + "death_animation": "8025", + "combat_style": "1", + "safespot": null + }, + { + "id": "6856", + "name": "Iron minotaur", + "examine": "He's just a big bully.", + "lifepoints": "65", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "25", + "magic_level": "25", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "0", + "death_animation": "8025", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "6857", + "name": "Steel minotaur", + "examine": "He's just a big bully!", + "lifepoints": "44", + "attack_level": "70", + "strength_level": "30", + "defence_level": "70", + "range_level": "1", + "bonuses": "40,30,30,30,30,50,30,60,60,60,20,80,40,20,0", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "8023", + "death_animation": "8025", + "combat_style": "1", + "safespot": null + }, + { + "id": "6858", + "name": "Steel minotaur", + "examine": "He's just a big bully.", + "lifepoints": "80", + "attack_level": "35", + "strength_level": "35", + "defence_level": "35", + "range_level": "35", + "magic_level": "35", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "0", + "death_animation": "8025", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "6859", + "name": "Mithril minotaur", + "examine": "He's just a big bully", + "lifepoints": "37", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "40", + "magic_level": "40", + "bonuses": "56,35,30,30,30,40,10,12,30,40,30,35,40,0,0", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "8023", + "death_animation": "8025", + "combat_style": "1", + "safespot": null + }, + { + "id": "6860", + "name": "Mithril minotaur", + "examine": "He's just a big bully.", + "lifepoints": "94", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "45", + "magic_level": "45", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "0", + "death_animation": "8025", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "6861", + "name": "Adamant minotaur", + "examine": "He's just a big bully.", + "lifepoints": "43", + "attack_level": "55", + "strength_level": "1", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "bonuses": "40,50,40,45,35,20,50,36,30,40,15,18,30,10,0", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "8023", + "death_animation": "8025", + "combat_style": "1", + "safespot": null + }, + { + "id": "6862", + "name": "Adamant minotaur", + "examine": "He's just a big bully.", + "lifepoints": "108", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "0", + "death_animation": "8025", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "6863", + "name": "Rune minotaur", + "examine": "He's just a big bully.", + "lifepoints": "57", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "bonuses": "50,40,40,56,40,30,50,30,60,30,40,30,50,40,40", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "8023", + "death_animation": "8025", + "safespot": null + }, + { + "id": "6864", + "name": "Rune minotaur", + "examine": "He's just a big bully.", + "lifepoints": "57", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "bonuses": "50,40,40,56,40,30,50,30,60,30,40,30,50,40,40", + "respawn_delay": "0", + "melee_animation": "8024", + "defence_animation": "8023", + "death_animation": "8025", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "6865", + "name": "Smoke devil", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7816", + "defence_animation": "7817", + "death_animation": "7818", + "safespot": null + }, + { + "id": "6866", + "name": "Smoke devil", + "examine": "Well", + "lifepoints": "87", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "0", + "melee_animation": "7816", + "defence_animation": "0", + "death_animation": "7818", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6867", + "name": "Bull ant", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7896", + "defence_animation": "7900", + "death_animation": "7897", + "safespot": null + }, + { + "id": "6868", + "name": "Bull ant", + "examine": "Putting all three of its best feet forward.", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "40", + "magic_level": "40", + "respawn_delay": "0", + "melee_animation": "7896", + "defence_animation": "0", + "death_animation": "7897", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6869", + "name": "Wolpertinger", + "examine": "It's just a harmless wee rabbit. ", + "lifepoints": "619", + "attack_level": "1", + "strength_level": "1", + "defence_level": "95", + "range_level": "95", + "magic_level": "95", + "bonuses": "59,50,50,50,50,50,50,50,50,50,50,50,50,68,0", + "poison_immune": "true", + "attack_speed": "5", + "melee_animation": "8304", + "defence_animation": "8306", + "death_animation": "8305", + "magic_animation": "8304", + "range_animation": "8304", + "combat_style": "2", + "safespot": null + }, + { + "id": "6870", + "name": "Wolpertinger", + "examine": "It's just a harmless wee rabbit. ", + "lifepoints": "619", + "attack_level": "1", + "strength_level": "1", + "defence_level": "95", + "range_level": "95", + "magic_level": "95", + "bonuses": "59,50,50,50,50,50,50,50,50,50,50,50,50,68,0", + "poison_immune": "true", + "attack_speed": "5", + "melee_animation": "8304", + "defence_animation": "8306", + "death_animation": "8305", + "magic_animation": "8304", + "range_animation": "8304", + "combat_style": "2", + "safespot": null + }, + { + "id": "6871", + "name": "Compost mound", + "lifepoints": "96", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "853", + "defence_animation": "851", + "death_animation": "852", + "safespot": null + }, + { + "id": "6872", + "name": "Compost mound", + "examine": "I suppose it could smell worse", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "28", + "magic_level": "28", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "7769", + "defence_animation": "0", + "death_animation": "7770", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6873", + "name": "Pack yak", + "examine": "Bulk haulage never smelled so bad.", + "lifepoints": "710", + "attack_level": "112", + "strength_level": "104", + "defence_level": "121", + "range_level": "86", + "magic_level": "91", + "bonuses": "64,67,5,72,128,49,264,234,164,49,132,40,35,40,40", + "poison_immune": "true", + "attack_speed": "5", + "melee_animation": "5782", + "defence_animation": "5783", + "death_animation": "5784", + "magic_animation": "5782", + "range_animation": "5782", + "safespot": null + }, + { + "id": "6874", + "name": "Pack yak", + "examine": "Bulk haulage never smelled so bad.", + "lifepoints": "710", + "attack_level": "112", + "strength_level": "104", + "defence_level": "121", + "range_level": "86", + "magic_level": "91", + "bonuses": "64,67,5,72,128,49,264,234,164,49,132,40,35,40,40", + "poison_immune": "true", + "attack_speed": "5", + "melee_animation": "5782", + "defence_animation": "5783", + "death_animation": "5784", + "magic_animation": "5782", + "range_animation": "5782", + "weakness": "10", + "safespot": null + }, + { + "id": "6875", + "name": "Spirit cockatrice", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "7761", + "death_animation": "7763", + "start_gfx": "1467", + "projectile": "1468", + "combat_style": "2", + "safespot": null + }, + { + "id": "6876", + "name": "Spirit cockatrice", + "examine": "If looks could kill... Wait", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "magic_level": "43", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "0", + "death_animation": "7763", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "1467", + "projectile": "1468", + "weakness": "10", + "combat_style": "2", + "safespot": null + }, + { + "id": "6877", + "name": "Spirit guthatrice", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "7761", + "death_animation": "7763", + "start_gfx": "1467", + "projectile": "1468", + "combat_style": "2", + "safespot": null + }, + { + "id": "6878", + "name": "Spirit guthatrice", + "examine": "If looks could kill... Wait", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "magic_level": "43", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "0", + "death_animation": "7763", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "1467", + "projectile": "1468", + "weakness": "10", + "combat_style": "2", + "safespot": null + }, + { + "id": "6879", + "name": "Spirit saratrice", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "7761", + "death_animation": "7763", + "start_gfx": "1467", + "projectile": "1468", + "combat_style": "2", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6880", + "name": "Spirit saratrice", + "examine": "If looks could kill... Wait", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "magic_level": "43", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "0", + "death_animation": "7763", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "1467", + "projectile": "1468", + "weakness": "10", + "combat_style": "2", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "6881", + "name": "Spirit zamatrice", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "7761", + "death_animation": "7763", + "start_gfx": "1467", + "projectile": "1468", + "combat_style": "2", + "safespot": null + }, + { + "id": "6882", + "name": "Spirit zamatrice", + "examine": "If looks could kill... Wait", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "magic_level": "43", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "0", + "death_animation": "7763", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "1467", + "projectile": "1468", + "weakness": "10", + "combat_style": "2", + "safespot": null + }, + { + "id": "6883", + "name": "Spirit pengatrice", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "7761", + "death_animation": "7763", + "start_gfx": "1467", + "projectile": "1468", + "combat_style": "2", + "safespot": null + }, + { + "id": "6884", + "name": "Spirit pengatrice", + "examine": "If looks could kill... Wait", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "magic_level": "43", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "0", + "death_animation": "7763", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "1467", + "projectile": "1468", + "weakness": "10", + "combat_style": "2", + "safespot": null + }, + { + "id": "6885", + "name": "Spirit coraxatrice", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "7761", + "death_animation": "7763", + "start_gfx": "1467", + "projectile": "1468", + "combat_style": "2", + "safespot": null + }, + { + "id": "6886", + "name": "Spirit coraxatrice", + "examine": "If looks could kill... Wait", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "magic_level": "43", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "0", + "death_animation": "7763", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "1467", + "projectile": "1468", + "weakness": "10", + "combat_style": "2", + "safespot": null + }, + { + "id": "6887", + "name": "Spirit vulatrice", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "7761", + "death_animation": "7763", + "start_gfx": "1467", + "projectile": "1468", + "combat_style": "2", + "safespot": null + }, + { + "id": "6888", + "name": "Spirit vulatrice", + "examine": "If looks could kill... Wait", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "magic_level": "43", + "respawn_delay": "0", + "melee_animation": "7762", + "defence_animation": "0", + "death_animation": "7763", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "1467", + "projectile": "1468", + "weakness": "10", + "combat_style": "2", + "safespot": null + }, + { + "id": "6889", + "name": "Barker toad", + "examine": "The only creature with a mouth big enough to hold a cannonball.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "55", + "defence_level": "1", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "0", + "melee_animation": "7260", + "defence_animation": "7257", + "death_animation": "7256", + "safespot": null + }, + { + "id": "6890", + "name": "Barker toad", + "examine": "The only creature with a mouth big enough to fit a cannon ball into.", + "lifepoints": "94", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "55", + "magic_level": "55", + "respawn_delay": "0", + "melee_animation": "7260", + "defence_animation": "0", + "death_animation": "7256", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6891", + "name": "Penguin keeper", + "examine": "He looks like the type of guy who would keep penguins.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6892", + "name": "Pet shop owner", + "examine": "The lady of the pet shop.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6893", + "name": "Pet shop owner", + "examine": "The man of the pet shop.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6896", + "name": "Dalmatian", + "examine": "A dalmatian puppy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6897", + "name": "Bulldog", + "examine": "A bulldog puppy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6900", + "name": "Hatchling dragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6901", + "name": "Baby dragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6902", + "name": "Hatchling dragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6903", + "name": "Baby dragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6904", + "name": "Hatchling dragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6905", + "name": "Baby dragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6906", + "name": "Hatchling dragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6907", + "name": "Baby dragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6917", + "name": "Baby gecko", + "examine": "It's so adorably tiny!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6921", + "name": "Baby squirrel", + "examine": "A tiny nut-thief.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6942", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "6943", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "6944", + "name": "Baby monkey", + "examine": "It's a tiny", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "6969", + "name": "Bulldog puppy", + "lifepoints": "651", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "8304", + "defence_animation": "8306", + "death_animation": "8305", + "combat_style": "2", + "safespot": null + }, + { + "id": "6972", + "name": "Druid", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7181", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6973", + "name": "Druid", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6974", + "name": "Druid", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6975", + "name": "Druid", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7181", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6976", + "name": "Druid", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6977", + "name": "Druid", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6978", + "name": "Druid", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6979", + "name": "Druid", + "lifepoints": "30", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "7186", + "death_animation": "7185", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6980", + "name": "Druid", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "6981", + "name": "Druidess", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "6982", + "name": "Druidess", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7181", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "6983", + "name": "Druidess", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "6984", + "name": "Druidess", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7181", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "6985", + "name": "Druidess", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "6986", + "name": "Druidess", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "6987", + "name": "Druidess", + "examine": "A nature lover.", + "lifepoints": "27", + "attack_level": "14", + "strength_level": "14", + "defence_level": "19", + "range_level": "1", + "magic_level": "19", + "respawn_delay": "60", + "melee_animation": "7182", + "defence_animation": "0", + "death_animation": "7185", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "safespot": null + }, + { + "id": "6992", + "name": "Spirit jelly", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "8569", + "defence_animation": "8571", + "death_animation": "8570", + "safespot": null + }, + { + "id": "6993", + "name": "Spirit jelly", + "examine": "On Runescape", + "lifepoints": "78", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "respawn_delay": "0", + "melee_animation": "8569", + "defence_animation": "0", + "death_animation": "8570", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "6994", + "name": "Spirit kalphite", + "lifepoints": "77", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "8519", + "defence_animation": "8518", + "death_animation": "8517", + "combat_style": "1", + "safespot": null + }, + { + "id": "6995", + "name": "Spirit kalphite", + "examine": "Hail to the Queen", + "lifepoints": "35", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "25", + "magic_level": "25", + "respawn_delay": "0", + "melee_animation": "6223", + "defence_animation": "0", + "death_animation": "6228", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "6997", + "name": "Baby raccoon", + "examine": "A stripy little baby raccoon.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "6998", + "name": "Revenant dragon", + "examine": "A ghost of a dragon slain during the god wars.", + "lifepoints": "210", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "8591", + "defence_animation": "8592", + "death_animation": "8593", + "spawn_animation": "8595", + "magic_animation": "8594", + "range_animation": "8594", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "6999", + "name": "Revenant dragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "7003", + "name": "Fire giant", + "examine": "A very large elemental adversary.", + "lifepoints": "111", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "4666", + "defence_animation": "4664", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "33", + "slayer_exp": "111", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "7004", + "name": "Fire giant", + "examine": "A very large elemental adversary.", + "lifepoints": "111", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "1", + "magic_level": "1", + "bonuses": "29,29,29,0,0,0,3,2,0,0,0,31,0,0,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "4666", + "defence_animation": "4664", + "death_animation": "4668", + "magic_animation": "4666", + "range_animation": "4666", + "weakness": "1", + "slayer_task": "33", + "slayer_exp": "111", + "combat_audio": "449,451,450", + "safespot": null + }, + { + "id": "7005", + "name": "Big wolf", + "examine": "Must be the pack leader.", + "lifepoints": "21", + "attack_level": "60", + "strength_level": "60", + "defence_level": "62", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6559", + "defence_animation": "0", + "death_animation": "6558", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "92", + "slayer_exp": "74", + "aggressive": "true", + "safespot": null + }, + { + "id": "7010", + "name": "Grenwall", + "examine": "An active spiny creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7011", + "name": "Grenwall", + "examine": "A hiding spiny creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7012", + "name": "Pawya", + "examine": "What a strange little creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7013", + "name": "Earth Mound", + "examine": "Dug by a Pawya (Not actual exam).", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7014", + "name": "Pawya", + "examine": "What a strange little creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7021", + "name": "Platypus", + "examine": "A most unlikely creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7024", + "name": "Baby platypus", + "examine": "A most unlikely creature.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7031", + "name": "Wimpy bird", + "examine": "An ogre snack with wings.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_task": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "7039", + "name": "Diseased kebbit", + "examine": "A shy creature with a toxic bite.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7049", + "name": "Ogress banker", + "examine": "Fit to wear the uniform?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7051", + "name": "Chief Tess", + "examine": "She walks as if she owns the place.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7078", + "name": "Ogress champion", + "examine": "A fearsome adversary with no sense of humour.", + "lifepoints": "68", + "attack_level": "48", + "strength_level": "48", + "defence_level": "48", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8636", + "defence_animation": "0", + "death_animation": "8640", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "64", + "aggressive": "true", + "safespot": null + }, + { + "id": "7079", + "name": "Ogress warrior", + "examine": "Irascible", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8636", + "defence_animation": "0", + "death_animation": "8640", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "64", + "aggressive": "true", + "safespot": null + }, + { + "id": "7080", + "name": "Ogress warrior", + "examine": "Irascible", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8637", + "defence_animation": "0", + "death_animation": "8641", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "64", + "aggressive": "true", + "safespot": null + }, + { + "id": "7081", + "name": "Ogress", + "examine": "A large and contentious lady ogre.", + "lifepoints": "60", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8636", + "defence_animation": "0", + "death_animation": "8640", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "64", + "aggressive": "true", + "safespot": null + }, + { + "id": "7082", + "name": "Ogress", + "examine": "A large and contentious lady ogre.", + "lifepoints": "60", + "attack_level": "42", + "strength_level": "42", + "defence_level": "42", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8637", + "defence_animation": "0", + "death_animation": "8641", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "64", + "aggressive": "true", + "safespot": null + }, + { + "id": "7084", + "name": "Eucalyptus ent", + "examine": "Dead stone defending a dead throne room.", + "lifepoints": "145", + "attack_level": "51", + "strength_level": "51", + "defence_level": "51", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "7085", + "name": "Eucalyptus ent", + "examine": "Dead stone defending a dead throne room.", + "lifepoints": "142", + "attack_level": "54", + "strength_level": "54", + "defence_level": "54", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "7086", + "name": "Eucalyptus ent", + "examine": "Dead stone defending a dead throne room.", + "lifepoints": "162", + "attack_level": "57", + "strength_level": "57", + "defence_level": "57", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "7105", + "name": "Chaos druid", + "examine": "A crazy, evil druid.", + "lifepoints": "20", + "attack_level": "8", + "strength_level": "8", + "defence_level": "12", + "range_level": "1", + "magic_level": "10", + "bonuses": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "start_gfx": "105", + "projectile": "106", + "end_gfx": "107", + "weakness": "3", + "safespot": null + }, + { + "id": "7106", + "name": "Thug", + "examine": "Low on brains.", + "lifepoints": "18", + "attack_level": "7", + "strength_level": "5", + "defence_level": "9", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "386", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "7107", + "name": "Thug", + "examine": "Low on brains.", + "lifepoints": "18", + "attack_level": "7", + "strength_level": "5", + "defence_level": "9", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "386", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "7108", + "name": "Thug", + "examine": "Low on brains.", + "lifepoints": "18", + "attack_level": "7", + "strength_level": "5", + "defence_level": "9", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "386", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "7109", + "name": "Thug", + "examine": "Low on brains.", + "lifepoints": "18", + "attack_level": "7", + "strength_level": "5", + "defence_level": "9", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "386", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "7110", + "name": "Thug", + "examine": "Low on brains.", + "lifepoints": "18", + "attack_level": "7", + "strength_level": "5", + "defence_level": "9", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "386", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "7111", + "name": "Thug", + "examine": "Low on brains.", + "lifepoints": "18", + "attack_level": "7", + "strength_level": "5", + "defence_level": "9", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "386", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "7112", + "name": "Thug", + "examine": "Low on brains.", + "lifepoints": "18", + "attack_level": "7", + "strength_level": "5", + "defence_level": "9", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "386", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "7113", + "name": "Thug", + "examine": "Low on brains.", + "lifepoints": "18", + "attack_level": "7", + "strength_level": "5", + "defence_level": "9", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "386", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "7114", + "name": "Thug", + "examine": "Low on brains.", + "lifepoints": "18", + "attack_level": "7", + "strength_level": "5", + "defence_level": "9", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "386", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "0", + "safespot": null + }, + { + "id": "7115", + "name": "Thaki the delivery dwarf", + "examine": "He seems to be enjoying his time in the bar.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "magic_level": "1", + "bonuses": "5,5,0,0,0,0,2,3,3,0,0,0,0,0,0", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7120", + "name": "Tyras guard", + "examine": "One of King Tyras's men.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7125", + "name": "Rabbit", + "examine": "A hungry-looking rabbit.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7128", + "name": "Farmer", + "examine": "A gnome farmer.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7129", + "name": "Farmer", + "examine": "A gnome farmer.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7130", + "name": "Farmer", + "examine": "A gnome farmer.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7131", + "name": "Farmer Blinkin", + "examine": "The head farmer", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7132", + "name": "Mrs. Winkin", + "examine": "Owner of this homestead.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7133", + "name": "Bork", + "examine": "That's one big Ork... ", + "lifepoints": "300", + "attack_level": "100", + "strength_level": "90", + "defence_level": "80", + "range_level": "1", + "bonuses": "200,120,100,300,300,120,400,500,300,200,300,400,200,90,0", + "respawn_delay": "60", + "attack_speed": "6", + "agg_radius": "64", + "melee_animation": "8754", + "defence_animation": "8755", + "death_animation": "8756" + }, + { + "id": "2354", + "name": "Banker", + "examine": "He can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2355", + "name": "Banker", + "examine": "She can look after my money.", + "lifepoints": "476", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_style": "2", + "safespot": null + }, + { + "id": "2359", + "name": "Elf warrior", + "examine": "I don't wanna be at the wrong end of that pike.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "31", + "clue_level": "2", + "safespot": null + }, + { + "id": "2360", + "name": "Elf warrior", + "examine": "I don't wanna be at the wrong end of that pike.", + "lifepoints": "85", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "31", + "clue_level": "2", + "safespot": null + }, + { + "id": "2361", + "name": "Elf warrior", + "examine": "He looks pretty handy with that bow.", + "lifepoints": "91", + "attack_level": "1", + "strength_level": "1", + "defence_level": "64", + "range_level": "64", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "start_gfx": "250", + "projectile": "249", + "weakness": "2", + "slayer_task": "31", + "combat_style": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "2362", + "name": "Elf warrior", + "examine": "He looks pretty handy with that bow.", + "lifepoints": "91", + "attack_level": "1", + "strength_level": "1", + "defence_level": "64", + "range_level": "64", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "start_gfx": "250", + "projectile": "249", + "weakness": "2", + "slayer_task": "31", + "combat_style": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "2372", + "name": "Head mourner", + "examine": "A Mourner showing his true identity.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2373", + "name": "Mourner", + "examine": "A Mourner", + "lifepoints": "87", + "attack_level": "61", + "strength_level": "61", + "defence_level": "61", + "range_level": "1", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "31", + "aggressive": "true", + "safespot": null + }, + { + "id": "2397", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2398", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2399", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2400", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2401", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2402", + "name": "Mysterious ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2423", + "name": "Chaos dwarf", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "16", + "safespot": null + }, + { + "id": "2436", + "name": "Jarvald", + "lifepoints": "10", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "melee_animation": "9232", + "defence_animation": "9231", + "death_animation": "9230", + "safespot": null + }, + { + "id": "2439", + "name": "Askeladden", + "examine": "Looks like a wanna be Fremennik.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2443", + "name": "Door-support", + "examine": "This support is propping the door closed.", + "lifepoints": "0", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2452", + "name": "Giant Rock Crab", + "examine": "No one likes crabs... especially really big ones!", + "lifepoints": "97", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "2368", + "defence_animation": "0", + "death_animation": "1314", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "2453", + "name": "Boulder", + "examine": "Heavy rock!", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2454", + "name": "Dagannoth spawn", + "examine": "A teeny-tiny horror from the ocean depths...", + "lifepoints": "67", + "attack_level": "47", + "strength_level": "47", + "defence_level": "47", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1341", + "defence_animation": "0", + "death_animation": "1342", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "24", + "aggressive": "true", + "safespot": null + }, + { + "id": "2455", + "name": "Dagannoth", + "examine": "A spiny horror from the ocean depths...", + "lifepoints": "95", + "attack_level": "90", + "strength_level": "90", + "defence_level": "60", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "294", + "slayer_exp": "100", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2456", + "name": "Dagannoth", + "examine": "It's an NPC.", + "lifepoints": "70", + "attack_level": "90", + "strength_level": "90", + "defence_level": "60", + "range_level": "90", + "respawn_delay": "60", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "294", + "slayer_exp": "0", + "combat_style": "1", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2457", + "name": "Wallasalki", + "examine": "A fearsome magical creature from the deep..", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "2365", + "defence_animation": "2366", + "death_animation": "2367", + "magic_animation": "2365", + "combat_style": "2", + "aggressive": "true", + "spell_id": "48", + "safespot": null + }, + { + "id": "2463", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "19", + "attack_level": "5", + "strength_level": "5", + "defence_level": "20", + "range_level": "5", + "magic_level": "5", + "bonuses": "25,85,105,75,103,85,65,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2464", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "40", + "attack_level": "10", + "strength_level": "10", + "defence_level": "40", + "range_level": "10", + "magic_level": "10", + "bonuses": "35,105,125,95,128,105,85,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2465", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "60", + "attack_level": "15", + "strength_level": "15", + "defence_level": "50", + "range_level": "15", + "magic_level": "15", + "bonuses": "35,185,185,155,188,125,165,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2466", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "80", + "attack_level": "45", + "strength_level": "45", + "defence_level": "60", + "range_level": "45", + "magic_level": "25", + "bonuses": "45,235,235,205,238,145,165,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2467", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "105", + "attack_level": "45", + "strength_level": "45", + "defence_level": "70", + "range_level": "45", + "magic_level": "35", + "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2468", + "name": "Evil Chicken", + "examine": "A fowl beast.", + "lifepoints": "120", + "attack_level": "45", + "strength_level": "45", + "defence_level": "90", + "range_level": "45", + "magic_level": "45", + "bonuses": "45,285,285,255,288,145,165,0,0,0,0,0,0,0,0", + "respawn_delay": "25", + "melee_animation": "2302", + "defence_animation": "2300", + "death_animation": "2301", + "magic_animation": "2302", + "range_animation": "2302", + "projectile": "337", + "weakness": "9", + "combat_style": "2", + "aggressive": "true", + "combat_audio": "355,357,356", + "safespot": null + }, + { + "id": "2476", + "name": "Rick Turpentine", + "examine": "A Retired Highwayman", + "lifepoints": "10", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "20", + "magic_level": "30", + "bonuses": "30,20,10,20,20,30,30,10,20,10,30,30,20,30,20", + "attack_speed": "5", + "melee_animation": "4230", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "4230", + "range_animation": "4230", + "combat_style": "1", + "safespot": null + }, + { + "id": "2477", + "name": "Quiz Master", + "examine": "Apparently a master of quizzes!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2479", + "name": "Evil Bob", + "examine": "Hey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2481", + "name": "Servant", + "examine": "Servant of Evil Bob.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2482", + "name": "Giant bat", + "examine": "Annoying flappy thing.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "slayer_exp": "8", + "safespot": null + }, + { + "id": "2489", + "name": "Bush snake", + "examine": "A slithering serpent that likes to hide in the bush.", + "lifepoints": "87", + "attack_level": "1", + "strength_level": "1", + "defence_level": "61", + "range_level": "61", + "poison_amount": "11", + "respawn_delay": "60", + "melee_animation": "275", + "defence_animation": "0", + "death_animation": "278", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "poisonous": "true", + "aggressive": "true", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "2490", + "name": "Bush snake", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "poison_amount": "11", + "respawn_delay": "60", + "melee_animation": "275", + "defence_animation": "276", + "death_animation": "278", + "poisonous": "true", + "aggressive": "true", + "combat_audio": "3609,3608,3610", + "safespot": null + }, + { + "id": "2491", + "name": "Jungle spider", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "2492", + "name": "Jungle spider", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5327", + "defence_animation": "5328", + "death_animation": "5329", + "aggressive": "true", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "2493", + "name": "Large mosquito", + "examine": "A flying bloodsucker.", + "lifepoints": "90", + "attack_level": "1", + "strength_level": "1", + "defence_level": "63", + "range_level": "63", + "melee_animation": "2397", + "defence_animation": "0", + "death_animation": "2398", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "safespot": null + }, + { + "id": "2494", + "name": "Mosquito swarm", + "examine": "A swarm of three highly agile mosquitoes.", + "lifepoints": "94", + "attack_level": "1", + "strength_level": "1", + "defence_level": "66", + "range_level": "66", + "melee_animation": "2397", + "defence_animation": "0", + "death_animation": "2398", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "safespot": null + }, + { + "id": "2495", + "name": "Mosquito swarm", + "examine": "A swarm of five highly agile mosquitoes.", + "lifepoints": "97", + "attack_level": "1", + "strength_level": "1", + "defence_level": "68", + "range_level": "68", + "melee_animation": "2397", + "defence_animation": "0", + "death_animation": "2398", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "safespot": null + }, + { + "id": "2496", + "name": "Tribesman", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "safespot": null + }, + { + "id": "2497", + "name": "Tribesman", + "examine": "A vicious warrior.", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "poisonous": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2499", + "name": "Broodoo victim", + "examine": "An undead victim of some ancient murderous ritual; his skin appears deep green.", + "lifepoints": "64", + "attack_level": "45", + "strength_level": "45", + "defence_level": "45", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "2501", + "name": "Broodoo victim", + "examine": "An undead victim of some ancient murderous ritual; his skin appears pale yellow.", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "428", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "2503", + "name": "Broodoo victim", + "lifepoints": "100", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "810", + "defence_animation": "425", + "death_animation": "836", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "2505", + "name": "Sharimika", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2506", + "name": "Sharimika", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2508", + "name": "Mamma Bufetta", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2509", + "name": "Mamma Bufetta", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2511", + "name": "Layleen", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2512", + "name": "Layleen", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2514", + "name": "Karaday", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2515", + "name": "Karaday", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2517", + "name": "Safta Doc", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2518", + "name": "Safta Doc", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2520", + "name": "Gabooty", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2521", + "name": "Gabooty", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2523", + "name": "Fanellaman", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2524", + "name": "Fanellaman", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2526", + "name": "Jagbakoba", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2527", + "name": "Jagbakoba", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2529", + "name": "Murcaily", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2530", + "name": "Murcaily", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2532", + "name": "Rionasta", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2533", + "name": "Rionasta", + "examine": "A native of Tai Bwo Wannai." + }, + { + "id": "2539", + "name": "Cap'n Hand", + "examine": "He used to swashbuckle his away across the seven seas.", + "lifepoints": "10", + "attack_level": "30", + "strength_level": "10", + "defence_level": "10", + "range_level": "30", + "magic_level": "20", + "bonuses": "10,30,20,30,10,20,15,30,10,30,15,20,20,0,0", + "attack_speed": "5", + "melee_animation": "4230", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "4230", + "range_animation": "4230", + "combat_style": "1", + "safespot": null + }, + { + "id": "2547", + "name": "Chaos druid", + "examine": "A crazy, evil druid.", + "lifepoints": "20", + "attack_level": "20", + "strength_level": "20", + "defence_level": "10", + "range_level": "10", + "magic_level": "20", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "422", + "range_animation": "422", + "start_gfx": "105", + "projectile": "106", + "end_gfx": "107", + "weakness": "3", + "safespot": null + }, + { + "id": "2549", + "name": "Ali the dyer", + "examine": "A colourful character.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2553", + "name": "Blast Furnace Foreman", + "examine": "Looks after the blast furnace.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2571", + "name": "Market Guard", + "lifepoints": "23", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "400", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "2574", + "name": "Bank guard", + "examine": "He's guarding the bank.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2588", + "name": "Brother Althric", + "examine": "A holy man.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2591", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2592", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2593", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2594", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2595", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2596", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2597", + "name": "TzHaar-Mej", + "examine": "Looks like some kind of mystic.", + "lifepoints": "100", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,120,90,120,60,60,50,45,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9260", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9260", + "range_animation": "9260", + "start_gfx": "1618", + "projectile": "1617", + "end_gfx": "1621", + "combat_style": "2", + "safespot": null + }, + { + "id": "2598", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2599", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2600", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2601", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2602", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2603", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "70", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "2604", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,120,120,120,130,20,50,45,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2605", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,120,120,120,130,20,50,45,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2606", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,80,56,80,80,100,60,50,45,45,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "projectile": "442", + "combat_style": "1", + "safespot": null + }, + { + "id": "2607", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,120,120,120,130,20,50,45,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2608", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,120,120,120,130,20,50,45,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2609", + "name": "TzHaar-Xil", + "examine": "Doesn't look very social.", + "lifepoints": "120", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,30,80,56,80,80,100,60,50,45,45,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9291", + "magic_animation": "9345", + "range_animation": "9345", + "projectile": "442", + "slayer_exp": "0", + "combat_style": "1", + "safespot": null + }, + { + "id": "2610", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2611", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2612", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2613", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2614", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2615", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2616", + "name": "TzHaar-Ket", + "examine": "Must be a guard or something.", + "lifepoints": "140", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "50,120,120,120,130,20,60,45,0,0,0,0,0,0,0", + "melee_animation": "9345", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9345", + "range_animation": "9345", + "safespot": null + }, + { + "id": "2627", + "name": "Tz-Kih", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "2628", + "name": "Tz-Kih", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "2629", + "name": "Tz-Kek", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "2630", + "name": "Tz-Kek", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "aggressive": "true", + "safespot": null + }, + { + "id": "2631", + "name": "Tok-Xil", + "examine": "The Tok-Xil fires deadly spines out of its arm", + "lifepoints": "114", + "attack_level": "1", + "strength_level": "1", + "defence_level": "80", + "range_level": "80", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "2634", + "name": "Miss Schism", + "examine": "A busy-body who loves a bit of gossip.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2641", + "name": "Dragonkin", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "2674", + "name": "Thief", + "examine": "Known for his light-fingered qualities.", + "lifepoints": "14", + "attack_level": "10", + "strength_level": "10", + "defence_level": "10", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "safespot": null + }, + { + "id": "2675", + "name": "Man", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2677", + "name": "Highwayman", + "examine": "He holds up passers by.", + "lifepoints": "13", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "799", + "defence_animation": "404", + "death_animation": "9055", + "magic_animation": "799", + "range_animation": "799", + "weakness": "7", + "aggressive": "true", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2678", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2679", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2680", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2681", + "name": "Goblin", + "examine": "An ugly green creature.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "2", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "6185", + "defence_animation": "6183", + "death_animation": "6182", + "magic_animation": "6185", + "range_animation": "6185", + "slayer_exp": "5", + "clue_level": "0", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2682", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "2", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "3102,3104,3103", + "safespot": null + }, + { + "id": "2683", + "name": "Hengel", + "lifepoints": "7", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "2685", + "name": "Hobgoblin", + "examine": "An ugly smelly creature.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "164", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "164", + "range_animation": "164", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2686", + "name": "Hobgoblin", + "examine": "An ugly smelly creature.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "164", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "164", + "range_animation": "164", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2687", + "name": "Hobgoblin", + "examine": "An ugly smelly creature.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "164", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "164", + "range_animation": "164", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2688", + "name": "Hobgoblin", + "examine": "An ugly smelly creature, with a spear.", + "lifepoints": "29", + "attack_level": "20", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "attack_speed": "6", + "melee_animation": "163", + "defence_animation": "165", + "death_animation": "167", + "magic_animation": "163", + "range_animation": "163", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "2689", + "name": "Frog", + "examine": "Didn't the mage say this procedure was totally safe?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2690", + "name": "Jack Seagull", + "examine": "A salty seafarer. Needs a wash.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2691", + "name": "Longbow Ben", + "examine": "A strange man with a strange name. Probably a strange past", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2693", + "name": "Duck", + "examine": "She quackers.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "3468", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "7", + "safespot": null + }, + { + "id": "2694", + "name": "Duckling", + "examine": "Mini quackers.", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "3468", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_task": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "2695", + "name": "Pirate", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2696", + "name": "Thief", + "examine": "Known for his light-fingered qualities.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "2697", + "name": "Mugger", + "examine": "He doesn't look so happy now he's in jail.", + "lifepoints": "15", + "attack_level": "11", + "strength_level": "11", + "defence_level": "11", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "aggressive": "true", + "safespot": null + }, + { + "id": "2698", + "name": "Black knight", + "examine": "A dark-hearted knight.", + "lifepoints": "34", + "attack_level": "24", + "strength_level": "24", + "defence_level": "24", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "2699", + "name": "Guard", + "examine": "He's guarding the prison.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2700", + "name": "Guard", + "examine": "A prison guard.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2701", + "name": "Guard", + "examine": "A prison guard.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2702", + "name": "Guard", + "examine": "A prison guard.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2703", + "name": "Guard", + "examine": "A prison guard.", + "lifepoints": "18", + "attack_level": "13", + "strength_level": "13", + "defence_level": "13", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "390", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2704", + "name": "Guard", + "examine": "He's asleep.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2705", + "name": "Guard", + "examine": "Keeping an eye out for suspicious activity.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2706", + "name": "Crab", + "examine": "No one likes crabs...", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2707", + "name": "Seagull", + "examine": "A sea bird.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2709", + "name": "Fire wizard", + "examine": "Caution: HOT!", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "18", + "range_level": "1", + "magic_level": "18", + "respawn_delay": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "2553", + "magic_animation": "711", + "start_gfx": "99", + "projectile": "100", + "end_gfx": "101", + "start_height": "80", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "safespot": null + }, + { + "id": "2710", + "name": "Water wizard", + "examine": "Hydro-power!", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "14", + "range_level": "1", + "magic_level": "14", + "respawn_delay": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "2553", + "magic_animation": "711", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "safespot": null + }, + { + "id": "2711", + "name": "Earth wizard", + "examine": "His hands are covered in mud. At least", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "16", + "range_level": "1", + "magic_level": "16", + "respawn_delay": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "2553", + "magic_animation": "711", + "start_gfx": "96", + "projectile": "97", + "end_gfx": "98", + "start_height": "80", + "range_animation": "0", + "weakness": "3", + "combat_style": "2", + "safespot": null + }, + { + "id": "2712", + "name": "Air wizard", + "examine": "At least he looks solid enough to fight.", + "lifepoints": "17", + "attack_level": "1", + "strength_level": "1", + "defence_level": "12", + "range_level": "1", + "magic_level": "12", + "respawn_delay": "60", + "melee_animation": "414", + "defence_animation": "0", + "death_animation": "2553", + "magic_animation": "711", + "range_animation": "0", + "start_gfx": "90", + "start_height": "80", + "projectile": "91", + "end_gfx": "92", + "weakness": "3", + "combat_style": "2", + "safespot": null + }, + { + "id": "2714", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2715", + "name": "Skeleton", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "2716", + "name": "Ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "25", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2717", + "name": "Skeleton mage", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "2718", + "name": "Betty", + "examine": "She'll store my items for me.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2725", + "name": "Otto Godblessed", + "examine": "A wise barbarian", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2728", + "name": "Monk of Entrana", + "examine": "Holy looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2729", + "name": "Monk of Entrana", + "examine": "Holy looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2731", + "name": "Monk of Entrana", + "examine": "Holy looking.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2732", + "name": "Master Crafter", + "examine": "He works in the Crafting Guild.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2733", + "name": "Master Crafter", + "examine": "He wanders around the Crafting Guild pretending to be working.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2734", + "name": "Tz-Kih", + "examine": "Hangs out in caves.", + "lifepoints": "10", + "attack_level": "30", + "strength_level": "27", + "defence_level": "11", + "range_level": "1", + "bonuses": "150,22,22,22,22,11,0,0,0,0,0,0,0,0,0", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "9232", + "defence_animation": "9231", + "death_animation": "9230", + "magic_animation": "9232", + "range_animation": "9232", + "aggressive": "true", + "safespot": null + }, + { + "id": "2735", + "name": "Tz-Kih", + "examine": "Hangs out in caves.", + "lifepoints": "10", + "attack_level": "30", + "strength_level": "27", + "defence_level": "11", + "range_level": "1", + "bonuses": "150,22,22,22,22,11,0,0,0,0,0,0,0,0,0", + "respawn_delay": "0", + "attack_speed": "5", + "melee_animation": "9232", + "defence_animation": "9231", + "death_animation": "9230", + "magic_animation": "9232", + "range_animation": "9232", + "aggressive": "true", + "safespot": null + }, + { + "id": "2736", + "name": "Tz-Kek", + "examine": "Looks like living lava...", + "lifepoints": "20", + "attack_level": "60", + "strength_level": "60", + "defence_level": "22", + "range_level": "20", + "magic_level": "20", + "bonuses": "80,45,45,45,45,22,0,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9233", + "defence_animation": "9235", + "death_animation": "9234", + "magic_animation": "9233", + "range_animation": "9233", + "aggressive": "true", + "safespot": null + }, + { + "id": "2737", + "name": "Tz-Kek", + "examine": "Looks like living lava...", + "lifepoints": "20", + "attack_level": "60", + "strength_level": "60", + "defence_level": "22", + "range_level": "20", + "magic_level": "20", + "bonuses": "80,45,45,45,45,22,0,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9233", + "defence_animation": "9235", + "death_animation": "9234", + "magic_animation": "9233", + "range_animation": "9233", + "aggressive": "true", + "safespot": null + }, + { + "id": "2738", + "name": "Tz-Kek", + "examine": "Looks like living lava...", + "lifepoints": "10", + "attack_level": "30", + "strength_level": "30", + "defence_level": "11", + "range_level": "1", + "bonuses": "60,22,22,22,22,11,0,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9233", + "defence_animation": "9235", + "death_animation": "9234", + "magic_animation": "9233", + "range_animation": "9233", + "safespot": null + }, + { + "id": "2739", + "name": "Tok-Xil", + "examine": "I don't like the look of those spines...", + "lifepoints": "40", + "attack_level": "80", + "strength_level": "80", + "defence_level": "45", + "range_level": "80", + "bonuses": "80,90,86,90,90,90,45,55,26,55,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9245", + "defence_animation": "9242", + "death_animation": "9239", + "magic_animation": "9245", + "range_animation": "9245", + "weakness": "4", + "safespot": null + }, + { + "id": "2740", + "name": "Tok-Xil", + "examine": "I don't like the look of those spines...", + "lifepoints": "40", + "attack_level": "80", + "strength_level": "80", + "defence_level": "45", + "range_level": "80", + "bonuses": "80,90,86,90,90,90,45,55,26,55,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9245", + "defence_animation": "9242", + "death_animation": "9239", + "magic_animation": "9245", + "range_animation": "9245", + "weakness": "4", + "safespot": null + }, + { + "id": "2741", + "name": "Yt-MejKot", + "examine": "Holy reptile...", + "lifepoints": "80", + "attack_level": "100", + "strength_level": "100", + "defence_level": "90", + "range_level": "1", + "bonuses": "100,180,180,180,180,90,97,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9252", + "defence_animation": "9249", + "death_animation": "9257", + "magic_animation": "9252", + "range_animation": "9252", + "aggressive": "true", + "safespot": null + }, + { + "id": "2742", + "name": "Yt-MejKot", + "examine": "Holy reptile...", + "lifepoints": "80", + "attack_level": "100", + "strength_level": "100", + "defence_level": "90", + "range_level": "1", + "bonuses": "100,180,180,180,180,90,97,0,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9252", + "defence_animation": "9249", + "death_animation": "9257", + "magic_animation": "9252", + "range_animation": "9252", + "aggressive": "true", + "safespot": null + }, + { + "id": "2743", + "name": "Ket-Zek", + "examine": "That's one hot dog!", + "lifepoints": "160", + "attack_level": "150", + "strength_level": "150", + "defence_level": "180", + "range_level": "1", + "magic_level": "150", + "bonuses": "180,180,280,280,280,250,140,152,131,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9265", + "defence_animation": "9268", + "death_animation": "9269", + "magic_animation": "9265", + "range_animation": "9265", + "safespot": null + }, + { + "id": "2744", + "name": "Ket-Zek", + "examine": "That's one hot dog!", + "lifepoints": "160", + "attack_level": "150", + "strength_level": "150", + "defence_level": "180", + "range_level": "1", + "magic_level": "150", + "bonuses": "180,180,280,280,280,250,140,152,131,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9265", + "defence_animation": "9268", + "death_animation": "9269", + "magic_animation": "9265", + "range_animation": "9265", + "safespot": null + }, + { + "id": "2745", + "name": "TzTok-Jad", + "examine": "This is going to hurt...", + "lifepoints": "250", + "attack_level": "700", + "strength_level": "1600", + "defence_level": "700", + "range_level": "1600", + "magic_level": "2400", + "bonuses": "0,0,0,60,0,0,0,0,0,0,0,0,0,0,0", + "attack_speed": "8", + "agg_radius": "64", + "melee_animation": "9277", + "defence_animation": "9278", + "death_animation": "9279", + "magic_animation": "9277", + "range_animation": "9277", + "weakness": "10", + "slayer_exp": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2746", + "name": "Yt-HurKot", + "examine": "Mini Menace.", + "lifepoints": "40", + "attack_level": "75", + "strength_level": "75", + "defence_level": "75", + "range_level": "1", + "bonuses": "100,110,110,110,110,60,110,30,0,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9252", + "defence_animation": "9253", + "death_animation": "9257", + "magic_animation": "9252", + "range_animation": "9252", + "aggressive": "true", + "safespot": null + }, + { + "id": "2759", + "name": "null", + "examine": "She can look after my money.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2776", + "name": "Woman", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "0", + "combat_audio": "511,506,505", + "safespot": null + }, + { + "id": "2779", + "name": "Ranger", + "examine": "A Ranger of the Temple Knights.", + "lifepoints": "20", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2782", + "name": "Shadow", + "examine": "A shadow.", + "lifepoints": "100", + "attack_level": "68", + "strength_level": "68", + "defence_level": "68", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "2738", + "defence_animation": "0", + "death_animation": "2739", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "2783", + "name": "Dark beast", + "examine": "From a darker dimension.", + "lifepoints": "220", + "attack_level": "140", + "strength_level": "160", + "defence_level": "120", + "range_level": "1", + "magic_level": "160", + "bonuses": "0,0,0,0,0,30,40,100,90,100,0,0,0,0,0", + "attack_speed": "4", + "melee_animation": "2731", + "defence_animation": "2732", + "death_animation": "2733", + "magic_animation": "2731", + "range_animation": "2731", + "weakness": "4", + "slayer_task": "25", + "slayer_exp": "225", + "aggressive": "true", + "safespot": null + }, + { + "id": "2785", + "name": "Slave", + "examine": "Digging.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2786", + "name": "Slave", + "examine": "Digging.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2787", + "name": "Slave", + "examine": "Confused.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2790", + "name": "Sergeant Damien", + "examine": "Drill Sergeant from heck!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2792", + "name": "Tramp", + "examine": "A man down on his luck.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2801", + "name": "Ogre", + "examine": "An angry Ogre in a funny hat.", + "lifepoints": "48", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "attack_speed": "6", + "melee_animation": "359", + "defence_animation": "360", + "death_animation": "361", + "magic_animation": "359", + "range_animation": "359", + "aggressive": "true", + "safespot": null + }, + { + "id": "2802", + "name": "Gnome Coach", + "examine": "They just call him 'Coach'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2803", + "name": "Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "55", + "range_level": "55", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "slayer_exp": "40", + "aggressive": "true", + "safespot": null + }, + { + "id": "2804", + "name": "Desert Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "2805", + "name": "Desert Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "2806", + "name": "Desert Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "25", + "attack_level": "1", + "strength_level": "1", + "defence_level": "45", + "range_level": "45", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "slayer_exp": "25", + "aggressive": "true", + "safespot": null + }, + { + "id": "2807", + "name": "Small Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "15", + "attack_level": "1", + "strength_level": "1", + "defence_level": "15", + "range_level": "15", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "slayer_exp": "15", + "safespot": null + }, + { + "id": "2808", + "name": "Small Lizard", + "examine": "A cold-blooded creature, partial to warmth.", + "lifepoints": "15", + "attack_level": "1", + "strength_level": "1", + "defence_level": "15", + "range_level": "15", + "attack_speed": "5", + "melee_animation": "2776", + "defence_animation": "2777", + "death_animation": "2778", + "magic_animation": "2776", + "range_animation": "2776", + "weakness": "0", + "slayer_task": "26", + "aggressive": "true", + "safespot": null + }, + { + "id": "2809", + "name": "Al the Camel", + "examine": "A camel who has the soul of a poet.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2810", + "name": "Elly the Camel", + "examine": "A camel whose love is unrequited.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2811", + "name": "Ollie the Camel", + "examine": "A camel who wants to fly some day.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2812", + "name": "Cam the Camel", + "examine": "A camel who likes to rest.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2815", + "name": "Neferti the Camel", + "examine": "A camel who wants to see the world.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2825", + "name": "Pirate Pete", + "examine": "A shifty-looking character.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2826", + "name": "Pirate Pete", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2827", + "name": "Captain Braindeath", + "examine": "A shabby-looking leader.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2828", + "name": "50% Luke", + "examine": "Most of an angry", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2830", + "name": "Captain Donnie", + "examine": "I wonder if it was all the 'rum' that pickled him.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2831", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2832", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2833", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2834", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2835", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2836", + "name": "Zombie protester", + "examine": "Sticking it to 'The Man'.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2837", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2838", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2839", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2840", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2841", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2842", + "name": "Zombie pirate", + "examine": "An undead sea scoundrel.", + "lifepoints": "51", + "attack_level": "36", + "strength_level": "36", + "defence_level": "36", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2843", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2844", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2845", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2846", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5651", + "defence_animation": "0", + "death_animation": "5654", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2847", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2848", + "name": "Zombie swab", + "examine": "He talks a good fight.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "1", + "melee_animation": "5647", + "defence_animation": "0", + "death_animation": "5649", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "93", + "aggressive": "true", + "safespot": null + }, + { + "id": "2849", + "name": "Evil spirit", + "examine": "The pun was intended.", + "lifepoints": "57", + "attack_level": "40", + "strength_level": "40", + "defence_level": "40", + "range_level": "40", + "magic_level": "40", + "respawn_delay": "60", + "melee_animation": "2804", + "defence_animation": "0", + "death_animation": "2805", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "aggressive": "true", + "safespot": null + }, + { + "id": "2850", + "name": "Fever spider", + "examine": "A bunch of legs, eyes and teeth.", + "lifepoints": "40", + "attack_level": "60", + "strength_level": "30", + "defence_level": "40", + "range_level": "1", + "bonuses": "0,0,0,0,0,20,15,10,15,15,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "melee_animation": "5319", + "defence_animation": "0", + "death_animation": "5321", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "slayer_task": "76", + "slayer_exp": "40", + "combat_audio": "537,539,538", + "safespot": null + }, + { + "id": "2851", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2852", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2853", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2854", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2855", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2856", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2857", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2858", + "name": "Brewer", + "examine": "A worker in the brewery.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2863", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2866", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2869", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2878", + "name": "Zombie", + "lifepoints": "40", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "30", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "2880", + "name": "Dagannoth fledgeling", + "examine": "A knee-high horror from the ocean depths...", + "lifepoints": "74", + "attack_level": "52", + "strength_level": "52", + "defence_level": "52", + "range_level": "1", + "melee_animation": "1579", + "defence_animation": "0", + "death_animation": "1581", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "24", + "aggressive": "true", + "safespot": null + }, + { + "id": "2881", + "name": "Dagannoth Supreme", + "examine": "The Dagannoth King responsible for the death of Bukalla.", + "lifepoints": "255", + "attack_level": "255", + "strength_level": "255", + "defence_level": "128", + "range_level": "255", + "magic_level": "255", + "bonuses": "0,0,0,0,0,10,10,10,255,550,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "movement_radius": "8", + "agg_radius": "8", + "melee_animation": "2855", + "defence_animation": "2852", + "death_animation": "2856", + "projectile": "475", + "combat_style": "1", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "7134", + "name": "Bork", + "lifepoints": "300", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "8", + "agg_radius": "64", + "melee_animation": "8754", + "defence_animation": "8755", + "death_animation": "8756", + "aggressive": "true", + "safespot": null + }, + { + "id": "7135", + "name": "Ork legion", + "examine": "Aww, aren't they the cutest li - Argh!", + "lifepoints": "100", + "attack_level": "68", + "strength_level": "68", + "defence_level": "57", + "range_level": "68", + "bonuses": "5,10,3,5,3,5,5,5,10,0,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "60", + "melee_animation": "8760", + "defence_animation": "0", + "death_animation": "8761", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7137", + "name": "Dagon'hai Elite", + "examine": "A powerful wizard.", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "90", + "defence_level": "40", + "range_level": "1", + "magic_level": "90", + "bonuses": "220,190,140,120,120,130,90,120,120,200,100,154,150,93,190", + "attack_speed": "25", + "combat_style": "2", + "aggressive": "true", + "spell_id": "11", + "safespot": null + }, + { + "id": "7138", + "name": "Dagon'hai Monk", + "examine": "A monk of the Dagon'hai.", + "lifepoints": "88", + "attack_level": "84", + "strength_level": "84", + "defence_level": "80", + "range_level": "1", + "magic_level": "98", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7139", + "name": "Dagon'hai Monk", + "examine": "A monk of the Dagon'hai.", + "lifepoints": "88", + "attack_level": "84", + "strength_level": "84", + "defence_level": "80", + "range_level": "1", + "magic_level": "98", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7140", + "name": "Dagon'hai Monk", + "examine": "A monk of the Dagon'hai.", + "lifepoints": "88", + "attack_level": "84", + "strength_level": "84", + "defence_level": "80", + "range_level": "1", + "magic_level": "98", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "7141", + "name": "null", + "examine": "He seems to have gone mad.", + "lifepoints": "4", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "25", + "magic_level": "25", + "melee_animation": "426", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "426", + "weakness": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "7142", + "name": "Guard", + "examine": "He thumps people who cheat.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "7144", + "name": "Gublinch jailmate", + "examine": "An imprisoned gublinch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7145", + "name": "Gublinchette jailmate", + "examine": "An imprisoned gublinch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7146", + "name": "Gublinchette jailmate", + "examine": "An imprisoned gublinch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7147", + "name": "Gublinch jailmate", + "examine": "An imprisoned gublinch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7148", + "name": "Gublinch jailmate", + "examine": "An imprisoned gublinch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7149", + "name": "Gublinch jailmate", + "examine": "An imprisoned gublinch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7150", + "name": "Gublinch jailmate", + "examine": "An imprisoned gublinch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7152", + "name": "Student", + "examine": "A person sitting an exam.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7156", + "name": "Student", + "examine": "A person sitting an exam.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7157", + "name": "Student", + "examine": "A person sitting an exam.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0" + }, + { + "id": "2882", + "name": "Dagannoth Prime", + "examine": "A legendary Dagannoth King, rumoured to fly on the North winds.", + "lifepoints": "255", + "attack_level": "255", + "strength_level": "255", + "defence_level": "255", + "range_level": "1", + "magic_level": "255", + "bonuses": "0,0,0,0,0,255,255,255,255,10,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "movement_radius": "8", + "agg_radius": "8", + "melee_animation": "2854", + "defence_animation": "2852", + "death_animation": "2856", + "combat_style": "2", + "aggressive": "true", + "clue_level": "2", + "spell_id": "48", + "safespot": null + }, + { + "id": "2883", + "name": "Dagannoth Rex", + "examine": "Firstborn of the legendary Dagannoth Kings.", + "lifepoints": "255", + "attack_level": "255", + "strength_level": "255", + "defence_level": "255", + "range_level": "255", + "magic_level": "1", + "bonuses": "0,0,0,0,0,255,255,255,10,255,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "4", + "movement_radius": "8", + "agg_radius": "8", + "melee_animation": "2853", + "defence_animation": "2852", + "death_animation": "2856", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "2884", + "name": "Wallasalki", + "examine": "A fearsome magical creature from the deep..", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "2365", + "defence_animation": "2366", + "death_animation": "2367", + "magic_animation": "2365", + "slayer_exp": "0", + "combat_style": "2", + "aggressive": "true", + "spell_id": "48", + "safespot": null + }, + { + "id": "2885", + "name": "Giant Rock Crab", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "1312", + "defence_animation": "1313", + "death_animation": "1314", + "aggressive": "true", + "safespot": null + }, + { + "id": "2886", + "name": "Boulder", + "lifepoints": "240", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "safespot": null + }, + { + "id": "2887", + "name": "Dagannoth", + "lifepoints": "85", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "288", + "combat_style": "1", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2888", + "name": "Dagannoth", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "1343", + "defence_animation": "1340", + "death_animation": "1342", + "projectile": "288", + "combat_style": "1", + "aggressive": "true", + "clue_level": "1", + "safespot": null + }, + { + "id": "2889", + "name": "Rock lobster", + "examine": "It wasn't a rock... It was a rock lobster!", + "lifepoints": "150", + "attack_level": "80", + "strength_level": "135", + "defence_level": "70", + "range_level": "1", + "attack_speed": "8", + "melee_animation": "2860", + "defence_animation": "2861", + "death_animation": "2862", + "magic_animation": "2860", + "range_animation": "2860", + "weakness": "7", + "safespot": null + }, + { + "id": "2892", + "name": "Spinolyp", + "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "magic_level": "65", + "bonuses": "70,50,60,50,10,60,30,10,60,60,70,50,0,0,0", + "respawn_delay": "55", + "attack_speed": "6", + "agg_radius": "12", + "melee_animation": "2868", + "defence_animation": "2869", + "death_animation": "2866", + "magic_animation": "2866", + "range_animation": "2866", + "projectile": "294", + "slayer_exp": "0", + "combat_style": "2", + "aggressive": "true", + "spell_id": "14", + "safespot": null + }, + { + "id": "2894", + "name": "Spinolyp", + "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "10", + "defence_level": "1", + "range_level": "20", + "magic_level": "65", + "bonuses": "70,50,60,50,10,60,30,10,60,60,70,50,0,0,0", + "respawn_delay": "55", + "attack_speed": "6", + "agg_radius": "12", + "melee_animation": "2868", + "defence_animation": "2869", + "death_animation": "2866", + "magic_animation": "2866", + "range_animation": "2866", + "projectile": "294", + "combat_style": "2", + "aggressive": "true", + "spell_id": "14", + "safespot": null + }, + { + "id": "2896", + "name": "Spinolyp", + "examine": "A sneaky, spiny, subterranean sea-dwelling scamp.", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "60", + "defence_level": "1", + "range_level": "70", + "magic_level": "65", + "bonuses": "70,50,60,50,10,60,30,10,60,60,70,50,0,0,0", + "respawn_delay": "55", + "attack_speed": "6", + "agg_radius": "12", + "melee_animation": "2868", + "defence_animation": "2869", + "death_animation": "2866", + "magic_animation": "2866", + "range_animation": "2866", + "projectile": "294", + "slayer_exp": "0", + "combat_style": "2", + "aggressive": "true", + "spell_id": "14", + "safespot": null + }, + { + "id": "2919", + "name": "Agrith Naar", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "aggressive": "true", + "safespot": null + }, + { + "id": "2931", + "name": "Ghost", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "25", + "combat_audio": "436,439,438", + "safespot": null + }, + { + "id": "2941", + "name": "The Beast", + "examine": "Who ate all the rats?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2945", + "name": "Bones", + "examine": "Lovely", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2948", + "name": "Hooknosed Jack", + "examine": "Obviously punches above his weight.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2949", + "name": "Jimmy Dazzler", + "examine": "Looks rich like an actor of sorts.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2950", + "name": "The Face", + "examine": "Once beautiful", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2952", + "name": "Smokin' Joe", + "examine": "What is he?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2958", + "name": "Silver merchant", + "examine": "Looks fairly well fed.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2962", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2963", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2964", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2965", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2966", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2967", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2968", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2969", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2970", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2971", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2972", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2973", + "name": "Guard", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "1", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "2980", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2981", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2982", + "name": "King rat", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "2984", + "name": "Pusskins", + "examine": "Not a soft touch.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2986", + "name": "Captain Tom", + "examine": "A not-so friendly", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2988", + "name": "Mittens", + "examine": "A fully grown feline.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2990", + "name": "Topsy", + "examine": "Cute and fluffy.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "2997", + "name": "Gertrude's cat", + "examine": "A friendly feline?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "2998", + "name": "Gambler", + "examine": "Very well to do. I wonder what he's doing here.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3001", + "name": "Gambler", + "examine": "Rich.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3002", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3003", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3004", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3005", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3006", + "name": "Gambler", + "examine": "Poor.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3007", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3008", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3009", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3010", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3011", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3012", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3013", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3014", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3015", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3016", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3017", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3018", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3021", + "name": "Tool leprechaun", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3022", + "name": "Genie", + "examine": "Phenomenal cosmic powers", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3026", + "name": "Black golem", + "examine": "An animated clay statue.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2917", + "defence_animation": "0", + "death_animation": "2919", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "3027", + "name": "White golem", + "examine": "An animated clay statue.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "2917", + "defence_animation": "0", + "death_animation": "2919", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "aggressive": "true", + "safespot": null + }, + { + "id": "3028", + "name": "Grey golem", + "examine": "An animated clay statue.", + "lifepoints": "78", + "attack_level": "55", + "strength_level": "55", + "defence_level": "55", + "range_level": "1", + "melee_animation": "2917", + "defence_animation": "0", + "death_animation": "2919", + "magic_animation": "0", + "range_animation": "0", + "weakness": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "3029", + "name": "Ghaslor the Elder", + "examine": "The oldest man in Nardah.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3030", + "name": "Ali the Carter", + "examine": "A water salesman from Pollnivneach.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3040", + "name": "Awusah the Mayor", + "examine": "The Mayor of Nardah.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3042", + "name": "Poltenip", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "3043", + "name": "Radat", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "3044", + "name": "Shiratti the Custodian", + "examine": "Custodian of the shrine to Elidinis.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "3046", + "name": "Nardah Banker", + "examine": "A banker of Nardah.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3051", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3052", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3053", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3054", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3055", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3056", + "name": "Mystery figure", + "examine": "A mysterious watcher.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "3057", + "name": "Earth Warrior Champion", + "examine": "Champion of the earth warriors.", + "lifepoints": "72", + "attack_level": "51", + "strength_level": "51", + "defence_level": "51", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2951", + "defence_animation": "0", + "death_animation": "2946", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "3058", + "name": "Giant Champion", + "examine": "Champion of the giants.", + "lifepoints": "40", + "attack_level": "28", + "strength_level": "28", + "defence_level": "28", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6368", + "defence_animation": "0", + "death_animation": "6369", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "slayer_exp": "35", + "aggressive": "true", + "safespot": null + }, + { + "id": "3059", + "name": "Ghoul Champion", + "examine": "Champion of the ghouls.", + "lifepoints": "61", + "attack_level": "43", + "strength_level": "43", + "defence_level": "43", + "range_level": "43", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_exp": "50", + "aggressive": "true", + "safespot": null + }, + { + "id": "3060", + "name": "Goblin Champion", + "examine": "Champion of the goblins.", + "lifepoints": "17", + "attack_level": "6", + "strength_level": "6", + "defence_level": "12", + "range_level": "1", + "magic_level": "12", + "melee_animation": "6188", + "defence_animation": "0", + "death_animation": "6190", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3061", + "name": "Hobgoblin Champion", + "examine": "Champion of the hobgoblins.", + "lifepoints": "40", + "attack_level": "14", + "strength_level": "14", + "defence_level": "28", + "range_level": "28", + "respawn_delay": "60", + "defence_animation": "0", + "death_animation": "2958", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "combat_audio": "469,472,471", + "safespot": null + }, + { + "id": "3062", + "name": "Imp Champion", + "examine": "Champion of the imps.", + "lifepoints": "10", + "attack_level": "7", + "strength_level": "7", + "defence_level": "7", + "range_level": "7", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5285", + "defence_animation": "0", + "death_animation": "172", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "3063", + "name": "Jogre Champion", + "examine": "Champion of the jogres.", + "lifepoints": "77", + "attack_level": "54", + "strength_level": "54", + "defence_level": "54", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "2100", + "defence_animation": "0", + "death_animation": "8576", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "poisonous": "true", + "aggressive": "true", + "safespot": null + }, + { + "id": "3064", + "name": "Lesser Demon Champion", + "examine": "Champion of the lesser demons.", + "lifepoints": "115", + "attack_level": "1", + "strength_level": "1", + "defence_level": "81", + "range_level": "1", + "magic_level": "81", + "respawn_delay": "60", + "melee_animation": "64", + "defence_animation": "65", + "death_animation": "67", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_exp": "79", + "aggressive": "true", + "combat_audio": "400,404,403", + "safespot": null + }, + { + "id": "3065", + "name": "Skeleton Champion", + "examine": "Champion of the skeletons.", + "lifepoints": "28", + "attack_level": "10", + "strength_level": "10", + "defence_level": "20", + "range_level": "20", + "respawn_delay": "60", + "melee_animation": "5512", + "defence_animation": "0", + "death_animation": "5514", + "magic_animation": "0", + "range_animation": "0", + "weakness": "2", + "combat_style": "1", + "aggressive": "true", + "combat_audio": "774,775,777", + "safespot": null + }, + { + "id": "3066", + "name": "Zombies Champion", + "examine": "Champion of the zombies.", + "lifepoints": "37", + "attack_level": "26", + "strength_level": "26", + "defence_level": "26", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "5581", + "defence_animation": "0", + "death_animation": "5575", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "aggressive": "true", + "safespot": null + }, + { + "id": "3067", + "name": "Leon d'Cour", + "lifepoints": "123", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "7049", + "defence_animation": "7050", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "3068", + "name": "Skeletal Wyvern", + "examine": "A very dangerous pile of animated Wyvern bones.", + "lifepoints": "200", + "attack_level": "125", + "strength_level": "116", + "defence_level": "120", + "range_level": "120", + "magic_level": "125", + "bonuses": "0,0,0,0,0,140,90,90,80,140,0,0,0,0,0", + "attack_speed": "6", + "agg_radius": "6", + "melee_animation": "2985", + "defence_animation": "2983", + "death_animation": "2987", + "magic_animation": "2985", + "range_animation": "2989", + "start_gfx": "499", + "projectile": "500", + "end_gfx": "501", + "weakness": "9", + "slayer_task": "95", + "slayer_exp": "210", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "3069", + "name": "Skeletal Wyvern", + "examine": "A very dangerous pile of animated Wyvern bones.", + "lifepoints": "200", + "attack_level": "125", + "strength_level": "116", + "defence_level": "120", + "range_level": "120", + "magic_level": "125", + "bonuses": "0,0,0,0,0,140,90,90,80,140,0,0,0,0,0", + "attack_speed": "6", + "agg_radius": "6", + "melee_animation": "2985", + "defence_animation": "2983", + "death_animation": "2987", + "magic_animation": "2985", + "range_animation": "2989", + "start_gfx": "499", + "projectile": "500", + "end_gfx": "501", + "weakness": "9", + "slayer_task": "95", + "slayer_exp": "210", + "aggressive": "true", + "clue_level": "2", + "safespot": null + }, + { + "id": "7158", + "name": "Cockroach drone", + "examine": "A household pest.", + "lifepoints": "4", + "attack_level": "3", + "strength_level": "3", + "defence_level": "3", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8785", + "defence_animation": "0", + "death_animation": "8788", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "7159", + "name": "Cockroach worker", + "examine": "Eurgh! A big bug.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "70", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8787", + "defence_animation": "0", + "death_animation": "8790", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "7160", + "name": "Cockroach soldier", + "examine": "Euww! A giant bug.", + "lifepoints": "97", + "attack_level": "38", + "strength_level": "26", + "defence_level": "70", + "range_level": "1", + "bonuses": "10,10,10,5,0,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8786", + "defence_animation": "0", + "death_animation": "8789", + "magic_animation": "0", + "range_animation": "0", + "weakness": "8", + "safespot": null + }, + { + "id": "7161", + "name": "Mugger", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "7162", + "name": "Mugger", + "lifepoints": "8", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "422", + "defence_animation": "425", + "death_animation": "836", + "aggressive": "true", + "safespot": null + }, + { + "id": "7202", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "4933", + "range_animation": "4933", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "7204", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "4933", + "range_animation": "4933", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "7206", + "name": "Cockroach", + "examine": "It seems to have eaten a lot of chocolate.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7207", + "name": "Spider", + "examine": "It's searching for crumbs of chocolate.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7209", + "name": "Snail", + "examine": "It seems to have eaten a lot of chocolate.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7210", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7211", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7212", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7213", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7214", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7215", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7216", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7217", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7218", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7219", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7220", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7221", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7222", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7223", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7224", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7225", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7226", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7227", + "name": "Monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7228", + "name": "Baby monkey", + "examine": "It's a tiny", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7229", + "name": "Baby monkey", + "examine": "It's a tiny", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7230", + "name": "Baby monkey", + "examine": "It's a tiny", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7231", + "name": "Baby monkey", + "examine": "It's a tiny", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7232", + "name": "Baby monkey", + "examine": "It's a tiny", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7233", + "name": "Baby monkey", + "examine": "It's a tiny", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7234", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7235", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7236", + "name": "Baby monkey", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "629,631,630", + "safespot": null + }, + { + "id": "7275", + "name": "Baby Raccoon", + "examine": "A stripy little baby raccoon.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7285", + "name": "Baby gecko", + "examine": "It's so adorably tiny!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7329", + "name": "Swamp titan", + "lifepoints": "556", + "attack_level": "1", + "strength_level": "1", + "defence_level": "78", + "range_level": "70", + "magic_level": "70", + "bonuses": "60,60,60,60,50,50,100,200,200,28,100,100,70,70,70", + "respawn_delay": "0", + "melee_animation": "8222", + "defence_animation": "8224", + "death_animation": "8226", + "combat_style": "1", + "safespot": null + }, + { + "id": "7330", + "name": "Swamp titan", + "examine": "Do you hear duelling banjos?", + "lifepoints": "117", + "attack_level": "60", + "strength_level": "60", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "bonuses": "60,60,60,60,50,50,100,200,200,28,100,100,70,70,70", + "respawn_delay": "0", + "melee_animation": "8222", + "defence_animation": "0", + "death_animation": "8226", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "7331", + "name": "Spirit mosquito", + "examine": "It buzzes and bites. Nasty.", + "lifepoints": "43", + "attack_level": "28", + "strength_level": "24", + "defence_level": "25", + "range_level": "25", + "magic_level": "21", + "bonuses": "45,49,42,39,47,46,29,43,51,16,53,10,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "melee_animation": "8032", + "defence_animation": "8034", + "death_animation": "8033", + "magic_animation": "8032", + "range_animation": "8032", + "safespot": null + }, + { + "id": "7332", + "name": "Spirit mosquito", + "examine": "It buzzes and bites. Nasty.", + "lifepoints": "43", + "attack_level": "28", + "strength_level": "24", + "defence_level": "25", + "range_level": "25", + "magic_level": "21", + "bonuses": "45,49,42,39,47,46,29,43,51,16,53,10,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "melee_animation": "8032", + "defence_animation": "8034", + "death_animation": "8033", + "magic_animation": "8032", + "range_animation": "8032", + "weakness": "10", + "safespot": null + }, + { + "id": "7334", + "name": "Void spinner", + "examine": "It spins.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "34", + "magic_level": "34", + "melee_animation": "8172", + "defence_animation": "0", + "death_animation": "8176", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7335", + "name": "Forge regent", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7863", + "defence_animation": "7865", + "death_animation": "7864", + "safespot": null + }, + { + "id": "7336", + "name": "Forge regent", + "examine": "This one will burn right through the net!", + "lifepoints": "108", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "respawn_delay": "0", + "melee_animation": "7863", + "defence_animation": "0", + "death_animation": "7864", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7337", + "name": "Spirit larupia", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "5228", + "defence_animation": "5227", + "death_animation": "5230", + "safespot": null + }, + { + "id": "7338", + "name": "Spirit larupia", + "examine": "Fast cat is fast.", + "lifepoints": "81", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "respawn_delay": "0", + "melee_animation": "5228", + "defence_animation": "0", + "death_animation": "5230", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7339", + "name": "Geyser titan", + "examine": "It'll kill your enemies, and makes a great cup of tea.", + "lifepoints": "620", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "115,115,115,110,110,102,95,110,110,105,78,120,115,120,120", + "poison_immune": "true", + "respawn_delay": "50", + "melee_animation": "7879", + "defence_animation": "7878", + "death_animation": "7880", + "magic_animation": "422", + "range_animation": "422", + "weakness": "0", + "safespot": null + }, + { + "id": "7340", + "name": "Geyser titan", + "examine": "It'll kill your enemies, and makes a great cup of tea.", + "lifepoints": "620", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "115,115,115,110,110,102,95,110,110,105,78,120,115,120,120", + "poison_immune": "true", + "respawn_delay": "50", + "melee_animation": "7879", + "defence_animation": "7878", + "death_animation": "7880", + "magic_animation": "422", + "range_animation": "422", + "weakness": "0", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7341", + "name": "Lava titan", + "lifepoints": "528", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "bonuses": "100,120,90,100,90,90,40,50,0,0,0,0,0,0,0", + "respawn_delay": "0", + "melee_animation": "7980", + "defence_animation": "7981", + "death_animation": "7692", + "combat_style": "1", + "safespot": null + }, + { + "id": "7342", + "name": "Lava titan", + "examine": "Made of lava.", + "lifepoints": "115", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "bonuses": "100,120,90,100,90,90,40,50,0,0,0,0,0,0,0", + "respawn_delay": "0", + "melee_animation": "7980", + "defence_animation": "0", + "death_animation": "7979", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "7343", + "name": "Steel titan", + "examine": "The King of the Titans!", + "lifepoints": "750", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "105,105,105,100,110,102,95,110,110,105,78,120,115,120,120", + "poison_immune": "true", + "respawn_delay": "15", + "melee_animation": "8183", + "defence_animation": "8185", + "death_animation": "8184", + "magic_animation": "8183", + "range_animation": "8183", + "weakness": "10", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7344", + "name": "Steel titan", + "examine": "The King of the Titans!", + "lifepoints": "750", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "bonuses": "105,105,105,100,110,102,95,110,110,105,78,120,115,120,120", + "poison_immune": "true", + "respawn_delay": "15", + "melee_animation": "8183", + "defence_animation": "8185", + "death_animation": "8184", + "magic_animation": "8183", + "range_animation": "8183", + "weakness": "10", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7345", + "name": "Obsidian golem", + "examine": "Four fists can make quite an impression IN someone...", + "lifepoints": "10", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "bonuses": "100,120,90,100,90,90,40,50,0,0,0,0,0,0,0", + "respawn_delay": "0", + "melee_animation": "8050", + "defence_animation": "8051", + "death_animation": "8052", + "safespot": null + }, + { + "id": "7346", + "name": "Obsidian golem", + "examine": "Four fists can make quite an impression IN someone...", + "lifepoints": "104", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "bonuses": "100,120,90,100,90,90,40,50,0,0,0,0,0,0,0", + "respawn_delay": "0", + "melee_animation": "8050", + "defence_animation": "0", + "death_animation": "8052", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7347", + "name": "Talon beast", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "5989", + "defence_animation": "5988", + "death_animation": "5990", + "safespot": null + }, + { + "id": "7348", + "name": "Talon beast", + "examine": "If a normal black cat is bad luck", + "lifepoints": "110", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "respawn_delay": "0", + "melee_animation": "5989", + "defence_animation": "0", + "death_animation": "5990", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7349", + "name": "Abyssal titan", + "lifepoints": "667", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7693", + "defence_animation": "7691", + "death_animation": "7979", + "safespot": null + }, + { + "id": "7350", + "name": "Abyssal titan", + "examine": "Big", + "lifepoints": "125", + "attack_level": "70", + "strength_level": "70", + "defence_level": "70", + "range_level": "70", + "magic_level": "70", + "respawn_delay": "0", + "melee_animation": "7693", + "defence_animation": "0", + "death_animation": "7692", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7352", + "name": "Void torcher", + "examine": "It torches.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "34", + "magic_level": "34", + "melee_animation": "8235", + "defence_animation": "0", + "death_animation": "8236", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7353", + "name": "Giant chinchompa", + "lifepoints": "1", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7755", + "defence_animation": "7753", + "death_animation": "7758", + "safespot": null + }, + { + "id": "7354", + "name": "Giant chinchompa", + "examine": "Looks a little...volatile.", + "lifepoints": "41", + "attack_level": "29", + "strength_level": "29", + "defence_level": "29", + "range_level": "29", + "magic_level": "29", + "respawn_delay": "0", + "melee_animation": "7755", + "defence_animation": "0", + "death_animation": "7758", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7355", + "name": "Fire titan", + "examine": "Scorching!", + "lifepoints": "476", + "attack_level": "40", + "strength_level": "30", + "defence_level": "40", + "range_level": "30", + "magic_level": "40", + "bonuses": "64,45,76,82,120,84,140,120,106,89,113,80,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "melee_animation": "7834", + "defence_animation": "7832", + "death_animation": "7833", + "magic_animation": "7834", + "range_animation": "7834", + "weakness": "10", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7356", + "name": "Fire titan", + "examine": "Scorching!", + "lifepoints": "476", + "attack_level": "40", + "strength_level": "30", + "defence_level": "40", + "range_level": "30", + "magic_level": "40", + "bonuses": "64,45,76,82,208,84,221,231,179,89,113,23,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "melee_animation": "7834", + "defence_animation": "7832", + "death_animation": "7833", + "magic_animation": "7834", + "range_animation": "7834", + "weakness": "10", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7357", + "name": "Moss titan", + "examine": "Gathers rolling stones to bash people with.", + "lifepoints": "476", + "attack_level": "40", + "strength_level": "30", + "defence_level": "40", + "range_level": "30", + "magic_level": "40", + "bonuses": "64,45,76,82,120,84,140,120,106,89,113,80,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "melee_animation": "7844", + "defence_animation": "7832", + "death_animation": "7843", + "magic_animation": "7834", + "range_animation": "7834", + "weakness": "10", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7358", + "name": "Moss titan", + "examine": "Gathers rolling stones to bash people with.", + "lifepoints": "476", + "attack_level": "40", + "strength_level": "30", + "defence_level": "40", + "range_level": "30", + "magic_level": "40", + "bonuses": "64,45,76,82,120,84,140,120,106,89,113,80,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "melee_animation": "7844", + "defence_animation": "7832", + "death_animation": "7843", + "magic_animation": "7834", + "range_animation": "7834", + "weakness": "10", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7359", + "name": "Ice titan", + "examine": "Frosty the highly violent snowman.", + "lifepoints": "476", + "attack_level": "40", + "strength_level": "30", + "defence_level": "40", + "range_level": "30", + "magic_level": "40", + "bonuses": "64,45,76,82,120,84,140,120,106,89,113,80,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "melee_animation": "7845", + "defence_animation": "7832", + "death_animation": "7846", + "magic_animation": "7834", + "range_animation": "7834", + "weakness": "10", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7360", + "name": "Ice titan", + "examine": "Frosty the highly violent snowman.", + "lifepoints": "476", + "attack_level": "40", + "strength_level": "30", + "defence_level": "40", + "range_level": "30", + "magic_level": "40", + "bonuses": "64,45,76,82,120,84,140,120,106,89,113,80,0,0,0", + "poison_immune": "true", + "respawn_delay": "50", + "attack_speed": "5", + "melee_animation": "7845", + "defence_animation": "7832", + "death_animation": "7846", + "magic_animation": "7834", + "range_animation": "7834", + "weakness": "10", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7361", + "name": "Spirit Tz-Kih", + "lifepoints": "62", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "attack_speed": "3", + "melee_animation": "8257", + "defence_animation": "8256", + "death_animation": "8258", + "combat_style": "1", + "safespot": null + }, + { + "id": "7362", + "name": "Spirit Tz-Kih", + "examine": "This bat burned down the belfry.", + "lifepoints": "31", + "attack_level": "22", + "strength_level": "22", + "defence_level": "22", + "range_level": "22", + "magic_level": "22", + "respawn_delay": "0", + "attack_speed": "3", + "melee_animation": "8257", + "defence_animation": "0", + "death_animation": "8258", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "7363", + "name": "Spirit graahk", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "5228", + "defence_animation": "5227", + "death_animation": "5230", + "start_gfx": "1367", + "safespot": null + }, + { + "id": "7364", + "name": "Spirit graahk", + "examine": "Those spikes are pretty big!", + "lifepoints": "81", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "respawn_delay": "0", + "melee_animation": "5229", + "defence_animation": "0", + "death_animation": "5230", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "1367", + "weakness": "10", + "safespot": null + }, + { + "id": "7365", + "name": "Spirit kyatt", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "5228", + "defence_animation": "5227", + "death_animation": "5230", + "start_gfx": "1365", + "safespot": null + }, + { + "id": "7366", + "name": "Spirit kyatt", + "examine": "Those teeth are pretty big!", + "lifepoints": "81", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "magic_level": "50", + "respawn_delay": "0", + "melee_animation": "5228", + "defence_animation": "0", + "death_animation": "5230", + "magic_animation": "0", + "range_animation": "0", + "start_gfx": "1365", + "weakness": "10", + "safespot": null + }, + { + "id": "7368", + "name": "Void shifter", + "examine": "It shifts.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "34", + "magic_level": "34", + "melee_animation": "8131", + "defence_animation": "0", + "death_animation": "8133", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7371", + "name": "Void ravager", + "examine": "It ravages.", + "lifepoints": "48", + "attack_level": "34", + "strength_level": "34", + "defence_level": "34", + "range_level": "34", + "magic_level": "34", + "melee_animation": "8086", + "defence_animation": "0", + "death_animation": "8087", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7373", + "name": "Ravenous locust", + "examine": "It's like a little stomach on wings.", + "lifepoints": "100", + "attack_level": "60", + "strength_level": "60", + "defence_level": "60", + "range_level": "60", + "magic_level": "60", + "respawn_delay": "0", + "melee_animation": "7994", + "defence_animation": "0", + "death_animation": "7996", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7374", + "name": "Ravenous locust", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "0", + "melee_animation": "7994", + "defence_animation": "7995", + "death_animation": "7996", + "safespot": null + }, + { + "id": "7375", + "name": "Iron titan", + "examine": "He is an iron man!", + "lifepoints": "694", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "bonuses": "120,130,100,109,80,120,102,90,103,80,100,108,105,66,90", + "respawn_delay": "0", + "melee_animation": "7946", + "defence_animation": "7948", + "death_animation": "7947", + "weakness": "10", + "combat_style": "1", + "safespot": null + }, + { + "id": "7376", + "name": "Iron titan", + "examine": "He is an iron man!", + "lifepoints": "694", + "attack_level": "65", + "strength_level": "65", + "defence_level": "65", + "range_level": "65", + "magic_level": "65", + "bonuses": "120,130,100,109,80,120,102,90,103,80,100,108,105,66,90", + "respawn_delay": "0", + "melee_animation": "7946", + "defence_animation": "7948", + "death_animation": "7947", + "weakness": "10", + "slayer_exp": "0", + "combat_style": "1", + "combat_audio": "0,0,0", + "safespot": null + }, + { + "id": "7378", + "name": "Pyrelord", + "examine": "Where did I put the marshmallows?", + "lifepoints": "65", + "attack_level": "46", + "strength_level": "46", + "defence_level": "46", + "range_level": "46", + "magic_level": "46", + "melee_animation": "8080", + "defence_animation": "0", + "death_animation": "8078", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7379", + "name": "Elfinlocks", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8965", + "defence_animation": "8966", + "death_animation": "8967", + "aggressive": "true", + "safespot": null + }, + { + "id": "7380", + "name": "Missi Sissi", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "8965", + "defence_animation": "8966", + "death_animation": "8967", + "aggressive": "true", + "safespot": null + }, + { + "id": "7381", + "name": "Missi Sissi", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8955", + "defence_animation": "8957", + "death_animation": "8956", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "7382", + "name": "Uberlass", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8955", + "defence_animation": "8957", + "death_animation": "8956", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "7398", + "name": "Elisabeta", + "examine": "The vengeful spirit of one who died within Daemonheim.", + "lifepoints": "7", + "attack_level": "25", + "strength_level": "25", + "defence_level": "25", + "range_level": "25", + "magic_level": "25", + "melee_animation": "0", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "3", + "aggressive": "true", + "safespot": null + }, + { + "id": "7417", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "2", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "2705", + "defence_animation": "2706", + "death_animation": "2707", + "magic_animation": "2705", + "range_animation": "2705", + "combat_audio": "3102,3104,3103", + "safespot": null + }, + { + "id": "7425", + "name": "Wigglewoo", + "examine": "An impling manager: what a terrifying thought!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7426", + "name": "Orangeowns", + "examine": "This worker looks after the incubator.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7438", + "name": "Elf warrior", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "7439", + "name": "Elf warrior", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "7440", + "name": "Elf warrior", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "7441", + "name": "Elf warrior", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "clue_level": "2", + "safespot": null + }, + { + "id": "7443", + "name": "Eudav", + "examine": "He holds up passers by.", + "lifepoints": "11", + "attack_level": "8", + "strength_level": "8", + "defence_level": "8", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "386", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "7", + "aggressive": "true", + "safespot": null + }, + { + "id": "7459", + "name": "Fairtrade", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "safespot": null + }, + { + "id": "7460", + "name": "Teapotspout", + "lifepoints": "75", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "safespot": null + }, + { + "id": "7461", + "name": "Rat", + "examine": "A popular dwarven delicacy.", + "lifepoints": "5", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "attack_speed": "5", + "melee_animation": "4933", + "defence_animation": "4934", + "death_animation": "4935", + "magic_animation": "4933", + "range_animation": "4933", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "7462", + "name": "Hotwater", + "examine": "It's bubbling, gross.", + "lifepoints": "120", + "attack_level": "99", + "strength_level": "99", + "defence_level": "99", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,45,20,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "9130", + "defence_animation": "9132", + "death_animation": "9131", + "magic_animation": "9130", + "range_animation": "9130", + "safespot": null + }, + { + "id": "7463", + "name": "Hotwater", + "examine": "It's bubbling, gross.", + "lifepoints": "120", + "attack_level": "99", + "strength_level": "99", + "defence_level": "99", + "range_level": "1", + "bonuses": "20,20,20,20,20,20,20,20,20,20,20,20,45,20,0", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "9130", + "defence_animation": "9132", + "death_animation": "9131", + "magic_animation": "9130", + "range_animation": "9130", + "safespot": null + }, + { + "id": "7475", + "name": "Lady Seenit", + "examine": "His usual sunny disposition is not in evidence.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "30", + "magic_level": "30", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "10", + "safespot": null + }, + { + "id": "7476", + "name": "Berrybree", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "safespot": null + }, + { + "id": "7477", + "name": "Stuffstuffer", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "safespot": null + }, + { + "id": "7479", + "name": "Learking", + "lifepoints": "60", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "safespot": null + }, + { + "id": "7480", + "name": "Rachael", + "lifepoints": "70", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "safespot": null + }, + { + "id": "7481", + "name": "Cool Mom227", + "examine": "You clearly can't live on treasure alone.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "safespot": null + }, + { + "id": "7482", + "name": "Purepker895", + "examine": "A testament to the effect of greed.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "safespot": null + }, + { + "id": "7483", + "name": "Pkmaster0036", + "examine": "He wanted loot", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "safespot": null + }, + { + "id": "7484", + "name": "Cow1337killr", + "examine": "Eternally looking for that big payday.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "safespot": null + }, + { + "id": "7485", + "name": "Mathdude", + "examine": "No more tea-breaks for this one.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "safespot": null + }, + { + "id": "7486", + "name": "Mathdude", + "examine": "Even in death you can smell his feet.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "safespot": null + }, + { + "id": "7487", + "name": "1337sp34kr", + "examine": "An anatomist's dream.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "safespot": null + }, + { + "id": "7488", + "name": "1337sp34kr", + "examine": "A hand seems to be gripping his spine through his chest. Ouch.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "defence_animation": "0", + "death_animation": "5491", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "75", + "safespot": null + }, + { + "id": "7492", + "name": "Sarah Domin", + "examine": "A desert dweller taken to banditry.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "9705", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "7493", + "name": "Sarah Domin", + "examine": "Calls himself an archaeologist.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "9715", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "7494", + "name": "Sue Spammers", + "examine": "He hasn't found much of use", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "9705", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "7495", + "name": "Killerwail", + "examine": "An amateur historian with added greed.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "9715", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "7496", + "name": "Wise Old Man", + "examine": "It all started with her love of genealogy.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "melee_animation": "9705", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "7497", + "name": "Sabre-toothed kyatt", + "examine": "A rocky horror.", + "lifepoints": "38", + "attack_level": "27", + "strength_level": "27", + "defence_level": "27", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "safespot": null + }, + { + "id": "7500", + "name": "Cerulean twitch", + "examine": "This dung beetle has mistaken you for its staple diet.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "7501", + "name": "Abone", + "examine": "It's looking unwell - probably something it ate.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "7502", + "name": "Mythmaster", + "examine": "Once a valuable contributor to the ecosystem.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "7503", + "name": "Donkey Wrong", + "examine": "This is what happens if you play with your food.", + "lifepoints": "42", + "attack_level": "30", + "strength_level": "30", + "defence_level": "30", + "range_level": "1", + "respawn_delay": "60", + "defence_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "slayer_task": "70", + "aggressive": "true", + "safespot": null + }, + { + "id": "7504", + "name": "Creapantic", + "examine": "He likes a good fight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7505", + "name": "Frondlike", + "examine": "He likes a good fight", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7506", + "name": "Happy Spud", + "examine": "His favourite must be winning.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7507", + "name": "Nobodyhere", + "examine": "Blood-thirsty and enthusiastic.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7508", + "name": "Bluehairlass", + "examine": "Probably discussing the strengths and weaknesses of the fighting slaves.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7510", + "name": "Ilikekebabs", + "examine": "His favourite must be winning.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7511", + "name": "Trunka Lex", + "examine": "His favourite must be winning.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7512", + "name": "Val Razz", + "examine": "Probably discussing the strengths and weaknesses of the fighting slaves.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7513", + "name": "Abstractclas", + "examine": "Probably discussing the strengths and weaknesses of the fighting slaves.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7514", + "name": "Bigbluebox", + "examine": "Bloodthirsty and enthusiastic.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7515", + "name": "Funorbrox", + "examine": "Bloodthirsty and enthusiastic.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7518", + "name": "Morrisnorris", + "examine": "He's asleep.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7519", + "name": "Matt Blitzer", + "examine": "He's propping the bar up. Or is it the other way round?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7520", + "name": "Ketchuppl0x", + "examine": "He demands to have some booze.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7528", + "name": "Redheadmonky", + "lifepoints": "22", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "395", + "defence_animation": "425", + "death_animation": "836", + "safespot": null + }, + { + "id": "7532", + "name": "3sacrowd", + "examine": "It's an NPC.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "slayer_exp": "0", + "safespot": null + }, + { + "id": "7551", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "90", + "range_level": "1", + "magic_level": "70", + "bonuses": "200,200,200,100,100,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "90", + "safespot": null + }, + { + "id": "7552", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "90", + "range_level": "1", + "magic_level": "50", + "bonuses": "200,200,200,200,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "7553", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "90", + "range_level": "1", + "magic_level": "90", + "bonuses": "200,200,100,200,100,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "7554", + "name": "Portal", + "examine": "Not somewhere I want to go...", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "90", + "range_level": "1", + "magic_level": "90", + "bonuses": "100,100,200,200,100,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7555", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "bonuses": "100,100,100,50,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "7556", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "15", + "bonuses": "100,100,100,100,25,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "safespot": null + }, + { + "id": "7557", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "bonuses": "100,100,50,100,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7558", + "name": "Portal", + "examine": "The Void Knight will soon weaken the shield.", + "lifepoints": "250", + "attack_level": "1", + "strength_level": "1", + "defence_level": "30", + "range_level": "1", + "magic_level": "30", + "bonuses": "50,50,100,100,50,0,0,0,0,0,0,0,0,0,0", + "respawn_delay": "125", + "attack_speed": "5", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7559", + "name": "Brawler", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7560", + "name": "Lostme", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7561", + "name": "Chiercat", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7562", + "name": "Skydischarge", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7563", + "name": "Agplus", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7564", + "name": "Distantthin", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7565", + "name": "Allmarshes", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7566", + "name": "Explosive67", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7569", + "name": "Alpha1beta", + "examine": "Looks after your Farming tools.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7570", + "name": "Solltalk", + "examine": "Enjoys locking up animals in small pens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7571", + "name": "Hm Val", + "examine": "Enjoys locking up animals in small pens.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7572", + "name": "Wizzydumped", + "examine": "He looks like the type of guy who would mind monkeys.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7573", + "name": "Oddskater", + "examine": "He looks like the type of guy who would mind monkeys.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7580", + "name": "Poledragon", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "combat_audio": "408,410,409", + "safespot": null + }, + { + "id": "7582", + "name": "Al Truism", + "examine": "He likes inflicting pain.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7583", + "name": "Ohhhhdude", + "examine": "The Don of penguins.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7585", + "name": "Torcher", + "examine": "A penguin pushing paper", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7586", + "name": "Torcher", + "examine": "A penguin pushing paper", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7593", + "name": "Shifter", + "examine": "He's a little rough around the edges.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7605", + "name": "Banker", + "examine": "He has unbelievable strength!", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7606", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7607", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7608", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7609", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7614", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7615", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7616", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7617", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7618", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7619", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7620", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7621", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7626", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7627", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7628", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7629", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7631", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7632", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7634", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7635", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7640", + "name": "Skeletal hand", + "examine": "Ew it's still alive.", + "lifepoints": "90", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "1", + "bonuses": "15,15,15,15,15,15,15,15,15,15,15,15,15,15,15", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "9125", + "defence_animation": "9127", + "death_animation": "9126", + "magic_animation": "9125", + "range_animation": "9125", + "weakness": "9", + "slayer_task": "21", + "aggressive": "true", + "safespot": null + }, + { + "id": "7641", + "name": "Zombie hand", + "examine": "Ew it's still alive.", + "lifepoints": "90", + "attack_level": "75", + "strength_level": "75", + "defence_level": "75", + "range_level": "1", + "bonuses": "15,15,15,15,15,15,15,15,15,15,15,15,15,15,15", + "respawn_delay": "20", + "attack_speed": "5", + "melee_animation": "9125", + "defence_animation": "9127", + "death_animation": "9126", + "magic_animation": "9125", + "range_animation": "9125", + "weakness": "9", + "slayer_task": "21", + "aggressive": "true", + "safespot": null + }, + { + "id": "7642", + "name": "Mutated bloodveld", + "examine": "A bloodveld with a very mixed heritage.", + "lifepoints": "112", + "attack_level": "56", + "strength_level": "56", + "defence_level": "56", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9102", + "defence_animation": "0", + "death_animation": "9131", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "10", + "slayer_exp": "206", + "aggressive": "true", + "safespot": null + }, + { + "id": "7643", + "name": "Mutated bloodveld", + "examine": "A bloodveld with a very mixed heritage.", + "lifepoints": "116", + "attack_level": "58", + "strength_level": "58", + "defence_level": "58", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "9102", + "defence_animation": "0", + "death_animation": "9131", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "10", + "slayer_exp": "206", + "aggressive": "true", + "safespot": null + }, + { + "id": "7644", + "name": "Zaromark Sliver", + "lifepoints": "88", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7645", + "name": "Zaromark Sliver", + "lifepoints": "88", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7646", + "name": "Zaromark Sliver", + "lifepoints": "88", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7647", + "name": "Zaromark Sliver", + "lifepoints": "88", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7648", + "name": "Zaromark Sliver", + "lifepoints": "88", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7649", + "name": "Zaromark Sliver", + "lifepoints": "88", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7650", + "name": "Zaromark Sliver", + "lifepoints": "88", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7651", + "name": "Zaromark Sliver", + "lifepoints": "88", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7654", + "name": "Fistandantilus", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7655", + "name": "Fistandantilus", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7656", + "name": "Fistandantilus", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7657", + "name": "Fistandantilus", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7658", + "name": "Fistandantilus", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7659", + "name": "Fistandantilus", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7660", + "name": "Fistandantilus", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7661", + "name": "Fistandantilus", + "lifepoints": "65", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "aggressive": "true", + "safespot": null + }, + { + "id": "7682", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7683", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7691", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7692", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7693", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7694", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7695", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7696", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7697", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7698", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7699", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7700", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7701", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7702", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7703", + "name": "Vyrewatch", + "lifepoints": "95", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7704", + "name": "Vyrewatch", + "lifepoints": "105", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7705", + "name": "Vyrewatch", + "lifepoints": "120", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7706", + "name": "Vyrewatch", + "lifepoints": "130", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7711", + "name": "Temple guardian", + "examine": "Looks like a big ugly dog.", + "lifepoints": "34", + "attack_level": "24", + "strength_level": "24", + "defence_level": "24", + "range_level": "1", + "respawn_delay": "60", + "melee_animation": "6565", + "defence_animation": "0", + "death_animation": "6564", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "slayer_task": "27", + "safespot": null + }, + { + "id": "7713", + "name": "Baby icefiend", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8080", + "defence_animation": "8084", + "death_animation": "8078", + "aggressive": "true", + "safespot": null + }, + { + "id": "7714", + "name": "Icefiend", + "examine": "A small ice demon.", + "lifepoints": "35", + "attack_level": "1", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "magic_level": "25", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8080", + "defence_animation": "0", + "death_animation": "8078", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "46", + "aggressive": "true", + "clue_level": "0", + "safespot": null + }, + { + "id": "7715", + "name": "Icefiend", + "examine": "The icefiend seems to be melting.", + "lifepoints": "35", + "attack_level": "1", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "magic_level": "25", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8080", + "defence_animation": "0", + "death_animation": "8078", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "46", + "aggressive": "true", + "clue_level": "0", + "safespot": null + }, + { + "id": "7716", + "name": "null", + "examine": "The icefiend seems to be melting.", + "lifepoints": "35", + "attack_level": "1", + "strength_level": "1", + "defence_level": "25", + "range_level": "1", + "magic_level": "25", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8080", + "defence_animation": "0", + "death_animation": "8078", + "magic_animation": "0", + "range_animation": "0", + "weakness": "5", + "slayer_task": "46", + "aggressive": "true", + "safespot": null + }, + { + "id": "7727", + "name": "Monk", + "examine": "A holy man.", + "lifepoints": "17", + "attack_level": "12", + "strength_level": "12", + "defence_level": "12", + "range_level": "1", + "melee_animation": "422", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "9", + "combat_audio": "511,513,512", + "safespot": null + }, + { + "id": "7736", + "name": "Baby icefiend", + "lifepoints": "50", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "5", + "melee_animation": "8080", + "defence_animation": "8084", + "death_animation": "8078", + "aggressive": "true", + "safespot": null + }, + { + "id": "7740", + "name": "Jiggling crate", + "examine": "Is it full of rats?", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "combat_audio": "703,705,704", + "safespot": null + }, + { + "id": "7741", + "name": "Three little kittens", + "examine": "A warrior who has been long forgotten.", + "lifepoints": "5", + "attack_level": "30", + "strength_level": "30", + "defence_level": "25", + "range_level": "25", + "magic_level": "25", + "defence_animation": "0", + "death_animation": "836", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7747", + "name": "TzHaar-Xil-Tog", + "examine": "It looks upset.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7752", + "name": "TzHaar-Mej-Lor", + "examine": "A TzHaar librarian.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7756", + "name": "Library assistant", + "examine": "A TzHaar-Hur stamping stone tablets.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "melee_animation": "0", + "defence_animation": "0", + "death_animation": "0", + "magic_animation": "0", + "range_animation": "0", + "safespot": null + }, + { + "id": "7767", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "7768", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "7769", + "name": "TzHaar-Hur", + "examine": "Looks like a craftsman of some kind.", + "lifepoints": "80", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "1", + "magic_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "attack_speed": "5", + "melee_animation": "9286", + "defence_animation": "9287", + "death_animation": "9288", + "magic_animation": "9286", + "range_animation": "9286", + "safespot": null + }, + { + "id": "7772", + "name": "Lava monster", + "examine": "A monster made of magma.", + "lifepoints": "54", + "attack_level": "28", + "strength_level": "28", + "defence_level": "38", + "range_level": "38", + "respawn_delay": "60", + "melee_animation": "9337", + "defence_animation": "0", + "death_animation": "9340", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "combat_style": "1", + "aggressive": "true", + "safespot": null + }, + { + "id": "7773", + "name": "Fire monster", + "examine": "A monster like many others", + "lifepoints": "54", + "attack_level": "28", + "strength_level": "28", + "defence_level": "38", + "range_level": "38", + "respawn_delay": "60", + "melee_animation": "9341", + "defence_animation": "0", + "death_animation": "9344", + "magic_animation": "0", + "range_animation": "0", + "weakness": "0", + "combat_style": "2", + "aggressive": "true", + "safespot": null + }, + { + "id": "7823", + "name": "Wall Beast", + "examine": "A big, scary hand! ", + "lifepoints": "105", + "attack_level": "38", + "strength_level": "38", + "defence_level": "38", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "movement_radius": "1", + "melee_animation": "1802", + "defence_animation": "1803", + "death_animation": "1804", + "slayer_exp": "105", + "aggressive": "true", + "safespot": null + }, + { + "id": "7891", + "name": "Melee dummy", + "examine": "A melee training dummy", + "lifepoints": "15", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "respawn_delay": "60", + "attack_speed": "6", + "melee_animation": "94", + "defence_animation": "0", + "death_animation": "97", + "magic_animation": "0", + "range_animation": "0", + "weakness": "6", + "aggressive": "true", + "safespot": null + }, + { + "id": "7958", + "name": "Smelting Tutor", + "examine": "A man of his craft.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "movement_radius": "5", + "safespot": null + }, + { + "id": "7959", + "name": "Smelting Tutor", + "examine": "A master of his craft.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "movement_radius": "5", + "safespot": null + }, + { + "id": "7969", + "name": "Explorer Jack", + "examine": "He looks like a professional explorer.", + "lifepoints": "10", + "attack_level": "1", + "strength_level": "1", + "defence_level": "1", + "range_level": "1", + "safespot": null + }, + { + "id": "8133", + "name": "Corporeal Beast", + "examine": "A vision of supernatural horror.", + "lifepoints": "2000", + "attack_level": "320", + "strength_level": "320", + "defence_level": "310", + "range_level": "150", + "magic_level": "350", + "bonuses": "50,50,50,0,0,25,200,100,150,230,0,0,0,0,0", + "poison_immune": "true", + "respawn_delay": "80", + "attack_speed": "6", + "movement_radius": "64", + "agg_radius": "64", + "melee_animation": "10058", + "defence_animation": "10386", + "death_animation": "10385", + "magic_animation": "10053", + "aggressive": "true", + "safespot": null + }, + { + "id": "8149", + "name": "Armoured zombie", + "examine": "He sure looks grave.", + "lifepoints": "62", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "6", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "8150", + "name": "Armoured zombie", + "examine": "This is a rotten one.", + "lifepoints": "62", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "6", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "8151", + "name": "Armoured zombie", + "examine": "It hasn't quite gotten around to dying.", + "lifepoints": "62", + "attack_level": "50", + "strength_level": "50", + "defence_level": "50", + "range_level": "50", + "bonuses": "30,30,80,85,80,40,40,60,38,0,0,0,0,0,0", + "respawn_delay": "35", + "attack_speed": "6", + "melee_animation": "5571", + "defence_animation": "5574", + "death_animation": "5575", + "slayer_exp": "30", + "aggressive": "true", + "combat_audio": "931,923,922", + "safespot": null + }, + { + "id": "8349", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "2", + "aggressive": "true", + "protect_style": "0", + "safespot": "true" + }, + { + "id": "8350", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "2", + "aggressive": "true", + "protect_style": "2", + "safespot": "true" + }, + { + "id": "8351", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "2", + "aggressive": "true", + "protect_style": "1", + "safespot": "true" + }, + { + "id": "8352", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "1", + "aggressive": "true", + "protect_style": "0", + "safespot": "true" + }, + { + "id": "8353", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "1", + "aggressive": "true", + "protect_style": "2", + "safespot": "true" + }, + { + "id": "8354", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "1", + "aggressive": "true", + "protect_style": "1", + "safespot": "true" + }, + { + "id": "8355", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "0", + "aggressive": "true", + "protect_style": "0", + "safespot": "true" + }, + { + "id": "8356", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "0", + "aggressive": "true", + "protect_style": "2", + "safespot": "true" + }, + { + "id": "8357", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "0", + "aggressive": "true", + "protect_style": "1", + "safespot": "true" + }, + { + "id": "8358", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "2", + "aggressive": "true", + "protect_style": "0", + "safespot": "true" + }, + { + "id": "8359", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "2", + "aggressive": "true", + "protect_style": "2", + "safespot": "true" + }, + { + "id": "8360", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "2", + "aggressive": "true", + "protect_style": "1", + "safespot": "true" + }, + { + "id": "8361", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "1", + "aggressive": "true", + "protect_style": "0", + "safespot": "true" + }, + { + "id": "8362", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "1", + "aggressive": "true", + "protect_style": "2", + "safespot": "true" + }, + { + "id": "8363", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "1", + "aggressive": "true", + "protect_style": "1", + "safespot": "true" + }, + { + "id": "8364", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "0", + "aggressive": "true", + "protect_style": "0", + "safespot": "true" + }, + { + "id": "8365", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "0", + "aggressive": "true", + "protect_style": "2", + "safespot": "true" + }, + { + "id": "8366", + "name": "Tormented demon", + "examine": "Lucien must be incredibly powerful if he can bind such demons to his will.", + "lifepoints": "326", + "attack_level": "85", + "strength_level": "85", + "defence_level": "85", + "range_level": "85", + "magic_level": "85", + "bonuses": "112,132,113,111,245,167,394,346,213,349,167,65,39,65,58", + "poison_immune": "true", + "attack_speed": "6", + "melee_animation": "10922", + "defence_animation": "10923", + "death_animation": "10924", + "magic_animation": "10918", + "range_animation": "10919", + "slayer_exp": "136", + "combat_style": "0", + "aggressive": "true", + "protect_style": "1", + "safespot": "true" + }, + { + "id": "1179", + "name": "Gull", + "examine": "Flappy bird.", + "water_npc": "true" + }, + { + "id": "450", + "name": "Gull", + "examine": "Flappy bird.", + "water_npc": "true" + }, + { + "id": "451", + "name": "Gull", + "examine": "Flappy bird.", + "water_npc": "true" + }, + { + "id": "957", + "name": "Mubariz", + "examine": "Tough-looking combat type." + }, + { + "id": "958", + "name": "Fadli", + "examine": "Looks kinda bored." + }, + { + "id": "959", + "name": "A'abla", + "examine": "Trained to deal with all sorts of injuries." + }, + { + "id": "960", + "name": "Sabreen", + "examine": "Wow! She's made a statement with that hair!" + }, + { + "id": "962", + "name": "Jaraah", + "examine": "Has the messy job of putting players back together again." + }, + { + "id": "963", + "name": "Zahwa", + "examine": "Battle-scarred." + }, + { + "id": "964", + "name": "Ima", + "examine": "A citizen of Al Kharid" + }, + { + "id": "965", + "name": "Sabeil", + "examine": "A citizen of Al Kharid" + }, + { + "id": "966", + "name": "Jadid", + "examine": "A citizen of Al Kharid" + }, + { + "id": "967", + "name": "Dalal", + "examine": "A citizen of Al Kharid" + }, + { + "id": "968", + "name": "Afrah", + "examine": "A citizen of Al Kharid" + }, + { + "id": "969", + "name": "Jeed", + "examine": "A citizen of Al Kharid" + }, + { + "id": "970", + "name": "Diango", + "examine": "He smells funny." + }, + { + "id": "971", + "name": "Chadwell", + "examine": "Shopkeeper." + }, + { + "id": "972", + "name": "Koftik", + "examine": "The cave guide." + }, + { + "id": "973", + "name": "Koftik", + "examine": "The cave guide." + }, + { + "id": "974", + "name": "Koftik", + "examine": "The cave guide." + }, + { + "id": "975", + "name": "Koftik", + "examine": "The cave guide." + }, + { + "id": "976", + "name": "Koftik", + "examine": "The cave guide." + }, + { + "id": "996", + "name": "Kamen", + "examine": "This dwarf looks intoxicated." + }, + { + "id": "995", + "name": "Klank", + "examine": "A dwarven maker of gauntlets." + }, + { + "id": "1206", + "name": "Tyras guard", + "examine": "One of King Tyras's men." + }, + { + "id": "1209", + "name": "Koftik", + "examine": "The cave guide." + }, + { + "id": "1210", + "name": "Kings messenger", + "examine": "One of King Lathas' messengers." + }, + { + "id": "1212", + "name":"Will o' the wisp", + "examine": "Mysterious swamp lights..." + }, + { + "id": "1213", + "name": "Tegid", + "examine": "He's washing his clothes in the lake." + }, + { + "id": "1214", + "name": "Thistle", + "examine": "A plant." + }, + { + "id": "1215", + "name": "Parrots", + "examine": "What a colourful bunch of parrots!" + }, + { + "id": "639", + "name": "Romeo", + "examine": "Rather dense and soppy looking." + }, + { + "id": "5925", + "name": "Benny", + "examine": "Newspaper seller." + }, + { + "id": "783", + "name": "Wilough", + "examine": "One of Gertrude's Sons." + }, + { + "id": "882", + "name": "Gypsy Aris", + "examine": "An old gypsy lady." + }, + { + "id": "548", + "name": "Thessalia", + "examine": "Interesting assortment of clothes on offer..." + }, + { + "id": "546", + "name": "Zaff", + "examine": "Sells superior staffs." + }, + { + "id": "756", + "name": "Dr Harlow", + "examine": "A retired vampyre hunter." + }, + { + "id": "733", + "name": "Bartender", + "examine": "I could get a beer from him." + }, + { + "id": "6522", + "examine": "Director of the Grand Exchange." + }, + { + "id": "6535", + "examine": "He can look after my money. Good with money." + }, + { + "id": "6532", + "examine": "She can look after my money. Good with money." + }, + { + "id": "6530", + "examine": "There to help me make my bids." + }, + { + "id": "6528", + "examine": "There to help me make my bids." + }, + { + "id": "6534", + "examine": "He can look after my money. Good with money." + }, + { + "id": "6533", + "examine": "She can look after my money. Good with money." + }, + { + "id": "6531", + "examine": "There to help me make my bids." + }, + { + "id": "6529", + "examine": "There to help me make my bids." + } +] \ No newline at end of file diff --git a/Server/data/configs/npc_spawns.json b/Server/data/configs/npc_spawns.json new file mode 100644 index 000000000..f08c1321f --- /dev/null +++ b/Server/data/configs/npc_spawns.json @@ -0,0 +1,10539 @@ +[ + { + "npc_id": "0", + "loc_data": "{3221,3218,0,1,0}-{2522,5000,0,0,4}" + }, + { + "npc_id": "1", + "loc_data": "{3222,3221,0,1,3}-{2804,3427,0,1,2}-{3285,3208,0,1,4}-{3093,3509,0,1,3}-{3098,3508,0,1,7}-{3096,3510,0,1,3}-{3017,3239,0,1,2}-{2712,3484,0,1,4}-{2693,3495,0,1,1}-{3237,3404,0,1,6}-{3237,3408,0,1,0}-{3247,3396,0,1,3}-{3263,3403,0,1,3}-{3210,3223,1,1,4}-{3230,3208,0,1,1}" + }, + { + "npc_id": "2", + "loc_data": "{3298,3185,0,1,3}-{3101,3511,0,1,4}-{2690,3489,0,1,3}-{3236,3203,0,1,4}-{3217,3209,0,1,4}-{3237,3217,0,1,6}-{3282,3503,0,1,6}" + }, + { + "npc_id": "3", + "loc_data": "{2818,3443,0,1,3}-{3306,3200,0,1,6}-{3300,3208,0,1,3}-{3095,3511,0,1,3}-{3094,3513,0,1,4}-{3097,3510,0,1,4}-{2699,3491,0,1,1}-{3231,3239,0,1,4}-{3278,3502,0,1,6}" + }, + { + "npc_id": "4", + "loc_data": "{3010,3236,0,1,6}-{2693,3493,0,1,7}-{2693,3492,0,1,0}-{2695,3497,0,1,1}-{2700,3496,0,1,5}-{3230,3204,0,1,3}-{3281,3499,0,1,4}" + }, + { + "npc_id": "5", + "loc_data": "{2817,3447,0,1,5}-{2697,3493,0,1,4}-{3236,3205,0,1,2}-{3229,3238,0,1,1}-{3279,3497,0,1,3}" + }, + { + "npc_id": "6", + "loc_data": "{3097,3259,0,1,4}-{3280,3491,0,1,0}-{3246,3207,0,1,4}" + }, + { + "npc_id": "7", + "loc_data": "{2920,3434,0,1,0}-{3226,3290,0,1,3}-{2629,3360,0,1,4}-{3158, 3301, 0, 1, 0}" + }, + { + "npc_id": "8", + "loc_data": "{3019,3230,0,1,4}-{2804,3186,0,1,4}" + }, + { + "npc_id": "9", + "loc_data": "{2964,3392,0,1,6}-{2967,3393,0,1,1}-{3008,3324,0,1,2}-{3007,3321,0,1,6}-{3005,3321,0,1,4}-{2965,3389,0,1,6}-{2966,3392,0,1,1}-{2964,3392,0,1,1}" + }, + { + "npc_id": "11", + "loc_data": "{3235,3399,0,1,5}" + }, + { + "npc_id": "13", + "loc_data": "{3108,3157,1,1,3}-{3113,3157,1,1,4}-{3107,3170,0,1,0}-{3112,3167,0,1,0}-{3106,3157,0,1,3}-{3110,3155,0,1,6}-{2588,3087,0,1,4}-{2592,3086,0,1,6}-{2590,3083,1,1,4}-{2587,3086,1,1,4}-{2594,3084,1,1,6}-{2593,3090,2,1,5}-{2594,3085,2,1,1}-{2588,3089,2,1,4}" + }, + { + "npc_id": "14", + "loc_data": "{2890,3443,0,1,1}-{2897,3444,0,1,3}-{2897,3435,0,1,2}-{2899,3438,0,1,0}-{2904,3441,0,1,5}-{2899,3449,0,1,3}-{2913,3450,0,1,4}-{2888,3447,0,1,6}-{2886,3421,0,1,1}-{2892,3414,0,1,7}-{2896,3421,0,1,3}-{2900,3428,0,1,3}-{2883,3431,0,1,4}-{2885,3436,0,1,1}-{2914,3444,0,1,3}" + }, + { + "npc_id": "15", + "loc_data": "{2584,3304,0,1,3}-{2588,3291,0,1,7}-{2584,3288,0,1,0}-{2631,3294,0,1,6}-{2629,3296,0,1,4}-{2563,3382,0,1,6}-{2569,3383,0,1,6}-{2571,3381,0,1,1}-{2575,3384,0,1,4}-{2572,3385,0,1,4}" + }, + { + "npc_id": "16", + "loc_data": "{3279,3191,0,1,4}-{3296,3202,1,1,3}" + }, + { + "npc_id": "18", + "loc_data": "{3282,3176,0,1,0}-{3284,3170,0,1,7}-{3284,3174,0,1,0}-{3288,3168,0,1,5}-{3292,3169,0,1,3}-{3295,3168,0,1,3}-{3301,3170,0,1,6}-{3301,3174,0,1,6}-{3301,3177,0,1,0}" + }, + { + "npc_id": "19", + "loc_data": "{2971,3349,0,1,4}-{2979,3350,0,1,2}-{2973,3337,0,1,3}-{2959,3335,0,1,6}-{2982,3339,0,1,6}-{2983,3346,0,1,4}-{2980,3329,0,1,4}-{2987,3330,0,1,6}-{2958,3340,1,1,1}-{2970,3333,1,1,3}-{2966,3329,1,1,4}-{2961,3353,1,1,4}-{2973,3337,1,1,6}-{2998,3341,0,1,6}-{2983,3342,2,1,6}" + }, + { + "npc_id": "20", + "loc_data": "{2588,3301,1,0,0}" + }, + { + "npc_id": "21", + "loc_data": "{2630,3288,0,1,1}-{2647,3306,0,1,1}-{2667,3315,0,1,4}" + }, + { + "npc_id": "23", + "loc_data": "{2582,3297,0,1,6}-{2652,3318,0,1,0}-{2653,3300,0,1,5}-{2669,3298,0,1,4}-{2671,3313,0,1,6}" + }, + { + "npc_id": "24", + "loc_data": "{2614,3318,0,1,6}-{2621,3293,0,1,3}" + }, + { + "npc_id": "25", + "loc_data": "{2612,3316,0,1,1}-{2574,3321,1,1,4}-{2621,3293,1,1,3}" + }, + { + "npc_id": "27", + "loc_data": "{2574,3285,2,0,0}-{2574,3308,2,0,0}-{2582,3284,2,0,0}-{2582,3309,2,0,0}-{2588,3290,2,0,0}-{2588,3303,2,0,0}" + }, + { + "npc_id": "28", + "loc_data": "{2611,3269,0,0,0}" + }, + { + "npc_id": "31", + "loc_data": "{2616,3308,0,1,1}" + }, + { + "npc_id": "32", + "loc_data": "{2651,3307,0,1,1}-{2659,3309,0,1,6}-{2660,3309,0,1,3}-{2661,3309,0,1,1}-{2661,3317,0,1,5}-{2663,3301,0,1,3}-{2665,3300,0,1,3}-{2636,3342,0,1,4}-{2634,3342,0,1,3}-{2635,3339,0,1,3}-{2548,3111,1,1,3}-{2545,3116,1,1,7}-{2549,3115,1,1,1}-{2549,3112,1,1,4}" + }, + { + "npc_id": "35", + "loc_data": "{2545,3094,0,1,3}-{2549,3093,0,1,2}-{2543,3089,0,1,3}-{2540,3098,0,1,3}" + }, + { + "npc_id": "36", + "loc_data": "{3020,3373,0,1,0}" + }, + { + "npc_id": "38", + "loc_data": "{2952,3063,0,0,0}-{2955,3057,0,0,0}-{2956,3035,0,0,0}-{2969,3034,0,0,0}-{2984,3048,0,0,0}" + }, + { + "npc_id": "39", + "loc_data": "{2958,3055,0,0,0}-{2954,3029,0,0,0}-{2968,3039,0,0,0}-{2984,3048,0,0,0}-{2989,3058,0,0,0}-{2982,3060,0,0,0}-{2972,3060,0,0,0}-{2998,3061,0,0,0}-{2999,3049,0,0,0}" + }, + { + "npc_id": "40", + "loc_data": "{3005,3060,0,0,0}-{3008,3067,0,0,0}" + }, + { + "npc_id": "41", + "loc_data": "{3197,3356,0,1,4}-{3234,3297,0,1,3}-{3230,3296,0,1,5}-{3236,3288,0,1,6}-{3236,3300,0,1,2}-{3231,3308,0,1,3}-{2965,3336,0,1,4}-{3110,9573,0,1,6}-{2655,3441,0,1,6}-{2649,3438,0,1,7}-{2649,3446,0,1,6}-{2653,3444,0,1,6}-{2647,3441,0,1,1}-{2784,3062,0,1,4}-{2789,3063,0,1,4}-{3160,3082,0,1,3}-{3140,3096,0,1,3}-{3140,3093,0,1,0}-{3138,3094,0,1,1}-{3140,3093,0,1,3}-{3138,3093,0,1,1}-{3138,3094,0,1,0}-{3189,3278,0,1,3}-{3187,3276,0,1,5}-{3188,3278,0,1,4}-{2851,3370,0,1,3}-{2846,3374,0,1,3}-{2853,3372,0,1,3}-{2847,3373,0,1,3}-{2850,3371,0,1,1}-{2851,3373,0,1,4}-{2852,3370,0,1,4}-{3234,3293,0,1,4}-{3229,3298,0,1,1}-{3228,3296,0,1,4}-{2815,3560,0,1,7}-{2819,3561,0,1,4}-{2818,3559,0,1,6}-{3140,3093,0,1,1}-{2674,3652,0,1,3}-{2672,3655,0,1,6}-{2677,3655,0,1,6}" + }, + { + "npc_id": "42", + "loc_data": "{3237,3346,0,1,1}" + }, + { + "npc_id": "43", + "loc_data": "{3241,3354,0,1,3}-{3200,3263,0,0,0}-{3212,3262,0,1,1}-{2926,3323,0,1,0}-{2922,3325,0,1,3}" + }, + { + "npc_id": "44", + "loc_data": "{3251,3418,0,0,1}-{3252,3418,0,0,1}-{3253,3418,0,0,1}-{3096,3489,0,0,3}-{3254,3418,0,0,1}-{3255,3418,0,0,1}-{3256,3418,0,0,1}-{3147,3448,0,0,1}-{3180,3436,0,0,4}-{3180,3440,0,0,4}-{3180,3444,0,0,4}-{3096,3493,0,0,3}-{3097,3494,0,0,1}-{3191,3437,0,0,3}-{3191,3441,0,0,3}-{3191,3445,0,0,3}" + }, + { + "npc_id": "45", + "loc_data": "{3096,3491,0,0,3}-{3148,3448,0,0,0}-{3191,3443,0,0,3}-{3191,3439,0,0,3}-{3191,3435,0,0,3}-{3180,3442,0,0,4}-{3180,3434,0,0,4}-{2843,5214,0,0,4}-{3180,3438,0,0,4}" + }, + { + "npc_id": "46", + "loc_data": "{3179,3348,0,1,0}-{3178,3353,0,1,0}-{3211,3322,0,1,0}-{3214,3314,0,1,0}-{3214,3318,0,1,0}-{3216,3314,0,1,0}-{3218,3287,0,1,0}-{3223,3281,0,1,0}-{3231,3271,0,1,0}-{3233,3267,0,1,0}-{3233,3270,0,1,0}-{3235,3265,0,1,0}-{3235,3259,0,1,0}-{3238,3244,0,1,0}-{3241,3230,0,1,0}-{3241,3234,0,1,0}-{3243,3228,0,1,0}-{3247,3221,0,1,0}-{3248,3220,0,1,0}-{3259,3212,0,1,0}-{2979,3359,0,1,0}-{2979,3357,0,1,0}-{2993,3384,0,1,6}-{3015,3285,0,1,0}" + }, + { + "npc_id": "47", + "loc_data": "{3108, 9754, 0, 1, 5}-{3110, 9754, 0, 1, 5}-{3108, 9750, 0, 1, 5}-{3097,3364,0,1,3}-{3102,3363,0,1,5}-{3341,3267,0,1,5}-{3235,3224,0,1,3}-{3229,3220,0,1,4}-{3211,3211,0,1,3}-{3225,3220,0,1,1}-{3237,3215,0,1,5}-{3211,3210,0,1,7}-{3227,3220,0,1,7}-{3233,3227,0,1,5}-{3227,3210,0,1,6}-{3228,3222,0,1,4}-{3229,3226,0,1,0}-{3127,3487,0,1,4}-{3125,3486,0,1,6}-{3127,3486,0,1,4}-{3019,3292,0,1,7}-{3018,3295,0,1,7}-{3001,3202,0,1,5}-{3021,3205,0,1,6}-{3026,3174,0,1,5}-{3019,3176,0,1,7}-{3076,3282,0,1,5}-{3089,3266,0,1,4}-{3091,3266,0,1,4}-{3243,3687,0,1,5}-{3249,3669,0,1,3}-{3252,3675,0,1,4}-{3252,3680,0,1,3}-{3259,3683,0,1,0}-{3276,9871,0,1,1}-{3277,9871,0,1,3}-{3225,9862,0,1,4}-{3222,9861,0,1,6}-{3220,9860,0,1,6}-{3219,9865,0,1,6}-{3237,9862,0,1,4}-{3236,3217,0,1,4}-{3259,3230,0,1,4}-{3158,3226,0,1,5}-{3160,3202,0,1,4}-{3233,3237,0,1,7}-{2821,3170,0,1,1}-{2801,3158,0,1,2}-{2852,9642,0,1,6}-{2858,9632,0,1,3}-{2536,2982,0,1,3}-{2531,2980,0,1,0}-{2522,2981,0,1,4}-{2545,2989,0,1,4}-{2523,2970,0,1,2}-{2603,9480,0,1,1}-{2600,9477,0,1,0}-{2579,9496,0,1,4}-{2580,9508,0,1,0}-{2571,9522,0,1,4}-{2654,9640,0,1,6}-{2655,9637,0,1,4}-{2656,9639,0,1,7}-{2651,9636,0,1,5}-{2648,9637,0,1,4}-{2651,9642,0,1,1}-{2654,9640,0,1,0}-{2654,9635,0,1,6}-{2655,9635,0,1,3}-{2664,9626,0,1,6}-{2664,9624,0,1,1}-{2661,9623,0,1,1}-{2663,9623,0,1,3}-{2664,9626,0,1,6}-{2592,9831,0,1,3}-{2588,9825,0,1,6}-{2583,9829,0,1,4}-{2581,9841,0,1,0}-{2597,9823,0,1,2}-{2579,9805,0,1,3}-{2576,9804,0,1,0}-{2573,9805,0,1,5}-{2571,9808,0,1,3}-{2576,9810,0,1,2}-{2587,9802,0,1,2}-{2592,9800,0,1,4}-{2596,9805,0,1,6}-{2601,9802,0,1,5}-{2585,9801,0,1,7}-{2594,9803,0,1,0}-{2590,9806,0,1,3}-{2612,9808,0,1,6}-{2604,9810,0,1,6}-{2579,9821,0,1,2}-{2576,9812,0,1,6}-{2580,9813,0,1,6}-{2600,9813,0,1,4}-{2599,9809,0,1,4}-{2514,3193,0,1,6}-{2518,3192,0,1,3}-{2507,3181,0,1,3}-{2508,3178,0,1,6}-{2511,3183,0,1,3}-{2515,3182,0,1,1}-{2565,9505,0,1,1}-{2566,9510,0,1,6}-{2594,9497,0,1,4}-{3475,9840,0,1,6}-{3481,9842,0,1,1}-{3486,9843,0,1,7}-{3483,9824,0,1,4}-{3496,9808,0,0,5}-{3490,9815,0,1,1}-{3478,9834,0,0,3}-{3490,9824,0,1,4}" + }, + { + "npc_id": "48", + "loc_data": "{2775,2929,0,1,2}-{2789,2926,0,1,5}-{2795,2932,0,1,6}-{2775,2933,0,1,0}-{2769,2928,0,1,3}-{2817,2921,0,1,2}" + }, + { + "npc_id": "49", + "loc_data": "{2861,9838,0,1,3}-{2858,9842,0,1,4}-{2854,9847,0,1,5}-{2857,9850,0,1,7}-{2865,9849,0,1,6}-{2869,9838,0,1,6}-{3104,3680,0,1,3}-{3114,3688,0,1,1}-{3121,3675,0,1,1}-{3127,3695,0,1,3}-{3129,3678,0,1,2}-{3130,3689,0,1,2}-{3128,3665,0,1,3}-{3135,3701,0,1,6}-{3085,10134,0,1,0}-{3090,10123,0,1,0}-{3094,10133,0,1,0}-{3095,10120,0,1,0}-{3095,10128,0,1,0}-{3098,10122,0,1,0}-{3104,10127,0,1,0}-{3105,10125,0,1,0}-{3177,3905,0,1,4}-{3180,3908,0,1,2}-{3189,3914,0,1,6}-{3193,3906,0,1,2}-{2402,9785,0,1,1}-{2403,9782,0,1,1}-{2408,9782,0,1,1}-{2408,9785,0,1,1}-{2413,9776,0,1,1}-{2417,9777,0,1,1}-{2412,9773,0,1,1}-{2416,9773,0,1,1}" + }, + { + "npc_id": "50", + "loc_data": "{2273,4698,0,0,0}" + }, + { + "npc_id": "52", + "loc_data": "{2899,9765,0,1,1}-{2893,9768,0,1,1}-{2895,9771,0,1,6}-{2894,9781,0,1,6}-{2891,9787,0,1,2}-{2904,9798,0,1,0}-{2910,9799,0,1,4}" + }, + { + "npc_id": "53", + "loc_data": "{2694,9508,0,0,3}-{2703,9505,0,0,6}-{2710,9499,0,0,1}-{2704,9520,0,0,5}-{2714,9523,0,0,3}-{2722,9520,0,0,7}-{3232,3790,0,0,4}" + }, + { + "npc_id": "54", + "loc_data": "{2831,9825,0,1,0}-{2838,9824,0,1,1}-{2344,9763,0,1,1}" + }, + { + "npc_id": "55", + "loc_data": "{2914,9800,0,1,2}-{2906,9804,0,1,6}-{2896,9798,0,1,0}-{2909,9906,0,1,4}" + }, + { + "npc_id": "58", + "loc_data": "{3289,5482,0,1,1}-{3296,5472,0,1,0}-{3291,5466,0,1,6}-{3294,5481,0,1,0}-{3300,5479,0,1,7}-{3288,5480,0,1,3}-{3293,5475,0,1,3}-{3293,5481,0,1,2}-{3286,5465,0,1,3}-{3279,5478,0,1,4}-{3270,5464,0,1,2}-{3270,5468,0,1,1}-{2574,9874,0,1,0}-{2577,9877,0,1,3}-{2574,9878,0,1,0}-{2575,9871,0,1,4}" + }, + { + "npc_id": "59", + "loc_data": "{3182,3244,0,1,1}-{3250,3239,0,1,1}-{3241,3241,0,1,1}-{3188,3216,0,1,1}-{3082,3362,0,1,4}-{3146,3347,0,1,3}-{3249,3249,0,1,1}-{3102,9881,0,1,3}-{3095,9883,0,1,2}-{3218,9890,0,1,3}-{3220,9887,0,1,0}-{3218,9887,0,1,1}-{3218,9889,0,1,5}-{3213,9890,0,1,1}-{3169,3257,0,1,1}-{3164,3236,0,1,6}-{3148,3226,0,1,5}-{3162,3223,0,1,7}-{3151,3221,0,1,0}-{3160,3221,0,1,0}-{2461,2880,0,1,5}-{2489,2935,0,1,7}-{2492,2907,0,1,1}-{2496,2890,0,1,4}-{2487,2894,0,1,2}-{2487,2888,0,1,7}-{2483,2877,0,1,3}-{2481,2876,0,1,4}-{2457,2867,0,1,4}-{2481,2847,0,1,0}-{2475,2854,0,1,3}-{2482,2873,0,1,3}-{2485,2876,0,1,2}-{2449,2865,0,1,1}-{2478,2916,0,1,5}-{2485,2902,0,1,3}-{2487,2902,0,1,2}-{2489,2894,0,1,2}-{2490,2905,0,1,7}-{2490,2917,0,1,5}-{2484,2890,0,1,1}-{2503,2889,0,1,1}-{2491,2927,0,1,1}-{2497,2939,0,1,2}-{2648,9766,0,1,4}-{2653,9761,0,1,3}" + }, + { + "npc_id": "60", + "loc_data": "{3189,3883,0,1,5}-{3182,3882,0,1,5}-{3177,3871,0,1,0}-{3176,3878,0,1,0}-{3173,3892,0,1,6}-{3171,3884,0,1,4}-{3166,3874,0,1,1}-{3169,3900,0,1,1}-{3165,3881,0,1,3}-{3164,3888,0,1,6}-{3163,3894,0,1,7}-{3162,3894,0,1,4}-{2547,2982,0,1,6}-{2477,2866,0,1,5}-{2484,2897,0,1,3}-{2455,2857,0,1,6}-{2434,2845,0,1,4}-{2544,2904,0,1,2}-{2548,2981,0,1,1}-{2448,2784,0,1,7}-{2460,2869,0,1,3}-{2471,2890,0,1,6}-{2491,2906,0,1,0}-{2523,2975,0,1,1}" + }, + { + "npc_id": "61", + "loc_data": "{3111, 9747, 0, 1, 5}-{3108, 9747, 0, 1, 5}-{3321,3145,0,1,3}-{3327,3131,0,1,5}-{3322,3143,0,1,3}-{3182,3878,0,1,6}-{3182,3886,0,1,7}-{3182,3888,0,1,5}-{3175,3888,0,1,4}-{3175,3879,0,1,7}-{3174,3879,0,1,3}-{3174,3882,0,1,0}-{3175,3885,0,1,3}-{3172,3876,0,1,2}-{3172,3894,0,1,1}-{3172,3885,0,1,3}-{3165,3886,0,1,3}-{3165,3896,0,1,1}-{3166,3886,0,1,1}-{3164,3893,0,1,4}-{3163,3881,0,1,4}-{3159,3889,0,1,0}-{3213,9890,0,1,5}-{3210,9886,0,1,4}-{3213,9887,0,1,1}-{3207,9880,0,1,0}-{3255,9870,0,1,4}-{3258,9872,0,1,3}-{3261,9870,0,1,4}-{3156,3248,0,1,4}-{3143,3241,0,1,4}-{3156,3249,0,1,4}-{3175,3248,0,1,7}-{3169,3260,0,1,4}-{3171,3254,0,1,5}-{3162,3246,0,1,6}-{3179,3262,0,1,1}-{3162,3226,0,1,1}-{3166,3222,0,1,1}-{3157,3229,0,1,5}-{3168,3222,0,1,4}-{3211,9622,0,1,2}-{3215,9620,0,1,4}-{3212,9618,0,1,3}-{3217,9617,0,1,3}-{3214,9620,0,1,7}-{2541,3189,0,1,3}-{2542,3187,0,1,6}-{2543,3186,0,1,4}-{2545,3183,0,1,3}-{2545,3183,0,1,3}-{2545,3182,0,1,3}-{2543,3183,0,1,0}-{2543,3182,0,1,3}-{2539,3182,0,1,0}" + }, + { + "npc_id": "62", + "loc_data": "{2769,3198,0,1,7}-{2768,3206,0,1,1}-{2776,3107,0,1,1}-{2794,3121,0,1,3}-{2795,3118,0,1,1}-{2796,3109,0,1,1}-{2808,3112,0,1,6}-{2791,3124,0,1,1}-{2860,3094,0,1,6}-{2854,3086,0,1,6}-{2863,3083,0,1,3}-{2853,3081,0,1,4}-{2859,3079,0,1,4}-{2859,3075,0,1,6}-{2871,3092,0,1,1}-{2867,3094,0,1,1}-{2861,3082,0,1,3}-{2861,3094,0,1,3}-{2863,3081,0,1,2}-{2864,3089,0,1,3}-{2859,3084,0,1,0}-{2850,3060,0,1,6}-{2857,3044,0,1,7}-{2856,3066,0,1,4}-{2784,3030,0,1,4}-{2783,3017,0,1,3}-{2811,2975,0,1,7}-{2815,2987,0,1,5}-{2808,3007,0,1,6}-{2812,3007,0,1,1}-{2885,2950,0,1,4}-{2891,2951,0,1,6}-{2894,2946,0,1,4}-{2928,3022,0,1,3}-{2930,3029,0,1,4}-{2927,3039,0,1,6}-{2928,3043,0,1,0}-{2929,3036,0,1,7}-{2919,3040,0,1,4}-{2934,3045,0,1,2}-{2929,3035,0,1,4}-{2914,3055,0,1,4}-{2922,3059,0,1,3}-{2930,3049,0,1,4}-{2914,3047,0,1,4}-{2935,3049,0,1,1}-{2927,3058,0,1,3}" + }, + { + "npc_id": "63", + "loc_data": "{3118,9950,0,1,6}-{3116,9956,0,1,0}-{3127,9953,0,1,7}-{3122,9955,0,1,4}-{3124,9951,0,1,4}-{3124,9950,0,1,3}-{3074,3892,0,1,3}-{3071,3894,0,1,7}-{3062,3897,0,1,3}-{3058,3889,0,1,4}-{3054,3880,0,1,2}-{3054,3895,0,1,7}-{3051,3879,0,1,6}-{3051,3886,0,1,6}-{3047,3893,0,1,1}-{3047,3881,0,1,4}-{3044,3893,0,1,5}-{3041,3894,0,1,1}-{3038,3890,0,1,1}-{3046,3872,0,1,4}-{3165,9891,0,1,6}-{3177,9886,0,1,4}-{3175,9889,0,1,4}-{3177,9879,0,1,4}-{3177,9888,0,1,1}-{3178,9895,0,1,4}-{3182,9884,0,1,3}-{2841,9583,0,1,4}-{2841,9582,0,1,4}-{2839,9582,0,1,1}-{2837,9572,0,1,6}-{2832,9580,0,1,1}-{3164,9888,0,1,3}-{3169,9892,0,1,6}-{3258,5560,0,1,2}-{3258,5555,0,1,3}-{3260,5557,0,1,3}-{3257,5552,0,1,1}-{3260,5558,0,1,5}-{3258,5556,0,1,6}-{3257,5555,0,1,6}-{3260,5559,0,1,7}-{3257,5561,0,1,1}" + }, + { + "npc_id": "64", + "loc_data": "{2945,3910,0,1,0}-{2956,3923,0,1,0}-{2961,3919,0,1,0}-{2968,3915,0,1,0}-{2972,3927,0,1,0}-{2975,3949,0,1,0}-{2961,3945,0,1,0}-{2950,3927,0,1,0}-{2684,9798,0,1,2}-{2691,9814,0,1,5}-{2694,9819,0,1,6}-{2696,9831,0,1,3}-{2702,9837,0,1,6}-{2709,9844,0,1,3}-{2720,9847,0,1,4}-{2724,9843,0,1,6}-{2733,9846,0,1,4}-{2740,9841,0,1,3}-{2745,9836,0,1,4}-{2745,9828,0,1,5}-{2747,9826,0,1,1}" + }, + { + "npc_id": "66", + "loc_data": "{2507,3204,0,1,5}-{2506,3205,0,1,6}-{2526,3169,0,1,6}-{2540,3226,0,1,6}-{2528,3164,0,1,6}-{2529,3169,0,1,1}-{2537,3170,0,1,1}" + }, + { + "npc_id": "67", + "loc_data": "{2507,3200,0,1,6}-{2516,3212,0,1,1}" + }, + { + "npc_id": "68", + "loc_data": "{2518,3209,0,1,3}-{2533,3209,0,1,5}-{2530,3212,0,1,1}" + }, + { + "npc_id": "73", + "loc_data": "{3268,9893,0,1,3}-{3251,9896,0,1,6}-{3087,9672,0,1,1}-{3103,9672,0,1,1}-{3119,9670,0,1,1}-{3123,9657,0,1,2}" + }, + { + "npc_id": "74", + "loc_data": "{3148,9899,0,1,3}-{3147,9905,0,1,6}-{3141,9901,0,1,5}-{3142,9891,0,1,6}-{3139,9886,0,1,2}-{3148,9883,0,1,1}-{3151,9889,0,1,3}-{3126,9865,0,1,7}-{3129,9859,0,1,3}-{3121,9863,0,1,3}-{3126,9862,0,1,5}-{3082,9671,0,1,3}-{3105,9672,0,1,1}-{3113,9673,0,1,3}-{3124,9660,0,1,3}-{3122,9656,0,1,4}-{3117,9646,0,1,1}-{3124,9651,0,1,2}-{3117,9645,0,1,3}-{3094,9671,0,1,3}-{2843,9767,0,1,3}-{2845,9762,0,1,7}-{2842,9759,0,1,6}" + }, + { + "npc_id": "75", + "loc_data": "{2931,9641,0,1,6}-{3226,9909,0,1,4}-{3225,9905,0,1,0}-{3234,9907,0,1,4}-{2931,9643,0,1,6}-{2588,9493,0,1,3}-{2584,9491,0,1,3}-{2589,9492,0,1,4}-{2591,9492,0,1,6}-{2593,9491,0,1,6}-{2588,9491,0,1,3}-{2839,9774,0,1,4}" + }, + { + "npc_id": "76", + "loc_data": "{2843,9774,0,1,6}-{2842,9769,0,1,4}-{2842,9764,0,1,7}-{2845,9754,0,1,4}-{2849,9751,0,1,1}-{2850,9747,0,1,3}-{2844,9758,0,1,7}-{2540,9814,0,1,6}-{2547,9817,0,1,6}" + }, + { + "npc_id": "78", + "loc_data": "{2911,9836,0,1,3}-{2904,9831,0,1,5}-{2914,9827,0,1,4}-{2927,9830,0,1,5}-{3069,3901,0,1,4}-{3079,3955,0,1,3}-{3076,3953,0,1,0}-{3079,3952,0,1,1}-{3072,3952,0,1,0}-{3075,3948,0,1,2}-{3072,3956,0,1,1}-{3085,3951,0,1,6}-{2862,9569,0,1,4}-{2857,9571,0,1,7}-{2837,9561,0,1,1}-{3787,9459,0,1,1}-{3725,9369,0,1,1}-{3737,9390,0,1,4}-{3738,9399,0,1,0}-{3740,9407,0,1,1}-{3755,9424,0,1,0}-{3803,9447,0,1,4}-{3765,9407,0,1,1}-{3762,9395,0,1,3}-{3760,9440,0,1,4}-{3737,9425,0,1,7}-{3720,9430,0,1,4}-{3736,9451,0,1,3}-{3728,9463,0,1,2}-{3740,9462,0,1,4}-{3770,9463,0,1,1}-{3778,9438,0,1,1}-{3786,9422,0,1,4}-{3800,9419,0,1,3}-{3797,9427,0,1,4}-{3820,9432,0,1,5}-{3825,9414,0,1,3}-{3833,9415,0,1,0}-{3752,9450,0,1,6}-{3825,9449,0,1,3}-{3827,9459,0,1,1}-{3818,9466,0,1,4}-{3799,9460,0,1,1}-{3794,9451,0,1,1}-{3762,9432,0,1,1}-{3725,9390,0,1,3}-{2672,9805,0,1,3}-{2663,9804,0,1,4}-{2658,9809,0,1,5}-{3753,9387,0,1,0}-{3728,9382,0,1,3}-{3733,9421,0,1,7}-{2568,9528,0,1,5}-{2573,9530,0,1,3}-{2575,9525,0,1,6}-{2571,9528,0,1,7}-{2608,9818,0,1,7}-{2609,9825,0,1,5}-{2607,9830,0,1,1}-{2605,9837,0,1,1}-{2607,9833,0,1,6}-{3729,9360,0,1,6}-{2759,3402,0,1,2}-{2756,3400,0,1,0}-{2543,9564,0,1,1}-{2543,9562,0,1,1}-{2542,9557,0,1,1}-{2542,9569,0,1,4}-{2540,9566,0,1,0}-{2549,9568,0,1,6}-{2538,9568,0,1,3}" + }, + { + "npc_id": "80", + "loc_data": "{2619,3265,0,1,0}-{2619,3265,0,1,3}-{2615,3267,0,1,4}" + }, + { + "npc_id": "81", + "loc_data": "{3255,3255,0,1,3}-{3255,3256,0,1,4}-{3038,3310,0,1,5}-{3028,3312,0,1,6}-{3028,3299,0,1,6}-{3042,3300,0,1,6}-{2923,3277,0,1,1}-{2921,3289,0,1,1}-{2923,3280,0,1,6}-{2589,3120,0,1,4}-{2605,3116,0,1,5}-{3259,3261,0,1,1}-{3263,3283,0,1,6}-{3257,3268,0,1,4}" + }, + { + "npc_id": "82", + "loc_data": "{2936,9652,0,1,3}-{2932,9809,0,1,0}-{2929,9803,0,1,2}-{2934,9795,0,1,6}-{2933,9791,0,1,1}-{3052,3117,2,1,1}-{2841,9557,0,1,3}-{2831,9562,0,1,3}-{2838,9605,0,1,3}-{3058,10128,0,1,0}-{3046,10139,0,1,0}-{3110,3157,2,1,5}" + }, + { + "npc_id": "83", + "loc_data": "{3169,3711,0,1,7}-{3095,10095,0,1,0}-{3095,10086,0,1,0}-{2639,9477,2,0,3}-{2635,9497,2,0,2}" + }, + { + "npc_id": "84", + "loc_data": "{2861,9766,0,1,7}-{2875,9776,0,1,3}-{2869,9782,0,1,3}-{2856,9779,0,1,3}-{2867,9773,0,1,0}-{2863,9780,0,1,4}-{2858,9775,0,1,4}-{2700,9481,0,0,5}-{2729,9483,0,0,5}" + }, + { + "npc_id": "86", + "loc_data": "{2632,9696,0,1,1}-{2639,9697,0,1,3}-{2646,9696,0,1,3}-{2650,9697,0,1,4}-{2646,9702,0,1,6}-{3098,9880,0,1,5}-{3094,9883,0,1,1}-{3196,3208,0,1,1}-{3119,9891,0,1,4}-{3249,9868,0,1,4}-{3237,9868,0,1,3}-{3221,9873,0,1,6}-{3225,9862,0,1,2}-{3199,3209,0,1,1}-{3193,3211,0,1,5}-{3197,3203,0,1,1}-{3201,3200,0,1,4}-{3199,3210,0,1,0}-{3191,3207,0,1,4}-{3037,9511,0,1,6}-{3105,9517,0,1,7}-{3101,9517,0,1,6}-{3102,9521,0,1,4}-{3106,9519,0,1,1}-{3104,9514,0,1,4}-{3104,9518,0,1,1}-{3107,9519,0,1,1}-{3109,9516,0,1,1}-{3107,9515,0,1,7}-{3105,9512,0,1,6}-{3102,9513,0,1,3}-{3100,9514,0,1,1}-{3100,9516,0,1,7}-{3099,9521,0,1,0}-{3103,9523,0,1,1}-{3212,3191,0,1,6}-{3207,3192,0,1,2}-{3216,3184,0,1,2}-{3224,3174,0,1,4}-{3229,3183,0,1,5}-{3222,3185,0,1,3}-{3216,3177,0,1,4}-{3200,3182,0,1,5}-{3202,3189,0,1,6}-{3188,3181,0,1,7}-{3181,3191,0,1,7}-{3185,3199,0,1,4}-{3176,3198,0,1,6}-{3168,3188,0,1,4}-{3172,3178,0,1,1}-{3179,3174,0,1,1}-{3189,3168,0,1,5}-{3237,9866,0,1,6}-{3232,9867,0,1,7}-{3219,9862,0,1,7}-{3227,9875,0,1,4}-{3276,9870,0,1,3}-{3291,3388,0,1,6}-{2647,9713,0,1,3}-{2641,9719,0,1,1}-{2650,9716,0,1,1}-{2518,3187,0,1,3}-{3495,9812,0,1,1}-{3502,9807,0,0,4}" + }, + { + "npc_id": "87", + "loc_data": "{3241,3531,0,1,7}-{3260,3540,0,1,7}-{3103,9881,0,1,3}-{3122,9889,0,1,2}-{3117,9890,0,1,2}-{3293,3382,0,1,4}-{2520,3188,0,1,3}" + }, + { + "npc_id": "88", + "loc_data": "{2601,9802,0,1,6}-{2594,9805,0,1,1}-{2587,9806,0,1,2}-{2585,9803,0,1,1}-{2584,9801,0,1,5}" + }, + { + "npc_id": "89", + "loc_data": "{2783,3463,0,1,7}-{2629,3266,0,1,2}-{2634,3265,0,1,1}-{2575,3058,0,0,6}-{3080,3451,0,1,1}-{3096,3460,0,1,3}-{3142,3211,0,1,6}-{2557,3065,0,0,1}-{3294,3344,0,1,3}-{3289,3349,0,1,6}-{3286,3345,0,1,1}" + }, + { + "npc_id": "90", + "loc_data": "{2925,3254,2,1,3}-{2882,9815,0,1,3}-{2883,9822,0,1,6}-{2883,9827,0,1,6}-{2890,9847,0,1,1}-{2896,9849,0,1,5}-{2900,9848,0,1,3}-{2907,9849,0,1,5}-{3116,3534,0,1,4}-{3110,3367,0,1,3}-{3110,9909,0,1,4}-{3121,9910,0,1,4}-{3133,9909,0,1,5}-{3133,9904,0,1,6}-{3129,9916,0,1,3}-{3133,9916,0,1,0}-{3141,9875,0,1,6}-{3208,9905,0,1,4}-{2852,9577,0,1,1}-{2865,9567,0,1,3}-{2924,3252,2,1,3}-{2926,3255,2,1,4}-{2932,3255,2,1,3}-{2931,3251,2,1,4}-{3194,5448,0,1,3}-{3183,5447,0,1,3}-{3177,5457,0,1,4}-{3187,5456,0,1,1}-{3003,3593,0,1,5}-{3007,3596,0,1,4}-{3025,3595,0,1,4}-{3022,3594,0,1,0}" + }, + { + "npc_id": "91", + "loc_data": "{3099,9910,0,1,3}-{3100,9906,0,1,6}-{3212,9906,0,1,6}-{3252,9916,0,1,3}-{3259,9915,0,1,3}-{3272,9913,0,1,6}-{3274,9914,0,1,1}-{3278,9908,0,1,1}-{3275,9911,0,1,5}-{3194,5454,0,1,4}" + }, + { + "npc_id": "92", + "loc_data": "{3111,3561,0,1,3}-{3132,9915,0,1,5}-{3095,9909,0,1,3}-{3149,9869,0,1,6}-{3138,9878,0,1,5}-{3137,9869,0,1,3}-{2840,9652,0,1,1}-{2829,9657,0,1,4}-{2819,3288,0,1,1}-{2848,3248,0,1,3}-{2850,3235,0,1,3}-{3117,9671,0,1,1}-{3122,9661,0,1,6}-{3123,9648,0,1,6}-{3005,10362,0,1,1}-{3003,10358,0,1,1}-{3005,10351,0,1,1}-{3003,10345,0,1,5}-{2993,3940,0,1,4}-{2593,9883,0,1,1}-{2590,9885,0,1,4}-{2586,9883,0,1,1}-{2585,9878,0,1,3}-{2537,9845,0,1,1}-{2540,9846,0,1,4}-{2552,9844,0,1,6}-{2556,9846,0,1,4}-{2535,9844,0,1,3}-{2532,9843,0,1,4}-{2530,9845,0,1,3}-{2540,9820,0,1,4}-{2544,9824,0,1,4}" + }, + { + "npc_id": "93", + "loc_data": "{3101,9956,0,1,3}-{3104,9948,0,1,0}-{3104,9955,0,1,4}-{3108,9951,0,1,4}-{3108,9954,0,1,1}-{3111,9954,0,1,6}-{3112,9958,0,1,4}-{2841,9625,0,1,4}-{2845,9628,0,1,3}-{2841,9638,0,1,6}-{2845,9645,0,1,1}-{2655,9824,0,1,1}-{2669,9824,0,1,4}-{2667,9823,0,1,5}-{2658,9830,0,1,6}-{2666,9829,0,1,6}-{3194,5460,0,1,6}-{3192,5466,0,1,7}-{2566,9507,0,1,3}-{2562,9505,0,1,1}-{2568,9509,0,1,3}-{3185,5493,0,1,4}-{3182,5494,0,1,6}-{3185,5486,0,1,7}-{3175,5492,0,1,3}-{3169,5496,0,1,4}-{3170,5492,0,1,3}-{3186,5487,0,1,4}-{3169,5491,0,1,2}-{2571,9509,0,1,1}-{2564,9504,0,1,1}-{2566,9505,0,1,1}-{2544,9841,0,1,1}-{2536,9844,0,1,6}-{2527,9844,0,1,3}-{2530,9842,0,1,4}-{2543,9815,0,1,3}" + }, + { + "npc_id": "94", + "loc_data": "{2589,9881,0,1,6}-{2591,9882,0,1,4}" + }, + { + "npc_id": "95", + "loc_data": "{2616,3283,0,1,3}-{2620,3283,0,1,3}-{2502,2969,0,1,6}-{2507,2971,0,1,2}-{2600,2959,0,1,6}-{2606,2971,0,1,6}-{2606,2963,0,1,4}-{2612,2965,0,1,6}-{2611,2973,0,1,5}-{2613,2963,0,1,3}-{2459,2884,0,1,7}-{2496,2907,0,1,6}-{2489,2887,0,1,7}-{2473,2885,0,1,7}-{2466,2872,0,1,4}-{2452,2883,0,1,5}-{2440,2869,0,1,5}-{2460,2849,0,1,1}-{2451,2842,0,1,4}-{2467,2838,0,1,6}-{2444,2832,0,1,6}-{2498,2845,0,1,3}-{2615,2957,0,1,4}-{2599,2960,0,1,2}-{2609,2966,0,1,0}-{2605,2967,0,1,5}-{2609,2963,0,1,2}-{2496,2857,0,1,4}-{2493,2849,0,1,4}-{2474,2860,0,1,1}-{2470,2865,0,1,4}-{2462,2874,0,1,1}-{2458,2853,0,1,4}-{2454,2876,0,1,5}-{2478,2884,0,1,6}-{2469,2886,0,1,5}-{2442,2876,0,1,1}-{2490,2903,0,1,1}-{2477,2928,0,1,4}-{2492,2956,0,1,1}-{2502,2956,0,1,4}-{2499,2965,0,1,0}-{2508,2968,0,1,4}-{2500,2974,0,1,0}-{3175,3948,0,1,1}-{3200,3931,0,1,1}-{3220,3921,0,1,7}-{2478,3272,0,1,1}-{2465,3276,0,1,1}-{2468,3277,0,1,4}-{2466,3271,0,1,5}-{2468,3277,0,1,0}" + }, + { + "npc_id": "96", + "loc_data": "{2842,3450,0,0,0}-{2872,3437,0,0,0}-{2873,3449,0,0,0}-{2868,3456,0,0,0}-{2856,3490,0,0,0}-{2861,3492,0,0,0}-{2862,3505,0,0,0}-{2856,3507,0,0,0}-{3004,3920,0,1,7}-{3007,3925,0,1,3}-{3005,3927,0,1,3}-{3004,3924,0,1,3}-{2988,3918,0,1,2}-{2992,3921,0,1,2}-{2990,3923,0,1,3}-{2988,3925,0,1,6}-{2987,3921,0,1,6}" + }, + { + "npc_id": "97", + "loc_data": "{2847,3485,0,0,0}-{2847,3489,0,0,0}-{2833,3511,0,0,0}-{2831,3506,0,0,0}-{2834,3514,0,0,0}-{3003,3921,0,1,6}-{3009,3920,0,1,3}-{3001,3923,0,1,1}-{3001,3927,0,1,4}-{2993,3919,0,1,4}-{2994,3924,0,1,1}-{2988,3918,0,1,4}" + }, + { + "npc_id": "98", + "loc_data": "{3014,3294,0,1,1}" + }, + { + "npc_id": "99", + "loc_data": "{2624,3319,0,1,1}-{2624,3327,0,1,6}-{2642,3314,0,1,4}-{2646,3325,0,1,1}-{2790,3199,0,1,2}-{2784,3188,0,1,1}-{2779,3207,0,1,1}-{2646,3504,0,1,4}-{2634,3476,0,1,5}-{2651,3477,0,1,5}-{2665,3472,0,1,5}-{2662,3488,0,1,5}-{2672,3505,0,1,5}" + }, + { + "npc_id": "100", + "loc_data": "{2551,3408,0,1,6}-{2553,3405,0,1,3}-{2559,3452,0,1,3}-{2567,3440,0,1,3}" + }, + { + "npc_id": "101", + "loc_data": "{2555,3407,0,1,3}-{2624,3391,0,1,1}-{2622,3389,0,1,4}-{2619,3390,0,1,4}-{2553,3457,0,1,3}-{2573,3437,0,1,3}" + }, + { + "npc_id": "102", + "loc_data": "{2622,3390,0,1,7}-{2622,3390,0,1,7}" + }, + { + "npc_id": "103", + "loc_data": "{2501,3289,0,1,1}-{2928,3251,1,1,3}-{3277,3659,0,1,1}-{3280,3658,0,1,1}-{3277,3661,0,1,3}-{3276,3657,0,1,3}-{3241,9907,0,1,4}-{3243,9914,0,1,1}-{3242,9913,0,1,6}-{3242,9916,0,1,5}-{3239,9914,0,1,1}-{2928,3244,1,1,4}-{2924,3253,1,1,3}-{2927,3252,1,1,4}-{2927,3254,1,1,3}-{2713,4892,0,1,3}-{2711,4899,0,1,3}-{2732,4901,0,1,3}-{2729,4893,0,1,3}-{2713,4907,0,1,3}" + }, + { + "npc_id": "104", + "loc_data": "{3093,3357,1,1,6}" + }, + { + "npc_id": "105", + "loc_data": "{2632,3280,0,1,1}-{2633,3274,0,1,3}-{3094,3601,0,1,6}-{3109,3600,0,1,2}-{3091,3604,0,1,0}-{2497,3164,0,1,2}-{3023,4508,0,1,7}-{2696, 3329, 0,1,4}-{2708, 3336, 0,1,4}" + }, + { + "npc_id": "106", + "loc_data": "{2968,3480,0,1,6}-{2968,3490,0,1,3}-{2978,3507,0,1,1}-{2959,3445,0,1,3}-{2807,3377,0,1,6}-{3289,3353,0,1,3}" + }, + { + "npc_id": "107", + "loc_data": "{2602,3267,0,1,6}-{2603,3270,0,1,4}-{2607,3268,0,1,5}-{3275,3154,0,1,6}-{3038,9802,0,1,5}-{3041,9804,0,1,6}-{3040,9795,0,1,7}-{3055,9776,0,1,4}-{3039,9769,0,1,6}-{3049,9764,0,1,3}-{3050,9770,0,1,1}-{3039,9765,0,1,1}-{3048,9762,0,1,4}-{3044,9760,0,1,6}-{3048,9779,0,1,1}-{2870,3166,0,1,3}-{2868,3159,0,1,4}-{2867,3172,0,1,5}-{2813,3112,0,1,4}-{2858,3167,0,1,3}-{2846,3153,0,1,3}-{2851,3149,0,1,1}-{2789,2949,0,1,3}-{2787,2943,0,1,3}-{2781,2949,0,1,3}-{3253,9909,0,1,4}-{3300,3312,0,1,1}-{3300,3305,0,1,3}-{3298,3300,0,1,5}-{3298,3294,0,1,0}-{3299,3290,0,1,6}-{2645,9823,0,1,1}-{2641,9819,0,1,7}-{2641,9817,0,1,2}-{2642,9813,0,1,5}-{2639,9809,0,1,2}-{2585,3479,0,1,1}-{2578,3476,0,1,7}-{2588,3485,0,1,3}" + }, + { + "npc_id": "108", + "loc_data": "{2715,3218,0,1,0}-{2719,3223,0,1,0}-{2720,3212,0,1,0}-{2722,3220,0,1,0}-{2724,3215,0,1,0}-{2729,3224,0,1,0}-{2733,3225,0,1,0}-{2936,9777,0,1,0}-{2934,9765,0,1,0}-{2932,9755,0,1,0}-{2726,3217,0,1,0}-{2728,3218,0,1,0}-{2735,3219,0,1,0}-{2723,3212,0,1,0}-{2721,3216,0,1,0}-{2716,3219,0,1,0}-{2725,3227,0,1,0}" + }, + { + "npc_id": "109", + "loc_data": "{2601,3269,0,0,0}-{2604,3272,0,0,0}-{2605,3268,0,0,0}-{2606,3271,0,0,0}" + }, + { + "npc_id": "110", + "loc_data": "{3050,10337,0,1,4}-{3047,10340,0,1,4}-{3048,10346,0,1,4}-{3048,10346,0,1,3}-{3305,9400,0,1,1}-{3296,9378,0,1,3}-{3234,5497,0,1,1}-{2564,9887,0,1,4}-{2581,9897,0,1,1}-{2577,9888,0,1,1}" + }, + { + "npc_id": "111", + "loc_data": "{2920,3800,0,1,3}-{2955,3901,0,1,6}-{3043,9581,0,1,1}-{3055,9577,0,1,6}-{3061,9576,0,1,4}-{3055,9571,0,1,7}-{3052,9566,0,1,6}" + }, + { + "npc_id": "112", + "loc_data": "{2699,3206,0,1,1}-{3165,9880,0,1,3}-{3168,9880,0,1,1}-{3159,9903,0,1,4}-{2825,3249,0,1,6}-{3156,9907,0,1,0}-{2554,3411,0,1,3}-{2560,3406,0,1,3}-{2554,3400,0,1,3}-{2551,3401,0,1,4}-{3202,5490,0,1,4}-{3237,5555,0,1,5}-{2543,9823,0,1,3}-{2540,9819,0,1,5}-{2543,9817,0,1,4}" + }, + { + "npc_id": "113", + "loc_data": "{2622,3272,0,0,0}-{2896,2946,0,0,0}-{2918,2961,0,0,0}-{2926,2986,0,0,0}-{2930,3044,0,0,0}-{2926,3056,0,0,0}-{2916,3065,0,0,0}-{2835,9526,0,1,4}-{2832,9514,0,1,4}-{2825,9521,0,1,5}-{2846,9520,0,1,3}-{2838,9508,0,1,0}-{2832,9495,0,1,6}-{2838,9492,0,1,6}-{2851,9485,0,1,3}-{2847,9481,0,1,3}-{2865,9494,0,1,3}-{2855,9502,0,1,2}-{2870,9496,0,1,1}-{2851,9511,0,1,2}-{2853,9519,0,1,3}-{2857,9520,0,1,6}-{2863,9525,0,1,1}-{2869,9530,0,1,5}-{2865,9515,0,1,4}-{2868,9507,0,1,3}-{2874,9512,0,1,6}" + }, + { + "npc_id": "115", + "loc_data": "{2572,3028,0,1,2}-{2550,3046,0,1,4}-{2572,3034,0,1,3}-{2576,3026,0,1,4}-{2534,2975,0,1,1}-{2518,2974,0,1,1}-{2573,2987,0,1,1}-{2592,2967,0,1,3}-{2589,2961,0,0,2}-{2575,2989,0,1,0}-{2574,2992,0,1,4}-{2521,2974,0,1,4}-{2500,3092,0,1,6}-{2524,3375,0,1,3}-{2524,3374,0,1,3}-{2529,3374,0,1,3}-{2532,3375,0,1,1}-{2532,3373,0,1,1}-{2527,3376,0,1,6}-{2525,3373,0,1,7}-{2525,3373,0,1,5}-{2511,3086,0,1,1}-{2511,3084,0,1,3}-{2503,3114,0,1,6}-{2509,3120,0,1,4}-{2506,3107,0,1,4}-{2500,3112,0,1,4}-{2521,3045,0,1,6}-{2517,3043,0,1,5}-{2500,3095,0,1,3}-{2497,3090,0,1,4}-{2502,3099,0,1,4}-{2504,3097,0,1,4}-{2503,3134,0,1,3}-{2554,3196,0,1,7}-{2519,3039,0,1,4}" + }, + { + "npc_id": "116", + "loc_data": "{2622,3277,0,1,5}" + }, + { + "npc_id": "117", + "loc_data": "{2907,9737,0,1,5}-{2913,9733,0,1,2}-{2904,9728,0,1,6}-{2902,9736,0,1,3}-{2908,9732,0,1,4}-{2909,9726,0,1,1}-{3118,9845,0,1,4}-{3111,9844,0,1,6}-{3123,9845,0,1,3}-{3114,9833,0,1,3}-{3110,9841,0,1,1}-{3119,9839,0,1,1}-{3097,9832,0,1,0}-{3101,9832,0,1,1}-{3107,9829,0,1,3}-{3115,9831,0,1,4}-{3109,9835,0,1,4}-{3044,10321,0,1,2}-{3044,10316,0,1,4}-{3045,10308,0,1,4}-{3048,10317,0,1,2}-{2548,3146,0,1,1}-{2542,3145,0,1,4}-{2503,3150,0,1,4}" + }, + { + "npc_id": "118", + "loc_data": "{3042,3465,0,1,1}-{3035,3443,0,1,6}-{3042,3468,0,1,3}-{3008,3449,0,1,4}-{3000,9842,0,1,2}-{2996,9844,0,1,4}-{3003,9828,0,1,1}-{2995,9811,0,1,3}-{3002,9811,0,1,3}-{2994,9809,0,1,5}-{3004,9813,0,1,6}-{2998,9828,0,1,4}-{3004,9799,0,1,4}-{2997,9809,0,1,0}-{3019,9813,0,1,4}-{2983,9807,0,1,6}-{3012,9812,0,1,3}-{3010,9811,0,1,3}-{2964,9811,0,1,1}-{3025,9801,0,1,4}-{3026,9824,0,1,1}-{3018,9819,0,1,6}-{3028,9815,0,1,3}-{3024,9811,0,1,4}-{3021,9826,0,1,5}-{3022,9832,0,1,1}-{3023,9833,0,1,6}-{3027,9833,0,1,3}-{3028,9828,0,1,6}-{3023,9814,0,1,6}-{3042,9831,0,1,4}-{3024,9824,0,1,6}-{3019,9847,0,1,0}-{3034,9847,0,1,7}-{3021,9851,0,1,5}-{3043,9824,0,1,3}-{3038,9821,0,1,1}-{3044,9818,0,1,4}-{3047,9814,0,1,4}-{3037,9814,0,1,6}-{2603,3056,0,1,0}-{2598,3064,0,1,3}-{2589,3068,0,1,5}" + }, + { + "npc_id": "119", + "loc_data": "{3248,3794,0,1,1}-{2925,9766,0,1,7}-{2921,9758,0,1,3}-{2935,9770,0,1,1}-{2935,9761,0,1,0}-{3029,10313,0,1,4}-{3028,10309,0,1,4}-{3033,10311,0,1,6}-{3035,10309,0,1,1}-{3035,10313,0,1,1}-{3244,3797,0,1,3}-{3245,3790,0,1,4}-{3239,3781,0,1,5}-{3253,3791,0,1,1}-{3245,3802,0,1,1}-{3250,3808,0,1,3}-{3246,3800,0,1,6}-{3246,3795,0,1,2}" + }, + { + "npc_id": "122", + "loc_data": "{2996,9574,0,1,6}-{3007,9579,0,1,7}-{3001,9580,0,1,4}-{3018,9580,0,1,3}-{3021,9585,0,1,4}-{3024,9582,0,1,4}-{2507,3726,0,1,2}-{2523,3724,0,1,3}-{2535,9556,0,1,4}" + }, + { + "npc_id": "123", + "loc_data": "{3023,3801,0,1,4}-{3021,3805,0,1,0}-{3026,3805,0,1,1}-{3029,3801,0,1,3}-{3020,3808,0,1,3}-{3027,3810,0,1,6}-{3032,3805,0,1,1}-{2533,9554,0,1,4}-{2531,9556,0,1,5}-{2522,9562,0,1,4}-{2524,9558,0,1,4}-{2518,9562,0,1,6}-{2515,9566,0,1,3}-{2517,9573,0,1,1}" + }, + { + "npc_id": "124", + "loc_data": "{3118,9974,0,1,6}-{3119,9971,0,1,3}-{3120,9976,0,1,3}-{3124,9974,0,1,6}-{3142,5532,0,1,6}-{3141,5531,0,1,6}-{3139,5526,0,1,3}-{3143,5524,0,1,3}-{3148,5523,0,1,4}-{3148,5531,0,1,4}" + }, + { + "npc_id": "125", + "loc_data": "{2969,3916,0,1,0}-{2963,3928,0,1,0}-{2973,3941,0,1,0}-{2951,3908,0,1,0}-{2950,3912,0,1,0}-{2952,3915,0,1,0}-{2948,3917,0,1,0}-{2951,3923,0,1,0}-{2956,3924,0,1,0}-{2957,3931,0,1,0}-{2950,3939,0,1,0}-{2845,3517,0,1,4}-{2848,3515,0,1,4}-{3050,9570,0,1,3}-{2958,3867,0,1,3}-{2956,3857,0,1,6}-{2952,3862,0,1,3}-{2949,3858,0,1,4}-{2955,3875,0,1,7}-{2954,3874,0,1,5}-{2962,3876,0,1,1}-{2961,3877,0,1,3}-{2947,3878,0,1,6}-{2959,3884,0,1,4}-{2956,3885,0,1,3}-{2956,3886,0,1,3}-{2948,3886,0,1,1}-{3043,9579,0,1,2}-{3056,9585,0,1,0}-{3058,9575,0,1,1}-{3052,9582,0,1,0}-{3049,9577,0,1,4}-{3042,9586,0,1,6}-{3052,9588,0,1,1}-{3049,9590,0,1,5}-{3060,9578,0,1,3}-{3054,9566,0,1,7}-{3227,5443,0,1,5}-{3220,5448,0,1,5}-{3208,5443,0,1,6}-{3207,5448,0,1,4}" + }, + { + "npc_id": "126", + "loc_data": "{2381,4422,0,1,5}-{2381,4425,0,1,4}-{2382,4429,0,1,0}-{2385,4419,0,1,0}-{2388,4421,0,1,1}-{2388,4428,0,1,4}" + }, + { + "npc_id": "127", + "loc_data": "{2956,9794,0,0,0}-{2954,9786,0,0,0}-{2966,9790,0,0,0}-{2963,9781,0,0,0}-{3193,3959,0,0,0}-{3188,3960,0,0,0}-{3190,3962,0,0,0}-{3187,3959,0,0,0}-{3192,3961,0,0,0}-{3187,3960,0,0,0}-{3193,3959,0,0,0}-{3187,3961,0,0,0}" + }, + { + "npc_id": "128", + "loc_data": "{2610,3274,0,0,0}-{2610,3275,0,0,0}-{2615,3276,0,0,0}-{2616,3275,0,0,0}-{2616,3276,0,0,0}-{3193,3958,0,0,0}-{2877,3154,0,0,0}-{2878,3153,0,0,0}-{2870,3161,0,0,0}-{2822,3192,0,1,5}-{2770,3213,0,0,0}-{2759,3179,0,0,0}-{2741,3173,0,0,0}-{2757,3170,0,0,0}-{2746,3167,0,0,0}-{2784,3173,0,0,0}-{2746,3147,0,0,0}-{2733,3162,0,0,0}-{2730,3146,0,0,0}-{2782,3104,0,0,0}-{2782,3103,0,0,0}-{2777,3090,0,0,0}-{2773,3089,0,0,0}-{2803,3115,0,0,0}-{2808,3112,0,0,0}-{2887,3145,0,0,0}-{2824,3084,0,0,0}-{2821,3078,0,0,0}-{2817,3078,0,0,0}-{2837,3076,0,0,0}-{2844,3040,0,0,0}-{2840,3049,0,0,0}-{2837,3043,0,0,0}-{2834,3042,0,0,0}-{2827,3026,0,0,0}-{2824,3018,0,0,0}-{2830,3021,0,0,0}-{2832,3018,0,0,0}-{2925,2969,0,0,0}-{2939,2977,0,0,0}-{2936,2980,0,0,0}-{2933,2976,0,0,0}-{2930,2971,0,0,0}-{2928,2984,0,0,0}-{2942,2983,0,0,0}-{2936,2989,0,0,0}" + }, + { + "npc_id": "131", + "loc_data": "{2594,3271,0,1,4}-{2593,3269,0,1,1}-{2592,3272,0,1,6}" + }, + { + "npc_id": "132", + "loc_data": "{2600,3275,0,1,6}-{2600,3279,0,1,4}-{2603,3279,0,1,3}-{2603,3281,0,1,3}-{2604,3277,0,1,6}-{2867,3163,0,1,3}-{2883,3147,0,1,6}-{2856,3144,0,1,7}-{2812,3180,0,1,1}-{2791,3181,0,1,3}-{2749,3173,0,1,3}-{2758,3170,0,1,4}-{2754,3167,0,1,3}-{2754,3175,0,1,1}-{2891,3079,0,1,1}-{2897,3064,0,1,0}-{2896,3071,0,1,1}-{2837,3038,0,1,0}-{2837,3041,0,1,3}-{2831,3031,0,1,3}-{2818,3054,0,1,4}-{2832,3050,0,1,6}-{2832,3011,0,1,4}-{2784,3005,0,1,1}-{2782,3008,0,1,1}-{2791,2999,0,1,2}-{2791,2988,0,1,1}-{2795,2987,0,1,6}-{2797,2985,0,1,3}-{2876,3011,0,1,3}-{2863,3021,0,1,3}-{2867,3016,0,1,1}-{2871,3022,0,1,4}-{2877,3028,0,1,3}-{2868,3012,0,1,4}-{2910,3026,0,1,5}-{2902,3010,0,1,1}-{2928,3029,0,1,4}-{2920,3027,0,1,6}-{2875,2936,0,1,2}-{2945,2979,0,1,3}-{2953,2965,0,1,4}-{2952,2982,0,1,4}-{2955,3003,0,1,3}-{2944,2999,0,1,5}-{2932,3023,0,1,3}-{2933,3024,0,1,3}-{2929,3009,0,1,0}-{2927,3022,0,1,1}-{2926,3023,0,1,6}-{2927,3020,0,1,7}-{2908,3078,0,1,4}-{2920,3081,0,1,4}-{2890,3082,0,1,1}-{2916,3082,0,1,1}" + }, + { + "npc_id": "133", + "loc_data": "{3079,3618,0,0,7}-{3070,3629,0,0,3}-{3073,3634,0,0,6}-{3088,3636,0,0,3}-{3092,3637,0,0,2}-{3073,3636,0,0,0}-{3070,3657,0,0,5}-{3109,3634,0,0,2}-{3114,3628,0,0,1}-{3107,3626,0,0,2}-{3118,3639,0,0,5}-{3119,3627,0,0,3}-{3119,3604,0,0,1}-{3136,3612,0,0,5}-{3124,3586,0,0,0}" + }, + { + "npc_id": "134", + "loc_data": "{3088,9945,0,1,3}-{3089,9943,0,1,0}-{3090,9944,0,1,7}-{3043,10262,0,1,1}-{3044,10252,0,1,4}-{3051,10257,0,1,3}-{3055,10253,0,1,3}-{3067,10255,0,1,3}-{3067,10257,0,1,3}-{3068,10253,0,1,2}-{3069,10257,0,1,4}-{3069,10259,0,1,0}-{2876,9810,0,1,4}-{2876,9803,0,1,5}-{2869,9799,0,1,4}-{2858,9804,0,1,7}-{2857,9821,0,1,4}-{2869,9816,0,1,0}-{2849,9817,0,1,6}-{3278,5477,0,1,1}-{3278,5476,0,1,2}-{3277,5451,0,1,5}-{3283,5449,0,1,4}-{3280,5476,0,1,3}-{3274,5463,0,1,1}-{3272,5477,0,1,1}-{3271,5473,0,1,4}-{3270,5459,0,1,1}-{3271,5454,0,1,3}-{3278,5525,0,1,3}-{3272,5529,0,1,3}-{3270,5536,0,1,6}-{3277,5536,0,1,4}-{3277,5512,0,1,3}-{3279,5516,0,1,6}-{3280,5531,0,1,6}-{2598,9558,0,1,6}-{2599,9557,0,1,4}-{2598,9556,0,1,4}-{2600,9555,0,1,3}-{2601,9553,0,1,1}-{2572,9569,0,1,3}-{2599,9552,0,1,6}-{2601,9560,0,1,1}-{2599,9564,0,1,6}-{2600,9563,0,1,4}-{2597,9569,0,1,1}-{2594,9571,0,1,2}-{2589,9571,0,1,4}-{2589,9574,0,1,3}-{2584,9572,0,1,6}-{2581,9575,0,1,6}-{2583,9577,0,1,6}-{2582,9572,0,1,3}-{2572,9568,0,1,1}-{2570,9567,0,1,1}-{2572,9571,0,1,3}-{2575,9572,0,1,0}-{2577,9574,0,1,3}-{2580,9578,0,1,3}-{2597,9572,0,1,6}" + }, + { + "npc_id": "138", + "loc_data": "{2375,3434,0,1,4}-{2379,3438,0,1,6}" + }, + { + "npc_id": "139", + "loc_data": "{2378,3432,0,1,2}-{2375,3438,0,1,7}-{2376,3431,0,1,1}-{2380,3438,0,1,4}" + }, + { + "npc_id": "141", + "loc_data": "{3324,5510,0,1,3}-{3286,5512,0,1,1}-{3310,5524,0,1,2}-{3289,5527,0,1,7}-{3296,5519,0,1,4}" + }, + { + "npc_id": "142", + "loc_data": "{2514,3194,0,1,3}-{2547,3178,0,1,1}" + }, + { + "npc_id": "143", + "loc_data": "{2787,2929,0,1,6}-{2835,2934,0,1,4}-{2889,2936,0,1,2}-{2921,2937,0,1,1}" + }, + { + "npc_id": "144", + "loc_data": "{3043,9779,0,1,4}-{3047,9769,0,1,1}-{2847,3282,0,1,6}-{2846,3293,0,1,6}-{2850,3301,0,1,4}-{2852,3308,0,1,4}-{2861,3297,0,1,1}-{2863,3283,0,1,5}" + }, + { + "npc_id": "146", + "loc_data": "{2827,3139,0,1,0}-{2976,3053,0,1,0}-{2985,3038,0,1,0}-{2994,3048,0,1,5}-{2992,3030,0,1,0}-{2896,2992,0,1,7}" + }, + { + "npc_id": "151", + "loc_data": "{2756,3156,0,1,4}-{2760,3152,0,1,6}" + }, + { + "npc_id": "152", + "loc_data": "{3103,3347,0,0,0}-{3107,3337,0,0,0}-{3107,3342,0,0,0}-{3107,3344,0,0,0}-{3108,3346,0,0,0}-{3111,3339,0,0,0}-{3111,3348,0,0,0}-{3115,3344,0,0,0}-{3120,3344,0,0,0}-{3122,3335,0,0,0}" + }, + { + "npc_id": "153", + "loc_data": "{2415,4466,0,0,0}-{2419,4427,0,0,0}-{2421,4468,0,0,0}-{2426,4431,0,0,0}-{2500,3492,0,1,4}-{2245,3147,0,1,4}-{2246,3143,0,1,0}-{2242,3140,0,1,3}-{2247,3149,0,1,1}" + }, + { + "npc_id": "154", + "loc_data": "{2394,4453,0,0,0}-{2394,4457,0,0,0}-{2406,4447,0,0,0}-{2568,3470,0,1,5}-{2523,3164,0,1,4}-{2534,3173,0,1,3}-{2538,3160,0,1,3}-{2246,3144,0,1,4}-{2245,3147,0,1,4}-{2240,3147,0,1,3}-{2247,3142,0,1,5}" + }, + { + "npc_id": "155", + "loc_data": "{3235,3222,0,0,0}-{3255,3226,0,0,0}-{2561,3471,0,1,0}" + }, + { + "npc_id": "157", + "loc_data": "{2502,3521,0,1,5}" + }, + { + "npc_id": "162", + "loc_data": "{2480,3426,0,1,6}-{2489,3429,0,1,1}-{2480,3431,0,1,0}-{2475,3418,0,1,4}-{2470,3423,0,1,1}" + }, + { + "npc_id": "166", + "loc_data": "{2450,3480,1,0,1}-{2449,3480,1,0,1}-{2448,3480,1,0,1}-{2440,3488,1,0,4}-{2440,3487,1,0,4}-{2448,3427,1,0,6}-{2448,3424,1,0,6}-{2443,3424,1,0,3}-{2443,3425,1,0,3}" + }, + { + "npc_id": "170", + "loc_data": "{2890,3175,0,1,4}" + }, + { + "npc_id": "172", + "loc_data": "{3225,3369,0,1,3}-{3226,3371,0,1,7}-{3230,3372,0,1,0}-{3230,3370,0,1,3}-{3229,3368,0,1,1}-{3227,3367,0,1,1}" + }, + { + "npc_id": "174", + "loc_data": "{3095,3232,0,1,6}-{3095,3231,0,1,0}-{3225,3370,0,1,4}-{3230,3370,0,1,3}" + }, + { + "npc_id": "175", + "loc_data": "{3084,3495,0,1,4}-{2994,9549,0,1,6}-{2993,9551,0,1,6}-{2995,9555,0,1,6}-{2999,9548,0,1,0}-{3182,3365,0,1,6}" + }, + { + "npc_id": "178", + "loc_data": "{2892,9709,0,1,6}-{2915,9708,0,1,7}-{2899,9702,0,1,1}-{2907,9711,0,1,4}-{2938,9811,0,1,6}-{3096,3220,0,1,1}-{3273,3507,0,1,6}" + }, + { + "npc_id": "179", + "loc_data": "{3025,3511,1,1,3}-{3038,3505,0,1,4}-{3026,3494,0,1,6}-{3026,3505,0,1,4}-{3026,3512,0,1,6}-{3025,3512,0,1,4}-{3027,3512,0,1,6}-{3030,3511,0,1,6}-{3028,3511,0,1,1}-{3039,3855,0,1,4}-{3031,3852,0,1,1}-{3032,3849,0,1,3}-{3023,3849,0,1,6}-{3022,3847,0,1,3}-{3023,3514,1,1,3}-{3014,3516,2,1,1}" + }, + { + "npc_id": "180", + "loc_data": "{2744,3519,0,0,0}-{2957,3238,0,1,4}-{2988,3423,0,1,7}-{2953,3240,0,1,3}-{3011,3277,0,1,1}-{3009,3280,0,1,1}-{3110,3295,0,1,4}" + }, + { + "npc_id": "181", + "loc_data": "{3105,9942,0,1,3}-{3106,9934,0,1,3}-{3109,9930,0,1,1}-{2937,9847,0,0,0}-{2930,9850,0,0,0}-{2934,9846,0,0,0}-{2930,9845,0,0,0}-{2563,3355,0,1,4}-{2561,3355,0,1,3}-{2561,3357,0,1,1}-{2563,3358,0,1,4}" + }, + { + "npc_id": "182", + "loc_data": "{3041,3958,0,0,0}-{3043,3958,0,0,0}-{3039,3958,0,0,0}-{3039,3950,0,0,0}-{3041,3958,0,0,0}-{3041,3954,0,0,0}-{3038,3957,0,0,0}-{3041,3954,0,0,0}-{3038,3955,0,0,0}-{3690,2966,0,1,4}" + }, + { + "npc_id": "183", + "loc_data": "{3043,3958,0,0,0}-{3043,3950,0,0,0}-{3042,3950,0,0,0}-{3039,3951,0,0,0}-{3044,3949,0,0,0}-{2805,3160,0,0,0}-{2803,3190,0,1,4}-{2795,3167,0,0,0}-{2793,3184,0,1,3}-{3670,2977,0,1,1}-{3654,2960,0,1,0}-{3698,2969,0,1,2}-{3676,2991,0,1,3}-{3666,2994,0,1,7}-{3666,2981,1,1,4}" + }, + { + "npc_id": "184", + "loc_data": "{2994,9584,0,1,6}-{2992,9573,0,1,1}-{2990,9583,0,1,4}-{2998,9572,0,1,2}-{2998,9573,0,1,4}-{2989,9578,0,1,0}-{2993,9566,0,1,4}-{2994,9570,0,1,3}-{3659,2952,0,1,6}-{3669,2961,0,1,4}-{3683,2977,0,1,6}-{3668,2981,0,1,3}-{3655,2973,0,1,1}-{3675,2967,0,1,3}" + }, + { + "npc_id": "186", + "loc_data": "{3158,3571,0,0,7}-{3170,3575,0,0,0}-{3172,3578,0,0,5}-{3175,3564,0,0,4}-{3176,3570,0,0,2}-{3180,3565,0,0,5}-{3189,3565,0,0,7}-{3189,3580,0,0,0}-{3192,3568,0,0,7}-{3159,3563,0,0,1}-{3163,3572,0,0,6}-{3173,3574,0,0,3}-{3179,3561,0,0,2}" + }, + { + "npc_id": "187", + "loc_data": "{3291,3924,0,1,4}-{3294,3930,0,1,4}-{3286,3933,0,1,6}-{3285,3928,0,1,6}-{3287,3935,1,1,6}-{3286,3927,1,1,6}-{3283,3936,2,1,6}-{3292,3932,1,1,4}-{3291,3940,0,1,6}-{3280,3943,0,1,6}-{3278,3926,0,1,4}" + }, + { + "npc_id": "188", + "loc_data": "{2933,3516,0,1,3}-{2935,3515,0,1,3}-{2932,3514,0,1,2}-{3158,5497,0,1,6}-{3157,5494,0,1,1}-{3155,5498,0,1,6}-{3140,5494,0,1,6}-{3143,5493,0,1,5}-{3142,5497,0,1,4}-{3156,5494,0,1,5}-{3148,5496,0,1,4}" + }, + { + "npc_id": "189", + "loc_data": "{3151,5489,0,1,7}-{3145,5495,0,1,3}-{3142,5493,0,1,3}-{3149,5489,0,1,6}-{3155,5491,0,1,2}-{3142,5497,0,1,3}" + }, + { + "npc_id": "190", + "loc_data": "{2837,9815,0,1,1}-{2833,9814,0,1,2}-{2831,9808,0,1,3}-{2829,9804,0,1,7}-{2825,9806,0,1,1}-{2828,9809,0,1,3}-{2826,9813,0,1,6}" + }, + { + "npc_id": "191", + "loc_data": "{2730,3161,0,0,0}-{2729,3159,0,0,0}-{2727,3163,0,0,0}-{2725,3157,0,0,0}-{2726,3161,0,0,0}-{2725,3161,0,0,0}-{2723,3155,0,0,0}-{2723,3156,0,0,0}-{2725,3162,0,0,0}-{2775,3066,0,0,0}-{2802,3071,0,0,0}-{2868,3053,0,0,0}-{2770,3018,0,0,0}-{2770,3014,0,0,0}-{2840,3018,0,0,0}-{2919,2983,0,0,0}-{2937,2993,0,0,0}-{2940,2994,0,0,0}-{2940,2997,0,0,0}-{2942,2997,0,0,0}" + }, + { + "npc_id": "192", + "loc_data": "{3027,3612,0,1,6}-{3021,3611,0,1,1}-{3036,3613,0,1,4}-{3024,3606,0,1,1}-{3023,3634,0,1,3}-{3026,3637,0,1,5}-{3031,3637,0,1,2}-{3035,3637,0,1,6}-{3034,3632,0,1,6}-{3035,3629,0,1,6}-{3035,3625,0,1,5}-{3029,3626,0,1,3}-{3032,3626,0,1,4}-{3022,3626,0,1,1}-{3023,3623,0,1,6}" + }, + { + "npc_id": "193", + "loc_data": "{2581,9505,0,1,4}-{2594,9497,0,1,1}-{2593,9499,0,1,7}-{2587,9498,0,1,3}-{2573,9500,0,1,5}-{2579,9503,0,1,5}-{2580,9500,0,1,4}-{2578,9497,0,1,7}" + }, + { + "npc_id": "195", + "loc_data": "{3042,3708,0,0,6}-{3037,3702,0,0,5}" + }, + { + "npc_id": "196", + "loc_data": "{3038,3670,0,1,1}-{3034,3674,0,1,2}" + }, + { + "npc_id": "198", + "loc_data": "{3190,3358,0,1,1}" + }, + { + "npc_id": "199", + "loc_data": "{3079,3443,0,1,3}" + }, + { + "npc_id": "201", + "loc_data": "{2931,9692,0,0,0}" + }, + { + "npc_id": "205", + "loc_data": "{2613,9523,0,1,0}" + }, + { + "npc_id": "206", + "loc_data": "{3026,3455,0,1,6}-{3015,3458,0,1,5}" + }, + { + "npc_id": "208", + "loc_data": "{2568,3459,0,1,4}" + }, + { + "npc_id": "209", + "loc_data": "{3013,3452,0,1,6}" + }, + { + "npc_id": "216", + "loc_data": "{2851,3348,0,0,7}" + }, + { + "npc_id": "217", + "loc_data": "{2852,3343,0,1,2}" + }, + { + "npc_id": "218", + "loc_data": "{2613,3475,0,1,2}" + }, + { + "npc_id": "222", + "loc_data": "{2851,3351,0,0,7}-{2849,3348,0,0,7}" + }, + { + "npc_id": "225", + "loc_data": "{2641,3437,0,0,0}" + }, + { + "npc_id": "227", + "loc_data": "{2643,3440,0,0,0}" + }, + { + "npc_id": "228", + "loc_data": "{2634,3427,0,0,0}" + }, + { + "npc_id": "229", + "loc_data": "{2628,3413,0,1,4}" + }, + { + "npc_id": "230", + "loc_data": "{2649,3454,0,0,0}" + }, + { + "npc_id": "231", + "loc_data": "{2650,3468,0,0,0}" + }, + { + "npc_id": "232", + "loc_data": "{2819,3487,0,0,4}" + }, + { + "npc_id": "237", + "loc_data": "{2769,3403,0,1,0}-{2766,3402,0,1,3}-{2770,3402,0,1,0}-{2772,3404,0,1,1}-{2767,3405,1,1,0}-{2771,3403,1,1,6}-{2767,3401,1,1,7}" + }, + { + "npc_id": "239", + "loc_data": "{2758,3516,1,0,0}" + }, + { + "npc_id": "240", + "loc_data": "{2760,3501,0,1,1}" + }, + { + "npc_id": "241", + "loc_data": "{2762,3498,0,0,0}" + }, + { + "npc_id": "242", + "loc_data": "{2764,3509,1,0,0}" + }, + { + "npc_id": "243", + "loc_data": "{2756,3513,1,0,0}" + }, + { + "npc_id": "244", + "loc_data": "{2765,3504,1,0,0}" + }, + { + "npc_id": "245", + "loc_data": "{2755,3517,0,0,0}" + }, + { + "npc_id": "247", + "loc_data": "{2769,3402,2,1,5}" + }, + { + "npc_id": "250", + "loc_data": "{2924,3405,0,0,1}" + }, + { + "npc_id": "251", + "loc_data": "{2761,3512,0,0,0}" + }, + { + "npc_id": "253", + "loc_data": "{2616,3172,0,1,1}-{2583,3142,0,1,6}" + }, + { + "npc_id": "254", + "loc_data": "{2565,3150,0,1,6}-{2564,3146,0,1,5}-{2572,3143,0,1,4}" + }, + { + "npc_id": "255", + "loc_data": "{2601,3195,0,1,3}-{2615,3188,0,1,6}-{2606,3186,0,1,3}" + }, + { + "npc_id": "256", + "loc_data": "{2568,3144,0,1,3}-{2606,3180,0,1,5}-{2600,3184,0,1,4}-{2598,3185,0,1,6}-{2593,3175,0,1,2}-{2594,3182,0,1,3}-{2594,3188,0,1,3}-{2593,3193,0,1,3}-{2592,3179,0,1,1}-{2605,3171,0,1,3}-{2581,3170,0,1,6}-{2580,3166,0,1,6}-{2577,3163,0,1,1}-{2585,3150,0,1,4}" + }, + { + "npc_id": "259", + "loc_data": "{2567,3140,0,0,0}" + }, + { + "npc_id": "260", + "loc_data": "{2589,3142,0,0,0}" + }, + { + "npc_id": "261", + "loc_data": "{2587,3142,0,0,0}" + }, + { + "npc_id": "262", + "loc_data": "{2616,3162,0,0,0}-{2616,3161,0,0,0}-{2596,3142,0,0,0}" + }, + { + "npc_id": "263", + "loc_data": "{2597,3143,0,0,0}" + }, + { + "npc_id": "265", + "loc_data": "{2616,3167,0,0,0}" + }, + { + "npc_id": "267", + "loc_data": "{2601,3168,0,0,0}" + }, + { + "npc_id": "268", + "loc_data": "{2583,3171,0,0,0}" + }, + { + "npc_id": "278", + "loc_data": "{3209,3215,0,0,0}" + }, + { + "npc_id": "279", + "loc_data": "{2604,3209,0,0,0}" + }, + { + "npc_id": "281", + "loc_data": "{2604,3219,0,0,0}-{2609,3207,0,0,0}-{2618,3211,0,0,0}" + }, + { + "npc_id": "282", + "loc_data": "{3280,3494,0,1,6}" + }, + { + "npc_id": "284", + "loc_data": "{2953,3450,0,0,0}" + }, + { + "npc_id": "285", + "loc_data": "{3110,3330,0,0,0}" + }, + { + "npc_id": "286", + "loc_data": "{3111,3367,2,0,4}" + }, + { + "npc_id": "287", + "loc_data": "{2770,3403,2,1,3}" + }, + { + "npc_id": "288", + "loc_data": "{3110,3366,2,0,2}-{2677,3655,0,1,3}-{2681,3653,0,1,6}" + }, + { + "npc_id": "289", + "loc_data": "{2616,3302,0,1,3}" + }, + { + "npc_id": "290", + "loc_data": "{2614,3306,0,1,4}" + }, + { + "npc_id": "296", + "loc_data": "{3084,3518,0,1,1}" + }, + { + "npc_id": "297", + "loc_data": "{3093,3518,0,1,5}" + }, + { + "npc_id": "298", + "loc_data": "{3113,3513,0,1,3}" + }, + { + "npc_id": "299", + "loc_data": "{3113,3511,0,1,3}" + }, + { + "npc_id": "300", + "loc_data": "{3105,9569,0,0,0}" + }, + { + "npc_id": "302", + "loc_data": "{2519,3429,0,1,1}" + }, + { + "npc_id": "304", + "loc_data": "{2520,3496,0,1,3}" + }, + { + "npc_id": "305", + "loc_data": "{2511,3484,0,0,4}" + }, + { + "npc_id": "306", + "loc_data": "{2514,9580,0,1,1}" + }, + { + "npc_id": "307", + "loc_data": "{2968,3206,0,0,0}" + }, + { + "npc_id": "308", + "loc_data": "{2611,3393,0,1,4}" + }, + { + "npc_id": "309", + "loc_data": "{2273,3247,0,0,4}-{2267,3253,0,0,4}-{2266,3253,0,0,4}-{2262,3249,0,0,4}-{2716,3530,0,0,0}-{2561,3374,0,0,4}-{2562,3374,0,0,4}-{2633,3693,0,0,4}-{2633,3694,0,0,4}-{2215,3248,0,0,4}-{2217,3245,0,0,4}-{2213,3241,0,0,4}-{3104,3424,0,0,0}-{3104,3425,0,0,0}-{2566,3370,0,0,0}-{2637,3444,0,0,0}-{2471,3146,0,0,4}-{2465,3156,0,0,4}-{2461,3150,0,0,4}-{2678,3595,0,0,4}-{2689,3598,0,0,4}" + }, + { + "npc_id": "310", + "loc_data": "{2382,3414,0,0,4}-{2537,3406,0,0,4}-{2527,3412,0,0,4}-{2507,3421,0,0,4}-{2508,3421,0,0,4}-{3239,3243,0,0,6}-{3239,3241,0,0,6}-{3238,3252,0,0,6}-{2860,2972,0,0,6}-{2865,2972,0,0,4}-{2382,3415,0,0,0}-{2392,3420,0,0,0}" + }, + { + "npc_id": "312", + "loc_data": "{2860,3426,0,0,1}" + }, + { + "npc_id": "313", + "loc_data": "{2853,3423,0,0,1}-{2840,3356,0,0,1}-{2843,3359,0,0,1}-{2848,3361,0,0,1}-{2879,3339,0,0,1}-{2879,3338,0,0,1}-{2879,3335,0,0,1}-{2879,3334,0,0,1}-{2876,3331,0,0,1}" + }, + { + "npc_id": "316", + "loc_data": "{2986,3176,0,0,4}-{3086,3227,0,0,1}-{2996,3157,0,0,1}-{3085,3230,0,0,0}" + }, + { + "npc_id": "322", + "loc_data": "{2641,3700,0,0,4}-{2640,3700,0,0,4}-{2777,2740,0,0,4}-{2780,2741,0,0,4}-{2788,2741,0,0,4}-{2771,2733,0,0,4}-{2771,2734,0,0,4}" + }, + { + "npc_id": "323", + "loc_data": "{3259,3204,0,0,3}-{3248,3161,0,0,4}-{3259,3206,0,0,3}-{2516,3575,0,0,7}-{2511,3562,0,0,7}-{2498,3547,0,0,7}" + }, + { + "npc_id": "324", + "loc_data": "{2645,3708,0,0,1}-{2648,3708,0,0,1}-{2632,3427,0,0,0}-{2647,3711,0,0,1}" + }, + { + "npc_id": "325", + "loc_data": "{2671,3160,0,0,4}-{2672,3160,0,0,4}-{2678,3160,0,0,4}-{2682,3160,0,0,4}-{2683,3160,0,0,4}" + }, + { + "npc_id": "326", + "loc_data": "{2840,3431,0,0,0}-{3246,3156,0,0,0}-{3245,3152,0,0,0}-{3242,3148,0,0,0}-{2855,3423,0,0,1}-{3267,3148,0,0,6}-{3276,3140,0,0,6}-{3275,3140,0,0,6}-{3169,3266,0,0,3}-{3173,3274,0,0,3}-{2607,3416,0,0,1}-{2604,3417,0,0,1}-{2602,3419,0,0,1}" + }, + { + "npc_id": "333", + "loc_data": "{2845,3429,0,0,6}-{2923,3178,0,0,6}-{2923,3180,0,0,6}-{2926,3180,0,0,6}-{2926,3177,0,0,6}-{2602,3411,0,0,3}-{2605,3413,0,0,3}-{2609,3416,0,0,3}-{2610,3413,0,0,3}-{2605,3421,0,0,1}-{2602,3423,0,0,1}-{2603,3426,0,0,1}-{3128,3510,0,0,1}" + }, + { + "npc_id": "334", + "loc_data": "{2164,3282,0,0,4}-{2162,3274,0,0,4}-{2639,3698,0,0,4}-{2642,3698,0,0,4}-{2699,2702,0,0,4}-{2694,2706,0,0,4}-{2700,2702,0,0,4}-{2707,2698,0,0,4}-{2612,3411,0,0,0}-{2627,3415,0,0,0}-{2700,2702,0,0,0}-{2700,2702,0,0,0}-{2700,2702,0,0,0}-{2707,2698,0,0,0}-{2707,2698,0,0,0}-{2707,2698,0,0,0}" + }, + { + "npc_id": "336", + "loc_data": "{2928,3218,0,1,4}" + }, + { + "npc_id": "338", + "loc_data": "{2929,3222,0,0,6}" + }, + { + "npc_id": "340", + "loc_data": "{2929,3217,0,1,6}" + }, + { + "npc_id": "342", + "loc_data": "{3281,3382,0,0,0}" + }, + { + "npc_id": "343", + "loc_data": "{3284,3382,0,0,0}" + }, + { + "npc_id": "344", + "loc_data": "{3016,3187,1,1,0}-{3015,3183,1,1,0}-{3014,3181,1,1,0}-{3011,3185,1,1,0}" + }, + { + "npc_id": "345", + "loc_data": "{3018,3185,2,1,0}" + }, + { + "npc_id": "347", + "loc_data": "{2523,3292,0,0,0}-{2536,3294,0,0,0}-{2538,3321,0,0,0}" + }, + { + "npc_id": "348", + "loc_data": "{2501,3315,0,0,0}-{2513,3325,0,0,0}-{2526,3279,0,0,0}-{2528,3297,0,0,0}-{2535,3288,0,0,0}-{2548,3287,0,0,0}" + }, + { + "npc_id": "349", + "loc_data": "{2556,3266,0,0,0}" + }, + { + "npc_id": "350", + "loc_data": "{2559,3266,0,0,0}" + }, + { + "npc_id": "351", + "loc_data": "{2507,3325,0,1,4}" + }, + { + "npc_id": "352", + "loc_data": "{2511,3322,0,1,2}-{2540,3279,0,1,6}" + }, + { + "npc_id": "353", + "loc_data": "{2504,3326,0,1,1}-{2509,3314,0,1,3}-{2545,3278,0,1,3}" + }, + { + "npc_id": "354", + "loc_data": "{2510,3318,0,1,6}-{2524,3271,0,1,3}" + }, + { + "npc_id": "355", + "loc_data": "{2504,3318,0,0,0}" + }, + { + "npc_id": "356", + "loc_data": "{2523,3307,0,0,0}" + }, + { + "npc_id": "357", + "loc_data": "{2518,3309,0,0,0}-{2526,3303,0,0,0}-{2543,3309,0,0,0}-{2550,3319,0,0,0}-{2552,3319,0,0,0}" + }, + { + "npc_id": "358", + "loc_data": "{2529,3285,0,0,0}" + }, + { + "npc_id": "360", + "loc_data": "{2550,3272,0,1,4}" + }, + { + "npc_id": "361", + "loc_data": "{2519,3277,0,1,6}" + }, + { + "npc_id": "362", + "loc_data": "{2537,3324,0,1,6}" + }, + { + "npc_id": "363", + "loc_data": "{2513,3315,0,1,4}" + }, + { + "npc_id": "364", + "loc_data": "{2577,3298,1,0,0}" + }, + { + "npc_id": "366", + "loc_data": "{2612,3324,0,0,0}" + }, + { + "npc_id": "367", + "loc_data": "{2935,3210,0,1,2}" + }, + { + "npc_id": "368", + "loc_data": "{3263,3407,0,1,2}" + }, + { + "npc_id": "369", + "loc_data": "{2542,3326,0,0,0}-{2545,3324,0,0,0}-{2545,3327,0,0,0}-{2552,3326,0,0,0}-{2553,3322,0,0,0}-{2553,3324,0,0,0}" + }, + { + "npc_id": "370", + "loc_data": "{2551,3324,1,0,0}-{2551,3327,1,0,0}" + }, + { + "npc_id": "371", + "loc_data": "{2547,3326,0,0,0}-{2549,3322,0,0,0}-{2550,3326,0,0,0}-{2552,3323,0,0,0}" + }, + { + "npc_id": "372", + "loc_data": "{2559,3303,0,0,6}-{2561,3303,0,0,6}-{2561,3305,0,0,4}-{2559,3305,0,0,1}" + }, + { + "npc_id": "373", + "loc_data": "{2516,3274,0,0,0}" + }, + { + "npc_id": "375", + "loc_data": "{3053,3249,0,0,0}" + }, + { + "npc_id": "376", + "loc_data": "{3027,3217,0,1,4}" + }, + { + "npc_id": "377", + "loc_data": "{3028,3223,0,1,2}" + }, + { + "npc_id": "378", + "loc_data": "{3028,3220,0,1,4}" + }, + { + "npc_id": "379", + "loc_data": "{2939,3156,0,1,4}" + }, + { + "npc_id": "380", + "loc_data": "{2953,3149,0,0,0}-{2770,3226,0,0,0}" + }, + { + "npc_id": "381", + "loc_data": "{2684,3272,0,1,4}" + }, + { + "npc_id": "382", + "loc_data": "{3044,9758,0,1,3}" + }, + { + "npc_id": "383", + "loc_data": "{2582,3485,0,1,7}" + }, + { + "npc_id": "384", + "loc_data": "{2545,3568,0,1,7}-{2545,3571,0,1,6}" + }, + { + "npc_id": "385", + "loc_data": "{2549,3568,0,1,6}" + }, + { + "npc_id": "387", + "loc_data": "{3000,3440,1,0,0}" + }, + { + "npc_id": "388", + "loc_data": "{2709,3485,0,1,1}-{2716,3475,0,1,3}-{2697,3472,0,1,6}-{2702,3469,0,1,3}" + }, + { + "npc_id": "389", + "loc_data": "{2704,3405,3,1,3}" + }, + { + "npc_id": "397", + "loc_data": "{3254,3258,0,1,1}-{3264,3258,0,1,2}-{3026,3303,0,1,4}-{2880,3248,0,1,0}-{3259,3279,0,1,6}-{3247,3292,0,1,3}-{3260,3291,0,1,2}-{3247,3282,0,1,5}-{3261,3260,0,1,1}-{3252,3283,0,1,6}" + }, + { + "npc_id": "398", + "loc_data": "{2849,5091,0,0,0}-{2726,3349,0,1,6}" + }, + { + "npc_id": "399", + "loc_data": "{2846,5081,0,0,0}-{2730,3349,0,1,1}" + }, + { + "npc_id": "400", + "loc_data": "{2728,3377,0,1,1}" + }, + { + "npc_id": "401", + "loc_data": "{2800,2943,0,0,0}-{2762,2944,0,0,0}-{2823,2941,0,0,0}-{2861,2941,0,0,0}" + }, + { + "npc_id": "402", + "loc_data": "{2791,2944,0,0,0}-{2762,2943,0,0,0}-{2818,2939,0,0,0}-{2870,2943,0,0,0}-{2933,2944,0,0,0}" + }, + { + "npc_id": "407", + "loc_data": "{3059,4507,0,0,3}" + }, + { + "npc_id": "411", + "loc_data": "{2887,3164,0,0,0}-{2878,3161,0,0,0}" + }, + { + "npc_id": "412", + "loc_data": "{2728,10122,0,1,1}-{2735,10123,0,1,3}-{2733,10129,0,1,1}-{2728,10133,0,1,6}-{2722,10133,0,1,6}-{2736,10137,0,1,1}-{2732,10142,0,1,0}-{2726,10142,0,1,6}-{2729,10140,0,1,3}-{2720,10144,0,1,6}-{2712,10142,0,1,3}-{2760,3402,0,1,4}-{2759,3400,0,1,1}-{2756,3403,0,1,1}-{2759,3400,0,1,3}-{2755,3402,0,1,1}" + }, + { + "npc_id": "419", + "loc_data": "{3195,5450,0,1,6}-{3181,5449,0,1,1}" + }, + { + "npc_id": "420", + "loc_data": "{3175,5454,0,1,4}" + }, + { + "npc_id": "421", + "loc_data": "{3195,5459,0,1,6}-{3186,5454,0,1,5}-{3173,5494,0,1,6}-{3179,5491,0,1,1}-{3185,5492,0,1,4}-{3184,5487,0,1,3}" + }, + { + "npc_id": "423", + "loc_data": "{2731,5340,0,1,7}" + }, + { + "npc_id": "424", + "loc_data": "{2724,5359,0,1,3}" + }, + { + "npc_id": "425", + "loc_data": "{2717,5332,0,1,7}" + }, + { + "npc_id": "428", + "loc_data": "{2361,5209,0,1,4}-{2359,5213,0,1,1}-{2364,5215,0,1,6}-{2361,5216,0,1,1}-{2361,5212,0,1,0}" + }, + { + "npc_id": "429", + "loc_data": "{2363,5214,0,1,6}-{2358,5214,0,1,7}-{2361,5212,0,1,6}" + }, + { + "npc_id": "437", + "loc_data": "{2807,3191,0,0,0}" + }, + { + "npc_id": "444", + "loc_data": "{2551,3197,0,1,1}-{2555,3194,0,1,4}-{2551,3157,0,1,3}-{2525,3155,0,1,3}-{2518,3149,0,1,3}-{2502,3175,0,1,1}" + }, + { + "npc_id": "445", + "loc_data": "{2550,3196,0,1,4}-{2557,3197,0,1,1}-{2538,3155,0,1,7}" + }, + { + "npc_id": "446", + "loc_data": "{2994,3194,0,1,1}-{3285,9896,0,1,1}-{3279,9895,0,1,6}" + }, + { + "npc_id": "447", + "loc_data": "{3114,3242,0,1,1}" + }, + { + "npc_id": "448", + "loc_data": "{3120,3238,0,1,6}" + }, + { + "npc_id": "449", + "loc_data": "{3127,3248,0,1,1}" + }, + { + "npc_id": "450", + "loc_data": "{3081,3220,0,1,0}-{3081,3222,0,1,0}" + }, + { + "npc_id": "451", + "loc_data": "{2994,3215,0,1,2}-{3077,3234,0,1,0}" + }, + { + "npc_id": "452", + "loc_data": "{3223,3293,0,0,0}" + }, + { + "npc_id": "454", + "loc_data": "{2899,3430,1,1,3}" + }, + { + "npc_id": "455", + "loc_data": "{2925,3485,0,1,5}" + }, + { + "npc_id": "456", + "loc_data": "{3244,3205,0,0,0}" + }, + { + "npc_id": "458", + "loc_data": "{3148,3175,0,1,4}" + }, + { + "npc_id": "459", + "loc_data": "{2566,9507,0,1,6}-{2565,9506,0,0,5}-{2566,9507,0,1,3}" + }, + { + "npc_id": "460", + "loc_data": "{2590,9488,0,1,3}" + }, + { + "npc_id": "461", + "loc_data": "{2588,3091,1,1,3}" + }, + { + "npc_id": "462", + "loc_data": "{2590,3084,0,1,5}" + }, + { + "npc_id": "469", + "loc_data": "{2542,3169,0,1,4}" + }, + { + "npc_id": "470", + "loc_data": "{2519,3212,0,1,3}" + }, + { + "npc_id": "471", + "loc_data": "{2526,3160,1,1,6}" + }, + { + "npc_id": "472", + "loc_data": "{2521,3168,0,1,4}" + }, + { + "npc_id": "473", + "loc_data": "{2503,3192,0,0,0}-{2514,3159,0,0,6}" + }, + { + "npc_id": "475", + "loc_data": "{2513,3262,0,1,3}-{2522,3251,0,1,1}-{2454,3300,0,1,7}-{2455,3301,0,1,7}" + }, + { + "npc_id": "477", + "loc_data": "{2455,3301,0,1,6}" + }, + { + "npc_id": "478", + "loc_data": "{2509,3255,0,1,3}-{2503,3254,1,1,3}" + }, + { + "npc_id": "481", + "loc_data": "{2499,3266,0,0,4}" + }, + { + "npc_id": "482", + "loc_data": "{2524,3258,0,1,4}" + }, + { + "npc_id": "483", + "loc_data": "{2501,3234,0,0,4}" + }, + { + "npc_id": "484", + "loc_data": "{2542,3169,0,1,4}-{2541,3170,0,1,4}-{2537,3168,0,1,5}" + }, + { + "npc_id": "491", + "loc_data": "{2919,9849,0,1,4}-{2915,9845,0,1,3}-{2922,9833,0,1,6}" + }, + { + "npc_id": "494", + "loc_data": "{2807,3443,0,0,6}-{2810,3443,0,0,6}-{2657,3283,0,0,3}-{2657,3286,0,0,3}-{2615,3094,0,0,3}-{2615,3092,0,0,3}-{2615,3092,0,0,3}-{2615,3094,0,0,3}-{3122,3125,0,0,6}-{3120,3125,0,0,6}-{3090,3242,0,0,4}-{3090,3245,0,0,4}-{3090,3243,0,0,4}-{2584,3422,0,0,4}-{2584,3419,0,0,4}-{3682,2981,0,0,3}-{2618,3330,0,0,0}-{2619,3330,0,0,0}-{2584,3418,0,0,4}" + }, + { + "npc_id": "495", + "loc_data": "{2809,3443,0,0,6}-{2811,3443,0,0,6}-{2615,3091,0,0,3}-{2615,3091,0,0,3}-{2615,3330,0,0,0}-{2584,3421,0,0,4}" + }, + { + "npc_id": "496", + "loc_data": "{3267,3164,0,0,4}-{3267,3167,0,0,4}-{3267,3169,0,0,4}-{3682,2983,0,0,3}" + }, + { + "npc_id": "497", + "loc_data": "{3267,3166,0,0,4}-{3267,3168,0,0,4}-{3682,2982,0,0,3}" + }, + { + "npc_id": "498", + "loc_data": "{2384,4457,0,0,7}-{2385,4461,0,0,1}" + }, + { + "npc_id": "499", + "loc_data": "{2853,2953,0,0,1}-{2852,2953,0,0,1}" + }, + { + "npc_id": "500", + "loc_data": "{2880,2951,0,0,6}" + }, + { + "npc_id": "504", + "loc_data": "{2870,2950,0,0,0}-{2877,2959,0,0,0}" + }, + { + "npc_id": "505", + "loc_data": "{2868,2954,0,0,6}-{2876,2948,0,0,1}" + }, + { + "npc_id": "510", + "loc_data": "{2780,3211,0,0,0}" + }, + { + "npc_id": "511", + "loc_data": "{2834,2956,0,0,0}" + }, + { + "npc_id": "512", + "loc_data": "{2862,2995,1,0,0}" + }, + { + "npc_id": "513", + "loc_data": "{2857,2962,0,0,6}" + }, + { + "npc_id": "514", + "loc_data": "{2870,2974,1,0,6}" + }, + { + "npc_id": "515", + "loc_data": "{2834,2987,0,0,0}" + }, + { + "npc_id": "516", + "loc_data": "{2826,2958,0,1,3}" + }, + { + "npc_id": "517", + "loc_data": "{2870,2970,0,0,0}" + }, + { + "npc_id": "518", + "loc_data": "{2764,2959,1,0,0}" + }, + { + "npc_id": "519", + "loc_data": "{3228,3203,0,1,6}" + }, + { + "npc_id": "520", + "loc_data": "{3217,3241,0,1,4}" + }, + { + "npc_id": "521", + "loc_data": "{3217,3240,0,1,3}" + }, + { + "npc_id": "522", + "loc_data": "{3218,3415,0,1,3}" + }, + { + "npc_id": "523", + "loc_data": "{3217,3411,0,1,3}" + }, + { + "npc_id": "524", + "loc_data": "{3316,3184,0,1,3}" + }, + { + "npc_id": "525", + "loc_data": "{3316,3182,0,1,3}" + }, + { + "npc_id": "527", + "loc_data": "{2959,3390,0,1,1}-{2957,3388,0,1,3}" + }, + { + "npc_id": "528", + "loc_data": "{3078,3512,0,1,3}" + }, + { + "npc_id": "529", + "loc_data": "{3079,3507,0,1,7}" + }, + { + "npc_id": "530", + "loc_data": "{2947,3217,0,1,1}" + }, + { + "npc_id": "531", + "loc_data": "{2947,3212,0,1,1}" + }, + { + "npc_id": "532", + "loc_data": "{2906,3145,0,1,3}" + }, + { + "npc_id": "533", + "loc_data": "{2906,3144,0,1,3}" + }, + { + "npc_id": "534", + "loc_data": "{2375,4449,0,1,5}" + }, + { + "npc_id": "535", + "loc_data": "{2376,4447,0,0,0}" + }, + { + "npc_id": "536", + "loc_data": "{3192,3359,1,1,3}" + }, + { + "npc_id": "537", + "loc_data": "{3192,3355,1,1,6}" + }, + { + "npc_id": "538", + "loc_data": "{3076,3429,0,1,3}" + }, + { + "npc_id": "539", + "loc_data": "{3299,3204,0,0,0}" + }, + { + "npc_id": "540", + "loc_data": "{3288,3212,0,1,6}" + }, + { + "npc_id": "541", + "loc_data": "{3288,3190,0,1,3}" + }, + { + "npc_id": "542", + "loc_data": "{3316,3175,0,1,3}" + }, + { + "npc_id": "543", + "loc_data": "{3272,3182,0,1,6}" + }, + { + "npc_id": "544", + "loc_data": "{3316,3164,0,1,3}" + }, + { + "npc_id": "545", + "loc_data": "{3322,3195,0,1,3}" + }, + { + "npc_id": "546", + "loc_data": "{3203,3433,0,1,3}" + }, + { + "npc_id": "547", + "loc_data": "{3217,3435,0,0,3}" + }, + { + "npc_id": "548", + "loc_data": "{3205,3416,0,1,6}" + }, + { + "npc_id": "549", + "loc_data": "{3229,3438,0,1,6}" + }, + { + "npc_id": "550", + "loc_data": "{3232,3423,0,1,6}" + }, + { + "npc_id": "551", + "loc_data": "{3203,3397,0,1,3}" + }, + { + "npc_id": "552", + "loc_data": "{3205,3399,0,1,3}" + }, + { + "npc_id": "553", + "loc_data": "{3253,3403,0,1,1}" + }, + { + "npc_id": "554", + "loc_data": "{3281,3398,0,1,3}" + }, + { + "npc_id": "556", + "loc_data": "{3012,3244,0,1,6}" + }, + { + "npc_id": "557", + "loc_data": "{3012,3203,0,1,1}" + }, + { + "npc_id": "558", + "loc_data": "{3013,3221,0,1,6}" + }, + { + "npc_id": "559", + "loc_data": "{3026,3252,0,1,3}" + }, + { + "npc_id": "560", + "loc_data": "{2767,3122,0,1,6}" + }, + { + "npc_id": "562", + "loc_data": "{2799,3438,0,1,1}" + }, + { + "npc_id": "563", + "loc_data": "{2803,3430,0,1,6}" + }, + { + "npc_id": "564", + "loc_data": "{2485,4450,0,1,3}" + }, + { + "npc_id": "565", + "loc_data": "{2476,4467,0,1,2}" + }, + { + "npc_id": "566", + "loc_data": "{2480,4471,0,1,4}" + }, + { + "npc_id": "568", + "loc_data": "{2925,3143,0,1,3}" + }, + { + "npc_id": "569", + "loc_data": "{2659,3316,0,1,2}" + }, + { + "npc_id": "570", + "loc_data": "{2669,3303,0,1,5}" + }, + { + "npc_id": "571", + "loc_data": "{2655,3310,0,1,1}-{2669,3310,0,1,3}" + }, + { + "npc_id": "572", + "loc_data": "{2659,3296,0,1,4}" + }, + { + "npc_id": "573", + "loc_data": "{2663,3296,0,1,4}" + }, + { + "npc_id": "574", + "loc_data": "{2656,3300,0,1,3}" + }, + { + "npc_id": "575", + "loc_data": "{2821,3442,0,1,6}" + }, + { + "npc_id": "576", + "loc_data": "{2836,3447,0,1,4}" + }, + { + "npc_id": "577", + "loc_data": "{2975,3384,0,1,3}" + }, + { + "npc_id": "578", + "loc_data": "{2807,3342,0,1,6}" + }, + { + "npc_id": "579", + "loc_data": "{3034,9845,0,1,3}" + }, + { + "npc_id": "580", + "loc_data": "{2952,3388,0,1,3}" + }, + { + "npc_id": "581", + "loc_data": "{2975,3314,0,1,3}" + }, + { + "npc_id": "582", + "loc_data": "{2998,9828,0,1,1}" + }, + { + "npc_id": "583", + "loc_data": "{3011,3257,0,1,3}" + }, + { + "npc_id": "584", + "loc_data": "{2944,3332,0,1,3}" + }, + { + "npc_id": "585", + "loc_data": "{2946,3205,0,1,6}" + }, + { + "npc_id": "586", + "loc_data": "{2884,3450,0,1,3}" + }, + { + "npc_id": "587", + "loc_data": "{2897,3428,0,1,3}" + }, + { + "npc_id": "588", + "loc_data": "{2803,3152,0,1,3}" + }, + { + "npc_id": "589", + "loc_data": "{2660,3291,0,1,3}" + }, + { + "npc_id": "590", + "loc_data": "{2613,3294,0,1,3}" + }, + { + "npc_id": "591", + "loc_data": "{2615,3292,0,1,6}" + }, + { + "npc_id": "592", + "loc_data": "{2597,3401,0,1,2}" + }, + { + "npc_id": "593", + "loc_data": "{2569,3098,0,1,3}" + }, + { + "npc_id": "594", + "loc_data": "{2998,9840,0,1,3}" + }, + { + "npc_id": "595", + "loc_data": "{3271,3412,0,1,3}" + }, + { + "npc_id": "596", + "loc_data": "{3037,3705,0,0,0}" + }, + { + "npc_id": "597", + "loc_data": "{3025,3701,0,1,5}" + }, + { + "npc_id": "598", + "loc_data": "{2943,3384,0,1,3}" + }, + { + "npc_id": "599", + "loc_data": "{2522,5001,0,0,4}" + }, + { + "npc_id": "600", + "loc_data": "{2449,3511,1,1,6}" + }, + { + "npc_id": "601", + "loc_data": "{2482,3509,1,1,3}" + }, + { + "npc_id": "602", + "loc_data": "{2469,3488,2,1,6}" + }, + { + "npc_id": "603", + "loc_data": "{2491,3488,1,1,6}" + }, + { + "npc_id": "604", + "loc_data": "{3001,3144,0,0,0}" + }, + { + "npc_id": "605", + "loc_data": "{2985,3343,2,1,2}" + }, + { + "npc_id": "606", + "loc_data": "{2974,3343,0,1,0}" + }, + { + "npc_id": "607", + "loc_data": "{2539,3547,0,1,4}" + }, + { + "npc_id": "608", + "loc_data": "{2962,3337,2,1,4}" + }, + { + "npc_id": "610", + "loc_data": "{3027,3506,0,0,0}" + }, + { + "npc_id": "611", + "loc_data": "{3029,3505,0,1,0}" + }, + { + "npc_id": "612", + "loc_data": "{3028,3510,0,0,0}" + }, + { + "npc_id": "619", + "loc_data": "{3353,3333,0,1,3}" + }, + { + "npc_id": "636", + "loc_data": "{2395,3494,0,0,6}-{2396,3494,0,0,6}-{2397,3494,0,0,6}-{2396,3493,0,0,6}" + }, + { + "npc_id": "637", + "loc_data": "{3158,3425,1,1,5}" + }, + { + "npc_id": "638", + "loc_data": "{3195,3404,0,0,0}" + }, + { + "npc_id": "639", + "loc_data": "{3211,3425,0,1,7}" + }, + { + "npc_id": "640", + "loc_data": "{3253,3487,0,1,6}" + }, + { + "npc_id": "641", + "loc_data": "{3207,3392,0,1,6}" + }, + { + "npc_id": "642", + "loc_data": "{3185,3385,0,1,6}" + }, + { + "npc_id": "643", + "loc_data": "{3246,3383,1,1,5}" + }, + { + "npc_id": "644", + "loc_data": "{3247,9781,0,1,6}" + }, + { + "npc_id": "645", + "loc_data": "{3223,3401,0,1,2}" + }, + { + "npc_id": "646", + "loc_data": "{3257,3447,0,1,0}" + }, + { + "npc_id": "648", + "loc_data": "{3220,3471,0,0,6}" + }, + { + "npc_id": "649", + "loc_data": "{3149,3210,0,1,0}" + }, + { + "npc_id": "650", + "loc_data": "{3148,3205,0,1,0}" + }, + { + "npc_id": "651", + "loc_data": "{3148,3207,0,1,0}" + }, + { + "npc_id": "652", + "loc_data": "{3147,3209,0,1,0}" + }, + { + "npc_id": "656", + "loc_data": "{2822,3374,0,0,3}" + }, + { + "npc_id": "657", + "loc_data": "{3048,3236,0,1,2}" + }, + { + "npc_id": "658", + "loc_data": "{2832,3336,0,1,2}" + }, + { + "npc_id": "659", + "loc_data": "{3052,3373,0,0,0}" + }, + { + "npc_id": "665", + "loc_data": "{2986,9811,0,0,0}" + }, + { + "npc_id": "666", + "loc_data": "{2819,3451,0,0,3}-{3158,3405,0,0,0}" + }, + { + "npc_id": "670", + "loc_data": "{2465,3496,0,1,6}" + }, + { + "npc_id": "674", + "loc_data": "{3001,3041,0,0,0}" + }, + { + "npc_id": "675", + "loc_data": "{2944,3041,0,0,0}" + }, + { + "npc_id": "677", + "loc_data": "{2708,9486,0,0,5}" + }, + { + "npc_id": "678", + "loc_data": "{2658,3436,0,1,3}-{2655,3431,0,1,0}-{2656,3424,0,1,1}-{2664,3426,0,1,4}-{2671,3438,0,1,1}-{2669,3441,0,1,7}-{2674,3438,0,1,5}-{2671,3418,0,1,7}-{2666,3417,0,1,3}-{2666,3415,0,1,2}-{2664,3416,0,1,3}-{2680,3431,0,1,6}-{2678,3431,0,1,1}-{2661,3430,0,1,4}" + }, + { + "npc_id": "679", + "loc_data": "{2658,3439,0,0,0}" + }, + { + "npc_id": "680", + "loc_data": "{2679,3432,0,1,6}" + }, + { + "npc_id": "682", + "loc_data": "{2671,3434,0,1,4}" + }, + { + "npc_id": "683", + "loc_data": "{2673,3434,0,1,3}" + }, + { + "npc_id": "684", + "loc_data": "{2667,3430,2,0,6}" + }, + { + "npc_id": "685", + "loc_data": "{2670,3429,2,0,3}" + }, + { + "npc_id": "686", + "loc_data": "{2669,3426,2,0,1}" + }, + { + "npc_id": "687", + "loc_data": "{2666,3427,2,0,4}" + }, + { + "npc_id": "688", + "loc_data": "{2668,3442,2,1,6}-{2667,3444,2,1,6}-{2669,3444,2,1,6}" + }, + { + "npc_id": "689", + "loc_data": "{2682,3428,2,1,3}-{2684,3427,2,1,3}-{2684,3429,2,1,3}" + }, + { + "npc_id": "690", + "loc_data": "{2654,3428,2,1,1}-{2652,3427,2,1,1}-{2652,3429,2,1,1}" + }, + { + "npc_id": "691", + "loc_data": "{2668,3414,2,1,4}-{2667,3412,2,1,4}-{2669,3412,2,1,4}" + }, + { + "npc_id": "692", + "loc_data": "{2661,3419,0,1,7}" + }, + { + "npc_id": "693", + "loc_data": "{2673,3416,0,0,0}" + }, + { + "npc_id": "694", + "loc_data": "{2659,3431,0,0,3}" + }, + { + "npc_id": "705", + "loc_data": "{3208,3252,0,0,6}" + }, + { + "npc_id": "706", + "loc_data": "{3103,3163,2,0,0}" + }, + { + "npc_id": "707", + "loc_data": "{3113,3160,2,0,0}" + }, + { + "npc_id": "708", + "loc_data": "{3215,3282,0,1,1}-{3242,3306,0,1,1}-{3208,3357,0,1,3}-{3240,3393,0,1,3}-{3219,3221,0,1,4}-{3162,3410,0,1,2}-{2962,3424,0,1,6}-{3011,3513,0,1,1}-{2980,3337,0,1,6}-{2997,3300,0,1,3}-{3031,3322,0,1,1}-{2957,3308,0,1,0}-{2935,3343,0,1,1}-{2942,3247,0,1,7}-{2976,3176,0,1,6}-{3239,3523,0,1,4}-{3262,3523,0,1,2}-{2865,3175,0,1,0}-{2855,3188,0,1,1}-{2838,3194,0,1,3}-{2806,3181,0,1,3}-{2827,3170,0,1,5}-{2788,3179,0,1,3}-{2753,3178,0,1,3}-{2759,3155,0,1,0}-{2603,3221,0,1,7}-{2604,3212,0,1,3}-{2614,3230,0,1,1}-{2611,3204,0,1,7}-{2544,3184,0,1,3}-{2627,3231,0,1,4}-{2595,3125,0,1,1}-{2598,3145,0,1,1}-{2588,3145,0,1,7}-{2601,3135,0,1,3}-{2598,3120,0,1,6}-{2615,3120,0,1,4}-{2598,3108,0,1,4}-{2733,3459,0,1,3}-{2732,3457,0,1,6}-{2715,3451,0,1,4}-{2715,3436,0,1,3}-{2977,3377,0,0,3}-{2941,3356,0,0,7}-{2932,3322,0,0,5}-{2934,3301,0,1,5}-{2934,3301,0,1,3}-{2973,3274,0,1,3}-{2994,3270,0,1,0}-{3010,3271,0,1,6}-{2977,3202,0,1,7}-{3068,3251,0,1,6}-{3189,3503,0,1,6}" + }, + { + "npc_id": "711", + "loc_data": "{2536,3314,1,0,0}" + }, + { + "npc_id": "713", + "loc_data": "{2526,3319,0,0,0}" + }, + { + "npc_id": "716", + "loc_data": "{2540,3286,0,0,0}" + }, + { + "npc_id": "717", + "loc_data": "{2513,3294,0,0,0}-{2518,3320,0,0,0}-{2530,3274,0,0,0}-{2535,3296,0,0,0}" + }, + { + "npc_id": "719", + "loc_data": "{2560,3288,0,0,0}-{2026,4619,0,1,6}-{2026,4615,0,0,6}-{2020,4614,0,1,1}-{2021,4614,0,1,6}-{2008,4612,0,1,3}-{2002,4613,0,1,4}" + }, + { + "npc_id": "720", + "loc_data": "{2542,3306,0,0,0}" + }, + { + "npc_id": "725", + "loc_data": "{2540,3305,0,0,0}" + }, + { + "npc_id": "728", + "loc_data": "{2540,3308,0,1,6}" + }, + { + "npc_id": "729", + "loc_data": "{2536,3308,0,1,4}" + }, + { + "npc_id": "731", + "loc_data": "{3278,3487,0,1,1}" + }, + { + "npc_id": "732", + "loc_data": "{3267,3392,0,0,0}" + }, + { + "npc_id": "733", + "loc_data": "{3226,3399,0,0,0}" + }, + { + "npc_id": "734", + "loc_data": "{3045,3256,0,1,3}" + }, + { + "npc_id": "735", + "loc_data": "{2795,3155,0,1,7}" + }, + { + "npc_id": "736", + "loc_data": "{2957,3373,0,1,7}" + }, + { + "npc_id": "737", + "loc_data": "{2572,3319,0,1,3}" + }, + { + "npc_id": "738", + "loc_data": "{2691,3492,0,0,0}" + }, + { + "npc_id": "739", + "loc_data": "{2554,3080,0,1,3}" + }, + { + "npc_id": "740", + "loc_data": "{2808,3086,0,1,0}" + }, + { + "npc_id": "741", + "loc_data": "{3212,3220,1,1,1}" + }, + { + "npc_id": "742", + "loc_data": "{2854,9636,0,1,4}" + }, + { + "npc_id": "743", + "loc_data": "{3098,3257,0,1,4}" + }, + { + "npc_id": "744", + "loc_data": "{3047,3204,0,0,0}" + }, + { + "npc_id": "745", + "loc_data": "{3013,3189,0,1,1}" + }, + { + "npc_id": "746", + "loc_data": "{3010,3502,0,1,3}" + }, + { + "npc_id": "747", + "loc_data": "{3069,3516,0,1,6}" + }, + { + "npc_id": "749", + "loc_data": "{1749,5323,0,1,4}" + }, + { + "npc_id": "750", + "loc_data": "{1765,5321,0,1,2}-{1744,5326,0,1,4}" + }, + { + "npc_id": "751", + "loc_data": "{1778,5323,0,1,6}" + }, + { + "npc_id": "753", + "loc_data": "{2929,9649,0,1,4}" + }, + { + "npc_id": "755", + "loc_data": "{3100,3268,0,0,0}" + }, + { + "npc_id": "756", + "loc_data": "{3222,3398,0,0,3}" + }, + { + "npc_id": "758", + "loc_data": "{3189,3273,0,0,4}" + }, + { + "npc_id": "767", + "loc_data": "{3303,3511,0,0,1}-{3302,3514,0,0,1}" + }, + { + "npc_id": "780", + "loc_data": "{3151,3410,0,1,6}" + }, + { + "npc_id": "781", + "loc_data": "{3221,3434,0,1,0}" + }, + { + "npc_id": "782", + "loc_data": "{3150,3406,0,0,0}" + }, + { + "npc_id": "783", + "loc_data": "{3221,3435,0,1,0}" + }, + { + "npc_id": "784", + "loc_data": "{3155,3406,0,0,0}" + }, + { + "npc_id": "788", + "loc_data": "{2773,3187,0,0,6}" + }, + { + "npc_id": "789", + "loc_data": "{2811,3167,0,0,0}" + }, + { + "npc_id": "791", + "loc_data": "{2450,3056,0,0,0}" + }, + { + "npc_id": "792", + "loc_data": "{2774,3197,0,0,0}" + }, + { + "npc_id": "793", + "loc_data": "{2790,3189,0,1,1}" + }, + { + "npc_id": "794", + "loc_data": "{2793,3191,0,1,3}" + }, + { + "npc_id": "797", + "loc_data": "{2900,3511,1,1,6}" + }, + { + "npc_id": "799", + "loc_data": "{2778,3197,0,1,4}-{2777,3194,0,1,4}-{2777,3199,0,1,3}-{2771,3193,0,1,3}-{2761,3192,0,1,5}-{2775,3190,0,1,4}-{2803,3195,0,1,4}" + }, + { + "npc_id": "801", + "loc_data": "{3058,3485,0,1,6}" + }, + { + "npc_id": "802", + "loc_data": "{3046,3486,1,0,0}" + }, + { + "npc_id": "804", + "loc_data": "{2934,3285,1,1,0}" + }, + { + "npc_id": "805", + "loc_data": "{2936,3288,0,1,4}" + }, + { + "npc_id": "812", + "loc_data": "{2738,3473,0,0,1}-{2733,3473,0,0,1}" + }, + { + "npc_id": "820", + "loc_data": "{2697,3496,0,0,0}" + }, + { + "npc_id": "822", + "loc_data": "{3302,9466,0,1,6}" + }, + { + "npc_id": "827", + "loc_data": "{3273,9417,0,1,6}-{3289,9443,0,1,4}" + }, + { + "npc_id": "830", + "loc_data": "{3271,3028,0,1,4}" + }, + { + "npc_id": "831", + "loc_data": "{3291,3032,1,0,1}" + }, + { + "npc_id": "832", + "loc_data": "{3171,3025,0,1,4}" + }, + { + "npc_id": "833", + "loc_data": "{3167,3033,0,1,2}-{3170,3027,0,1,5}-{3174,3028,0,1,6}" + }, + { + "npc_id": "834", + "loc_data": "{3170,3045,0,0,3}" + }, + { + "npc_id": "836", + "loc_data": "{3304,3124,0,1,6}" + }, + { + "npc_id": "837", + "loc_data": "{3305,3121,0,1,0}-{3301,3120,0,1,1}-{3302,3123,0,1,6}-{3307,3125,0,1,1}" + }, + { + "npc_id": "838", + "loc_data": "{3306,3117,0,1,4}" + }, + { + "npc_id": "839", + "loc_data": "{3153,3035,0,1,3}" + }, + { + "npc_id": "841", + "loc_data": "{3288,3022,0,1,1}" + }, + { + "npc_id": "843", + "loc_data": "{2644,3274,0,1,3}-{2644,3276,0,1,5}-{2647,3271,0,1,6}" + }, + { + "npc_id": "844", + "loc_data": "{2683,3323,0,0,0}" + }, + { + "npc_id": "845", + "loc_data": "{2635,3311,0,0,0}" + }, + { + "npc_id": "846", + "loc_data": "{2787,3184,0,1,4}" + }, + { + "npc_id": "847", + "loc_data": "{3143,3447,0,1,5}" + }, + { + "npc_id": "848", + "loc_data": "{2480,3489,1,1,3}" + }, + { + "npc_id": "850", + "loc_data": "{2439,3502,1,0,4}" + }, + { + "npc_id": "851", + "loc_data": "{2449,3503,1,1,4}" + }, + { + "npc_id": "853", + "loc_data": "{2506,3115,0,1,3}" + }, + { + "npc_id": "854", + "loc_data": "{2511,3085,0,1,4}" + }, + { + "npc_id": "858", + "loc_data": "{2550,3032,0,0,0}-{2552,3033,0,0,0}-{2550,3030,0,0,0}-{2550,3032,0,0,0}" + }, + { + "npc_id": "860", + "loc_data": "{2503,3013,0,0,0}" + }, + { + "npc_id": "872", + "loc_data": "{2547,3117,2,1,3}-{2547,3112,2,1,6}-{2544,3114,2,1,3}-{2547,3118,2,1,3}" + }, + { + "npc_id": "877", + "loc_data": "{2536,3092,0,1,1}-{2534,3091,0,1,1}-{2550,3118,0,1,4}-{2543,3117,0,1,3}-{2546,3113,0,1,4}" + }, + { + "npc_id": "878", + "loc_data": "{2534,3092,0,1,1}" + }, + { + "npc_id": "881", + "loc_data": "{3112,3162,1,0,0}" + }, + { + "npc_id": "882", + "loc_data": "{3203,3424,0,0,6}" + }, + { + "npc_id": "883", + "loc_data": "{3204,3470,0,1,3}" + }, + { + "npc_id": "884", + "loc_data": "{3204,3495,2,1,6}" + }, + { + "npc_id": "885", + "loc_data": "{2565,3271,0,0,0}-{2573,3268,1,0,0}" + }, + { + "npc_id": "887", + "loc_data": "{2570,3275,0,1,3}" + }, + { + "npc_id": "888", + "loc_data": "{2565,3273,0,0,0}" + }, + { + "npc_id": "889", + "loc_data": "{2571,3270,0,0,0}" + }, + { + "npc_id": "890", + "loc_data": "{2569,3272,0,0,0}-{2573,3269,1,0,0}" + }, + { + "npc_id": "895", + "loc_data": "{2929,3456,0,1,4}" + }, + { + "npc_id": "902", + "loc_data": "{2535,4715,0,1,6}" + }, + { + "npc_id": "903", + "loc_data": "{2541,4715,0,1,3}" + }, + { + "npc_id": "904", + "loc_data": "{2507,4693,0,1,3}" + }, + { + "npc_id": "905", + "loc_data": "{2540,4719,0,1,6}" + }, + { + "npc_id": "912", + "loc_data": "{3101,3940,0,0,0}-{3109,3931,0,0,0}-{3109,3939,0,0,0}-{3097,3931,0,1,4}-{3098,3938,0,1,6}-{3113,3938,0,1,7}" + }, + { + "npc_id": "913", + "loc_data": "{3105,3931,0,0,0}-{3101,3929,0,0,1}-{3111,3939,0,1,6}-{3109,3926,0,1,1}" + }, + { + "npc_id": "914", + "loc_data": "{3099,3936,0,0,7}-{3104,3929,0,0,0}-{3110,3936,0,1,2}-{3096,3932,0,1,4}-{3113,3928,0,1,1}" + }, + { + "npc_id": "915", + "loc_data": "{3108,3264,0,1,2}" + }, + { + "npc_id": "916", + "loc_data": "{3122,3245,0,0,0}" + }, + { + "npc_id": "917", + "loc_data": "{3125,3250,0,1,6}-{3122,3249,0,1,6}" + }, + { + "npc_id": "918", + "loc_data": "{3048,3209,1,1,3}" + }, + { + "npc_id": "919", + "loc_data": "{3128,3245,0,1,4}" + }, + { + "npc_id": "920", + "loc_data": "{3123,3241,0,1,1}" + }, + { + "npc_id": "922", + "loc_data": "{3086,3261,0,1,7}" + }, + { + "npc_id": "923", + "loc_data": "{3302,3163,0,0,0}" + }, + { + "npc_id": "924", + "loc_data": "{3286,3180,0,0,0}" + }, + { + "npc_id": "925", + "loc_data": "{3267,3226,0,0,3}-{3266,3229,0,0,3}-{3269,3229,0,0,4}-{3268,3226,0,0,4}" + }, + { + "npc_id": "931", + "loc_data": "{2792,2929,0,0,0}-{2815,2935,0,0,0}-{2842,2935,0,0,0}-{2842,2929,0,0,0}" + }, + { + "npc_id": "933", + "loc_data": "{2725,3367,0,0,2}-{2725,3380,2,0,6}" + }, + { + "npc_id": "941", + "loc_data": "{2974,3620,0,1,3}-{2975,3609,0,1,3}-{2983,3614,0,1,3}-{3340,3678,0,1,1}-{3339,3695,0,1,6}-{3344,3705,0,1,3}-{3307,5462,0,1,0}-{3121,10085,0,1,0}" + }, + { + "npc_id": "942", + "loc_data": "{3074,3086,0,0,0}" + }, + { + "npc_id": "943", + "loc_data": "{3103,3096,0,0,0}" + }, + { + "npc_id": "944", + "loc_data": "{3107,9511,0,1,5}" + }, + { + "npc_id": "945", + "loc_data": "{3093,3107,0,0,0}" + }, + { + "npc_id": "946", + "loc_data": "{3141,3090,0,0,6}" + }, + { + "npc_id": "947", + "loc_data": "{3127,3124,0,0,3}" + }, + { + "npc_id": "948", + "loc_data": "{3084,9506,0,0,0}" + }, + { + "npc_id": "949", + "loc_data": "{3086,3122,0,0,0}" + }, + { + "npc_id": "952", + "loc_data": "{3101,3092,0,0,4}" + }, + { + "npc_id": "954", + "loc_data": "{3123,3107,0,1,5}" + }, + { + "npc_id": "955", + "loc_data": "{3176,3317,0,1,3}-{3169,3319,0,1,1}" + }, + { + "npc_id": "957", + "loc_data": "{3314,3241,0,0,1}-{3314,3240,1,0,0}" + }, + { + "npc_id": "958", + "loc_data": "{3383,3272,0,1,3}" + }, + { + "npc_id": "959", + "loc_data": "{3359,3272,0,1,5}" + }, + { + "npc_id": "960", + "loc_data": "{3370,3276,0,1,3}" + }, + { + "npc_id": "961", + "loc_data": "{3377,3276,0,1,4}" + }, + { + "npc_id": "962", + "loc_data": "{3362,3276,0,1,3}" + }, + { + "npc_id": "963", + "loc_data": "{3375,3274,0,1,2}" + }, + { + "npc_id": "970", + "loc_data": "{3082,3248,0,1,4}" + }, + { + "npc_id": "1005", + "loc_data": "{3057,3905,0,1,3}" + }, + { + "npc_id": "1013", + "loc_data": "{2544,2988,0,0,0}-{2532,2983,0,0,0}-{2549,2983,0,0,0}-{2545,2983,0,0,0}-{2528,2986,0,0,0}-{2550,2979,0,0,0}-{2522,2978,0,0,0}-{2523,2976,0,0,0}-{2526,2974,0,0,0}-{2593,2971,0,0,0}-{2594,2971,0,0,0}-{2596,2961,0,0,0}-{2598,2971,0,0,0}-{2599,2960,0,0,0}-{2598,2960,0,0,0}-{2603,2966,0,0,0}-{2603,2970,0,0,0}-{2598,2960,0,0,0}-{2596,2963,0,0,0}-{2595,2964,0,0,0}-{2594,2964,0,0,0}-{2601,2964,0,0,0}-{2598,2969,0,0,0}-{2604,2971,0,0,0}-{2601,2972,0,0,0}-{2544,2904,0,0,0}-{2548,2990,0,0,0}-{2552,2988,0,0,0}-{2548,2979,0,0,0}-{2547,2991,0,0,0}-{2525,2975,0,0,0}-{2464,2912,0,0,0}" + }, + { + "npc_id": "1017", + "loc_data": "{3198,3359,0,1,0}-{3231,3296,0,1,6}-{3233,3300,0,1,4}-{3235,3293,0,1,3}-{3232,3288,0,1,0}-{3234,3298,0,1,6}-{2785,3069,0,1,4}-{2800,3072,0,1,6}-{3234,3297,0,1,3}-{3234,3292,0,1,4}-{3235,3289,0,1,1}-{2677,3656,0,1,2}-{2672,3654,0,1,2}-{2676,3652,0,1,4}-{2681,3652,0,1,4}-{2675,3652,0,1,3}" + }, + { + "npc_id": "1019", + "loc_data": "{3187,5555,0,1,4}-{3213,9377,0,1,3}-{3209,9397,0,1,4}-{3245,9401,0,1,6}-{3237,9402,0,1,2}-{3207,9349,0,1,3}-{3220,9347,0,1,6}-{3233,9359,0,1,4}-{3235,9354,0,0,6}-{3259,9370,0,1,1}-{3258,9387,0,1,6}-{3278,9368,0,1,5}-{3271,9359,0,1,3}-{3287,9359,0,1,5}-{3301,9394,0,1,5}-{3318,9352,0,1,5}-{3190,5563,0,1,1}-{3193,5555,0,1,3}" + }, + { + "npc_id": "1019", + "loc_data": "{2707,9880,0,1,0}-{2711,9876,0,1,0}-{2712,9871,0,1,0}-{2715,9874,0,1,0}-{2720,9871,0,1,0}-{2717,9880,0,1,0}-{2722,9879,0,1,0}-{2723,9875,0,1,0}" + }, + { + "npc_id": "1020", + "loc_data": "{2697,9913,0,1,0}-{2695,9907,0,1,0}-{2693,9901,0,1,0}-{2701,9902,0,1,0}-{2704,9908,0,1,0}-{2694,9889,0,1,0}-{2694,9879,0,1,0}-{2699,9875,0,1,0}-{2700,9869,0,1,0}-{2695,9870,0,1,0}" + }, + { + "npc_id": "1021", + "loc_data": "{2733,9882,0,1,0}-{2732,9888,0,1,0}-{2738,9889,0,1,0}-{2732,9892,0,1,0}-{2738,9894,0,1,0}-{2734,9896,0,1,0}" + }, + { + "npc_id": "1022", + "loc_data": "{2714,9904,0,1,0}-{2718,9906,0,1,0}-{2717,9902,0,1,0}-{2720,9904,0,1,0}-{2724,9903,0,1,0}-{2727,9905,0,1,0}-{2726,9907,0,1,0}" + }, + { + "npc_id": "1027", + "loc_data": "{3278,3155,0,0,0}-{2354,3608,0,0,0}" + }, + { + "npc_id": "1028", + "loc_data": "{2778,3436,0,0,0}" + }, + { + "npc_id": "1029", + "loc_data": "{2920,3499,0,0,0}-{2784,3480,0,0,0}" + }, + { + "npc_id": "1030", + "loc_data": "{2768,3470,0,0,0}-{2843,3155,0,0,0}" + }, + { + "npc_id": "1032", + "loc_data": "{2865,3504,0,0,0}" + }, + { + "npc_id": "1033", + "loc_data": "{2606,2967,0,0,0}" + }, + { + "npc_id": "1035", + "loc_data": "{2599,2954,0,0,0}" + }, + { + "npc_id": "1036", + "loc_data": "{3514,3479,1,0,0}-{3514,3481,1,0,0}-{3514,3481,0,0,3}-{3514,3479,0,0,3}" + }, + { + "npc_id": "1037", + "loc_data": "{2435,3412,0,1,3}" + }, + { + "npc_id": "1038", + "loc_data": "{3507,3496,1,1,1}-{3508,3494,0,1,1}" + }, + { + "npc_id": "1039", + "loc_data": "{3499,3506,1,1,5}-{3500,3505,0,1,5}" + }, + { + "npc_id": "1040", + "loc_data": "{3475,3494,0,1,6}" + }, + { + "npc_id": "1041", + "loc_data": "{3490,3503,1,0,0}-{3490,3500,0,1,4}" + }, + { + "npc_id": "1042", + "loc_data": "{3495,3469,0,1,3}" + }, + { + "npc_id": "1043", + "loc_data": "{3459,3457,0,0,0}-{3460,3462,0,0,0}-{3462,3459,0,0,0}-{3463,3490,0,0,0}-{3464,3511,0,0,0}-{3465,3466,0,0,0}-{3466,3495,0,0,0}-{3466,3497,0,0,0}-{3467,3485,0,0,0}-{3467,3497,0,0,0}-{3467,3509,0,0,0}-{3469,3470,0,0,0}-{3470,3469,0,0,0}-{3471,3477,0,0,0}-{3474,3505,0,0,0}-{3476,3507,0,0,0}-{3479,3511,0,0,0}-{3480,3468,0,0,0}-{3480,3470,0,0,0}-{3482,3469,0,0,0}-{3483,3511,0,0,0}-{3484,3464,0,0,0}-{3485,3509,0,0,0}-{3490,3461,0,0,0}-{3491,3460,0,0,0}-{3494,3461,0,0,0}-{3494,3512,0,0,0}-{3498,3461,0,0,0}-{3499,3513,0,0,0}-{3501,3513,0,0,0}-{3502,3464,0,0,0}-{3504,3463,0,0,0}-{3506,3512,0,0,0}-{3506,3515,0,0,0}-{3507,3515,0,0,0}-{3509,3512,0,0,0}-{3511,3488,0,0,0}-{3513,3467,0,0,0}-{3513,3487,0,0,0}-{3513,3489,0,0,0}-{3513,3503,0,0,0}-{3514,3490,0,0,0}-{3515,3495,0,0,0}-{3515,3499,0,0,0}-{3516,3469,0,0,0}" + }, + { + "npc_id": "1044", + "loc_data": "{3408,3484,0,1,6}-{3408,3493,0,1,1}-{3410,3489,1,1,3}-{3412,3487,1,1,4}" + }, + { + "npc_id": "1045", + "loc_data": "{3413,3489,0,1,3}-{3409,3485,1,1,4}-{3413,3489,1,1,1}-{3213,3476,0,1,3}" + }, + { + "npc_id": "1046", + "loc_data": "{3409,3489,0,1,4}-{3413,3485,0,1,4}-{3414,3491,1,1,6}" + }, + { + "npc_id": "1047", + "loc_data": "{3415,3489,2,0,0}" + }, + { + "npc_id": "1048", + "loc_data": "{3437,3486,0,0,0}" + }, + { + "npc_id": "1049", + "loc_data": "{3440,9895,0,0,0}" + }, + { + "npc_id": "1054", + "loc_data": "{3444,3459,0,0,0}" + }, + { + "npc_id": "1055", + "loc_data": "{2811,3191,0,0,0}" + }, + { + "npc_id": "1060", + "loc_data": "{2898,3528,0,0,1}" + }, + { + "npc_id": "1061", + "loc_data": "{2898,3532,0,0,4}" + }, + { + "npc_id": "1062", + "loc_data": "{2893,3540,0,0,3}" + }, + { + "npc_id": "1063", + "loc_data": "{2900,3531,0,0,7}-{2900,3533,0,0,7}" + }, + { + "npc_id": "1064", + "loc_data": "{2895,3537,0,0,5}-{2894,3537,0,0,5}-{2893,3537,0,0,5}-{2892,3537,0,0,5}-{2891,3537,0,0,3}-{2891,3538,0,0,3}-{2892,3538,0,0,3}-{2893,3538,0,0,3}-{2894,3538,0,0,3}-{2895,3538,0,0,3}" + }, + { + "npc_id": "1065", + "loc_data": "{2889,3529,0,1,1}-{2904,3538,0,1,6}-{2882,3531,0,1,4}-{2903,3544,0,1,4}-{2911,3542,0,1,4}-{2906,3540,0,1,3}" + }, + { + "npc_id": "1066", + "loc_data": "{2892,3532,0,0,4}" + }, + { + "npc_id": "1067", + "loc_data": "{2893,3533,0,0,6}" + }, + { + "npc_id": "1068", + "loc_data": "{2894,3532,0,0,3}" + }, + { + "npc_id": "1069", + "loc_data": "{2840,3589,0,0,3}" + }, + { + "npc_id": "1070", + "loc_data": "{2269,4758,0,1,3}" + }, + { + "npc_id": "1071", + "loc_data": "{2820,3554,0,1,1}" + }, + { + "npc_id": "1072", + "loc_data": "{2897,3569,0,0,0}-{2893,3565,0,0,0}" + }, + { + "npc_id": "1073", + "loc_data": "{2900,3549,0,0,3}" + }, + { + "npc_id": "1074", + "loc_data": "{2897,3549,0,0,5}" + }, + { + "npc_id": "1076", + "loc_data": "{2900,3556,0,0,1}-{2897,3565,0,1,4}" + }, + { + "npc_id": "1077", + "loc_data": "{2897,3556,0,0,5}" + }, + { + "npc_id": "1079", + "loc_data": "{2906,3537,0,1,5}" + }, + { + "npc_id": "1081", + "loc_data": "{2896,3562,0,0,0}-{2891,3568,0,0,0}" + }, + { + "npc_id": "1082", + "loc_data": "{2919,3576,0,0,0}" + }, + { + "npc_id": "1083", + "loc_data": "{2931,3546,0,1,3}" + }, + { + "npc_id": "1084", + "loc_data": "{2915,3549,0,0,0}" + }, + { + "npc_id": "1085", + "loc_data": "{2921,3558,0,1,6}" + }, + { + "npc_id": "1086", + "loc_data": "{2965,3262,0,1,4}" + }, + { + "npc_id": "1087", + "loc_data": "{2911,3540,0,0,7}" + }, + { + "npc_id": "1088", + "loc_data": "{2918,3545,0,0,0}" + }, + { + "npc_id": "1089", + "loc_data": "{2919,3529,0,0,0}" + }, + { + "npc_id": "1090", + "loc_data": "{2931,3566,0,1,1}" + }, + { + "npc_id": "1093", + "loc_data": "{2817,3560,0,1,3}" + }, + { + "npc_id": "1096", + "loc_data": "{2852,3591,0,1,7}" + }, + { + "npc_id": "1097", + "loc_data": "{2858,3596,0,1,4}" + }, + { + "npc_id": "1098", + "loc_data": "{2868,3591,0,1,6}" + }, + { + "npc_id": "1099", + "loc_data": "{2857,3589,0,0,0}-{2857,3589,0,0,0}" + }, + { + "npc_id": "1100", + "loc_data": "{2859,3589,0,0,0}-{2859,3589,0,0,0}" + }, + { + "npc_id": "1101", + "loc_data": "{2851,3598,0,0,0}-{2854,3600,0,0,0}" + }, + { + "npc_id": "1106", + "loc_data": "{2864,3594,0,1,1}-{2881,3592,0,1,5}-{2857,3587,0,1,7}-{2855,3596,0,1,4}-{2827,10078,1,1,6}-{2925,3626,0,1,0}-{2843,3682,0,1,1}" + }, + { + "npc_id": "1107", + "loc_data": "{2874,3595,0,1,3}-{2875,3596,0,1,1}-{2873,3598,0,1,1}-{2836,10088,1,1,5}-{2845,3674,0,1,4}" + }, + { + "npc_id": "1108", + "loc_data": "{2878,3592,0,1,6}-{2861,3586,0,1,6}-{2855,10058,2,1,4}-{2852,3673,0,1,2}" + }, + { + "npc_id": "1109", + "loc_data": "{2875,3588,0,1,1}-{2883,3586,0,1,6}-{2825,10087,1,1,3}-{2836,10080,1,1,6}-{2784,10040,2,1,3}-{2920,3627,0,1,0}-{2923,10029,0,1,7}-{2851,3667,0,1,3}" + }, + { + "npc_id": "1110", + "loc_data": "{2883,3591,0,1,4}-{2869,3594,0,1,3}-{2861,3587,0,1,4}-{2872,3594,0,1,5}-{2829,10080,1,1,6}-{2836,10097,2,1,4}-{2852,10110,2,1,4}" + }, + { + "npc_id": "1111", + "loc_data": "{2863,3588,0,1,6}-{2865,3591,0,1,0}-{2866,3598,0,1,1}-{2840,10101,1,1,4}-{2857,10055,2,1,3}-{2836,10090,2,1,1}-{2925,10033,0,1,6}-{2855,3685,0,1,1}" + }, + { + "npc_id": "1112", + "loc_data": "{2867,3595,0,1,6}-{2871,3597,0,1,4}-{2832,10089,1,1,1}-{2836,10077,2,1,1}-{2925,10030,0,1,1}" + }, + { + "npc_id": "1113", + "loc_data": "{2831,10083,0,0,0}" + }, + { + "npc_id": "1114", + "loc_data": "{2826,10078,0,0,0}" + }, + { + "npc_id": "1115", + "loc_data": "{2832,10088,2,0,0}" + }, + { + "npc_id": "1116", + "loc_data": "{2824,10073,2,0,0}" + }, + { + "npc_id": "1117", + "loc_data": "{2829,10101,2,0,0}" + }, + { + "npc_id": "1118", + "loc_data": "{2920,3613,0,0,0}" + }, + { + "npc_id": "1119", + "loc_data": "{2930,3614,0,0,0}" + }, + { + "npc_id": "1120", + "loc_data": "{2927,3608,0,0,0}" + }, + { + "npc_id": "1121", + "loc_data": "{2930,3600,0,0,0}" + }, + { + "npc_id": "1122", + "loc_data": "{2918,3604,0,0,0}" + }, + { + "npc_id": "1123", + "loc_data": "{2914,3603,0,0,0}" + }, + { + "npc_id": "1124", + "loc_data": "{2925,3600,0,0,0}" + }, + { + "npc_id": "1125", + "loc_data": "{2916,3610,0,0,0}" + }, + { + "npc_id": "1128", + "loc_data": "{2833,10080,0,0,0}" + }, + { + "npc_id": "1129", + "loc_data": "{2833,10084,0,0,0}" + }, + { + "npc_id": "1131", + "loc_data": "{2905,3694,0,0,1}" + }, + { + "npc_id": "1132", + "loc_data": "{2901,3697,0,0,1}" + }, + { + "npc_id": "1133", + "loc_data": "{2895,3699,0,0,1}" + }, + { + "npc_id": "1134", + "loc_data": "{2891,3699,0,0,1}" + }, + { + "npc_id": "1135", + "loc_data": "{2843,10057,1,0,0}" + }, + { + "npc_id": "1136", + "loc_data": "{2840,10056,1,0,0}" + }, + { + "npc_id": "1137", + "loc_data": "{2847,10056,1,0,0}" + }, + { + "npc_id": "1138", + "loc_data": "{2826,10083,1,1,0}-{2837,10083,2,1,1}-{2909,3639,0,1,3}-{2923,10031,0,1,3}" + }, + { + "npc_id": "1140", + "loc_data": "{2856,10054,1,0,0}-{2860,10057,1,0,0}-{2898,3688,0,0,0}-{2819,3586,0,1,4}" + }, + { + "npc_id": "1141", + "loc_data": "{2857,10059,1,0,0}-{2857,10057,1,0,0}" + }, + { + "npc_id": "1142", + "loc_data": "{2851,10089,0,1,1}-{2854,10092,0,1,3}" + }, + { + "npc_id": "1143", + "loc_data": "{2850,10088,0,1,3}-{2854,10086,0,1,6}" + }, + { + "npc_id": "1144", + "loc_data": "{2856,10089,0,1,4}-{2858,10089,0,1,6}" + }, + { + "npc_id": "1146", + "loc_data": "{2864,10081,0,1,7}" + }, + { + "npc_id": "1147", + "loc_data": "{2853,10076,0,1,5}" + }, + { + "npc_id": "1148", + "loc_data": "{2858,10082,0,1,3}" + }, + { + "npc_id": "1149", + "loc_data": "{2861,10085,0,1,2}" + }, + { + "npc_id": "1150", + "loc_data": "{2857,10075,0,1,1}" + }, + { + "npc_id": "1151", + "loc_data": "{2845,10058,1,0,0}" + }, + { + "npc_id": "1153", + "loc_data": "{3489,9509,2,1,4}-{3499,9515,2,1,6}-{3505,9527,2,1,5}-{3510,9521,2,1,1}-{3490,9526,2,1,3}-{3475,9524,2,1,5}-{3465,9505,2,1,1}-{3479,9501,2,1,3}-{3487,9491,2,1,3}" + }, + { + "npc_id": "1154", + "loc_data": "{3472,9501,2,1,3}-{3495,9494,2,1,4}-{3479,9484,2,1,1}-{3500,9477,2,1,6}" + }, + { + "npc_id": "1155", + "loc_data": "{3468,9486,2,1,0}-{3467,9480,2,1,1}-{3505,9496,2,1,6}-{3513,9496,2,1,7}" + }, + { + "npc_id": "1157", + "loc_data": "{3480,9508,0,1,0}-{3495,9505,0,1,2}-{3492,9490,0,1,1}-{3472,9497,0,1,6}" + }, + { + "npc_id": "1158", + "loc_data": "{3484,9491,0,1,2}" + }, + { + "npc_id": "1161", + "loc_data": "{3487,9526,2,1,5}-{3474,9519,2,1,1}-{3465,9512,2,1,0}-{3489,9501,2,1,4}-{3494,9501,2,1,3}-{3480,9489,2,1,6}-{3483,9477,2,1,3}-{3494,9476,2,1,3}-{3473,9487,0,1,3}-{3476,9496,0,1,6}-{3473,9501,0,1,7}-{3481,9504,0,1,6}-{3488,9514,0,1,6}-{3497,9501,0,1,3}-{3486,9490,0,1,0}" + }, + { + "npc_id": "1162", + "loc_data": "{2781,3088,1,1,0}" + }, + { + "npc_id": "1171", + "loc_data": "{2766,3168,0,1,6}" + }, + { + "npc_id": "1172", + "loc_data": "{2909,3086,0,0,0}" + }, + { + "npc_id": "1174", + "loc_data": "{2792,3015,0,0,0}-{2792,3019,0,0,0}-{2801,3010,0,0,0}-{2801,3010,0,0,4}" + }, + { + "npc_id": "1176", + "loc_data": "{2928,3112,0,0,0}" + }, + { + "npc_id": "1177", + "loc_data": "{2912,3119,0,0,0}" + }, + { + "npc_id": "1178", + "loc_data": "{2768,3165,0,0,0}" + }, + { + "npc_id": "1179", + "loc_data": "{2941,3100,0,1,6}" + }, + { + "npc_id": "1180", + "loc_data": "{2916,3110,0,1,7}" + }, + { + "npc_id": "1181", + "loc_data": "{2902,3101,0,1,1}-{2922,3105,0,1,6}" + }, + { + "npc_id": "1192", + "loc_data": "{2924,3506,0,1,0}-{2927,3498,0,0,0}-{2297,3176,0,1,6}" + }, + { + "npc_id": "1193", + "loc_data": "{2297,3176,0,1,6}" + }, + { + "npc_id": "1194", + "loc_data": "{2298,3177,0,1,4}" + }, + { + "npc_id": "1195", + "loc_data": "{3228,3501,0,1,5}-{3023,4504,0,1,4}-{2216,3174,0,1,4}-{2294,3155,0,1,3}" + }, + { + "npc_id": "1196", + "loc_data": "{3025,4506,0,1,5}-{3023,4504,0,1,4}-{2212,3174,0,1,3}-{2294,3152,0,1,1}" + }, + { + "npc_id": "1198", + "loc_data": "{2296,3192,0,1,2}" + }, + { + "npc_id": "1199", + "loc_data": "{2262,3151,0,1,0}-{2194,3255,0,0,6}" + }, + { + "npc_id": "1201", + "loc_data": "{2264,3147,0,1,1}-{2266,3145,0,1,4}-{2198,3250,0,0,6}-{2203,3250,0,0,4}" + }, + { + "npc_id": "1202", + "loc_data": "{2352,3172,0,1,4}" + }, + { + "npc_id": "1203", + "loc_data": "{2189,3155,0,0,1}-{2183,3156,0,1,4}-{2194,3156,0,1,6}-{2182,3148,0,1,4}-{2179,3137,0,1,3}-{2189,3136,0,1,3}-{2182,3146,0,1,3}-{2187,3172,0,0,1}-{2180,3180,0,1,1}" + }, + { + "npc_id": "1205", + "loc_data": "{3054,3254,0,0,0}" + }, + { + "npc_id": "1206", + "loc_data": "{2185,3144,0,0,4}" + }, + { + "npc_id": "1207", + "loc_data": "{3055,3254,0,0,0}" + }, + { + "npc_id": "1208", + "loc_data": "{2194,3140,0,1,5}" + }, + { + "npc_id": "1213", + "loc_data": "{2914,3418,0,0,6}" + }, + { + "npc_id": "1215", + "loc_data": "{2612,3287,0,0,0}-{2613,3287,0,0,0}" + }, + { + "npc_id": "1216", + "loc_data": "{2611,3285,0,0,0}" + }, + { + "npc_id": "1217", + "loc_data": "{3000,3386,0,1,0}-{3019,3368,0,1,0}" + }, + { + "npc_id": "1218", + "loc_data": "{3412,3512,0,1,4}-{3412,3515,0,1,1}-{3413,3514,0,1,6}-{3414,3512,0,1,5}-{3415,3518,0,1,5}-{3416,3509,0,1,7}-{3416,3511,0,1,4}-{3417,3518,0,1,4}-{3418,3509,0,1,4}-{3419,3512,0,1,7}-{3420,3517,0,1,7}-{3420,3518,0,1,6}-{3423,3461,0,1,5}-{3426,3465,0,1,4}-{3427,3463,0,1,5}-{3428,3458,0,1,4}-{3428,3465,0,1,2}-{3430,3462,0,1,1}-{3430,3467,0,1,3}-{3433,3458,0,1,1}-{3433,3468,0,1,4}-{3434,3464,0,1,6}" + }, + { + "npc_id": "1219", + "loc_data": "{3292,5455,0,1,3}-{3295,5452,0,1,0}-{3290,5448,0,1,4}" + }, + { + "npc_id": "1220", + "loc_data": "{3600,3491,0,1,2}-{3598,3498,0,1,4}-{3600,3496,0,1,0}-{3600,3496,0,1,6}-{3602,3494,0,1,1}-{3597,3490,0,1,6}-{3595,3497,0,1,4}-{3605,3491,0,1,4}-{3604,3495,0,1,0}" + }, + { + "npc_id": "1227", + "loc_data": "{3424,3318,0,1,0}-{3423,3312,0,1,4}-{3507,3435,0,1,4}-{3484,3456,0,1,0}-{3486,3458,0,1,4}-{3511,3455,0,1,0}-{3508,3420,0,1,3}-{3508,3420,0,1,4}-{3506,3402,0,1,7}-{3494,3388,0,1,0}-{3502,3392,0,1,3}" + }, + { + "npc_id": "1228", + "loc_data": "{3420,3302,0,1,1}-{3424,3296,0,1,4}-{3509,3440,0,1,4}-{3518,3454,0,1,1}-{3504,3406,0,1,4}-{3497,3404,0,1,1}" + }, + { + "npc_id": "1229", + "loc_data": "{3421,3302,0,1,4}-{3417,3291,0,1,4}-{3423,3288,0,1,4}-{3418,3284,0,1,6}-{3427,3298,0,1,3}-{3431,3303,0,1,1}-{3432,3311,0,1,1}-{3492,3457,0,1,1}-{3502,3455,0,1,2}-{3516,3415,0,1,4}-{3511,3401,0,1,1}" + }, + { + "npc_id": "1230", + "loc_data": "{3419,3280,0,1,4}-{3421,3277,0,1,4}-{3431,3275,0,1,3}-{3428,3314,0,1,1}-{3436,3318,0,1,5}-{3434,3322,0,1,6}-{3496,3447,0,1,7}-{3520,3437,0,1,4}" + }, + { + "npc_id": "1231", + "loc_data": "{3426,3271,0,1,4}-{3435,3268,0,1,7}-{3443,3266,0,1,7}-{3442,3319,0,1,1}-{3445,3318,0,1,6}-{3518,3397,0,1,4}-{3519,3408,0,1,2}-{3516,3410,0,1,2}-{3489,3391,0,1,2}-{3487,3409,0,1,3}" + }, + { + "npc_id": "1232", + "loc_data": "{3441,3265,0,1,5}-{3438,3277,0,1,7}-{3438,3283,0,1,4}-{3439,3315,0,1,3}-{3439,3310,0,1,1}-{3435,3302,0,1,3}-{3508,3420,0,1,1}-{3514,3415,0,1,7}-{3525,3417,0,1,3}" + }, + { + "npc_id": "1233", + "loc_data": "{3432,3285,0,1,4}-{3434,3288,0,1,5}-{3428,3290,0,1,3}-{3440,3295,0,1,4}-{3436,3288,0,1,1}-{3446,3289,0,1,3}-{3514,3415,0,1,6}-{3509,3415,0,1,1}-{3516,3402,0,1,2}-{3492,3393,0,1,7}-{3493,3401,0,1,6}-{3487,3406,0,1,3}" + }, + { + "npc_id": "1234", + "loc_data": "{3446,3282,0,1,1}-{3446,3298,0,1,3}-{3449,3304,0,1,1}-{3493,3454,0,1,2}-{3493,3454,0,1,0}-{3518,3454,0,1,2}-{3519,3441,0,1,7}-{3506,3417,0,1,5}-{3519,3401,0,1,2}-{3499,3420,0,1,3}-{3520,3412,0,1,0}-{3516,3410,0,1,7}-{3513,3383,0,1,0}-{3491,3388,0,1,3}" + }, + { + "npc_id": "1235", + "loc_data": "{3425,3306,0,1,1}-{3442,3303,0,1,3}-{3437,3299,0,1,1}-{3422,3321,0,1,1}-{3486,3458,0,1,7}-{3503,3420,0,1,3}-{3514,3398,0,1,4}-{3524,3419,0,1,1}-{3509,3386,0,1,2}" + }, + { + "npc_id": "1239", + "loc_data": "{3166,3033,0,1,1}-{3174,3043,0,1,6}-{3177,3041,0,1,4}-{3176,3038,0,1,4}-{3177,3035,0,1,7}-{3183,3035,0,1,6}-{3182,3032,0,1,6}" + }, + { + "npc_id": "1240", + "loc_data": "{3502,3288,0,1,4}-{3505,3284,0,1,4}-{3490,3292,0,1,4}-{3502,3300,0,1,4}-{3492,3303,0,1,4}-{3516,3303,0,1,4}-{3478,3281,0,1,4}-{3473,3273,0,1,4}-{3469,3288,0,1,4}-{3469,3304,0,1,4}" + }, + { + "npc_id": "1251", + "loc_data": "{3474,3309,0,1,5}-{3486,3277,0,1,4}-{3496,3289,0,0,3}" + }, + { + "npc_id": "1253", + "loc_data": "{3488,3297,0,0,6}" + }, + { + "npc_id": "1257", + "loc_data": "{3490,3290,0,0,3}-{3487,3303,0,1,5}-{3496,3296,0,1,4}-{3479,3303,0,1,4}-{3498,3282,0,1,3}-{3473,3281,0,1,3}-{3478,3308,0,1,1}" + }, + { + "npc_id": "1258", + "loc_data": "{3488,3287,0,1,1}-{3501,3285,0,1,5}-{3478,3274,0,1,4}-{3497,3283,0,1,1}" + }, + { + "npc_id": "1261", + "loc_data": "{3492,3300,0,1,4}-{3498,3300,0,1,5}-{3487,3302,0,1,6}-{3497,3299,0,1,5}-{3488,3273,0,1,6}" + }, + { + "npc_id": "1262", + "loc_data": "{3487,3283,0,1,1}-{3477,3300,0,1,4}-{3497,3276,0,1,1}-{3502,3279,0,1,1}-{3481,3296,0,1,2}" + }, + { + "npc_id": "1263", + "loc_data": "{3108,3160,1,1,1}" + }, + { + "npc_id": "1266", + "loc_data": "{2680,3719,0,0,7}-{2684,3722,0,0,1}-{2684,3726,0,0,1}-{2678,3728,0,0,2}-{2673,3728,0,0,0}-{2670,3724,0,0,3}-{2671,3726,0,0,2}-{2679,3731,0,0,2}-{2684,3729,0,0,6}-{2688,3721,0,0,1}-{2693,3715,0,0,5}-{2699,3715,0,0,2}-{2706,3711,0,0,1}-{2712,3718,0,0,5}-{2716,3721,0,0,7}-{2722,3726,0,0,1}-{2525,3763,0,0,7}-{2508,3762,0,0,0}-{2510,3755,0,0,2}-{2523,3756,0,0,1}-{2532,3752,0,0,0}-{2529,3755,0,0,1}-{2528,3739,0,0,6}-{2529,3730,0,0,0}-{2518,3724,0,0,1}-{2508,3723,0,0,1}-{2525,3718,0,0,1}-{2549,3733,0,0,3}" + }, + { + "npc_id": "1268", + "loc_data": "{2681,3716,0,0,2}-{2678,3721,0,0,2}-{2684,3719,0,0,1}-{2699,3719,0,0,4}-{2701,3717,0,0,2}-{2707,3719,0,0,0}-{2700,3726,0,0,2}-{2695,3713,0,0,2}-{2716,3718,0,0,5}-{2706,3713,0,0,2}-{2537,3761,0,0,7}-{2537,3761,0,0,7}-{2528,3767,0,0,3}-{2526,3753,0,0,2}-{2513,3755,0,0,3}-{2505,3753,0,0,3}-{2530,3751,0,0,1}-{2527,3755,0,0,1}-{2532,3758,0,0,6}-{2532,3751,0,0,3}-{2530,3738,0,0,2}-{2531,3729,0,0,0}-{2523,3723,0,0,1}-{2520,3722,0,0,3}-{2515,3720,0,0,3}-{2505,3724,0,0,4}-{2505,3729,0,0,6}-{2535,3717,0,0,4}-{2536,3724,0,0,1}-{2543,3729,0,0,6}-{2550,3734,0,0,1}-{2552,3747,0,0,6}-{2552,3752,0,0,6}" + }, + { + "npc_id": "1269", + "loc_data": "{2672,3683,0,1,3}" + }, + { + "npc_id": "1270", + "loc_data": "{2770,3624,0,0,0}" + }, + { + "npc_id": "1274", + "loc_data": "{2660,3680,0,0,6}" + }, + { + "npc_id": "1275", + "loc_data": "{2657,3680,0,0,6}" + }, + { + "npc_id": "1276", + "loc_data": "{2658,3679,0,0,6}" + }, + { + "npc_id": "1277", + "loc_data": "{2659,3678,0,0,6}" + }, + { + "npc_id": "1278", + "loc_data": "{2659,3664,0,1,3}" + }, + { + "npc_id": "1281", + "loc_data": "{2661,3651,0,1,3}" + }, + { + "npc_id": "1282", + "loc_data": "{2640,3681,0,1,4}" + }, + { + "npc_id": "1283", + "loc_data": "{2647,3660,0,1,5}" + }, + { + "npc_id": "1284", + "loc_data": "{2658,3673,0,1,1}" + }, + { + "npc_id": "1285", + "loc_data": "{2657,3669,0,1,1}" + }, + { + "npc_id": "1286", + "loc_data": "{2656,3676,0,1,1}" + }, + { + "npc_id": "1287", + "loc_data": "{2652,3588,0,1,1}" + }, + { + "npc_id": "1288", + "loc_data": "{2634,3667,0,1,1}" + }, + { + "npc_id": "1289", + "loc_data": "{2667,3692,0,1,1}" + }, + { + "npc_id": "1294", + "loc_data": "{2658,3673,0,1,7}" + }, + { + "npc_id": "1296", + "loc_data": "{2660,3663,0,0,6}-{2657,3663,0,0,6}" + }, + { + "npc_id": "1298", + "loc_data": "{2663,3646,0,0,6}" + }, + { + "npc_id": "1299", + "loc_data": "{2660,3646,0,0,6}" + }, + { + "npc_id": "1300", + "loc_data": "{2662,3674,0,1,1}" + }, + { + "npc_id": "1301", + "loc_data": "{2623,3675,0,1,6}" + }, + { + "npc_id": "1302", + "loc_data": "{2641,3699,0,0,4}" + }, + { + "npc_id": "1303", + "loc_data": "{2664,3692,0,1,3}" + }, + { + "npc_id": "1304", + "loc_data": "{2582,3845,0,0,3}" + }, + { + "npc_id": "1305", + "loc_data": "{2643,3676,0,1,7}" + }, + { + "npc_id": "1306", + "loc_data": "{2674,3677,0,1,6}" + }, + { + "npc_id": "1307", + "loc_data": "{2658,3673,0,1,7}" + }, + { + "npc_id": "1308", + "loc_data": "{2672,3662,0,1,3}" + }, + { + "npc_id": "1309", + "loc_data": "{2667,3653,0,1,3}" + }, + { + "npc_id": "1310", + "loc_data": "{2667,3701,0,1,4}" + }, + { + "npc_id": "1311", + "loc_data": "{2655,3651,0,1,3}" + }, + { + "npc_id": "1312", + "loc_data": "{2639,3651,0,1,6}" + }, + { + "npc_id": "1313", + "loc_data": "{2626,3653,0,1,5}" + }, + { + "npc_id": "1314", + "loc_data": "{2675,3677,0,1,3}" + }, + { + "npc_id": "1315", + "loc_data": "{2646,3675,0,1,3}" + }, + { + "npc_id": "1317", + "loc_data": "{2632,3677,0,1,2}-{2641,3682,0,1,3}-{2643,3675,0,1,6}-{2643,3674,0,1,4}-{2646,3668,0,1,3}-{2651,3669,0,1,3}-{2648,3688,0,1,4}-{2656,3692,0,1,1}" + }, + { + "npc_id": "1318", + "loc_data": "{2671,3658,0,1,2}-{2638,3648,0,1,3}-{2626,3658,0,1,4}-{2626,3668,0,1,1}-{2613,3668,0,1,3}-{2630,3673,0,1,7}-{2635,3680,0,1,4}-{2644,3675,0,1,5}-{2642,3681,0,1,3}-{2631,3678,0,1,6}-{2661,3698,0,1,1}-{2663,3687,0,1,3}-{2673,3695,0,1,3}-{2674,3710,0,1,1}-{2676,3693,0,1,3}-{2675,3685,0,1,4}-{2669,3677,0,1,1}-{2667,3670,0,1,2}-{2675,3670,0,1,4}-{2679,3685,0,1,2}-{2667,3671,0,1,3}-{2666,3663,0,1,6}-{2688,3659,0,1,2}-{2658,3657,0,1,4}-{2684,3649,0,1,4}-{2679,3649,0,1,4}-{2646,3664,0,1,4}-{2646,3655,0,1,1}-{2637,3655,0,1,3}-{2667,3658,0,1,3}" + }, + { + "npc_id": "1320", + "loc_data": "{2738,3636,0,1,7}-{2739,3636,0,1,7}-{2738,3637,0,1,4}-{2735,3637,0,1,3}" + }, + { + "npc_id": "1321", + "loc_data": "{2736,3642,0,1,4}-{2744,3638,0,1,4}" + }, + { + "npc_id": "1329", + "loc_data": "{3073,3640,0,0,0}" + }, + { + "npc_id": "1334", + "loc_data": "{2510,3644,1,1,3}" + }, + { + "npc_id": "1338", + "loc_data": "{3151,5559,0,1,2}-{3157,5548,0,1,3}-{3155,5553,0,1,4}-{3145,5559,0,1,6}-{3152,5556,0,1,3}-{3149,5544,0,1,0}-{3145,5548,0,1,3}" + }, + { + "npc_id": "1339", + "loc_data": "{3153,5547,0,1,0}-{3150,5545,0,1,1}" + }, + { + "npc_id": "1340", + "loc_data": "{3147,5557,0,1,3}-{3154,5559,0,1,4}" + }, + { + "npc_id": "1343", + "loc_data": "{3145,5548,0,1,6}" + }, + { + "npc_id": "1359", + "loc_data": "{2612,3875,1,1,6}" + }, + { + "npc_id": "1360", + "loc_data": "{2620,3896,0,0,3}" + }, + { + "npc_id": "1369", + "loc_data": "{2165,3276,0,1,0}" + }, + { + "npc_id": "1373", + "loc_data": "{2500,3860,1,1,4}" + }, + { + "npc_id": "1374", + "loc_data": "{2505,3854,1,0,4}-{2509,3849,0,0,4}" + }, + { + "npc_id": "1375", + "loc_data": "{2501,3858,1,0,4}" + }, + { + "npc_id": "1376", + "loc_data": "{2548,3895,0,1,0}" + }, + { + "npc_id": "1377", + "loc_data": "{2544,3843,0,1,6}" + }, + { + "npc_id": "1378", + "loc_data": "{2516,3865,0,1,4}" + }, + { + "npc_id": "1385", + "loc_data": "{2629,3694,0,0,6}" + }, + { + "npc_id": "1389", + "loc_data": "{2603,3877,0,1,1}" + }, + { + "npc_id": "1390", + "loc_data": "{2604,3876,0,1,4}" + }, + { + "npc_id": "1391", + "loc_data": "{2604,3876,0,1,3}" + }, + { + "npc_id": "1393", + "loc_data": "{2519,3868,0,0,3}" + }, + { + "npc_id": "1394", + "loc_data": "{2519,3863,0,0,1}" + }, + { + "npc_id": "1395", + "loc_data": "{2547,3868,0,0,1}" + }, + { + "npc_id": "1396", + "loc_data": "{2525,3892,0,0,4}" + }, + { + "npc_id": "1397", + "loc_data": "{2573,3856,0,0,4}" + }, + { + "npc_id": "1398", + "loc_data": "{2526,3850,0,0,6}" + }, + { + "npc_id": "1399", + "loc_data": "{2577,3854,0,0,1}" + }, + { + "npc_id": "1400", + "loc_data": "{3037,4512,0,1,0}-{3049,4498,0,1,1}" + }, + { + "npc_id": "1401", + "loc_data": "{2605,3878,0,1,1}" + }, + { + "npc_id": "1402", + "loc_data": "{2603,3877,0,1,1}" + }, + { + "npc_id": "1404", + "loc_data": "{3037,4492,0,1,4}-{3036,4502,0,1,4}-{3029,4520,0,1,1}-{3019,4512,0,1,1}-{2239,3164,0,1,2}-{2241,3166,0,1,3}-{2242,3163,0,1,3}" + }, + { + "npc_id": "1405", + "loc_data": "{2576,3843,0,0,6}" + }, + { + "npc_id": "1427", + "loc_data": "{2957,3025,0,0,0}" + }, + { + "npc_id": "1434", + "loc_data": "{2753,2770,0,1,6}" + }, + { + "npc_id": "1447", + "loc_data": "{2761,2785,0,1,3}" + }, + { + "npc_id": "1452", + "loc_data": "{2743,2796,0,1,6}" + }, + { + "npc_id": "1454", + "loc_data": "{2742,2790,0,1,1}" + }, + { + "npc_id": "1457", + "loc_data": "{2747,2782,0,0,1}-{2754,2778,0,1,1}-{2761,2778,0,1,1}-{2765,2779,0,1,4}-{2767,2784,0,1,6}-{2772,2781,0,1,5}-{2774,2787,0,1,1}-{2777,2790,0,1,4}-{2762,2793,0,1,3}-{2756,2789,0,1,3}" + }, + { + "npc_id": "1458", + "loc_data": "{2728,2751,0,1,1}-{2728,2758,0,1,1}-{2727,2762,0,1,6}-{2728,2755,0,1,6}-{2714,2753,0,1,1}-{2714,2757,0,1,6}-{2714,2761,0,1,6}-{2715,2749,0,1,2}" + }, + { + "npc_id": "1459", + "loc_data": "{2790,2791,0,1,4}-{2803,2785,0,1,7}-{2797,2792,0,1,0}-{2800,2779,0,1,5}-{2788,2779,0,1,7}-{2795,2776,0,1,3}" + }, + { + "npc_id": "1460", + "loc_data": "{2787,2794,0,1,3}" + }, + { + "npc_id": "1463", + "loc_data": "{2600,3276,0,1,4}-{2601,3276,0,1,6}-{2601,3277,0,1,6}-{2601,3278,0,1,2}-{2602,3279,0,1,5}-{2602,3282,0,1,4}-{2604,3276,0,1,4}-{2605,3280,0,1,4}-{2605,3281,0,1,7}-{2606,3280,0,1,4}" + }, + { + "npc_id": "1469", + "loc_data": "{2595,3277,0,0,0}" + }, + { + "npc_id": "1514", + "loc_data": "{3432,3487,0,0,0}" + }, + { + "npc_id": "1515", + "loc_data": "{3438,3487,0,0,0}" + }, + { + "npc_id": "1516", + "loc_data": "{3437,3487,0,0,0}" + }, + { + "npc_id": "1517", + "loc_data": "{3434,3483,0,0,0}" + }, + { + "npc_id": "1518", + "loc_data": "{3435,3483,0,0,0}" + }, + { + "npc_id": "1519", + "loc_data": "{3433,3486,0,0,0}" + }, + { + "npc_id": "1520", + "loc_data": "{3434,3486,0,0,0}" + }, + { + "npc_id": "1553", + "loc_data": "{2828,10065,1,0,0}" + }, + { + "npc_id": "1554", + "loc_data": "{2829,10104,1,0,0}" + }, + { + "npc_id": "1555", + "loc_data": "{2829,10096,1,0,0}" + }, + { + "npc_id": "1560", + "loc_data": "{3150,5454,0,1,4}-{3144,5446,0,1,7}-{3166,5446,0,1,3}-{3158,5451,0,1,7}" + }, + { + "npc_id": "1561", + "loc_data": "{3144,5450,0,1,1}-{3153,5454,0,1,5}-{3160,5450,0,1,5}-{3167,5450,0,1,3}-{3161,5451,0,1,1}" + }, + { + "npc_id": "1562", + "loc_data": "{3147,5448,0,1,4}" + }, + { + "npc_id": "1563", + "loc_data": "{3152,5453,0,1,0}" + }, + { + "npc_id": "1582", + "loc_data": "{2657,9500,0,0,1}-{2632,9589,2,0,1}-{2628,9549,2,0,5}-{2629,9543,2,0,2}-{3249,5517,0,1,3}-{2568,9889,0,1,6}-{2578,9898,0,1,1}-{2352,9755,0,1,1}-{2343,9775,0,1,1}-{2340,9777,0,1,1}-{2334,9775,0,1,1}" + }, + { + "npc_id": "1583", + "loc_data": "{2655,9481,0,0,3}-{2631,9579,2,0,4}-{3211,5519,0,1,0}-{3254,5513,0,1,7}-{2563,9885,0,1,7}-{2575,9897,0,1,1}-{2352,9760,0,1,1}" + }, + { + "npc_id": "1584", + "loc_data": "{2661,9481,0,0,4}-{2635,9570,2,0,1}-{2627,9539,2,0,5}-{3209,5512,0,1,6}-{3231,5494,0,1,7}-{2350,9776,0,1,1}-{2337,9773,0,1,1}" + }, + { + "npc_id": "1585", + "loc_data": "{2666,9482,0,0,5}-{2641,9563,2,0,5}-{3257,5523,0,1,1}-{3204,5516,0,1,3}-{2575,9892,0,1,6}-{2355,9762,0,1,1}-{2354,9768,0,1,1}-{2351,9770,0,1,1}-{2354,9773,0,1,1}" + }, + { + "npc_id": "1586", + "loc_data": "{2668,9497,0,0,4}-{2635,9565,2,0,4}-{2633,9554,2,0,4}-{3247,5520,0,1,5}-{3205,5513,0,1,6}-{3213,5519,0,1,7}" + }, + { + "npc_id": "1587", + "loc_data": "{2692,3202,0,1,4}-{2695,3216,0,1,0}-{2830,3241,0,1,6}-{2681,9577,0,0,0}-{2673,9591,0,0,5}-{2655,9575,0,0,5}-{2640,9580,0,0,0}-{2646,9553,0,0,1}-{2650,9536,0,0,7}-{2645,9489,0,0,7}-{2670,9543,0,0,0}-{2663,9555,0,0,7}-{3237,5557,0,1,3}" + }, + { + "npc_id": "1588", + "loc_data": "{2691,3215,0,1,3}-{2826,3245,0,1,3}-{2679,9592,0,0,2}-{2654,9587,0,0,3}-{2650,9564,0,0,6}-{2647,9548,0,0,6}-{2637,9545,0,0,5}-{2637,9532,0,0,5}-{2634,9521,0,0,0}-{2642,9493,0,0,0}-{2645,9484,0,0,7}-{2678,9548,0,0,4}-{2658,9551,0,0,1}-{3246,5558,0,1,4}" + }, + { + "npc_id": "1589", + "loc_data": "{2698,9503,0,0,7}-{2713,9505,0,0,0}-{2717,9502,0,0,7}-{2699,9523,0,0,0}-{2706,9525,0,0,2}-{2719,9517,0,0,5}-{2724,9515,0,0,3}" + }, + { + "npc_id": "1590", + "loc_data": "{2730,9490,0,1,0}-{2731,9482,0,1,7}-{2742,9491,0,1,0}-{3184,5557,0,1,7}-{3148,5514,0,1,6}-{3144,5514,0,1,3}-{2340,9733,0,1,3}-{2348,9733,0,1,3}-{2348,9743,0,1,3}" + }, + { + "npc_id": "1591", + "loc_data": "{2703,9456,0,0,0}-{2717,9459,0,0,7}-{2731,9460,0,0,3}-{2737,9454,0,0,3}-{2737,9444,0,0,3}-{2736,9432,0,0,3}-{2738,9421,0,0,5}-{2727,9418,0,0,1}-{2724,9439,0,0,0}-{2715,9443,0,0,4}-{2891,3919,0,1,0}-{2901,3914,0,1,0}-{2911,3914,0,1,0}-{2920,3919,0,1,0}-{2929,3919,0,1,0}-{2929,3935,0,1,0}-{2929,3944,0,1,0}-{2702,9443,0,0,3}-{2700,9428,0,0,3}-{2705,9419,0,0,7}-{2311,9744,0,1,3}-{2313,9733,0,1,3}-{2317,9735,0,1,3}-{2329,9736,0,1,3}" + }, + { + "npc_id": "1592", + "loc_data": "{2893,3929,0,1,0}-{2893,3942,0,1,0}-{2897,3951,0,1,0}-{2903,3954,0,1,0}-{2910,3954,0,1,0}-{2920,3952,0,1,0}-{2929,3952,0,1,0}-{2728,9426,0,0,4}-{2714,9432,0,0,0}-{2707,9450,0,0,6}-{2724,9451,0,0,6}-{2311,9778,0,1,3}-{2313,9772,0,1,2}-{2318,9776,0,1,3}-{2318,9764,0,1,3}-{2318,9760,0,1,3}-{2313,9752,0,1,3}" + }, + { + "npc_id": "1593", + "loc_data": "{2744,9503,0,0,2}-{2681,9563,0,0,5}-{2677,9586,0,0,2}-{2644,9587,0,0,1}-{2652,9526,0,0,7}-{2656,9514,0,0,7}-{2666,9522,0,0,4}-{2665,9513,0,0,3}-{2666,9489,0,0,1}-{2702,9525,0,0,2}-{2704,9487,0,0,7}-{2711,9485,0,0,2}-{2722,9486,0,0,4}-{2717,9480,0,0,6}-{2733,9494,0,0,1}-{2742,9489,0,0,0}-{2638,9592,2,0,5}-{2633,9583,2,0,7}-{2627,9545,2,0,6}-{2626,9535,2,0,6}-{2628,9507,2,0,5}-{2635,9508,2,0,2}-{2634,9483,2,0,7}" + }, + { + "npc_id": "1594", + "loc_data": "{2672,9569,0,0,1}-{2657,9577,0,0,3}-{2643,9543,0,0,7}-{2646,9530,0,0,7}-{2643,9519,0,0,7}-{2660,9521,0,0,1}-{2665,9527,0,0,2}-{2671,9521,0,0,7}-{2670,9516,0,0,6}-{2660,9497,0,0,7}-{2643,9487,0,0,5}-{2653,9488,0,0,2}-{2677,9501,0,0,2}-{2699,9516,0,0,0}-{2709,9524,0,0,7}-{2683,9476,0,0,7}-{2700,9489,0,0,5}-{2703,9484,0,0,5}-{2710,9481,0,0,2}-{2716,9486,0,0,2}-{2726,9489,0,0,1}-{2735,9481,0,0,4}-{2740,9497,0,0,2}-{2739,9506,0,0,0}-{2658,9546,0,0,6}-{2636,9574,2,0,7}-{2643,9566,2,0,7}-{2635,9559,2,0,7}-{2630,9515,2,0,7}-{2642,9506,2,0,7}-{2629,9487,2,0,5}-{2648,9476,2,0,7}" + }, + { + "npc_id": "1595", + "loc_data": "{2744,3152,0,1,7}" + }, + { + "npc_id": "1597", + "loc_data": "{3146,9913,0,1,6}" + }, + { + "npc_id": "1598", + "loc_data": "{2447,4429,0,1,6}" + }, + { + "npc_id": "1600", + "loc_data": "{2791,9997,0,1,3}-{3190,9574,0,1,6}" + }, + { + "npc_id": "1601", + "loc_data": "{2797,9997,0,1,6}-{2781,9996,0,1,7}" + }, + { + "npc_id": "1602", + "loc_data": "{2793,9995,0,1,3}-{2783,9998,0,1,6}" + }, + { + "npc_id": "1603", + "loc_data": "{2789,9994,0,1,1}-{2786,9998,0,1,5}" + }, + { + "npc_id": "1604", + "loc_data": "{3434,3550,1,1,3}-{3439,3549,1,1,4}-{3425,3549,1,1,5}-{3423,3553,1,1,4}-{3426,3541,1,1,1}-{3425,3541,1,1,2}-{3426,3539,1,1,0}-{3420,3537,1,1,3}-{3417,3536,1,1,6}-{2373,9778,0,1,1}-{2372,9768,0,1,1}-{2371,9774,0,1,1}-{2375,9770,0,1,1}-{2383,9777,0,1,1}-{2387,9774,0,1,1}-{2384,9772,0,1,1}-{2387,9770,0,1,1}-{2392,9780,0,1,1}-{2396,9775,0,1,1}-{2399,9777,0,1,1}" + }, + { + "npc_id": "1608", + "loc_data": "{2698,9999,0,1,6}-{2695,9997,0,1,7}-{2697,9996,0,1,5}-{2695,9999,0,1,6}" + }, + { + "npc_id": "1609", + "loc_data": "{2700,9994,0,1,6}-{2698,10001,0,1,4}-{2703,9994,0,1,4}-{2701,10000,0,1,4}" + }, + { + "npc_id": "1610", + "loc_data": "{3443,3537,2,1,4}-{3434,3536,2,1,4}-{3443,3540,2,1,3}-{3446,3548,2,1,4}-{3439,3549,2,1,3}-{3434,3547,2,1,1}-{3444,3537,2,1,3}-{3174,5474,0,1,4}-{3175,5479,0,1,6}-{3183,5473,0,1,7}-{3178,5468,0,1,4}-{2428,9745,0,1,1}-{2428,9742,0,1,1}-{2428,9735,0,1,1}-{2425,9737,0,1,1}-{2422,9735,0,1,1}-{2419,9738,0,1,1}" + }, + { + "npc_id": "1612", + "loc_data": "{3438,3562,0,1,1}-{3430,3564,0,1,3}-{3434,3555,0,1,5}-{3443,3551,0,1,4}-{3442,3545,0,1,1}-{3449,3536,0,1,1}-{3440,3539,0,1,4}" + }, + { + "npc_id": "1613", + "loc_data": "{3439,3565,2,1,6}-{3443,3571,2,1,1}-{3435,3565,2,1,3}-{3443,3564,2,1,2}-{3444,3559,2,1,2}-{3427,3558,2,1,0}-{3425,3557,2,1,4}-{3430,3557,2,1,3}-{3170,5554,0,1,2}-{3166,5556,0,1,5}-{3171,5560,0,1,4}-{3173,5556,0,1,3}-{2426,9751,0,1,1}-{2427,9754,0,1,1}-{2425,9757,0,1,1}-{2422,9756,0,1,1}-{2426,9753,0,1,1}-{2420,9755,0,1,1}-{2417,9755,0,1,1}-{2406,9763,0,1,1}-{2404,9765,0,1,1}-{2407,9766,0,1,1}-{2410,9764,0,1,1}-{2416,9765,0,1,1}-{2417,9763,0,1,1}-{2420,9764,0,1,1}-{2418,9765,0,1,1}" + }, + { + "npc_id": "1615", + "loc_data": "{3422,3566,2,1,5}-{3426,3568,2,1,6}-{3418,3562,2,1,4}-{3414,3566,2,1,3}-{3412,3570,2,1,4}-{3421,3572,2,1,2}-{3422,3571,2,1,1}-{3033,4873,0,1,7}-{3039,4885,0,1,3}-{3050,4890,0,1,3}-{3062,4892,0,1,5}-{3064,4901,0,1,3}-{3056,4912,0,1,3}-{3048,4916,0,1,5}-{3038,4911,0,1,6}-{3022,4914,0,1,6}-{3018,4902,0,1,6}-{3025,4898,0,1,4}-{3033,4885,0,1,0}-{3021,4877,0,1,3}-{3048,4872,0,1,1}-{3061,4880,0,1,3}-{3061,4891,0,1,1}-{3054,4901,0,1,1}-{2402,9739,0,1,1}-{2402,9742,0,1,1}-{2402,9751,0,1,1}-{2406,9753,0,1,1}-{2408,9750,0,1,1}-{2404,9748,0,1,1}-{2407,9748,0,1,1}-{2416,9748,0,1,1}-{2415,9745,0,1,1}-{2418,9745,0,1,1}" + }, + { + "npc_id": "1616", + "loc_data": "{2741,10011,0,1,2}-{2742,10010,0,1,3}-{2739,10014,0,1,1}-{2740,10006,0,1,3}" + }, + { + "npc_id": "1617", + "loc_data": "{2743,10003,0,1,1}-{2746,10008,0,1,2}-{2743,10015,0,1,3}-{2745,10011,0,1,5}-{2744,10016,0,1,1}" + }, + { + "npc_id": "1618", + "loc_data": "{3424,3565,1,1,1}-{3416,3562,1,1,6}-{3423,3559,1,1,0}-{3424,3560,1,1,4}-{3412,3558,1,1,1}-{3412,3568,1,1,1}-{3417,3565,1,1,3}-{2425,9774,0,1,1}-{2425,9776,0,1,1}-{2423,9779,0,1,1}-{2419,9785,0,1,1}-{2415,9785,0,1,1}-{2416,9788,0,1,1}-{2430,9788,0,1,1}-{2434,9789,0,1,1}-{2436,9794,0,1,1}" + }, + { + "npc_id": "1620", + "loc_data": "{2794,10036,0,1,4}-{2788,10037,0,1,0}-{2795,10034,0,1,3}-{2785,10035,0,1,3}" + }, + { + "npc_id": "1621", + "loc_data": "{2797,10035,0,1,6}-{2787,10032,0,1,3}-{2802,10031,0,1,3}" + }, + { + "npc_id": "1624", + "loc_data": "{3179,5522,0,1,6}-{3223,9393,0,1,5}-{3225,9401,0,1,0}-{3222,9375,0,1,6}-{3220,9380,0,1,6}-{3215,9364,0,1,3}-{3213,9361,0,1,1}-{3212,9355,0,1,2}-{3230,9367,0,1,3}-{3240,9350,0,1,5}-{3248,9348,0,1,4}-{3255,9350,0,1,4}-{3256,9392,0,1,4}-{3168,5513,0,1,3}-{3174,5514,0,1,6}-{3178,5517,0,1,4}-{3178,5528,0,1,1}-{3169,5516,0,1,3}-{3179,5524,0,1,4}" + }, + { + "npc_id": "1626", + "loc_data": "{3165,5537,0,1,3}-{3159,5538,0,1,4}-{3155,5539,0,1,3}-{3158,5537,0,1,4}" + }, + { + "npc_id": "1627", + "loc_data": "{2724,10008,0,1,4}" + }, + { + "npc_id": "1628", + "loc_data": "{2723,10004,0,1,4}-{2722,9999,0,1,1}-{2729,10002,0,1,1}" + }, + { + "npc_id": "1629", + "loc_data": "{2723,10005,0,1,0}-{2726,9998,0,1,1}-{2723,10009,0,1,3}-{2727,9998,0,1,4}-{2727,10001,0,1,3}" + }, + { + "npc_id": "1630", + "loc_data": "{2721,10005,0,1,1}-{2724,10005,0,1,3}-{2729,10004,0,1,3}-{2724,10012,0,1,4}-{2718,10009,0,1,1}-{2721,10001,0,1,7}-{2720,9996,0,1,7}-{2721,10006,0,1,3}" + }, + { + "npc_id": "1631", + "loc_data": "{2800,10017,0,1,1}-{2796,10021,0,1,1}-{2805,10021,0,1,1}-{2803,10013,0,1,1}-{3160,9589,0,1,3}-{3167,9589,0,1,6}-{3179,9585,0,1,1}-{3188,9572,0,1,7}-{3190,9580,0,1,3}-{3206,9586,0,1,3}-{3221,9586,0,1,7}-{3226,9573,0,1,5}-{3223,9569,0,1,1}" + }, + { + "npc_id": "1632", + "loc_data": "{2798,10019,0,1,1}-{2800,10015,0,1,1}-{2797,10018,0,1,1}" + }, + { + "npc_id": "1633", + "loc_data": "{1935,3217,0,1,0}-{1933,3209,0,1,0}-{1930,3208,0,1,0}-{1929,3217,0,1,0}-{1927,3219,0,1,0}-{1924,3211,0,1,0}-{1920,3216,0,1,0}-{1925,3213,0,1,0}-{1837,3244,0,1,0}-{1836,3250,0,1,0}-{1845,3251,0,1,0}-{1845,3247,0,1,0}-{1849,3241,0,1,0}-{1858,3251,0,1,0}-{1853,3247,0,1,0}-{1848,3254,0,1,0}-{2761,10007,0,1,0}-{2757,10010,0,1,3}-{2763,10000,0,1,5}-{2760,10011,0,1,0}-{2761,9997,0,1,4}-{3263,9399,0,1,3}-{3274,9397,0,1,1}-{3275,9393,0,1,6}-{3271,9384,0,1,0}-{3270,9380,0,1,2}-{3283,9378,0,1,6}-{3285,9386,0,1,5}-{3284,9401,0,1,4}-{3278,9353,0,1,1}-{3299,9380,0,1,1}-{3319,9402,0,1,1}-{3305,9350,0,1,4}" + }, + { + "npc_id": "1634", + "loc_data": "{2757,10008,0,1,6}-{2760,10005,0,1,5}" + }, + { + "npc_id": "1635", + "loc_data": "{2758,10001,0,1,1}-{2763,10006,0,1,1}-{2766,10000,0,1,6}-{2759,9999,0,1,7}" + }, + { + "npc_id": "1636", + "loc_data": "{2760,10004,0,1,1}-{2760,10002,0,1,6}" + }, + { + "npc_id": "1637", + "loc_data": "{3276,5454,0,1,4}-{3279,5450,0,1,0}-{3271,5446,0,1,3}-{3277,5512,0,1,1}-{2700,10027,0,1,6}-{3278,5535,0,0,0}-{3277,5520,0,1,1}" + }, + { + "npc_id": "1638", + "loc_data": "{3284,5456,0,1,1}-{3278,5453,0,1,1}-{3271,5512,0,1,4}-{2704,10022,0,1,4}-{2707,10023,0,1,4}" + }, + { + "npc_id": "1639", + "loc_data": "{3283,5461,0,1,4}-{3285,5456,0,1,6}-{3275,5455,0,1,5}-{3272,5446,0,1,4}-{3277,5445,0,1,3}-{2711,10028,0,1,2}-{2710,10030,0,1,6}" + }, + { + "npc_id": "1640", + "loc_data": "{3272,5445,0,1,4}-{2705,10028,0,1,3}-{2704,10031,0,1,6}" + }, + { + "npc_id": "1641", + "loc_data": "{2708,10025,0,1,6}" + }, + { + "npc_id": "1642", + "loc_data": "{2703,10020,0,1,0}" + }, + { + "npc_id": "1643", + "loc_data": "{3246,5446,0,1,3}-{3434,3562,1,1,6}-{3439,3558,1,1,5}-{3444,3567,1,1,4}-{3439,3571,1,1,3}-{3435,3570,1,1,7}-{3447,3561,1,1,4}-{3442,3573,1,1,6}-{3237,5455,0,1,0}-{3246,5450,0,1,4}" + }, + { + "npc_id": "1644", + "loc_data": "{3240,5448,0,1,7}" + }, + { + "npc_id": "1648", + "loc_data": "{3426,3537,0,1,4}-{3413,3536,0,1,3}-{3419,3545,0,1,2}-{3426,3544,0,1,6}-{3410,3535,0,1,2}-{3425,3556,0,1,6}-{3418,3557,0,1,1}-{3428,3571,0,1,3}-{3432,3573,0,1,4}" + }, + { + "npc_id": "1650", + "loc_data": "{3411,3541,0,1,3}" + }, + { + "npc_id": "1655", + "loc_data": "{3424,3544,0,1,1}-{3423,3546,0,1,1}-{3409,3538,0,1,3}-{3421,3559,0,1,4}-{3413,3559,0,1,6}-{3433,3574,0,1,3}-{3428,3571,0,1,6}" + }, + { + "npc_id": "1658", + "loc_data": "{2595,3087,1,1,1}" + }, + { + "npc_id": "1679", + "loc_data": "{2291,3145,0,1,2}" + }, + { + "npc_id": "1680", + "loc_data": "{2290,3143,0,1,3}" + }, + { + "npc_id": "1681", + "loc_data": "{3202,5483,0,1,4}-{2544,9843,0,1,3}" + }, + { + "npc_id": "1683", + "loc_data": "{3678,3511,0,1,4}" + }, + { + "npc_id": "1684", + "loc_data": "{3660,3517,0,1,7}" + }, + { + "npc_id": "1685", + "loc_data": "{3659,3497,0,1,0}" + }, + { + "npc_id": "1686", + "loc_data": "{3657,3516,0,1,3}-{3663,3522,0,1,7}-{3654,3518,1,1,6}" + }, + { + "npc_id": "1688", + "loc_data": "{3709,3497,0,0,3}" + }, + { + "npc_id": "1691", + "loc_data": "{3624,3530,0,1,1}-{3623,3524,0,1,2}-{3618,3526,0,1,6}-{3612,3527,0,1,6}-{3609,3527,0,1,4}" + }, + { + "npc_id": "1692", + "loc_data": "{3632,3528,0,1,5}-{3633,3525,0,1,6}-{3631,3529,0,1,3}-{3631,3529,0,1,2}-{3628,3530,0,1,1}-{3631,3530,0,1,4}-{3629,3529,0,1,4}" + }, + { + "npc_id": "1694", + "loc_data": "{3673,3491,0,1,3}" + }, + { + "npc_id": "1695", + "loc_data": "{3461,3558,0,0,3}" + }, + { + "npc_id": "1697", + "loc_data": "{3662,3502,0,1,4}-{3664,3493,0,1,6}-{3672,3486,0,1,2}-{3685,3485,0,1,3}-{3684,3496,0,1,3}-{3675,3502,0,1,3}-{3667,3484,0,1,0}-{3666,3471,0,1,4}-{3676,3464,0,1,3}-{3683,3467,0,1,6}-{3685,3474,0,1,4}-{3690,3474,0,1,1}-{3695,3473,0,1,3}-{3693,3466,0,1,7}-{3698,3463,0,1,3}-{3688,3467,0,1,3}-{3675,3474,0,1,4}-{3665,3476,0,1,6}-{3662,3491,0,1,1}-{3662,3495,0,1,4}-{3661,3501,0,1,6}-{3682,3486,0,1,4}-{3678,3493,0,1,4}-{3673,3491,0,1,3}-{3658,3502,0,1,4}-{3660,3505,0,1,1}-{3665,3469,0,1,6}-{3659,3465,0,1,6}-{3667,3461,0,1,1}" + }, + { + "npc_id": "1699", + "loc_data": "{3659,3480,0,1,3}" + }, + { + "npc_id": "1700", + "loc_data": "{3681,3493,0,1,5}" + }, + { + "npc_id": "1702", + "loc_data": "{3690,3464,0,0,1}-{3691,3464,0,0,1}-{3688,3464,0,0,1}-{3687,3464,0,0,1}" + }, + { + "npc_id": "1703", + "loc_data": "{3697,3496,0,1,3}-{3699,3497,0,1,2}-{3689,3503,0,1,3}-{3690,3508,0,1,6}-{3690,3512,0,1,6}-{3689,3517,0,1,1}-{3690,3524,0,1,6}-{3689,3528,0,1,5}-{3690,3518,0,1,5}-{3689,3503,0,1,3}-{3689,3496,0,1,0}" + }, + { + "npc_id": "1704", + "loc_data": "{3703,3487,0,0,3}" + }, + { + "npc_id": "1706", + "loc_data": "{3661,3508,0,0,1}-{3658,3508,0,0,1}-{3652,3487,0,0,3}-{3652,3484,0,0,3}" + }, + { + "npc_id": "1710", + "loc_data": "{3165,9631,0,1,6}-{3165,9633,0,1,0}-{3160,9634,0,1,7}-{3156,9630,0,1,6}-{3152,9627,0,1,4}-{3148,9621,0,1,4}-{3175,9630,0,1,1}-{3174,9634,0,1,3}-{3172,9638,0,1,0}" + }, + { + "npc_id": "1711", + "loc_data": "{3160,9638,0,1,1}-{3159,9633,0,1,6}-{3161,9626,0,1,6}-{3169,9626,0,1,4}-{3171,9634,0,1,4}-{3164,9634,0,1,3}-{3165,9631,0,1,7}-{3180,9631,0,1,7}-{3183,9629,0,1,6}-{3182,9633,0,1,1}-{3172,9632,0,1,4}-{3158,9631,0,1,1}-{3160,9630,0,1,1}-{3159,9633,0,1,4}-{3150,9623,0,1,6}-{3152,9620,0,1,6}-{3159,9622,0,1,0}-{3169,9623,0,1,6}-{3169,9623,0,1,4}-{2566,5197,0,1,4}" + }, + { + "npc_id": "1712", + "loc_data": "{3153,9646,0,1,3}-{3151,9651,0,1,1}-{2573,5201,0,1,4}-{2577,5195,0,1,4}-{2577,5189,0,0,6}-{2571,5195,0,0,6}" + }, + { + "npc_id": "1714", + "loc_data": "{3172,9624,0,1,2}-{3161,9623,0,1,1}-{3151,9624,0,1,1}-{3150,9622,0,1,4}-{3153,9627,0,1,3}-{3157,9634,0,1,2}-{3171,9636,0,1,6}-{3174,9639,0,1,3}-{3174,9634,0,1,3}" + }, + { + "npc_id": "1715", + "loc_data": "{3171,9635,0,1,3}-{3159,9636,0,1,2}-{3169,9630,0,1,3}-{3172,9625,0,1,0}-{3159,9627,0,1,3}" + }, + { + "npc_id": "1752", + "loc_data": "{2510,3228,0,1,3}" + }, + { + "npc_id": "1754", + "loc_data": "{3259,3308,0,1,4}-{3100,3246,0,1,2}-{3131,3263,0,1,5}-{3122,3278,0,1,2}" + }, + { + "npc_id": "1755", + "loc_data": "{3258,3312,0,1,3}-{3106,3275,0,1,1}-{3106,3266,0,1,3}-{3114,3273,0,1,4}" + }, + { + "npc_id": "1756", + "loc_data": "{3262,3320,0,1,1}-{3096,3251,0,1,3}-{3117,3278,0,1,0}-{3102,3261,0,1,1}" + }, + { + "npc_id": "1757", + "loc_data": "{3233,3308,0,0,4}" + }, + { + "npc_id": "1758", + "loc_data": "{2895,3403,0,0,0}-{3262,3325,0,0,0}" + }, + { + "npc_id": "1759", + "loc_data": "{3250,3310,0,0,0}" + }, + { + "npc_id": "1761", + "loc_data": "{3121,3274,0,0,0}" + }, + { + "npc_id": "1765", + "loc_data": "{3206,3265,0,1,4}-{2923,3320,0,1,7}-{2921,3320,0,1,4}-{2923,3320,0,1,5}" + }, + { + "npc_id": "1766", + "loc_data": "{3259,3262,0,1,4}-{3262,3274,0,1,3}-{3259,3278,0,1,1}-{3263,3273,0,1,7}-{3171,3320,0,1,0}" + }, + { + "npc_id": "1767", + "loc_data": "{3262,3262,0,1,6}-{3025,3311,0,1,5}-{2924,3288,0,0,1}-{2921,3290,0,1,1}-{2926,3279,0,1,1}-{2931,3272,0,1,1}-{2936,3273,0,1,6}" + }, + { + "npc_id": "1769", + "loc_data": "{2979,3203,0,1,4}-{3264,3249,0,1,4}-{2596,9822,0,1,4}" + }, + { + "npc_id": "1770", + "loc_data": "{2999,3212,0,1,1}-{3262,3253,0,1,6}-{3259,3254,0,1,3}-{2595,9826,0,1,1}" + }, + { + "npc_id": "1771", + "loc_data": "{2993,3199,0,1,6}-{3248,3233,0,1,6}-{3247,3240,0,1,3}-{3187, 3286, 0, 1, 0}-{3209, 3277, 0, 1, 0}-{3174, 3294, 0, 1, 0}-{3178, 3294, 0, 1, 0}-{3144, 3302, 0, 1, 0}-{3142, 3303, 0, 1, 0}-{3151, 3300, 0, 1, 0}-{3139, 3299, 0, 1, 0}" + }, + { + "npc_id": "1772", + "loc_data": "{2993,3203,0,1,0}-{3251,3231,0,1,1}-{3260,3241,0,1,0}-{3259,3222,0,0,4}" + }, + { + "npc_id": "1773", + "loc_data": "{2991,3219,0,1,1}-{3252,3227,0,1,1}-{3263,3219,0,1,0}" + }, + { + "npc_id": "1774", + "loc_data": "{3012,3204,0,1,3}-{3255,3228,0,1,4}-{3265,3219,0,1,2}-{2592,9834,0,1,6}" + }, + { + "npc_id": "1775", + "loc_data": "{3010,3211,0,1,6}-{3254,3224,0,1,1}-{2585,9829,0,1,1}" + }, + { + "npc_id": "1776", + "loc_data": "{2999,3216,0,1,6}-{3264,3247,0,1,2}" + }, + { + "npc_id": "1778", + "loc_data": "{3260,3859,0,0,0}" + }, + { + "npc_id": "1779", + "loc_data": "{2978,3752,0,1,6}" + }, + { + "npc_id": "1780", + "loc_data": "{3272,3687,0,1,3}" + }, + { + "npc_id": "1781", + "loc_data": "{3008,3862,0,0,0}" + }, + { + "npc_id": "1782", + "loc_data": "{3363,3883,0,1,4}" + }, + { + "npc_id": "1783", + "loc_data": "{3079,3516,0,1,6}" + }, + { + "npc_id": "1784", + "loc_data": "{3025,3705,0,1,1}" + }, + { + "npc_id": "1785", + "loc_data": "{3144,3788,0,1,6}" + }, + { + "npc_id": "1786", + "loc_data": "{3234,3633,0,1,1}" + }, + { + "npc_id": "1787", + "loc_data": "{3074,3609,0,1,3}" + }, + { + "npc_id": "1795", + "loc_data": "{2967,9811,0,0,0}" + }, + { + "npc_id": "1796", + "loc_data": "{2968,9809,0,0,0}" + }, + { + "npc_id": "1798", + "loc_data": "{2701,3471,0,0,0}" + }, + { + "npc_id": "1805", + "loc_data": "{2765,3652,0,1,0}" + }, + { + "npc_id": "1828", + "loc_data": "{3231,9545,0,1,6}" + }, + { + "npc_id": "1829", + "loc_data": "{3153,9548,0,1,1}-{3154,9547,0,1,4}-{3176,9546,0,1,4}-{3221,9558,0,1,4}-{3226,9548,0,1,7}-{3224,9551,0,1,1}-{3219,9558,0,1,7}" + }, + { + "npc_id": "1831", + "loc_data": "{3208,9555,0,1,1}-{3165,9542,0,1,3}-{3211,9570,0,1,5}-{3211,9570,0,1,5}-{3208,9555,0,1,1}-{3208,9555,0,1,1}-{3164,9542,0,1,3}-{3207,9555,0,1,1}-{3166,9542,0,1,3}-{3213,9570,0,1,5}" + }, + { + "npc_id": "1832", + "loc_data": "{3150,9573,0,1,1}-{3188,9550,0,1,0}-{3148,9578,0,1,4}-{3152,9556,0,1,3}-{3150,9553,0,1,2}-{3167,9547,0,1,1}-{3168,9546,0,1,3}-{3184,9551,0,1,3}-{3220,9573,0,1,4}-{3224,9574,0,1,1}-{3208,9588,0,1,6}-{3210,9585,0,1,4}-{3191,9583,0,1,4}-{3187,9583,0,1,3}-{3272,5549,0,1,0}-{3275,5546,0,1,0}-{3281,5545,0,1,2}-{3286,5544,0,1,0}-{3285,5539,0,1,3}-{3268,5553,0,1,1}-{3274,5558,0,1,6}-{3281,5557,0,1,4}-{3282,5554,0,1,4}-{3269,5551,0,1,3}-{3287,5549,0,1,3}-{3279,5546,0,1,6}-{3283,5545,0,1,0}-{3269,5548,0,1,1}" + }, + { + "npc_id": "1833", + "loc_data": "{3151,9575,0,1,3}-{3150,9577,0,1,4}-{3148,9554,0,1,6}-{3165,9547,0,1,1}-{3165,9546,0,1,2}-{3184,9551,0,1,3}-{3222,9575,0,1,4}-{3226,9576,0,1,3}-{3210,9587,0,1,2}-{3189,9581,0,1,4}" + }, + { + "npc_id": "1834", + "loc_data": "{3169,3174,0,0,6}" + }, + { + "npc_id": "1841", + "loc_data": "{3020,3452,0,0,0}" + }, + { + "npc_id": "1860", + "loc_data": "{2957,3203,0,1,3}" + }, + { + "npc_id": "1861", + "loc_data": "{3208,3256,0,0,1}" + }, + { + "npc_id": "1862", + "loc_data": "{3304,3211,0,1,1}" + }, + { + "npc_id": "1863", + "loc_data": "{3358,2956,0,0,6}" + }, + { + "npc_id": "1864", + "loc_data": "{3363,2956,0,0,3}" + }, + { + "npc_id": "1865", + "loc_data": "{3352,2974,0,1,4}" + }, + { + "npc_id": "1866", + "loc_data": "{3360,2983,0,1,4}" + }, + { + "npc_id": "1867", + "loc_data": "{3347,2966,0,0,6}" + }, + { + "npc_id": "1870", + "loc_data": "{3373,2972,0,1,5}" + }, + { + "npc_id": "1871", + "loc_data": "{3344,2986,0,1,3}" + }, + { + "npc_id": "1872", + "loc_data": "{3354,2953,0,0,6}" + }, + { + "npc_id": "1873", + "loc_data": "{3343,2962,0,1,0}-{3343,2964,0,1,1}" + }, + { + "npc_id": "1875", + "loc_data": "{3354,2952,0,0,1}" + }, + { + "npc_id": "1884", + "loc_data": "{2811,3174,0,0,0}" + }, + { + "npc_id": "1902", + "loc_data": "{3333,2946,0,0,1}" + }, + { + "npc_id": "1905", + "loc_data": "{3335,2948,0,1,2}-{3331,2948,0,1,6}-{3333,2950,0,1,0}" + }, + { + "npc_id": "1917", + "loc_data": "{3177,2987,0,1,6}" + }, + { + "npc_id": "1918", + "loc_data": "{3180,3043,0,1,2}" + }, + { + "npc_id": "1920", + "loc_data": "{3497,3478,0,0,0}" + }, + { + "npc_id": "1921", + "loc_data": "{3159,2980,0,1,1}" + }, + { + "npc_id": "1923", + "loc_data": "{3183,2974,0,0,7}" + }, + { + "npc_id": "1926", + "loc_data": "{3179,2967,0,1,3}-{3172,2966,0,1,1}-{3171,2980,0,1,3}-{3166,2972,0,1,0}-{3181,2979,0,1,3}-{3187,2976,0,1,7}-{3174,2984,0,1,3}-{3183,2982,0,1,4}-{3187,2985,0,1,1}-{3182,2988,0,1,5}-{3188,2990,0,1,2}-{3172,2992,0,1,4}-{3171,2987,0,1,4}-{3161,2982,0,1,2}-{3161,2986,0,1,3}-{3159,2987,0,1,3}-{3163,2976,0,1,4}-{3161,2977,0,1,4}-{3161,2979,0,1,6}-{3162,2982,0,1,6}-{3164,2985,0,1,2}-{3158,2970,0,1,3}-{3155,2979,0,1,4}-{3167,2972,0,1,6}-{3172,2973,0,1,5}-{3175,2973,0,1,4}-{3185,2967,0,1,2}" + }, + { + "npc_id": "1927", + "loc_data": "{3160,2979,0,0,5}-{3162,2989,0,0,1}" + }, + { + "npc_id": "1928", + "loc_data": "{3161,2977,0,0,4}-{3161,2987,0,0,1}" + }, + { + "npc_id": "1929", + "loc_data": "{3158,2987,0,0,3}" + }, + { + "npc_id": "1930", + "loc_data": "{3161,2985,0,0,6}-{3161,2983,0,0,6}-{3161,2982,0,0,6}-{3161,2981,0,0,6}-{3161,2984,0,0,6}" + }, + { + "npc_id": "1951", + "loc_data": "{2886,3723,0,1,3}-{2887,3720,0,1,4}-{2890,3721,0,1,7}-{2890,3724,0,1,1}-{2909,3736,0,1,5}-{2910,3736,0,1,2}-{2891,3724,0,1,7}" + }, + { + "npc_id": "1952", + "loc_data": "{2892,3726,0,1,0}-{2894,3726,0,1,6}-{2895,3728,0,1,0}-{2895,3730,0,1,5}-{2922,3755,0,1,3}-{2893,3725,0,1,2}-{2894,3727,0,1,6}-{2895,3725,0,1,3}-{2898,3735,0,1,6}" + }, + { + "npc_id": "1953", + "loc_data": "{2897,3733,0,1,5}-{2897,3737,0,1,5}-{2913,3736,0,1,3}-{2897,3737,0,1,6}-{2915,3740,0,1,1}-{2894,3742,0,1,0}" + }, + { + "npc_id": "1954", + "loc_data": "{2895,3751,0,1,1}-{2895,3755,0,1,6}-{2898,3751,0,1,3}-{2898,3755,0,1,6}-{2930,3765,0,1,5}-{2893,3748,0,1,5}-{2896,3749,0,1,1}-{2929,3762,0,1,3}" + }, + { + "npc_id": "1955", + "loc_data": "{2895,3740,0,1,1}-{2895,3744,0,1,3}-{2898,3740,0,1,6}-{2898,3744,0,1,1}-{2908,3739,0,1,0}-{2928,3763,0,1,3}-{2899,3737,0,1,2}-{2897,3739,0,1,6}-{2912,3742,0,1,2}-{2898,3750,0,1,3}-{2895,3751,0,1,4}" + }, + { + "npc_id": "1956", + "loc_data": "{2886,3758,0,1,6}-{2886,3762,0,1,3}-{2890,3756,0,1,4}-{2890,3762,0,1,1}-{2928,3753,0,1,2}-{2926,3753,0,1,6}-{2895,3754,0,1,3}" + }, + { + "npc_id": "1958", + "loc_data": "{3240,9326,0,1,3}-{3209,9310,0,1,4}-{3245,9333,0,1,4}-{3213,9307,0,1,4}-{3221,9318,0,1,3}-{3229,9333,0,1,3}-{3216,9329,0,1,4}-{3208,9294,0,1,3}-{3201,9286,0,1,1}-{3212,9326,0,1,4}-{3217,9284,0,1,7}-{3226,9284,0,1,4}-{3232,9299,0,1,6}-{3242,9295,0,1,1}-{3220,9302,0,1,0}-{3238,9305,0,1,6}-{3220,9296,0,1,1}-{3246,9291,0,1,3}-{3240,9289,0,1,4}-{3237,9305,0,1,3}-{3257,9292,0,0,5}-{3246,9321,0,1,1}-{3261,9310,0,1,3}-{3258,9309,0,1,4}-{3251,9316,0,1,3}-{3247,9310,0,1,3}-{3147,5467,0,1,1}-{3144,5466,0,1,2}-{3147,5479,0,1,2}-{3144,5475,0,1,6}-{3161,5482,0,1,5}-{3147,5475,0,1,6}" + }, + { + "npc_id": "1961", + "loc_data": "{3250,9326,0,1,4}-{3258,9327,0,1,6}-{3256,9333,0,1,1}-{3220,9309,0,1,4}-{3252,9333,0,1,3}-{3208,9318,0,1,3}-{3241,9331,0,1,6}-{3204,9328,0,1,3}-{3209,9328,0,1,3}-{3228,9323,0,1,4}-{3210,9282,0,1,7}-{3225,9329,0,1,6}-{3207,9299,0,1,4}-{3215,9295,0,1,3}-{3213,9322,0,1,3}-{3214,9315,0,1,0}-{3221,9291,0,1,0}-{3213,9303,0,1,4}-{3227,9304,0,1,6}-{3247,9301,0,1,1}-{3228,9284,0,1,3}-{3254,9286,0,1,4}-{3262,9291,0,1,6}-{3224,9302,0,1,3}-{3250,9298,0,1,3}-{3252,9293,0,1,6}-{3262,9299,0,1,1}-{3256,9297,0,1,7}-{3262,9285,0,1,1}-{3254,9322,0,1,0}-{3261,9318,0,1,4}-{3242,9316,0,1,6}-{3250,9306,0,1,3}-{3250,9327,0,1,3}-{3156,5477,0,1,5}-{3162,5479,0,1,4}-{3159,5477,0,1,6}-{3150,5474,0,1,3}-{3147,5480,0,1,1}-{3159,5484,0,1,3}" + }, + { + "npc_id": "1962", + "loc_data": "{3168,5458,0,1,2}-{3242,9331,0,1,3}-{3238,9333,0,1,6}-{3261,9330,0,1,1}-{3232,9333,0,1,0}-{3222,9324,0,1,4}-{3205,9303,0,1,3}" + }, + { + "npc_id": "1963", + "loc_data": "{3166,5465,0,1,7}-{3168,5462,0,1,0}-{3167,5467,0,1,1}-{3167,5467,0,1,7}" + }, + { + "npc_id": "1972", + "loc_data": "{2536, 3426, 0, 1, 0}" + }, + { + "npc_id": "1976", + "loc_data": "{3315,5508,0,1,5}-{3308,5510,0,1,3}-{3304,5507,0,1,4}-{3299,5509,0,1,3}-{3317,5514,0,1,3}-{3319,5518,0,1,4}-{3320,5507,0,1,4}-{3324,5513,0,1,1}-{3283,5510,0,1,5}-{3320,5550,0,1,0}-{3313,5523,0,1,4}-{3310,5541,0,1,4}-{3308,5535,0,1,5}-{3301,5531,0,1,4}-{3315,5530,0,1,1}-{3322,5536,0,1,4}-{3320,5539,0,1,7}-{3311,5519,0,1,3}-{3289,5525,0,1,2}-{3300,5519,0,1,6}-{3289,5515,0,1,7}-{3287,5523,0,1,3}" + }, + { + "npc_id": "1990", + "loc_data": "{3300,2797,0,0,6}" + }, + { + "npc_id": "1993", + "loc_data": "{3360,2935,0,1,4}-{3359,2924,0,1,6}-{3352,2936,0,1,0}-{3349,2931,0,1,6}-{3341,2924,0,1,4}" + }, + { + "npc_id": "1994", + "loc_data": "{3344,2933,0,1,3}-{3350,2936,0,1,4}" + }, + { + "npc_id": "2014", + "loc_data": "{3293,2788,0,1,0}" + }, + { + "npc_id": "2020", + "loc_data": "{3503,3477,0,0,0}" + }, + { + "npc_id": "2021", + "loc_data": "{3222,9525,2,1,3}-{3216,9522,2,1,3}-{3219,9518,2,1,3}-{3224,9521,2,1,3}-{3218,9523,2,1,3}-{3215,9521,2,1,3}-{3213,9522,2,1,3}-{3227,9517,2,1,3}" + }, + { + "npc_id": "2031", + "loc_data": "{3290,5448,0,1,6}-{3291,5452,0,1,1}-{3293,5456,0,1,6}-{3551,9680,0,0,2}-{3553,9679,0,0,1}-{3551,9675,0,0,6}-{3554,9676,0,0,7}-{3548,9676,0,0,5}-{3552,9691,0,0,2}-{3569,9681,0,0,7}-{3577,9711,0,0,5}-{3567,9675,0,0,5}-{3567,9675,0,0,5}-{3570,9678,0,0,2}-{3568,9686,0,0,1}-{3545,9721,0,0,7}-{3560,9712,0,0,6}-{3552,9685,0,0,1}-{3525,9698,0,0,6}-{3538,9668,0,0,4}" + }, + { + "npc_id": "2032", + "loc_data": "{3549,9678,0,0,0}-{3569,9676,0,0,5}-{3566,9678,0,0,1}-{3560,9678,0,0,2}-{3526,9678,0,0,2}-{3532,9693,0,0,5}-{3534,9690,0,0,7}-{3536,9695,0,0,2}-{3542,9694,0,0,7}-{3548,9695,0,0,7}-{3556,9695,0,0,5}-{3554,9709,0,0,2}-{3533,9708,0,0,5}-{3534,9703,0,0,5}-{3538,9721,0,0,7}-{3567,9720,0,0,6}-{3561,9711,0,0,7}-{3552,9703,0,0,1}-{3551,9698,0,0,1}-{3532,9678,0,0,5}-{3531,9675,0,0,5}-{3537,9677,0,0,2}-{3187,5513,0,1,3}-{3186,5510,0,1,6}-{3186,5516,0,1,6}-{3194,5511,0,1,1}-{3185,5514,0,1,5}" + }, + { + "npc_id": "2033", + "loc_data": "{3300,5494,0,1,2}-{3285,5492,0,1,6}-{3285,5495,0,1,0}-{3288,5497,0,1,3}-{3268,5487,0,0,0}-{3533,9691,0,0,4}-{3537,9694,0,0,2}-{3533,9696,0,0,2}-{3533,9693,0,0,5}-{3188,5511,0,1,7}-{3190,5511,0,1,6}" + }, + { + "npc_id": "2034", + "loc_data": "{3288,5484,0,1,4}-{3288,5467,0,1,0}-{3293,5468,0,1,2}-{3296,5475,0,1,7}-{3296,5473,0,1,2}-{3297,5480,0,1,4}-{3565,9695,0,0,1}-{3566,9692,0,0,5}-{3572,9695,0,0,7}" + }, + { + "npc_id": "2035", + "loc_data": "{3569,9696,0,0,2}-{3569,9693,0,0,6}-{3566,9694,0,0,6}-{3567,9698,0,0,2}-{3572,9692,0,0,5}" + }, + { + "npc_id": "2036", + "loc_data": "{3569,9674,0,0,0}-{3561,9677,0,0,6}-{3535,9686,0,0,6}-{3535,9698,0,0,1}-{3576,9677,0,0,3}-{3577,9679,0,0,1}-{3568,9691,0,0,2}-{3560,9694,0,0,6}-{3570,9682,0,0,1}-{3569,9687,0,0,2}-{3550,9711,0,0,5}-{3551,9708,0,0,6}-{3548,9713,0,0,6}-{3537,9711,0,0,4}-{3535,9702,0,0,7}-{3553,9722,0,0,4}-{3567,9712,0,0,5}-{3569,9704,0,0,6}-{3579,9693,0,0,7}-{3534,9675,0,0,2}-{3526,9711,0,0,1}-{3566,9668,0,0,4}" + }, + { + "npc_id": "2037", + "loc_data": "{3543,9677,0,0,3}-{3572,9680,0,0,7}-{3559,9677,0,0,4}-{3535,9685,0,0,1}-{3537,9693,0,0,1}-{3570,9697,0,0,2}-{3552,9713,0,0,6}-{3553,9711,0,0,3}-{3567,9708,0,0,6}-{3535,9679,0,0,1}-{3525,9683,0,0,6}" + }, + { + "npc_id": "2038", + "loc_data": "{2392,2984,0,0,0}" + }, + { + "npc_id": "2039", + "loc_data": "{2392,2984,0,0,0}" + }, + { + "npc_id": "2040", + "loc_data": "{2444,3047,0,0,0}" + }, + { + "npc_id": "2041", + "loc_data": "{2447,3050,0,0,0}" + }, + { + "npc_id": "2042", + "loc_data": "{2455,3048,0,0,0}" + }, + { + "npc_id": "2043", + "loc_data": "{2451,3030,0,0,0}-{2446,3040,0,0,0}" + }, + { + "npc_id": "2050", + "loc_data": "{2460,3046,0,0,0}-{2465,3052,0,0,0}" + }, + { + "npc_id": "2051", + "loc_data": "{2463,3053,0,0,0}" + }, + { + "npc_id": "2052", + "loc_data": "{2468,3045,0,0,0}" + }, + { + "npc_id": "2053", + "loc_data": "{2467,3051,0,0,0}" + }, + { + "npc_id": "2054", + "loc_data": "{2466,3046,0,0,0}" + }, + { + "npc_id": "2055", + "loc_data": "{2471,3056,0,0,0}" + }, + { + "npc_id": "2056", + "loc_data": "{2470,3040,0,0,0}" + }, + { + "npc_id": "2059", + "loc_data": "{2588,3088,0,1,3}" + }, + { + "npc_id": "2082", + "loc_data": "{3210,3220,1,1,6}" + }, + { + "npc_id": "2180", + "loc_data": "{2997,9837,0,1,3}" + }, + { + "npc_id": "2234", + "loc_data": "{3081,3251,0,1,6}-{2636,3365,0,1,6}" + }, + { + "npc_id": "2235", + "loc_data": "{3241,3345,0,1,4}" + }, + { + "npc_id": "2236", + "loc_data": "{3078,3250,0,1,1}-{3081,3250,0,1,2}" + }, + { + "npc_id": "2237", + "loc_data": "{3249,3266,0,1,5}" + }, + { + "npc_id": "2240", + "loc_data": "{3077,3259,0,1,4}" + }, + { + "npc_id": "2241", + "loc_data": "{3078,3260,0,1,3}" + }, + { + "npc_id": "2242", + "loc_data": "{3076,3260,0,1,1}-{3078,3260,0,1,6}" + }, + { + "npc_id": "2243", + "loc_data": "{3078,3259,0,1,3}" + }, + { + "npc_id": "2244", + "loc_data": "{3233,3228,0,1,3}" + }, + { + "npc_id": "2245", + "loc_data": "{2505,3240,0,1,4}-{2512,3250,0,1,1}-{2506,3242,0,1,3}-{2510,3252,0,1,4}-{2516,3248,0,1,1}-{2518,3245,0,1,7}-{2518,3245,0,1,1}-{2517,3242,0,1,6}-{2523,3241,0,1,4}-{2525,3241,0,1,1}-{2515,3256,0,1,6}-{2519,3257,0,1,4}" + }, + { + "npc_id": "2246", + "loc_data": "{2521,3239,0,1,5}" + }, + { + "npc_id": "2247", + "loc_data": "{2543,3225,0,1,7}-{2553,3220,0,1,3}-{2545,3220,0,1,4}-{2525,3220,0,1,4}-{2518,3218,0,1,1}" + }, + { + "npc_id": "2248", + "loc_data": "{2540,3218,0,1,1}-{2515,3216,0,1,1}-{2512,3215,0,1,7}" + }, + { + "npc_id": "2249", + "loc_data": "{2530,3224,0,1,4}-{2524,3221,0,1,2}-{2543,3217,0,1,4}-{2530,3212,0,1,4}-{2557,3234,0,1,4}-{2540,3226,0,1,5}-{2532,3213,0,1,4}-{2527,3201,0,1,6}-{2544,3216,0,1,6}-{2519,3222,0,1,6}-{2526,3227,0,1,4}-{2550,3234,0,1,3}-{2553,3220,0,1,3}-{2521,3202,0,1,6}-{2525,3220,0,1,4}-{2544,3230,0,1,3}-{2547,3212,0,1,4}-{2545,3212,0,1,0}-{2540,3208,0,1,4}-{2533,3202,0,1,6}-{2536,3236,0,1,6}-{2525,3204,0,1,0}-{2539,3238,0,1,4}" + }, + { + "npc_id": "2250", + "loc_data": "{2525,3209,0,1,4}-{2558,3228,0,1,4}-{2543,3212,0,1,3}-{2538,3223,0,1,0}-{2527,3201,0,1,7}-{2517,3222,0,1,3}-{2547,3231,0,1,6}-{2550,3220,0,1,4}-{2538,3224,0,1,3}-{2545,3213,0,1,0}-{2542,3208,0,1,5}" + }, + { + "npc_id": "2251", + "loc_data": "{2520,3217,0,1,3}-{2524,3209,0,1,1}-{2529,3200,0,1,5}-{2530,3209,0,1,1}-{2519,3223,0,1,4}-{2518,3224,0,1,2}-{2527,3201,0,1,7}-{2521,3202,0,1,4}-{2542,3208,0,1,4}-{2539,3233,0,1,6}" + }, + { + "npc_id": "2252", + "loc_data": "{3199,3302,0,1,3}-{3079,3257,0,1,1}-{3091,3250,0,1,6}-{3137,3254,0,1,0}" + }, + { + "npc_id": "2256", + "loc_data": "{2571,3305,0,1,7}-{2572,3297,0,1,2}-{2572,3304,0,1,1}-{2577,3308,0,1,6}-{2582,3287,0,1,3}-{2582,3299,0,1,0}-{2583,3292,0,1,4}-{2572,3292,1,1,1}-{2577,3295,1,1,6}-{2576,3286,1,1,1}-{2585,3289,1,1,7}-{2585,3304,1,1,1}-{2582,3306,1,1,5}-{2582,3286,1,1,3}-{2653,3315,0,1,6}-{2658,3306,0,1,4}" + }, + { + "npc_id": "2257", + "loc_data": "{3105,3554,0,1,1}" + }, + { + "npc_id": "2260", + "loc_data": "{3259,3385,0,1,6}" + }, + { + "npc_id": "2262", + "loc_data": "{3039,4834,0,0,7}" + }, + { + "npc_id": "2263", + "loc_data": "{3037,4906,0,1,2}-{3021,4812,0,1,5}-{3057,4875,0,0,6}-{3014,4838,0,1,6}-{3016,4892,0,1,6}-{3058,4877,0,0,6}-{3051,4874,0,1,0}-{3061,4836,0,1,4}-{3029,4890,0,1,6}-{3032,4901,0,1,2}-{3024,4916,0,1,3}-{3020,4903,0,1,4}-{3061,4883,0,0,3}-{3058,4889,0,0,3}-{3053,4896,0,0,3}-{3038,4871,0,1,6}-{3053,4900,0,0,7}-{3017,4812,0,1,6}-{3061,4842,0,1,3}-{3048,4808,0,1,3}-{3021,4847,0,1,6}-{3054,4849,0,1,6}-{3055,4915,0,0,5}-{3015,4833,0,1,0}-{3035,4854,0,1,6}-{3016,4829,0,1,4}-{3037,4906,0,0,5}-{3040,4810,0,1,3}-{3047,4886,0,1,4}-{3059,4815,0,1,1}-{3033,4884,0,1,4}-{3027,4851,0,1,6}-{3020,4819,0,1,4}-{3020,4845,0,1,2}-{3061,4829,0,1,0}-{3030,4877,0,1,2}-{3026,4879,0,1,3}-{3024,4879,0,1,3}-{3018,4842,0,1,4}" + }, + { + "npc_id": "2264", + "loc_data": "{3020,4888,0,1,3}-{3039,4871,0,1,4}-{3049,4921,0,1,7}-{3019,4877,0,1,6}-{3017,4893,0,1,7}-{3017,4821,0,1,4}-{3019,4898,0,1,4}-{3059,4813,0,1,0}-{3020,4912,0,1,2}-{3032,4808,0,1,3}-{3059,4820,0,1,3}-{3062,4828,0,1,6}-{3036,4856,0,1,7}-{3062,4837,0,1,5}-{3025,4850,0,1,1}-{3052,4859,0,1,1}-{3024,4813,0,1,4}-{3054,4915,0,1,7}-{3048,4854,0,1,3}-{3034,4852,0,1,1}-{3052,4898,0,1,1}-{3028,4808,0,1,1}-{3034,4905,0,1,4}-{3018,4843,0,1,2}-{3028,4851,0,1,0}-{3016,4831,0,1,1}-{3052,4896,0,1,3}-{3046,4901,0,1,2}-{3043,4810,0,1,3}-{3062,4884,0,1,6}-{3049,4873,0,1,1}-{3041,4871,0,1,1}" + }, + { + "npc_id": "2265", + "loc_data": "{3020,4914,0,1,2}-{3038,4809,0,1,6}-{3059,4890,0,1,3}-{3024,4850,0,1,3}-{3031,4901,0,1,7}-{3044,4915,0,1,6}-{3052,4808,0,1,5}-{3021,4847,0,1,3}-{3058,4811,0,1,4}-{3055,4848,0,1,0}-{3062,4822,0,1,6}-{3017,4837,0,1,3}-{3044,4883,0,1,4}-{3017,4817,0,1,7}-{3025,4812,0,1,1}-{3039,4885,0,1,1}-{3048,4917,0,1,5}-{3060,4825,0,1,3}-{3059,4888,0,1,5}-{3047,4874,0,1,2}-{3062,4838,0,1,3}-{3055,4908,0,1,5}-{3016,4876,0,1,1}-{3029,4890,0,1,5}-{3059,4906,0,1,1}-{3021,4875,0,1,3}-{3032,4903,0,1,3}-{3054,4850,0,1,6}-{3026,4914,0,1,6}" + }, + { + "npc_id": "2266", + "loc_data": "{3053,4978,1,1,1}" + }, + { + "npc_id": "2270", + "loc_data": "{3048,4975,1,1,6}" + }, + { + "npc_id": "2271", + "loc_data": "{3045,4971,1,0,4}" + }, + { + "npc_id": "2274", + "loc_data": "{3243,3245,0,1,4}" + }, + { + "npc_id": "2275", + "loc_data": "{3244,3248,0,1,1}" + }, + { + "npc_id": "2276", + "loc_data": "{3243,3247,0,1,1}" + }, + { + "npc_id": "2277", + "loc_data": "{3248,3247,0,1,4}" + }, + { + "npc_id": "2278", + "loc_data": "{3247,3244,0,1,2}" + }, + { + "npc_id": "2279", + "loc_data": "{3244,3247,0,1,3}" + }, + { + "npc_id": "2280", + "loc_data": "{3245,3244,0,1,4}" + }, + { + "npc_id": "2281", + "loc_data": "{3246,3245,0,1,4}" + }, + { + "npc_id": "2290", + "loc_data": "{2997,3373,0,0,0}" + }, + { + "npc_id": "2291", + "loc_data": "{3311,3109,0,0,3}" + }, + { + "npc_id": "2292", + "loc_data": "{3182,3043,0,0,3}" + }, + { + "npc_id": "2293", + "loc_data": "{3469,3111,0,1,6}" + }, + { + "npc_id": "2294", + "loc_data": "{3350,3004,0,0,6}" + }, + { + "npc_id": "2296", + "loc_data": "{3399,2916,0,0,6}" + }, + { + "npc_id": "2298", + "loc_data": "{3287,2813,0,1,1}" + }, + { + "npc_id": "2301", + "loc_data": "{3310,3107,0,1,4}-{3181,3043,0,1,3}" + }, + { + "npc_id": "2304", + "loc_data": "{3038,3292,0,1,6}" + }, + { + "npc_id": "2305", + "loc_data": "{2821,3463,0,1,3}" + }, + { + "npc_id": "2306", + "loc_data": "{2643,3363,0,0,5}" + }, + { + "npc_id": "2307", + "loc_data": "{3627,3526,0,1,6}" + }, + { + "npc_id": "2310", + "loc_data": "{3025,3312,0,1,4}-{3043,3308,0,1,6}-{3023,3297,0,1,5}-{2928,3282,0,1,1}-{2927,3269,0,1,1}" + }, + { + "npc_id": "2312", + "loc_data": "{3014,3292,0,0,0}" + }, + { + "npc_id": "2313", + "loc_data": "{3020,3297,0,1,6}-{3040,3296,0,1,3}-{3031,3283,0,1,4}-{3020,3288,0,1,0}" + }, + { + "npc_id": "2314", + "loc_data": "{3018,3296,0,1,1}-{3016,3288,0,1,4}-{3030,3287,0,1,4}-{3017,3282,0,1,3}-{2549,3566,0,1,2}-{2553,3564,0,1,4}" + }, + { + "npc_id": "2315", + "loc_data": "{3018,3282,0,1,5}-{3037,3289,0,1,1}-{2551,3562,0,1,1}-{2554,3561,0,1,3}" + }, + { + "npc_id": "2316", + "loc_data": "{3015,3311,0,1,4}" + }, + { + "npc_id": "2317", + "loc_data": "{3016,3309,0,1,6}" + }, + { + "npc_id": "2318", + "loc_data": "{3017,3307,0,0,0}" + }, + { + "npc_id": "2319", + "loc_data": "{3017,3309,0,0,0}" + }, + { + "npc_id": "2323", + "loc_data": "{3056,3306,0,1,1}" + }, + { + "npc_id": "2324", + "loc_data": "{2807,3464,0,1,3}" + }, + { + "npc_id": "2325", + "loc_data": "{2664,3374,0,1,1}" + }, + { + "npc_id": "2326", + "loc_data": "{3600,3527,0,1,1}" + }, + { + "npc_id": "2327", + "loc_data": "{2814,3337,0,1,6}" + }, + { + "npc_id": "2329", + "loc_data": "{1702,4823,0,0,6}" + }, + { + "npc_id": "2330", + "loc_data": "{2766,3211,0,0,0}" + }, + { + "npc_id": "2331", + "loc_data": "{2860,3430,0,1,4}" + }, + { + "npc_id": "2332", + "loc_data": "{2573,3102,0,1,4}" + }, + { + "npc_id": "2333", + "loc_data": "{3226,3311,0,0,0}" + }, + { + "npc_id": "2334", + "loc_data": "{2662,3525,0,1,1}" + }, + { + "npc_id": "2335", + "loc_data": "{3181,3359,0,0,0}" + }, + { + "npc_id": "2336", + "loc_data": "{2938,3221,0,1,0}" + }, + { + "npc_id": "2337", + "loc_data": "{2615,3855,0,0,3}" + }, + { + "npc_id": "2338", + "loc_data": "{2615,3229,0,0,0}" + }, + { + "npc_id": "2339", + "loc_data": "{2934,3438,0,1,6}" + }, + { + "npc_id": "2340", + "loc_data": "{3007,3373,0,1,4}" + }, + { + "npc_id": "2341", + "loc_data": "{3229,3456,0,0,0}" + }, + { + "npc_id": "2342", + "loc_data": "{3196,3231,0,1,4}" + }, + { + "npc_id": "2343", + "loc_data": "{2473,3446,0,1,6}" + }, + { + "npc_id": "2344", + "loc_data": "{2490,3183,0,1,3}" + }, + { + "npc_id": "2353", + "loc_data": "{2324,3179,0,1,5}" + }, + { + "npc_id": "2355", + "loc_data": "{2353,3163,0,0,4}" + }, + { + "npc_id": "2359", + "loc_data": "{2335,3169,0,1,3}" + }, + { + "npc_id": "2360", + "loc_data": "{2335,3174,0,1,4}-{2322,3172,0,1,5}" + }, + { + "npc_id": "2361", + "loc_data": "{2345,3172,0,1,2}-{2340,3178,0,1,3}" + }, + { + "npc_id": "2362", + "loc_data": "{2330,3163,0,1,3}" + }, + { + "npc_id": "2372", + "loc_data": "{2044,4632,0,1,3}" + }, + { + "npc_id": "2374", + "loc_data": "{2041,4632,0,1,3}-{2037,4630,0,1,3}-{2041,4644,0,1,4}" + }, + { + "npc_id": "2385", + "loc_data": "{3112,3159,0,0,0}" + }, + { + "npc_id": "2386", + "loc_data": "{3051,3496,1,0,0}" + }, + { + "npc_id": "2389", + "loc_data": "{3219,3677,0,0,0}" + }, + { + "npc_id": "2392", + "loc_data": "{3043,3204,0,0,0}" + }, + { + "npc_id": "2414", + "loc_data": "{3263,3400,1,0,0}" + }, + { + "npc_id": "2435", + "loc_data": "{2621,3682,0,0,6}" + }, + { + "npc_id": "2438", + "loc_data": "{2544,3761,0,0,6}" + }, + { + "npc_id": "2439", + "loc_data": "{2659,3657,0,1,3}" + }, + { + "npc_id": "2440", + "loc_data": "{2545,10141,0,0,6}" + }, + { + "npc_id": "2443", + "loc_data": "{2543,10143,0,0,3}" + }, + { + "npc_id": "2446", + "loc_data": "{2545,10145,0,0,6}" + }, + { + "npc_id": "2449", + "loc_data": "{2546,10144,0,0,1}-{2546,10142,0,0,6}" + }, + { + "npc_id": "2452", + "loc_data": "{2526,10166,0,1,6}" + }, + { + "npc_id": "2453", + "loc_data": "{2521,10160,0,0,1}-{2535,10163,0,0,6}-{2520,10165,0,0,3}-{2533,10162,0,0,3}-{2545,10158,0,0,5}-{2547,10151,0,0,3}-{2543,10166,0,0,3}-{2538,10160,0,0,6}-{2506,10163,0,0,3}-{2516,10163,0,0,3}-{2498,10164,0,0,5}-{2544,10160,0,0,0}-{2525,10162,0,0,3}-{2530,10161,0,0,0}-{2537,10167,0,0,7}-{2519,10163,0,0,3}-{2511,10163,0,0,3}-{2530,10161,0,0,7}-{2524,10166,0,0,3}-{2508,10159,0,0,0}-{1846,4405,3,0,2}-{1839,4400,3,0,3}-{1835,4394,3,0,3}-{1834,4406,3,0,1}-{1843,4406,3,0,2}-{1899,4372,0,0,2}-{1888,4362,0,0,7}-{1896,4362,0,0,2}-{1897,4368,0,0,5}" + }, + { + "npc_id": "2455", + "loc_data": "{2457,10139,0,1,2}-{2465,10133,0,1,4}-{2449,10148,0,1,1}-{2471,10133,0,1,6}-{2446,10145,0,1,4}-{2443,10148,0,1,1}-{2452,10161,0,1,3}-{2444,10145,0,1,1}-{2462,10163,0,1,3}-{2446,10141,0,1,3}-{2454,10149,0,1,0}-{2476,10155,0,1,4}-{2456,10153,0,1,0}-{2485,10142,0,1,3}-{2457,10152,0,1,4}-{2485,10126,0,1,4}-{2475,10148,0,1,3}-{2471,10160,0,1,1}-{2453,10145,0,1,3}-{2463,10158,0,1,4}-{2457,10163,0,1,2}-{2471,10154,0,1,6}-{2476,10151,0,1,7}-{2479,10154,0,1,1}-{2486,10158,0,1,4}-{2485,10165,0,1,5}-{2485,10153,0,1,4}-{2474,10140,0,1,7}-{2466,10130,0,1,6}-{2464,10138,0,1,6}-{2486,10150,0,1,6}-{2473,10127,0,1,4}-{2483,10126,0,1,3}-{2456,10133,0,1,6}-{2467,10163,0,1,6}-{2477,10143,0,1,3}-{2489,10139,0,1,4}-{2486,10127,0,1,1}-{2480,10141,0,1,7}-{2490,10155,0,1,3}-{2459,10133,0,1,3}-{2455,10163,0,1,0}-{2496,10166,0,1,1}-{2494,10162,0,1,1}-{2502,10167,0,1,1}-{2493,10132,0,1,3}-{2499,10162,0,1,0}-{2502,10159,0,1,1}-{2502,10166,0,1,4}-{2494,10129,0,1,5}-{2496,10130,0,1,3}-{2498,10128,0,1,1}-{2497,10126,0,1,4}-{2499,10128,0,1,5}-{2501,10126,0,1,3}-{2506,10125,0,1,4}-{2506,10127,0,1,4}-{2507,10128,0,1,3}-{2507,10126,0,1,6}-{2511,10126,0,1,0}-{2513,10126,0,1,4}-{2517,10129,0,1,3}-{2513,10127,0,1,3}-{2516,10124,0,1,4}-{2520,10122,0,1,5}-{2522,10126,0,1,3}-{2524,10129,0,1,4}-{2525,10125,0,1,4}-{2529,10122,0,1,4}-{2529,10124,0,1,2}-{2526,10126,0,1,3}-{2529,10130,0,1,6}-{2530,10127,0,1,5}-{2532,10121,0,1,0}-{2532,10123,0,1,3}-{2538,10126,0,1,0}-{2535,10125,0,1,7}-{2536,10127,0,1,1}-{2539,10130,0,1,6}-{2543,10130,0,1,6}-{2548,10131,0,1,1}-{2542,10128,0,1,3}-{1815,4405,2,1,6}-{1818,4403,2,1,3}-{1813,4404,2,1,7}-{1814,4407,2,1,7}-{1821,4393,2,1,1}-{1823,4389,2,1,1}-{1828,4387,2,1,3}-{1821,4392,2,1,0}-{1826,4391,2,1,0}-{1865,4377,2,1,1}-{1865,4397,1,1,6}-{1844,4360,1,1,4}-{1844,4361,1,1,5}-{1851,4360,1,1,3}-{1857,4360,1,1,1}-{1862,4362,1,1,1}-{1862,4362,1,1,7}-{1864,4366,1,1,1}-{1865,4383,2,1,4}-{1864,4390,1,1,1}-{1865,4408,1,1,4}-{1877,4410,1,1,1}-{1883,4411,1,1,4}-{1889,4410,1,1,4}-{1887,4374,0,1,6}-{1890,4372,0,1,4}-{1890,4366,0,1,4}-{1896,4371,0,1,3}-{1890,4364,0,1,7}-{1831,4378,3,1,2}-{1838,4379,3,1,2}-{1824,4376,3,1,1}-{1832,4380,3,1,6}-{1844,4373,2,1,4}-{1849,4381,2,1,4}-{1846,4374,2,1,1}" + }, + { + "npc_id": "2456", + "loc_data": "{2452,10145,0,0,4}-{2445,10138,0,0,7}" + }, + { + "npc_id": "2457", + "loc_data": "{2500,10148,0,1,3}-{2505,10150,0,1,2}-{2510,10148,0,1,1}-{2511,10147,0,1,6}-{2517,10151,0,1,3}-{2519,10143,0,1,7}-{2529,10148,0,1,3}-{2528,10144,0,1,0}-{2532,10145,0,1,1}-{2532,10140,0,1,7}-{2520,10144,0,1,2}-{1804,4369,2,1,2}-{1812,4363,2,1,5}-{1817,4368,2,1,6}-{1801,4404,3,1,6}-{1805,4405,3,1,1}-{1803,4404,3,1,7}-{1811,4394,1,1,7}-{1804,4391,1,1,2}-{1798,4391,1,1,4}-{1802,4389,1,1,4}-{1799,4386,2,1,1}-{1799,4381,2,1,6}-{1798,4375,1,1,4}-{1803,4376,1,1,6}-{1797,4380,1,1,6}-{1902,4367,0,1,6}-{1894,4367,0,1,1}-{1893,4361,0,1,3}-{1886,4369,0,1,1}-{1848,4394,1,1,3}-{1850,4389,1,1,1}-{1850,4391,1,1,2}" + }, + { + "npc_id": "2424", + "loc_data": "{2871,10187,0,1,0}" + }, + { + "npc_id": "1843", + "loc_data": "{2841,10129,0,1,0}" + }, + { + "npc_id": "1844", + "loc_data": "{2840,10127,0,1,0}" + }, + { + "npc_id": "2205", + "loc_data": "{2839,10128,0,1,0}" + }, + { + "npc_id": "2154", + "loc_data": "{2839,10128,0,1,0}" + }, + { + "npc_id": "2458", + "loc_data": "{2599,4774,0,0,3}" + }, + { + "npc_id": "2459", + "loc_data": "{2604,4772,0,1,4}-{2606,4771,0,1,6}-{2604,4769,0,1,2}" + }, + { + "npc_id": "2460", + "loc_data": "{2600,4778,0,1,1}-{2607,4777,0,1,1}" + }, + { + "npc_id": "2461", + "loc_data": "{2597,4776,0,1,1}-{2606,4771,0,1,1}" + }, + { + "npc_id": "2462", + "loc_data": "{2596,4773,0,1,2}-{2602,4771,0,1,6}-{2596,4780,0,1,4}" + }, + { + "npc_id": "2482", + "loc_data": "{3057,3902,0,1,3}" + }, + { + "npc_id": "2483", + "loc_data": "{2914,3116,0,0,0}" + }, + { + "npc_id": "2484", + "loc_data": "{2782,3058,0,0,0}" + }, + { + "npc_id": "2486", + "loc_data": "{2789,3055,0,0,0}" + }, + { + "npc_id": "2487", + "loc_data": "{2848,3042,0,0,0}" + }, + { + "npc_id": "2488", + "loc_data": "{2799,3058,0,0,0}" + }, + { + "npc_id": "2489", + "loc_data": "{3781,3031,0,1,5}-{3775,3033,0,1,4}-{3780,3022,0,1,1}-{3788,3011,0,1,2}-{3793,3019,0,1,5}-{3766,3010,0,1,4}-{3764,3020,0,1,1}-{3779,3045,0,1,1}-{3784,3040,0,1,3}-{3802,3037,0,1,2}-{3808,3026,0,1,3}-{3799,3024,0,1,4}-{3749,3000,0,1,6}-{3738,3010,0,1,3}-{3723,2998,0,1,2}-{3731,2991,0,1,1}-{3703,3040,0,1,3}-{3706,3051,0,1,1}-{3664,3013,0,1,7}-{3720,3040,0,1,6}-{3719,3045,0,1,6}" + }, + { + "npc_id": "2490", + "loc_data": "{3782,3016,0,1,7}" + }, + { + "npc_id": "2491", + "loc_data": "{2679,3080,0,1,6}-{2684,3084,0,1,4}-{2682,3093,0,1,4}-{2678,3095,0,1,3}-{2679,3102,0,1,1}-{2681,3110,0,1,4}-{2683,3115,0,1,6}-{2675,3108,0,1,3}-{2671,3109,0,1,3}-{2671,3113,0,1,4}-{2676,3090,0,1,4}-{2670,3088,0,1,6}-{2671,3086,0,1,6}-{2664,3088,0,1,7}-{2660,3086,0,1,6}-{2662,3088,0,1,6}-{2670,3082,0,1,7}-{2674,3081,0,1,3}-{2663,3086,0,1,6}-{2679,3082,0,1,1}-{2682,3093,0,1,3}" + }, + { + "npc_id": "2504", + "loc_data": "{2796,3077,1,1,3}" + }, + { + "npc_id": "2507", + "loc_data": "{2794,3077,0,1,6}" + }, + { + "npc_id": "2510", + "loc_data": "{2786,3075,1,1,4}" + }, + { + "npc_id": "2513", + "loc_data": "{2796,3088,0,1,7}" + }, + { + "npc_id": "2516", + "loc_data": "{2791,3102,0,1,3}" + }, + { + "npc_id": "2519", + "loc_data": "{2794,3064,0,1,5}" + }, + { + "npc_id": "2522", + "loc_data": "{2758,3099,0,1,1}" + }, + { + "npc_id": "2525", + "loc_data": "{2800,3048,0,1,2}" + }, + { + "npc_id": "2528", + "loc_data": "{2816,3085,0,1,3}" + }, + { + "npc_id": "2531", + "loc_data": "{2784,3089,0,1,1}" + }, + { + "npc_id": "2547", + "loc_data": "{3109,9942,0,1,4}-{3111,9938,0,1,4}-{3116,9926,0,1,4}-{2615,9525,0,1,4}-{2615,9521,0,1,1}" + }, + { + "npc_id": "2548", + "loc_data": "{3349,2970,0,0,4}-{3358,2987,0,0,4}" + }, + { + "npc_id": "2549", + "loc_data": "{3364,3001,0,0,6}" + }, + { + "npc_id": "2568", + "loc_data": "{2729,3495,0,0,6}-{2724,3495,0,0,6}-{2728,3495,0,0,6}-{2721,3495,0,0,6}" + }, + { + "npc_id": "2569", + "loc_data": "{2727,3495,0,0,6}-{2722,3495,0,0,6}" + }, + { + "npc_id": "2572", + "loc_data": "{3079,3250,0,1,2}" + }, + { + "npc_id": "2574", + "loc_data": "{3087,3247,0,0,7}" + }, + { + "npc_id": "2580", + "loc_data": "{2889,3436,0,0,0}" + }, + { + "npc_id": "2591", + "loc_data": "{4786,5106,0,1,6}-{2474,5145,0,1,2}" + }, + { + "npc_id": "2592", + "loc_data": "{4680,5117,0,1,6}-{2461,5142,0,1,6}" + }, + { + "npc_id": "2594", + "loc_data": "{4703,5123,0,1,5}-{4680,5126,0,1,7}-{4730,5077,0,1,5}" + }, + { + "npc_id": "2595", + "loc_data": "{4699,5100,0,1,6}-{4647,5132,0,1,7}-{4633,5069,0,1,4}-{4757,5100,0,1,2}" + }, + { + "npc_id": "2596", + "loc_data": "{4628,5117,0,1,4}-{4787,5118,0,1,7}-{2483,5155,0,1,4}" + }, + { + "npc_id": "2597", + "loc_data": "{4621,5094,0,1,5}-{2446,5144,0,1,1}-{2470,5141,0,1,6}" + }, + { + "npc_id": "2598", + "loc_data": "{2485,5159,0,1,4}-{2489,5155,0,1,1}-{2471,5144,0,1,3}-{2476,5153,0,1,0}-{2477,5150,0,1,1}" + }, + { + "npc_id": "2600", + "loc_data": "{4656,5125,0,1,5}-{4711,5072,0,1,4}-{4751,5087,0,1,3}" + }, + { + "npc_id": "2601", + "loc_data": "{4676,5123,0,1,5}-{4693,5127,0,1,7}-{4724,5107,0,1,5}-{4788,5110,0,1,4}" + }, + { + "npc_id": "2602", + "loc_data": "{4668,5133,0,1,7}-{4627,5122,0,1,5}-{4714,5113,0,1,6}-{4752,5074,0,1,7}-{4789,5122,0,1,2}" + }, + { + "npc_id": "2603", + "loc_data": "{4711,5086,0,1,2}-{4760,5091,0,1,4}" + }, + { + "npc_id": "2604", + "loc_data": "{2439,5170,0,1,3}-{2451,5170,0,1,3}-{2453,5161,0,1,6}-{2460,5160,0,1,7}-{2457,5155,0,1,3}-{2480,5168,0,1,6}-{2469,5166,0,1,1}-{2490,5173,0,1,3}-{2488,5171,0,1,4}-{2483,5156,0,1,3}-{2470,5147,0,1,4}-{2468,5139,0,1,7}-{2458,5141,0,1,3}-{2454,5141,0,1,1}-{2452,5124,0,1,3}-{2454,5122,0,1,2}-{2453,5143,0,1,3}-{2443,5144,0,1,6}" + }, + { + "npc_id": "2605", + "loc_data": "{4633,5125,0,1,7}-{4631,5088,0,1,7}-{4760,5074,0,1,4}" + }, + { + "npc_id": "2606", + "loc_data": "{4670,5081,0,1,6}-{4642,5115,0,1,7}-{4756,5086,0,1,4}" + }, + { + "npc_id": "2607", + "loc_data": "{4638,5095,0,1,2}-{4647,5141,0,1,4}-{4699,5141,0,1,3}-{4774,5098,0,1,3}" + }, + { + "npc_id": "2608", + "loc_data": "{4656,5091,0,1,5}-{4637,5093,0,1,0}" + }, + { + "npc_id": "2609", + "loc_data": "{4691,5090,0,1,7}-{4617,5073,0,1,6}-{4711,5125,0,1,4}-{4727,5082,0,1,6}-{4748,5070,0,1,4}-{2440,5128,0,1,3}-{2436,5133,0,1,3}-{2450,5168,0,1,2}-{2443,5170,0,1,4}-{2445,5177,0,1,3}" + }, + { + "npc_id": "2610", + "loc_data": "{2446,5169,0,1,4}-{2458,5159,0,1,3}-{2466,5166,0,1,7}-{2471,5166,0,1,3}-{2478,5164,0,1,4}-{2490,5174,0,1,4}-{2485,5159,0,1,5}-{2442,5173,0,1,0}-{2440,5171,0,1,7}-{2440,5170,0,1,3}" + }, + { + "npc_id": "2611", + "loc_data": "{4646,5107,0,1,6}-{4683,5098,0,1,4}-{4690,5113,0,1,5}-{4720,5118,0,1,7}-{4716,5097,0,1,5}-{4762,5088,0,1,0}" + }, + { + "npc_id": "2614", + "loc_data": "{4666,5082,0,1,0}-{4669,5103,0,1,2}-{4664,5121,0,1,4}-{4639,5074,0,1,3}-{4704,5077,0,1,5}-{4688,5016,0,1,3}" + }, + { + "npc_id": "2615", + "loc_data": "{4695,5128,0,1,7}-{4625,5084,0,1,7}-{4628,5134,0,1,3}-{4725,5067,0,1,5}-{4748,5076,0,1,6}-{4790,5127,0,1,0}" + }, + { + "npc_id": "2616", + "loc_data": "{4673,5114,0,1,1}-{4631,5106,0,1,0}-{2441,5130,0,1,1}-{2438,5135,0,1,6}-{2443,5138,0,1,2}" + }, + { + "npc_id": "2617", + "loc_data": "{4611,5132,0,1,5}-{2440,5168,0,0,1}" + }, + { + "npc_id": "2618", + "loc_data": "{4603,5065,0,1,1}-{2399,5178,0,1,6}" + }, + { + "npc_id": "2619", + "loc_data": "{2446,5179,0,0,6}-{4644,5149,0,1,7}-{2418,5203,0,1,6}" + }, + { + "npc_id": "2620", + "loc_data": "{4701,5153,0,1,0}-{2478,5146,0,1,2}" + }, + { + "npc_id": "2622", + "loc_data": "{4689,5173,0,0,0}-{2464,5149,0,0,7}" + }, + { + "npc_id": "2623", + "loc_data": "{4655,5172,0,1,0}-{2462,5125,0,1,5}" + }, + { + "npc_id": "2624", + "loc_data": "{4718,5148,0,1,6}-{4708,5173,0,1,6}-{4716,5178,0,1,7}-{4726,5173,0,1,0}-{4730,5163,0,1,3}-{4726,5153,0,1,5}" + }, + { + "npc_id": "2625", + "loc_data": "{4668,5177,0,1,4}-{4676,5177,0,1,2}" + }, + { + "npc_id": "2634", + "loc_data": "{3095,3252,0,0,0}" + }, + { + "npc_id": "2652", + "loc_data": "{2868,3579,0,0,0}-{2851,3582,0,0,0}" + }, + { + "npc_id": "2660", + "loc_data": "{3208,3496,0,1,3}" + }, + { + "npc_id": "2674", + "loc_data": "{3017,3231,0,1,1}" + }, + { + "npc_id": "2676", + "loc_data": "{2914,3322,0,0,0}" + }, + { + "npc_id": "2677", + "loc_data": "{2945,3307,0,0,0}" + }, + { + "npc_id": "2678", + "loc_data": "{2988,3210,0,1,7}" + }, + { + "npc_id": "2679", + "loc_data": "{3000,3222,0,1,1}" + }, + { + "npc_id": "2680", + "loc_data": "{2985,3193,0,1,1}-{2582,9836,0,1,2}" + }, + { + "npc_id": "2681", + "loc_data": "{2991,3199,0,1,3}" + }, + { + "npc_id": "2682", + "loc_data": "{1866,4237,0,1,0}-{1866,4240,0,1,0}-{1867,4243,0,1,0}-{2950,3204,0,1,5}-{2971,3212,0,1,4}-{2960,3201,0,1,1}-{2959,3202,0,1,4}-{2904,3208,0,1,0}-{2956,3203,0,1,1}-{2969,3204,0,1,4}" + }, + { + "npc_id": "2683", + "loc_data": "{2967,3212,1,0,7}" + }, + { + "npc_id": "2684", + "loc_data": "{2965,3213,1,0,0}" + }, + { + "npc_id": "2685", + "loc_data": "{3124,9873,0,1,3}-{2911,3285,0,1,1}" + }, + { + "npc_id": "2686", + "loc_data": "{2907,3293,0,1,4}" + }, + { + "npc_id": "2687", + "loc_data": "{2907,3293,0,1,6}-{2908,3290,0,1,3}" + }, + { + "npc_id": "2688", + "loc_data": "{3127,9874,0,1,4}-{2906,3288,0,1,1}-{2910,3293,0,1,4}" + }, + { + "npc_id": "2689", + "loc_data": "{2918,3319,0,0,0}" + }, + { + "npc_id": "2690", + "loc_data": "{3048,3258,0,1,3}" + }, + { + "npc_id": "2691", + "loc_data": "{3048,3256,0,1,4}" + }, + { + "npc_id": "2692", + "loc_data": "{3049,3256,0,0,0}" + }, + { + "npc_id": "2693", + "loc_data": "{3214,3313,0,1,0}-{3214,3320,0,1,0}-{3215,3303,0,1,0}-{3219,3285,0,1,0}-{3219,3288,0,1,0}-{3234,3267,0,1,0}-{3234,3268,0,1,0}-{3238,3238,0,1,0}-{3238,3246,0,1,0}-{3239,3235,0,1,0}-{2976,3359,0,1,0}-{2977,3357,0,1,0}-{2988,3383,0,1,1}-{2992,3385,0,1,3}-{3015,3285,0,1,0}" + }, + { + "npc_id": "2695", + "loc_data": "{3013,3192,0,1,1}" + }, + { + "npc_id": "2696", + "loc_data": "{3013,3196,0,1,1}" + }, + { + "npc_id": "2697", + "loc_data": "{3018,3189,0,1,4}" + }, + { + "npc_id": "2698", + "loc_data": "{3018,3181,0,1,6}" + }, + { + "npc_id": "2699", + "loc_data": "{3037,2982,0,0,6}-{3036,2979,0,0,6}" + }, + { + "npc_id": "2700", + "loc_data": "{3037,2982,0,0,6}" + }, + { + "npc_id": "2704", + "loc_data": "{3019,3185,0,0,0}-{3034,2979,0,0,1}-{3033,2980,1,0,4}-{3032,2979,0,0,1}-{3034,2985,0,0,1}-{3035,2982,0,0,1}" + }, + { + "npc_id": "2705", + "loc_data": "{3034,2985,1,0,1}" + }, + { + "npc_id": "2706", + "loc_data": "{3725,3015,0,1,4}-{3745,3026,0,1,6}-{3741,3033,0,1,6}-{3734,3045,0,1,1}-{3019,3145,0,1,3}-{3015,3142,0,1,4}-{3022,3139,0,1,4}" + }, + { + "npc_id": "2709", + "loc_data": "{3002,3266,0,1,6}" + }, + { + "npc_id": "2710", + "loc_data": "{3001,3268,0,1,4}" + }, + { + "npc_id": "2711", + "loc_data": "{3002,3268,0,1,4}" + }, + { + "npc_id": "2712", + "loc_data": "{3001,3268,0,1,3}" + }, + { + "npc_id": "2713", + "loc_data": "{3002,3267,0,1,2}" + }, + { + "npc_id": "2725", + "loc_data": "{2500,3488,0,1,2}" + }, + { + "npc_id": "2726", + "loc_data": "{2994,3138,0,1,0}" + }, + { + "npc_id": "2727", + "loc_data": "{2969,3146,0,1,0}" + }, + { + "npc_id": "2728", + "loc_data": "{3043,3235,0,1,7}" + }, + { + "npc_id": "2729", + "loc_data": "{3047,3234,0,1,7}" + }, + { + "npc_id": "2730", + "loc_data": "{2835,3335,0,0,5}" + }, + { + "npc_id": "2731", + "loc_data": "{2833,3335,0,0,3}" + }, + { + "npc_id": "2732", + "loc_data": "{2933,3281,0,1,1}" + }, + { + "npc_id": "2733", + "loc_data": "{2932,3286,0,1,1}" + }, + { + "npc_id": "2759", + "loc_data": "{3254,3418,0,0,0}-{3255,3418,0,0,0}-{3256,3418,0,0,0}-{3096,3493,0,0,0}-{3097,3494,0,0,0}-{3104,3368,0,0,0}-{3180,3438,0,0,0}-{3180,3442,0,0,0}-{3191,3441,0,0,0}-{3191,3437,0,0,0}-{3191,3445,0,0,0}" + }, + { + "npc_id": "2782", + "loc_data": "{1925,4636,0,1,7}" + }, + { + "npc_id": "2783", + "loc_data": "{1995,4660,0,1,7}-{1989,4660,0,1,0}-{1989,4664,0,1,7}-{1995,4660,0,1,2}-{1997,4664,0,1,3}-{1989,4658,0,1,0}-{2001,4646,0,1,4}-{2000,4645,0,1,3}-{1997,4644,0,1,1}-{2006,4639,0,1,6}-{1999,4636,0,1,3}" + }, + { + "npc_id": "2792", + "loc_data": "{3228,3412,0,0,0}" + }, + { + "npc_id": "2794", + "loc_data": "{2606,3100,0,0,0}" + }, + { + "npc_id": "2796", + "loc_data": "{3089,3124,0,0,3}-{3096,3108,0,0,6}-{3075,3091,0,0,6}-{3121,3103,0,0,1}-{3105,3095,0,0,3}" + }, + { + "npc_id": "2800", + "loc_data": "{2981,3190,0,0,0}" + }, + { + "npc_id": "2803", + "loc_data": "{3391,3066,0,1,6}-{3397,3054,0,1,6}-{3398,3060,0,1,0}-{3412,3059,0,1,3}" + }, + { + "npc_id": "2804", + "loc_data": "{3388,3067,0,1,0}-{3396,3064,0,1,6}-{3402,3063,0,1,1}-{3423,3019,0,1,3}-{3420,3015,0,1,6}-{3430,3014,0,1,2}-{3426,3020,0,0,0}-{3416,3013,0,1,4}-{3410,3016,0,1,6}" + }, + { + "npc_id": "2805", + "loc_data": "{3391,3071,0,1,2}-{3397,3069,0,1,2}-{3398,3068,0,1,1}-{3385,3064,0,1,6}-{3406,3064,0,1,6}-{3413,3053,0,1,6}-{3424,3061,0,1,2}-{3423,3020,0,1,0}-{3429,3019,0,0,0}" + }, + { + "npc_id": "2806", + "loc_data": "{3426,3052,0,1,4}-{3423,3044,0,1,3}-{3415,3018,0,1,5}-{3425,3009,0,1,3}" + }, + { + "npc_id": "2807", + "loc_data": "{3414,3045,0,1,1}-{3403,3050,0,1,4}-{3407,3058,0,1,3}-{3420,3022,0,0,0}" + }, + { + "npc_id": "2808", + "loc_data": "{3384,3072,0,1,2}-{3394,3076,0,1,1}-{3403,3069,0,1,1}-{3402,3061,0,1,1}-{3419,3006,0,1,4}" + }, + { + "npc_id": "2809", + "loc_data": "{3274,3168,0,1,0}" + }, + { + "npc_id": "2810", + "loc_data": "{3311,3208,0,1,0}" + }, + { + "npc_id": "2811", + "loc_data": "{3289,3209,0,1,0}" + }, + { + "npc_id": "2812", + "loc_data": "{3296,3227,0,0,0}" + }, + { + "npc_id": "2813", + "loc_data": "{3285,3201,0,0,0}" + }, + { + "npc_id": "2816", + "loc_data": "{3301,3190,0,0,0}" + }, + { + "npc_id": "2817", + "loc_data": "{3306,3197,0,0,0}" + }, + { + "npc_id": "2818", + "loc_data": "{3303,3204,0,0,0}" + }, + { + "npc_id": "2819", + "loc_data": "{3295,3193,0,0,0}" + }, + { + "npc_id": "2824", + "loc_data": "{3275,3193,0,0,0}" + }, + { + "npc_id": "2860", + "loc_data": "{2345,3165,0,1,4}" + }, + { + "npc_id": "2881", + "loc_data": "{2907,4440,0,1,6}" + }, + { + "npc_id": "2882", + "loc_data": "{2910,4457,0,1,6}" + }, + { + "npc_id": "2883", + "loc_data": "{2923,4443,0,1,4}" + }, + { + "npc_id": "2890", + "loc_data": "{1889,4411,0,0,4}-{1895,4409,0,0,2}-{1903,4409,0,0,3}-{1906,4407,0,0,5}-{1903,4400,0,0,1}-{1899,4400,0,0,2}-{1893,4398,0,0,2}-{1888,4386,0,0,6}-{1884,4383,0,0,5}-{1879,4376,0,0,5}-{1883,4376,0,0,1}-{1921,4368,0,0,2}-{1927,4362,0,0,7}-{1935,4360,0,0,7}-{1942,4356,0,0,7}-{1948,4355,0,0,7}-{1951,4358,0,0,2}-{1957,4365,0,0,2}-{1958,4368,0,0,2}" + }, + { + "npc_id": "2894", + "loc_data": "{2908,4435,0,0,1}-{2924,4436,0,0,5}-{2924,4460,0,0,6}-{2908,4463,0,0,3}-{2901,4458,0,0,3}-{2928,4441,0,0,3}-{2929,4449,0,0,6}-{2902,4437,0,0,1}" + }, + { + "npc_id": "2935", + "loc_data": "{3671,3484,0,1,4}" + }, + { + "npc_id": "2939", + "loc_data": "{2657,3701,0,1,0}" + }, + { + "npc_id": "2940", + "loc_data": "{2675,3671,0,1,3}" + }, + { + "npc_id": "2942", + "loc_data": "{3017,3234,0,1,7}" + }, + { + "npc_id": "2943", + "loc_data": "{3265,3400,0,0,0}" + }, + { + "npc_id": "2945", + "loc_data": "{2562,3319,0,0,0}" + }, + { + "npc_id": "2946", + "loc_data": "{3246,9865,0,1,1}" + }, + { + "npc_id": "2947", + "loc_data": "{3245,9868,0,1,3}" + }, + { + "npc_id": "2948", + "loc_data": "{3265,3403,0,0,0}" + }, + { + "npc_id": "2949", + "loc_data": "{2562,3320,0,0,0}" + }, + { + "npc_id": "2950", + "loc_data": "{3020,3229,0,0,7}" + }, + { + "npc_id": "2997", + "loc_data": "{3308,3511,1,1,1}" + }, + { + "npc_id": "2998", + "loc_data": "{2657,9641,0,1,0}" + }, + { + "npc_id": "2999", + "loc_data": "{2658,9634,0,1,1}" + }, + { + "npc_id": "3001", + "loc_data": "{2646,9639,0,1,4}" + }, + { + "npc_id": "3002", + "loc_data": "{2666,9630,0,1,6}" + }, + { + "npc_id": "3003", + "loc_data": "{2660,9624,0,1,6}" + }, + { + "npc_id": "3020", + "loc_data": "{3348,2942,0,1,3}" + }, + { + "npc_id": "3021", + "loc_data": "{2815,3466,0,0,3}-{2859,3431,0,0,0}-{2933,3434,0,1,4}-{3182,3354,0,0,0}-{3087,3352,0,0,0}-{3065,3255,0,0,0}-{3192,3229,0,0,0}-{3232,3459,0,0,3}-{3451,3475,0,0,6}-{2812,3333,0,1,4}-{3007,3371,0,1,2}-{3053,3304,0,0,1}-{2663,3374,0,0,4}-{3603,3529,0,0,6}-{2474,3446,0,1,4}-{2611,3859,0,0,6}-{2434,3415,0,1,3}-{2764,3210,0,1,1}-{2940,3225,0,0,6}-{2614,3226,0,0,4}-{3315,3205,0,0,6}-{2827,3692,0,1,5}-{2666,3521,0,1,4}-{2491,3177,0,0,1}" + }, + { + "npc_id": "3029", + "loc_data": "{3422,2937,0,1,1}" + }, + { + "npc_id": "3030", + "loc_data": "{3421,2912,0,0,1}" + }, + { + "npc_id": "3031", + "loc_data": "{3439,2890,0,0,3}" + }, + { + "npc_id": "3032", + "loc_data": "{3439,2927,0,1,5}" + }, + { + "npc_id": "3034", + "loc_data": "{3409,2929,1,1,4}" + }, + { + "npc_id": "3035", + "loc_data": "{3450,2895,0,0,3}" + }, + { + "npc_id": "3036", + "loc_data": "{3424,2900,0,1,3}" + }, + { + "npc_id": "3037", + "loc_data": "{3424,2906,0,0,1}" + }, + { + "npc_id": "3038", + "loc_data": "{3406,2924,0,1,3}" + }, + { + "npc_id": "3039", + "loc_data": "{3414,2907,0,1,3}" + }, + { + "npc_id": "3040", + "loc_data": "{3443,2914,0,0,3}" + }, + { + "npc_id": "3041", + "loc_data": "{3445,2910,0,0,1}" + }, + { + "npc_id": "3042", + "loc_data": "{3441,2920,0,1,4}" + }, + { + "npc_id": "3043", + "loc_data": "{3445,2917,0,0,3}" + }, + { + "npc_id": "3044", + "loc_data": "{3428,2928,0,1,5}" + }, + { + "npc_id": "3045", + "loc_data": "{3432,2912,0,0,1}" + }, + { + "npc_id": "3046", + "loc_data": "{3425,2891,0,0,4}-{3425,2894,0,0,4}-{3425,2893,0,0,4}-{3425,2889,0,0,4}" + }, + { + "npc_id": "3050", + "loc_data": "{3187,9758,0,1,3}" + }, + { + "npc_id": "3068", + "loc_data": "{3062,9550,0,1,5}-{3050,9554,0,1,7}-{3048,9545,0,1,4}-{3061,9542,0,1,3}-{3065,9548,0,1,1}-{3034,9544,0,1,4}-{3033,9552,0,1,3}-{3029,9545,0,1,7}-{3027,9555,0,1,3}" + }, + { + "npc_id": "3072", + "loc_data": "{3210,5562,0,1,3}-{3207,5448,0,1,3}-{3223,5446,0,1,4}" + }, + { + "npc_id": "3073", + "loc_data": "{3217,5442,0,1,4}-{3231,5444,0,1,0}" + }, + { + "npc_id": "3074", + "loc_data": "{3404,3492,0,0,6}" + }, + { + "npc_id": "3076", + "loc_data": "{3403,3492,0,0,0}" + }, + { + "npc_id": "3090", + "loc_data": "{3082,3442,0,0,0}" + }, + { + "npc_id": "3094", + "loc_data": "{3361,3306,0,1,6}" + }, + { + "npc_id": "3095", + "loc_data": "{3364,3309,0,1,3}-{3363,3317,1,1,1}" + }, + { + "npc_id": "3097", + "loc_data": "{3364,3304,0,1,6}" + }, + { + "npc_id": "3099", + "loc_data": "{3364,9626,2,1,1}" + }, + { + "npc_id": "3100", + "loc_data": "{3363,9646,0,1,1}" + }, + { + "npc_id": "3101", + "loc_data": "{3364,9644,1,1,6}" + }, + { + "npc_id": "3103", + "loc_data": "{3362,3318,1,0,6}" + }, + { + "npc_id": "3104", + "loc_data": "{3364,3310,0,1,1}-{3379,9627,0,1,0}-{3367,9647,2,1,4}" + }, + { + "npc_id": "3105", + "loc_data": "{3367,3304,1,1,1}-{3376,9655,0,1,7}" + }, + { + "npc_id": "3106", + "loc_data": "{3360,3305,1,1,3}-{3348,9654,0,1,4}-{3362,9648,2,1,4}" + }, + { + "npc_id": "3107", + "loc_data": "{3361,3306,0,1,3}-{3348,9626,0,1,6}" + }, + { + "npc_id": "3108", + "loc_data": "{2549,3100,0,0,4}" + }, + { + "npc_id": "3109", + "loc_data": "{2551,3079,0,1,3}" + }, + { + "npc_id": "3110", + "loc_data": "{2789,3175,0,0,4}" + }, + { + "npc_id": "3111", + "loc_data": "{2788,3176,0,0,0}" + }, + { + "npc_id": "3114", + "loc_data": "{2815,3344,0,1,3}" + }, + { + "npc_id": "3123", + "loc_data": "{3344,2827,0,1,5}" + }, + { + "npc_id": "3124", + "loc_data": "{3372,2847,1,0,3}" + }, + { + "npc_id": "3125", + "loc_data": "{3366,2845,3,0,6}" + }, + { + "npc_id": "3127", + "loc_data": "{3331,2948,0,1,4}" + }, + { + "npc_id": "3153", + "loc_data": "{2871,3091,0,1,4}-{2862,3111,0,1,1}-{2861,3101,0,1,3}-{2870,3113,0,1,4}-{2870,3110,0,1,6}-{2865,3103,0,1,3}-{2873,3103,0,1,2}-{2863,3118,0,1,4}-{2886,3109,0,1,1}-{2892,3109,0,1,2}-{2883,3105,0,1,4}-{2889,3111,0,1,6}-{2883,3110,0,1,3}" + }, + { + "npc_id": "3155", + "loc_data": "{3679,3494,0,1,3}-{3687,2953,0,1,1}" + }, + { + "npc_id": "3162", + "loc_data": "{3691,2954,0,1,3}" + }, + { + "npc_id": "3164", + "loc_data": "{3667,2990,0,1,3}" + }, + { + "npc_id": "3166", + "loc_data": "{3693,2979,0,1,3}" + }, + { + "npc_id": "3167", + "loc_data": "{3662,2978,1,1,4}" + }, + { + "npc_id": "3168", + "loc_data": "{3663,2981,0,1,3}" + }, + { + "npc_id": "3170", + "loc_data": "{3674,2970,0,1,0}" + }, + { + "npc_id": "3188", + "loc_data": "{3664,2971,0,1,6}" + }, + { + "npc_id": "3189", + "loc_data": "{3690,2976,0,1,1}-{3671,3006,0,1,6}" + }, + { + "npc_id": "3191", + "loc_data": "{3659,2955,0,1,3}-{3683,2994,0,1,4}-{3662,3005,0,1,4}" + }, + { + "npc_id": "3192", + "loc_data": "{3700,2994,0,1,4}-{3683,3005,0,1,3}" + }, + { + "npc_id": "3193", + "loc_data": "{3696,2993,0,1,3}-{3693,3006,0,1,3}" + }, + { + "npc_id": "3194", + "loc_data": "{3654,2992,0,1,4}-{3682,2962,0,1,3}-{3704,3006,0,1,0}" + }, + { + "npc_id": "3195", + "loc_data": "{3696,2978,0,1,1}" + }, + { + "npc_id": "3196", + "loc_data": "{3649,3004,0,1,6}" + }, + { + "npc_id": "3200", + "loc_data": "{3263,3932,0,1,3}" + }, + { + "npc_id": "3205", + "loc_data": "{3139,3448,0,1,3}" + }, + { + "npc_id": "3216", + "loc_data": "{2534,3273,0,0,0}-{2539,3273,0,0,0}" + }, + { + "npc_id": "3217", + "loc_data": "{2956,3370,0,1,3}" + }, + { + "npc_id": "3219", + "loc_data": "{3027,3344,0,1,4}" + }, + { + "npc_id": "3220", + "loc_data": "{3013,3338,0,1,4}" + }, + { + "npc_id": "3221", + "loc_data": "{3016,3334,0,1,3}-{3016,3339,0,1,6}-{3019,3341,0,1,4}" + }, + { + "npc_id": "3223", + "loc_data": "{2994,3365,0,1,4}" + }, + { + "npc_id": "3224", + "loc_data": "{3047,3365,0,1,6}" + }, + { + "npc_id": "3226", + "loc_data": "{2996,3375,0,1,4}" + }, + { + "npc_id": "3227", + "loc_data": "{2756,3182,0,1,6}" + }, + { + "npc_id": "3228", + "loc_data": "{2969,3373,0,1,3}-{2948,3353,0,1,3}-{3036,3357,0,1,3}" + }, + { + "npc_id": "3229", + "loc_data": "{2912,3344,0,1,7}-{3040,3354,0,1,2}" + }, + { + "npc_id": "3230", + "loc_data": "{2986,3370,0,1,1}" + }, + { + "npc_id": "3234", + "loc_data": "{3011,3383,0,1,0}" + }, + { + "npc_id": "3237", + "loc_data": "{2984,3435,0,0,0}" + }, + { + "npc_id": "3238", + "loc_data": "{2981,3434,0,0,0}" + }, + { + "npc_id": "3239", + "loc_data": "{2975,3436,0,0,0}" + }, + { + "npc_id": "3240", + "loc_data": "{2977,3442,0,0,0}" + }, + { + "npc_id": "3241", + "loc_data": "{2969,3451,0,1,4}" + }, + { + "npc_id": "3242", + "loc_data": "{2910,3332,0,1,0}-{2910,3337,0,1,4}-{2904,3331,0,1,3}-{2979,3568,0,1,7}-{2983,3566,0,1,3}-{2979,3566,0,1,3}-{2981,3570,0,1,6}-{2984,3561,0,1,6}" + }, + { + "npc_id": "3243", + "loc_data": "{2906,3331,0,1,6}-{2909,3333,0,1,6}" + }, + { + "npc_id": "3244", + "loc_data": "{2909,3333,0,1,1}" + }, + { + "npc_id": "3245", + "loc_data": "{2907,3336,0,1,0}" + }, + { + "npc_id": "3246", + "loc_data": "{3071,3446,0,1,6}-{2548,3567,0,1,4}" + }, + { + "npc_id": "3247", + "loc_data": "{2548,3567,0,1,1}" + }, + { + "npc_id": "3248", + "loc_data": "{3073,3442,0,1,5}" + }, + { + "npc_id": "3249", + "loc_data": "{3082,3441,0,1,0}" + }, + { + "npc_id": "3250", + "loc_data": "{3088,3426,0,1,3}-{2547,3571,0,1,7}" + }, + { + "npc_id": "3251", + "loc_data": "{3073,3422,0,1,6}" + }, + { + "npc_id": "3252", + "loc_data": "{3077,3424,0,1,6}" + }, + { + "npc_id": "3253", + "loc_data": "{2542,3578,0,1,3}" + }, + { + "npc_id": "3255", + "loc_data": "{3073,3423,0,1,3}" + }, + { + "npc_id": "3256", + "loc_data": "{3080,3415,0,1,3}-{3084,3415,0,1,6}" + }, + { + "npc_id": "3257", + "loc_data": "{3096,3432,0,1,0}" + }, + { + "npc_id": "3258", + "loc_data": "{3080,3444,0,1,3}" + }, + { + "npc_id": "3259", + "loc_data": "{3075,3438,0,1,4}" + }, + { + "npc_id": "3260", + "loc_data": "{3083,3425,0,1,3}-{2554,3564,0,1,6}-{2547,3558,0,1,6}" + }, + { + "npc_id": "3261", + "loc_data": "{3086,3425,0,1,3}" + }, + { + "npc_id": "3262", + "loc_data": "{3080,3423,0,1,1}" + }, + { + "npc_id": "3263", + "loc_data": "{3084,3419,0,1,4}" + }, + { + "npc_id": "3264", + "loc_data": "{3265,3331,0,1,7}-{3146,3460,0,1,6}-{3115,3414,0,1,3}-{3195,3240,0,1,6}-{2565,9843,0,1,0}" + }, + { + "npc_id": "3265", + "loc_data": "{3121,3427,0,1,2}-{2582,9836,0,1,1}" + }, + { + "npc_id": "3266", + "loc_data": "{3094,3406,0,1,3}" + }, + { + "npc_id": "3267", + "loc_data": "{3134,3459,0,1,1}-{3194,3240,0,1,0}-{3178,3257,0,1,1}-{3170,3255,0,1,7}-{3192,3243,0,1,1}-{3175,3249,0,1,1}-{3170,3242,0,1,2}-{3193,3243,0,1,7}-{3189,3258,0,1,1}-{3172,3245,0,1,4}-{3172,3238,0,1,6}-{3187,3246,0,1,4}-{3186,3243,0,1,7}-{3222,3238,0,1,1}-{3144,3235,0,1,6}-{3147,3224,0,1,1}-{3131,3243,0,1,7}-{3142,3242,0,1,4}-{3157,3228,0,1,6}-{3151,3217,0,1,6}-{3152,3246,0,1,1}-{3145,3266,0,1,4}-{3148,3240,0,1,1}-{3135,3258,0,1,2}-{3140,3260,0,1,3}" + }, + { + "npc_id": "3268", + "loc_data": "{3012,3454,0,1,1}" + }, + { + "npc_id": "3269", + "loc_data": "{3022,3447,0,1,4}" + }, + { + "npc_id": "3270", + "loc_data": "{3010,3452,0,1,3}" + }, + { + "npc_id": "3272", + "loc_data": "{3042,3468,0,1,1}" + }, + { + "npc_id": "3273", + "loc_data": "{3030,3465,0,1,5}" + }, + { + "npc_id": "3276", + "loc_data": "{3039,3475,0,1,4}" + }, + { + "npc_id": "3277", + "loc_data": "{3035,3471,0,1,2}" + }, + { + "npc_id": "3278", + "loc_data": "{3045,3477,0,1,1}" + }, + { + "npc_id": "3279", + "loc_data": "{3039,3471,0,1,6}" + }, + { + "npc_id": "3280", + "loc_data": "{3015,3451,0,0,0}" + }, + { + "npc_id": "3281", + "loc_data": "{3018,3450,0,0,0}" + }, + { + "npc_id": "3282", + "loc_data": "{3008,3442,0,0,0}" + }, + { + "npc_id": "3283", + "loc_data": "{3039,3424,0,1,5}-{3043,3429,0,1,4}-{3047,3427,0,1,1}-{2964,3455,0,0,0}-{3048,3441,0,1,3}" + }, + { + "npc_id": "3284", + "loc_data": "{3058,3419,0,0,0}-{3048,3423,0,1,6}-{2969,3437,0,0,0}-{3054,3432,0,1,5}" + }, + { + "npc_id": "3285", + "loc_data": "{3036,3430,0,1,3}-{3025,3442,0,0,0}-{2952,3376,0,0,0}" + }, + { + "npc_id": "3286", + "loc_data": "{3034,3450,0,1,3}-{3057,3447,0,1,6}-{2968,3448,0,1,1}" + }, + { + "npc_id": "3287", + "loc_data": "{3073,3443,0,1,0}-{3046,3453,0,1,6}-{2987,3444,0,1,0}" + }, + { + "npc_id": "3288", + "loc_data": "{3034,3437,0,1,0}-{2987,3446,0,1,7}" + }, + { + "npc_id": "3294", + "loc_data": "{3014,3339,0,1,2}" + }, + { + "npc_id": "3295", + "loc_data": "{3020,3337,0,1,1}" + }, + { + "npc_id": "3296", + "loc_data": "{2957,3359,0,1,0}-{2958,3358,0,1,0}-{2967,3360,0,1,0}-{2970,3361,0,1,0}-{2973,3359,0,1,0}-{2977,3357,0,1,0}-{2989,3384,0,1,0}" + }, + { + "npc_id": "3298", + "loc_data": "{3366,9637,2,1,3}" + }, + { + "npc_id": "3299", + "loc_data": "{3077,3257,0,1,1}" + }, + { + "npc_id": "3302", + "loc_data": "{2453,4449,0,1,2}" + }, + { + "npc_id": "3307", + "loc_data": "{2467,4438,0,1,4}-{2471,4439,0,1,7}-{2465,4436,0,1,3}-{2464,4432,0,1,4}" + }, + { + "npc_id": "3310", + "loc_data": "{2415,4451,0,1,6}-{2416,4435,0,1,7}-{2423,4432,0,1,4}" + }, + { + "npc_id": "3318", + "loc_data": "{2401,4378,0,0,0}" + }, + { + "npc_id": "3324", + "loc_data": "{3159, 3433, 0, 1, 0}" + }, + { + "npc_id": "3325", + "loc_data": "{3161,3432,1,1,4}" + }, + { + "npc_id": "3328", + "loc_data": "{3203,3344,0,0,0}" + }, + { + "npc_id": "3329", + "loc_data": "{3112,3414,0,0,0}" + }, + { + "npc_id": "3330", + "loc_data": "{3132,3508,0,0,0}" + }, + { + "npc_id": "3331", + "loc_data": "{3242,3240,0,0,4}" + }, + { + "npc_id": "3340", + "loc_data": "{1759,5182,0,1,0}" + }, + { + "npc_id": "3341", + "loc_data": "{1759,5191,0,0,0}-{1754,5200,0,0,0}-{1748,5223,0,0,0}-{1784,5199,0,0,0}-{1739,5154,0,0,0}" + }, + { + "npc_id": "3342", + "loc_data": "{1745,5208,0,0,0}-{1737,5215,0,0,0}-{1758,5210,0,0,0}-{1768,5175,0,0,0}-{1760,5152,0,0,0}-{1745,5169,0,0,0}" + }, + { + "npc_id": "3343", + "loc_data": "{1764,5198,0,0,0}-{1774,5195,0,0,0}-{1773,5149,0,0,0}-{1742,5292,0,0,0}" + }, + { + "npc_id": "3344", + "loc_data": "{2412,4470,0,0,0}-{2414,4467,0,0,0}-{2415,4475,0,0,0}-{2419,4467,0,0,0}-{2419,4474,0,0,0}" + }, + { + "npc_id": "3345", + "loc_data": "{2412,4370,0,0,0}-{2416,4376,0,0,0}-{2419,4374,0,0,0}-{2420,4377,0,0,0}-{2421,4370,0,0,0}" + }, + { + "npc_id": "3348", + "loc_data": "{2978,3343,0,1,4}-{2978,3337,0,1,1}-{2966,3337,1,1,6}-{2970,3330,2,1,1}" + }, + { + "npc_id": "3349", + "loc_data": "{2961,3330,2,1,0}-{2966,3352,2,1,1}-{2974,3328,2,1,6}" + }, + { + "npc_id": "3350", + "loc_data": "{2959,3340,2,1,3}" + }, + { + "npc_id": "3376", + "loc_data": "{3313,5453,0,1,3}-{3312,5452,0,1,3}-{3310,5452,0,1,6}-{3311,5462,0,1,5}-{3313,5554,0,1,6}-{3297,5562,0,1,1}-{3305,5554,0,1,1}-{3300,5540,0,1,1}" + }, + { + "npc_id": "3384", + "loc_data": "{3211,3225,0,0,0}" + }, + { + "npc_id": "3402", + "loc_data": "{2560,2842,0,0,0}" + }, + { + "npc_id": "3407", + "loc_data": "{3114,3515,0,1,4}" + }, + { + "npc_id": "3408", + "loc_data": "{3113,3510,0,1,7}" + }, + { + "npc_id": "3419", + "loc_data": "{2540,3020,0,0,0}-{2555,2953,0,0,0}" + }, + { + "npc_id": "3450", + "loc_data": "{2901,2947,0,0,0}-{2925,2959,0,0,0}-{2920,3053,0,0,0}-{2924,3063,0,0,0}" + }, + { + "npc_id": "3469", + "loc_data": "{2657,2966,0,0,0}" + }, + { + "npc_id": "3470", + "loc_data": "{2755,3083,0,0,0}" + }, + { + "npc_id": "3479", + "loc_data": "{2906,3514,1,0,0}" + }, + { + "npc_id": "3541", + "loc_data": "{3517,3240,0,1,6}" + }, + { + "npc_id": "3587", + "loc_data": "{2587,9741,0,1,4}-{2585,9739,0,1,7}-{2582,9736,0,1,3}-{2589,9734,0,1,4}-{2582,9743,0,1,3}-{2576,9746,0,1,7}-{2579,9741,0,1,6}" + }, + { + "npc_id": "3638", + "loc_data": "{3309,3453,0,0,1}" + }, + { + "npc_id": "3671", + "loc_data": "{3084,3250,0,1,1}" + }, + { + "npc_id": "3673", + "loc_data": "{2925,3321,0,1,4}-{2924,3319,0,1,0}" + }, + { + "npc_id": "3675", + "loc_data": "{3321,2857,0,1,3}-{3322,2861,0,0,4}-{3319,2855,0,1,1}-{3319,2853,0,1,6}-{3331,2791,0,1,1}-{3333,2803,0,1,2}-{3338,2801,0,1,4}-{3338,2776,0,1,3}" + }, + { + "npc_id": "3677", + "loc_data": "{2637,3440,0,0,0}" + }, + { + "npc_id": "3679", + "loc_data": "{2875,3482,0,0,4}" + }, + { + "npc_id": "3680", + "loc_data": "{3281,3331,0,1,7}" + }, + { + "npc_id": "3695", + "loc_data": "{2661,3701,0,1,0}" + }, + { + "npc_id": "3696", + "loc_data": "{2673,3658,0,1,3}" + }, + { + "npc_id": "3707", + "loc_data": "{2713,10133,0,1,2}-{2708,10133,0,1,4}-{2706,10135,0,0,3}-{2708,10133,0,1,3}-{2703,10135,0,1,6}-{2702,10131,0,1,4}-{2717,10133,0,1,0}-{2708,10130,0,1,1}" + }, + { + "npc_id": "3709", + "loc_data": "{2974,2906,0,0,0}-{2847,5075,0,0,0}" + }, + { + "npc_id": "3711", + "loc_data": "{2575,9746,0,1,0}-{2581,9747,0,1,0}-{2577,9743,0,1,1}-{2579,9740,0,1,0}-{2588,9733,0,1,4}" + }, + { + "npc_id": "3777", + "loc_data": "{3230,3231,0,1,5}" + }, + { + "npc_id": "3778", + "loc_data": "{1867,4233,0,0,0}" + }, + { + "npc_id": "3780", + "loc_data": "{1906,4281,0,0,0}" + }, + { + "npc_id": "3781", + "loc_data": "{2659,2675,0,1,1}" + }, + { + "npc_id": "3786", + "loc_data": "{2658,2666,0,1,1}" + }, + { + "npc_id": "3787", + "loc_data": "{2754,3509,0,0,0}" + }, + { + "npc_id": "3788", + "loc_data": "{2664,2653,0,1,3}" + }, + { + "npc_id": "3789", + "loc_data": "{2660,2649,0,1,3}" + }, + { + "npc_id": "3790", + "loc_data": "{3041,3203,0,0,6}" + }, + { + "npc_id": "3791", + "loc_data": "{2653,2655,0,1,1}" + }, + { + "npc_id": "3793", + "loc_data": "{2659,2660,0,1,6}" + }, + { + "npc_id": "3796", + "loc_data": "{2667,2661,0,0,3}" + }, + { + "npc_id": "3797", + "loc_data": "{2649,2659,0,0,2}" + }, + { + "npc_id": "3798", + "loc_data": "{2658,2652,0,1,6}" + }, + { + "npc_id": "3799", + "loc_data": "{2650,2663,0,0,4}" + }, + { + "npc_id": "3802", + "loc_data": "{2657,2637,0,0,6}" + }, + { + "npc_id": "3804", + "loc_data": "{3349,3793,0,0,0}-{3349,3793,0,0,4}-{3349,3793,0,0,4}" + }, + { + "npc_id": "3806", + "loc_data": "{3166, 3304, 0, 1, 0}" + }, + { + "npc_id": "3807", + "loc_data": "{3254,3274,0,0,0}" + }, + { + "npc_id": "3808", + "loc_data": "{2517,3205,0,1,3}-{2513,3204,0,1,3}-{2422,3526,0,1,1}" + }, + { + "npc_id": "3809", + "loc_data": "{3285,3213,0,1,1}" + }, + { + "npc_id": "3810", + "loc_data": "{2847,3499,0,1,7}-{2970,2973,0,0,0}" + }, + { + "npc_id": "3811", + "loc_data": "{2918,3057,0,0,0}-{2894,2730,0,1,2}-{2465,3501,3,1,3}" + }, + { + "npc_id": "3813", + "loc_data": "{2541,2969,0,1,4}" + }, + { + "npc_id": "3817", + "loc_data": "{2521,3208,0,1,1}" + }, + { + "npc_id": "3819", + "loc_data": "{2416,3525,0,1,3}-{2412,3527,0,1,6}" + }, + { + "npc_id": "3820", + "loc_data": "{3088,3255,0,0,6}" + }, + { + "npc_id": "3823", + "loc_data": "{2343,3668,0,0,0}" + }, + { + "npc_id": "3824", + "loc_data": "{2329,3689,0,1,6}" + }, + { + "npc_id": "3831", + "loc_data": "{2357,3637,0,0,0}" + }, + { + "npc_id": "3832", + "loc_data": "{2345,3651,0,0,0}" + }, + { + "npc_id": "3848", + "loc_data": "{2337,3703,0,0,6}-{2340,3702,0,0,6}-{2343,3702,0,0,3}-{2349,3702,0,0,6}-{2353,3703,0,0,6}-{2310,3704,0,0,6}-{2311,3696,0,0,4}-{2343,3702,0,0,3}" + }, + { + "npc_id": "3851", + "loc_data": "{2332,3669,0,0,0}-{2325,3671,0,0,4}-{2331,3670,0,0,1}-{2333,3671,0,0,3}" + }, + { + "npc_id": "3915", + "loc_data": "{2945,3146,0,1,3}" + }, + { + "npc_id": "3916", + "loc_data": "{2595,3890,0,0,3}" + }, + { + "npc_id": "3917", + "loc_data": "{2581,3861,0,0,1}" + }, + { + "npc_id": "3937", + "loc_data": "{2508,3866,0,0,3}" + }, + { + "npc_id": "4235", + "loc_data": "{2669,3332,0,0,1}" + }, + { + "npc_id": "4237", + "loc_data": "{2669,3331,0,0,6}" + }, + { + "npc_id": "4239", + "loc_data": "{2669,3331,0,0,6}" + }, + { + "npc_id": "4241", + "loc_data": "{2669,3331,0,0,6}" + }, + { + "npc_id": "4243", + "loc_data": "{2669,3331,0,0,6}" + }, + { + "npc_id": "4246", + "loc_data": "{3480,3484,1,0,0}-{3479,3484,0,1,3}" + }, + { + "npc_id": "4247", + "loc_data": "{2639,3291,0,0,0}-{2981,3370,0,0,0}-{3240,3474,0,0,0}-{2737,3500,0,1,6}" + }, + { + "npc_id": "4249", + "loc_data": "{2981,3341,1,0,0}" + }, + { + "npc_id": "4250", + "loc_data": "{3302,3492,0,1,3}" + }, + { + "npc_id": "4251", + "loc_data": "{3009,3380,0,1,0}" + }, + { + "npc_id": "4261", + "loc_data": "{2569,9851,0,1,3}-{2579,9851,0,1,4}" + }, + { + "npc_id": "4263", + "loc_data": "{2584,9838,0,1,6}" + }, + { + "npc_id": "4264", + "loc_data": "{2588,9837,0,1,4}" + }, + { + "npc_id": "4269", + "loc_data": "{2608,9817,0,1,3}" + }, + { + "npc_id": "4270", + "loc_data": "{2593,9820,0,1,4}" + }, + { + "npc_id": "4271", + "loc_data": "{2596,9822,0,1,0}" + }, + { + "npc_id": "4273", + "loc_data": "{2564,9851,0,1,4}" + }, + { + "npc_id": "4274", + "loc_data": "{2586,9826,0,1,7}-{2569,9849,0,1,4}-{2581,9847,0,1,0}-{2609,9826,0,1,1}" + }, + { + "npc_id": "4275", + "loc_data": "{2594,9817,0,1,0}" + }, + { + "npc_id": "4276", + "loc_data": "{2581,9851,0,1,1}" + }, + { + "npc_id": "4285", + "loc_data": "{2880,3546,0,0,4}" + }, + { + "npc_id": "4286", + "loc_data": "{2866,3543,0,1,1}" + }, + { + "npc_id": "4287", + "loc_data": "{2840,3541,1,0,2}" + }, + { + "npc_id": "4288", + "loc_data": "{2851,3554,0,1,6}" + }, + { + "npc_id": "4289", + "loc_data": "{2792,3488,2,0,0}-{2845,3539,2,0,7}" + }, + { + "npc_id": "4290", + "loc_data": "{2854,3542,0,1,3}" + }, + { + "npc_id": "4291", + "loc_data": "{2863,3546,2,1,3}-{2870,3551,2,1,0}-{2850,3547,2,1,0}-{2844,3552,2,1,5}-{2843,3547,2,1,5}-{2872,3542,2,1,3}-{2861,3551,2,1,1}-{2865,3538,2,1,2}" + }, + { + "npc_id": "4292", + "loc_data": "{2847,3541,2,1,3}-{2855,3554,2,1,5}-{2860,3542,2,1,0}-{2869,3554,2,1,3}-{2872,3537,2,1,4}-{2850,3534,2,1,3}-{2857,3546,2,1,0}-{2838,3554,2,1,6}-{2869,3552,2,1,4}" + }, + { + "npc_id": "4293", + "loc_data": "{2840,3554,0,1,1}" + }, + { + "npc_id": "4294", + "loc_data": "{2847,3553,0,1,6}" + }, + { + "npc_id": "4295", + "loc_data": "{2856,3537,1,1,1}" + }, + { + "npc_id": "4296", + "loc_data": "{2841,3543,0,0,4}" + }, + { + "npc_id": "4297", + "loc_data": "{2856,3549,1,0,2}" + }, + { + "npc_id": "4298", + "loc_data": "{2864,3541,1,1,3}" + }, + { + "npc_id": "4299", + "loc_data": "{2866,3556,1,0,5}" + }, + { + "npc_id": "4300", + "loc_data": "{2865,3544,1,0,6}" + }, + { + "npc_id": "4312", + "loc_data": "{3323,9609,0,0,6}" + }, + { + "npc_id": "4315", + "loc_data": "{3224,3286,0,0,0}" + }, + { + "npc_id": "4317", + "loc_data": "{3230,3285,0,0,0}" + }, + { + "npc_id": "4344", + "loc_data": "{3747,3013,0,1,4}-{3766,3034,0,1,6}-{3733,2972,0,1,4}" + }, + { + "npc_id": "4346", + "loc_data": "{3786,9463,0,1,6}-{3714,2952,0,1,1}" + }, + { + "npc_id": "4347", + "loc_data": "{3728,3043,0,1,4}-{3725,3015,0,1,0}-{3722,3021,0,1,6}-{3717,3017,0,1,7}-{3723,3019,0,1,5}-{3731,3018,0,1,1}-{3734,3028,0,1,7}-{3743,3038,0,1,4}-{3749,2978,0,1,7}-{3756,2966,0,1,2}-{3759,2962,0,1,2}-{3749,2968,0,1,2}-{3757,2980,0,0,5}-{3742,3036,0,1,1}-{3747,3040,0,1,4}-{3748,3030,0,1,6}-{3748,3019,0,1,1}-{3745,3016,0,1,4}-{3741,3020,0,1,3}-{3727,3039,0,1,3}-{3734,3046,0,1,1}-{3736,3050,0,1,6}-{3735,3053,0,1,3}-{3741,3053,0,1,6}-{3756,3030,0,1,3}-{3754,3024,0,1,4}-{3769,3039,0,1,6}-{3766,3045,0,1,7}-{3764,3042,0,1,1}" + }, + { + "npc_id": "4348", + "loc_data": "{3676,3017,0,1,3}-{3687,3018,0,1,3}-{3707,3015,0,1,6}-{3729,3021,0,1,3}" + }, + { + "npc_id": "4349", + "loc_data": "{3664,3018,0,1,6}-{3658,3012,0,1,4}-{3718,3030,0,1,4}-{3757,3009,0,1,3}-{3729,2984,0,1,4}-{3720,3000,0,1,4}-{3727,3051,0,1,4}-{3809,3028,0,1,6}" + }, + { + "npc_id": "4350", + "loc_data": "{3680,3026,0,1,4}-{3675,3029,0,1,3}-{3711,3028,0,1,4}-{3733,3011,0,1,4}-{3793,3036,0,1,4}-{3698,3046,0,1,6}" + }, + { + "npc_id": "4351", + "loc_data": "{3694,3019,0,1,4}-{3760,3015,0,1,1}-{3758,3034,0,1,2}-{3728,2965,0,1,7}-{3787,3026,0,1,6}-{3714,3049,0,1,7}-{3770,3008,0,1,4}" + }, + { + "npc_id": "4352", + "loc_data": "{3683,3034,0,1,4}-{3719,3037,0,1,7}-{3770,3027,0,1,5}-{3747,3007,0,1,4}-{3735,2957,0,1,2}-{3719,3011,0,1,3}-{3727,3003,0,1,3}-{3787,3035,0,1,1}" + }, + { + "npc_id": "4353", + "loc_data": "{3719,9358,0,1,6}-{3738,9378,0,1,0}-{3765,9422,0,1,1}-{3741,9436,0,1,6}-{3727,9455,0,1,2}-{3780,9456,0,1,2}-{3827,9430,0,1,2}-{3737,9413,0,1,0}-{3735,9444,0,1,3}-{3819,9422,0,1,2}" + }, + { + "npc_id": "4354", + "loc_data": "{3739,9369,0,1,0}-{3737,9350,0,1,4}-{3721,9349,0,1,4}-{3733,9396,0,1,6}-{3813,9445,0,1,0}-{3749,9461,0,1,0}-{3786,9443,0,1,6}-{3783,9430,0,1,5}-{3821,9443,0,1,4}-{3746,9423,0,1,0}-{3764,9404,0,1,6}-{3790,9456,0,1,7}-{3760,9417,0,1,3}-{3760,9451,0,1,6}-{3732,9368,0,1,1}" + }, + { + "npc_id": "4355", + "loc_data": "{3728,9349,0,1,3}-{3749,9413,0,1,4}-{3810,9448,0,1,4}-{3752,9398,0,1,4}-{3721,9419,0,1,3}-{3786,9412,0,1,3}-{3797,9452,0,1,4}-{3754,9408,0,1,4}-{3723,9377,0,1,4}" + }, + { + "npc_id": "4356", + "loc_data": "{3755,9391,0,1,5}-{3723,9441,0,1,4}-{3766,9459,0,1,4}-{3800,9414,0,1,2}-{3821,9418,0,1,3}-{3810,9462,0,1,0}-{3809,9440,0,1,2}-{3748,9450,0,1,6}-{3765,9424,0,1,2}-{3787,9464,0,1,0}" + }, + { + "npc_id": "4357", + "loc_data": "{3771,9450,0,1,4}-{3730,9443,0,1,4}-{3808,9423,0,1,7}-{3797,9427,0,1,4}-{3833,9438,0,1,6}-{3834,9458,0,1,6}-{3797,9440,0,1,1}-{3793,9441,0,1,4}-{3829,9425,0,1,7}" + }, + { + "npc_id": "4358", + "loc_data": "{3751,2977,0,1,2}" + }, + { + "npc_id": "4359", + "loc_data": "{3669,2977,0,1,3}" + }, + { + "npc_id": "4375", + "loc_data": "{3012,3192,1,0,2}" + }, + { + "npc_id": "4376", + "loc_data": "{3081,3421,0,1,3}" + }, + { + "npc_id": "4381", + "loc_data": "{3024,10152,0,0,0}-{3020,10148,0,0,0}-{3023,10145,0,0,0}-{3018,10140,0,0,0}-{3033,10139,0,0,0}-{3028,10137,0,0,0}-{2361,5241,0,0,1}-{2358,5240,0,0,1}-{2362,5239,0,0,1}-{2364,5240,0,0,1}-{2364,5242,0,0,1}-{2372,9743,0,1,1}-{2373,9745,0,1,1}-{2374,9742,0,1,1}-{2377,9750,0,1,1}-{2378,9752,0,1,1}-{2377,9754,0,1,1}" + }, + { + "npc_id": "4382", + "loc_data": "{3162,3716,0,0,0}-{3175,3717,0,0,0}-{3161,3727,0,0,0}-{2304,5160,0,0,2}-{2324,5210,0,0,2}-{2322,5201,0,0,7}-{2324,5210,0,0,2}-{2322,5201,0,0,7}-{2327,5205,0,0,7}-{2328,5200,0,0,7}-{2326,5198,0,0,7}-{2331,5198,0,0,4}-{2333,5201,0,0,4}-{2333,5199,0,0,2}" + }, + { + "npc_id": "4383", + "loc_data": "{2321,5225,0,0,3}-{2321,5223,0,0,4}-{2317,5229,0,0,7}-{2322,5225,0,0,1}-{2325,5231,0,0,6}-{2321,5225,0,0,1}-{2314,5227,0,0,2}-{2312,5229,0,0,2}-{2330,5229,0,0,1}-{2324,5233,0,0,4}-{2320,5232,0,0,3}-{2324,5237,0,0,1}-{2329,5229,0,0,6}-{2315,5227,0,0,7}-{2318,5226,0,0,6}-{2322,5222,0,0,6}" + }, + { + "npc_id": "4384", + "loc_data": "{2355,5204,0,1,3}-{2347,5195,0,1,0}-{2336,5202,0,1,4}-{2332,5201,0,1,3}-{2327,5201,0,1,1}-{2328,5199,0,1,6}" + }, + { + "npc_id": "4385", + "loc_data": "{2350,5201,0,1,1}-{2353,5192,0,1,1}-{2324,5203,0,1,1}-{2333,5204,0,1,4}-{2264,5136,0,1,6}-{2326,5197,0,1,5}" + }, + { + "npc_id": "4386", + "loc_data": "{2312,5188,0,1,6}" + }, + { + "npc_id": "4387", + "loc_data": "{2350,5192,0,1,6}-{2350,5191,0,1,4}-{2347,5188,0,1,2}" + }, + { + "npc_id": "4388", + "loc_data": "{2305,5231,0,0,2}-{2312,5225,0,0,2}-{2314,5240,0,0,2}-{2310,5241,0,0,2}-{2308,5246,0,0,2}-{2309,5245,0,0,2}-{2315,5237,0,0,2}" + }, + { + "npc_id": "4389", + "loc_data": "{2013,5238,0,1,0}" + }, + { + "npc_id": "4390", + "loc_data": "{1984,5160,0,1,2}-{2040,5190,0,1,3}-{2044,5187,0,1,2}-{2042,5191,0,1,1}-{2045,5190,0,1,7}-{2041,5187,0,1,2}" + }, + { + "npc_id": "4391", + "loc_data": "{1952,5192,0,1,2}-{1993,5240,0,1,4}-{1991,5235,0,1,4}-{1990,5240,0,1,3}-{1989,5237,0,1,6}-{2009,5202,0,1,1}-{2005,5199,0,1,3}" + }, + { + "npc_id": "4392", + "loc_data": "{2033,5233,0,1,4}-{2033,5233,0,1,7}-{2026,5236,0,1,1}-{1984,5160,0,1,7}" + }, + { + "npc_id": "4393", + "loc_data": "{2045,5222,0,1,4}-{1944,5152,0,1,2}-{1993,5190,0,1,6}-{1993,5190,0,1,4}-{2044,5216,0,1,4}-{2008,5203,0,1,1}-{2006,5208,0,1,1}-{2037,5214,0,1,3}-{2037,5210,0,1,1}" + }, + { + "npc_id": "4394", + "loc_data": "{1997,5244,0,1,3}-{1992,5238,0,1,5}-{1990,5234,0,1,1}-{2010,5191,0,1,7}-{2018,5188,0,1,4}-{1989,5231,0,1,4}-{2018,5187,0,1,6}" + }, + { + "npc_id": "4395", + "loc_data": "{2016,5237,0,1,7}-{1988,5190,0,1,2}-{2039,5216,0,1,6}" + }, + { + "npc_id": "4396", + "loc_data": "{2034,5243,0,1,5}-{2034,5239,0,1,5}-{2032,5243,0,1,4}-{2034,5232,0,1,1}-{2033,5240,0,1,1}-{2029,5230,0,1,6}-{2030,5234,0,1,4}-{2029,5230,0,1,1}-{2029,5233,0,1,2}-{2031,5244,0,1,1}-{2039,5208,0,1,4}-{2029,5235,0,1,6}-{2028,5234,0,1,6}-{2030,5237,0,1,4}-{2033,5238,0,1,4}-{2030,5238,0,1,4}-{2032,5238,0,1,3}-{2027,5238,0,1,6}-{2034,5239,0,1,0}-{2016,5235,0,1,5}-{2015,5237,0,1,3}-{2004,5244,0,1,4}-{2005,5241,0,1,4}-{2035,5245,0,1,5}-{2004,5240,0,1,1}-{2027,5235,0,1,5}-{2027,5235,0,1,4}-{2027,5236,0,1,6}-{1999,5244,0,1,4}-{1995,5234,0,1,6}-{1993,5242,0,1,1}-{1990,5239,0,1,1}-{1990,5243,0,1,7}-{1989,5230,0,1,6}-{1990,5224,0,1,5}-{1993,5222,0,1,7}-{1986,5221,0,1,3}-{1990,5221,0,1,3}-{1986,5222,0,1,6}-{2002,5215,0,1,1}-{1996,5215,0,1,1}-{1994,5215,0,1,2}-{2002,5215,0,1,6}-{1995,5208,0,1,1}-{1993,5206,0,1,4}-{1986,5204,0,1,3}-{1986,5201,0,1,6}-{2001,5201,0,1,6}-{1987,5200,0,1,3}-{1986,5199,0,1,6}-{2009,5198,0,1,6}-{1995,5197,0,1,3}-{2009,5194,0,1,3}-{1944,5152,0,1,2}-{2005,5191,0,1,3}-{2004,5190,0,1,4}-{1991,5190,0,1,1}-{2003,5185,0,1,4}-{2004,5190,0,1,4}-{2004,5188,0,1,1}-{2005,5188,0,1,6}-{2008,5192,0,1,6}-{2008,5193,0,1,3}-{2009,5200,0,1,7}-{2010,5192,0,1,4}-{2010,5194,0,1,4}-{2013,5190,0,1,6}-{2018,5189,0,1,6}-{2018,5192,0,1,6}-{2018,5187,0,1,4}-{1993,5205,0,1,4}-{1994,5206,0,1,3}-{1989,5206,0,1,0}-{1993,5210,0,1,3}-{1989,5200,0,1,4}-{2002,5215,0,1,1}-{2022,5193,0,1,3}-{1995,5220,0,1,1}-{1992,5222,0,1,6}-{1992,5222,0,1,6}-{1988,5201,0,1,4}-{1988,5224,0,1,4}-{1989,5206,0,1,4}-{1987,5225,0,1,4}-{1988,5225,0,1,4}-{1986,5204,0,1,3}-{1987,5226,0,1,4}-{1990,5227,0,1,3}-{1993,5200,0,1,7}-{1990,5228,0,1,4}-{2004,5200,0,1,6}-{1990,5227,0,1,4}-{1990,5224,0,1,6}-{1994,5223,0,1,4}-{2036,5201,0,1,6}-{2038,5215,0,1,4}-{2042,5208,0,1,1}-{2045,5204,0,1,1}-{2046,5205,0,1,3}-{2028,5195,0,1,3}-{2026,5195,0,1,0}-{2039,5193,0,1,3}-{2025,5193,0,1,1}-{2022,5193,0,1,6}-{2043,5192,0,1,2}-{2018,5192,0,1,1}-{2045,5192,0,1,1}-{2032,5190,0,1,1}-{2030,5189,0,1,4}-{2024,5187,0,1,3}-{2038,5186,0,1,4}-{2038,5185,0,1,3}-{2033,5185,0,1,3}-{2016,5186,0,1,1}-{2017,5194,0,1,1}-{2024,5193,0,1,4}-{2008,5201,0,1,4}-{2005,5220,0,1,1}-{2005,5204,0,1,4}-{2037,5203,0,1,3}-{2037,5206,0,1,4}-{2041,5208,0,1,1}" + }, + { + "npc_id": "4397", + "loc_data": "{2072,5200,0,1,5}-{2145,5251,0,1,3}-{2153,5253,0,1,1}-{2149,5255,0,1,3}-{2146,5252,0,1,5}-{2146,5261,0,1,6}-{2147,5254,0,1,4}" + }, + { + "npc_id": "4398", + "loc_data": "{2160,5282,0,1,3}-{2162,5284,0,1,1}-{2164,5281,0,1,7}" + }, + { + "npc_id": "4399", + "loc_data": "{2122,5290,0,1,0}-{2131,5297,0,1,6}-{2119,5297,0,1,4}-{2120,5302,0,1,3}-{2080,5240,0,1,2}-{2129,5306,0,1,3}-{2123,5304,0,1,1}-{2130,5306,0,1,4}-{2163,5301,0,1,5}-{2166,5306,0,1,0}-{2169,5303,0,1,4}-{2122,5291,0,1,0}-{2119,5296,0,1,3}-{2131,5297,0,1,6}-{2125,5302,0,1,0}-{2127,5304,0,1,4}-{2165,5302,0,1,3}-{2163,5301,0,1,4}-{2168,5306,0,1,4}-{2132,5300,0,1,6}-{2132,5302,0,1,4}" + }, + { + "npc_id": "4400", + "loc_data": "{3018,10313,0,1,4}-{3016,10315,0,1,4}-{3018,10322,0,1,4}-{3024,10326,0,1,3}-{3030,10332,0,1,4}-{3029,10337,0,1,6}-{3034,10342,0,1,3}-{2072,5200,0,1,7}-{2130,5267,0,1,7}-{2140,5252,0,1,5}-{2141,5252,0,1,1}-{2142,5252,0,1,0}-{2148,5255,0,1,3}-{2125,5270,0,1,1}-{2148,5257,0,1,1}-{2117,5274,0,1,4}-{2146,5307,0,1,2}-{2145,5305,0,1,5}-{2152,5307,0,1,4}-{2148,5252,0,1,0}-{2142,5262,0,1,3}-{2124,5275,0,1,4}-{2121,5276,0,1,3}-{2148,5304,0,1,0}-{2146,5305,0,1,5}-{2148,5304,0,1,1}-{2151,5304,0,1,6}-{2145,5306,0,1,3}-{2134,5272,0,1,6}" + }, + { + "npc_id": "4401", + "loc_data": "{2124,5273,0,1,1}-{2072,5200,0,1,6}-{2128,5270,0,1,4}-{2117,5274,0,1,3}-{2154,5273,0,1,3}-{2167,5259,0,1,6}-{2170,5257,0,1,1}-{2170,5256,0,1,0}-{2171,5256,0,1,4}-{2167,5256,0,1,3}-{2153,5273,0,1,3}-{2153,5270,0,1,1}-{2171,5255,0,1,2}-{2168,5250,0,1,4}-{2168,5251,0,1,3}-{2131,5264,0,1,6}-{2096,5248,0,1,6}-{2157,5272,0,1,6}-{2150,5268,0,1,0}-{2133,5272,0,1,2}-{2157,5274,0,1,1}-{2156,5270,0,1,3}-{2154,5271,0,1,5}" + }, + { + "npc_id": "4402", + "loc_data": "{2080,5240,0,1,5}-{2171,5283,0,1,6}-{2170,5287,0,1,6}-{2170,5281,0,1,6}-{2172,5272,0,1,4}-{2172,5272,0,1,4}" + }, + { + "npc_id": "4403", + "loc_data": "{2096,5248,0,1,4}-{2172,5276,0,1,1}-{2172,5284,0,1,1}-{2172,5281,0,1,2}" + }, + { + "npc_id": "4404", + "loc_data": "{1872,5242,0,1,3}-{1873,5230,0,1,2}-{1870,5235,0,1,3}-{1872,5217,0,1,6}-{1873,5212,0,1,4}-{1877,5218,0,1,2}-{1877,5216,0,1,3}-{1875,5218,0,1,6}-{1808,5152,0,1,2}-{1871,5191,0,1,4}-{1868,5188,0,1,4}-{1861,5189,0,1,3}-{1882,5216,0,1,6}-{1874,5215,0,1,5}-{1873,5238,0,1,3}" + }, + { + "npc_id": "4406", + "loc_data": "{1898,5197,0,1,6}-{1898,5191,0,1,7}-{1890,5195,0,1,3}-{1893,5191,0,1,4}-{1903,5190,0,1,0}-{1889,5190,0,1,3}-{1889,5190,0,1,4}-{1885,5191,0,1,4}-{1900,5208,0,1,1}-{1900,5210,0,1,1}-{1903,5243,0,1,6}-{1848,5176,0,1,2}-{1901,5245,0,1,4}-{1894,5243,0,1,5}-{1890,5242,0,1,6}-{1889,5244,0,1,4}-{1897,5196,0,1,1}-{1902,5207,0,1,3}" + }, + { + "npc_id": "4407", + "loc_data": "{1860,5226,0,1,0}-{1859,5200,0,1,0}-{1860,5222,0,1,4}-{1865,5205,0,1,4}-{1862,5205,0,1,7}-{1862,5205,0,1,7}-{1864,5206,0,1,7}" + }, + { + "npc_id": "4408", + "loc_data": "{1860,5215,0,1,5}-{1864,5218,0,1,1}" + }, + { + "npc_id": "4409", + "loc_data": "{1864,5226,0,1,1}-{1859,5220,0,1,4}-{1861,5224,0,1,6}" + }, + { + "npc_id": "4410", + "loc_data": "{1890,5205,0,1,6}-{1897,5232,0,1,6}-{1906,5236,0,1,3}-{1848,5176,0,1,2}-{1904,5235,0,1,6}-{1895,5227,0,1,3}-{1863,5221,0,1,4}" + }, + { + "npc_id": "4411", + "loc_data": "{1882,5201,0,1,0}-{1884,5207,0,1,3}-{1912,5239,0,1,4}-{1912,5244,0,1,5}-{1890,5204,0,1,5}" + }, + { + "npc_id": "4412", + "loc_data": "{1880,5200,0,1,6}-{1911,5241,0,1,0}-{1893,5228,0,1,3}" + }, + { + "npc_id": "4413", + "loc_data": "{1871,5228,0,1,6}-{1872,5233,0,1,1}-{2645,3580,0,1,4}" + }, + { + "npc_id": "4414", + "loc_data": "{1808,5152,0,1,2}-{1890,5215,0,1,5}-{1892,5216,0,1,1}-{1889,5223,0,1,3}-{1892,5224,0,1,2}-{1893,5219,0,1,5}" + }, + { + "npc_id": "4415", + "loc_data": "{1874,5230,0,1,3}-{1870,5232,0,1,4}-{1858,5235,0,1,3}-{1871,5241,0,1,7}-{1860,5223,0,1,4}-{1862,5222,0,1,4}-{1874,5234,0,1,5}-{1874,5230,0,1,5}-{1875,5219,0,1,5}-{1876,5215,0,1,3}-{1876,5220,0,1,6}-{1859,5206,0,1,5}-{1877,5216,0,1,4}-{1862,5201,0,1,5}-{1858,5201,0,1,6}-{1874,5201,0,1,2}-{1858,5202,0,1,0}-{1860,5200,0,1,7}-{1875,5197,0,1,6}-{1875,5201,0,1,2}-{1861,5194,0,1,3}-{1861,5224,0,1,6}-{1808,5152,0,1,2}-{1860,5192,0,1,2}-{1874,5188,0,1,7}-{1867,5188,0,1,4}-{1866,5189,0,1,4}-{1876,5189,0,1,1}-{1876,5196,0,1,3}-{1876,5188,0,1,4}-{1876,5191,0,1,4}-{1877,5191,0,1,4}-{1877,5197,0,1,6}-{1881,5198,0,1,4}-{1882,5197,0,1,5}-{1883,5203,0,1,3}-{1882,5198,0,1,4}-{1863,5205,0,1,4}-{1883,5205,0,1,5}-{1861,5205,0,1,5}-{1887,5204,0,1,3}-{1883,5205,0,1,3}-{1884,5206,0,1,1}-{1876,5215,0,1,6}-{1879,5215,0,1,2}-{1870,5217,0,1,6}-{1881,5221,0,1,1}-{1871,5218,0,1,1}-{1872,5191,0,1,3}-{1874,5219,0,1,5}-{1884,5228,0,1,4}-{1882,5231,0,1,7}-{1882,5234,0,1,5}-{1879,5234,0,1,6}-{1897,5234,0,1,6}-{1884,5234,0,1,4}-{1884,5235,0,1,3}-{1885,5236,0,1,6}-{1879,5239,0,1,4}-{1893,5243,0,1,7}-{1880,5243,0,1,7}-{1882,5241,0,1,1}-{1902,5242,0,1,4}-{1848,5176,0,1,2}-{1901,5244,0,1,3}-{1910,5243,0,1,5}-{1911,5235,0,1,3}-{1881,5243,0,1,2}-{1879,5234,0,1,3}-{1880,5234,0,1,4}-{1879,5239,0,1,1}-{1874,5230,0,1,4}-{1874,5236,0,1,4}-{1911,5235,0,1,5}-{1912,5243,0,1,4}-{1912,5238,0,1,3}-{1913,5244,0,1,4}-{1890,5244,0,1,4}-{1907,5204,0,1,1}-{1909,5204,0,1,1}-{1908,5204,0,1,3}-{1889,5206,0,1,3}-{1890,5207,0,1,1}-{1890,5207,0,1,2}-{1912,5237,0,1,7}" + }, + { + "npc_id": "4422", + "loc_data": "{2377,4450,0,0,0}-{2381,4459,0,0,0}-{2388,4425,0,0,0}-{2394,4440,0,0,0}-{2418,4447,0,0,0}-{2427,4461,0,0,0}" + }, + { + "npc_id": "4423", + "loc_data": "{2387,4456,0,0,0}-{2423,4461,0,0,0}" + }, + { + "npc_id": "4424", + "loc_data": "{2396,4455,0,0,0}" + }, + { + "npc_id": "4425", + "loc_data": "{2398,4453,0,0,0}" + }, + { + "npc_id": "4431", + "loc_data": "{2388,4470,0,0,0}" + }, + { + "npc_id": "4437", + "loc_data": "{2447,4429,0,1,0}" + }, + { + "npc_id": "4438", + "loc_data": "{3028,4498,0,1,3}-{3046,4493,0,1,4}" + }, + { + "npc_id": "4439", + "loc_data": "{3035,4507,0,1,6}-{3041,4493,0,1,0}" + }, + { + "npc_id": "4443", + "loc_data": "{2451,4424,0,1,6}-{2452,4428,0,1,3}-{2443,4423,0,1,7}-{2446,4422,0,1,3}-{2443,4431,0,1,1}-{2441,4427,0,1,1}-{2463,4422,0,1,4}-{2478,4420,0,1,6}-{2489,4428,0,1,6}-{2478,4452,0,1,3}-{2474,4444,0,1,6}-{2493,4454,0,1,3}-{2486,4463,0,1,4}-{2486,4469,0,1,7}-{2479,4456,0,1,4}-{2477,4462,0,1,3}" + }, + { + "npc_id": "4455", + "loc_data": "{2410,4434,0,0,0}" + }, + { + "npc_id": "4472", + "loc_data": "{2524,3056,0,1,2}" + }, + { + "npc_id": "4474", + "loc_data": "{3214,3252,0,0,0}-{3214,3253,0,0,0}-{3214,3254,0,0,0}" + }, + { + "npc_id": "4478", + "loc_data": "{3291,2787,0,0,6}" + }, + { + "npc_id": "4479", + "loc_data": "{2952,3477,0,1,0}-{2959,3501,0,1,3}" + }, + { + "npc_id": "4481", + "loc_data": "{2943,3474,0,1,3}" + }, + { + "npc_id": "4482", + "loc_data": "{2952,3505,0,1,7}-{2950,3501,0,1,4}" + }, + { + "npc_id": "4483", + "loc_data": "{2944,3467,0,1,6}-{2961,3508,0,1,6}-{2953,3467,0,1,3}" + }, + { + "npc_id": "4484", + "loc_data": "{2956,3496,0,1,6}" + }, + { + "npc_id": "4485", + "loc_data": "{2951,3509,0,1,4}" + }, + { + "npc_id": "4487", + "loc_data": "{2943,3478,0,1,3}" + }, + { + "npc_id": "4488", + "loc_data": "{2946,3474,0,1,4}-{2956,3494,0,1,3}" + }, + { + "npc_id": "4489", + "loc_data": "{2946,3469,0,1,5}-{2943,3487,0,1,3}" + }, + { + "npc_id": "4491", + "loc_data": "{2963,3510,0,1,2}-{2949,3475,0,1,3}" + }, + { + "npc_id": "4492", + "loc_data": "{2953,3509,0,1,4}-{2987,3426,0,1,6}" + }, + { + "npc_id": "4493", + "loc_data": "{2957,3513,0,1,6}" + }, + { + "npc_id": "4494", + "loc_data": "{2957,3512,0,1,4}" + }, + { + "npc_id": "4495", + "loc_data": "{2957,3512,0,1,5}" + }, + { + "npc_id": "4511", + "loc_data": "{2149,3866,0,0,7}" + }, + { + "npc_id": "4512", + "loc_data": "{2092,3930,0,1,4}" + }, + { + "npc_id": "4513", + "loc_data": "{2450,4647,0,1,5}" + }, + { + "npc_id": "4514", + "loc_data": "{2079,3923,0,1,7}" + }, + { + "npc_id": "4515", + "loc_data": "{2081,3899,0,1,1}" + }, + { + "npc_id": "4516", + "loc_data": "{2096,3907,0,1,6}" + }, + { + "npc_id": "4517", + "loc_data": "{2086,3915,0,1,0}" + }, + { + "npc_id": "4518", + "loc_data": "{2106,3907,0,1,6}" + }, + { + "npc_id": "4519", + "loc_data": "{2098,3921,0,0,6}-{2099,3921,0,0,6}-{2097,3921,0,0,6}" + }, + { + "npc_id": "4524", + "loc_data": "{2083,3903,0,1,3}" + }, + { + "npc_id": "4525", + "loc_data": "{2098,3894,0,1,3}" + }, + { + "npc_id": "4526", + "loc_data": "{2103,3914,0,1,7}" + }, + { + "npc_id": "4527", + "loc_data": "{2071,3877,0,1,2}-{2084,3868,0,1,1}-{2089,3864,0,1,4}" + }, + { + "npc_id": "4528", + "loc_data": "{2115,3864,0,1,6}-{2105,3848,0,1,1}-{2122,3946,0,1,3}" + }, + { + "npc_id": "4529", + "loc_data": "{2070,3879,0,1,7}-{2097,3862,0,1,3}-{2118,3852,0,1,4}-{2144,3853,0,1,5}" + }, + { + "npc_id": "4530", + "loc_data": "{2076,3866,0,1,1}-{2133,3874,0,1,4}-{2107,3945,0,1,1}" + }, + { + "npc_id": "4531", + "loc_data": "{2103,3866,0,1,3}-{2134,3851,0,1,4}-{2116,3950,0,1,0}" + }, + { + "npc_id": "4534", + "loc_data": "{3206,5487,0,1,6}-{3200,5492,0,1,1}" + }, + { + "npc_id": "4536", + "loc_data": "{2213,3794,0,0,3}" + }, + { + "npc_id": "4537", + "loc_data": "{2621,3688,0,0,6}" + }, + { + "npc_id": "4539", + "loc_data": "{2079,3925,0,1,1}" + }, + { + "npc_id": "4540", + "loc_data": "{2221,3797,2,1,3}-{2137,3899,2,1,2}" + }, + { + "npc_id": "4560", + "loc_data": "{3062,3260,0,1,6}" + }, + { + "npc_id": "4563", + "loc_data": "{3003,9798,0,1,3}" + }, + { + "npc_id": "4568", + "loc_data": "{3364,3338,0,1,6}" + }, + { + "npc_id": "4570", + "loc_data": "{3201,3301,0,1,3}-{3115,3276,0,1,6}" + }, + { + "npc_id": "4571", + "loc_data": "{3205,3298,0,1,3}-{3095,3286,0,1,4}-{3098,3225,0,1,4}-{3056,3248,0,1,0}" + }, + { + "npc_id": "4572", + "loc_data": "{2448,3510,1,0,4}" + }, + { + "npc_id": "4573", + "loc_data": "{2441,3501,1,1,3}" + }, + { + "npc_id": "4575", + "loc_data": "{2441,3503,1,1,4}" + }, + { + "npc_id": "4578", + "loc_data": "{2933,2972,0,0,0}" + }, + { + "npc_id": "4580", + "loc_data": "{2572,3299,1,0,0}" + }, + { + "npc_id": "4585", + "loc_data": "{3115,3160,0,0,0}" + }, + { + "npc_id": "4586", + "loc_data": "{2593,3087,0,1,4}" + }, + { + "npc_id": "4587", + "loc_data": "{2449,3503,1,0,6}" + }, + { + "npc_id": "4588", + "loc_data": "{2448,3500,1,0,3}" + }, + { + "npc_id": "4597", + "loc_data": "{2375,3433,0,1,0}" + }, + { + "npc_id": "4599", + "loc_data": "{2417,3513,0,1,4}" + }, + { + "npc_id": "4603", + "loc_data": "{3008,3514,0,1,3}" + }, + { + "npc_id": "4604", + "loc_data": "{3017,3513,0,1,0}-{3018,3515,0,1,1}" + }, + { + "npc_id": "4605", + "loc_data": "{3018,3512,0,1,7}-{3019,3514,0,1,1}-{3019,3516,0,1,1}" + }, + { + "npc_id": "4606", + "loc_data": "{3017,3514,0,1,4}" + }, + { + "npc_id": "4607", + "loc_data": "{3030,3505,0,0,0}" + }, + { + "npc_id": "4611", + "loc_data": "{3076,3259,0,0,0}" + }, + { + "npc_id": "4649", + "loc_data": "{2142,3122,0,1,4}-{2147,3122,0,1,3}" + }, + { + "npc_id": "4650", + "loc_data": "{3041,3194,0,1,4}" + }, + { + "npc_id": "4651", + "loc_data": "{2760,3239,0,1,3}-{2143,3121,0,1,6}" + }, + { + "npc_id": "4652", + "loc_data": "{2674,3144,0,1,3}-{3701,3501,0,1,6}" + }, + { + "npc_id": "4653", + "loc_data": "{2794,3414,0,1,6}-{3040,3192,0,1,3}-{2954,3154,0,1,6}-{3671,2930,0,1,6}" + }, + { + "npc_id": "4654", + "loc_data": "{3001,3033,0,1,6}-{2674,3146,0,1,6}-{2145,3122,0,1,3}" + }, + { + "npc_id": "4655", + "loc_data": "{2954,3157,0,1,3}-{3701,3503,0,1,1}" + }, + { + "npc_id": "4656", + "loc_data": "{2795,3414,0,1,6}-{3038,3192,0,1,3}-{2760,3238,0,1,3}" + }, + { + "npc_id": "4670", + "loc_data": "{3192,3832,0,1,6}-{3211,3813,0,1,6}" + }, + { + "npc_id": "4671", + "loc_data": "{3189,3836,0,1,6}-{3181,3815,0,1,6}" + }, + { + "npc_id": "4672", + "loc_data": "{3212,3847,0,1,6}-{3221,3827,0,1,6}" + }, + { + "npc_id": "4675", + "loc_data": "{3048,10266,0,1,4}" + }, + { + "npc_id": "4676", + "loc_data": "{3054,10269,0,1,4}" + }, + { + "npc_id": "4677", + "loc_data": "{3335,3687,0,1,4}-{3338,3700,0,1,2}-{3316,5448,0,1,2}-{3107,10065,0,1,0}-{3299,5545,0,1,6}" + }, + { + "npc_id": "4678", + "loc_data": "{3335,3701,0,1,6}-{3350,3687,0,1,5}-{3305,5454,0,1,6}-{3110,10076,0,1,0}" + }, + { + "npc_id": "4679", + "loc_data": "{3333,3694,0,1,6}-{3341,3685,0,1,4}-{3118,10068,0,1,0}-{3312,5558,0,1,1}" + }, + { + "npc_id": "4680", + "loc_data": "{3349,3696,0,1,5}-{3120,10080,0,1,0}" + }, + { + "npc_id": "4685", + "loc_data": "{2957,3895,0,1,4}-{3209,5552,0,1,1}-{3223,5555,0,1,4}-{3220,5548,0,1,6}-{3220,5557,0,1,4}" + }, + { + "npc_id": "4686", + "loc_data": "{2827,3512,0,1,5}-{2957,3898,0,1,6}-{2946,3898,0,1,7}-{3213,5548,0,1,4}" + }, + { + "npc_id": "4688", + "loc_data": "{2700,3212,0,1,6}" + }, + { + "npc_id": "4690", + "loc_data": "{3256,3624,0,1,5}-{3105,3876,0,1,2}" + }, + { + "npc_id": "4694", + "loc_data": "{3098,3870,0,1,1}-{3020,3854,0,1,7}-{2843,9558,0,1,1}-{2840,9605,0,1,4}-{3053,10124,0,1,0}-{3056,10140,0,1,0}" + }, + { + "npc_id": "4695", + "loc_data": "{3097,3696,0,1,4}-{3017,3851,0,1,2}-{2839,9565,0,1,3}-{2837,9601,0,1,4}-{2840,3279,0,1,6}-{3048,10134,0,1,0}-{3061,10138,0,1,0}" + }, + { + "npc_id": "4696", + "loc_data": "{3118,3695,0,1,6}-{3010,3851,0,1,1}-{2839,9560,0,1,4}-{2846,9613,0,1,6}-{3062,10131,0,1,0}" + }, + { + "npc_id": "4697", + "loc_data": "{3125,3706,0,1,5}-{3331,3853,0,1,2}-{3016,3841,0,1,4}-{2845,9557,0,1,2}-{2839,9624,0,1,6}-{2825,3277,0,1,3}-{3065,10125,0,1,0}" + }, + { + "npc_id": "4698", + "loc_data": "{3139,3712,0,1,5}-{3306,3890,0,1,6}-{3085,10093,0,1,0}-{3090,10084,0,1,0}-{2861,9752,0,1,4}-{2363,9776,0,1,1}-{2361,9755,0,1,1}-{2365,9754,0,1,1}-{2362,9751,0,1,1}" + }, + { + "npc_id": "4699", + "loc_data": "{3035,10245,0,1,4}-{3159,3707,0,1,3}-{3301,3871,0,1,5}-{3097,10092,0,1,0}-{3082,10083,0,1,0}-{2629,9477,2,0,0}-{2640,9502,2,0,1}-{2359,9741,0,1,1}" + }, + { + "npc_id": "4700", + "loc_data": "{3030,10259,0,1,3}-{3144,3701,0,1,4}-{3279,3876,0,1,4}-{3094,10092,0,1,0}-{3089,10081,0,1,0}-{2633,9488,2,0,6}-{2862,9750,0,1,7}-{2358,9737,0,1,1}-{2366,9763,0,1,1}" + }, + { + "npc_id": "4701", + "loc_data": "{3028,10250,0,1,4}-{3149,3690,0,1,4}-{3286,3901,0,1,3}-{3089,10089,0,1,0}-{3085,10081,0,1,0}-{2628,9489,2,0,0}-{2631,9504,2,0,5}-{2361,9755,0,1,1}-{2363,9743,0,1,1}-{2363,9772,0,1,1}" + }, + { + "npc_id": "4702", + "loc_data": "{3084,9957,0,1,6}-{2712,9480,0,0,5}" + }, + { + "npc_id": "4703", + "loc_data": "{3092,9958,0,1,2}" + }, + { + "npc_id": "4704", + "loc_data": "{3160,5521,0,1,1}" + }, + { + "npc_id": "4705", + "loc_data": "{3088,9961,0,1,1}-{3169,5528,0,1,0}" + }, + { + "npc_id": "4706", + "loc_data": "{3242,5555,0,1,3}-{3206,5493,0,1,5}" + }, + { + "npc_id": "4707", + "loc_data": "{3213,3253,0,0,6}" + }, + { + "npc_id": "4710", + "loc_data": "{3222,3475,0,0,5}" + }, + { + "npc_id": "4732", + "loc_data": "{3429,3701,0,0,0}" + }, + { + "npc_id": "4898", + "loc_data": "{3124,9874,0,1,3}-{3128,9875,0,1,6}" + }, + { + "npc_id": "4899", + "loc_data": "{3231,3197,0,1,6}" + }, + { + "npc_id": "4900", + "loc_data": "{3210,3213,1,1,1}" + }, + { + "npc_id": "4901", + "loc_data": "{3245,3157,0,0,7}" + }, + { + "npc_id": "4902", + "loc_data": "{3227,3147,0,0,1}" + }, + { + "npc_id": "4903", + "loc_data": "{3244,3214,0,1,1}" + }, + { + "npc_id": "4904", + "loc_data": "{3228,3254,0,1,3}" + }, + { + "npc_id": "4906", + "loc_data": "{3230,3244,0,1,4}" + }, + { + "npc_id": "4907", + "loc_data": "{3208,3222,2,0,6}" + }, + { + "npc_id": "4909", + "loc_data": "{2831,3352,0,0,7}" + }, + { + "npc_id": "4920", + "loc_data": "{3289,5496,0,0,5}-{3272,5490,0,0,0}-{3188,5510,0,1,6}-{3194,5510,0,1,2}" + }, + { + "npc_id": "4921", + "loc_data": "{3304,5493,0,1,3}-{3303,5496,0,1,0}-{3271,5490,0,0,5}" + }, + { + "npc_id": "4926", + "loc_data": "{3225,3551,0,1,1}-{3248,3524,0,1,1}" + }, + { + "npc_id": "4927", + "loc_data": "{3227,3529,0,1,1}" + }, + { + "npc_id": "4930", + "loc_data": "{3412,2889,0,1,3}-{3414,2892,0,1,1}-{3414,2890,0,1,1}-{3416,2886,0,1,4}-{3416,2893,0,1,6}" + }, + { + "npc_id": "4932", + "loc_data": "{3414,2891,0,1,1}-{3410,2888,0,1,7}" + }, + { + "npc_id": "4944", + "loc_data": "{2042,5213,0,1,5}-{2020,5236,0,1,2}-{1944,5152,0,1,2}-{2041,5216,0,1,0}" + }, + { + "npc_id": "4945", + "loc_data": "{1994,5192,0,1,4}-{1997,5190,0,1,1}" + }, + { + "npc_id": "4946", + "loc_data": "{2721,3432,0,1,4}" + }, + { + "npc_id": "4947", + "loc_data": "{2825,3696,0,1,3}" + }, + { + "npc_id": "4950", + "loc_data": "{2855,10051,1,0,0}" + }, + { + "npc_id": "4953", + "loc_data": "{2684,3274,1,0,0}" + }, + { + "npc_id": "4955", + "loc_data": "{2772,3223,0,0,0}" + }, + { + "npc_id": "4956", + "loc_data": "{2783,3119,0,0,0}" + }, + { + "npc_id": "4961", + "loc_data": "{2683,3275,1,0,0}" + }, + { + "npc_id": "4975", + "loc_data": "{3303,3024,0,0,7}-{3299,3016,0,0,2}-{3280,9438,0,0,6}-{3275,9460,0,0,3}-{3267,9458,0,0,3}-{3270,9415,0,0,6}-{3272,9429,0,0,4}-{3272,9421,0,0,4}-{3271,9450,0,0,1}-{3288,9413,0,0,6}-{3297,9414,0,0,6}-{3300,9414,0,0,6}-{3304,9424,0,0,1}-{3292,9426,0,0,4}-{3295,9421,0,0,3}-{3297,9412,0,0,1}-{3292,9413,0,0,3}-{3324,9429,0,0,3}-{3311,9440,0,0,6}-{3294,9459,0,0,1}-{3291,9463,0,0,6}-{3296,9468,0,0,1}-{3288,9468,0,0,1}-{3313,9449,0,0,1}-{3034,2971,0,0,5}-{3030,2971,0,0,1}" + }, + { + "npc_id": "4976", + "loc_data": "{3301,3017,0,0,7}-{3281,9446,0,0,1}-{3270,9451,0,0,4}-{3269,9418,0,0,1}-{3267,9441,0,0,1}-{3280,9436,0,0,1}-{3291,9414,0,0,6}-{3305,9413,0,0,6}-{3308,9415,0,0,1}-{3309,9420,0,0,1}-{3296,9425,0,0,1}-{3294,9420,0,0,1}-{3295,9412,0,0,3}-{3323,9439,0,0,6}-{3295,9460,0,0,3}-{3294,9464,0,0,6}-{3294,9467,0,0,1}-{3311,9454,0,0,6}-{3036,2972,0,0,1}-{3039,2968,0,0,1}-{3046,2982,0,0,6}-{3045,2974,0,0,6}-{3042,2972,0,0,6}" + }, + { + "npc_id": "4977", + "loc_data": "{3294,3016,0,0,6}-{3287,3016,0,0,3}-{3277,9452,0,0,1}-{3267,9443,0,0,6}-{3267,9431,0,0,6}-{3269,9420,0,0,6}-{3273,9460,0,0,4}-{3277,9454,0,0,6}-{3281,9448,0,0,6}-{3294,9413,0,0,6}-{3306,9423,0,0,1}-{3298,9436,0,0,6}-{3292,9466,0,0,6}-{3296,9462,0,0,3}-{3290,9467,0,0,1}-{3315,9451,0,0,1}-{3316,9454,0,0,3}-{3038,2973,0,0,1}-{3027,2974,0,0,1}-{3023,2977,0,0,1}-{3035,2989,0,0,4}-{3039,2985,0,0,4}" + }, + { + "npc_id": "4978", + "loc_data": "{3291,3017,0,0,5}-{3275,9463,0,0,1}-{3273,9430,0,0,6}-{3273,9422,0,0,6}-{3267,9428,0,0,1}-{3294,9411,0,0,6}-{3300,9424,0,0,1}-{3289,9412,0,0,3}-{3042,2969,0,0,1}-{3038,2976,0,0,6}-{3041,2983,0,0,6}-{3043,2983,0,0,6}-{3044,2981,0,0,6}-{3043,2979,0,0,1}-{3038,2989,0,0,1}-{3025,2984,0,0,1}-{3026,2988,0,0,1}-{3030,2990,0,0,1}-{3024,2979,0,0,3}" + }, + { + "npc_id": "4985", + "loc_data": "{3304,3027,0,1,2}" + }, + { + "npc_id": "4986", + "loc_data": "{3308,3112,0,1,1}" + }, + { + "npc_id": "4989", + "loc_data": "{3272,3029,0,1,4}" + }, + { + "npc_id": "4990", + "loc_data": "{3269,3029,0,1,4}" + }, + { + "npc_id": "4991", + "loc_data": "{3270,3030,0,1,6}" + }, + { + "npc_id": "4992", + "loc_data": "{3267,3029,0,1,0}" + }, + { + "npc_id": "4993", + "loc_data": "{3277,3028,0,1,1}-{3279,9441,0,1,4}" + }, + { + "npc_id": "4994", + "loc_data": "{3285,3027,0,1,7}" + }, + { + "npc_id": "4995", + "loc_data": "{3279,3024,0,1,3}-{3286,3036,1,1,4}" + }, + { + "npc_id": "4996", + "loc_data": "{3284,3022,0,1,2}" + }, + { + "npc_id": "4997", + "loc_data": "{3289,3026,0,1,3}-{3317,9438,0,0,3}" + }, + { + "npc_id": "4998", + "loc_data": "{3293,3027,0,1,5}-{3286,9419,0,1,3}-{3296,9433,0,1,7}-{3310,9457,0,1,1}" + }, + { + "npc_id": "4999", + "loc_data": "{3280,3020,0,1,6}-{3319,9439,0,1,0}-{3299,9467,0,1,3}" + }, + { + "npc_id": "5000", + "loc_data": "{3285,3022,0,1,6}-{3295,9434,0,1,3}" + }, + { + "npc_id": "5001", + "loc_data": "{3297,3020,0,1,6}-{3280,9414,0,1,1}-{3279,9416,0,1,1}" + }, + { + "npc_id": "5002", + "loc_data": "{3295,3028,0,1,3}-{3291,9423,0,1,1}" + }, + { + "npc_id": "5020", + "loc_data": "{2905,3180,0,0,0}" + }, + { + "npc_id": "5021", + "loc_data": "{2906,3173,0,0,0}" + }, + { + "npc_id": "5022", + "loc_data": "{2907,3169,0,0,0}" + }, + { + "npc_id": "5029", + "loc_data": "{2534,3575,0,1,0}" + }, + { + "npc_id": "5030", + "loc_data": "{2533,3570,0,1,4}" + }, + { + "npc_id": "5031", + "loc_data": "{2525,3575,0,1,3}" + }, + { + "npc_id": "5032", + "loc_data": "{2525,3566,0,1,3}" + }, + { + "npc_id": "5033", + "loc_data": "{2520,3569,0,1,3}" + }, + { + "npc_id": "5049", + "loc_data": "{2808,3355,0,1,6}" + }, + { + "npc_id": "5062", + "loc_data": "{2927,3410,0,0,0}" + }, + { + "npc_id": "5065", + "loc_data": "{2925,3303,0,0,0}" + }, + { + "npc_id": "5070", + "loc_data": "{2912,3480,0,0,0}-{2911,3480,0,0,0}" + }, + { + "npc_id": "5071", + "loc_data": "{2609,2922,0,0,0}" + }, + { + "npc_id": "5072", + "loc_data": "{2526,2928,0,1,6}-{2510,2876,0,1,3}-{2517,2878,0,1,6}-{2527,2877,0,1,2}-{2532,2938,0,1,4}-{2527,2933,0,1,4}-{2521,2938,0,1,6}-{2507,2914,0,1,0}-{2512,2910,0,1,4}-{2517,2912,0,1,1}-{2517,2921,0,1,6}-{2511,2911,0,1,3}-{2521,2917,0,1,7}-{2522,2929,0,1,4}-{2510,2888,0,1,1}-{2502,2890,0,1,3}-{2520,2882,0,1,7}-{2507,2877,0,1,1}-{2464,2832,0,1,2}-{2500,2893,0,1,4}-{2548,2887,0,1,1}-{2544,2889,0,1,7}-{2536,2877,0,1,3}-{2530,2872,0,1,3}-{2520,2885,0,1,0}-{2517,2870,0,1,4}-{2498,2883,0,1,6}-{2501,2886,0,1,7}-{2508,2916,0,1,4}-{2502,2888,0,1,7}-{2514,2915,0,1,4}-{2520,2908,0,1,6}-{2515,2944,0,1,4}-{2526,2943,0,1,4}-{2525,2893,0,1,4}-{2521,2896,0,1,1}" + }, + { + "npc_id": "5073", + "loc_data": "{2907,3481,0,1,1}-{2907,3484,0,1,2}-{2908,3491,0,1,4}-{2910,3497,0,1,5}-{2905,3491,0,1,3}-{2904,3491,0,1,6}-{2901,3502,0,1,2}-{2578,2885,0,1,3}-{2582,2892,0,1,2}-{2603,2892,0,1,1}-{2604,2892,0,1,6}-{2611,2917,0,1,6}-{2611,2916,0,1,3}-{2613,2894,0,1,1}-{2614,2892,0,1,6}-{2608,2927,0,1,2}-{2612,2934,0,1,4}-{2609,2930,0,1,0}-{2594,2929,0,1,2}-{2616,2922,0,1,4}-{2593,2911,0,1,1}-{2617,2911,0,1,1}-{2602,2900,0,1,3}-{2601,2886,0,1,6}-{2587,2897,0,1,4}-{2612,2936,0,1,3}-{2606,2929,0,1,5}-{2615,2930,0,1,3}-{2576,2896,0,1,1}-{2588,2879,0,1,6}-{2593,2880,0,1,7}-{2583,2886,0,1,5}-{2609,2897,0,1,3}-{2608,2905,0,1,2}-{2606,2917,0,1,4}-{2604,2918,0,1,4}-{2613,2890,0,1,5}-{2608,2921,0,1,6}-{2604,2886,0,1,6}-{2602,2920,0,1,1}-{2607,2932,0,1,6}-{2578,2885,0,1,1}" + }, + { + "npc_id": "5076", + "loc_data": "{2310,3581,0,1,2}-{2314,3580,0,1,2}-{2311,3583,0,1,2}-{2304,3588,0,1,6}-{2305,3601,0,1,7}-{2341,3610,0,1,7}-{2344,3606,0,1,3}-{2340,3603,0,1,4}-{2348,3591,0,1,1}-{2356,3595,0,1,6}-{2361,3595,0,1,1}-{2359,3589,0,1,4}-{2346,3585,0,1,6}-{2360,3584,0,1,7}" + }, + { + "npc_id": "5077", + "loc_data": "{2558,2911,0,0,0}-{2558,2913,0,0,0}-{2556,2913,0,0,0}-{2557,2912,0,0,0}-{2560,2911,0,0,0}-{2559,2910,0,0,0}-{2559,2909,0,0,0}-{2559,2917,0,0,0}-{2558,2914,0,0,0}-{2559,2915,0,0,0}-{2558,2916,0,0,0}-{2559,2932,0,0,0}-{2559,2928,0,0,0}-{2558,2928,0,0,0}-{2558,2931,0,0,0}-{2558,2929,0,0,0}-{2556,2911,0,0,0}-{2557,2911,0,0,0}-{2556,2910,0,0,0}-{2556,2912,0,0,0}-{2557,2919,0,0,0}-{2556,2914,0,0,0}-{2556,2913,0,0,0}-{2556,2918,0,0,0}-{2556,2929,0,0,0}-{2557,2933,0,0,0}-{2556,2932,0,0,0}-{2557,2932,0,0,0}-{2557,2928,0,0,0}-{2559,2934,0,0,0}-{2554,2911,0,0,0}-{2555,2911,0,0,0}-{2554,2912,0,0,0}-{2555,2915,0,0,0}-{2555,2919,0,0,0}-{2554,2919,0,0,0}-{2554,2913,0,0,0}-{2556,2915,0,0,0}-{2555,2931,0,0,0}-{2554,2933,0,0,0}-{2555,2934,0,0,0}-{2555,2933,0,0,0}-{2555,2932,0,0,0}-{2554,2935,0,0,0}-{2554,2934,0,0,0}-{2556,2936,0,0,0}-{2558,2936,0,0,0}-{2554,2936,0,0,0}-{2553,2935,0,0,0}-{2556,2933,0,0,0}-{2558,2938,0,0,0}-{2556,2938,0,0,0}-{2557,2937,0,0,0}-{2557,2917,0,0,0}-{2555,2917,0,0,0}-{2555,2912,0,0,0}-{2555,2935,0,0,0}-{2547,2940,0,0,0}-{2546,2939,0,0,0}-{2548,2939,0,0,0}-{2557,2930,0,0,0}-{2556,2929,0,0,0}-{2546,2941,0,0,0}-{2548,2941,0,0,0}-{2557,2931,0,0,0}-{2556,2935,0,0,0}-{2555,2936,0,0,0}-{2553,2935,0,0,0}-{2559,2930,0,0,0}-{2547,2940,0,0,0}-{2509,2910,0,0,0}-{2507,2910,0,0,0}-{2509,2908,0,0,0}-{2508,2908,0,0,0}-{2508,2909,0,0,0}-{2510,2908,0,0,0}-{2506,2906,0,0,0}-{2508,2906,0,0,0}-{2507,2906,0,0,0}-{2507,2905,0,0,0}-{2509,2905,0,0,0}-{2505,2907,0,0,0}-{2504,2908,0,0,0}-{2467,2879,0,0,0}-{2484,2877,0,0,0}-{2485,2876,0,0,0}-{2511,2908,0,0,0}-{2504,2906,0,0,0}-{2508,2907,0,0,0}-{2509,2906,0,0,0}-{2508,2909,0,0,0}-{2506,2906,0,0,0}-{2510,2907,0,0,0}-{2503,2907,0,0,0}-{2509,2908,0,0,0}-{2507,2908,0,0,0}-{2508,2906,0,0,0}-{2505,2907,0,0,0}-{2507,2905,0,0,0}-{2506,2904,0,0,0}-{2505,2903,0,0,0}-{2508,2902,0,0,0}-{2504,2901,0,0,0}-{2506,2907,0,0,0}-{2507,2906,0,0,0}-{2524,2898,0,0,0}-{2524,2896,0,0,0}-{2525,2897,0,0,0}-{2521,2895,0,0,0}-{2525,2895,0,0,0}-{2507,2903,0,0,0}-{2526,2898,0,0,0}-{2507,2889,0,0,0}-{2506,2903,0,0,0}-{2503,2905,0,0,0}-{2507,2905,0,0,0}-{2511,2908,0,0,0}-{2507,2887,0,0,0}-{2554,2937,0,0,0}-{2558,2938,0,0,0}-{2557,2937,0,0,0}-{2556,2938,0,0,0}-{2553,2937,0,0,0}-{2556,2937,0,0,0}-{2553,2935,0,0,0}-{2556,2935,0,0,0}-{2558,2936,0,0,0}-{2555,2936,0,0,0}-{2552,2936,0,0,0}-{2554,2936,0,0,0}-{2552,2934,0,0,0}-{2553,2934,0,0,0}-{2557,2931,0,0,0}-{2559,2932,0,0,0}-{2558,2932,0,0,0}-{2556,2936,0,0,0}-{2553,2936,0,0,0}-{2554,2935,0,0,0}-{2559,2917,0,0,0}-{2556,2916,0,0,0}-{2555,2917,0,0,0}-{2559,2914,0,0,0}-{2557,2915,0,0,0}-{2561,2914,0,0,0}-{2557,2912,0,0,0}-{2559,2912,0,0,0}-{2558,2913,0,0,0}-{2555,2911,0,0,0}-{2554,2910,0,0,0}-{2559,2916,0,0,0}-{2557,2932,0,0,0}-{2557,2909,0,0,0}-{2559,2913,0,0,0}-{2552,2935,0,0,0}-{2512,2864,0,0,0}-{2560,2909,0,0,0}-{2561,2916,0,0,0}-{2559,2909,0,0,0}-{2557,2914,0,0,0}-{2555,2915,0,0,0}-{2527,2896,0,0,0}-{2524,2895,0,0,0}-{2524,2894,0,0,0}-{2525,2896,0,0,0}-{2524,2896,0,0,0}-{2523,2893,0,0,0}-{2523,2896,0,0,0}-{2523,2897,0,0,0}-{2521,2895,0,0,0}-{2521,2893,0,0,0}-{2526,2895,0,0,0}-{2507,2887,0,0,0}-{2507,2890,0,0,0}-{2506,2886,0,0,0}-{2505,2887,0,0,0}-{2505,2888,0,0,0}-{2503,2889,0,0,0}-{2504,2889,0,0,0}-{2504,2903,0,0,0}-{2505,2907,0,0,0}-{2504,2906,0,0,0}-{2505,2905,0,0,0}-{2506,2907,0,0,0}-{2506,2905,0,0,0}-{2506,2906,0,0,0}-{2507,2903,0,0,0}-{2507,2906,0,0,0}-{2507,2907,0,0,0}-{2505,2893,0,0,0}-{2504,2892,0,0,0}-{2508,2909,0,0,0}-{2502,2891,0,0,0}-{2503,2890,0,0,0}-{2503,2891,0,0,0}-{2508,2891,0,0,0}-{2507,2891,0,0,0}-{2507,2890,0,0,0}-{2503,2889,0,0,0}-{2504,2889,0,0,0}-{2505,2888,0,0,0}-{2506,2909,0,0,0}-{2507,2887,0,0,0}-{2505,2887,0,0,0}-{2506,2887,0,0,0}-{2508,2890,0,0,0}-{2504,2894,0,0,0}-{2502,2891,0,0,0}-{2524,2899,0,0,0}-{2524,2898,0,0,0}-{2526,2899,0,0,0}-{2526,2895,0,0,0}-{2526,2900,0,0,0}-{2524,2900,0,0,0}-{2525,2900,0,0,0}-{2525,2899,0,0,0}-{2524,2893,0,0,0}-{2522,2894,0,0,0}-{2521,2895,0,0,0}-{2523,2895,0,0,0}-{2524,2895,0,0,0}-{2506,2886,0,0,0}-{2521,2893,0,0,0}-{2526,2898,0,0,0}-{2524,2899,0,0,0}-{2456,2832,0,0,0}-{2523,2896,0,0,0}-{2522,2894,0,0,0}-{2524,2901,0,0,0}-{2524,2900,0,0,0}-{2523,2895,0,0,0}-{2526,2901,0,0,0}-{2525,2896,0,0,0}-{2526,2900,0,0,0}-{2523,2893,0,0,0}-{2525,2900,0,0,0}-{2524,2898,0,0,0}-{2525,2894,0,0,0}-{2527,2894,0,0,0}-{2524,2899,0,0,0}-{2508,2904,0,0,0}-{2507,2907,0,0,0}-{2506,2902,0,0,0}-{2506,2907,0,0,0}-{2506,2906,0,0,0}-{2503,2907,0,0,0}-{2503,2905,0,0,0}-{2505,2893,0,0,0}-{2503,2891,0,0,0}-{2506,2891,0,0,0}-{2508,2891,0,0,0}-{2506,2892,0,0,0}-{2506,2909,0,0,0}-{2503,2890,0,0,0}-{2503,2889,0,0,0}-{2504,2889,0,0,0}-{2507,2890,0,0,0}-{2505,2887,0,0,0}-{2505,2888,0,0,0}-{2508,2890,0,0,0}-{2507,2905,0,0,0}-{2456,2832,0,0,0}-{2503,2890,0,0,0}-{2503,2891,0,0,0}-{2504,2892,0,0,0}-{2504,2894,0,0,0}-{2506,2887,0,0,0}-{2507,2887,0,0,0}-{2507,2891,0,0,0}-{2504,2889,0,0,0}-{2508,2891,0,0,0}-{2505,2888,0,0,0}-{2506,2894,0,0,0}-{2506,2902,0,0,0}-{2506,2904,0,0,0}-{2506,2886,0,0,0}-{2507,2903,0,0,0}-{2505,2893,0,0,0}-{2506,2891,0,0,0}-{2503,2889,0,0,0}-{2506,2887,0,0,0}-{2506,2892,0,0,0}-{2507,2891,0,0,0}-{2456,2832,0,0,0}-{2456,2832,0,0,0}-{2507,2887,0,0,0}-{2507,2890,0,0,0}-{2503,2905,0,0,0}-{2505,2906,0,0,0}-{2506,2905,0,0,0}-{2506,2906,0,0,0}-{2507,2905,0,0,0}-{2505,2905,0,0,0}-{2504,2906,0,0,0}-{2503,2907,0,0,0}-{2506,2894,0,0,0}-{2507,2908,0,0,0}-{2507,2907,0,0,0}-{2508,2909,0,0,0}-{2505,2888,0,0,0}-{2505,2907,0,0,0}-{2494,2940,0,0,0}-{2495,2940,0,0,0}-{2496,2939,0,0,0}-{2497,2938,0,0,0}-{2498,2942,0,0,0}-{2499,2943,0,0,0}-{2498,2944,0,0,0}-{2500,2942,0,0,0}-{2503,2940,0,0,0}-{2496,2939,0,0,0}-{2502,2939,0,0,0}-{2500,2944,0,0,0}" + }, + { + "npc_id": "5078", + "loc_data": "{2556,2911,0,0,0}-{2560,2909,0,0,0}-{2560,2933,0,0,0}-{2558,2910,0,0,0}-{2558,2909,0,0,0}-{2558,2918,0,0,0}-{2559,2930,0,0,0}-{2557,2915,0,0,0}-{2557,2931,0,0,0}-{2558,2935,0,0,0}-{2555,2936,0,0,0}-{2553,2936,0,0,0}-{2553,2933,0,0,0}-{2553,2934,0,0,0}-{2506,2908,0,0,0}-{2507,2908,0,0,0}-{2510,2906,0,0,0}-{2509,2907,0,0,0}-{2508,2907,0,0,0}-{2506,2904,0,0,0}-{2508,2904,0,0,0}-{2504,2906,0,0,0}-{2467,2878,0,0,0}-{2486,2877,0,0,0}-{2506,2909,0,0,0}-{2508,2904,0,0,0}-{2506,2902,0,0,0}-{2504,2903,0,0,0}-{2504,2902,0,0,0}-{2525,2899,0,0,0}-{2523,2897,0,0,0}-{2522,2897,0,0,0}-{2523,2895,0,0,0}-{2521,2893,0,0,0}-{2523,2893,0,0,0}-{2506,2888,0,0,0}-{2509,2889,0,0,0}-{2505,2889,0,0,0}-{2508,2888,0,0,0}-{2506,2887,0,0,0}-{2505,2887,0,0,0}-{2554,2935,0,0,0}-{2552,2935,0,0,0}-{2557,2934,0,0,0}-{2554,2934,0,0,0}-{2558,2933,0,0,0}-{2559,2931,0,0,0}-{2560,2918,0,0,0}-{2558,2916,0,0,0}-{2557,2917,0,0,0}-{2561,2916,0,0,0}-{2555,2915,0,0,0}-{2557,2914,0,0,0}-{2560,2915,0,0,0}-{2554,2912,0,0,0}-{2556,2912,0,0,0}-{2559,2909,0,0,0}-{2558,2909,0,0,0}-{2527,2894,0,0,0}-{2525,2894,0,0,0}-{2523,2895,0,0,0}-{2522,2894,0,0,0}-{2508,2890,0,0,0}-{2508,2891,0,0,0}-{2503,2905,0,0,0}-{2503,2907,0,0,0}-{2506,2902,0,0,0}-{2506,2904,0,0,0}-{2504,2894,0,0,0}-{2506,2894,0,0,0}-{2506,2892,0,0,0}-{2508,2904,0,0,0}-{2506,2891,0,0,0}-{2524,2901,0,0,0}-{2526,2901,0,0,0}-{2524,2894,0,0,0}-{2525,2894,0,0,0}-{2527,2894,0,0,0}-{2523,2896,0,0,0}-{2525,2896,0,0,0}-{2507,2903,0,0,0}-{2507,2905,0,0,0}-{2505,2902,0,0,0}-{2506,2904,0,0,0}-{2505,2907,0,0,0}-{2506,2905,0,0,0}-{2505,2905,0,0,0}-{2504,2906,0,0,0}-{2506,2894,0,0,0}-{2504,2894,0,0,0}-{2507,2891,0,0,0}-{2507,2887,0,0,0}-{2506,2891,0,0,0}-{2506,2907,0,0,0}-{2495,2938,0,0,0}-{2501,2938,0,0,0}-{2501,2940,0,0,0}-{2503,2938,0,0,0}" + }, + { + "npc_id": "5079", + "loc_data": "{2323,3538,0,1,6}-{2319,3539,0,1,6}-{2321,3545,0,1,5}-{2324,3556,0,1,1}-{2322,3594,0,1,5}-{2323,3594,0,1,1}-{2323,3602,0,1,1}-{2326,3602,0,1,4}-{2324,3622,0,1,1}-{2326,3630,0,1,6}-{2347,3617,0,1,7}-{2341,3615,0,1,3}-{2339,3596,0,1,3}-{2329,3584,0,1,6}-{2337,3589,0,1,5}-{2358,3573,0,1,3}-{2360,3571,0,1,4}-{2371,3560,0,1,3}-{2342,3549,0,1,0}-{2357,3539,0,1,1}-{2357,3537,0,1,4}-{2357,3549,0,1,6}" + }, + { + "npc_id": "5080", + "loc_data": "{2562,2927,0,1,4}-{2557,2915,0,1,3}-{2557,2921,0,1,1}-{2556,2938,0,1,7}-{2551,2930,0,1,6}-{2558,2912,0,1,4}-{2558,2909,0,1,3}-{2557,2932,0,1,6}-{2556,2935,0,1,1}-{2555,2915,0,1,2}-{2553,2935,0,1,4}-{2559,2918,0,1,4}-{2508,2909,0,1,3}-{2466,2878,0,1,6}-{2467,2881,0,1,7}-{2501,2912,0,1,6}-{2507,2907,0,1,1}-{2505,2902,0,1,2}-{2504,2896,0,1,2}-{2522,2895,0,1,3}-{2526,2897,0,1,1}-{2527,2904,0,1,0}-{2507,2889,0,1,4}-{2464,2832,0,1,2}-{2545,2948,0,1,2}-{2553,2935,0,1,1}-{2556,2931,0,1,5}-{2555,2915,0,1,6}-{2559,2911,0,1,4}-{2559,2918,0,1,3}-{2527,2896,0,1,4}-{2533,2896,0,1,5}-{2508,2890,0,1,4}-{2522,2895,0,1,2}-{2490,2877,0,1,1}-{2496,2897,0,1,1}-{2506,2906,0,1,0}-{2506,2894,0,1,3}-{2506,2902,0,1,6}-{2499,2942,0,1,7}-{2496,2936,0,1,4}-{2498,2939,0,1,3}" + }, + { + "npc_id": "5081", + "loc_data": "{2318,3501,0,1,5}-{2316,3502,0,1,6}-{2317,3512,0,1,6}-{2315,3512,0,1,5}-{2312,3504,0,1,1}-{2307,3513,0,1,6}-{2311,3517,0,1,0}-{2320,3517,0,1,1}-{2309,3520,0,1,6}" + }, + { + "npc_id": "5082", + "loc_data": "{2554,2894,0,1,4}-{2538,2897,0,1,6}-{2545,2899,0,1,3}-{2561,2913,0,1,1}-{2559,2908,0,1,6}-{2557,2920,0,1,4}-{2553,2913,0,1,4}-{2544,2910,0,1,2}-{2547,2909,0,1,4}-{2537,2906,0,1,5}-{2525,2914,0,1,3}-{2561,2918,0,1,7}-{2560,2915,0,1,1}-{2555,2920,0,1,6}-{2557,2908,0,1,6}-{2539,2920,0,1,1}-{2528,2915,0,1,4}-{2527,2904,0,1,0}-{2487,2878,0,1,4}-{2518,2901,0,1,5}-{2528,2902,0,1,1}-{2529,2918,0,1,6}-{2566,2881,0,1,7}-{2568,2917,0,1,6}-{2568,2918,0,1,4}-{2557,2915,0,1,7}-{2546,2912,0,1,3}-{2542,2911,0,1,5}-{2548,2910,0,1,6}-{2554,2907,0,1,1}-{2568,2885,0,1,4}-{2548,2896,0,1,5}-{2545,2895,0,1,6}-{2544,2910,0,1,7}-{2536,2895,0,1,3}-{2538,2902,0,1,6}-{2523,2910,0,1,3}-{2533,2910,0,1,2}" + }, + { + "npc_id": "5085", + "loc_data": "{2328,3526,0,0,0}-{2313,3528,0,0,0}-{2312,3542,0,0,0}-{2312,3544,0,0,0}-{2323,3543,0,0,0}-{2325,3544,0,0,0}-{2328,3539,0,0,0}-{2311,3564,0,0,0}-{2332,3548,0,0,0}-{2335,3545,0,0,0}-{2320,3580,0,0,0}-{2325,3582,0,0,0}-{2330,3583,0,0,0}-{2310,3585,0,0,0}-{2324,3584,0,0,0}-{2312,3587,0,0,0}-{2316,3599,0,0,0}-{2324,3599,0,0,0}-{2323,3600,0,0,0}-{2315,3602,0,0,0}-{2309,3605,0,0,0}-{2316,3608,0,0,0}-{2315,3608,0,0,0}-{2325,3614,0,0,0}-{2313,3620,0,0,0}-{2333,3612,0,0,0}-{2331,3608,0,0,0}-{2331,3604,0,0,0}-{2346,3591,0,0,0}-{2355,3573,0,0,0}-{2369,3573,0,0,0}-{2359,3571,0,0,0}-{2352,3567,0,0,0}-{2372,3561,0,0,0}-{2361,3554,0,0,0}-{2329,3561,0,0,0}-{2341,3560,0,0,0}-{2344,3543,0,0,0}-{2342,3539,0,0,0}-{2349,3547,0,0,0}-{2352,3545,0,0,0}-{2334,3522,0,0,0}" + }, + { + "npc_id": "5086", + "loc_data": "{2321,3593,0,1,1}-{2322,3597,0,1,0}-{2309,3603,0,1,5}-{2306,3607,0,1,0}-{2305,3619,0,1,1}-{2309,3618,0,1,6}-{2322,3627,0,1,3}-{2324,3614,0,1,1}-{2323,3614,0,1,1}-{2323,3629,0,1,6}-{2329,3633,0,1,4}-{2328,3634,0,1,3}-{2311,3642,0,1,1}-{2307,3644,0,1,6}-{2318,3645,0,1,1}-{2323,3645,0,1,3}-{2333,3629,0,1,3}-{2340,3641,0,1,7}-{2343,3640,0,1,6}-{2335,3633,0,1,6}" + }, + { + "npc_id": "5087", + "loc_data": "{2706,3776,0,1,4}-{2712,3774,0,1,3}-{2716,3778,0,1,4}-{2715,3772,0,1,3}-{2720,3767,0,1,4}-{2712,3766,0,1,0}-{2718,3767,0,1,7}-{2719,3771,0,1,3}" + }, + { + "npc_id": "5088", + "loc_data": "{2586,2883,0,1,6}-{2589,2909,0,1,1}-{2574,2915,0,1,3}-{2572,2928,0,1,3}-{2567,2932,0,1,6}-{2568,2933,0,1,0}-{2538,2889,0,1,3}-{2538,2902,0,1,4}-{2536,2872,0,1,4}-{2536,2872,0,1,6}-{2536,2872,0,1,4}-{2536,2872,0,1,6}-{2536,2872,0,1,3}-{2585,2884,0,1,5}-{2577,2890,0,1,0}-{2578,2918,0,1,1}-{2536,2864,0,1,7}-{2568,2934,0,1,1}-{2574,2930,0,1,1}-{2576,2928,0,1,4}-{2512,2864,0,1,6}-{2512,2864,0,1,1}-{2580,2889,0,1,1}-{2580,2886,0,1,1}-{2580,2886,0,1,0}-{2572,2900,0,1,4}-{2572,2896,0,1,3}-{2568,2905,0,1,4}" + }, + { + "npc_id": "5089", + "loc_data": "{2315,3523,0,1,1}-{2315,3530,0,1,6}-{2308,3536,0,1,4}-{2307,3538,0,1,1}-{2325,3551,0,1,3}-{2316,3559,0,1,1}-{2312,3559,0,1,1}-{2310,3572,0,1,3}-{2334,3552,0,1,4}-{2308,3582,0,1,2}-{2363,3579,0,1,1}-{2363,3577,0,1,1}-{2350,3568,0,1,1}-{2352,3561,0,1,1}-{2346,3547,0,1,7}-{2347,3546,0,1,3}-{2363,3541,0,1,1}-{2362,3536,0,1,2}-{2350,3526,0,1,7}-{2350,3521,0,1,4}-{2351,3562,0,1,0}-{2310,3574,0,1,6}" + }, + { + "npc_id": "5093", + "loc_data": "{2375,3607,0,0,0}" + }, + { + "npc_id": "5098", + "loc_data": "{2372,3592,0,1,5}-{2370,3587,0,1,3}-{2371,3586,0,1,6}-{2376,3582,0,1,6}-{2378,3582,0,1,1}-{2383,3582,0,1,5}-{2393,3590,0,1,6}" + }, + { + "npc_id": "5099", + "loc_data": "{2365,3597,0,1,5}-{2369,3588,0,1,4}-{2366,3577,0,1,4}-{2372,3573,0,1,1}-{2377,3584,0,1,1}-{2385,3590,0,1,3}-{2388,3598,0,1,3}" + }, + { + "npc_id": "5100", + "loc_data": "{2369,3579,0,1,5}-{2373,3575,0,1,1}-{2390,3588,0,1,4}" + }, + { + "npc_id": "5103", + "loc_data": "{2733,3777,0,1,6}-{2731,3784,0,1,4}-{2735,3790,0,1,6}-{2741,3783,0,1,2}-{2738,3790,0,1,1}-{2731,3783,0,1,1}-{2724,3791,0,1,4}" + }, + { + "npc_id": "5104", + "loc_data": "{2551,2890,0,0,1}-{2541,2899,0,0,0}-{2564,2896,0,0,4}-{2571,2882,0,1,1}-{2552,2910,0,0,0}-{2573,2900,0,1,3}-{2558,2881,0,0,0}-{2543,2899,0,0,0}-{2545,2925,0,0,0}-{2549,2905,0,1,3}" + }, + { + "npc_id": "5105", + "loc_data": "{2780,3017,0,0,0}-{2766,3013,0,0,0}-{2785,3006,0,0,0}-{2775,2996,0,0,0}" + }, + { + "npc_id": "5109", + "loc_data": "{3443,2902,0,1,3}" + }, + { + "npc_id": "5110", + "loc_data": "{2566,3084,0,1,6}" + }, + { + "npc_id": "5111", + "loc_data": "{2569,3083,0,1,1}" + }, + { + "npc_id": "5113", + "loc_data": "{2525,2916,0,1,5}" + }, + { + "npc_id": "5114", + "loc_data": "{3411,3076,0,1,6}-{3415,3075,0,1,1}-{3406,3093,0,1,3}-{3413,3078,0,1,1}-{3403,3093,0,1,1}-{3412,3081,0,1,3}-{3405,3099,0,1,3}-{3405,3102,0,1,0}-{3406,3098,0,1,4}-{3401,3099,0,1,7}-{3405,3093,0,1,4}-{3404,3085,0,1,5}-{3402,3094,0,1,6}-{3399,3096,0,1,1}-{3405,3088,0,1,3}-{3411,3088,0,1,2}" + }, + { + "npc_id": "5115", + "loc_data": "{2451,3219,0,1,3}-{2448,3221,0,1,3}-{2476,3236,0,1,3}-{2450,3226,0,1,6}-{2474,3239,0,1,0}-{2470,3240,0,1,2}-{2468,3243,0,1,0}-{2455,3219,0,1,6}-{2449,3225,0,1,7}-{2445,3226,0,1,2}-{2467,3241,0,1,1}-{2452,3221,0,1,3}-{2473,3235,0,1,7}-{2472,3241,0,1,4}-{2475,3237,0,1,3}" + }, + { + "npc_id": "5116", + "loc_data": "{3291,3675,0,1,6}-{3293,3678,0,1,1}-{3302,3671,0,1,0}-{3299,3666,0,1,5}-{3319,3662,0,1,2}-{3309,3661,0,1,5}-{3321,3661,0,1,1}-{3298,3672,0,1,0}-{3316,3657,0,1,4}-{3302,3667,0,1,1}-{3302,3666,0,1,3}-{3315,3663,0,1,1}" + }, + { + "npc_id": "5117", + "loc_data": "{3537,3449,0,1,2}-{3535,3447,0,1,6}-{3539,3447,0,1,2}-{3533,3446,0,1,1}-{3549,3439,0,1,4}-{3547,3439,0,1,7}-{3549,3439,0,1,4}" + }, + { + "npc_id": "5120", + "loc_data": "{2326,3488,0,1,0}-{2325,3483,0,1,0}-{2315,3482,0,1,0}-{2336,3491,0,1,0}" + }, + { + "npc_id": "5125", + "loc_data": "{2316,3501,0,0,0}" + }, + { + "npc_id": "5138", + "loc_data": "{2607,3264,0,0,0}" + }, + { + "npc_id": "5139", + "loc_data": "{2607,3260,0,0,0}" + }, + { + "npc_id": "5146", + "loc_data": "{3205,3263,0,0,0}-{2925,3324,0,1,0}" + }, + { + "npc_id": "5147", + "loc_data": "{3207, 3270, 0, 1, 0}" + }, + { + "npc_id": "5148", + "loc_data": "{3229,3347,0,1,1}-{3238,3347,0,1,1}" + }, + { + "npc_id": "5149", + "loc_data": "{3233,3350,0,1,0}" + }, + { + "npc_id": "5156", + "loc_data": "{3203,3262,0,1,5}" + }, + { + "npc_id": "5157", + "loc_data": "{3205,3262,0,1,1}" + }, + { + "npc_id": "5160", + "loc_data": "{3205,3270,0,1,4}-{3249,3345,0,1,5}" + }, + { + "npc_id": "5161", + "loc_data": "{3210,3273,0,1,6}-{3233,3340,0,1,5}-{3241,3344,0,1,3}-{2926,3326,0,1,6}-{2924,3324,0,1,1}" + }, + { + "npc_id": "5164", + "loc_data": "{2410,4456,0,1,1}-{2415,4429,0,1,2}" + }, + { + "npc_id": "5168", + "loc_data": "{3207,3260,0,1,3}-{3197,3268,0,1,1}" + }, + { + "npc_id": "5171", + "loc_data": "{2860,10054,1,0,0}" + }, + { + "npc_id": "5173", + "loc_data": "{2769,3611,0,1,7}-{2768,3607,0,1,6}-{2764,3612,0,1,2}-{2763,3608,0,1,6}-{2762,3611,0,1,4}-{2765,3606,0,1,0}" + }, + { + "npc_id": "5199", + "loc_data": "{3093,3357,0,0,0}" + }, + { + "npc_id": "5200", + "loc_data": "{3099,3369,0,1,1}" + }, + { + "npc_id": "5202", + "loc_data": "{3621,3528,0,1,4}" + }, + { + "npc_id": "5291", + "loc_data": "{3300,2792,0,0,6}-{3282,2807,0,0,6}-{3285,2811,0,0,1}-{3283,2772,0,1,5}-{3281,2771,0,1,7}-{3283,2776,0,1,6}-{3278,2770,0,1,6}" + }, + { + "npc_id": "5298", + "loc_data": "{2499,3286,0,1,6}" + }, + { + "npc_id": "5300", + "loc_data": "{2500,3283,0,1,0}" + }, + { + "npc_id": "5303", + "loc_data": "{2506,3284,0,1,6}" + }, + { + "npc_id": "5310", + "loc_data": "{3212,3682,0,1,0}-{3228,3680,0,1,6}-{3230,3683,0,1,1}-{3234,3692,0,1,5}" + }, + { + "npc_id": "5311", + "loc_data": "{3231,3673,0,1,0}-{3225,3677,0,1,3}-{3229,3689,0,1,4}-{3239,3681,0,1,4}-{3236,3694,0,1,6}" + }, + { + "npc_id": "5312", + "loc_data": "{3210,3667,0,1,4}-{3217,3688,0,1,4}-{3241,3694,0,1,3}" + }, + { + "npc_id": "5313", + "loc_data": "{3224,3686,0,1,5}-{3243,3688,0,1,1}-{3242,3687,0,1,0}" + }, + { + "npc_id": "5314", + "loc_data": "{2588,9491,0,1,3}-{2585,9492,0,1,3}-{2586,9491,0,1,5}-{2591,9492,0,1,3}" + }, + { + "npc_id": "5316", + "loc_data": "{2497,3292,0,1,3}" + }, + { + "npc_id": "5318", + "loc_data": "{2511,3287,0,1,3}" + }, + { + "npc_id": "5323", + "loc_data": "{3221,3693,0,1,6}" + }, + { + "npc_id": "5324", + "loc_data": "{3221,3682,0,1,4}" + }, + { + "npc_id": "5325", + "loc_data": "{3125,3627,0,1,6}-{3232,3698,0,1,7}" + }, + { + "npc_id": "5326", + "loc_data": "{3229,3683,0,1,0}" + }, + { + "npc_id": "5327", + "loc_data": "{3224,3671,0,1,6}" + }, + { + "npc_id": "5332", + "loc_data": "{3102,3571,0,1,3}-{2855,9571,0,1,0}" + }, + { + "npc_id": "5333", + "loc_data": "{3100,3560,0,1,4}-{3108,3545,0,1,2}-{2860,9571,0,1,7}" + }, + { + "npc_id": "5334", + "loc_data": "{3108,3533,0,1,1}-{2860,9569,0,1,6}" + }, + { + "npc_id": "5337", + "loc_data": "{3100,3563,0,1,1}-{2832,9656,0,1,6}-{2846,3250,0,1,7}-{2834,3233,0,1,5}-{3003,10347,0,1,7}-{3003,10350,0,1,6}-{3003,10357,0,1,4}-{2996,10343,0,1,3}-{2993,10346,0,1,4}-{2995,3938,0,1,4}" + }, + { + "npc_id": "5338", + "loc_data": "{3119,3565,0,1,1}-{2838,9648,0,1,5}-{2831,9654,0,1,1}-{2843,3248,0,1,1}-{2840,3240,0,1,3}-{2994,10349,0,1,5}-{2998,10350,0,1,0}-{3003,10350,0,1,4}" + }, + { + "npc_id": "5339", + "loc_data": "{3095,3554,0,1,4}-{2831,9655,0,1,7}-{2844,3239,0,1,0}" + }, + { + "npc_id": "5340", + "loc_data": "{3112,3573,0,1,6}-{2833,9655,0,1,6}-{2848,3246,0,1,3}" + }, + { + "npc_id": "5341", + "loc_data": "{2840,9633,0,1,1}-{2844,9634,0,1,6}-{2842,9637,0,1,3}" + }, + { + "npc_id": "5345", + "loc_data": "{2501,3294,0,1,3}" + }, + { + "npc_id": "5349", + "loc_data": "{3099,3354,1,1,3}" + }, + { + "npc_id": "5350", + "loc_data": "{3116,3367,1,1,3}" + }, + { + "npc_id": "5351", + "loc_data": "{3110,3358,1,1,1}" + }, + { + "npc_id": "5352", + "loc_data": "{3121,3359,1,1,4}" + }, + { + "npc_id": "5355", + "loc_data": "{2873,2950,0,0,0}-{2876,2951,0,0,0}" + }, + { + "npc_id": "5356", + "loc_data": "{2877,2958,0,0,0}" + }, + { + "npc_id": "5357", + "loc_data": "{2876,2958,0,0,0}" + }, + { + "npc_id": "5358", + "loc_data": "{2874,2954,0,0,6}" + }, + { + "npc_id": "5361", + "loc_data": "{3176,5543,0,1,3}-{3191,5542,0,1,4}-{1757,5358,0,1,5}-{1760,5357,0,1,5}-{1755,5352,0,1,5}-{1751,5342,0,1,3}-{1745,5342,0,1,6}-{1739,5342,0,1,3}-{1737,5344,0,1,7}-{1739,5347,0,1,6}-{1740,5350,0,1,5}-{1739,5355,0,1,3}-{1747,5363,0,1,4}-{1749,5363,0,1,4}-{1743,5360,0,1,3}-{1739,5356,0,1,0}-{3175,5543,0,1,2}-{3178,5541,0,1,2}-{3187,5542,0,1,3}-{3192,5545,0,1,2}-{3192,5542,0,1,3}-{3179,5549,0,1,6}-{2386,9745,0,1,1}-{2385,9748,0,1,1}-{2389,9746,0,1,1}-{2390,9751,0,1,1}-{2306,9760,0,1,1}-{2395,9757,0,1,1}-{2397,9756,0,1,1}-{2399,9758,0,1,1}-{2385,9762,0,1,1}-{2382,9759,0,1,1}-{2385,9757,0,1,1}-{2388,9759,0,1,1}-{2393,9768,0,1,1}-{2394,9741,0,1,1}" + }, + { + "npc_id": "5362", + "loc_data": "{1774,5361,0,1,3}-{1776,5350,0,1,3}-{1772,5342,0,1,1}-{1772,5336,0,1,4}-{1778,5328,0,1,7}-{1761,5334,0,1,4}-{1754,5337,0,1,7}-{1749,5331,0,0,1}" + }, + { + "npc_id": "5363", + "loc_data": "{1781,5340,1,1,5}-{1782,5356,1,1,1}-{1767,5343,1,1,6}-{1761,5338,1,1,3}-{1767,5332,1,1,6}-{1757,5326,1,1,7}-{1784,5329,1,1,1}" + }, + { + "npc_id": "5364", + "loc_data": "{1765,5344,0,1,3}" + }, + { + "npc_id": "5365", + "loc_data": "{2354,5191,0,1,4}-{2351,5191,0,1,5}" + }, + { + "npc_id": "5366", + "loc_data": "{2357,5196,0,1,2}-{2356,5188,0,1,4}-{2343,5195,0,1,6}-{2335,5202,0,1,3}-{2323,5211,0,1,1}" + }, + { + "npc_id": "5367", + "loc_data": "{2312,5189,0,1,7}" + }, + { + "npc_id": "5369", + "loc_data": "{2345,5195,0,1,3}-{2264,5136,0,1,1}-{2323,5227,0,1,5}-{2319,5223,0,1,6}" + }, + { + "npc_id": "5370", + "loc_data": "{2347,5195,0,1,3}-{2323,5225,0,1,3}-{2319,5227,0,1,0}-{2323,5227,0,1,3}-{2318,5227,0,1,0}-{2326,5227,0,1,6}" + }, + { + "npc_id": "5371", + "loc_data": "{2356,5204,0,1,1}-{2324,5223,0,1,1}" + }, + { + "npc_id": "5375", + "loc_data": "{2029,5236,0,1,6}-{2031,5235,0,1,1}-{2029,5230,0,1,3}" + }, + { + "npc_id": "5376", + "loc_data": "{2031,5233,0,1,1}" + }, + { + "npc_id": "5377", + "loc_data": "{2004,5189,0,1,3}-{2002,5207,0,1,3}-{2009,5199,0,1,5}-{2004,5203,0,1,6}" + }, + { + "npc_id": "5378", + "loc_data": "{1993,5192,0,1,5}-{1999,5190,0,1,6}-{1989,5187,0,1,4}-{2008,5205,0,1,4}" + }, + { + "npc_id": "5379", + "loc_data": "{1952,5192,0,1,5}-{1995,5240,0,1,5}-{1944,5152,0,1,2}-{2010,5186,0,1,4}-{2023,5190,0,1,1}" + }, + { + "npc_id": "5380", + "loc_data": "{1952,5192,0,1,2}-{2028,5192,0,1,0}" + }, + { + "npc_id": "5383", + "loc_data": "{3194,4569,0,0,0}" + }, + { + "npc_id": "5384", + "loc_data": "{3165,4598,0,0,0}-{3167,4577,0,0,0}" + }, + { + "npc_id": "5385", + "loc_data": "{3191,4595,1,1,1}-{3191,4601,1,1,2}" + }, + { + "npc_id": "5386", + "loc_data": "{3143,4595,0,1,1}-{3145,4598,0,1,3}-{3182,4577,0,1,1}-{3187,4578,0,1,0}-{3158,4589,1,1,7}-{3194,4599,1,1,4}" + }, + { + "npc_id": "5387", + "loc_data": "{3158,4584,0,1,4}-{3159,4577,0,1,6}-{3169,4587,0,1,1}-{3152,4569,1,1,1}" + }, + { + "npc_id": "5388", + "loc_data": "{3156,4567,2,1,0}" + }, + { + "npc_id": "5389", + "loc_data": "{3157,4568,0,1,6}-{3185,4562,0,1,3}" + }, + { + "npc_id": "5390", + "loc_data": "{3182,4562,0,1,3}-{3185,4560,0,1,3}" + }, + { + "npc_id": "5391", + "loc_data": "{3158,4552,0,1,4}-{3163,4569,0,1,1}-{3177,4549,0,1,3}-{3184,4550,0,1,3}-{3158,4560,1,1,4}-{3174,4566,1,1,1}-{3195,4577,1,1,6}" + }, + { + "npc_id": "5393", + "loc_data": "{3146,4596,0,1,1}-{3163,4598,0,1,3}-{3155,4591,1,1,3}" + }, + { + "npc_id": "5394", + "loc_data": "{3167,4589,0,1,6}-{3172,4598,0,1,1}-{2677,9688,0,1,1}-{2676,9679,0,1,4}-{2669,9681,0,1,1}" + }, + { + "npc_id": "5395", + "loc_data": "{3141,4598,0,1,3}-{3170,4592,0,1,6}-{3144,4589,1,1,3}" + }, + { + "npc_id": "5396", + "loc_data": "{3145,4583,1,1,0}" + }, + { + "npc_id": "5397", + "loc_data": "{3155,4583,0,1,3}-{3176,4576,1,1,3}" + }, + { + "npc_id": "5398", + "loc_data": "{3145,4574,1,1,3}-{3182,4586,1,1,3}" + }, + { + "npc_id": "5399", + "loc_data": "{3140,4557,2,1,4}-{3188,4578,2,1,1}" + }, + { + "npc_id": "5400", + "loc_data": "{3175,4579,1,1,6}-{3142,4560,2,1,3}-{3159,4569,2,1,1}" + }, + { + "npc_id": "5401", + "loc_data": "{3151,4573,1,1,4}" + }, + { + "npc_id": "5402", + "loc_data": "{3154,4559,0,1,6}-{3171,4571,1,1,6}-{3179,4586,1,1,1}" + }, + { + "npc_id": "5403", + "loc_data": "{3141,4557,0,1,4}-{3182,4577,2,1,6}" + }, + { + "npc_id": "5404", + "loc_data": "{3143,4555,0,1,4}-{3144,4549,1,1,4}-{3190,4587,1,1,1}-{3186,4576,2,1,3}" + }, + { + "npc_id": "5405", + "loc_data": "{3163,4559,0,1,4}-{3146,4565,1,1,3}-{3195,4582,1,1,6}" + }, + { + "npc_id": "5406", + "loc_data": "{3159,4603,1,1,1}" + }, + { + "npc_id": "5407", + "loc_data": "{3141,4547,1,1,3}" + }, + { + "npc_id": "5408", + "loc_data": "{3170,4559,1,1,4}" + }, + { + "npc_id": "5409", + "loc_data": "{3173,4550,0,1,6}-{3190,4551,0,1,2}" + }, + { + "npc_id": "5410", + "loc_data": "{3190,4561,0,1,5}" + }, + { + "npc_id": "5413", + "loc_data": "{3187,5450,0,1,6}-{3177,5453,0,1,6}" + }, + { + "npc_id": "5414", + "loc_data": "{3176,5454,0,1,3}-{3182,5447,0,1,3}" + }, + { + "npc_id": "5423", + "loc_data": "{3212,3263,0,0,0}" + }, + { + "npc_id": "5439", + "loc_data": "{3017,3277,0,0,0}" + }, + { + "npc_id": "5445", + "loc_data": "{2596,3269,0,1,4}-{2571,3907,0,1,7}-{2571,3907,0,1,3}-{2569,3908,0,1,3}-{2571,3908,0,1,3}-{2572,3906,0,1,6}" + }, + { + "npc_id": "5478", + "loc_data": "{2407,3803,0,1,3}" + }, + { + "npc_id": "5479", + "loc_data": "{2407,3803,0,1,3}" + }, + { + "npc_id": "5480", + "loc_data": "{2406,3803,0,1,3}" + }, + { + "npc_id": "5483", + "loc_data": "{2395,3796,0,1,2}" + }, + { + "npc_id": "5484", + "loc_data": "{2418,3816,0,1,3}" + }, + { + "npc_id": "5485", + "loc_data": "{2393,3796,0,1,2}" + }, + { + "npc_id": "5486", + "loc_data": "{2396,3805,0,1,3}" + }, + { + "npc_id": "5487", + "loc_data": "{2417,3815,0,1,3}" + }, + { + "npc_id": "5488", + "loc_data": "{2416,3800,0,0,0}" + }, + { + "npc_id": "5489", + "loc_data": "{2372,3801,2,0,3}" + }, + { + "npc_id": "5490", + "loc_data": "{2364,3800,2,0,4}" + }, + { + "npc_id": "5493", + "loc_data": "{2391,3800,0,1,5}" + }, + { + "npc_id": "5494", + "loc_data": "{2416,3808,0,1,5}" + }, + { + "npc_id": "5495", + "loc_data": "{2406,3813,0,1,3}" + }, + { + "npc_id": "5496", + "loc_data": "{2402,3800,0,1,4}" + }, + { + "npc_id": "5499", + "loc_data": "{2403,3807,0,1,4}" + }, + { + "npc_id": "5500", + "loc_data": "{2395,3812,0,2,2}" + }, + { + "npc_id": "5501", + "loc_data": "{2408,3816,0,1,3}" + }, + { + "npc_id": "5502", + "loc_data": "{2409,3814,0,1,3}" + }, + { + "npc_id": "5504", + "loc_data": "{2336,3799,0,0,4}" + }, + { + "npc_id": "5505", + "loc_data": "{2334,3800,0,0,4}" + }, + { + "npc_id": "5506", + "loc_data": "{2334,3798,0,0,4}" + }, + { + "npc_id": "5507", + "loc_data": "{2311,3781,0,0,1}" + }, + { + "npc_id": "5508", + "loc_data": "{2646,3710,0,0,4}" + }, + { + "npc_id": "5509", + "loc_data": "{2336,3808,0,0,6}" + }, + { + "npc_id": "5510", + "loc_data": "{2333,3804,0,1,1}" + }, + { + "npc_id": "5511", + "loc_data": "{2327,3794,0,1,6}" + }, + { + "npc_id": "5512", + "loc_data": "{2319,3795,0,1,3}" + }, + { + "npc_id": "5513", + "loc_data": "{2352,3797,0,1,2}" + }, + { + "npc_id": "5514", + "loc_data": "{2333,3795,1,1,4}" + }, + { + "npc_id": "5515", + "loc_data": "{2330,3799,1,1,3}" + }, + { + "npc_id": "5516", + "loc_data": "{2329,3808,1,1,4}" + }, + { + "npc_id": "5518", + "loc_data": "{2338,3798,0,0,1}" + }, + { + "npc_id": "5519", + "loc_data": "{2338,3800,0,0,6}" + }, + { + "npc_id": "5520", + "loc_data": "{2338,3810,0,0,3}" + }, + { + "npc_id": "5529", + "loc_data": "{2323,3790,0,1,1}-{2323,3795,0,1,0}-{2322,3795,0,1,0}-{2317,3794,0,1,6}-{2317,3790,0,1,3}-{2321,3792,0,1,6}-{2327,3796,0,1,7}-{2319,3791,0,1,6}" + }, + { + "npc_id": "5531", + "loc_data": "{3323,3138,1,1,6}" + }, + { + "npc_id": "5532", + "loc_data": "{3320,3138,0,1,3}" + }, + { + "npc_id": "5533", + "loc_data": "{2904,5460,0,1,4}" + }, + { + "npc_id": "5534", + "loc_data": "{2900,5455,0,1,1}" + }, + { + "npc_id": "5535", + "loc_data": "{2903,5449,0,1,4}" + }, + { + "npc_id": "5536", + "loc_data": "{2905,5451,0,1,1}" + }, + { + "npc_id": "5537", + "loc_data": "{2905,5457,0,1,4}" + }, + { + "npc_id": "5538", + "loc_data": "{2912,5455,0,1,3}" + }, + { + "npc_id": "5539", + "loc_data": "{2922,5464,0,1,1}" + }, + { + "npc_id": "5540", + "loc_data": "{2924,5462,0,1,4}" + }, + { + "npc_id": "5541", + "loc_data": "{2924,5458,0,1,4}" + }, + { + "npc_id": "5542", + "loc_data": "{2930,5458,0,1,1}" + }, + { + "npc_id": "5544", + "loc_data": "{2931,5469,0,1,3}" + }, + { + "npc_id": "5545", + "loc_data": "{2925,5471,0,1,1}" + }, + { + "npc_id": "5546", + "loc_data": "{2931,5475,0,1,1}" + }, + { + "npc_id": "5547", + "loc_data": "{2907,5486,0,1,6}" + }, + { + "npc_id": "5548", + "loc_data": "{2907,5492,0,1,6}" + }, + { + "npc_id": "5549", + "loc_data": "{2910,5491,0,1,6}" + }, + { + "npc_id": "5550", + "loc_data": "{2915,5483,0,1,1}" + }, + { + "npc_id": "5551", + "loc_data": "{2922,5486,0,1,4}" + }, + { + "npc_id": "5552", + "loc_data": "{2921,5493,0,1,4}" + }, + { + "npc_id": "5553", + "loc_data": "{2899,5468,0,1,4}" + }, + { + "npc_id": "5554", + "loc_data": "{2894,5470,0,1,3}" + }, + { + "npc_id": "5555", + "loc_data": "{2898,5478,0,1,4}" + }, + { + "npc_id": "5556", + "loc_data": "{2896,5482,0,1,3}" + }, + { + "npc_id": "5557", + "loc_data": "{2894,5483,0,1,4}" + }, + { + "npc_id": "5558", + "loc_data": "{2894,5485,0,1,3}" + }, + { + "npc_id": "5562", + "loc_data": "{2913,5462,0,0,0}-{2900,5458,0,0,0}-{2908,5455,0,0,0}-{2910,5455,0,0,0}-{2913,5452,0,0,0}-{2914,5453,0,0,0}" + }, + { + "npc_id": "5563", + "loc_data": "{2911,5474,0,0,0}" + }, + { + "npc_id": "5574", + "loc_data": "{2836,3066,0,0,0}" + }, + { + "npc_id": "5576", + "loc_data": "{3072,3336,0,0,0}-{3063,3348,0,0,0}" + }, + { + "npc_id": "5608", + "loc_data": "{3786,2827,2,0,0}" + }, + { + "npc_id": "5609", + "loc_data": "{3786,2824,1,0,0}" + }, + { + "npc_id": "5610", + "loc_data": "{3785,2827,0,0,0}" + }, + { + "npc_id": "5611", + "loc_data": "{3784,2824,0,0,0}" + }, + { + "npc_id": "5614", + "loc_data": "{3779,2826,0,0,0}-{3789,2817,0,0,0}-{3794,2821,0,0,0}-{3808,2823,0,0,0}-{3812,2861,0,0,0}-{3813,2822,0,0,0}-{3818,2862,0,0,0}-{3819,2870,0,0,0}-{3821,2824,0,0,0}-{3831,2828,0,0,0}" + }, + { + "npc_id": "5627", + "loc_data": "{3808,2845,0,0,0}-{3812,2846,0,0,0}-{3815,2844,0,0,3}-{3819,2839,0,0,0}-{3819,2851,0,0,0}-{3819,2838,1,0,0}-{3823,2836,1,0,0}-{3823,2846,1,0,0}" + }, + { + "npc_id": "5628", + "loc_data": "{3810,2843,0,0,0}-{3813,2844,0,0,0}-{3821,2837,0,0,0}-{3820,2840,1,0,0}-{3820,2851,1,0,0}-{3823,2839,1,0,0}" + }, + { + "npc_id": "5629", + "loc_data": "{3811,2826,0,0,0}" + }, + { + "npc_id": "5631", + "loc_data": "{3827,2833,0,0,0}" + }, + { + "npc_id": "5633", + "loc_data": "{3815,2859,0,0,0}" + }, + { + "npc_id": "5634", + "loc_data": "{3793,2851,0,0,0}" + }, + { + "npc_id": "5635", + "loc_data": "{3784,2843,0,0,0}" + }, + { + "npc_id": "5637", + "loc_data": "{3803,2843,0,0,0}" + }, + { + "npc_id": "5638", + "loc_data": "{3810,2833,0,0,0}" + }, + { + "npc_id": "5639", + "loc_data": "{3824,2857,0,0,0}" + }, + { + "npc_id": "5640", + "loc_data": "{3817,2824,0,0,0}" + }, + { + "npc_id": "5641", + "loc_data": "{3799,2855,0,0,0}" + }, + { + "npc_id": "5642", + "loc_data": "{3796,2858,0,0,0}" + }, + { + "npc_id": "5644", + "loc_data": "{3795,2845,0,0,3}" + }, + { + "npc_id": "5646", + "loc_data": "{3792,2830,0,0,0}" + }, + { + "npc_id": "5647", + "loc_data": "{3803,2872,2,0,0}" + }, + { + "npc_id": "5650", + "loc_data": "{3800,2835,0,0,0}" + }, + { + "npc_id": "5656", + "loc_data": "{3794,2873,1,0,0}" + }, + { + "npc_id": "5658", + "loc_data": "{3804,2873,1,0,0}" + }, + { + "npc_id": "5659", + "loc_data": "{3805,2874,2,0,0}" + }, + { + "npc_id": "5661", + "loc_data": "{3794,2874,3,0,0}" + }, + { + "npc_id": "5665", + "loc_data": "{3803,2848,0,0,0}" + }, + { + "npc_id": "5668", + "loc_data": "{3787,2824,0,0,0}" + }, + { + "npc_id": "5669", + "loc_data": "{3787,2827,0,0,0}" + }, + { + "npc_id": "5670", + "loc_data": "{3786,2827,1,0,0}" + }, + { + "npc_id": "5671", + "loc_data": "{3788,2826,1,0,0}" + }, + { + "npc_id": "5672", + "loc_data": "{3788,2825,2,0,0}" + }, + { + "npc_id": "5750", + "loc_data": "{3290,5544,0,1,4}-{3270,5552,0,1,1}-{3274,5547,0,1,7}" + }, + { + "npc_id": "5752", + "loc_data": "{2711,5331,0,0,0}" + }, + { + "npc_id": "5753", + "loc_data": "{2697,5332,0,0,0}" + }, + { + "npc_id": "5755", + "loc_data": "{2723,5336,0,0,0}" + }, + { + "npc_id": "5756", + "loc_data": "{2702,5352,1,0,0}" + }, + { + "npc_id": "5757", + "loc_data": "{2743,5358,0,0,0}" + }, + { + "npc_id": "5758", + "loc_data": "{2693,5332,0,0,0}-{2729,5329,0,0,0}" + }, + { + "npc_id": "5761", + "loc_data": "{2725,5349,0,0,0}" + }, + { + "npc_id": "5764", + "loc_data": "{2712,5342,0,0,0}" + }, + { + "npc_id": "5765", + "loc_data": "{2694,5333,0,0,0}" + }, + { + "npc_id": "5766", + "loc_data": "{2701,5352,1,0,0}" + }, + { + "npc_id": "5767", + "loc_data": "{2695,5331,0,0,0}-{2719,5331,0,0,0}" + }, + { + "npc_id": "5770", + "loc_data": "{2717,5359,0,0,0}" + }, + { + "npc_id": "5771", + "loc_data": "{2722,5333,0,0,0}" + }, + { + "npc_id": "5772", + "loc_data": "{2716,5359,0,0,0}" + }, + { + "npc_id": "5776", + "loc_data": "{2699,5349,0,0,4}" + }, + { + "npc_id": "5777", + "loc_data": "{2699,5348,0,0,4}" + }, + { + "npc_id": "5780", + "loc_data": "{2722,5313,0,0,0}" + }, + { + "npc_id": "5781", + "loc_data": "{2723,5321,0,0,0}" + }, + { + "npc_id": "5782", + "loc_data": "{2742,5339,1,0,0}" + }, + { + "npc_id": "5783", + "loc_data": "{2701,5348,0,0,0}" + }, + { + "npc_id": "5785", + "loc_data": "{2726,5372,1,0,0}" + }, + { + "npc_id": "5786", + "loc_data": "{2712,5369,1,0,0}" + }, + { + "npc_id": "5787", + "loc_data": "{2704,5366,0,0,0}" + }, + { + "npc_id": "5789", + "loc_data": "{2718,5313,0,0,0}" + }, + { + "npc_id": "5790", + "loc_data": "{2715,5313,0,0,0}" + }, + { + "npc_id": "5794", + "loc_data": "{2712,5321,0,0,0}" + }, + { + "npc_id": "5796", + "loc_data": "{2711,5314,0,0,0}" + }, + { + "npc_id": "5798", + "loc_data": "{2717,5315,0,1,2}" + }, + { + "npc_id": "5799", + "loc_data": "{2730,5365,1,0,0}" + }, + { + "npc_id": "5800", + "loc_data": "{2719,5335,0,1,1}-{2747,5373,0,1,3}" + }, + { + "npc_id": "5801", + "loc_data": "{2730,5333,0,1,2}" + }, + { + "npc_id": "5802", + "loc_data": "{2744,5353,1,0,0}" + }, + { + "npc_id": "5803", + "loc_data": "{2741,5344,1,0,0}" + }, + { + "npc_id": "5804", + "loc_data": "{2744,5333,1,0,0}" + }, + { + "npc_id": "5805", + "loc_data": "{2743,5345,1,0,0}" + }, + { + "npc_id": "5806", + "loc_data": "{2746,5333,1,0,0}" + }, + { + "npc_id": "5807", + "loc_data": "{2741,5334,1,0,0}" + }, + { + "npc_id": "5809", + "loc_data": "{2741,5341,1,0,0}" + }, + { + "npc_id": "5811", + "loc_data": "{2744,5342,1,0,0}" + }, + { + "npc_id": "5813", + "loc_data": "{2742,5338,1,0,0}" + }, + { + "npc_id": "5815", + "loc_data": "{2743,5341,1,0,0}" + }, + { + "npc_id": "5817", + "loc_data": "{2744,5338,1,0,0}" + }, + { + "npc_id": "5819", + "loc_data": "{2744,5336,1,0,0}" + }, + { + "npc_id": "5821", + "loc_data": "{2740,5334,1,0,0}" + }, + { + "npc_id": "5827", + "loc_data": "{2699,5329,0,0,0}-{2699,5335,0,0,0}-{2747,5342,0,0,0}" + }, + { + "npc_id": "5828", + "loc_data": "{2697,5316,0,0,0}" + }, + { + "npc_id": "5832", + "loc_data": "{2730,5366,1,0,0}" + }, + { + "npc_id": "5833", + "loc_data": "{3267,3334,0,1,3}" + }, + { + "npc_id": "5834", + "loc_data": "{3208,3496,0,1,6}" + }, + { + "npc_id": "5837", + "loc_data": "{3285,3468,0,0,4}" + }, + { + "npc_id": "5839", + "loc_data": "{3183,5205,0,0,0}" + }, + { + "npc_id": "5840", + "loc_data": "{3159,5211,0,0,0}" + }, + { + "npc_id": "5841", + "loc_data": "{3176,5215,0,0,0}" + }, + { + "npc_id": "5842", + "loc_data": "{3115,3475,0,1,1}" + }, + { + "npc_id": "5843", + "loc_data": "{3117,3474,0,1,4}" + }, + { + "npc_id": "5844", + "loc_data": "{3113,3473,0,1,7}" + }, + { + "npc_id": "5845", + "loc_data": "{3115,3475,0,1,2}" + }, + { + "npc_id": "5846", + "loc_data": "{3110,3471,0,0,2}" + }, + { + "npc_id": "5847", + "loc_data": "{3115,3476,0,1,6}" + }, + { + "npc_id": "5848", + "loc_data": "{3116,3475,0,1,1}" + }, + { + "npc_id": "5849", + "loc_data": "{3112,3473,0,1,3}" + }, + { + "npc_id": "5850", + "loc_data": "{3115,3476,0,1,4}" + }, + { + "npc_id": "5851", + "loc_data": "{3119,3474,0,1,5}" + }, + { + "npc_id": "5869", + "loc_data": "{2744,5344,0,0,0}" + }, + { + "npc_id": "5887", + "loc_data": "{2737,5351,1,0,0}" + }, + { + "npc_id": "5909", + "loc_data": "{3224,3402,0,1,4}" + }, + { + "npc_id": "5910", + "loc_data": "{3230,3401,0,0,0}-{3284,3491,0,1,1}" + }, + { + "npc_id": "5914", + "loc_data": "{3204,3419,0,0,6}" + }, + { + "npc_id": "5915", + "loc_data": "{3255,3488,1,0,6}" + }, + { + "npc_id": "5916", + "loc_data": "{3250,3429,0,1,5}" + }, + { + "npc_id": "5917", + "loc_data": "{3200,3399,0,1,4}-{3262,3410,0,1,3}-{3176,3431,0,1,5}-{3261,3424,0,1,2}" + }, + { + "npc_id": "5918", + "loc_data": "{3233,3394,0,0,7}-{3271,3399,0,1,3}" + }, + { + "npc_id": "5919", + "loc_data": "{3205,3379,0,1,6}-{3211,3381,0,1,3}-{3172,3430,0,1,2}-{3175,3416,1,1,6}-{3175,3404,1,1,7}" + }, + { + "npc_id": "5920", + "loc_data": "{3211,3378,0,1,0}-{3272,3429,0,1,1}-{3274,3427,0,1,3}-{3220,3461,0,1,3}-{3221,3464,0,1,4}-{3213,3466,0,1,1}-{3214,3461,0,1,5}-{3215,3464,0,1,0}-{3208,3467,0,1,6}-{3209,3460,0,1,4}-{3205,3463,0,1,4}" + }, + { + "npc_id": "5923", + "loc_data": "{3224,3394,1,1,6}" + }, + { + "npc_id": "5924", + "loc_data": "{3227,3396,0,1,1}" + }, + { + "npc_id": "5925", + "loc_data": "{3220,3433,0,1,5}" + }, + { + "npc_id": "5926", + "loc_data": "{3229,3392,0,1,6}-{3184,3386,0,1,4}-{3247,9775,0,1,3}-{3185,3391,0,1,5}-{3240,9770,0,1,4}-{3235,9766,0,1,3}" + }, + { + "npc_id": "5927", + "loc_data": "{3250,9776,0,1,3}" + }, + { + "npc_id": "5928", + "loc_data": "{3249,9772,0,1,5}" + }, + { + "npc_id": "5929", + "loc_data": "{3245,9772,0,1,7}-{3239,9766,0,1,2}" + }, + { + "npc_id": "5930", + "loc_data": "{3257,3454,2,0,0}" + }, + { + "npc_id": "5932", + "loc_data": "{3255,3442,0,0,0}" + }, + { + "npc_id": "5933", + "loc_data": "{3254,3443,0,0,0}" + }, + { + "npc_id": "5934", + "loc_data": "{3259,3443,0,0,0}" + }, + { + "npc_id": "5935", + "loc_data": "{3260,3442,0,0,0}" + }, + { + "npc_id": "5938", + "loc_data": "{3253,3454,0,0,0}" + }, + { + "npc_id": "5939", + "loc_data": "{3253,3453,1,1,0}" + }, + { + "npc_id": "5940", + "loc_data": "{3262,3442,1,1,0}" + }, + { + "npc_id": "5941", + "loc_data": "{3260,3447,0,0,0}" + }, + { + "npc_id": "5943", + "loc_data": "{3263,3441,0,0,0}" + }, + { + "npc_id": "5944", + "loc_data": "{3263,3450,0,0,0}-{1746,4961,0,1,4}-{1761, 4938, 0, 1, 4}-{1761, 4976, 0, 1, 5}" + }, + { + "npc_id": "5946", + "loc_data": "{3261,3455,0,1,0}-{1758,4945,0,1,4}-{1757, 4935, 0, 1, 4}-{1746, 4980, 0, 1, 4}" + }, + { + "npc_id": "5947", + "loc_data": "{3260,3452,0,1,0}-{3261,3451,2,1,0}-{1735,4950,0,1,4}-{1759, 4948, 0, 1, 4}-{1780, 4960, 0, 1, 4}-{1760, 4974, 0, 1, 5}" + }, + { + "npc_id": "5956", + "loc_data": "{2659,2664,0,1,3}" + }, + { + "npc_id": "5984", + "loc_data": "{3263,3452,0,1,0}-{1743,4950,0,1,4}-{1770, 4935, 0, 1, 4}-{1772, 4962, 0, 1, 4}-{1771, 4957, 0, 1, 4}-{1777, 4976, 0, 1, 6}" + }, + { + "npc_id": "5987", + "loc_data": "{2891,3455,0,1,0}" + }, + { + "npc_id": "5991", + "loc_data": "{2966,3466,0,0,0}" + }, + { + "npc_id": "5997", + "loc_data": "{2862,3511,0,0,0}" + }, + { + "npc_id": "5998", + "loc_data": "{2971,3473,0,0,0}" + }, + { + "npc_id": "6026", + "loc_data": "{3489,3490,0,1,3}" + }, + { + "npc_id": "6027", + "loc_data": "{3493,3472,0,1,4}" + }, + { + "npc_id": "6028", + "loc_data": "{3497,3497,0,1,2}" + }, + { + "npc_id": "6030", + "loc_data": "{3496,3476,0,1,2}" + }, + { + "npc_id": "6031", + "loc_data": "{3511,3482,1,0,0}" + }, + { + "npc_id": "6032", + "loc_data": "{3502,3487,0,1,1}" + }, + { + "npc_id": "6033", + "loc_data": "{3484,3478,0,1,4}" + }, + { + "npc_id": "6034", + "loc_data": "{3502,3493,0,1,3}" + }, + { + "npc_id": "6035", + "loc_data": "{3486,3488,0,1,3}" + }, + { + "npc_id": "6036", + "loc_data": "{3499,3474,1,0,0}" + }, + { + "npc_id": "6037", + "loc_data": "{3499,3477,0,1,3}" + }, + { + "npc_id": "6038", + "loc_data": "{3490,3472,1,0,0}" + }, + { + "npc_id": "6039", + "loc_data": "{3483,3495,0,1,4}" + }, + { + "npc_id": "6040", + "loc_data": "{3498,3472,1,0,0}" + }, + { + "npc_id": "6041", + "loc_data": "{3479,3492,0,1,4}" + }, + { + "npc_id": "6042", + "loc_data": "{3479,3498,0,1,4}" + }, + { + "npc_id": "6044", + "loc_data": "{3505,3491,1,0,0}" + }, + { + "npc_id": "6045", + "loc_data": "{3479,3498,1,0,0}" + }, + { + "npc_id": "6046", + "loc_data": "{2835,3509,0,0,1}-{3306,5510,0,1,5}-{3309,5543,0,1,6}" + }, + { + "npc_id": "6047", + "loc_data": "{2839,3497,0,1,6}-{2840,3504,0,1,4}" + }, + { + "npc_id": "6050", + "loc_data": "{3291,3081,0,1,7}-{3298,3075,0,1,1}-{3284,3076,0,1,3}-{3266,3072,0,1,1}-{3259,3080,0,1,2}-{3246,3080,0,1,3}-{3252,3069,0,1,1}-{3244,3082,0,1,1}-{3235,3072,0,1,4}-{3242,3059,0,1,7}-{3235,3051,0,1,5}-{3248,3051,0,1,4}-{3257,3055,0,1,3}-{3263,3063,0,1,3}-{3267,3048,0,1,0}-{3253,3040,0,1,6}-{3243,3039,0,1,6}-{3254,3031,0,1,1}-{3243,3035,0,1,5}-{3232,3039,0,1,2}-{3230,3046,0,1,6}-{3219,3033,0,1,3}-{3219,3022,0,1,1}-{3227,3017,0,1,5}-{3235,3012,0,1,4}-{3243,3019,0,1,2}-{3251,3028,0,1,3}" + }, + { + "npc_id": "6051", + "loc_data": "{3292,3069,0,1,1}-{3285,3071,0,1,1}-{3279,3078,0,1,4}-{3273,3065,0,1,3}-{3288,3066,0,1,6}-{3281,3057,0,1,5}-{3294,3056,0,1,5}-{3305,3064,0,1,3}-{3312,3075,0,1,6}-{3306,3086,0,1,4}-{3272,3082,0,1,4}" + }, + { + "npc_id": "6070", + "loc_data": "{2589,4313,0,1,6}" + }, + { + "npc_id": "6072", + "loc_data": "{2426,4442,0,0,0}" + }, + { + "npc_id": "6073", + "loc_data": "{2424,4436,0,0,0}-{2594,4319,0,1,6}" + }, + { + "npc_id": "6074", + "loc_data": "{2603,4306,0,1,4}-{2607,4312,0,1,7}-{2610,4319,0,1,6}-{2613,4326,0,1,5}-{2616,4333,0,1,0}-{2619,4340,0,1,6}-{2614,4344,0,1,3}-{2609,4347,0,1,4}-{2605,4347,0,1,4}-{2599,4345,0,1,3}-{2598,4342,0,1,3}-{2597,4339,0,1,3}-{2596,4336,0,1,3}-{2595,4333,0,1,3}-{2594,4330,0,1,4}-{2587,4330,0,1,3}-{2583,4332,0,1,4}-{2579,4335,0,1,3}-{2576,4339,0,1,4}-{2571,4342,0,1,1}-{2569,4332,0,1,4}-{2572,4326,0,1,6}-{2572,4297,0,1,1}-{2585,4291,0,1,3}-{2599,4297,0,1,4}-{2607,4300,0,1,1}-{2614,4301,0,1,6}-{2619,4305,0,1,0}-{2616,4320,0,1,6}-{2613,4327,0,1,0}-{2611,4335,0,1,6}-{2607,4336,0,1,6}-{2581,4322,0,1,1}-{2578,4315,0,1,6}-{2575,4308,0,1,6}-{2572,4301,0,1,4}-{2567,4295,0,1,3}-{2577,4291,0,1,3}-{2587,4298,0,1,3}-{2595,4307,0,1,3}-{2603,4314,0,1,3}" + }, + { + "npc_id": "6085", + "loc_data": "{3046,3207,1,0,2}" + }, + { + "npc_id": "6088", + "loc_data": "{2932,3253,0,1,4}-{2936,3249,0,1,2}-{2933,3244,0,1,4}-{2927,3247,0,1,5}-{2925,3256,0,1,0}" + }, + { + "npc_id": "6089", + "loc_data": "{2932,3249,0,1,0}-{2929,3253,0,1,3}-{2938,3248,0,1,5}" + }, + { + "npc_id": "6090", + "loc_data": "{2932,3245,0,1,0}-{2934,3246,0,1,3}" + }, + { + "npc_id": "6102", + "loc_data": "{1762,5329,0,1,1}" + }, + { + "npc_id": "6104", + "loc_data": "{1751,5326,0,1,1}" + }, + { + "npc_id": "6105", + "loc_data": "{1767,5355,0,0,6}" + }, + { + "npc_id": "6108", + "loc_data": "{2854,3385,0,1,0}" + }, + { + "npc_id": "6109", + "loc_data": "{2526,3215,0,1,6}-{2545,3231,0,1,4}-{2537,3236,0,1,4}" + }, + { + "npc_id": "6110", + "loc_data": "{2532,3222,0,1,3}-{2533,3209,0,1,4}" + }, + { + "npc_id": "6112", + "loc_data": "{3238,3247,0,1,0}" + }, + { + "npc_id": "6113", + "loc_data": "{3232,3280,0,1,4}-{3222,3289,0,1,1}" + }, + { + "npc_id": "6114", + "loc_data": "{3232,3283,0,1,1}" + }, + { + "npc_id": "6115", + "loc_data": "{3033,3236,0,1,3}-{3041,3237,0,1,6}-{3035,3234,0,1,7}-{3028,3205,0,1,4}-{3019,3202,0,1,6}-{3026,3203,0,1,1}" + }, + { + "npc_id": "6116", + "loc_data": "{3030,3244,0,1,0}-{3025,3203,0,1,3}-{3034,3204,0,1,4}" + }, + { + "npc_id": "6135", + "loc_data": "{3254,3427,0,1,1}" + }, + { + "npc_id": "6136", + "loc_data": "{3077,3250,0,1,0}" + }, + { + "npc_id": "6137", + "loc_data": "{2952,3381,0,1,0}" + }, + { + "npc_id": "6138", + "loc_data": "{2665,3311,0,0,0}" + }, + { + "npc_id": "6139", + "loc_data": "{2734,3484,0,1,1}" + }, + { + "npc_id": "6140", + "loc_data": "{2644,2641,0,0,6}" + }, + { + "npc_id": "6141", + "loc_data": "{2638,2656,0,0,0}" + }, + { + "npc_id": "6166", + "loc_data": "{1904,4279,0,0,0}" + }, + { + "npc_id": "6167", + "loc_data": "{1906,4277,0,0,0}" + }, + { + "npc_id": "6168", + "loc_data": "{1904,4274,0,0,0}" + }, + { + "npc_id": "6188", + "loc_data": "{1901,4271,0,0,0}-{1909,4271,0,0,0}" + }, + { + "npc_id": "6189", + "loc_data": "{3016,3516,0,1,7}" + }, + { + "npc_id": "6190", + "loc_data": "{1906,4270,0,1,0}" + }, + { + "npc_id": "6200", + "loc_data": "{2947,3366,0,0,1}-{2949,3366,0,0,1}-{2946,3366,0,0,1}-{2948,3366,0,0,1}-{3010,3353,0,0,1}-{3011,3353,0,0,1}-{3012,3353,0,0,1}-{3013,3353,0,0,1}-{3014,3353,0,0,1}-{3015, 3353, 0, 0, 1}-{2945, 3366, 0, 0, 1}" + }, + { + "npc_id": "6202", + "loc_data": "{2912,3749,0,0,0}" + }, + { + "npc_id": "6203", + "loc_data": "{2924,5322,2,1,4}" + }, + { + "npc_id": "6205", + "loc_data": "{2933,5329,2,1,1}" + }, + { + "npc_id": "6210", + "loc_data": "{2927,5340,2,1,3}-{2884,5325,2,1,3}-{2837,5336,2,1,4}-{2876,5326,2,1,4}-{2898,5306,2,1,5}-{2886,5325,2,1,1}-{2838,5336,2,1,4}-{2919,5345,2,1,5}" + }, + { + "npc_id": "6211", + "loc_data": "{2920,5353,2,1,4}-{2902,5357,2,1,4}-{2885,5315,2,1,4}-{2898,5313,2,1,2}-{2908,5354,2,1,2}-{2924,5354,2,1,6}-{2925,5352,2,1,3}-{2928,5355,2,1,6}" + }, + { + "npc_id": "6212", + "loc_data": "{2920,5339,2,1,1}-{2836,5289,2,1,0}-{2869,5287,2,1,1}-{2867,5333,2,1,0}-{2921,5293,1,1,6}-{2877,5321,2,1,1}-{2888,5326,2,1,3}-{2872,5318,2,1,2}-{2894,5286,2,1,7}-{2896,5312,2,1,4}-{2894,5322,2,1,3}-{2836,5349,2,1,2}-{2858,5267,2,1,6}" + }, + { + "npc_id": "6213", + "loc_data": "{2894,5353,2,1,0}-{2838,5347,2,1,6}-{2872,5318,2,1,4}-{2875,5313,2,1,4}-{2865,5327,2,1,4}-{2886,5293,2,1,5}-{2909,5297,2,1,0}-{2919,5293,3,1,4}-{2843,5352,2,1,4}-{2908,5346,2,1,6}-{2913,5355,2,1,3}-{2916,5345,2,1,1}-{2919,5349,2,1,2}-{2922,5356,2,1,1}-{2927,5354,2,1,6}-{2928,5350,2,1,4}-{2931,5357,2,1,3}-{2911,5338,2,1,6}-{2925,5295,3,1,0}-{2862,5290,2,1,1}-{2919,5293,1,1,5}" + }, + { + "npc_id": "6214", + "loc_data": "{2919,5284,1,1,0}-{2862,5292,2,1,7}-{2864,5319,2,1,7}-{2828,5337,2,1,6}-{2878,5327,2,1,4}-{2884,5312,2,1,2}-{2883,5320,2,1,0}-{2895,5309,2,1,6}-{2853,5327,2,1,4}-{2854,5345,2,1,2}-{2861,5292,2,1,4}-{2881,5291,2,1,1}-{2892,5328,2,1,1}-{2828,5331,2,1,1}-{2924,5292,3,1,6}-{2918,5281,1,1,1}-{2918,5280,1,1,1}" + }, + { + "npc_id": "6215", + "loc_data": "{2926,5345,2,1,7}-{2888,5361,2,1,5}-{2856,5349,2,1,1}-{2839,5275,2,1,5}-{2880,5293,2,1,4}-{2886,5313,2,1,3}-{2862,5334,2,1,0}-{2881,5320,2,1,3}-{2886,5325,2,1,2}-{2862,5337,2,1,4}-{2845,5286,2,1,0}-{2889,5322,2,1,4}-{2919,5359,2,1,0}-{2855,5352,2,1,1}-{2923,5357,2,1,6}-{2891,5353,2,1,1}-{2832,5288,2,1,6}" + }, + { + "npc_id": "6216", + "loc_data": "{2888,5290,2,1,1}-{2865,5306,2,1,3}-{2871,5312,2,1,3}-{2867,5304,2,1,6}-{2871,5281,2,1,1}-{2864,5279,2,1,4}" + }, + { + "npc_id": "6217", + "loc_data": "{2884,5307,2,1,0}-{2899,5304,2,1,3}-{2915,5270,0,1,5}" + }, + { + "npc_id": "6218", + "loc_data": "{2906,5347,2,1,6}-{2913,5358,2,1,6}-{2856,5267,2,1,7}-{2911,5268,0,1,4}-{2887,5318,2,1,4}-{2888,5314,2,1,6}-{2859,5328,2,1,6}-{2861,5294,2,1,0}-{2931,5345,2,1,2}-{2903,5353,2,1,4}-{2836,5290,2,1,6}-{2907,5346,2,1,6}-{2921,5351,2,1,2}-{2858,5266,2,1,1}-{2916,5269,0,1,1}-{3044,5347,0,1,2}-{3041,5347,0,1,0}-{3031,5346,0,1,2}-{3023,5346,0,1,6}-{3038,5333,0,1,3}-{3048,5333,0,1,1}-{3054,5345,0,1,3}-{3043,5360,0,1,3}-{3030,5362,0,1,3}-{3040,5341,0,1,4}" + }, + { + "npc_id": "6219", + "loc_data": "{2915,5340,2,1,6}" + }, + { + "npc_id": "6220", + "loc_data": "{2931,5356,2,1,3}-{2846,5286,2,1,5}-{2937,5351,2,1,3}-{2848,5268,2,1,4}" + }, + { + "npc_id": "6221", + "loc_data": "{2906,5354,2,1,7}-{2886,5354,2,1,5}-{2885,5352,2,1,2}-{2901,5362,2,1,1}-{2914,5344,2,1,3}-{2918,5343,2,1,2}-{2918,5361,2,1,0}-{2923,5345,2,1,3}-{2924,5352,2,1,4}" + }, + { + "npc_id": "6222", + "loc_data": "{2831,5301,2,1,4}" + }, + { + "npc_id": "6229", + "loc_data": "{2841,5285,2,1,3}-{2841,5289,2,1,1}-{2856,5264,2,1,5}-{2842,5282,2,1,6}" + }, + { + "npc_id": "6230", + "loc_data": "{2843,5265,2,1,4}-{2851,5273,2,1,3}-{2846,5262,2,1,4}" + }, + { + "npc_id": "6231", + "loc_data": "{2870,5265,2,1,0}-{2869,5266,2,1,7}-{2855,5273,2,1,2}-{2840,5263,2,1,3}-{2831,5285,2,1,4}" + }, + { + "npc_id": "6232", + "loc_data": "{2872,5261,2,1,4}-{2863,5308,2,1,1}-{2872,5288,2,1,4}" + }, + { + "npc_id": "6233", + "loc_data": "{2861,5261,2,1,0}-{2852,5264,2,1,0}-{2865,5263,2,1,6}" + }, + { + "npc_id": "6234", + "loc_data": "{2862,5313,2,1,3}-{2839,5293,2,1,0}-{2842,5264,2,1,4}" + }, + { + "npc_id": "6235", + "loc_data": "{2864,5270,2,1,3}-{2869,5314,2,1,3}-{2859,5303,2,1,4}-{2863,5293,2,1,7}-{2862,5286,2,1,1}" + }, + { + "npc_id": "6236", + "loc_data": "{2854,5271,2,1,6}-{2872,5267,2,1,0}-{2858,5269,2,1,5}" + }, + { + "npc_id": "6237", + "loc_data": "{2840,5290,2,1,6}-{2841,5269,2,1,7}-{2833,5292,2,1,3}" + }, + { + "npc_id": "6238", + "loc_data": "{2874,5308,2,1,3}-{2851,5276,2,1,2}-{2864,5268,2,1,2}" + }, + { + "npc_id": "6239", + "loc_data": "{2875,5298,2,1,4}-{2846,5288,2,1,0}-{2845,5281,2,1,1}-{2824,5216,2,1,7}" + }, + { + "npc_id": "6240", + "loc_data": "{2837,5269,2,1,2}-{2860,5300,2,1,1}-{2852,5311,2,1,4}-{2879,5286,2,1,5}" + }, + { + "npc_id": "6241", + "loc_data": "{2863,5272,2,1,6}-{2850,5269,2,1,7}" + }, + { + "npc_id": "6242", + "loc_data": "{2836,5272,2,1,1}" + }, + { + "npc_id": "6243", + "loc_data": "{2848,5275,2,1,0}-{2869,5304,2,1,4}-{2850,5292,2,1,1}-{2857,5300,2,1,3}-{2874,5287,2,1,4}" + }, + { + "npc_id": "6244", + "loc_data": "{2847,5299,2,1,6}-{2844,5283,2,1,6}" + }, + { + "npc_id": "6245", + "loc_data": "{2861,5299,2,1,4}-{2833,5290,2,1,1}-{2851,5262,2,1,0}" + }, + { + "npc_id": "6246", + "loc_data": "{2855,5311,2,1,1}-{2872,5299,2,1,0}-{2872,5315,2,1,1}-{2856,5284,2,1,4}" + }, + { + "npc_id": "6247", + "loc_data": "{2894,5265,0,1,2}" + }, + { + "npc_id": "6254", + "loc_data": "{2917,5272,0,1,7}-{2898,5295,2,1,4}-{2881,5283,2,1,1}-{2883,5311,2,1,2}-{2894,5301,2,1,3}-{2882,5284,2,1,5}-{2890,5292,2,1,4}-{2896,5296,2,1,2}-{2905,5299,2,1,3}-{2905,5301,2,1,5}-{2921,5283,3,1,1}-{2925,5292,3,1,7}-{2906,5299,0,1,6}-{2910,5297,0,1,6}-{2915,5270,0,1,2}-{2910,5269,0,1,5}" + }, + { + "npc_id": "6255", + "loc_data": "{2922,5290,1,1,5}-{2880,5304,2,1,1}-{2884,5311,2,1,2}-{2885,5311,2,1,2}-{2887,5312,2,1,1}-{2886,5313,2,1,0}-{2895,5310,2,1,1}-{2884,5280,2,1,3}-{2885,5293,2,1,6}-{2886,5291,2,1,6}-{2894,5285,2,1,3}-{2893,5286,2,1,7}-{2905,5292,2,1,4}-{2908,5297,2,1,4}-{2910,5297,2,1,6}-{2897,5308,2,1,4}-{2919,5299,3,1,1}-{2921,5292,3,1,5}-{2924,5288,3,1,0}-{2925,5287,3,1,1}-{2908,5300,0,1,6}-{2907,5294,0,1,6}-{2923,5293,1,1,5}-{2919,5298,1,1,1}-{2922,5291,1,1,6}-{2917,5285,1,1,0}-{2905,5295,0,1,6}" + }, + { + "npc_id": "6256", + "loc_data": "{2922,5285,1,1,0}-{2886,5295,2,1,1}-{2891,5300,2,1,1}-{2889,5310,2,1,2}-{2887,5299,2,1,6}-{2891,5297,2,1,3}-{2884,5283,2,1,3}-{2885,5286,2,1,3}-{2886,5294,2,1,1}-{2896,5286,2,1,4}-{2908,5302,2,1,1}-{2919,5290,3,1,1}-{2923,5298,3,1,4}-{2924,5298,3,1,4}-{2911,5298,0,1,6}-{2919,5293,1,1,1}-{2917,5294,1,1,2}-{2923,5284,1,1,1}-{2916,5267,0,1,2}" + }, + { + "npc_id": "6257", + "loc_data": "{2913,5267,0,1,6}-{2892,5291,2,1,4}-{2895,5313,2,1,6}-{2879,5329,2,1,5}-{2886,5311,2,1,0}-{2888,5305,2,1,3}-{2877,5293,2,1,5}-{2894,5284,2,1,0}-{2900,5287,2,1,0}-{2905,5302,2,1,1}-{2898,5307,2,1,6}-{2918,5292,3,1,3}-{2924,5286,3,1,0}-{2924,5292,3,1,1}-{2924,5297,3,1,3}-{2926,5285,3,1,1}-{2921,5289,1,1,6}-{2923,5294,1,1,0}-{2922,5285,1,1,3}-{2915,5273,0,1,7}-{2915,5271,0,1,4}" + }, + { + "npc_id": "6258", + "loc_data": "{2918,5289,1,1,6}-{2884,5287,2,1,0}-{2895,5294,2,1,4}-{2897,5307,2,1,7}-{2918,5298,3,1,5}-{2917,5291,1,1,4}-{2916,5269,0,1,2}" + }, + { + "npc_id": "6259", + "loc_data": "{2890,5304,2,1,7}-{2886,5299,2,1,3}-{2891,5297,2,1,5}-{2890,5291,2,1,3}-{2900,5286,2,1,7}-{2905,5303,2,1,1}-{2918,5282,3,1,6}-{2924,5295,3,1,2}-{2905,5297,0,1,6}-{2920,5291,1,1,5}-{2930,5290,0,1,6}" + }, + { + "npc_id": "6260", + "loc_data": "{2870,5359,2,1,4}" + }, + { + "npc_id": "6262", + "loc_data": "{2873,5356,0,1,1}-{2866,5358,2,1,6}" + }, + { + "npc_id": "6264", + "loc_data": "{2870,5354,2,1,4}" + }, + { + "npc_id": "6266", + "loc_data": "{2868,5362,2,1,3}" + }, + { + "npc_id": "6268", + "loc_data": "{2856,5355,2,1,7}-{2838,5358,2,1,2}-{2841,5319,2,1,7}-{2856,5331,2,1,2}-{2854,5325,2,1,2}-{2873,5323,2,1,6}-{2860,5321,2,1,7}-{2868,5334,2,1,0}-{2856,5328,2,1,6}-{2855,5332,2,1,1}-{2845,5339,2,1,5}-{2831,5320,2,1,3}-{2847,5334,2,1,1}-{2858,5349,2,1,2}-{2829,5339,2,1,6}-{2856,5361,2,1,5}-{2839,5360,2,1,6}" + }, + { + "npc_id": "6269", + "loc_data": "{2846,5351,2,1,3}-{2846,5339,2,1,2}-{2840,5327,2,1,1}-{2836,5345,2,1,7}-{2834,5328,2,1,2}-{2857,5359,2,1,4}-{2846,5357,2,1,3}" + }, + { + "npc_id": "6270", + "loc_data": "{2845,5336,2,1,2}-{2848,5344,2,1,6}-{2842,5328,2,1,6}-{2844,5349,2,1,2}-{2836,5323,2,1,4}-{2832,5353,2,1,6}-{2848,5358,2,1,7}" + }, + { + "npc_id": "6271", + "loc_data": "{2840,5330,2,1,0}-{2859,5328,2,1,6}-{2873,5317,2,1,3}-{2862,5332,2,1,2}-{2869,5332,2,1,6}" + }, + { + "npc_id": "6272", + "loc_data": "{2838,5326,2,1,4}-{2870,5313,2,1,1}-{2865,5332,2,1,0}-{2838,5334,2,1,6}-{2837,5353,2,1,7}" + }, + { + "npc_id": "6273", + "loc_data": "{2832,5324,2,1,7}-{2864,5325,2,1,2}-{2873,5325,2,1,7}-{2873,5324,2,1,7}-{2865,5336,2,1,6}-{2840,5333,2,1,6}-{2836,5336,2,1,4}-{2838,5354,2,1,6}" + }, + { + "npc_id": "6274", + "loc_data": "{2858,5325,2,1,4}-{2873,5319,2,1,6}-{2872,5307,2,1,5}-{2867,5333,2,1,6}-{2866,5333,2,1,0}-{2839,5331,2,1,5}-{2837,5355,2,1,6}" + }, + { + "npc_id": "6275", + "loc_data": "{2865,5340,2,1,1}-{2869,5326,2,1,7}-{2875,5318,2,1,1}-{2875,5314,2,1,1}-{2878,5313,2,1,3}-{2879,5322,2,1,3}-{2859,5317,2,1,6}-{2858,5319,2,1,4}-{2878,5320,2,1,0}-{2863,5337,2,1,7}-{2862,5338,2,1,7}-{2867,5341,2,1,6}-{2852,5312,2,1,2}" + }, + { + "npc_id": "6276", + "loc_data": "{2856,5360,2,1,7}-{2854,5346,2,1,3}-{2845,5332,2,1,0}-{2845,5344,2,1,3}-{2848,5349,2,1,6}-{2837,5347,2,1,3}-{2835,5324,2,1,2}-{2835,5321,2,1,5}-{2858,5349,2,1,4}-{2830,5339,2,1,3}-{2828,5332,2,1,3}-{2846,5358,2,1,4}-{2855,5356,2,1,7}" + }, + { + "npc_id": "6277", + "loc_data": "{2843,5341,2,1,3}-{2843,5331,2,1,3}-{2847,5341,2,1,5}-{2852,5350,2,1,1}-{2844,5341,2,1,6}-{2843,5347,2,1,1}-{2836,5325,2,1,6}-{2826,5335,2,1,2}-{2837,5351,2,1,4}-{2845,5353,2,1,3}-{2840,5361,2,1,3}" + }, + { + "npc_id": "6278", + "loc_data": "{2845,5359,2,1,4}-{2830,5318,2,1,3}-{2848,5342,2,1,0}-{2846,5332,2,1,1}-{2843,5320,2,1,3}-{2838,5329,2,1,1}-{2855,5349,2,1,0}-{2837,5342,2,1,1}-{2792,5280,2,1,6}-{2827,5331,2,1,6}-{2830,5315,2,1,6}-{2845,5352,2,1,6}-{2839,5360,2,1,6}-{2851,5359,2,1,7}-{2860,5353,2,1,6}" + }, + { + "npc_id": "6279", + "loc_data": "{2857,5315,2,1,6}-{2859,5318,2,1,5}-{2858,5329,2,1,3}-{2879,5326,2,1,4}" + }, + { + "npc_id": "6280", + "loc_data": "{2869,5332,2,1,6}-{2871,5313,2,1,2}-{2879,5330,2,1,2}-{2877,5327,2,1,0}" + }, + { + "npc_id": "6281", + "loc_data": "{2865,5316,2,1,2}-{2861,5333,2,1,2}" + }, + { + "npc_id": "6282", + "loc_data": "{2874,5318,2,1,0}-{2859,5316,2,1,3}-{2878,5329,2,1,2}-{2858,5330,2,1,2}" + }, + { + "npc_id": "6283", + "loc_data": "{2877,5326,2,1,2}-{2857,5328,2,1,3}-{2861,5315,2,1,7}" + }, + { + "npc_id": "6339", + "loc_data": "{2547,3277,0,0,0}" + }, + { + "npc_id": "6345", + "loc_data": "{2518,3275,0,0,0}" + }, + { + "npc_id": "6346", + "loc_data": "{2799,3186,0,1,7}-{2797,3169,0,0,0}-{2793,3161,0,1,3}" + }, + { + "npc_id": "6347", + "loc_data": "{2799,3167,0,0,0}-{2787,3188,0,1,1}" + }, + { + "npc_id": "6348", + "loc_data": "{2793,3158,0,1,3}-{2798,3154,0,1,4}-{2796,3189,0,1,0}" + }, + { + "npc_id": "6349", + "loc_data": "{2797,3186,0,1,6}-{2793,3161,0,1,0}" + }, + { + "npc_id": "6350", + "loc_data": "{2798,3182,0,1,7}-{2793,3161,0,1,1}" + }, + { + "npc_id": "6357", + "loc_data": "{3359,2969,0,1,3}" + }, + { + "npc_id": "6362", + "loc_data": "{3270,4856,0,1,3}" + }, + { + "npc_id": "6363", + "loc_data": "{3251,5455,0,1,4}-{3258,5456,0,1,6}-{3257,5451,0,1,6}-{3257,5464,0,1,2}-{3256,5473,0,1,2}-{3244,5469,0,1,1}-{3269,4829,0,1,3}-{3271,4823,0,1,2}-{3283,4809,0,1,3}-{3190,5523,0,1,3}-{3225,5485,0,1,5}-{3219,5528,0,1,2}-{3223,5520,0,1,3}-{3225,5511,0,1,0}-{3236,5511,0,1,6}-{3232,5523,0,1,0}-{3239,5530,0,1,4}-{3233,5546,0,1,3}-{3222,5539,0,1,5}-{3218,5482,0,1,7}-{3219,5486,0,1,4}-{3207,5461,0,1,6}-{3208,5458,0,1,3}-{3194,5530,0,1,3}" + }, + { + "npc_id": "6364", + "loc_data": "{3271,4809,0,1,3}-{3188,5529,0,1,3}-{3194,5531,0,1,1}-{3222,5486,0,1,3}-{3221,5482,0,1,4}-{3212,5459,0,1,6}-{3210,5462,0,1,2}-{3188,5527,0,1,3}-{3234,5510,0,1,6}" + }, + { + "npc_id": "6365", + "loc_data": "{3267,4817,0,1,4}-{3290,4803,0,1,3}" + }, + { + "npc_id": "6367", + "loc_data": "{3276,4808,0,1,3}-{3291,4812,0,1,6}-{3207,5466,0,1,6}-{3223,5462,0,1,1}-{3237,5524,0,1,6}-{3229,5510,0,1,4}" + }, + { + "npc_id": "6368", + "loc_data": "{3226,5458,0,1,3}-{3222,5470,0,1,6}-{3238,5541,0,1,1}-{3226,5540,0,1,7}-{3222,5522,0,1,7}" + }, + { + "npc_id": "6369", + "loc_data": "{3268,4825,0,1,6}-{3268,4809,0,1,4}-{3288,4803,0,1,6}-{3298,4810,0,1,4}" + }, + { + "npc_id": "6376", + "loc_data": "{2925,2976,0,1,1}-{2909,2978,0,1,5}" + }, + { + "npc_id": "6377", + "loc_data": "{2920,2973,0,1,6}-{2919,2976,0,1,6}-{2910,2978,0,1,7}" + }, + { + "npc_id": "6379", + "loc_data": "{2894,2995,0,0,0}-{2909,2970,0,0,0}-{3303,5485,0,1,1}-{3320,5494,0,1,4}-{3313,5490,0,1,4}-{3315,5484,0,1,3}-{3323,5471,0,1,6}-{3319,5471,0,1,4}-{3323,5477,0,1,0}-{3310,5484,0,1,4}-{3313,5488,0,1,6}-{3309,5481,0,1,1}-{3320,5495,0,1,0}" + }, + { + "npc_id": "6380", + "loc_data": "{2883,2994,0,0,0}-{2882,2994,0,0,0}-{3319,5490,0,1,5}-{3298,5486,0,1,3}-{3312,5480,0,1,4}-{3315,5480,0,1,1}-{3308,5482,0,1,2}-{3321,5477,0,1,0}-{3317,5470,0,1,6}-{3324,5472,0,1,6}-{3311,5482,0,1,0}" + }, + { + "npc_id": "6383", + "loc_data": "{2888,3001,0,0,0}-{2891,3002,0,0,0}-{2890,2998,0,0,0}-{2887,2994,0,0,0}-{2901,2991,0,0,0}-{2905,2990,0,0,0}-{2886,2989,0,0,0}-{2927,2979,0,0,0}-{2926,2973,0,0,0}-{2919,2973,0,0,0}-{2919,2976,0,0,0}-{2920,2979,0,0,0}" + }, + { + "npc_id": "6386", + "loc_data": "{2683,3326,0,0,0}" + }, + { + "npc_id": "6387", + "loc_data": "{3275,4808,0,1,3}-{3276,4808,0,1,4}" + }, + { + "npc_id": "6388", + "loc_data": "{3369,2999,0,1,7}-{3368,2995,0,1,6}-{3362,2997,0,1,3}-{3361,2988,0,1,2}-{3367,2988,0,1,7}-{3379,2983,0,1,1}" + }, + { + "npc_id": "6390", + "loc_data": "{1707,4814,0,0,6}" + }, + { + "npc_id": "6394", + "loc_data": "{2703,5366,0,0,0}" + }, + { + "npc_id": "6396", + "loc_data": "{2791,4279,0,0,0}" + }, + { + "npc_id": "6405", + "loc_data": "{2799,4260,0,1,0}" + }, + { + "npc_id": "6406", + "loc_data": "{2765,4267,0,1,0}" + }, + { + "npc_id": "6407", + "loc_data": "{2802,4246,0,1,0}" + }, + { + "npc_id": "6408", + "loc_data": "{2770,4238,0,1,0}" + }, + { + "npc_id": "6409", + "loc_data": "{2787,4262,0,1,0}-{2792,4275,0,1,0}" + }, + { + "npc_id": "6410", + "loc_data": "{2766,4257,0,1,0}" + }, + { + "npc_id": "6416", + "loc_data": "{2801,4258,0,1,0}" + }, + { + "npc_id": "6417", + "loc_data": "{2765,4264,0,1,0}-{2777,4260,0,1,0}" + }, + { + "npc_id": "6418", + "loc_data": "{2799,4243,0,1,0}" + }, + { + "npc_id": "6419", + "loc_data": "{2771,4237,0,1,0}" + }, + { + "npc_id": "6420", + "loc_data": "{2796,4277,0,1,0}" + }, + { + "npc_id": "6421", + "loc_data": "{2768,4254,0,1,0}" + }, + { + "npc_id": "6427", + "loc_data": "{2802,4259,0,1,0}" + }, + { + "npc_id": "6428", + "loc_data": "{2768,4268,0,1,0}" + }, + { + "npc_id": "6429", + "loc_data": "{2776,4252,0,1,0}-{2805,4242,0,1,0}" + }, + { + "npc_id": "6430", + "loc_data": "{2769,4236,0,1,0}" + }, + { + "npc_id": "6431", + "loc_data": "{2792,4260,0,1,0}-{2796,4275,0,1,0}" + }, + { + "npc_id": "6432", + "loc_data": "{2766,4255,0,1,0}" + }, + { + "npc_id": "6438", + "loc_data": "{2790,4254,0,1,0}-{2800,4256,0,1,0}" + }, + { + "npc_id": "6439", + "loc_data": "{2766,4265,0,1,0}" + }, + { + "npc_id": "6440", + "loc_data": "{2789,4248,0,1,0}-{2802,4244,0,1,0}" + }, + { + "npc_id": "6441", + "loc_data": "{2771,4241,0,1,0}-{2777,4252,0,1,0}" + }, + { + "npc_id": "6442", + "loc_data": "{2795,4273,0,1,0}" + }, + { + "npc_id": "6443", + "loc_data": "{2767,4252,0,1,0}-{2776,4250,0,1,0}" + }, + { + "npc_id": "6449", + "loc_data": "{2792,4252,0,1,0}-{2800,4254,0,1,0}" + }, + { + "npc_id": "6450", + "loc_data": "{2764,4266,0,1,0}-{2781,4261,0,1,0}" + }, + { + "npc_id": "6451", + "loc_data": "{2802,4243,0,1,0}" + }, + { + "npc_id": "6452", + "loc_data": "{2772,4235,0,1,0}" + }, + { + "npc_id": "6453", + "loc_data": "{2797,4272,0,1,0}" + }, + { + "npc_id": "6454", + "loc_data": "{2765,4253,0,1,0}-{2779,4256,0,1,0}" + }, + { + "npc_id": "6458", + "loc_data": "{2784,4249,0,1,0}" + }, + { + "npc_id": "6459", + "loc_data": "{2778,4264,0,1,0}-{2784,4252,0,1,0}" + }, + { + "npc_id": "6460", + "loc_data": "{2783,4251,0,1,0}-{2789,4264,0,1,0}-{2801,4252,0,1,0}" + }, + { + "npc_id": "6461", + "loc_data": "{2787,4250,0,1,0}-{2791,4249,0,1,0}" + }, + { + "npc_id": "6462", + "loc_data": "{2785,4248,0,1,0}-{2786,4251,0,1,0}-{2801,4242,0,1,0}" + }, + { + "npc_id": "6463", + "loc_data": "{2773,4238,0,1,0}-{2779,4248,0,1,0}-{2785,4250,0,1,0}" + }, + { + "npc_id": "6464", + "loc_data": "{2796,4267,0,1,0}" + }, + { + "npc_id": "6465", + "loc_data": "{2764,4251,0,1,0}" + }, + { + "npc_id": "6482", + "loc_data": "{2801,4260,0,0,0}" + }, + { + "npc_id": "6483", + "loc_data": "{2804,4246,0,0,0}" + }, + { + "npc_id": "6484", + "loc_data": "{2795,4276,0,0,0}" + }, + { + "npc_id": "6485", + "loc_data": "{2766,4250,0,0,0}" + }, + { + "npc_id": "6486", + "loc_data": "{2774,4236,0,0,0}" + }, + { + "npc_id": "6487", + "loc_data": "{2765,4268,0,0,0}" + }, + { + "npc_id": "6488", + "loc_data": "{2784,4255,1,0,0}" + }, + { + "npc_id": "6489", + "loc_data": "{2787,4266,0,0,0}" + }, + { + "npc_id": "6498", + "loc_data": "{2796,4256,0,1,0}" + }, + { + "npc_id": "6499", + "loc_data": "{2793,4247,0,1,0}" + }, + { + "npc_id": "6500", + "loc_data": "{2793,4265,0,1,0}" + }, + { + "npc_id": "6501", + "loc_data": "{2772,4256,0,1,0}" + }, + { + "npc_id": "6502", + "loc_data": "{2775,4247,0,1,0}" + }, + { + "npc_id": "6503", + "loc_data": "{2775,4265,0,1,0}" + }, + { + "npc_id": "6521", + "loc_data": "{3161,3475,0,0,6}" + }, + { + "npc_id": "6522", + "loc_data": "{3168,3475,0,0,6}" + }, + { + "npc_id": "6523", + "loc_data": "{3173,3498,0,0,1}" + }, + { + "npc_id": "6524", + "loc_data": "{3156,3481,0,0,1}" + }, + { + "npc_id": "6525", + "loc_data": "{3175,3481,0,0,1}" + }, + { + "npc_id": "6526", + "loc_data": "{3152,3490,0,0,1}" + }, + { + "npc_id": "6527", + "loc_data": "{3154,3498,0,0,1}" + }, + { + "npc_id": "6528", + "loc_data": "{3165,3491,0,0,1}" + }, + { + "npc_id": "6529", + "loc_data": "{3164,3488,0,0,6}" + }, + { + "npc_id": "6530", + "loc_data": "{3164,3491,0,0,1}" + }, + { + "npc_id": "6531", + "loc_data": "{3165,3488,0,0,6}" + }, + { + "npc_id": "6532", + "loc_data": "{3163,3489,0,0,3}" + }, + { + "npc_id": "6533", + "loc_data": "{3166,3489,0,0,4}" + }, + { + "npc_id": "6534", + "loc_data": "{3166,3490,0,0,4}" + }, + { + "npc_id": "6535", + "loc_data": "{3163,3490,0,0,3}" + }, + { + "npc_id": "6538", + "loc_data": "{3189,3690,0,0,3}" + }, + { + "npc_id": "6731", + "loc_data": "{2655,5615,0,1,4}" + }, + { + "npc_id": "6750", + "loc_data": "{2577,3078,0,1,3}" + }, + { + "npc_id": "6773", + "loc_data": "{3439,2808,0,0,0}" + }, + { + "npc_id": "6774", + "loc_data": "{3435,2808,0,0,0}" + }, + { + "npc_id": "6776", + "loc_data": "{3441,2810,0,0,0}-{3445,2813,0,0,0}" + }, + { + "npc_id": "6777", + "loc_data": "{3432,2810,0,0,0}" + }, + { + "npc_id": "6778", + "loc_data": "{3440,2806,0,0,0}" + }, + { + "npc_id": "6779", + "loc_data": "{3392,2759,0,1,2}-{3408,2763,0,1,7}-{3410,2786,0,1,2}-{3420,2778,0,1,6}-{3427,2792,0,1,6}-{3429,2802,0,1,4}" + }, + { + "npc_id": "6786", + "loc_data": "{3409,2812,1,0,0}" + }, + { + "npc_id": "6787", + "loc_data": "{3408,2813,1,0,0}" + }, + { + "npc_id": "6891", + "loc_data": "{2598,3272,0,0,0}" + }, + { + "npc_id": "6893", + "loc_data": "{2926,3435,0,1,2}" + }, + { + "npc_id": "6917", + "loc_data": "{2916,3082,0,0,0}-{2917,3089,0,0,0}-{2912,3090,0,0,0}" + }, + { + "npc_id": "6918", + "loc_data": "{2917,3088,0,1,4}-{2917,3092,0,1,4}" + }, + { + "npc_id": "6921", + "loc_data": "{2974,3448,0,1,4}-{2971,3442,0,1,6}-{2968,3451,0,1,1}-{2967,3439,0,1,4}-{2965,3451,0,1,5}-{2954,3273,0,1,6}" + }, + { + "npc_id": "6942", + "loc_data": "{2890,3100,0,1,4}" + }, + { + "npc_id": "6944", + "loc_data": "{2855,3028,0,0,0}-{2841,3039,0,0,0}-{2838,3031,0,0,0}-{2836,3014,0,0,0}-{2839,3022,0,0,0}" + }, + { + "npc_id": "6958", + "loc_data": "{2574,3082,0,1,4}" + }, + { + "npc_id": "6962", + "loc_data": "{2842,5222,0,1,6}" + }, + { + "npc_id": "6966", + "loc_data": "{2927,3431,0,1,1}" + }, + { + "npc_id": "6971", + "loc_data": "{2926,3443,0,0,5}" + }, + { + "npc_id": "6997", + "loc_data": "{3002,3257,0,0,0}-{3058,3429,0,0,0}-{3059,3420,0,0,0}-{3059,3425,0,0,0}-{3049,3429,0,0,0}-{3007,3261,0,0,0}" + }, + { + "npc_id": "7003", + "loc_data": "{3253,5535,0,1,7}-{3230,5493,0,1,1}-{3224,5497,0,1,5}-{2582,9895,0,1,7}" + }, + { + "npc_id": "7004", + "loc_data": "{3256,5540,0,1,4}-{3247,5536,0,1,6}-{3225,5495,0,1,4}-{2581,9891,0,1,2}" + }, + { + "npc_id": "7009", + "loc_data": "{3282,3467,0,0,0}" + }, + { + "npc_id": "7021", + "loc_data": "{2510,2822,0,1,3}-{2511,2823,0,1,4}-{2509,2825,0,1,6}" + }, + { + "npc_id": "7022", + "loc_data": "{2503,2821,0,1,1}-{2500,2818,0,1,4}-{2503,2819,0,1,3}" + }, + { + "npc_id": "7023", + "loc_data": "{2552,2821,0,1,4}-{2555,2826,0,1,5}-{2550,2821,0,1,1}" + }, + { + "npc_id": "7024", + "loc_data": "{2523,2823,0,0,0}-{2525,2821,0,0,0}-{2525,2820,0,0,0}" + }, + { + "npc_id": "7025", + "loc_data": "{2537,2820,0,0,0}-{2539,2819,0,0,0}-{2543,2817,0,0,0}" + }, + { + "npc_id": "7026", + "loc_data": "{2543,2822,0,0,0}-{2542,2818,0,0,0}-{2549,2822,0,0,0}" + }, + { + "npc_id": "7031", + "loc_data": "{2499,2820,0,1,4}-{2511,2819,0,1,3}-{2525,2820,0,1,0}-{2527,2818,0,1,3}-{2542,2819,0,1,4}-{2551,2817,0,1,3}-{2554,2819,0,1,3}-{2559,2819,0,1,4}-{2566,2820,0,1,5}-{2575,2818,0,1,4}-{2578,2819,0,1,4}-{2587,2819,0,1,7}-{2595,2821,0,1,4}-{2595,2826,0,1,0}-{2503,2824,0,1,3}-{2509,2822,0,1,4}-{2518,2825,0,1,7}-{2526,2822,0,1,1}-{2547,2822,0,1,4}-{2588,2801,0,1,1}-{2557,2826,0,1,4}-{2562,2819,0,1,6}-{2565,2828,0,1,0}-{2573,2825,0,1,1}-{2578,2820,0,1,6}-{2584,2822,0,1,4}-{2590,2831,0,1,4}-{2594,2823,0,1,4}-{2502,2823,0,1,4}-{2513,2820,0,1,7}-{2527,2819,0,1,4}-{2529,2818,0,1,6}-{2541,2822,0,1,3}-{2549,2817,0,1,2}-{2557,2818,0,1,2}-{2488,2768,0,1,1}" + }, + { + "npc_id": "7032", + "loc_data": "{2539,2838,0,0,0}-{2542,2832,0,0,0}-{2532,2836,0,0,0}" + }, + { + "npc_id": "7033", + "loc_data": "{2541,2837,0,0,0}-{2535,2832,0,0,0}-{2543,2832,0,0,0}" + }, + { + "npc_id": "7034", + "loc_data": "{2536,2839,0,0,0}-{2537,2840,0,0,0}-{2533,2836,0,0,0}" + }, + { + "npc_id": "7035", + "loc_data": "{2542,2839,0,0,0}-{2549,2835,0,0,0}-{2541,2839,0,0,0}" + }, + { + "npc_id": "7036", + "loc_data": "{2538,2841,0,0,0}-{2537,2836,0,0,0}-{2531,2836,0,0,0}" + }, + { + "npc_id": "7039", + "loc_data": "{2503,2824,0,1,4}-{2518,2824,0,1,4}-{2534,2821,0,1,1}-{2548,2823,0,1,4}-{2560,2822,0,1,1}-{2570,2823,0,1,1}-{2582,2824,0,1,6}-{2588,2828,0,1,4}-{2503,2825,0,1,4}-{2493,2828,0,1,3}-{2515,2823,0,1,6}-{2525,2827,0,1,4}-{2589,2808,0,1,2}-{2562,2825,0,1,7}-{2568,2820,0,1,4}-{2577,2821,0,1,4}-{2582,2832,0,1,6}-{2500,2818,0,1,1}-{2525,2827,0,1,7}-{2536,2826,0,1,2}-{2541,2819,0,1,4}-{2503,2822,0,1,3}" + }, + { + "npc_id": "7040", + "loc_data": "{2563,2862,0,0,0}-{2563,2856,0,0,0}" + }, + { + "npc_id": "7041", + "loc_data": "{2562,2863,0,0,0}-{2553,2861,0,0,0}" + }, + { + "npc_id": "7042", + "loc_data": "{2551,2863,0,0,0}-{2552,2859,0,0,0}" + }, + { + "npc_id": "7043", + "loc_data": "{2553,2862,0,0,0}-{2561,2861,0,0,0}" + }, + { + "npc_id": "7044", + "loc_data": "{2467,2933,0,0,4}-{2470,2937,0,0,4}-{2445,2897,0,0,4}-{2444,2894,0,0,4}" + }, + { + "npc_id": "7045", + "loc_data": "{2460,2922,0,0,4}-{2463,2928,0,0,4}" + }, + { + "npc_id": "7046", + "loc_data": "{2460,2925,0,0,4}-{3353,3810,0,0,0}-{3348,3812,0,0,4}-{3367,3801,0,0,4}" + }, + { + "npc_id": "7047", + "loc_data": "{2557,2836,0,0,0}-{2559,2838,0,0,0}" + }, + { + "npc_id": "7048", + "loc_data": "{2545,2836,0,0,0}" + }, + { + "npc_id": "7049", + "loc_data": "{2553,2839,0,0,4}-{2553,2836,0,0,4}" + }, + { + "npc_id": "7051", + "loc_data": "{2547,2852,0,0,0}-{2549,2854,0,0,0}" + }, + { + "npc_id": "7052", + "loc_data": "{2571,2855,0,0,0}" + }, + { + "npc_id": "7055", + "loc_data": "{2559,2851,0,0,0}-{2560,2852,0,0,0}" + }, + { + "npc_id": "7056", + "loc_data": "{2560,2851,0,0,0}-{2561,2852,0,0,0}" + }, + { + "npc_id": "7057", + "loc_data": "{2596,2845,0,0,0}" + }, + { + "npc_id": "7062", + "loc_data": "{2571,2840,0,0,0}-{2572,2840,0,0,0}" + }, + { + "npc_id": "7065", + "loc_data": "{2621,2857,1,0,0}-{2622,2857,0,0,0}" + }, + { + "npc_id": "7066", + "loc_data": "{2619,2856,1,0,0}-{2620,2857,0,0,0}" + }, + { + "npc_id": "7067", + "loc_data": "{2518,2842,0,0,0}" + }, + { + "npc_id": "7068", + "loc_data": "{2531,2850,0,0,0}" + }, + { + "npc_id": "7069", + "loc_data": "{2559,2858,0,0,0}" + }, + { + "npc_id": "7070", + "loc_data": "{2581,2866,0,0,0}" + }, + { + "npc_id": "7071", + "loc_data": "{2598,2864,0,0,0}" + }, + { + "npc_id": "7072", + "loc_data": "{2517,2840,0,0,0}" + }, + { + "npc_id": "7073", + "loc_data": "{2533,2848,0,0,0}" + }, + { + "npc_id": "7074", + "loc_data": "{2556,2858,0,0,0}" + }, + { + "npc_id": "7075", + "loc_data": "{2583,2865,0,0,0}" + }, + { + "npc_id": "7076", + "loc_data": "{2596,2865,0,0,0}" + }, + { + "npc_id": "7077", + "loc_data": "{2617,2856,1,0,0}-{2618,2857,0,0,0}" + }, + { + "npc_id": "7078", + "loc_data": "{2502,2838,0,0,0}-{2478,2884,0,0,0}-{2476,2895,0,0,0}-{2472,2870,0,0,0}-{2455,2873,0,0,0}-{2455,2857,0,0,0}-{2474,2833,0,0,0}-{2505,2842,0,0,0}-{2507,2843,0,0,0}-{2481,2833,0,0,0}-{2476,2865,0,0,0}-{2456,2856,0,0,0}-{2454,2879,0,0,0}-{2472,2884,0,0,0}-{2475,2894,0,0,0}" + }, + { + "npc_id": "7079", + "loc_data": "{2501,2851,0,0,0}-{2466,2878,0,0,0}-{2454,2847,0,0,0}-{2471,2857,0,0,0}-{2483,2840,0,0,0}-{2498,2854,0,0,0}-{2504,2851,0,0,0}-{2491,2838,0,0,0}-{2475,2852,0,0,0}-{2464,2873,0,0,0}-{2474,2903,0,0,0}-{2479,2906,0,0,0}" + }, + { + "npc_id": "7080", + "loc_data": "{2508,2853,0,0,0}-{2492,2893,0,0,0}-{2483,2876,0,0,0}-{2456,2868,0,0,0}-{2459,2836,0,0,0}-{2514,2851,0,0,0}-{2506,2852,0,0,0}-{2487,2877,0,0,0}-{2486,2860,0,0,0}-{2458,2866,0,0,0}-{2416,2856,0,0,0}-{2495,2884,0,0,0}" + }, + { + "npc_id": "7081", + "loc_data": "{2499,2860,0,0,0}-{2485,2892,0,0,0}-{2451,2870,0,0,0}-{2466,2864,0,0,0}-{2449,2826,0,0,0}-{2487,2842,0,0,0}-{2497,2863,0,0,0}-{2489,2843,0,0,0}-{2471,2860,0,0,0}-{2448,2870,0,0,0}-{2478,2888,0,0,0}-{2485,2922,0,0,0}" + }, + { + "npc_id": "7082", + "loc_data": "{2516,2858,0,0,0}-{2493,2903,0,0,0}-{2485,2869,0,0,0}-{2484,2888,0,0,0}-{2444,2861,0,0,0}-{2457,2863,0,0,0}-{2474,2837,0,0,0}-{2521,2862,0,0,0}-{2483,2865,0,0,0}-{2474,2844,0,0,0}-{2460,2859,0,0,0}-{2492,2901,0,0,0}-{2486,2889,0,0,0}" + }, + { + "npc_id": "7091", + "loc_data": "{2525,2852,0,0,0}-{2529,2844,0,0,0}" + }, + { + "npc_id": "7092", + "loc_data": "{2526,2854,0,0,0}-{2528,2850,0,0,0}" + }, + { + "npc_id": "7093", + "loc_data": "{2527,2853,0,0,0}-{2528,2849,0,0,0}" + }, + { + "npc_id": "7094", + "loc_data": "{2527,2851,0,0,0}-{2523,2850,0,0,0}" + }, + { + "npc_id": "7095", + "loc_data": "{2609,2863,0,0,0}-{2610,2862,0,0,0}" + }, + { + "npc_id": "7096", + "loc_data": "{2610,2865,0,0,0}-{2605,2866,0,0,0}" + }, + { + "npc_id": "7097", + "loc_data": "{2611,2862,0,0,0}-{2607,2867,0,0,0}" + }, + { + "npc_id": "7098", + "loc_data": "{2611,2864,0,0,0}-{2608,2863,0,0,0}" + }, + { + "npc_id": "7099", + "loc_data": "{2585,2844,0,0,0}-{2581,2845,0,0,0}" + }, + { + "npc_id": "7100", + "loc_data": "{2586,2840,0,0,0}-{2587,2841,0,0,0}" + }, + { + "npc_id": "7101", + "loc_data": "{2585,2842,0,0,0}" + }, + { + "npc_id": "7102", + "loc_data": "{2576,2840,0,0,0}-{2576,2840,0,0,0}" + }, + { + "npc_id": "7103", + "loc_data": "{2579,2843,0,0,0}-{2582,2843,0,0,0}-{2579,2843,0,0,0}-{2582,2843,0,0,0}" + }, + { + "npc_id": "7104", + "loc_data": "{2549,2852,0,0,0}-{2547,2856,0,0,0}" + }, + { + "npc_id": "7105", + "loc_data": "{3111,9929,0,1,7}-{3106,9941,0,1,1}-{3111,9935,0,1,4}-{3114,9931,0,1,1}-{2612,9484,0,1,1}-{2611,9484,0,1,0}-{2614,9484,0,1,6}-{2611,9486,0,1,1}" + }, + { + "npc_id": "7106", + "loc_data": "{3131,9930,0,1,4}" + }, + { + "npc_id": "7107", + "loc_data": "{3130,9928,0,1,0}-{3131,9931,0,1,4}" + }, + { + "npc_id": "7109", + "loc_data": "{3127,9932,0,1,1}" + }, + { + "npc_id": "7110", + "loc_data": "{3121,9929,0,1,4}" + }, + { + "npc_id": "7112", + "loc_data": "{3130,9934,0,1,3}" + }, + { + "npc_id": "7113", + "loc_data": "{3127,9932,0,1,4}" + }, + { + "npc_id": "7114", + "loc_data": "{3132,9921,0,0,0}-{3132,9935,0,1,1}" + }, + { + "npc_id": "7115", + "loc_data": "{3050,3259,0,0,0}" + }, + { + "npc_id": "7121", + "loc_data": "{2189,3148,0,1,4}" + }, + { + "npc_id": "7138", + "loc_data": "{3245,5462,0,1,7}-{3257,5454,0,1,3}-{3255,5461,0,1,1}-{3251,5473,0,1,3}-{3224,5540,0,1,0}-{3240,5541,0,1,6}-{3239,5529,0,1,6}-{3233,5524,0,1,4}-{3237,5512,0,1,6}-{3225,5510,0,1,1}-{3222,5524,0,1,1}-{3213,5472,0,1,3}-{3210,5469,0,1,5}-{3221,5468,0,1,0}-{3223,5465,0,1,0}-{3190,5523,0,1,2}-{3225,5540,0,1,7}-{3218,5537,0,1,3}-{3195,5527,0,1,6}" + }, + { + "npc_id": "7139", + "loc_data": "{3220,5463,0,1,7}" + }, + { + "npc_id": "7142", + "loc_data": "{3082,4246,0,1,4}" + }, + { + "npc_id": "7143", + "loc_data": "{3082,3459,0,0,0}" + }, + { + "npc_id": "7144", + "loc_data": "{3085,4230,0,1,3}" + }, + { + "npc_id": "7145", + "loc_data": "{3081,4252,0,1,7}" + }, + { + "npc_id": "7146", + "loc_data": "{3078,4240,0,1,4}" + }, + { + "npc_id": "7147", + "loc_data": "{3079,4245,0,1,4}" + }, + { + "npc_id": "7148", + "loc_data": "{3077,4229,0,1,4}" + }, + { + "npc_id": "7149", + "loc_data": "{3085,4235,0,1,4}" + }, + { + "npc_id": "7150", + "loc_data": "{3085,4240,0,1,3}" + }, + { + "npc_id": "7151", + "loc_data": "{3081,3457,0,0,4}" + }, + { + "npc_id": "7152", + "loc_data": "{3081,3455,0,0,4}" + }, + { + "npc_id": "7153", + "loc_data": "{3081,3453,0,0,4}" + }, + { + "npc_id": "7154", + "loc_data": "{3079,3457,0,0,4}" + }, + { + "npc_id": "7155", + "loc_data": "{3079,3455,0,0,4}" + }, + { + "npc_id": "7156", + "loc_data": "{3077,3457,0,0,4}" + }, + { + "npc_id": "7157", + "loc_data": "{3077,3453,0,0,4}" + }, + { + "npc_id": "7158", + "loc_data": "{3080,3463,0,1,0}-{3079,3463,0,1,0}-{3144,4250,2,1,4}-{3143,4255,2,1,2}-{3140,4253,2,1,3}-{3145,4255,2,1,6}-{3149,4257,2,1,5}-{3148,4262,2,1,5}-{3142,4260,2,1,3}-{3144,4259,2,1,4}-{3145,4261,2,1,4}-{3146,4265,2,1,5}-{3143,4264,2,1,3}-{3144,4266,2,1,5}-{3141,4265,2,1,1}-{3144,4270,2,1,1}-{3142,4269,2,1,6}-{3157,4262,2,1,1}-{3164,4265,2,1,6}-{3162,4266,2,1,6}-{3165,4266,2,1,3}-{3164,4261,2,1,2}-{3162,4259,2,1,5}-{3162,4255,2,1,7}-{3165,4256,2,1,4}-{3163,4251,2,1,3}-{3165,4249,2,1,6}-{3162,4250,2,1,4}-{3163,4241,2,1,4}-{3165,4239,2,1,4}-{3165,4241,2,1,0}-{3160,4235,2,1,2}-{3165,4235,2,1,4}-{3165,4237,2,1,4}-{3162,4234,2,1,3}-{3164,4231,2,1,4}-{3166,4229,2,1,6}-{3162,4230,2,1,1}-{3167,4229,2,1,3}-{3184,4236,2,1,1}-{3153,4246,1,1,3}-{3159,4236,1,1,6}-{3163,4236,1,1,4}-{3163,4234,1,1,7}-{3146,4235,1,1,5}-{3144,4236,1,1,1}-{3143,4234,1,1,2}-{3145,4240,1,1,4}-{3148,4242,1,1,1}-{3145,4241,1,1,7}-{3142,4242,1,1,3}-{3146,4230,1,1,4}" + }, + { + "npc_id": "7159", + "loc_data": "{3174,4238,2,1,6}-{3175,4243,2,1,6}-{3179,4236,2,1,4}-{3145,4272,1,1,3}-{3145,4276,1,1,3}-{3152,4271,1,1,6}-{3144,4264,1,1,4}-{3153,4266,1,1,1}-{3152,4261,1,1,4}-{3145,4259,1,1,6}-{3161,4259,1,1,0}-{3160,4265,1,1,0}-{3153,4246,1,1,3}-{3157,4248,1,1,6}-{3161,4247,1,1,4}-{3146,4247,1,1,6}-{3153,4233,1,1,4}-{3153,4240,1,1,6}-{3155,4238,1,1,5}-{3169,4267,3,1,3}-{3160,4265,3,1,6}-{3168,4250,3,1,4}-{3168,4244,3,1,6}-{3160,4239,3,1,1}-{3160,4228,3,1,3}-{3147,4225,3,1,3}-{3145,4242,3,1,5}-{3139,4249,3,1,6}-{3144,4253,3,1,3}-{3145,4266,3,1,0}-{3138,4266,3,1,3}" + }, + { + "npc_id": "7160", + "loc_data": "{3175,4254,2,1,7}-{3176,4247,2,1,5}-{3174,4269,2,1,1}-{3190,4253,2,1,3}-{3192,4247,2,1,3}-{3189,4235,2,1,0}-{3152,4269,0,1,4}-{3160,4278,0,1,1}-{3160,4262,0,1,3}-{3149,4250,0,1,0}-{3158,4250,0,1,5}-{3161,4236,0,1,6}-{3172,4250,0,1,2}-{3171,4269,3,1,1}-{3157,4277,3,1,3}-{3150,4278,3,1,3}" + }, + { + "npc_id": "7161", + "loc_data": "{3142,4230,2,1,6}-{3143,4231,2,1,3}-{3141,4235,2,1,4}-{3144,4241,2,1,4}" + }, + { + "npc_id": "7162", + "loc_data": "{3144,4229,2,1,1}-{3143,4236,2,1,1}-{3145,4235,2,1,1}-{3148,4244,2,1,6}" + }, + { + "npc_id": "7228", + "loc_data": "{2862,3101,0,0,0}-{2879,3109,0,0,0}-{2882,3104,0,0,0}-{2874,3098,0,0,0}-{2882,3098,0,0,0}" + }, + { + "npc_id": "7229", + "loc_data": "{2833,3088,0,0,0}-{2830,3085,0,0,0}-{2844,3089,0,0,0}-{2837,3084,0,0,0}-{2840,3076,0,0,0}" + }, + { + "npc_id": "7230", + "loc_data": "{2887,3051,0,0,0}-{2890,3052,0,0,0}-{2894,3058,0,0,0}-{2840,3008,0,0,0}-{2897,3035,0,0,0}" + }, + { + "npc_id": "7231", + "loc_data": "{2930,2961,0,0,0}-{2942,2964,0,0,0}-{2933,2964,0,0,0}-{2932,2967,0,0,0}-{2936,2973,0,0,0}" + }, + { + "npc_id": "7232", + "loc_data": "{2802,3106,0,0,0}-{2807,3101,0,0,0}-{2806,3108,0,0,0}-{2808,3105,0,0,0}-{2814,3100,0,0,0}" + }, + { + "npc_id": "7233", + "loc_data": "{2922,3070,0,0,0}-{2929,3075,0,0,0}-{2919,3080,0,0,0}-{2924,3080,0,0,0}-{2923,3081,0,0,0}" + }, + { + "npc_id": "7234", + "loc_data": "{2900,3107,0,0,0}-{2903,3098,0,0,0}-{2908,3104,0,0,0}-{2905,3107,0,0,0}-{2904,3107,0,0,0}" + }, + { + "npc_id": "7235", + "loc_data": "{2820,3065,0,0,0}-{2830,3059,0,0,0}-{2825,3057,0,0,0}-{2827,3050,0,0,0}-{2822,3053,0,0,0}" + }, + { + "npc_id": "7236", + "loc_data": "{2799,3005,0,0,0}-{2801,2995,0,0,0}-{2804,3001,0,0,0}-{2803,2986,0,0,0}-{2811,2999,0,0,0}" + }, + { + "npc_id": "7237", + "loc_data": "{2927,3432,0,1,4}" + }, + { + "npc_id": "7251", + "loc_data": "{2574,3082,0,1,1}" + }, + { + "npc_id": "7275", + "loc_data": "{2995,3252,0,0,0}-{2996,3259,0,0,0}-{2993,3250,0,0,0}-{3000,3258,0,0,0}" + }, + { + "npc_id": "7276", + "loc_data": "{2994,3256,0,0,0}-{3002,3250,0,0,0}-{2992,3252,0,0,0}-{3000,3250,0,0,0}-{2728,3422,0,1,1}-{2718,3413,0,1,4}-{2729,3420,0,1,4}-{2727,3414,0,1,6}-{2714,3419,0,1,3}-{2719,3427,0,1,7}" + }, + { + "npc_id": "7285", + "loc_data": "{2835,3107,0,0,0}-{2836,3101,0,0,0}-{2836,3110,0,0,0}-{2837,3112,0,0,0}-{2841,3107,0,0,0}-{2885,3018,0,0,0}-{2885,3019,0,0,0}-{2891,3018,0,0,0}" + }, + { + "npc_id": "7286", + "loc_data": "{2931,3090,0,0,0}-{2925,3097,0,0,0}-{2936,3096,0,0,0}-{2924,3102,0,0,0}-{2933,3104,0,0,0}" + }, + { + "npc_id": "7288", + "loc_data": "{2834,3045,0,0,0}-{2826,3048,0,0,0}-{2824,3043,0,0,0}-{2822,3045,0,0,0}-{2818,3049,0,0,0}" + }, + { + "npc_id": "7289", + "loc_data": "{2882,3018,0,1,7}-{2887,3024,0,1,2}" + }, + { + "npc_id": "7290", + "loc_data": "{2845,3088,0,1,6}-{2854,3085,0,1,1}" + }, + { + "npc_id": "7292", + "loc_data": "{2863,3048,0,1,5}-{2868,3037,0,1,4}" + }, + { + "npc_id": "7309", + "loc_data": "{3023,3410,0,0,0}-{2946,3280,0,0,0}" + }, + { + "npc_id": "7310", + "loc_data": "{3015,3409,0,0,0}-{2946,3272,0,0,0}" + }, + { + "npc_id": "7311", + "loc_data": "{2956,3273,0,0,0}" + }, + { + "npc_id": "7312", + "loc_data": "{2950,3268,0,0,0}" + }, + { + "npc_id": "7363", + "loc_data": "{2793,2996,0,0,0}" + }, + { + "npc_id": "7420", + "loc_data": "{3168,3334,0,0,3}" + }, + { + "npc_id": "7421", + "loc_data": "{3163,3336,0,0,1}" + }, + { + "npc_id": "7451", + "loc_data": "{2328,3170,0,1,6}-{2341,3179,0,1,4}-{2338,3164,0,1,4}-{2189,3181,0,1,2}-{2178,3186,0,1,7}-{2199,3182,0,1,0}-{2288,3149,0,1,2}-{2282,3144,0,1,3}-{2285,3144,0,1,2}-{2281,3139,0,1,1}-{2289,3152,0,1,6}-{2287,3155,0,1,1}-{2286,3146,0,1,1}-{2289,3156,0,0,5}-{2285,3136,0,1,3}" + }, + { + "npc_id": "7636", + "loc_data": "{3618,9736,0,0,0}-{3620,9732,0,0,0}-{3624,9736,0,0,0}-{3625,9738,0,0,0}-{3618,9736,0,0,4}-{3620,9732,0,0,4}-{3624,9736,0,0,4}-{3625,9738,0,0,4}" + }, + { + "npc_id": "7637", + "loc_data": "{3588,9768,0,0,0}-{3600,9768,0,0,0}-{3606,9780,0,0,0}-{3612,9729,0,0,0}-{3613,9764,0,0,0}-{3614,9740,0,0,0}-{3614,9750,0,0,0}-{3621,9748,0,0,0}-{3629,9737,0,0,0}" + }, + { + "npc_id": "7639", + "loc_data": "{3592,9766,0,0,0}-{3603,9770,0,0,0}-{3605,9757,0,0,0}-{3611,9749,0,0,0}-{3611,9766,0,0,0}-{3616,9737,0,0,0}-{3616,9756,0,0,0}-{3616,9762,0,0,0}-{3617,9779,0,0,0}-{3621,9754,0,0,0}" + }, + { + "npc_id": "7640", + "loc_data": "{3608,9780,0,1,3}-{3610,9777,0,1,1}-{3613,9772,0,1,4}-{3617,9748,0,1,7}-{3617,9758,0,1,1}-{3621,9751,0,1,1}" + }, + { + "npc_id": "7641", + "loc_data": "{3607,9776,0,1,1}-{3610,9772,0,1,0}-{3614,9778,0,1,7}-{3615,9746,0,1,7}-{3618,9753,0,1,1}-{3619,9748,0,1,6}" + }, + { + "npc_id": "7642", + "loc_data": "{3595,9742,0,0,0}-{3597,9751,0,0,0}-{3598,9736,0,0,0}-{3604,9746,0,0,0}" + }, + { + "npc_id": "7643", + "loc_data": "{3587,9737,0,0,0}-{3592,9746,0,0,0}-{3600,9740,0,0,0}-{3605,9738,0,0,0}" + }, + { + "npc_id": "7711", + "loc_data": "{3405,9902,0,0,0}" + }, + { + "npc_id": "7716", + "loc_data": "{3005,3475,0,1,7}-{3003,3473,0,1,4}-{2997,3471,0,0,0}-{3004,3494,0,0,0}-{3005,3505,0,0,0}" + }, + { + "npc_id": "7726", + "loc_data": "{2996,3451,0,0,0}" + }, + { + "npc_id": "7727", + "loc_data": "{3045,3483,0,0,0}-{3053,3492,0,0,4}-{3055,3491,0,0,0}-{3045,3496,0,0,0}-{3046,3490,1,0,0}-{3057,3497,1,0,3}" + }, + { + "npc_id": "7728", + "loc_data": "{3009,3433,0,0,0}" + }, + { + "npc_id": "7731", + "loc_data": "{3008,3466,0,0,0}" + }, + { + "npc_id": "7732", + "loc_data": "{3009,3466,0,0,0}" + }, + { + "npc_id": "7733", + "loc_data": "{3008,3479,0,0,0}" + }, + { + "npc_id": "7734", + "loc_data": "{3009,3487,0,0,0}" + }, + { + "npc_id": "7735", + "loc_data": "{2999,3469,0,0,0}" + }, + { + "npc_id": "7744", + "loc_data": "{3149,3411,0,0,0}" + }, + { + "npc_id": "7746", + "loc_data": "{4755,5116,0,1,7}" + }, + { + "npc_id": "7747", + "loc_data": "{4751,5116,0,1,5}" + }, + { + "npc_id": "7748", + "loc_data": "{4752,5114,0,1,5}" + }, + { + "npc_id": "7749", + "loc_data": "{4739,5070,0,1,0}" + }, + { + "npc_id": "7750", + "loc_data": "{4765,5064,0,1,7}" + }, + { + "npc_id": "7751", + "loc_data": "{4778,5070,0,1,2}" + }, + { + "npc_id": "7752", + "loc_data": "{4432,5096,0,1,0}" + }, + { + "npc_id": "7753", + "loc_data": "{4438,5089,0,1,0}-{4428,5083,0,1,0}-{4437,5075,0,1,0}" + }, + { + "npc_id": "7763", + "loc_data": "{4777,5080,0,1,2}" + }, + { + "npc_id": "7765", + "loc_data": "{4776,5076,0,1,6}" + }, + { + "npc_id": "7767", + "loc_data": "{4762,5145,0,1,2}-{2457,5139,0,1,6}-{2460,5140,0,1,0}-{2443,5147,0,1,3}-{2454,5155,0,1,5}-{2461,5125,0,1,3}-{2456,5124,0,1,4}-{2458,5129,0,1,4}-{2443,5145,0,1,1}-{2451,5148,0,1,1}-{2447,5143,0,1,4}-{2443,5138,0,1,4}" + }, + { + "npc_id": "7768", + "loc_data": "{4762,5156,0,1,6}" + }, + { + "npc_id": "7823", + "loc_data": "{3215,9560,0,0,1}-{3161,9547,0,0,3}-{3164,9556,0,0,4}-{3162,9574,0,0,3}-{3198,9554,0,0,7}-{3216,9588,0,0,1}-{3198,9572,0,0,1}" + }, + { + "npc_id": "7891", + "loc_data": "{3207,3250,0,0,0}-{3208,3250,0,0,0}-{3209,3250,0,0,0}" + }, + { + "npc_id": "7959", + "loc_data": "{3188, 3425, 0, 1, 0}" + }, + { + "npc_id": "7969", + "loc_data": "{3205,3240,0,0,0}" + }, + { + "npc_id": "8082", + "loc_data": "{3552,5590,2,1,2}" + }, + { + "npc_id": "8083", + "loc_data": "{3560,5602,0,1,3}" + }, + { + "npc_id": "8084", + "loc_data": "{3541,5597,0,1,4}" + }, + { + "npc_id": "8085", + "loc_data": "{3550,5598,0,1,3}" + }, + { + "npc_id": "8149", + "loc_data": "{3244,9996,0,1,6}-{3229,10008,0,1,6}-{3222,10012,0,1,6}-{3205,10010,0,1,6}-{3212,10012,0,1,6}-{3205,10023,0,1,6}-{3210,10030,0,1,6}-{3212,10039,0,1,6}-{3213,10009,0,1,6}-{3243,9993,0,1,6}-{3218,10036,0,1,6}-{3218,10010,0,1,6}" + }, + { + "npc_id": "8150", + "loc_data": "{3241,9997,0,1,6}-{3230,10011,0,1,6}-{3221,10012,0,1,6}-{3207,10006,0,1,6}-{3207,10017,0,1,6-{3209,10031,0,1,6}-{3209,10019,0,1,6}-{3217,10012,0,1,6}-{3224,10012,0,1,6}" + }, + { + "npc_id": "8151", + "loc_data": "{3241,9998,0,1,6}-{3223,10010,0,1,6}-{3208,10012,0,1,6}-{3209,10026,0,1,6}-{3214,10038,0,1,6}-{3211,10035,0,1,6}-{3214,10037,0,1,6}-{3240,9991,0,1,6}-{3231,10010,0,1,6}-{3210,10007,0,1,6}-{3222,10010,0,1,6}" + }, + { + "npc_id": "8273", + "loc_data": "{2931,3536,0,1,5}" + }, + { + "npc_id": "8274", + "loc_data": "{3514,3513,0,1,6}" + }, + { + "npc_id": "8275", + "loc_data": "{2869,2982,1,1,5}" + }, + { + "npc_id": "8349", + "loc_data": "{2603,5740,0,0,7}-{2591,5739,0,1,3}-{2616,5733,0,1,3}-{2613,5712,0,1,3}-{2603,5712,0,1,3}-{2588,5712,0,1,3}" + }, + { + "npc_id": "8536", + "loc_data": "{2654,5600,0,1,3}-{2650,5600,0,0,3}-{2662,5593,0,0,3}-{2653,5590,0,0,3}-{2644,5592,0,0,3-{2644,5601,0,0,3}-{2654,5604,0,0,3}-{2663,5606,0,0,3}-{2670,5597,0,0,3}-{2657,5589,0,0,3}-" + }, + { + "npc_id": "8590", + "loc_data": "{2743,3444,0,1,0}" + }, + { + "npc_id": "7601", + "loc_data": "{1697,5605,0,0,6}" + }, + { + "npc_id": "3579", + "loc_data": "{3195,3263,0,1,0}" + }, + { + "npc_id": "5424", + "loc_data": "{2594,3269,0,0,0}" + }, + { + "npc_id": "7010", + "loc_data": "{2243,3200,0,1,3}-{2204,3229,0,1,3}-{2204,3229,0,1,3}-{2204,3229,0,1,3}-{2268,3239,0,1,3}-{2268,3239,0,1,3}-{2268,3239,0,1,3}-{2261,3260,0,1,3}-{2261,3260,0,1,3}-{2261,3260,0,1,3}" + }, + { + "npc_id": "7011", + "loc_data": "{2243,3200,0,1,3}-{2268,3239,0,1,3}-{2261,3260,0,1,3}-{2261,3260,0,1,3}" + }, + { + "npc_id": "7014", + "loc_data": "{2180,3201,0,1,3}-{2226,3143,0,1,3}-{2288,3147,0,1,3}-{2247,3187,0,1,3}" + }, + { + "npc_id": "7012", + "loc_data": "{2180,3201,0,1,3}-{2180,3201,0,1,3}-{2182,3204,0,1,3}-{2226,3143,0,1,3}-{2226,3143,0,1,3}-{2226,3143,0,1,3}-{2223,3146,0,1,3}-{2223,3146,0,1,3}-{2288,3147,0,1,3}-{2288,3147,0,1,3}-{2288,3147,0,1,3}-{2247,3187,0,1,3}-{2247,3187,0,1,3}" + }, + { + "npc_id": "1183", + "loc_data": "{2206,3258,0,1,3}-{2200,3261,0,1,3}-{2193,3253,0,1,3}-{2192,3243,0,1,3}" + }, + { + "npc_id": "1184", + "loc_data": "{2192,3249,0,1,3}-{2200,3249,0,1,3}-{2195,3247,0,1,3}-{2212,3258,0,1,3}" + }, + { + "npc_id": "2160", + "loc_data": "{2925,10211,0,1,0}" + }, + { + "npc_id": "2191", + "loc_data": "{2925,10213,0,1,0}" + }, + { + "npc_id": "4248", + "loc_data": "{2849,10183,0,1,0}" + }, + { + "npc_id": "2153", + "loc_data": "{2826,10197,0,1,0}" + }, + { + "npc_id": "2152", + "loc_data": "{2827,10231,0,1,0}" + }, + { + "npc_id": "2161", + "loc_data": "{2869,10211,0,1,0}" + }, + { + "npc_id": "2162", + "loc_data": "{2886,10187,0,1,0}" + }, + { + "npc_id": "2151", + "loc_data": "{2873,10210,0,1,0}" + }, + { + "npc_id": "4558", + "loc_data": "{2885,10202,0,1,0}" + }, + { + "npc_id": "2158", + "loc_data": "{2885,10207,0,1,0}" + }, + { + "npc_id": "2157", + "loc_data": "{2887,10212,0,1,0}" + }, + { + "npc_id": "2156", + "loc_data": "{2892,10212,0,1,0}" + }, + { + "npc_id": "2159", + "loc_data": "{2885,10196,0,1,0}" + }, + { + "npc_id": "2565", + "loc_data": "{1937,4972,0,1,0}" + }, + { + "npc_id": "2564", + "loc_data": "{1935,4964,0,0,4}" + }, + { + "npc_id": "2321", + "loc_data": "{2918,10194,0,0,3}" + }, + { + "npc_id": "2198", + "loc_data": "{2905,10213,0,1,0}" + }, + { + "npc_id": "2164", + "loc_data": "{2838,10205,0,0,1}" + }, + { + "npc_id": "2163", + "loc_data": "{2836,10205,0,1,0}" + }, + { + "npc_id": "2130", + "loc_data": "{2892,10191,0,1,0}-{2919,10206,0,1,0}-{2923,10230,0,1,0}-{2865,10193,0,1,0}" + }, + { + "npc_id": "2131", + "loc_data": "{2893,10205,0,1,0}-{2895,10223,0,1,0}-{2871,10199,0,1,0}-{2890,10199,0,1,0}" + }, + { + "npc_id": "2132", + "loc_data": "{2913,10211,0,1,0}-{2901,10232,0,1,0}-{2823,10193,0,1,0}" + }, + { + "npc_id": "5880", + "loc_data": "{2888,10226,0,1,0}-{2920,10196,0,1,0}-{2844,10214,0,1,0}" + }, + { + "npc_id": "5881", + "loc_data": "{2847,10200,0,1,0}-{2863,10233,0,1,0}-{2920,10216,0,1,0}" + }, + { + "npc_id": "5882", + "loc_data": "{2916,10191,0,1,0}-{2841,10195,0,1,0}-{2831,10219,0,1,0}" + }, + { + "npc_id": "2138", + "loc_data": "{2890,10232,0,1,0}" + }, + { + "npc_id": "2178", + "loc_data": "{2916,10192,0,1,0}-{2839,10196,0,1,0}" + }, + { + "npc_id": "2187", + "loc_data": "{2913,10200,0,1,0}" + }, + { + "npc_id": "1546", + "loc_data": "{2911,10175,0,0,4}-{2912,10175,0,0,4}-{2913,10175,0,0,4}-{2914,10175,0,0,4}-{2909,10173,0,0,4}-{2910,10173,0,0,4}-{2911,10173,0,0,4}-{2912,10173,0,0,4}-{2913,10173,0,0,4}-{2909,10171,0,0,4}-{2910,10171,0,0,4}-{2911,10169,0,0,4}-{2912,10169,0,0,4}-{2913,10169,0,0,4}" + }, + { + "npc_id": "2181", + "loc_data": "{2874,9871,0,1,0}" + }, + { + "npc_id": "2182", + "loc_data": "{2908,10176,0,1,0}" + }, + { + "npc_id": "2092", + "loc_data": "{2869,10196,1,1,0}" + }, + { + "npc_id": "2100", + "loc_data": "{2870,10196,1,1,0}" + }, + { + "npc_id": "2101", + "loc_data": "{2868,10202,1,1,0}" + }, + { + "npc_id": "2094", + "loc_data": "{2869,10205,1,0,6}" + }, + { + "npc_id": "2096", + "loc_data": "{2890,10207,1,0,6}" + }, + { + "npc_id": "2104", + "loc_data": "{2890,10204,1,1,0}" + }, + { + "npc_id": "2095", + "loc_data": "{2889,10211,1,0,6}" + }, + { + "npc_id": "2103", + "loc_data": "{2892,10209,1,1,0}" + }, + { + "npc_id": "2105", + "loc_data": "{2890,10196,1,1,0}" + }, + { + "npc_id": "2097", + "loc_data": "{2891,10196,1,0,6}" + }, + { + "npc_id": "2102", + "loc_data": "{2869,10208,1,1,0}" + }, + { + "npc_id": "2093", + "loc_data": "{2871,10207,1,1,0}" + }, + { + "npc_id": "2098", + "loc_data": "{2890,10192,1,0,6}" + }, + { + "npc_id": "2106", + "loc_data": "{2892,10190,1,1,0}" + }, + { + "npc_id": "2110", + "loc_data": "{2877,10198,1,1,0}-{2878,10196,1,1,0}" + }, + { + "npc_id": "2111", + "loc_data": "{2878,10201,1,1,0}-{2876,10201,1,1,0}" + }, + { + "npc_id": "2113", + "loc_data": "{2878,10201,1,1,0}-{2876,10201,1,1,0}" + }, + { + "npc_id": "2115", + "loc_data": "{2882,10201,1,1,0}-{2883,10200,1,1,0}" + }, + { + "npc_id": "2117", + "loc_data": "{2883,10198,1,1,0}-{2884,10199,1,1,0}" + }, + { + "npc_id": "2119", + "loc_data": "{2882,10197,1,1,0}-{2883,10196,1,1,0}" + }, + { + "npc_id": "2121", + "loc_data": "{2880,10195,1,1,0}-{2879,10193,1,1,0}" + }, + { + "npc_id": "2193", + "loc_data": "{2887,10223,0,1,0}" + }, + { + "npc_id": "2197", + "loc_data": "{2848,10198,0,1,0}" + }, + { + "npc_id": "2188", + "loc_data": "{2851,10223,0,1,0}" + }, + { + "npc_id": "2189", + "loc_data": "{2851,10223,0,1,0}" + }, + { + "npc_id": "2171", + "loc_data": "{2930,10184,0,1,0}" + }, + { + "npc_id": "1848", + "loc_data": "{2868,10168,0,1,0}" + }, + { + "npc_id": "1849", + "loc_data": "{2868,10168,0,1,0}" + }, + { + "npc_id": "1847", + "loc_data": "{2868,10168,0,1,0}" + }, + { + "npc_id": "1839", + "loc_data": "{2825,10167,0,1,0}" + }, + { + "npc_id": "2127", + "loc_data": "{2880,10199,1,1,0}" + }, + { + "npc_id": "2201", + "loc_data": "{2866,10208,0,1,0}" + }, + { + "npc_id": "2179", + "loc_data": "{2840,10199,0,0,6}" + }, + { + "npc_id": "2177", + "loc_data": "{2843,10191,1,0,1}" + }, + { + "npc_id": "2140", + "loc_data": "{2835,10226,0,0,6}" + }, + { + "npc_id": "2169", + "loc_data": "{2836,10222,0,1,0}" + }, + { + "npc_id": "2196", + "loc_data": "{2838,10196,0,1,0}" + }, + { + "npc_id": "2170", + "loc_data": "{2853,10196,0,1,0}" + }, + { + "npc_id": "2199", + "loc_data": "{2855,10199,0,1,0}" + }, + { + "npc_id": "2192", + "loc_data": "{2933,10219,0,1,0}" + }, + { + "npc_id": "2141", + "loc_data": "{2906,10204,0,1,0}" + }, + { + "npc_id": "2202", + "loc_data": "{2912,10222,0,1,0}" + }, + { + "npc_id": "2195", + "loc_data": "{2901,10227,0,1,0}" + }, + { + "npc_id": "2194", + "loc_data": "{2926,10225,0,1,0}" + }, + { + "npc_id": "2142", + "loc_data": "{2904,10206,0,1,0}" + }, + { + "npc_id": "2190", + "loc_data": "{2922,10201,0,1,0}" + }, + { + "npc_id": "2155", + "loc_data": "{2871,10199,0,1,0}" + }, + { + "npc_id": "603", + "loc_data": "{2450,3510,1,1,0}" + }, + { + "npc_id": "8065", + "loc_data": "{3399,3464,0,0,1}" + }, + { + "npc_id": "8066", + "loc_data": "{3346,3513,0,0,6}" + }, + { + "npc_id": "8067", + "loc_data": "{3280,3524,0,0,0}" + }, + { + "npc_id": "8068", + "loc_data": "{3237,3525,0,0,0}" + }, + { + "npc_id": "8069", + "loc_data": "{3171,3535,0,0,0}" + }, + { + "npc_id": "8070", + "loc_data": "{3088,3515,0,0,0}" + }, + { + "npc_id": "8071", + "loc_data": "{3035,3517,0,0,0}" + }, + { + "npc_id": "8072", + "loc_data": "{2972,3515,0,0,0}" + }, + { + "npc_id": "8073", + "loc_data": "{2941,3564,0,0,0}" + }, + { + "npc_id": "8074", + "loc_data": "{2946,3621,0,0,0}" + }, + { + "npc_id": "8075", + "loc_data": "{2938,3679,0,0,0}" + }, + { + "npc_id": "8076", + "loc_data": "{2939,3772,0,0,0}" + }, + { + "npc_id": "2085", + "loc_data": "{3231,9610,0,1,0}" + }, + { + "npc_id": "2084", + "loc_data": "{3314,9612,0,1,0}" + }, + { + "npc_id": "2078", + "loc_data": "{3313,9622,0,0,3}" + }, + { + "npc_id": "2077", + "loc_data": "{3323,9616,0,0,6}" + }, + { + "npc_id": "2076", + "loc_data": "{3312,9628,0,0,3}" + }, + { + "npc_id": "2075", + "loc_data": "{3312,9638,0,0,3}" + }, + { + "npc_id": "2072", + "loc_data": "{3319,9632,0,1,0}" + }, + { + "npc_id": "2071", + "loc_data": "{3323,9643,0,1,0}" + }, + { + "npc_id": "2070", + "loc_data": "{3324,9621,0,1,0}" + }, + { + "npc_id": "2069", + "loc_data": "{3313,9652,0,1,0}" + }, + { + "npc_id": "2074", + "loc_data": "{3319,9605,0,0,1}" + }, + { + "npc_id": "7724", + "loc_data": "{3054,3503,0,1,0}" + }, + { + "npc_id": "15", + "loc_data": "{3203,3479,0,1,0}-{3202,3484,0,1,0}" + }, + { + "npc_id": "2910", + "loc_data": "{3082,9885,0,1,4}" + }, + { + "npc_id": "3382", + "loc_data": "{3080,9885,0,1,4}-{3076,9886,0,1,4}-{3081,9890,0,1,4}-{3081,9895,0,1,4}" + }, + { + "npc_id": "5965", + "loc_data": "{1759,4955,0,0,0}" + }, + { + "npc_id": "5966", + "loc_data": "{1754,4960,0,1,4}" + }, + { + "npc_id": "5967", + "loc_data": "{1735,4950,0,1,4}-{1758, 4937, 0, 1, 4}-{1756, 4947, 0, 1, 4}-{1771, 4960, 0, 1, 4}-{1779, 4950, 0, 1, 4}-{1759, 4971, 0, 1, 4}-{1773, 4983, 0, 1, 4}" + }, + { + "npc_id": "5945", + "loc_data": "{1743,4959,0,1,4}-{1739,4969,0,1,4}-{1748, 4941, 0, 1, 4}-{1759, 4979, 0, 1, 6}" + }, + { + "npc_id": "10", + "loc_data": "{1740,4970,0,1,4}-{1783, 4950, 0, 1, 4}-{1755,4951,0,1,3}-{1754, 4986, 0, 1, 6}-{1763, 4972, 0, 1, 6}" + }, + { + "npc_id": "5971", + "loc_data": "{1742,4964,0,0,0}" + }, + { + "npc_id": "5977", + "loc_data": "{1735,4964,0,0,0}" + }, + { + "npc_id": "5982", + "loc_data": "{1735,4954,0,0,0}" + }, + { + "npc_id": "5976", + "loc_data": "{1742,4954,0,0,0}" + }, + { + "npc_id": "5978", + "loc_data": "{1752,4938,0,0,0}" + }, + { + "npc_id": "5972", + "loc_data": "{1781,4954,0,0,0}" + }, + { + "npc_id": "5973", + "loc_data": "{1774,4964,0,0,0}" + }, + { + "npc_id": "5974", + "loc_data": "{1774,4954,0,0,0}" + }, + { + "npc_id": "5975", + "loc_data": "{1740,4979,0,0,0}" + }, + { + "npc_id": "5981", + "loc_data": "{1750,4979,0,0,0}" + }, + { + "npc_id": "5979", + "loc_data": "{1765,4979,0,0,0}" + }, + { + "npc_id": "5980", + "loc_data": "{1775,4979,0,0,0}" + } +] + diff --git a/Server/data/configs/object_configs.json b/Server/data/configs/object_configs.json new file mode 100644 index 000000000..e8c44b00f --- /dev/null +++ b/Server/data/configs/object_configs.json @@ -0,0 +1,20274 @@ +[ + { + "ids": "0,1", + "examine": "I wonder what's inside." + }, + { + "ids": "2", + "examine": "Looks and smells like a place where goblins live." + }, + { + "ids": "3,4", + "examine": "The door is closed." + }, + { + "ids": "5", + "examine": "A powerful ranging device, unfortunately not working." + }, + { + "ids": "6", + "examine": "A powerful ranging device that fires metal balls." + }, + { + "ids": "7", + "examine": "The cannon is built on here." + }, + { + "ids": "8", + "examine": "The mounting for the multicannon." + }, + { + "ids": "9", + "examine": "The barrels of the multicannon." + }, + { + "ids": "10", + "examine": "I can climb down this." + }, + { + "ids": "11", + "examine": "I can climb up this." + }, + { + "ids": "12", + "examine": "A pile of rocks is blocking my path." + }, + { + "ids": "13", + "examine": "Mud caved in from above." + }, + { + "ids": "14,15,16,17,18,19,20", + "examine": "Intended to keep the goblins away from the mines." + }, + { + "ids": "21", + "examine": "Its eyes stare off into the distance..." + }, + { + "ids": "22", + "examine": "The door is shut." + }, + { + "ids": "23", + "examine": "Unusually lumpy looking." + }, + { + "ids": "24", + "examine": "The door is shut." + }, + { + "ids": "25,26,27,28,29,30,31,32", + "examine": "Seems to be some kind of clock part." + }, + { + "ids": "33,34,35,36", + "examine": "Yup, definitely a lever." + }, + { + "ids": "37,38,39", + "examine": "Stops people walking past." + }, + { + "ids": "40", + "examine": "Animals have no table manners." + }, + { + "ids": "41", + "examine": "Looks like an outlet pipe to the lake." + }, + { + "ids": "42", + "examine": "I can see fish swimming in the water." + }, + { + "ids": "43", + "examine": "It seems to sparkle." + }, + { + "ids": "44", + "examine": "I can see really big fish swimming in the water." + }, + { + "ids": "45", + "examine": "Big Dave is fishing here." + }, + { + "ids": "46", + "examine": "Joshua is fishing here." + }, + { + "ids": "47,48,49,50", + "examine": "A wooden gate." + }, + { + "ids": "51", + "examine": "Hmmm... I wonder if it's loose enough to get through." + }, + { + "ids": "52,53", + "examine": "It's locked." + }, + { + "ids": "54,55,56,57", + "examine": "It's a flight of stairs." + }, + { + "ids": "58", + "examine": "Known commonly as Red worm vine." + }, + { + "ids": "59", + "examine": "A fancy hole in the wall." + }, + { + "ids": "60", + "examine": "A fancy hole in the ceiling." + }, + { + "ids": "61", + "examine": "A shrine to evil." + }, + { + "ids": "62", + "examine": "Is there something in there?" + }, + { + "ids": "63,64", + "examine": "Used for storage." + }, + { + "ids": "65,66", + "examine": "Surprisingly sturdy looking." + }, + { + "ids": "67", + "examine": "Used for storage." + }, + { + "ids": "68", + "examine": "Where bees live." + }, + { + "ids": "69,70", + "examine": "Handy for boarding boats." + }, + { + "ids": "71,72", + "examine": "Sturdy looking door." + }, + { + "ids": "73,74", + "examine": "Securely fastened shut." + }, + { + "ids": "75", + "examine": "I wonder what's inside?" + }, + { + "ids": "76", + "examine": "It's open." + }, + { + "ids": "77,78", + "examine": "Securely fastened shut." + }, + { + "ids": "79,80", + "examine": "Looks secure." + }, + { + "ids": "81,82", + "examine": "The door is closed." + }, + { + "ids": "86", + "examine": "Seems very old..." + }, + { + "ids": "87", + "examine": "I guess you pull it..." + }, + { + "ids": "89,90", + "examine": "A wrought iron gate." + }, + { + "ids": "91", + "examine": "I don't like the look of this!" + }, + { + "ids": "92,93", + "examine": "The door is closed." + }, + { + "ids": "94,95", + "examine": "A wrought iron gate." + }, + { + "ids": "96,98", + "examine": "A dark flight of stairs." + }, + { + "ids": "99", + "examine": "The door is closed." + }, + { + "ids": "100", + "examine": "Don't you open that trapdoor!" + }, + { + "ids": "101", + "examine": "I can climb this." + }, + { + "ids": "102", + "examine": "A sturdy door." + }, + { + "ids": "103", + "examine": "I wonder what's inside." + }, + { + "ids": "104", + "examine": "Perhaps I should search it." + }, + { + "ids": "105,106", + "examine": "I wonder what that's there for..." + }, + { + "ids": "114", + "examine": "An appliance for cooking with." + }, + { + "ids": "115,116,117,118,119,120", + "examine": "A party balloon." + }, + { + "ids": "121", + "examine": "Aren't they pretty?" + }, + { + "ids": "122", + "examine": "Paaaarty!" + }, + { + "ids": "123,124,125,126,127,128,129,130", + "examine": "A party balloon." + }, + { + "ids": "131", + "examine": "The door is closed." + }, + { + "ids": "132", + "examine": "An escape route." + }, + { + "ids": "133", + "examine": "Looks spooky down there." + }, + { + "ids": "134,135", + "examine": "A large double door." + }, + { + "ids": "136", + "examine": "The door is closed." + }, + { + "ids": "152", + "examine": "Smelly." + }, + { + "ids": "153,36781", + "examine": "An ornate fountain." + }, + { + "ids": "154", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "155,156,157", + "examine": "Lots of books." + }, + { + "ids": "158,159", + "examine": "This wall looks odd..." + }, + { + "ids": "160", + "examine": "I wonder what this does..." + }, + { + "ids": "162,163,164", + "examine": "I'm not touching that." + }, + { + "ids": "165", + "examine": "A special furnace for destroying contaminated items." + }, + { + "ids": "166,167", + "examine": "A wooden gate." + }, + { + "ids": "170", + "examine": "I wonder what's inside." + }, + { + "ids": "171", + "examine": "Perhaps I should search it." + }, + { + "ids": "172", + "examine": "I wonder what's inside." + }, + { + "ids": "173", + "examine": "Perhaps I should search it." + }, + { + "ids": "187", + "examine": "Fly Gnome Air." + }, + { + "ids": "188", + "examine": "Probably pilot error." + }, + { + "ids": "189", + "examine": "The Blurberry bar" + }, + { + "ids": "190", + "examine": "A large gate in the gnome style." + }, + { + "ids": "194", + "examine": "The entrance to the cave." + }, + { + "ids": "195", + "examine": "I can climb this." + }, + { + "ids": "200", + "examine": "A quirky gnome lamp." + }, + { + "ids": "201", + "examine": "These insects love this light." + }, + { + "ids": "202", + "examine": "It's amazing what bees produce!" + }, + { + "ids": "203,204", + "examine": "Posh candlesticks." + }, + { + "ids": "208", + "examine": "Scary lighting apparatus." + }, + { + "ids": "209", + "examine": "An ornamental lighting fixture." + }, + { + "ids": "210", + "examine": "A mysterious glowing ice crystal." + }, + { + "ids": "211", + "examine": "It's amazing what bees produce!" + }, + { + "ids": "212,218", + "examine": "Useful for making ships move." + }, + { + "ids": "221,222", + "examine": "This figure brings luck to those who sail." + }, + { + "ids": "225,226", + "examine": "Useful for making ships move." + }, + { + "ids": "227", + "examine": "Barnacle infested rope." + }, + { + "ids": "245,246", + "examine": "Allows access to other parts of the ship." + }, + { + "ids": "252,253", + "examine": "Without this I'm going around in circles." + }, + { + "ids": "254", + "examine": "This figure brings luck to those who sail." + }, + { + "ids": "255", + "examine": "Used for pulling things up." + }, + { + "ids": "260", + "examine": "This figure brings luck to those who sail." + }, + { + "ids": "265", + "examine": "Useful if there is any wind." + }, + { + "ids": "266,267", + "examine": "Useful for making ships move." + }, + { + "ids": "268", + "examine": "Useful for making ships move" + }, + { + "ids": "271", + "examine": "How much does this weigh?" + }, + { + "ids": "272", + "examine": "I can climb up here." + }, + { + "ids": "273", + "examine": "I can go below decks with this ladder." + }, + { + "ids": "274,275,276,277,278,279", + "examine": "A conveniently rolled sail." + }, + { + "ids": "287", + "examine": "I'm not allowed to climb this ladder." + }, + { + "ids": "296", + "examine": "It's like a land rudder." + }, + { + "ids": "297", + "examine": "Disturbingly man-like." + }, + { + "ids": "298,299,300", + "examine": "I bet there's a needle in it somewhere." + }, + { + "ids": "301", + "examine": "Animals have no table manners." + }, + { + "ids": "302", + "examine": "A home for baby creatures." + }, + { + "ids": "303", + "examine": "In the city we would call this mouldy rubbish." + }, + { + "ids": "304", + "examine": "I bet there's a needle in it somewhere." + }, + { + "ids": "305", + "examine": "Where bees live." + }, + { + "ids": "306", + "examine": "A used cart seller will probably try and sell it later." + }, + { + "ids": "307,308", + "examine": "One horse power, wooden suspension. A beauty." + }, + { + "ids": "309", + "examine": "Dead tree parts piled together neatly." + }, + { + "ids": "310", + "examine": "A patch of soft dark brown matter. Probably mud." + }, + { + "ids": "311", + "examine": "A pile of something I hope is mud." + }, + { + "ids": "312", + "examine": "Potato-licious!" + }, + { + "ids": "313", + "examine": "Baby bread." + }, + { + "ids": "327", + "examine": "The remains of a bad driver." + }, + { + "ids": "346,347", + "examine": "The perfect place to store things." + }, + { + "ids": "348", + "examine": "These open and close!" + }, + { + "ids": "349", + "examine": "This may be worth searching." + }, + { + "ids": "350", + "examine": "These open and close!" + }, + { + "ids": "351", + "examine": "This may be worth searching." + }, + { + "ids": "352", + "examine": "These open and close!" + }, + { + "ids": "353", + "examine": "This may be worth searching." + }, + { + "ids": "354,355", + "examine": "A wooden crate for storage." + }, + { + "ids": "356,357,358", + "examine": "An old crate for storage." + }, + { + "ids": "359,360,361", + "examine": "A pile of boxes for storage." + }, + { + "ids": "362", + "examine": "A wooden barrel for storage." + }, + { + "ids": "363", + "examine": "A wooden barrel containing lots of fish." + }, + { + "ids": "364", + "examine": "It's got ale in it." + }, + { + "ids": "365", + "examine": "These may have something in them." + }, + { + "ids": "366", + "examine": "Useful for transportation of delicate items." + }, + { + "ids": "367,368,369", + "examine": "This may be worth opening." + }, + { + "ids": "370,371,372", + "examine": "This may be worth searching." + }, + { + "ids": "373", + "examine": "The perfect accompaniment to a bedroom." + }, + { + "ids": "374", + "examine": "A stand for hats!" + }, + { + "ids": "375,376,377", + "examine": "I wonder what's inside." + }, + { + "ids": "378,379", + "examine": "Perhaps I should search it." + }, + { + "ids": "380,381", + "examine": "A good source of books!" + }, + { + "ids": "382,383,384,385", + "examine": "A woven storage basket." + }, + { + "ids": "386", + "examine": "A gigantic pottery urn." + }, + { + "ids": "387", + "examine": "This no doubt contains arcane knowledge." + }, + { + "ids": "388", + "examine": "I wonder what this spooky item contains." + }, + { + "ids": "389,390", + "examine": "It smells funny in there." + }, + { + "ids": "392", + "examine": "A fishing net full of fish." + }, + { + "ids": "393", + "examine": "A good source of books!" + }, + { + "ids": "394,395,396", + "examine": "Bamboo storage!" + }, + { + "ids": "397", + "examine": "The perfect place to store things." + }, + { + "ids": "398", + "examine": "I hope no-one's home..." + }, + { + "ids": "399", + "examine": "I see dead people." + }, + { + "ids": "400", + "examine": "A small simple gravestone." + }, + { + "ids": "401", + "examine": "A simple marker for a forgotten person." + }, + { + "ids": "402", + "examine": "The remains of someone lie inside." + }, + { + "ids": "403", + "examine": "A monument to a special person." + }, + { + "ids": "404", + "examine": "The inscription is worn away and unreadable." + }, + { + "ids": "405", + "examine": "'Here lies...' is all I can read." + }, + { + "ids": "406", + "examine": "Whoever bought this must have really cared for the inhabitant." + }, + { + "ids": "407", + "examine": "Looks like a stone doorway to me." + }, + { + "ids": "408", + "examine": "Looks like a stone doorway to my untrained eye." + }, + { + "ids": "409", + "examine": "Shrine to the glory of Saradomin." + }, + { + "ids": "410", + "examine": "An ancient altar to the glory of Guthix." + }, + { + "ids": "411,412", + "examine": "Shrine to the glory of Zamorak." + }, + { + "ids": "413", + "examine": "Looks suspiciously like a big stone table." + }, + { + "ids": "414", + "examine": "A really posh upright coffin." + }, + { + "ids": "415", + "examine": "Whoever's inside must have been rich." + }, + { + "ids": "416", + "examine": "With skill I can play this." + }, + { + "ids": "417", + "examine": "Great for sleeping in." + }, + { + "ids": "418", + "examine": "A stylish-looking bed." + }, + { + "ids": "419", + "examine": "A drab-looking bed." + }, + { + "ids": "420,421", + "examine": "A stylish-looking bed." + }, + { + "ids": "422", + "examine": "Technically a bed." + }, + { + "ids": "423", + "examine": "I guess I could sleep in it if I were really tired." + }, + { + "ids": "424,425", + "examine": "Lovely comfy-looking big bed." + }, + { + "ids": "426", + "examine": "Posh-looking bed." + }, + { + "ids": "427,428", + "examine": "A bed fit for a king." + }, + { + "ids": "429", + "examine": "One of the nicest beds I have ever seen." + }, + { + "ids": "430", + "examine": "Perfect for snoozing in the sun." + }, + { + "ids": "431", + "examine": "A comfortable seat to recline and recuperate." + }, + { + "ids": "432", + "examine": "I don't think anyone's slept here for a long time." + }, + { + "ids": "433,434,435", + "examine": "Bamboo's a versatile material." + }, + { + "ids": "436,437,438,439", + "examine": "A lump of rock." + }, + { + "ids": "440", + "examine": "A big slimy lump of rock." + }, + { + "ids": "441", + "examine": "A slimy lump of rock." + }, + { + "ids": "442,443", + "examine": "A slippery looking rock." + }, + { + "ids": "444,445", + "examine": "A huge lump of rock." + }, + { + "ids": "446,447,448", + "examine": "Some small stones." + }, + { + "ids": "449", + "examine": "A rocky ledge." + }, + { + "ids": "450,451,452,453", + "examine": "Stoney!" + }, + { + "ids": "454,455", + "examine": "Solid rock from the cave floor." + }, + { + "ids": "462,463", + "examine": "Looks slippery!" + }, + { + "ids": "464,465,466", + "examine": "Formed over many years of dripping limestone." + }, + { + "ids": "467", + "examine": "A limestone ceiling growth." + }, + { + "ids": "468", + "examine": "Limestone floor growth." + }, + { + "ids": "469,470", + "examine": "A limestone ceiling growth." + }, + { + "ids": "471,472,473,474", + "examine": "A deposit of rocks." + }, + { + "ids": "477,478", + "examine": "Looks slippery!" + }, + { + "ids": "479,480,481,482,483,484,485,486", + "examine": "A deposit of rocks." + }, + { + "ids": "492", + "examine": "A collection of rocks over what looks like a depression." + }, + { + "ids": "507,508,509,510", + "examine": "A deposit of rocks." + }, + { + "ids": "511", + "examine": "A rock with a pickaxe and mining tools." + }, + { + "ids": "516", + "examine": "A very tall column of ice." + }, + { + "ids": "517,518,519,520", + "examine": "A deposit of rocks." + }, + { + "ids": "523,524,525,526,527,528", + "examine": "Formed over many years of dripping limestone." + }, + { + "ids": "529", + "examine": "A limestone ceiling growth." + }, + { + "ids": "530", + "examine": "Formed over many years of dripping limestone." + }, + { + "ids": "531", + "examine": "A limestone ceiling growth." + }, + { + "ids": "532", + "examine": "Limestone floor growth." + }, + { + "ids": "533", + "examine": "A limestone ceiling growth." + }, + { + "ids": "534", + "examine": "A tooth shaped rock formation protruding from the floor." + }, + { + "ids": "539,540", + "examine": "A tooth shaped rock formation protruding from the ceiling." + }, + { + "ids": "541,542", + "examine": "A tooth shaped rock formation protruding from the floor." + }, + { + "ids": "543", + "examine": "A tooth shaped rock formation protruding from the ceiling." + }, + { + "ids": "544", + "examine": "A tooth shaped rock formation protruding from the floor." + }, + { + "ids": "545", + "examine": "A huge lump of rock." + }, + { + "ids": "546,547", + "examine": "Intimidating!" + }, + { + "ids": "548,549,550,551,552,553", + "examine": "A deposit of rocks." + }, + { + "ids": "554,555,556,557", + "examine": "Frozen water has formed an icicle here." + }, + { + "ids": "558,559,560,561", + "examine": "It looks cold in there." + }, + { + "ids": "562", + "examine": "This person was of great importance." + }, + { + "ids": "563,564", + "examine": "A monarch chiselled in stone." + }, + { + "ids": "565", + "examine": "A sculpture of a monarch." + }, + { + "ids": "566", + "examine": "This person was of great importance." + }, + { + "ids": "567", + "examine": "A huge carving of an ancient race." + }, + { + "ids": "568", + "examine": "A depiction of a great dwarven miner." + }, + { + "ids": "569,570", + "examine": "A depiction of a famous gnome warrior." + }, + { + "ids": "571,572", + "examine": "The head and shoulders of a famous gnome." + }, + { + "ids": "573", + "examine": "A depiction of a famous gnomeballer." + }, + { + "ids": "574,575,576,577,578", + "examine": "A carving of a figure from the history of RuneScape." + }, + { + "ids": "579,580,581", + "examine": "An expertly chiselled statue." + }, + { + "ids": "582", + "examine": "An unusual symbol of ancient times." + }, + { + "ids": "583", + "examine": "An expertly crafted vase." + }, + { + "ids": "584", + "examine": "An expertly chiselled statue of a bird." + }, + { + "ids": "585,586", + "examine": "What a good likeness!" + }, + { + "ids": "587", + "examine": "A depiction of the evil god Zamorak." + }, + { + "ids": "588", + "examine": "A base for the statue to sit on." + }, + { + "ids": "589", + "examine": "The scrying glass of a seer." + }, + { + "ids": "590", + "examine": "Banking transactions are processed here." + }, + { + "ids": "591", + "examine": "Banking transactions are recorded here." + }, + { + "ids": "592", + "examine": "Contains washing items." + }, + { + "ids": "593,594,595", + "examine": "A nice sturdy looking table." + }, + { + "ids": "596,597", + "examine": "A banquet could be eaten from this." + }, + { + "ids": "598", + "examine": "Useful for putting things on." + }, + { + "ids": "599", + "examine": "At one time it was for putting things on." + }, + { + "ids": "600", + "examine": "The napkins are made from real silk." + }, + { + "ids": "601,602,603,604,605,606", + "examine": "Useful for putting things on." + }, + { + "ids": "607", + "examine": "Items for making clothes are kept on here." + }, + { + "ids": "608", + "examine": "The ideal place to study." + }, + { + "ids": "609,610", + "examine": "A handy workbench for a handy person." + }, + { + "ids": "611", + "examine": "Sit back and enjoy the view." + }, + { + "ids": "612", + "examine": "Items are for sale here." + }, + { + "ids": "613,614,615", + "examine": "Useful for putting things on." + }, + { + "ids": "616", + "examine": "A creepy looking table." + }, + { + "ids": "617", + "examine": "Items are for sale here." + }, + { + "ids": "618,619", + "examine": "There are some strange chemicals here." + }, + { + "ids": "620", + "examine": "Bamboo's a versatile material." + }, + { + "ids": "621,622", + "examine": "It's a banquet table." + }, + { + "ids": "623,624,625,626,627", + "examine": "A nice sturdy looking table." + }, + { + "ids": "628", + "examine": "Finely wrought wares of silver." + }, + { + "ids": "629", + "examine": "Garments for the discerning." + }, + { + "ids": "630", + "examine": "Bread cakes and pastries." + }, + { + "ids": "631", + "examine": "Finest precious stones." + }, + { + "ids": "632", + "examine": "These will keep you warm." + }, + { + "ids": "633", + "examine": "The spice is right." + }, + { + "ids": "634", + "examine": "Always a source of good bargains." + }, + { + "ids": "635", + "examine": "Fine brews from exotic regions." + }, + { + "ids": "636", + "examine": "Keeps mine carts from rolling away." + }, + { + "ids": "637", + "examine": "You can 'cart' things around on this." + }, + { + "ids": "647", + "examine": "Makes you taller." + }, + { + "ids": "648", + "examine": "A bit large for a bracelet!" + }, + { + "ids": "649,650", + "examine": "A macabre variation on the neck tie." + }, + { + "ids": "651,652,653,654,655,656,657", + "examine": "Dead and half buried." + }, + { + "ids": "658", + "examine": "Disturbing but tidy." + }, + { + "ids": "659", + "examine": "I don't even want to think about what did that..." + }, + { + "ids": "660", + "examine": "Now that's what I call slimline!" + }, + { + "ids": "661", + "examine": "He looks very relaxed." + }, + { + "ids": "662", + "examine": "Now he's just too thin." + }, + { + "ids": "663", + "examine": "He hasn't eaten in a long time." + }, + { + "ids": "664", + "examine": "Now that's what I call slimline!" + }, + { + "ids": "665", + "examine": "He looks very relaxed." + }, + { + "ids": "666", + "examine": "Now he's just too thin." + }, + { + "ids": "667", + "examine": "He hasn't eaten in a long time." + }, + { + "ids": "668,669,670", + "examine": "Disturbing but tidy." + }, + { + "ids": "671", + "examine": "No cats were harmed in the making of this device." + }, + { + "ids": "672,673,674,675,676,677", + "examine": "Shattered." + }, + { + "ids": "678", + "examine": "I see fish." + }, + { + "ids": "679", + "examine": "I can see fish swimming in the water." + }, + { + "ids": "680", + "examine": "I was always forced to play this as a child." + }, + { + "ids": "681", + "examine": "I never learnt to play." + }, + { + "ids": "682", + "examine": "Time for a recital?" + }, + { + "ids": "683", + "examine": "Tick-tock, it's a clock." + }, + { + "ids": "684", + "examine": "The noxious liquid bubbles horribly." + }, + { + "ids": "685,686,687,688", + "examine": "Shows which way the wind blows." + }, + { + "ids": "689", + "examine": "Looking good!" + }, + { + "ids": "690", + "examine": "A privacy aid!" + }, + { + "ids": "691", + "examine": "Use this to get changed behind and retain modesty." + }, + { + "ids": "692", + "examine": "I don't even want to think about what's cooking in that." + }, + { + "ids": "693", + "examine": "Good for sweeping." + }, + { + "ids": "694", + "examine": "I'm guessing it's for making women's clothes." + }, + { + "ids": "695", + "examine": "Helps make human clothing." + }, + { + "ids": "696", + "examine": "A hole." + }, + { + "ids": "697", + "examine": "Dead animal head. Lovely." + }, + { + "ids": "698", + "examine": "Must have been laid by a huge bird." + }, + { + "ids": "699", + "examine": "Whatever it was I'm glad it's not alive." + }, + { + "ids": "700,701", + "examine": "Spooky!" + }, + { + "ids": "702,703,704,705,706", + "examine": "A dog's idea of heaven." + }, + { + "ids": "707", + "examine": "Ding-Dong!" + }, + { + "ids": "708", + "examine": "Some kind of pulley system." + }, + { + "ids": "709", + "examine": "Surprisingly rope-shaped." + }, + { + "ids": "710", + "examine": "Suspiciously hole-shaped." + }, + { + "ids": "711,712,713", + "examine": "A huge chunk of shining natural crystal." + }, + { + "ids": "714,715,716,717", + "examine": "A recently extinguished fire." + }, + { + "ids": "718,719,720,721,722", + "examine": "A barrel full of swords..." + }, + { + "ids": "723", + "examine": "I'm glad this isn't around anymore!" + }, + { + "ids": "724,725,726", + "examine": "A crude torch stuck in the ground." + }, + { + "ids": "727,728,729,730,731,732", + "examine": "A fissure in the cave wall." + }, + { + "ids": "733", + "examine": "This huge web blocks your path." + }, + { + "ids": "734", + "examine": "A huge web, cruelly slashed in half." + }, + { + "ids": "735", + "examine": "The noxious liquid bubbles horribly." + }, + { + "ids": "736", + "examine": "Dead animal head. Lovely." + }, + { + "ids": "737,738,739,740", + "examine": "Whatever it was I'm glad it's not alive." + }, + { + "ids": "741,742", + "examine": "Looks a little too broken to climb." + }, + { + "ids": "743", + "examine": "An old-looking ladder." + }, + { + "ids": "744,745,746,747", + "examine": "An old-looking bit of scaffolding." + }, + { + "ids": "748", + "examine": "The entrance to the cave." + }, + { + "ids": "771", + "examine": "A map icon.." + }, + { + "ids": "779", + "examine": "It's a door made from bamboo." + }, + { + "ids": "787", + "examine": "A loom." + }, + { + "ids": "788,789", + "examine": "You'd need a big siege engine to force that." + }, + { + "ids": "817", + "examine": "I always wonder if someone's hiding inside when I see these." + }, + { + "ids": "818,819,820", + "examine": "Looks kind of like a man made of metal." + }, + { + "ids": "821", + "examine": "Not suitable for children. Aim away from face." + }, + { + "ids": "822", + "examine": "Big heavy metal balls." + }, + { + "ids": "823", + "examine": "The easiest opponent I'll ever fight." + }, + { + "ids": "824,825,826,827,828", + "examine": "A wooden defensive structure." + }, + { + "ids": "829,830,831,832,833", + "examine": "For private use only!" + }, + { + "ids": "834,835", + "examine": "Break glass in case of emergency." + }, + { + "ids": "836", + "examine": "An attractively laid out collection of ranging weapons." + }, + { + "ids": "837,838", + "examine": "Break glass in case of emergency." + }, + { + "ids": "839", + "examine": "An attractively laid out collection of ranging weapons." + }, + { + "ids": "848", + "examine": "A row of sharp pointy spears." + }, + { + "ids": "849,850", + "examine": "Rows of sharp pointy spears." + }, + { + "ids": "851,852", + "examine": "A tatty old standard." + }, + { + "ids": "853", + "examine": "A standard." + }, + { + "ids": "854,855,856", + "examine": "A blue standard." + }, + { + "ids": "857,858", + "examine": "A standard of the gnome race." + }, + { + "ids": "859", + "examine": "The standard of the ogre race." + }, + { + "ids": "860", + "examine": "The flag of Asgarnia." + }, + { + "ids": "861", + "examine": "The flag of Kandarin." + }, + { + "ids": "862", + "examine": "The flag of Ardougne." + }, + { + "ids": "863", + "examine": "A standard of Asgarnia." + }, + { + "ids": "864", + "examine": "A standard of Kandarin." + }, + { + "ids": "865", + "examine": "A standard of Asgarnia." + }, + { + "ids": "866", + "examine": "A standard of Kandarin." + }, + { + "ids": "867", + "examine": "A standard of Misthalin." + }, + { + "ids": "868", + "examine": "A standard of Varrock." + }, + { + "ids": "869", + "examine": "A flag flies here." + }, + { + "ids": "870", + "examine": "A sculpted trunk of wood." + }, + { + "ids": "871", + "examine": "Takes my dirty bath water away." + }, + { + "ids": "872", + "examine": "It smells horrible in there." + }, + { + "ids": "873,874", + "examine": "Ideal for washing things in." + }, + { + "ids": "875,876,877", + "examine": "Wash here." + }, + { + "ids": "878", + "examine": "No this is not a mirage!" + }, + { + "ids": "879", + "examine": "Everyone needs a water feature." + }, + { + "ids": "880", + "examine": "A beautiful water feature." + }, + { + "ids": "881", + "examine": "There's a cover over this manhole." + }, + { + "ids": "882", + "examine": "How dangerous, someone has left this manhole open." + }, + { + "ids": "883", + "examine": "This is supposed to stop people falling down the manhole." + }, + { + "ids": "884", + "examine": "Best used with a bucket." + }, + { + "ids": "885,886", + "examine": "If only I had one of those at home..." + }, + { + "ids": "887", + "examine": "A painting of the King looking royal." + }, + { + "ids": "888", + "examine": "A beautiful landscape." + }, + { + "ids": "889", + "examine": "A mysterious figure stands alone in this haunting image." + }, + { + "ids": "890", + "examine": "Hail to the King!" + }, + { + "ids": "891", + "examine": "I don't know much about art, but I like this." + }, + { + "ids": "892", + "examine": "A painting of some guy standing around somewhere." + }, + { + "ids": "893", + "examine": "A really bad portrait of the King." + }, + { + "ids": "894", + "examine": "Fine brushwork adds to the realism of this serene landscape." + }, + { + "ids": "895", + "examine": "Pretty good painting." + }, + { + "ids": "896", + "examine": "I can see the stars on this." + }, + { + "ids": "897", + "examine": "A picture of the stars with funny diagrams and things on." + }, + { + "ids": "898", + "examine": "Cross shaped." + }, + { + "ids": "899", + "examine": "Mmmm decorative!" + }, + { + "ids": "900", + "examine": "Brightens up the room a bit." + }, + { + "ids": "901", + "examine": "I don't know art, but I like it!" + }, + { + "ids": "902", + "examine": "Not bad at all." + }, + { + "ids": "903", + "examine": "Alas poor unicorn, I knew him well." + }, + { + "ids": "904", + "examine": "The scary-looking head of a scary-looking dragon." + }, + { + "ids": "905", + "examine": "Not what I would pick as wall decoration." + }, + { + "ids": "906", + "examine": "Looks like the bull lost." + }, + { + "ids": "907", + "examine": "Trinkets and stuff." + }, + { + "ids": "908", + "examine": "Not everyone's idea of a nice wall decoration." + }, + { + "ids": "909", + "examine": "Something is written on it. I can't read what." + }, + { + "ids": "910", + "examine": "Looks like an eye with huge lashes." + }, + { + "ids": "911", + "examine": "A tablet covered in weird looking little squiggles and pictures." + }, + { + "ids": "915", + "examine": "A posh water bowl." + }, + { + "ids": "954", + "examine": "For wiping muddy feet on." + }, + { + "ids": "955,956,957,958", + "examine": "Disturbingly its eyes look everywhere in the room except at you." + }, + { + "ids": "959", + "examine": "What has a face and hands but is not a man?" + }, + { + "ids": "960", + "examine": "It's a time machine....sort of!" + }, + { + "ids": "961", + "examine": "'Ask about our low, low interest rates!'" + }, + { + "ids": "962", + "examine": "Some helpful people have placed notes on here, how nice." + }, + { + "ids": "963", + "examine": "Essentials for a seamstress." + }, + { + "ids": "964,965", + "examine": "It really was this big!" + }, + { + "ids": "966", + "examine": "He doesn't look too jolly to me!" + }, + { + "ids": "967", + "examine": "Looks like this ship was way off course!" + }, + { + "ids": "968", + "examine": "X marks the spot." + }, + { + "ids": "969", + "examine": "Complete with authentic seaweed!" + }, + { + "ids": "970", + "examine": "This mentions the monk trapped here..." + }, + { + "ids": "971", + "examine": "A useful ranging device." + }, + { + "ids": "972", + "examine": "Use these with bows." + }, + { + "ids": "973", + "examine": "A powerful throwing weapon." + }, + { + "ids": "974", + "examine": "Improved Leather armour for archers." + }, + { + "ids": "975", + "examine": "Leather made from the skin of a Dragon." + }, + { + "ids": "993", + "examine": "I can climb over the fence with this.." + }, + { + "ids": "1004,1005", + "examine": "This section of railing has been broken" + }, + { + "ids": "1006,1007,1008,1009", + "examine": "There is a hole in this section of the railing." + }, + { + "ids": "1010", + "examine": "Someone was thirsty..." + }, + { + "ids": "1011,1012", + "examine": "Full of lovely drinks!" + }, + { + "ids": "1013", + "examine": "Storage for cookery items." + }, + { + "ids": "1014,1015,1016,1017,1018", + "examine": "Storage for all needs." + }, + { + "ids": "1019", + "examine": "What kind of sick person keeps a skull on their wall?" + }, + { + "ids": "1020", + "examine": "Esoteric artefacts." + }, + { + "ids": "1021,1022,1023", + "examine": "I don't want to know what's in those little urns." + }, + { + "ids": "1024", + "examine": "Used for storing things on." + }, + { + "ids": "1025,1026", + "examine": "Tailor made for needlework supplies" + }, + { + "ids": "1027", + "examine": "Prepared hides hang here drying." + }, + { + "ids": "1028,1029", + "examine": "This contains dye for leather." + }, + { + "ids": "1030,1031", + "examine": "Used to squeeze moisture from the hide." + }, + { + "ids": "1032", + "examine": "Danger!" + }, + { + "ids": "1033,1034,1035", + "examine": "This tells you which way is which." + }, + { + "ids": "1057", + "examine": "Ye olde Shrimp and Parrot." + }, + { + "ids": "1068", + "examine": "The Blue Moon Inn" + }, + { + "ids": "1069", + "examine": "The Jolly Boar" + }, + { + "ids": "1070", + "examine": "The Rusty Anchor" + }, + { + "ids": "1071", + "examine": "The Shrimp and Parrot" + }, + { + "ids": "1072", + "examine": "The Dead Man's Chest" + }, + { + "ids": "1073", + "examine": "The Rising Sun" + }, + { + "ids": "1074", + "examine": "The Forester's Arms" + }, + { + "ids": "1075", + "examine": "The Flying Horse" + }, + { + "ids": "1076", + "examine": "The Dancing Donkey" + }, + { + "ids": "1077", + "examine": "The Dragon Inn" + }, + { + "ids": "1078", + "examine": "Karamja Spirits bar" + }, + { + "ids": "1079", + "examine": "North to Varrock :: East to Al-Kharid." + }, + { + "ids": "1080", + "examine": "North road to Draynor Village :: East road to Varrock." + }, + { + "ids": "1081", + "examine": "North to Draynor Village." + }, + { + "ids": "1082", + "examine": "North to Draynor Manor :: West to Asgarnia." + }, + { + "ids": "1083", + "examine": "South to the Wizards' Tower :: East to Lumbridge." + }, + { + "ids": "1084", + "examine": "South to Lumbridge :: West to Varrock :: East to the Digsite." + }, + { + "ids": "1085", + "examine": "South to Al-Kharid :: West to Lumbridge :: East to the Digsite." + }, + { + "ids": "1086", + "examine": "North to Varrock :: East to the Digsite." + }, + { + "ids": "1087", + "examine": "South to the Wizards' Tower :: North to Draynor Village :: East to Lumbridge." + }, + { + "ids": "1088", + "examine": "The ideal thing to sit on." + }, + { + "ids": "1089", + "examine": "Not so good for sitting on." + }, + { + "ids": "1090,1091,1092", + "examine": "A comfortable seat." + }, + { + "ids": "1093,1094,1095", + "examine": "Good for sitting on." + }, + { + "ids": "1096", + "examine": "Good for rocking in!" + }, + { + "ids": "1097,1098,1099", + "examine": "A kingly seat for a royal behind." + }, + { + "ids": "1100,1101", + "examine": "The perfect way to sit at the bar." + }, + { + "ids": "1102", + "examine": "Good for sitting on." + }, + { + "ids": "1103", + "examine": "Gnomes sit on these." + }, + { + "ids": "1104", + "examine": "Gnomes are found sitting here." + }, + { + "ids": "1105", + "examine": "A kingly seat for a royal behind." + }, + { + "ids": "1106,1107", + "examine": "Sit back and relax..." + }, + { + "ids": "1108,1109", + "examine": "A kingly seat for a royal behind." + }, + { + "ids": "1110", + "examine": "Used for sitting on." + }, + { + "ids": "1111", + "examine": "Do I dare sit on this?" + }, + { + "ids": "1112", + "examine": "Church seating." + }, + { + "ids": "1113", + "examine": "Park it here..." + }, + { + "ids": "1114", + "examine": "Wouldn't like to sit on that for too long..." + }, + { + "ids": "1115", + "examine": "The ideal thing to sit on." + }, + { + "ids": "1116,1117", + "examine": "Keeps the neighbours out!" + }, + { + "ids": "1118", + "examine": "Found in wild areas." + }, + { + "ids": "1119", + "examine": "These are commonly found." + }, + { + "ids": "1120", + "examine": "An unusual bush." + }, + { + "ids": "1121", + "examine": "A wild bush." + }, + { + "ids": "1122,1123", + "examine": "All the leaves have fallen off." + }, + { + "ids": "1124,36782", + "examine": "A commonly found bush." + }, + { + "ids": "1125", + "examine": "Bushy!" + }, + { + "ids": "1126", + "examine": "A rose by any other name would still have prickly bits." + }, + { + "ids": "1144,1145,1146", + "examine": "A leafy bush." + }, + { + "ids": "1147,1148,1149", + "examine": "The abode of a fairy." + }, + { + "ids": "1150", + "examine": "Fairies need money too!" + }, + { + "ids": "1151", + "examine": "A fairy is selling items here." + }, + { + "ids": "1152", + "examine": "A small potted plant." + }, + { + "ids": "1153", + "examine": "Someone has planted this." + }, + { + "ids": "1154", + "examine": "A nicely potted fern." + }, + { + "ids": "1155", + "examine": "Better than weeding." + }, + { + "ids": "1156,1157", + "examine": "I bet bees like this." + }, + { + "ids": "1158,1159", + "examine": "A large potted plant." + }, + { + "ids": "1160", + "examine": "A plant in a bamboo pot." + }, + { + "ids": "1161", + "examine": "Cabbage... yuck!" + }, + { + "ids": "1162", + "examine": "Found near the water's edge." + }, + { + "ids": "1163,1164", + "examine": "Not good for eating." + }, + { + "ids": "1165", + "examine": "Fungal growth." + }, + { + "ids": "1166", + "examine": "Poisonous no doubt." + }, + { + "ids": "1167", + "examine": "Fungal growth." + }, + { + "ids": "1168,1169", + "examine": "Poisonous no doubt." + }, + { + "ids": "1170,1171,1172", + "examine": "I doubt that's edible." + }, + { + "ids": "1173", + "examine": "A commonly found fern." + }, + { + "ids": "1174", + "examine": "Spiky!" + }, + { + "ids": "1175", + "examine": "A home for frogs." + }, + { + "ids": "1176", + "examine": "Otherwise known as a lilypad." + }, + { + "ids": "1177", + "examine": "A home for frogs." + }, + { + "ids": "1178", + "examine": "Smells lovely!" + }, + { + "ids": "1179", + "examine": "Who is this Heather girl?" + }, + { + "ids": "1180", + "examine": "I wonder why it's purple?" + }, + { + "ids": "1181,1182,1183", + "examine": "I'd better not get stung." + }, + { + "ids": "1184", + "examine": "The tendrils of a creeping plant." + }, + { + "ids": "1185", + "examine": "Nicely planted." + }, + { + "ids": "1186", + "examine": "A large curling plant." + }, + { + "ids": "1187", + "examine": "That's pretty." + }, + { + "ids": "1188", + "examine": "Blooming!" + }, + { + "ids": "1189", + "examine": "Commonly found in grassy areas." + }, + { + "ids": "1190", + "examine": "Is this the biggest flower around?" + }, + { + "ids": "1191", + "examine": "These are huge!" + }, + { + "ids": "1192", + "examine": "A rare flower." + }, + { + "ids": "1193", + "examine": "Don't flowers make you feel better?" + }, + { + "ids": "1194", + "examine": "Can this talk?" + }, + { + "ids": "1195", + "examine": "You don't see that many of these." + }, + { + "ids": "1196", + "examine": "I wonder what these are?" + }, + { + "ids": "1197", + "examine": "A rarely found flower." + }, + { + "ids": "1198", + "examine": "Very rare flowers." + }, + { + "ids": "1199", + "examine": "These smell nice." + }, + { + "ids": "1200", + "examine": "A bed of red flowers." + }, + { + "ids": "1201", + "examine": "These are pretty." + }, + { + "ids": "1202", + "examine": "Found only in jungle areas." + }, + { + "ids": "1203", + "examine": "A very rare exotic flower." + }, + { + "ids": "1204", + "examine": "A small fernlike plant." + }, + { + "ids": "1205", + "examine": "The leaves of a nasty creeping plant." + }, + { + "ids": "1206,1207,1208", + "examine": "The flower of a nasty creeping plant." + }, + { + "ids": "1231", + "examine": "Nasty curling tendrils of a creeping plant." + }, + { + "ids": "1276", + "examine": "One of the most common trees in RuneScape." + }, + { + "ids": "1277", + "examine": "A healthy young tree." + }, + { + "ids": "1278,1279", + "examine": "A commonly found tree." + }, + { + "ids": "1280", + "examine": "A healthy young tree." + }, + { + "ids": "1281", + "examine": "A beautiful old oak." + }, + { + "ids": "1282,1283,1284", + "examine": "This tree has long been dead." + }, + { + "ids": "1285", + "examine": "An old weather beaten tree." + }, + { + "ids": "1286,1287,1288,1289,1290,1291", + "examine": "It's only useful for firewood now." + }, + { + "ids": "1292", + "examine": "An ancient magical tree." + }, + { + "ids": "1293,1294,1295", + "examine": "An ancient sentient tree." + }, + { + "ids": "1296", + "examine": "This tree has fallen to the ground." + }, + { + "ids": "1297", + "examine": "This tree was either the victim of weather or mankind." + }, + { + "ids": "1298", + "examine": "A commonly found fern." + }, + { + "ids": "1299", + "examine": "Is this a weed?" + }, + { + "ids": "1300", + "examine": "A fern is growing here." + }, + { + "ids": "1301", + "examine": "Home to many unusual creatures." + }, + { + "ids": "1302", + "examine": "A leafy tree." + }, + { + "ids": "1303,1304,1305", + "examine": "A tree found in tropical areas." + }, + { + "ids": "1306", + "examine": "The tree shimmers with a magical force." + }, + { + "ids": "1307", + "examine": "I bet this makes good syrup!" + }, + { + "ids": "1308", + "examine": "These trees are found near water." + }, + { + "ids": "1309", + "examine": "A splendid tree." + }, + { + "ids": "1310", + "examine": "This tree has vines hanging from it." + }, + { + "ids": "1311", + "examine": "This would be good to sleep under." + }, + { + "ids": "1312", + "examine": "An essential for tropical islands." + }, + { + "ids": "1313,1314", + "examine": "An unusual tree grows here." + }, + { + "ids": "1315,1316", + "examine": "A hardy evergreen tree." + }, + { + "ids": "1317", + "examine": "A young sentient tree." + }, + { + "ids": "1318,1319", + "examine": "This would make good firewood." + }, + { + "ids": "1320,1321", + "examine": "The branch is infested with moss." + }, + { + "ids": "1322", + "examine": "The trunk of this tree is hollow." + }, + { + "ids": "1323", + "examine": "A gnarly old tree root." + }, + { + "ids": "1324", + "examine": "The roots of a tree are exposed." + }, + { + "ids": "1325", + "examine": "I hope I don't trip over any of these." + }, + { + "ids": "1326,1327,1328", + "examine": "A terribly tall tropical tree." + }, + { + "ids": "1329", + "examine": "Leaves of a bamboo tree." + }, + { + "ids": "1330,1331,1332", + "examine": "It's thick with snow." + }, + { + "ids": "1333", + "examine": "This old tree has been taken over by parasitic plants." + }, + { + "ids": "1334,1335,1336,1337,1338", + "examine": "This old tree is rotting away." + }, + { + "ids": "1339,1340", + "examine": "They're just waiting to trip someone up." + }, + { + "ids": "1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359", + "examine": "This tree has been cut down." + }, + { + "ids": "1360,1361,1362", + "examine": "This tree contains dangerous insects no doubt." + }, + { + "ids": "1363,1364", + "examine": "They're just waiting to trip someone up." + }, + { + "ids": "1365", + "examine": "It's only useful for firewood now." + }, + { + "ids": "1366", + "examine": "A gnarly old tree root." + }, + { + "ids": "1367", + "examine": "The roots of this tree are exposed." + }, + { + "ids": "1368", + "examine": "I hope I don't trip over any of these." + }, + { + "ids": "1369", + "examine": "An unusual tree grows here." + }, + { + "ids": "1370", + "examine": "This old tree is rotting away." + }, + { + "ids": "1371,1372,1373,1374,1375,1376,1377", + "examine": "This tree contains dangerous insects no doubt." + }, + { + "ids": "1378,1379", + "examine": "This old tree is rotting away." + }, + { + "ids": "1380", + "examine": "A gnarly old tree root." + }, + { + "ids": "1381", + "examine": "The roots of this tree are exposed." + }, + { + "ids": "1382", + "examine": "I hope I don't trip over any of these." + }, + { + "ids": "1383", + "examine": "This tree has long been dead." + }, + { + "ids": "1384", + "examine": "It's only useful for firewood now." + }, + { + "ids": "1385", + "examine": "A gnarly old tree root." + }, + { + "ids": "1386", + "examine": "The roots of this tree are exposed." + }, + { + "ids": "1387", + "examine": "I hope I don't trip over any of these." + }, + { + "ids": "1388,1389", + "examine": "They're just waiting to trip someone up." + }, + { + "ids": "1390", + "examine": "Commonly found in these parts." + }, + { + "ids": "1391", + "examine": "A leafy plant." + }, + { + "ids": "1392", + "examine": "A leafy fern." + }, + { + "ids": "1393", + "examine": "A small bushy plant." + }, + { + "ids": "1394", + "examine": "A leafy shrub." + }, + { + "ids": "1395", + "examine": "No flies on me." + }, + { + "ids": "1396", + "examine": "How do these things manage to grow?" + }, + { + "ids": "1397", + "examine": "This cactus has recently had a chunk taken off." + }, + { + "ids": "1398", + "examine": "A leafy fern." + }, + { + "ids": "1399", + "examine": "This has broad leaves." + }, + { + "ids": "1400", + "examine": "A large waxy jungle plant." + }, + { + "ids": "1401", + "examine": "A type of jungle fern." + }, + { + "ids": "1402", + "examine": "A large waxy jungle plant." + }, + { + "ids": "1403,1404,1405,1406", + "examine": "How do these things manage to grow?" + }, + { + "ids": "1407", + "examine": "Leaves a nasty mark." + }, + { + "ids": "1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503", + "examine": "Looks spiky." + }, + { + "ids": "1504", + "examine": "The door is open." + }, + { + "ids": "1505", + "examine": "The door is closed." + }, + { + "ids": "1506,1507,1508,1509,1510,1511,1512,1513,1514,1515", + "examine": "A sturdy wooden door." + }, + { + "ids": "1516,1517,1518,1519,1520,1521,1522,1523,1524,1525", + "examine": "A large double door." + }, + { + "ids": "1526,1527,1528", + "examine": "The curtain is closed." + }, + { + "ids": "1529", + "examine": "The curtain is open." + }, + { + "ids": "1530", + "examine": "The door is closed." + }, + { + "ids": "1531,1532", + "examine": "The door is open." + }, + { + "ids": "1533,1534,1535", + "examine": "A nicely fitted door." + }, + { + "ids": "1536", + "examine": "An ornately-fashioned door." + }, + { + "ids": "1537,1538", + "examine": "An elf-fashioned door." + }, + { + "ids": "1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550", + "examine": "Solid bars of iron." + }, + { + "ids": "1551,1552,1553,1554,1555,1556", + "examine": "A wooden gate." + }, + { + "ids": "1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567", + "examine": "A wrought iron gate." + }, + { + "ids": "1568,1569", + "examine": "I wonder what's under it?" + }, + { + "ids": "1570,1571", + "examine": "I wonder what's down there?" + }, + { + "ids": "1572", + "examine": "This door has been boarded up." + }, + { + "ids": "1573,1574,1575,1576", + "examine": "A door to a grand place." + }, + { + "ids": "1577,1578,1579", + "examine": "The top of the archway." + }, + { + "ids": "1580,1581,1582", + "examine": "The base of the archway." + }, + { + "ids": "1583,1584,1585,1586,1587,1588", + "examine": "There is something strange about this wall..." + }, + { + "ids": "1589,1590", + "examine": "A wrought iron gate." + }, + { + "ids": "1591", + "examine": "The door is closed." + }, + { + "ids": "1592,1593", + "examine": "Something is strange about this panel." + }, + { + "ids": "1594", + "examine": "An entranceway into the dungeon." + }, + { + "ids": "1595", + "examine": "The way in." + }, + { + "ids": "1596,1597", + "examine": "A wrought iron gate." + }, + { + "ids": "1598,1599", + "examine": "A wooden gate." + }, + { + "ids": "1600", + "examine": "The doors to the Magic Guild." + }, + { + "ids": "1601,1602,1603,1604,1605,1606,1607,1608", + "examine": "The doors to the Magic guild." + }, + { + "ids": "1609,1610,1611,1612", + "examine": "A wooden structure used in the process of building." + }, + { + "ids": "1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660", + "examine": "This timber is broken" + }, + { + "ids": "1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721", + "examine": "A pile of bricks." + }, + { + "ids": "1722,36791", + "examine": "I can climb these stairs." + }, + { + "ids": "1723", + "examine": "They go down." + }, + { + "ids": "1724", + "examine": "I can climb down these stairs." + }, + { + "ids": "1725,36768", + "examine": "I can climb up this." + }, + { + "ids": "1726,1727,1728", + "examine": "I can climb down this." + }, + { + "ids": "1729", + "examine": "I can climb this." + }, + { + "ids": "1730", + "examine": "Dare I go up?" + }, + { + "ids": "1731,1732", + "examine": "These stairs look spooky!" + }, + { + "ids": "1733", + "examine": "I can use these stairs to climb down." + }, + { + "ids": "1734", + "examine": "I can climb these stairs." + }, + { + "ids": "1735", + "examine": "A rickety old staircase." + }, + { + "ids": "1736", + "examine": "I can climb down these stairs." + }, + { + "ids": "1737,1738", + "examine": "I can climb up these stairs." + }, + { + "ids": "1739", + "examine": "I can climb up or go down these stairs." + }, + { + "ids": "1740,1741", + "examine": "I can climb down these stairs." + }, + { + "ids": "1742", + "examine": "I can climb up these stairs." + }, + { + "ids": "1743", + "examine": "I can climb up or go down these stairs." + }, + { + "ids": "1744,1745", + "examine": "I can climb down these stairs." + }, + { + "ids": "1746", + "examine": "I can climb down this." + }, + { + "ids": "1747,1748", + "examine": "I can climb this." + }, + { + "ids": "1749", + "examine": "I can climb down this." + }, + { + "ids": "1750,1751", + "examine": "I can climb this." + }, + { + "ids": "1752", + "examine": "I can't climb this." + }, + { + "ids": "1753", + "examine": "It's useless." + }, + { + "ids": "1754", + "examine": "I can climb down this." + }, + { + "ids": "1755", + "examine": "I can climb this." + }, + { + "ids": "1756", + "examine": "I can climb down this." + }, + { + "ids": "1757", + "examine": "I can climb this." + }, + { + "ids": "1758", + "examine": "Not much use really." + }, + { + "ids": "1759", + "examine": "This leads downwards." + }, + { + "ids": "1760", + "examine": "These can be useful." + }, + { + "ids": "1761", + "examine": "Steps made from natural rock." + }, + { + "ids": "1762,1763,1764", + "examine": "A rope hangs here." + }, + { + "ids": "1765", + "examine": "I can climb down this." + }, + { + "ids": "1766", + "examine": "I can climb this." + }, + { + "ids": "1767", + "examine": "I can climb down this." + }, + { + "ids": "1768,1769,1770,1771,1772,1773,1774,1775,1776,1777", + "examine": "I can climb this." + }, + { + "ids": "1778", + "examine": "These huge stone discs grind grain to make flour." + }, + { + "ids": "1779,1780,1781", + "examine": "These sails use the wind to drive the windmill." + }, + { + "ids": "1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796", + "examine": "I'll need an empty pot so I can collect my flour." + }, + { + "ids": "1797,1798,1799,1800,1801,1802,1803", + "examine": "Some very hard rocks, I wouldn't want to fall on those." + }, + { + "ids": "1804", + "examine": "This door requires a key." + }, + { + "ids": "1805,1806,1807,1808,1809", + "examine": "The door to the Champions' Guild." + }, + { + "ids": "1810", + "examine": "Here be spiders!" + }, + { + "ids": "1811", + "examine": "I can walk through this tattered web." + }, + { + "ids": "1812", + "examine": "A magical border of teleportation." + }, + { + "ids": "1813", + "examine": "For putting things on." + }, + { + "ids": "1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851", + "examine": "I wonder what this does..." + }, + { + "ids": "1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863", + "examine": "This lets in more light." + }, + { + "ids": "1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875", + "examine": "These obviously mean keep out!" + }, + { + "ids": "1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895", + "examine": "I shudder to think what has taken place here." + }, + { + "ids": "1896", + "examine": "This hasn't seen a duster for a while." + }, + { + "ids": "1897", + "examine": "Not as nice as some." + }, + { + "ids": "1898,1899", + "examine": "This needs dusting before I'll sit on it." + }, + { + "ids": "1900", + "examine": "This could do with a bit of a spit and polish." + }, + { + "ids": "1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938", + "examine": "This clearly isn't used for dining very often." + }, + { + "ids": "1939,1940,1941,1942,1943,1944,1945,1946", + "examine": "A tower." + }, + { + "ids": "1947,1948", + "examine": "It looks like I might be able to climb over this piece of the wall..." + }, + { + "ids": "1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966", + "examine": "A pile of bricks." + }, + { + "ids": "1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984", + "examine": "A grand door for a grand tree." + }, + { + "ids": "1985,1986", + "examine": "A large root." + }, + { + "ids": "1987", + "examine": "A primitive looking boat." + }, + { + "ids": "1988", + "examine": "Oops!" + }, + { + "ids": "1989", + "examine": "A good source of books!" + }, + { + "ids": "1990", + "examine": "A wooden crate for storage." + }, + { + "ids": "1991", + "examine": "Solid bars of iron." + }, + { + "ids": "1992", + "examine": "There is an indent the size of a pebble in the stone's centre." + }, + { + "ids": "1993", + "examine": "A stone tomb surrounded by flowers." + }, + { + "ids": "1994,37016,37015", + "examine": "I wonder what's inside." + }, + { + "ids": "1995", + "examine": "Perhaps I should search it." + }, + { + "ids": "1996,1997", + "examine": "I should be safe if I can reach this." + }, + { + "ids": "1998", + "examine": "Wet rope." + }, + { + "ids": "1999", + "examine": "A wooden crate for storage." + }, + { + "ids": "2000,2001,2002,2003", + "examine": "An elf-fashioned door." + }, + { + "ids": "2004", + "examine": "The pillar has a rune shaped dent in it." + }, + { + "ids": "2005", + "examine": "A statue of Baxtorian chiselled in stone." + }, + { + "ids": "2006,2007,2008,2009", + "examine": "A statue of Glarial chiselled in stone." + }, + { + "ids": "2010,2011,2012", + "examine": "A ledge." + }, + { + "ids": "2013", + "examine": "Known commonly as Red worm vine." + }, + { + "ids": "2014", + "examine": "A magically elevated chalice full of tears." + }, + { + "ids": "2015,2016,2017,2018", + "examine": "A magically elevated chalice full of ash." + }, + { + "ids": "2019", + "examine": "A whirlpool." + }, + { + "ids": "2020,2021", + "examine": "It's too wet for firewood." + }, + { + "ids": "2022", + "examine": "A wooden barrel, maybe a way off this rock." + }, + { + "ids": "2023", + "examine": "An interesting tree with long straight branches." + }, + { + "ids": "2024", + "examine": "A large bubbling cauldron, smells... Ugh!" + }, + { + "ids": "2025", + "examine": "The door is closed." + }, + { + "ids": "2026,2027,2028,2029,2030,2031", + "examine": "I can see fish swimming in the water." + }, + { + "ids": "2032", + "examine": "It's closed." + }, + { + "ids": "2033", + "examine": "It's open." + }, + { + "ids": "2034", + "examine": "It's closed." + }, + { + "ids": "2035", + "examine": "It's open." + }, + { + "ids": "2036", + "examine": "It's closed." + }, + { + "ids": "2037", + "examine": "It's open." + }, + { + "ids": "2038", + "examine": "I've met less intelligent conversationalists." + }, + { + "ids": "2039,2040,2041,2042", + "examine": "It's closed." + }, + { + "ids": "2043", + "examine": "Something's bubbling away in it." + }, + { + "ids": "2044,2045,2046,2047", + "examine": "Like an animal dinner table." + }, + { + "ids": "2048,2049", + "examine": "It's a door." + }, + { + "ids": "2050,2051,2052,2053", + "examine": "A wooden gate." + }, + { + "ids": "2054,2055", + "examine": "It's a door." + }, + { + "ids": "2056", + "examine": "It's closed." + }, + { + "ids": "2057", + "examine": "It's open." + }, + { + "ids": "2058,2059,2060,2061,2062", + "examine": "It's closed." + }, + { + "ids": "2063", + "examine": "It's open." + }, + { + "ids": "2064", + "examine": "For storage." + }, + { + "ids": "2065", + "examine": "Used for climbing." + }, + { + "ids": "2066", + "examine": "A wall." + }, + { + "ids": "2067", + "examine": "A watchtower." + }, + { + "ids": "2068", + "examine": "A fence." + }, + { + "ids": "2069,2070", + "examine": "A closed door." + }, + { + "ids": "2071,2072", + "examine": "Used for storage." + }, + { + "ids": "2073,2074,2075,2076,2077,2078", + "examine": "Grows weird yellow fruit." + }, + { + "ids": "2079,2080", + "examine": "I wonder what's inside?" + }, + { + "ids": "2081,2082,2083,2084,2085,2086,2087,2088", + "examine": "Handy for boarding boats." + }, + { + "ids": "2089", + "examine": "Ornamental." + }, + { + "ids": "2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111", + "examine": "A rocky outcrop." + }, + { + "ids": "2112", + "examine": "The door is closed." + }, + { + "ids": "2113", + "examine": "I can climb down this." + }, + { + "ids": "2114", + "examine": "This transports coal!" + }, + { + "ids": "2115", + "examine": "The left hand side of the gate." + }, + { + "ids": "2116", + "examine": "The right hand side of the gate." + }, + { + "ids": "2117", + "examine": "It's an old wall." + }, + { + "ids": "2118", + "examine": "Lots of water swirling around" + }, + { + "ids": "2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140", + "examine": "A rocky outcrop." + }, + { + "ids": "2141", + "examine": "An open chest." + }, + { + "ids": "2142", + "examine": "An eerie glow permeates the cauldron." + }, + { + "ids": "2143,2144", + "examine": "Looks secure." + }, + { + "ids": "2145,2146", + "examine": "Ooooh! Spooky!" + }, + { + "ids": "2147", + "examine": "Going down?" + }, + { + "ids": "2148", + "examine": "Going up?" + }, + { + "ids": "2149", + "examine": "An imposing stone structure." + }, + { + "ids": "2150,2151,2152,2153", + "examine": "A column of elemental power." + }, + { + "ids": "2154,2155", + "examine": "A wrought iron gate." + }, + { + "ids": "2156,2157,2158", + "examine": "A magical portal of teleportation." + }, + { + "ids": "2159,2160,2161", + "examine": "It's a floating barrel." + }, + { + "ids": "2162,2163,2164,2165,2166", + "examine": "Smells like fish." + }, + { + "ids": "2167", + "examine": "Water is pouring in through the hole." + }, + { + "ids": "2168", + "examine": "A patch of swamp tar has bunged up the hole." + }, + { + "ids": "2169,2170,2171", + "examine": "There's a strong wind whipping up the sea." + }, + { + "ids": "2172,2173", + "examine": "A huge net to catch little fish." + }, + { + "ids": "2174", + "examine": "The upper deck can be accessed with this ladder." + }, + { + "ids": "2175", + "examine": "Back down to the main deck." + }, + { + "ids": "2176,2177", + "examine": "This old trawler has seen better days." + }, + { + "ids": "2178,2179", + "examine": "Handy for boarding boats." + }, + { + "ids": "2180,2181", + "examine": "It's a war machine." + }, + { + "ids": "2182", + "examine": "It can't hurt to just have a look, can it?" + }, + { + "ids": "2183", + "examine": "I wonder what is inside..." + }, + { + "ids": "2184", + "examine": "The door is closed." + }, + { + "ids": "2185", + "examine": "This wall has seen better days." + }, + { + "ids": "2186", + "examine": "Hmmm... I wonder if it's loose enough to get through." + }, + { + "ids": "2187", + "examine": "I can climb down this ladder." + }, + { + "ids": "2188,2189", + "examine": "I can climb up this ladder." + }, + { + "ids": "2190", + "examine": "I can climb down this ladder." + }, + { + "ids": "2191,2192,2193", + "examine": "I wonder what's inside?" + }, + { + "ids": "2194,2195,2196", + "examine": "Perhaps I should search it." + }, + { + "ids": "2197", + "examine": "I wonder what's inside?" + }, + { + "ids": "2198", + "examine": "Perhaps I should search it." + }, + { + "ids": "2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209", + "examine": "An old gate for locking up undesirables." + }, + { + "ids": "2210", + "examine": "Looking through it makes far off things look closer!" + }, + { + "ids": "2211", + "examine": "A weathered old gravestone." + }, + { + "ids": "2212", + "examine": "It's a sack!" + }, + { + "ids": "2213", + "examine": "The bank teller will serve you from here." + }, + { + "ids": "2214", + "examine": "This booth is for private customers only." + }, + { + "ids": "2215", + "examine": "This booth is closed." + }, + { + "ids": "2216", + "examine": "This looks like it's being used to block entrance to the village." + }, + { + "ids": "2217", + "examine": "Something seems to be buried under this." + }, + { + "ids": "2218,2219", + "examine": "A narrow fissure in the ground." + }, + { + "ids": "2220", + "examine": "A pile of rubble." + }, + { + "ids": "2221", + "examine": "A stone with some carvings on it." + }, + { + "ids": "2222", + "examine": "A pile of loose rocks." + }, + { + "ids": "2223", + "examine": "Probably nothing useful in these." + }, + { + "ids": "2224", + "examine": "A rotten and barely standing set of gallows." + }, + { + "ids": "2225", + "examine": "Wet rocks, it looks like you might be able to climb them." + }, + { + "ids": "2226", + "examine": "This table has seen better days." + }, + { + "ids": "2227,2228", + "examine": "A crudely constructed raft." + }, + { + "ids": "2229", + "examine": "A statue to mark Tai Bwo Wannai sacred grounds." + }, + { + "ids": "2230", + "examine": "A sturdy cart for travelling in." + }, + { + "ids": "2231,2232,2233", + "examine": "A rocky outcrop." + }, + { + "ids": "2234", + "examine": "Rocks that have been stacked at regular intervals." + }, + { + "ids": "2235", + "examine": "An ancient construct for supporting the bones of the deceased." + }, + { + "ids": "2236", + "examine": "I can climb the rocky outcrop." + }, + { + "ids": "2237", + "examine": "An exotic looking tree." + }, + { + "ids": "2238,2239", + "examine": "Large doors set into the hillside." + }, + { + "ids": "2240,2241", + "examine": "These doors must have been hidden here for years." + }, + { + "ids": "2242,2243", + "examine": "Perhaps you should give them a push." + }, + { + "ids": "2244", + "examine": "Commonly found in these parts." + }, + { + "ids": "2245", + "examine": "A leafy fern." + }, + { + "ids": "2246,2247,2248,2249,2250,2251,2252", + "examine": "Large carved tomb doors, they look terrifying." + }, + { + "ids": "2253,2254", + "examine": "Perhaps you should give them a push." + }, + { + "ids": "2255,2256", + "examine": "An ancient metal gate, but still pretty secure." + }, + { + "ids": "2257", + "examine": "A rocky outcrop." + }, + { + "ids": "2258", + "examine": "An ancient construct for supporting the bones of the deceased." + }, + { + "ids": "2259,2260,2261,2262,2263,2264", + "examine": "The gate is closed." + }, + { + "ids": "2265", + "examine": "A sturdy cart for travelling in." + }, + { + "ids": "2266,2267", + "examine": "The door is closed." + }, + { + "ids": "2268", + "examine": "This leads up to the sleeping area." + }, + { + "ids": "2269", + "examine": "This leads downwards." + }, + { + "ids": "2270", + "examine": "A jungle plant." + }, + { + "ids": "2271", + "examine": "I wonder what's inside?" + }, + { + "ids": "2272", + "examine": "It's open." + }, + { + "ids": "2273,2274", + "examine": "An odd-looking rock with a rope tied to it." + }, + { + "ids": "2275,2276,2277,2278", + "examine": "An odd-looking rock formation." + }, + { + "ids": "2279,2280,2281", + "examine": "Holds the rope up. Hopefuly." + }, + { + "ids": "2282,2283", + "examine": "Use this to swing over crevices." + }, + { + "ids": "2284,2285,2286", + "examine": "This must be climbed over." + }, + { + "ids": "2287,2288", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "2289", + "examine": "It's hollow..." + }, + { + "ids": "2290,2291,2292,2293", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "2294,2295,2296,2297", + "examine": "A slippery log I can walk across." + }, + { + "ids": "2298,2299,2300", + "examine": "The irregular surface can be climbed." + }, + { + "ids": "2301,2302", + "examine": "Tread carefully!" + }, + { + "ids": "2303", + "examine": "I can just about edge across here." + }, + { + "ids": "2304,2305,2306", + "examine": "Pointy!" + }, + { + "ids": "2307,2308", + "examine": "A wrought iron gate." + }, + { + "ids": "2309", + "examine": "Solid bars of iron." + }, + { + "ids": "2310", + "examine": "This tree has been cut down." + }, + { + "ids": "2311", + "examine": "I can jump from this stepping stone." + }, + { + "ids": "2312", + "examine": "I can balance on this rope." + }, + { + "ids": "2313", + "examine": "I can climb up this." + }, + { + "ids": "2314,2315", + "examine": "I can climb down here." + }, + { + "ids": "2316,36776", + "examine": "I can climb up these stairs." + }, + { + "ids": "2317", + "examine": "I can climb up these rocks to another cave." + }, + { + "ids": "2318", + "examine": "I can climb down these rocks to another cave." + }, + { + "ids": "2319,2320,2321", + "examine": "I can traverse these." + }, + { + "ids": "2322,2323,2324", + "examine": "Use this to swing across gaps." + }, + { + "ids": "2325", + "examine": "I can swing on this tree." + }, + { + "ids": "2326", + "examine": "A branch protrudes here." + }, + { + "ids": "2327", + "examine": "This tree has an unusually long branch on it." + }, + { + "ids": "2328,2329,2330,2331", + "examine": "A rocky outcrop." + }, + { + "ids": "2332", + "examine": "A nearly rotten wooden log that crosses the river." + }, + { + "ids": "2333,2334,2335", + "examine": "A rocky outcrop from the running water." + }, + { + "ids": "2336", + "examine": "You can see a cauldron directly below." + }, + { + "ids": "2337", + "examine": "This door is very sturdy looking." + }, + { + "ids": "2338", + "examine": "This door is closed." + }, + { + "ids": "2339,2340", + "examine": "This door is very sturdy looking." + }, + { + "ids": "2341", + "examine": "There is something strange about this wall..." + }, + { + "ids": "2342", + "examine": "Looks like a ventilation grill." + }, + { + "ids": "2343,2344,2345,2346,2347,2348,2349", + "examine": "A large stone block." + }, + { + "ids": "2350,2351", + "examine": "Used to move earth to, and from, the dig shaft." + }, + { + "ids": "2352,2353", + "examine": "This leads back up the dig shaft." + }, + { + "ids": "2354,2355,2356", + "examine": "Yep, they're sacks!" + }, + { + "ids": "2357,2358", + "examine": "A leafy bush." + }, + { + "ids": "2359", + "examine": "A sealed barrel with a warning sign on it." + }, + { + "ids": "2360", + "examine": "I wonder what's inside..." + }, + { + "ids": "2361", + "examine": "A sturdy chest to keep things in." + }, + { + "ids": "2362", + "examine": "A large stone block." + }, + { + "ids": "2363", + "examine": "A place where you can pan for gold." + }, + { + "ids": "2364,2365", + "examine": "A wooden container." + }, + { + "ids": "2366,2367,2368,2369,2370,2371", + "examine": "A signpost!" + }, + { + "ids": "2372", + "examine": "Shelves filled with interesting books." + }, + { + "ids": "2373,2374", + "examine": "A cupboard." + }, + { + "ids": "2375", + "examine": "Used to keep specimens on." + }, + { + "ids": "2376,2377,2378", + "examine": "Soil" + }, + { + "ids": "2379", + "examine": "Technically a bed." + }, + { + "ids": "2380", + "examine": "I wonder what's inside..." + }, + { + "ids": "2381,2382,2383,2384,2385,2386,2387,2388,2389,2390", + "examine": "Swampy dirt." + }, + { + "ids": "2391,2392", + "examine": "A very solid looking gate." + }, + { + "ids": "2393", + "examine": "Aim for the goal!" + }, + { + "ids": "2394,2395", + "examine": "A gate to the Gnomeball pitch." + }, + { + "ids": "2396", + "examine": "Distinctly feminine." + }, + { + "ids": "2397,2398,2399", + "examine": "A solid looking door." + }, + { + "ids": "2400,2401", + "examine": "Might be worth searching." + }, + { + "ids": "2402", + "examine": "A good source of books!" + }, + { + "ids": "2403,2404", + "examine": "Might be worth searching." + }, + { + "ids": "2405", + "examine": "I can climb this." + }, + { + "ids": "2406,2407", + "examine": "The door is closed." + }, + { + "ids": "2408", + "examine": "I can climb down this." + }, + { + "ids": "2409", + "examine": "A commonly found tree." + }, + { + "ids": "2410", + "examine": "I can climb this." + }, + { + "ids": "2411", + "examine": "The door is closed." + }, + { + "ids": "2412,2413,2414,2415", + "examine": "Handy for boarding the ship." + }, + { + "ids": "2416", + "examine": "Pull me!" + }, + { + "ids": "2417,2418,2419,2420", + "examine": "Place party drop items here." + }, + { + "ids": "2421", + "examine": "This lever is down." + }, + { + "ids": "2422", + "examine": "This lever is up." + }, + { + "ids": "2423", + "examine": "This lever is down." + }, + { + "ids": "2424", + "examine": "This lever is up." + }, + { + "ids": "2425", + "examine": "This lever is down." + }, + { + "ids": "2426", + "examine": "This lever is up." + }, + { + "ids": "2427,2428,2429,2430,2431", + "examine": "This door is closed by an unknown mechanism." + }, + { + "ids": "2432,2433", + "examine": "This gate is closed shut." + }, + { + "ids": "2434,2435", + "examine": "This may be worth opening." + }, + { + "ids": "2436,2437", + "examine": "I wonder what's inside." + }, + { + "ids": "2438,2439", + "examine": "A wooden gate." + }, + { + "ids": "2440,2441,2442,2443", + "examine": "Wonder what this pillar is for?" + }, + { + "ids": "2444,2445", + "examine": "I wonder what's under it?" + }, + { + "ids": "2446", + "examine": "This leads to somewhere...but where?" + }, + { + "ids": "2447,2448", + "examine": "I reckon I could climb that!" + }, + { + "ids": "2449,2450", + "examine": "Some magical rocks." + }, + { + "ids": "2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464", + "examine": "There's something behind these roots." + }, + { + "ids": "2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477", + "examine": "A portal from this mystical place." + }, + { + "ids": "2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,2490", + "examine": "A mysterious power emanates from this shrine." + }, + { + "ids": "2491", + "examine": "The source of all Rune Stones." + }, + { + "ids": "2492", + "examine": "A portal from this mystical place." + }, + { + "ids": "2493,2494,2495,2496", + "examine": "A part of an old temple." + }, + { + "ids": "2497,2498,2499,2500,2501,2502", + "examine": "Unusual energy is gathered here." + }, + { + "ids": "2503,2504,2505,2506,2507", + "examine": "An old crumbled pillar." + }, + { + "ids": "2508,2509,2510", + "examine": "Broken parts of an old temple." + }, + { + "ids": "2511", + "examine": "This leads to the practice tower." + }, + { + "ids": "2512", + "examine": "This leads back down to the guild." + }, + { + "ids": "2513", + "examine": "I wonder if I can hit a bullseye?" + }, + { + "ids": "2514", + "examine": "The door to the Ranging Guild." + }, + { + "ids": "2515", + "examine": "I hope it doesn't sink." + }, + { + "ids": "2516", + "examine": "It's sinking!" + }, + { + "ids": "2517", + "examine": "Going up?" + }, + { + "ids": "2518", + "examine": "Typical shoddy workmanship." + }, + { + "ids": "2519", + "examine": "Crates of packed fish." + }, + { + "ids": "2520,2521", + "examine": "It's used for loading and unloading fishing boats." + }, + { + "ids": "2522,2523", + "examine": "It's a flight of stairs." + }, + { + "ids": "2524", + "examine": "I wonder what's inside?" + }, + { + "ids": "2525", + "examine": "It's open." + }, + { + "ids": "2526,2527", + "examine": "The door of a small prison." + }, + { + "ids": "2528", + "examine": "The door is closed." + }, + { + "ids": "2529", + "examine": "A door." + }, + { + "ids": "2530", + "examine": "Used for storage." + }, + { + "ids": "2531,2532", + "examine": "Looks like someone's tried digging here." + }, + { + "ids": "2533", + "examine": "A pile of what is hopefully mud." + }, + { + "ids": "2534", + "examine": "There's black cross on the door." + }, + { + "ids": "2535", + "examine": "The door is closed." + }, + { + "ids": "2536", + "examine": "A door." + }, + { + "ids": "2537", + "examine": "The door is closed." + }, + { + "ids": "2538", + "examine": "A door." + }, + { + "ids": "2539,2540", + "examine": "A flight of stairs." + }, + { + "ids": "2541,2542", + "examine": "An outlet to the sewer." + }, + { + "ids": "2543", + "examine": "There's a cover over this manhole." + }, + { + "ids": "2544", + "examine": "How dangerous, someone has left this manhole open." + }, + { + "ids": "2545", + "examine": "This is supposed to stop people falling down the manhole." + }, + { + "ids": "2546,2547,2548,2549", + "examine": "A door." + }, + { + "ids": "2550,2551", + "examine": "A secure door." + }, + { + "ids": "2552,2553", + "examine": "A metal gate bars your way." + }, + { + "ids": "2554,2555,2556,2557,2558,2559", + "examine": "A secure door." + }, + { + "ids": "2560", + "examine": "Fine silk woven by experts." + }, + { + "ids": "2561", + "examine": "This stall smells great." + }, + { + "ids": "2562", + "examine": "Precious stones from around the world." + }, + { + "ids": "2563", + "examine": "All manner of animal clothing." + }, + { + "ids": "2564", + "examine": "Spices to tingle your taste buds." + }, + { + "ids": "2565", + "examine": "Fine silver items are for sale here." + }, + { + "ids": "2566,2567,2568,2569,2570,2571,2572,2573,2574", + "examine": "I wonder what's inside it." + }, + { + "ids": "2575,2576", + "examine": "A marshy jungle vine." + }, + { + "ids": "2577", + "examine": "A tall palm tree with some plants growing at its stem." + }, + { + "ids": "2578", + "examine": "A tall palm tree." + }, + { + "ids": "2579", + "examine": "The burnt ground has a plant growing on it." + }, + { + "ids": "2580", + "examine": "The ground has been burnt here by a fire." + }, + { + "ids": "2581", + "examine": "A rock with green moss growing on it." + }, + { + "ids": "2582", + "examine": "A rock, it looks like something was growing here." + }, + { + "ids": "2583", + "examine": "It looks as if it is covered in some fungus." + }, + { + "ids": "2584", + "examine": "A collection of rocks over what looks like a depression." + }, + { + "ids": "2585", + "examine": "Rocky walls, you may be able to climb it." + }, + { + "ids": "2586", + "examine": "It's closed." + }, + { + "ids": "2587", + "examine": "I wonder what's inside?" + }, + { + "ids": "2588", + "examine": "It's open." + }, + { + "ids": "2589", + "examine": "This ship's not getting far with that." + }, + { + "ids": "2590,2591", + "examine": "Takes me into the ship." + }, + { + "ids": "2592", + "examine": "Takes me back on deck." + }, + { + "ids": "2593,2594", + "examine": "Handy for boarding the ship." + }, + { + "ids": "2595", + "examine": "It's closed." + }, + { + "ids": "2596", + "examine": "A blood-red door." + }, + { + "ids": "2597", + "examine": "A lurid orange door." + }, + { + "ids": "2598", + "examine": "A sickly yellow door." + }, + { + "ids": "2599", + "examine": "A gloomy blue door." + }, + { + "ids": "2600", + "examine": "A groovy magenta door." + }, + { + "ids": "2601", + "examine": "A putrid green door." + }, + { + "ids": "2602", + "examine": "Probably the nicest door in this ghastly place." + }, + { + "ids": "2603", + "examine": "It's closed." + }, + { + "ids": "2604", + "examine": "It's open." + }, + { + "ids": "2605", + "examine": "It's a ladder." + }, + { + "ids": "2606", + "examine": "There is something strange about this wall..." + }, + { + "ids": "2607,2608", + "examine": "It's closed." + }, + { + "ids": "2609", + "examine": "A collection of rocks over what looks like a depression." + }, + { + "ids": "2610", + "examine": "A rope hangs here that I can climb." + }, + { + "ids": "2611", + "examine": "It's a ladder." + }, + { + "ids": "2612", + "examine": "Wonder what's in here..." + }, + { + "ids": "2613", + "examine": "Smells kind of funny..." + }, + { + "ids": "2614", + "examine": "Spooky!" + }, + { + "ids": "2615", + "examine": "Looks comfortable..." + }, + { + "ids": "2616", + "examine": "Looks spooky..." + }, + { + "ids": "2617", + "examine": "Phew, an exit!" + }, + { + "ids": "2618", + "examine": "The fence is broken at this point." + }, + { + "ids": "2619", + "examine": "A wooden barrel for storage." + }, + { + "ids": "2620", + "examine": "An old crate for storage." + }, + { + "ids": "2621,2622", + "examine": "It's a door." + }, + { + "ids": "2623", + "examine": "It's a gate." + }, + { + "ids": "2624,2625", + "examine": "The entrance to the Hero's Guild." + }, + { + "ids": "2626,2627,2628", + "examine": "It's a door." + }, + { + "ids": "2629", + "examine": "There is something unusual about this wall..." + }, + { + "ids": "2630", + "examine": "I can see eels swimming in the lava." + }, + { + "ids": "2631", + "examine": "It's a door." + }, + { + "ids": "2632", + "examine": "I wonder what's inside?" + }, + { + "ids": "2633", + "examine": "It's open." + }, + { + "ids": "2634", + "examine": "Rocks that contain nothing interesting, but block the way." + }, + { + "ids": "2635", + "examine": "I wonder what's inside?" + }, + { + "ids": "2636,2637", + "examine": "It's open." + }, + { + "ids": "2638,2639", + "examine": "A source of pure water." + }, + { + "ids": "2640", + "examine": "A shrine for the faithful to worship at." + }, + { + "ids": "2641", + "examine": "I can climb this." + }, + { + "ids": "2642", + "examine": "Used for fashioning clay items." + }, + { + "ids": "2643", + "examine": "Bake your clay items in here." + }, + { + "ids": "2644", + "examine": "Used for spinning thread." + }, + { + "ids": "2645", + "examine": "A tray of sand." + }, + { + "ids": "2646", + "examine": "A plant cultivated for fibres." + }, + { + "ids": "2647,2648,2649", + "examine": "The door to the Crafting Guild." + }, + { + "ids": "2650", + "examine": "A pile of smelly rotting waste." + }, + { + "ids": "2651", + "examine": "A sturdy home for bees." + }, + { + "ids": "2652", + "examine": "Looks like this is where waste from the kitchen comes out." + }, + { + "ids": "2653", + "examine": "It looks like a spiders' nest to me." + }, + { + "ids": "2654", + "examine": "This fountain suits the garden." + }, + { + "ids": "2655", + "examine": "It's the Sinclair Family coat of arms." + }, + { + "ids": "2656", + "examine": "Looks like this is where Anna keeps her stuff." + }, + { + "ids": "2657", + "examine": "Looks like this is where Bob keeps his stuff." + }, + { + "ids": "2658", + "examine": "Looks like this is where Carol keeps her stuff." + }, + { + "ids": "2659", + "examine": "Looks like this is where David keeps his stuff." + }, + { + "ids": "2660", + "examine": "Looks like this is where Elizabeth keeps her stuff." + }, + { + "ids": "2661", + "examine": "Looks like this is where Frank keeps his stuff." + }, + { + "ids": "2662", + "examine": "Looks like this is where the cook stores flour." + }, + { + "ids": "2663", + "examine": "Some sacks of general garden items." + }, + { + "ids": "2664,2665", + "examine": "Luckily it seems able to keep that vicious dog inside." + }, + { + "ids": "2666", + "examine": "Looks like the killer smashed this to leave the mansion." + }, + { + "ids": "2667", + "examine": "Slaves are using this to pull up barrels of rocks from down below." + }, + { + "ids": "2668,2669", + "examine": "Slaves are placing barrels on this to haul them to the surface." + }, + { + "ids": "2670", + "examine": "A succulent cactus." + }, + { + "ids": "2671", + "examine": "A less-than-succulent succulent." + }, + { + "ids": "2672", + "examine": "I can try to make new items on this." + }, + { + "ids": "2673,2674", + "examine": "A solid looking gate." + }, + { + "ids": "2675,2676", + "examine": "Large doors made of solid oak." + }, + { + "ids": "2677", + "examine": "A solid looking chest, it belongs to Captain Siad." + }, + { + "ids": "2678", + "examine": "A selection of Captain Siad's Books." + }, + { + "ids": "2679", + "examine": "A sturdy looking desk on which the Captain works." + }, + { + "ids": "2680", + "examine": "A barrel containing rocks and mining debris." + }, + { + "ids": "2681", + "examine": "An empty mining barrel." + }, + { + "ids": "2682", + "examine": "The cart which takes barrels of rocks from the mining encampment to Al-Kharid." + }, + { + "ids": "2683", + "examine": "Gives a lovely view of the desert, complete with metalic bars." + }, + { + "ids": "2684", + "examine": "It seems to be used for moving rocks into and out of this area." + }, + { + "ids": "2685,2686,2687,2688", + "examine": "A solid looking gate." + }, + { + "ids": "2689", + "examine": "There's no getting around it, it's a fairly sturdy prison cell door." + }, + { + "ids": "2690,2691", + "examine": "Large solid, thick set oak doors" + }, + { + "ids": "2692", + "examine": "It looks fairly sturdy." + }, + { + "ids": "2693", + "examine": "This is used by Shantay and his men to take items to the bank on your behalf." + }, + { + "ids": "2694,2695,2696,2697", + "examine": "A rocky rock." + }, + { + "ids": "2698,2699", + "examine": "A cave which has been mined out." + }, + { + "ids": "2700,2701", + "examine": "The entrance to the tent." + }, + { + "ids": "2702,2703", + "examine": "Tracks in the sand." + }, + { + "ids": "2704", + "examine": "Rocky!" + }, + { + "ids": "2705", + "examine": "It's a door." + }, + { + "ids": "2706", + "examine": "A nicely fitted door." + }, + { + "ids": "2707,2708", + "examine": "A wooden crate for storage." + }, + { + "ids": "2709", + "examine": "I wonder what's inside?" + }, + { + "ids": "2710", + "examine": "It's open." + }, + { + "ids": "2711", + "examine": "It's a flight of stairs." + }, + { + "ids": "2712", + "examine": "The door is closed." + }, + { + "ids": "2713,2714,2715,2716,2717", + "examine": "Grain goes in here." + }, + { + "ids": "2718,2719,2720,2721,2722", + "examine": "These control the flow of grain from the hopper to the millstones." + }, + { + "ids": "2723", + "examine": "A spicy meat kebab is cooking here." + }, + { + "ids": "2724", + "examine": "A fire burns brightly here." + }, + { + "ids": "2725,2726", + "examine": "A grand old fireplace." + }, + { + "ids": "2727", + "examine": "Something is cooking nicely here." + }, + { + "ids": "2728,2729,2730,2731", + "examine": "Ideal for cooking on." + }, + { + "ids": "2732,2733,2734,2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780", + "examine": "Hot!" + }, + { + "ids": "2781", + "examine": "A hot place for forging things in." + }, + { + "ids": "2782", + "examine": "It says \"Property of Doric the dwarf.\" on the side." + }, + { + "ids": "2783", + "examine": "Used for fashioning metal items." + }, + { + "ids": "2784", + "examine": "Various implements for working with metal." + }, + { + "ids": "2785", + "examine": "A hot place for forging things in." + }, + { + "ids": "2786,2787,2788,2789", + "examine": "An entrance to Gu'Tanoth." + }, + { + "ids": "2790", + "examine": "I wonder what's inside it." + }, + { + "ids": "2791,2792", + "examine": "A counter made from a stone block." + }, + { + "ids": "2793", + "examine": "An ogre is selling cakes here." + }, + { + "ids": "2794,2795", + "examine": "A lever for activating something." + }, + { + "ids": "2796", + "examine": "This leads to the watchtower." + }, + { + "ids": "2797", + "examine": "This leads downwards." + }, + { + "ids": "2798,2799,2800,2801,2802,2803", + "examine": "A leafy bush." + }, + { + "ids": "2804,2805,2806,2807,2808,2809,2810,2811", + "examine": "I think I can squeeze through here..." + }, + { + "ids": "2812", + "examine": "This leads downwards." + }, + { + "ids": "2813", + "examine": "I think I can squeeze through here..." + }, + { + "ids": "2814,2815", + "examine": "The gate has been locked shut." + }, + { + "ids": "2816", + "examine": "A strange looking rock..." + }, + { + "ids": "2817,2818,2819,2820,2821,2822", + "examine": "I think I can get out here..." + }, + { + "ids": "2823", + "examine": "A hole." + }, + { + "ids": "2824", + "examine": "A hole" + }, + { + "ids": "2825", + "examine": "I hope this leads the way out." + }, + { + "ids": "2826,2827,2828,2829", + "examine": "I wonder what's inside it?" + }, + { + "ids": "2830,2831", + "examine": "You can probably jump over from here." + }, + { + "ids": "2832", + "examine": "A low wall is blocking your path." + }, + { + "ids": "2833", + "examine": "This goes up!" + }, + { + "ids": "2834", + "examine": "A low wall is blocking your path." + }, + { + "ids": "2835,2836,2837,2838,2839,2840,2841", + "examine": "Looks hard." + }, + { + "ids": "2842", + "examine": "It has a special magical quality." + }, + { + "ids": "2843", + "examine": "This drain leads from the sink to the sewers below." + }, + { + "ids": "2844,2845,2846,2847,2848", + "examine": "This looks like it can be turned." + }, + { + "ids": "2849", + "examine": "A rudimentary type of boat." + }, + { + "ids": "2850", + "examine": "It's closed." + }, + { + "ids": "2851", + "examine": "It's open." + }, + { + "ids": "2852", + "examine": "I can probably squeeze my way inside there." + }, + { + "ids": "2853", + "examine": "It's a flight of stairs." + }, + { + "ids": "2854,2855", + "examine": "Made of wood." + }, + { + "ids": "2856", + "examine": "I wonder what's inside?" + }, + { + "ids": "2857", + "examine": "It's open." + }, + { + "ids": "2858", + "examine": "Used for storage." + }, + { + "ids": "2859", + "examine": "A hot range, where some soup is bubbling nicely." + }, + { + "ids": "2860", + "examine": "Very ominous." + }, + { + "ids": "2861,2862", + "examine": "It's a door." + }, + { + "ids": "2863", + "examine": "The door is closed." + }, + { + "ids": "2864", + "examine": "A water feature." + }, + { + "ids": "2865,2866", + "examine": "It's a gate." + }, + { + "ids": "2867", + "examine": "Very decorative!" + }, + { + "ids": "2868,2869", + "examine": "It's a cupboard." + }, + { + "ids": "2870", + "examine": "The mouse equivalent of a door." + }, + { + "ids": "2871", + "examine": "I can climb down this." + }, + { + "ids": "2872", + "examine": "I can climb this." + }, + { + "ids": "2873", + "examine": "What a good likeness!" + }, + { + "ids": "2874", + "examine": "A depiction that chills one to the bone." + }, + { + "ids": "2875", + "examine": "I wonder how accurate a representation this is." + }, + { + "ids": "2876", + "examine": "A counter made from a stone block." + }, + { + "ids": "2877", + "examine": "A barrel full of staffs..." + }, + { + "ids": "2878,2879", + "examine": "Patterns of light dance hypnotically across the pool's surface." + }, + { + "ids": "2880", + "examine": "There seems to be some sort of magical field here." + }, + { + "ids": "2881", + "examine": "It's closed." + }, + { + "ids": "2882,2883", + "examine": "The toll gate from Lumbridge to Al-Kharid." + }, + { + "ids": "2884", + "examine": "I can climb this." + }, + { + "ids": "2885", + "examine": "An antique by anyone's standards." + }, + { + "ids": "2886", + "examine": "An antique by anyone's standards, however, it might have something interesting in it." + }, + { + "ids": "2887", + "examine": "Looks good for logging." + }, + { + "ids": "2888", + "examine": "A leafy jungle palm, dense foliage." + }, + { + "ids": "2889", + "examine": "Home to many unusual creatures." + }, + { + "ids": "2890", + "examine": "A leafy tree." + }, + { + "ids": "2891", + "examine": "This tree has been cut down." + }, + { + "ids": "2892,2893", + "examine": "A jungle bush, quite common to these areas." + }, + { + "ids": "2894,2895", + "examine": "A jungle bush that has been chopped down." + }, + { + "ids": "2896,2897,2898,2899", + "examine": "A door to the Legends Guild." + }, + { + "ids": "2900,2901", + "examine": "Looks slippery!" + }, + { + "ids": "2902", + "examine": "Stoney!" + }, + { + "ids": "2903,2904", + "examine": "A rather shadowy cavern entrance." + }, + { + "ids": "2905", + "examine": "An old crate for storage." + }, + { + "ids": "2906", + "examine": "Useful for putting things on." + }, + { + "ids": "2907", + "examine": "I guess I could sleep in it if I was really tired." + }, + { + "ids": "2908,2909", + "examine": "A wall of magic fire." + }, + { + "ids": "2910", + "examine": "Rickety bamboo tables that are lashed together to make a desk." + }, + { + "ids": "2911", + "examine": "Bamboo storage!" + }, + { + "ids": "2912,2913,2914,2915", + "examine": "This gate has a horribly complex locking mechanism." + }, + { + "ids": "2916,2917", + "examine": "A dark cave entrance leading to the surface." + }, + { + "ids": "2918", + "examine": "A large crack in the wall." + }, + { + "ids": "2919,2920,2921", + "examine": "A huge lump of rock." + }, + { + "ids": "2922,2923,2924,2925", + "examine": "A heavily constructed, cast-iron, ancient gateway." + }, + { + "ids": "2926", + "examine": "A high wall made up of rocks with sharp edges." + }, + { + "ids": "2927", + "examine": "It looks like ancient graffiti." + }, + { + "ids": "2928", + "examine": "An ornately carved rock with a pointed receptacle." + }, + { + "ids": "2929", + "examine": "A half buried skeleton, probably dwarven remains." + }, + { + "ids": "2930", + "examine": "A huge, strangely constructed doorway, not sure how this opens." + }, + { + "ids": "2931", + "examine": "It looks like a magical portal of some kind, who knows where it leads?" + }, + { + "ids": "2932,2933", + "examine": "Strangely, there's a locked barrel here, I wonder what's inside." + }, + { + "ids": "2934", + "examine": "A large scaffold platform most likely used for lifting and lowering heavy items." + }, + { + "ids": "2935", + "examine": "Used to move earth to, and from, the dig shaft. A rope has been thrown over it." + }, + { + "ids": "2936,2937,2938,2939", + "examine": "A sculpted trunk of wood." + }, + { + "ids": "2940", + "examine": "A wonderfully dressed table." + }, + { + "ids": "2941", + "examine": "Sparkling sacred water straight from the source." + }, + { + "ids": "2942", + "examine": "A sparkling, babbling flow of water from an underground source." + }, + { + "ids": "2943", + "examine": "Disgusting filthy quagmire that oozes from the ground." + }, + { + "ids": "2944", + "examine": "Found near the water's edge." + }, + { + "ids": "2945", + "examine": "A baby Yommi tree, it has a mystical aura." + }, + { + "ids": "2946", + "examine": "An adolescent-looking Yommi tree, it has a mystical aura." + }, + { + "ids": "2947", + "examine": "A dead Yommi tree sapling, you'll need a tough axe to remove this." + }, + { + "ids": "2948", + "examine": "A fully grown Yommi tree, it won't get much taller than this." + }, + { + "ids": "2949", + "examine": "A dead fully grown Yommi tree, you'll need a tough, sharp axe to remove this." + }, + { + "ids": "2950", + "examine": "A felled adult Yommi tree, perhaps you should trim those branches?" + }, + { + "ids": "2951", + "examine": "A rotten felled Yommi tree, it was left too long in the damp jungle." + }, + { + "ids": "2952", + "examine": "A trimmed Yommi tree log, perfect for sculpting into a totem pole." + }, + { + "ids": "2953", + "examine": "A rotten Yommi tree log, it was left too long in the damp jungle air." + }, + { + "ids": "2954", + "examine": "A beautifully crafted totem pole carved from the trunk of the sacred Yommi tree." + }, + { + "ids": "2955", + "examine": "A rotten totem pole, it was left to rot in the jungle." + }, + { + "ids": "2956", + "examine": "This earth is particularly fertile." + }, + { + "ids": "2957", + "examine": "This earth is damaged by cultivation, time will restore the fertility." + }, + { + "ids": "2958", + "examine": "A rope hangs here." + }, + { + "ids": "2959,2960,2961", + "examine": "A dangerous path onwards." + }, + { + "ids": "2962,2963,2964", + "examine": "Stoney!" + }, + { + "ids": "2965", + "examine": "Looks slippery!" + }, + { + "ids": "2966,2967,2968", + "examine": "A hot place for forging things in." + }, + { + "ids": "2969", + "examine": "It looks like a strangely shaped depression in the rock." + }, + { + "ids": "2970", + "examine": "This recess has a glowing heart shaped crystal in it." + }, + { + "ids": "2971", + "examine": "This looks like some sort of shimmering surface." + }, + { + "ids": "2972,2973,2974", + "examine": "A huge lump of rock." + }, + { + "ids": "2975,2976", + "examine": "This tree is particularly leafy." + }, + { + "ids": "2977", + "examine": "A large pile of sand" + }, + { + "ids": "2978", + "examine": "A medium pile of sand" + }, + { + "ids": "2979", + "examine": "A small pile of sand" + }, + { + "ids": "2980,2981,2982,2983,2984,2985,2986,2987,2988", + "examine": "Some beautiful flowers." + }, + { + "ids": "2989,2990,2991,2992,2993,2994", + "examine": "Known commonly as Red worm vine." + }, + { + "ids": "2995,2996", + "examine": "I wonder what's inside." + }, + { + "ids": "2997", + "examine": "The door is closed." + }, + { + "ids": "2998,2999", + "examine": "The door is open." + }, + { + "ids": "3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3013", + "examine": "These obviously mean keep out!" + }, + { + "ids": "3014", + "examine": "A nicely fitted door." + }, + { + "ids": "3015,3016", + "examine": "A wooden gate." + }, + { + "ids": "3017,3018,3019", + "examine": "A nicely fitted door." + }, + { + "ids": "3020,3021,3022,3023", + "examine": "A wrought iron gate." + }, + { + "ids": "3024,3025,3026,3027", + "examine": "A closed door." + }, + { + "ids": "3028", + "examine": "I can climb this." + }, + { + "ids": "3029", + "examine": "I can climb down this." + }, + { + "ids": "3030", + "examine": "I can climb this." + }, + { + "ids": "3031", + "examine": "I can climb down this." + }, + { + "ids": "3032", + "examine": "I can see fish swimming in the water." + }, + { + "ids": "3033,3034,3035,3036", + "examine": "One of the most common trees in RuneScape." + }, + { + "ids": "3037", + "examine": "A beautiful old oak." + }, + { + "ids": "3038", + "examine": "Hot!" + }, + { + "ids": "3039", + "examine": "Ideal for cooking on." + }, + { + "ids": "3040", + "examine": "It's closed." + }, + { + "ids": "3041", + "examine": "It's open." + }, + { + "ids": "3042,3043", + "examine": "A rocky outcrop." + }, + { + "ids": "3044", + "examine": "A hot place for forging things in." + }, + { + "ids": "3045", + "examine": "The bank teller will serve you from here." + }, + { + "ids": "3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074,3075,3076", + "examine": "These obviously mean keep out!" + }, + { + "ids": "3077,3078,3079,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107", + "examine": "Lean against the wall to get a better view!" + }, + { + "ids": "3108,3109,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158", + "examine": "Flags marking the entrance to the arena." + }, + { + "ids": "3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177,3178,3179,3180,3181", + "examine": "Beats the operating table." + }, + { + "ids": "3182", + "examine": "Wait here for a nurse." + }, + { + "ids": "3183,3184,3185", + "examine": "Storage for drugs and bandages." + }, + { + "ids": "3186,3187,3188,3189", + "examine": "I don't really want to end up here..." + }, + { + "ids": "3190", + "examine": "These open and close!" + }, + { + "ids": "3191", + "examine": "This may be worth searching." + }, + { + "ids": "3192", + "examine": "You can see the last 50 fights on here." + }, + { + "ids": "3193", + "examine": "Used to store players' items whilst they duel." + }, + { + "ids": "3194", + "examine": "Use for quick access to your bank." + }, + { + "ids": "3195", + "examine": "Smells pretty bad!" + }, + { + "ids": "3196", + "examine": "Not much use for anything except scrap." + }, + { + "ids": "3197,3198", + "examine": "Entrance to the Duel Arena." + }, + { + "ids": "3199,3200,3201,3202", + "examine": "A wooden double bed." + }, + { + "ids": "3203,3204", + "examine": "Access to the duel arena." + }, + { + "ids": "3205", + "examine": "I can climb down this." + }, + { + "ids": "3206,3207,3208", + "examine": "A barrel full of staffs..." + }, + { + "ids": "3209,3210,3211,3212", + "examine": "A strange crack cuts into the wall." + }, + { + "ids": "3213", + "examine": "It looks like I can squeeze through here." + }, + { + "ids": "3214,3215", + "examine": "The easy way out..." + }, + { + "ids": "3216", + "examine": "A pile of mud." + }, + { + "ids": "3217", + "examine": "I can go through here." + }, + { + "ids": "3218,3219", + "examine": "Dark and intimidating." + }, + { + "ids": "3220,3221", + "examine": "That skull's looking at me...." + }, + { + "ids": "3222", + "examine": "I can climb down these." + }, + { + "ids": "3223", + "examine": "I can climb up these." + }, + { + "ids": "3224,3225,3226", + "examine": "I can go through here." + }, + { + "ids": "3227", + "examine": "Best not to get caught!" + }, + { + "ids": "3228,3229", + "examine": "Best avoided." + }, + { + "ids": "3230", + "examine": "Looks suspicious." + }, + { + "ids": "3231", + "examine": "A plank." + }, + { + "ids": "3232", + "examine": "Formed over many years." + }, + { + "ids": "3233", + "examine": "Best avoided." + }, + { + "ids": "3234", + "examine": "Looks suspicious." + }, + { + "ids": "3235", + "examine": "I can open the grill from this side." + }, + { + "ids": "3236,3237", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "3238", + "examine": "Maybe I can cross that." + }, + { + "ids": "3239", + "examine": "It looks like only the guide ropes are holding the bridge up." + }, + { + "ids": "3240", + "examine": "A bridge." + }, + { + "ids": "3241,3242", + "examine": "This lever can be operated." + }, + { + "ids": "3243,3244,3245,3246", + "examine": "The base of a platform." + }, + { + "ids": "3247,3248,3249,3250,3251,3252,3253", + "examine": "A bridge." + }, + { + "ids": "3254,3255,3256", + "examine": "I can't get past that very easily..." + }, + { + "ids": "3257", + "examine": "A platform." + }, + { + "ids": "3258,3259,3260,3261,3262", + "examine": "A bridge." + }, + { + "ids": "3263", + "examine": "This area may not be safe..." + }, + { + "ids": "3264", + "examine": "A well of nastiness." + }, + { + "ids": "3265", + "examine": "I can climb this pile of rocks..." + }, + { + "ids": "3266,3267,3268,3269", + "examine": "Usually used for storing living things..." + }, + { + "ids": "3270", + "examine": "The door is closed." + }, + { + "ids": "3271", + "examine": "The door is open." + }, + { + "ids": "3272,3273,3274,3275", + "examine": "I wonder what's inside." + }, + { + "ids": "3276,3277,3278,3279,3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293", + "examine": "A stone bridge." + }, + { + "ids": "3294", + "examine": "A hot place for forging things in." + }, + { + "ids": "3295,3296,3297,3298,3299,3300,3301,3302", + "examine": "It's covered in strange writing." + }, + { + "ids": "3303", + "examine": "You won't be able to lift that." + }, + { + "ids": "3304", + "examine": "A portcullis." + }, + { + "ids": "3305,3306", + "examine": "It doesn't look like water in there..." + }, + { + "ids": "3307", + "examine": "A pile of rocks." + }, + { + "ids": "3308", + "examine": "The boulder has smashed through the cage." + }, + { + "ids": "3309,3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326", + "examine": "A deposit of rocks." + }, + { + "ids": "3327", + "examine": "Intimidating!" + }, + { + "ids": "3328,3329,3330,3331", + "examine": "A depiction of a great dwarf miner." + }, + { + "ids": "3332", + "examine": "A temple door." + }, + { + "ids": "3333,3334,3335,3336", + "examine": "A very big door." + }, + { + "ids": "3337", + "examine": "This lever can be operated." + }, + { + "ids": "3338", + "examine": "Why would a log be hung up there?" + }, + { + "ids": "3339", + "examine": "Looks suspicious." + }, + { + "ids": "3340", + "examine": "Looks like the rope is holding the bridge up." + }, + { + "ids": "3341,3342", + "examine": "Looks like the other rope is holding the bridge up." + }, + { + "ids": "3343", + "examine": "A pile of rocks." + }, + { + "ids": "3344,3345,3346,3347", + "examine": "It's got dwarf brew in it." + }, + { + "ids": "3348,3349,3350", + "examine": "Lord Iban's Throne." + }, + { + "ids": "3351,3352", + "examine": "I'm glad I'm on this side of those bars." + }, + { + "ids": "3353,3354,3355,3356,3357,3358", + "examine": "I don't much like the look of that..." + }, + { + "ids": "3359", + "examine": "Well of the damned." + }, + { + "ids": "3360", + "examine": "A wooden crate for storage." + }, + { + "ids": "3361", + "examine": "A magical sphere that glimmers within." + }, + { + "ids": "3362,3363", + "examine": "A window." + }, + { + "ids": "3364", + "examine": "An odd looking rock formation." + }, + { + "ids": "3365", + "examine": "Looks like I can climb these." + }, + { + "ids": "3366", + "examine": "Makes you cry." + }, + { + "ids": "3367,3368,3369,3370", + "examine": "Steel bars that are locked securely." + }, + { + "ids": "3371", + "examine": "An Achey tree stump." + }, + { + "ids": "3372,3373,3374,3375", + "examine": "Useful for ogre dinners." + }, + { + "ids": "3376", + "examine": "An ogre bench, useful for taking all that weight off their legs." + }, + { + "ids": "3377", + "examine": "Hmmm, a rock for a lock...." + }, + { + "ids": "3378", + "examine": "Some stealthy thief must have picked the ogre lock!" + }, + { + "ids": "3379", + "examine": "The entrance to Rantz's cave" + }, + { + "ids": "3380,3381", + "examine": "Exit this way for fresh air and daylight." + }, + { + "ids": "3382,3383,3384,3385,3386,3387,3388", + "examine": "Useful for ogre dinners." + }, + { + "ids": "3389", + "examine": "A good source of books!" + }, + { + "ids": "3390,3391,3392,3393", + "examine": "A strange crack cuts into the wall." + }, + { + "ids": "3394,3395", + "examine": "A wooden crate for storage." + }, + { + "ids": "3396,3397", + "examine": "A pile of boxes for storage." + }, + { + "ids": "3398,3399,3400,3401", + "examine": "A wooden crate for storage." + }, + { + "ids": "3402", + "examine": "Used for fashioning metal items." + }, + { + "ids": "3403", + "examine": "A pile of Elemental rock." + }, + { + "ids": "3404,3405", + "examine": "A valve to start and stop the flow of water." + }, + { + "ids": "3406", + "examine": "This lever can be operated." + }, + { + "ids": "3407,3408", + "examine": "It spins." + }, + { + "ids": "3409", + "examine": "This lever can be operated." + }, + { + "ids": "3410,3411,3412", + "examine": "Big bellows." + }, + { + "ids": "3413", + "examine": "A furnace with an air blast pipe." + }, + { + "ids": "3414", + "examine": "A small trough full of lava." + }, + { + "ids": "3415", + "examine": "I can climb down these stairs." + }, + { + "ids": "3416", + "examine": "I can climb up these stairs." + }, + { + "ids": "3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428", + "examine": "This lever can be operated." + }, + { + "ids": "3429,3430", + "examine": "Water powered machinery." + }, + { + "ids": "3431", + "examine": "Stoney!" + }, + { + "ids": "3432", + "examine": "I wonder what's under it?" + }, + { + "ids": "3433,3434,3435,3436,3437,3438,3439", + "examine": "I can see a holy barrier at the bottom." + }, + { + "ids": "3440", + "examine": "They let you walk up them!" + }, + { + "ids": "3441,3442", + "examine": "They let you walk down them!" + }, + { + "ids": "3443", + "examine": "A holy barrier blocking evil forces." + }, + { + "ids": "3444,3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,3460,3461,3462", + "examine": "A sturdy metal gate." + }, + { + "ids": "3463,3464,3465", + "examine": "A hastily constructed yet sturdy prison door." + }, + { + "ids": "3466", + "examine": "Dead animal parts dangling!" + }, + { + "ids": "3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478", + "examine": "So how long has this been dead, then?" + }, + { + "ids": "3479", + "examine": "A statue honouring Saradomin." + }, + { + "ids": "3480,3481,3482,3483,3484", + "examine": "An ornately decorated coffin. Something seems to be alive inside." + }, + { + "ids": "3485,3486,3487,3488", + "examine": "An ornately carved well that draws water from the river Salve." + }, + { + "ids": "3489,3490,3491,3492", + "examine": "Sturdy looking door." + }, + { + "ids": "3493,3494,3495,3496,3497,3498,3499", + "examine": "A monument to a fallen priest." + }, + { + "ids": "3500,3501,3502,3503,3504,3505", + "examine": "With skill I can play this." + }, + { + "ids": "3506,3507", + "examine": "A wrought iron gate." + }, + { + "ids": "3508,3509", + "examine": "Not sure if I should sit on that." + }, + { + "ids": "3510,3511", + "examine": "Not sure if that's any use." + }, + { + "ids": "3512,3513", + "examine": "It'll probably die soon." + }, + { + "ids": "3514,3515", + "examine": "Not sure if I should stand under that." + }, + { + "ids": "3516", + "examine": "A dark dank entrance to below.." + }, + { + "ids": "3517,3518,3519", + "examine": "A large tree thriving where trees normally die." + }, + { + "ids": "3520", + "examine": "Special grotto area." + }, + { + "ids": "3521", + "examine": "A grotto transformed into an altar of nature." + }, + { + "ids": "3522", + "examine": "It's a bridge." + }, + { + "ids": "3523,3524", + "examine": "An old bench, probably made from wood in this swamp." + }, + { + "ids": "3525", + "examine": "The door." + }, + { + "ids": "3526", + "examine": "The green door." + }, + { + "ids": "3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545", + "examine": "A roughly hewn stone with some sort of symbol on it." + }, + { + "ids": "3546,3547,3548,3549,3550", + "examine": "There is a rope leading to the bottom of this well." + }, + { + "ids": "3551,3552", + "examine": "I can balance on this rope." + }, + { + "ids": "3553,3554,3555,3556,3557,3558", + "examine": "I can balance on this log." + }, + { + "ids": "3559,3560,3561,3562", + "examine": "Tread carefully!" + }, + { + "ids": "3563,3564", + "examine": "Now, I'm the king of the swingers, oh, the jungle VIP." + }, + { + "ids": "3565", + "examine": "It looks like I can clamber over this." + }, + { + "ids": "3566", + "examine": "Use this to swing over to the next platform." + }, + { + "ids": "3567,3568,3569", + "examine": "I might want to avoid this nasty blade." + }, + { + "ids": "3570,3571,3572,3573,3574,3575,3576,3577", + "examine": "Walk the plank! Ya land lubber!" + }, + { + "ids": "3578,3579", + "examine": "It's a small step for a player, a giant leap for player kind." + }, + { + "ids": "3580", + "examine": "Makes sliced human." + }, + { + "ids": "3581", + "examine": "Releases a ticket when the flashing arrow is above it." + }, + { + "ids": "3582", + "examine": "Makes human colanders." + }, + { + "ids": "3583,3584", + "examine": "I can use these to climb across to the other side." + }, + { + "ids": "3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607", + "examine": "Looks suspiciously like a pressure pad to me." + }, + { + "ids": "3608,3609", + "examine": "Releases a ticket when the flashing arrow is above it." + }, + { + "ids": "3610,3611,3612,3613,3614,3615,3616", + "examine": "I can use this rope to climb back to the top." + }, + { + "ids": "3617", + "examine": "Leads down into the Agility Arena." + }, + { + "ids": "3618,3619,3620,3621,3622,3623,3624,3625", + "examine": "Leads back to Brimhaven." + }, + { + "ids": "3626,3627,3628,3629,3630,3631,3632,3633", + "examine": "It looks very sturdy." + }, + { + "ids": "3634", + "examine": "A shrine of the gods!" + }, + { + "ids": "3635", + "examine": "I wonder what's inside..." + }, + { + "ids": "3636,3637,3638,3639,3640,3641,3642,3643", + "examine": "It looks empty." + }, + { + "ids": "3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661", + "examine": "That's really bright!" + }, + { + "ids": "3662,3663,3664", + "examine": "Smells more like \"innocent villager\" stew to me..." + }, + { + "ids": "3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675", + "examine": "Troll leftovers..." + }, + { + "ids": "3676,3677,3678", + "examine": "A stone mechanism that unlocks the equipment room." + }, + { + "ids": "3679", + "examine": "A standard of Asgarnia." + }, + { + "ids": "3680", + "examine": "The flag of Asgarnia." + }, + { + "ids": "3681,3682,3683,3684", + "examine": "Town of Burthorpe" + }, + { + "ids": "3685,3686,3687,3688,3689,3690,3691", + "examine": "A pile of boxes for storage." + }, + { + "ids": "3692,3693", + "examine": "Some of the Sherpa's climbing rope." + }, + { + "ids": "3694,3695", + "examine": "Looks like the Imperial Guard's supply of Dual Claws." + }, + { + "ids": "3696", + "examine": "The Imperial Guard's ceremonial armour." + }, + { + "ids": "3697,3698,3699,3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,3715,3716,3717,3718,3719,3720,3721", + "examine": "A barrel full of swords..." + }, + { + "ids": "3722,3723,3724", + "examine": "A rocky outcrop." + }, + { + "ids": "3725,3726,3727,3728,3729", + "examine": "A wooden gate." + }, + { + "ids": "3730,3731,3732,3733,3734", + "examine": "I can climb over the fence with this." + }, + { + "ids": "3735", + "examine": "Looks like a small cave." + }, + { + "ids": "3736,3737,3738,3739,3740", + "examine": "The exit to the outside." + }, + { + "ids": "3741", + "examine": "No solicitors!" + }, + { + "ids": "3742", + "examine": "Danger" + }, + { + "ids": "3743,3744", + "examine": "A sturdy wooden door." + }, + { + "ids": "3745,3746", + "examine": "The door is closed." + }, + { + "ids": "3747", + "examine": "A nicely fitted door." + }, + { + "ids": "3748,3749,3750,3751", + "examine": "A rocky outcrop." + }, + { + "ids": "3752,3753,3754,3755,3756", + "examine": "Unusual energy is gathered here." + }, + { + "ids": "3757", + "examine": "Looks like a small cave." + }, + { + "ids": "3758", + "examine": "The way out." + }, + { + "ids": "3759", + "examine": "Looks like a small cave." + }, + { + "ids": "3760", + "examine": "The way out." + }, + { + "ids": "3761", + "examine": "The back way out." + }, + { + "ids": "3762", + "examine": "The back way into the stronghold." + }, + { + "ids": "3763", + "examine": "The door is closed." + }, + { + "ids": "3764", + "examine": "The door is open." + }, + { + "ids": "3765,3766", + "examine": "The door to Mad Eadgar's cell." + }, + { + "ids": "3767,3768", + "examine": "The door to Godric's cell." + }, + { + "ids": "3769", + "examine": "Hot!" + }, + { + "ids": "3770", + "examine": "This window looks down onto the Troll Camp." + }, + { + "ids": "3771", + "examine": "The entrance to the Troll Stronghold." + }, + { + "ids": "3772,3773,3774", + "examine": "The way out of the Troll Stronghold." + }, + { + "ids": "3775", + "examine": "Looks like stew of some kind..." + }, + { + "ids": "3776,3777,3778,3779", + "examine": "A door in the Stronghold." + }, + { + "ids": "3780,3781", + "examine": "The door to the prison." + }, + { + "ids": "3782,3783,3784", + "examine": "The entrance to the Troll Arena." + }, + { + "ids": "3785,3786,3787", + "examine": "The exit to the Troll Arena." + }, + { + "ids": "3788", + "examine": "I can climb these stairs." + }, + { + "ids": "3789", + "examine": "They go down." + }, + { + "ids": "3790,3791,3792,3793", + "examine": "A rocky outcrop." + }, + { + "ids": "3794,3795,3796", + "examine": "Looks tasty! If you're a goat, that is." + }, + { + "ids": "3797", + "examine": "Now that's what I call slimline!" + }, + { + "ids": "3798", + "examine": "He looks very relaxed." + }, + { + "ids": "3799", + "examine": "Now he's just too thin." + }, + { + "ids": "3800", + "examine": "A counter made from a stone block." + }, + { + "ids": "3801", + "examine": "The ideal thing to sit on." + }, + { + "ids": "3802", + "examine": "Not so good for sitting on." + }, + { + "ids": "3803,3804", + "examine": "A rocky outcrop." + }, + { + "ids": "3805", + "examine": "They don't seem to roll." + }, + { + "ids": "3806", + "examine": "They're troll eggs. Or perhaps rocks." + }, + { + "ids": "3807", + "examine": "These make great pets." + }, + { + "ids": "3808,3809", + "examine": "It's a troll! Run! No, wait, it's just a rock." + }, + { + "ids": "3810,3811,3812", + "examine": "The door to the storeroom." + }, + { + "ids": "3813", + "examine": "It probably hasn't got anything interesting inside." + }, + { + "ids": "3814,3815", + "examine": "They probably haven't got anything interesting inside." + }, + { + "ids": "3816", + "examine": "They're closed." + }, + { + "ids": "3817,3818,3819", + "examine": "They're open." + }, + { + "ids": "3820", + "examine": "It doesn't contain anything particularly appetising." + }, + { + "ids": "3821", + "examine": "Makes you taller." + }, + { + "ids": "3822", + "examine": "It's full of dried goutweed." + }, + { + "ids": "3823", + "examine": "Welcome to Mad Eadgar's! If I'm not in, I've probably been captured again." + }, + { + "ids": "3824", + "examine": "I don't want to look too closely at what's cooking in there..." + }, + { + "ids": "3825", + "examine": "A limestone ceiling growth." + }, + { + "ids": "3826", + "examine": "A tooth shaped rock formation protruding from the floor." + }, + { + "ids": "3827,3828", + "examine": "How am I going to get down there?" + }, + { + "ids": "3829", + "examine": "I hope this holds!" + }, + { + "ids": "3830,3831", + "examine": "How am I going to get down there?" + }, + { + "ids": "3832", + "examine": "I hope this holds!" + }, + { + "ids": "3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3850,3851,3852,3853,3854,3855", + "examine": "It's moving..." + }, + { + "ids": "3856,3857", + "examine": "It's a half buried crate." + }, + { + "ids": "3858,3859", + "examine": "It's stuck in the sand." + }, + { + "ids": "3860,3861", + "examine": "It's full of brightly coloured fish." + }, + { + "ids": "3862", + "examine": "It's a pile of burning bones." + }, + { + "ids": "3863,3864,3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878", + "examine": "The tribal statue of Tai Bwo Wannai Village." + }, + { + "ids": "3879", + "examine": "A tree." + }, + { + "ids": "3880", + "examine": "It's a tree stump." + }, + { + "ids": "3881,3882,3883", + "examine": "A tree." + }, + { + "ids": "3884", + "examine": "It's a tree stump." + }, + { + "ids": "3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,3895,3896,3897,3898,3899,3900", + "examine": "A tree." + }, + { + "ids": "3901", + "examine": "A rare flower." + }, + { + "ids": "3902", + "examine": "Don't flowers make you feel better?" + }, + { + "ids": "3903", + "examine": "A rare flower." + }, + { + "ids": "3904", + "examine": "Don't flowers make you feel better?" + }, + { + "ids": "3905", + "examine": "A rare flower." + }, + { + "ids": "3906,3907,3908,3909,3910,3911", + "examine": "Don't flowers make you feel better?" + }, + { + "ids": "3912", + "examine": "Fungal growth." + }, + { + "ids": "3913,3914", + "examine": "Poisonous no doubt." + }, + { + "ids": "3915", + "examine": "Fungal growth." + }, + { + "ids": "3916,3917", + "examine": "Poisonous no doubt." + }, + { + "ids": "3918", + "examine": "The lamp has a glowing crystal at its core." + }, + { + "ids": "3919,3920", + "examine": "It's a trap!" + }, + { + "ids": "3921", + "examine": "A tripwire." + }, + { + "ids": "3922", + "examine": "An odd-looking group of tied sticks." + }, + { + "ids": "3923,3924,3925,3926", + "examine": "A pile of leaves." + }, + { + "ids": "3927", + "examine": "Looks like I can climb these." + }, + { + "ids": "3928", + "examine": "It's a tree." + }, + { + "ids": "3929,3930,3931,3932,3933,3934,3935,3936", + "examine": "I can balance on this log." + }, + { + "ids": "3937", + "examine": "There are some broken twigs here." + }, + { + "ids": "3938", + "examine": "It looks as if the grass here has been flattened." + }, + { + "ids": "3939,3940", + "examine": "You notice the leaf litter here has been disturbed." + }, + { + "ids": "3941,3942,3943", + "examine": "Tracks in the soil." + }, + { + "ids": "3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961", + "examine": "You'd need a big siege engine to force that." + }, + { + "ids": "3962,3963,3964,3965,3966", + "examine": "A yellow crystal structure." + }, + { + "ids": "3967,3968", + "examine": "A tree" + }, + { + "ids": "3969", + "examine": "Disturbing but tidy." + }, + { + "ids": "3970", + "examine": "I don't even want to think about what did that..." + }, + { + "ids": "3971", + "examine": "Now that's what I call slimline!" + }, + { + "ids": "3972", + "examine": "He looks very relaxed." + }, + { + "ids": "3973", + "examine": "Now he's just too thin." + }, + { + "ids": "3974", + "examine": "He hasn't eaten in a long time." + }, + { + "ids": "3975", + "examine": "I don't wanna fall in that!" + }, + { + "ids": "3976", + "examine": "Good for smashing city walls." + }, + { + "ids": "3977", + "examine": "There's a winch on this side." + }, + { + "ids": "3978,3979", + "examine": "There's a lever on this side." + }, + { + "ids": "3980,3981,3982", + "examine": "A way to get into the tent." + }, + { + "ids": "3983,3984,3985,3986", + "examine": "A tent." + }, + { + "ids": "3987,3988,3989,3990,3991", + "examine": "A small barrel." + }, + { + "ids": "3992,3993", + "examine": "A standard of Kandarin." + }, + { + "ids": "3994", + "examine": "A small furnace." + }, + { + "ids": "3995", + "examine": "A tent wall." + }, + { + "ids": "3996", + "examine": "A way to get into the tent." + }, + { + "ids": "3997", + "examine": "A tent wall." + }, + { + "ids": "3998", + "examine": "It looks as if the grass here has been flattened." + }, + { + "ids": "3999", + "examine": "There are some broken twigs here." + }, + { + "ids": "4000", + "examine": "A tent roof." + }, + { + "ids": "4001", + "examine": "A tent wall." + }, + { + "ids": "4002,4003", + "examine": "The charred remains of a tent pole." + }, + { + "ids": "4004,4005", + "examine": "Well of voyage." + }, + { + "ids": "4006", + "examine": "It looks like I can squeeze through here." + }, + { + "ids": "4007", + "examine": "The exit to the outside." + }, + { + "ids": "4008,4009,4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023", + "examine": "Shrine to the glory of Saradomin." + }, + { + "ids": "4024,4025", + "examine": "A barrel." + }, + { + "ids": "4026", + "examine": "A still for fractionalizing oils." + }, + { + "ids": "4027,4028,4029,4030", + "examine": "A pile of lime rock." + }, + { + "ids": "4031,4032,4033,4034", + "examine": "Looks like a stone doorway to me." + }, + { + "ids": "4035,4036,4037,4038", + "examine": "These clean Druid's robes are drying off." + }, + { + "ids": "4039,4040,4041,4042", + "examine": "It's full of dirty robes." + }, + { + "ids": "4043", + "examine": "Presumably the hatch the zookeeper feeds the parrots through." + }, + { + "ids": "4044,4045,4046,4047", + "examine": "A red standard." + }, + { + "ids": "4048,4049,4050", + "examine": "Spooky!" + }, + { + "ids": "4051", + "examine": "It doesn't look healthy..." + }, + { + "ids": "4052", + "examine": "It's covered in slime." + }, + { + "ids": "4053,4054", + "examine": "It doesn't look healthy..." + }, + { + "ids": "4055,4056,4057", + "examine": "These fat fungi take up so much room." + }, + { + "ids": "4058", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "4059", + "examine": "I can balance on this rope." + }, + { + "ids": "4060", + "examine": "It's hollow..." + }, + { + "ids": "4061", + "examine": "This tree has been cut down." + }, + { + "ids": "4062", + "examine": "Strange items are stored here." + }, + { + "ids": "4063", + "examine": "Ideal for washing things in." + }, + { + "ids": "4064", + "examine": "This table has seen better days." + }, + { + "ids": "4065", + "examine": "It looks very ornamental in a practical 'solid rock' way." + }, + { + "ids": "4066", + "examine": "Welcome to Mort'ton" + }, + { + "ids": "4067", + "examine": "Danger! Sickness and affliction... stay away!" + }, + { + "ids": "4068", + "examine": "Looks like a pile of ancient rubble." + }, + { + "ids": "4069,4070,4071,4072,4073,4074,4075,4076", + "examine": "The starting of a wall." + }, + { + "ids": "4077", + "examine": "It's nearly a wall." + }, + { + "ids": "4078", + "examine": "A rebuilt wall." + }, + { + "ids": "4079", + "examine": "The broken wall of a desecrated temple." + }, + { + "ids": "4080,4081,4082,4083,4084,4085,4086,4087", + "examine": "The partially repaired wall of a desecrated temple." + }, + { + "ids": "4088", + "examine": "The nearly repaired wall of a desecrated temple." + }, + { + "ids": "4089", + "examine": "The repaired wall of a temple." + }, + { + "ids": "4090", + "examine": "A flaming Fire altar." + }, + { + "ids": "4091", + "examine": "An ancient Fire altar." + }, + { + "ids": "4092", + "examine": "An ancient, totally desecrated, broken down fire altar." + }, + { + "ids": "4093", + "examine": "A place to cremate the dead. Needs some wood." + }, + { + "ids": "4094,4095,4096,4097,4098,4099", + "examine": "A place to cremate the dead. Needs a body." + }, + { + "ids": "4100,4101,4102,4103,4104,4105", + "examine": "A place to cremate the dead. Needs a light." + }, + { + "ids": "4106,4107,4108,4109,4110", + "examine": "Heavy metal!" + }, + { + "ids": "4111", + "examine": "A strangely decorated bronze chest, the lock is painted blood red." + }, + { + "ids": "4112", + "examine": "A strangely decorated chest, the lock is painted brown." + }, + { + "ids": "4113", + "examine": "A strangely decorated chest, the lock is painted crimson." + }, + { + "ids": "4114", + "examine": "A strangely decorated chest, the lock is painted black." + }, + { + "ids": "4115", + "examine": "A strangely decorated chest, the lock is painted purple." + }, + { + "ids": "4116", + "examine": "A strangely decorated steel chest, the lock is painted blood red." + }, + { + "ids": "4117", + "examine": "A strangely decorated steel chest, the lock is painted brown." + }, + { + "ids": "4118", + "examine": "A strangely decorated steel chest, the lock is painted crimson." + }, + { + "ids": "4119", + "examine": "A strangely decorated steel chest, the lock is painted black." + }, + { + "ids": "4120", + "examine": "A strangely decorated steel chest, the lock is painted purple." + }, + { + "ids": "4121", + "examine": "A strangely decorated black chest, the lock is painted blood red." + }, + { + "ids": "4122", + "examine": "A strangely decorated black chest, the lock is painted brown." + }, + { + "ids": "4123", + "examine": "A strangely decorated black chest, the lock is painted crimson." + }, + { + "ids": "4124", + "examine": "A strangely decorated black chest, the lock is painted black." + }, + { + "ids": "4125", + "examine": "A strangely decorated black chest, the lock is painted purple." + }, + { + "ids": "4126", + "examine": "A strangely decorated silver chest, the lock is painted blood red." + }, + { + "ids": "4127", + "examine": "A strangely decorated silver chest, the lock is painted brown." + }, + { + "ids": "4128", + "examine": "A strangely decorated silver chest, the lock is painted crimson." + }, + { + "ids": "4129", + "examine": "A strangely decorated silver chest, the lock is painted black." + }, + { + "ids": "4130", + "examine": "A strangely decorated silver chest, the lock is painted purple." + }, + { + "ids": "4131", + "examine": "A strangely decorated bronze chest, the open lock is painted blood red." + }, + { + "ids": "4132,4133", + "examine": "These doors look very ominous. A sign says 'To the tombs'." + }, + { + "ids": "4134,4135,4136,4137", + "examine": "Large doors set into the hillside." + }, + { + "ids": "4138", + "examine": "Items are for sale here." + }, + { + "ids": "4139,4140", + "examine": "Entrance to the Duel Arena." + }, + { + "ids": "4141", + "examine": "This seems to be some kind of shrine." + }, + { + "ids": "4142", + "examine": "The wind makes a musical sound as it blows through it..." + }, + { + "ids": "4143", + "examine": "Danger" + }, + { + "ids": "4144,4145,4146", + "examine": "Those golden fruit look good enough to eat!" + }, + { + "ids": "4147", + "examine": "This must be Lalli's home." + }, + { + "ids": "4148", + "examine": "Allows performers backstage at the Longhall." + }, + { + "ids": "4149", + "examine": "It smells pretty good actually." + }, + { + "ids": "4150,4151,4152,4153,4154,4155,4156,4157", + "examine": "A portal from this mystical place." + }, + { + "ids": "4158", + "examine": "Takes me into the maze." + }, + { + "ids": "4159,4160,4161", + "examine": "Takes me out of the maze." + }, + { + "ids": "4162", + "examine": "A thin metal pipe, presumably for rainwater to run through." + }, + { + "ids": "4163,4164", + "examine": "I can climb this." + }, + { + "ids": "4165,4166", + "examine": "Keeps the wind out." + }, + { + "ids": "4167,4168", + "examine": "I wonder what's inside?" + }, + { + "ids": "4169", + "examine": "Brrrrrr!" + }, + { + "ids": "4170", + "examine": "There is some kind of balancing mechanism as a lock." + }, + { + "ids": "4171", + "examine": "A good source of books!" + }, + { + "ids": "4172", + "examine": "An appliance for cooking with." + }, + { + "ids": "4173", + "examine": "I wonder what's down there?" + }, + { + "ids": "4174", + "examine": "I wonder what's under it?" + }, + { + "ids": "4175", + "examine": "Kind of funny smelling..." + }, + { + "ids": "4176", + "examine": "Water comes out of it." + }, + { + "ids": "4177", + "examine": "This may be worth opening." + }, + { + "ids": "4178", + "examine": "This may be worth searching." + }, + { + "ids": "4179,4180", + "examine": "A very unusual piece of artwork..." + }, + { + "ids": "4181", + "examine": "Alas poor unicorn, I knew him well." + }, + { + "ids": "4182", + "examine": "Looks like the bull lost." + }, + { + "ids": "4183,4184", + "examine": "A pile of boxes for storage." + }, + { + "ids": "4185", + "examine": "A wooden crate for storage." + }, + { + "ids": "4186", + "examine": "An old crate for storage." + }, + { + "ids": "4187", + "examine": "I can climb this." + }, + { + "ids": "4188", + "examine": "This leads upwards." + }, + { + "ids": "4189,4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239,4240,4241,4242,4243,4244,4245,4246", + "examine": "This leads downwards." + }, + { + "ids": "4247", + "examine": "Keeps the cold winds out." + }, + { + "ids": "4248,4249", + "examine": "Doesn't keep the wind out if it's open!" + }, + { + "ids": "4250,4251", + "examine": "I'm sure the animal is glad its fur was put to good use." + }, + { + "ids": "4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264", + "examine": "I wonder what's inside?" + }, + { + "ids": "4265", + "examine": "Toasty." + }, + { + "ids": "4266", + "examine": "Hot!" + }, + { + "ids": "4267,4268", + "examine": "Finger licking good!" + }, + { + "ids": "4269", + "examine": "It's a long wooden table." + }, + { + "ids": "4270", + "examine": "It's a table with candles on." + }, + { + "ids": "4271", + "examine": "Generally used for sitting." + }, + { + "ids": "4272", + "examine": "Generally used for putting things on." + }, + { + "ids": "4273", + "examine": "Actually, I could do with a drink..." + }, + { + "ids": "4274", + "examine": "For leaning against..." + }, + { + "ids": "4275", + "examine": "A wooden barrel containing lots of fish." + }, + { + "ids": "4276", + "examine": "Always a source of good bargains." + }, + { + "ids": "4277", + "examine": "There's something fishy about this stall." + }, + { + "ids": "4278,4279,4280,4281,4282", + "examine": "Around here, this is where you buy new doors." + }, + { + "ids": "4283,4284", + "examine": "Has a peculiar odour." + }, + { + "ids": "4285", + "examine": "Water comes out of this." + }, + { + "ids": "4286", + "examine": "It's kind of like a barrel." + }, + { + "ids": "4287", + "examine": "Looks pretty comfy." + }, + { + "ids": "4288,4289,4290,4291,4292,4293,4294,4295", + "examine": "I guess I could sleep in it if I was really tired." + }, + { + "ids": "4296", + "examine": "Yup, looks like this neighbourhood is perfectly safe for travellers..." + }, + { + "ids": "4297,4298,4299", + "examine": "A pile of boxes for storage." + }, + { + "ids": "4300", + "examine": "A wooden crate for storage." + }, + { + "ids": "4301,4302,4303", + "examine": "An old crate for storage." + }, + { + "ids": "4304,4305", + "examine": "A hot place for forging things in." + }, + { + "ids": "4306", + "examine": "Used for fashioning metal items." + }, + { + "ids": "4307", + "examine": "Various implements for working with metal." + }, + { + "ids": "4308", + "examine": "Bake your clay pots in here." + }, + { + "ids": "4309", + "examine": "Used for spinning thread." + }, + { + "ids": "4310", + "examine": "Used for fashioning clay items." + }, + { + "ids": "4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327", + "examine": "A wooden gate." + }, + { + "ids": "4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4347", + "examine": "This tree has been cut down." + }, + { + "ids": "4348", + "examine": "Best left on the beach." + }, + { + "ids": "4349", + "examine": "This once belonged to a sea animal." + }, + { + "ids": "4350", + "examine": "Best left for the crabs." + }, + { + "ids": "4351", + "examine": "I can hear the sea with this." + }, + { + "ids": "4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365", + "examine": "It is a buried Bowl." + }, + { + "ids": "4366,4367", + "examine": "An empty shelf..." + }, + { + "ids": "4368", + "examine": "There are some pots and pans here." + }, + { + "ids": "4369", + "examine": "There are some tankards here." + }, + { + "ids": "4370", + "examine": "A shelf with a bucket on it." + }, + { + "ids": "4371", + "examine": "There are a few books on this shelf." + }, + { + "ids": "4372", + "examine": "It's a small table." + }, + { + "ids": "4373,4374,4375,4376", + "examine": "A tray of sand." + }, + { + "ids": "4377,4378,4379", + "examine": "There should be a standard here!" + }, + { + "ids": "4380", + "examine": "I could climb this if I wanted." + }, + { + "ids": "4381,4382", + "examine": "It's a war machine." + }, + { + "ids": "4383,4384", + "examine": "I could climb this if I wanted." + }, + { + "ids": "4385,4386", + "examine": "The catapult is damaged." + }, + { + "ids": "4387", + "examine": "A portal to join the Saradomin team." + }, + { + "ids": "4388", + "examine": "A portal to join the Zamorak team." + }, + { + "ids": "4389", + "examine": "A portal to leave the Saradomin team." + }, + { + "ids": "4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405", + "examine": "A portal to leave the Zamorak team." + }, + { + "ids": "4406", + "examine": "A portal to leave the Saradomin team." + }, + { + "ids": "4407", + "examine": "A portal to leave the Zamorak team." + }, + { + "ids": "4408,4409,4410", + "examine": "A portal to join a random team." + }, + { + "ids": "4411", + "examine": "A very slippery stepping stone" + }, + { + "ids": "4412,4413", + "examine": "I could climb this if I wanted." + }, + { + "ids": "4414", + "examine": "A rickety old staircase." + }, + { + "ids": "4415,4416,4417,4418,4419,4420", + "examine": "A solid stone staircase." + }, + { + "ids": "4421,4422", + "examine": "A spiky barricade." + }, + { + "ids": "4423,4424,4425,4426,4427,4428,4429,4430", + "examine": "A large double door." + }, + { + "ids": "4431,4432,4433,4434,4435,4436", + "examine": "A large broken door." + }, + { + "ids": "4437", + "examine": "We could use our pickaxes to get past these..." + }, + { + "ids": "4438,4439,4440,4441,4442,4443", + "examine": "We can almost get past these..." + }, + { + "ids": "4444,4445", + "examine": "Should be long enough to scale castle walls." + }, + { + "ids": "4446,4447", + "examine": "Maybe I could tie a rope to this..." + }, + { + "ids": "4448", + "examine": "It doesn't look very stable..." + }, + { + "ids": "4449,4450,4451,4452,4453,4454,4455,4456,4457", + "examine": "A solid stone staircase." + }, + { + "ids": "4458", + "examine": "There are some bandages on this table." + }, + { + "ids": "4459", + "examine": "There are some toolboxes on this table." + }, + { + "ids": "4460", + "examine": "There's some rock I can use with the catapult here." + }, + { + "ids": "4461", + "examine": "There are some barricades here." + }, + { + "ids": "4462", + "examine": "There is some rope here." + }, + { + "ids": "4463", + "examine": "There are some explosive potions here." + }, + { + "ids": "4464", + "examine": "There are some pickaxes on this table." + }, + { + "ids": "4465,4466", + "examine": "An elf-fashioned door." + }, + { + "ids": "4467", + "examine": "The door is closed." + }, + { + "ids": "4468", + "examine": "The door is open." + }, + { + "ids": "4469", + "examine": "Only the Saradomin team may pass." + }, + { + "ids": "4470", + "examine": "Only the Zamorak team may pass." + }, + { + "ids": "4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481", + "examine": "I wonder what's under it?" + }, + { + "ids": "4482", + "examine": "Water comes out of this." + }, + { + "ids": "4483", + "examine": "It's open." + }, + { + "ids": "4484", + "examine": "Keep track of which team has the most victories." + }, + { + "ids": "4485,4486", + "examine": "I could climb this if I wanted." + }, + { + "ids": "4487,4488,4489,4490,4491,4492", + "examine": "A big wooden door." + }, + { + "ids": "4493", + "examine": "I can climb these stairs." + }, + { + "ids": "4494", + "examine": "They go down." + }, + { + "ids": "4495", + "examine": "I can climb these stairs." + }, + { + "ids": "4496", + "examine": "They go down." + }, + { + "ids": "4497", + "examine": "I can climb these stairs." + }, + { + "ids": "4498", + "examine": "They go down." + }, + { + "ids": "4499", + "examine": "Wow" + }, + { + "ids": "4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512", + "examine": "This leads back to the cruel world above." + }, + { + "ids": "4513,4514,4515,4516,4517", + "examine": "I doubt that was built to last..." + }, + { + "ids": "4518", + "examine": "How do you make a skeleton laugh?" + }, + { + "ids": "4519", + "examine": "Tickle his funny bone." + }, + { + "ids": "4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540", + "examine": "Clearly has been relaxing too long...." + }, + { + "ids": "4541,4542", + "examine": "Did that thing just twitch?" + }, + { + "ids": "4543,4544", + "examine": "A strange wall with objects engraved upon it." + }, + { + "ids": "4545,4546,4547,4548,4549", + "examine": "A strange wall that appears to be hinged." + }, + { + "ids": "4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567", + "examine": "I can jump off this one." + }, + { + "ids": "4568", + "examine": "I can climb up these stairs." + }, + { + "ids": "4569,36777", + "examine": "I can climb up or go down these stairs." + }, + { + "ids": "4570,4571,4572,4573,4574,4575,4576", + "examine": "I can climb down these stairs." + }, + { + "ids": "4577,4578,4579,4580,4581,4582,4583,4584,4585,4586", + "examine": "Lets you walk through walls!" + }, + { + "ids": "4587", + "examine": "It turns the light around." + }, + { + "ids": "4588", + "examine": "It looks broken." + }, + { + "ids": "4589", + "examine": "Part of the Lighthouse's lighting mechanism." + }, + { + "ids": "4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609", + "examine": "Part of the lighthouse Light mechanism." + }, + { + "ids": "4610", + "examine": "Best left on the beach." + }, + { + "ids": "4611", + "examine": "This once belonged to a sea animal." + }, + { + "ids": "4612", + "examine": "Best left for the crabs." + }, + { + "ids": "4613", + "examine": "I can hear the sea with this." + }, + { + "ids": "4614", + "examine": "It is a buried bowl." + }, + { + "ids": "4615,4616", + "examine": "I can jump off this one." + }, + { + "ids": "4617", + "examine": "Shelves filled with interesting books." + }, + { + "ids": "4618,4619", + "examine": "A nice and cosy fire." + }, + { + "ids": "4620,4621", + "examine": "They go down." + }, + { + "ids": "4622,4623", + "examine": "They go up." + }, + { + "ids": "4624,4625", + "examine": "They go down." + }, + { + "ids": "4626,4627,4628", + "examine": "They go up." + }, + { + "ids": "4629,4630,4631,4632,4633,4634,4635", + "examine": "A large double door." + }, + { + "ids": "4636,4637,4638,4639,4640", + "examine": "An elf-fashioned door." + }, + { + "ids": "4641", + "examine": "Mmm...beer!" + }, + { + "ids": "4642", + "examine": "Has some board games news on it." + }, + { + "ids": "4643", + "examine": "The ladder to the Runelink challenge room for experienced players." + }, + { + "ids": "4644", + "examine": "The ladder back to the Runelink challenge room." + }, + { + "ids": "4645", + "examine": "The ladder to the Draughts challenge room for experienced players." + }, + { + "ids": "4646", + "examine": "The ladder back to the Draughts challenge room." + }, + { + "ids": "4647", + "examine": "The ladder back up to the Toad and Chicken." + }, + { + "ids": "4648,4649", + "examine": "Leads down to the Burthorpe Games Rooms." + }, + { + "ids": "4650", + "examine": "A nice and cosy fire." + }, + { + "ids": "4651", + "examine": "A table for board games." + }, + { + "ids": "4652", + "examine": "A game of draughts is being played on this table." + }, + { + "ids": "4653,4654,4655", + "examine": "A game of Runelink is being played on this table." + }, + { + "ids": "4656,4657", + "examine": "A comfy stool." + }, + { + "ids": "4658", + "examine": "Draughts challenge room." + }, + { + "ids": "4659", + "examine": "Runelink challenge room." + }, + { + "ids": "4660", + "examine": "Draughts challenge room for experienced players." + }, + { + "ids": "4661,4662,4663,4664,4665,4666,4667,4668", + "examine": "Runelink challenge room for experienced players." + }, + { + "ids": "4669", + "examine": "A statue of Arrav (the Fountain of Heroes has moved downstairs.)" + }, + { + "ids": "4670", + "examine": "A statue of Camorra (the Fountain of Heroes has moved downstairs.)" + }, + { + "ids": "4671", + "examine": "A good source of books!" + }, + { + "ids": "4672,4673", + "examine": "The door into the throne room." + }, + { + "ids": "4674", + "examine": "I bet this makes good syrup!" + }, + { + "ids": "4675", + "examine": "Scented herbs." + }, + { + "ids": "4676", + "examine": "A rocky outcrop." + }, + { + "ids": "4677,4678,4679,4680,4681,4682", + "examine": "Scented herbs." + }, + { + "ids": "4683", + "examine": "A large harp." + }, + { + "ids": "4684", + "examine": "Good for shooting fish in." + }, + { + "ids": "4685", + "examine": "This old tree is rotting away" + }, + { + "ids": "4686,4687,4688,4689", + "examine": "This old tree is rotting away." + }, + { + "ids": "4690,4691", + "examine": "Fancy." + }, + { + "ids": "4692,4693,4694,4695", + "examine": "Flag, pole...Yep, it's a flagpole." + }, + { + "ids": "4696", + "examine": "The door is closed." + }, + { + "ids": "4697,4698,4699,4700", + "examine": "The door is open." + }, + { + "ids": "4701", + "examine": "Keeps the cold winds out." + }, + { + "ids": "4702", + "examine": "A nicely carved wooden chair." + }, + { + "ids": "4703,4704", + "examine": "A wooden double bed. For sleeping in..." + }, + { + "ids": "4705", + "examine": "There's something fishy about this stall." + }, + { + "ids": "4706", + "examine": "You should eat your greens!" + }, + { + "ids": "4707", + "examine": "There's something fishy about this stall." + }, + { + "ids": "4708,4709", + "examine": "You should eat your greens!" + }, + { + "ids": "4710,4711", + "examine": "A doorway made from bamboo." + }, + { + "ids": "4712", + "examine": "It's a trapdoor." + }, + { + "ids": "4713", + "examine": "It's an open trapdoor." + }, + { + "ids": "4714", + "examine": "A wooden crate for storage." + }, + { + "ids": "4715", + "examine": "This crate is making chattering sounds." + }, + { + "ids": "4716", + "examine": "This crate smells slightly nauseous." + }, + { + "ids": "4717,4718", + "examine": "This crate says 'Property of Hamab' on its side." + }, + { + "ids": "4719", + "examine": "This crate says 'Property of Ifaba' on its side." + }, + { + "ids": "4720,4721", + "examine": "This crate says 'Property of Daga' on its side." + }, + { + "ids": "4722,4723", + "examine": "This crate smells slightly of banana." + }, + { + "ids": "4724", + "examine": "This crate says 'Property of Hamab' on its side." + }, + { + "ids": "4725,4726,4727", + "examine": "This crate says 'Property of Ifaba' on its side." + }, + { + "ids": "4728", + "examine": "I can climb up this." + }, + { + "ids": "4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742", + "examine": "A dried up bush, void of life." + }, + { + "ids": "4743,4744", + "examine": "It's a bamboo ladder." + }, + { + "ids": "4745", + "examine": "Looks good for jumping off." + }, + { + "ids": "4746,4747,4748", + "examine": "This crate is marked 'Deliver to Glough'..." + }, + { + "ids": "4749", + "examine": "It's a banana tree, full of bananas." + }, + { + "ids": "4750", + "examine": "It's a banana tree, with lots of bananas." + }, + { + "ids": "4751", + "examine": "It's a banana tree, with many bananas." + }, + { + "ids": "4752", + "examine": "It's a banana tree, with a few bananas." + }, + { + "ids": "4753", + "examine": "It's a banana tree, with but one banana." + }, + { + "ids": "4754", + "examine": "It's a banana tree, with no more bananas left." + }, + { + "ids": "4755", + "examine": "They go down." + }, + { + "ids": "4756,4757,4758,4759,4760,4761,4762,4763", + "examine": "They go up." + }, + { + "ids": "4764", + "examine": "It's a bamboo stool." + }, + { + "ids": "4765,4766", + "examine": "It's a sheer wall of fire, rising as high as you can see." + }, + { + "ids": "4767", + "examine": "The contents of this pyre are rapidly bubbling and burning." + }, + { + "ids": "4768", + "examine": "It's a wall of bricks." + }, + { + "ids": "4769,4770", + "examine": "It's a pile of bricks." + }, + { + "ids": "4771", + "examine": "A rather dapper little monkey sitting on a throne." + }, + { + "ids": "4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4785", + "examine": "It's a bamboo ladder." + }, + { + "ids": "4786", + "examine": "A plant in a bamboo pot." + }, + { + "ids": "4787,4788,4789,4790", + "examine": "It's an absolutely huge bamboo gate." + }, + { + "ids": "4791,4792,4793", + "examine": "It's a big comfy bed, made of strips of bamboo." + }, + { + "ids": "4794", + "examine": "It's a pot made out of bamboo." + }, + { + "ids": "4795,4796", + "examine": "They are pots made out of bamboo." + }, + { + "ids": "4797", + "examine": "Bamboo strips have been lashed together to make this rickety desk." + }, + { + "ids": "4798", + "examine": "It's a bookcase made out of bamboo." + }, + { + "ids": "4799,4800,4801,4802,4803,4804,4805,4806", + "examine": "It's a bamboo door with a large iron padlock." + }, + { + "ids": "4807,4808,4809,4810,4811", + "examine": "It's a door made from bamboo." + }, + { + "ids": "4812,4813,4814", + "examine": "Looks good for hiding in..." + }, + { + "ids": "4815", + "examine": "Looks good for hiding in." + }, + { + "ids": "4816", + "examine": "This is a fairly tall tree with sparse foliage." + }, + { + "ids": "4817", + "examine": "A jungle palm with dense foliage." + }, + { + "ids": "4818", + "examine": "This is a fairly tall tree with sparse foliage." + }, + { + "ids": "4819", + "examine": "This was a fairly tall tree with sparse foliage." + }, + { + "ids": "4820", + "examine": "A leafy tree." + }, + { + "ids": "4821", + "examine": "This was a fairly tall tree with sparse foliage." + }, + { + "ids": "4822", + "examine": "This tree has been cut down." + }, + { + "ids": "4823", + "examine": "This flower is found only in jungle areas." + }, + { + "ids": "4824", + "examine": "A very rare and exotic flower." + }, + { + "ids": "4825", + "examine": "A small fernlike plant." + }, + { + "ids": "4826", + "examine": "Leaves a nasty mark." + }, + { + "ids": "4827", + "examine": "Looks spiky." + }, + { + "ids": "4828", + "examine": "This has broad leaves." + }, + { + "ids": "4829", + "examine": "A type of jungle fern." + }, + { + "ids": "4830", + "examine": "A large waxy jungle plant." + }, + { + "ids": "4831", + "examine": "Commonly found in these parts." + }, + { + "ids": "4832", + "examine": "The tendrils of a creeping plant." + }, + { + "ids": "4833,4834", + "examine": "A jungle bush, quite common to these areas." + }, + { + "ids": "4835,4836,4837,4838,4839,4840,4841,4842,4843,4844", + "examine": "A jungle bush that has been chopped down." + }, + { + "ids": "4845,4846,4847", + "examine": "A terribly tall tropical tree." + }, + { + "ids": "4848", + "examine": "Leaves of a tropical tree." + }, + { + "ids": "4849,4850,4851", + "examine": "This tree no doubt contains dangerous insects." + }, + { + "ids": "4852", + "examine": "This old tree is rotting away." + }, + { + "ids": "4853", + "examine": "A gnarly old tree root." + }, + { + "ids": "4854", + "examine": "The roots of this tree are exposed." + }, + { + "ids": "4855", + "examine": "I hope I don't trip over any of these." + }, + { + "ids": "4856", + "examine": "It's a small patch of glowing fungus." + }, + { + "ids": "4857", + "examine": "It's a medium patch of glowing fungus." + }, + { + "ids": "4858", + "examine": "It's an absolutely colossal statue of some kind of gorilla." + }, + { + "ids": "4859,4860", + "examine": "It's a huge statue of some kind of gorilla." + }, + { + "ids": "4861", + "examine": "It's a huge statue of some kind of monkey." + }, + { + "ids": "4862", + "examine": "It's a large patch of glowing fungus." + }, + { + "ids": "4863,4864", + "examine": "Legs of this watchtower." + }, + { + "ids": "4865", + "examine": "It's the middle of this watchtower." + }, + { + "ids": "4866", + "examine": "It's a deactivated military Gnome glider." + }, + { + "ids": "4867", + "examine": "It's an activated military Gnome glider." + }, + { + "ids": "4868,4869,4870", + "examine": "It's some kind of Gnome teleportation device." + }, + { + "ids": "4871", + "examine": "This is the panel controlling the hangar reinitialisation." + }, + { + "ids": "4872", + "examine": "There must be an exit nearby." + }, + { + "ids": "4873", + "examine": "It's probably too risky to try pulling this." + }, + { + "ids": "4874", + "examine": "This table has crafting paraphernalia on it." + }, + { + "ids": "4875", + "examine": "This table has ripe bananas on show." + }, + { + "ids": "4876", + "examine": "This table has items of a general nature on it." + }, + { + "ids": "4877", + "examine": "This table has runes on display." + }, + { + "ids": "4878", + "examine": "This table has a scimitar on it." + }, + { + "ids": "4879", + "examine": "It's a trapdoor." + }, + { + "ids": "4880", + "examine": "It's an open trapdoor." + }, + { + "ids": "4881", + "examine": "I can climb up this." + }, + { + "ids": "4882,4883", + "examine": "Looks suspicious." + }, + { + "ids": "4884", + "examine": "A plank." + }, + { + "ids": "4885", + "examine": "Formed over many years." + }, + { + "ids": "4886", + "examine": "Human sieve creation." + }, + { + "ids": "4887", + "examine": "Looks suspicious." + }, + { + "ids": "4888", + "examine": "It's a trapdoor." + }, + { + "ids": "4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899", + "examine": "I can climb up this." + }, + { + "ids": "4900", + "examine": "The Saradomin Team Standard." + }, + { + "ids": "4901", + "examine": "The Zamorak Team Standard." + }, + { + "ids": "4902", + "examine": "The Saradomin Team Standard." + }, + { + "ids": "4903", + "examine": "The Zamorak Team Standard." + }, + { + "ids": "4904,4905,4906,4907,4908,4909", + "examine": "It's on fire!" + }, + { + "ids": "4910", + "examine": "A wooden barrel for storage." + }, + { + "ids": "4911,4912", + "examine": "I can climb down this." + }, + { + "ids": "4913,4914,4915,4916,4917", + "examine": "It looks cramped and dark." + }, + { + "ids": "4918", + "examine": "This cart is blocking the way up the ridge." + }, + { + "ids": "4919", + "examine": "These stairs seem to have been hewn out of the rock itself." + }, + { + "ids": "4920,4921,4922", + "examine": "It looks cramped and dark." + }, + { + "ids": "4923", + "examine": "These stairs seem to have been hewn out of the rock itself." + }, + { + "ids": "4924,4925", + "examine": "A valve to start and stop the flow of water." + }, + { + "ids": "4926,4927,4928", + "examine": "Shiny!" + }, + { + "ids": "4929", + "examine": "It looks cramped and dark." + }, + { + "ids": "4930,4931", + "examine": "It's blocking the tunnel, but it looks dark down there anyway." + }, + { + "ids": "4932,4933,4934", + "examine": "A bizarre fungus. It emits a pale blue light." + }, + { + "ids": "4935", + "examine": "If that wasn't there I'd probably be a lot flatter now." + }, + { + "ids": "4936", + "examine": "It prevents the wall unceremoniously squashing people." + }, + { + "ids": "4937,4938,4939,4940,4941", + "examine": "It looks like it's water powered." + }, + { + "ids": "4942,4943", + "examine": "It's a little waterlogged. I hope it still works." + }, + { + "ids": "4944", + "examine": "It doesn't look very watertight. Any contents will be ruined." + }, + { + "ids": "4945,4946,4947,4948", + "examine": "A sunken mine cart, how useful." + }, + { + "ids": "4949", + "examine": "This displays information on how the points on this level are set." + }, + { + "ids": "4950", + "examine": "It has the letter 'B' inscribed on the end." + }, + { + "ids": "4951", + "examine": "It has the letter 'A' inscribed on the end." + }, + { + "ids": "4952", + "examine": "It has the letter 'C' inscribed on the end." + }, + { + "ids": "4953", + "examine": "It has the letter 'D' inscribed on the end." + }, + { + "ids": "4954", + "examine": "It has the letter 'E' inscribed on the end." + }, + { + "ids": "4955", + "examine": "It has the letter 'I' inscribed on the end." + }, + { + "ids": "4956", + "examine": "It has the letter 'J' inscribed on the end." + }, + { + "ids": "4957", + "examine": "It has the letter 'K' inscribed on the end." + }, + { + "ids": "4958", + "examine": "I think this changes one of the sets of points." + }, + { + "ids": "4959", + "examine": "It has the letter 'F' inscribed on the end." + }, + { + "ids": "4960", + "examine": "It has the letter 'G' inscribed on the end." + }, + { + "ids": "4961", + "examine": "It has the letter 'H' inscribed on the end." + }, + { + "ids": "4962", + "examine": "The door is closed." + }, + { + "ids": "4963,4964", + "examine": "A large double door." + }, + { + "ids": "4965", + "examine": "I can climb down this." + }, + { + "ids": "4966", + "examine": "I can climb this." + }, + { + "ids": "4967", + "examine": "I can climb down this." + }, + { + "ids": "4968", + "examine": "I can climb this." + }, + { + "ids": "4969", + "examine": "I can climb down this." + }, + { + "ids": "4970", + "examine": "I can climb this." + }, + { + "ids": "4971,4972,4973", + "examine": "These stairs seem to have been hewn out of the rock itself." + }, + { + "ids": "4974", + "examine": "Useful for moving items around the mine." + }, + { + "ids": "4975", + "examine": "An old crate for storage." + }, + { + "ids": "4976,4977,4978,4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,5000", + "examine": "A distinctive layer in the rock strata." + }, + { + "ids": "5001", + "examine": "This cave has been boarded up." + }, + { + "ids": "5002", + "examine": "Useful for passing over inaccessible areas." + }, + { + "ids": "5003", + "examine": "It's old and pretty broken." + }, + { + "ids": "5004,5005", + "examine": "A well used tree." + }, + { + "ids": "5006", + "examine": "These flowers only grow in one place in the mountains." + }, + { + "ids": "5007", + "examine": "Looks like small cave." + }, + { + "ids": "5008,5009,5010,5011,5012,5013,5014", + "examine": "Looks dark..." + }, + { + "ids": "5015,5016,5017,5018,5019,5020,5021,5022,5023,5024", + "examine": "It's too dangerous to go down here by foot..." + }, + { + "ids": "5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036", + "examine": "A split in the cave wall..." + }, + { + "ids": "5037", + "examine": "A large ice covered boulder." + }, + { + "ids": "5038", + "examine": "An ice covered boulder." + }, + { + "ids": "5039,5040,5041,5042", + "examine": "A small ice covered boulder." + }, + { + "ids": "5043,5044", + "examine": "A huge ice gate." + }, + { + "ids": "5045", + "examine": "An interesting-looking tree." + }, + { + "ids": "5046", + "examine": "A small cave entrance." + }, + { + "ids": "5047", + "examine": "Limestone ceiling growth." + }, + { + "ids": "5048", + "examine": "A limestone ceiling growth." + }, + { + "ids": "5049", + "examine": "A tooth shaped rock formation protruding from the floor." + }, + { + "ids": "5050", + "examine": "Tooth shaped rock formations protruding from the floor." + }, + { + "ids": "5051", + "examine": "A dirty little swamp boat." + }, + { + "ids": "5052,5053", + "examine": "If it had paint on it, you'd probably watch it dry." + }, + { + "ids": "5054", + "examine": "I can climb this." + }, + { + "ids": "5055", + "examine": "I wonder what that's there for..." + }, + { + "ids": "5056,5057", + "examine": "These doors look very ominous." + }, + { + "ids": "5058,5059", + "examine": "Large doors set into the hillside." + }, + { + "ids": "5060,5061", + "examine": "These doors seem to lead into the underground." + }, + { + "ids": "5062,5063,5064,5065,5066,5067,5068,5069,5070,5071", + "examine": "Large doors set into the hillside." + }, + { + "ids": "5072,5073,5074,5075,5076,5077,5078,5079,5080,5081", + "examine": "A Large Pillar" + }, + { + "ids": "5082", + "examine": "An overgrown dungeon entrance." + }, + { + "ids": "5083", + "examine": "A closed overgrown dungeon entrance." + }, + { + "ids": "5084,5085,5086,5087", + "examine": "The way to go when I get scared." + }, + { + "ids": "5088,5089,5090,5091,5092,5093", + "examine": "I hope I don't fall off this." + }, + { + "ids": "5094,5095,5096,5097,5098", + "examine": "These stairs seem to have been hewn out of the rock itself." + }, + { + "ids": "5099,5100,5101,5102", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "5103,5104,5105,5106,5107,5108,5109", + "examine": "Thick vines blocking your way." + }, + { + "ids": "5110,5111", + "examine": "I can jump from this stepping stone." + }, + { + "ids": "5112", + "examine": "Not good for eating." + }, + { + "ids": "5113,5114,5115", + "examine": "I doubt that's edible." + }, + { + "ids": "5116,5117,5118,5119,5120,5121", + "examine": "A statue of a big monster." + }, + { + "ids": "5122", + "examine": "Now that's what I call slimline!" + }, + { + "ids": "5123", + "examine": "He looks very relaxed." + }, + { + "ids": "5124", + "examine": "Now he's just too thin." + }, + { + "ids": "5125", + "examine": "He hasn't eaten in a long time." + }, + { + "ids": "5126", + "examine": "A tall wooden door." + }, + { + "ids": "5127", + "examine": "Danger!" + }, + { + "ids": "5128,5129", + "examine": "A tall wooden door." + }, + { + "ids": "5130", + "examine": "Looks like whoever uses this has claws on their hands." + }, + { + "ids": "5131", + "examine": "I wonder what's under it?" + }, + { + "ids": "5132", + "examine": "I wonder what's down there?" + }, + { + "ids": "5133,5134,5135", + "examine": "A hurdle." + }, + { + "ids": "5136,5137", + "examine": "A climbing wall made from skulls." + }, + { + "ids": "5138", + "examine": "A very slippery stepping stone." + }, + { + "ids": "5139,5140,5141,5142,5143,5144,5145", + "examine": "A scary zip line for teeth??" + }, + { + "ids": "5146,5147,5148,5149,5150,5151", + "examine": "A goal." + }, + { + "ids": "5152,5153,5154,5155", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "5156", + "examine": "This may be worth opening." + }, + { + "ids": "5157", + "examine": "This may be worth searching." + }, + { + "ids": "5158", + "examine": "A pile of garden canes." + }, + { + "ids": "5159,5160", + "examine": "There's no way to cross this bridge." + }, + { + "ids": "5161", + "examine": "An old grandfather clock." + }, + { + "ids": "5162", + "examine": "A closed chest." + }, + { + "ids": "5163", + "examine": "An open chest." + }, + { + "ids": "5164", + "examine": "There is a note pinned to the signpost." + }, + { + "ids": "5165", + "examine": "It looks like it needs a good sweep out." + }, + { + "ids": "5166", + "examine": "Bookish." + }, + { + "ids": "5167", + "examine": "A large, elaborately ornamented memorial stone." + }, + { + "ids": "5168", + "examine": "A grave, marked by an ostentatious memorial stone." + }, + { + "ids": "5169", + "examine": "A poor grave marked by a simple, wooden cross." + }, + { + "ids": "5170,5171", + "examine": "The entrance to an extravagantly decorated mausoleum." + }, + { + "ids": "5172,5173", + "examine": "The door to the Tower." + }, + { + "ids": "5174,5175", + "examine": "The door to the garden shed." + }, + { + "ids": "5176", + "examine": "At some point the lightning conductor has broken, rendering it useless." + }, + { + "ids": "5177", + "examine": "A shocking piece of kit." + }, + { + "ids": "5178,5179", + "examine": "Mmm.. scented candles." + }, + { + "ids": "5180,5181,5182", + "examine": "I wouldn't eat there!" + }, + { + "ids": "5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201", + "examine": "Looks wooden. Feels wooden. I wonder is it wooden?" + }, + { + "ids": "5202,5203,5204,5205", + "examine": "Dangerous, someone could trip on them." + }, + { + "ids": "5206", + "examine": "I can climb these stairs." + }, + { + "ids": "5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227", + "examine": "They go down." + }, + { + "ids": "5228,5229,5230", + "examine": "Formed over many years of dripping limestone." + }, + { + "ids": "5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243", + "examine": "A tooth shaped rock formation protruding from the floor." + }, + { + "ids": "5244,5245", + "examine": "Looks a bit tatty..." + }, + { + "ids": "5246,5247", + "examine": "A well slept in bed." + }, + { + "ids": "5248", + "examine": "It looks like a tree made of crystal." + }, + { + "ids": "5249", + "examine": "Looks to me like a quickly built fire." + }, + { + "ids": "5250", + "examine": "I can climb down this." + }, + { + "ids": "5251", + "examine": "I can climb this." + }, + { + "ids": "5252", + "examine": "A recently extinguished fire." + }, + { + "ids": "5253", + "examine": "I wish I could sting other people." + }, + { + "ids": "5254", + "examine": "Probably feels like a mild bee sting." + }, + { + "ids": "5255", + "examine": "I wouldn't like to get stung." + }, + { + "ids": "5256", + "examine": "Dock leaves at the ready." + }, + { + "ids": "5257", + "examine": "Nettles sting my leggies." + }, + { + "ids": "5258", + "examine": "These may hurt." + }, + { + "ids": "5259,5260,5261", + "examine": "A ghostly barrier." + }, + { + "ids": "5262,5263", + "examine": "These stairs were carved out of the rock of the cavern." + }, + { + "ids": "5264", + "examine": "I can climb this." + }, + { + "ids": "5265", + "examine": "I can climb up here." + }, + { + "ids": "5266", + "examine": "I can go below decks with this ladder." + }, + { + "ids": "5267", + "examine": "I wonder what's under it." + }, + { + "ids": "5268", + "examine": "I wonder what's down there." + }, + { + "ids": "5269", + "examine": "I can't see a rock!" + }, + { + "ids": "5270,5271,5272", + "examine": "I wonder what's inside." + }, + { + "ids": "5273", + "examine": "Perhaps I should search it." + }, + { + "ids": "5274", + "examine": "High above here is a tattered flag, blowing in the wind." + }, + { + "ids": "5275", + "examine": "An appliance for cooking with." + }, + { + "ids": "5276", + "examine": "The bank teller will serve you from here." + }, + { + "ids": "5277", + "examine": "This booth is closed." + }, + { + "ids": "5278,5279", + "examine": "The resting place of Necrovarus' mortal body." + }, + { + "ids": "5280", + "examine": "I can climb these stairs." + }, + { + "ids": "5281", + "examine": "They go down." + }, + { + "ids": "5282", + "examine": "A ghastly fountain filled with slime and bones, the source of Necrovarus' power." + }, + { + "ids": "5283", + "examine": "It's a small Ectofuntus." + }, + { + "ids": "5284", + "examine": "A big grinding thing." + }, + { + "ids": "5285,5286", + "examine": "The tatty gangplank of a tatty ship." + }, + { + "ids": "5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305", + "examine": "Seen better days." + }, + { + "ids": "5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329", + "examine": "A wooden rowing boat." + }, + { + "ids": "5330", + "examine": "A pile of boxes for storage." + }, + { + "ids": "5331", + "examine": "A leafy fern." + }, + { + "ids": "5332", + "examine": "A small bushy plant." + }, + { + "ids": "5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344", + "examine": "A leafy shrub." + }, + { + "ids": "5345", + "examine": "The ideal thing to sit on." + }, + { + "ids": "5346,5347", + "examine": "This needs dusting before I'll sit on it." + }, + { + "ids": "5348", + "examine": "Not so good for sitting on." + }, + { + "ids": "5349", + "examine": "Generally used for putting things on." + }, + { + "ids": "5350", + "examine": "Actually, I could do with a drink..." + }, + { + "ids": "5351", + "examine": "For leaning against..." + }, + { + "ids": "5352", + "examine": "One horse power, wooden suspension. A beauty." + }, + { + "ids": "5353", + "examine": "A wooden wheelbarrow." + }, + { + "ids": "5354", + "examine": "Animal feeder." + }, + { + "ids": "5355", + "examine": "It probably hasn't got anything interesting inside." + }, + { + "ids": "5356,5357", + "examine": "They probably haven't got anything interesting inside." + }, + { + "ids": "5358", + "examine": "Looks like he's been dead a while now..." + }, + { + "ids": "5359", + "examine": "I don't think he'd mind us checking for his wallet now..." + }, + { + "ids": "5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396", + "examine": "I'm sure he died of natural causes. Like a massive dragon or something..." + }, + { + "ids": "5397,5398,5399,5400,5401,5402", + "examine": "This figure brings luck to those who sail." + }, + { + "ids": "5403", + "examine": "Without this I'm going around in circles." + }, + { + "ids": "5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414", + "examine": "Holds up the sails." + }, + { + "ids": "5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428", + "examine": "Allows access to other parts of the ship." + }, + { + "ids": "5429", + "examine": "It's a table with candles on." + }, + { + "ids": "5430", + "examine": "Doesn't look too good..." + }, + { + "ids": "5431,5432,5433,5434,5435,5436,5437,5438", + "examine": "Looks a bit empty." + }, + { + "ids": "5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452", + "examine": "It's been knocked off its hinges." + }, + { + "ids": "5453,5454,5455,5456,5457,5458,5459,5460", + "examine": "It's a door." + }, + { + "ids": "5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487", + "examine": "A subterranean pool of ectoplasm." + }, + { + "ids": "5488", + "examine": "I can climb this." + }, + { + "ids": "5489", + "examine": "The finest rings." + }, + { + "ids": "5490", + "examine": "I wonder what's under it?" + }, + { + "ids": "5491,5492", + "examine": "I wonder what's down there?" + }, + { + "ids": "5493", + "examine": "I can climb this." + }, + { + "ids": "5494", + "examine": "A crude torch stuck in the ground." + }, + { + "ids": "5495,5496", + "examine": "I guess I could sleep in it if I was really tired." + }, + { + "ids": "5497,5498", + "examine": "A well slept in bed." + }, + { + "ids": "5499,5500", + "examine": "Hot!" + }, + { + "ids": "5501,5502,5503,5504,5505,5506,5507", + "examine": "Stops people getting out." + }, + { + "ids": "5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537", + "examine": "It's a lectern." + }, + { + "ids": "5538", + "examine": "Makes you cry." + }, + { + "ids": "5539,5540,5541,5542", + "examine": "Found near the water's edge." + }, + { + "ids": "5543", + "examine": "Isn't Heather a girls' name?" + }, + { + "ids": "5544", + "examine": "Smells lovely!" + }, + { + "ids": "5545", + "examine": "Who is this Heather girl?" + }, + { + "ids": "5546", + "examine": "A purple haze of delight." + }, + { + "ids": "5547", + "examine": "The colour purple on stems." + }, + { + "ids": "5548", + "examine": "I ponder... Why is it purple?" + }, + { + "ids": "5549", + "examine": "I wonder why it's purple?" + }, + { + "ids": "5550", + "examine": "A cure for nettle stings." + }, + { + "ids": "5551", + "examine": "A droopy tree." + }, + { + "ids": "5552,5553", + "examine": "These trees are found near water." + }, + { + "ids": "5554", + "examine": "This is what is left of a willow tree." + }, + { + "ids": "5555,5556,5557", + "examine": "I don't know art, but I like it!" + }, + { + "ids": "5558", + "examine": "Aggie's cooking something, probably best not to think what..." + }, + { + "ids": "5559", + "examine": "Trinkets and stuff." + }, + { + "ids": "5560", + "examine": "Looking good!" + }, + { + "ids": "5561", + "examine": "Aggie's broomstick." + }, + { + "ids": "5562,5563", + "examine": "Aggie has already dyed this cloth." + }, + { + "ids": "5564", + "examine": "A thoroughly used bed." + }, + { + "ids": "5565,5566,5567,5568", + "examine": "A lovely comfy-looking big bed." + }, + { + "ids": "5569,5570", + "examine": "The remains of a stone wall." + }, + { + "ids": "5571", + "examine": "An empty home for chickens." + }, + { + "ids": "5572,5573", + "examine": "A lovely bare chicken coop." + }, + { + "ids": "5574", + "examine": "Full of animal feed." + }, + { + "ids": "5575,5576,5577", + "examine": "Animal feeder." + }, + { + "ids": "5578", + "examine": "A traveller's companion." + }, + { + "ids": "5579", + "examine": "Loaded with hay and ready to roll." + }, + { + "ids": "5580", + "examine": "A wooden wheelbarrow." + }, + { + "ids": "5581,5582", + "examine": "Someone's been chopping logs." + }, + { + "ids": "5583,5584,5585,5586,5587,5588", + "examine": "Baby bread." + }, + { + "ids": "5589,5590,5591,5592,5593", + "examine": "The river makes it spin." + }, + { + "ids": "5594", + "examine": "I'd better not get my hands trapped in that." + }, + { + "ids": "5595", + "examine": "Diango's Toy Stall." + }, + { + "ids": "5596", + "examine": "Doesn't look too good..." + }, + { + "ids": "5597", + "examine": "Shows which way the wind blows." + }, + { + "ids": "5598,5599,5600,5601,5602,5603", + "examine": "A barrel for collecting rain water." + }, + { + "ids": "5604", + "examine": "A rock." + }, + { + "ids": "5605", + "examine": "A small rock." + }, + { + "ids": "5606,5607", + "examine": "Some rock." + }, + { + "ids": "5608", + "examine": "This fire is already in use, I wouldn't mess with it if I were you..." + }, + { + "ids": "5609,5610,5611,5612", + "examine": "They could do with a wash." + }, + { + "ids": "5613", + "examine": "It smells like the rats aren't washing often enough." + }, + { + "ids": "5614", + "examine": "The ideal thing to sit on." + }, + { + "ids": "5615", + "examine": "Sit back and relax..." + }, + { + "ids": "5616,5617", + "examine": "This tells you which way is which." + }, + { + "ids": "5618", + "examine": "These open and close!" + }, + { + "ids": "5619,5620", + "examine": "This may be worth searching." + }, + { + "ids": "5621", + "examine": "An elegant ceramic pot tarnished with the dirt of a hundred years." + }, + { + "ids": "5622", + "examine": "I wonder what's inside..." + }, + { + "ids": "5623", + "examine": "It smells a bit stuffy." + }, + { + "ids": "5624", + "examine": "It smells funny in there." + }, + { + "ids": "5625,5626", + "examine": "Ned is making some rope here." + }, + { + "ids": "5627", + "examine": "A blue standard." + }, + { + "ids": "5628,5629,5630", + "examine": "A standard of Lumbridge Castle." + }, + { + "ids": "5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787", + "examine": "Glowing embers." + }, + { + "ids": "5788", + "examine": "The sort of bench you get in churches." + }, + { + "ids": "5789,5790", + "examine": "An expertly carved statue of a former King of Misthalin." + }, + { + "ids": "5791,36749,36751", + "examine": "A carving of a figure from the history of RuneScape." + }, + { + "ids": "5792", + "examine": "When I've ground some flour, I'll be able to collect it here." + }, + { + "ids": "5793,5794,5795,5796,5797,5798", + "examine": "It's a large crack in the wall." + }, + { + "ids": "5799,5800,5801,5802", + "examine": "It's a trapdoor." + }, + { + "ids": "5803,5804,5805,5806,5807", + "examine": "It's an open trapdoor." + }, + { + "ids": "5808", + "examine": "An incredibly detailed stone sculpture." + }, + { + "ids": "5809", + "examine": "Helps the Seers predict the weather when it's working." + }, + { + "ids": "5810,5811", + "examine": "Helps the Seers predict the weather." + }, + { + "ids": "5812", + "examine": "I can climb this." + }, + { + "ids": "5813,5814", + "examine": "I can climb down this." + }, + { + "ids": "5815", + "examine": "A candle, a lens and some sort of crystal all precariously balanced together." + }, + { + "ids": "5816,5817,5818,5819,5820,5821,5822,5823,5824", + "examine": "A beacon so gnome gliders can safely land." + }, + { + "ids": "5825", + "examine": "Fly Gnome Air." + }, + { + "ids": "5826,5827,5828,5829,5830", + "examine": "This shop deals in antique swords." + }, + { + "ids": "5831,5832,5833,5834", + "examine": "Shop counter." + }, + { + "ids": "5835,5836,5837,5838,5839,5840,5841", + "examine": "Don't want to close this, I might not be able to get back down." + }, + { + "ids": "5842", + "examine": "It overlooks the path below. Let's hope it won't fall on your head." + }, + { + "ids": "5843", + "examine": "Someone is climbing down there! Looks dangerous." + }, + { + "ids": "5844", + "examine": "Placed in a perfect position for stumbling over." + }, + { + "ids": "5845", + "examine": "There is a rope going over it." + }, + { + "ids": "5846", + "examine": "Someone is climbing down the rope." + }, + { + "ids": "5847", + "examine": "You will need to climb over it." + }, + { + "ids": "5848", + "examine": "The tree stands tall at the edge of the pool." + }, + { + "ids": "5849", + "examine": "You can't stand on them, but maybe something can be wedged into there." + }, + { + "ids": "5850,5851", + "examine": "Something put on top of this wouldn't fall off, it's quite smooth and flat." + }, + { + "ids": "5852,5853,5854", + "examine": "Someone put a plank on top of the stone! Clever..." + }, + { + "ids": "5855", + "examine": "The pool looks very peaceful. You can also hear faint singing coming from it." + }, + { + "ids": "5856", + "examine": "The legendary White Pearl fruit is growing on these thorny bushes!" + }, + { + "ids": "5857", + "examine": "There's a nasty stench coming from the cave." + }, + { + "ids": "5858", + "examine": "Faint rays of daylight shine through." + }, + { + "ids": "5859", + "examine": "It's very dark down there." + }, + { + "ids": "5860,5861", + "examine": "Very pointy, very sharp." + }, + { + "ids": "5862", + "examine": "This is the place where you buried Asleif." + }, + { + "ids": "5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876,5877", + "examine": "Asleif was given a proper burial on this spot." + }, + { + "ids": "5878", + "examine": "It's a long wooden table." + }, + { + "ids": "5879", + "examine": "Generally used for putting things on." + }, + { + "ids": "5880", + "examine": "Good for sitting on." + }, + { + "ids": "5881,5882", + "examine": "A crude torch stuck in the ground." + }, + { + "ids": "5883", + "examine": "Sticky, dirty mud." + }, + { + "ids": "5884", + "examine": "This stinks..." + }, + { + "ids": "5885", + "examine": "The roots go down into the mud." + }, + { + "ids": "5886", + "examine": "Sticky, dirty roots covered in sticky, dirty mud." + }, + { + "ids": "5887,5888,5889,5890", + "examine": "It's barely a door, really." + }, + { + "ids": "5891,5892,5893,5894", + "examine": "The entry to a special tent in the camp." + }, + { + "ids": "5895", + "examine": "It's just a big stone, really." + }, + { + "ids": "5896", + "examine": "Uh oh, someone is going to be in trouble!" + }, + { + "ids": "5897,5898,5899,5900,5901", + "examine": "The pool looks very peaceful. You can also hear faint singing coming from it." + }, + { + "ids": "5902,5903,5904", + "examine": "It's only useful for hiding behind now." + }, + { + "ids": "5905,5906,5907,5908", + "examine": "This tree has been cut down." + }, + { + "ids": "5909", + "examine": "A still for making lamp oil." + }, + { + "ids": "5910,5911,5912,5913,5914,5915,5916", + "examine": "The still has oil in." + }, + { + "ids": "5917,5918,5919,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940,5941,5942,5943,5944,5945", + "examine": "Noxious fumes bubble up from the bowels of the earth." + }, + { + "ids": "5946", + "examine": "You see a circle of light at the top." + }, + { + "ids": "5947", + "examine": "An entrance to the dark caves." + }, + { + "ids": "5948,5949,5950,5951,5952,5953,5954,5955,5956,5957,5958", + "examine": "I can jump from this stepping stone." + }, + { + "ids": "5959,5960,5961,5962,5963", + "examine": "I wonder what this does..." + }, + { + "ids": "5964,5965", + "examine": "Flying in mid-air!" + }, + { + "ids": "5966", + "examine": "A blocked passage." + }, + { + "ids": "5967,5968,5969,5970,5971,5972", + "examine": "I'd better leave his expensive dwarven balls alone." + }, + { + "ids": "5973,5974", + "examine": "A small cave entrance." + }, + { + "ids": "5975,5976", + "examine": "A powerful ranging device that fires metal balls." + }, + { + "ids": "5977,5978,5979,5980", + "examine": "It's a sheer wall of fire, rising as high as you can see." + }, + { + "ids": "5981,5982,5983,5984", + "examine": "Lighting for the caves." + }, + { + "ids": "5985", + "examine": "A rock." + }, + { + "ids": "5986", + "examine": "A small rock." + }, + { + "ids": "5987,5988", + "examine": "A rock." + }, + { + "ids": "5989,5990,5991,5992,5993,5994,5995,5996,5997", + "examine": "A mineral vein that looks distinctly like gold." + }, + { + "ids": "5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008", + "examine": "Functions like an open door..." + }, + { + "ids": "6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031", + "examine": "It's a tiny little blue flame. Is this the essence of the Arzinian Being?" + }, + { + "ids": "6032,6033,6034,6035", + "examine": "Powers the boat." + }, + { + "ids": "6036,6037", + "examine": "Allows access to other parts of the ship." + }, + { + "ids": "6038,6039,6040,6041,6042", + "examine": "Without this I'm going around in circles." + }, + { + "ids": "6043,6044", + "examine": "Powers the boat." + }, + { + "ids": "6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063", + "examine": "You can 'cart' things around on this." + }, + { + "ids": "6064", + "examine": "A stand for hats." + }, + { + "ids": "6065", + "examine": "Some dwarf clothes that are obviously too small for me!" + }, + { + "ids": "6066", + "examine": "An empty weapon rack." + }, + { + "ids": "6067,6068,6069", + "examine": "A weapon rack." + }, + { + "ids": "6070", + "examine": "A method of dwarf storage" + }, + { + "ids": "6071,6072,6073,6074", + "examine": "A method of dwarf storage." + }, + { + "ids": "6075", + "examine": "Useful for a dwarf." + }, + { + "ids": "6076,6077,6078,6079", + "examine": "A big desk, for a dwarf!" + }, + { + "ids": "6080", + "examine": "Spins yarn." + }, + { + "ids": "6081", + "examine": "Banking transactions are processed here." + }, + { + "ids": "6082", + "examine": "Banking transactions are recorded here." + }, + { + "ids": "6083", + "examine": "This booth is closed." + }, + { + "ids": "6084", + "examine": "The bank teller will serve you from here." + }, + { + "ids": "6085", + "examine": "A way upwards." + }, + { + "ids": "6086", + "examine": "A way down." + }, + { + "ids": "6087", + "examine": "A way upwards." + }, + { + "ids": "6088", + "examine": "A way down." + }, + { + "ids": "6089", + "examine": "A way upwards." + }, + { + "ids": "6090", + "examine": "A way down." + }, + { + "ids": "6091,6092", + "examine": "A treasure trove of knowledge." + }, + { + "ids": "6093,6094,6095", + "examine": "A lovely place to cook meat." + }, + { + "ids": "6096", + "examine": "A great place to cook meat." + }, + { + "ids": "6097,6098,6099", + "examine": "A good source of water." + }, + { + "ids": "6100", + "examine": "The door is closed." + }, + { + "ids": "6101", + "examine": "The door is open." + }, + { + "ids": "6102", + "examine": "The door is closed." + }, + { + "ids": "6103", + "examine": "The door is open." + }, + { + "ids": "6104", + "examine": "The door is closed." + }, + { + "ids": "6105", + "examine": "The door is open." + }, + { + "ids": "6106", + "examine": "The door is closed." + }, + { + "ids": "6107", + "examine": "The door is open." + }, + { + "ids": "6108", + "examine": "The door is closed." + }, + { + "ids": "6109", + "examine": "The door is open." + }, + { + "ids": "6110", + "examine": "The door is closed." + }, + { + "ids": "6111", + "examine": "The door is open." + }, + { + "ids": "6112", + "examine": "The door is closed." + }, + { + "ids": "6113", + "examine": "The door is open." + }, + { + "ids": "6114", + "examine": "The door is closed." + }, + { + "ids": "6115,6116,6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132,6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145", + "examine": "The door is open." + }, + { + "ids": "6146", + "examine": "Useful for keeping birds." + }, + { + "ids": "6147,6148,6149", + "examine": "Tower of rock." + }, + { + "ids": "6150", + "examine": "Useful for making weapons." + }, + { + "ids": "6151", + "examine": "Used for getting water." + }, + { + "ids": "6152,6153", + "examine": "Used for getting drunk." + }, + { + "ids": "6154,6155,6156,6157", + "examine": "Used for storage." + }, + { + "ids": "6158,6159,6160,6161", + "examine": "Not good for eating." + }, + { + "ids": "6162", + "examine": "Finest precious stones." + }, + { + "ids": "6163", + "examine": "Bread and cakes are spread out over it." + }, + { + "ids": "6164", + "examine": "Finely wrought wares of silver." + }, + { + "ids": "6165", + "examine": "I can get clothes made up from this stall." + }, + { + "ids": "6166,6167,6168,6169,6170,6171,6172", + "examine": "A whole lot of tools for crafting." + }, + { + "ids": "6173,6174,6175", + "examine": "A fine piece of sculpting." + }, + { + "ids": "6176", + "examine": "Oblong boxes. You hope there isn't anything other than salt inside." + }, + { + "ids": "6177", + "examine": "Big mysterious crates. You wonder what could be inside." + }, + { + "ids": "6178", + "examine": "Wooden crates, contents unknown." + }, + { + "ids": "6179,6180", + "examine": "They could do with a wash." + }, + { + "ids": "6181", + "examine": "Dead animal parts dangling!" + }, + { + "ids": "6182", + "examine": "Dead meat. Dangling from the wall. Looks delicious." + }, + { + "ids": "6183", + "examine": "It looks as hard as a rock, not very inviting." + }, + { + "ids": "6184", + "examine": "A smelly old mattress." + }, + { + "ids": "6185,6186", + "examine": "Metal plating to protect the dwarf." + }, + { + "ids": "6187", + "examine": "Useful... for a dwarf!" + }, + { + "ids": "6188", + "examine": "Various implements for working with metal." + }, + { + "ids": "6189,6190", + "examine": "A hot place for forging things in." + }, + { + "ids": "6191,6192", + "examine": "Being repaired." + }, + { + "ids": "6193", + "examine": "I look shorter, but not necessarily sweeter!" + }, + { + "ids": "6194,6195", + "examine": "Used for sitting." + }, + { + "ids": "6196,6197,6198,6199", + "examine": "Useful for a dwarf." + }, + { + "ids": "6200,6201", + "examine": "Fit for a dwarven feast!" + }, + { + "ids": "6202,6203", + "examine": "Gives out light, but then you knew that already." + }, + { + "ids": "6204", + "examine": "A simple place to sleep." + }, + { + "ids": "6205", + "examine": "A good dwarven bed. Too small for me!" + }, + { + "ids": "6206", + "examine": "Many important meetings are held here..." + }, + { + "ids": "6207", + "examine": "Draped in cloth." + }, + { + "ids": "6208,6209,6210", + "examine": "A beautiful seat, fit for a King." + }, + { + "ids": "6211", + "examine": "A dwarf table with chopping board." + }, + { + "ids": "6212", + "examine": "This tree has been cut down." + }, + { + "ids": "6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229", + "examine": "A barrel full of ranging equipment..." + }, + { + "ids": "6230", + "examine": "I suppose he wants my money." + }, + { + "ids": "6231", + "examine": "A lovely table." + }, + { + "ids": "6232,6233,6234,6235", + "examine": "An expensive water feature." + }, + { + "ids": "6236", + "examine": "Stop for what, food?" + }, + { + "ids": "6237", + "examine": "Yellow blossom, lovely." + }, + { + "ids": "6238", + "examine": "Closed." + }, + { + "ids": "6239", + "examine": "Open." + }, + { + "ids": "6240", + "examine": "Closed." + }, + { + "ids": "6241", + "examine": "Open." + }, + { + "ids": "6242,6243,6244,6245", + "examine": "A stone staircase." + }, + { + "ids": "6246,6247,6248", + "examine": "Has upon it a beer, which I will not take for moral reasons." + }, + { + "ids": "6249", + "examine": "No this is not a mirage!" + }, + { + "ids": "6250,6251,6252,6253,6254", + "examine": "It's a goldfish! No, wait, it's just a bed." + }, + { + "ids": "6255,6256", + "examine": "Animal feeder." + }, + { + "ids": "6257", + "examine": "Lovely... Fresh." + }, + { + "ids": "6258", + "examine": "Dry dung." + }, + { + "ids": "6259", + "examine": "Smelly." + }, + { + "ids": "6260", + "examine": "I can climb down this." + }, + { + "ids": "6261,6262", + "examine": "I can climb this." + }, + { + "ids": "6263", + "examine": "Useful for pets." + }, + { + "ids": "6264", + "examine": "Useful for keeping birds." + }, + { + "ids": "6265,6266", + "examine": "Bird cage." + }, + { + "ids": "6267", + "examine": "An empty cage, maybe the owner let the creature free... I do hope so." + }, + { + "ids": "6268,6269,6270,6271,6272,6273", + "examine": "Useful for pets." + }, + { + "ids": "6274", + "examine": "Lovely comfy looking big bed." + }, + { + "ids": "6275", + "examine": "Laden with heaps of paper." + }, + { + "ids": "6276", + "examine": "I don't know much about art, but I like this." + }, + { + "ids": "6277", + "examine": "Look at the size of this cactus." + }, + { + "ids": "6278", + "examine": "Don't you open that trapdoor!" + }, + { + "ids": "6279", + "examine": "There is a rope leading to the bottom of this smoke filled well." + }, + { + "ids": "6280,6281", + "examine": "I can climb this." + }, + { + "ids": "6282", + "examine": "A portal to another land?" + }, + { + "ids": "6283,6284,6285,6286,6287,6288,6289,6290,6291", + "examine": "Weird looking pillar." + }, + { + "ids": "6292,6293", + "examine": "Shelves filled with interesting books." + }, + { + "ids": "6294", + "examine": "A locked display case for valuable artefacts." + }, + { + "ids": "6295", + "examine": "One of the sculptures is missing. Oh yes, that was me!" + }, + { + "ids": "6296", + "examine": "It looks like the demon didn't survive after all." + }, + { + "ids": "6297", + "examine": "He looks old, older than me anyway." + }, + { + "ids": "6298", + "examine": "I don't think he's going to make it." + }, + { + "ids": "6299,6300", + "examine": "I don't understand, why didn't he go back to Lumby?" + }, + { + "ids": "6301", + "examine": "A throne encrusted with sparkling gems." + }, + { + "ids": "6302,6303,6304,6305,6306", + "examine": "A throne from which you have removed the gems." + }, + { + "ids": "6307", + "examine": "A statuette of a golem, facing right." + }, + { + "ids": "6308", + "examine": "A statuette of a golem, facing left." + }, + { + "ids": "6309,6310", + "examine": "The statuette is missing from this alcove." + }, + { + "ids": "6311", + "examine": "Not good for eating." + }, + { + "ids": "6312", + "examine": "I can climb this." + }, + { + "ids": "6313,6314,6315,6316,6317,6318,6319,6320,6321,6322", + "examine": "I can climb down this." + }, + { + "ids": "6323", + "examine": "A broken clay arm." + }, + { + "ids": "6324", + "examine": "A clay foot." + }, + { + "ids": "6325", + "examine": "Half a golem smashed and broken." + }, + { + "ids": "6326", + "examine": "Smashed and half buried." + }, + { + "ids": "6327", + "examine": "A device once used for making pottery." + }, + { + "ids": "6328", + "examine": "Once upon a time this was used to make pottery." + }, + { + "ids": "6329", + "examine": "Once upon a time this made clay hard." + }, + { + "ids": "6330", + "examine": "There was a lot of pottery made here a long time ago." + }, + { + "ids": "6331", + "examine": "A statue of a guy with a hammer." + }, + { + "ids": "6332", + "examine": "A weathered old statue." + }, + { + "ids": "6333", + "examine": "A reclining lady." + }, + { + "ids": "6334", + "examine": "This statue has been tampered with." + }, + { + "ids": "6335,6336,6337", + "examine": "Contains a statue of a woman." + }, + { + "ids": "6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362", + "examine": "Empty." + }, + { + "ids": "6363", + "examine": "A very heavy stone door." + }, + { + "ids": "6364,6365,6366,6367,6368,6369,6370,6371", + "examine": "A door to a demon's lair?" + }, + { + "ids": "6372,6373,6374,6375,6376,6377,6378,6379,6380", + "examine": "A stone staircase." + }, + { + "ids": "6381", + "examine": "A source of water for the river Elid." + }, + { + "ids": "6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397,6398,6399,6400,6401", + "examine": "Maybe I could swing on this somehow..." + }, + { + "ids": "6402", + "examine": "A limestone ceiling growth." + }, + { + "ids": "6403", + "examine": "A tooth shaped rock formation protruding from the floor." + }, + { + "ids": "6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417", + "examine": "An old mystical torch." + }, + { + "ids": "6418,6419", + "examine": "I can climb this." + }, + { + "ids": "6420,6421,6422", + "examine": "I wonder what's inside?" + }, + { + "ids": "6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433", + "examine": "A magical aura seems to shimmer over the glass..." + }, + { + "ids": "6434,6435", + "examine": "I wonder what that's there for..." + }, + { + "ids": "6436", + "examine": "I can climb this." + }, + { + "ids": "6437,6438", + "examine": "An ancient looking tomb." + }, + { + "ids": "6439,6440", + "examine": "Climb this rope to go up." + }, + { + "ids": "6441", + "examine": "Looks like a small cave." + }, + { + "ids": "6442", + "examine": "Blocked by an icicle." + }, + { + "ids": "6443", + "examine": "Blocked by two icicles." + }, + { + "ids": "6444", + "examine": "Blocked by three icicles." + }, + { + "ids": "6445", + "examine": "Blocked by four icicles." + }, + { + "ids": "6446", + "examine": "Blocked by five icicles." + }, + { + "ids": "6447", + "examine": "Looks like a small cave." + }, + { + "ids": "6448,6449", + "examine": "It looks very sturdy." + }, + { + "ids": "6450", + "examine": "I can climb this." + }, + { + "ids": "6451,6452,6453", + "examine": "A wrought iron gate." + }, + { + "ids": "6454", + "examine": "Even rocks could freeze in this cold!" + }, + { + "ids": "6455,6456,6457,6458,6459,6460", + "examine": "Looks slippery." + }, + { + "ids": "6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471", + "examine": "An ice gate." + }, + { + "ids": "6472,6473,6474,6475,6476,6477,6478,6479,6480", + "examine": "Chunky pieces of ice." + }, + { + "ids": "6481,6482", + "examine": "A mysterious tunnel-like structure." + }, + { + "ids": "6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493", + "examine": "You can feel a mysterious power emanating from it..." + }, + { + "ids": "6494,6495,6496", + "examine": "This door is sealed by an ancient mystical power..." + }, + { + "ids": "6497,6498,6499,6500", + "examine": "I can climb down this." + }, + { + "ids": "6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511", + "examine": "I can climb this." + }, + { + "ids": "6512", + "examine": "A fancy name for a coffin." + }, + { + "ids": "6513", + "examine": "A strange thing to leave lying around..." + }, + { + "ids": "6514,6515,6516,6517,6518,6519,6520", + "examine": "I hope this is just ornamental..." + }, + { + "ids": "6521,6522", + "examine": "Uh-oh!" + }, + { + "ids": "6523", + "examine": "This leads downwards." + }, + { + "ids": "6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537", + "examine": "You can see a small fissure in the ground here." + }, + { + "ids": "6538,6539,6540,6541,6542,6543,6544", + "examine": "The body of a lion, the head of a man?" + }, + { + "ids": "6545,6546,6547,6548", + "examine": "A smooth, sandstone door that is slightly warm to the touch." + }, + { + "ids": "6549,6550", + "examine": "A well down into the pyramid." + }, + { + "ids": "6551", + "examine": "A portal that leads you out of the pyramid." + }, + { + "ids": "6552", + "examine": "A mysterious ancient altar to some forgotten god..." + }, + { + "ids": "6553,6554,6555,6556,6557,6558,6559,6560", + "examine": "Opens into another area." + }, + { + "ids": "6561,6562,6563,6564,6565", + "examine": "A ladder that's almost not there at all..." + }, + { + "ids": "6566,6567", + "examine": "Gate like?" + }, + { + "ids": "6568", + "examine": "Garments for the discerning." + }, + { + "ids": "6569", + "examine": "Gone-off bread, cakes and pastries." + }, + { + "ids": "6570", + "examine": "Finest precious stones." + }, + { + "ids": "6571", + "examine": "These will keep you warm." + }, + { + "ids": "6572", + "examine": "The spice is right." + }, + { + "ids": "6573", + "examine": "An empty market stall." + }, + { + "ids": "6574", + "examine": "Fine brews from exotic regions." + }, + { + "ids": "6575,6576,6577", + "examine": "Best used with a horse." + }, + { + "ids": "6578,6579,6580", + "examine": "Grows a yellow fruit." + }, + { + "ids": "6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604", + "examine": "A way to get in the tent." + }, + { + "ids": "6605", + "examine": "Wet and salty." + }, + { + "ids": "6606", + "examine": "The focus of the suntrap." + }, + { + "ids": "6607,6608,6609,6610,6611,6612,6613", + "examine": "A shiny mirror." + }, + { + "ids": "6614", + "examine": "A large door with a hieroglyph of a cat." + }, + { + "ids": "6615,6616,6617,6618,6619", + "examine": "Gate like?" + }, + { + "ids": "6620,6621", + "examine": "It looks like a hole in the wall." + }, + { + "ids": "6622", + "examine": "Rocky." + }, + { + "ids": "6623", + "examine": "An entrance into a tunnel. I wonder where it leads to." + }, + { + "ids": "6624", + "examine": "It looks like a door." + }, + { + "ids": "6625", + "examine": "Hmm. A door." + }, + { + "ids": "6626,6627,6628", + "examine": "A big wooden door." + }, + { + "ids": "6629", + "examine": "That could hurt." + }, + { + "ids": "6630,6631", + "examine": "A strange thing to leave lying around..." + }, + { + "ids": "6632,6633,6634", + "examine": "I can't see the bottom." + }, + { + "ids": "6635,6636", + "examine": "Has a lid shaped like a man. I think it contains someone's liver. Yuck." + }, + { + "ids": "6637,6638", + "examine": "Has a lid shaped like a crocodile. Yuck, I think there are lungs inside." + }, + { + "ids": "6639,6640", + "examine": "Has a lid shaped like a bug. Disgusting! I think there's a stomach inside." + }, + { + "ids": "6641", + "examine": "Has a lid shaped like an ape. Eeew! I think it contains someone's intestines." + }, + { + "ids": "6642", + "examine": "Doorway*Opens into another area, come on, I know this." + }, + { + "ids": "6644", + "examine": "Useful for putting things on." + }, + { + "ids": "6645", + "examine": "A ladder!! Never seen one of those before." + }, + { + "ids": "6646", + "examine": "I wonder what's inside." + }, + { + "ids": "6647", + "examine": "Perhaps I should search it." + }, + { + "ids": "6648", + "examine": "I wonder where this goes?" + }, + { + "ids": "6649", + "examine": "They go down." + }, + { + "ids": "6650", + "examine": "Phew!! That's one big bridge." + }, + { + "ids": "6651,6652", + "examine": "A big bridge over the river." + }, + { + "ids": "6653,6654", + "examine": "Wow. More bridge. Awesome." + }, + { + "ids": "6655", + "examine": "Oops." + }, + { + "ids": "6656", + "examine": "Rolls of colourful cloth." + }, + { + "ids": "6657", + "examine": "An ancient giant serpent." + }, + { + "ids": "6658", + "examine": "A tunnel leading upwards." + }, + { + "ids": "6659", + "examine": "A tunnel leading into the depths of the earth." + }, + { + "ids": "6660", + "examine": "A rock wall infused with the power of Guthix." + }, + { + "ids": "6661", + "examine": "The wall is weeping blue tears." + }, + { + "ids": "6662", + "examine": "The wall is weeping green tears." + }, + { + "ids": "6663,6664", + "examine": "The wall is not weeping at the moment." + }, + { + "ids": "6665", + "examine": "The wall is weeping blue tears." + }, + { + "ids": "6666", + "examine": "The wall is weeping green tears." + }, + { + "ids": "6667,6668", + "examine": "The wall is not weeping at the moment." + }, + { + "ids": "6669,6670,6671", + "examine": "Stone with blue veins." + }, + { + "ids": "6672", + "examine": "They don't look too easy to climb." + }, + { + "ids": "6673,6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701", + "examine": "I could climb these." + }, + { + "ids": "6702,6703,6704,6705,6706,6707", + "examine": "I can climb these stairs." + }, + { + "ids": "6708,6709,6710,6711,6712", + "examine": "I can climb this." + }, + { + "ids": "6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731", + "examine": "I wonder what is awaiting me on the other side?" + }, + { + "ids": "6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761,6762,6763,6764,6765,6766", + "examine": "I wonder what awaits me on the other side?" + }, + { + "ids": "6767,6768,6769,6770", + "examine": "A crude torch stuck in the ground." + }, + { + "ids": "6771,6772,6773", + "examine": "A large stone coffin." + }, + { + "ids": "6774,6775", + "examine": "A large stone chest." + }, + { + "ids": "6776", + "examine": "Looks like he's been dead a while now..." + }, + { + "ids": "6777", + "examine": "I don't think he'd mind us checking for his wallet now..." + }, + { + "ids": "6778,6779,6780,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790", + "examine": "I'm sure he died of natural causes. Like a massive dragon or something..." + }, + { + "ids": "6791,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820", + "examine": "The groundskeeper's bed." + }, + { + "ids": "6821,6822,6823", + "examine": "A large stone coffin." + }, + { + "ids": "6824,6825,6826", + "examine": "It's locked." + }, + { + "ids": "6827,6828,6829,6830,6831,6832,6833,6834", + "examine": "It might still work..." + }, + { + "ids": "6835", + "examine": "Danger... weak surface beyond gate. Digging may lead to cave-ins." + }, + { + "ids": "6836,6837,6838", + "examine": "Sturdy metal bars." + }, + { + "ids": "6839", + "examine": "Smells pretty bad!" + }, + { + "ids": "6840", + "examine": "It looks as this is where some wall fungus used to be." + }, + { + "ids": "6841,6842,6843", + "examine": "Some crude stone steps." + }, + { + "ids": "6844,6845", + "examine": "An old crude tomb." + }, + { + "ids": "6846", + "examine": "It's damaged." + }, + { + "ids": "6847", + "examine": "A note says, 'Please ring for attention.'" + }, + { + "ids": "6848", + "examine": "An old crude tomb." + }, + { + "ids": "6849", + "examine": "'Leave da dead-uns boxes 'lone or else ya goes down da 'ole'" + }, + { + "ids": "6850", + "examine": "An old crude tomb." + }, + { + "ids": "6851", + "examine": "This coffin is spilt over the floor." + }, + { + "ids": "6852", + "examine": "This coffin is open." + }, + { + "ids": "6853", + "examine": "An old crude tomb." + }, + { + "ids": "6854", + "examine": "This coffin is spilt over the floor." + }, + { + "ids": "6855", + "examine": "This coffin is open." + }, + { + "ids": "6856,6857,6858,6859,6860,6861,6862,6863,6864", + "examine": "A barricade made from skulls and bones." + }, + { + "ids": "6865", + "examine": "Not very high." + }, + { + "ids": "6866", + "examine": "Hot stuff." + }, + { + "ids": "6867,6868,6869,6870", + "examine": "Ogres bang these to make noise." + }, + { + "ids": "6871,6872,6873,6874", + "examine": "A bulky door made from solid rock." + }, + { + "ids": "6875", + "examine": "These open and close!" + }, + { + "ids": "6876", + "examine": "This may be worth opening." + }, + { + "ids": "6877,6878,6879", + "examine": "I wonder what this item contains." + }, + { + "ids": "6880", + "examine": "A barricade made of skulls and bones." + }, + { + "ids": "6881,6882", + "examine": "A barricade made of skulls and bones which has been crushed." + }, + { + "ids": "6883,6884,6885,6886,6887", + "examine": "An old crude tomb." + }, + { + "ids": "6888", + "examine": "A sick, frail old man." + }, + { + "ids": "6889", + "examine": "A sick, frail old man" + }, + { + "ids": "6890,6891,6892", + "examine": "An old crude tomb." + }, + { + "ids": "6893", + "examine": "I don't think he'd mind us checking for his wallet now..." + }, + { + "ids": "6894,6895", + "examine": "A good source of books!" + }, + { + "ids": "6896", + "examine": "A crude torch stuck in the ground." + }, + { + "ids": "6897,6898,6899,6900,6901,6902", + "examine": "A strange ogre plinth, this must be where the artifacts are stored." + }, + { + "ids": "6903", + "examine": "It looks like the hole in the wall has been blocked with rubble." + }, + { + "ids": "6904", + "examine": "How exciting, some shelves." + }, + { + "ids": "6905,6906,6907,6908", + "examine": "A hole in the wall." + }, + { + "ids": "6909", + "examine": "A rock wall." + }, + { + "ids": "6910", + "examine": "It has a letter 'S' on the lock." + }, + { + "ids": "6911", + "examine": "Used for storage." + }, + { + "ids": "6912,6913,6914", + "examine": "A narrow hole in the wall." + }, + { + "ids": "6915", + "examine": "Rubble is blocking the passage." + }, + { + "ids": "6916,6917,6918", + "examine": "A good source of books!" + }, + { + "ids": "6919,6920", + "examine": "A heavy portal decorated with bone." + }, + { + "ids": "6921,6922,6923,6924,6925,6926", + "examine": "A symbol is carved into the wall here." + }, + { + "ids": "6927", + "examine": "I don't think I can get through this way!" + }, + { + "ids": "6928", + "examine": "Looks like its no longer operational." + }, + { + "ids": "6929,6930", + "examine": "Big bones are being used to prop up the wall." + }, + { + "ids": "6931,6932,6933,6934,6935,6936,6937,6938", + "examine": "It's a bit like walking through a giant rib cage." + }, + { + "ids": "6939,6940,6941,6942", + "examine": "This arch is broken. I hope the ceiling doesn't come down!" + }, + { + "ids": "6943,6944,6945,6946,6947,6948,6949", + "examine": "A rocky outcrop." + }, + { + "ids": "6950", + "examine": "I dont think i can get through this way." + }, + { + "ids": "6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968", + "examine": "An eye-wrenching nexus of utter negation!" + }, + { + "ids": "6969,6970", + "examine": "A dirty little swamp boat." + }, + { + "ids": "6971", + "examine": "It looks dark down there." + }, + { + "ids": "6972,6973,6974", + "examine": "A book sits on top." + }, + { + "ids": "6975", + "examine": "The door is closed." + }, + { + "ids": "6976", + "examine": "The door is open." + }, + { + "ids": "6977", + "examine": "The door is closed." + }, + { + "ids": "6978,6979,6980,6981,6982,6983", + "examine": "The door is open." + }, + { + "ids": "6984", + "examine": "Empty market stall." + }, + { + "ids": "6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,6998,6999,7000,7001", + "examine": "A steam powered crushing machine." + }, + { + "ids": "7002", + "examine": "A dwarven statue crumbling away from old age." + }, + { + "ids": "7003", + "examine": "It's crumbling away from old age, it's hardly recognizable as a dwarf." + }, + { + "ids": "7004,7005", + "examine": "This stone dwarf must be guarding the way into a dwarven area!" + }, + { + "ids": "7006,7007", + "examine": "Big. For a dwarf!" + }, + { + "ids": "7008,7009", + "examine": "A work in progress." + }, + { + "ids": "7010", + "examine": "A work that has yet to begin." + }, + { + "ids": "7011,7012", + "examine": "An underground limpwurt plant." + }, + { + "ids": "7013,7014,7015", + "examine": "Insect eating plant." + }, + { + "ids": "7016,7017", + "examine": "A stone carved Pillar." + }, + { + "ids": "7018", + "examine": "Dwarf storage." + }, + { + "ids": "7019,7020,7021", + "examine": "Used for keeping beer or glasses." + }, + { + "ids": "7022,7023,7024,7025,7026", + "examine": "Tracks for the carts to run over." + }, + { + "ids": "7027,7028,7029,7030,7031", + "examine": "A steam powered cart." + }, + { + "ids": "7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,7043", + "examine": "A fine piece of sculpting." + }, + { + "ids": "7044,7045,7046,7047,7048", + "examine": "Keeps mine carts from rolling away." + }, + { + "ids": "7049,7050,7051,7052", + "examine": "A wooden gate." + }, + { + "ids": "7053,7054,7055", + "examine": "Lots of seeds here." + }, + { + "ids": "7056", + "examine": "I can climb down these stairs." + }, + { + "ids": "7057", + "examine": "I can climb up these stairs." + }, + { + "ids": "7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089", + "examine": "Filled to the brim with knowledge." + }, + { + "ids": "7090", + "examine": "'You are here.'" + }, + { + "ids": "7091", + "examine": "Lots of hard study has been done here." + }, + { + "ids": "7092,7093,7094,7095", + "examine": "A telescope pointing southwards..." + }, + { + "ids": "7096", + "examine": "A map of some ancient land." + }, + { + "ids": "7097", + "examine": "There are plenty of shelves" + }, + { + "ids": "7098", + "examine": "Maybe it shows the location of buried treasure?" + }, + { + "ids": "7099", + "examine": "Old songs, old stories..." + }, + { + "ids": "7100", + "examine": "Armour of a Saradominist warrior. Decorative, but still effective." + }, + { + "ids": "7101", + "examine": "A cape from Saradomin, suitable for a battle-mage." + }, + { + "ids": "7102", + "examine": "A staff as used by Saradominist magi." + }, + { + "ids": "7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128", + "examine": "There is a powerful presence about these ruins..." + }, + { + "ids": "7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153", + "examine": "A tear in the dimensional weave of the Abyss." + }, + { + "ids": "7154,7155", + "examine": "A tunnel through the abyss." + }, + { + "ids": "7156,7157", + "examine": "This seems to be blocking the exit..." + }, + { + "ids": "7158", + "examine": "I could probably break this up with a pickaxe." + }, + { + "ids": "7159", + "examine": "I could probably break this up with a pickaxe. Oh wait, I just did." + }, + { + "ids": "7160", + "examine": "Pickaxe power!" + }, + { + "ids": "7161,7162", + "examine": "They don't look that solid, an axe could help me chop them down." + }, + { + "ids": "7163", + "examine": "I cannot tell a lie. I chopped them down." + }, + { + "ids": "7164", + "examine": "If I'm agile enough I might be able to squeeze through..." + }, + { + "ids": "7165", + "examine": "I could probably burn this away with a tinderbox." + }, + { + "ids": "7166", + "examine": "I could probably burn this with fire." + }, + { + "ids": "7167", + "examine": "Burnt open." + }, + { + "ids": "7168,7169,7170", + "examine": "I could probably distract these with thievery." + }, + { + "ids": "7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188", + "examine": "An unstable portal across the dimensions..." + }, + { + "ids": "7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205", + "examine": "Abyssal Tendrils." + }, + { + "ids": "7206", + "examine": "Now that's what I call slimline!" + }, + { + "ids": "7207", + "examine": "He looks very relaxed." + }, + { + "ids": "7208,7209,7210,7211,7212,7213,7214,7215,7216,7217,7218", + "examine": "Now he's just too thin." + }, + { + "ids": "7219,7220", + "examine": "An opening into the crumbling wall." + }, + { + "ids": "7221", + "examine": "This leads downwards." + }, + { + "ids": "7222,7223", + "examine": "This way to the viewing gallery." + }, + { + "ids": "7224", + "examine": "I'll never be able to dodge that!" + }, + { + "ids": "7225,7226", + "examine": "It's a wall..." + }, + { + "ids": "7227", + "examine": "It's the floor..." + }, + { + "ids": "7228,7229", + "examine": "It's a wall..." + }, + { + "ids": "7230", + "examine": "It's the floor..." + }, + { + "ids": "7231,7232,7233,7234,7235", + "examine": "Not your average door..." + }, + { + "ids": "7236,7237,7238", + "examine": "I wonder what's inside." + }, + { + "ids": "7239,7240", + "examine": "It's a long way down..." + }, + { + "ids": "7241", + "examine": "That's going to hurt if it hits me!" + }, + { + "ids": "7242,7243,7244", + "examine": "If only I knew Karate..." + }, + { + "ids": "7245", + "examine": "It's the floor..." + }, + { + "ids": "7246,7247", + "examine": "Locked." + }, + { + "ids": "7248,7249", + "examine": "It's a wall..." + }, + { + "ids": "7250", + "examine": "It's the floor..." + }, + { + "ids": "7251", + "examine": "Bend your way through." + }, + { + "ids": "7252", + "examine": "That could really hurt!" + }, + { + "ids": "7253", + "examine": "I must not fear, fear is the little death that brings total oblivion." + }, + { + "ids": "7254,7255,7256", + "examine": "Blocking my way back." + }, + { + "ids": "7257", + "examine": "I wonder where it leads." + }, + { + "ids": "7258", + "examine": "An opening into the crumbling wall." + }, + { + "ids": "7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271", + "examine": "This way to exit." + }, + { + "ids": "7272,7273", + "examine": "A mystical teleport." + }, + { + "ids": "7274,7275,7276", + "examine": "Lets me walk through walls..." + }, + { + "ids": "7277", + "examine": "He looks hungry, but I don't think he'll do anything while I'm here." + }, + { + "ids": "7278,7279,7280", + "examine": "He's no longer looks hungry, although perhaps a little guilty-looking." + }, + { + "ids": "7281,7282,7283", + "examine": "He's looking at the grain..." + }, + { + "ids": "7284", + "examine": "A sack full of grain." + }, + { + "ids": "7285", + "examine": "I think the chicken enjoyed his meal..." + }, + { + "ids": "7286,7287", + "examine": "It looks pretty rickety..." + }, + { + "ids": "7288,7289,7290,7291,7292,7293,7294,7295,7296,7297,7298,7299,7300,7301", + "examine": "A mystical teleport." + }, + { + "ids": "7302", + "examine": "Lets me walk through walls..." + }, + { + "ids": "7303", + "examine": "A gold statue of a famous White Knight." + }, + { + "ids": "7304", + "examine": "A silver statue of a famous White Knight." + }, + { + "ids": "7305", + "examine": "A bronze statue of a famous White Knight." + }, + { + "ids": "7306", + "examine": "A gold statue of an ancient warrior." + }, + { + "ids": "7307", + "examine": "A silver statue of an ancient warrior." + }, + { + "ids": "7308", + "examine": "A bronze statue of an ancient warrior." + }, + { + "ids": "7309", + "examine": "A gold statue of a famous warrior." + }, + { + "ids": "7310", + "examine": "A silver statue of a famous warrior." + }, + { + "ids": "7311", + "examine": "A bronze statue of a famous warrior." + }, + { + "ids": "7312", + "examine": "A gold statue of an ancient White Knight." + }, + { + "ids": "7313", + "examine": "A silver statue of an ancient White Knight." + }, + { + "ids": "7314", + "examine": "A bronze statue of an ancient White Knight." + }, + { + "ids": "7315,7316", + "examine": "A mystical teleport." + }, + { + "ids": "7317", + "examine": "Lets me walk through walls..." + }, + { + "ids": "7318,7319", + "examine": "A mystical teleport." + }, + { + "ids": "7320", + "examine": "Lets me walk through walls..." + }, + { + "ids": "7321,7322", + "examine": "A mystical teleport." + }, + { + "ids": "7323", + "examine": "Lets me walk through walls..." + }, + { + "ids": "7324,7325", + "examine": "A mystical teleport." + }, + { + "ids": "7326", + "examine": "Lets me walk through walls..." + }, + { + "ids": "7327,7328,7329,7330", + "examine": "Filled to the brim with knowledge." + }, + { + "ids": "7331", + "examine": "Generally used for putting things on." + }, + { + "ids": "7332", + "examine": "A table with a Bunsen burner on it." + }, + { + "ids": "7333,7334,7335,7336,7337,7338,7339", + "examine": "There are some containers of chemicals here." + }, + { + "ids": "7340,7341,7342", + "examine": "There's an empty vial here." + }, + { + "ids": "7343", + "examine": "There's a small hole in the centre." + }, + { + "ids": "7344", + "examine": "The spade is stuck in the hole." + }, + { + "ids": "7345", + "examine": "The spade opened the door." + }, + { + "ids": "7346", + "examine": "It's chained to the wall." + }, + { + "ids": "7347,7348,7349", + "examine": "For storage." + }, + { + "ids": "7350", + "examine": "I wonder what's inside." + }, + { + "ids": "7351", + "examine": "Perhaps I should search it." + }, + { + "ids": "7352,7353", + "examine": "A mystical teleport." + }, + { + "ids": "7354", + "examine": "Lets me walk through walls..." + }, + { + "ids": "7355,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372", + "examine": "Bridge will support a person carrying no more than 5 kg." + }, + { + "ids": "7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384", + "examine": "Lets me walk through walls..." + }, + { + "ids": "7385,7386,7387", + "examine": "The ideal thing to sit on." + }, + { + "ids": "7388,7389", + "examine": "Sit back and relax..." + }, + { + "ids": "7390", + "examine": "Designed specifically to ruin your health." + }, + { + "ids": "7391", + "examine": "A rolled up magic carpet." + }, + { + "ids": "7392", + "examine": "A pile of rolled up magic carpets." + }, + { + "ids": "7393", + "examine": "A little shaded area." + }, + { + "ids": "7394,7395", + "examine": "A magic carpet." + }, + { + "ids": "7396", + "examine": "The infamous carpet of '76." + }, + { + "ids": "7397,7398", + "examine": "A leafy tree." + }, + { + "ids": "7399", + "examine": "This is what is left of a willow tree." + }, + { + "ids": "7400", + "examine": "This is what is left of a maple tree." + }, + { + "ids": "7401", + "examine": "This is what is left of a magic tree." + }, + { + "ids": "7402", + "examine": "This is what is left of a yew tree." + }, + { + "ids": "7403", + "examine": "An empty barrel." + }, + { + "ids": "7404,7405", + "examine": "A barrel full of mushed apples." + }, + { + "ids": "7406", + "examine": "This tap runs from the apple crushing barrel." + }, + { + "ids": "7407", + "examine": "An empty ale barrel." + }, + { + "ids": "7408", + "examine": "A barrel of bad ale." + }, + { + "ids": "7409", + "examine": "A barrel of unfermented liquid." + }, + { + "ids": "7410", + "examine": "A barrel of bad cider." + }, + { + "ids": "7411", + "examine": "A barrel of Dwarven Stout." + }, + { + "ids": "7412", + "examine": "A barrel of mature Dwarven Stout." + }, + { + "ids": "7413", + "examine": "A barrel of Asgarnian Ale." + }, + { + "ids": "7414", + "examine": "A barrel of mature Asgarnian Ale." + }, + { + "ids": "7415", + "examine": "A barrel of Greenmans Ale." + }, + { + "ids": "7416", + "examine": "A barrel of mature Greenmans Ale." + }, + { + "ids": "7417", + "examine": "A barrel of Wizards Mind Bomb." + }, + { + "ids": "7418", + "examine": "A barrel of mature Wizards Mind Bomb." + }, + { + "ids": "7419", + "examine": "A barrel of Dragon Bitter." + }, + { + "ids": "7420", + "examine": "A barrel of mature Dragon Bitter." + }, + { + "ids": "7421", + "examine": "A barrel of Moonlight Mead." + }, + { + "ids": "7422", + "examine": "A barrel of mature Moonlight Mead." + }, + { + "ids": "7423", + "examine": "A barrel of Axeman's Folly." + }, + { + "ids": "7424", + "examine": "A barrel of mature Axeman's Folly." + }, + { + "ids": "7425", + "examine": "A barrel of Chef's Delight." + }, + { + "ids": "7426", + "examine": "A barrel of mature Chef's Delight." + }, + { + "ids": "7427", + "examine": "A barrel of Slayer's Respite." + }, + { + "ids": "7428", + "examine": "A barrel of mature Slayer's Respite." + }, + { + "ids": "7429", + "examine": "A barrel of Cider." + }, + { + "ids": "7430,7431,7432", + "examine": "A barrel of mature Cider." + }, + { + "ids": "7433", + "examine": "Goes up and down!" + }, + { + "ids": "7434", + "examine": "I wonder what's under it?" + }, + { + "ids": "7435", + "examine": "I wonder what's down there?" + }, + { + "ids": "7436", + "examine": "A wooden barrel." + }, + { + "ids": "7437", + "examine": "This vat is empty." + }, + { + "ids": "7438", + "examine": "This vat is filled with water." + }, + { + "ids": "7439", + "examine": "This vat is filled with bad ale." + }, + { + "ids": "7440", + "examine": "This vat is filled with bad cider." + }, + { + "ids": "7441", + "examine": "This vat contains a mixture of water and barley malt." + }, + { + "ids": "7442,7443", + "examine": "This controls the flow of ale to the barrel." + }, + { + "ids": "7444", + "examine": "This vat contains a mixture of water, barley malt, and Hammerstone hops." + }, + { + "ids": "7445,7446", + "examine": "Dwarven Stout is fermenting in this vat." + }, + { + "ids": "7447", + "examine": "This vat is filled with Dwarven Stout." + }, + { + "ids": "7448", + "examine": "This vat is filled with mature Dwarven Stout." + }, + { + "ids": "7449", + "examine": "This vat contains a mixture of water, barley malt, and Asgarnian hops." + }, + { + "ids": "7450,7451", + "examine": "Asgarnian Ale is fermenting in this vat." + }, + { + "ids": "7452", + "examine": "This vat is filled with Asgarnian Ale." + }, + { + "ids": "7453", + "examine": "This vat is filled with mature Asgarnian Ale." + }, + { + "ids": "7454", + "examine": "This vat contains a mixture of water, barley malt, and Harralander." + }, + { + "ids": "7455,7456", + "examine": "Greenmans Ale is fermenting in this vat." + }, + { + "ids": "7457", + "examine": "This vat is filled with Greenmans Ale." + }, + { + "ids": "7458", + "examine": "This vat is filled with mature Greenmans Ale." + }, + { + "ids": "7459", + "examine": "This vat contains a mixture of water, barley malt, and Yanillian hops." + }, + { + "ids": "7460,7461", + "examine": "Wizards Mind Bomb is fermenting in this vat." + }, + { + "ids": "7462", + "examine": "This vat is filled with Wizards Mind Bomb." + }, + { + "ids": "7463", + "examine": "This vat is filled with mature Wizards Mind Bomb." + }, + { + "ids": "7464", + "examine": "This vat contains a mixture of water, barley malt, and Krandorian hops." + }, + { + "ids": "7465,7466", + "examine": "Dragon Bitter is fermenting in this vat." + }, + { + "ids": "7467", + "examine": "This vat is filled with Dragon Bitter." + }, + { + "ids": "7468", + "examine": "This vat is filled with mature Dragon Bitter." + }, + { + "ids": "7469", + "examine": "This vat contains a mixture of water, barley malt, and Bittercap mushrooms." + }, + { + "ids": "7470,7471", + "examine": "Moonlight Mead is fermenting in this vat." + }, + { + "ids": "7472", + "examine": "This vat is filled with Moonlight Mead." + }, + { + "ids": "7473", + "examine": "This vat is filled with mature Moonlight Mead." + }, + { + "ids": "7474", + "examine": "This vat contains a mixture of water, barley malt, and oak roots." + }, + { + "ids": "7475,7476", + "examine": "Axeman's Folly is fermenting in this vat." + }, + { + "ids": "7477", + "examine": "This vat is filled with Axeman's Folly." + }, + { + "ids": "7478", + "examine": "This vat is filled with mature Axeman's Folly." + }, + { + "ids": "7479", + "examine": "This vat contains a mixture of water, barley malt, and chocolate dust." + }, + { + "ids": "7480,7481", + "examine": "Chef's Delight is fermenting in this vat." + }, + { + "ids": "7482", + "examine": "This vat is filled with Chef's Delight." + }, + { + "ids": "7483", + "examine": "This vat is filled with mature Chef's Delight." + }, + { + "ids": "7484", + "examine": "This vat contains a mixture of water, barley malt, and Wildblood hops." + }, + { + "ids": "7485,7486", + "examine": "Slayer's Respite is fermenting in this vat." + }, + { + "ids": "7487", + "examine": "This vat is filled with Slayer's Respite." + }, + { + "ids": "7488", + "examine": "This vat is filled with mature Slayer's Respite." + }, + { + "ids": "7489", + "examine": "This vat contains some apple mush." + }, + { + "ids": "7490,7491", + "examine": "Cider is fermenting in this vat." + }, + { + "ids": "7492", + "examine": "This vat is filled with cider." + }, + { + "ids": "7493,7494,7495", + "examine": "This vat is filled with mature cider." + }, + { + "ids": "7496,7497", + "examine": "Items are for sale here." + }, + { + "ids": "7498", + "examine": "They're empty." + }, + { + "ids": "7499,7500,7501,7502,7503", + "examine": "Farming stock is kept here." + }, + { + "ids": "7504,7505", + "examine": "For sitting." + }, + { + "ids": "7506", + "examine": "They're empty." + }, + { + "ids": "7507,7508,7509,7510,7511", + "examine": "Farming stock is kept here." + }, + { + "ids": "7512", + "examine": "A pair of sacks." + }, + { + "ids": "7513,7514,7515", + "examine": "For storage." + }, + { + "ids": "7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526", + "examine": "A farmer's spade and rake." + }, + { + "ids": "7527", + "examine": "I can climb over the fence with this." + }, + { + "ids": "7528,7529,7530", + "examine": "For fermenting beer." + }, + { + "ids": "7531", + "examine": "An ale barrel." + }, + { + "ids": "7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556", + "examine": "This controls the flow of ale to the barrel." + }, + { + "ids": "7557,7558,7559,7560", + "examine": "You can grow Deadly Nightshade in this Farming patch." + }, + { + "ids": "7561", + "examine": "Deadly Nightshade has been sown in this farming patch." + }, + { + "ids": "7562,7563,7564", + "examine": "Deadly Nightshade is growing in this farming patch." + }, + { + "ids": "7565", + "examine": "I wouldn't pick this with my bare hands." + }, + { + "ids": "7566,7567,7568", + "examine": "This Deadly Nightshade has become diseased." + }, + { + "ids": "7569,7570,7571,7572", + "examine": "This Deadly Nightshade has died." + }, + { + "ids": "7573,7574,7575,7576,7577,7578,7579,7580", + "examine": "You can grow bushes in this Farming patch." + }, + { + "ids": "7581,7582,7583,7584,7585,7586", + "examine": "A cadavaberry bush is growing in this Farming patch." + }, + { + "ids": "7587,7588,7589,7590,7591,7592", + "examine": "A fully grown cadavaberry bush." + }, + { + "ids": "7593,7594,7595,7596,7597,7598", + "examine": "This diseased cadavaberry bush needs pruning." + }, + { + "ids": "7599,7600,7601,7602,7603,7604", + "examine": "This cadavaberry bush has died." + }, + { + "ids": "7605,7606,7607,7608,7609,7610,7611", + "examine": "A dwellberry bush is growing in this Farming patch." + }, + { + "ids": "7612,7613,7614,7615,7616,7617", + "examine": "A fully grown dwellberry bush." + }, + { + "ids": "7618,7619,7620,7621,7622,7623,7624", + "examine": "This diseased dwellberry bush needs pruning." + }, + { + "ids": "7625,7626,7627,7628,7629,7630,7631", + "examine": "This dwellberry bush has died." + }, + { + "ids": "7632,7633,7634,7635,7636,7637,7638,7639", + "examine": "A jangerberry bush is growing in this Farming patch." + }, + { + "ids": "7640,7641,7642,7643,7644,7645", + "examine": "A fully grown jangerberry bush." + }, + { + "ids": "7646,7647,7648,7649,7650,7651,7652,7653", + "examine": "This diseased jangerberry bush needs pruning." + }, + { + "ids": "7654,7655,7656,7657,7658,7659,7660,7661", + "examine": "This jangerberry bush has died." + }, + { + "ids": "7662,7663,7664,7665,7666,7667,7668,7669", + "examine": "A Poison Ivy bush is growing in this Farming patch." + }, + { + "ids": "7670,7671,7672,7673,7674,7675", + "examine": "A fully grown Poison Ivy bush." + }, + { + "ids": "7676,7677,7678,7679,7680,7681,7682,7683", + "examine": "This diseased Poison Ivy bush needs pruning." + }, + { + "ids": "7684,7685,7686,7687,7688,7689,7690,7691", + "examine": "This Poison Ivy bush has died." + }, + { + "ids": "7692,7693,7694,7695,7696", + "examine": "A redberry bush is growing in this Farming patch." + }, + { + "ids": "7697,7698,7699,7700,7701,7702", + "examine": "A fully grown redberry bush." + }, + { + "ids": "7703,7704,7705,7706,7707", + "examine": "This diseased redberry bush needs pruning." + }, + { + "ids": "7708,7709,7710,7711,7712", + "examine": "This redberry bush has died." + }, + { + "ids": "7713,7714,7715,7716,7717,7718,7719,7720", + "examine": "A whiteberry bush is growing in this Farming patch." + }, + { + "ids": "7721,7722,7723,7724,7725,7726", + "examine": "A fully grown whiteberry bush." + }, + { + "ids": "7727,7728,7729,7730,7731,7732,7733,7734", + "examine": "This diseased whiteberry bush needs pruning." + }, + { + "ids": "7735,7736,7737,7738,7739,7740,7741,7742", + "examine": "This whiteberry bush has died." + }, + { + "ids": "7743,7744,7745,7746", + "examine": "You can grow a Cactus in this Farming patch." + }, + { + "ids": "7747", + "examine": "Cactus seeds have been planted in this patch." + }, + { + "ids": "7748,7749,7750,7751,7752,7753", + "examine": "A cactus is growing in this patch." + }, + { + "ids": "7754,7755,7756,7757,7758", + "examine": "A fully-grown cactus." + }, + { + "ids": "7759,7760,7761,7762,7763,7764", + "examine": "This cactus has become diseased." + }, + { + "ids": "7765,7766,7767,7768,7769,7770,7771", + "examine": "This cactus has died." + }, + { + "ids": "7772,7773,7774,7775", + "examine": "You can grow a Calquat Tree in this Farming patch." + }, + { + "ids": "7776,7777,7778,7779,7780,7781,7782,7783", + "examine": "A Calquat tree is growing in this Farming patch." + }, + { + "ids": "7784,7785,7786,7787,7788,7789,7790,7791", + "examine": "A fully grown Calquat tree stands in this Farming patch." + }, + { + "ids": "7792,7793,7794,7795,7796,7797,7798", + "examine": "This diseased Calquat tree needs pruning." + }, + { + "ids": "7799,7800,7801,7802,7803,7804,7805", + "examine": "This Calquat tree has died." + }, + { + "ids": "7806,7807", + "examine": "A Calquat tree stump." + }, + { + "ids": "7808", + "examine": "Turns vegetation into compost." + }, + { + "ids": "7809", + "examine": "This compost bin contains compostable items." + }, + { + "ids": "7810", + "examine": "This compost bin is full of compostable items." + }, + { + "ids": "7811", + "examine": "This compost bin contains supercompostable items." + }, + { + "ids": "7812", + "examine": "This compost bin is full of supercompostable items." + }, + { + "ids": "7813", + "examine": "Turns vegetation into compost." + }, + { + "ids": "7814", + "examine": "This compost bin contains compost." + }, + { + "ids": "7815", + "examine": "This compost bin is full of compost." + }, + { + "ids": "7816", + "examine": "This compost bin contains super compost." + }, + { + "ids": "7817", + "examine": "This compost bin is full of super compost." + }, + { + "ids": "7818", + "examine": "Turns vegetation into compost." + }, + { + "ids": "7819", + "examine": "This compost bin contains compostable items." + }, + { + "ids": "7820", + "examine": "This compost bin is full of compostable items." + }, + { + "ids": "7821", + "examine": "This compost bin contains supercompostable items." + }, + { + "ids": "7822", + "examine": "This compost bin is full of supercompostable items." + }, + { + "ids": "7823", + "examine": "Turns vegetation into compost." + }, + { + "ids": "7824", + "examine": "This compost bin contains compost." + }, + { + "ids": "7825", + "examine": "This compost bin is full of compost." + }, + { + "ids": "7826", + "examine": "This compost bin contains super compost." + }, + { + "ids": "7827", + "examine": "This compost bin is full of super compost." + }, + { + "ids": "7828", + "examine": "This compost bin contains tomatoes." + }, + { + "ids": "7829", + "examine": "This compost bin is full of tomatoes." + }, + { + "ids": "7830", + "examine": "This compost bin contains rotten tomatoes." + }, + { + "ids": "7831", + "examine": "This compost bin is full of rotten tomatoes." + }, + { + "ids": "7832", + "examine": "This compost bin contains tomatoes." + }, + { + "ids": "7833", + "examine": "This compost bin is full of tomatoes." + }, + { + "ids": "7834", + "examine": "This compost bin contains rotten tomatoes." + }, + { + "ids": "7835,7836,7837,7838,7839", + "examine": "This compost bin is full of rotten tomatoes." + }, + { + "ids": "7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850", + "examine": "You can grow flowers in this Farming patch." + }, + { + "ids": "7851,7852,7853,7854", + "examine": "A limpwurt plant is growing in this patch." + }, + { + "ids": "7855", + "examine": "A fully grown limpwurt plant." + }, + { + "ids": "7856,7857,7858,7859", + "examine": "A limpwurt plant is growing in this patch." + }, + { + "ids": "7860,7861,7862", + "examine": "This limpwurt plant has become diseased." + }, + { + "ids": "7863,7864,7865", + "examine": "This limpwurt plant has died while growing." + }, + { + "ids": "7866", + "examine": "This limpwurt plant has died." + }, + { + "ids": "7867,7868,7869,7870", + "examine": "A marigold is growing in this patch." + }, + { + "ids": "7871", + "examine": "A fully grown marigold." + }, + { + "ids": "7872,7873,7874,7875", + "examine": "A marigold is growing in this patch." + }, + { + "ids": "7876,7877,7878", + "examine": "This marigold has become diseased." + }, + { + "ids": "7879,7880,7881", + "examine": "This marigold has died while growing." + }, + { + "ids": "7882", + "examine": "This marigold has died." + }, + { + "ids": "7883,7884,7885,7886", + "examine": "A nasturtium is growing in this patch." + }, + { + "ids": "7887", + "examine": "A fully grown nasturtium." + }, + { + "ids": "7888,7889,7890,7891", + "examine": "A nasturtium is growing in this patch." + }, + { + "ids": "7892,7893,7894", + "examine": "This nasturtium has become diseased." + }, + { + "ids": "7895,7896,7897", + "examine": "This nasturtium has died while growing." + }, + { + "ids": "7898", + "examine": "This nasturtium has died." + }, + { + "ids": "7899,7900,7901,7902", + "examine": "A rosemary is growing in this patch." + }, + { + "ids": "7903", + "examine": "A fully grown rosemary." + }, + { + "ids": "7904,7905,7906,7907", + "examine": "A rosemary is growing in this patch." + }, + { + "ids": "7908,7909,7910", + "examine": "This rosemary has become diseased." + }, + { + "ids": "7911,7912,7913", + "examine": "This rosemary has died while growing." + }, + { + "ids": "7914", + "examine": "This rosemary has died." + }, + { + "ids": "7915,7916,7917,7918", + "examine": "Should scare off the birds..." + }, + { + "ids": "7919,7920,7921,7922", + "examine": "A woad plant is growing in this patch." + }, + { + "ids": "7923", + "examine": "A fully grown woad plant." + }, + { + "ids": "7924,7925,7926,7927", + "examine": "A woad plant is growing in this patch." + }, + { + "ids": "7928,7929,7930", + "examine": "This woad plant has become diseased." + }, + { + "ids": "7931,7932,7933", + "examine": "This woad plant has died while growing." + }, + { + "ids": "7934", + "examine": "This woad plant has died." + }, + { + "ids": "7935", + "examine": "An apple tree sapling has been planted in this fruit tree patch." + }, + { + "ids": "7936,7937,7938,7939,7940", + "examine": "An apple tree is growing in this fruit tree patch." + }, + { + "ids": "7941", + "examine": "A fully grown apple tree." + }, + { + "ids": "7942", + "examine": "There is a single apple on this apple tree." + }, + { + "ids": "7943", + "examine": "There are two apples on this apple tree." + }, + { + "ids": "7944", + "examine": "There are three apples on this apple tree." + }, + { + "ids": "7945", + "examine": "There are four apples on this apple tree." + }, + { + "ids": "7946", + "examine": "There are five apples on this apple tree." + }, + { + "ids": "7947", + "examine": "There are six apples on this apple tree." + }, + { + "ids": "7948", + "examine": "A fully grown apple tree." + }, + { + "ids": "7949,7950,7951,7952,7953,7954", + "examine": "This diseased tree looks like it needs pruning with secateurs." + }, + { + "ids": "7955,7956,7957,7958,7959,7960", + "examine": "This apple tree has become diseased and died." + }, + { + "ids": "7961,7962,7963,7964,7965", + "examine": "This apple tree has been cut down." + }, + { + "ids": "7966", + "examine": "A pineapple plant has been planted in this fruit tree patch." + }, + { + "ids": "7967,7968,7969,7970,7971", + "examine": "A pineapple plant is growing in this fruit tree patch." + }, + { + "ids": "7972", + "examine": "A fully grown pineapple plant." + }, + { + "ids": "7973", + "examine": "There is a single pineapple on this pineapple plant." + }, + { + "ids": "7974", + "examine": "There are two pineapples on this pineapple plant." + }, + { + "ids": "7975", + "examine": "There are three pineapples on this pineapple plant." + }, + { + "ids": "7976", + "examine": "There are four pineapples on this pineapple plant." + }, + { + "ids": "7977", + "examine": "There are five pineapples on this pineapple plant." + }, + { + "ids": "7978", + "examine": "There are six pineapples on this pineapple plant." + }, + { + "ids": "7979", + "examine": "A fully grown pineapple plant." + }, + { + "ids": "7980,7981,7982,7983,7984,7985", + "examine": "This pineapple plant looks like it could do with pruning with secateurs." + }, + { + "ids": "7986,7987,7988,7989,7990,7991", + "examine": "This pineapple plant has become diseased and died." + }, + { + "ids": "7992", + "examine": "This pineapple plant has been cut down." + }, + { + "ids": "7993", + "examine": "A banana tree sapling has been planted in this fruit tree patch." + }, + { + "ids": "7994,7995,7996,7997,7998", + "examine": "A banana tree is growing in this fruit tree patch." + }, + { + "ids": "7999,8000", + "examine": "A fully grown banana tree." + }, + { + "ids": "8001", + "examine": "There is a single banana on this banana tree." + }, + { + "ids": "8002", + "examine": "There are two bananas on this banana tree." + }, + { + "ids": "8003", + "examine": "There are three bananas on this banana tree." + }, + { + "ids": "8004", + "examine": "There are four bananas on this banana tree." + }, + { + "ids": "8005", + "examine": "There are five bananas on this banana tree." + }, + { + "ids": "8006", + "examine": "There are six bananas on this banana tree." + }, + { + "ids": "8007,8008,8009,8010,8011,8012", + "examine": "This banana looks like it could do with pruning with secateurs." + }, + { + "ids": "8013,8014,8015,8016,8017,8018", + "examine": "This banana tree has become diseased and died." + }, + { + "ids": "8019", + "examine": "This banana tree has been cut down." + }, + { + "ids": "8020", + "examine": "A curry tree sapling has been planted in this fruit tree patch." + }, + { + "ids": "8021,8022,8023,8024,8025", + "examine": "A curry tree is growing in this fruit tree patch." + }, + { + "ids": "8026", + "examine": "A fully grown curry tree." + }, + { + "ids": "8027", + "examine": "There is a single curry leaf on this curry tree." + }, + { + "ids": "8028", + "examine": "There are two curry leaves on this curry tree." + }, + { + "ids": "8029", + "examine": "There are three curry leaves on this curry tree." + }, + { + "ids": "8030", + "examine": "There are four curry leaves on this curry tree." + }, + { + "ids": "8031", + "examine": "There are five curry leaves on this curry tree." + }, + { + "ids": "8032", + "examine": "There are six curry leaves on this curry tree." + }, + { + "ids": "8033", + "examine": "A fully grown curry tree." + }, + { + "ids": "8034,8035,8036,8037,8038,8039", + "examine": "This curry tree looks like it could do with pruning with secateurs." + }, + { + "ids": "8040,8041,8042,8043,8044,8045", + "examine": "This curry tree has become diseased and died." + }, + { + "ids": "8046", + "examine": "This curry tree has been cut down." + }, + { + "ids": "8047,8048,8049,8050", + "examine": "You can grow Fruit Trees in this Farming patch." + }, + { + "ids": "8051", + "examine": "An orange tree sapling has been planted in this fruit tree patch." + }, + { + "ids": "8052,8053,8054,8055,8056", + "examine": "An orange tree is growing in this fruit tree patch." + }, + { + "ids": "8057", + "examine": "A fully grown orange tree." + }, + { + "ids": "8058", + "examine": "There is a single orange on this orange tree." + }, + { + "ids": "8059", + "examine": "There are two oranges on this orange tree." + }, + { + "ids": "8060", + "examine": "There are three oranges on this orange tree." + }, + { + "ids": "8061", + "examine": "There are four oranges on this orange tree." + }, + { + "ids": "8062", + "examine": "There are five oranges on this orange tree." + }, + { + "ids": "8063", + "examine": "There are six oranges on this orange tree." + }, + { + "ids": "8064", + "examine": "A fully grown orange tree." + }, + { + "ids": "8065,8066,8067,8068,8069,8070", + "examine": "This orange tree looks like it could do with pruning with secateurs." + }, + { + "ids": "8071,8072,8073,8074,8075,8076", + "examine": "This orange tree has become diseased and died." + }, + { + "ids": "8077", + "examine": "This orange tree has been cut down." + }, + { + "ids": "8078", + "examine": "A palm tree sapling has been planted in this fruit tree patch." + }, + { + "ids": "8079,8080,8081,8082,8083", + "examine": "A palm tree is growing in this fruit tree patch." + }, + { + "ids": "8084", + "examine": "A fully grown palm tree." + }, + { + "ids": "8085", + "examine": "There is a single coconut on this palm tree." + }, + { + "ids": "8086", + "examine": "There are two coconuts on this palm tree." + }, + { + "ids": "8087", + "examine": "There are three coconuts on this palm tree." + }, + { + "ids": "8088", + "examine": "There are four coconuts on this palm tree." + }, + { + "ids": "8089", + "examine": "There are five coconuts on this palm tree." + }, + { + "ids": "8090", + "examine": "There are six coconuts on this palm tree." + }, + { + "ids": "8091", + "examine": "A fully grown palm tree." + }, + { + "ids": "8092,8093,8094,8095,8096,8097", + "examine": "This palm tree looks like it could do with pruning with secateurs." + }, + { + "ids": "8098,8099,8100,8101,8102,8103", + "examine": "This palm tree has become diseased and died." + }, + { + "ids": "8104", + "examine": "This palm tree has been cut down." + }, + { + "ids": "8105", + "examine": "A papaya tree sapling has been planted in this fruit tree patch." + }, + { + "ids": "8106,8107,8108,8109,8110", + "examine": "A papaya tree is growing in this fruit tree patch." + }, + { + "ids": "8111", + "examine": "A fully grown papaya tree" + }, + { + "ids": "8112", + "examine": "There is a single papaya fruit on this tree." + }, + { + "ids": "8113", + "examine": "There are two papaya fruits on this tree." + }, + { + "ids": "8114", + "examine": "There are three papaya fruits on this tree." + }, + { + "ids": "8115", + "examine": "There are four papaya fruits on this tree." + }, + { + "ids": "8116", + "examine": "There are five papaya fruits on this tree." + }, + { + "ids": "8117", + "examine": "There are six papaya fruits on this tree." + }, + { + "ids": "8118", + "examine": "A fully grown papaya tree." + }, + { + "ids": "8119,8120,8121,8122,8123,8124", + "examine": "This papaya tree looks like it could do with pruning with secateurs." + }, + { + "ids": "8125,8126,8127,8128,8129,8130", + "examine": "This papaya tree has become diseased and died." + }, + { + "ids": "8131", + "examine": "This papaya tree has been cut down." + }, + { + "ids": "8132,8133,8134,8135,8136,8137,8138", + "examine": "You can grow herbs in this Farming patch." + }, + { + "ids": "8139", + "examine": "Some herb seeds have been sown in this patch." + }, + { + "ids": "8140,8141,8142", + "examine": "A herb is growing in this patch." + }, + { + "ids": "8143", + "examine": "A fully grown herb." + }, + { + "ids": "8144,8145,8146", + "examine": "These herbs have become diseased." + }, + { + "ids": "8147,8148,8149,8150,8151,8152,8153", + "examine": "These herbs have become diseased and died." + }, + { + "ids": "8154", + "examine": "Asgarnian hop seeds have been sown in this farming patch." + }, + { + "ids": "8155,8156,8157,8158", + "examine": "Asgarnian hops are growing in this farming patch." + }, + { + "ids": "8159", + "examine": "These are fully grown Asgarnian Hops." + }, + { + "ids": "8160", + "examine": "Asgarnian hop seeds have been sown in this farming patch." + }, + { + "ids": "8161,8162,8163,8164", + "examine": "Asgarnian hops are growing in this farming patch." + }, + { + "ids": "8165,8166,8167,8168", + "examine": "These Asgarnian Hop plants are diseased." + }, + { + "ids": "8169,8170,8171,8172,8173,8174,8175,8176", + "examine": "These Asgarnian Hop plants have died from disease." + }, + { + "ids": "8177", + "examine": "Hammerstone Hop seeds have been sown in this farming patch." + }, + { + "ids": "8178,8179,8180", + "examine": "Hammerstone Hops are growing in this farming patch." + }, + { + "ids": "8181", + "examine": "These are fully grown Hammerstone Hops." + }, + { + "ids": "8182", + "examine": "Hammerstone Hop seeds have been sown in this farming patch." + }, + { + "ids": "8183,8184,8185", + "examine": "Hammerstone Hops are growing in this farming patch." + }, + { + "ids": "8186,8187,8188", + "examine": "These Hammerstone Hops are diseased." + }, + { + "ids": "8189,8190,8191", + "examine": "These Hammerstone Hops have died from disease." + }, + { + "ids": "8192", + "examine": "Barley seeds have been sown in this farming patch." + }, + { + "ids": "8193,8194,8195", + "examine": "Barley is growing in this farming patch." + }, + { + "ids": "8196", + "examine": "This patch is full of Barley." + }, + { + "ids": "8197", + "examine": "Barley seeds have been sown in this farming patch." + }, + { + "ids": "8198,8199,8200", + "examine": "Barley is growing in this farming patch." + }, + { + "ids": "8201,8202,8203", + "examine": "This Barley is diseased." + }, + { + "ids": "8204,8205,8206", + "examine": "This Barley has died from disease." + }, + { + "ids": "8207,8208,8209,8210", + "examine": "You can grow hops in this Farming patch." + }, + { + "ids": "8211", + "examine": "Krandorian Hop seeds have been planted in this farming patch." + }, + { + "ids": "8212,8213,8214,8215,8216,8217", + "examine": "Krandorian Hops are growing in this farming patch." + }, + { + "ids": "8218", + "examine": "These are fully grown Krandorian Hops." + }, + { + "ids": "8219", + "examine": "Krandorian Hop seeds have been planted in this farming patch." + }, + { + "ids": "8220,8221,8222,8223,8224,8225", + "examine": "Krandorian Hops are growing in this farming patch." + }, + { + "ids": "8226,8227,8228,8229,8230,8231", + "examine": "These Krandorian Hops are diseased." + }, + { + "ids": "8232,8233,8234,8235,8236,8237", + "examine": "These Krandorian Hops have died from disease." + }, + { + "ids": "8238", + "examine": "Jute seeds have been sown in this farming patch." + }, + { + "ids": "8239,8240,8241,8242", + "examine": "Jute plants are growing in this farming patch." + }, + { + "ids": "8243", + "examine": "These are fully grown Jute plants." + }, + { + "ids": "8244", + "examine": "Jute seeds have been sown in this farming patch." + }, + { + "ids": "8245,8246,8247,8248", + "examine": "Jute plants are growing in this farming patch." + }, + { + "ids": "8249,8250,8251,8252", + "examine": "These Jute plants are diseased." + }, + { + "ids": "8253,8254,8255,8256", + "examine": "These Jute plants have died from disease." + }, + { + "ids": "8257", + "examine": "Wildblood hop seeds have been planted in this farming patch." + }, + { + "ids": "8258,8259,8260,8261,8262,8263,8264", + "examine": "Wildblood Hops are growing in this farming patch." + }, + { + "ids": "8265", + "examine": "These are fully grown Wildblood Hops." + }, + { + "ids": "8266", + "examine": "Wildblood hop seeds have been planted in this farming patch." + }, + { + "ids": "8267,8268,8269,8270,8271,8272,8273", + "examine": "Wildblood Hops are growing in this farming patch." + }, + { + "ids": "8274,8275,8276,8277,8278,8279,8280", + "examine": "These Wildblood hops are diseased." + }, + { + "ids": "8281,8282,8283,8284,8285,8286,8287", + "examine": "These Wildblood Hops have died from disease." + }, + { + "ids": "8288", + "examine": "Yanillian Hop seeds have been sown in this farming patch." + }, + { + "ids": "8289,8290,8291,8292,8293", + "examine": "Yanillian Hops are growing in this farming patch." + }, + { + "ids": "8294", + "examine": "These are fully grown Yanillian Hops." + }, + { + "ids": "8295", + "examine": "Yanillian Hop seeds have been sown in this farming patch." + }, + { + "ids": "8296,8297,8298,8299,8300", + "examine": "Yanillian Hops are growing in this farming patch." + }, + { + "ids": "8301,8302,8303,8304,8305", + "examine": "These Yanillian Hops are diseased." + }, + { + "ids": "8306,8307,8308,8309,8310", + "examine": "These Yanillian Hops have died from disease." + }, + { + "ids": "8311,8312,8313,8314", + "examine": "You can grow Bittercap mushrooms in this Farming patch." + }, + { + "ids": "8315", + "examine": "Bittercap mushroom spores have been sown in this farming patch." + }, + { + "ids": "8316,8317,8318,8319,8320", + "examine": "Bittercap mushrooms are growing in this farming patch." + }, + { + "ids": "8321,8322,8323,8324,8325,8326", + "examine": "A patch of Bittercap Mushrooms." + }, + { + "ids": "8327,8328,8329,8330,8331", + "examine": "These Bittercap mushrooms have become diseased." + }, + { + "ids": "8332,8333,8334,8335,8336,8337,8338", + "examine": "These Bittercap mushrooms have become diseased and died." + }, + { + "ids": "8339,8340,8341,8342", + "examine": "You can grow a Spirit Tree in this Farming patch." + }, + { + "ids": "8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356", + "examine": "A Spirit Tree." + }, + { + "ids": "8357", + "examine": "A Spirit Tree stump." + }, + { + "ids": "8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369", + "examine": "Needs pruning before it dies." + }, + { + "ids": "8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389,8390,8391", + "examine": "Oh dear, your spirit tree has died." + }, + { + "ids": "8392,8393,8394,8395", + "examine": "You can grow trees in this Farming patch." + }, + { + "ids": "8396", + "examine": "A Magic Tree sapling has been planted in this tree patch." + }, + { + "ids": "8397,8398,8399,8400,8401,8402,8403,8404,8405,8406,8407", + "examine": "A Magic Tree is growing in this tree patch." + }, + { + "ids": "8408,8409", + "examine": "A fully grown Magic Tree." + }, + { + "ids": "8410", + "examine": "You can uproot this stump with a spade." + }, + { + "ids": "8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421,8422", + "examine": "To remove all signs of disease, prune the tree with secateurs." + }, + { + "ids": "8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434", + "examine": "This Magic Tree has become diseased and died." + }, + { + "ids": "8435", + "examine": "A Maple tree sapling has been planted in this tree patch." + }, + { + "ids": "8436,8437,8438,8439,8440,8441,8442", + "examine": "A Maple tree is growing in this tree patch." + }, + { + "ids": "8443,8444", + "examine": "A fully grown Maple tree." + }, + { + "ids": "8445", + "examine": "You can uproot this stump with a spade." + }, + { + "ids": "8446,8447,8448,8449,8450,8451,8452,8453", + "examine": "To remove all signs of disease, prune the tree with secateurs." + }, + { + "ids": "8454,8455,8456,8457,8458,8459,8460,8461", + "examine": "This Maple tree has become diseased and died." + }, + { + "ids": "8462", + "examine": "An Oak sapling has been planted in this tree patch." + }, + { + "ids": "8463,8464,8465", + "examine": "An Oak tree is growing in this tree patch." + }, + { + "ids": "8466,8467", + "examine": "A fully grown Oak tree." + }, + { + "ids": "8468,8469,8470,8471,8472", + "examine": "You can uproot this stump with a spade." + }, + { + "ids": "8473,8474,8475,8476", + "examine": "To remove all signs of disease, prune the tree with secateurs." + }, + { + "ids": "8477,8478,8479,8480", + "examine": "This Oak tree has become diseased and died." + }, + { + "ids": "8481", + "examine": "A Willow sapling has been planted in this tree patch." + }, + { + "ids": "8482,8483,8484,8485,8486", + "examine": "A Willow tree is growing in this tree patch." + }, + { + "ids": "8487,8488", + "examine": "A fully grown Willow tree." + }, + { + "ids": "8489", + "examine": "You can uproot this stump with a spade." + }, + { + "ids": "8490,8491,8492,8493,8494,8495", + "examine": "To remove all signs of disease, prune the tree with secateurs." + }, + { + "ids": "8496,8497,8498,8499,8500,8501", + "examine": "This Willow tree has become diseased and died." + }, + { + "ids": "8502", + "examine": "A Yew sapling has been planted in this tree patch." + }, + { + "ids": "8503,8504,8505,8506,8507,8508,8509,8510,8511", + "examine": "A Yew tree is growing in this tree patch." + }, + { + "ids": "8512,8513", + "examine": "A fully grown Yew tree." + }, + { + "ids": "8514", + "examine": "You can uproot this tree stump with a spade." + }, + { + "ids": "8515,8516,8517,8518,8519,8520,8521,8522,8523,8524", + "examine": "To remove all signs of disease, prune the tree with secateurs." + }, + { + "ids": "8525,8526,8527,8528,8529,8530,8531,8532,8533,8534", + "examine": "This Yew tree has become diseased and died." + }, + { + "ids": "8535", + "examine": "Cabbage seeds have been sown in this allotment." + }, + { + "ids": "8536,8537,8538", + "examine": "Cabbages are growing in this allotment." + }, + { + "ids": "8539", + "examine": "These cabbages could do with harvesting." + }, + { + "ids": "8540,8541,8542,8543", + "examine": "Cabbages are growing in this allotment." + }, + { + "ids": "8544,8545,8546", + "examine": "These cabbages have become diseased and need tending." + }, + { + "ids": "8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557", + "examine": "These cabbages have become diseased and died." + }, + { + "ids": "8558", + "examine": "Potato seeds have been planted in this allotment." + }, + { + "ids": "8559,8560,8561", + "examine": "Potato plants are growing in this allotment." + }, + { + "ids": "8562", + "examine": "These potato plants are fully grown." + }, + { + "ids": "8563", + "examine": "Potato seeds have been planted in this allotment." + }, + { + "ids": "8564,8565,8566", + "examine": "Potato plants are growing in this allotment." + }, + { + "ids": "8567,8568,8569", + "examine": "These potato plants are diseased." + }, + { + "ids": "8570,8571,8572", + "examine": "These potato plants are dead." + }, + { + "ids": "8573,8574,8575,8576,8577,8578,8579", + "examine": "You can grow fruit and vegetables here." + }, + { + "ids": "8580", + "examine": "Some onion seeds have sown in this allotment." + }, + { + "ids": "8581,8582,8583", + "examine": "Some onion plants are growing in this allotment." + }, + { + "ids": "8584", + "examine": "There are some fully grown onions in this allotment." + }, + { + "ids": "8585", + "examine": "Some onion seeds have sown in this allotment." + }, + { + "ids": "8586,8587,8588", + "examine": "Some onion plants are growing in this allotment." + }, + { + "ids": "8589,8590,8591", + "examine": "These onions have become diseased." + }, + { + "ids": "8592,8593,8594", + "examine": "These onions have become diseased and died." + }, + { + "ids": "8595", + "examine": "Strawberry seeds have been sown in this allotment." + }, + { + "ids": "8596,8597,8598,8599,8600", + "examine": "Strawberry plants are growing in this allotment." + }, + { + "ids": "8601", + "examine": "These strawberry plants are fully grown." + }, + { + "ids": "8602", + "examine": "Strawberry seeds have been sown in this allotment." + }, + { + "ids": "8603,8604,8605,8606,8607", + "examine": "Strawberry plants are growing in this allotment." + }, + { + "ids": "8608,8609,8610,8611,8612", + "examine": "These strawberry plants have become diseased." + }, + { + "ids": "8613,8614,8615,8616,8617", + "examine": "These strawberry plants have become diseased and died." + }, + { + "ids": "8618", + "examine": "Some sweetcorn seeds have been sown in this allotment." + }, + { + "ids": "8619,8620,8621,8622,8623", + "examine": "Some sweetcorn plants are growing in this allotment." + }, + { + "ids": "8624", + "examine": "These sweetcorn plants are fully grown." + }, + { + "ids": "8625", + "examine": "Some sweetcorn seeds have been sown in this allotment." + }, + { + "ids": "8626,8627,8628,8629,8630", + "examine": "Some sweetcorn plants are growing in this allotment." + }, + { + "ids": "8631,8632,8633,8634,8635", + "examine": "These sweetcorn plants have been attacked by crows." + }, + { + "ids": "8636,8637,8638,8639,8640", + "examine": "These sweetcorn plants have become diseased and died." + }, + { + "ids": "8641", + "examine": "Tomato seeds have been sown in this allotment." + }, + { + "ids": "8642,8643,8644", + "examine": "Tomato plants are growing in this allotment." + }, + { + "ids": "8645", + "examine": "These tomato plants are fully grown." + }, + { + "ids": "8646", + "examine": "Tomato seeds have been sown in this allotment." + }, + { + "ids": "8647,8648,8649", + "examine": "Tomato plants are growing in this allotment." + }, + { + "ids": "8650,8651,8652", + "examine": "These tomato plants have become diseased." + }, + { + "ids": "8653,8654,8655", + "examine": "These tomato plants have become diseased and died." + }, + { + "ids": "8656", + "examine": "Watermelon seeds have been sown in this allotment." + }, + { + "ids": "8657,8658,8659,8660,8661,8662,8663", + "examine": "Watermelons are growing in this allotment." + }, + { + "ids": "8664", + "examine": "These watermelons could do with harvesting." + }, + { + "ids": "8665", + "examine": "Watermelon seeds have been sown in this allotment." + }, + { + "ids": "8666,8667,8668,8669,8670,8671,8672", + "examine": "Watermelons are growing in this allotment." + }, + { + "ids": "8673,8674,8675,8676,8677,8678,8679", + "examine": "These watermelons have become diseased and need tending." + }, + { + "ids": "8680", + "examine": "These watermelon plants have become diseased and died." + }, + { + "ids": "8681,8682,8683,8684,8685,8686,8687", + "examine": "These watermelons have become diseased and died." + }, + { + "ids": "8688", + "examine": "The perfect accompaniment to a bedroom." + }, + { + "ids": "8689", + "examine": "Fit for milking." + }, + { + "ids": "8690,8691,8692,8693,8694", + "examine": "Each full of milk no doubt." + }, + { + "ids": "8695", + "examine": "The door is closed." + }, + { + "ids": "8696,8697,8698", + "examine": "The door is open." + }, + { + "ids": "8699", + "examine": "After working with livestock, why not wash your hands?" + }, + { + "ids": "8700", + "examine": "For putting things on." + }, + { + "ids": "8701", + "examine": "Someone's been preparing meat." + }, + { + "ids": "8702,8703,8704,8705,8706,8707,8708,8709,8710,8711", + "examine": "A barrel for collecting rain water." + }, + { + "ids": "8712", + "examine": "A grand old fireplace." + }, + { + "ids": "8713,8714,8715,8716", + "examine": "I bet there's a needle in it somewhere." + }, + { + "ids": "8717,8718,8719,8720,8721,8722,8723,8724", + "examine": "A loom." + }, + { + "ids": "8725", + "examine": "A little rock." + }, + { + "ids": "8726", + "examine": "A small chunk of rock." + }, + { + "ids": "8727", + "examine": "They're not floating, even though it may look like they are!" + }, + { + "ids": "8728,8729,8730,8731,8732,8733,8734,8735,8736", + "examine": "A deposit of rocks." + }, + { + "ids": "8737", + "examine": "This tap runs from the apple crushing barrel." + }, + { + "ids": "8738,8739,8740,8741", + "examine": "You can walk through these doors." + }, + { + "ids": "8742,8743", + "examine": "An odd looking tree." + }, + { + "ids": "8744,8745", + "examine": "I can climb this." + }, + { + "ids": "8746", + "examine": "I can climb down this." + }, + { + "ids": "8747", + "examine": "A local water source." + }, + { + "ids": "8748", + "examine": "Used for spinning thread." + }, + { + "ids": "8749", + "examine": "A Shrine to the glory of Seren." + }, + { + "ids": "8750", + "examine": "I can cook here." + }, + { + "ids": "8751", + "examine": "A nice sturdy looking table." + }, + { + "ids": "8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766", + "examine": "A good source of books!" + }, + { + "ids": "8767", + "examine": "The lamp has a glowing crystal at its core." + }, + { + "ids": "8768,8769", + "examine": "A table." + }, + { + "ids": "8770", + "examine": "A chair." + }, + { + "ids": "8771", + "examine": "A painting of an elf standing in some woodland." + }, + { + "ids": "8772", + "examine": "Sit back and relax..." + }, + { + "ids": "8773,8774", + "examine": "A useful ranging device." + }, + { + "ids": "8775", + "examine": "Use these with bows." + }, + { + "ids": "8776,8777", + "examine": "Tailor-made for needlework supplies." + }, + { + "ids": "8778", + "examine": "I'm guessing it's for making elven clothes." + }, + { + "ids": "8779,8780,8781,8782", + "examine": "Helps make elf clothing." + }, + { + "ids": "8783,8784", + "examine": "I wonder what's under it?" + }, + { + "ids": "8785", + "examine": "I can climb this." + }, + { + "ids": "8786,8787,8788,8789", + "examine": "The door is closed." + }, + { + "ids": "8790,8791,8792,8793,8794", + "examine": "The door is open." + }, + { + "ids": "8795", + "examine": "Makes gnomes taller." + }, + { + "ids": "8796", + "examine": "Makes creatures taller." + }, + { + "ids": "8797", + "examine": "I wonder what's inside." + }, + { + "ids": "8798", + "examine": "Perhaps I should search it." + }, + { + "ids": "8799", + "examine": "The desk of the head mourner." + }, + { + "ids": "8800", + "examine": "I wonder what's inside." + }, + { + "ids": "8801,8802,8803", + "examine": "A sack full of grain." + }, + { + "ids": "8804,8805,8806", + "examine": "These have grain in them." + }, + { + "ids": "8807", + "examine": "An empty barrel." + }, + { + "ids": "8808", + "examine": "A barrel full of mushed apples." + }, + { + "ids": "8809", + "examine": "A pile of rotten apples!" + }, + { + "ids": "8810,8811,8812,8813", + "examine": "A wooden gate." + }, + { + "ids": "8814,8815,8816,8817", + "examine": "A well slept in bed." + }, + { + "ids": "8818", + "examine": "The door is closed." + }, + { + "ids": "8819", + "examine": "The door is open." + }, + { + "ids": "8820,8821,8822,8823,8824,8825,8826,8827", + "examine": "Solid iron bars." + }, + { + "ids": "8828,8829,8830", + "examine": "Heavy." + }, + { + "ids": "8831,8832,8833,8834,8835,8836,8837,8838,8839", + "examine": "You can 'cart' things around on this." + }, + { + "ids": "8840,8841", + "examine": "I feel the need to throw a rotten cabbage!" + }, + { + "ids": "8842", + "examine": "Nothing growing on this tree at the moment..." + }, + { + "ids": "8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857,8858,8859,8860", + "examine": "Mmmmm, nice juicy apples!" + }, + { + "ids": "8861,8862,8863,8864", + "examine": "This is a special hops patch." + }, + { + "ids": "8865", + "examine": "Kelda Hop seeds have been sown in this farming patch." + }, + { + "ids": "8866,8867,8868", + "examine": "Kelda Hops are growing in this farming patch." + }, + { + "ids": "8869", + "examine": "These are fully grown Kelda Hops." + }, + { + "ids": "8870", + "examine": "A barrel of Kelda Stout." + }, + { + "ids": "8871", + "examine": "This vat contains Kelda hops." + }, + { + "ids": "8872,8873", + "examine": "Kelda Stout is fermenting in this vat." + }, + { + "ids": "8874,8875,8876,8877", + "examine": "This vat contains Kelda Stout." + }, + { + "ids": "8878", + "examine": "Some bizarre mixture between rocks and machinery. Definitely dwarven." + }, + { + "ids": "8879", + "examine": "A strange box of some kind." + }, + { + "ids": "8880", + "examine": "A strange box of some kind. It's open." + }, + { + "ids": "8881,8882,8883,8884,8885", + "examine": "A small cave entrance." + }, + { + "ids": "8886", + "examine": "Keeps mine carts from rolling away." + }, + { + "ids": "8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898", + "examine": "Cart tracks." + }, + { + "ids": "8899,8900,8901,8902,8903,8904,8905,8906,8907,8908,8909", + "examine": "A support for the tracks." + }, + { + "ids": "8910", + "examine": "These books contain all sorts of data on the Red Axe." + }, + { + "ids": "8911", + "examine": "Big mysterious crates. You wonder what could be inside." + }, + { + "ids": "8912", + "examine": "Wooden crates with metal edges, contents unknown." + }, + { + "ids": "8913,8914,8915,8916,8917", + "examine": "Big mysterious crates. There are some papers on top." + }, + { + "ids": "8918,8919,8920,8921,8922,8923", + "examine": "A symbol of the Red Axe." + }, + { + "ids": "8924,8925", + "examine": "A steam powered cart." + }, + { + "ids": "8926", + "examine": "A short long boat!" + }, + { + "ids": "8927,8928", + "examine": "Best used with a bucket." + }, + { + "ids": "8929", + "examine": "A deep and terrifying cave." + }, + { + "ids": "8930,8931,8932,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949", + "examine": "It looks cold in there." + }, + { + "ids": "8950", + "examine": "A big slimy lump of rock." + }, + { + "ids": "8951", + "examine": "A slimy lump of rock." + }, + { + "ids": "8952,8953", + "examine": "A slippery looking rock." + }, + { + "ids": "8954,8955", + "examine": "A tall flag blowing in the wind." + }, + { + "ids": "8956,8957", + "examine": "I could climb this if I wanted." + }, + { + "ids": "8958,8959,8960", + "examine": "There must be some trick to opening this..." + }, + { + "ids": "8961", + "examine": "It's opening..." + }, + { + "ids": "8962", + "examine": "Apparently there was some trick to opening it!" + }, + { + "ids": "8963,8964,8965", + "examine": "Not as difficult to walk through as it was a minute ago." + }, + { + "ids": "1337", + "examine": "Steps*Leads to the surface." + }, + { + "ids": "8967,8968,8969,8970,8971", + "examine": "A sturdy looking door, propped shut with a support." + }, + { + "ids": "8972", + "examine": "A portal back to the real world..." + }, + { + "ids": "8973", + "examine": "One of the most common trees in RuneScape." + }, + { + "ids": "8974,8975,8976,8977,8978,8979,8980,8981,8982,8983,8984", + "examine": "A commonly found tree." + }, + { + "ids": "8985", + "examine": "Steam seems to be condensing into the pot. Neat trick!" + }, + { + "ids": "8986", + "examine": "I can see fish swimming in the water. Well, they sort of look like fish..." + }, + { + "ids": "8987", + "examine": "A portal that leads... somewhere?" + }, + { + "ids": "8988", + "examine": "I wonder what's inside..." + }, + { + "ids": "8989,8990,8991,8992,8993,8994,8995,8996,8997", + "examine": "Someone's looking through the chest." + }, + { + "ids": "8998,8999,9000,9001,9002,9003,9004,9005", + "examine": "An appendage for activating something." + }, + { + "ids": "9006,9007", + "examine": "A place to cremate the dead. Needs a body." + }, + { + "ids": "9008,9009", + "examine": "A place to cremate the dead. Needs a light." + }, + { + "ids": "9010,9011,9012,9013", + "examine": "This has broad leaves." + }, + { + "ids": "9014", + "examine": "This has been chopped away." + }, + { + "ids": "9015,9016,9017,9018", + "examine": "This has broad leaves." + }, + { + "ids": "9019", + "examine": "This has been chopped away." + }, + { + "ids": "9020,9021,9022,9023", + "examine": "This has broad leaves." + }, + { + "ids": "9024", + "examine": "This has been chopped away." + }, + { + "ids": "9025,9026,9027,9028", + "examine": "A damaged wooden fence." + }, + { + "ids": "9029", + "examine": "A wooden fence." + }, + { + "ids": "9030,9031,9032", + "examine": "Gems encrusted in stone." + }, + { + "ids": "9033", + "examine": "Many rare plants such as this usually have exotic tubers." + }, + { + "ids": "9034", + "examine": "A beautiful old mahogany tree." + }, + { + "ids": "9035", + "examine": "This once was a beautiful tree." + }, + { + "ids": "9036", + "examine": "A beautiful old teak tree." + }, + { + "ids": "9037", + "examine": "This tree has been cut down." + }, + { + "ids": "9038,9039,9040,9041,9042,9043", + "examine": "A set of large, sturdy wooden doors." + }, + { + "ids": "9044,9045,9046,9047", + "examine": "Some goutweed is growing in this patch." + }, + { + "ids": "9048", + "examine": "Some fully grown goutweed." + }, + { + "ids": "9049,9050,9051", + "examine": "This goutweed has become diseased." + }, + { + "ids": "9052,9053,9054,9055,9056,9057", + "examine": "This goutweed has become diseased and died." + }, + { + "ids": "9058", + "examine": "He's not stocking much." + }, + { + "ids": "9059", + "examine": "He's stocking rune caskets." + }, + { + "ids": "9060", + "examine": "He's stocking blackjacks." + }, + { + "ids": "9061", + "examine": "He's stocking fez hats." + }, + { + "ids": "9062", + "examine": "He's stocking rune caskets." + }, + { + "ids": "9063", + "examine": "He's stocking colourful clothes." + }, + { + "ids": "9064,9065", + "examine": "A wooden crate." + }, + { + "ids": "9066,9067", + "examine": "A wooden crate containing caskets." + }, + { + "ids": "9068,9069", + "examine": "A wooden crate containing Blackjacks." + }, + { + "ids": "9070", + "examine": "A wooden crate containing fez hats." + }, + { + "ids": "9071", + "examine": "A wooden crate containing clothes." + }, + { + "ids": "9072,9073", + "examine": "Boxy." + }, + { + "ids": "9074,9075", + "examine": "boxy" + }, + { + "ids": "9076", + "examine": "This cloth has been dyed." + }, + { + "ids": "9077,9078", + "examine": "Mmmm pretty!" + }, + { + "ids": "9079,9080,9081", + "examine": "These dyed fabrics are drying off." + }, + { + "ids": "9082", + "examine": "Items for making clothes are kept on here." + }, + { + "ids": "9083", + "examine": "Pots full of dye." + }, + { + "ids": "9084", + "examine": "A way down." + }, + { + "ids": "9085", + "examine": "There's not much coke in the stove." + }, + { + "ids": "9086", + "examine": "There's a fair amount of coke in the stove." + }, + { + "ids": "9087", + "examine": "There's lots of coke in the stove." + }, + { + "ids": "9088", + "examine": "A big pile of refined coal." + }, + { + "ids": "9089", + "examine": "You can read the furnace temperature here." + }, + { + "ids": "9090", + "examine": "Used to pump hot air through the furnace." + }, + { + "ids": "9091,9092", + "examine": "Bars come out of the blast furnace here." + }, + { + "ids": "9093,9094", + "examine": "Your bars will come out here." + }, + { + "ids": "9095", + "examine": "The bars are glowing hot!" + }, + { + "ids": "9096", + "examine": "Your bars are ready to take." + }, + { + "ids": "9097", + "examine": "They power the conveyor belt." + }, + { + "ids": "9098", + "examine": "The foreman refers to it as 'Bertha'." + }, + { + "ids": "9099", + "examine": "It shows that the furnace is working." + }, + { + "ids": "9100,9101", + "examine": "Ore rides this into the blast furnace." + }, + { + "ids": "9102", + "examine": "It keeps the conveyor belt running." + }, + { + "ids": "9103", + "examine": "Fix it, quick!" + }, + { + "ids": "9104", + "examine": "They keep the conveyor belt running." + }, + { + "ids": "9105", + "examine": "Fix them, quick!" + }, + { + "ids": "9106,9107", + "examine": "It keeps the conveyor belt turning." + }, + { + "ids": "9108,9109,9110,9111,9112,9113,9114", + "examine": "They keep the conveyor belt turning." + }, + { + "ids": "9115", + "examine": "It shows that the furnace is working." + }, + { + "ids": "9116", + "examine": "Hot air circulates through these." + }, + { + "ids": "9117,9118,9119", + "examine": "Quick, fix them!" + }, + { + "ids": "9120", + "examine": "Hot air circulates through these." + }, + { + "ids": "9121,9122", + "examine": "Quick, fix them!" + }, + { + "ids": "9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133,9134,9135,9136,9137", + "examine": "It shows the furnace is working." + }, + { + "ids": "9138,9139", + "examine": "A way upwards." + }, + { + "ids": "9140,9141", + "examine": "The gate is closed." + }, + { + "ids": "9142", + "examine": "The gate is open." + }, + { + "ids": "9143", + "examine": "Used for getting water." + }, + { + "ids": "9144", + "examine": "Some kind of jewellery is dangling from this ornament." + }, + { + "ids": "9145", + "examine": "Someone's showing off their wealth!" + }, + { + "ids": "9146,9147", + "examine": "Filled to the brim with knowledge." + }, + { + "ids": "9148", + "examine": "A nicely carved wooden chair." + }, + { + "ids": "9149", + "examine": "An expensive privacy aid!" + }, + { + "ids": "9150", + "examine": "An old wall." + }, + { + "ids": "9151", + "examine": "Security breach!" + }, + { + "ids": "9152,9153,9154", + "examine": "A patched up hole." + }, + { + "ids": "9155", + "examine": "'You are here.'" + }, + { + "ids": "9156", + "examine": "An elegant desk with a curious ornament on it." + }, + { + "ids": "9157,9158", + "examine": "Someone's gold-trimmed this Saradomin armour!" + }, + { + "ids": "9159,9160,9161,9162,9163,9164,9165", + "examine": "Lit to remember the souls of the departed." + }, + { + "ids": "9166,9167,9168,9169", + "examine": "You can grow delphiniums in this Farming patch." + }, + { + "ids": "9170", + "examine": "Delphinium seeds have been sown in this farming patch." + }, + { + "ids": "9171,9172", + "examine": "Beautiful." + }, + { + "ids": "9173,9174,9175,9176", + "examine": "These delphiniums are fully grown." + }, + { + "ids": "9177,9178,9179,9180", + "examine": "You can grow a pink rose bush in this patch." + }, + { + "ids": "9181,9182,9183,9184", + "examine": "You can grow a white rose bush in this patch." + }, + { + "ids": "9185,9186,9187,9188", + "examine": "You can grow a red rose bush in this patch." + }, + { + "ids": "9189,9190,9191", + "examine": "A rose bush." + }, + { + "ids": "9192", + "examine": "This white rosebush is fully grown." + }, + { + "ids": "9193", + "examine": "A rose bush." + }, + { + "ids": "9194", + "examine": "This red rosebush is fully grown." + }, + { + "ids": "9195", + "examine": "A pink rosebush." + }, + { + "ids": "9196,9197,9198", + "examine": "This pink rosebush is fully grown." + }, + { + "ids": "9199,9200,9201", + "examine": "A plantpot of pink orchids." + }, + { + "ids": "9202", + "examine": "These pink orchids are fully grown." + }, + { + "ids": "9203", + "examine": "An empty plantpot." + }, + { + "ids": "9204", + "examine": "A plantpot filled with soil." + }, + { + "ids": "9205,9206,9207", + "examine": "A plantpot of yellow orchids." + }, + { + "ids": "9208,9209", + "examine": "These yellow orchids are fully grown." + }, + { + "ids": "9210,9211,9212,9213", + "examine": "You can grow a White Tree in this patch." + }, + { + "ids": "9214", + "examine": "A White Tree sapling has been planted in this patch." + }, + { + "ids": "9215,9216,9217", + "examine": "A White Tree is growing in this patch." + }, + { + "ids": "9218", + "examine": "This White Tree is fully grown." + }, + { + "ids": "9219", + "examine": "This White Tree bears a single fruit." + }, + { + "ids": "9220", + "examine": "This White Tree bears two fruits." + }, + { + "ids": "9221", + "examine": "This White Tree bears three fruits." + }, + { + "ids": "9222,9223", + "examine": "This White Tree bears four fruits." + }, + { + "ids": "9224,9225,9226,9227", + "examine": "You can grow snowdrops in this Farming patch." + }, + { + "ids": "9228,9229,9230", + "examine": "A patch of snowdrops." + }, + { + "ids": "9231,9232", + "examine": "These snowdrops are fully grown." + }, + { + "ids": "9233", + "examine": "You can grow Burthorpe Vine in this patch." + }, + { + "ids": "9234,9235,9236", + "examine": "You can grow Burthorpe Vines in this patch." + }, + { + "ids": "9237,9238,9239", + "examine": "Burthorpe vines are growing in this patch." + }, + { + "ids": "9240", + "examine": "These Burthorpe vines are fully grown." + }, + { + "ids": "9241,9242", + "examine": "An empty plinth for a statue." + }, + { + "ids": "9243", + "examine": "What a good likeness!" + }, + { + "ids": "9244", + "examine": "An empty plinth for a statue." + }, + { + "ids": "9245", + "examine": "An expertly carved statue of a former King of Misthalin." + }, + { + "ids": "9246", + "examine": "An empty plinth for a statue." + }, + { + "ids": "9247", + "examine": "What a good likeness!" + }, + { + "ids": "9248", + "examine": "An empty plinth for a statue." + }, + { + "ids": "9249,9250,9251,9252,9253,9254", + "examine": "An expertly carved statue of a former King of Misthalin." + }, + { + "ids": "9255", + "examine": "These grapevines look much healthier now." + }, + { + "ids": "9256", + "examine": "These grapevines are suffering from some strange disease." + }, + { + "ids": "9257,9258,9259", + "examine": "Some wild-looking grass." + }, + { + "ids": "9260", + "examine": "Some red roses." + }, + { + "ids": "9261", + "examine": "Some pink roses." + }, + { + "ids": "9262", + "examine": "Some white roses." + }, + { + "ids": "9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,9290", + "examine": "A White Tree." + }, + { + "ids": "9291", + "examine": "Sit back and enjoy the view." + }, + { + "ids": "9292", + "examine": "An expertly carved statue of a former Queen of Misthalin." + }, + { + "ids": "9293", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "9294", + "examine": "Funny looking holes that don't look too inviting." + }, + { + "ids": "9295", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "9296,9297,9298", + "examine": "A rocky outcrop." + }, + { + "ids": "9299", + "examine": "Ornate railing." + }, + { + "ids": "9300", + "examine": "Wooden fencing." + }, + { + "ids": "9301", + "examine": "A well constructed castle wall." + }, + { + "ids": "9302", + "examine": "A rather strategically placed hole, which appears to be in the ground." + }, + { + "ids": "9303,9304,9305,9306", + "examine": "A rocky outcrop." + }, + { + "ids": "9307,9308", + "examine": "A well weathered wall." + }, + { + "ids": "9309,9310", + "examine": "A tunnel leading under the wall." + }, + { + "ids": "9311,9312", + "examine": "An underwall tunnel." + }, + { + "ids": "9313", + "examine": "Looks suspicious." + }, + { + "ids": "9314", + "examine": "A wall jutting out into the path." + }, + { + "ids": "9315", + "examine": "I can jump from this stepping stone." + }, + { + "ids": "9316,9317,9318", + "examine": "A rocky outcrop." + }, + { + "ids": "9319,9320", + "examine": "A chain rope" + }, + { + "ids": "9321", + "examine": "A few rocks short of a wall" + }, + { + "ids": "9322,9323,9324", + "examine": "The foam from the river makes this log very slippy." + }, + { + "ids": "9325", + "examine": "Just another crack in the wall." + }, + { + "ids": "9326", + "examine": "Funny looking holes that don't look too inviting." + }, + { + "ids": "9327", + "examine": "They seem to fit in the with the rocky surroundings, so as not to stick out." + }, + { + "ids": "9328,9329,9330", + "examine": "A slippery well worn log." + }, + { + "ids": "9331,9332,9333", + "examine": "A rocky outcrop." + }, + { + "ids": "9334", + "examine": "Used to be ornate, now it's a little bit vandalised." + }, + { + "ids": "9335,9336", + "examine": "A rocky outcrop." + }, + { + "ids": "9337", + "examine": "Used to be ornate, now it's a little bit vandalised." + }, + { + "ids": "9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9352,9353", + "examine": "Should scare off the birds..." + }, + { + "ids": "9354", + "examine": "This looks like the way out." + }, + { + "ids": "9355", + "examine": "A cave deep into the volcano." + }, + { + "ids": "9356,9357", + "examine": "A cave deeper into the volcano." + }, + { + "ids": "9358", + "examine": "A cave deep into the volcano." + }, + { + "ids": "9359,9360,9361,9362,9363,9364,9365", + "examine": "This looks like the way out." + }, + { + "ids": "9366", + "examine": "The barrier of heat is down." + }, + { + "ids": "9367,9368,9369,9370,9371,9372,9373", + "examine": "A barrier of heat." + }, + { + "ids": "9374,9375,9376", + "examine": "Hot enough to cook your breakfast on." + }, + { + "ids": "9377,9378,9379", + "examine": "An egg incubated in the lava." + }, + { + "ids": "9380", + "examine": "Who's the man?" + }, + { + "ids": "9381", + "examine": "A wooden crate." + }, + { + "ids": "9382,9383,9384,9385,9386,9387,9388,9389", + "examine": "Some wooden crates." + }, + { + "ids": "9390", + "examine": "A natural forge using volcanic heat." + }, + { + "ids": "9391,9392,9393,9394,9395,9396,9397", + "examine": "I spy with my little eye..." + }, + { + "ids": "9398,9399", + "examine": "Lets you put items into your bank." + }, + { + "ids": "9400", + "examine": "Sparse weeds." + }, + { + "ids": "9401", + "examine": "Weeds." + }, + { + "ids": "9402", + "examine": "Thick weeds." + }, + { + "ids": "9403", + "examine": "This is Unferth's patch for growing potatos." + }, + { + "ids": "9404,9405,9406,9407", + "examine": "You say Potato, I say Poh-tar-to." + }, + { + "ids": "9408,9409,9410,9411,9412,9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9424,9425,9426,9427,9428,9429", + "examine": "Looks like these potatoes have fully grown." + }, + { + "ids": "9430", + "examine": "A nice sturdy bare table." + }, + { + "ids": "9431", + "examine": "A nice sturdy table." + }, + { + "ids": "9432", + "examine": "A table with milk." + }, + { + "ids": "9433", + "examine": "A table with cake." + }, + { + "ids": "9434,9435", + "examine": "A hearty meal for Unferth." + }, + { + "ids": "9436", + "examine": "Great for sleeping in." + }, + { + "ids": "9437,9438", + "examine": "Not so great for sleeping in, it's not made." + }, + { + "ids": "9439", + "examine": "A fire burns brightly here." + }, + { + "ids": "9440", + "examine": "An empty fire place." + }, + { + "ids": "9441,9442", + "examine": "An unlit fire place." + }, + { + "ids": "9443,9444,9445,9446,9447,9448,9449,9450,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461,9462,9463,9464,9465,9466,9467,9468,9469", + "examine": "A good source of books!" + }, + { + "ids": "9470", + "examine": "I can climb these stairs." + }, + { + "ids": "9471", + "examine": "They go down." + }, + { + "ids": "9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497", + "examine": "What could be down here?" + }, + { + "ids": "9498", + "examine": "A small plant, suitable for sandy soil." + }, + { + "ids": "9499", + "examine": "A decorative plant." + }, + { + "ids": "9500", + "examine": "A fairly small plant." + }, + { + "ids": "9501,9502,9503,9504,9505,9506,9507", + "examine": "Another plant." + }, + { + "ids": "9508", + "examine": "Perfect for snoozing in the sun." + }, + { + "ids": "9509", + "examine": "Lovely comfy-looking big bed." + }, + { + "ids": "9510,9511,9512,9513", + "examine": "East to Draynor Village :: South to Rimmington :: South-east to Port Sarim." + }, + { + "ids": "9514", + "examine": "Betty's chair." + }, + { + "ids": "9515", + "examine": "I wonder what she's making?" + }, + { + "ids": "9516,9517,9518", + "examine": "Betty's counter." + }, + { + "ids": "9519", + "examine": "A wooden barrel for storage." + }, + { + "ids": "9520", + "examine": "A wooden barrel containing lots of fish." + }, + { + "ids": "9521", + "examine": "A wooden barrel for storage." + }, + { + "ids": "9522", + "examine": "How much does this weigh?" + }, + { + "ids": "9523", + "examine": "A case. With books." + }, + { + "ids": "9524", + "examine": "A mooring chain." + }, + { + "ids": "9525", + "examine": "One horse power, wooden suspension. A beauty." + }, + { + "ids": "9526,9527,9528,9529", + "examine": "Betty keeps some rune objects here." + }, + { + "ids": "9530", + "examine": "A sinister fungus." + }, + { + "ids": "9531", + "examine": "Sit back and relax..." + }, + { + "ids": "9532", + "examine": "Sit back and enjoy the view." + }, + { + "ids": "9533,9534", + "examine": "A wooden crate." + }, + { + "ids": "9535", + "examine": "Some wooden crates." + }, + { + "ids": "9536", + "examine": "Some wooden boxes." + }, + { + "ids": "9537", + "examine": "It's used for loading and unloading fishing boats." + }, + { + "ids": "9538,9539,9540,9541,9542,9543,9544,9545,9546,9547", + "examine": "I hope it doesn't sink." + }, + { + "ids": "9548,9549,9550,9551,9552,9553,9554,9555,9556,9557", + "examine": "A bucket full of red hot coals." + }, + { + "ids": "9558", + "examine": "It leads up." + }, + { + "ids": "9559,9560", + "examine": "I can climb down this." + }, + { + "ids": "9561", + "examine": "I guess I could sleep in it if I were really tired." + }, + { + "ids": "9562", + "examine": "A prison cell door." + }, + { + "ids": "9563", + "examine": "A locked prison cell door." + }, + { + "ids": "9564", + "examine": "A prison cell door." + }, + { + "ids": "9565,9566", + "examine": "Stops people getting out." + }, + { + "ids": "9567", + "examine": "Ewww!" + }, + { + "ids": "9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581", + "examine": "En-suite facilities in every cell!" + }, + { + "ids": "9582,9583", + "examine": "I can climb up these stairs." + }, + { + "ids": "9584,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599,9600,9601,9602,9603", + "examine": "I can climb down these stairs." + }, + { + "ids": "9604", + "examine": "A leafy plant." + }, + { + "ids": "9605", + "examine": "A leafy fern." + }, + { + "ids": "9606", + "examine": "A leafy shrub." + }, + { + "ids": "9607,9608,9609", + "examine": "A case. With books." + }, + { + "ids": "9610", + "examine": "An artist's easel." + }, + { + "ids": "9611", + "examine": "A good source of books!" + }, + { + "ids": "9612", + "examine": "The Make-over Mage's bed." + }, + { + "ids": "9613", + "examine": "A nice sturdy looking table." + }, + { + "ids": "9614", + "examine": "Generally used for putting things on." + }, + { + "ids": "9615", + "examine": "A small wooden table." + }, + { + "ids": "9616", + "examine": "Items are for sale here." + }, + { + "ids": "9617,9618,9619,9620", + "examine": "All-purpose storage." + }, + { + "ids": "9621", + "examine": "For sitting." + }, + { + "ids": "9622,9623", + "examine": "Fancy." + }, + { + "ids": "9624", + "examine": "It's like a land rudder." + }, + { + "ids": "9625,9626,9627,9628,9629,9630,9631,9632,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658,9659,9660", + "examine": "A wooden wheelbarrow." + }, + { + "ids": "9661", + "examine": "This tree has been cut down." + }, + { + "ids": "9662", + "examine": "Popular with farmers and treasure hunters." + }, + { + "ids": "9663", + "examine": "This tree has fallen to the ground." + }, + { + "ids": "9664", + "examine": "A gnarly old tree root." + }, + { + "ids": "9665", + "examine": "The roots of a tree are exposed." + }, + { + "ids": "9666", + "examine": "I hope I don't trip over any of these." + }, + { + "ids": "9667", + "examine": "Disturbingly man-like." + }, + { + "ids": "9668,9669,9670,9671,9672,9673,9674,9675,9676,9677,9678,9679,9680,9681", + "examine": "Its eyes stare off into the distance..." + }, + { + "ids": "9682", + "examine": "Ideal for cooking on." + }, + { + "ids": "9683", + "examine": "Expels smoke from the range." + }, + { + "ids": "9684", + "examine": "Wash your hands!" + }, + { + "ids": "9685", + "examine": "Generally used for putting things on." + }, + { + "ids": "9686", + "examine": "Some fabric ready for clothing." + }, + { + "ids": "9687,9688", + "examine": "I'm guessing it's for making women's clothes." + }, + { + "ids": "9689", + "examine": "Looks like it's for making men's clothes." + }, + { + "ids": "9690,9691,9692,9693", + "examine": "I think this one's for making men's clothes." + }, + { + "ids": "9694", + "examine": "Some helpful people have placed notes on here, how nice." + }, + { + "ids": "9695", + "examine": "This notice board is full of scrolls and charts." + }, + { + "ids": "9696", + "examine": "I wonder what's inside ?" + }, + { + "ids": "9697,9698,9699,9700,9701", + "examine": "A nice sturdy looking table." + }, + { + "ids": "9702", + "examine": "This clearly isn't used for dining very often." + }, + { + "ids": "9703", + "examine": "Not as nice as some." + }, + { + "ids": "9704,9705", + "examine": "This needs dusting before I'll sit on it." + }, + { + "ids": "9706", + "examine": "This must let me in to the arena somehow..." + }, + { + "ids": "9707", + "examine": "This must let me out of the arena somehow..." + }, + { + "ids": "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", + "examine": "A rocky outcrop." + }, + { + "ids": "9738,9739,9740", + "examine": "An old crumbled pillar." + }, + { + "ids": "9741,9742,9743", + "examine": "Smells like fish." + }, + { + "ids": "9744", + "examine": "I can climb up here." + }, + { + "ids": "9745,9746,9747", + "examine": "I can go below decks with this ladder." + }, + { + "ids": "9748", + "examine": "A collection point." + }, + { + "ids": "9749,9750", + "examine": "A Lever." + }, + { + "ids": "9751", + "examine": "A crystal that was broken a long time ago." + }, + { + "ids": "9752", + "examine": "A repowered crystal." + }, + { + "ids": "9753", + "examine": "Perhaps I should search it." + }, + { + "ids": "9754", + "examine": "I wonder what's inside." + }, + { + "ids": "9755", + "examine": "Perhaps I should search it." + }, + { + "ids": "9756", + "examine": "I wonder what's inside." + }, + { + "ids": "9757", + "examine": "Perhaps I should search it." + }, + { + "ids": "9758", + "examine": "I wonder what's inside." + }, + { + "ids": "9759", + "examine": "Perhaps I should search it." + }, + { + "ids": "9760", + "examine": "I wonder what's inside." + }, + { + "ids": "9761", + "examine": "Perhaps I should search it." + }, + { + "ids": "9762", + "examine": "I wonder what's inside." + }, + { + "ids": "9763,9764,9765", + "examine": "A recently killed guard." + }, + { + "ids": "9766,9767", + "examine": "A recently killed slave." + }, + { + "ids": "9768,9769,9770,9771,9772,9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787,9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838,9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,9869,9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892,9893,9894,9895,9896,9897", + "examine": "A door of pure light!" + }, + { + "ids": "9898,9899,9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922,9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952,9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967,9968,9969,9970,9971,9972,9973,9974", + "examine": "There are holes passing through this pillar." + }, + { + "ids": "9975", + "examine": "I can climb down these." + }, + { + "ids": "9976", + "examine": "A cave wall." + }, + { + "ids": "9977", + "examine": "I wonder where this goes?" + }, + { + "ids": "9978,9979", + "examine": "A ladder carved into the wall." + }, + { + "ids": "9980", + "examine": "A good place for light to merge." + }, + { + "ids": "9981,9982,9983,9984,9985,9986,9987", + "examine": "A good place for a light crystal." + }, + { + "ids": "9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001", + "examine": "A broken pillar." + }, + { + "ids": "10002,10003,10004,10005,10006,10007,10008,10009,10010,10011,10012,10013", + "examine": "An ancient elvish light doorway." + }, + { + "ids": "10014", + "examine": "A source of great power." + }, + { + "ids": "10015", + "examine": "I can climb up these stairs." + }, + { + "ids": "10016", + "examine": "I can climb down these stairs." + }, + { + "ids": "10017,10018", + "examine": "I can climb up these stairs." + }, + { + "ids": "10019,10020,10021,10022,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032", + "examine": "An Octagonal Pillar." + }, + { + "ids": "10033", + "examine": "I could hang off this." + }, + { + "ids": "10034", + "examine": "An ancient trap." + }, + { + "ids": "10035", + "examine": "An ancient blockage." + }, + { + "ids": "10036,10037", + "examine": "A way down." + }, + { + "ids": "10038,10039,10040", + "examine": "A way up." + }, + { + "ids": "10041,10042,10043,10044,10045,10046,10047,10048,10049,10050,10051,10052,10053", + "examine": "The legs probably aren't a natural feature of the tree." + }, + { + "ids": "10054", + "examine": "Sounds like there's liquid inside." + }, + { + "ids": "10055,10056", + "examine": "I won't be leaving that way then." + }, + { + "ids": "10057,10058,10059,10060,10061", + "examine": "Flag, pole... Yep, it's a flagpole." + }, + { + "ids": "10062", + "examine": "This must be climbed over." + }, + { + "ids": "10063,10064,10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075", + "examine": "A pipe I can squeeze through." + }, + { + "ids": "10076,10077,10078,10079", + "examine": "A mat for exercises." + }, + { + "ids": "10080", + "examine": "I wonder if I can hit a bullseye?" + }, + { + "ids": "10081", + "examine": "One of the most common trees in RuneScape." + }, + { + "ids": "10082", + "examine": "A commonly found tree." + }, + { + "ids": "10083", + "examine": "A beautiful old oak." + }, + { + "ids": "10084", + "examine": "Hay There." + }, + { + "ids": "10085", + "examine": "A pile of straw." + }, + { + "ids": "10086", + "examine": "Some hay." + }, + { + "ids": "10087,10088,10089", + "examine": "It looks like an ordinary fishing spot, just infinitely more sinister..." + }, + { + "ids": "10090", + "examine": "Danger..Mudskippers!" + }, + { + "ids": "10091,10092", + "examine": "A fish-filled water tank in the floor." + }, + { + "ids": "10093,10094,10095,10096", + "examine": "Turns milk into other dairy products." + }, + { + "ids": "10097", + "examine": "Weedy." + }, + { + "ids": "10098", + "examine": "Less weedy." + }, + { + "ids": "10099", + "examine": "Almost clear." + }, + { + "ids": "10100", + "examine": "Free from weeds." + }, + { + "ids": "10101", + "examine": "Something is growing here." + }, + { + "ids": "10102", + "examine": "Fully grown Blindweed." + }, + { + "ids": "10103,10104", + "examine": "Weedy, wrecked and infertile." + }, + { + "ids": "10105,10106,10107,10108,10109,10110,10111,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125,10126,10127,10128", + "examine": "A stagnant lake." + }, + { + "ids": "10129,10130,10131,10132,10133,10134,10135", + "examine": "A very large pipe." + }, + { + "ids": "10136,10137", + "examine": "Rickety." + }, + { + "ids": "10138", + "examine": "I hope it doesn't sink." + }, + { + "ids": "10139,10140,10141", + "examine": "It's a palm tree." + }, + { + "ids": "10142", + "examine": "This controls the entire brewery." + }, + { + "ids": "10143", + "examine": "A frothing, spinning, possessed control panel." + }, + { + "ids": "10144", + "examine": "Chugging away nicely." + }, + { + "ids": "10145,10146,10147", + "examine": "A large brass brewing vat." + }, + { + "ids": "10148,10149,10150,10151,10152,10153,10154,10155,10156", + "examine": "The brass seems to be eaten away around the edge..." + }, + { + "ids": "10157", + "examine": "Racks of barrels." + }, + { + "ids": "10158", + "examine": "Round, oaken, barrel-shaped." + }, + { + "ids": "10159", + "examine": "A wooden crate." + }, + { + "ids": "10160", + "examine": "Some wooden crates." + }, + { + "ids": "10161", + "examine": "Some wooden boxes." + }, + { + "ids": "10162", + "examine": "Probably where the farming kit is stored." + }, + { + "ids": "10163,10164", + "examine": "Ah! Definitely where the farming kit is stored." + }, + { + "ids": "10165", + "examine": "Throw the lever! Mwuhahahaha!" + }, + { + "ids": "10166", + "examine": "This lever can't be operated right now." + }, + { + "ids": "10167", + "examine": "It leads up." + }, + { + "ids": "10168,10169", + "examine": "I can climb down this." + }, + { + "ids": "10170", + "examine": "This is where the brewing ingredients go." + }, + { + "ids": "10171", + "examine": "An ominously stained barrel." + }, + { + "ids": "10172,10173", + "examine": "This gate is closed." + }, + { + "ids": "10174", + "examine": "The blood-chilling flag of the Inebriated." + }, + { + "ids": "10175,10176", + "examine": "'Please remember te wash yer hook'. Sound advice for the hygienic pirate." + }, + { + "ids": "10177", + "examine": "I could climb this if I wanted." + }, + { + "ids": "10178", + "examine": "An unlit torch." + }, + { + "ids": "10179,10180,10181,10182,10183,10184,10185,10186,10187,10188,10189,10190,10191,10192", + "examine": "A lit torch." + }, + { + "ids": "10193,10194,10195,10196,10197,10198,10199,10200,10201,10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237,10238,10239,10240,10241,10242,10243,10244,10245", + "examine": "A sturdy iron frame, for climbing up and down." + }, + { + "ids": "10246", + "examine": "Once upon a time this was used to make pottery." + }, + { + "ids": "10247", + "examine": "Once upon a time this made clay hard." + }, + { + "ids": "10248,10249", + "examine": "There was a lot of pottery made here a long time ago." + }, + { + "ids": "10250", + "examine": "Eric's been killed by stones falling from the ceiling!" + }, + { + "ids": "10251", + "examine": "It looks like the magic is failing!" + }, + { + "ids": "10252", + "examine": "A temporary portal to the demon plane." + }, + { + "ids": "10253,10254", + "examine": "A standard." + }, + { + "ids": "10255", + "examine": "Technically a bed." + }, + { + "ids": "10256", + "examine": "There are some books here." + }, + { + "ids": "10257", + "examine": "There are some pots and pans here." + }, + { + "ids": "10258", + "examine": "It's a small table." + }, + { + "ids": "10259", + "examine": "Generally used for sitting." + }, + { + "ids": "10260", + "examine": "The door is closed." + }, + { + "ids": "10261", + "examine": "The door is open." + }, + { + "ids": "10262", + "examine": "The door is closed." + }, + { + "ids": "10263", + "examine": "The door is open." + }, + { + "ids": "10264", + "examine": "The door is closed." + }, + { + "ids": "10265,10266", + "examine": "The door is open." + }, + { + "ids": "10267,10268", + "examine": "A battle-weathered shield." + }, + { + "ids": "10269,10270,10271,10272", + "examine": "A display of various relics." + }, + { + "ids": "10273", + "examine": "A collection of rare books." + }, + { + "ids": "10274,10275,10276,10277", + "examine": "Some sacks here..." + }, + { + "ids": "10278", + "examine": "Looks like it's been out of use for some time." + }, + { + "ids": "10279,10280", + "examine": "It's some crates." + }, + { + "ids": "10281", + "examine": "It's a crate." + }, + { + "ids": "10282", + "examine": "It's some crates." + }, + { + "ids": "10283,10284,10285", + "examine": "Maybe I can swim across here!" + }, + { + "ids": "10286", + "examine": "Looks like this grain has been eaten by rats!" + }, + { + "ids": "10287", + "examine": "A way upwards." + }, + { + "ids": "10288,10289", + "examine": "A way down." + }, + { + "ids": "10290,10291", + "examine": "A device for imposing human nature's arrogant will." + }, + { + "ids": "10292", + "examine": "A device for imposing human-nature's arrogant will." + }, + { + "ids": "10293", + "examine": "A wooden barrel full of beer." + }, + { + "ids": "10294", + "examine": "A wooden barrel full of stale beer." + }, + { + "ids": "10295", + "examine": "Actually, I could do with a drink..." + }, + { + "ids": "10296,10297", + "examine": "Too dirty to sit on." + }, + { + "ids": "10298", + "examine": "Some wooden crates." + }, + { + "ids": "10299", + "examine": "Opens the rat door." + }, + { + "ids": "10300", + "examine": "Contains many rats." + }, + { + "ids": "10301", + "examine": "Contains rats." + }, + { + "ids": "10302,10303", + "examine": "Empty." + }, + { + "ids": "10304", + "examine": "A pair of sacks." + }, + { + "ids": "10305", + "examine": "Rat infested." + }, + { + "ids": "10306", + "examine": "Full of rat food." + }, + { + "ids": "10307", + "examine": "Emits photons of light." + }, + { + "ids": "10308", + "examine": "I can climb down this." + }, + { + "ids": "10309", + "examine": "I can climb this." + }, + { + "ids": "10310", + "examine": "Contains rats." + }, + { + "ids": "10311", + "examine": "Opens the rat door." + }, + { + "ids": "10312", + "examine": "Contains many rats." + }, + { + "ids": "10313", + "examine": "A pair of sacks." + }, + { + "ids": "10314", + "examine": "Rat infested." + }, + { + "ids": "10315", + "examine": "Full of rat food." + }, + { + "ids": "10316", + "examine": "Empty." + }, + { + "ids": "10317", + "examine": "Contains rats." + }, + { + "ids": "10318", + "examine": "Ornate metal gates." + }, + { + "ids": "10319", + "examine": "Handy piece of garden decor." + }, + { + "ids": "10320", + "examine": "Big enough for a cat to get in." + }, + { + "ids": "10321", + "examine": "How dangerous, someone has left this manhole open." + }, + { + "ids": "10322", + "examine": "I can climb down this." + }, + { + "ids": "10323", + "examine": "I could climb up this." + }, + { + "ids": "10324", + "examine": "I could climb down this." + }, + { + "ids": "10325", + "examine": "A magical device that enables one to walk through walls." + }, + { + "ids": "10326", + "examine": "A locked door." + }, + { + "ids": "10327,10328,10329,10330,10331,10332,10333,10334", + "examine": "A magical device that enables one to walk through walls." + }, + { + "ids": "10335,10336,10337,10338,10339,10340,10341,10342,10343,10344,10345", + "examine": "Observe the rats." + }, + { + "ids": "10346,10347,10348,10349,10350,10351,10352,10353,10354,10355,10356,10357", + "examine": "A rats home." + }, + { + "ids": "10358", + "examine": "Lovely comfy-looking big bed." + }, + { + "ids": "10359", + "examine": "A drab-looking bed." + }, + { + "ids": "10360", + "examine": "A pile of rolled up magic carpets." + }, + { + "ids": "10361", + "examine": "A wonderful device that enables one to walk through walls." + }, + { + "ids": "10362,10363,10364,10365,10366,10367,10368,10369,10370", + "examine": "I bet there's a needle in it somewhere." + }, + { + "ids": "10371,10372,10373", + "examine": "A wooden barrel, probably for storing things." + }, + { + "ids": "10374", + "examine": "Securely sealed crates that seem to be full of farming equipment." + }, + { + "ids": "10375", + "examine": "Someone's been storing assorted tools in here." + }, + { + "ids": "10376", + "examine": "I could just go for a choc-ice about now." + }, + { + "ids": "10377", + "examine": "A clay oven for cooking with." + }, + { + "ids": "10378", + "examine": "Cheaper than using a chest for storage." + }, + { + "ids": "10379", + "examine": "Produced by the Karamja Box Company." + }, + { + "ids": "10380", + "examine": "Small wooden boxes." + }, + { + "ids": "10381", + "examine": "For storage." + }, + { + "ids": "10382", + "examine": "For storing junk in." + }, + { + "ids": "10383", + "examine": "There are some books and a box here." + }, + { + "ids": "10384", + "examine": "For storing junk in." + }, + { + "ids": "10385", + "examine": "There are some books and a box here." + }, + { + "ids": "10386,10387,10388,10389,10390,10391,10392,10393,10394,10395,10396,10397,10398,10399,10400,10401", + "examine": "It's empty." + }, + { + "ids": "10402,10403", + "examine": "It looks like water once ran here." + }, + { + "ids": "10404", + "examine": "The water is flowing again." + }, + { + "ids": "10405", + "examine": "It looks like water once ran here." + }, + { + "ids": "10406", + "examine": "The water is flowing again." + }, + { + "ids": "10407", + "examine": "It looks like water once ran here." + }, + { + "ids": "10408", + "examine": "The water is flowing again." + }, + { + "ids": "10409", + "examine": "It looks like water once ran here." + }, + { + "ids": "10410,10411", + "examine": "The water is flowing again." + }, + { + "ids": "10412", + "examine": "A strange hole carefully made in the ground." + }, + { + "ids": "10413", + "examine": "Looks like the Genie's bed." + }, + { + "ids": "10414", + "examine": "Generally used for putting things on." + }, + { + "ids": "10415", + "examine": "A pile of rolled up carpets." + }, + { + "ids": "10416", + "examine": "I'm not going down there without a rope." + }, + { + "ids": "10417", + "examine": "This leads back to the waterfall outside." + }, + { + "ids": "10418,10419,10420,10421,10422,10423,10424,10425,10426,10427,10428,10429,10430,10431,10432", + "examine": "A wooden door." + }, + { + "ids": "10433", + "examine": "A bit bluer than I usually like my fires." + }, + { + "ids": "10434,10435", + "examine": "I can climb back to the surface." + }, + { + "ids": "10436", + "examine": "Nardah's main water supply." + }, + { + "ids": "10437", + "examine": "There's no water here." + }, + { + "ids": "10438", + "examine": "There should be a statue here." + }, + { + "ids": "10439", + "examine": "The Elidinis Statuette is back in it's place." + }, + { + "ids": "10440,10441,10442,10443,10444,10445,10446,10447,10448,10449,10450,10451,10452,10453,10454,10455,10456", + "examine": "A sitting stone." + }, + { + "ids": "10457", + "examine": "Ali's cart, with his supply of water." + }, + { + "ids": "10458,10459,10460,10461,10462,10463,10464,10465,10466,10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482,10483,10484", + "examine": "One of Ali's water barrels." + }, + { + "ids": "10485,10486", + "examine": "Items are for sale here." + }, + { + "ids": "10487,10488", + "examine": "Various implements for working with metal." + }, + { + "ids": "10489", + "examine": "Metal plating for protection." + }, + { + "ids": "10490", + "examine": "Generally used for putting things on." + }, + { + "ids": "10491", + "examine": "The ideal thing to sit on." + }, + { + "ids": "10492", + "examine": "Good for sitting on." + }, + { + "ids": "10493", + "examine": "I can climb this." + }, + { + "ids": "10494", + "examine": "I can climb down this." + }, + { + "ids": "10495,10496,10497,10498", + "examine": "Storage for all needs." + }, + { + "ids": "10499", + "examine": "A small potted plant." + }, + { + "ids": "10500", + "examine": "Someone has planted this." + }, + { + "ids": "10501", + "examine": "A nicely potted fern." + }, + { + "ids": "10502", + "examine": "Better than weeding." + }, + { + "ids": "10503", + "examine": "Not the most inspired architectural design." + }, + { + "ids": "10504,10505", + "examine": "They could do with a wash." + }, + { + "ids": "10506,10507", + "examine": "There are some pots and pans here." + }, + { + "ids": "10508", + "examine": "Some stone temple seating." + }, + { + "ids": "10509", + "examine": "Some old looking scrolls sit here." + }, + { + "ids": "10510", + "examine": "A case. With books." + }, + { + "ids": "10511", + "examine": "A drab looking bed." + }, + { + "ids": "10512", + "examine": "Lovely comfy looking big bed." + }, + { + "ids": "10513", + "examine": "Contains equipment for growing herbs." + }, + { + "ids": "10514,10515", + "examine": "Herb stock is kept here." + }, + { + "ids": "10516", + "examine": "A wooden wheelbarrow." + }, + { + "ids": "10517", + "examine": "The bank teller will serve you from here." + }, + { + "ids": "10518,10519,10520", + "examine": "This booth is closed." + }, + { + "ids": "10521", + "examine": "The antique chalice seems to be attached to the wall." + }, + { + "ids": "10522,10523,10524", + "examine": "This old tapestry depicts a bright light shining at a woman's arms." + }, + { + "ids": "10525", + "examine": "I can climb these stairs." + }, + { + "ids": "10526", + "examine": "They go down." + }, + { + "ids": "10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540", + "examine": "A tall wooden door." + }, + { + "ids": "10541,10542", + "examine": "Flags flying the Human colours." + }, + { + "ids": "10543,10544", + "examine": "Flags flying the Dwarf colours." + }, + { + "ids": "10545,10546", + "examine": "Flags flying the Elf colours." + }, + { + "ids": "10547,10548", + "examine": "Flags flying the Gnome colours." + }, + { + "ids": "10549,10550", + "examine": "Flags flying the Werewolf colours." + }, + { + "ids": "10551,10552", + "examine": "Flags flying the TzHaar colours." + }, + { + "ids": "10553", + "examine": "A metal portcullis." + }, + { + "ids": "10554,10555", + "examine": "I can climb this." + }, + { + "ids": "10556", + "examine": "There's a trapdoor in its base." + }, + { + "ids": "10557", + "examine": "There's an open trapdoor in its base." + }, + { + "ids": "10558", + "examine": "I wonder what's under it?" + }, + { + "ids": "10559", + "examine": "I wonder what's down there?" + }, + { + "ids": "10560,10561", + "examine": "I can climb this." + }, + { + "ids": "10562,10563", + "examine": "It's open." + }, + { + "ids": "10564,10565", + "examine": "A banner proclaiming your victory over the Earth Warrior Champion!" + }, + { + "ids": "10566,10567", + "examine": "A banner proclaiming your victory over the Ghoul Champion!" + }, + { + "ids": "10568,10569", + "examine": "A banner proclaiming your victory over the Giant Champion!" + }, + { + "ids": "10570,10571", + "examine": "A banner proclaiming your victory over the Goblin Champion!" + }, + { + "ids": "10572,10573", + "examine": "A banner proclaiming your victory over the Hobgoblin Champion!" + }, + { + "ids": "10574,10575", + "examine": "A banner proclaiming your victory over the Imp Champion!" + }, + { + "ids": "10576,10577", + "examine": "A banner proclaiming your victory over the Jogre Champion!" + }, + { + "ids": "10578,10579", + "examine": "A banner proclaiming your victory over the Lesser Demon Champion!" + }, + { + "ids": "10580,10581", + "examine": "A banner proclaiming your victory over the Skeleton Champion!" + }, + { + "ids": "10582", + "examine": "A banner proclaiming your victory over the Zombie Champion!" + }, + { + "ids": "10583,10584,10585,10586,10587,10588,10589,10590,10591,10592,10593,10594", + "examine": "A rocky outcrop." + }, + { + "ids": "10595", + "examine": "Emergency exit." + }, + { + "ids": "10596,10597,10598,10599,10600,10601,10602,10603,10604", + "examine": "Enter if you dare..." + }, + { + "ids": "10605", + "examine": "Danger" + }, + { + "ids": "10606", + "examine": "Bronze Chest*A strangely decorated chest, the open lock is painted brown." + }, + { + "ids": "10608", + "examine": "A strangely decorated chest, the open lock is painted crimson." + }, + { + "ids": "10609", + "examine": "A strangely decorated chest, the open lock is painted black." + }, + { + "ids": "10610", + "examine": "A strangely decorated chest, the open lock is painted purple." + }, + { + "ids": "10611", + "examine": "A strangely decorated steel chest, open the lock is painted blood red." + }, + { + "ids": "10612", + "examine": "A strangely decorated steel chest, the open lock is painted brown." + }, + { + "ids": "10613", + "examine": "A strangely decorated steel chest, the open lock is painted crimson." + }, + { + "ids": "10614", + "examine": "A strangely decorated steel chest, the open lock is painted black." + }, + { + "ids": "10615", + "examine": "A strangely decorated steel chest, the open lock is painted purple." + }, + { + "ids": "10616", + "examine": "A strangely decorated black chest, the open lock is painted blood red." + }, + { + "ids": "10617", + "examine": "A strangely decorated black chest, the open lock is painted brown." + }, + { + "ids": "10618", + "examine": "A strangely decorated black chest, the open lock is painted crimson." + }, + { + "ids": "10619", + "examine": "A strangely decorated black chest, the open lock is painted black." + }, + { + "ids": "10620", + "examine": "A strangely decorated black chest, the open lock is painted purple." + }, + { + "ids": "10621", + "examine": "A strangely decorated silver chest, the open lock is painted blood red." + }, + { + "ids": "10622", + "examine": "A strangely decorated silver chest, the open lock is painted brown." + }, + { + "ids": "10623", + "examine": "A strangely decorated silver chest, the open lock is painted crimson." + }, + { + "ids": "10624", + "examine": "A strangely decorated silver chest, the open lock is painted black." + }, + { + "ids": "10625,10626,10627,10628,10629,10630,10631,10632,10633,10634,10635,10636,10637,10638", + "examine": "A strangely decorated silver chest, the open lock is painted purple." + }, + { + "ids": "10639,10640", + "examine": "Shrine to the glory of Saradomin." + }, + { + "ids": "10641,10642,10643,10644,10645,10646,10647,10648,10649,10650,10651", + "examine": "Used for sharpening blades." + }, + { + "ids": "10652", + "examine": "A large tree." + }, + { + "ids": "10653,10654", + "examine": "A decorated tree." + }, + { + "ids": "10655", + "examine": "A large evergreen tree." + }, + { + "ids": "10656,10657,10658,10659,10660,10661,10662,10663", + "examine": "A decorated tree." + }, + { + "ids": "10664", + "examine": "A tall Trollweiss Spruce. An engraving on the trunk reads, 'Ug loves Aga'." + }, + { + "ids": "10665,10666,10667,10668,10669,10670", + "examine": "Boxes containing stuff." + }, + { + "ids": "10671", + "examine": "Only sawdust..." + }, + { + "ids": "10672", + "examine": "Reclaim your lost puppets!" + }, + { + "ids": "10673,10674,10675", + "examine": "Equipment for colouring items." + }, + { + "ids": "10676,10677,10678", + "examine": "A puppet is being constructed here." + }, + { + "ids": "10679,10680,10681,10682,10683,10684,10685", + "examine": "A box containing unpainted decorations." + }, + { + "ids": "10686", + "examine": "Box containing blue puppet heads." + }, + { + "ids": "10687", + "examine": "Box containing blue puppet torsos." + }, + { + "ids": "10688", + "examine": "Box containing blue puppet arms." + }, + { + "ids": "10689", + "examine": "Box containing blue puppet legs." + }, + { + "ids": "10690", + "examine": "Box containing red puppet heads." + }, + { + "ids": "10691", + "examine": "Box containing red puppet torsos." + }, + { + "ids": "10692", + "examine": "Box containing red puppet arms." + }, + { + "ids": "10693", + "examine": "Box containing red puppet legs." + }, + { + "ids": "10694", + "examine": "Box containing green puppet heads." + }, + { + "ids": "10695", + "examine": "Box containing green puppet torsos." + }, + { + "ids": "10696", + "examine": "Box containing green puppet arms." + }, + { + "ids": "10697", + "examine": "Box containing green puppet legs." + }, + { + "ids": "10698", + "examine": "What could be down here?" + }, + { + "ids": "10699,10700", + "examine": "You can climb up these." + }, + { + "ids": "10701", + "examine": "A blue crate. Probably containing puppets." + }, + { + "ids": "10702", + "examine": "A green crate. Probably containing puppets." + }, + { + "ids": "10703", + "examine": "A red crate. Probably containing puppets." + }, + { + "ids": "10704", + "examine": "A large crate. More puppets?" + }, + { + "ids": "10705", + "examine": "Some large wooden crates." + }, + { + "ids": "10706", + "examine": "A large box full of wood chippings.." + }, + { + "ids": "10707,10708,10709", + "examine": "A wooden ladder." + }, + { + "ids": "10710,10711,10712,10713,10714,10715,10716,10717,10718,10719,10720", + "examine": "Pots full of paint." + }, + { + "ids": "10721", + "examine": "A doorway made of light." + }, + { + "ids": "10722,10723", + "examine": "Filled to the brim with knowledge." + }, + { + "ids": "10724", + "examine": "A nicely carved wooden chair." + }, + { + "ids": "10725,10726,10727,10728,10729,10730,10731,10732", + "examine": "A pile of animal Bones." + }, + { + "ids": "10733", + "examine": "Hidden away, I wonder where it goes?" + }, + { + "ids": "10734", + "examine": "Somewhere to put money." + }, + { + "ids": "10735", + "examine": "Somewhere to offer food." + }, + { + "ids": "10736,10737", + "examine": "A statue." + }, + { + "ids": "10738", + "examine": "A statue representing water." + }, + { + "ids": "10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751,10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765,10766,10767", + "examine": "A statue representing air." + }, + { + "ids": "10768,10769,10770", + "examine": "A place to put your money." + }, + { + "ids": "10771,10772,10773,10774,10775,10776,10777", + "examine": "Stairs." + }, + { + "ids": "10778", + "examine": "A teleport to the Telekinetic Theatre." + }, + { + "ids": "10779", + "examine": "A teleport to the Enchanting Chamber." + }, + { + "ids": "10780", + "examine": "A teleport to the Alchemists' Playground." + }, + { + "ids": "10781", + "examine": "A teleport to the Creature Graveyard." + }, + { + "ids": "10782", + "examine": "A teleport to the Entrance hall." + }, + { + "ids": "10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796,10797,10798", + "examine": "This may be worth opening." + }, + { + "ids": "10799", + "examine": "Some simple cubes." + }, + { + "ids": "10800", + "examine": "A pile of cylindrical shapes." + }, + { + "ids": "10801", + "examine": "A pile of Icosahedrons." + }, + { + "ids": "10802", + "examine": "A pile of pentamids." + }, + { + "ids": "10803", + "examine": "A hole the perfect shape for spheres" + }, + { + "ids": "10804", + "examine": "Perhaps the pixies will be back next year." + }, + { + "ids": "10805,10806", + "examine": "Sandy's desk is piled high with paperwork towers." + }, + { + "ids": "10807", + "examine": "A large steaming mug of the finest Karamja Coffee." + }, + { + "ids": "10808", + "examine": "Looks useful for putting things on." + }, + { + "ids": "10809,10810,10811,10812", + "examine": "A bin full of paper." + }, + { + "ids": "10813", + "examine": "Betty's counter. There is a vial standing on it." + }, + { + "ids": "10814,10815,10816", + "examine": "It's very sandy." + }, + { + "ids": "10817", + "examine": "Pull me!" + }, + { + "ids": "10818,10819", + "examine": "Doesn't look like the way out." + }, + { + "ids": "10820,10821,10822,10823", + "examine": "A glowing barrier of energy prevents your escape." + }, + { + "ids": "10824,10825,10826", + "examine": "Oh for a marshmallow on a stick!" + }, + { + "ids": "10827", + "examine": "An ornate fountain." + }, + { + "ids": "10828,10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844,10845,10846,10847", + "examine": "Smells like fish." + }, + { + "ids": "10848,10849,10850", + "examine": "This leads to a tunnel too steep for me to scale." + }, + { + "ids": "10851", + "examine": "I can climb this rocky outcrop." + }, + { + "ids": "10852,10853,10854", + "examine": "A rocky outcrop." + }, + { + "ids": "10855,10856", + "examine": "The doorway leads down into the pyramid." + }, + { + "ids": "10857", + "examine": "I can climb these stairs." + }, + { + "ids": "10858", + "examine": "I can climb down these." + }, + { + "ids": "10859", + "examine": "A gap." + }, + { + "ids": "10860", + "examine": "A narrow ledge." + }, + { + "ids": "10861,10862,10863,10864", + "examine": "A gap." + }, + { + "ids": "10865,10866", + "examine": "It looks like I can clamber over this." + }, + { + "ids": "10867,10868,10869,10870,10871,10872,10873,10874", + "examine": "A wooden plank." + }, + { + "ids": "10875,10876,10877,10878,10879,10880,10881", + "examine": "A stone block." + }, + { + "ids": "10882,10883,10884,10885", + "examine": "A gap." + }, + { + "ids": "10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921,10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933,10934,10935,10936,10937,10938,10939,10940,10941,10942,10943", + "examine": "A narrow ledge." + }, + { + "ids": "10944,10945,10946,10947,10948,10949", + "examine": "A rocky outcrop." + }, + { + "ids": "10950,10951,10952", + "examine": "Looks sturdy enough to climb!" + }, + { + "ids": "10953", + "examine": "Something heavy must have made this." + }, + { + "ids": "10954", + "examine": "The perfect place for a picnic." + }, + { + "ids": "10955,10956,10957", + "examine": "A large statue made of sandstone." + }, + { + "ids": "10958,10959,10960,10961", + "examine": "Made of sandstone and granite." + }, + { + "ids": "10962,10963,10964,10965,10966,10967,10968,10969,10970", + "examine": "A large statue." + }, + { + "ids": "10971", + "examine": "It has no limbs." + }, + { + "ids": "10972", + "examine": "It has a left arm." + }, + { + "ids": "10973", + "examine": "It has a right arm." + }, + { + "ids": "10974", + "examine": "It has a left leg." + }, + { + "ids": "10975", + "examine": "It has a right leg." + }, + { + "ids": "10976", + "examine": "It has a left arm and right arm." + }, + { + "ids": "10977", + "examine": "It has a left arm and left leg." + }, + { + "ids": "10978", + "examine": "It has a left arm and right leg." + }, + { + "ids": "10979", + "examine": "It has a right arm and left leg." + }, + { + "ids": "10980", + "examine": "It has a right arm and right leg." + }, + { + "ids": "10981", + "examine": "It has a left leg and right leg." + }, + { + "ids": "10982", + "examine": "It has a left arm, right arm and left leg." + }, + { + "ids": "10983", + "examine": "It has a left arm, right arm and right leg." + }, + { + "ids": "10984", + "examine": "It has a left arm, left leg and right leg." + }, + { + "ids": "10985", + "examine": "It has a right arm, left leg and right leg." + }, + { + "ids": "10986,10987", + "examine": "It has all its limbs still attached." + }, + { + "ids": "10988", + "examine": "There's a recess on the top shaped like a head." + }, + { + "ids": "10989", + "examine": "There's a stone head in a recess on the top." + }, + { + "ids": "10990", + "examine": "The blood globe is lit." + }, + { + "ids": "10991", + "examine": "The ice globe is lit." + }, + { + "ids": "10992", + "examine": "The shadow globe is lit." + }, + { + "ids": "10993", + "examine": "The smoke globe is lit." + }, + { + "ids": "10994", + "examine": "The blood and ice globes are lit." + }, + { + "ids": "10995", + "examine": "The blood and shadow globes are lit." + }, + { + "ids": "10996", + "examine": "The blood and smoke globes are lit." + }, + { + "ids": "10997", + "examine": "The ice and shadow globes are lit." + }, + { + "ids": "10998", + "examine": "The ice and smoke globes are lit." + }, + { + "ids": "10999", + "examine": "The shadow and smoke globes are lit." + }, + { + "ids": "11000", + "examine": "The ice, shadow and smoke globes are lit." + }, + { + "ids": "11001", + "examine": "The blood, shadow and smoke globes are lit." + }, + { + "ids": "11002", + "examine": "The blood, ice and smoke globes are lit." + }, + { + "ids": "11003", + "examine": "The blood, ice and shadow globes are lit." + }, + { + "ids": "11004", + "examine": "All the globes" + }, + { + "ids": "11005,11006", + "examine": "It's made of a magical force." + }, + { + "ids": "11007,11008", + "examine": "This fountain is frozen solid." + }, + { + "ids": "11009", + "examine": "It's blocked and is spewing out smoke." + }, + { + "ids": "11010,11011,11012,11013,11014,11015,11016", + "examine": "A hot place for forging things in." + }, + { + "ids": "11017,11018,11019", + "examine": "Something burned in here long ago." + }, + { + "ids": "11020,11021,11022,11023,11024,11025,11026,11027", + "examine": "Something's burning here." + }, + { + "ids": "11028,11029,11030,11031", + "examine": "A finished wall." + }, + { + "ids": "11032,11033", + "examine": "A nearly finished wall." + }, + { + "ids": "11034,11035", + "examine": "A half finished wall." + }, + { + "ids": "11036,11037", + "examine": "It needs much more repair." + }, + { + "ids": "11038,11039", + "examine": "A ruined wall." + }, + { + "ids": "11040", + "examine": "A pile of bricks dislodged from the wall nearby." + }, + { + "ids": "11041", + "examine": "I can climb this." + }, + { + "ids": "11042", + "examine": "What's down there?" + }, + { + "ids": "11043,11044,11045,11046,11047,11048", + "examine": "I can climb this." + }, + { + "ids": "11049", + "examine": "I wonder what's under it?" + }, + { + "ids": "11050", + "examine": "I wonder what's down there?" + }, + { + "ids": "11051,11052", + "examine": "There's a recess in it in the shape of a Z." + }, + { + "ids": "11053,11054", + "examine": "There's a recess in it in the shape of an M." + }, + { + "ids": "11055,11056", + "examine": "There's a recess in it in the shape of an R." + }, + { + "ids": "11057,11058", + "examine": "There's a recess in it in the shape of a K." + }, + { + "ids": "11059", + "examine": "There's a recess on the top shaped like a head." + }, + { + "ids": "11060", + "examine": "There's a sigil on it shaped like a Z." + }, + { + "ids": "11061", + "examine": "There's a sigil on it shaped like an M." + }, + { + "ids": "11062", + "examine": "There's a sigil on it shaped like an R." + }, + { + "ids": "11063", + "examine": "There's a sigil on it shaped like a K." + }, + { + "ids": "11064,11065", + "examine": "There's a recess in it in the shape of a left arm." + }, + { + "ids": "11066,11067", + "examine": "There's a recess in it in the shape of a right arm." + }, + { + "ids": "11068,11069", + "examine": "There's a recess in it in the shape of a left leg." + }, + { + "ids": "11070,11071", + "examine": "There's a recess in it in the shape of a right leg." + }, + { + "ids": "11072,11073,11074,11075,11076,11077,11078", + "examine": "Looks like there was once a building here." + }, + { + "ids": "11079", + "examine": "There's a hole in the roof!" + }, + { + "ids": "11080", + "examine": "An old-looking bit of scaffolding." + }, + { + "ids": "11081", + "examine": "An old-looking ladder." + }, + { + "ids": "11082,11083,11084,11085,11086,11087,11088,11089,11090,11091,11092,11093,11094,11095,11096", + "examine": "A wooden wheelbarrow." + }, + { + "ids": "11097", + "examine": "A rock with a pickaxe." + }, + { + "ids": "11098,11099,11100,11101,11102,11103,11104,11105,11106,11107,11108,11109,11110,11111", + "examine": "A rock." + }, + { + "ids": "11112", + "examine": "This tree has long been dead." + }, + { + "ids": "11113,11114,11115,11116,11117,11118,11119,11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11136,11137,11138,11139,11140", + "examine": "A dried up bush, void of life." + }, + { + "ids": "11141,11142,11143,11144,11145,11146,11147,11148,11149,11150", + "examine": "He's been trapped in there for a long time." + }, + { + "ids": "11151", + "examine": "There's a recess in it in the shape of an arm." + }, + { + "ids": "11152", + "examine": "There's a recess in it in the shape of a leg." + }, + { + "ids": "11153,11154,11155,11156,11157,11158,11159,11160,11161", + "examine": "A simple stone pedestal." + }, + { + "ids": "11162,11163,11164", + "examine": "A big grinding thing." + }, + { + "ids": "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", + "examine": "A rocky outcrop." + }, + { + "ids": "11196,11197", + "examine": "An elf-fashioned door." + }, + { + "ids": "11198", + "examine": "The ladder to the Runeversi challenge room for experienced players." + }, + { + "ids": "11199", + "examine": "The ladder back to the Runeversi challenge room." + }, + { + "ids": "11200", + "examine": "The ladder to the Runesquares challenge room for experienced players." + }, + { + "ids": "11201", + "examine": "The ladder back to the Runesquares challenge room." + }, + { + "ids": "11202", + "examine": "A game of runesquares is being played on this table." + }, + { + "ids": "11203", + "examine": "A game of runeversi is being played on this table." + }, + { + "ids": "11204", + "examine": "Runesquares challenge room." + }, + { + "ids": "11205", + "examine": "Runeversi challenge room." + }, + { + "ids": "11206", + "examine": "Runesquares challenge room for experienced players." + }, + { + "ids": "11207", + "examine": "Runeversi challenge room for experienced players." + }, + { + "ids": "11208", + "examine": "Looks comfortable..." + }, + { + "ids": "11209,11210,11211,11212,11213", + "examine": "Permission to board?" + }, + { + "ids": "11214", + "examine": "Ready...aim...fire!" + }, + { + "ids": "11215", + "examine": "Not likely to work with that hole in it." + }, + { + "ids": "11216", + "examine": "Where did the barrel go?" + }, + { + "ids": "11217,11218", + "examine": "Ready to fire." + }, + { + "ids": "11219", + "examine": "If I can't destroy this we're sunk." + }, + { + "ids": "11220,11221,11222,11223,11224,11225,11226,11227", + "examine": "Let's hope they don't repair it." + }, + { + "ids": "11228,11229,11230", + "examine": "Useful for transportation of valuable items." + }, + { + "ids": "11231", + "examine": "I wonder what's inside." + }, + { + "ids": "11232,11233", + "examine": "Perhaps I should search it." + }, + { + "ids": "11234,11235", + "examine": "A wooden barrel for storage." + }, + { + "ids": "11236,11237", + "examine": "For the storage of plunder." + }, + { + "ids": "11238", + "examine": "Warning! Contents may explode!" + }, + { + "ids": "11239", + "examine": "I wouldn't be surprised if bits land over in Lumbridge." + }, + { + "ids": "11240,11241,11242,11243", + "examine": "Rigged to blow." + }, + { + "ids": "11244", + "examine": "I can climb down here." + }, + { + "ids": "11245", + "examine": "Full of gunpowder. I'd best be careful." + }, + { + "ids": "11246,11247", + "examine": "Stores repair items." + }, + { + "ids": "11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275", + "examine": "Cannons. Lots of cannons." + }, + { + "ids": "11276,11277,11278,11279", + "examine": "Holds up the sails." + }, + { + "ids": "11280", + "examine": "Useful if there is any wind." + }, + { + "ids": "11281,11282", + "examine": "Useful for making ships move." + }, + { + "ids": "11283,11284,11285,11286", + "examine": "Useful for making ships move" + }, + { + "ids": "11287,11288", + "examine": "This figure brings luck to those who sail." + }, + { + "ids": "11289,11290", + "examine": "Allows access to other parts of the ship." + }, + { + "ids": "11291", + "examine": "Useful for making ships move." + }, + { + "ids": "11292,11293,11294,11295,11296,11297,11298,11299,11300,11301", + "examine": "A conveniently rolled sail." + }, + { + "ids": "11302", + "examine": "Useful for making ships move." + }, + { + "ids": "11303,11304", + "examine": "A conveniently rolled sail." + }, + { + "ids": "11305", + "examine": "A wooden barrel for storage." + }, + { + "ids": "11306", + "examine": "Without this I'm going around in circles." + }, + { + "ids": "11307", + "examine": "How much does this weigh?" + }, + { + "ids": "11308", + "examine": "I can climb up here." + }, + { + "ids": "11309", + "examine": "I can go below decks with this ladder." + }, + { + "ids": "11310", + "examine": "The only way to get up the mast." + }, + { + "ids": "11311", + "examine": "For swinging on." + }, + { + "ids": "11312,11313,11314", + "examine": "This isn't currently usable." + }, + { + "ids": "11315", + "examine": "This is rigged to blow!" + }, + { + "ids": "11316", + "examine": "You can light this." + }, + { + "ids": "11317,11318", + "examine": "That water can't be good." + }, + { + "ids": "11319", + "examine": "That's plugged it." + }, + { + "ids": "11320,11321,11322", + "examine": "A wooden barrel for storage." + }, + { + "ids": "11323", + "examine": "For storing plunder." + }, + { + "ids": "11324,11325,11326,11327,11328,11329", + "examine": "This seems to stand out." + }, + { + "ids": "11330,11331", + "examine": "A wooden crate." + }, + { + "ids": "11332,11333,11334", + "examine": "A security gate." + }, + { + "ids": "11335,11336,11337", + "examine": "Bamboo strips have been lashed together to make this rickety desk." + }, + { + "ids": "11338", + "examine": "The bank teller will serve you from here." + }, + { + "ids": "11339,11340", + "examine": "Shake that booty!" + }, + { + "ids": "11341", + "examine": "An old storage chest." + }, + { + "ids": "11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353", + "examine": "Stores items for the journey." + }, + { + "ids": "11354,11355", + "examine": "Who knows where it may lead?" + }, + { + "ids": "11356", + "examine": "A gateway back to RuneScape." + }, + { + "ids": "11357", + "examine": "The Professor's been at it again!" + }, + { + "ids": "11358,11359", + "examine": "I can climb up these stairs." + }, + { + "ids": "11360", + "examine": "This stall smells great." + }, + { + "ids": "11361", + "examine": "It's a raw chompybird on a spit." + }, + { + "ids": "11362", + "examine": "It's a raw Rabbit on a spit." + }, + { + "ids": "11363", + "examine": "It's an iron spit." + }, + { + "ids": "11364", + "examine": "A stone pillar that looks like Bob the Cat." + }, + { + "ids": "11365", + "examine": "A stone pillar that looks like Zamorak." + }, + { + "ids": "11366", + "examine": "A stone pillar that looks like Guthix." + }, + { + "ids": "11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,11378", + "examine": "A stone pillar that looks like Saradomin." + }, + { + "ids": "11379,11380,11381,11382", + "examine": "A large church door." + }, + { + "ids": "11383,11384,11385", + "examine": "A stone pillar that looks like Saradomin." + }, + { + "ids": "11386,11387,11388", + "examine": "A stone pillar that looks like Guthix." + }, + { + "ids": "11389,11390,11391", + "examine": "A stone pillar that looks like Zamorak." + }, + { + "ids": "11392,11393,11394", + "examine": "A stone pillar that looks like Bob the Cat." + }, + { + "ids": "11395", + "examine": "A candle in a holder." + }, + { + "ids": "11396", + "examine": "A melted candle." + }, + { + "ids": "11397", + "examine": "A candle flame." + }, + { + "ids": "11398", + "examine": "Interface surround." + }, + { + "ids": "11399", + "examine": "Interface button up." + }, + { + "ids": "11400", + "examine": "Interface button down." + }, + { + "ids": "11401", + "examine": "Interface button left." + }, + { + "ids": "11402", + "examine": "Interface button right." + }, + { + "ids": "11403", + "examine": "Interface button ignite." + }, + { + "ids": "11404,11405,11406,11407,11408", + "examine": "Hot!" + }, + { + "ids": "11409,11410", + "examine": "It's a sewer pipe with some rope tied to it." + }, + { + "ids": "11411", + "examine": "A bit of rope." + }, + { + "ids": "11412", + "examine": "A section of rope." + }, + { + "ids": "11413,11414,11415,11416", + "examine": "A bit of rope." + }, + { + "ids": "11417", + "examine": "You can climb down here." + }, + { + "ids": "11418,11419,11420,11421,11422", + "examine": "Hard to notice, but this mud looks disturbed." + }, + { + "ids": "11423", + "examine": "It's a grill." + }, + { + "ids": "11424,11425,11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441,11442,11443,11444,11445,11446,11447,11448", + "examine": "A rocky outcrop." + }, + { + "ids": "11449", + "examine": "This door is locked." + }, + { + "ids": "11450", + "examine": "The door is slightly ajar." + }, + { + "ids": "11451", + "examine": "A lever pointing upwards." + }, + { + "ids": "11452", + "examine": "A lever pointing downwards." + }, + { + "ids": "11453", + "examine": "A lever pointing upwards." + }, + { + "ids": "11454", + "examine": "A lever pointing downwards." + }, + { + "ids": "11455", + "examine": "A lever pointing upwards." + }, + { + "ids": "11456", + "examine": "A lever pointing downwards." + }, + { + "ids": "11457", + "examine": "A lever pointing upwards." + }, + { + "ids": "11458", + "examine": "A lever pointing downwards." + }, + { + "ids": "11459", + "examine": "A lever pointing upwards." + }, + { + "ids": "11460", + "examine": "A lever pointing downwards." + }, + { + "ids": "11461", + "examine": "A lever pointing upwards." + }, + { + "ids": "11462,11463,11464,11465,11466,11467", + "examine": "A lever pointing downwards." + }, + { + "ids": "11468", + "examine": "Handy that they're already lit." + }, + { + "ids": "11469", + "examine": "Disturbingly its eyes look everywhere in the room except at you." + }, + { + "ids": "11470", + "examine": "The door is closed." + }, + { + "ids": "11471", + "examine": "The door is not closed." + }, + { + "ids": "11472,11473,11474,11475,11476,11477,11478,11479,11480,11481,11482", + "examine": "Little candles flickering." + }, + { + "ids": "11483", + "examine": "It's closed." + }, + { + "ids": "11484", + "examine": "A wooden barrel for storage." + }, + { + "ids": "11485", + "examine": "A wooden crate." + }, + { + "ids": "11486", + "examine": "Some wooden crates." + }, + { + "ids": "11487", + "examine": "Some wooden boxes." + }, + { + "ids": "11488", + "examine": "For storage." + }, + { + "ids": "11489", + "examine": "The ideal thing to sit on." + }, + { + "ids": "11490", + "examine": "Do I dare sit on this?" + }, + { + "ids": "11491", + "examine": "A nice sturdy looking table." + }, + { + "ids": "11492", + "examine": "Not so good for sitting on." + }, + { + "ids": "11493", + "examine": "Looks a bit shabby..." + }, + { + "ids": "11494", + "examine": "An enigmatic cabbage." + }, + { + "ids": "11495", + "examine": "Not your average garden feature..." + }, + { + "ids": "11496", + "examine": "Did that chair just move?" + }, + { + "ids": "11497", + "examine": "Disturbingly its eyes look everywhere in the room except at you." + }, + { + "ids": "11498", + "examine": "Dare I go up?" + }, + { + "ids": "11499", + "examine": "These stairs look spooky!" + }, + { + "ids": "11500", + "examine": "A filthy but sturdy looking table." + }, + { + "ids": "11501,11502,11503,11504,11505,11506,11507,11508,11509", + "examine": "I'm not eating off that." + }, + { + "ids": "11510", + "examine": "This tree has long been dead." + }, + { + "ids": "11511,11512,11513,11514,11515,11516,11517,11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545", + "examine": "I can climb up these stairs." + }, + { + "ids": "11546,11547,11548,11549,11550", + "examine": "It's a strange machine." + }, + { + "ids": "11551", + "examine": "It's a table for putting objects on." + }, + { + "ids": "11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588", + "examine": "A rocky outcrop." + }, + { + "ids": "11589,11590,11591,11592,11593,11594,11595,11596,11597,11598", + "examine": "A wooden barrel for storage." + }, + { + "ids": "11599", + "examine": "A wooden crate." + }, + { + "ids": "11600", + "examine": "Convenient for storage." + }, + { + "ids": "11601,11602", + "examine": "Bake your clay pots in here." + }, + { + "ids": "11603,11604,11605", + "examine": "A wooden stool." + }, + { + "ids": "11606,11607,11608,11609,11610,11611,11612,11613", + "examine": "A simple torch stuck in the ground." + }, + { + "ids": "11614,11615", + "examine": "A barbarian flag." + }, + { + "ids": "11616", + "examine": "Keeps the wind out." + }, + { + "ids": "11617,11618", + "examine": "It would keep the wind out better if it were closed." + }, + { + "ids": "11619", + "examine": "Generally used for putting things on." + }, + { + "ids": "11620,11621,11622,11623,11624,11625", + "examine": "The entrance to the barbarians' longhall." + }, + { + "ids": "11626", + "examine": "Items are for sale here." + }, + { + "ids": "11627,11628", + "examine": "A small wooden table." + }, + { + "ids": "11629", + "examine": "A rocky outcrop that looks rather crumbly." + }, + { + "ids": "11630,11631,11632,11633", + "examine": "South to Falador :: West to Taverley :: East to Varrock." + }, + { + "ids": "11634,11635,11636,11637,11638,11639", + "examine": "A rock." + }, + { + "ids": "11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654,11655,11656", + "examine": "Keeps unwelcome folk out of Falador." + }, + { + "ids": "11657", + "examine": "A rack for displaying fine maces." + }, + { + "ids": "11658", + "examine": "Shelves for maces." + }, + { + "ids": "11659", + "examine": "A barrel of maces." + }, + { + "ids": "11660", + "examine": "A table bearing a fine selection of maces." + }, + { + "ids": "11661", + "examine": "A handy source of water." + }, + { + "ids": "11662", + "examine": "Fine gems for sale!" + }, + { + "ids": "11663,11664,11665", + "examine": "Precious stones for sale." + }, + { + "ids": "11666,11667,11668,11669,11670,11671,11672,11673,36956", + "examine": "A hot furnace." + }, + { + "ids": "11674", + "examine": "Rising Sun Tavern." + }, + { + "ids": "11675,11676", + "examine": "Rising Sun Tavern, Falador." + }, + { + "ids": "11677", + "examine": "Powers the spinning pole outside." + }, + { + "ids": "11678,11679,11680,11681", + "examine": "The traditional sign of a barber." + }, + { + "ids": "11682,11683,11684,11685,11686,11687,11688,11689,11690,11691,11692", + "examine": "A small wooden table." + }, + { + "ids": "11693,11694,11695,11696,11697", + "examine": "A statue of a famous White Knight." + }, + { + "ids": "11698", + "examine": "Filled to the brim with knowledge." + }, + { + "ids": "11699", + "examine": "The flag of Asgarnia." + }, + { + "ids": "11700", + "examine": "I thought he'd be bigger than that." + }, + { + "ids": "11701,11702,11703,11704,11705", + "examine": "Big beard, robes. Yeah, that's Saradomin." + }, + { + "ids": "11706", + "examine": "Nicely planted." + }, + { + "ids": "11707", + "examine": "The door is closed." + }, + { + "ids": "11708", + "examine": "The door is open." + }, + { + "ids": "11709", + "examine": "The door is closed." + }, + { + "ids": "11710", + "examine": "The door is open." + }, + { + "ids": "11711", + "examine": "The door is closed." + }, + { + "ids": "11712", + "examine": "The door is open." + }, + { + "ids": "11713", + "examine": "The door is close." + }, + { + "ids": "11714", + "examine": "The door is closed." + }, + { + "ids": "11715", + "examine": "The door is open." + }, + { + "ids": "11716,11717,11718,11719,11720,11721,11722,11723", + "examine": "A grand door." + }, + { + "ids": "11724", + "examine": "I can climb up these stairs." + }, + { + "ids": "11725,11726", + "examine": "I can climb down these stairs." + }, + { + "ids": "11727", + "examine": "I can climb this." + }, + { + "ids": "11728", + "examine": "I can climb down this." + }, + { + "ids": "11729,11730", + "examine": "I can climb up these stairs." + }, + { + "ids": "11731", + "examine": "I can climb down these stairs." + }, + { + "ids": "11732", + "examine": "I can climb up these stairs." + }, + { + "ids": "11733", + "examine": "I can climb down these stairs." + }, + { + "ids": "11734", + "examine": "I can climb these stairs." + }, + { + "ids": "11735", + "examine": "They go down." + }, + { + "ids": "11736", + "examine": "I can climb these stairs." + }, + { + "ids": "11737", + "examine": "They go down." + }, + { + "ids": "11738", + "examine": "A nice sturdy-looking table." + }, + { + "ids": "11739,11740", + "examine": "Allows access to above level." + }, + { + "ids": "11741,11742", + "examine": "Allows access to level below." + }, + { + "ids": "11743", + "examine": "A nice sturdy looking table." + }, + { + "ids": "11744", + "examine": "Small wooden boxes." + }, + { + "ids": "11745", + "examine": "Wooden crates." + }, + { + "ids": "11746", + "examine": "A wooden stool." + }, + { + "ids": "11747", + "examine": "A basic bed." + }, + { + "ids": "11748", + "examine": "Nice banquet table." + }, + { + "ids": "11749,11750,11751,11752", + "examine": "A sturdy-looking round table." + }, + { + "ids": "11753,11754", + "examine": "Armour of a White Knight. Decorative, but still effective." + }, + { + "ids": "11755", + "examine": "'Concerned about theft? Set a Bank PIN today!'" + }, + { + "ids": "11756", + "examine": "'Customers are reminded NEVER to tell ANYONE their password.'" + }, + { + "ids": "11757", + "examine": "This chest contains an impressive amount of Gold!!" + }, + { + "ids": "11758", + "examine": "The bank teller will serve you from here." + }, + { + "ids": "11759", + "examine": "Hope springs eternal." + }, + { + "ids": "11760", + "examine": "A comfortable seat." + }, + { + "ids": "11761", + "examine": "A carving of a figure from the history of RuneScape." + }, + { + "ids": "11762", + "examine": "A source of foamy neurotoxin." + }, + { + "ids": "11763", + "examine": "Where drunkards may be found." + }, + { + "ids": "11764", + "examine": "So clean you could eat your dinner off it." + }, + { + "ids": "11765", + "examine": "I'd really hate to drink anything that had been in here." + }, + { + "ids": "11766", + "examine": "Smells alcoholic." + }, + { + "ids": "11767", + "examine": "Dusty old books." + }, + { + "ids": "11768,11769,11770,11771,11772,11773,11774,11775,11776,11777,11778,11779,11780,11781", + "examine": "Storage for all needs." + }, + { + "ids": "11782,11783,11784,11785,11786,11787,11788", + "examine": "What ancient rites were performed here?" + }, + { + "ids": "11789,11790,11791,11792", + "examine": "Weathered rocks." + }, + { + "ids": "11793", + "examine": "Best used with a bucket." + }, + { + "ids": "11794", + "examine": "Ready for a quick snip?" + }, + { + "ids": "11795", + "examine": "Put your head in my hands..." + }, + { + "ids": "11796,11797,11798", + "examine": "Ooh" + }, + { + "ids": "11799,11800,11801,11802,11803,11804,11805,11806,11807,11808,11809,11810,11811", + "examine": "Makes your hair stay curly." + }, + { + "ids": "11812", + "examine": "Running water" + }, + { + "ids": "11813,11814,11815,11816,11817,11818,11819,11820,11821,11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,11835,11836,11837,11838,11839", + "examine": "Might be handy for a workman." + }, + { + "ids": "11840,11841,11842,11843", + "examine": "A pile of bricks." + }, + { + "ids": "11844,11845,11846,11847", + "examine": "It looks like I might be able to climb over this piece of the wall..." + }, + { + "ids": "11848", + "examine": "An attractively laid out collection of ranging weapons." + }, + { + "ids": "11849,11850,11851,11852,11853,11854,11855,11856,11857,11858,11859,11860", + "examine": "Contains washing items." + }, + { + "ids": "11861", + "examine": "A dwarven flag." + }, + { + "ids": "11862", + "examine": "A tin bath big enough for dwarfs, but too small for humans." + }, + { + "ids": "11863,11864,11865,11866", + "examine": "For bringing ore out of the mines." + }, + { + "ids": "11867", + "examine": "I wonder what's down there?" + }, + { + "ids": "11868", + "examine": "A powerful ranging device that fires metal balls." + }, + { + "ids": "11869,11870,11871,11872", + "examine": "A pile of parts for building a multicannon." + }, + { + "ids": "11873,11874", + "examine": "A crate containing parts for building a multicannon." + }, + { + "ids": "11875", + "examine": "Used for detecting dangerous gases in the mine." + }, + { + "ids": "11876", + "examine": "Various implements for working with metal." + }, + { + "ids": "11877,11878,11879,11880,11881,11882,11883,11884,11885,11886,11887", + "examine": "A simple place for a simple dwarf to sleep and dream of gold." + }, + { + "ids": "11888", + "examine": "I can climb up these stairs." + }, + { + "ids": "11889", + "examine": "I can climb these stairs." + }, + { + "ids": "11890", + "examine": "I can climb down these stairs." + }, + { + "ids": "11891", + "examine": "Who knows what the dark wizards store in here?" + }, + { + "ids": "11892", + "examine": "A filthy but sturdy table." + }, + { + "ids": "11893,11894", + "examine": "Books of dark magic for dark wizards." + }, + { + "ids": "11895", + "examine": "Vicious thorns." + }, + { + "ids": "11896", + "examine": "These could make a fine mess of my legs." + }, + { + "ids": "11897,11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909", + "examine": "Not suitable for sitting on." + }, + { + "ids": "11910", + "examine": "I hope I never meet one of those." + }, + { + "ids": "11911,11912,11913,11914", + "examine": "A dead bush." + }, + { + "ids": "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,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975,11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,11988,11989,11990,11991,11992", + "examine": "A rocky outcrop." + }, + { + "ids": "11993", + "examine": "The door is closed." + }, + { + "ids": "11994,11995,11996,11997,11998,11999,12000,12001,12002", + "examine": "The door is open." + }, + { + "ids": "12003", + "examine": "Better not eat them!" + }, + { + "ids": "12004", + "examine": "It's going to be a tight squeeze!" + }, + { + "ids": "12005,12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021,12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037,12038,12039,12040", + "examine": "Illuminating!" + }, + { + "ids": "12041", + "examine": "It'll be a tight squeeze." + }, + { + "ids": "12042,12043,12044", + "examine": "All tangled up!" + }, + { + "ids": "12045,12046,12047,12048,12049,12050,12051,12052,12053,12054,12055,12056,12057,12058,12059", + "examine": "A magic door." + }, + { + "ids": "12060,12061", + "examine": "Shelves of colourful potion gourds!" + }, + { + "ids": "12062,12063", + "examine": "A shelf of colourful potion gourds!" + }, + { + "ids": "12064", + "examine": "Fairy Nuff passed healing 101!" + }, + { + "ids": "12065,12066,12067", + "examine": "It says Nuff is a healer." + }, + { + "ids": "12068,12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084,12085,12086,12087,12088", + "examine": "An assortment of colourful bubbling and smoking potions!" + }, + { + "ids": "12089", + "examine": "A beautiful fairy fountain!" + }, + { + "ids": "12090", + "examine": "She doesn't look like she's breathing!" + }, + { + "ids": "12091", + "examine": "Fit for a fairy." + }, + { + "ids": "12092", + "examine": "Sure looks comfy." + }, + { + "ids": "12093", + "examine": "A shrine to the evil chicken." + }, + { + "ids": "12094,12095,12096,12097,12098,12099", + "examine": "Better not eat them!" + }, + { + "ids": "12100,12101", + "examine": "A hot furnace." + }, + { + "ids": "12102", + "examine": "Ideal for cooking on." + }, + { + "ids": "12103", + "examine": "For storage." + }, + { + "ids": "12104", + "examine": "Some wooden crates." + }, + { + "ids": "12105", + "examine": "A wooden crate." + }, + { + "ids": "12106", + "examine": "Generally used for putting things on." + }, + { + "ids": "12107", + "examine": "A wooden barrel for storage." + }, + { + "ids": "12108", + "examine": "A nice sturdy looking table." + }, + { + "ids": "12109", + "examine": "Its a wall." + }, + { + "ids": "12110", + "examine": "A banner for Group of Advanced Gardeners." + }, + { + "ids": "12111", + "examine": "Fit for milking." + }, + { + "ids": "12112,12113", + "examine": "I can climb this." + }, + { + "ids": "12114", + "examine": "She likes the exercise." + }, + { + "ids": "12115,12116,12117,12118,12119", + "examine": "Full of Grain." + }, + { + "ids": "12120", + "examine": "I wonder what's inside." + }, + { + "ids": "12121", + "examine": "Perhaps I should search it." + }, + { + "ids": "12122,12123,12124", + "examine": "Filled with tepid water." + }, + { + "ids": "12125", + "examine": "Here lies Guy, he told a lie, so we swung him from the gallows high." + }, + { + "ids": "12126", + "examine": "Looks suspicious." + }, + { + "ids": "12127,12128,12129,12130", + "examine": "A wall jutting out into the path." + }, + { + "ids": "12131,12132", + "examine": "Spooky." + }, + { + "ids": "12133", + "examine": "Probably not dead. Although Romeo is none the wiser." + }, + { + "ids": "12134,12135,12136", + "examine": "Contains dead people." + }, + { + "ids": "12137", + "examine": "A wild cadava berry bush." + }, + { + "ids": "12138", + "examine": "A wild red berry bush." + }, + { + "ids": "12139", + "examine": "A perfectly appointed rosebush." + }, + { + "ids": "12140,12141,12142,12143", + "examine": "The sort of bench you get in churches." + }, + { + "ids": "12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154,12155,12156,12157,12158", + "examine": "You can create a canoe here." + }, + { + "ids": "12159,12160,12161,12162,12163,12164,12165,12166,12167", + "examine": "Glug glug glug" + }, + { + "ids": "12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200", + "examine": "canoe" + }, + { + "ids": "12201", + "examine": "A well, it is not safe to climb down." + }, + { + "ids": "12202", + "examine": "A mole hill." + }, + { + "ids": "12203,12204,12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220,12221,12222,12223,12224,12225,12226,12227,12228,12229", + "examine": "There's a hole in the roof." + }, + { + "ids": "12230,12231", + "examine": "I can climb out of this cave from here." + }, + { + "ids": "12232", + "examine": "A place to keep all your clothes & equipment." + }, + { + "ids": "12233,12234,12235", + "examine": "A trophy of a mighty slayer!" + }, + { + "ids": "12236,12237,12238", + "examine": "A trophy of a master fisher." + }, + { + "ids": "12239", + "examine": "It's a Vanilla Planifolia of the Orchidaceae family." + }, + { + "ids": "12240", + "examine": "The remains of an ancient beast." + }, + { + "ids": "12241", + "examine": "Very dead I hope." + }, + { + "ids": "12242", + "examine": "Remains of yesterday's dinner." + }, + { + "ids": "12243", + "examine": "That must be one hungry chicken." + }, + { + "ids": "12244", + "examine": "This one's not very fresh." + }, + { + "ids": "12245", + "examine": "Alas poor Yojllik, I knew him backwards." + }, + { + "ids": "12246", + "examine": "A tall, skinny." + }, + { + "ids": "12247", + "examine": "He fell foul of the fowl." + }, + { + "ids": "12248,12249,12250,12251,12252", + "examine": "The chicken's pecked him clean." + }, + { + "ids": "12253", + "examine": "How am I going to get down there?" + }, + { + "ids": "12254", + "examine": "I guess I need to climb down." + }, + { + "ids": "12255", + "examine": "I hope this holds!" + }, + { + "ids": "12256", + "examine": "Will those eggs become baby chicks?" + }, + { + "ids": "12257", + "examine": "Must have been laid by one of those dragons." + }, + { + "ids": "12258", + "examine": "Hot!" + }, + { + "ids": "12259", + "examine": "The nest of evil!" + }, + { + "ids": "12260,12261", + "examine": "Will this take me home?" + }, + { + "ids": "12262", + "examine": "It probably leads to some sort of cellar." + }, + { + "ids": "12263", + "examine": "What mysteries lie below?" + }, + { + "ids": "12264", + "examine": "An oak ladder." + }, + { + "ids": "12265,12266", + "examine": "Old wooden steps." + }, + { + "ids": "12267", + "examine": "What evil lurks below?" + }, + { + "ids": "12268", + "examine": "Rickety wooden steps lead down into the lair of evil." + }, + { + "ids": "12269,12270,12271,12272,12273,12274,12275,12276,12277,12278", + "examine": "Hmmmm...home cooking." + }, + { + "ids": "12279", + "examine": "Wash your hands!" + }, + { + "ids": "12280", + "examine": "A nice sturdy looking table." + }, + { + "ids": "12281", + "examine": "A small wooden table." + }, + { + "ids": "12282,12283,12284,12285,12286,12287,12288,12289,12290,12291,12292", + "examine": "How to be evil and influence people." + }, + { + "ids": "12293,12294,12295,12296,12297,12298,12299,12300", + "examine": "Tick tock." + }, + { + "ids": "12301,12302,12303,12304,12305,12306,12307,12308", + "examine": "Little candles flickering." + }, + { + "ids": "12309", + "examine": "It's open." + }, + { + "ids": "12310,12311", + "examine": "Someone should be sitting here." + }, + { + "ids": "12312,12313", + "examine": "Suitable for one." + }, + { + "ids": "12314,12315,12316,12317", + "examine": "A very large banquet table stacked with food." + }, + { + "ids": "12318,12319", + "examine": "It's a seat!" + }, + { + "ids": "12320,12321,12322,12323,12324,12325,12326,12327,12328,12329,12330,12331,12332,12333,12334,12335,12336,12337,12338,12339,12340,12341,12342,12343,12344,12345,12346,12347", + "examine": "He's been frozen in time." + }, + { + "ids": "12348", + "examine": "An ornate-fashioned door." + }, + { + "ids": "12349,12350", + "examine": "A large double door." + }, + { + "ids": "12351,12352,12353,12354", + "examine": "Some kind of strange time barrier." + }, + { + "ids": "12355", + "examine": "A portal to a mystical place..." + }, + { + "ids": "12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385", + "examine": "A portal out of this mystical place..." + }, + { + "ids": "12386", + "examine": "A large crudely built table." + }, + { + "ids": "12387", + "examine": "Definite proof that cooking and gunpowder don't mix." + }, + { + "ids": "12388", + "examine": "A large table now covered in soot." + }, + { + "ids": "12389", + "examine": "What horrors lie below?" + }, + { + "ids": "12390", + "examine": "It's the ladder I came in here by." + }, + { + "ids": "12391", + "examine": "Fortunately this has survived better than most of the kitchen." + }, + { + "ids": "12392", + "examine": "I'm not sure I want to know what goblins keep in their kitchens." + }, + { + "ids": "12393", + "examine": "They're covered in a thick layer of soot." + }, + { + "ids": "12394", + "examine": "Stacks and stacks of sacks." + }, + { + "ids": "12395", + "examine": "Stacks and stacks of soot covered sacks." + }, + { + "ids": "12396,12397,12398", + "examine": "A large empty sack." + }, + { + "ids": "12399", + "examine": "It's empty, apart from the explosion debris covering everything now." + }, + { + "ids": "12400", + "examine": "The bottom of this cauldron is suprisingly blackened, even for a cauldron." + }, + { + "ids": "12401", + "examine": "I don't think Cauldrons are supposed to bounce around like that." + }, + { + "ids": "12402", + "examine": "This could be considered to be a bad thing!" + }, + { + "ids": "12403", + "examine": "These shelves are suprisingly tidy for a goblin. It can't last." + }, + { + "ids": "12404", + "examine": "They're not going to be very useful for keeping things on now." + }, + { + "ids": "12405", + "examine": "The doors don't seem to stay shut properly." + }, + { + "ids": "12406", + "examine": "When I got there the cupboard was bare. Even the doors had been blown off." + }, + { + "ids": "12407", + "examine": "A little three legged stool." + }, + { + "ids": "12408,12409", + "examine": "It's a two legged stool now. Apparently it doesn't work very well." + }, + { + "ids": "12410", + "examine": "A pan with a stereotype. I'm sure it could be used for other things." + }, + { + "ids": "12411", + "examine": "Mmmm, soot flavoured sauce. Lovely!" + }, + { + "ids": "12412", + "examine": "It's not rolling, it's just sitting there." + }, + { + "ids": "12413", + "examine": "It would probably crumble if you tried to roll anything with it." + }, + { + "ids": "12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433", + "examine": "Cutlery with an identity crisis." + }, + { + "ids": "12434,12435,12436,12437,12438,12439", + "examine": "An empty wooden barrel." + }, + { + "ids": "12440,12441", + "examine": "Good for sitting on." + }, + { + "ids": "12442", + "examine": "A large wooden box." + }, + { + "ids": "12443", + "examine": "A neatly stacked pair of crates." + }, + { + "ids": "12444", + "examine": "The door is closed." + }, + { + "ids": "12445", + "examine": "The door is open." + }, + { + "ids": "12446,12447,12448,12449", + "examine": "A large double door." + }, + { + "ids": "12450", + "examine": "A rough wooden table." + }, + { + "ids": "12451,12452", + "examine": "I wonder what's inside?" + }, + { + "ids": "12453,12454,12455,12456,12457,12458,12459", + "examine": "It's not quite the same as flower arranging." + }, + { + "ids": "12460,12461", + "examine": "Ze underwater cave entrance. I ask myself, where will it lead?" + }, + { + "ids": "12462,12463,12464,12465,12466", + "examine": "Ze underwater cave exit, leading me to another underwater adventure." + }, + { + "ids": "12467,12468,12469,12470,12471,12472,12473", + "examine": "Ze pen door, a wonderful example of ze underwater craftsmanship." + }, + { + "ids": "12474,12475", + "examine": "It looks slippy but I think you can climb this." + }, + { + "ids": "12476", + "examine": "Ze anchor chain, linking me with zis underwater paradise." + }, + { + "ids": "12477,12478", + "examine": "Those leaves look useful!" + }, + { + "ids": "12479,12480,12481,12482,12483,12484,12485,12486,12487,12488", + "examine": "The perfect place for coral to grow." + }, + { + "ids": "12489,12490,12491,12492,12493,12494,12495,12496,12497,12498", + "examine": "This is called Elkhorn Coral." + }, + { + "ids": "12499,12500,12501,12502,12503,12504,12505,12506,12507,12508", + "examine": "A type of lace coral." + }, + { + "ids": "12509,12510,12511,12512,12513,12514,12515,12516,12517,12518", + "examine": "Coral is made up of millions of organisms." + }, + { + "ids": "12519", + "examine": "Bonaire-Flower Coral...It's rare!" + }, + { + "ids": "12520,12521,12522,12523,12524,12525,12526,12527,12528,12529", + "examine": "Pollution is rapidly destroying coral reefs." + }, + { + "ids": "12530", + "examine": "I bet the boats gone missing..." + }, + { + "ids": "12531,12532,12533,12534,12535", + "examine": "Precious oxygen...escaping..." + }, + { + "ids": "12536", + "examine": "I can climb up these stairs." + }, + { + "ids": "12537", + "examine": "I can climb these stairs." + }, + { + "ids": "12538", + "examine": "I can climb down these stairs." + }, + { + "ids": "12539,12540", + "examine": "A good source of books!" + }, + { + "ids": "12541,12542", + "examine": "For putting things on." + }, + { + "ids": "12543", + "examine": "A nice sturdy-looking table." + }, + { + "ids": "12544", + "examine": "A small wooden table." + }, + { + "ids": "12545", + "examine": "Small wooden boxes." + }, + { + "ids": "12546,12547", + "examine": "A wooden crate." + }, + { + "ids": "12548,12549", + "examine": "Some wooden crates." + }, + { + "ids": "12550,12551", + "examine": "A large old tree." + }, + { + "ids": "12552", + "examine": "A large old tree, pushed over by Rantz." + }, + { + "ids": "12553", + "examine": "A large old tree that's been felled, with the roots cut off." + }, + { + "ids": "12554", + "examine": "A very crude boat, made from an old tree." + }, + { + "ids": "12555", + "examine": "The roots of a large old tree." + }, + { + "ids": "12556,12557,12558", + "examine": "The rock the inflated toad was tied to." + }, + { + "ids": "12559", + "examine": "A small palm tree." + }, + { + "ids": "12560", + "examine": "A small palm tree with an ogre arrow in it." + }, + { + "ids": "12561,12562,12563", + "examine": "Useful for ogre dinners." + }, + { + "ids": "12564,12565,12566,12567", + "examine": "A pile of rock." + }, + { + "ids": "12568,12569", + "examine": "A very slippery stepping stone." + }, + { + "ids": "12570,12571,12572", + "examine": "A terribly tall tropical tree." + }, + { + "ids": "12573,12574,12575", + "examine": "I can traverse these." + }, + { + "ids": "12576,12577", + "examine": "A climbing wall made from skulls." + }, + { + "ids": "12578", + "examine": "For swinging on." + }, + { + "ids": "12579,12580", + "examine": "A terribly tall tropical tree." + }, + { + "ids": "12581,12582,12583,12584,12585,12586,12587,12588", + "examine": "A vine-choked hole." + }, + { + "ids": "12589,12590,12591,12592,12593", + "examine": "A Rock." + }, + { + "ids": "12594,12595,12596", + "examine": "A Snake." + }, + { + "ids": "12597", + "examine": "A hole." + }, + { + "ids": "12598,12599,12600", + "examine": "A Snake." + }, + { + "ids": "12601", + "examine": "There's a hole in the roof!" + }, + { + "ids": "12602", + "examine": "A hole in the ground." + }, + { + "ids": "12603", + "examine": "This bush seems to glow in the dim light of the cave." + }, + { + "ids": "12604", + "examine": "This banana tree has a strange reddish hue on the leaves." + }, + { + "ids": "12605", + "examine": "This thin shaft of light is all the Tchiki Monkey Nut bush needs to grow." + }, + { + "ids": "12606,12607,12608,12609,12610,12611,12612,12613,12614", + "examine": "A Banana Tree." + }, + { + "ids": "12615", + "examine": "A Bush with monkey nuts growing on it." + }, + { + "ids": "12616", + "examine": "I can see the surface." + }, + { + "ids": "12617", + "examine": "A way out." + }, + { + "ids": "12618,12619,12620,12621", + "examine": "A terribly tall tropical tree." + }, + { + "ids": "12622,12623,12624,12625,12626", + "examine": "A vine." + }, + { + "ids": "12627,12628,12629,12630,12631,12632,12633", + "examine": "A terribly tall tropical tree." + }, + { + "ids": "12634", + "examine": "It's a long, hot rock." + }, + { + "ids": "12635", + "examine": "It's a rock with a dead snake on." + }, + { + "ids": "12636", + "examine": "It's a rock with a dead, burnt snake on." + }, + { + "ids": "12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656", + "examine": "It's a rock with a cooked snake on. Smells good..." + }, + { + "ids": "12657,12658,12659,12660", + "examine": "I can get out this way." + }, + { + "ids": "12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682", + "examine": "Entrance to the monkey agility arena." + }, + { + "ids": "12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695,12696,12697,12698,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710", + "examine": "Bridge Corner" + }, + { + "ids": "12711,12712,12713,12714,12715", + "examine": "A recently filled in grave." + }, + { + "ids": "12716,12717,12718,12719,12720", + "examine": "This will show me who is supposed to go here." + }, + { + "ids": "12721,12722,12723,12724,12725", + "examine": "A grave with a coffin in." + }, + { + "ids": "12726,12727,12728,12729,12730", + "examine": "An empty grave." + }, + { + "ids": "12731", + "examine": "Not the best place to live." + }, + { + "ids": "12732", + "examine": "This tree has long been dead." + }, + { + "ids": "12733", + "examine": "This tree has been cut down." + }, + { + "ids": "12734", + "examine": "Rickety table with signs of recent gambling among the remains of past meals." + }, + { + "ids": "12735", + "examine": "I wonder what's inside." + }, + { + "ids": "12736", + "examine": "Perhaps I should search it." + }, + { + "ids": "12737,12738", + "examine": "A broken down wall." + }, + { + "ids": "12739,12740", + "examine": "This rubble is covering a trapdoor." + }, + { + "ids": "12741", + "examine": "A fallen down wall." + }, + { + "ids": "12742,12743", + "examine": "Broken parts of an old wall." + }, + { + "ids": "12744", + "examine": "I wonder what's under it?" + }, + { + "ids": "12745", + "examine": "I wonder what's down there?" + }, + { + "ids": "12746", + "examine": "A pile of rubble." + }, + { + "ids": "12747", + "examine": "Just a bit pile of rubble, probably from the fallen down building which surrounds you." + }, + { + "ids": "12748", + "examine": "I can climb this." + }, + { + "ids": "12749", + "examine": "Looks like the locals dump their rubble here." + }, + { + "ids": "12750,12751,12752,12753,12754,12755,12756,12757,12758,12759,12760", + "examine": "You seem to make out some writing." + }, + { + "ids": "12761,12762", + "examine": "A rotten looking door." + }, + { + "ids": "12763", + "examine": "Where does this go?" + }, + { + "ids": "12764", + "examine": "I can climb this." + }, + { + "ids": "12765", + "examine": "I wonder where this goes." + }, + { + "ids": "12766,12767", + "examine": "A collection of rare books." + }, + { + "ids": "12768", + "examine": "I wonder what's inside." + }, + { + "ids": "12769", + "examine": "Perhaps I should search it." + }, + { + "ids": "12770,12771,12772", + "examine": "A small cave entrance." + }, + { + "ids": "12773", + "examine": "This cave has been boarded up." + }, + { + "ids": "12774", + "examine": "A rock under the surface of the sea." + }, + { + "ids": "12775", + "examine": "A bed-ridden man." + }, + { + "ids": "12776", + "examine": "Looks slightly lower than the rest, perhaps you can jump it?" + }, + { + "ids": "12777", + "examine": "A wooden trapdoor." + }, + { + "ids": "12778", + "examine": "This leads to the basement." + }, + { + "ids": "12779", + "examine": "I can climb this." + }, + { + "ids": "12780,12781", + "examine": "A wooden ladder." + }, + { + "ids": "12782", + "examine": "This is the source of the leak." + }, + { + "ids": "12783", + "examine": "Hopefully this should stop the leak." + }, + { + "ids": "12784,12785", + "examine": "It's catching the leaking water from the roof." + }, + { + "ids": "12786", + "examine": "This wall has been repaired with wood." + }, + { + "ids": "12787", + "examine": "This wall really needs repairing." + }, + { + "ids": "12788,12789,12790,12791", + "examine": "An empty wooden crate." + }, + { + "ids": "12792", + "examine": "There are some tinderboxes on these shelves." + }, + { + "ids": "12793", + "examine": "There are some axes on these shelves." + }, + { + "ids": "12794,12795", + "examine": "There are some snails on these shelves." + }, + { + "ids": "12796,12797", + "examine": "Come bask in the fire's warm glowing warming glow." + }, + { + "ids": "12798", + "examine": "This bank booth has been recently repaired." + }, + { + "ids": "12799", + "examine": "This bank booth could probably be repaired." + }, + { + "ids": "12800,12801", + "examine": "This bank booth is too damaged to use." + }, + { + "ids": "12802,12803", + "examine": "The resting place of an ancient warrior of Morytania." + }, + { + "ids": "12804,12805", + "examine": "It looks a tad bloody..." + }, + { + "ids": "12806", + "examine": "An old and broken furnace, there is a huge hole in the steel hood." + }, + { + "ids": "12807", + "examine": "This furnace has been repaired with some steel panels, but it has no fuel." + }, + { + "ids": "12808", + "examine": "The furnace has been repaired and has some coal in it." + }, + { + "ids": "12809,12810,12811", + "examine": "A repaired furnace, hot and ready for action." + }, + { + "ids": "12812", + "examine": "Hardened earth, with bits of rock in it, not easy to move." + }, + { + "ids": "12813", + "examine": "Hardened earth, with bits of rock in it, not easy to move, slightly broken up." + }, + { + "ids": "12814", + "examine": "Hardened earth, with bits of rock in it, not easy to move, partially broken up." + }, + { + "ids": "12815", + "examine": "Hard rubble reduced to small pieces, it's quite dusty and not easy to move." + }, + { + "ids": "12816,12817,12818,12819", + "examine": "A wooden gate." + }, + { + "ids": "12820,12821,12822,12823,12824,12825,12826,12827,12828,12829,12830,12831,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,12842,12843", + "examine": "A path leading out of this swampy dead end." + }, + { + "ids": "12844,12845,12846,12847,12848,12849,12850,12851,12852,12853,12854", + "examine": "A veritable pile of bricks." + }, + { + "ids": "12855", + "examine": "It's a bit broken." + }, + { + "ids": "12856", + "examine": "A door barely hanging onto it's hinges." + }, + { + "ids": "12857,12858,12859,12860,12861,12862,12863,12864,12865,12866,12867,12868,12869,12870,12871", + "examine": "Actually, I could do with a drink...never mind...I wasn't thirsty anyway." + }, + { + "ids": "12872", + "examine": "Where does this go?" + }, + { + "ids": "12873", + "examine": "A collection of rare books." + }, + { + "ids": "12874", + "examine": "A wooden crate." + }, + { + "ids": "12875", + "examine": "A wooden wheelbarrow." + }, + { + "ids": "12876", + "examine": "For storage." + }, + { + "ids": "12877", + "examine": "Some wooden crates." + }, + { + "ids": "12878", + "examine": "Some wooden boxes." + }, + { + "ids": "12879", + "examine": "A wooden crate." + }, + { + "ids": "12880", + "examine": "It's a bed!" + }, + { + "ids": "12881,12882", + "examine": "A rotten and decrepid book case." + }, + { + "ids": "12883", + "examine": "Theres nothing here." + }, + { + "ids": "12884", + "examine": "Generally used for putting things on." + }, + { + "ids": "12885,12886", + "examine": "The ideal thing to sit on." + }, + { + "ids": "12887,12888", + "examine": "This needs dusting before I'll sit on it." + }, + { + "ids": "12889", + "examine": "Not so good for sitting on." + }, + { + "ids": "12890,12891", + "examine": "A wooden barrel for storage." + }, + { + "ids": "12892", + "examine": "A small wooden table." + }, + { + "ids": "12893", + "examine": "There's nothing on these shelves." + }, + { + "ids": "12894", + "examine": "Cut down to feed the furnace." + }, + { + "ids": "12895,12896", + "examine": "It doesn't look healthy..." + }, + { + "ids": "12897,12898,12899,12900,12901,12902,12903,12904,12905", + "examine": "It smells stagnant." + }, + { + "ids": "12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926,12927,12928,12929,12930,12931,12932", + "examine": "A wooden ladder." + }, + { + "ids": "12933,12934,12935,12936,12937,12938,12939,12940", + "examine": "Items are for sale here." + }, + { + "ids": "12941,12942,12943", + "examine": "A distinctive layer in the rock strata." + }, + { + "ids": "12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958,12959,12960", + "examine": "It's not a schooner, it's a sailboat." + }, + { + "ids": "12961", + "examine": "A wooden crate." + }, + { + "ids": "12962", + "examine": "A table." + }, + { + "ids": "12963", + "examine": "A wooden crate." + }, + { + "ids": "12964,12965", + "examine": "I can climb this." + }, + { + "ids": "12966", + "examine": "I can climb down this." + }, + { + "ids": "12967,12968", + "examine": "A wooden barrel for storage." + }, + { + "ids": "12969", + "examine": "Something is cooking nicely here." + }, + { + "ids": "12970", + "examine": "A well slept in bed." + }, + { + "ids": "12971", + "examine": "A table." + }, + { + "ids": "12972", + "examine": "It's a small table." + }, + { + "ids": "12973", + "examine": "Good for sitting on." + }, + { + "ids": "12974,12975,12976", + "examine": "After working with livestock, why not wash your hands?" + }, + { + "ids": "12977,12978", + "examine": "A wooden crate." + }, + { + "ids": "12979", + "examine": "This chair rocks" + }, + { + "ids": "12980", + "examine": "Storage for all needs." + }, + { + "ids": "12981", + "examine": "A stand for hats!" + }, + { + "ids": "12982,12983,12984,12985", + "examine": "I can climb over the fence with this." + }, + { + "ids": "12986,12987,12988,12989,12990,12991,12992,12993,12994,12995,12996,12997,12998,12999,13000", + "examine": "A wooden gate." + }, + { + "ids": "13001", + "examine": "The door is closed." + }, + { + "ids": "13002", + "examine": "The door is open." + }, + { + "ids": "13003", + "examine": "I wonder what's inside." + }, + { + "ids": "13004,13005", + "examine": "Perhaps I should search it." + }, + { + "ids": "13006,13007,13008,13009,13010,13011,13012,13013,13014", + "examine": "A desert door." + }, + { + "ids": "13015,13016,13017,13018,13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,13030,13031,13032,13033,13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049,13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065,13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081,13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093", + "examine": "A timber door." + }, + { + "ids": "13094,13095,13096,13097,13098,13099", + "examine": "A large double door." + }, + { + "ids": "13100,13101,13102,13103,13104,13105,13106", + "examine": "A way in to the house." + }, + { + "ids": "13107,13108,13109,13110,13111,13112,13113,13114,13115,13116,13117", + "examine": "I'm sure the animal is glad its fur was put to good use." + }, + { + "ids": "13118,13119,13120,13121,13122,13123,13124,13125", + "examine": "A posh door." + }, + { + "ids": "13126,13127,13128,13129,13130,13131,13132", + "examine": "A place to train unarmed combat with your friends." + }, + { + "ids": "13133,13134,13135,13136", + "examine": "A place to train weapon skills with your friends." + }, + { + "ids": "13137,13138,13139,13140", + "examine": "Anything-goes combat in here!" + }, + { + "ids": "13141", + "examine": "There's nothing there" + }, + { + "ids": "13142,13143,13144", + "examine": "You should try to knock someone off." + }, + { + "ids": "13145,13146", + "examine": "To stop you from stepping out of the ranging spot." + }, + { + "ids": "13147", + "examine": "Stand here to fight with projectiles or spells." + }, + { + "ids": "13148,13149,13150,13151,13152,13153,13154", + "examine": "Great for sleeping in." + }, + { + "ids": "13155", + "examine": "A place to keep your shoes." + }, + { + "ids": "13156,13157,13158,13159,13160,13161", + "examine": "A place to keep all your clothes." + }, + { + "ids": "13162", + "examine": "To get a close look at your chin." + }, + { + "ids": "13163", + "examine": "To help you shave." + }, + { + "ids": "13164,13165,13166,13167,13168", + "examine": "To help you do your hair." + }, + { + "ids": "13169,13170,13171", + "examine": "No little mouse to be seen." + }, + { + "ids": "13172", + "examine": "The holy symbol of the god of light." + }, + { + "ids": "13173", + "examine": "The holy symbol of the god of chaos." + }, + { + "ids": "13174", + "examine": "The holy symbol of the god of balance." + }, + { + "ids": "13175", + "examine": "The golden star reminds you of the glory of Saradomin." + }, + { + "ids": "13176", + "examine": "A fitting symbol of the bloodthirsty Zamorak!" + }, + { + "ids": "13177", + "examine": "A serene icon to the lord of balance." + }, + { + "ids": "13178", + "examine": "An icon of the mysterious Bob." + }, + { + "ids": "13179", + "examine": "An oak altar with a symbol of Saradomin." + }, + { + "ids": "13180", + "examine": "An oak altar with a symbol of Zamorak." + }, + { + "ids": "13181", + "examine": "An oak altar with a symbol of Guthix." + }, + { + "ids": "13182", + "examine": "A teak altar with a symbol of Saradomin." + }, + { + "ids": "13183", + "examine": "A teak altar with a symbol of Zamorak." + }, + { + "ids": "13184", + "examine": "A teak altar with a symbol of Guthix." + }, + { + "ids": "13185", + "examine": "A cloth-covered teak altar with a symbol of Saradomin." + }, + { + "ids": "13186", + "examine": "A cloth-covered teak altar with a symbol of Zamorak." + }, + { + "ids": "13187", + "examine": "A cloth-covered teak altar with a symbol of Guthix." + }, + { + "ids": "13188", + "examine": "A mahogany altar with a symbol of Saradomin." + }, + { + "ids": "13189", + "examine": "A mahogany altar with a symbol of Zamorak." + }, + { + "ids": "13190", + "examine": "A mahogany altar with a symbol of Guthix." + }, + { + "ids": "13191", + "examine": "A limestone altar with a symbol of Saradomin." + }, + { + "ids": "13192", + "examine": "A limestone altar with a symbol of Zamorak." + }, + { + "ids": "13193", + "examine": "A limestone altar with a symbol of Guthix." + }, + { + "ids": "13194", + "examine": "A marble altar with a symbol of Saradomin." + }, + { + "ids": "13195", + "examine": "A marble altar with a symbol of Zamorak." + }, + { + "ids": "13196", + "examine": "A marble altar with a symbol of Guthix." + }, + { + "ids": "13197", + "examine": "A gilded marble altar with a symbol of Saradomin." + }, + { + "ids": "13198", + "examine": "A gilded marble altar with a symbol of Zamorak." + }, + { + "ids": "13199", + "examine": "A gilded marble altar with a symbol of Guthix." + }, + { + "ids": "13200,13201,13202,13203,13204,13205,13206,13207,13208,13209,13210,13211,13212,13213", + "examine": "The smoke goes up to the gods." + }, + { + "ids": "13214", + "examine": "They tinkle delightfully." + }, + { + "ids": "13215", + "examine": "Oh, from out the sounding cells, what a gush of euphony voluminously wells!" + }, + { + "ids": "13216", + "examine": "A delightful sound." + }, + { + "ids": "13217", + "examine": "A basic chapel window." + }, + { + "ids": "13218", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13219", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13220", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13221", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13222", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13223", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13224", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13225", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13226", + "examine": "A basic chapel window." + }, + { + "ids": "13227", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13228", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13229", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13230", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13231", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13232", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13233", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13234", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13235", + "examine": "A basic chapel window." + }, + { + "ids": "13236", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13237", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13238", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13239", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13240", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13241", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13242", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13243", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13244", + "examine": "A basic chapel window." + }, + { + "ids": "13245", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13246", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13247", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13248", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13249", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13250", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13251", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13252", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13253", + "examine": "A basic chapel window." + }, + { + "ids": "13254", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13255", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13256", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13257", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13258", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13259", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13260", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13261", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13262", + "examine": "A basic chapel window." + }, + { + "ids": "13263", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13264", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13265", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13266", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13267", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13268", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13269", + "examine": "What nice shapes you can make out of glass!" + }, + { + "ids": "13270", + "examine": "It fills the room with coloured light." + }, + { + "ids": "13271", + "examine": "A saint of Saradomin from the days of old." + }, + { + "ids": "13272", + "examine": "One of Saradomin's holy angels." + }, + { + "ids": "13273", + "examine": "Saradomin, Lord of Light." + }, + { + "ids": "13274", + "examine": "A saint of Guthix from the days of old." + }, + { + "ids": "13275", + "examine": "One of Guthix's nature spirits." + }, + { + "ids": "13276", + "examine": "Guthix, Lord of Balance." + }, + { + "ids": "13277", + "examine": "A mighty saint of Zamorak." + }, + { + "ids": "13278", + "examine": "One of Zamorak's unholy demons." + }, + { + "ids": "13279", + "examine": "Zamorak, Lord of Chaos." + }, + { + "ids": "13280", + "examine": "A small statue of Bob as a kitten." + }, + { + "ids": "13281", + "examine": "OMG it's Bob the Jagex Cat!" + }, + { + "ids": "13282", + "examine": "The great Bob, Lord of Cats." + }, + { + "ids": "13283,13284", + "examine": "Is there treasure inside?" + }, + { + "ids": "13285,13286", + "examine": "Perhaps there is treasure inside!" + }, + { + "ids": "13287,13288", + "examine": "There might possibly be treasure inside!" + }, + { + "ids": "13289,13290", + "examine": "There must surely be treasure in a chest this expensive!" + }, + { + "ids": "13291,13292", + "examine": "Could the magic be guarding some treasure?" + }, + { + "ids": "13293", + "examine": "A basic wooden dining table." + }, + { + "ids": "13294", + "examine": "A basic oak dining table." + }, + { + "ids": "13295", + "examine": "A nicely carved oak dining table." + }, + { + "ids": "13296", + "examine": "A teak dining table." + }, + { + "ids": "13297", + "examine": "A nicely carved teak dining table." + }, + { + "ids": "13298", + "examine": "An expensive mahogany table." + }, + { + "ids": "13299", + "examine": "Marble and mahogany, ooh." + }, + { + "ids": "13300", + "examine": "A basic wooden dining bench." + }, + { + "ids": "13301", + "examine": "A basic oak dining bench." + }, + { + "ids": "13302", + "examine": "A nice oak dining bench." + }, + { + "ids": "13303", + "examine": "A teak dining bench." + }, + { + "ids": "13304", + "examine": "A nice teak dining bench." + }, + { + "ids": "13305", + "examine": "A mahogany dining bench." + }, + { + "ids": "13306", + "examine": "A very expensive dining bench." + }, + { + "ids": "13307,13308,13309", + "examine": "Can summon your servant." + }, + { + "ids": "13310", + "examine": "A rather macabre decoration." + }, + { + "ids": "13311", + "examine": "It doesn't go anywhere, it's just for show." + }, + { + "ids": "13312", + "examine": "Nothing makes a dungeon look ominous like some dried blood." + }, + { + "ids": "13313,13314,13315", + "examine": "Sturdy oak bars to keep prisoners in." + }, + { + "ids": "13316,13317,13318", + "examine": "Oak and steel bars to keep prisoners in." + }, + { + "ids": "13319,13320,13321", + "examine": "Steel bars to keep prisoners in." + }, + { + "ids": "13322,13323,13324", + "examine": "Steel bars with spikes!" + }, + { + "ids": "13325,13326,13327", + "examine": "A cage of bones. How delightfully macabre." + }, + { + "ids": "13328", + "examine": "An oak ladder." + }, + { + "ids": "13329", + "examine": "A teak ladder." + }, + { + "ids": "13330", + "examine": "A mahogany ladder." + }, + { + "ids": "13331,13332,13333", + "examine": "Yuck!" + }, + { + "ids": "13334,13335,13336", + "examine": "Ouch!" + }, + { + "ids": "13337", + "examine": "Not very pleasant" + }, + { + "ids": "13338,13339,13340", + "examine": "Invisible?" + }, + { + "ids": "13341,13342,13343", + "examine": "Even a dungeon needs light!" + }, + { + "ids": "13344,13345", + "examine": "A sturdy oak door." + }, + { + "ids": "13346,13347", + "examine": "A formidable steel door." + }, + { + "ids": "13348,13349", + "examine": "Could anyone get through a solid marble door?" + }, + { + "ids": "13350,13351", + "examine": "A sturdy oak door." + }, + { + "ids": "13352,13353", + "examine": "A formidable steel door." + }, + { + "ids": "13354,13355", + "examine": "Could anyone get through a solid marble door?" + }, + { + "ids": "13356,13357,13358,13359,13360,13361,13362,13363,13364,13365", + "examine": "Watch out!" + }, + { + "ids": "13366", + "examine": "A pet skeleton!" + }, + { + "ids": "13367", + "examine": "Beware of the dog!" + }, + { + "ids": "13368", + "examine": "He doesn't look very welcoming." + }, + { + "ids": "13369", + "examine": "A pet Troll!" + }, + { + "ids": "13370", + "examine": "No spider could get that big! It's unrealistic!" + }, + { + "ids": "13371", + "examine": "Good doggie..." + }, + { + "ids": "13372", + "examine": "Young but still dangerous." + }, + { + "ids": "13373", + "examine": "He's full of pent-up aggression." + }, + { + "ids": "13374", + "examine": "I don't think insect repellent will work..." + }, + { + "ids": "13375", + "examine": "Its scales are made of steel." + }, + { + "ids": "13376", + "examine": "A darkened horror from the ocean depths..." + }, + { + "ids": "13377", + "examine": "I don't like the look of those spines..." + }, + { + "ids": "13378", + "examine": "A demon." + }, + { + "ids": "13379,13380", + "examine": "Rub the mushroom's head and see what pops out!" + }, + { + "ids": "13381", + "examine": "A place to hang your boxing gloves." + }, + { + "ids": "13382", + "examine": "Some equipment for practicing combat." + }, + { + "ids": "13383", + "examine": "Lots of equipment for practicing combat." + }, + { + "ids": "13384", + "examine": "Is there a prize?" + }, + { + "ids": "13385", + "examine": "Is there a prize inside?" + }, + { + "ids": "13386", + "examine": "Is there a prize?" + }, + { + "ids": "13387", + "examine": "Is there a prize inside?" + }, + { + "ids": "13388", + "examine": "Is there a prize?" + }, + { + "ids": "13389", + "examine": "Is there a prize inside?" + }, + { + "ids": "13390,13391", + "examine": "A private jester." + }, + { + "ids": "13392,13393,13394", + "examine": "See how much damage you can do to it!" + }, + { + "ids": "13395,13396,13397", + "examine": "You can practice your magic here." + }, + { + "ids": "13398", + "examine": "You can try to get a hoop over this." + }, + { + "ids": "13399", + "examine": "Someone hooped it!" + }, + { + "ids": "13400,13401", + "examine": "More humane than using an actual bull's eye." + }, + { + "ids": "13402,13403", + "examine": "Can you hit it?" + }, + { + "ids": "13404", + "examine": "A letter-guessing game with a subtext of death." + }, + { + "ids": "13405", + "examine": "Use this to leave the house." + }, + { + "ids": "13406", + "examine": "Rocky!" + }, + { + "ids": "13407", + "examine": "A home for tiny fish and frogs." + }, + { + "ids": "13408", + "examine": "What a naughty little imp!" + }, + { + "ids": "13409,13410", + "examine": "What horrors lurk below?" + }, + { + "ids": "13411,13412", + "examine": "One of the most common trees in RuneScape." + }, + { + "ids": "13413", + "examine": "A beautiful oak tree." + }, + { + "ids": "13414,13415,13416", + "examine": "A lovely addition to the garden." + }, + { + "ids": "13417", + "examine": "The tree shimmers with a magical force." + }, + { + "ids": "13418,13419,13420,13421,13422,13423", + "examine": "A lovely addition to the garden." + }, + { + "ids": "13424", + "examine": "A fully grown Willow tree." + }, + { + "ids": "13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436", + "examine": "A plant." + }, + { + "ids": "13437", + "examine": "A little orange flower." + }, + { + "ids": "13438", + "examine": "Lonely as a cloud." + }, + { + "ids": "13439", + "examine": "The bluebells are coming!" + }, + { + "ids": "13440", + "examine": "A little orange flower." + }, + { + "ids": "13441", + "examine": "Lonely as a cloud." + }, + { + "ids": "13442", + "examine": "The bluebells are coming!" + }, + { + "ids": "13443", + "examine": "A great big sunny flower." + }, + { + "ids": "13444", + "examine": "Lovely flowers." + }, + { + "ids": "13445", + "examine": "They smell lovely." + }, + { + "ids": "13446", + "examine": "Great big sunny flowers." + }, + { + "ids": "13447", + "examine": "Lovely flowers." + }, + { + "ids": "13448", + "examine": "They smell lovely." + }, + { + "ids": "13449", + "examine": "They mark a square." + }, + { + "ids": "13450", + "examine": "Would probably not stop a charging rhinoceros." + }, + { + "ids": "13451", + "examine": "Very rural." + }, + { + "ids": "13452", + "examine": "A little bleak." + }, + { + "ids": "13453", + "examine": "Marks the boundary of the garden." + }, + { + "ids": "13454", + "examine": "Just like in Varrock palace!" + }, + { + "ids": "13455", + "examine": "Very posh!" + }, + { + "ids": "13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476", + "examine": "Like a living wall." + }, + { + "ids": "13477", + "examine": "Run for it! It's a gazebo!" + }, + { + "ids": "13478", + "examine": "Like a tiny private waterfall." + }, + { + "ids": "13479", + "examine": "A sculpture of flowing water." + }, + { + "ids": "13480", + "examine": "Two little fishes forever spew water into the pond." + }, + { + "ids": "13481,13482,13483,13484,13485", + "examine": "A trophy of a mighty slayer!" + }, + { + "ids": "13486", + "examine": "A trophy of a mighty dragon-slayer!" + }, + { + "ids": "13487", + "examine": "A trophy of a mighty kalphite slayer!" + }, + { + "ids": "13488,13489,13490", + "examine": "A trophy of a master fisher." + }, + { + "ids": "13491,13492", + "examine": "The work of a master smith." + }, + { + "ids": "13493", + "examine": "Only the finest smiths can work runite." + }, + { + "ids": "13494,13495,13496", + "examine": "Armour won by a great Castle Wars player." + }, + { + "ids": "13497", + "examine": "I can climb these stairs." + }, + { + "ids": "13498", + "examine": "They go down." + }, + { + "ids": "13499", + "examine": "I can climb these stairs." + }, + { + "ids": "13500", + "examine": "They go down." + }, + { + "ids": "13501", + "examine": "I can climb these stairs." + }, + { + "ids": "13502", + "examine": "They go down." + }, + { + "ids": "13503", + "examine": "I can climb up or go down these stairs." + }, + { + "ids": "13504", + "examine": "I can climb down these stairs." + }, + { + "ids": "13505", + "examine": "I can climb up or go down these stairs." + }, + { + "ids": "13506", + "examine": "I can climb down these stairs." + }, + { + "ids": "13507", + "examine": "Elemental runes made by a skilled runecrafter." + }, + { + "ids": "13508", + "examine": "Body, Cosmic, Chaos and Nature runes made by a skilled runecrafter." + }, + { + "ids": "13509", + "examine": "Law, Blood, Soul and Death runes made by a great runecrafter." + }, + { + "ids": "13510", + "examine": "A portrait of King Arthur." + }, + { + "ids": "13511", + "examine": "A portrait of Elena." + }, + { + "ids": "13512", + "examine": "A painting of the statue of King Alvis of Keldagrim." + }, + { + "ids": "13513", + "examine": "A portrait of Prince Brand and Princess Astrid of Miscellania." + }, + { + "ids": "13514", + "examine": "The deserts of Kharidian." + }, + { + "ids": "13515", + "examine": "The exotic land of the Elves." + }, + { + "ids": "13516", + "examine": "The tropical coast of Karamja." + }, + { + "ids": "13517", + "examine": "Oxtable's famous painting of the Lumbridge water mill." + }, + { + "ids": "13518", + "examine": "A painting of the spooky forests of Morytania." + }, + { + "ids": "13519", + "examine": "The great demon-slaying sword that killed Delrith." + }, + { + "ids": "13520", + "examine": "The great demon-slaying sword that killed Delrith and Agrith Naar." + }, + { + "ids": "13521", + "examine": "The magical sword of King Arthur." + }, + { + "ids": "13522", + "examine": "This shield protected a hero from the flames of the dragon Elvarg." + }, + { + "ids": "13523", + "examine": "An Amulet of Glory, symbol of a member of the Heroes Guild." + }, + { + "ids": "13524", + "examine": "The pleated white cape of a member of the Legends Guild." + }, + { + "ids": "13525", + "examine": "A map of Misthalin and Asgarnia." + }, + { + "ids": "13526", + "examine": "A map of RuneScape." + }, + { + "ids": "13527", + "examine": "A map of RuneScape including major cave systems." + }, + { + "ids": "13528", + "examine": "A basic cooking fire." + }, + { + "ids": "13529", + "examine": "A cooking fire." + }, + { + "ids": "13530", + "examine": "A cooking fire with a kettle." + }, + { + "ids": "13531", + "examine": "A cooking fire with a pot." + }, + { + "ids": "13532", + "examine": "The pot and kettle get along fine." + }, + { + "ids": "13533,13534,13535", + "examine": "You can bake bread here." + }, + { + "ids": "13536,13537,13538", + "examine": "You can cook pizza here." + }, + { + "ids": "13539,13540,13541,13542,13543,13544", + "examine": "You can cook here." + }, + { + "ids": "13545,13546,13547,13548,13549,13550,13551", + "examine": "Shelves full of kitchen utensils." + }, + { + "ids": "13552,13553,13554,13555,13556,13557,13558", + "examine": "Shelves full of plates and tea cups." + }, + { + "ids": "13559,13560,13561,13562,13563,13564", + "examine": "Running water in your own home! Luxury!" + }, + { + "ids": "13565", + "examine": "A wooden larder to keep food cool." + }, + { + "ids": "13566", + "examine": "An oak larder to keep food cool." + }, + { + "ids": "13567", + "examine": "A nicely carved oak larder to keep food cool." + }, + { + "ids": "13568,13569", + "examine": "It's got beer in it." + }, + { + "ids": "13570", + "examine": "An oak barrel of Asgarnian ale." + }, + { + "ids": "13571", + "examine": "An oak barrel of Greenman's ale." + }, + { + "ids": "13572", + "examine": "An oak barrel of Dragon Bitter." + }, + { + "ids": "13573", + "examine": "An oak barrel of Chef's Delight." + }, + { + "ids": "13574", + "examine": "A place for your pet to sleep." + }, + { + "ids": "13575", + "examine": "Your pet would love to sleep here." + }, + { + "ids": "13576", + "examine": "A luxurious sleeping place for your pet." + }, + { + "ids": "13577", + "examine": "A basic wooden dining table." + }, + { + "ids": "13578", + "examine": "A basic oak dining table." + }, + { + "ids": "13579", + "examine": "A nice teak dining table." + }, + { + "ids": "13580", + "examine": "A place for your pet to sleep." + }, + { + "ids": "13581", + "examine": "It's not the best chair but you think it would take your weight." + }, + { + "ids": "13582", + "examine": "The ideal thing to sit on." + }, + { + "ids": "13583,13584,13585,13586,13587", + "examine": "A comfortable seat." + }, + { + "ids": "13588,13589,13590", + "examine": "It's an ugly rug, but better than a bare floor." + }, + { + "ids": "13591,13592,13593", + "examine": "The handkerchief of giants!" + }, + { + "ids": "13594,13595,13596", + "examine": "An opulent rug woven with gold leaf." + }, + { + "ids": "13597,13598,13599", + "examine": "A good source of books!" + }, + { + "ids": "13600,13601,13602", + "examine": "A good source of scrolls!" + }, + { + "ids": "13603,13604,13605", + "examine": "The curtain is open." + }, + { + "ids": "13606,13607", + "examine": "???" + }, + { + "ids": "13608", + "examine": "Your house logo in mahogany." + }, + { + "ids": "13609", + "examine": "You can light a fire here." + }, + { + "ids": "13610", + "examine": "A fire burns cosily in the grate." + }, + { + "ids": "13611", + "examine": "You can light a fire here." + }, + { + "ids": "13612", + "examine": "A fire burns cosily in the grate." + }, + { + "ids": "13613", + "examine": "You can light a fire here." + }, + { + "ids": "13614", + "examine": "A fire burns cosily in the grate." + }, + { + "ids": "13615", + "examine": "A gateway to Varrock" + }, + { + "ids": "13616", + "examine": "A gateway to Lumbridge" + }, + { + "ids": "13617", + "examine": "A gateway to Falador" + }, + { + "ids": "13618", + "examine": "A gateway to Camelot" + }, + { + "ids": "13619", + "examine": "A gateway to Ardougne" + }, + { + "ids": "13620", + "examine": "A gateway to the Yanille watchtower" + }, + { + "ids": "13621", + "examine": "A gateway to Trollheim" + }, + { + "ids": "13622", + "examine": "A gateway to Varrock" + }, + { + "ids": "13623", + "examine": "A gateway to Lumbridge" + }, + { + "ids": "13624", + "examine": "A gateway to Falador" + }, + { + "ids": "13625", + "examine": "A gateway to Camelot" + }, + { + "ids": "13626", + "examine": "A gateway to Ardougne" + }, + { + "ids": "13627", + "examine": "A gateway to the Yanille watchtower" + }, + { + "ids": "13628", + "examine": "A gateway to Trollheim" + }, + { + "ids": "13629", + "examine": "A gateway to Varrock" + }, + { + "ids": "13630", + "examine": "A gateway to Lumbridge" + }, + { + "ids": "13631", + "examine": "A gateway to Falador" + }, + { + "ids": "13632", + "examine": "A gateway to Camelot" + }, + { + "ids": "13633", + "examine": "A gateway to Ardougne" + }, + { + "ids": "13634", + "examine": "A gateway to the Yanille watchtower" + }, + { + "ids": "13635", + "examine": "A gateway to Trollheim" + }, + { + "ids": "13636", + "examine": "An un-directed teak portal frame." + }, + { + "ids": "13637", + "examine": "An un-directed mahogany portal frame." + }, + { + "ids": "13638", + "examine": "An un-directed marble portal frame." + }, + { + "ids": "13639", + "examine": "It harnesses the power of something or other!" + }, + { + "ids": "13640,13641", + "examine": "It controls the portals." + }, + { + "ids": "13642,13643,13644,13645,13646,13647,13648", + "examine": "A book full of arcane knowledge." + }, + { + "ids": "13649,13650,13651,13652,13653", + "examine": "A wooden planet of your very own." + }, + { + "ids": "13654,13655", + "examine": "A wooden solar system of your very own." + }, + { + "ids": "13656,13657,13658", + "examine": "Used for observing heavenly bodies." + }, + { + "ids": "13659,13660,13661", + "examine": "Use an elemental staff on it." + }, + { + "ids": "13662", + "examine": "If there's a recipe for the philosopher's stone there, you can't see it." + }, + { + "ids": "13663", + "examine": "If you want to look at the stars during the daytime, you can see them here!" + }, + { + "ids": "13664", + "examine": "A spotter's guide to demons." + }, + { + "ids": "13665,13666,13667,13668,13669,13670,13671", + "examine": "Sit here and rule all you survey." + }, + { + "ids": "13672,13673,13674", + "examine": "Pull this to activate your machinery of doom!" + }, + { + "ids": "13675", + "examine": "Go through this oak trapdoor to see the pit below your throne room." + }, + { + "ids": "13676", + "examine": "Go through this teak trapdoor to see the pit below your throne room." + }, + { + "ids": "13677", + "examine": "Go through this mahogany trapdoor to see the pit below your throne room." + }, + { + "ids": "13678", + "examine": "Go through this oak trapdoor to see the pit below your throne room." + }, + { + "ids": "13679", + "examine": "Go through this teak trapdoor to see the pit below your throne room." + }, + { + "ids": "13680", + "examine": "Go through this mahogany trapdoor to see the pit below your throne room." + }, + { + "ids": "13681", + "examine": "Keeps your victims in place." + }, + { + "ids": "13682,13683", + "examine": "Keeps your victims trapped." + }, + { + "ids": "13684,13685,13686,13687,13688,13689", + "examine": "What could happen on this spot?" + }, + { + "ids": "13690", + "examine": "An elengant cloth hanging." + }, + { + "ids": "13691", + "examine": "An opulent gold-and-mahogany decoration." + }, + { + "ids": "13692", + "examine": "A magnificent gold-and-marble decoration." + }, + { + "ids": "13693", + "examine": "A splendid stained-glass decoration." + }, + { + "ids": "13694", + "examine": "A nice teak ding bench." + }, + { + "ids": "13695", + "examine": "A mahogany bench." + }, + { + "ids": "13696", + "examine": "A very expensive bench." + }, + { + "ids": "13697", + "examine": "An eye-wrenching nexus of utter negation!" + }, + { + "ids": "13698", + "examine": "An important looking chair." + }, + { + "ids": "13699", + "examine": "Hammer, chisel, saw and shears." + }, + { + "ids": "13700", + "examine": "Bucket, spade, tinderbox and knife." + }, + { + "ids": "13701", + "examine": "Needle, apron and glassblowing pipe." + }, + { + "ids": "13702", + "examine": "A selection of jewellery moulds." + }, + { + "ids": "13703", + "examine": "Farming tools." + }, + { + "ids": "13704,13705,13706,13707,13708", + "examine": "You can make furniture here." + }, + { + "ids": "13709,13710,13711,13712", + "examine": "You can do delicate crafting here." + }, + { + "ids": "13713", + "examine": "You can repair broken staffs and arrows here." + }, + { + "ids": "13714", + "examine": "You can sharpen rusty swords here." + }, + { + "ids": "13715", + "examine": "You can repair armour here." + }, + { + "ids": "13716", + "examine": "You can add a plume to your helmet here." + }, + { + "ids": "13717", + "examine": "You can paint your logo onto your heraldic shield here." + }, + { + "ids": "13718", + "examine": "You can make a banner with your logo on here." + }, + { + "ids": "13719", + "examine": "A wooden stool." + }, + { + "ids": "13720", + "examine": "An oak stool." + }, + { + "ids": "13721,13722,13723,13724,13725", + "examine": "There's nothing there" + }, + { + "ids": "13726,13727,13728,13729,13730,13731,13732,13733", + "examine": "A private jester." + }, + { + "ids": "13734", + "examine": "A shield with the symbol of Arrav." + }, + { + "ids": "13735", + "examine": "A shield with the symbol of Asgarnia." + }, + { + "ids": "13736", + "examine": "A shield with the symbol of the Dorgeshuun." + }, + { + "ids": "13737", + "examine": "A shield with a dragon on it." + }, + { + "ids": "13738", + "examine": "A shield with a fairy on it." + }, + { + "ids": "13739", + "examine": "A shield with the symbol of Guthix." + }, + { + "ids": "13740", + "examine": "A shield with the symbol of the HAM cult." + }, + { + "ids": "13741", + "examine": "A shield with a picture of a mythical 'horse'." + }, + { + "ids": "13742", + "examine": "A shield with a picture of a Jungle Ogre." + }, + { + "ids": "13743", + "examine": "A shield with the symbol of Kandarin." + }, + { + "ids": "13744", + "examine": "A shield with the symbol of Misthalin." + }, + { + "ids": "13745", + "examine": "A shield with a picture of a money bag." + }, + { + "ids": "13746", + "examine": "A shield with the symbol of Saradomin." + }, + { + "ids": "13747", + "examine": "A shield with a picture of a skull." + }, + { + "ids": "13748", + "examine": "A shield with the symbol of Varrock." + }, + { + "ids": "13749", + "examine": "A shield with the symbol of Zamorak." + }, + { + "ids": "13750", + "examine": "A shield with the symbol of Arrav." + }, + { + "ids": "13751", + "examine": "A shield with the symbol of Asgarnia." + }, + { + "ids": "13752", + "examine": "A shield with the symbol of the Dorgeshuun." + }, + { + "ids": "13753", + "examine": "A shield with a picture of a dragon." + }, + { + "ids": "13754", + "examine": "A shield with a picture of a fairy." + }, + { + "ids": "13755", + "examine": "A shield with the symbol of Guthix." + }, + { + "ids": "13756", + "examine": "A shield with the symbol of the HAM cult." + }, + { + "ids": "13757", + "examine": "A shield with a picture of the mythical 'horse'." + }, + { + "ids": "13758", + "examine": "A shield with a picture of a Jungle Ogre." + }, + { + "ids": "13759", + "examine": "A shield with the symbol of Kandarin." + }, + { + "ids": "13760", + "examine": "A shield with the symbol of Misthalin." + }, + { + "ids": "13761", + "examine": "A shield with a picture of a money bag." + }, + { + "ids": "13762", + "examine": "A shield with the symbol of Saradomin." + }, + { + "ids": "13763", + "examine": "A shield with a picture of a skull." + }, + { + "ids": "13764", + "examine": "A shield with the symbol of Varrock." + }, + { + "ids": "13765", + "examine": "A shield with the symbol of Zamorak." + }, + { + "ids": "13766", + "examine": "A shield with the symbol of Arrav." + }, + { + "ids": "13767", + "examine": "A shield with the symbol of Asgarnia." + }, + { + "ids": "13768", + "examine": "A shield with the symbol of the Dorgeshuun/" + }, + { + "ids": "13769", + "examine": "A shield with a picture of a dragon." + }, + { + "ids": "13770", + "examine": "A shield with a picture of a fairy." + }, + { + "ids": "13771", + "examine": "A shield with the symbol of Guthix." + }, + { + "ids": "13772", + "examine": "A shield with the symbol of the HAM cult." + }, + { + "ids": "13773", + "examine": "A shield with a picture of the mythical 'horse'." + }, + { + "ids": "13774", + "examine": "A shield with a picture of a Jungle Ogre." + }, + { + "ids": "13775", + "examine": "A shield with the symbol of Kandarin." + }, + { + "ids": "13776", + "examine": "A shield with the symbol of Misthalin." + }, + { + "ids": "13777", + "examine": "A shield with a picture of a money bag." + }, + { + "ids": "13778", + "examine": "A shield with the symbol of Saradomin." + }, + { + "ids": "13779", + "examine": "A shield with a picture of a skull." + }, + { + "ids": "13780", + "examine": "A shield with the symbol of Varrock." + }, + { + "ids": "13781", + "examine": "A shield with the symbol of Zamorak." + }, + { + "ids": "13782", + "examine": "The symbol of Arrav." + }, + { + "ids": "13783", + "examine": "The symbol of Asgarnia." + }, + { + "ids": "13784", + "examine": "The symbol of the Dorgeshuun." + }, + { + "ids": "13785", + "examine": "A picture of a dragon." + }, + { + "ids": "13786", + "examine": "A picture of a fairy." + }, + { + "ids": "13787", + "examine": "The symbol of Guthix." + }, + { + "ids": "13788", + "examine": "The symbol of the HAM cult." + }, + { + "ids": "13789", + "examine": "A picture of the mythical 'horse'." + }, + { + "ids": "13790", + "examine": "A picture of a Jungle Ogre." + }, + { + "ids": "13791", + "examine": "The symbol of Kandarin." + }, + { + "ids": "13792", + "examine": "The symbol of Misthalin." + }, + { + "ids": "13793", + "examine": "A picture of a bag of money." + }, + { + "ids": "13794", + "examine": "The symbol of Saradomin." + }, + { + "ids": "13795", + "examine": "A picture of a skull." + }, + { + "ids": "13796", + "examine": "The symbol of Varrock." + }, + { + "ids": "13797", + "examine": "The symbol of Zamorak." + }, + { + "ids": "13798", + "examine": "The symbol of Arrav." + }, + { + "ids": "13799", + "examine": "The symbol of Asgarnia." + }, + { + "ids": "13800", + "examine": "The symbol of the Dorgeshuun." + }, + { + "ids": "13801", + "examine": "A picture of a dragon." + }, + { + "ids": "13802", + "examine": "A picture of a fairy." + }, + { + "ids": "13803", + "examine": "The symbol of Guthix." + }, + { + "ids": "13804", + "examine": "The symbol of the HAM cult." + }, + { + "ids": "13805", + "examine": "A picture of the mythical 'horse'." + }, + { + "ids": "13806", + "examine": "A picture of a Jungle Ogre." + }, + { + "ids": "13807", + "examine": "The symbol of Kandarin." + }, + { + "ids": "13808", + "examine": "The symbol of Misthalin." + }, + { + "ids": "13809", + "examine": "A picture of a money bag." + }, + { + "ids": "13810", + "examine": "The symbol of Saradomin." + }, + { + "ids": "13811", + "examine": "A picture of a skull." + }, + { + "ids": "13812", + "examine": "The symbol of Varrock." + }, + { + "ids": "13813", + "examine": "The symbol of Zamorak." + }, + { + "ids": "13814", + "examine": "The symbol of Arrav." + }, + { + "ids": "13815", + "examine": "The symbol of Asgarnia." + }, + { + "ids": "13816", + "examine": "The symbol of the Dorgeshuun." + }, + { + "ids": "13817", + "examine": "A picture of a dragon." + }, + { + "ids": "13818", + "examine": "A picture of a fairy." + }, + { + "ids": "13819", + "examine": "The symbol of Guthix." + }, + { + "ids": "13820", + "examine": "The symbol of the HAM cult." + }, + { + "ids": "13821", + "examine": "A picture of the mythical 'horse'." + }, + { + "ids": "13822", + "examine": "A picture of a Jungle Ogre." + }, + { + "ids": "13823", + "examine": "The symbol of Kandarin." + }, + { + "ids": "13824", + "examine": "The symbol of Misthalin." + }, + { + "ids": "13825", + "examine": "A picture of a money bag." + }, + { + "ids": "13826", + "examine": "The symbol of Saradomin." + }, + { + "ids": "13827", + "examine": "A picture of a skull." + }, + { + "ids": "13828", + "examine": "The symbol of Varrock." + }, + { + "ids": "13829", + "examine": "The symbol of Zamorak." + }, + { + "ids": "13830", + "examine": "This should have resolved!" + }, + { + "ids": "13831,13832", + "examine": "A path leading out of this swampy dead end." + }, + { + "ids": "13833", + "examine": "A path leading out of Mort Myre, you'll be running away if you go down here." + }, + { + "ids": "13834", + "examine": "I could mend this if I had some wood..." + }, + { + "ids": "13835", + "examine": "This bridge is partially broken." + }, + { + "ids": "13836", + "examine": "This bridge is slightly broken." + }, + { + "ids": "13837", + "examine": "This bridge can be traversed safely." + }, + { + "ids": "13838,13839", + "examine": "Gloopy, sticky, muddy bog..." + }, + { + "ids": "13840", + "examine": "A bush made up of long slender branches." + }, + { + "ids": "13841", + "examine": "I hope it doesn't sink." + }, + { + "ids": "13842", + "examine": "Ripples." + }, + { + "ids": "13843", + "examine": "Big swamp tree base." + }, + { + "ids": "13844", + "examine": "Big swamp tree top." + }, + { + "ids": "13845", + "examine": "Big swamp tree branch." + }, + { + "ids": "13846", + "examine": "A long vine hanging from a branch." + }, + { + "ids": "13847", + "examine": "Small swamp tree with vines." + }, + { + "ids": "13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863", + "examine": "Small swamp tree." + }, + { + "ids": "13864,13865", + "examine": "It's our transport across the swamp." + }, + { + "ids": "13866,13867,13868,13869,13870", + "examine": "A path leading out of this swampy dead end." + }, + { + "ids": "13871", + "examine": "A path leading out of this swampy dead end, you'll be running away if you go down here." + }, + { + "ids": "13872", + "examine": "An old backpack, it seems to be falling apart." + }, + { + "ids": "13873,13874,13875,13876,13877", + "examine": "There's something written here..." + }, + { + "ids": "13878", + "examine": "I think it's the way out." + }, + { + "ids": "13879,13880", + "examine": "Get me out of here!" + }, + { + "ids": "13881", + "examine": "Very hot!" + }, + { + "ids": "13882,13883,13884,13885,13886,13887,13888,13889,13890", + "examine": "To the next area!" + }, + { + "ids": "13891,13892,13893,13894,13895,13896,13897,13898", + "examine": "A creepy hole." + }, + { + "ids": "13899", + "examine": "There's no way I'm going in there!" + }, + { + "ids": "13900", + "examine": "Doesn't look so scary now." + }, + { + "ids": "13901,13902,13903", + "examine": "My way back to the surface." + }, + { + "ids": "13904,13905,13906,13907,13908,13909,13910,13911,13912", + "examine": "The exit to the surface." + }, + { + "ids": "13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924", + "examine": "Where does it lead?" + }, + { + "ids": "13925,13926,13927,13928,13929,13930,13931", + "examine": "What's that?" + }, + { + "ids": "13932", + "examine": "I think it's the way out." + }, + { + "ids": "13933,13934,13935,13936,13937", + "examine": "I think it's the forward." + }, + { + "ids": "13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966", + "examine": "Does that really exist?" + }, + { + "ids": "13967,13968,13969", + "examine": "Should I go down there?" + }, + { + "ids": "13970", + "examine": "I can use that rope now." + }, + { + "ids": "13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993", + "examine": "Should I go down there?" + }, + { + "ids": "13994,13995,13996,13997,13998", + "examine": "Oooo, sharp, pointy things!" + }, + { + "ids": "13999,14000,14001", + "examine": "This will take me back to the surface." + }, + { + "ids": "14002", + "examine": "A sign warning of danger." + }, + { + "ids": "14003", + "examine": "Why do I never take time to look at the grass?" + } +] diff --git a/Server/data/configs/ranged_weapon_configs.json b/Server/data/configs/ranged_weapon_configs.json new file mode 100644 index 000000000..01c823435 --- /dev/null +++ b/Server/data/configs/ranged_weapon_configs.json @@ -0,0 +1,1568 @@ +[ + { + "itemId": "732", + "name": "Holy water", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "385", + "drop_ammo": "true", + "ammunition": "732" + }, + { + "itemId": "767", + "name": "Phoenix crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,13280" + }, + { + "itemId": "800", + "name": "Bronze thrownaxe", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "800" + }, + { + "itemId": "801", + "name": "Iron thrownaxe", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "801" + }, + { + "itemId": "802", + "name": "Steel thrownaxe", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "802" + }, + { + "itemId": "803", + "name": "Mithril thrownaxe", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "803" + }, + { + "itemId": "804", + "name": "Adamant thrownaxe", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "804" + }, + { + "itemId": "805", + "name": "Rune thrownaxe", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "805" + }, + { + "itemId": "806", + "name": "Bronze dart", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "806" + }, + { + "itemId": "807", + "name": "Iron dart", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "807" + }, + { + "itemId": "808", + "name": "Steel dart", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "808" + }, + { + "itemId": "809", + "name": "Mithril dart", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "809" + }, + { + "itemId": "810", + "name": "Adamant dart", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "810" + }, + { + "itemId": "811", + "name": "Rune dart", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "811" + }, + { + "itemId": "812", + "name": "Bronze dart(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "812" + }, + { + "itemId": "813", + "name": "Iron dart(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "813" + }, + { + "itemId": "814", + "name": "Steel dart(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "814" + }, + { + "itemId": "815", + "name": "Mithril dart(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "815" + }, + { + "itemId": "816", + "name": "Adamant dart(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "816" + }, + { + "itemId": "817", + "name": "Rune dart(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "817" + }, + { + "itemId": "825", + "name": "Bronze javelin", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "825" + }, + { + "itemId": "826", + "name": "Iron javelin", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "826" + }, + { + "itemId": "827", + "name": "Steel javelin", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "827" + }, + { + "itemId": "828", + "name": "Mithril javelin", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "828" + }, + { + "itemId": "829", + "name": "Adamant javelin", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "829" + }, + { + "itemId": "830", + "name": "Rune javelin", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "830" + }, + { + "itemId": "831", + "name": "Bronze javelin(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "831" + }, + { + "itemId": "832", + "name": "Iron javelin(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "832" + }, + { + "itemId": "833", + "name": "Steel javelin(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "833" + }, + { + "itemId": "834", + "name": "Mithril javelin(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "834" + }, + { + "itemId": "835", + "name": "Adamant javelin(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "835" + }, + { + "itemId": "836", + "name": "Rune javelin(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "836" + }, + { + "itemId": "837", + "name": "Crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,13280" + }, + { + "itemId": "839", + "name": "Longbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532" + }, + { + "itemId": "841", + "name": "Shortbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532" + }, + { + "itemId": "843", + "name": "Oak shortbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534" + }, + { + "itemId": "845", + "name": "Oak longbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534" + }, + { + "itemId": "847", + "name": "Willow longbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536" + }, + { + "itemId": "849", + "name": "Willow shortbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536" + }, + { + "itemId": "851", + "name": "Maple longbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538" + }, + { + "itemId": "853", + "name": "Maple shortbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538" + }, + { + "itemId": "855", + "name": "Yew longbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78" + }, + { + "itemId": "857", + "name": "Yew shortbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78" + }, + { + "itemId": "859", + "name": "Magic longbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78,4160" + }, + { + "itemId": "861", + "name": "Magic shortbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78,4160" + }, + { + "itemId": "863", + "name": "Iron knife", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "863" + }, + { + "itemId": "864", + "name": "Bronze knife", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "864" + }, + { + "itemId": "865", + "name": "Steel knife", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "865" + }, + { + "itemId": "866", + "name": "Mithril knife", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "866" + }, + { + "itemId": "867", + "name": "Adamant knife", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "867" + }, + { + "itemId": "868", + "name": "Rune knife", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "868" + }, + { + "itemId": "869", + "name": "Black knife", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "869" + }, + { + "itemId": "870", + "name": "Bronze knife(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "870" + }, + { + "itemId": "871", + "name": "Iron knife(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "871" + }, + { + "itemId": "872", + "name": "Steel knife(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "872" + }, + { + "itemId": "873", + "name": "Mithril knife(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "873" + }, + { + "itemId": "874", + "name": "Black knife(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "874" + }, + { + "itemId": "875", + "name": "Adamant knife(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "875" + }, + { + "itemId": "876", + "name": "Rune knife(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "876" + }, + { + "itemId": "2883", + "name": "Ogre bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "2866" + }, + { + "itemId": "3093", + "name": "Black dart", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "3093" + }, + { + "itemId": "3094", + "name": "Black dart(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "3094" + }, + { + "itemId": "4212", + "name": "New crystal bow", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4212" + }, + { + "itemId": "4214", + "name": "Crystal bow full", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4214" + }, + { + "itemId": "4215", + "name": "Crystal bow 9/10", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4215" + }, + { + "itemId": "4216", + "name": "Crystal bow 8/10", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4216" + }, + { + "itemId": "4217", + "name": "Crystal bow 7/10", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4217" + }, + { + "itemId": "4218", + "name": "Crystal bow 6/10", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4218" + }, + { + "itemId": "4219", + "name": "Crystal bow 5/10", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4219" + }, + { + "itemId": "4220", + "name": "Crystal bow 4/10", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4220" + }, + { + "itemId": "4221", + "name": "Crystal bow 3/10", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4221" + }, + { + "itemId": "4222", + "name": "Crystal bow 2/10", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4222" + }, + { + "itemId": "4223", + "name": "Crystal bow 1/10", + "ammo_slot": "3", + "weapon_type": "4", + "animation": "426", + "drop_ammo": "0", + "ammunition": "4223" + }, + { + "itemId": "4734", + "name": "Karil\\'s crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "2075", + "drop_ammo": "0", + "ammunition": "4740" + }, + { + "itemId": "4827", + "name": "Comp ogre bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "2866,4773,4778,4783,4788,4793,4798,4803" + }, + { + "itemId": "4934", + "name": "Karil\\'s x-bow 100", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "2075", + "drop_ammo": "0", + "ammunition": "4740" + }, + { + "itemId": "4935", + "name": "Karil\\'s x-bow 75", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "2075", + "drop_ammo": "0", + "ammunition": "4740" + }, + { + "itemId": "4936", + "name": "Karil\\'s x-bow 50", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "2075", + "drop_ammo": "0", + "ammunition": "4740" + }, + { + "itemId": "4937", + "name": "Karil\\'s x-bow 25", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "2075", + "drop_ammo": "0", + "ammunition": "4740" + }, + { + "itemId": "5628", + "name": "Bronze dart(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5628" + }, + { + "itemId": "5629", + "name": "Iron dart(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5629" + }, + { + "itemId": "5630", + "name": "Steel dart(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5630" + }, + { + "itemId": "5631", + "name": "Black dart(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5631" + }, + { + "itemId": "5632", + "name": "Mithril dart(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5632" + }, + { + "itemId": "5633", + "name": "Adamant dart(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5633" + }, + { + "itemId": "5634", + "name": "Rune dart(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5634" + }, + { + "itemId": "5635", + "name": "Bronze dart(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5635" + }, + { + "itemId": "5636", + "name": "Iron dart(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5636" + }, + { + "itemId": "5637", + "name": "Steel dart(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5637" + }, + { + "itemId": "5638", + "name": "Black dart(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5638" + }, + { + "itemId": "5639", + "name": "Mithril dart(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5639" + }, + { + "itemId": "5640", + "name": "Adamant dart(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5640" + }, + { + "itemId": "5641", + "name": "Rune dart(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "5641" + }, + { + "itemId": "5642", + "name": "Bronze javelin(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5642" + }, + { + "itemId": "5643", + "name": "Iron javelin(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5643" + }, + { + "itemId": "5644", + "name": "Steel javelin(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5644" + }, + { + "itemId": "5645", + "name": "Mithril javelin(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5645" + }, + { + "itemId": "5646", + "name": "Adamant javelin(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5646" + }, + { + "itemId": "5647", + "name": "Rune javelin(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5647" + }, + { + "itemId": "5648", + "name": "Bronze jav\\'n(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5648" + }, + { + "itemId": "5649", + "name": "Iron javelin(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5649" + }, + { + "itemId": "5650", + "name": "Steel javelin(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5650" + }, + { + "itemId": "5651", + "name": "Mithril javelin(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5651" + }, + { + "itemId": "5652", + "name": "Adamant javelin(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5652" + }, + { + "itemId": "5653", + "name": "Rune javelin(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5653" + }, + { + "itemId": "5654", + "name": "Bronze knife(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5654" + }, + { + "itemId": "5655", + "name": "Iron knife(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5655" + }, + { + "itemId": "5656", + "name": "Steel knife(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5656" + }, + { + "itemId": "5657", + "name": "Mithril knife(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5657" + }, + { + "itemId": "5658", + "name": "Black knife(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5658" + }, + { + "itemId": "5659", + "name": "Adamant knife(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5659" + }, + { + "itemId": "5660", + "name": "Rune knife(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5660" + }, + { + "itemId": "5661", + "name": "Bronze knife(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5661" + }, + { + "itemId": "5662", + "name": "Iron knife(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5662" + }, + { + "itemId": "5663", + "name": "Steel knife(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5663" + }, + { + "itemId": "5664", + "name": "Mithril knife(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5664" + }, + { + "itemId": "5665", + "name": "Black knife(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5665" + }, + { + "itemId": "5666", + "name": "Adamant knife(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5666" + }, + { + "itemId": "5667", + "name": "Rune knife(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "929", + "drop_ammo": "true", + "ammunition": "5667" + }, + { + "itemId": "6522", + "name": "Toktz-xil-ul", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "2614", + "drop_ammo": "true", + "ammunition": "6522" + }, + { + "itemId": "6724", + "name": "Seercull", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78,4160" + }, + { + "itemId": "8880", + "name": "Dorgeshuun c\\'bow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "8882,877,878,6061,6062,879,9236" + }, + { + "itemId": "9174", + "name": "Bronze crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,13280" + }, + { + "itemId": "9176", + "name": "Blurite crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,9140,879,9236,13280" + }, + { + "itemId": "9177", + "name": "Iron crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,9140,9287,9294,9301,880,9238,9145,13280" + }, + { + "itemId": "9179", + "name": "Steel crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9140,9236,9141,9288,9295,9302,9336,9239,9145,13280" + }, + { + "itemId": "9181", + "name": "Mith crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,9141,9288,9295,9302,9336,9239,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9145,9140,9241,13280" + }, + { + "itemId": "9183", + "name": "Adamant crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,9141,9288,9295,9302,9336,9239,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9241,9145,9143,9290,9297,9304,9339,9242,9340,9243,13280" + }, + { + "itemId": "9185", + "name": "Rune crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,9141,9288,9295,9302,9336,9239,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9145,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9241,9143,9290,9297,9304,9339,9242,9340,9243,9144,9291,9298,9305,9341,9244,9342,9245,9140,13280" + }, + { + "itemId": "9705", + "name": "Training bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "9706" + }, + { + "itemId": "10033", + "name": "Chinchompa", + "ammo_slot": "3", + "weapon_type": "6", + "animation": "2779", + "drop_ammo": "0", + "ammunition": "10034" + }, + { + "itemId": "10034", + "name": "Red chinchompa", + "ammo_slot": "3", + "weapon_type": "6", + "animation": "2779", + "drop_ammo": "0", + "ammunition": "10034" + }, + { + "itemId": "10156", + "name": "Hunters\\' crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "10158,10159" + }, + { + "itemId": "10280", + "name": "Willow comp bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536" + }, + { + "itemId": "10282", + "name": "Yew comp bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78" + }, + { + "itemId": "10284", + "name": "Magic comp bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78,4160" + }, + { + "itemId": "11165", + "name": "Phoenix crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,13280" + }, + { + "itemId": "11167", + "name": "Phoenix crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,13280" + }, + { + "itemId": "11230", + "name": "Dragon dart", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "11230" + }, + { + "itemId": "11231", + "name": "Dragon dart(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "11231" + }, + { + "itemId": "11233", + "name": "Dragon dart(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "11233" + }, + { + "itemId": "11234", + "name": "Dragon dart(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "6600", + "drop_ammo": "true", + "ammunition": "11234" + }, + { + "itemId": "11235", + "name": "Dark bow", + "ammo_slot": "13", + "weapon_type": "2", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,11212,11227,11228,11229,11217,78,4160" + }, + { + "itemId": "13081", + "name": "Black crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,9141,9288,9295,9302,9140,9336,9239,13083,13084,13085,13086,13280" + }, + { + "itemId": "13405", + "name": "Dark bow", + "ammo_slot": "13", + "weapon_type": "2", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,11212,11227,11228,11229,11217,78,4160" + }, + { + "itemId": "13523", + "name": "Maple longbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538" + }, + { + "itemId": "13524", + "name": "Maple shortbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538" + }, + { + "itemId": "13525", + "name": "Yew longbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78" + }, + { + "itemId": "13526", + "name": "Yew shortbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78" + }, + { + "itemId": "13527", + "name": "Magic longbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78,4160" + }, + { + "itemId": "13528", + "name": "Magic shortbow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78,4160" + }, + { + "itemId": "13529", + "name": "Seercull", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78,4160" + }, + { + "itemId": "13530", + "name": "Rune crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9141,9288,9295,9302,9336,9239,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9241,9143,9290,9297,9304,9339,9242,9340,9243,9144,9291,9298,9305,9341,9244,9342,9245,13280" + }, + { + "itemId": "13541", + "name": "Willow comp bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536" + }, + { + "itemId": "13542", + "name": "Yew comp bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78" + }, + { + "itemId": "13543", + "name": "Magic comp bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78,4160" + }, + { + "itemId": "13879", + "name": "Morrigan\\'s javelin", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10501", + "drop_ammo": "true", + "ammunition": "13879" + }, + { + "itemId": "13880", + "name": "Morrigan\\'s javelin(p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10501", + "drop_ammo": "true", + "ammunition": "13880" + }, + { + "itemId": "13881", + "name": "Morrigan\\'s javelin(p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10501", + "drop_ammo": "true", + "ammunition": "13881" + }, + { + "itemId": "13882", + "name": "Morrigan\\'s javelin(p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10501", + "drop_ammo": "true", + "ammunition": "13882" + }, + { + "itemId": "13883", + "name": "Morrigan\\'s throwing axe", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10504", + "drop_ammo": "true", + "ammunition": "13883" + }, + { + "itemId": "13953", + "name": "Corrupt morrigan\\'s javelin", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10501", + "drop_ammo": "true", + "ammunition": "13953" + }, + { + "itemId": "13954", + "name": "C. morrigan\\'s javelin (p)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10501", + "drop_ammo": "true", + "ammunition": "13954" + }, + { + "itemId": "13955", + "name": "C. morrigan\\'s javelin (p+)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10501", + "drop_ammo": "true", + "ammunition": "13955" + }, + { + "itemId": "13956", + "name": "C. morrigan\\'s javelin (p++)", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10501", + "drop_ammo": "true", + "ammunition": "13956" + }, + { + "itemId": "13957", + "name": "C. morrigan\\'s throwing axe", + "ammo_slot": "3", + "weapon_type": "3", + "animation": "10504", + "drop_ammo": "true", + "ammunition": "13957" + }, + { + "itemId": "14121", + "name": "Sacred clay bow", + "ammo_slot": "13", + "weapon_type": "0", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,78,4160" + }, + { + "itemId": "14671", + "name": "Armadyl crossbow", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236,9141,9288,9295,9302,9336,9239,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9241,9143,9290,9297,9304,9339,9242,9340,9243,9144,9291,9298,9305,9341,9244,9342,9245,9140,13280" + }, + { + "itemId": "14684", + "name": "Odium ward", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "8882,877,878,6061,6062,879,9236,9141,9288,9295,9302,9336,9239,13083,13084,13085,13086,9142,9289,9296,9303,9337,9240,9338,9241,9143,9290,9297,9304,9339,9242,9340,9243" + }, + { + "itemId": "14685", + "name": "Odium shard 1", + "ammo_slot": "13", + "weapon_type": "1", + "animation": "4230", + "drop_ammo": "true", + "ammunition": "877,878,6061,6062,879,9236" + }, + { + "itemId": "14803", + "name": "Dark bow", + "ammo_slot": "13", + "weapon_type": "2", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,11212,11227,11228,11229,11217,78,4160" + }, + { + "itemId": "14804", + "name": "Dark bow", + "ammo_slot": "13", + "weapon_type": "2", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,11212,11227,11228,11229,11217,78,4160" + }, + { + "itemId": "14805", + "name": "Dark bow", + "ammo_slot": "13", + "weapon_type": "2", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,11212,11227,11228,11229,11217,78,4160" + }, + { + "itemId": "14806", + "name": "Dark bow", + "ammo_slot": "13", + "weapon_type": "2", + "animation": "426", + "drop_ammo": "true", + "ammunition": "882,883,5616,5622,598,884,885,5617,5623,2532,886,887,5618,5624,2534,888,889,5619,5625,2536,890,891,5620,5626,2538,892,893,5621,5627,2540,11212,11227,11228,11229,11217,78,4160" + } +] diff --git a/Server/data/configs/shops.json b/Server/data/configs/shops.json new file mode 100644 index 000000000..b871bcde9 --- /dev/null +++ b/Server/data/configs/shops.json @@ -0,0 +1,2045 @@ +[ + { + "id": "1", + "title": "Ava's Odds and Ends", + "general_store": "false", + "stock": "{314,1000}-{884,40}-{886,10}-{40,30}-{41,20}", + "npcs": "5198,5199", + "currency": "995", + "high_alch": "0" + }, + { + "id": "2", + "title": "Edgeville General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "528,529", + "currency": "995", + "high_alch": "0" + }, + { + "id": "3", + "title": "Al Kharid General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "525,524", + "currency": "995", + "high_alch": "0" + }, + { + "id": "4", + "title": "Void Knight General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}-{7934,25}", + "npcs": "3799", + "currency": "995", + "high_alch": "0" + }, + { + "id": "5", + "title": "Ifaba's General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "1436", + "currency": "995", + "high_alch": "0" + }, + { + "id": "6", + "title": "Aemad's Adventuring Supplies Store", + "general_store": "true", + "stock": "{1759,100}-{882,1000}-{1265,10}-{2142,10}-{1349,10}-{946,10}-{970,10}-{954,10}-{590,10}-{227,10}", + "npcs": "590", + "currency": "995", + "high_alch": "0" + }, + { + "id": "7", + "title": "Kortan General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "591", + "currency": "995", + "high_alch": "0" + }, + { + "id": "8", + "title": "West Ardougne General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "971", + "currency": "995", + "high_alch": "0" + }, + { + "id": "9", + "title": "Bandit Bargains", + "general_store": "true", + "stock": "{1823,5}-{1831,5}-{1937,5}-{1921,5}-{1929,5}-{1935,5}-{1923,5}-{1925,5}-{1837,5}-{1833,5}-{1835,5}-{946,5}", + "npcs": "1917", + "currency": "995", + "high_alch": "0" + }, + { + "id": "10", + "title": "Bandit Duty Free", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "597", + "currency": "995", + "high_alch": "1" + }, + { + "id": "11", + "title": "Burthorpe Supplies", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "1083", + "currency": "995", + "high_alch": "0" + }, + { + "id": "12", + "title": "Aurel's Supplies", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "3541,7396", + "currency": "995", + "high_alch": "0" + }, + { + "id": "13", + "title": "General Store (Canifis)", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "1040", + "currency": "995", + "high_alch": "0" + }, + { + "id": "14", + "title": "Arhein's Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "563", + "currency": "995", + "high_alch": "0" + }, + { + "id": "15", + "title": "Dorgesh-Kaan General Supplies", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "5798", + "currency": "995", + "high_alch": "0" + }, + { + "id": "16", + "title": "Dwarven Shopping Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "582", + "currency": "995", + "high_alch": "0" + }, + { + "id": "17", + "title": "Falador General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "526,527", + "currency": "995", + "high_alch": "0" + }, + { + "id": "18", + "title": "Dal's General Ogre Supplies", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "873", + "currency": "995", + "high_alch": "0" + }, + { + "id": "19", + "title": "Karamja General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "532,533", + "currency": "995", + "high_alch": "0" + }, + { + "id": "20", + "title": "Karamja Wines, Spirits, and Beers", + "general_store": "true", + "stock": "{1917,3}-{431,3}-{1993,1}", + "npcs": "568", + "currency": "995", + "high_alch": "0" + }, + { + "id": "21", + "title": "Gunslik's Assorted Items", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "2154", + "currency": "995", + "high_alch": "0" + }, + { + "id": "22", + "title": "The Lighthouse Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "1334", + "currency": "995", + "high_alch": "0" + }, + { + "id": "23", + "title": "Lletya General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "2352", + "currency": "995", + "high_alch": "0" + }, + { + "id": "24", + "title": "Moon Clan General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "4516", + "currency": "995", + "high_alch": "0" + }, + { + "id": "25", + "title": "Lumbridge General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "520,521", + "currency": "995", + "high_alch": "0" + }, + { + "id": "26", + "title": "Trader Sven's Black Market Goods", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "4716", + "currency": "995", + "high_alch": "0" + }, + { + "id": "27", + "title": "Miscellanian General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "3922", + "currency": "995", + "high_alch": "0" + }, + { + "id": "28", + "title": "Razmire General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "1254", + "currency": "995", + "high_alch": "0" + }, + { + "id": "29", + "title": "Nardah General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "2086", + "currency": "995", + "high_alch": "0" + }, + { + "id": "30", + "title": "Arnold's Eclectic Supplies", + "general_store": "true", + "stock": "{303,10}-{311,10}-{7944,0}-{7946,0}-{2309,10}-{1931,30}-{1927,10}-{1733,10}-{1734,1000}-{1755,10}-{1917,10}-{1785,10}-{946,10}", + "npcs": "3824", + "currency": "995", + "high_alch": "0" + }, + { + "id": "31", + "title": "Pollnivneach General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "1866", + "currency": "995", + "high_alch": "0" + }, + { + "id": "32", + "title": "Khazard General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "-1", + "currency": "995", + "high_alch": "0" + }, + { + "id": "33", + "title": "Port Phasmatys General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "1699", + "currency": "995", + "high_alch": "0" + }, + { + "id": "34", + "title": "Rimmington General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "530,531", + "currency": "995", + "high_alch": "0" + }, + { + "id": "35", + "title": "Shantay Pass Shop", + "general_store": "true", + "stock": "{1823,100}-{1831,100}-{1937,10}-{1921,10}-{1929,10}-{946,10}-{1833,10}-{1835,10}-{1837,10}-{2349,10}-{314,500}-{2347,10}-{1925,0}-{1923,0}-{1935,0}-{1854,500}-{954,20}", + "npcs": "836", + "currency": "995", + "high_alch": "0" + }, + { + "id": "36", + "title": "Obli's General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "516", + "currency": "995", + "high_alch": "0" + }, + { + "id": "37", + "title": "Jiminua's Jungle Store", + "general_store": "true", + "stock": "{590,2}-{36,10}-{596,10}-{1931,3}-{954,10}-{1129,12}-{1059,10}-{1061,10}-{2142,2}-{2309,8}-{227,10}-{227,300}-{233,300}-{175,10}-{970,10}-{973,10}-{946,10}-{2347,10}-{975,10}-{1755,10}-{952,10}-{1351,10}-{1265,10}-{1349,10}", + "npcs": "560", + "currency": "995", + "high_alch": "0" + }, + { + "id": "38", + "title": "Bolkoy's Village Shop", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "471", + "currency": "995", + "high_alch": "0" + }, + { + "id": "39", + "title": "Quartermaster's Stores", + "general_store": "true", + "stock": "{1931,30}-{1935,10}-{1735,10}-{590,10}-{2309,10}-{3190,10}-{3192,10}-{3194,10}-{3196,10}-{3198,10}-{3200,10}-{3202,10}-{3204,10}", + "npcs": "1208", + "currency": "995", + "high_alch": "0" + }, + { + "id": "40", + "title": "Varrock General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "522,523", + "currency": "995", + "high_alch": "0" + }, + { + "id": "41", + "title": "Trader Stan's Trading Post", + "general_store": "true", + "stock": "{1931,5}-{1935,2}-{1735,2}-{1925,3}-{1923,2}-{1887,2}-{590,2}-{1755,2}-{2347,5}-{550,5}-{9003,5}-{954,2}-{946,2}-{2114,14}-{1963,15}-{2108,10}-{4286,10}-{1785,15}-{1783,10}-{401,20}-{1781,10}-{301,20}-{307,20}-{1941,30}-{9629,25}-{3226,20}-{1025,5}", + "npcs": "4651,4652,4653,4654,4655,4656,4650", + "currency": "995", + "high_alch": "0" + }, + { + "id": "42", + "title": "Zanaris General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "534", + "currency": "995", + "high_alch": "0" + }, + { + "id": "43", + "title": "Davon's Amulet Store", + "general_store": "false", + "stock": "{1718,0}-{1727,1}-{1729,0}-{1725,0}-{1731,0}", + "npcs": "588", + "currency": "995", + "high_alch": "0" + }, + { + "id": "44", + "title": "Lletya Archery Shop", + "general_store": "false", + "stock": "{884,1000}-{886,300}-{888,100}-{890,100}-{892,30}-{877,1000}-{843,10}-{837,10}-{849,10}", + "npcs": "2356", + "currency": "995", + "high_alch": "0" + }, + { + "id": "45", + "title": "Void Knight Archery Store", + "general_store": "false", + "stock": "{825,300}-{826,300}-{827,100}-{828,100}-{829,250}-{830,10}-{39,100}-{40,100}-{41,100}-{42,30}-{43,30}-{44,10}", + "npcs": "3796", + "currency": "995", + "high_alch": "0" + }, + { + "id": "46", + "title": "Brian's Archery Supplies", + "general_store": "false", + "stock": "{886,100}-{888,30}-{890,0}-{843,10}-{849,10}-{853,10}", + "npcs": "1860", + "currency": "995", + "high_alch": "0" + }, + { + "id": "47", + "title": "Lowe's Archery Emporium", + "general_store": "false", + "stock": "{882,2500}-{884,500}-{886,500}-{888,500}-{890,300}-{877,500}-{841,10}-{843,10}-{849,10}-{853,10}-{837,10}-{9177,10}-{9179,10}", + "npcs": "550", + "currency": "995", + "high_alch": "0" + }, + { + "id": "48", + "title": "Hickton's Archery Emporium", + "general_store": "false", + "stock": "{877,300}-{882,1000}-{884,100}-{886,0}-{888,0}-{890,0}-{892,0}-{4773,0}-{4778,0}-{4783,0}-{4788,0}-{4793,0}-{4798,0}-{4803,0}-{841,10}-{837,10}-{843,10}-{4827,10}-{1133,10}-{1097,10}", + "npcs": "575", + "currency": "995", + "high_alch": "0" + }, + { + "id": "49", + "title": "Dargaud's Bows And Arrows", + "general_store": "false", + "stock": "{52,1000}-{39,1000}-{40,300}-{41,300}-{42,100}-{43,100}-{44,100}-{882,1000}-{884,300}-{886,300}-{888,100}-{890,100}-{892,100}-{4773,0}-{4778,0}-{4783,0}-{4788,0}-{4793,0}-{4798,0}-{4803,0}-{841,10}-{843,10}-{849,10}-{839,20}-{845,20}-{847,20}-{4827,10}", + "npcs": "683", + "currency": "995", + "high_alch": "0" + }, + { + "id": "50", + "title": "Aaron's Archery Appendages", + "general_store": "false", + "stock": "{1129,10}-{1131,10}-{1133,10}-{1095,10}-{1097,10}-{1169,10}-{1167,10}-{1063,10}", + "npcs": "682", + "currency": "995", + "high_alch": "0" + }, + { + "id": "51", + "title": "Crossbow Shop (dwarven Mine)", + "general_store": "false", + "stock": "{9440,10}-{9442,10}-{9444,10}-{9446,10}-{9448,10}-{9450,10}-{9452,0}-{9420,10}-{9423,10}-{9425,10}-{9427,10}-{9429,10}-{9431,0}", + "npcs": "4563", + "currency": "995", + "high_alch": "0" + }, + { + "id": "52", + "title": "Crossbow Shop (keldagrim)", + "general_store": "false", + "stock": "{9440,10}-{9442,10}-{9444,10}-{9446,10}-{9448,10}-{9450,10}-{9452,0}-{9420,10}-{9423,10}-{9425,10}-{9427,10}-{9429,10}-{9431,0}", + "npcs": "4558", + "currency": "995", + "high_alch": "0" + }, + { + "id": "53", + "title": "Crossbow Shop (white Wolf Mountain)", + "general_store": "false", + "stock": "{9440,10}-{9442,10}-{9444,10}-{9446,10}-{9448,10}-{9450,10}-{9452,0}-{9420,10}-{9423,10}-{9425,10}-{9427,10}-{9429,10}-{9431,0}", + "npcs": "4559", + "currency": "995", + "high_alch": "0" + }, + { + "id": "54", + "title": "Bob's Brilliant Axes", + "general_store": "false", + "stock": "{1265,10}-{1351,10}-{1349,10}-{1353,10}-{1363,10}-{1365,10}-{1369,10}", + "npcs": "519", + "currency": "995", + "high_alch": "0" + }, + { + "id": "55", + "title": "Brian's Battleaxe Bazaar", + "general_store": "false", + "stock": "{1375,10}-{1363,10}-{1365,10}-{1367,10}-{1369,10}-{1371,10}", + "npcs": "559", + "currency": "995", + "high_alch": "0" + }, + { + "id": "56", + "title": "Candle Shop", + "general_store": "false", + "stock": "{36,10}-{38,10}", + "npcs": "562", + "currency": "995", + "high_alch": "0" + }, + { + "id": "57", + "title": "Candle Shop", + "general_store": "false", + "stock": "{36,10}", + "npcs": "562", + "currency": "995", + "high_alch": "0" + }, + { + "id": "58", + "title": "Wayne's Chains", + "general_store": "false", + "stock": "{1103,10}-{1101,10}-{1105,10}-{1107,10}-{1109,10}-{1111,10}", + "npcs": "581", + "currency": "995", + "high_alch": "0" + }, + { + "id": "59", + "title": "Fancy Clothes Store", + "general_store": "false", + "stock": "{1949,10}-{958,10}-{948,10}-{1733,10}-{1734,1000}-{1059,30}-{1061,10}-{1757,10}-{1013,10}-{1025,10}-{10088,0}-{10090,0}-{10091,0}-{10089,0}-{10087,0}-{11525,0}", + "npcs": "554", + "currency": "995", + "high_alch": "0" + }, + { + "id": "60", + "title": "Thessalia's Fine Clothes", + "general_store": "false", + "stock": "{1005,10}-{1129,10}-{1059,10}-{1061,10}-{1757,10}-{1013,10}-{1015,10}-{1011,10}-{1007,10}-{950,10}-{426,10}-{428,10}", + "npcs": "548", + "currency": "995", + "high_alch": "0" + }, + { + "id": "61", + "title": "Fine Fashions", + "general_store": "false", + "stock": "{646,30}-{648,30}-{650,30}-{652,30}-{654,30}-{656,30}-{658,30}-{660,30}-{662,30}-{664,30}-{636,30}-{638,30}-{640,30}-{642,30}-{644,30}-{626,30}-{628,30}-{630,30}-{632,30}-{634,30}", + "npcs": "601", + "currency": "995", + "high_alch": "0" + }, + { + "id": "62", + "title": "Yrsa's Accoutrements", + "general_store": "false", + "stock": "{3775,10}-{3773,10}-{3767,10}-{3769,10}-{3771,10}-{3793,10}-{3795,10}-{3797,10}-{3791,10}-{3799,10}-{3767,10}-{3759,10}-{3761,10}-{3765,10}-{3763,10}-{3777,10}-{3779,10}-{3781,10}-{3783,10}-{3785,10}-{3787,10}-{3789,10}", + "npcs": "1301", + "currency": "995", + "high_alch": "0" + }, + { + "id": "63", + "title": "Barker's Haberdashery", + "general_store": "false", + "stock": "{2894,5}-{2896,5}-{2898,5}-{2900,5}-{2902,5}-{2904,5}-{2906,5}-{2908,5}-{2910,5}-{2912,5}-{2914,5}-{2916,5}-{2918,5}-{2920,5}-{2922,5}-{2924,5}-{2926,5}-{2928,5}-{2930,5}-{2932,5}-{2934,5}-{2936,5}-{2938,5}-{2940,5}-{2942,5}-{1007,5}-{1023,5}-{1019,5}-{1021,5}-{1027,5}", + "npcs": "1039", + "currency": "995", + "high_alch": "0" + }, + { + "id": "64", + "title": "Lletya Seamstress", + "general_store": "false", + "stock": "{1734,1000}-{1733,10}-{1759,100}-{1763,10}-{1765,10}-{1767,10}-{1769,10}-{1771,10}-{1773,10}", + "npcs": "2353", + "currency": "995", + "high_alch": "0" + }, + { + "id": "65", + "title": "Dodgy Mikes Second-hand Clothing", + "general_store": "false", + "stock": "{7114,10}", + "npcs": "3166", + "currency": "995", + "high_alch": "0" + }, + { + "id": "66", + "title": "Agmundi Quality Clothes", + "general_store": "false", + "stock": "", + "npcs": "2161", + "currency": "995", + "high_alch": "0" + }, + { + "id": "67", + "title": "Vermundi's Clothes Stall", + "general_store": "false", + "stock": "{950,10}", + "npcs": "2162", + "currency": "995", + "high_alch": "0" + }, + { + "id": "68", + "title": "Grand Season Groceries", + "general_store": "false", + "stock": "{2171,10}-{2128,10}-{1933,10}-{2169,10}-{1957,10}-{1965,10}-{1982,10}-{1985,10}-{2120,10}-{2108,10}-{2102,10}-{2114,10}-{2126,10}-{2025,10}-{1973,10}-{1975,10}-{2130,10}-{1927,10}-{946,10}-{2167,10}-{2164,10}-{2165,10}-{2166,10}", + "npcs": "600", + "currency": "995", + "high_alch": "0" + }, + { + "id": "69", + "title": "Frenita's Cookery Shop", + "general_store": "false", + "stock": "{2313,10}-{1955,0}-{1887,10}-{1923,10}-{590,10}-{1935,10}-{1931,30}-{1973,10}-{1933,500}-{1980,10}", + "npcs": "593", + "currency": "995", + "high_alch": "0" + }, + { + "id": "70", + "title": "Dommik's Crafting Store", + "general_store": "false", + "stock": "{1755,10}-{1592,10}-{1597,10}-{1595,10}-{1733,10}-{1734,1000}-{1599,10}-{2976,10}-{5523,10}-{9434,10}-{11065,10}", + "npcs": "545", + "currency": "995", + "high_alch": "0" + }, + { + "id": "71", + "title": "Rommik's Crafty Supplies", + "general_store": "false", + "stock": "{1755,10}-{1592,10}-{1597,10}-{1595,10}-{1733,10}-{1734,1000}-{1599,10}-{2976,10}-{5523,10}-{9434,10}-{11065,10}", + "npcs": "585", + "currency": "995", + "high_alch": "0" + }, + { + "id": "72", + "title": "Jamila's Craft Stall", + "general_store": "false", + "stock": "{1755,10}-{1592,10}-{1597,10}-{1595,10}-{1733,10}-{1734,1000}-{1599,10}-{2976,10}-{5523,10}-{11065,10}", + "npcs": "5268", + "currency": "995", + "high_alch": "0" + }, + { + "id": "73", + "title": "Vanessa's Farming Shop", + "general_store": "false", + "stock": "{5376,10}-{6032,300}-{5418,10}-{5376,10}-{6036,10}-{5354,100}-{5341,10}-{5329,10}-{5343,10}-{952,10}-{5325,10}-{1925,100}-{5331,30}-{12622,10}-{5996,0}-{6006,0}-{1965,0}-{5994,0}-{5931,0}-{6000,0}-{1957,0}-{5504,0}-{5986,0}-{1982,0}-{5982,0}-{6002,0}-{5998,0}", + "npcs": "2305", + "currency": "995", + "high_alch": "0" + }, + { + "id": "74", + "title": "Alice's Farming Shop", + "general_store": "false", + "stock": "{5376,10}-{6032,300}-{5418,10}-{5376,10}-{6036,10}-{5354,100}-{5341,10}-{5329,10}-{5343,10}-{952,10}-{5325,10}-{1925,100}-{5331,30}-{12622,10}-{5996,0}-{6006,0}-{1965,0}-{5994,0}-{5931,0}-{6000,0}-{1957,0}-{5504,0}-{5986,0}-{1982,0}-{5982,0}-{6002,0}-{5998,0}", + "npcs": "2307", + "currency": "995", + "high_alch": "0" + }, + { + "id": "75", + "title": "Sarah's Farming Shop", + "general_store": "false", + "stock": "{5376,10}-{6032,300}-{5418,10}-{5376,10}-{6036,10}-{5354,100}-{5341,10}-{5329,10}-{5343,10}-{952,10}-{5325,10}-{1925,100}-{5331,30}-{12622,10}-{5996,0}-{6006,0}-{1965,0}-{5994,0}-{5931,0}-{6000,0}-{1957,0}-{5504,0}-{5986,0}-{1982,0}-{5982,0}-{6002,0}-{5998,0}", + "npcs": "2304", + "currency": "995", + "high_alch": "0" + }, + { + "id": "76", + "title": "Richard's Farming Shop", + "general_store": "false", + "stock": "{5376,10}-{6032,300}-{5418,10}-{5376,10}-{6036,10}-{5354,100}-{5341,10}-{5329,10}-{5343,10}-{952,10}-{5325,10}-{1925,100}-{5331,30}-{12622,10}-{5996,0}-{6006,0}-{1965,0}-{5994,0}-{5931,0}-{6000,0}-{1957,0}-{5504,0}-{5986,0}-{1982,0}-{5982,0}-{6002,0}-{5998,0}", + "npcs": "1783", + "currency": "995", + "high_alch": "0" + }, + { + "id": "77", + "title": "Wydin's Consumables Store", + "general_store": "false", + "stock": "{1933,500}-{2132,10}-{2138,10}-{1965,10}-{1963,0}-{1951,0}-{2309,10}-{1973,10}-{1985,10}-{1982,10}-{1550,10}", + "npcs": "557", + "currency": "995", + "high_alch": "0" + }, + { + "id": "78", + "title": "Rufus's Meat Emporium", + "general_store": "false", + "stock": "{2132,100}-{2138,30}-{2134,10}-{2136,10}-{335,0}-{349,0}-{331,0}-{383,0}", + "npcs": "1038", + "currency": "995", + "high_alch": "0" + }, + { + "id": "79", + "title": "Solihib's Consumables Stall", + "general_store": "false", + "stock": "{4012,10}-{1963,10}-{4016,10}-{4014,10}", + "npcs": "1433", + "currency": "995", + "high_alch": "0" + }, + { + "id": "80", + "title": "Fresh Meat", + "general_store": "false", + "stock": "{2134,10}-{2132,300}-{2136,10}-{2142,10}-{2138,10}-{2140,10}-{3226,100}-{7224,0}-{7223,0}-{3228,10}-{2876,0}-{7230,0}-{2878,0}-{7566,0}-{2337,0}-{9978,10}-{9984,0}-{9980,0}-{9986,0}-{9992,0}-{9988,0}", + "npcs": "7053", + "currency": "995", + "high_alch": "0" + }, + { + "id": "81", + "title": "Ardougne Baker's Stall", + "general_store": "false", + "stock": "{2309,10}-{1891,10}-{1973,100}", + "npcs": "571", + "currency": "995", + "high_alch": "0" + }, + { + "id": "82", + "title": "Keepa Kettilon's Store", + "general_store": "false", + "stock": "{361,20}-{329,20}-{339,20}-{379,10}-{373,0}-{385,0}", + "npcs": "5487", + "currency": "995", + "high_alch": "0" + }, + { + "id": "83", + "title": "Gianne's Restaurant", + "general_store": "false", + "stock": "{2223,10}-{2225,10}-{2221,10}-{2219,10}-{2227,10}-{2233,10}-{2231,10}-{2235,10}-{2229,10}-{2241,10}-{2243,10}-{2239,10}-{2237,10}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "84", + "title": "Warriors' Guild Potion Shop", + "general_store": "false", + "stock": "{115,10}-{121,10}-{133,10}", + "npcs": "4294", + "currency": "995", + "high_alch": "0" + }, + { + "id": "85", + "title": "Warriors' Guild Consumables Shop", + "general_store": "false", + "stock": "{333,10}-{365,10}-{2289,10}-{6705,10}-{2003,10}", + "npcs": "4293", + "currency": "995", + "high_alch": "0" + }, + { + "id": "86", + "title": "Warriors' Guild Armoury", + "general_store": "false", + "stock": "{1363,10}-{1365,10}-{1369,10}-{1277,10}-{1279,10}-{1281,10}-{1283,10}-{1285,10}-{1287,10}-{1307,10}-{1309,10}-{1311,10}-{1313,10}-{1315,10}-{1317,10}-{1211,10}-{1301,10}-{1317,10}-{1297,10}", + "npcs": "4295", + "currency": "995", + "high_alch": "0" + }, + { + "id": "87", + "title": "Herquin's Gem", + "general_store": "false", + "stock": "{1623,0}-{1621,0}-{1619,0}-{1617,0}-{1607,0}-{1605,0}-{1603,0}-{1601,0}", + "npcs": "584", + "currency": "995", + "high_alch": "0" + }, + { + "id": "88", + "title": "Ardougne Gem Stall", + "general_store": "false", + "stock": "{1623,0}-{1621,0}-{1619,0}-{1617,0}-{1607,0}-{1605,0}-{1603,0}-{1601,0}", + "npcs": "570", + "currency": "995", + "high_alch": "0" + }, + { + "id": "89", + "title": "Green Gemstone Gem", + "general_store": "false", + "stock": "{1607,0}-{1605,0}-{1603,0}-{1601,0}", + "npcs": "2157", + "currency": "995", + "high_alch": "0" + }, + { + "id": "90", + "title": "Gem Trader (stall)", + "general_store": "false", + "stock": "{1623,0}-{1621,0}-{1619,0}-{1617,0}-{1607,0}-{1605,0}-{1603,0}-{1601,0}", + "npcs": "540", + "currency": "995", + "high_alch": "0" + }, + { + "id": "91", + "title": "Gem Trader (stall)", + "general_store": "false", + "stock": "{1623,0}-{1621,0}-{1619,0}-{1617,0}-{1607,0}-{1605,0}-{1603,0}-{1601,0}", + "npcs": "540", + "currency": "995", + "high_alch": "0" + }, + { + "id": "92", + "title": "Gem Store", + "general_store": "false", + "stock": "{1623,1}-{1621,1}-{1619,0}-{1617,0}", + "npcs": "2157", + "currency": "995", + "high_alch": "0" + }, + { + "id": "93", + "title": "Pelters' Veg Stall", + "general_store": "false", + "stock": "{2518,100}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "94", + "title": "Ardougne Silver Stall", + "general_store": "false", + "stock": "{1714,10}-{442,0}-{2355,0}", + "npcs": "569", + "currency": "995", + "high_alch": "0" + }, + { + "id": "95", + "title": "Ardougne Spice Stall", + "general_store": "false", + "stock": "{2007,10}-{946,10}-{1550,10}", + "npcs": "572", + "currency": "995", + "high_alch": "0" + }, + { + "id": "96", + "title": "Shop of Distate", + "general_store": "false", + "stock": "{2518,1}", + "npcs": "958", + "currency": "995", + "high_alch": "0" + }, + { + "id": "97", + "title": "Ardougne Fur Stall", + "general_store": "false", + "stock": "{948,10}-{958,10}-{10117,0}-{10121,0}-{10119,0}-{10123,0}-{10093,0}-{10095,0}-{10097,0}-{10099,0}-{10101,0}-{10103,0}", + "npcs": "573", + "currency": "995", + "high_alch": "0" + }, + { + "id": "98", + "title": "Peksa's Helmet Shop", + "general_store": "false", + "stock": "{1139,5}-{1137,3}-{1141,3}-{1143,1}-{1145,1}-{1155,4}-{1153,3}-{1157,2}-{1159,1}-{1161,1}", + "npcs": "538", + "currency": "995", + "high_alch": "0" + }, + { + "id": "99", + "title": "Skulgrimen's Battle Gear", + "general_store": "false", + "stock": "{1337,10}-{1335,10}-{1339,10}-{1341,10}-{1343,10}-{1347,0}-{3749,10}-{3751,10}-{3753,10}-{3755,10}", + "npcs": "1303", + "currency": "995", + "high_alch": "0" + }, + { + "id": "100", + "title": "Tea Shop", + "general_store": "false", + "stock": "{712,10}", + "npcs": "595", + "currency": "995", + "high_alch": "0" + }, + { + "id": "101", + "title": "Frincos's Fabulous Herb Store", + "general_store": "false", + "stock": "{229,10}-{233,10}-{221,10}", + "npcs": "297", + "currency": "995", + "high_alch": "0" + }, + { + "id": "102", + "title": "Grud's Herblore Stall", + "general_store": "false", + "stock": "{229,10}-{233,10}-{221,10}", + "npcs": "704", + "currency": "995", + "high_alch": "0" + }, + { + "id": "103", + "title": "Jatix's Herblore Shop", + "general_store": "false", + "stock": "{229,10}-{233,10}-{221,10}", + "npcs": "587", + "currency": "995", + "high_alch": "0" + }, + { + "id": "104", + "title": "Aleck's Hunter Emporium", + "general_store": "false", + "stock": "{10010,10}-{10012,300}-{10025,300}-{10150,10}-{10006,30}-{10008,30}-{10029,10}-{596,10}-{10031,30}-{12539,0}", + "npcs": "5110", + "currency": "995", + "high_alch": "0" + }, + { + "id": "105", + "title": "Nardah Hunter Shop", + "general_store": "false", + "stock": "{10010,10}-{10012,300}-{10025,300}-{10150,10}-{10006,30}-{10008,30}-{10029,10}-{596,10}-{10031,30}-{12539,0}", + "npcs": "5109", + "currency": "995", + "high_alch": "0" + }, + { + "id": "106", + "title": "Jewellery Shop", + "general_store": "false", + "stock": "{1635,0}-{1637,0}-{1639,0}-{1641,0}-{1643,0}-{1654,0}-{1656,0}-{1658,0}-{1660,0}-{1662,0}-{1673,0}-{1675,0}-{1696,0}-{1698,0}-{1700,0}-{11069,0}-{11072,0}-{11076,0}-{11085,0}-{11092,0}", + "npcs": "556", + "currency": "995", + "high_alch": "0" + }, + { + "id": "107", + "title": "Ali's Discount Wares.", + "general_store": "false", + "stock": "{1931,30}-{1935,10}-{1825,10}-{1833,10}-{1837,10}-{1925,30}-{4593,10}-{4591,10}-{970,1}-{946,10}-{590,10}-{1265,10}-{2138,10}", + "npcs": "1862", + "currency": "995", + "high_alch": "0" + }, + { + "id": "108", + "title": "Ali the Kebab Seller", + "general_store": "false", + "stock": "{1971,10}", + "npcs": "1865", + "currency": "995", + "high_alch": "0" + }, + { + "id": "109", + "title": "Karim", + "general_store": "false", + "stock": "{1971,10}", + "npcs": "543", + "currency": "995", + "high_alch": "0" + }, + { + "id": "110", + "title": "Kjut's KEbabs", + "general_store": "false", + "stock": "{1971,10}", + "npcs": "2198", + "currency": "995", + "high_alch": "0" + }, + { + "id": "111", + "title": "Mace Shop", + "general_store": "false", + "stock": "{1422,10}-{1420,10}-{1424,10}-{1428,10}-{1430,10}", + "npcs": "580", + "currency": "995", + "high_alch": "0" + }, + { + "id": "112", + "title": "Ali's Discount Wares#runes", + "general_store": "false", + "stock": "{1931,30}-{1935,10}-{1833,10}-{1837,10}-{1925,10}-{4593,10}-{4591,10}-{970,10}-{946,10}-{590,10}-{1265,10}-{2138,10}-{6416,10}-{4600,10}-{6416,10}-{4600,10}-{556,300}-{555,300}-{557,300}-{554,300}-{561,300}-{563,300}-{562,300}-{560,300}-{558,300}-{559,300}-{565,100}-{564,300}-{566,100}-{6382,30}-{6388,30}-{6390,30}-{1835,30}", + "npcs": "1862", + "currency": "995", + "high_alch": "0" + }, + { + "id": "113", + "title": "Betty's Magic Emporium", + "general_store": "false", + "stock": "{554,3000}-{555,3000}-{556,3000}-{557,3000}-{558,100}-{559,100}-{562,30}-{560,10}-{221,150}-{579,10}-{1017,10}", + "npcs": "583", + "currency": "995", + "high_alch": "0" + }, + { + "id": "114", + "title": "Aubury's Rune Shop", + "general_store": "false", + "stock": "{554,5000}-{555,5000}-{556,5000}-{557,5000}-{558,5000}-{559,5000}-{562,500}-{560,500}", + "npcs": "553", + "currency": "995", + "high_alch": "0" + }, + { + "id": "115", + "title": "Magic Guild Store", + "general_store": "false", + "stock": "{556,5000}-{555,5000}-{557,5000}-{554,5000}-{558,5000}-{559,5000}-{562,250}-{561,250}-{560,250}-{563,250}-{565,250}-{566,250}-{1391,5}-{1387,2}-{1383,2}-{1381,2}-{1385,2}", + "npcs": "461", + "currency": "995", + "high_alch": "0" + }, + { + "id": "116", + "title": "Baba Yaga's Magic Shop", + "general_store": "false", + "stock": "{556,1000}-{555,1000}-{557,1000}-{554,1000}-{558,1000}-{559,1000}-{562,300}-{561,300}-{560,300}-{563,100}-{565,100}-{566,100}-{9075,100}-{1391,20}-{1387,10}-{1383,10}-{1381,10}-{1385,10}-{9078,10}", + "npcs": "4513", + "currency": "995", + "high_alch": "0" + }, + { + "id": "117", + "title": "Mage Training Arena#rewards", + "general_store": "false", + "stock": "", + "npcs": "3097", + "currency": "995", + "high_alch": "0" + }, + { + "id": "118", + "title": "Lundail's Arena-side Rune Shop", + "general_store": "false", + "stock": "{554,1000}-{555,1000}-{556,1000}-{557,1000}-{558,1000}-{559,1000}-{561,300}-{562,300}-{563,100}-{564,300}-{560,300}", + "npcs": "903", + "currency": "995", + "high_alch": "0" + }, + { + "id": "119", + "title": "Tutab's Magical Market", + "general_store": "false", + "stock": "{554,1000}-{555,1000}-{556,1000}-{557,1000}-{563,100}-{4009,10}-{4006,10}-{4023,10}", + "npcs": "1435", + "currency": "995", + "high_alch": "0" + }, + { + "id": "120", + "title": "Void Knight Magic Store", + "general_store": "false", + "stock": "{554,1000}-{555,1000}-{556,1000}-{557,1000}-{558,1000}-{559,1000}-{562,300}-{560,300}", + "npcs": "3798", + "currency": "995", + "high_alch": "0" + }, + { + "id": "121", + "title": "Tzhaar-mej-roh's Rune Store", + "general_store": "false", + "stock": "{554,1000}-{555,1000}-{557,1000}-{556,1000}-{558,1000}-{559,1000}-{562,300}-{560,100}", + "npcs": "2623", + "currency": "6529", + "high_alch": "0" + }, + { + "id": "122", + "title": "Tzhaar-Hur-Lek's Ore and Gem Store.", + "general_store": "false", + "stock": "{438,5}-{436,5}-{440,2}-{442,0}-{453,0}-{444,0}-{447,0}-{449,0}-{451,0}-{1623,1}-{1621,1}-{1619,0}-{1617,0}-{1631,0}-{6571,1}-{9194,50}", + "npcs": "2622", + "currency": "6529", + "high_alch": "0" + }, + { + "id": "123", + "title": "Magic Guild Store", + "general_store": "false", + "stock": "{4089,1000}-{4091,1000}-{4093,1000}-{4095,1000}-{4097,1000}", + "npcs": "1658", + "currency": "995", + "high_alch": "0" + }, + { + "id": "124", + "title": "Nurmof's Pickaxe Shop", + "general_store": "false", + "stock": "{1265,10}-{1267,10}-{1269,10}-{1273,10}-{1271,10}-{1275,10}", + "npcs": "594", + "currency": "995", + "high_alch": "0" + }, + { + "id": "125", + "title": "Drogo's Mining Emporium", + "general_store": "false", + "stock": "{2347,10}-{1265,10}-{436,0}-{438,0}-{440,0}-{453,0}-{2349,0}-{2351,0}-{2357,0}", + "npcs": "579", + "currency": "995", + "high_alch": "0" + }, + { + "id": "126", + "title": "Pickaxe-is-mine", + "general_store": "false", + "stock": "{1265,10}-{1269,10}-{1273,10}-{1271,10}-{1275,10}", + "npcs": "2160", + "currency": "995", + "high_alch": "0" + }, + { + "id": "127", + "title": "Pet Shop", + "general_store": "false", + "stock": "{12130,10}-{12125,1000}-{12127,10}-{12183,125000}", + "npcs": "6750,6898,6893", + "currency": "995", + "high_alch": "0" + }, + { + "id": "128", + "title": "Zenesha's Platebody Shop", + "general_store": "false", + "stock": "{1117,10}-{1115,10}-{1119,10}-{1125,10}-{1121,10}", + "npcs": "589", + "currency": "995", + "high_alch": "0" + }, + { + "id": "129", + "title": "Horvik's Armour Shop", + "general_store": "false", + "stock": "{1103,10}-{1101,10}-{1173,10}-{1175,10}-{1075,10}-{1067,10}-{1087,10}-{1081,10}-{1117,10}-{1115,10}-{1119,10}-{1125,10}-{1121,10}", + "npcs": "549", + "currency": "995", + "high_alch": "0" + }, + { + "id": "130", + "title": "Armour Shop", + "general_store": "false", + "stock": "{1109,4}-{1159,4}-{1181,4}-{1197,4}-{1071,4}-{1085,4}-{1121,4}", + "npcs": "5485", + "currency": "995", + "high_alch": "0" + }, + { + "id": "131", + "title": "Louie's Armoured Legs Bazaar", + "general_store": "false", + "stock": "{1075,10}-{1067,10}-{1069,10}-{1077,10}-{1071,10}-{1073,10}", + "npcs": "542", + "currency": "995", + "high_alch": "0" + }, + { + "id": "132", + "title": "Horvik's Armour Shop", + "general_store": "false", + "stock": "{1103,10}-{1101,10}-{1173,10}-{1175,10}-{1075,10}-{1067,10}-{1087,10}-{1081,10}-{1117,10}-{1115,10}-{1119,10}-{1125,10}-{1121,10}", + "npcs": "549", + "currency": "995", + "high_alch": "0" + }, + { + "id": "133", + "title": "Seddus Adventurers Store", + "general_store": "false", + "stock": "{1093,10}-{1079,10}-{1113,10}-{1099,10}-{1193,10}", + "npcs": "3038", + "currency": "995", + "high_alch": "0" + }, + { + "id": "134", + "title": "Ranael's Super Skirt Store", + "general_store": "false", + "stock": "{1087,10}-{1081,10}-{1083,10}-{1089,10}-{1085,10}-{1091,10}", + "npcs": "544", + "currency": "995", + "high_alch": "0" + }, + { + "id": "135", + "title": "Zeke's Superior Scimitars", + "general_store": "false", + "stock": "{1321,10}-{1323,10}-{1325,10}-{1329,10}", + "npcs": "541", + "currency": "995", + "high_alch": "0" + }, + { + "id": "136", + "title": "Daga's Scimitar Smithy", + "general_store": "false", + "stock": "{1321,10}-{1323,10}-{1325,10}-{1329,10}-{4587,10}", + "npcs": "1434", + "currency": "995", + "high_alch": "0" + }, + { + "id": "137", + "title": "Shield Shop", + "general_store": "false", + "stock": "{1171,10}-{1173,10}-{1189,10}-{1175,10}-{1191,10}-{1177,10}-{1193,10}-{1181,10}", + "npcs": "577", + "currency": "995", + "high_alch": "0" + }, + { + "id": "138", + "title": "Multicannon parts for sale", + "general_store": "false", + "stock": "{6,5}-{8,5}-{10,5}-{12,5}-{5,5}-{4,5}", + "npcs": "209", + "currency": "995", + "high_alch": "0" + }, + { + "id": "139", + "title": "Spice Shop", + "general_store": "false", + "stock": "{1931,30}-{2169,10}-{5970,0}", + "npcs": "1980", + "currency": "995", + "high_alch": "0" + }, + { + "id": "140", + "title": "Staff Shop", + "general_store": "false", + "stock": "{1379,10}-{1389,10}-{1381,10}-{1383,10}-{1385,10}-{1387,10}-{2890,10}", + "npcs": "546", + "currency": "995", + "high_alch": "0" + }, + { + "id": "141", + "title": "Pikkupstix's Summoning Shop", + "general_store": "false", + "stock": "{12204,10}-{12207,10}-{12210,10}-{12213,10}-{12216,10}-{12219,10}-{12222,10}-{12183,125000}-{12155,5000}", + "npcs": "6971", + "currency": "995", + "high_alch": "0" + }, + { + "id": "142", + "title": "Bogrog's Summoning Shop", + "general_store": "false", + "stock": "{12204,10}-{12207,10}-{12210,10}-{12213,10}-{12216,10}-{12219,10}-{12222,10}-{12183,125000}-{12155,5000}", + "npcs": "6996", + "currency": "995", + "high_alch": "0" + }, + { + "id": "143", + "title": "Fortunato's Fine Wine", + "general_store": "false", + "stock": "{1993,10}-{1937,10}-{7919,10}-{1935,10}", + "npcs": "3671", + "currency": "995", + "high_alch": "0" + }, + { + "id": "144", + "title": "Gerrant's Fishy Business", + "general_store": "false", + "stock": "{303,10}-{307,10}-{309,10}-{311,1000}-{301,10}-{313,1000}-{314,1000}-{317,0}-{327,10}-{345,0}-{321,0}-{335,0}-{349,0}-{331,0}-{359,0}-{377,0}-{371,0}", + "npcs": "558", + "currency": "995", + "high_alch": "0" + }, + { + "id": "145", + "title": "Harry's Fishing Shop", + "general_store": "false", + "stock": "{303,10}-{307,10}-{311,1000}-{301,10}-{313,1000}-{305,10}-{317,0}-{327,0}-{345,0}-{353,0}-{341,0}-{321,0}-{359,0}-{377,0}-{363,0}-{371,0}-{383,0}-{7810,1000}", + "npcs": "576", + "currency": "995", + "high_alch": "0" + }, + { + "id": "146", + "title": "Blades By Urbi", + "general_store": "false", + "stock": "{1205,10}-{1203,10}-{1207,10}-{1217,0}-{1209,10}-{1211,10}-{1213,10}-{1215,0}-{1321,10}-{1323,10}-{1325,10}", + "npcs": "5266", + "currency": "995", + "high_alch": "0" + }, + { + "id": "147", + "title": "Gaiu's Two Handed Shop", + "general_store": "false", + "stock": "{1307,10}-{1309,10}-{1311,10}-{1313,10}-{1315,10}-{1317,10}", + "npcs": "586", + "currency": "995", + "high_alch": "0" + }, + { + "id": "148", + "title": "Gulluck And Sons", + "general_store": "false", + "stock": "{882,1000}-{877,300}-{880,0}-{841,10}-{837,10}-{1363,10}-{1365,10}-{1369,10}-{1307,10}-{1309,10}-{1311,10}-{1313,10}-{1315,10}-{1317,10}", + "npcs": "602", + "currency": "995", + "high_alch": "0" + }, + { + "id": "149", + "title": "Varrock Sword Shop", + "general_store": "false", + "stock": "{1277,10}-{1277,10}-{1279,10}-{1281,10}-{1283,10}-{1285,10}-{1287,10}-{1291,10}-{1293,10}-{1295,10}-{1297,10}-{1299,10}-{1301,10}-{1205,10}-{1203,10}-{1207,10}-{1217,10}-{1209,10}-{1211,10}", + "npcs": "552,551", + "currency": "995", + "high_alch": "0" + }, + { + "id": "150", + "title": "Zeke's Superior Scimitars", + "general_store": "false", + "stock": "{1321,10}-{1323,10}-{1325,10}-{1329,10}", + "npcs": "541", + "currency": "995", + "high_alch": "0" + }, + { + "id": "151", + "title": "Authentic Throwing Weapons", + "general_store": "false", + "stock": "{825,1000}-{826,1000}-{827,1000}-{828,300}-{829,100}-{830,100}-{800,900}-{801,800}-{802,700}-{803,600}-{804,500}-{805,400}", + "npcs": "692", + "currency": "995", + "high_alch": "0" + }, + { + "id": "152", + "title": "Happy Heroes Hemporium", + "general_store": "false", + "stock": "{1377,1}-{1434,1}", + "npcs": "797", + "currency": "995", + "high_alch": "0" + }, + { + "id": "153", + "title": "Jukat's Dragon Sword Shop", + "general_store": "false", + "stock": "{1305,2}-{1215,2}", + "npcs": "564", + "currency": "995", + "high_alch": "0" + }, + { + "id": "154", + "title": "Nardok's Bone Weapons", + "general_store": "false", + "stock": "{5018,10}-{5016,10}-{8872,10}-{8880,10}-{8882,25000}", + "npcs": "4312", + "currency": "995", + "high_alch": "0" + }, + { + "id": "155", + "title": "Quality Weapons Shop", + "general_store": "false", + "stock": "{1365,10}-{1369,10}-{1285,10}-{1287,10}-{1325,10}-{1297,10}-{1303,10}-{853,10}-{888,100}-{890,100}", + "npcs": "2152", + "currency": "995", + "high_alch": "0" + }, + { + "id": "156", + "title": "Quartermaster's Stores", + "general_store": "false", + "stock": "{1931,30}-{1935,10}-{1735,10}-{590,10}-{2309,10}-{3190,10}-{3192,10}-{3194,10}-{3196,10}-{3198,10}-{3200,10}-{3202,10}-{3204,10}", + "npcs": "1208", + "currency": "995", + "high_alch": "0" + }, + { + "id": "157", + "title": "Draynor Seed Marker", + "general_store": "false", + "stock": "{5318,0}-{5319,0}-{5324,0}-{5322,0}-{5320,0}-{5323,0}-{5321,0}-{5305,0}-{5306,5}-{5097,20}-{5096,20}-{5307,20}-{5308,5}-{5310,0}-{5311,0}", + "npcs": "2572,2233", + "currency": "995", + "high_alch": "0" + }, + { + "id": "158", + "title": "Romily Weaklax Pie's", + "general_store": "false", + "stock": "{2323,1}-{2325,1}-{2327,1}-{7178,1}-{7188,1}-{7198,1}", + "npcs": "3205", + "currency": "995", + "high_alch": "0" + }, + { + "id": "159", + "title": "Slayer Equipment", + "general_store": "false", + "stock": "{4155,50}-{4156,50}-{4158,50}-{4160,50000}-{4161,5000}-{4162,50}-{4164,50}-{4166,50}-{4168,50}-{4170,50}-{4551,50}-{6664,5000}-{6696,3000}-{6720,50}-{7051,50}-{7159,50}-{7421,50}-{7432,50}-{8923,50}-{10952,50}-{13279,5000}-{13278,3000}", + "npcs": "70,1598,1596,1597,1599,8274,8275,8276,8277,8273,8271,8270,2253", + "currency": "995", + "high_alch": "0" + }, + { + "id": "160", + "title": "Battle Runes", + "general_store": "false", + "stock": "{554,100}-{555,100}-{556,100}-{557,100}-{558,100}-{559,100}-{562,30}-{560,30}", + "npcs": "2257,2258,2259", + "currency": "995", + "high_alch": "0" + }, + { + "id": "161", + "title": "Smithing Smiths Shop", + "general_store": "false", + "stock": "{1321,10}-{1323,10}-{1325,10}-{1329,10}-{2347,10}", + "npcs": "3162", + "currency": "995", + "high_alch": "0" + }, + { + "id": "162", + "title": "Tamayu's Spear Stall", + "general_store": "false", + "stock": "{3188,10}", + "npcs": "1167", + "currency": "995", + "high_alch": "0" + }, + { + "id": "163", + "title": "Tzhaar-hur-tel's Equipment Store", + "general_store": "false", + "stock": "{6522,500}-{6525,1}-{6523,1}-{6524,1}-{6526,1}-{6527,1}-{6528,1}-{6568,1}", + "npcs": "2620", + "currency": "6529", + "high_alch": "0" + }, + { + "id": "164", + "title": "Vigr's Warhammers", + "general_store": "false", + "stock": "{1337,10}-{1335,10}-{1339,10}-{1341,10}-{1343,10}", + "npcs": "2151", + "currency": "995", + "high_alch": "0" + }, + { + "id": "165", + "title": "Weapons Galore", + "general_store": "false", + "stock": "{1315,10}-{1343,10}-{1369,10}-{1299,10}", + "npcs": "5486", + "currency": "995", + "high_alch": "0" + }, + { + "id": "166", + "title": "Construction supplies", + "general_store": "false", + "stock": "{8794,1000}-{8790,1000}-{4819,1000}-{4820,1000}-{1539,1000}", + "npcs": "4250", + "currency": "995", + "high_alch": "0" + }, + { + "id": "167", + "title": "The Toad and Chicken", + "general_store": "false", + "stock": "{1905,12}-{1907,12}-{1913,12}", + "npcs": "1079", + "currency": "995", + "high_alch": "0" + }, + { + "id": "168", + "title": "Martin Thwait's Lost and Found.", + "general_store": "false", + "stock": "{954,50}-{1523,25}-{1755,30}-{946,20}-{5560,25}-{864,15}-{863,10}-{865,5}-{3095,3}-{3096,2}-{3097,1}", + "npcs": "2270", + "currency": "995", + "high_alch": "0" + }, + { + "id": "169", + "title": "Diango's Toy Store", + "general_store": "false", + "stock": "{2526,10}-{2520,10}-{2522,10}-{2524,10}-{4613,10}-{12844,10}", + "npcs": "970", + "currency": "995", + "high_alch": "0" + }, + { + "id": "170", + "title": "The Shrimps and Parrot", + "general_store": "false", + "stock": "{347,5}-{339,5}-{379,5}-{373,6}-{3144,0}", + "npcs": "793", + "currency": "995", + "high_alch": "0" + }, + { + "id": "171", + "title": "Oziach's Armour", + "general_store": "false", + "stock": "{1127,2}-{1135,2}", + "npcs": "747", + "currency": "995", + "high_alch": "0" + }, + { + "id": "172", + "title": "Scavvo's Rune Store", + "general_store": "false", + "stock": "{1093,1}-{1079,1}-{1432,1}-{1113,1}-{1303,1}-{1289,1}-{1099,1}-{1065,1}-{1169,2}", + "npcs": "537", + "currency": "995", + "high_alch": "0" + }, + { + "id": "173", + "title": "Valaine's Shop of Champions.", + "general_store": "false", + "stock": "{1021,2}-{1165,1}-{1077,1}-{1123,1}", + "npcs": "536", + "currency": "995", + "high_alch": "0" + }, + { + "id": "174", + "title": "Bebadin Village Bartering", + "general_store": "true", + "stock": "{1823,30}-{1831,30}-{1937,10}-{1921,10}-{1929,10}-{946,10}-{2347,10}", + "npcs": "833", + "currency": "995", + "high_alch": "0" + }, + { + "id": "175", + "title": "Irksol", + "general_store": "false", + "stock": "{1641,5}", + "npcs": "566", + "currency": "995", + "high_alch": "0" + }, + { + "id": "176", + "title": "Mage Arena Staffs", + "general_store": "false", + "stock": "{2415,5}-{2416,5}-{2417,5}", + "npcs": "904", + "currency": "995", + "high_alch": "0" + }, + { + "id": "177", + "title": "Culinaromancer's Chest", + "general_store": "false", + "stock": "{1973,50}-{1982,50}-{1987,9}-{2283,1}-{1927,50}-{6697,50}-{2313,50}-{1973,50}-{1923,50}-{1931,50}-{1925,50}-{1985,50}-{1955,50}-{1933,50}-{1944,50}-{2130,50}-{2007,50}-{1887,50}-{1935,50}-{1980,50}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "178", + "title": "Culinaromancer's Chest", + "general_store": "false", + "stock": "{7453,5}-{7454,5}-{7455,5}-{7456,5}-{7457,5}-{7458,5}-{7459,5}-{7460,5}-{7461,5}-{7462,5}-{7433,5}-{7435,5}-{7437,5}-{7439,5}-{7441,5}-{7443,5}-{7445,5}-{7447,5}-{7449,5}-{7451,5}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "179", + "title": "Sir Tiffy Cashien", + "general_store": "false", + "stock": "{5574,10}-{5576,10}-{5575,10}-{9672,10}-{9676,10}-{9674,10}-{9678,10}", + "npcs": "2290", + "currency": "995", + "high_alch": "0" + }, + { + "id": "180", + "title": "Legends' Guild Shop of Useful Items", + "general_store": "false", + "stock": "{299,100}-{1542,5}-{1590,3}-{1052,1}-{2368,3}", + "npcs": "933", + "currency": "995", + "high_alch": "0" + }, + { + "id": "181", + "title": "MoonClan Fine Clothes", + "general_store": "false", + "stock": "{9068,10}-{9069,10}-{9070,10}-{9071,10}-{9072,10}-{9073,10}-{9074,10}-{1733,50}-{1734,500}", + "npcs": "4518", + "currency": "995", + "high_alch": "0" + }, + { + "id": "182", + "title": "Delicious Goods", + "general_store": "false", + "stock": "{2436,150000}-{2440,150000}-{2442,150000}-{2444,150000}-{3040,150000}-{2434,150000}-{3024,150000}-{2452,150000}-{6685,150000}-{9739,150000}-{385,150000}-{3144,150000}-{391,150000}-{7060,150000}-{7946,150000}-{379,150000}-{7218,150000}-{2301,150000}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "183", + "title": "Armour & Supplies", + "general_store": "false", + "stock": "{5698,150000}-{1305,150000}-{4587,150000}-{1377,150000}-{1434,150000}-{7158,150000}-{3204,150000}-{4151,150000}-{4153,150000}-{6528,150000}-{1333,150000}-{1319,150000}-{10887,150000}-{5574,150000}-{5575,150000}-{5576,150000}-{9672,150000}-{9674,150000}-{9676,150000}-{1067,150000}-{1115,150000}-{1153,150000}-{1079,150000}-{1127,150000}-{1163,150000}-{6107,150000}-{6109,150000}-{6108,150000}-{6524,150000}-{10828,150000}-{3751,150000}-{3753,150000}-{3105,150000}-{7460,150000}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "184", + "title": "Range Supplies", + "general_store": "false", + "stock": "{9241,150000}-{9243,150000}-{9242,150000}-{9244,150000}-{9245,150000}-{9144,150000}-{9305,150000}-{868,150000}-{11230,150000}-{6522,150000}-{892,150000}-{2491,150000}-{2497,150000}-{2503,150000}-{6328,150000}-{3749,150000}-{861,150000}-{9185,150000}-{4214,150000}-{1169,150000}-{1129,150000}-{10034,150000}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "185", + "title": "Magic Emporium", + "general_store": "false", + "stock": "{554,150000}-{555,150000}-{556,150000}-{557,150000}-{558,150000}-{559,150000}-{560,150000}-{561,150000}-{562,150000}-{563,150000}-{564,150000}-{565,150000}-{566,150000}-{9075,150000}-{4089,150000}-{4091,150000}-{4093,150000}-{4095,150000}-{4097,150000}-{4099,150000}-{4101,150000}-{4103,150000}-{4105,150000}-{4107,150000}-{4109,150000}-{4111,150000}-{4113,150000}-{4115,150000}-{4117,150000}-{6912,150000}-{3840,150000}-{3842,150000}-{3844,150000}-{1540,150000}-{2412,150000}-{2413,150000}-{2414,150000}-{4675,150000}-{2415,150000}-{2416,150000}-{2417,150000}-{577,150000}-{579,150000}-{2579,150000}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "186", + "title": "Neitiznot Supplies", + "general_store": "false", + "stock": "{946,10}-{2347,10}-{1734,10}-{1733,10}-{1351,10}-{1759,100}", + "npcs": "5509", + "currency": "995", + "high_alch": "0" + }, + { + "id": "187", + "title": "William's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4315,100}-{4335,100}-{4375,100}-{4395,100}", + "npcs": "1778", + "currency": "995", + "high_alch": "0" + }, + { + "id": "188", + "title": "Ian's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4317,100}-{4337,100}-{4357,100}-{4377,100}-{4397,100}", + "npcs": "1779", + "currency": "995", + "high_alch": "0" + }, + { + "id": "189", + "title": "Larry's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4319,100}-{4339,100}-{4359,100}-{4379,100}-{4399,100}", + "npcs": "1780", + "currency": "995", + "high_alch": "0" + }, + { + "id": "190", + "title": "Darren's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4321,100}-{4341,100}-{4361,100}-{4381,100}-{4401,100}", + "npcs": "1781", + "currency": "995", + "high_alch": "0" + }, + { + "id": "191", + "title": "Edward's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4323,100}-{4343,100}-{4363,100}-{4383,100}-{4403,100}", + "npcs": "1782", + "currency": "995", + "high_alch": "0" + }, + { + "id": "192", + "title": "Richard's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4325,100}-{4345,100}-{4365,100}-{4385,100}-{4405,100}", + "npcs": "1783", + "currency": "995", + "high_alch": "0" + }, + { + "id": "193", + "title": "Neil's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4327,100}-{4347,100}-{4367,100}-{4387,100}-{4407,100}", + "npcs": "1784", + "currency": "995", + "high_alch": "0" + }, + { + "id": "194", + "title": "Edmond's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4329,100}-{4349,100}-{4369,100}-{4389,100}-{4409,100}", + "npcs": "1785", + "currency": "995", + "high_alch": "0" + }, + { + "id": "195", + "title": "Simon's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4331,100}-{4351,100}-{4371,100}-{4391,100}-{4411,100}", + "npcs": "1786", + "currency": "995", + "high_alch": "0" + }, + { + "id": "196", + "title": "Sam's Wilderness Cape Shop", + "general_store": "false", + "stock": "{4333,100}-{4353,100}-{4373,100}-{4393,100}-{4413,100}", + "npcs": "1787", + "currency": "995", + "high_alch": "0" + }, + { + "id": "197", + "title": "Donator Island General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "198", + "title": "Candle Shop", + "general_store": "false", + "stock": "{36,10}-{38,10}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "200", + "title": "The Teleporter's Tabs", + "general_store": "false", + "stock": "{8007,100}-{8008,100}-{8009,100}-{8010,100}-{8011,100}-{8012,100}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "201", + "title": "The Fairy's Culinary Goods", + "general_store": "false", + "stock": "{330, 10000000}-{6706, 10000000}-{380, 10000000}-{7219, 10000000}-{2290, 10000000}-{2302, 10000000}-{1892, 10000000}-{229, 10000000}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "202", + "title": "The Wizard's Goods", + "general_store": "false", + "stock": "{554,10000000}-{555,10000000}-{556,10000000}-{557,10000000}-{558,10000000}-{559,10000000}-{562,10000000}-{560,10000000}-{563,10000000}-{14730,10000000}-{14732,10000000}-{14734,10000000}-{14736,10000000}-{14738,10000000}-{14740,10000000}-{11872,10}-{11960,10}-{11962,10}-{579,10}-{577,10}-{1011,10}-{1389,10}-{1381,10}-{1381,10}-{1383,10}-{1385,10}-{1387,10}-{4675,10}-{2890,10}-{9731,10}-{3755,10}-{1727,10}-{656, 10}-{658,10}-{660,10}-{662, 10}-{664,10}-{3839, 10}-{3841, 10}-{3843,10}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "203", + "title": "2009Scape Protective Goods", + "general_store": "false", + "stock": "{11814,10}-{11816,10}-{11818,10}-{11820,10}-{11822,10}-{11824, 10}-{11826,10}-{11828,10}-{11830,10}-{11832,10}-{11834,10}-{11836,10}-{11838,10}-{11840,10}-{3105,10}-{4119,10}-{4121,10}-{4123,10}-{4125,10}-{4127,10}-{4129,10}-{1725,10}-{1729,10}-{3751,10}-{3753,10}-{1149,10}-{542,10}-{544,10}-{5574,10}-{5575,10}-{5576,10}-{6106,10}-{6107,10}-{6108,10}-{6109,10}-{6110,10}-{6111,10}-{4502,10}-{7458,10}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "204", + "title": "2009Scape Weapon Store (Bronze - Mithril)", + "general_store": "false", + "stock": "{1205,10}-{1237,10}-{1265,10}-{1277,10}-{1291,10}-{1307,10}-{1321,10}-{1337,10}-{1351,10}-{1375,10}-{1203,10}-{1239,10}-{1267,10}-{1279,10}-{1293,10}-{1309,10}-{1323,10}-{1335,10}-{1349,10}-{1363,10}-{1207,10}-{1241,10}-{1269,10}-{1281,10}-{1295,10}-{1311,10}-{1325,10}-{1339,10}-{1353,10}-{1365,10}-{1209,10}-{1243,10}-{1273,10}-{1285,10}-{1299,10}-{1315,10}-{1329,10}-{1343,10}-{1355,10}-{1369,10}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "205", + "title": "2009Scape Weapon Store (Adamant - Dragon)", + "general_store": "false", + "stock": "{1211,10}-{1245,10}-{1271,10}-{1287,10}-{1301,10}-{1317,10}-{1331,10}-{1345,10}-{1357,10}-{1371,10}-{1213,10}-{1247,10}-{1275,10}-{1289,10}-{1303,10}-{1319,10}-{1333,10}-{1347,10}-{1359,10}-{1373,10}-{1215,10}-{4587,10}", + "npcs": "", + "currency": "995", + "high_alch": "0" + }, + { + "id": "206", + "title": "2009Scape Tool Store", + "general_store": "false", + "stock": "{1925,10}-{2347,10}-{590,10}-{946,10}-{952,10}-{301,10}-{305,10}-{307,10}-{309,10}-{311,10}-{313,1000}-{1734,10}-{233,10}-{1349,10}-{1353,10}-{1355,10}-{1267,10}-{1269,10}-{1271,10}-{1273,10}-{1734,100}-{1733,100}-{1779,1000}-{526, 500}-{532,500}", + "npcs": "8174", + "currency": "995", + "high_alch": "0" + }, + { + "id": "207", + "title": "2009Scape General Store", + "general_store": "true", + "stock": "{1931,30}-{1935,30}-{1735,10}-{1925,10}-{1923,10}-{1887,10}-{590,10}-{1755,10}-{2347,10}-{550,10}-{9003,10}", + "npcs": "7967,3039", + "currency": "995", + "high_alch": "0" + }, + { + "id": "208", + "title": "Hartwin's Longrange Tools", + "general_store": "false", + "stock": "{882,10000000}-{884,10000000}-{886,10000000}-{888,10000000}-{890,10000000}-{877,10000000}-{9140,10000000}-{9141,10000000}-{841,10}-{843,10}-{849,10}-{853,10}-{857,10}-{861,10}-{837,10}-{9177,10}-{9179,10}-{9181,10}-{9183,10}-{11864,10}-{11866,10}-{11868,10}-{11870,10}-{1063,10}-{1095,10}-{1129,10}-{1129,10}-{1131,10}-{1167,10}-{1133,10}-{1097,10}-{6328,10}-{3749,10}-{1478,10}-{8880,10}-{8882,10000000}-{863,10000000}", + "npcs": "8139", + "currency": "995", + "high_alch": "0" + }, + { + "id": "209", + "title": "Holy Wares", + "general_store": "false", + "stock": "{6746, 1}-{732, 100}", + "npcs": "1369", + "currency": "995", + "high_alch": "0" + }, + { + "id": "210", + "title": "Ranging Guild Ticket Exchange", + "general_store": "false", + "stock": "{47,10000000}-{1133,10000000}-{892,10000000}-{1169,10000000}-{1135,10000000}-{829,10000000}", + "npcs": "694", + "currency": "1464", + "high_alch": "0" + }, + { + "id": "211", + "title": "Rok's Choc Box", + "general_store": "false", + "stock": "{6794,30}-{1973,25}", + "npcs": "3045", + "currency": "995", + "high_alch": "0" + }, + { + "id": "212", + "title": "Ak-haranu's Exotic Goods", + "general_store": "false", + "stock": "{4740,100000}", + "npcs": "1688", + "currency": "995", + "high_alch": "0" + }, + { + "id": "213", + "title": "The Garden Centre", + "general_store": "false", + "stock": "{8417,1000}-{8419,1000}-{8421,1000}-{8423,1000}-{8425,1000}-{8427,1000}-{8429,1000}-{8431,1000}-{8433,1000}-{8435,1000}-{8451,1000}-{8453,1000}-{8455,1000}-{8457,1000}-{8459,1000}-{8461,1000}-{8437,1000}-{8439,1000}-{8441,1000}-{8443,1000}-{8445,1000}-{8447,1000}-{8449,1000}", + "npcs": "4251", + "currency": "995", + "high_alch": "0" + }, + { + "id": "214", + "title": "Rasolo's Goods", + "general_store": "false", + "stock": "{1969,2}-{2023,4}-{740,10}-{1215,1}-{550,1}-{583,2}-{1941,10}-{970,1}-{975,1}-{1599,1}-{2976,1}-{1823,1}-{1837,1}-{1864,5}-{2520,1}-{3377,1}-{626,1}-{1909,1}-{3787,1}-{3711,1}-{3678,1}-{3424,5}-{3420,1}-{5,1}", + "npcs": "1972", + "currency": "995", + "high_alch": "0" + }, + { + "id": "215", + "title": "Fishing Guild Shop", + "general_store": "false", + "stock": "{313,2000}-{314,1500}-{341,0}-{353,0}-{363,0}-{359,0}-{377,0}-{371,0}-{339,0}-{355,0}-{365,0}-{361,0}-{379,0}-{373,0}", + "npcs": "592", + "currency": "995", + "high_alch": "0" + }, + { + "id": "216", + "title": "Ore Store", + "general_store": "false", + "stock": "{436,20}-{438,10}-{440,10}-{442,5}-{453,10}-{444,5}-{447,0}-{449,0}", + "npcs": "5483", + "currency": "995", + "high_alch": "0" + }, + { + "id": "217", + "title": "Tony's Pizza Bases", + "general_store": "false", + "stock": "{2283,10}", + "npcs": "596", + "currency": "995", + "high_alch": "0" + }, + { + "id": "218", + "title": "Silver Cog Silver Stall", + "general_store": "false", + "stock": "{1714,2}-{442,1}-{2355,1}", + "npcs": "2159", + "currency": "995", + "high_alch": "0" + }, + { + "id": "219", + "title": "Carefree Crafting Stall", + "general_store": "false", + "stock": "{1755,2}-{1592,4}-{1597,2}-{1733,3}-{1734,100}-{1759,100}", + "npcs": "2158", + "currency": "995", + "high_alch": "0" + }, + { + "id": "220", + "title": "Keldagrim's Best Bread", + "general_store": "false", + "stock": "{2309,10}-{1891,3}-{1901,8}", + "npcs": "2156", + "currency": "995", + "high_alch": "0" + }, + { + "id": "221", + "title": "Quality Armour Shop", + "general_store": "false", + "stock": "{1105,3}-{1109,1}-{1107,1}-{1111,1}-{1141,3}-{1143,1}-{1145,1}-{1177,0}-{1195,0}", + "npcs": "2153", + "currency": "995", + "high_alch": "0" + }, + { + "id": "222", + "title": "Ore Shop", + "general_store": "false", + "stock": "{436,100}-{438,100}-{440,100}-{442,100}-{444,100}-{447,100}-{453,100}", + "npcs": "2564", + "currency": "995", + "high_alch": "0" + }, + { + "id": "223", + "title": "Funch's Fine Groceries", + "general_store": "false", + "stock": "{2021,10}-{2019,10}-{2015,10}-{2017,10}-{2114,10}-{2128,20}-{2108,20}-{2102,20}-{2126,5}-{2026,20}-{2017,10}-{2114,10}-{2128,10}-{2108,10}", + "npcs": "603", + "currency": "995", + "high_alch": "0" + }, + { + "id": "224", + "title": "Frincos' Fabulous Herb Store", + "general_store": "false", + "stock": "{229,100}-{227,10}-{233,4}-{221,3}", + "npcs": "578", + "currency": "995", + "high_alch": "0" + }, + { + "id": "225", + "title": "Port Khazard General Store", + "general_store": "false", + "stock": "{1941,inf}-{954,inf}-{583,inf}", + "npcs": "555", + "currency": "995", + "high_alch": "0" + }, + { + "id": "226", + "title": "Gabooty's Tai Bwo Wannai Cooperative", + "general_store": "false", + "stock": "{6341,10}-{6343,10}-{6345,10}-{6347,10}-{6349,10}-{6313,10}-{6315,10}-{6317,10}-{6351,10}-{6353,10}-{6355,10}-{6357,10}-{6359,10}-{1625,0}-{1627,0}-{1629,0}-{6361,10}-{6363,10}-{6365,10}-{6367,10}-{6369,10}-{1609,0}-{1611,0}-{1613,0}-{6371,10}-{6373,10}-{6375,10}-{6377,10}-{6379,10}-{6311,0}", + "npcs": "", + "currency": "6306", + "high_alch": "0" + }, + { + "id": "227", + "title": "Gabooty's Tai Bwo Drinky Store", + "general_store": "false", + "stock": "{2084,0}-{2092,0}-{2048,0}-{2054,0}-{2064,0}-{2074,0}", + "npcs": "", + "currency": "6306", + "high_alch": "0" + }, + { + "id": "227", + "title": "Agmundi Quality Clothes", + "general_store": "false", + "stock": "{5050,3}-{5052,3}-{5038,3}-{5040,3}-{5044,3}-{5046,3}-{5026,3}-{5028,3}-{5032,3}-{5034,3}", + "npcs": "2161", + "currency": "995", + "high_alch": "0" + } +] diff --git a/Server/data/configs/xteas.json b/Server/data/configs/xteas.json new file mode 100644 index 000000000..e8b3049ed --- /dev/null +++ b/Server/data/configs/xteas.json @@ -0,0 +1,5644 @@ +{ + "xteas": [ + { + "regionId": "6230", + "keys": "0,0,0,0" + }, + { + "regionId": "6231", + "keys": "0,0,0,0" + }, + { + "regionId": "6232", + "keys": "0,0,0,0" + }, + { + "regionId": "6234", + "keys": "-1591922206,-1429764510,-1087339341,1592935185" + }, + { + "regionId": "6473", + "keys": "-895585464,-461480444,-1851545592,-837241102" + }, + { + "regionId": "6475", + "keys": "779607549,1253385498,-2146148208,-1240685073" + }, + { + "regionId": "6484", + "keys": "0,0,0,0" + }, + { + "regionId": "6485", + "keys": "0,0,0,0" + }, + { + "regionId": "6486", + "keys": "0,0,0,0" + }, + { + "regionId": "6487", + "keys": "-844708758,693908396,-1724237422,-2131620302" + }, + { + "regionId": "6488", + "keys": "-285330291,1051990177,205476286,1929287225" + }, + { + "regionId": "6489", + "keys": "1563065045,-1659976681,-1630140039,908238605" + }, + { + "regionId": "6722", + "keys": "1365340377,429184662,-767507159,-1766554953" + }, + { + "regionId": "6725", + "keys": "-798347038,29419308,-1054119992,193134650" + }, + { + "regionId": "6726", + "keys": "-3492110,65044555,1450623668,-483811536" + }, + { + "regionId": "6732", + "keys": "0,0,0,0" + }, + { + "regionId": "6733", + "keys": "0,0,0,0" + }, + { + "regionId": "6734", + "keys": "0,0,0,0" + }, + { + "regionId": "6735", + "keys": "0,0,0,0" + }, + { + "regionId": "6736", + "keys": "0,0,0,0" + }, + { + "regionId": "6737", + "keys": "0,0,0,0" + }, + { + "regionId": "6738", + "keys": "0,0,0,0" + }, + { + "regionId": "6739", + "keys": "0,0,0,0" + }, + { + "regionId": "6740", + "keys": "0,0,0,0" + }, + { + "regionId": "6741", + "keys": "-1634995791,710519356,-47126463,-1180416882" + }, + { + "regionId": "6742", + "keys": "0,0,0,0" + }, + { + "regionId": "6743", + "keys": "-1239303400,-1604922847,-1532369005,982307785" + }, + { + "regionId": "6744", + "keys": "-496944733,-779028234,-230846664,150558918" + }, + { + "regionId": "6745", + "keys": "365190378,-1767339898,2011432030,276148826" + }, + { + "regionId": "6746", + "keys": "0,0,0,0" + }, + { + "regionId": "6979", + "keys": "0,0,0,0" + }, + { + "regionId": "6980", + "keys": "0,0,0,0" + }, + { + "regionId": "6981", + "keys": "0,0,0,0" + }, + { + "regionId": "6988", + "keys": "0,0,0,0" + }, + { + "regionId": "6989", + "keys": "-891749173,-113432144,-1228601828,695082558" + }, + { + "regionId": "6990", + "keys": "0,0,0,0" + }, + { + "regionId": "6991", + "keys": "-1448188175,626198836,1985989165,-1062391664" + }, + { + "regionId": "6992", + "keys": "793817707,983201574,1970817843,1370732667" + }, + { + "regionId": "6993", + "keys": "-932618963,243797238,-1433505613,-236523555" + }, + { + "regionId": "6994", + "keys": "1970708736,-245310471,1179446032,-620283247" + }, + { + "regionId": "6995", + "keys": "-1227889203,-199624313,2143494494,531356102" + }, + { + "regionId": "6996", + "keys": "0,0,0,0" + }, + { + "regionId": "6997", + "keys": "0,0,0,0" + }, + { + "regionId": "6998", + "keys": "0,0,0,0" + }, + { + "regionId": "6999", + "keys": "0,0,0,0" + }, + { + "regionId": "7000", + "keys": "0,0,0,0" + }, + { + "regionId": "7001", + "keys": "170738852,2045755396,-1580637869,-1933392334" + }, + { + "regionId": "7002", + "keys": "0,0,0,0" + }, + { + "regionId": "7235", + "keys": "0,0,0,0" + }, + { + "regionId": "7236", + "keys": "570290255,-1513898184,-1269691884,782850050" + }, + { + "regionId": "7237", + "keys": "0,0,0,0" + }, + { + "regionId": "7238", + "keys": "-853120516,1697831503,-12188711,770411534" + }, + { + "regionId": "7244", + "keys": "796665731,1335649913,758227393,585095755" + }, + { + "regionId": "7245", + "keys": "0,0,0,0" + }, + { + "regionId": "7246", + "keys": "0,0,0,0" + }, + { + "regionId": "7247", + "keys": "-122734679,-1029771956,1633683499,846700218" + }, + { + "regionId": "7248", + "keys": "-339349863,-706006976,1444664020,-668854242" + }, + { + "regionId": "7249", + "keys": "104968959,1007983047,-1342360496,1832152849" + }, + { + "regionId": "7250", + "keys": "497663526,-1258315657,-785166329,-999527877" + }, + { + "regionId": "7251", + "keys": "0,0,0,0" + }, + { + "regionId": "7252", + "keys": "0,0,0,0" + }, + { + "regionId": "7490", + "keys": "0,0,0,0" + }, + { + "regionId": "7491", + "keys": "0,0,0,0" + }, + { + "regionId": "7492", + "keys": "417150556,1135530200,2139696777,-742314409" + }, + { + "regionId": "7493", + "keys": "0,0,0,0" + }, + { + "regionId": "7494", + "keys": "-1653750072,103282771,384178856,1122166637" + }, + { + "regionId": "7496", + "keys": "-1890766195,-149577199,919306397,-954784877" + }, + { + "regionId": "7497", + "keys": "0,0,0,0" + }, + { + "regionId": "7498", + "keys": "0,0,0,0" + }, + { + "regionId": "7499", + "keys": "1187151706,718898064,1304406549,-1997198061" + }, + { + "regionId": "7500", + "keys": "-1797612105,-469426862,-1728147007,-646639650" + }, + { + "regionId": "7501", + "keys": "2127797097,-994429649,-35298241,-1340339542" + }, + { + "regionId": "7502", + "keys": "1592232730,1693978666,-878012906,867925201" + }, + { + "regionId": "7503", + "keys": "-895717823,-2040871288,1280251884,-1205523998" + }, + { + "regionId": "7504", + "keys": "-1824142464,-1651867367,-1541058541,-1034512274" + }, + { + "regionId": "7505", + "keys": "-1177354806,-1864641630,23736540,750869235" + }, + { + "regionId": "7506", + "keys": "0,0,0,0" + }, + { + "regionId": "7507", + "keys": "-1476331852,1093075535,-2003580146,734573751" + }, + { + "regionId": "7508", + "keys": "1640963123,1896768721,879048302,-1776414657" + }, + { + "regionId": "7509", + "keys": "-1575412129,-1725410171,-2003328048,1050396588" + }, + { + "regionId": "7510", + "keys": "2073894230,-553352720,274325814,-1461052837" + }, + { + "regionId": "7513", + "keys": "1066375195,548376104,-1771348528,1096433429" + }, + { + "regionId": "7745", + "keys": "1212560091,-662504525,-1213494614,-1245629284" + }, + { + "regionId": "7747", + "keys": "0,0,0,0" + }, + { + "regionId": "7748", + "keys": "-850453392,-249468744,1635462867,100471784" + }, + { + "regionId": "7749", + "keys": "369356966,-1038198212,282112206,802717032" + }, + { + "regionId": "7750", + "keys": "0,0,0,0" + }, + { + "regionId": "7752", + "keys": "1894158557,20416613,-1434347651,-1209846311" + }, + { + "regionId": "7753", + "keys": "2071150318,-1033460657,638407631,1622436805" + }, + { + "regionId": "7754", + "keys": "-1095536942,-1766628646,-829395519,716805082" + }, + { + "regionId": "7755", + "keys": "251339001,946355543,-1190230098,1528548224" + }, + { + "regionId": "7756", + "keys": "906056473,-2135922837,-855754671,-503357515" + }, + { + "regionId": "7757", + "keys": "-103936636,-6150806,-1262632665,1507740731" + }, + { + "regionId": "7758", + "keys": "1989884300,237012546,22566346,1351365126" + }, + { + "regionId": "7759", + "keys": "645523546,1835996818,-892497478,-366414132" + }, + { + "regionId": "7760", + "keys": "2042192998,743878512,-1804236758,-1160501924" + }, + { + "regionId": "7761", + "keys": "0,0,0,0" + }, + { + "regionId": "7762", + "keys": "0,0,0,0" + }, + { + "regionId": "7763", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "7764", + "keys": "0,0,0,0" + }, + { + "regionId": "7765", + "keys": "0,0,0,0" + }, + { + "regionId": "7769", + "keys": "560280774,910095015,871073102,263015376" + }, + { + "regionId": "7995", + "keys": "0,0,0,0" + }, + { + "regionId": "7996", + "keys": "0,0,0,0" + }, + { + "regionId": "7997", + "keys": "0,0,0,0" + }, + { + "regionId": "7998", + "keys": "0,0,0,0" + }, + { + "regionId": "8001", + "keys": "690512367,1578449236,-1443501555,546253393" + }, + { + "regionId": "8002", + "keys": "1597309277,469931771,1619035792,663887748" + }, + { + "regionId": "8003", + "keys": "0,0,0,0" + }, + { + "regionId": "8004", + "keys": "609107948,-755432209,-723012522,1175820911" + }, + { + "regionId": "8005", + "keys": "1334074196,-652454149,1601317454,469562426" + }, + { + "regionId": "8006", + "keys": "-148570664,-1136658706,-1902631968,-1188445291" + }, + { + "regionId": "8008", + "keys": "-997738189,-1761742229,-1676854941,-885390031" + }, + { + "regionId": "8009", + "keys": "-1466175704,351054294,-1150290302,-1555608739" + }, + { + "regionId": "8010", + "keys": "-120476958,772788582,297461207,-245665438" + }, + { + "regionId": "8011", + "keys": "1990004495,747113508,324107547,-123628033" + }, + { + "regionId": "8012", + "keys": "-207206478,596983639,-1721843709,-1184583849" + }, + { + "regionId": "8013", + "keys": "1846865793,1272334140,-253842269,-2073715507" + }, + { + "regionId": "8014", + "keys": "-1279878558,-211098870,431176504,-1619319528" + }, + { + "regionId": "8015", + "keys": "305015825,-634097708,865786116,-1850059578" + }, + { + "regionId": "8016", + "keys": "0,0,0,0" + }, + { + "regionId": "8017", + "keys": "959968310,-363819769,-1402232275,-1678358818" + }, + { + "regionId": "8018", + "keys": "0,0,0,0" + }, + { + "regionId": "8019", + "keys": "-1512999074,1064201012,2143076355,-1937376726" + }, + { + "regionId": "8020", + "keys": "-955989323,1284433026,690014510,2145912092" + }, + { + "regionId": "8021", + "keys": "-297039986,-1011877372,-1763869337,-900998253" + }, + { + "regionId": "8022", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "8025", + "keys": "400525614,1883669529,-440182999,-357730578" + }, + { + "regionId": "8240", + "keys": "2101719552,-225162086,293186389,-162955969" + }, + { + "regionId": "8241", + "keys": "-320813650,-1654452876,-352291520,-290946896" + }, + { + "regionId": "8251", + "keys": "1142567601,1650263019,49659607,-899246535" + }, + { + "regionId": "8252", + "keys": "-428244729,-903477551,-931984389,-583689232" + }, + { + "regionId": "8253", + "keys": "1274757849,1788985771,-1066826733,223495957" + }, + { + "regionId": "8254", + "keys": "-2072640345,1256455304,497449669,1898688910" + }, + { + "regionId": "8256", + "keys": "-591763830,-48757057,1738175039,232723115" + }, + { + "regionId": "8260", + "keys": "-357122149,-546918388,1659548066,2023267334" + }, + { + "regionId": "8262", + "keys": "937196178,1968517712,1697292009,-2036678778" + }, + { + "regionId": "8263", + "keys": "-1251027771,-846995999,1156602771,-1922080053" + }, + { + "regionId": "8264", + "keys": "-1819872894,1038324305,1342314979,-1220415324" + }, + { + "regionId": "8265", + "keys": "1850912058,-559075374,924054405,-1595809620" + }, + { + "regionId": "8266", + "keys": "-1571771132,-1956678912,-454057689,65399733" + }, + { + "regionId": "8267", + "keys": "-474856962,-1295973639,789657650,-1769058462" + }, + { + "regionId": "8268", + "keys": "0,0,0,0" + }, + { + "regionId": "8269", + "keys": "-497435078,2028988145,486156819,-1178938803" + }, + { + "regionId": "8270", + "keys": "832265044,-1682160790,1376131373,1516015571" + }, + { + "regionId": "8271", + "keys": "2011499665,-1820626075,-1349106171,1373054648" + }, + { + "regionId": "8272", + "keys": "-279193034,-753054903,626747605,-1887843183" + }, + { + "regionId": "8273", + "keys": "978831670,664328414,1943273766,-1823800887" + }, + { + "regionId": "8274", + "keys": "0,0,0,0" + }, + { + "regionId": "8275", + "keys": "0,0,0,0" + }, + { + "regionId": "8276", + "keys": "0,0,0,0" + }, + { + "regionId": "8277", + "keys": "0,0,0,0" + }, + { + "regionId": "8282", + "keys": "981025536,812353111,-688221351,-284141633" + }, + { + "regionId": "8496", + "keys": "-1397271211,-1829692174,-1138445890,-1384844481" + }, + { + "regionId": "8497", + "keys": "2127424498,1622469596,-1889017351,-1927651722" + }, + { + "regionId": "8498", + "keys": "-1323684593,-1102390619,1456317314,-2027993898" + }, + { + "regionId": "8499", + "keys": "1158999293,2131770333,-861122128,1149793504" + }, + { + "regionId": "8500", + "keys": "0,0,0,0" + }, + { + "regionId": "8506", + "keys": "-1227747958,1491928866,1293676120,2065870654" + }, + { + "regionId": "8507", + "keys": "1765022148,-80255262,-725852452,-1286377093" + }, + { + "regionId": "8508", + "keys": "-2081560462,-761421769,-880257396,-1678043286" + }, + { + "regionId": "8509", + "keys": "1177709231,-1828086540,-860279535,2071959242" + }, + { + "regionId": "8510", + "keys": "-1808638230,-1458952839,-798099535,1502725514" + }, + { + "regionId": "8514", + "keys": "-860052712,1822870800,-1847449751,-1914055926" + }, + { + "regionId": "8518", + "keys": "2036940233,1361257283,-1629264154,-858326595" + }, + { + "regionId": "8519", + "keys": "-2051430502,-746663069,-593970049,379050420" + }, + { + "regionId": "8520", + "keys": "76118065,2000660952,-1441067939,-1293828961" + }, + { + "regionId": "8521", + "keys": "-118666576,-7617915,708835107,-449427634" + }, + { + "regionId": "8522", + "keys": "-1916075284,1880898106,-1618113268,464036603" + }, + { + "regionId": "8523", + "keys": "-1203368702,359745318,-2127031319,-1802364988" + }, + { + "regionId": "8524", + "keys": "37036095,-259799144,-1679313180,74723020" + }, + { + "regionId": "8525", + "keys": "1128073531,987906789,1511073840,455662935" + }, + { + "regionId": "8526", + "keys": "17223090,-1297369957,1547271072,-1038573542" + }, + { + "regionId": "8527", + "keys": "1802043449,1098466035,-1011563733,-1036725278" + }, + { + "regionId": "8528", + "keys": "-1141049958,1626814655,206252937,924426084" + }, + { + "regionId": "8529", + "keys": "2008179575,1983086010,22167022,2114412614" + }, + { + "regionId": "8530", + "keys": "-1466808210,962381183,-1581244207,-457271917" + }, + { + "regionId": "8531", + "keys": "0,0,0,0" + }, + { + "regionId": "8532", + "keys": "1553260654,1996107908,-2124357970,1441816370" + }, + { + "regionId": "8533", + "keys": "0,0,0,0" + }, + { + "regionId": "8534", + "keys": "1712031920,299813553,484205392,-939092911" + }, + { + "regionId": "8545", + "keys": "1322297584,105544016,-1148309508,-574484176" + }, + { + "regionId": "8751", + "keys": "0,0,0,0" + }, + { + "regionId": "8752", + "keys": "238354066,1687454525,1494747147,1911377137" + }, + { + "regionId": "8753", + "keys": "-2045400446,-157254916,-1938039698,1143548881" + }, + { + "regionId": "8754", + "keys": "576590945,726748596,-159128087,905509251" + }, + { + "regionId": "8755", + "keys": "-1165798584,772244190,-402783978,541755309" + }, + { + "regionId": "8756", + "keys": "0,0,0,0" + }, + { + "regionId": "8757", + "keys": "0,0,0,0" + }, + { + "regionId": "8759", + "keys": "0,0,0,0" + }, + { + "regionId": "8760", + "keys": "0,0,0,0" + }, + { + "regionId": "8761", + "keys": "1760753095,-1427813077,266675077,-255782653" + }, + { + "regionId": "8762", + "keys": "-1868090282,-1544166661,-731821081,1736861342" + }, + { + "regionId": "8763", + "keys": "1119677832,690614046,2050117701,105876696" + }, + { + "regionId": "8764", + "keys": "1880374454,1213514336,-2078057600,-2021473694" + }, + { + "regionId": "8765", + "keys": "1948979312,134066799,-78879371,-323055687" + }, + { + "regionId": "8766", + "keys": "1244410566,-1397143615,-1848205088,-1435723900" + }, + { + "regionId": "8769", + "keys": "2044453226,-2064473213,1306128347,784973817" + }, + { + "regionId": "8770", + "keys": "2057744615,1697537962,528178774,-1047470804" + }, + { + "regionId": "8771", + "keys": "353086160,838307611,374264785,-686519866" + }, + { + "regionId": "8774", + "keys": "1016149511,-1118500660,-968978308,486472340" + }, + { + "regionId": "8775", + "keys": "-147836833,971452977,1498176968,-231259499" + }, + { + "regionId": "8776", + "keys": "-1754587844,664188970,-1128425220,59583193" + }, + { + "regionId": "8777", + "keys": "-137310003,1329143043,-669559936,-1913927786" + }, + { + "regionId": "8778", + "keys": "2142407721,-1514375765,1855937572,220818342" + }, + { + "regionId": "8779", + "keys": "-1680845199,-1149954104,-1177525481,-576614197" + }, + { + "regionId": "8780", + "keys": "0,0,0,0" + }, + { + "regionId": "8781", + "keys": "-2133721491,843228961,1706232103,-934369964" + }, + { + "regionId": "8782", + "keys": "-1567987347,-2104385976,443181406,-256058951" + }, + { + "regionId": "8783", + "keys": "412947427,-974210888,817804533,712249271" + }, + { + "regionId": "8784", + "keys": "-460994736,1511026573,402950670,-6026193" + }, + { + "regionId": "8785", + "keys": "1543774040,-487517297,-1630373503,102220753" + }, + { + "regionId": "8786", + "keys": "0,0,0,0" + }, + { + "regionId": "8787", + "keys": "1791798624,-1711313280,166719404,-1487207913" + }, + { + "regionId": "8788", + "keys": "0,0,0,0" + }, + { + "regionId": "8789", + "keys": "0,0,0,0" + }, + { + "regionId": "8790", + "keys": "230755787,-1139640838,-21592892,49661984" + }, + { + "regionId": "9006", + "keys": "0,0,0,0" + }, + { + "regionId": "9007", + "keys": "0,0,0,0" + }, + { + "regionId": "9008", + "keys": "2084752401,-1394447522,2084945842,1474596929" + }, + { + "regionId": "9009", + "keys": "898432013,1464425485,1479297637,1732705669" + }, + { + "regionId": "9010", + "keys": "1362096653,746663700,338872870,9791230" + }, + { + "regionId": "9011", + "keys": "-135370293,700991137,-1302596410,-1183796338" + }, + { + "regionId": "9012", + "keys": "1204696185,-486414605,-1016110497,134649113" + }, + { + "regionId": "9013", + "keys": "0,0,0,0" + }, + { + "regionId": "9014", + "keys": "0,0,0,0" + }, + { + "regionId": "9015", + "keys": "0,0,0,0" + }, + { + "regionId": "9016", + "keys": "-1274221467,730617286,-1448054569,427043430" + }, + { + "regionId": "9017", + "keys": "-518439975,-1388520826,203536985,1155539914" + }, + { + "regionId": "9018", + "keys": "-116231890,2037305449,-518154118,43034164" + }, + { + "regionId": "9019", + "keys": "-1293726217,-1696419000,-859948399,1059527576" + }, + { + "regionId": "9020", + "keys": "-1906040194,849367381,2098246444,1605043698" + }, + { + "regionId": "9021", + "keys": "-665917952,-432697139,-602494723,-2097936281" + }, + { + "regionId": "9025", + "keys": "1812159970,1795526437,1172074678,289074337" + }, + { + "regionId": "9026", + "keys": "-788500037,-1522730757,-651789033,304659146" + }, + { + "regionId": "9027", + "keys": "-2144855461,-75930625,1875031025,-2116300819" + }, + { + "regionId": "9032", + "keys": "-828656936,1072022787,-640768629,-1761240236" + }, + { + "regionId": "9033", + "keys": "-1516886192,1081198982,-1267611367,-339961975" + }, + { + "regionId": "9034", + "keys": "1874260326,1014701729,745849790,-1354790160" + }, + { + "regionId": "9035", + "keys": "1525685385,1372975156,-2010144170,-1594192581" + }, + { + "regionId": "9036", + "keys": "0,0,0,0" + }, + { + "regionId": "9037", + "keys": "0,0,0,0" + }, + { + "regionId": "9038", + "keys": "-473165893,2110570897,-1726275929,806180444" + }, + { + "regionId": "9040", + "keys": "0,0,0,0" + }, + { + "regionId": "9041", + "keys": "0,0,0,0" + }, + { + "regionId": "9042", + "keys": "0,0,0,0" + }, + { + "regionId": "9043", + "keys": "0,0,0,0" + }, + { + "regionId": "9044", + "keys": "1541894861,-2145670115,-138793212,-921922364" + }, + { + "regionId": "9045", + "keys": "1041036316,-2144924275,-1062048066,755505347" + }, + { + "regionId": "9046", + "keys": "1823337636,645784236,428459555,987429760" + }, + { + "regionId": "9048", + "keys": "-2078486774,831084557,-1515890598,-396794300" + }, + { + "regionId": "9049", + "keys": "1865420136,1880907821,-543917600,1097363521" + }, + { + "regionId": "9050", + "keys": "-1725663967,1678055280,1100896300,706957861" + }, + { + "regionId": "9109", + "keys": "0,0,0,0" + }, + { + "regionId": "9110", + "keys": "0,0,0,0" + }, + { + "regionId": "9111", + "keys": "0,0,0,0" + }, + { + "regionId": "9113", + "keys": "-570298090,-864625293,-668545435,8389096" + }, + { + "regionId": "9114", + "keys": "-962790446,-1706163576,82969599,310163719" + }, + { + "regionId": "9120", + "keys": "0,0,0,0" + }, + { + "regionId": "9121", + "keys": "0,0,0,0" + }, + { + "regionId": "9122", + "keys": "0,0,0,0" + }, + { + "regionId": "9262", + "keys": "-1327237404,-257519940,-1398355053,-970581711" + }, + { + "regionId": "9263", + "keys": "-1896898351,81121501,787229912,-904856097" + }, + { + "regionId": "9264", + "keys": "1517876710,1288106006,-319745194,1340771706" + }, + { + "regionId": "9265", + "keys": "1050111381,-276500917,1975172977,329246991" + }, + { + "regionId": "9266", + "keys": "2007797925,-1715573299,642190072,-662957526" + }, + { + "regionId": "9267", + "keys": "1811361377,-1208567174,103788086,-225339394" + }, + { + "regionId": "9268", + "keys": "1897267086,556470475,-1130589672,-743996492" + }, + { + "regionId": "9269", + "keys": "-1228579055,-1634436411,181074707,1831294115" + }, + { + "regionId": "9270", + "keys": "-1224224741,1755403824,128170045,498510702" + }, + { + "regionId": "9271", + "keys": "-875378602,-1077772187,594715960,-738079672" + }, + { + "regionId": "9272", + "keys": "-1755813275,373737884,1517748428,738184348" + }, + { + "regionId": "9273", + "keys": "-503076140,-319114908,-1349219228,1465453758" + }, + { + "regionId": "9274", + "keys": "1831263162,2092992846,-1206288816,831074245" + }, + { + "regionId": "9275", + "keys": "-350994118,-585442377,-1041480219,-1986244402" + }, + { + "regionId": "9276", + "keys": "-1624253043,1426176358,210641208,773759029" + }, + { + "regionId": "9277", + "keys": "272801923,1797149371,-131972865,1265002008" + }, + { + "regionId": "9283", + "keys": "0,0,0,0" + }, + { + "regionId": "9284", + "keys": "0,0,0,0" + }, + { + "regionId": "9285", + "keys": "1742241898,-1564206342,-460725435,1614032789" + }, + { + "regionId": "9286", + "keys": "0,0,0,0" + }, + { + "regionId": "9287", + "keys": "-272431907,639665846,-1633276264,1645937141" + }, + { + "regionId": "9288", + "keys": "1322101455,-912043509,-514354639,-977254423" + }, + { + "regionId": "9289", + "keys": "-1520212935,995884312,481657690,-9846292" + }, + { + "regionId": "9290", + "keys": "702687456,43635181,-1983533012,-319469910" + }, + { + "regionId": "9291", + "keys": "0,0,0,0" + }, + { + "regionId": "9292", + "keys": "0,0,0,0" + }, + { + "regionId": "9293", + "keys": "-810831340,-1857428683,-892017185,249052010" + }, + { + "regionId": "9294", + "keys": "990154613,2143262288,2039829180,-2089104408" + }, + { + "regionId": "9295", + "keys": "224580924,-858933614,-432602901,-1433710083" + }, + { + "regionId": "9296", + "keys": "0,0,0,0" + }, + { + "regionId": "9297", + "keys": "-1667110403,-655319123,-2124588845,-262291671" + }, + { + "regionId": "9298", + "keys": "0,0,0,0" + }, + { + "regionId": "9299", + "keys": "0,0,0,0" + }, + { + "regionId": "9300", + "keys": "644587156,-605721698,681391959,1688865408" + }, + { + "regionId": "9301", + "keys": "0,0,0,0" + }, + { + "regionId": "9304", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "9305", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "9306", + "keys": "1213624565,1443323179,2068217235,-1098243446" + }, + { + "regionId": "9362", + "keys": "-253025041,376209206,1663580032,1115549308" + }, + { + "regionId": "9363", + "keys": "0,0,0,0" + }, + { + "regionId": "9364", + "keys": "1350964684,-1141243546,-158288919,1853454502" + }, + { + "regionId": "9365", + "keys": "591308830,1667019329,-1039629756,738471651" + }, + { + "regionId": "9366", + "keys": "-1691974727,-1591730841,1506117200,822346809" + }, + { + "regionId": "9367", + "keys": "0,0,0,0" + }, + { + "regionId": "9368", + "keys": "-911562498,-1433720091,257702084,1652121807" + }, + { + "regionId": "9369", + "keys": "404061599,492688035,-1416873270,2021546702" + }, + { + "regionId": "9370", + "keys": "1867571226,-1557589414,74894252,-1402573358" + }, + { + "regionId": "9371", + "keys": "-1625040094,1138785379,-41923493,400034327" + }, + { + "regionId": "9372", + "keys": "1005996231,-569567890,-1578994771,-1136932414" + }, + { + "regionId": "9376", + "keys": "0,0,0,0" + }, + { + "regionId": "9377", + "keys": "-1671261866,-750153286,1731026368,-1501269926" + }, + { + "regionId": "9378", + "keys": "0,0,0,0" + }, + { + "regionId": "9515", + "keys": "0,0,0,0" + }, + { + "regionId": "9516", + "keys": "0,0,0,0" + }, + { + "regionId": "9517", + "keys": "0,0,0,0" + }, + { + "regionId": "9518", + "keys": "-557639005,398566091,-133936467,-850662847" + }, + { + "regionId": "9519", + "keys": "2045915867,843943848,1479393319,61248459" + }, + { + "regionId": "9520", + "keys": "-1534254084,-142177068,838351559,798595528" + }, + { + "regionId": "9521", + "keys": "-1756008730,1701620533,-579278885,1205797104" + }, + { + "regionId": "9522", + "keys": "1252542168,-1448059709,1122042436,-1636001244" + }, + { + "regionId": "9523", + "keys": "-1310187207,-834726064,-1799766719,1699616161" + }, + { + "regionId": "9524", + "keys": "-1209775078,-1209251210,-1747509150,90457302" + }, + { + "regionId": "9525", + "keys": "273717513,1026318281,-1648631650,-2024237038" + }, + { + "regionId": "9526", + "keys": "-946191110,746761324,810538817,107990300" + }, + { + "regionId": "9527", + "keys": "1148278078,-266468530,-243084816,-1561247930" + }, + { + "regionId": "9528", + "keys": "2102113094,1056838948,-1779359269,700318930" + }, + { + "regionId": "9529", + "keys": "727060780,-652255702,-1555170272,-2145386007" + }, + { + "regionId": "9530", + "keys": "-932232860,436123389,-658931046,2094924060" + }, + { + "regionId": "9531", + "keys": "-1745155259,444744719,2018327862,2021464472" + }, + { + "regionId": "9532", + "keys": "-1164282027,-620126230,1487448896,565185597" + }, + { + "regionId": "9533", + "keys": "1393307887,646464303,-1582337843,2048412434" + }, + { + "regionId": "9536", + "keys": "679931979,-1660801436,-1184954844,-1006016912" + }, + { + "regionId": "9539", + "keys": "-96476891,-1518725637,-1983538368,1621232019" + }, + { + "regionId": "9540", + "keys": "-489788621,2021133858,244677479,1058347252" + }, + { + "regionId": "9541", + "keys": "1352006827,1096305726,805420370,-1426885864" + }, + { + "regionId": "9542", + "keys": "0,0,0,0" + }, + { + "regionId": "9543", + "keys": "1852273964,-104833248,-2069080639,-188650169" + }, + { + "regionId": "9544", + "keys": "-2013112418,-1715158159,1261185685,1357880927" + }, + { + "regionId": "9545", + "keys": "1322297584,105544016,-1148309508,-574484176" + }, + { + "regionId": "9546", + "keys": "-257183655,-1481577287,-431332303,-242811730" + }, + { + "regionId": "9547", + "keys": "-1998382641,30700550,1548517068,-855708219" + }, + { + "regionId": "9548", + "keys": "0,0,0,0" + }, + { + "regionId": "9549", + "keys": "-1648136735,1402264941,639592027,348907048" + }, + { + "regionId": "9550", + "keys": "795472733,-1836130665,-1594549016,884470590" + }, + { + "regionId": "9551", + "keys": "-355590781,-1549463073,-46968616,648246695" + }, + { + "regionId": "9552", + "keys": "1925832709,39840626,683796237,-766329117" + }, + { + "regionId": "9553", + "keys": "-1873675730,-1930195432,759400017,-1395479956" + }, + { + "regionId": "9554", + "keys": "0,0,0,0" + }, + { + "regionId": "9555", + "keys": "0,0,0,0" + }, + { + "regionId": "9556", + "keys": "-300312374,-1152515846,-863452271,-1500855067" + }, + { + "regionId": "9557", + "keys": "0,0,0,0" + }, + { + "regionId": "9558", + "keys": "1245928204,-1892089406,-1321168410,-1108146443" + }, + { + "regionId": "9560", + "keys": "-628764335,1585475717,2036165620,-1921088167" + }, + { + "regionId": "9561", + "keys": "1291655395,-1426986127,1894534662,-1705749378" + }, + { + "regionId": "9562", + "keys": "-1047298777,1197811918,663745433,-2098029011" + }, + { + "regionId": "9619", + "keys": "0,0,0,0" + }, + { + "regionId": "9620", + "keys": "1941157140,-1630547377,-1114648519,87057467" + }, + { + "regionId": "9621", + "keys": "-1420915988,2069137101,1981379143,-252845225" + }, + { + "regionId": "9622", + "keys": "124513614,453662882,-154905102,-2103796118" + }, + { + "regionId": "9623", + "keys": "496891811,1091959696,690916089,588310866" + }, + { + "regionId": "9624", + "keys": "-1327451949,-476085243,-125348987,634827214" + }, + { + "regionId": "9625", + "keys": "632876038,913599309,1089335965,728823985" + }, + { + "regionId": "9626", + "keys": "-1411729186,1049744836,-1608961973,-1681145313" + }, + { + "regionId": "9627", + "keys": "0,0,0,0" + }, + { + "regionId": "9629", + "keys": "0,0,0,0" + }, + { + "regionId": "9630", + "keys": "0,0,0,0" + }, + { + "regionId": "9631", + "keys": "1266963397,269916041,734658458,725243574" + }, + { + "regionId": "9632", + "keys": "1023657558,-2001662423,-46679010,2064543607" + }, + { + "regionId": "9633", + "keys": "0,0,0,0" + }, + { + "regionId": "9634", + "keys": "0,0,0,0" + }, + { + "regionId": "9771", + "keys": "0,0,0,0" + }, + { + "regionId": "9772", + "keys": "-1742165439,-1273697376,2055229018,901215817" + }, + { + "regionId": "9773", + "keys": "465644643,-503279415,-1368947935,-1293998544" + }, + { + "regionId": "9774", + "keys": "-969323176,1775448370,1827500666,-2138545804" + }, + { + "regionId": "9775", + "keys": "1009031775,1977305970,-699602333,1802690745" + }, + { + "regionId": "9776", + "keys": "2000999142,205577043,-1417782040,-218453463" + }, + { + "regionId": "9777", + "keys": "821512120,-1253173249,-1078446427,-122269601" + }, + { + "regionId": "9778", + "keys": "85368686,-1059751721,-1008551161,-454427033" + }, + { + "regionId": "9779", + "keys": "-1158828855,-293580830,713180736,762257070" + }, + { + "regionId": "9780", + "keys": "-2067572823,-571539672,-976614369,-2016221403" + }, + { + "regionId": "9781", + "keys": "-2124931990,-1174347052,-1107047767,-1503661911" + }, + { + "regionId": "9782", + "keys": "963803363,-1625577381,-1515560012,797000049" + }, + { + "regionId": "9783", + "keys": "1785268065,-1215473770,1311222217,-1445453250" + }, + { + "regionId": "9784", + "keys": "1874487660,1635569708,-1949316626,-1920350613" + }, + { + "regionId": "9785", + "keys": "-65486938,-1485596203,-1327236566,408455718" + }, + { + "regionId": "9786", + "keys": "-2073791326,-155318773,-116282245,-1424900475" + }, + { + "regionId": "9787", + "keys": "218097749,1242681128,-2014981896,1175992711" + }, + { + "regionId": "9788", + "keys": "432135203,92254316,-1619550296,76065412" + }, + { + "regionId": "9789", + "keys": "-620749099,528872615,1976629038,667155751" + }, + { + "regionId": "9792", + "keys": "1500471532,1729075639,-304984137,1117230148" + }, + { + "regionId": "9794", + "keys": "1788083183,2097372895,1633476682,-589223611" + }, + { + "regionId": "9795", + "keys": "0,0,0,0" + }, + { + "regionId": "9796", + "keys": "517509106,-2019799796,1066150754,-676371780" + }, + { + "regionId": "9797", + "keys": "672333395,-284721288,262558790,-344798491" + }, + { + "regionId": "9798", + "keys": "0,0,0,0" + }, + { + "regionId": "9799", + "keys": "181886191,758691911,810524169,1456599388" + }, + { + "regionId": "9800", + "keys": "1230198769,708911105,-539692192,1126153482" + }, + { + "regionId": "9801", + "keys": "-1411921732,1651102545,-1826113310,-859079982" + }, + { + "regionId": "9802", + "keys": "209485096,602940753,2048389198,1202197220" + }, + { + "regionId": "9803", + "keys": "-1262437179,-1086288107,1393145472,-1318086655" + }, + { + "regionId": "9804", + "keys": "-439033034,-361310510,37875158,-1700152748" + }, + { + "regionId": "9805", + "keys": "-2114807953,-1293116867,-1013807366,-1068548578" + }, + { + "regionId": "9806", + "keys": "368995667,940146211,957819918,-761335591" + }, + { + "regionId": "9807", + "keys": "0,0,0,0" + }, + { + "regionId": "9808", + "keys": "308766586,-214665927,-1255727041,-1034716346" + }, + { + "regionId": "9809", + "keys": "-128763363,653932339,-1040336001,-372452691" + }, + { + "regionId": "9810", + "keys": "-752844904,1782384595,1054043870,282233468" + }, + { + "regionId": "9811", + "keys": "-929935426,1005492936,-2143736251,386758357" + }, + { + "regionId": "9812", + "keys": "50571970,-1762921782,-1667424270,524742325" + }, + { + "regionId": "9813", + "keys": "0,0,0,0" + }, + { + "regionId": "9814", + "keys": "-34428628,1940609264,-1638642159,-295486604" + }, + { + "regionId": "9874", + "keys": "-1211069631,-930191762,-1989737435,-1798369704" + }, + { + "regionId": "9875", + "keys": "991829915,-192761962,1424546941,2003334283" + }, + { + "regionId": "9876", + "keys": "1133268311,-1303891370,1138954157,-1069688346" + }, + { + "regionId": "9877", + "keys": "727463922,-941540275,874446728,-1678669133" + }, + { + "regionId": "9878", + "keys": "-664032051,-488667648,685343368,-1970848496" + }, + { + "regionId": "9879", + "keys": "921274725,1426716778,-1067082627,-1824724" + }, + { + "regionId": "9880", + "keys": "38957255,666017454,671177307,-803617279" + }, + { + "regionId": "9881", + "keys": "21755694,-1408974145,1341158791,-1638315086" + }, + { + "regionId": "9882", + "keys": "-440130527,495078969,2058162871,-510883365" + }, + { + "regionId": "9883", + "keys": "472234846,1198089044,500187071,239458328" + }, + { + "regionId": "9884", + "keys": "0,0,0,0" + }, + { + "regionId": "9885", + "keys": "0,0,0,0" + }, + { + "regionId": "9886", + "keys": "1515209815,-1457146379,-146402808,-1454274033" + }, + { + "regionId": "9887", + "keys": "0,0,0,0" + }, + { + "regionId": "9888", + "keys": "0,0,0,0" + }, + { + "regionId": "9889", + "keys": "0,0,0,0" + }, + { + "regionId": "10027", + "keys": "1491811841,1724263915,-1397066186,1733646819" + }, + { + "regionId": "10028", + "keys": "0,0,0,0" + }, + { + "regionId": "10029", + "keys": "203145796,-773666188,-569831878,-1510455793" + }, + { + "regionId": "10030", + "keys": "1533193920,-157056689,-1706395009,2060884310" + }, + { + "regionId": "10031", + "keys": "-1239300919,1798229092,-1044578379,493913447" + }, + { + "regionId": "10032", + "keys": "-855251381,1871716645,1835777659,2032052033" + }, + { + "regionId": "10033", + "keys": "1902138469,-641202141,715430361,2060827965" + }, + { + "regionId": "10034", + "keys": "-1435464304,-836439389,-788586899,1579582706" + }, + { + "regionId": "10035", + "keys": "0,0,0,0" + }, + { + "regionId": "10036", + "keys": "689954852,-1377739344,-847433475,-1883927289" + }, + { + "regionId": "10037", + "keys": "914357934,960797390,753237255,-1274576207" + }, + { + "regionId": "10038", + "keys": "-10852366,551587390,-821401504,-1151814286" + }, + { + "regionId": "10039", + "keys": "2005404778,-1913619257,-2029034667,-276727853" + }, + { + "regionId": "10040", + "keys": "-691368982,1823514267,-284316500,-1573696560" + }, + { + "regionId": "10041", + "keys": "1187862613,-117754960,130411769,-1192628982" + }, + { + "regionId": "10042", + "keys": "-1666575192,2084626585,2023809342,-1587593937" + }, + { + "regionId": "10043", + "keys": "1912880022,-1723964516,2062562401,-1162129761" + }, + { + "regionId": "10044", + "keys": "1044974347,726311355,-917896013,-1659516255" + }, + { + "regionId": "10045", + "keys": "-1429464298,1580360509,-1936477065,-337842786" + }, + { + "regionId": "10048", + "keys": "-1457016886,349941309,-400267403,-1711584223" + }, + { + "regionId": "10051", + "keys": "0,0,0,0" + }, + { + "regionId": "10052", + "keys": "0,0,0,0" + }, + { + "regionId": "10053", + "keys": "0,0,0,0" + }, + { + "regionId": "10054", + "keys": "0,0,0,0" + }, + { + "regionId": "10055", + "keys": "-813287484,-1417786621,-1794468339,578992617" + }, + { + "regionId": "10056", + "keys": "799806902,-1359852248,484436692,-1205184204" + }, + { + "regionId": "10057", + "keys": "1308484583,-2063649066,898275176,-860496835" + }, + { + "regionId": "10058", + "keys": "-504878866,1988421643,-1036984650,513341227" + }, + { + "regionId": "10059", + "keys": "1185163869,-1047826729,-1461057337,139139001" + }, + { + "regionId": "10060", + "keys": "0,0,0,0" + }, + { + "regionId": "10061", + "keys": "1683880127,1851133137,-567572662,-1477799312" + }, + { + "regionId": "10062", + "keys": "2024717410,-1807032706,1106507805,1426160484" + }, + { + "regionId": "10063", + "keys": "0,0,0,0" + }, + { + "regionId": "10064", + "keys": "1978019309,1433546802,-1989346624,-1611361553" + }, + { + "regionId": "10065", + "keys": "924349786,-326314365,-2042125189,1066401699" + }, + { + "regionId": "10066", + "keys": "105954939,-1741244981,-1491777272,207112205" + }, + { + "regionId": "10067", + "keys": "0,0,0,0" + }, + { + "regionId": "10068", + "keys": "-452138979,-1929816521,364996963,-1315825295" + }, + { + "regionId": "10069", + "keys": "-1669561589,-1287976882,1220187974,434661979" + }, + { + "regionId": "10070", + "keys": "337024788,-2037667137,-1229192681,72559338" + }, + { + "regionId": "10071", + "keys": "917431355,-1337694006,-1242762433,-1310804996" + }, + { + "regionId": "10073", + "keys": "-381328476,-448982838,1680944624,-2015809073" + }, + { + "regionId": "10074", + "keys": "-212532394,882343988,2089679345,-303180169" + }, + { + "regionId": "10075", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "10129", + "keys": "-1418181074,-681458464,2135343677,-1473942322" + }, + { + "regionId": "10130", + "keys": "-672924254,-1112220382,1225279473,1100576994" + }, + { + "regionId": "10131", + "keys": "2085292062,228024419,1890298036,1347089957" + }, + { + "regionId": "10132", + "keys": "-1019838423,-1536669319,-512064293,-1039678504" + }, + { + "regionId": "10133", + "keys": "1646350825,-289900492,-802244012,-1058372697" + }, + { + "regionId": "10134", + "keys": "-1343151186,-867897862,-1265011615,-389855656" + }, + { + "regionId": "10135", + "keys": "-642848772,814056528,923267823,-1753006596" + }, + { + "regionId": "10136", + "keys": "512428922,-1090392188,-1855405299,-966311133" + }, + { + "regionId": "10137", + "keys": "-1946240135,-1871060363,1675566259,-1820554947" + }, + { + "regionId": "10138", + "keys": "1254633881,-1405578656,1660494880,-748797494" + }, + { + "regionId": "10139", + "keys": "1226915855,1002704314,-440823591,-129555587" + }, + { + "regionId": "10140", + "keys": "-104825447,-1092637213,-105814713,-2129567531" + }, + { + "regionId": "10141", + "keys": "0,0,0,0" + }, + { + "regionId": "10142", + "keys": "1872120942,-765842959,449655176,-1168971827" + }, + { + "regionId": "10143", + "keys": "0,0,0,0" + }, + { + "regionId": "10144", + "keys": "265530509,2033515489,-2022406749,-591072091" + }, + { + "regionId": "10145", + "keys": "0,0,0,0" + }, + { + "regionId": "10280", + "keys": "-1245893544,-118079793,-1624599660,-626968532" + }, + { + "regionId": "10281", + "keys": "2129832996,-1542613289,-1612399066,-323592936" + }, + { + "regionId": "10282", + "keys": "667792020,292003472,-998896147,7080342" + }, + { + "regionId": "10283", + "keys": "-2133080221,1327669620,173304076,-151662318" + }, + { + "regionId": "10284", + "keys": "0,0,0,0" + }, + { + "regionId": "10285", + "keys": "-1317120534,1321149083,-1700628824,1028203235" + }, + { + "regionId": "10286", + "keys": "-1040445688,-7408505,807695839,226589344" + }, + { + "regionId": "10287", + "keys": "105887361,-945638691,1922834114,961561887" + }, + { + "regionId": "10288", + "keys": "-642909559,1719566555,1831536672,-1910524848" + }, + { + "regionId": "10289", + "keys": "-1592029672,503478145,-1207378954,-1502774843" + }, + { + "regionId": "10290", + "keys": "-587752684,-318735232,336724431,-1931735346" + }, + { + "regionId": "10291", + "keys": "0,0,0,0" + }, + { + "regionId": "10292", + "keys": "933507835,1135929795,-1932059890,1492191263" + }, + { + "regionId": "10293", + "keys": "-867083397,-512358173,1502490725,560653474" + }, + { + "regionId": "10294", + "keys": "1880113662,-767344332,-1364117989,-1128121945" + }, + { + "regionId": "10295", + "keys": "-1920480496,-1423914110,951774544,-1419269290" + }, + { + "regionId": "10296", + "keys": "-1699964827,1784080353,113260638,1213918121" + }, + { + "regionId": "10297", + "keys": "548003786,2085747240,921073357,127574933" + }, + { + "regionId": "10298", + "keys": "-233124901,1236532280,1418961777,2055047860" + }, + { + "regionId": "10299", + "keys": "-1615885118,-995676641,-1525013344,1823957481" + }, + { + "regionId": "10300", + "keys": "-988516294,-1280976850,904135114,1435032921" + }, + { + "regionId": "10301", + "keys": "-158146381,1698585677,-910760378,815929788" + }, + { + "regionId": "10302", + "keys": "639277786,-1909940120,130074677,491844814" + }, + { + "regionId": "10303", + "keys": "187236989,-1452229648,1948816476,-1775249280" + }, + { + "regionId": "10304", + "keys": "697091890,424251437,-890570835,-1490213215" + }, + { + "regionId": "10305", + "keys": "-1704965642,953513170,-906801121,1590671819" + }, + { + "regionId": "10307", + "keys": "-808294570,-945302681,-1122362002,76670054" + }, + { + "regionId": "10309", + "keys": "1853022849,1563769590,-839166,1806219482" + }, + { + "regionId": "10310", + "keys": "-1472463766,1824686108,888673126,2074633489" + }, + { + "regionId": "10311", + "keys": "-1976059860,922032078,-1950673483,394409071" + }, + { + "regionId": "10312", + "keys": "-736431800,2013006475,1225434861,59504107" + }, + { + "regionId": "10313", + "keys": "1731455740,156777644,-1031599999,799430192" + }, + { + "regionId": "10314", + "keys": "-2020182865,-861201399,1793241744,-541294677" + }, + { + "regionId": "10315", + "keys": "-1034094191,1810212216,618808107,1905492210" + }, + { + "regionId": "10316", + "keys": "0,0,0,0" + }, + { + "regionId": "10317", + "keys": "216403117,1910251124,144162918,224240414" + }, + { + "regionId": "10318", + "keys": "1053988597,-2121917140,1730755899,1549334321" + }, + { + "regionId": "10319", + "keys": "0,0,0,0" + }, + { + "regionId": "10320", + "keys": "0,0,0,0" + }, + { + "regionId": "10321", + "keys": "1996825886,-1552231723,1721080145,-869420516" + }, + { + "regionId": "10322", + "keys": "1773602876,-1410394076,-239593243,148286798" + }, + { + "regionId": "10323", + "keys": "0,0,0,0" + }, + { + "regionId": "10324", + "keys": "-1670587478,-401532783,1705875521,995683837" + }, + { + "regionId": "10325", + "keys": "0,0,0,0" + }, + { + "regionId": "10326", + "keys": "-375687378,472100528,-288941184,523344380" + }, + { + "regionId": "10329", + "keys": "1531226404,988304083,811017843,293412250" + }, + { + "regionId": "10330", + "keys": "654539047,-1306492503,-1808115050,768495826" + }, + { + "regionId": "10331", + "keys": "990721395,1603319590,-1050453751,-2054660152" + }, + { + "regionId": "10386", + "keys": "1123418142,-1191190798,-67920748,-964540310" + }, + { + "regionId": "10387", + "keys": "883942538,-1316327739,-409646311,1715503465" + }, + { + "regionId": "10388", + "keys": "1161495838,-228210135,405156354,-1914329414" + }, + { + "regionId": "10389", + "keys": "1232449212,-728763227,1729853683,-1383669718" + }, + { + "regionId": "10390", + "keys": "1529348981,363265179,-529329077,-1258205924" + }, + { + "regionId": "10391", + "keys": "1697636321,993503902,1432113433,-1040062313" + }, + { + "regionId": "10392", + "keys": "2130459982,-1301889773,1900862262,8338171" + }, + { + "regionId": "10393", + "keys": "-1385824102,-1224106775,2052804935,-259720956" + }, + { + "regionId": "10394", + "keys": "201272072,-1622948650,613159689,479293860" + }, + { + "regionId": "10395", + "keys": "-22365676,-607864450,1375198454,1650832425" + }, + { + "regionId": "10396", + "keys": "-1878072140,1648991920,1054624070,333445417" + }, + { + "regionId": "10397", + "keys": "0,0,0,0" + }, + { + "regionId": "10398", + "keys": "0,0,0,0" + }, + { + "regionId": "10399", + "keys": "0,0,0,0" + }, + { + "regionId": "10400", + "keys": "-1656816922,1318311812,-811481661,1625916625" + }, + { + "regionId": "10401", + "keys": "0,0,0,0" + }, + { + "regionId": "10536", + "keys": "349537117,1202512092,-698870718,-2083455397" + }, + { + "regionId": "10537", + "keys": "-1212814675,-1832622210,1483740828,1060911198" + }, + { + "regionId": "10538", + "keys": "-2091844157,-1013393743,1806920513,-1464143404" + }, + { + "regionId": "10539", + "keys": "-1468645226,1809562421,-1594801223,389468972" + }, + { + "regionId": "10540", + "keys": "1624468108,-1439095387,1193987877,1292402073" + }, + { + "regionId": "10541", + "keys": "1436392581,-334805062,1155918987,-305555465" + }, + { + "regionId": "10542", + "keys": "49999111,1615631158,-1317472464,893160897" + }, + { + "regionId": "10543", + "keys": "-1329281012,-1688960186,1798967251,1154324972" + }, + { + "regionId": "10544", + "keys": "1385633495,-1924761002,1040853985,475919579" + }, + { + "regionId": "10545", + "keys": "-1415752673,-1618131779,2102457954,-2055391607" + }, + { + "regionId": "10546", + "keys": "192659093,263441429,29086759,670094037" + }, + { + "regionId": "10547", + "keys": "0,0,0,0" + }, + { + "regionId": "10548", + "keys": "-1157394711,-1306553144,2105373539,798383108" + }, + { + "regionId": "10549", + "keys": "1318595669,-1886528715,150090497,1821415700" + }, + { + "regionId": "10550", + "keys": "-795923963,-1523185883,-1632108091,-59699166" + }, + { + "regionId": "10551", + "keys": "-50853484,-2121251994,717523561,-1277392698" + }, + { + "regionId": "10552", + "keys": "1638763153,-1813807494,-2075537642,109524290" + }, + { + "regionId": "10553", + "keys": "-177114588,-1502279412,1150652747,-2041470332" + }, + { + "regionId": "10554", + "keys": "1188457126,-1729374406,-799893645,1217674507" + }, + { + "regionId": "10555", + "keys": "298183408,-1907842333,1235195826,110456069" + }, + { + "regionId": "10556", + "keys": "1209135093,-27999571,778897676,-513558195" + }, + { + "regionId": "10557", + "keys": "-807815903,958215082,-647601710,1350072419" + }, + { + "regionId": "10558", + "keys": "1337729793,1717973268,-1721269042,-65511201" + }, + { + "regionId": "10559", + "keys": "905435949,206096000,694415949,384719862" + }, + { + "regionId": "10560", + "keys": "761635027,-136268132,1896585946,-1863372135" + }, + { + "regionId": "10564", + "keys": "1279522133,380240348,604239496,1759916207" + }, + { + "regionId": "10565", + "keys": "0,0,0,0" + }, + { + "regionId": "10566", + "keys": "221004409,1368318650,-1237341956,25411913" + }, + { + "regionId": "10567", + "keys": "-542823457,1281716081,-1533620503,-1571738600" + }, + { + "regionId": "10568", + "keys": "-1256077768,23520063,733929571,440341343" + }, + { + "regionId": "10569", + "keys": "1088282039,955053277,-1112053231,-1883141767" + }, + { + "regionId": "10570", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "10571", + "keys": "2044310497,1377055114,-357355629,1279109029" + }, + { + "regionId": "10572", + "keys": "-1375061166,-1411427241,-294467489,-2106748278" + }, + { + "regionId": "10573", + "keys": "0,0,0,0" + }, + { + "regionId": "10574", + "keys": "-1609693854,991245740,148787249,-1011766477" + }, + { + "regionId": "10575", + "keys": "434036980,-780702800,-1042242727,-354464628" + }, + { + "regionId": "10576", + "keys": "0,0,0,0" + }, + { + "regionId": "10577", + "keys": "824897954,-1807466644,2079017570,1299975025" + }, + { + "regionId": "10578", + "keys": "809464329,-292434275,-2009994217,1859510721" + }, + { + "regionId": "10579", + "keys": "-123618550,684067223,486273630,-1103816964" + }, + { + "regionId": "10580", + "keys": "0,0,0,0" + }, + { + "regionId": "10637", + "keys": "0,0,0,0" + }, + { + "regionId": "10638", + "keys": "616415398,-1155981361,-1520230064,482531809" + }, + { + "regionId": "10639", + "keys": "1174910426,137692025,-576373115,754439009" + }, + { + "regionId": "10640", + "keys": "811726333,-842125498,1799462193,-1151360401" + }, + { + "regionId": "10642", + "keys": "658277839,1898856178,-1037196236,1620289692" + }, + { + "regionId": "10643", + "keys": "1834436817,1391913024,-500731515,1550481150" + }, + { + "regionId": "10644", + "keys": "1308400341,760027142,1015620386,-1917480553" + }, + { + "regionId": "10645", + "keys": "573801874,1064182706,1692837876,-2084731388" + }, + { + "regionId": "10646", + "keys": "-180468483,-1085034165,1731369422,-1353138557" + }, + { + "regionId": "10647", + "keys": "-1503343410,-1634708207,-1757301917,-2003987513" + }, + { + "regionId": "10648", + "keys": "1512581514,-1121623940,-1861238740,1459885224" + }, + { + "regionId": "10649", + "keys": "1423886987,-1654331043,-678242006,1738009197" + }, + { + "regionId": "10650", + "keys": "-908578223,-911827513,1137573080,-419444146" + }, + { + "regionId": "10651", + "keys": "0,0,0,0" + }, + { + "regionId": "10652", + "keys": "1580722385,609745227,1407021351,1098485033" + }, + { + "regionId": "10653", + "keys": "570189753,-1700559836,2108215671,-701775893" + }, + { + "regionId": "10654", + "keys": "0,0,0,0" + }, + { + "regionId": "10655", + "keys": "0,0,0,0" + }, + { + "regionId": "10656", + "keys": "0,0,0,0" + }, + { + "regionId": "10657", + "keys": "0,0,0,0" + }, + { + "regionId": "10792", + "keys": "-125671574,254943715,1343095705,-1965171670" + }, + { + "regionId": "10793", + "keys": "-918820648,-575477272,1826808974,1583566620" + }, + { + "regionId": "10794", + "keys": "-62638721,-2055205851,-488702423,1198245579" + }, + { + "regionId": "10795", + "keys": "1763600957,-365178279,1448589605,-1883563545" + }, + { + "regionId": "10796", + "keys": "-1834928370,1352649164,765865015,1708785419" + }, + { + "regionId": "10797", + "keys": "1162623334,1082199860,2059929131,-2132110355" + }, + { + "regionId": "10798", + "keys": "487791818,49811808,-1421313612,1181040843" + }, + { + "regionId": "10799", + "keys": "1217726924,398085963,-1594428602,886790463" + }, + { + "regionId": "10800", + "keys": "1040846845,257923177,-1680471073,-1533314482" + }, + { + "regionId": "10801", + "keys": "850125851,1199386038,-1494136472,-1487577933" + }, + { + "regionId": "10802", + "keys": "0,0,0,0" + }, + { + "regionId": "10803", + "keys": "-1028081880,964144306,174845257,1906118817" + }, + { + "regionId": "10804", + "keys": "2044023784,-1099109846,-1909401127,-1304331091" + }, + { + "regionId": "10805", + "keys": "-1168385071,683797418,469816742,1479779110" + }, + { + "regionId": "10806", + "keys": "-1998000009,766783746,1340848604,-610487829" + }, + { + "regionId": "10807", + "keys": "-1978433603,-211738714,1401562605,-1310990578" + }, + { + "regionId": "10808", + "keys": "-1264729881,1766238888,-244541987,-605351538" + }, + { + "regionId": "10809", + "keys": "1586374012,-258505553,-528210036,1595850453" + }, + { + "regionId": "10810", + "keys": "-2030061920,-333031845,-792169278,597648394" + }, + { + "regionId": "10811", + "keys": "-1788784737,-1830208994,935346396,517118750" + }, + { + "regionId": "10812", + "keys": "90198727,258723745,748197903,-426406231" + }, + { + "regionId": "10813", + "keys": "78604466,-1582607088,691011324,-1155733133" + }, + { + "regionId": "10814", + "keys": "707246869,541333062,-986248348,-171063894" + }, + { + "regionId": "10815", + "keys": "2102925673,1133406202,-1885710196,165240951" + }, + { + "regionId": "10819", + "keys": "-904401587,-2054970579,55120674,-1889562804" + }, + { + "regionId": "10820", + "keys": "1391829934,487584817,397681771,-2002250378" + }, + { + "regionId": "10821", + "keys": "547864979,703484266,-571616416,-1277862770" + }, + { + "regionId": "10822", + "keys": "147390427,1823879919,432432207,-1107512174" + }, + { + "regionId": "10823", + "keys": "-626951011,-1729338061,-758591782,439072305" + }, + { + "regionId": "10824", + "keys": "-1104875422,66393069,-739286658,-254408159" + }, + { + "regionId": "10825", + "keys": "-1671459541,1278917254,1363778127,979691919" + }, + { + "regionId": "10826", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "10827", + "keys": "1032543297,-526372126,1157124086,-623019107" + }, + { + "regionId": "10828", + "keys": "1665018619,-1607107877,-1997272567,1342325223" + }, + { + "regionId": "10829", + "keys": "0,0,0,0" + }, + { + "regionId": "10830", + "keys": "-608096960,58771202,1174291927,-1613596249" + }, + { + "regionId": "10831", + "keys": "-1576700407,-806518664,-901641004,-573449068" + }, + { + "regionId": "10832", + "keys": "-644307702,-424113333,1143257020,1132671603" + }, + { + "regionId": "10833", + "keys": "-2021761641,-2091050426,1623160087,-1674608487" + }, + { + "regionId": "10834", + "keys": "-1640569486,-512141704,-1179536382,720004469" + }, + { + "regionId": "10835", + "keys": "0,0,0,0" + }, + { + "regionId": "10836", + "keys": "1637505449,619992365,-1935536269,-1526242295" + }, + { + "regionId": "10837", + "keys": "0,0,0,0" + }, + { + "regionId": "10838", + "keys": "1678881362,-952862831,-1804688659,-1247653912" + }, + { + "regionId": "10839", + "keys": "-885801393,-721089484,-1671928660,-391245118" + }, + { + "regionId": "10840", + "keys": "-2112185519,-1346264110,624078956,-426600771" + }, + { + "regionId": "10841", + "keys": "1553036338,2006573090,816979270,1677882458" + }, + { + "regionId": "10842", + "keys": "89140380,-204251076,-1595945414,1904801559" + }, + { + "regionId": "10893", + "keys": "-645277901,-963804189,-1583950082,1158107798" + }, + { + "regionId": "10894", + "keys": "344355193,729779647,-822390098,-250999551" + }, + { + "regionId": "10895", + "keys": "1704525734,-123453856,-2038510951,229741613" + }, + { + "regionId": "10896", + "keys": "1622301889,-1463258766,228869805,-1761890776" + }, + { + "regionId": "10897", + "keys": "-532884907,-856360437,-1856255648,-108994584" + }, + { + "regionId": "10898", + "keys": "1997981354,1569532835,1920365312,579258114" + }, + { + "regionId": "10899", + "keys": "889615956,-1979547812,1134305624,56186568" + }, + { + "regionId": "10900", + "keys": "-1475778003,1161941178,-130498235,-281971512" + }, + { + "regionId": "10901", + "keys": "675683066,1081382157,224642530,-1939264495" + }, + { + "regionId": "10902", + "keys": "1363034505,1752486270,-64629826,1887223207" + }, + { + "regionId": "10903", + "keys": "-1670827594,1280370415,789868677,2002317267" + }, + { + "regionId": "10904", + "keys": "-275061067,1527943046,1660873402,-995392725" + }, + { + "regionId": "10905", + "keys": "-1326091047,1551722893,1309735056,613553820" + }, + { + "regionId": "10906", + "keys": "-1078751493,160151975,937918565,-1173346878" + }, + { + "regionId": "10907", + "keys": "1703225431,-1175749730,1842579622,-1861290070" + }, + { + "regionId": "10908", + "keys": "-1924304925,-2143417334,-291856580,1774510860" + }, + { + "regionId": "10909", + "keys": "1594286276,-309059362,519622640,-2072561673" + }, + { + "regionId": "10910", + "keys": "-872445206,510847548,-334876446,355059661" + }, + { + "regionId": "10911", + "keys": "948965123,-545528654,-459191491,-860302360" + }, + { + "regionId": "10912", + "keys": "0,0,0,0" + }, + { + "regionId": "11049", + "keys": "-621090199,-1004888612,-749707219,2052444337" + }, + { + "regionId": "11050", + "keys": "467286343,-1173584329,1828950249,-347448684" + }, + { + "regionId": "11051", + "keys": "-296929555,609763351,-2080091577,-1042760897" + }, + { + "regionId": "11052", + "keys": "288578281,-2129494488,774599960,-1782292467" + }, + { + "regionId": "11053", + "keys": "280137623,-2139580445,-1330319011,-597364950" + }, + { + "regionId": "11054", + "keys": "-1668355981,-1569925814,-994250231,-2107802880" + }, + { + "regionId": "11055", + "keys": "374763347,-681855601,109012867,-1743182199" + }, + { + "regionId": "11056", + "keys": "-406501477,-543853643,1541426156,232589767" + }, + { + "regionId": "11057", + "keys": "-1133710777,-906783679,-1659353497,-298313847" + }, + { + "regionId": "11058", + "keys": "-721937224,-607011472,-1902697586,959894629" + }, + { + "regionId": "11059", + "keys": "-1379234654,-567015201,-213396057,-1450244676" + }, + { + "regionId": "11060", + "keys": "1341887290,-1539014214,-2027023574,329166812" + }, + { + "regionId": "11061", + "keys": "-803679875,-723408908,1383151372,-1231504848" + }, + { + "regionId": "11062", + "keys": "-555568759,1453374289,-14801609,96233628" + }, + { + "regionId": "11063", + "keys": "-64230628,1920227716,1652611857,-856220145" + }, + { + "regionId": "11064", + "keys": "564384282,-709585243,1613220025,-1038354302" + }, + { + "regionId": "11065", + "keys": "1933481202,893646018,1177862990,1245692325" + }, + { + "regionId": "11066", + "keys": "291008624,-1992710142,-1831766032,1925022398" + }, + { + "regionId": "11067", + "keys": "1192664190,-341042618,-820464572,602716622" + }, + { + "regionId": "11068", + "keys": "1956851882,1582504141,-1090835806,1413275925" + }, + { + "regionId": "11069", + "keys": "281072607,-1791037221,-1221626554,801634958" + }, + { + "regionId": "11070", + "keys": "1991482486,-631240020,-1616896556,-496223621" + }, + { + "regionId": "11071", + "keys": "1897069040,1886820064,-149588823,-386960868" + }, + { + "regionId": "11075", + "keys": "-822254379,1979001089,-222309885,1224296165" + }, + { + "regionId": "11077", + "keys": "-1820943973,1377081160,541237698,877059643" + }, + { + "regionId": "11078", + "keys": "368703258,1379906464,-1472415010,289347299" + }, + { + "regionId": "11079", + "keys": "506641326,1963199125,229965472,-982593319" + }, + { + "regionId": "11080", + "keys": "-1110513411,181454781,-448189547,-1724524157" + }, + { + "regionId": "11081", + "keys": "197573217,-913745315,648860964,1604781836" + }, + { + "regionId": "11082", + "keys": "-1048566284,-1888694855,1387988701,1385807517" + }, + { + "regionId": "11083", + "keys": "1255503855,-674022312,-807132804,-1287799121" + }, + { + "regionId": "11084", + "keys": "0,0,0,0" + }, + { + "regionId": "11085", + "keys": "327229160,-1433790638,1944433240,234034136" + }, + { + "regionId": "11086", + "keys": "0,0,0,0" + }, + { + "regionId": "11087", + "keys": "0,0,0,0" + }, + { + "regionId": "11088", + "keys": "-1943123304,1713176080,-1524844090,-445387865" + }, + { + "regionId": "11089", + "keys": "0,0,0,0" + }, + { + "regionId": "11090", + "keys": "2089067081,828176382,-1112393031,-1452165920" + }, + { + "regionId": "11091", + "keys": "977844365,-245927723,99303766,-735341354" + }, + { + "regionId": "11092", + "keys": "0,0,0,0" + }, + { + "regionId": "11093", + "keys": "-379710910,-2088433559,1180928189,-54938349" + }, + { + "regionId": "11094", + "keys": "1496438748,-566742834,585189704,2074216180" + }, + { + "regionId": "11095", + "keys": "-1020136454,1747944725,1987554618,-1828989591" + }, + { + "regionId": "11096", + "keys": "-592943404,1816311621,-1394660709,-627674752" + }, + { + "regionId": "11097", + "keys": "475166922,1503166866,-1819732882,2126974237" + }, + { + "regionId": "11098", + "keys": "79370033,-1930799782,2111330013,1328665449" + }, + { + "regionId": "11149", + "keys": "-673407424,-459515480,-1880462863,2096963221" + }, + { + "regionId": "11150", + "keys": "685385874,67618271,-450250419,-2086862875" + }, + { + "regionId": "11151", + "keys": "712251572,-97105648,-615552291,-1419987674" + }, + { + "regionId": "11152", + "keys": "110595890,-685885763,1230390297,1617167138" + }, + { + "regionId": "11153", + "keys": "1133518437,1160845567,1259706301,-190274103" + }, + { + "regionId": "11154", + "keys": "-1390672245,-294524193,1901848082,-1240329686" + }, + { + "regionId": "11155", + "keys": "740691311,-158757873,133181481,775561317" + }, + { + "regionId": "11156", + "keys": "-122332432,-2135770681,826741763,-578793086" + }, + { + "regionId": "11157", + "keys": "-1366388735,-378058761,-1560378292,-1001591092" + }, + { + "regionId": "11158", + "keys": "160361538,733169435,1244326761,1681727551" + }, + { + "regionId": "11159", + "keys": "0,0,0,0" + }, + { + "regionId": "11160", + "keys": "0,0,0,0" + }, + { + "regionId": "11161", + "keys": "-1713920755,1291269906,320754968,741637543" + }, + { + "regionId": "11162", + "keys": "-2108680437,-1260585402,-1400451285,2023092270" + }, + { + "regionId": "11163", + "keys": "-1890796698,-611617711,-1429163994,-740772710" + }, + { + "regionId": "11164", + "keys": "1046978961,-977367474,1204218608,554630994" + }, + { + "regionId": "11165", + "keys": "1783387115,1062643659,254207637,-280202231" + }, + { + "regionId": "11166", + "keys": "1534808050,-1895827266,489865723,1605171942" + }, + { + "regionId": "11167", + "keys": "-1735216162,2141149053,57787230,-1263840909" + }, + { + "regionId": "11168", + "keys": "0,0,0,0" + }, + { + "regionId": "11305", + "keys": "-1429346525,-118378130,1002549662,1383588995" + }, + { + "regionId": "11306", + "keys": "-215265871,-2043332955,304105107,1443631953" + }, + { + "regionId": "11307", + "keys": "-530572214,1137382838,1524205137,-1364477332" + }, + { + "regionId": "11308", + "keys": "313027206,-1690946376,-43334224,216984734" + }, + { + "regionId": "11309", + "keys": "480918720,-1760104027,-1096191521,-1751168810" + }, + { + "regionId": "11310", + "keys": "581450375,550120818,-1633145086,862987872" + }, + { + "regionId": "11311", + "keys": "2122993198,-483099438,-1947019175,453102954" + }, + { + "regionId": "11312", + "keys": "-1046696594,1468533694,2085200066,-828502933" + }, + { + "regionId": "11313", + "keys": "910266570,2031866974,-1478026252,-1294052037" + }, + { + "regionId": "11314", + "keys": "1798320089,-1598590173,-1563649785,173183318" + }, + { + "regionId": "11315", + "keys": "669874829,-776374692,-285442682,-2063742845" + }, + { + "regionId": "11316", + "keys": "-2133481275,1183956887,-282614520,-1763887981" + }, + { + "regionId": "11317", + "keys": "-607461440,-208518302,-1370277091,1586835768" + }, + { + "regionId": "11318", + "keys": "-214781882,-1242534505,308650486,1398014950" + }, + { + "regionId": "11319", + "keys": "-561547561,-1342850556,-903509942,-570987704" + }, + { + "regionId": "11320", + "keys": "-346856430,-716818566,-1629533789,-835719555" + }, + { + "regionId": "11321", + "keys": "699352627,-565777108,-1385571111,636180354" + }, + { + "regionId": "11322", + "keys": "-1539862936,-1377050431,1392963326,-711921559" + }, + { + "regionId": "11323", + "keys": "-1710808226,725482732,1863997544,5983834" + }, + { + "regionId": "11324", + "keys": "0,0,0,0" + }, + { + "regionId": "11326", + "keys": "1862093150,1696245244,1320714102,1241887579" + }, + { + "regionId": "11329", + "keys": "1852262545,929814037,831292048,-138159629" + }, + { + "regionId": "11331", + "keys": "630464144,-872867374,2001047906,-12413476" + }, + { + "regionId": "11332", + "keys": "-936631483,-1093055133,-161202591,-1476364681" + }, + { + "regionId": "11333", + "keys": "0,0,0,0" + }, + { + "regionId": "11334", + "keys": "0,0,0,0" + }, + { + "regionId": "11335", + "keys": "-133492081,-915358326,-714649892,-2093709476" + }, + { + "regionId": "11338", + "keys": "0,0,0,0" + }, + { + "regionId": "11339", + "keys": "140118336,-1920268877,-1967576060,-1437209189" + }, + { + "regionId": "11340", + "keys": "0,0,0,0" + }, + { + "regionId": "11341", + "keys": "-1219163353,-1635920416,-2124217842,-1318908036" + }, + { + "regionId": "11343", + "keys": "1857048515,-1771448269,265497055,1368981799" + }, + { + "regionId": "11345", + "keys": "-1311889529,-1925291147,-1246770062,-343643022" + }, + { + "regionId": "11346", + "keys": "-750575261,-297404295,354820348,2031661388" + }, + { + "regionId": "11347", + "keys": "-122396964,-1996200666,-585000602,-863390951" + }, + { + "regionId": "11348", + "keys": "0,0,0,0" + }, + { + "regionId": "11349", + "keys": "0,0,0,0" + }, + { + "regionId": "11350", + "keys": "-1365557009,-1350738529,-1074800707,-446118748" + }, + { + "regionId": "11351", + "keys": "-1227666214,990739070,758255446,-410679401" + }, + { + "regionId": "11352", + "keys": "-76693830,-865206807,384409960,1285997763" + }, + { + "regionId": "11353", + "keys": "1903451400,172495816,-26951355,-2020198034" + }, + { + "regionId": "11354", + "keys": "-104997214,-1634014788,-392797186,-941769095" + }, + { + "regionId": "11356", + "keys": "2033204014,1416145849,-1721330996,2134394884" + }, + { + "regionId": "11405", + "keys": "0,0,0,0" + }, + { + "regionId": "11406", + "keys": "375301159,353365492,-940259891,-223647771" + }, + { + "regionId": "11407", + "keys": "0,0,0,0" + }, + { + "regionId": "11408", + "keys": "0,0,0,0" + }, + { + "regionId": "11409", + "keys": "1937092760,-1545935537,29954084,-1081016062" + }, + { + "regionId": "11410", + "keys": "1509299526,-892391942,1485831814,1255407038" + }, + { + "regionId": "11411", + "keys": "0,0,0,0" + }, + { + "regionId": "11412", + "keys": "-1379772393,621580805,-316850307,1026773740" + }, + { + "regionId": "11413", + "keys": "1488866121,-484754573,-1471688962,-511348808" + }, + { + "regionId": "11414", + "keys": "1377762353,1699445159,1913215037,1606010259" + }, + { + "regionId": "11415", + "keys": "1136524726,-1672016136,-1498346497,-1411607834" + }, + { + "regionId": "11416", + "keys": "1424707743,282141552,464542584,1000633084" + }, + { + "regionId": "11417", + "keys": "1581021494,-1994945510,-177217961,455201014" + }, + { + "regionId": "11418", + "keys": "161282524,-561691741,-293028043,-1466220307" + }, + { + "regionId": "11419", + "keys": "-1254692109,-721963897,1982559036,2090401358" + }, + { + "regionId": "11420", + "keys": "1847735585,-1694492924,1127165320,-479409843" + }, + { + "regionId": "11421", + "keys": "986943416,-2110784934,1490597490,1999343527" + }, + { + "regionId": "11422", + "keys": "-843901847,-337979146,-867731076,-342235410" + }, + { + "regionId": "11423", + "keys": "437777194,-1226666437,1806502066,2032844071" + }, + { + "regionId": "11424", + "keys": "807879302,-1555822450,-271595686,-1725049162" + }, + { + "regionId": "11559", + "keys": "16777217,1717961767,50359296,1634336841" + }, + { + "regionId": "11561", + "keys": "-591558979,1108648192,1263458446,2058484886" + }, + { + "regionId": "11562", + "keys": "1623115614,841254570,365391355,629444052" + }, + { + "regionId": "11563", + "keys": "-2086554592,-933774380,-1450605238,-515013992" + }, + { + "regionId": "11564", + "keys": "1353274200,1339785802,-1572198107,1935847233" + }, + { + "regionId": "11565", + "keys": "-137041923,-1569836238,18743223,-1472669397" + }, + { + "regionId": "11566", + "keys": "575328672,-285813481,-1608888020,-1018793466" + }, + { + "regionId": "11567", + "keys": "-1044081427,53182148,606084353,909523725" + }, + { + "regionId": "11568", + "keys": "90223196,-1877968085,962102514,1727463305" + }, + { + "regionId": "11569", + "keys": "1995103132,954046526,-736090037,-1261975818" + }, + { + "regionId": "11570", + "keys": "1764463961,-1394011513,841104317,1009452619" + }, + { + "regionId": "11571", + "keys": "555412042,1365420838,-819421250,-281395793" + }, + { + "regionId": "11572", + "keys": "892185929,686162443,1793819023,-992991976" + }, + { + "regionId": "11573", + "keys": "0,0,0,0" + }, + { + "regionId": "11574", + "keys": "-1406155502,13961326,1071473330,1528558089" + }, + { + "regionId": "11575", + "keys": "-388816502,637165039,-1660550531,1252748078" + }, + { + "regionId": "11576", + "keys": "-653186907,1743653193,1590707166,841079490" + }, + { + "regionId": "11577", + "keys": "1283493672,1550135524,-1621670256,769418438" + }, + { + "regionId": "11578", + "keys": "0,0,0,0" + }, + { + "regionId": "11579", + "keys": "-719996638,-1831948234,494156672,1684753309" + }, + { + "regionId": "11580", + "keys": "0,0,0,0" + }, + { + "regionId": "11581", + "keys": "0,0,0,0" + }, + { + "regionId": "11582", + "keys": "602331327,-1036793753,1702673112,-1107214996" + }, + { + "regionId": "11585", + "keys": "-2002677198,-1770151217,-1572915128,2094989518" + }, + { + "regionId": "11586", + "keys": "925071192,-1288796869,51183037,-115462507" + }, + { + "regionId": "11587", + "keys": "1618637156,924324919,-706966841,209620280" + }, + { + "regionId": "11588", + "keys": "-519511661,-159682581,-172209167,-816666339" + }, + { + "regionId": "11589", + "keys": "39678032,469576041,-1878694956,-1720799345" + }, + { + "regionId": "11590", + "keys": "0,0,0,0" + }, + { + "regionId": "11591", + "keys": "1300749474,-912770362,-1665451776,480747745" + }, + { + "regionId": "11592", + "keys": "0,0,0,0" + }, + { + "regionId": "11593", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "11594", + "keys": "477395683,539436779,-1560356372,-1102990030" + }, + { + "regionId": "11595", + "keys": "-1497259084,-1208341848,874209282,-1950133061" + }, + { + "regionId": "11596", + "keys": "0,0,0,0" + }, + { + "regionId": "11597", + "keys": "-824244627,-1750674106,-2032396270,-451550546" + }, + { + "regionId": "11598", + "keys": "0,0,0,0" + }, + { + "regionId": "11599", + "keys": "-1124938025,110281395,-1121479364,68953473" + }, + { + "regionId": "11600", + "keys": "0,0,0,0" + }, + { + "regionId": "11601", + "keys": "722657934,1495340205,-437272583,-1331954618" + }, + { + "regionId": "11602", + "keys": "-1830335785,-544748254,-190875166,1866682430" + }, + { + "regionId": "11603", + "keys": "-254635141,-1757221941,-2072225761,-752948578" + }, + { + "regionId": "11604", + "keys": "0,0,0,0" + }, + { + "regionId": "11605", + "keys": "57037316,1119657363,2040370510,801474589" + }, + { + "regionId": "11606", + "keys": "-1790275662,-1050505330,-1496410655,679769180" + }, + { + "regionId": "11607", + "keys": "0,0,0,0" + }, + { + "regionId": "11608", + "keys": "248039728,1861834308,1335200688,317723667" + }, + { + "regionId": "11609", + "keys": "-1581925228,-215021003,-1695323698,-1853661356" + }, + { + "regionId": "11610", + "keys": "0,0,0,0" + }, + { + "regionId": "11612", + "keys": "-1751954695,954770889,-337304771,986015401" + }, + { + "regionId": "11664", + "keys": "1190807823,1104329472,374421371,1684960233" + }, + { + "regionId": "11665", + "keys": "1421755107,-1753781642,148994094,-1190683420" + }, + { + "regionId": "11666", + "keys": "-341360024,-822905169,-778532221,-885891559" + }, + { + "regionId": "11667", + "keys": "-1991130334,-1460099297,758552332,1913132025" + }, + { + "regionId": "11668", + "keys": "-257024301,-661941375,-687408097,-1243612535" + }, + { + "regionId": "11669", + "keys": "-2019291079,1299725119,2078401543,-99676412" + }, + { + "regionId": "11670", + "keys": "549318992,1085934989,710708603,-1635474946" + }, + { + "regionId": "11671", + "keys": "141459802,-808095674,779257961,-1662929599" + }, + { + "regionId": "11672", + "keys": "-1845806596,1811189482,329650354,-628982335" + }, + { + "regionId": "11673", + "keys": "-1063593336,-1597944673,1273002319,-1348952650" + }, + { + "regionId": "11674", + "keys": "1210448615,-1069893745,1849844672,-2020497288" + }, + { + "regionId": "11675", + "keys": "-1885801977,-74559034,1670696344,449082888" + }, + { + "regionId": "11676", + "keys": "-497232340,-1339196313,-2027479925,-368682937" + }, + { + "regionId": "11677", + "keys": "536395294,1131483635,-2029771861,-1394887559" + }, + { + "regionId": "11678", + "keys": "-804330631,-1574570644,457636469,-2078367975" + }, + { + "regionId": "11679", + "keys": "538734781,-438496848,-1620632820,1342830944" + }, + { + "regionId": "11680", + "keys": "1628843011,-904651047,841205079,-2056142962" + }, + { + "regionId": "11817", + "keys": "740863947,-1459447536,-1272357052,-1730407126" + }, + { + "regionId": "11818", + "keys": "-2034608097,1147002393,-720701760,-1045127369" + }, + { + "regionId": "11819", + "keys": "-1632272271,-1134214079,-1204220834,-1633494895" + }, + { + "regionId": "11820", + "keys": "1770850144,-166786106,-684161481,-1708595579" + }, + { + "regionId": "11821", + "keys": "-707628647,-1786826314,1726639607,1329014754" + }, + { + "regionId": "11822", + "keys": "-1814853584,-1136244468,-411716523,-1293542025" + }, + { + "regionId": "11823", + "keys": "-1467961870,-332715907,828094751,497688107" + }, + { + "regionId": "11824", + "keys": "-1116727390,-659788658,307002260,354360287" + }, + { + "regionId": "11825", + "keys": "0,0,0,0" + }, + { + "regionId": "11826", + "keys": "0,0,0,0" + }, + { + "regionId": "11827", + "keys": "379001889,1835230493,1861106702,338991847" + }, + { + "regionId": "11828", + "keys": "-483956226,1333559890,409484157,259080419" + }, + { + "regionId": "11829", + "keys": "201013583,-1953655991,-1314566361,-531272086" + }, + { + "regionId": "11830", + "keys": "1371203331,1456322164,1830551817,1881701938" + }, + { + "regionId": "11831", + "keys": "2070834186,89622912,-2093327347,-1499870034" + }, + { + "regionId": "11832", + "keys": "912914769,1794955235,953692213,833376694" + }, + { + "regionId": "11833", + "keys": "-1650041704,120707908,795850411,-1243236268" + }, + { + "regionId": "11834", + "keys": "-1469717920,-822155319,1177768019,987379908" + }, + { + "regionId": "11835", + "keys": "1706086657,-184799142,1874207624,-980291727" + }, + { + "regionId": "11836", + "keys": "-1380985244,-357598195,-1439932150,1526942363" + }, + { + "regionId": "11837", + "keys": "-1038342108,2043521930,585928227,-2111003977" + }, + { + "regionId": "11838", + "keys": "-1244353559,318399250,-531450733,1472599251" + }, + { + "regionId": "11842", + "keys": "-1217922297,-1739467375,1236768219,-519170083" + }, + { + "regionId": "11843", + "keys": "-970160562,776045252,188992499,588376278" + }, + { + "regionId": "11844", + "keys": "46502425,-1301719099,-1597781617,1434487073" + }, + { + "regionId": "11845", + "keys": "0,0,0,0" + }, + { + "regionId": "11846", + "keys": "0,0,0,0" + }, + { + "regionId": "11847", + "keys": "0,0,0,0" + }, + { + "regionId": "11848", + "keys": "0,0,0,0" + }, + { + "regionId": "11849", + "keys": "0,0,0,0" + }, + { + "regionId": "11850", + "keys": "0,0,0,0" + }, + { + "regionId": "11851", + "keys": "-516358140,791692293,-1663509747,1243508195" + }, + { + "regionId": "11852", + "keys": "0,0,0,0" + }, + { + "regionId": "11853", + "keys": "0,0,0,0" + }, + { + "regionId": "11854", + "keys": "311566497,-486013229,1351929142,744327317" + }, + { + "regionId": "11855", + "keys": "770787544,-1305958539,670684335,208100825" + }, + { + "regionId": "11856", + "keys": "0,0,0,0" + }, + { + "regionId": "11857", + "keys": "150488681,419659968,-1871963555,1031596369" + }, + { + "regionId": "11858", + "keys": "0,0,0,0" + }, + { + "regionId": "11859", + "keys": "0,0,0,0" + }, + { + "regionId": "11860", + "keys": "0,0,0,0" + }, + { + "regionId": "11861", + "keys": "0,0,0,0" + }, + { + "regionId": "11862", + "keys": "2071521092,797384499,364423664,-1286422461" + }, + { + "regionId": "11863", + "keys": "-117384431,428352610,-41119857,1227430828" + }, + { + "regionId": "11864", + "keys": "415237490,-1571743714,-1596630690,-846850340" + }, + { + "regionId": "11865", + "keys": "-1962002904,26354278,-969232265,1948165207" + }, + { + "regionId": "11866", + "keys": "1586054337,290394491,-979194848,-573910165" + }, + { + "regionId": "11920", + "keys": "-1502792287,1854795762,2014359664,-757683160" + }, + { + "regionId": "11921", + "keys": "-1190097358,-717950981,1892307569,1647143186" + }, + { + "regionId": "11922", + "keys": "1588123970,2064849194,1386289019,-716346213" + }, + { + "regionId": "11924", + "keys": "1085111846,-1815997315,216841486,2022451249" + }, + { + "regionId": "11925", + "keys": "-989523453,913815552,345668487,-1351819941" + }, + { + "regionId": "11926", + "keys": "-501586879,235710413,-1122707717,-354940885" + }, + { + "regionId": "11927", + "keys": "0,0,0,0" + }, + { + "regionId": "11928", + "keys": "-445378710,-788377286,1363332226,627739779" + }, + { + "regionId": "11929", + "keys": "747285535,375064048,-1156931456,-126201237" + }, + { + "regionId": "11930", + "keys": "1436132147,-902725534,590285278,2018675988" + }, + { + "regionId": "11931", + "keys": "0,0,0,0" + }, + { + "regionId": "11932", + "keys": "0,0,0,0" + }, + { + "regionId": "11933", + "keys": "0,0,0,0" + }, + { + "regionId": "11934", + "keys": "-854127330,1609124159,-999989310,-734721734" + }, + { + "regionId": "11935", + "keys": "-1453725493,-1575973068,1979334907,1130399929" + }, + { + "regionId": "11936", + "keys": "0,0,0,0" + }, + { + "regionId": "11937", + "keys": "-1518927827,1819850502,-992647105,299958470" + }, + { + "regionId": "11938", + "keys": "0,0,0,0" + }, + { + "regionId": "12073", + "keys": "-882281631,257910959,1642484329,-1342807140" + }, + { + "regionId": "12076", + "keys": "193939514,-115011236,-1406304015,-1626342231" + }, + { + "regionId": "12077", + "keys": "1638808709,1254156985,809776183,-1544950482" + }, + { + "regionId": "12078", + "keys": "-525973296,-1548155792,-1385110219,-1985763988" + }, + { + "regionId": "12079", + "keys": "-1011045091,-936937530,315153197,1186727635" + }, + { + "regionId": "12080", + "keys": "-871039166,671466658,-1667543860,-2035538436" + }, + { + "regionId": "12081", + "keys": "1035017991,592263100,-1547948034,1792058205" + }, + { + "regionId": "12082", + "keys": "-503983849,469781652,-1875993426,1605772035" + }, + { + "regionId": "12083", + "keys": "-359077405,-975212733,-1032910232,80337581" + }, + { + "regionId": "12084", + "keys": "1719212980,-270023138,175706506,-308924243" + }, + { + "regionId": "12085", + "keys": "-1262595098,-465048704,-1463905457,1372729353" + }, + { + "regionId": "12086", + "keys": "1720662391,1428111249,873760745,-580366661" + }, + { + "regionId": "12087", + "keys": "-1019515374,-1885024451,-1336165534,1322614963" + }, + { + "regionId": "12088", + "keys": "-2139185262,-1806601505,1536573357,72818727" + }, + { + "regionId": "12089", + "keys": "-1047505229,1482518318,895541409,-1048492631" + }, + { + "regionId": "12090", + "keys": "120066737,434314789,-2139665893,-8665118" + }, + { + "regionId": "12091", + "keys": "1479001755,2119142088,-653624921,702014943" + }, + { + "regionId": "12092", + "keys": "1834140299,801520697,152435624,2017368659" + }, + { + "regionId": "12093", + "keys": "-1609567378,-1639522221,1730303123,-248179982" + }, + { + "regionId": "12094", + "keys": "2120437359,222442049,41777842,-509732529" + }, + { + "regionId": "12097", + "keys": "-862465947,2109948185,583246321,-850147469" + }, + { + "regionId": "12098", + "keys": "0,0,0,0" + }, + { + "regionId": "12099", + "keys": "0,0,0,0" + }, + { + "regionId": "12100", + "keys": "1852910519,712916664,1670787779,1294835477" + }, + { + "regionId": "12101", + "keys": "0,0,0,0" + }, + { + "regionId": "12102", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "12105", + "keys": "1153497516,-449169462,-635419798,-1471828315" + }, + { + "regionId": "12106", + "keys": "38647587,1522565828,-949257419,1943032512" + }, + { + "regionId": "12107", + "keys": "790028083,952090857,-1393754794,1896821277" + }, + { + "regionId": "12108", + "keys": "-31531459,-1804597772,712452096,1915359882" + }, + { + "regionId": "12109", + "keys": "1939715187,-796094750,-1071860977,-1024683065" + }, + { + "regionId": "12110", + "keys": "808144600,-616213476,2026296096,1539298914" + }, + { + "regionId": "12111", + "keys": "-746445771,1759120362,1253848335,1433199232" + }, + { + "regionId": "12112", + "keys": "0,0,0,0" + }, + { + "regionId": "12113", + "keys": "-1749952613,1569535680,1900425482,-1993748284" + }, + { + "regionId": "12115", + "keys": "2146362785,1996258091,-613445101,539756591" + }, + { + "regionId": "12116", + "keys": "0,0,0,0" + }, + { + "regionId": "12117", + "keys": "-97063310,1962833557,-849078816,-1560293275" + }, + { + "regionId": "12118", + "keys": "714042847,-1192681674,-1453080351,-88273278" + }, + { + "regionId": "12119", + "keys": "-873110513,-162095225,-381892128,-346588457" + }, + { + "regionId": "12120", + "keys": "-774739481,1496283218,893257461,-1168642419" + }, + { + "regionId": "12121", + "keys": "1557445081,682103339,1577593678,-1850587643" + }, + { + "regionId": "12122", + "keys": "-2014648814,571564491,-1983897919,-612605198" + }, + { + "regionId": "12180", + "keys": "1388683192,-872219469,437507075,812232152" + }, + { + "regionId": "12181", + "keys": "-995343774,-1071540200,1667841236,1318274883" + }, + { + "regionId": "12182", + "keys": "-499997333,1910872683,-234510566,-361238419" + }, + { + "regionId": "12183", + "keys": "0,0,0,0" + }, + { + "regionId": "12184", + "keys": "-1993918550,1977224805,-1048356116,-1578331413" + }, + { + "regionId": "12185", + "keys": "-733095133,-1797134669,1813691911,-117267989" + }, + { + "regionId": "12186", + "keys": "-259674875,-949495016,1835821953,1740556829" + }, + { + "regionId": "12187", + "keys": "0,0,0,0" + }, + { + "regionId": "12188", + "keys": "22801476,-1237575758,2139201694,-163382547" + }, + { + "regionId": "12189", + "keys": "-626419958,-861781849,-400257621,465575053" + }, + { + "regionId": "12191", + "keys": "0,0,0,0" + }, + { + "regionId": "12192", + "keys": "0,0,0,0" + }, + { + "regionId": "12193", + "keys": "1013552068,-364826455,4137749,729786125" + }, + { + "regionId": "12194", + "keys": "0,0,0,0" + }, + { + "regionId": "12332", + "keys": "0,0,0,0" + }, + { + "regionId": "12333", + "keys": "372281878,-809369100,-1989039261,-980074402" + }, + { + "regionId": "12334", + "keys": "-208871238,397971218,827338731,-602814995" + }, + { + "regionId": "12335", + "keys": "-932235881,-440697769,-2073934211,-1071764865" + }, + { + "regionId": "12336", + "keys": "-1452500433,-1602128254,-1629750057,1243308175" + }, + { + "regionId": "12337", + "keys": "-1376987128,-85363217,1977650657,-2129657037" + }, + { + "regionId": "12338", + "keys": "-983999026,1403872391,385102350,-194124711" + }, + { + "regionId": "12339", + "keys": "518441298,1531173904,430682398,595384049" + }, + { + "regionId": "12340", + "keys": "1946410965,-211089460,-1145931943,-92341347" + }, + { + "regionId": "12341", + "keys": "2121187294,1555327396,-2072187998,-1348805114" + }, + { + "regionId": "12342", + "keys": "-1082588441,1243176731,-1284334046,-1428935477" + }, + { + "regionId": "12343", + "keys": "-609214795,980135617,-695357998,-160803647" + }, + { + "regionId": "12344", + "keys": "-1265758544,1128006461,-466859463,-1851036690" + }, + { + "regionId": "12345", + "keys": "-134733709,151853724,-1437846337,335319448" + }, + { + "regionId": "12346", + "keys": "-657476809,-1958794621,-573708398,1064135013" + }, + { + "regionId": "12347", + "keys": "-1599627156,201181799,-1978827396,-76735331" + }, + { + "regionId": "12348", + "keys": "1498945330,-1007588865,989046743,-1246005481" + }, + { + "regionId": "12349", + "keys": "1690287681,1306543027,-1953379158,1167181646" + }, + { + "regionId": "12350", + "keys": "1136900728,1196784066,-231560317,20860732" + }, + { + "regionId": "12353", + "keys": "1632384552,-1909179432,-618653336,-1612279868" + }, + { + "regionId": "12354", + "keys": "1499391996,1113335840,1679448224,-1743073054" + }, + { + "regionId": "12355", + "keys": "2068164694,1652405742,-1354799119,-2005137631" + }, + { + "regionId": "12356", + "keys": "-1201681208,106398334,-2123418385,1010672418" + }, + { + "regionId": "12362", + "keys": "0,0,0,0" + }, + { + "regionId": "12363", + "keys": "0,0,0,0" + }, + { + "regionId": "12364", + "keys": "0,0,0,0" + }, + { + "regionId": "12365", + "keys": "0,0,0,0" + }, + { + "regionId": "12366", + "keys": "0,0,0,0" + }, + { + "regionId": "12367", + "keys": "-2006617355,-1390093250,-1950318553,1842364433" + }, + { + "regionId": "12368", + "keys": "0,0,0,0" + }, + { + "regionId": "12369", + "keys": "-891954120,1710352781,-1883639556,-1461026236" + }, + { + "regionId": "12372", + "keys": "0,0,0,0" + }, + { + "regionId": "12373", + "keys": "0,0,0,0" + }, + { + "regionId": "12374", + "keys": "1620519366,-1309341299,68411383,1308746010" + }, + { + "regionId": "12375", + "keys": "0,0,0,0" + }, + { + "regionId": "12376", + "keys": "1918934265,1530066885,-1991367516,1783839145" + }, + { + "regionId": "12377", + "keys": "-1926215959,-398085479,-1931593602,-1073869938" + }, + { + "regionId": "12378", + "keys": "-369504798,1961362499,749656660,-356368606" + }, + { + "regionId": "12434", + "keys": "-1419269744,1750656375,119876026,1040224763" + }, + { + "regionId": "12436", + "keys": "-2138826728,1169519405,-411858931,491428" + }, + { + "regionId": "12437", + "keys": "1402191614,1606631666,-257071195,939962410" + }, + { + "regionId": "12438", + "keys": "-634183085,122332197,2063223083,1861049708" + }, + { + "regionId": "12439", + "keys": "-128537652,-667417558,998246693,-1147655385" + }, + { + "regionId": "12440", + "keys": "2053762285,-354590835,1580877387,-2123860710" + }, + { + "regionId": "12441", + "keys": "-1858539590,267273914,-776577096,-1251026502" + }, + { + "regionId": "12442", + "keys": "1883167946,191149821,-1270401415,-126025128" + }, + { + "regionId": "12443", + "keys": "0,0,0,0" + }, + { + "regionId": "12444", + "keys": "1576354846,-1768236409,821965805,-861456742" + }, + { + "regionId": "12447", + "keys": "0,0,0,0" + }, + { + "regionId": "12448", + "keys": "0,0,0,0" + }, + { + "regionId": "12449", + "keys": "0,0,0,0" + }, + { + "regionId": "12450", + "keys": "0,0,0,0" + }, + { + "regionId": "12587", + "keys": "0,0,0,0" + }, + { + "regionId": "12588", + "keys": "0,0,0,0" + }, + { + "regionId": "12589", + "keys": "1981659006,1591583400,1958084245,667979721" + }, + { + "regionId": "12590", + "keys": "-755814299,1579260481,892984208,577453947" + }, + { + "regionId": "12591", + "keys": "351660323,1292140128,-1256148041,78535482" + }, + { + "regionId": "12592", + "keys": "-1630268797,-1503112818,1383264816,1705116684" + }, + { + "regionId": "12593", + "keys": "-1653558720,2119901478,-1449369788,-1829505468" + }, + { + "regionId": "12594", + "keys": "1150282919,572626783,-257791473,2031745700" + }, + { + "regionId": "12595", + "keys": "690344167,598639865,1375558029,1809058157" + }, + { + "regionId": "12596", + "keys": "1570322737,1165043749,1246435002,1408253611" + }, + { + "regionId": "12597", + "keys": "306679611,1182603714,427243016,1648062434" + }, + { + "regionId": "12598", + "keys": "1874555134,-1535151559,1145435834,-578461761" + }, + { + "regionId": "12599", + "keys": "1053581692,-982140470,419327673,-163055372" + }, + { + "regionId": "12600", + "keys": "-649213147,1195379532,134339031,1178706012" + }, + { + "regionId": "12601", + "keys": "1770077800,-625870452,1753986528,1205115023" + }, + { + "regionId": "12602", + "keys": "1289058435,-2013760918,1538318852,396639740" + }, + { + "regionId": "12603", + "keys": "-1135486565,-470016325,1594745611,161611213" + }, + { + "regionId": "12604", + "keys": "-1812120898,-1662909112,-1432124543,571589094" + }, + { + "regionId": "12605", + "keys": "-1547116565,1817338996,-1727020832,2025648539" + }, + { + "regionId": "12606", + "keys": "1621768314,2112223568,-739546935,1952137045" + }, + { + "regionId": "12609", + "keys": "-352333436,1298769242,715602788,55374575" + }, + { + "regionId": "12610", + "keys": "923086085,-1676713919,-1072336340,1600346998" + }, + { + "regionId": "12611", + "keys": "-2099572651,-2127878366,1782860351,-1451326946" + }, + { + "regionId": "12614", + "keys": "1621048325,1179863793,357058137,-1896311701" + }, + { + "regionId": "12615", + "keys": "0,0,0,0" + }, + { + "regionId": "12616", + "keys": "1951523008,-2131232747,-381301931,2007660709" + }, + { + "regionId": "12617", + "keys": "-2118850546,-2021217761,-713637260,-1661397318" + }, + { + "regionId": "12619", + "keys": "1922733696,773456556,-1923866275,-1305839916" + }, + { + "regionId": "12620", + "keys": "0,0,0,0" + }, + { + "regionId": "12621", + "keys": "1619333755,-1869146576,77302288,-937694202" + }, + { + "regionId": "12622", + "keys": "0,0,0,0" + }, + { + "regionId": "12623", + "keys": "-369583241,545715110,-134871454,1404138108" + }, + { + "regionId": "12624", + "keys": "0,0,0,0" + }, + { + "regionId": "12625", + "keys": "-260562230,1208275247,436993278,30028881" + }, + { + "regionId": "12628", + "keys": "1557696523,1576331159,-2104822183,-309564623" + }, + { + "regionId": "12629", + "keys": "-992807501,-2062158526,-154775275,804488735" + }, + { + "regionId": "12630", + "keys": "-1108090696,710523517,2082926636,107778168" + }, + { + "regionId": "12631", + "keys": "693308333,-269450306,-924437218,309489139" + }, + { + "regionId": "12632", + "keys": "0,0,0,0" + }, + { + "regionId": "12633", + "keys": "0,0,0,0" + }, + { + "regionId": "12634", + "keys": "0,0,0,0" + }, + { + "regionId": "12688", + "keys": "1861636222,1638403446,-649444098,2131977195" + }, + { + "regionId": "12689", + "keys": "-1177832090,806845610,-2074522350,793591882" + }, + { + "regionId": "12690", + "keys": "-1658567313,-1665136661,638517615,-2091981200" + }, + { + "regionId": "12691", + "keys": "-998717750,-178246764,973015517,-1732934591" + }, + { + "regionId": "12692", + "keys": "0,0,0,0" + }, + { + "regionId": "12693", + "keys": "1339198001,799729854,-750687990,1703141753" + }, + { + "regionId": "12694", + "keys": "631068451,-510806123,2026757696,207332608" + }, + { + "regionId": "12695", + "keys": "0,0,0,0" + }, + { + "regionId": "12696", + "keys": "690970369,-466418236,-666391415,1091047140" + }, + { + "regionId": "12697", + "keys": "1764668344,-101513352,-710472869,-1014452411" + }, + { + "regionId": "12698", + "keys": "-161912285,-1949783111,790481303,987975274" + }, + { + "regionId": "12699", + "keys": "-1844552510,896294306,973094427,-653509731" + }, + { + "regionId": "12700", + "keys": "-1802430094,1220107446,-1897971895,-1437873968" + }, + { + "regionId": "12842", + "keys": "0,0,0,0" + }, + { + "regionId": "12843", + "keys": "-203885401,22803731,234561826,140244374" + }, + { + "regionId": "12844", + "keys": "226013993,-442175197,1072280142,-2076608354" + }, + { + "regionId": "12845", + "keys": "993041158,1401235448,1282019826,44639213" + }, + { + "regionId": "12846", + "keys": "1813291988,-1182316575,55462006,-1149391696" + }, + { + "regionId": "12847", + "keys": "1632239854,-1407430240,1205200323,-60923789" + }, + { + "regionId": "12848", + "keys": "-830415762,-1655127901,1335930534,2043180488" + }, + { + "regionId": "12849", + "keys": "183396243,-461663209,-212681663,-266126212" + }, + { + "regionId": "12850", + "keys": "0,0,0,0" + }, + { + "regionId": "12851", + "keys": "0,0,0,0" + }, + { + "regionId": "12852", + "keys": "0,0,0,0" + }, + { + "regionId": "12853", + "keys": "0,0,0,0" + }, + { + "regionId": "12854", + "keys": "-648789394,672092351,713515997,1153393095" + }, + { + "regionId": "12855", + "keys": "1344813934,973665164,454507197,-840789600" + }, + { + "regionId": "12856", + "keys": "1867506737,-1154362361,691839047,840600959" + }, + { + "regionId": "12857", + "keys": "-1061890019,-1503652546,838153390,-1952904011" + }, + { + "regionId": "12858", + "keys": "-503936065,-153634959,2139131102,1736317222" + }, + { + "regionId": "12859", + "keys": "-885548568,-1406566619,-1095540548,-463966144" + }, + { + "regionId": "12860", + "keys": "1143684881,-2095747982,-392775805,1095955025" + }, + { + "regionId": "12861", + "keys": "1816963481,-496926322,1214068433,1190940799" + }, + { + "regionId": "12862", + "keys": "-362546063,986809728,-732925351,-437970150" + }, + { + "regionId": "12865", + "keys": "-1217194532,-1442060965,1622194497,-675929760" + }, + { + "regionId": "12866", + "keys": "-545091180,1146916512,-1890387271,553903087" + }, + { + "regionId": "12867", + "keys": "1462732309,395803116,803023666,-1139113006" + }, + { + "regionId": "12874", + "keys": "0,0,0,0" + }, + { + "regionId": "12875", + "keys": "0,0,0,0" + }, + { + "regionId": "12876", + "keys": "0,0,0,0" + }, + { + "regionId": "12877", + "keys": "0,0,0,0" + }, + { + "regionId": "12878", + "keys": "0,0,0,0" + }, + { + "regionId": "12879", + "keys": "-1368673067,915871651,-1626507432,1807642543" + }, + { + "regionId": "12880", + "keys": "1048762260,1169103285,187905242,-483193099" + }, + { + "regionId": "12884", + "keys": "219137432,-588958221,643827879,166439179" + }, + { + "regionId": "12885", + "keys": "-295659180,1892042068,-983165209,-765523083" + }, + { + "regionId": "12886", + "keys": "-1441695147,730261545,-221502328,1839243995" + }, + { + "regionId": "12887", + "keys": "-1781165696,2082501875,1317465410,954416699" + }, + { + "regionId": "12944", + "keys": "-1975958933,-1193334151,-159998783,-193649368" + }, + { + "regionId": "12945", + "keys": "-901643304,-529015531,-696518247,1093695083" + }, + { + "regionId": "12946", + "keys": "2090546911,-1557720051,696207620,-406031091" + }, + { + "regionId": "12947", + "keys": "721381121,1046071497,646740952,1074713668" + }, + { + "regionId": "12948", + "keys": "-847695159,115342539,-986683415,833544368" + }, + { + "regionId": "12949", + "keys": "-824331278,-1926121844,1635081242,1203632017" + }, + { + "regionId": "12950", + "keys": "-231438779,-295053046,17143297,-1148893582" + }, + { + "regionId": "12951", + "keys": "-1979754927,574273135,-1414539851,-766497717" + }, + { + "regionId": "12952", + "keys": "-1425997721,-1885862885,-1157108098,1841563038" + }, + { + "regionId": "12953", + "keys": "-1250188060,-1799181120,779026206,758487113" + }, + { + "regionId": "12954", + "keys": "1661321273,-1954068524,82368798,1528722778" + }, + { + "regionId": "12955", + "keys": "2001176320,-515563756,-1019109153,347995784" + }, + { + "regionId": "12956", + "keys": "-1383918319,-1190517730,-1037058957,534994622" + }, + { + "regionId": "13098", + "keys": "0,0,0,0" + }, + { + "regionId": "13099", + "keys": "919393388,-1011543647,454982828,-809340931" + }, + { + "regionId": "13100", + "keys": "284097754,-1500159810,-705437259,-939519544" + }, + { + "regionId": "13101", + "keys": "-381920894,-806030125,-1295289124,905654937" + }, + { + "regionId": "13102", + "keys": "376149710,553132983,-1519502826,1450133972" + }, + { + "regionId": "13103", + "keys": "560689103,-372924587,1002681194,-1313254694" + }, + { + "regionId": "13104", + "keys": "-421493992,1381068261,1710426242,2142500778" + }, + { + "regionId": "13105", + "keys": "0,0,0,0" + }, + { + "regionId": "13106", + "keys": "0,0,0,0" + }, + { + "regionId": "13107", + "keys": "-1161498786,-880845643,1588242926,2124040528" + }, + { + "regionId": "13108", + "keys": "-762783054,-1655608106,1991658602,-817463829" + }, + { + "regionId": "13109", + "keys": "-349563312,1574791115,-229143592,422091049" + }, + { + "regionId": "13110", + "keys": "1594041118,976656639,1899969266,-1424829001" + }, + { + "regionId": "13111", + "keys": "-956338858,1803589973,-1931845203,844602202" + }, + { + "regionId": "13112", + "keys": "-1779719436,779690941,517280009,1427658886" + }, + { + "regionId": "13113", + "keys": "1359701469,1140178566,1020850677,-502692445" + }, + { + "regionId": "13114", + "keys": "-1724578067,1811021965,-703977777,-1144440338" + }, + { + "regionId": "13115", + "keys": "135594186,-1586061714,1570753800,1382701347" + }, + { + "regionId": "13116", + "keys": "343282082,-57441829,-10906049,1340555326" + }, + { + "regionId": "13117", + "keys": "-798152548,75895015,1520035830,-1236244245" + }, + { + "regionId": "13118", + "keys": "1803456807,778621268,1763810696,-1674740332" + }, + { + "regionId": "13123", + "keys": "-1731332675,1372380814,1360357859,-476783265" + }, + { + "regionId": "13124", + "keys": "1112524398,1364561637,-1050280898,-561068804" + }, + { + "regionId": "13126", + "keys": "1732039952,536833573,-81136437,1031070663" + }, + { + "regionId": "13130", + "keys": "0,0,0,0" + }, + { + "regionId": "13131", + "keys": "-1234145533,479347649,1835828804,1685593501" + }, + { + "regionId": "13132", + "keys": "0,0,0,0" + }, + { + "regionId": "13133", + "keys": "-1026003062,917176839,-84576515,-1037395862" + }, + { + "regionId": "13134", + "keys": "0,0,0,0" + }, + { + "regionId": "13135", + "keys": "425723212,580084357,1788364975,1608414630" + }, + { + "regionId": "13136", + "keys": "0,0,0,0" + }, + { + "regionId": "13140", + "keys": "-1757870261,1824774693,-1461099709,1915501139" + }, + { + "regionId": "13141", + "keys": "1705435594,233219482,279736542,2096923137" + }, + { + "regionId": "13142", + "keys": "2062386940,-24765133,-1126233768,475032842" + }, + { + "regionId": "13143", + "keys": "1411276783,-169287799,-1924979618,-1103634209" + }, + { + "regionId": "13199", + "keys": "413099653,-805662108,320157580,923467388" + }, + { + "regionId": "13200", + "keys": "-384958441,757681189,-1060421200,1710552745" + }, + { + "regionId": "13201", + "keys": "-777242905,1490139407,-62422504,1747570013" + }, + { + "regionId": "13202", + "keys": "-1507613907,-934138926,557937275,2130611737" + }, + { + "regionId": "13203", + "keys": "-1342258113,-2106603709,395365404,-973258459" + }, + { + "regionId": "13204", + "keys": "0,0,0,0" + }, + { + "regionId": "13205", + "keys": "1250202258,-2009534633,1981493488,10068968" + }, + { + "regionId": "13206", + "keys": "1456157358,1036496685,-1478577110,-1039552689" + }, + { + "regionId": "13207", + "keys": "0,0,0,0" + }, + { + "regionId": "13208", + "keys": "0,0,0,0" + }, + { + "regionId": "13209", + "keys": "-441828435,-1834839387,-1652863357,1161715526" + }, + { + "regionId": "13210", + "keys": "-1843718280,1703682437,-955823154,-1545029718" + }, + { + "regionId": "13211", + "keys": "1293288083,1390574804,1838161452,887056395" + }, + { + "regionId": "13354", + "keys": "-697361682,-1108068736,-491371566,-1750045046" + }, + { + "regionId": "13355", + "keys": "1045096887,204321120,-803556278,-865381665" + }, + { + "regionId": "13356", + "keys": "-1202647115,-2077370353,-776213042,-208608901" + }, + { + "regionId": "13357", + "keys": "1828573590,-917113205,880280264,133645860" + }, + { + "regionId": "13358", + "keys": "41136211,1469481233,1950303317,-915910893" + }, + { + "regionId": "13359", + "keys": "231092921,-248629409,1012469199,966196096" + }, + { + "regionId": "13360", + "keys": "-1860635048,-1994403194,-261420877,899213732" + }, + { + "regionId": "13361", + "keys": "1581119671,589912019,-953848433,669787750" + }, + { + "regionId": "13362", + "keys": "647685229,1735122662,202525670,-1430696427" + }, + { + "regionId": "13363", + "keys": "-1437683143,1313459135,-572808465,628532614" + }, + { + "regionId": "13364", + "keys": "271092435,-91354012,450005855,1673700762" + }, + { + "regionId": "13365", + "keys": "550472972,-90477551,1424060678,-500359242" + }, + { + "regionId": "13366", + "keys": "1555883756,1714912813,693854980,605793741" + }, + { + "regionId": "13367", + "keys": "1443888340,40258892,-827546717,-1706190544" + }, + { + "regionId": "13368", + "keys": "-922499048,1143654396,1593518953,1160947087" + }, + { + "regionId": "13369", + "keys": "-854229759,-1850773237,-273243753,151474217" + }, + { + "regionId": "13370", + "keys": "-1866559281,-1693659798,-1335114197,1185838193" + }, + { + "regionId": "13371", + "keys": "-172414174,1775715954,1436041524,-90862670" + }, + { + "regionId": "13372", + "keys": "1523911372,351024518,1404660376,-1833782282" + }, + { + "regionId": "13373", + "keys": "-1762860860,2070816046,-1848056827,538155683" + }, + { + "regionId": "13374", + "keys": "-2094243426,-1792618509,-1562985614,633233826" + }, + { + "regionId": "13385", + "keys": "-1844924042,1501923681,2039827392,1750236728" + }, + { + "regionId": "13386", + "keys": "897729617,1760669580,-1691319896,1585388050" + }, + { + "regionId": "13387", + "keys": "50769406,1445159687,1657343198,-1977600563" + }, + { + "regionId": "13388", + "keys": "0,0,0,0" + }, + { + "regionId": "13389", + "keys": "0,0,0,0" + }, + { + "regionId": "13397", + "keys": "0,0,0,0" + }, + { + "regionId": "13398", + "keys": "0,0,0,0" + }, + { + "regionId": "13399", + "keys": "0,0,0,0" + }, + { + "regionId": "13456", + "keys": "-476100316,-1682296770,133855524,112315923" + }, + { + "regionId": "13457", + "keys": "377761737,-478773092,2106772372,2013273184" + }, + { + "regionId": "13458", + "keys": "-528778477,1188068801,-831895341,-843066318" + }, + { + "regionId": "13459", + "keys": "-1539823334,1488607814,-1446817557,887877521" + }, + { + "regionId": "13460", + "keys": "1351713069,1605558913,1016270393,-1439479852" + }, + { + "regionId": "13461", + "keys": "460291665,970577463,-987694183,1332083960" + }, + { + "regionId": "13462", + "keys": "-1293267774,-1055869460,-1910211914,-1862132200" + }, + { + "regionId": "13463", + "keys": "1800919536,-447254446,-1090413707,-1023788925" + }, + { + "regionId": "13464", + "keys": "761967717,-1170068472,1138080117,-622709482" + }, + { + "regionId": "13465", + "keys": "-1620975981,842688962,1124919019,1534496149" + }, + { + "regionId": "13466", + "keys": "-460228398,-76181685,2062962515,1167974062" + }, + { + "regionId": "13467", + "keys": "0,0,0,0" + }, + { + "regionId": "13610", + "keys": "-1259340500,2094890289,-1255134464,1578867778" + }, + { + "regionId": "13611", + "keys": "-2074654953,2114352944,-1715482214,786241055" + }, + { + "regionId": "13612", + "keys": "1485341915,-607675942,-37541602,-1009921417" + }, + { + "regionId": "13613", + "keys": "1215281736,-1131653641,-2080246040,1849397312" + }, + { + "regionId": "13614", + "keys": "987461267,1277137633,-383892538,1924229470" + }, + { + "regionId": "13615", + "keys": "-1386012819,-1667483384,235442560,2108663059" + }, + { + "regionId": "13616", + "keys": "-2043312890,38355965,-1115381550,-1284493932" + }, + { + "regionId": "13617", + "keys": "778193894,-1569947064,1574720047,1996357073" + }, + { + "regionId": "13618", + "keys": "-710010520,-1679541351,-1318048442,1911381340" + }, + { + "regionId": "13619", + "keys": "-2066053329,414750452,-672870734,-712334802" + }, + { + "regionId": "13620", + "keys": "-2036291738,1473612575,9834035,-1983739737" + }, + { + "regionId": "13621", + "keys": "-1291167236,-1205011126,-1949699235,1530879202" + }, + { + "regionId": "13622", + "keys": "0,0,0,0" + }, + { + "regionId": "13623", + "keys": "-1700397822,-1427942931,1638091118,438962861" + }, + { + "regionId": "13624", + "keys": "2111564081,-1121458759,1205557925,-386058131" + }, + { + "regionId": "13625", + "keys": "-1688194808,-751145145,-64310690,-9400824" + }, + { + "regionId": "13626", + "keys": "2091552269,-19993197,919014338,-2088295508" + }, + { + "regionId": "13627", + "keys": "341129543,405594157,-935930552,1362472171" + }, + { + "regionId": "13628", + "keys": "83847925,-1748584368,-1828230097,915424426" + }, + { + "regionId": "13629", + "keys": "-1526659316,194744161,-1617203167,1822755797" + }, + { + "regionId": "13630", + "keys": "-1632016999,-2015192780,-2137722473,477794767" + }, + { + "regionId": "13641", + "keys": "-1254291903,557840049,-1132517830,-721853650" + }, + { + "regionId": "13642", + "keys": "1339676474,261360204,1438006333,-388997930" + }, + { + "regionId": "13643", + "keys": "1113875885,-236852397,193142585,-854043613" + }, + { + "regionId": "13644", + "keys": "0,0,0,0" + }, + { + "regionId": "13650", + "keys": "-1281992532,-252178835,-207196406,32900092" + }, + { + "regionId": "13712", + "keys": "1182236806,-2109123887,1909535742,814317528" + }, + { + "regionId": "13713", + "keys": "676853493,-1887443315,-998811191,1947183065" + }, + { + "regionId": "13715", + "keys": "0,0,0,0" + }, + { + "regionId": "13716", + "keys": "-913580283,340446282,893998558,589419388" + }, + { + "regionId": "13717", + "keys": "1559468575,-1513642990,42449462,-1614119576" + }, + { + "regionId": "13718", + "keys": "1236641739,1389287026,-557291512,739408472" + }, + { + "regionId": "13719", + "keys": "869116958,119952924,524051369,-980103253" + }, + { + "regionId": "13720", + "keys": "1147506557,-1510069284,-691462718,-1314001105" + }, + { + "regionId": "13721", + "keys": "-1188425330,1307846097,888707126,-1843934128" + }, + { + "regionId": "13722", + "keys": "0,0,0,0" + }, + { + "regionId": "13723", + "keys": "-310574621,110640497,1685108265,-1931806505" + }, + { + "regionId": "13866", + "keys": "1975204579,1739471741,-609874514,-809721138" + }, + { + "regionId": "13867", + "keys": "249804189,-1087394076,-1963925587,-493571779" + }, + { + "regionId": "13868", + "keys": "255205616,-1585903009,-1371243067,-264891948" + }, + { + "regionId": "13869", + "keys": "0,0,0,0" + }, + { + "regionId": "13870", + "keys": "0,0,0,0" + }, + { + "regionId": "13871", + "keys": "0,0,0,0" + }, + { + "regionId": "13872", + "keys": "-865041276,1374390842,-909885942,30088570" + }, + { + "regionId": "13873", + "keys": "-2072799260,1290574946,-1228463084,1431541780" + }, + { + "regionId": "13874", + "keys": "301169312,1180543257,595363434,555835168" + }, + { + "regionId": "13875", + "keys": "1853922477,1565380766,632797823,-2047432156" + }, + { + "regionId": "13876", + "keys": "-1056000495,1278886569,-1666375011,492887698" + }, + { + "regionId": "13877", + "keys": "1498185652,2064367906,152992439,585271079" + }, + { + "regionId": "13878", + "keys": "0,0,0,0" + }, + { + "regionId": "13879", + "keys": "-2101514338,-1139447054,51825149,-512907347" + }, + { + "regionId": "13880", + "keys": "-672032867,-104766980,-780173326,-1476119873" + }, + { + "regionId": "13897", + "keys": "313069291,-285427198,720562158,55799827" + }, + { + "regionId": "13898", + "keys": "-975892323,-614503529,1538650880,-1348349880" + }, + { + "regionId": "13899", + "keys": "-2117805741,-268051413,-733527930,471010998" + }, + { + "regionId": "13900", + "keys": "0,0,0,0" + }, + { + "regionId": "13901", + "keys": "0,0,0,0" + }, + { + "regionId": "13902", + "keys": "0,0,0,0" + }, + { + "regionId": "13905", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "13968", + "keys": "-620062336,-1110235330,-1095431209,-470716307" + }, + { + "regionId": "13971", + "keys": "0,0,0,0" + }, + { + "regionId": "13972", + "keys": "1266294685,1139088638,1514900183,-1389022839" + }, + { + "regionId": "13973", + "keys": "0,0,0,0" + }, + { + "regionId": "13974", + "keys": "1384510929,1857691725,-293821029,-1219099456" + }, + { + "regionId": "13975", + "keys": "715007080,565579966,-981729179,-1644711038" + }, + { + "regionId": "13976", + "keys": "-2067573994,1313918283,-503877523,-561145139" + }, + { + "regionId": "13977", + "keys": "-2103542752,-239401853,-1270017944,-346347052" + }, + { + "regionId": "13978", + "keys": "605186559,-2092944993,404136076,399569943" + }, + { + "regionId": "13979", + "keys": "-1418903263,-1115529276,-670759508,770213401" + }, + { + "regionId": "13980", + "keys": "-12957944,-743456598,2041601862,618819565" + }, + { + "regionId": "14127", + "keys": "0,0,0,0" + }, + { + "regionId": "14128", + "keys": "1907787432,-241593923,1152767085,-541422403" + }, + { + "regionId": "14129", + "keys": "1656428349,-1031219549,1014397898,274724415" + }, + { + "regionId": "14130", + "keys": "415779481,-1959726011,1999247323,1438983993" + }, + { + "regionId": "14131", + "keys": "-489058667,-1946048627,826928526,-193826197" + }, + { + "regionId": "14132", + "keys": "-602589023,1702162086,-1444941032,1758850020" + }, + { + "regionId": "14133", + "keys": "61264177,326475438,1849288713,-191758257" + }, + { + "regionId": "14134", + "keys": "-1102558063,817524163,-892019492,-1799662614" + }, + { + "regionId": "14135", + "keys": "-1676933435,2078032557,110306649,-960667243" + }, + { + "regionId": "14136", + "keys": "-1104533465,1792124817,-1564247177,79706641" + }, + { + "regionId": "14154", + "keys": "0,0,0,0" + }, + { + "regionId": "14155", + "keys": "0,0,0,0" + }, + { + "regionId": "14156", + "keys": "0,0,0,0" + }, + { + "regionId": "14157", + "keys": "-852479713,1901063521,-1097484894,1013793379" + }, + { + "regionId": "14158", + "keys": "0,0,0,0" + }, + { + "regionId": "14161", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "14167", + "keys": "-1398455,-469478596,190482870,-1233173597" + }, + { + "regionId": "14227", + "keys": "0,0,0,0" + }, + { + "regionId": "14228", + "keys": "0,0,0,0" + }, + { + "regionId": "14229", + "keys": "0,0,0,0" + }, + { + "regionId": "14230", + "keys": "-453901412,-2074594443,-809419406,1774073603" + }, + { + "regionId": "14231", + "keys": "-1716965138,-1451197740,-1942368593,-900089071" + }, + { + "regionId": "14232", + "keys": "-154845838,1035699282,361824423,-776192310" + }, + { + "regionId": "14233", + "keys": "1754401715,23594529,1369802619,1852247641" + }, + { + "regionId": "14234", + "keys": "1142480925,-261960203,-1951671560,-1615735123" + }, + { + "regionId": "14235", + "keys": "-264565085,233987061,-1946292625,1978910655" + }, + { + "regionId": "14236", + "keys": "816141215,-2114312227,1578950035,1471842311" + }, + { + "regionId": "14381", + "keys": "-534048527,1614741928,-469012711,1064350100" + }, + { + "regionId": "14382", + "keys": "-1852773504,1082744219,-1346163454,554948186" + }, + { + "regionId": "14383", + "keys": "2130321690,-902060426,334275700,1881115024" + }, + { + "regionId": "14384", + "keys": "1875853789,1099975670,-125982769,-1614539446" + }, + { + "regionId": "14385", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "14386", + "keys": "454702874,-889424896,1044373821,1857098733" + }, + { + "regionId": "14387", + "keys": "-1786083312,-89773863,-203660164,1188286162" + }, + { + "regionId": "14388", + "keys": "2048238173,2003642395,1658667134,411519881" + }, + { + "regionId": "14389", + "keys": "0,0,0,0" + }, + { + "regionId": "14390", + "keys": "-1631704360,1281079278,-1549067757,-2034268623" + }, + { + "regionId": "14391", + "keys": "-1092656394,771935864,-1698940035,222468187" + }, + { + "regionId": "14392", + "keys": "993603906,-1477196579,593064486,166369140" + }, + { + "regionId": "14412", + "keys": "0,0,0,0" + }, + { + "regionId": "14413", + "keys": "0,0,0,0" + }, + { + "regionId": "14414", + "keys": "0,0,0,0" + }, + { + "regionId": "14486", + "keys": "-131982139,-1189975142,-1667401999,-1794787704" + }, + { + "regionId": "14487", + "keys": "-330478679,11506767,395036194,-971774384" + }, + { + "regionId": "14488", + "keys": "0,0,0,0" + }, + { + "regionId": "14489", + "keys": "0,0,0,0" + }, + { + "regionId": "14490", + "keys": "1578682567,-1175551739,170259358,-1972709096" + }, + { + "regionId": "14491", + "keys": "1131750208,-969132110,-1692936039,708031851" + }, + { + "regionId": "14492", + "keys": "420310205,1004898846,889537686,13961361" + }, + { + "regionId": "14637", + "keys": "112774068,-1867270219,-442076728,-1436438131" + }, + { + "regionId": "14638", + "keys": "139650389,-1351993356,-191474863,1802091532" + }, + { + "regionId": "14639", + "keys": "303035230,-26013293,2131971123,-1774131228" + }, + { + "regionId": "14640", + "keys": "-95254230,-1094148730,-1768319507,105210786" + }, + { + "regionId": "14641", + "keys": "-310201697,1724559662,90126688,-664432561" + }, + { + "regionId": "14645", + "keys": "0,0,0,0" + }, + { + "regionId": "14646", + "keys": "-2069357113,-2117603296,1620573021,-239596308" + }, + { + "regionId": "14647", + "keys": "727908174,1305814331,1158279049,-671924266" + }, + { + "regionId": "14648", + "keys": "-1757352130,-1996516705,263017190,1647356258" + }, + { + "regionId": "14745", + "keys": "0,0,0,0" + }, + { + "regionId": "14746", + "keys": "2081288932,-143900986,-1978370486,-544919360" + }, + { + "regionId": "14747", + "keys": "-1578483383,-20501195,-1713759865,-1923019830" + }, + { + "regionId": "14891", + "keys": "-1481978705,1351387379,139803217,1691844424" + }, + { + "regionId": "14892", + "keys": "989249908,1611912325,-656482965,739987970" + }, + { + "regionId": "14893", + "keys": "-102394113,1484262111,933695487,-283213546" + }, + { + "regionId": "14894", + "keys": "1977203476,853289993,-2077288740,253834425" + }, + { + "regionId": "14895", + "keys": "1294223700,778677766,-2141486577,1402077049" + }, + { + "regionId": "14896", + "keys": "548765086,801664009,-1716752945,-1492954302" + }, + { + "regionId": "14901", + "keys": "0,0,0,0" + }, + { + "regionId": "14902", + "keys": "1158948283,-12013143,1242958376,-1265402384" + }, + { + "regionId": "14903", + "keys": "-1111240831,1790345264,-366658712,-331374702" + }, + { + "regionId": "14904", + "keys": "-1967472485,-192437954,1186759929,-2078112945" + }, + { + "regionId": "14994", + "keys": "413330323,-1806118667,1556971780,2103428744" + }, + { + "regionId": "14995", + "keys": "958328498,239876404,608758325,933929091" + }, + { + "regionId": "15001", + "keys": "0,0,0,0" + }, + { + "regionId": "15002", + "keys": "0,0,0,0" + }, + { + "regionId": "15003", + "keys": "0,0,0,0" + }, + { + "regionId": "15147", + "keys": "-423978185,359589519,280220972,-1608470374" + }, + { + "regionId": "15148", + "keys": "0,0,0,0" + }, + { + "regionId": "15149", + "keys": "-1200628316,15132614,-465260385,-1525542932" + }, + { + "regionId": "15150", + "keys": "14881828,-6662814,58238456,146761213" + }, + { + "regionId": "15151", + "keys": "867970623,-1689124083,1669326780,1599898304" + }, + { + "regionId": "15152", + "keys": "608495786,-1850745649,1481459068,44047411" + }, + { + "regionId": "15158", + "keys": "-974248920,-1426940984,-551894435,1783499939" + }, + { + "regionId": "15159", + "keys": "777796740,816768733,590882478,-1949779286" + }, + { + "regionId": "15160", + "keys": "-553466395,-1372948696,-1385390322,710626387" + }, + { + "regionId": "15248", + "keys": "552557289,1687845482,-1717041637,1667279986" + }, + { + "regionId": "15251", + "keys": "-1712638393,-327927536,168969136,485363494" + }, + { + "regionId": "15403", + "keys": "858832565,1542433274,-759104113,425400841" + }, + { + "regionId": "15404", + "keys": "1359247125,-1375693391,-1964404624,-1289877028" + }, + { + "regionId": "15405", + "keys": "1745315296,704015968,-1726703759,250744336" + }, + { + "regionId": "15406", + "keys": "900232781,1037303290,2099698517,-1839409134" + }, + { + "regionId": "15407", + "keys": "-1139819812,165771634,462281145,-1626973480" + }, + { + "regionId": "15408", + "keys": "1024233955,-1429048064,1595885074,-1194249874" + }, + { + "regionId": "15414", + "keys": "918566284,-159243781,471949969,-1198041007" + }, + { + "regionId": "15415", + "keys": "-1274724478,1165018389,2048231360,2009587731" + }, + { + "regionId": "15416", + "keys": "-1802759876,1171188898,1330028340,1790091100" + } + ] +} \ No newline at end of file diff --git a/Server/data/eco/autostock.json b/Server/data/eco/autostock.json new file mode 100644 index 000000000..09fa93713 --- /dev/null +++ b/Server/data/eco/autostock.json @@ -0,0 +1,69 @@ +{ + "offers": [ + { + "__comment" : "coal", + "item" : "453", + "qty" : "1000" + }, + { + "__comment" : "vial", + "item" : "227", + "qty" : "10000" + }, + { + "__comment" : "water vial", + "item" : "229", + "qty" : "10000" + }, + { + "__comment" : "cooked lobster", + "item" : "379", + "qty" : "10000" + }, + { + "__comment" : "Ashes", + "item" : "592", + "qty" : "1000" + }, + { + "__comment" : "Mort myre fungi", + "item" : "2970", + "qty" : "1000" + }, + { + "__comment" : "Poison ivy berries", + "item" : "6018", + "qty" : "1000" + }, + { + "__comment" : "Potato cactus", + "item" : "3138", + "qty" : "1000" + }, + { + "__comment" : "Unicorn horn", + "item" : "237", + "qty" : "1000" + }, + { + "__comment" : "Red spider eggs", + "item" : "223", + "qty" : "1000" + }, + { + "__comment" : "Bird nest", + "item" : "6693", + "qty" : "1000" + }, + { + "__comment" : "Chocolate dust", + "item" : "1975", + "qty" : "1000" + }, + { + "__comment" : "Limpwurt root", + "item" : "225", + "qty" : "10000" + } + ] +} diff --git a/Server/data/eco/bot_offers.json b/Server/data/eco/bot_offers.json new file mode 100644 index 000000000..fd6de26a8 --- /dev/null +++ b/Server/data/eco/bot_offers.json @@ -0,0 +1,656 @@ +{ + "offers": [ + { + "item": 7936, + "qty": 2700 + }, + { + "item": 1281, + "qty": 2 + }, + { + "item": 2307, + "qty": 64 + }, + { + "item": 2309, + "qty": 52 + }, + { + "item": 1291, + "qty": 5 + }, + { + "item": 1293, + "qty": 3 + }, + { + "item": 526, + "qty": 8630 + }, + { + "item": 1295, + "qty": 3 + }, + { + "item": 530, + "qty": 3 + }, + { + "item": 532, + "qty": 1 + }, + { + "item": 2335, + "qty": 1 + }, + { + "item": 288, + "qty": 11 + }, + { + "item": 1313, + "qty": 2 + }, + { + "item": 1321, + "qty": 3 + }, + { + "item": 554, + "qty": 1640 + }, + { + "item": 2347, + "qty": 175 + }, + { + "item": 555, + "qty": 1330 + }, + { + "item": 2859, + "qty": 31 + }, + { + "item": 556, + "qty": 1799 + }, + { + "item": 9004, + "qty": 1 + }, + { + "item": 557, + "qty": 1626 + }, + { + "item": 2349, + "qty": 17 + }, + { + "item": 558, + "qty": 10450 + }, + { + "item": 559, + "qty": 903 + }, + { + "item": 2351, + "qty": 8 + }, + { + "item": 560, + "qty": 36 + }, + { + "item": 2353, + "qty": 24 + }, + { + "item": 561, + "qty": 56 + }, + { + "item": 562, + "qty": 193 + }, + { + "item": 563, + "qty": 126 + }, + { + "item": 564, + "qty": 62 + }, + { + "item": 565, + "qty": 148 + }, + { + "item": 2357, + "qty": 9 + }, + { + "item": 2359, + "qty": 1 + }, + { + "item": 1592, + "qty": 1 + }, + { + "item": 313, + "qty": 158 + }, + { + "item": 569, + "qty": 26 + }, + { + "item": 825, + "qty": 5 + }, + { + "item": 314, + "qty": 291 + }, + { + "item": 1339, + "qty": 21 + }, + { + "item": 1595, + "qty": 4 + }, + { + "item": 1601, + "qty": 34 + }, + { + "item": 579, + "qty": 13 + }, + { + "item": 581, + "qty": 1 + }, + { + "item": 1349, + "qty": 1 + }, + { + "item": 839, + "qty": 1 + }, + { + "item": 1351, + "qty": 1 + }, + { + "item": 1103, + "qty": 8 + }, + { + "item": 1615, + "qty": 3 + }, + { + "item": 592, + "qty": 1563 + }, + { + "item": 1617, + "qty": 4 + }, + { + "item": 1363, + "qty": 1 + }, + { + "item": 2132, + "qty": 339 + }, + { + "item": 1621, + "qty": 7 + }, + { + "item": 2134, + "qty": 117 + }, + { + "item": 1623, + "qty": 1 + }, + { + "item": 2136, + "qty": 27 + }, + { + "item": 2138, + "qty": 70 + }, + { + "item": 1115, + "qty": 16 + }, + { + "item": 1373, + "qty": 1 + }, + { + "item": 2142, + "qty": 13 + }, + { + "item": 1375, + "qty": 8 + }, + { + "item": 863, + "qty": 1 + }, + { + "item": 2146, + "qty": 51 + }, + { + "item": 1379, + "qty": 13 + }, + { + "item": 1381, + "qty": 36 + }, + { + "item": 1383, + "qty": 1 + }, + { + "item": 1129, + "qty": 1 + }, + { + "item": 877, + "qty": 1559 + }, + { + "item": 882, + "qty": 13542 + }, + { + "item": 1139, + "qty": 148 + }, + { + "item": 884, + "qty": 1978 + }, + { + "item": 1141, + "qty": 3 + }, + { + "item": 886, + "qty": 443 + }, + { + "item": 888, + "qty": 16 + }, + { + "item": 1913, + "qty": 1 + }, + { + "item": 1917, + "qty": 19 + }, + { + "item": 1153, + "qty": 5 + }, + { + "item": 2434, + "qty": 22 + }, + { + "item": 1155, + "qty": 8 + }, + { + "item": 1925, + "qty": 58 + }, + { + "item": 1927, + "qty": 7 + }, + { + "item": 1929, + "qty": 6 + }, + { + "item": 1931, + "qty": 11 + }, + { + "item": 1420, + "qty": 1 + }, + { + "item": 1933, + "qty": 10 + }, + { + "item": 1935, + "qty": 12 + }, + { + "item": 1937, + "qty": 9 + }, + { + "item": 1173, + "qty": 15 + }, + { + "item": 1944, + "qty": 39 + }, + { + "item": 2714, + "qty": 1 + }, + { + "item": 1947, + "qty": 66 + }, + { + "item": 1949, + "qty": 75 + }, + { + "item": 1438, + "qty": 133 + }, + { + "item": 1440, + "qty": 108 + }, + { + "item": 1442, + "qty": 25 + }, + { + "item": 1444, + "qty": 7 + }, + { + "item": 1189, + "qty": 7 + }, + { + "item": 1446, + "qty": 167 + }, + { + "item": 1448, + "qty": 59 + }, + { + "item": 1965, + "qty": 216 + }, + { + "item": 173, + "qty": 13 + }, + { + "item": 1458, + "qty": 94 + }, + { + "item": 946, + "qty": 29 + }, + { + "item": 5298, + "qty": 1 + }, + { + "item": 434, + "qty": 13 + }, + { + "item": 1203, + "qty": 301 + }, + { + "item": 436, + "qty": 208 + }, + { + "item": 9140, + "qty": 1485 + }, + { + "item": 948, + "qty": 30 + }, + { + "item": 2485, + "qty": 41 + }, + { + "item": 1205, + "qty": 7 + }, + { + "item": 438, + "qty": 118 + }, + { + "item": 440, + "qty": 409 + }, + { + "item": 442, + "qty": 24 + }, + { + "item": 954, + "qty": 60 + }, + { + "item": 444, + "qty": 206 + }, + { + "item": 1470, + "qty": 95 + }, + { + "item": 1472, + "qty": 91 + }, + { + "item": 1474, + "qty": 110 + }, + { + "item": 195, + "qty": 15 + }, + { + "item": 1987, + "qty": 3 + }, + { + "item": 1476, + "qty": 115 + }, + { + "item": 453, + "qty": 156 + }, + { + "item": 5318, + "qty": 893 + }, + { + "item": 454, + "qty": 18 + }, + { + "item": 199, + "qty": 265 + }, + { + "item": 5319, + "qty": 676 + }, + { + "item": 1735, + "qty": 48 + }, + { + "item": 5320, + "qty": 51 + }, + { + "item": 1993, + "qty": 41 + }, + { + "item": 201, + "qty": 149 + }, + { + "item": 5321, + "qty": 34 + }, + { + "item": 5322, + "qty": 285 + }, + { + "item": 1739, + "qty": 8877 + }, + { + "item": 203, + "qty": 161 + }, + { + "item": 5323, + "qty": 42 + }, + { + "item": 5324, + "qty": 300 + }, + { + "item": 205, + "qty": 151 + }, + { + "item": 207, + "qty": 118 + }, + { + "item": 209, + "qty": 138 + }, + { + "item": 211, + "qty": 136 + }, + { + "item": 213, + "qty": 112 + }, + { + "item": 1237, + "qty": 21 + }, + { + "item": 215, + "qty": 53 + }, + { + "item": 217, + "qty": 38 + }, + { + "item": 3801, + "qty": 1 + }, + { + "item": 1759, + "qty": 101 + }, + { + "item": 223, + "qty": 7 + }, + { + "item": 225, + "qty": 5 + }, + { + "item": 1249, + "qty": 1 + }, + { + "item": 9442, + "qty": 7 + }, + { + "item": 229, + "qty": 2 + }, + { + "item": 1511, + "qty": 8419 + }, + { + "item": 237, + "qty": 114 + }, + { + "item": 1519, + "qty": 24191 + }, + { + "item": 1521, + "qty": 35147 + }, + { + "item": 753, + "qty": 63 + }, + { + "item": 1777, + "qty": 19809 + }, + { + "item": 1009, + "qty": 7 + }, + { + "item": 1265, + "qty": 4 + }, + { + "item": 1277, + "qty": 12 + }, + { + "item": 1279, + "qty": 3 + } + ] +} \ No newline at end of file diff --git a/Server/data/eco/ge_resource.emp b/Server/data/eco/ge_resource.emp new file mode 100644 index 000000000..f96c401f3 --- /dev/null +++ b/Server/data/eco/ge_resource.emp @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Server/data/eco/gedb.xml b/Server/data/eco/gedb.xml new file mode 100644 index 000000000..306861c2c --- /dev/null +++ b/Server/data/eco/gedb.xml @@ -0,0 +1,102497 @@ + + + + 0 + 1 + 0 + 0 + 0 + + + 1 + 1 + 0 + 0 + 0 + + + 2 + 5 + 0 + 0 + 0 + + + 3 + 1 + 0 + 0 + 0 + + + 4 + 5 + 0 + 0 + 0 + + + 5 + 10 + 0 + 0 + 0 + + + 6 + 187500 + 0 + 0 + 0 + + + 7 + 187500 + 0 + 0 + 0 + + + 8 + 187500 + 0 + 0 + 0 + + + 9 + 187500 + 0 + 0 + 0 + + + 10 + 187500 + 0 + 0 + 0 + + + 11 + 187500 + 0 + 0 + 0 + + + 12 + 187500 + 0 + 0 + 0 + + + 13 + 187500 + 0 + 0 + 0 + + + 14 + 1 + 0 + 0 + 0 + + + 15 + 10 + 0 + 0 + 0 + + + 16 + 10 + 0 + 0 + 0 + + + 17 + 10 + 0 + 0 + 0 + + + 18 + 2 + 0 + 0 + 0 + + + 19 + 3 + 0 + 0 + 0 + + + 20 + 1 + 0 + 0 + 0 + + + 21 + 1 + 0 + 0 + 0 + + + 22 + 1 + 0 + 0 + 0 + + + 23 + 1 + 0 + 0 + 0 + + + 24 + 1 + 0 + 0 + 0 + + + 25 + 1 + 0 + 0 + 0 + + + 26 + 1 + 0 + 0 + 0 + + + 27 + 1 + 0 + 0 + 0 + + + 28 + 3 + 0 + 0 + 0 + + + 29 + 1 + 0 + 0 + 0 + + + 30 + 6 + 0 + 0 + 0 + + + 31 + 1 + 0 + 0 + 0 + + + 32 + 3 + 0 + 0 + 0 + + + 33 + 3 + 0 + 0 + 0 + + + 34 + 3 + 0 + 0 + 0 + + + 35 + 200 + 0 + 0 + 0 + + + 36 + 3 + 0 + 0 + 0 + + + 37 + 3 + 0 + 0 + 0 + + + 38 + 3 + 0 + 0 + 0 + + + 39 + 10 + 0 + 0 + 0 + + + 40 + 26 + 0 + 0 + 0 + + + 41 + 36 + 0 + 0 + 0 + + + 42 + 68 + 0 + 0 + 0 + + + 43 + 160 + 0 + 0 + 0 + + + 44 + 460 + 0 + 0 + 0 + + + 45 + 7 + 0 + 0 + 0 + + + 46 + 12 + 0 + 0 + 0 + + + 47 + 95 + 0 + 0 + 0 + + + 48 + 60 + 0 + 0 + 0 + + + 49 + 60 + 0 + 0 + 0 + + + 50 + 23 + 0 + 0 + 0 + + + 51 + 23 + 0 + 0 + 0 + + + 52 + 12 + 0 + 0 + 0 + + + 53 + 1 + 0 + 0 + 0 + + + 54 + 50 + 0 + 0 + 0 + + + 55 + 50 + 0 + 0 + 0 + + + 56 + 80 + 0 + 0 + 0 + + + 57 + 80 + 0 + 0 + 0 + + + 58 + 160 + 0 + 0 + 0 + + + 59 + 160 + 0 + 0 + 0 + + + 60 + 100 + 0 + 0 + 0 + + + 61 + 100 + 0 + 0 + 0 + + + 62 + 320 + 0 + 0 + 0 + + + 63 + 320 + 0 + 0 + 0 + + + 64 + 200 + 0 + 0 + 0 + + + 65 + 200 + 0 + 0 + 0 + + + 66 + 640 + 0 + 0 + 0 + + + 67 + 640 + 0 + 0 + 0 + + + 68 + 400 + 0 + 0 + 0 + + + 69 + 400 + 0 + 0 + 0 + + + 70 + 1280 + 0 + 0 + 0 + + + 71 + 1280 + 0 + 0 + 0 + + + 72 + 800 + 0 + 0 + 0 + + + 73 + 800 + 0 + 0 + 0 + + + 74 + 10 + 0 + 0 + 0 + + + 75 + 12 + 0 + 0 + 0 + + + 76 + 1 + 0 + 0 + 0 + + + 77 + 5 + 0 + 0 + 0 + + + 78 + 2 + 0 + 0 + 0 + + + 79 + 1 + 0 + 0 + 0 + + + 80 + 1 + 0 + 0 + 0 + + + 81 + 1 + 0 + 0 + 0 + + + 82 + 1 + 0 + 0 + 0 + + + 83 + 15 + 0 + 0 + 0 + + + 84 + 15 + 0 + 0 + 0 + + + 85 + 1 + 0 + 0 + 0 + + + 86 + 12 + 0 + 0 + 0 + + + 87 + 12 + 0 + 0 + 0 + + + 88 + 6 + 0 + 0 + 0 + + + 89 + 6 + 0 + 0 + 0 + + + 90 + 5 + 0 + 0 + 0 + + + 91 + 3 + 0 + 0 + 0 + + + 92 + 3 + 0 + 0 + 0 + + + 93 + 5 + 0 + 0 + 0 + + + 94 + 5 + 0 + 0 + 0 + + + 95 + 11 + 0 + 0 + 0 + + + 96 + 11 + 0 + 0 + 0 + + + 97 + 20 + 0 + 0 + 0 + + + 98 + 20 + 0 + 0 + 0 + + + 99 + 25 + 0 + 0 + 0 + + + 100 + 25 + 0 + 0 + 0 + + + 101 + 40 + 0 + 0 + 0 + + + 102 + 40 + 0 + 0 + 0 + + + 103 + 48 + 0 + 0 + 0 + + + 104 + 48 + 0 + 0 + 0 + + + 105 + 54 + 0 + 0 + 0 + + + 106 + 54 + 0 + 0 + 0 + + + 107 + 65 + 0 + 0 + 0 + + + 108 + 65 + 0 + 0 + 0 + + + 109 + 70 + 0 + 0 + 0 + + + 110 + 70 + 0 + 0 + 0 + + + 111 + 25 + 0 + 0 + 0 + + + 112 + 25 + 0 + 0 + 0 + + + 113 + 1500 + 0 + 0 + 0 + + + 114 + 1500 + 0 + 0 + 0 + + + 115 + 1200 + 0 + 0 + 0 + + + 116 + 1200 + 0 + 0 + 0 + + + 117 + 900 + 0 + 0 + 0 + + + 118 + 900 + 0 + 0 + 0 + + + 119 + 600 + 0 + 0 + 0 + + + 120 + 600 + 0 + 0 + 0 + + + 121 + 560 + 0 + 0 + 0 + + + 122 + 560 + 0 + 0 + 0 + + + 123 + 420 + 0 + 0 + 0 + + + 124 + 420 + 0 + 0 + 0 + + + 125 + 280 + 0 + 0 + 0 + + + 126 + 280 + 0 + 0 + 0 + + + 127 + 88 + 0 + 0 + 0 + + + 128 + 88 + 0 + 0 + 0 + + + 129 + 66 + 0 + 0 + 0 + + + 130 + 66 + 0 + 0 + 0 + + + 131 + 44 + 0 + 0 + 0 + + + 132 + 44 + 0 + 0 + 0 + + + 133 + 880 + 0 + 0 + 0 + + + 134 + 880 + 0 + 0 + 0 + + + 135 + 660 + 0 + 0 + 0 + + + 136 + 660 + 0 + 0 + 0 + + + 137 + 440 + 0 + 0 + 0 + + + 138 + 440 + 0 + 0 + 0 + + + 139 + 152 + 0 + 0 + 0 + + + 140 + 152 + 0 + 0 + 0 + + + 141 + 114 + 0 + 0 + 0 + + + 142 + 114 + 0 + 0 + 0 + + + 143 + 76 + 0 + 0 + 0 + + + 144 + 76 + 0 + 0 + 0 + + + 145 + 180 + 0 + 0 + 0 + + + 146 + 180 + 0 + 0 + 0 + + + 147 + 135 + 0 + 0 + 0 + + + 148 + 135 + 0 + 0 + 0 + + + 149 + 90 + 0 + 0 + 0 + + + 150 + 90 + 0 + 0 + 0 + + + 151 + 200 + 0 + 0 + 0 + + + 152 + 200 + 0 + 0 + 0 + + + 153 + 150 + 0 + 0 + 0 + + + 154 + 150 + 0 + 0 + 0 + + + 155 + 100 + 0 + 0 + 0 + + + 156 + 100 + 0 + 0 + 0 + + + 157 + 220 + 0 + 0 + 0 + + + 158 + 220 + 0 + 0 + 0 + + + 159 + 165 + 0 + 0 + 0 + + + 160 + 165 + 0 + 0 + 0 + + + 161 + 110 + 0 + 0 + 0 + + + 162 + 110 + 0 + 0 + 0 + + + 163 + 264 + 0 + 0 + 0 + + + 164 + 264 + 0 + 0 + 0 + + + 165 + 198 + 0 + 0 + 0 + + + 166 + 198 + 0 + 0 + 0 + + + 167 + 132 + 0 + 0 + 0 + + + 168 + 132 + 0 + 0 + 0 + + + 169 + 288 + 0 + 0 + 0 + + + 170 + 288 + 0 + 0 + 0 + + + 171 + 216 + 0 + 0 + 0 + + + 172 + 216 + 0 + 0 + 0 + + + 173 + 144 + 0 + 0 + 0 + + + 174 + 144 + 0 + 0 + 0 + + + 175 + 288 + 0 + 0 + 0 + + + 176 + 288 + 0 + 0 + 0 + + + 177 + 216 + 0 + 0 + 0 + + + 178 + 216 + 0 + 0 + 0 + + + 179 + 144 + 0 + 0 + 0 + + + 180 + 144 + 0 + 0 + 0 + + + 181 + 288 + 0 + 0 + 0 + + + 182 + 288 + 0 + 0 + 0 + + + 183 + 216 + 0 + 0 + 0 + + + 184 + 216 + 0 + 0 + 0 + + + 185 + 144 + 0 + 0 + 0 + + + 186 + 144 + 0 + 0 + 0 + + + 187 + 144 + 0 + 0 + 0 + + + 188 + 144 + 0 + 0 + 0 + + + 189 + 175 + 0 + 0 + 0 + + + 190 + 175 + 0 + 0 + 0 + + + 191 + 150 + 0 + 0 + 0 + + + 192 + 150 + 0 + 0 + 0 + + + 193 + 125 + 0 + 0 + 0 + + + 194 + 125 + 0 + 0 + 0 + + + 195 + 1 + 0 + 0 + 0 + + + 196 + 1 + 0 + 0 + 0 + + + 197 + 20 + 0 + 0 + 0 + + + 198 + 20 + 0 + 0 + 0 + + + 199 + 1 + 0 + 0 + 0 + + + 200 + 1 + 0 + 0 + 0 + + + 201 + 1 + 0 + 0 + 0 + + + 202 + 1 + 0 + 0 + 0 + + + 203 + 1 + 0 + 0 + 0 + + + 204 + 1 + 0 + 0 + 0 + + + 205 + 1 + 0 + 0 + 0 + + + 206 + 1 + 0 + 0 + 0 + + + 207 + 1 + 0 + 0 + 0 + + + 208 + 1 + 0 + 0 + 0 + + + 209 + 1 + 0 + 0 + 0 + + + 210 + 1 + 0 + 0 + 0 + + + 211 + 1 + 0 + 0 + 0 + + + 212 + 1 + 0 + 0 + 0 + + + 213 + 1 + 0 + 0 + 0 + + + 214 + 1 + 0 + 0 + 0 + + + 215 + 1 + 0 + 0 + 0 + + + 216 + 1 + 0 + 0 + 0 + + + 217 + 1 + 0 + 0 + 0 + + + 218 + 1 + 0 + 0 + 0 + + + 219 + 1 + 0 + 0 + 0 + + + 220 + 1 + 0 + 0 + 0 + + + 221 + 3 + 0 + 0 + 0 + + + 222 + 3 + 0 + 0 + 0 + + + 223 + 7 + 0 + 0 + 0 + + + 224 + 7 + 0 + 0 + 0 + + + 225 + 7 + 0 + 0 + 0 + + + 226 + 7 + 0 + 0 + 0 + + + 227 + 10 + 0 + 0 + 0 + + + 228 + 10 + 0 + 0 + 0 + + + 229 + 5 + 0 + 0 + 0 + + + 230 + 5 + 0 + 0 + 0 + + + 231 + 10 + 0 + 0 + 0 + + + 232 + 10 + 0 + 0 + 0 + + + 233 + 4 + 0 + 0 + 0 + + + 234 + 4 + 0 + 0 + 0 + + + 235 + 20 + 0 + 0 + 0 + + + 236 + 20 + 0 + 0 + 0 + + + 237 + 20 + 0 + 0 + 0 + + + 238 + 20 + 0 + 0 + 0 + + + 239 + 10 + 0 + 0 + 0 + + + 240 + 10 + 0 + 0 + 0 + + + 241 + 52 + 0 + 0 + 0 + + + 242 + 52 + 0 + 0 + 0 + + + 243 + 50 + 0 + 0 + 0 + + + 244 + 50 + 0 + 0 + 0 + + + 245 + 1 + 0 + 0 + 0 + + + 246 + 1 + 0 + 0 + 0 + + + 247 + 1 + 0 + 0 + 0 + + + 248 + 1 + 0 + 0 + 0 + + + 249 + 3 + 0 + 0 + 0 + + + 250 + 3 + 0 + 0 + 0 + + + 251 + 5 + 0 + 0 + 0 + + + 252 + 5 + 0 + 0 + 0 + + + 253 + 11 + 0 + 0 + 0 + + + 254 + 11 + 0 + 0 + 0 + + + 255 + 20 + 0 + 0 + 0 + + + 256 + 20 + 0 + 0 + 0 + + + 257 + 25 + 0 + 0 + 0 + + + 258 + 25 + 0 + 0 + 0 + + + 259 + 40 + 0 + 0 + 0 + + + 260 + 40 + 0 + 0 + 0 + + + 261 + 48 + 0 + 0 + 0 + + + 262 + 48 + 0 + 0 + 0 + + + 263 + 54 + 0 + 0 + 0 + + + 264 + 54 + 0 + 0 + 0 + + + 265 + 65 + 0 + 0 + 0 + + + 266 + 65 + 0 + 0 + 0 + + + 267 + 70 + 0 + 0 + 0 + + + 268 + 70 + 0 + 0 + 0 + + + 269 + 75 + 0 + 0 + 0 + + + 270 + 75 + 0 + 0 + 0 + + + 271 + 1 + 0 + 0 + 0 + + + 272 + 1 + 0 + 0 + 0 + + + 273 + 1 + 0 + 0 + 0 + + + 274 + 1 + 0 + 0 + 0 + + + 275 + 1 + 0 + 0 + 0 + + + 276 + 3 + 0 + 0 + 0 + + + 277 + 3 + 0 + 0 + 0 + + + 278 + 3 + 0 + 0 + 0 + + + 279 + 3 + 0 + 0 + 0 + + + 280 + 1 + 0 + 0 + 0 + + + 281 + 1 + 0 + 0 + 0 + + + 282 + 1 + 0 + 0 + 0 + + + 283 + 1 + 0 + 0 + 0 + + + 284 + 50 + 0 + 0 + 0 + + + 285 + 50 + 0 + 0 + 0 + + + 286 + 40 + 0 + 0 + 0 + + + 287 + 40 + 0 + 0 + 0 + + + 288 + 40 + 0 + 0 + 0 + + + 289 + 40 + 0 + 0 + 0 + + + 290 + 2 + 0 + 0 + 0 + + + 291 + 5 + 0 + 0 + 0 + + + 292 + 2 + 0 + 0 + 0 + + + 293 + 1 + 0 + 0 + 0 + + + 294 + 1 + 0 + 0 + 0 + + + 295 + 1 + 0 + 0 + 0 + + + 296 + 1 + 0 + 0 + 0 + + + 297 + 1 + 0 + 0 + 0 + + + 298 + 1 + 0 + 0 + 0 + + + 299 + 300 + 0 + 0 + 0 + + + 300 + 3 + 0 + 0 + 0 + + + 301 + 20 + 0 + 0 + 0 + + + 302 + 20 + 0 + 0 + 0 + + + 303 + 5 + 0 + 0 + 0 + + + 304 + 5 + 0 + 0 + 0 + + + 305 + 20 + 0 + 0 + 0 + + + 306 + 20 + 0 + 0 + 0 + + + 307 + 5 + 0 + 0 + 0 + + + 308 + 5 + 0 + 0 + 0 + + + 309 + 5 + 0 + 0 + 0 + + + 310 + 5 + 0 + 0 + 0 + + + 311 + 5 + 0 + 0 + 0 + + + 312 + 5 + 0 + 0 + 0 + + + 313 + 3 + 0 + 0 + 0 + + + 314 + 6 + 0 + 0 + 0 + + + 315 + 5 + 0 + 0 + 0 + + + 316 + 5 + 0 + 0 + 0 + + + 317 + 6 + 0 + 0 + 0 + + + 318 + 6 + 0 + 0 + 0 + + + 319 + 15 + 0 + 0 + 0 + + + 320 + 15 + 0 + 0 + 0 + + + 321 + 16 + 0 + 0 + 0 + + + 322 + 16 + 0 + 0 + 0 + + + 323 + 1 + 0 + 0 + 0 + + + 324 + 1 + 0 + 0 + 0 + + + 325 + 10 + 0 + 0 + 0 + + + 326 + 10 + 0 + 0 + 0 + + + 327 + 10 + 0 + 0 + 0 + + + 328 + 10 + 0 + 0 + 0 + + + 329 + 88 + 0 + 0 + 0 + + + 330 + 88 + 0 + 0 + 0 + + + 331 + 92 + 0 + 0 + 0 + + + 332 + 92 + 0 + 0 + 0 + + + 333 + 68 + 0 + 0 + 0 + + + 334 + 68 + 0 + 0 + 0 + + + 335 + 20 + 0 + 0 + 0 + + + 336 + 20 + 0 + 0 + 0 + + + 337 + 50 + 0 + 0 + 0 + + + 338 + 50 + 0 + 0 + 0 + + + 339 + 26 + 0 + 0 + 0 + + + 340 + 26 + 0 + 0 + 0 + + + 341 + 34 + 0 + 0 + 0 + + + 342 + 34 + 0 + 0 + 0 + + + 343 + 1 + 0 + 0 + 0 + + + 344 + 1 + 0 + 0 + 0 + + + 345 + 16 + 0 + 0 + 0 + + + 346 + 16 + 0 + 0 + 0 + + + 347 + 15 + 0 + 0 + 0 + + + 348 + 15 + 0 + 0 + 0 + + + 349 + 25 + 0 + 0 + 0 + + + 350 + 25 + 0 + 0 + 0 + + + 351 + 25 + 0 + 0 + 0 + + + 352 + 25 + 0 + 0 + 0 + + + 353 + 26 + 0 + 0 + 0 + + + 354 + 26 + 0 + 0 + 0 + + + 355 + 17 + 0 + 0 + 0 + + + 356 + 17 + 0 + 0 + 0 + + + 357 + 1 + 0 + 0 + 0 + + + 358 + 1 + 0 + 0 + 0 + + + 359 + 120 + 0 + 0 + 0 + + + 360 + 120 + 0 + 0 + 0 + + + 361 + 120 + 0 + 0 + 0 + + + 362 + 120 + 0 + 0 + 0 + + + 363 + 280 + 0 + 0 + 0 + + + 364 + 280 + 0 + 0 + 0 + + + 365 + 270 + 0 + 0 + 0 + + + 366 + 270 + 0 + 0 + 0 + + + 367 + 1 + 0 + 0 + 0 + + + 368 + 1 + 0 + 0 + 0 + + + 369 + 1 + 0 + 0 + 0 + + + 370 + 1 + 0 + 0 + 0 + + + 371 + 340 + 0 + 0 + 0 + + + 372 + 340 + 0 + 0 + 0 + + + 373 + 400 + 0 + 0 + 0 + + + 374 + 400 + 0 + 0 + 0 + + + 375 + 1 + 0 + 0 + 0 + + + 376 + 1 + 0 + 0 + 0 + + + 377 + 284 + 0 + 0 + 0 + + + 378 + 284 + 0 + 0 + 0 + + + 379 + 268 + 0 + 0 + 0 + + + 380 + 268 + 0 + 0 + 0 + + + 381 + 1 + 0 + 0 + 0 + + + 382 + 1 + 0 + 0 + 0 + + + 383 + 300 + 0 + 0 + 0 + + + 384 + 300 + 0 + 0 + 0 + + + 385 + 300 + 0 + 0 + 0 + + + 386 + 300 + 0 + 0 + 0 + + + 387 + 1 + 0 + 0 + 0 + + + 388 + 1 + 0 + 0 + 0 + + + 389 + 500 + 0 + 0 + 0 + + + 390 + 500 + 0 + 0 + 0 + + + 391 + 500 + 0 + 0 + 0 + + + 392 + 500 + 0 + 0 + 0 + + + 393 + 1 + 0 + 0 + 0 + + + 394 + 1 + 0 + 0 + 0 + + + 395 + 500 + 0 + 0 + 0 + + + 396 + 500 + 0 + 0 + 0 + + + 397 + 500 + 0 + 0 + 0 + + + 398 + 500 + 0 + 0 + 0 + + + 399 + 1 + 0 + 0 + 0 + + + 400 + 1 + 0 + 0 + 0 + + + 401 + 2 + 0 + 0 + 0 + + + 402 + 2 + 0 + 0 + 0 + + + 403 + 2 + 0 + 0 + 0 + + + 404 + 2 + 0 + 0 + 0 + + + 405 + 50 + 0 + 0 + 0 + + + 406 + 50 + 0 + 0 + 0 + + + 407 + 200 + 0 + 0 + 0 + + + 408 + 200 + 0 + 0 + 0 + + + 409 + 5 + 0 + 0 + 0 + + + 410 + 5 + 0 + 0 + 0 + + + 411 + 112 + 0 + 0 + 0 + + + 412 + 112 + 0 + 0 + 0 + + + 413 + 1400 + 0 + 0 + 0 + + + 414 + 1400 + 0 + 0 + 0 + + + 415 + 10 + 0 + 0 + 0 + + + 416 + 1 + 0 + 0 + 0 + + + 417 + 1 + 0 + 0 + 0 + + + 418 + 1 + 0 + 0 + 0 + + + 419 + 1 + 0 + 0 + 0 + + + 420 + 1 + 0 + 0 + 0 + + + 421 + 10 + 0 + 0 + 0 + + + 422 + 1 + 0 + 0 + 0 + + + 423 + 1 + 0 + 0 + 0 + + + 424 + 1 + 0 + 0 + 0 + + + 425 + 1 + 0 + 0 + 0 + + + 426 + 5 + 0 + 0 + 0 + + + 427 + 5 + 0 + 0 + 0 + + + 428 + 5 + 0 + 0 + 0 + + + 429 + 5 + 0 + 0 + 0 + + + 430 + 40 + 0 + 0 + 0 + + + 431 + 30 + 0 + 0 + 0 + + + 432 + 1 + 0 + 0 + 0 + + + 433 + 1 + 0 + 0 + 0 + + + 434 + 1 + 0 + 0 + 0 + + + 435 + 1 + 0 + 0 + 0 + + + 436 + 20 + 0 + 0 + 0 + + + 437 + 20 + 0 + 0 + 0 + + + 438 + 20 + 0 + 0 + 0 + + + 439 + 20 + 0 + 0 + 0 + + + 440 + 17 + 0 + 0 + 0 + + + 441 + 17 + 0 + 0 + 0 + + + 442 + 75 + 0 + 0 + 0 + + + 443 + 75 + 0 + 0 + 0 + + + 444 + 150 + 0 + 0 + 0 + + + 445 + 150 + 0 + 0 + 0 + + + 446 + 150 + 0 + 0 + 0 + + + 447 + 162 + 0 + 0 + 0 + + + 448 + 162 + 0 + 0 + 0 + + + 449 + 400 + 0 + 0 + 0 + + + 450 + 400 + 0 + 0 + 0 + + + 451 + 3200 + 0 + 0 + 0 + + + 452 + 3200 + 0 + 0 + 0 + + + 453 + 45 + 0 + 0 + 0 + + + 454 + 45 + 0 + 0 + 0 + + + 455 + 10 + 0 + 0 + 0 + + + 456 + 10 + 0 + 0 + 0 + + + 457 + 10 + 0 + 0 + 0 + + + 458 + 10 + 0 + 0 + 0 + + + 459 + 10 + 0 + 0 + 0 + + + 460 + 10 + 0 + 0 + 0 + + + 461 + 10 + 0 + 0 + 0 + + + 462 + 10 + 0 + 0 + 0 + + + 463 + 10 + 0 + 0 + 0 + + + 464 + 1 + 0 + 0 + 0 + + + 465 + 1 + 0 + 0 + 0 + + + 466 + 1 + 0 + 0 + 0 + + + 467 + 1 + 0 + 0 + 0 + + + 468 + 1 + 0 + 0 + 0 + + + 469 + 1 + 0 + 0 + 0 + + + 470 + 1 + 0 + 0 + 0 + + + 471 + 1 + 0 + 0 + 0 + + + 472 + 17 + 0 + 0 + 0 + + + 473 + 17 + 0 + 0 + 0 + + + 474 + 43 + 0 + 0 + 0 + + + 475 + 43 + 0 + 0 + 0 + + + 476 + 107 + 0 + 0 + 0 + + + 477 + 107 + 0 + 0 + 0 + + + 478 + 1100 + 0 + 0 + 0 + + + 479 + 1100 + 0 + 0 + 0 + + + 480 + 1 + 0 + 0 + 0 + + + 481 + 1 + 0 + 0 + 0 + + + 482 + 139 + 0 + 0 + 0 + + + 483 + 139 + 0 + 0 + 0 + + + 484 + 499 + 0 + 0 + 0 + + + 485 + 499 + 0 + 0 + 0 + + + 486 + 1299 + 0 + 0 + 0 + + + 487 + 1299 + 0 + 0 + 0 + + + 488 + 3199 + 0 + 0 + 0 + + + 489 + 3199 + 0 + 0 + 0 + + + 490 + 31999 + 0 + 0 + 0 + + + 491 + 31999 + 0 + 0 + 0 + + + 492 + 1 + 0 + 0 + 0 + + + 493 + 1 + 0 + 0 + 0 + + + 494 + 1 + 0 + 0 + 0 + + + 495 + 1 + 0 + 0 + 0 + + + 496 + 1 + 0 + 0 + 0 + + + 497 + 1 + 0 + 0 + 0 + + + 498 + 1 + 0 + 0 + 0 + + + 499 + 1 + 0 + 0 + 0 + + + 500 + 10 + 0 + 0 + 0 + + + 501 + 10 + 0 + 0 + 0 + + + 502 + 18 + 0 + 0 + 0 + + + 503 + 18 + 0 + 0 + 0 + + + 504 + 43 + 0 + 0 + 0 + + + 505 + 43 + 0 + 0 + 0 + + + 506 + 427 + 0 + 0 + 0 + + + 507 + 427 + 0 + 0 + 0 + + + 508 + 15 + 0 + 0 + 0 + + + 509 + 15 + 0 + 0 + 0 + + + 510 + 55 + 0 + 0 + 0 + + + 511 + 55 + 0 + 0 + 0 + + + 512 + 199 + 0 + 0 + 0 + + + 513 + 199 + 0 + 0 + 0 + + + 514 + 383 + 0 + 0 + 0 + + + 515 + 383 + 0 + 0 + 0 + + + 516 + 519 + 0 + 0 + 0 + + + 517 + 519 + 0 + 0 + 0 + + + 518 + 1279 + 0 + 0 + 0 + + + 519 + 1279 + 0 + 0 + 0 + + + 520 + 12799 + 0 + 0 + 0 + + + 521 + 12799 + 0 + 0 + 0 + + + 522 + 1 + 0 + 0 + 0 + + + 523 + 1 + 0 + 0 + 0 + + + 524 + 1 + 0 + 0 + 0 + + + 525 + 1 + 0 + 0 + 0 + + + 526 + 1 + 0 + 0 + 0 + + + 527 + 1 + 0 + 0 + 0 + + + 528 + 1 + 0 + 0 + 0 + + + 529 + 1 + 0 + 0 + 0 + + + 530 + 1 + 0 + 0 + 0 + + + 531 + 1 + 0 + 0 + 0 + + + 532 + 1 + 0 + 0 + 0 + + + 533 + 1 + 0 + 0 + 0 + + + 534 + 1 + 0 + 0 + 0 + + + 535 + 1 + 0 + 0 + 0 + + + 536 + 1 + 0 + 0 + 0 + + + 537 + 1 + 0 + 0 + 0 + + + 538 + 30 + 0 + 0 + 0 + + + 539 + 30 + 0 + 0 + 0 + + + 540 + 40 + 0 + 0 + 0 + + + 541 + 40 + 0 + 0 + 0 + + + 542 + 30 + 0 + 0 + 0 + + + 543 + 30 + 0 + 0 + 0 + + + 544 + 40 + 0 + 0 + 0 + + + 545 + 40 + 0 + 0 + 0 + + + 546 + 40 + 0 + 0 + 0 + + + 547 + 1 + 0 + 0 + 0 + + + 548 + 30 + 0 + 0 + 0 + + + 549 + 1 + 0 + 0 + 0 + + + 550 + 1 + 0 + 0 + 0 + + + 551 + 1 + 0 + 0 + 0 + + + 552 + 35 + 0 + 0 + 0 + + + 553 + 1 + 0 + 0 + 0 + + + 554 + 17 + 0 + 0 + 0 + + + 555 + 17 + 0 + 0 + 0 + + + 556 + 17 + 0 + 0 + 0 + + + 557 + 17 + 0 + 0 + 0 + + + 558 + 17 + 0 + 0 + 0 + + + 559 + 16 + 0 + 0 + 0 + + + 560 + 310 + 0 + 0 + 0 + + + 561 + 372 + 0 + 0 + 0 + + + 562 + 140 + 0 + 0 + 0 + + + 563 + 378 + 0 + 0 + 0 + + + 564 + 232 + 0 + 0 + 0 + + + 565 + 550 + 0 + 0 + 0 + + + 566 + 410 + 0 + 0 + 0 + + + 567 + 100 + 0 + 0 + 0 + + + 568 + 100 + 0 + 0 + 0 + + + 569 + 300 + 0 + 0 + 0 + + + 570 + 300 + 0 + 0 + 0 + + + 571 + 300 + 0 + 0 + 0 + + + 572 + 300 + 0 + 0 + 0 + + + 573 + 300 + 0 + 0 + 0 + + + 574 + 300 + 0 + 0 + 0 + + + 575 + 300 + 0 + 0 + 0 + + + 576 + 300 + 0 + 0 + 0 + + + 577 + 15 + 0 + 0 + 0 + + + 578 + 15 + 0 + 0 + 0 + + + 579 + 2 + 0 + 0 + 0 + + + 580 + 2 + 0 + 0 + 0 + + + 581 + 13 + 0 + 0 + 0 + + + 582 + 13 + 0 + 0 + 0 + + + 583 + 10 + 0 + 0 + 0 + + + 584 + 10 + 0 + 0 + 0 + + + 585 + 10 + 0 + 0 + 0 + + + 586 + 10 + 0 + 0 + 0 + + + 587 + 1 + 0 + 0 + 0 + + + 588 + 1 + 0 + 0 + 0 + + + 589 + 1 + 0 + 0 + 0 + + + 590 + 1 + 0 + 0 + 0 + + + 591 + 1 + 0 + 0 + 0 + + + 592 + 2 + 0 + 0 + 0 + + + 593 + 2 + 0 + 0 + 0 + + + 594 + 4 + 0 + 0 + 0 + + + 595 + 4 + 0 + 0 + 0 + + + 596 + 4 + 0 + 0 + 0 + + + 597 + 4 + 0 + 0 + 0 + + + 598 + 10 + 0 + 0 + 0 + + + 599 + 1 + 0 + 0 + 0 + + + 600 + 3 + 0 + 0 + 0 + + + 601 + 1 + 0 + 0 + 0 + + + 602 + 1 + 0 + 0 + 0 + + + 603 + 3 + 0 + 0 + 0 + + + 604 + 1 + 0 + 0 + 0 + + + 605 + 1 + 0 + 0 + 0 + + + 606 + 1 + 0 + 0 + 0 + + + 607 + 1 + 0 + 0 + 0 + + + 608 + 1 + 0 + 0 + 0 + + + 609 + 1 + 0 + 0 + 0 + + + 610 + 1 + 0 + 0 + 0 + + + 611 + 1 + 0 + 0 + 0 + + + 612 + 1 + 0 + 0 + 0 + + + 613 + 1 + 0 + 0 + 0 + + + 614 + 1 + 0 + 0 + 0 + + + 615 + 1 + 0 + 0 + 0 + + + 616 + 1 + 0 + 0 + 0 + + + 617 + 1 + 0 + 0 + 0 + + + 618 + 1 + 0 + 0 + 0 + + + 619 + 5 + 0 + 0 + 0 + + + 620 + 5 + 0 + 0 + 0 + + + 621 + 5 + 0 + 0 + 0 + + + 622 + 1 + 0 + 0 + 0 + + + 623 + 1 + 0 + 0 + 0 + + + 624 + 1 + 0 + 0 + 0 + + + 625 + 5 + 0 + 0 + 0 + + + 626 + 200 + 0 + 0 + 0 + + + 627 + 200 + 0 + 0 + 0 + + + 628 + 200 + 0 + 0 + 0 + + + 629 + 200 + 0 + 0 + 0 + + + 630 + 200 + 0 + 0 + 0 + + + 631 + 200 + 0 + 0 + 0 + + + 632 + 200 + 0 + 0 + 0 + + + 633 + 200 + 0 + 0 + 0 + + + 634 + 200 + 0 + 0 + 0 + + + 635 + 200 + 0 + 0 + 0 + + + 636 + 180 + 0 + 0 + 0 + + + 637 + 180 + 0 + 0 + 0 + + + 638 + 180 + 0 + 0 + 0 + + + 639 + 180 + 0 + 0 + 0 + + + 640 + 180 + 0 + 0 + 0 + + + 641 + 180 + 0 + 0 + 0 + + + 642 + 180 + 0 + 0 + 0 + + + 643 + 180 + 0 + 0 + 0 + + + 644 + 180 + 0 + 0 + 0 + + + 645 + 180 + 0 + 0 + 0 + + + 646 + 180 + 0 + 0 + 0 + + + 647 + 180 + 0 + 0 + 0 + + + 648 + 180 + 0 + 0 + 0 + + + 649 + 180 + 0 + 0 + 0 + + + 650 + 180 + 0 + 0 + 0 + + + 651 + 180 + 0 + 0 + 0 + + + 652 + 180 + 0 + 0 + 0 + + + 653 + 180 + 0 + 0 + 0 + + + 654 + 180 + 0 + 0 + 0 + + + 655 + 180 + 0 + 0 + 0 + + + 656 + 160 + 0 + 0 + 0 + + + 657 + 160 + 0 + 0 + 0 + + + 658 + 160 + 0 + 0 + 0 + + + 659 + 160 + 0 + 0 + 0 + + + 660 + 160 + 0 + 0 + 0 + + + 661 + 160 + 0 + 0 + 0 + + + 662 + 160 + 0 + 0 + 0 + + + 663 + 160 + 0 + 0 + 0 + + + 664 + 160 + 0 + 0 + 0 + + + 665 + 160 + 0 + 0 + 0 + + + 666 + 3 + 0 + 0 + 0 + + + 667 + 200 + 0 + 0 + 0 + + + 668 + 3 + 0 + 0 + 0 + + + 669 + 1 + 0 + 0 + 0 + + + 670 + 1 + 0 + 0 + 0 + + + 671 + 1 + 0 + 0 + 0 + + + 672 + 1 + 0 + 0 + 0 + + + 673 + 1 + 0 + 0 + 0 + + + 674 + 1 + 0 + 0 + 0 + + + 675 + 1 + 0 + 0 + 0 + + + 676 + 1 + 0 + 0 + 0 + + + 677 + 1 + 0 + 0 + 0 + + + 678 + 1 + 0 + 0 + 0 + + + 679 + 1 + 0 + 0 + 0 + + + 680 + 1 + 0 + 0 + 0 + + + 681 + 1 + 0 + 0 + 0 + + + 682 + 1 + 0 + 0 + 0 + + + 683 + 1 + 0 + 0 + 0 + + + 684 + 1 + 0 + 0 + 0 + + + 685 + 1 + 0 + 0 + 0 + + + 686 + 1 + 0 + 0 + 0 + + + 687 + 1 + 0 + 0 + 0 + + + 688 + 1 + 0 + 0 + 0 + + + 689 + 1 + 0 + 0 + 0 + + + 690 + 1 + 0 + 0 + 0 + + + 691 + 1 + 0 + 0 + 0 + + + 692 + 1 + 0 + 0 + 0 + + + 693 + 1 + 0 + 0 + 0 + + + 694 + 1 + 0 + 0 + 0 + + + 695 + 1 + 0 + 0 + 0 + + + 696 + 1 + 0 + 0 + 0 + + + 697 + 1 + 0 + 0 + 0 + + + 698 + 1 + 0 + 0 + 0 + + + 699 + 1 + 0 + 0 + 0 + + + 700 + 1 + 0 + 0 + 0 + + + 701 + 1 + 0 + 0 + 0 + + + 702 + 1 + 0 + 0 + 0 + + + 703 + 1 + 0 + 0 + 0 + + + 704 + 1 + 0 + 0 + 0 + + + 705 + 1 + 0 + 0 + 0 + + + 706 + 1 + 0 + 0 + 0 + + + 707 + 1 + 0 + 0 + 0 + + + 708 + 1 + 0 + 0 + 0 + + + 709 + 1 + 0 + 0 + 0 + + + 710 + 1 + 0 + 0 + 0 + + + 711 + 1 + 0 + 0 + 0 + + + 712 + 1 + 0 + 0 + 0 + + + 713 + 1 + 0 + 0 + 0 + + + 714 + 1 + 0 + 0 + 0 + + + 715 + 1 + 0 + 0 + 0 + + + 716 + 1 + 0 + 0 + 0 + + + 717 + 1 + 0 + 0 + 0 + + + 718 + 1 + 0 + 0 + 0 + + + 719 + 1 + 0 + 0 + 0 + + + 720 + 10 + 0 + 0 + 0 + + + 721 + 700 + 0 + 0 + 0 + + + 722 + 700 + 0 + 0 + 0 + + + 723 + 700 + 0 + 0 + 0 + + + 724 + 700 + 0 + 0 + 0 + + + 725 + 700 + 0 + 0 + 0 + + + 726 + 700 + 0 + 0 + 0 + + + 727 + 2 + 0 + 0 + 0 + + + 728 + 1 + 0 + 0 + 0 + + + 729 + 1 + 0 + 0 + 0 + + + 730 + 1 + 0 + 0 + 0 + + + 731 + 1 + 0 + 0 + 0 + + + 732 + 1 + 0 + 0 + 0 + + + 733 + 1 + 0 + 0 + 0 + + + 734 + 1 + 0 + 0 + 0 + + + 735 + 1 + 0 + 0 + 0 + + + 736 + 1 + 0 + 0 + 0 + + + 737 + 1 + 0 + 0 + 0 + + + 738 + 1 + 0 + 0 + 0 + + + 739 + 1 + 0 + 0 + 0 + + + 740 + 2 + 0 + 0 + 0 + + + 741 + 1 + 0 + 0 + 0 + + + 742 + 1 + 0 + 0 + 0 + + + 743 + 1 + 0 + 0 + 0 + + + 744 + 1 + 0 + 0 + 0 + + + 745 + 1 + 0 + 0 + 0 + + + 746 + 1 + 0 + 0 + 0 + + + 747 + 1 + 0 + 0 + 0 + + + 748 + 1 + 0 + 0 + 0 + + + 749 + 1 + 0 + 0 + 0 + + + 750 + 1 + 0 + 0 + 0 + + + 751 + 1 + 0 + 0 + 0 + + + 752 + 1 + 0 + 0 + 0 + + + 753 + 1 + 0 + 0 + 0 + + + 754 + 1 + 0 + 0 + 0 + + + 755 + 5 + 0 + 0 + 0 + + + 756 + 1 + 0 + 0 + 0 + + + 757 + 1 + 0 + 0 + 0 + + + 758 + 1 + 0 + 0 + 0 + + + 759 + 1 + 0 + 0 + 0 + + + 760 + 1 + 0 + 0 + 0 + + + 761 + 5 + 0 + 0 + 0 + + + 762 + 1 + 0 + 0 + 0 + + + 763 + 1 + 0 + 0 + 0 + + + 764 + 1 + 0 + 0 + 0 + + + 765 + 1 + 0 + 0 + 0 + + + 766 + 1 + 0 + 0 + 0 + + + 767 + 4 + 0 + 0 + 0 + + + 768 + 4 + 0 + 0 + 0 + + + 769 + 1 + 0 + 0 + 0 + + + 770 + 1 + 0 + 0 + 0 + + + 771 + 15 + 0 + 0 + 0 + + + 772 + 15 + 0 + 0 + 0 + + + 773 + 2025 + 0 + 0 + 0 + + + 774 + 2175 + 0 + 0 + 0 + + + 775 + 1 + 0 + 0 + 0 + + + 776 + 1 + 0 + 0 + 0 + + + 777 + 1 + 0 + 0 + 0 + + + 778 + 1 + 0 + 0 + 0 + + + 779 + 1 + 0 + 0 + 0 + + + 780 + 1 + 0 + 0 + 0 + + + 781 + 1 + 0 + 0 + 0 + + + 782 + 1 + 0 + 0 + 0 + + + 783 + 2 + 0 + 0 + 0 + + + 784 + 2 + 0 + 0 + 0 + + + 785 + 2 + 0 + 0 + 0 + + + 786 + 2 + 0 + 0 + 0 + + + 787 + 2 + 0 + 0 + 0 + + + 788 + 1 + 0 + 0 + 0 + + + 789 + 1 + 0 + 0 + 0 + + + 790 + 1 + 0 + 0 + 0 + + + 791 + 1 + 0 + 0 + 0 + + + 792 + 1 + 0 + 0 + 0 + + + 793 + 1 + 0 + 0 + 0 + + + 794 + 2 + 0 + 0 + 0 + + + 795 + 2 + 0 + 0 + 0 + + + 796 + 1 + 0 + 0 + 0 + + + 797 + 1 + 0 + 0 + 0 + + + 798 + 1 + 0 + 0 + 0 + + + 799 + 1 + 0 + 0 + 0 + + + 800 + 4 + 0 + 0 + 0 + + + 801 + 13 + 0 + 0 + 0 + + + 802 + 38 + 0 + 0 + 0 + + + 803 + 105 + 0 + 0 + 0 + + + 804 + 262 + 0 + 0 + 0 + + + 805 + 698 + 0 + 0 + 0 + + + 806 + 1 + 0 + 0 + 0 + + + 807 + 2 + 0 + 0 + 0 + + + 808 + 10 + 0 + 0 + 0 + + + 809 + 25 + 0 + 0 + 0 + + + 810 + 65 + 0 + 0 + 0 + + + 811 + 350 + 0 + 0 + 0 + + + 812 + 1 + 0 + 0 + 0 + + + 813 + 2 + 0 + 0 + 0 + + + 814 + 10 + 0 + 0 + 0 + + + 815 + 25 + 0 + 0 + 0 + + + 816 + 65 + 0 + 0 + 0 + + + 817 + 350 + 0 + 0 + 0 + + + 818 + 1 + 0 + 0 + 0 + + + 819 + 1 + 0 + 0 + 0 + + + 820 + 3 + 0 + 0 + 0 + + + 821 + 5 + 0 + 0 + 0 + + + 822 + 12 + 0 + 0 + 0 + + + 823 + 36 + 0 + 0 + 0 + + + 824 + 175 + 0 + 0 + 0 + + + 825 + 6 + 0 + 0 + 0 + + + 826 + 8 + 0 + 0 + 0 + + + 827 + 37 + 0 + 0 + 0 + + + 828 + 98 + 0 + 0 + 0 + + + 829 + 246 + 0 + 0 + 0 + + + 830 + 624 + 0 + 0 + 0 + + + 831 + 4 + 0 + 0 + 0 + + + 832 + 6 + 0 + 0 + 0 + + + 833 + 24 + 0 + 0 + 0 + + + 834 + 64 + 0 + 0 + 0 + + + 835 + 160 + 0 + 0 + 0 + + + 836 + 400 + 0 + 0 + 0 + + + 837 + 70 + 0 + 0 + 0 + + + 838 + 70 + 0 + 0 + 0 + + + 839 + 80 + 0 + 0 + 0 + + + 840 + 80 + 0 + 0 + 0 + + + 841 + 50 + 0 + 0 + 0 + + + 842 + 50 + 0 + 0 + 0 + + + 843 + 100 + 0 + 0 + 0 + + + 844 + 100 + 0 + 0 + 0 + + + 845 + 160 + 0 + 0 + 0 + + + 846 + 160 + 0 + 0 + 0 + + + 847 + 320 + 0 + 0 + 0 + + + 848 + 320 + 0 + 0 + 0 + + + 849 + 200 + 0 + 0 + 0 + + + 850 + 200 + 0 + 0 + 0 + + + 851 + 640 + 0 + 0 + 0 + + + 852 + 640 + 0 + 0 + 0 + + + 853 + 400 + 0 + 0 + 0 + + + 854 + 400 + 0 + 0 + 0 + + + 855 + 1280 + 0 + 0 + 0 + + + 856 + 1280 + 0 + 0 + 0 + + + 857 + 800 + 0 + 0 + 0 + + + 858 + 800 + 0 + 0 + 0 + + + 859 + 2560 + 0 + 0 + 0 + + + 860 + 2560 + 0 + 0 + 0 + + + 861 + 1600 + 0 + 0 + 0 + + + 862 + 1600 + 0 + 0 + 0 + + + 863 + 58 + 0 + 0 + 0 + + + 864 + 14 + 0 + 0 + 0 + + + 865 + 68 + 0 + 0 + 0 + + + 866 + 27 + 0 + 0 + 0 + + + 867 + 66 + 0 + 0 + 0 + + + 868 + 167 + 0 + 0 + 0 + + + 869 + 19 + 0 + 0 + 0 + + + 870 + 1 + 0 + 0 + 0 + + + 871 + 3 + 0 + 0 + 0 + + + 872 + 10 + 0 + 0 + 0 + + + 873 + 27 + 0 + 0 + 0 + + + 874 + 18 + 0 + 0 + 0 + + + 875 + 66 + 0 + 0 + 0 + + + 876 + 166 + 0 + 0 + 0 + + + 877 + 3 + 0 + 0 + 0 + + + 878 + 3 + 0 + 0 + 0 + + + 879 + 7 + 0 + 0 + 0 + + + 880 + 13 + 0 + 0 + 0 + + + 881 + 200 + 0 + 0 + 0 + + + 882 + 7 + 0 + 0 + 0 + + + 883 + 1 + 0 + 0 + 0 + + + 884 + 20 + 0 + 0 + 0 + + + 885 + 3 + 0 + 0 + 0 + + + 886 + 46 + 0 + 0 + 0 + + + 887 + 12 + 0 + 0 + 0 + + + 888 + 76 + 0 + 0 + 0 + + + 889 + 32 + 0 + 0 + 0 + + + 890 + 172 + 0 + 0 + 0 + + + 891 + 80 + 0 + 0 + 0 + + + 892 + 510 + 0 + 0 + 0 + + + 893 + 400 + 0 + 0 + 0 + + + 894 + 1 + 0 + 0 + 0 + + + 895 + 1 + 0 + 0 + 0 + + + 896 + 1 + 0 + 0 + 0 + + + 897 + 1 + 0 + 0 + 0 + + + 898 + 1 + 0 + 0 + 0 + + + 899 + 1 + 0 + 0 + 0 + + + 900 + 1 + 0 + 0 + 0 + + + 901 + 1 + 0 + 0 + 0 + + + 902 + 1 + 0 + 0 + 0 + + + 903 + 1 + 0 + 0 + 0 + + + 904 + 1 + 0 + 0 + 0 + + + 905 + 1 + 0 + 0 + 0 + + + 906 + 1 + 0 + 0 + 0 + + + 907 + 1 + 0 + 0 + 0 + + + 908 + 1 + 0 + 0 + 0 + + + 909 + 1 + 0 + 0 + 0 + + + 910 + 1 + 0 + 0 + 0 + + + 911 + 1 + 0 + 0 + 0 + + + 912 + 1 + 0 + 0 + 0 + + + 913 + 1 + 0 + 0 + 0 + + + 914 + 1 + 0 + 0 + 0 + + + 915 + 1 + 0 + 0 + 0 + + + 916 + 1 + 0 + 0 + 0 + + + 917 + 1 + 0 + 0 + 0 + + + 918 + 1 + 0 + 0 + 0 + + + 919 + 1 + 0 + 0 + 0 + + + 920 + 1 + 0 + 0 + 0 + + + 921 + 1 + 0 + 0 + 0 + + + 922 + 1 + 0 + 0 + 0 + + + 923 + 1 + 0 + 0 + 0 + + + 924 + 1 + 0 + 0 + 0 + + + 925 + 1 + 0 + 0 + 0 + + + 926 + 1 + 0 + 0 + 0 + + + 927 + 1 + 0 + 0 + 0 + + + 928 + 1 + 0 + 0 + 0 + + + 929 + 1 + 0 + 0 + 0 + + + 930 + 1 + 0 + 0 + 0 + + + 931 + 1 + 0 + 0 + 0 + + + 932 + 1 + 0 + 0 + 0 + + + 933 + 1 + 0 + 0 + 0 + + + 934 + 1 + 0 + 0 + 0 + + + 935 + 1 + 0 + 0 + 0 + + + 936 + 1 + 0 + 0 + 0 + + + 937 + 1 + 0 + 0 + 0 + + + 938 + 1 + 0 + 0 + 0 + + + 939 + 1 + 0 + 0 + 0 + + + 940 + 1 + 0 + 0 + 0 + + + 941 + 1 + 0 + 0 + 0 + + + 942 + 10 + 0 + 0 + 0 + + + 943 + 1 + 0 + 0 + 0 + + + 944 + 1 + 0 + 0 + 0 + + + 945 + 1 + 0 + 0 + 0 + + + 946 + 6 + 0 + 0 + 0 + + + 947 + 6 + 0 + 0 + 0 + + + 948 + 10 + 0 + 0 + 0 + + + 949 + 10 + 0 + 0 + 0 + + + 950 + 55 + 0 + 0 + 0 + + + 951 + 55 + 0 + 0 + 0 + + + 952 + 3 + 0 + 0 + 0 + + + 953 + 3 + 0 + 0 + 0 + + + 954 + 18 + 0 + 0 + 0 + + + 955 + 18 + 0 + 0 + 0 + + + 956 + 1 + 0 + 0 + 0 + + + 957 + 1 + 0 + 0 + 0 + + + 958 + 150 + 0 + 0 + 0 + + + 959 + 150 + 0 + 0 + 0 + + + 960 + 100 + 0 + 0 + 0 + + + 961 + 100 + 0 + 0 + 0 + + + 962 + 1 + 0 + 0 + 0 + + + 963 + 1 + 0 + 0 + 0 + + + 964 + 1 + 0 + 0 + 0 + + + 965 + 1 + 0 + 0 + 0 + + + 966 + 1 + 0 + 0 + 0 + + + 967 + 1 + 0 + 0 + 0 + + + 968 + 1 + 0 + 0 + 0 + + + 969 + 1 + 0 + 0 + 0 + + + 970 + 10 + 0 + 0 + 0 + + + 971 + 10 + 0 + 0 + 0 + + + 972 + 1 + 0 + 0 + 0 + + + 973 + 45 + 0 + 0 + 0 + + + 974 + 45 + 0 + 0 + 0 + + + 975 + 52 + 0 + 0 + 0 + + + 976 + 52 + 0 + 0 + 0 + + + 977 + 1 + 0 + 0 + 0 + + + 978 + 1 + 0 + 0 + 0 + + + 979 + 1 + 0 + 0 + 0 + + + 980 + 1 + 0 + 0 + 0 + + + 981 + 12 + 0 + 0 + 0 + + + 982 + 12 + 0 + 0 + 0 + + + 983 + 1 + 0 + 0 + 0 + + + 984 + 1 + 0 + 0 + 0 + + + 985 + 1 + 0 + 0 + 0 + + + 986 + 1 + 0 + 0 + 0 + + + 987 + 1 + 0 + 0 + 0 + + + 988 + 1 + 0 + 0 + 0 + + + 989 + 1 + 0 + 0 + 0 + + + 990 + 1 + 0 + 0 + 0 + + + 991 + 1 + 0 + 0 + 0 + + + 992 + 1 + 0 + 0 + 0 + + + 993 + 1 + 0 + 0 + 0 + + + 994 + 1 + 0 + 0 + 0 + + + 995 + 1 + 0 + 0 + 0 + + + 996 + 1 + 0 + 0 + 0 + + + 997 + 1 + 0 + 0 + 0 + + + 998 + 1 + 0 + 0 + 0 + + + 999 + 1 + 0 + 0 + 0 + + + 1000 + 1 + 0 + 0 + 0 + + + 1001 + 1 + 0 + 0 + 0 + + + 1002 + 1 + 0 + 0 + 0 + + + 1003 + 1 + 0 + 0 + 0 + + + 1004 + 1 + 0 + 0 + 0 + + + 1005 + 2 + 0 + 0 + 0 + + + 1006 + 2 + 0 + 0 + 0 + + + 1007 + 20 + 0 + 0 + 0 + + + 1008 + 20 + 0 + 0 + 0 + + + 1009 + 30 + 0 + 0 + 0 + + + 1010 + 30 + 0 + 0 + 0 + + + 1011 + 2 + 0 + 0 + 0 + + + 1012 + 2 + 0 + 0 + 0 + + + 1013 + 2 + 0 + 0 + 0 + + + 1014 + 2 + 0 + 0 + 0 + + + 1015 + 2 + 0 + 0 + 0 + + + 1016 + 2 + 0 + 0 + 0 + + + 1017 + 2 + 0 + 0 + 0 + + + 1018 + 2 + 0 + 0 + 0 + + + 1019 + 20 + 0 + 0 + 0 + + + 1020 + 20 + 0 + 0 + 0 + + + 1021 + 20 + 0 + 0 + 0 + + + 1022 + 20 + 0 + 0 + 0 + + + 1023 + 20 + 0 + 0 + 0 + + + 1024 + 20 + 0 + 0 + 0 + + + 1025 + 2 + 0 + 0 + 0 + + + 1026 + 2 + 0 + 0 + 0 + + + 1027 + 20 + 0 + 0 + 0 + + + 1028 + 20 + 0 + 0 + 0 + + + 1029 + 20 + 0 + 0 + 0 + + + 1030 + 20 + 0 + 0 + 0 + + + 1031 + 20 + 0 + 0 + 0 + + + 1032 + 20 + 0 + 0 + 0 + + + 1033 + 30 + 0 + 0 + 0 + + + 1034 + 30 + 0 + 0 + 0 + + + 1035 + 40 + 0 + 0 + 0 + + + 1036 + 40 + 0 + 0 + 0 + + + 1037 + 1 + 0 + 0 + 0 + + + 1038 + 1 + 0 + 0 + 0 + + + 1039 + 1 + 0 + 0 + 0 + + + 1040 + 1 + 0 + 0 + 0 + + + 1041 + 1 + 0 + 0 + 0 + + + 1042 + 1 + 0 + 0 + 0 + + + 1043 + 1 + 0 + 0 + 0 + + + 1044 + 1 + 0 + 0 + 0 + + + 1045 + 1 + 0 + 0 + 0 + + + 1046 + 1 + 0 + 0 + 0 + + + 1047 + 1 + 0 + 0 + 0 + + + 1048 + 1 + 0 + 0 + 0 + + + 1049 + 1 + 0 + 0 + 0 + + + 1050 + 160 + 0 + 0 + 0 + + + 1051 + 160 + 0 + 0 + 0 + + + 1052 + 450 + 0 + 0 + 0 + + + 1053 + 15 + 0 + 0 + 0 + + + 1054 + 15 + 0 + 0 + 0 + + + 1055 + 15 + 0 + 0 + 0 + + + 1056 + 15 + 0 + 0 + 0 + + + 1057 + 15 + 0 + 0 + 0 + + + 1058 + 15 + 0 + 0 + 0 + + + 1059 + 6 + 0 + 0 + 0 + + + 1060 + 6 + 0 + 0 + 0 + + + 1061 + 6 + 0 + 0 + 0 + + + 1062 + 6 + 0 + 0 + 0 + + + 1063 + 18 + 0 + 0 + 0 + + + 1064 + 18 + 0 + 0 + 0 + + + 1065 + 2500 + 0 + 0 + 0 + + + 1066 + 2500 + 0 + 0 + 0 + + + 1067 + 280 + 0 + 0 + 0 + + + 1068 + 280 + 0 + 0 + 0 + + + 1069 + 1000 + 0 + 0 + 0 + + + 1070 + 1000 + 0 + 0 + 0 + + + 1071 + 2600 + 0 + 0 + 0 + + + 1072 + 2600 + 0 + 0 + 0 + + + 1073 + 6400 + 0 + 0 + 0 + + + 1074 + 6400 + 0 + 0 + 0 + + + 1075 + 80 + 0 + 0 + 0 + + + 1076 + 80 + 0 + 0 + 0 + + + 1077 + 1920 + 0 + 0 + 0 + + + 1078 + 1920 + 0 + 0 + 0 + + + 1079 + 64000 + 0 + 0 + 0 + + + 1080 + 64000 + 0 + 0 + 0 + + + 1081 + 280 + 0 + 0 + 0 + + + 1082 + 280 + 0 + 0 + 0 + + + 1083 + 1000 + 0 + 0 + 0 + + + 1084 + 1000 + 0 + 0 + 0 + + + 1085 + 2600 + 0 + 0 + 0 + + + 1086 + 2600 + 0 + 0 + 0 + + + 1087 + 80 + 0 + 0 + 0 + + + 1088 + 80 + 0 + 0 + 0 + + + 1089 + 1920 + 0 + 0 + 0 + + + 1090 + 1920 + 0 + 0 + 0 + + + 1091 + 6400 + 0 + 0 + 0 + + + 1092 + 6400 + 0 + 0 + 0 + + + 1093 + 64000 + 0 + 0 + 0 + + + 1094 + 64000 + 0 + 0 + 0 + + + 1095 + 20 + 0 + 0 + 0 + + + 1096 + 20 + 0 + 0 + 0 + + + 1097 + 750 + 0 + 0 + 0 + + + 1098 + 750 + 0 + 0 + 0 + + + 1099 + 3900 + 0 + 0 + 0 + + + 1100 + 3900 + 0 + 0 + 0 + + + 1101 + 210 + 0 + 0 + 0 + + + 1102 + 210 + 0 + 0 + 0 + + + 1103 + 60 + 0 + 0 + 0 + + + 1104 + 60 + 0 + 0 + 0 + + + 1105 + 750 + 0 + 0 + 0 + + + 1106 + 750 + 0 + 0 + 0 + + + 1107 + 1440 + 0 + 0 + 0 + + + 1108 + 1440 + 0 + 0 + 0 + + + 1109 + 1950 + 0 + 0 + 0 + + + 1110 + 1950 + 0 + 0 + 0 + + + 1111 + 4800 + 0 + 0 + 0 + + + 1112 + 4800 + 0 + 0 + 0 + + + 1113 + 50000 + 0 + 0 + 0 + + + 1114 + 50000 + 0 + 0 + 0 + + + 1115 + 560 + 0 + 0 + 0 + + + 1116 + 560 + 0 + 0 + 0 + + + 1117 + 160 + 0 + 0 + 0 + + + 1118 + 160 + 0 + 0 + 0 + + + 1119 + 2000 + 0 + 0 + 0 + + + 1120 + 2000 + 0 + 0 + 0 + + + 1121 + 5200 + 0 + 0 + 0 + + + 1122 + 5200 + 0 + 0 + 0 + + + 1123 + 16640 + 0 + 0 + 0 + + + 1124 + 16640 + 0 + 0 + 0 + + + 1125 + 3840 + 0 + 0 + 0 + + + 1126 + 3840 + 0 + 0 + 0 + + + 1127 + 65000 + 0 + 0 + 0 + + + 1128 + 65000 + 0 + 0 + 0 + + + 1129 + 21 + 0 + 0 + 0 + + + 1130 + 21 + 0 + 0 + 0 + + + 1131 + 170 + 0 + 0 + 0 + + + 1132 + 170 + 0 + 0 + 0 + + + 1133 + 850 + 0 + 0 + 0 + + + 1134 + 850 + 0 + 0 + 0 + + + 1135 + 7800 + 0 + 0 + 0 + + + 1136 + 7800 + 0 + 0 + 0 + + + 1137 + 84 + 0 + 0 + 0 + + + 1138 + 84 + 0 + 0 + 0 + + + 1139 + 24 + 0 + 0 + 0 + + + 1140 + 24 + 0 + 0 + 0 + + + 1141 + 300 + 0 + 0 + 0 + + + 1142 + 300 + 0 + 0 + 0 + + + 1143 + 780 + 0 + 0 + 0 + + + 1144 + 780 + 0 + 0 + 0 + + + 1145 + 1920 + 0 + 0 + 0 + + + 1146 + 1920 + 0 + 0 + 0 + + + 1147 + 19200 + 0 + 0 + 0 + + + 1148 + 19200 + 0 + 0 + 0 + + + 1149 + 100000 + 0 + 0 + 0 + + + 1150 + 100000 + 0 + 0 + 0 + + + 1151 + 576 + 0 + 0 + 0 + + + 1152 + 576 + 0 + 0 + 0 + + + 1153 + 154 + 0 + 0 + 0 + + + 1154 + 154 + 0 + 0 + 0 + + + 1155 + 44 + 0 + 0 + 0 + + + 1156 + 44 + 0 + 0 + 0 + + + 1157 + 550 + 0 + 0 + 0 + + + 1158 + 550 + 0 + 0 + 0 + + + 1159 + 1430 + 0 + 0 + 0 + + + 1160 + 1430 + 0 + 0 + 0 + + + 1161 + 3520 + 0 + 0 + 0 + + + 1162 + 3520 + 0 + 0 + 0 + + + 1163 + 35200 + 0 + 0 + 0 + + + 1164 + 35200 + 0 + 0 + 0 + + + 1165 + 1372 + 0 + 0 + 0 + + + 1166 + 1372 + 0 + 0 + 0 + + + 1167 + 24 + 0 + 0 + 0 + + + 1168 + 24 + 0 + 0 + 0 + + + 1169 + 200 + 0 + 0 + 0 + + + 1170 + 200 + 0 + 0 + 0 + + + 1171 + 20 + 0 + 0 + 0 + + + 1172 + 20 + 0 + 0 + 0 + + + 1173 + 48 + 0 + 0 + 0 + + + 1174 + 48 + 0 + 0 + 0 + + + 1175 + 168 + 0 + 0 + 0 + + + 1176 + 168 + 0 + 0 + 0 + + + 1177 + 600 + 0 + 0 + 0 + + + 1178 + 600 + 0 + 0 + 0 + + + 1179 + 1152 + 0 + 0 + 0 + + + 1180 + 1152 + 0 + 0 + 0 + + + 1181 + 1560 + 0 + 0 + 0 + + + 1182 + 1560 + 0 + 0 + 0 + + + 1183 + 3840 + 0 + 0 + 0 + + + 1184 + 3840 + 0 + 0 + 0 + + + 1185 + 38400 + 0 + 0 + 0 + + + 1186 + 38400 + 0 + 0 + 0 + + + 1187 + 500000 + 0 + 0 + 0 + + + 1188 + 500000 + 0 + 0 + 0 + + + 1189 + 68 + 0 + 0 + 0 + + + 1190 + 68 + 0 + 0 + 0 + + + 1191 + 238 + 0 + 0 + 0 + + + 1192 + 238 + 0 + 0 + 0 + + + 1193 + 850 + 0 + 0 + 0 + + + 1194 + 850 + 0 + 0 + 0 + + + 1195 + 2121 + 0 + 0 + 0 + + + 1196 + 2121 + 0 + 0 + 0 + + + 1197 + 2210 + 0 + 0 + 0 + + + 1198 + 2210 + 0 + 0 + 0 + + + 1199 + 5440 + 0 + 0 + 0 + + + 1200 + 5440 + 0 + 0 + 0 + + + 1201 + 54400 + 0 + 0 + 0 + + + 1202 + 54400 + 0 + 0 + 0 + + + 1203 + 35 + 0 + 0 + 0 + + + 1204 + 35 + 0 + 0 + 0 + + + 1205 + 10 + 0 + 0 + 0 + + + 1206 + 10 + 0 + 0 + 0 + + + 1207 + 125 + 0 + 0 + 0 + + + 1208 + 125 + 0 + 0 + 0 + + + 1209 + 325 + 0 + 0 + 0 + + + 1210 + 325 + 0 + 0 + 0 + + + 1211 + 800 + 0 + 0 + 0 + + + 1212 + 800 + 0 + 0 + 0 + + + 1213 + 8000 + 0 + 0 + 0 + + + 1214 + 8000 + 0 + 0 + 0 + + + 1215 + 30000 + 0 + 0 + 0 + + + 1216 + 30000 + 0 + 0 + 0 + + + 1217 + 240 + 0 + 0 + 0 + + + 1218 + 240 + 0 + 0 + 0 + + + 1219 + 35 + 0 + 0 + 0 + + + 1220 + 35 + 0 + 0 + 0 + + + 1221 + 10 + 0 + 0 + 0 + + + 1222 + 10 + 0 + 0 + 0 + + + 1223 + 125 + 0 + 0 + 0 + + + 1224 + 125 + 0 + 0 + 0 + + + 1225 + 325 + 0 + 0 + 0 + + + 1226 + 325 + 0 + 0 + 0 + + + 1227 + 800 + 0 + 0 + 0 + + + 1228 + 800 + 0 + 0 + 0 + + + 1229 + 8000 + 0 + 0 + 0 + + + 1230 + 8000 + 0 + 0 + 0 + + + 1231 + 24000 + 0 + 0 + 0 + + + 1232 + 24000 + 0 + 0 + 0 + + + 1233 + 240 + 0 + 0 + 0 + + + 1234 + 240 + 0 + 0 + 0 + + + 1235 + 565 + 0 + 0 + 0 + + + 1236 + 565 + 0 + 0 + 0 + + + 1237 + 26 + 0 + 0 + 0 + + + 1238 + 26 + 0 + 0 + 0 + + + 1239 + 91 + 0 + 0 + 0 + + + 1240 + 91 + 0 + 0 + 0 + + + 1241 + 325 + 0 + 0 + 0 + + + 1242 + 325 + 0 + 0 + 0 + + + 1243 + 845 + 0 + 0 + 0 + + + 1244 + 845 + 0 + 0 + 0 + + + 1245 + 2080 + 0 + 0 + 0 + + + 1246 + 2080 + 0 + 0 + 0 + + + 1247 + 20800 + 0 + 0 + 0 + + + 1248 + 20800 + 0 + 0 + 0 + + + 1249 + 62400 + 0 + 0 + 0 + + + 1250 + 62400 + 0 + 0 + 0 + + + 1251 + 26 + 0 + 0 + 0 + + + 1252 + 26 + 0 + 0 + 0 + + + 1253 + 91 + 0 + 0 + 0 + + + 1254 + 91 + 0 + 0 + 0 + + + 1255 + 325 + 0 + 0 + 0 + + + 1256 + 325 + 0 + 0 + 0 + + + 1257 + 845 + 0 + 0 + 0 + + + 1258 + 845 + 0 + 0 + 0 + + + 1259 + 2080 + 0 + 0 + 0 + + + 1260 + 2080 + 0 + 0 + 0 + + + 1261 + 20800 + 0 + 0 + 0 + + + 1262 + 20800 + 0 + 0 + 0 + + + 1263 + 62400 + 0 + 0 + 0 + + + 1264 + 62400 + 0 + 0 + 0 + + + 1265 + 1 + 0 + 0 + 0 + + + 1266 + 1 + 0 + 0 + 0 + + + 1267 + 140 + 0 + 0 + 0 + + + 1268 + 140 + 0 + 0 + 0 + + + 1269 + 500 + 0 + 0 + 0 + + + 1270 + 500 + 0 + 0 + 0 + + + 1271 + 3200 + 0 + 0 + 0 + + + 1272 + 3200 + 0 + 0 + 0 + + + 1273 + 1300 + 0 + 0 + 0 + + + 1274 + 1300 + 0 + 0 + 0 + + + 1275 + 32000 + 0 + 0 + 0 + + + 1276 + 32000 + 0 + 0 + 0 + + + 1277 + 26 + 0 + 0 + 0 + + + 1278 + 26 + 0 + 0 + 0 + + + 1279 + 91 + 0 + 0 + 0 + + + 1280 + 91 + 0 + 0 + 0 + + + 1281 + 325 + 0 + 0 + 0 + + + 1282 + 325 + 0 + 0 + 0 + + + 1283 + 624 + 0 + 0 + 0 + + + 1284 + 624 + 0 + 0 + 0 + + + 1285 + 845 + 0 + 0 + 0 + + + 1286 + 845 + 0 + 0 + 0 + + + 1287 + 2080 + 0 + 0 + 0 + + + 1288 + 2080 + 0 + 0 + 0 + + + 1289 + 20800 + 0 + 0 + 0 + + + 1290 + 20800 + 0 + 0 + 0 + + + 1291 + 40 + 0 + 0 + 0 + + + 1292 + 40 + 0 + 0 + 0 + + + 1293 + 140 + 0 + 0 + 0 + + + 1294 + 140 + 0 + 0 + 0 + + + 1295 + 500 + 0 + 0 + 0 + + + 1296 + 500 + 0 + 0 + 0 + + + 1297 + 960 + 0 + 0 + 0 + + + 1298 + 960 + 0 + 0 + 0 + + + 1299 + 1300 + 0 + 0 + 0 + + + 1300 + 1300 + 0 + 0 + 0 + + + 1301 + 3200 + 0 + 0 + 0 + + + 1302 + 3200 + 0 + 0 + 0 + + + 1303 + 32000 + 0 + 0 + 0 + + + 1304 + 32000 + 0 + 0 + 0 + + + 1305 + 100000 + 0 + 0 + 0 + + + 1306 + 100000 + 0 + 0 + 0 + + + 1307 + 80 + 0 + 0 + 0 + + + 1308 + 80 + 0 + 0 + 0 + + + 1309 + 280 + 0 + 0 + 0 + + + 1310 + 280 + 0 + 0 + 0 + + + 1311 + 1000 + 0 + 0 + 0 + + + 1312 + 1000 + 0 + 0 + 0 + + + 1313 + 1920 + 0 + 0 + 0 + + + 1314 + 1920 + 0 + 0 + 0 + + + 1315 + 2600 + 0 + 0 + 0 + + + 1316 + 2600 + 0 + 0 + 0 + + + 1317 + 6400 + 0 + 0 + 0 + + + 1318 + 6400 + 0 + 0 + 0 + + + 1319 + 64000 + 0 + 0 + 0 + + + 1320 + 64000 + 0 + 0 + 0 + + + 1321 + 32 + 0 + 0 + 0 + + + 1322 + 32 + 0 + 0 + 0 + + + 1323 + 112 + 0 + 0 + 0 + + + 1324 + 112 + 0 + 0 + 0 + + + 1325 + 400 + 0 + 0 + 0 + + + 1326 + 400 + 0 + 0 + 0 + + + 1327 + 768 + 0 + 0 + 0 + + + 1328 + 768 + 0 + 0 + 0 + + + 1329 + 1040 + 0 + 0 + 0 + + + 1330 + 1040 + 0 + 0 + 0 + + + 1331 + 2560 + 0 + 0 + 0 + + + 1332 + 2560 + 0 + 0 + 0 + + + 1333 + 25600 + 0 + 0 + 0 + + + 1334 + 25600 + 0 + 0 + 0 + + + 1335 + 224 + 0 + 0 + 0 + + + 1336 + 224 + 0 + 0 + 0 + + + 1337 + 61 + 0 + 0 + 0 + + + 1338 + 61 + 0 + 0 + 0 + + + 1339 + 832 + 0 + 0 + 0 + + + 1340 + 832 + 0 + 0 + 0 + + + 1341 + 1274 + 0 + 0 + 0 + + + 1342 + 1274 + 0 + 0 + 0 + + + 1343 + 2158 + 0 + 0 + 0 + + + 1344 + 2158 + 0 + 0 + 0 + + + 1345 + 5356 + 0 + 0 + 0 + + + 1346 + 5356 + 0 + 0 + 0 + + + 1347 + 41500 + 0 + 0 + 0 + + + 1348 + 41500 + 0 + 0 + 0 + + + 1349 + 56 + 0 + 0 + 0 + + + 1350 + 56 + 0 + 0 + 0 + + + 1351 + 16 + 0 + 0 + 0 + + + 1352 + 16 + 0 + 0 + 0 + + + 1353 + 200 + 0 + 0 + 0 + + + 1354 + 200 + 0 + 0 + 0 + + + 1355 + 520 + 0 + 0 + 0 + + + 1356 + 520 + 0 + 0 + 0 + + + 1357 + 1280 + 0 + 0 + 0 + + + 1358 + 1280 + 0 + 0 + 0 + + + 1359 + 12800 + 0 + 0 + 0 + + + 1360 + 12800 + 0 + 0 + 0 + + + 1361 + 384 + 0 + 0 + 0 + + + 1362 + 384 + 0 + 0 + 0 + + + 1363 + 182 + 0 + 0 + 0 + + + 1364 + 182 + 0 + 0 + 0 + + + 1365 + 650 + 0 + 0 + 0 + + + 1366 + 650 + 0 + 0 + 0 + + + 1367 + 1248 + 0 + 0 + 0 + + + 1368 + 1248 + 0 + 0 + 0 + + + 1369 + 1690 + 0 + 0 + 0 + + + 1370 + 1690 + 0 + 0 + 0 + + + 1371 + 4160 + 0 + 0 + 0 + + + 1372 + 4160 + 0 + 0 + 0 + + + 1373 + 41600 + 0 + 0 + 0 + + + 1374 + 41600 + 0 + 0 + 0 + + + 1375 + 52 + 0 + 0 + 0 + + + 1376 + 52 + 0 + 0 + 0 + + + 1377 + 200000 + 0 + 0 + 0 + + + 1378 + 200000 + 0 + 0 + 0 + + + 1379 + 15 + 0 + 0 + 0 + + + 1380 + 15 + 0 + 0 + 0 + + + 1381 + 1500 + 0 + 0 + 0 + + + 1382 + 1500 + 0 + 0 + 0 + + + 1383 + 1500 + 0 + 0 + 0 + + + 1384 + 1500 + 0 + 0 + 0 + + + 1385 + 1500 + 0 + 0 + 0 + + + 1386 + 1500 + 0 + 0 + 0 + + + 1387 + 1500 + 0 + 0 + 0 + + + 1388 + 1500 + 0 + 0 + 0 + + + 1389 + 200 + 0 + 0 + 0 + + + 1390 + 200 + 0 + 0 + 0 + + + 1391 + 7000 + 0 + 0 + 0 + + + 1392 + 7000 + 0 + 0 + 0 + + + 1393 + 15500 + 0 + 0 + 0 + + + 1394 + 15500 + 0 + 0 + 0 + + + 1395 + 15500 + 0 + 0 + 0 + + + 1396 + 15500 + 0 + 0 + 0 + + + 1397 + 15500 + 0 + 0 + 0 + + + 1398 + 15500 + 0 + 0 + 0 + + + 1399 + 15500 + 0 + 0 + 0 + + + 1400 + 15500 + 0 + 0 + 0 + + + 1401 + 42500 + 0 + 0 + 0 + + + 1402 + 42500 + 0 + 0 + 0 + + + 1403 + 42500 + 0 + 0 + 0 + + + 1404 + 42500 + 0 + 0 + 0 + + + 1405 + 42500 + 0 + 0 + 0 + + + 1406 + 42500 + 0 + 0 + 0 + + + 1407 + 42500 + 0 + 0 + 0 + + + 1408 + 42500 + 0 + 0 + 0 + + + 1409 + 42500 + 0 + 0 + 0 + + + 1410 + 20 + 0 + 0 + 0 + + + 1411 + 1 + 0 + 0 + 0 + + + 1412 + 1 + 0 + 0 + 0 + + + 1413 + 1 + 0 + 0 + 0 + + + 1414 + 1 + 0 + 0 + 0 + + + 1415 + 1 + 0 + 0 + 0 + + + 1416 + 1 + 0 + 0 + 0 + + + 1417 + 1 + 0 + 0 + 0 + + + 1418 + 1 + 0 + 0 + 0 + + + 1419 + 1 + 0 + 0 + 0 + + + 1420 + 63 + 0 + 0 + 0 + + + 1421 + 63 + 0 + 0 + 0 + + + 1422 + 18 + 0 + 0 + 0 + + + 1423 + 18 + 0 + 0 + 0 + + + 1424 + 225 + 0 + 0 + 0 + + + 1425 + 225 + 0 + 0 + 0 + + + 1426 + 432 + 0 + 0 + 0 + + + 1427 + 432 + 0 + 0 + 0 + + + 1428 + 585 + 0 + 0 + 0 + + + 1429 + 585 + 0 + 0 + 0 + + + 1430 + 1440 + 0 + 0 + 0 + + + 1431 + 1440 + 0 + 0 + 0 + + + 1432 + 14400 + 0 + 0 + 0 + + + 1433 + 14400 + 0 + 0 + 0 + + + 1434 + 50000 + 0 + 0 + 0 + + + 1435 + 50000 + 0 + 0 + 0 + + + 1436 + 4 + 0 + 0 + 0 + + + 1437 + 4 + 0 + 0 + 0 + + + 1438 + 4 + 0 + 0 + 0 + + + 1439 + 4 + 0 + 0 + 0 + + + 1440 + 4 + 0 + 0 + 0 + + + 1441 + 4 + 0 + 0 + 0 + + + 1442 + 4 + 0 + 0 + 0 + + + 1443 + 4 + 0 + 0 + 0 + + + 1444 + 4 + 0 + 0 + 0 + + + 1445 + 4 + 0 + 0 + 0 + + + 1446 + 4 + 0 + 0 + 0 + + + 1447 + 4 + 0 + 0 + 0 + + + 1448 + 4 + 0 + 0 + 0 + + + 1449 + 4 + 0 + 0 + 0 + + + 1450 + 4 + 0 + 0 + 0 + + + 1451 + 4 + 0 + 0 + 0 + + + 1452 + 4 + 0 + 0 + 0 + + + 1453 + 4 + 0 + 0 + 0 + + + 1454 + 4 + 0 + 0 + 0 + + + 1455 + 4 + 0 + 0 + 0 + + + 1456 + 4 + 0 + 0 + 0 + + + 1457 + 4 + 0 + 0 + 0 + + + 1458 + 4 + 0 + 0 + 0 + + + 1459 + 4 + 0 + 0 + 0 + + + 1460 + 4 + 0 + 0 + 0 + + + 1461 + 4 + 0 + 0 + 0 + + + 1462 + 4 + 0 + 0 + 0 + + + 1463 + 4 + 0 + 0 + 0 + + + 1464 + 25 + 0 + 0 + 0 + + + 1465 + 11 + 0 + 0 + 0 + + + 1466 + 4 + 0 + 0 + 0 + + + 1467 + 1 + 0 + 0 + 0 + + + 1468 + 1 + 0 + 0 + 0 + + + 1469 + 1 + 0 + 0 + 0 + + + 1470 + 4 + 0 + 0 + 0 + + + 1471 + 4 + 0 + 0 + 0 + + + 1472 + 4 + 0 + 0 + 0 + + + 1473 + 4 + 0 + 0 + 0 + + + 1474 + 4 + 0 + 0 + 0 + + + 1475 + 4 + 0 + 0 + 0 + + + 1476 + 4 + 0 + 0 + 0 + + + 1477 + 4 + 0 + 0 + 0 + + + 1478 + 100 + 0 + 0 + 0 + + + 1479 + 100 + 0 + 0 + 0 + + + 1480 + 1 + 0 + 0 + 0 + + + 1481 + 10 + 0 + 0 + 0 + + + 1482 + 10 + 0 + 0 + 0 + + + 1483 + 10 + 0 + 0 + 0 + + + 1484 + 20 + 0 + 0 + 0 + + + 1485 + 10 + 0 + 0 + 0 + + + 1486 + 10 + 0 + 0 + 0 + + + 1487 + 20 + 0 + 0 + 0 + + + 1488 + 10 + 0 + 0 + 0 + + + 1489 + 10 + 0 + 0 + 0 + + + 1490 + 10 + 0 + 0 + 0 + + + 1491 + 1 + 0 + 0 + 0 + + + 1492 + 2 + 0 + 0 + 0 + + + 1493 + 1 + 0 + 0 + 0 + + + 1494 + 1 + 0 + 0 + 0 + + + 1495 + 6 + 0 + 0 + 0 + + + 1496 + 1 + 0 + 0 + 0 + + + 1497 + 1 + 0 + 0 + 0 + + + 1498 + 1 + 0 + 0 + 0 + + + 1499 + 1 + 0 + 0 + 0 + + + 1500 + 2 + 0 + 0 + 0 + + + 1501 + 2 + 0 + 0 + 0 + + + 1502 + 2 + 0 + 0 + 0 + + + 1503 + 5 + 0 + 0 + 0 + + + 1504 + 2 + 0 + 0 + 0 + + + 1505 + 1 + 0 + 0 + 0 + + + 1506 + 2 + 0 + 0 + 0 + + + 1507 + 1 + 0 + 0 + 0 + + + 1508 + 2 + 0 + 0 + 0 + + + 1509 + 1 + 0 + 0 + 0 + + + 1510 + 1 + 0 + 0 + 0 + + + 1511 + 4 + 0 + 0 + 0 + + + 1512 + 4 + 0 + 0 + 0 + + + 1513 + 320 + 0 + 0 + 0 + + + 1514 + 320 + 0 + 0 + 0 + + + 1515 + 160 + 0 + 0 + 0 + + + 1516 + 160 + 0 + 0 + 0 + + + 1517 + 80 + 0 + 0 + 0 + + + 1518 + 80 + 0 + 0 + 0 + + + 1519 + 40 + 0 + 0 + 0 + + + 1520 + 40 + 0 + 0 + 0 + + + 1521 + 20 + 0 + 0 + 0 + + + 1522 + 20 + 0 + 0 + 0 + + + 1523 + 20 + 0 + 0 + 0 + + + 1524 + 20 + 0 + 0 + 0 + + + 1525 + 1 + 0 + 0 + 0 + + + 1526 + 5 + 0 + 0 + 0 + + + 1527 + 1 + 0 + 0 + 0 + + + 1528 + 5 + 0 + 0 + 0 + + + 1529 + 1 + 0 + 0 + 0 + + + 1530 + 5 + 0 + 0 + 0 + + + 1531 + 1 + 0 + 0 + 0 + + + 1532 + 5 + 0 + 0 + 0 + + + 1533 + 1 + 0 + 0 + 0 + + + 1534 + 5 + 0 + 0 + 0 + + + 1535 + 1 + 0 + 0 + 0 + + + 1536 + 1 + 0 + 0 + 0 + + + 1537 + 1 + 0 + 0 + 0 + + + 1538 + 1 + 0 + 0 + 0 + + + 1539 + 52 + 0 + 0 + 0 + + + 1540 + 20 + 0 + 0 + 0 + + + 1541 + 20 + 0 + 0 + 0 + + + 1542 + 1 + 0 + 0 + 0 + + + 1543 + 1 + 0 + 0 + 0 + + + 1544 + 1 + 0 + 0 + 0 + + + 1545 + 1 + 0 + 0 + 0 + + + 1546 + 1 + 0 + 0 + 0 + + + 1547 + 1 + 0 + 0 + 0 + + + 1548 + 1 + 0 + 0 + 0 + + + 1549 + 8 + 0 + 0 + 0 + + + 1550 + 3 + 0 + 0 + 0 + + + 1551 + 3 + 0 + 0 + 0 + + + 1552 + 10 + 0 + 0 + 0 + + + 1553 + 1 + 0 + 0 + 0 + + + 1554 + 1 + 0 + 0 + 0 + + + 1555 + 1 + 0 + 0 + 0 + + + 1556 + 1 + 0 + 0 + 0 + + + 1557 + 1 + 0 + 0 + 0 + + + 1558 + 1 + 0 + 0 + 0 + + + 1559 + 1 + 0 + 0 + 0 + + + 1560 + 1 + 0 + 0 + 0 + + + 1561 + 1 + 0 + 0 + 0 + + + 1562 + 1 + 0 + 0 + 0 + + + 1563 + 1 + 0 + 0 + 0 + + + 1564 + 1 + 0 + 0 + 0 + + + 1565 + 1 + 0 + 0 + 0 + + + 1566 + 1 + 0 + 0 + 0 + + + 1567 + 1 + 0 + 0 + 0 + + + 1568 + 1 + 0 + 0 + 0 + + + 1569 + 1 + 0 + 0 + 0 + + + 1570 + 1 + 0 + 0 + 0 + + + 1571 + 1 + 0 + 0 + 0 + + + 1572 + 1 + 0 + 0 + 0 + + + 1573 + 2 + 0 + 0 + 0 + + + 1574 + 1 + 0 + 0 + 0 + + + 1575 + 350 + 0 + 0 + 0 + + + 1576 + 1 + 0 + 0 + 0 + + + 1577 + 5 + 0 + 0 + 0 + + + 1578 + 5 + 0 + 0 + 0 + + + 1579 + 2 + 0 + 0 + 0 + + + 1580 + 6 + 0 + 0 + 0 + + + 1581 + 5 + 0 + 0 + 0 + + + 1582 + 10 + 0 + 0 + 0 + + + 1583 + 2 + 0 + 0 + 0 + + + 1584 + 1 + 0 + 0 + 0 + + + 1585 + 15 + 0 + 0 + 0 + + + 1586 + 1 + 0 + 0 + 0 + + + 1587 + 1 + 0 + 0 + 0 + + + 1588 + 1 + 0 + 0 + 0 + + + 1589 + 1 + 0 + 0 + 0 + + + 1590 + 1 + 0 + 0 + 0 + + + 1591 + 1 + 0 + 0 + 0 + + + 1592 + 5 + 0 + 0 + 0 + + + 1593 + 5 + 0 + 0 + 0 + + + 1594 + 200 + 0 + 0 + 0 + + + 1595 + 5 + 0 + 0 + 0 + + + 1596 + 5 + 0 + 0 + 0 + + + 1597 + 5 + 0 + 0 + 0 + + + 1598 + 5 + 0 + 0 + 0 + + + 1599 + 5 + 0 + 0 + 0 + + + 1600 + 5 + 0 + 0 + 0 + + + 1601 + 2000 + 0 + 0 + 0 + + + 1602 + 2000 + 0 + 0 + 0 + + + 1603 + 1000 + 0 + 0 + 0 + + + 1604 + 1000 + 0 + 0 + 0 + + + 1605 + 500 + 0 + 0 + 0 + + + 1606 + 500 + 0 + 0 + 0 + + + 1607 + 250 + 0 + 0 + 0 + + + 1608 + 250 + 0 + 0 + 0 + + + 1609 + 100 + 0 + 0 + 0 + + + 1610 + 100 + 0 + 0 + 0 + + + 1611 + 150 + 0 + 0 + 0 + + + 1612 + 150 + 0 + 0 + 0 + + + 1613 + 200 + 0 + 0 + 0 + + + 1614 + 200 + 0 + 0 + 0 + + + 1615 + 10000 + 0 + 0 + 0 + + + 1616 + 10000 + 0 + 0 + 0 + + + 1617 + 200 + 0 + 0 + 0 + + + 1618 + 200 + 0 + 0 + 0 + + + 1619 + 100 + 0 + 0 + 0 + + + 1620 + 100 + 0 + 0 + 0 + + + 1621 + 50 + 0 + 0 + 0 + + + 1622 + 50 + 0 + 0 + 0 + + + 1623 + 25 + 0 + 0 + 0 + + + 1624 + 25 + 0 + 0 + 0 + + + 1625 + 20 + 0 + 0 + 0 + + + 1626 + 20 + 0 + 0 + 0 + + + 1627 + 30 + 0 + 0 + 0 + + + 1628 + 30 + 0 + 0 + 0 + + + 1629 + 40 + 0 + 0 + 0 + + + 1630 + 40 + 0 + 0 + 0 + + + 1631 + 1000 + 0 + 0 + 0 + + + 1632 + 1000 + 0 + 0 + 0 + + + 1633 + 1 + 0 + 0 + 0 + + + 1634 + 1 + 0 + 0 + 0 + + + 1635 + 350 + 0 + 0 + 0 + + + 1636 + 350 + 0 + 0 + 0 + + + 1637 + 900 + 0 + 0 + 0 + + + 1638 + 900 + 0 + 0 + 0 + + + 1639 + 1275 + 0 + 0 + 0 + + + 1640 + 1275 + 0 + 0 + 0 + + + 1641 + 2025 + 0 + 0 + 0 + + + 1642 + 2025 + 0 + 0 + 0 + + + 1643 + 3525 + 0 + 0 + 0 + + + 1644 + 3525 + 0 + 0 + 0 + + + 1645 + 17625 + 0 + 0 + 0 + + + 1646 + 17625 + 0 + 0 + 0 + + + 1647 + 1 + 0 + 0 + 0 + + + 1648 + 1 + 0 + 0 + 0 + + + 1649 + 1 + 0 + 0 + 0 + + + 1650 + 1 + 0 + 0 + 0 + + + 1651 + 1 + 0 + 0 + 0 + + + 1652 + 1 + 0 + 0 + 0 + + + 1653 + 1 + 0 + 0 + 0 + + + 1654 + 450 + 0 + 0 + 0 + + + 1655 + 450 + 0 + 0 + 0 + + + 1656 + 1050 + 0 + 0 + 0 + + + 1657 + 1050 + 0 + 0 + 0 + + + 1658 + 1425 + 0 + 0 + 0 + + + 1659 + 1425 + 0 + 0 + 0 + + + 1660 + 2175 + 0 + 0 + 0 + + + 1661 + 2175 + 0 + 0 + 0 + + + 1662 + 3675 + 0 + 0 + 0 + + + 1663 + 3675 + 0 + 0 + 0 + + + 1664 + 18375 + 0 + 0 + 0 + + + 1665 + 18375 + 0 + 0 + 0 + + + 1666 + 1 + 0 + 0 + 0 + + + 1667 + 1 + 0 + 0 + 0 + + + 1668 + 1 + 0 + 0 + 0 + + + 1669 + 1 + 0 + 0 + 0 + + + 1670 + 1 + 0 + 0 + 0 + + + 1671 + 1 + 0 + 0 + 0 + + + 1672 + 1 + 0 + 0 + 0 + + + 1673 + 350 + 0 + 0 + 0 + + + 1674 + 350 + 0 + 0 + 0 + + + 1675 + 900 + 0 + 0 + 0 + + + 1676 + 900 + 0 + 0 + 0 + + + 1677 + 1275 + 0 + 0 + 0 + + + 1678 + 1275 + 0 + 0 + 0 + + + 1679 + 2025 + 0 + 0 + 0 + + + 1680 + 2025 + 0 + 0 + 0 + + + 1681 + 3525 + 0 + 0 + 0 + + + 1682 + 3525 + 0 + 0 + 0 + + + 1683 + 17625 + 0 + 0 + 0 + + + 1684 + 17625 + 0 + 0 + 0 + + + 1685 + 1 + 0 + 0 + 0 + + + 1686 + 1 + 0 + 0 + 0 + + + 1687 + 1 + 0 + 0 + 0 + + + 1688 + 1 + 0 + 0 + 0 + + + 1689 + 1 + 0 + 0 + 0 + + + 1690 + 1 + 0 + 0 + 0 + + + 1691 + 1 + 0 + 0 + 0 + + + 1692 + 350 + 0 + 0 + 0 + + + 1693 + 350 + 0 + 0 + 0 + + + 1694 + 900 + 0 + 0 + 0 + + + 1695 + 900 + 0 + 0 + 0 + + + 1696 + 1275 + 0 + 0 + 0 + + + 1697 + 1275 + 0 + 0 + 0 + + + 1698 + 2025 + 0 + 0 + 0 + + + 1699 + 2025 + 0 + 0 + 0 + + + 1700 + 3525 + 0 + 0 + 0 + + + 1701 + 3525 + 0 + 0 + 0 + + + 1702 + 17625 + 0 + 0 + 0 + + + 1703 + 17625 + 0 + 0 + 0 + + + 1704 + 17625 + 0 + 0 + 0 + + + 1705 + 17625 + 0 + 0 + 0 + + + 1706 + 17625 + 0 + 0 + 0 + + + 1707 + 17625 + 0 + 0 + 0 + + + 1708 + 17625 + 0 + 0 + 0 + + + 1709 + 17625 + 0 + 0 + 0 + + + 1710 + 17625 + 0 + 0 + 0 + + + 1711 + 17625 + 0 + 0 + 0 + + + 1712 + 17625 + 0 + 0 + 0 + + + 1713 + 17625 + 0 + 0 + 0 + + + 1714 + 200 + 0 + 0 + 0 + + + 1715 + 200 + 0 + 0 + 0 + + + 1716 + 200 + 0 + 0 + 0 + + + 1717 + 200 + 0 + 0 + 0 + + + 1718 + 300 + 0 + 0 + 0 + + + 1719 + 300 + 0 + 0 + 0 + + + 1720 + 200 + 0 + 0 + 0 + + + 1721 + 200 + 0 + 0 + 0 + + + 1722 + 200 + 0 + 0 + 0 + + + 1723 + 200 + 0 + 0 + 0 + + + 1724 + 200 + 0 + 0 + 0 + + + 1725 + 2025 + 0 + 0 + 0 + + + 1726 + 2025 + 0 + 0 + 0 + + + 1727 + 900 + 0 + 0 + 0 + + + 1728 + 900 + 0 + 0 + 0 + + + 1729 + 1275 + 0 + 0 + 0 + + + 1730 + 1275 + 0 + 0 + 0 + + + 1731 + 3525 + 0 + 0 + 0 + + + 1732 + 3525 + 0 + 0 + 0 + + + 1733 + 1 + 0 + 0 + 0 + + + 1734 + 4 + 0 + 0 + 0 + + + 1735 + 1 + 0 + 0 + 0 + + + 1736 + 1 + 0 + 0 + 0 + + + 1737 + 1 + 0 + 0 + 0 + + + 1738 + 1 + 0 + 0 + 0 + + + 1739 + 1 + 0 + 0 + 0 + + + 1740 + 1 + 0 + 0 + 0 + + + 1741 + 1 + 0 + 0 + 0 + + + 1742 + 1 + 0 + 0 + 0 + + + 1743 + 1 + 0 + 0 + 0 + + + 1744 + 1 + 0 + 0 + 0 + + + 1745 + 50 + 0 + 0 + 0 + + + 1746 + 50 + 0 + 0 + 0 + + + 1747 + 80 + 0 + 0 + 0 + + + 1748 + 80 + 0 + 0 + 0 + + + 1749 + 60 + 0 + 0 + 0 + + + 1750 + 60 + 0 + 0 + 0 + + + 1751 + 40 + 0 + 0 + 0 + + + 1752 + 40 + 0 + 0 + 0 + + + 1753 + 20 + 0 + 0 + 0 + + + 1754 + 20 + 0 + 0 + 0 + + + 1755 + 1 + 0 + 0 + 0 + + + 1756 + 1 + 0 + 0 + 0 + + + 1757 + 2 + 0 + 0 + 0 + + + 1758 + 2 + 0 + 0 + 0 + + + 1759 + 5 + 0 + 0 + 0 + + + 1760 + 5 + 0 + 0 + 0 + + + 1761 + 2 + 0 + 0 + 0 + + + 1762 + 2 + 0 + 0 + 0 + + + 1763 + 6 + 0 + 0 + 0 + + + 1764 + 6 + 0 + 0 + 0 + + + 1765 + 6 + 0 + 0 + 0 + + + 1766 + 6 + 0 + 0 + 0 + + + 1767 + 6 + 0 + 0 + 0 + + + 1768 + 6 + 0 + 0 + 0 + + + 1769 + 6 + 0 + 0 + 0 + + + 1770 + 6 + 0 + 0 + 0 + + + 1771 + 6 + 0 + 0 + 0 + + + 1772 + 6 + 0 + 0 + 0 + + + 1773 + 6 + 0 + 0 + 0 + + + 1774 + 6 + 0 + 0 + 0 + + + 1775 + 3 + 0 + 0 + 0 + + + 1776 + 3 + 0 + 0 + 0 + + + 1777 + 10 + 0 + 0 + 0 + + + 1778 + 10 + 0 + 0 + 0 + + + 1779 + 5 + 0 + 0 + 0 + + + 1780 + 5 + 0 + 0 + 0 + + + 1781 + 2 + 0 + 0 + 0 + + + 1782 + 2 + 0 + 0 + 0 + + + 1783 + 2 + 0 + 0 + 0 + + + 1784 + 2 + 0 + 0 + 0 + + + 1785 + 2 + 0 + 0 + 0 + + + 1786 + 2 + 0 + 0 + 0 + + + 1787 + 1 + 0 + 0 + 0 + + + 1788 + 1 + 0 + 0 + 0 + + + 1789 + 3 + 0 + 0 + 0 + + + 1790 + 3 + 0 + 0 + 0 + + + 1791 + 2 + 0 + 0 + 0 + + + 1792 + 2 + 0 + 0 + 0 + + + 1793 + 1 + 0 + 0 + 0 + + + 1794 + 20 + 0 + 0 + 0 + + + 1795 + 20 + 0 + 0 + 0 + + + 1796 + 1 + 0 + 0 + 0 + + + 1797 + 1 + 0 + 0 + 0 + + + 1798 + 1 + 0 + 0 + 0 + + + 1799 + 1 + 0 + 0 + 0 + + + 1800 + 1 + 0 + 0 + 0 + + + 1801 + 1 + 0 + 0 + 0 + + + 1802 + 1 + 0 + 0 + 0 + + + 1803 + 1 + 0 + 0 + 0 + + + 1804 + 1 + 0 + 0 + 0 + + + 1805 + 1 + 0 + 0 + 0 + + + 1806 + 1 + 0 + 0 + 0 + + + 1807 + 1 + 0 + 0 + 0 + + + 1808 + 1 + 0 + 0 + 0 + + + 1809 + 1 + 0 + 0 + 0 + + + 1810 + 1 + 0 + 0 + 0 + + + 1811 + 1 + 0 + 0 + 0 + + + 1812 + 1 + 0 + 0 + 0 + + + 1813 + 1 + 0 + 0 + 0 + + + 1814 + 1 + 0 + 0 + 0 + + + 1815 + 1 + 0 + 0 + 0 + + + 1816 + 1 + 0 + 0 + 0 + + + 1817 + 1 + 0 + 0 + 0 + + + 1818 + 1 + 0 + 0 + 0 + + + 1819 + 1 + 0 + 0 + 0 + + + 1820 + 1 + 0 + 0 + 0 + + + 1821 + 1 + 0 + 0 + 0 + + + 1822 + 1 + 0 + 0 + 0 + + + 1823 + 30 + 0 + 0 + 0 + + + 1824 + 30 + 0 + 0 + 0 + + + 1825 + 27 + 0 + 0 + 0 + + + 1826 + 27 + 0 + 0 + 0 + + + 1827 + 24 + 0 + 0 + 0 + + + 1828 + 24 + 0 + 0 + 0 + + + 1829 + 18 + 0 + 0 + 0 + + + 1830 + 18 + 0 + 0 + 0 + + + 1831 + 15 + 0 + 0 + 0 + + + 1832 + 15 + 0 + 0 + 0 + + + 1833 + 40 + 0 + 0 + 0 + + + 1834 + 40 + 0 + 0 + 0 + + + 1835 + 40 + 0 + 0 + 0 + + + 1836 + 40 + 0 + 0 + 0 + + + 1837 + 20 + 0 + 0 + 0 + + + 1838 + 20 + 0 + 0 + 0 + + + 1839 + 1 + 0 + 0 + 0 + + + 1840 + 1 + 0 + 0 + 0 + + + 1841 + 1 + 0 + 0 + 0 + + + 1842 + 1 + 0 + 0 + 0 + + + 1843 + 1 + 0 + 0 + 0 + + + 1844 + 40 + 0 + 0 + 0 + + + 1845 + 40 + 0 + 0 + 0 + + + 1846 + 1 + 0 + 0 + 0 + + + 1847 + 10 + 0 + 0 + 0 + + + 1848 + 1 + 0 + 0 + 0 + + + 1849 + 2 + 0 + 0 + 0 + + + 1850 + 1 + 0 + 0 + 0 + + + 1851 + 1 + 0 + 0 + 0 + + + 1852 + 1 + 0 + 0 + 0 + + + 1853 + 1 + 0 + 0 + 0 + + + 1854 + 5 + 0 + 0 + 0 + + + 1855 + 1 + 0 + 0 + 0 + + + 1856 + 1 + 0 + 0 + 0 + + + 1857 + 10 + 0 + 0 + 0 + + + 1858 + 10 + 0 + 0 + 0 + + + 1859 + 2 + 0 + 0 + 0 + + + 1860 + 2 + 0 + 0 + 0 + + + 1861 + 5 + 0 + 0 + 0 + + + 1862 + 5 + 0 + 0 + 0 + + + 1863 + 4 + 0 + 0 + 0 + + + 1864 + 4 + 0 + 0 + 0 + + + 1865 + 10 + 0 + 0 + 0 + + + 1866 + 10 + 0 + 0 + 0 + + + 1867 + 1 + 0 + 0 + 0 + + + 1868 + 1 + 0 + 0 + 0 + + + 1869 + 3 + 0 + 0 + 0 + + + 1870 + 3 + 0 + 0 + 0 + + + 1871 + 3 + 0 + 0 + 0 + + + 1872 + 3 + 0 + 0 + 0 + + + 1873 + 5 + 0 + 0 + 0 + + + 1874 + 5 + 0 + 0 + 0 + + + 1875 + 5 + 0 + 0 + 0 + + + 1876 + 5 + 0 + 0 + 0 + + + 1877 + 7 + 0 + 0 + 0 + + + 1878 + 7 + 0 + 0 + 0 + + + 1879 + 7 + 0 + 0 + 0 + + + 1880 + 7 + 0 + 0 + 0 + + + 1881 + 9 + 0 + 0 + 0 + + + 1882 + 9 + 0 + 0 + 0 + + + 1883 + 20 + 0 + 0 + 0 + + + 1884 + 20 + 0 + 0 + 0 + + + 1885 + 20 + 0 + 0 + 0 + + + 1886 + 20 + 0 + 0 + 0 + + + 1887 + 10 + 0 + 0 + 0 + + + 1888 + 10 + 0 + 0 + 0 + + + 1889 + 20 + 0 + 0 + 0 + + + 1890 + 20 + 0 + 0 + 0 + + + 1891 + 50 + 0 + 0 + 0 + + + 1892 + 50 + 0 + 0 + 0 + + + 1893 + 30 + 0 + 0 + 0 + + + 1894 + 30 + 0 + 0 + 0 + + + 1895 + 10 + 0 + 0 + 0 + + + 1896 + 10 + 0 + 0 + 0 + + + 1897 + 70 + 0 + 0 + 0 + + + 1898 + 70 + 0 + 0 + 0 + + + 1899 + 50 + 0 + 0 + 0 + + + 1900 + 50 + 0 + 0 + 0 + + + 1901 + 30 + 0 + 0 + 0 + + + 1902 + 30 + 0 + 0 + 0 + + + 1903 + 1 + 0 + 0 + 0 + + + 1904 + 1 + 0 + 0 + 0 + + + 1905 + 2 + 0 + 0 + 0 + + + 1906 + 2 + 0 + 0 + 0 + + + 1907 + 2 + 0 + 0 + 0 + + + 1908 + 2 + 0 + 0 + 0 + + + 1909 + 2 + 0 + 0 + 0 + + + 1910 + 2 + 0 + 0 + 0 + + + 1911 + 2 + 0 + 0 + 0 + + + 1912 + 2 + 0 + 0 + 0 + + + 1913 + 2 + 0 + 0 + 0 + + + 1914 + 2 + 0 + 0 + 0 + + + 1915 + 3 + 0 + 0 + 0 + + + 1916 + 3 + 0 + 0 + 0 + + + 1917 + 2 + 0 + 0 + 0 + + + 1918 + 2 + 0 + 0 + 0 + + + 1919 + 2 + 0 + 0 + 0 + + + 1920 + 2 + 0 + 0 + 0 + + + 1921 + 4 + 0 + 0 + 0 + + + 1922 + 4 + 0 + 0 + 0 + + + 1923 + 4 + 0 + 0 + 0 + + + 1924 + 4 + 0 + 0 + 0 + + + 1925 + 2 + 0 + 0 + 0 + + + 1926 + 2 + 0 + 0 + 0 + + + 1927 + 12 + 0 + 0 + 0 + + + 1928 + 12 + 0 + 0 + 0 + + + 1929 + 6 + 0 + 0 + 0 + + + 1930 + 6 + 0 + 0 + 0 + + + 1931 + 1 + 0 + 0 + 0 + + + 1932 + 1 + 0 + 0 + 0 + + + 1933 + 14 + 0 + 0 + 0 + + + 1934 + 14 + 0 + 0 + 0 + + + 1935 + 1 + 0 + 0 + 0 + + + 1936 + 1 + 0 + 0 + 0 + + + 1937 + 1 + 0 + 0 + 0 + + + 1938 + 1 + 0 + 0 + 0 + + + 1939 + 1 + 0 + 0 + 0 + + + 1940 + 1 + 0 + 0 + 0 + + + 1941 + 31 + 0 + 0 + 0 + + + 1942 + 16 + 0 + 0 + 0 + + + 1943 + 16 + 0 + 0 + 0 + + + 1944 + 4 + 0 + 0 + 0 + + + 1945 + 4 + 0 + 0 + 0 + + + 1946 + 2 + 0 + 0 + 0 + + + 1947 + 2 + 0 + 0 + 0 + + + 1948 + 2 + 0 + 0 + 0 + + + 1949 + 2 + 0 + 0 + 0 + + + 1950 + 2 + 0 + 0 + 0 + + + 1951 + 3 + 0 + 0 + 0 + + + 1952 + 3 + 0 + 0 + 0 + + + 1953 + 1 + 0 + 0 + 0 + + + 1954 + 1 + 0 + 0 + 0 + + + 1955 + 36 + 0 + 0 + 0 + + + 1956 + 36 + 0 + 0 + 0 + + + 1957 + 12 + 0 + 0 + 0 + + + 1958 + 12 + 0 + 0 + 0 + + + 1959 + 30 + 0 + 0 + 0 + + + 1960 + 30 + 0 + 0 + 0 + + + 1961 + 10 + 0 + 0 + 0 + + + 1962 + 10 + 0 + 0 + 0 + + + 1963 + 2 + 0 + 0 + 0 + + + 1964 + 2 + 0 + 0 + 0 + + + 1965 + 1 + 0 + 0 + 0 + + + 1966 + 1 + 0 + 0 + 0 + + + 1967 + 1 + 0 + 0 + 0 + + + 1968 + 1 + 0 + 0 + 0 + + + 1969 + 1 + 0 + 0 + 0 + + + 1970 + 1 + 0 + 0 + 0 + + + 1971 + 3 + 0 + 0 + 0 + + + 1972 + 3 + 0 + 0 + 0 + + + 1973 + 20 + 0 + 0 + 0 + + + 1974 + 20 + 0 + 0 + 0 + + + 1975 + 20 + 0 + 0 + 0 + + + 1976 + 20 + 0 + 0 + 0 + + + 1977 + 2 + 0 + 0 + 0 + + + 1978 + 10 + 0 + 0 + 0 + + + 1979 + 10 + 0 + 0 + 0 + + + 1980 + 2 + 0 + 0 + 0 + + + 1981 + 2 + 0 + 0 + 0 + + + 1982 + 14 + 0 + 0 + 0 + + + 1983 + 14 + 0 + 0 + 0 + + + 1984 + 1 + 0 + 0 + 0 + + + 1985 + 8 + 0 + 0 + 0 + + + 1986 + 8 + 0 + 0 + 0 + + + 1987 + 1 + 0 + 0 + 0 + + + 1988 + 1 + 0 + 0 + 0 + + + 1989 + 1 + 0 + 0 + 0 + + + 1990 + 1 + 0 + 0 + 0 + + + 1991 + 1 + 0 + 0 + 0 + + + 1992 + 1 + 0 + 0 + 0 + + + 1993 + 128 + 0 + 0 + 0 + + + 1994 + 128 + 0 + 0 + 0 + + + 1995 + 10 + 0 + 0 + 0 + + + 1996 + 10 + 0 + 0 + 0 + + + 1997 + 4 + 0 + 0 + 0 + + + 1998 + 4 + 0 + 0 + 0 + + + 1999 + 4 + 0 + 0 + 0 + + + 2000 + 4 + 0 + 0 + 0 + + + 2001 + 10 + 0 + 0 + 0 + + + 2002 + 10 + 0 + 0 + 0 + + + 2003 + 100 + 0 + 0 + 0 + + + 2004 + 100 + 0 + 0 + 0 + + + 2005 + 1 + 0 + 0 + 0 + + + 2006 + 1 + 0 + 0 + 0 + + + 2007 + 230 + 0 + 0 + 0 + + + 2008 + 230 + 0 + 0 + 0 + + + 2009 + 10 + 0 + 0 + 0 + + + 2010 + 10 + 0 + 0 + 0 + + + 2011 + 20 + 0 + 0 + 0 + + + 2012 + 20 + 0 + 0 + 0 + + + 2013 + 1 + 0 + 0 + 0 + + + 2014 + 1 + 0 + 0 + 0 + + + 2015 + 5 + 0 + 0 + 0 + + + 2016 + 5 + 0 + 0 + 0 + + + 2017 + 5 + 0 + 0 + 0 + + + 2018 + 5 + 0 + 0 + 0 + + + 2019 + 5 + 0 + 0 + 0 + + + 2020 + 5 + 0 + 0 + 0 + + + 2021 + 5 + 0 + 0 + 0 + + + 2022 + 5 + 0 + 0 + 0 + + + 2023 + 2 + 0 + 0 + 0 + + + 2024 + 2 + 0 + 0 + 0 + + + 2025 + 2 + 0 + 0 + 0 + + + 2026 + 1 + 0 + 0 + 0 + + + 2027 + 1 + 0 + 0 + 0 + + + 2028 + 30 + 0 + 0 + 0 + + + 2029 + 30 + 0 + 0 + 0 + + + 2030 + 30 + 0 + 0 + 0 + + + 2031 + 30 + 0 + 0 + 0 + + + 2032 + 30 + 0 + 0 + 0 + + + 2033 + 30 + 0 + 0 + 0 + + + 2034 + 30 + 0 + 0 + 0 + + + 2035 + 30 + 0 + 0 + 0 + + + 2036 + 30 + 0 + 0 + 0 + + + 2037 + 30 + 0 + 0 + 0 + + + 2038 + 30 + 0 + 0 + 0 + + + 2039 + 30 + 0 + 0 + 0 + + + 2040 + 30 + 0 + 0 + 0 + + + 2041 + 30 + 0 + 0 + 0 + + + 2042 + 2 + 0 + 0 + 0 + + + 2043 + 2 + 0 + 0 + 0 + + + 2044 + 2 + 0 + 0 + 0 + + + 2045 + 2 + 0 + 0 + 0 + + + 2046 + 2 + 0 + 0 + 0 + + + 2047 + 2 + 0 + 0 + 0 + + + 2048 + 30 + 0 + 0 + 0 + + + 2049 + 30 + 0 + 0 + 0 + + + 2050 + 2 + 0 + 0 + 0 + + + 2051 + 2 + 0 + 0 + 0 + + + 2052 + 2 + 0 + 0 + 0 + + + 2053 + 2 + 0 + 0 + 0 + + + 2054 + 30 + 0 + 0 + 0 + + + 2055 + 30 + 0 + 0 + 0 + + + 2056 + 2 + 0 + 0 + 0 + + + 2057 + 2 + 0 + 0 + 0 + + + 2058 + 2 + 0 + 0 + 0 + + + 2059 + 2 + 0 + 0 + 0 + + + 2060 + 2 + 0 + 0 + 0 + + + 2061 + 2 + 0 + 0 + 0 + + + 2062 + 2 + 0 + 0 + 0 + + + 2063 + 2 + 0 + 0 + 0 + + + 2064 + 30 + 0 + 0 + 0 + + + 2065 + 30 + 0 + 0 + 0 + + + 2066 + 2 + 0 + 0 + 0 + + + 2067 + 2 + 0 + 0 + 0 + + + 2068 + 2 + 0 + 0 + 0 + + + 2069 + 2 + 0 + 0 + 0 + + + 2070 + 2 + 0 + 0 + 0 + + + 2071 + 2 + 0 + 0 + 0 + + + 2072 + 2 + 0 + 0 + 0 + + + 2073 + 2 + 0 + 0 + 0 + + + 2074 + 30 + 0 + 0 + 0 + + + 2075 + 30 + 0 + 0 + 0 + + + 2076 + 2 + 0 + 0 + 0 + + + 2077 + 2 + 0 + 0 + 0 + + + 2078 + 2 + 0 + 0 + 0 + + + 2079 + 2 + 0 + 0 + 0 + + + 2080 + 30 + 0 + 0 + 0 + + + 2081 + 30 + 0 + 0 + 0 + + + 2082 + 2 + 0 + 0 + 0 + + + 2083 + 2 + 0 + 0 + 0 + + + 2084 + 30 + 0 + 0 + 0 + + + 2085 + 30 + 0 + 0 + 0 + + + 2086 + 2 + 0 + 0 + 0 + + + 2087 + 2 + 0 + 0 + 0 + + + 2088 + 2 + 0 + 0 + 0 + + + 2089 + 2 + 0 + 0 + 0 + + + 2090 + 2 + 0 + 0 + 0 + + + 2091 + 2 + 0 + 0 + 0 + + + 2092 + 30 + 0 + 0 + 0 + + + 2093 + 30 + 0 + 0 + 0 + + + 2094 + 2 + 0 + 0 + 0 + + + 2095 + 2 + 0 + 0 + 0 + + + 2096 + 2 + 0 + 0 + 0 + + + 2097 + 2 + 0 + 0 + 0 + + + 2098 + 2 + 0 + 0 + 0 + + + 2099 + 2 + 0 + 0 + 0 + + + 2100 + 2 + 0 + 0 + 0 + + + 2101 + 2 + 0 + 0 + 0 + + + 2102 + 2 + 0 + 0 + 0 + + + 2103 + 2 + 0 + 0 + 0 + + + 2104 + 2 + 0 + 0 + 0 + + + 2105 + 2 + 0 + 0 + 0 + + + 2106 + 2 + 0 + 0 + 0 + + + 2107 + 2 + 0 + 0 + 0 + + + 2108 + 70 + 0 + 0 + 0 + + + 2109 + 70 + 0 + 0 + 0 + + + 2110 + 2 + 0 + 0 + 0 + + + 2111 + 2 + 0 + 0 + 0 + + + 2112 + 2 + 0 + 0 + 0 + + + 2113 + 2 + 0 + 0 + 0 + + + 2114 + 2 + 0 + 0 + 0 + + + 2115 + 2 + 0 + 0 + 0 + + + 2116 + 1 + 0 + 0 + 0 + + + 2117 + 1 + 0 + 0 + 0 + + + 2118 + 1 + 0 + 0 + 0 + + + 2119 + 1 + 0 + 0 + 0 + + + 2120 + 2 + 0 + 0 + 0 + + + 2121 + 2 + 0 + 0 + 0 + + + 2122 + 1 + 0 + 0 + 0 + + + 2123 + 1 + 0 + 0 + 0 + + + 2124 + 2 + 0 + 0 + 0 + + + 2125 + 2 + 0 + 0 + 0 + + + 2126 + 4 + 0 + 0 + 0 + + + 2127 + 4 + 0 + 0 + 0 + + + 2128 + 2 + 0 + 0 + 0 + + + 2129 + 2 + 0 + 0 + 0 + + + 2130 + 19 + 0 + 0 + 0 + + + 2131 + 19 + 0 + 0 + 0 + + + 2132 + 8 + 0 + 0 + 0 + + + 2133 + 8 + 0 + 0 + 0 + + + 2134 + 8 + 0 + 0 + 0 + + + 2135 + 8 + 0 + 0 + 0 + + + 2136 + 8 + 0 + 0 + 0 + + + 2137 + 8 + 0 + 0 + 0 + + + 2138 + 9 + 0 + 0 + 0 + + + 2139 + 9 + 0 + 0 + 0 + + + 2140 + 4 + 0 + 0 + 0 + + + 2141 + 4 + 0 + 0 + 0 + + + 2142 + 4 + 0 + 0 + 0 + + + 2143 + 4 + 0 + 0 + 0 + + + 2144 + 1 + 0 + 0 + 0 + + + 2145 + 1 + 0 + 0 + 0 + + + 2146 + 1 + 0 + 0 + 0 + + + 2147 + 1 + 0 + 0 + 0 + + + 2148 + 150 + 0 + 0 + 0 + + + 2149 + 150 + 0 + 0 + 0 + + + 2150 + 2 + 0 + 0 + 0 + + + 2151 + 2 + 0 + 0 + 0 + + + 2152 + 2 + 0 + 0 + 0 + + + 2153 + 2 + 0 + 0 + 0 + + + 2154 + 2 + 0 + 0 + 0 + + + 2155 + 2 + 0 + 0 + 0 + + + 2156 + 2 + 0 + 0 + 0 + + + 2157 + 2 + 0 + 0 + 0 + + + 2158 + 2 + 0 + 0 + 0 + + + 2159 + 2 + 0 + 0 + 0 + + + 2160 + 2 + 0 + 0 + 0 + + + 2161 + 2 + 0 + 0 + 0 + + + 2162 + 2 + 0 + 0 + 0 + + + 2163 + 2 + 0 + 0 + 0 + + + 2164 + 10 + 0 + 0 + 0 + + + 2165 + 10 + 0 + 0 + 0 + + + 2166 + 10 + 0 + 0 + 0 + + + 2167 + 2 + 0 + 0 + 0 + + + 2168 + 2 + 0 + 0 + 0 + + + 2169 + 2 + 0 + 0 + 0 + + + 2170 + 2 + 0 + 0 + 0 + + + 2171 + 2 + 0 + 0 + 0 + + + 2172 + 2 + 0 + 0 + 0 + + + 2173 + 2 + 0 + 0 + 0 + + + 2174 + 2 + 0 + 0 + 0 + + + 2175 + 1 + 0 + 0 + 0 + + + 2176 + 1 + 0 + 0 + 0 + + + 2177 + 2 + 0 + 0 + 0 + + + 2178 + 2 + 0 + 0 + 0 + + + 2179 + 1 + 0 + 0 + 0 + + + 2180 + 1 + 0 + 0 + 0 + + + 2181 + 1 + 0 + 0 + 0 + + + 2182 + 1 + 0 + 0 + 0 + + + 2183 + 1 + 0 + 0 + 0 + + + 2184 + 1 + 0 + 0 + 0 + + + 2185 + 2 + 0 + 0 + 0 + + + 2186 + 2 + 0 + 0 + 0 + + + 2187 + 2 + 0 + 0 + 0 + + + 2188 + 2 + 0 + 0 + 0 + + + 2189 + 1 + 0 + 0 + 0 + + + 2190 + 1 + 0 + 0 + 0 + + + 2191 + 2 + 0 + 0 + 0 + + + 2192 + 2 + 0 + 0 + 0 + + + 2193 + 1 + 0 + 0 + 0 + + + 2194 + 1 + 0 + 0 + 0 + + + 2195 + 2 + 0 + 0 + 0 + + + 2196 + 2 + 0 + 0 + 0 + + + 2197 + 2 + 0 + 0 + 0 + + + 2198 + 2 + 0 + 0 + 0 + + + 2199 + 1 + 0 + 0 + 0 + + + 2200 + 1 + 0 + 0 + 0 + + + 2201 + 2 + 0 + 0 + 0 + + + 2202 + 2 + 0 + 0 + 0 + + + 2203 + 1 + 0 + 0 + 0 + + + 2204 + 1 + 0 + 0 + 0 + + + 2205 + 2 + 0 + 0 + 0 + + + 2206 + 2 + 0 + 0 + 0 + + + 2207 + 1 + 0 + 0 + 0 + + + 2208 + 1 + 0 + 0 + 0 + + + 2209 + 2 + 0 + 0 + 0 + + + 2210 + 2 + 0 + 0 + 0 + + + 2211 + 1 + 0 + 0 + 0 + + + 2212 + 1 + 0 + 0 + 0 + + + 2213 + 2 + 0 + 0 + 0 + + + 2214 + 2 + 0 + 0 + 0 + + + 2215 + 1 + 0 + 0 + 0 + + + 2216 + 1 + 0 + 0 + 0 + + + 2217 + 2 + 0 + 0 + 0 + + + 2218 + 2 + 0 + 0 + 0 + + + 2219 + 195 + 0 + 0 + 0 + + + 2220 + 195 + 0 + 0 + 0 + + + 2221 + 195 + 0 + 0 + 0 + + + 2222 + 195 + 0 + 0 + 0 + + + 2223 + 195 + 0 + 0 + 0 + + + 2224 + 195 + 0 + 0 + 0 + + + 2225 + 195 + 0 + 0 + 0 + + + 2226 + 195 + 0 + 0 + 0 + + + 2227 + 195 + 0 + 0 + 0 + + + 2228 + 195 + 0 + 0 + 0 + + + 2229 + 450 + 0 + 0 + 0 + + + 2230 + 450 + 0 + 0 + 0 + + + 2231 + 450 + 0 + 0 + 0 + + + 2232 + 450 + 0 + 0 + 0 + + + 2233 + 270 + 0 + 0 + 0 + + + 2234 + 270 + 0 + 0 + 0 + + + 2235 + 270 + 0 + 0 + 0 + + + 2236 + 270 + 0 + 0 + 0 + + + 2237 + 80 + 0 + 0 + 0 + + + 2238 + 80 + 0 + 0 + 0 + + + 2239 + 70 + 0 + 0 + 0 + + + 2240 + 70 + 0 + 0 + 0 + + + 2241 + 70 + 0 + 0 + 0 + + + 2242 + 70 + 0 + 0 + 0 + + + 2243 + 80 + 0 + 0 + 0 + + + 2244 + 80 + 0 + 0 + 0 + + + 2245 + 2 + 0 + 0 + 0 + + + 2246 + 2 + 0 + 0 + 0 + + + 2247 + 1 + 0 + 0 + 0 + + + 2248 + 1 + 0 + 0 + 0 + + + 2249 + 2 + 0 + 0 + 0 + + + 2250 + 2 + 0 + 0 + 0 + + + 2251 + 1 + 0 + 0 + 0 + + + 2252 + 1 + 0 + 0 + 0 + + + 2253 + 1 + 0 + 0 + 0 + + + 2254 + 1 + 0 + 0 + 0 + + + 2255 + 2 + 0 + 0 + 0 + + + 2256 + 2 + 0 + 0 + 0 + + + 2257 + 1 + 0 + 0 + 0 + + + 2258 + 1 + 0 + 0 + 0 + + + 2259 + 2 + 0 + 0 + 0 + + + 2260 + 2 + 0 + 0 + 0 + + + 2261 + 1 + 0 + 0 + 0 + + + 2262 + 1 + 0 + 0 + 0 + + + 2263 + 1 + 0 + 0 + 0 + + + 2264 + 1 + 0 + 0 + 0 + + + 2265 + 1 + 0 + 0 + 0 + + + 2266 + 1 + 0 + 0 + 0 + + + 2267 + 1 + 0 + 0 + 0 + + + 2268 + 1 + 0 + 0 + 0 + + + 2269 + 1 + 0 + 0 + 0 + + + 2270 + 1 + 0 + 0 + 0 + + + 2271 + 1 + 0 + 0 + 0 + + + 2272 + 1 + 0 + 0 + 0 + + + 2273 + 1 + 0 + 0 + 0 + + + 2274 + 1 + 0 + 0 + 0 + + + 2275 + 1 + 0 + 0 + 0 + + + 2276 + 1 + 0 + 0 + 0 + + + 2277 + 2 + 0 + 0 + 0 + + + 2278 + 2 + 0 + 0 + 0 + + + 2279 + 1 + 0 + 0 + 0 + + + 2280 + 1 + 0 + 0 + 0 + + + 2281 + 2 + 0 + 0 + 0 + + + 2282 + 2 + 0 + 0 + 0 + + + 2283 + 4 + 0 + 0 + 0 + + + 2284 + 4 + 0 + 0 + 0 + + + 2285 + 10 + 0 + 0 + 0 + + + 2286 + 10 + 0 + 0 + 0 + + + 2287 + 25 + 0 + 0 + 0 + + + 2288 + 25 + 0 + 0 + 0 + + + 2289 + 200 + 0 + 0 + 0 + + + 2290 + 200 + 0 + 0 + 0 + + + 2291 + 20 + 0 + 0 + 0 + + + 2292 + 20 + 0 + 0 + 0 + + + 2293 + 50 + 0 + 0 + 0 + + + 2294 + 50 + 0 + 0 + 0 + + + 2295 + 25 + 0 + 0 + 0 + + + 2296 + 25 + 0 + 0 + 0 + + + 2297 + 60 + 0 + 0 + 0 + + + 2298 + 60 + 0 + 0 + 0 + + + 2299 + 30 + 0 + 0 + 0 + + + 2300 + 30 + 0 + 0 + 0 + + + 2301 + 100 + 0 + 0 + 0 + + + 2302 + 100 + 0 + 0 + 0 + + + 2303 + 50 + 0 + 0 + 0 + + + 2304 + 50 + 0 + 0 + 0 + + + 2305 + 1 + 0 + 0 + 0 + + + 2306 + 1 + 0 + 0 + 0 + + + 2307 + 4 + 0 + 0 + 0 + + + 2308 + 4 + 0 + 0 + 0 + + + 2309 + 12 + 0 + 0 + 0 + + + 2310 + 12 + 0 + 0 + 0 + + + 2311 + 1 + 0 + 0 + 0 + + + 2312 + 1 + 0 + 0 + 0 + + + 2313 + 3 + 0 + 0 + 0 + + + 2314 + 3 + 0 + 0 + 0 + + + 2315 + 4 + 0 + 0 + 0 + + + 2316 + 4 + 0 + 0 + 0 + + + 2317 + 16 + 0 + 0 + 0 + + + 2318 + 16 + 0 + 0 + 0 + + + 2319 + 8 + 0 + 0 + 0 + + + 2320 + 8 + 0 + 0 + 0 + + + 2321 + 6 + 0 + 0 + 0 + + + 2322 + 6 + 0 + 0 + 0 + + + 2323 + 140 + 0 + 0 + 0 + + + 2324 + 140 + 0 + 0 + 0 + + + 2325 + 150 + 0 + 0 + 0 + + + 2326 + 150 + 0 + 0 + 0 + + + 2327 + 160 + 0 + 0 + 0 + + + 2328 + 160 + 0 + 0 + 0 + + + 2329 + 1 + 0 + 0 + 0 + + + 2330 + 1 + 0 + 0 + 0 + + + 2331 + 8 + 0 + 0 + 0 + + + 2332 + 8 + 0 + 0 + 0 + + + 2333 + 6 + 0 + 0 + 0 + + + 2334 + 6 + 0 + 0 + 0 + + + 2335 + 15 + 0 + 0 + 0 + + + 2336 + 15 + 0 + 0 + 0 + + + 2337 + 10 + 0 + 0 + 0 + + + 2338 + 10 + 0 + 0 + 0 + + + 2339 + 5 + 0 + 0 + 0 + + + 2340 + 5 + 0 + 0 + 0 + + + 2341 + 16 + 0 + 0 + 0 + + + 2342 + 16 + 0 + 0 + 0 + + + 2343 + 35 + 0 + 0 + 0 + + + 2344 + 35 + 0 + 0 + 0 + + + 2345 + 1 + 0 + 0 + 0 + + + 2346 + 1 + 0 + 0 + 0 + + + 2347 + 1 + 0 + 0 + 0 + + + 2348 + 1 + 0 + 0 + 0 + + + 2349 + 8 + 0 + 0 + 0 + + + 2350 + 8 + 0 + 0 + 0 + + + 2351 + 28 + 0 + 0 + 0 + + + 2352 + 28 + 0 + 0 + 0 + + + 2353 + 100 + 0 + 0 + 0 + + + 2354 + 100 + 0 + 0 + 0 + + + 2355 + 150 + 0 + 0 + 0 + + + 2356 + 150 + 0 + 0 + 0 + + + 2357 + 300 + 0 + 0 + 0 + + + 2358 + 300 + 0 + 0 + 0 + + + 2359 + 300 + 0 + 0 + 0 + + + 2360 + 300 + 0 + 0 + 0 + + + 2361 + 640 + 0 + 0 + 0 + + + 2362 + 640 + 0 + 0 + 0 + + + 2363 + 5000 + 0 + 0 + 0 + + + 2364 + 5000 + 0 + 0 + 0 + + + 2365 + 300 + 0 + 0 + 0 + + + 2366 + 110000 + 0 + 0 + 0 + + + 2367 + 110000 + 0 + 0 + 0 + + + 2368 + 750000 + 0 + 0 + 0 + + + 2369 + 750000 + 0 + 0 + 0 + + + 2370 + 150 + 0 + 0 + 0 + + + 2371 + 150 + 0 + 0 + 0 + + + 2372 + 1 + 0 + 0 + 0 + + + 2373 + 1 + 0 + 0 + 0 + + + 2374 + 1 + 0 + 0 + 0 + + + 2375 + 1 + 0 + 0 + 0 + + + 2376 + 1 + 0 + 0 + 0 + + + 2377 + 1 + 0 + 0 + 0 + + + 2378 + 1 + 0 + 0 + 0 + + + 2379 + 1 + 0 + 0 + 0 + + + 2380 + 1 + 0 + 0 + 0 + + + 2381 + 1 + 0 + 0 + 0 + + + 2382 + 1 + 0 + 0 + 0 + + + 2383 + 1 + 0 + 0 + 0 + + + 2384 + 1 + 0 + 0 + 0 + + + 2385 + 1 + 0 + 0 + 0 + + + 2386 + 1 + 0 + 0 + 0 + + + 2387 + 1 + 0 + 0 + 0 + + + 2388 + 1 + 0 + 0 + 0 + + + 2389 + 1 + 0 + 0 + 0 + + + 2390 + 1 + 0 + 0 + 0 + + + 2391 + 20 + 0 + 0 + 0 + + + 2392 + 20 + 0 + 0 + 0 + + + 2393 + 300 + 0 + 0 + 0 + + + 2394 + 120 + 0 + 0 + 0 + + + 2395 + 120 + 0 + 0 + 0 + + + 2396 + 5 + 0 + 0 + 0 + + + 2397 + 40 + 0 + 0 + 0 + + + 2398 + 30 + 0 + 0 + 0 + + + 2399 + 100 + 0 + 0 + 0 + + + 2400 + 100 + 0 + 0 + 0 + + + 2401 + 100 + 0 + 0 + 0 + + + 2402 + 50 + 0 + 0 + 0 + + + 2403 + 1 + 0 + 0 + 0 + + + 2404 + 1 + 0 + 0 + 0 + + + 2405 + 65 + 0 + 0 + 0 + + + 2406 + 1 + 0 + 0 + 0 + + + 2407 + 1 + 0 + 0 + 0 + + + 2408 + 1 + 0 + 0 + 0 + + + 2409 + 1 + 0 + 0 + 0 + + + 2410 + 3 + 0 + 0 + 0 + + + 2411 + 1 + 0 + 0 + 0 + + + 2412 + 100 + 0 + 0 + 0 + + + 2413 + 100 + 0 + 0 + 0 + + + 2414 + 100 + 0 + 0 + 0 + + + 2415 + 80000 + 0 + 0 + 0 + + + 2416 + 80000 + 0 + 0 + 0 + + + 2417 + 80000 + 0 + 0 + 0 + + + 2418 + 1 + 0 + 0 + 0 + + + 2419 + 1 + 0 + 0 + 0 + + + 2420 + 1 + 0 + 0 + 0 + + + 2421 + 1 + 0 + 0 + 0 + + + 2422 + 1 + 0 + 0 + 0 + + + 2423 + 1 + 0 + 0 + 0 + + + 2424 + 5 + 0 + 0 + 0 + + + 2425 + 1 + 0 + 0 + 0 + + + 2426 + 1 + 0 + 0 + 0 + + + 2427 + 1 + 0 + 0 + 0 + + + 2428 + 700 + 0 + 0 + 0 + + + 2429 + 700 + 0 + 0 + 0 + + + 2430 + 110 + 0 + 0 + 0 + + + 2431 + 110 + 0 + 0 + 0 + + + 2432 + 1100 + 0 + 0 + 0 + + + 2433 + 1100 + 0 + 0 + 0 + + + 2434 + 190 + 0 + 0 + 0 + + + 2435 + 190 + 0 + 0 + 0 + + + 2436 + 225 + 0 + 0 + 0 + + + 2437 + 225 + 0 + 0 + 0 + + + 2438 + 250 + 0 + 0 + 0 + + + 2439 + 250 + 0 + 0 + 0 + + + 2440 + 275 + 0 + 0 + 0 + + + 2441 + 275 + 0 + 0 + 0 + + + 2442 + 330 + 0 + 0 + 0 + + + 2443 + 330 + 0 + 0 + 0 + + + 2444 + 360 + 0 + 0 + 0 + + + 2445 + 360 + 0 + 0 + 0 + + + 2446 + 360 + 0 + 0 + 0 + + + 2447 + 360 + 0 + 0 + 0 + + + 2448 + 360 + 0 + 0 + 0 + + + 2449 + 360 + 0 + 0 + 0 + + + 2450 + 200 + 0 + 0 + 0 + + + 2451 + 200 + 0 + 0 + 0 + + + 2452 + 330 + 0 + 0 + 0 + + + 2453 + 330 + 0 + 0 + 0 + + + 2454 + 264 + 0 + 0 + 0 + + + 2455 + 264 + 0 + 0 + 0 + + + 2456 + 198 + 0 + 0 + 0 + + + 2457 + 198 + 0 + 0 + 0 + + + 2458 + 132 + 0 + 0 + 0 + + + 2459 + 132 + 0 + 0 + 0 + + + 2460 + 100 + 0 + 0 + 0 + + + 2461 + 100 + 0 + 0 + 0 + + + 2462 + 100 + 0 + 0 + 0 + + + 2463 + 100 + 0 + 0 + 0 + + + 2464 + 100 + 0 + 0 + 0 + + + 2465 + 100 + 0 + 0 + 0 + + + 2466 + 100 + 0 + 0 + 0 + + + 2467 + 100 + 0 + 0 + 0 + + + 2468 + 100 + 0 + 0 + 0 + + + 2469 + 100 + 0 + 0 + 0 + + + 2470 + 100 + 0 + 0 + 0 + + + 2471 + 100 + 0 + 0 + 0 + + + 2472 + 100 + 0 + 0 + 0 + + + 2473 + 100 + 0 + 0 + 0 + + + 2474 + 100 + 0 + 0 + 0 + + + 2475 + 100 + 0 + 0 + 0 + + + 2476 + 100 + 0 + 0 + 0 + + + 2477 + 100 + 0 + 0 + 0 + + + 2478 + 1 + 0 + 0 + 0 + + + 2479 + 1 + 0 + 0 + 0 + + + 2480 + 1 + 0 + 0 + 0 + + + 2481 + 68 + 0 + 0 + 0 + + + 2482 + 68 + 0 + 0 + 0 + + + 2483 + 68 + 0 + 0 + 0 + + + 2484 + 68 + 0 + 0 + 0 + + + 2485 + 1 + 0 + 0 + 0 + + + 2486 + 1 + 0 + 0 + 0 + + + 2487 + 3000 + 0 + 0 + 0 + + + 2488 + 3000 + 0 + 0 + 0 + + + 2489 + 3600 + 0 + 0 + 0 + + + 2490 + 3600 + 0 + 0 + 0 + + + 2491 + 4320 + 0 + 0 + 0 + + + 2492 + 4320 + 0 + 0 + 0 + + + 2493 + 4320 + 0 + 0 + 0 + + + 2494 + 4320 + 0 + 0 + 0 + + + 2495 + 5180 + 0 + 0 + 0 + + + 2496 + 5180 + 0 + 0 + 0 + + + 2497 + 6220 + 0 + 0 + 0 + + + 2498 + 6220 + 0 + 0 + 0 + + + 2499 + 9360 + 0 + 0 + 0 + + + 2500 + 9360 + 0 + 0 + 0 + + + 2501 + 11230 + 0 + 0 + 0 + + + 2502 + 11230 + 0 + 0 + 0 + + + 2503 + 13480 + 0 + 0 + 0 + + + 2504 + 13480 + 0 + 0 + 0 + + + 2505 + 70 + 0 + 0 + 0 + + + 2506 + 70 + 0 + 0 + 0 + + + 2507 + 90 + 0 + 0 + 0 + + + 2508 + 90 + 0 + 0 + 0 + + + 2509 + 110 + 0 + 0 + 0 + + + 2510 + 110 + 0 + 0 + 0 + + + 2511 + 4 + 0 + 0 + 0 + + + 2512 + 1 + 0 + 0 + 0 + + + 2513 + 6 + 0 + 0 + 0 + + + 2514 + 5 + 0 + 0 + 0 + + + 2515 + 5 + 0 + 0 + 0 + + + 2516 + 10 + 0 + 0 + 0 + + + 2517 + 10 + 0 + 0 + 0 + + + 2518 + 1 + 0 + 0 + 0 + + + 2519 + 1 + 0 + 0 + 0 + + + 2520 + 150 + 0 + 0 + 0 + + + 2521 + 150 + 0 + 0 + 0 + + + 2522 + 150 + 0 + 0 + 0 + + + 2523 + 150 + 0 + 0 + 0 + + + 2524 + 150 + 0 + 0 + 0 + + + 2525 + 150 + 0 + 0 + 0 + + + 2526 + 150 + 0 + 0 + 0 + + + 2527 + 150 + 0 + 0 + 0 + + + 2528 + 1 + 0 + 0 + 0 + + + 2529 + 1 + 0 + 0 + 0 + + + 2530 + 1 + 0 + 0 + 0 + + + 2531 + 1 + 0 + 0 + 0 + + + 2532 + 3 + 0 + 0 + 0 + + + 2533 + 10 + 0 + 0 + 0 + + + 2534 + 3 + 0 + 0 + 0 + + + 2535 + 10 + 0 + 0 + 0 + + + 2536 + 3 + 0 + 0 + 0 + + + 2537 + 10 + 0 + 0 + 0 + + + 2538 + 3 + 0 + 0 + 0 + + + 2539 + 10 + 0 + 0 + 0 + + + 2540 + 3 + 0 + 0 + 0 + + + 2541 + 10 + 0 + 0 + 0 + + + 2542 + 1 + 0 + 0 + 0 + + + 2543 + 1 + 0 + 0 + 0 + + + 2544 + 1 + 0 + 0 + 0 + + + 2545 + 1 + 0 + 0 + 0 + + + 2546 + 1 + 0 + 0 + 0 + + + 2547 + 1 + 0 + 0 + 0 + + + 2548 + 1 + 0 + 0 + 0 + + + 2549 + 1 + 0 + 0 + 0 + + + 2550 + 900 + 0 + 0 + 0 + + + 2551 + 900 + 0 + 0 + 0 + + + 2552 + 1275 + 0 + 0 + 0 + + + 2553 + 1275 + 0 + 0 + 0 + + + 2554 + 1275 + 0 + 0 + 0 + + + 2555 + 1275 + 0 + 0 + 0 + + + 2556 + 1275 + 0 + 0 + 0 + + + 2557 + 1275 + 0 + 0 + 0 + + + 2558 + 1275 + 0 + 0 + 0 + + + 2559 + 1275 + 0 + 0 + 0 + + + 2560 + 1275 + 0 + 0 + 0 + + + 2561 + 1275 + 0 + 0 + 0 + + + 2562 + 1275 + 0 + 0 + 0 + + + 2563 + 1275 + 0 + 0 + 0 + + + 2564 + 1275 + 0 + 0 + 0 + + + 2565 + 1275 + 0 + 0 + 0 + + + 2566 + 1275 + 0 + 0 + 0 + + + 2567 + 1275 + 0 + 0 + 0 + + + 2568 + 2025 + 0 + 0 + 0 + + + 2569 + 2025 + 0 + 0 + 0 + + + 2570 + 3525 + 0 + 0 + 0 + + + 2571 + 3525 + 0 + 0 + 0 + + + 2573 + 17625 + 0 + 0 + 0 + + + 2574 + 50 + 0 + 0 + 0 + + + 2575 + 100 + 0 + 0 + 0 + + + 2576 + 2 + 0 + 0 + 0 + + + 2577 + 200 + 0 + 0 + 0 + + + 2578 + 200 + 0 + 0 + 0 + + + 2579 + 200 + 0 + 0 + 0 + + + 2580 + 200 + 0 + 0 + 0 + + + 2581 + 450 + 0 + 0 + 0 + + + 2582 + 450 + 0 + 0 + 0 + + + 2583 + 3840 + 0 + 0 + 0 + + + 2584 + 3840 + 0 + 0 + 0 + + + 2585 + 1920 + 0 + 0 + 0 + + + 2586 + 1920 + 0 + 0 + 0 + + + 2587 + 1056 + 0 + 0 + 0 + + + 2588 + 1056 + 0 + 0 + 0 + + + 2589 + 1632 + 0 + 0 + 0 + + + 2590 + 1632 + 0 + 0 + 0 + + + 2591 + 3840 + 0 + 0 + 0 + + + 2592 + 3840 + 0 + 0 + 0 + + + 2593 + 1920 + 0 + 0 + 0 + + + 2594 + 1920 + 0 + 0 + 0 + + + 2595 + 1056 + 0 + 0 + 0 + + + 2596 + 1056 + 0 + 0 + 0 + + + 2597 + 1632 + 0 + 0 + 0 + + + 2598 + 1632 + 0 + 0 + 0 + + + 2599 + 12800 + 0 + 0 + 0 + + + 2600 + 12800 + 0 + 0 + 0 + + + 2601 + 6400 + 0 + 0 + 0 + + + 2602 + 6400 + 0 + 0 + 0 + + + 2603 + 5440 + 0 + 0 + 0 + + + 2604 + 5440 + 0 + 0 + 0 + + + 2605 + 3520 + 0 + 0 + 0 + + + 2606 + 3520 + 0 + 0 + 0 + + + 2607 + 12800 + 0 + 0 + 0 + + + 2608 + 12800 + 0 + 0 + 0 + + + 2609 + 6400 + 0 + 0 + 0 + + + 2610 + 6400 + 0 + 0 + 0 + + + 2611 + 5440 + 0 + 0 + 0 + + + 2612 + 5440 + 0 + 0 + 0 + + + 2613 + 3520 + 0 + 0 + 0 + + + 2614 + 3520 + 0 + 0 + 0 + + + 2615 + 65000 + 0 + 0 + 0 + + + 2616 + 65000 + 0 + 0 + 0 + + + 2617 + 64000 + 0 + 0 + 0 + + + 2618 + 64000 + 0 + 0 + 0 + + + 2619 + 35200 + 0 + 0 + 0 + + + 2620 + 35200 + 0 + 0 + 0 + + + 2621 + 54400 + 0 + 0 + 0 + + + 2622 + 54400 + 0 + 0 + 0 + + + 2623 + 65000 + 0 + 0 + 0 + + + 2624 + 65000 + 0 + 0 + 0 + + + 2625 + 64000 + 0 + 0 + 0 + + + 2626 + 64000 + 0 + 0 + 0 + + + 2627 + 35200 + 0 + 0 + 0 + + + 2628 + 35200 + 0 + 0 + 0 + + + 2629 + 54400 + 0 + 0 + 0 + + + 2630 + 54400 + 0 + 0 + 0 + + + 2631 + 40 + 0 + 0 + 0 + + + 2632 + 40 + 0 + 0 + 0 + + + 2633 + 80 + 0 + 0 + 0 + + + 2634 + 80 + 0 + 0 + 0 + + + 2635 + 80 + 0 + 0 + 0 + + + 2636 + 80 + 0 + 0 + 0 + + + 2637 + 80 + 0 + 0 + 0 + + + 2638 + 80 + 0 + 0 + 0 + + + 2639 + 200 + 0 + 0 + 0 + + + 2640 + 200 + 0 + 0 + 0 + + + 2641 + 200 + 0 + 0 + 0 + + + 2642 + 200 + 0 + 0 + 0 + + + 2643 + 200 + 0 + 0 + 0 + + + 2644 + 200 + 0 + 0 + 0 + + + 2645 + 40 + 0 + 0 + 0 + + + 2646 + 40 + 0 + 0 + 0 + + + 2647 + 40 + 0 + 0 + 0 + + + 2648 + 40 + 0 + 0 + 0 + + + 2649 + 40 + 0 + 0 + 0 + + + 2650 + 40 + 0 + 0 + 0 + + + 2651 + 180 + 0 + 0 + 0 + + + 2652 + 180 + 0 + 0 + 0 + + + 2653 + 65000 + 0 + 0 + 0 + + + 2654 + 65000 + 0 + 0 + 0 + + + 2655 + 64000 + 0 + 0 + 0 + + + 2656 + 64000 + 0 + 0 + 0 + + + 2657 + 35200 + 0 + 0 + 0 + + + 2658 + 35200 + 0 + 0 + 0 + + + 2659 + 54400 + 0 + 0 + 0 + + + 2660 + 54400 + 0 + 0 + 0 + + + 2661 + 65000 + 0 + 0 + 0 + + + 2662 + 65000 + 0 + 0 + 0 + + + 2663 + 64000 + 0 + 0 + 0 + + + 2664 + 64000 + 0 + 0 + 0 + + + 2665 + 35200 + 0 + 0 + 0 + + + 2666 + 35200 + 0 + 0 + 0 + + + 2667 + 54400 + 0 + 0 + 0 + + + 2668 + 54400 + 0 + 0 + 0 + + + 2669 + 65000 + 0 + 0 + 0 + + + 2670 + 65000 + 0 + 0 + 0 + + + 2671 + 64000 + 0 + 0 + 0 + + + 2672 + 64000 + 0 + 0 + 0 + + + 2673 + 35200 + 0 + 0 + 0 + + + 2674 + 35200 + 0 + 0 + 0 + + + 2675 + 54400 + 0 + 0 + 0 + + + 2676 + 54400 + 0 + 0 + 0 + + + 2677 + 1 + 0 + 0 + 0 + + + 2678 + 1 + 0 + 0 + 0 + + + 2679 + 1 + 0 + 0 + 0 + + + 2680 + 1 + 0 + 0 + 0 + + + 2681 + 1 + 0 + 0 + 0 + + + 2682 + 1 + 0 + 0 + 0 + + + 2683 + 1 + 0 + 0 + 0 + + + 2684 + 1 + 0 + 0 + 0 + + + 2685 + 1 + 0 + 0 + 0 + + + 2686 + 1 + 0 + 0 + 0 + + + 2687 + 1 + 0 + 0 + 0 + + + 2688 + 1 + 0 + 0 + 0 + + + 2689 + 1 + 0 + 0 + 0 + + + 2690 + 1 + 0 + 0 + 0 + + + 2691 + 1 + 0 + 0 + 0 + + + 2692 + 1 + 0 + 0 + 0 + + + 2693 + 1 + 0 + 0 + 0 + + + 2694 + 1 + 0 + 0 + 0 + + + 2695 + 1 + 0 + 0 + 0 + + + 2696 + 1 + 0 + 0 + 0 + + + 2697 + 1 + 0 + 0 + 0 + + + 2698 + 1 + 0 + 0 + 0 + + + 2699 + 1 + 0 + 0 + 0 + + + 2700 + 1 + 0 + 0 + 0 + + + 2701 + 1 + 0 + 0 + 0 + + + 2702 + 1 + 0 + 0 + 0 + + + 2703 + 1 + 0 + 0 + 0 + + + 2704 + 1 + 0 + 0 + 0 + + + 2705 + 1 + 0 + 0 + 0 + + + 2706 + 1 + 0 + 0 + 0 + + + 2707 + 1 + 0 + 0 + 0 + + + 2708 + 1 + 0 + 0 + 0 + + + 2709 + 1 + 0 + 0 + 0 + + + 2710 + 1 + 0 + 0 + 0 + + + 2711 + 1 + 0 + 0 + 0 + + + 2712 + 1 + 0 + 0 + 0 + + + 2713 + 1 + 0 + 0 + 0 + + + 2714 + 50 + 0 + 0 + 0 + + + 2715 + 50 + 0 + 0 + 0 + + + 2716 + 1 + 0 + 0 + 0 + + + 2717 + 50 + 0 + 0 + 0 + + + 2718 + 50 + 0 + 0 + 0 + + + 2719 + 1 + 0 + 0 + 0 + + + 2720 + 50 + 0 + 0 + 0 + + + 2721 + 50 + 0 + 0 + 0 + + + 2722 + 1 + 0 + 0 + 0 + + + 2723 + 1 + 0 + 0 + 0 + + + 2724 + 50 + 0 + 0 + 0 + + + 2725 + 1 + 0 + 0 + 0 + + + 2726 + 50 + 0 + 0 + 0 + + + 2727 + 1 + 0 + 0 + 0 + + + 2728 + 50 + 0 + 0 + 0 + + + 2729 + 1 + 0 + 0 + 0 + + + 2730 + 50 + 0 + 0 + 0 + + + 2731 + 1 + 0 + 0 + 0 + + + 2732 + 50 + 0 + 0 + 0 + + + 2733 + 1 + 0 + 0 + 0 + + + 2734 + 50 + 0 + 0 + 0 + + + 2735 + 1 + 0 + 0 + 0 + + + 2736 + 50 + 0 + 0 + 0 + + + 2737 + 1 + 0 + 0 + 0 + + + 2738 + 50 + 0 + 0 + 0 + + + 2739 + 1 + 0 + 0 + 0 + + + 2740 + 50 + 0 + 0 + 0 + + + 2741 + 1 + 0 + 0 + 0 + + + 2742 + 50 + 0 + 0 + 0 + + + 2743 + 1 + 0 + 0 + 0 + + + 2744 + 50 + 0 + 0 + 0 + + + 2745 + 1 + 0 + 0 + 0 + + + 2746 + 50 + 0 + 0 + 0 + + + 2747 + 1 + 0 + 0 + 0 + + + 2748 + 50 + 0 + 0 + 0 + + + 2749 + 1 + 0 + 0 + 0 + + + 2750 + 1 + 0 + 0 + 0 + + + 2751 + 1 + 0 + 0 + 0 + + + 2752 + 1 + 0 + 0 + 0 + + + 2753 + 1 + 0 + 0 + 0 + + + 2754 + 1 + 0 + 0 + 0 + + + 2755 + 1 + 0 + 0 + 0 + + + 2756 + 1 + 0 + 0 + 0 + + + 2757 + 1 + 0 + 0 + 0 + + + 2758 + 1 + 0 + 0 + 0 + + + 2759 + 1 + 0 + 0 + 0 + + + 2760 + 1 + 0 + 0 + 0 + + + 2761 + 1 + 0 + 0 + 0 + + + 2762 + 1 + 0 + 0 + 0 + + + 2763 + 1 + 0 + 0 + 0 + + + 2764 + 1 + 0 + 0 + 0 + + + 2765 + 1 + 0 + 0 + 0 + + + 2766 + 1 + 0 + 0 + 0 + + + 2767 + 1 + 0 + 0 + 0 + + + 2768 + 1 + 0 + 0 + 0 + + + 2769 + 1 + 0 + 0 + 0 + + + 2770 + 1 + 0 + 0 + 0 + + + 2771 + 1 + 0 + 0 + 0 + + + 2772 + 1 + 0 + 0 + 0 + + + 2773 + 1 + 0 + 0 + 0 + + + 2774 + 1 + 0 + 0 + 0 + + + 2775 + 50 + 0 + 0 + 0 + + + 2776 + 1 + 0 + 0 + 0 + + + 2777 + 50 + 0 + 0 + 0 + + + 2778 + 1 + 0 + 0 + 0 + + + 2779 + 50 + 0 + 0 + 0 + + + 2780 + 1 + 0 + 0 + 0 + + + 2781 + 50 + 0 + 0 + 0 + + + 2782 + 1 + 0 + 0 + 0 + + + 2783 + 1 + 0 + 0 + 0 + + + 2784 + 50 + 0 + 0 + 0 + + + 2785 + 1 + 0 + 0 + 0 + + + 2786 + 1 + 0 + 0 + 0 + + + 2787 + 50 + 0 + 0 + 0 + + + 2788 + 1 + 0 + 0 + 0 + + + 2789 + 50 + 0 + 0 + 0 + + + 2790 + 1 + 0 + 0 + 0 + + + 2791 + 50 + 0 + 0 + 0 + + + 2792 + 1 + 0 + 0 + 0 + + + 2793 + 1 + 0 + 0 + 0 + + + 2794 + 1 + 0 + 0 + 0 + + + 2795 + 100 + 0 + 0 + 0 + + + 2796 + 1 + 0 + 0 + 0 + + + 2797 + 1 + 0 + 0 + 0 + + + 2798 + 100 + 0 + 0 + 0 + + + 2799 + 1 + 0 + 0 + 0 + + + 2800 + 100 + 0 + 0 + 0 + + + 2801 + 1 + 0 + 0 + 0 + + + 2802 + 50 + 0 + 0 + 0 + + + 2803 + 1 + 0 + 0 + 0 + + + 2804 + 50 + 0 + 0 + 0 + + + 2805 + 1 + 0 + 0 + 0 + + + 2806 + 50 + 0 + 0 + 0 + + + 2807 + 1 + 0 + 0 + 0 + + + 2808 + 50 + 0 + 0 + 0 + + + 2809 + 1 + 0 + 0 + 0 + + + 2810 + 50 + 0 + 0 + 0 + + + 2811 + 1 + 0 + 0 + 0 + + + 2812 + 50 + 0 + 0 + 0 + + + 2813 + 1 + 0 + 0 + 0 + + + 2814 + 50 + 0 + 0 + 0 + + + 2815 + 1 + 0 + 0 + 0 + + + 2816 + 50 + 0 + 0 + 0 + + + 2817 + 1 + 0 + 0 + 0 + + + 2818 + 50 + 0 + 0 + 0 + + + 2819 + 1 + 0 + 0 + 0 + + + 2820 + 50 + 0 + 0 + 0 + + + 2821 + 1 + 0 + 0 + 0 + + + 2822 + 50 + 0 + 0 + 0 + + + 2823 + 1 + 0 + 0 + 0 + + + 2824 + 50 + 0 + 0 + 0 + + + 2825 + 1 + 0 + 0 + 0 + + + 2826 + 50 + 0 + 0 + 0 + + + 2827 + 1 + 0 + 0 + 0 + + + 2828 + 50 + 0 + 0 + 0 + + + 2829 + 1 + 0 + 0 + 0 + + + 2830 + 50 + 0 + 0 + 0 + + + 2831 + 1 + 0 + 0 + 0 + + + 2832 + 1 + 0 + 0 + 0 + + + 2833 + 1 + 0 + 0 + 0 + + + 2834 + 1 + 0 + 0 + 0 + + + 2835 + 1 + 0 + 0 + 0 + + + 2836 + 1 + 0 + 0 + 0 + + + 2837 + 1 + 0 + 0 + 0 + + + 2838 + 1 + 0 + 0 + 0 + + + 2839 + 1 + 0 + 0 + 0 + + + 2840 + 1 + 0 + 0 + 0 + + + 2841 + 1 + 0 + 0 + 0 + + + 2842 + 1 + 0 + 0 + 0 + + + 2843 + 1 + 0 + 0 + 0 + + + 2844 + 1 + 0 + 0 + 0 + + + 2845 + 1 + 0 + 0 + 0 + + + 2846 + 1 + 0 + 0 + 0 + + + 2847 + 1 + 0 + 0 + 0 + + + 2848 + 1 + 0 + 0 + 0 + + + 2849 + 1 + 0 + 0 + 0 + + + 2850 + 1 + 0 + 0 + 0 + + + 2851 + 1 + 0 + 0 + 0 + + + 2852 + 1 + 0 + 0 + 0 + + + 2853 + 1 + 0 + 0 + 0 + + + 2854 + 1 + 0 + 0 + 0 + + + 2855 + 1 + 0 + 0 + 0 + + + 2856 + 1 + 0 + 0 + 0 + + + 2857 + 1 + 0 + 0 + 0 + + + 2858 + 1 + 0 + 0 + 0 + + + 2859 + 1 + 0 + 0 + 0 + + + 2860 + 1 + 0 + 0 + 0 + + + 2861 + 3 + 0 + 0 + 0 + + + 2862 + 4 + 0 + 0 + 0 + + + 2863 + 4 + 0 + 0 + 0 + + + 2864 + 1 + 0 + 0 + 0 + + + 2865 + 1 + 0 + 0 + 0 + + + 2866 + 25 + 0 + 0 + 0 + + + 2867 + 1 + 0 + 0 + 0 + + + 2868 + 1 + 0 + 0 + 0 + + + 2869 + 1 + 0 + 0 + 0 + + + 2870 + 1 + 0 + 0 + 0 + + + 2871 + 1 + 0 + 0 + 0 + + + 2872 + 1 + 0 + 0 + 0 + + + 2873 + 1 + 0 + 0 + 0 + + + 2874 + 1 + 0 + 0 + 0 + + + 2875 + 1 + 0 + 0 + 0 + + + 2876 + 85 + 0 + 0 + 0 + + + 2877 + 85 + 0 + 0 + 0 + + + 2878 + 130 + 0 + 0 + 0 + + + 2879 + 130 + 0 + 0 + 0 + + + 2880 + 1 + 0 + 0 + 0 + + + 2881 + 1 + 0 + 0 + 0 + + + 2882 + 10 + 0 + 0 + 0 + + + 2883 + 500 + 0 + 0 + 0 + + + 2884 + 1 + 0 + 0 + 0 + + + 2885 + 1 + 0 + 0 + 0 + + + 2886 + 10 + 0 + 0 + 0 + + + 2887 + 1 + 0 + 0 + 0 + + + 2888 + 1 + 0 + 0 + 0 + + + 2889 + 1 + 0 + 0 + 0 + + + 2890 + 20 + 0 + 0 + 0 + + + 2891 + 20 + 0 + 0 + 0 + + + 2892 + 5 + 0 + 0 + 0 + + + 2893 + 8 + 0 + 0 + 0 + + + 2894 + 650 + 0 + 0 + 0 + + + 2895 + 650 + 0 + 0 + 0 + + + 2896 + 650 + 0 + 0 + 0 + + + 2897 + 650 + 0 + 0 + 0 + + + 2898 + 650 + 0 + 0 + 0 + + + 2899 + 650 + 0 + 0 + 0 + + + 2900 + 650 + 0 + 0 + 0 + + + 2901 + 650 + 0 + 0 + 0 + + + 2902 + 650 + 0 + 0 + 0 + + + 2903 + 650 + 0 + 0 + 0 + + + 2904 + 650 + 0 + 0 + 0 + + + 2905 + 650 + 0 + 0 + 0 + + + 2906 + 650 + 0 + 0 + 0 + + + 2907 + 650 + 0 + 0 + 0 + + + 2908 + 650 + 0 + 0 + 0 + + + 2909 + 650 + 0 + 0 + 0 + + + 2910 + 650 + 0 + 0 + 0 + + + 2911 + 650 + 0 + 0 + 0 + + + 2912 + 650 + 0 + 0 + 0 + + + 2913 + 650 + 0 + 0 + 0 + + + 2914 + 650 + 0 + 0 + 0 + + + 2915 + 650 + 0 + 0 + 0 + + + 2916 + 650 + 0 + 0 + 0 + + + 2917 + 650 + 0 + 0 + 0 + + + 2918 + 650 + 0 + 0 + 0 + + + 2919 + 650 + 0 + 0 + 0 + + + 2920 + 650 + 0 + 0 + 0 + + + 2921 + 650 + 0 + 0 + 0 + + + 2922 + 650 + 0 + 0 + 0 + + + 2923 + 650 + 0 + 0 + 0 + + + 2924 + 650 + 0 + 0 + 0 + + + 2925 + 650 + 0 + 0 + 0 + + + 2926 + 650 + 0 + 0 + 0 + + + 2927 + 650 + 0 + 0 + 0 + + + 2928 + 650 + 0 + 0 + 0 + + + 2929 + 650 + 0 + 0 + 0 + + + 2930 + 650 + 0 + 0 + 0 + + + 2931 + 650 + 0 + 0 + 0 + + + 2932 + 650 + 0 + 0 + 0 + + + 2933 + 650 + 0 + 0 + 0 + + + 2934 + 650 + 0 + 0 + 0 + + + 2935 + 650 + 0 + 0 + 0 + + + 2936 + 650 + 0 + 0 + 0 + + + 2937 + 650 + 0 + 0 + 0 + + + 2938 + 650 + 0 + 0 + 0 + + + 2939 + 650 + 0 + 0 + 0 + + + 2940 + 650 + 0 + 0 + 0 + + + 2941 + 650 + 0 + 0 + 0 + + + 2942 + 650 + 0 + 0 + 0 + + + 2943 + 650 + 0 + 0 + 0 + + + 2944 + 300 + 0 + 0 + 0 + + + 2945 + 2 + 0 + 0 + 0 + + + 2946 + 300 + 0 + 0 + 0 + + + 2947 + 300 + 0 + 0 + 0 + + + 2948 + 300 + 0 + 0 + 0 + + + 2949 + 300 + 0 + 0 + 0 + + + 2950 + 300 + 0 + 0 + 0 + + + 2951 + 300 + 0 + 0 + 0 + + + 2952 + 300 + 0 + 0 + 0 + + + 2953 + 6 + 0 + 0 + 0 + + + 2954 + 6 + 0 + 0 + 0 + + + 2955 + 5 + 0 + 0 + 0 + + + 2956 + 5 + 0 + 0 + 0 + + + 2957 + 5 + 0 + 0 + 0 + + + 2958 + 5 + 0 + 0 + 0 + + + 2959 + 1 + 0 + 0 + 0 + + + 2960 + 1 + 0 + 0 + 0 + + + 2961 + 175 + 0 + 0 + 0 + + + 2962 + 175 + 0 + 0 + 0 + + + 2963 + 250 + 0 + 0 + 0 + + + 2964 + 4 + 0 + 0 + 0 + + + 2965 + 1 + 0 + 0 + 0 + + + 2966 + 1 + 0 + 0 + 0 + + + 2967 + 1 + 0 + 0 + 0 + + + 2968 + 1 + 0 + 0 + 0 + + + 2969 + 1 + 0 + 0 + 0 + + + 2970 + 1 + 0 + 0 + 0 + + + 2971 + 1 + 0 + 0 + 0 + + + 2972 + 1 + 0 + 0 + 0 + + + 2973 + 1 + 0 + 0 + 0 + + + 2974 + 1 + 0 + 0 + 0 + + + 2975 + 1 + 0 + 0 + 0 + + + 2976 + 10 + 0 + 0 + 0 + + + 2977 + 10 + 0 + 0 + 0 + + + 2978 + 1 + 0 + 0 + 0 + + + 2979 + 1 + 0 + 0 + 0 + + + 2980 + 1 + 0 + 0 + 0 + + + 2981 + 1 + 0 + 0 + 0 + + + 2982 + 1 + 0 + 0 + 0 + + + 2983 + 1 + 0 + 0 + 0 + + + 2984 + 1 + 0 + 0 + 0 + + + 2985 + 1 + 0 + 0 + 0 + + + 2986 + 1 + 0 + 0 + 0 + + + 2987 + 1 + 0 + 0 + 0 + + + 2988 + 1 + 0 + 0 + 0 + + + 2989 + 1 + 0 + 0 + 0 + + + 2990 + 1 + 0 + 0 + 0 + + + 2991 + 1 + 0 + 0 + 0 + + + 2992 + 1 + 0 + 0 + 0 + + + 2993 + 1 + 0 + 0 + 0 + + + 2994 + 1 + 0 + 0 + 0 + + + 2995 + 1 + 0 + 0 + 0 + + + 2996 + 1 + 0 + 0 + 0 + + + 2997 + 89 + 0 + 0 + 0 + + + 2998 + 48 + 0 + 0 + 0 + + + 2999 + 48 + 0 + 0 + 0 + + + 3000 + 59 + 0 + 0 + 0 + + + 3001 + 59 + 0 + 0 + 0 + + + 3002 + 48 + 0 + 0 + 0 + + + 3003 + 48 + 0 + 0 + 0 + + + 3004 + 59 + 0 + 0 + 0 + + + 3005 + 59 + 0 + 0 + 0 + + + 3006 + 60 + 0 + 0 + 0 + + + 3007 + 60 + 0 + 0 + 0 + + + 3008 + 146 + 0 + 0 + 0 + + + 3009 + 146 + 0 + 0 + 0 + + + 3010 + 110 + 0 + 0 + 0 + + + 3011 + 110 + 0 + 0 + 0 + + + 3012 + 72 + 0 + 0 + 0 + + + 3013 + 72 + 0 + 0 + 0 + + + 3014 + 36 + 0 + 0 + 0 + + + 3015 + 36 + 0 + 0 + 0 + + + 3016 + 300 + 0 + 0 + 0 + + + 3017 + 300 + 0 + 0 + 0 + + + 3018 + 230 + 0 + 0 + 0 + + + 3019 + 230 + 0 + 0 + 0 + + + 3020 + 160 + 0 + 0 + 0 + + + 3021 + 160 + 0 + 0 + 0 + + + 3022 + 90 + 0 + 0 + 0 + + + 3023 + 90 + 0 + 0 + 0 + + + 3024 + 300 + 0 + 0 + 0 + + + 3025 + 300 + 0 + 0 + 0 + + + 3026 + 240 + 0 + 0 + 0 + + + 3027 + 240 + 0 + 0 + 0 + + + 3028 + 180 + 0 + 0 + 0 + + + 3029 + 180 + 0 + 0 + 0 + + + 3030 + 120 + 0 + 0 + 0 + + + 3031 + 120 + 0 + 0 + 0 + + + 3032 + 200 + 0 + 0 + 0 + + + 3033 + 200 + 0 + 0 + 0 + + + 3034 + 150 + 0 + 0 + 0 + + + 3035 + 150 + 0 + 0 + 0 + + + 3036 + 100 + 0 + 0 + 0 + + + 3037 + 100 + 0 + 0 + 0 + + + 3038 + 50 + 0 + 0 + 0 + + + 3039 + 50 + 0 + 0 + 0 + + + 3040 + 300 + 0 + 0 + 0 + + + 3041 + 300 + 0 + 0 + 0 + + + 3042 + 250 + 0 + 0 + 0 + + + 3043 + 250 + 0 + 0 + 0 + + + 3044 + 200 + 0 + 0 + 0 + + + 3045 + 200 + 0 + 0 + 0 + + + 3046 + 150 + 0 + 0 + 0 + + + 3047 + 150 + 0 + 0 + 0 + + + 3048 + 89 + 0 + 0 + 0 + + + 3049 + 1 + 0 + 0 + 0 + + + 3050 + 1 + 0 + 0 + 0 + + + 3051 + 1 + 0 + 0 + 0 + + + 3052 + 1 + 0 + 0 + 0 + + + 3053 + 17000 + 0 + 0 + 0 + + + 3054 + 45000 + 0 + 0 + 0 + + + 3055 + 17000 + 0 + 0 + 0 + + + 3056 + 45000 + 0 + 0 + 0 + + + 3057 + 1 + 0 + 0 + 0 + + + 3058 + 1 + 0 + 0 + 0 + + + 3059 + 1 + 0 + 0 + 0 + + + 3060 + 1 + 0 + 0 + 0 + + + 3061 + 1 + 0 + 0 + 0 + + + 3062 + 1 + 0 + 0 + 0 + + + 3063 + 1 + 0 + 0 + 0 + + + 3064 + 1 + 0 + 0 + 0 + + + 3065 + 1 + 0 + 0 + 0 + + + 3066 + 1 + 0 + 0 + 0 + + + 3067 + 1 + 0 + 0 + 0 + + + 3068 + 1 + 0 + 0 + 0 + + + 3069 + 1 + 0 + 0 + 0 + + + 3070 + 1 + 0 + 0 + 0 + + + 3071 + 1 + 0 + 0 + 0 + + + 3072 + 1 + 0 + 0 + 0 + + + 3073 + 1 + 0 + 0 + 0 + + + 3074 + 1 + 0 + 0 + 0 + + + 3075 + 1 + 0 + 0 + 0 + + + 3076 + 1 + 0 + 0 + 0 + + + 3077 + 1 + 0 + 0 + 0 + + + 3078 + 1 + 0 + 0 + 0 + + + 3079 + 1 + 0 + 0 + 0 + + + 3080 + 1 + 0 + 0 + 0 + + + 3081 + 1 + 0 + 0 + 0 + + + 3082 + 1 + 0 + 0 + 0 + + + 3083 + 1 + 0 + 0 + 0 + + + 3084 + 1 + 0 + 0 + 0 + + + 3085 + 1 + 0 + 0 + 0 + + + 3086 + 1 + 0 + 0 + 0 + + + 3087 + 1 + 0 + 0 + 0 + + + 3088 + 1 + 0 + 0 + 0 + + + 3089 + 1 + 0 + 0 + 0 + + + 3090 + 1 + 0 + 0 + 0 + + + 3091 + 1 + 0 + 0 + 0 + + + 3092 + 1 + 0 + 0 + 0 + + + 3093 + 1 + 0 + 0 + 0 + + + 3094 + 18 + 0 + 0 + 0 + + + 3095 + 15 + 0 + 0 + 0 + + + 3096 + 50 + 0 + 0 + 0 + + + 3097 + 175 + 0 + 0 + 0 + + + 3098 + 360 + 0 + 0 + 0 + + + 3099 + 475 + 0 + 0 + 0 + + + 3100 + 1200 + 0 + 0 + 0 + + + 3101 + 12000 + 0 + 0 + 0 + + + 3102 + 1 + 0 + 0 + 0 + + + 3103 + 1 + 0 + 0 + 0 + + + 3104 + 1 + 0 + 0 + 0 + + + 3105 + 12 + 0 + 0 + 0 + + + 3106 + 12 + 0 + 0 + 0 + + + 3107 + 30 + 0 + 0 + 0 + + + 3108 + 1 + 0 + 0 + 0 + + + 3109 + 1 + 0 + 0 + 0 + + + 3110 + 1 + 0 + 0 + 0 + + + 3111 + 1 + 0 + 0 + 0 + + + 3112 + 1 + 0 + 0 + 0 + + + 3113 + 1 + 0 + 0 + 0 + + + 3114 + 1 + 0 + 0 + 0 + + + 3115 + 15 + 0 + 0 + 0 + + + 3116 + 50 + 0 + 0 + 0 + + + 3117 + 175 + 0 + 0 + 0 + + + 3118 + 360 + 0 + 0 + 0 + + + 3119 + 475 + 0 + 0 + 0 + + + 3120 + 1200 + 0 + 0 + 0 + + + 3121 + 12000 + 0 + 0 + 0 + + + 3122 + 56000 + 0 + 0 + 0 + + + 3123 + 1 + 0 + 0 + 0 + + + 3124 + 1 + 0 + 0 + 0 + + + 3125 + 1 + 0 + 0 + 0 + + + 3126 + 1 + 0 + 0 + 0 + + + 3127 + 1 + 0 + 0 + 0 + + + 3128 + 1 + 0 + 0 + 0 + + + 3129 + 1 + 0 + 0 + 0 + + + 3130 + 1 + 0 + 0 + 0 + + + 3131 + 1 + 0 + 0 + 0 + + + 3132 + 1 + 0 + 0 + 0 + + + 3133 + 1 + 0 + 0 + 0 + + + 3134 + 56000 + 0 + 0 + 0 + + + 3135 + 1 + 0 + 0 + 0 + + + 3136 + 1 + 0 + 0 + 0 + + + 3137 + 1 + 0 + 0 + 0 + + + 3138 + 1 + 0 + 0 + 0 + + + 3139 + 1 + 0 + 0 + 0 + + + 3140 + 250000 + 0 + 0 + 0 + + + 3141 + 250000 + 0 + 0 + 0 + + + 3142 + 440 + 0 + 0 + 0 + + + 3143 + 440 + 0 + 0 + 0 + + + 3144 + 460 + 0 + 0 + 0 + + + 3145 + 460 + 0 + 0 + 0 + + + 3146 + 250 + 0 + 0 + 0 + + + 3147 + 250 + 0 + 0 + 0 + + + 3148 + 1 + 0 + 0 + 0 + + + 3149 + 1 + 0 + 0 + 0 + + + 3150 + 10 + 0 + 0 + 0 + + + 3151 + 10 + 0 + 0 + 0 + + + 3152 + 15 + 0 + 0 + 0 + + + 3153 + 15 + 0 + 0 + 0 + + + 3154 + 15 + 0 + 0 + 0 + + + 3155 + 15 + 0 + 0 + 0 + + + 3156 + 15 + 0 + 0 + 0 + + + 3157 + 5 + 0 + 0 + 0 + + + 3158 + 5 + 0 + 0 + 0 + + + 3159 + 40 + 0 + 0 + 0 + + + 3160 + 40 + 0 + 0 + 0 + + + 3161 + 5 + 0 + 0 + 0 + + + 3162 + 2 + 0 + 0 + 0 + + + 3163 + 2 + 0 + 0 + 0 + + + 3164 + 30 + 0 + 0 + 0 + + + 3165 + 30 + 0 + 0 + 0 + + + 3166 + 1 + 0 + 0 + 0 + + + 3167 + 10 + 0 + 0 + 0 + + + 3168 + 1 + 0 + 0 + 0 + + + 3169 + 1 + 0 + 0 + 0 + + + 3170 + 26 + 0 + 0 + 0 + + + 3171 + 91 + 0 + 0 + 0 + + + 3172 + 325 + 0 + 0 + 0 + + + 3173 + 845 + 0 + 0 + 0 + + + 3174 + 2080 + 0 + 0 + 0 + + + 3175 + 20800 + 0 + 0 + 0 + + + 3176 + 62400 + 0 + 0 + 0 + + + 3177 + 2 + 0 + 0 + 0 + + + 3178 + 2 + 0 + 0 + 0 + + + 3179 + 1 + 0 + 0 + 0 + + + 3180 + 1 + 0 + 0 + 0 + + + 3181 + 1 + 0 + 0 + 0 + + + 3182 + 1 + 0 + 0 + 0 + + + 3183 + 1 + 0 + 0 + 0 + + + 3184 + 1 + 0 + 0 + 0 + + + 3185 + 1 + 0 + 0 + 0 + + + 3186 + 1 + 0 + 0 + 0 + + + 3187 + 1 + 0 + 0 + 0 + + + 3188 + 60 + 0 + 0 + 0 + + + 3189 + 60 + 0 + 0 + 0 + + + 3190 + 104 + 0 + 0 + 0 + + + 3191 + 104 + 0 + 0 + 0 + + + 3192 + 364 + 0 + 0 + 0 + + + 3193 + 364 + 0 + 0 + 0 + + + 3194 + 1300 + 0 + 0 + 0 + + + 3195 + 1300 + 0 + 0 + 0 + + + 3196 + 2496 + 0 + 0 + 0 + + + 3197 + 2496 + 0 + 0 + 0 + + + 3198 + 3380 + 0 + 0 + 0 + + + 3199 + 3380 + 0 + 0 + 0 + + + 3200 + 8320 + 0 + 0 + 0 + + + 3201 + 8320 + 0 + 0 + 0 + + + 3202 + 128000 + 0 + 0 + 0 + + + 3203 + 128000 + 0 + 0 + 0 + + + 3204 + 325000 + 0 + 0 + 0 + + + 3205 + 325000 + 0 + 0 + 0 + + + 3206 + 1 + 0 + 0 + 0 + + + 3207 + 1 + 0 + 0 + 0 + + + 3208 + 10 + 0 + 0 + 0 + + + 3209 + 1 + 0 + 0 + 0 + + + 3210 + 1 + 0 + 0 + 0 + + + 3211 + 10 + 0 + 0 + 0 + + + 3212 + 10 + 0 + 0 + 0 + + + 3213 + 4 + 0 + 0 + 0 + + + 3214 + 5 + 0 + 0 + 0 + + + 3215 + 5 + 0 + 0 + 0 + + + 3216 + 1 + 0 + 0 + 0 + + + 3217 + 1 + 0 + 0 + 0 + + + 3218 + 1 + 0 + 0 + 0 + + + 3219 + 1 + 0 + 0 + 0 + + + 3220 + 1 + 0 + 0 + 0 + + + 3221 + 1 + 0 + 0 + 0 + + + 3222 + 1 + 0 + 0 + 0 + + + 3223 + 1 + 0 + 0 + 0 + + + 3224 + 10 + 0 + 0 + 0 + + + 3225 + 1 + 0 + 0 + 0 + + + 3226 + 20 + 0 + 0 + 0 + + + 3227 + 20 + 0 + 0 + 0 + + + 3228 + 4 + 0 + 0 + 0 + + + 3229 + 4 + 0 + 0 + 0 + + + 3230 + 1 + 0 + 0 + 0 + + + 3231 + 1 + 0 + 0 + 0 + + + 3232 + 1 + 0 + 0 + 0 + + + 3233 + 1 + 0 + 0 + 0 + + + 3234 + 1 + 0 + 0 + 0 + + + 3235 + 1 + 0 + 0 + 0 + + + 3236 + 1 + 0 + 0 + 0 + + + 3237 + 1 + 0 + 0 + 0 + + + 3238 + 1 + 0 + 0 + 0 + + + 3239 + 1 + 0 + 0 + 0 + + + 3240 + 1 + 0 + 0 + 0 + + + 3241 + 1 + 0 + 0 + 0 + + + 3242 + 1 + 0 + 0 + 0 + + + 3243 + 1 + 0 + 0 + 0 + + + 3244 + 1 + 0 + 0 + 0 + + + 3245 + 1 + 0 + 0 + 0 + + + 3246 + 1 + 0 + 0 + 0 + + + 3247 + 1 + 0 + 0 + 0 + + + 3248 + 1 + 0 + 0 + 0 + + + 3249 + 1 + 0 + 0 + 0 + + + 3250 + 1 + 0 + 0 + 0 + + + 3251 + 1 + 0 + 0 + 0 + + + 3252 + 1 + 0 + 0 + 0 + + + 3253 + 1 + 0 + 0 + 0 + + + 3254 + 1 + 0 + 0 + 0 + + + 3255 + 1 + 0 + 0 + 0 + + + 3256 + 1 + 0 + 0 + 0 + + + 3257 + 1 + 0 + 0 + 0 + + + 3258 + 1 + 0 + 0 + 0 + + + 3259 + 1 + 0 + 0 + 0 + + + 3260 + 1 + 0 + 0 + 0 + + + 3261 + 1 + 0 + 0 + 0 + + + 3262 + 1 + 0 + 0 + 0 + + + 3263 + 1 + 0 + 0 + 0 + + + 3264 + 1 + 0 + 0 + 0 + + + 3265 + 1 + 0 + 0 + 0 + + + 3266 + 1 + 0 + 0 + 0 + + + 3267 + 1 + 0 + 0 + 0 + + + 3268 + 1 + 0 + 0 + 0 + + + 3269 + 1 + 0 + 0 + 0 + + + 3270 + 1 + 0 + 0 + 0 + + + 3271 + 1 + 0 + 0 + 0 + + + 3272 + 1 + 0 + 0 + 0 + + + 3273 + 1 + 0 + 0 + 0 + + + 3274 + 1 + 0 + 0 + 0 + + + 3275 + 1 + 0 + 0 + 0 + + + 3276 + 1 + 0 + 0 + 0 + + + 3277 + 1 + 0 + 0 + 0 + + + 3278 + 1 + 0 + 0 + 0 + + + 3279 + 1 + 0 + 0 + 0 + + + 3280 + 1 + 0 + 0 + 0 + + + 3281 + 1 + 0 + 0 + 0 + + + 3282 + 1 + 0 + 0 + 0 + + + 3283 + 1 + 0 + 0 + 0 + + + 3284 + 1 + 0 + 0 + 0 + + + 3285 + 1 + 0 + 0 + 0 + + + 3286 + 1 + 0 + 0 + 0 + + + 3287 + 1 + 0 + 0 + 0 + + + 3288 + 1 + 0 + 0 + 0 + + + 3289 + 1 + 0 + 0 + 0 + + + 3290 + 1 + 0 + 0 + 0 + + + 3291 + 1 + 0 + 0 + 0 + + + 3292 + 1 + 0 + 0 + 0 + + + 3293 + 1 + 0 + 0 + 0 + + + 3294 + 1 + 0 + 0 + 0 + + + 3295 + 1 + 0 + 0 + 0 + + + 3296 + 1 + 0 + 0 + 0 + + + 3297 + 1 + 0 + 0 + 0 + + + 3298 + 1 + 0 + 0 + 0 + + + 3299 + 1 + 0 + 0 + 0 + + + 3300 + 1 + 0 + 0 + 0 + + + 3301 + 1 + 0 + 0 + 0 + + + 3302 + 1 + 0 + 0 + 0 + + + 3303 + 1 + 0 + 0 + 0 + + + 3304 + 1 + 0 + 0 + 0 + + + 3305 + 1 + 0 + 0 + 0 + + + 3306 + 1 + 0 + 0 + 0 + + + 3307 + 1 + 0 + 0 + 0 + + + 3308 + 1 + 0 + 0 + 0 + + + 3309 + 1 + 0 + 0 + 0 + + + 3310 + 1 + 0 + 0 + 0 + + + 3311 + 1 + 0 + 0 + 0 + + + 3312 + 1 + 0 + 0 + 0 + + + 3313 + 1 + 0 + 0 + 0 + + + 3314 + 1 + 0 + 0 + 0 + + + 3315 + 1 + 0 + 0 + 0 + + + 3316 + 1 + 0 + 0 + 0 + + + 3317 + 1 + 0 + 0 + 0 + + + 3318 + 1 + 0 + 0 + 0 + + + 3319 + 1 + 0 + 0 + 0 + + + 3320 + 1 + 0 + 0 + 0 + + + 3321 + 1 + 0 + 0 + 0 + + + 3322 + 1 + 0 + 0 + 0 + + + 3323 + 1 + 0 + 0 + 0 + + + 3324 + 1 + 0 + 0 + 0 + + + 3325 + 2 + 0 + 0 + 0 + + + 3326 + 2 + 0 + 0 + 0 + + + 3327 + 300 + 0 + 0 + 0 + + + 3328 + 300 + 0 + 0 + 0 + + + 3329 + 300 + 0 + 0 + 0 + + + 3330 + 300 + 0 + 0 + 0 + + + 3331 + 300 + 0 + 0 + 0 + + + 3332 + 300 + 0 + 0 + 0 + + + 3333 + 300 + 0 + 0 + 0 + + + 3334 + 300 + 0 + 0 + 0 + + + 3335 + 300 + 0 + 0 + 0 + + + 3336 + 300 + 0 + 0 + 0 + + + 3337 + 300 + 0 + 0 + 0 + + + 3338 + 300 + 0 + 0 + 0 + + + 3339 + 300 + 0 + 0 + 0 + + + 3340 + 300 + 0 + 0 + 0 + + + 3341 + 300 + 0 + 0 + 0 + + + 3342 + 300 + 0 + 0 + 0 + + + 3343 + 300 + 0 + 0 + 0 + + + 3344 + 300 + 0 + 0 + 0 + + + 3345 + 150 + 0 + 0 + 0 + + + 3346 + 150 + 0 + 0 + 0 + + + 3347 + 150 + 0 + 0 + 0 + + + 3348 + 150 + 0 + 0 + 0 + + + 3349 + 150 + 0 + 0 + 0 + + + 3350 + 150 + 0 + 0 + 0 + + + 3351 + 150 + 0 + 0 + 0 + + + 3352 + 150 + 0 + 0 + 0 + + + 3353 + 150 + 0 + 0 + 0 + + + 3354 + 150 + 0 + 0 + 0 + + + 3355 + 150 + 0 + 0 + 0 + + + 3356 + 150 + 0 + 0 + 0 + + + 3357 + 150 + 0 + 0 + 0 + + + 3358 + 150 + 0 + 0 + 0 + + + 3359 + 150 + 0 + 0 + 0 + + + 3360 + 150 + 0 + 0 + 0 + + + 3361 + 150 + 0 + 0 + 0 + + + 3362 + 150 + 0 + 0 + 0 + + + 3363 + 60 + 0 + 0 + 0 + + + 3364 + 60 + 0 + 0 + 0 + + + 3365 + 10 + 0 + 0 + 0 + + + 3366 + 10 + 0 + 0 + 0 + + + 3367 + 15 + 0 + 0 + 0 + + + 3368 + 15 + 0 + 0 + 0 + + + 3369 + 10 + 0 + 0 + 0 + + + 3370 + 10 + 0 + 0 + 0 + + + 3371 + 20 + 0 + 0 + 0 + + + 3372 + 20 + 0 + 0 + 0 + + + 3373 + 30 + 0 + 0 + 0 + + + 3374 + 30 + 0 + 0 + 0 + + + 3375 + 10 + 0 + 0 + 0 + + + 3376 + 10 + 0 + 0 + 0 + + + 3377 + 5 + 0 + 0 + 0 + + + 3378 + 5 + 0 + 0 + 0 + + + 3379 + 1 + 0 + 0 + 0 + + + 3380 + 1 + 0 + 0 + 0 + + + 3381 + 1 + 0 + 0 + 0 + + + 3382 + 1 + 0 + 0 + 0 + + + 3383 + 1 + 0 + 0 + 0 + + + 3384 + 1 + 0 + 0 + 0 + + + 3385 + 10000 + 0 + 0 + 0 + + + 3386 + 10000 + 0 + 0 + 0 + + + 3387 + 45000 + 0 + 0 + 0 + + + 3388 + 45000 + 0 + 0 + 0 + + + 3389 + 40000 + 0 + 0 + 0 + + + 3390 + 40000 + 0 + 0 + 0 + + + 3391 + 5000 + 0 + 0 + 0 + + + 3392 + 5000 + 0 + 0 + 0 + + + 3393 + 5000 + 0 + 0 + 0 + + + 3394 + 5000 + 0 + 0 + 0 + + + 3395 + 1 + 0 + 0 + 0 + + + 3396 + 1 + 0 + 0 + 0 + + + 3397 + 1 + 0 + 0 + 0 + + + 3398 + 1 + 0 + 0 + 0 + + + 3399 + 1 + 0 + 0 + 0 + + + 3400 + 1 + 0 + 0 + 0 + + + 3401 + 1 + 0 + 0 + 0 + + + 3402 + 1 + 0 + 0 + 0 + + + 3403 + 1 + 0 + 0 + 0 + + + 3404 + 1 + 0 + 0 + 0 + + + 3405 + 1 + 0 + 0 + 0 + + + 3406 + 11 + 0 + 0 + 0 + + + 3407 + 11 + 0 + 0 + 0 + + + 3408 + 14 + 0 + 0 + 0 + + + 3409 + 1 + 0 + 0 + 0 + + + 3410 + 13 + 0 + 0 + 0 + + + 3411 + 1 + 0 + 0 + 0 + + + 3412 + 13 + 0 + 0 + 0 + + + 3413 + 1 + 0 + 0 + 0 + + + 3414 + 11 + 0 + 0 + 0 + + + 3415 + 1 + 0 + 0 + 0 + + + 3416 + 14 + 0 + 0 + 0 + + + 3417 + 13 + 0 + 0 + 0 + + + 3418 + 13 + 0 + 0 + 0 + + + 3419 + 11 + 0 + 0 + 0 + + + 3420 + 21 + 0 + 0 + 0 + + + 3421 + 21 + 0 + 0 + 0 + + + 3422 + 22 + 0 + 0 + 0 + + + 3423 + 22 + 0 + 0 + 0 + + + 3424 + 26 + 0 + 0 + 0 + + + 3425 + 26 + 0 + 0 + 0 + + + 3426 + 17 + 0 + 0 + 0 + + + 3427 + 17 + 0 + 0 + 0 + + + 3428 + 14 + 0 + 0 + 0 + + + 3429 + 14 + 0 + 0 + 0 + + + 3430 + 100 + 0 + 0 + 0 + + + 3431 + 100 + 0 + 0 + 0 + + + 3432 + 90 + 0 + 0 + 0 + + + 3433 + 90 + 0 + 0 + 0 + + + 3434 + 75 + 0 + 0 + 0 + + + 3435 + 75 + 0 + 0 + 0 + + + 3436 + 60 + 0 + 0 + 0 + + + 3437 + 60 + 0 + 0 + 0 + + + 3438 + 8 + 0 + 0 + 0 + + + 3439 + 8 + 0 + 0 + 0 + + + 3440 + 40 + 0 + 0 + 0 + + + 3441 + 40 + 0 + 0 + 0 + + + 3442 + 80 + 0 + 0 + 0 + + + 3443 + 80 + 0 + 0 + 0 + + + 3444 + 160 + 0 + 0 + 0 + + + 3445 + 160 + 0 + 0 + 0 + + + 3446 + 320 + 0 + 0 + 0 + + + 3447 + 320 + 0 + 0 + 0 + + + 3448 + 640 + 0 + 0 + 0 + + + 3449 + 640 + 0 + 0 + 0 + + + 3450 + 81 + 0 + 0 + 0 + + + 3451 + 82 + 0 + 0 + 0 + + + 3452 + 83 + 0 + 0 + 0 + + + 3453 + 84 + 0 + 0 + 0 + + + 3454 + 85 + 0 + 0 + 0 + + + 3455 + 86 + 0 + 0 + 0 + + + 3456 + 87 + 0 + 0 + 0 + + + 3457 + 88 + 0 + 0 + 0 + + + 3458 + 89 + 0 + 0 + 0 + + + 3459 + 90 + 0 + 0 + 0 + + + 3460 + 91 + 0 + 0 + 0 + + + 3461 + 92 + 0 + 0 + 0 + + + 3462 + 93 + 0 + 0 + 0 + + + 3463 + 94 + 0 + 0 + 0 + + + 3464 + 95 + 0 + 0 + 0 + + + 3465 + 96 + 0 + 0 + 0 + + + 3466 + 97 + 0 + 0 + 0 + + + 3467 + 98 + 0 + 0 + 0 + + + 3468 + 99 + 0 + 0 + 0 + + + 3469 + 100 + 0 + 0 + 0 + + + 3470 + 500 + 0 + 0 + 0 + + + 3471 + 500 + 0 + 0 + 0 + + + 3472 + 1920 + 0 + 0 + 0 + + + 3473 + 1920 + 0 + 0 + 0 + + + 3474 + 6400 + 0 + 0 + 0 + + + 3475 + 6400 + 0 + 0 + 0 + + + 3476 + 64000 + 0 + 0 + 0 + + + 3477 + 64000 + 0 + 0 + 0 + + + 3478 + 64000 + 0 + 0 + 0 + + + 3479 + 64000 + 0 + 0 + 0 + + + 3480 + 64000 + 0 + 0 + 0 + + + 3481 + 65000 + 0 + 0 + 0 + + + 3482 + 65000 + 0 + 0 + 0 + + + 3483 + 64000 + 0 + 0 + 0 + + + 3484 + 64000 + 0 + 0 + 0 + + + 3485 + 64000 + 0 + 0 + 0 + + + 3486 + 35200 + 0 + 0 + 0 + + + 3487 + 35200 + 0 + 0 + 0 + + + 3488 + 54400 + 0 + 0 + 0 + + + 3489 + 54400 + 0 + 0 + 0 + + + 3490 + 1 + 0 + 0 + 0 + + + 3491 + 1 + 0 + 0 + 0 + + + 3492 + 1 + 0 + 0 + 0 + + + 3493 + 1 + 0 + 0 + 0 + + + 3494 + 1 + 0 + 0 + 0 + + + 3495 + 1 + 0 + 0 + 0 + + + 3496 + 1 + 0 + 0 + 0 + + + 3497 + 1 + 0 + 0 + 0 + + + 3498 + 1 + 0 + 0 + 0 + + + 3499 + 1 + 0 + 0 + 0 + + + 3500 + 1 + 0 + 0 + 0 + + + 3501 + 1 + 0 + 0 + 0 + + + 3502 + 1 + 0 + 0 + 0 + + + 3503 + 1 + 0 + 0 + 0 + + + 3504 + 1 + 0 + 0 + 0 + + + 3505 + 1 + 0 + 0 + 0 + + + 3506 + 1 + 0 + 0 + 0 + + + 3507 + 1 + 0 + 0 + 0 + + + 3508 + 1 + 0 + 0 + 0 + + + 3509 + 1 + 0 + 0 + 0 + + + 3510 + 1 + 0 + 0 + 0 + + + 3511 + 50 + 0 + 0 + 0 + + + 3512 + 1 + 0 + 0 + 0 + + + 3513 + 1 + 0 + 0 + 0 + + + 3514 + 1 + 0 + 0 + 0 + + + 3515 + 1 + 0 + 0 + 0 + + + 3516 + 1 + 0 + 0 + 0 + + + 3517 + 50 + 0 + 0 + 0 + + + 3518 + 1 + 0 + 0 + 0 + + + 3519 + 50 + 0 + 0 + 0 + + + 3520 + 1 + 0 + 0 + 0 + + + 3521 + 50 + 0 + 0 + 0 + + + 3522 + 1 + 0 + 0 + 0 + + + 3523 + 50 + 0 + 0 + 0 + + + 3524 + 1 + 0 + 0 + 0 + + + 3525 + 1 + 0 + 0 + 0 + + + 3526 + 1 + 0 + 0 + 0 + + + 3527 + 50 + 0 + 0 + 0 + + + 3528 + 1 + 0 + 0 + 0 + + + 3529 + 50 + 0 + 0 + 0 + + + 3530 + 1 + 0 + 0 + 0 + + + 3531 + 50 + 0 + 0 + 0 + + + 3532 + 1 + 0 + 0 + 0 + + + 3533 + 50 + 0 + 0 + 0 + + + 3534 + 1 + 0 + 0 + 0 + + + 3535 + 50 + 0 + 0 + 0 + + + 3536 + 1 + 0 + 0 + 0 + + + 3537 + 50 + 0 + 0 + 0 + + + 3538 + 1 + 0 + 0 + 0 + + + 3539 + 50 + 0 + 0 + 0 + + + 3540 + 1 + 0 + 0 + 0 + + + 3541 + 50 + 0 + 0 + 0 + + + 3542 + 1 + 0 + 0 + 0 + + + 3543 + 50 + 0 + 0 + 0 + + + 3544 + 1 + 0 + 0 + 0 + + + 3545 + 50 + 0 + 0 + 0 + + + 3546 + 1 + 0 + 0 + 0 + + + 3547 + 50 + 0 + 0 + 0 + + + 3548 + 1 + 0 + 0 + 0 + + + 3549 + 50 + 0 + 0 + 0 + + + 3550 + 1 + 0 + 0 + 0 + + + 3551 + 50 + 0 + 0 + 0 + + + 3552 + 1 + 0 + 0 + 0 + + + 3553 + 50 + 0 + 0 + 0 + + + 3554 + 1 + 0 + 0 + 0 + + + 3555 + 50 + 0 + 0 + 0 + + + 3556 + 1 + 0 + 0 + 0 + + + 3557 + 50 + 0 + 0 + 0 + + + 3558 + 1 + 0 + 0 + 0 + + + 3559 + 50 + 0 + 0 + 0 + + + 3560 + 1 + 0 + 0 + 0 + + + 3561 + 50 + 0 + 0 + 0 + + + 3562 + 1 + 0 + 0 + 0 + + + 3563 + 50 + 0 + 0 + 0 + + + 3564 + 1 + 0 + 0 + 0 + + + 3565 + 100 + 0 + 0 + 0 + + + 3566 + 1 + 0 + 0 + 0 + + + 3567 + 100 + 0 + 0 + 0 + + + 3568 + 1 + 0 + 0 + 0 + + + 3569 + 100 + 0 + 0 + 0 + + + 3570 + 1 + 0 + 0 + 0 + + + 3571 + 100 + 0 + 0 + 0 + + + 3572 + 1 + 0 + 0 + 0 + + + 3573 + 1 + 0 + 0 + 0 + + + 3574 + 1 + 0 + 0 + 0 + + + 3575 + 1 + 0 + 0 + 0 + + + 3576 + 100 + 0 + 0 + 0 + + + 3577 + 1 + 0 + 0 + 0 + + + 3578 + 100 + 0 + 0 + 0 + + + 3579 + 1 + 0 + 0 + 0 + + + 3580 + 1 + 0 + 0 + 0 + + + 3581 + 50 + 0 + 0 + 0 + + + 3582 + 1 + 0 + 0 + 0 + + + 3583 + 50 + 0 + 0 + 0 + + + 3584 + 1 + 0 + 0 + 0 + + + 3585 + 50 + 0 + 0 + 0 + + + 3586 + 1 + 0 + 0 + 0 + + + 3587 + 50 + 0 + 0 + 0 + + + 3588 + 1 + 0 + 0 + 0 + + + 3589 + 50 + 0 + 0 + 0 + + + 3590 + 1 + 0 + 0 + 0 + + + 3591 + 50 + 0 + 0 + 0 + + + 3592 + 1 + 0 + 0 + 0 + + + 3593 + 50 + 0 + 0 + 0 + + + 3594 + 1 + 0 + 0 + 0 + + + 3595 + 50 + 0 + 0 + 0 + + + 3596 + 1 + 0 + 0 + 0 + + + 3597 + 50 + 0 + 0 + 0 + + + 3598 + 1 + 0 + 0 + 0 + + + 3599 + 1 + 0 + 0 + 0 + + + 3600 + 50 + 0 + 0 + 0 + + + 3601 + 1 + 0 + 0 + 0 + + + 3602 + 1 + 0 + 0 + 0 + + + 3603 + 50 + 0 + 0 + 0 + + + 3604 + 1 + 0 + 0 + 0 + + + 3605 + 1 + 0 + 0 + 0 + + + 3606 + 1 + 0 + 0 + 0 + + + 3607 + 1 + 0 + 0 + 0 + + + 3608 + 1 + 0 + 0 + 0 + + + 3609 + 1 + 0 + 0 + 0 + + + 3610 + 1 + 0 + 0 + 0 + + + 3611 + 1 + 0 + 0 + 0 + + + 3612 + 1 + 0 + 0 + 0 + + + 3613 + 1 + 0 + 0 + 0 + + + 3614 + 1 + 0 + 0 + 0 + + + 3615 + 1 + 0 + 0 + 0 + + + 3616 + 1 + 0 + 0 + 0 + + + 3617 + 1 + 0 + 0 + 0 + + + 3618 + 1 + 0 + 0 + 0 + + + 3619 + 1 + 0 + 0 + 0 + + + 3620 + 1 + 0 + 0 + 0 + + + 3621 + 1 + 0 + 0 + 0 + + + 3622 + 1 + 0 + 0 + 0 + + + 3623 + 1 + 0 + 0 + 0 + + + 3624 + 1 + 0 + 0 + 0 + + + 3625 + 1 + 0 + 0 + 0 + + + 3626 + 1 + 0 + 0 + 0 + + + 3627 + 1 + 0 + 0 + 0 + + + 3628 + 1 + 0 + 0 + 0 + + + 3629 + 1 + 0 + 0 + 0 + + + 3630 + 1 + 0 + 0 + 0 + + + 3631 + 1 + 0 + 0 + 0 + + + 3632 + 1 + 0 + 0 + 0 + + + 3633 + 1 + 0 + 0 + 0 + + + 3634 + 1 + 0 + 0 + 0 + + + 3635 + 1 + 0 + 0 + 0 + + + 3636 + 1 + 0 + 0 + 0 + + + 3637 + 1 + 0 + 0 + 0 + + + 3638 + 1 + 0 + 0 + 0 + + + 3639 + 1 + 0 + 0 + 0 + + + 3640 + 1 + 0 + 0 + 0 + + + 3641 + 1 + 0 + 0 + 0 + + + 3642 + 1 + 0 + 0 + 0 + + + 3643 + 1 + 0 + 0 + 0 + + + 3644 + 1 + 0 + 0 + 0 + + + 3645 + 1 + 0 + 0 + 0 + + + 3646 + 1 + 0 + 0 + 0 + + + 3647 + 1 + 0 + 0 + 0 + + + 3648 + 1 + 0 + 0 + 0 + + + 3649 + 1 + 0 + 0 + 0 + + + 3650 + 1 + 0 + 0 + 0 + + + 3651 + 1 + 0 + 0 + 0 + + + 3652 + 1 + 0 + 0 + 0 + + + 3653 + 1 + 0 + 0 + 0 + + + 3654 + 1 + 0 + 0 + 0 + + + 3655 + 1 + 0 + 0 + 0 + + + 3656 + 1 + 0 + 0 + 0 + + + 3657 + 1 + 0 + 0 + 0 + + + 3658 + 1 + 0 + 0 + 0 + + + 3659 + 1 + 0 + 0 + 0 + + + 3660 + 1 + 0 + 0 + 0 + + + 3661 + 1 + 0 + 0 + 0 + + + 3662 + 1 + 0 + 0 + 0 + + + 3663 + 1 + 0 + 0 + 0 + + + 3664 + 1 + 0 + 0 + 0 + + + 3665 + 1 + 0 + 0 + 0 + + + 3666 + 1 + 0 + 0 + 0 + + + 3667 + 1 + 0 + 0 + 0 + + + 3668 + 1920 + 0 + 0 + 0 + + + 3669 + 1920 + 0 + 0 + 0 + + + 3670 + 6400 + 0 + 0 + 0 + + + 3671 + 6400 + 0 + 0 + 0 + + + 3672 + 64000 + 0 + 0 + 0 + + + 3673 + 64000 + 0 + 0 + 0 + + + 3674 + 64000 + 0 + 0 + 0 + + + 3675 + 64000 + 0 + 0 + 0 + + + 3676 + 64000 + 0 + 0 + 0 + + + 3677 + 64000 + 0 + 0 + 0 + + + 3678 + 13000 + 0 + 0 + 0 + + + 3679 + 1 + 0 + 0 + 0 + + + 3680 + 1 + 0 + 0 + 0 + + + 3681 + 1 + 0 + 0 + 0 + + + 3682 + 1 + 0 + 0 + 0 + + + 3683 + 1 + 0 + 0 + 0 + + + 3684 + 1 + 0 + 0 + 0 + + + 3685 + 1 + 0 + 0 + 0 + + + 3686 + 1 + 0 + 0 + 0 + + + 3687 + 1 + 0 + 0 + 0 + + + 3688 + 1 + 0 + 0 + 0 + + + 3689 + 1 + 0 + 0 + 0 + + + 3690 + 1 + 0 + 0 + 0 + + + 3691 + 1000 + 0 + 0 + 0 + + + 3692 + 1 + 0 + 0 + 0 + + + 3693 + 1 + 0 + 0 + 0 + + + 3694 + 1 + 0 + 0 + 0 + + + 3695 + 1 + 0 + 0 + 0 + + + 3696 + 4 + 0 + 0 + 0 + + + 3697 + 4 + 0 + 0 + 0 + + + 3698 + 1 + 0 + 0 + 0 + + + 3699 + 1 + 0 + 0 + 0 + + + 3700 + 1 + 0 + 0 + 0 + + + 3701 + 1 + 0 + 0 + 0 + + + 3702 + 1 + 0 + 0 + 0 + + + 3703 + 1 + 0 + 0 + 0 + + + 3704 + 1 + 0 + 0 + 0 + + + 3705 + 1 + 0 + 0 + 0 + + + 3706 + 1 + 0 + 0 + 0 + + + 3707 + 1 + 0 + 0 + 0 + + + 3708 + 1 + 0 + 0 + 0 + + + 3709 + 1 + 0 + 0 + 0 + + + 3710 + 1 + 0 + 0 + 0 + + + 3711 + 1 + 0 + 0 + 0 + + + 3712 + 1 + 0 + 0 + 0 + + + 3713 + 1 + 0 + 0 + 0 + + + 3714 + 1 + 0 + 0 + 0 + + + 3715 + 1 + 0 + 0 + 0 + + + 3716 + 1 + 0 + 0 + 0 + + + 3717 + 1 + 0 + 0 + 0 + + + 3718 + 3 + 0 + 0 + 0 + + + 3719 + 1 + 0 + 0 + 0 + + + 3720 + 1 + 0 + 0 + 0 + + + 3721 + 2 + 0 + 0 + 0 + + + 3722 + 1 + 0 + 0 + 0 + + + 3723 + 1 + 0 + 0 + 0 + + + 3724 + 1 + 0 + 0 + 0 + + + 3725 + 1 + 0 + 0 + 0 + + + 3726 + 1 + 0 + 0 + 0 + + + 3727 + 1 + 0 + 0 + 0 + + + 3728 + 1 + 0 + 0 + 0 + + + 3729 + 1 + 0 + 0 + 0 + + + 3730 + 1 + 0 + 0 + 0 + + + 3731 + 1 + 0 + 0 + 0 + + + 3732 + 1 + 0 + 0 + 0 + + + 3733 + 1 + 0 + 0 + 0 + + + 3734 + 1 + 0 + 0 + 0 + + + 3735 + 1 + 0 + 0 + 0 + + + 3736 + 1 + 0 + 0 + 0 + + + 3737 + 1 + 0 + 0 + 0 + + + 3738 + 1 + 0 + 0 + 0 + + + 3739 + 1 + 0 + 0 + 0 + + + 3740 + 1 + 0 + 0 + 0 + + + 3741 + 1 + 0 + 0 + 0 + + + 3742 + 1 + 0 + 0 + 0 + + + 3743 + 1 + 0 + 0 + 0 + + + 3744 + 1 + 0 + 0 + 0 + + + 3745 + 1 + 0 + 0 + 0 + + + 3746 + 1 + 0 + 0 + 0 + + + 3747 + 1 + 0 + 0 + 0 + + + 3748 + 6500 + 0 + 0 + 0 + + + 3749 + 78000 + 0 + 0 + 0 + + + 3750 + 78000 + 0 + 0 + 0 + + + 3751 + 78000 + 0 + 0 + 0 + + + 3752 + 78000 + 0 + 0 + 0 + + + 3753 + 78000 + 0 + 0 + 0 + + + 3754 + 78000 + 0 + 0 + 0 + + + 3755 + 78000 + 0 + 0 + 0 + + + 3756 + 78000 + 0 + 0 + 0 + + + 3757 + 5000 + 0 + 0 + 0 + + + 3758 + 5000 + 0 + 0 + 0 + + + 3759 + 325 + 0 + 0 + 0 + + + 3760 + 325 + 0 + 0 + 0 + + + 3761 + 325 + 0 + 0 + 0 + + + 3762 + 325 + 0 + 0 + 0 + + + 3763 + 325 + 0 + 0 + 0 + + + 3764 + 325 + 0 + 0 + 0 + + + 3765 + 325 + 0 + 0 + 0 + + + 3766 + 325 + 0 + 0 + 0 + + + 3767 + 325 + 0 + 0 + 0 + + + 3768 + 325 + 0 + 0 + 0 + + + 3769 + 325 + 0 + 0 + 0 + + + 3770 + 325 + 0 + 0 + 0 + + + 3771 + 325 + 0 + 0 + 0 + + + 3772 + 325 + 0 + 0 + 0 + + + 3773 + 325 + 0 + 0 + 0 + + + 3774 + 325 + 0 + 0 + 0 + + + 3775 + 325 + 0 + 0 + 0 + + + 3776 + 325 + 0 + 0 + 0 + + + 3777 + 325 + 0 + 0 + 0 + + + 3778 + 325 + 0 + 0 + 0 + + + 3779 + 325 + 0 + 0 + 0 + + + 3780 + 325 + 0 + 0 + 0 + + + 3781 + 325 + 0 + 0 + 0 + + + 3782 + 325 + 0 + 0 + 0 + + + 3783 + 325 + 0 + 0 + 0 + + + 3784 + 325 + 0 + 0 + 0 + + + 3785 + 325 + 0 + 0 + 0 + + + 3786 + 325 + 0 + 0 + 0 + + + 3787 + 325 + 0 + 0 + 0 + + + 3788 + 325 + 0 + 0 + 0 + + + 3789 + 325 + 0 + 0 + 0 + + + 3790 + 325 + 0 + 0 + 0 + + + 3791 + 650 + 0 + 0 + 0 + + + 3792 + 650 + 0 + 0 + 0 + + + 3793 + 650 + 0 + 0 + 0 + + + 3794 + 650 + 0 + 0 + 0 + + + 3795 + 650 + 0 + 0 + 0 + + + 3796 + 650 + 0 + 0 + 0 + + + 3797 + 650 + 0 + 0 + 0 + + + 3798 + 650 + 0 + 0 + 0 + + + 3799 + 650 + 0 + 0 + 0 + + + 3800 + 650 + 0 + 0 + 0 + + + 3801 + 325 + 0 + 0 + 0 + + + 3802 + 325 + 0 + 0 + 0 + + + 3803 + 26 + 0 + 0 + 0 + + + 3804 + 26 + 0 + 0 + 0 + + + 3805 + 5 + 0 + 0 + 0 + + + 3806 + 5 + 0 + 0 + 0 + + + 3807 + 1 + 0 + 0 + 0 + + + 3808 + 1 + 0 + 0 + 0 + + + 3809 + 1 + 0 + 0 + 0 + + + 3810 + 1 + 0 + 0 + 0 + + + 3811 + 1 + 0 + 0 + 0 + + + 3812 + 1 + 0 + 0 + 0 + + + 3813 + 1 + 0 + 0 + 0 + + + 3814 + 1 + 0 + 0 + 0 + + + 3815 + 1 + 0 + 0 + 0 + + + 3816 + 1 + 0 + 0 + 0 + + + 3817 + 1 + 0 + 0 + 0 + + + 3818 + 1 + 0 + 0 + 0 + + + 3819 + 1 + 0 + 0 + 0 + + + 3820 + 1 + 0 + 0 + 0 + + + 3821 + 1 + 0 + 0 + 0 + + + 3822 + 1 + 0 + 0 + 0 + + + 3823 + 1 + 0 + 0 + 0 + + + 3824 + 1 + 0 + 0 + 0 + + + 3825 + 1 + 0 + 0 + 0 + + + 3826 + 1 + 0 + 0 + 0 + + + 3827 + 200 + 0 + 0 + 0 + + + 3828 + 200 + 0 + 0 + 0 + + + 3829 + 200 + 0 + 0 + 0 + + + 3830 + 200 + 0 + 0 + 0 + + + 3831 + 200 + 0 + 0 + 0 + + + 3832 + 200 + 0 + 0 + 0 + + + 3833 + 200 + 0 + 0 + 0 + + + 3834 + 200 + 0 + 0 + 0 + + + 3835 + 200 + 0 + 0 + 0 + + + 3836 + 200 + 0 + 0 + 0 + + + 3837 + 200 + 0 + 0 + 0 + + + 3838 + 200 + 0 + 0 + 0 + + + 3839 + 200 + 0 + 0 + 0 + + + 3840 + 200 + 0 + 0 + 0 + + + 3841 + 200 + 0 + 0 + 0 + + + 3842 + 200 + 0 + 0 + 0 + + + 3843 + 200 + 0 + 0 + 0 + + + 3844 + 200 + 0 + 0 + 0 + + + 3845 + 1 + 0 + 0 + 0 + + + 3846 + 1 + 0 + 0 + 0 + + + 3847 + 1 + 0 + 0 + 0 + + + 3848 + 1 + 0 + 0 + 0 + + + 3849 + 1 + 0 + 0 + 0 + + + 3850 + 1 + 0 + 0 + 0 + + + 3851 + 1 + 0 + 0 + 0 + + + 3852 + 200 + 0 + 0 + 0 + + + 3853 + 1050 + 0 + 0 + 0 + + + 3854 + 1050 + 0 + 0 + 0 + + + 3855 + 1050 + 0 + 0 + 0 + + + 3856 + 1050 + 0 + 0 + 0 + + + 3857 + 1050 + 0 + 0 + 0 + + + 3858 + 1050 + 0 + 0 + 0 + + + 3859 + 1050 + 0 + 0 + 0 + + + 3860 + 1050 + 0 + 0 + 0 + + + 3861 + 1050 + 0 + 0 + 0 + + + 3862 + 1050 + 0 + 0 + 0 + + + 3863 + 1050 + 0 + 0 + 0 + + + 3864 + 1050 + 0 + 0 + 0 + + + 3865 + 1050 + 0 + 0 + 0 + + + 3866 + 1050 + 0 + 0 + 0 + + + 3867 + 1050 + 0 + 0 + 0 + + + 3868 + 1050 + 0 + 0 + 0 + + + 3869 + 1 + 0 + 0 + 0 + + + 3870 + 1 + 0 + 0 + 0 + + + 3871 + 1 + 0 + 0 + 0 + + + 3872 + 1 + 0 + 0 + 0 + + + 3873 + 1 + 0 + 0 + 0 + + + 3874 + 1 + 0 + 0 + 0 + + + 3875 + 1 + 0 + 0 + 0 + + + 3876 + 1 + 0 + 0 + 0 + + + 3877 + 1 + 0 + 0 + 0 + + + 3878 + 1 + 0 + 0 + 0 + + + 3879 + 1 + 0 + 0 + 0 + + + 3880 + 1 + 0 + 0 + 0 + + + 3881 + 1 + 0 + 0 + 0 + + + 3882 + 1 + 0 + 0 + 0 + + + 3883 + 1 + 0 + 0 + 0 + + + 3884 + 1 + 0 + 0 + 0 + + + 3885 + 1 + 0 + 0 + 0 + + + 3886 + 1 + 0 + 0 + 0 + + + 3887 + 1 + 0 + 0 + 0 + + + 3888 + 1 + 0 + 0 + 0 + + + 3889 + 1 + 0 + 0 + 0 + + + 3890 + 1 + 0 + 0 + 0 + + + 3891 + 1 + 0 + 0 + 0 + + + 3892 + 1 + 0 + 0 + 0 + + + 3893 + 800 + 0 + 0 + 0 + + + 3894 + 1 + 0 + 0 + 0 + + + 3895 + 1 + 0 + 0 + 0 + + + 3896 + 1 + 0 + 0 + 0 + + + 3897 + 1 + 0 + 0 + 0 + + + 3898 + 1 + 0 + 0 + 0 + + + 3899 + 15 + 0 + 0 + 0 + + + 3900 + 1 + 0 + 0 + 0 + + + 3901 + 1 + 0 + 0 + 0 + + + 3902 + 1 + 0 + 0 + 0 + + + 3903 + 1 + 0 + 0 + 0 + + + 3904 + 1 + 0 + 0 + 0 + + + 3905 + 1 + 0 + 0 + 0 + + + 3906 + 1 + 0 + 0 + 0 + + + 3907 + 1 + 0 + 0 + 0 + + + 3908 + 1 + 0 + 0 + 0 + + + 3909 + 1 + 0 + 0 + 0 + + + 3910 + 1 + 0 + 0 + 0 + + + 3911 + 1 + 0 + 0 + 0 + + + 3912 + 1 + 0 + 0 + 0 + + + 3913 + 1 + 0 + 0 + 0 + + + 3914 + 1 + 0 + 0 + 0 + + + 3915 + 1 + 0 + 0 + 0 + + + 3916 + 1 + 0 + 0 + 0 + + + 3917 + 1 + 0 + 0 + 0 + + + 3918 + 1 + 0 + 0 + 0 + + + 3919 + 1 + 0 + 0 + 0 + + + 3920 + 1 + 0 + 0 + 0 + + + 3921 + 1 + 0 + 0 + 0 + + + 3922 + 1 + 0 + 0 + 0 + + + 3923 + 1 + 0 + 0 + 0 + + + 3924 + 1 + 0 + 0 + 0 + + + 3925 + 1 + 0 + 0 + 0 + + + 3926 + 1 + 0 + 0 + 0 + + + 3927 + 1 + 0 + 0 + 0 + + + 3928 + 1 + 0 + 0 + 0 + + + 3929 + 1 + 0 + 0 + 0 + + + 3930 + 1 + 0 + 0 + 0 + + + 3931 + 1 + 0 + 0 + 0 + + + 3932 + 1 + 0 + 0 + 0 + + + 3933 + 1 + 0 + 0 + 0 + + + 3934 + 1 + 0 + 0 + 0 + + + 3935 + 1 + 0 + 0 + 0 + + + 3936 + 1 + 0 + 0 + 0 + + + 3937 + 1 + 0 + 0 + 0 + + + 3938 + 1 + 0 + 0 + 0 + + + 3939 + 1 + 0 + 0 + 0 + + + 3940 + 1 + 0 + 0 + 0 + + + 3941 + 1 + 0 + 0 + 0 + + + 3942 + 1 + 0 + 0 + 0 + + + 3943 + 1 + 0 + 0 + 0 + + + 3944 + 1 + 0 + 0 + 0 + + + 3945 + 1 + 0 + 0 + 0 + + + 3946 + 1 + 0 + 0 + 0 + + + 3947 + 1 + 0 + 0 + 0 + + + 3948 + 1 + 0 + 0 + 0 + + + 3949 + 1 + 0 + 0 + 0 + + + 3950 + 1 + 0 + 0 + 0 + + + 3951 + 1 + 0 + 0 + 0 + + + 3952 + 1 + 0 + 0 + 0 + + + 3953 + 1 + 0 + 0 + 0 + + + 3954 + 1 + 0 + 0 + 0 + + + 3955 + 1 + 0 + 0 + 0 + + + 3956 + 1 + 0 + 0 + 0 + + + 3957 + 1 + 0 + 0 + 0 + + + 3958 + 1 + 0 + 0 + 0 + + + 3959 + 1 + 0 + 0 + 0 + + + 3960 + 1 + 0 + 0 + 0 + + + 3961 + 1 + 0 + 0 + 0 + + + 3962 + 1 + 0 + 0 + 0 + + + 3963 + 1 + 0 + 0 + 0 + + + 3964 + 1 + 0 + 0 + 0 + + + 3965 + 1 + 0 + 0 + 0 + + + 3966 + 1 + 0 + 0 + 0 + + + 3967 + 1 + 0 + 0 + 0 + + + 3968 + 1 + 0 + 0 + 0 + + + 3969 + 1 + 0 + 0 + 0 + + + 3970 + 1 + 0 + 0 + 0 + + + 3971 + 1 + 0 + 0 + 0 + + + 3972 + 1 + 0 + 0 + 0 + + + 3973 + 1 + 0 + 0 + 0 + + + 3974 + 1 + 0 + 0 + 0 + + + 3975 + 1 + 0 + 0 + 0 + + + 3976 + 1 + 0 + 0 + 0 + + + 3977 + 1 + 0 + 0 + 0 + + + 3978 + 1 + 0 + 0 + 0 + + + 3979 + 1 + 0 + 0 + 0 + + + 3980 + 1 + 0 + 0 + 0 + + + 3981 + 1 + 0 + 0 + 0 + + + 3982 + 1 + 0 + 0 + 0 + + + 3983 + 1 + 0 + 0 + 0 + + + 3984 + 1 + 0 + 0 + 0 + + + 3985 + 1 + 0 + 0 + 0 + + + 3986 + 1 + 0 + 0 + 0 + + + 3987 + 1 + 0 + 0 + 0 + + + 3988 + 1 + 0 + 0 + 0 + + + 3989 + 1 + 0 + 0 + 0 + + + 3990 + 1 + 0 + 0 + 0 + + + 3991 + 1 + 0 + 0 + 0 + + + 3992 + 1 + 0 + 0 + 0 + + + 3993 + 1 + 0 + 0 + 0 + + + 3994 + 1 + 0 + 0 + 0 + + + 3995 + 1 + 0 + 0 + 0 + + + 3996 + 1 + 0 + 0 + 0 + + + 3997 + 1 + 0 + 0 + 0 + + + 3998 + 1 + 0 + 0 + 0 + + + 3999 + 1 + 0 + 0 + 0 + + + 4000 + 1 + 0 + 0 + 0 + + + 4001 + 5 + 0 + 0 + 0 + + + 4002 + 1 + 0 + 0 + 0 + + + 4003 + 1 + 0 + 0 + 0 + + + 4004 + 1 + 0 + 0 + 0 + + + 4005 + 1 + 0 + 0 + 0 + + + 4006 + 10 + 0 + 0 + 0 + + + 4007 + 800 + 0 + 0 + 0 + + + 4008 + 3 + 0 + 0 + 0 + + + 4009 + 3 + 0 + 0 + 0 + + + 4010 + 3 + 0 + 0 + 0 + + + 4011 + 1 + 0 + 0 + 0 + + + 4012 + 3 + 0 + 0 + 0 + + + 4013 + 1 + 0 + 0 + 0 + + + 4014 + 50 + 0 + 0 + 0 + + + 4015 + 1 + 0 + 0 + 0 + + + 4016 + 300 + 0 + 0 + 0 + + + 4017 + 1 + 0 + 0 + 0 + + + 4018 + 10 + 0 + 0 + 0 + + + 4019 + 1 + 0 + 0 + 0 + + + 4020 + 10 + 0 + 0 + 0 + + + 4021 + 550 + 0 + 0 + 0 + + + 4022 + 500 + 0 + 0 + 0 + + + 4023 + 1000 + 0 + 0 + 0 + + + 4024 + 3000 + 0 + 0 + 0 + + + 4025 + 6000 + 0 + 0 + 0 + + + 4026 + 1000 + 0 + 0 + 0 + + + 4027 + 1500 + 0 + 0 + 0 + + + 4028 + 10000 + 0 + 0 + 0 + + + 4029 + 500 + 0 + 0 + 0 + + + 4030 + 2000 + 0 + 0 + 0 + + + 4031 + 500 + 0 + 0 + 0 + + + 4032 + 1 + 0 + 0 + 0 + + + 4033 + 1 + 0 + 0 + 0 + + + 4034 + 1 + 0 + 0 + 0 + + + 4035 + 1 + 0 + 0 + 0 + + + 4036 + 1 + 0 + 0 + 0 + + + 4037 + 1 + 0 + 0 + 0 + + + 4038 + 1 + 0 + 0 + 0 + + + 4039 + 1 + 0 + 0 + 0 + + + 4040 + 1 + 0 + 0 + 0 + + + 4041 + 1 + 0 + 0 + 0 + + + 4042 + 1 + 0 + 0 + 0 + + + 4043 + 1 + 0 + 0 + 0 + + + 4044 + 1 + 0 + 0 + 0 + + + 4045 + 1 + 0 + 0 + 0 + + + 4046 + 1 + 0 + 0 + 0 + + + 4047 + 1 + 0 + 0 + 0 + + + 4048 + 1 + 0 + 0 + 0 + + + 4049 + 1 + 0 + 0 + 0 + + + 4050 + 1 + 0 + 0 + 0 + + + 4051 + 1 + 0 + 0 + 0 + + + 4052 + 1 + 0 + 0 + 0 + + + 4053 + 1 + 0 + 0 + 0 + + + 4054 + 1 + 0 + 0 + 0 + + + 4055 + 5 + 0 + 0 + 0 + + + 4056 + 1 + 0 + 0 + 0 + + + 4057 + 1 + 0 + 0 + 0 + + + 4058 + 1 + 0 + 0 + 0 + + + 4059 + 1 + 0 + 0 + 0 + + + 4060 + 1 + 0 + 0 + 0 + + + 4061 + 1 + 0 + 0 + 0 + + + 4062 + 1 + 0 + 0 + 0 + + + 4063 + 1 + 0 + 0 + 0 + + + 4064 + 1 + 0 + 0 + 0 + + + 4065 + 1 + 0 + 0 + 0 + + + 4066 + 1 + 0 + 0 + 0 + + + 4067 + 1 + 0 + 0 + 0 + + + 4068 + 500 + 0 + 0 + 0 + + + 4069 + 2000 + 0 + 0 + 0 + + + 4070 + 1000 + 0 + 0 + 0 + + + 4071 + 300 + 0 + 0 + 0 + + + 4072 + 850 + 0 + 0 + 0 + + + 4073 + 1 + 0 + 0 + 0 + + + 4074 + 1 + 0 + 0 + 0 + + + 4075 + 1 + 0 + 0 + 0 + + + 4076 + 1 + 0 + 0 + 0 + + + 4077 + 1 + 0 + 0 + 0 + + + 4078 + 1 + 0 + 0 + 0 + + + 4079 + 10 + 0 + 0 + 0 + + + 4080 + 1 + 0 + 0 + 0 + + + 4081 + 1 + 0 + 0 + 0 + + + 4082 + 1 + 0 + 0 + 0 + + + 4083 + 150 + 0 + 0 + 0 + + + 4084 + 175 + 0 + 0 + 0 + + + 4085 + 15 + 0 + 0 + 0 + + + 4086 + 5 + 0 + 0 + 0 + + + 4087 + 270000 + 0 + 0 + 0 + + + 4088 + 270000 + 0 + 0 + 0 + + + 4089 + 15000 + 0 + 0 + 0 + + + 4090 + 15000 + 0 + 0 + 0 + + + 4091 + 120000 + 0 + 0 + 0 + + + 4092 + 120000 + 0 + 0 + 0 + + + 4093 + 80000 + 0 + 0 + 0 + + + 4094 + 80000 + 0 + 0 + 0 + + + 4095 + 10000 + 0 + 0 + 0 + + + 4096 + 10000 + 0 + 0 + 0 + + + 4097 + 10000 + 0 + 0 + 0 + + + 4098 + 10000 + 0 + 0 + 0 + + + 4099 + 15000 + 0 + 0 + 0 + + + 4100 + 15000 + 0 + 0 + 0 + + + 4101 + 120000 + 0 + 0 + 0 + + + 4102 + 120000 + 0 + 0 + 0 + + + 4103 + 80000 + 0 + 0 + 0 + + + 4104 + 80000 + 0 + 0 + 0 + + + 4105 + 10000 + 0 + 0 + 0 + + + 4106 + 10000 + 0 + 0 + 0 + + + 4107 + 10000 + 0 + 0 + 0 + + + 4108 + 10000 + 0 + 0 + 0 + + + 4109 + 15000 + 0 + 0 + 0 + + + 4110 + 15000 + 0 + 0 + 0 + + + 4111 + 120000 + 0 + 0 + 0 + + + 4112 + 120000 + 0 + 0 + 0 + + + 4113 + 80000 + 0 + 0 + 0 + + + 4114 + 80000 + 0 + 0 + 0 + + + 4115 + 10000 + 0 + 0 + 0 + + + 4116 + 10000 + 0 + 0 + 0 + + + 4117 + 10000 + 0 + 0 + 0 + + + 4118 + 10000 + 0 + 0 + 0 + + + 4119 + 24 + 0 + 0 + 0 + + + 4120 + 24 + 0 + 0 + 0 + + + 4121 + 84 + 0 + 0 + 0 + + + 4122 + 84 + 0 + 0 + 0 + + + 4123 + 300 + 0 + 0 + 0 + + + 4124 + 300 + 0 + 0 + 0 + + + 4125 + 576 + 0 + 0 + 0 + + + 4126 + 576 + 0 + 0 + 0 + + + 4127 + 780 + 0 + 0 + 0 + + + 4128 + 780 + 0 + 0 + 0 + + + 4129 + 1920 + 0 + 0 + 0 + + + 4130 + 1920 + 0 + 0 + 0 + + + 4131 + 12500 + 0 + 0 + 0 + + + 4132 + 12500 + 0 + 0 + 0 + + + 4133 + 1 + 0 + 0 + 0 + + + 4134 + 1 + 0 + 0 + 0 + + + 4135 + 1 + 0 + 0 + 0 + + + 4136 + 1 + 0 + 0 + 0 + + + 4137 + 1 + 0 + 0 + 0 + + + 4138 + 1 + 0 + 0 + 0 + + + 4139 + 1 + 0 + 0 + 0 + + + 4140 + 1 + 0 + 0 + 0 + + + 4141 + 1 + 0 + 0 + 0 + + + 4142 + 1 + 0 + 0 + 0 + + + 4143 + 1 + 0 + 0 + 0 + + + 4144 + 1 + 0 + 0 + 0 + + + 4145 + 1 + 0 + 0 + 0 + + + 4146 + 1 + 0 + 0 + 0 + + + 4147 + 1 + 0 + 0 + 0 + + + 4148 + 1 + 0 + 0 + 0 + + + 4149 + 1 + 0 + 0 + 0 + + + 4150 + 1 + 0 + 0 + 0 + + + 4151 + 120001 + 0 + 0 + 0 + + + 4152 + 120001 + 0 + 0 + 0 + + + 4153 + 50000 + 0 + 0 + 0 + + + 4154 + 50000 + 0 + 0 + 0 + + + 4155 + 1 + 0 + 0 + 0 + + + 4156 + 5000 + 0 + 0 + 0 + + + 4157 + 5000 + 0 + 0 + 0 + + + 4158 + 31000 + 0 + 0 + 0 + + + 4159 + 31000 + 0 + 0 + 0 + + + 4160 + 90 + 0 + 0 + 0 + + + 4161 + 10 + 0 + 0 + 0 + + + 4162 + 500 + 0 + 0 + 0 + + + 4163 + 500 + 0 + 0 + 0 + + + 4164 + 200 + 0 + 0 + 0 + + + 4165 + 200 + 0 + 0 + 0 + + + 4166 + 200 + 0 + 0 + 0 + + + 4167 + 200 + 0 + 0 + 0 + + + 4168 + 200 + 0 + 0 + 0 + + + 4169 + 200 + 0 + 0 + 0 + + + 4170 + 21000 + 0 + 0 + 0 + + + 4171 + 21000 + 0 + 0 + 0 + + + 4172 + 1 + 0 + 0 + 0 + + + 4173 + 1 + 0 + 0 + 0 + + + 4174 + 1 + 0 + 0 + 0 + + + 4175 + 1 + 0 + 0 + 0 + + + 4176 + 1 + 0 + 0 + 0 + + + 4177 + 1 + 0 + 0 + 0 + + + 4178 + 6 + 0 + 0 + 0 + + + 4179 + 1 + 0 + 0 + 0 + + + 4180 + 6 + 0 + 0 + 0 + + + 4181 + 1 + 0 + 0 + 0 + + + 4182 + 6 + 0 + 0 + 0 + + + 4183 + 1 + 0 + 0 + 0 + + + 4184 + 1 + 0 + 0 + 0 + + + 4185 + 1 + 0 + 0 + 0 + + + 4186 + 1 + 0 + 0 + 0 + + + 4187 + 1 + 0 + 0 + 0 + + + 4188 + 1 + 0 + 0 + 0 + + + 4189 + 1 + 0 + 0 + 0 + + + 4190 + 1 + 0 + 0 + 0 + + + 4191 + 1 + 0 + 0 + 0 + + + 4192 + 1 + 0 + 0 + 0 + + + 4193 + 1 + 0 + 0 + 0 + + + 4194 + 1 + 0 + 0 + 0 + + + 4195 + 1 + 0 + 0 + 0 + + + 4196 + 1 + 0 + 0 + 0 + + + 4197 + 1 + 0 + 0 + 0 + + + 4198 + 1 + 0 + 0 + 0 + + + 4199 + 1 + 0 + 0 + 0 + + + 4200 + 1 + 0 + 0 + 0 + + + 4201 + 1 + 0 + 0 + 0 + + + 4202 + 1 + 0 + 0 + 0 + + + 4203 + 1 + 0 + 0 + 0 + + + 4204 + 1 + 0 + 0 + 0 + + + 4205 + 1 + 0 + 0 + 0 + + + 4206 + 1 + 0 + 0 + 0 + + + 4207 + 1 + 0 + 0 + 0 + + + 4208 + 1 + 0 + 0 + 0 + + + 4209 + 2 + 0 + 0 + 0 + + + 4210 + 1 + 0 + 0 + 0 + + + 4211 + 1 + 0 + 0 + 0 + + + 4212 + 900000 + 0 + 0 + 0 + + + 4213 + 900000 + 0 + 0 + 0 + + + 4214 + 900000 + 0 + 0 + 0 + + + 4215 + 800000 + 0 + 0 + 0 + + + 4216 + 700000 + 0 + 0 + 0 + + + 4217 + 600000 + 0 + 0 + 0 + + + 4218 + 500000 + 0 + 0 + 0 + + + 4219 + 400000 + 0 + 0 + 0 + + + 4220 + 300000 + 0 + 0 + 0 + + + 4221 + 200000 + 0 + 0 + 0 + + + 4222 + 100000 + 0 + 0 + 0 + + + 4223 + 50000 + 0 + 0 + 0 + + + 4224 + 800000 + 0 + 0 + 0 + + + 4225 + 750000 + 0 + 0 + 0 + + + 4226 + 670000 + 0 + 0 + 0 + + + 4227 + 590000 + 0 + 0 + 0 + + + 4228 + 510000 + 0 + 0 + 0 + + + 4229 + 430000 + 0 + 0 + 0 + + + 4230 + 350000 + 0 + 0 + 0 + + + 4231 + 270000 + 0 + 0 + 0 + + + 4232 + 190000 + 0 + 0 + 0 + + + 4233 + 100000 + 0 + 0 + 0 + + + 4234 + 25000 + 0 + 0 + 0 + + + 4235 + 800000 + 0 + 0 + 0 + + + 4236 + 160 + 0 + 0 + 0 + + + 4237 + 4 + 0 + 0 + 0 + + + 4238 + 1 + 0 + 0 + 0 + + + 4239 + 4 + 0 + 0 + 0 + + + 4240 + 4 + 0 + 0 + 0 + + + 4241 + 3 + 0 + 0 + 0 + + + 4242 + 10 + 0 + 0 + 0 + + + 4243 + 10 + 0 + 0 + 0 + + + 4244 + 2 + 0 + 0 + 0 + + + 4245 + 10 + 0 + 0 + 0 + + + 4246 + 10 + 0 + 0 + 0 + + + 4247 + 1 + 0 + 0 + 0 + + + 4248 + 1 + 0 + 0 + 0 + + + 4249 + 1 + 0 + 0 + 0 + + + 4250 + 35 + 0 + 0 + 0 + + + 4251 + 1 + 0 + 0 + 0 + + + 4252 + 1 + 0 + 0 + 0 + + + 4253 + 1 + 0 + 0 + 0 + + + 4254 + 1 + 0 + 0 + 0 + + + 4255 + 1 + 0 + 0 + 0 + + + 4256 + 1 + 0 + 0 + 0 + + + 4257 + 1 + 0 + 0 + 0 + + + 4258 + 1 + 0 + 0 + 0 + + + 4259 + 1 + 0 + 0 + 0 + + + 4260 + 1 + 0 + 0 + 0 + + + 4261 + 1 + 0 + 0 + 0 + + + 4262 + 1 + 0 + 0 + 0 + + + 4263 + 1 + 0 + 0 + 0 + + + 4264 + 1 + 0 + 0 + 0 + + + 4265 + 1 + 0 + 0 + 0 + + + 4266 + 1 + 0 + 0 + 0 + + + 4267 + 1 + 0 + 0 + 0 + + + 4268 + 1 + 0 + 0 + 0 + + + 4269 + 1 + 0 + 0 + 0 + + + 4270 + 1 + 0 + 0 + 0 + + + 4271 + 1 + 0 + 0 + 0 + + + 4272 + 1 + 0 + 0 + 0 + + + 4273 + 1 + 0 + 0 + 0 + + + 4274 + 1 + 0 + 0 + 0 + + + 4275 + 1 + 0 + 0 + 0 + + + 4276 + 1 + 0 + 0 + 0 + + + 4277 + 1 + 0 + 0 + 0 + + + 4278 + 1 + 0 + 0 + 0 + + + 4279 + 1 + 0 + 0 + 0 + + + 4280 + 1 + 0 + 0 + 0 + + + 4281 + 1 + 0 + 0 + 0 + + + 4282 + 1 + 0 + 0 + 0 + + + 4283 + 1 + 0 + 0 + 0 + + + 4284 + 1 + 0 + 0 + 0 + + + 4285 + 1 + 0 + 0 + 0 + + + 4286 + 1 + 0 + 0 + 0 + + + 4287 + 1 + 0 + 0 + 0 + + + 4288 + 1 + 0 + 0 + 0 + + + 4289 + 1 + 0 + 0 + 0 + + + 4290 + 1 + 0 + 0 + 0 + + + 4291 + 4 + 0 + 0 + 0 + + + 4292 + 4 + 0 + 0 + 0 + + + 4293 + 4 + 0 + 0 + 0 + + + 4294 + 4 + 0 + 0 + 0 + + + 4295 + 1 + 0 + 0 + 0 + + + 4296 + 1 + 0 + 0 + 0 + + + 4297 + 1 + 0 + 0 + 0 + + + 4298 + 75 + 0 + 0 + 0 + + + 4299 + 75 + 0 + 0 + 0 + + + 4300 + 75 + 0 + 0 + 0 + + + 4301 + 75 + 0 + 0 + 0 + + + 4302 + 75 + 0 + 0 + 0 + + + 4303 + 75 + 0 + 0 + 0 + + + 4304 + 75 + 0 + 0 + 0 + + + 4305 + 75 + 0 + 0 + 0 + + + 4306 + 75 + 0 + 0 + 0 + + + 4307 + 75 + 0 + 0 + 0 + + + 4308 + 75 + 0 + 0 + 0 + + + 4309 + 75 + 0 + 0 + 0 + + + 4310 + 75 + 0 + 0 + 0 + + + 4311 + 75 + 0 + 0 + 0 + + + 4312 + 1 + 0 + 0 + 0 + + + 4313 + 2 + 0 + 0 + 0 + + + 4314 + 1 + 0 + 0 + 0 + + + 4315 + 50 + 0 + 0 + 0 + + + 4316 + 50 + 0 + 0 + 0 + + + 4317 + 50 + 0 + 0 + 0 + + + 4318 + 50 + 0 + 0 + 0 + + + 4319 + 50 + 0 + 0 + 0 + + + 4320 + 50 + 0 + 0 + 0 + + + 4321 + 50 + 0 + 0 + 0 + + + 4322 + 50 + 0 + 0 + 0 + + + 4323 + 50 + 0 + 0 + 0 + + + 4324 + 50 + 0 + 0 + 0 + + + 4325 + 50 + 0 + 0 + 0 + + + 4326 + 50 + 0 + 0 + 0 + + + 4327 + 50 + 0 + 0 + 0 + + + 4328 + 50 + 0 + 0 + 0 + + + 4329 + 50 + 0 + 0 + 0 + + + 4330 + 50 + 0 + 0 + 0 + + + 4331 + 50 + 0 + 0 + 0 + + + 4332 + 50 + 0 + 0 + 0 + + + 4333 + 50 + 0 + 0 + 0 + + + 4334 + 50 + 0 + 0 + 0 + + + 4335 + 50 + 0 + 0 + 0 + + + 4336 + 50 + 0 + 0 + 0 + + + 4337 + 50 + 0 + 0 + 0 + + + 4338 + 50 + 0 + 0 + 0 + + + 4339 + 50 + 0 + 0 + 0 + + + 4340 + 50 + 0 + 0 + 0 + + + 4341 + 50 + 0 + 0 + 0 + + + 4342 + 50 + 0 + 0 + 0 + + + 4343 + 50 + 0 + 0 + 0 + + + 4344 + 50 + 0 + 0 + 0 + + + 4345 + 50 + 0 + 0 + 0 + + + 4346 + 50 + 0 + 0 + 0 + + + 4347 + 50 + 0 + 0 + 0 + + + 4348 + 50 + 0 + 0 + 0 + + + 4349 + 50 + 0 + 0 + 0 + + + 4350 + 50 + 0 + 0 + 0 + + + 4351 + 50 + 0 + 0 + 0 + + + 4352 + 50 + 0 + 0 + 0 + + + 4353 + 50 + 0 + 0 + 0 + + + 4354 + 50 + 0 + 0 + 0 + + + 4355 + 50 + 0 + 0 + 0 + + + 4356 + 50 + 0 + 0 + 0 + + + 4357 + 50 + 0 + 0 + 0 + + + 4358 + 50 + 0 + 0 + 0 + + + 4359 + 50 + 0 + 0 + 0 + + + 4360 + 50 + 0 + 0 + 0 + + + 4361 + 50 + 0 + 0 + 0 + + + 4362 + 50 + 0 + 0 + 0 + + + 4363 + 50 + 0 + 0 + 0 + + + 4364 + 50 + 0 + 0 + 0 + + + 4365 + 50 + 0 + 0 + 0 + + + 4366 + 50 + 0 + 0 + 0 + + + 4367 + 50 + 0 + 0 + 0 + + + 4368 + 50 + 0 + 0 + 0 + + + 4369 + 50 + 0 + 0 + 0 + + + 4370 + 50 + 0 + 0 + 0 + + + 4371 + 50 + 0 + 0 + 0 + + + 4372 + 50 + 0 + 0 + 0 + + + 4373 + 50 + 0 + 0 + 0 + + + 4374 + 50 + 0 + 0 + 0 + + + 4375 + 50 + 0 + 0 + 0 + + + 4376 + 50 + 0 + 0 + 0 + + + 4377 + 50 + 0 + 0 + 0 + + + 4378 + 50 + 0 + 0 + 0 + + + 4379 + 50 + 0 + 0 + 0 + + + 4380 + 50 + 0 + 0 + 0 + + + 4381 + 50 + 0 + 0 + 0 + + + 4382 + 50 + 0 + 0 + 0 + + + 4383 + 50 + 0 + 0 + 0 + + + 4384 + 50 + 0 + 0 + 0 + + + 4385 + 50 + 0 + 0 + 0 + + + 4386 + 50 + 0 + 0 + 0 + + + 4387 + 50 + 0 + 0 + 0 + + + 4388 + 50 + 0 + 0 + 0 + + + 4389 + 50 + 0 + 0 + 0 + + + 4390 + 50 + 0 + 0 + 0 + + + 4391 + 50 + 0 + 0 + 0 + + + 4392 + 50 + 0 + 0 + 0 + + + 4393 + 50 + 0 + 0 + 0 + + + 4394 + 50 + 0 + 0 + 0 + + + 4395 + 50 + 0 + 0 + 0 + + + 4396 + 50 + 0 + 0 + 0 + + + 4397 + 50 + 0 + 0 + 0 + + + 4398 + 50 + 0 + 0 + 0 + + + 4399 + 50 + 0 + 0 + 0 + + + 4400 + 50 + 0 + 0 + 0 + + + 4401 + 50 + 0 + 0 + 0 + + + 4402 + 50 + 0 + 0 + 0 + + + 4403 + 50 + 0 + 0 + 0 + + + 4404 + 50 + 0 + 0 + 0 + + + 4405 + 50 + 0 + 0 + 0 + + + 4406 + 50 + 0 + 0 + 0 + + + 4407 + 50 + 0 + 0 + 0 + + + 4408 + 50 + 0 + 0 + 0 + + + 4409 + 50 + 0 + 0 + 0 + + + 4410 + 50 + 0 + 0 + 0 + + + 4411 + 50 + 0 + 0 + 0 + + + 4412 + 50 + 0 + 0 + 0 + + + 4413 + 50 + 0 + 0 + 0 + + + 4414 + 50 + 0 + 0 + 0 + + + 4415 + 56 + 0 + 0 + 0 + + + 4416 + 100 + 0 + 0 + 0 + + + 4417 + 50 + 0 + 0 + 0 + + + 4418 + 50 + 0 + 0 + 0 + + + 4419 + 50 + 0 + 0 + 0 + + + 4420 + 50 + 0 + 0 + 0 + + + 4421 + 50 + 0 + 0 + 0 + + + 4422 + 50 + 0 + 0 + 0 + + + 4423 + 50 + 0 + 0 + 0 + + + 4424 + 50 + 0 + 0 + 0 + + + 4425 + 1 + 0 + 0 + 0 + + + 4426 + 1 + 0 + 0 + 0 + + + 4427 + 5 + 0 + 0 + 0 + + + 4428 + 50 + 0 + 0 + 0 + + + 4429 + 1 + 0 + 0 + 0 + + + 4430 + 1 + 0 + 0 + 0 + + + 4431 + 1 + 0 + 0 + 0 + + + 4432 + 1 + 0 + 0 + 0 + + + 4433 + 1 + 0 + 0 + 0 + + + 4434 + 1 + 0 + 0 + 0 + + + 4435 + 1 + 0 + 0 + 0 + + + 4436 + 10 + 0 + 0 + 0 + + + 4437 + 10 + 0 + 0 + 0 + + + 4438 + 10 + 0 + 0 + 0 + + + 4439 + 10 + 0 + 0 + 0 + + + 4440 + 15 + 0 + 0 + 0 + + + 4441 + 15 + 0 + 0 + 0 + + + 4442 + 1 + 0 + 0 + 0 + + + 4443 + 1 + 0 + 0 + 0 + + + 4444 + 56 + 0 + 0 + 0 + + + 4445 + 1 + 0 + 0 + 0 + + + 4446 + 1 + 0 + 0 + 0 + + + 4447 + 1 + 0 + 0 + 0 + + + 4448 + 1 + 0 + 0 + 0 + + + 4449 + 1 + 0 + 0 + 0 + + + 4450 + 1 + 0 + 0 + 0 + + + 4451 + 1 + 0 + 0 + 0 + + + 4452 + 1 + 0 + 0 + 0 + + + 4453 + 1 + 0 + 0 + 0 + + + 4454 + 1 + 0 + 0 + 0 + + + 4455 + 1 + 0 + 0 + 0 + + + 4456 + 10 + 0 + 0 + 0 + + + 4457 + 10 + 0 + 0 + 0 + + + 4458 + 10 + 0 + 0 + 0 + + + 4459 + 10 + 0 + 0 + 0 + + + 4460 + 10 + 0 + 0 + 0 + + + 4461 + 10 + 0 + 0 + 0 + + + 4462 + 10 + 0 + 0 + 0 + + + 4463 + 10 + 0 + 0 + 0 + + + 4464 + 10 + 0 + 0 + 0 + + + 4465 + 10 + 0 + 0 + 0 + + + 4466 + 10 + 0 + 0 + 0 + + + 4467 + 10 + 0 + 0 + 0 + + + 4468 + 10 + 0 + 0 + 0 + + + 4469 + 10 + 0 + 0 + 0 + + + 4470 + 15 + 0 + 0 + 0 + + + 4471 + 15 + 0 + 0 + 0 + + + 4472 + 15 + 0 + 0 + 0 + + + 4473 + 15 + 0 + 0 + 0 + + + 4474 + 15 + 0 + 0 + 0 + + + 4475 + 15 + 0 + 0 + 0 + + + 4476 + 15 + 0 + 0 + 0 + + + 4477 + 15 + 0 + 0 + 0 + + + 4478 + 30 + 0 + 0 + 0 + + + 4479 + 30 + 0 + 0 + 0 + + + 4480 + 30 + 0 + 0 + 0 + + + 4481 + 30 + 0 + 0 + 0 + + + 4482 + 30 + 0 + 0 + 0 + + + 4483 + 30 + 0 + 0 + 0 + + + 4484 + 1 + 0 + 0 + 0 + + + 4485 + 1 + 0 + 0 + 0 + + + 4486 + 1 + 0 + 0 + 0 + + + 4487 + 1 + 0 + 0 + 0 + + + 4488 + 1 + 0 + 0 + 0 + + + 4489 + 1 + 0 + 0 + 0 + + + 4490 + 1 + 0 + 0 + 0 + + + 4491 + 1 + 0 + 0 + 0 + + + 4492 + 1 + 0 + 0 + 0 + + + 4493 + 1 + 0 + 0 + 0 + + + 4494 + 1 + 0 + 0 + 0 + + + 4495 + 1 + 0 + 0 + 0 + + + 4496 + 1 + 0 + 0 + 0 + + + 4497 + 1 + 0 + 0 + 0 + + + 4498 + 1 + 0 + 0 + 0 + + + 4499 + 1 + 0 + 0 + 0 + + + 4500 + 1 + 0 + 0 + 0 + + + 4501 + 1 + 0 + 0 + 0 + + + 4502 + 1 + 0 + 0 + 0 + + + 4503 + 1300 + 0 + 0 + 0 + + + 4504 + 5200 + 0 + 0 + 0 + + + 4505 + 2600 + 0 + 0 + 0 + + + 4506 + 780 + 0 + 0 + 0 + + + 4507 + 2210 + 0 + 0 + 0 + + + 4508 + 3200 + 0 + 0 + 0 + + + 4509 + 12800 + 0 + 0 + 0 + + + 4510 + 6400 + 0 + 0 + 0 + + + 4511 + 1920 + 0 + 0 + 0 + + + 4512 + 5440 + 0 + 0 + 0 + + + 4513 + 1 + 0 + 0 + 0 + + + 4514 + 100 + 0 + 0 + 0 + + + 4515 + 1 + 0 + 0 + 0 + + + 4516 + 100 + 0 + 0 + 0 + + + 4517 + 100 + 0 + 0 + 0 + + + 4518 + 100 + 0 + 0 + 0 + + + 4519 + 1 + 0 + 0 + 0 + + + 4520 + 1 + 0 + 0 + 0 + + + 4521 + 1 + 0 + 0 + 0 + + + 4522 + 28 + 0 + 0 + 0 + + + 4523 + 28 + 0 + 0 + 0 + + + 4524 + 28 + 0 + 0 + 0 + + + 4525 + 25 + 0 + 0 + 0 + + + 4526 + 25 + 0 + 0 + 0 + + + 4527 + 10 + 0 + 0 + 0 + + + 4528 + 10 + 0 + 0 + 0 + + + 4529 + 15 + 0 + 0 + 0 + + + 4530 + 15 + 0 + 0 + 0 + + + 4531 + 15 + 0 + 0 + 0 + + + 4532 + 15 + 0 + 0 + 0 + + + 4533 + 15 + 0 + 0 + 0 + + + 4534 + 15 + 0 + 0 + 0 + + + 4535 + 120 + 0 + 0 + 0 + + + 4536 + 120 + 0 + 0 + 0 + + + 4537 + 125 + 0 + 0 + 0 + + + 4538 + 125 + 0 + 0 + 0 + + + 4539 + 125 + 0 + 0 + 0 + + + 4540 + 90 + 0 + 0 + 0 + + + 4541 + 90 + 0 + 0 + 0 + + + 4542 + 70 + 0 + 0 + 0 + + + 4543 + 70 + 0 + 0 + 0 + + + 4544 + 300 + 0 + 0 + 0 + + + 4545 + 300 + 0 + 0 + 0 + + + 4546 + 400 + 0 + 0 + 0 + + + 4547 + 400 + 0 + 0 + 0 + + + 4548 + 420 + 0 + 0 + 0 + + + 4549 + 420 + 0 + 0 + 0 + + + 4550 + 420 + 0 + 0 + 0 + + + 4551 + 650 + 0 + 0 + 0 + + + 4552 + 650 + 0 + 0 + 0 + + + 4553 + 1 + 0 + 0 + 0 + + + 4554 + 1 + 0 + 0 + 0 + + + 4555 + 1 + 0 + 0 + 0 + + + 4556 + 1 + 0 + 0 + 0 + + + 4557 + 1 + 0 + 0 + 0 + + + 4558 + 1 + 0 + 0 + 0 + + + 4559 + 1 + 0 + 0 + 0 + + + 4560 + 1 + 0 + 0 + 0 + + + 4561 + 1 + 0 + 0 + 0 + + + 4562 + 1 + 0 + 0 + 0 + + + 4563 + 1 + 0 + 0 + 0 + + + 4564 + 1 + 0 + 0 + 0 + + + 4565 + 1 + 0 + 0 + 0 + + + 4566 + 1 + 0 + 0 + 0 + + + 4567 + 1 + 0 + 0 + 0 + + + 4568 + 1 + 0 + 0 + 0 + + + 4569 + 1 + 0 + 0 + 0 + + + 4570 + 1 + 0 + 0 + 0 + + + 4571 + 1 + 0 + 0 + 0 + + + 4572 + 1 + 0 + 0 + 0 + + + 4573 + 1 + 0 + 0 + 0 + + + 4574 + 1 + 0 + 0 + 0 + + + 4575 + 1 + 0 + 0 + 0 + + + 4576 + 1 + 0 + 0 + 0 + + + 4577 + 1 + 0 + 0 + 0 + + + 4578 + 1 + 0 + 0 + 0 + + + 4579 + 1 + 0 + 0 + 0 + + + 4580 + 650 + 0 + 0 + 0 + + + 4581 + 650 + 0 + 0 + 0 + + + 4582 + 750 + 0 + 0 + 0 + + + 4583 + 750 + 0 + 0 + 0 + + + 4584 + 750 + 0 + 0 + 0 + + + 4585 + 270000 + 0 + 0 + 0 + + + 4586 + 270000 + 0 + 0 + 0 + + + 4587 + 100000 + 0 + 0 + 0 + + + 4588 + 100000 + 0 + 0 + 0 + + + 4589 + 1 + 0 + 0 + 0 + + + 4590 + 1 + 0 + 0 + 0 + + + 4591 + 1 + 0 + 0 + 0 + + + 4592 + 1 + 0 + 0 + 0 + + + 4593 + 1 + 0 + 0 + 0 + + + 4594 + 1 + 0 + 0 + 0 + + + 4595 + 1 + 0 + 0 + 0 + + + 4596 + 1 + 0 + 0 + 0 + + + 4597 + 1 + 0 + 0 + 0 + + + 4598 + 1 + 0 + 0 + 0 + + + 4599 + 1 + 0 + 0 + 0 + + + 4600 + 600 + 0 + 0 + 0 + + + 4601 + 1 + 0 + 0 + 0 + + + 4602 + 1 + 0 + 0 + 0 + + + 4603 + 1 + 0 + 0 + 0 + + + 4604 + 1 + 0 + 0 + 0 + + + 4605 + 1 + 0 + 0 + 0 + + + 4606 + 1 + 0 + 0 + 0 + + + 4607 + 1 + 0 + 0 + 0 + + + 4608 + 3 + 0 + 0 + 0 + + + 4609 + 3 + 0 + 0 + 0 + + + 4610 + 1 + 0 + 0 + 0 + + + 4611 + 1 + 0 + 0 + 0 + + + 4612 + 600 + 0 + 0 + 0 + + + 4613 + 75 + 0 + 0 + 0 + + + 4614 + 1 + 0 + 0 + 0 + + + 4615 + 1 + 0 + 0 + 0 + + + 4616 + 2 + 0 + 0 + 0 + + + 4617 + 1 + 0 + 0 + 0 + + + 4618 + 2 + 0 + 0 + 0 + + + 4619 + 1 + 0 + 0 + 0 + + + 4620 + 1 + 0 + 0 + 0 + + + 4621 + 1 + 0 + 0 + 0 + + + 4622 + 1 + 0 + 0 + 0 + + + 4623 + 1 + 0 + 0 + 0 + + + 4624 + 1 + 0 + 0 + 0 + + + 4625 + 1 + 0 + 0 + 0 + + + 4626 + 1 + 0 + 0 + 0 + + + 4627 + 650 + 0 + 0 + 0 + + + 4628 + 650 + 0 + 0 + 0 + + + 4629 + 1 + 0 + 0 + 0 + + + 4630 + 1 + 0 + 0 + 0 + + + 4631 + 1 + 0 + 0 + 0 + + + 4632 + 1 + 0 + 0 + 0 + + + 4633 + 1 + 0 + 0 + 0 + + + 4634 + 1 + 0 + 0 + 0 + + + 4635 + 1 + 0 + 0 + 0 + + + 4636 + 1 + 0 + 0 + 0 + + + 4637 + 1 + 0 + 0 + 0 + + + 4638 + 1 + 0 + 0 + 0 + + + 4639 + 1 + 0 + 0 + 0 + + + 4640 + 1 + 0 + 0 + 0 + + + 4641 + 1 + 0 + 0 + 0 + + + 4642 + 1 + 0 + 0 + 0 + + + 4643 + 1 + 0 + 0 + 0 + + + 4644 + 1 + 0 + 0 + 0 + + + 4645 + 1 + 0 + 0 + 0 + + + 4646 + 1 + 0 + 0 + 0 + + + 4647 + 1 + 0 + 0 + 0 + + + 4648 + 1 + 0 + 0 + 0 + + + 4649 + 1 + 0 + 0 + 0 + + + 4650 + 1 + 0 + 0 + 0 + + + 4651 + 1 + 0 + 0 + 0 + + + 4652 + 1 + 0 + 0 + 0 + + + 4653 + 250 + 0 + 0 + 0 + + + 4654 + 250 + 0 + 0 + 0 + + + 4655 + 250 + 0 + 0 + 0 + + + 4656 + 250 + 0 + 0 + 0 + + + 4657 + 350 + 0 + 0 + 0 + + + 4658 + 250 + 0 + 0 + 0 + + + 4659 + 250 + 0 + 0 + 0 + + + 4660 + 250 + 0 + 0 + 0 + + + 4661 + 250 + 0 + 0 + 0 + + + 4662 + 250 + 0 + 0 + 0 + + + 4663 + 250 + 0 + 0 + 0 + + + 4664 + 250 + 0 + 0 + 0 + + + 4665 + 250 + 0 + 0 + 0 + + + 4666 + 250 + 0 + 0 + 0 + + + 4667 + 250 + 0 + 0 + 0 + + + 4668 + 10 + 0 + 0 + 0 + + + 4669 + 1 + 0 + 0 + 0 + + + 4670 + 250 + 0 + 0 + 0 + + + 4671 + 250 + 0 + 0 + 0 + + + 4672 + 250 + 0 + 0 + 0 + + + 4673 + 250 + 0 + 0 + 0 + + + 4674 + 250 + 0 + 0 + 0 + + + 4675 + 100000 + 0 + 0 + 0 + + + 4676 + 100000 + 0 + 0 + 0 + + + 4677 + 1 + 0 + 0 + 0 + + + 4678 + 1 + 0 + 0 + 0 + + + 4679 + 1 + 0 + 0 + 0 + + + 4680 + 1 + 0 + 0 + 0 + + + 4681 + 1 + 0 + 0 + 0 + + + 4682 + 1 + 0 + 0 + 0 + + + 4683 + 1 + 0 + 0 + 0 + + + 4684 + 30 + 0 + 0 + 0 + + + 4685 + 1 + 0 + 0 + 0 + + + 4686 + 1 + 0 + 0 + 0 + + + 4687 + 30 + 0 + 0 + 0 + + + 4688 + 1 + 0 + 0 + 0 + + + 4689 + 20 + 0 + 0 + 0 + + + 4690 + 1 + 0 + 0 + 0 + + + 4691 + 1 + 0 + 0 + 0 + + + 4692 + 1 + 0 + 0 + 0 + + + 4693 + 6 + 0 + 0 + 0 + + + 4694 + 20 + 0 + 0 + 0 + + + 4695 + 20 + 0 + 0 + 0 + + + 4696 + 20 + 0 + 0 + 0 + + + 4697 + 20 + 0 + 0 + 0 + + + 4698 + 20 + 0 + 0 + 0 + + + 4699 + 20 + 0 + 0 + 0 + + + 4700 + 600 + 0 + 0 + 0 + + + 4701 + 600 + 0 + 0 + 0 + + + 4702 + 600 + 0 + 0 + 0 + + + 4703 + 1 + 0 + 0 + 0 + + + 4704 + 1 + 0 + 0 + 0 + + + 4705 + 1 + 0 + 0 + 0 + + + 4706 + 1 + 0 + 0 + 0 + + + 4707 + 5 + 0 + 0 + 0 + + + 4708 + 13000 + 0 + 0 + 0 + + + 4709 + 13000 + 0 + 0 + 0 + + + 4710 + 85000 + 0 + 0 + 0 + + + 4711 + 85000 + 0 + 0 + 0 + + + 4712 + 50000 + 0 + 0 + 0 + + + 4713 + 50000 + 0 + 0 + 0 + + + 4714 + 47000 + 0 + 0 + 0 + + + 4715 + 47000 + 0 + 0 + 0 + + + 4716 + 103000 + 0 + 0 + 0 + + + 4717 + 103000 + 0 + 0 + 0 + + + 4718 + 208000 + 0 + 0 + 0 + + + 4719 + 208000 + 0 + 0 + 0 + + + 4720 + 280000 + 0 + 0 + 0 + + + 4721 + 280000 + 0 + 0 + 0 + + + 4722 + 275000 + 0 + 0 + 0 + + + 4723 + 275000 + 0 + 0 + 0 + + + 4724 + 103000 + 0 + 0 + 0 + + + 4725 + 103000 + 0 + 0 + 0 + + + 4726 + 100000 + 0 + 0 + 0 + + + 4727 + 100000 + 0 + 0 + 0 + + + 4728 + 280000 + 0 + 0 + 0 + + + 4729 + 280000 + 0 + 0 + 0 + + + 4730 + 275000 + 0 + 0 + 0 + + + 4731 + 275000 + 0 + 0 + 0 + + + 4732 + 13000 + 0 + 0 + 0 + + + 4733 + 13000 + 0 + 0 + 0 + + + 4734 + 160000 + 0 + 0 + 0 + + + 4735 + 160000 + 0 + 0 + 0 + + + 4736 + 50000 + 0 + 0 + 0 + + + 4737 + 50000 + 0 + 0 + 0 + + + 4738 + 47000 + 0 + 0 + 0 + + + 4739 + 47000 + 0 + 0 + 0 + + + 4740 + 420 + 0 + 0 + 0 + + + 4741 + 1 + 0 + 0 + 0 + + + 4742 + 1 + 0 + 0 + 0 + + + 4743 + 1 + 0 + 0 + 0 + + + 4744 + 1 + 0 + 0 + 0 + + + 4745 + 103000 + 0 + 0 + 0 + + + 4746 + 103000 + 0 + 0 + 0 + + + 4747 + 160000 + 0 + 0 + 0 + + + 4748 + 160000 + 0 + 0 + 0 + + + 4749 + 280000 + 0 + 0 + 0 + + + 4750 + 280000 + 0 + 0 + 0 + + + 4751 + 275000 + 0 + 0 + 0 + + + 4752 + 275000 + 0 + 0 + 0 + + + 4753 + 103000 + 0 + 0 + 0 + + + 4754 + 103000 + 0 + 0 + 0 + + + 4755 + 160000 + 0 + 0 + 0 + + + 4756 + 160000 + 0 + 0 + 0 + + + 4757 + 280000 + 0 + 0 + 0 + + + 4758 + 280000 + 0 + 0 + 0 + + + 4759 + 275000 + 0 + 0 + 0 + + + 4760 + 275000 + 0 + 0 + 0 + + + 4761 + 1 + 0 + 0 + 0 + + + 4762 + 1 + 0 + 0 + 0 + + + 4763 + 1 + 0 + 0 + 0 + + + 4764 + 1 + 0 + 0 + 0 + + + 4765 + 1 + 0 + 0 + 0 + + + 4766 + 1 + 0 + 0 + 0 + + + 4767 + 1 + 0 + 0 + 0 + + + 4768 + 1 + 0 + 0 + 0 + + + 4769 + 1 + 0 + 0 + 0 + + + 4770 + 1 + 0 + 0 + 0 + + + 4771 + 1 + 0 + 0 + 0 + + + 4772 + 1 + 0 + 0 + 0 + + + 4773 + 5 + 0 + 0 + 0 + + + 4774 + 1 + 0 + 0 + 0 + + + 4775 + 1 + 0 + 0 + 0 + + + 4776 + 1 + 0 + 0 + 0 + + + 4777 + 1 + 0 + 0 + 0 + + + 4778 + 10 + 0 + 0 + 0 + + + 4779 + 1 + 0 + 0 + 0 + + + 4780 + 1 + 0 + 0 + 0 + + + 4781 + 1 + 0 + 0 + 0 + + + 4782 + 1 + 0 + 0 + 0 + + + 4783 + 20 + 0 + 0 + 0 + + + 4784 + 1 + 0 + 0 + 0 + + + 4785 + 1 + 0 + 0 + 0 + + + 4786 + 1 + 0 + 0 + 0 + + + 4787 + 1 + 0 + 0 + 0 + + + 4788 + 35 + 0 + 0 + 0 + + + 4789 + 1 + 0 + 0 + 0 + + + 4790 + 1 + 0 + 0 + 0 + + + 4791 + 1 + 0 + 0 + 0 + + + 4792 + 1 + 0 + 0 + 0 + + + 4793 + 50 + 0 + 0 + 0 + + + 4794 + 1 + 0 + 0 + 0 + + + 4795 + 1 + 0 + 0 + 0 + + + 4796 + 1 + 0 + 0 + 0 + + + 4797 + 1 + 0 + 0 + 0 + + + 4798 + 95 + 0 + 0 + 0 + + + 4799 + 1 + 0 + 0 + 0 + + + 4800 + 1 + 0 + 0 + 0 + + + 4801 + 1 + 0 + 0 + 0 + + + 4802 + 1 + 0 + 0 + 0 + + + 4803 + 450 + 0 + 0 + 0 + + + 4804 + 1 + 0 + 0 + 0 + + + 4805 + 1 + 0 + 0 + 0 + + + 4806 + 1 + 0 + 0 + 0 + + + 4807 + 1 + 0 + 0 + 0 + + + 4808 + 1 + 0 + 0 + 0 + + + 4809 + 1 + 0 + 0 + 0 + + + 4810 + 1 + 0 + 0 + 0 + + + 4811 + 1 + 0 + 0 + 0 + + + 4812 + 1 + 0 + 0 + 0 + + + 4813 + 1 + 0 + 0 + 0 + + + 4814 + 1 + 0 + 0 + 0 + + + 4815 + 1 + 0 + 0 + 0 + + + 4816 + 1 + 0 + 0 + 0 + + + 4817 + 1 + 0 + 0 + 0 + + + 4818 + 1 + 0 + 0 + 0 + + + 4819 + 7 + 0 + 0 + 0 + + + 4820 + 33 + 0 + 0 + 0 + + + 4821 + 12 + 0 + 0 + 0 + + + 4822 + 18 + 0 + 0 + 0 + + + 4823 + 45 + 0 + 0 + 0 + + + 4824 + 220 + 0 + 0 + 0 + + + 4825 + 90 + 0 + 0 + 0 + + + 4826 + 90 + 0 + 0 + 0 + + + 4827 + 180 + 0 + 0 + 0 + + + 4828 + 180 + 0 + 0 + 0 + + + 4829 + 1 + 0 + 0 + 0 + + + 4830 + 1 + 0 + 0 + 0 + + + 4831 + 1 + 0 + 0 + 0 + + + 4832 + 1 + 0 + 0 + 0 + + + 4833 + 1 + 0 + 0 + 0 + + + 4834 + 1 + 0 + 0 + 0 + + + 4835 + 1 + 0 + 0 + 0 + + + 4836 + 1 + 0 + 0 + 0 + + + 4837 + 1 + 0 + 0 + 0 + + + 4838 + 10 + 0 + 0 + 0 + + + 4839 + 1 + 0 + 0 + 0 + + + 4840 + 5 + 0 + 0 + 0 + + + 4841 + 5 + 0 + 0 + 0 + + + 4842 + 225 + 0 + 0 + 0 + + + 4843 + 225 + 0 + 0 + 0 + + + 4844 + 200 + 0 + 0 + 0 + + + 4845 + 200 + 0 + 0 + 0 + + + 4846 + 150 + 0 + 0 + 0 + + + 4847 + 150 + 0 + 0 + 0 + + + 4848 + 75 + 0 + 0 + 0 + + + 4849 + 75 + 0 + 0 + 0 + + + 4850 + 100 + 0 + 0 + 0 + + + 4851 + 100 + 0 + 0 + 0 + + + 4852 + 1 + 0 + 0 + 0 + + + 4853 + 1 + 0 + 0 + 0 + + + 4854 + 1 + 0 + 0 + 0 + + + 4855 + 1 + 0 + 0 + 0 + + + 4856 + 13000 + 0 + 0 + 0 + + + 4857 + 13000 + 0 + 0 + 0 + + + 4858 + 13000 + 0 + 0 + 0 + + + 4859 + 13000 + 0 + 0 + 0 + + + 4860 + 13000 + 0 + 0 + 0 + + + 4861 + 13000 + 0 + 0 + 0 + + + 4862 + 85000 + 0 + 0 + 0 + + + 4863 + 85000 + 0 + 0 + 0 + + + 4864 + 85000 + 0 + 0 + 0 + + + 4865 + 85000 + 0 + 0 + 0 + + + 4866 + 85000 + 0 + 0 + 0 + + + 4867 + 85000 + 0 + 0 + 0 + + + 4868 + 50000 + 0 + 0 + 0 + + + 4869 + 50000 + 0 + 0 + 0 + + + 4870 + 50000 + 0 + 0 + 0 + + + 4871 + 50000 + 0 + 0 + 0 + + + 4872 + 50000 + 0 + 0 + 0 + + + 4873 + 50000 + 0 + 0 + 0 + + + 4874 + 47000 + 0 + 0 + 0 + + + 4875 + 47000 + 0 + 0 + 0 + + + 4876 + 47000 + 0 + 0 + 0 + + + 4877 + 47000 + 0 + 0 + 0 + + + 4878 + 47000 + 0 + 0 + 0 + + + 4879 + 47000 + 0 + 0 + 0 + + + 4880 + 103000 + 0 + 0 + 0 + + + 4881 + 103000 + 0 + 0 + 0 + + + 4882 + 103000 + 0 + 0 + 0 + + + 4883 + 103000 + 0 + 0 + 0 + + + 4884 + 103000 + 0 + 0 + 0 + + + 4885 + 103000 + 0 + 0 + 0 + + + 4886 + 208000 + 0 + 0 + 0 + + + 4887 + 208000 + 0 + 0 + 0 + + + 4888 + 208000 + 0 + 0 + 0 + + + 4889 + 208000 + 0 + 0 + 0 + + + 4890 + 208000 + 0 + 0 + 0 + + + 4891 + 208000 + 0 + 0 + 0 + + + 4892 + 280000 + 0 + 0 + 0 + + + 4893 + 280000 + 0 + 0 + 0 + + + 4894 + 280000 + 0 + 0 + 0 + + + 4895 + 280000 + 0 + 0 + 0 + + + 4896 + 280000 + 0 + 0 + 0 + + + 4897 + 280000 + 0 + 0 + 0 + + + 4898 + 275000 + 0 + 0 + 0 + + + 4899 + 275000 + 0 + 0 + 0 + + + 4900 + 275000 + 0 + 0 + 0 + + + 4901 + 275000 + 0 + 0 + 0 + + + 4902 + 275000 + 0 + 0 + 0 + + + 4903 + 275000 + 0 + 0 + 0 + + + 4904 + 103000 + 0 + 0 + 0 + + + 4905 + 103000 + 0 + 0 + 0 + + + 4906 + 103000 + 0 + 0 + 0 + + + 4907 + 103000 + 0 + 0 + 0 + + + 4908 + 103000 + 0 + 0 + 0 + + + 4909 + 103000 + 0 + 0 + 0 + + + 4910 + 100000 + 0 + 0 + 0 + + + 4911 + 100000 + 0 + 0 + 0 + + + 4912 + 100000 + 0 + 0 + 0 + + + 4913 + 100000 + 0 + 0 + 0 + + + 4914 + 100000 + 0 + 0 + 0 + + + 4915 + 100000 + 0 + 0 + 0 + + + 4916 + 280000 + 0 + 0 + 0 + + + 4917 + 280000 + 0 + 0 + 0 + + + 4918 + 280000 + 0 + 0 + 0 + + + 4919 + 280000 + 0 + 0 + 0 + + + 4920 + 280000 + 0 + 0 + 0 + + + 4921 + 280000 + 0 + 0 + 0 + + + 4922 + 275000 + 0 + 0 + 0 + + + 4923 + 275000 + 0 + 0 + 0 + + + 4924 + 275000 + 0 + 0 + 0 + + + 4925 + 275000 + 0 + 0 + 0 + + + 4926 + 275000 + 0 + 0 + 0 + + + 4927 + 275000 + 0 + 0 + 0 + + + 4928 + 13000 + 0 + 0 + 0 + + + 4929 + 13000 + 0 + 0 + 0 + + + 4930 + 13000 + 0 + 0 + 0 + + + 4931 + 13000 + 0 + 0 + 0 + + + 4932 + 13000 + 0 + 0 + 0 + + + 4933 + 13000 + 0 + 0 + 0 + + + 4934 + 160000 + 0 + 0 + 0 + + + 4935 + 160000 + 0 + 0 + 0 + + + 4936 + 160000 + 0 + 0 + 0 + + + 4937 + 160000 + 0 + 0 + 0 + + + 4938 + 160000 + 0 + 0 + 0 + + + 4939 + 160000 + 0 + 0 + 0 + + + 4940 + 50000 + 0 + 0 + 0 + + + 4941 + 50000 + 0 + 0 + 0 + + + 4942 + 50000 + 0 + 0 + 0 + + + 4943 + 50000 + 0 + 0 + 0 + + + 4944 + 50000 + 0 + 0 + 0 + + + 4945 + 50000 + 0 + 0 + 0 + + + 4946 + 47000 + 0 + 0 + 0 + + + 4947 + 47000 + 0 + 0 + 0 + + + 4948 + 47000 + 0 + 0 + 0 + + + 4949 + 47000 + 0 + 0 + 0 + + + 4950 + 47000 + 0 + 0 + 0 + + + 4951 + 47000 + 0 + 0 + 0 + + + 4952 + 103000 + 0 + 0 + 0 + + + 4953 + 103000 + 0 + 0 + 0 + + + 4954 + 103000 + 0 + 0 + 0 + + + 4955 + 103000 + 0 + 0 + 0 + + + 4956 + 103000 + 0 + 0 + 0 + + + 4957 + 103000 + 0 + 0 + 0 + + + 4958 + 160000 + 0 + 0 + 0 + + + 4959 + 160000 + 0 + 0 + 0 + + + 4960 + 160000 + 0 + 0 + 0 + + + 4961 + 160000 + 0 + 0 + 0 + + + 4962 + 160000 + 0 + 0 + 0 + + + 4963 + 160000 + 0 + 0 + 0 + + + 4964 + 280000 + 0 + 0 + 0 + + + 4965 + 280000 + 0 + 0 + 0 + + + 4966 + 280000 + 0 + 0 + 0 + + + 4967 + 280000 + 0 + 0 + 0 + + + 4968 + 280000 + 0 + 0 + 0 + + + 4969 + 280000 + 0 + 0 + 0 + + + 4970 + 275000 + 0 + 0 + 0 + + + 4971 + 275000 + 0 + 0 + 0 + + + 4972 + 275000 + 0 + 0 + 0 + + + 4973 + 275000 + 0 + 0 + 0 + + + 4974 + 275000 + 0 + 0 + 0 + + + 4975 + 275000 + 0 + 0 + 0 + + + 4976 + 103000 + 0 + 0 + 0 + + + 4977 + 103000 + 0 + 0 + 0 + + + 4978 + 103000 + 0 + 0 + 0 + + + 4979 + 103000 + 0 + 0 + 0 + + + 4980 + 103000 + 0 + 0 + 0 + + + 4981 + 103000 + 0 + 0 + 0 + + + 4982 + 160000 + 0 + 0 + 0 + + + 4983 + 160000 + 0 + 0 + 0 + + + 4984 + 160000 + 0 + 0 + 0 + + + 4985 + 160000 + 0 + 0 + 0 + + + 4986 + 160000 + 0 + 0 + 0 + + + 4987 + 160000 + 0 + 0 + 0 + + + 4988 + 280000 + 0 + 0 + 0 + + + 4989 + 280000 + 0 + 0 + 0 + + + 4990 + 280000 + 0 + 0 + 0 + + + 4991 + 280000 + 0 + 0 + 0 + + + 4992 + 280000 + 0 + 0 + 0 + + + 4993 + 280000 + 0 + 0 + 0 + + + 4994 + 275000 + 0 + 0 + 0 + + + 4995 + 275000 + 0 + 0 + 0 + + + 4996 + 275000 + 0 + 0 + 0 + + + 4997 + 275000 + 0 + 0 + 0 + + + 4998 + 275000 + 0 + 0 + 0 + + + 4999 + 275000 + 0 + 0 + 0 + + + 5000 + 1 + 0 + 0 + 0 + + + 5001 + 15 + 0 + 0 + 0 + + + 5002 + 1 + 0 + 0 + 0 + + + 5003 + 15 + 0 + 0 + 0 + + + 5004 + 5 + 0 + 0 + 0 + + + 5005 + 15 + 0 + 0 + 0 + + + 5006 + 1 + 0 + 0 + 0 + + + 5007 + 15 + 0 + 0 + 0 + + + 5008 + 1 + 0 + 0 + 0 + + + 5009 + 1 + 0 + 0 + 0 + + + 5010 + 1 + 0 + 0 + 0 + + + 5011 + 1 + 0 + 0 + 0 + + + 5012 + 1 + 0 + 0 + 0 + + + 5013 + 600 + 0 + 0 + 0 + + + 5014 + 900 + 0 + 0 + 0 + + + 5015 + 900 + 0 + 0 + 0 + + + 5016 + 600 + 0 + 0 + 0 + + + 5017 + 600 + 0 + 0 + 0 + + + 5018 + 600 + 0 + 0 + 0 + + + 5019 + 600 + 0 + 0 + 0 + + + 5020 + 1 + 0 + 0 + 0 + + + 5021 + 1 + 0 + 0 + 0 + + + 5022 + 1 + 0 + 0 + 0 + + + 5023 + 1 + 0 + 0 + 0 + + + 5024 + 650 + 0 + 0 + 0 + + + 5025 + 650 + 0 + 0 + 0 + + + 5026 + 812 + 0 + 0 + 0 + + + 5027 + 812 + 0 + 0 + 0 + + + 5028 + 845 + 0 + 0 + 0 + + + 5029 + 845 + 0 + 0 + 0 + + + 5030 + 585 + 0 + 0 + 0 + + + 5031 + 585 + 0 + 0 + 0 + + + 5032 + 780 + 0 + 0 + 0 + + + 5033 + 780 + 0 + 0 + 0 + + + 5034 + 812 + 0 + 0 + 0 + + + 5035 + 812 + 0 + 0 + 0 + + + 5036 + 715 + 0 + 0 + 0 + + + 5037 + 715 + 0 + 0 + 0 + + + 5038 + 910 + 0 + 0 + 0 + + + 5039 + 910 + 0 + 0 + 0 + + + 5040 + 975 + 0 + 0 + 0 + + + 5041 + 975 + 0 + 0 + 0 + + + 5042 + 364 + 0 + 0 + 0 + + + 5043 + 364 + 0 + 0 + 0 + + + 5044 + 468 + 0 + 0 + 0 + + + 5045 + 468 + 0 + 0 + 0 + + + 5046 + 507 + 0 + 0 + 0 + + + 5047 + 507 + 0 + 0 + 0 + + + 5048 + 455 + 0 + 0 + 0 + + + 5049 + 455 + 0 + 0 + 0 + + + 5050 + 715 + 0 + 0 + 0 + + + 5051 + 715 + 0 + 0 + 0 + + + 5052 + 812 + 0 + 0 + 0 + + + 5053 + 812 + 0 + 0 + 0 + + + 5054 + 1 + 0 + 0 + 0 + + + 5055 + 1 + 0 + 0 + 0 + + + 5056 + 1 + 0 + 0 + 0 + + + 5057 + 1 + 0 + 0 + 0 + + + 5058 + 1 + 0 + 0 + 0 + + + 5059 + 1 + 0 + 0 + 0 + + + 5060 + 1 + 0 + 0 + 0 + + + 5061 + 1 + 0 + 0 + 0 + + + 5062 + 1 + 0 + 0 + 0 + + + 5063 + 1 + 0 + 0 + 0 + + + 5064 + 1 + 0 + 0 + 0 + + + 5065 + 1 + 0 + 0 + 0 + + + 5066 + 1 + 0 + 0 + 0 + + + 5067 + 1 + 0 + 0 + 0 + + + 5068 + 1 + 0 + 0 + 0 + + + 5069 + 1 + 0 + 0 + 0 + + + 5070 + 1 + 0 + 0 + 0 + + + 5071 + 1 + 0 + 0 + 0 + + + 5072 + 1 + 0 + 0 + 0 + + + 5073 + 1 + 0 + 0 + 0 + + + 5074 + 1 + 0 + 0 + 0 + + + 5075 + 1 + 0 + 0 + 0 + + + 5076 + 1 + 0 + 0 + 0 + + + 5077 + 1 + 0 + 0 + 0 + + + 5078 + 1 + 0 + 0 + 0 + + + 5079 + 1 + 0 + 0 + 0 + + + 5080 + 1 + 0 + 0 + 0 + + + 5081 + 1 + 0 + 0 + 0 + + + 5082 + 1 + 0 + 0 + 0 + + + 5083 + 1 + 0 + 0 + 0 + + + 5084 + 1 + 0 + 0 + 0 + + + 5085 + 1 + 0 + 0 + 0 + + + 5086 + 1 + 0 + 0 + 0 + + + 5087 + 1 + 0 + 0 + 0 + + + 5088 + 1 + 0 + 0 + 0 + + + 5089 + 1 + 0 + 0 + 0 + + + 5090 + 1 + 0 + 0 + 0 + + + 5091 + 1 + 0 + 0 + 0 + + + 5092 + 1 + 0 + 0 + 0 + + + 5093 + 1 + 0 + 0 + 0 + + + 5094 + 1 + 0 + 0 + 0 + + + 5095 + 1 + 0 + 0 + 0 + + + 5096 + 84 + 0 + 0 + 0 + + + 5097 + 98 + 0 + 0 + 0 + + + 5098 + 11 + 0 + 0 + 0 + + + 5099 + 11 + 0 + 0 + 0 + + + 5100 + 12 + 0 + 0 + 0 + + + 5101 + 4 + 0 + 0 + 0 + + + 5102 + 9 + 0 + 0 + 0 + + + 5103 + 25 + 0 + 0 + 0 + + + 5104 + 60 + 0 + 0 + 0 + + + 5105 + 133 + 0 + 0 + 0 + + + 5106 + 166 + 0 + 0 + 0 + + + 5107 + 1 + 0 + 0 + 0 + + + 5108 + 1 + 0 + 0 + 0 + + + 5109 + 1 + 0 + 0 + 0 + + + 5110 + 1 + 0 + 0 + 0 + + + 5111 + 1 + 0 + 0 + 0 + + + 5112 + 1 + 0 + 0 + 0 + + + 5113 + 1 + 0 + 0 + 0 + + + 5114 + 1 + 0 + 0 + 0 + + + 5115 + 1 + 0 + 0 + 0 + + + 5116 + 1 + 0 + 0 + 0 + + + 5117 + 1 + 0 + 0 + 0 + + + 5118 + 1 + 0 + 0 + 0 + + + 5119 + 1 + 0 + 0 + 0 + + + 5120 + 1 + 0 + 0 + 0 + + + 5121 + 1 + 0 + 0 + 0 + + + 5122 + 1 + 0 + 0 + 0 + + + 5123 + 1 + 0 + 0 + 0 + + + 5124 + 1 + 0 + 0 + 0 + + + 5125 + 1 + 0 + 0 + 0 + + + 5126 + 1 + 0 + 0 + 0 + + + 5127 + 1 + 0 + 0 + 0 + + + 5128 + 1 + 0 + 0 + 0 + + + 5129 + 1 + 0 + 0 + 0 + + + 5130 + 1 + 0 + 0 + 0 + + + 5131 + 1 + 0 + 0 + 0 + + + 5132 + 1 + 0 + 0 + 0 + + + 5133 + 1 + 0 + 0 + 0 + + + 5134 + 1 + 0 + 0 + 0 + + + 5135 + 1 + 0 + 0 + 0 + + + 5136 + 1 + 0 + 0 + 0 + + + 5137 + 1 + 0 + 0 + 0 + + + 5138 + 1 + 0 + 0 + 0 + + + 5139 + 1 + 0 + 0 + 0 + + + 5140 + 1 + 0 + 0 + 0 + + + 5141 + 1 + 0 + 0 + 0 + + + 5142 + 1 + 0 + 0 + 0 + + + 5143 + 1 + 0 + 0 + 0 + + + 5144 + 1 + 0 + 0 + 0 + + + 5145 + 1 + 0 + 0 + 0 + + + 5146 + 1 + 0 + 0 + 0 + + + 5147 + 1 + 0 + 0 + 0 + + + 5148 + 1 + 0 + 0 + 0 + + + 5149 + 1 + 0 + 0 + 0 + + + 5150 + 1 + 0 + 0 + 0 + + + 5151 + 1 + 0 + 0 + 0 + + + 5152 + 1 + 0 + 0 + 0 + + + 5153 + 1 + 0 + 0 + 0 + + + 5154 + 1 + 0 + 0 + 0 + + + 5155 + 1 + 0 + 0 + 0 + + + 5156 + 1 + 0 + 0 + 0 + + + 5157 + 1 + 0 + 0 + 0 + + + 5158 + 1 + 0 + 0 + 0 + + + 5159 + 1 + 0 + 0 + 0 + + + 5160 + 1 + 0 + 0 + 0 + + + 5161 + 1 + 0 + 0 + 0 + + + 5162 + 1 + 0 + 0 + 0 + + + 5163 + 1 + 0 + 0 + 0 + + + 5164 + 1 + 0 + 0 + 0 + + + 5165 + 1 + 0 + 0 + 0 + + + 5166 + 1 + 0 + 0 + 0 + + + 5167 + 1 + 0 + 0 + 0 + + + 5168 + 1 + 0 + 0 + 0 + + + 5169 + 1 + 0 + 0 + 0 + + + 5170 + 1 + 0 + 0 + 0 + + + 5171 + 1 + 0 + 0 + 0 + + + 5172 + 1 + 0 + 0 + 0 + + + 5173 + 1 + 0 + 0 + 0 + + + 5174 + 1 + 0 + 0 + 0 + + + 5175 + 1 + 0 + 0 + 0 + + + 5176 + 1 + 0 + 0 + 0 + + + 5177 + 1 + 0 + 0 + 0 + + + 5178 + 1 + 0 + 0 + 0 + + + 5179 + 1 + 0 + 0 + 0 + + + 5180 + 1 + 0 + 0 + 0 + + + 5181 + 1 + 0 + 0 + 0 + + + 5182 + 1 + 0 + 0 + 0 + + + 5183 + 1 + 0 + 0 + 0 + + + 5184 + 1 + 0 + 0 + 0 + + + 5185 + 1 + 0 + 0 + 0 + + + 5186 + 1 + 0 + 0 + 0 + + + 5187 + 1 + 0 + 0 + 0 + + + 5188 + 1 + 0 + 0 + 0 + + + 5189 + 1 + 0 + 0 + 0 + + + 5190 + 1 + 0 + 0 + 0 + + + 5191 + 1 + 0 + 0 + 0 + + + 5192 + 1 + 0 + 0 + 0 + + + 5193 + 1 + 0 + 0 + 0 + + + 5194 + 1 + 0 + 0 + 0 + + + 5195 + 1 + 0 + 0 + 0 + + + 5196 + 1 + 0 + 0 + 0 + + + 5197 + 1 + 0 + 0 + 0 + + + 5198 + 1 + 0 + 0 + 0 + + + 5199 + 1 + 0 + 0 + 0 + + + 5200 + 1 + 0 + 0 + 0 + + + 5201 + 1 + 0 + 0 + 0 + + + 5202 + 1 + 0 + 0 + 0 + + + 5203 + 1 + 0 + 0 + 0 + + + 5204 + 1 + 0 + 0 + 0 + + + 5205 + 1 + 0 + 0 + 0 + + + 5206 + 1 + 0 + 0 + 0 + + + 5207 + 1 + 0 + 0 + 0 + + + 5208 + 1 + 0 + 0 + 0 + + + 5209 + 1 + 0 + 0 + 0 + + + 5210 + 1 + 0 + 0 + 0 + + + 5211 + 1 + 0 + 0 + 0 + + + 5212 + 1 + 0 + 0 + 0 + + + 5213 + 1 + 0 + 0 + 0 + + + 5214 + 1 + 0 + 0 + 0 + + + 5215 + 1 + 0 + 0 + 0 + + + 5216 + 1 + 0 + 0 + 0 + + + 5217 + 1 + 0 + 0 + 0 + + + 5218 + 1 + 0 + 0 + 0 + + + 5219 + 1 + 0 + 0 + 0 + + + 5220 + 1 + 0 + 0 + 0 + + + 5221 + 1 + 0 + 0 + 0 + + + 5222 + 1 + 0 + 0 + 0 + + + 5223 + 1 + 0 + 0 + 0 + + + 5224 + 1 + 0 + 0 + 0 + + + 5225 + 1 + 0 + 0 + 0 + + + 5226 + 1 + 0 + 0 + 0 + + + 5227 + 1 + 0 + 0 + 0 + + + 5228 + 1 + 0 + 0 + 0 + + + 5229 + 1 + 0 + 0 + 0 + + + 5230 + 1 + 0 + 0 + 0 + + + 5231 + 1 + 0 + 0 + 0 + + + 5232 + 1 + 0 + 0 + 0 + + + 5233 + 1 + 0 + 0 + 0 + + + 5234 + 1 + 0 + 0 + 0 + + + 5235 + 1 + 0 + 0 + 0 + + + 5236 + 1 + 0 + 0 + 0 + + + 5237 + 1 + 0 + 0 + 0 + + + 5238 + 1 + 0 + 0 + 0 + + + 5239 + 1 + 0 + 0 + 0 + + + 5240 + 1 + 0 + 0 + 0 + + + 5241 + 1 + 0 + 0 + 0 + + + 5242 + 1 + 0 + 0 + 0 + + + 5243 + 1 + 0 + 0 + 0 + + + 5244 + 1 + 0 + 0 + 0 + + + 5245 + 1 + 0 + 0 + 0 + + + 5246 + 1 + 0 + 0 + 0 + + + 5247 + 1 + 0 + 0 + 0 + + + 5248 + 1 + 0 + 0 + 0 + + + 5249 + 1 + 0 + 0 + 0 + + + 5250 + 1 + 0 + 0 + 0 + + + 5251 + 1 + 0 + 0 + 0 + + + 5252 + 1 + 0 + 0 + 0 + + + 5253 + 1 + 0 + 0 + 0 + + + 5254 + 1 + 0 + 0 + 0 + + + 5255 + 1 + 0 + 0 + 0 + + + 5256 + 1 + 0 + 0 + 0 + + + 5257 + 1 + 0 + 0 + 0 + + + 5258 + 1 + 0 + 0 + 0 + + + 5259 + 1 + 0 + 0 + 0 + + + 5260 + 1 + 0 + 0 + 0 + + + 5261 + 1 + 0 + 0 + 0 + + + 5262 + 1 + 0 + 0 + 0 + + + 5263 + 1 + 0 + 0 + 0 + + + 5264 + 1 + 0 + 0 + 0 + + + 5265 + 1 + 0 + 0 + 0 + + + 5266 + 1 + 0 + 0 + 0 + + + 5267 + 1 + 0 + 0 + 0 + + + 5268 + 1 + 0 + 0 + 0 + + + 5269 + 1 + 0 + 0 + 0 + + + 5270 + 1 + 0 + 0 + 0 + + + 5271 + 1 + 0 + 0 + 0 + + + 5272 + 1 + 0 + 0 + 0 + + + 5273 + 1 + 0 + 0 + 0 + + + 5274 + 1 + 0 + 0 + 0 + + + 5275 + 1 + 0 + 0 + 0 + + + 5276 + 1 + 0 + 0 + 0 + + + 5277 + 1 + 0 + 0 + 0 + + + 5278 + 1 + 0 + 0 + 0 + + + 5279 + 1 + 0 + 0 + 0 + + + 5280 + 99 + 0 + 0 + 0 + + + 5281 + 177 + 0 + 0 + 0 + + + 5282 + 86 + 0 + 0 + 0 + + + 5283 + 13 + 0 + 0 + 0 + + + 5284 + 20 + 0 + 0 + 0 + + + 5285 + 31 + 0 + 0 + 0 + + + 5286 + 39 + 0 + 0 + 0 + + + 5287 + 74 + 0 + 0 + 0 + + + 5288 + 115 + 0 + 0 + 0 + + + 5289 + 254 + 0 + 0 + 0 + + + 5290 + 340 + 0 + 0 + 0 + + + 5291 + 4 + 0 + 0 + 0 + + + 5292 + 5 + 0 + 0 + 0 + + + 5293 + 7 + 0 + 0 + 0 + + + 5294 + 12 + 0 + 0 + 0 + + + 5295 + 19 + 0 + 0 + 0 + + + 5296 + 34 + 0 + 0 + 0 + + + 5297 + 64 + 0 + 0 + 0 + + + 5298 + 64 + 0 + 0 + 0 + + + 5299 + 64 + 0 + 0 + 0 + + + 5300 + 64 + 0 + 0 + 0 + + + 5301 + 64 + 0 + 0 + 0 + + + 5302 + 64 + 0 + 0 + 0 + + + 5303 + 64 + 0 + 0 + 0 + + + 5304 + 64 + 0 + 0 + 0 + + + 5305 + 38 + 0 + 0 + 0 + + + 5306 + 86 + 0 + 0 + 0 + + + 5307 + 52 + 0 + 0 + 0 + + + 5308 + 60 + 0 + 0 + 0 + + + 5309 + 210 + 0 + 0 + 0 + + + 5310 + 8 + 0 + 0 + 0 + + + 5311 + 14 + 0 + 0 + 0 + + + 5312 + 6 + 0 + 0 + 0 + + + 5313 + 16 + 0 + 0 + 0 + + + 5314 + 48 + 0 + 0 + 0 + + + 5315 + 143 + 0 + 0 + 0 + + + 5316 + 422 + 0 + 0 + 0 + + + 5317 + 1 + 0 + 0 + 0 + + + 5318 + 8 + 0 + 0 + 0 + + + 5319 + 10 + 0 + 0 + 0 + + + 5320 + 8 + 0 + 0 + 0 + + + 5321 + 56 + 0 + 0 + 0 + + + 5322 + 4 + 0 + 0 + 0 + + + 5323 + 18 + 0 + 0 + 0 + + + 5324 + 25 + 0 + 0 + 0 + + + 5325 + 12 + 0 + 0 + 0 + + + 5326 + 12 + 0 + 0 + 0 + + + 5327 + 1 + 0 + 0 + 0 + + + 5328 + 1 + 0 + 0 + 0 + + + 5329 + 5 + 0 + 0 + 0 + + + 5330 + 5 + 0 + 0 + 0 + + + 5331 + 8 + 0 + 0 + 0 + + + 5332 + 8 + 0 + 0 + 0 + + + 5333 + 1 + 0 + 0 + 0 + + + 5334 + 1 + 0 + 0 + 0 + + + 5335 + 1 + 0 + 0 + 0 + + + 5336 + 1 + 0 + 0 + 0 + + + 5337 + 1 + 0 + 0 + 0 + + + 5338 + 1 + 0 + 0 + 0 + + + 5339 + 1 + 0 + 0 + 0 + + + 5340 + 1 + 0 + 0 + 0 + + + 5341 + 6 + 0 + 0 + 0 + + + 5342 + 6 + 0 + 0 + 0 + + + 5343 + 6 + 0 + 0 + 0 + + + 5344 + 6 + 0 + 0 + 0 + + + 5345 + 25 + 0 + 0 + 0 + + + 5346 + 25 + 0 + 0 + 0 + + + 5347 + 1 + 0 + 0 + 0 + + + 5348 + 1 + 0 + 0 + 0 + + + 5349 + 1 + 0 + 0 + 0 + + + 5350 + 1 + 0 + 0 + 0 + + + 5351 + 1 + 0 + 0 + 0 + + + 5352 + 1 + 0 + 0 + 0 + + + 5353 + 1 + 0 + 0 + 0 + + + 5354 + 1 + 0 + 0 + 0 + + + 5355 + 1 + 0 + 0 + 0 + + + 5356 + 1 + 0 + 0 + 0 + + + 5357 + 1 + 0 + 0 + 0 + + + 5358 + 1 + 0 + 0 + 0 + + + 5359 + 1 + 0 + 0 + 0 + + + 5360 + 1 + 0 + 0 + 0 + + + 5361 + 1 + 0 + 0 + 0 + + + 5362 + 1 + 0 + 0 + 0 + + + 5363 + 1 + 0 + 0 + 0 + + + 5364 + 1 + 0 + 0 + 0 + + + 5365 + 1 + 0 + 0 + 0 + + + 5366 + 1 + 0 + 0 + 0 + + + 5367 + 1 + 0 + 0 + 0 + + + 5368 + 1 + 0 + 0 + 0 + + + 5369 + 1 + 0 + 0 + 0 + + + 5370 + 1 + 0 + 0 + 0 + + + 5371 + 1 + 0 + 0 + 0 + + + 5372 + 1 + 0 + 0 + 0 + + + 5373 + 1 + 0 + 0 + 0 + + + 5374 + 1 + 0 + 0 + 0 + + + 5375 + 1 + 0 + 0 + 0 + + + 5376 + 1 + 0 + 0 + 0 + + + 5377 + 1 + 0 + 0 + 0 + + + 5378 + 1 + 0 + 0 + 0 + + + 5379 + 1 + 0 + 0 + 0 + + + 5380 + 1 + 0 + 0 + 0 + + + 5381 + 1 + 0 + 0 + 0 + + + 5382 + 1 + 0 + 0 + 0 + + + 5383 + 1 + 0 + 0 + 0 + + + 5384 + 1 + 0 + 0 + 0 + + + 5385 + 1 + 0 + 0 + 0 + + + 5386 + 1 + 0 + 0 + 0 + + + 5387 + 1 + 0 + 0 + 0 + + + 5388 + 1 + 0 + 0 + 0 + + + 5389 + 1 + 0 + 0 + 0 + + + 5390 + 1 + 0 + 0 + 0 + + + 5391 + 1 + 0 + 0 + 0 + + + 5392 + 1 + 0 + 0 + 0 + + + 5393 + 1 + 0 + 0 + 0 + + + 5394 + 1 + 0 + 0 + 0 + + + 5395 + 1 + 0 + 0 + 0 + + + 5396 + 1 + 0 + 0 + 0 + + + 5397 + 1 + 0 + 0 + 0 + + + 5398 + 1 + 0 + 0 + 0 + + + 5399 + 1 + 0 + 0 + 0 + + + 5400 + 1 + 0 + 0 + 0 + + + 5401 + 1 + 0 + 0 + 0 + + + 5402 + 1 + 0 + 0 + 0 + + + 5403 + 1 + 0 + 0 + 0 + + + 5404 + 1 + 0 + 0 + 0 + + + 5405 + 1 + 0 + 0 + 0 + + + 5406 + 1 + 0 + 0 + 0 + + + 5407 + 1 + 0 + 0 + 0 + + + 5408 + 1 + 0 + 0 + 0 + + + 5409 + 1 + 0 + 0 + 0 + + + 5410 + 1 + 0 + 0 + 0 + + + 5411 + 1 + 0 + 0 + 0 + + + 5412 + 1 + 0 + 0 + 0 + + + 5413 + 1 + 0 + 0 + 0 + + + 5414 + 1 + 0 + 0 + 0 + + + 5415 + 1 + 0 + 0 + 0 + + + 5416 + 1 + 0 + 0 + 0 + + + 5417 + 1 + 0 + 0 + 0 + + + 5418 + 1 + 0 + 0 + 0 + + + 5419 + 1 + 0 + 0 + 0 + + + 5420 + 1 + 0 + 0 + 0 + + + 5421 + 1 + 0 + 0 + 0 + + + 5422 + 1 + 0 + 0 + 0 + + + 5423 + 1 + 0 + 0 + 0 + + + 5424 + 1 + 0 + 0 + 0 + + + 5425 + 1 + 0 + 0 + 0 + + + 5426 + 1 + 0 + 0 + 0 + + + 5427 + 1 + 0 + 0 + 0 + + + 5428 + 1 + 0 + 0 + 0 + + + 5429 + 1 + 0 + 0 + 0 + + + 5430 + 1 + 0 + 0 + 0 + + + 5431 + 1 + 0 + 0 + 0 + + + 5432 + 1 + 0 + 0 + 0 + + + 5433 + 1 + 0 + 0 + 0 + + + 5434 + 1 + 0 + 0 + 0 + + + 5435 + 1 + 0 + 0 + 0 + + + 5436 + 1 + 0 + 0 + 0 + + + 5437 + 1 + 0 + 0 + 0 + + + 5438 + 1 + 0 + 0 + 0 + + + 5439 + 1 + 0 + 0 + 0 + + + 5440 + 1 + 0 + 0 + 0 + + + 5441 + 1 + 0 + 0 + 0 + + + 5442 + 1 + 0 + 0 + 0 + + + 5443 + 1 + 0 + 0 + 0 + + + 5444 + 1 + 0 + 0 + 0 + + + 5445 + 1 + 0 + 0 + 0 + + + 5446 + 1 + 0 + 0 + 0 + + + 5447 + 1 + 0 + 0 + 0 + + + 5448 + 1 + 0 + 0 + 0 + + + 5449 + 1 + 0 + 0 + 0 + + + 5450 + 1 + 0 + 0 + 0 + + + 5451 + 1 + 0 + 0 + 0 + + + 5452 + 1 + 0 + 0 + 0 + + + 5453 + 1 + 0 + 0 + 0 + + + 5454 + 1 + 0 + 0 + 0 + + + 5455 + 1 + 0 + 0 + 0 + + + 5456 + 1 + 0 + 0 + 0 + + + 5457 + 1 + 0 + 0 + 0 + + + 5458 + 1 + 0 + 0 + 0 + + + 5459 + 1 + 0 + 0 + 0 + + + 5460 + 1 + 0 + 0 + 0 + + + 5461 + 1 + 0 + 0 + 0 + + + 5462 + 1 + 0 + 0 + 0 + + + 5463 + 1 + 0 + 0 + 0 + + + 5464 + 1 + 0 + 0 + 0 + + + 5465 + 1 + 0 + 0 + 0 + + + 5466 + 1 + 0 + 0 + 0 + + + 5467 + 1 + 0 + 0 + 0 + + + 5468 + 1 + 0 + 0 + 0 + + + 5469 + 1 + 0 + 0 + 0 + + + 5470 + 1 + 0 + 0 + 0 + + + 5471 + 1 + 0 + 0 + 0 + + + 5472 + 1 + 0 + 0 + 0 + + + 5473 + 1 + 0 + 0 + 0 + + + 5474 + 1 + 0 + 0 + 0 + + + 5475 + 1 + 0 + 0 + 0 + + + 5476 + 1 + 0 + 0 + 0 + + + 5477 + 1 + 0 + 0 + 0 + + + 5478 + 1 + 0 + 0 + 0 + + + 5479 + 1 + 0 + 0 + 0 + + + 5480 + 1 + 0 + 0 + 0 + + + 5481 + 1 + 0 + 0 + 0 + + + 5482 + 1 + 0 + 0 + 0 + + + 5483 + 1 + 0 + 0 + 0 + + + 5484 + 1 + 0 + 0 + 0 + + + 5485 + 1 + 0 + 0 + 0 + + + 5486 + 1 + 0 + 0 + 0 + + + 5487 + 1 + 0 + 0 + 0 + + + 5488 + 1 + 0 + 0 + 0 + + + 5489 + 1 + 0 + 0 + 0 + + + 5490 + 1 + 0 + 0 + 0 + + + 5491 + 1 + 0 + 0 + 0 + + + 5492 + 1 + 0 + 0 + 0 + + + 5493 + 1 + 0 + 0 + 0 + + + 5494 + 1 + 0 + 0 + 0 + + + 5495 + 1 + 0 + 0 + 0 + + + 5496 + 1 + 0 + 0 + 0 + + + 5497 + 1 + 0 + 0 + 0 + + + 5498 + 1 + 0 + 0 + 0 + + + 5499 + 1 + 0 + 0 + 0 + + + 5500 + 1 + 0 + 0 + 0 + + + 5501 + 1 + 0 + 0 + 0 + + + 5502 + 1 + 0 + 0 + 0 + + + 5503 + 1 + 0 + 0 + 0 + + + 5504 + 17 + 0 + 0 + 0 + + + 5505 + 17 + 0 + 0 + 0 + + + 5506 + 1 + 0 + 0 + 0 + + + 5507 + 1 + 0 + 0 + 0 + + + 5508 + 1 + 0 + 0 + 0 + + + 5509 + 150 + 0 + 0 + 0 + + + 5510 + 300 + 0 + 0 + 0 + + + 5511 + 300 + 0 + 0 + 0 + + + 5512 + 600 + 0 + 0 + 0 + + + 5513 + 600 + 0 + 0 + 0 + + + 5514 + 1200 + 0 + 0 + 0 + + + 5515 + 1200 + 0 + 0 + 0 + + + 5516 + 500 + 0 + 0 + 0 + + + 5517 + 500 + 0 + 0 + 0 + + + 5518 + 1 + 0 + 0 + 0 + + + 5519 + 1 + 0 + 0 + 0 + + + 5520 + 10 + 0 + 0 + 0 + + + 5521 + 1425 + 0 + 0 + 0 + + + 5522 + 1425 + 0 + 0 + 0 + + + 5523 + 100 + 0 + 0 + 0 + + + 5524 + 100 + 0 + 0 + 0 + + + 5525 + 100 + 0 + 0 + 0 + + + 5526 + 100 + 0 + 0 + 0 + + + 5527 + 100 + 0 + 0 + 0 + + + 5528 + 100 + 0 + 0 + 0 + + + 5529 + 100 + 0 + 0 + 0 + + + 5530 + 100 + 0 + 0 + 0 + + + 5531 + 100 + 0 + 0 + 0 + + + 5532 + 100 + 0 + 0 + 0 + + + 5533 + 100 + 0 + 0 + 0 + + + 5534 + 100 + 0 + 0 + 0 + + + 5535 + 100 + 0 + 0 + 0 + + + 5536 + 100 + 0 + 0 + 0 + + + 5537 + 100 + 0 + 0 + 0 + + + 5538 + 100 + 0 + 0 + 0 + + + 5539 + 100 + 0 + 0 + 0 + + + 5540 + 100 + 0 + 0 + 0 + + + 5541 + 100 + 0 + 0 + 0 + + + 5542 + 100 + 0 + 0 + 0 + + + 5543 + 100 + 0 + 0 + 0 + + + 5544 + 100 + 0 + 0 + 0 + + + 5545 + 100 + 0 + 0 + 0 + + + 5546 + 100 + 0 + 0 + 0 + + + 5547 + 100 + 0 + 0 + 0 + + + 5548 + 100 + 0 + 0 + 0 + + + 5549 + 100 + 0 + 0 + 0 + + + 5550 + 100 + 0 + 0 + 0 + + + 5551 + 100 + 0 + 0 + 0 + + + 5552 + 100 + 0 + 0 + 0 + + + 5553 + 625 + 0 + 0 + 0 + + + 5554 + 375 + 0 + 0 + 0 + + + 5555 + 500 + 0 + 0 + 0 + + + 5556 + 250 + 0 + 0 + 0 + + + 5557 + 250 + 0 + 0 + 0 + + + 5558 + 50 + 0 + 0 + 0 + + + 5559 + 1 + 0 + 0 + 0 + + + 5560 + 10 + 0 + 0 + 0 + + + 5561 + 1 + 0 + 0 + 0 + + + 5562 + 1 + 0 + 0 + 0 + + + 5563 + 1 + 0 + 0 + 0 + + + 5564 + 1 + 0 + 0 + 0 + + + 5565 + 1 + 0 + 0 + 0 + + + 5566 + 1 + 0 + 0 + 0 + + + 5567 + 1 + 0 + 0 + 0 + + + 5568 + 1 + 0 + 0 + 0 + + + 5569 + 1 + 0 + 0 + 0 + + + 5570 + 1 + 0 + 0 + 0 + + + 5571 + 1 + 0 + 0 + 0 + + + 5572 + 1 + 0 + 0 + 0 + + + 5573 + 1 + 0 + 0 + 0 + + + 5574 + 6000 + 0 + 0 + 0 + + + 5575 + 10000 + 0 + 0 + 0 + + + 5576 + 8000 + 0 + 0 + 0 + + + 5577 + 1 + 0 + 0 + 0 + + + 5578 + 1 + 0 + 0 + 0 + + + 5579 + 1 + 0 + 0 + 0 + + + 5580 + 1 + 0 + 0 + 0 + + + 5581 + 1 + 0 + 0 + 0 + + + 5582 + 1 + 0 + 0 + 0 + + + 5583 + 1 + 0 + 0 + 0 + + + 5584 + 1 + 0 + 0 + 0 + + + 5585 + 1 + 0 + 0 + 0 + + + 5586 + 1 + 0 + 0 + 0 + + + 5587 + 1 + 0 + 0 + 0 + + + 5588 + 1 + 0 + 0 + 0 + + + 5589 + 1 + 0 + 0 + 0 + + + 5590 + 1 + 0 + 0 + 0 + + + 5591 + 1 + 0 + 0 + 0 + + + 5592 + 10 + 0 + 0 + 0 + + + 5593 + 20 + 0 + 0 + 0 + + + 5594 + 20 + 0 + 0 + 0 + + + 5595 + 20 + 0 + 0 + 0 + + + 5596 + 20 + 0 + 0 + 0 + + + 5597 + 20 + 0 + 0 + 0 + + + 5598 + 20 + 0 + 0 + 0 + + + 5599 + 20 + 0 + 0 + 0 + + + 5600 + 20 + 0 + 0 + 0 + + + 5601 + 1 + 0 + 0 + 0 + + + 5602 + 20 + 0 + 0 + 0 + + + 5603 + 1 + 0 + 0 + 0 + + + 5604 + 3 + 0 + 0 + 0 + + + 5605 + 6 + 0 + 0 + 0 + + + 5606 + 1 + 0 + 0 + 0 + + + 5607 + 1 + 0 + 0 + 0 + + + 5608 + 1 + 0 + 0 + 0 + + + 5609 + 1 + 0 + 0 + 0 + + + 5610 + 1 + 0 + 0 + 0 + + + 5611 + 6000 + 0 + 0 + 0 + + + 5612 + 10000 + 0 + 0 + 0 + + + 5613 + 8000 + 0 + 0 + 0 + + + 5614 + 1 + 0 + 0 + 0 + + + 5615 + 1 + 0 + 0 + 0 + + + 5616 + 1 + 0 + 0 + 0 + + + 5617 + 3 + 0 + 0 + 0 + + + 5618 + 12 + 0 + 0 + 0 + + + 5619 + 32 + 0 + 0 + 0 + + + 5620 + 80 + 0 + 0 + 0 + + + 5621 + 400 + 0 + 0 + 0 + + + 5622 + 1 + 0 + 0 + 0 + + + 5623 + 3 + 0 + 0 + 0 + + + 5624 + 12 + 0 + 0 + 0 + + + 5625 + 32 + 0 + 0 + 0 + + + 5626 + 80 + 0 + 0 + 0 + + + 5627 + 400 + 0 + 0 + 0 + + + 5628 + 1 + 0 + 0 + 0 + + + 5629 + 2 + 0 + 0 + 0 + + + 5630 + 10 + 0 + 0 + 0 + + + 5631 + 18 + 0 + 0 + 0 + + + 5632 + 25 + 0 + 0 + 0 + + + 5633 + 65 + 0 + 0 + 0 + + + 5634 + 350 + 0 + 0 + 0 + + + 5635 + 1 + 0 + 0 + 0 + + + 5636 + 2 + 0 + 0 + 0 + + + 5637 + 10 + 0 + 0 + 0 + + + 5638 + 18 + 0 + 0 + 0 + + + 5639 + 25 + 0 + 0 + 0 + + + 5640 + 65 + 0 + 0 + 0 + + + 5641 + 350 + 0 + 0 + 0 + + + 5642 + 4 + 0 + 0 + 0 + + + 5643 + 6 + 0 + 0 + 0 + + + 5644 + 24 + 0 + 0 + 0 + + + 5645 + 64 + 0 + 0 + 0 + + + 5646 + 160 + 0 + 0 + 0 + + + 5647 + 400 + 0 + 0 + 0 + + + 5648 + 4 + 0 + 0 + 0 + + + 5649 + 6 + 0 + 0 + 0 + + + 5650 + 24 + 0 + 0 + 0 + + + 5651 + 64 + 0 + 0 + 0 + + + 5652 + 160 + 0 + 0 + 0 + + + 5653 + 400 + 0 + 0 + 0 + + + 5654 + 1 + 0 + 0 + 0 + + + 5655 + 3 + 0 + 0 + 0 + + + 5656 + 10 + 0 + 0 + 0 + + + 5657 + 27 + 0 + 0 + 0 + + + 5658 + 18 + 0 + 0 + 0 + + + 5659 + 66 + 0 + 0 + 0 + + + 5660 + 166 + 0 + 0 + 0 + + + 5661 + 1 + 0 + 0 + 0 + + + 5662 + 3 + 0 + 0 + 0 + + + 5663 + 10 + 0 + 0 + 0 + + + 5664 + 27 + 0 + 0 + 0 + + + 5665 + 18 + 0 + 0 + 0 + + + 5666 + 66 + 0 + 0 + 0 + + + 5667 + 166 + 0 + 0 + 0 + + + 5668 + 35 + 0 + 0 + 0 + + + 5669 + 35 + 0 + 0 + 0 + + + 5670 + 10 + 0 + 0 + 0 + + + 5671 + 10 + 0 + 0 + 0 + + + 5672 + 125 + 0 + 0 + 0 + + + 5673 + 125 + 0 + 0 + 0 + + + 5674 + 325 + 0 + 0 + 0 + + + 5675 + 325 + 0 + 0 + 0 + + + 5676 + 800 + 0 + 0 + 0 + + + 5677 + 800 + 0 + 0 + 0 + + + 5678 + 8000 + 0 + 0 + 0 + + + 5679 + 8000 + 0 + 0 + 0 + + + 5680 + 24000 + 0 + 0 + 0 + + + 5681 + 24000 + 0 + 0 + 0 + + + 5682 + 240 + 0 + 0 + 0 + + + 5683 + 240 + 0 + 0 + 0 + + + 5684 + 565 + 0 + 0 + 0 + + + 5685 + 565 + 0 + 0 + 0 + + + 5686 + 35 + 0 + 0 + 0 + + + 5687 + 35 + 0 + 0 + 0 + + + 5688 + 10 + 0 + 0 + 0 + + + 5689 + 10 + 0 + 0 + 0 + + + 5690 + 125 + 0 + 0 + 0 + + + 5691 + 125 + 0 + 0 + 0 + + + 5692 + 325 + 0 + 0 + 0 + + + 5693 + 325 + 0 + 0 + 0 + + + 5694 + 800 + 0 + 0 + 0 + + + 5695 + 800 + 0 + 0 + 0 + + + 5696 + 8000 + 0 + 0 + 0 + + + 5697 + 8000 + 0 + 0 + 0 + + + 5698 + 24000 + 0 + 0 + 0 + + + 5699 + 24000 + 0 + 0 + 0 + + + 5700 + 240 + 0 + 0 + 0 + + + 5701 + 240 + 0 + 0 + 0 + + + 5702 + 565 + 0 + 0 + 0 + + + 5703 + 565 + 0 + 0 + 0 + + + 5704 + 26 + 0 + 0 + 0 + + + 5705 + 26 + 0 + 0 + 0 + + + 5706 + 91 + 0 + 0 + 0 + + + 5707 + 91 + 0 + 0 + 0 + + + 5708 + 325 + 0 + 0 + 0 + + + 5709 + 325 + 0 + 0 + 0 + + + 5710 + 845 + 0 + 0 + 0 + + + 5711 + 845 + 0 + 0 + 0 + + + 5712 + 2080 + 0 + 0 + 0 + + + 5713 + 2080 + 0 + 0 + 0 + + + 5714 + 20800 + 0 + 0 + 0 + + + 5715 + 20800 + 0 + 0 + 0 + + + 5716 + 62400 + 0 + 0 + 0 + + + 5717 + 62400 + 0 + 0 + 0 + + + 5718 + 26 + 0 + 0 + 0 + + + 5719 + 26 + 0 + 0 + 0 + + + 5720 + 91 + 0 + 0 + 0 + + + 5721 + 91 + 0 + 0 + 0 + + + 5722 + 325 + 0 + 0 + 0 + + + 5723 + 325 + 0 + 0 + 0 + + + 5724 + 845 + 0 + 0 + 0 + + + 5725 + 845 + 0 + 0 + 0 + + + 5726 + 2080 + 0 + 0 + 0 + + + 5727 + 2080 + 0 + 0 + 0 + + + 5728 + 20800 + 0 + 0 + 0 + + + 5729 + 20800 + 0 + 0 + 0 + + + 5730 + 62400 + 0 + 0 + 0 + + + 5731 + 62400 + 0 + 0 + 0 + + + 5732 + 1 + 0 + 0 + 0 + + + 5733 + 1 + 0 + 0 + 0 + + + 5734 + 750 + 0 + 0 + 0 + + + 5735 + 750 + 0 + 0 + 0 + + + 5736 + 750 + 0 + 0 + 0 + + + 5737 + 750 + 0 + 0 + 0 + + + 5738 + 1 + 0 + 0 + 0 + + + 5739 + 2 + 0 + 0 + 0 + + + 5740 + 2 + 0 + 0 + 0 + + + 5741 + 2 + 0 + 0 + 0 + + + 5742 + 2 + 0 + 0 + 0 + + + 5743 + 2 + 0 + 0 + 0 + + + 5744 + 2 + 0 + 0 + 0 + + + 5745 + 2 + 0 + 0 + 0 + + + 5746 + 2 + 0 + 0 + 0 + + + 5747 + 2 + 0 + 0 + 0 + + + 5748 + 2 + 0 + 0 + 0 + + + 5749 + 5 + 0 + 0 + 0 + + + 5750 + 5 + 0 + 0 + 0 + + + 5751 + 2 + 0 + 0 + 0 + + + 5752 + 2 + 0 + 0 + 0 + + + 5753 + 2 + 0 + 0 + 0 + + + 5754 + 2 + 0 + 0 + 0 + + + 5755 + 2 + 0 + 0 + 0 + + + 5756 + 2 + 0 + 0 + 0 + + + 5757 + 2 + 0 + 0 + 0 + + + 5758 + 2 + 0 + 0 + 0 + + + 5759 + 2 + 0 + 0 + 0 + + + 5760 + 2 + 0 + 0 + 0 + + + 5761 + 2 + 0 + 0 + 0 + + + 5762 + 2 + 0 + 0 + 0 + + + 5763 + 2 + 0 + 0 + 0 + + + 5764 + 2 + 0 + 0 + 0 + + + 5765 + 2 + 0 + 0 + 0 + + + 5766 + 2 + 0 + 0 + 0 + + + 5767 + 1 + 0 + 0 + 0 + + + 5768 + 1 + 0 + 0 + 0 + + + 5769 + 1 + 0 + 0 + 0 + + + 5770 + 1 + 0 + 0 + 0 + + + 5771 + 1 + 0 + 0 + 0 + + + 5772 + 1 + 0 + 0 + 0 + + + 5773 + 1 + 0 + 0 + 0 + + + 5774 + 1 + 0 + 0 + 0 + + + 5775 + 1 + 0 + 0 + 0 + + + 5776 + 1 + 0 + 0 + 0 + + + 5777 + 1 + 0 + 0 + 0 + + + 5778 + 1 + 0 + 0 + 0 + + + 5779 + 1 + 0 + 0 + 0 + + + 5780 + 1 + 0 + 0 + 0 + + + 5781 + 1 + 0 + 0 + 0 + + + 5782 + 1 + 0 + 0 + 0 + + + 5783 + 1 + 0 + 0 + 0 + + + 5784 + 1 + 0 + 0 + 0 + + + 5785 + 1 + 0 + 0 + 0 + + + 5786 + 1 + 0 + 0 + 0 + + + 5787 + 1 + 0 + 0 + 0 + + + 5788 + 1 + 0 + 0 + 0 + + + 5789 + 1 + 0 + 0 + 0 + + + 5790 + 1 + 0 + 0 + 0 + + + 5791 + 1 + 0 + 0 + 0 + + + 5792 + 1 + 0 + 0 + 0 + + + 5793 + 1 + 0 + 0 + 0 + + + 5794 + 1 + 0 + 0 + 0 + + + 5795 + 1 + 0 + 0 + 0 + + + 5796 + 1 + 0 + 0 + 0 + + + 5797 + 1 + 0 + 0 + 0 + + + 5798 + 1 + 0 + 0 + 0 + + + 5799 + 1 + 0 + 0 + 0 + + + 5800 + 1 + 0 + 0 + 0 + + + 5801 + 1 + 0 + 0 + 0 + + + 5802 + 1 + 0 + 0 + 0 + + + 5803 + 1 + 0 + 0 + 0 + + + 5804 + 1 + 0 + 0 + 0 + + + 5805 + 1 + 0 + 0 + 0 + + + 5806 + 1 + 0 + 0 + 0 + + + 5807 + 1 + 0 + 0 + 0 + + + 5808 + 1 + 0 + 0 + 0 + + + 5809 + 1 + 0 + 0 + 0 + + + 5810 + 1 + 0 + 0 + 0 + + + 5811 + 1 + 0 + 0 + 0 + + + 5812 + 1 + 0 + 0 + 0 + + + 5813 + 1 + 0 + 0 + 0 + + + 5814 + 1 + 0 + 0 + 0 + + + 5815 + 1 + 0 + 0 + 0 + + + 5816 + 1 + 0 + 0 + 0 + + + 5817 + 1 + 0 + 0 + 0 + + + 5818 + 1 + 0 + 0 + 0 + + + 5819 + 1 + 0 + 0 + 0 + + + 5820 + 1 + 0 + 0 + 0 + + + 5821 + 1 + 0 + 0 + 0 + + + 5822 + 1 + 0 + 0 + 0 + + + 5823 + 1 + 0 + 0 + 0 + + + 5824 + 1 + 0 + 0 + 0 + + + 5825 + 1 + 0 + 0 + 0 + + + 5826 + 1 + 0 + 0 + 0 + + + 5827 + 1 + 0 + 0 + 0 + + + 5828 + 1 + 0 + 0 + 0 + + + 5829 + 1 + 0 + 0 + 0 + + + 5830 + 1 + 0 + 0 + 0 + + + 5831 + 1 + 0 + 0 + 0 + + + 5832 + 1 + 0 + 0 + 0 + + + 5833 + 1 + 0 + 0 + 0 + + + 5834 + 1 + 0 + 0 + 0 + + + 5835 + 1 + 0 + 0 + 0 + + + 5836 + 1 + 0 + 0 + 0 + + + 5837 + 1 + 0 + 0 + 0 + + + 5838 + 1 + 0 + 0 + 0 + + + 5839 + 1 + 0 + 0 + 0 + + + 5840 + 1 + 0 + 0 + 0 + + + 5841 + 1 + 0 + 0 + 0 + + + 5842 + 1 + 0 + 0 + 0 + + + 5843 + 1 + 0 + 0 + 0 + + + 5844 + 1 + 0 + 0 + 0 + + + 5845 + 1 + 0 + 0 + 0 + + + 5846 + 1 + 0 + 0 + 0 + + + 5847 + 1 + 0 + 0 + 0 + + + 5848 + 1 + 0 + 0 + 0 + + + 5849 + 1 + 0 + 0 + 0 + + + 5850 + 1 + 0 + 0 + 0 + + + 5851 + 1 + 0 + 0 + 0 + + + 5852 + 1 + 0 + 0 + 0 + + + 5853 + 1 + 0 + 0 + 0 + + + 5854 + 1 + 0 + 0 + 0 + + + 5855 + 1 + 0 + 0 + 0 + + + 5856 + 1 + 0 + 0 + 0 + + + 5857 + 1 + 0 + 0 + 0 + + + 5858 + 1 + 0 + 0 + 0 + + + 5859 + 1 + 0 + 0 + 0 + + + 5860 + 1 + 0 + 0 + 0 + + + 5861 + 1 + 0 + 0 + 0 + + + 5862 + 1 + 0 + 0 + 0 + + + 5863 + 1 + 0 + 0 + 0 + + + 5864 + 1 + 0 + 0 + 0 + + + 5865 + 1 + 0 + 0 + 0 + + + 5866 + 1 + 0 + 0 + 0 + + + 5867 + 1 + 0 + 0 + 0 + + + 5868 + 1 + 0 + 0 + 0 + + + 5869 + 1 + 0 + 0 + 0 + + + 5870 + 1 + 0 + 0 + 0 + + + 5871 + 1 + 0 + 0 + 0 + + + 5872 + 1 + 0 + 0 + 0 + + + 5873 + 1 + 0 + 0 + 0 + + + 5874 + 1 + 0 + 0 + 0 + + + 5875 + 1 + 0 + 0 + 0 + + + 5876 + 1 + 0 + 0 + 0 + + + 5877 + 1 + 0 + 0 + 0 + + + 5878 + 1 + 0 + 0 + 0 + + + 5879 + 1 + 0 + 0 + 0 + + + 5880 + 1 + 0 + 0 + 0 + + + 5881 + 1 + 0 + 0 + 0 + + + 5882 + 1 + 0 + 0 + 0 + + + 5883 + 1 + 0 + 0 + 0 + + + 5884 + 1 + 0 + 0 + 0 + + + 5885 + 1 + 0 + 0 + 0 + + + 5886 + 1 + 0 + 0 + 0 + + + 5887 + 1 + 0 + 0 + 0 + + + 5888 + 1 + 0 + 0 + 0 + + + 5889 + 1 + 0 + 0 + 0 + + + 5890 + 1 + 0 + 0 + 0 + + + 5891 + 1 + 0 + 0 + 0 + + + 5892 + 1 + 0 + 0 + 0 + + + 5893 + 1 + 0 + 0 + 0 + + + 5894 + 1 + 0 + 0 + 0 + + + 5895 + 1 + 0 + 0 + 0 + + + 5896 + 1 + 0 + 0 + 0 + + + 5897 + 1 + 0 + 0 + 0 + + + 5898 + 1 + 0 + 0 + 0 + + + 5899 + 1 + 0 + 0 + 0 + + + 5900 + 1 + 0 + 0 + 0 + + + 5901 + 1 + 0 + 0 + 0 + + + 5902 + 1 + 0 + 0 + 0 + + + 5903 + 1 + 0 + 0 + 0 + + + 5904 + 1 + 0 + 0 + 0 + + + 5905 + 1 + 0 + 0 + 0 + + + 5906 + 1 + 0 + 0 + 0 + + + 5907 + 1 + 0 + 0 + 0 + + + 5908 + 1 + 0 + 0 + 0 + + + 5909 + 1 + 0 + 0 + 0 + + + 5910 + 1 + 0 + 0 + 0 + + + 5911 + 1 + 0 + 0 + 0 + + + 5912 + 1 + 0 + 0 + 0 + + + 5913 + 1 + 0 + 0 + 0 + + + 5914 + 1 + 0 + 0 + 0 + + + 5915 + 1 + 0 + 0 + 0 + + + 5916 + 1 + 0 + 0 + 0 + + + 5917 + 1 + 0 + 0 + 0 + + + 5918 + 1 + 0 + 0 + 0 + + + 5919 + 1 + 0 + 0 + 0 + + + 5920 + 1 + 0 + 0 + 0 + + + 5921 + 1 + 0 + 0 + 0 + + + 5922 + 1 + 0 + 0 + 0 + + + 5923 + 1 + 0 + 0 + 0 + + + 5924 + 1 + 0 + 0 + 0 + + + 5925 + 1 + 0 + 0 + 0 + + + 5926 + 1 + 0 + 0 + 0 + + + 5927 + 1 + 0 + 0 + 0 + + + 5928 + 1 + 0 + 0 + 0 + + + 5929 + 1 + 0 + 0 + 0 + + + 5930 + 1 + 0 + 0 + 0 + + + 5931 + 6 + 0 + 0 + 0 + + + 5932 + 6 + 0 + 0 + 0 + + + 5933 + 2 + 0 + 0 + 0 + + + 5934 + 2 + 0 + 0 + 0 + + + 5935 + 1 + 0 + 0 + 0 + + + 5936 + 1 + 0 + 0 + 0 + + + 5937 + 288 + 0 + 0 + 0 + + + 5938 + 288 + 0 + 0 + 0 + + + 5939 + 14 + 0 + 0 + 0 + + + 5940 + 432 + 0 + 0 + 0 + + + 5941 + 432 + 0 + 0 + 0 + + + 5942 + 14 + 0 + 0 + 0 + + + 5943 + 360 + 0 + 0 + 0 + + + 5944 + 360 + 0 + 0 + 0 + + + 5945 + 288 + 0 + 0 + 0 + + + 5946 + 288 + 0 + 0 + 0 + + + 5947 + 216 + 0 + 0 + 0 + + + 5948 + 216 + 0 + 0 + 0 + + + 5949 + 144 + 0 + 0 + 0 + + + 5950 + 144 + 0 + 0 + 0 + + + 5951 + 14 + 0 + 0 + 0 + + + 5952 + 360 + 0 + 0 + 0 + + + 5953 + 360 + 0 + 0 + 0 + + + 5954 + 288 + 0 + 0 + 0 + + + 5955 + 288 + 0 + 0 + 0 + + + 5956 + 216 + 0 + 0 + 0 + + + 5957 + 216 + 0 + 0 + 0 + + + 5958 + 144 + 0 + 0 + 0 + + + 5959 + 144 + 0 + 0 + 0 + + + 5960 + 1 + 0 + 0 + 0 + + + 5961 + 1 + 0 + 0 + 0 + + + 5962 + 1 + 0 + 0 + 0 + + + 5963 + 1 + 0 + 0 + 0 + + + 5964 + 1 + 0 + 0 + 0 + + + 5965 + 1 + 0 + 0 + 0 + + + 5966 + 1 + 0 + 0 + 0 + + + 5967 + 1 + 0 + 0 + 0 + + + 5968 + 1 + 0 + 0 + 0 + + + 5969 + 1 + 0 + 0 + 0 + + + 5970 + 19 + 0 + 0 + 0 + + + 5971 + 19 + 0 + 0 + 0 + + + 5972 + 64 + 0 + 0 + 0 + + + 5973 + 64 + 0 + 0 + 0 + + + 5974 + 87 + 0 + 0 + 0 + + + 5975 + 87 + 0 + 0 + 0 + + + 5976 + 87 + 0 + 0 + 0 + + + 5977 + 87 + 0 + 0 + 0 + + + 5978 + 1 + 0 + 0 + 0 + + + 5979 + 1 + 0 + 0 + 0 + + + 5980 + 54 + 0 + 0 + 0 + + + 5981 + 54 + 0 + 0 + 0 + + + 5982 + 48 + 0 + 0 + 0 + + + 5983 + 48 + 0 + 0 + 0 + + + 5984 + 16 + 0 + 0 + 0 + + + 5985 + 16 + 0 + 0 + 0 + + + 5986 + 9 + 0 + 0 + 0 + + + 5987 + 9 + 0 + 0 + 0 + + + 5988 + 9 + 0 + 0 + 0 + + + 5989 + 9 + 0 + 0 + 0 + + + 5990 + 1 + 0 + 0 + 0 + + + 5991 + 1 + 0 + 0 + 0 + + + 5992 + 13 + 0 + 0 + 0 + + + 5993 + 13 + 0 + 0 + 0 + + + 5994 + 4 + 0 + 0 + 0 + + + 5995 + 4 + 0 + 0 + 0 + + + 5996 + 5 + 0 + 0 + 0 + + + 5997 + 5 + 0 + 0 + 0 + + + 5998 + 7 + 0 + 0 + 0 + + + 5999 + 7 + 0 + 0 + 0 + + + 6000 + 10 + 0 + 0 + 0 + + + 6001 + 10 + 0 + 0 + 0 + + + 6002 + 15 + 0 + 0 + 0 + + + 6003 + 15 + 0 + 0 + 0 + + + 6004 + 38 + 0 + 0 + 0 + + + 6005 + 38 + 0 + 0 + 0 + + + 6006 + 4 + 0 + 0 + 0 + + + 6007 + 4 + 0 + 0 + 0 + + + 6008 + 4 + 0 + 0 + 0 + + + 6009 + 4 + 0 + 0 + 0 + + + 6010 + 1 + 0 + 0 + 0 + + + 6011 + 1 + 0 + 0 + 0 + + + 6012 + 4 + 0 + 0 + 0 + + + 6013 + 4 + 0 + 0 + 0 + + + 6014 + 2 + 0 + 0 + 0 + + + 6015 + 2 + 0 + 0 + 0 + + + 6016 + 1 + 0 + 0 + 0 + + + 6017 + 1 + 0 + 0 + 0 + + + 6018 + 65 + 0 + 0 + 0 + + + 6019 + 65 + 0 + 0 + 0 + + + 6020 + 1 + 0 + 0 + 0 + + + 6021 + 1 + 0 + 0 + 0 + + + 6022 + 1 + 0 + 0 + 0 + + + 6023 + 1 + 0 + 0 + 0 + + + 6024 + 1 + 0 + 0 + 0 + + + 6025 + 1 + 0 + 0 + 0 + + + 6026 + 1 + 0 + 0 + 0 + + + 6027 + 1 + 0 + 0 + 0 + + + 6028 + 1 + 0 + 0 + 0 + + + 6029 + 1 + 0 + 0 + 0 + + + 6030 + 1 + 0 + 0 + 0 + + + 6031 + 1 + 0 + 0 + 0 + + + 6032 + 20 + 0 + 0 + 0 + + + 6033 + 20 + 0 + 0 + 0 + + + 6034 + 85 + 0 + 0 + 0 + + + 6035 + 85 + 0 + 0 + 0 + + + 6036 + 40 + 0 + 0 + 0 + + + 6037 + 40 + 0 + 0 + 0 + + + 6038 + 1 + 0 + 0 + 0 + + + 6039 + 1 + 0 + 0 + 0 + + + 6040 + 1 + 0 + 0 + 0 + + + 6041 + 1 + 0 + 0 + 0 + + + 6042 + 1 + 0 + 0 + 0 + + + 6043 + 1 + 0 + 0 + 0 + + + 6044 + 1 + 0 + 0 + 0 + + + 6045 + 1 + 0 + 0 + 0 + + + 6046 + 1 + 0 + 0 + 0 + + + 6047 + 1 + 0 + 0 + 0 + + + 6048 + 1 + 0 + 0 + 0 + + + 6049 + 1 + 0 + 0 + 0 + + + 6050 + 1 + 0 + 0 + 0 + + + 6051 + 1 + 0 + 0 + 0 + + + 6052 + 1 + 0 + 0 + 0 + + + 6053 + 1 + 0 + 0 + 0 + + + 6054 + 1 + 0 + 0 + 0 + + + 6055 + 1 + 0 + 0 + 0 + + + 6056 + 1 + 0 + 0 + 0 + + + 6057 + 1 + 0 + 0 + 0 + + + 6058 + 1 + 0 + 0 + 0 + + + 6059 + 1 + 0 + 0 + 0 + + + 6060 + 1 + 0 + 0 + 0 + + + 6061 + 3 + 0 + 0 + 0 + + + 6062 + 3 + 0 + 0 + 0 + + + 6063 + 1 + 0 + 0 + 0 + + + 6064 + 20 + 0 + 0 + 0 + + + 6065 + 150 + 0 + 0 + 0 + + + 6066 + 20 + 0 + 0 + 0 + + + 6067 + 100 + 0 + 0 + 0 + + + 6068 + 20 + 0 + 0 + 0 + + + 6069 + 30 + 0 + 0 + 0 + + + 6070 + 50 + 0 + 0 + 0 + + + 6071 + 1 + 0 + 0 + 0 + + + 6072 + 10 + 0 + 0 + 0 + + + 6073 + 2 + 0 + 0 + 0 + + + 6074 + 1 + 0 + 0 + 0 + + + 6075 + 2 + 0 + 0 + 0 + + + 6076 + 1 + 0 + 0 + 0 + + + 6077 + 2 + 0 + 0 + 0 + + + 6078 + 1 + 0 + 0 + 0 + + + 6079 + 2 + 0 + 0 + 0 + + + 6080 + 1 + 0 + 0 + 0 + + + 6081 + 10 + 0 + 0 + 0 + + + 6082 + 150 + 0 + 0 + 0 + + + 6083 + 1 + 0 + 0 + 0 + + + 6084 + 1 + 0 + 0 + 0 + + + 6085 + 20 + 0 + 0 + 0 + + + 6086 + 20 + 0 + 0 + 0 + + + 6087 + 20 + 0 + 0 + 0 + + + 6088 + 20 + 0 + 0 + 0 + + + 6089 + 1 + 0 + 0 + 0 + + + 6090 + 1 + 0 + 0 + 0 + + + 6091 + 1 + 0 + 0 + 0 + + + 6092 + 1 + 0 + 0 + 0 + + + 6093 + 1 + 0 + 0 + 0 + + + 6094 + 1 + 0 + 0 + 0 + + + 6095 + 1 + 0 + 0 + 0 + + + 6096 + 1 + 0 + 0 + 0 + + + 6097 + 10 + 0 + 0 + 0 + + + 6098 + 50 + 0 + 0 + 0 + + + 6099 + 50 + 0 + 0 + 0 + + + 6100 + 45 + 0 + 0 + 0 + + + 6101 + 35 + 0 + 0 + 0 + + + 6102 + 15 + 0 + 0 + 0 + + + 6103 + 1 + 0 + 0 + 0 + + + 6104 + 1 + 0 + 0 + 0 + + + 6105 + 1 + 0 + 0 + 0 + + + 6106 + 300 + 0 + 0 + 0 + + + 6107 + 300 + 0 + 0 + 0 + + + 6108 + 300 + 0 + 0 + 0 + + + 6109 + 300 + 0 + 0 + 0 + + + 6110 + 300 + 0 + 0 + 0 + + + 6111 + 250 + 0 + 0 + 0 + + + 6112 + 2 + 0 + 0 + 0 + + + 6113 + 4 + 0 + 0 + 0 + + + 6114 + 1 + 0 + 0 + 0 + + + 6115 + 1 + 0 + 0 + 0 + + + 6116 + 1 + 0 + 0 + 0 + + + 6117 + 1 + 0 + 0 + 0 + + + 6118 + 2 + 0 + 0 + 0 + + + 6119 + 1 + 0 + 0 + 0 + + + 6120 + 1 + 0 + 0 + 0 + + + 6121 + 1 + 0 + 0 + 0 + + + 6122 + 1 + 0 + 0 + 0 + + + 6123 + 1 + 0 + 0 + 0 + + + 6124 + 1 + 0 + 0 + 0 + + + 6125 + 1000 + 0 + 0 + 0 + + + 6126 + 1000 + 0 + 0 + 0 + + + 6127 + 1000 + 0 + 0 + 0 + + + 6128 + 35200 + 0 + 0 + 0 + + + 6129 + 65000 + 0 + 0 + 0 + + + 6130 + 64000 + 0 + 0 + 0 + + + 6131 + 60000 + 0 + 0 + 0 + + + 6132 + 60000 + 0 + 0 + 0 + + + 6133 + 7800 + 0 + 0 + 0 + + + 6134 + 7800 + 0 + 0 + 0 + + + 6135 + 3900 + 0 + 0 + 0 + + + 6136 + 3900 + 0 + 0 + 0 + + + 6137 + 10000 + 0 + 0 + 0 + + + 6138 + 10000 + 0 + 0 + 0 + + + 6139 + 45000 + 0 + 0 + 0 + + + 6140 + 45000 + 0 + 0 + 0 + + + 6141 + 40000 + 0 + 0 + 0 + + + 6142 + 40000 + 0 + 0 + 0 + + + 6143 + 650 + 0 + 0 + 0 + + + 6144 + 650 + 0 + 0 + 0 + + + 6145 + 650 + 0 + 0 + 0 + + + 6146 + 650 + 0 + 0 + 0 + + + 6147 + 650 + 0 + 0 + 0 + + + 6148 + 650 + 0 + 0 + 0 + + + 6149 + 650 + 0 + 0 + 0 + + + 6150 + 650 + 0 + 0 + 0 + + + 6151 + 650 + 0 + 0 + 0 + + + 6152 + 650 + 0 + 0 + 0 + + + 6153 + 650 + 0 + 0 + 0 + + + 6154 + 650 + 0 + 0 + 0 + + + 6155 + 60 + 0 + 0 + 0 + + + 6156 + 60 + 0 + 0 + 0 + + + 6157 + 60 + 0 + 0 + 0 + + + 6158 + 60 + 0 + 0 + 0 + + + 6159 + 60 + 0 + 0 + 0 + + + 6160 + 60 + 0 + 0 + 0 + + + 6161 + 60 + 0 + 0 + 0 + + + 6162 + 60 + 0 + 0 + 0 + + + 6163 + 60 + 0 + 0 + 0 + + + 6164 + 60 + 0 + 0 + 0 + + + 6165 + 60 + 0 + 0 + 0 + + + 6166 + 60 + 0 + 0 + 0 + + + 6167 + 60 + 0 + 0 + 0 + + + 6168 + 60 + 0 + 0 + 0 + + + 6169 + 60 + 0 + 0 + 0 + + + 6170 + 60 + 0 + 0 + 0 + + + 6171 + 60 + 0 + 0 + 0 + + + 6172 + 60 + 0 + 0 + 0 + + + 6173 + 60 + 0 + 0 + 0 + + + 6174 + 60 + 0 + 0 + 0 + + + 6175 + 35200 + 0 + 0 + 0 + + + 6176 + 65000 + 0 + 0 + 0 + + + 6177 + 64000 + 0 + 0 + 0 + + + 6178 + 5 + 0 + 0 + 0 + + + 6179 + 5 + 0 + 0 + 0 + + + 6180 + 1 + 0 + 0 + 0 + + + 6181 + 1 + 0 + 0 + 0 + + + 6182 + 1 + 0 + 0 + 0 + + + 6183 + 1 + 0 + 0 + 0 + + + 6184 + 1 + 0 + 0 + 0 + + + 6185 + 1 + 0 + 0 + 0 + + + 6186 + 1 + 0 + 0 + 0 + + + 6187 + 1 + 0 + 0 + 0 + + + 6188 + 1 + 0 + 0 + 0 + + + 6189 + 1 + 0 + 0 + 0 + + + 6190 + 1 + 0 + 0 + 0 + + + 6191 + 1 + 0 + 0 + 0 + + + 6192 + 1 + 0 + 0 + 0 + + + 6193 + 1 + 0 + 0 + 0 + + + 6194 + 1 + 0 + 0 + 0 + + + 6195 + 1 + 0 + 0 + 0 + + + 6196 + 1 + 0 + 0 + 0 + + + 6197 + 1 + 0 + 0 + 0 + + + 6198 + 1 + 0 + 0 + 0 + + + 6199 + 1 + 0 + 0 + 0 + + + 6200 + 1 + 0 + 0 + 0 + + + 6201 + 1 + 0 + 0 + 0 + + + 6202 + 1 + 0 + 0 + 0 + + + 6203 + 1 + 0 + 0 + 0 + + + 6204 + 1 + 0 + 0 + 0 + + + 6205 + 1 + 0 + 0 + 0 + + + 6206 + 1 + 0 + 0 + 0 + + + 6207 + 1 + 0 + 0 + 0 + + + 6208 + 1 + 0 + 0 + 0 + + + 6209 + 5 + 0 + 0 + 0 + + + 6210 + 1 + 0 + 0 + 0 + + + 6211 + 100 + 0 + 0 + 0 + + + 6212 + 100 + 0 + 0 + 0 + + + 6213 + 200 + 0 + 0 + 0 + + + 6214 + 200 + 0 + 0 + 0 + + + 6215 + 3000 + 0 + 0 + 0 + + + 6216 + 3000 + 0 + 0 + 0 + + + 6217 + 2750 + 0 + 0 + 0 + + + 6218 + 2750 + 0 + 0 + 0 + + + 6219 + 3000 + 0 + 0 + 0 + + + 6220 + 3000 + 0 + 0 + 0 + + + 6221 + 3000 + 0 + 0 + 0 + + + 6222 + 3000 + 0 + 0 + 0 + + + 6223 + 3000 + 0 + 0 + 0 + + + 6224 + 3000 + 0 + 0 + 0 + + + 6225 + 3000 + 0 + 0 + 0 + + + 6226 + 3000 + 0 + 0 + 0 + + + 6227 + 3000 + 0 + 0 + 0 + + + 6228 + 3000 + 0 + 0 + 0 + + + 6229 + 3000 + 0 + 0 + 0 + + + 6230 + 3000 + 0 + 0 + 0 + + + 6231 + 3000 + 0 + 0 + 0 + + + 6232 + 3000 + 0 + 0 + 0 + + + 6233 + 3000 + 0 + 0 + 0 + + + 6234 + 3000 + 0 + 0 + 0 + + + 6235 + 3000 + 0 + 0 + 0 + + + 6236 + 3000 + 0 + 0 + 0 + + + 6237 + 3000 + 0 + 0 + 0 + + + 6238 + 3000 + 0 + 0 + 0 + + + 6239 + 3000 + 0 + 0 + 0 + + + 6240 + 3000 + 0 + 0 + 0 + + + 6241 + 3000 + 0 + 0 + 0 + + + 6242 + 3000 + 0 + 0 + 0 + + + 6243 + 3000 + 0 + 0 + 0 + + + 6244 + 3000 + 0 + 0 + 0 + + + 6245 + 3000 + 0 + 0 + 0 + + + 6246 + 3000 + 0 + 0 + 0 + + + 6247 + 3000 + 0 + 0 + 0 + + + 6248 + 3000 + 0 + 0 + 0 + + + 6249 + 3000 + 0 + 0 + 0 + + + 6250 + 3000 + 0 + 0 + 0 + + + 6251 + 3000 + 0 + 0 + 0 + + + 6252 + 3000 + 0 + 0 + 0 + + + 6253 + 3000 + 0 + 0 + 0 + + + 6254 + 3000 + 0 + 0 + 0 + + + 6255 + 3000 + 0 + 0 + 0 + + + 6256 + 3000 + 0 + 0 + 0 + + + 6257 + 3000 + 0 + 0 + 0 + + + 6258 + 3000 + 0 + 0 + 0 + + + 6259 + 3000 + 0 + 0 + 0 + + + 6260 + 3000 + 0 + 0 + 0 + + + 6261 + 3000 + 0 + 0 + 0 + + + 6262 + 3000 + 0 + 0 + 0 + + + 6263 + 3000 + 0 + 0 + 0 + + + 6264 + 3000 + 0 + 0 + 0 + + + 6265 + 3000 + 0 + 0 + 0 + + + 6266 + 3000 + 0 + 0 + 0 + + + 6267 + 3000 + 0 + 0 + 0 + + + 6268 + 3000 + 0 + 0 + 0 + + + 6269 + 3000 + 0 + 0 + 0 + + + 6270 + 3000 + 0 + 0 + 0 + + + 6271 + 3000 + 0 + 0 + 0 + + + 6272 + 3000 + 0 + 0 + 0 + + + 6273 + 3000 + 0 + 0 + 0 + + + 6274 + 3000 + 0 + 0 + 0 + + + 6275 + 3000 + 0 + 0 + 0 + + + 6276 + 3000 + 0 + 0 + 0 + + + 6277 + 3000 + 0 + 0 + 0 + + + 6278 + 3000 + 0 + 0 + 0 + + + 6279 + 3000 + 0 + 0 + 0 + + + 6280 + 3000 + 0 + 0 + 0 + + + 6281 + 10 + 0 + 0 + 0 + + + 6282 + 10 + 0 + 0 + 0 + + + 6283 + 15 + 0 + 0 + 0 + + + 6284 + 15 + 0 + 0 + 0 + + + 6285 + 20 + 0 + 0 + 0 + + + 6286 + 20 + 0 + 0 + 0 + + + 6287 + 35 + 0 + 0 + 0 + + + 6288 + 35 + 0 + 0 + 0 + + + 6289 + 50 + 0 + 0 + 0 + + + 6290 + 50 + 0 + 0 + 0 + + + 6291 + 15 + 0 + 0 + 0 + + + 6292 + 15 + 0 + 0 + 0 + + + 6293 + 25 + 0 + 0 + 0 + + + 6294 + 25 + 0 + 0 + 0 + + + 6295 + 20 + 0 + 0 + 0 + + + 6296 + 20 + 0 + 0 + 0 + + + 6297 + 50 + 0 + 0 + 0 + + + 6298 + 50 + 0 + 0 + 0 + + + 6299 + 40 + 0 + 0 + 0 + + + 6300 + 40 + 0 + 0 + 0 + + + 6301 + 1 + 0 + 0 + 0 + + + 6302 + 1 + 0 + 0 + 0 + + + 6303 + 1 + 0 + 0 + 0 + + + 6304 + 1 + 0 + 0 + 0 + + + 6305 + 10 + 0 + 0 + 0 + + + 6306 + 1 + 0 + 0 + 0 + + + 6307 + 1 + 0 + 0 + 0 + + + 6308 + 1 + 0 + 0 + 0 + + + 6309 + 1 + 0 + 0 + 0 + + + 6310 + 1 + 0 + 0 + 0 + + + 6311 + 200 + 0 + 0 + 0 + + + 6312 + 200 + 0 + 0 + 0 + + + 6313 + 500 + 0 + 0 + 0 + + + 6314 + 500 + 0 + 0 + 0 + + + 6315 + 1000 + 0 + 0 + 0 + + + 6316 + 1000 + 0 + 0 + 0 + + + 6317 + 2000 + 0 + 0 + 0 + + + 6318 + 2000 + 0 + 0 + 0 + + + 6319 + 5 + 0 + 0 + 0 + + + 6320 + 5 + 0 + 0 + 0 + + + 6321 + 1 + 0 + 0 + 0 + + + 6322 + 1250 + 0 + 0 + 0 + + + 6323 + 1250 + 0 + 0 + 0 + + + 6324 + 1175 + 0 + 0 + 0 + + + 6325 + 1175 + 0 + 0 + 0 + + + 6326 + 300 + 0 + 0 + 0 + + + 6327 + 300 + 0 + 0 + 0 + + + 6328 + 250 + 0 + 0 + 0 + + + 6329 + 250 + 0 + 0 + 0 + + + 6330 + 434 + 0 + 0 + 0 + + + 6331 + 434 + 0 + 0 + 0 + + + 6332 + 50 + 0 + 0 + 0 + + + 6333 + 30 + 0 + 0 + 0 + + + 6334 + 30 + 0 + 0 + 0 + + + 6335 + 500 + 0 + 0 + 0 + + + 6336 + 500 + 0 + 0 + 0 + + + 6337 + 500 + 0 + 0 + 0 + + + 6338 + 500 + 0 + 0 + 0 + + + 6339 + 500 + 0 + 0 + 0 + + + 6340 + 500 + 0 + 0 + 0 + + + 6341 + 300 + 0 + 0 + 0 + + + 6342 + 300 + 0 + 0 + 0 + + + 6343 + 250 + 0 + 0 + 0 + + + 6344 + 250 + 0 + 0 + 0 + + + 6345 + 200 + 0 + 0 + 0 + + + 6346 + 200 + 0 + 0 + 0 + + + 6347 + 150 + 0 + 0 + 0 + + + 6348 + 150 + 0 + 0 + 0 + + + 6349 + 100 + 0 + 0 + 0 + + + 6350 + 100 + 0 + 0 + 0 + + + 6351 + 300 + 0 + 0 + 0 + + + 6352 + 300 + 0 + 0 + 0 + + + 6353 + 250 + 0 + 0 + 0 + + + 6354 + 250 + 0 + 0 + 0 + + + 6355 + 200 + 0 + 0 + 0 + + + 6356 + 200 + 0 + 0 + 0 + + + 6357 + 100 + 0 + 0 + 0 + + + 6358 + 100 + 0 + 0 + 0 + + + 6359 + 150 + 0 + 0 + 0 + + + 6360 + 150 + 0 + 0 + 0 + + + 6361 + 300 + 0 + 0 + 0 + + + 6362 + 300 + 0 + 0 + 0 + + + 6363 + 250 + 0 + 0 + 0 + + + 6364 + 250 + 0 + 0 + 0 + + + 6365 + 200 + 0 + 0 + 0 + + + 6366 + 200 + 0 + 0 + 0 + + + 6367 + 100 + 0 + 0 + 0 + + + 6368 + 100 + 0 + 0 + 0 + + + 6369 + 150 + 0 + 0 + 0 + + + 6370 + 150 + 0 + 0 + 0 + + + 6371 + 300 + 0 + 0 + 0 + + + 6372 + 300 + 0 + 0 + 0 + + + 6373 + 250 + 0 + 0 + 0 + + + 6374 + 250 + 0 + 0 + 0 + + + 6375 + 200 + 0 + 0 + 0 + + + 6376 + 200 + 0 + 0 + 0 + + + 6377 + 100 + 0 + 0 + 0 + + + 6378 + 100 + 0 + 0 + 0 + + + 6379 + 150 + 0 + 0 + 0 + + + 6380 + 150 + 0 + 0 + 0 + + + 6381 + 1 + 0 + 0 + 0 + + + 6382 + 20 + 0 + 0 + 0 + + + 6383 + 20 + 0 + 0 + 0 + + + 6384 + 15 + 0 + 0 + 0 + + + 6385 + 15 + 0 + 0 + 0 + + + 6386 + 25 + 0 + 0 + 0 + + + 6387 + 25 + 0 + 0 + 0 + + + 6388 + 35 + 0 + 0 + 0 + + + 6389 + 35 + 0 + 0 + 0 + + + 6390 + 25 + 0 + 0 + 0 + + + 6391 + 25 + 0 + 0 + 0 + + + 6392 + 35 + 0 + 0 + 0 + + + 6393 + 35 + 0 + 0 + 0 + + + 6394 + 20 + 0 + 0 + 0 + + + 6395 + 20 + 0 + 0 + 0 + + + 6396 + 40 + 0 + 0 + 0 + + + 6397 + 40 + 0 + 0 + 0 + + + 6398 + 20 + 0 + 0 + 0 + + + 6399 + 20 + 0 + 0 + 0 + + + 6400 + 35 + 0 + 0 + 0 + + + 6401 + 35 + 0 + 0 + 0 + + + 6402 + 20 + 0 + 0 + 0 + + + 6403 + 20 + 0 + 0 + 0 + + + 6404 + 40 + 0 + 0 + 0 + + + 6405 + 40 + 0 + 0 + 0 + + + 6406 + 20 + 0 + 0 + 0 + + + 6407 + 20 + 0 + 0 + 0 + + + 6408 + 400 + 0 + 0 + 0 + + + 6409 + 400 + 0 + 0 + 0 + + + 6410 + 400 + 0 + 0 + 0 + + + 6411 + 400 + 0 + 0 + 0 + + + 6412 + 800 + 0 + 0 + 0 + + + 6413 + 800 + 0 + 0 + 0 + + + 6414 + 800 + 0 + 0 + 0 + + + 6415 + 800 + 0 + 0 + 0 + + + 6416 + 1200 + 0 + 0 + 0 + + + 6417 + 1200 + 0 + 0 + 0 + + + 6418 + 1600 + 0 + 0 + 0 + + + 6419 + 1600 + 0 + 0 + 0 + + + 6420 + 1600 + 0 + 0 + 0 + + + 6421 + 1600 + 0 + 0 + 0 + + + 6422 + 1 + 0 + 0 + 0 + + + 6423 + 1 + 0 + 0 + 0 + + + 6424 + 1 + 0 + 0 + 0 + + + 6425 + 1 + 0 + 0 + 0 + + + 6426 + 1 + 0 + 0 + 0 + + + 6427 + 1 + 0 + 0 + 0 + + + 6428 + 1 + 0 + 0 + 0 + + + 6429 + 1 + 0 + 0 + 0 + + + 6430 + 1 + 0 + 0 + 0 + + + 6431 + 1 + 0 + 0 + 0 + + + 6432 + 1 + 0 + 0 + 0 + + + 6433 + 1 + 0 + 0 + 0 + + + 6434 + 1 + 0 + 0 + 0 + + + 6435 + 1 + 0 + 0 + 0 + + + 6436 + 1 + 0 + 0 + 0 + + + 6437 + 1 + 0 + 0 + 0 + + + 6438 + 1 + 0 + 0 + 0 + + + 6439 + 1 + 0 + 0 + 0 + + + 6440 + 1 + 0 + 0 + 0 + + + 6441 + 1 + 0 + 0 + 0 + + + 6442 + 1 + 0 + 0 + 0 + + + 6443 + 1 + 0 + 0 + 0 + + + 6444 + 1 + 0 + 0 + 0 + + + 6445 + 1 + 0 + 0 + 0 + + + 6446 + 1 + 0 + 0 + 0 + + + 6447 + 1 + 0 + 0 + 0 + + + 6448 + 3 + 0 + 0 + 0 + + + 6449 + 1 + 0 + 0 + 0 + + + 6450 + 1 + 0 + 0 + 0 + + + 6451 + 1 + 0 + 0 + 0 + + + 6452 + 1 + 0 + 0 + 0 + + + 6453 + 1 + 0 + 0 + 0 + + + 6454 + 1 + 0 + 0 + 0 + + + 6455 + 1 + 0 + 0 + 0 + + + 6456 + 1 + 0 + 0 + 0 + + + 6457 + 1 + 0 + 0 + 0 + + + 6458 + 1 + 0 + 0 + 0 + + + 6459 + 1 + 0 + 0 + 0 + + + 6460 + 1 + 0 + 0 + 0 + + + 6461 + 1 + 0 + 0 + 0 + + + 6462 + 1 + 0 + 0 + 0 + + + 6463 + 1 + 0 + 0 + 0 + + + 6464 + 1 + 0 + 0 + 0 + + + 6465 + 1 + 0 + 0 + 0 + + + 6466 + 1 + 0 + 0 + 0 + + + 6467 + 1 + 0 + 0 + 0 + + + 6468 + 1 + 0 + 0 + 0 + + + 6469 + 1 + 0 + 0 + 0 + + + 6470 + 120 + 0 + 0 + 0 + + + 6471 + 120 + 0 + 0 + 0 + + + 6472 + 90 + 0 + 0 + 0 + + + 6473 + 90 + 0 + 0 + 0 + + + 6474 + 60 + 0 + 0 + 0 + + + 6475 + 60 + 0 + 0 + 0 + + + 6476 + 30 + 0 + 0 + 0 + + + 6477 + 30 + 0 + 0 + 0 + + + 6478 + 1 + 0 + 0 + 0 + + + 6479 + 1 + 0 + 0 + 0 + + + 6480 + 1 + 0 + 0 + 0 + + + 6481 + 1 + 0 + 0 + 0 + + + 6482 + 1 + 0 + 0 + 0 + + + 6483 + 1 + 0 + 0 + 0 + + + 6484 + 1 + 0 + 0 + 0 + + + 6485 + 1 + 0 + 0 + 0 + + + 6486 + 1 + 0 + 0 + 0 + + + 6487 + 1 + 0 + 0 + 0 + + + 6488 + 1 + 0 + 0 + 0 + + + 6489 + 1 + 0 + 0 + 0 + + + 6490 + 1 + 0 + 0 + 0 + + + 6491 + 1 + 0 + 0 + 0 + + + 6492 + 1 + 0 + 0 + 0 + + + 6493 + 1 + 0 + 0 + 0 + + + 6494 + 1 + 0 + 0 + 0 + + + 6495 + 1 + 0 + 0 + 0 + + + 6496 + 1 + 0 + 0 + 0 + + + 6497 + 1 + 0 + 0 + 0 + + + 6498 + 1 + 0 + 0 + 0 + + + 6499 + 1 + 0 + 0 + 0 + + + 6500 + 1 + 0 + 0 + 0 + + + 6501 + 1 + 0 + 0 + 0 + + + 6502 + 1 + 0 + 0 + 0 + + + 6503 + 1 + 0 + 0 + 0 + + + 6504 + 1 + 0 + 0 + 0 + + + 6505 + 1 + 0 + 0 + 0 + + + 6506 + 1 + 0 + 0 + 0 + + + 6507 + 1 + 0 + 0 + 0 + + + 6508 + 1 + 0 + 0 + 0 + + + 6509 + 1 + 0 + 0 + 0 + + + 6510 + 1 + 0 + 0 + 0 + + + 6511 + 1 + 0 + 0 + 0 + + + 6512 + 1 + 0 + 0 + 0 + + + 6513 + 1 + 0 + 0 + 0 + + + 6514 + 1 + 0 + 0 + 0 + + + 6515 + 1 + 0 + 0 + 0 + + + 6516 + 1 + 0 + 0 + 0 + + + 6517 + 1 + 0 + 0 + 0 + + + 6518 + 1 + 0 + 0 + 0 + + + 6519 + 1 + 0 + 0 + 0 + + + 6520 + 1 + 0 + 0 + 0 + + + 6521 + 1 + 0 + 0 + 0 + + + 6522 + 250 + 0 + 0 + 0 + + + 6523 + 40000 + 0 + 0 + 0 + + + 6524 + 45000 + 0 + 0 + 0 + + + 6525 + 25000 + 0 + 0 + 0 + + + 6526 + 35000 + 0 + 0 + 0 + + + 6527 + 30000 + 0 + 0 + 0 + + + 6528 + 50000 + 0 + 0 + 0 + + + 6529 + 1 + 0 + 0 + 0 + + + 6530 + 1 + 0 + 0 + 0 + + + 6531 + 1 + 0 + 0 + 0 + + + 6532 + 1 + 0 + 0 + 0 + + + 6533 + 1 + 0 + 0 + 0 + + + 6534 + 1 + 0 + 0 + 0 + + + 6535 + 40000 + 0 + 0 + 0 + + + 6536 + 45000 + 0 + 0 + 0 + + + 6537 + 25000 + 0 + 0 + 0 + + + 6538 + 35000 + 0 + 0 + 0 + + + 6539 + 30000 + 0 + 0 + 0 + + + 6540 + 50000 + 0 + 0 + 0 + + + 6541 + 1 + 0 + 0 + 0 + + + 6542 + 1 + 0 + 0 + 0 + + + 6543 + 1 + 0 + 0 + 0 + + + 6544 + 1 + 0 + 0 + 0 + + + 6545 + 1 + 0 + 0 + 0 + + + 6546 + 1 + 0 + 0 + 0 + + + 6547 + 1 + 0 + 0 + 0 + + + 6548 + 1 + 0 + 0 + 0 + + + 6549 + 1 + 0 + 0 + 0 + + + 6550 + 1 + 0 + 0 + 0 + + + 6551 + 1 + 0 + 0 + 0 + + + 6552 + 1 + 0 + 0 + 0 + + + 6553 + 1 + 0 + 0 + 0 + + + 6554 + 1 + 0 + 0 + 0 + + + 6555 + 1 + 0 + 0 + 0 + + + 6556 + 1 + 0 + 0 + 0 + + + 6557 + 1 + 0 + 0 + 0 + + + 6558 + 1 + 0 + 0 + 0 + + + 6559 + 1 + 0 + 0 + 0 + + + 6560 + 1 + 0 + 0 + 0 + + + 6561 + 2 + 0 + 0 + 0 + + + 6562 + 17000 + 0 + 0 + 0 + + + 6563 + 45000 + 0 + 0 + 0 + + + 6564 + 1 + 0 + 0 + 0 + + + 6565 + 1 + 0 + 0 + 0 + + + 6566 + 1 + 0 + 0 + 0 + + + 6567 + 1 + 0 + 0 + 0 + + + 6568 + 60000 + 0 + 0 + 0 + + + 6569 + 60000 + 0 + 0 + 0 + + + 6570 + 60000 + 0 + 0 + 0 + + + 6571 + 300000 + 0 + 0 + 0 + + + 6572 + 300000 + 0 + 0 + 0 + + + 6573 + 300000 + 0 + 0 + 0 + + + 6574 + 300000 + 0 + 0 + 0 + + + 6575 + 201000 + 0 + 0 + 0 + + + 6576 + 201000 + 0 + 0 + 0 + + + 6577 + 201000 + 0 + 0 + 0 + + + 6578 + 201000 + 0 + 0 + 0 + + + 6579 + 201000 + 0 + 0 + 0 + + + 6580 + 201000 + 0 + 0 + 0 + + + 6581 + 201000 + 0 + 0 + 0 + + + 6582 + 201000 + 0 + 0 + 0 + + + 6583 + 202000 + 0 + 0 + 0 + + + 6584 + 202000 + 0 + 0 + 0 + + + 6585 + 202000 + 0 + 0 + 0 + + + 6586 + 202000 + 0 + 0 + 0 + + + 6587 + 360 + 0 + 0 + 0 + + + 6588 + 360 + 0 + 0 + 0 + + + 6589 + 1248 + 0 + 0 + 0 + + + 6590 + 1248 + 0 + 0 + 0 + + + 6591 + 240 + 0 + 0 + 0 + + + 6592 + 240 + 0 + 0 + 0 + + + 6593 + 240 + 0 + 0 + 0 + + + 6594 + 240 + 0 + 0 + 0 + + + 6595 + 240 + 0 + 0 + 0 + + + 6596 + 240 + 0 + 0 + 0 + + + 6597 + 240 + 0 + 0 + 0 + + + 6598 + 240 + 0 + 0 + 0 + + + 6599 + 1920 + 0 + 0 + 0 + + + 6600 + 1920 + 0 + 0 + 0 + + + 6601 + 432 + 0 + 0 + 0 + + + 6602 + 432 + 0 + 0 + 0 + + + 6603 + 200 + 0 + 0 + 0 + + + 6604 + 200 + 0 + 0 + 0 + + + 6605 + 624 + 0 + 0 + 0 + + + 6606 + 624 + 0 + 0 + 0 + + + 6607 + 960 + 0 + 0 + 0 + + + 6608 + 960 + 0 + 0 + 0 + + + 6609 + 1920 + 0 + 0 + 0 + + + 6610 + 1920 + 0 + 0 + 0 + + + 6611 + 768 + 0 + 0 + 0 + + + 6612 + 768 + 0 + 0 + 0 + + + 6613 + 980 + 0 + 0 + 0 + + + 6614 + 980 + 0 + 0 + 0 + + + 6615 + 1440 + 0 + 0 + 0 + + + 6616 + 1440 + 0 + 0 + 0 + + + 6617 + 3840 + 0 + 0 + 0 + + + 6618 + 3840 + 0 + 0 + 0 + + + 6619 + 576 + 0 + 0 + 0 + + + 6620 + 576 + 0 + 0 + 0 + + + 6621 + 576 + 0 + 0 + 0 + + + 6622 + 576 + 0 + 0 + 0 + + + 6623 + 1056 + 0 + 0 + 0 + + + 6624 + 1056 + 0 + 0 + 0 + + + 6625 + 1920 + 0 + 0 + 0 + + + 6626 + 1920 + 0 + 0 + 0 + + + 6627 + 1920 + 0 + 0 + 0 + + + 6628 + 1920 + 0 + 0 + 0 + + + 6629 + 6 + 0 + 0 + 0 + + + 6630 + 6 + 0 + 0 + 0 + + + 6631 + 1152 + 0 + 0 + 0 + + + 6632 + 1152 + 0 + 0 + 0 + + + 6633 + 1632 + 0 + 0 + 0 + + + 6634 + 1632 + 0 + 0 + 0 + + + 6635 + 1 + 0 + 0 + 0 + + + 6636 + 1 + 0 + 0 + 0 + + + 6637 + 1 + 0 + 0 + 0 + + + 6638 + 1 + 0 + 0 + 0 + + + 6639 + 1 + 0 + 0 + 0 + + + 6640 + 1 + 0 + 0 + 0 + + + 6641 + 1 + 0 + 0 + 0 + + + 6642 + 1 + 0 + 0 + 0 + + + 6643 + 1 + 0 + 0 + 0 + + + 6644 + 1 + 0 + 0 + 0 + + + 6645 + 1 + 0 + 0 + 0 + + + 6646 + 1 + 0 + 0 + 0 + + + 6647 + 1 + 0 + 0 + 0 + + + 6648 + 1 + 0 + 0 + 0 + + + 6649 + 1 + 0 + 0 + 0 + + + 6650 + 1 + 0 + 0 + 0 + + + 6651 + 1 + 0 + 0 + 0 + + + 6652 + 1 + 0 + 0 + 0 + + + 6653 + 1 + 0 + 0 + 0 + + + 6654 + 1 + 0 + 0 + 0 + + + 6655 + 1 + 0 + 0 + 0 + + + 6656 + 1 + 0 + 0 + 0 + + + 6657 + 1 + 0 + 0 + 0 + + + 6658 + 1 + 0 + 0 + 0 + + + 6659 + 1 + 0 + 0 + 0 + + + 6660 + 1 + 0 + 0 + 0 + + + 6661 + 1 + 0 + 0 + 0 + + + 6662 + 1 + 0 + 0 + 0 + + + 6663 + 1 + 0 + 0 + 0 + + + 6664 + 60 + 0 + 0 + 0 + + + 6665 + 1 + 0 + 0 + 0 + + + 6666 + 1 + 0 + 0 + 0 + + + 6667 + 1 + 0 + 0 + 0 + + + 6668 + 1 + 0 + 0 + 0 + + + 6669 + 1 + 0 + 0 + 0 + + + 6670 + 1 + 0 + 0 + 0 + + + 6671 + 1 + 0 + 0 + 0 + + + 6672 + 1 + 0 + 0 + 0 + + + 6673 + 1 + 0 + 0 + 0 + + + 6674 + 10 + 0 + 0 + 0 + + + 6675 + 1 + 0 + 0 + 0 + + + 6676 + 1 + 0 + 0 + 0 + + + 6677 + 5 + 0 + 0 + 0 + + + 6678 + 5 + 0 + 0 + 0 + + + 6679 + 5 + 0 + 0 + 0 + + + 6680 + 5 + 0 + 0 + 0 + + + 6681 + 2 + 0 + 0 + 0 + + + 6682 + 2 + 0 + 0 + 0 + + + 6683 + 2 + 0 + 0 + 0 + + + 6684 + 2 + 0 + 0 + 0 + + + 6685 + 200 + 0 + 0 + 0 + + + 6686 + 200 + 0 + 0 + 0 + + + 6687 + 175 + 0 + 0 + 0 + + + 6688 + 175 + 0 + 0 + 0 + + + 6689 + 150 + 0 + 0 + 0 + + + 6690 + 150 + 0 + 0 + 0 + + + 6691 + 125 + 0 + 0 + 0 + + + 6692 + 125 + 0 + 0 + 0 + + + 6693 + 1 + 0 + 0 + 0 + + + 6694 + 1 + 0 + 0 + 0 + + + 6695 + 1 + 0 + 0 + 0 + + + 6696 + 1 + 0 + 0 + 0 + + + 6697 + 4 + 0 + 0 + 0 + + + 6698 + 4 + 0 + 0 + 0 + + + 6699 + 1 + 0 + 0 + 0 + + + 6700 + 1 + 0 + 0 + 0 + + + 6701 + 4 + 0 + 0 + 0 + + + 6702 + 4 + 0 + 0 + 0 + + + 6703 + 8 + 0 + 0 + 0 + + + 6704 + 8 + 0 + 0 + 0 + + + 6705 + 350 + 0 + 0 + 0 + + + 6706 + 350 + 0 + 0 + 0 + + + 6707 + 1 + 0 + 0 + 0 + + + 6708 + 1 + 0 + 0 + 0 + + + 6709 + 1 + 0 + 0 + 0 + + + 6710 + 166 + 0 + 0 + 0 + + + 6711 + 1 + 0 + 0 + 0 + + + 6712 + 1 + 0 + 0 + 0 + + + 6713 + 5 + 0 + 0 + 0 + + + 6714 + 5 + 0 + 0 + 0 + + + 6715 + 1 + 0 + 0 + 0 + + + 6716 + 1 + 0 + 0 + 0 + + + 6717 + 20000 + 0 + 0 + 0 + + + 6718 + 1 + 0 + 0 + 0 + + + 6719 + 1 + 0 + 0 + 0 + + + 6720 + 200 + 0 + 0 + 0 + + + 6721 + 1 + 0 + 0 + 0 + + + 6722 + 1 + 0 + 0 + 0 + + + 6723 + 1 + 0 + 0 + 0 + + + 6724 + 8000 + 0 + 0 + 0 + + + 6725 + 8000 + 0 + 0 + 0 + + + 6726 + 17000 + 0 + 0 + 0 + + + 6727 + 45000 + 0 + 0 + 0 + + + 6728 + 1 + 0 + 0 + 0 + + + 6729 + 1 + 0 + 0 + 0 + + + 6730 + 1 + 0 + 0 + 0 + + + 6731 + 10000 + 0 + 0 + 0 + + + 6732 + 10000 + 0 + 0 + 0 + + + 6733 + 10000 + 0 + 0 + 0 + + + 6734 + 10000 + 0 + 0 + 0 + + + 6735 + 10000 + 0 + 0 + 0 + + + 6736 + 10000 + 0 + 0 + 0 + + + 6737 + 10000 + 0 + 0 + 0 + + + 6738 + 10000 + 0 + 0 + 0 + + + 6739 + 55000 + 0 + 0 + 0 + + + 6740 + 55000 + 0 + 0 + 0 + + + 6741 + 1800 + 0 + 0 + 0 + + + 6742 + 1800 + 0 + 0 + 0 + + + 6743 + 54999 + 0 + 0 + 0 + + + 6744 + 54999 + 0 + 0 + 0 + + + 6745 + 50 + 0 + 0 + 0 + + + 6746 + 500 + 0 + 0 + 0 + + + 6747 + 1 + 0 + 0 + 0 + + + 6748 + 1 + 0 + 0 + 0 + + + 6749 + 1 + 0 + 0 + 0 + + + 6750 + 40 + 0 + 0 + 0 + + + 6751 + 1 + 0 + 0 + 0 + + + 6752 + 30 + 0 + 0 + 0 + + + 6753 + 1 + 0 + 0 + 0 + + + 6754 + 1 + 0 + 0 + 0 + + + 6755 + 1 + 0 + 0 + 0 + + + 6756 + 1 + 0 + 0 + 0 + + + 6757 + 1 + 0 + 0 + 0 + + + 6758 + 1 + 0 + 0 + 0 + + + 6759 + 1 + 0 + 0 + 0 + + + 6760 + 625 + 0 + 0 + 0 + + + 6761 + 625 + 0 + 0 + 0 + + + 6762 + 625 + 0 + 0 + 0 + + + 6763 + 625 + 0 + 0 + 0 + + + 6764 + 625 + 0 + 0 + 0 + + + 6765 + 625 + 0 + 0 + 0 + + + 6766 + 1 + 0 + 0 + 0 + + + 6767 + 1 + 0 + 0 + 0 + + + 6768 + 1 + 0 + 0 + 0 + + + 6769 + 1 + 0 + 0 + 0 + + + 6770 + 1 + 0 + 0 + 0 + + + 6771 + 1 + 0 + 0 + 0 + + + 6772 + 1 + 0 + 0 + 0 + + + 6773 + 1 + 0 + 0 + 0 + + + 6774 + 1 + 0 + 0 + 0 + + + 6775 + 1 + 0 + 0 + 0 + + + 6776 + 1 + 0 + 0 + 0 + + + 6777 + 1 + 0 + 0 + 0 + + + 6778 + 1 + 0 + 0 + 0 + + + 6779 + 1 + 0 + 0 + 0 + + + 6780 + 1 + 0 + 0 + 0 + + + 6781 + 1 + 0 + 0 + 0 + + + 6782 + 1 + 0 + 0 + 0 + + + 6783 + 1 + 0 + 0 + 0 + + + 6784 + 1 + 0 + 0 + 0 + + + 6785 + 1 + 0 + 0 + 0 + + + 6786 + 1 + 0 + 0 + 0 + + + 6787 + 1 + 0 + 0 + 0 + + + 6788 + 1 + 0 + 0 + 0 + + + 6789 + 1 + 0 + 0 + 0 + + + 6790 + 1 + 0 + 0 + 0 + + + 6791 + 1 + 0 + 0 + 0 + + + 6792 + 1 + 0 + 0 + 0 + + + 6793 + 1 + 0 + 0 + 0 + + + 6794 + 30 + 0 + 0 + 0 + + + 6795 + 30 + 0 + 0 + 0 + + + 6796 + 1 + 0 + 0 + 0 + + + 6797 + 1 + 0 + 0 + 0 + + + 6798 + 1 + 0 + 0 + 0 + + + 6799 + 1 + 0 + 0 + 0 + + + 6800 + 1 + 0 + 0 + 0 + + + 6801 + 1 + 0 + 0 + 0 + + + 6802 + 1 + 0 + 0 + 0 + + + 6803 + 1 + 0 + 0 + 0 + + + 6804 + 1 + 0 + 0 + 0 + + + 6805 + 1 + 0 + 0 + 0 + + + 6806 + 1 + 0 + 0 + 0 + + + 6807 + 1 + 0 + 0 + 0 + + + 6808 + 1 + 0 + 0 + 0 + + + 6809 + 66000 + 0 + 0 + 0 + + + 6810 + 1 + 0 + 0 + 0 + + + 6811 + 1 + 0 + 0 + 0 + + + 6812 + 1 + 0 + 0 + 0 + + + 6813 + 66000 + 0 + 0 + 0 + + + 6814 + 10 + 0 + 0 + 0 + + + 6815 + 10 + 0 + 0 + 0 + + + 6816 + 1 + 0 + 0 + 0 + + + 6817 + 1 + 0 + 0 + 0 + + + 6818 + 1 + 0 + 0 + 0 + + + 6819 + 1 + 0 + 0 + 0 + + + 6820 + 1 + 0 + 0 + 0 + + + 6821 + 1 + 0 + 0 + 0 + + + 6822 + 1 + 0 + 0 + 0 + + + 6823 + 1 + 0 + 0 + 0 + + + 6824 + 1 + 0 + 0 + 0 + + + 6825 + 1 + 0 + 0 + 0 + + + 6826 + 1 + 0 + 0 + 0 + + + 6827 + 1 + 0 + 0 + 0 + + + 6828 + 1 + 0 + 0 + 0 + + + 6829 + 1 + 0 + 0 + 0 + + + 6830 + 1 + 0 + 0 + 0 + + + 6831 + 1 + 0 + 0 + 0 + + + 6832 + 1 + 0 + 0 + 0 + + + 6833 + 1 + 0 + 0 + 0 + + + 6834 + 1 + 0 + 0 + 0 + + + 6835 + 1 + 0 + 0 + 0 + + + 6836 + 1 + 0 + 0 + 0 + + + 6837 + 1 + 0 + 0 + 0 + + + 6838 + 1 + 0 + 0 + 0 + + + 6839 + 1 + 0 + 0 + 0 + + + 6840 + 1 + 0 + 0 + 0 + + + 6841 + 1 + 0 + 0 + 0 + + + 6842 + 1 + 0 + 0 + 0 + + + 6843 + 1 + 0 + 0 + 0 + + + 6844 + 1 + 0 + 0 + 0 + + + 6845 + 1 + 0 + 0 + 0 + + + 6846 + 1 + 0 + 0 + 0 + + + 6847 + 1 + 0 + 0 + 0 + + + 6848 + 1 + 0 + 0 + 0 + + + 6849 + 1 + 0 + 0 + 0 + + + 6850 + 1 + 0 + 0 + 0 + + + 6851 + 1 + 0 + 0 + 0 + + + 6852 + 1 + 0 + 0 + 0 + + + 6853 + 1 + 0 + 0 + 0 + + + 6854 + 1 + 0 + 0 + 0 + + + 6855 + 1 + 0 + 0 + 0 + + + 6856 + 1 + 0 + 0 + 0 + + + 6857 + 1 + 0 + 0 + 0 + + + 6858 + 1 + 0 + 0 + 0 + + + 6859 + 1 + 0 + 0 + 0 + + + 6860 + 1 + 0 + 0 + 0 + + + 6861 + 1 + 0 + 0 + 0 + + + 6862 + 1 + 0 + 0 + 0 + + + 6863 + 1 + 0 + 0 + 0 + + + 6864 + 60000 + 0 + 0 + 0 + + + 6865 + 1 + 0 + 0 + 0 + + + 6866 + 1 + 0 + 0 + 0 + + + 6867 + 1 + 0 + 0 + 0 + + + 6868 + 1 + 0 + 0 + 0 + + + 6869 + 1 + 0 + 0 + 0 + + + 6870 + 1 + 0 + 0 + 0 + + + 6871 + 1 + 0 + 0 + 0 + + + 6872 + 1 + 0 + 0 + 0 + + + 6873 + 1 + 0 + 0 + 0 + + + 6874 + 1 + 0 + 0 + 0 + + + 6875 + 1 + 0 + 0 + 0 + + + 6876 + 1 + 0 + 0 + 0 + + + 6877 + 1 + 0 + 0 + 0 + + + 6878 + 1 + 0 + 0 + 0 + + + 6879 + 1 + 0 + 0 + 0 + + + 6880 + 1 + 0 + 0 + 0 + + + 6881 + 1 + 0 + 0 + 0 + + + 6882 + 1 + 0 + 0 + 0 + + + 6883 + 1 + 0 + 0 + 0 + + + 6884 + 1 + 0 + 0 + 0 + + + 6885 + 1 + 0 + 0 + 0 + + + 6886 + 1 + 0 + 0 + 0 + + + 6887 + 1 + 0 + 0 + 0 + + + 6888 + 1 + 0 + 0 + 0 + + + 6889 + 500 + 0 + 0 + 0 + + + 6890 + 500 + 0 + 0 + 0 + + + 6891 + 1 + 0 + 0 + 0 + + + 6892 + 1 + 0 + 0 + 0 + + + 6893 + 1 + 0 + 0 + 0 + + + 6894 + 1 + 0 + 0 + 0 + + + 6895 + 1 + 0 + 0 + 0 + + + 6896 + 1 + 0 + 0 + 0 + + + 6897 + 1 + 0 + 0 + 0 + + + 6898 + 1 + 0 + 0 + 0 + + + 6899 + 1 + 0 + 0 + 0 + + + 6900 + 1 + 0 + 0 + 0 + + + 6901 + 1 + 0 + 0 + 0 + + + 6902 + 1 + 0 + 0 + 0 + + + 6903 + 1 + 0 + 0 + 0 + + + 6904 + 1 + 0 + 0 + 0 + + + 6905 + 1 + 0 + 0 + 0 + + + 6906 + 1 + 0 + 0 + 0 + + + 6907 + 1 + 0 + 0 + 0 + + + 6908 + 1200 + 0 + 0 + 0 + + + 6909 + 1200 + 0 + 0 + 0 + + + 6910 + 1500 + 0 + 0 + 0 + + + 6911 + 1500 + 0 + 0 + 0 + + + 6912 + 2000 + 0 + 0 + 0 + + + 6913 + 2000 + 0 + 0 + 0 + + + 6914 + 2500 + 0 + 0 + 0 + + + 6915 + 2500 + 0 + 0 + 0 + + + 6916 + 140000 + 0 + 0 + 0 + + + 6917 + 140000 + 0 + 0 + 0 + + + 6918 + 17000 + 0 + 0 + 0 + + + 6919 + 17000 + 0 + 0 + 0 + + + 6920 + 12000 + 0 + 0 + 0 + + + 6921 + 12000 + 0 + 0 + 0 + + + 6922 + 12000 + 0 + 0 + 0 + + + 6923 + 12000 + 0 + 0 + 0 + + + 6924 + 90000 + 0 + 0 + 0 + + + 6925 + 90000 + 0 + 0 + 0 + + + 6926 + 1 + 0 + 0 + 0 + + + 6927 + 1 + 0 + 0 + 0 + + + 6928 + 1 + 0 + 0 + 0 + + + 6929 + 1 + 0 + 0 + 0 + + + 6930 + 1 + 0 + 0 + 0 + + + 6931 + 1 + 0 + 0 + 0 + + + 6932 + 1 + 0 + 0 + 0 + + + 6933 + 1 + 0 + 0 + 0 + + + 6934 + 1 + 0 + 0 + 0 + + + 6935 + 1 + 0 + 0 + 0 + + + 6936 + 1 + 0 + 0 + 0 + + + 6937 + 1 + 0 + 0 + 0 + + + 6938 + 1 + 0 + 0 + 0 + + + 6939 + 1 + 0 + 0 + 0 + + + 6940 + 1 + 0 + 0 + 0 + + + 6941 + 1 + 0 + 0 + 0 + + + 6942 + 1 + 0 + 0 + 0 + + + 6943 + 1 + 0 + 0 + 0 + + + 6944 + 1 + 0 + 0 + 0 + + + 6945 + 1 + 0 + 0 + 0 + + + 6946 + 1 + 0 + 0 + 0 + + + 6947 + 1 + 0 + 0 + 0 + + + 6948 + 1 + 0 + 0 + 0 + + + 6949 + 1 + 0 + 0 + 0 + + + 6950 + 1 + 0 + 0 + 0 + + + 6951 + 1 + 0 + 0 + 0 + + + 6952 + 1 + 0 + 0 + 0 + + + 6953 + 1 + 0 + 0 + 0 + + + 6954 + 1 + 0 + 0 + 0 + + + 6955 + 1 + 0 + 0 + 0 + + + 6956 + 1 + 0 + 0 + 0 + + + 6957 + 1 + 0 + 0 + 0 + + + 6958 + 1 + 0 + 0 + 0 + + + 6959 + 1 + 0 + 0 + 0 + + + 6960 + 1 + 0 + 0 + 0 + + + 6961 + 25 + 0 + 0 + 0 + + + 6962 + 25 + 0 + 0 + 0 + + + 6963 + 25 + 0 + 0 + 0 + + + 6964 + 6 + 0 + 0 + 0 + + + 6965 + 25 + 0 + 0 + 0 + + + 6966 + 1 + 0 + 0 + 0 + + + 6967 + 6 + 0 + 0 + 0 + + + 6968 + 25 + 0 + 0 + 0 + + + 6969 + 6 + 0 + 0 + 0 + + + 6970 + 1 + 0 + 0 + 0 + + + 6971 + 1 + 0 + 0 + 0 + + + 6972 + 1 + 0 + 0 + 0 + + + 6973 + 1 + 0 + 0 + 0 + + + 6974 + 1 + 0 + 0 + 0 + + + 6975 + 1 + 0 + 0 + 0 + + + 6976 + 1 + 0 + 0 + 0 + + + 6977 + 1 + 0 + 0 + 0 + + + 6978 + 1 + 0 + 0 + 0 + + + 6979 + 1 + 0 + 0 + 0 + + + 6980 + 1 + 0 + 0 + 0 + + + 6981 + 1 + 0 + 0 + 0 + + + 6982 + 1 + 0 + 0 + 0 + + + 6983 + 1 + 0 + 0 + 0 + + + 6984 + 1 + 0 + 0 + 0 + + + 6985 + 1 + 0 + 0 + 0 + + + 6986 + 1 + 0 + 0 + 0 + + + 6987 + 1 + 0 + 0 + 0 + + + 6988 + 1 + 0 + 0 + 0 + + + 6989 + 1 + 0 + 0 + 0 + + + 6990 + 1 + 0 + 0 + 0 + + + 6991 + 1 + 0 + 0 + 0 + + + 6992 + 1 + 0 + 0 + 0 + + + 6993 + 1 + 0 + 0 + 0 + + + 6994 + 1 + 0 + 0 + 0 + + + 6995 + 1 + 0 + 0 + 0 + + + 6996 + 1 + 0 + 0 + 0 + + + 6997 + 1 + 0 + 0 + 0 + + + 6998 + 1 + 0 + 0 + 0 + + + 6999 + 1 + 0 + 0 + 0 + + + 7000 + 1 + 0 + 0 + 0 + + + 7001 + 1 + 0 + 0 + 0 + + + 7002 + 1 + 0 + 0 + 0 + + + 7003 + 1 + 0 + 0 + 0 + + + 7004 + 1 + 0 + 0 + 0 + + + 7005 + 1 + 0 + 0 + 0 + + + 7006 + 1 + 0 + 0 + 0 + + + 7007 + 1 + 0 + 0 + 0 + + + 7008 + 1 + 0 + 0 + 0 + + + 7009 + 1 + 0 + 0 + 0 + + + 7010 + 1 + 0 + 0 + 0 + + + 7011 + 1 + 0 + 0 + 0 + + + 7012 + 1 + 0 + 0 + 0 + + + 7013 + 1 + 0 + 0 + 0 + + + 7014 + 1 + 0 + 0 + 0 + + + 7015 + 1 + 0 + 0 + 0 + + + 7016 + 1 + 0 + 0 + 0 + + + 7017 + 1 + 0 + 0 + 0 + + + 7018 + 1 + 0 + 0 + 0 + + + 7019 + 1 + 0 + 0 + 0 + + + 7020 + 1 + 0 + 0 + 0 + + + 7021 + 1 + 0 + 0 + 0 + + + 7022 + 1 + 0 + 0 + 0 + + + 7023 + 1 + 0 + 0 + 0 + + + 7024 + 1 + 0 + 0 + 0 + + + 7025 + 1 + 0 + 0 + 0 + + + 7026 + 1 + 0 + 0 + 0 + + + 7027 + 1 + 0 + 0 + 0 + + + 7028 + 1 + 0 + 0 + 0 + + + 7029 + 1 + 0 + 0 + 0 + + + 7030 + 1 + 0 + 0 + 0 + + + 7031 + 1 + 0 + 0 + 0 + + + 7032 + 1 + 0 + 0 + 0 + + + 7033 + 1 + 0 + 0 + 0 + + + 7034 + 1 + 0 + 0 + 0 + + + 7035 + 1 + 0 + 0 + 0 + + + 7036 + 1 + 0 + 0 + 0 + + + 7037 + 1 + 0 + 0 + 0 + + + 7038 + 1 + 0 + 0 + 0 + + + 7039 + 1 + 0 + 0 + 0 + + + 7040 + 1 + 0 + 0 + 0 + + + 7041 + 1 + 0 + 0 + 0 + + + 7042 + 1 + 0 + 0 + 0 + + + 7043 + 1 + 0 + 0 + 0 + + + 7044 + 1 + 0 + 0 + 0 + + + 7045 + 1 + 0 + 0 + 0 + + + 7046 + 1 + 0 + 0 + 0 + + + 7047 + 1 + 0 + 0 + 0 + + + 7048 + 1 + 0 + 0 + 0 + + + 7049 + 1 + 0 + 0 + 0 + + + 7050 + 1 + 0 + 0 + 0 + + + 7051 + 130 + 0 + 0 + 0 + + + 7052 + 130 + 0 + 0 + 0 + + + 7053 + 130 + 0 + 0 + 0 + + + 7054 + 13 + 0 + 0 + 0 + + + 7055 + 13 + 0 + 0 + 0 + + + 7056 + 12 + 0 + 0 + 0 + + + 7057 + 12 + 0 + 0 + 0 + + + 7058 + 45 + 0 + 0 + 0 + + + 7059 + 45 + 0 + 0 + 0 + + + 7060 + 113 + 0 + 0 + 0 + + + 7061 + 113 + 0 + 0 + 0 + + + 7062 + 13 + 0 + 0 + 0 + + + 7063 + 13 + 0 + 0 + 0 + + + 7064 + 12 + 0 + 0 + 0 + + + 7065 + 12 + 0 + 0 + 0 + + + 7066 + 45 + 0 + 0 + 0 + + + 7067 + 45 + 0 + 0 + 0 + + + 7068 + 113 + 0 + 0 + 0 + + + 7069 + 113 + 0 + 0 + 0 + + + 7070 + 8 + 0 + 0 + 0 + + + 7071 + 8 + 0 + 0 + 0 + + + 7072 + 9 + 0 + 0 + 0 + + + 7073 + 9 + 0 + 0 + 0 + + + 7074 + 7 + 0 + 0 + 0 + + + 7075 + 7 + 0 + 0 + 0 + + + 7076 + 8 + 0 + 0 + 0 + + + 7077 + 8 + 0 + 0 + 0 + + + 7078 + 8 + 0 + 0 + 0 + + + 7079 + 8 + 0 + 0 + 0 + + + 7080 + 42 + 0 + 0 + 0 + + + 7081 + 42 + 0 + 0 + 0 + + + 7082 + 42 + 0 + 0 + 0 + + + 7083 + 42 + 0 + 0 + 0 + + + 7084 + 7 + 0 + 0 + 0 + + + 7085 + 7 + 0 + 0 + 0 + + + 7086 + 104 + 0 + 0 + 0 + + + 7087 + 104 + 0 + 0 + 0 + + + 7088 + 13 + 0 + 0 + 0 + + + 7089 + 13 + 0 + 0 + 0 + + + 7090 + 5 + 0 + 0 + 0 + + + 7091 + 5 + 0 + 0 + 0 + + + 7092 + 5 + 0 + 0 + 0 + + + 7093 + 5 + 0 + 0 + 0 + + + 7094 + 5 + 0 + 0 + 0 + + + 7095 + 5 + 0 + 0 + 0 + + + 7096 + 1 + 0 + 0 + 0 + + + 7097 + 1 + 0 + 0 + 0 + + + 7098 + 1 + 0 + 0 + 0 + + + 7099 + 1 + 0 + 0 + 0 + + + 7100 + 1 + 0 + 0 + 0 + + + 7101 + 1 + 0 + 0 + 0 + + + 7102 + 1 + 0 + 0 + 0 + + + 7103 + 1 + 0 + 0 + 0 + + + 7104 + 1 + 0 + 0 + 0 + + + 7105 + 1 + 0 + 0 + 0 + + + 7106 + 1 + 0 + 0 + 0 + + + 7107 + 1 + 0 + 0 + 0 + + + 7108 + 52 + 0 + 0 + 0 + + + 7109 + 52 + 0 + 0 + 0 + + + 7110 + 300 + 0 + 0 + 0 + + + 7111 + 300 + 0 + 0 + 0 + + + 7112 + 100 + 0 + 0 + 0 + + + 7113 + 100 + 0 + 0 + 0 + + + 7114 + 350 + 0 + 0 + 0 + + + 7115 + 350 + 0 + 0 + 0 + + + 7116 + 350 + 0 + 0 + 0 + + + 7117 + 350 + 0 + 0 + 0 + + + 7118 + 1 + 0 + 0 + 0 + + + 7119 + 1 + 0 + 0 + 0 + + + 7120 + 1 + 0 + 0 + 0 + + + 7121 + 1 + 0 + 0 + 0 + + + 7122 + 300 + 0 + 0 + 0 + + + 7123 + 300 + 0 + 0 + 0 + + + 7124 + 100 + 0 + 0 + 0 + + + 7125 + 100 + 0 + 0 + 0 + + + 7126 + 350 + 0 + 0 + 0 + + + 7127 + 350 + 0 + 0 + 0 + + + 7128 + 300 + 0 + 0 + 0 + + + 7129 + 300 + 0 + 0 + 0 + + + 7130 + 100 + 0 + 0 + 0 + + + 7131 + 100 + 0 + 0 + 0 + + + 7132 + 350 + 0 + 0 + 0 + + + 7133 + 350 + 0 + 0 + 0 + + + 7134 + 300 + 0 + 0 + 0 + + + 7135 + 300 + 0 + 0 + 0 + + + 7136 + 100 + 0 + 0 + 0 + + + 7137 + 100 + 0 + 0 + 0 + + + 7138 + 350 + 0 + 0 + 0 + + + 7139 + 350 + 0 + 0 + 0 + + + 7140 + 2560 + 0 + 0 + 0 + + + 7141 + 1040 + 0 + 0 + 0 + + + 7142 + 25600 + 0 + 0 + 0 + + + 7143 + 1 + 0 + 0 + 0 + + + 7144 + 1 + 0 + 0 + 0 + + + 7145 + 1 + 0 + 0 + 0 + + + 7146 + 1 + 0 + 0 + 0 + + + 7147 + 1 + 0 + 0 + 0 + + + 7148 + 1 + 0 + 0 + 0 + + + 7149 + 1 + 0 + 0 + 0 + + + 7150 + 1 + 0 + 0 + 0 + + + 7151 + 1 + 0 + 0 + 0 + + + 7152 + 1 + 0 + 0 + 0 + + + 7153 + 1 + 0 + 0 + 0 + + + 7154 + 1 + 0 + 0 + 0 + + + 7155 + 18 + 0 + 0 + 0 + + + 7156 + 1 + 0 + 0 + 0 + + + 7157 + 30 + 0 + 0 + 0 + + + 7158 + 220000 + 0 + 0 + 0 + + + 7159 + 200 + 0 + 0 + 0 + + + 7160 + 1 + 0 + 0 + 0 + + + 7161 + 200 + 0 + 0 + 0 + + + 7162 + 5 + 0 + 0 + 0 + + + 7163 + 5 + 0 + 0 + 0 + + + 7164 + 22 + 0 + 0 + 0 + + + 7165 + 22 + 0 + 0 + 0 + + + 7166 + 26 + 0 + 0 + 0 + + + 7167 + 26 + 0 + 0 + 0 + + + 7168 + 27 + 0 + 0 + 0 + + + 7169 + 27 + 0 + 0 + 0 + + + 7170 + 54 + 0 + 0 + 0 + + + 7171 + 54 + 0 + 0 + 0 + + + 7172 + 8 + 0 + 0 + 0 + + + 7173 + 8 + 0 + 0 + 0 + + + 7174 + 11 + 0 + 0 + 0 + + + 7175 + 11 + 0 + 0 + 0 + + + 7176 + 12 + 0 + 0 + 0 + + + 7177 + 12 + 0 + 0 + 0 + + + 7178 + 90 + 0 + 0 + 0 + + + 7179 + 90 + 0 + 0 + 0 + + + 7180 + 12 + 0 + 0 + 0 + + + 7181 + 12 + 0 + 0 + 0 + + + 7182 + 24 + 0 + 0 + 0 + + + 7183 + 24 + 0 + 0 + 0 + + + 7184 + 49 + 0 + 0 + 0 + + + 7185 + 49 + 0 + 0 + 0 + + + 7186 + 50 + 0 + 0 + 0 + + + 7187 + 50 + 0 + 0 + 0 + + + 7188 + 100 + 0 + 0 + 0 + + + 7189 + 100 + 0 + 0 + 0 + + + 7190 + 50 + 0 + 0 + 0 + + + 7191 + 50 + 0 + 0 + 0 + + + 7192 + 54 + 0 + 0 + 0 + + + 7193 + 54 + 0 + 0 + 0 + + + 7194 + 154 + 0 + 0 + 0 + + + 7195 + 154 + 0 + 0 + 0 + + + 7196 + 155 + 0 + 0 + 0 + + + 7197 + 155 + 0 + 0 + 0 + + + 7198 + 310 + 0 + 0 + 0 + + + 7199 + 310 + 0 + 0 + 0 + + + 7200 + 155 + 0 + 0 + 0 + + + 7201 + 155 + 0 + 0 + 0 + + + 7202 + 5 + 0 + 0 + 0 + + + 7203 + 5 + 0 + 0 + 0 + + + 7204 + 90 + 0 + 0 + 0 + + + 7205 + 90 + 0 + 0 + 0 + + + 7206 + 91 + 0 + 0 + 0 + + + 7207 + 91 + 0 + 0 + 0 + + + 7208 + 182 + 0 + 0 + 0 + + + 7209 + 182 + 0 + 0 + 0 + + + 7210 + 91 + 0 + 0 + 0 + + + 7211 + 91 + 0 + 0 + 0 + + + 7212 + 21 + 0 + 0 + 0 + + + 7213 + 21 + 0 + 0 + 0 + + + 7214 + 69 + 0 + 0 + 0 + + + 7215 + 69 + 0 + 0 + 0 + + + 7216 + 70 + 0 + 0 + 0 + + + 7217 + 70 + 0 + 0 + 0 + + + 7218 + 140 + 0 + 0 + 0 + + + 7219 + 140 + 0 + 0 + 0 + + + 7220 + 70 + 0 + 0 + 0 + + + 7221 + 70 + 0 + 0 + 0 + + + 7222 + 1 + 0 + 0 + 0 + + + 7223 + 20 + 0 + 0 + 0 + + + 7224 + 84 + 0 + 0 + 0 + + + 7225 + 64 + 0 + 0 + 0 + + + 7226 + 1 + 0 + 0 + 0 + + + 7227 + 1 + 0 + 0 + 0 + + + 7228 + 85 + 0 + 0 + 0 + + + 7229 + 85 + 0 + 0 + 0 + + + 7230 + 149 + 0 + 0 + 0 + + + 7231 + 1 + 0 + 0 + 0 + + + 7232 + 20 + 0 + 0 + 0 + + + 7233 + 84 + 0 + 0 + 0 + + + 7234 + 64 + 0 + 0 + 0 + + + 7235 + 149 + 0 + 0 + 0 + + + 7236 + 1 + 0 + 0 + 0 + + + 7237 + 50 + 0 + 0 + 0 + + + 7238 + 1 + 0 + 0 + 0 + + + 7239 + 1 + 0 + 0 + 0 + + + 7240 + 50 + 0 + 0 + 0 + + + 7241 + 1 + 0 + 0 + 0 + + + 7242 + 50 + 0 + 0 + 0 + + + 7243 + 1 + 0 + 0 + 0 + + + 7244 + 50 + 0 + 0 + 0 + + + 7245 + 1 + 0 + 0 + 0 + + + 7246 + 50 + 0 + 0 + 0 + + + 7247 + 1 + 0 + 0 + 0 + + + 7248 + 1 + 0 + 0 + 0 + + + 7249 + 1 + 0 + 0 + 0 + + + 7250 + 1 + 0 + 0 + 0 + + + 7251 + 1 + 0 + 0 + 0 + + + 7252 + 1 + 0 + 0 + 0 + + + 7253 + 1 + 0 + 0 + 0 + + + 7254 + 1 + 0 + 0 + 0 + + + 7255 + 1 + 0 + 0 + 0 + + + 7256 + 1 + 0 + 0 + 0 + + + 7257 + 50 + 0 + 0 + 0 + + + 7258 + 1 + 0 + 0 + 0 + + + 7259 + 50 + 0 + 0 + 0 + + + 7260 + 1 + 0 + 0 + 0 + + + 7261 + 50 + 0 + 0 + 0 + + + 7262 + 1 + 0 + 0 + 0 + + + 7263 + 50 + 0 + 0 + 0 + + + 7264 + 1 + 0 + 0 + 0 + + + 7265 + 50 + 0 + 0 + 0 + + + 7266 + 1 + 0 + 0 + 0 + + + 7267 + 50 + 0 + 0 + 0 + + + 7268 + 1 + 0 + 0 + 0 + + + 7269 + 1 + 0 + 0 + 0 + + + 7270 + 1 + 0 + 0 + 0 + + + 7271 + 1 + 0 + 0 + 0 + + + 7272 + 1 + 0 + 0 + 0 + + + 7273 + 1 + 0 + 0 + 0 + + + 7274 + 1 + 0 + 0 + 0 + + + 7275 + 1 + 0 + 0 + 0 + + + 7276 + 1 + 0 + 0 + 0 + + + 7277 + 1 + 0 + 0 + 0 + + + 7278 + 1 + 0 + 0 + 0 + + + 7279 + 1 + 0 + 0 + 0 + + + 7280 + 1 + 0 + 0 + 0 + + + 7281 + 1 + 0 + 0 + 0 + + + 7282 + 1 + 0 + 0 + 0 + + + 7283 + 1 + 0 + 0 + 0 + + + 7284 + 1 + 0 + 0 + 0 + + + 7285 + 1 + 0 + 0 + 0 + + + 7286 + 1 + 0 + 0 + 0 + + + 7287 + 50 + 0 + 0 + 0 + + + 7288 + 1 + 0 + 0 + 0 + + + 7289 + 50 + 0 + 0 + 0 + + + 7290 + 1 + 0 + 0 + 0 + + + 7291 + 50 + 0 + 0 + 0 + + + 7292 + 1 + 0 + 0 + 0 + + + 7293 + 50 + 0 + 0 + 0 + + + 7294 + 1 + 0 + 0 + 0 + + + 7295 + 50 + 0 + 0 + 0 + + + 7296 + 1 + 0 + 0 + 0 + + + 7297 + 1 + 0 + 0 + 0 + + + 7298 + 1 + 0 + 0 + 0 + + + 7299 + 1 + 0 + 0 + 0 + + + 7300 + 1 + 0 + 0 + 0 + + + 7301 + 1 + 0 + 0 + 0 + + + 7302 + 1 + 0 + 0 + 0 + + + 7303 + 1 + 0 + 0 + 0 + + + 7304 + 1 + 0 + 0 + 0 + + + 7305 + 1 + 0 + 0 + 0 + + + 7306 + 50 + 0 + 0 + 0 + + + 7307 + 1 + 0 + 0 + 0 + + + 7308 + 50 + 0 + 0 + 0 + + + 7309 + 1 + 0 + 0 + 0 + + + 7310 + 50 + 0 + 0 + 0 + + + 7311 + 1 + 0 + 0 + 0 + + + 7312 + 50 + 0 + 0 + 0 + + + 7313 + 1 + 0 + 0 + 0 + + + 7314 + 50 + 0 + 0 + 0 + + + 7315 + 1 + 0 + 0 + 0 + + + 7316 + 50 + 0 + 0 + 0 + + + 7317 + 1 + 0 + 0 + 0 + + + 7318 + 50 + 0 + 0 + 0 + + + 7319 + 225 + 0 + 0 + 0 + + + 7320 + 225 + 0 + 0 + 0 + + + 7321 + 225 + 0 + 0 + 0 + + + 7322 + 225 + 0 + 0 + 0 + + + 7323 + 225 + 0 + 0 + 0 + + + 7324 + 225 + 0 + 0 + 0 + + + 7325 + 225 + 0 + 0 + 0 + + + 7326 + 225 + 0 + 0 + 0 + + + 7327 + 225 + 0 + 0 + 0 + + + 7328 + 225 + 0 + 0 + 0 + + + 7329 + 15 + 0 + 0 + 0 + + + 7330 + 15 + 0 + 0 + 0 + + + 7331 + 15 + 0 + 0 + 0 + + + 7332 + 1632 + 0 + 0 + 0 + + + 7333 + 1632 + 0 + 0 + 0 + + + 7334 + 5440 + 0 + 0 + 0 + + + 7335 + 5440 + 0 + 0 + 0 + + + 7336 + 54400 + 0 + 0 + 0 + + + 7337 + 54400 + 0 + 0 + 0 + + + 7338 + 16325 + 0 + 0 + 0 + + + 7339 + 16325 + 0 + 0 + 0 + + + 7340 + 5440 + 0 + 0 + 0 + + + 7341 + 5440 + 0 + 0 + 0 + + + 7342 + 54400 + 0 + 0 + 0 + + + 7343 + 54400 + 0 + 0 + 0 + + + 7344 + 1632 + 0 + 0 + 0 + + + 7345 + 1632 + 0 + 0 + 0 + + + 7346 + 5440 + 0 + 0 + 0 + + + 7347 + 5440 + 0 + 0 + 0 + + + 7348 + 54400 + 0 + 0 + 0 + + + 7349 + 54400 + 0 + 0 + 0 + + + 7350 + 1632 + 0 + 0 + 0 + + + 7351 + 1632 + 0 + 0 + 0 + + + 7352 + 5440 + 0 + 0 + 0 + + + 7353 + 5440 + 0 + 0 + 0 + + + 7354 + 54400 + 0 + 0 + 0 + + + 7355 + 54400 + 0 + 0 + 0 + + + 7356 + 1632 + 0 + 0 + 0 + + + 7357 + 1632 + 0 + 0 + 0 + + + 7358 + 5440 + 0 + 0 + 0 + + + 7359 + 5440 + 0 + 0 + 0 + + + 7360 + 54400 + 0 + 0 + 0 + + + 7361 + 54400 + 0 + 0 + 0 + + + 7362 + 850 + 0 + 0 + 0 + + + 7363 + 850 + 0 + 0 + 0 + + + 7364 + 850 + 0 + 0 + 0 + + + 7365 + 850 + 0 + 0 + 0 + + + 7366 + 750 + 0 + 0 + 0 + + + 7367 + 750 + 0 + 0 + 0 + + + 7368 + 750 + 0 + 0 + 0 + + + 7369 + 750 + 0 + 0 + 0 + + + 7370 + 7800 + 0 + 0 + 0 + + + 7371 + 7800 + 0 + 0 + 0 + + + 7372 + 7800 + 0 + 0 + 0 + + + 7373 + 7800 + 0 + 0 + 0 + + + 7374 + 9360 + 0 + 0 + 0 + + + 7375 + 9360 + 0 + 0 + 0 + + + 7376 + 9360 + 0 + 0 + 0 + + + 7377 + 9360 + 0 + 0 + 0 + + + 7378 + 3900 + 0 + 0 + 0 + + + 7379 + 3900 + 0 + 0 + 0 + + + 7380 + 3900 + 0 + 0 + 0 + + + 7381 + 3900 + 0 + 0 + 0 + + + 7382 + 4320 + 0 + 0 + 0 + + + 7383 + 4320 + 0 + 0 + 0 + + + 7384 + 4320 + 0 + 0 + 0 + + + 7385 + 4320 + 0 + 0 + 0 + + + 7386 + 2 + 0 + 0 + 0 + + + 7387 + 2 + 0 + 0 + 0 + + + 7388 + 2 + 0 + 0 + 0 + + + 7389 + 2 + 0 + 0 + 0 + + + 7390 + 15 + 0 + 0 + 0 + + + 7391 + 15 + 0 + 0 + 0 + + + 7392 + 15 + 0 + 0 + 0 + + + 7393 + 15 + 0 + 0 + 0 + + + 7394 + 2 + 0 + 0 + 0 + + + 7395 + 2 + 0 + 0 + 0 + + + 7396 + 2 + 0 + 0 + 0 + + + 7397 + 2 + 0 + 0 + 0 + + + 7398 + 80000 + 0 + 0 + 0 + + + 7399 + 120000 + 0 + 0 + 0 + + + 7400 + 15000 + 0 + 0 + 0 + + + 7401 + 80000 + 0 + 0 + 0 + + + 7402 + 120000 + 0 + 0 + 0 + + + 7403 + 15000 + 0 + 0 + 0 + + + 7404 + 4 + 0 + 0 + 0 + + + 7405 + 4 + 0 + 0 + 0 + + + 7406 + 4 + 0 + 0 + 0 + + + 7407 + 220000 + 0 + 0 + 0 + + + 7408 + 1 + 0 + 0 + 0 + + + 7409 + 1 + 0 + 0 + 0 + + + 7410 + 1 + 0 + 0 + 0 + + + 7411 + 1 + 0 + 0 + 0 + + + 7412 + 1 + 0 + 0 + 0 + + + 7413 + 1 + 0 + 0 + 0 + + + 7414 + 1 + 0 + 0 + 0 + + + 7415 + 1 + 0 + 0 + 0 + + + 7416 + 600 + 0 + 0 + 0 + + + 7417 + 600 + 0 + 0 + 0 + + + 7418 + 400 + 0 + 0 + 0 + + + 7419 + 400 + 0 + 0 + 0 + + + 7420 + 1 + 0 + 0 + 0 + + + 7421 + 300 + 0 + 0 + 0 + + + 7422 + 1 + 0 + 0 + 0 + + + 7423 + 1 + 0 + 0 + 0 + + + 7424 + 1 + 0 + 0 + 0 + + + 7425 + 1 + 0 + 0 + 0 + + + 7426 + 1 + 0 + 0 + 0 + + + 7427 + 1 + 0 + 0 + 0 + + + 7428 + 1 + 0 + 0 + 0 + + + 7429 + 1 + 0 + 0 + 0 + + + 7430 + 1 + 0 + 0 + 0 + + + 7431 + 1 + 0 + 0 + 0 + + + 7432 + 10 + 0 + 0 + 0 + + + 7433 + 35 + 0 + 0 + 0 + + + 7434 + 35 + 0 + 0 + 0 + + + 7435 + 50 + 0 + 0 + 0 + + + 7436 + 50 + 0 + 0 + 0 + + + 7437 + 325 + 0 + 0 + 0 + + + 7438 + 325 + 0 + 0 + 0 + + + 7439 + 1920 + 0 + 0 + 0 + + + 7440 + 1920 + 0 + 0 + 0 + + + 7441 + 1660 + 0 + 0 + 0 + + + 7442 + 1660 + 0 + 0 + 0 + + + 7443 + 3200 + 0 + 0 + 0 + + + 7444 + 3200 + 0 + 0 + 0 + + + 7445 + 14400 + 0 + 0 + 0 + + + 7446 + 14400 + 0 + 0 + 0 + + + 7447 + 8000 + 0 + 0 + 0 + + + 7448 + 8000 + 0 + 0 + 0 + + + 7449 + 41500 + 0 + 0 + 0 + + + 7450 + 41500 + 0 + 0 + 0 + + + 7451 + 25600 + 0 + 0 + 0 + + + 7452 + 25600 + 0 + 0 + 0 + + + 7453 + 50 + 0 + 0 + 0 + + + 7454 + 100 + 0 + 0 + 0 + + + 7455 + 250 + 0 + 0 + 0 + + + 7456 + 500 + 0 + 0 + 0 + + + 7457 + 1000 + 0 + 0 + 0 + + + 7458 + 1500 + 0 + 0 + 0 + + + 7459 + 2500 + 0 + 0 + 0 + + + 7460 + 5000 + 0 + 0 + 0 + + + 7461 + 100000 + 0 + 0 + 0 + + + 7462 + 100000 + 0 + 0 + 0 + + + 7463 + 2 + 0 + 0 + 0 + + + 7464 + 1 + 0 + 0 + 0 + + + 7465 + 1 + 0 + 0 + 0 + + + 7466 + 1 + 0 + 0 + 0 + + + 7467 + 1 + 0 + 0 + 0 + + + 7468 + 10 + 0 + 0 + 0 + + + 7469 + 1 + 0 + 0 + 0 + + + 7470 + 1 + 0 + 0 + 0 + + + 7471 + 1 + 0 + 0 + 0 + + + 7472 + 1 + 0 + 0 + 0 + + + 7473 + 1 + 0 + 0 + 0 + + + 7474 + 1 + 0 + 0 + 0 + + + 7475 + 1 + 0 + 0 + 0 + + + 7476 + 1 + 0 + 0 + 0 + + + 7477 + 1 + 0 + 0 + 0 + + + 7478 + 1 + 0 + 0 + 0 + + + 7479 + 20 + 0 + 0 + 0 + + + 7480 + 1 + 0 + 0 + 0 + + + 7481 + 1 + 0 + 0 + 0 + + + 7482 + 1 + 0 + 0 + 0 + + + 7483 + 1 + 0 + 0 + 0 + + + 7484 + 1 + 0 + 0 + 0 + + + 7485 + 1 + 0 + 0 + 0 + + + 7486 + 1 + 0 + 0 + 0 + + + 7487 + 1 + 0 + 0 + 0 + + + 7488 + 1 + 0 + 0 + 0 + + + 7489 + 1 + 0 + 0 + 0 + + + 7490 + 1 + 0 + 0 + 0 + + + 7491 + 1 + 0 + 0 + 0 + + + 7492 + 1 + 0 + 0 + 0 + + + 7493 + 1 + 0 + 0 + 0 + + + 7494 + 1 + 0 + 0 + 0 + + + 7495 + 1 + 0 + 0 + 0 + + + 7496 + 1 + 0 + 0 + 0 + + + 7497 + 30 + 0 + 0 + 0 + + + 7498 + 1 + 0 + 0 + 0 + + + 7499 + 1 + 0 + 0 + 0 + + + 7500 + 1 + 0 + 0 + 0 + + + 7501 + 1 + 0 + 0 + 0 + + + 7502 + 1 + 0 + 0 + 0 + + + 7503 + 1 + 0 + 0 + 0 + + + 7504 + 1 + 0 + 0 + 0 + + + 7505 + 1 + 0 + 0 + 0 + + + 7506 + 1 + 0 + 0 + 0 + + + 7507 + 1 + 0 + 0 + 0 + + + 7508 + 2 + 0 + 0 + 0 + + + 7509 + 1 + 0 + 0 + 0 + + + 7510 + 1 + 0 + 0 + 0 + + + 7511 + 10 + 0 + 0 + 0 + + + 7512 + 6 + 0 + 0 + 0 + + + 7513 + 3 + 0 + 0 + 0 + + + 7514 + 2 + 0 + 0 + 0 + + + 7515 + 1 + 0 + 0 + 0 + + + 7516 + 1 + 0 + 0 + 0 + + + 7517 + 1 + 0 + 0 + 0 + + + 7518 + 1 + 0 + 0 + 0 + + + 7519 + 1 + 0 + 0 + 0 + + + 7520 + 1 + 0 + 0 + 0 + + + 7521 + 50 + 0 + 0 + 0 + + + 7522 + 50 + 0 + 0 + 0 + + + 7523 + 40 + 0 + 0 + 0 + + + 7524 + 30 + 0 + 0 + 0 + + + 7525 + 20 + 0 + 0 + 0 + + + 7526 + 10 + 0 + 0 + 0 + + + 7527 + 1 + 0 + 0 + 0 + + + 7528 + 1 + 0 + 0 + 0 + + + 7529 + 100 + 0 + 0 + 0 + + + 7530 + 100 + 0 + 0 + 0 + + + 7531 + 1 + 0 + 0 + 0 + + + 7532 + 1 + 0 + 0 + 0 + + + 7533 + 1 + 0 + 0 + 0 + + + 7534 + 1 + 0 + 0 + 0 + + + 7535 + 1 + 0 + 0 + 0 + + + 7536 + 1 + 0 + 0 + 0 + + + 7537 + 1 + 0 + 0 + 0 + + + 7538 + 1 + 0 + 0 + 0 + + + 7539 + 1 + 0 + 0 + 0 + + + 7540 + 1 + 0 + 0 + 0 + + + 7541 + 1 + 0 + 0 + 0 + + + 7542 + 50 + 0 + 0 + 0 + + + 7543 + 20 + 0 + 0 + 0 + + + 7544 + 4 + 0 + 0 + 0 + + + 7545 + 6 + 0 + 0 + 0 + + + 7546 + 10 + 0 + 0 + 0 + + + 7547 + 5 + 0 + 0 + 0 + + + 7548 + 1 + 0 + 0 + 0 + + + 7549 + 1 + 0 + 0 + 0 + + + 7550 + 1 + 0 + 0 + 0 + + + 7551 + 1 + 0 + 0 + 0 + + + 7552 + 1 + 0 + 0 + 0 + + + 7553 + 1 + 0 + 0 + 0 + + + 7554 + 1 + 0 + 0 + 0 + + + 7555 + 1 + 0 + 0 + 0 + + + 7556 + 1 + 0 + 0 + 0 + + + 7557 + 1 + 0 + 0 + 0 + + + 7558 + 1 + 0 + 0 + 0 + + + 7559 + 1 + 0 + 0 + 0 + + + 7560 + 1 + 0 + 0 + 0 + + + 7561 + 1 + 0 + 0 + 0 + + + 7562 + 1 + 0 + 0 + 0 + + + 7563 + 1 + 0 + 0 + 0 + + + 7564 + 1 + 0 + 0 + 0 + + + 7565 + 1 + 0 + 0 + 0 + + + 7566 + 100 + 0 + 0 + 0 + + + 7567 + 100 + 0 + 0 + 0 + + + 7568 + 150 + 0 + 0 + 0 + + + 7569 + 150 + 0 + 0 + 0 + + + 7570 + 1 + 0 + 0 + 0 + + + 7571 + 1 + 0 + 0 + 0 + + + 7572 + 5 + 0 + 0 + 0 + + + 7573 + 5 + 0 + 0 + 0 + + + 7574 + 5 + 0 + 0 + 0 + + + 7575 + 5 + 0 + 0 + 0 + + + 7576 + 1 + 0 + 0 + 0 + + + 7577 + 1 + 0 + 0 + 0 + + + 7578 + 1 + 0 + 0 + 0 + + + 7579 + 1 + 0 + 0 + 0 + + + 7580 + 1 + 0 + 0 + 0 + + + 7581 + 1 + 0 + 0 + 0 + + + 7582 + 1 + 0 + 0 + 0 + + + 7583 + 1 + 0 + 0 + 0 + + + 7584 + 1 + 0 + 0 + 0 + + + 7585 + 1 + 0 + 0 + 0 + + + 7586 + 1 + 0 + 0 + 0 + + + 7587 + 1 + 0 + 0 + 0 + + + 7588 + 1 + 0 + 0 + 0 + + + 7589 + 1 + 0 + 0 + 0 + + + 7590 + 1 + 0 + 0 + 0 + + + 7591 + 1 + 0 + 0 + 0 + + + 7592 + 1 + 0 + 0 + 0 + + + 7593 + 1 + 0 + 0 + 0 + + + 7594 + 1 + 0 + 0 + 0 + + + 7595 + 1 + 0 + 0 + 0 + + + 7596 + 1 + 0 + 0 + 0 + + + 7597 + 1 + 0 + 0 + 0 + + + 7598 + 1 + 0 + 0 + 0 + + + 7599 + 1 + 0 + 0 + 0 + + + 7600 + 1 + 0 + 0 + 0 + + + 7601 + 1 + 0 + 0 + 0 + + + 7602 + 1 + 0 + 0 + 0 + + + 7603 + 1 + 0 + 0 + 0 + + + 7604 + 1 + 0 + 0 + 0 + + + 7605 + 1 + 0 + 0 + 0 + + + 7606 + 1 + 0 + 0 + 0 + + + 7607 + 1 + 0 + 0 + 0 + + + 7608 + 1 + 0 + 0 + 0 + + + 7609 + 1 + 0 + 0 + 0 + + + 7610 + 1 + 0 + 0 + 0 + + + 7611 + 1 + 0 + 0 + 0 + + + 7612 + 1 + 0 + 0 + 0 + + + 7613 + 1 + 0 + 0 + 0 + + + 7614 + 1 + 0 + 0 + 0 + + + 7615 + 1 + 0 + 0 + 0 + + + 7616 + 1 + 0 + 0 + 0 + + + 7617 + 1 + 0 + 0 + 0 + + + 7618 + 1 + 0 + 0 + 0 + + + 7619 + 1 + 0 + 0 + 0 + + + 7620 + 1 + 0 + 0 + 0 + + + 7621 + 1 + 0 + 0 + 0 + + + 7622 + 1 + 0 + 0 + 0 + + + 7623 + 1 + 0 + 0 + 0 + + + 7624 + 1 + 0 + 0 + 0 + + + 7625 + 1 + 0 + 0 + 0 + + + 7626 + 1 + 0 + 0 + 0 + + + 7627 + 1 + 0 + 0 + 0 + + + 7628 + 1 + 0 + 0 + 0 + + + 7629 + 1 + 0 + 0 + 0 + + + 7630 + 1 + 0 + 0 + 0 + + + 7631 + 1 + 0 + 0 + 0 + + + 7632 + 1 + 0 + 0 + 0 + + + 7633 + 1 + 0 + 0 + 0 + + + 7634 + 1 + 0 + 0 + 0 + + + 7635 + 1 + 0 + 0 + 0 + + + 7636 + 1 + 0 + 0 + 0 + + + 7637 + 1 + 0 + 0 + 0 + + + 7638 + 1 + 0 + 0 + 0 + + + 7639 + 1000 + 0 + 0 + 0 + + + 7640 + 1000 + 0 + 0 + 0 + + + 7641 + 1000 + 0 + 0 + 0 + + + 7642 + 1000 + 0 + 0 + 0 + + + 7643 + 1000 + 0 + 0 + 0 + + + 7644 + 1000 + 0 + 0 + 0 + + + 7645 + 1000 + 0 + 0 + 0 + + + 7646 + 1000 + 0 + 0 + 0 + + + 7647 + 1000 + 0 + 0 + 0 + + + 7648 + 1000 + 0 + 0 + 0 + + + 7649 + 100 + 0 + 0 + 0 + + + 7650 + 200 + 0 + 0 + 0 + + + 7651 + 200 + 0 + 0 + 0 + + + 7652 + 110 + 0 + 0 + 0 + + + 7653 + 110 + 0 + 0 + 0 + + + 7654 + 110 + 0 + 0 + 0 + + + 7655 + 110 + 0 + 0 + 0 + + + 7656 + 110 + 0 + 0 + 0 + + + 7657 + 110 + 0 + 0 + 0 + + + 7658 + 110 + 0 + 0 + 0 + + + 7659 + 110 + 0 + 0 + 0 + + + 7660 + 200 + 0 + 0 + 0 + + + 7661 + 200 + 0 + 0 + 0 + + + 7662 + 200 + 0 + 0 + 0 + + + 7663 + 200 + 0 + 0 + 0 + + + 7664 + 200 + 0 + 0 + 0 + + + 7665 + 200 + 0 + 0 + 0 + + + 7666 + 200 + 0 + 0 + 0 + + + 7667 + 200 + 0 + 0 + 0 + + + 7668 + 3000 + 0 + 0 + 0 + + + 7669 + 3000 + 0 + 0 + 0 + + + 7670 + 1 + 0 + 0 + 0 + + + 7671 + 1 + 0 + 0 + 0 + + + 7672 + 1 + 0 + 0 + 0 + + + 7673 + 1 + 0 + 0 + 0 + + + 7674 + 1 + 0 + 0 + 0 + + + 7675 + 1 + 0 + 0 + 0 + + + 7676 + 1 + 0 + 0 + 0 + + + 7677 + 1 + 0 + 0 + 0 + + + 7678 + 1 + 0 + 0 + 0 + + + 7679 + 1 + 0 + 0 + 0 + + + 7680 + 1 + 0 + 0 + 0 + + + 7681 + 1 + 0 + 0 + 0 + + + 7682 + 1 + 0 + 0 + 0 + + + 7683 + 1 + 0 + 0 + 0 + + + 7684 + 1 + 0 + 0 + 0 + + + 7685 + 1 + 0 + 0 + 0 + + + 7686 + 1 + 0 + 0 + 0 + + + 7687 + 1 + 0 + 0 + 0 + + + 7688 + 1 + 0 + 0 + 0 + + + 7689 + 1 + 0 + 0 + 0 + + + 7690 + 1 + 0 + 0 + 0 + + + 7691 + 1 + 0 + 0 + 0 + + + 7692 + 1 + 0 + 0 + 0 + + + 7693 + 1 + 0 + 0 + 0 + + + 7694 + 1 + 0 + 0 + 0 + + + 7695 + 1 + 0 + 0 + 0 + + + 7696 + 1 + 0 + 0 + 0 + + + 7697 + 1 + 0 + 0 + 0 + + + 7698 + 1 + 0 + 0 + 0 + + + 7699 + 1 + 0 + 0 + 0 + + + 7700 + 1 + 0 + 0 + 0 + + + 7701 + 1 + 0 + 0 + 0 + + + 7702 + 1 + 0 + 0 + 0 + + + 7703 + 1 + 0 + 0 + 0 + + + 7704 + 1 + 0 + 0 + 0 + + + 7705 + 1 + 0 + 0 + 0 + + + 7706 + 1 + 0 + 0 + 0 + + + 7707 + 1 + 0 + 0 + 0 + + + 7708 + 1 + 0 + 0 + 0 + + + 7709 + 1 + 0 + 0 + 0 + + + 7710 + 1 + 0 + 0 + 0 + + + 7711 + 1 + 0 + 0 + 0 + + + 7712 + 1 + 0 + 0 + 0 + + + 7713 + 1 + 0 + 0 + 0 + + + 7714 + 1 + 0 + 0 + 0 + + + 7715 + 1 + 0 + 0 + 0 + + + 7716 + 1 + 0 + 0 + 0 + + + 7717 + 1 + 0 + 0 + 0 + + + 7718 + 1 + 0 + 0 + 0 + + + 7719 + 1 + 0 + 0 + 0 + + + 7720 + 1 + 0 + 0 + 0 + + + 7721 + 1 + 0 + 0 + 0 + + + 7722 + 1 + 0 + 0 + 0 + + + 7723 + 1 + 0 + 0 + 0 + + + 7724 + 1 + 0 + 0 + 0 + + + 7725 + 1 + 0 + 0 + 0 + + + 7726 + 1 + 0 + 0 + 0 + + + 7727 + 1 + 0 + 0 + 0 + + + 7728 + 2 + 0 + 0 + 0 + + + 7729 + 2 + 0 + 0 + 0 + + + 7730 + 10 + 0 + 0 + 0 + + + 7731 + 10 + 0 + 0 + 0 + + + 7732 + 2 + 0 + 0 + 0 + + + 7733 + 10 + 0 + 0 + 0 + + + 7734 + 10 + 0 + 0 + 0 + + + 7735 + 2 + 0 + 0 + 0 + + + 7736 + 10 + 0 + 0 + 0 + + + 7737 + 10 + 0 + 0 + 0 + + + 7738 + 1 + 0 + 0 + 0 + + + 7739 + 1 + 0 + 0 + 0 + + + 7740 + 2 + 0 + 0 + 0 + + + 7741 + 2 + 0 + 0 + 0 + + + 7742 + 2 + 0 + 0 + 0 + + + 7743 + 2 + 0 + 0 + 0 + + + 7744 + 2 + 0 + 0 + 0 + + + 7745 + 2 + 0 + 0 + 0 + + + 7746 + 2 + 0 + 0 + 0 + + + 7747 + 2 + 0 + 0 + 0 + + + 7748 + 2 + 0 + 0 + 0 + + + 7749 + 2 + 0 + 0 + 0 + + + 7750 + 5 + 0 + 0 + 0 + + + 7751 + 5 + 0 + 0 + 0 + + + 7752 + 2 + 0 + 0 + 0 + + + 7753 + 2 + 0 + 0 + 0 + + + 7754 + 2 + 0 + 0 + 0 + + + 7755 + 2 + 0 + 0 + 0 + + + 7756 + 1 + 0 + 0 + 0 + + + 7757 + 1 + 0 + 0 + 0 + + + 7758 + 1 + 0 + 0 + 0 + + + 7759 + 10 + 0 + 0 + 0 + + + 7760 + 10 + 0 + 0 + 0 + + + 7761 + 10 + 0 + 0 + 0 + + + 7762 + 10 + 0 + 0 + 0 + + + 7763 + 10 + 0 + 0 + 0 + + + 7764 + 10 + 0 + 0 + 0 + + + 7765 + 10 + 0 + 0 + 0 + + + 7766 + 10 + 0 + 0 + 0 + + + 7767 + 10 + 0 + 0 + 0 + + + 7768 + 10 + 0 + 0 + 0 + + + 7769 + 10 + 0 + 0 + 0 + + + 7770 + 10 + 0 + 0 + 0 + + + 7771 + 10 + 0 + 0 + 0 + + + 7772 + 10 + 0 + 0 + 0 + + + 7773 + 1 + 0 + 0 + 0 + + + 7774 + 1 + 0 + 0 + 0 + + + 7775 + 1 + 0 + 0 + 0 + + + 7776 + 1 + 0 + 0 + 0 + + + 7777 + 1 + 0 + 0 + 0 + + + 7778 + 1 + 0 + 0 + 0 + + + 7779 + 5000 + 0 + 0 + 0 + + + 7780 + 5000 + 0 + 0 + 0 + + + 7781 + 5000 + 0 + 0 + 0 + + + 7782 + 5000 + 0 + 0 + 0 + + + 7783 + 5000 + 0 + 0 + 0 + + + 7784 + 5000 + 0 + 0 + 0 + + + 7785 + 5000 + 0 + 0 + 0 + + + 7786 + 5000 + 0 + 0 + 0 + + + 7787 + 5000 + 0 + 0 + 0 + + + 7788 + 5000 + 0 + 0 + 0 + + + 7789 + 5000 + 0 + 0 + 0 + + + 7790 + 5000 + 0 + 0 + 0 + + + 7791 + 5000 + 0 + 0 + 0 + + + 7792 + 5000 + 0 + 0 + 0 + + + 7793 + 5000 + 0 + 0 + 0 + + + 7794 + 5000 + 0 + 0 + 0 + + + 7795 + 5000 + 0 + 0 + 0 + + + 7796 + 5000 + 0 + 0 + 0 + + + 7797 + 5000 + 0 + 0 + 0 + + + 7798 + 5000 + 0 + 0 + 0 + + + 7799 + 5000 + 0 + 0 + 0 + + + 7800 + 1 + 0 + 0 + 0 + + + 7801 + 35 + 0 + 0 + 0 + + + 7802 + 35 + 0 + 0 + 0 + + + 7803 + 1 + 0 + 0 + 0 + + + 7804 + 625 + 0 + 0 + 0 + + + 7805 + 625 + 0 + 0 + 0 + + + 7806 + 26 + 0 + 0 + 0 + + + 7807 + 182 + 0 + 0 + 0 + + + 7808 + 18 + 0 + 0 + 0 + + + 7809 + 26 + 0 + 0 + 0 + + + 7810 + 1 + 0 + 0 + 0 + + + 7811 + 1 + 0 + 0 + 0 + + + 7812 + 1 + 0 + 0 + 0 + + + 7813 + 1 + 0 + 0 + 0 + + + 7814 + 1 + 0 + 0 + 0 + + + 7815 + 1 + 0 + 0 + 0 + + + 7816 + 1 + 0 + 0 + 0 + + + 7817 + 1 + 0 + 0 + 0 + + + 7818 + 1 + 0 + 0 + 0 + + + 7819 + 1 + 0 + 0 + 0 + + + 7820 + 1 + 0 + 0 + 0 + + + 7821 + 1 + 0 + 0 + 0 + + + 7822 + 1 + 0 + 0 + 0 + + + 7823 + 1 + 0 + 0 + 0 + + + 7824 + 1 + 0 + 0 + 0 + + + 7825 + 1 + 0 + 0 + 0 + + + 7826 + 1 + 0 + 0 + 0 + + + 7827 + 1 + 0 + 0 + 0 + + + 7828 + 1 + 0 + 0 + 0 + + + 7829 + 1 + 0 + 0 + 0 + + + 7830 + 1 + 0 + 0 + 0 + + + 7831 + 1 + 0 + 0 + 0 + + + 7832 + 1 + 0 + 0 + 0 + + + 7833 + 1 + 0 + 0 + 0 + + + 7834 + 1 + 0 + 0 + 0 + + + 7835 + 1 + 0 + 0 + 0 + + + 7836 + 1 + 0 + 0 + 0 + + + 7837 + 1 + 0 + 0 + 0 + + + 7838 + 1 + 0 + 0 + 0 + + + 7839 + 1 + 0 + 0 + 0 + + + 7840 + 1 + 0 + 0 + 0 + + + 7841 + 1 + 0 + 0 + 0 + + + 7842 + 1 + 0 + 0 + 0 + + + 7843 + 1 + 0 + 0 + 0 + + + 7844 + 1 + 0 + 0 + 0 + + + 7845 + 1 + 0 + 0 + 0 + + + 7846 + 1 + 0 + 0 + 0 + + + 7847 + 1 + 0 + 0 + 0 + + + 7848 + 1 + 0 + 0 + 0 + + + 7849 + 1 + 0 + 0 + 0 + + + 7850 + 1 + 0 + 0 + 0 + + + 7851 + 1 + 0 + 0 + 0 + + + 7852 + 1 + 0 + 0 + 0 + + + 7853 + 1 + 0 + 0 + 0 + + + 7854 + 1 + 0 + 0 + 0 + + + 7855 + 1 + 0 + 0 + 0 + + + 7856 + 1 + 0 + 0 + 0 + + + 7857 + 1 + 0 + 0 + 0 + + + 7858 + 1 + 0 + 0 + 0 + + + 7859 + 1 + 0 + 0 + 0 + + + 7860 + 1 + 0 + 0 + 0 + + + 7861 + 1 + 0 + 0 + 0 + + + 7862 + 1 + 0 + 0 + 0 + + + 7863 + 1 + 0 + 0 + 0 + + + 7864 + 1 + 0 + 0 + 0 + + + 7865 + 1 + 0 + 0 + 0 + + + 7866 + 1 + 0 + 0 + 0 + + + 7867 + 1 + 0 + 0 + 0 + + + 7868 + 1 + 0 + 0 + 0 + + + 7869 + 1 + 0 + 0 + 0 + + + 7870 + 1 + 0 + 0 + 0 + + + 7871 + 1 + 0 + 0 + 0 + + + 7872 + 1 + 0 + 0 + 0 + + + 7873 + 1 + 0 + 0 + 0 + + + 7874 + 1 + 0 + 0 + 0 + + + 7875 + 1 + 0 + 0 + 0 + + + 7876 + 1 + 0 + 0 + 0 + + + 7877 + 1 + 0 + 0 + 0 + + + 7878 + 1 + 0 + 0 + 0 + + + 7879 + 1 + 0 + 0 + 0 + + + 7880 + 1 + 0 + 0 + 0 + + + 7881 + 1 + 0 + 0 + 0 + + + 7882 + 1 + 0 + 0 + 0 + + + 7883 + 1 + 0 + 0 + 0 + + + 7884 + 1 + 0 + 0 + 0 + + + 7885 + 1 + 0 + 0 + 0 + + + 7886 + 1 + 0 + 0 + 0 + + + 7887 + 1 + 0 + 0 + 0 + + + 7888 + 1 + 0 + 0 + 0 + + + 7889 + 1 + 0 + 0 + 0 + + + 7890 + 1 + 0 + 0 + 0 + + + 7891 + 1 + 0 + 0 + 0 + + + 7892 + 1 + 0 + 0 + 0 + + + 7893 + 1 + 0 + 0 + 0 + + + 7894 + 1 + 0 + 0 + 0 + + + 7895 + 1 + 0 + 0 + 0 + + + 7896 + 1 + 0 + 0 + 0 + + + 7897 + 1 + 0 + 0 + 0 + + + 7898 + 1 + 0 + 0 + 0 + + + 7899 + 1 + 0 + 0 + 0 + + + 7900 + 1 + 0 + 0 + 0 + + + 7901 + 1 + 0 + 0 + 0 + + + 7902 + 1 + 0 + 0 + 0 + + + 7903 + 1 + 0 + 0 + 0 + + + 7904 + 1 + 0 + 0 + 0 + + + 7905 + 1 + 0 + 0 + 0 + + + 7906 + 1 + 0 + 0 + 0 + + + 7907 + 1 + 0 + 0 + 0 + + + 7908 + 1 + 0 + 0 + 0 + + + 7909 + 1 + 0 + 0 + 0 + + + 7910 + 1 + 0 + 0 + 0 + + + 7911 + 1 + 0 + 0 + 0 + + + 7912 + 1 + 0 + 0 + 0 + + + 7913 + 1 + 0 + 0 + 0 + + + 7914 + 1 + 0 + 0 + 0 + + + 7915 + 1 + 0 + 0 + 0 + + + 7916 + 1 + 0 + 0 + 0 + + + 7917 + 1 + 0 + 0 + 0 + + + 7918 + 1 + 0 + 0 + 0 + + + 7919 + 500 + 0 + 0 + 0 + + + 7920 + 500 + 0 + 0 + 0 + + + 7921 + 1 + 0 + 0 + 0 + + + 7922 + 1 + 0 + 0 + 0 + + + 7923 + 1 + 0 + 0 + 0 + + + 7924 + 1 + 0 + 0 + 0 + + + 7925 + 1 + 0 + 0 + 0 + + + 7926 + 1 + 0 + 0 + 0 + + + 7927 + 1 + 0 + 0 + 0 + + + 7928 + 1 + 0 + 0 + 0 + + + 7929 + 1 + 0 + 0 + 0 + + + 7930 + 1 + 0 + 0 + 0 + + + 7931 + 1 + 0 + 0 + 0 + + + 7932 + 1 + 0 + 0 + 0 + + + 7933 + 1 + 0 + 0 + 0 + + + 7934 + 390 + 0 + 0 + 0 + + + 7935 + 390 + 0 + 0 + 0 + + + 7936 + 4 + 0 + 0 + 0 + + + 7937 + 4 + 0 + 0 + 0 + + + 7938 + 4 + 0 + 0 + 0 + + + 7939 + 1000 + 0 + 0 + 0 + + + 7940 + 1000 + 0 + 0 + 0 + + + 7941 + 30 + 0 + 0 + 0 + + + 7942 + 10 + 0 + 0 + 0 + + + 7943 + 10 + 0 + 0 + 0 + + + 7944 + 230 + 0 + 0 + 0 + + + 7945 + 230 + 0 + 0 + 0 + + + 7946 + 230 + 0 + 0 + 0 + + + 7947 + 230 + 0 + 0 + 0 + + + 7948 + 3 + 0 + 0 + 0 + + + 7949 + 3 + 0 + 0 + 0 + + + 7950 + 30 + 0 + 0 + 0 + + + 7951 + 1 + 0 + 0 + 0 + + + 7952 + 1 + 0 + 0 + 0 + + + 7953 + 1 + 0 + 0 + 0 + + + 7954 + 1 + 0 + 0 + 0 + + + 7955 + 1 + 0 + 0 + 0 + + + 7956 + 50 + 0 + 0 + 0 + + + 7957 + 1 + 0 + 0 + 0 + + + 7958 + 10 + 0 + 0 + 0 + + + 7959 + 10 + 0 + 0 + 0 + + + 7960 + 10 + 0 + 0 + 0 + + + 7961 + 10 + 0 + 0 + 0 + + + 7962 + 10 + 0 + 0 + 0 + + + 7963 + 10 + 0 + 0 + 0 + + + 7964 + 10 + 0 + 0 + 0 + + + 7965 + 10 + 0 + 0 + 0 + + + 7966 + 10 + 0 + 0 + 0 + + + 7967 + 5 + 0 + 0 + 0 + + + 7968 + 10 + 0 + 0 + 0 + + + 7969 + 5 + 0 + 0 + 0 + + + 7970 + 5 + 0 + 0 + 0 + + + 7971 + 5 + 0 + 0 + 0 + + + 7972 + 5 + 0 + 0 + 0 + + + 7973 + 5 + 0 + 0 + 0 + + + 7974 + 10 + 0 + 0 + 0 + + + 7975 + 1000 + 0 + 0 + 0 + + + 7976 + 2000 + 0 + 0 + 0 + + + 7977 + 4000 + 0 + 0 + 0 + + + 7978 + 6000 + 0 + 0 + 0 + + + 7979 + 12000 + 0 + 0 + 0 + + + 7980 + 50000 + 0 + 0 + 0 + + + 7981 + 50000 + 0 + 0 + 0 + + + 7982 + 1000 + 0 + 0 + 0 + + + 7983 + 2000 + 0 + 0 + 0 + + + 7984 + 4000 + 0 + 0 + 0 + + + 7985 + 6000 + 0 + 0 + 0 + + + 7986 + 12000 + 0 + 0 + 0 + + + 7987 + 50000 + 0 + 0 + 0 + + + 7988 + 50000 + 0 + 0 + 0 + + + 7989 + 1000 + 0 + 0 + 0 + + + 7990 + 1000 + 0 + 0 + 0 + + + 7991 + 2500 + 0 + 0 + 0 + + + 7992 + 2500 + 0 + 0 + 0 + + + 7993 + 5000 + 0 + 0 + 0 + + + 7994 + 5000 + 0 + 0 + 0 + + + 7995 + 1000 + 0 + 0 + 0 + + + 7996 + 1000 + 0 + 0 + 0 + + + 7997 + 1000 + 0 + 0 + 0 + + + 7998 + 1000 + 0 + 0 + 0 + + + 7999 + 2000 + 0 + 0 + 0 + + + 8000 + 2000 + 0 + 0 + 0 + + + 8001 + 2000 + 0 + 0 + 0 + + + 8002 + 2000 + 0 + 0 + 0 + + + 8003 + 2000 + 0 + 0 + 0 + + + 8004 + 1000 + 0 + 0 + 0 + + + 8005 + 1000 + 0 + 0 + 0 + + + 8006 + 1000 + 0 + 0 + 0 + + + 8007 + 1 + 0 + 0 + 0 + + + 8008 + 1 + 0 + 0 + 0 + + + 8009 + 1 + 0 + 0 + 0 + + + 8010 + 1 + 0 + 0 + 0 + + + 8011 + 1 + 0 + 0 + 0 + + + 8012 + 1 + 0 + 0 + 0 + + + 8013 + 1 + 0 + 0 + 0 + + + 8014 + 1 + 0 + 0 + 0 + + + 8015 + 1 + 0 + 0 + 0 + + + 8016 + 1 + 0 + 0 + 0 + + + 8017 + 1 + 0 + 0 + 0 + + + 8018 + 1 + 0 + 0 + 0 + + + 8019 + 1 + 0 + 0 + 0 + + + 8020 + 1 + 0 + 0 + 0 + + + 8021 + 1 + 0 + 0 + 0 + + + 8022 + 1 + 0 + 0 + 0 + + + 8023 + 1 + 0 + 0 + 0 + + + 8024 + 1 + 0 + 0 + 0 + + + 8025 + 1 + 0 + 0 + 0 + + + 8026 + 1 + 0 + 0 + 0 + + + 8027 + 1 + 0 + 0 + 0 + + + 8028 + 1 + 0 + 0 + 0 + + + 8029 + 1 + 0 + 0 + 0 + + + 8030 + 1 + 0 + 0 + 0 + + + 8031 + 1 + 0 + 0 + 0 + + + 8032 + 1 + 0 + 0 + 0 + + + 8033 + 1 + 0 + 0 + 0 + + + 8034 + 1 + 0 + 0 + 0 + + + 8035 + 1 + 0 + 0 + 0 + + + 8036 + 1 + 0 + 0 + 0 + + + 8037 + 1 + 0 + 0 + 0 + + + 8038 + 1 + 0 + 0 + 0 + + + 8039 + 1 + 0 + 0 + 0 + + + 8040 + 1 + 0 + 0 + 0 + + + 8041 + 1 + 0 + 0 + 0 + + + 8042 + 1 + 0 + 0 + 0 + + + 8043 + 1 + 0 + 0 + 0 + + + 8044 + 1 + 0 + 0 + 0 + + + 8045 + 1 + 0 + 0 + 0 + + + 8046 + 1 + 0 + 0 + 0 + + + 8047 + 1 + 0 + 0 + 0 + + + 8048 + 1 + 0 + 0 + 0 + + + 8049 + 1 + 0 + 0 + 0 + + + 8050 + 1 + 0 + 0 + 0 + + + 8051 + 1 + 0 + 0 + 0 + + + 8052 + 1 + 0 + 0 + 0 + + + 8053 + 1 + 0 + 0 + 0 + + + 8054 + 1 + 0 + 0 + 0 + + + 8055 + 1 + 0 + 0 + 0 + + + 8056 + 1 + 0 + 0 + 0 + + + 8057 + 1 + 0 + 0 + 0 + + + 8058 + 1 + 0 + 0 + 0 + + + 8059 + 1 + 0 + 0 + 0 + + + 8060 + 1 + 0 + 0 + 0 + + + 8061 + 1 + 0 + 0 + 0 + + + 8062 + 1 + 0 + 0 + 0 + + + 8063 + 1 + 0 + 0 + 0 + + + 8064 + 1 + 0 + 0 + 0 + + + 8065 + 1 + 0 + 0 + 0 + + + 8066 + 1 + 0 + 0 + 0 + + + 8067 + 1 + 0 + 0 + 0 + + + 8068 + 1 + 0 + 0 + 0 + + + 8069 + 1 + 0 + 0 + 0 + + + 8070 + 1 + 0 + 0 + 0 + + + 8071 + 1 + 0 + 0 + 0 + + + 8072 + 1 + 0 + 0 + 0 + + + 8073 + 1 + 0 + 0 + 0 + + + 8074 + 1 + 0 + 0 + 0 + + + 8075 + 1 + 0 + 0 + 0 + + + 8076 + 1 + 0 + 0 + 0 + + + 8077 + 1 + 0 + 0 + 0 + + + 8078 + 1 + 0 + 0 + 0 + + + 8079 + 1 + 0 + 0 + 0 + + + 8080 + 1 + 0 + 0 + 0 + + + 8081 + 1 + 0 + 0 + 0 + + + 8082 + 1 + 0 + 0 + 0 + + + 8083 + 1 + 0 + 0 + 0 + + + 8084 + 1 + 0 + 0 + 0 + + + 8085 + 1 + 0 + 0 + 0 + + + 8086 + 1 + 0 + 0 + 0 + + + 8087 + 1 + 0 + 0 + 0 + + + 8088 + 1 + 0 + 0 + 0 + + + 8089 + 1 + 0 + 0 + 0 + + + 8090 + 1 + 0 + 0 + 0 + + + 8091 + 1 + 0 + 0 + 0 + + + 8092 + 1 + 0 + 0 + 0 + + + 8093 + 1 + 0 + 0 + 0 + + + 8094 + 1 + 0 + 0 + 0 + + + 8095 + 1 + 0 + 0 + 0 + + + 8096 + 1 + 0 + 0 + 0 + + + 8097 + 1 + 0 + 0 + 0 + + + 8098 + 1 + 0 + 0 + 0 + + + 8099 + 1 + 0 + 0 + 0 + + + 8100 + 1 + 0 + 0 + 0 + + + 8101 + 1 + 0 + 0 + 0 + + + 8102 + 1 + 0 + 0 + 0 + + + 8103 + 1 + 0 + 0 + 0 + + + 8104 + 1 + 0 + 0 + 0 + + + 8105 + 1 + 0 + 0 + 0 + + + 8106 + 1 + 0 + 0 + 0 + + + 8107 + 1 + 0 + 0 + 0 + + + 8108 + 1 + 0 + 0 + 0 + + + 8109 + 1 + 0 + 0 + 0 + + + 8110 + 1 + 0 + 0 + 0 + + + 8111 + 1 + 0 + 0 + 0 + + + 8112 + 1 + 0 + 0 + 0 + + + 8113 + 1 + 0 + 0 + 0 + + + 8114 + 1 + 0 + 0 + 0 + + + 8115 + 1 + 0 + 0 + 0 + + + 8116 + 1 + 0 + 0 + 0 + + + 8117 + 1 + 0 + 0 + 0 + + + 8118 + 1 + 0 + 0 + 0 + + + 8119 + 1 + 0 + 0 + 0 + + + 8120 + 1 + 0 + 0 + 0 + + + 8121 + 1 + 0 + 0 + 0 + + + 8122 + 1 + 0 + 0 + 0 + + + 8123 + 1 + 0 + 0 + 0 + + + 8124 + 1 + 0 + 0 + 0 + + + 8125 + 1 + 0 + 0 + 0 + + + 8126 + 1 + 0 + 0 + 0 + + + 8127 + 1 + 0 + 0 + 0 + + + 8128 + 1 + 0 + 0 + 0 + + + 8129 + 1 + 0 + 0 + 0 + + + 8130 + 1 + 0 + 0 + 0 + + + 8131 + 1 + 0 + 0 + 0 + + + 8132 + 1 + 0 + 0 + 0 + + + 8133 + 1 + 0 + 0 + 0 + + + 8134 + 1 + 0 + 0 + 0 + + + 8135 + 1 + 0 + 0 + 0 + + + 8136 + 1 + 0 + 0 + 0 + + + 8137 + 1 + 0 + 0 + 0 + + + 8138 + 1 + 0 + 0 + 0 + + + 8139 + 1 + 0 + 0 + 0 + + + 8140 + 1 + 0 + 0 + 0 + + + 8141 + 1 + 0 + 0 + 0 + + + 8142 + 1 + 0 + 0 + 0 + + + 8143 + 1 + 0 + 0 + 0 + + + 8144 + 1 + 0 + 0 + 0 + + + 8145 + 1 + 0 + 0 + 0 + + + 8146 + 1 + 0 + 0 + 0 + + + 8147 + 1 + 0 + 0 + 0 + + + 8148 + 1 + 0 + 0 + 0 + + + 8149 + 1 + 0 + 0 + 0 + + + 8150 + 1 + 0 + 0 + 0 + + + 8151 + 1 + 0 + 0 + 0 + + + 8152 + 1 + 0 + 0 + 0 + + + 8153 + 1 + 0 + 0 + 0 + + + 8154 + 1 + 0 + 0 + 0 + + + 8155 + 1 + 0 + 0 + 0 + + + 8156 + 1 + 0 + 0 + 0 + + + 8157 + 1 + 0 + 0 + 0 + + + 8158 + 1 + 0 + 0 + 0 + + + 8159 + 1 + 0 + 0 + 0 + + + 8160 + 1 + 0 + 0 + 0 + + + 8161 + 1 + 0 + 0 + 0 + + + 8162 + 1 + 0 + 0 + 0 + + + 8163 + 1 + 0 + 0 + 0 + + + 8164 + 1 + 0 + 0 + 0 + + + 8165 + 1 + 0 + 0 + 0 + + + 8166 + 1 + 0 + 0 + 0 + + + 8167 + 1 + 0 + 0 + 0 + + + 8168 + 1 + 0 + 0 + 0 + + + 8169 + 1 + 0 + 0 + 0 + + + 8170 + 1 + 0 + 0 + 0 + + + 8171 + 1 + 0 + 0 + 0 + + + 8172 + 1 + 0 + 0 + 0 + + + 8173 + 1 + 0 + 0 + 0 + + + 8174 + 1 + 0 + 0 + 0 + + + 8175 + 1 + 0 + 0 + 0 + + + 8176 + 1 + 0 + 0 + 0 + + + 8177 + 1 + 0 + 0 + 0 + + + 8178 + 1 + 0 + 0 + 0 + + + 8179 + 1 + 0 + 0 + 0 + + + 8180 + 1 + 0 + 0 + 0 + + + 8181 + 1 + 0 + 0 + 0 + + + 8182 + 1 + 0 + 0 + 0 + + + 8183 + 1 + 0 + 0 + 0 + + + 8184 + 1 + 0 + 0 + 0 + + + 8185 + 1 + 0 + 0 + 0 + + + 8186 + 1 + 0 + 0 + 0 + + + 8187 + 1 + 0 + 0 + 0 + + + 8188 + 1 + 0 + 0 + 0 + + + 8189 + 1 + 0 + 0 + 0 + + + 8190 + 1 + 0 + 0 + 0 + + + 8191 + 1 + 0 + 0 + 0 + + + 8192 + 1 + 0 + 0 + 0 + + + 8193 + 1 + 0 + 0 + 0 + + + 8194 + 1 + 0 + 0 + 0 + + + 8195 + 1 + 0 + 0 + 0 + + + 8196 + 1 + 0 + 0 + 0 + + + 8197 + 1 + 0 + 0 + 0 + + + 8198 + 1 + 0 + 0 + 0 + + + 8199 + 1 + 0 + 0 + 0 + + + 8200 + 1 + 0 + 0 + 0 + + + 8201 + 1 + 0 + 0 + 0 + + + 8202 + 1 + 0 + 0 + 0 + + + 8203 + 1 + 0 + 0 + 0 + + + 8204 + 1 + 0 + 0 + 0 + + + 8205 + 1 + 0 + 0 + 0 + + + 8206 + 1 + 0 + 0 + 0 + + + 8207 + 1 + 0 + 0 + 0 + + + 8208 + 1 + 0 + 0 + 0 + + + 8209 + 1 + 0 + 0 + 0 + + + 8210 + 1 + 0 + 0 + 0 + + + 8211 + 1 + 0 + 0 + 0 + + + 8212 + 1 + 0 + 0 + 0 + + + 8213 + 1 + 0 + 0 + 0 + + + 8214 + 1 + 0 + 0 + 0 + + + 8215 + 1 + 0 + 0 + 0 + + + 8216 + 1 + 0 + 0 + 0 + + + 8217 + 1 + 0 + 0 + 0 + + + 8218 + 1 + 0 + 0 + 0 + + + 8219 + 1 + 0 + 0 + 0 + + + 8220 + 1 + 0 + 0 + 0 + + + 8221 + 1 + 0 + 0 + 0 + + + 8222 + 1 + 0 + 0 + 0 + + + 8223 + 1 + 0 + 0 + 0 + + + 8224 + 1 + 0 + 0 + 0 + + + 8225 + 1 + 0 + 0 + 0 + + + 8226 + 1 + 0 + 0 + 0 + + + 8227 + 1 + 0 + 0 + 0 + + + 8228 + 1 + 0 + 0 + 0 + + + 8229 + 1 + 0 + 0 + 0 + + + 8230 + 1 + 0 + 0 + 0 + + + 8231 + 1 + 0 + 0 + 0 + + + 8232 + 1 + 0 + 0 + 0 + + + 8233 + 1 + 0 + 0 + 0 + + + 8234 + 1 + 0 + 0 + 0 + + + 8235 + 1 + 0 + 0 + 0 + + + 8236 + 1 + 0 + 0 + 0 + + + 8237 + 1 + 0 + 0 + 0 + + + 8238 + 1 + 0 + 0 + 0 + + + 8239 + 1 + 0 + 0 + 0 + + + 8240 + 1 + 0 + 0 + 0 + + + 8241 + 1 + 0 + 0 + 0 + + + 8242 + 1 + 0 + 0 + 0 + + + 8243 + 1 + 0 + 0 + 0 + + + 8244 + 1 + 0 + 0 + 0 + + + 8245 + 1 + 0 + 0 + 0 + + + 8246 + 1 + 0 + 0 + 0 + + + 8247 + 1 + 0 + 0 + 0 + + + 8248 + 1 + 0 + 0 + 0 + + + 8249 + 1 + 0 + 0 + 0 + + + 8250 + 1 + 0 + 0 + 0 + + + 8251 + 1 + 0 + 0 + 0 + + + 8252 + 1 + 0 + 0 + 0 + + + 8253 + 1 + 0 + 0 + 0 + + + 8254 + 1 + 0 + 0 + 0 + + + 8255 + 1 + 0 + 0 + 0 + + + 8256 + 1 + 0 + 0 + 0 + + + 8257 + 1 + 0 + 0 + 0 + + + 8258 + 1 + 0 + 0 + 0 + + + 8259 + 1 + 0 + 0 + 0 + + + 8260 + 1 + 0 + 0 + 0 + + + 8261 + 1 + 0 + 0 + 0 + + + 8262 + 1 + 0 + 0 + 0 + + + 8263 + 1 + 0 + 0 + 0 + + + 8264 + 1 + 0 + 0 + 0 + + + 8265 + 1 + 0 + 0 + 0 + + + 8266 + 1 + 0 + 0 + 0 + + + 8267 + 1 + 0 + 0 + 0 + + + 8268 + 1 + 0 + 0 + 0 + + + 8269 + 1 + 0 + 0 + 0 + + + 8270 + 1 + 0 + 0 + 0 + + + 8271 + 1 + 0 + 0 + 0 + + + 8272 + 1 + 0 + 0 + 0 + + + 8273 + 1 + 0 + 0 + 0 + + + 8274 + 1 + 0 + 0 + 0 + + + 8275 + 1 + 0 + 0 + 0 + + + 8276 + 1 + 0 + 0 + 0 + + + 8277 + 1 + 0 + 0 + 0 + + + 8278 + 1 + 0 + 0 + 0 + + + 8279 + 1 + 0 + 0 + 0 + + + 8280 + 1 + 0 + 0 + 0 + + + 8281 + 1 + 0 + 0 + 0 + + + 8282 + 1 + 0 + 0 + 0 + + + 8283 + 1 + 0 + 0 + 0 + + + 8284 + 1 + 0 + 0 + 0 + + + 8285 + 1 + 0 + 0 + 0 + + + 8286 + 1 + 0 + 0 + 0 + + + 8287 + 1 + 0 + 0 + 0 + + + 8288 + 1 + 0 + 0 + 0 + + + 8289 + 1 + 0 + 0 + 0 + + + 8290 + 1 + 0 + 0 + 0 + + + 8291 + 1 + 0 + 0 + 0 + + + 8292 + 1 + 0 + 0 + 0 + + + 8293 + 1 + 0 + 0 + 0 + + + 8294 + 1 + 0 + 0 + 0 + + + 8295 + 1 + 0 + 0 + 0 + + + 8296 + 1 + 0 + 0 + 0 + + + 8297 + 1 + 0 + 0 + 0 + + + 8298 + 1 + 0 + 0 + 0 + + + 8299 + 1 + 0 + 0 + 0 + + + 8300 + 1 + 0 + 0 + 0 + + + 8301 + 1 + 0 + 0 + 0 + + + 8302 + 1 + 0 + 0 + 0 + + + 8303 + 1 + 0 + 0 + 0 + + + 8304 + 1 + 0 + 0 + 0 + + + 8305 + 1 + 0 + 0 + 0 + + + 8306 + 1 + 0 + 0 + 0 + + + 8307 + 1 + 0 + 0 + 0 + + + 8308 + 1 + 0 + 0 + 0 + + + 8309 + 1 + 0 + 0 + 0 + + + 8310 + 1 + 0 + 0 + 0 + + + 8311 + 1 + 0 + 0 + 0 + + + 8312 + 1 + 0 + 0 + 0 + + + 8313 + 1 + 0 + 0 + 0 + + + 8314 + 1 + 0 + 0 + 0 + + + 8315 + 1 + 0 + 0 + 0 + + + 8316 + 1 + 0 + 0 + 0 + + + 8317 + 1 + 0 + 0 + 0 + + + 8318 + 1 + 0 + 0 + 0 + + + 8319 + 1 + 0 + 0 + 0 + + + 8320 + 1 + 0 + 0 + 0 + + + 8321 + 1 + 0 + 0 + 0 + + + 8322 + 1 + 0 + 0 + 0 + + + 8323 + 1 + 0 + 0 + 0 + + + 8324 + 1 + 0 + 0 + 0 + + + 8325 + 1 + 0 + 0 + 0 + + + 8326 + 1 + 0 + 0 + 0 + + + 8327 + 1 + 0 + 0 + 0 + + + 8328 + 1 + 0 + 0 + 0 + + + 8329 + 1 + 0 + 0 + 0 + + + 8330 + 1 + 0 + 0 + 0 + + + 8331 + 1 + 0 + 0 + 0 + + + 8332 + 1 + 0 + 0 + 0 + + + 8333 + 1 + 0 + 0 + 0 + + + 8334 + 1 + 0 + 0 + 0 + + + 8335 + 1 + 0 + 0 + 0 + + + 8336 + 1 + 0 + 0 + 0 + + + 8337 + 1 + 0 + 0 + 0 + + + 8338 + 1 + 0 + 0 + 0 + + + 8339 + 1 + 0 + 0 + 0 + + + 8340 + 1 + 0 + 0 + 0 + + + 8341 + 1 + 0 + 0 + 0 + + + 8342 + 1 + 0 + 0 + 0 + + + 8343 + 1 + 0 + 0 + 0 + + + 8344 + 1 + 0 + 0 + 0 + + + 8345 + 1 + 0 + 0 + 0 + + + 8346 + 1 + 0 + 0 + 0 + + + 8347 + 1 + 0 + 0 + 0 + + + 8348 + 1 + 0 + 0 + 0 + + + 8349 + 1 + 0 + 0 + 0 + + + 8350 + 1 + 0 + 0 + 0 + + + 8351 + 1 + 0 + 0 + 0 + + + 8352 + 1 + 0 + 0 + 0 + + + 8353 + 1 + 0 + 0 + 0 + + + 8354 + 1 + 0 + 0 + 0 + + + 8355 + 1 + 0 + 0 + 0 + + + 8356 + 1 + 0 + 0 + 0 + + + 8357 + 1 + 0 + 0 + 0 + + + 8358 + 1 + 0 + 0 + 0 + + + 8359 + 1 + 0 + 0 + 0 + + + 8360 + 1 + 0 + 0 + 0 + + + 8361 + 1 + 0 + 0 + 0 + + + 8362 + 1 + 0 + 0 + 0 + + + 8363 + 1 + 0 + 0 + 0 + + + 8364 + 1 + 0 + 0 + 0 + + + 8365 + 1 + 0 + 0 + 0 + + + 8366 + 1 + 0 + 0 + 0 + + + 8367 + 1 + 0 + 0 + 0 + + + 8368 + 1 + 0 + 0 + 0 + + + 8369 + 1 + 0 + 0 + 0 + + + 8370 + 1 + 0 + 0 + 0 + + + 8371 + 1 + 0 + 0 + 0 + + + 8372 + 1 + 0 + 0 + 0 + + + 8373 + 1 + 0 + 0 + 0 + + + 8374 + 1 + 0 + 0 + 0 + + + 8375 + 1 + 0 + 0 + 0 + + + 8376 + 1 + 0 + 0 + 0 + + + 8377 + 1 + 0 + 0 + 0 + + + 8378 + 1 + 0 + 0 + 0 + + + 8379 + 1 + 0 + 0 + 0 + + + 8380 + 1 + 0 + 0 + 0 + + + 8381 + 1 + 0 + 0 + 0 + + + 8382 + 1 + 0 + 0 + 0 + + + 8383 + 1 + 0 + 0 + 0 + + + 8384 + 1 + 0 + 0 + 0 + + + 8385 + 1 + 0 + 0 + 0 + + + 8386 + 1 + 0 + 0 + 0 + + + 8387 + 1 + 0 + 0 + 0 + + + 8388 + 1 + 0 + 0 + 0 + + + 8389 + 1 + 0 + 0 + 0 + + + 8390 + 1 + 0 + 0 + 0 + + + 8391 + 1 + 0 + 0 + 0 + + + 8392 + 1 + 0 + 0 + 0 + + + 8393 + 1 + 0 + 0 + 0 + + + 8394 + 1 + 0 + 0 + 0 + + + 8395 + 1000 + 0 + 0 + 0 + + + 8396 + 5000 + 0 + 0 + 0 + + + 8397 + 5000 + 0 + 0 + 0 + + + 8398 + 10000 + 0 + 0 + 0 + + + 8399 + 25000 + 0 + 0 + 0 + + + 8400 + 25000 + 0 + 0 + 0 + + + 8401 + 15000 + 0 + 0 + 0 + + + 8402 + 15000 + 0 + 0 + 0 + + + 8403 + 25000 + 0 + 0 + 0 + + + 8404 + 25000 + 0 + 0 + 0 + + + 8405 + 50000 + 0 + 0 + 0 + + + 8406 + 10000 + 0 + 0 + 0 + + + 8407 + 50000 + 0 + 0 + 0 + + + 8408 + 100000 + 0 + 0 + 0 + + + 8409 + 150000 + 0 + 0 + 0 + + + 8410 + 150000 + 0 + 0 + 0 + + + 8411 + 7500 + 0 + 0 + 0 + + + 8412 + 7500 + 0 + 0 + 0 + + + 8413 + 7500 + 0 + 0 + 0 + + + 8414 + 250000 + 0 + 0 + 0 + + + 8415 + 1000 + 0 + 0 + 0 + + + 8416 + 75000 + 0 + 0 + 0 + + + 8417 + 1000 + 0 + 0 + 0 + + + 8418 + 1000 + 0 + 0 + 0 + + + 8419 + 2000 + 0 + 0 + 0 + + + 8420 + 2000 + 0 + 0 + 0 + + + 8421 + 5000 + 0 + 0 + 0 + + + 8422 + 5000 + 0 + 0 + 0 + + + 8423 + 10000 + 0 + 0 + 0 + + + 8424 + 10000 + 0 + 0 + 0 + + + 8425 + 15000 + 0 + 0 + 0 + + + 8426 + 15000 + 0 + 0 + 0 + + + 8427 + 20000 + 0 + 0 + 0 + + + 8428 + 20000 + 0 + 0 + 0 + + + 8429 + 50000 + 0 + 0 + 0 + + + 8430 + 50000 + 0 + 0 + 0 + + + 8431 + 1000 + 0 + 0 + 0 + + + 8432 + 1000 + 0 + 0 + 0 + + + 8433 + 5000 + 0 + 0 + 0 + + + 8434 + 5000 + 0 + 0 + 0 + + + 8435 + 10000 + 0 + 0 + 0 + + + 8436 + 10000 + 0 + 0 + 0 + + + 8437 + 5000 + 0 + 0 + 0 + + + 8438 + 5000 + 0 + 0 + 0 + + + 8439 + 10000 + 0 + 0 + 0 + + + 8440 + 10000 + 0 + 0 + 0 + + + 8441 + 15000 + 0 + 0 + 0 + + + 8442 + 15000 + 0 + 0 + 0 + + + 8443 + 20000 + 0 + 0 + 0 + + + 8444 + 20000 + 0 + 0 + 0 + + + 8445 + 25000 + 0 + 0 + 0 + + + 8446 + 25000 + 0 + 0 + 0 + + + 8447 + 50000 + 0 + 0 + 0 + + + 8448 + 50000 + 0 + 0 + 0 + + + 8449 + 100000 + 0 + 0 + 0 + + + 8450 + 100000 + 0 + 0 + 0 + + + 8451 + 5000 + 0 + 0 + 0 + + + 8452 + 5000 + 0 + 0 + 0 + + + 8453 + 10000 + 0 + 0 + 0 + + + 8454 + 10000 + 0 + 0 + 0 + + + 8455 + 15000 + 0 + 0 + 0 + + + 8456 + 15000 + 0 + 0 + 0 + + + 8457 + 5000 + 0 + 0 + 0 + + + 8458 + 5000 + 0 + 0 + 0 + + + 8459 + 10000 + 0 + 0 + 0 + + + 8460 + 10000 + 0 + 0 + 0 + + + 8461 + 15000 + 0 + 0 + 0 + + + 8462 + 15000 + 0 + 0 + 0 + + + 8463 + 1 + 0 + 0 + 0 + + + 8464 + 35200 + 0 + 0 + 0 + + + 8465 + 1 + 0 + 0 + 0 + + + 8466 + 35200 + 0 + 0 + 0 + + + 8467 + 1 + 0 + 0 + 0 + + + 8468 + 35200 + 0 + 0 + 0 + + + 8469 + 1 + 0 + 0 + 0 + + + 8470 + 35200 + 0 + 0 + 0 + + + 8471 + 1 + 0 + 0 + 0 + + + 8472 + 35200 + 0 + 0 + 0 + + + 8473 + 1 + 0 + 0 + 0 + + + 8474 + 35200 + 0 + 0 + 0 + + + 8475 + 1 + 0 + 0 + 0 + + + 8476 + 35200 + 0 + 0 + 0 + + + 8477 + 1 + 0 + 0 + 0 + + + 8478 + 35200 + 0 + 0 + 0 + + + 8479 + 1 + 0 + 0 + 0 + + + 8480 + 35200 + 0 + 0 + 0 + + + 8481 + 1 + 0 + 0 + 0 + + + 8482 + 35200 + 0 + 0 + 0 + + + 8483 + 1 + 0 + 0 + 0 + + + 8484 + 35200 + 0 + 0 + 0 + + + 8485 + 1 + 0 + 0 + 0 + + + 8486 + 35200 + 0 + 0 + 0 + + + 8487 + 1 + 0 + 0 + 0 + + + 8488 + 35200 + 0 + 0 + 0 + + + 8489 + 1 + 0 + 0 + 0 + + + 8490 + 35200 + 0 + 0 + 0 + + + 8491 + 1 + 0 + 0 + 0 + + + 8492 + 35200 + 0 + 0 + 0 + + + 8493 + 1 + 0 + 0 + 0 + + + 8494 + 35200 + 0 + 0 + 0 + + + 8495 + 1 + 0 + 0 + 0 + + + 8496 + 10 + 0 + 0 + 0 + + + 8497 + 10 + 0 + 0 + 0 + + + 8498 + 10 + 0 + 0 + 0 + + + 8499 + 10 + 0 + 0 + 0 + + + 8500 + 10 + 0 + 0 + 0 + + + 8501 + 10 + 0 + 0 + 0 + + + 8502 + 10 + 0 + 0 + 0 + + + 8503 + 10 + 0 + 0 + 0 + + + 8504 + 10 + 0 + 0 + 0 + + + 8505 + 10 + 0 + 0 + 0 + + + 8506 + 10 + 0 + 0 + 0 + + + 8507 + 10 + 0 + 0 + 0 + + + 8508 + 10 + 0 + 0 + 0 + + + 8509 + 10 + 0 + 0 + 0 + + + 8510 + 10 + 0 + 0 + 0 + + + 8511 + 10 + 0 + 0 + 0 + + + 8512 + 10 + 0 + 0 + 0 + + + 8513 + 10 + 0 + 0 + 0 + + + 8514 + 10 + 0 + 0 + 0 + + + 8515 + 10 + 0 + 0 + 0 + + + 8516 + 10 + 0 + 0 + 0 + + + 8517 + 10 + 0 + 0 + 0 + + + 8518 + 10 + 0 + 0 + 0 + + + 8519 + 10 + 0 + 0 + 0 + + + 8520 + 10 + 0 + 0 + 0 + + + 8521 + 10 + 0 + 0 + 0 + + + 8522 + 10 + 0 + 0 + 0 + + + 8523 + 10 + 0 + 0 + 0 + + + 8524 + 10 + 0 + 0 + 0 + + + 8525 + 10 + 0 + 0 + 0 + + + 8526 + 10 + 0 + 0 + 0 + + + 8527 + 10 + 0 + 0 + 0 + + + 8528 + 10 + 0 + 0 + 0 + + + 8529 + 10 + 0 + 0 + 0 + + + 8530 + 10 + 0 + 0 + 0 + + + 8531 + 10 + 0 + 0 + 0 + + + 8532 + 10 + 0 + 0 + 0 + + + 8533 + 10 + 0 + 0 + 0 + + + 8534 + 10 + 0 + 0 + 0 + + + 8535 + 10 + 0 + 0 + 0 + + + 8536 + 10 + 0 + 0 + 0 + + + 8537 + 10 + 0 + 0 + 0 + + + 8538 + 10 + 0 + 0 + 0 + + + 8539 + 10 + 0 + 0 + 0 + + + 8540 + 10 + 0 + 0 + 0 + + + 8541 + 10 + 0 + 0 + 0 + + + 8542 + 10 + 0 + 0 + 0 + + + 8543 + 10 + 0 + 0 + 0 + + + 8544 + 10 + 0 + 0 + 0 + + + 8545 + 10 + 0 + 0 + 0 + + + 8546 + 10 + 0 + 0 + 0 + + + 8547 + 10 + 0 + 0 + 0 + + + 8548 + 10 + 0 + 0 + 0 + + + 8549 + 10 + 0 + 0 + 0 + + + 8550 + 10 + 0 + 0 + 0 + + + 8551 + 10 + 0 + 0 + 0 + + + 8552 + 10 + 0 + 0 + 0 + + + 8553 + 10 + 0 + 0 + 0 + + + 8554 + 10 + 0 + 0 + 0 + + + 8555 + 10 + 0 + 0 + 0 + + + 8556 + 10 + 0 + 0 + 0 + + + 8557 + 10 + 0 + 0 + 0 + + + 8558 + 10 + 0 + 0 + 0 + + + 8559 + 10 + 0 + 0 + 0 + + + 8560 + 10 + 0 + 0 + 0 + + + 8561 + 10 + 0 + 0 + 0 + + + 8562 + 10 + 0 + 0 + 0 + + + 8563 + 10 + 0 + 0 + 0 + + + 8564 + 10 + 0 + 0 + 0 + + + 8565 + 10 + 0 + 0 + 0 + + + 8566 + 10 + 0 + 0 + 0 + + + 8567 + 10 + 0 + 0 + 0 + + + 8568 + 10 + 0 + 0 + 0 + + + 8569 + 10 + 0 + 0 + 0 + + + 8570 + 10 + 0 + 0 + 0 + + + 8571 + 10 + 0 + 0 + 0 + + + 8572 + 10 + 0 + 0 + 0 + + + 8573 + 10 + 0 + 0 + 0 + + + 8574 + 10 + 0 + 0 + 0 + + + 8575 + 10 + 0 + 0 + 0 + + + 8576 + 10 + 0 + 0 + 0 + + + 8577 + 10 + 0 + 0 + 0 + + + 8578 + 10 + 0 + 0 + 0 + + + 8579 + 10 + 0 + 0 + 0 + + + 8580 + 10 + 0 + 0 + 0 + + + 8581 + 10 + 0 + 0 + 0 + + + 8582 + 10 + 0 + 0 + 0 + + + 8583 + 10 + 0 + 0 + 0 + + + 8584 + 10 + 0 + 0 + 0 + + + 8585 + 10 + 0 + 0 + 0 + + + 8586 + 10 + 0 + 0 + 0 + + + 8587 + 10 + 0 + 0 + 0 + + + 8588 + 10 + 0 + 0 + 0 + + + 8589 + 10 + 0 + 0 + 0 + + + 8590 + 10 + 0 + 0 + 0 + + + 8591 + 10 + 0 + 0 + 0 + + + 8592 + 10 + 0 + 0 + 0 + + + 8593 + 10 + 0 + 0 + 0 + + + 8594 + 10 + 0 + 0 + 0 + + + 8595 + 10 + 0 + 0 + 0 + + + 8596 + 10 + 0 + 0 + 0 + + + 8597 + 10 + 0 + 0 + 0 + + + 8598 + 10 + 0 + 0 + 0 + + + 8599 + 10 + 0 + 0 + 0 + + + 8600 + 10 + 0 + 0 + 0 + + + 8601 + 10 + 0 + 0 + 0 + + + 8602 + 10 + 0 + 0 + 0 + + + 8603 + 10 + 0 + 0 + 0 + + + 8604 + 10 + 0 + 0 + 0 + + + 8605 + 10 + 0 + 0 + 0 + + + 8606 + 10 + 0 + 0 + 0 + + + 8607 + 10 + 0 + 0 + 0 + + + 8608 + 10 + 0 + 0 + 0 + + + 8609 + 10 + 0 + 0 + 0 + + + 8610 + 10 + 0 + 0 + 0 + + + 8611 + 10 + 0 + 0 + 0 + + + 8612 + 10 + 0 + 0 + 0 + + + 8613 + 10 + 0 + 0 + 0 + + + 8614 + 10 + 0 + 0 + 0 + + + 8615 + 10 + 0 + 0 + 0 + + + 8616 + 10 + 0 + 0 + 0 + + + 8617 + 10 + 0 + 0 + 0 + + + 8618 + 10 + 0 + 0 + 0 + + + 8619 + 10 + 0 + 0 + 0 + + + 8620 + 10 + 0 + 0 + 0 + + + 8621 + 10 + 0 + 0 + 0 + + + 8622 + 10 + 0 + 0 + 0 + + + 8623 + 10 + 0 + 0 + 0 + + + 8624 + 10 + 0 + 0 + 0 + + + 8625 + 10 + 0 + 0 + 0 + + + 8626 + 10 + 0 + 0 + 0 + + + 8627 + 10 + 0 + 0 + 0 + + + 8628 + 10 + 0 + 0 + 0 + + + 8629 + 10 + 0 + 0 + 0 + + + 8630 + 10 + 0 + 0 + 0 + + + 8631 + 10 + 0 + 0 + 0 + + + 8632 + 10 + 0 + 0 + 0 + + + 8633 + 10 + 0 + 0 + 0 + + + 8634 + 10 + 0 + 0 + 0 + + + 8635 + 10 + 0 + 0 + 0 + + + 8636 + 10 + 0 + 0 + 0 + + + 8637 + 10 + 0 + 0 + 0 + + + 8638 + 10 + 0 + 0 + 0 + + + 8639 + 10 + 0 + 0 + 0 + + + 8640 + 10 + 0 + 0 + 0 + + + 8641 + 10 + 0 + 0 + 0 + + + 8642 + 10 + 0 + 0 + 0 + + + 8643 + 10 + 0 + 0 + 0 + + + 8644 + 10 + 0 + 0 + 0 + + + 8645 + 10 + 0 + 0 + 0 + + + 8646 + 10 + 0 + 0 + 0 + + + 8647 + 10 + 0 + 0 + 0 + + + 8648 + 10 + 0 + 0 + 0 + + + 8649 + 10 + 0 + 0 + 0 + + + 8650 + 1 + 0 + 0 + 0 + + + 8651 + 1 + 0 + 0 + 0 + + + 8652 + 1 + 0 + 0 + 0 + + + 8653 + 1 + 0 + 0 + 0 + + + 8654 + 1 + 0 + 0 + 0 + + + 8655 + 1 + 0 + 0 + 0 + + + 8656 + 1 + 0 + 0 + 0 + + + 8657 + 1 + 0 + 0 + 0 + + + 8658 + 1 + 0 + 0 + 0 + + + 8659 + 1 + 0 + 0 + 0 + + + 8660 + 1 + 0 + 0 + 0 + + + 8661 + 1 + 0 + 0 + 0 + + + 8662 + 1 + 0 + 0 + 0 + + + 8663 + 1 + 0 + 0 + 0 + + + 8664 + 1 + 0 + 0 + 0 + + + 8665 + 1 + 0 + 0 + 0 + + + 8666 + 1 + 0 + 0 + 0 + + + 8667 + 1 + 0 + 0 + 0 + + + 8668 + 1 + 0 + 0 + 0 + + + 8669 + 1 + 0 + 0 + 0 + + + 8670 + 1 + 0 + 0 + 0 + + + 8671 + 1 + 0 + 0 + 0 + + + 8672 + 1 + 0 + 0 + 0 + + + 8673 + 1 + 0 + 0 + 0 + + + 8674 + 1 + 0 + 0 + 0 + + + 8675 + 1 + 0 + 0 + 0 + + + 8676 + 1 + 0 + 0 + 0 + + + 8677 + 1 + 0 + 0 + 0 + + + 8678 + 1 + 0 + 0 + 0 + + + 8679 + 1 + 0 + 0 + 0 + + + 8680 + 1 + 0 + 0 + 0 + + + 8681 + 1 + 0 + 0 + 0 + + + 8682 + 600 + 0 + 0 + 0 + + + 8683 + 1 + 0 + 0 + 0 + + + 8684 + 600 + 0 + 0 + 0 + + + 8685 + 1 + 0 + 0 + 0 + + + 8686 + 600 + 0 + 0 + 0 + + + 8687 + 1 + 0 + 0 + 0 + + + 8688 + 600 + 0 + 0 + 0 + + + 8689 + 1 + 0 + 0 + 0 + + + 8690 + 600 + 0 + 0 + 0 + + + 8691 + 1 + 0 + 0 + 0 + + + 8692 + 600 + 0 + 0 + 0 + + + 8693 + 1 + 0 + 0 + 0 + + + 8694 + 600 + 0 + 0 + 0 + + + 8695 + 1 + 0 + 0 + 0 + + + 8696 + 600 + 0 + 0 + 0 + + + 8697 + 1 + 0 + 0 + 0 + + + 8698 + 600 + 0 + 0 + 0 + + + 8699 + 1 + 0 + 0 + 0 + + + 8700 + 600 + 0 + 0 + 0 + + + 8701 + 1 + 0 + 0 + 0 + + + 8702 + 600 + 0 + 0 + 0 + + + 8703 + 1 + 0 + 0 + 0 + + + 8704 + 600 + 0 + 0 + 0 + + + 8705 + 1 + 0 + 0 + 0 + + + 8706 + 600 + 0 + 0 + 0 + + + 8707 + 1 + 0 + 0 + 0 + + + 8708 + 600 + 0 + 0 + 0 + + + 8709 + 1 + 0 + 0 + 0 + + + 8710 + 600 + 0 + 0 + 0 + + + 8711 + 1 + 0 + 0 + 0 + + + 8712 + 600 + 0 + 0 + 0 + + + 8713 + 1 + 0 + 0 + 0 + + + 8714 + 54400 + 0 + 0 + 0 + + + 8715 + 1 + 0 + 0 + 0 + + + 8716 + 54400 + 0 + 0 + 0 + + + 8717 + 1 + 0 + 0 + 0 + + + 8718 + 54400 + 0 + 0 + 0 + + + 8719 + 1 + 0 + 0 + 0 + + + 8720 + 54400 + 0 + 0 + 0 + + + 8721 + 1 + 0 + 0 + 0 + + + 8722 + 54400 + 0 + 0 + 0 + + + 8723 + 1 + 0 + 0 + 0 + + + 8724 + 54400 + 0 + 0 + 0 + + + 8725 + 1 + 0 + 0 + 0 + + + 8726 + 54400 + 0 + 0 + 0 + + + 8727 + 1 + 0 + 0 + 0 + + + 8728 + 54400 + 0 + 0 + 0 + + + 8729 + 1 + 0 + 0 + 0 + + + 8730 + 54400 + 0 + 0 + 0 + + + 8731 + 1 + 0 + 0 + 0 + + + 8732 + 54400 + 0 + 0 + 0 + + + 8733 + 1 + 0 + 0 + 0 + + + 8734 + 54400 + 0 + 0 + 0 + + + 8735 + 1 + 0 + 0 + 0 + + + 8736 + 54400 + 0 + 0 + 0 + + + 8737 + 1 + 0 + 0 + 0 + + + 8738 + 54400 + 0 + 0 + 0 + + + 8739 + 1 + 0 + 0 + 0 + + + 8740 + 54400 + 0 + 0 + 0 + + + 8741 + 1 + 0 + 0 + 0 + + + 8742 + 54400 + 0 + 0 + 0 + + + 8743 + 1 + 0 + 0 + 0 + + + 8744 + 54400 + 0 + 0 + 0 + + + 8745 + 1 + 0 + 0 + 0 + + + 8746 + 900 + 0 + 0 + 0 + + + 8747 + 1 + 0 + 0 + 0 + + + 8748 + 900 + 0 + 0 + 0 + + + 8749 + 1 + 0 + 0 + 0 + + + 8750 + 900 + 0 + 0 + 0 + + + 8751 + 1 + 0 + 0 + 0 + + + 8752 + 900 + 0 + 0 + 0 + + + 8753 + 1 + 0 + 0 + 0 + + + 8754 + 900 + 0 + 0 + 0 + + + 8755 + 1 + 0 + 0 + 0 + + + 8756 + 900 + 0 + 0 + 0 + + + 8757 + 1 + 0 + 0 + 0 + + + 8758 + 900 + 0 + 0 + 0 + + + 8759 + 1 + 0 + 0 + 0 + + + 8760 + 900 + 0 + 0 + 0 + + + 8761 + 1 + 0 + 0 + 0 + + + 8762 + 900 + 0 + 0 + 0 + + + 8763 + 1 + 0 + 0 + 0 + + + 8764 + 900 + 0 + 0 + 0 + + + 8765 + 1 + 0 + 0 + 0 + + + 8766 + 900 + 0 + 0 + 0 + + + 8767 + 1 + 0 + 0 + 0 + + + 8768 + 900 + 0 + 0 + 0 + + + 8769 + 1 + 0 + 0 + 0 + + + 8770 + 900 + 0 + 0 + 0 + + + 8771 + 1 + 0 + 0 + 0 + + + 8772 + 900 + 0 + 0 + 0 + + + 8773 + 1 + 0 + 0 + 0 + + + 8774 + 900 + 0 + 0 + 0 + + + 8775 + 1 + 0 + 0 + 0 + + + 8776 + 900 + 0 + 0 + 0 + + + 8777 + 1 + 0 + 0 + 0 + + + 8778 + 250 + 0 + 0 + 0 + + + 8779 + 250 + 0 + 0 + 0 + + + 8780 + 500 + 0 + 0 + 0 + + + 8781 + 500 + 0 + 0 + 0 + + + 8782 + 1500 + 0 + 0 + 0 + + + 8783 + 1500 + 0 + 0 + 0 + + + 8784 + 130000 + 0 + 0 + 0 + + + 8785 + 130000 + 0 + 0 + 0 + + + 8786 + 325000 + 0 + 0 + 0 + + + 8787 + 325000 + 0 + 0 + 0 + + + 8788 + 975000 + 0 + 0 + 0 + + + 8789 + 975000 + 0 + 0 + 0 + + + 8790 + 650 + 0 + 0 + 0 + + + 8791 + 650 + 0 + 0 + 0 + + + 8792 + 500 + 0 + 0 + 0 + + + 8793 + 500 + 0 + 0 + 0 + + + 8794 + 13 + 0 + 0 + 0 + + + 8795 + 13 + 0 + 0 + 0 + + + 8796 + 20 + 0 + 0 + 0 + + + 8797 + 1 + 0 + 0 + 0 + + + 8798 + 1 + 0 + 0 + 0 + + + 8799 + 1 + 0 + 0 + 0 + + + 8800 + 1 + 0 + 0 + 0 + + + 8801 + 1 + 0 + 0 + 0 + + + 8802 + 1 + 0 + 0 + 0 + + + 8803 + 1 + 0 + 0 + 0 + + + 8804 + 1 + 0 + 0 + 0 + + + 8805 + 1 + 0 + 0 + 0 + + + 8806 + 1 + 0 + 0 + 0 + + + 8807 + 1 + 0 + 0 + 0 + + + 8808 + 1 + 0 + 0 + 0 + + + 8809 + 1 + 0 + 0 + 0 + + + 8810 + 1 + 0 + 0 + 0 + + + 8811 + 1 + 0 + 0 + 0 + + + 8812 + 1 + 0 + 0 + 0 + + + 8813 + 1 + 0 + 0 + 0 + + + 8814 + 1 + 0 + 0 + 0 + + + 8815 + 1 + 0 + 0 + 0 + + + 8816 + 1 + 0 + 0 + 0 + + + 8817 + 1 + 0 + 0 + 0 + + + 8818 + 1 + 0 + 0 + 0 + + + 8819 + 1 + 0 + 0 + 0 + + + 8820 + 1 + 0 + 0 + 0 + + + 8821 + 1 + 0 + 0 + 0 + + + 8822 + 1 + 0 + 0 + 0 + + + 8823 + 1 + 0 + 0 + 0 + + + 8824 + 1 + 0 + 0 + 0 + + + 8825 + 1 + 0 + 0 + 0 + + + 8826 + 1 + 0 + 0 + 0 + + + 8827 + 1 + 0 + 0 + 0 + + + 8828 + 1 + 0 + 0 + 0 + + + 8829 + 1 + 0 + 0 + 0 + + + 8830 + 1 + 0 + 0 + 0 + + + 8831 + 1 + 0 + 0 + 0 + + + 8832 + 1 + 0 + 0 + 0 + + + 8833 + 1 + 0 + 0 + 0 + + + 8834 + 1 + 0 + 0 + 0 + + + 8835 + 1 + 0 + 0 + 0 + + + 8836 + 50 + 0 + 0 + 0 + + + 8837 + 1 + 0 + 0 + 0 + + + 8838 + 1 + 0 + 0 + 0 + + + 8839 + 48000 + 0 + 0 + 0 + + + 8840 + 45000 + 0 + 0 + 0 + + + 8841 + 12000 + 0 + 0 + 0 + + + 8842 + 6052 + 0 + 0 + 0 + + + 8843 + 1 + 0 + 0 + 0 + + + 8844 + 1 + 0 + 0 + 0 + + + 8845 + 1 + 0 + 0 + 0 + + + 8846 + 1 + 0 + 0 + 0 + + + 8847 + 1 + 0 + 0 + 0 + + + 8848 + 1 + 0 + 0 + 0 + + + 8849 + 1 + 0 + 0 + 0 + + + 8850 + 1 + 0 + 0 + 0 + + + 8851 + 1 + 0 + 0 + 0 + + + 8852 + 1 + 0 + 0 + 0 + + + 8853 + 1 + 0 + 0 + 0 + + + 8854 + 1 + 0 + 0 + 0 + + + 8855 + 1 + 0 + 0 + 0 + + + 8856 + 1 + 0 + 0 + 0 + + + 8857 + 1 + 0 + 0 + 0 + + + 8858 + 1 + 0 + 0 + 0 + + + 8859 + 1 + 0 + 0 + 0 + + + 8860 + 1 + 0 + 0 + 0 + + + 8861 + 1 + 0 + 0 + 0 + + + 8862 + 1 + 0 + 0 + 0 + + + 8863 + 1 + 0 + 0 + 0 + + + 8864 + 1 + 0 + 0 + 0 + + + 8865 + 2 + 0 + 0 + 0 + + + 8866 + 1 + 0 + 0 + 0 + + + 8867 + 1 + 0 + 0 + 0 + + + 8868 + 1 + 0 + 0 + 0 + + + 8869 + 1 + 0 + 0 + 0 + + + 8870 + 1 + 0 + 0 + 0 + + + 8871 + 1 + 0 + 0 + 0 + + + 8872 + 2000 + 0 + 0 + 0 + + + 8873 + 2000 + 0 + 0 + 0 + + + 8874 + 2000 + 0 + 0 + 0 + + + 8875 + 2000 + 0 + 0 + 0 + + + 8876 + 2000 + 0 + 0 + 0 + + + 8877 + 2000 + 0 + 0 + 0 + + + 8878 + 2000 + 0 + 0 + 0 + + + 8879 + 2000 + 0 + 0 + 0 + + + 8880 + 2000 + 0 + 0 + 0 + + + 8881 + 2000 + 0 + 0 + 0 + + + 8882 + 4 + 0 + 0 + 0 + + + 8883 + 1 + 0 + 0 + 0 + + + 8884 + 1 + 0 + 0 + 0 + + + 8885 + 1 + 0 + 0 + 0 + + + 8886 + 1 + 0 + 0 + 0 + + + 8887 + 1 + 0 + 0 + 0 + + + 8888 + 1 + 0 + 0 + 0 + + + 8889 + 1 + 0 + 0 + 0 + + + 8890 + 1 + 0 + 0 + 0 + + + 8891 + 1 + 0 + 0 + 0 + + + 8892 + 1 + 0 + 0 + 0 + + + 8893 + 1 + 0 + 0 + 0 + + + 8894 + 1 + 0 + 0 + 0 + + + 8895 + 1 + 0 + 0 + 0 + + + 8896 + 1 + 0 + 0 + 0 + + + 8897 + 1 + 0 + 0 + 0 + + + 8898 + 1 + 0 + 0 + 0 + + + 8899 + 1 + 0 + 0 + 0 + + + 8900 + 1 + 0 + 0 + 0 + + + 8901 + 3000 + 0 + 0 + 0 + + + 8902 + 3000 + 0 + 0 + 0 + + + 8903 + 3000 + 0 + 0 + 0 + + + 8904 + 3000 + 0 + 0 + 0 + + + 8905 + 3000 + 0 + 0 + 0 + + + 8906 + 3000 + 0 + 0 + 0 + + + 8907 + 3000 + 0 + 0 + 0 + + + 8908 + 3000 + 0 + 0 + 0 + + + 8909 + 3000 + 0 + 0 + 0 + + + 8910 + 3000 + 0 + 0 + 0 + + + 8911 + 3000 + 0 + 0 + 0 + + + 8912 + 3000 + 0 + 0 + 0 + + + 8913 + 3000 + 0 + 0 + 0 + + + 8914 + 3000 + 0 + 0 + 0 + + + 8915 + 3000 + 0 + 0 + 0 + + + 8916 + 3000 + 0 + 0 + 0 + + + 8917 + 3000 + 0 + 0 + 0 + + + 8918 + 3000 + 0 + 0 + 0 + + + 8919 + 3000 + 0 + 0 + 0 + + + 8920 + 3000 + 0 + 0 + 0 + + + 8921 + 3000 + 0 + 0 + 0 + + + 8922 + 3000 + 0 + 0 + 0 + + + 8923 + 900 + 0 + 0 + 0 + + + 8924 + 100 + 0 + 0 + 0 + + + 8925 + 100 + 0 + 0 + 0 + + + 8926 + 100 + 0 + 0 + 0 + + + 8927 + 100 + 0 + 0 + 0 + + + 8928 + 100 + 0 + 0 + 0 + + + 8929 + 100 + 0 + 0 + 0 + + + 8930 + 1 + 0 + 0 + 0 + + + 8931 + 1 + 0 + 0 + 0 + + + 8932 + 1 + 0 + 0 + 0 + + + 8933 + 1 + 0 + 0 + 0 + + + 8934 + 1 + 0 + 0 + 0 + + + 8935 + 1 + 0 + 0 + 0 + + + 8936 + 1 + 0 + 0 + 0 + + + 8937 + 1 + 0 + 0 + 0 + + + 8938 + 1 + 0 + 0 + 0 + + + 8939 + 1 + 0 + 0 + 0 + + + 8940 + 2 + 0 + 0 + 0 + + + 8941 + 2 + 0 + 0 + 0 + + + 8942 + 1 + 0 + 0 + 0 + + + 8943 + 1 + 0 + 0 + 0 + + + 8944 + 1 + 0 + 0 + 0 + + + 8945 + 1 + 0 + 0 + 0 + + + 8946 + 1 + 0 + 0 + 0 + + + 8947 + 1 + 0 + 0 + 0 + + + 8948 + 1 + 0 + 0 + 0 + + + 8949 + 1 + 0 + 0 + 0 + + + 8950 + 1 + 0 + 0 + 0 + + + 8951 + 1 + 0 + 0 + 0 + + + 8952 + 100 + 0 + 0 + 0 + + + 8953 + 100 + 0 + 0 + 0 + + + 8954 + 100 + 0 + 0 + 0 + + + 8955 + 100 + 0 + 0 + 0 + + + 8956 + 100 + 0 + 0 + 0 + + + 8957 + 100 + 0 + 0 + 0 + + + 8958 + 100 + 0 + 0 + 0 + + + 8959 + 50 + 0 + 0 + 0 + + + 8960 + 50 + 0 + 0 + 0 + + + 8961 + 50 + 0 + 0 + 0 + + + 8962 + 50 + 0 + 0 + 0 + + + 8963 + 50 + 0 + 0 + 0 + + + 8964 + 50 + 0 + 0 + 0 + + + 8965 + 50 + 0 + 0 + 0 + + + 8966 + 200 + 0 + 0 + 0 + + + 8967 + 200 + 0 + 0 + 0 + + + 8968 + 300 + 0 + 0 + 0 + + + 8969 + 400 + 0 + 0 + 0 + + + 8970 + 500 + 0 + 0 + 0 + + + 8971 + 600 + 0 + 0 + 0 + + + 8972 + 1 + 0 + 0 + 0 + + + 8973 + 1 + 0 + 0 + 0 + + + 8974 + 1 + 0 + 0 + 0 + + + 8975 + 1 + 0 + 0 + 0 + + + 8976 + 1 + 0 + 0 + 0 + + + 8977 + 1 + 0 + 0 + 0 + + + 8978 + 1 + 0 + 0 + 0 + + + 8979 + 1 + 0 + 0 + 0 + + + 8980 + 1 + 0 + 0 + 0 + + + 8981 + 1 + 0 + 0 + 0 + + + 8982 + 1 + 0 + 0 + 0 + + + 8983 + 1 + 0 + 0 + 0 + + + 8984 + 1 + 0 + 0 + 0 + + + 8985 + 1 + 0 + 0 + 0 + + + 8986 + 1 + 0 + 0 + 0 + + + 8987 + 1 + 0 + 0 + 0 + + + 8988 + 5 + 0 + 0 + 0 + + + 8989 + 1 + 0 + 0 + 0 + + + 8990 + 1 + 0 + 0 + 0 + + + 8991 + 100 + 0 + 0 + 0 + + + 8992 + 100 + 0 + 0 + 0 + + + 8993 + 100 + 0 + 0 + 0 + + + 8994 + 100 + 0 + 0 + 0 + + + 8995 + 100 + 0 + 0 + 0 + + + 8996 + 100 + 0 + 0 + 0 + + + 8997 + 100 + 0 + 0 + 0 + + + 8998 + 100 + 0 + 0 + 0 + + + 8999 + 100 + 0 + 0 + 0 + + + 9000 + 100 + 0 + 0 + 0 + + + 9001 + 100 + 0 + 0 + 0 + + + 9002 + 100 + 0 + 0 + 0 + + + 9003 + 2 + 0 + 0 + 0 + + + 9004 + 2 + 0 + 0 + 0 + + + 9005 + 1 + 0 + 0 + 0 + + + 9006 + 1 + 0 + 0 + 0 + + + 9007 + 1 + 0 + 0 + 0 + + + 9008 + 1 + 0 + 0 + 0 + + + 9009 + 1 + 0 + 0 + 0 + + + 9010 + 1 + 0 + 0 + 0 + + + 9011 + 1 + 0 + 0 + 0 + + + 9012 + 1 + 0 + 0 + 0 + + + 9013 + 1 + 0 + 0 + 0 + + + 9014 + 2 + 0 + 0 + 0 + + + 9015 + 2 + 0 + 0 + 0 + + + 9016 + 150 + 0 + 0 + 0 + + + 9017 + 75 + 0 + 0 + 0 + + + 9018 + 150 + 0 + 0 + 0 + + + 9019 + 75 + 0 + 0 + 0 + + + 9020 + 1 + 0 + 0 + 0 + + + 9021 + 280 + 0 + 0 + 0 + + + 9022 + 230 + 0 + 0 + 0 + + + 9023 + 180 + 0 + 0 + 0 + + + 9024 + 130 + 0 + 0 + 0 + + + 9025 + 1 + 0 + 0 + 0 + + + 9026 + 10 + 0 + 0 + 0 + + + 9027 + 10 + 0 + 0 + 0 + + + 9028 + 30 + 0 + 0 + 0 + + + 9029 + 30 + 0 + 0 + 0 + + + 9030 + 20 + 0 + 0 + 0 + + + 9031 + 20 + 0 + 0 + 0 + + + 9032 + 10 + 0 + 0 + 0 + + + 9033 + 10 + 0 + 0 + 0 + + + 9034 + 30 + 0 + 0 + 0 + + + 9035 + 30 + 0 + 0 + 0 + + + 9036 + 10 + 0 + 0 + 0 + + + 9037 + 10 + 0 + 0 + 0 + + + 9038 + 20 + 0 + 0 + 0 + + + 9039 + 20 + 0 + 0 + 0 + + + 9040 + 30 + 0 + 0 + 0 + + + 9041 + 30 + 0 + 0 + 0 + + + 9042 + 20 + 0 + 0 + 0 + + + 9043 + 20 + 0 + 0 + 0 + + + 9044 + 100 + 0 + 0 + 0 + + + 9045 + 100 + 0 + 0 + 0 + + + 9046 + 100 + 0 + 0 + 0 + + + 9047 + 100 + 0 + 0 + 0 + + + 9048 + 100 + 0 + 0 + 0 + + + 9049 + 100 + 0 + 0 + 0 + + + 9050 + 100 + 0 + 0 + 0 + + + 9051 + 100 + 0 + 0 + 0 + + + 9052 + 1 + 0 + 0 + 0 + + + 9053 + 1 + 0 + 0 + 0 + + + 9054 + 40 + 0 + 0 + 0 + + + 9055 + 40 + 0 + 0 + 0 + + + 9056 + 40 + 0 + 0 + 0 + + + 9057 + 40 + 0 + 0 + 0 + + + 9058 + 40 + 0 + 0 + 0 + + + 9059 + 40 + 0 + 0 + 0 + + + 9060 + 1 + 0 + 0 + 0 + + + 9061 + 1 + 0 + 0 + 0 + + + 9062 + 1 + 0 + 0 + 0 + + + 9063 + 1 + 0 + 0 + 0 + + + 9064 + 20 + 0 + 0 + 0 + + + 9065 + 20 + 0 + 0 + 0 + + + 9066 + 10 + 0 + 0 + 0 + + + 9067 + 4 + 0 + 0 + 0 + + + 9068 + 1000 + 0 + 0 + 0 + + + 9069 + 1000 + 0 + 0 + 0 + + + 9070 + 1000 + 0 + 0 + 0 + + + 9071 + 1000 + 0 + 0 + 0 + + + 9072 + 900 + 0 + 0 + 0 + + + 9073 + 900 + 0 + 0 + 0 + + + 9074 + 200 + 0 + 0 + 0 + + + 9075 + 220 + 0 + 0 + 0 + + + 9076 + 3 + 0 + 0 + 0 + + + 9077 + 8 + 0 + 0 + 0 + + + 9078 + 1 + 0 + 0 + 0 + + + 9079 + 20 + 0 + 0 + 0 + + + 9080 + 60 + 0 + 0 + 0 + + + 9081 + 60 + 0 + 0 + 0 + + + 9082 + 20 + 0 + 0 + 0 + + + 9083 + 1 + 0 + 0 + 0 + + + 9084 + 1 + 0 + 0 + 0 + + + 9085 + 1 + 0 + 0 + 0 + + + 9086 + 1 + 0 + 0 + 0 + + + 9087 + 1 + 0 + 0 + 0 + + + 9088 + 1 + 0 + 0 + 0 + + + 9089 + 1 + 0 + 0 + 0 + + + 9090 + 1 + 0 + 0 + 0 + + + 9091 + 15 + 0 + 0 + 0 + + + 9092 + 15 + 0 + 0 + 0 + + + 9093 + 15 + 0 + 0 + 0 + + + 9094 + 1 + 0 + 0 + 0 + + + 9095 + 1 + 0 + 0 + 0 + + + 9096 + 100 + 0 + 0 + 0 + + + 9097 + 100 + 0 + 0 + 0 + + + 9098 + 100 + 0 + 0 + 0 + + + 9099 + 100 + 0 + 0 + 0 + + + 9100 + 100 + 0 + 0 + 0 + + + 9101 + 2 + 0 + 0 + 0 + + + 9102 + 30 + 0 + 0 + 0 + + + 9103 + 30 + 0 + 0 + 0 + + + 9104 + 100 + 0 + 0 + 0 + + + 9105 + 1 + 0 + 0 + 0 + + + 9106 + 100 + 0 + 0 + 0 + + + 9107 + 1 + 0 + 0 + 0 + + + 9108 + 1 + 0 + 0 + 0 + + + 9109 + 1 + 0 + 0 + 0 + + + 9110 + 1 + 0 + 0 + 0 + + + 9111 + 1 + 0 + 0 + 0 + + + 9112 + 1 + 0 + 0 + 0 + + + 9113 + 1 + 0 + 0 + 0 + + + 9114 + 1 + 0 + 0 + 0 + + + 9115 + 1 + 0 + 0 + 0 + + + 9116 + 1 + 0 + 0 + 0 + + + 9117 + 1 + 0 + 0 + 0 + + + 9118 + 1 + 0 + 0 + 0 + + + 9119 + 1 + 0 + 0 + 0 + + + 9120 + 1 + 0 + 0 + 0 + + + 9121 + 1 + 0 + 0 + 0 + + + 9122 + 1 + 0 + 0 + 0 + + + 9123 + 1 + 0 + 0 + 0 + + + 9124 + 1 + 0 + 0 + 0 + + + 9125 + 1 + 0 + 0 + 0 + + + 9126 + 1 + 0 + 0 + 0 + + + 9127 + 1 + 0 + 0 + 0 + + + 9128 + 1 + 0 + 0 + 0 + + + 9129 + 1 + 0 + 0 + 0 + + + 9130 + 1 + 0 + 0 + 0 + + + 9131 + 1 + 0 + 0 + 0 + + + 9132 + 1 + 0 + 0 + 0 + + + 9133 + 1 + 0 + 0 + 0 + + + 9134 + 1 + 0 + 0 + 0 + + + 9135 + 1 + 0 + 0 + 0 + + + 9136 + 1 + 0 + 0 + 0 + + + 9137 + 1 + 0 + 0 + 0 + + + 9138 + 1 + 0 + 0 + 0 + + + 9139 + 2 + 0 + 0 + 0 + + + 9140 + 2 + 0 + 0 + 0 + + + 9141 + 8 + 0 + 0 + 0 + + + 9142 + 20 + 0 + 0 + 0 + + + 9143 + 58 + 0 + 0 + 0 + + + 9144 + 300 + 0 + 0 + 0 + + + 9145 + 5 + 0 + 0 + 0 + + + 9146 + 1 + 0 + 0 + 0 + + + 9147 + 1 + 0 + 0 + 0 + + + 9148 + 1 + 0 + 0 + 0 + + + 9149 + 1 + 0 + 0 + 0 + + + 9150 + 1 + 0 + 0 + 0 + + + 9151 + 1 + 0 + 0 + 0 + + + 9152 + 1 + 0 + 0 + 0 + + + 9153 + 1 + 0 + 0 + 0 + + + 9154 + 1 + 0 + 0 + 0 + + + 9155 + 1 + 0 + 0 + 0 + + + 9156 + 1 + 0 + 0 + 0 + + + 9157 + 1 + 0 + 0 + 0 + + + 9158 + 1 + 0 + 0 + 0 + + + 9159 + 1 + 0 + 0 + 0 + + + 9160 + 1 + 0 + 0 + 0 + + + 9161 + 1 + 0 + 0 + 0 + + + 9162 + 1 + 0 + 0 + 0 + + + 9163 + 1 + 0 + 0 + 0 + + + 9164 + 1 + 0 + 0 + 0 + + + 9165 + 1 + 0 + 0 + 0 + + + 9166 + 1 + 0 + 0 + 0 + + + 9167 + 1 + 0 + 0 + 0 + + + 9168 + 1 + 0 + 0 + 0 + + + 9169 + 1 + 0 + 0 + 0 + + + 9170 + 1 + 0 + 0 + 0 + + + 9171 + 1 + 0 + 0 + 0 + + + 9172 + 1 + 0 + 0 + 0 + + + 9173 + 1 + 0 + 0 + 0 + + + 9174 + 73 + 0 + 0 + 0 + + + 9175 + 73 + 0 + 0 + 0 + + + 9176 + 93 + 0 + 0 + 0 + + + 9177 + 157 + 0 + 0 + 0 + + + 9178 + 157 + 0 + 0 + 0 + + + 9179 + 360 + 0 + 0 + 0 + + + 9180 + 360 + 0 + 0 + 0 + + + 9181 + 783 + 0 + 0 + 0 + + + 9182 + 783 + 0 + 0 + 0 + + + 9183 + 1767 + 0 + 0 + 0 + + + 9184 + 1767 + 0 + 0 + 0 + + + 9185 + 16200 + 0 + 0 + 0 + + + 9186 + 16200 + 0 + 0 + 0 + + + 9187 + 10 + 0 + 0 + 0 + + + 9188 + 13 + 0 + 0 + 0 + + + 9189 + 17 + 0 + 0 + 0 + + + 9190 + 33 + 0 + 0 + 0 + + + 9191 + 67 + 0 + 0 + 0 + + + 9192 + 133 + 0 + 0 + 0 + + + 9193 + 667 + 0 + 0 + 0 + + + 9194 + 1000 + 0 + 0 + 0 + + + 9195 + 1 + 0 + 0 + 0 + + + 9196 + 1 + 0 + 0 + 0 + + + 9197 + 1 + 0 + 0 + 0 + + + 9198 + 1 + 0 + 0 + 0 + + + 9199 + 1 + 0 + 0 + 0 + + + 9200 + 1 + 0 + 0 + 0 + + + 9201 + 1 + 0 + 0 + 0 + + + 9202 + 1 + 0 + 0 + 0 + + + 9203 + 1 + 0 + 0 + 0 + + + 9204 + 1 + 0 + 0 + 0 + + + 9205 + 1 + 0 + 0 + 0 + + + 9206 + 1 + 0 + 0 + 0 + + + 9207 + 1 + 0 + 0 + 0 + + + 9208 + 1 + 0 + 0 + 0 + + + 9209 + 1 + 0 + 0 + 0 + + + 9210 + 1 + 0 + 0 + 0 + + + 9211 + 1 + 0 + 0 + 0 + + + 9212 + 1 + 0 + 0 + 0 + + + 9213 + 1 + 0 + 0 + 0 + + + 9214 + 1 + 0 + 0 + 0 + + + 9215 + 1 + 0 + 0 + 0 + + + 9216 + 1 + 0 + 0 + 0 + + + 9217 + 1 + 0 + 0 + 0 + + + 9218 + 1 + 0 + 0 + 0 + + + 9219 + 1 + 0 + 0 + 0 + + + 9220 + 1 + 0 + 0 + 0 + + + 9221 + 1 + 0 + 0 + 0 + + + 9222 + 1 + 0 + 0 + 0 + + + 9223 + 1 + 0 + 0 + 0 + + + 9224 + 1 + 0 + 0 + 0 + + + 9225 + 1 + 0 + 0 + 0 + + + 9226 + 1 + 0 + 0 + 0 + + + 9227 + 1 + 0 + 0 + 0 + + + 9228 + 1 + 0 + 0 + 0 + + + 9229 + 1 + 0 + 0 + 0 + + + 9230 + 1 + 0 + 0 + 0 + + + 9231 + 1 + 0 + 0 + 0 + + + 9232 + 1 + 0 + 0 + 0 + + + 9233 + 1 + 0 + 0 + 0 + + + 9234 + 1 + 0 + 0 + 0 + + + 9235 + 1 + 0 + 0 + 0 + + + 9236 + 7 + 0 + 0 + 0 + + + 9237 + 13 + 0 + 0 + 0 + + + 9238 + 15 + 0 + 0 + 0 + + + 9239 + 24 + 0 + 0 + 0 + + + 9240 + 40 + 0 + 0 + 0 + + + 9241 + 59 + 0 + 0 + 0 + + + 9242 + 138 + 0 + 0 + 0 + + + 9243 + 211 + 0 + 0 + 0 + + + 9244 + 1063 + 0 + 0 + 0 + + + 9245 + 15000 + 0 + 0 + 0 + + + 9246 + 1 + 0 + 0 + 0 + + + 9247 + 1 + 0 + 0 + 0 + + + 9248 + 1 + 0 + 0 + 0 + + + 9249 + 1 + 0 + 0 + 0 + + + 9250 + 1 + 0 + 0 + 0 + + + 9251 + 1 + 0 + 0 + 0 + + + 9252 + 1 + 0 + 0 + 0 + + + 9253 + 1 + 0 + 0 + 0 + + + 9254 + 1 + 0 + 0 + 0 + + + 9255 + 1 + 0 + 0 + 0 + + + 9256 + 1 + 0 + 0 + 0 + + + 9257 + 1 + 0 + 0 + 0 + + + 9258 + 1 + 0 + 0 + 0 + + + 9259 + 1 + 0 + 0 + 0 + + + 9260 + 1 + 0 + 0 + 0 + + + 9261 + 1 + 0 + 0 + 0 + + + 9262 + 1 + 0 + 0 + 0 + + + 9263 + 1 + 0 + 0 + 0 + + + 9264 + 1 + 0 + 0 + 0 + + + 9265 + 1 + 0 + 0 + 0 + + + 9266 + 1 + 0 + 0 + 0 + + + 9267 + 1 + 0 + 0 + 0 + + + 9268 + 1 + 0 + 0 + 0 + + + 9269 + 1 + 0 + 0 + 0 + + + 9270 + 1 + 0 + 0 + 0 + + + 9271 + 1 + 0 + 0 + 0 + + + 9272 + 1 + 0 + 0 + 0 + + + 9273 + 1 + 0 + 0 + 0 + + + 9274 + 1 + 0 + 0 + 0 + + + 9275 + 1 + 0 + 0 + 0 + + + 9276 + 1 + 0 + 0 + 0 + + + 9277 + 1 + 0 + 0 + 0 + + + 9278 + 1 + 0 + 0 + 0 + + + 9279 + 1 + 0 + 0 + 0 + + + 9280 + 1 + 0 + 0 + 0 + + + 9281 + 1 + 0 + 0 + 0 + + + 9282 + 1 + 0 + 0 + 0 + + + 9283 + 1 + 0 + 0 + 0 + + + 9284 + 1 + 0 + 0 + 0 + + + 9285 + 1 + 0 + 0 + 0 + + + 9286 + 2 + 0 + 0 + 0 + + + 9287 + 2 + 0 + 0 + 0 + + + 9288 + 8 + 0 + 0 + 0 + + + 9289 + 20 + 0 + 0 + 0 + + + 9290 + 58 + 0 + 0 + 0 + + + 9291 + 300 + 0 + 0 + 0 + + + 9292 + 5 + 0 + 0 + 0 + + + 9293 + 2 + 0 + 0 + 0 + + + 9294 + 2 + 0 + 0 + 0 + + + 9295 + 8 + 0 + 0 + 0 + + + 9296 + 20 + 0 + 0 + 0 + + + 9297 + 58 + 0 + 0 + 0 + + + 9298 + 300 + 0 + 0 + 0 + + + 9299 + 5 + 0 + 0 + 0 + + + 9300 + 2 + 0 + 0 + 0 + + + 9301 + 2 + 0 + 0 + 0 + + + 9302 + 8 + 0 + 0 + 0 + + + 9303 + 20 + 0 + 0 + 0 + + + 9304 + 58 + 0 + 0 + 0 + + + 9305 + 300 + 0 + 0 + 0 + + + 9306 + 5 + 0 + 0 + 0 + + + 9307 + 1 + 0 + 0 + 0 + + + 9308 + 1 + 0 + 0 + 0 + + + 9309 + 1 + 0 + 0 + 0 + + + 9310 + 1 + 0 + 0 + 0 + + + 9311 + 1 + 0 + 0 + 0 + + + 9312 + 1 + 0 + 0 + 0 + + + 9313 + 1 + 0 + 0 + 0 + + + 9314 + 1 + 0 + 0 + 0 + + + 9315 + 1 + 0 + 0 + 0 + + + 9316 + 1 + 0 + 0 + 0 + + + 9317 + 1 + 0 + 0 + 0 + + + 9318 + 1 + 0 + 0 + 0 + + + 9319 + 1 + 0 + 0 + 0 + + + 9320 + 1 + 0 + 0 + 0 + + + 9321 + 1 + 0 + 0 + 0 + + + 9322 + 1 + 0 + 0 + 0 + + + 9323 + 1 + 0 + 0 + 0 + + + 9324 + 1 + 0 + 0 + 0 + + + 9325 + 1 + 0 + 0 + 0 + + + 9326 + 1 + 0 + 0 + 0 + + + 9327 + 1 + 0 + 0 + 0 + + + 9328 + 1 + 0 + 0 + 0 + + + 9329 + 1 + 0 + 0 + 0 + + + 9330 + 1 + 0 + 0 + 0 + + + 9331 + 1 + 0 + 0 + 0 + + + 9332 + 1 + 0 + 0 + 0 + + + 9333 + 1 + 0 + 0 + 0 + + + 9334 + 1 + 0 + 0 + 0 + + + 9335 + 12 + 0 + 0 + 0 + + + 9336 + 22 + 0 + 0 + 0 + + + 9337 + 37 + 0 + 0 + 0 + + + 9338 + 53 + 0 + 0 + 0 + + + 9339 + 125 + 0 + 0 + 0 + + + 9340 + 192 + 0 + 0 + 0 + + + 9341 + 967 + 0 + 0 + 0 + + + 9342 + 13633 + 0 + 0 + 0 + + + 9343 + 1 + 0 + 0 + 0 + + + 9344 + 1 + 0 + 0 + 0 + + + 9345 + 1 + 0 + 0 + 0 + + + 9346 + 1 + 0 + 0 + 0 + + + 9347 + 1 + 0 + 0 + 0 + + + 9348 + 1 + 0 + 0 + 0 + + + 9349 + 1 + 0 + 0 + 0 + + + 9350 + 1 + 0 + 0 + 0 + + + 9351 + 1 + 0 + 0 + 0 + + + 9352 + 1 + 0 + 0 + 0 + + + 9353 + 1 + 0 + 0 + 0 + + + 9354 + 1 + 0 + 0 + 0 + + + 9355 + 1 + 0 + 0 + 0 + + + 9356 + 1 + 0 + 0 + 0 + + + 9357 + 1 + 0 + 0 + 0 + + + 9358 + 1 + 0 + 0 + 0 + + + 9359 + 1 + 0 + 0 + 0 + + + 9360 + 1 + 0 + 0 + 0 + + + 9361 + 1 + 0 + 0 + 0 + + + 9362 + 1 + 0 + 0 + 0 + + + 9363 + 1 + 0 + 0 + 0 + + + 9364 + 1 + 0 + 0 + 0 + + + 9365 + 1 + 0 + 0 + 0 + + + 9366 + 1 + 0 + 0 + 0 + + + 9367 + 1 + 0 + 0 + 0 + + + 9368 + 1 + 0 + 0 + 0 + + + 9369 + 1 + 0 + 0 + 0 + + + 9370 + 1 + 0 + 0 + 0 + + + 9371 + 1 + 0 + 0 + 0 + + + 9372 + 1 + 0 + 0 + 0 + + + 9373 + 1 + 0 + 0 + 0 + + + 9374 + 1 + 0 + 0 + 0 + + + 9375 + 1 + 0 + 0 + 0 + + + 9376 + 1 + 0 + 0 + 0 + + + 9377 + 1 + 0 + 0 + 0 + + + 9378 + 1 + 0 + 0 + 0 + + + 9379 + 1 + 0 + 0 + 0 + + + 9380 + 1 + 0 + 0 + 0 + + + 9381 + 1 + 0 + 0 + 0 + + + 9382 + 1 + 0 + 0 + 0 + + + 9383 + 1 + 0 + 0 + 0 + + + 9384 + 1 + 0 + 0 + 0 + + + 9385 + 1 + 0 + 0 + 0 + + + 9386 + 1 + 0 + 0 + 0 + + + 9387 + 1 + 0 + 0 + 0 + + + 9388 + 1 + 0 + 0 + 0 + + + 9389 + 1 + 0 + 0 + 0 + + + 9390 + 1 + 0 + 0 + 0 + + + 9391 + 1 + 0 + 0 + 0 + + + 9392 + 1 + 0 + 0 + 0 + + + 9393 + 1 + 0 + 0 + 0 + + + 9394 + 1 + 0 + 0 + 0 + + + 9395 + 1 + 0 + 0 + 0 + + + 9396 + 1 + 0 + 0 + 0 + + + 9397 + 1 + 0 + 0 + 0 + + + 9398 + 1 + 0 + 0 + 0 + + + 9399 + 1 + 0 + 0 + 0 + + + 9400 + 1 + 0 + 0 + 0 + + + 9401 + 1 + 0 + 0 + 0 + + + 9402 + 1 + 0 + 0 + 0 + + + 9403 + 1 + 0 + 0 + 0 + + + 9404 + 1 + 0 + 0 + 0 + + + 9405 + 1 + 0 + 0 + 0 + + + 9406 + 1 + 0 + 0 + 0 + + + 9407 + 1 + 0 + 0 + 0 + + + 9408 + 1 + 0 + 0 + 0 + + + 9409 + 1 + 0 + 0 + 0 + + + 9410 + 1 + 0 + 0 + 0 + + + 9411 + 1 + 0 + 0 + 0 + + + 9412 + 1 + 0 + 0 + 0 + + + 9413 + 1 + 0 + 0 + 0 + + + 9414 + 1 + 0 + 0 + 0 + + + 9415 + 1 + 0 + 0 + 0 + + + 9416 + 30 + 0 + 0 + 0 + + + 9417 + 30 + 0 + 0 + 0 + + + 9418 + 48 + 0 + 0 + 0 + + + 9419 + 1 + 0 + 0 + 0 + + + 9420 + 20 + 0 + 0 + 0 + + + 9421 + 20 + 0 + 0 + 0 + + + 9422 + 33 + 0 + 0 + 0 + + + 9423 + 70 + 0 + 0 + 0 + + + 9424 + 70 + 0 + 0 + 0 + + + 9425 + 250 + 0 + 0 + 0 + + + 9426 + 250 + 0 + 0 + 0 + + + 9427 + 650 + 0 + 0 + 0 + + + 9428 + 650 + 0 + 0 + 0 + + + 9429 + 1600 + 0 + 0 + 0 + + + 9430 + 1600 + 0 + 0 + 0 + + + 9431 + 16000 + 0 + 0 + 0 + + + 9432 + 16000 + 0 + 0 + 0 + + + 9433 + 5000 + 0 + 0 + 0 + + + 9434 + 25 + 0 + 0 + 0 + + + 9435 + 25 + 0 + 0 + 0 + + + 9436 + 2 + 0 + 0 + 0 + + + 9437 + 2 + 0 + 0 + 0 + + + 9438 + 1 + 0 + 0 + 0 + + + 9439 + 1 + 0 + 0 + 0 + + + 9440 + 20 + 0 + 0 + 0 + + + 9441 + 20 + 0 + 0 + 0 + + + 9442 + 27 + 0 + 0 + 0 + + + 9443 + 27 + 0 + 0 + 0 + + + 9444 + 53 + 0 + 0 + 0 + + + 9445 + 53 + 0 + 0 + 0 + + + 9446 + 77 + 0 + 0 + 0 + + + 9447 + 77 + 0 + 0 + 0 + + + 9448 + 100 + 0 + 0 + 0 + + + 9449 + 100 + 0 + 0 + 0 + + + 9450 + 133 + 0 + 0 + 0 + + + 9451 + 133 + 0 + 0 + 0 + + + 9452 + 167 + 0 + 0 + 0 + + + 9453 + 167 + 0 + 0 + 0 + + + 9454 + 40 + 0 + 0 + 0 + + + 9455 + 40 + 0 + 0 + 0 + + + 9456 + 60 + 0 + 0 + 0 + + + 9457 + 123 + 0 + 0 + 0 + + + 9458 + 123 + 0 + 0 + 0 + + + 9459 + 327 + 0 + 0 + 0 + + + 9460 + 327 + 0 + 0 + 0 + + + 9461 + 750 + 0 + 0 + 0 + + + 9462 + 750 + 0 + 0 + 0 + + + 9463 + 1733 + 0 + 0 + 0 + + + 9464 + 1733 + 0 + 0 + 0 + + + 9465 + 16167 + 0 + 0 + 0 + + + 9466 + 16167 + 0 + 0 + 0 + + + 9467 + 18 + 0 + 0 + 0 + + + 9468 + 1 + 0 + 0 + 0 + + + 9469 + 250 + 0 + 0 + 0 + + + 9470 + 1000 + 0 + 0 + 0 + + + 9471 + 1000 + 0 + 0 + 0 + + + 9472 + 1000 + 0 + 0 + 0 + + + 9473 + 1000 + 0 + 0 + 0 + + + 9474 + 250 + 0 + 0 + 0 + + + 9475 + 250 + 0 + 0 + 0 + + + 9476 + 250 + 0 + 0 + 0 + + + 9477 + 1 + 0 + 0 + 0 + + + 9478 + 2 + 0 + 0 + 0 + + + 9479 + 2 + 0 + 0 + 0 + + + 9480 + 2 + 0 + 0 + 0 + + + 9481 + 2 + 0 + 0 + 0 + + + 9482 + 2 + 0 + 0 + 0 + + + 9483 + 2 + 0 + 0 + 0 + + + 9484 + 2 + 0 + 0 + 0 + + + 9485 + 2 + 0 + 0 + 0 + + + 9486 + 2 + 0 + 0 + 0 + + + 9487 + 1 + 0 + 0 + 0 + + + 9488 + 1 + 0 + 0 + 0 + + + 9489 + 1 + 0 + 0 + 0 + + + 9490 + 1 + 0 + 0 + 0 + + + 9491 + 1 + 0 + 0 + 0 + + + 9492 + 1 + 0 + 0 + 0 + + + 9493 + 1 + 0 + 0 + 0 + + + 9494 + 1 + 0 + 0 + 0 + + + 9495 + 1 + 0 + 0 + 0 + + + 9496 + 1 + 0 + 0 + 0 + + + 9497 + 1 + 0 + 0 + 0 + + + 9498 + 1 + 0 + 0 + 0 + + + 9499 + 1 + 0 + 0 + 0 + + + 9500 + 1 + 0 + 0 + 0 + + + 9501 + 1 + 0 + 0 + 0 + + + 9502 + 1 + 0 + 0 + 0 + + + 9503 + 1 + 0 + 0 + 0 + + + 9504 + 1 + 0 + 0 + 0 + + + 9505 + 1 + 0 + 0 + 0 + + + 9506 + 1 + 0 + 0 + 0 + + + 9507 + 1 + 0 + 0 + 0 + + + 9508 + 1 + 0 + 0 + 0 + + + 9509 + 1 + 0 + 0 + 0 + + + 9510 + 1 + 0 + 0 + 0 + + + 9511 + 1 + 0 + 0 + 0 + + + 9512 + 1 + 0 + 0 + 0 + + + 9513 + 1 + 0 + 0 + 0 + + + 9514 + 1 + 0 + 0 + 0 + + + 9515 + 1 + 0 + 0 + 0 + + + 9516 + 1 + 0 + 0 + 0 + + + 9517 + 1 + 0 + 0 + 0 + + + 9518 + 1 + 0 + 0 + 0 + + + 9519 + 1 + 0 + 0 + 0 + + + 9520 + 1 + 0 + 0 + 0 + + + 9521 + 1 + 0 + 0 + 0 + + + 9522 + 1 + 0 + 0 + 0 + + + 9523 + 1 + 0 + 0 + 0 + + + 9524 + 1 + 0 + 0 + 0 + + + 9525 + 1 + 0 + 0 + 0 + + + 9526 + 1 + 0 + 0 + 0 + + + 9527 + 1 + 0 + 0 + 0 + + + 9528 + 1 + 0 + 0 + 0 + + + 9529 + 1 + 0 + 0 + 0 + + + 9530 + 1 + 0 + 0 + 0 + + + 9531 + 1 + 0 + 0 + 0 + + + 9532 + 1 + 0 + 0 + 0 + + + 9533 + 1 + 0 + 0 + 0 + + + 9534 + 1 + 0 + 0 + 0 + + + 9535 + 1 + 0 + 0 + 0 + + + 9536 + 1 + 0 + 0 + 0 + + + 9537 + 1 + 0 + 0 + 0 + + + 9538 + 1 + 0 + 0 + 0 + + + 9539 + 1 + 0 + 0 + 0 + + + 9540 + 1 + 0 + 0 + 0 + + + 9541 + 1 + 0 + 0 + 0 + + + 9542 + 1 + 0 + 0 + 0 + + + 9543 + 1 + 0 + 0 + 0 + + + 9544 + 1 + 0 + 0 + 0 + + + 9545 + 1 + 0 + 0 + 0 + + + 9546 + 1 + 0 + 0 + 0 + + + 9547 + 1 + 0 + 0 + 0 + + + 9548 + 1 + 0 + 0 + 0 + + + 9549 + 1 + 0 + 0 + 0 + + + 9550 + 1 + 0 + 0 + 0 + + + 9551 + 1 + 0 + 0 + 0 + + + 9552 + 1 + 0 + 0 + 0 + + + 9553 + 1 + 0 + 0 + 0 + + + 9554 + 1 + 0 + 0 + 0 + + + 9555 + 1 + 0 + 0 + 0 + + + 9556 + 1 + 0 + 0 + 0 + + + 9557 + 1 + 0 + 0 + 0 + + + 9558 + 2 + 0 + 0 + 0 + + + 9559 + 2 + 0 + 0 + 0 + + + 9560 + 2 + 0 + 0 + 0 + + + 9561 + 2 + 0 + 0 + 0 + + + 9562 + 2 + 0 + 0 + 0 + + + 9563 + 2 + 0 + 0 + 0 + + + 9564 + 2 + 0 + 0 + 0 + + + 9565 + 2 + 0 + 0 + 0 + + + 9566 + 2 + 0 + 0 + 0 + + + 9567 + 2 + 0 + 0 + 0 + + + 9568 + 2 + 0 + 0 + 0 + + + 9569 + 2 + 0 + 0 + 0 + + + 9570 + 2 + 0 + 0 + 0 + + + 9571 + 2 + 0 + 0 + 0 + + + 9572 + 2 + 0 + 0 + 0 + + + 9573 + 2 + 0 + 0 + 0 + + + 9574 + 2 + 0 + 0 + 0 + + + 9575 + 2 + 0 + 0 + 0 + + + 9576 + 2 + 0 + 0 + 0 + + + 9577 + 2 + 0 + 0 + 0 + + + 9578 + 2 + 0 + 0 + 0 + + + 9579 + 2 + 0 + 0 + 0 + + + 9580 + 2 + 0 + 0 + 0 + + + 9581 + 2 + 0 + 0 + 0 + + + 9582 + 2 + 0 + 0 + 0 + + + 9583 + 2 + 0 + 0 + 0 + + + 9584 + 2 + 0 + 0 + 0 + + + 9585 + 10 + 0 + 0 + 0 + + + 9586 + 10 + 0 + 0 + 0 + + + 9587 + 10 + 0 + 0 + 0 + + + 9588 + 2 + 0 + 0 + 0 + + + 9589 + 1 + 0 + 0 + 0 + + + 9590 + 1 + 0 + 0 + 0 + + + 9591 + 1 + 0 + 0 + 0 + + + 9592 + 1 + 0 + 0 + 0 + + + 9593 + 1 + 0 + 0 + 0 + + + 9594 + 1 + 0 + 0 + 0 + + + 9595 + 1 + 0 + 0 + 0 + + + 9596 + 10 + 0 + 0 + 0 + + + 9597 + 1 + 0 + 0 + 0 + + + 9598 + 1 + 0 + 0 + 0 + + + 9599 + 1 + 0 + 0 + 0 + + + 9600 + 1 + 0 + 0 + 0 + + + 9601 + 1 + 0 + 0 + 0 + + + 9602 + 1 + 0 + 0 + 0 + + + 9603 + 1 + 0 + 0 + 0 + + + 9604 + 1 + 0 + 0 + 0 + + + 9605 + 1 + 0 + 0 + 0 + + + 9606 + 1 + 0 + 0 + 0 + + + 9607 + 1 + 0 + 0 + 0 + + + 9608 + 1 + 0 + 0 + 0 + + + 9609 + 1 + 0 + 0 + 0 + + + 9610 + 1 + 0 + 0 + 0 + + + 9611 + 1 + 0 + 0 + 0 + + + 9612 + 1 + 0 + 0 + 0 + + + 9613 + 1 + 0 + 0 + 0 + + + 9614 + 1 + 0 + 0 + 0 + + + 9615 + 1 + 0 + 0 + 0 + + + 9616 + 1 + 0 + 0 + 0 + + + 9617 + 1 + 0 + 0 + 0 + + + 9618 + 1 + 0 + 0 + 0 + + + 9619 + 1 + 0 + 0 + 0 + + + 9620 + 1 + 0 + 0 + 0 + + + 9621 + 1 + 0 + 0 + 0 + + + 9622 + 1 + 0 + 0 + 0 + + + 9623 + 1 + 0 + 0 + 0 + + + 9624 + 1 + 0 + 0 + 0 + + + 9625 + 10 + 0 + 0 + 0 + + + 9626 + 10000 + 0 + 0 + 0 + + + 9627 + 2 + 0 + 0 + 0 + + + 9628 + 1 + 0 + 0 + 0 + + + 9629 + 1265 + 0 + 0 + 0 + + + 9630 + 1265 + 0 + 0 + 0 + + + 9631 + 2 + 0 + 0 + 0 + + + 9632 + 100 + 0 + 0 + 0 + + + 9633 + 1 + 0 + 0 + 0 + + + 9634 + 650 + 0 + 0 + 0 + + + 9635 + 650 + 0 + 0 + 0 + + + 9636 + 650 + 0 + 0 + 0 + + + 9637 + 650 + 0 + 0 + 0 + + + 9638 + 650 + 0 + 0 + 0 + + + 9639 + 650 + 0 + 0 + 0 + + + 9640 + 6 + 0 + 0 + 0 + + + 9641 + 6 + 0 + 0 + 0 + + + 9642 + 6 + 0 + 0 + 0 + + + 9643 + 6 + 0 + 0 + 0 + + + 9644 + 6 + 0 + 0 + 0 + + + 9645 + 6 + 0 + 0 + 0 + + + 9646 + 1 + 0 + 0 + 0 + + + 9647 + 1 + 0 + 0 + 0 + + + 9648 + 1 + 0 + 0 + 0 + + + 9649 + 1 + 0 + 0 + 0 + + + 9650 + 1 + 0 + 0 + 0 + + + 9651 + 1 + 0 + 0 + 0 + + + 9652 + 1 + 0 + 0 + 0 + + + 9653 + 1 + 0 + 0 + 0 + + + 9654 + 1 + 0 + 0 + 0 + + + 9655 + 1 + 0 + 0 + 0 + + + 9656 + 1 + 0 + 0 + 0 + + + 9657 + 1 + 0 + 0 + 0 + + + 9658 + 1 + 0 + 0 + 0 + + + 9659 + 1 + 0 + 0 + 0 + + + 9660 + 1 + 0 + 0 + 0 + + + 9661 + 1 + 0 + 0 + 0 + + + 9662 + 1 + 0 + 0 + 0 + + + 9663 + 1 + 0 + 0 + 0 + + + 9664 + 1 + 0 + 0 + 0 + + + 9665 + 1 + 0 + 0 + 0 + + + 9666 + 25000 + 0 + 0 + 0 + + + 9667 + 25000 + 0 + 0 + 0 + + + 9668 + 20000 + 0 + 0 + 0 + + + 9669 + 20000 + 0 + 0 + 0 + + + 9670 + 25000 + 0 + 0 + 0 + + + 9671 + 25000 + 0 + 0 + 0 + + + 9672 + 8000 + 0 + 0 + 0 + + + 9673 + 8000 + 0 + 0 + 0 + + + 9674 + 12000 + 0 + 0 + 0 + + + 9675 + 12000 + 0 + 0 + 0 + + + 9676 + 10000 + 0 + 0 + 0 + + + 9677 + 10000 + 0 + 0 + 0 + + + 9678 + 10000 + 0 + 0 + 0 + + + 9679 + 10000 + 0 + 0 + 0 + + + 9680 + 1 + 0 + 0 + 0 + + + 9681 + 1 + 0 + 0 + 0 + + + 9682 + 1 + 0 + 0 + 0 + + + 9683 + 1 + 0 + 0 + 0 + + + 9684 + 1 + 0 + 0 + 0 + + + 9685 + 1 + 0 + 0 + 0 + + + 9686 + 1 + 0 + 0 + 0 + + + 9687 + 1 + 0 + 0 + 0 + + + 9688 + 1 + 0 + 0 + 0 + + + 9689 + 1 + 0 + 0 + 0 + + + 9690 + 1 + 0 + 0 + 0 + + + 9691 + 1 + 0 + 0 + 0 + + + 9692 + 1 + 0 + 0 + 0 + + + 9693 + 1 + 0 + 0 + 0 + + + 9694 + 1 + 0 + 0 + 0 + + + 9695 + 1 + 0 + 0 + 0 + + + 9696 + 1 + 0 + 0 + 0 + + + 9697 + 1 + 0 + 0 + 0 + + + 9698 + 1 + 0 + 0 + 0 + + + 9699 + 1 + 0 + 0 + 0 + + + 9700 + 1 + 0 + 0 + 0 + + + 9701 + 1 + 0 + 0 + 0 + + + 9702 + 1 + 0 + 0 + 0 + + + 9703 + 1 + 0 + 0 + 0 + + + 9704 + 1 + 0 + 0 + 0 + + + 9705 + 1 + 0 + 0 + 0 + + + 9706 + 1 + 0 + 0 + 0 + + + 9707 + 1 + 0 + 0 + 0 + + + 9708 + 1 + 0 + 0 + 0 + + + 9709 + 1 + 0 + 0 + 0 + + + 9710 + 1 + 0 + 0 + 0 + + + 9711 + 1 + 0 + 0 + 0 + + + 9712 + 1 + 0 + 0 + 0 + + + 9713 + 1 + 0 + 0 + 0 + + + 9714 + 1 + 0 + 0 + 0 + + + 9715 + 10 + 0 + 0 + 0 + + + 9716 + 1 + 0 + 0 + 0 + + + 9717 + 1 + 0 + 0 + 0 + + + 9718 + 1 + 0 + 0 + 0 + + + 9719 + 1 + 0 + 0 + 0 + + + 9720 + 1 + 0 + 0 + 0 + + + 9721 + 1 + 0 + 0 + 0 + + + 9722 + 1 + 0 + 0 + 0 + + + 9723 + 1 + 0 + 0 + 0 + + + 9724 + 1 + 0 + 0 + 0 + + + 9725 + 1 + 0 + 0 + 0 + + + 9726 + 1 + 0 + 0 + 0 + + + 9727 + 1 + 0 + 0 + 0 + + + 9728 + 1 + 0 + 0 + 0 + + + 9729 + 20 + 0 + 0 + 0 + + + 9730 + 20 + 0 + 0 + 0 + + + 9731 + 3000 + 0 + 0 + 0 + + + 9732 + 3000 + 0 + 0 + 0 + + + 9733 + 3000 + 0 + 0 + 0 + + + 9734 + 3000 + 0 + 0 + 0 + + + 9735 + 12 + 0 + 0 + 0 + + + 9736 + 12 + 0 + 0 + 0 + + + 9737 + 12 + 0 + 0 + 0 + + + 9738 + 12 + 0 + 0 + 0 + + + 9739 + 215 + 0 + 0 + 0 + + + 9740 + 215 + 0 + 0 + 0 + + + 9741 + 160 + 0 + 0 + 0 + + + 9742 + 160 + 0 + 0 + 0 + + + 9743 + 105 + 0 + 0 + 0 + + + 9744 + 105 + 0 + 0 + 0 + + + 9745 + 52 + 0 + 0 + 0 + + + 9746 + 52 + 0 + 0 + 0 + + + 9747 + 99000 + 0 + 0 + 0 + + + 9748 + 99000 + 0 + 0 + 0 + + + 9749 + 1 + 0 + 0 + 0 + + + 9750 + 99000 + 0 + 0 + 0 + + + 9751 + 99000 + 0 + 0 + 0 + + + 9752 + 1 + 0 + 0 + 0 + + + 9753 + 99000 + 0 + 0 + 0 + + + 9754 + 99000 + 0 + 0 + 0 + + + 9755 + 1 + 0 + 0 + 0 + + + 9756 + 99000 + 0 + 0 + 0 + + + 9757 + 99000 + 0 + 0 + 0 + + + 9758 + 1 + 0 + 0 + 0 + + + 9759 + 99000 + 0 + 0 + 0 + + + 9760 + 99000 + 0 + 0 + 0 + + + 9761 + 1 + 0 + 0 + 0 + + + 9762 + 99000 + 0 + 0 + 0 + + + 9763 + 99000 + 0 + 0 + 0 + + + 9764 + 1 + 0 + 0 + 0 + + + 9765 + 99000 + 0 + 0 + 0 + + + 9766 + 99000 + 0 + 0 + 0 + + + 9767 + 1 + 0 + 0 + 0 + + + 9768 + 99000 + 0 + 0 + 0 + + + 9769 + 99000 + 0 + 0 + 0 + + + 9770 + 1 + 0 + 0 + 0 + + + 9771 + 99000 + 0 + 0 + 0 + + + 9772 + 99000 + 0 + 0 + 0 + + + 9773 + 1 + 0 + 0 + 0 + + + 9774 + 99000 + 0 + 0 + 0 + + + 9775 + 99000 + 0 + 0 + 0 + + + 9776 + 1 + 0 + 0 + 0 + + + 9777 + 99000 + 0 + 0 + 0 + + + 9778 + 99000 + 0 + 0 + 0 + + + 9779 + 1 + 0 + 0 + 0 + + + 9780 + 99000 + 0 + 0 + 0 + + + 9781 + 99000 + 0 + 0 + 0 + + + 9782 + 1 + 0 + 0 + 0 + + + 9783 + 99000 + 0 + 0 + 0 + + + 9784 + 99000 + 0 + 0 + 0 + + + 9785 + 1 + 0 + 0 + 0 + + + 9786 + 99000 + 0 + 0 + 0 + + + 9787 + 99000 + 0 + 0 + 0 + + + 9788 + 1 + 0 + 0 + 0 + + + 9789 + 99000 + 0 + 0 + 0 + + + 9790 + 99000 + 0 + 0 + 0 + + + 9791 + 1 + 0 + 0 + 0 + + + 9792 + 99000 + 0 + 0 + 0 + + + 9793 + 99000 + 0 + 0 + 0 + + + 9794 + 1 + 0 + 0 + 0 + + + 9795 + 99000 + 0 + 0 + 0 + + + 9796 + 99000 + 0 + 0 + 0 + + + 9797 + 1 + 0 + 0 + 0 + + + 9798 + 99000 + 0 + 0 + 0 + + + 9799 + 99000 + 0 + 0 + 0 + + + 9800 + 1 + 0 + 0 + 0 + + + 9801 + 99000 + 0 + 0 + 0 + + + 9802 + 99000 + 0 + 0 + 0 + + + 9803 + 1 + 0 + 0 + 0 + + + 9804 + 99000 + 0 + 0 + 0 + + + 9805 + 99000 + 0 + 0 + 0 + + + 9806 + 1 + 0 + 0 + 0 + + + 9807 + 99000 + 0 + 0 + 0 + + + 9808 + 99000 + 0 + 0 + 0 + + + 9809 + 1 + 0 + 0 + 0 + + + 9810 + 99000 + 0 + 0 + 0 + + + 9811 + 99000 + 0 + 0 + 0 + + + 9812 + 1 + 0 + 0 + 0 + + + 9813 + 99000 + 0 + 0 + 0 + + + 9814 + 1 + 0 + 0 + 0 + + + 9815 + 1 + 0 + 0 + 0 + + + 9816 + 1 + 0 + 0 + 0 + + + 9817 + 1 + 0 + 0 + 0 + + + 9818 + 1 + 0 + 0 + 0 + + + 9819 + 1 + 0 + 0 + 0 + + + 9820 + 1 + 0 + 0 + 0 + + + 9821 + 1 + 0 + 0 + 0 + + + 9822 + 1 + 0 + 0 + 0 + + + 9823 + 1 + 0 + 0 + 0 + + + 9824 + 1 + 0 + 0 + 0 + + + 9825 + 1 + 0 + 0 + 0 + + + 9826 + 1 + 0 + 0 + 0 + + + 9827 + 1 + 0 + 0 + 0 + + + 9828 + 1 + 0 + 0 + 0 + + + 9829 + 1 + 0 + 0 + 0 + + + 9830 + 1 + 0 + 0 + 0 + + + 9831 + 1 + 0 + 0 + 0 + + + 9832 + 1 + 0 + 0 + 0 + + + 9833 + 1 + 0 + 0 + 0 + + + 9834 + 1 + 0 + 0 + 0 + + + 9835 + 1 + 0 + 0 + 0 + + + 9836 + 1 + 0 + 0 + 0 + + + 9837 + 1 + 0 + 0 + 0 + + + 9838 + 1 + 0 + 0 + 0 + + + 9839 + 1 + 0 + 0 + 0 + + + 9840 + 1 + 0 + 0 + 0 + + + 9841 + 1 + 0 + 0 + 0 + + + 9842 + 50000 + 0 + 0 + 0 + + + 9843 + 10 + 0 + 0 + 0 + + + 9844 + 10 + 0 + 0 + 0 + + + 9845 + 10 + 0 + 0 + 0 + + + 9846 + 10 + 0 + 0 + 0 + + + 9847 + 10 + 0 + 0 + 0 + + + 9848 + 10 + 0 + 0 + 0 + + + 9849 + 10 + 0 + 0 + 0 + + + 9850 + 10 + 0 + 0 + 0 + + + 9851 + 10 + 0 + 0 + 0 + + + 9852 + 10 + 0 + 0 + 0 + + + 9853 + 10 + 0 + 0 + 0 + + + 9854 + 10 + 0 + 0 + 0 + + + 9855 + 10 + 0 + 0 + 0 + + + 9856 + 10 + 0 + 0 + 0 + + + 9857 + 10 + 0 + 0 + 0 + + + 9858 + 10 + 0 + 0 + 0 + + + 9859 + 10 + 0 + 0 + 0 + + + 9860 + 10 + 0 + 0 + 0 + + + 9861 + 10 + 0 + 0 + 0 + + + 9862 + 10 + 0 + 0 + 0 + + + 9863 + 10 + 0 + 0 + 0 + + + 9864 + 10 + 0 + 0 + 0 + + + 9865 + 10 + 0 + 0 + 0 + + + 9866 + 10 + 0 + 0 + 0 + + + 9867 + 10 + 0 + 0 + 0 + + + 9868 + 10 + 0 + 0 + 0 + + + 9869 + 10 + 0 + 0 + 0 + + + 9870 + 10 + 0 + 0 + 0 + + + 9871 + 10 + 0 + 0 + 0 + + + 9872 + 10 + 0 + 0 + 0 + + + 9873 + 10 + 0 + 0 + 0 + + + 9874 + 10 + 0 + 0 + 0 + + + 9875 + 10 + 0 + 0 + 0 + + + 9876 + 10 + 0 + 0 + 0 + + + 9877 + 10 + 0 + 0 + 0 + + + 9878 + 10 + 0 + 0 + 0 + + + 9879 + 10 + 0 + 0 + 0 + + + 9880 + 10 + 0 + 0 + 0 + + + 9881 + 10 + 0 + 0 + 0 + + + 9882 + 10 + 0 + 0 + 0 + + + 9883 + 10 + 0 + 0 + 0 + + + 9884 + 10 + 0 + 0 + 0 + + + 9885 + 10 + 0 + 0 + 0 + + + 9886 + 10 + 0 + 0 + 0 + + + 9887 + 10 + 0 + 0 + 0 + + + 9888 + 10 + 0 + 0 + 0 + + + 9889 + 10 + 0 + 0 + 0 + + + 9890 + 10 + 0 + 0 + 0 + + + 9891 + 10 + 0 + 0 + 0 + + + 9892 + 10 + 0 + 0 + 0 + + + 9893 + 1 + 0 + 0 + 0 + + + 9894 + 1 + 0 + 0 + 0 + + + 9895 + 1 + 0 + 0 + 0 + + + 9896 + 1 + 0 + 0 + 0 + + + 9897 + 1 + 0 + 0 + 0 + + + 9898 + 1 + 0 + 0 + 0 + + + 9899 + 1 + 0 + 0 + 0 + + + 9900 + 1 + 0 + 0 + 0 + + + 9901 + 5 + 0 + 0 + 0 + + + 9902 + 5 + 0 + 0 + 0 + + + 9903 + 20 + 0 + 0 + 0 + + + 9904 + 1 + 0 + 0 + 0 + + + 9905 + 1 + 0 + 0 + 0 + + + 9906 + 1 + 0 + 0 + 0 + + + 9907 + 1 + 0 + 0 + 0 + + + 9908 + 1 + 0 + 0 + 0 + + + 9909 + 1 + 0 + 0 + 0 + + + 9910 + 1 + 0 + 0 + 0 + + + 9911 + 1 + 0 + 0 + 0 + + + 9912 + 1 + 0 + 0 + 0 + + + 9913 + 1 + 0 + 0 + 0 + + + 9914 + 1 + 0 + 0 + 0 + + + 9915 + 1 + 0 + 0 + 0 + + + 9916 + 1 + 0 + 0 + 0 + + + 9917 + 1 + 0 + 0 + 0 + + + 9918 + 1 + 0 + 0 + 0 + + + 9919 + 1 + 0 + 0 + 0 + + + 9920 + 1 + 0 + 0 + 0 + + + 9921 + 1 + 0 + 0 + 0 + + + 9922 + 1 + 0 + 0 + 0 + + + 9923 + 1 + 0 + 0 + 0 + + + 9924 + 1 + 0 + 0 + 0 + + + 9925 + 1 + 0 + 0 + 0 + + + 9926 + 3 + 0 + 0 + 0 + + + 9927 + 3 + 0 + 0 + 0 + + + 9928 + 3 + 0 + 0 + 0 + + + 9929 + 3 + 0 + 0 + 0 + + + 9930 + 3 + 0 + 0 + 0 + + + 9931 + 3 + 0 + 0 + 0 + + + 9932 + 1 + 0 + 0 + 0 + + + 9933 + 1 + 0 + 0 + 0 + + + 9934 + 1 + 0 + 0 + 0 + + + 9935 + 1 + 0 + 0 + 0 + + + 9936 + 1 + 0 + 0 + 0 + + + 9937 + 1 + 0 + 0 + 0 + + + 9938 + 1 + 0 + 0 + 0 + + + 9939 + 1 + 0 + 0 + 0 + + + 9940 + 1 + 0 + 0 + 0 + + + 9941 + 1 + 0 + 0 + 0 + + + 9942 + 1 + 0 + 0 + 0 + + + 9943 + 1 + 0 + 0 + 0 + + + 9944 + 1 + 0 + 0 + 0 + + + 9945 + 1 + 0 + 0 + 0 + + + 9946 + 1 + 0 + 0 + 0 + + + 9947 + 1 + 0 + 0 + 0 + + + 9948 + 99000 + 0 + 0 + 0 + + + 9949 + 99000 + 0 + 0 + 0 + + + 9950 + 1 + 0 + 0 + 0 + + + 9951 + 1 + 0 + 0 + 0 + + + 9952 + 1 + 0 + 0 + 0 + + + 9953 + 1 + 0 + 0 + 0 + + + 9954 + 1 + 0 + 0 + 0 + + + 9955 + 1 + 0 + 0 + 0 + + + 9956 + 1 + 0 + 0 + 0 + + + 9957 + 1 + 0 + 0 + 0 + + + 9958 + 1 + 0 + 0 + 0 + + + 9959 + 1 + 0 + 0 + 0 + + + 9960 + 1 + 0 + 0 + 0 + + + 9961 + 1 + 0 + 0 + 0 + + + 9962 + 1 + 0 + 0 + 0 + + + 9963 + 1 + 0 + 0 + 0 + + + 9964 + 1 + 0 + 0 + 0 + + + 9965 + 1 + 0 + 0 + 0 + + + 9966 + 1 + 0 + 0 + 0 + + + 9967 + 1 + 0 + 0 + 0 + + + 9968 + 1 + 0 + 0 + 0 + + + 9969 + 1 + 0 + 0 + 0 + + + 9970 + 1 + 0 + 0 + 0 + + + 9971 + 1 + 0 + 0 + 0 + + + 9972 + 1 + 0 + 0 + 0 + + + 9973 + 1 + 0 + 0 + 0 + + + 9974 + 1 + 0 + 0 + 0 + + + 9975 + 1 + 0 + 0 + 0 + + + 9976 + 1 + 0 + 0 + 0 + + + 9977 + 1 + 0 + 0 + 0 + + + 9978 + 17 + 0 + 0 + 0 + + + 9979 + 17 + 0 + 0 + 0 + + + 9980 + 17 + 0 + 0 + 0 + + + 9981 + 17 + 0 + 0 + 0 + + + 9982 + 1 + 0 + 0 + 0 + + + 9983 + 1 + 0 + 0 + 0 + + + 9984 + 81 + 0 + 0 + 0 + + + 9985 + 81 + 0 + 0 + 0 + + + 9986 + 25 + 0 + 0 + 0 + + + 9987 + 25 + 0 + 0 + 0 + + + 9988 + 25 + 0 + 0 + 0 + + + 9989 + 25 + 0 + 0 + 0 + + + 9990 + 1 + 0 + 0 + 0 + + + 9991 + 1 + 0 + 0 + 0 + + + 9992 + 89 + 0 + 0 + 0 + + + 9993 + 89 + 0 + 0 + 0 + + + 9994 + 3 + 0 + 0 + 0 + + + 9995 + 3 + 0 + 0 + 0 + + + 9996 + 8 + 0 + 0 + 0 + + + 9997 + 8 + 0 + 0 + 0 + + + 9998 + 15 + 0 + 0 + 0 + + + 9999 + 15 + 0 + 0 + 0 + + + 10000 + 12 + 0 + 0 + 0 + + + 10001 + 12 + 0 + 0 + 0 + + + 10002 + 9 + 0 + 0 + 0 + + + 10003 + 9 + 0 + 0 + 0 + + + 10004 + 6 + 0 + 0 + 0 + + + 10005 + 6 + 0 + 0 + 0 + + + 10006 + 6 + 0 + 0 + 0 + + + 10007 + 6 + 0 + 0 + 0 + + + 10008 + 38 + 0 + 0 + 0 + + + 10009 + 38 + 0 + 0 + 0 + + + 10010 + 24 + 0 + 0 + 0 + + + 10011 + 24 + 0 + 0 + 0 + + + 10012 + 1 + 0 + 0 + 0 + + + 10013 + 1 + 0 + 0 + 0 + + + 10014 + 70 + 0 + 0 + 0 + + + 10015 + 70 + 0 + 0 + 0 + + + 10016 + 50 + 0 + 0 + 0 + + + 10017 + 50 + 0 + 0 + 0 + + + 10018 + 30 + 0 + 0 + 0 + + + 10019 + 30 + 0 + 0 + 0 + + + 10020 + 18 + 0 + 0 + 0 + + + 10021 + 18 + 0 + 0 + 0 + + + 10022 + 1 + 0 + 0 + 0 + + + 10023 + 1 + 0 + 0 + 0 + + + 10024 + 1 + 0 + 0 + 0 + + + 10025 + 720 + 0 + 0 + 0 + + + 10026 + 720 + 0 + 0 + 0 + + + 10027 + 600 + 0 + 0 + 0 + + + 10028 + 600 + 0 + 0 + 0 + + + 10029 + 1 + 0 + 0 + 0 + + + 10030 + 1 + 0 + 0 + 0 + + + 10031 + 18 + 0 + 0 + 0 + + + 10032 + 18 + 0 + 0 + 0 + + + 10033 + 140 + 0 + 0 + 0 + + + 10034 + 160 + 0 + 0 + 0 + + + 10035 + 200 + 0 + 0 + 0 + + + 10036 + 200 + 0 + 0 + 0 + + + 10037 + 200 + 0 + 0 + 0 + + + 10038 + 200 + 0 + 0 + 0 + + + 10039 + 1000 + 0 + 0 + 0 + + + 10040 + 1000 + 0 + 0 + 0 + + + 10041 + 100 + 0 + 0 + 0 + + + 10042 + 100 + 0 + 0 + 0 + + + 10043 + 100 + 0 + 0 + 0 + + + 10044 + 100 + 0 + 0 + 0 + + + 10045 + 500 + 0 + 0 + 0 + + + 10046 + 500 + 0 + 0 + 0 + + + 10047 + 150 + 0 + 0 + 0 + + + 10048 + 150 + 0 + 0 + 0 + + + 10049 + 150 + 0 + 0 + 0 + + + 10050 + 150 + 0 + 0 + 0 + + + 10051 + 750 + 0 + 0 + 0 + + + 10052 + 750 + 0 + 0 + 0 + + + 10053 + 20 + 0 + 0 + 0 + + + 10054 + 20 + 0 + 0 + 0 + + + 10055 + 20 + 0 + 0 + 0 + + + 10056 + 20 + 0 + 0 + 0 + + + 10057 + 20 + 0 + 0 + 0 + + + 10058 + 20 + 0 + 0 + 0 + + + 10059 + 20 + 0 + 0 + 0 + + + 10060 + 20 + 0 + 0 + 0 + + + 10061 + 20 + 0 + 0 + 0 + + + 10062 + 20 + 0 + 0 + 0 + + + 10063 + 20 + 0 + 0 + 0 + + + 10064 + 20 + 0 + 0 + 0 + + + 10065 + 20 + 0 + 0 + 0 + + + 10066 + 20 + 0 + 0 + 0 + + + 10067 + 20 + 0 + 0 + 0 + + + 10068 + 20 + 0 + 0 + 0 + + + 10069 + 400 + 0 + 0 + 0 + + + 10070 + 400 + 0 + 0 + 0 + + + 10071 + 800 + 0 + 0 + 0 + + + 10072 + 800 + 0 + 0 + 0 + + + 10073 + 400 + 0 + 0 + 0 + + + 10074 + 800 + 0 + 0 + 0 + + + 10075 + 600 + 0 + 0 + 0 + + + 10076 + 600 + 0 + 0 + 0 + + + 10077 + 160 + 0 + 0 + 0 + + + 10078 + 160 + 0 + 0 + 0 + + + 10079 + 2500 + 0 + 0 + 0 + + + 10080 + 2500 + 0 + 0 + 0 + + + 10081 + 3000 + 0 + 0 + 0 + + + 10082 + 3000 + 0 + 0 + 0 + + + 10083 + 3600 + 0 + 0 + 0 + + + 10084 + 3600 + 0 + 0 + 0 + + + 10085 + 4320 + 0 + 0 + 0 + + + 10086 + 4320 + 0 + 0 + 0 + + + 10087 + 20 + 0 + 0 + 0 + + + 10088 + 10 + 0 + 0 + 0 + + + 10089 + 16 + 0 + 0 + 0 + + + 10090 + 13 + 0 + 0 + 0 + + + 10091 + 15 + 0 + 0 + 0 + + + 10092 + 40 + 0 + 0 + 0 + + + 10093 + 72 + 0 + 0 + 0 + + + 10094 + 72 + 0 + 0 + 0 + + + 10095 + 96 + 0 + 0 + 0 + + + 10096 + 96 + 0 + 0 + 0 + + + 10097 + 108 + 0 + 0 + 0 + + + 10098 + 108 + 0 + 0 + 0 + + + 10099 + 144 + 0 + 0 + 0 + + + 10100 + 144 + 0 + 0 + 0 + + + 10101 + 144 + 0 + 0 + 0 + + + 10102 + 144 + 0 + 0 + 0 + + + 10103 + 192 + 0 + 0 + 0 + + + 10104 + 192 + 0 + 0 + 0 + + + 10105 + 90 + 0 + 0 + 0 + + + 10106 + 90 + 0 + 0 + 0 + + + 10107 + 150 + 0 + 0 + 0 + + + 10108 + 150 + 0 + 0 + 0 + + + 10109 + 160 + 0 + 0 + 0 + + + 10110 + 160 + 0 + 0 + 0 + + + 10111 + 160 + 0 + 0 + 0 + + + 10112 + 160 + 0 + 0 + 0 + + + 10113 + 43 + 0 + 0 + 0 + + + 10114 + 43 + 0 + 0 + 0 + + + 10115 + 210 + 0 + 0 + 0 + + + 10116 + 210 + 0 + 0 + 0 + + + 10117 + 12 + 0 + 0 + 0 + + + 10118 + 12 + 0 + 0 + 0 + + + 10119 + 16 + 0 + 0 + 0 + + + 10120 + 16 + 0 + 0 + 0 + + + 10121 + 14 + 0 + 0 + 0 + + + 10122 + 14 + 0 + 0 + 0 + + + 10123 + 20 + 0 + 0 + 0 + + + 10124 + 20 + 0 + 0 + 0 + + + 10125 + 150 + 0 + 0 + 0 + + + 10126 + 150 + 0 + 0 + 0 + + + 10127 + 270 + 0 + 0 + 0 + + + 10128 + 270 + 0 + 0 + 0 + + + 10129 + 36 + 0 + 0 + 0 + + + 10130 + 36 + 0 + 0 + 0 + + + 10131 + 1 + 0 + 0 + 0 + + + 10132 + 30 + 0 + 0 + 0 + + + 10133 + 30 + 0 + 0 + 0 + + + 10134 + 30 + 0 + 0 + 0 + + + 10135 + 30 + 0 + 0 + 0 + + + 10136 + 120 + 0 + 0 + 0 + + + 10137 + 120 + 0 + 0 + 0 + + + 10138 + 120 + 0 + 0 + 0 + + + 10139 + 120 + 0 + 0 + 0 + + + 10140 + 1 + 0 + 0 + 0 + + + 10141 + 1 + 0 + 0 + 0 + + + 10142 + 3 + 0 + 0 + 0 + + + 10143 + 1 + 0 + 0 + 0 + + + 10144 + 1 + 0 + 0 + 0 + + + 10145 + 1 + 0 + 0 + 0 + + + 10146 + 100 + 0 + 0 + 0 + + + 10147 + 150 + 0 + 0 + 0 + + + 10148 + 200 + 0 + 0 + 0 + + + 10149 + 50 + 0 + 0 + 0 + + + 10150 + 4 + 0 + 0 + 0 + + + 10151 + 4 + 0 + 0 + 0 + + + 10152 + 1 + 0 + 0 + 0 + + + 10153 + 1 + 0 + 0 + 0 + + + 10154 + 1 + 0 + 0 + 0 + + + 10155 + 1 + 0 + 0 + 0 + + + 10156 + 1300 + 0 + 0 + 0 + + + 10157 + 1300 + 0 + 0 + 0 + + + 10158 + 18 + 0 + 0 + 0 + + + 10159 + 31 + 0 + 0 + 0 + + + 10160 + 100 + 0 + 0 + 0 + + + 10161 + 150 + 0 + 0 + 0 + + + 10162 + 200 + 0 + 0 + 0 + + + 10163 + 50 + 0 + 0 + 0 + + + 10164 + 1 + 0 + 0 + 0 + + + 10165 + 1 + 0 + 0 + 0 + + + 10166 + 1 + 0 + 0 + 0 + + + 10167 + 1 + 0 + 0 + 0 + + + 10168 + 1 + 0 + 0 + 0 + + + 10169 + 1 + 0 + 0 + 0 + + + 10170 + 1 + 0 + 0 + 0 + + + 10171 + 1 + 0 + 0 + 0 + + + 10172 + 1 + 0 + 0 + 0 + + + 10173 + 1 + 0 + 0 + 0 + + + 10174 + 1 + 0 + 0 + 0 + + + 10175 + 1 + 0 + 0 + 0 + + + 10176 + 1 + 0 + 0 + 0 + + + 10177 + 1 + 0 + 0 + 0 + + + 10178 + 1 + 0 + 0 + 0 + + + 10179 + 1 + 0 + 0 + 0 + + + 10180 + 1 + 0 + 0 + 0 + + + 10181 + 50 + 0 + 0 + 0 + + + 10182 + 1 + 0 + 0 + 0 + + + 10183 + 50 + 0 + 0 + 0 + + + 10184 + 1 + 0 + 0 + 0 + + + 10185 + 50 + 0 + 0 + 0 + + + 10186 + 1 + 0 + 0 + 0 + + + 10187 + 50 + 0 + 0 + 0 + + + 10188 + 1 + 0 + 0 + 0 + + + 10189 + 50 + 0 + 0 + 0 + + + 10190 + 1 + 0 + 0 + 0 + + + 10191 + 50 + 0 + 0 + 0 + + + 10192 + 1 + 0 + 0 + 0 + + + 10193 + 50 + 0 + 0 + 0 + + + 10194 + 1 + 0 + 0 + 0 + + + 10195 + 50 + 0 + 0 + 0 + + + 10196 + 1 + 0 + 0 + 0 + + + 10197 + 50 + 0 + 0 + 0 + + + 10198 + 1 + 0 + 0 + 0 + + + 10199 + 50 + 0 + 0 + 0 + + + 10200 + 1 + 0 + 0 + 0 + + + 10201 + 50 + 0 + 0 + 0 + + + 10202 + 1 + 0 + 0 + 0 + + + 10203 + 50 + 0 + 0 + 0 + + + 10204 + 1 + 0 + 0 + 0 + + + 10205 + 50 + 0 + 0 + 0 + + + 10206 + 1 + 0 + 0 + 0 + + + 10207 + 50 + 0 + 0 + 0 + + + 10208 + 1 + 0 + 0 + 0 + + + 10209 + 50 + 0 + 0 + 0 + + + 10210 + 1 + 0 + 0 + 0 + + + 10211 + 50 + 0 + 0 + 0 + + + 10212 + 1 + 0 + 0 + 0 + + + 10213 + 50 + 0 + 0 + 0 + + + 10214 + 1 + 0 + 0 + 0 + + + 10215 + 50 + 0 + 0 + 0 + + + 10216 + 1 + 0 + 0 + 0 + + + 10217 + 50 + 0 + 0 + 0 + + + 10218 + 1 + 0 + 0 + 0 + + + 10219 + 50 + 0 + 0 + 0 + + + 10220 + 1 + 0 + 0 + 0 + + + 10221 + 50 + 0 + 0 + 0 + + + 10222 + 1 + 0 + 0 + 0 + + + 10223 + 50 + 0 + 0 + 0 + + + 10224 + 1 + 0 + 0 + 0 + + + 10225 + 50 + 0 + 0 + 0 + + + 10226 + 1 + 0 + 0 + 0 + + + 10227 + 50 + 0 + 0 + 0 + + + 10228 + 1 + 0 + 0 + 0 + + + 10229 + 50 + 0 + 0 + 0 + + + 10230 + 1 + 0 + 0 + 0 + + + 10231 + 50 + 0 + 0 + 0 + + + 10232 + 1 + 0 + 0 + 0 + + + 10233 + 50 + 0 + 0 + 0 + + + 10234 + 1 + 0 + 0 + 0 + + + 10235 + 50 + 0 + 0 + 0 + + + 10236 + 1 + 0 + 0 + 0 + + + 10237 + 50 + 0 + 0 + 0 + + + 10238 + 1 + 0 + 0 + 0 + + + 10239 + 50 + 0 + 0 + 0 + + + 10240 + 1 + 0 + 0 + 0 + + + 10241 + 50 + 0 + 0 + 0 + + + 10242 + 1 + 0 + 0 + 0 + + + 10243 + 50 + 0 + 0 + 0 + + + 10244 + 1 + 0 + 0 + 0 + + + 10245 + 50 + 0 + 0 + 0 + + + 10246 + 1 + 0 + 0 + 0 + + + 10247 + 50 + 0 + 0 + 0 + + + 10248 + 1 + 0 + 0 + 0 + + + 10249 + 50 + 0 + 0 + 0 + + + 10250 + 1 + 0 + 0 + 0 + + + 10251 + 50 + 0 + 0 + 0 + + + 10252 + 1 + 0 + 0 + 0 + + + 10253 + 50 + 0 + 0 + 0 + + + 10254 + 1 + 0 + 0 + 0 + + + 10255 + 50 + 0 + 0 + 0 + + + 10256 + 1 + 0 + 0 + 0 + + + 10257 + 50 + 0 + 0 + 0 + + + 10258 + 1 + 0 + 0 + 0 + + + 10259 + 50 + 0 + 0 + 0 + + + 10260 + 1 + 0 + 0 + 0 + + + 10261 + 50 + 0 + 0 + 0 + + + 10262 + 1 + 0 + 0 + 0 + + + 10263 + 50 + 0 + 0 + 0 + + + 10264 + 1 + 0 + 0 + 0 + + + 10265 + 50 + 0 + 0 + 0 + + + 10266 + 1 + 0 + 0 + 0 + + + 10267 + 50 + 0 + 0 + 0 + + + 10268 + 1 + 0 + 0 + 0 + + + 10269 + 50 + 0 + 0 + 0 + + + 10270 + 1 + 0 + 0 + 0 + + + 10271 + 50 + 0 + 0 + 0 + + + 10272 + 1 + 0 + 0 + 0 + + + 10273 + 50 + 0 + 0 + 0 + + + 10274 + 1 + 0 + 0 + 0 + + + 10275 + 50 + 0 + 0 + 0 + + + 10276 + 1 + 0 + 0 + 0 + + + 10277 + 50 + 0 + 0 + 0 + + + 10278 + 1 + 0 + 0 + 0 + + + 10279 + 50 + 0 + 0 + 0 + + + 10280 + 300 + 0 + 0 + 0 + + + 10281 + 300 + 0 + 0 + 0 + + + 10282 + 1800 + 0 + 0 + 0 + + + 10283 + 1800 + 0 + 0 + 0 + + + 10284 + 2500 + 0 + 0 + 0 + + + 10285 + 2500 + 0 + 0 + 0 + + + 10286 + 35200 + 0 + 0 + 0 + + + 10287 + 35200 + 0 + 0 + 0 + + + 10288 + 35200 + 0 + 0 + 0 + + + 10289 + 35200 + 0 + 0 + 0 + + + 10290 + 35200 + 0 + 0 + 0 + + + 10291 + 35200 + 0 + 0 + 0 + + + 10292 + 35200 + 0 + 0 + 0 + + + 10293 + 35200 + 0 + 0 + 0 + + + 10294 + 35200 + 0 + 0 + 0 + + + 10295 + 35200 + 0 + 0 + 0 + + + 10296 + 3520 + 0 + 0 + 0 + + + 10297 + 3520 + 0 + 0 + 0 + + + 10298 + 3520 + 0 + 0 + 0 + + + 10299 + 3520 + 0 + 0 + 0 + + + 10300 + 3520 + 0 + 0 + 0 + + + 10301 + 3520 + 0 + 0 + 0 + + + 10302 + 3520 + 0 + 0 + 0 + + + 10303 + 3520 + 0 + 0 + 0 + + + 10304 + 3520 + 0 + 0 + 0 + + + 10305 + 3520 + 0 + 0 + 0 + + + 10306 + 1056 + 0 + 0 + 0 + + + 10307 + 1056 + 0 + 0 + 0 + + + 10308 + 1056 + 0 + 0 + 0 + + + 10309 + 1056 + 0 + 0 + 0 + + + 10310 + 1056 + 0 + 0 + 0 + + + 10311 + 1056 + 0 + 0 + 0 + + + 10312 + 1056 + 0 + 0 + 0 + + + 10313 + 1056 + 0 + 0 + 0 + + + 10314 + 1056 + 0 + 0 + 0 + + + 10315 + 1056 + 0 + 0 + 0 + + + 10316 + 3 + 0 + 0 + 0 + + + 10317 + 3 + 0 + 0 + 0 + + + 10318 + 3 + 0 + 0 + 0 + + + 10319 + 3 + 0 + 0 + 0 + + + 10320 + 3 + 0 + 0 + 0 + + + 10321 + 3 + 0 + 0 + 0 + + + 10322 + 3 + 0 + 0 + 0 + + + 10323 + 3 + 0 + 0 + 0 + + + 10324 + 3 + 0 + 0 + 0 + + + 10325 + 3 + 0 + 0 + 0 + + + 10326 + 15 + 0 + 0 + 0 + + + 10327 + 15 + 0 + 0 + 0 + + + 10328 + 1 + 0 + 0 + 0 + + + 10329 + 1 + 0 + 0 + 0 + + + 10330 + 45000 + 0 + 0 + 0 + + + 10331 + 45000 + 0 + 0 + 0 + + + 10332 + 40000 + 0 + 0 + 0 + + + 10333 + 40000 + 0 + 0 + 0 + + + 10334 + 10000 + 0 + 0 + 0 + + + 10335 + 10000 + 0 + 0 + 0 + + + 10336 + 15000 + 0 + 0 + 0 + + + 10337 + 15000 + 0 + 0 + 0 + + + 10338 + 45000 + 0 + 0 + 0 + + + 10339 + 45000 + 0 + 0 + 0 + + + 10340 + 40000 + 0 + 0 + 0 + + + 10341 + 40000 + 0 + 0 + 0 + + + 10342 + 10000 + 0 + 0 + 0 + + + 10343 + 10000 + 0 + 0 + 0 + + + 10344 + 20000 + 0 + 0 + 0 + + + 10345 + 20000 + 0 + 0 + 0 + + + 10346 + 200000 + 0 + 0 + 0 + + + 10347 + 200000 + 0 + 0 + 0 + + + 10348 + 200000 + 0 + 0 + 0 + + + 10349 + 200000 + 0 + 0 + 0 + + + 10350 + 90000 + 0 + 0 + 0 + + + 10351 + 90000 + 0 + 0 + 0 + + + 10352 + 180000 + 0 + 0 + 0 + + + 10353 + 180000 + 0 + 0 + 0 + + + 10354 + 17625 + 0 + 0 + 0 + + + 10355 + 17625 + 0 + 0 + 0 + + + 10356 + 17625 + 0 + 0 + 0 + + + 10357 + 17625 + 0 + 0 + 0 + + + 10358 + 17625 + 0 + 0 + 0 + + + 10359 + 17625 + 0 + 0 + 0 + + + 10360 + 17625 + 0 + 0 + 0 + + + 10361 + 17625 + 0 + 0 + 0 + + + 10362 + 17625 + 0 + 0 + 0 + + + 10363 + 17625 + 0 + 0 + 0 + + + 10364 + 2025 + 0 + 0 + 0 + + + 10365 + 2025 + 0 + 0 + 0 + + + 10366 + 900 + 0 + 0 + 0 + + + 10367 + 900 + 0 + 0 + 0 + + + 10368 + 4000 + 0 + 0 + 0 + + + 10369 + 4000 + 0 + 0 + 0 + + + 10370 + 13000 + 0 + 0 + 0 + + + 10371 + 13000 + 0 + 0 + 0 + + + 10372 + 6000 + 0 + 0 + 0 + + + 10373 + 6000 + 0 + 0 + 0 + + + 10374 + 2000 + 0 + 0 + 0 + + + 10375 + 2000 + 0 + 0 + 0 + + + 10376 + 6000 + 0 + 0 + 0 + + + 10377 + 6000 + 0 + 0 + 0 + + + 10378 + 13000 + 0 + 0 + 0 + + + 10379 + 13000 + 0 + 0 + 0 + + + 10380 + 6000 + 0 + 0 + 0 + + + 10381 + 6000 + 0 + 0 + 0 + + + 10382 + 2000 + 0 + 0 + 0 + + + 10383 + 2000 + 0 + 0 + 0 + + + 10384 + 4000 + 0 + 0 + 0 + + + 10385 + 4000 + 0 + 0 + 0 + + + 10386 + 13000 + 0 + 0 + 0 + + + 10387 + 13000 + 0 + 0 + 0 + + + 10388 + 6000 + 0 + 0 + 0 + + + 10389 + 6000 + 0 + 0 + 0 + + + 10390 + 2000 + 0 + 0 + 0 + + + 10391 + 2000 + 0 + 0 + 0 + + + 10392 + 2000 + 0 + 0 + 0 + + + 10393 + 2000 + 0 + 0 + 0 + + + 10394 + 2000 + 0 + 0 + 0 + + + 10395 + 2000 + 0 + 0 + 0 + + + 10396 + 2000 + 0 + 0 + 0 + + + 10397 + 2000 + 0 + 0 + 0 + + + 10398 + 2000 + 0 + 0 + 0 + + + 10399 + 2000 + 0 + 0 + 0 + + + 10400 + 2000 + 0 + 0 + 0 + + + 10401 + 2000 + 0 + 0 + 0 + + + 10402 + 2000 + 0 + 0 + 0 + + + 10403 + 2000 + 0 + 0 + 0 + + + 10404 + 2000 + 0 + 0 + 0 + + + 10405 + 2000 + 0 + 0 + 0 + + + 10406 + 2000 + 0 + 0 + 0 + + + 10407 + 2000 + 0 + 0 + 0 + + + 10408 + 2000 + 0 + 0 + 0 + + + 10409 + 2000 + 0 + 0 + 0 + + + 10410 + 2000 + 0 + 0 + 0 + + + 10411 + 2000 + 0 + 0 + 0 + + + 10412 + 2000 + 0 + 0 + 0 + + + 10413 + 2000 + 0 + 0 + 0 + + + 10414 + 2000 + 0 + 0 + 0 + + + 10415 + 2000 + 0 + 0 + 0 + + + 10416 + 2000 + 0 + 0 + 0 + + + 10417 + 2000 + 0 + 0 + 0 + + + 10418 + 2000 + 0 + 0 + 0 + + + 10419 + 2000 + 0 + 0 + 0 + + + 10420 + 2000 + 0 + 0 + 0 + + + 10421 + 2000 + 0 + 0 + 0 + + + 10422 + 2000 + 0 + 0 + 0 + + + 10423 + 2000 + 0 + 0 + 0 + + + 10424 + 2000 + 0 + 0 + 0 + + + 10425 + 2000 + 0 + 0 + 0 + + + 10426 + 2000 + 0 + 0 + 0 + + + 10427 + 2000 + 0 + 0 + 0 + + + 10428 + 2000 + 0 + 0 + 0 + + + 10429 + 2000 + 0 + 0 + 0 + + + 10430 + 2000 + 0 + 0 + 0 + + + 10431 + 2000 + 0 + 0 + 0 + + + 10432 + 2000 + 0 + 0 + 0 + + + 10433 + 2000 + 0 + 0 + 0 + + + 10434 + 2000 + 0 + 0 + 0 + + + 10435 + 2000 + 0 + 0 + 0 + + + 10436 + 2000 + 0 + 0 + 0 + + + 10437 + 2000 + 0 + 0 + 0 + + + 10438 + 2000 + 0 + 0 + 0 + + + 10439 + 2000 + 0 + 0 + 0 + + + 10440 + 5000 + 0 + 0 + 0 + + + 10441 + 5000 + 0 + 0 + 0 + + + 10442 + 5000 + 0 + 0 + 0 + + + 10443 + 5000 + 0 + 0 + 0 + + + 10444 + 5000 + 0 + 0 + 0 + + + 10445 + 5000 + 0 + 0 + 0 + + + 10446 + 2000 + 0 + 0 + 0 + + + 10447 + 2000 + 0 + 0 + 0 + + + 10448 + 2000 + 0 + 0 + 0 + + + 10449 + 2000 + 0 + 0 + 0 + + + 10450 + 2000 + 0 + 0 + 0 + + + 10451 + 2000 + 0 + 0 + 0 + + + 10452 + 5000 + 0 + 0 + 0 + + + 10453 + 5000 + 0 + 0 + 0 + + + 10454 + 5000 + 0 + 0 + 0 + + + 10455 + 5000 + 0 + 0 + 0 + + + 10456 + 5000 + 0 + 0 + 0 + + + 10457 + 5000 + 0 + 0 + 0 + + + 10458 + 7000 + 0 + 0 + 0 + + + 10459 + 7000 + 0 + 0 + 0 + + + 10460 + 7000 + 0 + 0 + 0 + + + 10461 + 7000 + 0 + 0 + 0 + + + 10462 + 7000 + 0 + 0 + 0 + + + 10463 + 7000 + 0 + 0 + 0 + + + 10464 + 7000 + 0 + 0 + 0 + + + 10465 + 7000 + 0 + 0 + 0 + + + 10466 + 7000 + 0 + 0 + 0 + + + 10467 + 7000 + 0 + 0 + 0 + + + 10468 + 7000 + 0 + 0 + 0 + + + 10469 + 7000 + 0 + 0 + 0 + + + 10470 + 2500 + 0 + 0 + 0 + + + 10471 + 2500 + 0 + 0 + 0 + + + 10472 + 2500 + 0 + 0 + 0 + + + 10473 + 2500 + 0 + 0 + 0 + + + 10474 + 2500 + 0 + 0 + 0 + + + 10475 + 2500 + 0 + 0 + 0 + + + 10476 + 15 + 0 + 0 + 0 + + + 10477 + 1 + 0 + 0 + 0 + + + 10478 + 1 + 0 + 0 + 0 + + + 10479 + 1 + 0 + 0 + 0 + + + 10480 + 1 + 0 + 0 + 0 + + + 10481 + 1 + 0 + 0 + 0 + + + 10482 + 1 + 0 + 0 + 0 + + + 10483 + 1 + 0 + 0 + 0 + + + 10484 + 1 + 0 + 0 + 0 + + + 10485 + 1 + 0 + 0 + 0 + + + 10486 + 1 + 0 + 0 + 0 + + + 10487 + 100 + 0 + 0 + 0 + + + 10488 + 10 + 0 + 0 + 0 + + + 10489 + 15 + 0 + 0 + 0 + + + 10490 + 1 + 0 + 0 + 0 + + + 10491 + 20 + 0 + 0 + 0 + + + 10492 + 1 + 0 + 0 + 0 + + + 10493 + 2 + 0 + 0 + 0 + + + 10494 + 10 + 0 + 0 + 0 + + + 10495 + 10 + 0 + 0 + 0 + + + 10496 + 1 + 0 + 0 + 0 + + + 10497 + 1 + 0 + 0 + 0 + + + 10498 + 769 + 0 + 0 + 0 + + + 10499 + 1000 + 0 + 0 + 0 + + + 10500 + 20 + 0 + 0 + 0 + + + 10501 + 1 + 0 + 0 + 0 + + + 10502 + 1 + 0 + 0 + 0 + + + 10503 + 1 + 0 + 0 + 0 + + + 10504 + 1 + 0 + 0 + 0 + + + 10505 + 1 + 0 + 0 + 0 + + + 10506 + 1 + 0 + 0 + 0 + + + 10507 + 1 + 0 + 0 + 0 + + + 10508 + 1 + 0 + 0 + 0 + + + 10509 + 1 + 0 + 0 + 0 + + + 10510 + 1 + 0 + 0 + 0 + + + 10511 + 1 + 0 + 0 + 0 + + + 10512 + 1 + 0 + 0 + 0 + + + 10513 + 1 + 0 + 0 + 0 + + + 10514 + 1 + 0 + 0 + 0 + + + 10515 + 1 + 0 + 0 + 0 + + + 10516 + 1 + 0 + 0 + 0 + + + 10517 + 1 + 0 + 0 + 0 + + + 10518 + 1 + 0 + 0 + 0 + + + 10519 + 1 + 0 + 0 + 0 + + + 10520 + 1 + 0 + 0 + 0 + + + 10521 + 1 + 0 + 0 + 0 + + + 10522 + 1 + 0 + 0 + 0 + + + 10523 + 1 + 0 + 0 + 0 + + + 10524 + 1 + 0 + 0 + 0 + + + 10525 + 1 + 0 + 0 + 0 + + + 10526 + 1 + 0 + 0 + 0 + + + 10527 + 1 + 0 + 0 + 0 + + + 10528 + 1 + 0 + 0 + 0 + + + 10529 + 1 + 0 + 0 + 0 + + + 10530 + 1 + 0 + 0 + 0 + + + 10531 + 1 + 0 + 0 + 0 + + + 10532 + 1 + 0 + 0 + 0 + + + 10533 + 1 + 0 + 0 + 0 + + + 10534 + 1 + 0 + 0 + 0 + + + 10535 + 1 + 0 + 0 + 0 + + + 10536 + 1 + 0 + 0 + 0 + + + 10537 + 1 + 0 + 0 + 0 + + + 10538 + 1 + 0 + 0 + 0 + + + 10539 + 1 + 0 + 0 + 0 + + + 10540 + 1 + 0 + 0 + 0 + + + 10541 + 1 + 0 + 0 + 0 + + + 10542 + 1 + 0 + 0 + 0 + + + 10543 + 1 + 0 + 0 + 0 + + + 10544 + 1 + 0 + 0 + 0 + + + 10545 + 1 + 0 + 0 + 0 + + + 10546 + 1 + 0 + 0 + 0 + + + 10547 + 5000 + 0 + 0 + 0 + + + 10548 + 5000 + 0 + 0 + 0 + + + 10549 + 5000 + 0 + 0 + 0 + + + 10550 + 5000 + 0 + 0 + 0 + + + 10551 + 20000 + 0 + 0 + 0 + + + 10552 + 5000 + 0 + 0 + 0 + + + 10553 + 200 + 0 + 0 + 0 + + + 10554 + 200 + 0 + 0 + 0 + + + 10555 + 8000 + 0 + 0 + 0 + + + 10556 + 1 + 0 + 0 + 0 + + + 10557 + 1 + 0 + 0 + 0 + + + 10558 + 1 + 0 + 0 + 0 + + + 10559 + 1 + 0 + 0 + 0 + + + 10560 + 1 + 0 + 0 + 0 + + + 10561 + 1 + 0 + 0 + 0 + + + 10562 + 1 + 0 + 0 + 0 + + + 10563 + 1 + 0 + 0 + 0 + + + 10564 + 80000 + 0 + 0 + 0 + + + 10565 + 80000 + 0 + 0 + 0 + + + 10566 + 60000 + 0 + 0 + 0 + + + 10567 + 1 + 0 + 0 + 0 + + + 10568 + 1 + 0 + 0 + 0 + + + 10569 + 1 + 0 + 0 + 0 + + + 10570 + 1 + 0 + 0 + 0 + + + 10571 + 1 + 0 + 0 + 0 + + + 10572 + 1 + 0 + 0 + 0 + + + 10573 + 1 + 0 + 0 + 0 + + + 10574 + 1 + 0 + 0 + 0 + + + 10575 + 1 + 0 + 0 + 0 + + + 10576 + 1 + 0 + 0 + 0 + + + 10577 + 1 + 0 + 0 + 0 + + + 10578 + 1 + 0 + 0 + 0 + + + 10579 + 1 + 0 + 0 + 0 + + + 10580 + 1 + 0 + 0 + 0 + + + 10581 + 10000 + 0 + 0 + 0 + + + 10582 + 10000 + 0 + 0 + 0 + + + 10583 + 10000 + 0 + 0 + 0 + + + 10584 + 10000 + 0 + 0 + 0 + + + 10585 + 1 + 0 + 0 + 0 + + + 10586 + 1 + 0 + 0 + 0 + + + 10587 + 50 + 0 + 0 + 0 + + + 10588 + 300 + 0 + 0 + 0 + + + 10589 + 46000 + 0 + 0 + 0 + + + 10590 + 46000 + 0 + 0 + 0 + + + 10591 + 1 + 0 + 0 + 0 + + + 10592 + 1 + 0 + 0 + 0 + + + 10593 + 1 + 0 + 0 + 0 + + + 10594 + 1 + 0 + 0 + 0 + + + 10595 + 1 + 0 + 0 + 0 + + + 10596 + 1 + 0 + 0 + 0 + + + 10597 + 1 + 0 + 0 + 0 + + + 10598 + 1 + 0 + 0 + 0 + + + 10599 + 1 + 0 + 0 + 0 + + + 10600 + 1 + 0 + 0 + 0 + + + 10601 + 15000 + 0 + 0 + 0 + + + 10602 + 15000 + 0 + 0 + 0 + + + 10603 + 15000 + 0 + 0 + 0 + + + 10604 + 10000 + 0 + 0 + 0 + + + 10605 + 140000 + 0 + 0 + 0 + + + 10606 + 10000 + 0 + 0 + 0 + + + 10607 + 300 + 0 + 0 + 0 + + + 10608 + 1000 + 0 + 0 + 0 + + + 10609 + 100 + 0 + 0 + 0 + + + 10610 + 2000 + 0 + 0 + 0 + + + 10611 + 48000 + 0 + 0 + 0 + + + 10612 + 375 + 0 + 0 + 0 + + + 10613 + 35200 + 0 + 0 + 0 + + + 10614 + 60000 + 0 + 0 + 0 + + + 10615 + 500 + 0 + 0 + 0 + + + 10616 + 500 + 0 + 0 + 0 + + + 10617 + 500 + 0 + 0 + 0 + + + 10618 + 3840 + 0 + 0 + 0 + + + 10619 + 10000 + 0 + 0 + 0 + + + 10620 + 12000 + 0 + 0 + 0 + + + 10621 + 150 + 0 + 0 + 0 + + + 10622 + 200 + 0 + 0 + 0 + + + 10623 + 100 + 0 + 0 + 0 + + + 10624 + 150 + 0 + 0 + 0 + + + 10625 + 20 + 0 + 0 + 0 + + + 10626 + 20 + 0 + 0 + 0 + + + 10627 + 20 + 0 + 0 + 0 + + + 10628 + 20 + 0 + 0 + 0 + + + 10629 + 1 + 0 + 0 + 0 + + + 10630 + 1 + 0 + 0 + 0 + + + 10631 + 1 + 0 + 0 + 0 + + + 10632 + 1 + 0 + 0 + 0 + + + 10633 + 1 + 0 + 0 + 0 + + + 10634 + 40 + 0 + 0 + 0 + + + 10635 + 450 + 0 + 0 + 0 + + + 10636 + 60000 + 0 + 0 + 0 + + + 10637 + 60000 + 0 + 0 + 0 + + + 10638 + 50 + 0 + 0 + 0 + + + 10639 + 99000 + 0 + 0 + 0 + + + 10640 + 99000 + 0 + 0 + 0 + + + 10641 + 99000 + 0 + 0 + 0 + + + 10642 + 99000 + 0 + 0 + 0 + + + 10643 + 99000 + 0 + 0 + 0 + + + 10644 + 99000 + 0 + 0 + 0 + + + 10645 + 99000 + 0 + 0 + 0 + + + 10646 + 99000 + 0 + 0 + 0 + + + 10647 + 99000 + 0 + 0 + 0 + + + 10648 + 99000 + 0 + 0 + 0 + + + 10649 + 99000 + 0 + 0 + 0 + + + 10650 + 99000 + 0 + 0 + 0 + + + 10651 + 99000 + 0 + 0 + 0 + + + 10652 + 99000 + 0 + 0 + 0 + + + 10653 + 99000 + 0 + 0 + 0 + + + 10654 + 99000 + 0 + 0 + 0 + + + 10655 + 99000 + 0 + 0 + 0 + + + 10656 + 99000 + 0 + 0 + 0 + + + 10657 + 99000 + 0 + 0 + 0 + + + 10658 + 99000 + 0 + 0 + 0 + + + 10659 + 99000 + 0 + 0 + 0 + + + 10660 + 99000 + 0 + 0 + 0 + + + 10661 + 99000 + 0 + 0 + 0 + + + 10662 + 99000 + 0 + 0 + 0 + + + 10663 + 400 + 0 + 0 + 0 + + + 10664 + 800 + 0 + 0 + 0 + + + 10665 + 1632 + 0 + 0 + 0 + + + 10666 + 5440 + 0 + 0 + 0 + + + 10667 + 54400 + 0 + 0 + 0 + + + 10668 + 16325 + 0 + 0 + 0 + + + 10669 + 5440 + 0 + 0 + 0 + + + 10670 + 54400 + 0 + 0 + 0 + + + 10671 + 1632 + 0 + 0 + 0 + + + 10672 + 5440 + 0 + 0 + 0 + + + 10673 + 54400 + 0 + 0 + 0 + + + 10674 + 1632 + 0 + 0 + 0 + + + 10675 + 5440 + 0 + 0 + 0 + + + 10676 + 54400 + 0 + 0 + 0 + + + 10677 + 1632 + 0 + 0 + 0 + + + 10678 + 5440 + 0 + 0 + 0 + + + 10679 + 54400 + 0 + 0 + 0 + + + 10680 + 850 + 0 + 0 + 0 + + + 10681 + 850 + 0 + 0 + 0 + + + 10682 + 7800 + 0 + 0 + 0 + + + 10683 + 7800 + 0 + 0 + 0 + + + 10684 + 9360 + 0 + 0 + 0 + + + 10685 + 9360 + 0 + 0 + 0 + + + 10686 + 15 + 0 + 0 + 0 + + + 10687 + 15 + 0 + 0 + 0 + + + 10688 + 120000 + 0 + 0 + 0 + + + 10689 + 200 + 0 + 0 + 0 + + + 10690 + 3840 + 0 + 0 + 0 + + + 10691 + 3840 + 0 + 0 + 0 + + + 10692 + 40 + 0 + 0 + 0 + + + 10693 + 80 + 0 + 0 + 0 + + + 10694 + 80 + 0 + 0 + 0 + + + 10695 + 80 + 0 + 0 + 0 + + + 10696 + 200 + 0 + 0 + 0 + + + 10697 + 12800 + 0 + 0 + 0 + + + 10698 + 12800 + 0 + 0 + 0 + + + 10699 + 1056 + 0 + 0 + 0 + + + 10700 + 1056 + 0 + 0 + 0 + + + 10701 + 1056 + 0 + 0 + 0 + + + 10702 + 1056 + 0 + 0 + 0 + + + 10703 + 1056 + 0 + 0 + 0 + + + 10704 + 35200 + 0 + 0 + 0 + + + 10705 + 35200 + 0 + 0 + 0 + + + 10706 + 35200 + 0 + 0 + 0 + + + 10707 + 35200 + 0 + 0 + 0 + + + 10708 + 35200 + 0 + 0 + 0 + + + 10709 + 3520 + 0 + 0 + 0 + + + 10710 + 3520 + 0 + 0 + 0 + + + 10711 + 3520 + 0 + 0 + 0 + + + 10712 + 3520 + 0 + 0 + 0 + + + 10713 + 3520 + 0 + 0 + 0 + + + 10714 + 3 + 0 + 0 + 0 + + + 10715 + 3 + 0 + 0 + 0 + + + 10716 + 3 + 0 + 0 + 0 + + + 10717 + 3 + 0 + 0 + 0 + + + 10718 + 3 + 0 + 0 + 0 + + + 10719 + 17625 + 0 + 0 + 0 + + + 10720 + 100 + 0 + 0 + 0 + + + 10721 + 1 + 0 + 0 + 0 + + + 10722 + 1 + 0 + 0 + 0 + + + 10723 + 1 + 0 + 0 + 0 + + + 10724 + 1 + 0 + 0 + 0 + + + 10725 + 1 + 0 + 0 + 0 + + + 10726 + 1 + 0 + 0 + 0 + + + 10727 + 1 + 0 + 0 + 0 + + + 10728 + 1 + 0 + 0 + 0 + + + 10729 + 1 + 0 + 0 + 0 + + + 10730 + 1 + 0 + 0 + 0 + + + 10731 + 1 + 0 + 0 + 0 + + + 10732 + 1 + 0 + 0 + 0 + + + 10733 + 10 + 0 + 0 + 0 + + + 10734 + 1 + 0 + 0 + 0 + + + 10735 + 1 + 0 + 0 + 0 + + + 10736 + 2025 + 0 + 0 + 0 + + + 10737 + 1 + 0 + 0 + 0 + + + 10738 + 900 + 0 + 0 + 0 + + + 10739 + 1 + 0 + 0 + 0 + + + 10740 + 2000 + 0 + 0 + 0 + + + 10741 + 1 + 0 + 0 + 0 + + + 10742 + 2000 + 0 + 0 + 0 + + + 10743 + 1 + 0 + 0 + 0 + + + 10744 + 2000 + 0 + 0 + 0 + + + 10745 + 1 + 0 + 0 + 0 + + + 10746 + 2000 + 0 + 0 + 0 + + + 10747 + 1 + 0 + 0 + 0 + + + 10748 + 2000 + 0 + 0 + 0 + + + 10749 + 1 + 0 + 0 + 0 + + + 10750 + 2000 + 0 + 0 + 0 + + + 10751 + 1 + 0 + 0 + 0 + + + 10752 + 2000 + 0 + 0 + 0 + + + 10753 + 1 + 0 + 0 + 0 + + + 10754 + 2000 + 0 + 0 + 0 + + + 10755 + 1 + 0 + 0 + 0 + + + 10756 + 2000 + 0 + 0 + 0 + + + 10757 + 1 + 0 + 0 + 0 + + + 10758 + 225 + 0 + 0 + 0 + + + 10759 + 1 + 0 + 0 + 0 + + + 10760 + 225 + 0 + 0 + 0 + + + 10761 + 1 + 0 + 0 + 0 + + + 10762 + 225 + 0 + 0 + 0 + + + 10763 + 1 + 0 + 0 + 0 + + + 10764 + 225 + 0 + 0 + 0 + + + 10765 + 1 + 0 + 0 + 0 + + + 10766 + 225 + 0 + 0 + 0 + + + 10767 + 1 + 0 + 0 + 0 + + + 10768 + 40 + 0 + 0 + 0 + + + 10769 + 1 + 0 + 0 + 0 + + + 10770 + 40 + 0 + 0 + 0 + + + 10771 + 1 + 0 + 0 + 0 + + + 10772 + 40 + 0 + 0 + 0 + + + 10773 + 1 + 0 + 0 + 0 + + + 10774 + 180 + 0 + 0 + 0 + + + 10775 + 1 + 0 + 0 + 0 + + + 10776 + 65000 + 0 + 0 + 0 + + + 10777 + 1 + 0 + 0 + 0 + + + 10778 + 65000 + 0 + 0 + 0 + + + 10779 + 1 + 0 + 0 + 0 + + + 10780 + 65000 + 0 + 0 + 0 + + + 10781 + 1 + 0 + 0 + 0 + + + 10782 + 65000 + 0 + 0 + 0 + + + 10783 + 1 + 0 + 0 + 0 + + + 10784 + 7000 + 0 + 0 + 0 + + + 10785 + 1 + 0 + 0 + 0 + + + 10786 + 7000 + 0 + 0 + 0 + + + 10787 + 1 + 0 + 0 + 0 + + + 10788 + 7000 + 0 + 0 + 0 + + + 10789 + 1 + 0 + 0 + 0 + + + 10790 + 13000 + 0 + 0 + 0 + + + 10791 + 1 + 0 + 0 + 0 + + + 10792 + 13000 + 0 + 0 + 0 + + + 10793 + 1 + 0 + 0 + 0 + + + 10794 + 13000 + 0 + 0 + 0 + + + 10795 + 1 + 0 + 0 + 0 + + + 10796 + 450 + 0 + 0 + 0 + + + 10797 + 1 + 0 + 0 + 0 + + + 10798 + 65000 + 0 + 0 + 0 + + + 10799 + 1 + 0 + 0 + 0 + + + 10800 + 65000 + 0 + 0 + 0 + + + 10801 + 1 + 0 + 0 + 0 + + + 10802 + 200 + 0 + 0 + 0 + + + 10803 + 1 + 0 + 0 + 0 + + + 10804 + 200 + 0 + 0 + 0 + + + 10805 + 1 + 0 + 0 + 0 + + + 10806 + 200 + 0 + 0 + 0 + + + 10807 + 1 + 0 + 0 + 0 + + + 10808 + 200 + 0 + 0 + 0 + + + 10809 + 200 + 0 + 0 + 0 + + + 10810 + 35 + 0 + 0 + 0 + + + 10811 + 35 + 0 + 0 + 0 + + + 10812 + 90 + 0 + 0 + 0 + + + 10813 + 90 + 0 + 0 + 0 + + + 10814 + 120 + 0 + 0 + 0 + + + 10815 + 120 + 0 + 0 + 0 + + + 10816 + 2 + 0 + 0 + 0 + + + 10817 + 2 + 0 + 0 + 0 + + + 10818 + 50 + 0 + 0 + 0 + + + 10819 + 50 + 0 + 0 + 0 + + + 10820 + 100 + 0 + 0 + 0 + + + 10821 + 100 + 0 + 0 + 0 + + + 10822 + 500 + 0 + 0 + 0 + + + 10823 + 500 + 0 + 0 + 0 + + + 10824 + 500 + 0 + 0 + 0 + + + 10825 + 500 + 0 + 0 + 0 + + + 10826 + 500 + 0 + 0 + 0 + + + 10827 + 500 + 0 + 0 + 0 + + + 10828 + 50000 + 0 + 0 + 0 + + + 10829 + 1 + 0 + 0 + 0 + + + 10830 + 1 + 0 + 0 + 0 + + + 10831 + 1 + 0 + 0 + 0 + + + 10832 + 1 + 0 + 0 + 0 + + + 10833 + 1 + 0 + 0 + 0 + + + 10834 + 1 + 0 + 0 + 0 + + + 10835 + 1 + 0 + 0 + 0 + + + 10836 + 100 + 0 + 0 + 0 + + + 10837 + 100 + 0 + 0 + 0 + + + 10838 + 100 + 0 + 0 + 0 + + + 10839 + 100 + 0 + 0 + 0 + + + 10840 + 1000 + 0 + 0 + 0 + + + 10841 + 1 + 0 + 0 + 0 + + + 10842 + 1 + 0 + 0 + 0 + + + 10843 + 50000 + 0 + 0 + 0 + + + 10844 + 1 + 0 + 0 + 0 + + + 10845 + 1 + 0 + 0 + 0 + + + 10846 + 1 + 0 + 0 + 0 + + + 10847 + 1 + 0 + 0 + 0 + + + 10848 + 1 + 0 + 0 + 0 + + + 10849 + 1 + 0 + 0 + 0 + + + 10850 + 1 + 0 + 0 + 0 + + + 10851 + 1 + 0 + 0 + 0 + + + 10852 + 1 + 0 + 0 + 0 + + + 10853 + 1 + 0 + 0 + 0 + + + 10854 + 1 + 0 + 0 + 0 + + + 10855 + 1 + 0 + 0 + 0 + + + 10856 + 5 + 0 + 0 + 0 + + + 10857 + 1 + 0 + 0 + 0 + + + 10858 + 1 + 0 + 0 + 0 + + + 10859 + 1 + 0 + 0 + 0 + + + 10860 + 1 + 0 + 0 + 0 + + + 10861 + 1 + 0 + 0 + 0 + + + 10862 + 100 + 0 + 0 + 0 + + + 10863 + 100 + 0 + 0 + 0 + + + 10864 + 100 + 0 + 0 + 0 + + + 10865 + 100 + 0 + 0 + 0 + + + 10866 + 1 + 0 + 0 + 0 + + + 10867 + 1 + 0 + 0 + 0 + + + 10868 + 1 + 0 + 0 + 0 + + + 10869 + 1 + 0 + 0 + 0 + + + 10870 + 1 + 0 + 0 + 0 + + + 10871 + 1 + 0 + 0 + 0 + + + 10872 + 1 + 0 + 0 + 0 + + + 10873 + 1 + 0 + 0 + 0 + + + 10874 + 1 + 0 + 0 + 0 + + + 10875 + 1 + 0 + 0 + 0 + + + 10876 + 1 + 0 + 0 + 0 + + + 10877 + 100 + 0 + 0 + 0 + + + 10878 + 100 + 0 + 0 + 0 + + + 10879 + 100 + 0 + 0 + 0 + + + 10880 + 100 + 0 + 0 + 0 + + + 10881 + 100 + 0 + 0 + 0 + + + 10882 + 100 + 0 + 0 + 0 + + + 10883 + 100 + 0 + 0 + 0 + + + 10884 + 52 + 0 + 0 + 0 + + + 10885 + 1 + 0 + 0 + 0 + + + 10886 + 1 + 0 + 0 + 0 + + + 10887 + 230000 + 0 + 0 + 0 + + + 10888 + 1 + 0 + 0 + 0 + + + 10889 + 1 + 0 + 0 + 0 + + + 10890 + 1 + 0 + 0 + 0 + + + 10891 + 1 + 0 + 0 + 0 + + + 10892 + 1 + 0 + 0 + 0 + + + 10893 + 1 + 0 + 0 + 0 + + + 10894 + 1 + 0 + 0 + 0 + + + 10895 + 1 + 0 + 0 + 0 + + + 10896 + 1 + 0 + 0 + 0 + + + 10897 + 1 + 0 + 0 + 0 + + + 10898 + 1 + 0 + 0 + 0 + + + 10899 + 1 + 0 + 0 + 0 + + + 10900 + 1 + 0 + 0 + 0 + + + 10901 + 1 + 0 + 0 + 0 + + + 10902 + 1 + 0 + 0 + 0 + + + 10903 + 1 + 0 + 0 + 0 + + + 10904 + 1 + 0 + 0 + 0 + + + 10905 + 1 + 0 + 0 + 0 + + + 10906 + 1 + 0 + 0 + 0 + + + 10907 + 1 + 0 + 0 + 0 + + + 10908 + 1 + 0 + 0 + 0 + + + 10909 + 300 + 0 + 0 + 0 + + + 10910 + 300 + 0 + 0 + 0 + + + 10911 + 240 + 0 + 0 + 0 + + + 10912 + 240 + 0 + 0 + 0 + + + 10913 + 180 + 0 + 0 + 0 + + + 10914 + 180 + 0 + 0 + 0 + + + 10915 + 120 + 0 + 0 + 0 + + + 10916 + 120 + 0 + 0 + 0 + + + 10917 + 300 + 0 + 0 + 0 + + + 10918 + 300 + 0 + 0 + 0 + + + 10919 + 240 + 0 + 0 + 0 + + + 10920 + 240 + 0 + 0 + 0 + + + 10921 + 180 + 0 + 0 + 0 + + + 10922 + 180 + 0 + 0 + 0 + + + 10923 + 120 + 0 + 0 + 0 + + + 10924 + 120 + 0 + 0 + 0 + + + 10925 + 300 + 0 + 0 + 0 + + + 10926 + 300 + 0 + 0 + 0 + + + 10927 + 240 + 0 + 0 + 0 + + + 10928 + 240 + 0 + 0 + 0 + + + 10929 + 180 + 0 + 0 + 0 + + + 10930 + 180 + 0 + 0 + 0 + + + 10931 + 120 + 0 + 0 + 0 + + + 10932 + 120 + 0 + 0 + 0 + + + 10933 + 50 + 0 + 0 + 0 + + + 10934 + 1 + 0 + 0 + 0 + + + 10935 + 1 + 0 + 0 + 0 + + + 10936 + 1 + 0 + 0 + 0 + + + 10937 + 300 + 0 + 0 + 0 + + + 10938 + 300 + 0 + 0 + 0 + + + 10939 + 50 + 0 + 0 + 0 + + + 10940 + 50 + 0 + 0 + 0 + + + 10941 + 50 + 0 + 0 + 0 + + + 10942 + 1 + 0 + 0 + 0 + + + 10943 + 1 + 0 + 0 + 0 + + + 10944 + 1 + 0 + 0 + 0 + + + 10945 + 50 + 0 + 0 + 0 + + + 10946 + 1 + 0 + 0 + 0 + + + 10947 + 1 + 0 + 0 + 0 + + + 10948 + 1 + 0 + 0 + 0 + + + 10949 + 1 + 0 + 0 + 0 + + + 10950 + 1 + 0 + 0 + 0 + + + 10951 + 1 + 0 + 0 + 0 + + + 10952 + 150 + 0 + 0 + 0 + + + 10953 + 150 + 0 + 0 + 0 + + + 10954 + 1000 + 0 + 0 + 0 + + + 10955 + 1000 + 0 + 0 + 0 + + + 10956 + 900 + 0 + 0 + 0 + + + 10957 + 900 + 0 + 0 + 0 + + + 10958 + 200 + 0 + 0 + 0 + + + 10959 + 200 + 0 + 0 + 0 + + + 10960 + 10 + 0 + 0 + 0 + + + 10961 + 10 + 0 + 0 + 0 + + + 10962 + 10 + 0 + 0 + 0 + + + 10963 + 10 + 0 + 0 + 0 + + + 10964 + 10 + 0 + 0 + 0 + + + 10965 + 10 + 0 + 0 + 0 + + + 10966 + 50 + 0 + 0 + 0 + + + 10967 + 50 + 0 + 0 + 0 + + + 10968 + 50 + 0 + 0 + 0 + + + 10969 + 50 + 0 + 0 + 0 + + + 10970 + 50 + 0 + 0 + 0 + + + 10971 + 50 + 0 + 0 + 0 + + + 10972 + 20 + 0 + 0 + 0 + + + 10973 + 350 + 0 + 0 + 0 + + + 10974 + 350 + 0 + 0 + 0 + + + 10975 + 1 + 0 + 0 + 0 + + + 10976 + 5 + 0 + 0 + 0 + + + 10977 + 7 + 0 + 0 + 0 + + + 10978 + 2 + 0 + 0 + 0 + + + 10979 + 2 + 0 + 0 + 0 + + + 10980 + 250 + 0 + 0 + 0 + + + 10981 + 20 + 0 + 0 + 0 + + + 10982 + 20 + 0 + 0 + 0 + + + 10983 + 1 + 0 + 0 + 0 + + + 10984 + 1 + 0 + 0 + 0 + + + 10985 + 1 + 0 + 0 + 0 + + + 10986 + 1 + 0 + 0 + 0 + + + 10987 + 1 + 0 + 0 + 0 + + + 10988 + 1 + 0 + 0 + 0 + + + 10989 + 1 + 0 + 0 + 0 + + + 10990 + 1 + 0 + 0 + 0 + + + 10991 + 1 + 0 + 0 + 0 + + + 10992 + 1 + 0 + 0 + 0 + + + 10993 + 1 + 0 + 0 + 0 + + + 10994 + 1 + 0 + 0 + 0 + + + 10995 + 1000 + 0 + 0 + 0 + + + 10996 + 1000 + 0 + 0 + 0 + + + 10997 + 1 + 0 + 0 + 0 + + + 10998 + 1 + 0 + 0 + 0 + + + 10999 + 1 + 0 + 0 + 0 + + + 11000 + 1 + 0 + 0 + 0 + + + 11001 + 10 + 0 + 0 + 0 + + + 11002 + 10 + 0 + 0 + 0 + + + 11003 + 5 + 0 + 0 + 0 + + + 11004 + 1 + 0 + 0 + 0 + + + 11005 + 1 + 0 + 0 + 0 + + + 11006 + 10 + 0 + 0 + 0 + + + 11007 + 10 + 0 + 0 + 0 + + + 11008 + 1 + 0 + 0 + 0 + + + 11009 + 1 + 0 + 0 + 0 + + + 11010 + 1 + 0 + 0 + 0 + + + 11011 + 1 + 0 + 0 + 0 + + + 11012 + 1 + 0 + 0 + 0 + + + 11013 + 1 + 0 + 0 + 0 + + + 11014 + 1 + 0 + 0 + 0 + + + 11015 + 1 + 0 + 0 + 0 + + + 11016 + 1 + 0 + 0 + 0 + + + 11017 + 1 + 0 + 0 + 0 + + + 11018 + 1 + 0 + 0 + 0 + + + 11019 + 1 + 0 + 0 + 0 + + + 11020 + 1 + 0 + 0 + 0 + + + 11021 + 1 + 0 + 0 + 0 + + + 11022 + 1 + 0 + 0 + 0 + + + 11023 + 1 + 0 + 0 + 0 + + + 11024 + 1 + 0 + 0 + 0 + + + 11025 + 1 + 0 + 0 + 0 + + + 11026 + 1 + 0 + 0 + 0 + + + 11027 + 1 + 0 + 0 + 0 + + + 11028 + 1 + 0 + 0 + 0 + + + 11029 + 1 + 0 + 0 + 0 + + + 11030 + 1 + 0 + 0 + 0 + + + 11031 + 1 + 0 + 0 + 0 + + + 11032 + 1 + 0 + 0 + 0 + + + 11033 + 1 + 0 + 0 + 0 + + + 11034 + 1 + 0 + 0 + 0 + + + 11035 + 1 + 0 + 0 + 0 + + + 11036 + 1 + 0 + 0 + 0 + + + 11037 + 26000 + 0 + 0 + 0 + + + 11038 + 26000 + 0 + 0 + 0 + + + 11039 + 1 + 0 + 0 + 0 + + + 11040 + 1 + 0 + 0 + 0 + + + 11041 + 1 + 0 + 0 + 0 + + + 11042 + 1 + 0 + 0 + 0 + + + 11043 + 1 + 0 + 0 + 0 + + + 11044 + 1 + 0 + 0 + 0 + + + 11045 + 1 + 0 + 0 + 0 + + + 11046 + 1 + 0 + 0 + 0 + + + 11047 + 1 + 0 + 0 + 0 + + + 11048 + 1 + 0 + 0 + 0 + + + 11049 + 1 + 0 + 0 + 0 + + + 11050 + 1 + 0 + 0 + 0 + + + 11051 + 1 + 0 + 0 + 0 + + + 11052 + 1 + 0 + 0 + 0 + + + 11053 + 1 + 0 + 0 + 0 + + + 11054 + 1 + 0 + 0 + 0 + + + 11055 + 1 + 0 + 0 + 0 + + + 11056 + 1 + 0 + 0 + 0 + + + 11057 + 1 + 0 + 0 + 0 + + + 11058 + 1 + 0 + 0 + 0 + + + 11059 + 1 + 0 + 0 + 0 + + + 11060 + 20 + 0 + 0 + 0 + + + 11061 + 1000 + 0 + 0 + 0 + + + 11062 + 1 + 0 + 0 + 0 + + + 11063 + 1 + 0 + 0 + 0 + + + 11064 + 1000 + 0 + 0 + 0 + + + 11065 + 5 + 0 + 0 + 0 + + + 11066 + 5 + 0 + 0 + 0 + + + 11067 + 1 + 0 + 0 + 0 + + + 11068 + 1 + 0 + 0 + 0 + + + 11069 + 550 + 0 + 0 + 0 + + + 11070 + 550 + 0 + 0 + 0 + + + 11071 + 1 + 0 + 0 + 0 + + + 11072 + 1150 + 0 + 0 + 0 + + + 11073 + 1150 + 0 + 0 + 0 + + + 11074 + 1265 + 0 + 0 + 0 + + + 11075 + 1265 + 0 + 0 + 0 + + + 11076 + 1525 + 0 + 0 + 0 + + + 11077 + 1525 + 0 + 0 + 0 + + + 11078 + 1 + 0 + 0 + 0 + + + 11079 + 1675 + 0 + 0 + 0 + + + 11080 + 1675 + 0 + 0 + 0 + + + 11081 + 1675 + 0 + 0 + 0 + + + 11082 + 1675 + 0 + 0 + 0 + + + 11083 + 1675 + 0 + 0 + 0 + + + 11084 + 1675 + 0 + 0 + 0 + + + 11085 + 2325 + 0 + 0 + 0 + + + 11086 + 2325 + 0 + 0 + 0 + + + 11087 + 1 + 0 + 0 + 0 + + + 11088 + 2560 + 0 + 0 + 0 + + + 11089 + 2560 + 0 + 0 + 0 + + + 11090 + 4050 + 0 + 0 + 0 + + + 11091 + 4050 + 0 + 0 + 0 + + + 11092 + 3825 + 0 + 0 + 0 + + + 11093 + 3825 + 0 + 0 + 0 + + + 11094 + 1 + 0 + 0 + 0 + + + 11095 + 4200 + 0 + 0 + 0 + + + 11096 + 4200 + 0 + 0 + 0 + + + 11097 + 4200 + 0 + 0 + 0 + + + 11098 + 4200 + 0 + 0 + 0 + + + 11099 + 4200 + 0 + 0 + 0 + + + 11100 + 4200 + 0 + 0 + 0 + + + 11101 + 4200 + 0 + 0 + 0 + + + 11102 + 4200 + 0 + 0 + 0 + + + 11103 + 4200 + 0 + 0 + 0 + + + 11104 + 4200 + 0 + 0 + 0 + + + 11105 + 20200 + 0 + 0 + 0 + + + 11106 + 20200 + 0 + 0 + 0 + + + 11107 + 20200 + 0 + 0 + 0 + + + 11108 + 20200 + 0 + 0 + 0 + + + 11109 + 20200 + 0 + 0 + 0 + + + 11110 + 20200 + 0 + 0 + 0 + + + 11111 + 20200 + 0 + 0 + 0 + + + 11112 + 20200 + 0 + 0 + 0 + + + 11113 + 20200 + 0 + 0 + 0 + + + 11114 + 20200 + 0 + 0 + 0 + + + 11115 + 19125 + 0 + 0 + 0 + + + 11116 + 19125 + 0 + 0 + 0 + + + 11117 + 1 + 0 + 0 + 0 + + + 11118 + 21040 + 0 + 0 + 0 + + + 11119 + 21040 + 0 + 0 + 0 + + + 11120 + 21040 + 0 + 0 + 0 + + + 11121 + 21040 + 0 + 0 + 0 + + + 11122 + 21040 + 0 + 0 + 0 + + + 11123 + 21040 + 0 + 0 + 0 + + + 11124 + 21040 + 0 + 0 + 0 + + + 11125 + 21040 + 0 + 0 + 0 + + + 11126 + 21040 + 0 + 0 + 0 + + + 11127 + 21040 + 0 + 0 + 0 + + + 11128 + 202000 + 0 + 0 + 0 + + + 11129 + 202000 + 0 + 0 + 0 + + + 11130 + 201000 + 0 + 0 + 0 + + + 11131 + 201000 + 0 + 0 + 0 + + + 11132 + 1 + 0 + 0 + 0 + + + 11133 + 202000 + 0 + 0 + 0 + + + 11134 + 202000 + 0 + 0 + 0 + + + 11135 + 1 + 0 + 0 + 0 + + + 11136 + 1 + 0 + 0 + 0 + + + 11137 + 1 + 0 + 0 + 0 + + + 11138 + 1 + 0 + 0 + 0 + + + 11139 + 1 + 0 + 0 + 0 + + + 11140 + 1 + 0 + 0 + 0 + + + 11141 + 1 + 0 + 0 + 0 + + + 11142 + 1 + 0 + 0 + 0 + + + 11143 + 1 + 0 + 0 + 0 + + + 11144 + 1 + 0 + 0 + 0 + + + 11145 + 1 + 0 + 0 + 0 + + + 11146 + 1 + 0 + 0 + 0 + + + 11147 + 1 + 0 + 0 + 0 + + + 11148 + 1 + 0 + 0 + 0 + + + 11149 + 1 + 0 + 0 + 0 + + + 11150 + 1 + 0 + 0 + 0 + + + 11151 + 1 + 0 + 0 + 0 + + + 11152 + 1 + 0 + 0 + 0 + + + 11153 + 1 + 0 + 0 + 0 + + + 11154 + 1 + 0 + 0 + 0 + + + 11155 + 20 + 0 + 0 + 0 + + + 11156 + 1 + 0 + 0 + 0 + + + 11157 + 1 + 0 + 0 + 0 + + + 11158 + 1 + 0 + 0 + 0 + + + 11159 + 1 + 0 + 0 + 0 + + + 11160 + 1 + 0 + 0 + 0 + + + 11161 + 1 + 0 + 0 + 0 + + + 11162 + 1 + 0 + 0 + 0 + + + 11163 + 1 + 0 + 0 + 0 + + + 11164 + 1 + 0 + 0 + 0 + + + 11165 + 4 + 0 + 0 + 0 + + + 11166 + 4 + 0 + 0 + 0 + + + 11167 + 4 + 0 + 0 + 0 + + + 11168 + 4 + 0 + 0 + 0 + + + 11169 + 1 + 0 + 0 + 0 + + + 11170 + 1 + 0 + 0 + 0 + + + 11171 + 1 + 0 + 0 + 0 + + + 11172 + 1 + 0 + 0 + 0 + + + 11173 + 1 + 0 + 0 + 0 + + + 11174 + 1 + 0 + 0 + 0 + + + 11175 + 1 + 0 + 0 + 0 + + + 11176 + 1 + 0 + 0 + 0 + + + 11177 + 1 + 0 + 0 + 0 + + + 11178 + 1 + 0 + 0 + 0 + + + 11179 + 1 + 0 + 0 + 0 + + + 11180 + 1 + 0 + 0 + 0 + + + 11181 + 1 + 0 + 0 + 0 + + + 11182 + 1 + 0 + 0 + 0 + + + 11183 + 1 + 0 + 0 + 0 + + + 11184 + 1 + 0 + 0 + 0 + + + 11185 + 1 + 0 + 0 + 0 + + + 11186 + 1 + 0 + 0 + 0 + + + 11187 + 1 + 0 + 0 + 0 + + + 11188 + 1 + 0 + 0 + 0 + + + 11189 + 1 + 0 + 0 + 0 + + + 11190 + 2400 + 0 + 0 + 0 + + + 11191 + 2400 + 0 + 0 + 0 + + + 11192 + 2400 + 0 + 0 + 0 + + + 11193 + 2400 + 0 + 0 + 0 + + + 11194 + 2400 + 0 + 0 + 0 + + + 11195 + 1 + 0 + 0 + 0 + + + 11196 + 1 + 0 + 0 + 0 + + + 11197 + 1 + 0 + 0 + 0 + + + 11198 + 1 + 0 + 0 + 0 + + + 11199 + 1 + 0 + 0 + 0 + + + 11200 + 60000 + 0 + 0 + 0 + + + 11201 + 60000 + 0 + 0 + 0 + + + 11202 + 1 + 0 + 0 + 0 + + + 11203 + 1 + 0 + 0 + 0 + + + 11204 + 1 + 0 + 0 + 0 + + + 11205 + 2 + 0 + 0 + 0 + + + 11206 + 1 + 0 + 0 + 0 + + + 11207 + 1 + 0 + 0 + 0 + + + 11208 + 1 + 0 + 0 + 0 + + + 11209 + 1 + 0 + 0 + 0 + + + 11210 + 1 + 0 + 0 + 0 + + + 11211 + 1 + 0 + 0 + 0 + + + 11212 + 800 + 0 + 0 + 0 + + + 11213 + 1 + 0 + 0 + 0 + + + 11214 + 1 + 0 + 0 + 0 + + + 11215 + 1 + 0 + 0 + 0 + + + 11216 + 1 + 0 + 0 + 0 + + + 11217 + 3 + 0 + 0 + 0 + + + 11218 + 1 + 0 + 0 + 0 + + + 11219 + 1 + 0 + 0 + 0 + + + 11220 + 1 + 0 + 0 + 0 + + + 11221 + 1 + 0 + 0 + 0 + + + 11222 + 10 + 0 + 0 + 0 + + + 11223 + 1 + 0 + 0 + 0 + + + 11224 + 1 + 0 + 0 + 0 + + + 11225 + 1 + 0 + 0 + 0 + + + 11226 + 1 + 0 + 0 + 0 + + + 11227 + 800 + 0 + 0 + 0 + + + 11228 + 800 + 0 + 0 + 0 + + + 11229 + 800 + 0 + 0 + 0 + + + 11230 + 500 + 0 + 0 + 0 + + + 11231 + 500 + 0 + 0 + 0 + + + 11232 + 250 + 0 + 0 + 0 + + + 11233 + 500 + 0 + 0 + 0 + + + 11234 + 500 + 0 + 0 + 0 + + + 11235 + 120002 + 0 + 0 + 0 + + + 11236 + 120002 + 0 + 0 + 0 + + + 11237 + 500 + 0 + 0 + 0 + + + 11238 + 50 + 0 + 0 + 0 + + + 11239 + 50 + 0 + 0 + 0 + + + 11240 + 50 + 0 + 0 + 0 + + + 11241 + 50 + 0 + 0 + 0 + + + 11242 + 50 + 0 + 0 + 0 + + + 11243 + 50 + 0 + 0 + 0 + + + 11244 + 50 + 0 + 0 + 0 + + + 11245 + 50 + 0 + 0 + 0 + + + 11246 + 50 + 0 + 0 + 0 + + + 11247 + 50 + 0 + 0 + 0 + + + 11248 + 50 + 0 + 0 + 0 + + + 11249 + 50 + 0 + 0 + 0 + + + 11250 + 50 + 0 + 0 + 0 + + + 11251 + 50 + 0 + 0 + 0 + + + 11252 + 50 + 0 + 0 + 0 + + + 11253 + 50 + 0 + 0 + 0 + + + 11254 + 50 + 0 + 0 + 0 + + + 11255 + 50 + 0 + 0 + 0 + + + 11256 + 50 + 0 + 0 + 0 + + + 11257 + 50 + 0 + 0 + 0 + + + 11258 + 600 + 0 + 0 + 0 + + + 11259 + 1000 + 0 + 0 + 0 + + + 11260 + 1 + 0 + 0 + 0 + + + 11261 + 1 + 0 + 0 + 0 + + + 11262 + 50 + 0 + 0 + 0 + + + 11263 + 50 + 0 + 0 + 0 + + + 11264 + 10 + 0 + 0 + 0 + + + 11265 + 10 + 0 + 0 + 0 + + + 11266 + 5 + 0 + 0 + 0 + + + 11267 + 1 + 0 + 0 + 0 + + + 11268 + 1000 + 0 + 0 + 0 + + + 11269 + 1 + 0 + 0 + 0 + + + 11270 + 1 + 0 + 0 + 0 + + + 11271 + 50 + 0 + 0 + 0 + + + 11272 + 50 + 0 + 0 + 0 + + + 11273 + 3 + 0 + 0 + 0 + + + 11274 + 75 + 0 + 0 + 0 + + + 11275 + 48 + 0 + 0 + 0 + + + 11276 + 1 + 0 + 0 + 0 + + + 11277 + 200 + 0 + 0 + 0 + + + 11278 + 80 + 0 + 0 + 0 + + + 11279 + 1 + 0 + 0 + 0 + + + 11280 + 200 + 0 + 0 + 0 + + + 11281 + 200 + 0 + 0 + 0 + + + 11282 + 80 + 0 + 0 + 0 + + + 11283 + 2000000 + 0 + 0 + 0 + + + 11284 + 2000000 + 0 + 0 + 0 + + + 11285 + 2000000 + 0 + 0 + 0 + + + 11286 + 750000 + 0 + 0 + 0 + + + 11287 + 750000 + 0 + 0 + 0 + + + 11288 + 40 + 0 + 0 + 0 + + + 11289 + 40 + 0 + 0 + 0 + + + 11290 + 40 + 0 + 0 + 0 + + + 11291 + 40 + 0 + 0 + 0 + + + 11292 + 40 + 0 + 0 + 0 + + + 11293 + 40 + 0 + 0 + 0 + + + 11294 + 40 + 0 + 0 + 0 + + + 11295 + 40 + 0 + 0 + 0 + + + 11296 + 40 + 0 + 0 + 0 + + + 11297 + 40 + 0 + 0 + 0 + + + 11298 + 40 + 0 + 0 + 0 + + + 11299 + 40 + 0 + 0 + 0 + + + 11300 + 40 + 0 + 0 + 0 + + + 11301 + 40 + 0 + 0 + 0 + + + 11302 + 40 + 0 + 0 + 0 + + + 11303 + 40 + 0 + 0 + 0 + + + 11304 + 40 + 0 + 0 + 0 + + + 11305 + 40 + 0 + 0 + 0 + + + 11306 + 1 + 0 + 0 + 0 + + + 11307 + 1 + 0 + 0 + 0 + + + 11308 + 1 + 0 + 0 + 0 + + + 11309 + 1 + 0 + 0 + 0 + + + 11310 + 1 + 0 + 0 + 0 + + + 11311 + 1 + 0 + 0 + 0 + + + 11312 + 1 + 0 + 0 + 0 + + + 11313 + 1 + 0 + 0 + 0 + + + 11314 + 1 + 0 + 0 + 0 + + + 11315 + 1 + 0 + 0 + 0 + + + 11316 + 1 + 0 + 0 + 0 + + + 11317 + 1 + 0 + 0 + 0 + + + 11318 + 1 + 0 + 0 + 0 + + + 11319 + 1 + 0 + 0 + 0 + + + 11320 + 3 + 0 + 0 + 0 + + + 11321 + 3 + 0 + 0 + 0 + + + 11322 + 3 + 0 + 0 + 0 + + + 11323 + 1 + 0 + 0 + 0 + + + 11324 + 20 + 0 + 0 + 0 + + + 11325 + 20 + 0 + 0 + 0 + + + 11326 + 50 + 0 + 0 + 0 + + + 11327 + 50 + 0 + 0 + 0 + + + 11328 + 25 + 0 + 0 + 0 + + + 11329 + 25 + 0 + 0 + 0 + + + 11330 + 50 + 0 + 0 + 0 + + + 11331 + 50 + 0 + 0 + 0 + + + 11332 + 75 + 0 + 0 + 0 + + + 11333 + 75 + 0 + 0 + 0 + + + 11334 + 1 + 0 + 0 + 0 + + + 11335 + 150000 + 0 + 0 + 0 + + + 11336 + 150000 + 0 + 0 + 0 + + + 11337 + 1000 + 0 + 0 + 0 + + + 11338 + 3500 + 0 + 0 + 0 + + + 11339 + 1 + 0 + 0 + 0 + + + 11340 + 1 + 0 + 0 + 0 + + + 11341 + 1 + 0 + 0 + 0 + + + 11342 + 1 + 0 + 0 + 0 + + + 11343 + 1 + 0 + 0 + 0 + + + 11344 + 1 + 0 + 0 + 0 + + + 11345 + 1 + 0 + 0 + 0 + + + 11346 + 1 + 0 + 0 + 0 + + + 11347 + 1 + 0 + 0 + 0 + + + 11348 + 1 + 0 + 0 + 0 + + + 11349 + 1 + 0 + 0 + 0 + + + 11350 + 1 + 0 + 0 + 0 + + + 11351 + 1 + 0 + 0 + 0 + + + 11352 + 1 + 0 + 0 + 0 + + + 11353 + 1 + 0 + 0 + 0 + + + 11354 + 1 + 0 + 0 + 0 + + + 11355 + 1 + 0 + 0 + 0 + + + 11356 + 1 + 0 + 0 + 0 + + + 11357 + 1 + 0 + 0 + 0 + + + 11358 + 1 + 0 + 0 + 0 + + + 11359 + 1 + 0 + 0 + 0 + + + 11360 + 1 + 0 + 0 + 0 + + + 11361 + 1 + 0 + 0 + 0 + + + 11362 + 1 + 0 + 0 + 0 + + + 11363 + 1 + 0 + 0 + 0 + + + 11364 + 1 + 0 + 0 + 0 + + + 11365 + 1 + 0 + 0 + 0 + + + 11366 + 1 + 0 + 0 + 0 + + + 11367 + 26 + 0 + 0 + 0 + + + 11368 + 26 + 0 + 0 + 0 + + + 11369 + 91 + 0 + 0 + 0 + + + 11370 + 91 + 0 + 0 + 0 + + + 11371 + 325 + 0 + 0 + 0 + + + 11372 + 325 + 0 + 0 + 0 + + + 11373 + 845 + 0 + 0 + 0 + + + 11374 + 845 + 0 + 0 + 0 + + + 11375 + 2080 + 0 + 0 + 0 + + + 11376 + 2080 + 0 + 0 + 0 + + + 11377 + 20800 + 0 + 0 + 0 + + + 11378 + 20800 + 0 + 0 + 0 + + + 11379 + 26 + 0 + 0 + 0 + + + 11380 + 26 + 0 + 0 + 0 + + + 11381 + 26 + 0 + 0 + 0 + + + 11382 + 26 + 0 + 0 + 0 + + + 11383 + 26 + 0 + 0 + 0 + + + 11384 + 26 + 0 + 0 + 0 + + + 11385 + 26 + 0 + 0 + 0 + + + 11386 + 91 + 0 + 0 + 0 + + + 11387 + 91 + 0 + 0 + 0 + + + 11388 + 91 + 0 + 0 + 0 + + + 11389 + 91 + 0 + 0 + 0 + + + 11390 + 91 + 0 + 0 + 0 + + + 11391 + 91 + 0 + 0 + 0 + + + 11392 + 91 + 0 + 0 + 0 + + + 11393 + 325 + 0 + 0 + 0 + + + 11394 + 325 + 0 + 0 + 0 + + + 11395 + 325 + 0 + 0 + 0 + + + 11396 + 325 + 0 + 0 + 0 + + + 11397 + 325 + 0 + 0 + 0 + + + 11398 + 325 + 0 + 0 + 0 + + + 11399 + 325 + 0 + 0 + 0 + + + 11400 + 845 + 0 + 0 + 0 + + + 11401 + 845 + 0 + 0 + 0 + + + 11402 + 845 + 0 + 0 + 0 + + + 11403 + 845 + 0 + 0 + 0 + + + 11404 + 845 + 0 + 0 + 0 + + + 11405 + 845 + 0 + 0 + 0 + + + 11406 + 845 + 0 + 0 + 0 + + + 11407 + 2080 + 0 + 0 + 0 + + + 11408 + 2080 + 0 + 0 + 0 + + + 11409 + 2080 + 0 + 0 + 0 + + + 11410 + 2080 + 0 + 0 + 0 + + + 11411 + 2080 + 0 + 0 + 0 + + + 11412 + 2080 + 0 + 0 + 0 + + + 11413 + 2080 + 0 + 0 + 0 + + + 11414 + 20800 + 0 + 0 + 0 + + + 11415 + 20800 + 0 + 0 + 0 + + + 11416 + 20800 + 0 + 0 + 0 + + + 11417 + 20800 + 0 + 0 + 0 + + + 11418 + 20800 + 0 + 0 + 0 + + + 11419 + 20800 + 0 + 0 + 0 + + + 11420 + 20800 + 0 + 0 + 0 + + + 11421 + 1 + 0 + 0 + 0 + + + 11422 + 1 + 0 + 0 + 0 + + + 11423 + 1 + 0 + 0 + 0 + + + 11424 + 1 + 0 + 0 + 0 + + + 11425 + 1 + 0 + 0 + 0 + + + 11426 + 1 + 0 + 0 + 0 + + + 11427 + 3 + 0 + 0 + 0 + + + 11428 + 3 + 0 + 0 + 0 + + + 11429 + 9 + 0 + 0 + 0 + + + 11430 + 9 + 0 + 0 + 0 + + + 11431 + 6 + 0 + 0 + 0 + + + 11432 + 6 + 0 + 0 + 0 + + + 11433 + 216 + 0 + 0 + 0 + + + 11434 + 216 + 0 + 0 + 0 + + + 11435 + 144 + 0 + 0 + 0 + + + 11436 + 144 + 0 + 0 + 0 + + + 11437 + 150 + 0 + 0 + 0 + + + 11438 + 150 + 0 + 0 + 0 + + + 11439 + 75 + 0 + 0 + 0 + + + 11440 + 75 + 0 + 0 + 0 + + + 11441 + 11 + 0 + 0 + 0 + + + 11442 + 11 + 0 + 0 + 0 + + + 11443 + 13 + 0 + 0 + 0 + + + 11444 + 13 + 0 + 0 + 0 + + + 11445 + 105 + 0 + 0 + 0 + + + 11446 + 105 + 0 + 0 + 0 + + + 11447 + 52 + 0 + 0 + 0 + + + 11448 + 52 + 0 + 0 + 0 + + + 11449 + 66 + 0 + 0 + 0 + + + 11450 + 66 + 0 + 0 + 0 + + + 11451 + 44 + 0 + 0 + 0 + + + 11452 + 44 + 0 + 0 + 0 + + + 11453 + 72 + 0 + 0 + 0 + + + 11454 + 72 + 0 + 0 + 0 + + + 11455 + 36 + 0 + 0 + 0 + + + 11456 + 36 + 0 + 0 + 0 + + + 11457 + 90 + 0 + 0 + 0 + + + 11458 + 90 + 0 + 0 + 0 + + + 11459 + 60 + 0 + 0 + 0 + + + 11460 + 60 + 0 + 0 + 0 + + + 11461 + 100 + 0 + 0 + 0 + + + 11462 + 100 + 0 + 0 + 0 + + + 11463 + 50 + 0 + 0 + 0 + + + 11464 + 50 + 0 + 0 + 0 + + + 11465 + 114 + 0 + 0 + 0 + + + 11466 + 114 + 0 + 0 + 0 + + + 11467 + 76 + 0 + 0 + 0 + + + 11468 + 76 + 0 + 0 + 0 + + + 11469 + 135 + 0 + 0 + 0 + + + 11470 + 135 + 0 + 0 + 0 + + + 11471 + 90 + 0 + 0 + 0 + + + 11472 + 90 + 0 + 0 + 0 + + + 11473 + 216 + 0 + 0 + 0 + + + 11474 + 216 + 0 + 0 + 0 + + + 11475 + 144 + 0 + 0 + 0 + + + 11476 + 144 + 0 + 0 + 0 + + + 11477 + 150 + 0 + 0 + 0 + + + 11478 + 150 + 0 + 0 + 0 + + + 11479 + 100 + 0 + 0 + 0 + + + 11480 + 100 + 0 + 0 + 0 + + + 11481 + 160 + 0 + 0 + 0 + + + 11482 + 160 + 0 + 0 + 0 + + + 11483 + 90 + 0 + 0 + 0 + + + 11484 + 90 + 0 + 0 + 0 + + + 11485 + 165 + 0 + 0 + 0 + + + 11486 + 165 + 0 + 0 + 0 + + + 11487 + 110 + 0 + 0 + 0 + + + 11488 + 110 + 0 + 0 + 0 + + + 11489 + 180 + 0 + 0 + 0 + + + 11490 + 180 + 0 + 0 + 0 + + + 11491 + 130 + 0 + 0 + 0 + + + 11492 + 130 + 0 + 0 + 0 + + + 11493 + 180 + 0 + 0 + 0 + + + 11494 + 180 + 0 + 0 + 0 + + + 11495 + 120 + 0 + 0 + 0 + + + 11496 + 120 + 0 + 0 + 0 + + + 11497 + 198 + 0 + 0 + 0 + + + 11498 + 198 + 0 + 0 + 0 + + + 11499 + 132 + 0 + 0 + 0 + + + 11500 + 132 + 0 + 0 + 0 + + + 11501 + 216 + 0 + 0 + 0 + + + 11502 + 216 + 0 + 0 + 0 + + + 11503 + 144 + 0 + 0 + 0 + + + 11504 + 144 + 0 + 0 + 0 + + + 11505 + 198 + 0 + 0 + 0 + + + 11506 + 198 + 0 + 0 + 0 + + + 11507 + 132 + 0 + 0 + 0 + + + 11508 + 132 + 0 + 0 + 0 + + + 11509 + 216 + 0 + 0 + 0 + + + 11510 + 216 + 0 + 0 + 0 + + + 11511 + 144 + 0 + 0 + 0 + + + 11512 + 144 + 0 + 0 + 0 + + + 11513 + 200 + 0 + 0 + 0 + + + 11514 + 200 + 0 + 0 + 0 + + + 11515 + 150 + 0 + 0 + 0 + + + 11516 + 150 + 0 + 0 + 0 + + + 11517 + 9 + 0 + 0 + 0 + + + 11518 + 9 + 0 + 0 + 0 + + + 11519 + 6 + 0 + 0 + 0 + + + 11520 + 6 + 0 + 0 + 0 + + + 11521 + 150 + 0 + 0 + 0 + + + 11522 + 150 + 0 + 0 + 0 + + + 11523 + 125 + 0 + 0 + 0 + + + 11524 + 125 + 0 + 0 + 0 + + + 11525 + 25 + 0 + 0 + 0 + + + 11526 + 3 + 0 + 0 + 0 + + + 11527 + 3 + 0 + 0 + 0 + + + 11528 + 3 + 0 + 0 + 0 + + + 11529 + 3 + 0 + 0 + 0 + + + 11530 + 3 + 0 + 0 + 0 + + + 11531 + 3 + 0 + 0 + 0 + + + 11532 + 3 + 0 + 0 + 0 + + + 11533 + 3 + 0 + 0 + 0 + + + 11534 + 3 + 0 + 0 + 0 + + + 11535 + 3 + 0 + 0 + 0 + + + 11536 + 3 + 0 + 0 + 0 + + + 11537 + 3 + 0 + 0 + 0 + + + 11538 + 3 + 0 + 0 + 0 + + + 11539 + 3 + 0 + 0 + 0 + + + 11540 + 3 + 0 + 0 + 0 + + + 11541 + 3 + 0 + 0 + 0 + + + 11542 + 3 + 0 + 0 + 0 + + + 11543 + 3 + 0 + 0 + 0 + + + 11544 + 3 + 0 + 0 + 0 + + + 11545 + 3 + 0 + 0 + 0 + + + 11546 + 3 + 0 + 0 + 0 + + + 11547 + 3 + 0 + 0 + 0 + + + 11548 + 3 + 0 + 0 + 0 + + + 11549 + 3 + 0 + 0 + 0 + + + 11550 + 3 + 0 + 0 + 0 + + + 11551 + 3 + 0 + 0 + 0 + + + 11552 + 3 + 0 + 0 + 0 + + + 11553 + 3 + 0 + 0 + 0 + + + 11554 + 3 + 0 + 0 + 0 + + + 11555 + 3 + 0 + 0 + 0 + + + 11556 + 3 + 0 + 0 + 0 + + + 11557 + 3 + 0 + 0 + 0 + + + 11558 + 3 + 0 + 0 + 0 + + + 11559 + 3 + 0 + 0 + 0 + + + 11560 + 3 + 0 + 0 + 0 + + + 11561 + 3 + 0 + 0 + 0 + + + 11562 + 3 + 0 + 0 + 0 + + + 11563 + 3 + 0 + 0 + 0 + + + 11564 + 3 + 0 + 0 + 0 + + + 11565 + 3 + 0 + 0 + 0 + + + 11566 + 3 + 0 + 0 + 0 + + + 11567 + 3 + 0 + 0 + 0 + + + 11568 + 3 + 0 + 0 + 0 + + + 11569 + 3 + 0 + 0 + 0 + + + 11570 + 3 + 0 + 0 + 0 + + + 11571 + 3 + 0 + 0 + 0 + + + 11572 + 3 + 0 + 0 + 0 + + + 11573 + 3 + 0 + 0 + 0 + + + 11574 + 3 + 0 + 0 + 0 + + + 11575 + 3 + 0 + 0 + 0 + + + 11576 + 3 + 0 + 0 + 0 + + + 11577 + 3 + 0 + 0 + 0 + + + 11578 + 3 + 0 + 0 + 0 + + + 11579 + 3 + 0 + 0 + 0 + + + 11580 + 3 + 0 + 0 + 0 + + + 11581 + 3 + 0 + 0 + 0 + + + 11582 + 3 + 0 + 0 + 0 + + + 11583 + 3 + 0 + 0 + 0 + + + 11584 + 3 + 0 + 0 + 0 + + + 11585 + 3 + 0 + 0 + 0 + + + 11586 + 3 + 0 + 0 + 0 + + + 11587 + 3 + 0 + 0 + 0 + + + 11588 + 3 + 0 + 0 + 0 + + + 11589 + 3 + 0 + 0 + 0 + + + 11590 + 3 + 0 + 0 + 0 + + + 11591 + 3 + 0 + 0 + 0 + + + 11592 + 3 + 0 + 0 + 0 + + + 11593 + 3 + 0 + 0 + 0 + + + 11594 + 3 + 0 + 0 + 0 + + + 11595 + 3 + 0 + 0 + 0 + + + 11596 + 3 + 0 + 0 + 0 + + + 11597 + 3 + 0 + 0 + 0 + + + 11598 + 3 + 0 + 0 + 0 + + + 11599 + 3 + 0 + 0 + 0 + + + 11600 + 3 + 0 + 0 + 0 + + + 11601 + 3 + 0 + 0 + 0 + + + 11602 + 3 + 0 + 0 + 0 + + + 11603 + 3 + 0 + 0 + 0 + + + 11604 + 3 + 0 + 0 + 0 + + + 11605 + 3 + 0 + 0 + 0 + + + 11606 + 3 + 0 + 0 + 0 + + + 11607 + 3 + 0 + 0 + 0 + + + 11608 + 3 + 0 + 0 + 0 + + + 11609 + 3 + 0 + 0 + 0 + + + 11610 + 3 + 0 + 0 + 0 + + + 11611 + 3 + 0 + 0 + 0 + + + 11612 + 3 + 0 + 0 + 0 + + + 11613 + 3 + 0 + 0 + 0 + + + 11614 + 3 + 0 + 0 + 0 + + + 11615 + 3 + 0 + 0 + 0 + + + 11616 + 3 + 0 + 0 + 0 + + + 11617 + 3 + 0 + 0 + 0 + + + 11618 + 3 + 0 + 0 + 0 + + + 11619 + 3 + 0 + 0 + 0 + + + 11620 + 3 + 0 + 0 + 0 + + + 11621 + 3 + 0 + 0 + 0 + + + 11622 + 3 + 0 + 0 + 0 + + + 11623 + 3 + 0 + 0 + 0 + + + 11624 + 3 + 0 + 0 + 0 + + + 11625 + 3 + 0 + 0 + 0 + + + 11626 + 3 + 0 + 0 + 0 + + + 11627 + 3 + 0 + 0 + 0 + + + 11628 + 3 + 0 + 0 + 0 + + + 11629 + 3 + 0 + 0 + 0 + + + 11630 + 3 + 0 + 0 + 0 + + + 11631 + 3 + 0 + 0 + 0 + + + 11632 + 3 + 0 + 0 + 0 + + + 11633 + 3 + 0 + 0 + 0 + + + 11634 + 3 + 0 + 0 + 0 + + + 11635 + 3 + 0 + 0 + 0 + + + 11636 + 3 + 0 + 0 + 0 + + + 11637 + 3 + 0 + 0 + 0 + + + 11638 + 3 + 0 + 0 + 0 + + + 11639 + 3 + 0 + 0 + 0 + + + 11640 + 1 + 0 + 0 + 0 + + + 11641 + 3 + 0 + 0 + 0 + + + 11642 + 3 + 0 + 0 + 0 + + + 11643 + 3 + 0 + 0 + 0 + + + 11644 + 3 + 0 + 0 + 0 + + + 11645 + 3 + 0 + 0 + 0 + + + 11646 + 3 + 0 + 0 + 0 + + + 11647 + 3 + 0 + 0 + 0 + + + 11648 + 3 + 0 + 0 + 0 + + + 11649 + 3 + 0 + 0 + 0 + + + 11650 + 3 + 0 + 0 + 0 + + + 11651 + 3 + 0 + 0 + 0 + + + 11652 + 3 + 0 + 0 + 0 + + + 11653 + 3 + 0 + 0 + 0 + + + 11654 + 3 + 0 + 0 + 0 + + + 11655 + 3 + 0 + 0 + 0 + + + 11656 + 3 + 0 + 0 + 0 + + + 11657 + 3 + 0 + 0 + 0 + + + 11658 + 1 + 0 + 0 + 0 + + + 11659 + 1 + 0 + 0 + 0 + + + 11660 + 1 + 0 + 0 + 0 + + + 11661 + 1 + 0 + 0 + 0 + + + 11662 + 1 + 0 + 0 + 0 + + + 11663 + 9851 + 0 + 0 + 0 + + + 11664 + 9851 + 0 + 0 + 0 + + + 11665 + 9851 + 0 + 0 + 0 + + + 11666 + 100 + 0 + 0 + 0 + + + 11667 + 100 + 0 + 0 + 0 + + + 11668 + 100 + 0 + 0 + 0 + + + 11669 + 100 + 0 + 0 + 0 + + + 11670 + 100 + 0 + 0 + 0 + + + 11671 + 100 + 0 + 0 + 0 + + + 11672 + 100 + 0 + 0 + 0 + + + 11673 + 100 + 0 + 0 + 0 + + + 11674 + 9851 + 0 + 0 + 0 + + + 11675 + 9851 + 0 + 0 + 0 + + + 11676 + 9851 + 0 + 0 + 0 + + + 11677 + 6 + 0 + 0 + 0 + + + 11678 + 1 + 0 + 0 + 0 + + + 11679 + 1 + 0 + 0 + 0 + + + 11680 + 1 + 0 + 0 + 0 + + + 11681 + 1 + 0 + 0 + 0 + + + 11682 + 1 + 0 + 0 + 0 + + + 11683 + 1 + 0 + 0 + 0 + + + 11684 + 1 + 0 + 0 + 0 + + + 11685 + 1 + 0 + 0 + 0 + + + 11686 + 500000 + 0 + 0 + 0 + + + 11687 + 500000 + 0 + 0 + 0 + + + 11688 + 500000 + 0 + 0 + 0 + + + 11689 + 500000 + 0 + 0 + 0 + + + 11690 + 750000 + 0 + 0 + 0 + + + 11691 + 750000 + 0 + 0 + 0 + + + 11692 + 500000 + 0 + 0 + 0 + + + 11693 + 500000 + 0 + 0 + 0 + + + 11694 + 1250000 + 0 + 0 + 0 + + + 11695 + 1250000 + 0 + 0 + 0 + + + 11696 + 1250000 + 0 + 0 + 0 + + + 11697 + 1250000 + 0 + 0 + 0 + + + 11698 + 1250000 + 0 + 0 + 0 + + + 11699 + 1250000 + 0 + 0 + 0 + + + 11700 + 1250000 + 0 + 0 + 0 + + + 11701 + 1250000 + 0 + 0 + 0 + + + 11702 + 500000 + 0 + 0 + 0 + + + 11703 + 500000 + 0 + 0 + 0 + + + 11704 + 500000 + 0 + 0 + 0 + + + 11705 + 500000 + 0 + 0 + 0 + + + 11706 + 500000 + 0 + 0 + 0 + + + 11707 + 500000 + 0 + 0 + 0 + + + 11708 + 500000 + 0 + 0 + 0 + + + 11709 + 500000 + 0 + 0 + 0 + + + 11710 + 250000 + 0 + 0 + 0 + + + 11711 + 250000 + 0 + 0 + 0 + + + 11712 + 250000 + 0 + 0 + 0 + + + 11713 + 250000 + 0 + 0 + 0 + + + 11714 + 250000 + 0 + 0 + 0 + + + 11715 + 250000 + 0 + 0 + 0 + + + 11716 + 100000 + 0 + 0 + 0 + + + 11717 + 100000 + 0 + 0 + 0 + + + 11718 + 20000 + 0 + 0 + 0 + + + 11719 + 20000 + 0 + 0 + 0 + + + 11720 + 60000 + 0 + 0 + 0 + + + 11721 + 60000 + 0 + 0 + 0 + + + 11722 + 50000 + 0 + 0 + 0 + + + 11723 + 50000 + 0 + 0 + 0 + + + 11724 + 265000 + 0 + 0 + 0 + + + 11725 + 265000 + 0 + 0 + 0 + + + 11726 + 272500 + 0 + 0 + 0 + + + 11727 + 272500 + 0 + 0 + 0 + + + 11728 + 25000 + 0 + 0 + 0 + + + 11729 + 25000 + 0 + 0 + 0 + + + 11730 + 130000 + 0 + 0 + 0 + + + 11731 + 130000 + 0 + 0 + 0 + + + 11732 + 20000 + 0 + 0 + 0 + + + 11733 + 20000 + 0 + 0 + 0 + + + 11734 + 1 + 0 + 0 + 0 + + + 11735 + 1 + 0 + 0 + 0 + + + 11736 + 17000 + 0 + 0 + 0 + + + 11737 + 17000 + 0 + 0 + 0 + + + 11738 + 45000 + 0 + 0 + 0 + + + 11739 + 45000 + 0 + 0 + 0 + + + 11740 + 1 + 0 + 0 + 0 + + + 11741 + 1 + 0 + 0 + 0 + + + 11742 + 1 + 0 + 0 + 0 + + + 11743 + 1 + 0 + 0 + 0 + + + 11744 + 1 + 0 + 0 + 0 + + + 11745 + 1 + 0 + 0 + 0 + + + 11746 + 1 + 0 + 0 + 0 + + + 11747 + 1 + 0 + 0 + 0 + + + 11748 + 1 + 0 + 0 + 0 + + + 11749 + 10 + 0 + 0 + 0 + + + 11750 + 1 + 0 + 0 + 0 + + + 11751 + 1 + 0 + 0 + 0 + + + 11752 + 1 + 0 + 0 + 0 + + + 11753 + 1 + 0 + 0 + 0 + + + 11754 + 1 + 0 + 0 + 0 + + + 11755 + 1 + 0 + 0 + 0 + + + 11756 + 1 + 0 + 0 + 0 + + + 11757 + 1 + 0 + 0 + 0 + + + 11758 + 1 + 0 + 0 + 0 + + + 11759 + 1 + 0 + 0 + 0 + + + 11760 + 1 + 0 + 0 + 0 + + + 11761 + 1 + 0 + 0 + 0 + + + 11762 + 1 + 0 + 0 + 0 + + + 11763 + 1 + 0 + 0 + 0 + + + 11764 + 1 + 0 + 0 + 0 + + + 11765 + 1 + 0 + 0 + 0 + + + 11766 + 1 + 0 + 0 + 0 + + + 11767 + 1 + 0 + 0 + 0 + + + 11768 + 1 + 0 + 0 + 0 + + + 11769 + 1 + 0 + 0 + 0 + + + 11770 + 1 + 0 + 0 + 0 + + + 11771 + 1 + 0 + 0 + 0 + + + 11772 + 1 + 0 + 0 + 0 + + + 11773 + 1 + 0 + 0 + 0 + + + 11774 + 1 + 0 + 0 + 0 + + + 11775 + 1 + 0 + 0 + 0 + + + 11776 + 1 + 0 + 0 + 0 + + + 11777 + 1 + 0 + 0 + 0 + + + 11778 + 1 + 0 + 0 + 0 + + + 11779 + 1 + 0 + 0 + 0 + + + 11780 + 1 + 0 + 0 + 0 + + + 11781 + 5 + 0 + 0 + 0 + + + 11782 + 1 + 0 + 0 + 0 + + + 11783 + 1 + 0 + 0 + 0 + + + 11784 + 1 + 0 + 0 + 0 + + + 11785 + 1 + 0 + 0 + 0 + + + 11786 + 1 + 0 + 0 + 0 + + + 11787 + 1 + 0 + 0 + 0 + + + 11788 + 1 + 0 + 0 + 0 + + + 11789 + 1 + 0 + 0 + 0 + + + 11790 + 1 + 0 + 0 + 0 + + + 11791 + 40 + 0 + 0 + 0 + + + 11792 + 1 + 0 + 0 + 0 + + + 11793 + 1 + 0 + 0 + 0 + + + 11794 + 20 + 0 + 0 + 0 + + + 11795 + 1 + 0 + 0 + 0 + + + 11796 + 1 + 0 + 0 + 0 + + + 11797 + 1 + 0 + 0 + 0 + + + 11798 + 1 + 0 + 0 + 0 + + + 11799 + 1 + 0 + 0 + 0 + + + 11800 + 1 + 0 + 0 + 0 + + + 11801 + 1 + 0 + 0 + 0 + + + 11802 + 1 + 0 + 0 + 0 + + + 11803 + 1 + 0 + 0 + 0 + + + 11804 + 1 + 0 + 0 + 0 + + + 11805 + 1 + 0 + 0 + 0 + + + 11806 + 1 + 0 + 0 + 0 + + + 11807 + 10 + 0 + 0 + 0 + + + 11808 + 20 + 0 + 0 + 0 + + + 11809 + 14 + 0 + 0 + 0 + + + 11810 + 13 + 0 + 0 + 0 + + + 11811 + 13 + 0 + 0 + 0 + + + 11812 + 13 + 0 + 0 + 0 + + + 11813 + 1 + 0 + 0 + 0 + + + 11814 + 20 + 0 + 0 + 0 + + + 11815 + 20 + 0 + 0 + 0 + + + 11816 + 20 + 0 + 0 + 0 + + + 11817 + 20 + 0 + 0 + 0 + + + 11818 + 20 + 0 + 0 + 0 + + + 11819 + 20 + 0 + 0 + 0 + + + 11820 + 20 + 0 + 0 + 0 + + + 11821 + 20 + 0 + 0 + 0 + + + 11822 + 20 + 0 + 0 + 0 + + + 11823 + 20 + 0 + 0 + 0 + + + 11824 + 20 + 0 + 0 + 0 + + + 11825 + 20 + 0 + 0 + 0 + + + 11826 + 20 + 0 + 0 + 0 + + + 11827 + 20 + 0 + 0 + 0 + + + 11828 + 20 + 0 + 0 + 0 + + + 11829 + 20 + 0 + 0 + 0 + + + 11830 + 20 + 0 + 0 + 0 + + + 11831 + 20 + 0 + 0 + 0 + + + 11832 + 20 + 0 + 0 + 0 + + + 11833 + 20 + 0 + 0 + 0 + + + 11834 + 20 + 0 + 0 + 0 + + + 11835 + 20 + 0 + 0 + 0 + + + 11836 + 20 + 0 + 0 + 0 + + + 11837 + 20 + 0 + 0 + 0 + + + 11838 + 20 + 0 + 0 + 0 + + + 11839 + 20 + 0 + 0 + 0 + + + 11840 + 20 + 0 + 0 + 0 + + + 11841 + 20 + 0 + 0 + 0 + + + 11842 + 20 + 0 + 0 + 0 + + + 11843 + 20 + 0 + 0 + 0 + + + 11844 + 20 + 0 + 0 + 0 + + + 11845 + 20 + 0 + 0 + 0 + + + 11846 + 20 + 0 + 0 + 0 + + + 11847 + 20 + 0 + 0 + 0 + + + 11848 + 20 + 0 + 0 + 0 + + + 11849 + 20 + 0 + 0 + 0 + + + 11850 + 20 + 0 + 0 + 0 + + + 11851 + 20 + 0 + 0 + 0 + + + 11852 + 20 + 0 + 0 + 0 + + + 11853 + 20 + 0 + 0 + 0 + + + 11854 + 20 + 0 + 0 + 0 + + + 11855 + 20 + 0 + 0 + 0 + + + 11856 + 20 + 0 + 0 + 0 + + + 11857 + 20 + 0 + 0 + 0 + + + 11858 + 20 + 0 + 0 + 0 + + + 11859 + 20 + 0 + 0 + 0 + + + 11860 + 20 + 0 + 0 + 0 + + + 11861 + 20 + 0 + 0 + 0 + + + 11862 + 20 + 0 + 0 + 0 + + + 11863 + 20 + 0 + 0 + 0 + + + 11864 + 20 + 0 + 0 + 0 + + + 11865 + 20 + 0 + 0 + 0 + + + 11866 + 20 + 0 + 0 + 0 + + + 11867 + 20 + 0 + 0 + 0 + + + 11868 + 20 + 0 + 0 + 0 + + + 11869 + 20 + 0 + 0 + 0 + + + 11870 + 20 + 0 + 0 + 0 + + + 11871 + 20 + 0 + 0 + 0 + + + 11872 + 20 + 0 + 0 + 0 + + + 11873 + 20 + 0 + 0 + 0 + + + 11874 + 20 + 0 + 0 + 0 + + + 11875 + 20 + 0 + 0 + 0 + + + 11876 + 20 + 0 + 0 + 0 + + + 11877 + 20 + 0 + 0 + 0 + + + 11878 + 20 + 0 + 0 + 0 + + + 11879 + 20 + 0 + 0 + 0 + + + 11880 + 20 + 0 + 0 + 0 + + + 11881 + 20 + 0 + 0 + 0 + + + 11882 + 20 + 0 + 0 + 0 + + + 11883 + 20 + 0 + 0 + 0 + + + 11884 + 20 + 0 + 0 + 0 + + + 11885 + 20 + 0 + 0 + 0 + + + 11886 + 20 + 0 + 0 + 0 + + + 11887 + 20 + 0 + 0 + 0 + + + 11888 + 20 + 0 + 0 + 0 + + + 11889 + 20 + 0 + 0 + 0 + + + 11890 + 20 + 0 + 0 + 0 + + + 11891 + 20 + 0 + 0 + 0 + + + 11892 + 20 + 0 + 0 + 0 + + + 11893 + 20 + 0 + 0 + 0 + + + 11894 + 20 + 0 + 0 + 0 + + + 11895 + 20 + 0 + 0 + 0 + + + 11896 + 20 + 0 + 0 + 0 + + + 11897 + 20 + 0 + 0 + 0 + + + 11898 + 20 + 0 + 0 + 0 + + + 11899 + 20 + 0 + 0 + 0 + + + 11900 + 20 + 0 + 0 + 0 + + + 11901 + 20 + 0 + 0 + 0 + + + 11902 + 20 + 0 + 0 + 0 + + + 11903 + 20 + 0 + 0 + 0 + + + 11904 + 20 + 0 + 0 + 0 + + + 11905 + 20 + 0 + 0 + 0 + + + 11906 + 20 + 0 + 0 + 0 + + + 11907 + 20 + 0 + 0 + 0 + + + 11908 + 20 + 0 + 0 + 0 + + + 11909 + 20 + 0 + 0 + 0 + + + 11910 + 20 + 0 + 0 + 0 + + + 11911 + 20 + 0 + 0 + 0 + + + 11912 + 20 + 0 + 0 + 0 + + + 11913 + 20 + 0 + 0 + 0 + + + 11914 + 20 + 0 + 0 + 0 + + + 11915 + 20 + 0 + 0 + 0 + + + 11916 + 20 + 0 + 0 + 0 + + + 11917 + 20 + 0 + 0 + 0 + + + 11918 + 20 + 0 + 0 + 0 + + + 11919 + 20 + 0 + 0 + 0 + + + 11920 + 20 + 0 + 0 + 0 + + + 11921 + 20 + 0 + 0 + 0 + + + 11922 + 20 + 0 + 0 + 0 + + + 11923 + 20 + 0 + 0 + 0 + + + 11924 + 20 + 0 + 0 + 0 + + + 11925 + 20 + 0 + 0 + 0 + + + 11926 + 20 + 0 + 0 + 0 + + + 11927 + 20 + 0 + 0 + 0 + + + 11928 + 20 + 0 + 0 + 0 + + + 11929 + 20 + 0 + 0 + 0 + + + 11930 + 20 + 0 + 0 + 0 + + + 11931 + 20 + 0 + 0 + 0 + + + 11932 + 20 + 0 + 0 + 0 + + + 11933 + 20 + 0 + 0 + 0 + + + 11934 + 20 + 0 + 0 + 0 + + + 11935 + 20 + 0 + 0 + 0 + + + 11936 + 20 + 0 + 0 + 0 + + + 11937 + 20 + 0 + 0 + 0 + + + 11938 + 20 + 0 + 0 + 0 + + + 11939 + 20 + 0 + 0 + 0 + + + 11940 + 20 + 0 + 0 + 0 + + + 11941 + 20 + 0 + 0 + 0 + + + 11942 + 20 + 0 + 0 + 0 + + + 11943 + 20 + 0 + 0 + 0 + + + 11944 + 20 + 0 + 0 + 0 + + + 11945 + 20 + 0 + 0 + 0 + + + 11946 + 20 + 0 + 0 + 0 + + + 11947 + 20 + 0 + 0 + 0 + + + 11948 + 1 + 0 + 0 + 0 + + + 11949 + 1 + 0 + 0 + 0 + + + 11950 + 1 + 0 + 0 + 0 + + + 11951 + 1 + 0 + 0 + 0 + + + 11952 + 1 + 0 + 0 + 0 + + + 11953 + 1 + 0 + 0 + 0 + + + 11954 + 1 + 0 + 0 + 0 + + + 11955 + 1 + 0 + 0 + 0 + + + 11956 + 1 + 0 + 0 + 0 + + + 11957 + 1 + 0 + 0 + 0 + + + 11958 + 1 + 0 + 0 + 0 + + + 11959 + 1 + 0 + 0 + 0 + + + 11960 + 20 + 0 + 0 + 0 + + + 11961 + 20 + 0 + 0 + 0 + + + 11962 + 20 + 0 + 0 + 0 + + + 11963 + 20 + 0 + 0 + 0 + + + 11964 + 1 + 0 + 0 + 0 + + + 11965 + 1 + 0 + 0 + 0 + + + 11966 + 1 + 0 + 0 + 0 + + + 11967 + 20 + 0 + 0 + 0 + + + 11968 + 20 + 0 + 0 + 0 + + + 11969 + 100 + 0 + 0 + 0 + + + 11970 + 1 + 0 + 0 + 0 + + + 11971 + 1 + 0 + 0 + 0 + + + 11972 + 1 + 0 + 0 + 0 + + + 11973 + 1 + 0 + 0 + 0 + + + 11974 + 1 + 0 + 0 + 0 + + + 11975 + 1 + 0 + 0 + 0 + + + 11976 + 1 + 0 + 0 + 0 + + + 11977 + 1 + 0 + 0 + 0 + + + 11978 + 1 + 0 + 0 + 0 + + + 11979 + 1 + 0 + 0 + 0 + + + 11980 + 1 + 0 + 0 + 0 + + + 11981 + 1 + 0 + 0 + 0 + + + 11982 + 1 + 0 + 0 + 0 + + + 11983 + 1 + 0 + 0 + 0 + + + 11984 + 1 + 0 + 0 + 0 + + + 11985 + 1 + 0 + 0 + 0 + + + 11986 + 1 + 0 + 0 + 0 + + + 11987 + 1 + 0 + 0 + 0 + + + 11988 + 1 + 0 + 0 + 0 + + + 11989 + 1 + 0 + 0 + 0 + + + 11990 + 1 + 0 + 0 + 0 + + + 11991 + 1 + 0 + 0 + 0 + + + 11992 + 1 + 0 + 0 + 0 + + + 11993 + 1 + 0 + 0 + 0 + + + 11994 + 1 + 0 + 0 + 0 + + + 11995 + 1 + 0 + 0 + 0 + + + 11996 + 1 + 0 + 0 + 0 + + + 11997 + 1 + 0 + 0 + 0 + + + 11998 + 1 + 0 + 0 + 0 + + + 11999 + 1 + 0 + 0 + 0 + + + 12000 + 1 + 0 + 0 + 0 + + + 12001 + 1 + 0 + 0 + 0 + + + 12002 + 1 + 0 + 0 + 0 + + + 12003 + 1 + 0 + 0 + 0 + + + 12004 + 1 + 0 + 0 + 0 + + + 12005 + 1 + 0 + 0 + 0 + + + 12006 + 1 + 0 + 0 + 0 + + + 12007 + 724 + 0 + 0 + 0 + + + 12008 + 724 + 0 + 0 + 0 + + + 12009 + 599 + 0 + 0 + 0 + + + 12010 + 599 + 0 + 0 + 0 + + + 12011 + 4624 + 0 + 0 + 0 + + + 12012 + 4624 + 0 + 0 + 0 + + + 12013 + 3524 + 0 + 0 + 0 + + + 12014 + 3524 + 0 + 0 + 0 + + + 12015 + 3324 + 0 + 0 + 0 + + + 12016 + 3324 + 0 + 0 + 0 + + + 12017 + 449 + 0 + 0 + 0 + + + 12018 + 449 + 0 + 0 + 0 + + + 12019 + 649 + 0 + 0 + 0 + + + 12020 + 649 + 0 + 0 + 0 + + + 12021 + 2224 + 0 + 0 + 0 + + + 12022 + 2224 + 0 + 0 + 0 + + + 12023 + 4024 + 0 + 0 + 0 + + + 12024 + 4024 + 0 + 0 + 0 + + + 12025 + 3624 + 0 + 0 + 0 + + + 12026 + 3624 + 0 + 0 + 0 + + + 12027 + 4199 + 0 + 0 + 0 + + + 12028 + 4199 + 0 + 0 + 0 + + + 12029 + 3174 + 0 + 0 + 0 + + + 12030 + 3174 + 0 + 0 + 0 + + + 12031 + 449 + 0 + 0 + 0 + + + 12032 + 449 + 0 + 0 + 0 + + + 12033 + 3674 + 0 + 0 + 0 + + + 12034 + 3674 + 0 + 0 + 0 + + + 12035 + 3074 + 0 + 0 + 0 + + + 12036 + 3074 + 0 + 0 + 0 + + + 12037 + 3399 + 0 + 0 + 0 + + + 12038 + 3399 + 0 + 0 + 0 + + + 12039 + 3924 + 0 + 0 + 0 + + + 12040 + 3924 + 0 + 0 + 0 + + + 12041 + 2624 + 0 + 0 + 0 + + + 12042 + 2624 + 0 + 0 + 0 + + + 12043 + 624 + 0 + 0 + 0 + + + 12044 + 624 + 0 + 0 + 0 + + + 12045 + 3624 + 0 + 0 + 0 + + + 12046 + 3624 + 0 + 0 + 0 + + + 12047 + 599 + 0 + 0 + 0 + + + 12048 + 599 + 0 + 0 + 0 + + + 12049 + 1549 + 0 + 0 + 0 + + + 12050 + 1549 + 0 + 0 + 0 + + + 12051 + 3024 + 0 + 0 + 0 + + + 12052 + 3024 + 0 + 0 + 0 + + + 12053 + 2449 + 0 + 0 + 0 + + + 12054 + 2449 + 0 + 0 + 0 + + + 12055 + 1849 + 0 + 0 + 0 + + + 12056 + 1849 + 0 + 0 + 0 + + + 12057 + 774 + 0 + 0 + 0 + + + 12058 + 774 + 0 + 0 + 0 + + + 12059 + 624 + 0 + 0 + 0 + + + 12060 + 624 + 0 + 0 + 0 + + + 12061 + 3349 + 0 + 0 + 0 + + + 12062 + 3349 + 0 + 0 + 0 + + + 12063 + 1699 + 0 + 0 + 0 + + + 12064 + 1699 + 0 + 0 + 0 + + + 12065 + 2524 + 0 + 0 + 0 + + + 12066 + 2524 + 0 + 0 + 0 + + + 12067 + 2299 + 0 + 0 + 0 + + + 12068 + 2299 + 0 + 0 + 0 + + + 12069 + 4574 + 0 + 0 + 0 + + + 12070 + 4574 + 0 + 0 + 0 + + + 12071 + 2374 + 0 + 0 + 0 + + + 12072 + 2374 + 0 + 0 + 0 + + + 12073 + 2974 + 0 + 0 + 0 + + + 12074 + 2974 + 0 + 0 + 0 + + + 12075 + 3549 + 0 + 0 + 0 + + + 12076 + 3549 + 0 + 0 + 0 + + + 12077 + 3949 + 0 + 0 + 0 + + + 12078 + 3949 + 0 + 0 + 0 + + + 12079 + 4224 + 0 + 0 + 0 + + + 12080 + 4224 + 0 + 0 + 0 + + + 12081 + 4024 + 0 + 0 + 0 + + + 12082 + 4024 + 0 + 0 + 0 + + + 12083 + 449 + 0 + 0 + 0 + + + 12084 + 449 + 0 + 0 + 0 + + + 12085 + 3949 + 0 + 0 + 0 + + + 12086 + 3949 + 0 + 0 + 0 + + + 12087 + 699 + 0 + 0 + 0 + + + 12088 + 699 + 0 + 0 + 0 + + + 12089 + 5499 + 0 + 0 + 0 + + + 12090 + 5499 + 0 + 0 + 0 + + + 12091 + 1599 + 0 + 0 + 0 + + + 12092 + 1599 + 0 + 0 + 0 + + + 12093 + 5699 + 0 + 0 + 0 + + + 12094 + 5699 + 0 + 0 + 0 + + + 12095 + 2624 + 0 + 0 + 0 + + + 12096 + 2624 + 0 + 0 + 0 + + + 12097 + 2624 + 0 + 0 + 0 + + + 12098 + 2624 + 0 + 0 + 0 + + + 12099 + 2624 + 0 + 0 + 0 + + + 12100 + 2624 + 0 + 0 + 0 + + + 12101 + 2624 + 0 + 0 + 0 + + + 12102 + 2624 + 0 + 0 + 0 + + + 12103 + 2624 + 0 + 0 + 0 + + + 12104 + 2624 + 0 + 0 + 0 + + + 12105 + 2624 + 0 + 0 + 0 + + + 12106 + 2624 + 0 + 0 + 0 + + + 12107 + 2624 + 0 + 0 + 0 + + + 12108 + 2624 + 0 + 0 + 0 + + + 12109 + 100 + 0 + 0 + 0 + + + 12110 + 100 + 0 + 0 + 0 + + + 12111 + 1000 + 0 + 0 + 0 + + + 12112 + 1000 + 0 + 0 + 0 + + + 12113 + 1000 + 0 + 0 + 0 + + + 12114 + 1000 + 0 + 0 + 0 + + + 12115 + 1000 + 0 + 0 + 0 + + + 12116 + 1000 + 0 + 0 + 0 + + + 12117 + 1000 + 0 + 0 + 0 + + + 12118 + 1000 + 0 + 0 + 0 + + + 12119 + 1000 + 0 + 0 + 0 + + + 12120 + 1000 + 0 + 0 + 0 + + + 12121 + 1000 + 0 + 0 + 0 + + + 12122 + 1000 + 0 + 0 + 0 + + + 12123 + 699 + 0 + 0 + 0 + + + 12124 + 699 + 0 + 0 + 0 + + + 12125 + 10 + 0 + 0 + 0 + + + 12126 + 10 + 0 + 0 + 0 + + + 12127 + 10 + 0 + 0 + 0 + + + 12128 + 10 + 0 + 0 + 0 + + + 12129 + 1 + 0 + 0 + 0 + + + 12130 + 10 + 0 + 0 + 0 + + + 12131 + 10 + 0 + 0 + 0 + + + 12132 + 200 + 0 + 0 + 0 + + + 12133 + 200 + 0 + 0 + 0 + + + 12134 + 30 + 0 + 0 + 0 + + + 12135 + 30 + 0 + 0 + 0 + + + 12136 + 20 + 0 + 0 + 0 + + + 12137 + 20 + 0 + 0 + 0 + + + 12138 + 10 + 0 + 0 + 0 + + + 12139 + 10 + 0 + 0 + 0 + + + 12140 + 190 + 0 + 0 + 0 + + + 12141 + 190 + 0 + 0 + 0 + + + 12142 + 152 + 0 + 0 + 0 + + + 12143 + 152 + 0 + 0 + 0 + + + 12144 + 114 + 0 + 0 + 0 + + + 12145 + 114 + 0 + 0 + 0 + + + 12146 + 76 + 0 + 0 + 0 + + + 12147 + 76 + 0 + 0 + 0 + + + 12148 + 20 + 0 + 0 + 0 + + + 12149 + 1 + 0 + 0 + 0 + + + 12150 + 1 + 0 + 0 + 0 + + + 12151 + 1 + 0 + 0 + 0 + + + 12152 + 1 + 0 + 0 + 0 + + + 12153 + 50 + 0 + 0 + 0 + + + 12154 + 50 + 0 + 0 + 0 + + + 12155 + 1 + 0 + 0 + 0 + + + 12156 + 5 + 0 + 0 + 0 + + + 12157 + 5 + 0 + 0 + 0 + + + 12158 + 100 + 0 + 0 + 0 + + + 12159 + 100 + 0 + 0 + 0 + + + 12160 + 100 + 0 + 0 + 0 + + + 12161 + 1 + 0 + 0 + 0 + + + 12162 + 1 + 0 + 0 + 0 + + + 12163 + 100 + 0 + 0 + 0 + + + 12164 + 1 + 0 + 0 + 0 + + + 12165 + 1 + 0 + 0 + 0 + + + 12166 + 1 + 0 + 0 + 0 + + + 12167 + 1 + 0 + 0 + 0 + + + 12168 + 1 + 0 + 0 + 0 + + + 12169 + 99000 + 0 + 0 + 0 + + + 12170 + 99000 + 0 + 0 + 0 + + + 12171 + 1 + 0 + 0 + 0 + + + 12172 + 24 + 0 + 0 + 0 + + + 12173 + 24 + 0 + 0 + 0 + + + 12174 + 1 + 0 + 0 + 0 + + + 12175 + 1 + 0 + 0 + 0 + + + 12176 + 18 + 0 + 0 + 0 + + + 12177 + 1 + 0 + 0 + 0 + + + 12178 + 1 + 0 + 0 + 0 + + + 12179 + 1 + 0 + 0 + 0 + + + 12180 + 1 + 0 + 0 + 0 + + + 12181 + 23 + 0 + 0 + 0 + + + 12182 + 23 + 0 + 0 + 0 + + + 12183 + 25 + 0 + 0 + 0 + + + 12184 + 1 + 0 + 0 + 0 + + + 12185 + 1 + 0 + 0 + 0 + + + 12186 + 1 + 0 + 0 + 0 + + + 12187 + 1 + 0 + 0 + 0 + + + 12188 + 1 + 0 + 0 + 0 + + + 12189 + 1 + 0 + 0 + 0 + + + 12190 + 1 + 0 + 0 + 0 + + + 12191 + 1 + 0 + 0 + 0 + + + 12192 + 1 + 0 + 0 + 0 + + + 12193 + 1 + 0 + 0 + 0 + + + 12194 + 1 + 0 + 0 + 0 + + + 12195 + 1 + 0 + 0 + 0 + + + 12196 + 1 + 0 + 0 + 0 + + + 12197 + 1 + 0 + 0 + 0 + + + 12198 + 1 + 0 + 0 + 0 + + + 12199 + 1 + 0 + 0 + 0 + + + 12200 + 1 + 0 + 0 + 0 + + + 12201 + 1 + 0 + 0 + 0 + + + 12202 + 1 + 0 + 0 + 0 + + + 12203 + 1 + 0 + 0 + 0 + + + 12204 + 100 + 0 + 0 + 0 + + + 12205 + 100 + 0 + 0 + 0 + + + 12206 + 1 + 0 + 0 + 0 + + + 12207 + 200 + 0 + 0 + 0 + + + 12208 + 200 + 0 + 0 + 0 + + + 12209 + 1 + 0 + 0 + 0 + + + 12210 + 400 + 0 + 0 + 0 + + + 12211 + 400 + 0 + 0 + 0 + + + 12212 + 1 + 0 + 0 + 0 + + + 12213 + 400 + 0 + 0 + 0 + + + 12214 + 400 + 0 + 0 + 0 + + + 12215 + 1 + 0 + 0 + 0 + + + 12216 + 400 + 0 + 0 + 0 + + + 12217 + 400 + 0 + 0 + 0 + + + 12218 + 1 + 0 + 0 + 0 + + + 12219 + 400 + 0 + 0 + 0 + + + 12220 + 400 + 0 + 0 + 0 + + + 12221 + 1 + 0 + 0 + 0 + + + 12222 + 400 + 0 + 0 + 0 + + + 12223 + 400 + 0 + 0 + 0 + + + 12224 + 1 + 0 + 0 + 0 + + + 12225 + 1 + 0 + 0 + 0 + + + 12226 + 1 + 0 + 0 + 0 + + + 12227 + 1 + 0 + 0 + 0 + + + 12228 + 1 + 0 + 0 + 0 + + + 12229 + 1 + 0 + 0 + 0 + + + 12230 + 1 + 0 + 0 + 0 + + + 12231 + 1 + 0 + 0 + 0 + + + 12232 + 1 + 0 + 0 + 0 + + + 12233 + 1 + 0 + 0 + 0 + + + 12234 + 1 + 0 + 0 + 0 + + + 12235 + 1 + 0 + 0 + 0 + + + 12236 + 1 + 0 + 0 + 0 + + + 12237 + 1 + 0 + 0 + 0 + + + 12238 + 1 + 0 + 0 + 0 + + + 12239 + 1 + 0 + 0 + 0 + + + 12240 + 1 + 0 + 0 + 0 + + + 12241 + 1 + 0 + 0 + 0 + + + 12242 + 1 + 0 + 0 + 0 + + + 12243 + 1 + 0 + 0 + 0 + + + 12244 + 1 + 0 + 0 + 0 + + + 12245 + 1 + 0 + 0 + 0 + + + 12246 + 1 + 0 + 0 + 0 + + + 12247 + 1 + 0 + 0 + 0 + + + 12248 + 1 + 0 + 0 + 0 + + + 12249 + 1 + 0 + 0 + 0 + + + 12250 + 1 + 0 + 0 + 0 + + + 12251 + 1 + 0 + 0 + 0 + + + 12252 + 1 + 0 + 0 + 0 + + + 12253 + 1 + 0 + 0 + 0 + + + 12254 + 1 + 0 + 0 + 0 + + + 12255 + 1 + 0 + 0 + 0 + + + 12256 + 1 + 0 + 0 + 0 + + + 12257 + 1 + 0 + 0 + 0 + + + 12258 + 1 + 0 + 0 + 0 + + + 12259 + 1 + 0 + 0 + 0 + + + 12260 + 1 + 0 + 0 + 0 + + + 12261 + 1 + 0 + 0 + 0 + + + 12262 + 1 + 0 + 0 + 0 + + + 12263 + 1 + 0 + 0 + 0 + + + 12264 + 1 + 0 + 0 + 0 + + + 12265 + 1 + 0 + 0 + 0 + + + 12266 + 1 + 0 + 0 + 0 + + + 12267 + 1 + 0 + 0 + 0 + + + 12268 + 1 + 0 + 0 + 0 + + + 12269 + 1 + 0 + 0 + 0 + + + 12270 + 1 + 0 + 0 + 0 + + + 12271 + 1 + 0 + 0 + 0 + + + 12272 + 1 + 0 + 0 + 0 + + + 12273 + 1 + 0 + 0 + 0 + + + 12274 + 1 + 0 + 0 + 0 + + + 12275 + 1 + 0 + 0 + 0 + + + 12276 + 1 + 0 + 0 + 0 + + + 12277 + 1 + 0 + 0 + 0 + + + 12278 + 1 + 0 + 0 + 0 + + + 12279 + 1 + 0 + 0 + 0 + + + 12280 + 1 + 0 + 0 + 0 + + + 12281 + 1 + 0 + 0 + 0 + + + 12282 + 1 + 0 + 0 + 0 + + + 12283 + 1 + 0 + 0 + 0 + + + 12284 + 1 + 0 + 0 + 0 + + + 12285 + 1 + 0 + 0 + 0 + + + 12286 + 1 + 0 + 0 + 0 + + + 12287 + 1 + 0 + 0 + 0 + + + 12288 + 1 + 0 + 0 + 0 + + + 12289 + 1 + 0 + 0 + 0 + + + 12290 + 1 + 0 + 0 + 0 + + + 12291 + 1 + 0 + 0 + 0 + + + 12292 + 1 + 0 + 0 + 0 + + + 12293 + 1 + 0 + 0 + 0 + + + 12294 + 1 + 0 + 0 + 0 + + + 12295 + 1 + 0 + 0 + 0 + + + 12296 + 1 + 0 + 0 + 0 + + + 12297 + 1 + 0 + 0 + 0 + + + 12298 + 1 + 0 + 0 + 0 + + + 12299 + 1 + 0 + 0 + 0 + + + 12300 + 1 + 0 + 0 + 0 + + + 12301 + 1 + 0 + 0 + 0 + + + 12302 + 1 + 0 + 0 + 0 + + + 12303 + 1 + 0 + 0 + 0 + + + 12304 + 1 + 0 + 0 + 0 + + + 12305 + 1 + 0 + 0 + 0 + + + 12306 + 1 + 0 + 0 + 0 + + + 12307 + 1 + 0 + 0 + 0 + + + 12308 + 1 + 0 + 0 + 0 + + + 12309 + 1 + 0 + 0 + 0 + + + 12310 + 1 + 0 + 0 + 0 + + + 12311 + 1 + 0 + 0 + 0 + + + 12312 + 1 + 0 + 0 + 0 + + + 12313 + 1 + 0 + 0 + 0 + + + 12314 + 1 + 0 + 0 + 0 + + + 12315 + 1 + 0 + 0 + 0 + + + 12316 + 1 + 0 + 0 + 0 + + + 12317 + 1 + 0 + 0 + 0 + + + 12318 + 1 + 0 + 0 + 0 + + + 12319 + 1 + 0 + 0 + 0 + + + 12320 + 1 + 0 + 0 + 0 + + + 12321 + 1 + 0 + 0 + 0 + + + 12322 + 1 + 0 + 0 + 0 + + + 12323 + 1 + 0 + 0 + 0 + + + 12324 + 1 + 0 + 0 + 0 + + + 12325 + 1 + 0 + 0 + 0 + + + 12326 + 1 + 0 + 0 + 0 + + + 12327 + 1 + 0 + 0 + 0 + + + 12328 + 1 + 0 + 0 + 0 + + + 12329 + 1 + 0 + 0 + 0 + + + 12330 + 1 + 0 + 0 + 0 + + + 12331 + 1 + 0 + 0 + 0 + + + 12332 + 1 + 0 + 0 + 0 + + + 12333 + 1 + 0 + 0 + 0 + + + 12334 + 1 + 0 + 0 + 0 + + + 12335 + 1 + 0 + 0 + 0 + + + 12336 + 1 + 0 + 0 + 0 + + + 12337 + 1 + 0 + 0 + 0 + + + 12338 + 1 + 0 + 0 + 0 + + + 12339 + 1 + 0 + 0 + 0 + + + 12340 + 1 + 0 + 0 + 0 + + + 12341 + 1 + 0 + 0 + 0 + + + 12342 + 1 + 0 + 0 + 0 + + + 12343 + 1 + 0 + 0 + 0 + + + 12344 + 1 + 0 + 0 + 0 + + + 12345 + 1 + 0 + 0 + 0 + + + 12346 + 1 + 0 + 0 + 0 + + + 12347 + 1 + 0 + 0 + 0 + + + 12348 + 1 + 0 + 0 + 0 + + + 12349 + 1 + 0 + 0 + 0 + + + 12350 + 1 + 0 + 0 + 0 + + + 12351 + 1 + 0 + 0 + 0 + + + 12352 + 1 + 0 + 0 + 0 + + + 12353 + 1 + 0 + 0 + 0 + + + 12354 + 1 + 0 + 0 + 0 + + + 12355 + 1 + 0 + 0 + 0 + + + 12356 + 1 + 0 + 0 + 0 + + + 12357 + 1 + 0 + 0 + 0 + + + 12358 + 1 + 0 + 0 + 0 + + + 12359 + 1 + 0 + 0 + 0 + + + 12360 + 1 + 0 + 0 + 0 + + + 12361 + 1 + 0 + 0 + 0 + + + 12362 + 1 + 0 + 0 + 0 + + + 12363 + 1 + 0 + 0 + 0 + + + 12364 + 1 + 0 + 0 + 0 + + + 12365 + 1 + 0 + 0 + 0 + + + 12366 + 1 + 0 + 0 + 0 + + + 12367 + 1 + 0 + 0 + 0 + + + 12368 + 1 + 0 + 0 + 0 + + + 12369 + 1 + 0 + 0 + 0 + + + 12370 + 1 + 0 + 0 + 0 + + + 12371 + 1 + 0 + 0 + 0 + + + 12372 + 1 + 0 + 0 + 0 + + + 12373 + 1 + 0 + 0 + 0 + + + 12374 + 1 + 0 + 0 + 0 + + + 12375 + 1 + 0 + 0 + 0 + + + 12376 + 1 + 0 + 0 + 0 + + + 12377 + 1 + 0 + 0 + 0 + + + 12378 + 1 + 0 + 0 + 0 + + + 12379 + 1 + 0 + 0 + 0 + + + 12380 + 1 + 0 + 0 + 0 + + + 12381 + 1 + 0 + 0 + 0 + + + 12382 + 1 + 0 + 0 + 0 + + + 12383 + 1 + 0 + 0 + 0 + + + 12384 + 1 + 0 + 0 + 0 + + + 12385 + 1 + 0 + 0 + 0 + + + 12386 + 1 + 0 + 0 + 0 + + + 12387 + 1 + 0 + 0 + 0 + + + 12388 + 1 + 0 + 0 + 0 + + + 12389 + 1 + 0 + 0 + 0 + + + 12390 + 1 + 0 + 0 + 0 + + + 12391 + 1 + 0 + 0 + 0 + + + 12392 + 1 + 0 + 0 + 0 + + + 12393 + 1 + 0 + 0 + 0 + + + 12394 + 1 + 0 + 0 + 0 + + + 12395 + 1 + 0 + 0 + 0 + + + 12396 + 1 + 0 + 0 + 0 + + + 12397 + 1 + 0 + 0 + 0 + + + 12398 + 1 + 0 + 0 + 0 + + + 12399 + 1 + 0 + 0 + 0 + + + 12400 + 1 + 0 + 0 + 0 + + + 12401 + 1 + 0 + 0 + 0 + + + 12402 + 1 + 0 + 0 + 0 + + + 12403 + 1 + 0 + 0 + 0 + + + 12404 + 1 + 0 + 0 + 0 + + + 12405 + 1 + 0 + 0 + 0 + + + 12406 + 1 + 0 + 0 + 0 + + + 12407 + 1 + 0 + 0 + 0 + + + 12408 + 1 + 0 + 0 + 0 + + + 12409 + 1 + 0 + 0 + 0 + + + 12410 + 1 + 0 + 0 + 0 + + + 12411 + 1 + 0 + 0 + 0 + + + 12412 + 1 + 0 + 0 + 0 + + + 12413 + 1 + 0 + 0 + 0 + + + 12414 + 1 + 0 + 0 + 0 + + + 12415 + 1 + 0 + 0 + 0 + + + 12416 + 1 + 0 + 0 + 0 + + + 12417 + 1 + 0 + 0 + 0 + + + 12418 + 1 + 0 + 0 + 0 + + + 12419 + 1 + 0 + 0 + 0 + + + 12420 + 1 + 0 + 0 + 0 + + + 12421 + 1 + 0 + 0 + 0 + + + 12422 + 237 + 0 + 0 + 0 + + + 12423 + 367 + 0 + 0 + 0 + + + 12424 + 314 + 0 + 0 + 0 + + + 12425 + 59 + 0 + 0 + 0 + + + 12426 + 262 + 0 + 0 + 0 + + + 12427 + 339 + 0 + 0 + 0 + + + 12428 + 62 + 0 + 0 + 0 + + + 12429 + 222 + 0 + 0 + 0 + + + 12430 + 229 + 0 + 0 + 0 + + + 12431 + 69 + 0 + 0 + 0 + + + 12432 + 184 + 0 + 0 + 0 + + + 12433 + 252 + 0 + 0 + 0 + + + 12434 + 392 + 0 + 0 + 0 + + + 12435 + 569 + 0 + 0 + 0 + + + 12436 + 332 + 0 + 0 + 0 + + + 12437 + 549 + 0 + 0 + 0 + + + 12438 + 317 + 0 + 0 + 0 + + + 12439 + 44 + 0 + 0 + 0 + + + 12440 + 159 + 0 + 0 + 0 + + + 12441 + 72 + 0 + 0 + 0 + + + 12442 + 362 + 0 + 0 + 0 + + + 12443 + 227 + 0 + 0 + 0 + + + 12444 + 334 + 0 + 0 + 0 + + + 12445 + 62 + 0 + 0 + 0 + + + 12446 + 169 + 0 + 0 + 0 + + + 12447 + 244 + 0 + 0 + 0 + + + 12448 + 302 + 0 + 0 + 0 + + + 12449 + 457 + 0 + 0 + 0 + + + 12450 + 462 + 0 + 0 + 0 + + + 12451 + 77 + 0 + 0 + 0 + + + 12452 + 69 + 0 + 0 + 0 + + + 12453 + 419 + 0 + 0 + 0 + + + 12454 + 307 + 0 + 0 + 0 + + + 12455 + 402 + 0 + 0 + 0 + + + 12456 + 44 + 0 + 0 + 0 + + + 12457 + 352 + 0 + 0 + 0 + + + 12458 + 262 + 0 + 0 + 0 + + + 12459 + 64 + 0 + 0 + 0 + + + 12460 + 154 + 0 + 0 + 0 + + + 12461 + 297 + 0 + 0 + 0 + + + 12462 + 354 + 0 + 0 + 0 + + + 12463 + 394 + 0 + 0 + 0 + + + 12464 + 422 + 0 + 0 + 0 + + + 12465 + 402 + 0 + 0 + 0 + + + 12466 + 44 + 0 + 0 + 0 + + + 12467 + 362 + 0 + 0 + 0 + + + 12468 + 394 + 0 + 0 + 0 + + + 12469 + 1 + 0 + 0 + 0 + + + 12470 + 1 + 0 + 0 + 0 + + + 12471 + 1 + 0 + 0 + 0 + + + 12472 + 1 + 0 + 0 + 0 + + + 12473 + 1 + 0 + 0 + 0 + + + 12474 + 1 + 0 + 0 + 0 + + + 12475 + 1 + 0 + 0 + 0 + + + 12476 + 1 + 0 + 0 + 0 + + + 12477 + 1 + 0 + 0 + 0 + + + 12478 + 1 + 0 + 0 + 0 + + + 12479 + 1 + 0 + 0 + 0 + + + 12480 + 1 + 0 + 0 + 0 + + + 12481 + 1 + 0 + 0 + 0 + + + 12482 + 1 + 0 + 0 + 0 + + + 12483 + 1 + 0 + 0 + 0 + + + 12484 + 1 + 0 + 0 + 0 + + + 12485 + 1 + 0 + 0 + 0 + + + 12486 + 1 + 0 + 0 + 0 + + + 12487 + 1 + 0 + 0 + 0 + + + 12488 + 1 + 0 + 0 + 0 + + + 12489 + 1 + 0 + 0 + 0 + + + 12490 + 1 + 0 + 0 + 0 + + + 12491 + 1 + 0 + 0 + 0 + + + 12492 + 1 + 0 + 0 + 0 + + + 12493 + 1 + 0 + 0 + 0 + + + 12494 + 1 + 0 + 0 + 0 + + + 12495 + 1 + 0 + 0 + 0 + + + 12496 + 1 + 0 + 0 + 0 + + + 12497 + 1 + 0 + 0 + 0 + + + 12498 + 1 + 0 + 0 + 0 + + + 12499 + 1 + 0 + 0 + 0 + + + 12500 + 1 + 0 + 0 + 0 + + + 12501 + 1 + 0 + 0 + 0 + + + 12502 + 1 + 0 + 0 + 0 + + + 12503 + 1 + 0 + 0 + 0 + + + 12504 + 1 + 0 + 0 + 0 + + + 12505 + 1 + 0 + 0 + 0 + + + 12506 + 1 + 0 + 0 + 0 + + + 12507 + 1 + 0 + 0 + 0 + + + 12508 + 1 + 0 + 0 + 0 + + + 12509 + 1 + 0 + 0 + 0 + + + 12510 + 1 + 0 + 0 + 0 + + + 12511 + 1 + 0 + 0 + 0 + + + 12512 + 1 + 0 + 0 + 0 + + + 12513 + 1 + 0 + 0 + 0 + + + 12514 + 1 + 0 + 0 + 0 + + + 12515 + 1 + 0 + 0 + 0 + + + 12516 + 1 + 0 + 0 + 0 + + + 12517 + 1 + 0 + 0 + 0 + + + 12518 + 1 + 0 + 0 + 0 + + + 12519 + 1 + 0 + 0 + 0 + + + 12520 + 1 + 0 + 0 + 0 + + + 12521 + 1 + 0 + 0 + 0 + + + 12522 + 1 + 0 + 0 + 0 + + + 12523 + 1 + 0 + 0 + 0 + + + 12524 + 99000 + 0 + 0 + 0 + + + 12525 + 1 + 0 + 0 + 0 + + + 12526 + 1 + 0 + 0 + 0 + + + 12527 + 1 + 0 + 0 + 0 + + + 12528 + 1 + 0 + 0 + 0 + + + 12529 + 1 + 0 + 0 + 0 + + + 12530 + 1 + 0 + 0 + 0 + + + 12531 + 3149 + 0 + 0 + 0 + + + 12532 + 3149 + 0 + 0 + 0 + + + 12533 + 59 + 0 + 0 + 0 + + + 12535 + 500 + 0 + 0 + 0 + + + 12536 + 500 + 0 + 0 + 0 + + + 12537 + 1 + 0 + 0 + 0 + + + 12538 + 1 + 0 + 0 + 0 + + + 12539 + 200 + 0 + 0 + 0 + + + 12540 + 1 + 0 + 0 + 0 + + + 12541 + 1 + 0 + 0 + 0 + + + 12542 + 1 + 0 + 0 + 0 + + + 12543 + 1 + 0 + 0 + 0 + + + 12544 + 1 + 0 + 0 + 0 + + + 12545 + 1 + 0 + 0 + 0 + + + 12546 + 1 + 0 + 0 + 0 + + + 12547 + 1 + 0 + 0 + 0 + + + 12548 + 1 + 0 + 0 + 0 + + + 12549 + 1 + 0 + 0 + 0 + + + 12550 + 1 + 0 + 0 + 0 + + + 12551 + 1 + 0 + 0 + 0 + + + 12552 + 1 + 0 + 0 + 0 + + + 12553 + 1 + 0 + 0 + 0 + + + 12554 + 1 + 0 + 0 + 0 + + + 12555 + 1 + 0 + 0 + 0 + + + 12556 + 1 + 0 + 0 + 0 + + + 12557 + 1 + 0 + 0 + 0 + + + 12558 + 10 + 0 + 0 + 0 + + + 12559 + 60 + 0 + 0 + 0 + + + 12560 + 60 + 0 + 0 + 0 + + + 12561 + 60 + 0 + 0 + 0 + + + 12562 + 60 + 0 + 0 + 0 + + + 12563 + 60 + 0 + 0 + 0 + + + 12564 + 60 + 0 + 0 + 0 + + + 12565 + 60 + 0 + 0 + 0 + + + 12566 + 60 + 0 + 0 + 0 + + + 12567 + 60 + 0 + 0 + 0 + + + 12568 + 100 + 0 + 0 + 0 + + + 12569 + 100 + 0 + 0 + 0 + + + 12570 + 180 + 0 + 0 + 0 + + + 12571 + 180 + 0 + 0 + 0 + + + 12572 + 4 + 0 + 0 + 0 + + + 12573 + 4 + 0 + 0 + 0 + + + 12574 + 4 + 0 + 0 + 0 + + + 12575 + 4 + 0 + 0 + 0 + + + 12576 + 4 + 0 + 0 + 0 + + + 12577 + 4 + 0 + 0 + 0 + + + 12578 + 4 + 0 + 0 + 0 + + + 12579 + 4 + 0 + 0 + 0 + + + 12580 + 4 + 0 + 0 + 0 + + + 12581 + 126 + 0 + 0 + 0 + + + 12582 + 126 + 0 + 0 + 0 + + + 12583 + 252 + 0 + 0 + 0 + + + 12584 + 252 + 0 + 0 + 0 + + + 12585 + 1 + 0 + 0 + 0 + + + 12586 + 1 + 0 + 0 + 0 + + + 12587 + 1 + 0 + 0 + 0 + + + 12588 + 2 + 0 + 0 + 0 + + + 12589 + 2 + 0 + 0 + 0 + + + 12590 + 2 + 0 + 0 + 0 + + + 12591 + 2 + 0 + 0 + 0 + + + 12592 + 60 + 0 + 0 + 0 + + + 12593 + 1 + 0 + 0 + 0 + + + 12594 + 1 + 0 + 0 + 0 + + + 12595 + 1 + 0 + 0 + 0 + + + 12596 + 1 + 0 + 0 + 0 + + + 12597 + 1 + 0 + 0 + 0 + + + 12598 + 1 + 0 + 0 + 0 + + + 12599 + 1 + 0 + 0 + 0 + + + 12600 + 1 + 0 + 0 + 0 + + + 12601 + 1 + 0 + 0 + 0 + + + 12602 + 1 + 0 + 0 + 0 + + + 12603 + 1 + 0 + 0 + 0 + + + 12604 + 1 + 0 + 0 + 0 + + + 12605 + 1 + 0 + 0 + 0 + + + 12606 + 1 + 0 + 0 + 0 + + + 12607 + 1 + 0 + 0 + 0 + + + 12608 + 200 + 0 + 0 + 0 + + + 12609 + 200 + 0 + 0 + 0 + + + 12610 + 200 + 0 + 0 + 0 + + + 12611 + 200 + 0 + 0 + 0 + + + 12612 + 200 + 0 + 0 + 0 + + + 12613 + 200 + 0 + 0 + 0 + + + 12614 + 200 + 0 + 0 + 0 + + + 12615 + 200 + 0 + 0 + 0 + + + 12616 + 200 + 0 + 0 + 0 + + + 12617 + 200 + 0 + 0 + 0 + + + 12618 + 200 + 0 + 0 + 0 + + + 12619 + 200 + 0 + 0 + 0 + + + 12620 + 200 + 0 + 0 + 0 + + + 12621 + 200 + 0 + 0 + 0 + + + 12622 + 200 + 0 + 0 + 0 + + + 12623 + 200 + 0 + 0 + 0 + + + 12624 + 20 + 0 + 0 + 0 + + + 12625 + 1 + 0 + 0 + 0 + + + 12626 + 2 + 0 + 0 + 0 + + + 12627 + 1 + 0 + 0 + 0 + + + 12628 + 1 + 0 + 0 + 0 + + + 12629 + 1 + 0 + 0 + 0 + + + 12630 + 1 + 0 + 0 + 0 + + + 12631 + 1 + 0 + 0 + 0 + + + 12632 + 1 + 0 + 0 + 0 + + + 12633 + 60 + 0 + 0 + 0 + + + 12634 + 1 + 0 + 0 + 0 + + + 12635 + 1 + 0 + 0 + 0 + + + 12636 + 1 + 0 + 0 + 0 + + + 12637 + 1 + 0 + 0 + 0 + + + 12638 + 1 + 0 + 0 + 0 + + + 12639 + 1 + 0 + 0 + 0 + + + 12640 + 1 + 0 + 0 + 0 + + + 12641 + 1 + 0 + 0 + 0 + + + 12642 + 1 + 0 + 0 + 0 + + + 12643 + 1 + 0 + 0 + 0 + + + 12644 + 1 + 0 + 0 + 0 + + + 12645 + 32 + 0 + 0 + 0 + + + 12646 + 1 + 0 + 0 + 0 + + + 12647 + 1 + 0 + 0 + 0 + + + 12648 + 1 + 0 + 0 + 0 + + + 12649 + 1 + 0 + 0 + 0 + + + 12650 + 1 + 0 + 0 + 0 + + + 12651 + 1 + 0 + 0 + 0 + + + 12652 + 1 + 0 + 0 + 0 + + + 12653 + 1 + 0 + 0 + 0 + + + 12654 + 1 + 0 + 0 + 0 + + + 12655 + 1 + 0 + 0 + 0 + + + 12656 + 1 + 0 + 0 + 0 + + + 12657 + 1 + 0 + 0 + 0 + + + 12658 + 3520 + 0 + 0 + 0 + + + 12659 + 3520 + 0 + 0 + 0 + + + 12660 + 300 + 0 + 0 + 0 + + + 12661 + 300 + 0 + 0 + 0 + + + 12662 + 10000 + 0 + 0 + 0 + + + 12663 + 10000 + 0 + 0 + 0 + + + 12664 + 35200 + 0 + 0 + 0 + + + 12665 + 35200 + 0 + 0 + 0 + + + 12666 + 100000 + 0 + 0 + 0 + + + 12667 + 100000 + 0 + 0 + 0 + + + 12668 + 100 + 0 + 0 + 0 + + + 12669 + 100 + 0 + 0 + 0 + + + 12670 + 20000 + 0 + 0 + 0 + + + 12671 + 20000 + 0 + 0 + 0 + + + 12672 + 78000 + 0 + 0 + 0 + + + 12673 + 78000 + 0 + 0 + 0 + + + 12674 + 78000 + 0 + 0 + 0 + + + 12675 + 78000 + 0 + 0 + 0 + + + 12676 + 78000 + 0 + 0 + 0 + + + 12677 + 78000 + 0 + 0 + 0 + + + 12678 + 78000 + 0 + 0 + 0 + + + 12679 + 78000 + 0 + 0 + 0 + + + 12680 + 50000 + 0 + 0 + 0 + + + 12681 + 50000 + 0 + 0 + 0 + + + 12682 + 1 + 0 + 0 + 0 + + + 12683 + 1 + 0 + 0 + 0 + + + 12684 + 1 + 0 + 0 + 0 + + + 12685 + 1 + 0 + 0 + 0 + + + 12686 + 1 + 0 + 0 + 0 + + + 12687 + 1 + 0 + 0 + 0 + + + 12688 + 1 + 0 + 0 + 0 + + + 12689 + 1 + 0 + 0 + 0 + + + 12690 + 1 + 0 + 0 + 0 + + + 12691 + 1 + 0 + 0 + 0 + + + 12692 + 1 + 0 + 0 + 0 + + + 12693 + 1 + 0 + 0 + 0 + + + 12694 + 1 + 0 + 0 + 0 + + + 12695 + 1 + 0 + 0 + 0 + + + 12696 + 1 + 0 + 0 + 0 + + + 12697 + 1 + 0 + 0 + 0 + + + 12698 + 1 + 0 + 0 + 0 + + + 12699 + 1 + 0 + 0 + 0 + + + 12700 + 1 + 0 + 0 + 0 + + + 12701 + 1 + 0 + 0 + 0 + + + 12702 + 1 + 0 + 0 + 0 + + + 12703 + 1 + 0 + 0 + 0 + + + 12704 + 1 + 0 + 0 + 0 + + + 12705 + 1 + 0 + 0 + 0 + + + 12706 + 1 + 0 + 0 + 0 + + + 12707 + 1 + 0 + 0 + 0 + + + 12708 + 1 + 0 + 0 + 0 + + + 12709 + 1 + 0 + 0 + 0 + + + 12710 + 1 + 0 + 0 + 0 + + + 12711 + 1 + 0 + 0 + 0 + + + 12712 + 1 + 0 + 0 + 0 + + + 12713 + 1 + 0 + 0 + 0 + + + 12714 + 1 + 0 + 0 + 0 + + + 12715 + 1 + 0 + 0 + 0 + + + 12716 + 1 + 0 + 0 + 0 + + + 12717 + 1 + 0 + 0 + 0 + + + 12718 + 1 + 0 + 0 + 0 + + + 12719 + 1 + 0 + 0 + 0 + + + 12720 + 1 + 0 + 0 + 0 + + + 12721 + 1 + 0 + 0 + 0 + + + 12722 + 1 + 0 + 0 + 0 + + + 12723 + 1 + 0 + 0 + 0 + + + 12724 + 1 + 0 + 0 + 0 + + + 12725 + 1 + 0 + 0 + 0 + + + 12726 + 1 + 0 + 0 + 0 + + + 12727 + 1 + 0 + 0 + 0 + + + 12728 + 1 + 0 + 0 + 0 + + + 12729 + 1 + 0 + 0 + 0 + + + 12730 + 1 + 0 + 0 + 0 + + + 12731 + 1 + 0 + 0 + 0 + + + 12732 + 1 + 0 + 0 + 0 + + + 12733 + 1 + 0 + 0 + 0 + + + 12734 + 1 + 0 + 0 + 0 + + + 12735 + 1 + 0 + 0 + 0 + + + 12736 + 1 + 0 + 0 + 0 + + + 12737 + 1 + 0 + 0 + 0 + + + 12738 + 1 + 0 + 0 + 0 + + + 12739 + 1 + 0 + 0 + 0 + + + 12740 + 1 + 0 + 0 + 0 + + + 12741 + 1 + 0 + 0 + 0 + + + 12742 + 1 + 0 + 0 + 0 + + + 12743 + 1 + 0 + 0 + 0 + + + 12744 + 1 + 0 + 0 + 0 + + + 12745 + 1 + 0 + 0 + 0 + + + 12746 + 1 + 0 + 0 + 0 + + + 12747 + 1 + 0 + 0 + 0 + + + 12748 + 1 + 0 + 0 + 0 + + + 12749 + 1 + 0 + 0 + 0 + + + 12750 + 1 + 0 + 0 + 0 + + + 12751 + 1 + 0 + 0 + 0 + + + 12752 + 1 + 0 + 0 + 0 + + + 12753 + 1 + 0 + 0 + 0 + + + 12754 + 1 + 0 + 0 + 0 + + + 12755 + 1 + 0 + 0 + 0 + + + 12756 + 1 + 0 + 0 + 0 + + + 12757 + 1 + 0 + 0 + 0 + + + 12758 + 1 + 0 + 0 + 0 + + + 12759 + 1 + 0 + 0 + 0 + + + 12760 + 1 + 0 + 0 + 0 + + + 12761 + 1 + 0 + 0 + 0 + + + 12762 + 1 + 0 + 0 + 0 + + + 12763 + 1 + 0 + 0 + 0 + + + 12764 + 1 + 0 + 0 + 0 + + + 12765 + 1 + 0 + 0 + 0 + + + 12766 + 1 + 0 + 0 + 0 + + + 12767 + 1 + 0 + 0 + 0 + + + 12768 + 1 + 0 + 0 + 0 + + + 12769 + 1 + 0 + 0 + 0 + + + 12770 + 1 + 0 + 0 + 0 + + + 12771 + 1 + 0 + 0 + 0 + + + 12772 + 1 + 0 + 0 + 0 + + + 12773 + 1 + 0 + 0 + 0 + + + 12774 + 1 + 0 + 0 + 0 + + + 12775 + 1 + 0 + 0 + 0 + + + 12776 + 4174 + 0 + 0 + 0 + + + 12777 + 4174 + 0 + 0 + 0 + + + 12778 + 449 + 0 + 0 + 0 + + + 12779 + 449 + 0 + 0 + 0 + + + 12780 + 2274 + 0 + 0 + 0 + + + 12781 + 2274 + 0 + 0 + 0 + + + 12782 + 3949 + 0 + 0 + 0 + + + 12783 + 3949 + 0 + 0 + 0 + + + 12784 + 4299 + 0 + 0 + 0 + + + 12785 + 4299 + 0 + 0 + 0 + + + 12786 + 5974 + 0 + 0 + 0 + + + 12787 + 5974 + 0 + 0 + 0 + + + 12788 + 5899 + 0 + 0 + 0 + + + 12789 + 5899 + 0 + 0 + 0 + + + 12790 + 4874 + 0 + 0 + 0 + + + 12791 + 4874 + 0 + 0 + 0 + + + 12792 + 5299 + 0 + 0 + 0 + + + 12793 + 5299 + 0 + 0 + 0 + + + 12794 + 4774 + 0 + 0 + 0 + + + 12795 + 4774 + 0 + 0 + 0 + + + 12796 + 3249 + 0 + 0 + 0 + + + 12797 + 3249 + 0 + 0 + 0 + + + 12798 + 2274 + 0 + 0 + 0 + + + 12799 + 2274 + 0 + 0 + 0 + + + 12800 + 2524 + 0 + 0 + 0 + + + 12801 + 2524 + 0 + 0 + 0 + + + 12802 + 5374 + 0 + 0 + 0 + + + 12803 + 5374 + 0 + 0 + 0 + + + 12804 + 5474 + 0 + 0 + 0 + + + 12805 + 5474 + 0 + 0 + 0 + + + 12806 + 5374 + 0 + 0 + 0 + + + 12807 + 5374 + 0 + 0 + 0 + + + 12808 + 2024 + 0 + 0 + 0 + + + 12809 + 2024 + 0 + 0 + 0 + + + 12810 + 4274 + 0 + 0 + 0 + + + 12811 + 4274 + 0 + 0 + 0 + + + 12812 + 4249 + 0 + 0 + 0 + + + 12813 + 4249 + 0 + 0 + 0 + + + 12814 + 2274 + 0 + 0 + 0 + + + 12815 + 2274 + 0 + 0 + 0 + + + 12816 + 3199 + 0 + 0 + 0 + + + 12817 + 3199 + 0 + 0 + 0 + + + 12818 + 2274 + 0 + 0 + 0 + + + 12819 + 2274 + 0 + 0 + 0 + + + 12820 + 2399 + 0 + 0 + 0 + + + 12821 + 2399 + 0 + 0 + 0 + + + 12822 + 5374 + 0 + 0 + 0 + + + 12823 + 5374 + 0 + 0 + 0 + + + 12824 + 537 + 0 + 0 + 0 + + + 12825 + 487 + 0 + 0 + 0 + + + 12826 + 529 + 0 + 0 + 0 + + + 12827 + 324 + 0 + 0 + 0 + + + 12828 + 537 + 0 + 0 + 0 + + + 12829 + 319 + 0 + 0 + 0 + + + 12830 + 239 + 0 + 0 + 0 + + + 12831 + 477 + 0 + 0 + 0 + + + 12832 + 417 + 0 + 0 + 0 + + + 12833 + 597 + 0 + 0 + 0 + + + 12834 + 252 + 0 + 0 + 0 + + + 12835 + 427 + 0 + 0 + 0 + + + 12836 + 424 + 0 + 0 + 0 + + + 12837 + 529 + 0 + 0 + 0 + + + 12838 + 44 + 0 + 0 + 0 + + + 12839 + 202 + 0 + 0 + 0 + + + 12840 + 429 + 0 + 0 + 0 + + + 12841 + 394 + 0 + 0 + 0 + + + 12842 + 1 + 0 + 0 + 0 + + + 12843 + 1 + 0 + 0 + 0 + + + 12844 + 100 + 0 + 0 + 0 + + + 12845 + 1 + 0 + 0 + 0 + + + 12846 + 1 + 0 + 0 + 0 + + + 12847 + 1 + 0 + 0 + 0 + + + 12848 + 1 + 0 + 0 + 0 + + + 12849 + 1 + 0 + 0 + 0 + + + 12850 + 2 + 0 + 0 + 0 + + + 12851 + 2 + 0 + 0 + 0 + + + 12852 + 1 + 0 + 0 + 0 + + + 12853 + 1 + 0 + 0 + 0 + + + 12854 + 1 + 0 + 0 + 0 + + + 12855 + 1 + 0 + 0 + 0 + + + 12856 + 1 + 0 + 0 + 0 + + + 12857 + 1 + 0 + 0 + 0 + + + 12858 + 1 + 0 + 0 + 0 + + + 12859 + 1 + 0 + 0 + 0 + + + 12860 + 1 + 0 + 0 + 0 + + + 12861 + 1 + 0 + 0 + 0 + + + 12862 + 1 + 0 + 0 + 0 + + + 12863 + 1 + 0 + 0 + 0 + + + 12864 + 1 + 0 + 0 + 0 + + + 12865 + 1 + 0 + 0 + 0 + + + 12866 + 25000 + 0 + 0 + 0 + + + 12867 + 25000 + 0 + 0 + 0 + + + 12868 + 25000 + 0 + 0 + 0 + + + 12869 + 25000 + 0 + 0 + 0 + + + 12870 + 25000 + 0 + 0 + 0 + + + 12871 + 25000 + 0 + 0 + 0 + + + 12872 + 25000 + 0 + 0 + 0 + + + 12873 + 50000 + 0 + 0 + 0 + + + 12874 + 50000 + 0 + 0 + 0 + + + 12875 + 50000 + 0 + 0 + 0 + + + 12876 + 50000 + 0 + 0 + 0 + + + 12877 + 50000 + 0 + 0 + 0 + + + 12878 + 50000 + 0 + 0 + 0 + + + 12879 + 50000 + 0 + 0 + 0 + + + 12880 + 40000 + 0 + 0 + 0 + + + 12881 + 40000 + 0 + 0 + 0 + + + 12882 + 40000 + 0 + 0 + 0 + + + 12883 + 40000 + 0 + 0 + 0 + + + 12884 + 40000 + 0 + 0 + 0 + + + 12885 + 40000 + 0 + 0 + 0 + + + 12886 + 40000 + 0 + 0 + 0 + + + 12887 + 2000 + 0 + 0 + 0 + + + 12888 + 2000 + 0 + 0 + 0 + + + 12889 + 2000 + 0 + 0 + 0 + + + 12890 + 2000 + 0 + 0 + 0 + + + 12891 + 2000 + 0 + 0 + 0 + + + 12892 + 2000 + 0 + 0 + 0 + + + 12893 + 2000 + 0 + 0 + 0 + + + 12894 + 6000 + 0 + 0 + 0 + + + 12895 + 6000 + 0 + 0 + 0 + + + 12896 + 6000 + 0 + 0 + 0 + + + 12897 + 6000 + 0 + 0 + 0 + + + 12898 + 6000 + 0 + 0 + 0 + + + 12899 + 6000 + 0 + 0 + 0 + + + 12900 + 6000 + 0 + 0 + 0 + + + 12901 + 5000 + 0 + 0 + 0 + + + 12902 + 5000 + 0 + 0 + 0 + + + 12903 + 5000 + 0 + 0 + 0 + + + 12904 + 5000 + 0 + 0 + 0 + + + 12905 + 5000 + 0 + 0 + 0 + + + 12906 + 5000 + 0 + 0 + 0 + + + 12907 + 5000 + 0 + 0 + 0 + + + 12908 + 4050 + 0 + 0 + 0 + + + 12909 + 4050 + 0 + 0 + 0 + + + 12910 + 4050 + 0 + 0 + 0 + + + 12911 + 4050 + 0 + 0 + 0 + + + 12912 + 4050 + 0 + 0 + 0 + + + 12913 + 4050 + 0 + 0 + 0 + + + 12914 + 4050 + 0 + 0 + 0 + + + 12915 + 6140 + 0 + 0 + 0 + + + 12916 + 6140 + 0 + 0 + 0 + + + 12917 + 6140 + 0 + 0 + 0 + + + 12918 + 6140 + 0 + 0 + 0 + + + 12919 + 6140 + 0 + 0 + 0 + + + 12920 + 6140 + 0 + 0 + 0 + + + 12921 + 6140 + 0 + 0 + 0 + + + 12922 + 40000 + 0 + 0 + 0 + + + 12923 + 40000 + 0 + 0 + 0 + + + 12924 + 40000 + 0 + 0 + 0 + + + 12925 + 40000 + 0 + 0 + 0 + + + 12926 + 40000 + 0 + 0 + 0 + + + 12927 + 40000 + 0 + 0 + 0 + + + 12928 + 40000 + 0 + 0 + 0 + + + 12929 + 64400 + 0 + 0 + 0 + + + 12930 + 64400 + 0 + 0 + 0 + + + 12931 + 64400 + 0 + 0 + 0 + + + 12932 + 64400 + 0 + 0 + 0 + + + 12933 + 64400 + 0 + 0 + 0 + + + 12934 + 64400 + 0 + 0 + 0 + + + 12935 + 64400 + 0 + 0 + 0 + + + 12936 + 2000 + 0 + 0 + 0 + + + 12937 + 2000 + 0 + 0 + 0 + + + 12938 + 2000 + 0 + 0 + 0 + + + 12939 + 2000 + 0 + 0 + 0 + + + 12940 + 2000 + 0 + 0 + 0 + + + 12941 + 2000 + 0 + 0 + 0 + + + 12942 + 2000 + 0 + 0 + 0 + + + 12943 + 3500 + 0 + 0 + 0 + + + 12944 + 3500 + 0 + 0 + 0 + + + 12945 + 3500 + 0 + 0 + 0 + + + 12946 + 3500 + 0 + 0 + 0 + + + 12947 + 3500 + 0 + 0 + 0 + + + 12948 + 3500 + 0 + 0 + 0 + + + 12949 + 3500 + 0 + 0 + 0 + + + 12950 + 3500 + 0 + 0 + 0 + + + 12951 + 3500 + 0 + 0 + 0 + + + 12952 + 3500 + 0 + 0 + 0 + + + 12953 + 3500 + 0 + 0 + 0 + + + 12954 + 3500 + 0 + 0 + 0 + + + 12955 + 3500 + 0 + 0 + 0 + + + 12956 + 3500 + 0 + 0 + 0 + + + 12957 + 5500 + 0 + 0 + 0 + + + 12958 + 5500 + 0 + 0 + 0 + + + 12959 + 5500 + 0 + 0 + 0 + + + 12960 + 5500 + 0 + 0 + 0 + + + 12961 + 5500 + 0 + 0 + 0 + + + 12962 + 5500 + 0 + 0 + 0 + + + 12963 + 5500 + 0 + 0 + 0 + + + 12964 + 1000 + 0 + 0 + 0 + + + 12965 + 1000 + 0 + 0 + 0 + + + 12966 + 1000 + 0 + 0 + 0 + + + 12967 + 1000 + 0 + 0 + 0 + + + 12968 + 1000 + 0 + 0 + 0 + + + 12969 + 1000 + 0 + 0 + 0 + + + 12970 + 1000 + 0 + 0 + 0 + + + 12971 + 3000 + 0 + 0 + 0 + + + 12972 + 3000 + 0 + 0 + 0 + + + 12973 + 3000 + 0 + 0 + 0 + + + 12974 + 3000 + 0 + 0 + 0 + + + 12975 + 3000 + 0 + 0 + 0 + + + 12976 + 3000 + 0 + 0 + 0 + + + 12977 + 3000 + 0 + 0 + 0 + + + 12978 + 2500 + 0 + 0 + 0 + + + 12979 + 2500 + 0 + 0 + 0 + + + 12980 + 2500 + 0 + 0 + 0 + + + 12981 + 2500 + 0 + 0 + 0 + + + 12982 + 2500 + 0 + 0 + 0 + + + 12983 + 2500 + 0 + 0 + 0 + + + 12984 + 2500 + 0 + 0 + 0 + + + 12985 + 100 + 0 + 0 + 0 + + + 12986 + 100 + 0 + 0 + 0 + + + 12987 + 100 + 0 + 0 + 0 + + + 12988 + 300 + 0 + 0 + 0 + + + 12989 + 300 + 0 + 0 + 0 + + + 12990 + 300 + 0 + 0 + 0 + + + 12991 + 1000 + 0 + 0 + 0 + + + 12992 + 1000 + 0 + 0 + 0 + + + 12993 + 1000 + 0 + 0 + 0 + + + 12994 + 2000 + 0 + 0 + 0 + + + 12995 + 2000 + 0 + 0 + 0 + + + 12996 + 2000 + 0 + 0 + 0 + + + 12997 + 3000 + 0 + 0 + 0 + + + 12998 + 3000 + 0 + 0 + 0 + + + 12999 + 3000 + 0 + 0 + 0 + + + 13000 + 5000 + 0 + 0 + 0 + + + 13001 + 5000 + 0 + 0 + 0 + + + 13002 + 5000 + 0 + 0 + 0 + + + 13003 + 7500 + 0 + 0 + 0 + + + 13004 + 7500 + 0 + 0 + 0 + + + 13005 + 7500 + 0 + 0 + 0 + + + 13006 + 50000 + 0 + 0 + 0 + + + 13007 + 50000 + 0 + 0 + 0 + + + 13008 + 50000 + 0 + 0 + 0 + + + 13009 + 1 + 0 + 0 + 0 + + + 13010 + 1 + 0 + 0 + 0 + + + 13011 + 100 + 0 + 0 + 0 + + + 13012 + 1 + 0 + 0 + 0 + + + 13013 + 100 + 0 + 0 + 0 + + + 13014 + 1 + 0 + 0 + 0 + + + 13015 + 100 + 0 + 0 + 0 + + + 13016 + 1 + 0 + 0 + 0 + + + 13017 + 100 + 0 + 0 + 0 + + + 13018 + 1 + 0 + 0 + 0 + + + 13019 + 100 + 0 + 0 + 0 + + + 13020 + 1 + 0 + 0 + 0 + + + 13021 + 100 + 0 + 0 + 0 + + + 13022 + 1 + 0 + 0 + 0 + + + 13023 + 100 + 0 + 0 + 0 + + + 13024 + 1 + 0 + 0 + 0 + + + 13025 + 100 + 0 + 0 + 0 + + + 13026 + 1 + 0 + 0 + 0 + + + 13027 + 100 + 0 + 0 + 0 + + + 13028 + 1 + 0 + 0 + 0 + + + 13029 + 100 + 0 + 0 + 0 + + + 13030 + 1 + 0 + 0 + 0 + + + 13031 + 100 + 0 + 0 + 0 + + + 13032 + 1 + 0 + 0 + 0 + + + 13033 + 100 + 0 + 0 + 0 + + + 13034 + 1 + 0 + 0 + 0 + + + 13035 + 100 + 0 + 0 + 0 + + + 13036 + 1 + 0 + 0 + 0 + + + 13037 + 50 + 0 + 0 + 0 + + + 13038 + 1 + 0 + 0 + 0 + + + 13039 + 50 + 0 + 0 + 0 + + + 13040 + 1 + 0 + 0 + 0 + + + 13041 + 1 + 0 + 0 + 0 + + + 13042 + 1 + 0 + 0 + 0 + + + 13043 + 50 + 0 + 0 + 0 + + + 13044 + 1 + 0 + 0 + 0 + + + 13045 + 50 + 0 + 0 + 0 + + + 13046 + 1 + 0 + 0 + 0 + + + 13047 + 50 + 0 + 0 + 0 + + + 13048 + 1 + 0 + 0 + 0 + + + 13049 + 1 + 0 + 0 + 0 + + + 13050 + 1 + 0 + 0 + 0 + + + 13051 + 1 + 0 + 0 + 0 + + + 13052 + 50 + 0 + 0 + 0 + + + 13053 + 1 + 0 + 0 + 0 + + + 13054 + 50 + 0 + 0 + 0 + + + 13055 + 1 + 0 + 0 + 0 + + + 13056 + 1 + 0 + 0 + 0 + + + 13057 + 50 + 0 + 0 + 0 + + + 13058 + 1 + 0 + 0 + 0 + + + 13059 + 50 + 0 + 0 + 0 + + + 13060 + 1 + 0 + 0 + 0 + + + 13061 + 1 + 0 + 0 + 0 + + + 13062 + 50 + 0 + 0 + 0 + + + 13063 + 1 + 0 + 0 + 0 + + + 13064 + 50 + 0 + 0 + 0 + + + 13065 + 1 + 0 + 0 + 0 + + + 13066 + 50 + 0 + 0 + 0 + + + 13067 + 1 + 0 + 0 + 0 + + + 13068 + 1 + 0 + 0 + 0 + + + 13069 + 1 + 0 + 0 + 0 + + + 13070 + 1 + 0 + 0 + 0 + + + 13071 + 1 + 0 + 0 + 0 + + + 13072 + 1 + 0 + 0 + 0 + + + 13073 + 1 + 0 + 0 + 0 + + + 13074 + 1 + 0 + 0 + 0 + + + 13075 + 1 + 0 + 0 + 0 + + + 13076 + 1 + 0 + 0 + 0 + + + 13077 + 50 + 0 + 0 + 0 + + + 13078 + 1 + 0 + 0 + 0 + + + 13079 + 1 + 0 + 0 + 0 + + + 13080 + 1 + 0 + 0 + 0 + + + 13081 + 800 + 0 + 0 + 0 + + + 13082 + 800 + 0 + 0 + 0 + + + 13083 + 14 + 0 + 0 + 0 + + + 13084 + 14 + 0 + 0 + 0 + + + 13085 + 14 + 0 + 0 + 0 + + + 13086 + 14 + 0 + 0 + 0 + + + 13087 + 1 + 0 + 0 + 0 + + + 13088 + 1 + 0 + 0 + 0 + + + 13089 + 1 + 0 + 0 + 0 + + + 13090 + 1 + 0 + 0 + 0 + + + 13091 + 1 + 0 + 0 + 0 + + + 13092 + 1 + 0 + 0 + 0 + + + 13093 + 1 + 0 + 0 + 0 + + + 13094 + 1 + 0 + 0 + 0 + + + 13095 + 432 + 0 + 0 + 0 + + + 13096 + 432 + 0 + 0 + 0 + + + 13097 + 1440 + 0 + 0 + 0 + + + 13098 + 1440 + 0 + 0 + 0 + + + 13099 + 14400 + 0 + 0 + 0 + + + 13100 + 14400 + 0 + 0 + 0 + + + 13101 + 200 + 0 + 0 + 0 + + + 13102 + 200 + 0 + 0 + 0 + + + 13103 + 250 + 0 + 0 + 0 + + + 13104 + 250 + 0 + 0 + 0 + + + 13105 + 1000 + 0 + 0 + 0 + + + 13106 + 1000 + 0 + 0 + 0 + + + 13107 + 800 + 0 + 0 + 0 + + + 13108 + 800 + 0 + 0 + 0 + + + 13109 + 800 + 0 + 0 + 0 + + + 13110 + 800 + 0 + 0 + 0 + + + 13111 + 800 + 0 + 0 + 0 + + + 13112 + 800 + 0 + 0 + 0 + + + 13113 + 800 + 0 + 0 + 0 + + + 13114 + 800 + 0 + 0 + 0 + + + 13115 + 800 + 0 + 0 + 0 + + + 13116 + 800 + 0 + 0 + 0 + + + 13117 + 1000 + 0 + 0 + 0 + + + 13118 + 1000 + 0 + 0 + 0 + + + 13119 + 1000 + 0 + 0 + 0 + + + 13120 + 1000 + 0 + 0 + 0 + + + 13121 + 1000 + 0 + 0 + 0 + + + 13122 + 1000 + 0 + 0 + 0 + + + 13123 + 1000 + 0 + 0 + 0 + + + 13124 + 1000 + 0 + 0 + 0 + + + 13125 + 1000 + 0 + 0 + 0 + + + 13126 + 1000 + 0 + 0 + 0 + + + 13127 + 1000 + 0 + 0 + 0 + + + 13128 + 1000 + 0 + 0 + 0 + + + 13129 + 1000 + 0 + 0 + 0 + + + 13130 + 1000 + 0 + 0 + 0 + + + 13131 + 1000 + 0 + 0 + 0 + + + 13132 + 1000 + 0 + 0 + 0 + + + 13133 + 1000 + 0 + 0 + 0 + + + 13134 + 1000 + 0 + 0 + 0 + + + 13135 + 1000 + 0 + 0 + 0 + + + 13136 + 1000 + 0 + 0 + 0 + + + 13137 + 1000 + 0 + 0 + 0 + + + 13138 + 1000 + 0 + 0 + 0 + + + 13139 + 1000 + 0 + 0 + 0 + + + 13140 + 1000 + 0 + 0 + 0 + + + 13141 + 1000 + 0 + 0 + 0 + + + 13142 + 1000 + 0 + 0 + 0 + + + 13143 + 1000 + 0 + 0 + 0 + + + 13144 + 1000 + 0 + 0 + 0 + + + 13145 + 1000 + 0 + 0 + 0 + + + 13146 + 1000 + 0 + 0 + 0 + + + 13147 + 1 + 0 + 0 + 0 + + + 13148 + 3 + 0 + 0 + 0 + + + 13149 + 3 + 0 + 0 + 0 + + + 13150 + 1 + 0 + 0 + 0 + + + 13151 + 3 + 0 + 0 + 0 + + + 13152 + 3 + 0 + 0 + 0 + + + 13153 + 3 + 0 + 0 + 0 + + + 13154 + 3 + 0 + 0 + 0 + + + 13155 + 3 + 0 + 0 + 0 + + + 13156 + 3 + 0 + 0 + 0 + + + 13157 + 3 + 0 + 0 + 0 + + + 13158 + 3 + 0 + 0 + 0 + + + 13159 + 3 + 0 + 0 + 0 + + + 13160 + 1 + 0 + 0 + 0 + + + 13161 + 1 + 0 + 0 + 0 + + + 13162 + 1 + 0 + 0 + 0 + + + 13163 + 432 + 0 + 0 + 0 + + + 13164 + 1440 + 0 + 0 + 0 + + + 13165 + 14400 + 0 + 0 + 0 + + + 13166 + 200 + 0 + 0 + 0 + + + 13167 + 250 + 0 + 0 + 0 + + + 13168 + 1000 + 0 + 0 + 0 + + + 13169 + 800 + 0 + 0 + 0 + + + 13170 + 800 + 0 + 0 + 0 + + + 13171 + 800 + 0 + 0 + 0 + + + 13172 + 800 + 0 + 0 + 0 + + + 13173 + 800 + 0 + 0 + 0 + + + 13174 + 1 + 0 + 0 + 0 + + + 13175 + 1 + 0 + 0 + 0 + + + 13176 + 1 + 0 + 0 + 0 + + + 13177 + 1 + 0 + 0 + 0 + + + 13178 + 1 + 0 + 0 + 0 + + + 13179 + 1 + 0 + 0 + 0 + + + 13180 + 1 + 0 + 0 + 0 + + + 13181 + 1 + 0 + 0 + 0 + + + 13182 + 1 + 0 + 0 + 0 + + + 13183 + 1 + 0 + 0 + 0 + + + 13184 + 1 + 0 + 0 + 0 + + + 13185 + 1 + 0 + 0 + 0 + + + 13186 + 1 + 0 + 0 + 0 + + + 13187 + 1 + 0 + 0 + 0 + + + 13188 + 1 + 0 + 0 + 0 + + + 13189 + 1 + 0 + 0 + 0 + + + 13190 + 1 + 0 + 0 + 0 + + + 13191 + 1 + 0 + 0 + 0 + + + 13192 + 1 + 0 + 0 + 0 + + + 13193 + 1 + 0 + 0 + 0 + + + 13194 + 1 + 0 + 0 + 0 + + + 13195 + 1 + 0 + 0 + 0 + + + 13196 + 1 + 0 + 0 + 0 + + + 13197 + 1 + 0 + 0 + 0 + + + 13198 + 1 + 0 + 0 + 0 + + + 13199 + 1 + 0 + 0 + 0 + + + 13200 + 1 + 0 + 0 + 0 + + + 13201 + 1 + 0 + 0 + 0 + + + 13202 + 1 + 0 + 0 + 0 + + + 13203 + 1 + 0 + 0 + 0 + + + 13204 + 1 + 0 + 0 + 0 + + + 13205 + 1 + 0 + 0 + 0 + + + 13206 + 1 + 0 + 0 + 0 + + + 13207 + 1 + 0 + 0 + 0 + + + 13208 + 1 + 0 + 0 + 0 + + + 13209 + 1 + 0 + 0 + 0 + + + 13210 + 1 + 0 + 0 + 0 + + + 13211 + 1 + 0 + 0 + 0 + + + 13212 + 1 + 0 + 0 + 0 + + + 13213 + 1 + 0 + 0 + 0 + + + 13214 + 1 + 0 + 0 + 0 + + + 13215 + 1 + 0 + 0 + 0 + + + 13216 + 1 + 0 + 0 + 0 + + + 13217 + 1 + 0 + 0 + 0 + + + 13218 + 1 + 0 + 0 + 0 + + + 13219 + 1 + 0 + 0 + 0 + + + 13220 + 1 + 0 + 0 + 0 + + + 13221 + 1 + 0 + 0 + 0 + + + 13222 + 1 + 0 + 0 + 0 + + + 13223 + 1 + 0 + 0 + 0 + + + 13224 + 1 + 0 + 0 + 0 + + + 13225 + 1 + 0 + 0 + 0 + + + 13226 + 1 + 0 + 0 + 0 + + + 13227 + 1 + 0 + 0 + 0 + + + 13228 + 1 + 0 + 0 + 0 + + + 13229 + 1 + 0 + 0 + 0 + + + 13230 + 1 + 0 + 0 + 0 + + + 13231 + 1 + 0 + 0 + 0 + + + 13232 + 1 + 0 + 0 + 0 + + + 13233 + 1 + 0 + 0 + 0 + + + 13234 + 1 + 0 + 0 + 0 + + + 13235 + 1 + 0 + 0 + 0 + + + 13236 + 3 + 0 + 0 + 0 + + + 13237 + 1 + 0 + 0 + 0 + + + 13238 + 1 + 0 + 0 + 0 + + + 13239 + 1 + 0 + 0 + 0 + + + 13240 + 1 + 0 + 0 + 0 + + + 13241 + 1 + 0 + 0 + 0 + + + 13242 + 1 + 0 + 0 + 0 + + + 13243 + 1 + 0 + 0 + 0 + + + 13244 + 1 + 0 + 0 + 0 + + + 13245 + 1 + 0 + 0 + 0 + + + 13246 + 1 + 0 + 0 + 0 + + + 13247 + 1 + 0 + 0 + 0 + + + 13248 + 1 + 0 + 0 + 0 + + + 13249 + 1 + 0 + 0 + 0 + + + 13250 + 1 + 0 + 0 + 0 + + + 13251 + 1 + 0 + 0 + 0 + + + 13252 + 1 + 0 + 0 + 0 + + + 13253 + 1 + 0 + 0 + 0 + + + 13254 + 1 + 0 + 0 + 0 + + + 13255 + 1 + 0 + 0 + 0 + + + 13256 + 1 + 0 + 0 + 0 + + + 13257 + 1 + 0 + 0 + 0 + + + 13258 + 1 + 0 + 0 + 0 + + + 13259 + 1 + 0 + 0 + 0 + + + 13260 + 1 + 0 + 0 + 0 + + + 13261 + 1 + 0 + 0 + 0 + + + 13262 + 1 + 0 + 0 + 0 + + + 13263 + 650 + 0 + 0 + 0 + + + 13264 + 1 + 0 + 0 + 0 + + + 13265 + 1 + 0 + 0 + 0 + + + 13266 + 1 + 0 + 0 + 0 + + + 13267 + 1 + 0 + 0 + 0 + + + 13268 + 3 + 0 + 0 + 0 + + + 13269 + 3 + 0 + 0 + 0 + + + 13270 + 3 + 0 + 0 + 0 + + + 13271 + 3 + 0 + 0 + 0 + + + 13272 + 3 + 0 + 0 + 0 + + + 13273 + 3 + 0 + 0 + 0 + + + 13274 + 3 + 0 + 0 + 0 + + + 13275 + 3 + 0 + 0 + 0 + + + 13276 + 1 + 0 + 0 + 0 + + + 13277 + 400 + 0 + 0 + 0 + + + 13278 + 50 + 0 + 0 + 0 + + + 13279 + 50 + 0 + 0 + 0 + + + 13280 + 50 + 0 + 0 + 0 + + + 13281 + 150 + 0 + 0 + 0 + + + 13282 + 150 + 0 + 0 + 0 + + + 13283 + 150 + 0 + 0 + 0 + + + 13284 + 150 + 0 + 0 + 0 + + + 13285 + 150 + 0 + 0 + 0 + + + 13286 + 150 + 0 + 0 + 0 + + + 13287 + 150 + 0 + 0 + 0 + + + 13288 + 150 + 0 + 0 + 0 + + + 13289 + 3 + 0 + 0 + 0 + + + 13290 + 68000 + 0 + 0 + 0 + + + 13291 + 68000 + 0 + 0 + 0 + + + 13292 + 1 + 0 + 0 + 0 + + + 13293 + 1 + 0 + 0 + 0 + + + 13294 + 1 + 0 + 0 + 0 + + + 13295 + 1 + 0 + 0 + 0 + + + 13296 + 1 + 0 + 0 + 0 + + + 13297 + 1 + 0 + 0 + 0 + + + 13298 + 1 + 0 + 0 + 0 + + + 13299 + 1 + 0 + 0 + 0 + + + 13300 + 1 + 0 + 0 + 0 + + + 13301 + 1 + 0 + 0 + 0 + + + 13302 + 1 + 0 + 0 + 0 + + + 13303 + 1 + 0 + 0 + 0 + + + 13304 + 1 + 0 + 0 + 0 + + + 13305 + 1 + 0 + 0 + 0 + + + 13306 + 1 + 0 + 0 + 0 + + + 13307 + 1 + 0 + 0 + 0 + + + 13308 + 1 + 0 + 0 + 0 + + + 13309 + 1 + 0 + 0 + 0 + + + 13310 + 1 + 0 + 0 + 0 + + + 13311 + 1 + 0 + 0 + 0 + + + 13312 + 1 + 0 + 0 + 0 + + + 13313 + 1 + 0 + 0 + 0 + + + 13314 + 1 + 0 + 0 + 0 + + + 13315 + 1 + 0 + 0 + 0 + + + 13316 + 1 + 0 + 0 + 0 + + + 13317 + 1 + 0 + 0 + 0 + + + 13318 + 1 + 0 + 0 + 0 + + + 13319 + 1 + 0 + 0 + 0 + + + 13320 + 1 + 0 + 0 + 0 + + + 13321 + 1 + 0 + 0 + 0 + + + 13322 + 1 + 0 + 0 + 0 + + + 13323 + 1 + 0 + 0 + 0 + + + 13324 + 1 + 0 + 0 + 0 + + + 13325 + 1 + 0 + 0 + 0 + + + 13326 + 1 + 0 + 0 + 0 + + + 13327 + 1 + 0 + 0 + 0 + + + 13328 + 1 + 0 + 0 + 0 + + + 13329 + 1 + 0 + 0 + 0 + + + 13330 + 1 + 0 + 0 + 0 + + + 13331 + 1 + 0 + 0 + 0 + + + 13332 + 1 + 0 + 0 + 0 + + + 13333 + 1 + 0 + 0 + 0 + + + 13334 + 1 + 0 + 0 + 0 + + + 13335 + 1 + 0 + 0 + 0 + + + 13336 + 1 + 0 + 0 + 0 + + + 13337 + 50 + 0 + 0 + 0 + + + 13338 + 50 + 0 + 0 + 0 + + + 13339 + 100 + 0 + 0 + 0 + + + 13340 + 100 + 0 + 0 + 0 + + + 13341 + 100 + 0 + 0 + 0 + + + 13342 + 100 + 0 + 0 + 0 + + + 13343 + 100 + 0 + 0 + 0 + + + 13344 + 100 + 0 + 0 + 0 + + + 13345 + 100 + 0 + 0 + 0 + + + 13346 + 100 + 0 + 0 + 0 + + + 13347 + 100 + 0 + 0 + 0 + + + 13348 + 100 + 0 + 0 + 0 + + + 13349 + 100 + 0 + 0 + 0 + + + 13350 + 100 + 0 + 0 + 0 + + + 13351 + 100 + 0 + 0 + 0 + + + 13352 + 100 + 0 + 0 + 0 + + + 13353 + 100 + 0 + 0 + 0 + + + 13354 + 100 + 0 + 0 + 0 + + + 13355 + 100 + 0 + 0 + 0 + + + 13356 + 100 + 0 + 0 + 0 + + + 13357 + 100 + 0 + 0 + 0 + + + 13358 + 300 + 0 + 0 + 0 + + + 13359 + 300 + 0 + 0 + 0 + + + 13360 + 300 + 0 + 0 + 0 + + + 13361 + 300 + 0 + 0 + 0 + + + 13362 + 300 + 0 + 0 + 0 + + + 13363 + 300 + 0 + 0 + 0 + + + 13364 + 350 + 0 + 0 + 0 + + + 13365 + 350 + 0 + 0 + 0 + + + 13366 + 350 + 0 + 0 + 0 + + + 13367 + 350 + 0 + 0 + 0 + + + 13368 + 350 + 0 + 0 + 0 + + + 13369 + 350 + 0 + 0 + 0 + + + 13370 + 100 + 0 + 0 + 0 + + + 13371 + 100 + 0 + 0 + 0 + + + 13372 + 100 + 0 + 0 + 0 + + + 13373 + 100 + 0 + 0 + 0 + + + 13374 + 100 + 0 + 0 + 0 + + + 13375 + 100 + 0 + 0 + 0 + + + 13376 + 100 + 0 + 0 + 0 + + + 13377 + 100 + 0 + 0 + 0 + + + 13378 + 100 + 0 + 0 + 0 + + + 13379 + 1 + 0 + 0 + 0 + + + 13380 + 1 + 0 + 0 + 0 + + + 13381 + 1 + 0 + 0 + 0 + + + 13382 + 1 + 0 + 0 + 0 + + + 13383 + 1 + 0 + 0 + 0 + + + 13384 + 1 + 0 + 0 + 0 + + + 13385 + 1 + 0 + 0 + 0 + + + 13386 + 1 + 0 + 0 + 0 + + + 13387 + 1 + 0 + 0 + 0 + + + 13388 + 1 + 0 + 0 + 0 + + + 13389 + 1 + 0 + 0 + 0 + + + 13390 + 1 + 0 + 0 + 0 + + + 13391 + 1 + 0 + 0 + 0 + + + 13392 + 1 + 0 + 0 + 0 + + + 13393 + 1 + 0 + 0 + 0 + + + 13394 + 1 + 0 + 0 + 0 + + + 13395 + 1 + 0 + 0 + 0 + + + 13396 + 1 + 0 + 0 + 0 + + + 13397 + 1 + 0 + 0 + 0 + + + 13398 + 1 + 0 + 0 + 0 + + + 13399 + 1 + 0 + 0 + 0 + + + 13400 + 1 + 0 + 0 + 0 + + + 13401 + 1 + 0 + 0 + 0 + + + 13402 + 1 + 0 + 0 + 0 + + + 13403 + 300 + 0 + 0 + 0 + + + 13404 + 1 + 0 + 0 + 0 + + + 13405 + 1 + 0 + 0 + 0 + + + 13406 + 1 + 0 + 0 + 0 + + + 13407 + 1 + 0 + 0 + 0 + + + 13408 + 1 + 0 + 0 + 0 + + + 13409 + 1 + 0 + 0 + 0 + + + 13410 + 1 + 0 + 0 + 0 + + + 13411 + 1 + 0 + 0 + 0 + + + 13412 + 1 + 0 + 0 + 0 + + + 13413 + 1 + 0 + 0 + 0 + + + 13414 + 1 + 0 + 0 + 0 + + + 13415 + 1 + 0 + 0 + 0 + + + 13416 + 1 + 0 + 0 + 0 + + + 13417 + 1 + 0 + 0 + 0 + + + 13418 + 1 + 0 + 0 + 0 + + + 13419 + 1 + 0 + 0 + 0 + + + 13420 + 1 + 0 + 0 + 0 + + + 13421 + 1 + 0 + 0 + 0 + + + 13422 + 1 + 0 + 0 + 0 + + + 13423 + 1 + 0 + 0 + 0 + + + 13424 + 1 + 0 + 0 + 0 + + + 13425 + 1 + 0 + 0 + 0 + + + 13426 + 1 + 0 + 0 + 0 + + + 13427 + 1 + 0 + 0 + 0 + + + 13428 + 1 + 0 + 0 + 0 + + + 13429 + 1 + 0 + 0 + 0 + + + 13430 + 1 + 0 + 0 + 0 + + + 13431 + 20 + 0 + 0 + 0 + + + 13432 + 20 + 0 + 0 + 0 + + + 13433 + 5 + 0 + 0 + 0 + + + 13434 + 5 + 0 + 0 + 0 + + + 13435 + 5 + 0 + 0 + 0 + + + 13436 + 5 + 0 + 0 + 0 + + + 13437 + 1 + 0 + 0 + 0 + + + 13438 + 1 + 0 + 0 + 0 + + + 13439 + 1 + 0 + 0 + 0 + + + 13440 + 1 + 0 + 0 + 0 + + + 13441 + 1 + 0 + 0 + 0 + + + 13442 + 1 + 0 + 0 + 0 + + + 13443 + 1 + 0 + 0 + 0 + + + 13444 + 1 + 0 + 0 + 0 + + + 13445 + 1 + 0 + 0 + 0 + + + 13446 + 1 + 0 + 0 + 0 + + + 13447 + 1 + 0 + 0 + 0 + + + 13448 + 1 + 0 + 0 + 0 + + + 13449 + 1 + 0 + 0 + 0 + + + 13450 + 1 + 0 + 0 + 0 + + + 13451 + 1 + 0 + 0 + 0 + + + 13452 + 1 + 0 + 0 + 0 + + + 13453 + 1 + 0 + 0 + 0 + + + 13454 + 1 + 0 + 0 + 0 + + + 13455 + 1 + 0 + 0 + 0 + + + 13456 + 1 + 0 + 0 + 0 + + + 13457 + 1 + 0 + 0 + 0 + + + 13458 + 1 + 0 + 0 + 0 + + + 13459 + 1 + 0 + 0 + 0 + + + 13460 + 1 + 0 + 0 + 0 + + + 13461 + 1 + 0 + 0 + 0 + + + 13462 + 1 + 0 + 0 + 0 + + + 13463 + 1 + 0 + 0 + 0 + + + 13464 + 1 + 0 + 0 + 0 + + + 13465 + 1 + 0 + 0 + 0 + + + 13466 + 1 + 0 + 0 + 0 + + + 13467 + 1 + 0 + 0 + 0 + + + 13468 + 1 + 0 + 0 + 0 + + + 13469 + 1 + 0 + 0 + 0 + + + 13470 + 1 + 0 + 0 + 0 + + + 13471 + 1 + 0 + 0 + 0 + + + 13472 + 1 + 0 + 0 + 0 + + + 13473 + 1 + 0 + 0 + 0 + + + 13474 + 1 + 0 + 0 + 0 + + + 13475 + 1 + 0 + 0 + 0 + + + 13476 + 1 + 0 + 0 + 0 + + + 13477 + 1 + 0 + 0 + 0 + + + 13478 + 1 + 0 + 0 + 0 + + + 13479 + 1 + 0 + 0 + 0 + + + 13480 + 1 + 0 + 0 + 0 + + + 13481 + 1 + 0 + 0 + 0 + + + 13482 + 1 + 0 + 0 + 0 + + + 13483 + 1 + 0 + 0 + 0 + + + 13484 + 1 + 0 + 0 + 0 + + + 13485 + 1 + 0 + 0 + 0 + + + 13486 + 1 + 0 + 0 + 0 + + + 13487 + 1 + 0 + 0 + 0 + + + 13488 + 1 + 0 + 0 + 0 + + + 13489 + 1 + 0 + 0 + 0 + + + 13490 + 1 + 0 + 0 + 0 + + + 13491 + 1 + 0 + 0 + 0 + + + 13492 + 1 + 0 + 0 + 0 + + + 13493 + 1 + 0 + 0 + 0 + + + 13494 + 1 + 0 + 0 + 0 + + + 13495 + 1 + 0 + 0 + 0 + + + 13496 + 1 + 0 + 0 + 0 + + + 13497 + 1 + 0 + 0 + 0 + + + 13498 + 1 + 0 + 0 + 0 + + + 13499 + 1 + 0 + 0 + 0 + + + 13500 + 1 + 0 + 0 + 0 + + + 13501 + 1 + 0 + 0 + 0 + + + 13502 + 1 + 0 + 0 + 0 + + + 13503 + 1 + 0 + 0 + 0 + + + 13504 + 1 + 0 + 0 + 0 + + + 13505 + 1 + 0 + 0 + 0 + + + 13506 + 1 + 0 + 0 + 0 + + + 13507 + 1 + 0 + 0 + 0 + + + 13508 + 1 + 0 + 0 + 0 + + + 13509 + 1 + 0 + 0 + 0 + + + 13510 + 1 + 0 + 0 + 0 + + + 13511 + 1 + 0 + 0 + 0 + + + 13512 + 1 + 0 + 0 + 0 + + + 13513 + 1 + 0 + 0 + 0 + + + 13514 + 1 + 0 + 0 + 0 + + + 13515 + 1 + 0 + 0 + 0 + + + 13516 + 1 + 0 + 0 + 0 + + + 13517 + 1 + 0 + 0 + 0 + + + 13518 + 1 + 0 + 0 + 0 + + + 13519 + 1 + 0 + 0 + 0 + + + 13520 + 1 + 0 + 0 + 0 + + + 13521 + 1 + 0 + 0 + 0 + + + 13522 + 1 + 0 + 0 + 0 + + + 13523 + 1 + 0 + 0 + 0 + + + 13524 + 1 + 0 + 0 + 0 + + + 13525 + 1 + 0 + 0 + 0 + + + 13526 + 1 + 0 + 0 + 0 + + + 13527 + 1 + 0 + 0 + 0 + + + 13528 + 1 + 0 + 0 + 0 + + + 13529 + 1 + 0 + 0 + 0 + + + 13530 + 1 + 0 + 0 + 0 + + + 13531 + 1 + 0 + 0 + 0 + + + 13532 + 1 + 0 + 0 + 0 + + + 13533 + 1 + 0 + 0 + 0 + + + 13534 + 1 + 0 + 0 + 0 + + + 13535 + 1 + 0 + 0 + 0 + + + 13536 + 1 + 0 + 0 + 0 + + + 13537 + 1 + 0 + 0 + 0 + + + 13538 + 1 + 0 + 0 + 0 + + + 13539 + 1 + 0 + 0 + 0 + + + 13540 + 1 + 0 + 0 + 0 + + + 13541 + 1 + 0 + 0 + 0 + + + 13542 + 1 + 0 + 0 + 0 + + + 13543 + 1 + 0 + 0 + 0 + + + 13544 + 1 + 0 + 0 + 0 + + + 13545 + 1 + 0 + 0 + 0 + + + 13546 + 1 + 0 + 0 + 0 + + + 13547 + 1 + 0 + 0 + 0 + + + 13548 + 1 + 0 + 0 + 0 + + + 13549 + 1 + 0 + 0 + 0 + + + 13550 + 1 + 0 + 0 + 0 + + + 13551 + 1 + 0 + 0 + 0 + + + 13552 + 1 + 0 + 0 + 0 + + + 13553 + 1 + 0 + 0 + 0 + + + 13554 + 1 + 0 + 0 + 0 + + + 13555 + 1 + 0 + 0 + 0 + + + 13556 + 1 + 0 + 0 + 0 + + + 13557 + 1 + 0 + 0 + 0 + + + 13558 + 1 + 0 + 0 + 0 + + + 13559 + 1 + 0 + 0 + 0 + + + 13560 + 350 + 0 + 0 + 0 + + + 13561 + 350 + 0 + 0 + 0 + + + 13562 + 350 + 0 + 0 + 0 + + + 13563 + 38 + 0 + 0 + 0 + + + 13564 + 38 + 0 + 0 + 0 + + + 13565 + 1 + 0 + 0 + 0 + + + 13566 + 1 + 0 + 0 + 0 + + + 13567 + 1 + 0 + 0 + 0 + + + 13568 + 1 + 0 + 0 + 0 + + + 13569 + 1 + 0 + 0 + 0 + + + 13570 + 1 + 0 + 0 + 0 + + + 13571 + 1 + 0 + 0 + 0 + + + 13572 + 1 + 0 + 0 + 0 + + + 13573 + 1 + 0 + 0 + 0 + + + 13574 + 1 + 0 + 0 + 0 + + + 13575 + 1 + 0 + 0 + 0 + + + 13576 + 1 + 0 + 0 + 0 + + + 13577 + 1 + 0 + 0 + 0 + + + 13578 + 1 + 0 + 0 + 0 + + + 13579 + 1 + 0 + 0 + 0 + + + 13580 + 1 + 0 + 0 + 0 + + + 13581 + 1 + 0 + 0 + 0 + + + 13582 + 1 + 0 + 0 + 0 + + + 13583 + 1 + 0 + 0 + 0 + + + 13584 + 1 + 0 + 0 + 0 + + + 13585 + 1 + 0 + 0 + 0 + + + 13586 + 1 + 0 + 0 + 0 + + + 13587 + 4 + 0 + 0 + 0 + + + 13588 + 1 + 0 + 0 + 0 + + + 13589 + 2 + 0 + 0 + 0 + + + 13590 + 1 + 0 + 0 + 0 + + + 13591 + 1 + 0 + 0 + 0 + + + 13592 + 1 + 0 + 0 + 0 + + + 13593 + 1 + 0 + 0 + 0 + + + 13594 + 1 + 0 + 0 + 0 + + + 13595 + 1 + 0 + 0 + 0 + + + 13596 + 1 + 0 + 0 + 0 + + + 13597 + 1 + 0 + 0 + 0 + + + 13598 + 100 + 0 + 0 + 0 + + + 13599 + 100 + 0 + 0 + 0 + + + 13600 + 100 + 0 + 0 + 0 + + + 13601 + 100 + 0 + 0 + 0 + + + 13602 + 100 + 0 + 0 + 0 + + + 13603 + 100 + 0 + 0 + 0 + + + 13604 + 100 + 0 + 0 + 0 + + + 13605 + 100 + 0 + 0 + 0 + + + 13606 + 100 + 0 + 0 + 0 + + + 13607 + 100 + 0 + 0 + 0 + + + 13608 + 100 + 0 + 0 + 0 + + + 13609 + 100 + 0 + 0 + 0 + + + 13610 + 100 + 0 + 0 + 0 + + + 13611 + 100 + 0 + 0 + 0 + + + 13612 + 20 + 0 + 0 + 0 + + + 13613 + 20 + 0 + 0 + 0 + + + 13614 + 75 + 0 + 0 + 0 + + + 13615 + 75 + 0 + 0 + 0 + + + 13616 + 75 + 0 + 0 + 0 + + + 13617 + 75 + 0 + 0 + 0 + + + 13618 + 75 + 0 + 0 + 0 + + + 13619 + 75 + 0 + 0 + 0 + + + 13620 + 75 + 0 + 0 + 0 + + + 13621 + 75 + 0 + 0 + 0 + + + 13622 + 75 + 0 + 0 + 0 + + + 13623 + 75 + 0 + 0 + 0 + + + 13624 + 75 + 0 + 0 + 0 + + + 13625 + 75 + 0 + 0 + 0 + + + 13626 + 75 + 0 + 0 + 0 + + + 13627 + 75 + 0 + 0 + 0 + + + 13628 + 75 + 0 + 0 + 0 + + + 13629 + 15 + 0 + 0 + 0 + + + 13630 + 1500 + 0 + 0 + 0 + + + 13631 + 1500 + 0 + 0 + 0 + + + 13632 + 1500 + 0 + 0 + 0 + + + 13633 + 1500 + 0 + 0 + 0 + + + 13634 + 1500 + 0 + 0 + 0 + + + 13635 + 1500 + 0 + 0 + 0 + + + 13636 + 1500 + 0 + 0 + 0 + + + 13637 + 1500 + 0 + 0 + 0 + + + 13638 + 1500 + 0 + 0 + 0 + + + 13639 + 1500 + 0 + 0 + 0 + + + 13640 + 1500 + 0 + 0 + 0 + + + 13641 + 1500 + 0 + 0 + 0 + + + 13642 + 1500 + 0 + 0 + 0 + + + 13643 + 20 + 0 + 0 + 0 + + + 13644 + 20 + 0 + 0 + 0 + + + 13645 + 20 + 0 + 0 + 0 + + + 13646 + 20 + 0 + 0 + 0 + + + 13647 + 20 + 0 + 0 + 0 + + + 13648 + 20 + 0 + 0 + 0 + + + 13649 + 4 + 0 + 0 + 0 + + + 13650 + 1 + 0 + 0 + 0 + + + 13651 + 1 + 0 + 0 + 0 + + + 13652 + 1 + 0 + 0 + 0 + + + 13653 + 1 + 0 + 0 + 0 + + + 13654 + 1 + 0 + 0 + 0 + + + 13655 + 100 + 0 + 0 + 0 + + + 13656 + 75 + 0 + 0 + 0 + + + 13657 + 75 + 0 + 0 + 0 + + + 13658 + 75 + 0 + 0 + 0 + + + 13659 + 100 + 0 + 0 + 0 + + + 13660 + 200 + 0 + 0 + 0 + + + 13661 + 300 + 0 + 0 + 0 + + + 13662 + 1 + 0 + 0 + 0 + + + 13663 + 10 + 0 + 0 + 0 + + + 13664 + 10 + 0 + 0 + 0 + + + 13665 + 10 + 0 + 0 + 0 + + + 13666 + 10 + 0 + 0 + 0 + + + 13667 + 10 + 0 + 0 + 0 + + + 13668 + 10 + 0 + 0 + 0 + + + 13669 + 10 + 0 + 0 + 0 + + + 13670 + 10 + 0 + 0 + 0 + + + 13671 + 10 + 0 + 0 + 0 + + + 13672 + 10 + 0 + 0 + 0 + + + 13673 + 10 + 0 + 0 + 0 + + + 13674 + 10 + 0 + 0 + 0 + + + 13675 + 10 + 0 + 0 + 0 + + + 13676 + 10 + 0 + 0 + 0 + + + 13677 + 10 + 0 + 0 + 0 + + + 13678 + 10 + 0 + 0 + 0 + + + 13679 + 10 + 0 + 0 + 0 + + + 13680 + 10 + 0 + 0 + 0 + + + 13681 + 10 + 0 + 0 + 0 + + + 13682 + 10 + 0 + 0 + 0 + + + 13683 + 10 + 0 + 0 + 0 + + + 13684 + 10 + 0 + 0 + 0 + + + 13685 + 10 + 0 + 0 + 0 + + + 13686 + 10 + 0 + 0 + 0 + + + 13687 + 10 + 0 + 0 + 0 + + + 13688 + 10 + 0 + 0 + 0 + + + 13689 + 10 + 0 + 0 + 0 + + + 13690 + 10 + 0 + 0 + 0 + + + 13691 + 10 + 0 + 0 + 0 + + + 13692 + 10 + 0 + 0 + 0 + + + 13693 + 10 + 0 + 0 + 0 + + + 13694 + 10 + 0 + 0 + 0 + + + 13695 + 10 + 0 + 0 + 0 + + + 13696 + 10 + 0 + 0 + 0 + + + 13697 + 10 + 0 + 0 + 0 + + + 13698 + 10 + 0 + 0 + 0 + + + 13699 + 10 + 0 + 0 + 0 + + + 13700 + 10 + 0 + 0 + 0 + + + 13701 + 10 + 0 + 0 + 0 + + + 13702 + 10 + 0 + 0 + 0 + + + 13703 + 10 + 0 + 0 + 0 + + + 13704 + 10 + 0 + 0 + 0 + + + 13705 + 10 + 0 + 0 + 0 + + + 13706 + 10 + 0 + 0 + 0 + + + 13707 + 1 + 0 + 0 + 0 + + + 13708 + 1 + 0 + 0 + 0 + + + 13709 + 1 + 0 + 0 + 0 + + + 13710 + 1 + 0 + 0 + 0 + + + 13711 + 1 + 0 + 0 + 0 + + + 13712 + 1 + 0 + 0 + 0 + + + 13713 + 1 + 0 + 0 + 0 + + + 13714 + 1 + 0 + 0 + 0 + + + 13715 + 1 + 0 + 0 + 0 + + + 13716 + 1 + 0 + 0 + 0 + + + 13717 + 1 + 0 + 0 + 0 + + + 13718 + 1 + 0 + 0 + 0 + + + 13719 + 50 + 0 + 0 + 0 + + + 13720 + 14 + 0 + 0 + 0 + + + 13721 + 4 + 0 + 0 + 0 + + + 13722 + 7 + 0 + 0 + 0 + + + 13723 + 100 + 0 + 0 + 0 + + + 13724 + 100 + 0 + 0 + 0 + + + 13725 + 100 + 0 + 0 + 0 + + + 13726 + 100 + 0 + 0 + 0 + + + 13727 + 50 + 0 + 0 + 0 + + + 13728 + 1 + 0 + 0 + 0 + + + 13729 + 1 + 0 + 0 + 0 + + + 13730 + 1 + 0 + 0 + 0 + + + 13731 + 1 + 0 + 0 + 0 + + + 13732 + 1 + 0 + 0 + 0 + + + 13733 + 1 + 0 + 0 + 0 + + + 13734 + 70000 + 0 + 0 + 0 + + + 13735 + 70000 + 0 + 0 + 0 + + + 13736 + 1400000 + 0 + 0 + 0 + + + 13737 + 1400000 + 0 + 0 + 0 + + + 13738 + 2000000 + 0 + 0 + 0 + + + 13739 + 2000000 + 0 + 0 + 0 + + + 13740 + 2000000 + 0 + 0 + 0 + + + 13741 + 2000000 + 0 + 0 + 0 + + + 13742 + 2000000 + 0 + 0 + 0 + + + 13743 + 2000000 + 0 + 0 + 0 + + + 13744 + 2000000 + 0 + 0 + 0 + + + 13745 + 2000000 + 0 + 0 + 0 + + + 13746 + 750000 + 0 + 0 + 0 + + + 13747 + 750000 + 0 + 0 + 0 + + + 13748 + 750000 + 0 + 0 + 0 + + + 13749 + 750000 + 0 + 0 + 0 + + + 13750 + 750000 + 0 + 0 + 0 + + + 13751 + 750000 + 0 + 0 + 0 + + + 13752 + 750000 + 0 + 0 + 0 + + + 13753 + 750000 + 0 + 0 + 0 + + + 13754 + 750000 + 0 + 0 + 0 + + + 13755 + 750000 + 0 + 0 + 0 + + + 13756 + 40 + 0 + 0 + 0 + + + 13757 + 1 + 0 + 0 + 0 + + + 13758 + 1 + 0 + 0 + 0 + + + 13759 + 1 + 0 + 0 + 0 + + + 13760 + 1 + 0 + 0 + 0 + + + 13761 + 1 + 0 + 0 + 0 + + + 13762 + 1 + 0 + 0 + 0 + + + 13763 + 1 + 0 + 0 + 0 + + + 13764 + 1 + 0 + 0 + 0 + + + 13765 + 1 + 0 + 0 + 0 + + + 13766 + 1 + 0 + 0 + 0 + + + 13767 + 1 + 0 + 0 + 0 + + + 13768 + 1 + 0 + 0 + 0 + + + 13769 + 1 + 0 + 0 + 0 + + + 13770 + 1 + 0 + 0 + 0 + + + 13771 + 1 + 0 + 0 + 0 + + + 13772 + 1 + 0 + 0 + 0 + + + 13773 + 1 + 0 + 0 + 0 + + + 13774 + 1 + 0 + 0 + 0 + + + 13775 + 1 + 0 + 0 + 0 + + + 13776 + 1 + 0 + 0 + 0 + + + 13777 + 1 + 0 + 0 + 0 + + + 13778 + 1 + 0 + 0 + 0 + + + 13779 + 1 + 0 + 0 + 0 + + + 13780 + 1 + 0 + 0 + 0 + + + 13781 + 1 + 0 + 0 + 0 + + + 13782 + 1 + 0 + 0 + 0 + + + 13783 + 1 + 0 + 0 + 0 + + + 13784 + 1 + 0 + 0 + 0 + + + 13785 + 1 + 0 + 0 + 0 + + + 13786 + 1 + 0 + 0 + 0 + + + 13787 + 1 + 0 + 0 + 0 + + + 13788 + 1 + 0 + 0 + 0 + + + 13789 + 1 + 0 + 0 + 0 + + + 13790 + 1 + 0 + 0 + 0 + + + 13791 + 1 + 0 + 0 + 0 + + + 13792 + 1 + 0 + 0 + 0 + + + 13793 + 1 + 0 + 0 + 0 + + + 13794 + 1 + 0 + 0 + 0 + + + 13795 + 1 + 0 + 0 + 0 + + + 13796 + 1 + 0 + 0 + 0 + + + 13797 + 1 + 0 + 0 + 0 + + + 13798 + 1 + 0 + 0 + 0 + + + 13799 + 1 + 0 + 0 + 0 + + + 13800 + 1 + 0 + 0 + 0 + + + 13801 + 1 + 0 + 0 + 0 + + + 13802 + 1 + 0 + 0 + 0 + + + 13803 + 1 + 0 + 0 + 0 + + + 13804 + 1 + 0 + 0 + 0 + + + 13805 + 1 + 0 + 0 + 0 + + + 13806 + 1 + 0 + 0 + 0 + + + 13807 + 1 + 0 + 0 + 0 + + + 13808 + 1 + 0 + 0 + 0 + + + 13809 + 1 + 0 + 0 + 0 + + + 13810 + 1 + 0 + 0 + 0 + + + 13811 + 1 + 0 + 0 + 0 + + + 13812 + 1 + 0 + 0 + 0 + + + 13813 + 1 + 0 + 0 + 0 + + + 13814 + 1 + 0 + 0 + 0 + + + 13815 + 1 + 0 + 0 + 0 + + + 13816 + 1 + 0 + 0 + 0 + + + 13817 + 1 + 0 + 0 + 0 + + + 13818 + 1 + 0 + 0 + 0 + + + 13819 + 1 + 0 + 0 + 0 + + + 13820 + 1 + 0 + 0 + 0 + + + 13821 + 1 + 0 + 0 + 0 + + + 13822 + 1 + 0 + 0 + 0 + + + 13823 + 1 + 0 + 0 + 0 + + + 13824 + 1 + 0 + 0 + 0 + + + 13825 + 1 + 0 + 0 + 0 + + + 13826 + 1 + 0 + 0 + 0 + + + 13827 + 1 + 0 + 0 + 0 + + + 13828 + 1 + 0 + 0 + 0 + + + 13829 + 1 + 0 + 0 + 0 + + + 13830 + 1 + 0 + 0 + 0 + + + 13831 + 1 + 0 + 0 + 0 + + + 13832 + 1 + 0 + 0 + 0 + + + 13833 + 1 + 0 + 0 + 0 + + + 13834 + 1 + 0 + 0 + 0 + + + 13835 + 1 + 0 + 0 + 0 + + + 13836 + 1 + 0 + 0 + 0 + + + 13837 + 1 + 0 + 0 + 0 + + + 13838 + 1 + 0 + 0 + 0 + + + 13839 + 1 + 0 + 0 + 0 + + + 13840 + 1 + 0 + 0 + 0 + + + 13841 + 1 + 0 + 0 + 0 + + + 13842 + 1 + 0 + 0 + 0 + + + 13843 + 1 + 0 + 0 + 0 + + + 13844 + 1 + 0 + 0 + 0 + + + 13845 + 50000 + 0 + 0 + 0 + + + 13846 + 50000 + 0 + 0 + 0 + + + 13847 + 50000 + 0 + 0 + 0 + + + 13848 + 50000 + 0 + 0 + 0 + + + 13849 + 50000 + 0 + 0 + 0 + + + 13850 + 50000 + 0 + 0 + 0 + + + 13851 + 50000 + 0 + 0 + 0 + + + 13852 + 50000 + 0 + 0 + 0 + + + 13853 + 50000 + 0 + 0 + 0 + + + 13854 + 50000 + 0 + 0 + 0 + + + 13855 + 50000 + 0 + 0 + 0 + + + 13856 + 50000 + 0 + 0 + 0 + + + 13857 + 50000 + 0 + 0 + 0 + + + 13858 + 500000 + 0 + 0 + 0 + + + 13859 + 500000 + 0 + 0 + 0 + + + 13860 + 300000 + 0 + 0 + 0 + + + 13861 + 500000 + 0 + 0 + 0 + + + 13862 + 500000 + 0 + 0 + 0 + + + 13863 + 300000 + 0 + 0 + 0 + + + 13864 + 250000 + 0 + 0 + 0 + + + 13865 + 250000 + 0 + 0 + 0 + + + 13866 + 150000 + 0 + 0 + 0 + + + 13867 + 300000 + 0 + 0 + 0 + + + 13868 + 300000 + 0 + 0 + 0 + + + 13869 + 180000 + 0 + 0 + 0 + + + 13870 + 500000 + 0 + 0 + 0 + + + 13871 + 500000 + 0 + 0 + 0 + + + 13872 + 300000 + 0 + 0 + 0 + + + 13873 + 500000 + 0 + 0 + 0 + + + 13874 + 500000 + 0 + 0 + 0 + + + 13875 + 300000 + 0 + 0 + 0 + + + 13876 + 250000 + 0 + 0 + 0 + + + 13877 + 250000 + 0 + 0 + 0 + + + 13878 + 150000 + 0 + 0 + 0 + + + 13879 + 4000 + 0 + 0 + 0 + + + 13880 + 10000 + 0 + 0 + 0 + + + 13881 + 10000 + 0 + 0 + 0 + + + 13882 + 10000 + 0 + 0 + 0 + + + 13883 + 4000 + 0 + 0 + 0 + + + 13884 + 500000 + 0 + 0 + 0 + + + 13885 + 500000 + 0 + 0 + 0 + + + 13886 + 300000 + 0 + 0 + 0 + + + 13887 + 500000 + 0 + 0 + 0 + + + 13888 + 500000 + 0 + 0 + 0 + + + 13889 + 300000 + 0 + 0 + 0 + + + 13890 + 500000 + 0 + 0 + 0 + + + 13891 + 500000 + 0 + 0 + 0 + + + 13892 + 300000 + 0 + 0 + 0 + + + 13893 + 500000 + 0 + 0 + 0 + + + 13894 + 500000 + 0 + 0 + 0 + + + 13895 + 300000 + 0 + 0 + 0 + + + 13896 + 250000 + 0 + 0 + 0 + + + 13897 + 250000 + 0 + 0 + 0 + + + 13898 + 150000 + 0 + 0 + 0 + + + 13899 + 300000 + 0 + 0 + 0 + + + 13900 + 300000 + 0 + 0 + 0 + + + 13901 + 180000 + 0 + 0 + 0 + + + 13902 + 300000 + 0 + 0 + 0 + + + 13903 + 300000 + 0 + 0 + 0 + + + 13904 + 180000 + 0 + 0 + 0 + + + 13905 + 300000 + 0 + 0 + 0 + + + 13906 + 300000 + 0 + 0 + 0 + + + 13907 + 180000 + 0 + 0 + 0 + + + 13908 + 125000 + 0 + 0 + 0 + + + 13909 + 125000 + 0 + 0 + 0 + + + 13910 + 75000 + 0 + 0 + 0 + + + 13911 + 125000 + 0 + 0 + 0 + + + 13912 + 125000 + 0 + 0 + 0 + + + 13913 + 75000 + 0 + 0 + 0 + + + 13914 + 125000 + 0 + 0 + 0 + + + 13915 + 125000 + 0 + 0 + 0 + + + 13916 + 75000 + 0 + 0 + 0 + + + 13917 + 125000 + 0 + 0 + 0 + + + 13918 + 125000 + 0 + 0 + 0 + + + 13919 + 75000 + 0 + 0 + 0 + + + 13920 + 50000 + 0 + 0 + 0 + + + 13921 + 50000 + 0 + 0 + 0 + + + 13922 + 30000 + 0 + 0 + 0 + + + 13923 + 125000 + 0 + 0 + 0 + + + 13924 + 125000 + 0 + 0 + 0 + + + 13925 + 75000 + 0 + 0 + 0 + + + 13926 + 125000 + 0 + 0 + 0 + + + 13927 + 125000 + 0 + 0 + 0 + + + 13928 + 75000 + 0 + 0 + 0 + + + 13929 + 125000 + 0 + 0 + 0 + + + 13930 + 125000 + 0 + 0 + 0 + + + 13931 + 75000 + 0 + 0 + 0 + + + 13932 + 125000 + 0 + 0 + 0 + + + 13933 + 125000 + 0 + 0 + 0 + + + 13934 + 75000 + 0 + 0 + 0 + + + 13935 + 125000 + 0 + 0 + 0 + + + 13936 + 125000 + 0 + 0 + 0 + + + 13937 + 75000 + 0 + 0 + 0 + + + 13938 + 50000 + 0 + 0 + 0 + + + 13939 + 50000 + 0 + 0 + 0 + + + 13940 + 30000 + 0 + 0 + 0 + + + 13941 + 125000 + 0 + 0 + 0 + + + 13942 + 125000 + 0 + 0 + 0 + + + 13943 + 70000 + 0 + 0 + 0 + + + 13944 + 125000 + 0 + 0 + 0 + + + 13945 + 125000 + 0 + 0 + 0 + + + 13946 + 75000 + 0 + 0 + 0 + + + 13947 + 125000 + 0 + 0 + 0 + + + 13948 + 125000 + 0 + 0 + 0 + + + 13949 + 75000 + 0 + 0 + 0 + + + 13950 + 50000 + 0 + 0 + 0 + + + 13951 + 50000 + 0 + 0 + 0 + + + 13952 + 30000 + 0 + 0 + 0 + + + 13953 + 1000 + 0 + 0 + 0 + + + 13954 + 10000 + 0 + 0 + 0 + + + 13955 + 10000 + 0 + 0 + 0 + + + 13956 + 10000 + 0 + 0 + 0 + + + 13957 + 1000 + 0 + 0 + 0 + + + 13958 + 120000 + 0 + 0 + 0 + + + 13959 + 120000 + 0 + 0 + 0 + + + 13960 + 72000 + 0 + 0 + 0 + + + 13961 + 60000 + 0 + 0 + 0 + + + 13962 + 60000 + 0 + 0 + 0 + + + 13963 + 36000 + 0 + 0 + 0 + + + 13964 + 120000 + 0 + 0 + 0 + + + 13965 + 120000 + 0 + 0 + 0 + + + 13966 + 72000 + 0 + 0 + 0 + + + 13967 + 120000 + 0 + 0 + 0 + + + 13968 + 120000 + 0 + 0 + 0 + + + 13969 + 72000 + 0 + 0 + 0 + + + 13970 + 120000 + 0 + 0 + 0 + + + 13971 + 120000 + 0 + 0 + 0 + + + 13972 + 72000 + 0 + 0 + 0 + + + 13973 + 120000 + 0 + 0 + 0 + + + 13974 + 120000 + 0 + 0 + 0 + + + 13975 + 72000 + 0 + 0 + 0 + + + 13976 + 30000 + 0 + 0 + 0 + + + 13977 + 30000 + 0 + 0 + 0 + + + 13978 + 18000 + 0 + 0 + 0 + + + 13979 + 100000 + 0 + 0 + 0 + + + 13980 + 100000 + 0 + 0 + 0 + + + 13981 + 60000 + 0 + 0 + 0 + + + 13982 + 100000 + 0 + 0 + 0 + + + 13983 + 100000 + 0 + 0 + 0 + + + 13984 + 60000 + 0 + 0 + 0 + + + 13985 + 50000 + 0 + 0 + 0 + + + 13986 + 50000 + 0 + 0 + 0 + + + 13987 + 30000 + 0 + 0 + 0 + + + 13988 + 40000 + 0 + 0 + 0 + + + 13989 + 40000 + 0 + 0 + 0 + + + 13990 + 24000 + 0 + 0 + 0 + + + 13991 + 3 + 0 + 0 + 0 + + + 13992 + 3 + 0 + 0 + 0 + + + 13993 + 3 + 0 + 0 + 0 + + + 13994 + 3 + 0 + 0 + 0 + + + 13995 + 3 + 0 + 0 + 0 + + + 13996 + 3 + 0 + 0 + 0 + + + 13997 + 3 + 0 + 0 + 0 + + + 13998 + 3 + 0 + 0 + 0 + + + 13999 + 3 + 0 + 0 + 0 + + + 14000 + 3 + 0 + 0 + 0 + + + 14001 + 3 + 0 + 0 + 0 + + + 14002 + 3 + 0 + 0 + 0 + + + 14003 + 3 + 0 + 0 + 0 + + + 14004 + 3 + 0 + 0 + 0 + + + 14005 + 3 + 0 + 0 + 0 + + + 14006 + 3 + 0 + 0 + 0 + + + 14007 + 3 + 0 + 0 + 0 + + + 14008 + 3 + 0 + 0 + 0 + + + 14009 + 3 + 0 + 0 + 0 + + + 14010 + 3 + 0 + 0 + 0 + + + 14011 + 3 + 0 + 0 + 0 + + + 14012 + 3 + 0 + 0 + 0 + + + 14013 + 3 + 0 + 0 + 0 + + + 14014 + 3 + 0 + 0 + 0 + + + 14015 + 3 + 0 + 0 + 0 + + + 14016 + 3 + 0 + 0 + 0 + + + 14017 + 3 + 0 + 0 + 0 + + + 14018 + 3 + 0 + 0 + 0 + + + 14019 + 3 + 0 + 0 + 0 + + + 14020 + 3 + 0 + 0 + 0 + + + 14021 + 3 + 0 + 0 + 0 + + + 14022 + 3 + 0 + 0 + 0 + + + 14023 + 3 + 0 + 0 + 0 + + + 14024 + 3 + 0 + 0 + 0 + + + 14025 + 3 + 0 + 0 + 0 + + + 14026 + 3 + 0 + 0 + 0 + + + 14027 + 3 + 0 + 0 + 0 + + + 14028 + 3 + 0 + 0 + 0 + + + 14029 + 3 + 0 + 0 + 0 + + + 14030 + 3 + 0 + 0 + 0 + + + 14031 + 3 + 0 + 0 + 0 + + + 14032 + 3 + 0 + 0 + 0 + + + 14033 + 3 + 0 + 0 + 0 + + + 14034 + 3 + 0 + 0 + 0 + + + 14035 + 3 + 0 + 0 + 0 + + + 14036 + 3 + 0 + 0 + 0 + + + 14037 + 3 + 0 + 0 + 0 + + + 14038 + 3 + 0 + 0 + 0 + + + 14039 + 3 + 0 + 0 + 0 + + + 14040 + 3 + 0 + 0 + 0 + + + 14041 + 3 + 0 + 0 + 0 + + + 14042 + 3 + 0 + 0 + 0 + + + 14043 + 3 + 0 + 0 + 0 + + + 14044 + 3 + 0 + 0 + 0 + + + 14045 + 3 + 0 + 0 + 0 + + + 14046 + 3 + 0 + 0 + 0 + + + 14047 + 3 + 0 + 0 + 0 + + + 14048 + 3 + 0 + 0 + 0 + + + 14049 + 3 + 0 + 0 + 0 + + + 14050 + 3 + 0 + 0 + 0 + + + 14051 + 3 + 0 + 0 + 0 + + + 14052 + 3 + 0 + 0 + 0 + + + 14053 + 3 + 0 + 0 + 0 + + + 14054 + 3 + 0 + 0 + 0 + + + 14055 + 3 + 0 + 0 + 0 + + + 14056 + 5 + 0 + 0 + 0 + + + 14057 + 25 + 0 + 0 + 0 + + + 14058 + 2 + 0 + 0 + 0 + + + 14059 + 4 + 0 + 0 + 0 + + + 14060 + 4 + 0 + 0 + 0 + + + 14061 + 2 + 0 + 0 + 0 + + + 14062 + 2 + 0 + 0 + 0 + + + 14063 + 1 + 0 + 0 + 0 + + + 14064 + 5 + 0 + 0 + 0 + + + 14065 + 1 + 0 + 0 + 0 + + + 14066 + 1 + 0 + 0 + 0 + + + 14067 + 1 + 0 + 0 + 0 + + + 14068 + 15 + 0 + 0 + 0 + + + 14069 + 2 + 0 + 0 + 0 + + + 14070 + 1 + 0 + 0 + 0 + + + 14071 + 1 + 0 + 0 + 0 + + + 14072 + 1 + 0 + 0 + 0 + + + 14073 + 1 + 0 + 0 + 0 + + + 14074 + 1 + 0 + 0 + 0 + + + 14075 + 1 + 0 + 0 + 0 + + + 14076 + 15 + 0 + 0 + 0 + + + 14077 + 15 + 0 + 0 + 0 + + + 14078 + 15 + 0 + 0 + 0 + + + 14079 + 15 + 0 + 0 + 0 + + + 14080 + 15 + 0 + 0 + 0 + + + 14081 + 15 + 0 + 0 + 0 + + + 14082 + 1 + 0 + 0 + 0 + + + 14083 + 1 + 0 + 0 + 0 + + + 14084 + 1 + 0 + 0 + 0 + + + 14085 + 1 + 0 + 0 + 0 + + + 14086 + 15 + 0 + 0 + 0 + + + 14087 + 15 + 0 + 0 + 0 + + + 14088 + 15 + 0 + 0 + 0 + + + 14089 + 1 + 0 + 0 + 0 + + + 14090 + 1 + 0 + 0 + 0 + + + 14091 + 1 + 0 + 0 + 0 + + + 14092 + 1 + 0 + 0 + 0 + + + 14093 + 1 + 0 + 0 + 0 + + + 14094 + 43333 + 0 + 0 + 0 + + + 14095 + 42667 + 0 + 0 + 0 + + + 14096 + 23467 + 0 + 0 + 0 + + + 14097 + 17066 + 0 + 0 + 0 + + + 14098 + 21333 + 0 + 0 + 0 + + + 14099 + 21333 + 0 + 0 + 0 + + + 14100 + 21333 + 0 + 0 + 0 + + + 14101 + 21333 + 0 + 0 + 0 + + + 14102 + 21333 + 0 + 0 + 0 + + + 14103 + 21333 + 0 + 0 + 0 + + + 14104 + 21333 + 0 + 0 + 0 + + + 14105 + 21333 + 0 + 0 + 0 + + + 14106 + 21333 + 0 + 0 + 0 + + + 14107 + 21333 + 0 + 0 + 0 + + + 14108 + 21333 + 0 + 0 + 0 + + + 14109 + 21333 + 0 + 0 + 0 + + + 14110 + 1 + 0 + 0 + 0 + + + 14111 + 21333 + 0 + 0 + 0 + + + 14112 + 21333 + 0 + 0 + 0 + + + 14113 + 21333 + 0 + 0 + 0 + + + 14114 + 43333 + 0 + 0 + 0 + + + 14115 + 42667 + 0 + 0 + 0 + + + 14116 + 23467 + 0 + 0 + 0 + + + 14117 + 17066 + 0 + 0 + 0 + + + 14118 + 43333 + 0 + 0 + 0 + + + 14119 + 42667 + 0 + 0 + 0 + + + 14120 + 23467 + 0 + 0 + 0 + + + 14121 + 17066 + 0 + 0 + 0 + + + 14122 + 30 + 0 + 0 + 0 + + + 14123 + 30 + 0 + 0 + 0 + + + 14124 + 60 + 0 + 0 + 0 + + + 14125 + 60 + 0 + 0 + 0 + + + 14126 + 90 + 0 + 0 + 0 + + + 14127 + 90 + 0 + 0 + 0 + + + 14128 + 120 + 0 + 0 + 0 + + + 14129 + 120 + 0 + 0 + 0 + + + 14130 + 150 + 0 + 0 + 0 + + + 14131 + 150 + 0 + 0 + 0 + + + 14132 + 30 + 0 + 0 + 0 + + + 14133 + 30 + 0 + 0 + 0 + + + 14134 + 60 + 0 + 0 + 0 + + + 14135 + 60 + 0 + 0 + 0 + + + 14136 + 90 + 0 + 0 + 0 + + + 14137 + 90 + 0 + 0 + 0 + + + 14138 + 120 + 0 + 0 + 0 + + + 14139 + 120 + 0 + 0 + 0 + + + 14140 + 150 + 0 + 0 + 0 + + + 14141 + 150 + 0 + 0 + 0 + + + 14142 + 30 + 0 + 0 + 0 + + + 14143 + 30 + 0 + 0 + 0 + + + 14144 + 60 + 0 + 0 + 0 + + + 14145 + 60 + 0 + 0 + 0 + + + 14146 + 90 + 0 + 0 + 0 + + + 14147 + 90 + 0 + 0 + 0 + + + 14148 + 120 + 0 + 0 + 0 + + + 14149 + 120 + 0 + 0 + 0 + + + 14150 + 150 + 0 + 0 + 0 + + + 14151 + 150 + 0 + 0 + 0 + + + 14152 + 30 + 0 + 0 + 0 + + + 14153 + 30 + 0 + 0 + 0 + + + 14154 + 60 + 0 + 0 + 0 + + + 14155 + 60 + 0 + 0 + 0 + + + 14156 + 90 + 0 + 0 + 0 + + + 14157 + 90 + 0 + 0 + 0 + + + 14158 + 120 + 0 + 0 + 0 + + + 14159 + 120 + 0 + 0 + 0 + + + 14160 + 150 + 0 + 0 + 0 + + + 14161 + 150 + 0 + 0 + 0 + + + 14162 + 30 + 0 + 0 + 0 + + + 14163 + 30 + 0 + 0 + 0 + + + 14164 + 60 + 0 + 0 + 0 + + + 14165 + 60 + 0 + 0 + 0 + + + 14166 + 90 + 0 + 0 + 0 + + + 14167 + 90 + 0 + 0 + 0 + + + 14168 + 120 + 0 + 0 + 0 + + + 14169 + 120 + 0 + 0 + 0 + + + 14170 + 150 + 0 + 0 + 0 + + + 14171 + 150 + 0 + 0 + 0 + + + 14172 + 30 + 0 + 0 + 0 + + + 14173 + 30 + 0 + 0 + 0 + + + 14174 + 60 + 0 + 0 + 0 + + + 14175 + 60 + 0 + 0 + 0 + + + 14176 + 90 + 0 + 0 + 0 + + + 14177 + 90 + 0 + 0 + 0 + + + 14178 + 120 + 0 + 0 + 0 + + + 14179 + 120 + 0 + 0 + 0 + + + 14180 + 150 + 0 + 0 + 0 + + + 14181 + 150 + 0 + 0 + 0 + + + 14182 + 15 + 0 + 0 + 0 + + + 14183 + 15 + 0 + 0 + 0 + + + 14184 + 30 + 0 + 0 + 0 + + + 14185 + 30 + 0 + 0 + 0 + + + 14186 + 45 + 0 + 0 + 0 + + + 14187 + 45 + 0 + 0 + 0 + + + 14188 + 60 + 0 + 0 + 0 + + + 14189 + 60 + 0 + 0 + 0 + + + 14190 + 75 + 0 + 0 + 0 + + + 14191 + 75 + 0 + 0 + 0 + + + 14192 + 30 + 0 + 0 + 0 + + + 14193 + 30 + 0 + 0 + 0 + + + 14194 + 60 + 0 + 0 + 0 + + + 14195 + 60 + 0 + 0 + 0 + + + 14196 + 90 + 0 + 0 + 0 + + + 14197 + 90 + 0 + 0 + 0 + + + 14198 + 120 + 0 + 0 + 0 + + + 14199 + 120 + 0 + 0 + 0 + + + 14200 + 150 + 0 + 0 + 0 + + + 14201 + 150 + 0 + 0 + 0 + + + 14202 + 2 + 0 + 0 + 0 + + + 14203 + 4 + 0 + 0 + 0 + + + 14204 + 6 + 0 + 0 + 0 + + + 14205 + 8 + 0 + 0 + 0 + + + 14206 + 10 + 0 + 0 + 0 + + + 14207 + 150 + 0 + 0 + 0 + + + 14208 + 150 + 0 + 0 + 0 + + + 14209 + 120 + 0 + 0 + 0 + + + 14210 + 120 + 0 + 0 + 0 + + + 14211 + 90 + 0 + 0 + 0 + + + 14212 + 90 + 0 + 0 + 0 + + + 14213 + 60 + 0 + 0 + 0 + + + 14214 + 60 + 0 + 0 + 0 + + + 14215 + 30 + 0 + 0 + 0 + + + 14216 + 30 + 0 + 0 + 0 + + + 14217 + 150 + 0 + 0 + 0 + + + 14218 + 150 + 0 + 0 + 0 + + + 14219 + 120 + 0 + 0 + 0 + + + 14220 + 120 + 0 + 0 + 0 + + + 14221 + 90 + 0 + 0 + 0 + + + 14222 + 90 + 0 + 0 + 0 + + + 14223 + 60 + 0 + 0 + 0 + + + 14224 + 60 + 0 + 0 + 0 + + + 14225 + 30 + 0 + 0 + 0 + + + 14226 + 30 + 0 + 0 + 0 + + + 14227 + 150 + 0 + 0 + 0 + + + 14228 + 150 + 0 + 0 + 0 + + + 14229 + 120 + 0 + 0 + 0 + + + 14230 + 120 + 0 + 0 + 0 + + + 14231 + 90 + 0 + 0 + 0 + + + 14232 + 90 + 0 + 0 + 0 + + + 14233 + 60 + 0 + 0 + 0 + + + 14234 + 60 + 0 + 0 + 0 + + + 14235 + 30 + 0 + 0 + 0 + + + 14236 + 30 + 0 + 0 + 0 + + + 14237 + 150 + 0 + 0 + 0 + + + 14238 + 150 + 0 + 0 + 0 + + + 14239 + 120 + 0 + 0 + 0 + + + 14240 + 120 + 0 + 0 + 0 + + + 14241 + 90 + 0 + 0 + 0 + + + 14242 + 90 + 0 + 0 + 0 + + + 14243 + 60 + 0 + 0 + 0 + + + 14244 + 60 + 0 + 0 + 0 + + + 14245 + 30 + 0 + 0 + 0 + + + 14246 + 30 + 0 + 0 + 0 + + + 14247 + 150 + 0 + 0 + 0 + + + 14248 + 150 + 0 + 0 + 0 + + + 14249 + 120 + 0 + 0 + 0 + + + 14250 + 120 + 0 + 0 + 0 + + + 14251 + 90 + 0 + 0 + 0 + + + 14252 + 90 + 0 + 0 + 0 + + + 14253 + 60 + 0 + 0 + 0 + + + 14254 + 60 + 0 + 0 + 0 + + + 14255 + 30 + 0 + 0 + 0 + + + 14256 + 30 + 0 + 0 + 0 + + + 14257 + 150 + 0 + 0 + 0 + + + 14258 + 150 + 0 + 0 + 0 + + + 14259 + 120 + 0 + 0 + 0 + + + 14260 + 120 + 0 + 0 + 0 + + + 14261 + 90 + 0 + 0 + 0 + + + 14262 + 90 + 0 + 0 + 0 + + + 14263 + 60 + 0 + 0 + 0 + + + 14264 + 60 + 0 + 0 + 0 + + + 14265 + 30 + 0 + 0 + 0 + + + 14266 + 30 + 0 + 0 + 0 + + + 14267 + 150 + 0 + 0 + 0 + + + 14268 + 150 + 0 + 0 + 0 + + + 14269 + 120 + 0 + 0 + 0 + + + 14270 + 120 + 0 + 0 + 0 + + + 14271 + 90 + 0 + 0 + 0 + + + 14272 + 90 + 0 + 0 + 0 + + + 14273 + 60 + 0 + 0 + 0 + + + 14274 + 60 + 0 + 0 + 0 + + + 14275 + 30 + 0 + 0 + 0 + + + 14276 + 30 + 0 + 0 + 0 + + + 14277 + 150 + 0 + 0 + 0 + + + 14278 + 150 + 0 + 0 + 0 + + + 14279 + 120 + 0 + 0 + 0 + + + 14280 + 120 + 0 + 0 + 0 + + + 14281 + 90 + 0 + 0 + 0 + + + 14282 + 90 + 0 + 0 + 0 + + + 14283 + 60 + 0 + 0 + 0 + + + 14284 + 60 + 0 + 0 + 0 + + + 14285 + 30 + 0 + 0 + 0 + + + 14286 + 30 + 0 + 0 + 0 + + + 14287 + 30 + 0 + 0 + 0 + + + 14288 + 30 + 0 + 0 + 0 + + + 14289 + 60 + 0 + 0 + 0 + + + 14290 + 60 + 0 + 0 + 0 + + + 14291 + 90 + 0 + 0 + 0 + + + 14292 + 90 + 0 + 0 + 0 + + + 14293 + 120 + 0 + 0 + 0 + + + 14294 + 120 + 0 + 0 + 0 + + + 14295 + 150 + 0 + 0 + 0 + + + 14296 + 150 + 0 + 0 + 0 + + + 14297 + 30 + 0 + 0 + 0 + + + 14298 + 30 + 0 + 0 + 0 + + + 14299 + 60 + 0 + 0 + 0 + + + 14300 + 60 + 0 + 0 + 0 + + + 14301 + 90 + 0 + 0 + 0 + + + 14302 + 90 + 0 + 0 + 0 + + + 14303 + 120 + 0 + 0 + 0 + + + 14304 + 120 + 0 + 0 + 0 + + + 14305 + 150 + 0 + 0 + 0 + + + 14306 + 150 + 0 + 0 + 0 + + + 14307 + 30 + 0 + 0 + 0 + + + 14308 + 30 + 0 + 0 + 0 + + + 14309 + 60 + 0 + 0 + 0 + + + 14310 + 60 + 0 + 0 + 0 + + + 14311 + 90 + 0 + 0 + 0 + + + 14312 + 90 + 0 + 0 + 0 + + + 14313 + 120 + 0 + 0 + 0 + + + 14314 + 120 + 0 + 0 + 0 + + + 14315 + 150 + 0 + 0 + 0 + + + 14316 + 150 + 0 + 0 + 0 + + + 14317 + 30 + 0 + 0 + 0 + + + 14318 + 30 + 0 + 0 + 0 + + + 14319 + 60 + 0 + 0 + 0 + + + 14320 + 60 + 0 + 0 + 0 + + + 14321 + 90 + 0 + 0 + 0 + + + 14322 + 90 + 0 + 0 + 0 + + + 14323 + 120 + 0 + 0 + 0 + + + 14324 + 120 + 0 + 0 + 0 + + + 14325 + 150 + 0 + 0 + 0 + + + 14326 + 150 + 0 + 0 + 0 + + + 14327 + 30 + 0 + 0 + 0 + + + 14328 + 30 + 0 + 0 + 0 + + + 14329 + 60 + 0 + 0 + 0 + + + 14330 + 60 + 0 + 0 + 0 + + + 14331 + 90 + 0 + 0 + 0 + + + 14332 + 90 + 0 + 0 + 0 + + + 14333 + 120 + 0 + 0 + 0 + + + 14334 + 120 + 0 + 0 + 0 + + + 14335 + 150 + 0 + 0 + 0 + + + 14336 + 150 + 0 + 0 + 0 + + + 14337 + 30 + 0 + 0 + 0 + + + 14338 + 30 + 0 + 0 + 0 + + + 14339 + 60 + 0 + 0 + 0 + + + 14340 + 60 + 0 + 0 + 0 + + + 14341 + 90 + 0 + 0 + 0 + + + 14342 + 90 + 0 + 0 + 0 + + + 14343 + 120 + 0 + 0 + 0 + + + 14344 + 120 + 0 + 0 + 0 + + + 14345 + 150 + 0 + 0 + 0 + + + 14346 + 150 + 0 + 0 + 0 + + + 14347 + 30 + 0 + 0 + 0 + + + 14348 + 30 + 0 + 0 + 0 + + + 14349 + 60 + 0 + 0 + 0 + + + 14350 + 60 + 0 + 0 + 0 + + + 14351 + 90 + 0 + 0 + 0 + + + 14352 + 90 + 0 + 0 + 0 + + + 14353 + 120 + 0 + 0 + 0 + + + 14354 + 120 + 0 + 0 + 0 + + + 14355 + 150 + 0 + 0 + 0 + + + 14356 + 150 + 0 + 0 + 0 + + + 14357 + 30 + 0 + 0 + 0 + + + 14358 + 30 + 0 + 0 + 0 + + + 14359 + 60 + 0 + 0 + 0 + + + 14360 + 60 + 0 + 0 + 0 + + + 14361 + 90 + 0 + 0 + 0 + + + 14362 + 90 + 0 + 0 + 0 + + + 14363 + 120 + 0 + 0 + 0 + + + 14364 + 120 + 0 + 0 + 0 + + + 14365 + 150 + 0 + 0 + 0 + + + 14366 + 150 + 0 + 0 + 0 + + + 14367 + 30 + 0 + 0 + 0 + + + 14368 + 30 + 0 + 0 + 0 + + + 14369 + 60 + 0 + 0 + 0 + + + 14370 + 60 + 0 + 0 + 0 + + + 14371 + 90 + 0 + 0 + 0 + + + 14372 + 90 + 0 + 0 + 0 + + + 14373 + 120 + 0 + 0 + 0 + + + 14374 + 120 + 0 + 0 + 0 + + + 14375 + 150 + 0 + 0 + 0 + + + 14376 + 150 + 0 + 0 + 0 + + + 14377 + 30 + 0 + 0 + 0 + + + 14378 + 30 + 0 + 0 + 0 + + + 14379 + 60 + 0 + 0 + 0 + + + 14380 + 60 + 0 + 0 + 0 + + + 14381 + 90 + 0 + 0 + 0 + + + 14382 + 90 + 0 + 0 + 0 + + + 14383 + 120 + 0 + 0 + 0 + + + 14384 + 120 + 0 + 0 + 0 + + + 14385 + 150 + 0 + 0 + 0 + + + 14386 + 150 + 0 + 0 + 0 + + + 14387 + 1 + 0 + 0 + 0 + + + 14389 + 1 + 0 + 0 + 0 + + + 14391 + 30 + 0 + 0 + 0 + + + 14392 + 30 + 0 + 0 + 0 + + + 14393 + 60 + 0 + 0 + 0 + + + 14394 + 60 + 0 + 0 + 0 + + + 14395 + 90 + 0 + 0 + 0 + + + 14396 + 90 + 0 + 0 + 0 + + + 14397 + 120 + 0 + 0 + 0 + + + 14398 + 120 + 0 + 0 + 0 + + + 14399 + 150 + 0 + 0 + 0 + + + 14400 + 150 + 0 + 0 + 0 + + + 14401 + 30 + 0 + 0 + 0 + + + 14402 + 30 + 0 + 0 + 0 + + + 14403 + 60 + 0 + 0 + 0 + + + 14404 + 60 + 0 + 0 + 0 + + + 14405 + 90 + 0 + 0 + 0 + + + 14406 + 90 + 0 + 0 + 0 + + + 14407 + 120 + 0 + 0 + 0 + + + 14408 + 120 + 0 + 0 + 0 + + + 14409 + 150 + 0 + 0 + 0 + + + 14410 + 150 + 0 + 0 + 0 + + + 14411 + 30 + 0 + 0 + 0 + + + 14412 + 30 + 0 + 0 + 0 + + + 14413 + 60 + 0 + 0 + 0 + + + 14414 + 60 + 0 + 0 + 0 + + + 14415 + 90 + 0 + 0 + 0 + + + 14416 + 90 + 0 + 0 + 0 + + + 14417 + 120 + 0 + 0 + 0 + + + 14418 + 120 + 0 + 0 + 0 + + + 14419 + 150 + 0 + 0 + 0 + + + 14420 + 150 + 0 + 0 + 0 + + + 14421 + 30 + 0 + 0 + 0 + + + 14422 + 30 + 0 + 0 + 0 + + + 14423 + 30 + 0 + 0 + 0 + + + 14424 + 60 + 0 + 0 + 0 + + + 14425 + 60 + 0 + 0 + 0 + + + 14426 + 90 + 0 + 0 + 0 + + + 14427 + 90 + 0 + 0 + 0 + + + 14428 + 120 + 0 + 0 + 0 + + + 14429 + 120 + 0 + 0 + 0 + + + 14430 + 150 + 0 + 0 + 0 + + + 14431 + 150 + 0 + 0 + 0 + + + 14432 + 1 + 0 + 0 + 0 + + + 14433 + 1 + 0 + 0 + 0 + + + 14434 + 1 + 0 + 0 + 0 + + + 14435 + 1 + 0 + 0 + 0 + + + 14436 + 1 + 0 + 0 + 0 + + + 14437 + 1 + 0 + 0 + 0 + + + 14438 + 1 + 0 + 0 + 0 + + + 14439 + 1 + 0 + 0 + 0 + + + 14440 + 1 + 0 + 0 + 0 + + + 14441 + 1 + 0 + 0 + 0 + + + 14442 + 1 + 0 + 0 + 0 + + + 14443 + 1 + 0 + 0 + 0 + + + 14444 + 1 + 0 + 0 + 0 + + + 14445 + 1 + 0 + 0 + 0 + + + 14446 + 1 + 0 + 0 + 0 + + + 14447 + 1 + 0 + 0 + 0 + + + 14448 + 1 + 0 + 0 + 0 + + + 14449 + 1 + 0 + 0 + 0 + + + 14450 + 1 + 0 + 0 + 0 + + + 14451 + 1 + 0 + 0 + 0 + + + 14452 + 1 + 0 + 0 + 0 + + + 14453 + 1 + 0 + 0 + 0 + + + 14454 + 1 + 0 + 0 + 0 + + + 14455 + 1 + 0 + 0 + 0 + + + 14456 + 1 + 0 + 0 + 0 + + + 14457 + 1 + 0 + 0 + 0 + + + 14458 + 5 + 0 + 0 + 0 + + + 14459 + 1 + 0 + 0 + 0 + + + 14460 + 10 + 0 + 0 + 0 + + + 14461 + 1 + 0 + 0 + 0 + + + 14462 + 1 + 0 + 0 + 0 + + + 14463 + 1 + 0 + 0 + 0 + + + 14464 + 1 + 0 + 0 + 0 + + + 14465 + 1 + 0 + 0 + 0 + + + 14466 + 1 + 0 + 0 + 0 + + + 14467 + 1 + 0 + 0 + 0 + + + 14468 + 1 + 0 + 0 + 0 + + + 14469 + 1 + 0 + 0 + 0 + + + 14470 + 1 + 0 + 0 + 0 + + + 14471 + 1 + 0 + 0 + 0 + + + 14472 + 30000 + 0 + 0 + 0 + + + 14473 + 30000 + 0 + 0 + 0 + + + 14474 + 30000 + 0 + 0 + 0 + + + 14475 + 30000 + 0 + 0 + 0 + + + 14476 + 30000 + 0 + 0 + 0 + + + 14477 + 30000 + 0 + 0 + 0 + + + 14478 + 1 + 0 + 0 + 0 + + + 14479 + 1760000 + 0 + 0 + 0 + + + 14480 + 1760000 + 0 + 0 + 0 + + + 14481 + 1 + 0 + 0 + 0 + + + 14484 + 135000 + 0 + 0 + 0 + + + 14485 + 135000 + 0 + 0 + 0 + + + 14486 + 1 + 0 + 0 + 0 + + + 14487 + 1 + 0 + 0 + 0 + + + 14488 + 1 + 0 + 0 + 0 + + + 14489 + 1 + 0 + 0 + 0 + + + 14490 + 65000 + 0 + 0 + 0 + + + 14491 + 65000 + 0 + 0 + 0 + + + 14492 + 64000 + 0 + 0 + 0 + + + 14493 + 64000 + 0 + 0 + 0 + + + 14494 + 35200 + 0 + 0 + 0 + + + 14495 + 35200 + 0 + 0 + 0 + + + 14496 + 1 + 0 + 0 + 0 + + + 14497 + 120000 + 0 + 0 + 0 + + + 14498 + 120000 + 0 + 0 + 0 + + + 14499 + 15000 + 0 + 0 + 0 + + + 14500 + 15000 + 0 + 0 + 0 + + + 14501 + 80000 + 0 + 0 + 0 + + + 14502 + 80000 + 0 + 0 + 0 + + + 14503 + 1 + 0 + 0 + 0 + + + 14504 + 1 + 0 + 0 + 0 + + + 14505 + 1 + 0 + 0 + 0 + + + 14506 + 1 + 0 + 0 + 0 + + + 14507 + 1 + 0 + 0 + 0 + + + 14508 + 1 + 0 + 0 + 0 + + + 14509 + 1 + 0 + 0 + 0 + + + 14510 + 1 + 0 + 0 + 0 + + + 14511 + 1 + 0 + 0 + 0 + + + 14512 + 1 + 0 + 0 + 0 + + + 14513 + 1 + 0 + 0 + 0 + + + 14514 + 1 + 0 + 0 + 0 + + + 14515 + 1 + 0 + 0 + 0 + + + 14516 + 1 + 0 + 0 + 0 + + + 14517 + 1 + 0 + 0 + 0 + + + 14518 + 1 + 0 + 0 + 0 + + + 14519 + 1 + 0 + 0 + 0 + + + 14520 + 1 + 0 + 0 + 0 + + + 14521 + 1 + 0 + 0 + 0 + + + 14522 + 1 + 0 + 0 + 0 + + + 14523 + 1 + 0 + 0 + 0 + + + 14524 + 1 + 0 + 0 + 0 + + + 14525 + 20 + 0 + 0 + 0 + + + 14526 + 20 + 0 + 0 + 0 + + + 14527 + 20 + 0 + 0 + 0 + + + 14528 + 20 + 0 + 0 + 0 + + + 14529 + 20 + 0 + 0 + 0 + + + 14530 + 20 + 0 + 0 + 0 + + + 14531 + 20 + 0 + 0 + 0 + + + 14532 + 20 + 0 + 0 + 0 + + + 14533 + 1 + 0 + 0 + 0 + + + 14534 + 1 + 0 + 0 + 0 + + + 14535 + 1 + 0 + 0 + 0 + + + 14536 + 1 + 0 + 0 + 0 + + + 14537 + 1 + 0 + 0 + 0 + + + 14538 + 1 + 0 + 0 + 0 + + + 14539 + 9 + 0 + 0 + 0 + + + 14540 + 4 + 0 + 0 + 0 + + + 14541 + 1 + 0 + 0 + 0 + + + 14542 + 9 + 0 + 0 + 0 + + + 14543 + 4 + 0 + 0 + 0 + + + 14544 + 1 + 0 + 0 + 0 + + + 14545 + 1 + 0 + 0 + 0 + + + 14546 + 1 + 0 + 0 + 0 + + + 14547 + 1 + 0 + 0 + 0 + + + 14548 + 1 + 0 + 0 + 0 + + + 14549 + 1 + 0 + 0 + 0 + + + 14550 + 1 + 0 + 0 + 0 + + + 14551 + 1 + 0 + 0 + 0 + + + 14552 + 1 + 0 + 0 + 0 + + + 14553 + 1 + 0 + 0 + 0 + + + 14554 + 1 + 0 + 0 + 0 + + + 14555 + 1 + 0 + 0 + 0 + + + 14556 + 1 + 0 + 0 + 0 + + + 14557 + 1 + 0 + 0 + 0 + + + 14558 + 1 + 0 + 0 + 0 + + + 14559 + 1 + 0 + 0 + 0 + + + 14560 + 1 + 0 + 0 + 0 + + + 14561 + 1 + 0 + 0 + 0 + + + 14562 + 1 + 0 + 0 + 0 + + + 14563 + 1 + 0 + 0 + 0 + + + 14564 + 1 + 0 + 0 + 0 + + + 14565 + 1 + 0 + 0 + 0 + + + 14566 + 1 + 0 + 0 + 0 + + + 14567 + 1 + 0 + 0 + 0 + + + 14568 + 1 + 0 + 0 + 0 + + + 14569 + 1 + 0 + 0 + 0 + + + 14570 + 1 + 0 + 0 + 0 + + + 14571 + 1 + 0 + 0 + 0 + + + 14572 + 1 + 0 + 0 + 0 + + + 14573 + 1 + 0 + 0 + 0 + + + 14574 + 1 + 0 + 0 + 0 + + + 14575 + 1 + 0 + 0 + 0 + + + 14576 + 1 + 0 + 0 + 0 + + + 14577 + 100 + 0 + 0 + 0 + + + 14578 + 200 + 0 + 0 + 0 + + + 14579 + 300 + 0 + 0 + 0 + + + 14580 + 1000 + 0 + 0 + 0 + + + 14581 + 5000 + 0 + 0 + 0 + + + 14582 + 10000 + 0 + 0 + 0 + + + 14583 + 1 + 0 + 0 + 0 + + + 14584 + 500000 + 0 + 0 + 0 + + + 14585 + 1 + 0 + 0 + 0 + + + 14586 + 1 + 0 + 0 + 0 + + + 14587 + 1 + 0 + 0 + 0 + + + 14588 + 1 + 0 + 0 + 0 + + + 14589 + 1250 + 0 + 0 + 0 + + + 14590 + 1000 + 0 + 0 + 0 + + + 14591 + 1000 + 0 + 0 + 0 + + + 14592 + 1 + 0 + 0 + 0 + + + 14593 + 1 + 0 + 0 + 0 + + + 14594 + 1 + 0 + 0 + 0 + + + 14595 + 1 + 0 + 0 + 0 + + + 14596 + 1 + 0 + 0 + 0 + + + 14597 + 1 + 0 + 0 + 0 + + + 14598 + 1 + 0 + 0 + 0 + + + 14599 + 1 + 0 + 0 + 0 + + + 14600 + 1 + 0 + 0 + 0 + + + 14601 + 1 + 0 + 0 + 0 + + + 14602 + 1 + 0 + 0 + 0 + + + 14603 + 1 + 0 + 0 + 0 + + + 14604 + 1 + 0 + 0 + 0 + + + 14605 + 1 + 0 + 0 + 0 + + + 14606 + 1 + 0 + 0 + 0 + + + 14607 + 1 + 0 + 0 + 0 + + + 14608 + 1 + 0 + 0 + 0 + + + 14609 + 1 + 0 + 0 + 0 + + + 14610 + 1 + 0 + 0 + 0 + + + 14611 + 1 + 0 + 0 + 0 + + + 14612 + 1 + 0 + 0 + 0 + + + 14613 + 1 + 0 + 0 + 0 + + + 14614 + 1 + 0 + 0 + 0 + + + 14615 + 1 + 0 + 0 + 0 + + + 14616 + 100 + 0 + 0 + 0 + + + 14617 + 100 + 0 + 0 + 0 + + + 14618 + 1 + 0 + 0 + 0 + + + 14619 + 1 + 0 + 0 + 0 + + + 14620 + 1 + 0 + 0 + 0 + + + 14621 + 1 + 0 + 0 + 0 + + + 14622 + 498 + 0 + 0 + 0 + + + 14623 + 4986 + 0 + 0 + 0 + + + 14624 + 4986 + 0 + 0 + 0 + + + 14625 + 1 + 0 + 0 + 0 + + + 14626 + 1 + 0 + 0 + 0 + + + 14627 + 1 + 0 + 0 + 0 + + + 14628 + 1 + 0 + 0 + 0 + + + 14629 + 1 + 0 + 0 + 0 + + + 14630 + 1 + 0 + 0 + 0 + + + 14631 + 1 + 0 + 0 + 0 + + + 14632 + 200 + 0 + 0 + 0 + + + 14633 + 1 + 0 + 0 + 0 + + + 14634 + 1 + 0 + 0 + 0 + + + 14635 + 1 + 0 + 0 + 0 + + + 14636 + 650 + 0 + 0 + 0 + + + 14637 + 650 + 0 + 0 + 0 + + + 14638 + 17625 + 0 + 0 + 0 + + + 14639 + 17625 + 0 + 0 + 0 + + + 14640 + 17625 + 0 + 0 + 0 + + + 14641 + 17625 + 0 + 0 + 0 + + + 14642 + 17625 + 0 + 0 + 0 + + + 14643 + 17625 + 0 + 0 + 0 + + + 14644 + 17625 + 0 + 0 + 0 + + + 14645 + 17625 + 0 + 0 + 0 + + + 14646 + 17625 + 0 + 0 + 0 + + + 14647 + 17625 + 0 + 0 + 0 + + diff --git a/Server/data/eco/offer_dispatch.json b/Server/data/eco/offer_dispatch.json new file mode 100644 index 000000000..13c5ddc2d --- /dev/null +++ b/Server/data/eco/offer_dispatch.json @@ -0,0 +1,44 @@ +{ + "offers": [ + { + "completedAmount": "0", + "timeStamp": "1613860415435", + "uid": "261", + "itemId": "9140", + "sale": true, + "amount": "2", + "withdrawItems": [], + "offeredValue": "2", + "playerUID": "3556498", + "offerState": "1", + "totalCoinExchange": "0" + }, + { + "completedAmount": "0", + "timeStamp": "1613860473644", + "uid": "262", + "itemId": "807", + "sale": true, + "amount": "1", + "withdrawItems": [], + "offeredValue": "2", + "playerUID": "3556498", + "offerState": "1", + "totalCoinExchange": "0" + }, + { + "completedAmount": "0", + "timeStamp": "1613860649519", + "uid": "269", + "itemId": "436", + "sale": true, + "amount": "1", + "withdrawItems": [], + "offeredValue": "20", + "playerUID": "3556498", + "offerState": "1", + "totalCoinExchange": "0" + } + ], + "offsetUID": "1043" +} \ No newline at end of file diff --git a/Server/db_exports/global.sql b/Server/db_exports/global.sql new file mode 100644 index 000000000..3a706c489 --- /dev/null +++ b/Server/db_exports/global.sql @@ -0,0 +1,484 @@ +-- phpMyAdmin SQL Dump +-- version 5.0.2 +-- https://www.phpmyadmin.net/ +-- +-- Host: 127.0.0.1 +-- Generation Time: Sep 23, 2020 at 08:45 PM +-- Server version: 10.4.14-MariaDB +-- PHP Version: 7.4.9 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!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 utf8mb4 */; + +-- +-- Database: `global` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dev_log` +-- + +CREATE TABLE `dev_log` ( + `id` int(11) UNSIGNED NOT NULL, + `username` varchar(15) DEFAULT NULL, + `content` longtext NOT NULL, + `date` timestamp NULL DEFAULT '0000-00-00 00:00:00' +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `highscores` +-- + +CREATE TABLE `highscores` ( + `id` int(11) UNSIGNED NOT NULL, + `username` varchar(20) DEFAULT NULL, + `overall_xp` int(11) NOT NULL DEFAULT 0, + `total_level` int(11) NOT NULL DEFAULT 0, + `ironManMode` varchar(15) NOT NULL DEFAULT 'NONE', + `xp_0` int(11) NOT NULL DEFAULT 0, + `xp_1` int(11) NOT NULL DEFAULT 0, + `xp_2` int(11) NOT NULL DEFAULT 0, + `xp_3` int(11) NOT NULL DEFAULT 0, + `xp_4` int(11) NOT NULL DEFAULT 0, + `xp_5` int(11) NOT NULL DEFAULT 0, + `xp_6` int(11) NOT NULL DEFAULT 0, + `xp_7` int(11) NOT NULL DEFAULT 0, + `xp_8` int(11) NOT NULL DEFAULT 0, + `xp_9` int(11) NOT NULL DEFAULT 0, + `xp_10` int(11) NOT NULL DEFAULT 0, + `xp_11` int(11) NOT NULL DEFAULT 0, + `xp_12` int(11) NOT NULL DEFAULT 0, + `xp_13` int(11) NOT NULL DEFAULT 0, + `xp_14` int(11) NOT NULL DEFAULT 0, + `xp_15` int(11) NOT NULL DEFAULT 0, + `xp_16` int(11) NOT NULL DEFAULT 0, + `xp_17` int(11) NOT NULL DEFAULT 0, + `xp_18` int(11) NOT NULL DEFAULT 0, + `xp_19` int(11) NOT NULL DEFAULT 0, + `xp_20` int(11) NOT NULL DEFAULT 0, + `xp_21` int(11) NOT NULL DEFAULT 0, + `xp_22` int(11) NOT NULL DEFAULT 0, + `xp_23` int(11) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `highscores` +-- + +INSERT INTO `highscores` (`id`, `username`, `overall_xp`, `total_level`, `ironManMode`, `xp_0`, `xp_1`, `xp_2`, `xp_3`, `xp_4`, `xp_5`, `xp_6`, `xp_7`, `xp_8`, `xp_9`, `xp_10`, `xp_11`, `xp_12`, `xp_13`, `xp_14`, `xp_15`, `xp_16`, `xp_17`, `xp_18`, `xp_19`, `xp_20`, `xp_21`, `xp_22`, `xp_23`) VALUES +(9, 'woah', 1154, 33, 'NONE', 0, 0, 0, 1154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +(10, 'test', 1154, 33, 'NONE', 0, 0, 0, 1154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), +(11, 'woahscam', 1154, 33, 'NONE', 0, 0, 0, 1154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `members` +-- + +CREATE TABLE `members` ( + `UID` int(11) UNSIGNED NOT NULL, + `email` varchar(50) NOT NULL DEFAULT '', + `username` varchar(15) DEFAULT NULL, + `password` varchar(100) DEFAULT NULL, + `salt` varchar(35) DEFAULT NULL, + `rights` int(1) NOT NULL DEFAULT 0, + `email_activated` int(1) NOT NULL DEFAULT 0, + `lastActive` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `donatorType` int(2) NOT NULL DEFAULT -1, + `donationTotal` double(10,2) NOT NULL DEFAULT 0.00, + `credits` int(5) NOT NULL DEFAULT 0, + `icon` int(2) NOT NULL DEFAULT 0, + `perks` varchar(500) NOT NULL DEFAULT '', + `ip` longtext DEFAULT NULL, + `mac` longtext DEFAULT NULL, + `serial` longtext DEFAULT NULL, + `computerName` varchar(2000) NOT NULL DEFAULT '', + `monthlyVotes` int(11) NOT NULL DEFAULT 0, + `netWorth` bigint(200) NOT NULL DEFAULT 0, + `forumUID` int(11) NOT NULL DEFAULT -1, + `ironManMode` varchar(15) NOT NULL DEFAULT 'NONE', + `bank` longtext DEFAULT NULL, + `inventory` longtext DEFAULT NULL, + `equipment` longtext DEFAULT NULL, + `ge` longtext DEFAULT NULL, + `muteTime` bigint(20) NOT NULL DEFAULT -1, + `banTime` bigint(20) NOT NULL DEFAULT -1, + `profileImage` varchar(300) DEFAULT NULL, + `contacts` longtext DEFAULT NULL, + `blocked` longtext DEFAULT NULL, + `clanName` varchar(15) NOT NULL DEFAULT '', + `currentClan` varchar(15) DEFAULT NULL, + `clanReqs` varchar(10) NOT NULL DEFAULT '1,0,8,9', + `disconnectTime` bigint(20) NOT NULL DEFAULT 0, + `lastWorld` int(3) NOT NULL DEFAULT -1, + `chatSettings` varchar(10) NOT NULL DEFAULT '0,0,0', + `timePlayed` bigint(20) DEFAULT 0, + `lastLogin` bigint(20) NOT NULL DEFAULT 0, + `lastGameIp` varchar(15) DEFAULT '', + `countryCode` int(11) NOT NULL DEFAULT 0, + `birthday` date DEFAULT NULL, + `online` tinyint(1) NOT NULL DEFAULT 0, + `signature` longtext DEFAULT NULL, + `joined_date` timestamp NULL DEFAULT NULL, + `posts` int(11) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `members` +-- + +INSERT INTO `members` (`UID`, `email`, `username`, `password`, `salt`, `rights`, `email_activated`, `lastActive`, `donatorType`, `donationTotal`, `credits`, `icon`, `perks`, `ip`, `mac`, `serial`, `computerName`, `monthlyVotes`, `netWorth`, `forumUID`, `ironManMode`, `bank`, `inventory`, `equipment`, `ge`, `muteTime`, `banTime`, `profileImage`, `contacts`, `blocked`, `clanName`, `currentClan`, `clanReqs`, `disconnectTime`, `lastWorld`, `chatSettings`, `timePlayed`, `lastLogin`, `lastGameIp`, `countryCode`, `birthday`, `online`, `signature`, `joined_date`, `posts`) VALUES +(0, '', '2009Scape', '$2a$12$P0OU2A5S.lEYdkTq5kq3/u1UlfVkMYIS7WWbxsjjeyfxqTDbygpEe', '$2a$12$P0OU2A5S.lEYdkTq5kq3/u', 2, 0, '2019-11-06 00:29:03', 0, 0.00, 0, 0, '', '127.0.0.1', NULL, NULL, 'SERVER', 0, 0, -1, 'STANDARD', NULL, NULL, NULL, NULL, -1, -1, '', '', '', '2009Scape', '2009Scape', '0,0,8,9', 1572999889084, 1, '0,0,0', NULL, 1572999890885, '127.0.0.1', 0, NULL, 0, NULL, NULL, 0); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `messages` +-- + +CREATE TABLE `messages` ( + `id` int(11) UNSIGNED NOT NULL, + `sender` varchar(15) NOT NULL DEFAULT '', + `recipient` varchar(15) NOT NULL DEFAULT '', + `subject` varchar(40) NOT NULL DEFAULT '', + `content` longtext NOT NULL, + `date` timestamp NOT NULL DEFAULT current_timestamp(), + `is_read` tinyint(1) NOT NULL, + `s_delete` tinyint(11) NOT NULL, + `r_delete` tinyint(1) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `perks` +-- + +CREATE TABLE `perks` ( + `product_id` int(10) UNSIGNED NOT NULL, + `name` varchar(100) NOT NULL DEFAULT 'No Name', + `description` varchar(500) DEFAULT NULL, + `price` int(10) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `perks` +-- + +INSERT INTO `perks` (`product_id`, `name`, `description`, `price`) VALUES +(2, 'Stamina Boost', 'Increase your stamina and run regeneration by a total of 40%.', 60), +(4, 'Green Thumb', 'With a 35% lifetime increase in your crops growing up healthy, they will be saved and you will also receive a better crop yield!', 100), +(5, 'Bird Man', 'Increase your rate of receiving a bird nest drop by 35%!', 50), +(6, 'Stoner', 'Increase your rate of receiving a gem stone drop by 35%!', 50), +(11, 'Unbreakable Forge', 'Ring of forging never breaks.', 30), +(12, 'Out of Grave Danger', 'Your gravestone will last up to twice as long with this perk.', 50), +(13, 'Sleight of Hand', 'With sleight of hand you will increase your success rates in all aspects of thieving. This includes pickpocketing and cracking wall safes for gems.', 50), +(14, 'Master Chef', 'As a soon to be Master Chef, you will receive a 20% increase in successfully cooking your food!', 50), +(16, 'Divine Intervention', 'The gods above intervene with your burying of bones. You have a 10% chance while burying a bone to keep it instead.', 70), +(17, 'Familiar Whisperer', 'Get to know your familiar better by increasing their lifespan by 50%.', 70), +(18, 'Barrows Befriender', 'Befriend the barrows brothers & never experience the wretched degrading of their armour again', 300), +(19, 'Abyss Befriender', 'Use the power of the abyss to make your Runecrafting pouches undegradable.', 150), +(21, 'Charge Befriender', 'The God\'s of the Hero\'s guild have blessed you with the power to use your jewerly free of charge.', 250), +(22, 'Golden Needle', 'Gain an extra 10% experience whilst spinning something on a spinning wheel, including flax. Creating an item made out of dragonhide rewards an extra 5% experience. Your crafting needle also never breaks and thread is consumed less often.\n', 50), +(24, 'Slayer Betrayer', 'Obtain the ability through the Slayer Masters to change your slayer task at will. Type ::cleartask to use.', 100), +(26, 'Thirst Quencher', 'The gods have blessed you with the knowledge of the deserts to gain the skills required to tap into an unlimited water supply.', 30), +(27, 'Double Trouble', 'Experience a chance of receiving double the resources through skills such as, mining, woodcutting, fishing, and many more.', 250), +(29, 'Godwars Befriender', 'Now blessed by the gods you have the ability to enter the chambers with a killcount of 30. You will also be granted half the time it takes to recharge at an altar.', 100), +(30, 'Prayer Betrayer', 'Experience half the prayer drain rate when this perk is enabled.', 150), +(31, 'Spell Swap', 'The ability to swap spell books without any charge of runes. Cannot be used in combat or in the wilderness.', 80), +(32, 'Dwarf Befriender', 'Befriended by the dwarfs you now have the ability to use double the cannon balls and experience no decay on your cannon.', 150), +(33, 'Powerpoint', 'This perk grants you double the points in all minigames.', 300), +(35, 'Charm Collector', 'Through the power of summoning you will automatically pick up any charms dropped in battle.', 100), +(36, 'Detective', 'You now have a solid 10% chance of a clue scroll drop from any monster that drops clues as well as a 50% better chance of super rare rewards such as 3rd age. You\'ll also experience a 50% increased chance to obtain more loot.', 250), +(40, 'Overcharge', 'The power from the overcharge lords is given to you. Your Dragonfire Shield will recharge fully every 10 minutes. The time between casts is also reduced by 50%.', 170), +(41, 'Unbreakable Crystal', 'This perk allows for your crystal bow to never degrade.', 350), +(42, 'Crusader', 'With this perk you will have a 25% chance to double loot the barrows chest.', 100), +(43, 'Pet Befriender', 'This perk gives you the ability to double your chances on getting boss/skilling pets!', 100), +(60, 'Bone Crusher', 'Automatically crushes your bones as they\'re dropped for prayer experience. Toggle this perk using ::bonecrusher', 100), +(70, 'Runestone Knowledge', 'You are given extended knowledge of the runecrafting skill and can now craft double death, law, cosmic, blood and nature runes.', 200), +(71, 'Coin machine', 'Automatically bank all coins dropped from NPC\'s and gives you 25% extra gold. Toggle this perk using ::coinmachine', 150), +(72, 'Fight Cave Fanatic', 'Eliminates the first 25 waves from the tzhaar fight caves.', 50), +(73, 'Decanter', 'Zahur will decant your noted potions if you have this perk.', 50); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `player_logs` +-- + +CREATE TABLE `player_logs` ( + `username` varchar(22) NOT NULL DEFAULT '', + `public_chat` longtext DEFAULT NULL, + `private_chat` longtext DEFAULT NULL, + `clan_chat` longtext DEFAULT NULL, + `address_log` longtext DEFAULT NULL, + `command_log` longtext DEFAULT NULL, + `trade_log` longtext DEFAULT NULL, + `ge_log` longtext DEFAULT NULL, + `duplication_log` longtext DEFAULT NULL, + `duel_log` longtext DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `player_logs` +-- + +INSERT INTO `player_logs` (`username`, `public_chat`, `private_chat`, `clan_chat`, `address_log`, `command_log`, `trade_log`, `ge_log`, `duplication_log`, `duel_log`) VALUES +('test', '', '', '', '10/09/2020 14:44:20: 127.0.0.1\n10/09/2020 14:44:20: I116264190\n10/09/2020 14:44:20: 30-9C-23-87-89-8E\n10/09/2020 14:47:49: 127.0.0.1\n10/09/2020 14:47:49: I116264190\n10/09/2020 14:47:49: 30-9C-23-87-89-8E\n10/09/2020 16:26:44: 127.0.0.1\n10/09/2020 16:26:44: I116264190\n10/09/2020 16:26:44: 30-9C-23-87-89-8E\n', '', '', '', '', ''), +('woah', '10/09/2020 14:35:41: a\\\n10/09/2020 14:47:59: a\n10/09/2020 16:26:56: ok\n', '', '', '10/09/2020 14:34:50: 127.0.0.1\n10/09/2020 14:34:50: I116264190\n10/09/2020 14:34:50: 30-9C-23-87-89-8E\n10/09/2020 14:37:33: 127.0.0.1\n10/09/2020 14:37:33: I116264190\n10/09/2020 14:37:33: 30-9C-23-87-89-8E\n10/09/2020 14:39:09: 127.0.0.1\n10/09/2020 14:39:09: I116264190\n10/09/2020 14:39:09: 30-9C-23-87-89-8E\n10/09/2020 14:41:11: 127.0.0.1\n10/09/2020 14:41:11: I116264190\n10/09/2020 14:41:11: 30-9C-23-87-89-8E\n10/09/2020 14:47:23: 127.0.0.1\n10/09/2020 14:47:23: I116264190\n10/09/2020 14:47:23: 30-9C-23-87-89-8E\n10/09/2020 16:26:23: 127.0.0.1\n10/09/2020 16:26:23: I116264190\n10/09/2020 16:26:23: 30-9C-23-87-89-8E\n10/09/2020 16:35:53: 127.0.0.1\n10/09/2020 16:35:53: I116264190\n10/09/2020 16:35:53: 30-9C-23-87-89-8E\n10/09/2020 17:43:03: 127.0.0.1\n10/09/2020 17:43:03: I116264190\n10/09/2020 17:43:03: 30-9C-23-87-89-8E\n10/09/2020 18:16:22: 127.0.0.1\n10/09/2020 18:16:22: I116264190\n10/09/2020 18:16:22: 30-9C-23-87-89-8E\n10/09/2020 18:24:25: 127.0.0.1\n10/09/2020 18:24:25: I116264190\n10/09/2020 18:24:25: 30-9C-23-87-89-8E\n10/09/2020 18:25:02: 127.0.0.1\n10/09/2020 18:25:02: I116264190\n10/09/2020 18:25:02: 30-9C-23-87-89-8E\n10/09/2020 18:27:39: 127.0.0.1\n10/09/2020 18:27:39: I116264190\n10/09/2020 18:27:39: 30-9C-23-87-89-8E\n10/09/2020 18:28:28: 127.0.0.1\n10/09/2020 18:28:28: I116264190\n10/09/2020 18:28:28: 30-9C-23-87-89-8E\n10/09/2020 18:31:56: 127.0.0.1\n10/09/2020 18:31:56: I116264190\n10/09/2020 18:31:56: 30-9C-23-87-89-8E\n10/09/2020 18:34:27: 127.0.0.1\n10/09/2020 18:34:27: I116264190\n10/09/2020 18:34:27: 30-9C-23-87-89-8E\n10/09/2020 18:36:06: 127.0.0.1\n10/09/2020 18:36:06: I116264190\n10/09/2020 18:36:06: 30-9C-23-87-89-8E\n10/09/2020 18:37:02: 127.0.0.1\n10/09/2020 18:37:02: I116264190\n10/09/2020 18:37:02: 30-9C-23-87-89-8E\n10/09/2020 18:40:32: 127.0.0.1\n10/09/2020 18:40:32: I116264190\n10/09/2020 18:40:32: 30-9C-23-87-89-8E\n10/09/2020 18:41:16: 127.0.0.1\n10/09/2020 18:41:16: I116264190\n10/09/2020 18:41:16: 30-9C-23-87-89-8E\n10/09/2020 18:43:15: 127.0.0.1\n10/09/2020 18:43:15: I116264190\n10/09/2020 18:43:15: 30-9C-23-87-89-8E\n10/09/2020 18:43:58: 127.0.0.1\n10/09/2020 18:43:58: I116264190\n10/09/2020 18:43:58: 30-9C-23-87-89-8E\n10/09/2020 18:47:42: 127.0.0.1\n10/09/2020 18:47:42: I116264190\n10/09/2020 18:47:42: 30-9C-23-87-89-8E\n10/09/2020 18:49:57: 127.0.0.1\n10/09/2020 18:49:57: I116264190\n10/09/2020 18:49:57: 30-9C-23-87-89-8E\n10/09/2020 18:52:37: 127.0.0.1\n10/09/2020 18:52:37: I116264190\n10/09/2020 18:52:37: 30-9C-23-87-89-8E\n10/09/2020 23:12:58: 127.0.0.1\n10/09/2020 23:12:58: I116264190\n10/09/2020 23:12:58: 30-9C-23-87-89-8E\n10/09/2020 23:34:19: 127.0.0.1\n10/09/2020 23:34:19: I116264190\n10/09/2020 23:34:19: 30-9C-23-87-89-8E\n11/09/2020 00:07:46: 127.0.0.1\n11/09/2020 00:07:46: I116264190\n11/09/2020 00:07:46: 30-9C-23-87-89-8E\n11/09/2020 00:19:46: 127.0.0.1\n11/09/2020 00:19:46: I116264190\n11/09/2020 00:19:46: 30-9C-23-87-89-8E\n11/09/2020 01:25:54: 127.0.0.1\n11/09/2020 01:25:54: I116264190\n11/09/2020 01:25:54: 30-9C-23-87-89-8E\n11/09/2020 01:27:54: 127.0.0.1\n11/09/2020 01:27:54: I116264190\n11/09/2020 01:27:54: 30-9C-23-87-89-8E\n11/09/2020 02:59:49: 127.0.0.1\n11/09/2020 02:59:49: I116264190\n11/09/2020 02:59:49: 30-9C-23-87-89-8E\n11/09/2020 03:02:43: 127.0.0.1\n11/09/2020 03:02:43: I116264190\n11/09/2020 03:02:43: 30-9C-23-87-89-8E\n11/09/2020 03:04:45: 127.0.0.1\n11/09/2020 03:04:45: I116264190\n11/09/2020 03:04:45: 30-9C-23-87-89-8E\n12/09/2020 14:53:16: 127.0.0.1\n12/09/2020 14:53:16: I116264190\n12/09/2020 14:53:16: 30-9C-23-87-89-8E\n13/09/2020 14:36:17: 127.0.0.1\n13/09/2020 14:36:17: I116264190\n13/09/2020 14:36:17: 30-9C-23-87-89-8E\n13/09/2020 14:40:43: 127.0.0.1\n13/09/2020 14:40:43: I116264190\n13/09/2020 14:40:43: 30-9C-23-87-89-8E\n13/09/2020 15:09:39: 127.0.0.1\n13/09/2020 15:09:39: I116264190\n13/09/2020 15:09:39: 30-9C-23-87-89-8E\n13/09/2020 15:12:22: 127.0.0.1\n13/09/2020 15:12:22: I116264190\n13/09/2020 15:12:22: 30-9C-23-87-89-8E\n13/09/2020 15:19:02: 127.0.0.1\n13/09/2020 15:19:02: I116264190\n13/09/2020 15:19:02: 30-9C-23-87-89-8E\n13/09/2020 15:22:49: 127.0.0.1\n13/09/2020 15:22:49: I116264190\n13/09/2020 15:22:49: 30-9C-23-87-89-8E\n13/09/2020 15:24:30: 127.0.0.1\n13/09/2020 15:24:30: I116264190\n13/09/2020 15:24:30: 30-9C-23-87-89-8E\n13/09/2020 15:26:58: 127.0.0.1\n13/09/2020 15:26:58: I116264190\n13/09/2020 15:26:58: 30-9C-23-87-89-8E\n13/09/2020 15:30:47: 127.0.0.1\n13/09/2020 15:30:47: I116264190\n13/09/2020 15:30:47: 30-9C-23-87-89-8E\n13/09/2020 15:32:57: 127.0.0.1\n13/09/2020 15:32:57: I116264190\n13/09/2020 15:32:57: 30-9C-23-87-89-8E\n13/09/2020 15:56:59: 127.0.0.1\n13/09/2020 15:56:59: I116264190\n13/09/2020 15:56:59: 30-9C-23-87-89-8E\n13/09/2020 15:58:11: 127.0.0.1\n13/09/2020 15:58:11: I116264190\n13/09/2020 15:58:11: 30-9C-23-87-89-8E\n13/09/2020 15:58:49: 127.0.0.1\n13/09/2020 15:58:49: I116264190\n13/09/2020 15:58:49: 30-9C-23-87-89-8E\n13/09/2020 15:59:48: 127.0.0.1\n13/09/2020 15:59:48: I116264190\n13/09/2020 15:59:48: 30-9C-23-87-89-8E\n13/09/2020 16:00:36: 127.0.0.1\n13/09/2020 16:00:36: I116264190\n13/09/2020 16:00:36: 30-9C-23-87-89-8E\n13/09/2020 16:01:43: 127.0.0.1\n13/09/2020 16:01:43: I116264190\n13/09/2020 16:01:43: 30-9C-23-87-89-8E\n13/09/2020 16:03:42: 127.0.0.1\n13/09/2020 16:03:42: I116264190\n13/09/2020 16:03:42: 30-9C-23-87-89-8E\n13/09/2020 16:04:10: 127.0.0.1\n13/09/2020 16:04:10: I116264190\n13/09/2020 16:04:10: 30-9C-23-87-89-8E\n13/09/2020 16:05:40: 127.0.0.1\n13/09/2020 16:05:40: I116264190\n13/09/2020 16:05:40: 30-9C-23-87-89-8E\n13/09/2020 16:08:10: 127.0.0.1\n13/09/2020 16:08:10: I116264190\n13/09/2020 16:08:10: 30-9C-23-87-89-8E\n13/09/2020 16:09:45: 127.0.0.1\n13/09/2020 16:09:45: I116264190\n13/09/2020 16:09:45: 30-9C-23-87-89-8E\n13/09/2020 16:13:04: 127.0.0.1\n13/09/2020 16:13:04: I116264190\n13/09/2020 16:13:04: 30-9C-23-87-89-8E\n13/09/2020 16:13:59: 127.0.0.1\n13/09/2020 16:13:59: I116264190\n13/09/2020 16:13:59: 30-9C-23-87-89-8E\n13/09/2020 16:15:20: 127.0.0.1\n13/09/2020 16:15:20: I116264190\n13/09/2020 16:15:20: 30-9C-23-87-89-8E\n13/09/2020 16:16:08: 127.0.0.1\n13/09/2020 16:16:08: I116264190\n13/09/2020 16:16:08: 30-9C-23-87-89-8E\n13/09/2020 16:25:07: 127.0.0.1\n13/09/2020 16:25:07: I116264190\n13/09/2020 16:25:07: 30-9C-23-87-89-8E\n13/09/2020 16:28:18: 127.0.0.1\n13/09/2020 16:28:18: I116264190\n13/09/2020 16:28:18: 30-9C-23-87-89-8E\n13/09/2020 16:28:50: 127.0.0.1\n13/09/2020 16:28:50: I116264190\n13/09/2020 16:28:50: 30-9C-23-87-89-8E\n13/09/2020 16:29:28: 127.0.0.1\n13/09/2020 16:29:28: I116264190\n13/09/2020 16:29:28: 30-9C-23-87-89-8E\n13/09/2020 16:30:13: 127.0.0.1\n13/09/2020 16:30:13: I116264190\n13/09/2020 16:30:13: 30-9C-23-87-89-8E\n13/09/2020 16:31:05: 127.0.0.1\n13/09/2020 16:31:05: I116264190\n13/09/2020 16:31:05: 30-9C-23-87-89-8E\n13/09/2020 16:31:32: 127.0.0.1\n13/09/2020 16:31:32: I116264190\n13/09/2020 16:31:32: 30-9C-23-87-89-8E\n13/09/2020 16:32:06: 127.0.0.1\n13/09/2020 16:32:06: I116264190\n13/09/2020 16:32:06: 30-9C-23-87-89-8E\n13/09/2020 16:32:43: 127.0.0.1\n13/09/2020 16:32:43: I116264190\n13/09/2020 16:32:43: 30-9C-23-87-89-8E\n13/09/2020 16:33:31: 127.0.0.1\n13/09/2020 16:33:31: I116264190\n13/09/2020 16:33:31: 30-9C-23-87-89-8E\n13/09/2020 16:37:08: 127.0.0.1\n13/09/2020 16:37:08: I116264190\n13/09/2020 16:37:08: 30-9C-23-87-89-8E\n13/09/2020 16:38:23: 127.0.0.1\n13/09/2020 16:38:23: I116264190\n13/09/2020 16:38:23: 30-9C-23-87-89-8E\n13/09/2020 16:44:09: 127.0.0.1\n13/09/2020 16:44:09: I116264190\n13/09/2020 16:44:09: 30-9C-23-87-89-8E\n13/09/2020 17:01:49: 127.0.0.1\n13/09/2020 17:01:49: I116264190\n13/09/2020 17:01:49: 30-9C-23-87-89-8E\n13/09/2020 17:05:31: 127.0.0.1\n13/09/2020 17:05:31: I116264190\n13/09/2020 17:05:31: 30-9C-23-87-89-8E\n13/09/2020 17:10:08: 127.0.0.1\n13/09/2020 17:10:08: I116264190\n13/09/2020 17:10:08: 30-9C-23-87-89-8E\n13/09/2020 17:30:56: 127.0.0.1\n13/09/2020 17:30:56: I116264190\n13/09/2020 17:30:56: 30-9C-23-87-89-8E\n13/09/2020 17:35:02: 127.0.0.1\n13/09/2020 17:35:02: I116264190\n13/09/2020 17:35:02: 30-9C-23-87-89-8E\n13/09/2020 17:42:08: 127.0.0.1\n13/09/2020 17:42:08: I116264190\n13/09/2020 17:42:08: 30-9C-23-87-89-8E\n13/09/2020 17:42:27: 127.0.0.1\n13/09/2020 17:42:27: I116264190\n13/09/2020 17:42:27: 30-9C-23-87-89-8E\n13/09/2020 17:45:59: 127.0.0.1\n13/09/2020 17:45:59: I116264190\n13/09/2020 17:45:59: 30-9C-23-87-89-8E\n13/09/2020 17:46:47: 127.0.0.1\n13/09/2020 17:46:47: I116264190\n13/09/2020 17:46:47: 30-9C-23-87-89-8E\n13/09/2020 17:47:45: 127.0.0.1\n13/09/2020 17:47:45: I116264190\n13/09/2020 17:47:45: 30-9C-23-87-89-8E\n13/09/2020 17:49:22: 127.0.0.1\n13/09/2020 17:49:22: I116264190\n13/09/2020 17:49:22: 30-9C-23-87-89-8E\n13/09/2020 17:50:34: 127.0.0.1\n13/09/2020 17:50:34: I116264190\n13/09/2020 17:50:34: 30-9C-23-87-89-8E\n13/09/2020 17:52:50: 127.0.0.1\n13/09/2020 17:52:50: I116264190\n13/09/2020 17:52:50: 30-9C-23-87-89-8E\n13/09/2020 17:53:55: 127.0.0.1\n13/09/2020 17:53:55: I116264190\n13/09/2020 17:53:55: 30-9C-23-87-89-8E\n13/09/2020 18:06:04: 127.0.0.1\n13/09/2020 18:06:04: I116264190\n13/09/2020 18:06:04: 30-9C-23-87-89-8E\n13/09/2020 18:20:49: 127.0.0.1\n13/09/2020 18:20:49: I116264190\n13/09/2020 18:20:49: 30-9C-23-87-89-8E\n13/09/2020 18:22:42: 127.0.0.1\n13/09/2020 18:22:42: I116264190\n13/09/2020 18:22:42: 30-9C-23-87-89-8E\n13/09/2020 18:23:26: 127.0.0.1\n13/09/2020 18:23:26: I116264190\n13/09/2020 18:23:26: 30-9C-23-87-89-8E\n13/09/2020 18:29:24: 127.0.0.1\n13/09/2020 18:29:24: I116264190\n13/09/2020 18:29:24: 30-9C-23-87-89-8E\n13/09/2020 18:31:57: 127.0.0.1\n13/09/2020 18:31:57: I116264190\n13/09/2020 18:31:57: 30-9C-23-87-89-8E\n13/09/2020 18:32:52: 127.0.0.1\n13/09/2020 18:32:52: I116264190\n13/09/2020 18:32:52: 30-9C-23-87-89-8E\n13/09/2020 18:34:00: 127.0.0.1\n13/09/2020 18:34:00: I116264190\n13/09/2020 18:34:00: 30-9C-23-87-89-8E\n13/09/2020 18:34:58: 127.0.0.1\n13/09/2020 18:34:58: I116264190\n13/09/2020 18:34:58: 30-9C-23-87-89-8E\n13/09/2020 18:36:05: 127.0.0.1\n13/09/2020 18:36:05: I116264190\n13/09/2020 18:36:05: 30-9C-23-87-89-8E\n13/09/2020 19:17:14: 127.0.0.1\n13/09/2020 19:17:14: I116264190\n13/09/2020 19:17:14: 30-9C-23-87-89-8E\n13/09/2020 19:20:53: 127.0.0.1\n13/09/2020 19:20:53: I116264190\n13/09/2020 19:20:53: 30-9C-23-87-89-8E\n13/09/2020 19:22:35: 127.0.0.1\n13/09/2020 19:22:35: I116264190\n13/09/2020 19:22:35: 30-9C-23-87-89-8E\n13/09/2020 19:29:15: 127.0.0.1\n13/09/2020 19:29:15: I116264190\n13/09/2020 19:29:15: 30-9C-23-87-89-8E\n14/09/2020 14:20:25: 127.0.0.1\n14/09/2020 14:20:25: I116264190\n14/09/2020 14:20:25: 30-9C-23-87-89-8E\n14/09/2020 18:02:16: 127.0.0.1\n14/09/2020 18:02:16: I116264190\n14/09/2020 18:02:16: 30-9C-23-87-89-8E\n14/09/2020 18:03:29: 127.0.0.1\n14/09/2020 18:03:29: I116264190\n14/09/2020 18:03:29: 30-9C-23-87-89-8E\n14/09/2020 19:42:55: 127.0.0.1\n14/09/2020 19:42:55: I116264190\n14/09/2020 19:42:55: 30-9C-23-87-89-8E\n14/09/2020 19:57:58: 127.0.0.1\n14/09/2020 19:57:58: I116264190\n14/09/2020 19:57:58: 30-9C-23-87-89-8E\n14/09/2020 20:06:45: 127.0.0.1\n14/09/2020 20:06:45: I116264190\n14/09/2020 20:06:45: 30-9C-23-87-89-8E\n14/09/2020 20:30:56: 127.0.0.1\n14/09/2020 20:30:56: I116264190\n14/09/2020 20:30:56: 30-9C-23-87-89-8E\n14/09/2020 22:35:50: 127.0.0.1\n14/09/2020 22:35:50: I116264190\n14/09/2020 22:35:50: 30-9C-23-87-89-8E\n14/09/2020 23:07:10: 127.0.0.1\n14/09/2020 23:07:10: I116264190\n14/09/2020 23:07:10: 30-9C-23-87-89-8E\n14/09/2020 23:08:26: 127.0.0.1\n14/09/2020 23:08:26: I116264190\n14/09/2020 23:08:26: 30-9C-23-87-89-8E\n14/09/2020 23:50:43: 127.0.0.1\n14/09/2020 23:50:43: I116264190\n14/09/2020 23:50:43: 30-9C-23-87-89-8E\n15/09/2020 00:46:43: 127.0.0.1\n15/09/2020 00:46:43: I116264190\n15/09/2020 00:46:43: 30-9C-23-87-89-8E\n15/09/2020 11:52:20: 127.0.0.1\n15/09/2020 11:52:20: I116264190\n15/09/2020 11:52:20: 30-9C-23-87-89-8E\n15/09/2020 11:52:50: 127.0.0.1\n15/09/2020 11:52:50: I116264190\n15/09/2020 11:52:50: 30-9C-23-87-89-8E\n15/09/2020 11:55:21: 127.0.0.1\n15/09/2020 11:55:21: I116264190\n15/09/2020 11:55:21: 30-9C-23-87-89-8E\n15/09/2020 11:57:58: 127.0.0.1\n15/09/2020 11:57:58: I116264190\n15/09/2020 11:57:58: 30-9C-23-87-89-8E\n15/09/2020 12:03:43: 127.0.0.1\n15/09/2020 12:03:43: I116264190\n15/09/2020 12:03:43: 30-9C-23-87-89-8E\n15/09/2020 12:39:29: 127.0.0.1\n15/09/2020 12:39:29: I116264190\n15/09/2020 12:39:29: 30-9C-23-87-89-8E\n15/09/2020 12:56:16: 127.0.0.1\n15/09/2020 12:56:16: I116264190\n15/09/2020 12:56:16: 30-9C-23-87-89-8E\n15/09/2020 12:57:18: 127.0.0.1\n15/09/2020 12:57:18: I116264190\n15/09/2020 12:57:18: 30-9C-23-87-89-8E\n15/09/2020 13:31:06: 127.0.0.1\n15/09/2020 13:31:06: I116264190\n15/09/2020 13:31:06: 30-9C-23-87-89-8E\n15/09/2020 13:47:47: 127.0.0.1\n15/09/2020 13:47:47: I116264190\n15/09/2020 13:47:47: 30-9C-23-87-89-8E\n17/09/2020 11:29:59: 127.0.0.1\n17/09/2020 11:29:59: I116264190\n17/09/2020 11:29:59: 30-9C-23-87-89-8E\n17/09/2020 11:36:42: 127.0.0.1\n17/09/2020 11:36:42: I116264190\n17/09/2020 11:36:42: 30-9C-23-87-89-8E\n17/09/2020 11:39:14: 127.0.0.1\n17/09/2020 11:39:14: I116264190\n17/09/2020 11:39:14: 30-9C-23-87-89-8E\n17/09/2020 13:13:51: 127.0.0.1\n17/09/2020 13:13:51: I116264190\n17/09/2020 13:13:51: 30-9C-23-87-89-8E\n17/09/2020 13:55:19: 127.0.0.1\n17/09/2020 13:55:19: I116264190\n17/09/2020 13:55:19: 30-9C-23-87-89-8E\n17/09/2020 14:02:32: 127.0.0.1\n17/09/2020 14:02:32: I116264190\n17/09/2020 14:02:32: 30-9C-23-87-89-8E\n17/09/2020 14:46:02: 127.0.0.1\n17/09/2020 14:46:02: I116264190\n17/09/2020 14:46:02: 30-9C-23-87-89-8E\n17/09/2020 14:47:08: 127.0.0.1\n17/09/2020 14:47:08: I116264190\n17/09/2020 14:47:08: 30-9C-23-87-89-8E\n17/09/2020 14:50:18: 127.0.0.1\n17/09/2020 14:50:18: I116264190\n17/09/2020 14:50:18: 30-9C-23-87-89-8E\n17/09/2020 14:51:26: 127.0.0.1\n17/09/2020 14:51:26: I116264190\n17/09/2020 14:51:26: 30-9C-23-87-89-8E\n17/09/2020 14:51:59: 127.0.0.1\n17/09/2020 14:51:59: I116264190\n17/09/2020 14:51:59: 30-9C-23-87-89-8E\n17/09/2020 14:52:35: 127.0.0.1\n17/09/2020 14:52:35: I116264190\n17/09/2020 14:52:35: 30-9C-23-87-89-8E\n17/09/2020 14:53:13: 127.0.0.1\n17/09/2020 14:53:13: I116264190\n17/09/2020 14:53:13: 30-9C-23-87-89-8E\n17/09/2020 14:53:53: 127.0.0.1\n17/09/2020 14:53:53: I116264190\n17/09/2020 14:53:53: 30-9C-23-87-89-8E\n17/09/2020 14:55:00: 127.0.0.1\n17/09/2020 14:55:00: I116264190\n17/09/2020 14:55:00: 30-9C-23-87-89-8E\n17/09/2020 14:56:22: 127.0.0.1\n17/09/2020 14:56:22: I116264190\n17/09/2020 14:56:22: 30-9C-23-87-89-8E\n17/09/2020 14:56:50: 127.0.0.1\n17/09/2020 14:56:50: I116264190\n17/09/2020 14:56:50: 30-9C-23-87-89-8E\n17/09/2020 14:57:24: 127.0.0.1\n17/09/2020 14:57:24: I116264190\n17/09/2020 14:57:24: 30-9C-23-87-89-8E\n17/09/2020 14:58:46: 127.0.0.1\n17/09/2020 14:58:46: I116264190\n17/09/2020 14:58:46: 30-9C-23-87-89-8E\n17/09/2020 14:59:22: 127.0.0.1\n17/09/2020 14:59:22: I116264190\n17/09/2020 14:59:22: 30-9C-23-87-89-8E\n17/09/2020 15:17:34: 127.0.0.1\n17/09/2020 15:17:34: I116264190\n17/09/2020 15:17:34: 30-9C-23-87-89-8E\n17/09/2020 15:19:06: 127.0.0.1\n17/09/2020 15:19:06: I116264190\n17/09/2020 15:19:06: 30-9C-23-87-89-8E\n17/09/2020 15:22:03: 127.0.0.1\n17/09/2020 15:22:03: I116264190\n17/09/2020 15:22:03: 30-9C-23-87-89-8E\n17/09/2020 15:31:31: 127.0.0.1\n17/09/2020 15:31:31: I116264190\n17/09/2020 15:31:31: 30-9C-23-87-89-8E\n17/09/2020 15:32:17: 127.0.0.1\n17/09/2020 15:32:17: I116264190\n17/09/2020 15:32:17: 30-9C-23-87-89-8E\n17/09/2020 15:45:41: 127.0.0.1\n17/09/2020 15:45:41: I116264190\n17/09/2020 15:45:41: 30-9C-23-87-89-8E\n17/09/2020 15:48:10: 127.0.0.1\n17/09/2020 15:48:10: I116264190\n17/09/2020 15:48:10: 30-9C-23-87-89-8E\n17/09/2020 16:22:03: 127.0.0.1\n17/09/2020 16:22:03: I116264190\n17/09/2020 16:22:03: 30-9C-23-87-89-8E\n17/09/2020 16:32:12: 127.0.0.1\n17/09/2020 16:32:12: I116264190\n17/09/2020 16:32:12: 30-9C-23-87-89-8E\n17/09/2020 16:33:35: 127.0.0.1\n17/09/2020 16:33:35: I116264190\n17/09/2020 16:33:35: 30-9C-23-87-89-8E\n17/09/2020 16:45:15: 127.0.0.1\n17/09/2020 16:45:15: I116264190\n17/09/2020 16:45:15: 30-9C-23-87-89-8E\n17/09/2020 16:46:07: 127.0.0.1\n17/09/2020 16:46:07: I116264190\n17/09/2020 16:46:07: 30-9C-23-87-89-8E\n17/09/2020 16:54:58: 127.0.0.1\n17/09/2020 16:54:58: I116264190\n17/09/2020 16:54:58: 30-9C-23-87-89-8E\n17/09/2020 16:55:28: 127.0.0.1\n17/09/2020 16:55:28: I116264190\n17/09/2020 16:55:28: 30-9C-23-87-89-8E\n17/09/2020 16:55:57: 127.0.0.1\n17/09/2020 16:55:57: I116264190\n17/09/2020 16:55:57: 30-9C-23-87-89-8E\n17/09/2020 16:56:53: 127.0.0.1\n17/09/2020 16:56:53: I116264190\n17/09/2020 16:56:53: 30-9C-23-87-89-8E\n17/09/2020 16:58:16: 127.0.0.1\n17/09/2020 16:58:16: I116264190\n17/09/2020 16:58:16: 30-9C-23-87-89-8E\n17/09/2020 16:58:49: 127.0.0.1\n17/09/2020 16:58:49: I116264190\n17/09/2020 16:58:49: 30-9C-23-87-89-8E\n17/09/2020 16:59:37: 127.0.0.1\n17/09/2020 16:59:37: I116264190\n17/09/2020 16:59:37: 30-9C-23-87-89-8E\n17/09/2020 17:01:57: 127.0.0.1\n17/09/2020 17:01:57: I116264190\n17/09/2020 17:01:57: 30-9C-23-87-89-8E\n17/09/2020 17:02:46: 127.0.0.1\n17/09/2020 17:02:46: I116264190\n17/09/2020 17:02:46: 30-9C-23-87-89-8E\n17/09/2020 18:26:49: 127.0.0.1\n17/09/2020 18:26:49: I116264190\n17/09/2020 18:26:49: 30-9C-23-87-89-8E\n17/09/2020 18:53:22: 127.0.0.1\n17/09/2020 18:53:22: I116264190\n17/09/2020 18:53:22: 30-9C-23-87-89-8E\n17/09/2020 19:24:35: 127.0.0.1\n17/09/2020 19:24:35: I116264190\n17/09/2020 19:24:35: 30-9C-23-87-89-8E\n17/09/2020 19:33:51: 127.0.0.1\n17/09/2020 19:33:51: I116264190\n17/09/2020 19:33:51: 30-9C-23-87-89-8E\n17/09/2020 20:37:55: 127.0.0.1\n17/09/2020 20:37:55: I116264190\n17/09/2020 20:37:55: 30-9C-23-87-89-8E\n17/09/2020 21:03:04: 127.0.0.1\n17/09/2020 21:03:04: I116264190\n17/09/2020 21:03:04: 30-9C-23-87-89-8E\n17/09/2020 21:03:38: 127.0.0.1\n17/09/2020 21:03:38: I116264190\n17/09/2020 21:03:38: 30-9C-23-87-89-8E\n22/09/2020 12:34:31: 127.0.0.1\n22/09/2020 12:34:31: I116264190\n22/09/2020 12:34:31: 30-9C-23-87-89-8E\n22/09/2020 12:35:29: 127.0.0.1\n22/09/2020 12:35:29: I116264190\n22/09/2020 12:35:29: 30-9C-23-87-89-8E\n22/09/2020 12:37:35: 127.0.0.1\n22/09/2020 12:37:35: I116264190\n22/09/2020 12:37:35: 30-9C-23-87-89-8E\n23/09/2020 14:25:26: 127.0.0.1\n23/09/2020 14:25:26: I116264190\n23/09/2020 14:25:26: 30-9C-23-87-89-8E\n23/09/2020 14:31:33: 127.0.0.1\n23/09/2020 14:31:33: I116264190\n23/09/2020 14:31:33: 30-9C-23-87-89-8E\n23/09/2020 14:40:21: 127.0.0.1\n23/09/2020 14:40:21: I116264190\n23/09/2020 14:40:21: 30-9C-23-87-89-8E\n', '10/09/2020 14:47:28: tele 0,50,50,31,30\n10/09/2020 14:47:55: teleto test1\n10/09/2020 14:48:02: teleto test\n10/09/2020 14:48:05: tele 0,39,78,29,10\n10/09/2020 14:48:07: coords\n10/09/2020 14:48:47: coords\n10/09/2020 14:50:14: fpson\n10/09/2020 14:50:18: fpsoff\n10/09/2020 14:50:20: fpson\n10/09/2020 14:50:24: fpsoff\n10/09/2020 14:51:36: tele 0,49,61,57,27\n10/09/2020 14:51:41: tele 0,49,61,45,24\n10/09/2020 14:51:43: tele 0,49,61,44,40\n10/09/2020 14:51:45: tele 0,49,61,36,54\n10/09/2020 14:51:47: tele 0,49,61,20,57\n10/09/2020 14:51:50: tele 0,49,61,5,46\n10/09/2020 14:51:51: tele 0,48,61,55,39\n10/09/2020 14:51:53: tele 0,48,61,41,38\n10/09/2020 14:51:56: tele 0,48,61,44,51\n10/09/2020 14:51:57: tele 0,48,61,57,55\n10/09/2020 14:51:58: tele 0,49,61,8,51\n10/09/2020 14:51:59: tele 0,49,61,24,44\n10/09/2020 14:52:00: tele 0,49,61,39,38\n10/09/2020 14:52:01: tele 0,49,61,53,33\n10/09/2020 14:52:01: tele 0,50,61,2,26\n10/09/2020 14:52:02: tele 0,50,61,16,21\n10/09/2020 14:52:03: tele 0,50,61,30,17\n10/09/2020 14:52:10: tele 0,50,50,22,18\n10/09/2020 16:26:29: tele 0,50,50,32,27\n10/09/2020 16:26:50: teleto test\n10/09/2020 16:26:53: tele 0,39,78,29,10\n10/09/2020 16:27:02: mapfiles\n10/09/2020 16:30:00: tele 0,49,61,53,37\n10/09/2020 16:30:10: mapfiles\n10/09/2020 16:30:40: tele 0,49,61,40,37\n10/09/2020 16:30:41: tele 0,49,61,26,41\n10/09/2020 16:30:50: region\n10/09/2020 16:30:55: tele 0,49,61,10,43\n10/09/2020 16:30:57: tele 0,48,61,60,42\n10/09/2020 16:30:59: region\n10/09/2020 16:31:07: mapdata\n10/09/2020 16:31:19: mapfiles\n10/09/2020 16:35:59: tele 0,48,61,54,40\n10/09/2020 16:36:07: tele 0,48,61,50,45\n10/09/2020 16:36:08: tele 0,48,61,49,50\n10/09/2020 16:36:10: tele 0,48,61,42,51\n10/09/2020 16:36:11: tele 0,48,61,35,53\n10/09/2020 16:36:13: tele 0,48,61,38,50\n10/09/2020 16:36:14: tele 0,48,61,38,46\n10/09/2020 16:36:16: tele 0,48,61,53,44\n10/09/2020 16:36:16: tele 0,49,61,4,42\n10/09/2020 16:36:17: tele 0,49,61,15,44\n10/09/2020 16:36:18: tele 0,49,61,22,43\n10/09/2020 16:36:19: tele 0,49,61,19,31\n10/09/2020 16:36:20: tele 0,49,61,15,19\n10/09/2020 16:36:21: tele 0,49,61,18,7\n10/09/2020 16:36:23: tele 0,49,60,21,59\n10/09/2020 16:36:26: tele 0,49,60,25,46\n10/09/2020 16:36:29: tele 0,49,60,25,34\n10/09/2020 16:36:29: tele 0,49,60,25,22\n10/09/2020 16:36:31: tele 0,49,60,23,8\n10/09/2020 16:36:31: tele 0,49,59,23,59\n10/09/2020 16:36:34: tele 0,49,59,17,45\n10/09/2020 16:36:34: tele 0,49,59,13,31\n10/09/2020 16:36:35: tele 0,49,59,11,17\n10/09/2020 16:36:38: tele 0,49,59,11,3\n10/09/2020 16:36:39: tele 0,49,58,11,53\n10/09/2020 16:36:40: tele 0,49,58,10,45\n10/09/2020 16:36:43: tele 0,49,58,12,31\n10/09/2020 16:36:49: tele 0,50,59,2,42\n10/09/2020 16:36:56: tele 0,49,54,19,53\n10/09/2020 16:36:58: tele 0,49,54,21,43\n10/09/2020 16:37:00: tele 0,49,54,24,37\n10/09/2020 16:37:02: tele 0,49,54,23,33\n10/09/2020 17:43:17: tele 0,50,50,22,19\n10/09/2020 18:38:20: tele 0,51,50,8,27\n10/09/2020 18:39:23: tele 0,51,49,14,38\n10/09/2020 18:39:24: tele 0,51,49,13,53\n10/09/2020 18:39:25: tele 0,51,50,13,4\n10/09/2020 18:39:26: tele 0,51,50,13,19\n10/09/2020 18:39:27: tele 0,51,50,13,34\n10/09/2020 18:39:29: tele 0,51,50,22,47\n10/09/2020 18:40:36: tele 0,51,51,35,2\n10/09/2020 18:40:38: tele 0,51,50,47,59\n10/09/2020 18:40:42: tele 0,51,50,61,49\n10/09/2020 18:40:43: tele 0,52,50,11,49\n10/09/2020 18:40:43: tele 0,52,50,20,56\n10/09/2020 18:40:49: tele 0,52,50,37,55\n10/09/2020 18:40:50: tele 0,52,50,51,50\n10/09/2020 18:40:51: tele 0,52,50,55,39\n10/09/2020 18:42:01: tele 0,50,50,57,27\n10/09/2020 18:44:21: tele 0,50,51,37,42\n10/09/2020 18:49:07: fog\n10/09/2020 18:49:09: fogoff\n10/09/2020 18:49:11: nofog\n10/09/2020 18:49:12: fog\n10/09/2020 23:34:44: debug\n10/09/2020 23:35:03: home\n11/09/2020 00:08:03: debug\n11/09/2020 01:28:13: tele 0,50,50,35,16\n11/09/2020 01:28:16: tele 0,48,49,39,21\n11/09/2020 01:28:19: tele 1,48,49,39,21\n11/09/2020 01:28:20: tele 2,48,49,39,21\n11/09/2020 01:28:21: tele 2,48,49,38,23\n11/09/2020 01:28:54: tele 0,50,50,36,19\n11/09/2020 01:29:24: tele 0,50,50,23,16\n11/09/2020 01:29:26: tele 0,50,50,10,13\n11/09/2020 01:29:28: tele 1,50,50,10,13\n11/09/2020 01:29:30: tele 1,50,50,10,20\n11/09/2020 03:00:08: tele 0,50,50,19,18\n11/09/2020 03:00:09: tele 0,50,50,33,22\n12/09/2020 14:53:26: tele 0,46,51,16,8\n12/09/2020 14:53:37: tele 0,42,52,19,56\n12/09/2020 14:53:41: tele 0,42,52,15,55\n12/09/2020 14:53:54: debug\n12/09/2020 14:56:11: coords\n12/09/2020 14:56:40: tele 0,46,51,14,9\n12/09/2020 14:57:15: coords\n12/09/2020 14:57:35: tele 0,46,50,12,9\n12/09/2020 14:57:44: coords\n12/09/2020 14:57:55: tele 0,47,50,20,35\n12/09/2020 14:57:58: coords\n12/09/2020 14:58:07: tele 0,48,50,8,49\n12/09/2020 14:58:12: coords\n12/09/2020 14:59:33: empty\n12/09/2020 14:59:36: item 10498\n12/09/2020 14:59:48: item 10498\n12/09/2020 15:00:00: item 10499\n12/09/2020 15:01:32: item 13111\n12/09/2020 15:02:14: item 13170\n12/09/2020 15:03:32: item 1011\n12/09/2020 15:05:12: item 9944\n12/09/2020 15:05:14: item 9945\n12/09/2020 15:05:50: item 10863\n12/09/2020 15:06:44: tele 0,47,51,1,14\n12/09/2020 15:06:49: 1hko\n12/09/2020 15:07:16: tele 0,47,51,17,5\n12/09/2020 15:07:17: tele 0,47,50,31,59\n12/09/2020 15:07:17: tele 0,47,50,45,49\n12/09/2020 15:07:18: tele 0,47,50,60,46\n12/09/2020 15:07:19: tele 0,48,50,9,48\n12/09/2020 15:08:48: item 12645\n12/09/2020 15:09:42: item 7535\n12/09/2020 15:10:55: item 10607\n12/09/2020 15:11:02: item 6106\n12/09/2020 15:11:54: item 9470\n12/09/2020 15:15:20: empty\n12/09/2020 15:15:23: item 9096\n12/09/2020 15:15:26: item 9097\n12/09/2020 15:15:29: item 9098\n12/09/2020 15:15:31: item 9099\n12/09/2020 15:15:38: item 9100\n12/09/2020 15:15:42: item 9101\n12/09/2020 15:17:11: item 9068\n12/09/2020 15:17:29: item 9070\n12/09/2020 15:18:20: item 6067\n12/09/2020 15:18:27: item 6066\n12/09/2020 15:19:34: item 8952\n12/09/2020 15:19:43: item 13181\n12/09/2020 15:20:30: empty\n12/09/2020 15:21:31: item 2997\n12/09/2020 15:21:49: item 426\n12/09/2020 15:21:53: item 428\n12/09/2020 15:23:39: item 546\n12/09/2020 15:23:51: item 548\n12/09/2020 15:25:08: item 6335\n12/09/2020 15:25:11: item 6336\n12/09/2020 15:25:15: item 6337\n12/09/2020 15:26:30: empty\n12/09/2020 15:26:34: item 14076\n12/09/2020 15:26:37: item 14077\n12/09/2020 15:26:39: item 14081\n12/09/2020 15:28:06: item 14078\n12/09/2020 15:28:10: item 14079\n12/09/2020 15:28:13: item 14080\n12/09/2020 15:30:04: item 579\n12/09/2020 15:30:19: item 1017\n12/09/2020 15:30:47: item 7394\n12/09/2020 15:31:19: item 2898\n12/09/2020 15:33:22: item 6722\n12/09/2020 15:33:27: item 7592\n12/09/2020 15:34:27: npc 8207\n12/09/2020 15:34:35: npc 922\n12/09/2020 15:34:47: tele 0,48,50,18,54\n12/09/2020 15:34:49: tele 0,48,50,14,59\n12/09/2020 15:34:59: tele 0,48,50,5,48\n12/09/2020 15:36:04: npc 13172\n12/09/2020 15:36:11: npc 13173\n12/09/2020 15:36:28: npc 2634\n12/09/2020 15:36:33: tele 0,48,50,20,48\n12/09/2020 15:37:01: npc 755\n12/09/2020 15:37:06: tele 0,48,51,29,1\n12/09/2020 15:37:07: tele 0,48,51,27,4\n12/09/2020 15:37:19: tele 0,48,50,27,59\n12/09/2020 15:37:36: npc 2692\n12/09/2020 15:37:41: tele 0,48,50,14,60\n12/09/2020 15:37:42: tele 0,47,50,62,61\n12/09/2020 15:37:43: tele 0,47,50,46,62\n12/09/2020 15:37:44: tele 0,47,50,42,58\n12/09/2020 15:37:56: tele 0,47,50,29,55\n12/09/2020 15:37:57: tele 0,47,50,18,47\n12/09/2020 15:37:58: tele 0,47,50,6,58\n12/09/2020 15:38:13: tele 0,47,50,16,51\n12/09/2020 15:38:21: tele 0,47,50,28,54\n12/09/2020 15:38:22: tele 0,47,50,38,57\n12/09/2020 15:38:26: tele 0,47,50,38,47\n12/09/2020 15:38:42: npc 11700\n12/09/2020 15:38:48: npc 11703\n12/09/2020 15:39:02: tele 0,47,50,21,40\n12/09/2020 15:39:02: tele 0,47,50,5,33\n12/09/2020 15:39:04: tele 0,47,50,6,24\n12/09/2020 15:39:18: npc 556\n12/09/2020 15:39:23: tele 0,47,50,10,36\n12/09/2020 15:39:25: tele 0,47,50,4,47\n12/09/2020 15:39:34: tele 0,47,50,17,44\n12/09/2020 15:39:35: tele 0,47,50,28,46\n12/09/2020 15:39:36: tele 0,47,50,41,48\n12/09/2020 15:39:38: tele 0,47,50,39,57\n12/09/2020 15:40:03: pnpc 744\n12/09/2020 15:40:09: npc 744\n12/09/2020 15:40:14: tele 0,47,50,38,46\n12/09/2020 15:40:14: tele 0,47,50,40,36\n12/09/2020 15:40:15: tele 0,47,50,37,24\n12/09/2020 15:40:16: tele 0,47,50,31,13\n12/09/2020 15:40:18: tele 0,47,50,36,3\n12/09/2020 15:40:32: tele 0,46,50,14,3\n12/09/2020 15:40:55: tele 0,46,50,4,4\n12/09/2020 15:41:02: tele 0,46,50,5,15\n12/09/2020 15:41:21: tele 0,46,50,22,6\n12/09/2020 15:41:46: npc 557\n12/09/2020 15:41:54: tele 0,46,50,36,2\n12/09/2020 15:41:55: tele 0,46,49,50,62\n12/09/2020 15:41:56: tele 0,46,49,63,58\n12/09/2020 15:41:57: tele 0,47,50,6,5\n12/09/2020 15:42:23: pnpc 11705\n12/09/2020 15:42:26: pnpc -1\n12/09/2020 15:42:35: tele 0,47,50,16,17\n12/09/2020 15:42:36: tele 0,47,50,26,28\n12/09/2020 15:42:37: tele 0,47,50,35,39\n12/09/2020 15:42:38: tele 0,47,50,43,46\n12/09/2020 15:42:58: npc 2691\n12/09/2020 15:43:02: tele 0,47,50,44,56\n12/09/2020 15:43:47: pnpc 8078\n12/09/2020 15:47:02: obj 32034\n12/09/2020 15:47:10: tele 0,47,50,45,53\n12/09/2020 15:47:16: obj 32041\n12/09/2020 15:47:23: obj 32042\n12/09/2020 15:47:28: obj 32044\n12/09/2020 15:47:50: tele 0,42,52,17,54\n12/09/2020 15:48:02: obj 39240\n12/09/2020 15:48:12: tele 0,42,52,19,56\n12/09/2020 15:48:16: coords\n12/09/2020 15:48:20: tele 0,42,52,19,57\n12/09/2020 15:48:23: obj\n12/09/2020 15:48:25: coords\n12/09/2020 15:48:30: tele 0,42,52,20,58\n12/09/2020 15:48:34: coords\n12/09/2020 15:48:37: tele 0,42,52,15,56\n12/09/2020 15:48:49: coords\n13/09/2020 14:37:06: tele 0,47,50,63,57\n13/09/2020 14:37:07: tele 0,48,51,0,5\n13/09/2020 14:37:21: npc 922\n13/09/2020 14:37:54: npc 970\n13/09/2020 14:38:22: npc 3299\n13/09/2020 14:39:18: npc 2634\n13/09/2020 14:39:57: npc 755\n13/09/2020 14:55:45: npc 743\n13/09/2020 14:56:09: npc 2692\n13/09/2020 14:56:33: npc 583\n13/09/2020 14:58:18: npc 559\n13/09/2020 14:58:41: npc 558\n13/09/2020 14:59:02: npc 556\n13/09/2020 14:59:23: npc 2690\n13/09/2020 14:59:48: npc 744\n13/09/2020 15:00:14: npc 2691\n13/09/2020 15:00:42: npc 744\n13/09/2020 15:00:55: debug\n13/09/2020 15:01:03: npc 375\n13/09/2020 15:01:37: npc 557\n13/09/2020 15:02:06: npc 1860\n13/09/2020 15:02:36: npc 307\n13/09/2020 15:03:12: npc 585\n13/09/2020 15:03:38: npc 531\n13/09/2020 15:04:02: npc 530\n13/09/2020 15:10:31: debug\n13/09/2020 15:12:29: debug\n13/09/2020 15:12:39: npc 307\n13/09/2020 15:14:09: tele 0,48,51,1,17\n13/09/2020 15:19:10: tele 0,43,48,63,8\n13/09/2020 15:19:16: debug\n13/09/2020 15:19:48: remote 899\n13/09/2020 15:19:53: remote 900\n13/09/2020 15:19:56: remote 904\n13/09/2020 15:19:58: remote 902\n13/09/2020 15:20:05: remote901\n13/09/2020 15:20:07: remote 901\n13/09/2020 15:20:09: remote 900\n13/09/2020 15:21:32: remote 666\n13/09/2020 15:21:35: remote 688\n13/09/2020 15:21:38: remote 717\n13/09/2020 15:21:43: remote 718\n13/09/2020 15:21:47: remote 799\n13/09/2020 15:21:59: remote 682\n13/09/2020 15:22:04: remote 771\n13/09/2020 15:22:10: remote 814\n13/09/2020 15:22:18: remote 890\n13/09/2020 15:22:20: remote 883\n13/09/2020 15:23:49: tele 0,50,50,22,17\n13/09/2020 15:23:57: debug\n13/09/2020 15:27:24: pnpc 47\n13/09/2020 15:31:07: tele 0,42,52,15,51\n13/09/2020 15:31:12: debug\n13/09/2020 15:33:50: tele 0,42,52,14,56\n13/09/2020 15:35:33: empty\n13/09/2020 17:02:00: debug\n13/09/2020 17:03:53: item 995\n13/09/2020 17:35:27: debug\n13/09/2020 18:23:37: tele 0,50,53,12,35\n13/09/2020 18:23:38: tele 0,50,53,10,33\n13/09/2020 18:23:40: tele 0,50,53,9,30\n13/09/2020 18:23:43: tele 0,50,53,11,28\n13/09/2020 18:29:48: tele 0,42,52,19,55\n13/09/2020 18:29:52: tele 0,42,52,15,54\n13/09/2020 18:29:54: tele 0,42,52,15,55\n13/09/2020 18:29:55: tele 0,42,52,16,55\n13/09/2020 18:30:02: region\n13/09/2020 18:30:05: coords\n13/09/2020 18:33:00: tele 0,42,52,22,45\n13/09/2020 18:33:01: tele 0,42,52,23,36\n13/09/2020 18:33:08: obj 39233\n13/09/2020 18:34:10: obj 39233\n13/09/2020 18:35:10: tele 0,42,52,18,46\n13/09/2020 18:35:16: tele 0,42,52,18,50\n13/09/2020 18:35:23: obj 39237\n13/09/2020 19:17:21: tele 0,46,50,9,15\n13/09/2020 19:17:46: tele 0,46,50,10,14\n13/09/2020 19:17:48: tele 0,46,50,9,14\n14/09/2020 18:03:49: anim 288\n14/09/2020 18:05:12: anim 13662\n14/09/2020 18:05:20: anim 13710\n14/09/2020 18:05:28: anim 13744\n14/09/2020 18:05:36: anim 13798\n14/09/2020 18:05:40: anim -1\n14/09/2020 18:05:59: anim 12931\n14/09/2020 18:06:01: anim 01\n14/09/2020 18:06:05: anim 12919\n14/09/2020 18:06:17: anim 12594\n14/09/2020 18:06:31: anim 12152\n14/09/2020 18:06:40: anim 12059\n14/09/2020 18:07:29: tele 0,46,50,31,21\n14/09/2020 18:07:30: tele 0,46,50,44,21\n14/09/2020 18:07:31: tele 0,46,50,58,22\n14/09/2020 18:07:45: anim 11809\n14/09/2020 20:07:21: tele 0,47,50,48,53\n14/09/2020 20:07:22: tele 0,47,50,62,57\n14/09/2020 20:07:23: tele 0,48,50,11,53\n14/09/2020 20:07:26: tele 0,48,50,16,48\n14/09/2020 20:08:05: remote 1258\n14/09/2020 20:08:18: remote 1603\n14/09/2020 20:08:55: max\n14/09/2020 20:08:57: master\n14/09/2020 20:09:22: item 4734\n14/09/2020 20:09:38: remote 1603\n14/09/2020 20:09:57: remote 2182\n14/09/2020 20:10:01: remote 1666\n14/09/2020 20:10:18: remote 1547\n14/09/2020 20:10:28: remote 1548\n14/09/2020 20:10:45: remote 1262\n14/09/2020 20:10:54: remote 1185\n14/09/2020 20:11:05: remote 1729\n14/09/2020 20:11:10: remote 1695\n14/09/2020 20:11:16: remote 1695\n14/09/2020 20:12:05: emote 733\n14/09/2020 20:13:55: item 11969\n14/09/2020 20:14:14: itemn whip\n14/09/2020 20:14:18: itemn abyssal whip\n14/09/2020 20:15:09: anim 13036\n14/09/2020 20:15:13: anim 12305\n14/09/2020 20:15:17: anim 13055\n14/09/2020 20:26:35: emote 13190\n14/09/2020 20:26:45: emote 13192\n14/09/2020 20:33:38: tele 0,48,51,16,0\n14/09/2020 20:33:39: tele 0,48,51,20,16\n14/09/2020 20:33:39: tele 0,48,51,24,32\n14/09/2020 20:33:40: tele 0,48,51,28,47\n14/09/2020 20:33:40: tele 0,48,51,32,62\n14/09/2020 20:33:41: tele 0,48,52,36,13\n14/09/2020 20:33:42: tele 0,48,52,43,27\n14/09/2020 20:33:42: tele 0,48,52,51,40\n14/09/2020 20:33:43: tele 0,48,52,59,53\n14/09/2020 20:33:43: tele 0,49,53,3,2\n14/09/2020 20:33:44: tele 0,49,53,10,15\n14/09/2020 20:33:45: tele 0,49,53,17,26\n14/09/2020 20:33:46: tele 0,49,53,24,37\n14/09/2020 20:33:47: tele 0,49,53,31,48\n14/09/2020 20:33:48: tele 0,49,53,36,62\n14/09/2020 20:33:49: tele 0,49,54,26,1\n14/09/2020 20:33:49: tele 0,49,54,15,2\n14/09/2020 20:33:51: tele 0,49,53,3,58\n14/09/2020 20:33:52: tele 0,48,53,62,55\n14/09/2020 20:33:54: tele 0,48,53,63,57\n14/09/2020 20:33:55: tele 1,48,53,63,57\n14/09/2020 20:33:58: tele 2,48,53,63,57\n14/09/2020 20:34:52: remote 1564\n14/09/2020 20:36:04: remote 1569\n14/09/2020 20:36:15: remote 1576\n14/09/2020 20:37:57: tele 2,48,53,55,47\n14/09/2020 20:37:58: tele 2,48,53,45,38\n14/09/2020 20:37:58: tele 2,48,53,36,28\n14/09/2020 20:38:00: tele 2,48,53,25,18\n14/09/2020 20:38:00: tele 2,48,53,18,6\n14/09/2020 20:38:01: tele 2,48,52,13,57\n14/09/2020 20:38:01: tele 2,48,52,14,43\n14/09/2020 20:38:02: tele 2,48,52,16,29\n14/09/2020 20:38:03: tele 2,48,52,18,15\n14/09/2020 20:38:08: tele 2,48,52,15,2\n14/09/2020 20:38:08: tele 2,48,51,10,53\n14/09/2020 20:38:09: tele 2,48,51,5,40\n14/09/2020 20:38:09: tele 2,48,51,3,26\n14/09/2020 20:38:10: tele 2,47,51,63,13\n14/09/2020 20:38:11: tele 2,47,51,57,1\n14/09/2020 20:38:11: tele 2,47,50,50,53\n14/09/2020 20:38:12: tele 2,47,50,41,42\n14/09/2020 20:38:12: tele 2,47,50,32,31\n14/09/2020 20:38:13: tele 2,47,50,20,22\n14/09/2020 20:38:14: tele 2,47,50,7,13\n14/09/2020 20:38:14: tele 2,46,50,56,8\n14/09/2020 20:38:15: tele 2,46,50,43,2\n14/09/2020 20:38:15: tele 2,46,49,28,61\n14/09/2020 20:38:16: tele 2,46,49,12,60\n14/09/2020 20:38:17: tele 2,46,50,0,0\n14/09/2020 20:38:19: tele 2,45,50,60,15\n14/09/2020 20:38:20: tele 2,45,50,59,24\n14/09/2020 20:38:21: tele 2,46,50,1,33\n14/09/2020 20:38:21: tele 2,46,50,14,38\n14/09/2020 20:38:22: tele 2,46,50,27,37\n14/09/2020 20:38:24: tele 2,46,50,26,29\n14/09/2020 20:38:24: tele 1,46,50,26,29\n14/09/2020 20:38:25: tele 0,46,50,26,29\n14/09/2020 20:38:26: tele 0,46,50,14,17\n14/09/2020 20:38:28: tele 0,46,50,13,15\n14/09/2020 20:39:23: tele 0,46,50,12,15\n14/09/2020 20:39:26: tele 0,46,50,3,26\n14/09/2020 20:39:27: tele 0,45,50,57,31\n14/09/2020 20:39:28: tele 0,45,50,54,22\n14/09/2020 20:39:50: remote 1673\n14/09/2020 20:40:09: remote 1695\n14/09/2020 20:40:42: remote 1710\n14/09/2020 20:41:41: remote 1788\n14/09/2020 20:42:08: remote 1841\n14/09/2020 20:42:17: remote 1765\n14/09/2020 22:36:19: tele 0,49,154,13,50\n14/09/2020 23:50:50: tele 0,48,53,63,55\n14/09/2020 23:50:53: tele 1,48,53,63,55\n14/09/2020 23:50:56: tele 2,48,53,63,55\n14/09/2020 23:51:01: debug\n15/09/2020 00:46:51: anim 25\n15/09/2020 00:47:06: tele 2,49,53,4,55\n15/09/2020 00:47:08: tele 2,49,53,2,55\n15/09/2020 00:47:09: tele 2,49,53,3,55\n15/09/2020 00:47:09: tele 2,49,53,2,55\n15/09/2020 00:47:10: tele 2,49,53,3,55\n15/09/2020 00:47:11: tele 2,49,53,2,55\n15/09/2020 00:47:13: tele 2,49,53,1,54\n15/09/2020 00:49:45: tele 1,49,53,1,54\n15/09/2020 00:49:46: tele 0,49,53,1,54\n15/09/2020 00:50:11: tele 0,49,53,10,36\n15/09/2020 00:50:12: tele 0,49,53,20,22\n15/09/2020 00:50:13: tele 0,49,53,33,34\n15/09/2020 00:50:14: tele 0,49,53,49,40\n15/09/2020 00:50:17: tele 0,49,53,49,44\n15/09/2020 00:52:10: anim 12175\n15/09/2020 00:52:15: anim 12174\n15/09/2020 11:58:07: item 14000\n15/09/2020 11:58:16: item 15005\n15/09/2020 11:58:32: item 17333\n15/09/2020 11:58:38: item 16777\n15/09/2020 11:58:42: item 14000\n15/09/2020 11:58:45: item 14002\n15/09/2020 11:58:48: item 15002\n15/09/2020 11:58:57: item 15009\n15/09/2020 11:59:05: item 16002\n15/09/2020 11:59:08: item 15888\n15/09/2020 11:59:11: item 15444\n15/09/2020 11:59:15: item 15111\n15/09/2020 11:59:31: tele 0,49,53,50,36\n15/09/2020 11:59:44: tele 0,50,53,6,37\n15/09/2020 11:59:45: tele 0,50,53,8,37\n15/09/2020 12:02:31: pnpc 8926\n15/09/2020 12:02:38: pnpc -1\n15/09/2020 12:03:17: pnpc 9040\n15/09/2020 12:03:49: pnpc 9172\n15/09/2020 12:06:31: pnpc 9235\n15/09/2020 12:07:13: pnpc 9278\n15/09/2020 12:07:38: pnpc 9176\n15/09/2020 12:08:39: pnpc 8719\n15/09/2020 12:09:05: pnpc 8696\n15/09/2020 12:09:09: pnpc 8695\n15/09/2020 12:09:17: pnpc 8697\n15/09/2020 12:09:22: pnpc 8697\n15/09/2020 12:09:43: pnpc 8689\n15/09/2020 12:39:59: tele 0,46,50,13,16\n15/09/2020 12:41:10: empty\n15/09/2020 12:41:16: empty\n15/09/2020 12:41:20: itemn rune 2h\n15/09/2020 12:41:25: itemn rune scimitar\n15/09/2020 12:41:42: tele 0,46,50,26,20\n15/09/2020 12:41:43: tele 0,46,50,39,26\n15/09/2020 12:42:29: tele 0,47,49,7,48\n15/09/2020 12:43:45: tele 0,46,49,61,47\n15/09/2020 12:43:47: tele 0,47,49,1,60\n15/09/2020 12:43:48: tele 0,47,50,5,9\n15/09/2020 12:43:49: tele 0,47,50,9,22\n15/09/2020 12:43:49: tele 0,47,50,13,35\n15/09/2020 12:43:50: tele 0,47,50,17,48\n15/09/2020 12:43:51: tele 0,47,50,21,61\n15/09/2020 12:43:52: tele 0,47,51,27,9\n15/09/2020 12:43:53: tele 0,47,51,34,11\n15/09/2020 12:43:54: tele 0,47,51,47,10\n15/09/2020 12:43:55: tele 0,47,51,63,4\n15/09/2020 12:44:01: tele 0,48,50,0,60\n15/09/2020 12:44:03: tele 0,48,50,4,51\n15/09/2020 12:44:11: tele 0,48,50,7,49\n15/09/2020 12:44:25: itemn rune full helmet\n15/09/2020 12:44:30: itemn rune full helm\n15/09/2020 12:44:40: itemn rune platebodyu\n15/09/2020 12:44:44: itemn rune platebody\n15/09/2020 12:44:49: quests\n15/09/2020 12:44:53: allquest\n15/09/2020 12:45:07: itemn rune platelegs\n15/09/2020 12:48:16: tween\n15/09/2020 12:48:25: tween\n15/09/2020 12:48:47: tele 0,46,52,2,51\n15/09/2020 12:48:56: item 995 99999\n15/09/2020 12:50:37: tele 0,46,53,27,1\n15/09/2020 12:50:37: tele 0,46,53,34,13\n15/09/2020 12:50:38: tele 0,46,53,41,25\n15/09/2020 12:50:39: tele 0,46,53,48,37\n15/09/2020 12:50:54: tele 0,39,44,60,28\n15/09/2020 12:51:08: tele 0,39,44,60,25\n15/09/2020 12:51:10: tele 0,39,44,60,25\n15/09/2020 12:51:17: tele 0,39,44,58,30\n15/09/2020 12:51:26: anim 9933\n15/09/2020 12:51:30: anim 13000\n15/09/2020 12:51:32: anim 13005\n15/09/2020 12:51:37: anim 12222\n15/09/2020 12:51:41: anim 16000\n15/09/2020 12:51:44: anim -1\n15/09/2020 12:51:50: anim 14888\n15/09/2020 12:51:54: anim 13888\n15/09/2020 12:51:56: anim 12333\n15/09/2020 12:52:01: anim 12888\n15/09/2020 12:52:06: anim 13111\n15/09/2020 12:52:09: anim 13444\n15/09/2020 12:52:12: anim -1\n15/09/2020 12:52:15: render 1422\n15/09/2020 12:52:19: render 1555\n15/09/2020 12:52:24: render 1344\n15/09/2020 12:52:26: render 1345\n15/09/2020 12:52:30: render 1346\n15/09/2020 12:52:34: render 1347\n15/09/2020 12:52:37: render 1349\n15/09/2020 12:52:42: render 1401\n15/09/2020 12:52:44: render 1405\n15/09/2020 12:52:47: render 1506\n15/09/2020 12:52:51: render 1507\n15/09/2020 12:52:55: render 1407\n15/09/2020 12:52:58: render 1406\n15/09/2020 12:53:34: remote 1666\n15/09/2020 12:53:38: remote 1573\n15/09/2020 12:53:41: remote -1\n15/09/2020 12:53:47: emote -1\n15/09/2020 12:53:48: emote 1\n15/09/2020 12:53:50: anim 1\n15/09/2020 12:53:55: remote 1547\n15/09/2020 12:53:57: remote 2\n15/09/2020 12:54:01: remote 1427\n15/09/2020 12:54:20: remote 1672\n15/09/2020 12:54:26: remote 1396\n15/09/2020 12:54:37: remote 1569\n15/09/2020 12:54:42: remote 1564\n15/09/2020 12:54:47: remote 1545\n15/09/2020 12:54:55: remote 1429\n15/09/2020 12:55:19: remote 1382\n15/09/2020 12:55:27: remote 1383\n15/09/2020 12:55:38: remote 1482\n15/09/2020 12:55:43: remote 1549\n15/09/2020 12:55:46: emote 1549\n15/09/2020 12:55:48: remote 2\n15/09/2020 12:55:51: remote 4\n15/09/2020 12:55:54: remote 12\n15/09/2020 12:55:56: remote 15\n15/09/2020 12:55:59: remote 18\n15/09/2020 12:56:01: remote 333\n15/09/2020 12:56:04: remote -1\n15/09/2020 12:56:08: remote 899\n15/09/2020 12:56:34: remote 871\n15/09/2020 12:56:48: remote 1652\n15/09/2020 12:57:00: remote 2003\n15/09/2020 12:57:11: remote 2005\n15/09/2020 12:57:28: remote 2019\n15/09/2020 12:57:35: pnpc 2\n15/09/2020 12:57:46: remote 2043\n15/09/2020 12:57:50: remote -1\n15/09/2020 12:57:53: pnpc -1\n15/09/2020 12:58:10: remote 1094\n15/09/2020 12:58:16: remote 1095\n15/09/2020 12:58:30: remote 1114\n15/09/2020 12:58:37: remote 1121\n15/09/2020 12:58:47: remote 1124\n15/09/2020 12:59:10: remote 1171\n15/09/2020 13:00:00: remote 1485\n15/09/2020 13:00:04: remote 1222\n15/09/2020 13:00:14: remote 1386\n15/09/2020 13:00:38: pnpc -1\n15/09/2020 13:01:03: itemn saradomin godsword\n15/09/2020 13:01:27: tele 0,50,50,22,19\n15/09/2020 13:02:12: remote 78\n15/09/2020 13:02:22: remote 124\n15/09/2020 13:02:31: remote 220\n15/09/2020 13:02:40: remote 326\n15/09/2020 13:02:50: remote 2052\n15/09/2020 13:02:57: remote 366\n15/09/2020 13:03:13: remote 124\n15/09/2020 13:03:19: remote 152\n15/09/2020 13:03:34: remote 79\n15/09/2020 13:04:01: remote 40\n15/09/2020 13:04:23: tele 0,48,54,21,15\n15/09/2020 13:04:31: remote 39\n15/09/2020 13:04:35: remote 31\n15/09/2020 13:04:42: remote 28\n15/09/2020 13:04:45: remote 26\n15/09/2020 13:04:47: remote 28\n15/09/2020 13:04:59: tele 0,48,154,33,53\n15/09/2020 13:05:00: tele 0,48,154,47,59\n15/09/2020 13:05:00: tele 0,48,154,62,56\n15/09/2020 13:05:01: tele 0,49,154,10,51\n15/09/2020 13:05:22: tele 0,50,50,22,17\n15/09/2020 13:05:29: itemn zamorakian spear\n15/09/2020 13:06:04: itemn dragon platebody\n15/09/2020 13:06:14: itemn attack cape\n15/09/2020 13:06:25: itemn fury\n15/09/2020 13:06:29: itemn amulet of fury\n15/09/2020 13:06:36: itemn dragon full helm\n15/09/2020 13:06:44: itemn dragon platelegs\n15/09/2020 13:06:53: itemn dragon gauntlets\n15/09/2020 13:07:00: itemn dragon boots\n15/09/2020 13:07:29: empty\n15/09/2020 13:07:33: itemn red partyhat\n15/09/2020 13:07:59: itemn dragon chainbody\n15/09/2020 13:31:24: tele 0,50,50,21,14\n15/09/2020 13:31:37: tele 0,46,61,60,29\n15/09/2020 13:35:40: tele 0,48,53,12,25\n15/09/2020 13:35:46: itemn rune pickaxe\n15/09/2020 13:36:13: tele 0,48,53,14,28\n15/09/2020 13:47:55: itemn dragon scimitar\n15/09/2020 13:48:02: tele 0,56,54,19,32\n17/09/2020 14:46:11: tele 0,41,51,24,27\n17/09/2020 14:46:18: tele 0,44,49,38,27\n17/09/2020 14:46:26: tele 0,50,50,23,18\n17/09/2020 14:46:39: tele 0,50,50,24,37\n17/09/2020 14:47:17: tele 0,50,48,60,34\n17/09/2020 14:47:22: tele 0,50,50,23,17\n17/09/2020 14:52:10: tele 0,46,51,37,13\n17/09/2020 14:52:16: tele 0,50,50,22,17\n17/09/2020 14:52:43: tele 0,46,50,12,15\n17/09/2020 14:53:20: tele 0,44,50,20,35\n17/09/2020 14:53:35: tele 0,43,45,24,13\n17/09/2020 14:54:00: tele 0,50,50,23,19\n17/09/2020 14:54:05: tele 0,50,50,36,25\n17/09/2020 14:55:14: tele 0,50,50,24,20\n17/09/2020 14:55:16: tele 0,50,50,13,31\n17/09/2020 14:55:17: tele 0,49,50,62,38\n17/09/2020 14:55:19: tele 0,49,50,53,38\n17/09/2020 14:55:21: tele 0,49,50,47,32\n17/09/2020 14:55:24: tele 0,49,50,62,31\n17/09/2020 14:55:25: tele 0,50,50,13,26\n17/09/2020 14:55:26: tele 0,50,50,27,26\n17/09/2020 14:55:28: tele 0,50,50,31,24\n17/09/2020 14:55:33: tele 0,50,50,46,27\n17/09/2020 14:55:33: tele 0,50,50,60,35\n17/09/2020 14:55:35: tele 0,50,50,63,32\n17/09/2020 14:55:36: tele 0,51,50,1,34\n17/09/2020 14:55:38: tele 0,51,50,0,42\n17/09/2020 14:55:44: tele 0,50,50,52,34\n17/09/2020 14:55:45: tele 0,50,50,40,26\n17/09/2020 14:55:46: tele 0,50,50,32,20\n17/09/2020 14:55:47: tele 0,50,50,21,18\n17/09/2020 14:56:56: tele 0,51,48,33,26\n17/09/2020 14:59:28: tele 0,50,50,22,18\n17/09/2020 15:17:37: tele 0,50,50,9,10\n17/09/2020 15:17:44: tele 2,50,50,8,20\n17/09/2020 15:19:24: debug\n17/09/2020 18:26:56: tele 0,51,50,16,16\n17/09/2020 19:34:00: itemn brawling gloves\n17/09/2020 19:34:07: itemn brawling gloves (melee)\n17/09/2020 19:34:19: empty\n17/09/2020 19:34:27: itemn bandos chest plate\n17/09/2020 19:34:31: itemn bandos chestplate\n17/09/2020 19:34:38: itemn bandos tassets\n17/09/2020 19:34:45: itemn bandos boots\n17/09/2020 19:34:54: itemn dragonfire shield\n17/09/2020 19:35:04: itemn abyssal whip\n17/09/2020 19:35:38: itemn third-age full helm\n17/09/2020 19:35:50: itemn verac\'s helm\n17/09/2020 19:36:02: itemn fire cape\n17/09/2020 19:36:14: tele 0,51,61,22,22\n17/09/2020 19:36:35: tele 0,51,61,18,19\n17/09/2020 19:37:05: debug\n17/09/2020 19:37:37: god\n17/09/2020 19:37:39: hp\n17/09/2020 19:37:41: 1hko\n17/09/2020 19:37:53: tele 0,51,61,10,22\n17/09/2020 20:12:12: remtoe 211\n17/09/2020 20:12:16: remote 211\n17/09/2020 20:38:04: tele 0,41,63,15,7\n17/09/2020 20:38:08: tele 1,41,63,15,7\n17/09/2020 20:38:08: tele 2,41,63,15,7\n17/09/2020 20:38:09: tele 1,41,63,15,7\n17/09/2020 20:39:30: tele 1,41,63,16,12\n17/09/2020 20:40:54: pnpc 7895\n17/09/2020 20:40:58: pnpc 7896\n17/09/2020 20:41:02: pnpc 7897\n17/09/2020 20:41:07: pnpc 8093\n17/09/2020 20:41:12: pnpc 8095\n17/09/2020 20:41:17: pnpc 8094\n17/09/2020 20:41:22: pnpc 8097\n17/09/2020 20:41:26: pnpc 8098\n17/09/2020 20:41:30: pnpc 8099\n17/09/2020 20:41:34: pnpc -1\n17/09/2020 20:41:38: pnpc 8100\n17/09/2020 20:41:42: pnpc 8882\n17/09/2020 20:41:46: pnpc 8690\n17/09/2020 20:41:52: pnpc 8663\n17/09/2020 20:42:18: pnpc -1\n17/09/2020 20:42:55: tele 0,41,63,12,22\n17/09/2020 20:42:57: tele 0,41,63,11,23\n17/09/2020 20:43:39: tele 0,41,63,6,25\n17/09/2020 20:43:39: tele 1,41,63,6,25\n17/09/2020 20:43:44: tele 1,41,63,7,25\n17/09/2020 20:43:50: tele 1,41,63,7,27\n17/09/2020 20:43:52: tele 1,41,63,9,27\n17/09/2020 20:43:54: tele 1,41,63,11,27\n17/09/2020 20:43:56: tele 1,41,63,11,29\n17/09/2020 20:43:57: tele 1,41,63,11,31\n17/09/2020 20:43:58: tele 1,41,63,12,33\n17/09/2020 21:03:44: tele 0,50,50,30,31\n17/09/2020 21:03:46: tele 0,50,50,23,20\n', '', '', '', ''), +('woahscam', '', '', '', '22/09/2020 12:43:45: 127.0.0.1\n22/09/2020 12:43:45: I116264190\n22/09/2020 12:43:45: 30-9C-23-87-89-8E\n', '', '', '', '', ''); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `punishments` +-- + +CREATE TABLE `punishments` ( + `address` varchar(100) NOT NULL DEFAULT '', + `type` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `security` +-- + +CREATE TABLE `security` ( + `id` int(11) UNSIGNED NOT NULL, + `ip` longtext NOT NULL, + `type` int(11) NOT NULL, + `timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `sys_logs` +-- + +CREATE TABLE `sys_logs` ( + `id` int(11) UNSIGNED NOT NULL, + `message` longtext NOT NULL, + `log_type` int(2) DEFAULT NULL, + `timestamp` timestamp NOT NULL DEFAULT current_timestamp(), + `IP_ADDRESS` varchar(30) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `validations` +-- + +CREATE TABLE `validations` ( + `id` int(11) UNSIGNED NOT NULL, + `username` varchar(20) DEFAULT NULL, + `code` varchar(30) DEFAULT NULL, + `type` int(2) NOT NULL DEFAULT 0, + `timestamp` timestamp NOT NULL DEFAULT current_timestamp(), + `value` longtext NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `votes` +-- + +CREATE TABLE `votes` ( + `id` int(11) NOT NULL, + `username` varchar(50) NOT NULL DEFAULT '', + `site` varchar(50) NOT NULL, + `timestamp` timestamp NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `voting_sites` +-- + +CREATE TABLE `voting_sites` ( + `name` varchar(20) NOT NULL DEFAULT 'Null', + `wait` int(5) NOT NULL DEFAULT 12, + `credits` int(2) NOT NULL DEFAULT 1, + `link` varchar(500) NOT NULL DEFAULT 'http://ariosrsps.com', + `get_command` varchar(20) NOT NULL DEFAULT '', + `host_name` varchar(500) NOT NULL DEFAULT '' +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `worlds` +-- + +CREATE TABLE `worlds` ( + `world` int(2) UNSIGNED NOT NULL, + `ip` varchar(20) NOT NULL DEFAULT '127.0.0.1', + `players` int(5) NOT NULL DEFAULT 0, + `country` int(1) NOT NULL DEFAULT 0, + `member` int(11) NOT NULL, + `revision` int(3) NOT NULL DEFAULT 530, + `lastResponse` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `worlds` +-- + +INSERT INTO `worlds` (`world`, `ip`, `players`, `country`, `member`, `revision`, `lastResponse`) VALUES +(1, '127.0.0.1', 0, 22, 1, 530, '2020-09-23 18:27:05'); + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `dev_log` +-- +ALTER TABLE `dev_log` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `highscores` +-- +ALTER TABLE `highscores` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `members` +-- +ALTER TABLE `members` + ADD PRIMARY KEY (`UID`); + +-- +-- Indexes for table `messages` +-- +ALTER TABLE `messages` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `perks` +-- +ALTER TABLE `perks` + ADD PRIMARY KEY (`product_id`); + +-- +-- Indexes for table `player_logs` +-- +ALTER TABLE `player_logs` + ADD PRIMARY KEY (`username`); + +-- +-- Indexes for table `security` +-- +ALTER TABLE `security` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `sys_logs` +-- +ALTER TABLE `sys_logs` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `validations` +-- +ALTER TABLE `validations` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `votes` +-- +ALTER TABLE `votes` + ADD KEY `id` (`id`); + +-- +-- Indexes for table `voting_sites` +-- +ALTER TABLE `voting_sites` + ADD PRIMARY KEY (`name`); + +-- +-- Indexes for table `worlds` +-- +ALTER TABLE `worlds` + ADD PRIMARY KEY (`world`); + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `dev_log` +-- +ALTER TABLE `dev_log` + MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=34; + +-- +-- AUTO_INCREMENT for table `highscores` +-- +ALTER TABLE `highscores` + MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12; + +-- +-- AUTO_INCREMENT for table `members` +-- +ALTER TABLE `members` + MODIFY `UID` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; + +-- +-- AUTO_INCREMENT for table `messages` +-- +ALTER TABLE `messages` + MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `perks` +-- +ALTER TABLE `perks` + MODIFY `product_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=74; + +-- +-- AUTO_INCREMENT for table `security` +-- +ALTER TABLE `security` + MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `sys_logs` +-- +ALTER TABLE `sys_logs` + MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `validations` +-- +ALTER TABLE `validations` + MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `votes` +-- +ALTER TABLE `votes` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; +COMMIT; + +/*!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 */; diff --git a/Server/scripts/dialogue/anna_isaakson.asc b/Server/scripts/dialogue/anna_isaakson.asc new file mode 100644 index 000000000..392b58148 --- /dev/null +++ b/Server/scripts/dialogue/anna_isaakson.asc @@ -0,0 +1,5 @@ +@dialogue npc:5512 + npc("Hello visitor, how are you?") + player("Better than expected. Its a lot...nicer...here than I was", "expecting. Everyone seems pretty happy.") + npc("Of course, the Burgher is strong and wise, and looks", "after us well") + player("I think some of those Jatizso citizens have got", "the wrong idea about this place.") \ No newline at end of file diff --git a/Server/scripts/dialogue/ardougne_baker.asc b/Server/scripts/dialogue/ardougne_baker.asc new file mode 100644 index 000000000..8ac900b31 --- /dev/null +++ b/Server/scripts/dialogue/ardougne_baker.asc @@ -0,0 +1,10 @@ +@dialogue npc:571 + +npc("Good day, monsieur. Would you like ze nice", "freshly-baked bread? Or perhaps a nice piece of cake?") +option("Let's see what you have.", "No, thank you.") +@option1 { + openshop(571) +} +@option2 { + player("No, thank you.") +} \ No newline at end of file diff --git a/Server/scripts/dialogue/bandit.asc b/Server/scripts/dialogue/bandit.asc new file mode 100644 index 000000000..bcf67804b --- /dev/null +++ b/Server/scripts/dialogue/bandit.asc @@ -0,0 +1,2 @@ +@dialogue npc:1926, 1925, 1927, 1928, 1929, 1930, 1931 +npc("Get out of this village.", "You are not welcome here."); \ No newline at end of file diff --git a/Server/scripts/dialogue/bandit_shopkeeper.asc b/Server/scripts/dialogue/bandit_shopkeeper.asc new file mode 100644 index 000000000..14a3f7795 --- /dev/null +++ b/Server/scripts/dialogue/bandit_shopkeeper.asc @@ -0,0 +1,15 @@ +@dialogue npc:1917 +player("Hello.") +npc("Stuff for sale.", "You buying?") +>options + +options: { + option("Yes", "No") + @option1{ + openshop(1917) + } + @option2{ + npc("No?", "'Bye then.") + } + +} \ No newline at end of file diff --git a/Server/scripts/dialogue/centaur.asc b/Server/scripts/dialogue/centaur.asc new file mode 100644 index 000000000..08374f6e5 --- /dev/null +++ b/Server/scripts/dialogue/centaur.asc @@ -0,0 +1,2 @@ +@dialogue npc:4439,4438 +npc("Welcome to the land of extreme donators."); \ No newline at end of file diff --git a/Server/scripts/dialogue/fridleif_shieldson.asc b/Server/scripts/dialogue/fridleif_shieldson.asc new file mode 100644 index 000000000..561f3f4ae --- /dev/null +++ b/Server/scripts/dialogue/fridleif_shieldson.asc @@ -0,0 +1,4 @@ +@dialogue npc:5505 + + + npc("Congratulations, Champion Larlim Far-strider. Thank you", "for defeating the Troll King.") \ No newline at end of file diff --git a/Server/scripts/dialogue/ghost_guard.asc b/Server/scripts/dialogue/ghost_guard.asc new file mode 100644 index 000000000..f4cc09d09 --- /dev/null +++ b/Server/scripts/dialogue/ghost_guard.asc @@ -0,0 +1,15 @@ +@dialogue npc:1706 +npc("All visitors to Port Phasmatys must pay a toll charge of", "2 Ectotokens.") +>options + +options: { + option("I don't have that many Ectotokens.", "Where can I get Ecototokens?") + @option 1 { + player("I don't have that many Ectotokens.") + npc("In that case, you need to go to the Temple and earn", "some. Talk to the disciples - they will tell you how.") + } + @option 2 { + player("Where can I get my Ectotokens?") + npc("You need to go to the Temple and earn some.", "Talk to the disciples - they will tell you how.") + } +} \ No newline at end of file diff --git a/Server/scripts/dialogue/ghosty_dialogue.asc b/Server/scripts/dialogue/ghosty_dialogue.asc new file mode 100644 index 000000000..2d621ea48 --- /dev/null +++ b/Server/scripts/dialogue/ghosty_dialogue.asc @@ -0,0 +1,3 @@ +@dialogue type:"ghosty dialogue": +npc("Woooo wooo wooooo woooo") +plainmessage("You cannot understand the ghost.") \ No newline at end of file diff --git a/Server/scripts/dialogue/gnometraveller.asc b/Server/scripts/dialogue/gnometraveller.asc new file mode 100644 index 000000000..dd931f897 --- /dev/null +++ b/Server/scripts/dialogue/gnometraveller.asc @@ -0,0 +1,6 @@ +@dialogue npc:2138 +npc(FacialExpression.OLD_NORMAL, "Hello I am a gnome traveller visiting Keldagrim in search", "of low-level skilling supplies.", "I'll offer you an increased buying price,", "higher than any other merchants here can match."); +npc(FacialExpression.OLD_NORMAL, "If you happen to have any, use them on me and I will", "give you a reasonable amount of gold coins."); +player("What items, specifically, do you buy?"); +npc(FacialExpression.OLD_NORMAL, "Logs, Oak logs, Willow logs, Clay, Copper ore, Tin ore,", "Iron ore, Shrimps, Sardines, Anchovies, Trout,", "Guam leaves, Tarromin leaves, Harralander leaves", "Bronze bars, Iron bars, and Arrow shafts..."); +npc(FacialExpression.OLD_NORMAL, "... are some of the items I am looking for.", "When it comes to fish, I will pay more if it's cooked.", "I also accept clean or grimy herbs.", "I am also accepting items in regular or bank note form."); diff --git a/Server/scripts/dialogue/gunnar_holdstrom.asc b/Server/scripts/dialogue/gunnar_holdstrom.asc new file mode 100644 index 000000000..15ce77c01 --- /dev/null +++ b/Server/scripts/dialogue/gunnar_holdstrom.asc @@ -0,0 +1,7 @@ +@dialogue npc:5511 + + + npc("Ah, isn't it a lovely day?") + player("It's not bad. What puts you in such a good mood?") + npc("Oh, I just love my job. The smell of the sea breeze, the", "smell of the arctic pine sap, the smell of the yaks. I find it", All so bracing.") + player("Bracing? Hmmm. I think I might have chosen a different word.") \ No newline at end of file diff --git a/Server/scripts/dialogue/gunnjorn.asc b/Server/scripts/dialogue/gunnjorn.asc new file mode 100644 index 000000000..3029b91e8 --- /dev/null +++ b/Server/scripts/dialogue/gunnjorn.asc @@ -0,0 +1,3 @@ +@dialogue npc:607 +npc("Haha welcome to my obstacle course. Have fun, but", "remember this isn't a child's playground. People have", "died here."); +npc("The best way to train, is to go round the course in a", "clockwise direction.") diff --git a/Server/scripts/dialogue/irksol.asc b/Server/scripts/dialogue/irksol.asc new file mode 100644 index 000000000..7083a6350 --- /dev/null +++ b/Server/scripts/dialogue/irksol.asc @@ -0,0 +1,17 @@ +@dialogue npc:566 +npc("Selling ruby rings! The best deals on rings in over", "twenty four hundred planes of existence!") +>options + +options: { + option("I'm interested in these deals.", "No thanks, just browsing.") + @option 1 { + player("I'm interested in these deals.") + npc("Aha! A connoisseur! Check out these beauties!") + openshop(566) + } + @option 2 { + player("No thanks, just browsing.") + npc("Fair enough.") + + } +} \ No newline at end of file diff --git a/Server/scripts/dialogue/jimmy_wg.asc b/Server/scripts/dialogue/jimmy_wg.asc new file mode 100644 index 000000000..3a18ffb4a --- /dev/null +++ b/Server/scripts/dialogue/jimmy_wg.asc @@ -0,0 +1,41 @@ +@dialogue npc:4298 +npc("'Ello there."); +>options + +options: { + option("Tell me about this room.", "Tell me how to balance kegs.", "May I claim my tokens please?", "Bye!"); + @option1 { + player("Tell me about this room?"); + npc("Well... s'like thish..."); + npc("Thish here'sh a shtore room right?"); + player("A store room you mean?"); + npc("That'sh what I said! *HIC* A shtore room..... Now", "technic'ly shpeaking, I should be outshide guarding it..."); + player("But you just nipped in to have a quick drink?"); + npc("Yep... and to practish."); + player("Practish? I mean.. practise what?"); + npc("Keg balancin. I'm the besht."); + >options + } + @option2 { + player("Tell me how to balance kegs?"); + npc("Yer very very shtrange. But.... you pick the keg up,", "and balance it on yer head, then you pick another keg", "up and put that on top. S'really very eashy."); + player("Eashy?"); + npc("Yesh. Eashy."); + pause(2) + npc("But you couldn't ever balansh ash many ash meee!"); + player("That sounds like a challenge, I'll show you!"); + >options + } + @option3 { + player("May I claim my tokens please?"); + npc("Well... err.. ish not offishal or anyfin... but I got the", "ledger of tokensh 'ere. I'll jus' err.. write it in!"); + player("Won't they know?"); + npc("Nah... hic.... I'm a wizsh at copyin' signaturesh. Jus'", "ashk an offishal mem'er of shtaff like Shloane fer yer", "tokensh."); + plainmessage("The rather drunk Jimmy scribbles the tokens you've earned from", "Keg Balancing in the Ledger so that you can claim them from an", "official member of training staff."); + } + @option4 { + player("Bye!"); + npc("Shure you wouldn't like an ickle drinkie fore yer go?"); + player("No thanks, got things to do, people to see, tokens to", "earn..."); + } +} diff --git a/Server/scripts/dialogue/jofridr_moedstatter.asc b/Server/scripts/dialogue/jofridr_moedstatter.asc new file mode 100644 index 000000000..81f3e069d --- /dev/null +++ b/Server/scripts/dialogue/jofridr_moedstatter.asc @@ -0,0 +1,28 @@ +@dialogue npc:5509 + +npc("Hello there. Would you like to see the good I have", "for sale?") +>options +options: { +option("Yes please, Jofridr", "No thank you, Jofridr", "Why do you have so much wool in your store?) +@option1 { +player("Yes please, Jofridr.") +openshop(5509) +} + +@option2 { + player("No thank you, Jofridr") + npc("Fair thee well.") +} +@option3 { + player("Why do you have so much wool in", "your store?") + npc("Ah, I have contacts on the mainland. I have a", "sailor friend who brings me crates of", "wool on a regular basis.") + player("What do you trade for it?") + npc("Rope of course! What else can we sell? Fish", "would go off before it got so far south.") + player("Where does all this rope go?") + npc("Err, I don't remember the name of the place", "very well. Dreinna? Drennor? Something like that.") + player("That's very interesting. Thanks Jofridr.") + } + } + + + \ No newline at end of file diff --git a/Server/scripts/dialogue/jukat.asc b/Server/scripts/dialogue/jukat.asc new file mode 100644 index 000000000..938ddb6f7 --- /dev/null +++ b/Server/scripts/dialogue/jukat.asc @@ -0,0 +1,15 @@ +@dialogue npc:564 +npc("Dragon swords! Here, Dragon swords! Straight from", "Frenaskrae!") +>options + +options: { + option("Yes please.", "No thanks, I'm just browsing.") + @option 1 { + player("Yes please!") + openshop(564) + } + @option 2 { + player("No thanks, I'm just browsing.") + } +} + diff --git a/Server/scripts/dialogue/kjedelig_uppsen.asc b/Server/scripts/dialogue/kjedelig_uppsen.asc new file mode 100644 index 000000000..2b5b1dad5 --- /dev/null +++ b/Server/scripts/dialogue/kjedelig_uppsen.asc @@ -0,0 +1,7 @@ +@dialogue npc:5518 + + +npc("Ho, Larlim Far-strider! The brave warrior returns!") + player("It was a hard-fought battle, but we Fremennik prevailed!") + npc("I expect we'll be hearing songs about the 'slayer of the", "Troll king' for many years to come") + player("It would be an honour to be remembered in such a way!", "Thanks.") \ No newline at end of file diff --git a/Server/scripts/dialogue/lisse_isaakson.asc b/Server/scripts/dialogue/lisse_isaakson.asc new file mode 100644 index 000000000..6c6b04746 --- /dev/null +++ b/Server/scripts/dialogue/lisse_isaakson.asc @@ -0,0 +1,10 @@ +@dialogue npc:5513 + + npc("Hello, visitor!") + player("Hello. What are you up to?") + npc("Ah, I was about to collect some yak's milk to make", "yak cheese.") + player("Eughr! Though I am curious. Can I try some?") + npc("Sorry, no. The last outlander who ate my cheese", "was ill for a month") + player("So why don't you get ill as well?") + npc("Well, we eat yak milk products every day, from", "when we're born. So I suppose we're used to it. Anyways I", "should stop yakking - Haha - and get on with my work") + player("I'm glad to see that puns are common", "everywhere in Keldagrim; even here") \ No newline at end of file diff --git a/Server/scripts/dialogue/melina.asc b/Server/scripts/dialogue/melina.asc new file mode 100644 index 000000000..45f5389b7 --- /dev/null +++ b/Server/scripts/dialogue/melina.asc @@ -0,0 +1,2 @@ +@dialogue npc:2935 +npc("Leave me be.") \ No newline at end of file diff --git a/Server/scripts/dialogue/molly.asc b/Server/scripts/dialogue/molly.asc new file mode 100644 index 000000000..ad71aba80 --- /dev/null +++ b/Server/scripts/dialogue/molly.asc @@ -0,0 +1,41 @@ +@dialogue npc:3892,3893,3894,3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,3910,3911 + +npc("Thanks for coming!") +player("It's not like I had a lot of choice you know!") +npc("I'm sorry for abducting you like that, but I really need", "your help >playername<.") +player("What's the problem then?") +>event_info + +event_info:{ + npc("It's my evil twin sister! She's been galavanting around", "Keldagrim commiting crimes and now I'm getting the", "blame!") + player("Well what's all this got to do with me then?") + npc("I'm glad you asked!") + npc("Through that door is a room with a cage and a control", "panel that operates a giant mechanical claw.") + npc("I lured my sister into the room so I could imprison her", "in the cage by using the claw. The problem is my sister", "managed to herd some innocent civilians in there with", "her.") + player("So what do you need me to do?") + npc("I need you to go next door and use the claw to catch", "my sister.") + npc("Once she's in prison, she won't be causing me anymore", "bother!") + player("Sounds easy enough to me.") + npc("Fabulous! Now take a good long look at me because the", "door will be locked behind you. My twin looks exactly", "like me, even her clothes!") + npc("One more thing to make your life difficult; the magic", "powering the claw is running low so you'll only have", "two attempts to catch her.") + player("I'll do my best then!") + npc("By the way, would you like me to run through the", "controls for you, or do you think you'll manage?") + setattribute("/save:ame:evil_twin_info", true); + option("Yes please.", "No thanks.") + @option1{ + player("Yes please. I mean, it's always best to be prepared,", "right?") + npc("Ok, when you turn the machine on you'll see the", "glowing mark on the floor where the claw is currently", "aiming, and you'll see a lever and button on the right", "hand side of your screen.") + npc("To move the claw's current location, click on the", "direction you want it to move in, as indicated on the", "right hand panel.") + npc("You'll know which way the claw will go as the lever will", "point that way to show you.") + npc("When you see someone on top of the glowing mark,", "then hit the button on the right hand panel, as this will", "send the claw down to pick them up.") + npc("Do be careful and make sure that there is someone on", "the mark, and not just walking past it.") + npc("Oh, and make sure the person is my sister, so you", "don't end up catching a random civilian.") + npc("Does that help?") + player("Yes, that covers everything. Thanks!") + npc("Good luck!") + } + @option2{ + player("No thanks, I should be able to work it out.") + npc("Good luck!") + } +} \ No newline at end of file diff --git a/Server/scripts/dialogue/morten_holdstrom.asc b/Server/scripts/dialogue/morten_holdstrom.asc new file mode 100644 index 000000000..8b0f0eb01 --- /dev/null +++ b/Server/scripts/dialogue/morten_holdstrom.asc @@ -0,0 +1,11 @@ +@dialogue npc:5510 + + + npc("Good day to you.") + player("Hello. What are you up to?") + npc("Ah, Today is surstromming day! The herring I buried", "six months ago is ready to be dug up.") + player("Eughr! What are you going to do with it?") + npc("Eat it, of course! It will be fermented just-right by now.") + player("Fermented? You eat rotten fish?") + npc("Hmmm, tasty. I'm guessing you don't want to", "come round and try it?") + player("You guess correctly.") \ No newline at end of file diff --git a/Server/scripts/dialogue/peer_the_seer.asc b/Server/scripts/dialogue/peer_the_seer.asc new file mode 100644 index 000000000..53da493d0 --- /dev/null +++ b/Server/scripts/dialogue/peer_the_seer.asc @@ -0,0 +1,4 @@ +@dialogue npc:1288 +npc("Hey! Outerlander! That is my house! Who do you", "think you are to just barge into my home without", "asking?") +player("Um... My name is @name.") +npc("It was a rhetorical question, outerlander. Now get lost.", "I do not appreciate intruders in my home.") diff --git a/Server/scripts/dialogue/private_paldon.asc b/Server/scripts/dialogue/private_paldon.asc new file mode 100644 index 000000000..9b44ca0ba --- /dev/null +++ b/Server/scripts/dialogue/private_paldon.asc @@ -0,0 +1,6 @@ +@dialogue npc:5031 +player("Hi") +npc("Shhh. Don't talk to me.") +player("What? Why?") +npc("If I'm seen slacking off by talking to you, I'll be in", "deep trouble!") +player("Oh... Sorry.") \ No newline at end of file diff --git a/Server/scripts/dialogue/private_pendron.asc b/Server/scripts/dialogue/private_pendron.asc new file mode 100644 index 000000000..d35e10b01 --- /dev/null +++ b/Server/scripts/dialogue/private_pendron.asc @@ -0,0 +1,5 @@ +@dialogue npc:5032 +player("Hi there.") +npc("Don't suppose you've seen a battleaxe around here?") +player("A battleaxe? Nope, afraid not.") +npc("The captain is going to kill me if he finds out I've lost", "my weapon.") diff --git a/Server/scripts/dialogue/private_pierreb.asc b/Server/scripts/dialogue/private_pierreb.asc new file mode 100644 index 000000000..4c76ea8e0 --- /dev/null +++ b/Server/scripts/dialogue/private_pierreb.asc @@ -0,0 +1,4 @@ +@dialogue npc:5033 +player("Hello. So you're just a private?") +npc("Show some respect! It's more than you'll achieve.") +player("I beg to differ. I'm in perfect shape!") diff --git a/Server/scripts/dialogue/robin.asc b/Server/scripts/dialogue/robin.asc new file mode 100644 index 000000000..3a3995208 --- /dev/null +++ b/Server/scripts/dialogue/robin.asc @@ -0,0 +1,11 @@ +@dialogue npc:1694 +player("It's nice to see another human face around here.") +npc("Leave me be, peasant - I am relaxing.") +player("Well, that's nice!") +npc("Do you know who I am?") +player("I'm sorry, I haven't had the privilege.") +npc("I, peasant, am Robin, Master Bowman. I am very", "famous you know.") +player("Oh, Robin, Master Bowman, I see.") +npc("So have you heard of me?") +player("No.") + diff --git a/Server/scripts/dialogue/simon_templeton.asc b/Server/scripts/dialogue/simon_templeton.asc new file mode 100644 index 000000000..9d5dc9b79 --- /dev/null +++ b/Server/scripts/dialogue/simon_templeton.asc @@ -0,0 +1,38 @@ +@dialogue npc:3123 +player("Hello, Simon.") +npc("G'day, @name.") +player("How's it going?") +$hasitem(6970, 1) { + npc("Not bad, mate, not bad at all. Got any artefacts for", "me?") + >sellOptions +} +npc("I've been contracted to retrieve artefacts from the top", "of this magnificent pyramid.") +player("So, why are you down here and not up there then?") +npc("Well, it's me back - an old injury I picked up in", "Sophanem has come back to haunt me. I was working", "for the Museum of Varrock, and the gold I had been", "given wasn't enough to pay for the carpet rides, let") +npc("alone any decent equipment. But that was a long time", "ago... I can't even lift a chisel right now. There's no", "way I can climb all the way up there.") +player("How on earth did you get down the cliff face, then?") +npc("That's what set off the injury. I was fine before I", "scrabbed down the pesky slope. I think it will be a while", "before I can climb back up again; I must be getting", "old.") +npc("Hang on a second... You look like you're pretty agile", "and up for a challenge. How about you retrieve it for", "me?") +npc("I'll tell you what, I'll give you 1000 coins for every", "artefact you get for me.") +player("I'll see what I can do.") +npc("Good on ya, mate!") + +sellOptions: { + option("Sell it.", "Keep it.") + @option1{ + player("I have one here I'll sell you.") + $removeitem(6970, 1) { + additem(995, 1000) + itemmessage(6970, "You hand over the artefact(s) and Simon hands you 1000 coins.") + npc("Ripper! Thanks a bundle mate! Thanks to you I can", "fulfill me contract. You're a true blue! The boss will be", "pleased.") + player("Glad I was able to help... but who is your boss? I", "thought you worked for the museum?") + npc("Mind your own bizzo, mate. But if you get any more,", "you know where I am!") + } + } + @option2{ + player("I have one, but I want to keep it for now.") + npc("Careful, mate, people come looking for a thing like", "that!") + player("Thanks for the advice, but I'll hang onto it for now.") + npc("Bye, cobber.") + } +} \ No newline at end of file diff --git a/Server/scripts/dialogue/slug_hemligssen.asc b/Server/scripts/dialogue/slug_hemligssen.asc new file mode 100644 index 000000000..3742d17e0 --- /dev/null +++ b/Server/scripts/dialogue/slug_hemligssen.asc @@ -0,0 +1,5 @@ +@dialogue npc:5520 + + + npc("Shh. Go away. I'm not allowed to talk to you.") + player("Fine, Whatever...") \ No newline at end of file diff --git a/Server/scripts/dialogue/spirit_spider.asc b/Server/scripts/dialogue/spirit_spider.asc new file mode 100644 index 000000000..d864fc823 --- /dev/null +++ b/Server/scripts/dialogue/spirit_spider.asc @@ -0,0 +1,7 @@ +@dialogue npc:6841, 6842 +npc("Where are we going?") +player("I've not decided yet.") +npc("Fine, don't tell me...") +player("Oh, okay, well we are going...") +npc("Don't want to know now.") +player("Siiiigh...spiders.") \ No newline at end of file diff --git a/Server/scripts/dialogue/test.asc b/Server/scripts/dialogue/test.asc new file mode 100644 index 000000000..88a630011 --- /dev/null +++ b/Server/scripts/dialogue/test.asc @@ -0,0 +1 @@ +message("Roar") \ No newline at end of file diff --git a/Server/scripts/dialogue/thakkrad_sigmundson.asc b/Server/scripts/dialogue/thakkrad_sigmundson.asc new file mode 100644 index 000000000..228288cbb --- /dev/null +++ b/Server/scripts/dialogue/thakkrad_sigmundson.asc @@ -0,0 +1,6 @@ +@dialogue npc:5506 + +npc("Thank you for leading the Burgher's militia against the", "Troll King.") + npc("Now that the trolls are leaderless I have repaired the", "bridge to the central isle for you as best I can.") + player("Thanks Thakkrad. Does that mean I have access to the", "runite ores on that island?") + npc("Yes, You should be able to mine runite there if you wish.") \ No newline at end of file diff --git a/Server/scripts/dialogue/trogen_konungarde.asc b/Server/scripts/dialogue/trogen_konungarde.asc new file mode 100644 index 000000000..367a6428a --- /dev/null +++ b/Server/scripts/dialogue/trogen_konungarde.asc @@ -0,0 +1,7 @@ +@dialogue npc:5519 + + +npc("Ho, Larlim Far-strider! The brave warrior returns!") + player("It was a hard-fought battle, but we Fremennik prevailed!") + npc("I expect we'll be hearing songs about the 'slayer of the", "Troll king' for many years to come") + player("It would be an honour to be remembered in such a way!", "Thanks.") \ No newline at end of file diff --git a/Server/scripts/dialogue/yanille_bartender.asc b/Server/scripts/dialogue/yanille_bartender.asc new file mode 100644 index 000000000..a9da9908b --- /dev/null +++ b/Server/scripts/dialogue/yanille_bartender.asc @@ -0,0 +1,25 @@ +@dialogue npc:739 +npc("What can I get you?") +player("What's on the menu?") +npc("Dragon Bitter and Greenman's Ale, oh and some cheap", "beer.") +>options + +options: { + option("I'll give it a miss I think", "I'll try the Dragon Bitter.", "Can I have some Greenman's Ale?", "One cheap beer please!") + @option1 { + + } + @option2 { + + } + @option3 { + + } + @option4 { + + } +} + +buy:(id, cost) { + +} \ No newline at end of file diff --git a/Server/scripts/dialogue/zanaris_gatekeeper.asc b/Server/scripts/dialogue/zanaris_gatekeeper.asc new file mode 100644 index 000000000..c79e44646 --- /dev/null +++ b/Server/scripts/dialogue/zanaris_gatekeeper.asc @@ -0,0 +1,6 @@ +@dialogue npc:3321, 3307 +player("What happened to the old man who used to be the", "doorman?") +npc("You mean my father? He went into retirement, I've", "taken over the family business instead.") +player("Your father! But you don't look anything like him!") +npc("No, fortunately for me I inherited my good looks from", "my mother.") + diff --git a/Server/server.jar b/Server/server.jar new file mode 100644 index 000000000..7c1a8ef48 Binary files /dev/null and b/Server/server.jar differ diff --git a/Server/src/main/java/Server/core/JSONUtils.kt b/Server/src/main/java/Server/core/JSONUtils.kt new file mode 100644 index 000000000..bafec26a5 --- /dev/null +++ b/Server/src/main/java/Server/core/JSONUtils.kt @@ -0,0 +1,47 @@ +package core + +import core.game.world.map.Location +import java.io.File + +class JSONUtils { + companion object { + + + /** + * Parses a location from the format "x,y,z" + * @author Ceikry + * @param locString The string to parse + * @return Location + */ + @JvmStatic + fun parseLocation(locString: String): Location { + val locTokens = locString.split(",").map { it.toInt() } + return Location(locTokens[0], locTokens[1], locTokens[2]) + } + + /** + * Parses a path string + * @author Ceikry + * @param pathString The string to parse + * @return a String with the proper file separators for the current OS. + */ + @JvmStatic + fun parsePath(pathString: String): String { + var pathTokens: List? = null + if(pathString.contains("/")) + pathTokens = pathString.split("/") + else if(pathString.contains("\\")) + pathTokens = pathString.split("\\") + + pathTokens ?: return pathString //return the initial pathString if path does not contain file separators. + var pathProduct = "" + for(token in pathTokens){ + if(token != "") + pathProduct += "$token${File.separator}" + } + + return pathProduct + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/Server.kt b/Server/src/main/java/Server/core/Server.kt new file mode 100644 index 000000000..af490d679 --- /dev/null +++ b/Server/src/main/java/Server/core/Server.kt @@ -0,0 +1,142 @@ +package core + +import core.game.system.* +import core.game.system.config.ServerConfigParser +import core.game.system.mysql.SQLManager +import core.game.world.GameWorld +import core.game.world.repository.Repository +import core.gui.ConsoleFrame +import core.net.NioReactor +import core.net.amsc.WorldCommunicator +import core.tools.TimeStamp +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import core.game.ge.GEAutoStock +import kotlinx.coroutines.delay +import java.io.File +import java.net.BindException +import java.util.* +import kotlin.system.exitProcess + +/** + * The main class, for those that are unable to read the class' name. + * @author Emperor + * @author Vexia + * @author Ceikry + */ +object Server { + /** + * The time stamp of when the server started running. + */ + @JvmField + var startTime: Long = 0 + + var lastHeartbeat = System.currentTimeMillis() + + var running = false + + /** + * The NIO reactor. + */ + var reactor: NioReactor? = null + + /** + * The main method, in this method we load background utilities such as + * cache and our world, then end with starting networking. + * @param args The arguments cast on runtime. + * @throws Throwable When an exception occurs. + */ + @Throws(Throwable::class) + @JvmStatic + fun main(args: Array) { + if (args.isNotEmpty()) { + SystemLogger.logInfo("Using config file: ${args[0]}") + ServerConfigParser(args[0]) + } else { + SystemLogger.logInfo("Using config file: ${"worldprops" + File.separator + "default.json"}") + ServerConfigParser("worldprops" + File.separator + "default.json") + } + if (GameWorld.settings?.isGui == true) { + try { + ConsoleFrame.getInstance().init() + } catch (e: Exception) { + SystemLogger.logWarn("X11 server missing - launching server with no GUI!") + } + } + startTime = System.currentTimeMillis() + val t = TimeStamp() + GameWorld.prompt(true) + SQLManager.init() + Runtime.getRuntime().addShutdownHook(ServerConstants.SHUTDOWN_HOOK) + SystemLogger.logInfo("Starting networking...") + try { + NioReactor.configure(43594 + GameWorld.settings?.worldId!!).start() + } catch (e: BindException) { + SystemLogger.logErr("Port " + (43594 + GameWorld.settings?.worldId!!) + " is already in use!") + throw e + } + WorldCommunicator.connect() + SystemLogger.logInfo(GameWorld.settings?.name + " flags " + GameWorld.settings?.toString()) + SystemLogger.logInfo(GameWorld.settings?.name + " started in " + t.duration(false, "") + " milliseconds.") + + GEAutoStock.autostock() + val scanner = Scanner(System.`in`) + running = true + GlobalScope.launch { + while(scanner.hasNextLine()){ + val command = scanner.nextLine() + when(command){ + "stop" -> SystemManager.flag(SystemState.TERMINATED) + "players" -> System.out.println("Players online: " + (Repository.LOGGED_IN_PLAYERS.size)) + "update" -> SystemManager.flag(SystemState.UPDATING) + "help","commands" -> printCommands() + "restartworker" -> SystemManager.flag(SystemState.ACTIVE) + + } + } + } + GlobalScope.launch { + delay(20000) + while(running){ + if(System.currentTimeMillis() - lastHeartbeat > 1800){ + running = false + exitProcess(0) + } + delay(625) + } + } + } + + @JvmStatic + fun heartbeat() { + lastHeartbeat = System.currentTimeMillis() + } + + fun printCommands(){ + println("stop - stop the server (saves all accounts and such)") + println("players - show online player count") + println("update - initiate an update with a countdown visible to players") + println("help, commands - show this") + println("restartworker - Reboots the major update worker in case of a travesty.") + } + + fun autoReconnect() { + /*SystemLogger.log("Attempting autoreconnect of server") + WorldCommunicator.connect()*/ + } + /** + * Gets the startTime. + * @return the startTime + */ + fun getStartTime(): Long { + return startTime + } + + /** + * Sets the bastartTime.ZZ + * @param startTime the startTime to set. + */ + fun setStartTime(startTime: Long) { + Server.startTime = startTime + } +} diff --git a/Server/src/main/java/Server/core/ServerConstants.backup b/Server/src/main/java/Server/core/ServerConstants.backup new file mode 100644 index 000000000..3c4d50610 --- /dev/null +++ b/Server/src/main/java/Server/core/ServerConstants.backup @@ -0,0 +1,217 @@ +package core + +import core.game.system.SystemShutdownHook +import core.game.system.mysql.SQLManager +import core.game.world.map.Location +import core.tools.mysql.Database +import core.tools.secondsToTicks +import org.json.simple.JSONObject +import java.io.File +import java.math.BigInteger + +/** + * A class holding various variables for the server. + * @author Ceikry + */ +class ServerConstants { + companion object { + @JvmField + var SHUTDOWN_HOOK: Thread = Thread(SystemShutdownHook()) + + @JvmField + var DATA_PATH: String? = null + + //path to the cache + @JvmField + var CACHE_PATH: String? = null + + //path for the server store (obsolete, but kept for the sake of system sanity.) + @JvmField + var STORE_PATH: String? = null + + //path for player saves + @JvmField + var PLAYER_SAVE_PATH: String? = null + + @JvmField + var PLAYER_ATTRIBUTE_PATH = "ish"; + + //path to the various config files, such as npc_spawns.json + var CONFIG_PATH: String? = null + + @JvmField + var GRAND_EXCHANGE_DATA_PATH: String? = null + + @JvmField + var RDT_DATA_PATH: String? = null + + @JvmField + var OBJECT_PARSER_PATH: String? = null + + @JvmField + var SCRIPTS_PATH: String? = null + + @JvmField + var DIALOGUE_SCRIPTS_PATH: String? = null + + @JvmField + var LOGS_PATH: String? = null + + @JvmField + var BOT_DATA_PATH: String? = null + + //the max number of players. + @JvmField + var MAX_PLAYERS = 0 + + //the max number of NPCs + @JvmField + var MAX_NPCS = 0 + + //the location where new players are placed on login. + @JvmField + var START_LOCATION: Location? = null + + //Location for all home teleports/respawn location + @JvmField + var HOME_LOCATION: Location? = null + + //the name for the database + @JvmField + var DATABASE_NAME: String? = null + + //username for the database + @JvmField + var DATABASE_USER: String? = null + + //password for the database + @JvmField + var DATABASE_PASS: String? = null + + //address for the database + @JvmField + var DATABASE_ADDRESS: String? = null + + @JvmField + var DATABASE_PORT: String? = null + + @JvmField + var WRITE_LOGS: Boolean = false + + @JvmField + var BANK_SIZE: Int = 496 + + @JvmField + var GE_AUTOSAVE_FREQUENCY = secondsToTicks(3600) //1 hour + + @JvmField + var GE_AUTOSTOCK_ENABLED = false + + //location names for the ::to command. + val TELEPORT_DESTINATIONS = arrayOf( + arrayOf(Location.create(2974, 4383, 2), "corp", "corporal", "corporeal"), + arrayOf(Location.create(2659, 2649, 0), "pc", "pest control", "pest"), + arrayOf(Location.create(3293, 3184, 0), "al kharid", "alkharid", "kharid"), + arrayOf(Location.create(3222, 3217, 0), "lumbridge", "lumby"), + arrayOf(Location.create(3110, 3168, 0), "wizard tower", "wizards tower", "tower", "wizards"), + arrayOf(Location.create(3083, 3249, 0), "draynor", "draynor village"), + arrayOf(Location.create(3019, 3244, 0), "port sarim", "sarim"), + arrayOf(Location.create(2956, 3209, 0), "rimmington"), + arrayOf(Location.create(2965, 3380, 0), "fally", "falador"), + arrayOf(Location.create(2895, 3436, 0), "taverley"), + arrayOf(Location.create(3080, 3423, 0), "barbarian village", "barb"), + arrayOf(Location.create(3213, 3428, 0), "varrock"), + arrayOf(Location.create(3164, 3485, 0), "grand exchange", "ge"), + arrayOf(Location.create(2917, 3175, 0), "karamja"), + arrayOf(Location.create(2450, 5165, 0), "tzhaar"), + arrayOf(Location.create(2795, 3177, 0), "brimhaven"), + arrayOf(Location.create(2849, 2961, 0), "shilo village", "shilo"), + arrayOf(Location.create(2605, 3093, 0), "yanille"), + arrayOf(Location.create(2663, 3305, 0), "ardougne", "ardy"), + arrayOf(Location.create(2450, 3422, 0), "gnome stronghold", "gnome"), + arrayOf(Location.create(2730, 3485, 0), "camelot", "cammy", "seers"), + arrayOf(Location.create(2805, 3435, 0), "catherby"), + arrayOf(Location.create(2659, 3657, 0), "rellekka"), + arrayOf(Location.create(2890, 3676, 0), "trollheim"), + arrayOf(Location.create(2914, 3746, 0), "godwars", "gwd", "god wars"), + arrayOf(Location.create(3180, 3684, 0), "bounty hunter", "bh"), + arrayOf(Location.create(3272, 3687, 0), "clan wars", "clw"), + arrayOf(Location.create(3090, 3957, 0), "mage arena", "mage", "magearena", "arena"), + arrayOf(Location.create(3069, 10257, 0), "king black dragon", "kbd"), + arrayOf(Location.create(3359, 3416, 0), "digsite"), + arrayOf(Location.create(3488, 3489, 0), "canifis"), + arrayOf(Location.create(3428, 3526, 0), "slayer tower", "slayer"), + arrayOf(Location.create(3502, 9483, 2), "kalphite queen", "kq", "kalphite hive", "kalphite"), + arrayOf(Location.create(3233, 2913, 0), "pyramid"), + arrayOf(Location.create(3419, 2917, 0), "nardah"), + arrayOf(Location.create(3482, 3090, 0), "uzer"), + arrayOf(Location.create(3358, 2970, 0), "pollnivneach", "poln"), + arrayOf(Location.create(3305, 2788, 0), "sophanem"), + arrayOf(Location.create(2898, 3544, 0), "burthorpe", "burthorp"), + arrayOf(Location.create(3088, 3491, 0), "edge", "edgeville"), + arrayOf(Location.create(3169, 3034, 0), "bedabin"), + arrayOf(Location.create(3565, 3289, 0), "barrows"), + arrayOf(Location.create(3016, 3513, 0), "bkf", "black knights fortress"), + arrayOf(Location.create(3052, 3481, 0), "monastery") + ) + + @JvmField + var DATABASE: Database? = null + + //if SQL is enabled + @JvmField + var MYSQL = true + + //the server name + @JvmField + var SERVER_NAME: String = "" + + //The RSA_KEY for the server. + @JvmField + var EXPONENT = BigInteger("52317200263721308660411803146360972546561037484450290559823448967617618536819222494429186211525706853703641369936136465589036631055945454547936148730495933263344792588795811788941129493188907621550836988152620502378278134421731002382361670176785306598134280732756356458964850508114958769985438054979422820241") + + //The MODULUS for the server. + @JvmField + var MODULUS = BigInteger("96982303379631821170939875058071478695026608406924780574168393250855797534862289546229721580153879336741968220328805101128831071152160922518190059946555203865621183480223212969502122536662721687753974815205744569357388338433981424032996046420057284324856368815997832596174397728134370577184183004453899764051") + + /** + * Parses a JSONObject and retrieves the values for all settings in this file. + * @author Ceikry + * @param data : The JSONObject to parse. + */ + fun parse(data: JSONObject) { + MAX_PLAYERS = data["max_players"].toString().toInt() + MAX_NPCS = data["max_npcs"].toString().toInt() + + START_LOCATION = JSONUtils.parseLocation(data["new_player_location"].toString()) + HOME_LOCATION = JSONUtils.parseLocation(data["home_location"].toString()) + + DATA_PATH = JSONUtils.parsePath(data["data_path"].toString()) + CACHE_PATH = JSONUtils.parsePath(data["cache_path"].toString()) + STORE_PATH = JSONUtils.parsePath(data["store_path"].toString()) + PLAYER_SAVE_PATH = JSONUtils.parsePath(data["save_path"].toString()) + CONFIG_PATH = JSONUtils.parsePath(data["configs_path"].toString()) + PLAYER_ATTRIBUTE_PATH = PLAYER_SAVE_PATH + "attributes" + File.separator + GRAND_EXCHANGE_DATA_PATH = JSONUtils.parsePath(data["grand_exchange_data_path"].toString()) + BOT_DATA_PATH = JSONUtils.parsePath(data["bot_data_path"].toString()) + RDT_DATA_PATH = JSONUtils.parsePath(data["rare_drop_table_path"].toString()) + OBJECT_PARSER_PATH = JSONUtils.parsePath(data["object_parser_path"].toString()) + SCRIPTS_PATH = JSONUtils.parsePath(data["scripts_path"].toString()) + DIALOGUE_SCRIPTS_PATH = JSONUtils.parsePath(data["dialogue_scripts_path"].toString()) + if(data.containsKey("logs_path")){ + LOGS_PATH = data["logs_path"].toString() + } + if(data.containsKey("writeLogs")){ + WRITE_LOGS = data["writeLogs"] as Boolean + } + + DATABASE_NAME = data["database_name"].toString() + DATABASE_USER = data["database_username"].toString() + DATABASE_PASS = data["database_password"].toString() + DATABASE_ADDRESS = data["database_address"].toString() + DATABASE_PORT = data["database_port"].toString() + + DATABASE = Database(DATABASE_ADDRESS, DATABASE_NAME, DATABASE_USER, DATABASE_PASS) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/ServerConstants.kt b/Server/src/main/java/Server/core/ServerConstants.kt new file mode 100644 index 000000000..3c4d50610 --- /dev/null +++ b/Server/src/main/java/Server/core/ServerConstants.kt @@ -0,0 +1,217 @@ +package core + +import core.game.system.SystemShutdownHook +import core.game.system.mysql.SQLManager +import core.game.world.map.Location +import core.tools.mysql.Database +import core.tools.secondsToTicks +import org.json.simple.JSONObject +import java.io.File +import java.math.BigInteger + +/** + * A class holding various variables for the server. + * @author Ceikry + */ +class ServerConstants { + companion object { + @JvmField + var SHUTDOWN_HOOK: Thread = Thread(SystemShutdownHook()) + + @JvmField + var DATA_PATH: String? = null + + //path to the cache + @JvmField + var CACHE_PATH: String? = null + + //path for the server store (obsolete, but kept for the sake of system sanity.) + @JvmField + var STORE_PATH: String? = null + + //path for player saves + @JvmField + var PLAYER_SAVE_PATH: String? = null + + @JvmField + var PLAYER_ATTRIBUTE_PATH = "ish"; + + //path to the various config files, such as npc_spawns.json + var CONFIG_PATH: String? = null + + @JvmField + var GRAND_EXCHANGE_DATA_PATH: String? = null + + @JvmField + var RDT_DATA_PATH: String? = null + + @JvmField + var OBJECT_PARSER_PATH: String? = null + + @JvmField + var SCRIPTS_PATH: String? = null + + @JvmField + var DIALOGUE_SCRIPTS_PATH: String? = null + + @JvmField + var LOGS_PATH: String? = null + + @JvmField + var BOT_DATA_PATH: String? = null + + //the max number of players. + @JvmField + var MAX_PLAYERS = 0 + + //the max number of NPCs + @JvmField + var MAX_NPCS = 0 + + //the location where new players are placed on login. + @JvmField + var START_LOCATION: Location? = null + + //Location for all home teleports/respawn location + @JvmField + var HOME_LOCATION: Location? = null + + //the name for the database + @JvmField + var DATABASE_NAME: String? = null + + //username for the database + @JvmField + var DATABASE_USER: String? = null + + //password for the database + @JvmField + var DATABASE_PASS: String? = null + + //address for the database + @JvmField + var DATABASE_ADDRESS: String? = null + + @JvmField + var DATABASE_PORT: String? = null + + @JvmField + var WRITE_LOGS: Boolean = false + + @JvmField + var BANK_SIZE: Int = 496 + + @JvmField + var GE_AUTOSAVE_FREQUENCY = secondsToTicks(3600) //1 hour + + @JvmField + var GE_AUTOSTOCK_ENABLED = false + + //location names for the ::to command. + val TELEPORT_DESTINATIONS = arrayOf( + arrayOf(Location.create(2974, 4383, 2), "corp", "corporal", "corporeal"), + arrayOf(Location.create(2659, 2649, 0), "pc", "pest control", "pest"), + arrayOf(Location.create(3293, 3184, 0), "al kharid", "alkharid", "kharid"), + arrayOf(Location.create(3222, 3217, 0), "lumbridge", "lumby"), + arrayOf(Location.create(3110, 3168, 0), "wizard tower", "wizards tower", "tower", "wizards"), + arrayOf(Location.create(3083, 3249, 0), "draynor", "draynor village"), + arrayOf(Location.create(3019, 3244, 0), "port sarim", "sarim"), + arrayOf(Location.create(2956, 3209, 0), "rimmington"), + arrayOf(Location.create(2965, 3380, 0), "fally", "falador"), + arrayOf(Location.create(2895, 3436, 0), "taverley"), + arrayOf(Location.create(3080, 3423, 0), "barbarian village", "barb"), + arrayOf(Location.create(3213, 3428, 0), "varrock"), + arrayOf(Location.create(3164, 3485, 0), "grand exchange", "ge"), + arrayOf(Location.create(2917, 3175, 0), "karamja"), + arrayOf(Location.create(2450, 5165, 0), "tzhaar"), + arrayOf(Location.create(2795, 3177, 0), "brimhaven"), + arrayOf(Location.create(2849, 2961, 0), "shilo village", "shilo"), + arrayOf(Location.create(2605, 3093, 0), "yanille"), + arrayOf(Location.create(2663, 3305, 0), "ardougne", "ardy"), + arrayOf(Location.create(2450, 3422, 0), "gnome stronghold", "gnome"), + arrayOf(Location.create(2730, 3485, 0), "camelot", "cammy", "seers"), + arrayOf(Location.create(2805, 3435, 0), "catherby"), + arrayOf(Location.create(2659, 3657, 0), "rellekka"), + arrayOf(Location.create(2890, 3676, 0), "trollheim"), + arrayOf(Location.create(2914, 3746, 0), "godwars", "gwd", "god wars"), + arrayOf(Location.create(3180, 3684, 0), "bounty hunter", "bh"), + arrayOf(Location.create(3272, 3687, 0), "clan wars", "clw"), + arrayOf(Location.create(3090, 3957, 0), "mage arena", "mage", "magearena", "arena"), + arrayOf(Location.create(3069, 10257, 0), "king black dragon", "kbd"), + arrayOf(Location.create(3359, 3416, 0), "digsite"), + arrayOf(Location.create(3488, 3489, 0), "canifis"), + arrayOf(Location.create(3428, 3526, 0), "slayer tower", "slayer"), + arrayOf(Location.create(3502, 9483, 2), "kalphite queen", "kq", "kalphite hive", "kalphite"), + arrayOf(Location.create(3233, 2913, 0), "pyramid"), + arrayOf(Location.create(3419, 2917, 0), "nardah"), + arrayOf(Location.create(3482, 3090, 0), "uzer"), + arrayOf(Location.create(3358, 2970, 0), "pollnivneach", "poln"), + arrayOf(Location.create(3305, 2788, 0), "sophanem"), + arrayOf(Location.create(2898, 3544, 0), "burthorpe", "burthorp"), + arrayOf(Location.create(3088, 3491, 0), "edge", "edgeville"), + arrayOf(Location.create(3169, 3034, 0), "bedabin"), + arrayOf(Location.create(3565, 3289, 0), "barrows"), + arrayOf(Location.create(3016, 3513, 0), "bkf", "black knights fortress"), + arrayOf(Location.create(3052, 3481, 0), "monastery") + ) + + @JvmField + var DATABASE: Database? = null + + //if SQL is enabled + @JvmField + var MYSQL = true + + //the server name + @JvmField + var SERVER_NAME: String = "" + + //The RSA_KEY for the server. + @JvmField + var EXPONENT = BigInteger("52317200263721308660411803146360972546561037484450290559823448967617618536819222494429186211525706853703641369936136465589036631055945454547936148730495933263344792588795811788941129493188907621550836988152620502378278134421731002382361670176785306598134280732756356458964850508114958769985438054979422820241") + + //The MODULUS for the server. + @JvmField + var MODULUS = BigInteger("96982303379631821170939875058071478695026608406924780574168393250855797534862289546229721580153879336741968220328805101128831071152160922518190059946555203865621183480223212969502122536662721687753974815205744569357388338433981424032996046420057284324856368815997832596174397728134370577184183004453899764051") + + /** + * Parses a JSONObject and retrieves the values for all settings in this file. + * @author Ceikry + * @param data : The JSONObject to parse. + */ + fun parse(data: JSONObject) { + MAX_PLAYERS = data["max_players"].toString().toInt() + MAX_NPCS = data["max_npcs"].toString().toInt() + + START_LOCATION = JSONUtils.parseLocation(data["new_player_location"].toString()) + HOME_LOCATION = JSONUtils.parseLocation(data["home_location"].toString()) + + DATA_PATH = JSONUtils.parsePath(data["data_path"].toString()) + CACHE_PATH = JSONUtils.parsePath(data["cache_path"].toString()) + STORE_PATH = JSONUtils.parsePath(data["store_path"].toString()) + PLAYER_SAVE_PATH = JSONUtils.parsePath(data["save_path"].toString()) + CONFIG_PATH = JSONUtils.parsePath(data["configs_path"].toString()) + PLAYER_ATTRIBUTE_PATH = PLAYER_SAVE_PATH + "attributes" + File.separator + GRAND_EXCHANGE_DATA_PATH = JSONUtils.parsePath(data["grand_exchange_data_path"].toString()) + BOT_DATA_PATH = JSONUtils.parsePath(data["bot_data_path"].toString()) + RDT_DATA_PATH = JSONUtils.parsePath(data["rare_drop_table_path"].toString()) + OBJECT_PARSER_PATH = JSONUtils.parsePath(data["object_parser_path"].toString()) + SCRIPTS_PATH = JSONUtils.parsePath(data["scripts_path"].toString()) + DIALOGUE_SCRIPTS_PATH = JSONUtils.parsePath(data["dialogue_scripts_path"].toString()) + if(data.containsKey("logs_path")){ + LOGS_PATH = data["logs_path"].toString() + } + if(data.containsKey("writeLogs")){ + WRITE_LOGS = data["writeLogs"] as Boolean + } + + DATABASE_NAME = data["database_name"].toString() + DATABASE_USER = data["database_username"].toString() + DATABASE_PASS = data["database_password"].toString() + DATABASE_ADDRESS = data["database_address"].toString() + DATABASE_PORT = data["database_port"].toString() + + DATABASE = Database(DATABASE_ADDRESS, DATABASE_NAME, DATABASE_USER, DATABASE_PASS) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/Util.java b/Server/src/main/java/Server/core/Util.java new file mode 100644 index 000000000..861df7c69 --- /dev/null +++ b/Server/src/main/java/Server/core/Util.java @@ -0,0 +1,52 @@ +package core; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class Util { + + /** + * Capitalize the first letter of the string + * @return Capitalized string + */ + public static String capitalize(String name) { + if (name != null && name.length() != 0) { + char[] chars = name.toCharArray(); + chars[0] = Character.toUpperCase(chars[0]); + return new String(chars); + } else { + return name; + } + } + + public static String strToEnum(String name) { + name = name.toUpperCase(); + return name.replaceAll(" ", "_"); + } + + public static String enumToString(String name) { + name = name.toLowerCase(); + name = name.replaceAll("_", " "); + return capitalize(name); + } + + public static double clamp(double input, double min, double max) { + return Math.max(Math.min(input, max), min); + } + + public static long nextMidnight(long currentTime) { + Date date = new Date(); + Calendar cal = Calendar.getInstance(); + + date.setTime(currentTime); + cal.setTime(date); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.add(Calendar.HOUR_OF_DAY, 24); + + return cal.getTime().getTime(); + } +} diff --git a/Server/src/main/java/Server/core/cache/Cache.java b/Server/src/main/java/Server/core/cache/Cache.java new file mode 100644 index 000000000..dd7ace771 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/Cache.java @@ -0,0 +1,238 @@ +package core.cache; + +import java.io.File; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; + +import core.ServerConstants; +import core.cache.def.impl.AnimationDefinition; +import core.cache.def.impl.GraphicDefinition; +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.system.SystemLogger; + +/** + * A cache reader. + * + * @author Emperor + * @author Dragonkk + */ +public final class Cache { + + /** + * The cache file manager. + */ + private static CacheFileManager[] cacheFileManagers; + + /** + * The container cache file informer. + */ + private static CacheFile referenceFile; + + /** + * Construct a new instance. + */ + private Cache(String location) { + try { + init(location); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + /** + * Initialize the cache reader. + * + * @param path The cache path.x + * @throws Throwable When an exception occurs. + */ + public static void init(String path) throws Throwable { + SystemLogger.logInfo("Initializing cache..."); + byte[] cacheFileBuffer = new byte[520]; + RandomAccessFile containersInformFile = new RandomAccessFile(path + File.separator + "main_file_cache.idx255", "r"); + RandomAccessFile dataFile = new RandomAccessFile(path + File.separator + "main_file_cache.dat2", "r"); + referenceFile = new CacheFile(255, containersInformFile, dataFile, 500000, cacheFileBuffer); + int length = (int) (containersInformFile.length() / 6); + cacheFileManagers = new CacheFileManager[length]; + for (int i = 0; i < length; i++) { + File f = new File(path + File.separator + "main_file_cache.idx" + i); + if (f.exists() && f.length() > 0) { + CacheFile cacheFile = new CacheFile(i, new RandomAccessFile(f, "r"), dataFile, 1000000, cacheFileBuffer); + cacheFileManagers[i] = new CacheFileManager(cacheFile, true); + if (cacheFileManagers[i].getInformation() == null) { + SystemLogger.logErr("Error loading cache index " + i + ": no information."); + cacheFileManagers[i] = null; + } + } + } + ItemDefinition.parse(); + ObjectDefinition.parse(); + } + + /** + * Initializes the cache. + */ + public static void init() { + try { + init(ServerConstants.CACHE_PATH); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + /** + * Gets the archive buffer for the grab requests. + * + * @param index The index id. + * @param archive The archive id. + * @param priority The priority. + * @param encryptionValue The current encryption value. + * @return The byte buffer. + */ + public static ByteBuffer getArchiveData(int index, int archive, boolean priority, int encryptionValue) { + byte[] data = index == 255 ? referenceFile.getContainerData(archive) : cacheFileManagers[index].getCacheFile().getContainerData(archive); + if (data == null || data.length < 1) { + SystemLogger.logErr("Invalid JS-5 request - " + index + ", " + archive + ", " + priority + ", " + encryptionValue + "!"); + return null; + } + int compression = data[0] & 0xff; + int length = ((data[1] & 0xff) << 24) + ((data[2] & 0xff) << 16) + ((data[3] & 0xff) << 8) + (data[4] & 0xff); + int settings = compression; + if (!priority) { + settings |= 0x80; + } + int realLength = compression != 0 ? length + 4 : length; + + // TODO There are two archives that lack two bytes at the end (The version, most likely). This causes the client CRC to be miscalculated. To combat this, we simply send two more bytes if the length seems to be off. + realLength += (index != 255 && compression != 0 && data.length - length == 9) ? 2 : 0; + ByteBuffer buffer = ByteBuffer.allocate((realLength + 5) + (realLength / 512) + 10); + buffer.put((byte) index); + buffer.putShort((short) archive); + buffer.put((byte) settings); + buffer.putInt(length); + for (int i = 5; i < realLength + 5; i++) { + if (buffer.position() % 512 == 0) { + buffer.put((byte) 255); + } + if (data.length > i) + buffer.put(data[i]); + else + buffer.put((byte) 0); + } + if (encryptionValue != 0) { + for (int i = 0; i < buffer.position(); i++) { + buffer.put(i, (byte) (buffer.get(i) ^ encryptionValue)); + } + } + buffer.flip(); + return buffer; + } + + /** + * Generate the reference data for the cache files. + * + * @return The reference data byte array. + */ + public static final byte[] generateReferenceData() { + ByteBuffer buffer = ByteBuffer.allocate(cacheFileManagers.length * 8); + for (int index = 0; index < cacheFileManagers.length; index++) { + if (cacheFileManagers[index] == null) { + buffer.putInt(index == 24 ? 609698396 : 0); + buffer.putInt(0); + continue; + } + buffer.putInt(cacheFileManagers[index].getInformation().getInformationContainer().getCrc()); + buffer.putInt(cacheFileManagers[index].getInformation().getRevision()); + } + return buffer.array(); + } + + /** + * Get the cache file managers. + * + * @return The cache file managers. + */ + public static final CacheFileManager[] getIndexes() { + return cacheFileManagers; + } + + /** + * Get the container cache file informer. + * + * @return The container cache file informer. + */ + public static final CacheFile getReferenceFile() { + return referenceFile; + } + + /** + * Method used to return the component size of the interface. + * + * @param interfaceId the interface. + * @return the value. + */ + public static final int getInterfaceDefinitionsComponentsSize(int interfaceId) { + return getIndexes()[3].getFilesSize(interfaceId); + } + + /** + * Method used to return the max size of the interface definitions. + * + * @return the size. + */ + public static final int getInterfaceDefinitionsSize() { + return getIndexes()[3].getContainersSize(); + } + + /** + * Method used to return the {@link NPCDefinition} size. + * + * @return the size. + */ + public static final int getNPCDefinitionsSize() { + int lastContainerId = getIndexes()[18].getContainersSize() - 1; + return lastContainerId * 128 + getIndexes()[18].getFilesSize(lastContainerId); + } + + /** + * Method used to return the {@link GraphicDefinition} size. + * + * @return the size. + */ + public static final int getGraphicDefinitionsSize() { + int lastContainerId = getIndexes()[21].getContainersSize() - 1; + return lastContainerId * 256 + getIndexes()[21].getFilesSize(lastContainerId); + } + + /** + * Method used to return the {@link AnimationDefinition} size. + * + * @return the size. + */ + public static final int getAnimationDefinitionsSize() { + int lastContainerId = getIndexes()[20].getContainersSize() - 1; + return lastContainerId * 128 + getIndexes()[20].getFilesSize(lastContainerId); + } + + /** + * Method used to return the {@link ObjectDefinition} size. + * + * @return the size. + */ + public static final int getObjectDefinitionsSize() { + int lastContainerId = getIndexes()[16].getContainersSize() - 1; + return lastContainerId * 256 + getIndexes()[16].getFilesSize(lastContainerId); + } + + /** + * Method used to return the item definition size. + * + * @return the size. + */ + public static final int getItemDefinitionsSize() { + int lastContainerId = getIndexes()[19].getContainersSize() - 1; + return lastContainerId * 256 + getIndexes()[19].getFilesSize(lastContainerId); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/CacheFile.java b/Server/src/main/java/Server/core/cache/CacheFile.java new file mode 100644 index 000000000..a03642895 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/CacheFile.java @@ -0,0 +1,148 @@ +package core.cache; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; + +import core.cache.crypto.XTEACryption; +import core.cache.misc.ContainersInformation; + +/** + * A cache file. + * @author Dragonkk + */ +public final class CacheFile { + + /** + * The index file id. + */ + private int indexFileId; + + /** + * The cache file buffer. + */ + private byte[] cacheFileBuffer; + + /** + * The maximum container size. + */ + private int maxContainerSize; + + /** + * The index file. + */ + private RandomAccessFile indexFile; + + /** + * The data file. + */ + private RandomAccessFile dataFile; + + /** + * Construct a new cache file. + * @param indexFileId The index file id. + * @param indexFile The index file. + * @param dataFile The data file. + * @param maxContainerSize The maximum container size. + * @param cacheFileBuffer The cache file buffer. + */ + public CacheFile(int indexFileId, RandomAccessFile indexFile, RandomAccessFile dataFile, int maxContainerSize, byte[] cacheFileBuffer) { + this.cacheFileBuffer = cacheFileBuffer; + this.indexFileId = indexFileId; + this.maxContainerSize = maxContainerSize; + this.indexFile = indexFile; + this.dataFile = dataFile; + } + + /** + * Get the unpacked container data. + * @param containerId The container id. + * @param xteaKeys The container keys. + * @return The unpacked container data. + */ + public final byte[] getContainerUnpackedData(int containerId, int[] xteaKeys) { + byte[] packedData = getContainerData(containerId); + if (packedData == null) { + return null; + } + if (xteaKeys != null && (xteaKeys[0] != 0 || xteaKeys[1] != 0 || xteaKeys[2] != 0 || xteaKeys[3] != 0)) { + packedData = XTEACryption.decrypt(xteaKeys, ByteBuffer.wrap(packedData), 5, packedData.length).array(); + } + return ContainersInformation.unpackCacheContainer(packedData); + } + + /** + * Get the container data for the specified container id. + * @param containerId The container id. + * @return The container data. + */ + public final byte[] getContainerData(int containerId) { + synchronized (dataFile) { + try { + if (indexFile.length() < (6 * containerId + 6)) { + return null; + } + indexFile.seek(6 * containerId); + indexFile.read(cacheFileBuffer, 0, 6); + int containerSize = (cacheFileBuffer[2] & 0xff) + (((0xff & cacheFileBuffer[0]) << 16) + (cacheFileBuffer[1] << 8 & 0xff00)); + int sector = ((cacheFileBuffer[3] & 0xff) << 16) - (-(0xff00 & cacheFileBuffer[4] << 8) - (cacheFileBuffer[5] & 0xff)); + if (containerSize < 0 || containerSize > maxContainerSize) { + return null; + } + if (sector <= 0 || dataFile.length() / 520L < sector) { + return null; + } + byte data[] = new byte[containerSize]; + int dataReadCount = 0; + int part = 0; + while (containerSize > dataReadCount) { + if (sector == 0) { + return null; + } + dataFile.seek(520 * sector); + int dataToReadCount = containerSize - dataReadCount; + if (dataToReadCount > 512) { + dataToReadCount = 512; + } + dataFile.read(cacheFileBuffer, 0, 8 + dataToReadCount); + int currentContainerId = (0xff & cacheFileBuffer[1]) + (0xff00 & cacheFileBuffer[0] << 8); + int currentPart = ((cacheFileBuffer[2] & 0xff) << 8) + (0xff & cacheFileBuffer[3]); + int nextSector = (cacheFileBuffer[6] & 0xff) + (0xff00 & cacheFileBuffer[5] << 8) + ((0xff & cacheFileBuffer[4]) << 16); + int currentIndexFileId = cacheFileBuffer[7] & 0xff; + if (containerId != currentContainerId || currentPart != part || indexFileId != currentIndexFileId) { + return null; + } + if (nextSector < 0 || (dataFile.length() / 520L) < nextSector) { + return null; + } + for (int index = 0; dataToReadCount > index; index++) { + data[dataReadCount++] = cacheFileBuffer[8 + index]; + } + part++; + sector = nextSector; + } + return data; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + } + + /** + * Get the index file id. + * @return + */ + public int getIndexFileId() { + return indexFileId; + } + + /** + * Get the unpacked container data. + * @param containerId The container id. + * @return The unpacked container data. + */ + public final byte[] getContainerUnpackedData(int containerId) { + return getContainerUnpackedData(containerId, null); + } +} diff --git a/Server/src/main/java/Server/core/cache/CacheFileManager.java b/Server/src/main/java/Server/core/cache/CacheFileManager.java new file mode 100644 index 000000000..023803ea2 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/CacheFileManager.java @@ -0,0 +1,293 @@ +package core.cache; + +import java.nio.ByteBuffer; + +import core.cache.misc.ContainersInformation; +import core.tools.StringUtils; + +/** + * A cache file manager. + * @author Dragonkk + */ +public final class CacheFileManager { + + /** + * The cache file. + */ + private CacheFile cacheFile; + + /** + * The containers information. + */ + private ContainersInformation information; + + /** + * Discard a files data. + */ + private boolean discardFilesData; + + /** + * A array holding file data. + */ + private byte[][][] filesData; + + /** + * Construct a new cache file manager. + * @param cacheFile The cache file. + * @param discardFilesData To discard a files data. + */ + public CacheFileManager(CacheFile cacheFile, boolean discardFilesData) { + this.cacheFile = cacheFile; + this.discardFilesData = discardFilesData; + byte[] informContainerPackedData = Cache.getReferenceFile().getContainerData(cacheFile.getIndexFileId()); + if (informContainerPackedData == null) { + return; + } + information = new ContainersInformation(informContainerPackedData); + resetFilesData(); + } + + /** + * Get the cache file. + * @return The cache file. + */ + public CacheFile getCacheFile() { + return cacheFile; + } + + /** + * Get the containers size. + * @return The containers size. + */ + public int getContainersSize() { + return information.getContainers().length; + } + + /** + * Get the files size. + * @param containerId The container id. + * @return The files size. + */ + public int getFilesSize(int containerId) { + if (!validContainer(containerId)) { + return -1; + } + return information.getContainers()[containerId].getFiles().length; + } + + /** + * Reset the file data. + */ + public void resetFilesData() { + filesData = new byte[information.getContainers().length][][]; + } + + /** + * Check if a file is valid. + * @param containerId The container id. + * @param fileId The file id. + * @return If the file is valid {@code true}. + */ + public boolean validFile(int containerId, int fileId) { + if (!validContainer(containerId)) { + return false; + } + if (fileId < 0 || information.getContainers()[containerId] == null || information.getContainers()[containerId].getFiles().length <= fileId) { + return false; + } + return true; + + } + + /** + * If a container is valid. + * @param containerId The container id. + * @return If the container is valid {@code true}. + */ + public boolean validContainer(int containerId) { + if (containerId < 0 || information.getContainers().length <= containerId) { + return false; + } + return true; + } + + /** + * Get the file ids. + * @param containerId The container id. + * @return The file ids. + */ + public int[] getFileIds(int containerId) { + if (!validContainer(containerId)) { + return null; + } + return information.getContainers()[containerId].getFilesIndexes(); + } + + /** + * Get the archive id. + * @param name The archive name. + * @return The archive id. + */ + public int getArchiveId(String name) { + if (name == null) { + return -1; + } + int hash = StringUtils.getNameHash(name); + for (int containerIndex = 0; containerIndex < information.getContainersIndexes().length; containerIndex++) { + if (information.getContainers()[information.getContainersIndexes()[containerIndex]].getNameHash() == hash) { + return information.getContainersIndexes()[containerIndex]; + } + } + return -1; + } + + /** + * Get the file data. + * @param containerId The container id. + * @param fileId The file id. + * @return The get file data. + */ + public byte[] getFileData(int containerId, int fileId) { + return getFileData(containerId, fileId, null); + } + + /** + * Load the file data. + * @param archiveId The container id. + * @param keys The container keys. + * @return If the file data is loaded {@code true}. + */ + public boolean loadFilesData(int archiveId, int[] keys) { + byte[] data = cacheFile.getContainerUnpackedData(archiveId, keys); + if (data == null) { + return false; + } + if (filesData[archiveId] == null) { + if (information.getContainers()[archiveId] == null) { + return false; // container inform doesnt exist anymore + } + filesData[archiveId] = new byte[information.getContainers()[archiveId].getFiles().length][]; + } + if (information.getContainers()[archiveId].getFilesIndexes().length == 1) { + int fileId = information.getContainers()[archiveId].getFilesIndexes()[0]; + filesData[archiveId][fileId] = data; + } else { + int readPosition = data.length; + int amtOfLoops = data[--readPosition] & 0xff; + readPosition -= amtOfLoops * (information.getContainers()[archiveId].getFilesIndexes().length * 4); + ByteBuffer buffer = ByteBuffer.wrap(data); + int filesSize[] = new int[information.getContainers()[archiveId].getFilesIndexes().length]; + buffer.position(readPosition); + for (int loop = 0; loop < amtOfLoops; loop++) { + int offset = 0; + for (int fileIndex = 0; fileIndex < information.getContainers()[archiveId].getFilesIndexes().length; fileIndex++) { + filesSize[fileIndex] += offset += buffer.getInt(); + } + } + byte[][] filesBufferData = new byte[information.getContainers()[archiveId].getFilesIndexes().length][]; + for (int fileIndex = 0; fileIndex < information.getContainers()[archiveId].getFilesIndexes().length; fileIndex++) { + filesBufferData[fileIndex] = new byte[filesSize[fileIndex]]; + filesSize[fileIndex] = 0; + } + buffer.position(readPosition); + int sourceOffset = 0; + for (int loop = 0; loop < amtOfLoops; loop++) { + int dataRead = 0; + for (int fileIndex = 0; fileIndex < information.getContainers()[archiveId].getFilesIndexes().length; fileIndex++) { + dataRead += buffer.getInt(); + System.arraycopy(data, sourceOffset, filesBufferData[fileIndex], filesSize[fileIndex], dataRead); + sourceOffset += dataRead; + filesSize[fileIndex] += dataRead; + } + } + for (int fileIndex = 0; fileIndex < information.getContainers()[archiveId].getFilesIndexes().length; fileIndex++) { + filesData[archiveId][information.getContainers()[archiveId].getFilesIndexes()[fileIndex]] = filesBufferData[fileIndex]; + } + } + return true; + + } + + /** + * Get the file data. + * @param containerId The container id. + * @param fileId The file id. + * @param xteaKeys The container keys. + * @return The file data. + */ + public byte[] getFileData(int containerId, int fileId, int[] xteaKeys) { + if (!validFile(containerId, fileId)) { + return null; + } + if (filesData[containerId] == null || filesData[containerId][fileId] == null) { + if (!loadFilesData(containerId, xteaKeys)) { + return null; + } + } + byte[] data = filesData[containerId][fileId]; + if (discardFilesData) { + if (filesData[containerId].length == 1) { + filesData[containerId] = null; + } else { + filesData[containerId][fileId] = null; + } + } + return data; + } + + /** + * Get the containers information. + * @return The containers information. + */ + public ContainersInformation getInformation() { + return information; + } + + /** + * Gets the discardFilesData. + * @return the discardFilesData. + */ + public boolean isDiscardFilesData() { + return discardFilesData; + } + + /** + * Sets the discardFilesData. + * @param discardFilesData the discardFilesData to set + */ + public void setDiscardFilesData(boolean discardFilesData) { + this.discardFilesData = discardFilesData; + } + + /** + * Gets the filesData. + * @return the filesData. + */ + public byte[][][] getFilesData() { + return filesData; + } + + /** + * Sets the filesData. + * @param filesData the filesData to set + */ + public void setFilesData(byte[][][] filesData) { + this.filesData = filesData; + } + + /** + * Sets the cacheFile. + * @param cacheFile the cacheFile to set + */ + public void setCacheFile(CacheFile cacheFile) { + this.cacheFile = cacheFile; + } + + /** + * Sets the information. + * @param information the information to set + */ + public void setInformation(ContainersInformation information) { + this.information = information; + } +} diff --git a/Server/src/main/java/Server/core/cache/ServerStore.java b/Server/src/main/java/Server/core/cache/ServerStore.java new file mode 100644 index 000000000..207c511c6 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/ServerStore.java @@ -0,0 +1,193 @@ +package core.cache; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileChannel.MapMode; +import java.util.HashMap; +import java.util.Map; + +import core.cache.misc.buffer.ByteBufferUtils; + +/** + * The server data storage. + * @author Emperor + */ +public final class ServerStore { + + /** + * The storage. + */ + private static Map storage = new HashMap<>(); + + /** + * If the store has initialized. + */ + private static boolean initialized; + + /** + * Initializes the store. + * @param path The file path. + */ + public static void init(String path) { + storage = new HashMap<>(); + File file = new File(path + "/dynamic_cache.keldagrim"); + if (file.exists()) { + try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) { + FileChannel channel = raf.getChannel(); + ByteBuffer buffer = channel.map(MapMode.READ_WRITE, 0, channel.size()); + int size = buffer.getShort() & 0xFFFF; + for (int i = 0; i < size; i++) { + StoreFile store = new StoreFile(); + store.setDynamic(true); + String archive = ByteBufferUtils.getString(buffer); + byte[] data = new byte[buffer.getInt()]; + buffer.get(data); + store.setData(data); + storage.put(archive, store); + } + if (buffer.hasRemaining()) { + throw new IllegalStateException("Unable to read all dynamic data (size=" + size + ")!"); + } + channel.close(); + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + initialized = true; + } + + /** + * Used for writing the static store. + * @param path The path. + */ + public static void createStaticStore(String path) { + write(path + "/static_cache.keldagrim", false); + } + + /** + * Writes all the dynamic storage files (on server termination). + * @param path The path. + */ + public static void dump(String path) { + write(path + "/dynamic_cache.keldagrim", true); + } + + /** + * Writes the store file to the given file path. + * @param filePath The file path. + * @param dynamic If the dynamic store is being written. + */ + public static void write(String filePath, boolean dynamic) { + if (!initialized) { + throw new IllegalStateException("Server store has not been initialized!"); + } + File f = new File(filePath); + if (f.exists()) { + f.delete(); + } + ByteBuffer buffer = ByteBuffer.allocate(1 << 28); + buffer.putShort((short) 0); + int size = 0; + for (String archive : storage.keySet()) { + StoreFile file = storage.get(archive); + if (file.isDynamic() != dynamic) { + continue; + } + size++; + ByteBuffer buf = file.data(); + ByteBufferUtils.putString(archive, buffer); + buffer.putInt(buf.remaining()); + buffer.put(buf); + } + buffer.putShort(0, (short) size); + buffer.flip(); + try (RandomAccessFile raf = new RandomAccessFile(f, "rw")) { + FileChannel channel = raf.getChannel(); + channel.write(buffer); + channel.close(); + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Sets the archive data. + * @param archive The archive id. + * @param buffer The readable buffer. + */ + public static void setArchive(String archive, ByteBuffer buffer) { + setArchive(archive, buffer, true); + } + + /** + * Sets the archive data. + * @param archive The archive id. + * @param buffer The readable buffer. + * @param dynamic If the data changes during server runtime. + */ + public static void setArchive(String archive, ByteBuffer buffer, boolean dynamic) { + byte[] data = new byte[buffer.remaining()]; + buffer.get(data); + setArchive(archive, data, dynamic, true); + } + + /** + * Sets the archive data. + * @param archive The archive index. + * @param data The archive data. + * @param dynamic If the data changes during server runtime. + */ + public static void setArchive(String archive, byte[] data, boolean dynamic) { + setArchive(archive, data, dynamic, true); + } + + /** + * Sets the archive data. + * @param archive The archive index. + * @param data The archive data. + * @param dynamic If the data changes during server runtime. + * @param overwrite If the archive should be overwritten. + */ + public static void setArchive(String archive, byte[] data, boolean dynamic, boolean overwrite) { + StoreFile file = storage.get(archive); + if (file == null) { + storage.put(archive, file = new StoreFile()); + } else if (!overwrite) { + throw new IllegalStateException("Already contained archive " + archive + "!"); + } + file.setDynamic(dynamic); + file.setData(data); + } + + /** + * Gets the archive data for the given archive id. + * @param archive The archive index. + * @return The archive data. + */ + public static ByteBuffer getArchive(String archive) { + return get(archive).data(); + } + + /** + * Sets the archive file. + * @param archive The archive. + * @param file The file. + */ + public static void set(String archive, StoreFile file) { + storage.put(archive, file); + } + + /** + * Gets the store file for the given archive. + * @param archive The archive id. + * @return The store file. + */ + public static StoreFile get(String archive) { + return storage.get(archive); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/StoreFile.java b/Server/src/main/java/Server/core/cache/StoreFile.java new file mode 100644 index 000000000..50e1728d0 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/StoreFile.java @@ -0,0 +1,72 @@ +package core.cache; + +import java.nio.ByteBuffer; + +/** + * Represents a file used in the server store. + * @author Emperor + */ +public final class StoreFile { + + /** + * If the data can change during server runtime. + */ + private boolean dynamic; + + /** + * The file data. + */ + private byte[] data; + + /** + * Constructs a new {@code StoreFile} {@code Object}. + */ + public StoreFile() { + /* + * empty. + */ + } + + /** + * Puts the data on the buffer. + * @param buffer The buffer. + */ + public void put(ByteBuffer buffer) { + byte[] data = new byte[buffer.remaining()]; + buffer.get(data); + this.data = data; + } + + /** + * Creates a byte buffer containing the file data. + * @return The buffer. + */ + public ByteBuffer data() { + return ByteBuffer.wrap(data); + } + + /** + * Sets the data. + * @param data The data. + */ + public void setData(byte[] data) { + this.data = data; + } + + /** + * Gets the dynamic. + * @return The dynamic. + */ + public boolean isDynamic() { + return dynamic; + } + + /** + * Sets the dynamic. + * @param dynamic The dynamic to set. + */ + public void setDynamic(boolean dynamic) { + this.dynamic = dynamic; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/bzip2/BZip2BlockEntry.java b/Server/src/main/java/Server/core/cache/bzip2/BZip2BlockEntry.java new file mode 100644 index 000000000..c5c304dd7 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/bzip2/BZip2BlockEntry.java @@ -0,0 +1,56 @@ +package core.cache.bzip2; + +public class BZip2BlockEntry { + + boolean aBooleanArray2205[]; + boolean aBooleanArray2213[]; + byte aByte2201; + byte aByteArray2204[]; + byte aByteArray2211[]; + byte aByteArray2212[]; + byte aByteArray2214[]; + byte aByteArray2219[]; + byte aByteArray2224[]; + byte aByteArrayArray2229[][]; + int anInt2202; + int anInt2203; + int anInt2206; + int anInt2207; + int anInt2208; + int anInt2209; + int anInt2215; + int anInt2216; + int anInt2217; + int anInt2221; + int anInt2222; + int anInt2223; + int anInt2225; + int anInt2227; + int anInt2232; + int anIntArray2200[]; + int anIntArray2220[]; + int anIntArray2226[]; + int anIntArray2228[]; + int anIntArrayArray2210[][]; + int anIntArrayArray2218[][]; + int anIntArrayArray2230[][]; + + public BZip2BlockEntry() { + anIntArray2200 = new int[6]; + anInt2203 = 0; + aByteArray2204 = new byte[4096]; + aByteArray2211 = new byte[256]; + aByteArray2214 = new byte[18002]; + aByteArray2219 = new byte[18002]; + anIntArray2220 = new int[257]; + anIntArrayArray2218 = new int[6][258]; + aBooleanArray2205 = new boolean[16]; + aBooleanArray2213 = new boolean[256]; + anInt2209 = 0; + anIntArray2226 = new int[16]; + anIntArrayArray2210 = new int[6][258]; + aByteArrayArray2229 = new byte[6][258]; + anIntArrayArray2230 = new int[6][258]; + anIntArray2228 = new int[256]; + } +} diff --git a/Server/src/main/java/Server/core/cache/bzip2/BZip2Decompressor.java b/Server/src/main/java/Server/core/cache/bzip2/BZip2Decompressor.java new file mode 100644 index 000000000..0af0ddc5a --- /dev/null +++ b/Server/src/main/java/Server/core/cache/bzip2/BZip2Decompressor.java @@ -0,0 +1,536 @@ +package core.cache.bzip2; + +public class BZip2Decompressor { + + private static int anIntArray257[]; + private static BZip2BlockEntry entryInstance = new BZip2BlockEntry(); + + public static final void decompress(byte decompressedData[], byte packedData[], int containerSize, int blockSize) { + synchronized (entryInstance) { + entryInstance.aByteArray2224 = packedData; + entryInstance.anInt2209 = blockSize; + entryInstance.aByteArray2212 = decompressedData; + entryInstance.anInt2203 = 0; + entryInstance.anInt2206 = decompressedData.length; + entryInstance.anInt2232 = 0; + entryInstance.anInt2207 = 0; + entryInstance.anInt2217 = 0; + entryInstance.anInt2216 = 0; + method1793(entryInstance); + entryInstance.aByteArray2224 = null; + entryInstance.aByteArray2212 = null; + } + } + + private static final void method1785(BZip2BlockEntry entry) { + entry.anInt2215 = 0; + for (int i = 0; i < 256; i++) { + if (entry.aBooleanArray2213[i]) { + entry.aByteArray2211[entry.anInt2215] = (byte) i; + entry.anInt2215++; + } + } + + } + + private static final void method1786(int ai[], int ai1[], int ai2[], byte abyte0[], int i, int j, int k) { + int l = 0; + for (int i1 = i; i1 <= j; i1++) { + for (int l2 = 0; l2 < k; l2++) { + if (abyte0[l2] == i1) { + ai2[l] = l2; + l++; + } + } + + } + + for (int j1 = 0; j1 < 23; j1++) { + ai1[j1] = 0; + } + + for (int k1 = 0; k1 < k; k1++) { + ai1[abyte0[k1] + 1]++; + } + + for (int l1 = 1; l1 < 23; l1++) { + ai1[l1] += ai1[l1 - 1]; + } + + for (int i2 = 0; i2 < 23; i2++) { + ai[i2] = 0; + } + + int i3 = 0; + for (int j2 = i; j2 <= j; j2++) { + i3 += ai1[j2 + 1] - ai1[j2]; + ai[j2] = i3 - 1; + i3 <<= 1; + } + + for (int k2 = i + 1; k2 <= j; k2++) { + ai1[k2] = (ai[k2 - 1] + 1 << 1) - ai1[k2]; + } + + } + + private static final void method1787(BZip2BlockEntry entry) { + byte byte4 = entry.aByte2201; + int i = entry.anInt2222; + int j = entry.anInt2227; + int k = entry.anInt2221; + int ai[] = anIntArray257; + int l = entry.anInt2208; + byte abyte0[] = entry.aByteArray2212; + int i1 = entry.anInt2203; + int j1 = entry.anInt2206; + int k1 = j1; + int l1 = entry.anInt2225 + 1; + label0: do { + if (i > 0) { + do { + if (j1 == 0) { + break label0; + } + if (i == 1) { + break; + } + abyte0[i1] = byte4; + i--; + i1++; + j1--; + } while (true); + if (j1 == 0) { + i = 1; + break; + } + abyte0[i1] = byte4; + i1++; + j1--; + } + boolean flag = true; + while (flag) { + flag = false; + if (j == l1) { + i = 0; + break label0; + } + byte4 = (byte) k; + l = ai[l]; + byte byte0 = (byte) (l & 0xff); + l >>= 8; + j++; + if (byte0 != k) { + k = byte0; + if (j1 == 0) { + i = 1; + } else { + abyte0[i1] = byte4; + i1++; + j1--; + flag = true; + continue; + } + break label0; + } + if (j != l1) { + continue; + } + if (j1 == 0) { + i = 1; + break label0; + } + abyte0[i1] = byte4; + i1++; + j1--; + flag = true; + } + i = 2; + l = ai[l]; + byte byte1 = (byte) (l & 0xff); + l >>= 8; + if (++j != l1) { + if (byte1 != k) { + k = byte1; + } else { + i = 3; + l = ai[l]; + byte byte2 = (byte) (l & 0xff); + l >>= 8; + if (++j != l1) { + if (byte2 != k) { + k = byte2; + } else { + l = ai[l]; + byte byte3 = (byte) (l & 0xff); + l >>= 8; + j++; + i = (byte3 & 0xff) + 4; + l = ai[l]; + k = (byte) (l & 0xff); + l >>= 8; + j++; + } + } + } + } + } while (true); + entry.anInt2216 += k1 - j1; + entry.aByte2201 = byte4; + entry.anInt2222 = i; + entry.anInt2227 = j; + entry.anInt2221 = k; + anIntArray257 = ai; + entry.anInt2208 = l; + entry.aByteArray2212 = abyte0; + entry.anInt2203 = i1; + entry.anInt2206 = j1; + } + + private static final byte method1788(BZip2BlockEntry entry) { + return (byte) method1790(1, entry); + } + + private static final byte method1789(BZip2BlockEntry entryInstance2) { + return (byte) method1790(8, entryInstance2); + } + + private static final int method1790(int i, BZip2BlockEntry entry) { + int j; + do { + if (entry.anInt2232 >= i) { + int k = entry.anInt2207 >> entry.anInt2232 - i & (1 << i) - 1; + entry.anInt2232 -= i; + j = k; + break; + } + entry.anInt2207 = entry.anInt2207 << 8 | entry.aByteArray2224[entry.anInt2209] & 0xff; + entry.anInt2232 += 8; + entry.anInt2209++; + entry.anInt2217++; + } while (true); + return j; + } + + public static void clearBlockEntryInstance() { + entryInstance = null; + } + + private static final void method1793(BZip2BlockEntry entryInstance2) { + // unused + /* + * boolean flag = false; boolean flag1 = false; boolean flag2 = false; + * boolean flag3 = false; boolean flag4 = false; boolean flag5 = false; + * boolean flag6 = false; boolean flag7 = false; boolean flag8 = false; + * boolean flag9 = false; boolean flag10 = false; boolean flag11 = + * false; boolean flag12 = false; boolean flag13 = false; boolean flag14 + * = false; boolean flag15 = false; boolean flag16 = false; boolean + * flag17 = false; + */ + int j8 = 0; + int ai[] = null; + int ai1[] = null; + int ai2[] = null; + entryInstance2.anInt2202 = 1; + if (anIntArray257 == null) { + anIntArray257 = new int[entryInstance2.anInt2202 * 0x186a0]; + } + boolean flag18 = true; + while (flag18) { + byte byte0 = method1789(entryInstance2); + if (byte0 == 23) { + return; + } + byte0 = method1789(entryInstance2); + byte0 = method1789(entryInstance2); + byte0 = method1789(entryInstance2); + byte0 = method1789(entryInstance2); + byte0 = method1789(entryInstance2); + byte0 = method1789(entryInstance2); + byte0 = method1789(entryInstance2); + byte0 = method1789(entryInstance2); + byte0 = method1789(entryInstance2); + byte0 = method1788(entryInstance2); + entryInstance2.anInt2223 = 0; + byte0 = method1789(entryInstance2); + entryInstance2.anInt2223 = entryInstance2.anInt2223 << 8 | byte0 & 0xff; + byte0 = method1789(entryInstance2); + entryInstance2.anInt2223 = entryInstance2.anInt2223 << 8 | byte0 & 0xff; + byte0 = method1789(entryInstance2); + entryInstance2.anInt2223 = entryInstance2.anInt2223 << 8 | byte0 & 0xff; + for (int j = 0; j < 16; j++) { + byte byte1 = method1788(entryInstance2); + if (byte1 == 1) { + entryInstance2.aBooleanArray2205[j] = true; + } else { + entryInstance2.aBooleanArray2205[j] = false; + } + } + + for (int k = 0; k < 256; k++) { + entryInstance2.aBooleanArray2213[k] = false; + } + + for (int l = 0; l < 16; l++) { + if (entryInstance2.aBooleanArray2205[l]) { + for (int i3 = 0; i3 < 16; i3++) { + byte byte2 = method1788(entryInstance2); + if (byte2 == 1) { + entryInstance2.aBooleanArray2213[l * 16 + i3] = true; + } + } + + } + } + + method1785(entryInstance2); + int i4 = entryInstance2.anInt2215 + 2; + int j4 = method1790(3, entryInstance2); + int k4 = method1790(15, entryInstance2); + for (int i1 = 0; i1 < k4; i1++) { + int j3 = 0; + do { + byte byte3 = method1788(entryInstance2); + if (byte3 == 0) { + break; + } + j3++; + } while (true); + entryInstance2.aByteArray2214[i1] = (byte) j3; + } + + byte abyte0[] = new byte[6]; + for (byte byte16 = 0; byte16 < j4; byte16++) { + abyte0[byte16] = byte16; + } + + for (int j1 = 0; j1 < k4; j1++) { + byte byte17 = entryInstance2.aByteArray2214[j1]; + byte byte15 = abyte0[byte17]; + for (; byte17 > 0; byte17--) { + abyte0[byte17] = abyte0[byte17 - 1]; + } + + abyte0[0] = byte15; + entryInstance2.aByteArray2219[j1] = byte15; + } + + for (int k3 = 0; k3 < j4; k3++) { + int k6 = method1790(5, entryInstance2); + for (int k1 = 0; k1 < i4; k1++) { + do { + byte byte4 = method1788(entryInstance2); + if (byte4 == 0) { + break; + } + byte4 = method1788(entryInstance2); + if (byte4 == 0) { + k6++; + } else { + k6--; + } + } while (true); + entryInstance2.aByteArrayArray2229[k3][k1] = (byte) k6; + } + + } + + for (int l3 = 0; l3 < j4; l3++) { + byte byte8 = 32; + int i = 0; + for (int l1 = 0; l1 < i4; l1++) { + if (entryInstance2.aByteArrayArray2229[l3][l1] > i) { + i = entryInstance2.aByteArrayArray2229[l3][l1]; + } + if (entryInstance2.aByteArrayArray2229[l3][l1] < byte8) { + byte8 = entryInstance2.aByteArrayArray2229[l3][l1]; + } + } + + method1786(entryInstance2.anIntArrayArray2230[l3], entryInstance2.anIntArrayArray2218[l3], entryInstance2.anIntArrayArray2210[l3], entryInstance2.aByteArrayArray2229[l3], byte8, i, i4); + entryInstance2.anIntArray2200[l3] = byte8; + } + + int l4 = entryInstance2.anInt2215 + 1; + int i5 = -1; + int j5 = 0; + for (int i2 = 0; i2 <= 255; i2++) { + entryInstance2.anIntArray2228[i2] = 0; + } + + int i9 = 4095; + for (int k8 = 15; k8 >= 0; k8--) { + for (int l8 = 15; l8 >= 0; l8--) { + entryInstance2.aByteArray2204[i9] = (byte) (k8 * 16 + l8); + i9--; + } + + entryInstance2.anIntArray2226[k8] = i9 + 1; + } + + int l5 = 0; + if (j5 == 0) { + i5++; + j5 = 50; + byte byte12 = entryInstance2.aByteArray2219[i5]; + j8 = entryInstance2.anIntArray2200[byte12]; + ai = entryInstance2.anIntArrayArray2230[byte12]; + ai2 = entryInstance2.anIntArrayArray2210[byte12]; + ai1 = entryInstance2.anIntArrayArray2218[byte12]; + } + j5--; + int l6 = j8; + int k7; + byte byte9; + for (k7 = method1790(l6, entryInstance2); k7 > ai[l6]; k7 = k7 << 1 | byte9) { + l6++; + byte9 = method1788(entryInstance2); + } + + for (int k5 = ai2[k7 - ai1[l6]]; k5 != l4;) { + if (k5 == 0 || k5 == 1) { + int i6 = -1; + int j6 = 1; + do { + if (k5 == 0) { + i6 += j6; + } else if (k5 == 1) { + i6 += 2 * j6; + } + j6 *= 2; + if (j5 == 0) { + i5++; + j5 = 50; + byte byte13 = entryInstance2.aByteArray2219[i5]; + j8 = entryInstance2.anIntArray2200[byte13]; + ai = entryInstance2.anIntArrayArray2230[byte13]; + ai2 = entryInstance2.anIntArrayArray2210[byte13]; + ai1 = entryInstance2.anIntArrayArray2218[byte13]; + } + j5--; + int i7 = j8; + int l7; + byte byte10; + for (l7 = method1790(i7, entryInstance2); l7 > ai[i7]; l7 = l7 << 1 | byte10) { + i7++; + byte10 = method1788(entryInstance2); + } + + k5 = ai2[l7 - ai1[i7]]; + } while (k5 == 0 || k5 == 1); + i6++; + byte byte5 = entryInstance2.aByteArray2211[entryInstance2.aByteArray2204[entryInstance2.anIntArray2226[0]] & 0xff]; + entryInstance2.anIntArray2228[byte5 & 0xff] += i6; + for (; i6 > 0; i6--) { + anIntArray257[l5] = byte5 & 0xff; + l5++; + } + + } else { + int i11 = k5 - 1; + byte byte6; + if (i11 < 16) { + int i10 = entryInstance2.anIntArray2226[0]; + byte6 = entryInstance2.aByteArray2204[i10 + i11]; + for (; i11 > 3; i11 -= 4) { + int j11 = i10 + i11; + entryInstance2.aByteArray2204[j11] = entryInstance2.aByteArray2204[j11 - 1]; + entryInstance2.aByteArray2204[j11 - 1] = entryInstance2.aByteArray2204[j11 - 2]; + entryInstance2.aByteArray2204[j11 - 2] = entryInstance2.aByteArray2204[j11 - 3]; + entryInstance2.aByteArray2204[j11 - 3] = entryInstance2.aByteArray2204[j11 - 4]; + } + + for (; i11 > 0; i11--) { + entryInstance2.aByteArray2204[i10 + i11] = entryInstance2.aByteArray2204[(i10 + i11) - 1]; + } + + entryInstance2.aByteArray2204[i10] = byte6; + } else { + int k10 = i11 / 16; + int l10 = i11 % 16; + int j10 = entryInstance2.anIntArray2226[k10] + l10; + byte6 = entryInstance2.aByteArray2204[j10]; + for (; j10 > entryInstance2.anIntArray2226[k10]; j10--) { + entryInstance2.aByteArray2204[j10] = entryInstance2.aByteArray2204[j10 - 1]; + } + + entryInstance2.anIntArray2226[k10]++; + for (; k10 > 0; k10--) { + entryInstance2.anIntArray2226[k10]--; + entryInstance2.aByteArray2204[entryInstance2.anIntArray2226[k10]] = entryInstance2.aByteArray2204[(entryInstance2.anIntArray2226[k10 - 1] + 16) - 1]; + } + + entryInstance2.anIntArray2226[0]--; + entryInstance2.aByteArray2204[entryInstance2.anIntArray2226[0]] = byte6; + if (entryInstance2.anIntArray2226[0] == 0) { + int l9 = 4095; + for (int j9 = 15; j9 >= 0; j9--) { + for (int k9 = 15; k9 >= 0; k9--) { + entryInstance2.aByteArray2204[l9] = entryInstance2.aByteArray2204[entryInstance2.anIntArray2226[j9] + k9]; + l9--; + } + + entryInstance2.anIntArray2226[j9] = l9 + 1; + } + + } + } + entryInstance2.anIntArray2228[entryInstance2.aByteArray2211[byte6 & 0xff] & 0xff]++; + anIntArray257[l5] = entryInstance2.aByteArray2211[byte6 & 0xff] & 0xff; + l5++; + if (j5 == 0) { + i5++; + j5 = 50; + byte byte14 = entryInstance2.aByteArray2219[i5]; + j8 = entryInstance2.anIntArray2200[byte14]; + ai = entryInstance2.anIntArrayArray2230[byte14]; + ai2 = entryInstance2.anIntArrayArray2210[byte14]; + ai1 = entryInstance2.anIntArrayArray2218[byte14]; + } + j5--; + int j7 = j8; + int i8; + byte byte11; + for (i8 = method1790(j7, entryInstance2); i8 > ai[j7]; i8 = i8 << 1 | byte11) { + j7++; + byte11 = method1788(entryInstance2); + } + + k5 = ai2[i8 - ai1[j7]]; + } + } + + entryInstance2.anInt2222 = 0; + entryInstance2.aByte2201 = 0; + entryInstance2.anIntArray2220[0] = 0; + for (int j2 = 1; j2 <= 256; j2++) { + entryInstance2.anIntArray2220[j2] = entryInstance2.anIntArray2228[j2 - 1]; + } + + for (int k2 = 1; k2 <= 256; k2++) { + entryInstance2.anIntArray2220[k2] += entryInstance2.anIntArray2220[k2 - 1]; + } + + for (int l2 = 0; l2 < l5; l2++) { + byte byte7 = (byte) (anIntArray257[l2] & 0xff); + anIntArray257[entryInstance2.anIntArray2220[byte7 & 0xff]] |= l2 << 8; + entryInstance2.anIntArray2220[byte7 & 0xff]++; + } + + entryInstance2.anInt2208 = anIntArray257[entryInstance2.anInt2223] >> 8; + entryInstance2.anInt2227 = 0; + entryInstance2.anInt2208 = anIntArray257[entryInstance2.anInt2208]; + entryInstance2.anInt2221 = (byte) (entryInstance2.anInt2208 & 0xff); + entryInstance2.anInt2208 >>= 8; + entryInstance2.anInt2227++; + entryInstance2.anInt2225 = l5; + method1787(entryInstance2); + if (entryInstance2.anInt2227 == entryInstance2.anInt2225 + 1 && entryInstance2.anInt2222 == 0) { + flag18 = true; + } else { + flag18 = false; + } + } + } + +} diff --git a/Server/src/main/java/Server/core/cache/crypto/ISAACCipher.java b/Server/src/main/java/Server/core/cache/crypto/ISAACCipher.java new file mode 100644 index 000000000..16cd85b18 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/crypto/ISAACCipher.java @@ -0,0 +1,271 @@ +package core.cache.crypto; + +/** + *

An implementation of an ISAAC cipher. See + * http://en.wikipedia.org/wiki/ISAAC_(cipher) for more information.

+ *

This implementation is based on the one written by Bob Jenkins, which is + * available at + * http://www.burtleburtle.net/bob/java/rand/Rand.java.

+ * @author Graham Edgecombe + */ +public class ISAACCipher { + + /** + * The golden ratio. + */ + public static final int RATIO = 0x9e3779b9; + + /** + * The log of the size of the results and memory arrays. + */ + public static final int SIZE_LOG = 8; + + /** + * The size of the results and memory arrays. + */ + public static final int SIZE = 1 << SIZE_LOG; + + /** + * For pseudorandom lookup. + */ + public static final int MASK = (SIZE - 1) << 2; + + /** + * The count through the results. + */ + private int count = 0; + + /** + * The results. + */ + private int results[] = new int[SIZE]; + + /** + * The internal memory state. + */ + private int memory[] = new int[SIZE]; + + /** + * The accumulator. + */ + private int a; + + /** + * The last result. + */ + private int b; + + /** + * The counter. + */ + private int c; + + /** + * Creates the ISAAC cipher. + * @param seed The seed. + */ + public ISAACCipher(int[] seed) { + for (int i = 0; i < seed.length; i++) { + results[i] = seed[i]; + } + init(true); + } + + /** + * Gets the next value. + * @return The next value. + */ + public int getNextValue() { + if (count-- == 0) { + isaac(); + count = SIZE - 1; + } + return 0;//results[count]; + } + + /** + * Generates 256 results. + */ + public void isaac() { + int i, j, x, y; + b += ++c; + for (i = 0, j = SIZE / 2; i < SIZE / 2;) { + x = memory[i]; + a ^= a << 13; + a += memory[j++]; + memory[i] = y = memory[(x & MASK) >> 2] + a + b; + results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x; + + x = memory[i]; + a ^= a >>> 6; + a += memory[j++]; + memory[i] = y = memory[(x & MASK) >> 2] + a + b; + results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x; + + x = memory[i]; + a ^= a << 2; + a += memory[j++]; + memory[i] = y = memory[(x & MASK) >> 2] + a + b; + results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x; + + x = memory[i]; + a ^= a >>> 16; + a += memory[j++]; + memory[i] = y = memory[(x & MASK) >> 2] + a + b; + results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x; + } + for (j = 0; j < SIZE / 2;) { + x = memory[i]; + a ^= a << 13; + a += memory[j++]; + memory[i] = y = memory[(x & MASK) >> 2] + a + b; + results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x; + + x = memory[i]; + a ^= a >>> 6; + a += memory[j++]; + memory[i] = y = memory[(x & MASK) >> 2] + a + b; + results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x; + + x = memory[i]; + a ^= a << 2; + a += memory[j++]; + memory[i] = y = memory[(x & MASK) >> 2] + a + b; + results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x; + + x = memory[i]; + a ^= a >>> 16; + a += memory[j++]; + memory[i] = y = memory[(x & MASK) >> 2] + a + b; + results[i++] = b = memory[((y >> SIZE_LOG) & MASK) >> 2] + x; + } + } + + /** + * Initialises the ISAAC. + * @param flag Flag indicating if we should perform a second pass. + */ + public void init(boolean flag) { + int i; + int a, b, c, d, e, f, g, h; + a = b = c = d = e = f = g = h = RATIO; + for (i = 0; i < 4; ++i) { + a ^= b << 11; + d += a; + b += c; + b ^= c >>> 2; + e += b; + c += d; + c ^= d << 8; + f += c; + d += e; + d ^= e >>> 16; + g += d; + e += f; + e ^= f << 10; + h += e; + f += g; + f ^= g >>> 4; + a += f; + g += h; + g ^= h << 8; + b += g; + h += a; + h ^= a >>> 9; + c += h; + a += b; + } + for (i = 0; i < SIZE; i += 8) { + if (flag) { + a += results[i]; + b += results[i + 1]; + c += results[i + 2]; + d += results[i + 3]; + e += results[i + 4]; + f += results[i + 5]; + g += results[i + 6]; + h += results[i + 7]; + } + a ^= b << 11; + d += a; + b += c; + b ^= c >>> 2; + e += b; + c += d; + c ^= d << 8; + f += c; + d += e; + d ^= e >>> 16; + g += d; + e += f; + e ^= f << 10; + h += e; + f += g; + f ^= g >>> 4; + a += f; + g += h; + g ^= h << 8; + b += g; + h += a; + h ^= a >>> 9; + c += h; + a += b; + memory[i] = a; + memory[i + 1] = b; + memory[i + 2] = c; + memory[i + 3] = d; + memory[i + 4] = e; + memory[i + 5] = f; + memory[i + 6] = g; + memory[i + 7] = h; + } + if (flag) { + for (i = 0; i < SIZE; i += 8) { + a += memory[i]; + b += memory[i + 1]; + c += memory[i + 2]; + d += memory[i + 3]; + e += memory[i + 4]; + f += memory[i + 5]; + g += memory[i + 6]; + h += memory[i + 7]; + a ^= b << 11; + d += a; + b += c; + b ^= c >>> 2; + e += b; + c += d; + c ^= d << 8; + f += c; + d += e; + d ^= e >>> 16; + g += d; + e += f; + e ^= f << 10; + h += e; + f += g; + f ^= g >>> 4; + a += f; + g += h; + g ^= h << 8; + b += g; + h += a; + h ^= a >>> 9; + c += h; + a += b; + memory[i] = a; + memory[i + 1] = b; + memory[i + 2] = c; + memory[i + 3] = d; + memory[i + 4] = e; + memory[i + 5] = f; + memory[i + 6] = g; + memory[i + 7] = h; + } + } + isaac(); + count = SIZE; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/crypto/ISAACPair.java b/Server/src/main/java/Server/core/cache/crypto/ISAACPair.java new file mode 100644 index 000000000..83c4654b9 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/crypto/ISAACPair.java @@ -0,0 +1,45 @@ +package core.cache.crypto; + +/** + * Represents a ISAAC key pair, for both input and output. + * @author `Discardedx2 + */ +public final class ISAACPair { + + /** + * The input cipher. + */ + private ISAACCipher input; + + /** + * The output cipher. + */ + private ISAACCipher output; + + /** + * Constructs a new {@code ISAACPair} {@code Object}. + * @param input The input cipher. + * @param output The output cipher. + */ + public ISAACPair(ISAACCipher input, ISAACCipher output) { + this.input = input; + this.output = output; + } + + /** + * Gets the input cipher. + * @return The input cipher. + */ + public ISAACCipher getInput() { + return input; + } + + /** + * Gets the output cipher. + * @return The output cipher. + */ + public ISAACCipher getOutput() { + return output; + } + +} diff --git a/Server/src/main/java/Server/core/cache/crypto/XTEACryption.java b/Server/src/main/java/Server/core/cache/crypto/XTEACryption.java new file mode 100644 index 000000000..7ed799e58 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/crypto/XTEACryption.java @@ -0,0 +1,124 @@ +package core.cache.crypto; + +import java.nio.ByteBuffer; + +/** + * Holds XTEA cryption methods. + * @author ? + * @author Emperor + */ +public final class XTEACryption { + + /** + * The delta value + */ + private static final int DELTA = -1640531527; + + /** + * The sum. + */ + private static final int SUM = -957401312; + + /** + * The amount of "cryption cycles". + */ + private static final int NUM_ROUNDS = 32; + + /** + * Constructs a new {@code XTEACryption}. + */ + private XTEACryption() { + /* + * empty. + */ + } + + /** + * Decrypts the contents of the buffer. + * @param keys The cryption keys. + * @param buffer The buffer. + */ + public static ByteBuffer decrypt(int[] keys, ByteBuffer buffer) { + return decrypt(keys, buffer, buffer.position(), buffer.limit()); + } + + /** + * Decrypts the buffer data. + * @param keys The keys. + * @param buffer The buffer to decrypt. + * @param offset The offset of the data to decrypt. + * @param length The length. + * @return The decrypted data. + */ + public static ByteBuffer decrypt(int[] keys, ByteBuffer buffer, int offset, int length) { + int numBlocks = (length - offset) / 8; + int[] block = new int[2]; + for (int i = 0; i < numBlocks; i++) { + int index = i * 8 + offset; + block[0] = buffer.getInt(index); + block[1] = buffer.getInt(index + 4); + decipher(keys, block); + buffer.putInt(index, block[0]); + buffer.putInt(index + 4, block[1]); + } + return buffer; + } + + /** + * Deciphers the values. + * @param keys The cryption key. + * @param block The values to decipher. + */ + private static void decipher(int[] keys, int[] block) { + long sum = SUM; + for (int i = 0; i < NUM_ROUNDS; i++) { + block[1] -= (keys[(int) ((sum & 0x1933) >>> 11)] + sum ^ block[0] + (block[0] << 4 ^ block[0] >>> 5)); + sum -= DELTA; + block[0] -= ((block[1] << 4 ^ block[1] >>> 5) + block[1] ^ keys[(int) (sum & 0x3)] + sum); + } + } + + /** + * Encrypts the contents of the byte buffer. + * @param keys The cryption keys. + * @param buffer The buffer to encrypt. + */ + public static void encrypt(int[] keys, ByteBuffer buffer) { + encrypt(keys, buffer, buffer.position(), buffer.limit()); + } + + /** + * Encrypts the buffer data. + * @param keys The keys. + * @param buffer The buffer to encrypt. + * @param offset The offset of the data to encrypt. + * @param length The length. + * @return The encrypted data. + */ + public static void encrypt(int[] keys, ByteBuffer buffer, int offset, int length) { + int numBlocks = (length - offset) / 8; + int[] block = new int[2]; + for (int i = 0; i < numBlocks; i++) { + int index = i * 8 + offset; + block[0] = buffer.getInt(index); + block[1] = buffer.getInt(index + 4); + encipher(keys, block); + buffer.putInt(index, block[0]); + buffer.putInt(index + 4, block[1]); + } + } + + /** + * Enciphers the values of the block. + * @param keys The cryption keys. + * @param block The block to encipher. + */ + private static void encipher(int[] keys, int[] block) { + long sum = 0; + for (int i = 0; i < NUM_ROUNDS; i++) { + block[0] += ((block[1] << 4 ^ block[1] >>> 5) + block[1] ^ keys[(int) (sum & 0x3)] + sum); + sum += DELTA; + block[1] += (keys[(int) ((sum & 0x1933) >>> 11)] + sum ^ block[0] + (block[0] << 4 ^ block[0] >>> 5)); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/Definition.java b/Server/src/main/java/Server/core/cache/def/Definition.java new file mode 100644 index 000000000..40b227a2e --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/Definition.java @@ -0,0 +1,187 @@ +package core.cache.def; + +import java.util.HashMap; +import java.util.Map; + +import core.tools.StringUtils; +import core.game.node.Node; + +/** + * Represent's a node's definitions. + * @author Emperor + * @param The node type. + */ +public class Definition { + + /** + * The node id. + */ + protected int id; + + /** + * The name. + */ + protected String name = "null"; + + /** + * The examine info. + */ + protected String examine; + + /** + * The options. + */ + protected String[] options; + + /** + * The configurations. + */ + protected final Map handlers = new HashMap(); + + /** + * Constructs a new {@code Definition} {@code Object}. + */ + public Definition() { + /* + * empty. + */ + } + + /** + * Checks if this node has options. + * @return {@code True} if so. + */ + public boolean hasOptions() { + return hasOptions(true); + } + + /** + * Checks if this node has options. + * @param examine If examine should be treated as an option. + * @return {@code True} if so. + */ + public boolean hasOptions(boolean examine) { + if (name.equals("null") || options == null) { + return false; + } + for (String option : options) { + if (option != null && !option.equals("null")) { + if (examine || !option.equals("Examine")) { + return true; + } + } + } + return false; + } + + /** + * Gets a configuration of this item's definitions. + * @param key The key. + * @return The configuration value. + */ + @SuppressWarnings("unchecked") + public V getConfiguration(String key) { + return (V) handlers.get(key); + } + + /** + * Gets a configuration from this item's definitions. + * @param key The key. + * @param fail The object to return if there was no value found for this + * key. + * @return The value, or the fail object. + */ + @SuppressWarnings("unchecked") + public V getConfiguration(String key, V fail) { + V object = (V) handlers.get(key); + if (object == null) { + return fail; + } + return object; + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } + + /** + * Sets the id. + * @param id The id to set. + */ + public void setId(int id) { + this.id = id; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * @param name The name to set. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the examine. + * @return The examine. + */ + public String getExamine() { + if (examine == null) { + try { + examine = handlers.get("examine").toString(); + } catch (Exception e){} + if(examine == null) { + if (name.length() > 0) { + examine = "It's a" + (StringUtils.isPlusN(name) ? "n " : " ") + name + "."; + } else { + examine = "null"; + } + } + } + return examine; + } + + /** + * Sets the examine. + * @param examine The examine to set. + */ + public void setExamine(String examine) { + this.examine = examine; + } + + /** + * Gets the options. + * @return The options. + */ + public String[] getOptions() { + return options; + } + + /** + * Sets the options. + * @param options The options to set. + */ + public void setOptions(String[] options) { + this.options = options; + } + + /** + * Gets the configurations. + * @return The configurations. + */ + public Map getHandlers() { + return handlers; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/impl/AnimationDefinition.java b/Server/src/main/java/Server/core/cache/def/impl/AnimationDefinition.java new file mode 100644 index 000000000..7eb25798f --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/AnimationDefinition.java @@ -0,0 +1,201 @@ +package core.cache.def.impl; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +import core.cache.Cache; +import core.cache.misc.buffer.ByteBufferUtils; + +/** + * Represents an animation's definitions. + * @author Emperor + */ +public final class AnimationDefinition { + + public int anInt2136; + public int anInt2137; + public int[] anIntArray2139; + public int anInt2140; + public boolean aBoolean2141 = false; + public int anInt2142; + public int emoteItem; + public int anInt2144 = -1; + public int[][] handledSounds; + public boolean[] aBooleanArray2149; + public int[] anIntArray2151; + public boolean aBoolean2152; + public int[] durations; + public int anInt2155; + public boolean aBoolean2158; + public boolean aBoolean2159; + public int anInt2162; + public int anInt2163; + boolean newHeader; + + // added + public int[] soundMinDelay; + public int[] soundMaxDelay; + public int[] anIntArray1362; + public boolean effect2Sound; + + private static final Map animDefs = new HashMap<>(); + + public static final AnimationDefinition forId(int emoteId) { + try { + AnimationDefinition defs = animDefs.get(emoteId); + if (defs != null) { + return defs; + } + byte[] data = Cache.getIndexes()[20].getFileData(emoteId >>> 7, emoteId & 0x7f); + defs = new AnimationDefinition(); + if (data != null) { + defs.readValueLoop(ByteBuffer.wrap(data)); + } + defs.method2394(); + animDefs.put(emoteId, defs); + return defs; + } catch (Throwable t) { + return null; + } + } + + private void readValueLoop(ByteBuffer buffer) { + for (;;) { + int opcode = buffer.get() & 0xFF; + if (opcode == 0) { + break; + } + readValues(buffer, opcode); + } + } + + /** + * Gets the duration of this animation in milliseconds. + * @return The duration. + */ + public int getDuration() { + if (durations == null) { + return 0; + } + int duration = 0; + for (int i : durations) { + if (i > 100) { + continue; + } + duration += i * 20; + } + return duration; + } + + /** + * Gets the duration of this animation in (600ms) ticks. + * @return The duration in ticks. + */ + public int getDurationTicks() { + int ticks = getDuration() / 600; + return Math.max(ticks, 1); + } + + private void readValues(ByteBuffer buffer, int opcode) { + if (opcode == 1) { + int length = buffer.getShort() & 0xFFFF; + durations = new int[length]; + for (int i = 0; i < length; i++) { + durations[i] = buffer.getShort() & 0xFFFF; + } + anIntArray2139 = new int[length]; + for (int i = 0; i < length; i++) { + anIntArray2139[i] = buffer.getShort() & 0xFFFF; + } + for (int i = 0; i < length; i++) { + anIntArray2139[i] = ((buffer.getShort() & 0xFFFF << 16) + anIntArray2139[i]); + } + } else if (opcode != 2) { + if (opcode != 3) { + if (opcode == 4) + aBoolean2152 = true; + else if (opcode == 5) + anInt2142 = buffer.get() & 0xFF; + else if (opcode != 6) { + if (opcode == 7) + emoteItem = buffer.getShort() & 0xFFFF; + else if ((opcode ^ 0xffffffff) != -9) { + if (opcode != 9) { + if (opcode != 10) { + if (opcode == 11) + anInt2155 = buffer.get() & 0xFF; + else if (opcode == 12) { + int i = buffer.get() & 0xFF; + anIntArray2151 = new int[i]; + for (int i_19_ = 0; ((i_19_ ^ 0xffffffff) > (i ^ 0xffffffff)); i_19_++) { + anIntArray2151[i_19_] = buffer.getShort() & 0xFFFF; + } + for (int i_20_ = 0; i > i_20_; i_20_++) + anIntArray2151[i_20_] = ((buffer.getShort() & 0xFFFF << 16) + anIntArray2151[i_20_]); + } else if (opcode == 13) { + // opcode 13 + int i = buffer.getShort() & 0xFFFF; + handledSounds = new int[i][]; + for (int i_21_ = 0; i_21_ < i; i_21_++) { + int i_22_ = buffer.get() & 0xFF; + if ((i_22_ ^ 0xffffffff) < -1) { + handledSounds[i_21_] = new int[i_22_]; + handledSounds[i_21_][0] = ByteBufferUtils.getTriByte(buffer); + for (int i_23_ = 1; ((i_22_ ^ 0xffffffff) < (i_23_ ^ 0xffffffff)); i_23_++) { + handledSounds[i_21_][i_23_] = buffer.getShort() & 0xFFFF; + } + } + } + } else if (opcode == 14) { + aBoolean2141 = true; + } else { + System.out.println("Unhandled animation opcode " + opcode); + } + } else + anInt2162 = buffer.get() & 0xFF; + } else + anInt2140 = buffer.get() & 0xFF; + } else + anInt2136 = buffer.get() & 0xFF; + } else + anInt2144 = buffer.getShort() & 0xFFFF; + } else { + aBooleanArray2149 = new boolean[256]; + int length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + aBooleanArray2149[buffer.get() & 0xFF] = true; + } + } + } else + anInt2163 = buffer.getShort() & 0xFFFF; + } + + public void method2394() { + if (anInt2140 == -1) { + if (aBooleanArray2149 == null) + anInt2140 = 0; + else + anInt2140 = 2; + } + if (anInt2162 == -1) { + if (aBooleanArray2149 == null) + anInt2162 = 0; + else + anInt2162 = 2; + } + } + + public AnimationDefinition() { + anInt2136 = 99; + emoteItem = -1; + anInt2140 = -1; + aBoolean2152 = false; + anInt2142 = 5; + aBoolean2159 = false; + anInt2163 = -1; + anInt2155 = 2; + aBoolean2158 = false; + anInt2162 = -1; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/impl/CS2Mapping.java b/Server/src/main/java/Server/core/cache/def/impl/CS2Mapping.java new file mode 100644 index 000000000..4b510a14b --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/CS2Mapping.java @@ -0,0 +1,255 @@ +package core.cache.def.impl; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +import core.cache.Cache; +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.world.GameWorld; + +/** + * The CS2 mapping. + * @author Emperor + */ +public final class CS2Mapping { + + /** + * The CS2 mappings. + */ + private static final Map maps = new HashMap<>(); + + /** + * The script id. + */ + private final int scriptId; + + /** + * Unknown value. + */ + private int unknown; + + /** + * Second unknown value. + */ + private int unknown1; + + /** + * The default string value. + */ + private String defaultString; + + /** + * The default integer value. + */ + private int defaultInt; + + /** + * The mapping. + */ + private HashMap map; + + /** + * The array of the objects. + */ + private Object[] array; + + /** + * Constructs a new {@code CS2Mapping} {@code Object}. + * @param scriptId The script id. + */ + public CS2Mapping(int scriptId) { + this.scriptId = scriptId; + } + + /** + * The main method. + * @param args The arguments cast on runtime. + * @throws Throwable When an exception occurs. + */ + public static void main(String... args) throws Throwable { + GameWorld.prompt(false); + BufferedWriter bw = new BufferedWriter(new FileWriter("./cs2.txt")); + for (int i = 0; i < 10000; i++) { + CS2Mapping mapping = forId(i); + if (mapping == null) { + continue; + } + if (mapping.map == null) { + continue; + } + bw.append("ScriptAPI - " + i + " ["); + for (int index : mapping.map.keySet()) { + bw.append(mapping.map.get(index) + ": " + index + " "); + } + bw.append("]"); + bw.newLine(); + } + bw.flush(); + bw.close(); + } + + /** + * Gets the mapping for the given script id. + * @param scriptId The script id. + * @return The mapping. + */ + public static CS2Mapping forId(int scriptId) { + CS2Mapping mapping = maps.get(scriptId); + if (mapping != null) { + return mapping; + } + mapping = new CS2Mapping(scriptId); + byte[] bs = Cache.getIndexes()[17].getFileData(scriptId >>> 8, scriptId & 0xFF); + if (bs != null) { + mapping.load(ByteBuffer.wrap(bs)); + } else { + return null; + } + maps.put(scriptId, mapping); + return mapping; + } + + /** + * Loads the mapping data. + * @param buffer The buffer to read the data from. + */ + private void load(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get() & 0xFF) != 0) { + switch (opcode) { + case 1: + unknown = buffer.get() & 0xFF; + break; + case 2: + unknown1 = buffer.get() & 0xFF; + break; + case 3: + defaultString = ByteBufferUtils.getString(buffer); + break; + case 4: + defaultInt = buffer.getInt(); + break; + case 5: + case 6: + int size = buffer.getShort() & 0xFFFF; + String string = null; + int val = 0; + map = new HashMap<>(size); + array = new Object[size]; + + for (int i = 0; i < size; i++) { + int key = buffer.getInt(); + if (opcode == 5) { + string = ByteBufferUtils.getString(buffer); + array[i] = string; + map.put(key, string); + } else { + val = buffer.getInt(); + array[i] = val; + map.put(key, val); + } + } + break; + } + } + } + + /** + * Gets the array of objects. + * @return the objects. + */ + public Object[] getArray() { + return array; + } + + /** + * Gets the scriptId. + * @return The scriptId. + */ + public int getScriptId() { + return scriptId; + } + + /** + * Gets the unknown. + * @return The unknown. + */ + public int getUnknown() { + return unknown; + } + + /** + * Sets the unknown. + * @param unknown The unknown to set. + */ + public void setUnknown(int unknown) { + this.unknown = unknown; + } + + /** + * Gets the unknown1. + * @return The unknown1. + */ + public int getUnknown1() { + return unknown1; + } + + /** + * Sets the unknown1. + * @param unknown1 The unknown1 to set. + */ + public void setUnknown1(int unknown1) { + this.unknown1 = unknown1; + } + + /** + * Gets the defaultString. + * @return The defaultString. + */ + public String getDefaultString() { + return defaultString; + } + + /** + * Sets the defaultString. + * @param defaultString The defaultString to set. + */ + public void setDefaultString(String defaultString) { + this.defaultString = defaultString; + } + + /** + * Gets the defaultInt. + * @return The defaultInt. + */ + public int getDefaultInt() { + return defaultInt; + } + + /** + * Sets the defaultInt. + * @param defaultInt The defaultInt to set. + */ + public void setDefaultInt(int defaultInt) { + this.defaultInt = defaultInt; + } + + /** + * Gets the map. + * @return The map. + */ + public HashMap getMap() { + return map; + } + + /** + * Sets the map. + * @param map The map to set. + */ + public void setMap(HashMap map) { + this.map = map; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/impl/ClothDefinition.java b/Server/src/main/java/Server/core/cache/def/impl/ClothDefinition.java new file mode 100644 index 000000000..cf133443a --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/ClothDefinition.java @@ -0,0 +1,208 @@ +package core.cache.def.impl; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +import core.ServerConstants; +import core.cache.Cache; + +/** + * The definitions for player clothing/look. + * @author Emperor + */ +public final class ClothDefinition { + + /** + * The equipment slot. + */ + private int equipmentSlot; + + /** + * The model ids. + */ + private int[] modelIds; + + /** + * Unknown boolean. + */ + private boolean unknownBool; + + /** + * Original colors. + */ + private int[] originalColors; + + /** + * The colors to change to. + */ + private int[] modifiedColors; + + /** + * Original texture colors. + */ + private int[] originalTextureColors; + + /** + * Texture colors to change to. + */ + private int[] modifiedTextureColors; + + /** + * Other model ids(?) + */ + private int[] models = { -1, -1, -1, -1, -1 }; + + /** + * Gets the definitions for the given cloth id. + * @param clothId The clothing id. + * @return The definition. + */ + public static ClothDefinition forId(int clothId) { + ClothDefinition def = new ClothDefinition(); + byte[] bs = Cache.getIndexes()[2].getFileData(3, clothId); + if (bs != null) { + def.load(ByteBuffer.wrap(bs)); + } + return def; + } + + /** + * The main method. + * @param args The arguments cast on runtime. + */ + public static void main(String... args) { + try { + Cache.init(ServerConstants.CACHE_PATH); + } catch (Throwable e) { + e.printStackTrace(); + } + int length = Cache.getIndexes()[2].getFilesSize(3); + System.out.println("Definition size: " + length + "."); + for (int i = 0; i < length; i++) { + ClothDefinition def = forId(i); + if (def.unknownBool) + System.out.println("Clothing " + i + ": " + def.equipmentSlot + ", " + def.unknownBool + ", " + Arrays.toString(def.modelIds) + ", " + Arrays.toString(def.models)); + } + } + + /** + * Loads the definitions. + * @param buffer The buffer. + */ + public void load(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get() & 0xFF) != 0) { + parse(opcode, buffer); + } + } + + /** + * Parses an opcode. + * @param opcode The opcode. + * @param buffer The buffer to read the data from. + */ + private void parse(int opcode, ByteBuffer buffer) { + switch (opcode) { + case 1: + equipmentSlot = buffer.get() & 0xFF; + break; + case 2: + int length = buffer.get() & 0xFF; + modelIds = new int[length]; + for (int i = 0; i < length; i++) { + modelIds[i] = buffer.getShort() & 0xFFFF; + } + break; + case 3: + unknownBool = true; + break; + case 40: + length = buffer.get() & 0xFF; + originalColors = new int[length]; + modifiedColors = new int[length]; + for (int i = 0; i < length; i++) { + originalColors[i] = buffer.getShort(); + modifiedColors[i] = buffer.getShort(); + } + break; + case 41: + length = buffer.get() & 0xFF; + originalTextureColors = new int[length]; + modifiedTextureColors = new int[length]; + for (int i = 0; i < length; i++) { + originalTextureColors[i] = buffer.getShort(); + modifiedTextureColors[i] = buffer.getShort(); + } + break; + default: + if (opcode >= 60 && opcode < 70) { + models[opcode - 60] = buffer.getShort() & 0xFFFF; + } + break; + } + } + + /** + * Gets the unknown. + * @return The unknown. + */ + public int getUnknown() { + return equipmentSlot; + } + + /** + * Gets the modelIds. + * @return The modelIds. + */ + public int[] getModelIds() { + return modelIds; + } + + /** + * Gets the unknownBool. + * @return The unknownBool. + */ + public boolean isUnknownBool() { + return unknownBool; + } + + /** + * Gets the originalColors. + * @return The originalColors. + */ + public int[] getOriginalColors() { + return originalColors; + } + + /** + * Gets the modifiedColors. + * @return The modifiedColors. + */ + public int[] getModifiedColors() { + return modifiedColors; + } + + /** + * Gets the originalTextureColors. + * @return The originalTextureColors. + */ + public int[] getOriginalTextureColors() { + return originalTextureColors; + } + + /** + * Gets the modifiedTextureColors. + * @return The modifiedTextureColors. + */ + public int[] getModifiedTextureColors() { + return modifiedTextureColors; + } + + /** + * Gets the models. + * @return The models. + */ + public int[] getModels() { + return models; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/impl/GraphicDefinition.java b/Server/src/main/java/Server/core/cache/def/impl/GraphicDefinition.java new file mode 100644 index 000000000..d16fc33e7 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/GraphicDefinition.java @@ -0,0 +1,189 @@ +package core.cache.def.impl; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +import core.ServerConstants; +import core.cache.Cache; + +/** + * Represents a Graphic's definition. + * @author Jagex + */ +public class GraphicDefinition { + + public short[] aShortArray1435; + public short[] aShortArray1438; + public int anInt1440; + public boolean aBoolean1442; + public int defaultModel; + public int anInt1446; + public boolean aBoolean1448 = false; + public int anInt1449; + public int animationId; + public int anInt1451; + public int graphicsId; + public int anInt1454; + public short[] aShortArray1455; + public short[] aShortArray1456; + + // added + public byte byteValue; + // added + public int intValue; + + /** + * The definitions mapping. + */ + private static final Map graphicDefinitions = new HashMap<>(); + + /** + * Gets the graphic definition for the given graphic id. + * @param gfxId The graphic id. + * @return The definition. + */ + public static final GraphicDefinition forId(int gfxId) { + GraphicDefinition def = graphicDefinitions.get(gfxId); + if (def != null) { + return def; + } + byte[] data = Cache.getIndexes()[21].getFileData(gfxId >>> 735411752, gfxId & 0xff); + def = new GraphicDefinition(); + def.graphicsId = gfxId; + if (data != null) { + def.readValueLoop(ByteBuffer.wrap(data)); + } + graphicDefinitions.put(gfxId, def); + return def; + } + + /** + * The main method, used for running a graphic definition search. + * @param s The arguments cast on runtime. + */ + public static final void main(String... s) { + try { + Cache.init(ServerConstants.CACHE_PATH); + } catch (Throwable e) { + e.printStackTrace(); + } + // 5046 - 5050 are related anims & 2148 + GraphicDefinition d = GraphicDefinition.forId(803); + System.out.println("Graphic " + d.graphicsId + " anim id = " + d.animationId + ", " + d.defaultModel + "."); + for (int i = 0; i < 5000; i++) { + GraphicDefinition def = GraphicDefinition.forId(i); + if (def == null) { + continue; + } + if ((def.animationId > 2000 && def.animationId < 2200) || (def.defaultModel >= 1300 && def.defaultModel < 1500)) { + System.out.println("Possible match [id=" + i + ", anim=" + def.animationId + "]."); + } + } + } + + /** + * Reads and handles all data from the input stream. + * @param buffer The input stream. + */ + private void readValueLoop(ByteBuffer buffer) { + for (;;) { + int opcode = buffer.get() & 0xFF; + if (opcode == 0) { + break; + } + readValues(buffer, opcode); + } + } + + /** + * Reads the opcode values from the input stream. + * @param buffer The input stream. + * @param opcode The opcode to handle. + */ + public void readValues(ByteBuffer buffer, int opcode) { + if (opcode != 1) { + if (opcode == 2) + animationId = buffer.getShort(); + else if (opcode == 4) + anInt1446 = buffer.getShort() & 0xFFFF; + else if (opcode != 5) { + if ((opcode ^ 0xffffffff) != -7) { + if (opcode == 7) + anInt1440 = buffer.get() & 0xFF; + else if ((opcode ^ 0xffffffff) == -9) + anInt1451 = buffer.get() & 0xFF; + else if (opcode != 9) { + if (opcode != 10) { + if (opcode == 11) { // added opcode + // aBoolean1442 = true; + byteValue = (byte) 1; + } else if (opcode == 12) { // added opcode + // aBoolean1442 = true; + byteValue = (byte) 4; + } else if (opcode == 13) { // added opcode + // aBoolean1442 = true; + byteValue = (byte) 5; + } else if (opcode == 14) { // added opcode + // aBoolean1442 = true; + // aByte2856 = 2; + byteValue = (byte) 2; + intValue = (buffer.get() & 0xFF) * 256; + } else if (opcode == 15) { + // aByte2856 = 3; + byteValue = (byte) 3; + intValue = buffer.getShort() & 0xFFFF; + } else if (opcode == 16) { + // aByte2856 = 3; + byteValue = (byte) 3; + intValue = buffer.getInt(); + } else if (opcode != 40) { + if ((opcode ^ 0xffffffff) == -42) { + int i = buffer.get() & 0xFF; + aShortArray1455 = new short[i]; + aShortArray1435 = new short[i]; + for (int i_0_ = 0; i > i_0_; i_0_++) { + aShortArray1455[i_0_] = (short) (buffer.getShort() & 0xFFFF); + aShortArray1435[i_0_] = (short) (buffer.getShort() & 0xFFFF); + } + } + } else { + int i = buffer.get() & 0xFF; + aShortArray1438 = new short[i]; + aShortArray1456 = new short[i]; + for (int i_1_ = 0; ((i ^ 0xffffffff) < (i_1_ ^ 0xffffffff)); i_1_++) { + aShortArray1438[i_1_] = (short) (buffer.getShort() & 0xFFFF); + aShortArray1456[i_1_] = (short) (buffer.getShort() & 0xFFFF); + } + } + } else + aBoolean1448 = true; + } else { + // aBoolean1442 = true; + byteValue = (byte) 3; + intValue = 8224; + } + } else + anInt1454 = buffer.getShort() & 0xFFFF; + } else + anInt1449 = buffer.getShort() & 0xFFFF; + } else + defaultModel = buffer.getShort(); + } + + /** + * Constructs a new {@code GraphicDefinition} {@code Object}. + */ + public GraphicDefinition() { + byteValue = 0; + intValue = -1; + anInt1446 = 128; + aBoolean1442 = false; + anInt1449 = 128; + anInt1451 = 0; + animationId = -1; + anInt1454 = 0; + anInt1440 = 0; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/impl/ItemDefinition.java b/Server/src/main/java/Server/core/cache/def/impl/ItemDefinition.java new file mode 100644 index 000000000..9eea3ec98 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/ItemDefinition.java @@ -0,0 +1,1669 @@ +package core.cache.def.impl; + +import java.nio.ByteBuffer; +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.Map; + +import core.game.system.SystemLogger; +import core.game.system.config.ItemConfigParser; +import core.plugin.Plugin; +import core.tools.StringUtils; +import core.cache.Cache; +import core.cache.def.Definition; +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.container.Container; +import core.game.ge.GrandExchangeDatabase; +import core.game.content.global.action.DropItemHandler; +import core.game.content.global.action.EquipHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.item.ItemPlugin; +import core.net.packet.PacketRepository; +import core.net.packet.out.WeightUpdate; + +/** + * Represents an item's definitions. + * @author Jagex + * @author Emperor + */ +public class ItemDefinition extends Definition { + + /** + * The item definitions mapping. + */ + private static final Map DEFINITIONS = new HashMap<>(); + + /** + * The default option handlers. + */ + private static final Map OPTION_HANDLERS = new HashMap<>(); + + /** + * The interface model id. + */ + private int interfaceModelId; + + /** + * The model zoom. + */ + private int modelZoom; + + /** + * The model rotation. + */ + private int modelRotationY; + + /** + * The model rotation. + */ + private int modelRotationX; + + /** + * The model offset. + */ + private int modelOffsetX; + + /** + * The model offset. + */ + private int modelOffsetY; + + /** + * If item is stackable. + */ + private boolean stackable; + + /** + * The item value. + */ + private int value; + + /** + * If item is members only. + */ + private boolean membersOnly; + + /** + * The male model wear id. + */ + private int maleWornModelId1 = -1; + + /** + * The female model wear id. + */ + private int femaleWornModelId1 = -1; + + /** + * The male model wear id. + */ + private int maleWornModelId2 = -1; + + /** + * The female wear model id. + */ + private int femaleWornModelId2 = -1; + + /** + * The male model wear id. + */ + private int maleWornModelId3 = -1; + + /** + * The female model wear id. + */ + private int femaleWornModelId3 = -1; + + /** + * The male model wear id. + */ + private int maleWornModelId4 = -1; + + /** + * The female wear model id. + */ + private int femaleWornModelId4 = -1; + + /** + * The ground actions. + */ + private String[] groundActions; + + /** + * The original model colors. + */ + private short[] originalModelColors; + + /** + * The modified model colors. + */ + private short[] modifiedModelColors; + + /** + * The texture color 1. + */ + private short[] textureColour1; + + /** + * The texture color 2. + */ + private short[] textureColour2; + + /** + * A unknown byte array. + */ + private byte[] unknownArray1; + + /** + * A unknown integer array. + */ + private int[] unknownArray2; + + /** + * A unknown integer array. + */ + private int[][] unknownArray3; + + /** + * If item is noted. + */ + private boolean unnoted = true; + + /** + * The colour equipment. + */ + private int colourEquip1 = -1; + + /** + * The colour equipment. + */ + private int colourEquip2; + + /** + * The note item. + */ + private int noteId = -1; + + /** + * The note template id. + */ + private int noteTemplateId = -1; + + /** + * The stackable ids. + */ + private int[] stackIds; + + /** + * The stackable amounts. + */ + private int[] stackAmounts; + + /** + * The team id. + */ + private int teamId; + + /** + * The lend id. + */ + private int lendId = -1; + + /** + * The lend template id. + */ + private int lendTemplateId = -1; + + /** + * The recolour id. + */ + private int recolourId = -1; + + /** + * The recolour template id. + */ + private int recolourTemplateId = -1; + + /** + * The equip id. + */ + private int equipId; + + /** + * The item requirements + */ + private HashMap itemRequirements; + + /** + * The clientscript data. + */ + private HashMap clientScriptData; + + /** + * The item type. + */ + private int itemType; + + /** + * Constructs a new {@code ItemDefinition} {@code Object}. + */ + public ItemDefinition() { + groundActions = new String[] { null, null, "take", null, null }; + options = new String[] { null, null, null, null, "drop" }; + } + + /** + * Initialize the default option handlers. + */ + static { + // TODO: Move this crap in a plugin. + OptionHandler handler = new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + return DropItemHandler.handle(player, node, option); + } + + @Override + public boolean isWalk() { + return false; + } + }; + setOptionHandler("destroy", handler); + setOptionHandler("dissolve", handler); + setOptionHandler("drop", handler); + final EquipHandler equipHandler = EquipHandler.SINGLETON; + setOptionHandler("wear", equipHandler); + setOptionHandler("wield", equipHandler); + setOptionHandler("equip", equipHandler); + } + + /** + * Parses the item definitions. + */ + public static void parse() { + for (int itemId = 0; itemId < Cache.getItemDefinitionsSize(); itemId++) { + byte[] data = Cache.getIndexes()[19].getFileData(itemId >>> 8, itemId & 0xFF); + if (data == null) { + ItemDefinition.getDefinitions().put(itemId, new ItemDefinition()); + continue; + } + ItemDefinition def = ItemDefinition.parseDefinition(itemId, ByteBuffer.wrap(data)); + if (def == null) { + SystemLogger.logErr("Could not load item definitions for id " + itemId + " - no definitions found!"); + return ; + } + if(itemId == 14958) + def.setStackable(true); + + ItemDefinition.getDefinitions().put(itemId, def); + } + ItemDefinition.defineTemplates(); + } + + /** + * Gets an item definition. + * @param itemId The item's id. + * @return The item definition. + */ + public static ItemDefinition forId(int itemId) { + ItemDefinition def = DEFINITIONS.get(itemId); + if (def != null) { + return def; + } + return new ItemDefinition(); + } + + /** + * Parses an item's definitions. + * @param itemId The item id. + * @param buffer The buffer. + * @return The item definition. + */ + public static ItemDefinition parseDefinition(int itemId, ByteBuffer buffer) { + ItemDefinition def = new ItemDefinition(); + def.id = itemId; + while (true) { + int opcode = buffer.get() & 0xFF; + if (opcode == 0) { + break; + } else if (opcode == 1) { + def.interfaceModelId = buffer.getShort() & 0xFFFF; + } else if (opcode == 2) { + def.name = ByteBufferUtils.getString(buffer); + } else if (opcode == 3) { + def.handlers.put("examine", ByteBufferUtils.getString(buffer)); // Examine + // info. + } else if (opcode == 4) { + def.modelZoom = buffer.getShort() & 0xFFFF; + } else if (opcode == 5) { + def.modelRotationY = buffer.getShort() & 0xFFFF; + } else if (opcode == 6) { + def.modelRotationX = buffer.getShort() & 0xFFFF; + } else if (opcode == 7) { + def.modelOffsetX = buffer.getShort() & 0xFFFF; + if (def.modelOffsetX > 32767) + def.modelOffsetX -= 65536; + } else if (opcode == 8) { + def.modelOffsetY = buffer.getShort() & 0xFFFF; + if (def.modelOffsetY > 32767) { + def.modelOffsetY -= 65536; + } + } else if (opcode == 10) { + // buffer.getShort(); //10 is unused opcode. + } else if (opcode == 11) { + def.stackable = true; + } else if (opcode == 12) { + def.value = buffer.getInt(); + if (def.value == 0) { + def.value = 1; + } + } else if (opcode == 16) { + def.membersOnly = true; + } else if (opcode == 18) { + buffer.getShort(); + } else if (opcode == 23) { + def.maleWornModelId1 = buffer.getShort() & 0xFFFF; + // buffer.get(); + } else if (opcode == 24) { + def.femaleWornModelId1 = buffer.getShort() & 0xFFFF; + } else if (opcode == 25) { + def.maleWornModelId2 = buffer.getShort() & 0xFFFF; + // buffer.get(); + } else if (opcode == 26) { + def.femaleWornModelId2 = buffer.getShort() & 0xFFFF; + } else if (opcode >= 30 && opcode < 35) { + def.groundActions[opcode - 30] = ByteBufferUtils.getString(buffer); + } else if (opcode >= 35 && opcode < 40) { + def.options[opcode - 35] = ByteBufferUtils.getString(buffer); + } else if (opcode == 40) { + int length = buffer.get() & 0xFF; + def.originalModelColors = new short[length]; + def.modifiedModelColors = new short[length]; + for (int index = 0; index < length; index++) { + def.originalModelColors[index] = buffer.getShort(); + def.modifiedModelColors[index] = buffer.getShort(); + } + } else if (opcode == 41) { + int length = buffer.get() & 0xFF; + def.textureColour1 = new short[length]; + def.textureColour2 = new short[length]; + for (int index = 0; index < length; index++) { + def.textureColour1[index] = buffer.getShort(); + def.textureColour2[index] = buffer.getShort(); + } + } else if (opcode == 42) { + int length = buffer.get() & 0xFF; + def.unknownArray1 = new byte[length]; + for (int index = 0; index < length; index++) + def.unknownArray1[index] = buffer.get(); + } else if (opcode == 65) { + def.unnoted = true; + } else if (opcode == 78) { + def.colourEquip1 = buffer.getShort() & 0xFFFF; + } else if (opcode == 79) { + def.colourEquip2 = buffer.getShort() & 0xFFFF; + } else if (opcode == 90) { + def.setMaleWornModelId3(buffer.getShort()); + } else if (opcode == 91) { + def.setFemaleWornModelId3(buffer.getShort()); + } else if (opcode == 92) { + def.setMaleWornModelId4(buffer.getShort()); + } else if (opcode == 93) { + def.setFemaleWornModelId4(buffer.getShort()); + } else if (opcode == 95) { + buffer.getShort(); + } else if (opcode == 96) { + def.itemType = buffer.get(); + } else if (opcode == 97) { + def.noteId = buffer.getShort() & 0xFFFF; + } else if (opcode == 98) { + def.noteTemplateId = buffer.getShort() & 0xFFFF; + } else if (opcode >= 100 && opcode < 110) { + if (def.stackIds == null) { + def.stackIds = new int[10]; + def.stackAmounts = new int[10]; + } + def.stackIds[opcode - 100] = buffer.getShort() & 0xFFFF; + def.stackAmounts[opcode - 100] = buffer.getShort() & 0xFFFF; + } else if (opcode == 110) { + buffer.getShort(); + } else if (opcode == 111) { + buffer.getShort(); + } else if (opcode == 112) { + buffer.getShort(); + } else if (opcode == 113) { + buffer.get(); + } else if (opcode == 114) { + buffer.get(); + } else if (opcode == 115) { + def.teamId = buffer.get(); + } else if (opcode == 121) { + def.lendId = buffer.getShort() & 0xFFFF; + } else if (opcode == 122) { + def.lendTemplateId = buffer.getShort() & 0xFFFF; + } else if (opcode == 124) { + if (def.unknownArray3 == null) { + def.unknownArray3 = new int[11][]; + } + int slot = buffer.get(); + def.unknownArray3[slot] = new int[6]; + for (int i = 0; i < 6; i++) { + def.unknownArray3[slot][i] = buffer.getShort(); + } + } else if (opcode == 125) { + buffer.get(); + buffer.get(); + buffer.get(); + } else if (opcode == 126) { + buffer.get(); + buffer.get(); + buffer.get(); + } else if (opcode == 127) { + buffer.get(); + buffer.getShort(); + } else if (opcode == 128) { + buffer.get(); + buffer.getShort(); + } else if (opcode == 129) { + buffer.get(); + buffer.getShort(); + } else if (opcode == 130) { + buffer.get(); + buffer.getShort(); + } else if (opcode == 132) { + int length = buffer.get() & 0xFF; + def.unknownArray2 = new int[length]; + for (int index = 0; index < length; index++) { + def.unknownArray2[index] = buffer.getShort() & 0xFFFF; + } + } else if (opcode == 134) { + buffer.get(); + } else if (opcode == 139) { + def.recolourId = buffer.getShort() & 0xFFFF; + } else if (opcode == 140) { + def.recolourTemplateId = buffer.getShort() & 0xFFFF; + } else if (opcode == 249) { + int length = buffer.get() & 0xFF; + if (def.clientScriptData == null) { + def.clientScriptData = new HashMap(); + } + for (int index = 0; index < length; index++) { + boolean string = (buffer.get() & 0xFF) == 1; + int key = ByteBufferUtils.getTriByte(buffer); + Object value = string ? ByteBufferUtils.getString(buffer) : buffer.getInt(); + def.clientScriptData.put(key, value); + } + } else { + System.out.println("Unhandled item definition opcode - opcode: " + opcode); + break; + } + } + return def; + } + + /** + * Defines the definitions for noted, lending and recolored items. + */ + public static void defineTemplates() { + int equipId = 0; + for (int i = 0; i < Cache.getItemDefinitionsSize(); i++) { + ItemDefinition def = forId(i); + if (def.noteTemplateId != -1) { + def.transferNoteDefinition(forId(def.noteId), forId(def.noteTemplateId)); + } + if (def.lendTemplateId != -1) { + def.transferLendDefinition(forId(def.lendId), forId(def.lendTemplateId)); + } + if (def.recolourTemplateId != -1) { + def.transferRecolourDefinition(forId(def.recolourId), forId(def.recolourTemplateId)); + } + if (def != null && (def.maleWornModelId1 >= 0 || def.maleWornModelId2 >= 0)) { + def.equipId = equipId++; + } + } + forId(2513).equipId = forId(3140).equipId; + } + + /** + * Transfers definitions for noted items. + * @param reference The reference definitions. + * @param templateReference The template definitions. + */ + public void transferNoteDefinition(ItemDefinition reference, ItemDefinition templateReference) { + membersOnly = reference.membersOnly; + interfaceModelId = templateReference.interfaceModelId; + originalModelColors = templateReference.originalModelColors; + name = reference.name; + modelOffsetY = templateReference.modelOffsetY; + textureColour1 = templateReference.textureColour1; + value = reference.value; + modelRotationX = templateReference.modelRotationX; + stackable = true; + unnoted = false; + modifiedModelColors = templateReference.modifiedModelColors; + modelRotationY = templateReference.modelRotationY; + modelZoom = templateReference.modelZoom; + textureColour1 = templateReference.textureColour1; + handlers.put(ItemConfigParser.TRADEABLE, true); + } + + /** + * Transfers definitions for lending items. + * @param reference The reference definitions. + * @param templateReference The template definitions. + */ + public void transferLendDefinition(ItemDefinition reference, ItemDefinition templateReference) { + femaleWornModelId1 = reference.femaleWornModelId1; + maleWornModelId2 = reference.maleWornModelId2; + membersOnly = reference.membersOnly; + interfaceModelId = templateReference.interfaceModelId; + textureColour2 = reference.textureColour2; + groundActions = reference.groundActions; + unknownArray1 = reference.unknownArray1; + modelRotationY = templateReference.modelRotationY; + modelRotationX = templateReference.modelRotationX; + originalModelColors = reference.originalModelColors; + name = reference.name; + maleWornModelId1 = reference.maleWornModelId1; + colourEquip1 = reference.colourEquip1; + teamId = reference.teamId; + modelOffsetY = templateReference.modelOffsetY; + clientScriptData = reference.clientScriptData; + modifiedModelColors = reference.modifiedModelColors; + colourEquip2 = reference.colourEquip2; + modelOffsetX = templateReference.modelOffsetX; + textureColour1 = reference.textureColour1; + value = 0; + modelZoom = templateReference.modelZoom; + options = new String[5]; + femaleWornModelId2 = reference.femaleWornModelId2; + if (reference.options != null) { + options = reference.options.clone(); + } + } + + /** + * Transfers definitions for recolored items. + * @param reference The reference definitions. + * @param templateReference The template definitions. + */ + public void transferRecolourDefinition(ItemDefinition reference, ItemDefinition templateReference) { + femaleWornModelId2 = reference.femaleWornModelId2; + options = new String[5]; + modelRotationX = templateReference.modelRotationX; + name = reference.name; + maleWornModelId1 = reference.maleWornModelId1; + modelOffsetY = templateReference.modelOffsetY; + femaleWornModelId1 = reference.femaleWornModelId1; + maleWornModelId2 = reference.maleWornModelId2; + modelOffsetX = templateReference.modelOffsetX; + unknownArray1 = reference.unknownArray1; + stackable = reference.stackable; + modelRotationY = templateReference.modelRotationY; + textureColour1 = reference.textureColour1; + colourEquip1 = reference.colourEquip1; + textureColour2 = reference.textureColour2; + modifiedModelColors = reference.modifiedModelColors; + modelZoom = templateReference.modelZoom; + colourEquip2 = reference.colourEquip2; + teamId = reference.teamId; + value = 0; + groundActions = reference.groundActions; + originalModelColors = reference.originalModelColors; + membersOnly = reference.membersOnly; + clientScriptData = reference.clientScriptData; + interfaceModelId = templateReference.interfaceModelId; + if (reference.options != null) { + options = reference.options.clone(); + } + } + + /** + * Checks if the player has the needed requirements to use this item. + * @param player The player. + * @param wield If requirements are checked for wearing the item. + * @param message If a message should be sent when the player does not meet + * a requirement. + * @return {@code True} if so. + */ + public boolean hasRequirement(Player player, boolean wield, boolean message) { + Map requirements = getConfiguration(ItemConfigParser.REQUIREMENTS); + if (requirements == null) { + return true; + } + for (int skill : requirements.keySet()) { + if (wield) { + if (skill > Skills.MAGIC && skill != Skills.SLAYER && skill != Skills.HUNTER) { + continue; + } + } else if (skill <= Skills.MAGIC && skill != Skills.SLAYER && skill != Skills.HUNTER) { + continue; + } + if (skill < 0 || skill >= Skills.SKILL_NAME.length) { + continue; + } + int level = requirements.get(skill); + if (player.getSkills().getStaticLevel(skill) < level) { + if (message) { + String name = Skills.SKILL_NAME[skill]; + player.getPacketDispatch().sendMessage("You need a" + (StringUtils.isPlusN(name) ? "n " : " ") + name + " level of " + level + " to " + (wield ? "wear " : "use ") + "this."); + } + return false; + } + } + return true; + } + + /** + * Checks if the player can enter entrana. + * @param player the player. + * @return {@code True} if so. + */ + public static boolean canEnterEntrana(Player player) { + Container[] container = new Container[] { player.getInventory(), player.getEquipment() }; + for (Container c : container) { + for (Item i : c.toArray()) { + if (i == null) { + continue; + } + if (!i.getDefinition().isAllowedOnEntrana()) { + return false; + } + } + } + return true; + } + + /** + * The allowed names. + */ + private static final String[] allowedNames = new String[] { "cape", "robe", "hat", "potion" }; + + /** + * Checks if the item is allowed on entrana. + * @return {@code True} if so. + */ + public boolean isAllowedOnEntrana() { + if (getId() == 946) { + return true; + } + if (getName().equals("Boots")) { + return true; + } + if (getName().toLowerCase().startsWith("ring") || getName().toLowerCase().startsWith("amulet")) { + return true; + } + if (getName().toLowerCase().contains("spotted") || getName().toLowerCase().equals("spottier")) { + return true; + } + if (getName().equals("Boots of lightness")) { + return true; + } + if(getName().toLowerCase().contains("arrow") || getName().toLowerCase().contains("bolt")){ + return false; + } + for (String name : allowedNames) { + if (getName().toLowerCase().contains(name)) { + return true; + } + } + return getConfiguration(ItemConfigParser.BONUS) == null; + } + + /** + * Gets the level requirement for this item. + * @param skillId The skill id. + * @return The level required. + */ + public int getRequirement(int skillId) { + Map requirements = getConfiguration(ItemConfigParser.REQUIREMENTS); + if (requirements == null) { + return 0; + } + Integer level = requirements.get(skillId); + return level == null ? 0 : level; + } + + /** + * Gets the wielding animation id (render animation id). + * @return The wield animation id. + */ + public int getRenderAnimationId() { + return getConfiguration(ItemConfigParser.RENDER_ANIM_ID, 1426); + } + + @Override + public int getId() { + return id; + } + + @Override + public void setId(int id) { + this.id = id; + } + + /** + * Gets the interfaceModelId. + * @return The interfaceModelId. + */ + public int getInterfaceModelId() { + return interfaceModelId; + } + + /** + * Sets the interfaceModelId. + * @param interfaceModelId The interfaceModelId to set. + */ + public void setInterfaceModelId(int interfaceModelId) { + this.interfaceModelId = interfaceModelId; + } + + /** + * Gets the name. + * @return The name. + */ + @Override + public String getName() { + return name; + } + + /** + * Sets the name. + * @param name The name to set. + */ + @Override + public void setName(String name) { + this.name = name; + } + + /** + * Checks if the item type is for player usage. + * @return {@code True}. + */ + public boolean isPlayerType() { + return itemType == 0; + } + + /** + * Gets the modelZoom. + * @return The modelZoom. + */ + public int getModelZoom() { + return modelZoom; + } + + /** + * Sets the modelZoom. + * @param modelZoom The modelZoom to set. + */ + public void setModelZoom(int modelZoom) { + this.modelZoom = modelZoom; + } + + /** + * Gets the modelRotation1. + * @return The modelRotation1. + */ + public int getModelRotation1() { + return modelRotationY; + } + + /** + * Sets the modelRotation1. + * @param modelRotation1 The modelRotation1 to set. + */ + public void setModelRotation1(int modelRotation1) { + this.modelRotationY = modelRotation1; + } + + /** + * Gets the modelRotation2. + * @return The modelRotation2. + */ + public int getModelRotation2() { + return modelRotationX; + } + + /** + * Sets the modelRotation2. + * @param modelRotation2 The modelRotation2 to set. + */ + public void setModelRotation2(int modelRotation2) { + this.modelRotationX = modelRotation2; + } + + /** + * Gets the modelOffset1. + * @return The modelOffset1. + */ + public int getModelOffset1() { + return modelOffsetX; + } + + /** + * Sets the modelOffset1. + * @param modelOffset1 The modelOffset1 to set. + */ + public void setModelOffset1(int modelOffset1) { + this.modelOffsetX = modelOffset1; + } + + /** + * Gets the modelOffset2. + * @return The modelOffset2. + */ + public int getModelOffset2() { + return modelOffsetY; + } + + /** + * Sets the modelOffset2. + * @param modelOffset2 The modelOffset2 to set. + */ + public void setModelOffset2(int modelOffset2) { + this.modelOffsetY = modelOffset2; + } + + /** + * Gets the stackable. + * @return The stackable. + */ + public boolean isStackable() { + return stackable || !this.unnoted; + } + + /** + * Sets the stackable. + * @param stackable The stackable to set. + */ + public void setStackable(boolean stackable) { + this.stackable = stackable; + } + + /** + * Gets the value. + * @return The value. + */ + public int getValue() { + if (value == 0) { + return 1; + } + return value; + } + + /** + * @return The value. + */ + public int getMaxValue() { + if ((int) (value * 1.05) <= 0) { + return 1; + } + return (int) (value * 1.05); + } + + /** + * @return The value. + */ + public int getMinValue() { + if ((int) (value * .95) <= 0) { + return 1; + } + return (int) (value * .95); + } + + /** + * Sets the value. + * @param value The value to set. + */ + public void setValue(int value) { + this.value = value; + } + + /** + * Gets the membersOnly. + * @return The membersOnly. + */ + public boolean isMembersOnly() { + return membersOnly; + } + + /** + * Sets the membersOnly. + * @param membersOnly The membersOnly to set. + */ + public void setMembersOnly(boolean membersOnly) { + this.membersOnly = membersOnly; + } + + /** + * Gets the maleWornModelId1. + * @return The maleWornModelId1. + */ + public int getMaleWornModelId1() { + return maleWornModelId1; + } + + /** + * Sets the maleWornModelId1. + * @param maleWornModelId1 The maleWornModelId1 to set. + */ + public void setMaleWornModelId1(int maleWornModelId1) { + this.maleWornModelId1 = maleWornModelId1; + } + + /** + * Gets the femaleWornModelId1. + * @return The femaleWornModelId1. + */ + public int getFemaleWornModelId1() { + return femaleWornModelId1; + } + + /** + * Sets the femaleWornModelId1. + * @param femaleWornModelId1 The femaleWornModelId1 to set. + */ + public void setFemaleWornModelId1(int femaleWornModelId1) { + this.femaleWornModelId1 = femaleWornModelId1; + } + + /** + * Gets the maleWornModelId2. + * @return The maleWornModelId2. + */ + public int getMaleWornModelId2() { + return maleWornModelId2; + } + + /** + * Sets the maleWornModelId2. + * @param maleWornModelId2 The maleWornModelId2 to set. + */ + public void setMaleWornModelId2(int maleWornModelId2) { + this.maleWornModelId2 = maleWornModelId2; + } + + /** + * Gets the femaleWornModelId2. + * @return The femaleWornModelId2. + */ + public int getFemaleWornModelId2() { + return femaleWornModelId2; + } + + /** + * Sets the femaleWornModelId2. + * @param femaleWornModelId2 The femaleWornModelId2 to set. + */ + public void setFemaleWornModelId2(int femaleWornModelId2) { + this.femaleWornModelId2 = femaleWornModelId2; + } + + /** + * Gets the groundOptions. + * @return The groundOptions. + */ + public String[] getGroundOptions() { + return groundActions; + } + + /** + * Sets the groundOptions. + * @param groundOptions The groundOptions to set. + */ + public void setGroundOptions(String[] groundOptions) { + this.groundActions = groundOptions; + } + + /** + * Gets the inventoryOptions. + * @return The inventoryOptions. + */ + public String[] getInventoryOptions() { + return options; + } + + /** + * Sets the inventoryOptions. + * @param inventoryOptions The inventoryOptions to set. + */ + public void setInventoryOptions(String[] inventoryOptions) { + this.options = inventoryOptions; + } + + /** + * Gets the originalModelColors. + * @return The originalModelColors. + */ + public short[] getOriginalModelColors() { + return originalModelColors; + } + + /** + * Sets the originalModelColors. + * @param originalModelColors The originalModelColors to set. + */ + public void setOriginalModelColors(short[] originalModelColors) { + this.originalModelColors = originalModelColors; + } + + /** + * Gets the modifiedModelColors. + * @return The modifiedModelColors. + */ + public short[] getModifiedModelColors() { + return modifiedModelColors; + } + + /** + * Sets the modifiedModelColors. + * @param modifiedModelColors The modifiedModelColors to set. + */ + public void setModifiedModelColors(short[] modifiedModelColors) { + this.modifiedModelColors = modifiedModelColors; + } + + /** + * Gets the textureColour1. + * @return The textureColour1. + */ + public short[] getTextureColour1() { + return textureColour1; + } + + /** + * Sets the textureColour1. + * @param textureColour1 The textureColour1 to set. + */ + public void setTextureColour1(short[] textureColour1) { + this.textureColour1 = textureColour1; + } + + /** + * Gets the textureColour2. + * @return The textureColour2. + */ + public short[] getTextureColour2() { + return textureColour2; + } + + /** + * Sets the textureColour2. + * @param textureColour2 The textureColour2 to set. + */ + public void setTextureColour2(short[] textureColour2) { + this.textureColour2 = textureColour2; + } + + /** + * Gets the unknownArray1. + * @return The unknownArray1. + */ + public byte[] getUnknownArray1() { + return unknownArray1; + } + + /** + * Sets the unknownArray1. + * @param unknownArray1 The unknownArray1 to set. + */ + public void setUnknownArray1(byte[] unknownArray1) { + this.unknownArray1 = unknownArray1; + } + + /** + * Gets the unknownArray2. + * @return The unknownArray2. + */ + public int[] getUnknownArray2() { + return unknownArray2; + } + + /** + * Sets the unknownArray2. + * @param unknownArray2 The unknownArray2 to set. + */ + public void setUnknownArray2(int[] unknownArray2) { + this.unknownArray2 = unknownArray2; + } + + /** + * Gets the unnoted. + * @return The unnoted. + */ + public boolean isUnnoted() { + return unnoted; + } + + /** + * Sets the unnoted. + * @param unnoted The unnoted to set. + */ + public void setUnnoted(boolean unnoted) { + this.unnoted = unnoted; + } + + /** + * Gets the colourEquip1. + * @return The colourEquip1. + */ + public int getColourEquip1() { + return colourEquip1; + } + + /** + * Sets the colourEquip1. + * @param colourEquip1 The colourEquip1 to set. + */ + public void setColourEquip1(int colourEquip1) { + this.colourEquip1 = colourEquip1; + } + + /** + * Gets the colourEquip2. + * @return The colourEquip2. + */ + public int getColourEquip2() { + return colourEquip2; + } + + /** + * Sets the colourEquip2. + * @param colourEquip2 The colourEquip2 to set. + */ + public void setColourEquip2(int colourEquip2) { + this.colourEquip2 = colourEquip2; + } + + /** + * Gets the noteId. + * @return The noteId. + */ + public int getNoteId() { + return noteId; + } + + /** + * Sets the noteId. + * @param noteId The noteId to set. + */ + public void setNoteId(int noteId) { + this.noteId = noteId; + } + + /** + * Gets the noteTemplateId. + * @return The noteTemplateId. + */ + public int getNoteTemplateId() { + return noteTemplateId; + } + + /** + * Sets the noteTemplateId. + * @param noteTemplateId The noteTemplateId to set. + */ + public void setNoteTemplateId(int noteTemplateId) { + this.noteTemplateId = noteTemplateId; + } + + /** + * Gets the stackIds. + * @return The stackIds. + */ + public int[] getStackIds() { + return stackIds; + } + + /** + * Sets the stackIds. + * @param stackIds The stackIds to set. + */ + public void setStackIds(int[] stackIds) { + this.stackIds = stackIds; + } + + /** + * Gets the stackAmounts. + * @return The stackAmounts. + */ + public int[] getStackAmounts() { + return stackAmounts; + } + + /** + * Sets the stackAmounts. + * @param stackAmounts The stackAmounts to set. + */ + public void setStackAmounts(int[] stackAmounts) { + this.stackAmounts = stackAmounts; + } + + /** + * Gets the teamId. + * @return The teamId. + */ + public int getTeamId() { + return teamId; + } + + /** + * Sets the teamId. + * @param teamId The teamId to set. + */ + public void setTeamId(int teamId) { + this.teamId = teamId; + } + + /** + * Gets the lendId. + * @return The lendId. + */ + public int getLendId() { + return lendId; + } + + /** + * Sets the lendId. + * @param lendId The lendId to set. + */ + public void setLendId(int lendId) { + this.lendId = lendId; + } + + /** + * Gets the lendTemplateId. + * @return The lendTemplateId. + */ + public int getLendTemplateId() { + return lendTemplateId; + } + + /** + * Sets the lendTemplateId. + * @param lendTemplateId The lendTemplateId to set. + */ + public void setLendTemplateId(int lendTemplateId) { + this.lendTemplateId = lendTemplateId; + } + + /** + * Gets the recolourId. + * @return The recolourId. + */ + public int getRecolourId() { + return recolourId; + } + + /** + * Sets the recolourId. + * @param recolourId The recolourId to set. + */ + public void setRecolourId(int recolourId) { + this.recolourId = recolourId; + } + + /** + * Gets the recolourTemplateId. + * @return The recolourTemplateId. + */ + public int getRecolourTemplateId() { + return recolourTemplateId; + } + + /** + * Sets the recolourTemplateId. + * @param recolourTemplateId The recolourTemplateId to set. + */ + public void setRecolourTemplateId(int recolourTemplateId) { + this.recolourTemplateId = recolourTemplateId; + } + + /** + * Gets the equipId. + * @return The equipId. + */ + public int getEquipId() { + return equipId; + } + + /** + * Sets the equipId. + * @param equipId The equipId to set. + */ + public void setEquipId(int equipId) { + this.equipId = equipId; + } + + /** + * Gets the clientScriptData. + * @return The clientScriptData. + */ + public HashMap getClientScriptData() { + return clientScriptData; + } + + /** + * Sets the clientScriptData. + * @param clientScriptData The clientScriptData to set. + */ + public void setClientScriptData(HashMap clientScriptData) { + this.clientScriptData = clientScriptData; + } + + /** + * Gets the alchemy value. + * @param highAlchemy If the value is for high alchemy (instead of low). + * @return The alchemy value. + */ + public int getAlchemyValue(boolean highAlchemy) { + if (!unnoted && noteId > -1) { + return forId(noteId).getAlchemyValue(highAlchemy); + } + if (highAlchemy) { + return getConfiguration(ItemConfigParser.HIGH_ALCHEMY, 0); + } + return getConfiguration(ItemConfigParser.LOW_ALCHEMY, 0); + } + + /** + * Checks if the item is tradeable. + * @return {@code True} if so. + */ + public boolean isTradeable() { + if (hasDestroyAction() && !getName().contains("impling jar")) { + return false; + } + if (!getConfiguration(ItemConfigParser.TRADEABLE, false)) { + return false; + } + return !unnoted || GrandExchangeDatabase.getDatabase().get(getId()) != null; + } + + /** + * If the item has the specified item. + * @param optionName The reward. + * @return If the item has the specified reward {@code true}. + */ + public boolean hasAction(String optionName) { + if (options == null) { + return false; + } + for (String action : options) { + if (action == null) { + continue; + } + if (action.equalsIgnoreCase(optionName)) { + return true; + } + } + return false; + } + + /** + * If the item has the destroy reward. + * @return If the item has the destroy reward {@code true}. + */ + public boolean hasDestroyAction() { + return hasAction("destroy") || hasAction("dissolve"); + } + + /** + * If the item has the wear reward. + * @return If the item has the wear reward {@code true}. + */ + public boolean hasWearAction() { + if (options == null) { + return false; + } + for (String action : options) { + if (action == null) { + continue; + } + if (action.equalsIgnoreCase("wield") || action.equalsIgnoreCase("wear") || action.equalsIgnoreCase("equip")) { + return true; + } + } + return false; + } + + /** + * If the item has a special bar. + * @return If the item has a special bar {@code true}. + */ + public boolean hasSpecialBar() { + if (clientScriptData == null) { + return false; + } + Object specialBar = clientScriptData.get(686); + if (specialBar != null && specialBar instanceof Integer) { + return (Integer) specialBar == 1; + } + return false; + } + + /** + * Get the quest id for the item. + * @return The quest id. + */ + public int getQuestId() { + if (clientScriptData == null) { + return -1; + } + Object questId = clientScriptData.get(861); + if (questId != null && questId instanceof Integer) { + return (Integer) questId; + } + return -1; + } + + /** + * Get the archive id. + * @return The archive id. + */ + public int getArchiveId() { + return id >>> 8; + } + + /** + * Get the file id. + * @return The file id. + */ + public int getFileId() { + return 0xff & id; + } + + /** + * Gets the definitions. + * @return The definitions. + */ + public static Map getDefinitions() { + return DEFINITIONS; + } + + /** + * Gets the option handler for the given option name. + * @param nodeId + * @param name The name. + * @return The option handler, or {@code null} if there was no default + * option handler. + */ + public static OptionHandler getOptionHandler(int nodeId, String name) { + ItemDefinition def = forId(nodeId); + if (def == null) { + if (nodeId == 22937) + SystemLogger.logErr("[ItemDefinition] No definition for item id " + nodeId + "!"); + return null; + } + OptionHandler handler = def.getConfiguration("option:" + name); + if (handler != null) { + return handler; + } + return OPTION_HANDLERS.get(name); + } + + /** + * The bonus names. + */ + private static final String[] BONUS_NAMES = { "Stab: ", "Slash: ", "Crush: ", "Magic: ", "Ranged: ", "Stab: ", "Slash: ", "Crush: ", "Magic: ", "Ranged: ", "Summoning: ", "Strength: ", "Prayer: " }; + + /** + * Updates the equipment stats interface. + * @param player The player to update for. + */ + public static void statsUpdate(Player player) { + if (!player.getAttribute("equip_stats_open", false)) { + return; + } + PacketRepository.send(WeightUpdate.class, player.getPacketDispatch().getContext()); + int index = 0; + int[] bonuses = player.getProperties().getBonuses(); + for (int i = 36; i < 50; i++) { + if (i == 47) { + continue; + } + int bonus = bonuses[index]; + String bonusValue = bonus > -1 ? ("+" + bonus) : Integer.toString(bonus); + player.getPacketDispatch().sendString(BONUS_NAMES[index++] + bonusValue, 667, i); + } + player.getPacketDispatch().sendString("Attack bonus", 667, 34); + DecimalFormat dec = new DecimalFormat("#.#"); + player.getPacketDispatch().sendString(dec.format(player.getSettings().getWeight())+" kg", 667, 32); + } + + /** + * Checks if it has a plugin. + * @return {@code True} if so. + */ + public boolean hasPlugin() { + return getItemPlugin() != null; + } + + /** + * Gets the item plugin. + * @return the plugin. + */ + public ItemPlugin getItemPlugin() { + return getConfiguration("wrapper", null); + } + + /** + * Sets the item plugin. + * @param plugin the plugin. + */ + public void setItemPlugin(ItemPlugin plugin) { + getHandlers().put("wrapper", plugin); + } + + /** + * Sets the default option handler for an option. + * @param name The option name. + * @param handler The default option handler. + * @return {@code True} if there was a previous default handler mapped. + */ + public static boolean setOptionHandler(String name, OptionHandler handler) { + return OPTION_HANDLERS.put(name, handler) != null; + } + + /** + * @return the optionHandlers + */ + public static Map getOptionHandlers() { + return OPTION_HANDLERS; + } + + /** + * @return the itemRequirements. + */ + public HashMap getItemRequirements() { + return itemRequirements; + } + + /** + * @param itemRequirements the itemRequirements to set. + */ + public void setItemRequirements(HashMap itemRequirements) { + this.itemRequirements = itemRequirements; + } + + /** + * Gets the itemType. + * @return The itemType. + */ + public int getItemType() { + return itemType; + } + + /** + * Sets the itemType. + * @param itemType The itemType to set. + */ + public void setItemType(int itemType) { + this.itemType = itemType; + } + + /** + * Gets the femaleWornModelId3 value. + * @return The femaleWornModelId3. + */ + public int getFemaleWornModelId3() { + return femaleWornModelId3; + } + /** + * Sets the femaleWornModelId3 value. + * @param femaleWornModelId3 The femaleWornModelId3 to set. + */ + public void setFemaleWornModelId3(int femaleWornModelId3) { + this.femaleWornModelId3 = femaleWornModelId3; + } + /** + * Gets the femaleWornModelId4 value. + * @return The femaleWornModelId4. + */ + public int getFemaleWornModelId4() { + return femaleWornModelId4; + } + /** + * Sets the femaleWornModelId4 value. + * @param femaleWornModelId4 The femaleWornModelId4 to set. + */ + public void setFemaleWornModelId4(int femaleWornModelId4) { + this.femaleWornModelId4 = femaleWornModelId4; + } + /** + * Gets the maleWornModelId3 value. + * @return The maleWornModelId3. + */ + public int getMaleWornModelId3() { + return maleWornModelId3; + } + /** + * Sets the maleWornModelId3 value. + * @param maleWornModelId3 The maleWornModelId3 to set. + */ + public void setMaleWornModelId3(int maleWornModelId3) { + this.maleWornModelId3 = maleWornModelId3; + } + /** + * Gets the maleWornModelId4 value. + * @return The maleWornModelId4. + */ + public int getMaleWornModelId4() { + return maleWornModelId4; + } + /** + * Sets the maleWornModelId4 value. + * @param maleWornModelId4 The maleWornModelId4 to set. + */ + public void setMaleWornModelId4(int maleWornModelId4) { + this.maleWornModelId4 = maleWornModelId4; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/impl/NPCDefinition.java b/Server/src/main/java/Server/core/cache/def/impl/NPCDefinition.java new file mode 100644 index 000000000..0a20eeb7e --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/NPCDefinition.java @@ -0,0 +1,1117 @@ +package core.cache.def.impl; + +import core.cache.Cache; +import core.cache.def.Definition; +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.interaction.OptionHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.npc.drop.NPCDropTables; +import core.game.node.entity.player.Player; +import core.game.system.config.NPCConfigParser; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.StringUtils; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +/** + * Debug NPC Opcodes Line 483, Uncomment + */ + +/** + * Represents an NPC's definitions. + * @author Emperor + */ +public final class NPCDefinition extends Definition { + + /** + * The definitions. + */ + private static final Map DEFINITIONS = new HashMap<>(); + + /** + * The default option handlers. + */ + private static final Map OPTION_HANDLERS = new HashMap<>(); + + /** + * The size. + */ + public int size = 1; + + /** + * The combat level. + */ + private int combatLevel; + + /** + * The head icons. + */ + public int headIcons; + + /** + * If the NPC can be seen on the minimap. + */ + public boolean isVisibleOnMap; + + /** + * The examine option value + */ + public String examine; + + /** + * The drop tables. + */ + private NPCDropTables dropTables = new NPCDropTables(this); + + /** + * Unidentified variables. + */ + public int anInt833; + public int anInt836; + public int anInt837; + public boolean aBoolean841; + public int anInt842; + public int configFileId; + public int[] childNPCIds; + public int anInt846; + public int anInt850; + public byte aByte851; + public boolean aBoolean852; + public int anInt853; + public byte aByte854; + public boolean aBoolean856; + public boolean aBoolean857; + public short[] aShortArray859; + public byte[] aByteArray861; + public short aShort862; + public boolean aBoolean863; + public int anInt864; + public short[] aShortArray866; + public int[] anIntArray868; + public int anInt869; + public int anInt870; + public int anInt871; + public int anInt872; + public int anInt874; + public int anInt875; + public int anInt876; + public int anInt879; + public short[] aShortArray880; + public int anInt884; + public int configId; + public int anInt889; + public int[] anIntArray892; + public short aShort894; + public short[] aShortArray896; + public int anInt897; + public int anInt899; + public int anInt901; + public int standAnimation; + public int walkAnimation; + public int renderAnimationId; + + /** + * The minimum combat distance (0 uses default distances). + */ + private int combatDistance; + + /** + * The combat graphics. + */ + private Graphics[] combatGraphics = new Graphics[3]; + + /** + * The turning animation. + */ + private int turnAnimation; + + /** + * The turn 180� animation. + */ + private int turn180Animation; + + /** + * The turn clock-wise animation. + */ + private int turnCWAnimation; + + /** + * The turn counter clock-wise animation. + */ + private int turnCCWAnimation; + + /** + * Constructs a new {@code NPCDefinition} {@code Object}. + * @param id The NPC id. + */ + public NPCDefinition(int id) { + this.id = id; + anInt842 = -1; + configFileId = -1; + anInt837 = -1; + anInt846 = -1; + anInt853 = 32; + standAnimation = -1; + walkAnimation = -1; + combatLevel = 0; + anInt836 = -1; + name = "null"; + anInt869 = 0; + anInt850 = 255; + anInt871 = -1; + aBoolean852 = true; + aShort862 = (short) 0; + anInt876 = -1; + aByte851 = (byte) -96; + anInt875 = 0; + anInt872 = -1; + aBoolean857 = true; + anInt870 = -1; + anInt874 = -1; + anInt833 = -1; + anInt864 = 128; + headIcons = -1; + aBoolean856 = false; + configId = -1; + aByte854 = (byte) -16; + aBoolean863 = false; + isVisibleOnMap = true; + anInt889 = -1; + anInt884 = -1; + aBoolean841 = true; + anInt879 = -1; + anInt899 = 128; + aShort894 = (short) 0; + options = new String[5]; + anInt897 = 0; + anInt901 = -1; + anIntArray868 = new int[0]; + } + + /** + * Gets the NPC definition for this id. + * @param id The NPC id. + * @return The NPC definition object. + */ + public static NPCDefinition forId(int id) { + NPCDefinition def = DEFINITIONS.get(id); + if (def == null) { + def = new NPCDefinition(id); + byte[] data = Cache.getIndexes()[18].getFileData(id >>> 134238215, id & 0x7f); + if (data == null) { + if (id != -1) { + // System.out.println("Failed loading NPC " + id + "."); + } + } else { + def.parse(ByteBuffer.wrap(data)); + } + DEFINITIONS.put(id, def); + } + return def; + } + + public static void main(String... args) throws Throwable { + GameWorld.prompt(false); + System.out.println("Roar: " + NPCDefinition.forId(2329).standAnimation); + // for (int i = 0; i < 11000; i++) { + // ItemDefinition def = ItemDefinition.forId(i); + // if (def.getMaleWornModelId1() >= 1250 && def.getMaleWornModelId1() <= + // 1550) { + // System.out.println(def.getName() + " " + i + ": " + + // def.getMaleWornModelId1()); + // } + // } + } + + /** + * Gets the child object definitions. + * @param player The player to get it for. + * @return The object definition. + */ + public NPCDefinition getChildNPC(Player player) { + if (childNPCIds == null || childNPCIds.length < 1) { + return this; + } + int configValue = -1; + if (player != null) { + if (configFileId != -1) { + configValue = VarbitDefinition.forNPCID(configFileId).getValue(player); + } else if (configId != -1) { + configValue = player.getConfigManager().get(configId); + } + } else { + configValue = 0; + } + if (configValue < 0 || configValue >= childNPCIds.length - 1 || childNPCIds[configValue] == -1) { + int objectId = childNPCIds[childNPCIds.length - 1]; + if (objectId != -1) { + return forId(objectId); + } + return this; + } + return forId(childNPCIds[configValue]); + } + + /** + * Parses the data. + * @param buffer The data input stream. + */ + private void parse(ByteBuffer buffer) { + while (true) { + int opcode = buffer.get() & 0xFF; + if (opcode == 0) { + break; + } + parseOpcode(buffer, opcode); + } + } + + /** + * Parses an opcode. + * @param buffer The data input stream. + * @param opcode The opcode to parse. + */ + private void parseOpcode(ByteBuffer buffer, int opcode) { + switch (opcode) { + case 1: + int length = buffer.get() & 0xFF; + anIntArray868 = new int[length]; + for (int i_66_ = 0; i_66_ < length; i_66_++) { + anIntArray868[i_66_] = buffer.getShort() & 0xFFFF; + if ((anIntArray868[i_66_] ^ 0xffffffff) == -65536) + anIntArray868[i_66_] = -1; + } + break; + case 2: + name = ByteBufferUtils.getString(buffer); + break; + case 12: + size = buffer.get() & 0xFF; + break; + case 13: + standAnimation = buffer.getShort(); + break; + case 14: + walkAnimation = buffer.getShort(); + break; + case 15: + turnAnimation = buffer.getShort(); + break; + case 16: + buffer.getShort(); // Another turn animation + break; + case 17: + walkAnimation = buffer.getShort(); + turn180Animation = buffer.getShort(); + turnCWAnimation = buffer.getShort(); + turnCCWAnimation = buffer.getShort(); + break; + case 30: + case 31: + case 32: + case 33: + case 34: + options[opcode - 30] = ByteBufferUtils.getString(buffer); + break; + case 40: + length = buffer.get() & 0xFF; + aShortArray859 = new short[length]; + aShortArray896 = new short[length]; + for (int i_65_ = 0; (length ^ 0xffffffff) < (i_65_ ^ 0xffffffff); i_65_++) { + aShortArray896[i_65_] = (short) (buffer.getShort() & 0xFFFF); + aShortArray859[i_65_] = (short) (buffer.getShort() & 0xFFFF); + } + break; + case 41: + length = buffer.get() & 0xFF; + aShortArray880 = new short[length]; + aShortArray866 = new short[length]; + for (int i_54_ = 0; (i_54_ ^ 0xffffffff) > (length ^ 0xffffffff); i_54_++) { + aShortArray880[i_54_] = (short) (buffer.getShort() & 0xFFFF); + aShortArray866[i_54_] = (short) (buffer.getShort() & 0xFFFF); + } + break; + case 42: + length = buffer.get() & 0xFF; + aByteArray861 = new byte[length]; + for (int i_55_ = 0; length > i_55_; i_55_++) { + aByteArray861[i_55_] = (byte) buffer.get(); + } + break; + case 60: + length = buffer.get() & 0xFF; + anIntArray892 = new int[length]; + for (int i_64_ = 0; (i_64_ ^ 0xffffffff) > (length ^ 0xffffffff); i_64_++) { + anIntArray892[i_64_] = buffer.getShort() & 0xFFFF; + } + break; + case 93: + isVisibleOnMap = false; + break; + case 95: + setCombatLevel(buffer.getShort() & 0xFFFF); + break; + case 97: + anInt864 = buffer.getShort() & 0xFFFF; + break; + case 98: + anInt899 = buffer.getShort() & 0xFFFF; + break; + case 99: + aBoolean863 = true; + break; + case 100: + anInt869 = buffer.get(); + break; + case 101: + anInt897 = buffer.get() * 5; + break; + case 102: + headIcons = buffer.getShort() & 0xFFFF; + break; + case 103: + anInt853 = buffer.getShort() & 0xFFFF; + break; + case 106: + case 118: + configFileId = buffer.getShort() & 0xFFFF; + if (configFileId == 65535) { + configFileId = -1; + } + configId = buffer.getShort() & 0xFFFF; + if (configId == 65535) { + configId = -1; + } + int defaultValue = -1; + if ((opcode ^ 0xffffffff) == -119) { + defaultValue = buffer.getShort() & 0xFFFF; + if (defaultValue == 65535) { + defaultValue = -1; + } + } + length = buffer.get() & 0xFF; + childNPCIds = new int[2 + length]; + for (int i = 0; length >= i; i++) { + childNPCIds[i] = buffer.getShort() & 0xFFFF; + if (childNPCIds[i] == 65535) { + childNPCIds[i] = -1; + } + } + childNPCIds[length + 1] = defaultValue; + break; + case 107: + aBoolean841 = false; + break; + case 109: + aBoolean852 = false; + break; + case 111: + aBoolean857 = false; + break; + case 113: + aShort862 = (short) (buffer.getShort() & 0xFFFF); + aShort894 = (short) (buffer.getShort() & 0xFFFF); + break; + case 114: + aByte851 = (byte) (buffer.get()); + aByte854 = (byte) (buffer.get()); + break; + case 115: + buffer.get();// & 0xFF; + buffer.get();// & 0xFF; + break; + case 119: + buffer.get(); + break; + case 121: + length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + buffer.get(); + buffer.get(); + buffer.get(); + buffer.get(); + } + break; + case 122: + buffer.getShort(); + break; + case 123: + buffer.getShort(); + break; + case 125: + buffer.get(); + break; + case 126: + buffer.getShort(); + case 127: + renderAnimationId = buffer.getShort(); + break; + case 128: + buffer.get(); + break; + case 134: + buffer.getShort(); + buffer.getShort(); + buffer.getShort(); + buffer.getShort(); + buffer.get(); + break; + case 135: + buffer.get(); + buffer.getShort(); + break; + case 136: + buffer.get(); + buffer.getShort(); + break; + case 137: + buffer.getShort(); + break; + case 249: + length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + boolean string = buffer.get() == 1; + ByteBufferUtils.getTriByte(buffer); // script id + if (!string) { + buffer.getInt(); // Value + } else { + ByteBufferUtils.getString(buffer); // value + } + } + break; + default: + //SystemLogger.logErr("Unhandled NPC definition opcode: " + opcode); + } + } + + /** + * Checks if this NPC has an attack option. + * @return {@code True} if so. + */ + public boolean hasAttackOption() { + for (String option : options) { + if (option != null && option.equalsIgnoreCase("attack")) { + return true; + } + } + return false; + } + + /** + * Gets the option handler for the given option name. + * @param nodeId The node id. + * @param name The name. + * @return The option handler, or {@code null} if there was no default + * option handler. + */ + public static OptionHandler getOptionHandler(int nodeId, String name) { + NPCDefinition def = forId(nodeId); + OptionHandler handler = def.getConfiguration("option:" + name); + if (handler != null) { + return handler; + } + return OPTION_HANDLERS.get(name); + } + + /** + * Checks if an npc has an reward. + * @param optionName The option name. + * @return {@code True} if so. + */ + public boolean hasAction(String optionName) { + if (options == null) { + return false; + } + for (String action : options) { + if (action == null) { + continue; + } + if (action.equalsIgnoreCase(optionName)) { + return true; + } + } + return false; + } + + /** + * Sets the default option handler for an option. + * @param name The option name. + * @param handler The default option handler. + * @return {@code True} if there was a previous default handler mapped. + */ + public static boolean setOptionHandler(String name, OptionHandler handler) { + return OPTION_HANDLERS.put(name, handler) != null; + } + + /** + * Gets the option handlers. + * @return The option handlers. + */ + public static Map getOptionHandlers() { + return OPTION_HANDLERS; + } + + /** + * Gets the definitions mapping. + * @return The mapping. + */ + public static final Map getDefinitions() { + return DEFINITIONS; + } + + /** + * Method returns the value for 'examine' + * @return the examine. + */ + public final String getExamine() { + String string = getConfiguration(NPCConfigParser.EXAMINE, examine); + if (string != null) { + return string; + } + if (name.length() <= 1) { + return string; + } + return "It's a" + (StringUtils.isPlusN(name) ? "n " : " ") + name + "."; + } + + /** + * Method sets the value for 'examine' + * @param examine the examine to set. + */ + public final void setExamine(String examine) { + this.examine = examine; + } + + /** + * Initializes the combat graphics. + * @param config The configurations. + */ + public void initCombatGraphics(Map config) { + if (config.containsKey(NPCConfigParser.START_GRAPHIC)) { + combatGraphics[0] = new Graphics((Integer) config.get(NPCConfigParser.START_GRAPHIC), getConfiguration(NPCConfigParser.START_HEIGHT, 0)); + } + if (config.containsKey(NPCConfigParser.PROJECTILE)) { + combatGraphics[1] = new Graphics((Integer) config.get(NPCConfigParser.PROJECTILE), getConfiguration(NPCConfigParser.PROJECTILE_HEIGHT, 42)); + } + if (config.containsKey(NPCConfigParser.END_GRAPHIC)) { + combatGraphics[2] = new Graphics((Integer) config.get(NPCConfigParser.END_GRAPHIC), getConfiguration(NPCConfigParser.END_HEIGHT, 96)); + } + } + + /** + * Gets the combat animation. + * @param index The index. + * @return The Animation. + */ + public Animation getCombatAnimation(int index) { + String name = ""; + switch (index) { + case 0: + name = NPCConfigParser.MELEE_ANIMATION; + break; + case 1: + name = NPCConfigParser.MAGIC_ANIMATION; + break; + case 2: + name = NPCConfigParser.RANGE_ANIMATION; + break; + case 3: + name = NPCConfigParser.DEFENCE_ANIMATION; + break; + case 4: + name = NPCConfigParser.DEATH_ANIMATION; + break; + } + return getConfiguration(name, null); + } + + /** + * Gets the size. + * @return The size. + */ + public int getSize() { + return size; + } + + /** + * Gets the headIcons. + * @return The headIcons. + */ + public int getHeadIcons() { + return headIcons; + } + + /** + * Gets the isVisibleOnMap. + * @return The isVisibleOnMap. + */ + public boolean isVisibleOnMap() { + return isVisibleOnMap; + } + + /** + * Gets the anInt833. + * @return The anInt833. + */ + public int getAnInt833() { + return anInt833; + } + + /** + * Gets the anInt836. + * @return The anInt836. + */ + public int getAnInt836() { + return anInt836; + } + + /** + * Gets the anInt837. + * @return The anInt837. + */ + public int getAnInt837() { + return anInt837; + } + + /** + * Gets the aBoolean841. + * @return The aBoolean841. + */ + public boolean isaBoolean841() { + return aBoolean841; + } + + /** + * Gets the anInt842. + * @return The anInt842. + */ + public int getAnInt842() { + return anInt842; + } + + /** + * Gets the configFileId. + * @return The configFileId. + */ + public int getConfigFileId() { + return configFileId; + } + + /** + * Gets the childNPCIds. + * @return The childNPCIds. + */ + public int[] getChildNPCIds() { + return childNPCIds; + } + + /** + * Gets the anInt846. + * @return The anInt846. + */ + public int getAnInt846() { + return anInt846; + } + + /** + * Gets the anInt850. + * @return The anInt850. + */ + public int getAnInt850() { + return anInt850; + } + + /** + * Gets the aByte851. + * @return The aByte851. + */ + public byte getaByte851() { + return aByte851; + } + + /** + * Gets the aBoolean852. + * @return The aBoolean852. + */ + public boolean isaBoolean852() { + return aBoolean852; + } + + /** + * Gets the anInt853. + * @return The anInt853. + */ + public int getAnInt853() { + return anInt853; + } + + /** + * Gets the aByte854. + * @return The aByte854. + */ + public byte getaByte854() { + return aByte854; + } + + /** + * Gets the aBoolean856. + * @return The aBoolean856. + */ + public boolean isaBoolean856() { + return aBoolean856; + } + + /** + * Gets the aBoolean857. + * @return The aBoolean857. + */ + public boolean isaBoolean857() { + return aBoolean857; + } + + /** + * Gets the aShortArray859. + * @return The aShortArray859. + */ + public short[] getaShortArray859() { + return aShortArray859; + } + + /** + * Gets the aByteArray861. + * @return The aByteArray861. + */ + public byte[] getaByteArray861() { + return aByteArray861; + } + + /** + * Gets the aShort862. + * @return The aShort862. + */ + public short getaShort862() { + return aShort862; + } + + /** + * Gets the aBoolean863. + * @return The aBoolean863. + */ + public boolean isaBoolean863() { + return aBoolean863; + } + + /** + * Gets the anInt864. + * @return The anInt864. + */ + public int getAnInt864() { + return anInt864; + } + + /** + * Gets the aShortArray866. + * @return The aShortArray866. + */ + public short[] getaShortArray866() { + return aShortArray866; + } + + /** + * Gets the anIntArray868. + * @return The anIntArray868. + */ + public int[] getAnIntArray868() { + return anIntArray868; + } + + /** + * Gets the anInt869. + * @return The anInt869. + */ + public int getAnInt869() { + return anInt869; + } + + /** + * Gets the anInt870. + * @return The anInt870. + */ + public int getAnInt870() { + return anInt870; + } + + /** + * Gets the anInt871. + * @return The anInt871. + */ + public int getAnInt871() { + return anInt871; + } + + /** + * Gets the anInt872. + * @return The anInt872. + */ + public int getAnInt872() { + return anInt872; + } + + /** + * Gets the anInt874. + * @return The anInt874. + */ + public int getAnInt874() { + return anInt874; + } + + /** + * Gets the anInt875. + * @return The anInt875. + */ + public int getAnInt875() { + return anInt875; + } + + /** + * Gets the anInt876. + * @return The anInt876. + */ + public int getAnInt876() { + return anInt876; + } + + /** + * Gets the anInt879. + * @return The anInt879. + */ + public int getAnInt879() { + return anInt879; + } + + /** + * Gets the aShortArray880. + * @return The aShortArray880. + */ + public short[] getaShortArray880() { + return aShortArray880; + } + + /** + * Gets the anInt884. + * @return The anInt884. + */ + public int getAnInt884() { + return anInt884; + } + + /** + * Gets the configId. + * @return The configId. + */ + public int getConfigId() { + if(configFileId != -1) { + return VarbitDefinition.forNPCID(configFileId).getConfigId(); + } else return configFileId; + } + + public int getVarbitOffset() { + if(configFileId != -1){ + return VarbitDefinition.forNPCID(configFileId).getBitShift(); + } + return -1; + } + + public int getVarbitSize() { + if(configFileId != -1){ + return VarbitDefinition.forNPCID(configFileId).getBitSize() - VarbitDefinition.forNPCID(configFileId).getBitShift(); + } + return -1; + } + + /** + * Gets the anInt889. + * @return The anInt889. + */ + public int getAnInt889() { + return anInt889; + } + + /** + * Gets the anIntArray892. + * @return The anIntArray892. + */ + public int[] getAnIntArray892() { + return anIntArray892; + } + + /** + * Gets the aShort894. + * @return The aShort894. + */ + public short getaShort894() { + return aShort894; + } + + /** + * Gets the aShortArray896. + * @return The aShortArray896. + */ + public short[] getaShortArray896() { + return aShortArray896; + } + + /** + * Gets the anInt897. + * @return The anInt897. + */ + public int getAnInt897() { + return anInt897; + } + + /** + * Gets the anInt899. + * @return The anInt899. + */ + public int getAnInt899() { + return anInt899; + } + + /** + * Gets the anInt901. + * @return The anInt901. + */ + public int getAnInt901() { + return anInt901; + } + + /** + * Gets the standAnimation. + * @return The standAnimation. + */ + public int getStandAnimation() { + return standAnimation; + } + + /** + * Gets the walkAnimation. + * @return The walkAnimation. + */ + public int getWalkAnimation() { + return walkAnimation; + } + + /** + * Gets the turnAnimation. + * @return The turnAnimation. + */ + public int getTurnAnimation() { + return turnAnimation; + } + + /** + * Gets the turn180Animation. + * @return The turn180Animation. + */ + public int getTurn180Animation() { + return turn180Animation; + } + + /** + * Gets the turnCWAnimation. + * @return The turnCWAnimation. + */ + public int getTurnCWAnimation() { + return turnCWAnimation; + } + + /** + * Gets the turnCCWAnimation. + * @return The turnCCWAnimation. + */ + public int getTurnCCWAnimation() { + return turnCCWAnimation; + } + + /** + * @return the dropTables. + */ + public NPCDropTables getDropTables() { + return dropTables; + } + + /** + * @param dropTables the dropTables to set. + */ + public void setDropTables(NPCDropTables dropTables) { + this.dropTables = dropTables; + } + + /** + * Gets the combatLevel. + * @return The combatLevel. + */ + public int getCombatLevel() { + return combatLevel; + } + + /** + * Sets the combatLevel. + * @param combatLevel The combatLevel to set. + */ + public void setCombatLevel(int combatLevel) { + this.combatLevel = combatLevel; + } + + /** + * Gets the combatDistance. + * @return The combatDistance. + */ + public int getCombatDistance() { + return combatDistance; + } + + /** + * Sets the combatDistance. + * @param combatDistance The combatDistance to set. + */ + public void setCombatDistance(int combatDistance) { + this.combatDistance = combatDistance; + } + + /** + * Gets the combatGraphics. + * @return The combatGraphics. + */ + public Graphics[] getCombatGraphics() { + return combatGraphics; + } + + /** + * Sets the combatGraphics. + * @param combatGraphics The combatGraphics to set. + */ + public void setCombatGraphics(Graphics[] combatGraphics) { + this.combatGraphics = combatGraphics; + } + + /** + * Gets the renderAnimationId value. + * @return The renderAnimationId. + */ + public int getRenderAnimationId() { + return renderAnimationId; + } + + /** + * Sets the renderAnimationId value. + * @param renderAnimationId The renderAnimationId to set. + */ + public void setRenderAnimationId(int renderAnimationId) { + this.renderAnimationId = renderAnimationId; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/impl/ObjectDefinition.java b/Server/src/main/java/Server/core/cache/def/impl/ObjectDefinition.java new file mode 100644 index 000000000..b968f1804 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/ObjectDefinition.java @@ -0,0 +1,1675 @@ +package core.cache.def.impl; + +import core.cache.Cache; +import core.cache.def.Definition; +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.interaction.OptionHandler; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.world.GameWorld; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +/** + * Represents an object's definition. + * @author Emperor + */ +public class ObjectDefinition extends Definition { + + /** + * The item definitions mapping. + */ + private static final Map DEFINITIONS = new HashMap(); + + /** + * The default option handlers. + */ + private static final Map OPTION_HANDLERS = new HashMap<>(); + + /** + * The original model colors. + */ + private short[] originalColors; + + /** + * The children ids. + */ + public int[] childrenIds; + + /** + * The model ids. + */ + private int[] modelIds; + + /** + * The model configuration. + */ + private int[] modelConfiguration; + + /** + * A unknown integer. + */ + static int anInt3832; + + /** + * A unkown integer array. + */ + int[] anIntArray3833 = null; + + /** + * A unknown integer. + */ + private int anInt3834; + + /** + * A unknown integer. + */ + int anInt3835; + + /** + * A unknown integer. + */ + static int anInt3836; + + /** + * A unknown byte. + */ + private byte aByte3837; + + /** + * A unknown integer. + */ + int anInt3838 = -1; + + /** + * A unknown boolean. + */ + boolean aBoolean3839; + + /** + * A unknown integer. + */ + private int anInt3840; + + /** + * A unknown integer. + */ + private int anInt3841; + + /** + * A unknown integer. + */ + static int anInt3842; + + /** + * A unknown integer. + */ + static int anInt3843; + + /** + * A unknown integer. + */ + int anInt3844; + + /** + * A unknown boolean. + */ + boolean aBoolean3845; + + /** + * A unknown integer. + */ + static int anInt3846; + + /** + * A unknown byte. + */ + private byte aByte3847; + + /** + * A unknown byte. + */ + private byte aByte3849; + + /** + * A unknown integer. + */ + int anInt3850; + + /** + * A unknown integer. + */ + int anInt3851; + + /** + * The second boolean. + */ + public boolean secondBool; + + /** + * A unknown boolean. + */ + public boolean aBoolean3853; + + /** + * A unknown integer. + */ + int anInt3855; + + /** + * The first boolean. + */ + public boolean notClipped; + + /** + * A unknown integer. + */ + int anInt3857; + + /** + * A unknown byte array. + */ + private byte[] aByteArray3858; + + /** + * A unknown integer array. + */ + int[] anIntArray3859; + + /** + * A unknown integer. + */ + int anInt3860; + + /** + * The config file id. + */ + int configFileId; + + /** + * The modified colors. + */ + private short[] modifiedColors; + + /** + * A unknown integer. + */ + int anInt3865; + + /** + * A unknown boolean. + */ + boolean aBoolean3866; + + /** + * A unknown boolean. + */ + boolean aBoolean3867; + + /** + * The solid. + */ + public boolean projectileClipped; + + /** + * A unknown integer array. + */ + private int[] anIntArray3869; + + /** + * A unknown boolean. + */ + boolean aBoolean3870; + + /** + * The y-size. + */ + public int sizeY; + + /** + * A unknown boolean. + */ + boolean aBoolean3872; + + /** + * A unknown boolean. + */ + boolean membersOnly; + + /** + * The third integer. + */ + public boolean boolean1; + + /** + * A unknown integer. + */ + private int anInt3875; + + /** + * The add object check. + */ + public int animationId; + + /** + * A unknown integer. + */ + private int anInt3877; + + /** + * A unknown integer. + */ + private int anInt3878; + + /** + * The clipping type. + */ + public int clipType; + + /** + * A unknown integer. + */ + private int anInt3881; + + /** + * A unknown integer. + */ + private int anInt3882; + + /** + * A unknown integer. + */ + private int anInt3883; + + /** + * The loader. + */ + Object loader; + + /** + * A unknown integer. + */ + private int anInt3889; + + /** + * The x-size. + */ + public int sizeX; + + /** + * A unknown boolean. + */ + public boolean aBoolean3891; + + /** + * A unknown integer. + */ + int anInt3892; + + /** + * The second integer. + */ + public int secondInt; + + /** + * A unknown boolean. + */ + boolean aBoolean3894; + + /** + * A unknown boolean. + */ + boolean aBoolean3895; + + /** + * A unknown integer. + */ + int anInt3896; + + /** + * The configuration id. + */ + int configId; + + /** + * A unknown byte array. + */ + private byte[] aByteArray3899; + + /** + * A unknown integer. + */ + int anInt3900; + + /** + * A unknown integer. + */ + private int anInt3902; + + /** + * A unknown integer. + */ + int anInt3904; + + /** + * A unknown integer. + */ + int anInt3905; + + /** + * A unknown boolean. + */ + boolean aBoolean3906; + + /** + * A unknown integer array. + */ + int[] anIntArray3908; + + /** + * A unknown byte. + */ + private byte aByte3912; + + /** + * A unknown integer. + */ + int anInt3913; + + /** + * A unknown byte. + */ + private byte aByte3914; + + /** + * A unknown integer. + */ + private int anInt3915; + + /** + * A unknown integer array. + */ + private int[][] anIntArrayArray3916; + + /** + * A unknown integer. + */ + private int anInt3917; + + /** + * A unknown short array. + */ + private short[] aShortArray3919; + + /** + * A unknown short array. + */ + private short[] aShortArray3920; + + /** + * A unknown integer. + */ + int anInt3921; + + /** + * A unknown object. + */ + private Object aClass194_3922; + + /** + * A unknown integer. + */ + boolean aBoolean3923; + + /** + * A unknown integer. + */ + boolean aBoolean3924; + + /** + * The walking flag. + */ + int walkingFlag; + + /** + * If the object has hidden options. + */ + private boolean hasHiddenOptions; + + /** + * The map icon. + */ + private short mapIcon; + + /** + * Construct a new {@code ObjectDefinition} {@code Object}. + */ + public ObjectDefinition() { + anInt3835 = -1; + anInt3860 = -1; + configFileId = -1; + aBoolean3866 = false; + anInt3851 = -1; + anInt3865 = 255; + aBoolean3845 = false; + aBoolean3867 = false; + anInt3850 = 0; + anInt3844 = -1; + anInt3881 = 0; + anInt3857 = -1; + aBoolean3872 = true; + anInt3882 = -1; + anInt3834 = 0; + options = new String[5]; + anInt3875 = 0; + aBoolean3839 = false; + anIntArray3869 = null; + sizeY = 1; + boolean1 = false; + projectileClipped = true; + anInt3883 = 0; + aBoolean3895 = true; + anInt3840 = 0; + aBoolean3870 = false; + anInt3889 = 0; + aBoolean3853 = true; + secondBool = false; + clipType = 2; + anInt3855 = -1; + anInt3878 = 0; + anInt3904 = 0; + sizeX = 1; + animationId = -1; + notClipped = false; + aBoolean3891 = false; + anInt3905 = 0; + name = "null"; + anInt3913 = -1; + aBoolean3906 = false; + membersOnly = false; + aByte3914 = (byte) 0; + anInt3915 = 0; + anInt3900 = 0; + secondInt = -1; + aBoolean3894 = false; + aByte3912 = (byte) 0; + anInt3921 = 0; + anInt3902 = 128; + configId = -1; + anInt3877 = 0; + walkingFlag = 0; + anInt3892 = 64; + aBoolean3923 = false; + aBoolean3924 = false; + anInt3841 = 128; + anInt3917 = 128; + mapIcon = -1; + } + + /** + * Main method, used for debugging object definitions. + * @param args The arguments cast on runtime. + * @throws Throwable When an exception occurs. + */ + public static void main(String... args) throws Throwable { + GameWorld.prompt(false); + // if (true) { + // for (int id = 0; id <= 27325; id++) { + // ObjectDefinition def = ObjectDefinition.forId(id); + // if (def.mapIcon > 69) { + // System.out.println(id + " - " + def.getName() + " has map icon " + + // def.mapIcon); + // } + // } + // return; 2105 + // } + /*ObjectDefinition def = ObjectDefinition.forId(2105); + System.out.println("size: " + def.getClass().getDeclaredFields().length); + for (Field f : def.getClass().getDeclaredFields()) { + if (!Modifier.isStatic(f.getModifiers())) { + if (f.getType().isArray()) { + Object object = f.get(def); + if (object != null) { + int length = Array.getLength(object); + System.out.print(f.getName() + ", ["); + for (int i = 0; i < length; i++) { + System.out.print(Array.get(object, i) + (i < (length - 1) ? ", " : "]")); + } + System.out.println(); + continue; + } + } + System.out.println(f.getName() + ", " + f.get(def)); + } + } + for (Field f : def.getClass().getSuperclass().getDeclaredFields()) { + if (!Modifier.isStatic(f.getModifiers())) { + if (f.getType().isArray()) { + Object object = f.get(def); + if (object != null) { + int length = Array.getLength(object); + System.out.print(f.getName() + ", ["); + for (int i = 0; i < length; i++) { + System.out.print(Array.get(object, i) + (i < (length - 1) ? ", " : "]")); + } + System.out.println(); + continue; + } + } + System.out.println(f.getName() + ", " + f.get(def)); + } + }*/ + } + + /** + * Parses the definitions. + * @throws Throwable the throwable. + */ + public static void parse() throws Throwable { + for (int objectId = 0; objectId < Cache.getObjectDefinitionsSize(); objectId++) { + byte[] data = Cache.getIndexes()[16].getFileData(getContainerId(objectId), objectId & 0xff); + if (data == null) { + ObjectDefinition.getDefinitions().put(objectId, new ObjectDefinition()); + //SystemLogger.logErr("Could not load object definitions for id " + objectId + " - no data!"); + continue; + } + ObjectDefinition def = ObjectDefinition.parseDefinition(objectId, ByteBuffer.wrap(data)); + if (def == null) { + // SystemLogger.logErr("Could not load object definitions for id " + objectId + " - no definitions found!"); + return; + } + ObjectDefinition.getDefinitions().put(objectId, def); + data = null; + } + } + + /** + * Gets an object definition. + * @param objectId The object's id. + * @return The object definition. + */ + public static ObjectDefinition forId(int objectId) { + ObjectDefinition def = DEFINITIONS.get(objectId); + if (def != null) { + return def; + } + DEFINITIONS.put(objectId, def = new ObjectDefinition()); + def.id = objectId; + return def; + } + + + + /** + * Parses an object's definitions. + * @param objectId The object id. + * @param buffer The buffer. + * @return The object definition. + */ + public static ObjectDefinition parseDefinition(int objectId, ByteBuffer buffer) { + ObjectDefinition def = new ObjectDefinition(); + def.id = objectId; +// SystemLogger.logErr("----------------------------------------------------\n\n\n"); + while (true) { + if (!buffer.hasRemaining()) { + SystemLogger.logErr("[ObjectDefinition] Buffer empty for " + objectId); + break; + } + int opcode = buffer.get() & 0xFF; + //SystemLogger.logErr("Parsing object " + objectId + " op " + opcode); + if (opcode == 1 || opcode == 5) { + int length = buffer.get() & 0xff; + if (def.modelIds == null) { + def.modelIds = new int[length]; + if (opcode == 1) { + def.modelConfiguration = new int[length]; + } + for (int i = 0; i < length; i++) { + def.modelIds[i] = buffer.getShort() & 0xFFFF; + if (opcode == 1) { + def.modelConfiguration[i] = buffer.get() & 0xFF; + } + } + } else { + buffer.position(buffer.position() + (length * (opcode == 1 ? 3 : 2))); + } + } else if (opcode == 2) { + def.name = ByteBufferUtils.getString(buffer); + } else if (opcode == 14) { + def.sizeX = buffer.get() & 0xFF; + } else if (opcode == 15) { + def.sizeY = buffer.get() & 0xFF; + } else if (opcode == 17) { + def.projectileClipped = false; + def.clipType = 0; + } else if (opcode == 18) { + def.projectileClipped = false; + } else if (opcode == 19) { + def.secondInt = buffer.get() & 0xFF; + } else if (opcode == 21) { + def.aByte3912 = (byte) 1; + } else if (opcode == 22) { + def.aBoolean3867 = true; + } else if (opcode == 23) { + def.boolean1 = true; + } else if (opcode == 24) { + def.animationId = buffer.getShort() & 0xFFFF; + if (def.animationId == 65535) { + def.animationId = -1; + } + } else if (opcode == 27) { + def.clipType = 1; + } else if (opcode == 28) { + def.anInt3892 = ((buffer.get() & 0xFF) << 2); + } else if (opcode == 29) { + def.anInt3878 = buffer.get(); + } else if (opcode == 39) { + def.anInt3840 = buffer.get() * 5; + } else if (opcode >= 30 && opcode < 35) { + def.options[opcode - 30] = ByteBufferUtils.getString(buffer); + if (def.options[opcode - 30].equals("Hidden")) { + def.options[opcode - 30] = null; + def.hasHiddenOptions = true; + } + } else if (opcode == 40) { + int length = buffer.get() & 0xFF; + def.originalColors = new short[length]; + def.modifiedColors = new short[length]; + for (int i = 0; i < length; i++) { + def.originalColors[i] = buffer.getShort(); + def.modifiedColors[i] = buffer.getShort(); + } + } else if (opcode == 41) { + int length = buffer.get() & 0xFF; + def.aShortArray3920 = new short[length]; + def.aShortArray3919 = new short[length]; + for (int i = 0; i < length; i++) { + def.aShortArray3920[i] = buffer.getShort(); + def.aShortArray3919[i] = buffer.getShort(); + } + } else if (opcode == 42) { + int length = buffer.get() & 0xFF; + def.aByteArray3858 = new byte[length]; + for (int i = 0; i < length; i++) { + def.aByteArray3858[i] = buffer.get(); + } + } else if (opcode == 60) { + def.mapIcon = buffer.getShort(); + } else if (opcode == 62) { + def.aBoolean3839 = true; + } else if (opcode == 64) { + def.aBoolean3872 = false; + } else if (opcode == 65) { + def.anInt3902 = buffer.getShort() & 0xFFFF; + } else if (opcode == 66) { + def.anInt3841 = buffer.getShort() & 0xFFFF; + } else if (opcode == 67) { + def.anInt3917 = buffer.getShort() & 0xFFFF; + } else if (opcode == 68) { + buffer.getShort(); + } else if (opcode == 69) { + def.walkingFlag = buffer.get() & 0xFF; + } else if (opcode == 70) { + def.anInt3883 = buffer.getShort() << 2; + } else if (opcode == 71) { + def.anInt3889 = buffer.getShort() << 2; + } else if (opcode == 72) { + def.anInt3915 = buffer.getShort() << 2; + } else if (opcode == 73) { + def.secondBool = true; + } else if (opcode == 74) { + def.notClipped = true; + } else if (opcode == 75) { + def.anInt3855 = buffer.get() & 0xFF; + } else if (opcode == 77 || opcode == 92) { + def.configFileId = buffer.getShort() & 0xFFFF; + if (def.configFileId == 65535) { + def.configFileId = -1; + } + def.configId = buffer.getShort() & 0xFFFF; + if (def.configId == 65535) { + def.configId = -1; + } + int defaultId = -1; + if (opcode == 92) { + defaultId = buffer.getShort() & 0xFFFF; + if (defaultId == 65535) { + defaultId = -1; + } + } + int childrenAmount = buffer.get() & 0xFF; + def.childrenIds = new int[childrenAmount + 2]; + for (int index = 0; childrenAmount >= index; index++) { + def.childrenIds[index] = buffer.getShort() & 0xFFFF; + if (def.childrenIds[index] == 65535) { + def.childrenIds[index] = -1; + } + } + def.childrenIds[childrenAmount + 1] = defaultId; + } else if (opcode == 78) { + def.anInt3860 = buffer.getShort() & 0xFFFF; + def.anInt3904 = buffer.get() & 0xFF; + } else if (opcode == 79) { + def.anInt3900 = buffer.getShort() & 0xFFFF; + def.anInt3905 = buffer.getShort() & 0xFFFF; + def.anInt3904 = buffer.get() & 0xFF; + int length = buffer.get() & 0xFF; + def.anIntArray3859 = new int[length]; + for (int i = 0; i < length; i++) { + def.anIntArray3859[i] = buffer.getShort() & 0xFFFF; + } + } else if (opcode == 81) { + def.aByte3912 = (byte) 2; + def.anInt3882 = 256 * buffer.get() & 0xFF; + } else if (opcode == 82 || opcode == 88) { + // Nothing. + } else if (opcode == 89) { + def.aBoolean3895 = false; + } else if (opcode == 90) { + def.aBoolean3870 = true; + } else if (opcode == 91) { + def.membersOnly = true; + } else if (opcode == 93) { + def.aByte3912 = (byte) 3; + def.anInt3882 = buffer.getShort() & 0xFFFF; + } else if (opcode == 94) { + def.aByte3912 = (byte) 4; + } else if (opcode == 95) { + def.aByte3912 = (byte) 5; + } else if (opcode == 96 || opcode == 97) { + // + } else if (opcode == 100) { + buffer.get(); + buffer.getShort(); + } else if (opcode == 101) { + buffer.get(); + } else if (opcode == 102) { + buffer.getShort(); + } else if (opcode == 249) { // cs2 scripts + int length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + boolean string = buffer.get() == 1; + ByteBufferUtils.getTriByte(buffer); // script id + if (!string) { + buffer.getInt(); // Value + } else { + ByteBufferUtils.getString(buffer); // value + } + } + } else { + if (opcode != 0) { + SystemLogger.logErr("Unhandled object definition opcode: " + opcode); + } + break; + } + } + def.configureObject(); + if (def.notClipped) { + def.clipType = 0; + def.projectileClipped = false; + } + return def; + } + + /** + * Configures the object definitions. + */ + final void configureObject() { + if (secondInt == -1) { + secondInt = 0; + if (modelIds != null && (getModelConfiguration() == null || getModelConfiguration()[0] == 10)) { + secondInt = 1; + } + for (int i = 0; i < 5; i++) { + if (options[i] != null) { + secondInt = 1; + break; + } + } + } + if (anInt3855 == -1) { + anInt3855 = clipType == 0 ? 0 : 1; + } + // Manual changes + if (id == 31017) { + sizeX = sizeY = 2; + } + if (id == 29292) { + projectileClipped = false; + } + } + + /** + * Checks if the object is visible. + * @return {@code True} if so. + */ + public boolean hasActions() { + if (childrenIds == null) { + return hasOptions(false); + } + for (int i = 0; i < childrenIds.length; i++) { + if (childrenIds[i] != -1) { + ObjectDefinition def = forId(childrenIds[i]); + if (def.hasOptions(false)) { + return true; + } + } + } + return hasOptions(false); + } + + /** + * Gets the child object definitions. + * @param player The player to get it for. + * @return The object definition. + */ + public ObjectDefinition getChildObject(Player player) { + if (childrenIds == null || childrenIds.length < 1) { + return this; + } + int configValue = -1; + if (player != null) { + if (configFileId != -1) { + VarbitDefinition def = VarbitDefinition.forObjectID(configFileId); + if (def != null) { + configValue = def.getValue(player); + } + } else if (configId != -1) { + configValue = player.getConfigManager().get(configId); + } + } else { + configValue = 0; + } + if (configValue < 0 || configValue >= childrenIds.length - 1 || childrenIds[configValue] == -1) { + int objectId = childrenIds[childrenIds.length - 1]; + if (objectId != -1) { + return forId(objectId); + } + return this; + } + forId(childrenIds[configValue]).configFileId = this.configFileId; + return forId(childrenIds[configValue]); + } + + /** + * Gets the config file definition. + * @return The config file definition. + */ + public VarbitDefinition getConfigFile() { + if (configFileId != -1) { + return VarbitDefinition.forObjectID(configFileId); + } + return null; + } + + /** + * Get the aBoolean3839. + * @return the aBoolean3839 + */ + public boolean isaBoolean3839() { + return aBoolean3839; + } + + /** + * @param aBoolean3839 the aBoolean3839 to set + */ + public void setaBoolean3839(boolean aBoolean3839) { + this.aBoolean3839 = aBoolean3839; + } + + /** + * Get the originalColors. + * @return the originalColors + */ + public short[] getOriginalColors() { + return originalColors; + } + + /** + * Get the childrenIds. + * @return the childrenIds + */ + public int[] getChildrenIds() { + return childrenIds; + } + + /** + * Get the anInt3832. + * @return the anInt3832 + */ + public static int getAnInt3832() { + return anInt3832; + } + + /** + * Get the anIntArray3833. + * @return the anIntArray3833 + */ + public int[] getAnIntArray3833() { + return anIntArray3833; + } + + /** + * Get the anInt3834. + * @return the anInt3834 + */ + public int getAnInt3834() { + return anInt3834; + } + + /** + * Get the anInt3835. + * @return the anInt3835 + */ + public int getAnInt3835() { + return anInt3835; + } + + /** + * Get the anInt3836. + * @return the anInt3836 + */ + public static int getAnInt3836() { + return anInt3836; + } + + /** + * Get the aByte3837. + * @return the aByte3837 + */ + public byte getaByte3837() { + return aByte3837; + } + + /** + * Get the anInt3838. + * @return the anInt3838 + */ + public int getAnInt3838() { + return anInt3838; + } + + /** + * Get the anInt3840. + * @return the anInt3840 + */ + public int getAnInt3840() { + return anInt3840; + } + + /** + * Get the anInt3841. + * @return the anInt3841 + */ + public int getAnInt3841() { + return anInt3841; + } + + /** + * Get the anInt3842. + * @return the anInt3842 + */ + public static int getAnInt3842() { + return anInt3842; + } + + /** + * Get the anInt3843. + * @return the anInt3843 + */ + public static int getAnInt3843() { + return anInt3843; + } + + /** + * Get the anInt3844. + * @return the anInt3844 + */ + public int getAnInt3844() { + return anInt3844; + } + + /** + * Get the aBoolean3845. + * @return the aBoolean3845 + */ + public boolean isaBoolean3845() { + return aBoolean3845; + } + + /** + * Get the anInt3846. + * @return the anInt3846 + */ + public static int getAnInt3846() { + return anInt3846; + } + + /** + * Get the aByte3847. + * @return the aByte3847 + */ + public byte getaByte3847() { + return aByte3847; + } + + /** + * Get the aByte3849. + * @return the aByte3849 + */ + public byte getaByte3849() { + return aByte3849; + } + + /** + * Get the anInt3850. + * @return the anInt3850 + */ + public int getAnInt3850() { + return anInt3850; + } + + /** + * Get the anInt3851. + * @return the anInt3851 + */ + public int getAnInt3851() { + return anInt3851; + } + + /** + * Get the secondBool. + * @return the secondBool + */ + public boolean isSecondBool() { + return secondBool; + } + + /** + * Get the aBoolean3853. + * @return the aBoolean3853 + */ + public boolean isaBoolean3853() { + return aBoolean3853; + } + + /** + * Get the anInt3855. + * @return the anInt3855 + */ + public int getAnInt3855() { + return anInt3855; + } + + /** + * Get the firstBool. + * @return the firstBool + */ + public boolean isFirstBool() { + return notClipped; + } + + /** + * Get the anInt3857. + * @return the anInt3857 + */ + public int getAnInt3857() { + return anInt3857; + } + + /** + * Get the aByteArray3858. + * @return the aByteArray3858 + */ + public byte[] getaByteArray3858() { + return aByteArray3858; + } + + /** + * Get the anIntArray3859. + * @return the anIntArray3859 + */ + public int[] getAnIntArray3859() { + return anIntArray3859; + } + + /** + * Get the anInt3860. + * @return the anInt3860 + */ + public int getAnInt3860() { + return anInt3860; + } + + /** + * Get the options. + * @return the options + */ + @Override + public String[] getOptions() { + return options; + } + + /** + * Get the configFileId. + * @return the configFileId + */ + public int getVarbitID() { + return configFileId; + } + + /** + * Get the modifiedColors. + * @return the modifiedColors + */ + public short[] getModifiedColors() { + return modifiedColors; + } + + /** + * Get the anInt3865. + * @return the anInt3865 + */ + public int getAnInt3865() { + return anInt3865; + } + + /** + * Get the aBoolean3866. + * @return the aBoolean3866 + */ + public boolean isaBoolean3866() { + return aBoolean3866; + } + + /** + * Get the aBoolean3867. + * @return the aBoolean3867 + */ + public boolean isaBoolean3867() { + return aBoolean3867; + } + + /** + * Get the solid. + * @return the solid + */ + public boolean isProjectileClipped() { + return projectileClipped; + } + + /** + * Get the anIntArray3869. + * @return the anIntArray3869 + */ + public int[] getAnIntArray3869() { + return anIntArray3869; + } + + /** + * Get the aBoolean3870. + * @return the aBoolean3870 + */ + public boolean isaBoolean3870() { + return aBoolean3870; + } + + /** + * Get the sizeY. + * @return the sizeY + */ + public int getSizeY() { + return sizeY; + } + + /** + * Get the aBoolean3872. + * @return the aBoolean3872 + */ + public boolean isaBoolean3872() { + return aBoolean3872; + } + + /** + * Get the membersOnly. + * @return the membersOnly + */ + public boolean isaBoolean3873() { + return membersOnly; + } + + /** + * Get the thirdInt. + * @return the thirdInt + */ + public boolean getThirdBoolean() { + return boolean1; + } + + /** + * Get the anInt3875. + * @return the anInt3875 + */ + public int getAnInt3875() { + return anInt3875; + } + + /** + * Get the addObjectCheck. + * @return the addObjectCheck + */ + public int getAddObjectCheck() { + return animationId; + } + + /** + * Get the anInt3877. + * @return the anInt3877 + */ + public int getAnInt3877() { + return anInt3877; + } + + /** + * Get the anInt3878. + * @return the anInt3878 + */ + public int getAnInt3878() { + return anInt3878; + } + + /** + * Get the clipType. + * @return the clipType + */ + public int getClipType() { + return clipType; + } + + /** + * Get the anInt3881. + * @return the anInt3881 + */ + public int getAnInt3881() { + return anInt3881; + } + + /** + * Get the anInt3882. + * @return the anInt3882 + */ + public int getAnInt3882() { + return anInt3882; + } + + /** + * Get the anInt3883. + * @return the anInt3883 + */ + public int getAnInt3883() { + return anInt3883; + } + + /** + * Get the loader. + * @return the loader + */ + public Object getLoader() { + return loader; + } + + /** + * Get the anInt3889. + * @return the anInt3889 + */ + public int getAnInt3889() { + return anInt3889; + } + + /** + * Get the sizeX. + * @return the sizeX + */ + public int getSizeX() { + return sizeX; + } + + /** + * Get the aBoolean3891. + * @return the aBoolean3891 + */ + public boolean isaBoolean3891() { + return aBoolean3891; + } + + /** + * Get the anInt3892. + * @return the anInt3892 + */ + public int getAnInt3892() { + return anInt3892; + } + + /** + * Get the secondInt. + * @return the secondInt + */ + public int getSecondInt() { + return secondInt; + } + + /** + * Get the aBoolean3894. + * @return the aBoolean3894 + */ + public boolean isaBoolean3894() { + return aBoolean3894; + } + + /** + * Get the aBoolean3895. + * @return the aBoolean3895 + */ + public boolean isaBoolean3895() { + return aBoolean3895; + } + + /** + * Get the anInt3896. + * @return the anInt3896 + */ + public int getAnInt3896() { + return anInt3896; + } + + /** + * Get the configId. + * @return the configId + */ + public int getConfigId() { + return configId; + } + + /** + * Get the aByteArray3899. + * @return the aByteArray3899 + */ + public byte[] getaByteArray3899() { + return aByteArray3899; + } + + /** + * Get the anInt3900. + * @return the anInt3900 + */ + public int getAnInt3900() { + return anInt3900; + } + + /** + * Get the name. + * @return the name + */ + @Override + public String getName() { + return name; + } + + /** + * Get the anInt3902. + * @return the anInt3902 + */ + public int getAnInt3902() { + return anInt3902; + } + + /** + * Get the anInt3904. + * @return the anInt3904 + */ + public int getAnInt3904() { + return anInt3904; + } + + /** + * Get the anInt3905. + * @return the anInt3905 + */ + public int getAnInt3905() { + return anInt3905; + } + + /** + * Get the aBoolean3906. + * @return the aBoolean3906 + */ + public boolean isaBoolean3906() { + return aBoolean3906; + } + + /** + * Get the anIntArray3908. + * @return the anIntArray3908 + */ + public int[] getAnIntArray3908() { + return anIntArray3908; + } + + /** + * Get the aByte3912. + * @return the aByte3912 + */ + public byte getaByte3912() { + return aByte3912; + } + + /** + * Get the anInt3913. + * @return the anInt3913 + */ + public int getAnInt3913() { + return anInt3913; + } + + /** + * Get the aByte3914. + * @return the aByte3914 + */ + public byte getaByte3914() { + return aByte3914; + } + + /** + * Get the anInt3915. + * @return the anInt3915 + */ + public int getAnInt3915() { + return anInt3915; + } + + /** + * Get the anIntArrayArray3916. + * @return the anIntArrayArray3916 + */ + public int[][] getAnIntArrayArray3916() { + return anIntArrayArray3916; + } + + /** + * Get the anInt3917. + * @return the anInt3917 + */ + public int getAnInt3917() { + return anInt3917; + } + + /** + * Get the aShortArray3919. + * @return the aShortArray3919 + */ + public short[] getaShortArray3919() { + return aShortArray3919; + } + + /** + * Get the aShortArray3920. + * @return the aShortArray3920 + */ + public short[] getaShortArray3920() { + return aShortArray3920; + } + + /** + * Get the anInt3921. + * @return the anInt3921 + */ + public int getAnInt3921() { + return anInt3921; + } + + /** + * Get the aClass194_3922. + * @return the aClass194_3922 + */ + public Object getaClass194_3922() { + return aClass194_3922; + } + + /** + * Get the aBoolean3923. + * @return the aBoolean3923 + */ + public boolean isaBoolean3923() { + return aBoolean3923; + } + + /** + * Get the aBoolean3924. + * @return the aBoolean3924 + */ + public boolean isaBoolean3924() { + return aBoolean3924; + } + + /** + * Gets the object's model ids. + * @return The model ids array. + */ + public int[] getModelIds() { + return modelIds; + } + + /** + * If the object has a reward. + * @param action The specified reward. + * @return If the object has the reward {@code true}. + */ + public boolean hasAction(String action) { + if (options == null) { + return false; + } + for (String option : options) { + if (option == null) { + continue; + } + if (option.equalsIgnoreCase(action)) { + return true; + } + } + return false; + } + + /** + * Get the definitions. + * @return the definitions + */ + public static Map getDefinitions() { + return DEFINITIONS; + } + + /** + * Gets the option handler for the given option name. + * @param nodeId The node id. + * @param name The name. + * @return The option handler, or {@code null} if there was no default + * option handler. + */ + public static OptionHandler getOptionHandler(int nodeId, String name) { + ObjectDefinition def = forId(nodeId); + OptionHandler handler = def.getConfiguration("option:" + name); + if (handler != null) { + return handler; + } + return OPTION_HANDLERS.get(name); + } + + /** + * Sets the default option handler for an option. + * @param name The option name. + * @param handler The default option handler. + * @return {@code True} if there was a previous default handler mapped. + */ + public static boolean setOptionHandler(String name, OptionHandler handler) { + return OPTION_HANDLERS.put(name, handler) != null; + } + + /** + * Gets the hasHiddenOptions. + * @return The hasHiddenOptions. + */ + public boolean isHasHiddenOptions() { + return hasHiddenOptions; + } + + /** + * Sets the hasHiddenOptions. + * @param hasHiddenOptions The hasHiddenOptions to set. + */ + public void setHasHiddenOptions(boolean hasHiddenOptions) { + this.hasHiddenOptions = hasHiddenOptions; + } + + /** + * Gets the walking flag. + * @return The walking flag. + */ + public int getWalkingFlag() { + return walkingFlag; + } + + /** + * Gets the modelConfiguration. + * @return The modelConfiguration. + */ + public int[] getModelConfiguration() { + return modelConfiguration; + } + + /** + * Sets the modelConfiguration. + * @param modelConfiguration The modelConfiguration to set. + */ + public void setModelConfiguration(int[] modelConfiguration) { + this.modelConfiguration = modelConfiguration; + } + + /** + * Gets the mapIcon. + * @return The mapIcon. + */ + public short getMapIcon() { + return mapIcon; + } + + /** + * Get the container id. + * @param id The object id. + * @return The container id. + */ + public static int getContainerId(int id) { + return id >>> 1998118472; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/impl/RenderAnimationDefinition.java b/Server/src/main/java/Server/core/cache/def/impl/RenderAnimationDefinition.java new file mode 100644 index 000000000..9c830461b --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/RenderAnimationDefinition.java @@ -0,0 +1,329 @@ +package core.cache.def.impl; + +import core.cache.Cache; +import core.game.system.SystemLogger; +import core.game.world.GameWorld; + +import java.lang.reflect.Array; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.nio.ByteBuffer; + +/** + * Holds definitions for render animations. + * @author Jagex + * @author Emperor + * + */ +public class RenderAnimationDefinition { + + public int turn180Animation; + public int anInt951 = -1; + public int anInt952; + public int turnCWAnimation = -1; + public int anInt954; + public int anInt955; + public int anInt956; + public int anInt957; + public int anInt958; + public int[] anIntArray959 = null; + public int anInt960; + public int anInt961 = 0; + public int anInt962; + public int walkAnimationId; + public int anInt964; + public int anInt965; + public int anInt966; + public int[] standAnimationIds; + public int anInt969; + public int[] anIntArray971; + public int standAnimationId; + public int anInt973; + public int anInt974; + public int anInt975; + public int runAnimationId; + public int anInt977; + public boolean aBoolean978; + public int[][] anIntArrayArray979; + public int anInt980; + public int turnCCWAnimation; + public int anInt983; + public int anInt985; + public int anInt986; + public int anInt987; + public int anInt988; + public int anInt989; + public int anInt990; + public int anInt992; + public int anInt993; + public int anInt994; + + /** + * Gets the render animation definitions for the given id. + * @param animId The render animation id. + * @return The render animation definitions. + */ + public static RenderAnimationDefinition forId(int animId) { + RenderAnimationDefinition defs = new RenderAnimationDefinition(); + if (animId == -1) { + return null; + } + byte[] data = Cache.getIndexes()[2].getFileData(32, animId); + defs = new RenderAnimationDefinition(); + if (data != null) { + defs.parse(ByteBuffer.wrap(data)); + } else { + SystemLogger.logErr("No definitions found for render animation " + animId + ", size=" + Cache.getIndexes()[2].getFilesSize(32) + "!"); + } + return defs; + } + + private void parse(ByteBuffer buffer) { + for (;;) { + int opcode = buffer.get() & 0xFF; + if (opcode == 0) { + break; + } + parseOpcode(buffer, opcode); + } + } + + private void parseOpcode(ByteBuffer buffer, int opcode) { + if (opcode == 54) { + @SuppressWarnings("unused") + int anInt1260 = (buffer.get() & 0xFF) << 6; + @SuppressWarnings("unused") + int anInt1227 = (buffer.get() & 0xFF) << 6; + } else if (opcode == 55) { + int[] anIntArray1246 = new int[12]; + int i_14_ = buffer.get() & 0xFF; + anIntArray1246[i_14_] = buffer.getShort() & 0xFFFF; + } else if (opcode == 56) { + int[][] anIntArrayArray1217 = new int[12][]; + int i_12_ = buffer.get() & 0xFF; + anIntArrayArray1217[i_12_] = new int[3]; + for (int i_13_ = 0; i_13_ < 3; i_13_++) + anIntArrayArray1217[i_12_][i_13_] = buffer.getShort(); + } else if ((opcode ^ 0xffffffff) != -2) { + if ((opcode ^ 0xffffffff) != -3) { + if (opcode != 3) { + if ((opcode ^ 0xffffffff) != -5) { + if (opcode == 5) + anInt977 = buffer.getShort() & 0xFFFF; + else if ((opcode ^ 0xffffffff) != -7) { + if (opcode == 7) + anInt960 = buffer.getShort() & 0xFFFF; + else if ((opcode ^ 0xffffffff) == -9) + anInt985 = buffer.getShort() & 0xFFFF; + else if (opcode == 9) + anInt957 = buffer.getShort() & 0xFFFF; + else if (opcode == 26) { + anInt973 = (short) (4 * buffer + .get() & 0xFF); + anInt975 = (short) (buffer.get() & 0xFF * 4); + } else if ((opcode ^ 0xffffffff) == -28) { + if (anIntArrayArray979 == null) + anIntArrayArray979 = new int[12][]; + int i = buffer.get() & 0xFF; + anIntArrayArray979[i] = new int[6]; + for (int i_1_ = 0; (i_1_ ^ 0xffffffff) > -7; i_1_++) + anIntArrayArray979[i][i_1_] = buffer + .getShort(); + } else if ((opcode ^ 0xffffffff) == -29) { + anIntArray971 = new int[12]; + for (int i = 0; i < 12; i++) { + anIntArray971[i] = buffer + .get() & 0xFF; + if (anIntArray971[i] == 255) + anIntArray971[i] = -1; + } + } else if (opcode != 29) { + if (opcode != 30) { + if ((opcode ^ 0xffffffff) != -32) { + if (opcode != 32) { + if ((opcode ^ 0xffffffff) != -34) { + if (opcode != 34) { + if (opcode != 35) { + if ((opcode ^ 0xffffffff) != -37) { + if ((opcode ^ 0xffffffff) != -38) { + if (opcode != 38) { + if ((opcode ^ 0xffffffff) != -40) { + if ((opcode ^ 0xffffffff) != -41) { + if ((opcode ^ 0xffffffff) == -42) + turnCWAnimation = buffer + .getShort() & 0xFFFF; + else if (opcode != 42) { + if ((opcode ^ 0xffffffff) == -44) + buffer.getShort(); + else if ((opcode ^ 0xffffffff) != -45) { + if ((opcode ^ 0xffffffff) == -46) + anInt964 = buffer + .getShort() & 0xFFFF; + else if ((opcode ^ 0xffffffff) != -47) { + if (opcode == 47) + anInt966 = buffer + .getShort() & 0xFFFF; + else if (opcode == 48) + anInt989 = buffer + .getShort() & 0xFFFF; + else if (opcode != 49) { + if ((opcode ^ 0xffffffff) != -51) { + if (opcode != 51) { + if (opcode == 52) { + int i = buffer + .get() & 0xFF; + anIntArray959 = new int[i]; + standAnimationIds = new int[i]; + for (int i_2_ = 0; i_2_ < i; i_2_++) { + standAnimationIds[i_2_] = buffer + .getShort() & 0xFFFF; + int i_3_ = buffer + .get() & 0xFF; + anIntArray959[i_2_] = i_3_; + anInt994 += i_3_; + } + } else if (opcode == 53) + aBoolean978 = false; + } else + anInt962 = buffer + .getShort() & 0xFFFF; + } else + anInt990 = buffer + .getShort() & 0xFFFF; + } else + anInt952 = buffer + .getShort() & 0xFFFF; + } else + anInt983 = buffer + .getShort() & 0xFFFF; + } else + anInt955 = buffer + .getShort() & 0xFFFF; + } else + turnCCWAnimation = buffer + .getShort() & 0xFFFF; + } else + turn180Animation = buffer + .getShort() & 0xFFFF; + } else + anInt954 = buffer + .getShort() & 0xFFFF; + } else + anInt958 = (buffer + .getShort() & 0xFFFF); + } else + anInt951 = (buffer + .get() & 0xFF); + } else + anInt965 = (buffer + .getShort()); + } else + anInt969 = (buffer + .getShort() & 0xFFFF); + } else + anInt993 = buffer + .get() & 0xFF; + } else + anInt956 = (buffer.getShort()); + } else + anInt961 = buffer + .getShort() & 0xFFFF; + } else + anInt988 = buffer.get() & 0xFF; + } else + anInt980 = buffer.getShort() & 0xFFFF; + } else + anInt992 = buffer.get() & 0xFF; + } else + runAnimationId = buffer.getShort() & 0xFFFF; + } else + anInt986 = buffer.getShort() & 0xFFFF; + } else + anInt987 = buffer.getShort() & 0xFFFF; + } else + anInt974 = buffer.getShort() & 0xFFFF; + } else { + standAnimationId = buffer.getShort() & 0xFFFF; + walkAnimationId = buffer.getShort() & 0xFFFF; + if ((standAnimationId ^ 0xffffffff) == -65536) + standAnimationId = -1; + if ((walkAnimationId ^ 0xffffffff) == -65536) + walkAnimationId = -1; + } + } + + public RenderAnimationDefinition() { + anInt957 = -1; + anInt954 = -1; + anInt960 = -1; + anInt958 = -1; + anInt965 = 0; + anInt973 = 0; + turn180Animation = -1; + anInt956 = 0; + standAnimationId = -1; + standAnimationIds = null; + anInt952 = -1; + anInt983 = -1; + anInt985 = -1; + anInt962 = -1; + anInt966 = -1; + anInt977 = -1; + anInt975 = 0; + runAnimationId = -1; + anInt988 = 0; + turnCCWAnimation = -1; + anInt987 = -1; + anInt980 = 0; + anInt964 = -1; + walkAnimationId = -1; + anInt986 = -1; + aBoolean978 = true; + anInt992 = 0; + anInt955 = -1; + anInt989 = -1; + anInt974 = -1; + anInt969 = 0; + anInt994 = 0; + anInt990 = -1; + anInt993 = 0; + } + + public static void main(String...args) throws Throwable { + GameWorld.prompt(false); + RenderAnimationDefinition def = RenderAnimationDefinition.forId(1426); + System.out.println("size: " + def.getClass().getDeclaredFields().length); + for (Field f : def.getClass().getDeclaredFields()) { + if (!Modifier.isStatic(f.getModifiers())) { + if (f.getType().isArray()) { + Object object = f.get(def); + if (object != null) { + int length = Array.getLength(object); + System.out.print(f.getName() + ", ["); + for (int i = 0; i < length; i++) { + System.out.print(Array.get(object, i) + (i < (length - 1) ? ", " : "]")); + } + continue; + } + } + System.out.println(f.getName() + ", " + f.get(def)); + } + } + for (Field f : def.getClass().getSuperclass().getDeclaredFields()) { + if (!Modifier.isStatic(f.getModifiers())) { + if (f.getType().isArray()) { + Object object = f.get(def); + if (object != null) { + int length = Array.getLength(object); + System.out.print(f.getName() + ", ["); + for (int i = 0; i < length; i++) { + System.out.print(Array.get(object, i) + (i < (length - 1) ? ", " : "]")); + } + continue; + } + } + System.out.println(f.getName() + ", " + f.get(def)); + } + } + } +} diff --git a/Server/src/main/java/Server/core/cache/def/impl/VarbitDefinition.java b/Server/src/main/java/Server/core/cache/def/impl/VarbitDefinition.java new file mode 100644 index 000000000..f17c00d3a --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/VarbitDefinition.java @@ -0,0 +1,176 @@ +package core.cache.def.impl; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +import core.cache.Cache; +import core.game.Varbit; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.world.GameWorld; + +/** + * Handles config definition reading. + * @author Emperor + */ +public final class VarbitDefinition { + + /** + * The config definitions mapping. + */ + private static final Map MAPPING = new HashMap<>(); + + /** + * The bit size flags. + */ + private static final int[] BITS = new int[32]; + + /** + * The file id. + */ + private final int id; + + /** + * The config id. + */ + private int configId; + + /** + * The bit shift amount. + */ + private int bitShift; + + /** + * The bit amount. + */ + private int bitSize; + + /** + * Constructs a new {@code ConfigFileDefinition} {@code Object}. + * @param id The file id. + */ + public VarbitDefinition(int id) { + this.id = id; + } + + /** + * Initializes the bit flags. + */ + static { + int flag = 2; + for (int i = 0; i < 32; i++) { + BITS[i] = flag - 1; + flag += flag; + } + } + + /** + * Gets the config file definitions for the given file id. + * @param id The file id. + * @return The definition. + */ + public static VarbitDefinition forObjectID(int id) { + return forId(id,10); + } + + public static VarbitDefinition forNPCID(int id){ + return forId(id,10); + } + + public static VarbitDefinition forItemID(int id){ + return forId(id,30); + } + + public static VarbitDefinition forId(int id, int shiftAmount){ + /*VarbitDefinition def = MAPPING.get(id); + if (def != null) { + return def; + }*/ + VarbitDefinition def; + def = new VarbitDefinition(id); + byte[] bs = Cache.getIndexes()[22].getFileData(id >>> 10, id & 0x3ff); + if (bs != null) { + ByteBuffer buffer = ByteBuffer.wrap(bs); + int opcode = 0; + while ((opcode = buffer.get() & 0xFF) != 0) { + if (opcode == 1) { + def.configId = buffer.getShort() & 0xFFFF; + def.bitShift = buffer.get() & 0xFF; + def.bitSize = buffer.get() & 0xFF; + } + } + } + MAPPING.put(id, def); + return def; + } + + public static void main(String... args) throws Throwable { + GameWorld.prompt(false); + for (int i = 0; i < 15000; i++) { + VarbitDefinition def = forObjectID(i); + if (def != null && def.configId == 33) { + System.out.println("Config file [id=" + i + ", shift=" + def.bitShift + "]!"); + } + } + } + + /** + * Gets the current config value for this file. + * @param player The player. + * @return The config value. + */ + public int getValue(Player player) { + int size = BITS[bitSize - bitShift]; + int bitValue = player.varpManager.get(getConfigId()).getBitRangeValue(getBitShift(), getBitShift() + (bitSize - bitShift) + 1); + if(bitValue != 0){ + return bitValue >>> bitShift; + } + return size & (player.getConfigManager().get(configId) >>> bitShift); + } + + /** + * Gets the mapping. + * @return The mapping. + */ + public static Map getMapping() { + return MAPPING; + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } + + /** + * Gets the configId. + * @return The configId. + */ + public int getConfigId() { + return configId; + } + + /** + * Gets the bitShift. + * @return The bitShift. + */ + public int getBitShift() { + return bitShift; + } + + /** + * Gets the bitSize. + * @return The bitSize. + */ + public int getBitSize() { + return bitSize; + } + + @Override + public String toString() { + return "ConfigFileDefinition [id=" + id + ", configId=" + configId + ", bitShift=" + bitShift + ", bitSize=" + bitSize + "]"; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/def/impl/test.txt b/Server/src/main/java/Server/core/cache/def/impl/test.txt new file mode 100644 index 000000000..2cd6e87a9 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/def/impl/test.txt @@ -0,0 +1,365 @@ +private void readValues(int i, InputStream stream, int opcode) { + if (opcode != 1 && opcode != 5) { + if (opcode != 2) { + if (opcode != 14) { + if (opcode != 15) { + if (opcode == 17) { + projectileCliped = false; + clipType = 0; + } else if (opcode != 18) { + if (opcode == 19) + secondInt = stream.readUnsignedByte(); + else if (opcode == 21) + aByte3912 = (byte) 1; + else if (opcode != 22) { + if (opcode != 23) { + if (opcode != 24) { + if (opcode == 27) + clipType = 1; + else if (opcode == 28) + anInt3892 = (stream + .readUnsignedByte() << 2); + else if (opcode != 29) { + if (opcode != 39) { + if (opcode < 30 || opcode >= 35) { + if (opcode == 40) { + int i_53_ = (stream + .readUnsignedByte()); + originalColors = new short[i_53_]; + modifiedColors = new short[i_53_]; + for (int i_54_ = 0; i_53_ > i_54_; i_54_++) { + originalColors[i_54_] = (short) (stream + .readUnsignedShort()); + modifiedColors[i_54_] = (short) (stream + .readUnsignedShort()); + } + } else if (opcode != 41) { + if (opcode != 42) { + if (opcode != 62) { + if (opcode != 64) { + if (opcode == 65) + anInt3902 = stream + .readUnsignedShort(); + else if (opcode != 66) { + if (opcode != 67) { + if (opcode == 69) + anInt3925 = stream + .readUnsignedByte(); + else if (opcode != 70) { + if (opcode == 71) + anInt3889 = stream + .readShort() << 2; + else if (opcode != 72) { + if (opcode == 73) + secondBool = true; + else if (opcode == 74) + notCliped = true; + else if (opcode != 75) { + if (opcode != 77 + && opcode != 92) { + if (opcode == 78) { + anInt3860 = stream + .readUnsignedShort(); + anInt3904 = stream + .readUnsignedByte(); + } else if (opcode != 79) { + if (opcode == 81) { + aByte3912 = (byte) 2; + anInt3882 = 256 * stream + .readUnsignedByte(); + } else if (opcode != 82) { + if (opcode == 88) + aBoolean3853 = false; + else if (opcode != 89) { + if (opcode == 90) + aBoolean3870 = true; + else if (opcode != 91) { + if (opcode != 93) { + if (opcode == 94) + aByte3912 = (byte) 4; + else if (opcode != 95) { + if (opcode != 96) { + if (opcode == 97) + aBoolean3866 = true; + else if (opcode == 98) + aBoolean3923 = true; + else if (opcode == 99) { + anInt3857 = stream + .readUnsignedByte(); + anInt3835 = stream + .readUnsignedShort(); + } else if (opcode == 100) { + anInt3844 = stream + .readUnsignedByte(); + anInt3913 = stream + .readUnsignedShort(); + } else if (opcode != 101) { + if (opcode == 102) + anInt3838 = stream + .readUnsignedShort(); + else if (opcode == 103) + thirdInt = 0; + else if (opcode != 104) { + if (opcode == 105) + aBoolean3906 = true; + else if (opcode == 106) { + int i_55_ = stream + .readUnsignedByte(); + anIntArray3869 = new int[i_55_]; + anIntArray3833 = new int[i_55_]; + for (int i_56_ = 0; i_56_ < i_55_; i_56_++) { + anIntArray3833[i_56_] = stream + .readUnsignedShort(); + int i_57_ = stream + .readUnsignedByte(); + anIntArray3869[i_56_] = i_57_; + anInt3881 += i_57_; + } + } else if (opcode == 107) + anInt3851 = stream + .readUnsignedShort(); + else if (opcode >= 150 + && opcode < 155) { + options[opcode + + -150] = stream + .readString(); + /*if (!loader.showOptions) + options[opcode + -150] = null;*/ + } else if (opcode != 160) { + if (opcode == 162) { + aByte3912 = (byte) 3; + anInt3882 = stream + .readInt(); + } else if (opcode == 163) { + aByte3847 = (byte) stream + .readByte(); + aByte3849 = (byte) stream + .readByte(); + aByte3837 = (byte) stream + .readByte(); + aByte3914 = (byte) stream + .readByte(); + } else if (opcode != 164) { + if (opcode != 165) { + if (opcode != 166) { + if (opcode == 167) + anInt3921 = stream + .readUnsignedShort(); + else if (opcode != 168) { + if (opcode == 169) { + aBoolean3845 = true; + //added opcode + }else if (opcode == 170) { + int anInt3383 = stream.readUnsignedSmart(); + //added opcode + }else if (opcode == 171) { + int anInt3362 = stream.readUnsignedSmart(); + //added opcode + }else if (opcode == 173) { + int anInt3302 = stream.readUnsignedShort(); + int anInt3336 = stream.readUnsignedShort(); + //added opcode + }else if (opcode == 177) { + boolean ub = true; + //added opcode + }else if (opcode == 178) { + int db = stream.readUnsignedByte(); + } else if (opcode == 249) { + int i_58_ = stream + .readUnsignedByte(); + if (aClass194_3922 == null) { + /*int i_59_ = Class307 + .method3331( + (byte) -117, + i_58_); + aClass194_3922 = new HashTable( + i_59_);*/ + } + for (int i_60_ = 0; i_60_ < i_58_; i_60_++) { + boolean bool = stream + .readUnsignedByte() == 1; + int i_61_ = stream.read24BitInt(); + Object class279; + if (!bool) + /*class279 = new IntegerNode(*/ + stream + .readInt();//); + else + /*class279 = new Class279_Sub4(*/ + stream + .readString();//); + /*aClass194_3922 + .method1598( + (long) i_61_, + -125, + class279);*/ + } + } + } else + aBoolean3894 = true; + } else + anInt3877 = stream + .readShort(); + } else + anInt3875 = stream + .readShort(); + } else + anInt3834 = stream + .readShort(); + } else { + int i_62_ = stream + .readUnsignedByte(); + anIntArray3908 = new int[i_62_]; + for (int i_63_ = 0; i_62_ > i_63_; i_63_++) + anIntArray3908[i_63_] = stream + .readUnsignedShort(); + } + } else + anInt3865 = stream + .readUnsignedByte(); + } else + anInt3850 = stream + .readUnsignedByte(); + } else + aBoolean3924 = true; + } else { + aByte3912 = (byte) 5; + anInt3882 = stream + .readShort(); + } + } else { + aByte3912 = (byte) 3; + anInt3882 = stream + .readUnsignedShort(); + } + } else + aBoolean3873 = true; + } else + aBoolean3895 = false; + } else + aBoolean3891 = true; + } else { + anInt3900 = stream + .readUnsignedShort(); + anInt3905 = stream + .readUnsignedShort(); + anInt3904 = stream + .readUnsignedByte(); + int i_64_ = stream + .readUnsignedByte(); + anIntArray3859 = new int[i_64_]; + for (int i_65_ = 0; i_65_ < i_64_; i_65_++) + anIntArray3859[i_65_] = stream + .readUnsignedShort(); + } + } else { + configFileId = stream + .readUnsignedShort(); + if (configFileId == 65535) + configFileId = -1; + configId = stream + .readUnsignedShort(); + if (configId == 65535) + configId = -1; + int i_66_ = -1; + if (opcode == 92) { + i_66_ = stream + .readUnsignedShort(); + if (i_66_ == 65535) + i_66_ = -1; + } + int i_67_ = stream + .readUnsignedByte(); + childrenIds = new int[i_67_ + - -2]; + for (int i_68_ = 0; i_67_ >= i_68_; i_68_++) { + childrenIds[i_68_] = stream + .readUnsignedShort(); + if (childrenIds[i_68_] == 65535) + childrenIds[i_68_] = -1; + } + childrenIds[i_67_ + 1] = i_66_; + } + } else + anInt3855 = stream + .readUnsignedByte(); + } else + anInt3915 = stream + .readShort() << 2; + } else + anInt3883 = stream + .readShort() << 2; + } else + anInt3917 = stream + .readUnsignedShort(); + } else + anInt3841 = stream + .readUnsignedShort(); + } else + aBoolean3872 = false; + } else + aBoolean3839 = true; + } else { + int i_69_ = (stream + .readUnsignedByte()); + aByteArray3858 = (new byte[i_69_]); + for (int i_70_ = 0; i_70_ < i_69_; i_70_++) + aByteArray3858[i_70_] = (byte) (stream + .readByte()); + } + } else { + int i_71_ = (stream + .readUnsignedByte()); + aShortArray3920 = new short[i_71_]; + aShortArray3919 = new short[i_71_]; + for (int i_72_ = 0; i_71_ > i_72_; i_72_++) { + aShortArray3920[i_72_] = (short) (stream + .readUnsignedShort()); + aShortArray3919[i_72_] = (short) (stream + .readUnsignedShort()); + } + } + } else + options[-30 + + opcode] = (stream + .readString()); + } else + anInt3840 = (stream.readByte() * 5); + } else + anInt3878 = stream.readByte(); + } else { + anInt3876 = stream.readUnsignedShort(); + if (anInt3876 == 65535) + anInt3876 = -1; + } + } else + thirdInt = 1; + } else + aBoolean3867 = true; + } else + projectileCliped = false; + } else + sizeY = stream.readUnsignedByte(); + } else + sizeX = stream.readUnsignedByte(); + } else + name = stream.readString(); + } else { + boolean aBoolean1162 = false; + if (opcode == 5 && aBoolean1162) + method3297(stream); + int i_73_ = stream.readUnsignedByte(); + anIntArrayArray3916 = new int[i_73_][]; + aByteArray3899 = new byte[i_73_]; + for (int i_74_ = 0; i_74_ < i_73_; i_74_++) { + aByteArray3899[i_74_] = (byte) stream.readByte(); + int i_75_ = stream.readUnsignedByte(); + anIntArrayArray3916[i_74_] = new int[i_75_]; + for (int i_76_ = 0; i_75_ > i_76_; i_76_++) + anIntArrayArray3916[i_74_][i_76_] = stream + .readUnsignedShort(); + } + if (opcode == 5 && !aBoolean1162) + method3297(stream); + } + } \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/gzip/GZipDecompressor.java b/Server/src/main/java/Server/core/cache/gzip/GZipDecompressor.java new file mode 100644 index 000000000..021751497 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/gzip/GZipDecompressor.java @@ -0,0 +1,47 @@ +package core.cache.gzip; + +import java.nio.ByteBuffer; +import java.util.zip.Inflater; + +public class GZipDecompressor { + + private static final Inflater inflaterInstance = new Inflater(true); + + public static final void decompress(ByteBuffer buffer, byte data[]) { + synchronized (inflaterInstance) { + if (~buffer.get(buffer.position()) != -32 || buffer.get(buffer.position() + 1) != -117) { + data = null; + // throw new RuntimeException("Invalid GZIP header!"); + } + try { + inflaterInstance.setInput(buffer.array(), buffer.position() + 10, -buffer.position() - 18 + buffer.limit()); + inflaterInstance.inflate(data); + } catch (Exception e) { + // inflaterInstance.reset(); + data = null; + // throw new RuntimeException("Invalid GZIP compressed data!"); + } + inflaterInstance.reset(); + } + } + + public static final boolean decompress(byte[] compressed, byte data[], int offset, int length) { + synchronized (inflaterInstance) { + if (data[offset] != 31 || data[offset + 1] != -117) + return false; + // throw new RuntimeException("Invalid GZIP header!"); + try { + inflaterInstance.setInput(data, offset + 10, -offset - 18 + length); + inflaterInstance.inflate(compressed); + } catch (Exception e) { + inflaterInstance.reset(); + e.printStackTrace(); + return false; + // throw new RuntimeException("Invalid GZIP compressed data!"); + } + inflaterInstance.reset(); + return true; + } + } + +} diff --git a/Server/src/main/java/Server/core/cache/misc/Container.java b/Server/src/main/java/Server/core/cache/misc/Container.java new file mode 100644 index 000000000..9760845ff --- /dev/null +++ b/Server/src/main/java/Server/core/cache/misc/Container.java @@ -0,0 +1,109 @@ +package core.cache.misc; + +/** + * A container. + * @author Dragonkk + */ +public class Container { + + /** + * The version. + */ + private int version; + + /** + * The CRC. + */ + private int crc; + + /** + * The name hash. + */ + private int nameHash; + + /** + * If updated. + */ + private boolean updated; + + /** + * Construct a new container. + */ + public Container() { + nameHash = -1; + version = -1; + crc = -1; + } + + /** + * Set the version. + * @param version + */ + public void setVersion(int version) { + this.version = version; + } + + /** + * Update the version. + */ + public void updateVersion() { + version++; + updated = true; + } + + /** + * Get the version. + * @return The version. + */ + public int getVersion() { + return version; + } + + /** + * Get the next version. + * @return The next version. + */ + public int getNextVersion() { + return updated ? version : version + 1; + } + + /** + * Set the CRC. + * @param crc The cRC. + */ + public void setCrc(int crc) { + this.crc = crc; + } + + /** + * Get the CRC. + * @return The CRC. + */ + public int getCrc() { + return crc; + } + + /** + * Set the name hash. + * @param nameHash The name hash. + */ + public void setNameHash(int nameHash) { + this.nameHash = nameHash; + } + + /** + * Get the name hash. + * @return The name hash. + */ + public int getNameHash() { + return nameHash; + } + + /** + * If is updated. + * @return If is updated. + */ + public boolean isUpdated() { + return updated; + } +} diff --git a/Server/src/main/java/Server/core/cache/misc/ContainersInformation.java b/Server/src/main/java/Server/core/cache/misc/ContainersInformation.java new file mode 100644 index 000000000..f786c1d2f --- /dev/null +++ b/Server/src/main/java/Server/core/cache/misc/ContainersInformation.java @@ -0,0 +1,228 @@ +package core.cache.misc; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.zip.CRC32; + +import core.cache.bzip2.BZip2Decompressor; +import core.cache.gzip.GZipDecompressor; + +/** + * A class holding the containers information. + * @author Dragonkk + */ +public final class ContainersInformation { + + /** + * The information container. + */ + private Container informationContainer; + + /** + * The protocol. + */ + private int protocol; + + /** + * The revision. + */ + private int revision; + + /** + * The container indexes. + */ + private int[] containersIndexes; + + /** + * The containers. + */ + private FilesContainer[] containers; + + /** + * If files have to be named. + */ + private boolean filesNamed; + + /** + * If it has to be whirpool. + */ + private boolean whirpool; + + /** + * The data. + */ + private final byte[] data; + + /** + * Construct a new containers information. + * @param informationContainerPackedData The information container data + * packed. + */ + public ContainersInformation(byte[] informationContainerPackedData) { + this.data = Arrays.copyOf(informationContainerPackedData, informationContainerPackedData.length); + informationContainer = new Container(); + informationContainer.setVersion((informationContainerPackedData[informationContainerPackedData.length - 2] << 8 & 0xff00) + (informationContainerPackedData[-1 + informationContainerPackedData.length] & 0xff)); + CRC32 crc32 = new CRC32(); + crc32.update(informationContainerPackedData); + informationContainer.setCrc((int) crc32.getValue()); + decodeContainersInformation(unpackCacheContainer(informationContainerPackedData)); + } + + /** + * Unpacks a container. + * @param packedData The packed container data. + * @return The unpacked data. + */ + public static final byte[] unpackCacheContainer(byte[] packedData) { + ByteBuffer buffer = ByteBuffer.wrap(packedData); + int compression = buffer.get() & 0xFF; + int containerSize = buffer.getInt(); + if (containerSize < 0 || containerSize > 5000000) { + return null; + // throw new RuntimeException(); + } + if (compression == 0) { + byte unpacked[] = new byte[containerSize]; + buffer.get(unpacked, 0, containerSize); + return unpacked; + } + int decompressedSize = buffer.getInt(); + if (decompressedSize < 0 || decompressedSize > 20000000) { + return null; + // throw new RuntimeException(); + } + byte decompressedData[] = new byte[decompressedSize]; + if (compression == 1) { + BZip2Decompressor.decompress(decompressedData, packedData, containerSize, 9); + } else { + GZipDecompressor.decompress(buffer, decompressedData); + } + return decompressedData; + } + + /** + * Get the container indexes. + * @return The container indexes. + */ + public int[] getContainersIndexes() { + return containersIndexes; + } + + /** + * Get the containers. + * @return The containers. + */ + public FilesContainer[] getContainers() { + return containers; + } + + /** + * Get the information container. + * @return The information container. + */ + public Container getInformationContainer() { + return informationContainer; + } + + /** + * Get the revision. + * @return The revision. + */ + public int getRevision() { + return revision; + } + + /** + * Decode the containers information. + * @param data The data. + */ + public void decodeContainersInformation(byte[] data) { + ByteBuffer buffer = ByteBuffer.wrap(data); + protocol = buffer.get() & 0xFF; + if (protocol != 5 && protocol != 6) { + throw new RuntimeException(); + } + revision = protocol < 6 ? 0 : buffer.getInt(); + int nameHash = buffer.get() & 0xFF; + filesNamed = (0x1 & nameHash) != 0; + whirpool = (0x2 & nameHash) != 0; + containersIndexes = new int[buffer.getShort() & 0xFFFF]; + int lastIndex = -1; + for (int index = 0; index < containersIndexes.length; index++) { + containersIndexes[index] = (buffer.getShort() & 0xFFFF) + (index == 0 ? 0 : containersIndexes[index - 1]); + if (containersIndexes[index] > lastIndex) { + lastIndex = containersIndexes[index]; + } + } + containers = new FilesContainer[lastIndex + 1]; + for (int index = 0; index < containersIndexes.length; index++) { + containers[containersIndexes[index]] = new FilesContainer(); + } + if (filesNamed) { + for (int index = 0; index < containersIndexes.length; index++) { + containers[containersIndexes[index]].setNameHash(buffer.getInt()); + } + } + byte[][] filesHashes = null; + if (whirpool) { + filesHashes = new byte[containers.length][]; + for (int index = 0; index < containersIndexes.length; index++) { + filesHashes[containersIndexes[index]] = new byte[64]; + buffer.get(filesHashes[containersIndexes[index]], 0, 64); + } + } + for (int index = 0; index < containersIndexes.length; index++) { + containers[containersIndexes[index]].setCrc(buffer.getInt()); + } + for (int index = 0; index < containersIndexes.length; index++) { + containers[containersIndexes[index]].setVersion(buffer.getInt()); + } + for (int index = 0; index < containersIndexes.length; index++) { + containers[containersIndexes[index]].setFilesIndexes(new int[buffer.getShort() & 0xFFFF]); + } + for (int index = 0; index < containersIndexes.length; index++) { + int lastFileIndex = -1; + for (int fileIndex = 0; fileIndex < containers[containersIndexes[index]].getFilesIndexes().length; fileIndex++) { + containers[containersIndexes[index]].getFilesIndexes()[fileIndex] = (buffer.getShort() & 0xFFFF) + (fileIndex == 0 ? 0 : containers[containersIndexes[index]].getFilesIndexes()[fileIndex - 1]); + if (containers[containersIndexes[index]].getFilesIndexes()[fileIndex] > lastFileIndex) { + lastFileIndex = containers[containersIndexes[index]].getFilesIndexes()[fileIndex]; + } + } + containers[containersIndexes[index]].setFiles(new Container[lastFileIndex + 1]); + for (int fileIndex = 0; fileIndex < containers[containersIndexes[index]].getFilesIndexes().length; fileIndex++) { + containers[containersIndexes[index]].getFiles()[containers[containersIndexes[index]].getFilesIndexes()[fileIndex]] = new Container(); + } + } + if (whirpool) { + for (int index = 0; index < containersIndexes.length; index++) { + for (int fileIndex = 0; fileIndex < containers[containersIndexes[index]].getFilesIndexes().length; fileIndex++) { + containers[containersIndexes[index]].getFiles()[containers[containersIndexes[index]].getFilesIndexes()[fileIndex]].setVersion(filesHashes[containersIndexes[index]][containers[containersIndexes[index]].getFilesIndexes()[fileIndex]]); + } + } + } + if (filesNamed) { + for (int index = 0; index < containersIndexes.length; index++) { + for (int fileIndex = 0; fileIndex < containers[containersIndexes[index]].getFilesIndexes().length; fileIndex++) { + containers[containersIndexes[index]].getFiles()[containers[containersIndexes[index]].getFilesIndexes()[fileIndex]].setNameHash(buffer.getInt()); + } + } + } + } + + /** + * If is whirpool. + * @return If is whirpool {@code true}. + */ + public boolean isWhirpool() { + return whirpool; + } + + /** + * Gets the data. + * @return The data. + */ + public byte[] getData() { + return data; + } + +} diff --git a/Server/src/main/java/Server/core/cache/misc/FilesContainer.java b/Server/src/main/java/Server/core/cache/misc/FilesContainer.java new file mode 100644 index 000000000..5f14e448f --- /dev/null +++ b/Server/src/main/java/Server/core/cache/misc/FilesContainer.java @@ -0,0 +1,57 @@ +package core.cache.misc; + +/** + * A class holding the file containers. + * @author Dragonkk + */ +public final class FilesContainer extends Container { + + /** + * The file indexes. + */ + private int[] filesIndexes; + + /** + * The files. + */ + private Container[] files; + + /** + * Construct a new files container. + */ + public FilesContainer() { + + } + + /** + * Set the files. + * @param containers The files. + */ + public void setFiles(Container[] containers) { + this.files = containers; + } + + /** + * Get the files. + * @return The files. + */ + public Container[] getFiles() { + return files; + } + + /** + * Set the file indexes. + * @param containersIndexes The file indexes. + */ + public void setFilesIndexes(int[] containersIndexes) { + this.filesIndexes = containersIndexes; + } + + /** + * Get the file indexes. + * @return The file indexes. + */ + public int[] getFilesIndexes() { + return filesIndexes; + } +} diff --git a/Server/src/main/java/Server/core/cache/misc/buffer/BufferInputStream.java b/Server/src/main/java/Server/core/cache/misc/buffer/BufferInputStream.java new file mode 100644 index 000000000..a801c870d --- /dev/null +++ b/Server/src/main/java/Server/core/cache/misc/buffer/BufferInputStream.java @@ -0,0 +1,39 @@ +package core.cache.misc.buffer; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +/** + * Handles the reading of data from a byte buffer. + * @author Emperor + */ +public final class BufferInputStream extends InputStream { + + /** + * The buffer to write on. + */ + private final ByteBuffer buffer; + + /** + * The buffer input stream. + * @param buffer The buffer. + */ + public BufferInputStream(ByteBuffer buffer) throws IOException { + this.buffer = buffer; + } + + @Override + public int read() throws IOException { + return buffer.get(); + } + + /** + * Gets the buffer. + * @return The buffer. + */ + public ByteBuffer getBuffer() { + return buffer; + } + +} diff --git a/Server/src/main/java/Server/core/cache/misc/buffer/BufferOutputStream.java b/Server/src/main/java/Server/core/cache/misc/buffer/BufferOutputStream.java new file mode 100644 index 000000000..88ea2ac69 --- /dev/null +++ b/Server/src/main/java/Server/core/cache/misc/buffer/BufferOutputStream.java @@ -0,0 +1,57 @@ +package core.cache.misc.buffer; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; + +/** + * Handles the writing of data on a byte buffer. + * @author Emperor + */ +public final class BufferOutputStream extends OutputStream { + + /** + * The buffer to write on. + */ + private final ByteBuffer buffer; + + /** + * Constructs a new {@code BufferOutputStream} {@code Object}. + * @param buffer The buffer to write on. + * @throws IOException When an I/O exception occurs. + * @throws SecurityException If a security manager exists and its + * checkPermission method denies enabling subclassing. + */ + public BufferOutputStream(ByteBuffer buffer) throws IOException, SecurityException { + super(); + this.buffer = buffer; + } + + @Override + public void write(int b) throws IOException { + buffer.put((byte) b); + } + + @Override + public void flush() { + /* + * empty. + */ + } + + @Override + public void close() { + /* + * empty. + */ + } + + /** + * Gets the buffer. + * @return The buffer. + */ + public ByteBuffer getBuffer() { + return buffer; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/cache/misc/buffer/ByteBufferUtils.java b/Server/src/main/java/Server/core/cache/misc/buffer/ByteBufferUtils.java new file mode 100644 index 000000000..c481ffd6c --- /dev/null +++ b/Server/src/main/java/Server/core/cache/misc/buffer/ByteBufferUtils.java @@ -0,0 +1,181 @@ +package core.cache.misc.buffer; + +import java.io.ObjectInputStream; +import java.nio.ByteBuffer; + +/** + * Holds utility methods for reading/writing a byte buffer. + * @author Emperor + */ +public final class ByteBufferUtils { + + /** + * Gets a string from the byte buffer. + * @param buffer The byte buffer. + * @return The string. + */ + public static String getString(ByteBuffer buffer) { + StringBuilder sb = new StringBuilder(); + byte b; + while ((b = buffer.get()) != 0) { + sb.append((char) b); + } + return sb.toString(); + } + + /** + * Puts a string on the byte buffer. + * @param s The string to put. + * @param buffer The byte buffer. + */ + public static void putString(String s, ByteBuffer buffer) { + buffer.put(s.getBytes()).put((byte) 0); + } + + /** + * Gets a string from the byte buffer. + * @param s The string. + * @param buffer The byte buffer. + * @return The string. + */ + public static ByteBuffer putGJ2String(String s, ByteBuffer buffer) { + byte[] packed = new byte[256]; + int length = packGJString2(0, packed, s); + return buffer.put((byte) 0).put(packed, 0, length).put((byte) 0); + } + + /** + * Decodes the XTEA encryption. + * @param keys The keys. + * @param start The start index. + * @param end The end index. + * @param buffer The byte buffer. + */ + public static void decodeXTEA(int[] keys, int start, int end, ByteBuffer buffer) { + int l = buffer.position(); + buffer.position(start); + int length = (end - start) / 8; + for (int i = 0; i < length; i++) { + int firstInt = buffer.getInt(); + int secondInt = buffer.getInt(); + int sum = 0xc6ef3720; + int delta = 0x9e3779b9; + for (int j = 32; j-- > 0;) { + secondInt -= keys[(sum & 0x1c84) >>> 11] + sum ^ (firstInt >>> 5 ^ firstInt << 4) + firstInt; + sum -= delta; + firstInt -= (secondInt >>> 5 ^ secondInt << 4) + secondInt ^ keys[sum & 3] + sum; + } + buffer.position(buffer.position() - 8); + buffer.putInt(firstInt); + buffer.putInt(secondInt); + } + buffer.position(l); + } + + /** + * Converts a String to an Integer? + * @param position The position. + * @param buffer The buffer used. + * @param string The String to convert. + * @return The Integer. + */ + public static int packGJString2(int position, byte[] buffer, String string) { + int length = string.length(); + int offset = position; + for (int i = 0; length > i; i++) { + int character = string.charAt(i); + if (character > 127) { + if (character > 2047) { + buffer[offset++] = (byte) ((character | 919275) >> 12); + buffer[offset++] = (byte) (128 | ((character >> 6) & 63)); + buffer[offset++] = (byte) (128 | (character & 63)); + } else { + buffer[offset++] = (byte) ((character | 12309) >> 6); + buffer[offset++] = (byte) (128 | (character & 63)); + } + } else + buffer[offset++] = (byte) character; + } + return offset - position; + } + + /** + * Gets a tri-byte from the buffer. + * @param buffer The buffer. + * @return The value. + */ + public static int getTriByte(ByteBuffer buffer) { + return ((buffer.get() & 0xFF) << 16) + ((buffer.get() & 0xFF) << 8) + (buffer.get() & 0xFF); + } + + /** + * Gets a smart from the buffer. + * @param buffer The buffer. + * @return The value. + */ + public static int getSmart(ByteBuffer buffer) { + int peek = buffer.get() & 0xFF; + if (peek <= Byte.MAX_VALUE) { + return peek; + } + return ((peek << 8) | (buffer.get() & 0xFF)) - 32768; + } + + /** + * Gets a smart from the buffer. + * @param buffer The buffer. + * @return The value. + */ + public static int getBigSmart(ByteBuffer buffer) { + int value = 0; + int current = getSmart(buffer); + while (current == 32767) { + current = getSmart(buffer); + value += 32767; + } + value += current; + return value; + } + + /* *//** + * Writes an object on the buffer. + * @param buffer The buffer to write on. + * @param o The object. + */ + /* + * public static void putObject(ByteBuffer buffer, Object o) { ByteBuffer b; + * try (ObjectOutputStream out = new ObjectOutputStream(new + * BufferOutputStream(b = ByteBuffer.allocate(99999)))) { + * out.writeObject(o); b.flip(); } catch (Throwable e) { + * e.printStackTrace(); b = (ByteBuffer) ByteBuffer.allocate(0).flip(); } + * buffer.putInt(b.remaining()); if (b.remaining() > 0) { buffer.put(b); } } + */ + + /** + * Gets an object from the byte buffer. + * @param buffer The buffer. + * @return The object. + */ + public static Object getObject(ByteBuffer buffer) { + int length = buffer.getInt(); + if (length > 0) { + byte[] bytes = new byte[length]; + buffer.get(bytes); + try (ObjectInputStream str = new ObjectInputStream(new BufferInputStream(ByteBuffer.wrap(bytes)))) { + return (Object) str.readObject(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + return null; + } + + /** + * Constructs a new {@code ByteBufferUtils} {@code Object}. + */ + private ByteBufferUtils() { + /* + * empty. + */ + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/Varbit.kt b/Server/src/main/java/Server/core/game/Varbit.kt new file mode 100644 index 000000000..ea3ae3f8f --- /dev/null +++ b/Server/src/main/java/Server/core/game/Varbit.kt @@ -0,0 +1,5 @@ +package core.game + +class Varbit(var value: Int, val offset: Int){ + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/Varp.kt b/Server/src/main/java/Server/core/game/Varp.kt new file mode 100644 index 000000000..36114db53 --- /dev/null +++ b/Server/src/main/java/Server/core/game/Varp.kt @@ -0,0 +1,70 @@ +package core.game + +import core.game.node.entity.player.Player +import core.game.system.SystemLogger + +/** + * A class that represents Varps and aids in modifying/calculating them + * @author Ceikry + */ +class Varp(val index: Int) { + val varbits = ArrayList() + var save = false + + fun setVarbit(offset: Int, value: Int): Varp{ + for(vb in varbits){ + if (vb.offset == offset){ + varbits.remove(vb) + break + } + } + varbits.add(Varbit(value,offset)) + return this + } + + fun getValue(): Int{ + var config = 0 + for(varbit in varbits){ + config = config or (varbit.value shl varbit.offset) + } + return config + } + + fun getVarbit(offset: Int): Varbit?{ + for(varbit in varbits){ + if(varbit.offset == offset) return varbit + } + return null + } + + fun getVarbitValue(offset: Int): Int{ + return getVarbit(offset)?.value ?: 0 + } + + fun send(player: Player){ + player.packetDispatch.sendVarp(this) + } + + fun clear(): Varp{ + varbits.clear() + return this + } + + fun clearBitRange(first : Int, last : Int){ + for(varbit in varbits){ + if(varbit.offset in first..last){ + varbit.value = 0 + } + } + } + + fun getBitRangeValue(first: Int, last: Int): Int{ + var product = 0 + for(varbit in varbits){ + if(varbit.offset in first..last){ + product = product or (varbit.value shl varbit.offset) + } + } + return product + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/VarpManager.kt b/Server/src/main/java/Server/core/game/VarpManager.kt new file mode 100644 index 000000000..f91ef60b5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/VarpManager.kt @@ -0,0 +1,91 @@ +package core.game + +import core.cache.def.impl.VarbitDefinition +import core.game.node.entity.player.Player +import org.json.simple.JSONArray +import org.json.simple.JSONObject + +/** + * Manages the collection of a player's varps. + * Also handles saving and loading of saved varps. + * @author Ceikry + */ +class VarpManager(val player: Player) { + val varps = Array(3500) { Varp(it) } + + fun get(index: Int): Varp{ + return varps[index] + } + + fun send(index: Int){ + player.packetDispatch.sendVarp(get(index)) + } + + fun set(index: Int, value: Int){ + get(index).varbits.clear() + get(index).varbits.add(Varbit(value,0)) + get(index).send(player) + } + + fun setVarbit(def: VarbitDefinition, value: Int){ + get(def.configId).setVarbit(def.bitShift,value).send(player) + } + + fun flagSave(index: Int){ + get(index).save = true + } + + fun unflagSave(index: Int){ + get(index).save = false + } + + fun sendAllVarps(){ + for(varp in varps){ + if(varp.getValue() != 0){ + player.packetDispatch.sendVarp(varp) + } + } + } + + fun getSavedVarps(): ArrayList{ + val list = ArrayList() + for(varp in varps){ + if(varp.save) list.add(varp) + } + return list + } + + fun save(root: JSONObject){ + val varps = JSONArray() + for(varp in getSavedVarps()){ + val varpobj = JSONObject() + varpobj.put("index",varp.index.toString()) + val bitArray = JSONArray() + for(varbit in varp.varbits){ + val varbitobj = JSONObject() + varbitobj.put("offset",varbit.offset.toString()) + varbitobj.put("value",varbit.value.toString()) + bitArray.add(varbitobj) + } + varpobj.put("bitArray",bitArray) + varps.add(varpobj) + } + root.put("varps",varps) + } + + fun parse(data: JSONArray){ + for(varpobj in data){ + val vobj = varpobj as JSONObject + val index = vobj["index"].toString().toInt() + val varp = get(index) + val bits = vobj["bitArray"] as JSONArray + for(vbit in bits){ + val varbit = vbit as JSONObject + val offset = varbit["offset"].toString().toInt() + val value = varbit["value"].toString().toInt() + varp.setVarbit(offset,value) + varp.save = true + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/camerautils/CameraUtils.kt b/Server/src/main/java/Server/core/game/camerautils/CameraUtils.kt new file mode 100644 index 000000000..41e3c2405 --- /dev/null +++ b/Server/src/main/java/Server/core/game/camerautils/CameraUtils.kt @@ -0,0 +1,5 @@ +package core.game.camerautils + +object CameraUtils { + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/camerautils/PlayerCamera.kt b/Server/src/main/java/Server/core/game/camerautils/PlayerCamera.kt new file mode 100644 index 000000000..9d8096813 --- /dev/null +++ b/Server/src/main/java/Server/core/game/camerautils/PlayerCamera.kt @@ -0,0 +1,33 @@ +package core.game.camerautils + +import core.game.node.entity.player.Player +import core.game.system.SystemLogger +import core.net.packet.PacketRepository +import core.net.packet.context.CameraContext +import core.net.packet.out.CameraViewPacket + +class PlayerCamera(val player: Player?) { + var ctx: CameraContext? = null + + fun setPosition(x: Int, y: Int, height: Int){ + player ?: return + ctx = CameraContext(player,CameraContext.CameraType.SET,x,y,height,0,0) + PacketRepository.send(CameraViewPacket::class.java,ctx) + } + fun rotateTo(x: Int, y: Int, height: Int, speed: Int){ + player ?: return + ctx = CameraContext(player,CameraContext.CameraType.ROTATION,x,y,height,speed,1) + PacketRepository.send(CameraViewPacket::class.java,ctx) + } + fun rotateBy(diffX: Int, diffY: Int, diffHeight: Int, speed: Int){ + player ?: return + ctx ?: return + ctx = CameraContext(player,CameraContext.CameraType.ROTATION, ctx!!.x + diffX, ctx!!.y + diffY, ctx!!.height + diffHeight,speed,1) + PacketRepository.send(CameraViewPacket::class.java,ctx) + } + fun panTo(x: Int, y: Int, height: Int, speed: Int){ + player ?: return + ctx = CameraContext(player,CameraContext.CameraType.POSITION,x,y,height,speed,1) + PacketRepository.send(CameraViewPacket::class.java,ctx) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/component/AccessMaskBuilder.java b/Server/src/main/java/Server/core/game/component/AccessMaskBuilder.java new file mode 100644 index 000000000..a3ce053e4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/component/AccessMaskBuilder.java @@ -0,0 +1,104 @@ +package core.game.component; + +/** + * Used to generate component option settings. + * @author Mangis + */ +public final class AccessMaskBuilder { + + /** + * Contains the value which should be sent in access mask packet. + */ + private int value; + + /** + * Sets default option setting. + * @param allowed If the packet for the default option should be sent to the + * server. + */ + public void allowDefaultOption(boolean allowed) { + value &= ~(0x1); + if (allowed) { + value |= 0x1; + } + } + + /** + * Sets right click option settings. If specified option is not allowed, it + * will not appear in right click menu and the packet will not be send to + * server when clicked. + * @param optionId The option index. + * @param show If the option is allowed. + */ + public void showMenuOption(int optionId, boolean show) { + if (optionId < 0 || optionId > 9) { + throw new IllegalArgumentException("Option index must be 0-9."); + } + value &= ~(0x1 << (optionId + 1)); + if (show) { + value |= (0x1 << (optionId + 1)); + } + } + + /** + * Sets use on option settings. If nothing is allowed then 'use' option will + * not appear in right click menu. + */ + public void setUseOnSettings(boolean groundItems, boolean npcs, boolean objects, boolean otherPlayer, boolean selfPlayer, boolean component) { + int useFlag = 0; + if (groundItems) { + useFlag |= 0x1; + } + if (npcs) { + useFlag |= 0x2; + } + if (objects) { + useFlag |= 0x4; + } + if (otherPlayer) { + useFlag |= 0x8; + } + if (selfPlayer) { + useFlag |= 0x10; + } + if (component) { + useFlag |= 0x20; + } + value &= ~(127 << 7); // disable + value |= useFlag << 7; + } + + /** + * Sets interface events depth. For example, we have inventory interface + * which is opened on gameframe interface (548) If depth is 1, then the + * clicks in inventory will also invoke click event handler scripts on + * gameframe interface. + * @param depth The depth value. + */ + public void setInterfaceEventsDepth(int depth) { + if (depth < 0 || depth > 7) { + throw new IllegalArgumentException("depth must be 0-7."); + } + value &= ~(0x7 << 18); + value |= (depth << 18); + } + + /** + * Flags other component options being allowed to be used on this component. + * @param allow If an option can be used on this component. + */ + public void allowUsage(boolean allow) { + value &= ~(1 << 22); + if (allow) { + value |= (1 << 22); + } + } + + /** + * Gets the current value. + * @return The value. + */ + public int getValue() { + return value; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/component/CloseEvent.java b/Server/src/main/java/Server/core/game/component/CloseEvent.java new file mode 100644 index 000000000..3e871993a --- /dev/null +++ b/Server/src/main/java/Server/core/game/component/CloseEvent.java @@ -0,0 +1,20 @@ +package core.game.component; + +import core.game.node.entity.player.Player; + +/** + * An event called when the interface gets closed. + * @author Emperor + */ +public interface CloseEvent { + + /** + * Called when the interface gets closed. + * @param player The player. + * @param c The component. + * @return {@code True} if successful, {@code false} if the component should + * remain open. + */ + boolean close(Player player, Component c); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/component/Component.java b/Server/src/main/java/Server/core/game/component/Component.java new file mode 100644 index 000000000..f4fb6d93a --- /dev/null +++ b/Server/src/main/java/Server/core/game/component/Component.java @@ -0,0 +1,178 @@ +package core.game.component; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.InterfaceManager; +import core.net.packet.PacketRepository; +import core.net.packet.context.InterfaceContext; +import core.net.packet.out.Interface; + +/** + * Represents a component. + * @author Emperor + * + */ +public class Component { + + /** + * The component id. + */ + protected int id; + + /** + * The component definitions. + */ + protected final ComponentDefinition definition; + + /** + * The close event. + */ + protected CloseEvent closeEvent; + + /** + * The component plugin. + */ + protected ComponentPlugin plugin; + + /** + * If the component is hidden. + */ + private boolean hidden; + + /** + * Constructs a new {@code Component} {@code Object}. + * @param id The component id. + */ + public Component(int id) { + this.id = id; + this.definition = ComponentDefinition.forId(id); + this.plugin = definition.getPlugin(); + } + + /** + * Opens the component. + */ + public void open(Player player) { + InterfaceManager manager = player.getInterfaceManager(); + if (definition == null) { + PacketRepository.send(Interface.class, new InterfaceContext(player, manager.getWindowPaneId(), manager.getDefaultChildId(), getId(), false)); + if (plugin != null) { + plugin.open(player, this); + } + return; + } + if (definition.getType() == InterfaceType.WINDOW_PANE) { + return; + } + if (definition.getType() == InterfaceType.TAB) { + PacketRepository.send(Interface.class, new InterfaceContext(player, definition.getWindowPaneId(manager.isResizable()), definition.getChildId(manager.isResizable()) + definition.getTabIndex(), getId(), definition.isWalkable())); + if (plugin != null) { + plugin.open(player, this); + } + return; + } + PacketRepository.send(Interface.class, new InterfaceContext(player, definition.getWindowPaneId(manager.isResizable()), definition.getChildId(manager.isResizable()), getId(), definition.isWalkable())); + if (plugin != null) { + plugin.open(player, this); + } + } + + /** + * Closes the component. + * @param player The player. + * @return {@code True} if the component can be closed. + */ + public boolean close(Player player) { + if (closeEvent != null && !closeEvent.close(player, this)) { + return false; + } + return true; + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } + + /** + * Gets the definition. + * @return The definition. + */ + public ComponentDefinition getDefinition() { + return definition; + } + + /** + * Gets the closeEvent. + * @return The closeEvent. + */ + public CloseEvent getCloseEvent() { + return closeEvent; + } + + /** + * Sets the closeEvent. + * @param closeEvent The closeEvent to set. + */ + public Component setCloseEvent(CloseEvent closeEvent) { + this.closeEvent = closeEvent; + return this; + } + + /** + * Sets the component unclosable. + * @param c The component. + */ + public static void setUnclosable(Player p, Component c) { + p.setAttribute("close_c_", false); + c.setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + if (!player.getAttribute("close_c_", false)) { + return false; + } + return true; + } + }); + } + + /** + * Sets the plugin. + * @param plugin the plugin. + */ + public void setPlugin(ComponentPlugin plugin) { + this.plugin = plugin; + } + + /** + * Gets the component plugin. + * @return the plugin. + */ + public ComponentPlugin getPlugin() { + if (plugin == null) { + ComponentPlugin p = ComponentDefinition.forId(getId()).getPlugin(); + if ((plugin = p) != null) { + return p; + } + } + return plugin; + } + + /** + * Gets the hidden value. + * @return The hidden. + */ + public boolean isHidden() { + return hidden; + } + + /** + * Sets the hidden value. + * @param hidden The hidden to set. + */ + public void setHidden(boolean hidden) { + this.hidden = hidden; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/component/ComponentDefinition.java b/Server/src/main/java/Server/core/game/component/ComponentDefinition.java new file mode 100644 index 000000000..3f6483636 --- /dev/null +++ b/Server/src/main/java/Server/core/game/component/ComponentDefinition.java @@ -0,0 +1,178 @@ +package core.game.component; + + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +/** + * Represents the component definitions. + * @author Emperor + * + */ +public final class ComponentDefinition { + + /** + * The component definitions mapping. + */ + private static final Map DEFINITIONS = new HashMap(); + + /** + * The interface type. + */ + private InterfaceType type = InterfaceType.DEFAULT; + + /** + * The interface context. + */ + private boolean walkable; + + /** + * The tab index. + */ + private int tabIndex = -1; + + /** + * Represents the plugin handler. + */ + private ComponentPlugin plugin; + + /** + * Constructs a new {@code ComponentDefinition} {@code Object}. + */ + public ComponentDefinition() { + /* + * empty. + */ + } + + /** + * Parses the definition values from a result set. + * @throws SQLException The exception if thrown. + */ + public ComponentDefinition parse(String type, String walkable, String tabIndex){ + setType(InterfaceType.values()[Integer.parseInt(type)]); + setWalkable(Boolean.parseBoolean(walkable)); + setTabIndex(Integer.parseInt(tabIndex)); + return this; + } + + /** + * Gets the component definitions for the component id. + * @param componentId The component id. + * @return The component definitions. + */ + public static ComponentDefinition forId(int componentId) { + ComponentDefinition def = DEFINITIONS.get(componentId); + if (def == null) { + DEFINITIONS.put(componentId, def = new ComponentDefinition()); + } + return def; + } + + /** + * Add a plugin to a definition. + * @param id the id. + * @param plugin the plugin. + */ + public static void put(int id, ComponentPlugin plugin) { + ComponentDefinition.forId(id).setPlugin(plugin); + } + + /** + * Gets the definitions mapping. + * @return The definitions mapping. + */ + public static Map getDefinitions() { + return DEFINITIONS; + } + + /** + * Gets the plugin. + * @return The plugin. + */ + public ComponentPlugin getPlugin() { + return plugin; + } + + /** + * Sets the plugin. + * @param plugin The plugin to set. + */ + public void setPlugin(ComponentPlugin plugin) { + this.plugin = plugin; + } + + /** + * Gets the window pane id. + * @param resizable If the player is using resizable mode. + * @return The window pane id. + */ + public int getWindowPaneId(boolean resizable) { + return resizable ? type.getResizablePaneId() : type.getFixedPaneId(); + } + + /** + * Gets the child id. + * @param resizable If the player is using resizable mode. + * @return The child id. + */ + public int getChildId(boolean resizable) { + return resizable ? type.getResizableChildId() : type.getFixedChildId(); + } + + /** + * Gets the type. + * @return the type + */ + public InterfaceType getType() { + return type; + } + + /** + * Sets the batype. + * @param type the type to set. + */ + public void setType(InterfaceType type) { + this.type = type; + } + + /** + * Gets the walkable. + * @return the walkable + */ + public boolean isWalkable() { + return walkable; + } + + /** + * Sets the bawalkable. + * @param walkable the walkable to set. + */ + public void setWalkable(boolean walkable) { + this.walkable = walkable; + } + + /** + * Gets the tabIndex. + * @return the tabIndex + */ + public int getTabIndex() { + return tabIndex; + } + + /** + * Sets the batabIndex. + * @param tabIndex the tabIndex to set. + */ + public void setTabIndex(int tabIndex) { + this.tabIndex = tabIndex; + } + + @Override + public String toString() { + return "ComponentDefinition [type=" + type + ", walkable=" + walkable + ", tabIndex=" + tabIndex + ", plugin=" + plugin + "]"; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/component/ComponentPlugin.java b/Server/src/main/java/Server/core/game/component/ComponentPlugin.java new file mode 100644 index 000000000..7bdbce0f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/component/ComponentPlugin.java @@ -0,0 +1,35 @@ +package core.game.component; + +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle a component reward. + * @author Vexia + */ +public abstract class ComponentPlugin implements Plugin { + + /** + * Handles the interface interaction. + * @param player The player. + * @param component The component. + * @param opcode The opcode. + * @param slot The slot. + * @param itemId The item id. + * @return {@code True} if succesfully handled. + */ + public abstract boolean handle(final Player player, Component component, final int opcode, final int button, int slot, int itemId); + + /** + * Called when this component opens. + * @param player The player + * @param component The component opening. + */ + public void open(Player player, Component component) {} + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/component/InterfaceType.java b/Server/src/main/java/Server/core/game/component/InterfaceType.java new file mode 100644 index 000000000..7eb520870 --- /dev/null +++ b/Server/src/main/java/Server/core/game/component/InterfaceType.java @@ -0,0 +1,122 @@ +package core.game.component; + +import static core.tools.Interfaces.*; + +/** + * Represents an interface type. + * @author Emperor + * + */ +public enum InterfaceType { + + /** + * Default interface. + */ + DEFAULT(TOPLEVEL_548, TOPLEVEL_FULLSCREEN_746, 11, 6), + + /** + * Walkable interface. + */ + OVERLAY(TOPLEVEL_548, TOPLEVEL_FULLSCREEN_746, 4, 5), + + /** + * A tab interface. + */ + TAB(TOPLEVEL_548, TOPLEVEL_FULLSCREEN_746, 83, 93), + + /** + * The only tab to be shown (when this type is opened). + */ + SINGLE_TAB(TOPLEVEL_548, TOPLEVEL_FULLSCREEN_746, 80, 76), + + /** + * Chatbox dialogue interface. + */ + DIALOGUE(CHATTOP_752, CHATTOP_752, 12, 12), + + /** + * A window pane. + */ + WINDOW_PANE(TOPLEVEL_548, TOPLEVEL_FULLSCREEN_746, 0, 0), + + /** + * Client script chatbox interface. + */ + CS_CHATBOX(CHATTOP_752, CHATTOP_752, 6, 6), + + /** + * Chatbox interface. + */ + CHATBOX(CHATTOP_752, CHATTOP_752, 8, 8), + + /** + * Wilderness overlay + */ + WILDERNESS_OVERLAY(TOPLEVEL_548, TOPLEVEL_FULLSCREEN_746, 11, 3); + + /** + * The fixed window pane id. + */ + private final int fixedPaneId; + + /** + * The resizable window pane id. + */ + private final int resizablePaneId; + + /** + * The fixed child id. + */ + private final int fixedChildId; + + /** + * The resizable child id. + */ + private final int resizableChildId; + + /** + * Constructs a new {@Code InterfaceType} {@Code Object} + * @param fixedPaneId The fixed window pane id. + * @param resizablePaneId The resizable window pane id. + * @param fixedChildId The fixed child id. + * @param resizableChildId The resizable child id. + */ + private InterfaceType(int fixedPaneId, int resizablePaneId, int fixedChildId, int resizableChildId) { + this.fixedPaneId = fixedPaneId; + this.resizablePaneId = resizablePaneId; + this.fixedChildId = fixedChildId; + this.resizableChildId = resizableChildId; + } + + /** + * Gets the fixedPaneId. + * @return the fixedPaneId + */ + public int getFixedPaneId() { + return fixedPaneId; + } + + /** + * Gets the resizablePaneId. + * @return the resizablePaneId + */ + public int getResizablePaneId() { + return resizablePaneId; + } + + /** + * Gets the fixedChildId. + * @return the fixedChildId + */ + public int getFixedChildId() { + return fixedChildId; + } + + /** + * Gets the resizableChildId. + * @return the resizableChildId + */ + public int getResizableChildId() { + return resizableChildId; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/container/Container.java b/Server/src/main/java/Server/core/game/container/Container.java new file mode 100644 index 000000000..f185e095b --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/Container.java @@ -0,0 +1,1019 @@ +package core.game.container; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Represents a container which contains items. + * + * @author Emperor + */ +public class Container { + + /** + * The item array. A crystalline + */ + private Item[] items; + + /** + * The capacity. + */ + private final int capacity; + + /** + * The current sort type. + */ + private SortType sortType; + + /** + * The current container type. + */ + private final ContainerType type; + + /** + * The current container event. + */ + private ContainerEvent event; + + /** + * The container listeners. + */ + private final List listeners = new ArrayList<>(); + + /** + * Constructs a new {@code Container} {@code Object}. + * + * @param capacity The capacity. + */ + public Container(int capacity) { + this(capacity, ContainerType.DEFAULT); + } + + /** + * Constructs a new {@code Container.java} {@code Object}. + * + * @param capacity the capacity. + * @param items the items to add. + */ + public Container(int capacity, Item... items) { + this(capacity); + add(items); + } + + /** + * Constructs a new {@code Container} {@code Object}. + * + * @param capacity The capacity. + * @param type The container type. + */ + public Container(int capacity, ContainerType type) { + this(capacity, type, SortType.ID); + } + + /** + * Constructs a new {@code Container} {@code Object}. + * + * @param capacity The capacity. + * @param type The container type. + * @param sortType The sort type. + */ + public Container(int capacity, ContainerType type, SortType sortType) { + this.capacity = capacity; + this.type = type; + this.items = new Item[capacity]; + this.sortType = sortType; + this.event = new ContainerEvent(capacity); + } + + /** + * Registers a container listener. + * + * @param listener The container listener. + * @return This container instance, for chaining. + */ + public Container register(ContainerListener listener) { + listeners.add(listener); + return this; + } + + /** + * Adds the items. + * + * @param items The items to add. + * @return {@code True} if successfully added all items. + */ + public boolean add(Item... items) { + boolean addedAll = true; + for (Item item : items) { + if (item == null) { + continue; + } + if (!add(item, false)) { + addedAll = false; + break; + } + } + update(); + return addedAll; + } + + public void addList(List items){ + items.stream().filter(Objects::nonNull).forEach(this::add); + update(); + } + + /** + * Inserts an item into a specific slot. + * + * @param fromSlot The original slot of the item. + * @param toSlot The slot to insert into. + */ + public void insert(int fromSlot, int toSlot) { + insert(fromSlot, toSlot, true); + } + + /** + * Inserts an item into a specific slot. + * + * @param fromSlot The original slot of the item. + * @param toSlot The slot to insert into. + * @param update If the container packets should be sent. + */ + public void insert(int fromSlot, int toSlot, boolean update) { + Item temp = items[fromSlot]; + if (toSlot > fromSlot) { + for (int i = fromSlot; i < toSlot; i++) { + replace(get(i + 1), i, false); + } + } else if (fromSlot > toSlot) { + for (int i = fromSlot; i > toSlot; i--) { + replace(get(i - 1), i, false); + } + } + replace(temp, toSlot, update); + } + + /** + * Adds an item to this container if full it goes to ground. + * + * @param item the item. + * @param player the player. + * @return {@code True} if added. + */ + public boolean add(final Item item, final Player player) { + if (!add(item, true, -1)) { + GroundItemManager.create(item, player); + return false; + } + return true; + } + + public boolean addIfDoesntHave(final Item item) { + if (containsItem(item)) { + return false; + } else { + return add(item); + + } + } + + /** + * Adds an item to this container. + * + * @param item The item. + * @return {@code True} if the item got added. + */ + public boolean add(Item item) { + return add(item, true, -1); + } + + /** + * Adds an item to this container. + * + * @param item The item to add. + * @param fireListener If we should update. + * @return {@code True} if the item got added. + */ + public boolean add(Item item, boolean fireListener) { + return add(item, fireListener, -1); + } + + /** + * Adds an item to this container. + * + * @param item The item to add. + * @param fireListener If we should update. + * @param preferredSlot The slot to add the item in, when possible. + * @return {@code True} if the item got added. + */ + public boolean add(Item item, boolean fireListener, int preferredSlot) { + item = item.copy(); + int maximum = getMaximumAdd(item); + if (maximum == 0) { + return false; + } +// if (preferredSlot > -1 && items[preferredSlot] != null) { +// preferredSlot = -1; +// } + if (item.getAmount() > maximum) { + item.setAmount(maximum); + } + if (type != ContainerType.NEVER_STACK && (item.getDefinition().isStackable() || type == ContainerType.ALWAYS_STACK || type == ContainerType.SHOP)) { + boolean hashBased = sortType == SortType.HASH; + for (int i = 0; i < items.length; i++) { + if (items[i] != null) { + if ((hashBased && items[i].getIdHash() == item.getIdHash()) || (!hashBased && items[i].getId() == item.getId())) { + int totalCount = item.getAmount() + items[i].getAmount(); + items[i] = new Item(items[i].getId(), totalCount, item.getCharge()); + items[i].setIndex(i); + event.flag(i, items[i]); + if (fireListener) { + update(); + } + return true; + } + } + } + int slot = preferredSlot > -1 ? preferredSlot : freeSlot(); + if (slot == -1) { + return false; + } + items[slot] = item; + item.setIndex(slot); + event.flag(slot, item); + if (fireListener) { + update(); + } + return true; + } + int slots = freeSlots(); + if (slots >= item.getAmount()) { + for (int i = 0; i < item.getAmount(); i++) { + int slot = i == 0 && preferredSlot > -1 ? preferredSlot : freeSlot(); + items[slot] = new Item(item.getId(), 1, item.getCharge()); + items[slot].setIndex(slot); + event.flag(slot, items[slot]); + } + if (fireListener) { + update(); + } + return true; + } + return false; + } + + /** + * Removes a set of items. + * + * @param items The set of items. + * @return {@code True} if all items got successfully removed. + */ + public boolean remove(Item... items) { + boolean removedAll = true; + for (Item item : items) { + if (!remove(item, false)) { + removedAll = false; + } + } + update(); + return removedAll; + } + + /** + * Removes an item. + * + * @param item The item. + * @return {@code True} if the item got removed, {@code false} if not. + */ + public boolean remove(Item item) { + return remove(item, true); + } + + /** + * Removes an item. + * + * @param item The item to remove. + * @param fireListener If the fire listener should be "notified". + * @return {@code True} if the item got removed,
{@code false} if not. + */ + public boolean remove(Item item, boolean fireListener) { + int slot = getSlot(item); + if (slot != -1) { + return remove(item, slot, fireListener); + } + return false; + } + + /** + * Removes an item from this container. + * + * @param item The item. + * @param slot The item slot. + * @param fireListener If the fire listener should be "notified". + * @return {@code True} if the item got removed,
{@code false} if the + * item on the slot was null or the ids didn't match. + */ + public boolean remove(Item item, int slot, boolean fireListener) { + Item oldItem = items[slot]; + if (oldItem == null || oldItem.getId() != item.getId()) { + return false; + } + if (item.getAmount() < 1) { + return true; + } + if (oldItem.getDefinition().isStackable() || type.equals(ContainerType.ALWAYS_STACK) || type == ContainerType.SHOP) { + if (item.getAmount() >= oldItem.getAmount()) { + items[slot] = null; + event.flagNull(slot); + if (fireListener) { + update(); + } + return true; + } + items[slot] = new Item(item.getId(), oldItem.getAmount() - item.getAmount(), item.getCharge()); + items[slot].setIndex(slot); + event.flag(slot, items[slot]); + if (fireListener) { + update(); + } + return true; + } + items[slot] = null; + event.flagNull(slot); + int removed = 1; + for (int i = removed; i < item.getAmount(); i++) { + slot = getSlot(item); + if (slot != -1) { + items[slot] = null; + event.flagNull(slot); + } else { + break; + } + } + if (fireListener) { + update(); + } + return true; + } + + /** + * Replaces the item on the given slot with the argued item. + * + * @param item The item. + * @param slot The slot. + * @return The old item. + */ + public Item replace(Item item, int slot) { + return replace(item, slot, true); + } + + /** + * Replaces the item on the given slot with the argued item. + * + * @param item The item. + * @param slot The slot. + * @param fireListener If the listener should be "notified". + * @return The old item. + */ + public Item replace(Item item, int slot, boolean fireListener) { + if (item != null) { + if (item.getAmount() < 1 && type != ContainerType.SHOP) { + item = null; + } else { + item = item.copy(); + } + } + Item oldItem = items[slot]; + items[slot] = item; + if (item == null) { + event.flagNull(slot); + } else { + item.setIndex(slot); + event.flag(slot, item); + } + if (fireListener) { + update(); + } + return oldItem; + } + + /** + * Updates the container. + */ + public void update() { + if (event.getChangeCount() < 1 && !event.isClear()) { + return; + } + for (ContainerListener listener : listeners) { + listener.update(this, event); + } + event.setClear(false); + event = new ContainerEvent(capacity); + } + + /** + * Updates the container. + */ + public void update(boolean force) { + if (event.getChangeCount() < 1 && !force) { + return; + } + for (ContainerListener listener : listeners) { + listener.update(this, event); + } + event = new ContainerEvent(capacity); + } + + /** + * Refreshes the entire container. + */ + public void refresh() { + for (ContainerListener listener : listeners) { + listener.refresh(this); + } + event = new ContainerEvent(capacity); + } + + public void refresh(ContainerListener listener) { + listener.refresh(this); + event = new ContainerEvent(capacity); + } + + /** + * Gets the item on the given slot. + * + * @param slot The slot. + * @return The id of the item on the slot, or 0 if the item wasn't there. + */ + public int getAsId(int slot) { + if (slot < 0 || slot >= items.length || items[slot] == null) { + return 0; + } + return items[slot].getId(); + } + + + /** + * Gets the item on the given slot. + * + * @param slot The slot. + * @return The item on the slot, or {@code null} if the item wasn't there. + */ + public Item get(int slot) { + if (slot < 0 || slot >= items.length) { + return null; + } + return items[slot]; + } + + /** + * Gets the item on the given slot. + * + * @param slot The slot. + * @return The item on the slot, or a new constructed item with id 0 if the + * item wasn't there. + */ + public Item getNew(int slot) { + Item item = items[slot]; + if (item != null) { + return item; + } + return new Item(0); + } + + /** + * Gets the item id on the given slot. + * + * @param slot The slot. + * @return The id of the item on the slot. + */ + public int getId(int slot) { + if (slot >= items.length) { + return -1; + } + Item item = items[slot]; + if (item != null) { + return item.getId(); + } + return -1; + } + + /** + * Parses the container data from the byte buffer. + * + * @param buffer The byte buffer. + * @return The total value of all items (G.E price > Store price > High + * alchemy price). + */ + public int parse(ByteBuffer buffer) { + int slot; + int total = 0; + while ((slot = buffer.getShort()) != -1) { + int id = buffer.getShort() & 0xFFFF; + int amount = buffer.getInt(); + int charge = buffer.getInt(); + if (id >= ItemDefinition.getDefinitions().size() || id < 0 || slot >= items.length || slot < 0) { + continue; + } + Item item = items[slot] = new Item(id, amount, charge); + item.setIndex(slot); + total += item.getValue(); + } + return total; + } + + public void parse(JSONArray itemArray){ + AtomicInteger total = new AtomicInteger(0); + itemArray.forEach(item -> { + JSONObject i = (JSONObject) item; + int slot = Integer.parseInt(i.get("slot").toString()); + int id = Integer.parseInt(i.get("id").toString()); + int amount = Integer.parseInt(i.get("amount").toString()); + int charge = Integer.parseInt(i.get("charge").toString()); + if (id >= ItemDefinition.getDefinitions().size() || id < 0 || slot >= items.length) { + } else { + Item it = items[slot] = new Item(id,amount,charge); + it.setIndex(slot); + total.set(total.get() + (int)it.getValue()); + } + }); + } + + /** + * Saves the item data on the byte buffer. + * + * @param buffer The byte buffer. + * @return The total value of all items (G.E price > Store price > High + * alchemy price). + */ + public long save(ByteBuffer buffer) { + long totalValue = 0; + for (int i = 0; i < items.length; i++) { + Item item = items[i]; + if (item == null) { + continue; + } + buffer.putShort((short) i); + buffer.putShort((short) item.getId()); + buffer.putInt(item.getAmount()); + buffer.putInt(item.getCharge()); + totalValue += item.getValue(); + } + buffer.putShort((short) -1); + return totalValue; + } + + /** + * Copies the container to this container. + * + * @param c The container to copy. + */ + public void copy(Container c) { + items = new Item[c.items.length]; + for (int i = 0; i < items.length; i++) { + Item it = c.items[i]; + if (it == null) { + continue; + } + items[i] = new Item(it.getId(), it.getAmount(), it.getCharge()); + items[i].setIndex(i); + } + } + + /** + * Formats a container for the SQL database. + * + * @return the string. + */ + public String format() { + String log = ""; + Map map = new HashMap<>(); + Integer old = null; + for (Item item : items) { + if (item != null) { + old = map.get(item.getId()); + map.put(item.getId(), old == null ? item.getAmount() : old + item.getAmount()); + + } + } + for (int i : map.keySet()) { + log += i + "," + map.get(i) + "|"; + } + if (log.length() > 0 && log.charAt(log.length() - 1) == '|') { + log = log.substring(0, log.length() - 1); + } + return log; + } + + /** + * Checks if the container contains an item. + * + * @param item the Item + * @return {@code True} if so. + */ + public boolean containsItem(Item item) { + return contains(item.getId(), item.getAmount()); + } + + /** + * Checks if the containers contains these items. + * + * @param items the items. + * @return {@code True} if so. + */ + public boolean containsItems(Item... items) { + for (Item i : items) { + if (!containsItem(i)) { + return false; + } + } + return true; + } + + /** + * Checks if the container contains an item. + * + * @param itemId The item id. + * @param amount The amount. + * @return {@code True} if so. + */ + public boolean contains(int itemId, int amount) { + int count = 0; + for (Item item : items) { + if (item != null && item.getId() == itemId) { + if ((count += item.getAmount()) >= amount) { + return true; + } + } + } + return false; + } + + /** + * Checks if the containers contains ONE item. + * + * @param itemId + * @return + */ + public boolean containsAtLeastOneItem(int itemId) { + for (Item item : items) { + if (item != null && item.getId() == itemId && item.getAmount() == 1) { + return true; + } + } + return false; + } + + /** + * Checks if the containers contains AT LEAST ONE item from a list of items. + * @param itemIds + * @return true if at least one item from list of IDs is in the container + */ + public boolean containsAtLeastOneItem(int[] itemIds) { + for (int id : itemIds) { + if (getAmount(id) >= 1) + return true; + } + return false; + } + + public boolean containsAtLeastOneItem(Item... items) { + for (Item item : items) { + if (containsItem(item)) { + return true; + } + } + return false; + } + + /** + * Checks if the container contains all items. + * + * @param itemIds to check + * @return {@code True} if so. + */ + public boolean containsAll(int... itemIds) { + for (int i : itemIds) { + if (!containsAtLeastOneItem(i)) { + return false; + } + } + return true; + } + + /** + * Adds a container to this container. + * + * @param container The container. + */ + public void addAll(Container container) { + add(container.items); + } + + /** + * Checks the maximum amount of this item we can add. + * + * @param item The item. + * @return The maximum amount we can add. + */ + public int getMaximumAdd(Item item) { + if (type != ContainerType.NEVER_STACK) { + if (item.getDefinition().isStackable() || type == ContainerType.ALWAYS_STACK || type == ContainerType.SHOP) { + if (contains(item.getId(), 1)) { + return Integer.MAX_VALUE - getAmount(item); + } + return freeSlots() > 0 ? Integer.MAX_VALUE : 0; + } + } + return freeSlots(); + } + + /** + * Checks if the container has space for the item. + * + * @param item The item to check. + * @return {@code True} if so. + */ + public boolean hasSpaceFor(Item item) { + return item.getAmount() <= getMaximumAdd(item); + } + + public boolean hasSpaceFor(Item... items) { + Container c = new Container(28, ContainerType.DEFAULT); + c.add(items); + return this.hasSpaceFor(c); + } + + /** + * Checks if this container has space to add the other container. + * + * @param c The other container. + * @return {@code True} if so. + */ + public boolean hasSpaceFor(Container c) { + if (c == null) { + return false; + } + Container check = new Container(capacity, type); + check.addAll(this); + for (Item item : c.items) { + if (item != null) { + if (!check.add(item, false)) { + return false; + } + } + } + return true; + } + + /** + * Gets the item slot. + * + * @param item The item. + * @return The slot of the item in this container. + */ + public int getSlot(Item item) { + if (item == null) { + return -1; + } + int id = item.getId(); + for (int i = 0; i < items.length; i++) { + Item it = items[i]; + if (it != null && it.getId() == id) { + return i; + } + } + return -1; + } + + /** + * Gets the item instance. + * + * @param item the item. + * @return the item. + */ + public Item getItem(Item item) { + return get(getSlot(item)); + } + + /** + * Gets the next free slot. + * + * @return The slot, or -1 if there are no available slots. + */ + public int freeSlot() { + for (int i = 0; i < items.length; i++) { + if (items[i] == null) { + return i; + } + } + return -1; + } + + /** + * Gets the slot of where to add the item. + * + * @param item The item to add. + * @return The slot where the item will go. + */ + public int getAddSlot(Item item) { + if (type != ContainerType.NEVER_STACK && (item.getDefinition().isStackable() || type.equals(ContainerType.ALWAYS_STACK) || type == ContainerType.SHOP)) { + boolean hashBased = sortType == SortType.HASH; + for (int i = 0; i < items.length; i++) { + if (items[i] != null) { + if ((hashBased && items[i].getIdHash() == item.getIdHash()) || (!hashBased && items[i].getId() == item.getId())) { + return i; + } + } + } + } + return freeSlot(); + } + + /** + * Gets the number of free slots. + * + * @return The number of free slots. + */ + public int freeSlots() { + return capacity - itemCount(); + } + + /** + * Gets the size of this container. + * + * @return The size of this container. + */ + public int itemCount() { + int size = 0; + for (int i = 0; i < items.length; i++) { + if (items[i] != null) { + size++; + } + } + return size; + } + + /** + * Checks if the player has all the item ids in the inventory. + * + * @param itemIds The item ids. + * @return {@code True} if so. + */ + public boolean containItems(int... itemIds) { + for (int i = 0; i < itemIds.length; i++) { + if (!contains(itemIds[i], 1)) { + return false; + } + } + return true; + } + + /** + * Gets the amount of an item. + * + * @param item The item. + * @return The amount of this item in this container. + */ + public int getAmount(Item item) { + if (item == null) { + return 0; + } + int count = 0; + for (Item i : items) { + if (i != null && i.getId() == item.getId()) { + count += i.getAmount(); + } + } + return count; + } + + /** + * Gets the amount. + * + * @param id the id. + * @return the amount. + */ + public int getAmount(int id) { + return getAmount(new Item(id)); + } + + /** + * Shifts the elements in the Container to the appropriate position. + */ + public void shift() { + final Item itemss[] = items; + clear(false); + for (Item item : itemss) { + if (item == null) { + continue; + } + add(item, false); + } + refresh(); + } + + /** + * Checks if the container is empty. + * + * @return {@code True} if so. + */ + public boolean isEmpty() { + for (Item item : items) { + if (item != null) { + return false; + } + } + return true; + } + + /** + * Checks if the container is full. + * + * @return {@code True} if so. + */ + public boolean isFull() { + return freeSlots() < 1; + } + + /** + * Clears and updates the container. + */ + public void clear() { + clear(true); + } + + /** + * Clears the container. + * + * @param update If the container should be updated. + */ + public void clear(boolean update) { + items = new Item[capacity]; + event.flagEmpty(); + if (update) { + refresh(); + } + } + + /** + * Gets the wealth. + * + * @return the wealth. + */ + public int getWealth() { + int wealth = 0; + for (Item i : items) { + if (i == null) { + continue; + } + wealth += i.getDefinition().getValue() * i.getAmount(); + } + return wealth; + } + + /** + * Returns an array representing this container. + * + * @return The array. + */ + public Item[] toArray() { + return items; + } + + /** + * Gets the listeners. + * + * @return The listeners. + */ + public List getListeners() { + return listeners; + } + + /** + * Gets the capacity. + * + * @return The capacity of this container. + */ + public int capacity() { + return capacity; + } + + /** + * Gets the event. + * + * @return the event. + */ + public ContainerEvent getEvent() { + return event; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/container/ContainerEvent.java b/Server/src/main/java/Server/core/game/container/ContainerEvent.java new file mode 100644 index 000000000..6a47b0f27 --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/ContainerEvent.java @@ -0,0 +1,117 @@ +package core.game.container; + +import core.game.node.item.Item; + +/** + * Represents a container event. + * @author Emperor + */ +public final class ContainerEvent { + + /** + * Represents a null item. + */ + public static final Item NULL_ITEM = new Item(0, 0); + + /** + * The array of changed items. + */ + private final Item[] items; + + /** + * Clears the container. + */ + private boolean clear; + + /** + * Constructs a new {@code ContainerEvent} {@code Object}. + * @param size The container size. + */ + public ContainerEvent(int size) { + this.items = new Item[size]; + } + + /** + * Flags a null item on the given slot. + * @param slot The slot. + */ + public void flagNull(int slot) { + items[slot] = NULL_ITEM; + } + + /** + * Flags an item on the given slot. + * @param slot The slot. + * @param item The item. + */ + public void flag(int slot, Item item) { + items[slot] = item; + } + + /** + * Gets the amount of item slots changed. + * @return The amount of item slots that have changed. + */ + public int getChangeCount() { + int count = 0; + for (Item item : items) { + if (item != null) { + count++; + } + } + return count; + } + + /** + * Gets the updated slots. + * @return The slots array. + */ + public int[] getSlots() { + int size = 0; + int[] slots = new int[items.length]; + for (int i = 0; i < items.length; i++) { + if (items[i] != null) { + slots[size++] = i; + } + } + int[] slot = new int[size]; + for (int i = 0; i < size; i++) { + slot[i] = slots[i]; + } + return slot; + } + + /** + * Gets the items. + * @return The items. + */ + public Item[] getItems() { + return items; + } + + /** + * Flags an empty container. + */ + public void flagEmpty() { + this.clear = true; + for (int i = 0; i < items.length; i++) { + items[i] = null; + } + } + + /** + * Gets the clear. + * @return The clear. + */ + public boolean isClear() { + return clear; + } + + /** + * Sets the clear flag. + * @param clear The container is cleared. + */ + public void setClear(boolean clear) { + this.clear = clear; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/container/ContainerListener.java b/Server/src/main/java/Server/core/game/container/ContainerListener.java new file mode 100644 index 000000000..af3e71f4b --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/ContainerListener.java @@ -0,0 +1,21 @@ +package core.game.container; + +/** + * Represents a container listener. + * @author Emperor + */ +public interface ContainerListener { + + /** + * Updates the changed item slots in the container. + * @param c The container we're listening to. + * @param event The container event. + */ + void update(Container c, ContainerEvent event); + + /** + * Updates the entire container. + * @param c The container. + */ + void refresh(Container c); +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/container/ContainerType.java b/Server/src/main/java/Server/core/game/container/ContainerType.java new file mode 100644 index 000000000..27a55fa68 --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/ContainerType.java @@ -0,0 +1,29 @@ +package core.game.container; + +/** + * Represents the container types. + * @author Emperor + */ +public enum ContainerType { + + /** + * The default container type. + */ + DEFAULT, + + /** + * If the container is used for a shop. + */ + SHOP, + + /** + * The container should always stack items. + */ + ALWAYS_STACK, + + /** + * The container should never stack items. + */ + NEVER_STACK; + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/container/SortType.java b/Server/src/main/java/Server/core/game/container/SortType.java new file mode 100644 index 000000000..900239865 --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/SortType.java @@ -0,0 +1,19 @@ +package core.game.container; + +/** + * The sort type of the container. + * @author Emperor + */ +public enum SortType { + + /** + * Sort by item id (default). + */ + ID, + + /** + * Sort by item identification hash (bank). + */ + HASH + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/container/access/BitregisterAssembler.java b/Server/src/main/java/Server/core/game/container/access/BitregisterAssembler.java new file mode 100644 index 000000000..8410c63f2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/access/BitregisterAssembler.java @@ -0,0 +1,122 @@ +package core.game.container.access; + +import core.game.node.entity.player.Player; + +/** + * Contains the mask value methods. The 'access mask' is actually just a bit + * register that contains permissions for a specific interface (@Peterbjornx) + * @date 5/02/2013 + * @author Stacx + * @author Emperor + */ +public final class BitregisterAssembler { + + /** + * The register size. + */ + public static final int SIZE = 32 - 1; + + /** + * Examine option. + */ + public static final int EXAMINE_OPT = 9; + + /** + * Allow dragging. + */ + public static final int DRAGABLE = 17; + + /** + * Allow switching item slots. + */ + public static final int SLOT_SWITCH = 20; + + /** + * The flags. + */ + private boolean[] permissions = new boolean[SIZE]; + + /** + * Constructs a new {@code BitregisterAssembler} {@code Object}. + * @param permissions The permissions. + */ + public BitregisterAssembler(int... permissions) { + for (int i : permissions) { + this.permissions[i] = true; + } + } + + /** + * Constructs a new {@code BitregisterAssembler} {@code Object}. + */ + public BitregisterAssembler(String[] options) { + enableOptions(options); + } + + /** + * Enables the given options ({@code null} options will remain disabled). + * @param options The options. + */ + public void enableOptions(String...options) { + if (options.length > 9) { + throw new IllegalStateException("Too many options specified - maximum 9 allowed!"); + } + for (int i = 0; i < options.length; i++) { + if (options[i] != null && !options[i].equals("null")) { + permissions[i] = true; + } + } + } + + /** + * Enables the examine option. + */ + public void enableExamineOption() { + permissions[EXAMINE_OPT] = true; + } + + /** + * Enables items being dragged. + */ + public void enableDragging() { + permissions[DRAGABLE] = true; + } + + /** + * Enables item switching slots (& dragging). + */ + public void enableSlotSwitch() { + enableDragging(); + permissions[SLOT_SWITCH] = true; + } + + /** + * Send and assemble a bit register for our + * @param player , the player instance + * @param interfaceIndex , the interface index + * @param childIndex , the child index for our interface + * @param offset , the offset for the loop in client + * @param length , the length of our loop + */ + public static void send(Player player, int interfaceIndex, int childIndex, int offset, int length, BitregisterAssembler assembler) { + if (offset >= length) { + throw new RuntimeException("Offset cannot excess length. length = " + length); + } + player.getPacketDispatch().sendAccessMask(assembler.calculateRegister(), childIndex, interfaceIndex, offset, length); + } + + /** + * Calculates the register. + * @return The value. + */ + public int calculateRegister() { + int value = 0; + for (int i = 0; i < SIZE; i++) { + if (permissions[i]) { + value |= 2 << i; + } + } + return value; + } + +} diff --git a/Server/src/main/java/Server/core/game/container/access/InterfaceContainer.java b/Server/src/main/java/Server/core/game/container/access/InterfaceContainer.java new file mode 100644 index 000000000..713b72eda --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/access/InterfaceContainer.java @@ -0,0 +1,165 @@ +package core.game.container.access; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +/** + * Generates a set of items and options on an interface. + * @date 5/02/2013 + * @author Stacx + */ +public class InterfaceContainer { + + /** + * The client script index for set_options. + */ + private static final int CLIENT_SCRIPT_INDEX = 150; + + /** + * This index will increase each time a set is generated. + */ + private static int index = 600; // 93 + + /** + * Generates a container/array of items in an interface positioned on the + * child index. + * @param player , the player we generate this set for + * @param itemArray , the container/array of items we want to display + * @param options , the right-click options we want for the items + * @param interfaceIndex , the interface index + * @param childIndex , the child index of the interface where we display the + * items at. + * @return The container key. + */ + private static int generate(Player player, Item[] itemArray, String[] options, int interfaceIndex, int childIndex, int x, int y, int key) { + Object[] clientScript = new Object[options.length + 7]; + player.getPacketDispatch().sendRunScript(CLIENT_SCRIPT_INDEX, generateScriptArguments(options.length), populateScript(clientScript, options, interfaceIndex << 16 | childIndex, x, y, key)); + BitregisterAssembler.send(player, interfaceIndex, childIndex, 0, itemArray.length, new BitregisterAssembler(options)); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, key, itemArray, itemArray.length, false)); + return increment(); + } + + public static int generateOptions(Player player, String[] options, int interfaceIndex, int childIndex, int x, int y, int key){ + player.getPacketDispatch().sendRunScript(CLIENT_SCRIPT_INDEX, generateScriptArguments(options.length), populateScript(new Object[options.length + 7],options,interfaceIndex << 16 | childIndex, x, y, key)); + BitregisterAssembler.send(player,interfaceIndex,childIndex,0,28,new BitregisterAssembler(options)); + return increment(); + } + + /** + * Generates options for the interface item container. + * @param player The player. + * @param interfaceId The interface id. + * @param childId The child index. + * @param itemLength The amount of items. + * @param options The options. + * @return The container key. + */ + public static int generate(Player player, int interfaceId, int childId, int itemLength, String... options) { + return generate(player, interfaceId, childId, itemLength, 7, 3, options); + } + + /** + * Generates options for the interface item container. + * @param player The player. + * @param interfaceId The interface id. + * @param childId The child index. + * @param itemLength The amount of items. + * @param x The amount of items in a row. + * @param y The amount of item rows. + * @param options The options. + * @return The container key. + */ + public static int generate(Player player, int interfaceId, int childId, int itemLength, int x, int y, String... options) { + int key = increment(); + Object[] clientScript = new Object[options.length + 7]; + player.getPacketDispatch().sendRunScript(CLIENT_SCRIPT_INDEX, generateScriptArguments(options.length), populateScript(clientScript, options, interfaceId << 16 | childId, x, y, key)); + BitregisterAssembler.send(player, interfaceId, childId, 0, itemLength, new BitregisterAssembler(options)); + return key; + } + + /** + * Increments the current index. + * @return The previous index. + */ + private static int increment() { + if (index == 6999) { + index = 600; + } + return index++; + } + + /** + * Populates an object array used as a script for the client + * @param script , the array we want to populate + * @param options , the right-click options for our items + * @param hash , interfaceIndex << 16 | childIndex + * @return script, the populated script + */ + private static Object[] populateScript(Object[] script, String[] options, int hash, int x, int y, int key) { + int offset = 0; + for (String option : options) { + script[offset++] = option; + } + System.arraycopy(new Object[] { -1, 0, x, y, key, hash }, 0, script, offset, 6); + return script; + } + + /** + * Generates a script argument type string for the client (note: everything + * but a "s" is integer for the run script packet) + * @param length , the amount of options + * @return the generated string. + */ + private static String generateScriptArguments(int length) { + StringBuilder builder = new StringBuilder("IviiiI"); + while (length > 0) { + builder.append("s"); + length--; + } + return builder.toString(); + } + + /** + * Default method to generate and send an item array for the client. + * @return The container key. + * @see {@link InterfaceContainer.generate} + */ + public static int generateItems(Player player, Item[] itemArray, String[] options, int interfaceIndex, int childIndex) { + return generateItems(player, itemArray, options, interfaceIndex, childIndex, 7, 3, increment()); + } + + /** + * Default method to generate and send an item array for the client. + * @return The container key. + * @see {@link InterfaceContainer.generate} + */ + public static int generateItems(Player player, Item[] itemArray, String[] options, int interfaceIndex, int childIndex, int key) { + return generateItems(player, itemArray, options, interfaceIndex, childIndex, 7, 3, key); + } + + /** + * Method to generate the send items for the client with a specified + * location for the items. + * @param x , the x coordinate + * @param y , the y coordinate + * @return The container key. + */ + public static int generateItems(Player player, Item[] itemArray, String[] options, int interfaceIndex, int childIndex, int x, int y) { + return generateItems(player, itemArray, options, interfaceIndex, childIndex, x, y, increment()); + } + + /** + * Method to generate the send items for the client with a specified + * location for the items. + * @param x , the x coordinate + * @param y , the y coordinate + * @return The container key. + */ + public static int generateItems(Player player, Item[] itemArray, String[] options, int interfaceIndex, int childIndex, int x, int y, int key) { + return generate(player, itemArray, options, interfaceIndex, childIndex, x, y, key); + } + +} diff --git a/Server/src/main/java/Server/core/game/container/impl/BankContainer.java b/Server/src/main/java/Server/core/game/container/impl/BankContainer.java new file mode 100644 index 000000000..01d3591ef --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/impl/BankContainer.java @@ -0,0 +1,556 @@ +package core.game.container.impl; + +import core.ServerConstants; +import core.game.component.Component; +import core.game.container.*; +import core.game.container.access.BitregisterAssembler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.IronmanMode; +import core.game.node.item.Item; +import core.game.system.config.ItemConfigParser; +import core.game.world.GameWorld; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +import java.nio.ByteBuffer; + +/** + * Represents the bank container. + * @author Emperor + */ +public final class BankContainer extends Container { + + /** + * The bank container size. + */ + public static final int SIZE = ServerConstants.BANK_SIZE; + + /** + * The maximum amount of bank tabs + */ + public static final int TAB_SIZE = 11; + + /** + * The player reference. + */ + private Player player; + + /** + * The bank listener. + */ + private final BankListener listener; + + /** + * Set {@code true} to note items. + */ + private boolean noteItems; + + /** + * If the bank is open. + */ + private boolean open; + + /** + * The last x-amount entered. + */ + private int lastAmountX = 50; + + /** + * The current tab index. + */ + private int tabIndex = 10; + + /** + * The tab start indexes. + */ + private final int[] tabStartSlot = new int[TAB_SIZE]; + + /** + * If inserting items is enabled. + */ + private boolean insertItems; + + /** + * Construct a new {@code BankContainer} {@code Object}. + * @param player The player reference. + */ + public BankContainer(Player player) { + super(SIZE, ContainerType.ALWAYS_STACK, SortType.HASH); + super.register(listener = new BankListener(player)); + this.player = player; + } + + /** + * Open the bank. + */ + public void open() { + if (open) { + return; + } + if (player.getIronmanManager().checkRestriction(IronmanMode.ULTIMATE)) { + return; + } + if (!player.getBankPinManager().isUnlocked() && !GameWorld.getSettings().isDevMode()) { + player.getBankPinManager().openType(1); + return; + } + player.getInterfaceManager().openComponent(762).setCloseEvent((player, c) -> { + BankContainer.this.close(); + return true; + }); + player.getInterfaceManager().openSingleTab(new Component(763)); + super.refresh(); + player.getInventory().getListeners().add(listener); + player.getInventory().refresh(); + player.varpManager.get(1249).setVarbit(0,lastAmountX).send(player); + player.getPacketDispatch().sendAccessMask(1278, 73, 762, 0, ServerConstants.BANK_SIZE); + BitregisterAssembler assembly = new BitregisterAssembler(0, 1, 2, 3, 4, 5); + assembly.enableExamineOption(); + assembly.enableSlotSwitch(); + player.getPacketDispatch().sendAccessMask(assembly.calculateRegister(), 0, 763, 0, 27); + player.getPacketDispatch().sendRunScript(1451, ""); + open = true; + setTabConfigurations(); + sendBankSpace(); + } + + public void open(Player player) { + if (open) { + return; + } + if (player.getIronmanManager().checkRestriction(IronmanMode.ULTIMATE)) { + return; + } + if (!player.getBankPinManager().isUnlocked() && !GameWorld.getSettings().isDevMode()) { + player.getBankPinManager().openType(1); + return; + } + player.getInterfaceManager().openComponent(762).setCloseEvent((player1, c) -> { + BankContainer.this.close(); + return true; + }); + this.player.getBank().refresh(player.getBank().listener); + player.getInterfaceManager().openSingleTab(new Component(763)); + player.getInventory().getListeners().add(player.getBank().listener); + player.getInventory().refresh(); + player.varpManager.get(1249).setVarbit(0,lastAmountX).send(player); + player.getPacketDispatch().sendAccessMask(1278, 73, 762, 0, SIZE); + BitregisterAssembler assembly = new BitregisterAssembler(0, 1, 2, 3, 4, 5); + assembly.enableExamineOption(); + assembly.enableSlotSwitch(); + player.getPacketDispatch().sendAccessMask(assembly.calculateRegister(), 0, 763, 0, 27); + player.getPacketDispatch().sendRunScript(1451, ""); + open = true; + this.player.getBank().setTabConfigurations(player); + + } + + @Override + public long save(ByteBuffer buffer) { + buffer.putInt(lastAmountX); + buffer.put((byte) tabStartSlot.length); + for (int j : tabStartSlot) { + buffer.putShort((short) j); + } + return super.save(buffer); + } + + @Override + public int parse(ByteBuffer buffer) { + lastAmountX = buffer.getInt(); + int length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + tabStartSlot[i] = buffer.getShort(); + } + return super.parse(buffer); + } + + /** + * Closes the bank. + */ + public void close() { + open = false; + player.getInventory().getListeners().remove(listener); + player.getInterfaceManager().closeSingleTab(); + player.removeAttribute("search"); + player.getPacketDispatch().sendRunScript(571, ""); + } + + /** + * Adds an item to the bank container. + * @param slot The item slot. + * @param amount The amount. + */ + public void addItem(int slot, int amount) { + if (slot < 0 || slot > player.getInventory().capacity() || amount < 1) { + return; + } + Item item = player.getInventory().get(slot); + if (item == null) { + return; + } + int maximum = player.getInventory().getAmount(item); + if (amount > maximum) { + amount = maximum; + } + int maxCount = super.getMaximumAdd(item); + if (amount > maxCount) { + amount = maxCount; + if (amount < 1) { + player.getPacketDispatch().sendMessage("There is not enough space left in your bank."); + return; + } + } + if (!item.getDefinition().getConfiguration(ItemConfigParser.BANKABLE, true)) { + player.sendMessage("A magical force prevents you from banking this item"); + return; + } + item = new Item(item.getId(), amount, item.getCharge()); + boolean unnote = !item.getDefinition().isUnnoted(); + if (player.getInventory().remove(item, slot, true)) { + Item add = unnote ? new Item(item.getDefinition().getNoteId(), amount, item.getCharge()) : item; + if (unnote && !add.getDefinition().isUnnoted()) { + add = item; + } + int preferredSlot = -1; + if (tabIndex != 0 && tabIndex != 10 && !super.contains(add.getId(), 1)) { + preferredSlot = tabStartSlot[tabIndex] + getItemsInTab(tabIndex); + insert(freeSlot(), preferredSlot, false); + increaseTabStartSlots(tabIndex); + } + super.add(add, true, preferredSlot); + setTabConfigurations(); + } + } + + /** + * Re-opens the bank interface. + */ + public void reopen() { + if (!open) { + return; + } + player.getInterfaceManager().close(); + open(); + refresh(); + } + + /** + * Takes a item from the bank container and adds one to the inventory + * container. + * @param slot The slot. + * @param amount The amount. + */ + public void takeItem(int slot, int amount) { + if (slot < 0 || slot > super.capacity() || amount <= 0) { + return; + } + Item item = get(slot); + if (item == null) { + return; + } + if (amount > item.getAmount()) { + amount = item.getAmount(); // It always stacks in the bank. + } + item = new Item(item.getId(), amount, item.getCharge()); + int noteId = item.getDefinition().getNoteId(); + Item add = noteItems && noteId > 0 ? new Item(noteId, amount, item.getCharge()) : item; + int maxCount = player.getInventory().getMaximumAdd(add); + if (amount > maxCount) { + item.setAmount(maxCount); + add.setAmount(maxCount); + if (maxCount < 1) { + player.getPacketDispatch().sendMessage("Not enough space in your inventory."); + return; + } + } + if (noteItems && noteId < 0) { + player.getPacketDispatch().sendMessage("This item can't be withdrawn as a note."); + add = item; + } + if (super.remove(item, slot, false)) { + player.getInventory().add(add); + } + int tabId = getTabByItemSlot(slot); + if (get(slot) == null) { + decreaseTabStartSlots(tabId); + } + setTabConfigurations(); + shift(); + if (player.getAttribute("search", false)) { + reopen(); + } + } + + /** + * Updates the last x-amount entered. + * @param amount The amount to set. + */ + public void updateLastAmountX(int amount) { + this.lastAmountX = amount; + player.varpManager.get(1249).setVarbit(0,amount).send(player); + } + + /** + * Gets the tab the item slot is in. + * @param itemSlot The item slot. + * @return The tab index. + */ + public int getTabByItemSlot(int itemSlot) { + int tabId = 0; + for (int i = 0; i < tabStartSlot.length; i++) { + if (itemSlot >= tabStartSlot[i]) { + tabId = i; + } + } + return tabId; + } + + /** + * Increases a tab's start slot. + * @param startId The start id. + */ + public void increaseTabStartSlots(int startId) { + for (int i = startId + 1; i < tabStartSlot.length; i++) { + tabStartSlot[i]++; + } + } + + /** + * Decreases a tab's start slot. + * @param startId The start id. + */ + public void decreaseTabStartSlots(int startId) { + if (startId == 10) { + return; + } + for (int i = startId + 1; i < tabStartSlot.length; i++) { + tabStartSlot[i]--; + } + if (getItemsInTab(startId) == 0) { + collapseTab(startId); + } + } + + /** + * Gets the array index for a tab. + * @param tabId The tab id. + * @return The array index. + */ + public static int getArrayIndex(int tabId) { + if (tabId == 41 || tabId == 74) { + return 10; + } + int base = 39; + for (int i = 1; i < 10; i++) { + if (tabId == base) { + return i; + } + base -= 2; + } + return -1; + } + + /** + * Sends the bank space values on the interface. + */ + public void sendBankSpace() { + player.getPacketDispatch().sendString(Integer.toString(capacity() - freeSlots()), 762, 97); + player.getPacketDispatch().sendString(Integer.toString(capacity()), 762, 98); + } + + /** + * Collapses a tab. + * @param tabId The tab index. + */ + public void collapseTab(int tabId) { + int size = getItemsInTab(tabId); + Item[] tempTabItems = new Item[size]; + for (int i = 0; i < size; i++) { + tempTabItems[i] = get(tabStartSlot[tabId] + i); + replace(null, tabStartSlot[tabId] + i, false); + } + shift(); + for (int i = tabId; i < tabStartSlot.length - 1; i++) { + tabStartSlot[i] = tabStartSlot[i + 1] - size; + } + tabStartSlot[10] = tabStartSlot[10] - size; + for (int i = 0; i < size; i++) { + int slot = freeSlot(); + replace(tempTabItems[i], slot, false); + } + refresh(); //We only refresh once. + setTabConfigurations(); + } + + /** + * Sets the tab configs. + */ + public void setTabConfigurations() { + int value = getItemsInTab(1); + value += getItemsInTab(2) << 10; + value += getItemsInTab(3) << 20; + player.getConfigManager().set(1246, value); + value = getItemsInTab(4); + value += getItemsInTab(5) << 10; + value += getItemsInTab(6) << 20; + player.getConfigManager().set(1247, value); + value = -2013265920; + value += (134217728 * (tabIndex == 10 ? 0 : tabIndex)); + value += getItemsInTab(7); + value += getItemsInTab(8) << 10; + player.getConfigManager().set(1248, value); + } + + /** + * Sets the tab configs. + */ + public void setTabConfigurations(Player player) { + int value = getItemsInTab(1); + value += getItemsInTab(2) << 10; + value += getItemsInTab(3) << 20; + player.getConfigManager().set(1246, value); + value = getItemsInTab(4); + value += getItemsInTab(5) << 10; + value += getItemsInTab(6) << 20; + player.getConfigManager().set(1247, value); + value = -2013265920; + value += (134217728 * (tabIndex == 10 ? 0 : tabIndex)); + value += getItemsInTab(7); + value += getItemsInTab(8) << 10; + player.getConfigManager().set(1248, value); + } + + /** + * Gets the amount of items in one tab. + * @param tabId The tab index. + * @return The amount of items in this tab. + */ + public int getItemsInTab(int tabId) { + return tabStartSlot[tabId + 1] - tabStartSlot[tabId]; + } + + /** + * Checks if the item can be added. + * @param item the item. + * @return {@code True} if so. + */ + public boolean canAdd(Item item) { + return item.getDefinition().getConfiguration(ItemConfigParser.BANKABLE, true); + } + + /** + * Gets the last x-amount. + * @return The last x-amount. + */ + public int getLastAmountX() { + return lastAmountX; + } + + /** + * If items have to be noted. + * @return If items have to be noted {@code true}. + */ + public boolean isNoteItems() { + return noteItems; + } + + /** + * Set if items have to be noted. + * @param noteItems If items have to be noted {@code true}. + */ + public void setNoteItems(boolean noteItems) { + this.noteItems = noteItems; + } + + /** + * Gets the tabStartSlot value. + * @return The tabStartSlot. + */ + public int[] getTabStartSlot() { + return tabStartSlot; + } + + /** + * Gets the tabIndex value. + * @return The tabIndex. + */ + public int getTabIndex() { + return tabIndex; + } + + /** + * Sets the tabIndex value. + * @param tabIndex The tabIndex to set. + */ + public void setTabIndex(int tabIndex) { + this.tabIndex = tabIndex; + } + + /** + * Sets the insert items value. + * @param insertItems The insert items value. + */ + public void setInsertItems(boolean insertItems) { + this.insertItems = insertItems; + } + + /** + * Gets the insert items value. + * @return {@code True} if inserting items mode is enabled. + */ + public boolean isInsertItems() { + return insertItems; + } + + /** + * Checks if the bank is opened. + * @return {@code True} if so. + */ + public boolean isOpen() { + return open; + } + + /** + * Listens to the bank container. + * @author Emperor + */ + private static class BankListener implements ContainerListener { + + /** + * The player reference. + */ + private Player player; + + /** + * Construct a new {@code BankListener} {@code Object}. + * @param player The player reference. + */ + public BankListener(Player player) { + this.player = player; + } + + @Override + public void update(Container c, ContainerEvent event) { + if (c instanceof BankContainer) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 762, 64000, 95, event.getItems(), false, event.getSlots())); + } else { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 763, 64000, 93, event.getItems(), false, event.getSlots())); + } + player.getBank().setTabConfigurations(); + player.getBank().sendBankSpace(); + } + + @Override + public void refresh(Container c) { + if (c instanceof BankContainer) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 762, 64000, 95, c.toArray(), c.capacity(), false)); + } else { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 763, 64000, 93, c.toArray(), 28, false)); + } + player.getBank().setTabConfigurations(); + player.getBank().sendBankSpace(); + } + } +} diff --git a/Server/src/main/java/Server/core/game/container/impl/EquipmentContainer.java b/Server/src/main/java/Server/core/game/container/impl/EquipmentContainer.java new file mode 100644 index 000000000..f464120ce --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/impl/EquipmentContainer.java @@ -0,0 +1,285 @@ +package core.game.container.impl; + +import core.game.container.Container; +import core.game.container.ContainerEvent; +import core.game.container.ContainerListener; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.config.ItemConfigParser; +import core.game.world.update.flag.player.AppearanceFlag; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; +import core.net.packet.out.WeightUpdate; +import core.plugin.Plugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks; + +/** + * Represents the equipment container. + * @author Emperor + */ +public final class EquipmentContainer extends Container { + /** + * The equipment slots. + */ + public static final int SLOT_HAT = 0, SLOT_CAPE = 1, SLOT_AMULET = 2, SLOT_WEAPON = 3, SLOT_CHEST = 4, SLOT_SHIELD = 5, SLOT_LEGS = 7, SLOT_HANDS = 9, SLOT_FEET = 10, SLOT_RING = 12, SLOT_ARROWS = 13; + + /** + * The bonus names. + */ + private static final String[] BONUS_NAMES = { "Stab: ", "Slash: ", "Crush: ", "Magic: ", "Ranged: ", "Stab: ", "Slash: ", "Crush: ", "Magic: ", "Ranged: ", "Summoning: ", "Strength: ", "Prayer: " }; + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@code EquipmentContainer} {@code Object}. + * @param player The player. + */ + public EquipmentContainer(Player player) { + super(14); + this.player = player; + register(new EquipmentListener(player)); + } + + @Override + public boolean add(Item item, boolean fire) { + return add(item, fire, true); + } + + /** + * Adds an item to the equipment container. + * @param item The item to add. + * @param fire If we should refresh. + * @param fromInventory If the item is being equipped from the inventory. + * @return {@code True} if succesful, {@code false} if not. + */ + public boolean add(Item item, boolean fire, boolean fromInventory) { + return add(item, player.getInventory().getSlot(item), fire, fromInventory); + } + + /** + * Adds an item to the equipment container. + * @param item The item to add. + * @param inventorySlot The inventory slot of the item. + * @param fire If we should refresh. + * @param fromInventory If the item is being equipped from the inventory. + * @return {@code True} if succesful, {@code false} if not. + */ + public boolean add(Item item, int inventorySlot, boolean fire, boolean fromInventory) { + int slot = item.getDefinition().getConfiguration(ItemConfigParser.EQUIP_SLOT, -1); + if (slot == -1 && item.getDefinition().getConfiguration(ItemConfigParser.WEAPON_INTERFACE, -1) != -1) { + slot = SLOT_WEAPON; + } +// slot = 3; + if (slot < 0) { + return false; // Item can't be equipped. + } + if (!item.getDefinition().hasRequirement(player, true, true)) { + return false; + } + Item current = super.get(slot); + if (current != null && current.getId() == item.getId() && current.getDefinition().isStackable()) { + int amount = getMaximumAdd(item); + if (item.getAmount() > amount) { + amount += current.getAmount(); + } else { + amount = current.getAmount() + item.getAmount(); + } + if (fromInventory) { + player.getInventory().remove(new Item(item.getId(), amount - current.getAmount())); + } + replace(new Item(item.getId(), amount), slot); + return true; + } + if (fromInventory && current != null) { + Plugin plugin = current.getDefinition().getConfiguration("equipment", null); + if (plugin != null) { + Object object = plugin.fireEvent("unequip", player, current, item); + if (object != null && !((Boolean) object)) { + return true; + } + } + } + if (fromInventory && !player.getInventory().remove(item, inventorySlot, true)) { + return false; + } + Item secondary = null; + if (item.getDefinition().getConfiguration(ItemConfigParser.TWO_HANDED, false)) { + secondary = get(SLOT_SHIELD); + } else if (slot == SLOT_SHIELD) { + secondary = get(SLOT_WEAPON); + if (secondary != null && !secondary.getDefinition().getConfiguration(ItemConfigParser.TWO_HANDED, false)) { + secondary = null; + } + } + int currentSlot = -1; + if (current != null) { + currentSlot = inventorySlot; + if (current.getDefinition().isStackable() && player.getInventory().contains(current.getId(), 1)) { + currentSlot = -1; + } + } + if (current != null && !player.getInventory().add(current, true, inventorySlot)) { + player.getInventory().add(item); + player.getPacketDispatch().sendMessage("Not enough space in your inventory!"); + return false; + } + if (secondary != null && !player.getInventory().add(secondary)) { + if (current != null && currentSlot != -1) { + player.getInventory().remove(current, currentSlot, false); + } + player.getInventory().add(item); + player.getPacketDispatch().sendMessage("Not enough space in your inventory!"); + return false; + } + super.replace(item, slot, fire); + if (item.getSlot() == SLOT_WEAPON) { + player.getPacketDispatch().sendString(item.getName(), 92, 0); + } + if (secondary != null) { + super.remove(secondary); + } + return true; + } + + /** + * Listens to the equipment container. + * @author Emperor + */ + private static class EquipmentListener implements ContainerListener { + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@code EquipmentContainer} {@code Object}. + * @param player The player. + */ + public EquipmentListener(Player player) { + this.player = player; + } + + @Override + public void update(Container c, ContainerEvent event) { + int[] slots = event.getSlots(); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 387, 28, 94, event.getItems(), false, slots)); + update(c); + boolean updateDefenceAnimation = false; + for (int slot : slots) { + if (slot == EquipmentContainer.SLOT_WEAPON) { + player.getProperties().setAttackSpeed(c.getNew(slot).getDefinition().getConfiguration(ItemConfigParser.ATTACK_SPEED, 4)); + WeaponInterface inter = player.getExtension(WeaponInterface.class); + if (inter == null) { + break; + } + inter.updateInterface(); + updateDefenceAnimation = true; + } else if (slot == EquipmentContainer.SLOT_SHIELD) { + updateDefenceAnimation = true; + } + } + if (updateDefenceAnimation) { + player.getProperties().updateDefenceAnimation(); + } + } + + @Override + public void refresh(Container c) { + player.getProperties().setAttackSpeed(c.getNew(3).getDefinition().getConfiguration(ItemConfigParser.ATTACK_SPEED, 4)); + WeaponInterface inter = player.getExtension(WeaponInterface.class); + if (inter != null) { + inter.updateInterface(); + } + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 387, 28, 94, c.toArray(), 14, false)); + update(c); + player.getProperties().updateDefenceAnimation(); + } + + /** + * Updates the bonuses, weight, animations, ... + * @param c The container. + */ + public void update(Container c) { + if (c.getNew(SLOT_SHIELD).getId() != 11283 && player.getAttribute("dfs_spec", false)) { + player.removeAttribute("dfs_spec"); + player.getProperties().getCombatPulse().setHandler(null); + if (!player.getSettings().isSpecialToggled()) { + player.getConfigManager().set(301, 0); + } + } + player.getAppearance().setAnimations(); + player.getUpdateMasks().register(new AppearanceFlag(player)); + player.getSettings().updateWeight(); + updateBonuses(player); + } + } + + /** + * Updates the bonuses. + * @param player The player. + */ + public static void updateBonuses(Player player) { + int[] bonuses = new int[15]; + for (Item item : player.getEquipment().toArray()) { + if (item != null) { + int[] bonus = item.getDefinition().getConfiguration(ItemConfigParser.BONUS, new int[15]); + for (int i = 0; i < bonus.length; i++) { + if (i == 14 && bonuses[i] != 0) { + continue; + } + bonuses[i] += bonus[i]; + } + } + } + Item weapon = player.getEquipment().get(SLOT_WEAPON); + if(weapon != null && weapon.getDefinition().getRequirement(Skills.STRENGTH) > 0 && SkillcapePerks.isActive(SkillcapePerks.FINE_ATTUNEMENT,player)){ + int[] bonus = weapon.getDefinition().getConfiguration(ItemConfigParser.BONUS, new int[15]); + bonuses[11] += Math.ceil(bonus[11] * 0.20); + } + Item shield = player.getEquipment().get(SLOT_SHIELD); + if(shield != null && SkillcapePerks.isActive(SkillcapePerks.GRAND_BULLWARK,player)){ + bonuses[5] += Math.ceil(bonuses[5] * 0.20); + bonuses[6] += Math.ceil(bonuses[6] * 0.20); + bonuses[7] += Math.ceil(bonuses[7] * 0.20); + bonuses[9] += Math.ceil(bonuses[9] * 0.20); + } + if (shield != null && shield.getId() == 11283) { + int increase = shield.getCharge() / 20; + bonuses[5] += increase; + bonuses[6] += increase; + bonuses[7] += increase; + bonuses[9] += increase; + } + player.getProperties().setBonuses(bonuses); + update(player); + } + + /** + * Updates the equipment stats interface. + * @param player The player to update for. + */ + public static void update(Player player) { + if (!player.getInterfaceManager().hasMainComponent(667)) { + return; + } + PacketRepository.send(WeightUpdate.class, player.getPacketDispatch().getContext()); + int index = 0; + int[] bonuses = player.getProperties().getBonuses(); + for (int i = 36; i < 50; i++) { + if (i == 47) { + continue; + } + int bonus = bonuses[index]; + String bonusValue = bonus > -1 ? ("+" + bonus) : Integer.toString(bonus); + player.getPacketDispatch().sendString(BONUS_NAMES[index++] + bonusValue, 667, i); + } + player.getPacketDispatch().sendString("Attack bonus", 667, 34); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/container/impl/InventoryListener.java b/Server/src/main/java/Server/core/game/container/impl/InventoryListener.java new file mode 100644 index 000000000..727ad6f20 --- /dev/null +++ b/Server/src/main/java/Server/core/game/container/impl/InventoryListener.java @@ -0,0 +1,65 @@ +package core.game.container.impl; + +import core.game.container.Container; +import core.game.container.ContainerEvent; +import core.game.container.ContainerListener; +import core.game.node.entity.skill.summoning.SummoningPouch; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +/** + * Handles the inventory container listening. + * @author Emperor + */ +public final class InventoryListener implements ContainerListener { + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@code InventoryListener} {@code Object}. + * @param player The player. + */ + public InventoryListener(Player player) { + this.player = player; + } + + /** + * Updates the required settings etc for the player when the container + * updates. + * @param c The container. + */ + public void update(Container c) { + player.getSettings().updateWeight(); + boolean hadPouch = player.getFamiliarManager().isHasPouch(); + boolean pouch = false; + for (Item item : c.toArray()) { + if (item != null && SummoningPouch.get(item.getId()) != null) { + pouch = true; + break; + } + } + player.getFamiliarManager().setHasPouch(pouch); + if (hadPouch != pouch && player.getSkullManager().isWilderness()) { + player.getAppearance().sync(); + } + } + + @Override + public void refresh(Container c) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 149, 0, 93, c, false)); + update(c); + } + + @Override + public void update(Container c, ContainerEvent event) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 149, 0, 93, event.getItems(), false, event.getSlots())); + update(c); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/ActivityManager.java b/Server/src/main/java/Server/core/game/content/activity/ActivityManager.java new file mode 100644 index 000000000..5d30f18d6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/ActivityManager.java @@ -0,0 +1,79 @@ +package core.game.content.activity; + +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.world.GameWorld; + +import java.util.HashMap; +import java.util.Map; + +/** + * Manages the activities. + * @author Emperor + */ +public final class ActivityManager { + + /** + * The mapping of instanced activities. + */ + private static final Map ACTIVITIES = new HashMap<>(); + + /** + * Constructs a new {@code ActivityManager} {@code Object}. + */ + private ActivityManager() { + /* + * empty. + */ + } + + /** + * Registers an activity plugin. + * @param plugin The plugin to register. + */ + public static void register(ActivityPlugin plugin) { + plugin.register(); + ACTIVITIES.put(plugin.getName(), plugin); + if (!plugin.isInstanced()) { + plugin.configure(); + } + } + + /** + * Starts an instanced activity. + * @param player The player. + * @param name The name. + * @param login If we are logging in. + * @param args The arguments. + */ + public static boolean start(Player player, String name, boolean login, Object... args) { + ActivityPlugin plugin = ACTIVITIES.get(name); + if (plugin == null) { + if (GameWorld.getSettings().isDevMode()) { + SystemLogger.logErr("Unhandled activity - " + name + "!"); + } + return false; + } + try { + if (plugin.isInstanced()) { + (plugin = plugin.newInstance(player)).configure(); + } + return plugin.start(player, login, args); + } catch (Throwable e) { + e.printStackTrace(); + if (GameWorld.getSettings().isDevMode()) { + player.getPacketDispatch().sendMessage("Error starting activity " + (plugin == null ? null : plugin.getName()) + "!"); + } + } + return false; + } + + /** + * Gets the activity by the name. + * @param name the name. + * @return the activity. + */ + public static ActivityPlugin getActivity(String name) { + return ACTIVITIES.get(name); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/ActivityPlugin.java b/Server/src/main/java/Server/core/game/content/activity/ActivityPlugin.java new file mode 100644 index 000000000..fa16e9e49 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/ActivityPlugin.java @@ -0,0 +1,246 @@ +package core.game.content.activity; + +import core.ServerConstants; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.Region; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.zone.*; +import core.game.world.map.zone.impl.MultiwayCombatZone; +import core.plugin.Plugin; +import core.plugin.PluginManifest; +import core.plugin.PluginType; + +/** + * A plugin implementation used for activity plugins. + * @author Emperor + */ +@PluginManifest(type = PluginType.ACTIVITY) +public abstract class ActivityPlugin extends MapZone implements Plugin { + + /** + * If the activity is instanced. + */ + private boolean instanced; + + /** + * If the activity is multicombat. + */ + private boolean multicombat; + + /** + * If the activity is safe. + */ + private boolean safe; + + /** + * The region of the activity. + */ + protected DynamicRegion region; + + /** + * The base location. + */ + protected Location base; + + /** + * The player. + */ + protected Player player; + + /** + * Constructs a new {@code ActivityPlugin} {@code Object}. + * @param name The name. + * @param instanced If the activity is instanced. + * @param multicombat If the activity is multicombat. + * @param safe If the activity is safe (the player does not lose his/her + * items). + */ + public ActivityPlugin(String name, boolean instanced, boolean multicombat, boolean safe, ZoneRestriction... restrictions) { + super(name, true, ZoneRestriction.RANDOM_EVENTS); + for (ZoneRestriction restriction : restrictions) { + addRestriction(restriction.getFlag()); + } + this.instanced = instanced; + this.multicombat = multicombat; + this.safe = safe; + if (safe) { + setZoneType(ZoneType.SAFE.getId()); + } + } + + @Override + public void register(ZoneBorders borders) { + if (multicombat) { + MultiwayCombatZone.getInstance().register(borders); + } + super.register(borders); + } + + /** + * Sets the region base location. + */ + protected void setRegionBase() { + if (region != null) { + if (multicombat) { + region.toggleMulticombat(); + } + setBase(Location.create(region.getBorders().getSouthWestX(), region.getBorders().getSouthWestY(), 0)); + } + } + + /** + * Sets the region base for multiple regions. + * @param regions The regions. + */ + protected void setRegionBase(DynamicRegion[] regions) { + region = regions[0]; + Location l = region.getBaseLocation(); + for (DynamicRegion r : regions) { + if (r.getX() > l.getX() || r.getY() > l.getY()) { + l = r.getBaseLocation(); + } + } + ZoneBorders borders = new ZoneBorders(region.getX() << 6, region.getY() << 6, l.getX() + Region.SIZE, l.getY() + Region.SIZE); + RegionZone multiZone = multicombat ? new RegionZone(MultiwayCombatZone.getInstance(), borders) : null; + RegionZone zone = new RegionZone(this, borders); + for (DynamicRegion r : regions) { + if (multicombat) { + r.setMulticombat(true); + r.getRegionZones().add(multiZone); + } + r.getRegionZones().add(zone); + } + setBase(Location.create(borders.getSouthWestX(), borders.getSouthWestY(), 0)); + } + + /** + * Starts the activity for the player. + * @param player The player. + * @param login If the player is logging in. + * @param args The arguments. + * @return {@code True} if successfully started the activity. + */ + public boolean start(Player player, boolean login, Object... args) { + this.player = player; + return true; + } + + @Override + public boolean enter(Entity e) { + Location l; + if (e instanceof Player && (l = getSpawnLocation()) != null) { + e.getProperties().setSpawnLocation(l); + } + e.getProperties().setSafeZone(safe); + e.setAttribute("activity", this); + return super.enter(e); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + e.getProperties().setSpawnLocation(ServerConstants.HOME_LOCATION); + } + Location l; + if (instanced && logout && (l = getSpawnLocation()) != null) { + e.setLocation(l); + } + e.getProperties().setSafeZone(false); + e.removeAttribute("activity"); + return super.leave(e, logout); + } + + /** + * Method used to do anything on registration. + */ + public void register() { + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public abstract ActivityPlugin newInstance(Player p) throws Throwable; + + /** + * Gets the spawn location for this activity. + */ + public abstract Location getSpawnLocation(); + + /** + * Gets the instanced. + * @return The instanced. + */ + public boolean isInstanced() { + return instanced; + } + + /** + * Sets the instanced. + * @param instanced The instanced to set. + */ + public void setInstanced(boolean instanced) { + this.instanced = instanced; + } + + /** + * Gets the multicombat. + * @return The multicombat. + */ + public boolean isMulticombat() { + return multicombat; + } + + /** + * Sets the multicombat. + * @param multicombat The multicombat to set. + */ + public void setMulticombat(boolean multicombat) { + this.multicombat = multicombat; + } + + /** + * Gets the safe. + * @return The safe. + */ + public boolean isSafe() { + return safe; + } + + /** + * Sets the safe. + * @param safe The safe to set. + */ + public void setSafe(boolean safe) { + this.safe = safe; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the base. + * @return The base. + */ + public Location getBase() { + return base; + } + + /** + * Sets the base. + * @param base The base to set. + */ + public void setBase(Location base) { + this.base = base; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/CutscenePlugin.java b/Server/src/main/java/Server/core/game/content/activity/CutscenePlugin.java new file mode 100644 index 000000000..049026479 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/CutscenePlugin.java @@ -0,0 +1,336 @@ +package core.game.content.activity; + +import core.game.component.Component; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.PluginManifest; +import core.plugin.PluginType; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents the plugin used to handle a cutscene. + * @author Vexia + * @date 28/12/2013 + */ +@PluginManifest(type = PluginType.ACTIVITY) +public abstract class CutscenePlugin extends ActivityPlugin { + + /** + * The list of tabs to remove. + */ + private static final int[] TABS = new int[] { 0, 1, 2, 3, 4, 5, 6, 11, 12 }; + + /** + * The npcs in our cutscene. + */ + protected final List npcs = new ArrayList<>(); + + /** + * The start pulse used for effect. + */ + private final StartPulse startPulse = new StartPulse(); + + /** + * The ending pulse used for effect. + */ + private final EndPulse endPulse = new EndPulse(); + + /** + * If we should use a fade in or not. + */ + private final boolean fade; + + /** + * Constructs a new {@code CutscenePlugin} {@code Object}. + * @param name the name of the cutscene/mapzone. + * @param fade fading in or not. + */ + public CutscenePlugin(String name, final boolean fade) { + super(name, true, false, true); + this.fade = fade; + } + + /** + * Constructs a new {@code CutscenePlugin} {@code Object}. + * @param name the name. + */ + public CutscenePlugin(final String name) { + this(name, true); + } + + @Override + public boolean start(final Player player, boolean login, Object... args) { + player.setAttribute("cutscene:original-loc", player.getLocation()); + player.removeAttribute("real-end"); + player.setAttribute("real-end", player.getLocation()); + if (isFade()) { + GameWorld.getPulser().submit(getStartPulse()); + } else { + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, getMapState())); + player.getInterfaceManager().hideTabs(getRemovedTabs()); + player.getProperties().setTeleportLocation(getStartLocation()); + player.unlock(); + player.getWalkingQueue().reset(); + player.getLocks().lockMovement(1000000); + player.getInterfaceManager().close(); + open(); + } + player.lock(); + return super.start(player, login, args); + } + + @SuppressWarnings("deprecation") + @Override + public boolean leave(final Entity e, boolean logout) { + if (player != null) { + if (logout) { + player.setLocation(player.getAttribute("cutscene:original-loc", player.getLocation())); + end(); + } else { + unpause(); + } + player.unlock(); + player.getWalkingQueue().reset(); + player.getLocks().unlockMovement(); + } + return super.leave(e, logout); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Method used to stop the cutscene. + * @param fade if we should use a fade cutout. + */ + public void stop(boolean fade) { + if (fade) { + GameWorld.getPulser().submit(endPulse); + } else { + end(); + } + } + + /** + * Method used to end the cutscene. + */ + public void end() { + if (region != null) { + for (int i = 0; i < region.getPlanes().length; i++) { + for (NPC n : region.getPlanes()[i].getNpcs()) { + if (n == null) { + continue; + } + n.clear(); + } + } + } + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().restoreTabs(); + player.unlock();// incase he was locked. + player.getWalkingQueue().reset(); + } + + /** + * Represents the pulse used when starting a cutscene. This is used to give + * dramatic effect for entering a cutscene. In the future allow for this to + * be toggled. + * @author 'Vexia + * @date 30/12/2013 + */ + public class StartPulse extends Pulse { + + /** + * Represents the counter. + */ + private int counter = 0; + + /** + * Constructs a new {@code StartPulse} {@code Object}. + */ + public StartPulse() { + super(1, player); + } + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.lock(); + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 3: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, getMapState())); + player.getInterfaceManager().hideTabs(getRemovedTabs()); + break; + case 4: + player.getProperties().setTeleportLocation(getStartLocation()); + break; + case 5: + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().close(); + player.unlock(); + player.getWalkingQueue().reset(); + player.getLocks().lockMovement(1000000); + open(); + return true; + } + return false; + } + + } + + /** + * Represents the pulse used when ending a cutscene. This is used to give + * dramatic effect for entering a cutscene. + * @author 'Vexia + * @date 30/12/2013 + */ + public class EndPulse extends Pulse { + + /** + * Represents the counter. + */ + private int counter = 0; + + /** + * Constructs a new {@code EndPulse} {@code Object}. + */ + public EndPulse() { + super(1, player); + } + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.lock(); + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 3: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, getMapState())); + player.getInterfaceManager().hideTabs(getRemovedTabs()); + break; + case 4: + Location loc = (Location) (player.getAttribute("real-end", player.getAttribute("cutscene:original-loc", player.getLocation()))); + player.getProperties().setTeleportLocation(loc); + break; + case 5: + end(); + stop(); + fade();// specfic for fadeout. + if (player.getSession().isActive()) { + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + } + player.getInterfaceManager().closeOverlay(); + if (player.getSession().isActive()) { + player.getInterfaceManager().close(); + } + player.getProperties().setSafeZone(false); + return true; + } + return false; + } + + } + + /** + * Method called when the dim interface is closed. And you can see the + * cutscene. + */ + public void open() { + + } + + /** + * Method called on the end of the cutscene. + */ + public void fade() { + + } + + /** + * Gets the mapstate to use. (override if needed). + * @return the state. + */ + public int getMapState() { + return 2; + } + + /** + * Gets the removed tabs. (override if needed). + * @return the tabs. + */ + public int[] getRemovedTabs() { + return TABS; + } + + /** + * Gets the starting location (region based, override if needed). + * @return the location. + */ + public Location getStartLocation() { + return getBase(); + } + + /** + * Method used to unpause this cutscene. + */ + public final void unpause() { + stop(true); + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the region. + * @return The region. + */ + public DynamicRegion getRegion() { + return region; + } + + /** + * Gets the nPCS. + * @return The nPCS. + */ + public List getNPCS() { + return npcs; + } + + /** + * Gets the fade. + * @return The fade. + */ + public boolean isFade() { + return fade; + } + + /** + * Gets the start pulse. + * @return the pulse. + */ + public Pulse getStartPulse() { + return startPulse; + } + + public Pulse getEndPulse(){return new EndPulse();} +} diff --git a/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeacon.kt b/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeacon.kt new file mode 100644 index 000000000..bde82b31b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeacon.kt @@ -0,0 +1,73 @@ +package core.game.content.activity.allfiredup + +import core.game.node.entity.player.Player +import core.game.system.SystemLogger +import core.game.world.map.Location + +/** + * Various data for beacons, such as varp and offset, required FM level, etc + * @author Ceikry + */ +enum class AFUBeacon(val title: String, val fmLevel: Int, val varpId: Int, val offset: Int, val location: Location, val experience: Double, val keeper: Int = 0) { + RIVER_SALVE("",43,1283,0,Location.create(3396, 3464, 0),216.2,8065), + RAG_AND_BONE("",43,1283,3,Location.create(3343, 3510, 0),235.8,8066), + JOLLY_BOAR("",48,1283,6,Location.create(3278, 3525, 0), 193.8,8067), + NORTH_VARROCK_CASTLE("",53,1283,9,Location.create(3236, 3527, 0),178.5,8068), + GRAND_EXCHANGE("",59,1283,12,Location.create(3170, 3536, 0),194.3,8069), + EDGEVILLE("",62,1283,15,Location.create(3087, 3516, 0),86.7,8070), + MONASTERY("",68,1283,18,Location.create(3034, 3518, 0),224.4,8071), + GOBLIN_VILLAGE("",72,1283,21,Location.create(2968, 3516, 0),194.8,8072), + BURTHORPE("",76,1283,24,Location.create(2940, 3565, 0),195.3,8073), + DEATH_PLATEAU("",79,1288,0,Location.create(2944, 3622, 0),249.9,8074), + TROLLHEIM("",83,1288,3,Location.create(2939, 3680, 0),201.0,8075), + GWD("",87,1288,6,Location.create(2937, 3773, 0),255.0,8076), + TEMPLE("",89,1288,9,Location.create(2946, 3836, 0),198.9), + PLATEAU("",92,1288,12,Location.create(2964, 3931, 0),147.9); + + companion object { + fun forLocation(location: Location): AFUBeacon { + for (beacon in values()) { + if (beacon.location.equals(location)) return beacon + } + return RIVER_SALVE.also { SystemLogger.logWarn("Unhandled Beacon Location ${location.toString()}") } + } + + fun resetAllBeacons(player: Player){ + for(beacon in values()){ + player.varpManager.get(beacon.varpId).setVarbit(beacon.offset,0).send(player) + } + } + } + + fun light(player: Player){ + player.varpManager.get(varpId).setVarbit(offset,2).send(player) + } + + fun diminish(player: Player){ + player.varpManager.get(varpId).setVarbit(offset,3).send(player) + } + + fun extinguish(player: Player){ + player.varpManager.get(varpId).setVarbit(offset,0).send(player) + } + + fun lightGnomish(player: Player){ + player.varpManager.get(varpId).setVarbit(offset,4).send(player) + } + + fun fillWithLogs(player: Player){ + player.varpManager.get(varpId).setVarbit(offset,1).send(player) + } + + fun getState(player: Player): BeaconState{ + return BeaconState.values()[player.varpManager.get(varpId).getVarbit(offset)?.value ?: 0] + } +} + +enum class BeaconState{ + EMPTY, + FILLED, + LIT, + DYING, + WARNING +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeaconHandler.kt b/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeaconHandler.kt new file mode 100644 index 000000000..c2ec15b76 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUBeaconHandler.kt @@ -0,0 +1,229 @@ +package core.game.content.activity.allfiredup + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.skill.Skills + +private val VALID_LOGS = arrayOf(Items.LOGS_1511,Items.OAK_LOGS_1521,Items.WILLOW_LOGS_1519,Items.MAPLE_LOGS_1517,Items.YEW_LOGS_1515,Items.MAGIC_LOGS_1513) +private val FILL_ANIM = Animation(9136) +private val LIGHT_ANIM = Animation(7307) + +/** + * Handles interactions for beacons + * @author Ceikry + */ +@Initializable +class AFUBeaconHandler : OptionHandler(){ + override fun newInstance(arg: Any?): Plugin { + for(i in 38448..38461) + ObjectDefinition.forId(i).childrenIds.forEach { + ObjectDefinition.forId(it).handlers["option:add-logs"] = this + ObjectDefinition.forId(it).handlers["option:light"] = this + } + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + val beacon = AFUBeacon.forLocation(node.location) + val questComplete = player.questRepository.isComplete("All Fired Up") + val questStage = player.questRepository.getStage("All Fired Up") + + if ((beacon != AFUBeacon.RIVER_SALVE && beacon != AFUBeacon.RAG_AND_BONE && !questComplete) + || (beacon == AFUBeacon.RIVER_SALVE && questStage < 20 && !questComplete) + || (beacon == AFUBeacon.RAG_AND_BONE && questStage < 50 && !questComplete)) { + player.dialogueInterpreter.sendDialogues(player, FacialExpression.THINKING, "I probably shouldn't mess with this.") + return true + } + player.debug(beacon.getState(player).name) + + when (beacon.getState(player)) { + BeaconState.EMPTY -> fillBeacon(player, beacon, questComplete) + + BeaconState.DYING -> restoreBeacon(player, beacon, questComplete) + + BeaconState.FILLED -> lightBeacon(player, beacon, questComplete) + + BeaconState.LIT, BeaconState.WARNING -> { + player.debug("INVALID BEACON STATE") + } + } + return true + } + + fun fillBeacon(player: Player, beacon: AFUBeacon, questComplete: Boolean){ + + when(beacon){ + AFUBeacon.MONASTERY -> { + if(player.skills.getLevel(Skills.PRAYER) < 31){ + player.dialogueInterpreter.sendDialogues(NPC(beacon.keeper).getShownNPC(player),FacialExpression.ANGRY,"You must join the monastery to light this beacon!") + return + } + } + + AFUBeacon.GWD -> { + if(!AFURepairClimbHandler.isRepaired(player,beacon)){ + player.dialogueInterpreter.sendDialogue("You must repair the windbreak before you","can light this beacon.") + return + } + } + + AFUBeacon.GOBLIN_VILLAGE -> { + if(!player.questRepository.isComplete("Lost Tribe")){ + player.dialogueInterpreter.sendDialogues(NPC(beacon.keeper).getShownNPC(player),FacialExpression.THINKING,"We no trust you outsider. You no light our beacon.","(Complete Lost Tribe to use this beacon.)") + return + } + } + + } + + if(player.skills.getLevel(Skills.FIREMAKING) < beacon.fmLevel){ + player.dialogueInterpreter.sendDialogue("You need ${beacon.fmLevel} Firemaking to light this beacon.") + return + } + + val logs = getLogs(player,20) + if (logs.id != 0 && player.inventory.remove(logs)) { + player.lock() + + var session: AFUSession? = null + if(questComplete){ + session = player.getAttribute("afu-session", null) + if(session == null) { + session = AFUSession(player) + session.init() + } + } + + GameWorld.Pulser.submit(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 0 -> player.animator.animate(FILL_ANIM) + 1 -> { + beacon.fillWithLogs(player) + if(questComplete){ + session?.setLogs(beacon.ordinal,logs) + } + player.varpManager.flagSave(beacon.varpId); + } + 2 -> player.unlock().also {player.animator.animate(Animation.RESET); return true } + } + return false + } + }) + } else { + player.dialogueInterpreter.sendDialogue("You need some logs to do this.") + } + } + + fun lightBeacon(player: Player,beacon: AFUBeacon, questComplete: Boolean){ + var session: AFUSession? = null + if(questComplete){ + session = player.getAttribute("afu-session",null) + if(session == null) return + } + + if(player.inventory.contains(Items.TINDERBOX_590,1)){ + player.lock() + GameWorld.Pulser.submit(object: Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.animator.animate(LIGHT_ANIM) + 1 -> { + beacon.light(player) + if(questComplete){ + session?.startTimer(beacon.ordinal) + if(session?.getLitBeacons() == 6 && !player.hasFireRing()){ + player.sendMessage("Congratulations on lighting 6 beacons at once! King Roald has something for you.") + player.setAttribute("/save:afu-mini:ring",true) + } + if(session?.getLitBeacons() == 10 && !player.hasFlameGloves()){ + player.sendMessage("Congratulations on lighting 10 beacons at once! King Roald has something for you.") + player.setAttribute("/save:afu-mini:gloves",true) + } + if(session?.getLitBeacons() == 14 && !player.hasInfernoAdze()){ + player.sendMessage("Congratulations on lighting all 14 beacons! King Roald has something special for you.") + player.setAttribute("/save:afu-mini:adze",true) + } + var experience = beacon.experience + experience += session?.getBonusExperience() ?: 0.0 + player.skills.addExperience(Skills.FIREMAKING,experience) + } else { + player.questRepository.getQuest("All Fired Up").setStage(player, player.questRepository.getStage("All Fired Up") + 10) + } + } + 2 -> player.unlock().also { return true } + } + return false + } + }) + } else { + player.dialogueInterpreter.sendDialogue("You need a tinderbox to light this.") + } + } + + fun restoreBeacon(player: Player,beacon: AFUBeacon, questComplete: Boolean){ + var session: AFUSession? = null + if(questComplete){ + session = player.getAttribute("afu-session",null) + if(session == null) return + } + + val logs = getLogs(player, 5) + if (logs.id != 0 && player.inventory.remove(logs)) { + player.lock() + GameWorld.Pulser.submit(object: Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.animator.animate(FILL_ANIM) + 1 -> beacon.light(player).also { + if(questComplete){ + session?.refreshTimer(beacon,logs.id) + } else { + player.questRepository.getQuest("All Fired Up").setStage(player, 80) + } + } + 2 -> player.unlock().also { return true } + } + return false + } + }) + } else { + player.dialogueInterpreter.sendDialogue("You need some logs to do this.") + } + } + + fun getLogs(player: Player, amount: Int): Item{ + var logId = 0 + for (log in VALID_LOGS) if (player.inventory.getAmount(log) >= amount) {logId = log; break} + return Item(logId,amount) + } + + fun Player.hasFireRing(): Boolean{ + return inventory.containsItem(Item(Items.RING_OF_FIRE_13659)) || bank.containsItem(Item(Items.RING_OF_FIRE_13659)) || equipment.containsItem(Item(Items.RING_OF_FIRE_13659)) + } + + fun Player.hasFlameGloves(): Boolean{ + return inventory.containsItem(Item(Items.FLAME_GLOVES_13660)) || bank.containsItem(Item(Items.FLAME_GLOVES_13660)) || equipment.containsItem(Item(Items.FLAME_GLOVES_13660)) + } + + fun Player.hasInfernoAdze(): Boolean{ + return inventory.containsItem(Item(Items.INFERNO_ADZE_13661)) || bank.containsItem(Item(Items.INFERNO_ADZE_13661)) || equipment.containsItem(Item(Items.INFERNO_ADZE_13661)) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFURepairClimbHandler.kt b/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFURepairClimbHandler.kt new file mode 100644 index 000000000..d589ce7bb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFURepairClimbHandler.kt @@ -0,0 +1,145 @@ +package core.game.content.activity.allfiredup + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.impl.ForceMovement +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.map.Direction +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.construction.NailType +import java.util.* + +/** + * Handles repairing and climbing of the 3 beacon shortcuts needed to access them + * @author Ceikry + */ +@Initializable +class AFURepairClimbHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(38480).handlers["option:repair"] = this + ObjectDefinition.forId(38470).handlers["option:repair"] = this + ObjectDefinition.forId(38494).handlers["option:repair"] = this + ObjectDefinition.forId(38469).handlers["option:climb"] = this + ObjectDefinition.forId(38471).handlers["option:climb"] = this + ObjectDefinition.forId(38486).handlers["option:climb"] = this + ObjectDefinition.forId(38481).handlers["option:climb"] = this + ObjectDefinition.forId(38469).handlers["option:climb"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + var rco: RepairClimbObject = RepairClimbObject.GWD + for(ent in RepairClimbObject.values()) if(ent.destinationDown?.withinDistance(player.location,2) == true || ent.destinationUp?.withinDistance(player.location,2) == true) rco = ent + + if(option.equals("repair")) repair(player,rco) else climb(player,rco,node.location) + return true + } + + private fun repair(player: Player,rco: RepairClimbObject){ + val skill = rco.levelRequirement?.first ?: 0 + val level = rco.levelRequirement?.second ?: 0 + if(player.skills.getLevel(skill) < level){ + player.dialogueInterpreter.sendDialogue("You need level $level ${Skills.SKILL_NAME[skill]} for this.") + return + } + + var requiresNeedle = false + + val requiredItems = when(rco){ + RepairClimbObject.DEATH_PLATEAU -> { + arrayOf(Item(Items.PLANK_960,2)) + } + + RepairClimbObject.BURTHORPE -> { + arrayOf(Item(Items.IRON_BAR_2351,2)) + } + + RepairClimbObject.GWD -> { + requiresNeedle = true + arrayOf(Item(Items.JUTE_FIBRE_5931,3)) + } + + RepairClimbObject.TEMPLE -> { + arrayOf(Item(Items.IRON_BAR_2351,2)) + } + } + + if(requiresNeedle){ + if(player.inventory.containsItem(Item(Items.NEEDLE_1733)) && player.inventory.containItems(*requiredItems.map { it.id }.toIntArray())) { + player.inventory.remove(*requiredItems) + if (Random().nextBoolean()) player.inventory.remove(Item(Items.NEEDLE_1733)) + } else { + player.dialogueInterpreter.sendDialogue("You need a needle and ${requiredItems.map { "${it.amount} ${it.name.toLowerCase()}s" }.toString().replace("[","").replace("]","")} for this.") + return + } + } else { + if(player.inventory.containsItem(Item(Items.HAMMER_2347)) && player.inventory.containItems(*requiredItems.map { it.id }.toIntArray())) { + val nails = NailType.get(player,4) + if(nails == null && rco == RepairClimbObject.DEATH_PLATEAU){ + player.dialogueInterpreter.sendDialogue("You need 4 nails for this.") + return + } else if (rco == RepairClimbObject.DEATH_PLATEAU){ + player.inventory.remove(Item(nails.itemId,4)) + } + player.inventory.remove(*requiredItems) + } else { + player.dialogueInterpreter.sendDialogue("You need a hammer and ${requiredItems.map { "${it.amount} ${it.name.toLowerCase()}s" }.toString().replace("[","").replace("]","")} for this.") + return + } + } + + player.varpManager.get(rco.varp).setVarbit(rco.offset,1).send(player) + player.varpManager.flagSave(rco.varp) + } + + private fun climb(player: Player, rco: RepairClimbObject, location: Location){ + ForceMovement.run(player,location,rco.getOtherLocation(player),rco.getAnimation(player),rco.getAnimation(player),rco.getDirection(player),20).endAnimation = Animation(-1) + } + + private enum class RepairClimbObject(val varp: Int, val offset: Int, val destinationUp: Location?, val destinationDown: Location?, val levelRequirement: Pair?){ + DEATH_PLATEAU(1282,15,Location.create(2949, 3623, 0),Location.create(2954, 3623, 0), Pair(Skills.CONSTRUCTION,42)), + BURTHORPE(1282,14,Location.create(2941, 3563, 0),Location.create(2934, 3563, 0),Pair(Skills.SMITHING,56)), + GWD(1283,27,null,null,Pair(Skills.CRAFTING,60)), + TEMPLE(1287,29,Location.create(2949, 3835, 0),Location.create(2956, 3835, 0),Pair(Skills.SMITHING,64)); + + fun getOtherLocation(player: Player): Location?{ + if(player.location == destinationDown) return destinationUp + else return destinationDown + } + + fun getAnimation(player: Player): Animation { + if(getOtherLocation(player) == destinationDown) return Animation(1148) + else return Animation(740) + } + + fun getDirection(player: Player): Direction { + if(this == BURTHORPE){ + return Direction.EAST + } else return Direction.WEST + } + + fun isRepaired(player: Player): Boolean{ + return player.varpManager.get(varp).getVarbit(offset)?.value == 1 + } + } + + companion object { + fun isRepaired(player: Player, beacon: AFUBeacon): Boolean{ + if(beacon == AFUBeacon.DEATH_PLATEAU) return RepairClimbObject.DEATH_PLATEAU.isRepaired(player) + if(beacon == AFUBeacon.BURTHORPE) return RepairClimbObject.BURTHORPE.isRepaired(player) + if(beacon == AFUBeacon.GWD) return RepairClimbObject.GWD.isRepaired(player) + if(beacon == AFUBeacon.TEMPLE) return RepairClimbObject.TEMPLE.isRepaired(player) + else return true + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUSession.kt b/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUSession.kt new file mode 100644 index 000000000..773ee390a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/allfiredup/AFUSession.kt @@ -0,0 +1,131 @@ +package core.game.content.activity.allfiredup + +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.plugin.Plugin +import core.tools.Items +import core.tools.stringtools.colorize + +/** + * Handles keeping track of lit beacons and their burn time remaining + * @author Ceikry + */ +class AFUSession(val player: Player) { + private val beaconTimers = Array(14){i -> BeaconTimer(0,AFUBeacon.values()[i])} + private val logInventories = Array(14){Item(0,0)} + private val beaconWatched = Array(14){false} + private var isActive = false + + fun init() { + isActive = true + GameWorld.Pulser.submit(object: Pulse(){ + override fun pulse(): Boolean { + player.setAttribute("afu-pulse",this) + beaconTimers.forEach {timer -> + timer.ticks-- + if(timer.ticks == 300) timer.beacon.diminish(player).also { + if(beaconWatched[timer.beacon.ordinal]){ + beaconWatched[timer.beacon.ordinal] = false + timer.ticks += (getTicks(logInventories[timer.beacon.ordinal].id) * 5) + timer.beacon.light(player) + player.sendMessage(colorize("%RThe ${timer.beacon.name.toLowerCase().replace("_"," ")} watcher has used your backup logs.")) + } else { + player.sendMessage(colorize("%RThe ${timer.beacon.name.toLowerCase().replace("_", " ")} beacon is dying!")) + } + } + if(timer.ticks == 0) timer.beacon.extinguish(player).also { player.sendMessage(colorize("%RThe ${timer.beacon.name.toLowerCase().replace("_"," ")} beacon has gone out!")) } + } + return !isActive + } + }) + player.setAttribute("afu-session",this) + player.logoutPlugins.add(AFULogoutPlugin()) + } + + fun getLitBeacons(): Int{ + return beaconTimers.count { it.ticks > 0 } + } + + fun end(){ + isActive = false + } + + fun setLogs(beaconIndex: Int, logs: Item){ + logInventories[beaconIndex] = logs + } + + fun startTimer(beaconIndex: Int){ + val ticks = getTicks(logInventories[beaconIndex].id) * 20 + logInventories[beaconIndex] = Item(0,0) + beaconTimers[beaconIndex].ticks = ticks + } + + fun refreshTimer(beacon: AFUBeacon, logID: Int){ + val ticks = getTicks(logID) * 5 + beaconTimers.forEach { + if(it.beacon.ordinal == beacon.ordinal) it.ticks += ticks + } + } + + fun setWatcher(index: Int, logs: Item){ + beaconWatched[index] = true + logInventories[index] = logs + } + + fun isWatched(index: Int): Boolean{ + return beaconWatched[index] + } + + fun getTicks(logID: Int): Int{ + val ticks = when(logID){ + Items.LOGS_1511 -> 65 + Items.OAK_LOGS_1521 -> 68 + Items.WILLOW_LOGS_1519 -> 73 + Items.MAPLE_LOGS_1517 -> 79 + Items.YEW_LOGS_1515 -> 83 + Items.MAGIC_LOGS_1513 -> 90 + else -> 0 + } + return ticks + } + + fun getBonusExperience(): Double{ + return when(getLitBeacons()){ + 1 -> 608.4 + 2 -> 1622.4 + 3 -> 1987.4 + 4 -> 2149.6 + 5 -> 2149.6 + 6 -> 2514.6 + 7 -> 2555.2 + 8 -> 2758.0 + 9 -> 2839.1 + 10 -> 3041.9 + 11 -> 3123.0 + 12 -> 3244.7 + 13 -> 3366.4 + 14 -> 4867.4 + else -> 0.0 + } + } + + internal class BeaconTimer(var ticks: Int, val beacon: AFUBeacon) + + class AFULogoutPlugin: Plugin { + override fun newInstance(arg: Player?): Plugin { + arg ?: return this + AFUBeacon.resetAllBeacons(arg) + val session: AFUSession? = arg.getAttribute("afu-session",null) + session?.end() + arg.removeAttribute("afu-session") + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/allfiredup/BeaconTenderDialogue.kt b/Server/src/main/java/Server/core/game/content/activity/allfiredup/BeaconTenderDialogue.kt new file mode 100644 index 000000000..ba8b09a4c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/allfiredup/BeaconTenderDialogue.kt @@ -0,0 +1,91 @@ +package core.game.content.activity.allfiredup + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.tools.Items +import core.game.content.dialogue.DialoguePlugin +import core.game.node.entity.skill.Skills + +private val VALID_LOGS = arrayOf(Items.LOGS_1511, Items.OAK_LOGS_1521, Items.WILLOW_LOGS_1519, Items.MAPLE_LOGS_1517, Items.YEW_LOGS_1515, Items.MAGIC_LOGS_1513) + +@Initializable +//TODO: Add requirements for beacon keepers to watch beacons, most of the requirements were not possible to implement at the time of writing this. +class BeaconTenderDialogue(player: Player? = null) : DialoguePlugin(player) { + var index = 0 + + override fun newInstance(player: Player?): DialoguePlugin { + return BeaconTenderDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + index = getIndexOf((args[0] as NPC).originalId) + if(index == AFUBeacon.GWD.ordinal && player.skills.getLevel(Skills.SUMMONING) < 81){ + npc("Awwf uurrrhur","(You need 81 Summoning to communicate with Nanuq.)") + stage = 1000 + return true + } + if(index == AFUBeacon.MONASTERY.ordinal && player.skills.getLevel(Skills.PRAYER) < 53){ + npc("I will aid you when your devotion is","strong enough.","(You need 53 Prayer for him to watch the beacon.)") + stage = 1000 + return true + } + npc = (args[0] as NPC).getShownNPC(player) + npc("Hello, adventurer.") + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + val beacon = AFUBeacon.values()[index] + val logs = getLogs(player,5) + val session: AFUSession? = player.getAttribute("afu-session",null) + when(stage){ + 0 -> player("Hello!").also { stage++ } + 1 -> if(beacon.getState(player) == BeaconState.LIT && session?.isWatched(index) == false){ + options("Can you watch this beacon for me?","Nevermind.").also { stage = 10 } + } else { + npc("Carry on, adventurer.").also { stage = 1000 } + } + 10 -> when(buttonId){ + 1 -> player("Can you watch this beacon for me?").also { stage++ } + 2 -> player("Nevermind.").also { stage = 1000 } + } + 11 -> npc("Certainly, adventurer. Do you have logs for me?").also { stage++ } + 12 -> if(logs.id != 0){ + player("Yes, I do!").also { stage++ } + } else { + player("No, I don't.").also { stage = 1000 } + } + 13 -> npc("Great, hand them over.").also { stage++ } + 14 -> player("Here you go!").also { + player.inventory.remove(logs) + session?.setWatcher(index,logs) + stage = 1000 + } + + 1000 -> end() + } + return true + } + + fun getIndexOf(id: Int): Int{ + if(id == 8065) return 0 + if(id == 8066) return 1 + for(index in ids.indices){ + if(ids[index] == id) return index + 2 + } + return -1 + } + + fun getLogs(player: Player, amount: Int): Item { + var logId = 0 + for (log in VALID_LOGS) if (player.inventory.getAmount(log) >= amount) {logId = log; break} + return Item(logId,amount) + } + + override fun getIds(): IntArray { + return intArrayOf(8067,8068,8069,8070,8071,8072,8073,8074,8075,8076) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowBrother.java b/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowBrother.java new file mode 100644 index 000000000..e46c2cda9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowBrother.java @@ -0,0 +1,126 @@ +package core.game.content.activity.barrows; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Handles a barrow brother NPC. + * @author Emperor + */ +public final class BarrowBrother extends NPC { + + /** + * The player to target. + */ + private final Player player; + + /** + * Constructs a new {@code BarrowBrother} {@code Object}. + * @param player The target. + * @param id The NPC id. + * @param location The location. + */ + public BarrowBrother(Player player, int id, Location location) { + super(id, location); + this.player = player; + } + + @Override + public void init() { + super.init(); + super.setRespawn(false); + if (location.getZ() == 3) { + sendChat("You dare disturb my rest!"); + } else { + sendChat("You dare steal from us!"); + } + getProperties().getCombatPulse().attack(player); + HintIconManager.registerHintIcon(player, this); + } + + @Override + public void handleTickActions() { + if (DeathTask.isDead(player)) { + return; + } + if (!player.isActive() || !player.getLocation().withinDistance(location)) { + clear(); + return; + } + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + + @Override + public void sendImpact(BattleState state) { + int maxHit = 0; + switch (getId()) { + case 2025:// ahrim + maxHit = 25; + break; + case 2026:// dharok + maxHit = 60; + break; + case 2027:// guthan + maxHit = 24; + break; + case 2028:// karil + maxHit = 20; + break; + case 2029:// torag + maxHit = 23; + break; + case 2030:// verac + maxHit = 25; + break; + } + if (state.getEstimatedHit() > maxHit) { + state.setEstimatedHit(RandomFunction.random(maxHit - 10, maxHit)); + } + if (state.getSecondaryHit() > maxHit) { + state.setSecondaryHit(RandomFunction.random(maxHit - 10, maxHit)); + } + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer == player) { + player.getSavedData().getActivityData().getBarrowBrothers()[getBrotherIndex()] = true; + BarrowsActivityPlugin.sendConfiguration(player); + } + } + + @Override + public void clear() { + super.clear(); + if (player.isActive()) { + player.getHintIconManager().clear(); + } + player.removeAttribute("barrow:npc"); + player.removeAttribute("brother:" + getBrotherIndex()); + } + + /** + * Gets the barrow brother index. + * @return The index. + */ + private int getBrotherIndex() { + return getId() - 2025; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowsActivityPlugin.java b/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowsActivityPlugin.java new file mode 100644 index 000000000..8e3a3b711 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowsActivityPlugin.java @@ -0,0 +1,375 @@ +package core.game.content.activity.barrows; + +import core.game.component.Component; +import core.game.content.activity.ActivityPlugin; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.npc.agg.AggressiveBehavior; +import core.game.node.entity.npc.agg.AggressiveHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.ActivityData; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.net.packet.out.MinimapState; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the barrows activity plugin. + * @author Emperor + */ +@Initializable +public final class BarrowsActivityPlugin extends ActivityPlugin { + + /** + * The tunnel configuration values. + */ + private static final int[] TUNNEL_CONFIGS = { 55328769, 2867201, 44582944, 817160, 537688072, 40763408, 44320784, 23478274 }; + + /** + * Represents the tunnels between 2 rooms in the barrows tunnels. + */ + public static final ZoneBorders[] MINI_TUNNELS = { + new ZoneBorders(3532, 9665, 3570, 9671), + new ZoneBorders(3575, 9676, 3570, 9671), + new ZoneBorders(3575, 9676, 3581, 9714), + new ZoneBorders(3534, 9718, 3570, 9723), + new ZoneBorders(3523, 9675, 3528, 9712), + new ZoneBorders(3541, 9711, 3545, 9712), + new ZoneBorders(3558, 9711, 3562, 9712), + new ZoneBorders(3568, 9701, 3569, 9705), + new ZoneBorders(3551, 9701, 3552, 9705), + new ZoneBorders(3534, 9701, 3535, 9705), + new ZoneBorders(3541, 9694, 3545, 9695), + new ZoneBorders(3558, 9694, 3562, 9695), + new ZoneBorders(3568, 9684, 3569, 9688), + new ZoneBorders(3551, 9684, 3552, 9688), + new ZoneBorders(3534, 9684, 3535, 9688), + new ZoneBorders(3541, 9677, 3545, 9678), + new ZoneBorders(3558, 9677, 3562, 9678), + }; + + /** + * The overlay. + */ + private static final Component OVERLAY = new Component(24); + + /** + * The activity handling pulse. + */ + private static final Pulse PULSE = new Pulse(3) { + @Override + public boolean pulse() { + boolean end = true; + for (Player p : RegionManager.getRegionPlayers(14231)) { + end = false; + int index = p.getAttribute("barrow:drain-index", -1); + if (index > -1) { + p.removeAttribute("barrow:drain-index"); + p.getPacketDispatch().sendItemOnInterface(-1, 1, 24, index); + continue; + } + if (p.getLocation().getZ() == 0 && p.getAttribute("barrow:looted", false)) { + if (RandomFunction.random(15) == 0) { + p.getImpactHandler().manualHit(p, RandomFunction.random(5), HitsplatType.NORMAL); + Graphics.send(Graphics.create(405), p.getLocation()); + } + } + if (p.getLocks().isLocked("barrow:drain") || RandomFunction.random(100) % 2 == 0) { + continue; + } + int drain = 8; + for (boolean killed : p.getSavedData().getActivityData().getBarrowBrothers()) { + if (killed) { + drain += 1; + } + } + p.getSkills().decrementPrayerPoints(drain); + p.getLocks().lock("barrow:drain", (3 + RandomFunction.random(15)) * 3); + index = 1 + RandomFunction.random(6); + p.setAttribute("barrow:drain-index", index); + p.getPacketDispatch().sendItemZoomOnInterface(4761 + RandomFunction.random(12), 100, 24, index); + p.getPacketDispatch().sendAnimationInterface(9810, 24, index); + } + return end; + } + }; + + /** + * Constructs a new {@code BarrowsActivityPlugin} {@code Object}. + */ + public BarrowsActivityPlugin() { + super("Barrows", false, false, false); + } + + @Override + public void locationUpdate(Entity e, Location last) { + if (e instanceof Player && e.getViewport().getRegion().getId() == 14231) { + boolean tunnel = false; + for (ZoneBorders border : MINI_TUNNELS) { + if (border.insideBorder(e)) { + tunnel = true; + break; + } + } + Player player = (Player) e; + if ((player.getConfigManager().get(1270) == 1) != tunnel) { + player.getConfigManager().set(1270, tunnel ? 3 : 0, true);//@emp: proper value seems to be 3, val of 1 makes corridors black + } + } + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player player = (Player) e; + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getInterfaceManager().openOverlay(OVERLAY); + player.getConfigManager().set(0, 1); + if (player.getConfigManager().get(452) == 0) { + shuffleCatacombs(player); + } + sendConfiguration(player); + if (!PULSE.isRunning()) { + PULSE.restart(); + PULSE.start(); + GameWorld.getPulser().submit(PULSE); + } + } else { + ((NPC) e).setAggressive(true); + ((NPC) e).setAggressiveHandler(new AggressiveHandler(e, new AggressiveBehavior() { + @Override + public boolean canSelectTarget(Entity entity, Entity target) { + if (!target.isActive() || DeathTask.isDead(target)) { + return false; + } + if (!target.getProperties().isMultiZone() && target.inCombat()) { + return false; + } + return true; + } + })); + } + return super.enter(e); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player player = (Player) e; + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().closeOverlay(); + NPC npc = player.getAttribute("barrow:npc"); + if (npc != null && !DeathTask.isDead(npc)) { + npc.clear(); + } + player.removeAttribute("barrow:solvedpuzzle"); + player.removeAttribute("barrow:opened_chest"); + player.removeAttribute("crusade-delay"); + if (!logout && player.getAttribute("barrow:looted", false)) { + for (int i = 0; i < 6; i++) { + player.removeAttribute("brother:" + i); + player.getSavedData().getActivityData().getBarrowBrothers()[i] = false; + } + player.removeAttribute("barrow:looted"); + shuffleCatacombs(player); + player.getSavedData().getActivityData().setBarrowTunnelIndex(RandomFunction.random(6)); + player.getSavedData().getActivityData().setBarrowKills(0); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 0, 0)); + } + } + return super.leave(e, logout); + } + + /** + * "Shuffles" the catacomb gates. + * @param player The player. + */ + public static void shuffleCatacombs(Player player) { + int value = TUNNEL_CONFIGS[RandomFunction.random(TUNNEL_CONFIGS.length)]; + value |= 1 << (6 + RandomFunction.random(4)); + player.getConfigManager().set(452, value); + } + + @Override + public boolean death(Entity e, Entity killer) { + Player player = null; + if (killer instanceof Player) { + player = (Player) killer; + } else if (killer instanceof Familiar) { + player = ((Familiar) killer).getOwner(); + } + if (player != null && e instanceof NPC) { + player.getSavedData().getActivityData().setBarrowKills(player.getSavedData().getActivityData().getBarrowKills() + 1); + sendConfiguration(player); + } + return false; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GameObject) { + GameObject object = (GameObject) target; + Player player = (Player) e; + if (object.getId() >= 6702 && object.getId() <= 6707) { + ClimbActionHandler.climb((Player) e, ClimbActionHandler.CLIMB_UP, BarrowsCrypt.getCrypt(object.getId() - 6702).getExitLocation()); + return true; + } + if (object.getId() >= 6708 && object.getId() <= 6712) { + ClimbActionHandler.climb((Player) e, ClimbActionHandler.CLIMB_UP, BarrowsCrypt.getCrypt(player.getSavedData().getActivityData().getBarrowTunnelIndex()).getEnterLocation()); + return true; + } + switch (object.getWrapper().getId()) { + case 6727: + case 6724: + case 6746: + case 6743: + if (player.getAttribute("barrow:solvedpuzzle", false)) { + break; + } + player.setAttribute("barrow:puzzledoor", object); + BarrowsPuzzle.open(player); + return true; + } + switch (object.getId()) { + case 6714: + case 6733: + int index = -1; + for (int i = 0; i < player.getSavedData().getActivityData().getBarrowBrothers().length; i++) { + if (!player.getSavedData().getActivityData().getBarrowBrothers()[i] && RandomFunction.random(15) == 0 && !player.getAttribute("brother:" + i, false)) { + index = i; + break; + } + } + if (index > -1) { + BarrowsCrypt.getCrypt(index).spawnBrother(player, RegionManager.getTeleportLocation(target.getLocation(), 1)); + } + DoorActionHandler.handleAutowalkDoor(e, (GameObject) target); + return true; + case 6821: + BarrowsCrypt.getCrypt(BarrowsCrypt.AHRIM).openSarcophagus((Player) e, object); + return true; + case 6771: + BarrowsCrypt.getCrypt(BarrowsCrypt.DHAROK).openSarcophagus((Player) e, object); + return true; + case 6773: + BarrowsCrypt.getCrypt(BarrowsCrypt.GUTHAN).openSarcophagus((Player) e, object); + return true; + case 6822: + BarrowsCrypt.getCrypt(BarrowsCrypt.KARIL).openSarcophagus((Player) e, object); + return true; + case 6772: + BarrowsCrypt.getCrypt(BarrowsCrypt.TORAG).openSarcophagus((Player) e, object); + return true; + case 6823: + BarrowsCrypt.getCrypt(BarrowsCrypt.VERAC).openSarcophagus((Player) e, object); + return true; + case 6774: + player.lock(1); + for (int i = 0; i < player.getSavedData().getActivityData().getBarrowBrothers().length; i++) { + if (!player.getSavedData().getActivityData().getBarrowBrothers()[i] && !player.getAttribute("brother:" + i, false)) { + BarrowsCrypt.getCrypt(i).spawnBrother(player, RegionManager.getTeleportLocation(target.getCenterLocation(), 4)); + } + } + player.setAttribute("barrow:opened_chest", true); + sendConfiguration(player); + return true; + case 6775: + if (option.getName().equals("Close")) { + player.removeAttribute("barrow:opened_chest"); + sendConfiguration(player); + return true; + } + if (player.getAttribute("barrow:looted", false)) { + player.getPacketDispatch().sendMessage("The chest is empty."); + return true; + } + player.setAttribute("/save:barrow:looted",true); + RewardChest.reward(player); + //PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.SHAKE, 3, 2, 2, 2, 2)); + return true; + } + } + return false; + } + + /** + * Sends the kill count configuration. + * @param player The player. + */ + public static void sendConfiguration(Player player) { + ActivityData data = player.getSavedData().getActivityData(); + int config = data.getBarrowKills() << 17; + for (int i = 0; i < data.getBarrowBrothers().length; i++) { + if (data.getBarrowBrothers()[i]) { // This actually wasn't in 498 + // but we'll keep it anyways. + config |= 1 << i; + } + } + if (player.getAttribute("barrow:opened_chest", false)) { + config |= 1 << 16; + } + player.getConfigManager().set(453, config); + } + + @Override + public boolean actionButton(Player player, int interfaceId, int buttonId, int slot, int itemId, int opcode) { + return false; + } + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (target instanceof BarrowBrother) { + Player p = null; + if (e instanceof Player) { + p = (Player) e; + } else if (e instanceof Familiar) { + p = ((Familiar) e).getOwner(); + } + if (p != null && p != ((BarrowBrother) target).getPlayer()) { + p.getPacketDispatch().sendMessage("He's not after you."); + return false; + } + } + return super.continueAttack(e, target, style, message); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return this; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + PluginManager.definePlugin(new TunnelEntranceDialogue()); + PluginManager.definePlugin(BarrowsPuzzle.SHAPES); + registerRegion(14231); + BarrowsCrypt.init(); + PULSE.stop(); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowsCrypt.java b/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowsCrypt.java new file mode 100644 index 000000000..e891dab32 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowsCrypt.java @@ -0,0 +1,191 @@ +package core.game.content.activity.barrows; + +import core.game.content.global.action.DigAction; +import core.game.content.global.action.DigSpadeHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; + +/** + * Handles a barrows crypt. + * @author Emperor + */ +public final class BarrowsCrypt { + + /** + * The ahrim barrows crypt index. + */ + public static final int AHRIM = 0; + + /** + * The dharok barrows crypt index. + */ + public static final int DHAROK = 1; + + /** + * The guthan barrows crypt index. + */ + public static final int GUTHAN = 2; + + /** + * The karil barrows crypt index. + */ + public static final int KARIL = 3; + + /** + * The torag barrows crypt index. + */ + public static final int TORAG = 4; + + /** + * The verac barrows crypt index. + */ + public static final int VERAC = 5; + + /** + * The barrows crypts. + */ + private static final BarrowsCrypt[] CRYPTS = { new BarrowsCrypt(AHRIM, 2025, Location.create(3557, 9703, 3), Location.create(3565, 3289, 0)), new BarrowsCrypt(DHAROK, 2026, Location.create(3556, 9718, 3), Location.create(3575, 3298, 0)), new BarrowsCrypt(GUTHAN, 2027, Location.create(3534, 9704, 3), Location.create(3577, 3283, 0)), new BarrowsCrypt(KARIL, 2028, Location.create(3546, 9684, 3), Location.create(3565, 3276, 0)), new BarrowsCrypt(TORAG, 2029, Location.create(3568, 9683, 3), Location.create(3553, 3283, 0)), new BarrowsCrypt(VERAC, 2030, Location.create(3578, 9706, 3), Location.create(3557, 3298, 0)) }; + + /** + * The NPC id. + */ + private final int npcId; + + /** + * The location to teleport to when entering the crypt. + */ + private final Location location; + + /** + * The exit location. + */ + private final Location exitLocation; + + /** + * The crypt index. + */ + private final int index; + + /** + * Constructs a new {@code BarrowsCrypt} {@code Object}. + * @param location The location to teleport to when entering the crypt. + * @param exitLocation The location to teleport to when leaving the crypt. + */ + public BarrowsCrypt(int index, int npcId, Location location, Location exitLocation) { + this.index = index; + this.npcId = npcId; + this.location = location; + this.exitLocation = exitLocation; + } + + /** + * Initializes the barrow crypts. + */ + public static void init() { + for (final BarrowsCrypt crypt : CRYPTS) { + DigAction action = new DigAction() { + @Override + public void run(Player player) { + crypt.enter(player); + } + }; + Location base = crypt.getExitLocation(); + for (int x = -2; x <= 2; x++) { + for (int y = -2; y <= 2; y++) { + DigSpadeHandler.register(base.transform(x, y, 0), action); + } + } + } + } + + /** + * Opens the sarcophagus. + * @param player The player. + */ + public void openSarcophagus(Player player, GameObject object) { + if (index == player.getSavedData().getActivityData().getBarrowTunnelIndex()) { + player.getDialogueInterpreter().open("barrow_tunnel", index); + return; + } + if (player.getSavedData().getActivityData().getBarrowBrothers()[index] || player.getAttribute("barrow:npc") != null) { + player.getPacketDispatch().sendMessage("You don't find anything."); + return; + } + player.getPacketDispatch().sendMessage("You don't find anything."); + Location location = RegionManager.getTeleportLocation(object.getLocation().transform(Direction.SOUTH_WEST), object.getSizeX() + 1, object.getSizeY() + 1); + spawnBrother(player, location); + } + + /** + * Spawns the barrow brother. + * @param player The player. + * @param location The location. + * @return {@code True} if successful. + */ + public boolean spawnBrother(Player player, Location location) { + if (player.getAttribute("brother:" + index, false)) { + return false; + } + NPC npc = new BarrowBrother(player, npcId, location); + npc.init(); + player.setAttribute("barrow:npc", npc); + player.setAttribute("brother:" + index, true); + return true; + } + + /** + * Enters the crypt. + * @param player The player. + */ + protected void enter(Player player) { + player.addExtension(BarrowsCrypt.class, this); + player.getPacketDispatch().sendMessage("You've broken into a crypt!"); + player.getProperties().setTeleportLocation(getEnterLocation()); + } + + /** + * Gets the crypt for the given index. + * @param index The crypt index. + * @return The barrows crypt. + */ + public static BarrowsCrypt getCrypt(int index) { + return CRYPTS[index]; + } + + /** + * Gets the location to teleport to upon entering. + * @return The location. + */ + public Location getEnterLocation() { + return location; + } + + /** + * Gets the exit location. + * @return The location. + */ + public Location getExitLocation() { + return exitLocation; + } + + /** + * Gets the npcId. + * @return The npcId. + */ + public int getNpcId() { + return npcId; + } + + /** + * Gets the index. + * @return The index. + */ + public int getIndex() { + return index; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowsPuzzle.java b/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowsPuzzle.java new file mode 100644 index 000000000..112422ecb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/barrows/BarrowsPuzzle.java @@ -0,0 +1,169 @@ +package core.game.content.activity.barrows; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.net.packet.PacketRepository; +import core.net.packet.context.DisplayModelContext; +import core.net.packet.context.DisplayModelContext.ModelType; +import core.net.packet.out.DisplayModel; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the barrows puzzle. + * @author Emperor + */ +public final class BarrowsPuzzle extends ComponentPlugin { + + /** + * The shapes puzzle. + */ + public static final BarrowsPuzzle SHAPES = new BarrowsPuzzle(new int[] { 6734, 6735, 6736 }, getAnswerModel(6731, true), getAnswerModel(6732, false), getAnswerModel(6733, false)); + + /** + * The lines puzzle. + */ + public static final BarrowsPuzzle LINES = new BarrowsPuzzle(new int[] { 6728, 6729, 6730 }, getAnswerModel(6725, true), getAnswerModel(6726, false), getAnswerModel(6727, false)); + + /** + * The squares puzzle. + */ + public static final BarrowsPuzzle SQUARES = new BarrowsPuzzle(new int[] { 6722, 6723, 6724 }, getAnswerModel(6719, true), getAnswerModel(6720, false), getAnswerModel(6721, false)); + + /** + * The triangle-on-circles puzzle. + */ + public static final BarrowsPuzzle TRIANGLE_CIRCLES = new BarrowsPuzzle(new int[] { 6716, 6717, 6718 }, getAnswerModel(6713, true), getAnswerModel(6714, false), getAnswerModel(6715, false)); + + /** + * The puzzle component. + */ + private static final Component COMPONENT = new Component(25); + + /** + * The question models. + */ + private final int[] questionModels; + + /** + * The answer models. + */ + private final int[] answerModels; + + /** + * Constructs a new {@code BarrowsPuzzle} {@code Object}. + * @param questionModels The question models. + * @param answerModels The answer models. + */ + private BarrowsPuzzle(int[] questionModels, int... answerModels) { + this.questionModels = questionModels; + this.answerModels = answerModels; + } + + /** + * Creates a new barrows puzzle instance of this puzzle. + * @return The new barrows puzzle instance. + */ + public BarrowsPuzzle create() { + int[] answers = Arrays.copyOf(answerModels, answerModels.length); + List list = new ArrayList<>(); + for (int answer : answers) { + list.add(answer); + } + Collections.shuffle(list, new Random()); + for (int i = 0; i < list.size(); i++) { + answers[i] = list.get(i); + } + return new BarrowsPuzzle(questionModels, answers); + } + + /** + * Opens a random barrows puzzle. + * @param player The player. + */ + public static void open(Player player) { + int index = RandomFunction.random(4); + if (index == player.getAttribute("puzzle:index", -1)) { + index = (index + 1) % 4; + } + open(player, index); + } + + /** + * Opens the barrows puzzle for the given index. + * @param player The player. + * @param index The index (0 = shapes, 1 = lines, 2 = squares, 3 = + * triangle-on-circle). + */ + public static void open(Player player, int index) { + BarrowsPuzzle puzzle = SHAPES; + switch (index) { + case 1: + puzzle = LINES; + break; + case 2: + puzzle = SQUARES; + break; + case 3: + puzzle = TRIANGLE_CIRCLES; + break; + } + puzzle = puzzle.create(); + player.setAttribute("puzzle:index", index); + player.setAttribute("puzzle:answers", puzzle.answerModels); + player.getInterfaceManager().open(COMPONENT); + for (int i = 0; i < puzzle.questionModels.length; i++) { + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.MODEL, puzzle.questionModels[i], 0, 25, 6 + i)); + } + for (int i = 0; i < puzzle.answerModels.length; i++) { + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.MODEL, puzzle.answerModels[i] & 0xFFFF, 0, 25, 2 + i)); + } + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.MODEL, puzzle.answerModels[2] & 0xFFFF, 0, 25, 5)); + } + + /** + * Gets the answer model id. + * @param modelId The model id. + * @param correct If the answer is correct. + * @return The model id hash. + */ + private static int getAnswerModel(int modelId, boolean correct) { + return modelId | (correct ? 1 : 0) << 16; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(25, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 2: + case 3: + case 5: + player.getInterfaceManager().close(); + boolean correct = ((player.getAttribute("puzzle:answers", new int[3])[button == 5 ? 2 : button - 2] >> 16) & 0xFF) == 1; + if (!correct) { + player.getPacketDispatch().sendMessage("You got the puzzle wrong! You can hear the catacombs moving around you."); + BarrowsActivityPlugin.shuffleCatacombs(player); + break; + } + player.setAttribute("/save:barrow:solvedpuzzle", true); + player.getPacketDispatch().sendMessage("You hear the doors' locking mechanism grind open."); + break; + default: + return false; + } + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/barrows/RewardChest.kt b/Server/src/main/java/Server/core/game/content/activity/barrows/RewardChest.kt new file mode 100644 index 000000000..123e0f3c0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/barrows/RewardChest.kt @@ -0,0 +1,100 @@ +package core.game.content.activity.barrows + +import core.game.component.Component +import core.game.container.access.InterfaceContainer +import core.game.content.global.BossKillCounter +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.node.item.WeightedChanceItem +import core.tools.Items +import core.tools.RandomFunction +import java.util.* + +/** + * The reward chest. + * @author Ceikry + * and slightly kermit + */ +object RewardChest { + /** + * The low profit drop table. + */ + private val DROP_TABLE = arrayOf( + //Weighted total = 3050 + WeightedChanceItem(Items.COINS_995, 1, 5306, 950), + WeightedChanceItem(Items.MIND_RUNE_558, 60, 60, 300), + WeightedChanceItem(Items.MIND_RUNE_558, 100, 850, 300), + WeightedChanceItem(Items.CHAOS_RUNE_562, 115, 720, 300), + WeightedChanceItem(Items.DEATH_RUNE_560, 15, 15, 300), + WeightedChanceItem(Items.DEATH_RUNE_560, 70, 230, 300), + WeightedChanceItem(Items.BLOOD_RUNE_565, 35, 230, 300), + WeightedChanceItem(Items.BOLT_RACK_4740, 35, 280, 300), + //Weight total = 975 + WeightedChanceItem(Items.SUPER_DEFENCE2_165, 1, 1, 325), + WeightedChanceItem(Items.PRAYER_POTION2_141, 1, 1, 325), + WeightedChanceItem(Items.RESTORE_POTION2_129, 1, 1, 325), + //Weight total = 53 + WeightedChanceItem(Items.TOOTH_HALF_OF_A_KEY_985, 1, 1, 25), + WeightedChanceItem(Items.LOOP_HALF_OF_A_KEY_987, 1, 1, 25), + WeightedChanceItem(Items.DRAGON_MED_HELM_1149, 1, 1, 3), + //Weight total = 120 BARROWS ITEMS V + WeightedChanceItem(4708, 1, 1, 5), + WeightedChanceItem(4710, 1, 1, 5), + WeightedChanceItem(4712, 1, 1, 5), + WeightedChanceItem(4714, 1, 1, 5), + WeightedChanceItem(4716, 1, 1, 5), + WeightedChanceItem(4718, 1, 1, 5), + WeightedChanceItem(4720, 1, 1, 5), + WeightedChanceItem(4722, 1, 1, 5), + WeightedChanceItem(4724, 1, 1, 5), + WeightedChanceItem(4726, 1, 1, 5), + WeightedChanceItem(4728, 1, 1, 5), + WeightedChanceItem(4730, 1, 1, 5), + WeightedChanceItem(4732, 1, 1, 5), + WeightedChanceItem(4734, 1, 1, 5), + WeightedChanceItem(4736, 1, 1, 5), + WeightedChanceItem(4738, 1, 1, 5), + WeightedChanceItem(4745, 1, 1, 5), + WeightedChanceItem(4747, 1, 1, 5), + WeightedChanceItem(4749, 1, 1, 5), + WeightedChanceItem(4751, 1, 1, 5), + WeightedChanceItem(4753, 1, 1, 5), + WeightedChanceItem(4755, 1, 1, 5), + WeightedChanceItem(4757, 1, 1, 5), + WeightedChanceItem(4759, 1, 1, 5) + ) + + /** + * Rewards the player. + * + * @param player The player. + */ + @JvmStatic + fun reward(player: Player) { + for (killed in player.savedData.activityData.barrowBrothers) { + if (!killed){ + player.sendMessage("You can't loot the chest until you kill all 6 barrows brothers.") + player.removeAttribute("barrow:looted") + // Because they haven't + // actually looted the + // chest yet. + return + } + } + val rewards: MutableList = ArrayList() + var maxRolls = 2 + RandomFunction.random(0,player.savedData.activityData.barrowKills / 3) + if(maxRolls > 6) maxRolls = 6 + for (i in 0 until maxRolls) { + rewards.add(RandomFunction.rollWeightedChanceTable(*DROP_TABLE)) + } + InterfaceContainer.generateItems(player, rewards.toTypedArray(), arrayOf("Pog!","Examine"), 364, 4,3,4) + player.interfaceManager.open(Component(364)) + BossKillCounter.addtoBarrowsCount(player) + for(item in rewards){ + if(!player.inventory.add(item)){ + GroundItemManager.create(item,player) + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/barrows/TunnelEntranceDialogue.java b/Server/src/main/java/Server/core/game/content/activity/barrows/TunnelEntranceDialogue.java new file mode 100644 index 000000000..22f4af8a2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/barrows/TunnelEntranceDialogue.java @@ -0,0 +1,83 @@ +package core.game.content.activity.barrows; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.PluginManifest; +import core.plugin.PluginType; + +/** + * The tunnel entrance dialogue handling plugin. + * @author Emperor + */ +@PluginManifest(type = PluginType.DIALOGUE) +public final class TunnelEntranceDialogue extends DialoguePlugin { + + /** + * The crypt index. + */ + @SuppressWarnings("unused") + private int index; + + /** + * Constructs a new {@code TunnelEntranceDialogue} {@code Object}. + */ + public TunnelEntranceDialogue() { + super(); + } + + /** + * Constructs a new {@code TunnelEntranceDialogue} {@code Object}. + * @param player The player. + */ + public TunnelEntranceDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TunnelEntranceDialogue(player); + } + + @Override + public boolean open(Object... args) { + this.index = (Integer) args[0]; + player.getDialogueInterpreter().sendPlainMessage(false, "You find a hidden tunnel, do you want to enter?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (stage++ == 0) { + player.getDialogueInterpreter().sendOptions(null, "Yeah, I'm fearless!", "No way, that looks scary!"); + return true; + } + switch (buttonId) { + case 1: + int offsetX = 0; + int offsetY = 0; + int configValue = player.getConfigManager().get(452); + if ((configValue & (1 << 7)) != 0) { + offsetX = 34; + offsetY = 34; + } else if ((configValue & (1 << 6)) != 0) { + offsetY = 34; + } else if ((configValue & (1 << 9)) != 0) { + offsetX = 34; + } + int x = 3534 + offsetX; + int y = 9677 + offsetY; + player.getProperties().setTeleportLocation(Location.create(x, y, 0)); + case 2: + end(); + return true; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("barrow_tunnel") }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BHOptionHandler.java b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BHOptionHandler.java new file mode 100644 index 000000000..755e6b6b4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BHOptionHandler.java @@ -0,0 +1,80 @@ +package core.game.content.activity.bountyhunter; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.activity.ActivityManager; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the bounty hunter options. + * @author Emperor + */ +public final class BHOptionHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(28110).getHandlers().put("option:exit", this); + ObjectDefinition.forId(28119).getHandlers().put("option:enter", this); + ObjectDefinition.forId(28120).getHandlers().put("option:enter", this); + ObjectDefinition.forId(28121).getHandlers().put("option:enter", this); + ObjectDefinition.forId(28122).getHandlers().put("option:exit", this); + ObjectDefinition.forId(28115).getHandlers().put("option:view", this); + ObjectDefinition.forId(28116).getHandlers().put("option:view", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + GameObject object = (GameObject) node; + final BountyHunterActivity activity = player.getExtension(BountyHunterActivity.class); + switch (object.getId()) { + case 28119: + ActivityManager.start(player, "BH low_level", false); + return true; + case 28120: + ActivityManager.start(player, "BH mid_level", false); + return true; + case 28121: + ActivityManager.start(player, "BH high_level", false); + return true; + case 28115: + BHScoreBoard.getRogues().open(player); + return true; + case 28116: + BHScoreBoard.getHunters().open(player); + return true; + case 28122: + if (activity == null) { + return false; + } + if (player.getAttribute("exit_penalty", 0) > GameWorld.getTicks()) { + player.getPacketDispatch().sendMessage("You can't leave the crater until the exit penalty is over."); + return true; + } + player.lock(2); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + player.getProperties().setTeleportLocation(activity.getType().getExitLocation()); + return true; + } + }); + player.animate(Animation.create(7376)); + return true; + case 28110: + if (activity == null) { + return false; + } + activity.leaveWaitingRoom(player, false); + return true; + } + return false; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BHScoreBoard.java b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BHScoreBoard.java new file mode 100644 index 000000000..30613f9c5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BHScoreBoard.java @@ -0,0 +1,161 @@ +package core.game.content.activity.bountyhunter; + +import java.nio.ByteBuffer; + +import core.cache.ServerStore; +import core.cache.StoreFile; +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.tools.StringUtils; + +/** + * The score board. + * @author Emperor + */ +public final class BHScoreBoard { + + /** + * The score board size. + */ + private static final int SIZE = 10; + + /** + * The names. + */ + private String[] names = new String[SIZE]; + + /** + * The scores. + */ + private int[] scores = new int[SIZE]; + + /** + * The bounty hunters scoreboard. + */ + private static final BHScoreBoard HUNTERS = new BHScoreBoard(); + + /** + * The bounty hunter rogues scoreboard. + */ + private static final BHScoreBoard ROGUES = new BHScoreBoard(); + + /** + * Constructs a new {@code BHScoreBoard} {@code Object}. + */ + public BHScoreBoard() { + for (int i = 0; i < SIZE; i++) { + names[i] = "Nobody yet"; + } + } + + /** + * Initializes the score boards data. + */ + public static void init() { + StoreFile file = ServerStore.get("bh_scores"); + if (file == null) { // Indicates no cache exists yet. + return; + } + ByteBuffer buffer = file.data(); + for (int i = 0; i < SIZE; i++) { + HUNTERS.scores[i] = buffer.getInt(); + HUNTERS.names[i] = ByteBufferUtils.getString(buffer); + } + for (int i = 0; i < SIZE; i++) { + ROGUES.scores[i] = buffer.getInt(); + ROGUES.names[i] = ByteBufferUtils.getString(buffer); + } + } + + /** + * Updates the store file for the scores. + */ + public static void update() { + ByteBuffer buffer = ByteBuffer.allocate(500); + for (int i = 0; i < SIZE; i++) { + buffer.putInt(HUNTERS.scores[i]); + ByteBufferUtils.putString(HUNTERS.names[i], buffer); + } + for (int i = 0; i < SIZE; i++) { + buffer.putInt(ROGUES.scores[i]); + ByteBufferUtils.putString(ROGUES.names[i], buffer); + } + buffer.flip(); + ServerStore.setArchive("bh_scores", buffer); + } + + /** + * Opens the score board. + * @param player The player. + */ + public void open(Player player) { + int component = 654; + if (this == ROGUES) { + component = 655; + } + player.getInterfaceManager().open(new Component(component)); + for (int i = 0; i < SIZE; i++) { + player.getPacketDispatch().sendString(StringUtils.formatDisplayName(names[i]), component, 15 + i); + player.getPacketDispatch().sendString(Integer.toString(scores[i]), component, 25 + i); + } + } + + /** + * Checks if the ratings of the player is good enough for the score board. + * @param player The player. + */ + public void check(Player player) { + int score = player.getSavedData().getActivityData().getBountyHunterRate(); + if (this == ROGUES) { + score = player.getSavedData().getActivityData().getBountyRogueRate(); + } + for (int i = 0; i < SIZE; i++) { + if (score > scores[i]) { + insert(player, score, i); + update(); + break; + } + } + } + + /** + * Inserts the player in the score board. + * @param player The player. + * @param score The score. + * @param index The board index. + */ + private void insert(Player player, int score, int index) { + if (names[index].equals(player.getName())) { + scores[index] = score; + return; + } + for (int i = SIZE - 2; i >= index; i--) { + String name = names[i]; + if (name.equals(player.getName())) { + name = names[--i]; + } + scores[i + 1] = scores[i]; + names[i + 1] = name; + } + names[index] = player.getName(); + scores[index] = score; + } + + /** + * Gets the rogues. + * @return The rogues. + */ + public static BHScoreBoard getRogues() { + return ROGUES; + } + + /** + * Gets the hunters. + * @return The hunters. + */ + public static BHScoreBoard getHunters() { + return HUNTERS; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BountyEntry.java b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BountyEntry.java new file mode 100644 index 000000000..ccd64abf8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BountyEntry.java @@ -0,0 +1,105 @@ +package core.game.content.activity.bountyhunter; + +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; + +/** + * Holds a player's bounty hunter data. + * @author Emperor + */ +public final class BountyEntry { + + /** + * The target. + */ + private Player target; + + /** + * The player hunting this player. + */ + private Player hunter; + + /** + * Constructs a new {@code BountyEntry} {@code Object}. + */ + public BountyEntry() { + /* + * empty. + */ + } + + /** + * Updates the overlay. + * @param player The player. + */ + public void update(Player player) { + String name = "No one"; + if (target != null) { + name = target.getUsername(); + } + player.getPacketDispatch().sendString(name, 653, 7); + updatePenalty(player, false); + } + + /** + * Updates the current penalty. + * @param player The player. + * @param unlock If the components should be unlocked. + */ + public void updatePenalty(Player player, boolean unlock) { + int penalty = player.getAttribute("pickup_penalty", 0); + int child = -1; + if (GameWorld.getTicks() > penalty) { + player.removeAttribute("pickup_penalty"); + player.getPacketDispatch().sendInterfaceConfig(653, 8, true); + } else if (penalty != 0) { + child = 8; + int seconds = (int) Math.round((penalty - GameWorld.getTicks()) * 0.6); + player.getPacketDispatch().sendString(seconds + " Sec", 653, 10); + } + penalty = player.getAttribute("exit_penalty", 0); + if (GameWorld.getTicks() > penalty) { + player.removeAttribute("exit_penalty"); + player.getPacketDispatch().sendInterfaceConfig(653, 11, true); + } else if (penalty != 0) { + child = 11; + int seconds = (int) Math.round((penalty - GameWorld.getTicks()) * 0.6); + player.getPacketDispatch().sendString(seconds + " Sec", 653, 13); + } + if (unlock && child > -1) { + player.getPacketDispatch().sendInterfaceConfig(653, child, false); + } + } + + /** + * Gets the target. + * @return The target. + */ + public Player getTarget() { + return target; + } + + /** + * Sets the target. + * @param target The target to set. + */ + public void setTarget(Player target) { + this.target = target; + } + + /** + * Gets the hunter. + * @return The hunter. + */ + public Player getHunter() { + return hunter; + } + + /** + * Sets the hunter. + * @param hunter The hunter to set. + */ + public void setHunter(Player hunter) { + this.hunter = hunter; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BountyHunterActivity.java b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BountyHunterActivity.java new file mode 100644 index 000000000..dda7bc37a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BountyHunterActivity.java @@ -0,0 +1,639 @@ +package core.game.content.activity.bountyhunter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.Container; +import core.game.container.ContainerEvent; +import core.game.container.ContainerListener; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.GroundItem; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.Point; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.map.zone.impl.MultiwayCombatZone; +import core.game.world.map.zone.impl.WildernessZone; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +import java.util.*; + +/** + * Handles the Bounty hunter activity. + * @author Emperor + */ +@Initializable +public final class BountyHunterActivity extends ActivityPlugin { + + /** + * The skull values. + */ + private static final int[] SKULL_VALUES = { 100_000, // Bronze skull + 500_000, // Iron skull + 1_100_000, // Adamant skull + 2_500_000, // Runite skull + -1 // Dragon skull + }; + + /** + * The exit offsets. + */ + private static final Point[] EXIT_OFFSETS = { new Point(19, 58), new Point(24, 44), new Point(29, 34), new Point(36, 22), new Point(52, 17), new Point(14, 72), new Point(15, 85), new Point(17, 127), new Point(14, 133), new Point(19, 151), new Point(38, 163), new Point(49, 170), new Point(64, 20), new Point(84, 16), new Point(106, 18), new Point(69, 176), new Point(85, 176), new Point(127, 174), new Point(130, 21), new Point(138, 33), new Point(155, 48), new Point(163, 53), new Point(172, 60), new Point(174, 64), new Point(176, 106), new Point(178, 84), new Point(155, 169), new Point(162, 162), new Point(163, 153), new Point(173, 136) }; + + /** + * The minimum amount of players to enter the crater. + */ + private static final int MINIMUM_PLAYERS = 2; + + /** + * The waiting room overlay. + */ + private static final Component WAITING_OVERLAY = new Component(656); + + /** + * The game overlay. + */ + private static final Component GAME_OVERLAY = new Component(653); + + /** + * The player in the current crater. + */ + final Map players = new HashMap<>(); + + /** + * The waiting room. + */ + private final List waitingRoom = new ArrayList<>(); + + /** + * The crater type. + */ + private final CraterType type; + + /** + * The amount of time to wait in the waiting room. + */ + private int waitingTime = 166; + + /** + * The waiting room pulse. + */ + private final Pulse waitRoomPulse = new Pulse(1) { + @Override + public boolean pulse() { + String time = Integer.toString((int) Math.round(waitingTime-- * 0.6)) + " Sec"; + for (Player player : waitingRoom) { + player.getPacketDispatch().sendString(time, 656, 10); + } + if (waitingTime == -1) { + for (Iterator it = waitingRoom.iterator(); it.hasNext();) { + enterCrater(it.next()); + it.remove(); + } + return true; + } + return false; + } + + @Override + public void stop() { + super.stop(); + waitingTime = 166; + } + }; + + /** + * The game pulse (doesn't update every tick on 2009scape as well). + */ + private final Pulse gamePulse = new Pulse(10) { + @Override + public boolean pulse() { + for (Player player : players.keySet()) { + BountyEntry entry = players.get(player); + if (entry.getTarget() == null) { + findTarget(player); + } + entry.updatePenalty(player, false); + } + return false; + } + }; + + /** + * Constructs a new {@code BountyHunterActivity} {@code Object}. + */ + public BountyHunterActivity() { + this(CraterType.LOW_LEVEL); + } + + /** + * Constructs a new {@code BountyHunterActivity} {@code Object}. + */ + public BountyHunterActivity(CraterType type) { + super("BH " + type.name().toLowerCase(), false, false, false, ZoneRestriction.FOLLOWERS); + this.type = type; + } + + @Override + public void register() { + waitRoomPulse.stop(); + gamePulse.stop(); + if (getType() == CraterType.LOW_LEVEL) { + // Disable bounty hunter area as wilderness + Location check = Location.create(3166, 3679, 0); + for (ZoneBorders border : WildernessZone.getInstance().getBorders()) { + if (border.insideBorder(check)) { + /* if (GameWorld.getSettings().isPvp()) { + border.addException(new ZoneBorders(2924, 3306, 3078, 3404)); + }*/ + border.addException(new ZoneBorders(3140, 3653, 3149, 3670)); + border.addException(new ZoneBorders(3150, 3656, 3154, 3676)); + border.addException(new ZoneBorders(3155, 3661, 3164, 3686)); + border.addException(new ZoneBorders(3165, 3667, 3173, 3693)); + border.addException(new ZoneBorders(3174, 3673, 3192, 3705)); + border.addException(new ZoneBorders(3193, 3681, 3196, 3709)); + break; + } + } + PluginManager.definePlugin(new ComponentPlugin() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(657, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (button == 18) { + player.getInterfaceManager().close(); + player.lock(1); + BountyHunterActivity activity = player.getExtension(BountyHunterActivity.class); + if (activity.players.isEmpty()) { + activity.joinWaitingRoom(player); + return true; + } + activity.enterCrater(player); + } + return true; + } + + }); + BHScoreBoard.init(); + PluginManager.definePlugin(new BountyLocateSpell()); + PluginManager.definePlugin(new BHOptionHandler()); + ActivityManager.register(new BountyHunterActivity(CraterType.MID_LEVEL)); + ActivityManager.register(new BountyHunterActivity(CraterType.HIGH_LEVEL)); + } + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + if (player.getFamiliarManager().hasFamiliar()) { + player.getPacketDispatch().sendMessage("You can't bring a follower into the crater."); + return false; + } + if (!getType().canEnter(player)) { + return false; + } + player.addExtension(BountyHunterActivity.class, this); + if (!login) { + player.getInterfaceManager().open(new Component(657)); + } else { + enterCrater(player); + } + return true; + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player && getType().getZone().insideBorder(e.getLocation()) || e instanceof Player) { + if (e.getAttribute("viewing_orb") != null) { + return super.enter(e); + } + Player player = (Player) e; + for (int i = 0; i < type.ordinal(); i++) { + if (!player.getMusicPlayer().hasUnlockedIndex(517 + i)) { + player.getMusicPlayer().unlock(444 - i, false); + } + } + player.addExtension(BountyHunterActivity.class, this); + BountyEntry entry = new BountyEntry(); + players.put(player, entry); + player.getInterfaceManager().openOverlay(GAME_OVERLAY); + int penalty; + if ((penalty = player.getAttribute("pickup_penalty", 0)) != 0) { + player.setAttribute("/save:pickup_penalty", GameWorld.getTicks() + penalty); + } + if ((penalty = player.getAttribute("exit_penalty", 0)) != 0) { + player.setAttribute("/save:exit_penalty", GameWorld.getTicks() + penalty); + if (player.getPrayer().get(PrayerType.PROTECT_ITEMS)) { + player.getPrayer().toggle(PrayerType.PROTECT_ITEMS); + } + } + findTarget(player); + entry.updatePenalty(player, true); + player.getInteraction().set(Option._P_ATTACK); + player.getInteraction().remove(Option._P_ASSIST); + player.getSkullManager().setSkullCheckDisabled(true); + player.getSkullManager().setWilderness(true); + player.setAttribute("bh_joined", GameWorld.getTicks() + 10); + updateSkull(player); + if (!gamePulse.isRunning()) { + gamePulse.start(); + GameWorld.getPulser().submit(gamePulse); + } + } + return super.enter(e); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player player = (Player) e; + player.removeExtension(BountyHunterActivity.class); + if (waitingRoom.contains(player)) { + leaveWaitingRoom(player, logout); + } + BountyEntry entry = players.get(player); + if (entry != null) { + leaveCrater(player, logout, entry); + } + } + return super.leave(e, logout); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GroundItem && option.getName().equals("take")) { + return actionButton((Player) e, 192, 19, -1, -1, 55); + } + if (target instanceof Item && option.getName().equals("drop")) { + if (((Item) target).getValue() > 1000) { + ((Player) e).getPacketDispatch().sendMessage("This item is too valuable to drop in the crater."); + return true; + } + } + return false; + } + + @Override + public boolean ignoreMultiBoundaries(Entity attacker, Entity victim) { + if (attacker instanceof Player) { + BountyEntry entry = players.get(attacker); + return entry != null && entry.getTarget() == victim; + } + return false; + } + + @SuppressWarnings("deprecation") + @Override + public boolean actionButton(Player player, int interfaceId, int buttonId, int slot, int itemId, int opcode) { + if (interfaceId == 192 && buttonId == 19) { + BountyEntry entry = players.get(player); + if (entry != null && player.getAttribute("pickup_penalty", 0) > GameWorld.getTicks()) { + player.getPacketDispatch().sendMessage("You should not be picking up items. Now you must wait before you can leave."); + player.removeAttribute("pickup_penalty"); + player.setAttribute("/save:exit_penalty", GameWorld.getTicks() + 300); + entry.updatePenalty(player, true); + if (player.getPrayer().get(PrayerType.PROTECT_ITEMS)) { + player.getPrayer().toggle(PrayerType.PROTECT_ITEMS); + } + } + } else if (interfaceId == 271 && buttonId == 25) { + if (player.getAttribute("exit_penalty", 0) > GameWorld.getTicks()) { + player.getPacketDispatch().sendMessage("You can't use the protect item prayer until your penalty has passed."); + player.getConfigManager().send(PrayerType.PROTECT_ITEMS.getConfig(), 0); + return true; + } + } + return false; + } + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (e instanceof Player && target instanceof Player) { + if (((Player) target).getAttribute("bh_joined", -1) > GameWorld.getTicks()) { + ((Player) e).getPacketDispatch().sendMessage("This player has only just entered and is temporarily invulnerable to attacks."); + return false; + } + e.removeAttribute("bh_joined"); + } + return true; + } + + /** + * Updates the skull. + * @param player The player. + */ + private void updateSkull(final Player player) { + if (player.getAttribute("value_listener") == null) { + ContainerListener listener = new ContainerListener() { + @Override + public void update(Container c, ContainerEvent event) { + refresh(c); + } + + @Override + public void refresh(Container c) { + updateSkull(player); + } + }; + player.setAttribute("value_listener", listener); + player.getInventory().getListeners().add(listener); + player.getEquipment().getListeners().add(listener); + } + long value = 0; + for (Item item : player.getInventory().toArray()) { + if (item != null) { + value += item.getValue(); + } + } + for (Item item : player.getEquipment().toArray()) { + if (item != null) { + value += item.getValue(); + } + } + int skull = 2; + if (value >= 0) { + for (int i = 0; i < SKULL_VALUES.length - 1; i++) { + if (value < SKULL_VALUES[i]) { + skull = 6 - i; + break; + } + } + } + player.getSkullManager().setSkulled(true); + player.getAppearance().setSkullIcon(skull); + player.getAppearance().sync(); + } + + /** + * Enters the bounty hunter crater. + * @param player The player. + */ + public void enterCrater(Player player) { + Point offset = RandomFunction.getRandomElement(EXIT_OFFSETS); + Location destination = Location.create(getType().getZone().getSouthWestX() + offset.getX(), getType().getZone().getSouthWestY() + offset.getY(), 0); + player.getProperties().setTeleportLocation(destination); + player.animate(Animation.create(7377)); + } + + /** + * Leaves the bounty hunter crater. + * @param player The player. + * @param logout If the player has logged out. + * @param entry The player's bounty entry. + */ + public void leaveCrater(Player player, boolean logout, BountyEntry entry) { + if (entry.getHunter() != null) { + BountyEntry other = players.get(entry.getHunter()); + if (other != null) { + entry.getHunter().getPacketDispatch().sendMessage("Your target has " + (logout ? "logged out" : "left") + ". You shall be found a new target."); + other.setTarget(null); + findTarget(entry.getHunter()); + } + } + if (entry.getTarget() != null) { + BountyEntry other = players.get(entry.getTarget()); + if (other != null) { + other.setHunter(null); + } + } + player.getHintIconManager().clear(); + players.remove(player); + ContainerListener listener = player.getAttribute("value_listener"); + if (listener != null) { + player.getInventory().getListeners().remove(listener); + player.getEquipment().getListeners().remove(listener); + } + player.getAppearance().setSkullIcon(-1); + player.getAppearance().sync(); + player.getInteraction().remove(Option._P_ATTACK); + player.getInteraction().set(Option._P_ASSIST); + player.getSkullManager().setSkullCheckDisabled(false); + player.getSkullManager().setWilderness(false); + player.getInterfaceManager().closeOverlay(); + if (players.isEmpty()) { + gamePulse.stop(); + } + int penalty; + if ((penalty = player.getAttribute("pickup_penalty", 0)) > GameWorld.getTicks()) { + player.setAttribute("/save:pickup_penalty", penalty - GameWorld.getTicks()); + } else { + player.removeAttribute("pickup_penalty"); + } + if ((penalty = player.getAttribute("exit_penalty", 0)) > GameWorld.getTicks()) { + player.setAttribute("/save:exit_penalty", penalty - GameWorld.getTicks()); + } else { + player.removeAttribute("exit_penalty"); + } + player.getSkullManager().setSkulled(false); + } + + /** + * Joins the waiting room. + * @param player The player. + */ + private void joinWaitingRoom(Player player) { + waitingRoom.add(player); + player.getProperties().setTeleportLocation(getType().getRoomLocation()); + player.getInterfaceManager().openOverlay(WAITING_OVERLAY); + player.getPacketDispatch().sendString("Players waiting (need " + MINIMUM_PLAYERS + "):", 656, 6); + updateWaitingRoomSize(); + if (waitingRoom.size() == MINIMUM_PLAYERS) { + String time = (int) Math.round(waitingTime * 0.6) + " Sec"; + for (Player p : waitingRoom) { + player.getPacketDispatch().sendString(time, 656, 10); + p.getPacketDispatch().sendInterfaceConfig(656, 9, false); + p.getPacketDispatch().sendInterfaceConfig(656, 8, false); + } + if (!waitRoomPulse.isRunning()) { + waitRoomPulse.start(); + GameWorld.getPulser().submit(waitRoomPulse); + } + } else if (waitingRoom.size() > MINIMUM_PLAYERS) { + player.getPacketDispatch().sendString((int) Math.round(waitingTime * 0.6) + " Sec", 656, 10); + player.getPacketDispatch().sendInterfaceConfig(656, 9, false); + player.getPacketDispatch().sendInterfaceConfig(656, 8, false); + } + } + + /** + * Leaves the waiting room. + * @param player The player. + */ + @SuppressWarnings("deprecation") + public void leaveWaitingRoom(Player player, boolean logout) { + waitingRoom.remove(player); + if (waitingRoom.size() < MINIMUM_PLAYERS && waitRoomPulse.isRunning()) { + waitRoomPulse.stop(); + for (Player p : waitingRoom) { + p.getPacketDispatch().sendInterfaceConfig(656, 9, true); + p.getPacketDispatch().sendInterfaceConfig(656, 8, true); + } + } + updateWaitingRoomSize(); + player.getProperties().setTeleportLocation(getType().getExitLocation()); + player.getInterfaceManager().closeOverlay(); + if (logout) { + player.setLocation(getType().getExitLocation()); + } + } + + /** + * Finds a target for the specified player. + * @param player The player. + */ + private void findTarget(Player player) { + Player target = null; + BountyEntry other = null; + int difference = 999; + for (Player p : players.keySet()) { + if (p == player) { + continue; + } + BountyEntry entry = players.get(p); + if (entry.getHunter() == null) { + int diff = Math.abs(player.getProperties().getCurrentCombatLevel() - p.getProperties().getCurrentCombatLevel()); + if (diff < difference) { + difference = diff; + target = p; + other = entry; + } + } + } + if (other != null) { + other.setHunter(player); + HintIconManager.registerHintIcon(player, target); + } else { + player.getHintIconManager().clear(); + } + BountyEntry entry = players.get(player); + entry.setTarget(target); + entry.update(player); + } + + /** + * Updates the amount of players in the waiting room. + */ + private void updateWaitingRoomSize() { + String size = Integer.toString(waitingRoom.size()); + for (Player player : waitingRoom) { + player.getPacketDispatch().sendString(size, 656, 7); + } + } + + @Override + public boolean canLogout(Player player) { + if (player.getAttribute("exit_penalty", 0) > GameWorld.getTicks()) { + player.getPacketDispatch().sendMessage("You can't logout until the exit penalty is over."); + return false; + } + return true; + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e instanceof Player) { + Player player = (Player) e; + BountyEntry entry = players.get(player); + if (entry != null) { + if (entry.getHunter() != killer && killer instanceof Player) { + handleRogueKill((Player) killer, player, entry); + } else if (entry.getHunter() == killer) { // "They" is not a + // typo, this was + // the actual + // message on RS. + entry.getHunter().getPacketDispatch().sendMessage("You killed " + player.getUsername() + ". They were your target, so your Hunter PvP rating increases!"); + entry.getHunter().getSavedData().getActivityData().updateBountyHunterRate(1); + BHScoreBoard.getHunters().check(entry.getHunter()); + } else if (entry.getHunter() != null) { + entry.getHunter().getPacketDispatch().sendMessage("Your target has died. You shall be found a new target."); + } + if (entry.getHunter() != null) { + BountyEntry other = players.get(entry.getHunter()); + if (other != null) { + other.setTarget(null); + } + entry.setHunter(null); + } + player.getHintIconManager().clear(); + if (player.getAttribute("pickup_penalty", 0) != 0) { + player.setAttribute("pickup_penalty", GameWorld.getTicks() - 5); + } + if (player.getAttribute("exit_penalty", 0) != 0) { + player.setAttribute("exit_penalty", GameWorld.getTicks() - 5); + } + entry.updatePenalty((Player) e, true); + } + } + return false; + } + + /** + * Handles a rogue kill. + * @param player The player who killed the victim. + * @param victim The victim. + */ + private void handleRogueKill(Player player, Player victim, BountyEntry entry) { + player.getPacketDispatch().sendMessage("You killed " + victim.getUsername() + ". They were not your target, so your Rogue PvP rating"); + player.getPacketDispatch().sendMessage("increases!"); + player.getPacketDispatch().sendMessage("This means you get the pick-up penalty: pick anything up and you can't leave!"); + player.getSavedData().getActivityData().updateBountyRogueRate(1); + BHScoreBoard.getRogues().check(player); + player.setAttribute("/save:pickup_penalty", GameWorld.getTicks() + 300); + entry.updatePenalty(player, true); + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (e instanceof Player && type != -1) { + ((Player) e).getPacketDispatch().sendMessage("A magical force stops you from teleporting."); + return false; + } + return true; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return this; + } + + @Override + public Location getSpawnLocation() { + return Location.create(3166, 3679, 0); + } + + @Override + public void configure() { + registerRegion(6234); + register(getType().getZone()); + int x = getType().getZone().getSouthWestX(); + int y = getType().getZone().getSouthWestY(); + MultiwayCombatZone.getInstance().register(new ZoneBorders(x + 56, y + 40, x + 140, y + 140)); + } + + /** + * Gets the type. + * @return The type. + */ + public CraterType getType() { + return type; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BountyLocateSpell.java b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BountyLocateSpell.java new file mode 100644 index 000000000..e83fddd79 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/BountyLocateSpell.java @@ -0,0 +1,98 @@ +package core.game.content.activity.bountyhunter; + +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.interaction.MovementPulse; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Plugin; + +/** + * Handles the bounty target locate spell. + * @author Emperor + */ +public final class BountyLocateSpell extends MagicSpell { + + /** + * Constructs a new {@code BountyLocateSpell} {@code Object}. + */ + public BountyLocateSpell() { + super(SpellBook.MODERN, 32, 45, null, null, null, new Item[] { Runes.AIR_RUNE.getItem(1), Runes.FIRE_RUNE.getItem(1), Runes.LAW_RUNE.getItem(1) }); + } + + @Override + public boolean cast(Entity entity, Node target) { + BountyHunterActivity activity = entity.getExtension(BountyHunterActivity.class); + Player player = (Player) entity; + if (activity == null) { + player.getPacketDispatch().sendMessage("You can only use this spell in the Bounty Hunter craters."); + return false; + } + BountyEntry entry = activity.players.get(player); + if (entry == null || entry.getTarget() == null) { + player.getPacketDispatch().sendMessage("You don't have a target to teleport to."); + return true; + } + if (player.getStateManager().hasState(EntityState.FROZEN) || player.getStateManager().hasState(EntityState.STUNNED)) { + player.getPacketDispatch().sendMessage("You can't use this when " + (player.getStateManager().hasState(EntityState.STUNNED) ? "stunned." : "frozen.")); + return true; + } + boolean combat = player.inCombat(); + if (!super.meetsRequirements(entity, true, combat)) { + return false; + } + if (combat) { + player.getPacketDispatch().sendMessage("You were fighting recently so you'll run instead of teleport."); + target = entry.getTarget(); + Location location = entry.getTarget().getLocation(); + if (!location.withinDistance(player.getLocation(), 30)) { + int offsetX = location.getX() - player.getLocation().getX(); + int offsetY = location.getY() - player.getLocation().getY(); + if (offsetX > 30) { + offsetX = 30; + } else if (offsetX < -30) { + offsetX = -30; + } + if (offsetY > 30) { + offsetY = 30; + } else if (offsetY < -30) { + offsetY = -30; + } + target = player.getLocation().transform(offsetX, offsetY, 0); + } + player.getPulseManager().run(new MovementPulse(player, target) { + @Override + public boolean pulse() { + return true; + } + }, "movement"); + return true; + } + Location destination = RegionManager.getTeleportLocation(entry.getTarget().getLocation(), 5); + if (entity.getTeleporter().send(destination, TeleportType.NORMAL, -1)) { + if (!super.meetsRequirements(entity, true, true)) { + entity.getTeleporter().getCurrentTeleport().stop(); + return false; + } + entity.setAttribute("magic-delay", GameWorld.getTicks() + 5); + return true; + } + return false; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(60, this); + return this; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/bountyhunter/CraterType.java b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/CraterType.java new file mode 100644 index 000000000..03944b8dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/bountyhunter/CraterType.java @@ -0,0 +1,131 @@ +package core.game.content.activity.bountyhunter; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; + +/** + * Represents the crater types. + * @author Emperor + */ +public enum CraterType { + + /** + * The low level crater. + */ + LOW_LEVEL(3, Location.create(1548, 5804, 0), Location.create(1548, 5804, 0), Location.create(3152, 3672, 0), new ZoneBorders(2688, 5632, 2879, 5823)), + + /** + * The mid level crater. + */ + MID_LEVEL(50, Location.create(1558, 5785, 0), Location.create(1548, 5804, 0), Location.create(3158, 3680, 0), new ZoneBorders(2944, 5632, 3135, 5823)), + + /** + * The high level crater. + */ + HIGH_LEVEL(95, Location.create(1570, 5804, 0), Location.create(1548, 5804, 0), Location.create(3164, 3685, 0), new ZoneBorders(3200, 5632, 3391, 5823)); + + /** + * The level required to enter the crater. + */ + private final int level; + + /** + * The waiting room location. + */ + private final Location roomLocation; + + /** + * The crater location. + */ + private final Location craterLocation; + + /** + * The exit location. + */ + private final Location exitLocation; + + /** + * The zone borders. + */ + private final ZoneBorders zone; + + /** + * Constructs a new {@code CraterType} {@code Object}. The level required to + * enter the crater. + * @param roomLocation The location of the waiting room. + * @param craterLocation The location of the crater. + * @param exitLocation The location to go the when exiting. + * @param zone The crater zone. + */ + private CraterType(int level, Location roomLocation, Location craterLocation, Location exitLocation, ZoneBorders zone) { + this.level = level; + this.roomLocation = roomLocation; + this.craterLocation = craterLocation; + this.exitLocation = exitLocation; + this.zone = zone; + } + + /** + * Checks if the player can enter the crater. + * @param player The player. + * @return {@code True} if so. + */ + public boolean canEnter(Player player) { + int combatLevel = player.getProperties().getCurrentCombatLevel(); + if (player.getIronmanManager().checkRestriction()) { + return false; + } + if (ordinal() < CraterType.values().length - 1) { + if (combatLevel > CraterType.values()[ordinal() + 1].level + 5) { + player.getPacketDispatch().sendMessage("Your combat level has to be below " + (CraterType.values()[ordinal() + 1].level + 5) + " to enter this crater."); + return false; + } + } + if (combatLevel < level) { + player.getPacketDispatch().sendMessage("You need a combat level of " + level + " to enter this crater."); + return false; + } + return true; + } + + /** + * Gets the level requirement. + * @return The level requirement. + */ + public int getLevel() { + return level; + } + + /** + * Gets the roomLocation. + * @return The roomLocation. + */ + public Location getRoomLocation() { + return roomLocation; + } + + /** + * Gets the craterLocation. + * @return The craterLocation. + */ + public Location getCraterLocation() { + return craterLocation; + } + + /** + * Gets the exitLocation. + * @return The exitLocation. + */ + public Location getExitLocation() { + return exitLocation; + } + + /** + * Gets the zone. + * @return The zone. + */ + public ZoneBorders getZone() { + return zone; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/clanwars/CWChallengeOption.java b/Server/src/main/java/Server/core/game/content/activity/clanwars/CWChallengeOption.java new file mode 100644 index 000000000..e8329281c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/clanwars/CWChallengeOption.java @@ -0,0 +1,87 @@ +package core.game.content.activity.clanwars; + +import core.game.content.activity.ActivityManager; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.RequestModule; +import core.game.node.entity.player.link.request.RequestType; +import core.game.system.communication.ClanRank; +import core.plugin.Plugin; + +/** + * Handles the Clan wars challenge option. + * @author Emperor + * @versuib 1,9 + */ +public final class CWChallengeOption extends OptionHandler { + + /** + * The challenge option. + */ + public static final Option OPTION = new Option("Challenge", 0); + + /** + * The request type. + */ + private static final RequestType REQUEST_TYPE = new RequestType("Sending challenge request...", ":clanreq:", getModule()) { + @Override + public boolean canRequest(Player player, Player target) { + if (player.getCommunication().getClan() == null) { + player.getPacketDispatch().sendMessage("You have to be in a clan to challenge players."); + return false; + } + if (player.getCommunication().getClan().getRank(player).ordinal() < ClanRank.CAPTAIN.ordinal()) { + player.getPacketDispatch().sendMessage("Your clan rank is not high enough to challenge other clans."); + return false; + } + if (player.getCommunication().getClan().getClanWar() != null) { + player.getPacketDispatch().sendMessage("Your clan is already in a war."); + return false; + } + if (target.getCommunication().getClan() == null) { + player.getPacketDispatch().sendMessage("This player is not in a clan."); + return false; + } + if (target.getCommunication().getClan().getRank(target).ordinal() < ClanRank.CAPTAIN.ordinal()) { + player.getPacketDispatch().sendMessage("This player's clan rank is not high enough to accept challenges."); + return false; + } + if (target.getCommunication().getClan().getClanWar() != null) { + player.getPacketDispatch().sendMessage("This player's clan is already in a war."); + return false; + } + if (target.getCommunication().getClan() == player.getCommunication().getClan()) { + player.getPacketDispatch().sendMessage("You can't challenge someone from your own clan."); + return false; + } + return true; + } + }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + OPTION.setHandler(this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getRequestManager().request((Player) node, REQUEST_TYPE); + return true; + } + + /** + * Gets the request module. + * @return The module. + */ + private static RequestModule getModule() { + return new RequestModule() { + @Override + public void open(Player player, Player target) { + ActivityManager.start(player, "Clan wars", false, target); + } + }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/clanwars/ClanWarsActivityPlugin.java b/Server/src/main/java/Server/core/game/content/activity/clanwars/ClanWarsActivityPlugin.java new file mode 100644 index 000000000..022600b38 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/clanwars/ClanWarsActivityPlugin.java @@ -0,0 +1,497 @@ +package core.game.content.activity.clanwars; + +import java.util.ArrayList; +import java.util.List; + +import core.game.component.Component; +import core.game.content.activity.ActivityPlugin; +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.pet.Pet; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.impl.PulseManager; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.ConfigurationManager.Configuration; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.communication.ClanEntry; +import core.game.system.communication.ClanRepository; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.zone.RegionZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneType; +import core.game.world.map.zone.impl.MultiwayCombatZone; +import core.game.world.update.flag.chunk.AnimateObjectUpdateFlag; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the clan wars activity. + * @author Emperor + */ +@Initializable +public final class ClanWarsActivityPlugin extends ActivityPlugin { + + /** + * The first clan. + */ + private ClanRepository firstClan; + + /** + * The second clan. + */ + private ClanRepository secondClan; + + /** + * The first clan's players. + */ + private List firstClanPlayers = new ArrayList<>(); + + /** + * The second clan's players. + */ + private List secondClanPlayers = new ArrayList<>(); + + /** + * The list of viewing players. + */ + private List viewingPlayers = new ArrayList<>(); + + /** + * The amount of ticks. + */ + private int ticks; + + /** + * The updating pulse. + */ + private Pulse pulse; + + /** + * The attack option. + */ + private static final Option ATTACK_OPTION = new Option("Attack", 0).setHandler(new OptionHandler() { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getPulseManager().clear("interaction:attack:" + node.hashCode()); + player.getProperties().getCombatPulse().attack(node); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean isDelayed(Player player) { + return false; + } + + }); + + /** + * Constructs a new {@code ClanWarsActivityPlugin} {@code Object}. + */ + public ClanWarsActivityPlugin() { + super("Clan wars", true, false, true); + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + Player other = (Player) args[0]; + firstClan = player.getCommunication().getClan(); + secondClan = other.getCommunication().getClan(); + firstClan.setClanWar(this); + secondClan.setClanWar(this); + sendWarDeclaration(firstClan.getPlayers()); + sendWarDeclaration(secondClan.getPlayers()); + handleWall(); + join(player); + join(other); + return true; + } + + /** + * Handles the wall in the middle of the battlefield. + */ + private void handleWall() { + int offset = 0; + for (int x = 5; x < 54; x++) { + offset = (offset + 1) % 3; + ObjectBuilder.add(new GameObject(28174 + offset, base.transform(x, 64, 0))); + } + GameWorld.getPulser().submit(pulse = new Pulse(200) { + @Override + public boolean pulse() { + for (int x = 5; x < 54; x++) { + Location l = base.transform(x, 64, 0); + GameObject object = RegionManager.getObject(l); + if (object != null) { + Animation anim = Animation.create(7386 + ((object.getId() - 28174) % 3)); + anim.setObject(object); + RegionManager.getRegionChunk(l).flag(new AnimateObjectUpdateFlag(anim)); + } + } + GameWorld.getPulser().submit(new Pulse(5) { + @Override + public boolean pulse() { + for (int x = 5; x < 54; x++) { + Location l = base.transform(x, 64, 0); + GameObject object = RegionManager.getObject(l); + if (object != null) { + ObjectBuilder.remove(object); + } + } + return true; + } + }); + super.setTicksPassed(250); + sendGameData(); + if (firstClanPlayers.isEmpty() || secondClanPlayers.isEmpty()) { + finishWar(); + } + return true; + } + }); + } + + /** + * Ends the war. + */ + public void finishWar() { + firstClan.setClanWar(null); + secondClan.setClanWar(null); + int firstInterfaceId = firstClanPlayers.isEmpty() ? 650 : 651; + int secondInterfaceId = firstClanPlayers.isEmpty() ? 651 : 650; + String[] message = new String[] { "Your clan has been defeated!", "Your clan is victorious!" }; + for (Player p : firstClanPlayers) { + p.getProperties().setTeleportLocation(getLeaveLocation()); + p.getInterfaceManager().openComponent(firstInterfaceId); + p.getPacketDispatch().sendMessage(message[firstInterfaceId - 650]); + p.fullRestore(); + PulseManager.cancelDeathTask(p); + } + for (Player p : secondClanPlayers) { + p.getProperties().setTeleportLocation(getLeaveLocation()); + p.getInterfaceManager().openComponent(secondInterfaceId); + p.getPacketDispatch().sendMessage(message[secondInterfaceId - 650]); + p.fullRestore(); + PulseManager.cancelDeathTask(p); + } + for (Player p : viewingPlayers) { + p.getProperties().setTeleportLocation(getLeaveLocation()); + if (p.getCommunication().getClan() == firstClan) { + p.getInterfaceManager().openComponent(firstInterfaceId); + p.getPacketDispatch().sendMessage(message[firstInterfaceId - 650]); + } else { + p.getInterfaceManager().openComponent(secondInterfaceId); + p.getPacketDispatch().sendMessage(message[secondInterfaceId - 650]); + } + } + } + + /** + * Sends the game data for all players in the game. + */ + public void sendGameData() { + for (Player p : firstClanPlayers) { + sendGameData(p); + } + for (Player p : secondClanPlayers) { + sendGameData(p); + } + for (Player p : viewingPlayers) { + sendGameData(p); + } + } + + /** + * Sends the game data for the player. + * @param p The player. + */ + public void sendGameData(Player p) { + int value = 0; + boolean first = p.getCommunication().getClan() == firstClan; + String name = firstClan.getName(); + if (first) { + value |= firstClanPlayers.size() << 5; + value |= secondClanPlayers.size() << 14; + } else { + name = secondClan.getName(); + value |= secondClanPlayers.size() << 5; + value |= firstClanPlayers.size() << 14; + } + if (pulse.getTicksPassed() < 200) { + value |= (200 - pulse.getTicksPassed()) << 23; + } + p.getConfigManager().set(Configuration.CLAN_WAR_DATA, value); + p.getPacketDispatch().sendString(name, 265, 2); + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (type != -1 && type != 2 && e instanceof Player) { + ((Player) e).getPacketDispatch().sendMessage("You can't teleport away from a war."); + return false; + } + return true; + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player player = (Player) e; + player.getInteraction().set(ATTACK_OPTION); + player.getInteraction().remove(Option._P_ASSIST); + player.getSkullManager().setSkullCheckDisabled(true); + player.getSkullManager().setWilderness(true); + player.getInterfaceManager().openOverlay(new Component(265)); + } else if (e instanceof Familiar && !(e instanceof Pet)) { + Familiar familiar = (Familiar) e; + if (familiar.isCombatFamiliar()) { + familiar.transform(familiar.getOriginalId() + 1); + } + } + return true; + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e instanceof Player) { + return enterViewingRoom((Player) e); + } + return false; + } + + /** + * Enters the viewing room. + * @param player The player. + * @return {@code True} if successfully entered the viewing room. + */ + public boolean enterViewingRoom(Player player) { + Location destination = null; + if (player.getCommunication().getClan() == firstClan) { + remove(player, firstClanPlayers); + destination = base.transform(55 + RandomFunction.randomize(3), 51 + RandomFunction.randomize(11), 0); + } else if (player.getCommunication().getClan() == secondClan) { + remove(player, secondClanPlayers); + destination = base.transform(55 + RandomFunction.randomize(3), 66 + RandomFunction.randomize(11), 0); + } else { + return false; + } + player.getProperties().setTeleportLocation(destination); + viewingPlayers.add(player); + sendGameData(); + return true; + } + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (e instanceof Familiar) { + e = ((Familiar) e).getOwner(); + } + if (target instanceof Familiar) { + target = ((Familiar) target).getOwner(); + } + if (e instanceof Player && target instanceof Player) { + Player player = (Player) e; + Player other = (Player) target; + ClanRepository clan = player.getCommunication().getClan(); + if (pulse.isRunning()) { + player.getPacketDispatch().sendMessage("The war hasn't started yet."); + return false; + } + if (!firstClanPlayers.contains(player) && !secondClanPlayers.contains(player)) { + return false; + } + if (other.getCommunication().getClan() == clan) { + player.getPacketDispatch().sendMessage("You can only attack players in a different clan."); + return false; + } + if (!firstClanPlayers.contains(other) && !secondClanPlayers.contains(other)) { + player.getPacketDispatch().sendMessage("You can't attack this player."); + return false; + } + } + return true; + } + + /** + * Removes the player from the game. + * @param player The player. + * @param players The players list. + */ + public void remove(Player player, List players) { + players.remove(player); + if (!pulse.isRunning() && players.isEmpty()) { + finishWar(); + } + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GameObject) { + GameObject object = (GameObject) target; + if (object.getId() == 28214 || object.getId() == 28140) { + e.getProperties().setTeleportLocation(getLeaveLocation()); + return true; + } + } + return false; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player player = (Player) e; + player.getInterfaceManager().closeOverlay(); + player.getInteraction().remove(ATTACK_OPTION); + if (firstClanPlayers.contains(player)) { + remove(player, firstClanPlayers); + } else if (secondClanPlayers.contains(player)) { + remove(player, secondClanPlayers); + } else { + viewingPlayers.remove(player); + } + sendGameData(); + player.getSkullManager().setSkullCheckDisabled(false); + player.getSkullManager().setWilderness(false); + if (logout) { + e.setLocation(getLeaveLocation()); + } + } else if (e instanceof Familiar && !(e instanceof Pet)) { + Familiar familiar = (Familiar) e; + if (familiar.isCombatFamiliar()) { + familiar.reTransform(); + } + } + return true; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + if (identifier.equals("join")) { + join((Player) args[0]); + return true; + } + if (identifier.equals("leavefc")) { + Player p = (Player) args[0]; + p.getProperties().setTeleportLocation(getLeaveLocation()); + return true; + } + return null; + } + + /** + * Gets the leaving location. + * @return The leaving location. + */ + private static Location getLeaveLocation() { + Location l = Location.create(3265 + RandomFunction.randomize(13), 3675 + RandomFunction.randomize(18), 0); + while (!RegionManager.isTeleportPermitted(l)) { + l = l.transform(1, 1, 0); + } + return l; + } + + /** + * Makes the player join the game. + * @param player The player. + */ + public void join(Player player) { + if (!pulse.isRunning()) { + enterViewingRoom(player); + return; + } + boolean first = player.getCommunication().getClan() == firstClan; + if (first) { + if (firstClanPlayers.contains(player)) { + return; + } + firstClanPlayers.add(player); + player.getProperties().setTeleportLocation(base.transform(34 + RandomFunction.randomize(4), 10, 0)); + } else { + if (secondClanPlayers.contains(player)) { + return; + } + secondClanPlayers.add(player); + player.getProperties().setTeleportLocation(base.transform(26 + RandomFunction.randomize(4), 118, 0)); + } + sendGameData(); + } + + /** + * Sends messages to the list of players. + * @param players The players list. + */ + private static void sendWarDeclaration(List players) { + Location check = Location.create(3272, 3682, 0); + for (ClanEntry e : players) { + Player p = e.getPlayer(); + if (p.getLocation().withinDistance(check, 128)) { + p.getPacketDispatch().sendMessage("Your clan has been challenged to a clan war!"); + p.getPacketDispatch().sendMessage("Step through the purple portal in the Challenge Hall."); + p.getPacketDispatch().sendMessage("Battle will commence in 2 minutes."); + } + } + } + + @Override + public void configure() { + setZoneType(ZoneType.SAFE.getId()); + DynamicRegion[] regions = DynamicRegion.create(new ZoneBorders(3264, 3712, 3328, 3840)); + setRegionBase(regions); + int x = base.getX(); + int y = base.getY() + 20; + RegionZone multi = new RegionZone(MultiwayCombatZone.getInstance(), new ZoneBorders(x, y, x + 63, y + 88)); + for (DynamicRegion r : regions) { + r.setMulticombat(true); + r.getRegionZones().add(multi); + r.setRegionTimeOut(250); + r.setMusicId(442); + } + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new ClanWarsActivityPlugin(); + } + + /** + * Gets the ticks. + * @return The ticks. + */ + public int getTicks() { + return ticks; + } + + /** + * Sets the ticks. + * @param ticks The ticks to set. + */ + public void setTicks(int ticks) { + this.ticks = ticks; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/clanwars/ClanWarsChallengeRoom.java b/Server/src/main/java/Server/core/game/content/activity/clanwars/ClanWarsChallengeRoom.java new file mode 100644 index 000000000..c79a69385 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/clanwars/ClanWarsChallengeRoom.java @@ -0,0 +1,98 @@ +package core.game.content.activity.clanwars; + +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.map.zone.impl.WildernessZone; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the clan wars challenge room. + * @author Emperor + */ +@Initializable +public final class ClanWarsChallengeRoom extends MapZone implements Plugin { + + /** + * Constructs a new {@code ClanWarsChallengeRoom} {@code Object}. + */ + public ClanWarsChallengeRoom() { + super("clan wars cr", true, ZoneRestriction.RANDOM_EVENTS); + } + + @Override + public void configure() { + register(new ZoneBorders(3264, 3672, 3279, 3695)); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player p = (Player) e; + p.getSkullManager().setWildernessDisabled(true); + p.getSkullManager().setWilderness(false); + p.getInterfaceManager().closeOverlay(); + p.getInteraction().remove(Option._P_ASSIST); + p.getInteraction().set(CWChallengeOption.OPTION); + } + return super.enter(e); + } + + @Override + public boolean leave(final Entity e, final boolean logout) { + if (e instanceof Player) { + Player p = (Player) e; + p.getSkullManager().setWildernessDisabled(false); + p.getInteraction().remove(CWChallengeOption.OPTION); + p.getInteraction().set(Option._P_ASSIST); + if (WildernessZone.isInZone(e)) { + WildernessZone.show(p); + p.getSkullManager().setWilderness(true); + } + } + return super.leave(e, logout); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GameObject) { + GameObject object = (GameObject) target; + Player player = (Player) e; + if (object.getId() == 28213) { + if (player.getCommunication().getClan() == null) { + player.getPacketDispatch().sendMessage("You have to be in a clan to enter this portal."); + } else if (player.getCommunication().getClan().isDefault()) { + player.sendMessage("You can't use the main clan chat for this."); + return true; + } else if (player.getCommunication().getClan().getClanWar() == null) { + player.getPacketDispatch().sendMessage("Your clan has to be in a war."); + } else { + player.getCommunication().getClan().getClanWar().fireEvent("join", player); + } + return true; + } + } + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugin(new CWChallengeOption()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/duel/ChallengeOptionPlugin.java b/Server/src/main/java/Server/core/game/content/activity/duel/ChallengeOptionPlugin.java new file mode 100644 index 000000000..80f1efd57 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/duel/ChallengeOptionPlugin.java @@ -0,0 +1,39 @@ +package core.game.content.activity.duel; + +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Handles the challenge option for dueling. + * @author Vexia + * + */ +public class ChallengeOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + DuelArenaActivity.CHALLENGE_OPTION.setHandler(this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Player other = (Player) node; + if (other.getInterfaceManager().isOpened() || other.getExtension(DuelSession.class) != null) { + player.getPacketDispatch().sendMessage("Other player is busy at the moment."); + return true; + } + if (other.getRequestManager().getTarget() == player && other.getAttribute("duel:partner") == player) { + player.getRequestManager().request(other, other.getAttribute("duel:staked", false) ? DuelArenaActivity.STAKE_REQUEST : DuelArenaActivity.FRIEND_REQUEST); + return true; + } + player.getInterfaceManager().open(DuelArenaActivity.DUEL_TYPE_SELECT); + player.setAttribute("duel:staked", false); + player.setAttribute("duel:partner", other); + player.getConfigManager().set(283, 1 << 26); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/duel/DuelArea.java b/Server/src/main/java/Server/core/game/content/activity/duel/DuelArea.java new file mode 100644 index 000000000..04e6d2f68 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/duel/DuelArea.java @@ -0,0 +1,595 @@ +package core.game.content.activity.duel; + +import java.util.ArrayList; +import java.util.List; + +import core.ServerConstants; +import core.cache.def.impl.ObjectDefinition; +import core.game.container.Container; +import core.game.container.impl.EquipmentContainer; +import core.game.content.dialogue.DialogueAction; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.PulseManager; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneRestriction; +import core.plugin.Plugin; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +/** + * Represents a dueling area. + * @author Vexia + * + */ +public class DuelArea extends MapZone { + + /** + * The respawn locations. + */ + public static final Location[] RESPAWN_LOCATIONS = new Location[] { Location.create(3371, 3275, 0), Location.create(3365, 3276, 0), Location.create(3366, 3274, 0), Location.create(3369, 3274, 0), Location.create(3372, 3275, 0), Location.create(3372, 3266, 0), Location.create(3371, 3269, 0), Location.create(3376, 3270, 0), Location.create(3376, 3273, 0), Location.create(3377, 3275, 0) }; + + /** + * The zone borders set for the area. + */ + private final ZoneBorders border; + + /** + * If this area has obstacles. + */ + private final boolean obstacles; + + /** + * The center location to determine starting points. + */ + private final Location center; + + /** + * The fight option. + */ + private static final Option FIGHT_OPTION = new Option("Fight", 0).setHandler(new OptionHandler() { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getPulseManager().clear("interaction:attack:" + node.hashCode()); + player.getProperties().getCombatPulse().attack(node); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean isDelayed(Player player) { + return false; + } + }); + + /** + * Constructs a new {@Code DuelArea} {@Code Object} + */ + public DuelArea() { + this(-1, null, false, null); + } + + /** + * Constructs a new {@Code DuelArea} {@Code Object} + * @param index the index. + * @param border the border. + * @param obstacles if there is obstacles. + */ + public DuelArea(int index, ZoneBorders border, boolean obstacles, Location center) { + super("Duel Area - " + index, true, ZoneRestriction.FIRES, ZoneRestriction.CANNON, ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.FOLLOWERS); + this.obstacles = obstacles; + this.border = border; + this.center = center; + } + + /** + * Starts a duel between two players. + * @param session the session. + */ + public void duel(final DuelSession session) { + Location[] locations = getStartLocations(session); + session.getPlayer().teleport(locations[0]); + session.getOther().teleport(locations[1]); + session.getPlayer().getInterfaceManager().close(); + session.getPlayer().getInterfaceManager().restoreTabs(); + session.getOther().getInterfaceManager().close(); + session.getOther().getInterfaceManager().restoreTabs(); + session.getPlayer().setAttribute("duel:icon", HintIconManager.registerHintIcon(session.getPlayer(), session.getOther())); + session.getOther().setAttribute("duel:icon", HintIconManager.registerHintIcon(session.getOther(), session.getPlayer())); + session.getPlayer().setAttribute("duel:ammo", new ArrayList()); + session.getOther().setAttribute("duel:ammo", new ArrayList()); + session.getPlayer().setAttribute("vengeance", false); + session.getOther().setAttribute("vengeance", false); + GameWorld.getPulser().submit(new Pulse(4, session.getPlayer(), session.getOther()) { + int count; + + @Override + public boolean pulse() { + String chat = count < 3 ? String.valueOf(3 - count) : "FIGHT!"; + session.getPlayer().sendChat(chat); + session.getOther().sendChat(chat); + return count++ >= 3; + } + + @Override + public void stop() { + super.stop(); + if (session.getPlayer().isActive() && session.getOther().isActive() && session.getFightState() != 2) { + session.setFightState(1); + session.getPlayer().getSkullManager().setSkullCheckDisabled(true); + session.getPlayer().getSkullManager().setWilderness(true); + session.getOther().getSkullManager().setSkullCheckDisabled(true); + session.getOther().getSkullManager().setWilderness(true); + session.getPlayer().getProperties().setMultiZone(true); + session.getOther().getProperties().setMultiZone(true); + } + } + }); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (!e.isPlayer()) { + return true; + } + Player p = e.asPlayer(); + final DuelSession session = getSession(p); + if (session == null) { + return true; + } + if (option.getName().equalsIgnoreCase("eat") && session.hasRule(DuelRule.NO_FOOD)) { + p.sendMessage("You can't eat in this fight."); + return true; + } + if (option.getName().equalsIgnoreCase("drink") && session.hasRule(DuelRule.NO_DRINKS)) { + p.sendMessage("You can't drink in this fight."); + return true; + } + if (option.getName().equalsIgnoreCase("wield") || option.getName().equalsIgnoreCase("wear") && target instanceof Item) { + if (session.isRestrictedEquipment(target.asItem())) { + p.sendMessage("You can't equip that during this duel."); + return true; + } + } + if (option.getName().equalsIgnoreCase("Summon") && !session.hasRule(DuelRule.ENABLE_SUMMONING)) { + p.sendMessage("You cannot summon familiars whilst in a duel."); + return true; + } + if (option.getName().equalsIgnoreCase("drop") && target instanceof Item) { + p.sendMessage("You cannot drop items whilst in a duel."); + return true; + } + switch (target.getId()) { + case 3203: + handleForfeit(p); + return true; + } + return super.interact(e, target, option); + } + + @Override + public boolean move(Entity entity, Location from, Location to) { + if (entity.isPlayer()) { + Player p = entity.asPlayer(); + DuelSession session = getSession(p); + if (session == null) { + return false; + } + return !session.hasRule(DuelRule.NO_MOVEMENT); + } + return super.move(entity, from, to); + } + + @Override + public boolean actionButton(Player player, int interfaceId, int buttonId, int slot, int itemId, int opcode) { + DuelSession session = getSession(player); + if (session == null) { + return true; + } + WeaponInterface inter = player.getExtension(WeaponInterface.class); + if (inter != null && interfaceId == inter.getId()) { + switch (buttonId) { + case 8: + case 10: + if (session.hasRule(DuelRule.NO_SPECIAL_ATTACKS)) { + player.sendMessage("You can't use special attacks during a duel."); + return true; + } + break; + } + } + switch (interfaceId) { + case 182: + player.sendMessage("You can't logout during a duel."); + return true; + case 271: + if (session.hasRule(DuelRule.NO_PRAYER)) { + player.getPrayer().toggle(PrayerType.get(buttonId)); + player.getPrayer().toggle(PrayerType.get(buttonId)); + player.sendMessage("Use of prayer has been turned off for this duel."); + return true; + } + break; + case 430: + if (session.hasRule(DuelRule.NO_MAGIC)) { + player.sendMessage("Use of prayer has been turned off for this duel."); + return true; + } + break; + } + return super.actionButton(player, interfaceId, buttonId, slot, itemId, opcode); + } + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (e.isPlayer() && target instanceof Player && !checkAttack(e.asPlayer(), ((Player) target))) { + return false; + } + if (e instanceof Familiar && target instanceof Player) { + Familiar f = (Familiar) e; + Player o = f.getOwner(); + if (o != null && target.asPlayer() != getSession(o).getOpposite(o)) { + return false; + } + } + if (e instanceof Familiar && target instanceof Familiar) { + Familiar f = (Familiar) e; + Familiar t = (Familiar) target; + if (getSession(f.getOwner()).getOpposite(f.getOwner()) != t.getOwner()) { + return false; + } + } + if (e.isPlayer()) { + Player p = e.asPlayer(); + DuelSession session = getSession(p); + if (session == null) { + return false; + } + boolean canAttack = true; + switch (style) { + case MAGIC: + canAttack = !session.hasRule(DuelRule.NO_MAGIC); + break; + case MELEE: + canAttack = !session.hasRule(DuelRule.NO_MELEE); + break; + case RANGE: + canAttack = !session.hasRule(DuelRule.NO_RANGE); + break; + } + if (!canAttack) { + p.sendMessage(StringUtils.formatDisplayName(style.name().toLowerCase()) + " has been turned off for this duel."); + return false; + } + if (session.hasRule(DuelRule.FUN_WEAPONS) && (p.getEquipment().get(EquipmentContainer.SLOT_WEAPON) == null || !p.getEquipment().get(EquipmentContainer.SLOT_WEAPON).getDefinition().getConfiguration("fun_weapon", false))) { + p.sendMessages("This is a 'fun weapon' duel. You can only use flowers, basket of eggs, or a", "rubber chicken."); + return false; + } + if (target instanceof Familiar) { + Familiar f = (Familiar) target; + if (f.getOwner() != null && getSession(p).getOpposite(p) != f.getOwner()) { + p.sendMessage("You can't attack that familiar."); + return false; + } + } + } + return true; + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (e.isPlayer()) { + e.asPlayer().getDialogueInterpreter().sendDialogue("Coward! You can't teleport from a duel."); + } + return false; + } + + @Override + public boolean enter(Entity e) { + if (e.isPlayer()) { + getSession(e.asPlayer()); + e.getProperties().setSafeZone(true); + e.getProperties().setSpawnLocation(RandomFunction.getRandomElement(RESPAWN_LOCATIONS)); + e.asPlayer().getInteraction().remove(DuelArenaActivity.CHALLENGE_OPTION); + e.asPlayer().getInteraction().set(FIGHT_OPTION); + } else if (e instanceof Familiar) { + Familiar f = (Familiar) e; + Player o = f.getOwner(); + if (o != null && !o.getFamiliarManager().hasPet()) { + DuelSession s = getSession(f.getOwner()); + if (s != null && s.hasRule(DuelRule.ENABLE_SUMMONING)) { + f.transform(); + } + } + f.getProperties().setMultiZone(true); + } + return super.enter(e); + } + + @SuppressWarnings("deprecation") + @Override + public boolean leave(Entity entity, boolean logout) { + entity.getProperties().setSafeZone(false); + if (entity instanceof Player) { + Player p = entity.asPlayer(); + if (logout) { + p.setLocation(RandomFunction.getRandomElement(RESPAWN_LOCATIONS)); + } + p.lock(1); + leave(p); + DuelSession session = getSession(p); + if (session == null) { + return true; + } + session.leave(p, logout ? 1 : p.getAttribute("duel:forfeit", false) ? 0 : 2); + remove(session.getOpposite(p)); + leave(session.getOpposite(p)); + } else if (entity instanceof Familiar) { + Familiar familiar = (Familiar) entity; + if (familiar.isCombatFamiliar()) { + familiar.reTransform(); + } + familiar.getProperties().setMultiZone(false); + } + return super.leave(entity, logout); + } + + @Override + public void configure() { + register(border); + } + + /** + * Handles the leaving of a player. + * @param p the player. + */ + private void leave(Player p) { + if (p.getAttribute("duel:ammo", null) != null) { + List ammo = p.getAttribute("duel:ammo"); + Container c = new Container(40); + for (GroundItem item : ammo) { + if (item == null) { + continue; + } + if (item.isActive() && GroundItemManager.getItems().contains(item) && item.droppedBy(p)) { + GroundItemManager.destroy(item); + c.add(item); + } + } + p.getInventory().addAll(c); + } + p.getInteraction().remove(FIGHT_OPTION); + p.getSkullManager().setSkullCheckDisabled(false); + p.getSkullManager().setWilderness(false); + p.getProperties().setSpawnLocation(ServerConstants.HOME_LOCATION); + p.getProperties().setMultiZone(false); + p.getInteraction().set(DuelArenaActivity.CHALLENGE_OPTION); + } + + /** + * Forcefully removes a player. + * @param player the player. + */ + private static void remove(Player player) { + HintIconManager.removeHintIcon(player, player.getAttribute("duel:icon", -1)); + if (player.getExtension(DuelSession.class) != null) { + player.teleport(RandomFunction.getRandomElement(RESPAWN_LOCATIONS)); + } + } + + /** + * Handles the forfeit trapdoor. + * @param p the player. + */ + public static void handleForfeit(Player p) { + DuelSession session = getSession(p); + if (session == null) { + return; + } + if (session.getFightState() != 1) { + p.sendMessage("The duel has not started yet!"); + return; + } + if (session.hasRule(DuelRule.NO_FORFEIT)) { + p.getDialogueInterpreter().sendDialogue("Forfeit has been turned off for this duel."); + return; + } + p.getDialogueInterpreter().sendOptions("Do you wish to forfeit?", "Yes", "No"); + p.getDialogueInterpreter().addAction(new DialogueAction() { + @Override + public void handle(Player player, int buttonId) { + if (buttonId == 2) { + remove(player); + player.setAttribute("duel:forfeit", true); + } + } + }); + } + + /** + * Gets the starting locations for the session. + * @param session the session. + * @return the locations. + */ + public Location[] getStartLocations(DuelSession session) { + Location start = null; + Location[] locations = new Location[2]; + while (start == null) { + start = center.transform(RandomFunction.random(10), RandomFunction.random(session.hasRule(DuelRule.NO_MOVEMENT) ? 6 : 10), 0); + if (isValidLocation(start)) { + locations[locations[0] == null ? 0 : 1] = start; + if (session.hasRule(DuelRule.NO_MOVEMENT)) { + Location l = null; + if (!isValidLocation(l = start.transform(1, 0, 0))) { + if (!isValidLocation(l = start.transform(-1, 0, 0))) { + if (!isValidLocation(l = start.transform(1, 0, 0))) { + if (!isValidLocation(l = start.transform(-1, 0, 0))) { + locations[1] = start; + break; + } + } + } + } + start = l; + locations[1] = l; + break; + } + start = locations[1] == null ? null : start; + } else { + start = null; + } + } + return locations; + } + + @Override + public boolean startDeath(Entity entity, Entity killer) { + if (entity instanceof Player) { + Player k = killer instanceof Player ? killer.asPlayer() : killer instanceof Familiar ? ((Familiar) killer).getOwner() : null; + if (k != null) { + k.getImpactHandler().setDisabledTicks(10); + k.getSkills().heal(100); + k.lock(5); + } + } + return true; + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e.isPlayer() && (killer.isPlayer() || killer instanceof Familiar)) { + Player k = killer instanceof Familiar ? ((Familiar) killer).getOwner() : killer.asPlayer(); + if (k != null) { + k.getSkills().heal(100); + PulseManager.cancelDeathTask(e); + } + } + return super.death(e, killer); + } + + /** + * Checks if the location is valid to start on. + * @param location the location. + * @return {@code True} if so. + */ + public boolean isValidLocation(Location location) { + return RegionManager.isTeleportPermitted(location) && RegionManager.getObject(location) == null; + } + + /** + * Checks the attack of a player. + * @param player the player. + * @param target the target. + * @return {@code True} if so. + */ + public boolean checkAttack(Player player, Player target) { + DuelSession session = getSession(player); + if (session == null) { + return false; + } + if (session.getOpposite(player) != target) { + player.sendMessage("You can only attack your opponent!"); + return false; + } + if (session.getFightState() != 1) { + player.sendMessage("You can't attack yet!"); + return false; + } + return true; + } + + /** + * Gets the duel session for the player. + * @param player the player. + * @return the duel session. + */ + public static DuelSession getSession(Player player) { + DuelSession session = player.getExtension(DuelSession.class); + if (session == null) { + remove(player); + } + return session; + } + + /** + * Gets the obstacles. + * @return the obstacles. + */ + public boolean isObstacles() { + return obstacles; + } + + /** + * Gets the border. + * @return the border. + */ + public ZoneBorders getBorder() { + return border; + } + + /** + * Gets the center. + * @return the center. + */ + public Location getCenter() { + return center; + } + + /** + * Handles the forfeit trapdoor plugin. + * @author Vexia + * + */ + public static class ForfeitTrapdoorPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(3203).getHandlers().put("option:forfeit", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + handleForfeit(player); + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + Location loc = null; + if (node instanceof Player) { + DuelSession session = getSession(node.asPlayer()); + if (session != null && session.hasRule(DuelRule.NO_MOVEMENT)) { + loc = node.getLocation(); + } + } + return loc; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/duel/DuelArenaActivity.java b/Server/src/main/java/Server/core/game/content/activity/duel/DuelArenaActivity.java new file mode 100644 index 000000000..d31cce22f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/duel/DuelArenaActivity.java @@ -0,0 +1,229 @@ +package core.game.content.activity.duel; + +import java.util.ArrayList; +import java.util.List; + +import core.game.component.Component; +import core.game.content.activity.ActivityPlugin; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.impl.PulseManager; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.RequestType; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the Duel Arena activity. + * @author Emperor + * @author Vexia + * + */ +@Initializable +public final class DuelArenaActivity extends ActivityPlugin { + + /** + * The friendly duel request. + */ + public static final RequestType FRIEND_REQUEST = new RequestType("Sending duel offer...", ":duelfriend:", new DuelReqModule(false)); + + /** + * The staked duel request. + */ + public static final RequestType STAKE_REQUEST = new RequestType("Sending duel offer...", ":duelstake:", new DuelReqModule(true)); + + /** + * The dueling areas. + */ + public static final DuelArea[] DUEL_AREAS = new DuelArea[] { new DuelArea(0, new ZoneBorders(3332, 3244, 3357, 3258), false, Location.create(3345, 3251, 0)), new DuelArea(1, new ZoneBorders(3364, 3244, 3388, 3259), true, Location.create(3378, 3251, 0)), new DuelArea(2, new ZoneBorders(3333, 3224, 3357, 3239), true, Location.create(3345, 3231, 0)), new DuelArea(3, new ZoneBorders(3364, 3225, 3388, 3240), false, Location.create(3376, 3231, 0)), new DuelArea(4, new ZoneBorders(3333, 3205, 3357, 3220), false, Location.create(3346, 3212, 0)), new DuelArea(5, new ZoneBorders(3364, 3206, 3388, 3221), true, Location.create(3377, 3213, 0)) }; + + /** + * The challenge option. + */ + public static final Option CHALLENGE_OPTION = new Option("Challenge", 0); + + /** + * The select duel type component. + */ + public static final Component DUEL_TYPE_SELECT = new Component(640); + + /** + * The overlay. + */ + private static final Component OVERLAY = new Component(638); + + /** + * The scoreboard. + */ + private static final String[] SCOREBOARD = new String[50]; + + /** + * Constructs a new {@code DuelArenaActivity} {@code Object}. + */ + public DuelArenaActivity() { + super("Duel arena", false, false, true); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player player = (Player) e; + player.getInterfaceManager().openOverlay(OVERLAY); + player.getInteraction().set(CHALLENGE_OPTION); + player.getConfigManager().set(286, 0); + } + return super.enter(e); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player player = (Player) e; + player.getInterfaceManager().closeOverlay(); + player.getInteraction().remove(CHALLENGE_OPTION); + } + return super.leave(e, logout); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return this; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (e.isPlayer() && e.asPlayer().getZoneMonitor().getZones().size() > 1) { + return super.continueAttack(e, target, style, message); + } + return false; + } + + @Override + public boolean interact(Entity e, Node target, Option o) { + if (e.isPlayer()) { + switch (target.getId()) { + case 3192: + openScoreboard(e.asPlayer()); + return true; + } + } + return super.interact(e, target, o); + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e.isPlayer() && e.asPlayer().getZoneMonitor().getZones().size() > 1) { + return true; + } + if (e instanceof Player && killer instanceof Player) { + e.getSkills().heal(100); + PulseManager.cancelDeathTask(e); + return true; + } + return true; + } + + @Override + public void configure() { + for (DuelArea area : DUEL_AREAS) { + ZoneBuilder.configure(area); + } + parseScoreboard(); + register(new ZoneBorders(3325, 3201, 3396, 3280)); + PluginManager.definePlugin(new DuelArea.ForfeitTrapdoorPlugin()); + PluginManager.definePlugins(new DuelSession(null, null, false), new DuelComponentPlugin(), new ChallengeOptionPlugin()); + } + + /** + * Opens the scoreboard. + * @param player the player. + */ + public static void openScoreboard(Player player) { + player.lock(2); + parseScoreboard(); + player.getInterfaceManager().open(new Component(632)); + int index = 0; + for (int i = 16; i < 65; i++) { + player.getPacketDispatch().sendString(SCOREBOARD[index] == null ? "" : SCOREBOARD[index], 632, i - 1); + index++; + } + } + + /** + * Parses the scoreboard data from the database. + */ + public static void parseScoreboard() { + /*Connection connection = SQLManager.getConnection(); + if (connection == null) { + return; + } + java.sql.PreparedStatement statement; + try { + statement = connection.prepareStatement("SELECT * FROM duel_scoreboard WHERE id <= 50"); + ResultSet set = statement.executeQuery(); + while (set.next()) { + SCOREBOARD[set.getInt(1) - 1] = set.getString(2); + } + statement = connection.prepareStatement("DELETE FROM duel_scoreboard WHERE id > 50"); + statement.executeUpdate(); + } catch (SQLException e) { + SQLManager.close(connection); + e.printStackTrace(); + } + SQLManager.close(connection);*/ + } + + /** + * Inserts an entry into the scoreboard. + * @param winner the winner. + * @param looser the looser. + */ + public static void insertEntry(Player winner, Player looser) { + /*String entry = winner.getUsername() + " (" + winner.getProperties().getCurrentCombatLevel() + ") beat " + looser.getUsername() + " (" + looser.getProperties().getCurrentCombatLevel() + ")"; + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return; + } + java.sql.PreparedStatement statement; + try { + statement = connection.prepareStatement("UPDATE duel_scoreboard SET id = ID + 1"); + statement.executeUpdate(); + statement = connection.prepareStatement("INSERT INTO duel_scoreboard (id,entry) VALUES(?,?)"); + statement.setInt(1, 1); + statement.setString(2, entry); + statement.executeUpdate(); + } catch (SQLException e) { + SQLManager.close(connection); + e.printStackTrace(); + } + SQLManager.close(connection);*/ + } + + /** + * Gets the dueling area. + * @param obstacles if we're using obstacles. + * @return {@code DuelArea} the area. + */ + public static DuelArea getDuelArea(boolean obstacles) { + List options = new ArrayList<>(); + for (DuelArea area : DUEL_AREAS) { + if (!obstacles && area.isObstacles() || obstacles && !area.isObstacles()) { + continue; + } + options.add(area); + } + return options.get(RandomFunction.random(options.size())); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/duel/DuelComponentPlugin.java b/Server/src/main/java/Server/core/game/content/activity/duel/DuelComponentPlugin.java new file mode 100644 index 000000000..2ce967477 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/duel/DuelComponentPlugin.java @@ -0,0 +1,69 @@ +package core.game.content.activity.duel; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.plugin.Plugin; + +/** + * Handles the duel arena components. + * @author Vexia + * + */ +public class DuelComponentPlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(640).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (component.getId()) { + case 640: + boolean staked = false; + switch (button) { + case 20: + Player other = player.getAttribute("duel:partner"); + if (other == null || other.getExtension(DuelSession.class) != null) { + player.getPacketDispatch().sendMessage("Other player is busy at the moment."); + return true; + } + if (player.getAttribute("duel:staked", false) && other.getIronmanManager().isIronman() && !GameWorld.getSettings().isDevMode()) { + other.sendMessage("You can't accept a staked duel as an Ironman."); + player.sendMessage("You can't duel Ironman players."); + return true; + } + player.getInterfaceManager().close(); + if (!player.getAttribute("duel:staked", false)) { + player.getRequestManager().request(other, DuelArenaActivity.FRIEND_REQUEST); + } else { + player.getRequestManager().request(other, DuelArenaActivity.STAKE_REQUEST); + } + return true; + case 18: + case 22: + staked = false; + break; + case 19: + case 21: + staked = true; + if (player.getIronmanManager().isIronman()) { + player.sendMessage("You can't stake as an Iron man."); + staked = false; + } + break; + default: + return false; + } + player.setAttribute("duel:staked", staked); + player.getConfigManager().set(283, (staked ? 2 : 1) << 26); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/duel/DuelReqModule.java b/Server/src/main/java/Server/core/game/content/activity/duel/DuelReqModule.java new file mode 100644 index 000000000..75f3bee27 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/duel/DuelReqModule.java @@ -0,0 +1,33 @@ +package core.game.content.activity.duel; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.RequestModule; + +/** + * Handles a duel request getting accepted. + * @author Emperor + */ +public final class DuelReqModule implements RequestModule { + + /** + * If the duel request is staked. + */ + private boolean staked; + + /** + * Constructs a new {@code DuelReqModule} {@code Object}. + * @param staked If the duel is staked. + */ + public DuelReqModule(boolean staked) { + this.staked = staked; + } + + @Override + public void open(Player player, Player target) { + DuelSession session = new DuelSession(player, target, staked); + player.addExtension(DuelSession.class, session); + target.addExtension(DuelSession.class, session); + session.openRules(); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/duel/DuelRule.java b/Server/src/main/java/Server/core/game/content/activity/duel/DuelRule.java new file mode 100644 index 000000000..cdcfb8fb2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/duel/DuelRule.java @@ -0,0 +1,80 @@ +package core.game.content.activity.duel; + +import core.game.container.impl.EquipmentContainer; + +/** + * Represents a dueling rule. + * @author Emperor + */ +public enum DuelRule { + NO_RANGE(4, "You cannot use Ranged attacks."), NO_MELEE(5, "You cannot use Melee attacks."), NO_MAGIC(6, "You cannot use Magic attacks."), FUN_WEAPONS(12, "You can only attack with 'fun' weapons."), NO_FORFEIT(0, "You cannot forfeit the duel."), NO_DRINKS(7, "You cannot use potions."), NO_FOOD(8, "You cannot use food."), NO_PRAYER(9, "You cannot use Prayer."), NO_MOVEMENT(1, "You cannot move."), OBSTACLES(10, "There will be obstacles in the arena."), ENABLE_SUMMONING(28, "Familiars will be allowed in the arena."), NO_SPECIAL_ATTACKS(13, "You cannot use special attacks."), NO_HATS(14, "", EquipmentContainer.SLOT_HAT), NO_CAPES(15, "", EquipmentContainer.SLOT_CAPE), NO_AMULET(16, "", EquipmentContainer.SLOT_AMULET), NO_WEAPON(17, "You can't use 2H weapons such as bows.", EquipmentContainer.SLOT_WEAPON), NO_SHIELD(19, "You can't use 2H weapons such as bows.", EquipmentContainer.SLOT_SHIELD), NO_BODY(18, "", EquipmentContainer.SLOT_CHEST), NO_LEGS(21, "", EquipmentContainer.SLOT_LEGS), NO_GLOVES(23, "", EquipmentContainer.SLOT_HANDS), NO_RINGS(26, "", EquipmentContainer.SLOT_RING), NO_BOOTS(24, "", EquipmentContainer.SLOT_FEET), NO_ARROWS(27, "", EquipmentContainer.SLOT_ARROWS); + + /** + * The config index. + */ + private final int configIndex; + + /** + * The information to display on the second screen. + */ + private final String info; + + /** + * The equpment slot. + */ + private int equipmentSlot = -1; + + /** + * Constructs a new {@code DuelRule} {@code Object}. + * @param configIndex The config index. + * @param info the info for the second screen. + */ + private DuelRule(int configIndex, String info) { + this.configIndex = configIndex; + this.info = info; + } + + /** + * Constructs a new {@code DuelRule} {@code Object}. + * @param configIndex The config index. + * @param info the info for the second screen. + * @param equipmentSlot the equipment slot. + */ + private DuelRule(int configIndex, String info, int equipmentSlot) { + this.configIndex = configIndex; + this.info = info; + this.equipmentSlot = equipmentSlot; + } + + /** + * Gets the configIndex. + * @return The configIndex. + */ + public int getConfigIndex() { + return configIndex; + } + + /** + * Gets the info. + * @return The info. + */ + public String getInfo() { + return info; + } + + /** + * Gets the equipmentSlot. + * @return the equipmentSlot. + */ + public int getEquipmentSlot() { + return equipmentSlot; + } + + /** + * Sets the equipmentSlot. + * @param equipmentSlot the equipmentSlot to set + */ + public void setEquipmentSlot(int equipmentSlot) { + this.equipmentSlot = equipmentSlot; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/duel/DuelSession.java b/Server/src/main/java/Server/core/game/content/activity/duel/DuelSession.java new file mode 100644 index 000000000..97b6bba56 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/duel/DuelSession.java @@ -0,0 +1,1033 @@ +package core.game.content.activity.duel; + +import java.text.DecimalFormat; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.Container; +import core.game.container.ContainerType; +import core.game.container.access.InterfaceContainer; +import core.game.container.impl.EquipmentContainer; +import core.game.content.global.action.EquipHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.PlayerParser; +import core.game.node.entity.player.link.RunScript; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.system.config.ItemConfigParser; +import core.game.system.monitor.PlayerMonitor; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents a duel session. + * @author Emperor + * @author Vexia + * + */ +public final class DuelSession extends ComponentPlugin { + + /** + * The friendly rules interface. + */ + private static final Component FRIENDLY_INTER = new Component(637).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + decline(player); + return true; + } + }); + + /** + * The staked rules interface. + */ + private static final Component STAKED_INTER = new Component(631).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + decline(player); + return true; + } + }); + + /** + * The friendly rule interface. + */ + private static final Component FRIENDLY_RULE_INTER = new Component(639).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + decline(player); + return true; + } + }); + + /** + * The staked rule interface. + */ + private static final Component STAKED_RULE_INTER = new Component(626).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + decline(player); + return true; + } + }); + + /** + * The friendly victory interface. + */ + private static final Component FRIENDLY_VICTORY = new Component(633); + + /** + * The stake victory. + */ + private static final Component STAKE_VICTORY = new Component(634).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + reward(player); + return true; + } + }); + + /** + * The rules. + */ + private final DuelRule[] rules = new DuelRule[DuelRule.values().length]; + + /** + * The players staked container. + */ + private StakeContainer playerContainer; + + /** + * The targets staked container. + */ + private StakeContainer targetContainer; + + /** + * The first player. + */ + private final Player player; + + /** + * The second player. + */ + private final Player other; + + /** + * If this is a staked duel. + */ + private final boolean staked; + + /** + * The accepting state of the session. + */ + private int acceptState; + + /** + * The fight state (0 not started, 1 started, 2 finished) + */ + private int fightState; + + /** + * Constructs a new {@code DuelSession} {@code Object}. + * @param player The first player. + * @param other The second player. + */ + public DuelSession(Player player, Player other, boolean staked) { + this.player = player; + this.other = other; + this.staked = staked; + } + + /** + * Declines the duel. + * @param player The player declining. + */ + public static void decline(Player player) { + DuelSession session = player.getExtension(DuelSession.class); + if (session == null) { + return; + } + if (session.getAcceptState() == 3 || session.getAcceptState() == 7) { + return; + } + if (session.isStaked()) { + session.getPlayerContainer().release(); + session.getTargetContainer().release(); + session.resetAccept(); + } + session.player.removeExtension(DuelSession.class); + session.other.removeExtension(DuelSession.class); + session.end(); + if (player == session.other) { + session.player.getPacketDispatch().sendMessage("Other player declined " + (session.staked ? "stake and " : "") + "duel options."); + } else { + session.other.getPacketDispatch().sendMessage("Other player declined " + (session.staked ? "stake and " : "") + "duel options."); + } + } + + /** + * Ends the session. + */ + public void end() { + player.removeAttribute("duel:partner"); + other.removeAttribute("duel:partner"); + player.removeAttribute("duel:staked"); + other.removeAttribute("duel:staked"); + other.removeAttribute("duel:forfeit"); + player.removeAttribute("duel:forfeit"); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeSingleTab(); + player.getInterfaceManager().restoreTabs(); + other.getInterfaceManager().close(); + other.getInterfaceManager().closeSingleTab(); + other.getInterfaceManager().restoreTabs(); + other.getLocks().unlockMovement(); + player.getLocks().unlockMovement(); + player.getHintIconManager().clear(); + other.getHintIconManager().clear(); + heal(player); + heal(other); + for (DuelRule rule : rules) { + if (rule != null) { + player.getLocks().unlock(rule.name().toLowerCase(), true, player); + other.getLocks().unlock(rule.name().toLowerCase(), true, other); + } + } + } + + /** + * Heals a player after a duel. + * @param p the player. + */ + public void heal(Player p) { + p.fullRestore(); + if (p.getStateManager().hasState(EntityState.POISONED)) { + p.getStateManager().remove(EntityState.POISONED); + } + p.getSkills().restore(); + } + + /** + * Opens the rules interface. + */ + public void openRules() { + player.setAttribute("duel:partner", other); + other.setAttribute("duel:partner", player); + player.setAttribute("duel:staked", staked); + other.setAttribute("duel:staked", staked); + player.removeAttribute("duel:accepted"); + other.removeAttribute("duel:accepted"); + openRules(player, other); + openRules(other, player); + } + + /** + * Opens the rules for a player. + * @param player The player. + */ + private void openRules(Player player, Player opponent) { + player.getConfigManager().set(286, 0); + if (staked) { + StakeContainer container = new StakeContainer(player, this); + if (player == this.player) { + playerContainer = container; + } else { + targetContainer = container; + } + player.getInterfaceManager().open(STAKED_INTER); + player.getPacketDispatch().sendString(opponent.getUsername(), 631, 25); + player.getPacketDispatch().sendString(Integer.toString(opponent.getProperties().getCurrentCombatLevel()), 631, 27); + player.getPacketDispatch().sendString("", 631, 28); + container.open(); + } else { + player.getInterfaceManager().open(FRIENDLY_INTER); + player.getPacketDispatch().sendString(opponent.getUsername(), 637, 16); + player.getPacketDispatch().sendString(Integer.toString(opponent.getProperties().getCurrentCombatLevel()), 637, 18); + player.getPacketDispatch().sendString("", 637, 45); + } + player.getConfigManager().set(286, 0); + } + + /** + * Handles the leaving of a player from the duel area. + * @param p the player who is forced to leave. + * @param type = the type of leaving (0 forfeit, 1 = logout, 2 win) + */ + public void leave(Player p, int type) { + if (fightState == 2) { + return; + } + Player o = getOpposite(p); + o.getImpactHandler().setDisabledTicks(6); + o.teleport(RandomFunction.getRandomElement(DuelArea.RESPAWN_LOCATIONS)); + boolean victory = type == 0 || type == 2 || type == 1 && p.getImpactHandler().getImpactLog().containsKey(o); + fightState = 2; + p.removeExtension(DuelSession.class); + end(); + if (victory) { + if (type == 0) { + o.sendMessage("Well done! " + p.getUsername() + " resigned!"); + } else if (type == 2) { + o.sendMessage("Well done! You have defeated " + p.getUsername() + "!"); + } + victory(o); + } else if (type == 1) { + getContainer(player).release(); + getContainer(o).release(); + o.removeExtension(DuelSession.class); + o.getDialogueInterpreter().sendDialogue("Your opponent timed out, there was no winner!"); + } + DuelArenaActivity.insertEntry(o, p); + } + + /** + * Handles the victory for a player. + * @param player the player. + */ + public void victory(Player player) { + Component component = staked ? STAKE_VICTORY : FRIENDLY_VICTORY; + player.getInterfaceManager().open(component); + player.getPacketDispatch().sendString(getOpposite(player).getUsername(), component.getId(), staked ? 23 : 22); + player.getPacketDispatch().sendString(Integer.toString(getOpposite(player).getProperties().getCurrentCombatLevel()), component.getId(), staked ? 22 : 21); + if (staked) { + getContainer(player).release(); + StakeContainer targetContainer = getOppositeContainer(player); + if (targetContainer.itemCount() > 0) { + InterfaceContainer.generateItems(player, targetContainer.toArray(), new String[] { "Examine" }, 634, 33); + } + Container c = new Container(28, ContainerType.ALWAYS_STACK); + c.addAll(targetContainer); + String log = "defeated => " + getOpposite(player).getName() + " and receieved {"; + for (Item i : c.toArray()) { + if (i == null) { + continue; + } + log += i.getName() + " x " + i.getAmount() + ","; + } + if (log.charAt(log.length() - 1) == ',') { + log = log.substring(0, log.length() - 1); + } + log += "}"; + player.getMonitor().log(log, PlayerMonitor.DUEL_LOG); + } else { + player.removeExtension(DuelSession.class); + } + } + + /** + * Rewards the player. + * @param player the player. + */ + public static void reward(Player player) { + DuelSession session = player.getExtension(DuelSession.class); + if (session == null || session.getFightState() == 4) { + return; + } + StakeContainer targetContainer = session.getOppositeContainer(player); + if (!player.getInventory().hasSpaceFor(targetContainer)) { + player.getBank().addAll(targetContainer); + player.sendMessage("An error occured & the stake transfered to your bank."); + } else { + session.setFightState(4); + player.getInventory().addAll(targetContainer); + } + player.removeExtension(DuelSession.class); + PlayerParser.save(player); + } + + /** + * Handles the accepting of the dule rules. + */ + private void accept() { + DuelSession session = player.getExtension(DuelSession.class); + if (session == null) { + return; + } + switch (session.getAcceptState()) { + case 2: + if (!session.checkRules(session.player) || !session.checkRules(session.other)) { + resetAccept(); + return; + } + session.player.lock(1); + session.other.lock(1); + session.setAcceptState(3); + session.player.removeAttribute("duel:accepted"); + session.other.removeAttribute("duel:accepted"); + session.other.getInterfaceManager().open(session.isStaked() ? STAKED_RULE_INTER : FRIENDLY_RULE_INTER); + session.player.getInterfaceManager().open(session.isStaked() ? STAKED_RULE_INTER : FRIENDLY_RULE_INTER); + session.setAcceptState(4); + session.player.getInterfaceManager().closeSingleTab(); + session.other.getInterfaceManager().closeSingleTab(); + session.player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 11, 12); + session.other.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 11, 12); + StringBuilder before = new StringBuilder(); + StringBuilder during = new StringBuilder(); + if (hasEquipmentRules()) { + before.append("Some worn items will be taken off.
"); + } + if (hasRule(DuelRule.NO_WEAPON) || hasRule(DuelRule.NO_SHIELD)) { + during.append("You can't use 2H weapons such as bows.
"); + } + if (hasRule(DuelRule.NO_DRINKS) || hasRule(DuelRule.NO_FOOD)) { + before.append("Boosted stats will be restored.
"); + } + if (hasRule(DuelRule.NO_PRAYER)) { + before.append("Existing prayers will be stopped.
"); + } + if (before.length() == 0) { + before.append("Nothing will be changed.
"); + } + if (during.length() == 0) { + during.append("You will fight using normal combat.
"); + } + for (DuelRule rule : rules) { + if (rule != null && rule.getEquipmentSlot() == -1) { + during.append(rule.getInfo() + "
"); + } + } + int interfaceId = session.isStaked() ? 626 : 639; + int[] childs = staked ? new int[] { 28, 29, 30, 31, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45 } : new int[] { 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 }; + clearChilds(session.player, interfaceId, childs); + clearChilds(session.other, interfaceId, childs); + String[] tokens = before.toString().split("
"); + for (int i = 0; i < tokens.length; i++) { + session.player.getPacketDispatch().sendString(tokens[i], interfaceId, staked ? (28 + i) : (16 + i)); + session.other.getPacketDispatch().sendString(tokens[i], interfaceId, staked ? (28 + i) : (16 + i)); + } + tokens = during.toString().split("
"); + for (int i = 0; i < tokens.length; i++) { + session.player.getPacketDispatch().sendString(tokens[i], interfaceId, staked ? (34 + i) : (22 + i)); + session.other.getPacketDispatch().sendString(tokens[i], interfaceId, staked ? (34 + i) : (22 + i)); + } + if (staked) { + session.player.getPacketDispatch().sendString(session.getContainer(player).isEmpty() ? "Absolutely nothing!" : getDisplayMessage(session.getContainer(player).toArray()), 626, 25); + session.player.getPacketDispatch().sendString(session.getOppositeContainer(player).isEmpty() ? "Absolutely nothing!" : getDisplayMessage(session.getOppositeContainer(player).toArray()), 626, 26); + session.other.getPacketDispatch().sendString(session.getOppositeContainer(player).isEmpty() ? "Absolutely nothing!" : getDisplayMessage(session.getOppositeContainer(player).toArray()), 626, 25); + session.other.getPacketDispatch().sendString(session.getOppositeContainer(other).isEmpty() ? "Absolutely nothing!" : getDisplayMessage(session.getOppositeContainer(other).toArray()), 626, 26); + } + session.updateToolTip(player, ""); + session.updateToolTip(getOpposite(player), ""); + break; + case 6: + session.player.lock(2); + session.other.lock(2); + session.player.sendMessage("Accepted stake and duel options."); + session.other.sendMessage("Accepted stake and duel options."); + session.setAcceptState(7); + DuelArenaActivity.getDuelArea(hasRule(DuelRule.OBSTACLES)).duel(this); + session.applyRules(session.player); + session.applyRules(session.other); + session.setAcceptState(8); + break; + } + } + + /** + * Applies the rules to a player. + * @param player the player. + */ + public void applyRules(Player player) { + for (DuelRule rule : rules) { + if (rule != null) { + if (rule.getEquipmentSlot() != -1 && player.getEquipment().get(rule.getEquipmentSlot()) != null) { + EquipHandler.unequip(player, rule.getEquipmentSlot(), player.getEquipment().getId(rule.getEquipmentSlot())); + } + player.getLocks().lock(rule.name().toLowerCase(), 100000); + } + } + if (hasRule(DuelRule.NO_SHIELD)) { + Item i = player.getEquipment().get(EquipmentContainer.SLOT_WEAPON); + if (i != null && i.getDefinition().getConfiguration(ItemConfigParser.TWO_HANDED, false)) { + EquipHandler.unequip(player, EquipmentContainer.SLOT_WEAPON, i.getId()); + } + } + if (hasRule(DuelRule.NO_DRINKS) || hasRule(DuelRule.NO_FOOD)) { + player.getSkills().restore(); + } + if (hasRule(DuelRule.NO_PRAYER)) { + player.getPrayer().reset(); + } + } + + /** + * Toggles a rule. + * @param p The player toggling the rule. + * @param index The rule index. + */ + private void toggleRule(Player p, int index) { + DuelSession session = player.getExtension(DuelSession.class); + if (session == null) { + return; + } + session.resetAccept(); + if (rules[index] != null) { + rules[index] = null; + } else { + if (index < 3) { + int count = 0; + for (int i = 0; i < 3; i++) { + if (rules[i] != null) { + count++; + } + } + if (count == 2) { + session.updateToolTip(player, "You can't have No Ranged, No Melee AND No Magic, how would you fight?"); + p.getPacketDispatch().sendMessage("You can't have No Ranged, No Melee AND No Magic, how would you fight?"); + return; + } + } else if ((index == 8 && rules[9] != null) || (index == 9 && rules[8] != null)) { + rules[8] = rules[9] = null; + p.getPacketDispatch().sendMessage(index == 8 ? "You can't have obstacles if you want No Movement." : "You can't have No Movement in an area with obstacles."); + } + if (index == 15 || index == 16) { + player.sendMessage("Beware: You won't be able to use two-handed weapons such as bows."); + } + rules[index] = DuelRule.values()[index]; + } + int value = 0; + for (int i = 0; i < rules.length; i++) { + if (rules[i] != null) { + value |= 1 << rules[i].getConfigIndex(); + } + } + player.getConfigManager().set(286, value); + other.getConfigManager().set(286, value); + } + + /** + * Checks the current rules for restrictions. + */ + private boolean checkRules(Player player) { + Container c = new Container(60); + for (DuelRule rule : rules) { + if (rule != null && rule.getEquipmentSlot() != -1 && player.getEquipment().get(rule.getEquipmentSlot()) != null) { + c.add(player.getEquipment().get(rule.getEquipmentSlot())); + } + } + if (hasRule(DuelRule.FUN_WEAPONS) && !hasFunWeapon(player)) { + updateToolTip(player, "Fun Weapons is selected but you don't have a 'fun weapon'."); + updateToolTip(getOpposite(player), "Fun Weapons is selected but your opponent does not have a 'fun weapon'."); + return false; + } + if (staked) { + c.addAll(getContainer(player)); + c.addAll(getOppositeContainer(player)); + } + if (!player.getInventory().hasSpaceFor(c)) { + updateToolTip(player, "You do not have enough space for the items removed and/or the stake."); + updateToolTip(getOpposite(player), "Your opponent does not have enough space for the items removed and/or the stake."); + return false; + } + return true; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, final int slot, int itemId) { + DuelSession session = player.getExtension(DuelSession.class); + if (session == null) { + return false; + } + switch (component.getId()) { + case 626:// stake rules + if (button == 53) { + requestAccept(player, component); + } + break; + case 639:// friendly rules + if (button == 35) { + requestAccept(player, component); + break; + } + break; + case 631: + if (button == 107) {// decline + decline(player); + break; + } else if (button == 102) { + requestAccept(player, component); + break; + } + final StakeContainer c = session.getContainer(player); + if (button == 103) { + int amount = 0; + switch (opcode) { + case 155: + amount = 1; + break; + case 196: + amount = 5; + break; + case 124: + amount = 10; + break; + case 199: + amount = c.getAmount(c.get(slot)); + break; + case 234: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + c.withdraw(slot, (int) getValue()); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + break; + } + c.withdraw(slot, amount); + break; + } else if (button == 104) { + break; + } + if (button == 107) { + player.getInterfaceManager().close(); + break; + } + if (button >= 57 && button <= 67) { + int index = 12 + ((57 - button) * -1); + if (button == 60) { + index = DuelRule.values().length - 1; + } else if (button == 61) { + index = 15; + } else if (button == 62) { + index = DuelRule.NO_BODY.ordinal(); + } else if (button == 63) { + index = DuelRule.NO_SHIELD.ordinal(); + } else if (button == 64) { + index = DuelRule.NO_LEGS.ordinal(); + } else if (button == 67) { + index = DuelRule.NO_GLOVES.ordinal(); + } else if (button == 66) { + index = DuelRule.NO_BOOTS.ordinal(); + } + session.toggleRule(player, index); + break; + } + if (button >= 29 && button <= 53) { + if (button > 49) { + button--; + } + int index = (button - 29) / 2; + if (index == 11) { + index = 10; + } else if (index == 10) { + index = 11; + } + session.toggleRule(player, index); + break; + } + return false; + case 637: + if (button == 86) { + player.getInterfaceManager().close(); + break; + } else if (button == 83 && session.acceptState < 2) { + requestAccept(player, component); + break; + } + if (button >= 46 && button <= 56) { + int index = 0; + switch (button) { + case 46: + index = DuelRule.NO_HATS.ordinal(); + break; + case 47: + index = DuelRule.NO_CAPES.ordinal(); + break; + case 48: + index = DuelRule.NO_AMULET.ordinal(); + break; + case 49: + index = DuelRule.NO_ARROWS.ordinal(); + break; + case 50: + index = DuelRule.NO_WEAPON.ordinal(); + break; + case 51: + index = DuelRule.NO_BODY.ordinal(); + break; + case 52: + index = DuelRule.NO_SHIELD.ordinal(); + break; + case 53: + index = DuelRule.NO_LEGS.ordinal(); + break; + case 54: + index = DuelRule.NO_RINGS.ordinal(); + break; + case 55: + index = DuelRule.NO_BOOTS.ordinal(); + break; + case 56: + index = DuelRule.NO_GLOVES.ordinal(); + } + session.toggleRule(player, index); + break; + } + if (button >= 19 && button <= 42) { + session.toggleRule(player, (button - 19) / 2); + break; + } + return false; + case 336: + final StakeContainer c1 = player == session.getPlayer() ? session.getPlayerContainer() : session.getTargetContainer(); + switch (opcode) { + case 155: + c1.offer(slot, 1); + break; + case 196: + c1.offer(slot, 5); + break; + case 124: + c1.offer(slot, 10); + break; + case 199: + c1.offer(slot, player.getInventory().getAmount(player.getInventory().get(slot).getId())); + break; + case 234: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + c1.offer(slot, (int) getValue()); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + break; + case 9: + player.getPacketDispatch().sendMessage(player.getInventory().get(slot).getDefinition().getExamine()); + break; + } + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(631, this); + ComponentDefinition.put(637, this); + ComponentDefinition.put(626, this); + ComponentDefinition.put(639, this); + StakeContainer.OVERLAY.setPlugin(this); + return this; + } + + /** + * Requests an accepting of the duel. + * @param player the player. + * @param component the component. + */ + public void requestAccept(Player player, Component component) { + DuelSession session = player.getExtension(DuelSession.class); + if (session == null) { + return; + } + // 1 & 5 are waiing. + // 2 & 6 are completed + if (session.getAcceptState() == (session.getAcceptState() < 3 ? 1 : 5) && session.getOpposite(player).getAttribute("duel:accepted", false)) { + session.setAcceptState(session.getAcceptState() == 1 ? 2 : 6); + session.accept(); + return; + } + if (session.getAcceptState() == 0 || session.getAcceptState() == 4) { + session.setAcceptState(session.getAcceptState() == 0 ? 1 : 5); + player.setAttribute("duel:accepted", true); + session.updateToolTip(player, "Waiting for other player..."); + session.updateToolTip(session.getOpposite(player), "Other player accepted."); + } + } + + /** + * Resets the accept state. + */ + public void resetAccept() { + setAcceptState(getAcceptState() < 3 ? 0 : 4); + player.removeAttribute("duel:accepted"); + other.removeAttribute("duel:accepted"); + } + + /** + * Clears the childs. + * @param childs the childs. + */ + public void clearChilds(Player player, int interfaceId, int... childs) { + for (int i : childs) { + player.getPacketDispatch().sendString("", interfaceId, i); + } + } + + /** + * Updates the tool tip message. + * @param player the player. + * @param message the message. + */ + private void updateToolTip(Player player, String message) { + DuelSession session = player.getExtension(DuelSession.class); + if (session == null) { + return; + } + int interfaceId = 631; + int child = 28; + if (!staked) { + interfaceId = acceptState < 4 ? FRIENDLY_INTER.getId() : FRIENDLY_RULE_INTER.getId(); + child = acceptState < 4 ? 45 : 33; + } else if (acceptState > 3) { + interfaceId = STAKED_RULE_INTER.getId(); + child = 45; + } + player.getPacketDispatch().sendString(message, interfaceId, child); + } + + /** + * Gets the display message for the stake. + * @param items the items. + * @return the message. + */ + private String getDisplayMessage(Item[] items) { + String message = "Absolutely nothing!"; + if (items.length > 0) { + message = ""; + for (int i = 0; i < items.length; i++) { + if (items[i] == null) { + continue; + } + message = message + "" + items[i].getName(); + if (items[i].getAmount() > 1) { + message = message + " x "; + message = message + "" + getFormattedNumber(items[i].getAmount()) + "
"; + } else { + message = message + "
"; + } + } + } + return message; + } + + /** + * Checks if the player has a fun weapon. + * @param player the player. + * @return True + */ + public boolean hasFunWeapon(Player player) { + Container c = new Container(60); + c.addAll(player.getInventory()); + c.addAll(player.getEquipment()); + for (Item item : c.toArray()) { + if (item == null) { + continue; + } + if (item.getDefinition().getConfiguration("fun_weapon", false)) { + return true; + } + } + return false; + } + + /** + * Checks if the item is restricted equipment. + * @param item the item. + * @return {@code True} if so. + */ + public boolean isRestrictedEquipment(Item item) { + if (item == null) { + return false; + } + int slot = item.getDefinition().getConfiguration(ItemConfigParser.EQUIP_SLOT, -1); + if (slot == -1) { + return false; + } + boolean twoHanded = item.getDefinition().getConfiguration(ItemConfigParser.TWO_HANDED, false); + if (slot == EquipmentContainer.SLOT_WEAPON && twoHanded && hasRule(DuelRule.NO_SHIELD)) { + return true; + } + for (DuelRule rule : rules) { + if (rule == null) { + continue; + } + if (rule.getEquipmentSlot() == slot) { + return true; + } + } + return false; + } + + /** + * Checks if this session has equipment rules applied. + * @return {@code True} if so. + */ + public boolean hasEquipmentRules() { + for (DuelRule rule : rules) { + if (rule != null && rule.ordinal() >= DuelRule.NO_HATS.ordinal()) { + return true; + } + } + return false; + } + + /** + * Checks if a rule is active. + * @param r the rule. + * @return {@code True} if so. + */ + public boolean hasRule(DuelRule r) { + return rules[r.ordinal()] != null; + } + + /** + * Gets the opposite container. + * @param player the player. + * @return the container. + */ + public StakeContainer getOppositeContainer(Player player) { + return player == this.player ? targetContainer : playerContainer; + } + + /** + * Gets the players container. + * @param player the player. + * @return the staked container. + */ + public StakeContainer getContainer(Player player) { + return player == this.player ? playerContainer : targetContainer; + } + + /** + * Gets the formatted number. + * @param amount the amount. + * @return the formatted number. + */ + private String getFormattedNumber(int amount) { + return new DecimalFormat("#,###,##0").format(amount).toString(); + } + + /** + * Gets the rule size. + * @return the amount of active rules. + */ + public int getRuleSize() { + int count = 0; + for (DuelRule rule : rules) { + if (rule != null) { + count++; + } + } + return count; + } + + /** + * Gets the opposite. + * @param player the player. + * @return the player. + */ + public Player getOpposite(Player player) { + return this.player == player ? other : this.player; + } + + /** + * Gets the other player. + * @param player the player. + * @return the player. + */ + public Player getOther(Player player) { + return player == this.player ? other : player; + } + + /** + * Gets the rules. + * @return The rules. + */ + public DuelRule[] getRules() { + return rules; + } + + /** + * Gets the playerContainer. + * @return the playerContainer. + */ + public StakeContainer getPlayerContainer() { + return playerContainer; + } + + /** + * Sets the playerContainer. + * @param playerContainer the playerContainer to set + */ + public void setPlayerContainer(StakeContainer playerContainer) { + this.playerContainer = playerContainer; + } + + /** + * Gets the targetContainer. + * @return the targetContainer. + */ + public StakeContainer getTargetContainer() { + return targetContainer; + } + + /** + * Sets the targetContainer. + * @param targetContainer the targetContainer to set + */ + public void setTargetContainer(StakeContainer targetContainer) { + this.targetContainer = targetContainer; + } + + /** + * Gets the player. + * @return the player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the other. + * @return the other. + */ + public Player getOther() { + return other; + } + + /** + * Gets the staked. + * @return the staked. + */ + public boolean isStaked() { + return staked; + } + + /** + * Gets the acceptState. + * @return the acceptState. + */ + public int getAcceptState() { + return acceptState; + } + + /** + * Sets the acceptState. + * @param acceptState the acceptState to set + */ + public void setAcceptState(int acceptState) { + this.acceptState = acceptState; + } + + /** + * Gets the fightState. + * @return the fightState. + */ + public int getFightState() { + return fightState; + } + + /** + * Sets the fightState. + * @param fightState the fightState to set + */ + public void setFightState(int fightState) { + this.fightState = fightState; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/duel/StakeContainer.java b/Server/src/main/java/Server/core/game/content/activity/duel/StakeContainer.java new file mode 100644 index 000000000..815058ae0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/duel/StakeContainer.java @@ -0,0 +1,212 @@ +package core.game.content.activity.duel; + +import core.game.component.Component; +import core.game.container.Container; +import core.game.container.ContainerEvent; +import core.game.container.ContainerListener; +import core.game.container.ContainerType; +import core.game.container.SortType; +import core.game.container.access.InterfaceContainer; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.PlayerParser; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +/** + * Represents the staking container. + * @author Vexia + * + */ +public class StakeContainer extends Container { + + /** + * The inventory params. + */ + private static final Object[] INVY_PARAMS = new Object[] { "", "", "", "Stake-X", "Stake-All", "Stake-10", "Stake-5", "Stake", -1, 0, 7, 4, 93, (336 << 16) }; + + /** + * The withdraw options. + */ + private static final String[] WITHDRAW_OPTIONS = new String[] { "Remove-X", "Remove-All", "Remove-10", "Remove-5", "Remove" }; + + /** + * The overlay interface. + */ + public static final Component OVERLAY = new Component(336); + + /** + * The serial version UID. + */ + private static final long serialVersionUID = 3454088488966242754L; + + /** + * The player of the container. + */ + private final Player player; + + /** + * The dueling session. + */ + private final DuelSession session; + + /** + * The stake listener. + */ + private final StakeListener listener; + + /** + * If the container has been released. + */ + private boolean released; + + /** + * Constructs a new {@Code StakeContainer} {@Code Object} + * @param player the player. + * @param session the session. + */ + public StakeContainer(Player player, DuelSession session) { + super(28, ContainerType.DEFAULT, SortType.ID); + this.player = player; + this.session = session; + this.getListeners().add(listener = new StakeListener()); + } + + /** + * Opens the staking container. + */ + public void open() { + player.getInterfaceManager().openSingleTab(OVERLAY); + player.getPacketDispatch().sendRunScript(150, "IviiiIssssssss", INVY_PARAMS); + player.getPacketDispatch().sendAccessMask(1278, 0, 336, 0, 27); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, 2, 93, player.getInventory(), false)); + } + + /** + * Offers an item to the stake. + * @param slot the slot. + * @param amount the amount. + */ + public void offer(final int slot, int amount) { + final Item item = player.getInventory().get(slot); + if (item == null) { + return; + } + if ((slot < 0 || slot > player.getInventory().capacity() || amount < 1)) { + return; + } + if (!item.getDefinition().isTradeable()) { + player.sendMessage("You can't offer that item."); + return; + } + Item remove = new Item(item.getId(), amount); + if (item.getAmount() > getMaximumAdd(item)) { + item.setAmount(getMaximumAdd(item)); + if (item.getAmount() < 1) { + return; + } + } + remove.setAmount(amount > player.getInventory().getAmount(item) ? player.getInventory().getAmount(item) : amount); + if (player.getInventory().remove(remove, slot, true)) { + session.resetAccept(); + add(remove); + StakeContainer c = session.getOppositeContainer(player); + c.getListener().update(c, c.getEvent()); + } + } + + /** + * Withdraws an item from the container. + * @param slot the slot. + * @param amount the amount. + */ + public void withdraw(final int slot, int amount) { + final Item item = get(slot); + if (item == null) { + return; + } + if ((slot < 0 || slot > player.getInventory().capacity() || amount < 1)) { + return; + } + if (!item.getDefinition().isTradeable()) { + player.sendMessage("You can't offer that item."); + return; + } + Item remove = new Item(item.getId(), amount); + if (item.getAmount() > getMaximumAdd(item)) { + item.setAmount(getMaximumAdd(item)); + if (item.getAmount() < 1) { + return; + } + } + remove.setAmount(amount > getAmount(item) ? getAmount(item) : amount); + if (remove(remove, slot, true) && player.getInventory().add(remove)) { + session.resetAccept(); + shift(); + StakeContainer c = session.getOppositeContainer(player); + c.getListener().update(c, c.getEvent()); + } + } + + /** + * Releases the container back to the player. + */ + public void release() { + if (released) { + return; + } + released = true; + if (!player.getInventory().hasSpaceFor(this)) { + player.getBank().addAll(this); + player.sendMessage("Your stake was sent to your bake due to invalid inventory space."); + return; + } + player.getInventory().addAll(this); + PlayerParser.save(player); + } + + /** + * Gets the serialversionuid. + * @return the serialversionuid. + */ + public static long getSerialversionuid() { + return serialVersionUID; + } + + /** + * Gets the session. + * @return the session. + */ + public DuelSession getSession() { + return session; + } + + /** + * Gets the listener. + * @return the listener. + */ + public StakeListener getListener() { + return listener; + } + + /** + * Represents the container listener for a players stake session. + * @author Vexia + * + */ + public final class StakeListener implements ContainerListener { + + @Override + public void update(Container c, ContainerEvent event) { + InterfaceContainer.generateItems(player, c.toArray(), WITHDRAW_OPTIONS, 631, 103, 12, 3); + InterfaceContainer.generateItems(player, session.getOppositeContainer(player).toArray(), WITHDRAW_OPTIONS, 631, 104, 12, 3); + } + + @Override + public void refresh(Container c) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, 2, 93, player.getInventory(), false)); + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerActivity.kt b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerActivity.kt new file mode 100644 index 000000000..ad22ef41b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerActivity.kt @@ -0,0 +1,89 @@ +package core.game.content.activity.fishingtrawler + +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.build.DynamicRegion +import core.game.world.map.zone.ZoneRestriction +import core.plugin.Initializable +import core.tools.ticksToSeconds +import core.game.content.activity.ActivityManager +import core.game.content.activity.ActivityPlugin +import core.tools.stringtools.colorize + + +/** + * Handles the fishing trawler "waiting room" + * @author Ceikry + */ +private val WAIT_TIME = if(GameWorld.settings?.isDevMode == true) 10 else 203 +private val waitingPlayers = ArrayList() +private val sessions = ArrayList() +private var activity: FishingTrawlerActivity? = null +private var nextStart = GameWorld.ticks + WAIT_TIME +@Initializable +class FishingTrawlerActivity : ActivityPlugin("fishing trawler",false,false,true,ZoneRestriction.CANNON,ZoneRestriction.FIRES,ZoneRestriction.FOLLOWERS,ZoneRestriction.RANDOM_EVENTS) { + + init { + activity = this + } + override fun configure() { + GameWorld.Pulser.submit( + object : Pulse(1){ + override fun pulse(): Boolean { + if((nextStart - GameWorld.ticks) % 100 == 0){ + for(player in waitingPlayers) { + player.sendMessage (colorize("%R${ticksToSeconds(nextStart - GameWorld.ticks) / 60} minutes until next game.")) + } + } + if(GameWorld.ticks >= nextStart && waitingPlayers.isNotEmpty()){ + val session = FishingTrawlerSession(DynamicRegion.create(8011), activity!!) + session.start(waitingPlayers) + sessions.add(session) + waitingPlayers.clear() + nextStart = GameWorld.ticks + WAIT_TIME + } + sessions.removeIf { session -> + if(!session.isActive && session.inactiveTicks >= 100){ + session.clearNPCs() + true + } else { + if(!session.isActive) { + session.inactiveTicks++ + } + false + } + } + return false + } + }) + } + + override fun start(player: Player?, login: Boolean, vararg args: Any?): Boolean { + player ?: return false + waitingPlayers.add(player) + return true + } + + fun addPlayer(player: Player){ + if(waitingPlayers.isEmpty()) { + nextStart = GameWorld.ticks + WAIT_TIME + player.dialogueInterpreter.sendDialogue("Trawler will leave in 2 minutes.","If you have a team get them on board now!") + } + waitingPlayers.add(player) + } + + fun removePlayer(player: Player){ + waitingPlayers.remove(player) + } + + override fun newInstance(p: Player?): ActivityPlugin { + ActivityManager.register(this) + return this + } + + override fun getSpawnLocation(): Location { + return Location.create(2667, 3161, 0) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler.kt b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler.kt new file mode 100644 index 000000000..6764762f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOptionHandler.kt @@ -0,0 +1,241 @@ +package core.game.content.activity.fishingtrawler + +import core.cache.def.impl.ItemDefinition +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.stats.FISHING_TRAWLER_LEAKS_PATCHED +import core.game.node.entity.player.info.stats.STATS_BASE +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.game.content.activity.ActivityManager +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.skill.Skills +import core.tools.stringtools.colorize +import kotlin.math.ceil + +/** + * Option handler for fishing trawler + * @author Ceikry + */ +@Initializable +class FishingTrawlerOptionHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(2178).handlers["option:cross"] = this + ObjectDefinition.forId(2167).handlers["option:fill"] = this + ObjectDefinition.forId(2164).handlers["option:inspect"] = this + ObjectDefinition.forId(2165).handlers["option:inspect"] = this + ObjectDefinition.forId(2166).handlers["option:inspect"] = this + ObjectDefinition.forId(2160).handlers["option:climb-on"] = this + ObjectDefinition.forId(2159).handlers["option:climb-on"] = this + ObjectDefinition.forId(2179).handlers["option:cross"] = this + ObjectDefinition.forId(255).handlers["option:operate"] = this + ItemDefinition.forId(583).handlers["option:bail-with"] = this + ItemDefinition.forId(585).handlers["option:empty"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + when(node?.id){ + 2178 -> { //Cross plank onto boat + if(player.skills.getLevel(Skills.FISHING) < 15){ + player.dialogueInterpreter.sendDialogue("You need to be at least level 15 fishing to play.") + return true + } + player.properties.teleportLocation = Location.create(2672, 3170, 1) + (ActivityManager.getActivity("fishing trawler") as FishingTrawlerActivity).addPlayer(player) + } + 2167 -> { //Fill hole + val session: FishingTrawlerSession? = player.getAttribute("ft-session",null) + session ?: return false + player.lock() + player.pulseManager.run(object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.animator.animate(Animation(827)).also { player.lock() } + 1 -> session.repairHole(player,node.asObject()).also { player.incrementAttribute("/save:$STATS_BASE:$FISHING_TRAWLER_LEAKS_PATCHED"); player.unlock() } + 2 -> return true + } + return false + } + }) + } + 2164,2165 -> { //inspect net + player.dialogueInterpreter.open(18237583) + } + 2166 -> { //inspect reward net + val session: FishingTrawlerSession? = player.getAttribute("ft-session",null) + if(session == null || session.boatSank){ + player.dialogueInterpreter.sendDialogues(player, FacialExpression.GUILTY,"I'd better not go stealing other people's fish.") + return true + } + player.dialogueInterpreter.open(18237582) + } + 2179 -> { //plank from boat to dock + player.properties.teleportLocation = Location.create(2676, 3170, 0) + (ActivityManager.getActivity("fishing trawler") as FishingTrawlerActivity).removePlayer(player) + val session: FishingTrawlerSession? = player.getAttribute("ft-session",null) + session?.players?.remove(player) + player.logoutPlugins.clear() + } + 2159,2160 -> { //barrel + player.properties.teleportLocation = Location.create(2672, 3222, 0) + player.dialogueInterpreter.sendDialogue("You climb onto the floating barrel and begin to kick your way to the","shore.","You make it to the shore tired and weary.") + player.logoutPlugins.clear() + player.appearance.setDefaultAnimations() + player.appearance.sync() + } + 583 -> { //bail-with bucket + val session: FishingTrawlerSession? = player.getAttribute("ft-session",null) + session ?: return false + if(!session.isActive){ + return false + } + if(player.location.y > 0){ + player.sendMessage("You can't scoop water out up here.") + return true + } + player.lock() + player.pulseManager.run( + object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.animator.animate(Animation(4471)) + 1 -> if(player.inventory.remove(node.asItem())) { + if (session.waterAmount > 0) { + session.waterAmount -= 20 + if (session.waterAmount < 0) session.waterAmount = 0 + player.inventory.add(Item(Items.BAILING_BUCKET_585)) + } else { + player.sendMessage("There's no water to remove.") + player.inventory.add(node.asItem()) + } + } + 2 -> player.unlock().also { return true } + } + return false + } + } + ) + } + 585 -> { //Empty bailing bucket + player.lock() + player.pulseManager.run( + object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.animator.animate(Animation(2450)) + 1 -> { + if(player.inventory.remove(node.asItem())) + player.inventory.add(Item(Items.BAILING_BUCKET_583)) + player.unlock() + return true + } + } + return false + } + } + ) + } + 255 -> {//operate winch + player.sendMessage("It seems the winch is jammed - I can't move it.") + } + } + return true + } + +} + +@Initializable +class NetLootDialogue(player: Player? = null): DialoguePlugin(player){ + var session: FishingTrawlerSession? = null + var rolls = 0 + override fun newInstance(player: Player?): DialoguePlugin { + return NetLootDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + session = player.getAttribute("ft-session",null) + if(session == null) return false + rolls = ceil(session!!.fishAmount / session!!.players.size.toDouble()).toInt() + player.dialogueInterpreter.sendOptions("Skip Junk Items?","Yes","No") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(buttonId){ + 1 -> TrawlerLoot.getLoot(rolls,true).forEach { + if(!player.bank.add(it)) GroundItemManager.create(it,player) + } + 2 -> TrawlerLoot.getLoot(rolls,false).forEach { + if(!player.bank.add(it)) GroundItemManager.create(it,player) + } + } + player.sendMessage(colorize("%RYour reward has been sent to your bank.")) + player.skills.addExperience(Skills.FISHING,(((0.015 * player.skills.getLevel(Skills.FISHING))) * player.skills.getLevel(Skills.FISHING)) * rolls) + player.removeAttribute("ft-session") + end() + return true + } + + override fun getIds(): IntArray { + return intArrayOf(18237582) + } + +} + +@Initializable +class NetRepairDialogue(player: Player? = null) : DialoguePlugin(player){ + var session: FishingTrawlerSession? = null + override fun newInstance(player: Player?): DialoguePlugin { + return NetRepairDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + session = player.getAttribute("ft-session",null) + if(session!!.netRipped){ + player.dialogueInterpreter.sendDialogue("The net is ripped and needs repair.") + stage = 10 + } else { + player.dialogueInterpreter.sendDialogue("The net is in perfect condition") + stage = 0 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + session ?: return false + when(stage++){ + 0 -> end() + 10 -> player.dialogueInterpreter.sendOptions("Repair the net?","Yes","No") + 11 -> when(buttonId){ + 1 -> { + end() + session!!.repairNet(player) + } + else -> {} + } + 12 -> end() + } + + return true + } + + override fun getIds(): IntArray { + return intArrayOf(18237583) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOverlay.kt b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOverlay.kt new file mode 100644 index 000000000..db67fe7ad --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerOverlay.kt @@ -0,0 +1,26 @@ +package core.game.content.activity.fishingtrawler + +import core.game.node.entity.player.Player + +private const val configIndex = 391 +private const val interfaceID = 366 +private const val netOkayChild = 27 +private const val netRippedChild = 28 +private const val fishChild = 29 +private const val timeChild = 30 + + +/** + * Handles updating the fishing trawler overlay interface + * @author Ceikry + */ +object FishingTrawlerOverlay { + @JvmStatic + fun sendUpdate(player: Player, waterPercent: Int, NetRipped: Boolean, fishCaught: Int, timeLeft: Int){ + player.configManager.set(configIndex,waterPercent) + player.packetDispatch.sendInterfaceConfig(interfaceID,if(NetRipped) netRippedChild else netOkayChild, false) + player.packetDispatch.sendInterfaceConfig(interfaceID,if(NetRipped) netOkayChild else netRippedChild, true) + player.packetDispatch.sendString("${if(fishCaught > 0) fishCaught else "Nothing"}",interfaceID,fishChild) + player.packetDispatch.sendString("$timeLeft Minutes", interfaceID, timeChild) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface.kt b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface.kt new file mode 100644 index 000000000..93db0b404 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerRewardInterface.kt @@ -0,0 +1,42 @@ +package core.game.content.activity.fishingtrawler + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Plugin +import kotlin.math.ceil + +/** + * THIS will have to be implemented at a later date. + * Interface 367 in our cache, for whatever reason, opens correctly but all the children + * are null or cant hold items. This interface cant even be opened in 2 different versions + * of a cache editor I have. Something is completely fucked about this interface + * in particular. + */ +class FishingTrawlerRewardInterface : ComponentPlugin() { + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(367,this) + return this + } + + override fun open(player: Player?, component: Component?) { + super.open(player, component) + val session: FishingTrawlerSession? = player?.getAttribute("ft-session",null) + session ?: return + + val numRolls = ceil(session.fishAmount / session.players.size.toDouble()).toInt() + player?.removeAttribute("ft-session") + + val loot = ArrayList() + for(i in 0 until numRolls){ + + } + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + TODO("Not yet implemented") + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerSession.kt b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerSession.kt new file mode 100644 index 000000000..41fb8c87a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/FishingTrawlerSession.kt @@ -0,0 +1,279 @@ +package core.game.content.activity.fishingtrawler + +import core.game.component.Component +import core.game.node.`object`.GameObject +import core.game.node.`object`.ObjectBuilder +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.stats.FISHING_TRAWLER_GAMES_WON +import core.game.node.entity.player.info.stats.FISHING_TRAWLER_SHIPS_SANK +import core.game.node.entity.player.info.stats.STATS_BASE +import core.game.node.entity.state.EntityState +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.build.DynamicRegion +import core.game.world.update.flag.context.Animation +import core.plugin.Plugin +import core.tools.Items +import core.tools.RandomFunction +import core.tools.secondsToTicks +import core.tools.ticksToSeconds +import java.util.concurrent.TimeUnit +import kotlin.random.Random + + +/** + * Handles a fishing trawler session + * @author Ceikry + */ +private const val OVERLAY_ID = 366 +private const val TUTORIAL_ID = 368 +private val HOLE_X_COORDS = intArrayOf(29,30,31,32,33,34,35,36) +private const val HOLE_NORTH_Y = 26 +private const val HOLE_SOUTH_Y = 23 +private const val LEAKING_ID = 2167 +private const val PATCHED_ID = 2168 +class FishingTrawlerSession(var region: DynamicRegion, val activity: FishingTrawlerActivity) { + var players: ArrayList = ArrayList() + var netRipped = false + var fishAmount = 0 + var timeLeft = secondsToTicks(600) + var base = region.baseLocation + var isActive = false + var boatSank = false + var hole_locations = ArrayList() + var used_locations = ArrayList() + var maxHoles = 0 + var waterAmount = 0 + var murphy: NPC? = null + val murphyLocations = ArrayList() + val npcs = ArrayList() + var inactiveTicks = 0 + + fun start(pl: ArrayList){ + this.players.addAll(pl) + isActive = true + initHoles() + initMurphy(29,25) + initGulls() + GameWorld.Pulser.submit(TrawlerPulse(this)) + for(player in pl){ + player.interfaceManager.openOverlay(Component(OVERLAY_ID)) + player.interfaceManager.open(Component(TUTORIAL_ID)) + updateOverlay(player) + player.properties.teleportLocation = base.transform(36,24,0) + player.setAttribute("ft-session",this) + player.logoutPlugins.add(TrawlerLogoutPlugin()) + player.stateManager.set(EntityState.TELEBLOCK,timeLeft) + } + } + + fun swapBoatType(fromRegion: Int){ + val newRegion = DynamicRegion.create(fromRegion) + GameWorld.Pulser.submit(SwapBoatPulse(players,newRegion)) + } + + class SwapBoatPulse(val playerList: ArrayList,val newRegion: DynamicRegion) : Pulse(3){ + override fun pulse(): Boolean { + val session: FishingTrawlerSession? = playerList[0].getAttribute("ft-session",null) + session ?: return true + session.region = newRegion + session.base = newRegion.baseLocation + session.clearNPCs() + session.initMurphy(26,26) + session.initGulls() + for(player in playerList){ + player.interfaceManager.closeOverlay() + player.appearance.setAnimations(Animation(188)) + player.properties.teleportLocation = session.base.transform(36,24,0) + player.incrementAttribute("/save:$STATS_BASE:$FISHING_TRAWLER_SHIPS_SANK") + player.stateManager.remove(EntityState.TELEBLOCK) + } + return true + } + } + + class TrawlerPulse(val session: FishingTrawlerSession) : Pulse(){ + var ticks = 0 + override fun pulse(): Boolean { + ticks++ + session.timeLeft-- + + if(session.boatSank){ + session.tickMurphy() + return true + } + + if(ticks % 15 == 0 && !session.netRipped){ + if(RandomFunction.random(100) <= 10){ + session.ripNet() + session.murphy?.sendChat("Arrh! Check that net!") + } else { + session.fishAmount += 3 + } + } + + session.waterAmount += (session.getLeakingHoles()) + if(session.waterAmount >= 500){ + session.boatSank = true + session.isActive = false + session.swapBoatType(7755) + } + + if(RandomFunction.random(100) <= 9){ + session.spawnHole() + } + + if(session.timeLeft <= 0){ + session.isActive = false + for(player in session.players){ + player.interfaceManager.closeOverlay() + player.properties.teleportLocation = Location.create(2666, 3162, 0) + player.logoutPlugins.clear() + player.incrementAttribute("/save:$STATS_BASE:$FISHING_TRAWLER_GAMES_WON") + } + } + + for(player in session.players){ + session.updateOverlay(player) + } + session.tickMurphy() + return !session.isActive + } + } + + fun initHoles(){ + maxHoles = players.size + if(maxHoles > 16) maxHoles = 16 + if(maxHoles < 5) maxHoles = 5 + val tempLocationList = ArrayList() + while(tempLocationList.size < maxHoles){ + val x = HOLE_X_COORDS.random() + val y = if(Random.nextBoolean()) HOLE_NORTH_Y else HOLE_SOUTH_Y + val loc = Location.create(x,y,0) + var alreadyHas = false + for(location in tempLocationList){ + if(location.equals(loc)) { + alreadyHas = true + break + } + } + if(!alreadyHas) { + tempLocationList.add(base.transform(loc.x, loc.y, 0)) + } + } + hole_locations.addAll(tempLocationList) + } + + fun initMurphy(localX: Int, localY: Int){ + murphy = NPC(463) + murphy?.isWalks = false + murphy?.isPathBoundMovement = true + //29,25 -> 36,25 + murphy?.location = base.transform(localX,localY,0) + murphy?.isRespawn = false + for(i in 29..36){ + murphyLocations.add(Location.create(base.transform(i,25,0))) + } + murphy?.init() + npcs.add(murphy!!) + } + + fun clearNPCs(){ + npcs.forEach { + it.clear() + } + npcs.clear() + } + + fun tickMurphy(){ + var phrase = if(boatSank){ + arrayOf("No fishes for you today!","Keep your head above water, shipmate.", "Arrrgh! We sunk!","You'll be joining Davy Jones!").random() + } else if(waterAmount < 200){ + arrayOf("Blistering barnacles!","Let's get a net full of fishes!").random() + } else { + arrayOf("We'll all end up in a watery grave!","My mother could bail better than that!","It's a fierce sea today traveller.").random() + } + if(getLeakingHoles() > 0 && RandomFunction.random(100) <= 15){ + phrase = "The water is coming in matey!" + } + if(RandomFunction.random(100) <= 10){ + murphy?.sendChat(phrase) + } + if(RandomFunction.random(100) <= 6){ + val dest = murphyLocations.random() + murphy?.walkingQueue?.reset() + murphy?.walkingQueue?.addPath(dest.x,dest.y,true) + } + } + + fun initGulls(){ + for(loc in arrayOf(base.transform(38,17,0),base.transform(33,18,0),base.transform(28,16,0),base.transform(28,30,0),base.transform(34,32,0))){ + val npc = NPC(1179) + npc.location = loc + npcs.add(npc) + npc.isRespawn = false + npc.isWalks = true + npc.walkRadius = 6 + npc.init() + } + } + + fun spawnHole(){ + if(hole_locations.isEmpty() && used_locations.isEmpty()) return + val holeLocation = hole_locations.random().also { hole_locations.remove(it) } + if(!ObjectBuilder.replace(GameObject(PATCHED_ID, holeLocation), GameObject(LEAKING_ID, holeLocation, if (holeLocation.y == HOLE_NORTH_Y) 1 else 3)) && !ObjectBuilder.replace(GameObject(2177, holeLocation), GameObject(LEAKING_ID, holeLocation, if (holeLocation.y == HOLE_NORTH_Y) 1 else 3))) { + maxHoles -= 1 + } + } + + fun getLeakingHoles(): Int{ + return maxHoles - hole_locations.size + } + + fun repairHole(player: Player,obj: GameObject){ + if(player.inventory.remove(Item(Items.SWAMP_PASTE_1941))){ + ObjectBuilder.replace(obj,GameObject(PATCHED_ID,obj.location,obj.rotation)) + hole_locations.add(obj.location) + if(RandomFunction.random(100) <= 30){ + murphy?.sendChat("That's the stuff! Fill those holes!") + } + } else { + player.dialogueInterpreter.sendDialogue("You need swamp paste to repair this.") + } + } + + fun ripNet(){ + netRipped = true + } + + fun repairNet(player: Player){ + if(player.inventory.remove(Item(Items.ROPE_954))){ + netRipped = false + player.dialogueInterpreter.sendDialogue("You repair the net.") + } else { + player.dialogueInterpreter.sendDialogue("You need rope to repair this net.") + } + } + + fun updateOverlay(player: Player){ + FishingTrawlerOverlay.sendUpdate(player,((waterAmount / 500.0) * 100).toInt(),netRipped,fishAmount,TimeUnit.SECONDS.toMinutes(ticksToSeconds(timeLeft).toLong()).toInt() + 1) + } +} + +class TrawlerLogoutPlugin : Plugin{ + override fun newInstance(arg: Player?): Plugin { + arg?.location = Location.create(2667, 3161, 0) + val session: FishingTrawlerSession? = arg?.getAttribute("ft-session",null) + session ?: return this + session.players.remove(arg) + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/TrawlerLoot.kt b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/TrawlerLoot.kt new file mode 100644 index 000000000..0b2b18819 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fishingtrawler/TrawlerLoot.kt @@ -0,0 +1,56 @@ +package core.game.content.activity.fishingtrawler + +import core.game.node.item.Item +import core.game.node.item.WeightedChanceItem +import core.tools.Items +import core.tools.RandomFunction + +/** + * Rolls/stores the loot table for fishing trawler + * @author Ceikry + */ +object TrawlerLoot { + val junkItems = arrayOf(Items.BROKEN_ARMOUR_698, Items.BROKEN_ARROW_687, Items.OLD_BOOT_685, Items.BROKEN_GLASS_1469, Items.BROKEN_STAFF_689, Items.BUTTONS_688,Items.DAMAGED_ARMOUR_697, Items.RUSTY_SWORD_686, Items.EMPTY_POT_1931, Items.OYSTER_407) + @JvmStatic + fun getLoot(rolls: Int, skipJunk: Boolean): ArrayList{ + val loot = ArrayList() + for(i in 0 until rolls){ + loot.add(RandomFunction.rollWeightedChanceTable(listOf(*lootTable))) + } + if(skipJunk){ + val removeList = ArrayList() + for(item in loot){ + if(junkItems.contains(item.id)) removeList.add(item) + } + loot.removeAll(removeList) + } + return loot + } + + val lootTable = arrayOf( + WeightedChanceItem(Items.RAW_SHRIMPS_317,1,150), + WeightedChanceItem(Items.RAW_SARDINE_327,1,150), + WeightedChanceItem(Items.RAW_ANCHOVIES_321,1,150), + WeightedChanceItem(Items.RAW_TUNA_359,1,140), + WeightedChanceItem(Items.RAW_LOBSTER_377,1,140), + WeightedChanceItem(Items.RAW_SWORDFISH_371,1,130), + WeightedChanceItem(Items.RAW_SHARK_383,1,120), + WeightedChanceItem(Items.RAW_SEA_TURTLE_395,1,120), + WeightedChanceItem(Items.RAW_MANTA_RAY_389,1,120), + WeightedChanceItem(Items.BROKEN_ARROW_687,1,70), + WeightedChanceItem(Items.BROKEN_GLASS_1469,1,70), + WeightedChanceItem(Items.BROKEN_STAFF_689,1,70), + WeightedChanceItem(Items.BUTTONS_688,1,80), + WeightedChanceItem(Items.DAMAGED_ARMOUR_697,1,70), + WeightedChanceItem(Items.OLD_BOOT_685,1,60), + WeightedChanceItem(Items.OYSTER_407,1,50), + WeightedChanceItem(Items.EMPTY_POT_1931,1,50), + WeightedChanceItem(Items.RUSTY_SWORD_686,1,50), + //Inauthentic rewards + WeightedChanceItem(Items.LOOP_HALF_OF_A_KEY_987,1,40), + WeightedChanceItem(Items.TOOTH_HALF_OF_A_KEY_985,1,40), + WeightedChanceItem(Items.CASKET_405,1,60), + WeightedChanceItem(Items.PIRATES_HAT_2651,1,2), + WeightedChanceItem(Items.LUCKY_CUTLASS_7140,1,2) + ) +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/fog/FOGActivityPlugin.java b/Server/src/main/java/Server/core/game/content/activity/fog/FOGActivityPlugin.java new file mode 100644 index 000000000..c9b6f5464 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fog/FOGActivityPlugin.java @@ -0,0 +1,91 @@ +package core.game.content.activity.fog; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.activity.ActivityPlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the fist of guthix activity. + * @author Vexia + */ +public class FOGActivityPlugin extends ActivityPlugin { + + /** + * The maximum amount of players in a game. + */ + public static final int MAX_PLAYERS = 250; + + /** + * The waiting interface id. + */ + public static final int WAITING_INTERFACE = 731; + + /** + * The current fist of guthix round. + */ + private int round; + + /** + * Constructs a new {@code FOGActivityPlugin} {@code Object} + */ + public FOGActivityPlugin() { + super("Fist of Guthix", false, true, true); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new FOGActivityPlugin(); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + PluginManager.definePlugin(new FOGLobbyZone()); + PluginManager.definePlugin(new FOGWaitingZone()); + PluginManager.definePlugin(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(30204).getHandlers().put("option:enter", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 30204: + player.teleport(Location.create(1675, 5599, 0)); + return true; + } + return true; + } + }); + register(new ZoneBorders(1625, 5638, 1715, 5747)); + } + + /** + * Gets the round. + * @return the round + */ + public int getRound() { + return round; + } + + /** + * Sets the round. + * @param round the round to set. + */ + public void setRound(int round) { + this.round = round; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/fog/FOGLobbyZone.java b/Server/src/main/java/Server/core/game/content/activity/fog/FOGLobbyZone.java new file mode 100644 index 000000000..9b8cbf1f9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fog/FOGLobbyZone.java @@ -0,0 +1,75 @@ +package core.game.content.activity.fog; + +import core.game.component.Component; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Plugin; + +/** + * Represents a zone where players can prepare for a game. + * @author Vexia + */ +public class FOGLobbyZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code FOGHallZone} {@code Object} + */ + public FOGLobbyZone() { + super("Fog Lobby", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public boolean enter(Entity e) { + if (e.isPlayer()) { + sendInterface(e.asPlayer()); + } + return super.enter(e); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (!e.isPlayer()) { + return super.interact(e, target, option); + } + Player player = e.asPlayer(); + switch (target.getId()) { + case 30203: + player.teleport(Location.create(3242, 3574, 0)); + return true; + } + return super.interact(e, target, option); + } + + /** + * Sends the fist of guthix lobby interface. + * @param player the player. + */ + private void sendInterface(Player player) { + player.getInterfaceManager().openOverlay(new Component(FOGActivityPlugin.WAITING_INTERFACE)); + player.getPacketDispatch().sendInterfaceConfig(FOGActivityPlugin.WAITING_INTERFACE, 17, true); + player.getPacketDispatch().sendInterfaceConfig(FOGActivityPlugin.WAITING_INTERFACE, 26, true); + player.getPacketDispatch().sendString("Rating: " + player.getSavedData().getActivityData().getFogRating(), FOGActivityPlugin.WAITING_INTERFACE, 7); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + super.registerRegion(6743); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/fog/FOGPlayer.java b/Server/src/main/java/Server/core/game/content/activity/fog/FOGPlayer.java new file mode 100644 index 000000000..85a0b51df --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fog/FOGPlayer.java @@ -0,0 +1,104 @@ +package core.game.content.activity.fog; + +import core.game.node.entity.player.Player; + +/** + * Represents a fist of guthix player. + * @author Vexia + */ +public class FOGPlayer { + + /** + * The player instance. + */ + private final Player player; + + /** + * The target FOG player. + */ + private final FOGPlayer target; + + /** + * If the player is hunted or a hunter. + */ + private boolean hunted; + + /** + * The amount of fist of guthix charges. + */ + private int charges; + + /** + * Constructs a new {@code FOGPlayer} {@code Object} + * @param player the player. + * @param oponent the other player. + */ + public FOGPlayer(Player player, FOGPlayer oponent) { + this.player = player; + this.target = oponent; + } + + /** + * Switches the roles of the player. + */ + public void switchRoles() { + hunted = !hunted; + } + + /** + * Increments the energy charges. + * @param increment the number to increment. + */ + public void incrementCharges(int increment) { + charges += increment; + } + + /** + * Gets the hunted. + * @return the hunted + */ + public boolean isHunted() { + return hunted; + } + + /** + * Sets the hunted. + * @param hunted the hunted to set. + */ + public void setHunted(boolean hunted) { + this.hunted = hunted; + } + + /** + * Gets the charges. + * @return the charges + */ + public int getCharges() { + return charges; + } + + /** + * Sets the charges. + * @param charges the charges to set. + */ + public void setCharges(int charges) { + this.charges = charges; + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the target. + * @return the target + */ + public FOGPlayer getTarget() { + return target; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/fog/FOGWaitingZone.java b/Server/src/main/java/Server/core/game/content/activity/fog/FOGWaitingZone.java new file mode 100644 index 000000000..b9bb94261 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fog/FOGWaitingZone.java @@ -0,0 +1,49 @@ +package core.game.content.activity.fog; + +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Plugin; + +/** + * Represents the zone where players wait for a match. + * @author Vexia + */ +public class FOGWaitingZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code FOGLobbyZone} {@code Object} + */ + public FOGWaitingZone() { + super("Fog Waiting Room", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public boolean enter(Entity e) { + return super.enter(e); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + return super.interact(e, target, option); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + super.registerRegion(6487); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/fog/FogInteractionHandler.kt b/Server/src/main/java/Server/core/game/content/activity/fog/FogInteractionHandler.kt new file mode 100644 index 000000000..9dae427ab --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fog/FogInteractionHandler.kt @@ -0,0 +1,45 @@ +package core.game.content.activity.fog + +import core.game.content.global.action.ClimbActionHandler +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class FogInteractionHandler : PluginInteraction(30204, 30203){ + + override fun handle(player: Player?, node: Node?): Boolean { + when(node?.id){ + 30204 -> player?.pulseManager?.run(ClimbPulse(player,node as GameObject)).also { return true } + 30203 -> player?.pulseManager?.run(ClimbPulse(player, node as GameObject)).also { return true } + } + return false + } + + class ClimbPulse(val player: Player,val obj: GameObject) : MovementPulse(player,obj, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + player.faceLocation(obj.location) + when(obj.id) { + 30204 -> ClimbActionHandler.climbLadder(player, obj, "climb-down") + 30203 -> ClimbActionHandler.climbLadder(player,obj,"climb-up") + } + return true + } + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.OBJECT) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/fog/ReggieDialogue.kt b/Server/src/main/java/Server/core/game/content/activity/fog/ReggieDialogue.kt new file mode 100644 index 000000000..41e89c54b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/fog/ReggieDialogue.kt @@ -0,0 +1,65 @@ +package core.game.content.activity.fog + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.GameWorld +import core.plugin.Initializable +import core.game.interaction.FOGRewardsInterface +import core.game.content.dialogue.DialoguePlugin + +@Initializable +class ReggieDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + if(GameWorld.settings?.allow_token_purchase == true){ + options("Can I see your shop?","Nevermind.","Can I buy some tokens?") + } else { + options("Can I see your shop?","Nevermind.") + } + stage = 0 + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + FOGRewardsInterface().newInstance(Unit) + return ReggieDialogue(player) + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + var buyAmount = 0 + when(stage){ + 0 -> when(buttonId){ + 1 -> npc("Certainly!").also { stage++ } + 2 -> end() + 3 -> npc("Sure thing. My tokens are 1000 coins","each.").also { stage = 10 } + } + 1 -> end().also { player.interfaceManager.open(Component(732)) } + + //Buying tokens with config option set to true + 10 -> player?.dialogueInterpreter?.sendOptions("How many?","50","100","250","500").also { stage++ } + 11 -> when(buttonId){ + 1 -> buyAmount = 50 + 2 -> buyAmount = 100 + 3 -> buyAmount = 250 + 4 -> buyAmount = 500 + else -> buyAmount = 0 + }.also { + if(buyAmount > 0){ + if(player?.inventory?.containsItem(Item(995, 1000 * buyAmount))!!) { + player?.inventory?.add(Item(12852, buyAmount)) + player?.inventory?.remove(Item(995, 1000 * buyAmount)) + } else { + player?.sendMessage("You dont have enough coins for that.") + } + } + end() + } + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(7601) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/DeliveryBoxHandler.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/DeliveryBoxHandler.kt new file mode 100644 index 000000000..97ce7f8ad --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/DeliveryBoxHandler.kt @@ -0,0 +1,32 @@ +package core.game.content.activity.gnomecooking + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class DeliveryBoxHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(9477).handlers["option:check"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + val jobId = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_JOB_ORDINAL",-1) + if(jobId == -1){ + player.dialogueInterpreter.sendDialogue("You do not currently have a job.") + } else { + val job = GnomeCookingJob.values()[jobId] + val item = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_NEEDED_ITEM", Item(0)) + player.dialogueInterpreter.sendDialogue("I need to deliver a ${item.name.toLowerCase()} to ${NPC(job.npc_id).name.toLowerCase()},","who is ${job.tip}") + } + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GCRewardTokenHandler.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GCRewardTokenHandler.kt new file mode 100644 index 000000000..9d42249b2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GCRewardTokenHandler.kt @@ -0,0 +1,107 @@ +package core.game.content.activity.gnomecooking + +import core.cache.def.impl.ItemDefinition +import core.tools.Items +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.RandomFunction +import core.game.content.dialogue.DialoguePlugin + +val gnomeItems = arrayOf(Items.FRUIT_BATTA_2277, Items.TOAD_BATTA_2255, Items.CHEESE_PLUSTOM_BATTA_2259, Items.WORM_BATTA_2253, Items.VEGETABLE_BATTA_2281, + Items.CHOCOLATE_BOMB_2185, Items.VEG_BALL_2195, Items.TANGLED_TOADS_LEGS_2187, Items.WORM_HOLE_2191, Items.TOAD_CRUNCHIES_2217, Items.WORM_CRUNCHIES_2205, Items.CHOCCHIP_CRUNCHIES_2209, Items.SPICY_CRUNCHIES_2213) + +@Initializable +class GCRewardTokenHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + val def = ItemDefinition.forId(9474) + def.handlers["option:check"] = this + def.handlers["option:activate"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + option ?: return false + + when(option){ + "check" -> { + val charges = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_REDEEMABLE_FOOD",0) + player.dialogueInterpreter.sendDialogue("You have $charges redeemable charges.") + } + "activate" -> { + player.dialogueInterpreter.open(939382893) + } + } + return true + } + + @Initializable + class RewardTokenActivationDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun newInstance(player: Player?): DialoguePlugin { + return RewardTokenActivationDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + player.dialogueInterpreter.sendOptions("How many charges?","1","5","10") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> end().also { + when (buttonId) { + 1 -> sendCharges(1, player) + 2 -> sendCharges(5, player) + 3 -> sendCharges(10, player) + } + } + } + return true + } + + fun sendCharges(amount: Int, player: Player){ + val playerCharges = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_REDEEMABLE_FOOD",0) + if(playerCharges < amount){ + player.dialogueInterpreter.sendDialogue("You don't have that many charges.") + return + } + + if(player.inventory.freeSlots() < amount){ + player.dialogueInterpreter.sendDialogue("You don't have enough space in your inventory.") + return + } + + val itemList = ArrayList() + + for(charge in 0 until amount){ + itemList.add(Item(gnomeItems.random())) + } + + player.dialogueInterpreter.sendDialogue("You put in for delivery of $amount items. Wait a bit...") + GameWorld.Pulser.submit(DeliveryPulse(player,itemList)) + player.setAttribute("/save:$GC_BASE_ATTRIBUTE:$GC_REDEEMABLE_FOOD", playerCharges - amount) + } + + class DeliveryPulse(val player: Player,val items: ArrayList) : Pulse(RandomFunction.random(15,30)){ + override fun pulse(): Boolean { + player.inventory.add(*items.toTypedArray()) + player.dialogueInterpreter.sendDialogue("Your food delivery has arrived!") + return true + } + } + + override fun getIds(): IntArray { + return intArrayOf(939382893) + } + + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingConstants.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingConstants.kt new file mode 100644 index 000000000..8dea239de --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingConstants.kt @@ -0,0 +1,11 @@ +package core.game.content.activity.gnomecooking + +const val GC_BASE_ATTRIBUTE = "gnome_cooking" +const val GC_TUT_PROG = "tutorial:stage" +const val GC_TUT_FIN = "tutorial:complete" +const val GC_JOB_ORDINAL = "job:job_ordinal" +const val GC_JOB_COMPLETE = "job:job_complete" +const val GC_HARD_JOB = "job:hard_job" +const val GC_NEEDED_ITEM = "job:needed_item" +const val GC_POINTS = "job:points" +const val GC_REDEEMABLE_FOOD = "job:redeemable_food" diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingJob.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingJob.kt new file mode 100644 index 000000000..dcc93ecd0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeCookingJob.kt @@ -0,0 +1,19 @@ +package core.game.content.activity.gnomecooking + +enum class GnomeCookingJob(val level: GnomeTipper.LEVEL, val npc_id: Int, val tip: String) { + CPT_ERRDO(GnomeTipper.LEVEL.EASY,3811, "at the top level of the Grand Tree."), + DALILAH(GnomeTipper.LEVEL.EASY,4588, "sitting in the Gnome Restaurant."), + GULLUCK(GnomeTipper.LEVEL.EASY,602, "on the third level of the Grand Tree."), + ROMETTI(GnomeTipper.LEVEL.EASY,601, "on the second level of the Grand Tree."), + NARNODE(GnomeTipper.LEVEL.EASY,670, "at the base of the Grand Tree."), + MEEGLE(GnomeTipper.LEVEL.EASY,4597, "in the terrorbird enclosure."), + PERRDUR(GnomeTipper.LEVEL.EASY,4587,"sitting in the Gnome Restaurant."), + SARBLE(GnomeTipper.LEVEL.EASY,4599, "in the swamp west of the Grand Tree."), + GIMLEWAP(GnomeTipper.LEVEL.HARD,4580, "upstairs in Ardougne castle."), + BLEEMADGE(GnomeTipper.LEVEL.HARD,3810, "at the top of White Wolf Mountain."), + DALBUR(GnomeTipper.LEVEL.HARD,3809, "by the gnome glider in Al Kharid"), + BOLREN(GnomeTipper.LEVEL.HARD,469, "next to the Spirit Tree in Tree Gnome Village"), + SCHEPBUR(GnomeTipper.LEVEL.HARD,3817, "in the battlefield of Khazar, south of the river."), + IMBLEWYN(GnomeTipper.LEVEL.HARD,4586, "on the ground floor of the Magic Guild."), + ONGLEWIP(GnomeTipper.LEVEL.HARD,4585, "in the Wizard's Tower south of Draynor.") +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeTipper.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeTipper.kt new file mode 100644 index 000000000..e8826c9da --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/GnomeTipper.kt @@ -0,0 +1,68 @@ +package core.game.content.activity.gnomecooking + +import core.tools.Items +import core.game.node.item.Item +import core.game.node.item.WeightedChanceItem +import core.tools.RandomFunction + +object GnomeTipper { + private val easyTips = arrayListOf( + WeightedChanceItem(995,50,100,30), + WeightedChanceItem(995,23,76,50), + WeightedChanceItem(995,10,250,20) + ) + + private val hardTips = arrayListOf( + //Uniques Weight = 18 + WeightedChanceItem(Items.GNOME_GOGGLES_9472,1,2), + WeightedChanceItem(Items.GNOME_SCARF_9470,1,2), + WeightedChanceItem(Items.GRAND_SEED_POD_9469,5,7), + WeightedChanceItem(Items.MINT_CAKE_9475,1,4), + WeightedChanceItem(Items.GNOMEBALL_751,1,4), + //Herbs Weight = 20 + WeightedChanceItem(Items.CLEAN_TOADFLAX_2998,3,10), + WeightedChanceItem(Items.CLEAN_SNAPDRAGON_3000,1,10), + //Uncut Gems Weight = 46 + WeightedChanceItem(Items.RED_TOPAZ_1613,1,8), + WeightedChanceItem(Items.DIAMOND_1601,1,7), + WeightedChanceItem(Items.UNCUT_EMERALD_1621,3,5,7), + WeightedChanceItem(Items.UNCUT_JADE_1627,2,3,7), + WeightedChanceItem(Items.UNCUT_SAPPHIRE_1623,6,10,8), + WeightedChanceItem(Items.UNCUT_RUBY_1619,2,3,7), + WeightedChanceItem(Items.UNCUT_OPAL_1625,1,10), + //Runes Weight = 25 + WeightedChanceItem(Items.COSMIC_RUNE_564,11,5), + WeightedChanceItem(Items.NATURE_RUNE_561,10,15,5), + WeightedChanceItem(Items.LAW_RUNE_563,10,5), + WeightedChanceItem(Items.DEATH_RUNE_560,11,5), + WeightedChanceItem(Items.SOUL_RUNE_566,9,5), + //Untipped crossbow bolts Weight = 9 + WeightedChanceItem(Items.MITHRIL_BOLTS_UNF_9379,5,10,3), + WeightedChanceItem(Items.ADAMANT_BOLTSUNF_9380,3,5,3), + WeightedChanceItem(Items.RUNITE_BOLTS_UNF_9381,1,3,3), + //Other tips + WeightedChanceItem(Items.LOOP_HALF_OF_A_KEY_987,1,9), + WeightedChanceItem(Items.TOOTH_HALF_OF_A_KEY_985,1,9), + WeightedChanceItem(Items.PURE_ESSENCE_7937,97,3), + WeightedChanceItem(Items.BIRDS_NEST_5072,1,2), + WeightedChanceItem(Items.YEW_SEED_5315,1,6), + WeightedChanceItem(Items.CALQUAT_TREE_SEED_5290,1,6) + + ) + + enum class LEVEL { + EASY, + HARD + } + + @JvmStatic + fun getTip(level: LEVEL): Item { + return when(level){ + LEVEL.EASY -> RandomFunction.rollWeightedChanceTable(easyTips) + LEVEL.HARD -> RandomFunction.rollWeightedChanceTable(hardTips) + } + } + + + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker.kt new file mode 100644 index 000000000..e8ffc48ff --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaCooker.kt @@ -0,0 +1,66 @@ +package core.game.content.activity.gnomecooking.battas + +import core.tools.Items +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +/** + * Handles cook options for battas + * @author Ceikry + */ +@Initializable +class GnomeBattaCooker : UseWithHandler(Items.RAW_BATTA_2250,9478,9480,9482,9483,9485) { + override fun newInstance(arg: Any?): Plugin { + addHandler(17131, OBJECT_TYPE,this) + addHandler(2728, OBJECT_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val used = event.used + val product = when(used.id){ + Items.RAW_BATTA_2250 -> Item(Items.HALF_BAKED_BATTA_2249) + 9478 -> Item(9479) + 9480 -> Item(9481) + 9483 -> Item(9484) + 9485 -> Item(9486) + 9482 -> Item(2255) + else -> Item(0) + } + if(product.id == 0) return false + cook(player,used.asItem(),product) + return true + } + + fun cook(player: Player, raw: Item, product: Item){ + GameWorld.Pulser.submit(object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.lock().also { player.animator.animate(Animation(883)) } + 2 -> { + if(player.inventory.containsItem(raw)) { + player.inventory.remove(raw) + player.inventory.add(product) + if(product.id == 2255) player.skills.addExperience(Skills.COOKING,82.0) + else player.skills.addExperience(Skills.COOKING,40.0) + } + player.unlock() + return true + } + } + return false + } + }) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFiller.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFiller.kt new file mode 100644 index 000000000..a9266e991 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaDishFiller.kt @@ -0,0 +1,36 @@ +package core.game.content.activity.gnomecooking.battas + +import core.tools.Items +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin + +private const val GIANNE_DOUGH = 2171 +private const val BATTA_MOULD = 2164 +private const val RAW_CRUNCHIES = 2202 + +/** + * Fills gnome batta dishes + * @author Ceikry + */ +@Initializable +class GnomeBattaDishFiller : UseWithHandler(GIANNE_DOUGH) { + override fun newInstance(arg: Any?): Plugin { + addHandler(BATTA_MOULD, ITEM_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val used = event.used + val with = event.usedWith + player.inventory.remove(used.asItem()) + player.inventory.remove(with.asItem()) + player.inventory.add(Item(Items.RAW_BATTA_2250)) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaGarnisher.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaGarnisher.kt new file mode 100644 index 000000000..4f3cb4f0b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaGarnisher.kt @@ -0,0 +1,51 @@ +package core.game.content.activity.gnomecooking.battas + +import core.tools.Items +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +/** + * Handles garnishing of battas + * @author Ceikry + */ +@Initializable +class GnomeBattaGarnisher : UseWithHandler(9479,9481,9484,9486) { + override fun newInstance(arg: Any?): Plugin { + addHandler(Items.EQUA_LEAVES_2128, ITEM_TYPE,this) + addHandler(Items.GNOME_SPICE_2169, ITEM_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val used = event.used.asItem() + val with = event.usedWith.asItem() + var product = -1 + when(with.id){ + Items.EQUA_LEAVES_2128 -> { + when(used.id){ + 9486 -> product = Items.WORM_BATTA_2253 + 9484 -> product = Items.VEGETABLE_BATTA_2281 + 9479 -> product = Items.CHEESE_PLUSTOM_BATTA_2259 + } + } + + Items.GNOME_SPICE_2169 -> { + when(used.id){ + 9481 -> product = Items.FRUIT_BATTA_2277 + } + } + } + if(product == -1) return false + player.inventory.remove(used) + player.inventory.remove(with) + player.inventory.add(Item(product)) + player.skills.addExperience(Skills.COOKING,88.0) + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface.kt new file mode 100644 index 000000000..930808066 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaInterface.kt @@ -0,0 +1,97 @@ +package core.game.content.activity.gnomecooking.battas + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.tools.Items +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + + +private const val WORM_BATTA = 2219 +private const val TOAD_BATTA = 2221 +private const val CHEESE_TOM_BATTA = 2223 +private const val FRUIT_BATTA = 2225 +private const val VEG_BATTA = 2227 + +/** + * Handles the gnome batta interface + * @author Ceikry + */ +@Initializable +class GnomeBattaInterface : ComponentPlugin() { + + override fun open(player: Player?, component: Component?) { + component ?: return + player ?: return + super.open(player, component) + player.packetDispatch.sendItemOnInterface(FRUIT_BATTA,component.id,component.id,3) + player.packetDispatch.sendItemOnInterface(TOAD_BATTA,component.id,component.id,14) + player.packetDispatch.sendItemOnInterface(WORM_BATTA,component.id,component.id,25) + player.packetDispatch.sendItemOnInterface(VEG_BATTA,component.id,component.id,34) + player.packetDispatch.sendItemOnInterface(CHEESE_TOM_BATTA,component.id,component.id,47) + } + + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + component ?: return false + + when(button){ + 3 -> attemptMake(CookedProduct.HALF_MADE_FR,player) + 14 -> attemptMake(CookedProduct.HALF_MADE_TO,player) + 25 -> attemptMake(CookedProduct.HALF_MADE_WO,player) + 34 -> attemptMake(CookedProduct.HALF_MADE_VE,player) + 47 -> attemptMake(CookedProduct.HALF_MADE_CT,player) + } + return true + } + + private fun attemptMake(batta: CookedProduct, player: Player){ + if(!player.inventory.containsItem(Item(Items.GNOME_SPICE_2169)) && (batta == CookedProduct.HALF_MADE_TO || batta == CookedProduct.HALF_MADE_WO) ){ + player.dialogueInterpreter.sendDialogue("You need gnome spices for this.") + return + } + + if(player.skills.getLevel(Skills.COOKING) < batta.levelReq){ + player.dialogueInterpreter.sendDialogue("You don't have the needed level to make this.") + return + } + + var hasAll = true + for(item in batta.requiredItems){ + if(!player.inventory.containsItem(item)){ + hasAll = false + break + } + } + + if(!hasAll){ + player.dialogueInterpreter.sendDialogue("You don't have all the ingredients needed for this.") + return + } + + player.inventory.remove(*batta.requiredItems) + player.inventory.remove(Item(Items.HALF_BAKED_BATTA_2249)) + player.inventory.add(Item(batta.product)) + player.skills.addExperience(Skills.COOKING,batta.experience) + player.interfaceManager.close() + } + + internal enum class CookedProduct(val product: Int,val levelReq: Int, val experience: Double, val requiredItems: Array){ + HALF_MADE_CT(9478,29,40.0, arrayOf(Item(Items.TOMATO_1982), Item(Items.CHEESE_1985))), + HALF_MADE_FR(9480,25,40.0, arrayOf(Item(Items.EQUA_LEAVES_2128,4), Item(Items.LIME_CHUNKS_2122), Item(Items.ORANGE_CHUNKS_2110), Item(Items.PINEAPPLE_CHUNKS_2116))), + HALF_MADE_TO(9482,26,40.0, arrayOf(Item(Items.EQUA_LEAVES_2128), Item(Items.CHEESE_1985), Item(Items.TOADS_LEGS_2152))), + HALF_MADE_VE(9483,28,40.0, arrayOf(Item(Items.TOMATO_1982,2), Item(Items.CHEESE_1985), Item(Items.DWELLBERRIES_2126), Item(Items.ONION_1957), Item(Items.CABBAGE_1965))), + HALF_MADE_WO(9485,27,40.0, arrayOf(Item(Items.KING_WORM_2162), Item(Items.CHEESE_1985))) + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(434,this) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler.kt new file mode 100644 index 000000000..ad6b64b2a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/battas/GnomeBattaPrepareHandler.kt @@ -0,0 +1,29 @@ +package core.game.content.activity.gnomecooking.battas + +import core.cache.def.impl.ItemDefinition +import core.game.component.Component +import core.tools.Items +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * Handles the prepare option for gnome battas + * @author Ceikry + */ +@Initializable +class GnomeBattaPrepareHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(Items.HALF_BAKED_BATTA_2249).handlers["option:prepare"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + player.interfaceManager.open(Component(434)) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker.kt new file mode 100644 index 000000000..8ba79fd29 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlCooker.kt @@ -0,0 +1,64 @@ +package core.game.content.activity.gnomecooking.bowls + +import core.tools.Items +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +@Initializable +class GnomeBowlCooker : UseWithHandler(Items.RAW_GNOMEBOWL_2178,9558,9559,9561,9563) { + override fun newInstance(arg: Any?): Plugin { + addHandler(17131, OBJECT_TYPE,this) + addHandler(2728, OBJECT_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val used = event.used + val product = when(used.id){ + Items.RAW_GNOMEBOWL_2178 -> Item(Items.HALF_BAKED_BOWL_2177) + 9558 -> Item(9560) + 9559 -> Item(Items.TANGLED_TOADS_LEGS_2187) + 9561 -> Item(9562) + 9563 -> Item(9564) + else -> Item(0) + } + if(product.id == 0) return false + cook(player,used.asItem(),product) + return true + } + + fun cook(player: Player, raw: Item, product: Item){ + GameWorld.Pulser.submit(object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.lock().also { player.animator.animate(Animation(883)) } + 2 -> { + if(player.inventory.containsItem(raw)) { + if(product.id > 2180){ + player.inventory.add(Item(Items.GNOMEBOWL_MOULD_2166)) + } + player.inventory.remove(raw) + player.inventory.add(product) + player.skills.addExperience(Skills.COOKING,30.0) + } + player.unlock() + return true + } + } + return false + } + }) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlGarnisher.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlGarnisher.kt new file mode 100644 index 000000000..ca9ae585d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlGarnisher.kt @@ -0,0 +1,59 @@ +package core.game.content.activity.gnomecooking.bowls + +import core.game.interaction.UseWithHandler +import core.tools.Items +import core.game.interaction.NodeUsageEvent +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * Handles garnishing of gnomebowls + * @author Ceikry + */ +@Initializable +class GnomeBowlGarnisher : UseWithHandler(9560,9562,9564) { + override fun newInstance(arg: Any?): Plugin { + addHandler(Items.EQUA_LEAVES_2128, ITEM_TYPE,this) + addHandler(Items.POT_OF_CREAM_2130, ITEM_TYPE,this) + addHandler(Items.CHOCOLATE_DUST_1975, ITEM_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val used = event.used.asItem() + val with = event.usedWith.asItem() + var product = -1 + when(with.id){ + Items.EQUA_LEAVES_2128 -> { + when(used.id){ + 9562 -> product = Items.VEG_BALL_2195 + 9564 -> product = Items.WORM_HOLE_2191 + } + } + + Items.POT_OF_CREAM_2130,Items.CHOCOLATE_DUST_1975 -> { + when(used.id){ + 9560 -> product = Items.CHOCOLATE_BOMB_2185 + } + } + } + if(product == Items.CHOCOLATE_BOMB_2185){ + val reqCream = Item(Items.POT_OF_CREAM_2130,2) + val reqChoc = Item(Items.CHOCOLATE_DUST_1975) + if(!player.inventory.containsItem(reqChoc) || !player.inventory.containsItem(reqCream)){ + player.dialogueInterpreter.sendDialogue("You don't have enough ingredients to finish that.") + return true + } + player.inventory.remove(reqCream) + player.inventory.remove(reqChoc) + } + if(product == -1) return false + player.inventory.remove(used) + player.inventory.remove(with) + player.inventory.add(Item(product)) + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface.kt new file mode 100644 index 000000000..390bffbf4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlInterface.kt @@ -0,0 +1,71 @@ +package core.game.content.activity.gnomecooking.bowls + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.tools.Items +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +@Initializable +class GnomeBowlInterface : ComponentPlugin() { + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + component ?: return false + + when(button){ + 3 -> attemptMake(PreparedProduct.HALF_MADE_WOR_HO,player) + 12 -> attemptMake(PreparedProduct.HALF_MADE_VEG_BA,player) + 21 -> attemptMake(PreparedProduct.HALF_MADE_TAN_TO,player) + 34 -> attemptMake(PreparedProduct.HALF_MADE_CHOC_B,player) + } + return true + } + + private fun attemptMake(bowl: PreparedProduct, player: Player){ + if(!player.inventory.containsItem(Item(Items.GNOME_SPICE_2169)) && (bowl != PreparedProduct.HALF_MADE_CHOC_B) ){ + player.dialogueInterpreter.sendDialogue("You need gnome spices for this.") + return + } + + if(player.skills.getLevel(Skills.COOKING) < bowl.levelReq){ + player.dialogueInterpreter.sendDialogue("You don't have the needed level to make this.") + return + } + + var hasAll = true + for(item in bowl.requiredItems){ + if(!player.inventory.containsItem(item)){ + hasAll = false + break + } + } + + if(!hasAll){ + player.dialogueInterpreter.sendDialogue("You don't have all the ingredients needed for this.") + return + } + + player.inventory.remove(*bowl.requiredItems) + player.inventory.remove(Item(Items.HALF_BAKED_BOWL_2177)) + player.inventory.add(Item(bowl.product)) + player.interfaceManager.close() + } + + internal enum class PreparedProduct(val product: Int,val levelReq: Int, val requiredItems: Array){ + HALF_MADE_CHOC_B(9558,42, arrayOf(Item(Items.CHOCOLATE_BAR_1973,4),Item(Items.EQUA_LEAVES_2128))), + HALF_MADE_TAN_TO(9559,40, arrayOf(Item(Items.TOADS_LEGS_2152,4),Item(Items.CHEESE_1985,2),Item(Items.DWELLBERRIES_2126),Item(Items.EQUA_LEAVES_2128,2))), + HALF_MADE_VEG_BA(9561,35, arrayOf(Item(Items.POTATO_1942,2),Item(Items.ONION_1957,2))), + HALF_MADE_WOR_HO(9563,30, arrayOf(Item(Items.KING_WORM_2162,4),Item(Items.ONION_1957,2))) + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(435,this) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlPrepareHandler.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlPrepareHandler.kt new file mode 100644 index 000000000..51614f260 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomeBowlPrepareHandler.kt @@ -0,0 +1,25 @@ +package core.game.content.activity.gnomecooking.bowls + +import core.cache.def.impl.ItemDefinition +import core.game.component.Component +import core.tools.Items +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class GnomeBowlPrepareHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(Items.HALF_BAKED_BOWL_2177).handlers["option:prepare"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + player.interfaceManager.open(Component(435)) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFiller.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFiller.kt new file mode 100644 index 000000000..c2ee2be5e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/bowls/GnomebowlMouldFiller.kt @@ -0,0 +1,31 @@ +package core.game.content.activity.gnomecooking.bowls + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +private const val GNOME_BOWL_MOLD = 2166 +private const val GIANNE_DOUGH = 2171 + +@Initializable +class GnomebowlMouldFiller : UseWithHandler(GIANNE_DOUGH) { + override fun newInstance(arg: Any?): Plugin { + addHandler(GNOME_BOWL_MOLD, ITEM_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val used = event.used.asItem() + val with = event.usedWith.asItem() + player.inventory.remove(used) + player.inventory.remove(with) + player.inventory.add(Item(Items.RAW_GNOMEBOWL_2178)) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailCooker.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailCooker.kt new file mode 100644 index 000000000..08a1884d2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailCooker.kt @@ -0,0 +1,61 @@ +package core.game.content.activity.gnomecooking.cocktails + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin + +private const val UNCOOKED_CHOC_SAT = 9572 +private const val UNCOOKED_DRUN_DRA = 9576 + +/** + * Handles the cooking of certain cocktail products + * @author Ceikry + */ +@Initializable +class CocktailCooker : UseWithHandler(UNCOOKED_CHOC_SAT, UNCOOKED_DRUN_DRA) { + override fun newInstance(arg: Any?): Plugin { + addHandler(17131, OBJECT_TYPE,this) + addHandler(2728, OBJECT_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + when(event?.used?.id){ + UNCOOKED_CHOC_SAT -> cook(CookedDrinks.COOKED_CHOC_SAT,event.player,event.usedItem) + UNCOOKED_DRUN_DRA -> cook(CookedDrinks.COOKED_DRUN_DRA,event.player,event.usedItem) + } + return true + } + + private fun cook(drink: CookedDrinks, player: Player, raw: Item){ + GameWorld.Pulser.submit(object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.lock().also { player.animator.animate(Animation(883)) } + 2 -> { + if(player.inventory.containsItem(raw)) { + player.inventory.remove(raw) + player.inventory.add(Item(drink.product)) + } + player.unlock() + return true + } + } + return false + } + }) + } + + internal enum class CookedDrinks(val product: Int){ + COOKED_CHOC_SAT(9573), + COOKED_DRUN_DRA(2092) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher.kt new file mode 100644 index 000000000..16a7b9838 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailFinisher.kt @@ -0,0 +1,61 @@ +package core.game.content.activity.gnomecooking.cocktails + +import core.cache.def.impl.ItemDefinition +import core.tools.Items +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin + +private const val UNF_CHOC_SAT = 9573 +private const val UNF_DRUN_DRA = 9575 + +/** + * Handles adding the final ingredients to a couple cocktails + * @author Ceikry + */ +@Initializable +class CocktailFinisher : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(UNF_CHOC_SAT).handlers["option:add-ingreds"] = this + ItemDefinition.forId(UNF_DRUN_DRA).handlers["option:add-ingreds"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + when(node.id){ + UNF_CHOC_SAT -> attemptMake(FinishedDrinks.FIN_CHOC_SAT,player,node) + UNF_DRUN_DRA -> attemptMake(FinishedDrinks.FIN_DRUN_DRA,player,node) + } + return true + } + + private fun attemptMake(drink: FinishedDrinks, player: Player, node: Node){ + var hasAll = true + for(item in drink.requiredItems){ + if(!player.inventory.containsItem(item)){ + hasAll = false + break + } + } + + if(!hasAll){ + player.dialogueInterpreter.sendDialogue("You don't have the ingredients for this.") + return + } + + player.inventory.remove(*drink.requiredItems) + player.inventory.remove(node.asItem()) + player.inventory.add(Item(drink.product)) + } + + internal enum class FinishedDrinks(val product: Int, val requiredItems: Array){ + FIN_CHOC_SAT(2074, arrayOf(Item(Items.CHOCOLATE_DUST_1975),Item(Items.POT_OF_CREAM_2130))), + FIN_DRUN_DRA(9576, arrayOf(Item(Items.PINEAPPLE_CHUNKS_2116),Item(Items.POT_OF_CREAM_2130))) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailShakerHandler.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailShakerHandler.kt new file mode 100644 index 000000000..051bd8662 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/CocktailShakerHandler.kt @@ -0,0 +1,29 @@ +package core.game.content.activity.gnomecooking.cocktails + +import core.cache.def.impl.ItemDefinition +import core.game.component.Component +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * Handles the mix-cocktail option for the cocktail shaker + * @author Ceikry + */ +@Initializable +class CocktailShakerHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(2025).handlers["option:mix-cocktail"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + player.interfaceManager.open(Component(436)) //Gnome cocktail interface + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface.kt new file mode 100644 index 000000000..caf6e81d5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/GnomeCocktailInterface.kt @@ -0,0 +1,98 @@ +package core.game.content.activity.gnomecooking.cocktails + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.game.node.entity.skill.Skills + +private const val WIZARD_BLIZZARD = 2054 +private const val SHORT_GREEN_GUY = 2080 +private const val FRUIT_BLAST = 2084 +private const val PINEAPPLE_PUNCH = 2048 +private const val DRUNK_DRAGON = 2092 +private const val CHOC_SATURDAY = 2074 +private const val BLURBERRY_SPECIAL = 2064 + +/** + * Handles the gnome cocktail interface + * @author Ceikry + */ +@Initializable +class GnomeCocktailInterface : ComponentPlugin() { + + override fun open(player: Player?, component: Component?) { + player ?: return + component ?: return + super.open(player, component) + player.packetDispatch.sendItemOnInterface(WIZARD_BLIZZARD,1,component.id,3) + player.packetDispatch.sendItemOnInterface(SHORT_GREEN_GUY,1,component.id,16) + player.packetDispatch.sendItemOnInterface(FRUIT_BLAST,1,component.id,23) + player.packetDispatch.sendItemOnInterface(PINEAPPLE_PUNCH,1,component.id,32) + player.packetDispatch.sendItemOnInterface(DRUNK_DRAGON,1,component.id,41) + player.packetDispatch.sendItemOnInterface(CHOC_SATURDAY,1,component.id,50) + player.packetDispatch.sendItemOnInterface(BLURBERRY_SPECIAL,1,component.id,61) + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + when(button){ + 3 -> attemptMake(FruitCocktail.WIZARD_BLIZZARD,player) + 16 -> attemptMake(FruitCocktail.SHORT_GREEN_GUY, player) + 23 -> attemptMake(FruitCocktail.FRUIT_BLAST, player) + 32 -> attemptMake(FruitCocktail.PINEAPPLE_PUNCH,player) + 41 -> attemptMake(FruitCocktail.DRUNK_DRAGON,player) + 50 -> attemptMake(FruitCocktail.CHOC_SATURDAY,player) + 61 -> attemptMake(FruitCocktail.BLURBERRY_SPEC,player) + } + return true + } + + private fun attemptMake(cocktail: FruitCocktail, player: Player){ + var hasAll = true + val cookingLevel = player.skills.getLevel(Skills.COOKING) + + if(cookingLevel < cocktail.levelReq){ + player.dialogueInterpreter.sendDialogue("You don't have the necessary level to make that.") + return + } + + for(ingredient in cocktail.requiredItems){ + if(!player.inventory.containsItem(ingredient)){ + hasAll = false + break + } + } + + if(!hasAll){ + player.dialogueInterpreter.sendDialogue("You don't have the ingredients to make that.") + return + } + + player.inventory.remove(*cocktail.requiredItems) + player.inventory.remove(Item(Items.COCKTAIL_SHAKER_2025)) + player.inventory.add(Item(cocktail.product)) + player.skills.addExperience(Skills.COOKING,cocktail.experience) + player.interfaceManager.close() + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(436,this) + return this + } + + internal enum class FruitCocktail(val levelReq: Int, val experience: Double, val product: Int, val requiredItems: Array){ + FRUIT_BLAST(6,50.0,9568, arrayOf(Item(Items.PINEAPPLE_2114),Item(Items.LEMON_2102),Item(Items.ORANGE_2108))), + PINEAPPLE_PUNCH(8,70.0,9569, arrayOf(Item(Items.PINEAPPLE_2114,2),Item(Items.LEMON_2102),Item(Items.ORANGE_2108))), + WIZARD_BLIZZARD(18,110.0, 9566, arrayOf(Item(Items.VODKA_2015,2),Item(Items.GIN_2019),Item(Items.LIME_2120),Item(Items.LEMON_2102),Item(Items.ORANGE_2108))), + SHORT_GREEN_GUY(20,120.0,9567, arrayOf(Item(Items.VODKA_2015),Item(Items.LIME_2120,3))), + DRUNK_DRAGON(32,160.0,9574, arrayOf(Item(Items.VODKA_2015),Item(Items.GIN_2019),Item(Items.DWELLBERRIES_2126))), + CHOC_SATURDAY(33,170.0,9571, arrayOf(Item(Items.WHISKY_2017),Item(Items.CHOCOLATE_BAR_1973),Item(Items.EQUA_LEAVES_2128),Item(Items.BUCKET_OF_MILK_1927))), + BLURBERRY_SPEC(37,180.0,9570, arrayOf(Item(Items.VODKA_2015),Item(Items.BRANDY_2021),Item(Items.GIN_2019),Item(Items.LEMON_2102,2),Item(Items.ORANGE_2108))) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin.kt new file mode 100644 index 000000000..52b046351 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/cocktails/PourMixerPlugin.kt @@ -0,0 +1,86 @@ +package core.game.content.activity.gnomecooking.cocktails + +import core.cache.def.impl.ItemDefinition +import core.tools.Items +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +private const val WIZ_BLIZ_MIX = 9566 +private const val SGG_MIX = 9567 +private const val F_BLAST_MIX = 9568 +private const val P_PUNCH_MIX = 9569 +private const val BLU_SPEC_MIX = 9570 +private const val CHOC_SAT_MIX = 9571 +private const val DRUNK_DRAG_MIX = 9574 +private val mixers = arrayOf(WIZ_BLIZ_MIX, SGG_MIX, F_BLAST_MIX, P_PUNCH_MIX, BLU_SPEC_MIX, CHOC_SAT_MIX, DRUNK_DRAG_MIX) + +/** + * Handles the pouring of mixed drinks into cocktail glasses + * @author Ceikry + */ +@Initializable +class PourMixerPlugin : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + for(mixer in mixers){ + ItemDefinition.forId(mixer).handlers["option:pour"] = this + } + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + when(node.id){ + WIZ_BLIZ_MIX -> attemptMake(PouredDrink.WIZ_BLIZZ,player,node) + SGG_MIX -> attemptMake(PouredDrink.SHORT_G_G,player,node) + F_BLAST_MIX -> attemptMake(PouredDrink.FRUIT_BLAST,player,node) + P_PUNCH_MIX -> attemptMake(PouredDrink.PINE_PUNCH,player,node) + BLU_SPEC_MIX -> attemptMake(PouredDrink.BLUR_SPEC, player,node) + CHOC_SAT_MIX -> attemptMake(PouredDrink.CHOC_SAT,player,node) + DRUNK_DRAG_MIX -> attemptMake(PouredDrink.DRUNK_DRAG,player,node) + } + return true + } + + private fun attemptMake(drink: PouredDrink, player: Player, node: Node){ + if(!player.inventory.containsItem(Item(Items.COCKTAIL_GLASS_2026))){ + player.dialogueInterpreter.sendDialogue("You need a glass to pour this into.") + return + } + + var hasAll = true + for(ingredient in drink.requiredItems){ + if(!player.inventory.containsItem(ingredient)){ + hasAll = false + } + } + + if(!hasAll){ + player.dialogueInterpreter.sendDialogue("You don't have the garnishes for this.") + return + } + + player.inventory.remove(*drink.requiredItems) + player.inventory.remove(node.asItem()) + player.inventory.remove(Item(Items.COCKTAIL_GLASS_2026)) + player.inventory.add(Item(drink.product)) + player.inventory.add(Item(Items.COCKTAIL_SHAKER_2025)) + player.skills.addExperience(Skills.COOKING,50.0) + } + + internal enum class PouredDrink(val product: Int, val requiredItems: Array){ + FRUIT_BLAST(9514, arrayOf(Item(Items.LEMON_SLICES_2106))), + PINE_PUNCH(9512, arrayOf(Item(Items.LIME_CHUNKS_2122),Item(Items.PINEAPPLE_CHUNKS_2116),Item(Items.ORANGE_SLICES_2112))), + WIZ_BLIZZ(9508, arrayOf(Item(Items.PINEAPPLE_CHUNKS_2116),Item(Items.LIME_SLICES_2124))), + SHORT_G_G(9510, arrayOf(Item(Items.LIME_SLICES_2124),Item(Items.EQUA_LEAVES_2128))), + DRUNK_DRAG(9575, arrayOf()), + CHOC_SAT(9572, arrayOf()), + BLUR_SPEC(9520, arrayOf(Item(Items.LEMON_CHUNKS_2104),Item(Items.ORANGE_CHUNKS_2110),Item(Items.EQUA_LEAVES_2128),Item(Items.LIME_SLICES_2124))), + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker.kt new file mode 100644 index 000000000..80d671754 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyCooker.kt @@ -0,0 +1,71 @@ +package core.game.content.activity.gnomecooking.crunchies + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +private const val UNFINISHED_CRUNCHY_CHOC = 9578 +private const val UNFINISHED_CRUNCHY_SPICY = 9580 +private const val UNFINISHED_CRUNCHY_TOAD = 9582 +private const val UNFINISHED_CRUNCHY_WORM = 9584 + +/** + * handles cooking gnome crunchies, don't wanna use standard + * cooking stuff because no experience and no burn chance + * @author Ceikry + */ + +@Initializable +class GnomeCrunchyCooker : UseWithHandler(9577,9579,9581,9583, 2202){ + override fun newInstance(arg: Any?): Plugin { + addHandler(17131, OBJECT_TYPE,this) + addHandler(2728, OBJECT_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val used = event.used.asItem() + val with = event.usedWith + val player = event.player + when(used.id){ + 9577 -> cook(UNFINISHED_CRUNCHY_CHOC,used,player) + 9579 -> cook(UNFINISHED_CRUNCHY_SPICY,used,player) + 9581 -> cook(UNFINISHED_CRUNCHY_TOAD,used,player) + 9583 -> cook(UNFINISHED_CRUNCHY_WORM,used,player) + 2202 -> cook(2201,used,player) + } + return true + } + + private fun cook(product: Int, raw: Item, player: Player){ + GameWorld.Pulser.submit(object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.lock().also { player.animator.animate(Animation(883)) } + 2 -> { + if(player.inventory.containsItem(raw)) { + player.inventory.remove(raw) + player.inventory.add(Item(product)) + if(raw.id != 2202) player.inventory.add(Item(2165)) + } + if(raw.id == 2202){ + player.skills.addExperience(Skills.COOKING,30.0) + } + player.unlock() + return true + } + } + return false + } + }) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyGarnisher.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyGarnisher.kt new file mode 100644 index 000000000..17eb5fab8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyGarnisher.kt @@ -0,0 +1,67 @@ +package core.game.content.activity.gnomecooking.crunchies + +import core.tools.Items +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +/** + * Handles garnishing gnome crunchies + * @author Ceikry + */ + +@Initializable +class GnomeCrunchyGarnisher : UseWithHandler(9578,9580,9582,9584) { + override fun newInstance(arg: Any?): Plugin { + addHandler(Items.CHOCOLATE_DUST_1975, ITEM_TYPE,this) + addHandler(Items.GNOME_SPICE_2169, ITEM_TYPE, this) + addHandler(Items.EQUA_LEAVES_2128, ITEM_TYPE, this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val used = event.used.asItem() + val with = event.usedWith.asItem() + + val product = when(with.id){ + Items.CHOCOLATE_DUST_1975 -> { + when(used.id){ + 9578 -> Items.CHOCCHIP_CRUNCHIES_2209 + else -> -1 + } + } + + Items.GNOME_SPICE_2169 -> { + when(used.id){ + 9584 -> Items.WORM_CRUNCHIES_2205 + 9580 -> Items.SPICY_CRUNCHIES_2213 + else -> -1 + } + } + + Items.EQUA_LEAVES_2128 -> { + when(used.id){ + 9582 -> Items.TOAD_CRUNCHIES_2217 + else -> -1 + } + } + + else -> -1 + } + + if(product == -1) return false + + player.inventory.remove(used) + if(with.id != Items.GNOME_SPICE_2169) + player.inventory.remove(with) + player.inventory.add(Item(product)) + player.skills.addExperience(Skills.COOKING,64.0) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface.kt new file mode 100644 index 000000000..45f42ecc3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyInterface.kt @@ -0,0 +1,91 @@ +package core.game.content.activity.gnomecooking.crunchies + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.game.node.entity.skill.Skills + +private const val TOAD_CRUNCHIES = 9538 +private const val SPICE_CRUNCHIES = 9540 +private const val CHOC_CHIP_CRUNCHIES = 9544 +private const val WORM_CRUNCHIES = 9542 +private const val HALF_BAKED_CRUNCHY = 2201 + +/** + * Handles the gnome crunchy interface + * @author Ceikry + */ +@Initializable +class GnomeCrunchyInterface : ComponentPlugin() { + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + when(button){ + 3 -> attemptMake(HalfMadeCrunchy.TOAD,player) + 10 -> attemptMake(HalfMadeCrunchy.SPICY,player) + 17 -> attemptMake(HalfMadeCrunchy.WORM,player) + 26 -> attemptMake(HalfMadeCrunchy.CHOCCHIP,player) + } + return true + } + + private fun attemptMake(crunchy: HalfMadeCrunchy, player: Player){ + var hasAll = true + + if(player.skills.getLevel(Skills.COOKING) < crunchy.reqLevel){ + player.dialogueInterpreter.sendDialogue("You don't have the required level to make these.") + return + } + + if(!player.inventory.containsItem(Item(Items.GNOME_SPICE_2169))){ + player.dialogueInterpreter.sendDialogue("You need some gnome spice to make these.") + return + } + + for(item in crunchy.requiredItems){ + if(!player.inventory.containsItem(item)){ + hasAll = false + break; + } + } + + if(!hasAll){ + player.dialogueInterpreter.sendDialogue("You don't have the required ingredients to make these.") + return + } + + player.inventory.remove(*crunchy.requiredItems) + player.inventory.remove(Item(HALF_BAKED_CRUNCHY)) + player.inventory.add(Item(crunchy.product)) + player.skills.addExperience(Skills.COOKING,30.0) + player.interfaceManager.close() + } + + override fun open(player: Player?, component: Component?) { + player ?: return + component ?: return + super.open(player, component) + + player.packetDispatch.sendItemOnInterface(TOAD_CRUNCHIES,1,component.id,3) + player.packetDispatch.sendItemOnInterface(SPICE_CRUNCHIES,1,component.id,10) + player.packetDispatch.sendItemOnInterface(WORM_CRUNCHIES,1,component.id,17) + player.packetDispatch.sendItemOnInterface(CHOC_CHIP_CRUNCHIES,1,component.id,26) + } + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(437,this) + return this + } + + internal enum class HalfMadeCrunchy(val product: Int,val reqLevel: Int, val requiredItems: Array){ + CHOCCHIP(9577, 16, arrayOf(Item(Items.CHOCOLATE_BAR_1973,2))), + SPICY(9579, 12, arrayOf(Item(Items.EQUA_LEAVES_2128,2))), + TOAD(9581, 10, arrayOf(Item(Items.TOADS_LEGS_2152,2))), + WORM(9583, 14, arrayOf(Item(Items.EQUA_LEAVES_2128),Item(Items.KING_WORM_2162,2))) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandler.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandler.kt new file mode 100644 index 000000000..373a592b2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyPrepareHandler.kt @@ -0,0 +1,29 @@ +package core.game.content.activity.gnomecooking.crunchies + +import core.cache.def.impl.ItemDefinition +import core.game.component.Component +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +private const val HALF_BAKED_CRUNCHY = 2201 +private const val CRUNCHY_INTERFACE = 437 + +/** + * Opens the gnome crunchy interface + */ +@Initializable +class GnomeCrunchyPrepareHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(HALF_BAKED_CRUNCHY).handlers["option:prepare"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + player.interfaceManager.open(Component(CRUNCHY_INTERFACE)) + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFiller.kt b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFiller.kt new file mode 100644 index 000000000..1f0a71440 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecooking/crunchies/GnomeCrunchyTrayFiller.kt @@ -0,0 +1,32 @@ +package core.game.content.activity.gnomecooking.crunchies + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin + +private const val GIANNE_DOUGH = 2171 +private const val CRUNCHY_TRAY = 2165 +private const val RAW_CRUNCHIES = 2202 + + +/** + * Handles adding GIANNE_DOUGH to CRUNCHY_TRAY to produce RAW_CRUNCHIES + * @author Ceikry + */ +@Initializable +class GnomeCrunchyTrayFiller : UseWithHandler(GIANNE_DOUGH) { + override fun newInstance(arg: Any?): Plugin { + addHandler(CRUNCHY_TRAY, ITEM_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + event.player.inventory.remove(event.used.asItem()) + event.player.inventory.remove(event.usedWith.asItem()) + event.player.inventory.add(Item(RAW_CRUNCHIES)) + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecopter/GCInformationSign.java b/Server/src/main/java/Server/core/game/content/activity/gnomecopter/GCInformationSign.java new file mode 100644 index 000000000..728ed6a2e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecopter/GCInformationSign.java @@ -0,0 +1,50 @@ +package core.game.content.activity.gnomecopter; + +import core.game.component.Component; +import core.game.node.entity.player.Player; + +/** + * The information signs for the Gnomecopter tours. + * @author Emperor + */ +public enum GCInformationSign { + + /** + * The gnomecopters entrance sign. + */ + ENTRANCE("~ Gnomecopter Tours ~", "Welcome to Gnomecopter", "Tours: the unique flying", "experience!", "", "If you're a new flier, talk to", "Hieronymous and prepare to be", "amazed by this triumph of", "gnomic engineering.", "", "", "Warning: all riders must be at", "least 2ft, 6ins tall."); + + /** + * The button text. + */ + private final String button; + + /** + * The info. + */ + private final String[] info; + + /** + * Constructs a new {@code GCInformationSign} {@code Object}. + * @param button The button text. + * @param info The information. + */ + private GCInformationSign(String button, String... info) { + this.button = button; + this.info = info; + } + + /** + * Reads the information sign. + * @param player The player. + */ + public void read(Player player) { + player.getInterfaceManager().openSingleTab(new Component(723)); + player.getPacketDispatch().sendString(button, 723, 9); + String information = info[0]; + for (int i = 1; i < info.length; i++) { + information += "
" + info[i]; + } + player.getPacketDispatch().sendString(information, 723, 10); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gnomecopter/GnomeCopterActivity.java b/Server/src/main/java/Server/core/game/content/activity/gnomecopter/GnomeCopterActivity.java new file mode 100644 index 000000000..7c01126d5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gnomecopter/GnomeCopterActivity.java @@ -0,0 +1,205 @@ +package core.game.content.activity.gnomecopter; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.content.activity.ActivityPlugin; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles the gnome copter activity. + * @author Emperor + */ +@Initializable +public final class GnomeCopterActivity extends ActivityPlugin { + + /** + * The gnome copter item. + */ + private static final Item COPTER_ITEM = new Item(12842); + + /** + * The landing pads currently in use. + */ + private final boolean[] usedLandingPads = new boolean[4]; + + /** + * Constructs a new {@code GnomeCopterActivity} {@code Object}. + */ + public GnomeCopterActivity() { + super("Gnome copters", false, false, true); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return this; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GameObject) { + GameObject object = (GameObject) target; + if (object.getId() == 30032) { + flyGnomeCopter((Player) e, object); + return true; + } + if (object.getId() == 30036) { + GCInformationSign.ENTRANCE.read((Player) e); + return true; + } + } else if (target instanceof Item && e.getAttribute("gc:flying", false)) { + ((Player) e).getPacketDispatch().sendMessage("You can't do this right now."); + return true; + } + return false; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (logout && e.getAttribute("gc:flying", false)) { + e.setLocation(getSpawnLocation()); + ((Player) e).getEquipment().remove(COPTER_ITEM); + } + return super.leave(e, logout); + } + + /** + * Starts flying the gnome copter. + * @param player The player. + * @param object The object. + */ + private void flyGnomeCopter(final Player player, final GameObject object) { + if (!player.getLocation().equals(object.getLocation().transform(0, 1, 0))) { + return; + } + if (object.getCharge() == 88) { + player.getPacketDispatch().sendMessage("Someone else is already using this gnomecopter."); + return; + } + if (player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null) { + player.getPacketDispatch().sendMessage("You can't wear a hat on a Gnomecopter."); + return; + } + if (player.getEquipment().get(EquipmentContainer.SLOT_CAPE) != null) { + player.getPacketDispatch().sendMessage("You can't wear a cape on a Gnomecopter."); + return; + } + if (player.getEquipment().get(3) != null || player.getEquipment().get(5) != null) { + player.getPacketDispatch().sendMessage("You need to have your hands free to use this."); + return; + } + player.setAttribute("gc:flying", true); + player.lock(); + player.faceLocation(player.getLocation().transform(0, 3, 0)); + object.setCharge(88); + GameWorld.getPulser().submit(new Pulse(1, player) { + int stage = 0; + + @Override + public boolean pulse() { + if (++stage == 1) { + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 11); + ForceMovement.run(player, player.getLocation(), object.getLocation(), ForceMovement.WALK_ANIMATION, new Animation(8955), Direction.NORTH, 8); + player.lock(); + } else if (stage == 3) { + player.getEquipment().replace(COPTER_ITEM, 3); + player.visualize(Animation.create(8956), Graphics.create(1578)); + player.getAppearance().setStandAnimation(8964); + player.getAppearance().setWalkAnimation(8961); + player.getAppearance().setRunAnimation(8963); + player.getAppearance().setTurn180(8963); + player.getAppearance().setTurn90ccw(8963); + player.getAppearance().setTurn90cw(8963); + player.getAppearance().setStandTurnAnimation(8963); + } else if (stage == 4) { + object.setCharge(88); + player.getPacketDispatch().sendObjectAnimation(object, new Animation(5)); + } else if (stage == 16) { + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(object.getLocation().getX(), object.getLocation().getY() + 16, true); + Graphics.send(Graphics.create(1579), object.getLocation()); + } else if (stage == 20) { + object.setCharge(1000); + player.getPacketDispatch().sendObjectAnimation(object, new Animation(8941)); + } else if (stage == 33) { + player.unlock(); + landGnomeCopter(player); + return true; + } + return false; + } + }); + } + + /** + * Lands the gnomecopter. + * @param player The player. + */ + private void landGnomeCopter(final Player player) { + int index = 0; + for (index = 0; index < usedLandingPads.length; index++) { + if (!usedLandingPads[index]) { + break; + } + } + usedLandingPads[index] = true; + player.lock(); + final int pad = index; + player.setDirection(Direction.SOUTH); + player.getProperties().setTeleportLocation(Location.create(3162, 3352, 0)); + GameWorld.getPulser().submit(new Pulse(1, player) { + int stage = 0; + int tick = 0; + + @Override + public boolean pulse() { + if (++stage == 1) { + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(3162, 3348, true); + player.getWalkingQueue().addPath(3161 - (pad << 1), 3336, true); + tick = stage + player.getWalkingQueue().getQueue().size(); + } else if (stage == tick) { + player.animate(Animation.create(8957)); + } else if (stage == tick + 14) { + ObjectBuilder.add(new GameObject(30034, player.getLocation()), 6); + player.getEquipment().replace(null, 3); + ForceMovement.run(player, player.getLocation(), player.getLocation().transform(0, -1, 0), new Animation(8959), 8); + player.lock(2); + } else if (stage == tick + 15) { + player.unlock(); + player.getInterfaceManager().restoreTabs(); + usedLandingPads[pad] = false; + player.removeAttribute("gc:flying"); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 1); + return true; + } + return false; + } + }); + } + + @Override + public Location getSpawnLocation() { + return Location.create(3161, 3337, 0); + } + + @Override + public void configure() { + register(new ZoneBorders(3154, 3330, 3171, 3353)); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/guild/CraftingGuildPlugin.java b/Server/src/main/java/Server/core/game/content/activity/guild/CraftingGuildPlugin.java new file mode 100644 index 000000000..e5f17c738 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/guild/CraftingGuildPlugin.java @@ -0,0 +1,293 @@ +package core.game.content.activity.guild; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.Skillcape; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.TanningProduct; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the crafting guild. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CraftingGuildPlugin extends OptionHandler { + + /** + * Represents the brown apron item. + */ + private static final Item BROWN_APRON = new Item(1757); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2647).getHandlers().put("option:open", this); + NPCDefinition.forId(804).getHandlers().put("option:trade", this); + new MasterCrafterDialogue().init(); + new TannerDialogue().init(); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node instanceof GameObject ? ((GameObject) node).getId() : ((NPC) node).getId(); + switch (option) { + case "open": + switch (id) { + case 2647: + if (player.getLocation().getY() >= 3289) { + if (player.getSkills().getStaticLevel(Skills.CRAFTING) < 40) { + player.getDialogueInterpreter().sendDialogues(805, null, "Sorry, only experienced crafters are allowed in here.", "You must be level 40 or above to enter."); + return true; + } + if (!player.getEquipment().containsItem(BROWN_APRON)) { + player.getDialogueInterpreter().open(805, true, true); + return true; + } + player.getDialogueInterpreter().sendDialogues(805, null, "Welcome to the Guild of Master Craftsmen."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } else { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + break; + } + return true; + case "trade": + switch (id) { + case 804: + TanningProduct.open(player, 804); + break; + } + return true; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + return DoorActionHandler.getDestination((Player) node, (GameObject) n); + } + return null; + } + + /** + * Represents the dialogue plugin used for the crafting master. + * @author 'Vexia + * @version 1.0 + */ + public final class MasterCrafterDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MasterCrafterDialogue} {@code Object}. + */ + public MasterCrafterDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MasterCrafterDialogue} {@code Object}. + * @param player the player. + */ + public MasterCrafterDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MasterCrafterDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length == 2) { + npc("Where's your brown apron? You can't come in here", "unless you're wearing one."); + stage = 100; + return true; + } + npc = (NPC) args[0]; + npc("Hello, and welcome to the Crafting Guild. Accomplished", "crafters from all over the land come here to use our", "top notch workshops."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (npc.getId() == 805) { + if (Skillcape.isMaster(player, Skills.CRAFTING)) { + player("Hey, could I buy a Skillcape of Crafting?"); + stage = 3; + } else { + player("Hey, what is that cape you're wearing?", "I don't recognise it."); + stage = 1; + } + } else { + end(); + } + break; + case 1: + npc("This? This is a Skillcape of Crafting. It is a symbol of", "my ability and standing here in the Crafting Guild. If", "you should ever achieve level 99 Crafting come and talk", "to me and we'll see if we can sort you out with one."); + stage = 2; + break; + case 2: + end(); + break; + case 3: + npc("Certainly! Right after you pay me 99000 coins."); + stage = 4; + break; + case 4: + options("Okay, here you go.", "No, thanks."); + stage = 5; + break; + case 5: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 6; + break; + case 2: + end(); + break; + } + break; + case 6: + if (Skillcape.purchase(player, Skills.CRAFTING)) { + npc("There you go! Enjoy."); + } + stage = 7; + break; + case 7: + end(); + break; + case 100: + npc("Where's your borwn apron? You can't come in here", "unless you're wearing one."); + stage = 101; + break; + case 101: + player("Err... I haven't got one."); + stage = 102; + break; + case 102: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 805, 2732, 2733 }; + } + + } + + /** + * Represents the dialogue used for the tanner npc. + * @author 'Vexia + * @version 1.0 + */ + public final class TannerDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code TannerDialogue} {@code Object}. + */ + public TannerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TannerDialogue} {@code Object}. + * @param player the player. + */ + public TannerDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TannerDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc("Greetings friend. I am a manufacturer of leather."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Can I buy some leather then?", "Leather is rather weak stuff."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Can I buy some leather then?"); + stage = 10; + break; + case 2: + player("Leather is rather weak stuff."); + stage = 20; + break; + } + break; + case 10: + npc("Certainly!"); + stage = 11; + break; + case 11: + end(); + TanningProduct.open(player, 804); + break; + case 20: + npc("Normal leather may be quite weak, but it's very cheap -", "I make it from cowhides for only 1 gp per hide - and", "it's so easy to craft that anyone can work with it."); + stage = 21; + break; + case 21: + npc("Alternatively you could try hard leather. It's not so", "easy to craft, but I only charge 3gp per cowhide to", "prepare it, and it makes much studier armour."); + stage = 22; + break; + case 22: + npc("I can also tan snake hides and dragonhides, suitable for", "crafting into the highest quality armour for rangers."); + stage = 23; + break; + case 23: + player("Thanks, I'll bear it in mind."); + stage = 24; + break; + case 24: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 804 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/guild/FishingGuild.java b/Server/src/main/java/Server/core/game/content/activity/guild/FishingGuild.java new file mode 100644 index 000000000..5e43aa94a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/guild/FishingGuild.java @@ -0,0 +1,152 @@ +package core.game.content.activity.guild; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.Skillcape; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the fishing guild. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FishingGuild extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2025).getHandlers().put("option:open", this); + new MasterFisherDialogue().init(); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = ((GameObject) node).getId(); + switch (option) { + case "open": + switch (id) { + case 2025: + if (player.getSkills().getStaticLevel(Skills.FISHING) < 68 && player.getLocation().withinDistance(new Location(2611, 3394, 0))) { + player.getDialogueInterpreter().sendDialogues(308, null, "Hello, I'm afraid only the top fishers are allowed to use", "our premier fishing facilities."); + return true; + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + break; + } + break; + } + return true; + } + + /** + * Represents the master fisher dialogue. + * @author 'Vexia + * @version 1.0 + */ + public final class MasterFisherDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MasterFisherDialogue} {@code Object}. + */ + public MasterFisherDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MasterFisherDialogue} {@code Object}. + * @param player the player. + */ + public MasterFisherDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MasterFisherDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (!Skillcape.isMaster(player, Skills.FISHING)) { + npc("Hello, I'm afraid only the top fishers are allowed to use", "our premier fishing facilities."); + } else { + npc("Hello, only the top fishers are allowed to use", "our premier fishing facilities and you seem", "to meet the criteria. Enjoy!"); + } + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (Skillcape.isMaster(player, Skills.FISHING)) { + player("Can I buy a Skillcape of Fishing?"); + stage = 4; + } else { + player("Can you tell me about that skillcape you're wearing?"); + stage = 1; + } + break; + case 1: + npc("I'm happy to, my friend. This beautiful cape was", "presented to me in recognition of my skills and", "experience as a fisherman and I was asked to be the", "head of this guild at the same time. As the best"); + stage = 2; + break; + case 2: + npc("fisherman in the guild it is my duty to control who has", "access to the guild and to say who can buy similar", "skillcapes."); + stage = 3; + break; + case 3: + end(); + break; + case 4: + npc("Certainly! Right when you pay me 99000 coins."); + stage = 5; + break; + case 5: + options("Okay, here you go.", "No, thanks."); + stage = 6; + break; + case 6: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 7; + break; + case 2: + end(); + break; + } + break; + case 7: + if (Skillcape.purchase(player, Skills.FISHING)) { + npc("There you go! Enjoy."); + } + stage = 8; + + break; + case 8: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 308 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/guild/HeroGuildPlugin.java b/Server/src/main/java/Server/core/game/content/activity/guild/HeroGuildPlugin.java new file mode 100644 index 000000000..9bbe44dec --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/guild/HeroGuildPlugin.java @@ -0,0 +1,117 @@ +package core.game.content.activity.guild; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.EnchantedJewellery; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the hero guild. + * @author Vexia + */ +@Initializable +public final class HeroGuildPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2624).getHandlers().put("option:open", this); + ObjectDefinition.forId(2625).getHandlers().put("option:open", this); + PluginManager.definePlugin(new JewelleryRechargePlugin()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = ((GameObject) node).getId(); + switch (option) { + case "open": + switch (id) { + case 2624: + case 2625: + // player.getPacketDispatch().sendMessage("You need to complete the Heroes' Quest."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + break; + } + return true; + } + return true; + } + + /** + * Handles the recharging of dragonstone jewellery. + * @author Vexia + */ + public static final class JewelleryRechargePlugin extends UseWithHandler { + + /** + * The ids of rechargeable items. + */ + private static final int[] IDS = new int[] { 1710, 1708, 1706, 1704, 11107, 11109, 11111, 11113, 11120, 11122, 11124, 11126, 10354, 10356, 10358, 10360, 10362, 14644,14642,14640,14638, 2572 }; + + /** + * Constructs a new {@Code JewelleryRechargePlugin} {@Code + * Object} + */ + public JewelleryRechargePlugin() { + super(IDS); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(36695, OBJECT_TYPE, this); + addHandler(7339, NPC_TYPE, this); + addHandler(7340, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final EnchantedJewellery jewellery = EnchantedJewellery.forItem(event.getUsedItem()); + if (jewellery == null && event.getUsedItem().getId() != 2572) { + return true; + } + boolean fam = event.getUsedWith() instanceof NPC; + if (fam && jewellery != EnchantedJewellery.AMULET_OF_GLORY & jewellery != EnchantedJewellery.AMULET_OF_GLORY_T) { + return false; + } + if (fam) { + Familiar familiar = (Familiar) event.getUsedWith(); + if (!player.getFamiliarManager().isOwner(familiar)) { + return false; + } + familiar.animate(Animation.create(7882)); + } + player.lock(1); + player.animate(Animation.create(832)); + if(event.getUsedItem().getId() == 2572){ + player.getInventory().replace(new Item(14646), event.getUsedItem().getSlot()); + } else { + player.getInventory().replace(new Item(jewellery.getIds()[0]), event.getUsedItem().getSlot()); + } + String name = event.getUsedItem().getName().toLowerCase(); + for (int i = 0; i < 4; i++) { + name = name.replace("(" + (i + 1) + ")", "").trim(); + } + if (!fam) { + player.sendMessage("You dip the " + name + " in the fountain..."); + } else { + player.sendMessage("Your titan recharges the glory."); + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/guild/MiningGuildPlugin.java b/Server/src/main/java/Server/core/game/content/activity/guild/MiningGuildPlugin.java new file mode 100644 index 000000000..5ee7d45b9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/guild/MiningGuildPlugin.java @@ -0,0 +1,64 @@ +package core.game.content.activity.guild; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the mining guild. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MiningGuildPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2113).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(30941).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(2112).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (option.equals("climb-down")) { + if (player.getLocation().withinDistance(Location.create(3019, 3339, 0), 4)) { + if (player.getSkills().getStaticLevel(Skills.MINING) < 60) { + player.getDialogueInterpreter().open(382, NPC.create(382, Location.create(0, 0, 0)), 1); + return true; + } + ClimbActionHandler.climb(player, new Animation(828), Location.create(3021, 9739, 0)); + return true; + } + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + } + if (option.equals("open")) { + if (player.getSkills().getStaticLevel(Skills.MINING) < 60) { + player.getDialogueInterpreter().open(382, NPC.create(382, Location.create(0, 0, 0)), 1); + return true; + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } + if (option.equals("climb-up")) { + if (player.getLocation().withinDistance(new Location(3019, 9739, 0))) { + ClimbActionHandler.climb(player, new Animation(828), new Location(3017, 3339, 0)); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, "climb-up"); + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/guild/RangingGuildPlugin.java b/Server/src/main/java/Server/core/game/content/activity/guild/RangingGuildPlugin.java new file mode 100644 index 000000000..6d04f1aa5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/guild/RangingGuildPlugin.java @@ -0,0 +1,1226 @@ +package core.game.content.activity.guild; + +import java.util.List; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.impl.EquipmentContainer; +import core.plugin.Initializable; +import core.tools.Items; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.PluginManager; +import core.tools.RandomFunction; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.Skillcape; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.TanningProduct; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.equipment.Ammunition; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the ranging guild. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class RangingGuildPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2514).getHandlers().put("option:open", this); + ObjectDefinition.forId(2511).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(2512).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(2513).getHandlers().put("option:fire-at", this); + new RangingGuildDoorman().init(); + new GuardDialogue().init(); + new LeatherWorkerDialogue().init(); + new ArmourSalesman().init(); + new TribalWeaponSalesman().init(); + new BowArrowSalesman().init(); + new WarningInterface().newInstance(arg); + new CompetitionJudge().init(); + PluginManager.definePlugin(new TowerArcher()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node instanceof GameObject ? ((GameObject) node).getId() : 0; + switch (option) { + case "fire-at": + if (player.getArcheryTargets() <= 0) { + player.getDialogueInterpreter().sendDialogues(693, null, "Sorry, you may only use the targets for the", "competition, not for practicing."); + return true; + } + if (!player.getEquipment().containsItem(new Item(882)) + || player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) == null + || (!player.getEquipment().get(EquipmentContainer.SLOT_WEAPON).getDefinition().getName().toLowerCase().contains("shortbow") + && !player.getEquipment().get(EquipmentContainer.SLOT_WEAPON).getDefinition().getName().toLowerCase().contains("longbow"))) { + player.sendMessage("You must have bronze arrows and a bow equipped."); + return true; + } + player.getPulseManager().run(new ArcheryCompetitionPulse(player, (GameObject) node)); + break; + case "open": + switch (id) { + case 2514: + if (player.getLocation().getY() >= 3438) { + if (player.getSkills().getStaticLevel(Skills.RANGE) < 40) { + player.getDialogueInterpreter().sendDialogue("You need a Ranging level of 40 to enter here."); + return true; + } + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node, player.getLocation().getY() >= 3438 ? Location.create(2659, 3437, 0) : Location.create(2657, 3439, 0)); + break; + } + break; + case "climb-up": + switch (id) { + case 2511: + player.setAttribute("ladder", node); + player.getInterfaceManager().open(new Component(564)); + break; + } + break; + case "climb-down": + switch (id) { + case 2512: + ClimbActionHandler.climb(player, null, Location.create(2668, 3427, 0)); + break; + } + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + if (((GameObject) n).getDefinition().hasAction("open")) { + if (((GameObject) n).getId() == 2514) { + if (node.getLocation().getY() >= 3438) { + return Location.create(2657, 3439, 0); + } else { + return Location.create(2659, 3437, 0); + } + } + return DoorActionHandler.getDestination((Player) node, (GameObject) n); + } + if (((GameObject) n).getId() == 2513) + return Location.create(2673, 3420, 0); + } + return null; + } + + /** + * Represents the dialogue used for the ranging guild door man. + * + * @author 'Vexia + * @version 1.0 + */ + public class RangingGuildDoorman extends DialoguePlugin { + + /** + * Constructs a new {@code RangingGuildDoorman} {@code Object}. + */ + public RangingGuildDoorman() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code RangingGuildDoorman} {@code Object}. + * + * @param player the player. + */ + public RangingGuildDoorman(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RangingGuildDoorman(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings. If you are an experienced archer, you may", "want to visit the guild here..."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{679}; + } + } + + /** + * Represents the tribal weapon salseman dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final class TribalWeaponSalesman extends DialoguePlugin { + + /** + * Constructs a new {@code TribalWeaponSalesman} {@code Object}. + */ + public TribalWeaponSalesman() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TribalWeaponSalesman} {@code Object}. + * + * @param player the player. + */ + public TribalWeaponSalesman(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TribalWeaponSalesman(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Greetings, traveller. Are you interested in any throwing", "weapons?"); + stage = 1; + break; + case 1: + options("Yes I am.", "Not really."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Yes I am."); + stage = 10; + break; + case 2: + player("Not really."); + stage = 20; + break; + } + break; + case 10: + npc("That is a good thing."); + stage = 11; + break; + case 11: + end(); + npc.openShop(player); + break; + case 20: + npc("No bother to me."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{692}; + } + + } + + /** + * Represents the guard dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final class GuardDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GuardDialogue} {@code Object}. + */ + public GuardDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GuardDialogue} {@code Object}. + * + * @param player the player. + */ + public GuardDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Greetings, traveller. Enjoy the time at the Ranging", "Guild."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{678}; + } + + } + + /** + * Represents the leather workers dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final class LeatherWorkerDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LeatherWorkerDialogue} {@code Object}. + */ + public LeatherWorkerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LeatherWorkerDialogue} {@code Object}. + * + * @param player the player. + */ + public LeatherWorkerDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LeatherWorkerDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Can I help you?"); + stage = 1; + break; + case 1: + options("What do you do here?", "No thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("What do you do here?"); + stage = 10; + break; + case 2: + player("No thanks."); + stage = 20; + break; + } + break; + case 10: + npc("Well, I can cure plain cowhides into pieces of leather", "ready for crafting."); + stage = 11; + break; + case 11: + npc("I work with ordinary, hard or dragonhide leather and", "also snakeskin."); + stage = 12; + break; + case 12: + end(); + TanningProduct.open(player, 680); + break; + case 20: + npc("Suit yourself."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{680}; + } + + } + + /** + * Represents the armour salesman dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final class ArmourSalesman extends DialoguePlugin { + + /** + * Constructs a new {@code ArmourSalesman} {@code Object}. + */ + public ArmourSalesman() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ArmourSalesman} {@code Object}. + * + * @param player the player. + */ + public ArmourSalesman(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ArmourSalesman(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Good day to you."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("And to you. Can I help you?"); + stage = 1; + break; + case 1: + if (Skillcape.isMaster(player, Skills.RANGE)) { + options("What do you do here?", "I'd like to see what you sell.", "Can I buy a Skillcape of Range?", "I've seen enough, thanks."); + stage = 100; + } else { + options("What do you do here?", "I'd like to see what you sell.", "I've seen enough, thanks."); + stage = 2; + } + break; + case 2: + switch (buttonId) { + case 1: + player("What do you do here?"); + stage = 10; + break; + case 2: + player("I'd like to see what you sell."); + stage = 20; + break; + case 3: + player("I've seen enough, thanks."); + stage = 30; + break; + } + break; + case 10: + npc("I am a supplier of leather armours and accessories. Ask", "and I will tell you what I know."); + stage = 11; + break; + case 11: + options("Tell me about your armours.", "Tell me about your accessories.", "I've seen enough, thanks."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("Tell me about your armours."); + stage = 13; + break; + case 2: + player("Tell me about your accessories."); + stage = 15; + break; + case 3: + player("I've seen enough, thanks."); + stage = 30; + break; + } + break; + case 13: + npc("I have normal, studded and hard types."); + stage = 14; + break; + case 14: + case 31: + case 105: + end(); + break; + case 15: + npc("Ah yes we have a new range of accessories in stock.", "Essential items for an archer like you."); + stage = 14; + break; + case 20: + npc("Indeed, cast your eyes on my wares, adventurer."); + stage = 21; + break; + case 21: + end(); + npc.openShop(player); + break; + case 30: + npc("Very good, adventurer."); + stage = 31; + break; + case 100: + switch (buttonId) { + case 1: + player("What do you do here?"); + stage = 10; + break; + case 2: + player("I'd like to see what you sell."); + stage = 20; + break; + case 3: + player("Can I buy a Skillcape of Range?"); + stage = 101; + break; + case 4: + player("I've seen enough, thanks."); + stage = 30; + break; + } + break; + case 101: + npc("Certainly! Right when you give me 99000 coins."); + stage = 102; + break; + case 102: + options("Okay, here you go.", "No, thanks."); + stage = 103; + break; + case 103: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 104; + break; + case 2: + end(); + break; + } + break; + case 104: + if (Skillcape.purchase(player, Skills.RANGE)) { + npc("There you go! Enjoy."); + } + stage = 105; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{682}; + } + + } + + /** + * Represents the dialogue plugin used for the bow and arrow salesman. + * + * @author 'Vexia + * @version 1.0 + */ + public final class BowArrowSalesman extends DialoguePlugin { + + /** + * Constructs a new {@code BowArrowSalesman} {@code Object}. + */ + public BowArrowSalesman() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BowArrowSalesman} {@code Object}. + * + * @param player the player. + */ + public BowArrowSalesman(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BowArrowSalesman(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("A fair day, traveller. Would you like to see my wares?"); + stage = 1; + break; + case 1: + options("Yes please.", "No thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{683}; + } + + } + + /** + * Represents the waring interface used in the guild. + * + * @author 'Vexia + * @version 1.0 + */ + public final class WarningInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(564).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 17: + ClimbActionHandler.climb(player, null, Location.create(2668, 3427, 2)); + player.getInterfaceManager().close(); + List npcs = RegionManager.getLocalNpcs(Location.create(2668, 3427, 2)); + String dir = ""; + for (NPC n : npcs) { + if (n.getId() >= 684 && n.getId() <= 687) { + switch (n.getId()) { + case 684: + dir = "north"; + break; + case 685: + dir = "east"; + break; + case 686: + dir = "south"; + break; + case 687: + dir = "west"; + break; + } + n.sendChat("The " + dir + " tower is occupied, get them!"); + } + } + break; + case 18: + player.getInterfaceManager().close(); + break; + } + return true; + } + + } + + /** + * Represents the competition judge. + * + * @author afaroutdude + */ + public final class CompetitionJudge extends DialoguePlugin { + + /** + * Constructs a new {@code CompetitionJudge} {@code Object}. + * + * @param player the player. + */ + public CompetitionJudge(final Player player) { + super(player); + } + + /** + * Constructs a new {@code CompetitionJudge} {@code Object}. + */ + public CompetitionJudge() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CompetitionJudge(player); + } + + @Override + public boolean open(Object... args) { + if (player.getInventory().getAmount(1464) >= 1000 + && !player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 1, 7)) { + npc("Wow! I see that you've got yourself a whole load of ", "archery tickets. Well done!"); + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 7); + stage = -1; + } else if (player.getArcheryTargets() > 0) { + npc("Hello again, do you need reminding of the rules?"); + stage = 20; + } else if (player.getArcheryTotal() == 0) { + npc("Hello there, would you like to take part in the", + "archery competition? It only costs 200 coins to", + "enter."); + stage = 0; + } else { + int reward = player.getArcheryTotal() / 10; + npc("Well done. Your score is: " + player.getArcheryTotal() + ".", + "For that score you will receive " + reward + " Archery tickets."); + player.setArcheryTargets(-1); + player.setArcheryTotal(0); + if (!player.getInventory().add(new Item(1464, reward))) { + player.getBank().add(new Item(1464, reward)); + player.sendMessage("Your reward was sent to your bank."); + } + stage = 999; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + break; + case -1: + if (player.getArcheryTargets() > 0) { + npc("Hello again, do you need reminding of the rules?"); + stage = 20; + } else if (player.getArcheryTotal() == 0) { + npc("Hello there, would you like to take part in the", + "archery competition? It only costs 200 coins to", + "enter."); + stage = 0; + } else { + int reward = player.getArcheryTotal() / 10; + npc("Well done. Your score is: " + player.getArcheryTotal() + ".", + "For that score you will receive " + reward + " Archery tickets."); + if (!player.getInventory().add(new Item(1464, reward))) { + player.getBank().add(new Item(1464, reward)); + player.sendMessage("Your reward was sent to your bank."); + } + stage = 999; + } + break; + case 0: + options("Sure, I'll give it a go.", "What are the rules?", "No thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Sure, I'll give it a go."); + stage = 2; + break; + case 2: + player("What are the rules?"); + stage = 5; + break; + case 3: + player("No thanks."); + stage = 999; + break; + } + break; + case 2: + npc("Great! That will be 200 coins then please."); + stage++; + break; + case 3: + if (player.getInventory().getAmount(995) < 200) { + player("Oops, I don't have enough coins on me..."); + stage++; + } else { + end(); + player.getPacketDispatch().sendMessage("You pay the judge and he gives you 10 bronze arrows."); + player.getInventory().remove(new Item(995, 200)); + player.getInventory().add(new Item(882, 10)); + player.setArcheryTargets(10); + player.setArcheryTotal(0); + } + break; + case 4: + npc("Never mind, come back when you've got enough."); + stage = 999; + break; + case 5: + case 22: + npc("The rules are very simple:"); + stage++; + break; + case 6: + case 23: + npc("You're given 10 shots at the targets, for each hit", "you will receive points. At the end you'll be", "rewarded 1 ticket for every 10 points."); + stage++; + break; + case 7: + npc("The tickets can be exchanged for goods from our stores.", "Do you want to give it a go? Only 200 coins."); + stage++; + break; + case 8: + options("Sure, I'll give it a go.", "No thanks."); + stage++; + break; + case 9: + switch (buttonId) { + case 1: + player("Sure, I'll give it a go."); + stage = 2; + break; + case 3: + player("No thanks."); + stage = 999; + break; + } + break; + case 20: + int arrows = player.getInventory().getAmount(Items.BRONZE_ARROW_882) + + player.getEquipment().getAmount(Items.BRONZE_ARROW_882); + if (arrows < 1) { + player("Well, I actually don't have any more arrows. Could I", "get some more?"); + stage = 25; + } else { + options("Yes please.", "No thanks, I've got it.", "How am I doing so far?"); + stage++; + } + break; + case 21: + switch (buttonId) { + case 1: + player("Yes please."); + stage++; + break; + case 2: + player("No thanks, I've got it."); + stage = 30; + break; + case 3: + player("How am I doing so far?"); + stage = 40; + break; + } + break; + case 24: + npc("The tickets can be exchanged for goods from our stores.", "Good Luck!"); + stage = 999; + break; + case 25: + npc("Ok, but it'll cost you 100 coins."); + stage++; + break; + case 26: + options("Sure, I'll take some.", "No thanks."); + stage++; + break; + case 27: + switch (buttonId) { + case 1: + player("Sure, I'll take some."); + stage++; + break; + case 2: + player("No thanks."); + stage = 999; + break; + } + break; + case 28: + if (player.getInventory().getAmount(995) < 100) { + player("Oops, I don't have enough coins on me..."); + stage++; + } else { + end(); + player.getPacketDispatch().sendMessage("You pay the judge and he gives you 10 bronze arrows."); + player.getInventory().remove(new Item(995, 100)); + player.getInventory().add(new Item(882, 10)); + } + break; + case 30: + npc("Glad to hear it, good luck!"); + stage = 999; + break; + case 40: + String msg; + if (player.getArcheryTotal() <= 0) { + msg = "You haven't started yet."; + } else if (player.getArcheryTotal() <= 80) { + msg = "Not bad, keep going."; + } else { + msg = "You're pretty good, keep it up."; + } + npc("So far your score is: " + player.getArcheryTotal(), msg); + stage = 999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{693}; + } + + } + + /** + * Represents the tower advisors. + * + * @author afaroutdude + */ + public final class TowerAdvisor extends DialoguePlugin { + + /** + * Constructs a new {@code TowerAdvisor} {@code Object}. + * + * @param player the player. + */ + public TowerAdvisor(final Player player) { + super(player); + } + + /** + * Constructs a new {@code TowerAdvisor} {@code Object}. + */ + public TowerAdvisor() { + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TowerAdvisor(player); + } + + @Override + public boolean open(Object... args) { + player("Hello there, what do you do here?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + case 0: + npc("Hi. We are in charge of this practice area."); + stage++; + break; + case 1: + player("This is a practice area?"); + break; + case 2: + npc("Surrounding us are four towers. Each tower contains", + "trained archers of a different level. You'll notice", + "it's quite a distance, so you'll need a longbow."); + stage++; + break; + case 3: + int rangeLevel = player.getSkills().getLevel(Skills.RANGE); + if (rangeLevel < 50) { // north + npc("As you're not very skilled, I advise you to practice", + "on the north tower. That'll provide the best", + "challenge for you."); + } else if (rangeLevel < 60) { // east + npc("You appear to be somewhat skilled with a bow, so I", + "advise you to practice on the south tower. That'll", + "provide the best challenge for you."); + } else if (rangeLevel < 70) { // south + npc("You appear to be fairly skilled with a bow, so I", + "advise you to practice on the south tower. That'll", + "provide the best challenge for you."); + } else { // west + npc("Looks like you're very skilled, so I advise you to", + "practice on the west tower. That'll provide the best", + "challenge for you."); + } + stage = 999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{684, 685, 686, 687}; + } + + } + + + /** + * Represents all the tower archers + * + * @author afaroutdude + */ + public final class TowerArcher extends AbstractNPC { + + public TowerArcher() { + super(-1, null); + } + public TowerArcher(int id, Location location) { + super(id, location); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + Player player = (Player) killer; + if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 1, 6)) { + player.setAttribute("/save:diary:seers:tower-archers", + player.getAttribute("diary:seers:tower-archers", 0) + | 1 << getId() - 688); + if (player.getAttribute("diary:seers:tower-archers", 0) == 15) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 6); + } + } + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TowerArcher(id, location); + } + + @Override + public int[] getIds() { + return new int[]{688, 689, 690, 691}; + } + } + + /** + * Represents the archery target pulse. + * + * @author Jamix77 + */ + public static final class ArcheryCompetitionPulse extends Pulse { + + /** + * Represents the player instance. + */ + private final Player player; + + /** + * Represents the game object. + */ + private final GameObject object; + + /** + * Constructs a new {@code ArcheryCompetitionPulse} {@code Object}. + * + * @param player the player. + * @param object the object. + */ + public ArcheryCompetitionPulse(final Player player, final GameObject object) { + super(1, player, object); + this.player = player; + this.object = object; + } + + private void showInterface(int points, int arrowsLeft, int target, String msg) { + player.getInterfaceManager().openComponent(325); + player.getConfigManager().set(156, 11 - arrowsLeft); + player.getConfigManager().set(157, points); + player.getConfigManager().set(158, target); + player.getPacketDispatch().sendString(msg, 325, 32); + } + + @Override + public boolean pulse() { + if (player.getArcheryTargets() <= 0) { + return true; + } + if (getDelay() == 1) { + setDelay(player.getProperties().getAttackSpeed()); + } + if (player.getEquipment().remove(new Item(Items.BRONZE_ARROW_882, 1))) { + Projectile p = Ammunition.get(Items.BRONZE_ARROW_882).getProjectile().transform(player, object.getLocation()); + p.setEndLocation(object.getLocation()); + p.setEndHeight(25); + p.send(); + player.animate(new Animation(426)); + player.lock(getDelay()); + + int level = player.getSkills().getLevel(Skills.RANGE); + int bonus = player.getProperties().getBonuses()[14]; + double prayer = 1.0; + prayer += player.getPrayer().getSkillBonus(Skills.RANGE); + double cumulativeStr = Math.floor(level * prayer); + /*if (player.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_RANGE_ACCURATE) { + cumulativeStr += 3; + } else if (player.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_LONG_RANGE) { + cumulativeStr += 1; + }*/ + cumulativeStr *= 1.0; + int hit = (int) ((14 + cumulativeStr + (bonus / 8) + ((cumulativeStr * bonus) * 0.016865)) * 1.0) / 10 + 1; + hit = hit + RandomFunction.randomSign(RandomFunction.random(3)); + + int target = Math.max(0, 13 - hit); + int points = 0; + String msg = ""; + switch (target) { + case 0: + points = 100; + msg = "Bulls-Eye!"; + break; + case 1: + points = 50; + msg = "Hit Yellow!"; + break; + case 2: + case 3: + case 4: + points = 30; + msg = "Hit Red!"; + break; + case 5: + case 6: + case 7: + case 8: + points = 20; + msg = "Hit Blue!"; + break; + case 9: + case 10: + points = 10; + msg = "Hit Black!"; + break; + case 11: + case 12: + case 13: + points = 0; + msg = "Missed!"; + break; + } + int xp = points / 2; + + player.getSkills().addExperience(Skills.RANGE, xp, true); + player.setArcheryTotal(player.getArcheryTotal() + points); + player.setArcheryTargets(player.getArcheryTargets() - 1); + player.debug("Hit: " + hit); + player.debug("You have " + player.getArcheryTargets() + " targets left."); + player.debug("You have " + player.getArcheryTotal() + " score."); + + showInterface(player.getArcheryTotal(), player.getArcheryTargets(), target, msg); + + return true; //player.getArcheryTargets() <= 0; + } else { + return true; + } + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/guild/WizardGuildPlugin.java b/Server/src/main/java/Server/core/game/content/activity/guild/WizardGuildPlugin.java new file mode 100644 index 000000000..a0bbc92ca --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/guild/WizardGuildPlugin.java @@ -0,0 +1,468 @@ +package core.game.content.activity.guild; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.Skillcape; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.content.global.travel.EssenceTeleport; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Represents the wizard guild plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WizardGuildPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(1600).getHandlers().put("option:open", this); + ObjectDefinition.forId(1601).getHandlers().put("option:open", this); + NPCDefinition.forId(462).getHandlers().put("option:teleport", this); + ObjectDefinition.forId(2154).getHandlers().put("option:open", this); + ObjectDefinition.forId(2155).getHandlers().put("option:open", this); + ObjectDefinition.forId(1722).getHandlers().put("option:climb-up", this); + new WizardDistentorDialogue().init(); + new ZavisticRarveDialogue().init(); + new ProfessorImblewynDialogue().init(); + new WizardFrumsconeDialogue().init(); + new RobeStoreDialogue().init(); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node instanceof GameObject ? ((GameObject) node).getId() : ((NPC) node).getId(); + switch (option) { + case "climb-up": + switch (id) { + case 1722: + if (node.getLocation().equals(new Location(2590, 3089, 0))) { + ClimbActionHandler.climb(player, null, Location.create(2591, 3092, 1)); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + } + break; + } + break; + case "open": + switch (id) { + case 1600: + case 1601: + if (player.getSkills().getStaticLevel(Skills.MAGIC) < 66) { + player.getDialogueInterpreter().sendDialogue("You need a Magic level of at least 66 to enter."); + return true; + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + break; + case 2155: + case 2154: + player.getDialogueInterpreter().sendDialogues(460, null, "You can't attack the Zombies in the room, my Zombies", "are for magic target practice only and should be", "attacked from the other side of the fence."); + break; + } + break; + case "teleport": + if (!player.getQuestRepository().isComplete("Rune Mysteries")) { + player.getPacketDispatch().sendMessage("You need to have completed the Rune Mysteries Quest to use this feature."); + return true; + } + EssenceTeleport.teleport(((NPC) node), player); + return true; + } + return true; + } + + /** + * Represents the wizard distentor dialogue. + * @author 'Vexia + * @version 1.0 + */ + public final class WizardDistentorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code WizardDistentorDialogue} {@code Object}. + */ + public WizardDistentorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WizardDistentorDialogue} {@code Object}. + * @param player the player. + */ + public WizardDistentorDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WizardDistentorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Welcome to the Magicians' Guild!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Hello there."); + stage = 1; + break; + case 1: + npc("What can I do for you?"); + stage = 2; + break; + case 2: + if (!player.getQuestRepository().isComplete("Rune Mysteries")) { + player("Nothing thanks, I'm just looking around."); + stage = 4; + return true; + } + options("Nothing thanks, I'm just looking around.", "Can you teleport me to Rune Essence?"); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("Nothing thanks, I'm just looking around."); + stage = 4; + break; + case 2: + player("Can you teleport me to the Rune Essence?"); + stage = 6; + break; + } + break; + case 4: + npc("That's fine with me."); + stage = 5; + break; + case 5: + end(); + break; + case 6: + end(); + EssenceTeleport.teleport(npc, player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 462 }; + } + + } + + /** + * Represents the dialogue used for zavistic rarve. + * @author 'Vexia + * @version 1.0 + */ + public final class ZavisticRarveDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ZavisticRarveDialogue} {@code Object}. + */ + public ZavisticRarveDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ZavisticRarveDialogue} {@code Object}. + * @param player the player. + */ + public ZavisticRarveDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ZavisticRarveDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("What are you doing...Oh, it's you...sorry...didn't", "realise... what can I do for you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Thanks for your help with all of this."); + stage = 1; + break; + case 1: + npc("Ooohh, no thanks required. It's I who should be", "thanking you my friend...your investigative mind has", "shown how vigilant we really should be for this type of", "evil use of the magical arts."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2059 }; + } + + } + + /** + * Represents the wizard distentor dialogue. + * @author 'Vexia + * @version 1.0 + */ + public final class ProfessorImblewynDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ProfessorImblewynDialogue} {@code Object}. + */ + public ProfessorImblewynDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ProfessorImblewynDialogue} {@code Object}. + * @param player the player. + */ + public ProfessorImblewynDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ProfessorImblewynDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("I didn't realise gnomes were interested in magic."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Gnomes are interested in everything, lad."); + stage = 1; + break; + case 1: + player("Of course."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4586 }; + } + + } + + /** + * Represents the dialogue plugin used for the wizard frumscone. + * @author 'Vexia + * @version 1.0 + */ + public final class WizardFrumsconeDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code WizardFrumsconeDialogue} {@code Object}. + * @param player the player. + */ + public WizardFrumsconeDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code WizardFrumsconeDialogue} {@code Object}. + */ + public WizardFrumsconeDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WizardFrumsconeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc("Do you like my magic Zombies? Feel free to kill them,", "there's plenty more where these came from!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 460 }; + } + + } + + /** + * Represents the dialogue plugin used for the robe storew owner. + * @author 'Vexia + * @version 1.0 + */ + public final class RobeStoreDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code RobeStoreDialogue} {@code Object}. + * @param player the player. + */ + public RobeStoreDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code RobeStoreDialogue} {@code Object}. + */ + public RobeStoreDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RobeStoreDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (Skillcape.isMaster(player, Skills.MAGIC)) { + options("Ask about Skillcape.", "Something else"); + stage = 6; + } else { + npc("Welcome to the Magic Guild Store. Would you like to", "buy some magic supplies?"); + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes please.", "No thank you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Yes please."); + stage = 4; + break; + case 2: + player("No thank you."); + stage = 3; + break; + } + break; + case 3: + end(); + break; + case 4: + end(); + npc.openShop(player); + break; + case 6: + switch (buttonId) { + case 1: + player("Can I buy a Skillcape of Magic?"); + stage = 7; + break; + case 2: + npc("Welcome to the Magic Guild Store. Would you like to", "buy some magic supplies?"); + stage = 0; + break; + } + break; + case 7: + npc("Certinaly! Right when you give me 99000 coins."); + stage = 8; + break; + case 8: + options("Okay, here you go.", "No, thanks."); + stage = 9; + break; + case 9: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 10; + break; + case 2: + end(); + break; + } + break; + case 10: + if (Skillcape.purchase(player, Skills.MAGIC)) { + npc("There you go! Enjoy."); + } + stage = 11; + break; + case 11: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1658 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/EcumenicalKeyHandler.java b/Server/src/main/java/Server/core/game/content/activity/gwd/EcumenicalKeyHandler.java new file mode 100644 index 000000000..0bf3e2cf9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/EcumenicalKeyHandler.java @@ -0,0 +1,70 @@ +/** + * https://oldschool.2009scape.wiki/w/Ecumenical_key + */ +//package core.game.content.activity.gwd; +// +//import core.game.content.global.action.DoorActionHandler; +//import core.game.interaction.NodeUsageEvent; +//import core.game.interaction.UseWithHandler; +//import core.game.node.entity.player.Player; +//import core.game.node.object.GameObject; +//import core.game.world.map.Direction; +//import core.plugin.InitializablePlugin; +//import core.plugin.Plugin; +// +///** +// * Handles the boss room instant-access key. +// * @author Splinter +// */ +//@InitializablePlugin +//public class EcumenicalKeyHandler extends UseWithHandler { +// +// /** +// * Constructs a new {@code EcumenicalKeyHandler} {@code Object} +// */ +// public EcumenicalKeyHandler() { +// super(14674); +// } +// +// @Override +// public Plugin newInstance(Object arg) throws Throwable { +// addHandler(26425, OBJECT_TYPE, this); +// addHandler(26426, OBJECT_TYPE, this); +// addHandler(26427, OBJECT_TYPE, this); +// addHandler(26428, OBJECT_TYPE, this); +// return this; +// } +// +// @Override +// public boolean handle(NodeUsageEvent event) { +// final Player player = event.getPlayer(); +// final GameObject object = event.getUsedWith().asObject(); +// Direction dir = Direction.get((object.getRotation() + 3) % 4); +// if (dir.getStepX() != 0) { +// if (player.getLocation().getX() == object.getLocation().transform(dir.getStepX(), 0, 0).getX()) { +// player.sendMessage("It would be unwise to use the key on this side of the door!"); +// return true; +// } +// } else if (player.getLocation().getY() == object.getLocation().transform(0, dir.getStepY(), 0).getY()) { +// player.sendMessage("It would be unwise to use the key on this side of the door!"); +// return true; +// } +// player.lock(2); +// player.getInventory().remove(event.getUsedItem()); +// player.sendMessage("The key shatters as you insert it into the lock."); +// DoorActionHandler.handleAutowalkDoor(player, event.getUsedWith().asObject()); +// return true; +// } +// +//} +/** + * Function to add key into player inventory + * Goes in GodwarsMapZone.java 'death' method + */ +// int count = killer.asPlayer().getBank().getAmount(14674) + killer.asPlayer().getInventory().getAmount(14674); +// int rand = RandomFunction.random(1, 60 + (count * 10)); +// if(rand == 15 && count < 3){ +// Item item = new Item(14674); +// GroundItemManager.create(item, e.getLocation(), ((Player) killer)); +// killer.asPlayer().sendMessage("A crystalline key falls to the ground as you slay your opponent."); +// } \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GWDGraardorSwingHandler.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GWDGraardorSwingHandler.java new file mode 100644 index 000000000..90523ded9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GWDGraardorSwingHandler.java @@ -0,0 +1,171 @@ +package core.game.content.activity.gwd; + +import java.util.ArrayList; +import java.util.List; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +/** + * Handles General Graardor's combat. + * @author Emperor + */ +public final class GWDGraardorSwingHandler extends CombatSwingHandler { + + /** + * The boss chamber. + */ + private static final ZoneBorders CHAMBER = new ZoneBorders(2864, 5351, 2876, 5369); + + /** + * The melee attack animation. + */ + private static final Animation MELEE_ATTACK = new Animation(7060, Priority.HIGH); + + /** + * The range attack animation. + */ + private static final Animation RANGE_ATTACK = new Animation(7063, Priority.HIGH); + + /** + * Constructs a new {@code GWDGraardorSwingHandler} {@Code Object}. + */ + public GWDGraardorSwingHandler() { + super(CombatStyle.MELEE); + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + return CombatStyle.MELEE.getSwingHandler().canSwing(entity, victim); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + int ticks = 1; + if (RandomFunction.randomize(10) < 7) { + int hit = 0; + if (CombatStyle.MELEE.getSwingHandler().isAccurateImpact(entity, victim, CombatStyle.MELEE)) { + int max = CombatStyle.MELEE.getSwingHandler().calculateHit(entity, victim, 1.0); + hit = RandomFunction.random(max); + state.setMaximumHit(max); + } + state.setEstimatedHit(hit); + state.setStyle(CombatStyle.MELEE); + } else { + ticks += (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3); + NPC npc = (NPC) entity; + List list = new ArrayList<>(); + for (Entity t : RegionManager.getLocalPlayers(npc, 28)) { + if (!CHAMBER.insideBorder(t.getLocation())) { + continue; + } + if (t.isAttackable(npc, CombatStyle.RANGE)) { + list.add(new BattleState(entity, t)); + } + } + BattleState[] targets; + state.setStyle(CombatStyle.RANGE); + state.setTargets(targets = list.toArray(new BattleState[list.size()])); + for (BattleState s : targets) { + s.setStyle(CombatStyle.RANGE); + int hit = 0; + if (CombatStyle.RANGE.getSwingHandler().isAccurateImpact(entity, s.getVictim(), CombatStyle.RANGE)) { + int max = CombatStyle.RANGE.getSwingHandler().calculateHit(entity, s.getVictim(), 1.0); + s.setMaximumHit(max); + hit = RandomFunction.random(max); + } + s.setEstimatedHit(hit); + } + } + return ticks; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + switch (state.getStyle()) { + case MELEE: + entity.animate(MELEE_ATTACK); + break; + default: + entity.animate(RANGE_ATTACK); + for (BattleState s : state.getTargets()) { + Projectile.ranged(entity, s.getVictim(), 1200, 0, 0, 46, 1).send(); + } + break; + } + } + + @Override + public ArmourSet getArmourSet(Entity e) { + return getType().getSwingHandler().getArmourSet(e); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return getType().getSwingHandler().getSetMultiplier(e, skillId); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == CombatStyle.MELEE) { + state.getStyle().getSwingHandler().impact(entity, victim, state); + return; + } + for (BattleState s : state.getTargets()) { + if (s == null || s.getEstimatedHit() < 0) { + continue; + } + int hit = s.getEstimatedHit(); + s.getVictim().getImpactHandler().handleImpact(entity, hit, CombatStyle.RANGE, s); + } + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == CombatStyle.MELEE) { + victim.animate(victim.getProperties().getDefenceAnimation()); + return; + } + for (BattleState s : state.getTargets()) { + s.getVictim().animate(s.getVictim().getProperties().getDefenceAnimation()); + } + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == CombatStyle.MELEE) { + state.getStyle().getSwingHandler().adjustBattleState(entity, victim, state); + return; + } + for (BattleState s : state.getTargets()) { + CombatStyle.RANGE.getSwingHandler().adjustBattleState(entity, s.getVictim(), s); + } + } + + @Override + public int calculateAccuracy(Entity entity) { + return getType().getSwingHandler().calculateAccuracy(entity); + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return getType().getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + return getType().getSwingHandler().calculateHit(entity, victim, modifier); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java new file mode 100644 index 000000000..2738fe853 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java @@ -0,0 +1,204 @@ +package core.game.content.activity.gwd; + +import java.util.ArrayList; +import java.util.List; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Handles Kree'arra's combat. + * @author Emperor + */ +public final class GWDKreeArraSwingHandler extends CombatSwingHandler { + + /** + * The boss chamber. + */ + private static final ZoneBorders CHAMBER = new ZoneBorders(2824, 5296, 2842, 5308); + + /** + * The melee attack animation. + */ + private static final Animation MELEE_ATTACK = new Animation(6977, Priority.HIGH); + + /** + * The range attack animation. + */ + private static final Animation RANGE_ATTACK = new Animation(6976, Priority.HIGH); + + /** + * The end graphic. + */ + private static final Graphics END_GRAPHIC = new Graphics(80, 96); + + /** + * Constructs a new {@code GWDKreeArraSwingHandler} {@Code Object}. + */ + public GWDKreeArraSwingHandler() { + super(CombatStyle.RANGE); + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + return CombatStyle.RANGE.getSwingHandler().canSwing(entity, victim); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + int ticks = 1; + int distance = entity.size() >> 1; + if (!entity.inCombat()) { + distance++; + } + if (victim.getLocation().withinDistance(entity.getCenterLocation(), distance) && RandomFunction.RANDOM.nextBoolean()) { + int hit = 0; + int max = CombatStyle.MELEE.getSwingHandler().calculateHit(entity, victim, 1.0); + if (CombatStyle.MELEE.getSwingHandler().isAccurateImpact(entity, victim, CombatStyle.MELEE)) { + hit = RandomFunction.random(max); + } + state.setEstimatedHit(hit); + hit = 0; + if (CombatStyle.MELEE.getSwingHandler().isAccurateImpact(entity, victim, CombatStyle.MELEE)) { + hit = RandomFunction.random(max); + } + state.setSecondaryHit(hit); + state.setMaximumHit(max); + state.setStyle(CombatStyle.MELEE); + } else { + ticks += (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3); + NPC npc = (NPC) entity; + List list = new ArrayList<>(); + for (Entity t : RegionManager.getLocalPlayers(npc, 28)) { + if (!CHAMBER.insideBorder(t.getLocation())) { + continue; + } + if (t.isAttackable(npc, CombatStyle.RANGE)) { + list.add(new BattleState(entity, t)); + } + } + BattleState[] targets; + state.setStyle(CombatStyle.RANGE); + state.setTargets(targets = list.toArray(new BattleState[list.size()])); + for (BattleState s : targets) { + CombatStyle style = RandomFunction.randomize(10) < 3 ? CombatStyle.MAGIC : CombatStyle.RANGE; + s.setStyle(style); + int hit = 0; + if (style.getSwingHandler().isAccurateImpact(entity, s.getVictim(), style)) { + int max = style.getSwingHandler().calculateHit(entity, s.getVictim(), 1.0); + s.setMaximumHit(max); + if(style.equals(CombatStyle.RANGE)){ + max = 71; + } + hit = RandomFunction.random(max); + } + s.setEstimatedHit(hit); + } + } + return ticks; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + switch (state.getStyle()) { + case MELEE: + entity.animate(MELEE_ATTACK); + break; + default: + entity.animate(RANGE_ATTACK); + for (BattleState s : state.getTargets()) { + int gfxId = 1197; + if (s.getStyle() == CombatStyle.MAGIC) { + gfxId = 1198; + } + Projectile.ranged(entity, s.getVictim(), gfxId, 92, 36, 46, 5).send(); + } + break; + } + } + + @Override + public ArmourSet getArmourSet(Entity e) { + return getType().getSwingHandler().getArmourSet(e); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return getType().getSwingHandler().getSetMultiplier(e, skillId); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == CombatStyle.MELEE) { + state.getStyle().getSwingHandler().impact(entity, victim, state); + return; + } + for (BattleState s : state.getTargets()) { + if (s == null || s.getEstimatedHit() < 0) { + continue; + } + int hit = s.getEstimatedHit(); + s.getVictim().getImpactHandler().handleImpact(entity, hit, s.getStyle(), s); + } + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == CombatStyle.MELEE) { + victim.animate(victim.getProperties().getDefenceAnimation()); + return; + } + for (BattleState s : state.getTargets()) { + s.getVictim().animate(s.getVictim().getProperties().getDefenceAnimation()); + if (RandomFunction.randomize(10) < 8) { + Direction dir = Direction.getLogicalDirection(entity.getLocation(), s.getVictim().getLocation()); + Location destination = s.getVictim().getLocation().transform(dir.getStepX(), dir.getStepY(), 0); + if (CHAMBER.insideBorder(destination)) { + s.getVictim().getProperties().setTeleportLocation(destination); + s.getVictim().graphics(END_GRAPHIC); + } + } + } + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == CombatStyle.MELEE) { + state.getStyle().getSwingHandler().adjustBattleState(entity, victim, state); + return; + } + for (BattleState s : state.getTargets()) { + s.getStyle().getSwingHandler().adjustBattleState(entity, s.getVictim(), s); + } + } + + @Override + public int calculateAccuracy(Entity entity) { + return getType().getSwingHandler().calculateAccuracy(entity); + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return getType().getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + return getType().getSwingHandler().calculateHit(entity, victim, modifier); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java new file mode 100644 index 000000000..8135c6cc0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java @@ -0,0 +1,155 @@ +package core.game.content.activity.gwd; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Handles K'ril Tsutsaroth's combat. + * @author Emperor + */ +public final class GWDTsutsarothSwingHandler extends CombatSwingHandler { + + /** + * The melee attack animation. + */ + private static final Animation MELEE_ATTACK = new Animation(6945, Priority.HIGH); + + /** + * The range attack animation. + */ + private static final Animation MAGIC_ATTACK = new Animation(6947, Priority.HIGH); + + /** + * The magic start graphic. + */ + private static final Graphics MAGIC_START = new Graphics(1210); + + /** + * If K'ril is performing its special attack. + */ + private boolean special; + + /** + * Constructs a new {@code GWDTsutsarothSwingHandler} {@Code Object}. + */ + public GWDTsutsarothSwingHandler() { + super(CombatStyle.MELEE); + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + return CombatStyle.MELEE.getSwingHandler().canSwing(entity, victim); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + int ticks = 1; + special = false; + int hit = 0; + CombatStyle style = CombatStyle.MELEE; + if (RandomFunction.randomize(10) < 4) { + ticks += (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3); + style = CombatStyle.MAGIC; + } else if (RandomFunction.randomize(10) == 0) { + if (special = (victim instanceof Player)) { + ((Player) victim).getPacketDispatch().sendMessage("K'ril Tsutsaroth slams through your protection prayer, leaving you feeling drained."); + } + entity.sendChat("YARRRRRRR!"); + } + if (style.getSwingHandler().isAccurateImpact(entity, victim)) { + int max = style.getSwingHandler().calculateHit(entity, victim, special ? 1.08 : 1.0); + hit = RandomFunction.random(max); + state.setMaximumHit(max); + if (style == CombatStyle.MELEE) { + victim.getStateManager().register(EntityState.POISONED, false, 168, entity); + } + if (special) { + ((Player) victim).getSkills().decrementPrayerPoints(hit / 2); + } + } + state.setEstimatedHit(hit); + state.setStyle(style); + return ticks; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + switch (state.getStyle()) { + case MELEE: + entity.animate(MELEE_ATTACK); + break; + default: + entity.visualize(MAGIC_ATTACK, MAGIC_START); + Projectile.magic(entity, victim, 1211, 0, 0, 46, 1).send(); + break; + } + } + + @Override + public ArmourSet getArmourSet(Entity e) { + return getType().getSwingHandler().getArmourSet(e); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return getType().getSwingHandler().getSetMultiplier(e, skillId); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == CombatStyle.MAGIC) { + if (state.getEstimatedHit() > -1) { + victim.getImpactHandler().handleImpact(entity, state.getEstimatedHit(), CombatStyle.MAGIC, state); + } + return; + } + state.getStyle().getSwingHandler().impact(entity, victim, state); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + victim.animate(victim.getProperties().getDefenceAnimation()); + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + super.adjustBattleState(entity, victim, state); + } + + @Override + protected int getFormattedHit(Entity entity, Entity victim, BattleState state, int hit) { + if (!special) { + if (state.getArmourEffect() != ArmourSet.VERAC && victim.hasProtectionPrayer(state.getStyle())) { + hit *= entity instanceof Player ? 0.6 : 0; + } + } + return formatHit(victim, hit); + } + + @Override + public int calculateAccuracy(Entity entity) { + return getType().getSwingHandler().calculateAccuracy(entity); + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return getType().getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + return getType().getSwingHandler().calculateHit(entity, victim, modifier); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java new file mode 100644 index 000000000..f82b81fe8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java @@ -0,0 +1,146 @@ +package core.game.content.activity.gwd; + +import java.util.ArrayList; +import java.util.List; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Handles the Commander Zilyana combat. + * @author Emperor + */ +public class GWDZilyanaSwingHandler extends CombatSwingHandler { + + /** + * The melee attack animation. + */ + private static final Animation MELEE_ATTACK = new Animation(6964, Priority.HIGH); + + /** + * The magic attack animation. + */ + private static final Animation MAGIC_ATTACK = new Animation(6967, Priority.HIGH); + + /** + * The magic end graphic. + */ + private static final Graphics MAGIC_END_GRAPHIC = new Graphics(1207); + + /** + * Constructs a new {@code ZilyanaSwingHandler} {@Code Object}. + */ + public GWDZilyanaSwingHandler() { + super(CombatStyle.MAGIC); + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + return CombatStyle.MELEE.getSwingHandler().canSwing(entity, victim); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + BattleState[] targets; + if (RandomFunction.randomize(10) < 7) { + targets = new BattleState[] { state }; + setType(CombatStyle.MELEE); + state.setStyle(CombatStyle.MELEE); + } else { + NPC npc = (NPC) entity; + List list = new ArrayList<>(); + for (Entity t : RegionManager.getLocalPlayers(npc.getCenterLocation(), (npc.size() >> 1) + 2)) { + if (t.getLocation().getX() < 2908 && t.isAttackable(npc, CombatStyle.MAGIC)) { + list.add(new BattleState(entity, t)); + } + } + state.setTargets(targets = list.toArray(new BattleState[list.size()])); + state.setStyle(CombatStyle.MAGIC); + setType(CombatStyle.MAGIC); + } + for (BattleState s : targets) { + s.setStyle(state.getStyle()); + int hit = getType() == CombatStyle.MAGIC ? -1 : 0; + if (isAccurateImpact(entity, s.getVictim())) { + int max = calculateHit(entity, s.getVictim(), 1.0); + s.setMaximumHit(max); + hit = RandomFunction.random(max); + } + s.setEstimatedHit(hit); + } + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + switch (getType()) { + case MELEE: + entity.animate(MELEE_ATTACK); + break; + case MAGIC: + entity.animate(MAGIC_ATTACK); + break; + default: + break; + } + } + + @Override + public ArmourSet getArmourSet(Entity e) { + return getType().getSwingHandler().getArmourSet(e); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return getType().getSwingHandler().getSetMultiplier(e, skillId); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + state.getStyle().getSwingHandler().impact(entity, victim, state); + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + state.getStyle().getSwingHandler().adjustBattleState(entity, victim, state); + } + + @Override + public int calculateAccuracy(Entity entity) { + return getType().getSwingHandler().calculateAccuracy(entity); + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return getType().getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + return getType().getSwingHandler().calculateHit(entity, victim, modifier); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == CombatStyle.MAGIC) { + for (BattleState s : state.getTargets()) { + if (s.getEstimatedHit() > 0) { + s.getVictim().graphics(MAGIC_END_GRAPHIC); + } + } + return; + } + state.getStyle().getSwingHandler().visualizeImpact(entity, victim, state); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GodWarsFaction.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GodWarsFaction.java new file mode 100644 index 000000000..582c02a57 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GodWarsFaction.java @@ -0,0 +1,99 @@ +package core.game.content.activity.gwd; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * The god wars factions. + * @author Emperor + */ +public enum GodWarsFaction { + ARMADYL(6222, 6246, 87, 11694, 11718, 11720, 11722, 12670, 12671, 14671), + BANDOS(6260, 6283, 11061, 11696, 11724, 11726, 11728), + SARADOMIN(6247, 6259, 1718, 2412, 2415, 2661, 2663, 2665, 2667, 3479, 3675, 3489, 3840, 4682, 6762, 8055, 10384, 10386, 10388, 10390, 10440, 10446, 10452, 10458, 10464, 10470, 11181, 11698, 11730,542,544), + ZAMORAK(6203, 6221, 11716, 11700, 1724, 2414, 2417, 2653, 2655, 2657, 2659, 3478, 3674, 3841, 3842, 3852, 4683, 6764, 8056, 10368, 10370, 10372, 10374, 10444, 10450, 10456, 10460, 10468, 10474, 10776, 10786, 10790, 14662); + + /** + * The start NPC id. + */ + private final int startId; + + /** + * The end NPC id. + */ + private final int endId; + + /** + * The protection items. + */ + private final int[] protectionItems; + + /** + * Constructs a new {@code GodWarsFaction} {@code Object}. + * @param startId The start NPC id. + * @param endId The end NPC id. + * @param protectionItems The protection items for this faction. + */ + private GodWarsFaction(int startId, int endId, int... protectionItems) { + this.startId = startId; + this.endId = endId; + this.protectionItems = protectionItems; + } + + /** + * Gets the god wars faction for the given NPC id. + * @param npcId The NPC id. + * @return The faction for this NPC. + */ + public static GodWarsFaction forId(int npcId) { + for (GodWarsFaction faction : values()) { + if (npcId >= faction.getStartId() && npcId <= faction.getEndId()) { + return faction; + } + } + return null; + } + + /** + * Checks if the player is protected from this faction. + * @param player The player. + * @return {@code True} if no NPCs of this faction should attack the + * player. + */ + public boolean isProtected(Player player) { + for (Item item : player.getEquipment().toArray()) { + if (item != null) { + for (int id : protectionItems) { + if (item.getId() == id) { + return true; + } + } + } + } + return false; + } + + /** + * Gets the startId. + * @return The startId. + */ + public int getStartId() { + return startId; + } + + /** + * Gets the endId. + * @return The endId. + */ + public int getEndId() { + return endId; + } + + /** + * Gets the protectionItems. + * @return The protectionItems. + */ + public int[] getProtectionItems() { + return protectionItems; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GodWarsMinionNPC.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GodWarsMinionNPC.java new file mode 100644 index 000000000..09898a565 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GodWarsMinionNPC.java @@ -0,0 +1,100 @@ +package core.game.content.activity.gwd; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Handles a god wars minion NPC. + * @author Emperor + */ +@Initializable +public final class GodWarsMinionNPC extends AbstractNPC { + + /** + * The boss NPC. + */ + private NPC boss; + + /** + * Constructs a new {@code GodWarsMinionNPC} {@code Object}. + */ + public GodWarsMinionNPC() { + super(6223, null); + } + + /** + * Constructs a new {@code GodWarsMinionNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public GodWarsMinionNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.init(); + } + + @Override + public void tick() { + super.tick(); + if (boss != null && boss.inCombat()) { + Entity target = boss.getAttribute("combat-attacker"); + if (target != null && (target != getProperties().getCombatPulse().getVictim() || !getProperties().getCombatPulse().isAttacking())) { + if (!getProperties().getCombatPulse().isAttacking() && !DeathTask.isDead(this)) { + // getProperties().getCombatPulse().attack(target); + } else { + getProperties().getCombatPulse().setVictim(target); + face(target); + } + } + } + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + getProperties().getCombatPulse().stop(); + if (boss != null && boss.getRespawnTick() > GameWorld.getTicks()) { + setRespawnTick(boss.getRespawnTick()); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new GodWarsMinionNPC(id, location); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + switch (identifier) { + case "set_boss": + boss = (NPC) args[0]; + return true; + } + return null; + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (boss != null && boss.getId() == 6222 && style == CombatStyle.MELEE && entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage("The aviansie is flying too high for you to attack using melee."); + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public int[] getIds() { + return new int[] { 6204, 6206, 6208, 6223, 6225, 6227, 6248, 6250, 6252, 6261, 6263, 6265 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GodWarsNPC.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GodWarsNPC.java new file mode 100644 index 000000000..b8dfdd7e6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GodWarsNPC.java @@ -0,0 +1,123 @@ +package core.game.content.activity.gwd; + +import java.util.ArrayList; +import java.util.List; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.npc.agg.AggressiveBehavior; +import core.game.node.entity.npc.agg.AggressiveHandler; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.world.map.RegionManager; + +/** + * Handles a god wars NPC. + * @author Emperor + */ +@Initializable +public final class GodWarsNPC extends AbstractNPC { + + /** + * The aggressive behavior. + */ + private static final AggressiveBehavior AGGRO_BEHAVIOR = new AggressiveBehavior() { + + @Override + public boolean canSelectTarget(Entity entity, Entity target) { + if (!target.isActive() || DeathTask.isDead(target) || DeathTask.isDead(entity)) { + return false; + } + if (!target.getProperties().isMultiZone() && target.inCombat()) { + return false; + } + if (target instanceof GodWarsNPC) { + if (((GodWarsNPC) target).faction != ((GodWarsNPC) entity).faction) { + return true; + } + } else if (target instanceof Player) { + if (!((GodWarsNPC) entity).faction.isProtected((Player) target)) { + return true; + } + } + return false; + } + + @Override + public List getPossibleTargets(Entity entity, int radius) { + List targets = new ArrayList<>(); + for (Player player : RegionManager.getLocalPlayers(entity, radius)) { + if (canSelectTarget(entity, player)) { + targets.add(player); + } + } + if (!targets.isEmpty()) { + return targets; + } + for (NPC npc : RegionManager.getLocalNpcs(entity, radius)) { + if (canSelectTarget(entity, npc)) { + targets.add(npc); + } + } + return targets; + } + }; + + /** + * The god wars faction (0=armadyl, 1=bandos, 2=saradomin, 3=zamorak). + */ + private GodWarsFaction faction; + + /** + * Constructs a new {@code GodWarsNPC} {@code Object}. + */ + public GodWarsNPC() { + super(-1, null); + } + + /** + * Constructs a new {@code GodWarsNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public GodWarsNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.init(); + setWalks(true); + faction = GodWarsFaction.forId(getId()); + } + + @Override + public void setDefaultBehavior() { + setAggressive(true); + aggressiveHandler = new AggressiveHandler(this, AGGRO_BEHAVIOR); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (style == CombatStyle.MELEE && faction == GodWarsFaction.ARMADYL && entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage("The aviansie is flying too high for you to attack using melee."); + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new GodWarsNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 6210, 6211, 6212, 6213, 6214, 6215, 6216, 6217, 6218, 6219, 6220, 6221, 6229, 6230, 6231, 6232, 6233, 6234, 6235, 6236, 6237, 6238, 6239, 6240, 6241, 6242, 6243, 6244, 6245, 6246, 6254, 6255, 6256, 6257, 6258, 6259, 6267, 6268, 6269, 6270, 6271, 6272, 6273, 6274, 6275, 6276, 6277, 6278, 6279, 6280, 6281, 6282, 6283 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GodwarsBossNPC.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GodwarsBossNPC.java new file mode 100644 index 000000000..b2b5a4697 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GodwarsBossNPC.java @@ -0,0 +1,308 @@ +package core.game.content.activity.gwd; + +import core.game.content.global.BossKillCounter; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatPulse; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.npc.agg.AggressiveBehavior; +import core.game.node.entity.npc.agg.AggressiveHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles a god wars boss NPC. + * @author Emperor + */ +@Initializable +public final class GodwarsBossNPC extends AbstractNPC { + + /** + * Handles the combat swing of Commander Zilyana. + */ + private static final CombatSwingHandler ZILYANA_COMBAT = new GWDZilyanaSwingHandler(); + + /** + * Handles the combat swing of Kree'arra. + */ + private static final CombatSwingHandler KREE_ARRA_COMBAT = new GWDKreeArraSwingHandler(); + + /** + * Handles the combat swing of General Graardor. + */ + private static final CombatSwingHandler GRAARDOR_COMBAT = new GWDGraardorSwingHandler(); + + /** + * Handles the combat swing of General Graardor. + */ + private static final CombatSwingHandler TSUTSAROTH_COMBAT = new GWDTsutsarothSwingHandler(); + + /** + * The battle cries. + */ + private static final String[][] BATTLE_CRIES = { { // Zamorak + "Attack them, you dogs!", "Forward!", "Death to Saradomin's dogs!", "Kill them, you cowards!", "The Dark One will have their souls!", "Zamorak curse them!", "Rend them limb from limb!", "No retreat!", "Flay them all!" }, { // Armadyl + "Kraaaw!" }, { // Saradomin + "Death to the enemies of the light!", "Slay the evil ones!", "Saradomin lend me strength!", "By the power of Saradomin!", "May Saradomin be my sword.", "Good will always triumph!", "Forward! Our allies are with us!", "Saradomin is with us!", "In the name of Saradomin!", "Attack! Find the Godsword!" }, { // Bandos + "Death to our enemies!", "Brargh!", "Break their bones!", "For the glory of Bandos!", "Split their skulls!", "We feast on the bones of our enemies tonight!", "CHAAARGE!", "Crush them underfoot!", "All glory to Bandos!", "GRAAAAAAAAAAAR!", "FOR THE GLORY OF THE BIG HIGH WAR GOD!" } }; + + /** + * The minions. + */ + private NPC[] minions; + + /** + * The boss chamber. + */ + private ZoneBorders chamber; + + /** + * The next battle cry tick. + */ + private int nextBattleCry; + + /** + * The combat swing handler. + */ + private CombatSwingHandler handler; + + /** + * If the NPC focuses on one target. + */ + private boolean targetFocus; + + /** + * Constructs a new {@code CommanderZilyanaNPC} {@code Object}. + */ + public GodwarsBossNPC() { + super(6203, null); + } + + /** + * Constructs a new {@code CommanderZilyanaNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public GodwarsBossNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + setAggressive(false); + super.init(); + switch (getId()) { + case 6203: + chamber = new ZoneBorders(2918, 5318, 2936, 5331); + handler = TSUTSAROTH_COMBAT; + targetFocus = true; + break; + case 6222: + chamber = new ZoneBorders(2824, 5296, 2842, 5308); + handler = KREE_ARRA_COMBAT; + break; + case 6247: + chamber = new ZoneBorders(2889, 5258, 2907, 5276); + handler = ZILYANA_COMBAT; + break; + case 6260: + chamber = new ZoneBorders(2864, 5351, 2876, 5369); + handler = GRAARDOR_COMBAT; + targetFocus = true; + break; + } + AggressiveBehavior behavior = null; + if (chamber != null) { + final ZoneBorders borders = chamber; + behavior = new AggressiveBehavior() { + @Override + public boolean canSelectTarget(Entity entity, Entity target) { + if (!target.isActive() || DeathTask.isDead(target)) { + return false; + } + if (!target.getProperties().isMultiZone() && target.inCombat()) { + return false; + } + return borders.insideBorder(target.getLocation()); + } + }; + super.setAggressiveHandler(new AggressiveHandler(this, behavior)); + if (chamber.insideBorder(getLocation())) { + minions = new NPC[3]; + for (int i = 0; i < 3; i++) { + int npcId = getId() + 1 + (i << 1); + AbstractNPC npc = (AbstractNPC) (minions[i] = NPC.create(npcId, getSpawnLocation(npcId))); + npc.init(); + npc.fireEvent("set_boss", this); + if (behavior != null) { + npc.setAggressiveHandler(new AggressiveHandler(npc, behavior)); + npc.getAggressiveHandler().setChanceRatio(6); + npc.getAggressiveHandler().setAllowTolerance(false); + npc.getAggressiveHandler().setRadius(28); + } + } + } + } + getProperties().setNPCWalkable(true); + getProperties().setCombatTimeOut(2); + getAggressiveHandler().setChanceRatio(6); + getAggressiveHandler().setRadius(28); + getAggressiveHandler().setAllowTolerance(false); + walkRadius = 28; + } + + @Override + public void tick() { + CombatPulse pulse = getProperties().getCombatPulse(); + if (chamber != null && pulse.isAttacking()) { + Entity e = pulse.getVictim(); + if (!targetFocus) { + Entity target = getImpactHandler().getMostDamageEntity(null); + if (target != null && target != e && target instanceof Player) { + pulse.setVictim(target); + } + } + if (!chamber.insideBorder(e.getLocation().getX(), e.getLocation().getY())) { + getPulseManager().clear(); + } + if (nextBattleCry < GameWorld.getTicks()) { + String[] cries = BATTLE_CRIES[(getId() - 6203) >> 4]; + sendChat(cries[RandomFunction.randomize(cries.length)]); + nextBattleCry = GameWorld.getTicks() + 7 + RandomFunction.randomize(20); + } + } + super.tick(); + if (getRespawnTick() == GameWorld.getTicks() && minions != null) { + for (NPC npc : minions) { + npc.setRespawnTick(-1); + } + } + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + if (targetFocus) { + if (getProperties().getCombatPulse().getNextAttack() < GameWorld.getTicks() - 3) { + getProperties().getCombatPulse().attack(entity); + return; + } + } + super.onImpact(entity, state); + } + + @Override + public void sendImpact(BattleState state) { + if (state.getVictim() == null || getId() != 6222) { + return; + } + int max = 0; + if (state.getVictim().isPlayer() && state.getEstimatedHit() > 0) { + switch (state.getStyle()) { + case MAGIC: + max = 21; + break; + case MELEE: + max = 26; + break; + case RANGE: + max = 71; + break; + + } + } + if (state.getEstimatedHit() > max) { + state.setEstimatedHit(RandomFunction.random(max - 10)); + } + if (state.getStyle() == CombatStyle.RANGE && state.getVictim().asPlayer().getPrayer().get(PrayerType.PROTECT_FROM_MISSILES)) { + state.neutralizeHits(); + } + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (getId() == 6222 || getId() == 6260 || getId() == 6247 || getId() == 6203) { + BossKillCounter.addtoKillcount((Player) killer, this.getId()); + } + if (minions == null) { + return; + } + for (NPC minion : minions) { + if (minion.getRespawnTick() >= GameWorld.getTicks()) { + minion.setRespawnTick(getRespawnTick()); + } + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (getId() == 6222 && style == CombatStyle.MELEE && entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage("The aviansie is flying too high for you to attack using melee."); + return false; + } + return super.isAttackable(entity, style); + } + + /** + * Gets the spawn location for the given NPC id. + * @param id The NPC id. + * @return The spawn location. + */ + private Location getSpawnLocation(int id) { + switch (id) { + case 6208: + return Location.create(2920, 5320, 2); + case 6206: + return Location.create(2919, 5327, 2); + case 6204: + return Location.create(2927, 5325, 2); + case 6223: + return Location.create(2828, 5298, 2); + case 6225: + return Location.create(2837, 5299, 2); + case 6227: + return Location.create(2834, 5302, 2); + case 6248: + return Location.create(2898, 5267, 0); + case 6250: + return Location.create(2901, 5268, 0); + case 6252: + return Location.create(2895, 5260, 0); + case 6265: + return Location.create(2866, 5363, 2); + case 6261: + return Location.create(2867, 5354, 2); + case 6263: + return Location.create(2873, 5354, 2); + } + return null; + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + if (handler != null) { + return handler; + } + return super.getSwingHandler(swing); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new GodwarsBossNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 6203, 6222, 6247, 6260 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GodwarsEntranceHandler.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GodwarsEntranceHandler.java new file mode 100644 index 000000000..1894de6df --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GodwarsEntranceHandler.java @@ -0,0 +1,102 @@ +package core.game.content.activity.gwd; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the entrance hole to the godwars dungeon. + * @author Emperor + */ +@Initializable +public final class GodwarsEntranceHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(26340).getHandlers().put("option:tie-rope", this); + ObjectDefinition.forId(26341).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(26338).getHandlers().put("option:move", this); + ObjectDefinition.forId(26305).getHandlers().put("option:crawl-through", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + GameObject object = (GameObject) node; + switch (object.getId()) { + case 26340: + if (!player.getInventory().remove(new Item(954))) { + player.getPacketDispatch().sendMessage("You don't have a rope to tie around the pillar."); + return true; + } + player.varpManager.get(1048).setVarbit(0,1).send(player); + player.varpManager.flagSave(1048); + return true; + case 26341: + if (player.getSkills().getStaticLevel(Skills.AGILITY) < 15) { + player.getPacketDispatch().sendMessage("You need an Agility level of 15 to enter this."); + return true; + } + if (player.varpManager.get(1048).getVarbit(4) == null) { + player.getDialogueInterpreter().sendDialogues(6201, FacialExpression.HALF_GUILTY, "Cough... Hey, over here."); + return true; + } + player.lock(2); + player.getPacketDispatch().sendMessage("You climb down the rope."); + player.animate(Animation.create(828)); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.getProperties().setTeleportLocation(Location.create(2882, 5311, 2)); + return true; + } + }); + return true; + case 26338: + if (player.getSkills().getStaticLevel(Skills.STRENGTH) < 60) { + player.getPacketDispatch().sendMessage("You need a Strength level of 60 to move this boulder."); + return true; + } + player.getPacketDispatch().sendObjectAnimation(object, Animation.create(6980)); + if (player.getLocation().getY() < 3716) { + ForceMovement.run(player, Location.create(2898, 3715, 0), Location.create(2898, 3719, 0), new Animation(6978), 3); + } else { + ForceMovement.run(player, Location.create(2898, 3719, 0), Location.create(2898, 3715, 0), new Animation(6979), 3); + } + GameWorld.getPulser().submit(new Pulse(12, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendObjectAnimation(RegionManager.getObject(0, 2898, 3716), Animation.create(6981)); + return true; + } + }); + return true; + case 26305: + if (player.getSkills().getStaticLevel(Skills.AGILITY) < 60) { + player.getPacketDispatch().sendMessage("You need an Agility level of 60 to squeeze through the crack."); + return true; + } + if (object.getLocation().equals(Location.create(2900, 3713, 0))) { + player.getProperties().setTeleportLocation(Location.create(2904, 3720, 0)); + } else { + player.getProperties().setTeleportLocation(Location.create(2899, 3713, 0)); + } + return true; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/gwd/GodwarsMapzone.java b/Server/src/main/java/Server/core/game/content/activity/gwd/GodwarsMapzone.java new file mode 100644 index 000000000..161287e49 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/gwd/GodwarsMapzone.java @@ -0,0 +1,555 @@ +package core.game.content.activity.gwd; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.container.impl.EquipmentContainer; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.MovementPulse; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.RangeWeapon; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.StringUtils; +import core.game.node.entity.skill.Skills; + +/** + * Handles the god wars map zone. + * @author Emperor + */ +@Initializable +public final class GodwarsMapzone extends MapZone implements Plugin { + + /** + * The Zamorak's fortress area. + */ + private static final ZoneBorders ZAMORAK_FORTRESS = new ZoneBorders(2880, 5317, 2944, 5362); + + static { + ZAMORAK_FORTRESS.addException(new ZoneBorders(2880, 5317, 2904, 5338)); + } + + /** + * Constructs a new {@code GodwarsMapzone} {@code Object}. + */ + public GodwarsMapzone() { + super("Godwars", true, ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.CANNON); + } + + @Override + public void configure() { + register(new ZoneBorders(2816, 5248, 2943, 5375)); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player player = (Player) e; + int componentId = player.getInterfaceManager().isResizable() ? 597 : 601; + if (ZAMORAK_FORTRESS.insideBorder(player.getLocation().getX(), player.getLocation().getY())) { + componentId = player.getInterfaceManager().isResizable() ? 598 : 599; + } + openOverlay(player, componentId); + if (player.getDetails().getRights() == Rights.ADMINISTRATOR) { + for (GodWarsFaction faction : GodWarsFaction.values()) { + increaseKillcount(player, faction, 40); + } + } + } + return true; + } + + /** + * Sets the rope setting. + * @param player The player. + * @param setting The setting. + */ + public void setRopeSetting(Player player, int setting) { + int value = player.getConfigManager().get(1048) | setting; + player.getConfigManager().set(1048, value, true); + } + + /** + * Opens the overlay. + * @param player The player. + * @param componentId The component id. + */ + private void openOverlay(Player player, int componentId) { + player.setAttribute("gwd:overlay", componentId); + player.getInterfaceManager().openOverlay(new Component(componentId)); + int child = (componentId == 601 || componentId == 599) ? 6 : 7; + for (GodWarsFaction faction : GodWarsFaction.values()) { + int amount = player.getAttribute("gwd:" + faction.name().toLowerCase() + "kc", 0); + player.getPacketDispatch().sendString(Integer.toString(amount), componentId, child + faction.ordinal()); + } + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (!logout && e instanceof Player) { + for (GodWarsFaction faction : GodWarsFaction.values()) { + e.removeAttribute("gwd:" + faction.name().toLowerCase() + "kc"); + } + e.removeAttribute("gwd:overlay"); + e.removeAttribute("gwd:altar-recharge"); + ((Player) e).getInterfaceManager().closeOverlay(); + } else if (logout) { + e.setLocation(e.getAttribute("cross_bridge_loc", e.getLocation())); + } + return true; + } + + @Override + public boolean death(Entity e, Entity killer) { + if (killer instanceof Player && e instanceof NPC) { + int npcId = ((NPC) e).getId(); + increaseKillcount((Player) killer, GodWarsFaction.forId(npcId), 1); + } + return false; + } + + @Override + public void locationUpdate(Entity e, Location last) { + if (e instanceof Player) { + Player player = (Player) e; + Component c = player.getInterfaceManager().getOverlay(); + boolean inZamorakFortress = ZAMORAK_FORTRESS.insideBorder(player.getLocation().getX(), player.getLocation().getY()); + if ((c == null || c.getId() != 598) && inZamorakFortress) { + openOverlay(player, 598); + } else if ((c == null || c.getId() != 597 && c.getId() != 601) && !inZamorakFortress) { + openOverlay(player, player.getInterfaceManager().isResizable() ? 597 : 601); + } + } + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GameObject) { + GameObject object = (GameObject) target; + if (object.getId() == 26439) { + handleIceBridge((Player) e, object); + return true; + } + if (object.getId() == 26384) { + handleBigDoor((Player) e, object, true); + return true; + } + if (object.getId() == 26303) { + handlePillarGrapple((Player) e, object); + return true; + } + if (object.getId() == 26293) { + handleRopeClimb((Player) e, Location.create(2915, 3746, 0)); + return true; + } + if (object.getId() == 26295) { + handleRopeClimb((Player) e, Location.create(2915, 5300, 1)); + return true; + } + if (object.getId() == 26296) { + handleRopeTie((Player) e, 0x2); + return true; + } + if (object.getId() == 26297) { + if (object.getLocation().getY() == 5300) { + handleRopeClimb((Player) e, Location.create(2912, 5300, 2)); + } else { + handleRopeClimb((Player) e, Location.create(2920, 5276, 1)); + } + return true; + } + if (object.getId() == 26299) { + handleRopeClimb((Player) e, Location.create(2919, 5274, 0)); + return true; + } + if (object.getId() == 26300) { + handleRopeTie((Player) e, 0x4); + return true; + } + if (object.getId() == 26286) { + handleAltar((Player) e, option.getName(), GodWarsFaction.ZAMORAK, Location.create(2925, 5332, 2)); + return true; + } + if (object.getId() == 26287) { + handleAltar((Player) e, option.getName(), GodWarsFaction.SARADOMIN, Location.create(2908, 5265, 0)); + return true; + } + if (object.getId() == 26288) { + handleAltar((Player) e, option.getName(), GodWarsFaction.ARMADYL, Location.create(2839, 5295, 2)); + return true; + } + if (object.getId() == 26289) { + handleAltar((Player) e, option.getName(), GodWarsFaction.BANDOS, Location.create(2863, 5354, 2)); + return true; + } + if (object.getId() >= 26425 && object.getId() <= 26428) { + return handleChamberEntrance((Player) e, object); + } + } + return false; + } + + /** + * Handles praying on an altar. + * @param player The player. + * @param faction The god wars faction. + */ + private void handleAltar(Player player, String option, GodWarsFaction faction, Location destination) { + if (!option.equals("Pray-at")) { + player.getProperties().setTeleportLocation(destination); + return; + } + if (player.getAttribute("gwd:altar-recharge", 0L) > System.currentTimeMillis()) { + player.getPacketDispatch().sendMessage("The gods blessed you recently - this time they ignore your prayers."); + return; + } + if (player.inCombat()) { + player.getPacketDispatch().sendMessage("You can't use the altar while in combat."); + return; + } + if (player.getSkills().getPrayerPoints() >= player.getSkills().getStaticLevel(5)) { + player.getPacketDispatch().sendMessage("You already have full prayer points."); + return; + } + player.lock(2); + int total = player.getSkills().getStaticLevel(5) + faction.getProtectionItemAmount(player); + player.animate(new Animation(645)); + player.getSkills().decrementPrayerPoints(player.getSkills().getPrayerPoints() - total); + player.getPacketDispatch().sendMessage("You recharge your Prayer points."); + int time = 600_000; + player.setAttribute("/save:gwd:altar-recharge", System.currentTimeMillis() + time); + } + + /** + * Handles the rope tying. + * @param player The player. + * @param type The rock tying type. + */ + private void handleRopeTie(Player player, int type) { + if (player.getSkills().getStaticLevel(Skills.AGILITY) < 70) { + player.getPacketDispatch().sendMessage("You need an Agility level of 70 to enter here."); + return; + } + if (!player.getInventory().remove(new Item(954))) { + player.getPacketDispatch().sendMessage("You don't have a rope to tie on this rock."); + return; + } + setRopeSetting(player, type); + } + + /** + * Handles the climbing of a rope. + * @param player The player. + */ + private void handleRopeClimb(final Player player, final Location destination) { + player.lock(2); + player.animate(Animation.create(828)); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.getProperties().setTeleportLocation(destination); + return true; + } + }); + } + + /** + * Handles the pillar grappling. + * @param player The player. + * @param object The pillar object. + */ + private void handlePillarGrapple(final Player player, final GameObject object) { + if (player.getSkills().getStaticLevel(Skills.RANGE) < 70) { + player.getPacketDispatch().sendMessage("You need a Range level of 70 to enter here."); + return; + } + if (player.getEquipment().getNew(EquipmentContainer.SLOT_ARROWS).getId() != 9419) { + player.getPacketDispatch().sendMessage("You need a mithril grapple to cross this."); + return; + } + RangeWeapon weapon = RangeWeapon.get(player.getEquipment().getNew(3).getId()); + if (weapon == null || weapon.getType() != 1) { + player.getPacketDispatch().sendMessage("You need to wield a crossbow to fire a mithril grapple."); + return; + } + player.lock(4); + if (player.getLocation().getY() < object.getLocation().getY()) { + ForceMovement.run(player, Location.create(2872, 5269, 2), Location.create(2872, 5279, 2), Animation.create(7081), 60).setCommenceSpeed(3); + } else { + ForceMovement.run(player, Location.create(2872, 5279, 2), Location.create(2872, 5269, 2), Animation.create(7081), 60).setCommenceSpeed(3); + } + player.graphics(new Graphics(1036, 96, 30)); + } + + /** + * Handles the big door. + * @param player The player. + * @param object The door object. + */ + private void handleBigDoor(final Player player, final GameObject object, boolean checkLocation) { + player.lock(4); + if (checkLocation && player.getLocation().getX() > object.getLocation().getX()) { + GameWorld.getPulser().submit(new MovementPulse(player, object.getLocation()) { + @Override + public boolean pulse() { + handleBigDoor(player, object, false); + return true; + } + }); + return; + } + if (player.getSkills().getStaticLevel(Skills.STRENGTH) < 70) { + player.getPacketDispatch().sendMessage("You need a Strength level of 70 to enter here."); + return; + } + if (!player.getInventory().contains(2347, 1)) { + player.getPacketDispatch().sendMessage("You need a hammer to bang on the door."); + return; + } + player.getPacketDispatch().sendMessage("You bang on the big door."); + player.animate(Animation.create(7002)); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + object.getDefinition().getOptions()[1] = "open"; + ObjectDefinition.getOptionHandler(object.getId(), "open").handle(player, object, "open"); + return true; + } + }); + } + + /** + * Handles a chamber door opening reward. + * @param player The player. + * @param object The object. + * @return {@code True} if the player can't pass. + */ + private boolean handleChamberEntrance(Player player, GameObject object) { + Direction dir = Direction.get((object.getRotation() + 3) % 4); + if (dir.getStepX() != 0) { + if (player.getLocation().getX() == object.getLocation().transform(dir.getStepX(), 0, 0).getX()) { + player.getPacketDispatch().sendMessage("You can't leave through this door. The altar can teleport you out."); + return true; + } + } else if (player.getLocation().getY() == object.getLocation().transform(0, dir.getStepY(), 0).getY()) { + player.getPacketDispatch().sendMessage("You can't leave through this door. The altar can teleport you out."); + return true; + } + int index = object.getId() - 26425; + if (index < 2) { + index = 1 - index; + } + GodWarsFaction faction = GodWarsFaction.values()[index]; + String name = faction.name().toLowerCase(); + int required = 40; + if (player.getAttribute("gwd:" + name + "kc", 0) < required) { + player.getPacketDispatch().sendMessage("You need " + required + " " + StringUtils.formatDisplayName(name) + " kills to enter this."); + return true; + } + increaseKillcount(player, faction, -required); + DoorActionHandler.handleAutowalkDoor(player, object); + return true; + } + + /** + * Handles the ice bridge crossing. + * @param player The player. + * @param object The object. + */ + private void handleIceBridge(final Player player, final GameObject object) { + if (player.getSkills().getStaticLevel(Skills.HITPOINTS) < 70) { + player.getPacketDispatch().sendMessage("You need 70 Hitpoints to cross this bridge."); + return; + } + player.lock(7); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.visualize(Animation.create(6988), Graphics.create(68)); + int diffY = 2; + if (object.getLocation().getY() == 5344) { + diffY = -2; + } + player.getProperties().setTeleportLocation(player.getLocation().transform(0, diffY, 0)); + player.getInterfaceManager().openOverlay(new Component(115)); + player.setAttribute("cross_bridge_loc", player.getLocation()); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 4: + if (object.getLocation().getY() == 5333) { + player.getProperties().setTeleportLocation(Location.create(2885, 5345, 2)); + } else { + player.getProperties().setTeleportLocation(Location.create(2885, 5332, 2)); + } + player.setDirection(Direction.get((player.getDirection().toInteger() + 2) % 4)); + break; + case 5: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().close(); + player.removeAttribute("cross_bridge_loc"); + player.getPacketDispatch().sendMessage("Dripping, you climb out of the water."); + if (player.getLocation().getY() > 5340) { + player.getSkills().decrementPrayerPoints(100.0); + player.getPacketDispatch().sendMessage("The extreme evil of this area leaves your Prayer drained."); + } + return true; + } + return false; + } + }); + return true; + } + }); + } + + /** + * Sets the kill count. + * @param p The player. + * @param faction The god wars faction. + * @param increase The amount to increase with. + */ + public void increaseKillcount(Player p, GodWarsFaction faction, int increase) { + if (faction == null) { + return; + } + String key = "gwd:" + faction.name().toLowerCase() + "kc"; + int amount = p.getAttribute(key, 0) + increase; + int componentId = p.getAttribute("gwd:overlay", 601); + int child = (componentId == 601 || componentId == 599) ? 6 : 7; + if (amount >= 4000) { + p.setAttribute("/save:" + key, 4000); + p.getPacketDispatch().sendString("Max", componentId, child + faction.ordinal()); + return; + } + p.setAttribute("/save:" + key, amount); + p.getPacketDispatch().sendString(Integer.toString(amount), componentId, child + faction.ordinal()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * The god wars factions. + * @author Emperor + */ + static enum GodWarsFaction { + ARMADYL(6222, 6246, 87, 11694, 11718, 11720, 11722, 12670, 12671, 14671), BANDOS(6260, 6283, 11061, 11696, 11724, 11726, 11728), SARADOMIN(6247, 6259, 1718, 2412, 2415, 2661, 2663, 2665, 2667, 3479, 3675, 3489, 3840, 4682, 6762, 8055, 10384, 10386, 10388, 10390, 10440, 10446, 10452, 10458, 10464, 10470, 11181, 11698, 11730), ZAMORAK(6203, 6221, 11716, 11700, 2414, 2417, 2653, 2655, 2657, 2659, 3478, 3674, 3841, 3842, 3852, 4683, 6764, 8056, 10368, 10370, 10372, 10374, 10444, 10450, 10456, 10460, 10468, 10474, 10776, 10786, 10790); + + /** + * The start NPC id. + */ + private final int startId; + + /** + * The end NPC id. + */ + private final int endId; + + /** + * The protection items. + */ + private final int[] protectionItems; + + /** + * Constructs a new {@code GodWarsFaction} {@code Object}. + * @param startId The start NPC id. + * @param endId The end NPC id. + * @param protectionItems The protection items for this faction. + */ + private GodWarsFaction(int startId, int endId, int... protectionItems) { + this.startId = startId; + this.endId = endId; + this.protectionItems = protectionItems; + } + + /** + * Gets the god wars faction for the given NPC id. + * @param npcId The NPC id. + * @return The faction for this NPC. + */ + public static GodWarsFaction forId(int npcId) { + for (GodWarsFaction faction : values()) { + if (npcId >= faction.getStartId() && npcId <= faction.getEndId()) { + return faction; + } + } + return null; + } + + /** + * Gets the amount of items the player is wearing to protect. + * @param player The player. + * @return The amount of protection items. + */ + public int getProtectionItemAmount(Player player) { + int count = 0; + for (Item item : player.getEquipment().toArray()) { + if (item != null) { + for (int id : protectionItems) { + if (item.getId() == id) { + count++; + } + } + } + } + return count; + } + + /** + * Gets the startId. + * @return The startId. + */ + public int getStartId() { + return startId; + } + + /** + * Gets the endId. + * @return The endId. + */ + public int getEndId() { + return endId; + } + + /** + * Gets the protectionItems. + * @return The protectionItems. + */ + public int[] getProtectionItems() { + return protectionItems; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/magearena/ChamberGuardianDialogue.java b/Server/src/main/java/Server/core/game/content/activity/magearena/ChamberGuardianDialogue.java new file mode 100644 index 000000000..dbe368ba4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/magearena/ChamberGuardianDialogue.java @@ -0,0 +1,138 @@ +package core.game.content.activity.magearena; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.GodType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles the chamber guardian dialogue. + * @author Vexia + */ +public final class ChamberGuardianDialogue extends DialoguePlugin { + + /** + * The god type. + */ + private GodType godType; + + /** + * Constructs a new {@code ChamberGuardianDialogue} {@code Object}. + */ + public ChamberGuardianDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ChamberGuardianDialogue} {@code Object}. + * @param player the player. + */ + public ChamberGuardianDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ChamberGuardianDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getSavedData().getActivityData().hasRecievedKolodionReward()) { + player("Hello again."); + return true; + } else if (player.getSavedData().getActivityData().hasKilledKolodion()) { + npc("Hello adventurer, have you made your choice?"); + return true; + } + npc("YOU SHOULD NOT BE IN HERE!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getSavedData().getActivityData().hasRecievedKolodionReward()) { + switch (stage) { + case 0: + npc("Hello adventurer, are you looking for another staff?"); + stage++; + break; + case 1: + options("What do you have to offer?", "No thanks."); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + player("No thanks."); + stage++; + break; + } + break; + case 3: + npc("Well let me know if you need one."); + stage++; + break; + case 4: + end(); + break; + } + return true; + } else if (player.getSavedData().getActivityData().hasKilledKolodion()) { + switch (stage) { + case 0: + godType = GodType.getCape(player); + if (godType == null) { + player("Sorry, I'm still looking."); + stage++; + } else { + player("I have."); + stage += 2; + } + break; + case 1: + end(); + break; + case 2: + npc("Good, good, I hope you have chosen well. I will now", "present you with a magic staff. This, along with the", "cape awarded to you by your chosen god, are all the", "weapons and armour you will need here."); + stage++; + break; + case 3: + if (!player.getInventory().hasSpaceFor(godType.getStaff())) { + player("Sorry, I don't have enough inventory space."); + stage = 1; + return true; + } + if (player.getInventory().containsItem(godType.getCape()) || player.getEquipment().containsItem(godType.getCape())) { + stage++; + player.getInventory().add(godType.getStaff()); + player.getSavedData().getActivityData().setKolodionStage(3); + interpreter.sendItemMessage(godType.getStaff(), "The guardian hands you an ornate magic staff."); + } else { + end(); + } + break; + case 4: + end(); + break; + } + return true; + } else { + end(); + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 904 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/magearena/KolodionDialogue.java b/Server/src/main/java/Server/core/game/content/activity/magearena/KolodionDialogue.java new file mode 100644 index 000000000..11ad28b7a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/magearena/KolodionDialogue.java @@ -0,0 +1,253 @@ +package core.game.content.activity.magearena; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles the kolodion dialogue. + * @author Vexia + */ +public final class KolodionDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KolodionDialogue} {@code Object}. + */ + public KolodionDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KolodionDialogue} {@code Object}. + * @param player the player. + */ + public KolodionDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KolodionDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getSavedData().getActivityData().hasStartedKolodion()) { + player("Hi."); + return true; + } + if (player.getSavedData().getActivityData().hasKilledKolodion()) { + player("Hello, Kolodion."); + return true; + } + player("Hello there. What is this place?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getSavedData().getActivityData().hasStartedKolodion()) { + switch (stage) { + case 0: + npc("You return, young conjurer. You obviously have a", "taste for the dark side of magic."); + stage++; + break; + case 1: + startFight(player); + end(); + break; + } + return true; + } + if (player.getSavedData().getActivityData().hasRecievedKolodionReward()) { + switch (stage) { + case 0: + npc("Hey there, how are you? Are you enjoying the", "bloodshed?"); + stage++; + break; + case 1: + player("I think I've had enough for now."); + stage++; + break; + case 2: + npc("A shame. You're a good battle mage. I hope", "to see you soon."); + stage++; + break; + case 3: + end(); + break; + } + return true; + } else if (player.getSavedData().getActivityData().hasKilledKolodion()) { + switch (stage) { + case 0: + npc("Hello, you mage. You're a tough one."); + stage++; + break; + case 1: + player("What now?"); + stage++; + break; + case 2: + npc("Step into the magic pool. It will take you to a chamber.", "There, you must decide which god you will represent in", "the arena."); + stage++; + break; + case 3: + player("Thanks, Kolodion."); + stage++; + break; + case 4: + npc("That's what I'm here for."); + stage++; + break; + case 5: + end(); + break; + } + return true; + } + switch (stage) { + case 0: + if (player.getSkills().getStaticLevel(Skills.MAGIC) < 60) { + npc("Do not waste my time with trivial questions. I am the", "Great Kolodion, master of battle magic. I have an arena", "to run."); + stage++; + } else { + npc("I am the great Kolodion, master of battle magic, and", "this is my battle arena. Top wizards travel from all over", GameWorld.getSettings().getName() + " to fight here."); + stage = 4; + } + break; + case 1: + player("Can I enter?"); + stage++; + break; + case 2: + player("Hah! A wizard of your level? Don't be absurd."); + stage++; + break; + case 3: + end(); + break; + case 4: + options("Can I fight here?", "What's the point of that?", "That's barbaric!"); + stage++; + break; + case 5: + switch (buttonId) { + case 1: + player("Can I fight here?"); + stage = 10; + break; + case 2: + player("What's the point of that?"); + stage = 20; + break; + case 3: + player("That's barbaric!"); + stage = 30; + break; + } + break; + case 10: + npc("My arena is open to any high level wizard, but this is", "no game. Many wizards fall in this arena, never to rise", "again. The strongest mages have been destroyed."); + stage++; + break; + case 11: + npc("If you're sure you want in?"); + stage++; + break; + case 12: + options("Yes indeedy.", "No I don't."); + stage++; + break; + case 13: + switch (buttonId) { + case 1: + player("Yes indeedy."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 14: + npc("Good, good. You have a healthy sense of competition."); + stage++; + break; + case 15: + npc("Remember, traveller - in my arena, hand-to-hand", "combat is useless. Your strength will diminish as you", "enter the arena, but the spells you can learn are", "amongst the most powerful in all of " + GameWorld.getSettings().getName() + "."); + stage++; + break; + case 16: + npc("Before I can accept you in, we must duel."); + stage++; + break; + case 17: + options("Okay, let's fight.", "No thanks."); + stage++; + break; + case 18: + switch (buttonId) { + case 1: + player("Okay, let's fight."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 19: + npc("I must first check that you are up to scratch."); + stage = 40; + break; + case 40: + player("You don't need to worry about that."); + stage++; + break; + case 41: + npc("Not just any magician can enter - only the most", "powerful and most feared. Before you can use the", "power of this arena, you must prove yourself against", "me."); + stage++; + break; + case 42: + startFight(player); + end(); + break; + case 20: + npc("They want to crown themselves the best", "mage in all of " + GameWorld.getSettings().getName() + "!"); + stage = 30; + break; + case 30: + end(); + break; + } + return true; + } + + /** + * Starts the fight. + * @param player the player. + */ + private void startFight(final Player player) { + player.getSavedData().getActivityData().setKolodionStage(1); + player.lock(); + npc.animate(Animation.create(811)); + player.teleport(Location.create(3105, 3934, 0), 3); + player.visualize(Animation.create(1816), Graphics.create(301, 100)); + KolodionSession.create(player).start(); + } + + @Override + public int[] getIds() { + return new int[] { 905 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/magearena/KolodionNPC.java b/Server/src/main/java/Server/core/game/content/activity/magearena/KolodionNPC.java new file mode 100644 index 000000000..c9270195e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/magearena/KolodionNPC.java @@ -0,0 +1,374 @@ +package core.game.content.activity.magearena; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.handlers.MagicSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +/** + * Handles the kolodion npc. + * @author Vexia + */ +public final class KolodionNPC extends AbstractNPC { + + /** + * The combat swing handler. + */ + private static final CombatSwingHandler SWING_HANDLER = new MagicSwingHandler() { + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + super.impact(entity, victim, state); + if (RandomFunction.random(10) < 4) { + ((KolodionNPC) entity).setRandomSpell(); + } + } + + }; + + /** + * The spell ids. + */ + private static final int[] SPELL_IDS = new int[] { 41, 42, 43 }; + + /** + * The session. + */ + private final KolodionSession session; + + /** + * The kolodion type. + */ + private KolodionType type; + + /** + * If the fight has commenced. + */ + private boolean commenced; + + /** + * Constructs a new {@code KolodionNPC} {@code Object}. + */ + public KolodionNPC() { + this(0, null, null); + } + + /** + * Constructs a new {@code KolodionNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public KolodionNPC(int id, Location location, final KolodionSession session) { + super(id, location); + this.setWalks(true); + this.session = session; + this.setRespawn(false); + this.type = KolodionType.forId(id); + } + + @Override + public void init() { + super.init(); + setRandomSpell(); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (session == null) { + return; + } + if (!session.getPlayer().isActive()) { + clear(); + return; + } + if (commenced && !getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(session.getPlayer()); + } + } + + @Override + public void startDeath(Entity killer) { + if (killer == session.getPlayer()) { + type.transform(this, session.getPlayer()); + return; + } + super.startDeath(killer); + } + + /** + * Sets a random spell. + */ + public void setRandomSpell() { + CombatSpell spell = (CombatSpell) SpellBook.MODERN.getSpell(SPELL_IDS[RandomFunction.random(SPELL_IDS.length)]); + getProperties().setSpell(spell); + getProperties().setAutocastSpell(spell); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return SWING_HANDLER; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new KolodionNPC(id, location, null); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (style != CombatStyle.MAGIC) { + return false; + } + if (session == null) { + return false; + } + if (session.getPlayer() != entity) { + return false; + } + return true; + } + + @Override + public boolean canSelectTarget(Entity target) { + if (target instanceof Player) { + Player p = (Player) target; + if (p != session.getPlayer()) { + return false; + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 907, 908, 909, 910, 911 }; + } + + /** + * Gets the session. + * @return The session. + */ + public KolodionSession getSession() { + return session; + } + + /** + * Gets the commenced. + * @return The commenced. + */ + public boolean isCommenced() { + return commenced; + } + + /** + * Sets the commenced. + * @param commenced The commenced to set. + */ + public void setCommenced(boolean commenced) { + this.commenced = commenced; + } + + /** + * Gets the type. + * @return The type. + */ + public KolodionType getType() { + return type; + } + + /** + * Sets the type. + * @param type The type to set. + */ + public void setType(KolodionType type) { + this.type = type; + } + + /** + * Represents a kolodion type. + * @author Vexia + */ + public enum KolodionType { + HUMAN(907, null, -1, "You must prove yourself... now!"), OGRE(908, null, 188, "This is only the beginning; you can't beat me!"), SPIDER(909, new Animation(5324), 190, "Foolish mortal; I am unstoppable."), GHOST(910, new Animation(715), 188, "Now you feel it.. The dark energy."), DEMON(911, new Animation(4623), 190, "Aaaaaaaarrgghhhh! The power!"), END(906, null, 188, null); + + /** + * The npc id. + */ + private final int npcId; + + /** + * The appear animation. + */ + private final Animation appearAnimation; + + /** + * The graphic id. + */ + private final int graphcId; + + /** + * The appeared message. + */ + private final String appearMessage; + + /** + * The spell ids. + */ + private final int[] spellIds; + + /** + * Constructs a new {@code KolodionType} {@code Object}. + * @param npcId the npc id. + * @param appearMessage the message. + */ + private KolodionType(int npcId, final Animation appearAnimation, final int graphicId, String appearMessage, int... spellIds) { + this.npcId = npcId; + this.appearMessage = appearMessage; + this.appearAnimation = appearAnimation; + this.graphcId = graphicId; + this.spellIds = spellIds; + } + + /** + * Transforms the new npc. + */ + public void transform(final KolodionNPC kolodion, final Player player) { + final KolodionType newType = next(); + kolodion.lock(); + kolodion.getPulseManager().clear(); + kolodion.getWalkingQueue().reset(); + kolodion.getImpactHandler().setDisabledTicks(50); + player.getSavedData().getActivityData().setKolodionBoss(newType.ordinal()); + if (newType == END) { + player.lock(); + } + player.lock(2); + GameWorld.getPulser().submit(new Pulse(1, kolodion, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + if (newType != GHOST) { + kolodion.getAnimator().forceAnimation(kolodion.getProperties().getDeathAnimation()); + } + break; + case 3: + if (newType == GHOST) { + kolodion.getAnimator().forceAnimation(kolodion.getProperties().getDeathAnimation()); + } + break; + case 4: + player.getPacketDispatch().sendPositionedGraphic(newType.getGraphcId(), 0, 0, kolodion.getLocation()); + if (newType.getAppearAnimation() != null) { + kolodion.animate(newType.getAppearAnimation()); + } + break; + case 5: + kolodion.unlock(); + kolodion.getAnimator().reset(); + kolodion.fullRestore(); + kolodion.setType(newType); + kolodion.transform(newType.getNpcId()); + kolodion.getImpactHandler().setDisabledTicks(1); + if (newType != END) { + kolodion.getProperties().getCombatPulse().attack(player); + } + break; + case 6: + if (newType.getAppearMessage() != null) { + kolodion.sendChat(newType.getAppearMessage()); + } + if (newType == END) { + return false; + } + return true; + case 7: + player.unlock(); + player.getSavedData().getActivityData().setKolodionStage(2); + player.getProperties().setTeleportLocation(Location.create(2540, 4717, 0)); + return true; + } + return false; + } + + }); + } + + /** + * Gets the kolodion type for the id. + * @param id the id. + * @return the kolodion type. + */ + public static KolodionType forId(int id) { + for (KolodionType type : values()) { + if (type.getNpcId() == id) { + return type; + } + } + return null; + } + + /** + * Gets the next type. + * @return the type. + */ + public KolodionType next() { + return values()[ordinal() + 1]; + } + + /** + * Gets the npcId. + * @return The npcId. + */ + public int getNpcId() { + return npcId; + } + + /** + * Gets the appearMessage. + * @return The appearMessage. + */ + public String getAppearMessage() { + return appearMessage; + } + + /** + * Gets the spellIds. + * @return The spellIds. + */ + public int[] getSpellIds() { + return spellIds; + } + + /** + * Gets the appearAnimation. + * @return The appearAnimation. + */ + public Animation getAppearAnimation() { + return appearAnimation; + } + + /** + * Gets the graphcId. + * @return The graphcId. + */ + public int getGraphcId() { + return graphcId; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/magearena/KolodionSession.java b/Server/src/main/java/Server/core/game/content/activity/magearena/KolodionSession.java new file mode 100644 index 000000000..25ec390f3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/magearena/KolodionSession.java @@ -0,0 +1,120 @@ +package core.game.content.activity.magearena; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; + +/** + * Represents a session with kolodion. + * @author Vexia + */ +public final class KolodionSession { + + /** + * The player. + */ + private final Player player; + + /** + * The kolodion npc. + */ + private final KolodionNPC kolodion; + + /** + * Constructs a new {@code ExperimentSession} {@code Object}. + * @param player the player. + */ + public KolodionSession(final Player player) { + this.player = player; + this.kolodion = new KolodionNPC(KolodionNPC.KolodionType.values()[player.getSavedData().getActivityData().getKolodionBoss()].getNpcId(), Location.create(3106, 3934, 0), this); + if (player.getExtension(KolodionSession.class) != null) { + player.removeExtension(KolodionSession.class); + } + player.addExtension(KolodionSession.class, this); + } + + /** + * Creates the kolodion session. + * @param player the player. + * @return the session. + */ + public static KolodionSession create(Player player) { + return new KolodionSession(player); + } + + /** + * Starts the session. + */ + public void start() { + if (kolodion.getType().ordinal() > 0) { + kolodion.init(); + kolodion.sendChat("Let us continue with our battle."); + kolodion.getProperties().getCombatPulse().attack(player); + player.unlock(); + player.getAnimator().reset(); + return; + } + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 3: + player.getAnimator().reset(); + break; + case 5: + player.getPacketDispatch().sendPositionedGraphic(86, 1, 0, Location.create(3106, 3934, 0)); + break; + case 6: + kolodion.init(); + kolodion.faceTemporary(player, 1); + break; + case 7: + kolodion.sendChat("You must prove yourself... now!"); + break; + case 9: + player.unlock(); + kolodion.setCommenced(true); + return true; + } + return false; + } + }); + } + + /** + * Closes the session. + */ + public void close() { + kolodion.clear(); + player.removeExtension(KolodionSession.class); + } + + /** + * Gets the kolodion session. + * @param player the player. + * @return the session. + */ + public static KolodionSession getSession(Player player) { + return player.getExtension(KolodionSession.class); + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the kolodion. + * @return The kolodion. + */ + public NPC getKolodion() { + return kolodion; + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/magearena/LundailDialogue.java b/Server/src/main/java/Server/core/game/content/activity/magearena/LundailDialogue.java new file mode 100644 index 000000000..aa4f76376 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/magearena/LundailDialogue.java @@ -0,0 +1,103 @@ +package core.game.content.activity.magearena; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; + +/** + * Handles the lundail dialogue. + * @author Vexia + */ +public final class LundailDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LundailDialogue} {@code Object}. + */ + public LundailDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LundailDialogue} {@code Object}. + * @param player the player. + */ + public LundailDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LundailDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hello sir."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + npc("How can I help you, brave adventurer?"); + stage++; + break; + case 2: + options("What are you selling?", "What's that big old building above us?"); + stage++; + break; + case 3: + switch (buttonId) { + case 1: + player("What are you selling?"); + stage = 10; + break; + case 2: + player("What's that big old building above us?"); + stage = 20; + break; + } + break; + case 10: + npc("I sell rune stones. I've got some good stuff, some really", "powerful little rocks. Take a look."); + stage++; + break; + case 11: + npc.openShop(player); + end(); + break; + case 20: + npc("That, my friend is the mage battle arena. Top mages", "come from all over " + GameWorld.getSettings().getName() + " to compete in the arena."); + stage++; + break; + case 21: + player("Wow."); + stage++; + break; + case 22: + npc("Few return, most get fried, hence the smell."); + stage++; + break; + case 23: + player("Hmmm... I did notice."); + stage++; + break; + case 24: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 903 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/magearena/MageArenaNPC.java b/Server/src/main/java/Server/core/game/content/activity/magearena/MageArenaNPC.java new file mode 100644 index 000000000..39628e8af --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/magearena/MageArenaNPC.java @@ -0,0 +1,104 @@ +package core.game.content.activity.magearena; + +import core.game.content.global.GodType; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * A mage arena npc. + * @author Vexia + */ +public final class MageArenaNPC extends AbstractNPC { + + /** + * The god type. + */ + private final GodType type; + + /** + * Constructs a new {@code MageArenaNPC} {@code Object}. + */ + public MageArenaNPC() { + super(0, null); + this.type = null; + } + + /** + * Constructs a new {@code MageArenaNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public MageArenaNPC(int id, Location location) { + super(id, location); + this.setWalks(true); + this.type = GodType.forId(id); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MageArenaNPC(id, location); + } + + @Override + public void init() { + super.init(); + CombatSpell spell = (CombatSpell) SpellBook.MODERN.getSpell(41 + type.ordinal()); + getProperties().setSpell(spell); + getProperties().setAutocastSpell(spell); + getProperties().getCombatPulse().setStyle(CombatStyle.MAGIC); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (getProperties().getCombatPulse().isAttacking() && RandomFunction.random(20) < 6) { + sendChat(getWrathMessage()); + } else if (getProperties().getCombatPulse().isInCombat() && RandomFunction.random(60) < 10) { + sendChat(getHailMessage()); + } + } + + @Override + public boolean canSelectTarget(Entity target) { + if (target instanceof Player) { + Player p = (Player) target; + if (type.isFriendly(p)) { + return false; + } + if (p.getZoneMonitor().isInZone("mage arena")) { + if (MageArenaPlugin.MAGE_ARENA.hasSession(p)) { + return false; + } + } + } + return true; + } + + /** + * Gets the hail message. + * @return the message. + */ + public String getHailMessage() { + return "Hail " + type.getName() + "!"; + } + + /** + * Gets the wrath message. + * @return the message. + */ + public String getWrathMessage() { + return "Feel the wrath of " + type.getName() + "."; + } + + @Override + public int[] getIds() { + // sara, zammy, guthix + return new int[] { 913, 912, 914 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/magearena/MageArenaPlugin.java b/Server/src/main/java/Server/core/game/content/activity/magearena/MageArenaPlugin.java new file mode 100644 index 000000000..2da8c9454 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/magearena/MageArenaPlugin.java @@ -0,0 +1,209 @@ +package core.game.content.activity.magearena; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialogueAction; +import core.game.content.global.GodType; +import core.game.content.global.action.PickupHandler; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the mage arena activity. + * @author Vexia + */ +@Initializable +public final class MageArenaPlugin extends OptionHandler { + + /** + * The pool destinations. + */ + private static final Location[] POOL_DESTINATIONS = new Location[] { Location.create(2542, 4718, 0), Location.create(2509, 4689, 0) }; + + /** + * The mage arena zone. + */ + public static final MageArenaZone MAGE_ARENA = new MageArenaZone(); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(MAGE_ARENA); + PluginManager.definePlugin(new KolodionNPC()); + PluginManager.definePlugin(new MageArenaNPC()); + PluginManager.definePlugin(new LundailDialogue()); + PluginManager.definePlugin(new KolodionDialogue()); + PluginManager.definePlugin(new ChamberGuardianDialogue()); + ItemDefinition.forId(2412).getHandlers().put("option:drop", this); + ItemDefinition.forId(2413).getHandlers().put("option:drop", this); + ItemDefinition.forId(2414).getHandlers().put("option:drop", this); + ItemDefinition.forId(2412).getHandlers().put("option:take", this); + ItemDefinition.forId(2413).getHandlers().put("option:take", this); + ItemDefinition.forId(2414).getHandlers().put("option:take", this); + ObjectDefinition.forId(2873).getHandlers().put("option:pray at", this); + ObjectDefinition.forId(2874).getHandlers().put("option:pray at", this); + ObjectDefinition.forId(2875).getHandlers().put("option:pray at", this); + ObjectDefinition.forId(2878).getHandlers().put("option:step-into", this); + ObjectDefinition.forId(2879).getHandlers().put("option:step-into", this); + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + switch (node.getId()) { + case 2879: + case 2878: + final Location destination = POOL_DESTINATIONS[2879 - node.getId()]; + if (player.getSavedData().getActivityData().hasKilledKolodion()) { + player.getDialogueInterpreter().sendDialogue("You step into the pool of sparkling water. You feel energy rush", "through your veins."); + player.getDialogueInterpreter().addAction(new DialogueAction() { + @Override + public void handle(Player player, int buttonId) { + handlePool(player, true, destination, (GameObject) node); + } + }); + return true; + } + player.lock(1); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + handlePool(player, false, destination, (GameObject) node); + return true; + } + }); + break; + case 2873: + case 2874: + case 2875: + GodType.forObject(node.getId()).pray(player, (GameObject) node); + break; + case 2412: + case 2413: + case 2414: + GodType type = GodType.forCape(((Item) node)); + if (option.toLowerCase().equals("take")) { + GroundItem g = (GroundItem) node; + if (GodType.hasAny(player)) { + GroundItemManager.destroy(g); + player.sendMessages("You may only possess one sacred cape at a time.", "The conflicting powers of the capes drive them apart."); + } else { + PickupHandler.take(player, g); + } + return true; + } else { + if (type != null) { + player.sendMessage(type.getDropMessage()); + player.getInventory().remove(type.getCape()); + } + } + break; + } + return true; + } + + @Override + public boolean isWalk(Player player, Node node) { + if (node instanceof GroundItem) { + return true; + } + return !(node instanceof Item); + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Location getDestination(Node node, Node n) { + switch (n.getId()) { + case 2878: + int y = node.getLocation().getY(), + x = node.getLocation().getX(); + Location dest = Location.create(2544, 4720, 0); + Direction dir = Direction.WEST; + if (y <= 4718) { + dest = Location.create(2542, 4718, 0); + dir = Direction.NORTH; + } else if (y == 4722) { + dest = Location.create(2542, 4722, 0); + dir = Direction.SOUTH; + } else if (x <= 2541) { + dest = Location.create(2540, 4720, 0); + dir = Direction.EAST; + } + ((Player) node).setAttribute("mb-loc", dest); + ((Player) node).setAttribute("mb-dir", dir); + return dest; + case 2873: + case 2874: + case 2875: + return n.getLocation().transform(0, -2, 0); + } + return null; + } + + /** + * Handles the pool. + * @param player the player. + * @param enter if entered. + * @param dest the destination. + */ + public void handlePool(final Player player, boolean enter, final Location dest, final GameObject object) { + final Location start = player.getAttribute("mb-loc", player.getLocation()); + final Location end = player.getLocation().transform(player.getAttribute("mb-dir", Direction.NORTH), 1); + player.removeAttribute("mc-loc"); + player.removeAttribute("mb-dir"); + if (enter) { + final Location middle = object.getId() == 2879 ? Location.create(2509, 4687, 0) : Location.create(2542, 4720, 0); + player.lock(); + AgilityHandler.walk(player, -1, start, middle, new Animation(1426), 0.0, null); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 3: + player.getPacketDispatch().sendPositionedGraphic(68, 1, 0, middle); + break; + case 4: + player.unlock(); + player.getProperties().setTeleportLocation(dest); + return true; + } + return false; + } + + }); + return; + } + player.sendMessage("You step into the pool."); + AgilityHandler.walk(player, -1, start, end, new Animation(1426), 0.0, "Your boots get wet."); + GameWorld.getPulser().submit(new Pulse(1, player) { + + @Override + public boolean pulse() { + player.getAppearance().setDefaultAnimations(); + player.getAppearance().sync(); + player.getProperties().setTeleportLocation(start); + return true; + } + + }); + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/magearena/MageArenaZone.java b/Server/src/main/java/Server/core/game/content/activity/magearena/MageArenaZone.java new file mode 100644 index 000000000..beaba6928 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/magearena/MageArenaZone.java @@ -0,0 +1,137 @@ +package core.game.content.activity.magearena; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.plugin.Plugin; + +/** + * Handles the mage arena zone. + * @author Vexia + */ +public final class MageArenaZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code MageArenaZone} {@code Object}. + */ + public MageArenaZone() { + super("mage arena", true, ZoneRestriction.RANDOM_EVENTS); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public boolean enter(Entity e) { + return super.enter(e); + } + + @SuppressWarnings("deprecation") + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + final Player p = (Player) e; + if (!logout) { + GameWorld.getPulser().submit(new Pulse(1, e) { + @Override + public boolean pulse() { + if (!p.getZoneMonitor().isInZone("mage arena")) { + if (hasSession(p)) { + getSession(p).close(); + } + } + return true; + } + }); + return true; + } + if (hasSession(p)) { + getSession(p).close(); + } + if (logout && hasSession(p)) { + p.setLocation(Location.create(2540, 4717, 0)); + } + } + return super.leave(e, logout); + } + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (style != CombatStyle.MAGIC) { + return false; + } + if (target instanceof Player) { + final Player t = (Player) target; + if (hasSession(t) && !(e instanceof KolodionNPC)) { + return false; + } + } + return super.continueAttack(e, target, style, message); + } + + /** + * Gets the session. + * @param player the player. + * @return the session. + */ + public KolodionSession getSession(Player player) { + return KolodionSession.getSession(player); + } + + /** + * Checks if the player has a session. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasSession(final Player player) { + return KolodionSession.getSession(player) != null; + } + + @Override + public void configure() { + register(new ZoneBorders(3093, 3914, 3115, 3952));// the main + register(new ZoneBorders(3084, 3923, 3086, 3942)); + register(new ZoneBorders(3118, 3924, 3126, 3941)); + register(new ZoneBorders(3082, 3921, 3096, 3942)); + int x = 3089, y = 3914, x2 = 3089, y2 = 3949; + for (int i = 0; i < 7; i++) { + register(new ZoneBorders(x - i, y + i, x2 - i, y2 - i)); + } + register(new ZoneBorders(3119, 3942, 3123, 3945)); + register(new ZoneBorders(3115, 3944, 3119, 3949)); + register(new ZoneBorders(3119, 3942, 3119, 3952)); + register(new ZoneBorders(3120, 3940, 2125, 3945)); + register(new ZoneBorders(3114, 3944, 3120, 3949)); + register(new ZoneBorders(3114, 3942, 3117, 3952)); + x = 3118; + y = 3914; + x2 = 3118; + y2 = 3950; + for (int i = 0; i < 7; i++) { + register(new ZoneBorders(x + i, y + i, x2 + i, y2 - i)); + } + register(new ZoneBorders(3107, 3931, 3118, 3947)); + register(new ZoneBorders(3108, 3919, 3123, 3932)); + register(new ZoneBorders(3108, 3921, 3123, 3932)); + register(new ZoneBorders(3104, 3933, 3117, 3948)); + register(new ZoneBorders(3106, 3920, 3117, 3937)); + register(new ZoneBorders(3115, 3928, 3120, 3942)); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/AlchemyGuardianDialogue.java b/Server/src/main/java/Server/core/game/content/activity/mta/AlchemyGuardianDialogue.java new file mode 100644 index 000000000..bebb8897b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/AlchemyGuardianDialogue.java @@ -0,0 +1,122 @@ +package core.game.content.activity.mta; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the alchemy guardian dialogue. + * @author Vexia + */ +public class AlchemyGuardianDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code AlchemyGuardianDialogue} {@code Object} + */ + public AlchemyGuardianDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AlchemyGuardianDialogue} {@code Object} + * @param player the player. + */ + public AlchemyGuardianDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AlchemyGuardianDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hi."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("What do I have to do in this room?", "What are the rewards?", "Got any tips that may help me?", "Thanks, bye!"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What do I have to do in this room?"); + stage = 10; + break; + case 2: + player("What are the rewards?"); + stage = 20; + break; + case 3: + player("Got any tips that may help me?"); + stage = 30; + break; + case 4: + player("Thanks, bye!"); + stage = 40; + break; + } + break; + case 10: + npc("In this room you will see various cupboards. It is your", "task to search the cupboards to find items to turn into", "gold using your low or high alchemy spells. You must", "deposit the money in the receptacle at the end of the"); + stage++; + break; + case 11: + npc("hall in order to receive your Alchemist Pizazz Points,", "otherwise the money will be taken from you as you", "leave through the portal. This money is used for the", "upkeep of the training arena as well as magic shops all"); + stage++; + break; + case 12: + npc("around Keldagrim. Keep an eye on the cost of each", "items as these will change from time-to-time, as will the", "location of the items. Occasionally one of the items will", "be indicated as costing no runestones to convert to"); + stage++; + break; + case 13: + npc("money."); + stage = 0; + break; + case 20: + npc("You will get experience from casting the alchemist", "spells, as well as 1 Alchemist Pizazz Point for every 100", "coins you deposit, and 10% of the coins you deposit will", "be given to you as you leave. Keep in mind that you"); + stage++; + break; + case 21: + npc("will not be able to take more than 1000 coins back out", "with you."); + stage = 0; + break; + case 30: + npc("You must remember to keep ane eye on the various", "costs of the itmes. If you watch the movements of the", "other players, you might be able to guess which are the", "best places to visit. You will get 1 Pizazz Point for"); + stage++; + break; + case 31: + npc("every 100 coins, so if you have 190 coins, why not get", "an extra 10?"); + stage++; + break; + case 32: + player("I see."); + stage++; + break; + case 33: + npc("Oh, and a word of warning: should you decide to leave", "this room by a method other than the exit portals, you", "will be teleported to the entrance and have any items", "that you picked up in the room removed."); + stage = 0; + break; + case 34: + end(); + break; + case 40: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3099 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/AlchemySpell.java b/Server/src/main/java/Server/core/game/content/activity/mta/AlchemySpell.java new file mode 100644 index 000000000..98507bce2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/AlchemySpell.java @@ -0,0 +1,138 @@ +package core.game.content.activity.mta; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.zone.ZoneBorders; +import core.tools.Items; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +import core.game.content.activity.mta.impl.AlchemistZone; +import core.game.content.activity.mta.impl.AlchemistZone.AlchemistItem; + +/** + * Represents the plugin for the magic spell alchemy. + * @author Emperor + * @author 'Vexia + * @version 1.0 + */ +public final class AlchemySpell extends MagicSpell { + + /** + * If the spell is high alchemy. + */ + private boolean highAlchemy; + + /** + * Constructs a new {@code AlchemySpell} {@code Object}. + */ + public AlchemySpell() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AlchemySpell} {@code Object}. + * @param level The required level. + * @param anim the animation. + * @param graphic The graphic. + * @param highAlchemy If this spell is high alchemy. + * @param runes The runes required. + */ + public AlchemySpell(int level, final double experience, Animation anim, Graphics graphic, boolean highAlchemy, Item... runes) { + super(SpellBook.MODERN, level, experience, anim, graphic, null, runes); + this.highAlchemy = highAlchemy; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(13, new AlchemySpell(21, 31, Animation.create(712), new Graphics(112, 96), false, Runes.FIRE_RUNE.getItem(3), Runes.NATURE_RUNE.getItem(1))); + SpellBook.MODERN.register(34, new AlchemySpell(55, 65, Animation.create(713), new Graphics(113, 96), true, Runes.FIRE_RUNE.getItem(5), Runes.NATURE_RUNE.getItem(1))); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + Item item = (Item) target; + Player p = (Player) entity; + p.getInterfaceManager().setViewedTab(6); + if (p.getAntiMacroHandler().hasEvent()) { + p.getPacketDispatch().sendMessage("You can't do that right now."); + return false; + } + if (item == null || p.getInventory().get(item.getSlot()) != item) { + p.sendMessage("Error! Report to admin."); + return false; + } + if (item.getId() == 995 || item.getName().equals("Coins")) { + p.getPacketDispatch().sendMessage("You can't cast this spell on an object made of gold."); + return false; + } + if (!item.getDefinition().isTradeable()) { + p.getPacketDispatch().sendMessage("You can't cast this spell on an object like that."); + return false; + } + boolean alchZone = p.getZoneMonitor().isInZone("Alchemists' Playground"); + AlchemistItem alch = null; + if (alchZone) { + alch = AlchemistItem.forItem(item.getId()); + if (alch == null) { + p.getDialogueInterpreter().sendDialogue("You can only convert the items you find in the cupboards."); + return false; + } + } + Item coins = new Item(995, item.getDefinition().getAlchemyValue(highAlchemy)); + if (alchZone) { + coins = new Item(AlchemistZone.COINS.getId(), alch.getCost()); + if (p.getInventory().getAmount(AlchemistZone.COINS.getId()) + alch.getCost() > 10000) { + p.getDialogueInterpreter().sendDialogue("Warning: You can't deposit more than 12000 coins at a time."); + } + } + if (coins.getAmount() > 1 && !p.getInventory().hasSpaceFor(coins)) { + p.getPacketDispatch().sendMessage("Not enough space in your inventory!"); + return false; + } + boolean freeAlch = alchZone && alch == AlchemistZone.freeConvert; + boolean explorerRing = !highAlchemy && p.getSavedData().getGlobalData().getLowAlchemyCharges() > 0; + if (explorerRing && !checkLevelRequirement(p, true)) { + return false; + } + if (!alchZone || !freeAlch) { + if (!explorerRing && !meetsRequirements(p, true, true)) { + return false; + } + } + p.lock(3); + visualize(p, target); + if (p.getInventory().remove(new Item(item.getId(), 1))) { + if (explorerRing) { + p.getSavedData().getGlobalData().setLowAlchemyCharges(p.getSavedData().getGlobalData().getLowAlchemyCharges() - 1); + int charge = p.getSavedData().getGlobalData().getLowAlchemyCharges(); + p.sendMessages("You use a free cast due to the power of your explorer's ring.", "You have " + charge + " charge" + (charge == 1 ? "" : "s") + " left."); + } + p.getAudioManager().send(highAlchemy ? 97 : 98); + if (coins.getAmount() != 0) { + p.getInventory().add(coins); + } + + if ((item.getId() == Items.MAGIC_SHORTBOW_861 || item.getId() == Items.MAGIC_SHORTBOW_862) + && highAlchemy + && new ZoneBorders(2721,3493,2730,3487).insideBorder(p)) { + p.getAchievementDiaryManager().finishTask(p, DiaryType.SEERS_VILLAGE, 2, 6); + } + } else { + return false; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/BonesConvertingSpells.java b/Server/src/main/java/Server/core/game/content/activity/mta/BonesConvertingSpells.java new file mode 100644 index 000000000..0ac2c9c17 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/BonesConvertingSpells.java @@ -0,0 +1,129 @@ +package core.game.content.activity.mta; + +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +import core.game.content.activity.mta.impl.GraveyardZone; + +/** + * Represents the bones to banana spell. + * @author Emperor + * @author 'Vexia + * @version 1.0 + */ +public final class BonesConvertingSpells extends MagicSpell { + + /** + * The bone ids. + */ + private static final int[] BONES = new int[] { 526, 532, 6904, 6905, 6906, 6907 }; + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(141, 96); + + /** + * The animation. + */ + private static final Animation ANIMATION = new Animation(722); + + /** + * The item to replace the bones with. + */ + private Item converted; + + /** + * Constructs a new {@code BonesConvertingSpells} {@code Object}. + */ + public BonesConvertingSpells() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BonesConvertingSpells} {@code Object}. + * @param level The level required. + * @param converted The item to replace the bones with. + * @param anim The animation. + * @param graphic The graphic. + * @param runes The runes. + */ + public BonesConvertingSpells(int level, final double experience, Item converted, Animation anim, Graphics graphic, Item... runes) { + super(SpellBook.MODERN, level, experience, anim, graphic, null, runes); + this.converted = converted; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(9, new BonesConvertingSpells(15, 25, new Item(1963), ANIMATION, GRAPHIC, Runes.EARTH_RUNE.getItem(2), Runes.WATER_RUNE.getItem(2), Runes.NATURE_RUNE.getItem(1))); + SpellBook.MODERN.register(40, new BonesConvertingSpells(60, 65, new Item(6883), ANIMATION, GRAPHIC, Runes.EARTH_RUNE.getItem(4), Runes.WATER_RUNE.getItem(4), Runes.NATURE_RUNE.getItem(2))); + return this; + } + + @Override + public boolean meetsRequirements(Entity caster, boolean message, boolean remove) { + if (getSpellId() == 40 && !caster.asPlayer().getSavedData().getActivityData().isBonesToPeaches()) { + caster.asPlayer().sendMessage("You can only learn this spell from the Mage Training Arena."); + return false; + } + if (!hasBones(caster.asPlayer())) { + if (message) { + ((Player) caster).getPacketDispatch().sendMessage("You aren't holding any bones!"); + } + return false; + } + return super.meetsRequirements(caster, message, remove); + } + + @Override + public boolean cast(Entity entity, Node target) { + Player p = (Player) entity; + boolean inGrave = p.getZoneMonitor().isInZone("Creature Graveyard"); + if (p.getAttribute("cbs_tab", false) && inGrave && target.getId() >= 6904 && target.getId() <= 6907) { + p.sendMessage("This tablet cannot be used on bones from the Mage Training Arena."); + return false; + } + if (!p.getAttribute("cbs_tab", false) && !meetsRequirements(entity, true, true)) { + return false; + } + p.removeAttribute("cbs_tab"); + for (int id : BONES) { + if (p.getInventory().contains(id, 1)) { + int amount = p.getInventory().getAmount(id); + if (inGrave) { + amount *= (GraveyardZone.BoneType.forItem(new Item(id)).ordinal() + 1); + } + p.getInventory().remove(new Item(id, amount)); + p.getInventory().add(new Item(converted.getId(), amount)); + } + } + visualize(entity, target); + return true; + } + + /** + * Checks if the player has bones. + * @param player the player. + * @return {@code True} if so. + */ + private boolean hasBones(Player player) { + for (int id : BONES) { + if (player.getInventory().contains(id, 1)) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/CharmedWarriorDialogue.java b/Server/src/main/java/Server/core/game/content/activity/mta/CharmedWarriorDialogue.java new file mode 100644 index 000000000..4c6bc46cd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/CharmedWarriorDialogue.java @@ -0,0 +1,123 @@ +package core.game.content.activity.mta; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles the charmed warrior dialogue. + * @author Vexia + */ +public class CharmedWarriorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code CharmedWarriorDialogue} {@Code + * Object} + */ + public CharmedWarriorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code CharmedWarriorDialogue} {@Code + * Object} + * @param player the player. + */ + public CharmedWarriorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CharmedWarriorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + switch (npc.getId()) { + case 3105: + case 3104: + player("Is there anybody there?"); + break; + default: + player("Hello?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (npc.getId()) { + case 3107: + switch (stage) { + case 0: + npc("Can't you see I'm busy?"); + stage++; + break; + case 1: + player("Well, I can't really see YOU."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 3106: + switch (stage) { + case 0: + npc("Hey! You haven't paid for your Magic Training Arena", "Membership money!"); + stage++; + break; + case 1: + player("You're lying. I can see right through you!"); + stage++; + break; + case 2: + npc("Oh, HA HA, very funny."); + stage++; + break; + case 3: + end(); + break; + } + break; + case 3105: + switch (stage) { + case 0: + npc("Wooo wooo! Be afraid for I'm a scary ghost. Wooo!"); + stage++; + break; + case 1: + player("Er, whatever."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 3104: + switch (stage) { + case 0: + npc("What do you think?"); + stage++; + break; + case 1: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3106, 3107, 3104, 3105 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/EnchantSpell.kt b/Server/src/main/java/Server/core/game/content/activity/mta/EnchantSpell.kt new file mode 100644 index 000000000..be4c55a8d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/EnchantSpell.kt @@ -0,0 +1,233 @@ +package core.game.content.activity.mta + +import core.tools.Items +import core.game.node.Node +import core.game.node.entity.Entity +import core.game.node.entity.combat.equipment.SpellType +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.SpellBookManager.SpellBook +import core.game.node.entity.player.link.audio.Audio +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.plugin.Plugin +import core.game.content.activity.mta.impl.EnchantingZone +import core.game.content.activity.mta.impl.EnchantingZone.Shapes +import core.game.node.entity.skill.magic.MagicSpell +import core.game.node.entity.skill.magic.Runes + +/** + * Represents the enchant spells. + * @author Ceikry + */ +class EnchantSpell : MagicSpell { + /** + * The enchantable jewellery array. + */ + private val jewellery: HashMap? + + /** + * Constructs a new `EnchantSpell` `Object`. + */ + constructor() { + jewellery = null + } + + /** + * Constructs a new `EnchantSpell` `Object`. + * @param level The level required. + * @param jewellery The jewellery this spell is able to echant. + * @param runes The runes required. + */ + constructor(level: Int, experience: Double, jewellery: HashMap, runes: Array?) : super(SpellBook.MODERN, level, experience, ANIMATION, GRAPHIC, Audio(115, 1, 0), runes) { + this.jewellery = jewellery + } + + override fun cast(entity: Entity, target: Node): Boolean { + if (target !is Item || entity !is Player) { + return false + } + entity.interfaceManager.setViewedTab(6) + val enchanted = jewellery?.getOrDefault(target.id,null) + + if (enchanted == null) { + entity.packetDispatch.sendMessage("You can't use this spell on this item.") + return false + } + if (!meetsRequirements(entity, true, true)) { + return false + } + + if (entity.inventory.remove(target)) { + visualize(entity, target) + entity.inventory.add(enchanted) + } + + + //MTA-Specific Code + if (entity.zoneMonitor.isInZone("Enchantment Chamber")) { + entity.graphics(Graphics.create(237, 110)) + var pizazz = 0 + if (target.id == 6903) { + pizazz = (if (getSpellId() == 5) 1 else if (getSpellId() == 16) 2 else if (getSpellId() == 28) 3 else if (getSpellId() == 36) 4 else if (getSpellId() == 51) 5 else 6) * 2 + } else { + val shape = Shapes.forItem(target) + if (shape != null) { + var convert = entity.getAttribute("mta-convert", 0) + convert += 1 + if (convert >= 10) { + pizazz = if (getSpellId() == 5) 1 else if (getSpellId() == 16) 2 else if (getSpellId() == 28) 3 else if (getSpellId() == 36) 4 else if (getSpellId() == 51) 5 else 6 + convert = 0 + } + entity.setAttribute("mta-convert", convert) + if (shape == EnchantingZone.BONUS_SHAPE) { + pizazz += 1 + entity.sendMessage("You get " + pizazz + " bonus point" + (if (pizazz != 1) "s" else "") + "!") + } + } + } + if (pizazz != 0) { + EnchantingZone.ZONE.incrementPoints(entity, MTAType.ENCHANTERS.ordinal, pizazz) + } + } + return true + } + + override fun getDelay(): Int { + return 1 + } + + override fun getExperience(player: Player): Double { + return if (player.zoneMonitor.isInZone("Enchantment Chamber")) { + experience - experience * 0.75 + } else experience + } + + override fun newInstance(arg: SpellType?): Plugin? { + /** + * Enchant Sapphire Jewelry (Lvl-1 Enchant) + */ + SpellBook.MODERN.register(5, EnchantSpell(7, 17.5, + hashMapOf( + //Begin Jewelry Enchantments + Items.SAPPHIRE_RING_1637 to Item(Items.RING_OF_RECOIL_2550), + Items.SAPPHIRE_NECKLACE_1656 to Item(Items.GAMES_NECKLACE8_3853), + Items.SAPPHIRE_AMULET_1694 to Item(Items.AMULET_OF_MAGIC_1727), + Items.SAPPHIRE_BRACELET_11072 to Item(Items.BRACELET_OF_CLAY_11074), + //Begin MTA-specific enchantments + Items.CUBE_6899 to Item(Items.ORB_6902), + Items.CYLINDER_6898 to Item(Items.ORB_6902), + Items.ICOSAHEDRON_6900 to Item(Items.ORB_6902), + Items.PENTAMID_6901 to Item(Items.ORB_6902), + Items.DRAGONSTONE_6903 to Item(Items.ORB_6902) + ), + arrayOf(Item(Items.COSMIC_RUNE_564,1), Item(Items.WATER_RUNE_555,1)))) + + /** + * Enchant Emerald Jewelry (Lvl-2 Enchant) + */ + SpellBook.MODERN.register(16, EnchantSpell(27, 37.0, + hashMapOf( + //Begin Jewelry Enchantments + Items.EMERALD_RING_1639 to Item(Items.RING_OF_DUELLING8_2552), + Items.EMERALD_NECKLACE_1658 to Item(Items.BINDING_NECKLACE_5521), + Items.EMERALD_AMULET_1696 to Item(Items.AMULET_OF_DEFENCE_1729), + Items.EMERALD_BRACELET_11076 to Item(Items.CASTLEWAR_BRACE3_11080), + //Begin MTA-Specific Enchantments + Items.CUBE_6899 to Item(Items.ORB_6902), + Items.CYLINDER_6898 to Item(Items.ORB_6902), + Items.ICOSAHEDRON_6900 to Item(Items.ORB_6902), + Items.PENTAMID_6901 to Item(Items.ORB_6902), + Items.DRAGONSTONE_6903 to Item(Items.ORB_6902) + ), + arrayOf(Item(Runes.COSMIC_RUNE.id, 1), Item(Runes.AIR_RUNE.id, 3)))) + + /** + * Enchant Ruby Jewelry (Lvl-3 Enchant) + */ + SpellBook.MODERN.register(28, EnchantSpell(49, 59.0, + hashMapOf( + //Begin Jewelry Enchantments + Items.RUBY_RING_1641 to Item(Items.RING_OF_FORGING_2568), + Items.RUBY_NECKLACE_1660 to Item(Items.DIGSITE_PENDANT_5_11194), + Items.RUBY_AMULET_1698 to Item(Items.AMULET_OF_STRENGTH_1725), + Items.RUBY_BRACELET_11085 to Item(Items.INOCULATION_BRACE_11088), + //Begin MTA-Specific Enchantments + Items.CUBE_6899 to Item(Items.ORB_6902), + Items.CYLINDER_6898 to Item(Items.ORB_6902), + Items.ICOSAHEDRON_6900 to Item(Items.ORB_6902), + Items.PENTAMID_6901 to Item(Items.ORB_6902), + Items.DRAGONSTONE_6903 to Item(Items.ORB_6902) + ), + arrayOf(Item(Runes.COSMIC_RUNE.id, 1), Item(Runes.FIRE_RUNE.id, 5)))) + + /** + * Enchant Diamond Jewelry (Lvl-4 Enchant) + */ + SpellBook.MODERN.register(36, EnchantSpell(57, 67.0, + hashMapOf( + Items.DIAMOND_RING_1643 to Item(Items.RING_OF_LIFE_2570), + Items.DIAMOND_NECKLACE_1662 to Item(Items.PHOENIX_NECKLACE_11090), + Items.DIAMOND_AMULET_1700 to Item(Items.AMULET_OF_POWER_1731), + Items.DIAMOND_BRACELET_11092 to Item(Items.FORINTHRY_BRACE5_11096), + //Begin MTA-Specific Enchantments + Items.CUBE_6899 to Item(Items.ORB_6902), + Items.CYLINDER_6898 to Item(Items.ORB_6902), + Items.ICOSAHEDRON_6900 to Item(Items.ORB_6902), + Items.PENTAMID_6901 to Item(Items.ORB_6902), + Items.DRAGONSTONE_6903 to Item(Items.ORB_6902) + ), + arrayOf(Item(Runes.COSMIC_RUNE.id, 1), Item(Runes.EARTH_RUNE.id, 10)))) + + /** + * Enchant Dragonstone Jewelry (Lvl-5 Enchant) + */ + SpellBook.MODERN.register(51, EnchantSpell(68, 78.0, + hashMapOf( + //Begin Jewelry Enchantment + Items.DRAGONSTONE_RING_1645 to Item(14646), + Items.DRAGON_NECKLACE_1664 to Item(Items.SKILLS_NECKLACE4_11105), + Items.DRAGONSTONE_AMMY_1702 to Item(Items.AMULET_OF_GLORY4_1712), + Items.DRAGON_BRACELET_11115 to Item(Items.COMBAT_BRACELET4_11118), + //Begin MTA-Specific Enchantments + Items.CUBE_6899 to Item(Items.ORB_6902), + Items.CYLINDER_6898 to Item(Items.ORB_6902), + Items.ICOSAHEDRON_6900 to Item(Items.ORB_6902), + Items.PENTAMID_6901 to Item(Items.ORB_6902), + Items.DRAGONSTONE_6903 to Item(Items.ORB_6902) + ), + arrayOf(Item(Runes.COSMIC_RUNE.id, 1), Item(Runes.WATER_RUNE.id, 15), Item(Runes.EARTH_RUNE.id, 15)))) + + /** + * Enchant Onyx Jewelry (Lvl-6 Enchant) + */ + SpellBook.MODERN.register(61, EnchantSpell(87, 97.0, + hashMapOf( + //Begin Jewelry Enchantments + Items.ONYX_RING_6575 to Item(Items.RING_OF_STONE_6583), + Items.ONYX_NECKLACE_6577 to Item(Items.BERSERKER_NECKLACE_11128), + Items.ONYX_AMULET_6581 to Item(Items.AMULET_OF_FURY_6585), + Items.ONYX_BRACELET_11130 to Item(Items.REGEN_BRACELET_11133), + //Begin MTA-Specific Enchantments + Items.CUBE_6899 to Item(Items.ORB_6902), + Items.CYLINDER_6898 to Item(Items.ORB_6902), + Items.ICOSAHEDRON_6900 to Item(Items.ORB_6902), + Items.PENTAMID_6901 to Item(Items.ORB_6902), + Items.DRAGONSTONE_6903 to Item(Items.ORB_6902) + ), + arrayOf(Item(Runes.COSMIC_RUNE.id, 1), Item(Runes.FIRE_RUNE.id, 20), Item(Runes.EARTH_RUNE.id, 20)))) + return this + } + + companion object { + /** + * The animation. + */ + private val ANIMATION = Animation.create(712) + + /** + * The graphic. + */ + private val GRAPHIC = Graphics(114, 96) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/EnchantmentGuardianDialogue.java b/Server/src/main/java/Server/core/game/content/activity/mta/EnchantmentGuardianDialogue.java new file mode 100644 index 000000000..db065b958 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/EnchantmentGuardianDialogue.java @@ -0,0 +1,120 @@ +package core.game.content.activity.mta; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the enchantment guardian dialogue. + * @author Vexia + */ +public class EnchantmentGuardianDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code EnchantmentGuardianDialogue} {@Code + * Object} + */ + public EnchantmentGuardianDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code EnchantmentGuardianDialogue} {@Code + * Object} + * @param player the player. + */ + public EnchantmentGuardianDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EnchantmentGuardianDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc("Greetings young one. How can I enlighten you?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("What do I have to do in this room?", "What are the rewards?", "Got any tips that may help me?", "Thanks, bye!"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What do I have to do in this room?"); + stage = 10; + break; + case 2: + player("What are the rewards?"); + stage = 20; + break; + case 3: + player("Got any tips that may help me?"); + stage = 30; + break; + case 4: + player("Thanks, bye!"); + stage = 40; + break; + } + break; + case 10: + npc("In this chamber you will see various piles of shapes. You", "can pick up these shapes and enchant them using the", "enchant jewelry spells. By enchanting these shapes,", "you'll be converting them into orbs which you can be"); + stage++; + break; + case 11: + npc("placed in the hole in the centre. You will get", "Enchantment Pizazz Points for every ten shapes that", "you convert and the points you get depends on the", "level of enchantment spell you cast. You will get a"); + stage++; + break; + case 12: + npc("bonus Pizazz Point for enchanting a certain shape at a", "certain time, which I will periodically shout out. You will", "also be rewarded with an item for every so many orbs", "you deposit into the hole."); + stage = 0; + break; + case 20: + npc("As well as the magic experience from casting your", "enchantment spells, you will get Enchantment Pizazz", "Points for converting so many shapes, plus a bonus", "point for converting shape of the correct type. You"); + stage++; + break; + case 21: + npc("should also note that you will occasionally be rewarded", "with items when you put one of the enchanted orbs in", "the floor."); + stage = 0; + break; + case 30: + npc("Try to guess or keep track of the time between the", "change of the best shape to enchant. This means you", "can be ready to run to a different shape when you", "know it is about to change. Look out for the dragon"); + stage++; + break; + case 31: + npc("gems, as these will get you more Pizazz Points!"); + stage++; + break; + case 32: + player("I see."); + stage++; + break; + case 33: + npc("Oh, and a word of warning: should you decide to leave", "this room by a method other than the exit portals, you", "will be teleported to the entrance and have any items", "that you picked up in the room removed."); + stage = 0; + break; + case 34: + end(); + break; + case 40: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3100 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/EntranceGuardianDialogue.java b/Server/src/main/java/Server/core/game/content/activity/mta/EntranceGuardianDialogue.java new file mode 100644 index 000000000..b8421e8d9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/EntranceGuardianDialogue.java @@ -0,0 +1,320 @@ +package core.game.content.activity.mta; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; + +/** + * Handles the entrance guardian dialogue. + * @author Vexia + */ +public class EntranceGuardianDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code EntranceGuardianDialogue} {@Code + * Object} + */ + public EntranceGuardianDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code EntranceGuardianDialogue} {@Code + * Object} + * @param player the player. + */ + public EntranceGuardianDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EntranceGuardianDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hi."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Greetings. What wisdom do you seek?"); + stage++; + if (player.getSavedData().getActivityData().isStartedMta()) { + stage = 30; + } + break; + case 1: + options("I'm new to this place. Where am I?", "None, I don't really care."); + stage++; + break; + case 2: + if (buttonId == 1) { + player("I'm new to this place. Where am I?"); + stage++; + break; + } + end(); + break; + case 3: + npc("Well young one, you have entered the Magic Training", "Arena. It was built at the start of the Fifth Age, when", "runestones were first discovered. It was made because", "of the many pointless accidents caused by inexperienced"); + stage++; + break; + case 4: + npc("mages."); + stage++; + break; + case 5: + player("Who created it?"); + stage++; + break; + case 6: + npc("Good question. It was originally made by the ancestors", "of the wizards in the Wizards Tower. However, it was", "destroyed by melee and ranged warriors who took", "offence at the use of this new 'Magic Art'. Recently"); + stage++; + break; + case 7: + npc("the current denizens of the Wizards Tower have", "resurrected the arena including various Guardians you", "will see as you look around. We are here to help and to", "ensure things run smoothly."); + stage++; + break; + case 8: + player("Interesting. So what can I do here?"); + stage++; + break; + case 9: + npc("You may train up your skills in the magic arts by", "travelling through one of the portals at the back of this", "entrance hall. By training up in one of these areas you", "will be awarded special Pizazz Points unique to each."); + stage++; + break; + case 10: + npc("room. With these points you may claim a variety of", "items from my fellow guardian up the stairs."); + stage++; + break; + case 11: + player("How do you record the points I have earned?"); + stage++; + break; + case 12: + if (player.getSavedData().getActivityData().isStartedMta()) { + npc("With the Pizazz Progress Hat I gave you, of course."); + stage = 40; + break; + } + npc("You really are full of questions! You will need a special", "Pizzaz Progress Hat! I can give you one if you so", "wish to train here."); + stage++; + break; + case 13: + player("Yes Please!"); + stage++; + break; + case 14: + player.getSavedData().getActivityData().setStartedMta(true); + player.getInventory().add(MageTrainingArenaPlugin.PROGRESS_HAT, player); + npc("Here you go. Talk to the hat to find out your current", "Pizzaz Points totals."); + stage++; + break; + case 15: + player("Talk to it?"); + stage++; + break; + case 16: + npc("Well of course, it's a magic Pizazz Progress Hat! Mind", "your manners though, hats have feelings too!"); + stage++; + break; + case 17: + player("Er... if you insist."); + stage++; + break; + case 18: + npc("Oh, and a word of warning: should you decide to leave", "the rooms by any method other than the exit portals,", "you will be teleported to the entrance and have any", "items that you picked up in the room removed."); + stage++; + break; + case 19: + player("Okay. Thanks!"); + stage++; + break; + case 20: + end(); + break; + case 30: + options("Can you tell me about this place again?", "Can you explain the different portals?", "About the progress hat...", "Thanks, bye!"); + stage++; + break; + case 31: + switch (buttonId) { + case 1: + player("Can you tell me about this place again?"); + stage = 3; + break; + case 2: + player("Can you explain the different portals?"); + stage = 50; + break; + case 3: + player("About the progress hat..."); + stage = 100; + break; + case 4: + end(); + break; + } + break; + case 100: + if (!player.hasItem(MageTrainingArenaPlugin.PROGRESS_HAT)) { + npc("You want another one don't you."); + stage = 110; + break; + } + npc("Which you have stored somewhere I'm sure."); + stage++; + break; + case 101: + player("Yes. What's it for?"); + stage++; + break; + case 102: + npc("Collect Pizazz Points from the various areas and the", "hat will remember your totals. Talk to the hat at any", "time to find out what points you have. Go upstairs and", "talk to the Rewards Guardian to claim items for the"); + stage++; + break; + case 103: + npc("points."); + stage = 30; + break; + case 110: + player("Sorry, can I?"); + stage++; + break; + case 111: + player.getInventory().add(MageTrainingArenaPlugin.PROGRESS_HAT, player); + npc("Here you go. Talk to the hat to find out your current", "Pizazz Point totals."); + stage = 30; + break; + case 40: + player("OK."); + stage++; + break; + case 41: + npc("Oh, and a word of warning: should you decide to log", "out whilst in any of the rooms in the arena, you will be", "teleported to the entrance and have any items that you", "picked up in the room removed."); + stage = 30; + break; + case 50: + npc("They lead to four areas to train your magic: The", "Telekinetic Theatre, The Alchemists' Playground, The", "Enchanting Chamber, and The Creature Graveyard."); + stage++; + break; + case 51: + options("What's the Telekinetic Theatre?", "What's the Alchemists' Playground?", "What's the Enchanting CHamber?", "What's the Creature Gaveyard?", "Thanks, bye!"); + stage++; + break; + case 52: + switch (buttonId) { + case 1: + player("What's the Telekinetic Theatre?"); + stage = 60; + break; + case 2: + player("What's the Alchemists' Playground?"); + stage = 70; + break; + case 3: + player("What's the Enchanting Chamber?"); + stage = 80; + break; + case 4: + player("What's the Creature Gaveyard?"); + stage = 90; + break; + case 5: + end(); + break; + } + break; + case 60: + npc("In there you can earn Telekinetic Pizazz Points for", "trde upstairs."); + stage++; + break; + case 61: + player("What will I be doing in there?"); + stage++; + break; + case 62: + npc("That depends on how much of a time-waster you are!", "You are required to use the Telekinetic Grab spell in", "order to move a statue throuhh a maze. Casting the", "spell will move the statue towards you until it reaches a"); + stage++; + break; + case 63: + npc("wall. So by standing on the different sides of the maze", "you can move the statue Nort, East, South or West.", "You will be rewarded Pizazz Points for each maze", "successfully solved."); + stage = 51; + break; + case 70: + npc("In the playground you can earn Alchemist Pizazz", "Points for trading with the rewards guardian upstairs."); + stage++; + break; + case 71: + player("What's in there?"); + stage++; + break; + case 72: + npc("You'll find eight cupboards containing items you can", "turn to gold using the low and high alchemy spells. The", "money you earn will be taken from you upon leaving", "the playground to pay for the upkeep of this training"); + stage++; + break; + case 73: + npc("arena and to help fund magic shops around " + GameWorld.getSettings().getName() + ".", "You will be rewarded with 1 Pizazz Point for every", "100 coins deposited and a percentage of the money you", "create. Keep in mind that you will not be able to take"); + stage++; + break; + case 74: + npc("more than 1000 coins back out with you."); + stage++; + break; + case 75: + player("Sounds simple."); + stage = 51; + break; + case 80: + npc("In here you will be able to earn Enchantment Pizazz", "Points for trade upstairs."); + stage++; + break; + case 81: + player("What will I have to do?"); + stage++; + break; + case 82: + npc("You will find yourself amongst various piles of shapes.", "You can pick up these shapes and use on of your", "enchanting spells upon it to morph it into an orb. You'll", "also see a hole in the centre of the room; put the orbs"); + stage++; + break; + case 83: + npc("in here and for every 20 we will credit you with a gift,", "You will get Pizazz Points for every 10 shapes that", "you convert and the amount of points depends on the", "spell you use."); + stage = 51; + break; + case 90: + npc("In here you will be able to earn Graveyard Pizazz", "Points for trade upstairs."); + stage++; + break; + case 91: + player("But what do I have to do in there?"); + stage++; + break; + case 92: + npc("Patience young one. A great many creatures die in", "this world and much of their remainds can cause clutter.", "We have taken it upon ourselves to teleport many", "bones from these creatures into this graveyard for a"); + stage++; + break; + case 93: + npc("use. It's up to you to practice your bones to bannanas", "spell in order to put these bones into immediate use -", "nutritious food for monsters! Just convert the bones", "and put them in the holes in the walls. There is a"); + stage++; + break; + case 94: + npc("drawback to this room however, the bones often fall on", "people so you may want to eat some of those bannas", "to stay alive. When people die we confiscate Pizazz", "Points for the effort of teleporting incompetent mages."); + stage = 51; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3097 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/GraveyardGuardianDialogue.java b/Server/src/main/java/Server/core/game/content/activity/mta/GraveyardGuardianDialogue.java new file mode 100644 index 000000000..384b5d7a4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/GraveyardGuardianDialogue.java @@ -0,0 +1,120 @@ +package core.game.content.activity.mta; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the graveyard guardian dialogue. + * @author Vexia + */ +public class GraveyardGuardianDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code GraveyardGuardianDialogue} {@Code + * Object} + */ + public GraveyardGuardianDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code GraveyardGuardianDialogue} {@Code + * Object} + * @param player the player. + */ + public GraveyardGuardianDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GraveyardGuardianDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hello."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("What do I have to do in this room?", "What are the rewards?", "Got any tips that may help me?", "Thanks, bye!"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What do I have to do in this room?"); + stage = 10; + break; + case 2: + player("What are the rewards?"); + stage = 20; + break; + case 3: + player("Got any tips that may help me?"); + stage = 30; + break; + case 4: + player("Thanks, bye!"); + stage = 40; + break; + } + break; + case 10: + npc("Have you noticed all the bones around the room? These", "are teleported here from all over Keldagrim to help", "clean up the landscape of countless bones left behind", "from combat. What better use for these bones than to"); + stage++; + break; + case 11: + npc("convert them to nutritious fruit to be eaten by you", "mortals? You have to use your Bones to Bannas spell", "to convert the bones and then place them in the holes", "on the walls to earn Graveyard Pizazz Points."); + stage++; + break; + case 12: + npc("Unluckily for you, your health will constantly decrease", "from getting hit by these dropping bones so you will", "probably want to eat some of the bananas yourself to", "increase your stay here."); + stage = 0; + break; + case 20: + npc("You will get experience from casting your bones to", "bananas spell and you will get Graveyard Pizazz Points", "when you put the bananas though the wall.", "Occasionally you will also be credited with a runestone"); + stage++; + break; + case 21: + npc("to help you in your future spell casting."); + stage = 0; + break; + case 30: + npc("Different bones will provide you with different numbers", "of bananas, so try to find the best type. Collect enough", "points and you will be able to buy a 'Bones to Peaches'", "spell from my fellow guardian above the entrance hall."); + stage++; + break; + case 31: + npc("This spell can be used here just like the bones to", "bananas spell, except this spell will give you even more", "experience and the peaches will restore more health!"); + stage++; + break; + case 32: + player("I see."); + stage++; + break; + case 33: + npc("Oh, and a word of warning: should you decide to leave", "this room by a method other than the exit portals, you", "will be teleported to the entrance and have any items", "that you picked up in the room removed."); + stage = 0; + break; + case 34: + end(); + break; + case 40: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3101 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/MTAShop.java b/Server/src/main/java/Server/core/game/content/activity/mta/MTAShop.java new file mode 100644 index 000000000..2851507ca --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/MTAShop.java @@ -0,0 +1,253 @@ +package core.game.content.activity.mta; + +import java.util.ArrayList; +import java.util.List; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.component.ComponentPlugin; +import core.game.container.Container; +import core.game.container.ContainerType; +import core.game.container.access.InterfaceContainer; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Plugin; + +/** + * Represents the mage training arena shop. + * @author Vexia + */ +public class MTAShop { + + /** + * The magic training arena shop items. + */ + private static final Item[] ITEMS = new Item[] { new Item(6908, 100), new Item(6910, 100), new Item(6912, 100), new Item(6914, 100), new Item(6916, 100), new Item(6918, 100), new Item(6920, 100), new Item(6922, 100), new Item(6924, 100), new Item(6889, 100), new Item(6926, 100), new Item(4695, 100), new Item(4696, 100), new Item(4697, 100), new Item(4698, 100), new Item(4694, 100), new Item(4699, 100), new Item(564, 100), new Item(562, 100), new Item(561, 100), new Item(560, 100), new Item(563, 100), new Item(566, 100), new Item(565, 100) }; + + /** + * The prices. + */ + private static final int[][] PRICES = new int[][] { { 30, 30, 300, 30 }, { 60, 60, 600, 60 }, { 150, 200, 1500, 150 }, { 240, 240, 2400, 240 }, { 400, 450, 4000, 400 }, { 350, 400, 3000, 350 }, { 120, 120, 1200, 120 }, { 175, 225, 1500, 175 }, { 450, 500, 5000, 450 }, { 500, 550, 6000, 500 }, { 200, 300, 2000, 200 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 1, 1, 15, 1 }, { 0, 0, 5, 0 }, { 0, 1, 5, 1 }, { 0, 1, 0, 1 }, { 2, 1, 20, 1 }, { 2, 0, 0, 0 }, { 2, 2, 25, 2 }, { 2, 2, 25, 2 } }; + + /** + * The container. + */ + private final Container container = new Container(ITEMS.length, ContainerType.SHOP); + + /** + * The mage training arena shop plugin. + */ + private final MTAShopPlugin shopPlugin = new MTAShopPlugin(); + + /** + * The viewers. + */ + private final List viewers = new ArrayList<>(); + + /** + * The shop component. + */ + private final Component component = new Component(197).setCloseEvent(new CloseEvent() { + + @Override + public boolean close(Player player, Component c) { + if (player == null) { + return true; + } + viewers.remove(player); + return true; + } + + }); + + /** + * Constructs a new {@Code MTAShop} {@Code Object} + */ + public MTAShop() { + container.add(ITEMS); + component.setPlugin(shopPlugin); + GameWorld.getPulser().submit(new Pulse(100) { + @Override + public boolean pulse() { + for (int i = 0; i < container.toArray().length; i++) { + final boolean main = true; + final Item item = container.toArray()[i]; + if (item == null) { + continue; + } + if (main) { + if (item.getAmount() < 100) { + item.setAmount(item.getAmount() + 1); + } + MTAShop.this.update(); + } + } + return false; + } + }); + } + + /** + * Opens the shop. + * @param player the player. + */ + public void open(final Player player) { + viewers.add(player); + player.getInterfaceManager().open(component); + update(); + updatePoints(player); + GameWorld.getPulser().submit(new Pulse(1, player) { + + @Override + public boolean pulse() { + updatePoints(player); + return true; + } + + }); + } + + /** + * Updates the viewers. + */ + private void update() { + for (Player p : viewers) { + if (p == null || !p.isActive()) { + continue; + } + InterfaceContainer.generateItems(p, container.toArray(), new String[] { "Buy", "Value" }, 197, 16, 4, 7); + } + } + + /** + * The item to purchase. + * @param player the player. + * @param item the item. + */ + public void buy(Player player, Item item, int slot) { + int[] prices = PRICES[slot]; + if (item.getAmount() < 1) { + player.sendMessage("The shop has ran out of stock."); + return; + } + item = new Item(item.getId(), 1); + if (!player.getInventory().hasSpaceFor(item)) { + player.sendMessage("You don't have enough inventory space."); + return; + } + for (int i = 0; i < prices.length; i++) { + if (getPoints(player, i) < prices[i]) { + player.sendMessage("You cannot afford that item."); + return; + } + } + if (item.getId() == 6926 && player.getSavedData().getActivityData().isBonesToPeaches()) { + player.sendMessage("You already unlocked that spell."); + return; + } + if (slot >= 1 && slot <= 3) { + Item required = ITEMS[slot - 1]; + if (!player.hasItem(new Item(required.getId(), 1)) && !player.hasItem(new Item(6914, 1))) { + player.sendMessage("You don't have the required wand in order to buy this upgrade."); + return; + } + } + if (container.getAmount(item) - 1 <= 0) { + container.get(slot).setAmount(0); + } else { + container.remove(item); + } + if (item.getId() == 6926) { + player.getSavedData().getActivityData().setBonesToPeaches(true); + player.getDialogueInterpreter().sendDialogue("The guardian teaches you how to use the Bones to Peaches spell!"); + } else { + player.getInventory().add(item); + } + for (int i = 0; i < prices.length; i++) { + decrementPoints(player, i, prices[i]); + } + updatePoints(player); + update(); + } + + /** + * Values an item. + * @param player the player. + * @param item the item. + */ + public void value(Player player, Item item, int slot) { + int[] prices = PRICES[slot]; + player.sendMessage("The " + item.getName() + " costs " + prices[0] + " Telekinetic, " + prices[1] + " Alchemist,"); + player.sendMessage(prices[2] + " Enchantment and " + prices[3] + " Graveyard Pizazz Points."); + } + + /** + * Updates the points. + * @param player the player. + */ + public void updatePoints(Player player) { + player.getPacketDispatch().sendString("" + getPoints(player, 0), 197, 8);// tele + player.getPacketDispatch().sendString("" + getPoints(player, 2), 197, 9);// enchant + player.getPacketDispatch().sendString("" + getPoints(player, 1), 197, 10);// alch + player.getPacketDispatch().sendString("" + getPoints(player, 3), 197, 11);// grave + } + + /** + * Increments the pizazz points. + * @param player the player. + * @param index the index. + * @param increment the increment. + */ + public void incrementPoints(Player player, int index, int increment) { + player.getSavedData().getActivityData().incrementPizazz(index, increment); + } + + /** + * Decrements the pizazz points. + * @param player the player. + * @param index the index. + * @param decrement the decrement. + */ + public void decrementPoints(Player player, int index, int decrement) { + player.getSavedData().getActivityData().decrementPizazz(index, decrement); + } + + /** + * Gets the points. + * @param player the player. + * @param index the index. + * @return the points. + */ + public int getPoints(Player player, int index) { + return player.getSavedData().getActivityData().getPizazzPoints(index); + } + + /** + * The mta shop plugin. + * @author Vexia + */ + public class MTAShopPlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return null; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + Item item = container.get(slot); + if (item == null) { + return true; + } + if (opcode == 230) { + value(player, item, slot); + } else { + buy(player, item, slot); + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/MTAType.java b/Server/src/main/java/Server/core/game/content/activity/mta/MTAType.java new file mode 100644 index 000000000..b0c716faf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/MTAType.java @@ -0,0 +1,212 @@ +package core.game.content.activity.mta; + +import core.game.component.Component; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; + +import core.game.content.activity.mta.impl.AlchemistZone; +import core.game.content.activity.mta.impl.EnchantingZone; +import core.game.content.activity.mta.impl.GraveyardZone; +import core.game.content.activity.mta.impl.TelekineticZone; + +/** + * A magic training arena game type. + * @author Vexia + */ +public enum MTAType { + TELEKINETIC(10778, new Component(198), null, Location.create(3363, 3316, 0), new TelekineticZone()) { + @Override + public boolean hasRequirement(Player player) { + if (!player.getSkills().hasLevel(Skills.MAGIC, 33)) { + player.getDialogueInterpreter().sendDialogue("You need to be able to cast the Telekinetic Grab spell in order to", "enter."); + return false; + } + return true; + } + }, + ALCHEMISTS(10780, new Component(194), new Location(3366, 9623, 2), new Location(3363, 3320, 0), AlchemistZone.ZONE) { + @Override + public boolean hasRequirement(Player player) { + if (!player.getSkills().hasLevel(Skills.MAGIC, 21)) { + player.getDialogueInterpreter().sendDialogue("You need to be able to cast the Telekinetic Grab spell in order to", "enter."); + return false; + } + if (player.getInventory().contains(995, 1)) { + player.getDialogueInterpreter().sendDialogue("You cannot take money into the Alchemists' Playground."); + return false; + } + return true; + } + + @Override + public void exit(Player player) { + int earn = player.getAttribute("alch-earn", 0); + if (earn != 0) { + Item coins = new Item(995, earn); + if (player.getBank().hasSpaceFor(coins)) { + player.getBank().add(coins); + } + player.getDialogueInterpreter().sendDialogue("You've been awarded " + earn + " coins straight into your bank as a reward!"); + } + super.exit(player); + } + }, + ENCHANTERS(10779, new Component(195), new Location(3363, 9649, 0), new Location(3361, 3318, 0), EnchantingZone.ZONE) { + @Override + public boolean hasRequirement(Player player) { + if (!player.getSkills().hasLevel(Skills.MAGIC, 7)) { + player.getDialogueInterpreter().sendDialogue("You need to be able to cast the Lvl-1 Enchant spell in order to", "enter."); + return false; + } + return true; + } + }, + GRAVEYARD(10781, new Component(196), new Location(3363, 9639, 1), new Location(3365, 3318, 0), GraveyardZone.ZONE) { + @Override + public boolean hasRequirement(Player player) { + if (!player.getSkills().hasLevel(Skills.MAGIC, 15)) { + player.getDialogueInterpreter().sendDialogue("You need to be able to cast the Bones to Bananas spell in order to", "enter."); + return false; + } + if (player.getInventory().contains(1963, 1) || player.getInventory().contains(6883, 1)) { + player.getDialogueInterpreter().sendDialogue("You can't take bananas or peaches into the arena."); + return false; + } + return true; + } + }; + + /** + * The object id. + */ + private final int objectId; + + /** + * The overlay component. + */ + private final Component overlay; + + /** + * The start location. + */ + private final Location startLocation; + + /** + * The end location. + */ + private final Location endLocation; + + /** + * The mage training arena zone. + */ + private final MTAZone zone; + + /** + * Constructs a new {@Code MTAType} {@Code Object} + * @param objectId the object id. + * @param overlay the overlay. + * @param zone the zone. + */ + private MTAType(int objectId, Component overlay, Location startLocation, Location endLocation, MTAZone zone) { + this.objectId = objectId; + this.overlay = overlay; + this.zone = zone; + this.startLocation = startLocation; + this.endLocation = endLocation; + } + + /** + * Enters the mage training arena game. + * @param player the player. + */ + public void enter(Player player) { + if (!player.getSavedData().getActivityData().isStartedMta() || (!player.getInventory().containsItem(MageTrainingArenaPlugin.PROGRESS_HAT) && !player.getEquipment().containsItem(MageTrainingArenaPlugin.PROGRESS_HAT))) { + player.getDialogueInterpreter().sendDialogue("You need a Pizazz Progress Hat in order to enter. Talk to the", "Entrance Guardian if you don't have one."); + return; + } + if (!hasRequirement(player)) { + return; + } + if (this != TELEKINETIC) { + player.teleport(startLocation); + } else { + TelekineticZone.start(player); + } + player.sendMessage("You've entered the " + zone.getName() + "."); + } + + /** + * Exits the zone area. + * @param player the player. + */ + public void exit(Player player) { + player.teleport(endLocation); + } + + /** + * Checks if the player has the requirements. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasRequirement(Player player) { + return false; + } + + /** + * Gets the mta type for the zone. + * @param mtaZone the zone. + * @return the type. + */ + public static MTAType forZone(MTAZone mtaZone) { + for (MTAType type : values()) { + if (type == null) { + continue; + } + if (type.getZone() == mtaZone) { + return type; + } + } + return TELEKINETIC; + } + + /** + * Gets the mtat type. + * @param id the id. + * @return the mtat type. + */ + public static MTAType forId(int id) { + for (MTAType t : values()) { + if (t.getObjectId() == id) { + return t; + } + } + return null; + } + + /** + * Gets the objectId. + * @return the objectId + */ + public int getObjectId() { + return objectId; + } + + /** + * Gets the zone. + * @return the zone + */ + public MTAZone getZone() { + return zone; + } + + /** + * Gets the overlay. + * @return the overlay + */ + public Component getOverlay() { + return overlay; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/MTAZone.java b/Server/src/main/java/Server/core/game/content/activity/mta/MTAZone.java new file mode 100644 index 000000000..db6ab9ef9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/MTAZone.java @@ -0,0 +1,167 @@ +package core.game.content.activity.mta; + +import core.ServerConstants; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.RequestType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.map.zone.ZoneType; + +/** + * Represents a magic training arena zone. + * @author Vexia + */ +public class MTAZone extends MapZone { + + /** + * The items. + */ + private final Item[] items; + + /** + * The mage training arena type. + */ + private MTAType type; + + /** + * Constructs a new {@Code MTAZone} {@Code Object} + * @param name the name. + * @param items the items. + */ + public MTAZone(String name, Item[] items) { + super(name, false, ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.FOLLOWERS); + this.items = items; + this.setZoneType(ZoneType.SAFE.getId()); + } + + @Override + public boolean enter(Entity entity) { + if (entity instanceof Player) { + Player player = entity.asPlayer(); + if (player == null) { + return true; + } + if (type == null) { + type = MTAType.forZone(this); + } + if (type != null) { + player.getInterfaceManager().openOverlay(type.getOverlay()); + update(player); + } + player.getProperties().setSpawnLocation(new Location(3363, 3302, 0)); + } + return super.enter(entity); + } + + @Override + public boolean canRequest(RequestType type, Player player, Player target) { + player.getDialogueInterpreter().sendDialogue("You can't do that right now."); + return false; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + if (target.getId() == 10782) { + getType().exit(e.asPlayer()); + return true; + } + } + return super.interact(e, target, option); + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (e instanceof Player) { + if (type != -1) { + e.asPlayer().sendMessage("You can't teleport out of the training arena!"); + return false; + } + } + return super.teleport(e, type, node); + } + + @SuppressWarnings("deprecation") + @Override + public boolean leave(Entity entity, boolean logout) { + if (entity instanceof Player) { + Player player = entity.asPlayer(); + if (logout) { + player.setLocation(new Location(3363, 3302, 0)); + } else { + player.getProperties().setSpawnLocation(ServerConstants.HOME_LOCATION); + } + cleanItems(player); + player.getInterfaceManager().closeOverlay(); + } + return super.leave(entity, logout); + } + + @Override + public void configure() { + } + + /** + * Cleans the items. + */ + private void cleanItems(Player player) { + if (player == null) { + return; + } + for (Item item : items) { + if (item == null) { + continue; + } + if (player.getInventory().containsItem(item)) { + player.getInventory().remove(new Item(item.getId(), player.getInventory().getAmount(item))); + } + if (player.getEquipment().containsItem(item)) { + player.getEquipment().remove(new Item(item.getId(), player.getEquipment().getAmount(item))); + } + } + } + + /** + * Increments the pizazz points of a player. + * @param player the player. + * @param index the index. + * @param amount the amount. + */ + public void incrementPoints(Player player, int index, int amount) { + player.getSavedData().getActivityData().incrementPizazz(index, amount); + update(player); + } + + /** + * Updates the player. + * @param player the player. + */ + public void update(Player player) { + if (type == null) { + return; + } + player.getPacketDispatch().sendString("" + player.getSavedData().getActivityData().getPizazzPoints(type.ordinal()), type.getOverlay().getId(), 9); + } + + /** + * Gets the items. + * @return the items + */ + public Item[] getItems() { + return items; + } + + /** + * Gets the type. + * @return the type + */ + public MTAType getType() { + return type; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/MageTrainingArenaPlugin.java b/Server/src/main/java/Server/core/game/content/activity/mta/MageTrainingArenaPlugin.java new file mode 100644 index 000000000..262cd6000 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/MageTrainingArenaPlugin.java @@ -0,0 +1,126 @@ +package core.game.content.activity.mta; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.Item; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +import core.game.content.activity.mta.impl.TelekineticZone; + +/** + * Handles the mage training area interactions. + * @author Vexia + */ +@Initializable +public class MageTrainingArenaPlugin extends OptionHandler { + + /** + * The progress hat. + */ + public static final Item PROGRESS_HAT = new Item(6885); + + /** + * The mage training arena shop. + */ + public static final MTAShop SHOP = new MTAShop(); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(6885).getHandlers().put("option:destroy", this); + ItemDefinition.forId(6885).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(10721).getHandlers().put("option:enter", this); + NPCDefinition.forId(3103).getHandlers().put("option:trade-with", this); + for (MTAType type : MTAType.values()) { + if (type.getZone() != null) { + ZoneBuilder.configure(type.getZone()); + } + ObjectDefinition.forId(type.getObjectId()).getHandlers().put("option:enter", this); + } + ItemDefinition.forId(TelekineticZone.STATUE).getHandlers().put("option:observe", this); + ItemDefinition.forId(TelekineticZone.STATUE).getHandlers().put("option:reset", this); + NPCDefinition.forId(3102).getHandlers().put("option:talk-to", this); + PluginManager.definePlugins(new CharmedWarriorDialogue(), new EntranceGuardianDialogue(), new RewardsGuardianDialogue(), new ProgressHatDialogue(), new EnchantmentGuardianDialogue(), new EnchantSpell(), new BonesConvertingSpells(), new GraveyardGuardianDialogue(), new AlchemyGuardianDialogue(), new AlchemySpell(), new TelekineticGrabSpell(), new TelekineticGuardianDialogue(), new MazeGuardianDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 10721: + if (!player.getSkills().hasLevel(Skills.MAGIC, 7)) { + player.getDialogueInterpreter().sendDialogue("You need a Magic level of at least 7 to enter the guild."); + break; + } + AgilityHandler.walk(player, -1, player.getLocation(), player.getLocation().transform(Direction.getDirection(player.getLocation(), node.getLocation()), 2), new Animation(1426), 0.0, null); + break; + case 3103: + if (!player.getSavedData().getActivityData().isStartedMta()) { + player.getDialogueInterpreter().open(3103, this, true, true); + } else { + SHOP.open(player); + } + break; + case 6885: + player.getDialogueInterpreter().open(3096, option.equals("destroy") ? new Object[] { node, true, true } : new Object[] {}); + break; + case 3102: + player.getDialogueInterpreter().open(node.getId(), node); + break; + } + switch (option) { + case "enter": + MTAType type = MTAType.forId(node.getId()); + if (type != null) { + type.enter(player); + } + break; + case "reset": + case "observe": + TelekineticZone zone = TelekineticZone.getZone(player); + if (option.equals("reset")) { + zone.reset(player); + } else { + zone.observe(player); + } + break; + } + return true; + } + + @Override + public boolean isWalk(Player player, Node n) { + if (!(n instanceof GroundItem)) { + return true; + } + if (n.getId() == TelekineticZone.STATUE) { + return false; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n.getId() == 3102) { + return n.getLocation().transform(Direction.getDirection(node.getLocation(), n.getLocation()), -1); + } + return null; + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/MazeGuardianDialogue.java b/Server/src/main/java/Server/core/game/content/activity/mta/MazeGuardianDialogue.java new file mode 100644 index 000000000..cabdd1fd8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/MazeGuardianDialogue.java @@ -0,0 +1,92 @@ +package core.game.content.activity.mta; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +import core.game.content.activity.mta.impl.TelekineticZone; + +/** + * Handles the maze guardian dialogue. + * @author Vexia + */ +public class MazeGuardianDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MazeGuardianDialogue} {@code Object} + */ + public MazeGuardianDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MazeGuardianDialogue} {@code Object} + * @param player the player. + */ + public MazeGuardianDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MazeGuardianDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hi!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Well done on releasing me. Would you like to try", "another maze?"); + stage++; + break; + case 1: + options("Yes please!", "No thanks."); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + player("Yes please!"); + stage = 5; + break; + case 2: + player("No thanks."); + stage++; + break; + } + break; + case 3: + npc("Very well. Talk to me if you want to move onto the", "next maze, or you can return to the entrance hall", "through the portal."); + stage++; + break; + case 4: + end(); + break; + case 5: + npc("Very well, I shall teleport you."); + stage++; + break; + case 6: + npc.clear(); + TelekineticZone.getZone(player).setUp(); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3102 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/ProgressHatDialogue.java b/Server/src/main/java/Server/core/game/content/activity/mta/ProgressHatDialogue.java new file mode 100644 index 000000000..d3e731e2b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/ProgressHatDialogue.java @@ -0,0 +1,117 @@ +package core.game.content.activity.mta; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Handles the progress hat dialogue. + * @author Vexia + */ +public class ProgressHatDialogue extends DialoguePlugin { + + /** + * The progress hat. + */ + private Item progressHat; + + /** + * Constructs a new {@Code ProgressHatDialogue} {@Code Object} + */ + public ProgressHatDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code ProgressHatDialogue} {@Code Object} + * @param player the player. + */ + public ProgressHatDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ProgressHatDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length > 1) { + progressHat = (Item) args[0]; + npc("How dare you destroy me? You'll lose your Pizazz", "Points!"); + stage = 50; + return true; + } + player("Mr Progress Hat... sir?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Can't you see I'm busy?"); + stage++; + break; + case 1: + player("But you're just a hat? Can you tell me my Pizazz", "Point totals?"); + stage++; + break; + case 2: + npc("Ok, I suppose it's my job. You have:", getPoints(0) + " Telekinetic, " + getPoints(1) + " Alchemist,", getPoints(2) + " Enchantment, and " + getPoints(3) + " Graveyard Pizazz Points."); + stage++; + break; + case 3: + player("Thank you!"); + stage++; + break; + case 4: + end(); + break; + case 50: + interpreter.sendOptions("Destroy Hat?", "Yes", "No"); + stage++; + break; + case 51: + switch (buttonId) { + case 1: + if (progressHat == null) { + end(); + return true; + } + if (!player.getInventory().containsItem(progressHat)) { + end(); + return true; + } + player.getInventory().remove(progressHat); + interpreter.sendDialogue("The hat whispers as you destroy it. You can get another from the", "Entrance Guardian."); + stage = 4; + break; + case 2: + npc("I think so too!"); + stage = 4; + break; + } + break; + } + return true; + } + + /** + * Gets the pizzaz points. + * @param index the index. + * @return the points. + */ + public int getPoints(int index) { + return player.getSavedData().getActivityData().getPizazzPoints(index); + } + + @Override + public int[] getIds() { + return new int[] { 3096 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/RewardsGuardianDialogue.java b/Server/src/main/java/Server/core/game/content/activity/mta/RewardsGuardianDialogue.java new file mode 100644 index 000000000..830fcf3de --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/RewardsGuardianDialogue.java @@ -0,0 +1,136 @@ +package core.game.content.activity.mta; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the rewards guardian dialogue. + * @author Vexia + */ +public class RewardsGuardianDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code RewardsGuardianDialogue} {@Code + * Object} + */ + public RewardsGuardianDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code RewardsGuardianDialogue} {@Code + * Object} + * @param player the player. + */ + public RewardsGuardianDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RewardsGuardianDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length > 1) { + npc("Have you spoken to my fellow guardian downstairs?"); + stage = 4; + return true; + } + player("Hi."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (!player.getSavedData().getActivityData().isStartedMta()) { + switch (stage) { + case 0: + npc("Greetings. Have you spoken to my fellow Guardian", "downstairs?"); + stage++; + break; + case 1: + player("Nope."); + stage++; + break; + case 2: + npc("Well, you need to talk to him first."); + stage++; + break; + case 3: + end(); + break; + case 4: + player("Nope."); + stage++; + break; + case 5: + npc("Well, you need to talk to him first."); + stage++; + break; + case 6: + end(); + break; + } + return true; + } + switch (stage) { + case 0: + npc("Greetings. What wisdom do you seek?"); + stage++; + break; + case 1: + options("Who are you?", "Can I trade my Pizazz Points please?", "Thanks, bye!"); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("Can I trade my Pizazz Points please?"); + stage = 20; + break; + case 3: + end(); + break; + } + break; + case 10: + npc("Me? I'm here to grant you rewards for any of the", "Pizazz Points you may have earned in this training", "arena. Like my fellow Guardians, I am part of the", "arena and live to ensure its safe running."); + stage++; + break; + case 11: + player("I see."); + stage = 1; + break; + case 20: + npc("Why of course."); + stage++; + break; + case 21: + end(); + MageTrainingArenaPlugin.SHOP.open(player); + break; + case 30: + npc("Well, we do stock a special book that you may be", "interested in, which provides a comprehensive guide to", "this training arena. It costs 200gp. Would like", "one?"); + stage++; + break; + case 31: + + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3103 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/TelekineticGrabSpell.java b/Server/src/main/java/Server/core/game/content/activity/mta/TelekineticGrabSpell.java new file mode 100644 index 000000000..d21aaa48f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/TelekineticGrabSpell.java @@ -0,0 +1,211 @@ +package core.game.content.activity.mta; + +import core.game.content.global.action.PickupHandler; +import core.game.node.entity.combat.spell.SpellBlocks; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.interaction.SpecialGroundItems; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +import core.game.content.activity.mta.impl.TelekineticZone; + +/** + * Represents the telekenitic grab spell. + * @author 'Vexia + * @author Emperor + * @version 1.0 + */ +public final class TelekineticGrabSpell extends MagicSpell { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(2310); + + /** + * Represents the graphics to use. + */ + private static final Graphics START_GRAPHIC = new Graphics(142, 88, 15); + + /** + * Represents the end graphics to use. + */ + private static final Graphics END_GRAPHIC = new Graphics(144); + + /** + * Represents the sound to use. + */ + private static final Audio SOUND = new Audio(3007, 10, 1); + + /** + * Represents the projectile id to use. + */ + private static final int PROJECTILE_ID = 143; + + /** + * Represents the start height. + */ + private static final int START_HEIGHT = 40; + + /** + * Represents the end height. + */ + private static final int END_HEIGHT = 0; + + /** + * Represents the starting delay. + */ + private static final int START_DELAY = 41; + + /** + * Represents the angle. + */ + private static final int ANGLE = 5; + + /** + * Represents the spell id. + */ + public static final int SPELL_ID = 65535; + + /** + * Constructs a new {@code TelekineticGrabSpell} {@code Object}. + */ + public TelekineticGrabSpell() { + super(SpellBook.MODERN, 33, 43, ANIMATION, START_GRAPHIC, SOUND, new Item[] { new Item(Runes.AIR_RUNE.getId()), new Item(Runes.LAW_RUNE.getId(), 1) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(SPELL_ID, this); + return this; + } + + @Override + public boolean cast(final Entity entity, final Node target) { + final GroundItem ground = (GroundItem) target; + if (!canCast(entity, ground)) { + return false; + } + entity.lock(2); + visualize(entity, target); + GameWorld.getPulser().submit(getGrabPulse(entity, ground)); + return true; + } + + @Override + public void visualize(final Entity entity, final Node target) { + super.visualize(entity, target); + entity.faceLocation(target.getLocation()); + getProjectile(entity, (GroundItem) target).send(); + } + + /** + * Method used to get the grab pulse. + * @param entity the entity. + * @return the {@code Pulse}. + */ + public Pulse getGrabPulse(final Entity entity, final GroundItem ground) { + return new Pulse(getDelay(ground.getLocation().getDistance(entity.getLocation())), entity) { + @Override + public boolean pulse() { + Player player = entity instanceof Player ? (Player) entity : null; + GroundItem g = GroundItemManager.get(ground.getId(), ground.getLocation(), player); + if (g == null) { + player.getPacketDispatch().sendMessage("Too late!"); + return true; + } + if (g == SpecialGroundItems.AHAB_BEER.asGroundItem()){ + player.getDialogueInterpreter().open(2692, new NPC(2692), true); + return true; + } + if (player == null) { + return true; + } + boolean teleZone = player.getZoneMonitor().isInZone("Telekinetic Theatre") && g.getId() == 6888; + if (player != null) { + if (g == null || !g.isActive()) { + player.getPacketDispatch().sendMessage("Too late!"); + return true; + } + player.getAudioManager().send(3008); + if (!teleZone) { + player.getInventory().add(new Item(g.getId(), g.getAmount(), g.getCharge())); + } else { + TelekineticZone zone = TelekineticZone.getZone(player); + zone.moveStatue(); + player.lock(getDelay()); + } + player.getPacketDispatch().sendPositionedGraphics(END_GRAPHIC, ground.getLocation()); + } + if (!teleZone) { + GroundItemManager.destroy(g); + } + return true; + } + }; + } + + /** + * Method used to check if the spell can be casted. + * @param entity the entity. + * @param item the item to grab. + * @return {@code True} if so. + */ + public boolean canCast(final Entity entity, final GroundItem item) { + if (entity.getLocks().isInteractionLocked() || entity.getLocks().isComponentLocked()) { + return false; + } + if (entity instanceof Player) { + final Player player = (Player) entity; + if (!player.getInventory().hasSpaceFor(((Item) item))) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return false; + } + if (!PickupHandler.canTake(player, item, 1)) { + return false; + } + } + if(SpellBlocks.isBlocked(SPELL_ID,(Node) item)){ + if(entity instanceof Player){ + entity.asPlayer().getDialogueInterpreter().sendDialogue("You can't do that."); + } + return false; + } + return super.meetsRequirements(entity, true, true); + } + + /** + * Gets the projectile. + * @param entity the entity. + * @param item the item. + * @return the projectile. + */ + public Projectile getProjectile(Entity entity, GroundItem item) { + return Projectile.create(entity.getLocation(), item.getLocation(), PROJECTILE_ID, START_HEIGHT, END_HEIGHT, START_DELAY, Projectile.getSpeed(entity, item.getLocation()), ANGLE, 11); + } + + /** + * Gets the delay from the distance. + * @param distance the distance. + * @return the delay. + */ + public int getDelay(double distance) { + return (int) (2 + (distance * 0.5)); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/TelekineticGuardianDialogue.java b/Server/src/main/java/Server/core/game/content/activity/mta/TelekineticGuardianDialogue.java new file mode 100644 index 000000000..3cb88dff1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/TelekineticGuardianDialogue.java @@ -0,0 +1,118 @@ +package core.game.content.activity.mta; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the telekinetic guardian dialogue. + * @author Vexia + */ +public class TelekineticGuardianDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code TelekineticGuardianDialogue} {@code Object} + */ + public TelekineticGuardianDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TelekineticGuardianDialogue} {@code Object} + * @param player the player. + */ + public TelekineticGuardianDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TelekineticGuardianDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hi."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("What do I have to do in this room?", "What are the rewards?", "Got any tips that may help me?", "Thanks, bye!"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What do I have to do in this room?"); + stage = 10; + break; + case 2: + player("What are the rewards?"); + stage = 20; + break; + case 3: + player("Got any tips that may help me?"); + stage = 30; + break; + case 4: + player("Thanks, bye!"); + stage = 40; + break; + } + break; + case 10: + npc("In this room you will see a maze within which one of", "my fellow Guardians has been turned to stone for the", "purpose of this exercise. You must move the statue", "using your telekinetic grab spell to the exit square at"); + stage++; + break; + case 11: + npc("the edge of the maze to bring the Guardian back to life.", "Simply stand on the side that you wish for the statue to", "travel towards and cast the spell on the statue. Once", "you have solved the maze, the statue will change back"); + stage++; + break; + case 12: + npc("into the Guardian and he will award you with", "Telekinetic Pizazz Points and teleport you to the next", "maze. You can switch to a better view of the maze by", "selecting the 'Observe' option on the statue and return"); + stage = 13; + break; + case 13: + npc("your view to normal by selecting the same option again.", "There is also a 'Reset' option on the statue just in case", "things aren't going too well."); + stage = 0; + break; + case 20: + npc("As well as the experience in casting magic, you will get", "Telekinetic Pizazz Points for each maze successfully", "solved and bonus points for completing five mazes in a", "row without returning to the entrance."); + stage++; + break; + case 21: + npc("should also note that you will occasionally be rewarded", "with items when you put one of the enchanted orbs in", "the floor."); + stage = 0; + break; + case 30: + npc("Have a good look at the maze before you try to solve it", "because this can save you time and runes required to", "navigate the maze. Although you will still be getting", "magic experience for moving the statue incorrectly, you"); + stage++; + break; + case 31: + npc("won't be progressing towards collecting Telekinetic", "Pizazz Points. Lastly, all the mazes can be solved in ten", "moves or less."); + stage++; + break; + case 32: + player("I see."); + stage = 0; + break; + case 34: + end(); + break; + case 40: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3098 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/impl/AlchemistZone.java b/Server/src/main/java/Server/core/game/content/activity/mta/impl/AlchemistZone.java new file mode 100644 index 000000000..b47a47316 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/impl/AlchemistZone.java @@ -0,0 +1,438 @@ +package core.game.content.activity.mta.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +import core.game.content.activity.mta.MTAType; +import core.game.content.activity.mta.MTAZone; + +/** + * Handles the alchemist playground game. + * @author Vexia + */ +public class AlchemistZone extends MTAZone { + + /** + * The alchemist zone. + */ + public static AlchemistZone ZONE = new AlchemistZone(); + + /** + * The coins currency. + */ + public static final Item COINS = new Item(8890); + + /** + * The players in the zone. + */ + private static final List PLAYERS = new ArrayList<>(); + + /** + * The guardian. + */ + private static NPC guardian; + + /** + * The free alchemist item convert. + */ + public static AlchemistItem freeConvert; + + /** + * The pulse. + */ + private static final Pulse PULSE = new Pulse(GameWorld.getSettings().isDevMode() ? 15 : 53) { + @Override + public boolean pulse() { + if (PLAYERS.isEmpty()) { + return true; + } + shufflePrices(); + String forceChat = "The costs are changing!"; + if (freeConvert == null && RandomFunction.random(3) < 3) { + freeConvert = RandomFunction.getRandomElement(AlchemistItem.values()); + forceChat = "The " + freeConvert.getItem().getName().toLowerCase() + " " + (freeConvert == AlchemistItem.LEATHER_BOOTS ? "are" : "is") + " free to convert!"; + } else if (freeConvert != null) { + freeConvert = null; + } + guardian.sendChat(forceChat); + for (Player p : PLAYERS) { + if (p == null || !p.isActive()) { + continue; + } + getSession(p).shuffleObjects(); + updateInterface(p); + } + return false; + } + }; + + /** + * Constructs a new {@code AlchemistZone} {@code Object} + */ + public AlchemistZone() { + super("Alchemists' Playground", new Item[] { new Item(8890), new Item(6893), new Item(6894), new Item(6895), new Item(6896), new Item(6897) }); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player && PLAYERS.contains(e)) { + PLAYERS.remove(e); + if (logout && e.asPlayer().getInventory().containsItem(COINS)) { + int deposit = e.asPlayer().getInventory().getAmount(COINS); + int val = deposit / 100; + int earn = val < 1 ? 0 : val; + incrementPoints(e.asPlayer(), MTAType.ALCHEMISTS.ordinal(), earn); + e.asPlayer().getInventory().remove(COINS); + } + e.asPlayer().removeAttribute("alchemist-session"); + } + return super.leave(e, logout); + } + + @Override + public void update(Player player) { + player.getPacketDispatch().sendString("" + player.getSavedData().getActivityData().getPizazzPoints(getType().ordinal()), getType().getOverlay().getId(), 3); + } + + @Override + public boolean enter(Entity e) { + if (guardian == null) { + guardian = RegionManager.getNpc(new Location(3363, 9627, 2), 3099, 20); + } + if (e instanceof Player && !PLAYERS.contains(e)) { + PLAYERS.add(e.asPlayer()); + if (!PULSE.isRunning()) { + PULSE.restart(); + PULSE.start(); + GameWorld.getPulser().submit(PULSE); + } + e.asPlayer().removeAttribute("alch-earn"); + setSession(e.asPlayer()); + updateInterface(e.asPlayer()); + } + return super.enter(e); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + Player player = e.asPlayer(); + if (target.getId() == 10734) { + deposit(player); + return true; + } else if (target.getId() >= 6893 && target.getId() <= 6897 && (!option.getName().equals("drop") && !option.getName().equals("take"))) { + player.getDialogueInterpreter().sendDialogue("This item isn't yours to wield, it belongs to the arena!"); + return true; + } else if (target.getName().equals("Cupboard")) { + search(player, target.asObject()); + return true; + } + } + return super.interact(e, target, option); + } + + /** + * Searches a cupboard. + * @param player the player. + * @param object the object. + */ + private void search(Player player, GameObject object) { + AlchemistSession session = getSession(player); + AlchemistItem item = session.getItem(object.getId()); + if (object.getId() % 2 != 0) { + player.animate(Animation.create(3032)); + ObjectBuilder.replace(object, object.transform(object.getId() + 1), 35); + } + if (item == null) { + player.sendMessage("The cupboard is empty."); + return; + } + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("You have no free space to hold any more items."); + return; + } + player.lock(1); + player.getInventory().add(item.getItem()); + player.sendMessage("You found: " + item.getItem().getName()); + } + + /** + * Deposits the coins. + * @param player the player. + */ + private void deposit(Player player) { + if (!player.getInventory().containsItem(COINS)) { + player.getDialogueInterpreter().sendDialogue("You don't have any coins to deposit."); + return; + } + int deposit = player.getInventory().getAmount(COINS); + if (deposit >= 12000) { + player.teleport(new Location(3363, 3302, 0)); + player.getDialogueInterpreter().sendDialogue("You have been ejected from the arena! You were warned", "not to deposit more than 12000 coins at once."); + return; + } + if (player.getInventory().remove(new Item(COINS.getId(), deposit))) { + int val = deposit / 100; + int earn = val < 1 ? 0 : val; + int exp = deposit * 2; + int taking = player.getAttribute("alch-earn", 0); + int add = (int) (val > 0 ? (deposit / 100) * 10 : 0); + if (add != 0) { + taking += add; + } + if (earn != 0) { + incrementPoints(player, MTAType.ALCHEMISTS.ordinal(), earn); + } + if (taking != 0) { + player.setAttribute("alch-earn", taking); + } + player.getSkills().addExperience(Skills.MAGIC, exp, true); + player.getDialogueInterpreter().sendDialogue("You've just deposited " + deposit + " coins, earning you " + earn + " Alchemist Pizazz", "Points and " + exp + " magic XP. So far you're taking " + taking + " coins as a", "a reward when you leave!"); + } + } + + /** + * Shuffles the prices. + */ + public static void shufflePrices() { + List list = Arrays.asList(1, 5, 8, 10, 15, 20, 30); + Collections.shuffle(list); + for (int i = 0; i < AlchemistItem.values().length; i++) { + AlchemistItem.values()[i].setCost(list.get(i)); + } + } + + /** + * Updates the alchemy interface. + * @param player the player. + */ + public static void updateInterface(Player player) { + for (AlchemistItem i : AlchemistItem.values()) { + player.getPacketDispatch().sendInterfaceConfig(194, i.getChild(), freeConvert == null ? true : freeConvert == i ? false : true); + player.getPacketDispatch().sendString(i.getCost() + "", 194, 9 + i.ordinal()); + } + } + + @Override + public void configure() { + shufflePrices(); + PULSE.stop(); + register(new ZoneBorders(3341, 9618, 3393, 9654, 2)); + } + + /** + * Sets the session. + * @param player the player. + * @return the session. + */ + public static AlchemistSession setSession(Player player) { + AlchemistSession session = new AlchemistSession(player); + player.setAttribute("alchemist-session", session); + return session; + } + + /** + * Gets the alchemist session. + * @param player the player. + * @return the session. + */ + public static AlchemistSession getSession(Player player) { + AlchemistSession session = player.getAttribute("alchemist-session", null); + if (session == null) { + session = setSession(player); + } + return session; + } + + /** + * An alchemist session. + * @author Vexia + */ + public static class AlchemistSession { + + /** + * The player instance. + */ + private final Player player; + + /** + * The current indexer. max = 7 + */ + private int indexer; + + /** + * Constructs a new {@code AlchemistSession} {@code Object} + * @param player the player. + */ + public AlchemistSession(Player player) { + this.player = player; + shuffleObjects(); + } + + /** + * Gets an alchemist item. + * @param id the id. + * @return the item. + */ + public AlchemistItem getItem(int id) { + int[] ids = new int[] { 10797, 10795, 10793, 10791, 10789, 10787, 10785, 10783 }; + int index = 0; + for (int i = 0; i < ids.length; i++) { + if (ids[i] == id || (ids[i] + 1) == id) { + index = i; + break; + } + } + int alchIndex = indexer + index; + if (indexer != 0) { + if (indexer >= 4 && index < 4) { + if (indexer == 4 && indexer - index < 4 || indexer - index < 4) { + return null; + } + if (indexer == 4) { + return AlchemistItem.LEATHER_BOOTS; + } else { + if (indexer == 6 && index == 0) { + return AlchemistItem.ADAMANT_HELM; + } else if (indexer == 6 && index == 1) { + return AlchemistItem.ADAMANT_KITESHIELD; + } else if (indexer == 6 && index == 2) { + return AlchemistItem.LEATHER_BOOTS; + } else if (indexer == 7 && index == 0) { + return AlchemistItem.EMERALD; + } else if (indexer == 7 && index == 1) { + return AlchemistItem.ADAMANT_HELM; + } else if (indexer == 7 && index == 2) { + return AlchemistItem.ADAMANT_KITESHIELD; + } else if (indexer == 7 && index == 3) { + return AlchemistItem.LEATHER_BOOTS; + } else if (indexer == 5 && index == 0) { + return AlchemistItem.ADAMANT_KITESHIELD; + } else if (indexer == 5 && index == 1) { + return AlchemistItem.LEATHER_BOOTS; + } + } + return null; + } else { + alchIndex -= (indexer + indexer); + } + } + int finalIndex = (AlchemistItem.values().length - 1) - alchIndex; + if (finalIndex > AlchemistItem.values().length - 1 || finalIndex < 0) { + return null; + } + return AlchemistItem.values()[finalIndex]; + } + + /** + * Shuffles the objects. + */ + private void shuffleObjects() { + indexer++; + if (indexer > 7) { + indexer = 0; + } + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + } + + /** + * An alchemist item. + * @author Vexia + */ + public enum AlchemistItem { + LEATHER_BOOTS(new Item(6893)), ADAMANT_KITESHIELD(new Item(6894)), ADAMANT_HELM(new Item(6895)), EMERALD(new Item(6896)), RUNE_LONGSWORD(new Item(6897)); + + /** + * The item. + */ + private final Item item; + + /** + * The cost of the item. + */ + private int cost; + + /** + * Constructs a new {@code AlchemistItem} {@code Object} + * @param item the item. + */ + private AlchemistItem(Item item) { + this.item = item; + } + + /** + * Gets the alchemist item by the id. + * @param id the id. + * @return the item. + */ + public static AlchemistItem forItem(int id) { + for (AlchemistItem item : values()) { + if (item.getItem().getId() == id) { + return item; + } + } + return null; + } + + /** + * Gets the child. + * @return the child. + */ + public int getChild() { + return 14 + ordinal(); + } + + /** + * Gets the item. + * @return the item + */ + public Item getItem() { + return item; + } + + /** + * Gets the cost. + * @return the cost + */ + public int getCost() { + return cost; + } + + /** + * Sets the cost. + * @param cost the cost to set. + */ + public void setCost(int cost) { + this.cost = cost; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/impl/EnchantingZone.java b/Server/src/main/java/Server/core/game/content/activity/mta/impl/EnchantingZone.java new file mode 100644 index 000000000..7ddfe6172 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/impl/EnchantingZone.java @@ -0,0 +1,365 @@ +package core.game.content.activity.mta.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +import core.game.content.activity.mta.MTAZone; + +/** + * Handles the enchanting zone. + * @author Vexia + */ +public class EnchantingZone extends MTAZone { + + /** + * The singleton of this zone. + */ + public static final EnchantingZone ZONE = new EnchantingZone(); + + /** + * The bonus shape. + */ + public static Shapes BONUS_SHAPE = RandomFunction.getRandomElement(Shapes.values()); + + /** + * The random runes to earn. + */ + private static final Item[] RUNES = new Item[] { new Item(560, 3), new Item(565, 3), new Item(564, 3) }; + + /** + * The location of dragon stones. + */ + private static final Location[] STONES = new Location[] { Location.create(3354, 9645, 0), Location.create(3353, 9635, 0), Location.create(3359, 9632, 0), Location.create(3375, 9633, 0), Location.create(3374, 9643, 0), Location.create(3373, 9651, 0) }; + + /** + * The orb item. + */ + private static final Item ORB = new Item(6902); + + /** + * The players in the zone. + */ + private static final List PLAYERS = new ArrayList<>(); + + /** + * The guardian. + */ + private static NPC guardian; + + /** + * The list of d spawns. + */ + private static Map> DSPAWNS = new HashMap<>(); + + /** + * The pulse. + */ + private static final Pulse PULSE = new Pulse(36) { + @Override + public boolean pulse() { + if (PLAYERS.isEmpty()) { + return true; + } + Shapes shape = null; + while (shape == null) { + shape = RandomFunction.getRandomElement(Shapes.values()); + if (shape == BONUS_SHAPE) { + shape = null; + } + } + BONUS_SHAPE = shape; + for (Player player : PLAYERS) { + if (player == null || !player.isActive()) { + continue; + } + BONUS_SHAPE.setAsBonus(player); + } + if (guardian != null) { + guardian.sendChat("The bonus shape has changed to the " + BONUS_SHAPE.name().toLowerCase().replace("_", " ").trim() + "."); + } + return false; + } + + }; + + /** + * Constructs a new {@Code EnchantingZone} {@Code Object} + */ + public EnchantingZone() { + super("Enchantment Chamber", new Item[] { new Item(6899), new Item(6898), new Item(6900), new Item(6901), new Item(6903), new Item(6902) }); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player && PLAYERS.contains(e)) { + PLAYERS.remove(e); + } + return super.leave(e, logout); + } + + @Override + public boolean enter(Entity e) { + if (guardian == null) { + guardian = RegionManager.getNpc(new Location(3361, 9647, 0), 3100, 20); + } + if (e instanceof Player && !PLAYERS.contains(e)) { + PLAYERS.add(e.asPlayer()); + if (!PULSE.isRunning()) { + PULSE.restart(); + PULSE.start(); + GameWorld.getPulser().submit(PULSE); + } + createGroundSpawns(e.asPlayer()); + BONUS_SHAPE.setAsBonus(e.asPlayer()); + update(e.asPlayer()); + } + return super.enter(e); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + Player player = e.asPlayer(); + if (target.getId() >= 10799 && target.getId() <= 10802) { + Shapes.forId(target.getId()).take(player, target.asObject()); + return true; + } + if (target.getId() == 10803) { + deposit(player); + return true; + } + } + return super.interact(e, target, option); + } + + /** + * Creates the ground spawns. + * @param player + */ + public void createGroundSpawns(final Player player) { + if (DSPAWNS.containsKey(player.getName())) { + List items = getGroundSpawns(player); + for (GroundItem item : items) { + item.setDropper(player); + } + DSPAWNS.put(player.getName(), items); + return; + } + List items = getGroundSpawns(player); + for (Location location : STONES) { + final GroundItem item = new GroundItem(new Item(6903), location, player) { + + @Override + public boolean isAutoSpawn() { + return true; + } + + @Override + public boolean isActive() { + return true; + } + + @Override + public void respawn() { + GameWorld.getPulser().submit(getRespawnPulse(this)); + } + }; + items.add(item); + GroundItemManager.create(item); + } + DSPAWNS.put(player.getName(), items); + } + + /** + * Gets the respawn pulse. + * @param item the item. + * @return the pulse. + */ + public Pulse getRespawnPulse(final GroundItem item) { + return new Pulse(GameWorld.getSettings().isDevMode() ? 45 : RandomFunction.random(700, 800)) { + @Override + public boolean pulse() { + GroundItemManager.create(item); + return true; + } + }; + } + + /** + * Removes the ground spawns. + * @param player the player. + */ + public void removeGroundSpawns(Player player) { + List items = getGroundSpawns(player); + for (GroundItem item : items) { + GroundItemManager.destroy(item); + } + } + + /** + * Gets the ground item spawns. + * @param player the player. + * @return the items. + */ + public List getGroundSpawns(Player player) { + List items = DSPAWNS.get(player.getName()); + if (items == null) { + items = new ArrayList(); + } + DSPAWNS.put(player.getName(), items); + return items; + } + + /** + * Deposits the players enchanted orbs. + * @param player the player. + */ + private void deposit(Player player) { + if (!player.getInventory().containsItem(ORB)) { + player.sendMessage("You don't have any orbs to deposit."); + return; + } + int amount = player.getInventory().getAmount(ORB); + player.animate(Animation.create(832)); + player.getInventory().remove(new Item(ORB.getId(), amount)); + int prevAmt = player.getAttribute("mta-orb", 0); + prevAmt += amount; + if (prevAmt >= 20) { + prevAmt = 0; + player.getInventory().add(RandomFunction.getRandomElement(RUNES), player); + player.getDialogueInterpreter().sendDialogue("Congratulations! You've been rewarded with an item for your efforts."); + } + player.setAttribute("mta-orb", prevAmt); + } + + @Override + public void configure() { + PULSE.stop(); + register(new ZoneBorders(3335, 9612, 3389, 9663, 0, true)); + } + + /** + * The shapes around the room to enchant. + * @author Vexia + */ + public enum Shapes { + CUBE(10799, new Item(6899)), CYLINDER(10800, new Item(6898)), PENTAMID(10802, new Item(6901)), ICOSAHEDRON(10801, new Item(6900)); + + /** + * The object of the shape. + */ + private final int objectId; + + /** + * The item for the shape. + */ + private final Item item; + + /** + * Constructs a new {@Code Shapes} {@Code Object} + * @param objectId + * @param item + */ + private Shapes(int objectId, Item item) { + this.objectId = objectId; + this.item = item; + } + + /** + * Takes from the shape object. + * @param player the player. + */ + public void take(Player player, GameObject object) { + if (!player.getInventory().hasSpaceFor(item)) { + player.sendMessage("You have no space left in your inventory."); + return; + } + player.lock(1); + player.getInventory().add(item); + player.animate(Animation.create(827)); + } + + /** + * Sets it as the bonus type. + * @param player the player. + */ + public void setAsBonus(Player player) { + for (Shapes s : values()) { + player.getPacketDispatch().sendInterfaceConfig(195, s.getChild(), true); + } + player.getPacketDispatch().sendInterfaceConfig(195, getChild(), false); + } + + /** + * Gets the child. + * @return the child. + */ + public int getChild() { + return 1 + ordinal(); + } + + /** + * Gets the shape by the item. + * @param item the item. + * @return the shape. + */ + public static Shapes forItem(Item item) { + for (Shapes s : values()) { + if (s.getItem().getId() == item.getId()) { + return s; + } + } + return null; + } + + /** + * Gets a shape for the id. + * @param id the id. + * @return the shape. + */ + public static Shapes forId(int id) { + for (Shapes s : values()) { + if (s.getObjectId() == id) { + return s; + } + } + return null; + } + + /** + * Gets the objectId. + * @return the objectId + */ + public int getObjectId() { + return objectId; + } + + /** + * Gets the item. + * @return the item + */ + public Item getItem() { + return item; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/impl/GraveyardZone.java b/Server/src/main/java/Server/core/game/content/activity/mta/impl/GraveyardZone.java new file mode 100644 index 000000000..ef8d72082 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/impl/GraveyardZone.java @@ -0,0 +1,295 @@ +package core.game.content.activity.mta.impl; + +import java.util.ArrayList; +import java.util.List; + +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +import core.game.content.activity.mta.MTAType; +import core.game.content.activity.mta.MTAZone; + +/** + * Handles the creature graveyard zone. + * @author Vexia + */ +public class GraveyardZone extends MTAZone { + + /** + * The graveyard zone. + */ + public static final GraveyardZone ZONE = new GraveyardZone(); + + /** + * The players in the zone. + */ + private static final List PLAYERS = new ArrayList<>(); + + /** + * The runes rewarded by a chance. + */ + private static final Item[] RUNES = new Item[] { new Item(561), new Item(555), new Item(557) }; + + /** + * The banana item. + */ + private static final Item BANANA = new Item(1963); + + /** + * The peach item. + */ + private static final Item PEACH = new Item(6883); + + /** + * The positions for the graphics. + */ + private static final Location[] GFX_POS = new Location[] { Location.create(3370, 9634, 1), Location.create(3359, 9634, 1), Location.create(3360, 9643, 1), Location.create(3363, 9643, 1), Location.create(3363, 9633, 1), Location.create(3367, 9637, 1), Location.create(3366, 9642, 1), Location.create(3380, 9647, 1), Location.create(3375, 9648, 1), Location.create(3370, 9649, 1), Location.create(3372, 9644, 1), Location.create(3379, 9646, 1), Location.create(3381, 9651, 1), Location.create(3379, 9656, 1), Location.create(3373, 9658, 1), Location.create(3353, 9648, 1), Location.create(3356, 9653, 1), Location.create(3346, 9657, 1), Location.create(3347, 9655, 1), Location.create(3354, 9634, 1), Location.create(3352, 9631, 1), Location.create(3355, 9627, 1), Location.create(3345, 9631, 1), Location.create(3345, 9627, 1), Location.create(3347, 9623, 1), Location.create(3351, 9621, 1), Location.create(3368, 9624, 1), Location.create(3368, 9631, 1), Location.create(3375, 9630, 1), Location.create(3375, 9635, 1), Location.create(3371, 9621, 1), Location.create(3377, 9621, 1), Location.create(3381, 9624, 1), Location.create(3382, 9629, 1), Location.create(3371, 9635, 1), Location.create(3365, 9634, 1), Location.create(3361, 9641, 1), Location.create(3363, 9644, 1) }; + + /** + * The pulse. + */ + private static final Pulse PULSE = new Pulse(6) { + @Override + public boolean pulse() { + if (PLAYERS.isEmpty()) { + return true; + } + List locs = new ArrayList<>(); + for (Location l : GFX_POS) { + if (RandomFunction.random(12) >= 8) { + continue; + } + locs.add(l); + } + for (Player player : PLAYERS) { + if (player == null || !player.isActive()) { + continue; + } + for (Location l : locs) { + player.getPacketDispatch().sendPositionedGraphics(Graphics.create(520), l); + } + if (player.getDialogueInterpreter().getDialogue() == null) { + player.getImpactHandler().manualHit(player, 2, HitsplatType.NORMAL); + } + } + locs = null; + setDelay(RandomFunction.random(6, 12)); + return false; + } + }; + + /** + * Constructs a new {@Code GraveyardZone} {@Code Object} + */ + public GraveyardZone() { + super("Creature Graveyard", new Item[] { new Item(6904), new Item(6905), new Item(6906), new Item(6907), new Item(1963), new Item(6883) }); + } + + + @Override + public void update(Player player) { + player.getPacketDispatch().sendString("" + player.getSavedData().getActivityData().getPizazzPoints(getType().ordinal()), getType().getOverlay().getId(), 12); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player && PLAYERS.contains(e)) { + PLAYERS.remove(e); + } + return super.leave(e, logout); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player && !PLAYERS.contains(e)) { + PLAYERS.add(e.asPlayer()); + if (!PULSE.isRunning()) { + PULSE.restart(); + PULSE.start(); + GameWorld.getPulser().submit(PULSE); + } + } + return super.enter(e); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + Player player = e.asPlayer(); + if (target.getId() == 10735) { + deposit(player); + return true; + } else if (target.getId() >= 10725 && target.getId() <= 10728) { + BoneType.forObject(target.getId()).grab(player, target.asObject()); + return true; + } + } + return super.interact(e, target, option); + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e instanceof Player) { + Player p = e.asPlayer(); + int points = p.getSavedData().getActivityData().getPizazzPoints(MTAType.GRAVEYARD.ordinal()); + if (points >= 10) { + p.getSavedData().getActivityData().decrementPizazz(MTAType.GRAVEYARD.ordinal(), 10); + } else { + p.getSavedData().getActivityData().decrementPizazz(MTAType.GRAVEYARD.ordinal(), points); + } + } + return super.death(e, killer); + } + + /** + * Deposits the fruit into the chute. + * @param player the player. + */ + private void deposit(Player player) { + if (!player.getInventory().containsItem(BANANA) && !player.getInventory().containsItem(PEACH)) { + player.getDialogueInterpreter().sendDialogue("You don't have any bananas or peaches to deposit."); + return; + } + int totalAmount = player.getAttribute("grave-amt", 0); + int amount = 0; + Item[] items = new Item[] { BANANA, PEACH }; + for (Item item : items) { + if (player.getInventory().containsItem(item)) { + amount = player.getInventory().getAmount(item); + totalAmount += amount; + player.getInventory().remove(new Item(item.getId(), amount)); + } + } + if (totalAmount >= 16) { + if (totalAmount > 16) { + totalAmount = totalAmount - 16; + } else { + totalAmount = 0; + } + Item rune = RandomFunction.getRandomElement(RUNES); + String name = rune.getName().toLowerCase(); + player.getInventory().add(rune, player); + incrementPoints(player, MTAType.GRAVEYARD.ordinal(), 1); + player.getSkills().addExperience(Skills.MAGIC, 50, true); + player.getDialogueInterpreter().sendDialogue("Congratulations - you've been awarded a" + (StringUtils.isPlusN(name) ? "n" : "") + " " + name + " and extra", "magic XP."); + } + player.setAttribute("grave-amt", totalAmount); + } + + @Override + public void configure() { + PULSE.stop(); + register(new ZoneBorders(3333, 9610, 3390, 9663, 1, true)); + } + + /** + * A bone type. + * @author Vexia + */ + public enum BoneType { + FIRST(10725, new Item(6904)), SECOND(10726, new Item(6905)), THIRD(10727, new Item(6906)), FOURTH(10728, new Item(6907)); + + /** + * The object id of the bone. + */ + private final int objectId; + + /** + * The item of the bone. + */ + private final Item item; + + /** + * Constructs a new {@Code BoneType} {@Code Object} + * @param objectId the object id. + * @param item the item. + */ + private BoneType(int objectId, Item item) { + this.objectId = objectId; + this.item = item; + } + + /** + * Grabs the bone from the object. + * @param player the player. + * @param object the object. + */ + public void grab(Player player, GameObject object) { + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("You have no free space!"); + return; + } + int life = object.getAttributes().getAttribute("life", 4); + player.lock(1); + player.getInventory().add(item); + player.animate(Animation.create(827)); + life -= 1; + if (life < 1) { + life = 4; + BoneType type = ordinal() + 1 > BoneType.values().length - 1 ? BoneType.FIRST : BoneType.values()[ordinal() + 1]; + ObjectBuilder.replace(object, object.transform(type.getObjectId())); + } + object.getAttributes().setAttribute("life", life); + } + + /** + * Gets a bone type for the item. + * @param item the item. + * @return the bone type. + */ + public static BoneType forItem(Item item) { + for (BoneType type : values()) { + if (type.getItem().getId() == item.getId()) { + return type; + } + } + return null; + } + + /** + * Gets the bone type by the object id. + * @param objectId the id. + * @return the type. + */ + public static BoneType forObject(int objectId) { + for (BoneType type : values()) { + if (type.getObjectId() == objectId) { + return type; + } + } + return null; + } + + /** + * Gets the objectId. + * @return the objectId + */ + public int getObjectId() { + return objectId; + } + + /** + * Gets the item. + * @return the item + */ + public Item getItem() { + return item; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/mta/impl/TelekineticZone.java b/Server/src/main/java/Server/core/game/content/activity/mta/impl/TelekineticZone.java new file mode 100644 index 000000000..003f79249 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/mta/impl/TelekineticZone.java @@ -0,0 +1,560 @@ +package core.game.content.activity.mta.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import core.game.content.dialogue.DialogueAction; +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.tools.RandomFunction; + +import core.game.content.activity.mta.MTAType; +import core.game.content.activity.mta.MTAZone; + +/** + * Handles the telekinetic zone. + * @author Vexia + */ +public class TelekineticZone extends MTAZone { + + /** + * The statue used in the game. + */ + public static final int STATUE = 6888; + + /** + * The player. + */ + private final Player player; + + /** + * The mazes to choose from. + */ + private final List mazes = new ArrayList<>(); + + /** + * The dynamic region. + */ + private DynamicRegion region; + + /** + * The location. + */ + private Location base; + + /** + * The maze. + */ + private Maze maze; + + /** + * The statue item. + */ + private GroundItem statue; + + /** + * The npc guardian. + */ + private NPC guardian; + + /** + * The solved mazes. + */ + private int solved; + + /** + * Constructs a new {@code TelekineticZone} {@code Object} + * @param player the player. + */ + public TelekineticZone(Player player) { + super("Telekinetic Theatre", new Item[] {}); + this.player = player; + if (player != null) { + mazes.addAll(Arrays.asList(Maze.values())); + this.solved = player.getSavedData().getActivityData().getSolvedMazes(); + } + } + + /** + * Constructs a new {@code TelekineticZone} {@code Object} + */ + public TelekineticZone() { + this(null); + } + + /** + * Starts the telekinetic game for a player. + * @param player the player. + */ + public static void start(Player player) { + setZone(player); + } + + @Override + public void update(Player player) { + player.getPacketDispatch().sendString("" + player.getSavedData().getActivityData().getPizazzPoints(getType().ordinal()), getType().getOverlay().getId(), 4); + player.getPacketDispatch().sendString("" + solved, 198, 7); + } + + @Override + public boolean leave(Entity entity, boolean logout) { + if (entity instanceof Player) { + Player player = entity.asPlayer(); + if (player == null || player != this.player) { + return super.leave(entity, logout); + } + if (logout) { + player.getSavedData().getActivityData().setSolvedMazes(solved); + } else { + player.getSavedData().getActivityData().setSolvedMazes(0); + } + if (statue != null) { + GroundItemManager.destroy(statue); + } + if (guardian != null) { + guardian.clear(); + } + player.removeAttribute("camera"); + } + return super.leave(entity, logout); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + return super.interact(e, target, option); + } + + @Override + public boolean parseCommand(Player player, String name, String[] arguments) { + switch (name) { + case "childs": + for (int i = 0; i < 8; i++) { + player.getPacketDispatch().sendString("child=" + i, 198, i); + } + break; + case "reset": + if (player.getAttribute("camera", false)) { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 400, 1, 20)); + player.setAttribute("camera", false); + return true; + } + return true; + } + return false; + } + + @Override + public void configure() { + setUid(getName().hashCode()); + region = DynamicRegion.create(13463); + setBase(Location.create(region.getBorders().getSouthWestX(), region.getBorders().getSouthWestY(), 0)); + registerRegion(region.getId()); + } + + /** + * Sets up the player in the maze. + */ + public void setUp() { + Maze maze = this.maze == null ? RandomFunction.getRandomElement(mazes.toArray(new Maze[] {})) : null; + while (maze == null) { + maze = RandomFunction.getRandomElement(mazes.toArray(new Maze[] {})); + if (maze == this.maze) { + maze = null; + } + } + mazes.remove(maze); + setMaze(maze); + setNodes(); + player.teleport(base.transform(maze.getBase())); + } + + /** + * Sets up the nodes. + */ + public void setNodes() { + if (statue != null) { + GroundItemManager.destroy(statue); + } + if (guardian != null) { + guardian.clear(); + } + moveStatue(base.transform(maze.getStatueLocation())); + guardian = NPC.create(3098, base.transform(maze.getGuardianLocation())); + guardian.setWalks(true); + guardian.init(); + } + + /** + * Moves the statue. + * @param location the location. + */ + public void moveStatue(Location location) { + if (statue != null) { + GroundItemManager.destroy(statue); + } + GroundItemManager.create(statue = createGroundItem(location)); + } + + /** + * Creates the statue ground item. + * @param location the location. + * @return the item. + */ + public GroundItem createGroundItem(Location location) { + GroundItem item = new GroundItem(new Item(STATUE), location, player) { + @Override + public boolean isActive() { + return !isRemoved(); + } + }; + return item; + } + + /** + * Sets the telekinetic zone. + * @param player the player. + * @return the zone. + */ + public static TelekineticZone setZone(Player player) { + TelekineticZone zone = new TelekineticZone(player); + zone.configure(); + zone.setUp(); + player.setAttribute("tele-zone", zone); + return zone; + } + + /** + * Gets the zone. + * @param player the player. + * @return the zone. + */ + public static TelekineticZone getZone(Player player) { + TelekineticZone zone = player.getAttribute("tele-zone", null); + if (zone == null) { + zone = setZone(player); + } + return zone; + } + + /** + * Called when the player wins. + */ + private void win() { + solved++; + GroundItemManager.destroy(statue); + int points = 2; + player.getDialogueInterpreter().sendDialogue("Congratulations! You have received two Telekinetic Pizazz Points!"); + if (solved >= 5) { + mazes.addAll(Arrays.asList(Maze.values())); + solved = 0; + points += 8; + player.getSkills().addExperience(Skills.MAGIC, 1000, true); + player.getInventory().add(new Item(563, 10)); + player.getSavedData().getActivityData().setSolvedMazes(0); + player.getDialogueInterpreter().addAction(new DialogueAction() { + @Override + public void handle(Player player, int buttonId) { + player.getDialogueInterpreter().sendDialogue("Congratulations on solving five mazes in a row, have 8 bonus points,", "10 law runes and extra magic XP!"); + } + }); + } + incrementPoints(player, MTAType.TELEKINETIC.ordinal(), points); + TelekineticZone.this.update(player); + player.setAttribute("camera", false); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 400, 1, 20)); + NPC mazeGuard = NPC.create(3102, base.transform(maze.getEndLocation())); + mazeGuard.init(); + } + + /** + * Moves the statue with a telekinetic teleport. + */ + public void moveStatue() { + final Direction dir = getDir(); + if (dir == null) { + player.sendMessage("Invalid move!"); + return; + } + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + boolean win = false; + + @Override + public boolean pulse() { + if (win) { + win(); + return true; + } + Location next = statue.getLocation().transform(dir, 1); + Path path = Pathfinder.find(statue.getLocation(), next); + boolean end = !path.isSuccessful() || path.isMoveNear() || path.getPoints().size() != 1; + if (end) { + return true; + } + if (next.equals(base.transform(maze.getEndLocation()))) { + win = true; + } + moveStatue(next); + return end; + } + + @Override + public void stop() { + player.unlock(); + super.stop(); + } + }); + } + + /** + * Observes from above. + * @param player the player. + */ + public void observe(Player player) { + if (player.getAttribute("camera", false)) { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 400, 1, 20)); + player.setAttribute("camera", false); + return; + } + player.sendMessage("Click observe on the guardian to reset your camera, or use the command ::reset !"); + Location l = base.transform(maze.getCameraLocation()); + int x = l.getX(); + int y = l.getY(); + int yInc = -10; + int xInc = 0; + int speed = 95; + int height = 798; + player.setAttribute("camera", true); + if (maze == Maze.FOURTH) { + x += 11; + y += 15; + height = 799; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x + xInc, y + yInc, height, 1, speed)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x - 55, y - 25, height, 1, speed)); + return; + } + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x + xInc, y + yInc, height, 1, speed)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + xInc, y + yInc, height, 1, speed)); + } + + /** + * Resets the player. + * @param player the player. + */ + public void reset(Player player) { + moveStatue(base.transform(maze.getStatueLocation())); + } + + /** + * Gets the direction to go. + * @return the direction. + */ + private Direction getDir() { + int myX = player.getLocation().getLocalX(); + int myY = player.getLocation().getLocalY(); + // anything >= 23 is north, anything <= is south, any x <= 10 is west, + // any x >= 21 is east + int[] data = maze.getData(); + if (myY >= data[0]) { + return Direction.NORTH; + } else if (myY <= data[1]) { + return Direction.SOUTH; + } else if (myX <= data[2]) { + return Direction.WEST; + } else if (myX >= data[3]) { + return Direction.EAST; + } + return null; + } + + /** + * Gets the base. + * @return the base + */ + public Location getBase() { + return base; + } + + /** + * Sets the base. + * @param base the base to set. + */ + public void setBase(Location base) { + this.base = base; + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the maze. + * @return the maze + */ + public Maze getMaze() { + return maze; + } + + /** + * Sets the maze. + * @param maze the maze to set. + */ + public void setMaze(Maze maze) { + this.maze = maze; + } + + /** + * Gets the solved. + * @return the solved + */ + public int getSolved() { + return solved; + } + + /** + * Sets the solved. + * @param solved the solved to set. + */ + public void setSolved(int solved) { + this.solved = solved; + } + + /** + * A maze. + * @author Vexia + */ + public enum Maze { + FIRST(new Location(8, 54, 0), new Location(15, 41, 0), new Location(8, 39, 0), new Location(19, 50, 0), new Location(15, 45, 0), new int[] { 51, 40, 9, 20 }), // http://puu.sh/cbh82/a0f9f3d206.png + SECOND(new Location(34, 49, 1), new Location(22, 53, 1), new Location(26, 48, 1), new Location(13, 44, 1), new Location(17, 48, 1), new int[] { 54, 43, 12, 23 }), // http://puu.sh/cbgzG/ab25358b4c.png + THIRD(new Location(54, 34, 1), new Location(48, 22, 1), new Location(45, 15, 1), new Location(57, 22, 1), new Location(53, 17, 1), new int[] { 23, 12, 47, 58 }), // http://puu.sh/cbgRX/d229c6129b.png + + FOURTH(new Location(50, 42, 1), new Location(46, 49, 1), new Location(57, 41, 1), new Location(55, 49, 1), new Location(50, 53, 1), new int[] { 59, 48, 45, 56 }), // http://puu.sh/cbgMW/7bd91b0ed1.png + FITH(new Location(46, 32, 0), new Location(45, 14, 0), new Location(45, 23, 0), new Location(47, 18, 0), new Location(45, 13, 0), new int[] { 19, 8, 40, 51 }), // http://puu.sh/cbhuc/83da140de5.png + + SIXTH(new Location(26, 26, 0), new Location(15, 16, 0), new Location(23, 24, 0), new Location(14, 20, 0), new Location(14, 15, 0), new int[] { 21, 10, 9, 10 }), // http://puu.sh/cbgHl/cb55b8011e.png + SEVENTH(new Location(51, 52, 0), new Location(40, 48, 0), new Location(55, 50, 0), new Location(39, 56, 0), new Location(43, 51, 0), new int[] { 57, 46, 37, 48 }), // http://puu.sh/cbgXl/73a9311a76.png + EIGTH(new Location(31, 37, 2), new Location(18, 54, 2), new Location(28, 41, 2), new Location(17, 54, 2), new Location(19, 49, 2), new int[] { 55, 44, 14, 25 }), // http://puu.sh/cbgAV/a2f71c6279.png + NINTH(new Location(40, 16, 2), new Location(20, 10, 2), new Location(34, 15, 2), new Location(11, 19, 2), new Location(16, 14, 2), new int[] { 20, 9, 10, 21 }), // http://puu.sh/cbhbR/59a1477b0c.png + TENTH(new Location(27, 29, 1), new Location(23, 20, 1), new Location(31, 25, 1), new Location(25, 16, 1), new Location(23, 20, 1), new int[] { 26, 15, 17, 28 });// http://puu.sh/cbh58/1cd226cbc0.png + + /** + * The location base of where to start. + */ + private final Location base; + + /** + * The start location of the statue. + */ + private final Location statueLocation; + + /** + * The guardian location. + */ + private final Location guardianLocation; + + /** + * The ending location. + */ + private final Location endLocation; + + /** + * The location camera. + */ + private final Location cameraLocation; + + /** + * The data used to create movements. + */ + private final int[] data; + + /** + * Constructs a new {@code Maze} {@code Object} + * @param base the base. + * @param statueLocation the statue location. + * @param guardianLocation the guardian location. + * @param endLocation the end location. + * @param cameraLocation the camera location. + */ + private Maze(Location base, Location statueLocation, Location guardianLocation, Location endLocation, Location cameraLocation, int[] data) { + this.base = base; + this.statueLocation = statueLocation; + this.guardianLocation = guardianLocation; + this.endLocation = endLocation; + this.cameraLocation = cameraLocation; + this.data = data; + } + + /** + * Gets the base. + * @return the base + */ + public Location getBase() { + return base; + } + + /** + * Gets the statueLocation. + * @return the statueLocation + */ + public Location getStatueLocation() { + return statueLocation; + } + + /** + * Gets the guardianLocation. + * @return the guardianLocation + */ + public Location getGuardianLocation() { + return guardianLocation; + } + + /** + * Gets the endLocation. + * @return the endLocation + */ + public Location getEndLocation() { + return endLocation; + } + + /** + * Gets the cameraLocation. + * @return the cameraLocation + */ + public Location getCameraLocation() { + return cameraLocation; + } + + /** + * Gets the data. + * @return the data + */ + public int[] getData() { + return data; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/package-info.java b/Server/src/main/java/Server/core/game/content/activity/package-info.java new file mode 100644 index 000000000..095ee709c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/package-info.java @@ -0,0 +1,6 @@ +/** + * Holds all the plugin classes. + * + * @author Emperor + */ +package core.game.content.activity; \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/partyroom/BalloonManager.java b/Server/src/main/java/Server/core/game/content/activity/partyroom/BalloonManager.java new file mode 100644 index 000000000..e42c52f75 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/partyroom/BalloonManager.java @@ -0,0 +1,334 @@ +package core.game.content.activity.partyroom; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Manages the droped party balloons. + * @author Vexia + */ +public final class BalloonManager extends OptionHandler { + + /** + * The list of dropped balloons. + */ + private static final List balloons = new ArrayList<>(); + + /** + * The count down time until droping. + */ + private int countdown; + + /** + * Constructs a new {@Code BalloonManager} {@Code Object} + */ + public BalloonManager() { + /** + * empty. + */ + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (PartyBalloon balloon : PartyBalloon.values()) { + ObjectDefinition.forId(balloon.getBalloonId()).getHandlers().put("option:burst", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "burst": + PartyBalloon.forId(node.getId()).burst(player, node.asObject()); + return true; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + return n.getLocation(); + } + + /** + * Starts the count down. + */ + public void start() { + if (isCountingDown()) { + return; + } + countdown = GameWorld.getTicks() + getDropDelay(); + final NPC partyPete = RegionManager.getNpc(new Location(3052, 3373, 0), 659, 1); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + int realCount = --countdown - GameWorld.getTicks(); + for (ChestViewer viewer : PartyRoomPlugin.getViewers().values()) { + viewer.getPlayer().getConfigManager().set(1135, realCount); + } + if (--realCount - GameWorld.getTicks() <= 0) { + drop(); + return true; + } + partyPete.sendChat("" + realCount); + return realCount < 0; + } + }); + } + + /** + * Drops the balloons. + */ + private void drop() { + countdown = 0; + balloons.clear(); + PartyRoomPlugin.getPartyChest().addAll(PartyRoomPlugin.getChestQueue()); + PartyRoomPlugin.getChestQueue().clear(); + PartyRoomPlugin.update(); + GameWorld.getPulser().submit(new Pulse(1) { + int waves; + + @Override + public boolean pulse() { + if (waves == 0 || waves == 3 || waves == 5 || waves == 8 || waves == 10 || waves == 12 || waves == 15 || waves == 18 || waves == 20) { + for (int i = 0; i < 30; i++) { + GameObject balloon = getBalloon(); + if (balloon != null) { + balloons.add(balloon); + ObjectBuilder.add(balloon, RandomFunction.random(200, 300)); + } + } + } + return ++waves > 20; + } + + }); + } + + /** + * Gets the balloon drop. + * @return the balloon. + */ + private GameObject getBalloon() { + final Location location = new Location(3045 + RandomFunction.randomSign(RandomFunction.getRandom(8)), 3378 + RandomFunction.randomSign(RandomFunction.getRandom(6)), 0); + if (!RegionManager.isTeleportPermitted(location) || RegionManager.getObject(location) != null) { + return null; + } + return new GameObject(PartyBalloon.values()[RandomFunction.random(PartyBalloon.values().length)].getBalloonId(), location); + } + + /** + * Checks if the floor is cluttered. + * @return {@code True} if so. + */ + public boolean isCluttered() { + for (GameObject object : balloons) { + if (RegionManager.getObject(object.getLocation()) != null) { + return true; + } + } + return false; + } + + /** + * Gets the drop delay depending on wealth. + * @return the delay. + */ + public int getDropDelay() { + int wealth = getWealth(); + if (wealth <= 50000) { + return 10; + } else if (wealth >= 50000 && wealth <= 150000) { + return 100; + } else if (wealth >= 150000 && wealth <= 1000000) { + return 500; + } else if (wealth > 1000000) { + return 1000; + } + return 0; + } + + /** + * Gets the amount of wealth in the chest. + * @return the wealth. + */ + public int getWealth() { + return PartyRoomPlugin.getChestQueue().getWealth() + PartyRoomPlugin.getPartyChest().getWealth(); + } + + /** + * Checks if the balloon manager is counting down. + * @return {@code True} if so. + */ + public boolean isCountingDown() { + return countdown > GameWorld.getTicks(); + } + + /** + * Gets the balloons. + * @return the balloons + */ + public static List getBalloons() { + return balloons; + } + + /** + * Gets the countdown. + * @return the countdown + */ + public int getCountdown() { + return countdown; + } + + /** + * A party balloon. + * @author Vexia + */ + enum PartyBalloon { + YELLOW(115, 123), RED(116, 124), BLUE(117, 125), GREEN(118, 126), PURPLE(119, 127), WHITE(120, 128), GREEN_BLUE(121, 129), TRI(122, 130); + + /** + * The balloon id. + */ + private final int balloonId; + + /** + * The popping id. + */ + private final int popId; + + /** + * Constructs a new {@Code PartyBallon} {@Code Object} + * @param balloonId the balloon id. + * @param popId the pop id. + */ + private PartyBalloon(int balloonId, int popId) { + this.balloonId = balloonId; + this.popId = popId; + } + + /** + * Bursts a party balloon. + * @param player the player. + * @param object the object. + */ + public void burst(final Player player, final GameObject object) { + final GameObject popped = object.transform(popId); + if (!getBalloons().contains(object)) { + player.sendMessage("Error! Balloon not registered."); + return; + } + player.lock(2); + ObjectBuilder.remove(object); + ObjectBuilder.add(popped); + getBalloons().remove(object); + player.animate(Animation.create(10017)); + + // Pop a party balloon + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 0, 12); + + GameWorld.getPulser().submit(new Pulse(1) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + ObjectBuilder.remove(popped); + if (!player.getIronmanManager().isIronman() && RandomFunction.random(3) == 1) { + GroundItem ground = getGround(object.getLocation(), player); + if (ground != null) { + GroundItemManager.create(ground); + PartyRoomPlugin.getPartyChest().shift(); + PartyRoomPlugin.update(); + } + } + return true; + } + return false; + } + }); + } + + /** + * Gets the ground item. + * @param location the location. + * @param player the player. + * @return the ground item. + */ + private GroundItem getGround(Location location, Player player) { + final Item item = PartyRoomPlugin.getPartyChest().toArray()[RandomFunction.random(PartyRoomPlugin.getPartyChest().itemCount())]; + if (item == null) { + return null; + } + if (PartyRoomPlugin.getPartyChest().remove(item)) { + final Item dropItem; + int newamt; + if (item.getAmount() > 1) { + newamt = RandomFunction.random(1, item.getAmount()); + if (item.getAmount() - newamt > 0) { + Item newItem = new Item(item.getId(), item.getAmount() - newamt); + PartyRoomPlugin.getPartyChest().add(newItem); + } + dropItem = new Item(item.getId(), newamt); + } else { + dropItem = item; + } + return new GroundItem(dropItem, location, player); + } + return null; + } + + /** + * Gets a party balloon. + * @param id the id. + * @return the balloon. + */ + public static PartyBalloon forId(int id) { + for (PartyBalloon balloon : values()) { + if (balloon.getBalloonId() == id) { + return balloon; + } + } + return null; + } + + /** + * Gets the balloonId. + * @return the balloonId + */ + public int getBalloonId() { + return balloonId; + } + + /** + * Gets the popId. + * @return the popId + */ + public int getPopId() { + return popId; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/partyroom/ChestViewer.java b/Server/src/main/java/Server/core/game/content/activity/partyroom/ChestViewer.java new file mode 100644 index 000000000..d00ba8dd6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/partyroom/ChestViewer.java @@ -0,0 +1,330 @@ +package core.game.content.activity.partyroom; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.container.Container; +import core.game.container.ContainerEvent; +import core.game.container.ContainerListener; +import core.game.container.ContainerType; +import core.game.container.SortType; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +/** + * A chest viewer. + * @author Vexia + */ +public final class ChestViewer { + + /** + * The objects for the chest queue interface. + */ + private static final Object[] BEING_DROPPED = new Object[] { "", "", "", "", "", "", "", "", "", -1, 0, 39, 6, 92, 647 << 16 | 27 }; + + /** + * The objects for the dropping interface. + */ + private static final Object[] READY_TO_DROP = new Object[] { "", "", "", "", "", "", "", "", "", -1, 0, 39, 6, 91, 647 << 16 | 28 }; + + /** + * The objects for the accept interface. + */ + private static final Object[] ACCEPT = new Object[] { "", "", "", "", "Withdraw-X", "Withdraw-All", "Withdraw-10", "Withdraw-5", "Withdraw-1", -1, 0, 4, 10, 90, 647 << 16 | 29 }; + + /** + * The objects for the singletab. + */ + private final static Object[] INV_OPTIONS = new Object[] { "", "", "", "", "Deposit-X", "Deposit-All", "Deposit-10", "Deposit-5", "Deposit", -1, 0, 7, 4, 94, 648 << 16 }; + + /** + * The player viewing the chest. + */ + private final Player player; + + /** + * The container. + */ + private final DepositContainer container; + + /** + * Constructs a new {@Code ChestViewer} {@Code Object} + * @param player the player. + */ + public ChestViewer(Player player) { + this.player = player; + this.container = new DepositContainer(player); + } + + /** + * Views the chest. + */ + public ChestViewer view() { + container.open(); + player.getInventory().refresh(); + player.addExtension(ChestViewer.class, this); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", ACCEPT); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", INV_OPTIONS); + player.getInterfaceManager().openSingleTab(new Component(648)); + player.getInterfaceManager().open(new Component(647).setCloseEvent(new ChestCloseEvent())); + player.getConfigManager().set(1135, 0); + update(0, null); + update(1, null); + return this; + } + + /** + * Updates the chest viewer. + * @param type the type. + * @param event the event. + */ + public void update(int type, ContainerEvent event) { + if (event == null) { + player.getPacketDispatch().sendAccessMask(1278, 27, 647, 0, 10); + player.getPacketDispatch().sendAccessMask(1278, 28, 647, 0, 10); + player.getPacketDispatch().sendAccessMask(1278, 29, 647, 0, 10); + switch (type) { + case 0: + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", BEING_DROPPED); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 92, PartyRoomPlugin.getChestQueue().toArray(), 10, false)); + break; + case 1: + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", READY_TO_DROP); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 91, PartyRoomPlugin.getPartyChest().toArray(), 10, false)); + break; + case 2: + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", ACCEPT); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 90, new Item[] { new Item(4151, 2), new Item(11694, 2), new Item(4012, 2000) }, 10, false)); + break; + } + } + } + + /** + * Accepts the container. + */ + public void accept() { + if (PartyRoomPlugin.getChestQueue().itemCount() + getContainer().itemCount() > 215) { + player.sendMessage("The chest is full."); + return; + } + PartyRoomPlugin.getChestQueue().addAll(getContainer()); + getContainer().clear(); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 90, new Item[] {}, 10, false)); + PartyRoomPlugin.update(0, null); + PartyRoomPlugin.update(1, null); + } + + /** + * Gets the container. + * @return the container + */ + public DepositContainer getContainer() { + return container; + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * The close event for the chest interface. + * @author Vexia + */ + public class ChestCloseEvent implements CloseEvent { + + /** + * If the container has given back the items. + */ + private boolean given = false; + + @Override + public boolean close(Player player, Component c) { + if (!given) { + given = true; + player.getInventory().add(container.toArray()); + container.clear(); + player.removeExtension(ChestViewer.class); + player.getInterfaceManager().closeSingleTab(); + PartyRoomPlugin.getViewers().remove(player.getName()); + } + return true; + } + + } + + /** + * The container used when depositng items. + * @author Vexia + */ + public class DepositContainer extends Container { + + /** + * The player. + */ + private final Player player; + + /** + * The party deposit listener. + */ + private final PartyDepositListener listener; + + /** + * Constructs a new {@Code DepositContainer} {@Code + * Object} + * @param player the player. + */ + public DepositContainer(Player player) { + super(8, ContainerType.DEFAULT, SortType.ID); + super.getListeners().add(listener = new PartyDepositListener(player)); + this.player = player; + } + + /** + * Opens the container. + */ + public DepositContainer open() { + super.refresh(); + player.getInventory().getListeners().add(listener); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", ACCEPT); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", INV_OPTIONS); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 90, new Item[] {}, 10, false)); + return this; + } + + /** + * Adds an item to the container. + * @param slot The item slot. + * @param amount The amount. + */ + public void addItem(int slot, int amount) { + if (slot < 0 || slot > player.getInventory().capacity() || amount < 1) { + return; + } + Item item = player.getInventory().get(slot); + if (item == null) { + return; + } + int maximum = player.getInventory().getAmount(item); + if (amount > maximum) { + amount = maximum; + } + int maxCount = super.getMaximumAdd(item); + if (amount > maxCount) { + amount = maxCount; + if (amount < 1) { + player.getPacketDispatch().sendMessage("You must accept the current items before adding any more."); + return; + } + } + item = new Item(item.getId(), amount); + if (!item.getDefinition().isTradeable()) { + player.getPacketDispatch().sendMessage("You can't add that item to the chest."); + return; + } + if (super.add(item) && player.getInventory().remove(item)) { + listener.update(this, null); + player.getInventory().update(); + PartyRoomPlugin.update(0, null); + PartyRoomPlugin.update(1, null); + } + } + + /** + * Takes a item from the container and adds one to the inventory + * container. + * @param slot The slot. + * @param amount The amount. + */ + public void takeItem(int slot, int amount) { + if (slot < 0 || slot > super.capacity() || amount <= 0) { + return; + } + Item item = super.get(slot); + if (item == null) { + return; + } + int realAmt = item.getAmount(); + if (!item.getDefinition().isStackable()) { + for (Item i : container.toArray()) { + if (i == null) { + continue; + } + if (i != item && i.getId() == item.getId()) { + realAmt++; + } + } + } + if (amount > realAmt) { + amount = realAmt; + } + item = new Item(item.getId(), amount); + Item add = item; + int maxCount = player.getInventory().getMaximumAdd(add); + if (amount > maxCount) { + item.setAmount(maxCount); + add.setAmount(maxCount); + if (maxCount < 1) { + player.getPacketDispatch().sendMessage("Not enough space in your inventory."); + return; + } + } + if (super.remove(item)) { + player.getInventory().add(add); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 94, player.getInventory(), false)); + } + PartyRoomPlugin.update(0, null); + PartyRoomPlugin.update(1, null); + } + + /** + * Listeners to the part deposit container. + * @author Vexia + */ + private class PartyDepositListener implements ContainerListener { + + /** + * The player reference. + */ + private Player player; + + /** + * Constructs a new {@code PartyDepsositContainer.java} + * {@code Object}. + * @param player + */ + public PartyDepositListener(Player player) { + this.player = player; + } + + @Override + public void update(Container c, ContainerEvent event) { + if (c instanceof DepositContainer) { + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", ACCEPT); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", INV_OPTIONS); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 90, c.toArray(), 10, false)); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 94, player.getInventory(), false)); + player.getPacketDispatch().sendAccessMask(1278, 0, 648, 0, 28); + } + } + + @Override + public void refresh(Container c) { + if (c instanceof DepositContainer) { + player.getPacketDispatch().sendAccessMask(1278, 0, 648, 0, 28); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", ACCEPT); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", INV_OPTIONS); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 94, player.getInventory(), false)); + } + + } + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/partyroom/PartyRoomPlugin.java b/Server/src/main/java/Server/core/game/content/activity/partyroom/PartyRoomPlugin.java new file mode 100644 index 000000000..5e68ca3ff --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/partyroom/PartyRoomPlugin.java @@ -0,0 +1,372 @@ +package core.game.content.activity.partyroom; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.Container; +import core.game.container.ContainerEvent; +import core.game.content.dialogue.DialogueAction; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the party room. + * @author Vexia + */ +@Initializable +public final class PartyRoomPlugin extends OptionHandler { + + /** + * The constants of the object ids. + */ + private static final int CLOSED_CHEST = 26193, OPEN_CHEST = 2418, LEVER = 26194; + + /** + * The queued chest. + */ + private static final Container chestQueue = new Container(215); + + /** + * The items currently being dropped. + */ + private static final Container partyChest = new Container(215); + + /** + * The mapping of chest viewers. + */ + private static final Map viewers = new HashMap<>(); + + /** + * The balloon manager. + */ + private static final BalloonManager balloonManager = new BalloonManager(); + + /** + * If the knight dance is commenced. + */ + private static boolean dancing; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(CLOSED_CHEST).getHandlers().put("option:open", this); + ObjectDefinition.forId(OPEN_CHEST).getHandlers().put("option:deposit", this); + ObjectDefinition.forId(OPEN_CHEST).getHandlers().put("option:shut", this); + ObjectDefinition.forId(LEVER).getHandlers().put("option:pull", this); + PluginManager.definePlugin(new DepositInterfaceHandler()); + PluginManager.definePlugin(new BalloonManager()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case CLOSED_CHEST: + player.animate(Animation.create(536)); + ObjectBuilder.replace(node.asObject(), node.asObject().transform(OPEN_CHEST)); + break; + case OPEN_CHEST: + switch (option) { + case "deposit": + deposit(player); + break; + case "shut": + player.animate(Animation.create(535)); + ObjectBuilder.replace(node.asObject(), node.asObject().transform(CLOSED_CHEST)); + break; + } + break; + case LEVER: + handleLever(player, node.asObject()); + break; + } + return true; + } + + /** + * Updates the chest viewers. + * @param type the type. + * @param event the event. + */ + public static void update(int type, ContainerEvent event) { + for (ChestViewer viewer : viewers.values()) { + viewer.update(type, event); + } + } + + /** + * Updates the party room. + */ + public static void update() { + update(0, null); + update(1, null); + } + + /** + * Opens the deposit interface for the player. + * @param player the player. + */ + private void deposit(Player player) { + if (!viewers.containsKey(player.getName())) { + viewers.put(player.getName(), new ChestViewer(player).view()); + } else { + player.sendMessage("You are already viewing the chest!."); + } + } + + /** + * Commences the knightly dance. + */ + private void commenceDance() { + dancing = true; + final List npcs = new ArrayList(); + for (int i = 0; i < 6; i++) { + NPC npc = NPC.create(660, Location.create(3043 + i, 3378, 0)); + npc.init(); + npcs.add(npc); + } + GameWorld.getPulser().submit(new Pulse(1) { + int count = 0; + + @Override + public boolean pulse() { + switch (count) { + case 3: + npcs.get(3).sendChat("We're Knights of the Party Room"); + break; + case 6: + npcs.get(3).sendChat("We dance round and round like a loon"); + break; + case 8: + npcs.get(3).sendChat("Quite often we like to sing"); + break; + case 11: + npcs.get(3).sendChat("Unfortunately we make a din"); + break; + case 13: + npcs.get(3).sendChat("We're Knights of the Party Room"); + break; + case 16: + npcs.get(3).sendChat("Do you like our helmet plumes?"); + break; + case 18: + npcs.get(3).sendChat("Everyone's happy now we can move"); + break; + case 20: + npcs.get(3).sendChat("Like a party animal in the groove"); + break; + case 24: + dancing = false; + for (int i = 0; i < npcs.size(); i++) { + npcs.get(i).clear(); + } + break; + } + count++; + return false; + } + + }); + + } + + /** + * Handles the lever pulling. + * @param player the player. + * @param object the object. + */ + private void handleLever(Player player, GameObject object) { + player.lock(3); + player.faceLocation(object.getLocation()); + player.animate(Animation.create(6933), 1); + player.getDialogueInterpreter().sendOptions("Select an Option", "Ballon Bonanza (1000 coins).", "Nightly Dance (500 coins).", "No reward."); + player.getDialogueInterpreter().addAction(new DialogueAction() { + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 2: + if (isCluttered()) { + player.getDialogueInterpreter().sendDialogue("The floor is too cluttered at the moment."); + } else if (balloonManager.isCountingDown()) { + player.getDialogueInterpreter().sendDialogue("A count down has already begun."); + } else if (player.getInventory().contains(995, 1000)) { + balloonManager.start(); + player.getInventory().remove(new Item(995, 1000)); + } else { + player.getDialogueInterpreter().sendDialogue("Balloon Bonanza costs 1000 coins."); + } + break; + case 3: + if (isDancing()) { + player.getDialogueInterpreter().sendDialogue("The party room knights are already here!"); + } else if (player.getInventory().contains(995, 500)) { + commenceDance(); + player.getInventory().remove(new Item(995, 500)); + } else { + player.getDialogueInterpreter().sendDialogue("Nightly Dance costs 500 coins."); + } + break; + default: + break; + } + } + }); + } + + /** + * Checks if the knights are dancing. + * @return {@code True} if so. + */ + private boolean isDancing() { + return dancing; + } + + /** + * Checks if the floor is too cluttered. + * @return {@code True} if so. + */ + private boolean isCluttered() { + return balloonManager.isCluttered(); + } + + /** + * Gets the chestQueue. + * @return the chestQueue + */ + public static Container getChestQueue() { + return chestQueue; + } + + /** + * Gets the partyChest. + * @return the partyChest + */ + public static Container getPartyChest() { + return partyChest; + } + + /** + * Gets the viewers. + * @return the viewers + */ + public static Map getViewers() { + return viewers; + } + + /** + * Handles the deposit interface. + * @author Vexia + */ + public static final class DepositInterfaceHandler extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(647, this); + ComponentDefinition.put(648, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, final int slot, int itemId) { + final ChestViewer viewer = player.getExtension(ChestViewer.class); + if (viewer == null || viewer.getContainer() == null) { + player.getInterfaceManager().close(); + return true; + } + switch (component.getId()) { + case 648: + if (itemId == -1) { + if (player.getInventory().get(slot) != null) { + itemId = player.getInventory().get(slot).getId(); + } else { + return true; + } + } + switch (opcode) { + case 155: + viewer.getContainer().addItem(slot, 1); + break; + case 196: + viewer.getContainer().addItem(slot, 5); + break; + case 124: + viewer.getContainer().addItem(slot, 10); + break; + case 199: + int ammount = player.getInventory().getAmount(new Item(itemId)); + viewer.getContainer().addItem(slot, ammount); + break; + case 234: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + viewer.getContainer().addItem(slot, ammount); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount."); + break; + } + break; + case 647: + switch (button) { + case 25: + viewer.accept(); + return true; + } + if (itemId == -1 && viewer.getContainer().freeSlot() != 0) { + itemId = viewer.getContainer().get(slot).getId(); + } + switch (opcode) { + case 155: + viewer.getContainer().takeItem(slot, 1); + break; + case 196: + viewer.getContainer().takeItem(slot, 5); + break; + case 124: + viewer.getContainer().takeItem(slot, 10); + break; + case 199: + int ammount = viewer.getContainer().getAmount(new Item(itemId)); + viewer.getContainer().takeItem(slot, ammount); + break; + case 234: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + viewer.getContainer().takeItem(slot, ammount); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount."); + break; + } + break; + } + return true; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCIslandZone.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCIslandZone.java new file mode 100644 index 000000000..bd69e3f36 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCIslandZone.java @@ -0,0 +1,36 @@ +package core.game.content.activity.pestcontrol; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneRestriction; + +/** + * The Pest control island map zone extension. + * @author Emperor + */ +public final class PCIslandZone extends MapZone { + + /** + * Constructs a new {@code PCIslandZone} {@code Object}. + */ + public PCIslandZone() { + super("pest control island", true, ZoneRestriction.CANNON, ZoneRestriction.FIRES, ZoneRestriction.RANDOM_EVENTS); + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e instanceof Player) { // Ensure players can't die on the island. + // System.out.println("[PCIslandZone] Saved player from death!"); + e.getProperties().setTeleportLocation(e.getLocation()); + return true; + } + return false; + } + + @Override + public void configure() { + registerRegion(10537); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCLanderZone.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCLanderZone.java new file mode 100644 index 000000000..1cf770fc7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCLanderZone.java @@ -0,0 +1,103 @@ +package core.game.content.activity.pestcontrol; + +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneRestriction; + +/** + * The pest control lander zone handler. + * @author Emperor + */ +public final class PCLanderZone extends MapZone { + + /** + * The activities. + */ + private PestControlActivityPlugin[] activities; + + /** + * Constructs a new {@code PCLanderZone} {@code Object}. + * @param activities The activities. + */ + public PCLanderZone(PestControlActivityPlugin[] activities) { + super("pest control lander", true, ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.FIRES, ZoneRestriction.FOLLOWERS, ZoneRestriction.CANNON); + this.activities = activities; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GameObject) { + GameObject o = (GameObject) target; + switch (o.getId()) { + case 14314: // Novice exit ladder + if (activities[0].getWaitingPlayers().contains(e)) { + activities[0].getWaitingPlayers().remove(e); + e.getProperties().setTeleportLocation(activities[0].getLeaveLocation()); + } + return true; + case 25629: // Intermediate exit ladder + if (activities[1].getWaitingPlayers().contains(e)) { + activities[1].getWaitingPlayers().remove(e); + e.getProperties().setTeleportLocation(activities[1].getLeaveLocation()); + } + return true; + case 25630: // Veteran exit ladder + if (activities[2].getWaitingPlayers().contains(e)) { + activities[2].getWaitingPlayers().remove(e); + e.getProperties().setTeleportLocation(activities[2].getLeaveLocation()); + } + return true; + } + } + return false; + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (e instanceof Player && type != -1) { + for (PestControlActivityPlugin a : activities) { + if (a.getWaitingPlayers().contains(e)) { + ((Player) e).getPacketDispatch().sendMessage("The knights don't appreciate you teleporting off their craft!"); + return false; + } + } + } + return super.teleport(e, type, node); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player p = (Player) e; + if (p.getInterfaceManager().getComponent(407) != null) { + p.getInterfaceManager().closeOverlay(); + } + for (PestControlActivityPlugin a : activities) { + if (a.getWaitingPlayers().remove(e)) { + if (logout) { + e.getProperties().setTeleportLocation(a.getLeaveLocation()); + } + break; + } + } + } + return super.leave(e, logout); + } + + @Override + public void configure() { + ZoneBorders boatA = new ZoneBorders(2659, 2637, 2664, 2664); + ZoneBorders boatB = new ZoneBorders(2637, 2641, 2642, 2648); + ZoneBorders boatC = new ZoneBorders(2631, 2648, 2636, 2655); + + register(boatA); + register(boatB); + register(boatC); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCObjectHandler.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCObjectHandler.java new file mode 100644 index 000000000..eeec9e08e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCObjectHandler.java @@ -0,0 +1,305 @@ +package core.game.content.activity.pestcontrol; + +import core.cache.def.impl.ObjectDefinition; +import core.game.world.GameWorld; +import core.game.content.activity.ActivityManager; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import plugin.ai.pvmbots.PvMBotsBuilder; +import core.game.node.entity.player.info.Rights; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +import java.util.ArrayList; + +/** + * Handles pest control objects. + * @author Sir Kermit & Emperor + */ +public final class PCObjectHandler extends OptionHandler { + + //public boolean pcbotsSpawned = false; + public boolean PCnBotsSpawned = false; + public boolean PCiBotsSpawned = false; + public ArrayList playersJoined = new ArrayList<>(); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + // Barricades + ObjectDefinition.forId(14227).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14228).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14229).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14230).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14231).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14232).getHandlers().put("option:repair", this); + // Gates + ObjectDefinition.forId(14233).getHandlers().put("option:open", this); + ObjectDefinition.forId(14234).getHandlers().put("option:close", this); + ObjectDefinition.forId(14235).getHandlers().put("option:open", this); + ObjectDefinition.forId(14236).getHandlers().put("option:close", this); + ObjectDefinition.forId(14237).getHandlers().put("option:open", this); + ObjectDefinition.forId(14237).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14238).getHandlers().put("option:close", this); + ObjectDefinition.forId(14238).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14239).getHandlers().put("option:open", this); + ObjectDefinition.forId(14239).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14240).getHandlers().put("option:close", this); + ObjectDefinition.forId(14240).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14241).getHandlers().put("option:open", this); + ObjectDefinition.forId(14241).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14242).getHandlers().put("option:close", this); + ObjectDefinition.forId(14242).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14243).getHandlers().put("option:open", this); + ObjectDefinition.forId(14243).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14244).getHandlers().put("option:close", this); + ObjectDefinition.forId(14244).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14245).getHandlers().put("option:open", this); + ObjectDefinition.forId(14245).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14246).getHandlers().put("option:close", this); + ObjectDefinition.forId(14246).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14247).getHandlers().put("option:open", this); + ObjectDefinition.forId(14247).getHandlers().put("option:repair", this); + ObjectDefinition.forId(14248).getHandlers().put("option:close", this); + ObjectDefinition.forId(14248).getHandlers().put("option:repair", this); + // Towers + ObjectDefinition.forId(14296).getHandlers().put("option:climb", this); + // Lander crossing plank + ObjectDefinition.forId(14315).getHandlers().put("option:cross", this); + ObjectDefinition.forId(25631).getHandlers().put("option:cross", this); + ObjectDefinition.forId(25632).getHandlers().put("option:cross", this); + return this; + } + + /** + * Starts the pest control. + * @param p The player. + * @param name The name of the activity. + * @param destination The destination location (in the lander). + */ + private void startActivity(Player p, String name, Location destination) { + if (ActivityManager.start(p, name, false)) { + p.getPacketDispatch().sendMessage("You board the lander."); + p.getProperties().setTeleportLocation(destination); + } + } + + @Override + public boolean handle(Player player, Node node, String option) { + int pestBotsAmount = 0; + int pestBots2Amount = 0; + GameObject object = (GameObject) node; + if (option.equals("cross")) { + if (player.getFamiliarManager().hasFamiliar() && player.getRights() != Rights.ADMINISTRATOR) { + player.getPacketDispatch().sendMessage("You can't take a follower on the lander."); + return true; + } + switch (object.getId()){ + case 14315: // Novice + if (!GameWorld.getPCnBotsSpawned() && !player.isArtificial()) { //First person to join gets bots to play with + GameWorld.setPCnBotsSpawned(true); + for (pestBotsAmount = 0; pestBotsAmount <= 35; pestBotsAmount++) { + PvMBotsBuilder.createPestControlTestBot(new Location(2657, 2640)); + } + } + if (!playersJoined.contains(player.getUsername()) && !player.isArtificial()) { //You also get +1 bot for every friend + playersJoined.add(player.getUsername()); + } + + startActivity(player, "pest control novice", Location.create(2661, 2639, 0)); + return true; + case 25631: // Intermediate + if (!GameWorld.getPCiBotsSpawned() && !player.isArtificial()) { //First person to join gets bots to play with + GameWorld.setPCiBotsSpawned(true); + for (pestBots2Amount = 0; pestBots2Amount <= 50; pestBots2Amount++ ) { + PvMBotsBuilder.createPestControlTestBot2(new Location(2644, 2644)); + } + } + if (!playersJoined.contains(player.getUsername()) && !player.isArtificial()) { //You also get +1 bot for every friend + playersJoined.add(player.getUsername()); + } + + startActivity(player, "pest control intermediate", Location.create(2640, 2644, 0)); + return true; + case 25632: // Veteran + startActivity(player, "pest control veteran", Location.create(2634, 2653, 0)); + return true; + } + } + PestControlSession session = player.getExtension(PestControlSession.class); + if (session == null) { + return true; + } + if (object.getId() == 14296) { + handleTurretTower(player, session, object); + return true; + } + if (!object.isActive() || !session.getBarricades().contains(object)) { + return true; + } + if (option.equals("repair")) { // Handle barricades + repair(player, session, object, object.getId() - (object.getId() < 14233 ? 3 : 4)); + return true; + } + if (object.getId() > 14232) { + handleGates(player, session, object); + return true; + } + return false; + } + + /** + * Handles a turret tower ladder. + * @param player The player. + * @param session The session. + * @param object The object. + */ + private void handleTurretTower(Player player, PestControlSession session, GameObject object) { + int x = object.getLocation().getLocalX(); + int y = object.getLocation().getLocalY(); + if (x == 45 && y == 41) { + if (player.getLocation().getLocalX() < x + 1) { + player.getProperties().setTeleportLocation(session.getRegion().getBaseLocation().transform(x + 1, 41, 0)); + } else { + player.getProperties().setTeleportLocation(session.getRegion().getBaseLocation().transform(x - 1, 41, 0)); + } + } else if ((x == 42 || x == 23) && y == 26) { + if (player.getLocation().getLocalY() > 25) { + player.getProperties().setTeleportLocation(session.getRegion().getBaseLocation().transform(x, 25, 0)); + } else { + player.getProperties().setTeleportLocation(session.getRegion().getBaseLocation().transform(x, 27, 0)); + } + } else if (x == 20 && y == 41) { + if (player.getLocation().getLocalX() > 19) { + player.getProperties().setTeleportLocation(session.getRegion().getBaseLocation().transform(x - 1, 41, 0)); + } else { + player.getProperties().setTeleportLocation(session.getRegion().getBaseLocation().transform(x + 1, 41, 0)); + } + } + } + + /** + * Repairs an object. + * @param player The player. + * @param session The pest control session. + * @param object The game object to repair. + * @param newId The repaired object id. + */ + private void repair(Player player, PestControlSession session, GameObject object, int newId) { + if (!player.getInventory().contains(2347, 1)) { + player.getPacketDispatch().sendMessage("You'll need a hammer to make any repairs!"); + return; + } + if (!player.getInventory().remove(new Item(1511, 1))) { + player.getPacketDispatch().sendMessage("You'll need some logs to make any repairs!"); + return; + } + session.addZealGained(player, 5); + player.animate(Animation.create(898)); + if (session.getBarricades().remove(object)) { + GameObject replacement = object.transform(newId, object.getRotation(), getObjectType(newId)); + session.getBarricades().add(replacement); + ObjectBuilder.replace(object, replacement); + } + } + + /** + * Opens the gates. + * @param player The player. + * @param session The pest control session. + * @param object The game object. + */ + private static void handleGates(Player player, PestControlSession session, GameObject object) { + boolean open = (object.getId() % 2) != 0; + GameObject second = getSecondDoor(object); + if (second == null) { + return; + } + if (object.getId() > 14240 || second.getId() > 14240) { + player.getPacketDispatch().sendMessage("It's too damaged to be moved!"); + return; + } + int rotation = getRotation(object); + int dir = open ? object.getRotation() : rotation; + Direction direction = Direction.get(!open ? dir : ((3 + dir) % 4)); + if (session.getBarricades().contains(object) && session.getBarricades().contains(second)) { + session.getBarricades().remove(object); + session.getBarricades().remove(second); + + Location l = object.getLocation().transform(direction.getStepX(), direction.getStepY(), 0); + GameObject replacement = new GameObject(object.getId() + (open ? 1 : -1), l, 0, open ? rotation : ((direction.toInteger() + 3) % 4)); + ObjectBuilder.replace(object, replacement); + session.getBarricades().add(replacement); + + l = second.getLocation().transform(direction.getStepX(), direction.getStepY(), 0); + replacement = new GameObject(second.getId() + (open ? 1 : -1), l, 0, open ? getRotation(second) : ((direction.toInteger() + 3) % 4)); + ObjectBuilder.replace(second, replacement); + session.getBarricades().add(replacement); + } + } + + /** + * Gets the rotation for the given object. + * @param object The object. + * @return The rotation. + */ + private static final int getRotation(GameObject object) { + int id = object.getId(); + if (id > 14236) { + id -= 4; + } + switch (id) { + case 14233: + return (object.getRotation() + 1) % 4; + case 14234: + return object.getRotation() % 4; + case 14235: + return (object.getRotation() + 3) % 4; + case 14236: + return (object.getRotation() + 2) % 4; + } + return 0; + } + + /** + * Gets the second door. + * @param object The first door object. + * @return The second door object. + */ + public static GameObject getSecondDoor(GameObject object) { + Location l = object.getLocation(); + GameObject o = null; + if ((o = RegionManager.getObject(l.transform(-1, 0, 0))) != null && o.getName().equals(object.getName())) { + return o; + } + if ((o = RegionManager.getObject(l.transform(1, 0, 0))) != null && o.getName().equals(object.getName())) { + return o; + } + if ((o = RegionManager.getObject(l.transform(0, -1, 0))) != null && o.getName().equals(object.getName())) { + return o; + } + if ((o = RegionManager.getObject(l.transform(0, 1, 0))) != null && o.getName().equals(object.getName())) { + return o; + } + return null; + } + + /** + * Gets the object type for the given object id. + * @param objectId The object id. + * @return The object type. + */ + private static int getObjectType(int objectId) { + if (objectId == 14225 || objectId == 14226 || objectId == 14228 || objectId == 14229) { + return 9; + } + return 0; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCPortalNPC.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCPortalNPC.java new file mode 100644 index 000000000..d06639a04 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCPortalNPC.java @@ -0,0 +1,327 @@ +package core.game.content.activity.pestcontrol; + +import java.util.Random; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionPlane; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; +import core.game.content.activity.pestcontrol.monsters.PCRavagerNPC; +import core.game.content.activity.pestcontrol.monsters.PCSpinnerNPC; + +/** + * Handles the portal NPC. + * @author Emperor + */ +public final class PCPortalNPC extends AbstractNPC { + + /** + * The splatter NPCs. + */ + private static final int[][] SPLATTERS = { { 3727, 3728, 3729 }, // Novice + { 3728, 3729, 3730 }, // Intermediate + { 3729, 3730, 3731 }, // Veteran + }; + + /** + * The shifter NPCs. + */ + private static final int[][] SHIFTERS = { { 3732, 3733, 3734, 3735, 3736, 3737 }, // Novice + { 3734, 3735, 3736, 3737, 3738, 3739 }, // Intermediate + { 3736, 3737, 3738, 3739, 3740, 3741 }, // Veteran + }; + + /** + * The ravager NPCs. + */ + private static final int[][] RAVAGERS = { { 3742, 3743, 3744 }, // Novice + { 3743, 3744, 3745 }, // Intermediate + { 3744, 3745, 3746 }, // Veteran + }; + + /** + * The spinner NPCs. + */ + private static final int[][] SPINNERS = { { 3747, 3748, 3749 }, // Novice + { 3748, 3749, 3750 }, // Intermediate + { 3749, 3750, 3751 }, // Veteran + }; + + /** + * The torcher NPCs. + */ + private static final int[][] TORCHERS = { { 3752, 3753, 3754, 3755, 3756, 3757 }, // Novice + { 3754, 3755, 3756, 3757, 3758, 3759 }, // Intermediate + { 3756, 3757, 3758, 3759, 3760, 3761 }, // Veteran + }; + + /** + * The defiler NPCs. + */ + private static final int[][] DEFILERS = { { 3762, 3763, 3764, 3765, 3766, 3767 }, // Novice + { 3764, 3765, 3766, 3767, 3768, 3769 }, // Intermediate + { 3766, 3767, 3768, 3769, 3770, 3771 }, // Veteran + }; + + /** + * The brawler NPCs. + */ + private static final int[][] BRAWLERS = { { 3772, 3773, 3774 }, // Novice + { 3773, 3774, 3775 }, // Intermediate + { 3774, 3775, 3776 }, // Veteran + }; + + /** + * If the lifepoints should be updated. + */ + private boolean updateLifepoints = true; + + /** + * The pest control session. + */ + private PestControlSession session; + + /** + * The spinners. + */ + private PCSpinnerNPC[] spinners = new PCSpinnerNPC[3]; + + /** + * The brawlers. + */ + private NPC[] brawlers = new NPC[2]; + + + /** + * The portal ids? + */ + final static Integer[] portalIds = new Integer[] { 6142, 6143, 6144, 6145, 6146, 6147, 6148, 6149, + + 6150, 6151, 6152, 6153, 6154, 6155, 6156, 6157, + + 7551, 7552, 7553, 7554, 7555, 7556, 7557, 7558 }; + + /** + * Constructs a new {@code PCPortalNPC} {@code Object}. + */ + public PCPortalNPC() { + this(6142, null); + } + + /** + * Constructs a new {@code PCPortalNPC} {@code Object}. + * @param id The NPC id. + * @param l The location. + */ + public PCPortalNPC(int id, Location l) { + super(id, l); + } + + @Override + public void init() { + super.setWalks(false); + super.setRespawn(false); + super.getProperties().setRetaliating(false); + super.init(); + getProperties().setAttackAnimation(Animation.create(-1)); + getProperties().setDefenceAnimation(Animation.create(-1)); + getProperties().setDeathAnimation(Animation.create(-1)); + session = getExtension(PestControlSession.class); + } + + @Override + public void tick() { + super.tick(); + if (session != null) { + RegionPlane plane = getViewport().getCurrentPlane(); + if (plane != null && session.getTicks() % 35 - plane.getPlayers().size() == 0 && plane.getNpcs().size() < 100) { + spawnNPCs(); + } + if (updateLifepoints && session.getTicks() % 10 == 0) { + String color = getSkills().getLifepoints() > 50 ? "" : ""; + session.sendString(color + getSkills().getLifepoints(), 13 + getPortalIndex()); + updateLifepoints = false; + } + } + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + updateLifepoints = true; + super.onImpact(entity, state); + if (session != null && state != null && entity instanceof Player) { + int total = 0; + if (state.getEstimatedHit() > 0) { + total += state.getEstimatedHit(); + } + if (state.getSecondaryHit() > 0) { + total += state.getSecondaryHit(); + } + session.addZealGained((Player) entity, total); + } + } + + /** + * Spawns the NPCs. + */ + public void spawnNPCs() { + Direction dir = Direction.getLogicalDirection(getLocation(), session.getSquire().getLocation()); + int index = getDifficultyIndex(); + Random r = RandomFunction.RANDOM; + int amount = index + 1; + if (getViewport().getCurrentPlane() != null) { + amount += getViewport().getCurrentPlane().getPlayers().size() / 10; + } + if (getDifficultyIndex() == 0) { + amount += ((getDifficultyIndex() + 1) * 3) / 2; + } + for (int i = 0; i < amount; i++) { + int[] ids = SHIFTERS[index]; + switch (r.nextInt(7)) { + case 0: + ids = SPLATTERS[index]; + break; + case 1: + ids = SHIFTERS[index]; + break; + case 2: + ids = RAVAGERS[index]; + break; + case 3: + boolean spawn = false; + for (PCSpinnerNPC npc : spinners) { + if (npc == null || !npc.isActive()) { + spawn = true; + break; + } + } + if (spawn) { + ids = SPINNERS[index]; + } else { + ids = TORCHERS[index]; + } + break; + case 4: + ids = TORCHERS[index]; + break; + case 5: + ids = DEFILERS[index]; + break; + case 6: + spawn = false; + for (NPC npc : brawlers) { + if (npc == null || !npc.isActive()) { + spawn = true; + break; + } + } + if (spawn) { + ids = BRAWLERS[index]; + } else { + ids = DEFILERS[index]; + } + break; + } + int x = dir.getStepX() * 3; + int y = dir.getStepY() * 3; + if (x == 0) { + x = i; + } else { + y = i; + } + NPC n = session.addNPC(NPC.create(ids[r.nextInt(ids.length)], getLocation().transform(x, y, 0))); + if (ids == RAVAGERS[index]) { + ((PCRavagerNPC) n).setPortalIndex(getPortalIndex()); + } else if (ids == SPINNERS[index]) { + for (int j = 0; j < spinners.length; j++) { + if (spinners[j] == null || !spinners[j].isActive()) { + spinners[j] = ((PCSpinnerNPC) n).setPortalIndex(getPortalIndex()); + break; + } + } + } + n.setWalks(true); + n.setRespawn(false); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new PCPortalNPC(id, location); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (session != null) { + int value = 0; + boolean endSession = true; + for (int i = 0; i < 4; i++) { + if (!session.getPortals()[i].isActive()) { + value |= 1 << i; + } else { + endSession = false; + } + } + if (value > 0) { + session.sendConfig(value << 28); + if (endSession) { + session.getActivity().end(session, true); + return; + } + } + for (PCSpinnerNPC npc : spinners) { + if (npc != null && npc.isActive()) { + npc.explode(); + } + } + session.sendString("0", 13 + getPortalIndex()); + updateLifepoints = false; + session.getSquire().getSkills().heal(50); + session.getSquire().onImpact(this, null); + } + } + + @Override + public int[] getIds() { + return new int[] { 6142, 6143, 6144, 6145, 6146, 6147, 6148, 6149, + + 6150, 6151, 6152, 6153, 6154, 6155, 6156, 6157, + + 7551, 7552, 7553, 7554, 7555, 7556, 7557, 7558 }; + } + + /** + * The difficulty index. + * @return The index. + */ + public int getDifficultyIndex() { + if (getId() > 7550) { + return 2; + } + if (getId() > 6149) { + return 1; + } + return 0; + } + + /** + * The portal index. + * @return The index. + */ + public int getPortalIndex() { + if (getId() > 7550) { + return (getId() - 7551) % 4; + } + if (getId() > 6149) { + return (getId() - 6150) % 4; + } + return (getId() - 6142) % 4; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCSquireNPC.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCSquireNPC.java new file mode 100644 index 000000000..f237a506e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PCSquireNPC.java @@ -0,0 +1,96 @@ +package core.game.content.activity.pestcontrol; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the Squire NPC. + * @author Emperor + */ +public final class PCSquireNPC extends AbstractNPC { + + /** + * The pest control session. + */ + private PestControlSession session; + + /** + * If the amount of lifepoints should be updated. + */ + private boolean updateLifepoints; + + /** + * Constructs a new {@code PCSquireNPC} {@code Object}. + */ + public PCSquireNPC() { + super(3782, null, false); + } + + /** + * Constructs a new {@code PCSquireNPC} {@code Object}. + * @param id The npc id. + * @param location The spawn location. + */ + public PCSquireNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new PCSquireNPC(id, location); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (DeathTask.isDead(this) || entity instanceof Player) { + return false; + } + return true; + } + + @Override + public void init() { + super.setRespawn(false); + super.getProperties().setRetaliating(false); + super.init(); + super.getProperties().setDefenceAnimation(Animation.create(-1)); + super.getProperties().setDeathAnimation(Animation.create(-1)); + session = getExtension(PestControlSession.class); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + } + + @Override + public void tick() { + super.tick(); + if (updateLifepoints && session != null && (session.getTicks() % 10 == 0)) { + if (getSkills().getLifepoints() > 50) { + session.sendString(Integer.toString(getSkills().getLifepoints()), 1); + } else { + session.sendString("" + Integer.toString(getSkills().getLifepoints()), 1); + } + updateLifepoints = false; + } + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + updateLifepoints = true; + super.onImpact(entity, state); + } + + @Override + public int[] getIds() { + return new int[] { 3782, 3785 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlActivityPlugin.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlActivityPlugin.java new file mode 100644 index 000000000..2d66c3758 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlActivityPlugin.java @@ -0,0 +1,357 @@ +package core.game.content.activity.pestcontrol; + +import java.util.ArrayList; +import java.util.List; + +import core.ServerConstants; +import core.game.component.Component; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.PulseManager; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.state.EntityState; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.zone.RegionZone; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.plugin.Initializable; +import core.plugin.PluginManager; +import core.tools.RandomFunction; +import core.tools.StringUtils; +import core.game.content.activity.pestcontrol.monsters.*; + + +/** + * Handles the Pest Control activity. + * @author Emperor + */ +@Initializable +public final class PestControlActivityPlugin extends ActivityPlugin { + + /** + * The minimum team size. + */ + protected static final int MIN_TEAM_SIZE = 5; //GameWorld.getSettings().isDevMode() ? 1 : 5; + + /** + * The maximum team size. + */ + protected static final int MAX_TEAM_SIZE = 25; + + /** + * The amount of ticks passed. + */ + private int ticks; + + /** + * The boat type. + */ + private final BoatType type; + + /** + * The waiting players. + */ + private final List waitingPlayers = new ArrayList<>(); + + /** + * The active game sessions. + */ + private final List sessions = new ArrayList<>(); + + /** + * The game updating pulse. + */ + private final Pulse pulse = new Pulse(1) { + + @Override + public boolean pulse() { + sessions.removeIf(session -> session != null && session.update()); + ticks++; + if (waitingPlayers.size() >= MAX_TEAM_SIZE && ticks < 475) + { + ticks = 495; + } + if ((ticks < 450 && ticks % 100 == 0) || (ticks % 50 == 0) || ticks == 495) { + for (Player p : waitingPlayers) { + updateTime(p); + } + } + if (ticks >= 500) { + if (waitingPlayers.size() >= MIN_TEAM_SIZE) { + PestControlActivityPlugin.this.start(); + } else { + ticks = 400; + } + } + return false; + } + }; + + /** + * Starts a new pest control session. + */ + public void start() { + PestControlSession session = new PestControlSession(DynamicRegion.create(10536), this); + session.startGame(waitingPlayers); + session.getRegion().getRegionZones().add(new RegionZone(this, session.getRegion().getBorders())); + sessions.add(session); + ticks = 0; + updatePlayerCount(); + } + + /** + * Ends the pest control session. + * @param session The session to end. + * @param success If the mission was successful. + */ + public void end(PestControlSession session, boolean success) { + if (!session.isActive()) { + return; + } + for (final Player p : session.getRegion().getPlanes()[0].getPlayers()) { + p.getProperties().setTeleportLocation(getLeaveLocation()); + if (!success) { + p.getDialogueInterpreter().open(3781, true, 0, true); + // default, + // type, + // default + } else if (success && p.getAttribute("pc_zeal", 0) >= 50) { + int amount = type.ordinal() + 2; + p.getSavedData().getActivityData().increasePestPoints(amount); + Item coins = new Item(995, p.getProperties().getCurrentCombatLevel() * 10); + if (!p.getInventory().add(coins)) { + GroundItemManager.create(coins, p); + } + // default, type, name + p.getDialogueInterpreter().open(3781, true, 1, type.ordinal() == 0 ? "two" : type.ordinal() == 1 ? "three" : "four"); + } else { + // default type, default + p.getDialogueInterpreter().open(3781, true, 2, true); + } + p.removeAttribute("pc_zeal"); + p.removeExtension(PestControlSession.class); + p.fullRestore(); + if (p.getStateManager().hasState(EntityState.POISONED)) { + p.getStateManager().remove(EntityState.POISONED); + } + PulseManager.cancelDeathTask(p); + GameWorld.getPulser().submit(new Pulse(1, p) { + @Override + public boolean pulse() { + p.getSkills().restore(); + return true; + } + }); + } + session.getRegion().getRegionZones().clear(); + session.setActive(false); + } + + /** + * Gets the location the player should teleport to when leaving the game. + * @return {@code + */ + public Location getLeaveLocation() { + switch (type) { + case NOVICE: + return Location.create(2657, 2639, 0); + case INTERMEDIATE: + return Location.create(2644, 2644, 0); + case VETERAN: + return Location.create(2638, 2653, 0); + } + return ServerConstants.HOME_LOCATION; + } + + /** + * Constructs a new {@code PestControlActivityPlugin} {@code Object}. + */ + public PestControlActivityPlugin() { + this(BoatType.NOVICE); + } + + /** + * Constructs a new {@code PestControlActivityPlugin} {@code Object}. + * @param type The boat type. + */ + public PestControlActivityPlugin(BoatType type) { + super("pest control " + type.name().toLowerCase(), false, true, true, ZoneRestriction.CANNON); + this.type = type; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player p = (Player) e; + if (!logout) { + p.getInterfaceManager().closeOverlay(); + } else { + e.setLocation(getLeaveLocation()); + e.getProperties().setTeleportLocation(getLeaveLocation()); + } + waitingPlayers.remove(p); + updatePlayerCount(); + } + return super.leave(e, logout); + } + + @Override + public void register() { + if (type == BoatType.NOVICE) { + PestControlActivityPlugin[] activities = new PestControlActivityPlugin[] { this, new PestControlActivityPlugin(BoatType.INTERMEDIATE), new PestControlActivityPlugin(BoatType.VETERAN) }; + ActivityManager.register(activities[1]); + ActivityManager.register(activities[2]); + // Load abstract NPC plugins + PluginManager.definePlugin(new PCPortalNPC()); + PluginManager.definePlugin(new PCSquireNPC()); + PluginManager.definePlugin(new PCTorcherNPC()); + PluginManager.definePlugin(new PCDefilerNPC()); + PluginManager.definePlugin(new PCRavagerNPC()); + PluginManager.definePlugin(new PCShifterNPC()); + PluginManager.definePlugin(new PCSplatterNPC()); + PluginManager.definePlugin(new PCSpinnerNPC()); + PluginManager.definePlugin(new PCObjectHandler()); + PluginManager.definePlugin(new PestControlSquire()); + PluginManager.definePlugin(new VoidSealPlugin()); + ZoneBuilder.configure(new PCLanderZone(activities)); + ZoneBuilder.configure(new PCIslandZone()); + } + pulse.start(); + GameWorld.getPulser().submit(pulse); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + return super.interact(e, target, option); + } + + @Override + public boolean start(Player p, boolean login, Object... args) { + if (p.getProperties().getCurrentCombatLevel() < type.getRequirement() && p.getRights() != Rights.ADMINISTRATOR) { + p.getPacketDispatch().sendMessage("You need a combat level of " + type.getRequirement() + " or higher to board this lander."); + return false; + } + waitingPlayers.add(p); + openLanderInterface(p); + return true; + } + + /** + * Updates the lander interface. + * @param p The player. + */ + public void openLanderInterface(Player p) { + p.getInterfaceManager().openOverlay(new Component(407)); + updateTime(p); + updatePlayerCount(); + p.getPacketDispatch().sendString("Points: " + p.getSavedData().getActivityData().getPestPoints(), 407, 16); + p.getPacketDispatch().sendString(StringUtils.formatDisplayName(type.name()), 407, 3); + } + + /** + * Updates the current time left. + * @param p The player. + */ + public void updateTime(Player p) { + int ticks = 500 - this.ticks; + if (ticks > 99) { + p.getPacketDispatch().sendString("Next Departure: " + (ticks / 100) + " min", 407, 13); + } else if (ticks > 50) { + p.getPacketDispatch().sendString("Next Departure: 1 min", 407, 13); + } else { + p.getPacketDispatch().sendString("Next Departure: 30 seconds", 407, 13); + } + } + + /** + * Updates the player count for all players in the lander. + */ + public void updatePlayerCount() { + for (Player p : waitingPlayers) { + p.getPacketDispatch().sendString("Players Ready: " + waitingPlayers.size(), 407, 14); + } + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e instanceof Player && e.getViewport().getRegion().getRegionId() == 10536) { + PestControlSession session = e.getExtension(PestControlSession.class); + if (session != null) { + Location l = session.getRegion().getBaseLocation(); + e.getProperties().setTeleportLocation(l.transform(32 + RandomFunction.RANDOM.nextInt(4), 49 + RandomFunction.RANDOM.nextInt(6), 0)); + return true; + } + } + return super.death(e, killer); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return this; + } + + @Override + public Location getSpawnLocation() { + return ServerConstants.HOME_LOCATION; + } + + @Override + public void configure() { + registerRegion(10536); + } + + /** + * Gets the list of waiting players. + * @return The list of waiting players. + */ + public List getWaitingPlayers() { + return waitingPlayers; + } + + /** + * Gets the boat type. + * @return The boat type. + */ + public BoatType getType() { + return type; + } + + /** + * The boat types. + * @author Emperor + */ + public static enum BoatType { + + NOVICE(40), INTERMEDIATE(70), VETERAN(100); + + /** + * The combat level requirement. + */ + private final int requirement; + + /** + * Constructs a new {@code BoatType} {@code Object}. + * @param requirement The combat level requirement. + */ + BoatType(int requirement) { + this.requirement = requirement; + } + + /** + * Gets the requirement. + * @return The requirement. + */ + public int getRequirement() { + return requirement; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlHelper.kt b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlHelper.kt new file mode 100644 index 000000000..09ae781a0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlHelper.kt @@ -0,0 +1,72 @@ +package core.game.content.activity.pestcontrol + +import core.game.node.entity.player.Player +import core.game.world.map.Location +import core.game.world.map.zone.ZoneBorders +import plugin.ai.minigamebots.pestcontrol.PestControlTestBot +import plugin.ai.minigamebots.pestcontrol.PestControlTestBot2 +import kotlin.random.Random + + +object PestControlHelper { + var GATE_ENTRIES = listOf(14233, 14235) + var Portals_AttackableN = listOf(6142, 6143, 6144, 6145).toMutableList() + var Portals_AttackableI = listOf(6150, 6151, 6152, 6153).toMutableList() + var Portals_AttackableV = listOf(7551, 7552, 7553, 7554).toMutableList() + val portalIds = arrayOf( + 6142, 6143, 6144, 6145, 6146, 6147, 6148, 6149, + 6150, 6151, 6152, 6153, 6154, 6155, 6156, 6157, + 7551, 7552, 7553, 7554, 7555, 7556, 7557, 7558) + var PORTAL_ENTRIES = listOf(*portalIds) + val PestControlLanderIntermediate = Location.create(2644, 2646, 0) + val PestControlLanderNovice = Location.create(2657, 2642, 0) + val PestControlIslandLocation = Location.create(2659, 2676, 0) + val PestControlIslandLocation2 = Location.create(2659, 2676, 0) + + var pclocations = + if (Random.nextBoolean()){ Location.create(2667, 2653,0) + }else if (Random.nextBoolean()){ Location.create(2658, 2654, 0) + }else if (Random.nextBoolean()){ Location.create(2651, 2659, 0) + }else if(Random.nextBoolean()){ Location.create(2650, 2664,0) + }else{ Location.create(2665, 2660, 0) } + + ////////////Begin functions/////////////// + fun isInPestControlInstance(p: Player): Boolean { + return p.getAttribute("pc_zeal") != null + } + + enum class BoatInfo(var boatBorder: ZoneBorders, var outsideBoatBorder: ZoneBorders, var ladderId: Int) { + NOVICE(ZoneBorders(2660, 2638, 2663, 2643), ZoneBorders(2658, 2635, 2656, 2646), 14315), + INTERMEDIATE(ZoneBorders(2638, 2642, 2641, 2647), ZoneBorders(2645, 2639, 2643, 2652), 25631), + VETERAN(ZoneBorders(2632, 2649, 2635, 2654), ZoneBorders(2638, 2652, 2638, 2655), 25632); + } + + fun landerContainsLoc(l: Location?): Boolean { + for (i in BoatInfo.values()) if (i.boatBorder.insideBorder(l)) return true + return false + } + + fun outsideGangplankContainsLoc(l: Location?): Boolean { + for (i in BoatInfo.values()) if (i.outsideBoatBorder.insideBorder(l)) return true + return false + } + + fun landerContainsLoc2(l: Location?): Boolean { + for (n in BoatInfo.values()) if (n.boatBorder.insideBorder(l)) return true + return false + } + + fun outsideGangplankContainsLoc2(l: Location?): Boolean { + for (n in BoatInfo.values()) if (n.outsideBoatBorder.insideBorder(l)) return true + return false + } + + fun getMyPestControlSession1(p: PestControlTestBot): PestControlSession? { + return p.getExtension(PestControlSession::class.java) + } + + fun getMyPestControlSession2(p: PestControlTestBot2): PestControlSession? { + return p.getExtension(PestControlSession::class.java) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlSession.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlSession.java new file mode 100644 index 000000000..bf48fd08c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlSession.java @@ -0,0 +1,384 @@ +package core.game.content.activity.pestcontrol; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +import core.game.component.Component; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.ConfigurationManager.Configuration; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.map.Point; +import core.game.world.map.RegionPlane; +import core.game.world.map.build.DynamicRegion; +import core.tools.RandomFunction; + +import static core.game.content.activity.pestcontrol.PestControlActivityPlugin.MAX_TEAM_SIZE; + +/** + * Represents a pest control session. + * @author Emperor + */ +public final class PestControlSession { + + /** + * The barricade object offsets. + */ + private static final Point[] OBJECT_OFFSETS = { new Point(46, 33), new Point(46, 32), new Point(32, 25), new Point(33, 25), new Point(19, 32), new Point(19, 33), new Point(49, 33), new Point(49, 32), new Point(49, 31), new Point(49, 30), new Point(52, 27), new Point(52, 26), new Point(52, 25), new Point(52, 24), new Point(52, 14), new Point(52, 13), new Point(52, 12), new Point(52, 11), new Point(42, 18), new Point(43, 18), new Point(44, 18), new Point(45, 18), new Point(32, 15), new Point(33, 15), new Point(34, 15), new Point(35, 15), new Point(23, 18), new Point(24, 18), new Point(25, 18), new Point(26, 18), new Point(13, 11), new Point(13, 12), new Point(13, 13), new Point(13, 14), new Point(12, 28), new Point(12, 29), new Point(12, 30), new Point(12, 31), }; + + /** + * The object ids of non-attackable barricades/gates. + */ + public static final int[] INVALID_OBJECT_IDS = {14230, 14231, 14232, // Barricades + 14245, 14246, 14247, 14248, // Gates + }; + + /** + * The dynamic region. + */ + private final DynamicRegion region; + + /** + * The activity. + */ + private final PestControlActivityPlugin activity; + + /** + * The barricade & gate objects. + */ + private final List barricades = new ArrayList<>(); + + /** + * The amount of ticks. + */ + private int ticks; + + /** + * The squire. + */ + private NPC squire; + + /** + * List of attackable portals + */ + private final List aportals = new ArrayList<>(); + /** + * The portals. + */ + private final NPC[] portals = new NPC[4]; + + /** + * The ids. + */ + private Integer[] ids = new Integer[4]; + + /** + * If the session is active. + */ + private boolean active = true; + + /** + * Constructs a new {@code PestControlSession} {@code Object}. + * @param region The dynamic region. + * @param activity The pest control activity. + */ + public PestControlSession(DynamicRegion region, PestControlActivityPlugin activity) { + this.region = region; + this.activity = activity; + } + + /** + * Updates the session. + * @return {@code True} if the session has finished. + */ + public boolean update() { + if (!region.isActive()) { + return true; + } + if (squire != null && !squire.isActive()) { + activity.end(this, false); + return true; + } + if (ticks % 100 == 0) { + sendString(20 - (ticks / 100) + " min", 0); + } + switch (++ticks) { + case 50: // Drop first portal shield + case 100: // Drop second portal shield + case 150: // Drop third portal shield + case 200: // Drop fourth portal shield + int index = (ticks / 50) -1; + removePortalShield(ids[index]); + return false; + case 20_00: // End game. + activity.end(this, true); + return true; + } + return false; + } + + /** + * Sends a message to all the players in the region. + * @param message The message to send. + */ + public void sendMessage(String message) { + for (Player p : region.getPlanes()[0].getPlayers()) { + if (p.isActive()) { + p.getPacketDispatch().sendMessage(message); + } + } + } + + /** + * Sends a string on the interface to all players in the region. + * @param message The message to send. + * @param child The child id. + */ + public void sendString(String message, int child) { + for (Player p : region.getPlanes()[0].getPlayers()) { + if (p.isActive()) { + p.getPacketDispatch().sendString(message, 408, child); + } + } + } + + /** + * Adds zeal to the player's total amount. + * @param player The player. + * @param zeal The amount of zeal to add. + */ + public void addZealGained(Player player, int zeal) { + int total = zeal + player.getAttribute("pc_zeal", 0); + player.setAttribute("pc_zeal", total); + String col = total > 50 ? "" : ""; + if (total > 350) { + player.getPacketDispatch().sendString(col + "LOTS!", 408, 11); + } else { + player.getPacketDispatch().sendString(col + Integer.toString(total), 408, 11); + } + } + + /** + * Sends a string on the interface to all players in the region. + * @param value The message value to send. + */ + public void sendConfig(int value) { + for (Player p : region.getPlanes()[0].getPlayers()) { + if (p.isActive()) { + p.getConfigManager().set(Configuration.PC_PORTALS, value); + } + } + } + + /** + * Removes a portal shield. + * @param index The index. + */ + public void removePortalShield(int index) { + String message = null; + switch (index) { + case 0: // Western purple portal + message = "The purple, western portal shield has dropped!"; + break; + case 1: // Eastern blue portal + message = "The blue, eastern portal shield has dropped!"; + break; + case 2: // South-eastern yellow portal + message = "The yellow, south-eastern portal shield has dropped!"; + break; + case 3: // South-western red portal + message = "The red, south-western portal shield has dropped!"; + break; + } + for (Player p : region.getPlanes()[0].getPlayers()) { + if (p.isActive()) { + p.getPacketDispatch().sendInterfaceConfig(408, 18 + (index << 1), true); + p.getPacketDispatch().sendMessage(message); + } + } + squire.sendChat(message); + NPC portal = portals[index]; + + portal.reTransform(); + aportals.add(portal); + } + + /** + * Starts a game. + * @param waitingPlayers The list of waiting players. + */ + public void startGame(List waitingPlayers) { + region.flagActive(); + initBarricadesList(); + List list = new ArrayList<>(); + for (int i = 0; i < 4; i++) { + list.add(i); + } + Collections.shuffle(list, RandomFunction.RANDOM); + region.toggleMulticombat(); + region.setMusicId(588); + ids = list.toArray(new Integer[4]); + int count = 0; + String portalHealth = "" + (activity.getType().ordinal() == 0 ? 200 : 250); + for (Iterator it = waitingPlayers.iterator(); it.hasNext();) { + Player p = it.next(); + if (p.getSession().isActive()) { + if (++count > MAX_TEAM_SIZE) { + int priority = p.getAttribute("pc_prior", 0) + 1; + p.getPacketDispatch().sendMessage("You have been given priority level " + priority + " over other players in joining the next"); + p.getPacketDispatch().sendMessage("game."); + p.setAttribute("pc_prior", priority); + continue; + } + addPlayer(p, portalHealth); + } + it.remove(); + } + spawnNPCs(); + } + + /** + * Adds a player to the game session. + * @param p The player. + * @param portalHealth The portal health string. + */ + private void addPlayer(Player p, String portalHealth) { + p.lock(1); + p.setAttribute("pc_zeal", 0); + p.removeAttribute("pc_prior"); + p.addExtension(PestControlSession.class, this); + p.getInterfaceManager().openOverlay(new Component(408)); + p.getPacketDispatch().sendString("200", 408, 1); + for (int i = 0; i < 4; i++) { + p.getPacketDispatch().sendString(portalHealth, 408, 13 + i); + } + Random r = RandomFunction.RANDOM; + Location l = region.getBaseLocation(); + p.getProperties().setTeleportLocation(l.transform(32 + r.nextInt(4), 49 + r.nextInt(6), 0)); + p.getConfigManager().set(Configuration.PC_PORTALS, 0); + p.getDialogueInterpreter().sendDialogues(3781, FacialExpression.FURIOUS, "You must defend the Void Knight while the portals are", "unsummoned. The ritual takes twenty minutes though,", "so you can help out by destroying them yourselves!", "Now GO GO GO!"); + } + + /** + * Initializes the barricades list. + */ + private void initBarricadesList() { + RegionPlane p = region.getPlanes()[0]; + for (Point point : OBJECT_OFFSETS) { + barricades.add(p.getObjects()[point.getX()][point.getY()]); + } + } + + /** + * Spawns the portals & squire. + */ + private void spawnNPCs() { + Location l = region.getBaseLocation(); + int baseId = 6142; + if (activity.getType().ordinal() == 1) { + baseId = 6150; + } else if (activity.getType().ordinal() == 2) { + baseId = 7551; + } + portals[0] = NPC.create(baseId, l.transform(4, 31, 0)); + portals[1] = NPC.create(baseId + 1, l.transform(56, 28, 0)); + portals[2] = NPC.create(baseId + 2, l.transform(45, 10, 0)); + portals[3] = NPC.create(baseId + 3, l.transform(21, 9, 0)); + addNPC(squire = NPC.create(3782 + (RandomFunction.RANDOM.nextBoolean() ? 3 : 0), l.transform(32, 32, 0))); + for (NPC npc : portals) { + addNPC(npc); + npc.transform(npc.getId() + 4); + } + addNPC(NPC.create(3781, l.transform(30, 47, 0))); + } + + /** + * Adds an NPC. + * @param npc The NPC. + */ + public NPC addNPC(NPC npc) { + npc.addExtension(PestControlSession.class, this); + npc.init(); + return npc; + } + + /** + * Gets the ticks elapsed. + * @return The ticks. + */ + public int getTicks() { + return ticks; + } + + /** + * Gets the activity. + * @return The activity. + */ + public PestControlActivityPlugin getActivity() { + return activity; + } + + /** + * Gets the dynamic region. + * @return The region. + */ + public DynamicRegion getRegion() { + return region; + } + + /** + * Gets the squire. + * @return The squire. + */ + public NPC getSquire() { + return squire; + } + + /** + * Gets the portals. + * @return The portals. + */ + public NPC[] getPortals() { + return portals; + } + + /** + * Get portals that can be attacked. + * @return Attackable portals + */ + + public List getAportals() { + return aportals; + } + + + /** + * Gets the active. + * @return The active. + */ + public boolean isActive() { + return active; + } + + /** + * Sets the active. + * @param active The active to set. + */ + public void setActive(boolean active) { + this.active = active; + } + + /** + * Gets the barricades. + * @return The barricades. + */ + public List getBarricades() { + return barricades; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlSquire.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlSquire.java new file mode 100644 index 000000000..84a5510dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/PestControlSquire.java @@ -0,0 +1,49 @@ +package core.game.content.activity.pestcontrol; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.global.travel.ship.Ships; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Handles a pest control squire's options. + * @author Emperor + */ +public final class PestControlSquire extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(3781).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(3781).getHandlers().put("option:leave", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + NPC squire = (NPC) node; + PestControlSession session = squire.getExtension(PestControlSession.class); + switch (option) { + case "talk-to": + if (session == null) { + OptionHandler handler = NPCDefinition.getOptionHandlers().get(option); + handler.handle(player, node, option); + return true; + } else { + player.getDialogueInterpreter().open(3781, ((NPC) node), true); + } + return true; + case "leave": + if (session == null) { + Ships.PEST_TO_PORT_SARIM.sail(player); + return true; + } + player.getProperties().setTeleportLocation(session.getActivity().getLeaveLocation()); + return true; + } + return false; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/VoidSealPlugin.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/VoidSealPlugin.java new file mode 100644 index 000000000..f8d97511d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/VoidSealPlugin.java @@ -0,0 +1,69 @@ +package core.game.content.activity.pestcontrol; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; +import core.game.content.activity.pestcontrol.monsters.*; + +/** + * Handles the void knight seal. + * @author Emperor + */ +public final class VoidSealPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 0; i < 8; i++) { + ItemDefinition.forId(11666 + i).getHandlers().put("option:rub", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getViewport().getRegion().getRegionId() != 10536) { + player.getPacketDispatch().sendMessage("You can only use the seal in Pest Control."); + return true; + } + boolean operate = option.equals("operate"); + player.lock(1); + Item item = (Item) node; + // TODO: check if the seal is used in inventory or equipment operate. + player.getPacketDispatch().sendMessage("You unleash the power of the Void Knights!"); + Item replace = null; + if (item.getId() != 11673) { + replace = new Item(item.getId() + 1); + } + if (operate) { + player.getEquipment().replace(replace, item.getSlot()); + } else { + player.getInventory().replace(replace, item.getSlot()); + } + player.graphics(Graphics.create(1177)); + for (NPC npc : RegionManager.getLocalNpcs(player, 2)) { + if (canTarget(npc)) { + npc.getImpactHandler().manualHit(player, 7 + RandomFunction.randomize(5), HitsplatType.NORMAL, 1); + npc.graphics(Graphics.create(1176)); + } + } + return true; + } + + /** + * Checks if the NPC can be targeted. + * @param npc The NPC. + * @return {@code True} if so. + */ + private static boolean canTarget(NPC npc) { + return npc instanceof PCDefilerNPC || npc instanceof PCRavagerNPC || npc instanceof PCShifterNPC || npc instanceof PCSpinnerNPC || npc instanceof PCSplatterNPC || npc instanceof PCTorcherNPC; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCDefilerNPC.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCDefilerNPC.java new file mode 100644 index 000000000..1cc77a9fb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCDefilerNPC.java @@ -0,0 +1,110 @@ +package core.game.content.activity.pestcontrol.monsters; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.handlers.RangeSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.MapDistance; +import core.game.content.activity.pestcontrol.PestControlSession; + +/** + * Handles the Defiler NPCs. + * @author Emperor + */ +public final class PCDefilerNPC extends AbstractNPC { + + /** + * The pest control session. + */ + private PestControlSession session; + + /** + * The combat swing handler. + */ + private static final CombatSwingHandler SWING_HANDLER = new RangeSwingHandler() { + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + if (!isProjectileClipped(entity, victim, false)) { + return InteractionType.NO_INTERACT; + } + if (victim.getCenterLocation().withinDistance(entity.getCenterLocation(), 8) && isAttackable(entity, victim) != InteractionType.NO_INTERACT) { + if (victim.getLocation().withinDistance(entity.getLocation(), MapDistance.RENDERING.getDistance() / 2)) { + entity.getWalkingQueue().reset(); + } + return InteractionType.STILL_INTERACT; + } + return InteractionType.NO_INTERACT; + } + }; + + /** + * Constructs a new {@code PCDefilerNPC} {@code Object}. + */ + public PCDefilerNPC() { + super(3762, null); + } + + /** + * Constructs a new {@code PCDefilerNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public PCDefilerNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.setAggressive(true); + super.init(); + super.getDefinition().setCombatDistance(10); + super.walkRadius = 64; + getProperties().getCombatPulse().setStyle(CombatStyle.RANGE); + session = getExtension(PestControlSession.class); + } + + @Override + public void tick() { + super.tick(); + if (session != null && !inCombat() && !getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(session.getSquire()); + } + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + super.onImpact(entity, state); + if (session != null && state != null && entity instanceof Player) { + int total = 0; + if (state.getEstimatedHit() > 0) { + total += state.getEstimatedHit(); + } + if (state.getSecondaryHit() > 0) { + total += state.getSecondaryHit(); + } + session.addZealGained((Player) entity, total); + } + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return SWING_HANDLER; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new PCDefilerNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 3762, 3763, 3764, 3765, 3766, 3767, 3768, 3769, 3770, 3771 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.java new file mode 100644 index 000000000..516ffd6e4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCRavagerNPC.java @@ -0,0 +1,224 @@ +package core.game.content.activity.pestcontrol.monsters; + +import core.game.interaction.MovementPulse; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.MapDistance; +import core.game.world.map.path.Pathfinder; +import core.game.world.map.zone.ZoneBorders; +import core.tools.RandomFunction; +import core.game.content.activity.pestcontrol.PestControlSession; + +/** + * Handles the Ravager pest control NPC. + * @author Emperor + */ +public class PCRavagerNPC extends AbstractNPC { + + /** + * The current session. + */ + private PestControlSession session; + + /** + * Current object target to destroy. + */ + private GameObject target; + + /** + * The portal index. + */ + private int portalIndex; + + /** + * Next attack tick. + */ + private int nextAttack; + + /** + * The limitation borders. + */ + private ZoneBorders offLimits; + + /** + * Constructs a new {@code PCRavagerNPC} {@code Object}. + */ + public PCRavagerNPC() { + super(3742, null); + } + + /** + * Constructs a new {@code PCRavagerNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public PCRavagerNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new PCRavagerNPC(id, location); + } + + @Override + public void init() { + super.init(); + super.walkRadius = 64; + if ((session = getExtension(PestControlSession.class)) != null) { + Location l = session.getRegion().getBaseLocation(); + offLimits = new ZoneBorders(l.getX() + 20, l.getY() + 26, l.getX() + 44, l.getY() + 57); + } + } + + @Override + public void tick() { + super.tick(); + if (session != null && !getProperties().getCombatPulse().isAttacking()) { + if (target == null) { + if (findTarget()) { + getPulseManager().clear(); + walk(target); + } else if (!getPulseManager().hasPulseRunning() && RandomFunction.RANDOM.nextInt(10) < 2) { + if (offLimits.insideBorder(getLocation().getX(), getLocation().getY())) { + walk(session.getPortals()[portalIndex]); + } else { + walk(session.getSquire().getLocation()); + } + } + } else { + if (!target.isActive() || !session.getBarricades().contains(target)) { + attack(null); + } else if (nextAttack < GameWorld.getTicks() && getLocation().withinDistance(target.getLocation(), 1)) { + getPulseManager().clear(); + setWalks(false); + super.getWalkingQueue().reset(); + super.getLocks().lockMovement(2); + super.faceLocation(target.getLocation()); + super.animate(getProperties().getAttackAnimation()); + int newId = target.getId() + (target.getId() < 14233 ? 3 : 4); + boolean destroyed = !isTarget(newId); + int type = destroyed ? 22 : target.getType(); + final GameObject o = target; + final GameObject newTarget = o.transform(newId, o.getRotation(), type); + GameWorld.getPulser().submit(new Pulse(1, this, o) { + @Override + public boolean pulse() { + if (getViewport().getRegion().isActive() && session.getBarricades().remove(o)) { + session.getBarricades().add(newTarget); + ObjectBuilder.replace(o, newTarget); + } + return true; + } + }); + target = newTarget; + if (destroyed) { + attack(null); + } + nextAttack = GameWorld.getTicks() + 5; + } + } + } else { + attack(null); + } + getProperties().setRetaliating(target == null); + } + + /** + * Starts attacking a game object. + * @param o The object. + */ + private void attack(GameObject o) { + target = o; + if (o == null) { + setWalks(true); + super.faceLocation(null); + } + } + + /** + * Walks to the destination. + * @param destination The destination. + */ + private void walk(Node destination) { + getPulseManager().run(new MovementPulse(this, destination, Pathfinder.SMART) { + @Override + public boolean pulse() { + return true; + } + }, "movement"); + } + + /** + * Checks if the object id is a possible target. + * @param id The object id. + * @return {@code true} if so. + */ + private static boolean isTarget(int id) { + for (int object : PestControlSession.INVALID_OBJECT_IDS) { + if (id == object) { + return false; + } + } + return true; + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + super.onImpact(entity, state); + if (session != null && state != null && entity instanceof Player) { + int total = 0; + if (state.getEstimatedHit() > 0) { + total += state.getEstimatedHit(); + } + if (state.getSecondaryHit() > 0) { + total += state.getSecondaryHit(); + } + session.addZealGained((Player) entity, total); + } + } + + /** + * Finds an object target. + * @return {@code True} if a target was found. + */ + private boolean findTarget() { + for (GameObject o : session.getBarricades()) { + if (o.getLocation().withinDistance(getLocation(), MapDistance.RENDERING.getDistance() / 3) && isTarget(o.getId())) { + attack(o); + return true; + } + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 3742, 3743, 3744, 3745, 3746 }; + } + + /** + * Gets the portalIndex. + * @return The portalIndex. + */ + public int getPortalIndex() { + return portalIndex; + } + + /** + * Sets the portalIndex. + * @param portalIndex The portalIndex to set. + */ + public void setPortalIndex(int portalIndex) { + this.portalIndex = portalIndex; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCShifterNPC.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCShifterNPC.java new file mode 100644 index 000000000..329461964 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCShifterNPC.java @@ -0,0 +1,166 @@ +package core.game.content.activity.pestcontrol.monsters; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatPulse; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; +import core.game.content.activity.pestcontrol.PestControlSession; + +/** + * Handles the pest control shifter NPCs. + * @author Emperor + */ +public final class PCShifterNPC extends AbstractNPC { + + /** + * The pest control session. + */ + private PestControlSession session; + + /** + * The combat swing handler. + */ + private static final CombatSwingHandler SWING_HANDLER = new MeleeSwingHandler() { + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + // Allows for diagonal combat + return CombatStyle.RANGE.getSwingHandler().canSwing(entity, victim); + } + }; + + /** + * Constructs a new {@code PCShifterNPC} {@code Object}. + */ + public PCShifterNPC() { + super(3732, null); + } + + /** + * Constructs a new {@code PCShifterNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public PCShifterNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.setAggressive(true); + super.init(); + super.getDefinition().setCombatDistance(1); + super.walkRadius = 64; + getProperties().getCombatPulse().setStyle(CombatStyle.MELEE); + session = getExtension(PestControlSession.class); + } + + @Override + public void tick() { + super.tick(); + CombatPulse pulse = getProperties().getCombatPulse(); + if (session != null && !inCombat() && !pulse.isAttacking() && RandomFunction.RANDOM.nextInt(50) < 2) { + pulse.attack(session.getSquire()); + } + if (pulse.isAttacking() && !getLocation().withinDistance(pulse.getVictim().getLocation(), 5)) { + if (session == null || session.isActive()) { + teleport(session, this, getDestination(pulse.getVictim())); + } + } + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + super.onImpact(entity, state); + if (session != null && state != null && entity instanceof Player) { + int total = 0; + if (state.getEstimatedHit() > 0) { + total += state.getEstimatedHit(); + } + if (state.getSecondaryHit() > 0) { + total += state.getSecondaryHit(); + } + session.addZealGained((Player) entity, total); + } + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return SWING_HANDLER; + } + + /** + * Gets the destination location. + * @param victim The victim. + * @return The destination. + */ + private Location getDestination(Entity victim) { + List locations = new ArrayList<>(); + int radius = 2; + for (int x = -radius; x < radius + 1; x++) { + for (int y = -radius; y < radius + 1; y++) { + if (x != 0 && y != 0) { + locations.add(victim.getLocation().transform(x, y, 0)); + } + } + } + Collections.shuffle(locations, RandomFunction.RANDOM); + for (Location l : locations) { + if (RegionManager.isTeleportPermitted(l)) { + return l; + } + } + return null; + } + + /** + * Teleports the entity to the destination location. + * @param session The pest control session. + * @param entity The entity. + * @param destination The destination. + */ + public static void teleport(final PestControlSession session, final Entity entity, final Location destination) { + if (destination == null || session != null && destination.getRegionId() != session.getRegion().getId()) { + return; + } + Graphics.send(Graphics.create(654), entity.getLocation()); + entity.getProperties().setTeleportLocation(destination); + entity.getWalkingQueue().reset(); + entity.getLocks().lockMovement(2); + entity.lock(3); + GameWorld.getPulser().submit(new Pulse(1, entity) { + @Override + public boolean pulse() { + entity.animate(Animation.create(3904)); + Graphics.send(Graphics.create(654), destination); + return true; + } + }); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new PCShifterNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, 3741 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.java new file mode 100644 index 000000000..b842036d8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCSpinnerNPC.java @@ -0,0 +1,149 @@ +package core.game.content.activity.pestcontrol.monsters; + +import core.game.interaction.MovementPulse; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; +import core.game.content.activity.pestcontrol.PestControlSession; + +/** + * Handles a pest control spinner NPC. + * @author Emperor + */ +public final class PCSpinnerNPC extends AbstractNPC { + + /** + * The current session. + */ + private PestControlSession session; + + /** + * The portal index. + */ + private int portalIndex; + + /** + * Constructs a new {@code PCSpinnerNPC} {@code Object}. + */ + public PCSpinnerNPC() { + super(3747, null); + } + + /** + * Constructs a new {@code PCSpinnerNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public PCSpinnerNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.init(); + super.walkRadius = 4; + session = getExtension(PestControlSession.class); + } + + @Override + public void tick() { + super.tick(); + if (session != null && RandomFunction.RANDOM.nextInt(10) < 2) { + NPC portal = session.getPortals()[portalIndex]; + if (portal.isActive() && portal.getSkills().getLifepoints() > 0) { + if (portal.getSkills().getLifepoints() < portal.getSkills().getMaximumLifepoints()) { + if (getLocation().withinDistance(portal.getCenterLocation(), 5)) { + heal(); + } + getPulseManager().run(new MovementPulse(this, portal) { + @Override + public boolean pulse() { + return true; + } + }, "movement"); + } + } + } + } + + /** + * Heals the portal. + */ + public void heal() { + NPC portal = session.getPortals()[portalIndex]; + if (!portal.isActive() || portal.getSkills().getLifepoints() < 1) { + return; + } + faceTemporary(portal, 1); + visualize(new Animation(3911, Priority.HIGH), Graphics.create(658)); + portal.getSkills().heal(portal.getSkills().getMaximumLifepoints() / 10); + portal.onImpact(this, null); + } + + /** + * Handles the exploding of a spinner. + */ + public void explode() { + animate(getProperties().getDeathAnimation()); + for (Player p : RegionManager.getLocalPlayers(this, 1)) { + p.getImpactHandler().manualHit(this, 5, HitsplatType.POISON); + p.setAttribute("/save:poison_damage", 18); + p.getStateManager().register(EntityState.POISONED, false, 18, this); + } + GameWorld.getPulser().submit(new Pulse(1, this) { + @Override + public boolean pulse() { + clear(); + return true; + } + }); + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + super.onImpact(entity, state); + if (session != null && state != null && entity instanceof Player) { + int total = 0; + if (state.getEstimatedHit() > 0) { + total += state.getEstimatedHit(); + } + if (state.getSecondaryHit() > 0) { + total += state.getSecondaryHit(); + } + session.addZealGained((Player) entity, total); + } + } + + /** + * Sets the portal index. + * @param portalIndex The portal index. + * @return This instance, for chaining. + */ + public PCSpinnerNPC setPortalIndex(int portalIndex) { + this.portalIndex = portalIndex; + return this; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new PCSpinnerNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 3747, 3748, 3749, 3750, 3751 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCSplatterNPC.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCSplatterNPC.java new file mode 100644 index 000000000..ef7a8e84a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCSplatterNPC.java @@ -0,0 +1,165 @@ +package core.game.content.activity.pestcontrol.monsters; + +import java.util.ArrayList; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; +import core.game.content.activity.pestcontrol.PestControlSession; + +/** + * Handles the pest control splatter NPC. + * @author Emperor + */ +public final class PCSplatterNPC extends AbstractNPC { + + /** + * The current session. + */ + private PestControlSession session; + + /** + * If the splatter is exploding. + */ + private boolean exploding; + + /** + * Constructs a new {@code PCSplatterNPC} {@code Object}. + */ + public PCSplatterNPC() { + super(3727, null); + } + + /** + * Constructs a new {@code PCSplatterNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public PCSplatterNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.init(); + super.walkRadius = 64; + session = getExtension(PestControlSession.class); + } + + @Override + public void tick() { + super.tick(); + if (exploding || session == null) { + return; + } + if (getProperties().getCombatPulse().isAttacking()) { + return; + } + for (GameObject o : session.getBarricades()) { + if (o.getLocation().isNextTo(this)) { + commenceDeath(this); + break; + } + } + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + super.onImpact(entity, state); + if (session != null && state != null && entity instanceof Player) { + int total = 0; + if (state.getEstimatedHit() > 0) { + total += state.getEstimatedHit(); + } + if (state.getSecondaryHit() > 0) { + total += state.getSecondaryHit(); + } + session.addZealGained((Player) entity, total); + } + } + + @Override + public void commenceDeath(Entity killer) { + exploding = true; + visualize(new Animation(3888, Priority.VERY_HIGH), Graphics.create(649 + (getId() - 3727))); + GameWorld.getPulser().submit(new Pulse(1, this) { + @Override + public boolean pulse() { + explode(); + return true; + } + }); + } + + @Override + public void finalizeDeath(Entity killer) { + + } + + /** + * Handles the exploding of the splatter. + */ + private void explode() { + int maximum = getProperties().getCurrentCombatLevel() / 3; + int minimum = maximum / 2; + if (session != null) { + for (GameObject o : new ArrayList<>(session.getBarricades())) { + if (o.getLocation().isNextTo(this)) { + int newId = o.getId() + (o.getId() < 14233 ? 3 : 4); + boolean destroyed = !isTarget(newId); + final GameObject newTarget = o.transform(newId, o.getRotation(), destroyed ? 22 : o.getType()); + if (session.getBarricades().remove(o)) { + session.getBarricades().add(newTarget); + ObjectBuilder.replace(o, newTarget); + } + } + } + } + for (Player p : RegionManager.getLocalPlayers(this, 1)) { + p.getImpactHandler().manualHit(this, RandomFunction.random(minimum, maximum), null); + } + for (NPC npc : RegionManager.getLocalNpcs(this, 1)) { + if (npc != this) { + npc.getImpactHandler().manualHit(this, RandomFunction.random(minimum, maximum), null); + } + } + clear(); + } + + /** + * Checks if the object id is a possible target. + * @param id The object id. + * @return {@code true} if so. + */ + private static boolean isTarget(int id) { + for (int object : PestControlSession.INVALID_OBJECT_IDS) { + if (id == object) { + return false; + } + } + return true; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new PCSplatterNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 3727, 3728, 3729, 3730, 3731 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCTorcherNPC.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCTorcherNPC.java new file mode 100644 index 000000000..ac7d416e1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/monsters/PCTorcherNPC.java @@ -0,0 +1,145 @@ +package core.game.content.activity.pestcontrol.monsters; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.combat.handlers.MagicSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.map.Location; +import core.game.world.map.MapDistance; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.game.content.activity.pestcontrol.PestControlSession; + +/** + * Handles the torcher pest control NPC. + * @author Emperor + */ +public final class PCTorcherNPC extends AbstractNPC { + + /** + * The torcher spell. + */ + private static final TorcherSpell SPELL = new TorcherSpell(); + + /** + * The combat swing handler. + */ + private static final CombatSwingHandler SWING_HANDLER = new MagicSwingHandler() { + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + if (!isProjectileClipped(entity, victim, false)) { + return InteractionType.NO_INTERACT; + } + if (victim.getCenterLocation().withinDistance(entity.getCenterLocation(), 8) && isAttackable(entity, victim) != InteractionType.NO_INTERACT) { + if (victim.getLocation().withinDistance(entity.getLocation(), MapDistance.RENDERING.getDistance() / 2)) { + entity.getWalkingQueue().reset(); + } + return InteractionType.STILL_INTERACT; + } + return InteractionType.NO_INTERACT; + } + }; + + /** + * The pest control session. + */ + private PestControlSession session; + + /** + * Constructs a new {@code PCTorcherNPC} {@code Object}. + */ + public PCTorcherNPC() { + super(3752, null); + } + + /** + * Constructs a new {@code PCTorcherNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public PCTorcherNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.setAggressive(true); + super.init(); + super.getDefinition().setCombatDistance(10); + super.walkRadius = 64; + getProperties().getCombatPulse().setStyle(CombatStyle.MAGIC); + super.getProperties().setAutocastSpell(SPELL); + session = getExtension(PestControlSession.class); + } + + @Override + public void tick() { + super.tick(); + if (session != null && !inCombat() && !getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(session.getSquire()); + } + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + super.onImpact(entity, state); + if (session != null && state != null && entity instanceof Player) { + int total = 0; + if (state.getEstimatedHit() > 0) { + total += state.getEstimatedHit(); + } + if (state.getSecondaryHit() > 0) { + total += state.getSecondaryHit(); + } + session.addZealGained((Player) entity, total); + } + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return SWING_HANDLER; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new PCTorcherNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 3752, 3753, 3754, 3755, 3756, 3757, 3758, 3759, 3760, 3761 }; + } + +} + +class TorcherSpell extends CombatSpell { + + /** + * Constructs a new {@code TorcherSpell} {@code Object}. + */ + public TorcherSpell() { + super(SpellType.STRIKE, SpellBook.MODERN, 0, 0.0, -1, -1, new Animation(3882, Priority.HIGH), Graphics.create(646), Projectile.create((Entity) null, null, 647, 40, 36, 52, 75, 15, 11), new Graphics(648, 96)); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return entity.getProperties().getCurrentCombatLevel() / 7; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + return this; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.java new file mode 100644 index 000000000..6d608a87d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/reward/PCIslandOptionPlugin.java @@ -0,0 +1,37 @@ +package core.game.content.activity.pestcontrol.reward; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the option plugin used to handle the pc island related nodes. + * @author 'Vexia + */ +@Initializable +public final class PCIslandOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : new int[] { 3786, 3788, 3789, 5956 }) { + NPCDefinition.forId(id).getHandlers().put("option:exchange", this); + } + PluginManager.definePlugin(new PCRewardInterface()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "exchange": + PCRewardInterface.open(player); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/reward/PCRewardInterface.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/reward/PCRewardInterface.java new file mode 100644 index 000000000..4aabf0858 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/reward/PCRewardInterface.java @@ -0,0 +1,755 @@ +package core.game.content.activity.pestcontrol.reward; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.herblore.Herbs; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the pest control reward interface. + * @author 'Vexia + */ +public final class PCRewardInterface extends ComponentPlugin { + + /** + * Represents the red colour. + */ + public static final String RED = ""; + + /** + * Represents the green colour. + */ + public static final String GREEN = ""; + + /** + * Represents the white colour. + */ + public static final String WHITE = ""; + + /** + * Represents the skill headers ordered by skill index. + */ + public static final int[] SKILL_HEADER = new int[] { 10, 12, 11, 15, 13, 16, 14 }; + + /** + * Represents the skill array of exp rewards. + */ + public static final int[] SKILL_ARRAY = new int[] { Skills.ATTACK, Skills.STRENGTH, Skills.DEFENCE, Skills.RANGE, Skills.MAGIC, Skills.HITPOINTS, Skills.PRAYER }; + + /** + * Represents the skill options array. + */ + public static final int[] SKILL_POINTS = new int[] { 1, 10, 100 }; + + /** + * Represents the charm points. + */ + public static final int[] CHARM_POINTS = new int[] { 2, 28, 56 }; + + /** + * Represents the amount of charms to get the from the points. + */ + public static final int[] CHARM_AMOUNTS = new int[] { 1, 14, 28 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(267).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 96: + confirm(player); + return true; + default: + if (button >= 34 && button <= 86) { + if (player.getSavedData().getActivityData().getPestPoints() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough points."); + return true; + } + select(player, button); + } + break; + } + return true; + } + + /** + * Method used to open the pest control reward interface. + * @param player the player. + */ + public static void open(final Player player) { + player.removeAttribute("pc-reward"); + sendString(player, "Points: " + player.getSavedData().getActivityData().getPestPoints(), 105); + clear(player); + player.getInterfaceManager().open(new Component(267)); + } + + /** + * Method used to send the skill headers. + * @param player the player. + */ + private static final void sendSkills(final Player player) { + for (int skill : SKILL_ARRAY) { + sendString(player, getSkillCondition(player, skill), getSkillChild(skill)); + } + } + + /** + * Method used to send a string onto this interface. + * @param player the player instance. + * @param string the string to send. + * @param child the child to send it on. + */ + private static final void sendString(final Player player, String string, int child) { + player.getPacketDispatch().sendString(string, 267, child); + } + + /** + * Method used to select a reward. + * @param player the player. + * @param button the button. + */ + public void select(final Player player, final int button) { + final Reward reward = Reward.forButton(button); + final int option = reward.getOption(button); + if (!reward.checkRequirements(player, option)) { + return; + } + cacheReward(player, reward, option); + } + + /** + * Method used to selected the current reward. + * @param player the player. + */ + public boolean deselect(final Player player) { + return deselect(player, getReward(player)); + } + + /** + * Method used to deselect the reward. + * @param player the player. + * @param reward the reward. + */ + public boolean deselect(final Player player, final Reward reward) { + if (reward == null) { + return false; + } + clear(player); + reward.deselect(player, getCachedOption(player)); + return true; + } + + /** + * Method used to cache the reward. + * @param player + */ + public final void cacheReward(final Player player, final Reward reward, final int option) { + deselect(player);// delect any previous ones. + reward.select(player, option); + sendString(player, "Confirm:", 106); + sendString(player, reward.getName(), 104); + player.setAttribute("pc-reward", reward); + player.setAttribute("pc-reward:option", option); + } + + /** + * Method used to clear the interface with new data. + * @param player the player. + */ + public final static void clear(final Player player) { + sendSkills(player); + for (Reward reward : Reward.values()) { + if (reward.isSkillReward()) { + continue; + } + if (reward.charm) { + sendString(player, (player.getSavedData().getActivityData().getPestPoints() < 2 ? RED + "You need 2 points." : GREEN + reward.getName()), reward.getHeader()); + continue; + } + sendString(player, (player.getSavedData().getActivityData().getPestPoints() < reward.getPoints() ? player.getSavedData().getActivityData().getPestPoints() < 1 ? RED + ("You need at least 1 point.") : RED + ("You need " + reward.getPoints() + " points.") : (GREEN + reward.getName())), reward.getHeader()); + } + } + + /** + * Method used to calculate the experience the player can recieve in this + * skill. + * @param player the player. + * @return the experience as an integer. + */ + public static double calculateExperience(final Player player, final int skillId) { + int level = player.getSkills().getStaticLevel(skillId); + double divideBy = 30;//17.5-33 ideal range + if (skillId == Skills.PRAYER) { + divideBy = 67;// 34-75 ideal range + } else if (skillId == Skills.MAGIC || skillId == Skills.RANGE) { + divideBy = 29;//19.1-31 ideal range + } + return (int) ((level * level) / divideBy) * (player.getSkills().experienceMutiplier / 2); + } + + /** + * Method used to get the skill condition string to send. + * @param player the player. + * @param skillId the skillId. + * @return the string to send. + */ + public static final String getSkillCondition(final Player player, final int skillId) { + if (player.getSkills().getStaticLevel(skillId) < 25) { + return RED + "Must reach level 25 first."; + } + return GREEN + getSkillXp(player, skillId); + } + + /** + * Method used to get the skill experience string. + * @param player the player. + * @param skillId the skill id. + * @return the string. + */ + public static String getSkillXp(final Player player, int skillId) { + return Skills.SKILL_NAME[skillId] + " - " + (int) calculateExperience(player, skillId) + " xp"; + } + + /** + * Method used to get the skill header by the index. + * @param skill the skill index. + * @return the skill child id. + */ + public static final int getSkillChild(final int skill) { + return SKILL_HEADER[skill]; + } + + /** + * Method used to get the current reward. + * @param player the player. + * @return the reward. + */ + public static Reward getReward(final Player player) { + return player.getAttribute("pc-reward", null); + } + + /** + * Method used to check if the player has a reward set. + * @param player the player. + * @return the reward. + */ + public static boolean hasReward(final Player player) { + return getReward(player) != null; + } + + /** + * Method used to get the pest control reward option index. + * @param player the player. + * @return the option index. + */ + public static int getCachedOption(final Player player) { + return player.getAttribute("pc-reward:option", 0); + } + + /** + * Method used to confirm the reward. + * @param player the player. + */ + public final void confirm(final Player player) { + if (!hasReward(player)) { + player.getPacketDispatch().sendMessage("Please choose a reward."); + return; + } + final Reward reward = getReward(player); + if ((reward.charm || !reward.isSkillReward()) && player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return; + } + final int option = getCachedOption(player); + final int points = reward.getPoints(option); + String message; + player.getInterfaceManager().close(); + if (player.getSavedData().getActivityData().getPestPoints() >= points) { + player.getSavedData().getActivityData().decreasePestPoints(points); + if (reward.isSkillReward()) { + final double experience = ((int) calculateExperience(player, reward.getSkill()) * points); + player.getSkills().addExperience(reward.getSkill(), experience); + message = "The Void Knight has granted you " + (int) (experience * player.getSkills().experienceMutiplier) + " " + reward.getName() + "."; + } else { + if (!reward.checkItemRequirement(player, option)) { + return; + } + if (!reward.charm) { + if (reward.getReward().length > 1) { + Item[] pack = reward.constructPack(); + for (Item i : pack) { + if (!player.getInventory().add(i)) { + GroundItemManager.create(i, player); + } + } + } else { + if (!player.getInventory().add(reward.getReward()[0])) { + GroundItemManager.create(reward.getReward()[0], player); + } + } + } else { + Item charm = new Item(reward.getReward()[0].getId()); + int amt = CHARM_AMOUNTS[option - 1]; + for (int i = 0; i < amt; i++) { + if (!player.getInventory().add(charm)) { + GroundItemManager.create(charm, player); + } + } + } + message = "The Void Knight has given you a " + reward.getName() + "."; + } + player.getDialogueInterpreter().sendDialogue(message, "Remaining Void Knight Commendation Points: " + player.getSavedData().getActivityData().getPestPoints()); + } + } + + /** + * Represents the rewards that are obtainable with this interface. + * @author 'Vexia + */ + public enum Reward { + ATTACK(Skills.ATTACK, new int[] { 10, 34, 49, 56 }), STRENGTH(Skills.STRENGTH, new int[] { 11, 35, 50, 57 }), DEFENCE(Skills.DEFENCE, new int[] { 12, 36, 51, 58 }), RANGE(Skills.RANGE, new int[] { 13, 37, 52, 59 }), MAGIC(Skills.MAGIC, new int[] { 14, 38, 53, 60 }), HITPOINTS(Skills.HITPOINTS, new int[] { 15, 39, 54, 61 }), PRAYER(Skills.PRAYER, new int[] { 16, 40, 55, 62 }), HERB_PACK("Herb Pack", 30, new Item[] { Herbs.HARRALANDER.getHerb(), Herbs.RANARR.getHerb(), Herbs.TOADFLAX.getHerb(), Herbs.IRIT.getHerb(), Herbs.AVANTOE.getHerb(), Herbs.KWUARM.getHerb(), Herbs.GUAM.getHerb(), Herbs.MARRENTILL.getHerb() }, new int[] { 32, 45 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + if (player.getSkills().getLevel(Skills.HERBLORE) < 25) { + player.getPacketDispatch().sendMessage("You need level 25 herblore to purchase this pack."); + return false; + } + return true; + } + }, + MINERAL_PACK("Mineral Pack", 15, new Item[] { new Item(453), new Item(440) }, new int[] { 47, 46 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + if (player.getSkills().getLevel(Skills.MINING) < 25) { + player.getPacketDispatch().sendMessage("You need level 25 mining to purchase this pack."); + return false; + } + return true; + } + }, + SEED_PACK("Seed Pack", 15, new Item[] { new Item(5320), new Item(5322), new Item(5100) }, new int[] { 33, 48 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + if (player.getSkills().getLevel(Skills.FARMING) < 25) { + player.getPacketDispatch().sendMessage("You need level 25 farming to purchase this pack."); + return false; + } + return true; + } + }, + VOID_MACE("Void Knight Mace", 250, new Item[] { new Item(8841) }, new int[] { 28, 41 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + return hasVoidSkills(player); + } + }, + VOID_TOP("Void Knight Top", 250, new Item[] { new Item(8839) }, new int[] { 29, 42 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + return hasVoidSkills(player); + } + }, + VOID_ROBES("Void Knight Robes", 250, new Item[] { new Item(8840) }, new int[] { 30, 43 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + return hasVoidSkills(player); + } + }, + VOID_GLOVES("Void Knight Gloves", 150, new Item[] { new Item(8842) }, new int[] { 31, 44 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + return hasVoidSkills(player); + } + }, + VOID_MAGE_HELM("Void Knight Mage Helm", 200, new Item[] { new Item(11663) }, new int[] { 63, 67 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + return hasVoidSkills(player); + } + }, + VOID_RANGER_HELM("Void Knight Ranger Helm", 200, new Item[] { new Item(11664) }, new int[] { 64, 68 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + return hasVoidSkills(player); + } + }, + VOID_MELEE_HELM("Void Knight Melee Helm", 200, new Item[] { new Item(11665) }, new int[] { 65, 69 }) { + @Override + public boolean checkItemRequirement(final Player player, final int option) { + return hasVoidSkills(player); + } + }, + VOID_KNIGHT_SEAL("Void Knight Seal", 10, new Item[] { new Item(11666) }, new int[] { 66, 70 }), SPINNER_CHARM("Spinner Charm", new Item(12166), 71, 75, 76, 77), RAVAGER_CHARM("Ravager Charm", new Item(12164), 72, 81, 82, 83), TORCHER_CHARM("Torcher Charm", new Item(12167), 74, 78, 79, 80), SHIFTER_CHAR("Shifter Charm", new Item(12165), 73, 84, 85, 86); + + /** + * Represents the void required skills. + */ + private final int[] VOID_SKILLS = new int[] { Skills.HITPOINTS, Skills.ATTACK, Skills.DEFENCE, Skills.STRENGTH, Skills.RANGE, Skills.MAGIC, Skills.PRAYER }; + + /** + * Represents the childs(header, pts). + */ + private final int[] childs; + + /** + * Represents the skill id. + */ + private int skill; + + /** + * Represents the reward items. + */ + private Item[] reward; + + /** + * Represents the reward name. + */ + private String name; + + /** + * Represents the points required for this reward. + */ + private int points; + + /** + * Represents if the reward is a charm. + */ + private boolean charm = false; + + /** + * Constructs a new {@code PCRewardInterface} {@code Object}. + * @param childs the childs. + */ + Reward(final int[] childs) { + this.childs = childs; + } + + /** + * Constructs a new {@code PCRewardInterface} {@code Object}. + * @param skill the skill. + * @param childs the childs. + */ + Reward(int skill, final int[] childs) { + this.skill = skill; + this.childs = childs; + } + + /** + * Constructs a new {@code PCRewardInterfacce} {@code Object}. + * @param name the name. + * @param points the points. + * @param childs the childs. + */ + Reward(String name, int points, final Item[] reward, final int[] childs) { + this.name = name; + this.points = points; + this.reward = reward; + this.childs = childs; + } + + /** + * Constructs a new {@code PCRewardInterface} {@code Object}. + * @param name the name. + * @param charm the charm. + * @param childs the child. + */ + Reward(final String name, final Item charm, final int... childs) { + this.name = name; + this.charm = true; + this.reward = new Item[] { charm }; + this.childs = childs; + } + + /** + * Method used to check the requirements of a reward. + * @param player the player. + * @param option the option. + * @return True if so. + */ + public boolean checkRequirements(final Player player, final int option) { + if (player.getSavedData().getActivityData().getPestPoints() < getPoints(option)) { + player.getPacketDispatch().sendMessage("You don't have enough points."); + return false; + } + return isSkillReward() ? checkSkillRequirement(player, option) : checkItemRequirement(player, option); + } + + /** + * Method used to select a reward. + * @param player the player. + * @param option the option. + */ + public void select(final Player player, final int option) { + if (isSkillReward()) { + skillSelect(player, option); + } else { + itemSelect(player, option); + } + } + + /** + * Method used to delect a reward. + * @param player the player. + * @param option the option. + */ + public void deselect(final Player player, final int option) { + if (isSkillReward()) { + skillDeselect(player, option); + } else { + itemDeselect(player, option); + } + } + + /** + * Method used to select a skill. + * @param player the player. + * @param option the option index. + */ + public final void skillSelect(final Player player, final int option) { + sendString(player, WHITE + getSkillXp(player, skill), getHeader()); + sendString(player, WHITE + getOptionString(option), getChilds()[option]); + } + + /** + * Method used to handle the item select. + * @param player the player. + * @param option the option. + */ + public final void itemSelect(final Player player, final int option) { + sendString(player, WHITE + getName(), getHeader()); + if (charm) { + sendString(player, WHITE + getOptionString(option), getChilds()[option]); + } + } + + /** + * Method used to deselect a skill. + * @param player the player. + * @param option the option. + */ + public final void skillDeselect(final Player player, final int option) { + sendString(player, "" + getOptionString(option), getChilds()[option]); + } + + /** + * Method used to handle the item deselect. + * @param player the player. + * @param option the option. + */ + public final void itemDeselect(final Player player, final int option) { + if (charm) { + sendString(player, "" + getOptionString(option), getChilds()[option]); + } + } + + /** + * Method used to get the option string. + * @param option the option index. + * @return the string. + */ + public String getOptionString(int option) { + if (charm) { + return (option == 1 ? "(2 Pts)" : option == 2 ? "(28 Pts)" : "(56 Pts)"); + } + return (option == 1 ? "(1 Pt)" : option == 2 ? "(10 Pts)" : "(100 Pts)"); + } + + /** + * Method used to get the option choosen. + * @param button the button. + * @return the optopms. + */ + public int getOption(int button) { + int index = 0; + for (int i : getChilds()) { + if (i == button) { + return index; + } + index++; + } + return -1; + } + + /** + * Gets the amt of required points. + * @return the points. + */ + public int getPoints(final int option) { + if (charm) { + return CHARM_POINTS[option - 1]; + } + return isSkillReward() ? SKILL_POINTS[option - 1] : getPoints(); + } + + /** + * Method used to check if the player has the skills to buy void. + * @param player the player. + * @return True if so. + */ + public boolean hasVoidSkills(final Player player) { + for (int skill : VOID_SKILLS) { + if (player.getSkills().getLevel(skill) < (skill != Skills.PRAYER ? 42 : 22)) { + player.getPacketDispatch().sendMessage("You need level 42 in hitpoints, attack, defence, strength, ranged, magic, and"); + player.getPacketDispatch().sendMessage("22 prayer to purchase the " + name.toLowerCase().replace("_", " ").replace("void knight", "").trim() + "."); + return false; + } + } + return true; + } + + /** + * Gets the name of this reward. + * @return the name. + */ + public String getName() { + return isSkillReward() ? Skills.SKILL_NAME[skill] + " xp" : name; + } + + /** + * Method used to check if it's a charm. + * @return True if so. + */ + public boolean isCharm() { + return charm; + } + + /** + * Method used to check a skill requirement. + * @param player the player. + * @return True if so. + */ + public boolean checkSkillRequirement(final Player player, final int option) { + if (player.getSkills().getLevel(skill) < 25) { + player.getPacketDispatch().sendMessage("The Void Knights will not offer training in skills which you have a level of"); + player.getPacketDispatch().sendMessage("less than 25."); + return false; + } + return true; + } + + /** + * Method used to check the item requirement reward. + * @param player the player. + * @param option the option. + * @return True if so. + */ + public boolean checkItemRequirement(final Player player, final int option) { + /* + * empty. + */ + return true; + } + + /** + * Represents the maximum build of an item array pack. + */ + private static final int MAX_BUILD = 18; + + /** + * Represents the minimum build of an item array pack. + */ + private static final int MIN_BUILD = 13; + + /** + * Method used to generate an item back. + * @return the item pack. + */ + public Item[] constructPack() { + final int build = this == SEED_PACK || this == HERB_PACK ? RandomFunction.random(MIN_BUILD, MAX_BUILD) : RandomFunction.random(38, 43); + int left = build; + List pack = new ArrayList<>(); + int amt = 0; + for (Item i : getReward()) { + amt = this == SEED_PACK || this == HERB_PACK ? RandomFunction.random(1, 5) : RandomFunction.random(16, 25); + if (amt > left) { + amt = left; + } + if (amt < 1) { + continue; + } + pack.add(new Item(this != SEED_PACK ? ItemDefinition.forId(i.getId()).getNoteId() : i.getId(), amt)); + left -= amt; + } + return pack.toArray(new Item[] {}); + } + + /** + * Method used to get the reward type based off the button. + * @param button the button. + * @return the reward type. + */ + public static Reward forButton(final int button) { + for (Reward reward : values()) { + for (int i : reward.getChilds()) { + if (i == button) { + return reward; + } + } + } + return null; + } + + /** + * Checks if this reward is a skill reward. + * @return True if so. + */ + public boolean isSkillReward() { + return getChilds().length > 2 && !charm; + } + + /** + * Gets the skill. + * @return the skill. + */ + public int getSkill() { + return skill; + } + + /** + * Gets the header. + * @return the header. + */ + public int getHeader() { + return childs[0]; + } + + /** + * Gets the childs. + * @return The childs. + */ + public int[] getChilds() { + return childs; + } + + /** + * Gets the points. + * @return The points. + */ + public int getPoints() { + return points; + } + + /** + * Gets the reward. + * @return The reward. + */ + public Item[] getReward() { + return reward; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pestcontrol/reward/VoidKnightDialogue.java b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/reward/VoidKnightDialogue.java new file mode 100644 index 000000000..3e46c1813 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pestcontrol/reward/VoidKnightDialogue.java @@ -0,0 +1,322 @@ +package core.game.content.activity.pestcontrol.reward; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; + +/** + * Represents the void knight dialogue. + * + * @author 'Vexia + */ +@Initializable +public final class VoidKnightDialogue extends DialoguePlugin { + + /** + * Reward item + */ + Item reward = new Item(); + + /** + * Repreents the void knight ids. + */ + public static final int IDS[] = new int[] { 3786, 3788, 3789, 5956 }; + + /** + * Constructs a new {@code VoidKnightDialogue} {@code Object}. + */ + public VoidKnightDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code VoidKnightDialogue} {@code Object}. + * + * @param player + * the player. + */ + public VoidKnightDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new VoidKnightDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hi, how can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Who are you?", "What is this place?", + "Ask about Penance gear.", "I'm fine thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("What is this place?"); + stage = 20; + break; + case 3: + player("I'd like to see your available Penance gear."); + stage = 40; + break; + case 4: + player("I'm fine thanks."); + stage = 30; + break; + } + break; + case 10: + npc("I'm a Void Knight, one of the order of Guthix. We are", + "warriors of balance who do Guthix's work here in", + "2009scape."); + stage = 11; + break; + case 11: + options("Wow, can I join?", "What kind of work?", + "What's '2009scape'?", "Uh huh, sure."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("Wow, can I join?"); + stage = 180; + break; + case 2: + player("What kind of work?"); + stage = 17; + break; + case 3: + player("What's '2009scape'?"); + stage = 15; + break; + case 4: + player("Uh huh, sure."); + stage = 14; + break; + } + break; + case 14: + end(); + break; + case 15: + npc("It is the name that Guthix gave to this world, so we", + "honour him with its use."); + stage = 16; + break; + case 16: + end(); + break; + case 17: + npc("Ah well you see we try to keep 2009scape as Guthix", + "intended, it's very challenging. Actually we've been", + "having some problems recently, maybe you could help", + "us?"); + stage = 18; + break; + case 18: + options("Yeah ok, what's the problem?", "What's '2009scape'?", + "I'd rather not, sorry."); + stage = 19; + break; + case 19: + switch (buttonId) { + case 1: + player("Yeah ok, what's the problem?"); + stage = 191; + break; + case 2: + player("What's '2009scape'?"); + stage = 15; + break; + case 3: + player("I'd rather not sorry."); + stage = 190; + break; + } + break; + case 180: + npc("Entry is strictly invite only, however we do need help", + "continuing Guthix's work."); + stage = 181; + break; + case 181: + player("What kind of work?"); + stage = 17; + break; + case 190: + end(); + break; + case 191: + npc("Well the order has become quite diminished over the", + "years, it's a very long process to learn the skills of a", + "Void Knight. Recently there have been breaches into", + "our realm from somewhere else, and strange creatures"); + stage = 192; + break; + case 192: + npc("have been pouring through. We can't let that happen,", + "and we'd be very grateful if you'd help us."); + stage = 193; + break; + case 193: + options("How can I help?", "Sorry, but I can't."); + stage = 194; + break; + case 194: + switch (buttonId) { + case 1: + player("How can I help?"); + stage = 195; + break; + case 2: + player("Sorry, but I can't."); + stage = 190; + break; + } + break; + case 195: + npc("We send launchers from our outpost to the nearby", + "islands. If you go and wait in the lander there that'd", + "really help."); + stage = 196; + break; + case 196: + end(); + break; + case 20: + npc("This is our outpost. From here we send launchers out to", + "the nearby islands to beat back the invaders."); + stage = 21; + break; + case 21: + options("What invaders?", "How can I help?", "Good luck with that."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + player("What invaders?"); + stage = 24; + break; + case 2: + player("How can I help?"); + stage = 195; + break; + case 3: + player("Good luck with that."); + stage = 23; + break; + } + break; + case 23: + end(); + break; + case 24: + npc("Recently there have been breaches into our realm from", + "somewhere else, and strange creatures have been", + "pouring through. We can't let that happen, and we'd be", + "very grateful if you'd help us."); + stage = 193; + break; + case 30: + end(); + break; + case 40: + npc("How did you know we were supplying that kind of stuff?", + "*sigh* Well, I suppose I can help you out.", + "Here's what I have in stock."); + stage = 41; + break; + case 41: + interpreter.sendOptions("Select an Option", "Fighter Torso", + "Fighter Hat", "Ranger Hat", "Runner Hat", "Healer Hat"); + stage = 42; + break; + case 42: + switch (buttonId) { + case 1: + npc("You've taken an interest in the Fighter Torso I have", + "in stock. That'll cost one hundred and fifty points."); + reward = new Item(10551); + stage = 43; + break; + case 2: + npc("You've taken an interest in the Fighter Hat I have", + "in stock. That'll cost one hundred and fifty points."); + reward = new Item(10548); + stage = 43; + break; + case 3: + npc("You've taken an interest in the Ranger Hat I have", + "in stock. That'll cost one hundred and fifty points."); + reward = new Item(10550); + stage = 43; + break; + case 4: + npc("You've taken an interest in the Runner Hat I have", + "in stock. That'll cost one hundred and fifty points."); + reward = new Item(10549); + stage = 43; + break; + case 5: + npc("You've taken an interest in the Healer Hat I have", + "in stock. That'll cost one hundred and fifty points."); + reward = new Item(10547); + stage = 43; + break; + } + break; + case 43: + if (player.getSavedData().getActivityData().getPestPoints() < 150) { + player("I don't have that many points at the moment."); + stage = 30; + } else { + player("Alright, here's one hundred and fifty points."); + stage = 44; + } + break; + case 44: + player.getSavedData() + .getActivityData() + .setPestPoints( + player.getSavedData().getActivityData() + .getPestPoints() - 150); + interpreter.sendItemMessage(reward, "The Void Knight hands over a " + + reward.getName() + "."); + if (player.getInventory().freeSlots() < 1) { + GroundItemManager.create(reward, player.getLocation()); + } else { + player.getInventory().add(reward); + } + stage = 30; + break; + } + return true; + } + + @Override + public int[] getIds() { + return IDS; + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/puropuro/ElnockInquisitorDialogue.java b/Server/src/main/java/Server/core/game/content/activity/puropuro/ElnockInquisitorDialogue.java new file mode 100644 index 000000000..5b78a67d0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/puropuro/ElnockInquisitorDialogue.java @@ -0,0 +1,399 @@ +package core.game.content.activity.puropuro; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.hunter.bnet.BNetTypes; +import core.game.node.entity.skill.hunter.bnet.ImplingNode; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +import core.game.content.activity.puropuro.ElnockInquisitorDialogue.ElnockExchangeInterfaceHandler.ElnockExchange; + +/** + * Handles the elnock inquisitor dialogue. + * @author Vexia + */ +public final class ElnockInquisitorDialogue extends DialoguePlugin { + + /** + * The scroll item. + */ + private static final Item SCROLL = new Item(11273); + + /** + * Constructs a new {@code ElnockInquisitorDialogue} {@code Object}. + */ + public ElnockInquisitorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ElnockInquisitorDialogue} {@code Object}. + * @param player the player. + */ + public ElnockInquisitorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ElnockInquisitorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc("Ah, good day, it's you again. What can I do for you?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (!player.hasItem(SCROLL)) { + npc("Ah, I notice you don't own an impling collector's scroll."); + stage = 900; + break; + } + options("Can you remind me how to catch implings again?", "Can I trade some jarred implings please?", "Do you have some spare equipment I can use?"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Can you remind me how to catch implings again?"); + stage = 10; + break; + case 2: + player("Can I trade some jarred implings please?"); + stage = 20; + break; + case 3: + player("Do you have some spare equipment I can use?"); + stage = 30; + break; + } + break; + case 10: + npc("Certainly."); + stage++; + break; + case 11: + npc("Firstly you will need a butterfly net in which to catch", "them and at least one special impling jar to store an", "impling."); + stage++; + break; + case 12: + npc("You will also require some experience as a Hunter", "since these creatures are elusive. The more immature", "implings require less experience, but some of the rarer", "implings are extraordinarily hard to find and catch."); + stage++; + break; + case 13: + npc("Once you have caught one, you may break the jar", "open and obtain the object the impling is carrying.", "Alternatively, you may exchange certain combinations of", "jars with me. I will return the jars to my clients. In"); + stage++; + break; + case 14: + npc("exchange I will be able to provide you with some", "equipment that may help you hunt butterflies more", "effectively."); + stage++; + break; + case 15: + npc("also beware. Those imps walking around the maze do", "not like the fact that their kindred spirits are being", "captured and will attempt to steal any full jars you have", "on you, setting the implings free."); + stage++; + break; + case 16: + end(); + break; + case 20: + end(); + openShop(player); + break; + case 30: + if (!player.getSavedData().getActivityData().isElnockSupplies()) { + player.getSavedData().getActivityData().setElnockSupplies(true); + player.getInventory().add(new Item(10010), player); + player.getInventory().add(new Item(11262, 1), player); + player.getInventory().add(new Item(11260, 6), player); + npc("Here you go!"); + stage++; + } else { + npc("Since I have already given you some equipment for free,", "I'll be willing to sell you some now."); + stage = 500; + } + break; + case 31: + npc("If you are ready to start hunting implings, then enter", "the main part of the maze."); + stage++; + break; + case 32: + npc("Just push through the wheat that surrounds the centre", "of the maze and get catching!"); + stage++; + break; + case 33: + end(); + break; + case 900: + options("Yes, please.", "No, thanks."); + stage++; + break; + case 901: + switch (buttonId) { + case 1: + player.getInventory().add(SCROLL, player); + interpreter.sendItemMessage(SCROLL, "Elnock gives you a scroll. If you check it whilst in the maze, you will see how many of each impling you have captured."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 902: + end(); + break; + case 500: + player("*sigh*", "Alright, sell me some Impling jars."); + stage++; + break; + case 501: + npc("I'll sell you five jars for 25,000gp, what do you say?"); + stage++; + break; + case 502: + if (player.getInventory().contains(995, 25000)) { + player("Wow, that's expensive!", "Alright... here's some gold for a few jars."); + stage++; + } else { + player("Actually, I don't have that many coins at the moment."); + stage = 902; + } + break; + case 503: + npc("Young one, that is the price you pay for", "forgetting to save some impling jars!"); + if (player.getInventory().remove(new Item(995, 25000))) { + player.getInventory().add(new Item(11260, 5)); + } + stage++; + break; + case 504: + end(); + break; + } + return true; + } + + @Override + public void init() { + super.init(); + PluginManager.definePlugin(new ElnockExchangeInterfaceHandler()); + } + + @Override + public int[] getIds() { + return new int[] { 6070 }; + } + + /** + * Opens the shop exchange. + * @param player the player. + */ + public static void openShop(Player player) { + int[] vals = new int[] { 22, 25, 28, 31 }; + player.getInterfaceManager().open(new Component(540)); + for (int i = 0; i < ElnockExchange.values().length; i++) { + ElnockExchange e = ElnockExchange.values()[i]; + player.getPacketDispatch().sendItemZoomOnInterface(e.getSendItem(), 115, 540, vals[i]); + } + } + + /** + * Handles the elnock exchange interface. + * @author Vexia + */ + public static final class ElnockExchangeInterfaceHandler extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(540).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + ElnockExchange exchange = player.getAttribute("exchange", null); + if (button == 34) { + player.getConfigManager().set(1018, 0); + if (exchange == null) { + player.sendMessage("Making a selection before confirming."); + return true; + } + if (!exchange.hasItems(player)) { + player.sendMessage("You don't have the required implings in a jar to trade for this."); + return true; + } + if (exchange == ElnockExchange.JAR_GENERATOR && player.hasItem(ElnockExchange.JAR_GENERATOR.getReward())) { + player.sendMessage("You can't have more than one jar generator at a time."); + return true; + } + if (!player.getInventory().hasSpaceFor(exchange.getReward())) { + player.sendMessage("You don't have enough inventory space."); + player.getInterfaceManager().close(); + player.removeAttribute("exchange"); + return true; + } + if (exchange == ElnockExchange.IMPLING_JAR ? player.getInventory().remove(ElnockExchange.getItem(player)) : player.getInventory().remove(exchange.getRequired())) { + player.getInterfaceManager().close(); + player.removeAttribute("exchange"); + player.getInventory().add(exchange.getReward(), player); + } + return true; + } + exchange = ElnockExchange.forButton(button); + if (exchange != null) { + player.setAttribute("exchange", exchange); + player.getConfigManager().set(1018, exchange.getConfigValue()); + } + return true; + } + + /** + * An elnock exchange. + * @author Vexia + */ + public enum ElnockExchange { + IMP_REPELLANT(23, 444928, 11271, new Item(11262), new Item(11238, 3), new Item(11240, 2), new Item(11242)), MAGIC_BUTTERFLY(26, 707072, 11268, new Item(11259), new Item(11242, 3), new Item(11244, 2), new Item(11246)), JAR_GENERATOR(29, 969216, 11267, new Item(11258), new Item(11246, 3), new Item(11248, 2), new Item(11250)), IMPLING_JAR(32, 1231360, 11269, new Item(11260, 3)) { + + @Override + public boolean hasItems(Player player) { + for (ImplingNode node : BNetTypes.getImplings()) { + if (player.getInventory().containsItem(node.getReward())) { + return true; + } + } + return false; + } + + }; + + /** + * The button. + */ + private final int button; + + /** + * The config value. + */ + private final int configValue; + + /** + * The send item. + */ + private final int sendItem; + + /** + * The reward. + */ + private final Item reward; + + /** + * The items required. + */ + private final Item[] required; + + /** + * Constructs a new {@code ElnockExchange} {@code Object}. + * @param button the button. + * @param configValue the value. + * @param reward the reward. + * @param required the required. + */ + private ElnockExchange(int button, int configValue, final int sendItem, Item reward, Item... required) { + this.button = button; + this.configValue = configValue; + this.reward = reward; + this.sendItem = sendItem; + this.required = required; + } + + /** + * Gets the item. + * @param player the player, + * @return the item. + */ + public static Item getItem(Player player) { + for (ImplingNode node : BNetTypes.getImplings()) { + if (player.getInventory().containsItem(node.getReward())) { + return node.getReward(); + } + } + return null; + } + + /** + * Checks if the player has the items. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasItems(Player player) { + return player.getInventory().containsItems(getRequired()); + } + + /** + * Gets the value. + * @param button the button. + * @return the value. + */ + public static ElnockExchange forButton(int button) { + for (ElnockExchange e : values()) { + if (e.getButton() == button) { + return e; + } + } + return null; + } + + /** + * Gets the reward. + * @return The reward. + */ + public Item getReward() { + return reward; + } + + /** + * Gets the button. + * @return The button. + */ + public int getButton() { + return button; + } + + /** + * Gets the configValue. + * @return The configValue. + */ + public int getConfigValue() { + return configValue; + } + + /** + * Gets the required. + * @return The required. + */ + public Item[] getRequired() { + return required; + } + + /** + * Gets the sendItem. + * @return The sendItem. + */ + public int getSendItem() { + return sendItem; + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/puropuro/FairyAerykaDialogue.java b/Server/src/main/java/Server/core/game/content/activity/puropuro/FairyAerykaDialogue.java new file mode 100644 index 000000000..68f2cf9e3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/puropuro/FairyAerykaDialogue.java @@ -0,0 +1,133 @@ +package core.game.content.activity.puropuro; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the fairy aeryka dialogue. + * @author Vexia + */ +public final class FairyAerykaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FairyAerykaDialogue} {@code Object}. + */ + public FairyAerykaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FairyAerykaDialogue} {@code Object}. + * @param player the player. + */ + public FairyAerykaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FairyAerykaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc("It's still here."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Pardon?"); + stage++; + break; + case 1: + npc("It's still here. The crop circle is still here."); + stage++; + break; + case 2: + player("Oh yes, thanks Aery. It didn't go anywhere in the", "meantime, then?"); + stage++; + break; + case 3: + npc("Nope. It just sat there."); + stage++; + break; + case 4: + player("Jolly good. I can come back and visit Puro-Puro", "whenever I want then. Brilliant!"); + stage++; + break; + case 5: + options("What's in Puro-Puro?", "So what are these implings then?", "I've heard I may find dragon equipment in Puro-Puro?", "No, bye!"); + stage++; + break; + case 6: + switch (buttonId) { + case 1: + player("What's in Puro-Puro?"); + stage = 10; + break; + case 2: + player("So what are these implings then?"); + stage = 20; + break; + case 3: + player("I've heard I may find dragon equipment in Puro-Puro?"); + stage = 30; + break; + case 4: + player("No, bye!"); + stage = 40; + break; + } + break; + case 10: + npc("Implings...and wheat."); + stage = 99; + break; + case 20: + npc("Well, no-one know for sure. The mischievous little", "creatures are probably related to imps. And they fly as", "well."); + stage++; + break; + case 21: + npc("Also, like imps, they love collecting things. I'm not sure", "why, though. They also seem to like being chased."); + stage++; + break; + case 22: + player("So how would I get hold of what they are carrying,", "then?"); + stage++; + break; + case 23: + npc("Catch them, I suppose I don't know really. Why would", "you want to?"); + stage++; + break; + case 24: + end(); + break; + case 30: + npc("Really? You humans like that stuff a lot, don't you? I", "don't like really old stuff myself."); + stage++; + break; + case 31: + end(); + break; + case 40: + npc("See you around!"); + stage = 99; + break; + case 99: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6072 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/puropuro/ImpDefenderNPC.java b/Server/src/main/java/Server/core/game/content/activity/puropuro/ImpDefenderNPC.java new file mode 100644 index 000000000..0e7010ed5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/puropuro/ImpDefenderNPC.java @@ -0,0 +1,112 @@ +package core.game.content.activity.puropuro; + +import java.util.List; +import java.util.Random; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.hunter.bnet.BNetTypes; +import core.game.node.entity.skill.hunter.bnet.ImplingNode; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.tools.RandomFunction; + +/** + * Handles the imp defender npc. + * @author Vexia + */ +public final class ImpDefenderNPC extends AbstractNPC { + + /** + * Constructs a new {@code ImpDefenderNPC} {@code Object}. + */ + public ImpDefenderNPC() { + super(0, null); + } + + /** + * Constructs a new {@code ImpDefenderNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public ImpDefenderNPC(int id, Location location) { + super(id, location); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (RandomFunction.random(250) <= 3) { + stealImp(); + } + } + + /** + * Attempts to steal an imp. + */ + private void stealImp() { + List players = RegionManager.getLocalPlayers(this, 3); + for (Player player : players) { + if (canSteal(player)) { + steal(player); + } + break; + } + } + + /** + * Steals an imp from a player. + * @param player the player. + */ + private void steal(Player player) { + if (player == null) { + return; + } + ImplingNode node = BNetTypes.getImpling(player); + if (node != null) { + faceTemporary(player, 1); + sendChat("Be free!"); + player.getInventory().remove(node.getReward()); + player.setAttribute("imp-steal", GameWorld.getTicks() + 500); + } + } + + /** + * Checks if the imp can steal from the player. + * @param player the player. + * @return {@code True} if so. + */ + private boolean canSteal(Player player) { + if (!GameWorld.getSettings().isDevMode() && player.getAttribute("imp-steal", 0) > GameWorld.getTicks()) { + return false; + } + int thievingLevel = player.getSkills().getLevel(Skills.THIEVING); + if (thievingLevel >= 60) { + return false; + } + int level = thievingLevel - 10; + if (level <= 0) { + level = 5; + } + if (player.getInventory().containsItem(new Item(11262))) { + thievingLevel += 15; + } + int currentLevel = RandomFunction.random(thievingLevel) + 1; + double ratio = currentLevel / (new Random().nextInt(level + 5) + 1); + return Math.round(ratio * thievingLevel) < level; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ImpDefenderNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 6074 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/puropuro/PuroPuroPlugin.java b/Server/src/main/java/Server/core/game/content/activity/puropuro/PuroPuroPlugin.java new file mode 100644 index 000000000..dedde30e2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/puropuro/PuroPuroPlugin.java @@ -0,0 +1,495 @@ +package core.game.content.activity.puropuro; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneType; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the puro puro activity. + * @author Vexia + */ +@Initializable +public final class PuroPuroPlugin extends MapZone implements Plugin { + + /** + * The moving wheat. + */ + private static final List WHEAT = new ArrayList<>(); + + /** + * The pulse. + */ + private static final Pulse PULSE = new Pulse(1) { + @Override + public boolean pulse() { + for (WheatSet set : WHEAT) { + if (set.canWhilt()) { + set.whilt(); + } + } + return false; + } + }; + + /** + * Constructs a new {@code PuroPuroActivity} {@code Object}. + */ + public PuroPuroPlugin() { + super("puro puro", true); + setZoneType(ZoneType.SAFE.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PULSE.stop(); + ZoneBuilder.configure(this); + PluginManager.definePlugin(new FairyAerykaDialogue()); + PluginManager.definePlugin(new WanderingImplingDialogue()); + PluginManager.definePlugin(new ElnockInquisitorDialogue()); + PluginManager.definePlugin(new PuroOptionHandler()); + PluginManager.definePlugin(new ImpDefenderNPC()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player p = e.asPlayer(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(p, 2)); + } + if (!PULSE.isRunning()) { + spawnWheat(); + PULSE.restart(); + PULSE.start(); + GameWorld.getPulser().submit(PULSE); + } + return super.enter(e); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player p = e.asPlayer(); + if (!logout) { + p.getInterfaceManager().close(); + p.getInterfaceManager().closeOverlay(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(p, 0)); + } + } + return super.leave(e, logout); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + Player p = (Player) e; + switch (target.getId()) { + case 25016: + case 25029: + case 25019: + case 25018: + case 25020: + case 25021: + pushThrough(p, (GameObject) target); + return true; + case 25014: + p.getTeleporter().send(Location.create(2427, 4446, 0), TeleportType.PURO_PURO); + return true; + } + } + return super.interact(e, target, option); + } + + /** + * Pushes through the wheat. + * @param player the player. + * @param object the object. + */ + private void pushThrough(final Player player, final GameObject object) { + if (player.getSkills().getStaticLevel(Skills.HUNTER) < 17) { + player.sendMessage("You need a Hunting level of at least 17 to enter the maze."); + return; + } + if (hasImplingBox(player)) { + player.getDialogueInterpreter().sendDialogue("Something prevents you from entering. You think the portal is", "offended by your imp boxes. They are not popular on imp", "and impling planes."); + return; + } + final Location dest = object.getLocation().transform(Direction.getLogicalDirection(player.getLocation(), object.getLocation()), 1); + if (RegionManager.getObject(dest) != null) { + player.sendMessage("An object on the other side is in your way."); + return; + } + if (RandomFunction.random(2) == 0) { + player.sendMessage("You use your strength to push through the wheat."); + } else { + player.sendMessage("You use your strength to push through the wheat. It's hard work though."); + } + player.setAttribute("cantMove", true); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + ForceMovement.run(player, player.getLocation(), dest, Animation.create(6594), Animation.create(6594), Direction.getLogicalDirection(player.getLocation(), object.getLocation()), 3, 3); + return true; + } + }); + } + + /** + * Spawns the wheat. + */ + private void spawnWheat() { + for (WheatSet set : WHEAT) { + set.init(); + } + } + + /** + * Checks if the player has an impling box. + * @param player the player. + * @return {@code True} if so. + */ + private boolean hasImplingBox(Player player) { + return player.getInventory().contains(10025, 1) || player.getInventory().contains(10027, 1) || player.getInventory().contains(10028, 1); + } + + @Override + public void configure() { + registerRegion(10307); + WHEAT.add(new WheatSet(0, Location.create(2606, 4329, 0), Location.create(2606, 4328, 0))); + WHEAT.add(new WheatSet(1, Location.create(2596, 4331, 0), Location.create(2597, 4331, 0))); + WHEAT.add(new WheatSet(0, Location.create(2580, 4326, 0), Location.create(2580, 4325, 0))); + WHEAT.add(new WheatSet(1, Location.create(2595, 4308, 0), Location.create(2596, 4308, 0))); + WHEAT.add(new WheatSet(0, Location.create(2603, 4314, 0), Location.create(2603, 4313, 0))); + WHEAT.add(new WheatSet(1, Location.create(2599, 4305, 0), Location.create(2600, 4305, 0))); + WHEAT.add(new WheatSet(0, Location.create(2577, 4327, 0), Location.create(2577, 4328, 0))); + WHEAT.add(new WheatSet(1, Location.create(2587, 4334, 0), Location.create(2586, 4334, 0))); + WHEAT.add(new WheatSet(0, Location.create(2609, 4310, 0), Location.create(2609, 4309, 0))); + WHEAT.add(new WheatSet(1, Location.create(2586, 4302, 0), Location.create(2587, 4302, 0))); + WHEAT.add(new WheatSet(0, Location.create(2574, 4310, 0), Location.create(2574, 4311, 0))); + WHEAT.add(new WheatSet(1, Location.create(2582, 4337, 0), Location.create(2581, 4337, 0))); + WHEAT.add(new WheatSet(0, Location.create(2571, 4316, 0), Location.create(2571, 4315, 0))); + WHEAT.add(new WheatSet(1, Location.create(2601, 4340, 0), Location.create(2602, 4340, 0))); + WHEAT.add(new WheatSet(0, Location.create(2612, 4324, 0), Location.create(2612, 4323, 0))); + WHEAT.add(new WheatSet(1, Location.create(2584, 4296, 0), Location.create(2583, 4296, 0))); + WHEAT.add(new WheatSet(0, Location.create(2568, 4329, 0), Location.create(2568, 4330, 0))); + WHEAT.add(new WheatSet(1, Location.create(2595, 4343, 0), Location.create(2596, 4343, 0))); + WHEAT.add(new WheatSet(0, Location.create(2615, 4315, 0), Location.create(2615, 4314, 0))); + WHEAT.add(new WheatSet(1, Location.create(2601, 4293, 0), Location.create(2600, 4293, 0))); + WHEAT.add(new WheatSet(0, Location.create(2565, 4310, 0), Location.create(2565, 4311, 0))); + WHEAT.add(new WheatSet(1, Location.create(2582, 4346, 0), Location.create(2583, 4346, 0))); + WHEAT.add(new WheatSet(0, Location.create(2621, 4328, 0), Location.create(2621, 4329, 0))); + WHEAT.add(new WheatSet(1, Location.create(2602, 4349, 0), Location.create(2603, 4349, 0))); + WHEAT.add(new WheatSet(0, Location.create(2562, 4334, 0), Location.create(2562, 4333, 0))); + WHEAT.add(new WheatSet(1, Location.create(2582, 4290, 0), Location.create(2581, 4290, 0))); + WHEAT.add(new WheatSet(0, Location.create(2568, 4348, 0), Location.create(2568, 4347, 0))); + WHEAT.add(new WheatSet(0, Location.create(2615, 4347, 0), Location.create(2615, 4348, 0))); + WHEAT.add(new WheatSet(0, Location.create(2612, 4345, 0), Location.create(2612, 4344, 0))); + WHEAT.add(new WheatSet(0, Location.create(2614, 4292, 0), Location.create(2614, 4291, 0))); + WHEAT.add(new WheatSet(0, Location.create(2568, 4292, 0), Location.create(2568, 4291, 0))); + WHEAT.add(new WheatSet(0, Location.create(2571, 4295, 0), Location.create(2571, 4294, 0))); + WHEAT.add(new WheatSet(0, Location.create(2575, 4297, 0), Location.create(2575, 4298, 0))); + WHEAT.add(new WheatSet(0, Location.create(2584, 4330, 0), Location.create(2584, 4329, 0))); + WHEAT.add(new WheatSet(0, Location.create(2599, 4329, 0), Location.create(2599, 4330, 0))); + WHEAT.add(new WheatSet(1, Location.create(2602, 4312, 0), Location.create(2601, 4312, 0))); + WHEAT.add(new WheatSet(1, Location.create(2610, 4312, 0), Location.create(2611, 4312, 0))); + WHEAT.add(new WheatSet(1, Location.create(2570, 4309, 0), Location.create(2569, 4309, 0))); + WHEAT.add(new WheatSet(0, Location.create(2583, 4304, 0), Location.create(2583, 4303, 0))); + } + + /** + * Handles the puro puro options. + * @author Vexia + */ + public class PuroOptionHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(6070).getHandlers().put("option:trade", this); + ObjectDefinition.forId(24991).getHandlers().put("option:enter", this); + ItemDefinition.forId(11273).getHandlers().put("option:toggle-view", this); + ItemDefinition.forId(11258).getHandlers().put("option:butterfly-jar", this); + ItemDefinition.forId(11258).getHandlers().put("option:impling-jar", this); + ItemDefinition.forId(11258).getHandlers().put("option:check", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 11258: + handleJarGenerator(player, (Item) node, option); + break; + case 6070: + ElnockInquisitorDialogue.openShop(player); + break; + case 24991: + if (hasImplingBox(player)) { + player.getDialogueInterpreter().sendDialogue("Something prevents you from entering. You think the portal is offended by", "your imp boxes. They are not popular on imp and impling planes."); + break; + } + player.getTeleporter().send(Location.create(2591, 4320, 0), TeleportType.PURO_PURO); + return true; + case 11273: + if (!player.getZoneMonitor().isInZone("puro puro")) { + player.sendMessage("You can only use this in the Puro Puro Maze."); + break; + } else { + if (player.getInterfaceManager().getOverlay() != null) { + player.getInterfaceManager().closeOverlay(); + break; + } + player.getInterfaceManager().openOverlay(new Component(541)); + } + return true; + } + return true; + } + + /** + * Handles the jar generator. + * @param player the player. + * @param item the item. + * @param option the option. + */ + private void handleJarGenerator(Player player, Item item, String option) { + switch (option) { + case "butterfly-jar": + case "impling-jar": + generate(player, item, option); + break; + case "check": + player.sendMessage("Your jar generator has a charge percentage of " + getPercent(item) + "."); + break; + } + } + + /** + * Generates a new jar. + * @param player the player. + * @param item the item. + * @param option the option. + */ + private void generate(Player player, Item item, String option) { + final Item jar = option.equals("butterfly-jar") ? new Item(10012) : new Item(11260); + final int percent = jar.getId() == 10012 ? 1 : 3; + if (!hasPercent(item, percent)) { + player.sendMessage("Your jar generator doesn't have enough charges to make another " + jar.getName().toLowerCase() + "."); + return; + } + player.lock(5); + player.animate(new Animation(6592)); + player.getInventory().add(jar); + setPercent(item, percent); + player.sendMessage("Your jar generator generates a " + jar.getName().toLowerCase() + "."); + if (getPercent(item) <= 0) { + player.getInventory().remove(item); + player.sendMessage("Your jar generator runs out of charges."); + } + } + + /** + * Checks if the player has the percent. + * @param item the item. + * @param percent the percent. + * @return + */ + private boolean hasPercent(Item item, int percent) { + return getPercent(item) - percent >= 0; + } + + /** + * The percent to set. + * @param item the item. + * @param percent the percent. + */ + private void setPercent(Item item, int percent) { + item.setCharge(item.getCharge() - percent); + } + + /** + * Gets the percent. + * @param item the item. + * @return the percent. + */ + private int getPercent(Item item) { + int difference = item.getCharge() - 1000; + return difference + 100; + } + + @Override + public boolean isWalk(Player p, Node n) { + return !(n instanceof Item); + + } + + @Override + public boolean isWalk() { + return false; + } + } + + /** + * A wheat set. + * @author Vexia + */ + public static class WheatSet { + + /** + * The locations of the wheat. + */ + private final Location[] locations; + + /** + * The game objects. + */ + private GameObject[] objects = new GameObject[2]; + + /** + * The rotation. + */ + private int rot; + + /** + * The time until the next whilt. + */ + private int nextWhilt; + + /** + * The busy ticks. + */ + private int busyTicks; + + /** + * If the wheat is removed. + */ + private boolean removed; + + /** + * Constructs a new {@code WheatSet} {@code Object}. + * @param locations the locations. + */ + public WheatSet(int rot, Location... locations) { + this.rot = rot; + this.locations = locations; + } + + /** + * Initializes the wheat. + */ + public void init() { + int index = 0; + for (Location location : locations) { + GameObject object = new GameObject(25021, location, 22, rot); + ObjectBuilder.add(object); + objects[index] = object; + index++; + } + setNextWhilt(); + } + + /** + * Whilts the wheat. + */ + public void whilt() { + busyTicks = GameWorld.getTicks() + 5; + for (GameObject object : objects) { + if (object == null) { + continue; + } + if (removed) { + ObjectBuilder.add(object); + continue; + } + ObjectBuilder.remove(object); + } + removed = !removed; + setNextWhilt(); + } + + /** + * Sets the object spawns. + */ + public void setObjects() { + for (int i = 0; i < locations.length; i++) { + objects[i] = RegionManager.getObject(locations[i]); + } + } + + /** + * Sets the next whilt. + */ + public void setNextWhilt() { + this.nextWhilt = GameWorld.getTicks() + RandomFunction.random(40, 300); + } + + /** + * Checks if the wheat can whilt. + * @return {@code True} if so. + */ + public boolean canWhilt() { + return GameWorld.getTicks() > nextWhilt && GameWorld.getTicks() > busyTicks; + } + + /** + * Gets the nextWhilt. + * @return The nextWhilt. + */ + public int getNextWhilt() { + return nextWhilt; + } + + /** + * Sets the nextWhilt. + * @param nextWhilt The nextWhilt to set. + */ + public void setNextWhilt(int nextWhilt) { + this.nextWhilt = nextWhilt; + } + + /** + * Gets the locations. + * @return The locations. + */ + public Location[] getLocations() { + return locations; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/puropuro/WanderingImplingDialogue.java b/Server/src/main/java/Server/core/game/content/activity/puropuro/WanderingImplingDialogue.java new file mode 100644 index 000000000..f048fa6a0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/puropuro/WanderingImplingDialogue.java @@ -0,0 +1,91 @@ +package core.game.content.activity.puropuro; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the wandering imp dialogue. + * @author Vexia + */ +public final class WanderingImplingDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code WanderingImplingDialogue} {@code Object}. + */ + public WanderingImplingDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WanderingImplingDialogue} {@code Object}. + * @param player the player. + */ + public WanderingImplingDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WanderingImplingDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hello. So, what is this place?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("This is my home, mundane human! What do you have", "in your pockets? Something tasty?"); + stage++; + break; + case 1: + player("Stay out of my pockets! I don't have anything that you", "want."); + stage++; + break; + case 2: + npc("Ah, but do you have anything that *you* want?"); + stage++; + break; + case 3: + player("Of course I do!"); + stage++; + break; + case 4: + npc("Then you have something that implings want."); + stage++; + break; + case 5: + player("Eh?"); + stage++; + break; + case 6: + npc("We want things you people want. They are tasty to us!", "The more you want them, the tastier they are!"); + stage++; + break; + case 7: + player("So, you collect things that humans want? Interesting...", "So, what would happen if I caught an impling in a", "butterfly net?"); + stage++; + break; + case 8: + npc("Don't do that! That would be cruel. But chase us, yes!", "That is good. Implings that are not easy to catch. Especially", "ones with tasty food."); + stage++; + break; + case 9: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6073 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/GuardMummyDialogue.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/GuardMummyDialogue.java new file mode 100644 index 000000000..2fb5a20c7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/GuardMummyDialogue.java @@ -0,0 +1,133 @@ +package core.game.content.activity.pyramidplunder; + +import core.game.content.activity.ActivityManager; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles Guardian mummy dialogue. + * @author Originally Emperor, completely redone by Ceikry. + */ +public final class GuardMummyDialogue extends DialoguePlugin { + + /** + * If the player successfully caught the evil twin. + * Will remain unused until the quest is implemented. (if ever) + */ + //private int type; + + + /** + * Constructs a new {@code GuardMummyDialogue} {@code Object}. + */ + public GuardMummyDialogue() {super();} + public GuardMummyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GuardMummyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if(args.length > 1){ + switch((int) args[1]){ + case 0: + npc("You! How did you get into this place?"); + stage = 50; + break; + case 1: + player("I know what I'm doing - let's get on with it."); + stage = 10; + break; + } + } else { + npc("Errr"); + } + /*type = args.length == 1 ? 0 : (Integer) args[1]; + if (type == 1) { + player("I know what I'm doing - let's get on with it."); + } else { + npc("You! How did you get in?"); + }*/ + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch(stage){ + case 10: + npc("Fine, I'll take you to the first room now..."); + stage = 60; + break; + case 50: + player("I could ask you the same thing."); + stage = 51; + break; + case 51: + npc("Nevermind that. I suppose since you're here I can tell", "you how to play."); + stage = 52; + break; + case 52: + npc("In each room there are urns, a chest, and a sarcophagus."); + stage = 53; + break; + case 53: + npc("The urns contain artifacts based on the room that you are","currently in. The chest contains valuable artifacts but is","sometimes trapped. The sarcophagus has one of my","brothers in it. And lots of artifacts."); + stage = 54; + break; + case 54: + player("Anything else I should know?"); + stage = 55; + break; + case 55: + npc("Yes, each room requires more thieving knowledge than the"," last. And be careful not to die."); + stage = 56; + break; + case 56: + player("Oh, yes, dying. Not good. Well I suppose that covers it?"); + stage = 57; + break; + case 57: + npc("Yep."); + stage = 58; + break; + case 58: + end(); + break; + case 60: + end(); + ActivityManager.start(player, "Pyramid plunder", false); + break; + + } + /*switch (stage++) { + case 0: + if (type == 1) { + npc("Fine, I'll take you to the first room now..."); + } else { + System.out.println("TODO:2"); + } + return true; + case 1: + if (type == 1) { + end(); + ActivityManager.start(player, "Pyramid plunder", false); + } else { + System.out.println("TODO:3"); + } + return true; + }*/ + return false; + } + + @Override + public int[] getIds() { + return new int[] { 4476, 4477 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderObject.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderObject.java new file mode 100644 index 000000000..3af454e8d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderObject.java @@ -0,0 +1,41 @@ +package core.game.content.activity.pyramidplunder; + +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; + +/** + * Object wrapper for pyramid plunder nodes + * @author ceik + */ + +public class PlunderObject extends GameObject { + private transient Player player; + private static int thisId; + public static int snakeId, openId; + + + public PlunderObject(GameObject obj){ + super(obj.getId(),obj.getLocation(),obj.getRotation(),obj.getDirection()); + this.thisId = obj.getId(); + switch(thisId){ + case 16501: + this.snakeId = 16509; + this.openId = 16505; + break; + case 16502: + this.snakeId = 16510; + this.openId = 16506; + break; + case 16503: + this.snakeId = 16511; + this.openId = 16507; + break; + case 16495: + this.openId = 16496; + break; + case 16473: + this.openId = 16474; + break; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderObjectManager.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderObjectManager.java new file mode 100644 index 000000000..011c71619 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderObjectManager.java @@ -0,0 +1,29 @@ +package core.game.content.activity.pyramidplunder; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +import java.util.HashMap; + +/** + * Manages what objects a specific player has interacted with in pyramid plunder. + * @author ceik + */ + +public class PlunderObjectManager{ + public static HashMap openedMap = new HashMap<>(); + public static HashMap charmedMap = new HashMap<>(); + + int originalIndex; + public boolean resetObjectsFor(Player player){ + //Completely clear the mapping and reset objects + openedMap.clear(); + charmedMap.clear(); + return true; + } + + public void registerOpened(PlunderObject object){ + openedMap.putIfAbsent(object.getLocation(),true); + } + public void registerCharmed(PlunderObject object) { charmedMap.putIfAbsent(object.getLocation(),true);} +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderSession.kt b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderSession.kt new file mode 100644 index 000000000..d068b0d9e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderSession.kt @@ -0,0 +1,88 @@ +package core.game.content.activity.pyramidplunder + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.tools.RandomFunction + +class PlunderSession(val player: Player) { + var door1Open: Boolean = false + var door2Open: Boolean = false + var door3Open: Boolean = false + var door4Open: Boolean = false + var chestHidden: Boolean = false + var chestOpen: Boolean = false + var coffinHidden: Boolean = false + var coffinOpen: Boolean = false + var timeCounter: Int = 1 + var correctDoorIndex: Int = RandomFunction.random(1000) % 4 + var isActive = false + + + fun init(){ + player.setAttribute("plunder-session",this) + GameWorld.Pulser.submit(PlunderPulse(player)) + player.interfaceManager.openOverlay(Component(428)) + isActive = true + } + + fun updateOverlay(){ + player.configManager.set(821,getConfig()) + } + + fun resetVars(){ + chestOpen = false + chestHidden = false + coffinHidden = false + coffinOpen = false + door1Open = false + door2Open = false + door3Open = false + door4Open = false + correctDoorIndex = RandomFunction.random(1000) % 4 + } + + fun getConfig(): Int{ + var config = 0 + if(coffinOpen) config = 1 + if(coffinHidden) config = (config or (1 shl 1)) + if(chestOpen) config = (config or (1 shl 2)) + if(chestHidden) config = (config or (1 shl 3)) + if(door1Open) config = (config or (1 shl 9)) + if(door2Open) config = (config or (1 shl 10)) + if(door3Open) config = (config or (1 shl 11)) + if(door4Open) config = (config or (1 shl 12)) + return (config or (timeCounter shl 25)) + } + + fun setDoorOpen(index: Int){ + when(index){ + 0 -> door1Open = true + 1 -> door2Open = true + 2 -> door3Open = true + 3 -> door4Open = true + } + } + + class PlunderPulse(val player: Player) : Pulse(){ + var ticks = 0 + var overlayConfig = 0 + val session: PlunderSession? = player.getAttribute("plunder-session",null) + override fun pulse(): Boolean { + session ?: return false + if(ticks++ % 8 == 0){ + session.timeCounter++ + session.updateOverlay() + } + if(session.timeCounter > 63){ + player.properties.teleportLocation = Location.create(3286, 2803, 0) + player.dialogueInterpreter.sendDialogue("You ran out of time and the mummy kicked you","out.") + player.configManager.set(822,0) + player.configManager.set(821,0) + } + return session.timeCounter > 63 || !session.isActive + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderZones.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderZones.java new file mode 100644 index 000000000..27a1a11c0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PlunderZones.java @@ -0,0 +1,364 @@ +package core.game.content.activity.pyramidplunder; +import core.game.Varp; +import core.game.content.global.action.ClimbActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Defines the zones for the pyramid plunder rooms and their interactions + * @author ceik + */ + +@Initializable +public class PlunderZones implements Plugin { + private final PlunderZone[] ROOMS = { + new PlunderZone("plunder:room1", 1,1923, 4464, 1932, 4474), + new PlunderZone("plunder:room2", 2,1925, 4449, 1941, 4458), + new PlunderZone("plunder:room3", 3,1941, 4421, 1954, 4432), + new PlunderZone("plunder:room4", 4,1949, 4464, 1959, 4477), + new PlunderZone("plunder:room5", 5,1968, 4420, 1978, 4436), + new PlunderZone("plunder:room6", 6,1969, 4452, 1980, 4473), + new PlunderZone("plunder:room7", 7,1923, 4424, 1931, 4439), + new PlunderZone("plunder:room8", 8, 1950, 4442, 1969, 4455) + }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for(PlunderZone room : ROOMS){ + ZoneBuilder.configure(room); + } + return this; + } + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + public class PlunderZone extends MapZone { + PyramidPlunderRoom room; + Location entrance; + private final Animation[] animations = new Animation[] { new Animation(2247), new Animation(2248), new Animation(1113), new Animation(2244) }; + final int swx, swy, nex, ney; + final String name; + final int roomnum; + + public PlunderZone(final String name, final int roomnum, final int swx, final int swy, final int nex, final int ney) { + super(name, true); + this.name = name; + this.swx = swx; + this.swy = swy; + this.nex = nex; + this.ney = ney; + this.roomnum = roomnum; + switch(roomnum){ + case 1: + room = PyramidPlunderRoom.ROOM_1; + break; + case 2: + room = PyramidPlunderRoom.ROOM_2; + break; + case 3: + room = PyramidPlunderRoom.ROOM_3; + break; + case 4: + room = PyramidPlunderRoom.ROOM_4; + break; + case 5: + room = PyramidPlunderRoom.ROOM_5; + break; + case 6: + room = PyramidPlunderRoom.ROOM_6; + break; + case 7: + room = PyramidPlunderRoom.ROOM_7; + break; + case 8: + room = PyramidPlunderRoom.ROOM_8; + } + } + + @Override + public void configure() { + ZoneBorders borders = new ZoneBorders(swx, swy, nex, ney,0); + register(borders); + } + + @Override + public boolean enter(Entity e){ + if(e instanceof Player && ((Player) e).getLocation().getZ() == 0) { + e.asPlayer().getPacketDispatch().sendMessage("Room: " + (roomnum) + " Level required: " + (21 + ((roomnum - 1) * 10))); + e.asPlayer().getPlunderObjectManager().resetObjectsFor(e.asPlayer()); + PlunderSession session = e.asPlayer().getAttribute("plunder-session",null); + if(session != null){ + session.resetVars(); + } + e.asPlayer().addExtension(LogoutTask.class, new LocationLogoutTask(12, Location.create(3288, 2801, 0))); + updateRoomVarp(e.asPlayer()); + } + return true; + } + + public void updateRoomVarp(Player player){ + Varp varp = player.varpManager.get(822); + varp.setVarbit(0,room.reqLevel); + varp.setVarbit(9,roomnum); + player.getPacketDispatch().sendVarp(varp); + } + + public boolean checkRequirements(Player player, PyramidPlunderRoom room){ + int requiredLevel = room.reqLevel; + int playerLevel = player.getSkills().getLevel(Skills.THIEVING); + return playerLevel >= requiredLevel; + } + + public void rollSceptre(Player player){ + if(RandomFunction.random(1000) == 451){ + if(!player.getInventory().isFull()) { + player.getInventory().add(new Item(9044)); + player.getPacketDispatch().sendMessage("You find a strange object."); + } else { + player.getBank().add(new Item(9044)); + player.getPacketDispatch().sendMessage("You sense that something has appeared in your bank."); + } + } + } + + public final boolean success(final Player player, final int skill) { + double level = player.getSkills().getLevel(skill); + double successChance = Math.ceil((level * 50 - room.reqLevel) / room.reqLevel / 3 * 4); + int roll = RandomFunction.random(99); + if (successChance >= roll) { + return true; + } + return false; + } + + public void reward(Player player, int objid){ + Item[][] ARTIFACTS = { {new Item(9032),new Item(9036), new Item(9026)}, {new Item(9042), new Item(9030), new Item(9038)}, {new Item(9040), new Item(9028), new Item(9034)} }; + rollSceptre(player); + switch(objid){ + case 16517: // Spear + player.getSkills().addExperience(Skills.THIEVING, (30 + (roomnum * 20)), true); + break; + case 16503: + case 16502: + case 16501: // Urns + player.getSkills().addExperience(Skills.THIEVING, (25 + (roomnum * 20)), true); + player.getInventory().add(ARTIFACTS[((int)Math.floor((double) roomnum / 3))][RandomFunction.random(3)]); + break; + case 16473: // Chest + player.getInventory().add(ARTIFACTS[RandomFunction.random(1, 3)][RandomFunction.random(3)]); + player.getPacketDispatch().sendMessage("And you find an artifact!"); + player.getSkills().addExperience(Skills.THIEVING, (40 + (roomnum * 20))); + break; + case 16495: // Sarcophagus + player.getPacketDispatch().sendMessage("You find some loot inside."); + player.getInventory().add(ARTIFACTS[RandomFunction.random(0,3)][RandomFunction.random(3)]); + player.getSkills().addExperience(Skills.STRENGTH,50 + (roomnum * 20)); + break; + + } + } + + + @Override + public boolean interact(Entity e, Node target, Option option) { + final Player player = e instanceof Player ? e.asPlayer() : null; + String optionName = option.getName().toLowerCase(); + if(target instanceof NPC){ + if(target.getName().contains("Guardian")) { + if (optionName.equals("talk-to")) { + player.getDialogueInterpreter().open(target.getId(), target.asNpc(), 0); + } else { + player.getDialogueInterpreter().open(target.getId(), target.asNpc(), 1); + } + } + if(optionName.equals("attack")){ + player.getProperties().getCombatPulse().attack(target); + } + return true; + } + PlunderObject object = target instanceof NPC ? null : new PlunderObject(target.asObject()); //PlunderObject(target.getId(),target.getLocation()); + PlunderObjectManager manager = player.getPlunderObjectManager(); + boolean alreadyOpened = manager.openedMap.getOrDefault(object.getLocation(),false); + boolean charmed = manager.charmedMap.getOrDefault(object.getLocation(),false); + boolean success = success(player, Skills.THIEVING); + PlunderSession session = player.getAttribute("plunder-session",null); + if(session == null){ + return false; + } + switch (object.getId()) { + case 16517: //Spear trap + if(!checkRequirements(player,room)){ + player.getPacketDispatch().sendMessage("You need to be at least level " + room.reqLevel + " thieving."); + break; + } + player.getLocks().lockInteractions(2); + player.animate(animations[success ? 1 : 0]); + if (success) { + player.getPacketDispatch().sendMessage("You successfully pass the spears."); + int moveX = player.getLocation().getX(); + int moveY = player.getLocation().getY(); + Location moveto = new Location(moveX + room.spearX, moveY + room.spearY); + player.getProperties().setTeleportLocation(moveto); + //player.moveStep(); + } else { + player.getPacketDispatch().sendMessage("You fail to pass the spears."); + } + break; + case 16503: + case 16502: + case 16501: // Urns + if (optionName.equals("search")) { + if (!checkRequirements(player,room)){ + player.getPacketDispatch().sendMessage("You need to be at least level " + room.reqLevel + " thieving."); + break; + } + if (alreadyOpened){ + player.getPacketDispatch().sendMessage("You've already looted this."); + break; + } + + player.animate(animations[success ? 1 : 0]); + player.getLocks().lockInteractions(2); + + if (!alreadyOpened && (success || charmed)) { + player.getPacketDispatch().sendMessage("You successfully search the urn..."); + ObjectBuilder.replace(target.asObject(), target.asObject().transform(object.openId), 5); + manager.registerOpened(object); + reward(player,object.getId()); + } else { + player.getPacketDispatch().sendMessage("You failed and got bit by a snake."); + player.getImpactHandler().manualHit(player,RandomFunction.random(2,8), ImpactHandler.HitsplatType.NORMAL); + } + } else if(optionName.equals("check for snakes")){ + if(charmed){ + player.getPacketDispatch().sendMessage("You already checked for snakes."); + } else { + player.getPacketDispatch().sendMessage("You check the urn for snakes..."); + ObjectBuilder.replace(target.asObject(), target.asObject().transform(object.snakeId), 5); + } + } + break; + case 16509: + case 16510: + case 16511: // Snake urns + if(optionName.equals("search") && player.getInventory().containsItem(new Item(4605))){ + player.animate(new Animation(1877)); + player.getPacketDispatch().sendMessage("You charm the snake into docility."); + manager.registerCharmed(object); + } else { + player.getImpactHandler().manualHit(player, RandomFunction.random(2, 8), ImpactHandler.HitsplatType.NORMAL); + player.getPacketDispatch().sendMessage("The snake bites you."); + } + break; + case 16473: // Chest + if(optionName.equals("search")) { + boolean willSpawnSwarm = (RandomFunction.random(1,20) == 10); + if(!checkRequirements(player,room)){ + player.getPacketDispatch().sendMessage("You need at least level " + room.reqLevel + " thieving to loot this."); + break; + } + if (alreadyOpened){ + player.getPacketDispatch().sendMessage("You've already looted this."); + break; + } + player.getPacketDispatch().sendMessage("You search the chest..."); + player.animate(animations[1]); + player.getLocks().lockInteractions(2); + if(willSpawnSwarm) { + player.getPacketDispatch().sendMessage("A swarm flies out!"); + PyramidPlunderSwarmNPC swarm = new PyramidPlunderSwarmNPC(2001,player.getLocation(),player); + swarm.setRespawn(false); + swarm.setAggressive(true); + swarm.init(); + } else { + reward(player,object.getId()); + } + session.setChestOpen(true); + session.updateOverlay(); + manager.registerOpened(object); + //ObjectBuilder.replace(target.asObject(), target.asObject().transform(object.openId), 5); + } + break; + case 16495: //Sarcophagus + if(optionName.equals("open")) { + if (!checkRequirements(player,room)){ + player.getPacketDispatch().sendMessage("You need to be at least level " + room.reqLevel + " thieving."); + break; + } + if (alreadyOpened){ + player.getPacketDispatch().sendMessage("You've already looted this."); + break; + } + boolean willSpawnMummy = (RandomFunction.random(1,5) == 3); + player.animate(animations[1]); + player.getPacketDispatch().sendMessage("You open the sarcophagus and...."); + if(willSpawnMummy) { + player.getPacketDispatch().sendMessage("A mummy crawls out!"); + PyramidPlunderMummyNPC mummy = new PyramidPlunderMummyNPC(1958, player.getLocation(),player); + mummy.setRespawn(false); + mummy.setAggressive(true); + mummy.init(); + } else { + reward(player,object.getId()); + } + session.setCoffinOpen(true); + session.updateOverlay(); + manager.registerOpened(object); + //ObjectBuilder.replace(target.asObject(), target.asObject().transform(object.openId), 5); + } + break; + case 16475: //doors + if(optionName.equals("pick-lock") && roomnum < 8) { + if (!checkRequirements(player,room)){ + player.getPacketDispatch().sendMessage("You need to be at least level " + room.reqLevel + " thieving."); + break; + } + player.animate(animations[1]); + player.getLocks().lockInteractions(2); + boolean doesOpen = success(player, Skills.THIEVING); + if (doesOpen) { + PyramidPlunderRoom nextRoom = PyramidPlunderRoom.forRoomNum(roomnum + 1); + player.getPacketDispatch().sendMessage("The door opens!"); + int index = room.doorLocations.indexOf(object.getLocation()); + if(session.getCorrectDoorIndex() == index){ + player.getProperties().setTeleportLocation(nextRoom.entrance); + } else { + session.setDoorOpen(index); + session.updateOverlay(); + } + } else { + player.getPacketDispatch().sendMessage("You fail to unlock the door."); + } + } else if(roomnum == 8) { + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, Location.create(3288, 2801, 0)); + } + break; + case 16476: + player.getDialogueInterpreter().sendDialogue("This door doesn't seem to lead","anywhere."); + break; + default: + return super.interact(e, target, option); + } + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidOptionHandler.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidOptionHandler.java new file mode 100644 index 000000000..cb9cda222 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidOptionHandler.java @@ -0,0 +1,110 @@ +package core.game.content.activity.pyramidplunder; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the pyramid plunder options. + * @author Emperor + */ +public final class PyramidOptionHandler extends OptionHandler { + + /** + * The guardian room location. + */ + private static final Location GUARDIAN_ROOM = Location.create(1968, 4420, 2); + + /** + * The empty room location. + */ + private static final Location EMPTY_ROOM = Location.create(1934, 4450, 2); + + /** + * The current entrance. + */ + private static int currentEntrance; + + /** + * The last entrance switch made. + */ + private static long lastEntranceSwitch; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(16484).getHandlers().put("option:search", this); + ObjectDefinition.forId(16485).getHandlers().put("option:search", this); + ObjectDefinition.forId(16487).getHandlers().put("option:search", this); + ObjectDefinition.forId(16488).getHandlers().put("option:search", this); + ObjectDefinition.forId(16490).getHandlers().put("option:search", this); + ObjectDefinition.forId(16491).getHandlers().put("option:search", this); + ObjectDefinition.forId(16493).getHandlers().put("option:search", this); + ObjectDefinition.forId(16494).getHandlers().put("option:enter", this); + ObjectDefinition.forId(16458).getHandlers().put("option:leave tomb", this); + ObjectDefinition.forId(16459).getHandlers().put("option:leave tomb", this); + NPCDefinition.forId(4476).getHandlers().put("option:start-minigame", this); + NPCDefinition.forId(4476).getHandlers().put("option:talk-to",this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (node instanceof GameObject) { + Location destination = EMPTY_ROOM; + GameObject object = (GameObject) node; + boolean willBePushed = (RandomFunction.random(10) > 3); + if (object.getId() == 16458 || object.getId() == 16459) { + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, Location.create(3288, 2801, 0)); + player.getPlunderObjectManager().resetObjectsFor(player); + return true; + } + if (System.currentTimeMillis() - lastEntranceSwitch > 15 * 60 * 1000) { + currentEntrance = RandomFunction.random(4); + lastEntranceSwitch = System.currentTimeMillis(); + } + int entrance = (object.getId() - 16483) / 3; + int value = 0; + if (entrance == currentEntrance) { + destination = GUARDIAN_ROOM; + value = 4; + } + player.getConfigManager().set(704, value); + player.getPacketDispatch().sendMessage("You use your thieving skills to search the stone panel."); + if(entrance == currentEntrance && willBePushed){ + player.lock(); + player.animate(new Animation(7299)); + player.getImpactHandler().setDisabledTicks(4); + GameWorld.getPulser().submit(new Pulse(4, player) { + @Override + public boolean pulse() { + player.unlock(); + player.getAnimator().reset(); + return true; + } + }); + } else { + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, destination, "You find a door! You open it."); + } + //ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, destination, "You find a door! You open it."); + } else if (node instanceof NPC) { + if (option.equals("talk-to")) { + player.getDialogueInterpreter().open(node.getId(), node, 0); + } else { + player.getDialogueInterpreter().open(node.getId(), node, 1); + } + } + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.java new file mode 100644 index 000000000..278d4885a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderActivity.java @@ -0,0 +1,89 @@ +package core.game.content.activity.pyramidplunder; + +import core.game.content.activity.ActivityPlugin; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the Pyramid plunder activity. + * @author Emperor + */ +@Initializable +public final class PyramidPlunderActivity extends ActivityPlugin { + + /** + * The room locations. + */ + public static Location[] ROOM_LOCATIONS = { Location.create(1927, 4477, 0) }; + + /** + * The mummy NPC. + */ + private static NPC mummy; + + /** + * Constructs a new {@code PyramidPlunderActivity} {@code Object}. + */ + public PyramidPlunderActivity() { + super("Pyramid plunder", false, true, false); + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + enterRoom(player, 0); + return true; + } + + @Override + public boolean enter(Entity e) { + return super.enter(e); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + ((Player) e).getInterfaceManager().closeOverlay(); + ((PlunderSession) ((Player) e).getAttribute("plunder-session",null)).setActive(false); + } + return super.leave(e, logout); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return this; + } + + @Override + public void register() { + PluginManager.definePlugin(new GuardMummyDialogue()); + PluginManager.definePlugin(new PyramidOptionHandler()); + mummy = NPC.create(4476, Location.create(1968, 4427, 2)); + mummy.init(); + registerRegion(7749); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + } + + /** + * Enters a room. + * @param player The player. + * @param index The index. + */ + public void enterRoom(Player player, int index) { + player.lock(1); + player.getProperties().setTeleportLocation(ROOM_LOCATIONS[index]); + new PlunderSession(player).init(); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderMummyNPC.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderMummyNPC.java new file mode 100644 index 000000000..0be11faf7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderMummyNPC.java @@ -0,0 +1,53 @@ +package core.game.content.activity.pyramidplunder; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Handles the mummy NPC in pyramid plunder + * @author ceik + */ +public final class PyramidPlunderMummyNPC extends PyramidPlunderNPC { + + /** + * The swarm id. + */ + private static final int[] IDS = new int[] { 1958 }; + + public PyramidPlunderMummyNPC(int id, Location location, Player player) { + super(id, location, player); + } + + @Override + public void init() { + super.init(); + setRespawn(false); + getProperties().getCombatPulse().attack(player); + sendChat("How dare you disturb my rest!"); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + if (getProperties().getCombatPulse().isAttacking()) { + if (RandomFunction.random(40) < 2) { + sendChat("Leave this place!"); + } + } + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public int[] getIds() { + return IDS; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java new file mode 100644 index 000000000..eda87bbbf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderNPC.java @@ -0,0 +1,188 @@ +package core.game.content.activity.pyramidplunder; + +import core.game.interaction.MovementPulse; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Pathfinder; +import core.plugin.Plugin; + +/** + * Handles a Pyramid Plunder enemy, adapted from AntiMacroNPC.java by ceikry + * @author Vexia + */ +public abstract class PyramidPlunderNPC extends AbstractNPC { + + /** + * The player. + */ + protected final Player player; + + /** + * The quotes the npc will say(null if none) + */ + private String[] quotes; + + /** + * The counter representing speech cycles. + */ + private int count; + + /** + * The time until the next speech. + */ + private int nextSpeech; + + /** + * If the players time is up. + */ + protected boolean timeUp; + + /** + * The end time. + */ + private int endTime; + + /** + * Constructs a new {@code AntiMacroNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param player the player. + */ + public PyramidPlunderNPC(int id, Location location, Player player) { + super(id, location); + this.player = player; + this.quotes = quotes; + this.endTime = (int) (GameWorld.getTicks() + (1000 / 0.6)); + } + + @Override + public void init() { + location = RegionManager.getSpawnLocation(player, this); + if (location == null) { + clear(); + return; + } + super.init(); + startFollowing(); + } + + @Override + public void handleTickActions() { + if (GameWorld.getTicks() > endTime) { + clear(); + } + if (!getLocks().isMovementLocked()) { + if (dialoguePlayer == null || !dialoguePlayer.isActive() || !dialoguePlayer.getInterfaceManager().hasChatbox()) { + dialoguePlayer = null; + } + } + if (!player.isActive() || !getLocation().withinDistance(player.getLocation(), 10)) { + handlePlayerLeave(); + } + if (!getPulseManager().hasPulseRunning()) { + startFollowing(); + } + if (quotes != null) { + if (nextSpeech < GameWorld.getTicks() && this.getDialoguePlayer() == null && !this.getLocks().isMovementLocked()) { + if (count > quotes.length - 1) { + return; + } + nextSpeech = (int) (GameWorld.getTicks() + (20 / 0.5)); + if (++count >= quotes.length) { + setTimeUp(true); + handleTimeUp(); + return; + } + } + } + } + + /** + * Called when the player is gone. + */ + public void handlePlayerLeave() { + clear(); + } + + /** + * Called when the quotes are finished. + */ + public void handleTimeUp() { + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity instanceof Player && entity != player) { + ((Player) entity).getPacketDispatch().sendMessage("It's not after you."); + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public void onRegionInactivity() { + super.onRegionInactivity(); + clear(); + } + + @Override + public void clear() { + super.clear(); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return null; + } + + + + /** + * Starts following the player. + */ + public void startFollowing() { + getPulseManager().run(new MovementPulse(this, player, Pathfinder.DUMB) { + @Override + public boolean pulse() { + return false; + } + }, "movement"); + face(player); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return super.newInstance(arg); + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + + /** + * Gets the timeUp. + * @return The timeUp. + */ + public boolean isTimeUp() { + return timeUp; + } + + /** + * Sets the timeUp. + * @param timeUp The timeUp to set. + */ + public void setTimeUp(boolean timeUp) { + this.timeUp = timeUp; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderOptions.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderOptions.java new file mode 100644 index 000000000..4ab02ab1f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderOptions.java @@ -0,0 +1,341 @@ +/* +package core.game.content.activity.pyramidplunder; + +import org.crandor.cache.def.impl.ObjectDefinition; +import org.crandor.game.content.global.action.ClimbActionHandler; +import core.game.node.entity.skill.Skills; +import org.crandor.game.interaction.OptionHandler; +import org.crandor.game.node.Node; +import org.crandor.game.node.entity.combat.ImpactHandler; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.item.Item; +import org.crandor.game.node.object.ObjectBuilder; +import org.crandor.game.world.GameWorld; +import org.crandor.game.world.map.Location; +import org.crandor.game.world.map.zone.ZoneMonitor; +import org.crandor.game.world.update.flag.context.Animation; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.plugin.Plugin; +import org.crandor.tools.RandomFunction; + +*/ +/** + * Handle pyramid plunder object interactions + * @author ceik + *//* + +*/ +/** + * PyramidPlunderOptions defines interactions for pyramid plunder + * Copyright (C) 2020 2009scape, et. al + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the modified GNU General Public License + * as published by the Free Software Foundation and included in this repository; either version 2 + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + *//* + + +@InitializablePlugin +public final class PyramidPlunderOptions extends OptionHandler { + Item[][] ARTIFACTS = { {new Item(9032),new Item(9036), new Item(9026)}, {new Item(9042), new Item(9030), new Item(9038)}, {new Item(9040), new Item(9028), new Item(9034)} }; + private static final Animation[] animations = new Animation[] { new Animation(2247), new Animation(2248), new Animation(1113), new Animation(2244) }; + int reqLevel; + //Player player; + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(16517).getConfigurations().put("option:pass",this); + ObjectDefinition.forId(16503).getConfigurations().put("option:search",this); + ObjectDefinition.forId(16502).getConfigurations().put("option:search",this); + ObjectDefinition.forId(16501).getConfigurations().put("option:search",this); + ObjectDefinition.forId(16501).getConfigurations().put("option:check for snakes",this); + ObjectDefinition.forId(16502).getConfigurations().put("option:check for snakes",this); + ObjectDefinition.forId(16503).getConfigurations().put("option:check for snakes",this); + ObjectDefinition.forId(16473).getConfigurations().put("option:search",this); + ObjectDefinition.forId(16495).getConfigurations().put("option:open",this); + ObjectDefinition.forId(16475).getConfigurations().put("option:pick-lock",this); + ObjectDefinition.forId(16509).getConfigurations().put("option:search",this); + ObjectDefinition.forId(16510).getConfigurations().put("option:search",this); + ObjectDefinition.forId(16511).getConfigurations().put("option:search",this); + + + return this; + } + public void rollSceptre(Player player){ + if(RandomFunction.random(1000) == 451){ + if(!player.getInventory().isFull()) { + player.getInventory().add(new Item(9044)); + player.getPacketDispatch().sendMessage("You find a strange object."); + } else { + player.getBank().add(new Item(9044)); + player.getPacketDispatch().sendMessage("You sense that something has appeared in your bank."); + } + } + } + public final boolean success(final Player player, final int skill) { + double level = player.getSkills().getLevel(skill); + double successChance = Math.ceil((level * 50 - reqLevel) / reqLevel / 3 * 4); + int roll = RandomFunction.random(99); + if (successChance >= roll) { + return true; + } + return false; + } + @Override + public boolean handle(Player player, Node node, String option) { + PlunderObjectManager manager = player.getPlunderObjectManager(); + int NPCDeathTime = GameWorld.getTicks() + (1000 / 6); + Location room_entrance[] = {new Location(1927,4477), new Location(1927,4453), new Location(1943,4421), new Location(1954,4477), new Location(1974,4420), new Location(1977,4471), new Location(1927, 4424), new Location(1965,4444)}; + int level = player.getSkills().getLevel(Skills.THIEVING); + int room = 0; + int spearX = 0; + int spearY = 0; + double droom = 0.0; + ZoneMonitor zmon = player.getZoneMonitor(); + if(zmon.isInZone("plunder:room1")){ + room = 1; + reqLevel = 21; + spearX = 0; + spearY = -2; + } else if(zmon.isInZone("plunder:room2")){ + room = 2; + reqLevel = 31; + spearX = 2; + spearY = 0; + } else if(zmon.isInZone("plunder:room3")){ + room = 3; + reqLevel = 41; + spearX = 0; + spearY = 2; + } else if(zmon.isInZone("plunder:room4")){ + room = 4; + reqLevel = 51; + spearX = 0; + spearY = -2; + } else if(zmon.isInZone("plunder:room5")){ + room = 5; + reqLevel = 61; + spearX = 0; + spearY = 2; + } else if(zmon.isInZone("plunder:room6")){ + room = 6; + reqLevel = 71; + spearX = 0; + spearY = -2; + } else if(zmon.isInZone("plunder:room7")){ + room = 7; + reqLevel = 81; + spearX = 0; + spearY = 2; + } else if(zmon.isInZone("plunder:room8")){ + room = 8; + reqLevel = 91; + spearX = -2; + spearY = 0; + } + PlunderObject object = new PlunderObject(node.asObject().getId(),node.asObject().getLocation(),player); + droom = (double) room; + switch (object.getId()) { + case 16517: + if (option.equalsIgnoreCase("pass")) { + if (reqLevel > level){ + player.getPacketDispatch().sendMessage("You need to be at least level " + reqLevel + " thieving."); + break; + } + boolean success = success(player, Skills.THIEVING); + player.animate(animations[success ? 1 : 0]); + if (success) { + player.getPacketDispatch().sendMessage("You successfully pass the spears."); + player.getSkills().addExperience(Skills.THIEVING, 30 + (room * 20), true); + int moveX = player.getLocation().getX(); + int moveY = player.getLocation().getY(); + Location moveto = new Location(moveX + spearX, moveY + spearY); + player.getProperties().setTeleportLocation(moveto); + //player.moveStep(); + } else { + player.getPacketDispatch().sendMessage("You fail to pass the spears."); + } + } + break; + case 16503: + case 16502: + case 16501: + if (option.equalsIgnoreCase("search")) { + if (reqLevel > level){ + player.getPacketDispatch().sendMessage("You need to be at least level " + reqLevel + " thieving."); + break; + } + if (manager.objectList.contains(object) ? manager.objectList.get(manager.objectList.indexOf(object)).playerOpened : false){ + player.getPacketDispatch().sendMessage("You've already looted this."); + break; + } + boolean success = success(player, Skills.THIEVING); + player.animate(animations[success ? 1 : 0]); + player.lock(2); + if (manager.objectList.contains(object) ? manager.objectList.get(manager.objectList.indexOf(object)).snakeCharmed : success) { + player.getPacketDispatch().sendMessage("You successfully search the urn..."); + player.getSkills().addExperience(Skills.THIEVING, 25 + (room * 20), true); + player.getInventory().add(ARTIFACTS[((int)Math.floor(droom / 3))][RandomFunction.random(3)]); + rollSceptre(player); + if(!manager.objectList.contains(object)) { + object.playerOpened = true; + manager.register(object); + } else { + manager.objectList.get(manager.objectList.indexOf(object)).playerOpened = true; + } + switch(object.getId()){ + case 16501: + ObjectBuilder.replace(node.asObject(), node.asObject().transform(16505), 5); + break; + case 16502: + ObjectBuilder.replace(node.asObject(), node.asObject().transform(16506), 5); + break; + case 16503: + ObjectBuilder.replace(node.asObject(), node.asObject().transform(16507), 5); + break; + } + } else { + player.getPacketDispatch().sendMessage("You failed and got bit by a snake."); + player.getImpactHandler().manualHit(player,RandomFunction.random(2,8), ImpactHandler.HitsplatType.NORMAL); + } + } else if(option.equalsIgnoreCase("check for snakes")){ + if(manager.objectList.contains(object) && manager.objectList.get(manager.objectList.indexOf(object)).snakeCharmed){ + player.getPacketDispatch().sendMessage("You already checked for snakes."); + } else { + player.getPacketDispatch().sendMessage("You check the urn for snakes..."); + if (!manager.objectList.contains(object)) { + manager.register(object); + } + manager.originalIndex = manager.objectList.indexOf(object); + switch(object.getId()){ + case 16501: + ObjectBuilder.replace(node.asObject(), node.asObject().transform(16509), 5); + break; + case 16502: + ObjectBuilder.replace(node.asObject(), node.asObject().transform(16510), 5); + break; + case 16503: + ObjectBuilder.replace(node.asObject(), node.asObject().transform(16511), 5); + break; + } + } + } + break; + case 16509: + case 16510: + case 16511: + if(option.equalsIgnoreCase("search") && player.getInventory().containsItem(new Item(4605))){ + player.animate(new Animation(1877)); + player.getPacketDispatch().sendMessage("You charm the snake into docility."); + if(!manager.objectList.contains(manager.objectList.get(manager.originalIndex))) { + object.snakeCharmed = true; + manager.register(object); + } else { + manager.objectList.get(manager.originalIndex).snakeCharmed = true; + } + } else { + player.getImpactHandler().manualHit(player, RandomFunction.random(2, 8), ImpactHandler.HitsplatType.NORMAL); + player.getPacketDispatch().sendMessage("The snake bites you."); + } + break; + case 16473: + if(option.equalsIgnoreCase("search")) { + boolean willSpawnSwarm = (RandomFunction.random(1,20) == 10); + if (reqLevel > level){ + player.getPacketDispatch().sendMessage("You need to be at least level " + reqLevel + " thieving."); + break; + } + if (manager.objectList.contains(object) ? manager.objectList.get(manager.objectList.indexOf(object)).playerOpened : false){ + player.getPacketDispatch().sendMessage("You've already looted this."); + break; + } + player.getPacketDispatch().sendMessage("You search the chest..."); + player.animate(animations[1]); + player.lock(2); + if(willSpawnSwarm) { + player.getPacketDispatch().sendMessage("A swarm flies out!"); + PyramidPlunderSwarmNPC swarm = new PyramidPlunderSwarmNPC(2001,player.getLocation(),player); + swarm.setRespawn(false); + swarm.setAggressive(true); + swarm.init(); + } else { + player.getInventory().add(ARTIFACTS[RandomFunction.random(1, 3)][RandomFunction.random(3)]); + rollSceptre(player); + player.getPacketDispatch().sendMessage("And you find an artifact!"); + player.getSkills().addExperience(Skills.THIEVING, 40 + (room * 20)); + } + ObjectBuilder.replace(node.asObject(), node.asObject().transform(16474), 5); + if(!manager.objectList.contains(object)) { + object.playerOpened = true; + manager.register(object); + } else { + manager.objectList.get(manager.objectList.indexOf(object)).playerOpened = true; + } + } + break; + case 16495: + if(option.equalsIgnoreCase("open")) { + if (reqLevel > level){ + player.getPacketDispatch().sendMessage("You need to be at least level " + reqLevel + " thieving."); + break; + } + if (manager.objectList.contains(object) ? manager.objectList.get(manager.objectList.indexOf(object)).playerOpened : false){ + player.getPacketDispatch().sendMessage("You've already looted this."); + break; + } + boolean willSpawnMummy = (RandomFunction.random(1,5) == 3); + player.animate(animations[1]); + player.getPacketDispatch().sendMessage("You open the sarcophagus and...."); + if(willSpawnMummy) { + player.getPacketDispatch().sendMessage("A mummy crawls out!"); + PyramidPlunderMummyNPC mummy = new PyramidPlunderMummyNPC(1958, player.getLocation(),player); + mummy.setRespawn(false); + mummy.setAggressive(true); + mummy.init(); + } else { + player.getPacketDispatch().sendMessage("You find some loot inside."); + player.getInventory().add(ARTIFACTS[RandomFunction.random(0,3)][RandomFunction.random(3)]); + rollSceptre(player); + player.getSkills().addExperience(Skills.STRENGTH,50 + (room * 20)); + } + ObjectBuilder.replace(node.asObject(), node.asObject().transform(16496), 5); + if(!manager.objectList.contains(object)) { + object.playerOpened = true; + manager.register(object); + } else { + manager.objectList.get(manager.objectList.indexOf(object)).playerOpened = true; + } + } + break; + case 16475: + if(option.equals("pick-lock") && room < 8) { + if (reqLevel > level){ + player.getPacketDispatch().sendMessage("You need to be at least level " + reqLevel + " thieving."); + break; + } + player.animate(animations[1]); + player.lock(2); + boolean doesOpen = success(player, Skills.THIEVING); + if (doesOpen) { + player.getPacketDispatch().sendMessage("The door opens!"); + player.getProperties().setTeleportLocation(room_entrance[room]); + } else { + player.getPacketDispatch().sendMessage("You fail to unlock the door."); + } + } else if(room == 8) { + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, Location.create(3288, 2801, 0)); + } + break; + } + return true; + } +}*/ diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderRoom.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderRoom.java new file mode 100644 index 000000000..4f76e6564 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderRoom.java @@ -0,0 +1,40 @@ +package core.game.content.activity.pyramidplunder; + +import core.game.world.map.Location; + +import java.util.Arrays; +import java.util.List; + +//defines room properties for pyramid plunder +//@author ceik +public enum PyramidPlunderRoom { + ROOM_1(1, 21, 0, -2,new Location(1927,4477), new Location[] {Location.create(1924, 4472, 0), Location.create(1931, 4472, 0), Location.create(1932, 4466, 0),Location.create(1923, 4466, 0)}), + ROOM_2(2, 31, 2, 0,new Location(1927,4453), new Location[] {Location.create(1937, 4459, 0),Location.create(1941, 4456, 0),Location.create(1937, 4448, 0),Location.create(1932, 4450, 0)}), + ROOM_3(3, 41, 0, 2,new Location(1943,4421), new Location[] {Location.create(1946, 4433, 0),Location.create(1955, 4430, 0),Location.create(1954, 4424, 0),Location.create(1949, 4422, 0)}), + ROOM_4(4, 51, 0, -2,new Location(1954,4477), new Location[] {Location.create(1957, 4472, 0),Location.create(1960, 4468, 0),Location.create(1959, 4465, 0),Location.create(1949, 4465, 0)}), + ROOM_5(5, 61, 0, 2,new Location(1974,4420), new Location[] {Location.create(1969, 4427, 0),Location.create(1967, 4432, 0),Location.create(1973, 4437, 0),Location.create(1979, 4430, 0)}), + ROOM_6(6, 71, 0, -2,new Location(1977,4471), new Location[] {Location.create(1980, 4458, 0),Location.create(1976, 4453, 0),Location.create(1974, 4453, 0),Location.create(1969, 4460, 0)}), + ROOM_7(7, 81, 0, 2,new Location(1927, 4424), new Location[] {Location.create(1923, 4432, 0),Location.create(1925, 4440, 0),Location.create(1929, 4440, 0),Location.create(1931, 4432, 0)}), + ROOM_8(8, 91, -2, 0,new Location(1965,4444), new Location[] {Location.create(1952, 4447, 0),Location.create(1953, 4445, 0),Location.create(1957, 4444, 0),Location.create(1962, 4448, 0)}); + + public int roomNum, reqLevel, spearX, spearY; + Location entrance; + public List doorLocations; + PyramidPlunderRoom(int roomNum, int reqLevel, int spearX, int spearY, Location entrance, Location[] door_locations){ + this.roomNum = roomNum; + this.reqLevel = reqLevel; + this.spearX = spearX; + this.spearY = spearY; + this.entrance = entrance; + this.doorLocations = Arrays.asList(door_locations); + } + + public static PyramidPlunderRoom forRoomNum(int roomNum){ + for(PyramidPlunderRoom room : PyramidPlunderRoom.values()){ + if(room.roomNum == roomNum){ + return room; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderSwarmNPC.java b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderSwarmNPC.java new file mode 100644 index 000000000..61b4f03e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/pyramidplunder/PyramidPlunderSwarmNPC.java @@ -0,0 +1,53 @@ +package core.game.content.activity.pyramidplunder; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Handles the swarm NPC in pyramid plunder + * @author ceik + */ +public final class PyramidPlunderSwarmNPC extends PyramidPlunderNPC { + + /** + * The swarm id. + */ + private static final int[] IDS = new int[] { 2001 }; + + public PyramidPlunderSwarmNPC(int id, Location location, Player player) { + super(id, location, player); + } + + @Override + public void init() { + super.init(); + setRespawn(false); + getProperties().getCombatPulse().attack(player); + sendChat("bzzzzz"); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + if (getProperties().getCombatPulse().isAttacking()) { + if (RandomFunction.random(40) < 2) { + sendChat("bzzzzz"); + } + } + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public int[] getIds() { + return IDS; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/BoxOfHealthDialogue.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/BoxOfHealthDialogue.java new file mode 100644 index 000000000..73f33c179 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/BoxOfHealthDialogue.java @@ -0,0 +1,76 @@ +package core.game.content.activity.stronghold; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the box of health. + * @author 'Vexia + * @version 1.0 + */ +public final class BoxOfHealthDialogue extends DialoguePlugin { + + /** + * Represents the coins to recieve. + */ + private static final Item COINS = new Item(995, 5000); + + /** + * Constructs a new {@code BoxOfHealth} {@code Object}. + */ + public BoxOfHealthDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BoxOfHealth} {@code Object}. + * @param player the player. + */ + public BoxOfHealthDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BoxOfHealthDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("The box hinges creak and appear to be forming audible words...."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + end(); + break; + } + stage = 1; + player.getInventory().add(COINS); + interpreter.sendDialogue("...congratulations adventurer, you have been deemed worthy of this", "reward. You have also unlocked the Idea emote!"); + player.getEmoteManager().unlock(Emotes.IDEA); + player.getSavedData().getGlobalData().getStrongHoldRewards()[2] = true; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 96878 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/CradleOfLifeDialogue.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/CradleOfLifeDialogue.java new file mode 100644 index 000000000..e634eb8ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/CradleOfLifeDialogue.java @@ -0,0 +1,170 @@ +package core.game.content.activity.stronghold; + +import core.game.container.Container; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the cradle of life. + * @author 'Vexia + * @version 1.0 + */ +public final class CradleOfLifeDialogue extends DialoguePlugin { + + /** + * Represents the items related to the cradle of life. + */ + private static final Item[] ITEMS = new Item[] { new Item(9005, 1), new Item(9006, 1) }; + + /** + * Constructs a new {@code CradleOfLife} {@code Object}. + */ + public CradleOfLifeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CradleOfLife} {@code Object}. + * @param player the player. + */ + public CradleOfLifeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CradleOfLifeDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (player.getSavedData().getGlobalData().getStrongHoldRewards()[3]) { + player.getEmoteManager().unlock(Emotes.STOMP); + } + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + end(); + return true; + } + if (player.getSavedData().getGlobalData().getStrongHoldRewards()[3]) { + interpreter.sendDialogue("As your hand touches the cradle, you hear a voice in your head of a", "million dead adventurers...."); + stage = 100; + return true; + } + interpreter.sendDialogue("As your hand touches the cradle, you hear a voice in your head of a", "million dead adventurers...."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogue("....welcome adventurer... you have a choice...."); + stage = 1; + break; + case 1: + interpreter.sendDoubleItemMessage(9005, 9006, "You can choose between these two pair of boots."); + stage = 2; + break; + case 2: + interpreter.sendDialogue("They will both protect your feet exactly the same, however they look", "very different. You can always come back and get another pair if", "you lose them, or even swap them for the other style!"); + stage = 4; + break; + case 4: + interpreter.sendOptions("Choose your style of boots", "I'll take the colourful ones!", "I'll take the fighting ones!"); + stage = 5; + break; + case 5: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll take the colourful ones!"); + player.getInventory().add(ITEMS[0]); + player.getEmoteManager().unlock(Emotes.STOMP); + stage = 6; + player.getSavedData().getGlobalData().getStrongHoldRewards()[3] = true; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll take the fighting ones!"); + player.getInventory().add(ITEMS[1]); + player.getEmoteManager().unlock(Emotes.STOMP); + player.getSavedData().getGlobalData().getStrongHoldRewards()[3] = true; + stage = 6; + break; + } + break; + case 6: + interpreter.sendDialogue("Congratulations! You have succesfully navigated the Stronghold of", "Security and learned to secure your account. You have unlocked", "the 'Stamp Foot' emote. Remember to keep your account secure in", "the future!"); + stage = 7; + break; + case 7: + end(); + break; + + case 100: + if (!player.getInventory().contains(9005, 1) && !player.getBank().contains(900, 1) && !player.getEquipment().contains(9005, 1) && !player.getInventory().contains(9006, 1) && !player.getBank().contains(9006, 1) && !player.getEquipment().contains(9006, 1)) { + interpreter.sendDialogue("You appear to have lost your boots!"); + stage = 101; + } else { + interpreter.sendOptions("Select an Option", "Yes, I'd like the other pair instead please!", "No thanks, I'll keep these!"); + stage = 200; + } + break; + case 200: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, I'd like the other pair instead please!"); + stage = 800; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I'll keep these!"); + stage = 900; + break; + } + break; + case 800: + if (!swap(player.getInventory())) { + if (!swap(player.getEquipment())) { + swap(player.getBank()); + } + } + end(); + break; + case 900: + end(); + break; + case 101: + interpreter.sendDialogue("....welcome adventurer... you have a choice...."); + stage = 1; + break; + } + return true; + } + + /** + * Method used to swap a pair of boots. + * @param container the container. + * @return {@code True} if swapped. + */ + public boolean swap(Container container) { + if (container.contains(9005, 1)) { + container.replace(new Item(9006), container.getSlot(ITEMS[0])); + return true; + } + if (container.contains(9006, 1)) { + container.replace(ITEMS[0], container.getSlot(ITEMS[1])); + return true; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 96873 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/GiftOfPeaceDialogue.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/GiftOfPeaceDialogue.java new file mode 100644 index 000000000..6a4eadb6c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/GiftOfPeaceDialogue.java @@ -0,0 +1,75 @@ +package core.game.content.activity.stronghold; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.node.item.Item; + +/** + * Represents the gift of peace dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class GiftOfPeaceDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 2000); + + /** + * Constructs a new {@code GiftOfPeaceDialogue} {@code Object}. + */ + public GiftOfPeaceDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GiftOfPeaceDialogue} {@code Object}. + * @param player the player. + */ + public GiftOfPeaceDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GiftOfPeaceDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("The box hinges creak and appear to be forming audible words...."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + end(); + break; + } + interpreter.sendDialogue("...congratulations adventurer, you have been deemed worthy of this", "reward. You have also unlocked the Flap emote!"); + stage = 1; + player.getInventory().add(COINS); + player.getEmoteManager().unlock(Emotes.FLAP); + player.getSavedData().getGlobalData().getStrongHoldRewards()[0] = true; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 54678 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/GrainOfPlentyDialogue.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/GrainOfPlentyDialogue.java new file mode 100644 index 000000000..94746edd5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/GrainOfPlentyDialogue.java @@ -0,0 +1,75 @@ +package core.game.content.activity.stronghold; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.node.item.Item; + +/** + * Represents the grain of plenty dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class GrainOfPlentyDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 3000); + + /** + * Constructs a new {@code GrainOfPlenty} {@code Object}. + */ + public GrainOfPlentyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GrainOfPlenty} {@code Object}. + * @param player the player. + */ + public GrainOfPlentyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GrainOfPlentyDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("The grain shifts in the sack, sighing audible words...."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + end(); + break; + } + player.getSavedData().getGlobalData().getStrongHoldRewards()[1] = true; + interpreter.sendDialogue("...congratualtions adventurer, you have been deemed worthy of this", "reward. You have also unlocked the Slap Head emote!"); + stage = 1; + player.getInventory().add(COINS); + player.getEmoteManager().unlock(Emotes.SLAP_HEAD); + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 56875 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.java new file mode 100644 index 000000000..9df393215 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/StrongHoldSecurityPlugin.java @@ -0,0 +1,976 @@ +package core.game.content.activity.stronghold; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentPlugin; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the strong hold of security. + * @author Vexia + */ +@Initializable +public final class StrongHoldSecurityPlugin extends MapZone implements Plugin { + + /** + * The portal data to use. + */ + private static final Object[][] PORTALS = new Object[][] { { 16150, Location.create(1914, 5222, 0) }, { 16082, Location.create(2021, 5223, 0) }, { 16116, Location.create(2146, 5287, 0) }, { 16050, Location.create(2341, 5219, 0) } }; + + /** + * Constructs a new {@code StrongHoldSecurityPlugin} {@code Object}. + */ + public StrongHoldSecurityPlugin() { + super("strong hold of security", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugin(new ExplorerDialogue()); + PluginManager.definePlugin(new StrongholdDialogue()); + PluginManager.definePlugin(new GrainOfPlentyDialogue()); + PluginManager.definePlugin(new GiftOfPeaceDialogue()); + PluginManager.definePlugin(new CradleOfLifeDialogue()); + PluginManager.definePlugin(new BoxOfHealthDialogue()); + PluginManager.definePlugin(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(16154).getHandlers().put("option:climb-down", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + flagDoor(player, false); + ClimbActionHandler.climb(player, new Animation(828), Location.create(1859, 5243, 0)); + player.getDialogueInterpreter().open(70099, "You squeeze through the hole and find a ladder a few feet down", "leading into the Stronghold of Security."); + return true; + } + }); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + final Player player = (Player) e; + switch (target.getId()) { + case 16148:// ladder + ladder(player, Location.create(3081, 3421, 0)); + player.getPacketDispatch().sendMessage("You climb up the ladder to the surface."); + return true; + case 16146:// ladder. + ladder(player, new Location(1859, 5243, 0)); + player.getPacketDispatch().sendMessage("You climb the ladder which seems to twist and wind in all directions."); + return true; + case 16078:// ladder + ladder(player, new Location(2042, 5245, 0)); + player.getPacketDispatch().sendMessage("You climb the ladder which seems to twist and wind in all directions."); + return true; + case 16080:// lader + ladder(player, Location.create(1859, 5243, 0)); + return true; + case 16048:// bone chain. + ladder(player, Location.create(3081, 3421, 0)); + player.getPacketDispatch().sendMessage("You climb the ladder which seems to twist and wind in all directions."); + return true; + case 16049:// boney ladder to get to third floor. + ladder(player, Location.create(2123, 5252, 0)); + return true; + case 16112:// third vine. + ladder(player, Location.create(2123, 5252, 0)); + player.getPacketDispatch().sendMessage("You climb the ladder which seems to twist and wind in all directions."); + return true; + case 16114:// third ladder. + ladder(player, Location.create(2042, 5245, 0)); + player.getPacketDispatch().sendMessage("You climb up the ladder to the level above."); + return true; + case 16081:// second ladder going down. + openComponent(player, Location.create(2123, 5252, 0)); + return true; + case 16115:// third ladder going down. + openComponent(player, Location.create(2358, 5215, 0)); + return true; + case 16149:// fourth ladder going down. + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 4); + openComponent(player, Location.create(2042, 5245, 0)); + return true; + case 16135:// claim gift of piece. + case 16118:// claim box of health. + if (player.getSavedData().getGlobalData().hasStrongholdReward(target.getId() == 16135 ? 1 : 3)) { + player.getDialogueInterpreter().open(70099, "You have already claimed your reward from this level."); + } else { + player.getDialogueInterpreter().open(target.getId() == 16118 ? 96878 : 54678); + } + return true; + case 16077:// grain of plenty + if (player.getSavedData().getGlobalData().hasStrongholdReward(2)) { + player.getDialogueInterpreter().open(70099, "You have already claimed your reward from this level."); + } else { + player.getDialogueInterpreter().open(56875); + } + return true; + case 16047:// cradle + player.getDialogueInterpreter().open(96873); + return true; + case 16152:// skeleton + player.getDialogueInterpreter().open(16152); + return true; + case 16150: + case 16082: + case 16116: + case 16050: + handlePortal(player, (GameObject) target); + return true; + case 16123: + case 16124: + case 16126: + case 16127: + case 16065: + case 16066: + case 16067: + case 16068: + case 16089: + case 16090: + case 16092: + case 16043: + case 16044: + case 16045: + case 16046: + handleDoor(player, (GameObject) target); + return true; + } + } + return super.interact(e, target, option); + } + + /** + * Handles a ladder in strong hold. + * @param player the player. + * @param destination the destination. + */ + private void ladder(final Player player, final Location destination) { + ClimbActionHandler.climb(player, new Animation(828), destination); + } + + /** + * Handles a portal. + * @param player the player. + */ + private void handlePortal(final Player player, final GameObject object) { + final int index = getPortalIndex(object.getId()); + if (!player.getSavedData().getGlobalData().hasStrongholdReward(index + 1)) { + player.getPacketDispatch().sendMessage("You are not of sufficient experience to take the shortcut through this level."); + } else { + player.getProperties().setTeleportLocation((Location) PORTALS[index][1]); + player.getPacketDispatch().sendMessage("You enter the portal to be whisked through to the treasure room."); + } + } + + /** + * Handles a stronghold of security door. + * @param player the player. + * @param object the object. + */ + private static void handleDoor(final Player player, final GameObject object) { + final boolean force = isForced(player, object); + if (force || RandomFunction.random(40) < 2) { + openDoor(player, object); + return; + } + player.getDialogueInterpreter().open("strong-hold", object); + } + + /** + * Opens the door. + * @param player the player. + * @param object the object. + */ + private static void openDoor(final Player player, final GameObject object) { + player.lock(3); + player.animate(Animation.create(4282)); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + final java.awt.Point p = DoorActionHandler.getRotationPoint(object.getRotation()); + Location destination = !player.getLocation().equals(object.getLocation()) ? object.getLocation() : object.getLocation().transform((int) p.getX(), (int) p.getY(), 0); + player.getProperties().setTeleportLocation(destination); + break; + case 2: + player.animate(new Animation(4283)); + flagDoor(player, !isFlagged(player)); + return true; + } + return false; + } + }); + } + + /** + * Opens the component. + * @param player the player. + * @param location the location. + */ + private void openComponent(Player player, Location location) { + final Component component = new Component(579); + component.setPlugin(new StrongholdComponentPlugin(location)); + player.getInterfaceManager().open(component); + } + + /** + * Flags a door as set or not. + * @param player the player. + * @param completed if completed. + */ + private static void flagDoor(Player player, boolean completed) { + player.setAttribute("/save:strong-hold:door", completed); + } + + /** + * Checks if the door is flagged. + * @param player the player. + * @return {@code True} if flagged. + */ + private static boolean isFlagged(final Player player) { + return player.getAttribute("strong-hold:door", false); + } + + /** + * Checks if a door is forced to let you through. + * @param player the player. + * @param object the object. + * @return {@code True} if its forced. + */ + private static boolean isForced(final Player player, final GameObject object) { + if (player.inCombat() || player.getProperties().getCombatPulse().isAttacking()) { + return true; + } + return isFlagged(player); + } + + /** + * Gets the portal index. + * @param id the id. + * @return the portal index. + */ + private int getPortalIndex(int id) { + for (int i = 0; i < PORTALS.length; i++) { + if ((int) PORTALS[i][0] == id) { + return i; + } + } + return 0; + } + + @Override + public void configure() { + register(new ZoneBorders(1836, 5174, 1930, 5257));// first level. + register(new ZoneBorders(1977, 5176, 2066, 5265));// second level. + register(new ZoneBorders(2090, 5246, 2197, 5336));// third level. + register(new ZoneBorders(2297, 5166, 2391, 5261));// fourth level. + } + + /** + * Handles the strong hold dialogues. + * @author Vexia + */ + public static final class StrongholdDialogue extends DialoguePlugin { + + /** + * The door being interacted with. + */ + private GameObject door; + + /** + * The npc id. + */ + private int npcId; + + /** + * Constructs a new {@code StrongholdDialogue} {@code Object}. + * @param player the player. + */ + public StrongholdDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code StrongholdDialogue} {@code Object}. + */ + public StrongholdDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new StrongholdDialogue(player); + } + + @Override + public boolean open(Object... args) { + door = (GameObject) args[0]; + npcId = getNpcId(door.getName()); + if (player.getLocation().getX() == 1859 && player.getLocation().getY() == 5239 || player.getLocation().getX() == 1858 && player.getLocation().getY() == 5239) { + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Greetings Adventurer. This place is kept safe by the", "spirits within the doors. As you pass through you will be", "asked questions about security. Hopefully you will learn", "much from us."); + stage = 900; + return true; + } + final int rand = RandomFunction.random(0, 18); + switch (rand) { + case 0: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: What do I do if a", "moderator asks me for my account details?"); + stage = 100; + break; + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: My friend uses this", "great add-on program he got from a website, should I?"); + stage = 1000; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: Who is it ok to", "share my account with?"); + stage = 200; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: Why do I need to", "type in recovery questions?"); + stage = 300; + break; + case 4: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: Who is it ok to", "share my account with?"); + stage = 400; + break; + case 5: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: Who can I give my", "password to?"); + stage = 500; + break; + case 6: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: How will " + GameWorld.getSettings().getName() + "", "contact me if I have been chosen to be a moderator?"); + stage = 600; + break; + case 7: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: How often should", "you change your recovery questions?"); + stage = 700; + break; + case 8: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: A website says I", "can become a player moderator by giving", "them my password what do I do?"); + stage = 800; + break; + case 9: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: Will " + GameWorld.getSettings().getName() + " block me", "from saying my PIN in game?"); + stage = 1900; + break; + case 10: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: Can I leave my", "account logged in while I'm out of the room?"); + stage = 1100; + break; + case 11: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: Where should I", "enter my " + GameWorld.getSettings().getName() + " Password?"); + stage = 1111; + break; + case 12: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: What is an", "example of a good bank PIN?"); + stage = 1200; + break; + case 13: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: What do I do if I", "think I have a keylogger or virus?"); + stage = 1300; + break; + case 14: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: Recovery answers", "should be..."); + stage = 1400; + break; + case 15: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: What do you do", "if someone tells you that you have won the " + GameWorld.getSettings().getName() + "", "Lottery and asks for your password or recoveries?"); + stage = 1500; + break; + case 16: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: What should I", "do if I think someone knows my recoveries?"); + stage = 1600; + break; + case 17: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: What do you do", "if someone asks you for your password or recoveries", "to make you a player moderator?"); + stage = 1700; + break; + case 18: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "To pass you must answer me this: Where can i", "find cheats for " + GameWorld.getSettings().getName() + "?"); + stage = 1800; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 900: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Please pass through and begin your adventure, beware", "of the various monsters that dwell within."); + stage = 901; + break; + case 901: + openDoor(player, door); + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Oh my! I just got sucked through that door... what a", "weird feeling! Still, I guess I should expect it as these", "evidently aren't your average kind of doors.... they talk", "and look creepy!"); + stage = 902; + break; + case 902: + end(); + break; + case 100: + interpreter.sendOptions("Select an Option", "Tell them whatever they want to know.", "Politely tell them no.", "Politely tell them no and then use the 'Report Abuse' button."); + stage = 101; + break; + case 101: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! Never give your account details to anyone!", "This includes things like recovery answers, contact", "details and passwords. Never use personal details for", "recoveries or bank PINs!"); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Ok! Don't tell them the details. But reporting the", "incident to " + GameWorld.getSettings().getName() + " would help. Use the Report Abuse", "button. Never use personal details for recoveries or", "bank PINs!"); + stage = 69; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! Report any attempt to gain your account", "details as it is a very serious breach of " + GameWorld.getSettings().getName() + "'s", "rules. Never use personal details for recoveries or bank", "PINs!"); + stage = 69; + break; + } + break; + case 99: + end(); + break; + case 1000: + interpreter.sendOptions("Select an Option", "No, it might steal my password.", "I'll gave it a try and see if I like it.", "Sure, he's used it alot, so can I."); + stage = 10001; + break; + case 10001: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! The only safe add-on for " + GameWorld.getSettings().getName() + " is the Window", "client available from our " + GameWorld.getSettings().getName() + " Website."); + stage = 69; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! Some programs steal your password without", "you even knowing, this only requires running the", "program once, even if you don't use it."); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! The program may steal your password and is", "against the rules to use."); + stage = 99; + break; + } + break; + case 200: + + interpreter.sendOptions("Select an Option", "My friends.", "Relatives.", "Nobody."); + stage = 201; + break; + case 201: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! You account may only be used by you."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! Your account may only be used by you."); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! You, can you only may use your account."); + stage = 69; + break; + } + break; + case 300: + interpreter.sendOptions("Select an Option", "To help me recover my password if I forget it or it is stolen.", "To let " + GameWorld.getSettings().getName() + " know more about its players.", "To see if I can type in random letters on my keyboard."); + stage = 301; + break; + case 301: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! Your recovery questions will help " + GameWorld.getSettings().getName() + " staff protect", "and return your account if it is stolen. Never use personal", "details for recoveries or bank PINs!"); + stage = 69; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! " + GameWorld.getSettings().getName() + " values players opinons, but we use polls", "and forums to see what you think. The recoveries are not there to gain personal", "information about anybody but to protect your account.", "Never use personal details"); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! Typing random letters into your recoveries", "won't help you or the " + GameWorld.getSettings().getName() + " staff - you'll never", "remember them anyway! Never use personal details for", "recoveries or bank PINs!"); + stage = 99; + break; + } + break; + case 400: + interpreter.sendOptions("Select an Option", "My friends", "Relatives", "Nobody"); + stage = 401; + break; + case 401: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! You account may only be used by you."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! You account may only be used by you."); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! You, and you only may use your account."); + stage = 69; + break; + } + break; + case 500: + interpreter.sendOptions("Select an Option", "My friends", "My brother", "Nobody"); + stage = 501; + break; + case 501: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! Your password should be kept secret from", "everyone. You should *never* give it out under any", "circumstances."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! Your password should be kept secret from", "everyone. You should *never* give it out under any", "circumstances."); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! Your password should be kept secret from", "everyone. You should *never* give it out under any", "circumstances."); + stage = 69; + break; + } + break; + case 600: + interpreter.sendOptions("Select an Option", "Email.", "Website popup.", "Game Inbox on the " + GameWorld.getSettings().getName() + " Website."); + stage = 601; + break; + case 601: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! " + GameWorld.getSettings().getName() + " never uses email to contact you, this is a", "scam and a fake, do not reply to it and delete it", "straight away. " + GameWorld.getSettings().getName() + " will only contact you through your", "Game Inbox avaibale on our website."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! " + GameWorld.getSettings().getName() + " would never use such an insecure", "method to pick you. We will contact you through your", "Game Inbox available on our website."); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! We only contact our players via the game", "Inbox which you can access from our " + GameWorld.getSettings().getName() + "", "website."); + stage = 69; + break; + } + break; + case 700: + interpreter.sendOptions("Select an Option", "Never", "Every couple of months", "Every day"); + stage = 701; + break; + case 701: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Never changing your recovery questions will lead to", "an insecure account due to keyloggers or friends knowing", "enough about you to guess them. Don't use personal details for your recoveries."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! it is the ideal option to change your questions", "but make sure you can remember the answers!", "Don't use personal details for your recoveries."); + stage = 69; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Normally recovery questions will take 14 days to", "become active, so there's no point in changing them", "everyday! Don't use personal details for your", "recoveries."); + stage = 99; + break; + } + break; + case 800: + interpreter.sendOptions("Select an Option", "Nothing.", "Give them my password.", "Don't tell them anything and inform " + GameWorld.getSettings().getName() + " through the game website."); + stage = 801; + break; + case 801: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "This is one solution, however someone will fall for", "this scam sooner or later. Tell us about it through", "the " + GameWorld.getSettings().getName() + " website. Remember that moderators are hand", "picked by " + GameWorld.getSettings().getName() + "."); + stage = 69; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! This will almost certainly lead to your accout", "being hijacked. No website can make you a moderator", "as they are hand picked by " + GameWorld.getSettings().getName() + "."); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! By informing us we can have the site taken", "down so other people will not have their accounts", "hijacked by this scam."); + stage = 69; + break; + } + break; + case 1900: + interpreter.sendOptions("Select an Option", "Yes.", "No."); + stage = 1901; + break; + case 1901: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! " + GameWorld.getSettings().getName() + " does NOT block your PIN so don't type", "it!"); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! " + GameWorld.getSettings().getName() + " will not block your PIN so don't type", "it! Never use personal details for reccoveries or bank", "PINs!"); + stage = 69; + break; + } + break; + case 1100: + interpreter.sendOptions("Select an Option", "Yes.", "No.", "If I'm going to be quick."); + stage = 1101; + break; + case 1101: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! You should logout in case you are attacked or", "receive a random event. Leaving your character logged", "in can also allow someone to steal your items or entire account!"); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! This is the safest, both in terms of security", "and keeping your items! Leaving you character logged", "in can also allow someone to steal your items or entitre", "account!"); + stage = 69; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! You should logout in case you are attacked or", "receive a random event. Leaving your character logged", "in can also allow someone to steal your items or entire account!"); + stage = 99; + break; + } + break; + case 1111: + interpreter.sendOptions("Select an Opion", "On " + GameWorld.getSettings().getName() + " and all fansites.", "Only on the " + GameWorld.getSettings().getName() + " website.", "On all websites I visit."); + stage = 1112; + break; + case 1112: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! Always use a unique password purely for your " + GameWorld.getSettings().getName() + " account."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! Always make sure you are entering your", "password only on the " + GameWorld.getSettings().getName() + " Website as other sites", "may try to steal it."); + stage = 69; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! This is very insecure and will may lead to", "your account being stolen."); + stage = 99; + break; + } + break; + case 1200: + interpreter.sendOptions("Select an Option", "Your real life bank PIN.", "Your birthday.", "The birthday of a famous person or event."); + stage = 1201; + break; + case 1201: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "This is a bad idea as if someone happens to find out your bank", "PIN on " + GameWorld.getSettings().getName() + ", they then have acces to your bank account."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Not a good idea because you know how many presents", "you get for your birthday. So you can imagine how", "many people know this date. Never use personal details", "for recoveries or bank PINs!"); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Well done! Unless you tell someone, they are unlikely", "to guess who or what you have chosen, and you can", "always look it up, Never use personal details for recoveries or", "bank PINs!"); + stage = 69; + break; + } + break; + case 1300: + interpreter.sendOptions("Select an Option", "Virus scan my computer then change my password and recoveries.", "Change my password and recoveries then virus scan my computer.", "Nothing, it will go away on its own."); + stage = 1301; + break; + case 1301: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! Removing the keylogger must be the priority", "otherwise anything you type can be given away.", "Remember to change your password and recovery", "questions afterwards."); + stage = 69; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! If you change your password and recoveries", "while you still have the keylogger, they will still be", "insecure. Remove the keylogger first. Never use", "personal details for recoveries or bank PINs!"); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! This could mean your account may be", "accessed by someone else. Remove the keylogger then", "change your password and recoveries. Never use", "personal details for recoveries or bank PINs!"); + stage = 99; + break; + } + break; + case 1400: + interpreter.sendOptions("Select an Option", "Memorable", "Easy to guess", "Random gibberish"); + stage = 1401; + break; + case 1401: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! A good recovery answer that not many people", "will know, you won't forget, will stay the same and that", "you wouldn't accidentally give away. Remember: Don't", "use personal details for your recoveries."); + stage = 69; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "This is a bad idea as anyone who knows you could", "guess them. Remember: Don't use personal details for", "your recoveries."); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "This is a bad idea because it is very difficult to", "remember and you won't be able to recover your", "account! Remember: Don't use personal details for", "your recoveries."); + stage = 99; + break; + } + break; + case 1500: + interpreter.sendOptions("Select an Option", "Give them the information they asked for.", "Don't tell them anything and ignore them."); + stage = 1501; + break; + case 1501: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! There is no " + GameWorld.getSettings().getName() + " Lottery! Never give", "your account details to anyone. Press the 'Report Abuse'", "button and fill in the offending player's name and", "the correct category.", "Don't tell them anything and click the 'Report Abuse' button."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Quite good. But we should try to stop scammers.", "So please report them using the 'Report Abuse' button."); + stage = 69; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! Press the 'Report Abuse' button and", "fill in the offending player's name and the correct category."); + stage = 69; + break; + } + break; + case 1600: + interpreter.sendOptions("Select an Option", "Tell them never to use them.", "Use the Account Managemnt section on the " + GameWorld.getSettings().getName() + " website.", "'Recover a Lost Password' section on the " + GameWorld.getSettings().getName() + " website."); + stage = 1601; + break; + case 1601: + if (buttonId == 1) { + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! This does nothing to help the security of your", "account. You should reset your questions through", "the'Lost password' link on our website."); + stage = 99; + } else if (buttonId == 2) { + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! If you use the Account Management section to", "change your recovery questions, it will take 14 days", "to come into effect, someone may have acces to your", "account this time."); + stage = 99; + } else if (buttonId == 3) { + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! If you provide all the correct information", "this will reset your questions within 24 hours and", "make your account secure again."); + stage = 69; + } + break; + case 1700: + interpreter.sendOptions("Select an Option", " Don't give them any information and send an 'Abuse report'.", "Don't tell them anything and ignore them.", "Give them the information they asked for."); + stage = 1701; + break; + case 1701: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! Press the 'Report Abuse' button and fill", "in the offending player's name and the correct", "category."); + stage = 69; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Quite good. But we should try to stop scammers.", "So please report them using the 'Report Abuse'", "button."); + stage = 69; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! " + GameWorld.getSettings().getName() + " never ask for your account", "information especially to become a player moderator.", "Press the 'Report Abuse' button and fill in the offending player's", "name and the correct cattegory."); + stage = 99; + break; + } + break; + case 1800: + interpreter.sendOptions("Select an Option", "On the " + GameWorld.getSettings().getName() + " website.", "By searching the internet.", "Nowhere."); + stage = 1801; + break; + case 1801: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! There are NO " + GameWorld.getSettings().getName() + " cheats coded", "into the game and any sites claiming to have cheats", "are fakes and may lead to your account being stolen if you", "give them your password."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Wrong! There are NO " + GameWorld.getSettings().getName() + " cheats coded", "into the game and any sites claiming to have cheats", "are fakes and may lead to your account being stolen if you", "give them your password."); + stage = 99; + break; + case 3: + interpreter.sendDialogues(npcId, FacialExpression.OLD_NORMAL, "Correct! There are NO " + GameWorld.getSettings().getName() + " cheats coded into", "the game. Any sites claiming to have cheats are", "fakes and may lead to your account being stolen if you give", "them your password."); + stage = 69; + break; + } + break; + case 69: + end(); + openDoor(player, door); + break; + } + return true; + } + + /** + * Gets the npc id from the door name. + * @param name the name. + * @return the name. + */ + private int getNpcId(String name) { + switch (name) { + case "Gate of War": + return 4377; + case "Rickety door": + return 4378; + case "Oozing barrier": + return 4379; + case "Portal of Death": + return 4380; + } + return 0; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("strong-hold") }; + } + + } + + /** + * Represents the explorer dialogue. + * @author 'Vexia + * @version 1.0 + */ + public static final class ExplorerDialogue extends DialoguePlugin { + + /** + * Represents the stronghold notes item. + */ + private static final Item STRONGHOLD_NOTES = new Item(9004); + + /** + * Represents the animation specific to pickpocketing. + */ + private static final Animation ANIMATION = new Animation(881); + + /** + * Constructs a new {@code ExplorerDialogue} {@code Object}. + * @param player the player. + */ + public ExplorerDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code ExplorerDialogue} {@code Object}. + */ + public ExplorerDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ExplorerDialogue(player); + } + + @Override + public boolean open(Object... args) { + player.animate(ANIMATION); + if (player.getInventory().containsItem(STRONGHOLD_NOTES) || player.getBank().containsItem(STRONGHOLD_NOTES)) { + player.getPacketDispatch().sendMessage("You don't find anything."); + end(); + return true; + } + interpreter.sendDialogue("You rummage around in the dead explorer's bag....."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogue("You find a book of hand written notes."); + stage = 1; + break; + case 1: + player.getInventory().add(STRONGHOLD_NOTES, player); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 16152 }; + } + + } + + /** + * Represents the stronghold component plugin. + * @author 'Vexia + * @version 1.0 + */ + public final class StrongholdComponentPlugin extends ComponentPlugin { + + /** + * Represents the destination. + */ + private final Location destination; + + /** + * Constructs a new {@code StrongholdComponentPlugin} {@code Object}. + * @param destination the destination. + */ + public StrongholdComponentPlugin(final Location destination) { + this.destination = destination; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 18: + if (player.getInterfaceManager().close()) + player.getDialogueInterpreter().open(8000, "No thanks, I don't want to die!"); + return true; + case 17: + player.getInterfaceManager().close(); + ladder(player, destination); + player.getPacketDispatch().sendMessage("You climb down the ladder to the next level."); + return true; + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/GuardDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/GuardDialoguePlugin.java new file mode 100644 index 000000000..903eaa2fe --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/GuardDialoguePlugin.java @@ -0,0 +1,141 @@ +package core.game.content.activity.stronghold.playersafety; + +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; + +/** + * @author Tyler Telis + */ +public class GuardDialoguePlugin extends DialoguePlugin { + + /** + * Constructs a new {@code GuardDialogue} instance. + * @param player The {@code Player} instance. + */ + public GuardDialoguePlugin(Player player) { + super(player); + } + + /** + * Constructs a new {@code GuardDialoguePlugin} instance. + */ + public GuardDialoguePlugin() { + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GuardDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + boolean read = player.getSavedData().getGlobalData().hasReadPlaques(); + interpreter.sendDialogues(npc, read ? FacialExpression.HALF_GUILTY : FacialExpression.FURIOUS, read ? "Can I help you?" : "Ahem! Can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + boolean read = player.getSavedData().getGlobalData().hasReadPlaques(); + switch (stage) { + case -1:// END dialogue stage. + end(); + break; + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, read ? "Can I go upstairs?" : "I'd like to go up to the training centre please."); + increment(); + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, !read ? "Sorry, citizen, you can't go up there." : "", "Yes, citizen. Before you do I am instructed to give", "you one final piece of information"); + increment(); + break; + case 2: + interpreter.sendDialogues(player, read ? FacialExpression.HALF_GUILTY : FacialExpression.OLD_SNEAKY, read ? "Oh, okay then." : "Why not?"); + increment(); + break; + case 3: + if (!read) { + npc("You must learn about player safety before
entering the training centre."); + } else { + npc("In your travels around " + GameWorld.getSettings().getName() + ", should you find a", "player who acts in a way that breaks on of our rules,", "you should report them."); + } + increment(); + break; + case 4: + interpreter.sendDialogues(read ? npc : player, FacialExpression.HALF_GUILTY, !read ? "Oh. How do I do that?" : "Reporting is very simple and easy to do. Simply click", "the Report Abuse button at the bottom of the screen", "and you will be shown the following screen:"); + stage = read ? 10 : stage + 1; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Each of these gublinches have been caught breaking the", "Rules of " + GameWorld.getSettings().getName() + ". You should read the plaques on", "each of their cells to learn what they did wrong."); + increment(); + break; + case 6: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, right. I can enter the training centre once I have", "done that?"); + increment(); + break; + case 7: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes. Once you have have examined each of the plaques,", "come and speak to me and I will tell you about the", "Report Abuse function."); + increment(); + break; + case 8: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "After that, I can let you into the training centre,", "upstairs."); + increment(); + break; + case 9: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, thanks for the help."); + player.getPacketDispatch().sendMessage("You need to read the jail plaques before the guard will allow you upstairs."); + stage = -1; + break; + case 10: + if (read) { + player.getInterfaceManager().open(new Component(700)); + GameWorld.getPulser().submit(new Pulse(5) { + + @Override + public boolean pulse() { + if (player != null) { + player.getInterfaceManager().close(); + } + return true; + } + + }); + stage = 12; + } + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Simply enter the player's name in the box and click the", "rule that the offender was breaking."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay. Then what?"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That's it! It reall is that simple and it only takes a ", "moment to do. Now you may enter the training", "centre. Good luck, citizen."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks!"); + stage = -1; + break; + default: + SystemLogger.logErr("Unhandled dialogue stage=" + stage); + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 7142 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/PSOptionHandler.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/PSOptionHandler.java new file mode 100644 index 000000000..c0c842a30 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/PSOptionHandler.java @@ -0,0 +1,173 @@ +package core.game.content.activity.stronghold.playersafety; + +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.JAIL_DOWN_STAIRS; +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.JAIL_ENTRANCE_ID_ENTER; +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.JAIL_ENTRANCE_LEAVE; +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.JAIL_ENTRANCE_LOCATION_ENTER; +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.JAIL_ENTRANCE_LOCATION_LEAVE; +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.JAIL_STAIRS_DOWN; +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.JAIL_STAIRS_UP; +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.JAIL_UP_STAIRS; +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.TEST_PAPER_ITEM_ID; +import static core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.forId; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialogueAction; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.plugin.Plugin; + +import core.game.content.activity.stronghold.playersafety.StrongHoldOfPlayerSafetyPlugin.JailPlaques; + +/** + * @author Tyler Telis + */ +public class PSOptionHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(JAIL_ENTRANCE_ID_ENTER).getHandlers().put("option:use", this); + ObjectDefinition.forId(JAIL_ENTRANCE_LEAVE).getHandlers().put("option:leave", this); + ObjectDefinition.forId(JAIL_STAIRS_UP).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(JAIL_STAIRS_DOWN).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(29732).getHandlers().put("option:open", this); + ObjectDefinition.forId(29624).getHandlers().put("option:open", this); + ObjectDefinition.forId(29728).getHandlers().put("option:enter", this); + ObjectDefinition.forId(29735).getHandlers().put("option:pull-back", this); + ObjectDefinition.forId(29623).getHandlers().put("option:use", this); + ObjectDefinition.forId(29730).getHandlers().put("option:pull", this); + ObjectDefinition.forId(29731).getHandlers().put("option:pull", this); + ObjectDefinition.forId(29577).getHandlers().put("option:open", this); + ObjectDefinition.forId(29578).getHandlers().put("option:search", this); + ItemDefinition.forId(TEST_PAPER_ITEM_ID).getHandlers().put("option:take exam", this); + ObjectDefinition.forId(29729).getHandlers().put("option:climb", this); + for (JailPlaques plaque : JailPlaques.values()) { + ObjectDefinition.forId(plaque.getObjectId()).getHandlers().put("option:read-plaque on", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int config = player.getConfigManager().get(1203); + boolean locked = config == (1 << 29) || config == (0 << 26); + switch (node.getId()) { + case 29577:// chest + ObjectBuilder.replace(node.asObject(), node.asObject().transform(29578), 60); + return true; + case 29578: + switch (option) { + case "search": + int stage = player.getSavedData().getGlobalData().getTestStage(); + if (stage == 3) { + player.getEmoteManager().unlock(Emotes.SAFETY_FIRST); + player.getInventory().add(new Item(995, 10000), player); + player.getInventory().add(new Item(12629), player); + player.getDialogueInterpreter().sendItemMessage(12629, "You open the chest to find a large pile of gold, along with a pair of safety gloves. Also in the chest is the secret of the 'Safety First' emote."); + player.getSavedData().getGlobalData().setTestStage(4); + } else if (stage == 4) { + if (!player.hasItem(new Item(12629))) { + player.getInventory().add(new Item(12629), player); + player.getDialogueInterpreter().sendItemMessage(12629, "You find a pair of safety gloves."); + } else { + player.getDialogueInterpreter().sendDialogue("You already have a pair of safety gloves."); + } + } + return true; + } + return true; + case 29730:// lever + case 29731:// level down + if (!locked) { + player.sendMessage("You hear cogs and gears moving and the sound of heavy locks falling into place."); + config = (1 << 29); + } else { + player.sendMessage("You hear the cogs and gears moving and a distant unlocking sound."); + config += (1 << 26); + } + player.getConfigManager().set(1203, config, true); + return true; + case 29624: + if (locked) { + player.sendMessage("The door seems to be locked by some kind of mechanism."); + } else { + if (player.getLocation().getZ() == 2) { + player.teleport(new Location(3177, 4266, 0)); + } else { + player.teleport(new Location(3177, 4269, 2)); + } + } + return true; + case 29729: + player.teleport(new Location(3078, 3463, 0)); + return true; + case 29623: + player.teleport(new Location(3077, 4235, 0)); + return true; + case 29735: + player.getDialogueInterpreter().sendDialogue("There appears to be a tunnel behind the poster."); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + player.teleport(new Location(3140, 4230, 2)); + } + + }); + return true; + case 29732: + if (!player.getSavedData().getGlobalData().hasReadPlaques()) { + player.sendMessage("This door is locked."); + } else { + DoorActionHandler.handleAutowalkDoor(player, node.asObject()); + } + return true; + case 29728: + if (player.getSavedData().getGlobalData().getTestStage() < 3) { + player.sendMessage("You need to complete the player safety test first."); + return true; + } + player.teleport(new Location(3158, 4280, 3)); + return true; + } + if (node instanceof GameObject) { + GameObject object = (GameObject) node; + JailPlaques plaque = forId(object.getId()); + if (plaque != null) { + plaque.read(player, object); + return true; + } else if (object.getId() == JAIL_ENTRANCE_ID_ENTER || object.getId() == JAIL_ENTRANCE_LEAVE) { + player.getProperties().setTeleportLocation(object.getId() == JAIL_ENTRANCE_ID_ENTER ? JAIL_ENTRANCE_LOCATION_ENTER : JAIL_ENTRANCE_LOCATION_LEAVE); + return true; + } else if (object.getId() == JAIL_STAIRS_UP || object.getId() == JAIL_STAIRS_DOWN) { + if (!player.getSavedData().getGlobalData().hasReadPlaques() && object.getId() != JAIL_STAIRS_DOWN) { + player.getPacketDispatch().sendMessage("You need to read the jail plaques before the guard will allow you upstairs."); + return true; + } + player.getProperties().setTeleportLocation(object.getId() == JAIL_STAIRS_UP ? JAIL_UP_STAIRS : JAIL_DOWN_STAIRS); + return true; + } + } else if (node instanceof Item) { + Item item = (Item) node; + if (player.getSavedData().getGlobalData().getTestStage() >= 2) { + player.sendMessage("You have already completed the test!"); + return true; + } + if (item.getId() == TEST_PAPER_ITEM_ID) { + player.removeAttribute("s-stage"); + player.getDialogueInterpreter().open("player_safety", node.getId()); + return true; + } + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest.java new file mode 100644 index 000000000..455b50ff1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/PlayerSafetyTest.java @@ -0,0 +1,269 @@ +package core.game.content.activity.stronghold.playersafety; + +import core.game.component.Component; +import core.game.component.ComponentPlugin; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Handles the player safety test. + * @author Tyler Telis + * @author Vexia + */ +public class PlayerSafetyTest extends DialoguePlugin { + + /** + * The check box button ids. + */ + public static int ANSWER_1 = 3, ANSWER_2 = 4, ANSWER_3 = 12; + + /** + * Constructs a new {@Code PlayerSafetyTest} {@Code Object} + * @param player the player. + */ + public PlayerSafetyTest(Player player) { + super(player); + } + + /** + * Constructs a new {@code PlayerSafetyTest} instance. + */ + public PlayerSafetyTest() { + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PlayerSafetyTest(player); + } + + @Override + public boolean open(Object... args) { + stage = player.getAttribute("s-stage", 0); + if (args.length >= 2) { + handleQuiz(Integer.parseInt(String.valueOf(args[1]))); + } else { + stage = 0; + sendTest(); + } + return true; + } + + /** + * Sends the test. + */ + public void sendTest() { + Component component = getComponentForStage(stage); + component.setPlugin(new ComponentPlugin() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (player == null) { + return false; + } + if (player.getDialogueInterpreter().getDialogue() == null) { + player.getDialogueInterpreter().open(DialogueInterpreter.getDialogueKey("player_safety"), "reopen", button); + } + if (player.getDialogueInterpreter().getDialogue() == null) { + return false; + } + return player.getDialogueInterpreter().getDialogue().handle(component.getId(), button); + } + + }); + player.getInterfaceManager().open(component); + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + return handleQuiz(buttonId); + } + + private boolean handleQuiz(int buttonId) { + if (buttonId == 48 || buttonId == 39 || buttonId == 40) { + if (stage >= TestQuestions.values().length) { + player.getInterfaceManager().close(); + player.getSavedData().getGlobalData().setTestStage(2); + player.sendMessage("Well done! You completed the exams."); + player.getDialogueInterpreter().sendDialogue("Congratulations! The test has been completed. Hand the paper in to", "Professor Henry for marking."); + return false; + } else { + sendTest(); + } + return true; + } + if (stage == TestQuestions.values().length) {// Last question. + player.getDialogueInterpreter().getDialogue().end(); + return true; + } + if (forStage(stage).answer(player, buttonId)) { + return true; + } + return true; + } + + @Override + public boolean close() { + player.setAttribute("s-stage", stage); + return super.close(); + } + + /** + * A test question. + * @author Tyler Tellis + */ + public enum TestQuestions { + QUESTION_1(697, ANSWER_2) { + @Override + public void showAnswer(Player player, boolean correct, int interfaceId) { + player.getPacketDispatch().sendInterfaceConfig(interfaceId, 26, false); + player.getPacketDispatch().sendInterfaceConfig(interfaceId, correct ? 37 : 43, false); + } + }, + QUESTION_2(699, ANSWER_2) { + @Override + public void showAnswer(Player player, boolean correct, int interfaceId) { + player.getPacketDispatch().sendInterfaceConfig(interfaceId, 20, false); + player.getPacketDispatch().sendInterfaceConfig(interfaceId, correct ? 31 : 34, false); + } + }, + QUESTION_3(707, ANSWER_1) { + @Override + public void showAnswer(Player player, boolean correct, int interfaceId) { + player.getPacketDispatch().sendInterfaceConfig(interfaceId, 20, false); + player.getPacketDispatch().sendInterfaceConfig(interfaceId, correct ? 31 : 35, false); + } + }, + QUESTION_4(710, 9) { + @Override + public void showAnswer(Player player, boolean correct, int interfaceId) { + player.getPacketDispatch().sendInterfaceConfig(interfaceId, 20, false); + player.getPacketDispatch().sendInterfaceConfig(interfaceId, correct ? 31 : 34, false); + } + }, + QUESTION_5(704, 10) { + @Override + public void showAnswer(Player player, boolean correct, int interfaceId) { + player.getPacketDispatch().sendInterfaceConfig(interfaceId, 26, false); + player.getPacketDispatch().sendInterfaceConfig(interfaceId, correct ? 37 : 40, false); + } + }, + QUESTION_6(694, 10) { + @Override + public void showAnswer(Player player, boolean correct, int interfaceId) { + player.getPacketDispatch().sendInterfaceConfig(interfaceId, 20, false); + player.getPacketDispatch().sendInterfaceConfig(interfaceId, correct ? 31 : 34, false); + } + }, + QUESTION_8(696, 4) { + @Override + public void showAnswer(Player player, boolean correct, int interfaceId) { + player.getPacketDispatch().sendInterfaceConfig(interfaceId, 20, false); + player.getPacketDispatch().sendInterfaceConfig(interfaceId, correct ? 31 : 34, false); + } + }; + + /** + * The interface id. + */ + private int interfaceId; + + /** + * The correct button id to click. + */ + private int correctButton; + + /** + * Constructs a new {@Code TestQuestions} {@Code Object} + * @param interfaceId the interface. + * @param correctButton the button. + */ + private TestQuestions(int interfaceId, int correctButton) { + this.interfaceId = interfaceId; + this.correctButton = correctButton; + } + + /** + * Answers a question. + * @param player the player. + * @param buttonId the button id. + * @return {@code True} if so. + */ + public boolean answer(Player player, int buttonId) { + boolean correct = buttonId == correctButton; + if (interfaceId == 710 && buttonId == 9) { + correct = true; + } else if (interfaceId == 704 && buttonId == 10) { + correct = true; + } else if (interfaceId == 696 && buttonId == 4) { + correct = true; + } + showAnswer(player, correct, interfaceId); + if (correct) { + player.getDialogueInterpreter().getDialogue().increment(); + } + return player.getInterfaceManager().getComponent(interfaceId) != null; + } + + /** + * Shows the answer. + * @param player the player. + * @param correct the correct. + * @param interfaceId the id. + */ + public abstract void showAnswer(Player player, boolean correct, int interfaceId); + + /** + * Gets the value. + * @return the value. + */ + public int value() { + return ordinal(); + } + + /** + * Gets the inter id. + * @return the id. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Gets the correct button. + * @return the button. + */ + public int getCorrectButton() { + return correctButton; + } + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("player_safety") }; + } + + /** + * Gets a new component for the stage. + * @param stage The stage; + * @return The {@code Component} instance. + */ + public static Component getComponentForStage(int stage) { + return new Component(forStage(stage).getInterfaceId()); + } + + /** + * Gets it for the stage. + * @param stage the stage. + * @return the question. + */ + public static TestQuestions forStage(int stage) { + return TestQuestions.values()[stage]; + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/ProfessorHenryDialogue.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/ProfessorHenryDialogue.java new file mode 100644 index 000000000..f40477ba9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/ProfessorHenryDialogue.java @@ -0,0 +1,211 @@ +package core.game.content.activity.stronghold.playersafety; + +import core.game.component.Component; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * @author Tyler Telis + */ +public class ProfessorHenryDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ProfessorHenryDialogue} instance. + * @param player The {@code Player} instance. + */ + public ProfessorHenryDialogue(Player player) { + super(player); + } + + /** + * Constructs a new {@code ProfessorHenryDialogue} instance. + */ + public ProfessorHenryDialogue() { + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ProfessorHenryDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + stage = 0; + if (player.getSavedData().getGlobalData().getTestStage() == 2 && player.getInventory().contains(12626, 1)) { + player("Hello, Professor."); + stage = 900; + return true; + } + if (player.getSavedData().getGlobalData().getTestStage() >= 3) { + npc("Good job " + player.getUsername() + " you completed the test!"); + stage = 800; + return true; + } + sendNormalDialogue(player, FacialExpression.HALF_GUILTY, "Hello."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 800: + end(); + break; + case 900: + npc("Ah, " + player.getUsername() + ". How's the test going?"); + stage++; + break; + case 901: + player("I think I've finished."); + stage++; + break; + case 902: + npc("Excellent! Let me just mark the paper for you then."); + stage++; + break; + case 903: + npc("Hmm. Uh-huh, yes I see. Good! Yes, that's right."); + stage++; + break; + case 904: + npc("Excellent! Allow me to reward you for your work. I", "have these two old lamps that you may find useful."); + stage++; + break; + case 905: + npc("Also, there is an old jail block connected to the cells", "below the training centre, which have been overrun with", "vicious creatures. If you search around the jail cells", "downstairs, you should find it easily enough."); + stage++; + break; + case 906: + npc("Now, your rewards."); + stage++; + break; + case 907: + if (player.getInventory().remove(new Item(12626, 1000))) { + showReward(player); + end(); + } + break; + case -1: + end(); + break; + case 0: + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "Hello what?"); + increment(); + break; + case 1: + sendNormalDialogue(player, FacialExpression.HALF_GUILTY, "Uh...hello there?"); + increment(); + break; + case 2: + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "Hello, 'Professor'. Manners cost nothing, you know.", "When you're in my classroom, I ask that you use the", "proper address for my station."); + increment(); + break; + case 3: + sendNormalDialogue(player, FacialExpression.HALF_GUILTY, "Your station?"); + increment(); + break; + case 4: + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "Yes. It means 'position', so to speak."); + increment(); + break; + case 5: + sendNormalDialogue(player, FacialExpression.HALF_GUILTY, "Oh, okay."); + increment(); + break; + case 6: + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "Now, what can I do for you, exactly?"); + increment(); + break; + case 7: + sendNormalDialogue(player, FacialExpression.HALF_GUILTY, "What is this place?"); + increment(); + break; + case 8: + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "This is the Misthalin Training Centre of Ezcelience. It", "is where bold adventurers, such as yourself, can come", "to learn of the dangers of the wide world and gain", "some valuable experience at the same time."); + increment(); + break; + case 9: + sendNormalDialogue(player, FacialExpression.HALF_GUILTY, "What can I do here?"); + increment(); + break; + case 10: + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "Here you can take part in the Player Safety test: a set", "of valuable lessons to learn about staying safe in ", "2009scape."); + increment(); + break; + case 11: + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "I can give you a test paper to take and, once", "completed, you can bring it back to me for marking.", "Would you like to take the test?", "It will not cost you anything"); + increment(); + break; + case 12: + interpreter.sendOptions("Select an Option", "Yes, please", "Not right now, thanks."); + increment(); + break; + case 13: + if (buttonId == 1) { + sendNormalDialogue(player, FacialExpression.HALF_GUILTY, "Yes, please."); + increment(); + } else if (buttonId == 2) { + sendNormalDialogue(player, FacialExpression.HALF_GUILTY, "Not right now, thanks."); + stage = -1; + } + break; + case 14: + if (player.getInventory().freeSlots() == 0) { + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "It seems your inventory is full."); + stage = -1; + return false; + } else if (player.getInventory().containItems(StrongHoldOfPlayerSafetyPlugin.TEST_PAPER_ITEM_ID)) { + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "You already have a test, please fill it out", "and return it to me."); + stage = -1; + return false; + } + player.getSavedData().getGlobalData().setTestStage(1); + player.getInventory().add(new Item(StrongHoldOfPlayerSafetyPlugin.TEST_PAPER_ITEM_ID)); + sendNormalDialogue(npc, FacialExpression.HALF_GUILTY, "Right then. Here is the test paper. When you have", "completed all the questions, bring it back to me for", "marking."); + increment(); + break; + case 15: + sendNormalDialogue(player, FacialExpression.HALF_GUILTY, "Okay, thanks."); + stage = -1; + break; + } + return false; + } + + /** + * Shows the reward for the player. + * @param player the player. + */ + private void showReward(Player player) { + player.getConfigManager().set(1203, 1 << 29, true); + player.getSavedData().getGlobalData().setTestStage(3); + player.getQuestRepository().syncronizeTab(player); + player.getConfigManager().set(101, player.getQuestRepository().getPoints()); + player.getInterfaceManager().open(new Component(277)); + for (int i = 9; i < 18; i++) { + player.getPacketDispatch().sendString("", 277, i); + } + player.getPacketDispatch().sendString("You have completed the Player Safety test!", 277, 4); + player.getPacketDispatch().sendString("2 Experience lamps", 277, 9); + player.getPacketDispatch().sendString("Access to the Stronghold of", 277, 10); + player.getPacketDispatch().sendString("Player Safety Dungeon", 277, 11); + player.getPacketDispatch().sendString("The Safety First' emote", 277, 12); + player.getPacketDispatch().sendString(player.getQuestRepository().getPoints() + "", 277, 7); + player.getPacketDispatch().sendItemZoomOnInterface(12626, 240, 277, 5); + if (!player.hasItem(new Item(4447, 2))) { + player.getInventory().add(new Item(4447, 2), player); + } + player.getEmoteManager().unlock(Emotes.SAFETY_FIRST); + } + + @Override + public int[] getIds() { + return new int[] { 7143 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/SafetyMapZone.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/SafetyMapZone.java new file mode 100644 index 000000000..010521824 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/SafetyMapZone.java @@ -0,0 +1,15 @@ +package core.game.content.activity.stronghold.playersafety; + +import core.game.world.map.zone.MapZone; + +public class SafetyMapZone extends MapZone { + + public SafetyMapZone() { + super("strong hold of player safety", true); + } + + @Override + public void configure() { + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.java b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.java new file mode 100644 index 000000000..5fea9d65a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/stronghold/playersafety/StrongHoldOfPlayerSafetyPlugin.java @@ -0,0 +1,211 @@ +package core.game.content.activity.stronghold.playersafety; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * @author Tyler Telis + */ +@Initializable +public class StrongHoldOfPlayerSafetyPlugin implements Plugin { + + /** + * when u pull back the poster and the dialogue pops up + * you get teleported to this map tile: [3140, 4230, 2] + */ + + /** + * The jail object ids. + */ + public static final int JAIL_ENTRANCE_ID_ENTER = 29603, JAIL_ENTRANCE_LEAVE = 29602, JAIL_STAIRS_UP = 29589, JAIL_STAIRS_DOWN = 29592; + + /** + * The guard NPC id. + */ + public static final int GUARD_NPC_ID = 7142; + + /** + * The test item id. + */ + public static final int TEST_PAPER_ITEM_ID = 12626; + + /** + * The jail {@code Location}'s + */ + public static final Location JAIL_ENTRANCE_LOCATION_ENTER = Location.create(3082, 4229, 0), JAIL_ENTRANCE_LOCATION_LEAVE = Location.create(3074, 3456, 0), JAIL_UP_STAIRS = Location.create(3083, 3452, 0), JAIL_DOWN_STAIRS = Location.create(3086, 4247, 0); + + @Override + public Plugin newInstance(Object object) throws Throwable { + PluginManager.definePlugin(new PSOptionHandler()); + PluginManager.definePlugin(new GuardDialoguePlugin()); + PluginManager.definePlugin(new PlayerSafetyTest()); + PluginManager.definePlugin(new ProfessorHenryDialogue()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... object) { + return null; + } + + public enum JailPlaques { + + /** + * This sneaky gublinch wanted to set up a webcam conversation with a + * player! The player refused and sensibly used the Report Abuse button + * to enable us to catch him. + */ + PLAQUE_1(29599, 312), + + /** + * This naughty gublinchette gave a player her email address. The wise + * player hit the Report Abuse button straight away, allowing us to + * catch her! + */ + PLAQUE_2(29598, 695), + + /** + * This evil gublinch asked a younger player where she went to school. + * The player was smart enough to not tell the gublinch and report him + * instead. + */ + PLAQUE_3(29597, 711), + + /** + * This vile gublinchette was asking a player for his home address. The + * clever player didn't give her their address, but used the Report + * Abuse button to report her instead. + */ + PLAQUE_4(29596, 703), + + /** + * This sly gublinch wanted to meet one of his player friends in the + * real world. The player obviously refused and reported him straight + * away. + */ + PLAQUE_5(29600, 706), + + /** + * This cheeky gublinch claimed to be a Jagex Moderator! He was reported + * straight away and dealt with. + */ + PLAQUE_6(29601, 698), + + /** + * This wretched gublinch was asking a player for his telephone number. + * The player helped us catch him by refusing to give their information + * away and reporting the gublinch straight away! + */ + PLAQUE_7(29595, 701); + + /** + * The object id & interface id. + */ + private int objectId, interfaceId; + + /** + * Constructs a new {@code JailPlaques} instance. + * @param objectId The object id of the jail plague. + * @param interfaceId The interface id to send on the chat box. + */ + private JailPlaques(int objectId, int interfaceId) { + this.objectId = objectId; + this.interfaceId = interfaceId; + } + + /** + * Gets the object id. + * @return objectId. + */ + public int getObjectId() { + return objectId; + } + + /** + * Gets the interface id. + * @return interfaceId. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Gets the value of the jail-plaque. + * @return The ordinal. + */ + public int value() { + return ordinal(); + } + + /** + * Sends the jail-plague interface. + * @param player The {@code Player} instance. + */ + public void read(Player player, GameObject object) { + int x = object.getLocation().getX(); + int y = object.getLocation().getY(); + int rotationX = x; + int rotationY = y; + Component component = new Component(interfaceId); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.SET, x, y, 245, 1, 50)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, rotationX, rotationY, 245, 1, 50)); + player.getInterfaceManager().openChatbox(component); + component.setCloseEvent(new CloseEvent() { + + @Override + public boolean close(Player player, Component c) { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 1, 100)); + if (!player.getSavedData().getGlobalData().getReadPlaques()[value()]) { + player.getSavedData().getGlobalData().getReadPlaques()[value()] = true; + } + return true; + } + + }); + component.setPlugin(new ComponentPlugin() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 2: + player.getInterfaceManager().closeChatbox(); + player.getSavedData().getGlobalData().getReadPlaques()[value()] = true; + return true; + } + return false; + } + + }); + } + } + + /** + * Find the {@link JailPlaques} instance for the object id. + * @param objectId The object id. + * @return The {@link JailPlaques} instance. + */ + public static JailPlaques forId(int objectId) { + for (JailPlaques plaque : JailPlaques.values()) { + if (plaque.getObjectId() == objectId) { + return plaque; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java b/Server/src/main/java/Server/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java new file mode 100644 index 000000000..8fadfc166 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java @@ -0,0 +1,355 @@ +package core.game.content.activity.tzhaar; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.system.task.Pulse; +import core.game.world.map.Location; +import core.game.world.map.MapDistance; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents a fight caves NPC. + * @author Emperor + */ +public final class TzhaarFightCaveNPC extends AbstractNPC { + + /** + * The NPC ids. + */ + private static final int[] NPC_IDS = { 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746 }; + + /** + * The combat reward. + */ + private CombatAction combatAction; + + /** + * The activity plugin object. + */ + private TzhaarFightCavesPlugin activity; + + /** + * If the NPC has spawned minions yet (used for Jad). + */ + private boolean spawnedMinions; + + /** + * Constructs a new {@code TzhaarFightCaveNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public TzhaarFightCaveNPC(int id, Location location, TzhaarFightCavesPlugin activity) { + super(id, location); + this.activity = activity; + } + + /** + * Constructs a new {@code TzhaarFightCaveNPC} {@code Object}. + */ + public TzhaarFightCaveNPC() { + super(2734, null); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatAction; + } + + @Override + public void tick() { + super.tick(); + if (getId() != 2746 && activity != null && !getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(activity.getPlayer()); + face(activity.getPlayer()); + } + } + + @Override + public void configure() { + super.configure(); + CombatStyle style = CombatStyle.MELEE; + if (getId() == 2739 || getId() == 2740) { + style = CombatStyle.RANGE; + } else if (getId() == 2743 || getId() == 2744 || getId() == 2745) { + style = CombatStyle.MAGIC; + } + super.setAggressive(false); + super.aggressiveHandler = null; + combatAction = new CombatAction(this, style); + getProperties().setCombatTimeOut(Integer.MAX_VALUE); + super.setWalkRadius(64); + if (activity != null) { + activity.activeNPCs.add(this); + if (getId() != 2746) { + getProperties().getCombatPulse().attack(activity.getPlayer()); + } + } + } + + @Override + public void finalizeDeath(Entity killer) { + if (killer.isPlayer()) { + Player player = killer.asPlayer(); + // Successfully kill a Ket-Zek in the Fight Caves + if ((getId() == 2743 || getId() == 2744)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 2, 1); + } + } + super.finalizeDeath(killer); + } + + /** + * Heals the NPC. + * @param amount The amount to heal. + */ + public void heal(int amount) { + if (getSkills().heal(amount) > 0 && getId() == 2745) { + spawnedMinions = false; + } + } + + @Override + public void onImpact(final Entity entity, final BattleState state) { + if (getId() == 2746) { + getPulseManager().run(new Pulse(1, entity) { + @Override + public boolean pulse() { + getProperties().getCombatPulse().attack(entity); + return true; + } + }); + return; + } + super.onImpact(entity, state); + if (getId() == 2736 || getId() == 2737) { + if (state.getStyle() == CombatStyle.MELEE && getSkills().getLifepoints() > 0) { + entity.getImpactHandler().manualHit(this, 1 + (state.getEstimatedHit() / 10), HitsplatType.NORMAL, 1); + } + } else if (getId() == 2745 && !spawnedMinions && getSkills().getLifepoints() < (getSkills().getMaximumLifepoints() >> 1)) { + spawnedMinions = true; + if (activity != null) { + for (int i = activity.activeNPCs.size() - 1; i < 4; i++) { + TzhaarFightCaveNPC npc = activity.spawn(2746); + npc.getProperties().getCombatPulse().attack(this); + npc.setAttribute("fc_jad", this); + } + } + } + } + + @Override + public int getWalkRadius() { + return 64; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TzhaarFightCaveNPC(id, location, null); + } + + @Override + public int[] getIds() { + return NPC_IDS; + } + + /** + * Handles a fight cave NPC's combat reward. + * @author Emperor + */ + static class CombatAction extends CombatSwingHandler { + + /** + * The NPC instance. + */ + private TzhaarFightCaveNPC npc; + + /** + * The main combat style. + */ + private CombatStyle main; + + /** + * The current combat style. + */ + private CombatStyle style; + + /** + * If the NPC is TzTok-Jad. + */ + boolean jad; + + /** + * Constructs a new {@code TzhaarFightCaveNPC} {@code Object}. + * @param npc The NPC. + * @param main The main combat style. + */ + public CombatAction(TzhaarFightCaveNPC npc, CombatStyle main) { + super(main); + this.npc = npc; + this.jad = npc.getId() == 2745; + this.main = main; + this.style = getType(); + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + if (getType() != CombatStyle.MELEE) { + if (!isProjectileClipped(entity, victim, false)) { + return InteractionType.NO_INTERACT; + } + int distance = MapDistance.RENDERING.getDistance(); + if (victim.getCenterLocation().withinDistance(entity.getCenterLocation(), getCombatDistance(entity, victim, distance)) && super.canSwing(entity, victim) != InteractionType.NO_INTERACT) { + entity.getWalkingQueue().reset(); + return InteractionType.STILL_INTERACT; + } + return InteractionType.NO_INTERACT; + } + return getType().getSwingHandler().canSwing(entity, victim); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + style = super.getType(); + int ticks = 1; + if (jad) { + main = CombatStyle.values()[1 + RandomFunction.RANDOM.nextInt(2)]; + } + if (main != CombatStyle.MELEE) { + style = main; + if (CombatStyle.MELEE.getSwingHandler().canSwing(entity, victim) != InteractionType.NO_INTERACT && RandomFunction.random(10) < 4) { + style = CombatStyle.MELEE; + } else { + ticks += (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.4); + } + } + int max = calculateHit(entity, victim, 1.0); + int hit = 0; + boolean heal = victim instanceof NPC || ((npc.getId() == 2741 || npc.getId() == 2742) && RandomFunction.RANDOM.nextInt(4) < 1); + if (((NPC) entity).getId() == 2746) { + NPC j = (NPC) entity.getAttribute("fc_jad", entity); + if (entity.getLocation().withinDistance(j.getCenterLocation(), (j.size() >> 1) + 1) && RandomFunction.random(4) < 2) { + heal = true; + state.setVictim(j); + victim = j; + } + } + state.setStyle(heal ? null : style); + if (heal || isAccurateImpact(entity, victim)) { + state.setMaximumHit(max); + hit = RandomFunction.random(max) + (heal ? 5 : 0); + } + state.setEstimatedHit(hit); + return ticks; + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == null) { + return; + } + switch (state.getStyle()) { + case MELEE: + entity.animate(entity.getProperties().getAttackAnimation()); + break; + case RANGE: + if (jad) { + entity.visualize(new Animation(9276, Priority.HIGH), Graphics.create(1625)); + } else { + Projectile.ranged(entity, victim, 1616, 41, 36, 50, 15).send(); + entity.animate(new Animation(9243, Priority.HIGH)); + } + break; + case MAGIC: + if (jad) { + Projectile.create(entity, victim, 1627, 96, 36, 70, (int) (victim.getLocation().getDistance(entity.getLocation()) * 10 + 52)).send(); + entity.visualize(new Animation(9300, Priority.HIGH), Graphics.create(1626)); + } else { + Projectile.magic(entity, victim, 1623, 41, 36, 50, 15).send(); + entity.visualize(new Animation(9266, Priority.HIGH), Graphics.create(1622)); + } + break; + } + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() != null && victim.hasProtectionPrayer(state.getStyle())) { + state.setEstimatedHit(0); + } + if (state.getStyle() == null) { + NPC n = victim instanceof NPC ? ((NPC) victim) : (NPC) npc.activity.getPlayer().getProperties().getCombatPulse().getVictim(); + if (n == null || !(n instanceof TzhaarFightCaveNPC)) { + n = npc; + } + ((TzhaarFightCaveNPC) n).heal(state.getEstimatedHit()); + n.graphics(new Graphics(444, 96)); + return; + } + if (state.getEstimatedHit() > 0) { + state.setEstimatedHit(formatHit(victim, state.getEstimatedHit())); + if (((NPC) entity).getId() == 2734 || ((NPC) entity).getId() == 2735) { + victim.getSkills().decrementPrayerPoints(state.getEstimatedHit()); + } else if (jad && state.getStyle() != CombatStyle.MELEE) { + victim.graphics(Graphics.create(157)); + } + } + style.getSwingHandler().impact(entity, victim, state); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == null) { + return; + } else if (state.getStyle() == CombatStyle.MAGIC && !jad) { + victim.graphics(Graphics.create(1624)); + } else if (jad && state.getStyle() == CombatStyle.RANGE) { + victim.graphics(Graphics.create(451)); + } + style.getSwingHandler().visualizeImpact(entity, victim, state); + } + + @Override + public int calculateAccuracy(Entity entity) { + return style.getSwingHandler().calculateAccuracy(entity); + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return style.getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + return style.getSwingHandler().calculateHit(entity, victim, modifier); + } + + @Override + public ArmourSet getArmourSet(Entity e) { + return style.getSwingHandler().getArmourSet(e); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return style.getSwingHandler().getSetMultiplier(e, skillId); + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java b/Server/src/main/java/Server/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java new file mode 100644 index 000000000..f530ae0c6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/tzhaar/TzhaarFightCavesPlugin.java @@ -0,0 +1,297 @@ +package core.game.content.activity.tzhaar; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import core.game.content.activity.ActivityPlugin; +import core.game.content.global.BossKillCounter; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.slayer.Tasks; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.repository.Repository; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Tzhaar Fight caves plugin. + * @author Emperor + */ +@Initializable +public final class TzhaarFightCavesPlugin extends ActivityPlugin { + + /** + * The waves data. + */ + private static final int[][] WAVES = { { 2734, 0 }, { 2736, 2 }, { 2739, 6 }, { 2741, 14 }, { 2743, 30 }, { 2745, 62 } }; + + /** + * The spawn location offsets. + */ + private static final Location[] SPAWN_LOCATIONS = { Location.create(8, 44, 0), Location.create(38, 47, 0), Location.create(5, 9, 0), Location.create(46, 21, 0), Location.create(28, 28, 0), }; + + /** + * The currently active NPCs. + */ + public List activeNPCs = new ArrayList<>(); + + /** + * Constructs a new {@code TzhaarFightCavesPlugin} {@code Object}. + */ + public TzhaarFightCavesPlugin() { + this(null); + } + + /** + * Constructs a new {@code TzhaarFightCavesPlugin} {@code Object}. + * @param player The player. + */ + public TzhaarFightCavesPlugin(Player player) { + super("fight caves", true, true, true, ZoneRestriction.CANNON); + super.player = player; + } + + @Override + public void register() { + try { + new TzhaarFightCaveNPC().newInstance(null); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + @Override + public boolean canLogout(Player p) { + if (!p.getAttribute("fc_safe_logout", false)) { + p.setAttribute("fc_safe_logout", true); + p.getPacketDispatch().sendMessage("Your logout request has been received. The minigame will be paused at the end"); + p.getPacketDispatch().sendMessage("of this wave."); + p.getPacketDispatch().sendMessage("If you try to logout before that, you will have to repeat this wave."); + return false; + } + return super.canLogout(p); + } + + @Override + public boolean start(final Player player, boolean login, Object... args) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 0, 8); + this.player = player; + player.lock(3); + int offsetX = player.getAttribute("fc_offset", 45 << 8) >> 8; + int offsetY = player.getAttribute("fc_offset", 61) & 0xff; + player.removeAttribute("fc_offset"); + player.getProperties().setTeleportLocation(getBase().transform(offsetX, offsetY, 0)); + Pulse pulse; + if (!login) { + final int wave = 0; + player.setAttribute("fc_wave", wave); + player.getWalkingQueue().reset(); + pulse = new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + if (count++ == 0) { + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(getBase().getX() + 44, getBase().getY() + 49, true); + player.getWalkingQueue().addPath(getBase().getX() + 32, getBase().getY() + 32, true); + player.getDialogueInterpreter().sendDialogues(2617, null, "You're on your own now, JalYt.", "Prepare to fight for your life!"); + } else if (count == 16) { + spawnWave(wave); + return true; + } + return false; + } + }; + } else { + if (player.getAttribute("fc_wave", 0) == 62) { + player.getDialogueInterpreter().sendDialogues(2617, null, "Look out, here comes TzTok-Jad!"); + } + pulse = new Pulse(16, player) { + @Override + public boolean pulse() { + spawnWave(player.getAttribute("fc_wave", 0)); + return true; + } + }; + } + player.setAttribute("fc:pulse", pulse); + GameWorld.getPulser().submit(pulse); + return true; + } + + /** + * Leaves the fight caves activity. + * @param player The player. + * @param wave The current wave. + */ + public void leave(Player player, int wave) { + activeNPCs.clear(); + player.getProperties().setTeleportLocation(getSpawnLocation()); + if (wave == 63) { + if (!player.getInventory().add(new Item(6570))) { + GroundItemManager.create(new Item(6570), getSpawnLocation(), player); + } + player.getPacketDispatch().sendMessage("You were victorious!"); + BossKillCounter.addtoKillcount(player, 2745); + if (player.getSlayer().getTask() == Tasks.JAD) { + player.getSkills().addExperience(Skills.SLAYER, 25000); + player.getSlayer().clear(); + player.sendMessage("You receive 25,000 slayer experience for defeating TzTok-Jad."); + } + player.getDialogueInterpreter().sendDialogues(2617, null, "You even defeated TzTok-Jad, I am most impressed!", "Please accept this gift as a reward."); + Repository.sendNews(player.getUsername() + " has been victorious in defeating TzTok-Jad for a firecape!"); + } else if (wave <= 1) { + player.getDialogueInterpreter().sendDialogues(2617, null, "Well I suppose you tried... better luck next time."); + } else { + player.getDialogueInterpreter().sendDialogues(2617, null, "Well done in the cave, here, take TokKul as reward."); + } + int amount = wave << 7; + if (amount > 0 && !player.getInventory().add(new Item(6529, amount))) { + GroundItemManager.create(new Item(6529, amount), getSpawnLocation(), player); + } + } + + @Override + public boolean enter(final Entity e) { + e.setAttribute("fight_caves", true); + return super.enter(e); + } + + @Override + public boolean leave(final Entity e, boolean logout) { + unregisterRegion(region.getId()); + if (logout) { + Location l = player.getLocation(); + player.setAttribute("/save:fc_offset", (l.getX() - getBase().getX()) << 8 | (l.getY() - getBase().getY())); + } else { + player.removeAttribute("fc_offset"); + player.removeAttribute("fc_wave"); + player.removeAttribute("fc_safe_logout"); + Pulse pulse = player.getAttribute("fc:pulse"); + if (pulse != null) { + pulse.stop(); + player.removeAttribute("fc:pulse"); + } + } + player.removeAttribute("fight_caves"); + return super.leave(e, logout); + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e instanceof NPC) { + NPC n = (NPC) e; + if (n.getId() == 2736 || n.getId() == 2737) { + new TzhaarFightCaveNPC(2738, n.getLocation(), this).init(); + new TzhaarFightCaveNPC(2738, n.getLocation().transform(1, 0, 0), this).init(); + } + if (activeNPCs.contains(n)) { + activeNPCs.remove(n); + if (n.getId() == 2745) { + player.setAttribute("/save:fc_wave", 63); + leave((Player) killer, 63); + } else if (activeNPCs.isEmpty()) { + final int wave = player.getAttribute("fc_wave", 0) + 1; + player.setAttribute("/save:fc_wave", wave); + if (player.getAttribute("fc_safe_logout", false)) { + player.getPacketDispatch().sendLogout(); + } else { + if (wave == 62) { + player.getDialogueInterpreter().sendDialogues(2617, null, "Look out, here comes TzTok-Jad!"); + } + Pulse pulse = new Pulse(9, player) { + @Override + public boolean pulse() { + spawnWave(wave); + return true; + } + }; + player.setAttribute("fc:pulse", pulse); + GameWorld.getPulser().submit(pulse); + } + } + } + e.clear(); + } else { + leave((Player) e, e.getAttribute("fc_wave", 0)); + } + return true; + } + + /** + * Spawns the wave for the player. + * @param wave The wave to spawn. + */ + public void spawnWave(int wave) { + player.setAttribute("/save:fc_wave", wave); + int count = wave; + for (int i = WAVES.length - 1; i >= 0; i--) { + if (count >= WAVES[i][1]) { + if (count > WAVES[i][1] * 2) { + spawn(WAVES[i][0] + 1); + count -= (WAVES[i][1] + 1); + } + spawn(WAVES[i][0]); + count -= WAVES[i][1] + 1; + } + } + player.getPacketDispatch().sendMessage("Current wave: " + (wave + 1) + "."); + } + + /** + * Spawns a tzhaar NPC. + * @param npcId The NPC. + * @return The NPC. + */ + public TzhaarFightCaveNPC spawn(int npcId) { + Random r = RandomFunction.RANDOM; + Location l = SPAWN_LOCATIONS[r.nextInt(SPAWN_LOCATIONS.length)]; + TzhaarFightCaveNPC npc = new TzhaarFightCaveNPC(npcId, getBase().transform(l).transform(r.nextInt(8), r.nextInt(8), 0), this); + npc.init(); + return npc; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GameObject && ((GameObject) target).getId() == 9357) { + leave((Player) e, e.getAttribute("fc_wave", 0)); + player.removeAttribute("fc_wave"); + player.removeAttribute("fc_offset"); + return true; + } + return false; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new TzhaarFightCavesPlugin(p); + } + + @Override + public Location getSpawnLocation() { + return Location.create(2438, 5169, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(9551); + setRegionBase(); + registerRegion(region.getId()); + region.setMusicId(473); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin.java b/Server/src/main/java/Server/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin.java new file mode 100644 index 000000000..6dd636a05 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/tzhaar/TzhaarFightPitsPlugin.java @@ -0,0 +1,455 @@ +package core.game.content.activity.tzhaar; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +import core.game.component.Component; +import core.game.container.impl.EquipmentContainer; +import core.game.content.activity.ActivityPlugin; +import core.plugin.Initializable; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.update.flag.player.AppearanceFlag; +import core.tools.RandomFunction; + +/** + * Handles the Tzhaar Fight pits. + * @author Emperor + */ +@Initializable +public final class TzhaarFightPitsPlugin extends ActivityPlugin { + + /** + * The zone where players battle. + */ + private static final ZoneBorders WAR_ZONE = new ZoneBorders(2368, 5120, 2420, 5168); + + /** + * The lobby list. + */ + private static final List LOBBY_PLAYERS = new ArrayList<>(); + + /** + * The players in battle list. + */ + private static final List WAR_PLAYERS = new ArrayList<>(); + + /** + * The interface id. + */ + private static final int INTERFACE_ID = 373; + + /** + * The skull id. + */ + private static final int SKULL_ID = 1; + + /** + * The minutes elapsed in the minigame (resets depending on the game + * schedule). + */ + private static int minutes = 0; + + /** + * The amount of tokkul to receive. + */ + private static int tokkulAmount; + + /** + * The last player who's won the pits. + */ + private static Player lastVictor; + + /** + * The pulse used. + */ + private static final Pulse PULSE = new Pulse(100) { + @Override + public boolean pulse() { + if (++minutes == 3) { + startGameSession(); + } else if (minutes == 4) { + sendDialogue("FIGHT!"); + } else if ((minutes - 0) > 4) { + spawnWave(); + } + return false; + } + }; + + /** + * Sends a dialogue to all players in battle. + * @param string The string. + */ + private static void sendDialogue(String string) { + for (Player p : WAR_PLAYERS) { + p.getDialogueInterpreter().sendDialogues(2618, FacialExpression.HALF_GUILTY, string); + } + } + + /** + * Constructs a new {@code TzhaarFightPitsPlugin} {@code Object}. + */ + public TzhaarFightPitsPlugin() { + super("fight pits", false, true, true, ZoneRestriction.CANNON); + } + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (target instanceof Player && !WAR_PLAYERS.contains(target)) { + return false; // Safety check + } + if (minutes < 4 && e instanceof Player) { + ((Player) e).getPacketDispatch().sendMessage("The fight hasn't started yet."); + } + return minutes > 3; + } + + /** + * Removes an entity from the war zone. + * @param e The entity. + */ + public void removeFromBattle(Entity e) { + if (WAR_PLAYERS.remove(e)) { + if (WAR_PLAYERS.size() < 2) { + if (!WAR_PLAYERS.isEmpty()) { + resetLastVictor(); + lastVictor = WAR_PLAYERS.get(0); + // Become the Champion of the Fight Pits + if (lastVictor != null) { + lastVictor.getAchievementDiaryManager().finishTask(lastVictor, DiaryType.KARAMJA, 2, 0); + } + addTokkul(lastVictor); + lastVictor.getAppearance().setSkullIcon(SKULL_ID); + lastVictor.getUpdateMasks().register(new AppearanceFlag(lastVictor)); + lastVictor.getPacketDispatch().sendString("Current Champion: " + getChampionName(), INTERFACE_ID, 0); + resetDamagePulse(lastVictor); + RegionManager.forId(9552).getPlanes()[0].getNpcs().get(0).setAttribute("fp_champn", getChampionName()); + } + minutes = 0; + } + sendPlayersRemaining(WAR_PLAYERS.size() - 1); + } + if (e instanceof Player && !LOBBY_PLAYERS.contains(e)) { + LOBBY_PLAYERS.add(player = (Player) e); + player.getSkullManager().setSkullCheckDisabled(false); + player.getSkullManager().setWilderness(false); + player.getInterfaceManager().closeOverlay(); + player.getInteraction().remove(Option._P_ATTACK); + if (player.getAppearance().getSkullIcon() == SKULL_ID) { + player.getAppearance().setSkullIcon(-1); + player.getUpdateMasks().register(new AppearanceFlag(player)); + } + } + } + + /** + * Resets the damage pulse. + * @param e The entity. + */ + public static void resetDamagePulse(Entity e) { + Pulse pl = e.getAttribute("fp_pulse", null); + if (pl != null) { + pl.stop(); + e.removeAttribute("fp_pulse"); + } + } + + /** + * Resets the last victor. + */ + private void resetLastVictor() { + List npcs = new ArrayList<>(RegionManager.forId(9552).getPlanes()[0].getNpcs()); + for (NPC n : npcs) { + if (n.getId() == 2734 || n.getId() == 2739) { + n.clear(); + } + } + if (lastVictor == null || !lastVictor.isActive()) { + return; + } + if (lastVictor.getAppearance().getSkullIcon() == SKULL_ID) { + player.getAppearance().setSkullIcon(-1); + player.getUpdateMasks().register(new AppearanceFlag(player)); + } + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e instanceof Player) { + removeFromBattle(e); + } + return false; + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 0, 8); + if (!login) { + player.setAttribute("fight_pits", true); + ForceMovement.run(player, Location.create(2399, 5177, 0), Location.create(2399, 5175, 0)); + return true; + } + if (WAR_ZONE.insideBorder(player.getLocation().getX(), player.getLocation().getY())) { + player.getProperties().setTeleportLocation(Location.create(2399, 5177, 0)); + } + return false; + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + if (!e.getAttribute("fight_pits", false)) { + return false; + } + LOBBY_PLAYERS.add((Player) e); + } + return super.enter(e); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (WAR_PLAYERS.contains(e)) { + removeFromBattle(e); + } + LOBBY_PLAYERS.remove(e); + if (logout) { + e.setLocation(Location.create(2399, 5177, 0)); + } + if (e instanceof Player && (player = (Player) e).getAppearance().getSkullIcon() == SKULL_ID) { + player.getAppearance().setSkullIcon(-1); + player.getUpdateMasks().register(new AppearanceFlag(player)); + } + return super.leave(e, logout); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GameObject) { + GameObject o = (GameObject) target; + if (o.getId() == 9369) { + ForceMovement.run(e, Location.create(2399, 5175, 0), Location.create(2399, 5177, 0)); + return true; + } + if (o.getId() == 9368) { + if (WAR_PLAYERS.contains(e)) { + removeFromBattle(e); + ForceMovement.run(e, Location.create(2399, 5167, 0), Location.create(2399, 5169, 0)); + return true; + } + ((Player) e).getPacketDispatch().sendMessage("This vent is too hot for you to pass!"); + return true; + } + } + return false; + } + + @Override + public Location getSpawnLocation() { + Random r = RandomFunction.RANDOM; + int x = 2395 + r.nextInt(8); + int y = 5170 + r.nextInt(5); + if (x == 2399 && y == 5172) { + y--; + } + return Location.create(x, y, 0); + } + + @Override + public void configure() { + register(new ZoneBorders(2368, 5120, 2420, 5176)); + PULSE.start(); + GameWorld.getPulser().submit(PULSE); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return this; + } + + /** + * Spawns a wave in the fight pits minigame. + */ + private static void spawnWave() { + int stage = (minutes - 4) / 5; + switch (stage) { + case 1: + for (Player p : WAR_PLAYERS) { + for (int i = 0; i < 2 + ((minutes - 4) >> 2); i++) { + NPC n = NPC.create(2734, getZoneDestination()); + n.init(); + n.setAggressive(true); + n.setDefaultBehavior(); + n.getProperties().getCombatPulse().attack(p); + } + } + break; + case 2: + for (Player p : WAR_PLAYERS) { + for (int i = 0; i < 2 + ((minutes - 4) >> 2); i++) { + NPC n = NPC.create(2739, getZoneDestination()); + n.init(); + n.getProperties().getCombatPulse().attack(p); + } + } + break; + case 3: + for (final Player p : WAR_PLAYERS) { + Pulse pl = new Pulse(1, p) { + int count = 0; + + @Override + public boolean pulse() { + if (DeathTask.isDead(p)) { + return true; + } + p.getImpactHandler().manualHit(p, 1, HitsplatType.NORMAL); + p.getImpactHandler().manualHit(p, 1, HitsplatType.NORMAL); + return ++count == 100; + } + }; + p.setAttribute("fp_pulse", pl); + GameWorld.getPulser().submit(pl); + } + break; + } + } + + /** + * Starts a new game session. + */ + private static void startGameSession() { + if (LOBBY_PLAYERS.size() + WAR_PLAYERS.size() < 2) { + minutes = 2; + if (LOBBY_PLAYERS.size() == 1) { + LOBBY_PLAYERS.get(0).getPacketDispatch().sendMessage("There's not enough players to start the game."); + } + return; + } + tokkulAmount = 0; + String victor = null; + if (lastVictor != null) { + victor = "Current Champion: " + getChampionName();// JalYt-Mej-" + + // lastVictor.getUsername(); + } + int size = (LOBBY_PLAYERS.size() + WAR_PLAYERS.size()) - 1; + if (!WAR_PLAYERS.isEmpty()) { + WAR_PLAYERS.get(0).getConfigManager().set(560, size); + } + for (Iterator it = LOBBY_PLAYERS.iterator(); it.hasNext();) { + Player p = it.next(); + if (p != null && p.isActive()) { + WAR_PLAYERS.add(p); + p.getInterfaceManager().openOverlay(new Component(INTERFACE_ID)); + if (victor != null) { + p.getPacketDispatch().sendString(victor, INTERFACE_ID, 0); + } + p.getSkullManager().setSkullCheckDisabled(true); + p.getSkullManager().setWilderness(true); + p.getConfigManager().set(560, size); + p.getProperties().setTeleportLocation(getZoneDestination()); + p.getInteraction().set(Option._P_ATTACK); + tokkulAmount += p.getProperties().getCurrentCombatLevel(); + } + it.remove(); + } + sendDialogue("Wait for my signal before fighting."); + } + + /** + * Gets the Tzhaar name of the current champion. + * @return The champion name. + */ + private static String getChampionName() { + int strength = lastVictor.getSkills().getStaticLevel(Skills.STRENGTH); + int defence = lastVictor.getSkills().getStaticLevel(Skills.DEFENCE); + int count = 0; + for (int i = 5; i < 23; i++) { + int skill; + if ((skill = lastVictor.getSkills().getStaticLevel(i)) > strength && skill > defence) { + if (++count == 5) { + return "JalYt-Hur-" + lastVictor.getUsername(); + } + } + } + int skill = lastVictor.getSkills().getHighestCombatSkill(); + switch (skill) { + case Skills.ATTACK: + case Skills.STRENGTH: + return "JalYt-Ket-" + lastVictor.getUsername(); + case Skills.RANGE: + return "JalYt-Xil-" + lastVictor.getUsername(); + case Skills.MAGIC: + return "JalYt-Mej-" + lastVictor.getUsername(); + } + return "JalYtHur-" + lastVictor.getUsername(); + } + + /** + * Adds the tokkul. + * @param p The player to receive the tokkul. + */ + public static void addTokkul(Player p) { + int amount = tokkulAmount; + if (p.getEquipment().getNew(EquipmentContainer.SLOT_CAPE).getId() == 6570) { + amount *= 2; + } + if (amount > 0) { + if (!p.getInventory().add(new Item(6529, amount))) { + p.getPacketDispatch().sendMessage("Your Tokkul reward was added to your bank."); + p.getBank().add(new Item(6529, amount)); + } + } + } + + /** + * Gets the teleport destination in the war zone. + * @return The location. + */ + private static Location getZoneDestination() { + switch (RandomFunction.randomize(5)) { + case 0: + return Location.create(2384 + RandomFunction.random(29), 5133 + RandomFunction.random(4), 0); + case 1: + return Location.create(2410 + RandomFunction.random(4), 5140 + RandomFunction.random(18), 0); + case 2: + return Location.create(2392 + RandomFunction.random(11), 5141 + RandomFunction.random(26), 0); + case 3: + return Location.create(2383 + RandomFunction.random(3), 5141 + RandomFunction.random(15), 0); + case 4: + return Location.create(2392 + RandomFunction.random(12), 5145 + RandomFunction.random(20), 0); + } + return null; + } + + /** + * Sends the foes remaining count to all players. + * @param value The value. + */ + public static void sendPlayersRemaining(int value) { + for (Player p : WAR_PLAYERS) { + p.getConfigManager().set(560, value); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/wguild/WarriorsGuild.java b/Server/src/main/java/Server/core/game/content/activity/wguild/WarriorsGuild.java new file mode 100644 index 000000000..e69ac3c01 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/wguild/WarriorsGuild.java @@ -0,0 +1,165 @@ +package core.game.content.activity.wguild; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the warrior guild options. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WarriorsGuild extends OptionHandler { + + /** + * The token item id. + */ + public static final int TOKEN = 8851; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(15653).getHandlers().put("option:open", this); + ObjectDefinition.forId(1530).getHandlers().put("option:open", this); + NPCDefinition.forId(4287).getHandlers().put("option:claim-shield", this); + NPCDefinition.setOptionHandler("claim-tokens", this); + PluginManager.definePlugin(new ClaimTokenDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 15653: + case 1530: + if (node.getId() == 1530 && !node.getLocation().equals(new Location(2837, 3549, 0))) { + DoorActionHandler.handleDoor(player, (GameObject) node); + return true; + } + if (canEnter(player)) { + player.getMusicPlayer().unlock(634); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } else { + player.getDialogueInterpreter().sendDialogues(4285, null, "You not pass. You too weedy."); + } + break; + + default: + switch (option) { + case "claim-shield": + player.getDialogueInterpreter().open(4287, node, true); + break; + case "claim-tokens": + player.getDialogueInterpreter().open("wg:claim-tokens", node.getId()); + break; + } + break; + } + return true; + } + + /** + * Checks if a player can enter the guild. + * @param player the player. + * @return {@code True} if so. + */ + private boolean canEnter(final Player player) { + return player.getSkills().getStaticLevel(Skills.ATTACK) + player.getSkills().getStaticLevel(Skills.STRENGTH) >= 130 || player.getSkills().getStaticLevel(Skills.ATTACK) == 99 || player.getSkills().getStaticLevel(Skills.STRENGTH) == 99; + } + + /** + * The dialogue used to handle the claiming of tokens. + * @author 'Vexia + * @version 1.0 + */ + public static final class ClaimTokenDialogue extends DialoguePlugin { + + /** + * The npc id being used. + */ + private int npcId; + + /** + * Constructs a new {@code ClaimTokenDialogue} {@code Object}. + */ + public ClaimTokenDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ClaimTokenDialogue} {@code Object}. + * @param player the player. + */ + public ClaimTokenDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ClaimTokenDialogue(player); + } + + @Override + public boolean open(Object... args) { + npcId = (Integer) args[0]; + player("May I claim my tokens please?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + int tokens = player.getSavedData().getActivityData().getWarriorGuildTokens(); + switch (stage) { + case 0: + if (tokens < 1) { + interpreter.sendDialogues(npcId, null, "I'm afraid you have not earned any tokens yet. Try", "some of the activities around the guild to earn some."); + stage = 3; + } else { + interpreter.sendDialogues(npcId, null, "Of course! Here you go, you've earned " + tokens + " tokens!"); + stage++; + } + break; + case 1: + final Item item = new Item(TOKEN, tokens); + if (!player.getInventory().hasSpaceFor(item)) { + player("Sorry, I don't seem to have enough inventory space."); + stage++; + break; + } + player.getSavedData().getActivityData().setWarriorGuildTokens(0); + player.getInventory().add(item); + player("Thanks!"); + stage++; + break; + case 2: + end(); + break; + case 3: + player("Ok, I'll go see what I can find."); + stage--; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("wg:claim-tokens") }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/wguild/animator/AnimatedArmour.java b/Server/src/main/java/Server/core/game/content/activity/wguild/animator/AnimatedArmour.java new file mode 100644 index 000000000..44b05b41b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/wguild/animator/AnimatedArmour.java @@ -0,0 +1,125 @@ +package core.game.content.activity.wguild.animator; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +import core.game.content.activity.wguild.animator.AnimationRoom.ArmourSet; + +/** + * Represents an animated armour. + * @author Emperor + */ +public final class AnimatedArmour extends NPC { + + /** + * The player. + */ + private final Player player; + + /** + * The armour set. + */ + private final ArmourSet set; + + /** + * If the set is running. + */ + private boolean running; + + /** + * Constructs a new {@code AnimatedArmour} {@code Object}. + * @param player The player. + * @param location The location to spawn. + * @param set The armour set. + */ + protected AnimatedArmour(Player player, Location location, ArmourSet set) { + super(set.getNpcId(), location); + this.player = player; + this.set = set; + } + + @Override + public void init() { + super.init(); + animate(Animation.create(4166)); + sendChat("I'M ALIVE!"); + getProperties().getCombatPulse().attack(player); + HintIconManager.registerHintIcon(player, this); + } + + @Override + public void clear() { + super.clear(); + player.getHintIconManager().clear(); + } + + @Override + public void handleTickActions() { + if (!running && !getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + if (!running) { + if (getSkills().getLifepoints() < (getSkills().getMaximumLifepoints() / 10) && RandomFunction.randomize(10) < 2) { + running = true; + getProperties().getCombatPulse().stop(); + Pathfinder.find(location, Location.create(2849, 3534, 0)).walk(this); + return; + } + super.onImpact(entity, state); + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity != player) { + if (entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage("This isn't your armour to attack."); + } + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public void finalizeDeath(Entity killer) { + clear(); + if (killer != null) { + boolean takenPiece = false; + boolean canTake = RandomFunction.random(180) == 1; + int index = 0; + int takeIndex = 0; + if (canTake) { + takeIndex = RandomFunction.random(set.getPieces().length); + } + for (int piece : set.getPieces()) { + if (canTake && !takenPiece && index == takeIndex) { + takenPiece = true; + player.getPacketDispatch().sendMessage("Your armour was destroyed in the fight."); + continue; + } + GroundItemManager.create(new Item(piece), location, player); + index++; + } + if (killer != null) { // Indicates the player actually killed the + // armour. + int amount = set.getTokenAmount(); + GroundItemManager.create(new Item(8851, amount), location, player); + } + player.removeAttribute("animated_set"); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/activity/wguild/animator/AnimationRoom.java b/Server/src/main/java/Server/core/game/content/activity/wguild/animator/AnimationRoom.java new file mode 100644 index 000000000..81bd3fa2b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/wguild/animator/AnimationRoom.java @@ -0,0 +1,208 @@ +package core.game.content.activity.wguild.animator; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.ItemLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the animation + * @author Emperor + */ +@Initializable +public final class AnimationRoom extends MapZone implements Plugin { + + /** + * Represents an armour set to be used on the animator. + * @author Emperor + */ + static enum ArmourSet { + BRONZE(4278, 5, 1155, 1117, 1075), IRON(4279, 10, 1153, 1115, 1067), STEEL(4280, 15, 1157, 1119, 1069), BLACK(4281, 20, 1165, 1125, 1077), MITHRIL(4282, 25, 1159, 1121, 1071), ADAMANT(4283, 30, 1161, 1123, 1073), RUNE(4284, 40, 1163, 1127, 1079); + + /** + * The NPC id. + */ + private final int npcId; + + /** + * The amount of tokens to add. + */ + private final int tokenAmount; + + /** + * The pieces. + */ + private final int[] pieces; + + /** + * Constructs a new {@code ArmourSet} {@code Object}. + * @param npcId The NPC id. + * @param pieces The pieces. + */ + private ArmourSet(int npcId, int tokenAmount, int... pieces) { + this.npcId = npcId; + this.tokenAmount = tokenAmount; + this.pieces = pieces; + } + + /** + * Gets the npcId. + * @return The npcId. + */ + public int getNpcId() { + return npcId; + } + + /** + * Gets the tokenAmount. + * @return The tokenAmount. + */ + public int getTokenAmount() { + return tokenAmount; + } + + /** + * Gets the pieces. + * @return The pieces. + */ + public int[] getPieces() { + return pieces; + } + + } + + /** + * Constructs a new {@code AnimationRoom} {@code Object}. + */ + public AnimationRoom() { + super("wg animation", true); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + NPC npc = e.getAttribute("animated_set"); + if (npc != null && npc.isActive()) { + npc.finalizeDeath(null); + } + } + return true; + } + + /** + * Animates the armour set. + * @param player The player. + * @param object The animator. + * @param set The set to animate. + */ + private void animateArmour(final Player player, final GameObject object, final ArmourSet set) { + if (!player.getInventory().containItems(set.getPieces())) { + player.getDialogueInterpreter().sendDialogue("You need a plate body, playe legs and full helm of the same type to", "activate the armour animator."); + return; + } + if (player.getAttribute("animated_set") != null) { + player.getPacketDispatch().sendMessage("You already have a set animated."); + return; + } + player.lock(10); + player.animate(Animation.create(827)); + player.getDialogueInterpreter().sendPlainMessage(true, "You place your armour on the platform where it", "disappears..."); + GameWorld.getPulser().submit(new Pulse(5, player) { + boolean spawn; + + @Override + public boolean pulse() { + if (!spawn) { + for (int id : set.getPieces()) { + if (!player.getInventory().remove(new Item(id))) { + return true; + } + } + player.getAudioManager().send(1909); + player.addExtension(LogoutTask.class, new ItemLogoutTask(5, new Item(set.getPieces()[0]), new Item(set.getPieces()[1]), new Item(set.getPieces()[2]))); + player.getDialogueInterpreter().sendPlainMessage(true, "The animator hums, something appears to be working.", "You stand back..."); + spawn = true; + super.setDelay(4); + return false; + } + if (getDelay() == 4) { + setDelay(1); + player.getAudioManager().send(1910); + ForceMovement.run(player, player.getLocation().transform(0, 1, 0)).setDirection(Direction.SOUTH); + return false; + } + player.removeExtension(LogoutTask.class); + player.getInterfaceManager().closeChatbox(); + NPC npc = new AnimatedArmour(player, object.getLocation(), set); + player.setAttribute("animated_set", npc); + npc.init(); + return true; + } + }); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + int[] ids = new int[ArmourSet.values().length * 3]; + int index = 0; + for (ArmourSet set : ArmourSet.values()) { + for (int id : set.getPieces()) { + ids[index++] = id; + } + } + UseWithHandler.addHandler(15621, UseWithHandler.OBJECT_TYPE, new UseWithHandler(ids) { + + @Override + public boolean handle(NodeUsageEvent event) { + Item item = event.getUsedItem(); + ArmourSet set = null; + roar: { + for (ArmourSet s : ArmourSet.values()) { + for (int id : s.getPieces()) { + if (id == item.getId()) { + set = s; + break roar; + } + } + } + } + animateArmour(event.getPlayer(), (GameObject) event.getUsedWith(), set); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + }); + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + super.register(new ZoneBorders(2849, 3534, 2861, 3545)); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/wguild/barrel/BarrelRoom.java b/Server/src/main/java/Server/core/game/content/activity/wguild/barrel/BarrelRoom.java new file mode 100644 index 000000000..b6c126b3e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/wguild/barrel/BarrelRoom.java @@ -0,0 +1,178 @@ +package core.game.content.activity.wguild.barrel; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import core.cache.def.impl.ObjectDefinition; +import core.game.container.impl.EquipmentContainer; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.lock.Lock; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the Barrel room. + * @author Emperor + */ +@Initializable +public final class BarrelRoom extends MapZone implements Plugin { + + /** + * The players list. + */ + private static List players = new ArrayList<>(); + + /** + * The pulse. + */ + private static Pulse pulse = new Pulse(5) { + @Override + public boolean pulse() { + if (players.isEmpty()) { + return true; + } + for (Iterator it = players.iterator(); it.hasNext();) { + Player player = it.next(); + player.getSettings().updateRunEnergy(5); + if (player.getLocks().isMovementLocked()) { + continue; + } + int barrels = (player.getAttribute("barrel_count", 8860) - 8859); + int chance = (int) (player.getSettings().getRunEnergy() - (5 * barrels)); + if (RandomFunction.randomize(100) > chance) { + removeBarrels(player); + player.sendChat("Ouch!"); + player.getPacketDispatch().sendMessage("Some of the barrels hit you on their way to the floor."); + player.getImpactHandler().manualHit(player, 1, HitsplatType.NORMAL); + player.visualize(Animation.create(4177), Graphics.create(689 - barrels)); + it.remove(); + continue; + } + player.getSavedData().getActivityData().updateWarriorTokens(barrels); + } + return false; + } + }; + + /** + * Constructs a new {@code BarrelRoom} {@code Object}. + */ + public BarrelRoom() { + super("wg barrel", true); + } + + @Override + public void configure() { + super.register(new ZoneBorders(2861, 3536, 2876, 3543)); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + pulse.stop(); + PluginManager.definePlugin(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(15668).getHandlers().put("option:pick-up", this); + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + if (player.getSettings().getRunEnergy() < 5) { + player.getDialogueInterpreter().sendDialogue("You're too exhausted to continue. Take a break."); + return true; + } + int helmId = player.getEquipment().getNew(EquipmentContainer.SLOT_HAT).getId(); + int currentBarrel = player.getAttribute("barrel_count", 0); + if (player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) != null || player.getEquipment().get(EquipmentContainer.SLOT_SHIELD) != null || player.getEquipment().get(EquipmentContainer.SLOT_HANDS) != null || helmId != currentBarrel) { + player.getDialogueInterpreter().sendDialogue("To balance kegs you will need your head and hands free!"); + return true; + } + int id = currentBarrel + 1; + if (id < 8860) { + id = 8860; + } else if (id > 8864) { + id = 8864; + } + final int barrelId = id; + player.lock(5); + player.animate(Animation.create(4180)); + Lock lock = new Lock("You're too busy balancing barrels to do that!"); + lock.lock(); + player.getLocks().setEquipmentLock(lock); + player.getPacketDispatch().sendMessage("You pick up the keg and balance it on your head carefully."); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getEquipment().replace(new Item(barrelId), EquipmentContainer.SLOT_HAT); + player.getAppearance().setAnimations(Animation.create(4178)); + player.getAppearance().setStandAnimation(4179); + player.getAppearance().sync(); + player.setAttribute("barrel_count", barrelId); + ((GameObject) node).setChildIndex(player, 1); + if (!players.contains(player)) { + player.getWalkingQueue().setRunDisabled(true); + players.add(player); + if (!pulse.isRunning()) { + pulse.restart(); + pulse.start(); + GameWorld.getPulser().submit(pulse); + } + } + return true; + } + }); + return true; + } + }); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player && e.getAttribute("barrel_count", 0) > 0) { + players.remove(e); + removeBarrels((Player) e); + } + return super.leave(e, logout); + } + + /** + * Removes the barrels from the player's head. + * @param player The player. + */ + private static void removeBarrels(Player player) { + if (player.getLocks().getEquipmentLock() != null) { + player.getLocks().getEquipmentLock().unlock(); + } + player.removeAttribute("barrel_count"); + player.getWalkingQueue().setRunDisabled(false); + player.getEquipment().replace(null, EquipmentContainer.SLOT_HAT); + player.getAppearance().setAnimations(); + player.getAppearance().sync(); + player.getConfigManager().set(793, 0); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/wguild/catapult/CatapultRoom.java b/Server/src/main/java/Server/core/game/content/activity/wguild/catapult/CatapultRoom.java new file mode 100644 index 000000000..874b4cf28 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/wguild/catapult/CatapultRoom.java @@ -0,0 +1,271 @@ +package core.game.content.activity.wguild.catapult; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.impl.EquipmentContainer; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * The catapult room. + * @author Emperor + */ +@Initializable +public final class CatapultRoom extends MapZone implements Plugin { + + /** + * The target location. + */ + private static final Location TARGET = Location.create(2842, 3545, 1); + + /** + * The shield item id. + */ + private static final int SHIELD_ID = 8856; + + /** + * Represents a catapult attack. + * @author Emperor + */ + private static enum CatapultAttack { + SPIKY_BALL(679, 15617, Animation.create(4169), Animation.create(4173)), FLUNG_ANVIL(680, 15619, Animation.create(4168), Animation.create(4172)), SLASHING_BLADES(681, 15620, Animation.create(4170), Animation.create(4174)), MAGIC_MISSILE(682, 15618, Animation.create(4171), Animation.create(4175)); + + /** + * The graphic id. + */ + private final int graphicId; + + /** + * The attack name. + */ + private final String name; + + /** + * The object id to replace with. + */ + private final int objectId; + + /** + * The successful animation. + */ + private final Animation success; + + /** + * The animation when failing to defend. + */ + private final Animation fail; + + /** + * Constructs a new {@code CatapultAttack} {@code Object}. + * @param graphicId The graphic id. + * @param success The success animation. + * @param fail The fail animation. + */ + private CatapultAttack(int graphicId, int objectId, Animation success, Animation fail) { + this.graphicId = graphicId; + this.name = name().toLowerCase().replace("_", " "); + this.objectId = objectId; + this.success = success; + this.fail = fail; + } + } + + /** + * The players in the catapult room. + */ + private static List players = new ArrayList<>(); + + /** + * The current attack. + */ + private static CatapultAttack attack; + + /** + * The pulse. + */ + private static Pulse pulse = new Pulse(10) { + @Override + public boolean pulse() { + attack = RandomFunction.getRandomElement(CatapultAttack.values()); + GameWorld.getPulser().submit(new Pulse(7) { + @Override + public boolean pulse() { + for (Player p : players) { + if (p.isActive() && p.getLocation().equals(TARGET)) { + if (p.getEquipment().getNew(EquipmentContainer.SLOT_SHIELD).getId() != SHIELD_ID) { + p.getDialogueInterpreter().sendDialogues(4287, FacialExpression.FURIOUS, "Watch out! You'll need to equip the shield as soon as", "you're on the target spot else you could get hit! Speak", "to me to get one, and make sure both your hands are", "free to equip it."); + p.getWalkingQueue().reset(); + p.getWalkingQueue().addPath(p.getLocation().getX() + 1, p.getLocation().getY()); + continue; + } + p.faceLocation(Location.create(2842, 3554, 1)); + if (p.getAttribute("catapult_def", CatapultAttack.MAGIC_MISSILE) != attack) { + p.getPacketDispatch().sendMessage("You fail defending against the " + attack.name + "."); + p.getImpactHandler().manualHit(p, 3, HitsplatType.NORMAL); + p.animate(attack.fail); + } else { + p.getSkills().addExperience(Skills.DEFENCE, 10.0, true); + p.getPacketDispatch().sendMessage("You successfully defend against the " + attack.name + "."); + p.getSavedData().getActivityData().updateWarriorTokens(1); + p.animate(attack.success); + } + } + } + return true; + } + }); + Projectile.create(Location.create(2842, 3554, 1), Location.create(2842, 3545, 1), attack.graphicId, 70, 32, 80, 220, 20, 11).send(); + GameObject object = RegionManager.getObject(Location.create(2840, 3552, 1)); + ObjectBuilder.replace(object, object.transform(attack.objectId), 4); + Audio sound = new Audio(1911); + for (Player p : players) { + p.getAudioManager().send(sound); + } + return players.isEmpty(); + } + }; + + /** + * Constructs a new {@code CatapultRoom} {@code Object}. + */ + public CatapultRoom() { + super("wg catapult", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugin(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(SHIELD_ID).getHandlers().put("option:wield", this); + ObjectDefinition.forId(15657).getHandlers().put("option:view", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (node instanceof Item) { + if (!player.getLocation().equals(TARGET)) { + player.getPacketDispatch().sendMessage("You may not equip this shield outside the target area in the Warrior's Guild."); + return true; + } + if (player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) != null) { + player.getDialogueInterpreter().sendDialogue("You will need to make sure your sword hand is free to equip this", "shield."); + return true; + } + ItemDefinition.getOptionHandlers().get("wield").handle(player, node, option); + if (player.getEquipment().getNew(EquipmentContainer.SLOT_SHIELD).getId() == SHIELD_ID) { + player.getInterfaceManager().hideTabs(2, 3, 5, 6, 7, 11, 12); + player.getInterfaceManager().openTab(4, new Component(411)); + player.getInterfaceManager().setViewedTab(4); + } + return true; + } + player.getInterfaceManager().open(new Component(410)); + return true; + } + }); + PluginManager.definePlugin(new ComponentPlugin() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(411, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (button >= 9 && button <= 12) { + CatapultAttack attack = CatapultAttack.values()[button - 9]; + player.setAttribute("catapult_def", attack); + player.getConfigManager().set(788, (button - 8) % 4); + return true; + } + return false; + } + + }); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + super.register(new ZoneBorders(2837, 3542, 2847, 3556)); + pulse.stop(); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player && e.getLocation().getZ() == 1) { + players.add((Player) e); + if (!pulse.isRunning()) { + pulse.restart(); + pulse.start(); + GameWorld.getPulser().submit(pulse); + } + } + return super.enter(e); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + players.remove(e); + unequipShield((Player) e); + } + return super.leave(e, logout); + } + + @Override + public void locationUpdate(Entity e, Location last) { + if (e instanceof Player && last.equals(TARGET)) { + unequipShield((Player) e); + } + } + + /** + * Unequips the shield. + * @param player The player. + */ + private static void unequipShield(Player player) { + if (player.getEquipment().getNew(EquipmentContainer.SLOT_SHIELD).getId() == SHIELD_ID) { + player.getInventory().add(new Item(SHIELD_ID), player); + player.getEquipment().replace(null, EquipmentContainer.SLOT_SHIELD); + player.getInterfaceManager().restoreTabs(); + player.getInterfaceManager().openTab(4, new Component(387)); + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/activity/wguild/cyclopes/CyclopesRoom.java b/Server/src/main/java/Server/core/game/content/activity/wguild/cyclopes/CyclopesRoom.java new file mode 100644 index 000000000..242da69bf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/wguild/cyclopes/CyclopesRoom.java @@ -0,0 +1,284 @@ +package core.game.content.activity.wguild.cyclopes; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import core.cache.def.impl.ObjectDefinition; +import core.game.container.impl.EquipmentContainer; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Pathfinder; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * The cyclopes room. + * @author Emperor + */ +@Initializable +public final class CyclopesRoom extends MapZone implements Plugin { + + /** + * The defenders. + */ + private static final int[] DEFENDERS = { 8844, 8845, 8846, 8847, 8848, 8849, 8850}; + + /** + * The players in the room. + */ + private static final List PLAYERS = new ArrayList<>(); + + /** + * The pulse. + */ + private static final Pulse PULSE = new Pulse(5) { + @Override + public boolean pulse() { + if (PLAYERS.isEmpty()) { + return true; + } + for (Iterator it = PLAYERS.iterator(); it.hasNext();) { + Player p = it.next(); + int current = p.getAttribute("cyclops_ticks", 0) + 5; + if (current % 100 == 0) { + Item tokens = new Item(8851, 10); + if (!p.getInventory().containsItem(tokens)) { + if (!p.getLocks().isMovementLocked()) { + p.getPulseManager().clear(); + Pathfinder.find(p.getLocation(), Location.create(2847, 3541, 2)).walk(p); + p.lock(50); + } else { + GameObject object = RegionManager.getObject(2, 2847, 3541); + if (object != null && p.getLocation().getX() == 2847 && p.getLocation().getY() == 3541) { + DoorActionHandler.handleAutowalkDoor(p, object); + leave(p); + p.unlock(); + p.lock(3); + it.remove(); + } + } + continue; + } + p.getInventory().remove(tokens); + p.getPacketDispatch().sendMessage("10 of your tokens crumble away."); + } + p.setAttribute("cyclops_ticks", current); + } + return false; + } + }; + + /** + * Constructs a new {@code CyclopesRoom} {@code Object}. + */ + public CyclopesRoom() { + super("wg cyclopes", true, ZoneRestriction.RANDOM_EVENTS); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player && PLAYERS.contains(e)) { + leave((Player) e); + PLAYERS.remove(e); + if (logout) { + e.setLocation(Location.create(2846, 3540, 2)); + } + } + return super.leave(e, logout); + } + + @Override + public boolean death(Entity e, Entity killer) { + if (killer instanceof Player && e instanceof NPC && (e.getId() == 4292 || e.getId() == 4291)) { + int defenderId = getDefenderIndex((Player) killer); + if (RandomFunction.randomize(32) == 10) { + if (++defenderId == DEFENDERS.length) { + defenderId--; + } + GroundItemManager.create(new Item(DEFENDERS[defenderId]), e.getLocation(), (Player) killer); + } + } + return false; + } + + @Override + public void configure() { + super.register(new ZoneBorders(2838, 3534, 2876, 3556)); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PULSE.stop(); + PluginManager.definePlugin(new KamfreenaDial()); + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(15641).getHandlers().put("option:open", this); + ObjectDefinition.forId(15644).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getLocation().getX() <= 2846) { + Item tokens = new Item(8851, 100); + if (!player.getInventory().containsItem(tokens)) { + player.getDialogueInterpreter().sendItemMessage(tokens, "You don't have enough Warrior Guild Tokens to enter", "the cyclopes enclosure yet, collect at least 100 then", "come back."); + return true; + } + if (!player.getAttribute("sent_dialogue", false)) { + player.getDialogueInterpreter().open(DialogueInterpreter.getDialogueKey("defender entry"), getDefenderIndex(player)); + return true; + } + player.removeAttribute("sent_dialogue"); + enter(player); + } else { + leave(player); + PLAYERS.remove(player); + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + + }); + return this; + } + + /** + * Gets the current defender index. + * @param player The player. + * @return The defender index. + */ + private static int getDefenderIndex(Player player) { + int index = -1; + for (int i = DEFENDERS.length - 1; i >= 0; i--) { + int id = DEFENDERS[i]; + if (player.getEquipment().getNew(EquipmentContainer.SLOT_SHIELD).getId() == id || player.getInventory().contains(id, 1)) { + index = i; + break; + } + } + return index; + } + + /** + * Enters the cyclopes room. + * @param player The player. + */ + private static void enter(Player player) { + if (!PLAYERS.contains(player)) { + PLAYERS.add(player); + } + if (!PULSE.isRunning()) { + PULSE.restart(); + PULSE.start(); + GameWorld.getPulser().submit(PULSE); + } + } + + /** + * Leaves the room. + * @param player The player. + */ + private static void leave(Player player) { + player.removeAttribute("cyclops_ticks"); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * The Kamfreena entrance dialogue. + * @author Emperor + */ + private static class KamfreenaDial extends DialoguePlugin { + + /** + * The current defender item id. + */ + private int defenderId; + + /** + * Constructs a new {@code KamfreenaDial} {@code Object}. + */ + public KamfreenaDial() { + super(); + } + + /** + * Constructs a new {@code KamfreenaDial} {@code Object}. + * @param player The player. + */ + public KamfreenaDial(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KamfreenaDial(player); + } + + @Override + public boolean open(Object... args) { + defenderId = (Integer) args[0]; + if (defenderId == -1) { + npc(4289, "Well, since you haven't shown me a defender to prove", "your prowess as a warrior,"); + } else { + npc(4289, "Ahh I see that you have one of the defenders already!", "Well done."); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player.setAttribute("sent_dialogue", true); + if (defenderId == DEFENDERS.length - 1) { + npc(4289, "I'll release some cyclopes which might drop the same", "rune defender for you as there isn't any higher! Have", "fun in there."); + } else if (defenderId == -1) { + npc(4289, "I'll release some cyclopes which might drop bronze", "defenders for you to start off with, unless you show me", "another. Have fun in there."); + } else { + npc(4289, "I'll release some cyclopes which might drop the next", "defender for you. Have fun in there."); + } + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("defender entry") }; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/wguild/dummy/DummyRoom.java b/Server/src/main/java/Server/core/game/content/activity/wguild/dummy/DummyRoom.java new file mode 100644 index 000000000..c1bc6cba0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/wguild/dummy/DummyRoom.java @@ -0,0 +1,168 @@ +package core.game.content.activity.wguild.dummy; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.chunk.AnimateObjectUpdateFlag; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the dummy room. + * @author Emperor + */ +@Initializable +public final class DummyRoom extends OptionHandler { + + /** + * Represents a dummy. + * @author Emperor + */ + private static enum Dummy { + STAB(new GameObject(15629, 2857, 3549, 0, 10, 2), -1, WeaponInterface.BONUS_STAB), SLASH(new GameObject(15625, 2858, 3554, 0), -1, WeaponInterface.BONUS_SLASH), CRUSH(new GameObject(15628, 2859, 3549, 0, 10, 2), -1, WeaponInterface.BONUS_CRUSH), CONTROLLED(new GameObject(15627, 2855, 3552, 0, 10, 3), WeaponInterface.STYLE_CONTROLLED, -1), DEFENCE(new GameObject(15630, 2855, 3550, 0, 10, 3), WeaponInterface.STYLE_DEFENSIVE, -1), AGGRESSIVE(new GameObject(15626, 2860, 3553, 0, 10, 1), WeaponInterface.STYLE_AGGRESSIVE, -1), ACCURATE(new GameObject(15624, 2856, 3554, 0), WeaponInterface.STYLE_ACCURATE, -1), ; + + /** + * The object. + */ + private final GameObject object; + + /** + * The attack style to be used on this dummy. + */ + private final int attackStyle; + + /** + * The bonus type to be used on this dummy. + */ + private final int bonusType; + + /** + * Constructs a new {@code Dummy} {@code Object}. + * @param object The object. + * @param attackStyle The attack style. + */ + private Dummy(GameObject object, int attackStyle, int bonusType) { + this.object = object; + this.attackStyle = attackStyle; + this.bonusType = bonusType; + } + + /** + * Gets the object. + * @return The object. + */ + public GameObject getObject() { + return object; + } + + /** + * Gets the attackStyle. + * @return The attackStyle. + */ + public int getAttackStyle() { + return attackStyle; + } + + /** + * Gets the bonusType. + * @return The bonusType. + */ + public int getBonusType() { + return bonusType; + } + } + + /** + * The current dummy. + */ + private static Dummy dummy; + + /** + * The time stamp. + */ + private static int timeStamp; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(15656).getHandlers().put("option:view", this); + for (Dummy dummy : Dummy.values()) { + ObjectDefinition.forId(dummy.getObject().getId()).getHandlers().put("option:hit", this); + } + GameWorld.getPulser().submit(new Pulse(10) { + boolean activeDummy; + GameObject controlled; + + @Override + public boolean pulse() { + if (!activeDummy) { + setDelay(10); + timeStamp = GameWorld.getTicks(); + dummy = RandomFunction.getRandomElement(Dummy.values()); + ObjectBuilder.replace(RegionManager.getObject(dummy.getObject().getLocation()), dummy.getObject(), 11); + activeDummy = true; + if (dummy == Dummy.CONTROLLED && controlled == null) { + Location l = Location.create(2860, 3551, 0); + controlled = new GameObject(dummy.getObject().getId(), l, 10, 1); + ObjectBuilder.replace(RegionManager.getObject(l), controlled, 11); + } + return false; + } + setDelay(4); + Animation animation = Animation.create(4164); + animation.setObject(dummy.getObject()); + RegionManager.getRegionChunk(dummy.getObject().getLocation()).flag(new AnimateObjectUpdateFlag(animation)); + activeDummy = false; + if (controlled != null) { + animation = Animation.create(4164); + animation.setObject(controlled); + RegionManager.getRegionChunk(controlled.getLocation()).flag(new AnimateObjectUpdateFlag(animation)); + controlled = null; + } + return false; + } + }); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + GameObject object = (GameObject) node; + if (object.getId() == 15656) { + player.getInterfaceManager().open(new Component(412)); + return true; + } + if (object.getId() == dummy.getObject().getId()) { + if (timeStamp == player.getAttribute("dummy_ts", -1)) { + player.getPacketDispatch().sendMessage("You have already hit a dummy this turn."); + return true; + } + if (player.getProperties().getAttackStyle().getStyle() != dummy.getAttackStyle() && player.getProperties().getAttackStyle().getBonusType() != dummy.getBonusType()) { + player.lock(5); + player.visualize(player.getProperties().getAttackAnimation(), new Graphics(80, 96)); + player.getPacketDispatch().sendMessage("You whack the dummy with the wrong attack style."); + } else { + player.getSkills().addExperience(Skills.ATTACK, 15.0, true); + player.animate(player.getProperties().getAttackAnimation()); + player.getPacketDispatch().sendMessage("You whack the dummy successfully!"); + player.setAttribute("dummy_ts", timeStamp); + player.getSavedData().getActivityData().updateWarriorTokens(2); + } + return true; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/activity/wguild/shot/ShotPutRoom.java b/Server/src/main/java/Server/core/game/content/activity/wguild/shot/ShotPutRoom.java new file mode 100644 index 000000000..6a935373f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/activity/wguild/shot/ShotPutRoom.java @@ -0,0 +1,198 @@ +package core.game.content.activity.wguild.shot; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.container.impl.EquipmentContainer; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the shot put room. + * @author Emperor + */ +@Initializable +public final class ShotPutRoom extends DialoguePlugin { + + static { + PluginManager.definePlugin(new OptionHandler() { + + @Override + public boolean handle(final Player player, Node node, String option) { + final boolean lowWeight = node.getId() == 15664; + if (node instanceof GroundItem) { + player.getDialogueInterpreter().sendDialogues(4300, FacialExpression.FURIOUS, "Hey! You can't take that, it's guild property. Take one", "from the pile."); + return true; + } + if (player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) != null || player.getEquipment().get(EquipmentContainer.SLOT_SHIELD) != null || player.getEquipment().get(EquipmentContainer.SLOT_HANDS) != null) { + player.getDialogueInterpreter().sendDialogue("To throw the shot you need your hands free!"); + return true; + } + if (player.getSettings().getRunEnergy() < 10) { + player.getDialogueInterpreter().sendDialogue("You're too exhausted to throw the shot at this time. Take a break."); + return true; + } + player.lock(4); + player.animate(Animation.create(827)); + GameWorld.getPulser().submit(new Pulse(2) { + @Override + public boolean pulse() { + player.faceLocation(player.getLocation().transform(3, 0, 0)); + player.getDialogueInterpreter().open("shot_put", lowWeight); + return true; + } + }); + return true; + } + + @Override + public Location getDestination(Node n, Node node) { + if (node instanceof GameObject) { + return node.getLocation().transform(0, -1, 0); + } + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(15664).getHandlers().put("option:throw", this); + ObjectDefinition.forId(15665).getHandlers().put("option:throw", this); + ItemDefinition.forId(8858).getHandlers().put("option:take", this); + ItemDefinition.forId(8859).getHandlers().put("option:take", this); + return this; + } + + }); + } + + /** + * If the low weight shot put is used. + */ + private boolean lowWeight; + + /** + * Constructs a new {@code ShotPutRoom} {@code Object}. + */ + public ShotPutRoom() { + super(); + } + + /** + * Constructs a new {@code ShotPutRoom} {@code Object}. + * @param player The player. + */ + public ShotPutRoom(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ShotPutRoom(player); + } + + @Override + public boolean open(Object... args) { + lowWeight = (Boolean) args[0]; + interpreter.sendOptions("Choose your style", "Standing throw", "Step and throw", "Spin and throw"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (buttonId) { + case 1: + player.animate(Animation.create(4181)); + throwShotPut(player, 5, lowWeight, "You throw the shot as hard as you can."); + break; + case 2: + player.animate(Animation.create(4182)); + throwShotPut(player, 2, lowWeight, "You take a step and throw the shot as hard as you can."); + break; + case 3: + player.animate(Animation.create(4183)); + throwShotPut(player, 5, lowWeight, "You spin around and release the shot."); + break; + default: + return false; + } + end(); + return true; + } + + /** + * Throws the shot put. + * @param player The player. + * @param delay The delay. + * @param lowWeight If the low weight shot put was thrown. + */ + private static void throwShotPut(final Player player, int delay, final boolean lowWeight, final String message) { + player.lock(); + int cost = lowWeight ? 6 : 12; + if (player.getAttribute("hand_dust", false)) { + player.removeAttribute("hand_dust"); + cost = 0; + } + int distance = 1; + if (RandomFunction.randomize(25 - cost) != 0) { + int mod = (int) (RandomFunction.randomize(cost) * (1 - (player.getSettings().getRunEnergy() / (100 + cost)))); + distance += RandomFunction.randomize(12 - mod); + } + final boolean failed = distance < 2; + final int tiles = distance; + player.getPacketDispatch().sendMessage("You take a deep breath and prepare yourself."); + GameWorld.getPulser().submit(new Pulse(delay, player) { + Location loc = player.getLocation(); + boolean thrown; + + @Override + public boolean pulse() { + if (!thrown) { + player.getSettings().updateRunEnergy(10); + player.getPacketDispatch().sendMessage(message); + if (failed) { + player.getPacketDispatch().sendMessage("You fumble and drop the shot on your toe. Ow!"); + player.getImpactHandler().manualHit(player, 1, HitsplatType.NORMAL, 2); + } + int speed = (int) (30 + (tiles * 10)); + Projectile projectile = Projectile.create(loc, loc = loc.transform(tiles, 0, 0), 690, 40, 0, getDelay() == 5 ? 5 : 12, speed, 20, 11); + projectile.send(); + setDelay(1 + (int) Math.ceil(tiles * 0.3)); + thrown = true; + return false; + } + player.unlock(); + if (!failed) { + player.getSavedData().getActivityData().updateWarriorTokens(tiles + (!lowWeight ? 2 : 0)); + player.getSkills().addExperience(Skills.STRENGTH, tiles); + player.getDialogueInterpreter().sendDialogues(lowWeight ? 4299 : 4300, FacialExpression.HALF_GUILTY, "Well done. You threw the shot " + (tiles - 1) + " yard" + (tiles > 2 ? "s!" : "!")); + } + GroundItemManager.create(new GroundItem(new Item(lowWeight ? 8858 : 8859), loc, 20, player)); + return true; + } + }); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("shot_put") }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/AntiMacroDialogue.java b/Server/src/main/java/Server/core/game/content/ame/AntiMacroDialogue.java new file mode 100644 index 000000000..7e2dfda15 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/AntiMacroDialogue.java @@ -0,0 +1,113 @@ +package core.game.content.ame; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.PluginManifest; +import core.plugin.PluginType; + +/** + * Handles the dialogue of an anti macro npc. + * @author Vexia + */ +@PluginManifest(type = PluginType.DIALOGUE) +public abstract class AntiMacroDialogue extends DialoguePlugin { + + /** + * The anti macro event. + */ + protected AntiMacroEvent event; + + /** + * Constructs a new {@code AntiMacroDialogue} {@code Object}. + */ + public AntiMacroDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AntiMacroDialogue} {@code Object}. + * @param player the player. + */ + public AntiMacroDialogue(final Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (!player.getAntiMacroHandler().isNPC(npc, true)) { + end(); + return false; + } + if (player.getAntiMacroHandler().getEvent() == null) { + return false; + } + if (asAme().inCombat()) { + asAme().getProperties().getCombatPulse().stop(); + } + + setEvent(player.getAntiMacroHandler().getEvent()); + return true; + } + + /** + * Wrapper method for waving the npc good bye. + */ + public void wave() { + wave(Animation.create(863)); + } + + /** + * Waves the npc good bye. + * @param wave the wave animation. + */ + public void wave(Animation wave) { + end(); + npc.lock(); + if (wave != null) { + npc.animate(wave); + } + GameWorld.getPulser().submit(new Pulse(4, npc, player) { + @Override + public boolean pulse() { + ((AntiMacroNPC) npc).clear(); + Graphics.send(new Graphics(86), npc.getLocation()); + //player.getPacketDispatch().sendPositionedGraphic(86, 0, 1, npc.getLocation()); + return true; + } + }); + event.terminate(); + } + + /** + * Gets the npc as an AME. + * @return the ame. + */ + public AntiMacroNPC asAme() { + return ((AntiMacroNPC) npc); + } + + /** + * Gets the event. + * @return The event. + */ + public AntiMacroEvent getEvent() { + return event; + } + + /** + * Sets the event. + * @param event The event to set. + */ + public void setEvent(AntiMacroEvent event) { + this.event = event; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/AntiMacroEvent.java b/Server/src/main/java/Server/core/game/content/ame/AntiMacroEvent.java new file mode 100644 index 000000000..2f98fdf65 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/AntiMacroEvent.java @@ -0,0 +1,193 @@ +package core.game.content.ame; + +import core.game.content.activity.ActivityPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneRestriction; +import core.tools.RandomFunction; + +/** + * Handles an anti-macro event. + * @author Emperor + */ +public abstract class AntiMacroEvent extends ActivityPlugin implements SavingModule { + + /** + * The random locations to teleport to if unresponsive. + */ + public static final Location[] LOCATIONS = new Location[] { Location.create(3218, 9616, 0),// Lumby + // basement + Location.create(3200, 3228, 0),// behind lumby + Location.create(2961, 3381, 0),// Fally square + }; + + /** + * The skill ids. + */ + private final int[] skillIds; + + /** + * The player. + */ + protected Player player; + + /** + * If the anti-macro event is terminated. + */ + protected boolean terminated; + + /** + * If saving is required. + */ + private boolean saveRequired; + + /** + * Constructs a new {@code AntiMacroEvent} {@code Object}. + * @param name The random event name. + * @param instanced If the event is instanced. + * @param saveRequired . + * @param skillIds The skill ids of the skills that fire this event (nothing + * for default). + */ + public AntiMacroEvent(String name, boolean instanced, boolean saveRequired, int... skillIds) { + super(name, instanced, false, false, ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.FIRES, ZoneRestriction.FOLLOWERS); + this.saveRequired = saveRequired; + this.skillIds = skillIds; + } + + @Override + public AntiMacroEvent newInstance(Player player) { + AntiMacroHandler.register(this); + return this; + } + + @Override + public abstract boolean start(Player player, boolean login, Object... args); + + /** + * Creates a new anti macro event instance. + * @param player The player. + * @return The anti macro event instance. + */ + public abstract AntiMacroEvent create(Player player); + + /** + * Called to end the macro event. + */ + public void terminate() { + if (terminated) { + return; + } + if (player != null) { + player.getAntiMacroHandler().setEvent(null); + } + terminated = true; + } + + /** + * Initializes the random event for the player. + * @param player The player. + */ + public void init(Player player) { + player.addExtension(AntiMacroEvent.class, this); + } + + /** + * Notes all the items in an inventory. + */ + public void noteItems() { + if (player == null) { + return; + } + for (Item i : player.getInventory().toArray()) { + if (i == null || !i.isActive()) { + continue; + } + if (i.getDefinition().isUnnoted()) { + int noteId = i.getDefinition().getNoteId(); + if (noteId < 0) { + continue; + } + player.getInventory().remove(i); + player.getInventory().add(new Item(noteId, i.getAmount())); + } + } + player.getInventory().shift(); + } + + /** + * Checks if the macro event can be fired for the given skill id. + * @param skillId The skill id. + * @return {@code True} if so. + */ + public boolean canFire(int skillId) { + if (skillIds.length == 0) { + return true; + } + for (int id : skillIds) { + if (id == skillId) { + return true; + } + } + return false; + } + + /** + * Gets a random location. + * @return a random location. + */ + public static Location getRandomLocation() { + return LOCATIONS[RandomFunction.random(LOCATIONS.length)]; + } + + /** + * Wrapper to get the gender prefix. + * @return the prefix. + */ + public String getGenderPrefix() { + return getGenderPrefix(player.getAppearance().isMale()); + } + + /** + * Gets the gender prefix. + * @param male if male. + * @return the prefix. + */ + public String getGenderPrefix(boolean male) { + return male ? "Sir" : "Mam"; + } + + /** + * Gets the terminated. + * @return The terminated. + */ + public boolean isTerminated() { + return terminated; + } + + /** + * Sets the terminated. + * @param terminated The terminated to set. + */ + public void setTerminated(boolean terminated) { + this.terminated = terminated; + } + + /** + * Gets the saveRequired. + * @return The saveRequired. + */ + public boolean isSaveRequired() { + return saveRequired; + } + + /** + * Sets the saveRequired. + * @param saveRequired The saveRequired to set. + */ + public void setSaveRequired(boolean saveRequired) { + this.saveRequired = saveRequired; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/AntiMacroHandler.java b/Server/src/main/java/Server/core/game/content/ame/AntiMacroHandler.java new file mode 100644 index 000000000..ea1c5efdd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/AntiMacroHandler.java @@ -0,0 +1,301 @@ +package core.game.content.ame; + +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.system.SystemLogger; +import core.game.world.map.zone.impl.WildernessZone; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.world.GameWorld; +import core.game.world.map.zone.ZoneRestriction; +import core.tools.RandomFunction; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +/** + * Handles anti-macroing. + * @author Emperor + * @author ceik + */ +public final class AntiMacroHandler implements SavingModule { + + /** + * The delay between periods in which it attempts to spawn a random event. + * For example, if delay is 500, it will wait 500 ticks before it starts trying to spawn a random event. + */ + private static final int DELAY = 3000; // 2000 ticks = 20 minutes + + /** + * The chance that, after the delay has passed, a random event has of occuring each tick. Takes the form of (1 / CHANCE) + */ + private static final int CHANCE = 750; // 1/500 chance, average of 500 ticks (roughly 5 minutes) before a random will spawn. + + /** + * Whether randoms are disabled for this player + */ + public boolean isDisabled; + + /** + * The list of anti-macro events. + */ + public static final Map EVENTS = new HashMap<>(); + + /** + * The player. + */ + private final Player player; + + /** + * The time at which the next series of attempts to spawn a random will occur. Usually GameWorld.getTicks() + DELAY + */ + private int nextPulse; + + /** + * The current event. + */ + private AntiMacroEvent event; + + public ExperienceMonitor[] monitors = new ExperienceMonitor[Skills.SKILL_NAME.length]; + + /** + * Constructs a new {@code AntiMacroHandler} {@code Object}. + * @param player The player. + */ + public AntiMacroHandler(Player player) { + this.player = player; + } + + /** + * Checks if saving is required. + * @return {@code True} if so. + */ + public boolean isSaveRequired() { + return hasEvent() && event.isSaveRequired(); + } + + @Override + public void save(ByteBuffer buffer) { + if (hasEvent()) { + buffer.put((byte) 1); + ByteBufferUtils.putString(event.getName(), buffer); + buffer.put((byte) 0); + int index = buffer.position(); + event.save(buffer); + buffer.put(index - 1, (byte) (buffer.position() - index)); + } + buffer.put((byte) 0); + } + + @Override + public void parse(ByteBuffer buffer) { + event = null; + while (true) { + switch (buffer.get() & 0xFF) { + case 0: + return; + case 1: + event = EVENTS.get(ByteBufferUtils.getString(buffer)); + int length = buffer.get() & 0xFF; + ByteBuffer buf = ByteBuffer.allocate(length); + for (int i = 0; i < length; i++) { + buf.put(buffer.get()); + } + buf.flip(); + if (event != null) { + (event = event.create(player)).parse(buf); + } + break; + } + } + } + + /** + * Gets called every game pulse. + */ + public void pulse() { + if (GameWorld.getTicks() < nextPulse) { + return; + } + if (!player.getLocks().isInteractionLocked() && !player.getLocks().isTeleportLocked() && !player.getLocks().isMovementLocked() && !isDisabled && !player.isArtificial()) { + int roll = RandomFunction.random(0,CHANCE); + int neededRoll = 1 + (CHANCE - RandomFunction.random(CHANCE - 10)); + boolean spawnEvent = roll == neededRoll; //checks if the chance is hit this tick + //SystemLogger.log("roll: " + roll + " needed roll: " + neededRoll); + int highestIndex = 0; + int highestAmount = 0; + if(spawnEvent){ + SystemLogger.logInfo("Anti-Macro: Trying to get event for " + player.getUsername()); + for(int i = 0; i < monitors.length; i++){ + try { + if (monitors[i].getExperienceAmount() > highestAmount) { + highestIndex = i; + highestAmount = monitors[i].getExperienceAmount(); + monitors[i].setExperienceAmount(0); + } + } catch (Exception e){} + } + fireEvent(highestIndex); + } + } + } + /** + * Initializes the anti macro event handler. + */ + public void init() { + isDisabled = player.getAttribute("randoms:disabled",false); + if(isDisabled){ + nextPulse = -1; + return; + } else { + nextPulse = GameWorld.getTicks() + DELAY; + } + if (event != null) { + event.start(player, true); + } + if(!player.isArtificial() && !isDisabled) { + SystemLogger.logInfo("Anti-Macro: Initialized anti-macro handler for " + player.getUsername()); + } + } + + /** + * Registers a new anti-macro event. + * @param event The event. + */ + public static void register(AntiMacroEvent event) { + event.register(); + EVENTS.put(event.getName(), event); + } + + /** + * Checks if the npc is part of the event. + * @param npc the npc. + * @return {@code True} if so. + * @param message the message. + */ + public boolean isNPC(NPC npc, boolean message) { + if (!hasEvent()) { + if (message) { + player.getPacketDispatch().sendMessage("They don't seem interested in talking to you."); + } + return false; + } + AntiMacroNPC n = (AntiMacroNPC) npc; + if (n.getEvent() != event) { + if (message) { + player.getPacketDispatch().sendMessage("They don't seem interested in talking to you."); + } + return false; + } + return true; + } + + /** + * Fires an anti-macro event. + * @param name The name of the event to start. + * @param args The arguments. + * @return {@code True} if the event has been fired. + */ + public boolean fireEvent(String name, Object... args) { + nextPulse = GameWorld.getTicks() + DELAY; + if(WildernessZone.isInZone(player)){ + return false; + } + if (hasEvent() || player.getZoneMonitor().isRestricted(ZoneRestriction.RANDOM_EVENTS) || player.isArtificial()) { + return false; + } + AntiMacroEvent event = EVENTS.get(name); + if (event == null) { + if (GameWorld.getSettings().isDevMode()) { + throw new IllegalArgumentException("Could not find event " + name + "!"); + } else { + return false; + } + } + event = event.create(player); + if (!event.start(player, false, args)) { + return false; + } + //resetTrigger(); + this.event = event; + return true; + } + + /** + * Fires an event. + * @param skillId The skill id, -1 for default events.. + * @param args The arguments. + * @return {@code True} if the event has been fired. + */ + public boolean fireEvent(int skillId, Object... args) { + nextPulse = DELAY + GameWorld.getTicks(); + if (hasEvent() || EVENTS.isEmpty() || player.getZoneMonitor().isRestricted(ZoneRestriction.RANDOM_EVENTS) || player.isArtificial()) { + return false; + } + event = getRandomEvent(skillId); + if (event != null) { + if ((event = event.create(player)).start(player, false, args)) { + if(event == null) return true; + System.out.println("Anti-Macro: Firing event " + event.getName() + " for player: " + player.getUsername()); + //resetTrigger(); + return true; + } + event = null; + } + return false; + } + + /** + * Gets an anti marco event. + * @param skillId the skillId. + * @return {@code AntiMacroEvent} the event. + */ + public AntiMacroEvent getRandomEvent(int skillId) { + int index = RandomFunction.random(EVENTS.size()); + int count = 0; + AntiMacroEvent event = null; + AntiMacroEvent[] events = EVENTS.values().toArray(new AntiMacroEvent[EVENTS.size()]); + while (!(event = events[index]).canFire(skillId)) { + if (count++ >= events.length) { + event = null; + break; + } + index = (index + 1) % events.length; + } + return event; + } + + /** + * Checks if the player has an anti-macro event running. + * @return {@code True} if so. + */ + public boolean hasEvent() { + return event != null && !event.isTerminated(); + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the event. + * @return The event. + */ + public AntiMacroEvent getEvent() { + return event; + } + + /** + * Sets the event. + * @param event The event to set. + */ + public void setEvent(AntiMacroEvent event) { + this.event = event; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/AntiMacroNPC.java b/Server/src/main/java/Server/core/game/content/ame/AntiMacroNPC.java new file mode 100644 index 000000000..42a73517c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/AntiMacroNPC.java @@ -0,0 +1,237 @@ +package core.game.content.ame; + +import core.game.interaction.MovementPulse; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Handles an anti macro npc. + * @author Vexia + */ +public abstract class AntiMacroNPC extends AbstractNPC { + + /** + * The player. + */ + protected final Player player; + + /** + * The anti macro event. + */ + protected final AntiMacroEvent event; + + /** + * The quotes the npc will say(null if none) + */ + private String[] quotes; + + /** + * The counter representing speech cycles. + */ + private int count; + + /** + * The time until the next speech. + */ + private int nextSpeech; + + /** + * If the players time is up. + */ + protected boolean timeUp; + + /** + * The end time. + */ + private int endTime; + + /** + * Constructs a new {@code AntiMacroNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param player the player. + */ + public AntiMacroNPC(int id, Location location, AntiMacroEvent event, Player player, String... quotes) { + super(id, location); + this.event = event; + this.player = player; + this.quotes = quotes; + this.endTime = (int) (GameWorld.getTicks() + (1000 / 0.6)); + } + + @Override + public void init() { + if (event == null) { + super.clear(); + return; + } + location = RegionManager.getSpawnLocation(player, this); + if (location == null) { + clear(); + event.terminate(); + return; + } + super.init(); + startFollowing(); + } + + @Override + public void handleTickActions() { + if (GameWorld.getTicks() > endTime) { + clear(); + } + if (!getLocks().isMovementLocked()) { + if (dialoguePlayer == null || !dialoguePlayer.isActive() || !dialoguePlayer.getInterfaceManager().hasChatbox()) { + dialoguePlayer = null; + } + } + if (!player.isActive() || !getLocation().withinDistance(player.getLocation(), 10)) { + handlePlayerLeave(); + } + if (!getPulseManager().hasPulseRunning()) { + startFollowing(); + } + if (quotes != null) { + if (nextSpeech < GameWorld.getTicks() && this.getDialoguePlayer() == null && !this.getLocks().isMovementLocked()) { + if (count > quotes.length - 1) { + return; + } + sendChat(quotes[count].replace("@name", player.getUsername()).replace("@gender", event.getGenderPrefix()).replace("@gL", event.getGenderPrefix().toLowerCase())); + nextSpeech = (int) (GameWorld.getTicks() + (20 / 0.5)); + if (++count >= quotes.length) { + setTimeUp(true); + handleTimeUp(); + return; + } + } + } + } + + /** + * Called when the player is gone. + */ + public void handlePlayerLeave() { + clear(); + } + + /** + * Called when the quotes are finished. + */ + public void handleTimeUp() { + teleport(); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity instanceof Player && entity != player) { + ((Player) entity).getPacketDispatch().sendMessage("It's not after you."); + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public void onRegionInactivity() { + super.onRegionInactivity(); + clear(); + } + + @Override + public void clear() { + super.clear(); + if (event != null) { + event.terminate(); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return null; + } + + /** + * Teleports the player away. + */ + public void teleport() { + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 1: + clear(); + player.getProperties().setTeleportLocation(AntiMacroEvent.getRandomLocation()); + break; + case 2: + player.unlock(); + event.noteItems(); + player.graphics(Graphics.create(86)); + return true; + } + return false; + } + }); + } + + /** + * Starts following the player. + */ + public void startFollowing() { + getPulseManager().run(new MovementPulse(this, player, Pathfinder.DUMB) { + @Override + public boolean pulse() { + return false; + } + }, "movement"); + face(player); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return super.newInstance(arg); + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the event. + * @return The event. + */ + public AntiMacroEvent getEvent() { + return event; + } + + /** + * Gets the timeUp. + * @return The timeUp. + */ + public boolean isTimeUp() { + return timeUp; + } + + /** + * Sets the timeUp. + * @param timeUp The timeUp to set. + */ + public void setTimeUp(boolean timeUp) { + this.timeUp = timeUp; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/ExperienceMonitor.java b/Server/src/main/java/Server/core/game/content/ame/ExperienceMonitor.java new file mode 100644 index 000000000..63943eac1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/ExperienceMonitor.java @@ -0,0 +1,50 @@ +package core.game.content.ame; + +/** + * Used to monitor experience gain. + * @author Emperor + */ +public final class ExperienceMonitor { + + /** + * The skill id. + */ + private final int skillId; + + /** + * The amount of experience gained since the last monitor pulse. + */ + private int experienceAmount; + + /** + * Constructs a new {@code ExperienceMonitor} {@code Object}. + * @param skillId The skill id. + */ + public ExperienceMonitor(int skillId) { + this.skillId = skillId; + } + + /** + * Gets the experienceAmount. + * @return The experienceAmount. + */ + public int getExperienceAmount() { + return experienceAmount; + } + + /** + * Sets the experienceAmount. + * @param experienceAmount The experienceAmount to set. + */ + public void setExperienceAmount(int experienceAmount) { + this.experienceAmount = experienceAmount; + } + + /** + * Gets the skillId. + * @return The skillId. + */ + public int getSkillId() { + return skillId; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyHandler.kt b/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyHandler.kt new file mode 100644 index 000000000..0e7095626 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyHandler.kt @@ -0,0 +1,46 @@ +package core.game.content.ame.events + +import core.game.component.Component +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.interaction.Option +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.world.GameWorld +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class SandwichLadyHandler : PluginInteraction(3117){ + override fun handle(player: Player?, npc: NPC?, option: Option?): Boolean { + class MoveTo : MovementPulse(player,DestinationFlag.ENTITY.getDestination(player,npc)){ + override fun pulse(): Boolean { + if(player?.antiMacroHandler?.hasEvent()!! && player.antiMacroHandler.event.name == "Sandwich Lady") { + player.interfaceManager?.open(Component(297)) + npc?.clear() + } else { + player.sendMessage("She isn't interested in you.") + } + return true + } + } + + if(option?.name?.toLowerCase() == "talk-to"){ + GameWorld.submit(MoveTo()) + return true + } + return false + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.NPC) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyInterface.kt b/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyInterface.kt new file mode 100644 index 000000000..9413feeae --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyInterface.kt @@ -0,0 +1,48 @@ +package core.game.content.ame.events + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +@Initializable +class SandwichLadyInterface : ComponentPlugin(){ + val baguette = Items.BAGUETTE_6961 + val triangle_sandwich = Items.TRIANGLE_SANDWICH_6962 + val sandwich = Items.SQUARE_SANDWICH_6965 + val roll = Items.ROLL_6963 + val pie = Items.MEAT_PIE_2327 + val kebab = Items.KEBAB_1971 + val chocobar = Items.CHOCOLATE_BAR_1973 + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + var item = Item(0) + when(button) { + 7 -> {item = Item(baguette)} + 8 -> {item = Item(triangle_sandwich)} + 9 -> {item = Item(sandwich)} + 10 -> {item = Item(roll)} + 11 -> {item = Item(pie)} + 12 -> {item = Item(kebab)} + 13 -> {item = Item(chocobar)} + } + if(item.id != 0){ + player?.let { if(it.inventory.add(item)) else GroundItemManager.create(item,it) } + player?.interfaceManager?.close() + player?.antiMacroHandler?.event?.terminate() + return true + } + return false + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(297,this) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyNPC.kt b/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyNPC.kt new file mode 100644 index 000000000..1fe55e010 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/SandwichLadyNPC.kt @@ -0,0 +1,89 @@ +package core.game.content.ame.events + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.entity.npc.AbstractNPC +import core.game.node.entity.player.Player +import core.game.world.map.Location +import core.plugin.Initializable +import core.tools.RandomFunction +import core.game.content.ame.AntiMacroEvent +import core.game.content.ame.AntiMacroHandler +import java.nio.ByteBuffer + +@Initializable +class SandwichLadyEvent : AntiMacroEvent("Sandwich Lady",false,false, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23){ + override fun parse(buffer: ByteBuffer?) { + } + + override fun start(player: Player?, login: Boolean, vararg args: Any?): Boolean { + super.init(player) + val location = Location.getRandomLocation(player?.location,6,true) + val npc = SandwichLadyNPC(location,player) + npc.init() + if(location == player?.location) + npc.moveStep() + return true + } + + override fun save(buffer: ByteBuffer?) { + } + + override fun configure() { + } + + override fun create(player: Player?): AntiMacroEvent { + val event = SandwichLadyEvent() + event.player = player + return event + } + + override fun getSpawnLocation(): Location { + return Location(0,0,0) + } + + override fun newInstance(player: Player?): AntiMacroEvent { + AntiMacroHandler.register(this) + return super.newInstance(player) + } + + class SandwichLadyNPC(loc: Location, var player: Player?) : AbstractNPC(3117,loc){ + val QUOTES = arrayListOf("Hello ${player?.username}, are you there?","Sandwiches, ${player?.username}!","Are you ignoring me?","I have sandwiches for you.","${player?.username}? Can you hear me?") + override fun init() { + super.init() + } + + override fun handleTickActions() { + if(player == null || player?.isActive == false || player?.location?.withinDistance(this.location) == false){ + onRegionInactivity() + } + if(RandomFunction.random(20) == 3){ + sendChat(QUOTES.random()) + } + class followPulse(val p: Player?) : MovementPulse(this,p,DestinationFlag.ENTITY){ + override fun pulse(): Boolean { + face(p) + return true + } + } + if(!pulseManager.hasPulseRunning()) { + pulseManager.run(followPulse(player)) + } + super.handleTickActions() + } + + override fun getIds(): IntArray { + return intArrayOf(3117) + } + + override fun onRegionInactivity() { + super.onRegionInactivity() + clear() + } + + override fun construct(id: Int, location: Location?, vararg objects: Any?): AbstractNPC { + return SandwichLadyNPC(location!!,player) + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/events/drilldemon/DrillDemonEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/drilldemon/DrillDemonEvent.java new file mode 100644 index 000000000..806407cfa --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/drilldemon/DrillDemonEvent.java @@ -0,0 +1,113 @@ +package core.game.content.ame.events.drilldemon; + +import java.nio.ByteBuffer; + +import core.game.content.ame.AntiMacroEvent; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Graphics; +import core.plugin.PluginManager; + +/** + * Handles the drill demon event. + * @author Vexia + */ +public final class DrillDemonEvent extends AntiMacroEvent { + + /** + * Constructs a new {@code DrillDemonEvent} {@code Object}. + */ + public DrillDemonEvent() { + this(null); + } + + /** + * Constructs a new {@code DrillDemonEvent} {@code Object}. + */ + public DrillDemonEvent(Player player) { + super("drill demon", false, false); + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + if (login) { + return true; + } + final NPC sergeant = NPC.create(2790, player.getLocation()); + if (!initSergeant(sergeant)) { + return false; + } + player.lock(4); + sergeant.lock(4); + sergeant.face(player); + player.graphics(Graphics.create(86), 3); + sergeant.sendChat("Private " + player.getUsername() + "! Get yourself to the parade ground ASAP!"); + GameWorld.getPulser().submit(new Pulse(3, player, sergeant) { + @Override + public boolean pulse() { + return true; + } + }); + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + return new DrillDemonEvent(player); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + return super.interact(e, target, option); + } + + /** + * Initializes the sergeant (temporary). + * @param sergeant the sergeant. + * @return {@code True} if so. + */ + private boolean initSergeant(NPC sergeant) { + final Location start = RegionManager.getSpawnLocation(player, sergeant); + if (start == null) { + terminate(); + return false; + } + sergeant.setLocation(start); + sergeant.init(); + return true; + } + + @Override + public void register() { + PluginManager.definePlugin(new SergeantDamienNPC()); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/drilldemon/SergeantDamienNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/drilldemon/SergeantDamienNPC.java new file mode 100644 index 000000000..147cca5f0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/drilldemon/SergeantDamienNPC.java @@ -0,0 +1,67 @@ +package core.game.content.ame.events.drilldemon; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Handles the sergeant damien npc. + * @author Vexia + */ +public final class SergeantDamienNPC extends AbstractNPC { + + /** + * The default spawn. + */ + private static final Location DEFAULT_SPAWN = Location.create(3163, 4818, 0); + + /** + * The movement path. + */ + private static final Location[] MOVEMENT_PATH = new Location[] { Location.create(3163, 4818, 0), Location.create(3162, 4818, 0), Location.create(3161, 4818, 0), Location.create(3160, 4818, 0), Location.create(3159, 4818, 0), Location.create(3159, 4819, 0), Location.create(3159, 4820, 0), Location.create(3159, 4821, 0), Location.create(3159, 4822, 0), Location.create(3160, 4822, 0), Location.create(3161, 4822, 0), Location.create(3162, 4822, 0), Location.create(3163, 4822, 0), Location.create(3164, 4822, 0), Location.create(3165, 4822, 0), Location.create(3166, 4822, 0), Location.create(3167, 4822, 0), Location.create(3167, 4821, 0), Location.create(3167, 4820, 0), Location.create(3167, 4819, 0), Location.create(3167, 4818, 0), Location.create(3166, 4818, 0), Location.create(3165, 4818, 0), Location.create(3164, 4818, 0) }; + + /** + * Constructs a new {@code SergeantDamienNPC} {@code Object}. + */ + public SergeantDamienNPC() { + super(2790, DEFAULT_SPAWN); + } + + /** + * Constructs a new {@code SergeantDamienNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public SergeantDamienNPC(int id, Location location) { + super(id, location); + } + + @Override + public void configure() { + super.configure(); + setWalks(true); + if (isWalks()) { + configureMovementPath(MOVEMENT_PATH); + } + } + + @Override + public void setNextWalk() { + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SergeantDamienNPC(id, location); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + init(); + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return new int[] { 2790 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/drunkdwarf/DrunkDwarfEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/drunkdwarf/DrunkDwarfEvent.java new file mode 100644 index 000000000..f4e043a95 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/drunkdwarf/DrunkDwarfEvent.java @@ -0,0 +1,127 @@ +package core.game.content.ame.events.drunkdwarf; + +import java.nio.ByteBuffer; + +import core.game.content.ame.AntiMacroDialogue; +import core.game.content.ame.AntiMacroEvent; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the drunken dward anti macro event. + * @author Vexia + */ +@Initializable +public final class DrunkDwarfEvent extends AntiMacroEvent { + + /** + * The name of the drunken dwarf event. + */ + public static final String NAME = "drunk dwarf"; + + /** + * Constructs a new {@code DrunkDwarfEvent} {@code Object}. + */ + public DrunkDwarfEvent() { + super(NAME, true, false); + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + final DrunkenDwarfNPC dwarf = new DrunkenDwarfNPC(956, player.getLocation(), this, player); + dwarf.init(); + super.init(player); + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + DrunkDwarfEvent event = new DrunkDwarfEvent(); + event.player = player; + return event; + } + + @Override + public void register() { + PluginManager.definePlugin(new DrunkDwarfDialogue()); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + + } + + /** + * Handles the drunk dwarf dialogue. + * @author Vexia + */ + public final class DrunkDwarfDialogue extends AntiMacroDialogue { + + /** + * Constructs a new {@code DrunkDwarfDialogue} {@code Object}. + */ + public DrunkDwarfDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DrunkDwarfDialogue} {@code Object}. + * @param player the player. + */ + public DrunkDwarfDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DrunkDwarfDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (super.open(args)) { + player.getDialogueInterpreter().sendDialogues(npc, FacialExpression.OLD_NORMAL, "I 'new it were you matey! 'Ere, have some ob the good", "stuff!"); + } else { + return true; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + wave(Animation.create(105)); + player.getInventory().add(new Item(1917), player); + player.getInventory().add(new Item(1971), player); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 956 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/drunkdwarf/DrunkenDwarfNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/drunkdwarf/DrunkenDwarfNPC.java new file mode 100644 index 000000000..23c15142f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/drunkdwarf/DrunkenDwarfNPC.java @@ -0,0 +1,67 @@ +package core.game.content.ame.events.drunkdwarf; + +import core.game.content.ame.AntiMacroEvent; +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.map.Location; + +/** + * Handles the drunken dwarf npc. + * @author Vexia + */ +public final class DrunkenDwarfNPC extends AntiMacroNPC { + + /** + * The quotes that the dwarf will say. + */ + private static final String[] QUOTES = new String[] { "'Ere, matey, 'ave some 'o the good stuff.", "Dun ignore your matey!", "I hates you @name!", "Aww comeon, talk to ikle me @name!" }; + + /** + * Constructs a new {@code DrunkenDwarfNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param event + * @param player + */ + public DrunkenDwarfNPC(int id, Location location, AntiMacroEvent event, Player player) { + super(id, location, event, player, QUOTES); + } + + @Override + public void init() { + super.init(); + player.getAudioManager().send(new Audio(344)); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (timeUp && getDialoguePlayer() == null) { + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + } + + @Override + public void handleTimeUp() { + } + + @Override + public boolean isIgnoreAttackRestrictions(Entity victim) { + return true; + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public int[] getIds() { + return new int[] { 956 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/evilchicken/EvilChickenNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/evilchicken/EvilChickenNPC.java new file mode 100644 index 000000000..79c00ef0c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/evilchicken/EvilChickenNPC.java @@ -0,0 +1,140 @@ +package core.game.content.ame.events.evilchicken; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.handlers.MagicSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Handles the evil chicken NPC. + * @author Emperor + */ +public final class EvilChickenNPC extends AbstractNPC { + + /** + * The messages the evil chicken can use. + */ + private static final String[] MESSAGES = { "Bwuk", "Bwuk bwuk bwuk", "Bwaaaaaauk bwuk bwuk", "How dare you invade my lair?", "MUAHAHAHAHAAA!", "Flee from me, @name@!", "Begone, @name@!" }; + + /** + * The player. + */ + protected Player player; + + /** + * The random event instance. + */ + public EvilChickenRandomEvent event; + + /** + * The combat swing handler. + */ + private static final CombatSwingHandler HANDLER = new MagicSwingHandler() { + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + entity.sendChat(RandomFunction.getRandomElement(MESSAGES).replace("@name@", victim.getUsername())); + return super.swing(entity, victim, state); + } + }; + + /** + * Constructs a new {@code EvilChickenNPC} {@code Object}. + */ + public EvilChickenNPC() { + this(2463, null); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + GroundItemManager.create(new GroundItem(new Item(526), getLocation(), killer.asPlayer())); + GroundItemManager.create(new GroundItem(new Item(2138), getLocation(), killer.asPlayer())); + GroundItemManager.create(new GroundItem(new Item(314, RandomFunction.random(32, 750)), getLocation(), killer.asPlayer())); + } + } + + /** + * Constructs a new {@code EvilChickenNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public EvilChickenNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.init(); + setRespawn(false); + graphics(Graphics.create(86)); + getProperties().getCombatPulse().attack(player); + } + + @Override + public void handleTickActions() { + if (player == null) { + return; + } + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + if (!player.isActive() || !getLocation().withinDistance(player.getLocation(), 10)) { + clear(); + } + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return HANDLER; + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity instanceof Player && entity != player) { + ((Player) entity).getPacketDispatch().sendMessage("It's not after you."); + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public void onRegionInactivity() { + super.onRegionInactivity(); + clear(); + } + + @Override + public void clear() { + super.clear(); + if (event != null) { + event.terminate(); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new EvilChickenNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 2463, 2464, 2465, 2466, 2467, 2468 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/events/evilchicken/EvilChickenRandomEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/evilchicken/EvilChickenRandomEvent.java new file mode 100644 index 000000000..7864cc2ad --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/evilchicken/EvilChickenRandomEvent.java @@ -0,0 +1,89 @@ +package core.game.content.ame.events.evilchicken; + +import java.nio.ByteBuffer; + +import core.game.content.ame.AntiMacroEvent; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the evil chicken random event. + * @author Emperor + */ +@Initializable +public final class EvilChickenRandomEvent extends AntiMacroEvent { + + /** + * Constructs a new {@code EvilChickenRandomEvent} {@code Object}. + */ + public EvilChickenRandomEvent() { + super("chicken", true, false); + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + super.init(player); + int level = player.getProperties().getCurrentCombatLevel(); + int npcId = 2468; + if (level < 11) { + npcId = 2463; + } else if (level < 21) { + npcId = 2464; + } else if (level < 41) { + npcId = 2465; + } else if (level < 61) { + npcId = 2466; + } else if (level < 91) { + npcId = 2467; + } + Location location = Location.getRandomLocation(player.getLocation(), 6, true); + EvilChickenNPC npc = new EvilChickenNPC(npcId, location); + npc.player = player; + npc.event = this; + npc.init(); + if (location == player.getLocation()) { + npc.moveStep(); + } + HintIconManager.registerHintIcon(player, npc); + return true; + } + + @Override + public void terminate() { + super.terminate(); + if (player != null) { + player.getHintIconManager().clear(); + } + } + + @Override + public AntiMacroEvent create(Player player) { + EvilChickenRandomEvent event = new EvilChickenRandomEvent(); + event.player = player; + return event; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + PluginManager.definePlugin(new EvilChickenNPC()); + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent.java new file mode 100644 index 000000000..44f873bec --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/eviltwin/EvilTwinRandomEvent.java @@ -0,0 +1,503 @@ +package core.game.content.ame.events.eviltwin; + +import java.nio.ByteBuffer; + +import core.ServerConstants; +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.content.ame.AntiMacroEvent; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the evil twin random event. + * @author Emperor + */ +public final class EvilTwinRandomEvent extends AntiMacroEvent { + + /** + * The x-offset. + */ + private int offsetX = 0; + + /** + * The y-offset. + */ + private int offsetY = 0; + + /** + * The Molly NPC. + */ + private NPC molly; + + /** + * The current crane object. + */ + private GameObject currentCrane; + + /** + * The amount of tries left. + */ + private int tries = 3; + + /** + * If the event has been completed. + */ + private boolean success; + + /** + * The crane NPC. + */ + private NPC craneNPC; + + /** + * Constructs a new {@code EvilTwinRandomEvent} {@code Object}. + */ + public EvilTwinRandomEvent() { + this(null); + } + + /** + * Constructs a new {@code EvilTwinRandomEvent} {@code Object}. + * @param player The player. + */ + public EvilTwinRandomEvent(Player player) { + super("Evil twin", true, true); + super.player = player; + } + + @Override + public void register() { + PluginManager.definePlugin(new MollyDialogue()); + } + + @Override + public boolean start(final Player player, boolean login, Object... args) { + region = DynamicRegion.create(7504); + region.setMusicId(612); + registerRegion(region.getId()); + currentCrane = new GameObject(14976, region.getBaseLocation().transform(14, 12, 0), 10, 0); + if (login) { + int hash = player.getAttribute("ame:evil_twin", 0); + molly = NPC.create(getMollyId(hash), region.getBaseLocation().transform(4, 15, 0)); + molly.init(); + spawnSuspects(hash); + toggleVisibleNPCs(player.getLocation().getLocalX() < 9); + player.getProperties().setTeleportLocation(region.getBaseLocation().transform(offsetX, offsetY, 0)); + return true; + } + TwinClothColor color = RandomFunction.getRandomElement(TwinClothColor.values()); + int model = RandomFunction.random(5); + final int hash = color.ordinal() | (model << 16); + player.setAttribute("ame:evil_twin", hash); + int npcId = getMollyId(hash); + molly = NPC.create(npcId, Location.getRandomLocation(player.getLocation(), 2, true)); + molly.init(); + molly.graphics(Graphics.create(86, 96)); + molly.sendChat("I need your help, " + player.getUsername() + "."); + molly.face(player); + player.lock(4); + player.setAttribute("ame:location", player.getLocation()); + GameWorld.getPulser().submit(new Pulse(3) { + @Override + public boolean pulse() { + teleport(player, molly, hash); + return true; + } + }); + return true; + } + + @Override + public boolean enter(Entity entity) { + if (entity instanceof Player) { + ((Player) entity).getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 11, 12); + } + return super.enter(entity); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e == player) { + if (!logout) { + terminate(); + } + player.removeAttribute("ame:evil_twin:ccx"); + player.removeAttribute("ame:evil_twin:ccy"); + } + return super.leave(e, logout); + } + + @Override + public void terminate() { + super.terminate(); + craneNPC = null; + if (player != null) { + player.getInterfaceManager().restoreTabs(); + player.removeAttribute("ame:location"); + player.removeAttribute("ame:evil_twin_info"); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 0, 0)); + } + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof GameObject) { + GameObject object = (GameObject) target; + switch (object.getId()) { + case 14982: + if (e.getLocation().getLocalX() < 9 && !e.getAttribute("ame:evil_twin_info", false)) { + player.getDialogueInterpreter().open("ame:molly", molly, 3); + return true; + } + DoorActionHandler.handleAutowalkDoor(e, object); + return true; + case 14978: + if (success) { + player.getPacketDispatch().sendMessage("You already caught the evil twin."); + return true; + } + player.getInterfaceManager().openSingleTab(new Component(240).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + ObjectBuilder.remove(currentCrane); + ObjectBuilder.add(new GameObject(66, currentCrane.getLocation(), 22, 0)); + currentCrane = currentCrane.transform(currentCrane.getId(), currentCrane.getRotation(), region.getBaseLocation().transform(14, 12, 0)); + ObjectBuilder.add(new GameObject(14977, currentCrane.getLocation(), 22, 0)); + ObjectBuilder.add(currentCrane); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 0, 0)); + return true; + } + })); + player.getPacketDispatch().sendString("Tries: " + tries, 240, 27); + updateCraneCam(14, 12); + return true; + } + } else if (target instanceof NPC) { + NPC npc = (NPC) target; + if ((tries < 1 || success) && npc.getId() >= 3892 && npc.getId() <= 3911) { + player.getDialogueInterpreter().open("ame:molly", npc, success ? 2 : 1); + return true; + } + } + return false; + } + + @Override + public boolean actionButton(final Player player, int interfaceId, int buttonId, int slot, int itemId, int opcode) { + if (success) { + return false; + } + switch (interfaceId) { + case 240: + switch (buttonId) { + case 28: + player.lock(5); + player.getLocks().lockComponent(5); + success = false; + for (final NPC npc : region.getPlanes()[0].getNpcs()) { + if (npc.getLocation().equals(currentCrane.getLocation())) { + final boolean evilTwin = isEvilTwin(npc, player.getAttribute("ame:evil_twin", 0)); + if (evilTwin) { + success = true; + player.getPacketDispatch().sendMessage("You caught the Evil twin!"); + } else { + player.getPacketDispatch().sendMessage("You caught an innocent civilian!"); + } + npc.animate(Animation.create(4001)); + npc.lock(10); + player.lock(10); + player.getLocks().lockComponent(15); + updateCraneCam(10, 4); + GameWorld.getPulser().submit(new Pulse(5, player) { + int cycle = 0; + + @Override + public boolean pulse() { + switch (cycle++) { + case 0: + ObjectBuilder.remove(currentCrane); + ObjectBuilder.add(new GameObject(66, currentCrane.getLocation(), 22, 0)); + npc.transform(npc.getId() + 20); + npc.lock(20); + npc.getWalkingQueue().reset(); + npc.getWalkingQueue().addPath(region.getBaseLocation().getX() + 10, region.getBaseLocation().getY() + 4); + setDelay(npc.getWalkingQueue().getQueue().size() + 1); + craneNPC = npc; + break; + case 1: + craneNPC = null; + npc.animate(Animation.create(4003)); + setDelay(3); + break; + case 2: + npc.reTransform(); + npc.faceLocation(player.getLocation()); + if (evilTwin) { + removeSuspects(); + npc.getAnimator().forceAnimation(Animation.create(859)); + } else { + npc.sendChat("You're putting me in prison?!"); + } + currentCrane = currentCrane.transform(currentCrane.getId(), currentCrane.getRotation(), region.getBaseLocation().transform(14, 12, 0)); + ObjectBuilder.add(new GameObject(14977, currentCrane.getLocation(), 22, 0)); + ObjectBuilder.add(currentCrane); + break; + case 3: + updateCraneCam(14, 12); + if (evilTwin) { + player.getInterfaceManager().closeSingleTab(); + player.getDialogueInterpreter().open("ame:molly", molly, 0); + } else { + decreaseTries(); + } + return true; + } + return false; + } + }); + player.getPacketDispatch().sendObjectAnimation(currentCrane, Animation.create(4000)); + return true; + } + } + decreaseTries(); + player.getPacketDispatch().sendObjectAnimation(currentCrane, Animation.create(4000)); + return true; + case 29: + moveCrane(Direction.SOUTH); + return true; + case 30: + moveCrane(Direction.NORTH); + return true; + case 31: + moveCrane(Direction.EAST); + return true; + case 32: + moveCrane(Direction.WEST); + return true; + case 34: + player.getInterfaceManager().closeSingleTab(); + return true; + } + break; + } + return false; + } + + /** + * Decreases the tries amount. + */ + public void decreaseTries() { + tries--; + player.getPacketDispatch().sendString("Tries: " + tries, 240, 27); + if (tries < 1) { + player.lock(20); + player.getInterfaceManager().closeSingleTab(); + player.getDialogueInterpreter().open("ame:molly", molly, 1); + } + } + + @Override + public void locationUpdate(Entity e, Location last) { + if (e == craneNPC && e.getWalkingQueue().getQueue().size() > 1 && player.getInterfaceManager().getSingleTab() != null) { + Location l = e.getLocation(); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, l.getX() + 2, l.getY() + 3, 650, 1, 5)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, l.getX() - 3, l.getY() - 3, 420, 1, 5)); + } else if (e == player) { + if (molly.isInvisible() && e.getLocation().getLocalX() < 9) { + toggleVisibleNPCs(true); + } else if (!molly.isInvisible() && e.getLocation().getLocalX() > 8) { + toggleVisibleNPCs(false); + } + } + super.locationUpdate(e, last); + } + + /** + * Toggles the visibility of the NPCs. + * @param showMolly If molly should be shown. + */ + public void toggleVisibleNPCs(boolean showMolly) { + for (NPC npc : region.getPlanes()[0].getNpcs()) { + if (npc.getId() >= 3852 && npc.getId() <= 3891) { + npc.setInvisible(showMolly); + } + } + molly.setInvisible(!showMolly); + } + + /** + * Method used to handle the camera. + * @param x the x offset. + * @param y the y offset. + * @Param height the height. + */ + private void updateCraneCam(int x, int y) { + if (player.getInterfaceManager().getSingleTab() != null) { + Location loc = region.getBaseLocation().transform(14, 20, 0); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, loc.getX(), loc.getY(), 650, 1, 100)); + loc = region.getBaseLocation().transform(x, 4 + y - (x < 14 || x > 14 ? (y / 4) : 0), 0); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, loc.getX(), loc.getY(), 420, 1, 100)); + } + player.setAttribute("ame:evil_twin:ccx", x); + player.setAttribute("ame:evil_twin:ccy", y); + } + + /** + * Removes the suspects. + */ + public void removeSuspects() { + int hash = player.getAttribute("ame:evil_twin", 0); + for (final NPC npc : region.getPlanes()[0].getNpcs()) { + if (npc.getId() >= 3852 && npc.getId() <= 3891 && !isEvilTwin(npc, hash)) { + Graphics.send(Graphics.create(86), npc.getLocation()); + npc.clear(); + } + } + } + + /** + * Checks if the NPC is the evil twin NPC. + * @param npc The NPC. + * @return {@code True} if so. + */ + private boolean isEvilTwin(NPC npc, int hash) { + int npcId = npc.getId() - 3852; + int type = npcId / TwinClothColor.values().length; + int color = npcId - (type * TwinClothColor.values().length); + return hash == (color | (type << 16)); + } + + /** + * Moves the crane. + * @param direction The current direction. + */ + private void moveCrane(final Direction direction) { + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + if (!direction.canMove(currentCrane.getLocation().transform(direction))) { + return true; + } + int craneX = player.getAttribute("ame:evil_twin:ccx", 14) + direction.getStepX(); + int craneY = player.getAttribute("ame:evil_twin:ccy", 12) + direction.getStepY(); + updateCraneCam(craneX, craneY); + ObjectBuilder.remove(currentCrane); + ObjectBuilder.add(new GameObject(66, currentCrane.getLocation(), 22, 0)); + currentCrane = currentCrane.transform(currentCrane.getId(), currentCrane.getRotation(), region.getBaseLocation().transform(craneX, craneY, 0)); + ObjectBuilder.add(new GameObject(14977, currentCrane.getLocation(), 22, 0)); + ObjectBuilder.add(currentCrane); + return true; + } + }); + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (type != -1) { + if (e instanceof Player) { + ((Player) e).getPacketDispatch().sendMessage("You can't teleport away from here."); + } + return false; + } + return true; + } + + /** + * Spawns the suspects. + * @param hash The color & type. + */ + public void spawnSuspects(int hash) { + if (region.getPlanes()[0].getNpcs().size() > 3) { + return; + } + int npcId = 3852 + (hash & 0xFF); + for (int i = 0; i < 5; i++) { + Location location = region.getBaseLocation().transform(11 + RandomFunction.random(8), 6 + RandomFunction.random(6), 0); + NPC suspect = NPC.create(npcId + (i * TwinClothColor.values().length), location); + suspect.setWalks(true); + suspect.setWalkRadius(6); + suspect.init(); + } + } + + /** + * Teleports the player and Molly to the random event region. + * @param player The player. + * @param npc The NPC. + */ + public void teleport(Player player, NPC npc, int hash) { + npc.getProperties().setTeleportLocation(region.getBaseLocation().transform(4, 15, 0)); + player.getProperties().setTeleportLocation(region.getBaseLocation().transform(4, 16, 0)); + player.getDialogueInterpreter().open(npc.getId(), npc); + spawnSuspects(hash); + toggleVisibleNPCs(true); + } + + /** + * Gets the current NPC id for Molly. + * @return The NPC id. + */ + public static int getMollyId(int hash) { + return 3892 + (hash & 0xFF) + (((hash >> 16) & 0xFF) * TwinClothColor.values().length); + } + + @Override + public void save(ByteBuffer buffer) { + int offset = player.getAttribute("ame:evil_twin", 0); + buffer.put((byte) (offset & 0xFF)); + buffer.put((byte) ((offset >> 16) & 0xFF)); + buffer.put((byte) (player.getLocation().getX() - region.getBaseLocation().getX())); + buffer.put((byte) (player.getLocation().getY() - region.getBaseLocation().getY())); + buffer.put((byte) tries); + Location loc = player.getAttribute("ame:location", ServerConstants.HOME_LOCATION); + buffer.putShort((short) loc.getX()); + buffer.putShort((short) loc.getY()); + buffer.put((byte) loc.getZ()); + buffer.put((byte) (success ? 1 : 0)); + } + + @Override + public void parse(ByteBuffer buffer) { + player.setAttribute("ame:evil_twin", (buffer.get() & 0xFF) | ((buffer.get() & 0xFF) << 16)); + offsetX = buffer.get() & 0xFF; + offsetY = buffer.get() & 0xFF; + tries = buffer.get() & 0xFF; + player.setAttribute("ame:location", Location.create(buffer.getShort(), buffer.getShort(), buffer.get())); + success = (buffer.get() & 0xFF) == 1; + } + + @Override + public AntiMacroEvent create(Player player) { + return new EvilTwinRandomEvent(player); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/events/eviltwin/MollyDialogue.java b/Server/src/main/java/Server/core/game/content/ame/events/eviltwin/MollyDialogue.java new file mode 100644 index 000000000..8a6b65b4a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/eviltwin/MollyDialogue.java @@ -0,0 +1,156 @@ +package core.game.content.ame.events.eviltwin; + +import core.game.content.ame.AntiMacroEvent; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.script.ScriptContext; +import core.game.system.script.ScriptManager; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Handles Molly's dialogue. + * @author Emperor + */ +public final class MollyDialogue extends DialoguePlugin { + + /** + * The possible rewards. + */ + private static final Item[] REWARDS = { new Item(1618, 2), new Item(1620, 3), new Item(1622, 3), new Item(1624, 4), }; + + /** + * If the player successfully caught the evil twin. + */ + private int type; + + /** + * Constructs a new {@code MollyDialogue} {@code Object}. + */ + public MollyDialogue() { + super(); + } + + /** + * Constructs a new {@code MollyDialogue} {@code Object}. + * @param player The player. + */ + public MollyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MollyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + type = (Integer) args[1]; + if (type == 0) { + player.getPacketDispatch().sendMessage("Congratulations! You caught the evil twin!"); + npc("Well done! You managed to catch my sister!"); + } else if (type == 1) { + npc("Such incompetence! I should never have asked a", "baboon like you to do a complex task like this!", "Get out of my sight!"); + } else if (type == 2) { + player("Well, I've managed to get her into the cage."); + } else if (type == 3) { + npc("Wait! Do you know what you're doing here?"); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage++) { + case 0: + switch (type) { + case 0: + npc("Come next door and talk to me."); + return true; + case 1: + player("Err, sorry. I seem to have messed it up a little."); + return true; + case 2: + npc("Fantastic! For so many years I've had to put up with", "her and now she's locked up for good."); + return true; + case 3: + options("Yes, I know.", "Erm, no I don't actually."); + return true; + } + break; + case 1: + switch (type) { + case 0: + end(); + return true; + case 1: + player.getTeleporter().send(AntiMacroEvent.getRandomLocation(), TeleportType.NORMAL, -1); + end(); + return true; + case 2: + npc("Thank you for all your help. Take this as a reward."); + return true; + case 3: + switch (buttonId) { + case 1: + player.setAttribute("/save:ame:evil_twin_info", true); + player("Yes, I know, I've been here before."); + stage = 10; + return true; + case 2: + stage = 20; + player("Erm, no I don't actually."); + return true; + } + break; + } + break; + case 2: + switch (type) { + case 2: + end(); + Location destination = player.getAttribute("ame:location"); + if (destination != null) { + Item item = RandomFunction.getRandomElement(REWARDS); + if (player.getInventory().hasSpaceFor(item)) { + player.getInventory().add(item); + } else { + GroundItemManager.create(item, destination, player); + } + player.getDialogueInterpreter().sendItemMessage(item, "Molly's given you " + item.getAmount() + " " + item.getName().toLowerCase() + "s."); + player.getProperties().setTeleportLocation(destination); + player.removeAttribute("ame:location"); + } + return true; + } + break; + case 10: + npc("Good luck!"); + break; + case 11: + end(); + break; + case 20: + end(); + ScriptContext script = DialogueInterpreter.getScript(npc.getId()); + if (script != null && (script = ScriptManager.getMethod(script, "event_info")) != null) { + player.getDialogueInterpreter().startScript(npc.getId(), script, player, npc); + } + break; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("ame:molly") }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/events/eviltwin/TwinClothColor.java b/Server/src/main/java/Server/core/game/content/ame/events/eviltwin/TwinClothColor.java new file mode 100644 index 000000000..de608aeb5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/eviltwin/TwinClothColor.java @@ -0,0 +1,10 @@ +package core.game.content.ame.events.eviltwin; + +/** + * The clothing colors. + * @author Emperor + */ +public enum TwinClothColor { + + RED, GREEN, BLUE, YELLOW; +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/events/genie/GenieNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/genie/GenieNPC.java new file mode 100644 index 000000000..e216c5358 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/genie/GenieNPC.java @@ -0,0 +1,48 @@ +package core.game.content.ame.events.genie; + +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles the random event genie npc. + * @author Vexia + */ +public final class GenieNPC extends AntiMacroNPC { + + /** + * The force chats to pronounce. + */ + private static final String[] CHATS = new String[] { "Greetings, @gL @name!", "Ehem... @gender @name?", "Are you there, @gL @name?", "No one ignores me!" }; + + /** + * Constructs a new {@code GenieNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param event the event. + * @param player the player. + */ + public GenieNPC(int id, Location location, GenieRandomEvent event, Player player) { + super(id, location, event, player, CHATS); + } + + /** + * Constructs a new {@code GenieNPC} {@code Object}. + */ + public GenieNPC() { + super(0, null, null, null); + } + + @Override + public void init() { + super.init(); + graphics(new Graphics(86)); + } + + @Override + public int[] getIds() { + return new int[] { 409 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/genie/GenieRandomEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/genie/GenieRandomEvent.java new file mode 100644 index 000000000..d4bda6ef8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/genie/GenieRandomEvent.java @@ -0,0 +1,135 @@ +package core.game.content.ame.events.genie; + +import java.nio.ByteBuffer; + +import core.game.content.ame.AntiMacroDialogue; +import core.game.content.ame.AntiMacroEvent; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.PluginManager; + +/** + * Handles the genie random event. + * @author Vexia + */ +@Initializable +public final class GenieRandomEvent extends AntiMacroEvent { + + /** + * The lamp item. + */ + private static final Item LAMP = new Item(2528); + + /** + * Constructs a new {@code GenieRandomEvent} {@code Object}. + */ + public GenieRandomEvent() { + super("Genie", true, false); + } + + @Override + public void save(ByteBuffer buffer) { + } + + @Override + public void parse(ByteBuffer buffer) { + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + if (player.hasItem(new Item(2528))) { + return false; + } + super.init(player); + final GenieNPC npc = new GenieNPC(409, player.getLocation(), this, player); + npc.init(); + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + final GenieRandomEvent event = new GenieRandomEvent(); + event.player = player; + return event; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + } + + @Override + public void register() { + PluginManager.definePlugin(new GenieDialogue()); + } + + @Override + public String getGenderPrefix(boolean male) { + return male ? "Master" : "Mistress"; + } + + /** + * Handles the dialogue used for the genie npc. + * @author Vexia + */ + public final class GenieDialogue extends AntiMacroDialogue { + + /** + * Constructs a new {@code GenieDialogue} {@code Object}. + */ + public GenieDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GenieDialogue} {@code Object}. + * @param player the player. + */ + public GenieDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GenieDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (super.open(args)) { + npc("Ah, so you are there " + player.getAntiMacroHandler().getEvent().getGenderPrefix().toLowerCase() + ". I'm so glad you", "summoned me. Please take this lamp and make your", "wish!"); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("I hope you're happy with your wish. I must be leaving", "now, though."); + stage++; + break; + case 1: + wave(); + player.getInventory().add(LAMP, player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 409 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/lostandfound/LostFoundRandomEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/lostandfound/LostFoundRandomEvent.java new file mode 100644 index 000000000..8e2e0de3a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/lostandfound/LostFoundRandomEvent.java @@ -0,0 +1,210 @@ +package core.game.content.ame.events.lostandfound; + +import java.nio.ByteBuffer; + +import core.ServerConstants; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.ame.AntiMacroEvent; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the "Lost and found" random event. + * @author Emperor + */ +public final class LostFoundRandomEvent extends AntiMacroEvent { + + /** + * Constructs a new {@code LostFoundRandomEvent} {@code Object}. + */ + public LostFoundRandomEvent() { + this(null); + } + + /** + * Constructs a new {@code LostFoundRandomEvent} {@code Object}. + * @param player The player. + */ + public LostFoundRandomEvent(Player player) { + super("landf", false, true, -1); + super.player = player; + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + player.getProperties().setTeleportLocation(Location.create(2338, 4747, 0)); + if (player.getAttribute("l&f_dest") == null) { + player.setAttribute("l&f_dest", args.length > 0 ? args[0] : player.getLocation()); + } + player.sendChat("Uh? Help!"); + return true; + } + + @Override + public boolean enter(Entity entity) { + if (entity instanceof Player) { + Player player = (Player) entity; + setRandomAppendage(player); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getDialogueInterpreter().sendPlainMessage(false, "There has been a fault in the teleportation matrix. Please operate the", "odd appendage out to be forwarded to your destination."); + } + return super.enter(entity); + } + + @Override + public boolean leave(Entity entity, boolean logout) { + if (entity instanceof Player && !logout) { + Player player = (Player) entity; + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.removeAttribute("l&f_dest"); + player.removeAttribute("teleport:items"); + player.getLocks().unlock(); + player.getAntiMacroHandler().setEvent(null); + } + return super.leave(entity, logout); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (!(target instanceof GameObject)) { + return true; + } + return false; + } + + @Override + public boolean actionButton(Player player, int interfaceId, int buttonId, int slot, int itemId, int opcode) { + return false; + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (type != -1) { + if (e instanceof Player) { + ((Player) e).getPacketDispatch().sendMessage("You have to operate the appendage before you can teleport again."); + } + return false; + } + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + return new LostFoundRandomEvent(player); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + /** + * Sets a random odd appendage. + * @param player The player. + */ + private static void setRandomAppendage(Player player) { + int value = 0; + int odd = RandomFunction.random(4); + int mod = RandomFunction.RANDOM.nextBoolean() ? 0 : 1; + int offset = RandomFunction.random(4) * 2; + for (int i = 0; i < 4; i++) { + if (i == odd) { + value |= (offset + (1 - mod)) << (i * 5); + } else { + value |= (offset + mod) << (i * 5); + } + } + player.getConfigManager().set(531, value); + } + + @Override + public void configure() { + registerRegion(9290); + PluginManager.definePlugin(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id = 8998; id < 9006; id++) { + ObjectDefinition.forId(id).getHandlers().put("option:operate", this); + } + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + GameObject object = (GameObject) node; + player.lock(2); + if (isOddAppendage(player, object)) { + GameWorld.getPulser().submit(new Pulse(4) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendPlainMessage(false, "The Abyssal Services Department apologises for the inconvenience."); + return true; + } + }); + player.getInventory().add(player.getAttribute("teleport:items", new Item[0])); + player.getTeleporter().send(player.getAttribute("l&f_dest", ServerConstants.HOME_LOCATION), TeleportManager.getType(player), -1); + } else { + setRandomAppendage(player); + player.getPacketDispatch().sendMessage("That was not the correct appendage!"); + } + return true; + } + + /** + * Checks if the object was the player's odd appendage. + * @param player The player. + * @return {@code True} if the odd appendage was operated. + */ + private boolean isOddAppendage(Player player, GameObject object) { + int index = object.getWrapper().getId() - 8994; + int current = object.getWrapper().getChild(player).getId(); + for (int i = 0; i < 4; i++) { + if (index != i && ObjectDefinition.forId(8994 + i).getChildObject(player).getId() == current) { + return false; + } + } + return true; + } + }); + } + + @Override + public void save(ByteBuffer buffer) { + Location l = player.getAttribute("l&f_dest", player.getLocation()); + buffer.putShort((short) l.getX()).putShort((short) l.getY()).put((byte) l.getZ()); + Item[] runes = player.getAttribute("teleport:items", new Item[0]); + buffer.put((byte) runes.length); + for (int i = 0; i < runes.length; i++) { + buffer.putShort((short) runes[i].getId()); + buffer.put((byte) runes[i].getAmount()); + } + } + + @Override + public void parse(ByteBuffer buffer) { + player.setAttribute("l&f_dest", Location.create(buffer.getShort(), buffer.getShort(), buffer.get())); + Item[] runes = new Item[buffer.get() & 0xFF]; + for (int i = 0; i < runes.length; i++) { + runes[i] = new Item(buffer.getShort() & 0xFFFF, buffer.get() & 0xFF); + } + if (runes.length > 0) { + player.setAttribute("teleport:items", runes); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/ame/events/lostpirate/CapnHandEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/lostpirate/CapnHandEvent.java new file mode 100644 index 000000000..e39b8b552 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/lostpirate/CapnHandEvent.java @@ -0,0 +1,151 @@ +package core.game.content.ame.events.lostpirate; + +import java.nio.ByteBuffer; + +import core.tools.Items; +import core.game.content.ame.AntiMacroDialogue; +import core.game.content.ame.AntiMacroEvent; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.drop.DropFrequency; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the capn hand anti macro event. + * @author Vexia + */ +@Initializable +public final class CapnHandEvent extends AntiMacroEvent { + + /** + * The name of the event. + */ + public static final String NAME = "capn hand"; + + /** + * Constructs a new {@code CapnHandEvent} {@code Object}. + */ + public CapnHandEvent() { + super(NAME, true, false); + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + final CapnHandNPC capn = new CapnHandNPC(2539, player.getLocation(), this, player); + capn.init(); + super.init(player); + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + CapnHandEvent event = new CapnHandEvent(); + event.player = player; + return event; + } + + @Override + public void register() { + PluginManager.definePlugin(new CapnHandDialogue()); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + + } + + @Override + public String getGenderPrefix(boolean male) { + return male ? "mister" : "miss"; + } + + /** + * Handles the rick turpnetine dialogue. + * @author Vexia + */ + public static final class CapnHandDialogue extends AntiMacroDialogue { + + /** + * The random items recieved. + */ + private static final ChanceItem[] ITEMS = new ChanceItem[] { + new ChanceItem(Items.COINS_995, 1, 640, DropFrequency.COMMON), + new ChanceItem(Items.SPINACH_ROLL_1969, 1, 1, DropFrequency.COMMON), + new ChanceItem(Items.KEBAB_1971, 1, 1, DropFrequency.COMMON), + new ChanceItem(Items.UNCUT_SAPPHIRE_1623, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.UNCUT_EMERALD_1621, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.UNCUT_RUBY_1619, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.UNCUT_DIAMOND_1617, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.COSMIC_TALISMAN_1454, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.TOOTH_HALF_OF_A_KEY_985, 1, 1, DropFrequency.RARE)}; + + /** + * Constructs a new {@code CapnHandDialogue} {@code Object}. + */ + public CapnHandDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CapnHandDialogue} {@code Object}. + * @param player the player. + */ + public CapnHandDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CapnHandDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (super.open(args)) { + npc("My mistake " + event.getGenderPrefix() + ", I was thinking yer be some other", "fella!", "Take this swag, and we'll be saying no more about it!", "Yarrr!"); + } else { + return true; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + Item item = RandomFunction.getChanceItem(ITEMS).getRandomItem(); + if (item.getId() == Items.TOOTH_HALF_OF_A_KEY_985 && RandomFunction.randomSign(1) <= 0) { + item = new Item(Items.LOOP_HALF_OF_A_KEY_987); + } + player.getInventory().add(item, player); + wave(null); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2539 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/lostpirate/CapnHandNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/lostpirate/CapnHandNPC.java new file mode 100644 index 000000000..81b59544f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/lostpirate/CapnHandNPC.java @@ -0,0 +1,60 @@ +package core.game.content.ame.events.lostpirate; + +import core.game.content.ame.AntiMacroEvent; +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Handles the capn hand npc. + * @author Vexia + */ +public final class CapnHandNPC extends AntiMacroNPC { + + /** + * The quotes to say. + */ + private static final String[] QUOTES = new String[] { "Heave to, @gender @name!", "That be an order, @gender @name!" }; + + /** + * Constructs a new {@code CapnHandNPC} {@code Object}. + * @param id the id. + * @param location the loc. + * @param event the event. + * @param player the player. + */ + public CapnHandNPC(int id, Location location, AntiMacroEvent event, Player player) { + super(id, location, event, player, QUOTES); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (timeUp && getDialoguePlayer() == null) { + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + } + + @Override + public void handleTimeUp() { + } + + @Override + public boolean isIgnoreAttackRestrictions(Entity victim) { + return true; + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public int[] getIds() { + return new int[] { 2539 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/quizmaster/QuizMasterDialogue.java b/Server/src/main/java/Server/core/game/content/ame/events/quizmaster/QuizMasterDialogue.java new file mode 100644 index 000000000..6722f50d2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/quizmaster/QuizMasterDialogue.java @@ -0,0 +1,256 @@ +package core.game.content.ame.events.quizmaster; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.net.packet.PacketRepository; +import core.net.packet.context.DisplayModelContext; +import core.net.packet.context.DisplayModelContext.ModelType; +import core.net.packet.out.DisplayModel; +import core.tools.RandomFunction; + +/** + * Handles the quiz master dialogue. + * @author Vexia + */ +public final class QuizMasterDialogue extends DialoguePlugin { + + /** + * The correct dialogues. + */ + private static final String[][] CORRECT = new String[][] { { "Hey, you're good at this!", "CORRECT!", "Okay, next question!" }, { "Absolutely RIGHT!", "Keep going for the win!", "Okay, next question!" }, { "Wow, you're a smart one!", "You're absolutely right!", "Okay, next question!" }, { "COR-RECT!", "Okay, next question!" }, { "DING DING DING", "That's RIGHT! Good for you!", "Okay, next question!" }, { "YES!", "You're RIGHT!", "Okay, next question!" } }; + + /** + * The wrong dialogues. + */ + private static final String[][] WRONG = new String[][] { { "Huh...? Didn't you know that one?", "You're supposed to pick the ODD ONE OUT.", "Now, let's start again..." }, { "No. No, that's not right at all.", "You're supposed to pick the ODD ONE OUT.", "Now let's start again..." }, { "No, sorry, Try harder!", "You're supposed to pick the ODD ONE OUT.", "Now, let's start again..." }, { "Better luck next time!", "You're supposed to pick the ODD ONE OUT.", "Now, let's start again..." }, { "WRONG! That's just WRONG!", "You're supposed to pick the ODD ONE OUT.", "Now, let's start again..." }, { "WRONG WRONG WRONG!", "You're supposed to pick the ODD ONE OUT.", "Now, let's start again..." }, { "No, no, no... That's completely WRONG!", "You're supposed to pick the ODD ONE OUT.", "Now, let's start again..." }, { "Nope, that's not it.", "You're supposed to pick the ODD ONE OUT.", "Now, let's start again..." }, { "BZZZZZZZ! WRONG!", "You're supposed to pick the ODD ONE OUT.", "Now, let's start again..." } }; + + /** + * The coin reward. + */ + private static final Item COINS = new Item(995, 1000); + + /** + * The mystery box reward. + */ + private static final Item MYSTERY_BOX = new Item(6199); + + /** + * The quiz master event. + */ + private QuizMasterEvent event; + + /** + * The wrong button id. + */ + private int wrongId; + + /** + * Constructs a new {@code QuizMasterDialogue} {@code Object}. + */ + public QuizMasterDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code QuizMasterDialogue} {@code Object}. + * @param player the player. + */ + public QuizMasterDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new QuizMasterDialogue(player); + } + + @Override + public boolean open(Object... args) { + event = (QuizMasterEvent) args[0]; + if (!event.isStartedQuiz()) { + event.setStartedQuiz(true); + } else { + if (event.getScore() == 4) { + npc(BLUE + "CONGRATULATIONS!", "You are a " + RED + "WINNER!", "Please choose your " + BLUE + "PRIZE!"); + stage = 4; + return true; + } + npc(event.getScore() == 0 ? ("Okay! First question!") : "Okay! Next question!"); + stage = 2; + return true; + } + npc("WELCOME to the GREATEST QUIZ SHOW in the", "whole of " + GameWorld.getSettings().getName() + ".", "O D D O N E O U T"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.THINKING, "I'm sure I didn't ask to take part in a quiz show..."); + stage++; + break; + case 1: + npc("Please welcome our newest contestant:", RED + player.getUsername(), "Just pick the ODD ONE OUT", "Four questions right, and then you win!"); + stage++; + break; + case 2: + display(QuizSet.getQuizSet()); + player.getInterfaceManager().openChatbox(191); + stage++; + break; + case 3: + buttonId -= 4; + final boolean wrong = wrongId != buttonId; + if (wrong) { + event.resetScore(); + } else { + event.incrementScore(); + } + if (event.getScore() == 4) { + npc(BLUE + "CONGRATULATIONS!", "You are a " + RED + "WINNER!", "Please choose your " + BLUE + "PRIZE!"); + stage = 4; + break; + } + npc(getDialogue(wrong ? WRONG : CORRECT)); + stage = 2; + break; + case 4: + options("1000 Coins", "Mystery Box"); + stage++; + break; + case 5: + reward(buttonId == 1 ? COINS : MYSTERY_BOX); + break; + default: + System.out.println("UNHANDLED QUIZ STAGE " + stage + ", " + buttonId + ", " + interfaceId); + break; + } + return true; + } + + /** + * Rewards the player. + * @param item the item. + */ + private void reward(Item item) { + end(); + event.terminate(); + Location destination = player.getAttribute("ame:location"); + if (destination != null) { + if (!player.getInventory().hasSpaceFor(item)) { + GroundItemManager.create(item, destination, player); + } else { + player.getInventory().add(item); + } + player.getProperties().setTeleportLocation(destination); + } + } + + /** + * Displays a quiz. + * @param quiz the quiz. + */ + private void display(QuizSet[] quiz) { + QuizSet correct = quiz[0]; + QuizSet wrong = quiz[1]; + List childs = new ArrayList<>(); + childs.add(1); + childs.add(2); + childs.add(3); + Collections.shuffle(childs); + for (int i = 0; i < 2; i++) { + sendItem(correct.getModel(i), childs.get(i)); + } + wrongId = childs.get(2); + sendItem(wrong.getModel(RandomFunction.random(wrong.ids.length)), wrongId); + } + + /** + * Sends an item. + * @param model the model. + * @param index the index. + */ + private void sendItem(int model, int index) { + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.MODEL, model, 190, 191, 4 + index)); + } + + /** + * Gets the dialogues of a 2d array. + * @param dialogues the dialogues. + * @return the dialogues. + */ + public String[] getDialogue(String[][] dialogues) { + return dialogues[RandomFunction.random(dialogues.length)]; + } + + @Override + public int[] getIds() { + return new int[] { 2477 }; + } + + /** + * Fish, 6189, 6190, Weapons - 6191, 6192, Armour - 6193, 6194, Craftings - + * 6195, 6196, Jewllery - 6197, 6198 + */ + + /** + * Represents a quiz set. + * @author Vexia + */ + public enum QuizSet { + FISH(6189, 6190), WEAPONRY(6191, 6192), ARMOUR(6193, 6194), TOOLS(6195, 6196), JEWELLERY(6197, 6198); + + /** + * The item ids. + */ + private int[] ids; + + /** + * Constructs a new {@code QuizSet} {@code Object}. + * @param ids the ids. + */ + private QuizSet(int... ids) { + this.ids = ids; + } + + /** + * Gets the quiz set. + * @return the set. + */ + public static QuizSet[] getQuizSet() { + List sets = new ArrayList<>(); + for (QuizSet s : values()) { + sets.add(s); + } + Collections.shuffle(sets); + QuizSet[] set = new QuizSet[2]; + set[0] = sets.get(0); + sets.remove(set[0]); + set[1] = sets.get(RandomFunction.random(sets.size())); + return set; + } + + /** + * Gets the model id. + * @param index the index. + * @return the model. + */ + public int getModel(int index) { + return ItemDefinition.forId(ids[index]).getInterfaceModelId(); + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/quizmaster/QuizMasterEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/quizmaster/QuizMasterEvent.java new file mode 100644 index 000000000..8657804c1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/quizmaster/QuizMasterEvent.java @@ -0,0 +1,231 @@ +package core.game.content.ame.events.quizmaster; + +import java.nio.ByteBuffer; + +import core.ServerConstants; +import core.game.content.ame.AntiMacroEvent; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SavedData; +import core.game.world.map.Location; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the quiz master random event. + * @author Vexia + */ +@Initializable +public final class QuizMasterEvent extends AntiMacroEvent { + + /** + * The quiz master random event. + */ + private NPC quizMaster; + + /** + * The score of the quiz. + */ + private int score; + + /** + * If the quiz was started. + */ + private boolean startedQuiz; + + /** + * Constructs a new {@code QuizMasterEvent} {@code Object}. + */ + public QuizMasterEvent() { + super("quiz master", true, true); + } + + @Override + public void save(ByteBuffer buffer) { + SavedData.save(buffer, score, 1); + SavedData.save(buffer, startedQuiz, 2); + buffer.put((byte) 3); + Location l = player.getAttribute("ame:location", ServerConstants.HOME_LOCATION); + l.save(buffer); + buffer.put((byte) 0); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + score = buffer.get(); + break; + case 2: + startedQuiz = SavedData.getBoolean(buffer.get()); + break; + case 3: + player.setAttribute("ame:location", Location.parse(buffer)); + break; + } + } + } + + @Override + public boolean enter(Entity entity) { + /* + * if (player.getName().equals("vexia")) { return false; } if (entity + * instanceof Player) { ((Player) + * entity).getInterfaceManager().removeTabs(0, 1, 2, 3, 4, 5, 6, 7, 11, + * 12); } return super.enter(entity); + */ + return false; + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + return false; + /* + * if (player.getName().equals("vexia")) { return false; } + */ + /* + * setRegion(); if (login) { quizMaster = NPC.create(2477, + * getLocation(32, 32)); quizMaster.init(); teleport(); if (startedQuiz) + * { startQuiz(); } return true; } player.getPulseManager().clear(); + * player.getInterfaceManager().close(); setQuizMaster(false); if + * (quizMaster == null) { return false; } + * player.setAttribute("ame:location", player.getLocation()); + * player.lock(5); quizMaster.lock(5); quizMaster.face(player); + * quizMaster.graphics(Graphics.create(86)); + * quizMaster.sendChat("It's your lucky day!"); + * player.graphics(Graphics.create(86), 3); GameWorld.getPulser().submit(new + * Pulse(4, player, quizMaster) { + * @Override public boolean pulse() { teleport(); setQuizMaster(true); + * return true; } }); super.init(player); return true; + */ + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e == player) { + if (!logout) { + terminate(); + } else { + if (quizMaster != null) { + quizMaster.clear(); + } + region.flagInactive(); + } + } + return super.leave(e, logout); + } + + @Override + public void terminate() { + super.terminate(); + quizMaster = null; + if (player != null) { + player.getAnimator().reset(); + player.getAppearance().setDefaultAnimations(); + player.getAppearance().sync(); + player.getInterfaceManager().restoreTabs(); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 0, 0)); + } + } + + @Override + public AntiMacroEvent create(Player player) { + final QuizMasterEvent event = new QuizMasterEvent(); + event.player = player; + return event; + } + + /** + * Resets the score. + */ + public void resetScore() { + score = 0; + } + + /** + * Increments the score. + */ + public void incrementScore() { + score++; + } + + /** + * Gets the score. + * @return the score. + */ + public int getScore() { + return score; + } + + /** + * Sets the region. + */ + /* + * private void setRegion() { region = DynamicRegion.create(7754); + * registerRegion(region.getId()); } /** Teleports the player to the quiz. + */ + /* + * private void teleport() { + * player.getAppearance().setAnimations(Animation.create(2378)); + * player.getAppearance().sync(); player.faceLocation(getLocation(32, 32)); + * player.getProperties().setTeleportLocation(getLocation(32, 28)); + * startQuiz(); } /** Sets the quiz master. + */ + /* + * private void setQuizMaster(boolean teleport) { if (quizMaster == null) { + * quizMaster = new QuizMasterNPC(2477, player.getLocation(), this, player); + * quizMaster.init(); } if (teleport) { + * quizMaster.getProperties().setTeleportLocation(getLocation(32, 32)); } } + * /** Stars the quiz. + */ + /* + * private void startQuiz() { player.getDialogueInterpreter().open(2477, + * this); player.sendMessage( + * "Answer four questions correctly in a row to be teleported back where you came from." + * ); } /** Gets the startedQuiz. + * @return The startedQuiz. + */ + public boolean isStartedQuiz() { + return startedQuiz; + } + + /** + * Sets the startedQuiz. + * @param startedQuiz The startedQuiz to set. + */ + public void setStartedQuiz(boolean startedQuiz) { + this.startedQuiz = startedQuiz; + } + + /** + * Gets the transformed location. + * @return the location. + */ + /* + * private Location getLocation(int xOff, int yOff) { return + * region.getBaseLocation().transform(xOff, yOff, 1); } + */ + + @Override + public void register() { + PluginManager.definePlugin(new QuizMasterDialogue()); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/quizmaster/QuizMasterNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/quizmaster/QuizMasterNPC.java new file mode 100644 index 000000000..7e3684c40 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/quizmaster/QuizMasterNPC.java @@ -0,0 +1,53 @@ +package core.game.content.ame.events.quizmaster; + +import core.game.content.ame.AntiMacroEvent; +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.repository.Repository; + +/** + * Handles the quiz master npc. + * @author Vexia + */ +public final class QuizMasterNPC extends AntiMacroNPC { + + /** + * Constructs a new {@code QuizMasterNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param event the event. + * @param player the player. + */ + public QuizMasterNPC(int id, Location location, AntiMacroEvent event, Player player) { + super(id, location, event, player); + } + + @Override + public void handleTickActions() { + if (!getLocks().isMovementLocked()) { + if (dialoguePlayer == null || !dialoguePlayer.isActive() || !dialoguePlayer.getInterfaceManager().hasChatbox()) { + dialoguePlayer = null; + } + } + if (!player.isActive()) { + clear(); + } + if (!getPulseManager().hasPulseRunning()) { + startFollowing(); + } + } + + @Override + public void clear() { + Repository.removeRenderableNPC(this); + Repository.getNpcs().remove(this); + getViewport().setCurrentPlane(null); + } + + @Override + public int[] getIds() { + return new int[] { 2477 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/rickturpentine/RickTurpentineEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/rickturpentine/RickTurpentineEvent.java new file mode 100644 index 000000000..130282d48 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/rickturpentine/RickTurpentineEvent.java @@ -0,0 +1,152 @@ +package core.game.content.ame.events.rickturpentine; + +import java.nio.ByteBuffer; + +import core.game.content.ame.AntiMacroDialogue; +import core.game.content.ame.AntiMacroEvent; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.drop.DropFrequency; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; +import core.tools.Items; + +/** + * Handles the rick turpentine anti macro event. + * @author Vexia + */ +@Initializable +public final class RickTurpentineEvent extends AntiMacroEvent { + + /** + * The name of the event. + */ + public static final String NAME = "rick turpentine"; + + /** + * Constructs a new {@code RickTurpentineEvent} {@code Object}. + */ + public RickTurpentineEvent() { + super(NAME, true, false); + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + final RickTurpentineNPC npc = new RickTurpentineNPC(2476, player.getLocation(), this, player); + npc.init(); + super.init(player); + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + RickTurpentineEvent event = new RickTurpentineEvent(); + event.player = player; + return event; + } + + @Override + public void register() { + PluginManager.definePlugin(new RickTurpentineDialogue()); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + + } + + @Override + public String getGenderPrefix(boolean male) { + return male ? "milord" : "milady"; + } + + /** + * Handles the rick turpnetine dialogue. + * @author Vexia + */ + public static final class RickTurpentineDialogue extends AntiMacroDialogue { + + /** + * The random items recieved from rick turpnetine. + */ + private static final ChanceItem[] ITEMS = new ChanceItem[] { + new ChanceItem(Items.COINS_995, 1, 640, DropFrequency.COMMON), + new ChanceItem(Items.SPINACH_ROLL_1969, 1, 1, DropFrequency.COMMON), + new ChanceItem(Items.KEBAB_1971, 1, 1, DropFrequency.COMMON), + new ChanceItem(Items.UNCUT_SAPPHIRE_1623, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.UNCUT_EMERALD_1621, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.UNCUT_RUBY_1619, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.UNCUT_DIAMOND_1617, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.COSMIC_TALISMAN_1454, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(Items.TOOTH_HALF_OF_A_KEY_985, 1, 1, DropFrequency.RARE)}; + + /** + * Constructs a new {@code RickTurpentineDialogue} {@code Object}. + */ + public RickTurpentineDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code RickTurpentineDialogue} {@code Object}. + * @param player the player. + */ + public RickTurpentineDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RickTurpentineDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (super.open(args)) { + npc("Today is your lucky day, sirrah!", "I am donating to the victims of crime to atone for my", "past actions!"); + } else { + return true; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + Item item = RandomFunction.getChanceItem(ITEMS).getRandomItem(); + if (item.getId() == Items.TOOTH_HALF_OF_A_KEY_985 && RandomFunction.randomSign(1) <= 0) { + item = new Item(Items.LOOP_HALF_OF_A_KEY_987); + } + + player.getInventory().add(item, player); + wave(null); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2476 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/rickturpentine/RickTurpentineNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/rickturpentine/RickTurpentineNPC.java new file mode 100644 index 000000000..a917b48e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/rickturpentine/RickTurpentineNPC.java @@ -0,0 +1,74 @@ +package core.game.content.ame.events.rickturpentine; + +import core.game.content.ame.AntiMacroEvent; +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; + +/** + * Handles the drunken dwarf npc. + * @author Vexia + */ +public final class RickTurpentineNPC extends AntiMacroNPC { + + /** + * The quotes that the dwarf will say. + */ + private static final String[] QUOTES = new String[] { "Greetings, @gender @name!", "Your money or your life, @name!" }; + + /** + * Constructs a new {@code RickTurpentineNPC} {@code Object}. + * @param id the id. + * @param location the loc. + * @param event the event. + * @param player the player. + */ + public RickTurpentineNPC(int id, Location location, AntiMacroEvent event, Player player) { + super(id, location, event, player, QUOTES); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (timeUp && getDialoguePlayer() == null) { + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + } + + @Override + public void handlePlayerLeave() { + sendChat("What a dismal little spot this is"); + GameWorld.getPulser().submit(new Pulse(3) { + @Override + public boolean pulse() { + clear(); + return true; + } + }); + } + + @Override + public void handleTimeUp() { + } + + @Override + public boolean isIgnoreAttackRestrictions(Entity victim) { + return true; + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public int[] getIds() { + return new int[] { 2476 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/rivertroll/RiverTrollEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/rivertroll/RiverTrollEvent.java new file mode 100644 index 000000000..df138acea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/rivertroll/RiverTrollEvent.java @@ -0,0 +1,81 @@ +package core.game.content.ame.events.rivertroll; + +import java.nio.ByteBuffer; + +import core.game.content.ame.AntiMacroEvent; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Handles the zombie event. + * @author Vexia + */ +@Initializable +public final class RiverTrollEvent extends AntiMacroEvent { + + /** + * Constructs a new {@code ZombieEvent} {@code Object}. + */ + public RiverTrollEvent() { + super("river troll", true, false, Skills.FISHING); + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + final RiverTrollNPC troll = new RiverTrollNPC(getId(player), player.getLocation(), this, player); + troll.init(); + super.init(player); + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + RiverTrollEvent event = new RiverTrollEvent(); + event.player = player; + return event; + } + + /** + * Gets the id of the shade. + * @param player the player. + * @return the id. + */ + private int getId(Player player) { + int level = player.getProperties().getCurrentCombatLevel(); + int npcId = 396; + if (level < 11) { + npcId = 391; + } else if (level < 21) { + npcId = 392; + } else if (level < 41) { + npcId = 393; + } else if (level < 61) { + npcId = 394; + } else if (level < 91) { + npcId = 395; + } + return npcId; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/rivertroll/RiverTrollNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/rivertroll/RiverTrollNPC.java new file mode 100644 index 000000000..196103c81 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/rivertroll/RiverTrollNPC.java @@ -0,0 +1,70 @@ +package core.game.content.ame.events.rivertroll; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.ame.AntiMacroEvent; +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +/** + * Handles the river troll npc. + * @author Vexia + */ +public final class RiverTrollNPC extends AntiMacroNPC { + + /** + * The river troll npc. + */ + private static final int[] IDS = new int[] { 391, 392, 393, 394, 395, 396 }; + + /** + * Constructs a new {@code RiverTrollNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param event the event. + * @param player the player. + */ + public RiverTrollNPC(int id, Location location, AntiMacroEvent event, Player player) { + super(id, location, event, player); + } + + @Override + public void init() { + // Remove. + NPCDefinition def = NPCDefinition.forId(getId()); + def.getHandlers().put("attack_animation", new Animation(284)); + def.getHandlers().put("defence_animation", new Animation(285)); + def.getHandlers().put("death_animation", new Animation(287)); + super.init(); + setRespawn(false); + getProperties().getCombatPulse().attack(player); + sendChat("Fishies be mine! Leave dem fishies!"); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + if (getProperties().getCombatPulse().isAttacking()) { + if (RandomFunction.random(20) < 3) { + sendChat("Fishies be mine! Leave dem fishies!"); + } + } + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public int[] getIds() { + return IDS; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/shade/ShadeEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/shade/ShadeEvent.java new file mode 100644 index 000000000..06cb4eaf9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/shade/ShadeEvent.java @@ -0,0 +1,81 @@ +package core.game.content.ame.events.shade; + +import java.nio.ByteBuffer; + +import core.game.content.ame.AntiMacroEvent; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Handles the shade event. + * @author Vexia + */ +@Initializable +public final class ShadeEvent extends AntiMacroEvent { + + /** + * Constructs a new {@code ShadeEvent} {@code Object}. + */ + public ShadeEvent() { + super("shade", true, false, Skills.PRAYER); + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + final ShadeNPC shade = new ShadeNPC(getId(player), player.getLocation(), this, player); + shade.init(); + super.init(player); + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + ShadeEvent event = new ShadeEvent(); + event.player = player; + return event; + } + + /** + * Gets the id of the shade. + * @param player the player. + * @return the id. + */ + private int getId(Player player) { + int level = player.getProperties().getCurrentCombatLevel(); + int npcId = 430; + if (level < 11) { + npcId = 425; + } else if (level < 21) { + npcId = 426; + } else if (level < 41) { + npcId = 427; + } else if (level < 61) { + npcId = 428; + } else if (level < 91) { + npcId = 429; + } + return npcId; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/shade/ShadeNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/shade/ShadeNPC.java new file mode 100644 index 000000000..ea978ca63 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/shade/ShadeNPC.java @@ -0,0 +1,56 @@ +package core.game.content.ame.events.shade; + +import core.game.content.ame.AntiMacroEvent; +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Handles the shade npc. + * @author Vexia + */ +public final class ShadeNPC extends AntiMacroNPC { + + /** + * The shade npc ids. + */ + private static final int[] IDS = new int[] { 425, 426, 427, 428, 429, 430 }; + + /** + * Constructs a new {@code ShadeNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param event the event. + * @param player the player. + */ + public ShadeNPC(int id, Location location, AntiMacroEvent event, Player player) { + super(id, location, event, player); + } + + @Override + public void init() { + super.init(); + setRespawn(false); + getProperties().getCombatPulse().attack(player); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public int[] getIds() { + return IDS; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/treespirit/TreeSpiritEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/treespirit/TreeSpiritEvent.java new file mode 100644 index 000000000..c8bf562e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/treespirit/TreeSpiritEvent.java @@ -0,0 +1,81 @@ +package core.game.content.ame.events.treespirit; + +import java.nio.ByteBuffer; + +import core.game.content.ame.AntiMacroEvent; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Handles the Tree Spirit event whilst cutting trees. + * @author Splinter + */ +@Initializable +public final class TreeSpiritEvent extends AntiMacroEvent { + + /** + * Constructs a new {@code TreeSpiritEvent} {@code Object}. + */ + public TreeSpiritEvent() { + super("tree spirit", true, false, Skills.WOODCUTTING); + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + final TreeSpiritRandomNPC spirit = new TreeSpiritRandomNPC(getId(player), player.getLocation(), this, player); + spirit.init(); + super.init(player); + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + TreeSpiritEvent event = new TreeSpiritEvent(); + event.player = player; + return event; + } + + /** + * Gets the id of the spirit. + * @param player the player. + * @return the id. + */ + private int getId(Player player) { + int level = player.getProperties().getCurrentCombatLevel(); + int npcId = 443; + if (level < 11) { + npcId = 438; + } else if (level < 21) { + npcId = 439; + } else if (level < 41) { + npcId = 440; + } else if (level < 61) { + npcId = 441; + } else if (level < 91) { + npcId = 442; + } + return npcId; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/treespirit/TreeSpiritRandomNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/treespirit/TreeSpiritRandomNPC.java new file mode 100644 index 000000000..886e862f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/treespirit/TreeSpiritRandomNPC.java @@ -0,0 +1,69 @@ +package core.game.content.ame.events.treespirit; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.ame.AntiMacroEvent; +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +/** + * Handles the Tree Spirit NPCs + * @author Splinter + */ +public final class TreeSpiritRandomNPC extends AntiMacroNPC { + + /** + * The tree spirit npc ids. + */ + private static final int[] IDS = new int[] { 438, 439, 440, 441, 442, 443 }; + + /** + * Constructs a new {@code TreeSpiritRandomNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param event the event. + * @param player the player. + */ + public TreeSpiritRandomNPC(int id, Location location, AntiMacroEvent event, Player player) { + super(id, location, event, player); + } + + @Override + public void init() { + NPCDefinition def = NPCDefinition.forId(getId()); + def.getHandlers().put("attack_animation", new Animation(94)); + def.getHandlers().put("defence_animation", new Animation(95)); + def.getHandlers().put("death_animation", new Animation(96)); + super.init(); + setRespawn(false); + getProperties().getCombatPulse().attack(player); + sendChat("Leave these woods and never return!"); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + if (getProperties().getCombatPulse().isAttacking()) { + if (RandomFunction.random(40) < 2) { + sendChat("Leave these woods and never return!"); + } + } + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public int[] getIds() { + return IDS; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/zombie/ZombieAmeNPC.java b/Server/src/main/java/Server/core/game/content/ame/events/zombie/ZombieAmeNPC.java new file mode 100644 index 000000000..9d17e4a68 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/zombie/ZombieAmeNPC.java @@ -0,0 +1,63 @@ +package core.game.content.ame.events.zombie; + +import core.game.content.ame.AntiMacroEvent; +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Handles the zombie npc. + * @author Vexia + */ +public final class ZombieAmeNPC extends AntiMacroNPC { + + /** + * The zombie npc. + */ + private static final int[] IDS = new int[] { 419, 420, 421, 422, 423, 424 }; + + /** + * Constructs a new {@code ZombieNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param event the event. + * @param player the player. + */ + public ZombieAmeNPC(int id, Location location, AntiMacroEvent event, Player player) { + super(id, location, event, player); + } + + @Override + public void init() { + super.init(); + setRespawn(false); + getProperties().getCombatPulse().attack(player); + sendChat("Braaiinnzzzzzzzzzz"); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + if (getProperties().getCombatPulse().isAttacking()) { + if (RandomFunction.random(20) < 3) { + sendChat("Braaiinnzzzzzzzzzz"); + } + } + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return victim == player; + } + + @Override + public int[] getIds() { + return IDS; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ame/events/zombie/ZombieEvent.java b/Server/src/main/java/Server/core/game/content/ame/events/zombie/ZombieEvent.java new file mode 100644 index 000000000..fab2a1a63 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ame/events/zombie/ZombieEvent.java @@ -0,0 +1,81 @@ +package core.game.content.ame.events.zombie; + +import java.nio.ByteBuffer; + +import core.game.content.ame.AntiMacroEvent; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Handles the zombie event. + * @author Vexia + */ +@Initializable +public final class ZombieEvent extends AntiMacroEvent { + + /** + * Constructs a new {@code ZombieEvent} {@code Object}. + */ + public ZombieEvent() { + super("zombie", true, false, Skills.PRAYER); + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + final ZombieAmeNPC zombie = new ZombieAmeNPC(getId(player), player.getLocation(), this, player); + zombie.init(); + super.init(player); + return true; + } + + @Override + public AntiMacroEvent create(Player player) { + ZombieEvent event = new ZombieEvent(); + event.player = player; + return event; + } + + /** + * Gets the id of the shade. + * @param player the player. + * @return the id. + */ + private int getId(Player player) { + int level = player.getProperties().getCurrentCombatLevel(); + int npcId = 424; + if (level < 11) { + npcId = 419; + } else if (level < 21) { + npcId = 420; + } else if (level < 41) { + npcId = 421; + } else if (level < 61) { + npcId = 422; + } else if (level < 91) { + npcId = 423; + } + return npcId; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + } + +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/BarbarianMix.java b/Server/src/main/java/Server/core/game/content/consumable/BarbarianMix.java new file mode 100644 index 000000000..2ba4c4556 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/BarbarianMix.java @@ -0,0 +1,16 @@ +package core.game.content.consumable; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +public class BarbarianMix extends Potion { + + public BarbarianMix(int[] ids, ConsumableEffect effect, String... messages) { + super(ids, effect, messages); + } + + @Override + protected void sendDefaultMessages(Player player, Item item) { + player.getPacketDispatch().sendMessage("You drink the lumpy potion."); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/Cake.java b/Server/src/main/java/Server/core/game/content/consumable/Cake.java new file mode 100644 index 000000000..249c5bd41 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/Cake.java @@ -0,0 +1,46 @@ +package core.game.content.consumable; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents any cake item that is made of three even slices. + */ +public class Cake extends Food { + + public Cake(int[] ids, ConsumableEffect effect, String... messages) { + super(ids, effect, messages); + } + + @Override + public void consume(Item item, Player player) { + executeConsumptionActions(player); + final int nextItemId = getNextItemId(item.getId()); + if (nextItemId != -1) { + player.getInventory().replace(new Item(nextItemId), item.getSlot()); + } else { + player.getInventory().remove(item); + } + final int initialLifePoints = player.getSkills().getLifepoints(); + Consumables.getConsumableById(item.getId()).effect.activate(player); + sendMessages(player, initialLifePoints, item, messages); + } + + @Override + protected void sendMessages(Player player, int initialLifePoints, Item item, String[] messages) { + if (messages.length == 0) { + sendDefaultMessages(player, item); + } else { + sendCustomMessages(player, messages, item.getId()); + } + sendHealingMessage(player, initialLifePoints); + } + + private void sendCustomMessages(final Player player, final String[] messages, int itemId) { + int i = 0; + while (ids[i] != itemId) { + i++; + } + player.getPacketDispatch().sendMessage(messages[i]); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/Consumable.java b/Server/src/main/java/Server/core/game/content/consumable/Consumable.java new file mode 100644 index 000000000..4936fa978 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/Consumable.java @@ -0,0 +1,115 @@ +package core.game.content.consumable; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents any item that has a consumption option such as 'Eat' or 'Drink'. + */ +public abstract class Consumable implements Plugin { + + /** + * Represents the item IDs of all the variants of a consumable where the last one is often the empty container, if it has any. + */ + protected final int[] ids; + + /** + * Represents the effect to apply on the player once the item is consumed. + */ + protected final ConsumableEffect effect; + + /** + * Represents the messages to send to the player when it consumes the item. + */ + protected final String[] messages; + + /** + * Represents the animation that the player will execute when consuming the item. + */ + protected Animation animation = null; + + public Consumable(final int[] ids, final ConsumableEffect effect, final String... messages) { + this.ids = ids; + this.effect = effect; + this.messages = messages; + } + + public Consumable(final int[] ids, final ConsumableEffect effect, final Animation animation, final String... messages) { + this.ids = ids; + this.effect = effect; + this.animation = animation; + this.messages = messages; + } + + public void consume(final Item item, final Player player) { + executeConsumptionActions(player); + final int nextItemId = getNextItemId(item.getId()); + if (nextItemId != -1) { + player.getInventory().replace(new Item(nextItemId), item.getSlot()); + } else { + player.getInventory().remove(item); + } + final int initialLifePoints = player.getSkills().getLifepoints(); + Consumables.getConsumableById(item.getId()).effect.activate(player); + sendMessages(player, initialLifePoints, item, messages); + } + + protected void sendMessages(final Player player, final int initialLifePoints, final Item item, String[] messages) { + if (messages.length == 0) { + sendDefaultMessages(player, item); + sendHealingMessage(player, initialLifePoints); + } else { + sendCustomMessages(player, messages); + } + } + + protected void sendHealingMessage(final Player player, final int initialLifePoints) { + if (player.getSkills().getLifepoints() > initialLifePoints) { + player.getPacketDispatch().sendMessage("It heals some health."); + } + } + + protected void sendCustomMessages(final Player player, final String[] messages) { + for (String message : messages) { + player.getPacketDispatch().sendMessage(message); + } + } + + protected abstract void sendDefaultMessages(final Player player, final Item item); + + protected abstract void executeConsumptionActions(Player player); + + protected int getNextItemId(final int currentConsumableId) { + for (int i = 0; i < ids.length; i++) { + if (ids[i] == currentConsumableId && i != ids.length - 1) { + return ids[i + 1]; + } + } + return -1; + } + + public String getFormattedName(Item item) { + return item.getName().replace("(4)", "").replace("(3)", "").replace("(2)", "").replace("(1)", "").trim().toLowerCase(); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + Consumables.add(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + public int getHealthEffectValue(Player player) { + return effect.getHealthEffectValue(player); + } + + public int[] getIds() { + return ids; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/ConsumableEffect.java b/Server/src/main/java/Server/core/game/content/consumable/ConsumableEffect.java new file mode 100644 index 000000000..e7f975463 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/ConsumableEffect.java @@ -0,0 +1,12 @@ +package core.game.content.consumable; + + +import core.game.node.entity.player.Player; + +public abstract class ConsumableEffect { + public abstract void activate(Player p); + + public int getHealthEffectValue(Player player) { + return 0; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/Consumables.java b/Server/src/main/java/Server/core/game/content/consumable/Consumables.java new file mode 100644 index 000000000..3c02fd15e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/Consumables.java @@ -0,0 +1,380 @@ +package core.game.content.consumable; + +import core.tools.Items; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.state.EntityState; +import core.game.world.update.flag.context.Animation; +import core.game.content.consumable.effects.*; +import core.game.node.entity.skill.Skills; + +import java.util.HashMap; + +/** + * Represents a repository of active consumables in the framework. + */ +public enum Consumables { + + /** Meats */ + COOKED_MEAT(new Food(new int[] {2142}, new HealingEffect(3))), + SHRIMPS(new Food(new int[] {315}, new HealingEffect(3))), + COOKED_CHICKEN(new Food(new int[] {2140}, new HealingEffect(3))), + COOKED_RABBIT(new Food(new int[] {3228}, new HealingEffect(5))), + ANCHOVIES(new Food(new int[] {319}, new HealingEffect(1))), + SARDINE(new Food(new int[] {325}, new HealingEffect(4))), + POISON_KARAMBWAN(new Food(new int[] {3146}, new PoisonKarambwanEffect())), + UGTHANKI_MEAT(new Food(new int[] {1861}, new HealingEffect(3))), + HERRING(new Food(new int[] {347}, new HealingEffect(5))), + MACKEREL(new Food(new int[] {355}, new HealingEffect(6))), + ROAST_BIRD_MEAT(new Food(new int[] {9980}, new HealingEffect(6))), + THIN_SNAIL(new Food(new int[] {3369}, new HealingEffect(5))), + TROUT(new Food(new int[] {333}, new HealingEffect(7))), + SPIDER_ON_STICK(new Food(new int[] {6297, 6305}, new HealingEffect(7))), + SPIDER_ON_SHAFT(new Food(new int[] {6299}, new HealingEffect(7))), + ROAST_RABBIT(new Food(new int[] {7223}, new HealingEffect(7))), + LEAN_SNAIL(new Food(new int[] {3371}, new HealingEffect(8))), + COD(new Food(new int[] {339}, new HealingEffect(7))), + PIKE(new Food(new int[] {351}, new HealingEffect(8))), + ROAST_BEAST_MEAT(new Food(new int[] {9988}, new HealingEffect(8))), + COOKED_CRAB_MEAT(new Food(new int[] {7521, 7523, 7524, 7525, 7526}, new HealingEffect(2))), + FAT_SNAIL(new Food(new int[] {3373}, new HealingEffect(9))), + SALMON(new Food(new int[] {329}, new HealingEffect(9))), + SLIMY_EEL(new Food(new int[] {3381}, new HealingEffect(6))), + TUNA(new Food(new int[] {361}, new HealingEffect(10))), + COOKED_KARAMBWAN(new Food(new int[] {3144}, new HealingEffect(18))), + COOKED_CHOMPY(new Food(new int[] {2878}, new HealingEffect(10))), + RAINBOW_FISH(new Food(new int[] {10136}, new HealingEffect(11))), + CAVE_EEL(new Food(new int[] {5003}, new HealingEffect(7))), + LOBSTER(new Food(new int[] {379}, new HealingEffect(12))), + COOKED_JUBBLY(new Food(new int[] {7568}, new HealingEffect(15))), + BASS(new Food(new int[] {365}, new HealingEffect(13))), + SWORDFISH(new Food(new int[] {373}, new HealingEffect(14))), + LAVA_EEL(new Food(new int[] {2149}, new HealingEffect(14))), + MONKFISH(new Food(new int[] {7946}, new HealingEffect(16))), + SHARK(new Food(new int[] {385}, new HealingEffect(20))), + SEA_TURTLE(new Food(new int[] {397}, new HealingEffect(21))), + MANTA_RAY(new Food(new int[] {391}, new HealingEffect(22))), + KARAMBWANJI(new Food(new int[] {3151}, new HealingEffect(3))), + STUFFED_SNAKE(new Food(new int[] {7579}, new HealingEffect(20), "You eat the stuffed snake-it's quite a meal! It tastes like chicken.")), + + /** Breads */ + BREAD(new Food(new int[] {2309}, new HealingEffect(5))), + BAGUETTE(new Food(new int[] {6961}, new HealingEffect(6))), + + /** Sandwiches */ + TRIANGLE_SANDWICH(new Food(new int[] {6962}, new HealingEffect(6))), + SQUARE_SANDWICH(new Food(new int[] {6965}, new HealingEffect(6))), + SEAWEED_SANDWICH(new FakeConsumable(3168, new String[] {"You really, really do not want to eat that."})), + + /** Kebabs */ + UGTHANKI_KEBAB(new Food(new int[] {1883}, new UgthankiKebabEffect())), + UGTHANKI_KEBAB_SMELLING(new Food(new int[] {1885}, new SmellingUgthankiKebabEffect())), + KEBAB(new Food(new int[] {1971}, new KebabEffect())), + SUPER_KEBAB(new Food(new int[] {4608}, new SuperKebabEffect())), + + /** Pies */ + REDBERRY_PIE(new HalfableFood(new int[] {2325, 2333, 2313}, new HealingEffect(5))), + MEAT_PIE(new HalfableFood(new int[] {2327, 2331, 2313}, new HealingEffect(6))), + APPLE_PIE(new HalfableFood(new int[] {2323, 2335, 2313}, new HealingEffect(7))), + GARDEN_PIE(new HalfableFood(new int[] {7178, 7180, 2313}, new MultiEffect(new HealingEffect(6), new SkillEffect(Skills.FARMING, 3, 0)))), + FISH_PIE(new HalfableFood(new int[] {7188, 7190, 2313}, new MultiEffect(new HealingEffect(6), new SkillEffect(Skills.FISHING, 3, 0)))), + ADMIRAL_PIE(new HalfableFood(new int[] {7198, 7200, 2313}, new MultiEffect(new HealingEffect(8), new SkillEffect(Skills.FISHING, 5, 0)))), + WILD_PIE(new HalfableFood(new int[] {7208, 7210, 2313}, new MultiEffect(new SkillEffect(Skills.SLAYER, 5, 0), new SkillEffect(Skills.RANGE, 4, 0), new HealingEffect(11)))), + SUMMER_PIE(new HalfableFood(new int[] {7218, 7220, 2313}, new MultiEffect(new HealingEffect(11), new SkillEffect(Skills.AGILITY, 5, 0), new EnergyEffect(10)))), + + /** Stews */ + STEW(new Food(new int[] {2003, 1923}, new HealingEffect(11))), + SPICY_STEW(new Food(new int[] {7479, 1923}, new HealingEffect(11))), + CURRY(new Food(new int[] {2011, 1923}, new HealingEffect(19))), + BANANA_STEW(new Food(new int[] {4016}, new HealingEffect(11))), + + /** Pizzas */ + PLAIN_PIZZA(new HalfableFood(new int[] {2289, 2291}, new HealingEffect(7))), + MEAT_PIZZA(new HalfableFood(new int[] {2293, 2295}, new HealingEffect(8))), + ANCHOVY_PIZZA(new HalfableFood(new int[] {2297, 2299}, new HealingEffect(9))), + PINEAPPLE_PIZZA(new HalfableFood(new int[] {2301, 2303}, new HealingEffect(11))), + + /** Cakes */ + CAKE(new Cake(new int[] {1891, 1893, 1895}, new HealingEffect(4), "You eat part of the cake.", "You eat some more cake.", "You eat the slice of cake.")), + CHOCOLATE_CAKE(new Cake(new int[] {1897, 1899, 1901}, new HealingEffect(5), "You eat part of the chocolate cake.", "You eat some more of the chocolate cake.", "You eat the slice of cake.")), + ROCK_CAKE(new Food(new int[] {2379}, new RockCakeEffect(), "The rock cake resists all attempts to eat it.")), + DWARVEN_ROCK_CAKE(new Food(new int[] {7510, 7510}, new DwarvenRockCakeEffect())), + HOT_DWARVEN_ROCK_CAKE(new Food(new int[] {7509, 7509}, new DwarvenRockCakeEffect())), + COOKED_FISHCAKE(new Food(new int[] {7530}, new HealingEffect(11))), + MINT_CAKE(new Food(new int[] {9475}, new EnergyEffect(50))), + + /** Vegetables */ + POTATO(new Food(new int[] {1942}, new HealingEffect(1))), + BAKED_POTATO(new Food(new int[] {6701}, new HealingEffect(2))), + SPICY_SAUCE(new Food(new int[] {7072, 1923}, new HealingEffect(2))), + CHILLI_CON_CARNE(new Food(new int[] {7062, 1923}, new HealingEffect(5))), + SCRAMBLED_EGG(new Food(new int[] {7078, 1923}, new HealingEffect(5))), + EGG_AND_TOMATO(new Food(new int[] {7064, 1923}, new HealingEffect(8))), + SWEET_CORN(new Food(new int[] {5988}, new MultiEffect(new HealingEffect(1), new PercentageHealthEffect(10)))), + SWEETCORN_BOWL(new Food(new int[] {7088, 1923}, new MultiEffect(new HealingEffect(1), new PercentageHealthEffect(10)))), + POTATO_WITH_BUTTER(new Food(new int[] {6703}, new HealingEffect(7))), + CHILLI_POTATO(new Food(new int[] {7054}, new HealingEffect(14))), + FRIED_ONIONS(new Food(new int[] {7084, 1923}, new HealingEffect(5))), + FRIED_MUSHROOMS(new Food(new int[] {7082, 1923}, new HealingEffect(5))), + POTATO_WITH_CHEESE(new Food(new int[] {6705}, new HealingEffect(9))), + EGG_POTATO(new Food(new int[] {7056}, new HealingEffect(11))), + MUSHROOMS_AND_ONIONS(new Food(new int[] {7066, 1923}, new HealingEffect(11))), + MUSHROOM_POTATO(new Food(new int[] {7058}, new HealingEffect(20))), + TUNA_AND_CORN(new Food(new int[] {7068, 1923}, new HealingEffect(13))), + TUNA_POTATO(new Food(new int[] {7060}, new HealingEffect(22))), + ONION(new Food(new int[] {1957}, new HealingEffect(2), "It's always sad to see a grown man/woman cry.")), + CABBAGE(new Food(new int[] {1965}, new HealingEffect(2), "You eat the cabbage. Yuck!")), + DRAYNOR_CABBAGE(new Food(new int[] {1967}, new DraynorCabbageEffect(), "You eat the cabbage.", "It seems to taste nicer than normal.")), + EVIL_TURNIP(new Food(new int[] {12134, 12136, 12138}, new HealingEffect(6))), + SPINACH_ROLL(new Food(new int[] {1969}, new HealingEffect(2))), + + /** Dairies */ + POT_OF_CREAM(new Food(new int[] {2130}, new HealingEffect(1))), + CHEESE(new Food(new int[] {1985}, new HealingEffect(2))), + CHOCOLATEY_MILK(new Drink(new int[] {1977, 1925}, new HealingEffect(4))), + + /** Fruits */ + BANANA(new Food(new int[] {1963}, new HealingEffect(2))), + SLICED_BANANA(new Food(new int[] {3162}, new HealingEffect(2))), + RED_BANANA(new Food(new int[] {7572}, new HealingEffect(5), "You eat the red banana. It's tastier than your average banana.")), + SLICED_RED_BANANA(new Food(new int[] {7574}, new HealingEffect(5), "You eat the sliced red banana. Yum.")), + ORANGE(new Food(new int[] {2108}, new HealingEffect(2))), + ORANGE_CHUNKS(new Food(new int[] {2110}, new HealingEffect(2))), + ORANGE_SLICES(new Food(new int[] {2112}, new HealingEffect(2))), + PAPAYA_FRUIT(new Food(new int[] {5972}, new HealingEffect(2))), + TENTI_PINEAPPLE(new FakeConsumable(1851, new String[] {"Try using a knife to slice it into pieces."})), + PINEAPPLE(new FakeConsumable(2114, new String[] {"Try using a knife to slice it into pieces."})), + PINEAPPLE_CHUNKS(new Food(new int[] {2116}, new HealingEffect(2))), + PINEAPPLE_RING(new Food(new int[] {2118}, new HealingEffect(2))), + DWELLBERRIES(new Food(new int[] {2126}, new HealingEffect(2))), + JANGERBERRIES(new Food(new int[] {247}, new MultiEffect(new SkillEffect(Skills.ATTACK, 2, 0), new SkillEffect(Skills.STRENGTH, 1, 0), new PrayerEffect(1, 0), new SkillEffect(Skills.DEFENCE, -1, 0)))), + STRAWBERRY(new Food(new int[] {5504}, new MultiEffect(new HealingEffect(1), new PercentageHealthEffect(6)))), + TOMATO(new Food(new int[] {1982}, new HealingEffect(2))), + WATERMELON(new FakeConsumable(5982, new String[] {"Try using a knife to slice it into pieces."})), + WATERMELON_SLICE(new Food(new int[] {5984}, new PercentageHealthEffect(5))), + LEMON(new Food(new int[] {2102}, new HealingEffect(2))), + LEMON_CHUNKS(new Food(new int[] {2104}, new HealingEffect(2))), + LEMON_SLICES(new Food(new int[] {2106}, new HealingEffect(2))), + LIME(new Food(new int[] {2120}, new HealingEffect(2))), + LIME_CHUNKS(new Food(new int[] {2122}, new HealingEffect(2))), + LIME_SLICES(new Food(new int[] {2124}, new HealingEffect(2))), + PEACH(new Food(new int[] {6883}, new HealingEffect(8))), + WHITE_TREE_FRUIT(new Food(new int[] {6469}, new MultiEffect(new RandomEnergyEffect(5, 10), new HealingEffect(3)))), + STRANGE_FRUIT(new Food(new int[] {464}, new MultiEffect(new RemoveStateEffect(EntityState.POISONED.ordinal()), new EnergyEffect(30)))), + + /** Gnome Cooking */ + TOAD_CRUNCHIES(new Food(new int[] {2217}, new HealingEffect(12))), + PREMADE_TD_CRUNCH(new Food(new int[] {2243}, new HealingEffect(12))), + SPICY_CRUNCHIES(new Food(new int[] {2213}, new HealingEffect(7))), + PREMADE_SY_CRUNCH(new Food(new int[] {2241}, new HealingEffect(7))), + WORM_CRUNCHIES(new Food(new int[] {2205}, new HealingEffect(8))), + PREMADE_WM_CRUNC(new Food(new int[] {2237}, new HealingEffect(8))), + CHOCCHIP_CRUNCHIES(new Food(new int[] {2209}, new HealingEffect(7))), + PREMADE_CH_CRUNCH(new Food(new int[] {2239}, new HealingEffect(7))), + FRUIT_BATTA(new Food(new int[] {2277}, new HealingEffect(11))), + PREMADE_FRT_BATTA(new Food(new int[] {2225}, new HealingEffect(11))), + TOAD_BATTA(new Food(new int[] {2255}, new HealingEffect(11))), + PREMADE_TD_BATTA(new Food(new int[] {2221}, new HealingEffect(11))), + WORM_BATTA(new Food(new int[] {2253}, new HealingEffect(11))), + PREMADE_WM_BATTA(new Food(new int[] {2219}, new HealingEffect(11))), + VEGETABLE_BATTA(new Food(new int[] {2281}, new HealingEffect(11))), + PREMADE_VEG_BATTA(new Food(new int[] {2227}, new HealingEffect(11))), + CHEESE_AND_TOMATOES_BATTA(new Food(new int[] {2259}, new HealingEffect(11))), + PREMADE_CT_BATTA(new Food(new int[] {2223}, new HealingEffect(11))), + WORM_HOLE(new Food(new int[] {2191}, new HealingEffect(12))), + PREMADE_WORM_HOLE(new Food(new int[] {2233}, new HealingEffect(12))), + VEG_BALL(new Food(new int[] {2195}, new HealingEffect(12))), + PREMADE_VEG_BALL(new Food(new int[] {2235}, new HealingEffect(12))), + TANGLED_TOADS_LEGS(new Food(new int[] {2187}, new HealingEffect(15))), + PREMADE_TTL(new Food(new int[] {2231}, new HealingEffect(15))), + CHOCOLATE_BOMB(new Food(new int[] {2195}, new HealingEffect(15))), + PREMADE_CHOC_BOMB(new Food(new int[] {2229}, new HealingEffect(15))), + TOAD_LEGS(new Food(new int[] {2152}, new HealingEffect(3))), + KING_WORM(new Food(new int[] {2162}, new HealingEffect(2))), + + /** Ales */ + ASGOLDIAN_ALE(new FakeConsumable(7508, new String[] {"I don't think I'd like gold in beer thanks. Leave it for the dwarves."})), + ASGARNIAN_ALE(new Drink(new int[] {1905, 1919}, new MultiEffect(new HealingEffect(2), new SkillEffect(Skills.STRENGTH, 2, 0), new SkillEffect(Skills.ATTACK, -4, 0)), "You drink the ale. You feel slightly reinvigorated...", "...and slightly dizzy too.")), + ASGARNIAN_ALE_KEG(new Drink(new int[] {5785, 5783, 5781, 5779, 5769}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 2, 0), new SkillEffect(Skills.ATTACK, -4, 0)), new Animation(2289), "You drink the ale. You feel slightly reinvigorated...", "...and slightly dizzy too.")), + ASGARNIAN_ALE_M(new Drink(new int[] {5739, 1919}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.ATTACK, -6, 0)))), + ASGARNIAN_ALE_M_KEG(new Drink(new int[] {5865, 5863, 5861, 5859, 5769}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.ATTACK, -6, 0)), new Animation(2289))), + AXEMANS_FOLLY(new Drink(new int[] {5751, 1919}, new MultiEffect(new SkillEffect(Skills.WOODCUTTING, 1, 0), new HealingEffect(1), new SkillEffect(Skills.STRENGTH, -3, 0), new SkillEffect(Skills.ATTACK, -3, 0)))), + AXEMANS_FOLLY_KEG(new Drink(new int[] {5825, 5823, 5821, 5819, 5769}, new MultiEffect(new SkillEffect(Skills.WOODCUTTING, 1, 0), new HealingEffect(1), new SkillEffect(Skills.STRENGTH, -3, 0), new SkillEffect(Skills.ATTACK, -3, 0)), new Animation(2289))), + AXEMANS_FOLLY_M(new Drink(new int[] {5753, 1919}, new MultiEffect(new SkillEffect(Skills.WOODCUTTING, 2, 0), new HealingEffect(2), new SkillEffect(Skills.STRENGTH, -4, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + AXEMANS_FOLLY_M_KEG(new Drink(new int[] {5905, 5903, 5901, 5899, 5769}, new MultiEffect(new SkillEffect(Skills.WOODCUTTING, 2, 0), new HealingEffect(2), new SkillEffect(Skills.STRENGTH, -4, 0), new SkillEffect(Skills.ATTACK, -4, 0)), new Animation(2289))), + BANDITS_BREW(new Drink(new int[] {4627, 1919}, new MultiEffect(new SkillEffect(Skills.THIEVING, 1, 0), new SkillEffect(Skills.ATTACK, 1, 0), new SkillEffect(Skills.STRENGTH, -1, 0), new SkillEffect(Skills.DEFENCE, -6, 0), new HealingEffect(1)), "You drink the beer. You feel slightly reinvigorated...", "...and slightly dizzy too.")), + BEER(new Drink(new int[] {1917, 1919}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.STRENGTH, 0, 0.04), new SkillEffect(Skills.ATTACK, 0, -0.07)), "You drink the beer. You feel slightly reinvigorated...", "...and slightly dizzy too.")), + BEER_TANKARD(new Drink(new int[] {3803, 3805}, new MultiEffect(new SkillEffect(Skills.ATTACK, -9, 0), new SkillEffect(Skills.STRENGTH, 4, 0)), "You quaff the beer. You feel slightly reinvigorated...", "...but very dizzy too.")), + KEG_OF_BEER(new Drink(new int[] {3801}, new KegOfBeerEffect(), new Animation(1330), "You chug the keg. You feel reinvigorated...", "...but extremely drunk too.")), + CHEFS_DELIGHT(new Drink(new int[] {5755, 1919}, new MultiEffect(new SkillEffect(Skills.COOKING, 1, 0.05), new HealingEffect(1), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0)))), + CHEFS_DELIGHT_KEG(new Drink(new int[] {5833, 5831, 5829, 5827, 5769}, new MultiEffect(new SkillEffect(Skills.COOKING, 1, 0.05), new HealingEffect(1), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0)), new Animation(2289))), + CHEFS_DELIGHT_M(new Drink(new int[] {5757, 1919}, new MultiEffect(new SkillEffect(Skills.COOKING, 2, 0.05), new HealingEffect(2), new SkillEffect(Skills.ATTACK, -3, 0), new SkillEffect(Skills.STRENGTH, -3, 0)))), + CHEFS_DELIGHT_M_KEG(new Drink(new int[] {5913, 5911, 5909, 5907, 5769}, new MultiEffect(new SkillEffect(Skills.COOKING, 2, 0.05), new HealingEffect(2), new SkillEffect(Skills.ATTACK, -3, 0), new SkillEffect(Skills.STRENGTH, -3, 0)), new Animation(2289))), + CIDER(new Drink(new int[] {5763, 1919}, new MultiEffect(new MultiEffect(new HealingEffect(2), new SkillEffect(Skills.FARMING, 1, 0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0))))), + CIDER_KEG(new Drink(new int[] {5849, 5847, 5845, 5843, 5769}, new MultiEffect(new MultiEffect(new HealingEffect(2), new SkillEffect(Skills.FARMING, 1, 0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0))), new Animation(2289))), + MATURE_CIDER(new Drink(new int[] {5765, 1919}, new MultiEffect(new MultiEffect(new HealingEffect(2), new SkillEffect(Skills.FARMING, 2, 0), new SkillEffect(Skills.ATTACK, -5, 0), new SkillEffect(Skills.STRENGTH, -5, 0))))), + CIDER_M_KEG(new Drink(new int[] {5929, 5927, 5925, 5923, 5769}, new MultiEffect(new MultiEffect(new HealingEffect(2), new SkillEffect(Skills.FARMING, 2, 0), new SkillEffect(Skills.ATTACK, -5, 0), new SkillEffect(Skills.STRENGTH, -5, 0))), new Animation(2289))), + DRAGON_BITTER(new Drink(new int[] {1911, 1919}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.STRENGTH, 2, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + DRAGON_BITTER_KEG(new Drink(new int[] {5809, 5807, 5805, 5803, 5769}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.STRENGTH, 2, 0), new SkillEffect(Skills.ATTACK, -4, 0)), new Animation(2289))), + DRAGON_BITTER_M(new Drink(new int[] {5745, 1919}, new MultiEffect(new HealingEffect(2), new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.ATTACK, -6, 0)))), + DRAGON_BITTER_M_KEG(new Drink(new int[] {5889, 5887, 5885, 5883, 5769}, new MultiEffect(new HealingEffect(2), new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.ATTACK, -6, 0)), new Animation(2289))), + DWARVEN_STOUT(new Drink(new int[] {1913, 1919}, new MultiEffect(new SkillEffect(Skills.MINING, 1, 0), new SkillEffect(Skills.SMITHING, 1 ,0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0), new SkillEffect(Skills.DEFENCE, -2, 0), new HealingEffect(1)), "You drink the Dwarven Stout. It tastes foul.", "It tastes pretty strong too.")), + DWARVEN_STOUT_KEG(new Drink(new int[] {5777, 5775, 5773, 5771, 5769}, new MultiEffect(new SkillEffect(Skills.MINING, 1, 0), new SkillEffect(Skills.SMITHING, 1 ,0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0), new SkillEffect(Skills.DEFENCE, -2, 0), new HealingEffect(1)), new Animation(2289), "You drink the Dwarven Stout. It tastes foul.", "It tastes pretty strong too.")), + DWARVEN_STOUT_M(new Drink(new int[] {5747, 1919}, new MultiEffect(new SkillEffect(Skills.MINING, 2, 0), new SkillEffect(Skills.SMITHING, 2 ,0), new SkillEffect(Skills.ATTACK, -7, 0), new SkillEffect(Skills.STRENGTH, -7, 0), new SkillEffect(Skills.DEFENCE, -7, 0), new HealingEffect(1)))), + DWARVEN_STOUT_M_KEG(new Drink(new int[] {5857, 5855, 5853, 5851, 5769}, new MultiEffect(new SkillEffect(Skills.MINING, 2, 0), new SkillEffect(Skills.SMITHING, 2 ,0), new SkillEffect(Skills.ATTACK, -7, 0), new SkillEffect(Skills.STRENGTH, -7, 0), new SkillEffect(Skills.DEFENCE, -7, 0), new HealingEffect(1)), new Animation(2289))), + GREENMANS_ALE(new Drink(new int[] {1909, 1919}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.HERBLORE, 1, 0), new SkillEffect(Skills.ATTACK, -3, 0), new SkillEffect(Skills.STRENGTH, -3, 0), new SkillEffect(Skills.DEFENCE, -3, 0)))), + GREENMANS_ALE_KEG(new Drink(new int[] {5793, 5791, 5789, 5787, 5769}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.HERBLORE, 1, 0), new SkillEffect(Skills.ATTACK, -3, 0), new SkillEffect(Skills.STRENGTH, -3, 0), new SkillEffect(Skills.DEFENCE, -3, 0)), new Animation(2289))), + GREENMANS_ALE_M(new Drink(new int[] {5743, 1919}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.HERBLORE, 2, 0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0)))), + GREENMANS_ALE_M_KEG(new Drink(new int[] {5873, 5871, 5869, 5867, 5769}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.HERBLORE, 2, 0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0)), new Animation(2289))), + GROG(new Drink(new int[] {1915, 1919}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.ATTACK, -6, 0)))), + MOONLIGHT_MEAD(new Drink(new int[] {2955, 1919}, new HealingEffect(4), "It tastes like something just died in your mouth.")), + MOONLIGHT_MEAD_KEG(new Drink(new int[] {5817, 5815, 5813, 5811, 5769}, new HealingEffect(4), new Animation(2289), "It tastes like something just died in your mouth.")), + MOONLIGHT_MEAD_M(new Drink(new int[] {5749, 1919}, new HealingEffect(6))), + MOONLIGHT_MEAD_M_KEG(new Drink(new int[] {5897, 5895, 5893, 5891, 5769}, new HealingEffect(6), new Animation(2289))), + SLAYERS_RESPITE(new Drink(new int[] {5759, 1919}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.SLAYER, 2, 0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0)))), + SLAYERS_RESPITE_KEG(new Drink(new int[] {5841, 5839, 5837, 5835, 5769}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.SLAYER, 2, 0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0)), new Animation(2289))), + SLAYERS_RESPITE_M(new Drink(new int[] {5761, 1919}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.SLAYER, 4, 0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0)))), + SLAYERS_RESPITE_M_KEG(new Drink(new int[] {5841, 5839, 5837, 5835, 5769}, new MultiEffect(new HealingEffect(1), new SkillEffect(Skills.SLAYER, 4, 0), new SkillEffect(Skills.ATTACK, -2, 0), new SkillEffect(Skills.STRENGTH, -2, 0)), new Animation(2289))), + WIZARDS_MIND_BOMB(new Drink(new int[] {1907, 1919}, new WizardsMindBombEffect(), "You drink the Wizard's Mind Bomb.", "You feel very strange.")), + MATURE_WMB(new Drink(new int[] {5741, 1919}, new MatureWmbEffect())), + + /** Cocktails */ + FRUIT_BLAST(new Drink(new int[] {2084, 2026}, new HealingEffect(9))), + PREMADE_FR_BLAST(new Food(new int[] {2034, 2026}, new HealingEffect(9))), + PINEAPPLE_PUNCH(new Drink(new int[] {2048, 2026}, new HealingEffect(9), "You drink the cocktail. It tastes great.")), + PREMADE_P_PUNCH(new Drink(new int[] {2036, 2026}, new HealingEffect(9), "You drink the cocktail. It tastes great.")), + WIZARD_BLIZZARD(new Drink(new int[] {2054, 2026}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 6, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + PREMADE_WIZ_BLZD(new Drink(new int[] {2040, 2026}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 6, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + SHORT_GREEN_GUY(new Drink(new int[] {2080, 2026}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 4, 0), new SkillEffect(Skills.ATTACK, -3, 0)))), + PREMADE_SGG(new Drink(new int[] {2038, 2026}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 4, 0), new SkillEffect(Skills.ATTACK, -3, 0)))), + DRUNK_DRAGON(new Drink(new int[] {2092, 2026}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 7, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + PREMADE_DR_DRAGON(new Drink(new int[] {2032, 2026}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 7, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + CHOC_SATURDAY(new Drink(new int[] {2074, 2026}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 7, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + PREMADE_CHOC_SDY(new Drink(new int[] {2030, 2026}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 7, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + BLURBERRY_SPECIAL(new Drink(new int[] {2064, 2026}, new MultiEffect(new HealingEffect(6), new SkillEffect(Skills.STRENGTH, 6, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + PREMADE_BLURB_SP(new Drink(new int[] {2028, 2026}, new MultiEffect(new HealingEffect(6), new SkillEffect(Skills.STRENGTH, 6, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + + /** Bottled Drinks */ + KARAMJAN_RUM(new Drink(new int[] {431}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 5, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + BRAINDEATH_RUM(new Drink(new int[] {7157}, new MultiEffect(new SkillEffect(Skills.DEFENCE, 0, -0.1), new SkillEffect(Skills.ATTACK, 0, -0.05), new SkillEffect(Skills.PRAYER, 0, -0.05), new SkillEffect(Skills.RANGE, 0, -0.05), new SkillEffect(Skills.MAGIC, 0, -0.05), new SkillEffect(Skills.HERBLORE, 0, -0.05), new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.MINING, 1, 0)), "With a sense of impending doom you drink the 'rum'. You try very hard not to die.")), + RUM_TROUBLE_BREWING_RED(new Drink(new int[] {8940, 8940}, new TroubleBrewingRumEffect("Oh gods! It tastes like burning!"), new Animation(9605))), + RUM_TROUBLE_BREWING_BLUE(new Drink(new int[] {8941, 8941}, new TroubleBrewingRumEffect("My Liver! My Liver is melting!"), new Animation(9604))), + VODKA(new Drink(new int[] {2015}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.ATTACK, -3, 0)))), + GIN(new Drink(new int[] {2019}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 1, 0), new SkillEffect(Skills.ATTACK, 4, 0), new RandomHealthEffect(3, 4)))), + BRANDY(new Drink(new int[] {2021}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.ATTACK, 4, 0)))), + WHISKY(new Drink(new int[] {2017}, new MultiEffect(new HealingEffect(5), new SkillEffect(Skills.STRENGTH, 3, 0), new SkillEffect(Skills.ATTACK, -4, 0)))), + BOTTLE_OF_WINE(new Drink(new int[] {2015, 7921}, new MultiEffect(new HealingEffect(14), new SkillEffect(Skills.ATTACK, -3, 0)))), + + /** Wine */ + JUG_OF_WINE(new Drink(new int[] {1993, 1935}, new MultiEffect(new HealingEffect(11), new SkillEffect(Skills.ATTACK, -2, 0)))), + HALF_FULL_WINE_JUG(new Drink(new int[] {1989, 1935}, new HealingEffect(7))), + + /** Tea */ + CUP_OF_TEA(new Drink(new int[] {712, 1980}, new MultiEffect(new HealingEffect(3), new SkillEffect(Skills.ATTACK, 3, 0)), "Aaah, nothing like a nice cuppa tea!")), + CUP_OF_TEA_NETTLE(new Drink(new int[] {4242, 1980}, new EnergyEffect(10))), + CUP_OF_TEA_MILKY_NETTLE(new Drink(new int[] {4243, 1980}, new EnergyEffect(10))), + NETTLE_TEA(new Drink(new int[] {4239, 1980}, new NettleTeaEffect())), + NETTLE_TEA_MILKY(new Drink(new int[] {4240, 1980}, new NettleTeaEffect())), + CUP_OF_TEA_CLAY(new Drink(new int[] {7730, 7728}, new SkillEffect(Skills.CONSTRUCTION, 1, 0), "You feel refreshed and ready for more building.")), + CUP_OF_TEA_CLAY_MILKY(new Drink(new int[] {7731, 7728}, new SkillEffect(Skills.CONSTRUCTION, 1, 0))), + CUP_OF_TEA_WHITE(new Drink(new int[] {7733, 7732}, new SkillEffect(Skills.CONSTRUCTION, 2, 0), "You feel refreshed and ready for more building.")), + CUP_OF_TEA_WHITE_MILKY(new Drink(new int[] {7734, 7732}, new SkillEffect(Skills.CONSTRUCTION, 2, 0))), + CUP_OF_TEA_GOLD(new Drink(new int[] {7736, 7735}, new SkillEffect(Skills.CONSTRUCTION, 3, 0), "You feel refreshed and ready for more building.")), + CUP_OF_TEA_GOLD_MILKY(new Drink(new int[] {7737, 7735}, new SkillEffect(Skills.CONSTRUCTION, 3, 0))), + + /** Miscellaneous */ + CHOCOLATE_BAR(new Food(new int[] {1973}, new HealingEffect(3))), + PURPLE_SWEETS(new Food(new int[] {4561}, new HealingEffect(0))), + PURPLE_SWEETS_STACKABLE(new Food(new int[] {10476, 10476}, new MultiEffect(new EnergyEffect(10), new RandomHealthEffect(1, 3)), "The sugary goodness heals some energy.", "The sugary goodness is yummy.")), + FIELD_RATION(new Food(new int[] {7934}, new HealingEffect(10))), + ROLL(new Food(new int[] {6963}, new HealingEffect(6))), + TCHIKI_MONKEY_NUTS(new Food(new int[] {7573}, new HealingEffect(5), "You eat the Tchiki monkey nuts. They taste nutty.")), + TCHIKI_MONKEY_PASTE(new Food(new int[] {7575}, new HealingEffect(5), "You eat the Tchiki monkey nut paste. It sticks to the roof of your mouth.")), + OOMLIE_WRAP(new Food(new int[] {Items.COOKED_OOMLIE_WRAP_2343}, new MultiEffect(new HealingEffect(14), new AchievementEffect(DiaryType.KARAMJA, 2, 2)))), + ROE(new Food(new int[]{11324}, new HealingEffect(3))), + EQUA_LEAVES(new Food(new int[]{2128}, new HealingEffect(1))), + CHOC_ICE(new Food(new int[]{6794}, new HealingEffect(6))), + + /** Special Events */ + PUMPKIN(new Food(new int[] {1959}, new HealingEffect(14))), + EASTER_EGG(new Food(new int[] {1961}, new HealingEffect(14))), + + /** Potions */ + STRENGTH(new Potion(new int[] {113, 115, 117, 119}, new SkillEffect(Skills.STRENGTH, 3, 0.1))), + ATTACK(new Potion(new int[] {2428, 121, 123, 125}, new SkillEffect(Skills.ATTACK, 3, 0.1))), + DEFENCE(new Potion(new int[] {2432, 133, 135, 137}, new SkillEffect(Skills.DEFENCE, 3, 0.1))), + RANGING(new Potion(new int[] {2444, 169, 171, 173}, new SkillEffect(Skills.RANGE, 3, 0.1))), + MAGIC(new Potion(new int[] {3040, 3042, 3044, 3046}, new SkillEffect(Skills.MAGIC, 3, 0.1))), + SUPER_STRENGTH(new Potion(new int[] {2440, 157, 159, 161}, new SkillEffect(Skills.STRENGTH, 3, 0.2))), + SUPER_ATTACK(new Potion(new int[] {2436, 145, 147, 149}, new SkillEffect(Skills.ATTACK, 3, 0.2))), + SUPER_DEFENCE(new Potion(new int[] {2442, 163, 165, 167}, new SkillEffect(Skills.DEFENCE, 3, 0.2))), + ANTIPOISON(new Potion(new int[] {2446, 175, 177, 179}, new MultiEffect(new SetAttributeEffect("poison:immunity", 143), new RemoveStateEffect(EntityState.POISONED.ordinal())))), + ANTIPOISON_(new Potion(new int[] {5943, 5945, 5947, 5949}, new MultiEffect(new SetAttributeEffect("poison:immunity", 863), new RemoveStateEffect(EntityState.POISONED.ordinal())))), + ANTIPOISON__(new Potion(new int[] {5952, 5954, 5956, 5958}, new MultiEffect(new SetAttributeEffect("poison:immunity", 2000), new RemoveStateEffect(EntityState.POISONED.ordinal())))), + SUPER_ANTIP(new Potion(new int[] {2448, 181, 183, 185}, new MultiEffect(new SetAttributeEffect("poison:immunity", 1000), new RemoveStateEffect(EntityState.POISONED.ordinal())))), + RELICYM(new Potion(new int[] {4842, 4844, 4846, 4848}, new MultiEffect(new SetAttributeEffect("disease:immunity", 300), new RemoveStateEffect("disease")))), + AGILITY(new Potion(new int[] {3032, 3034, 3036, 3038}, new SkillEffect(Skills.AGILITY, 3, 0))), + HUNTER(new Potion(new int[] {9998, 10000, 10002, 10004}, new SkillEffect(Skills.HUNTER, 3, 0))), + RESTORE(new Potion(new int[] {2430, 127, 129, 131}, new RestoreEffect(10, 0.3))), + SARA_BREW(new Potion(new int[] {6685, 6687, 6689, 6691}, new MultiEffect(new PercentHeal(.15), new SkillEffect(Skills.ATTACK, 0, -0.10), new SkillEffect(Skills.STRENGTH, 0, -0.10), new SkillEffect(Skills.MAGIC, 0, -0.10), new SkillEffect(Skills.RANGE, 0, -0.10), new SkillEffect(Skills.DEFENCE, 2, 0.2)))), + SUMMONING(new Potion(new int[] {12140, 12142, 12144, 12146}, new SkillEffect(Skills.SUMMONING, 7, 0.25))), + COMBAT(new Potion(new int[] {9739, 9741, 9743, 9745}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 3, .1), new SkillEffect(Skills.ATTACK, 3, .1)))), + ENERGY(new Potion(new int[] {3008, 3010, 3012, 3014}, new MultiEffect(new EnergyEffect(10), new HealingEffect(3)))), + FISHING(new Potion(new int[] {2438, 151, 153, 155}, new SkillEffect(Skills.FISHING, 3, 0))), + PRAYER(new Potion(new int[] {2434, 139, 141, 143}, new PrayerEffect(7, 0.25))), + SUPER_RESTO(new Potion(new int[] {3024, 3026, 3028, 3030}, new MultiEffect(new RestoreEffect(8, 0.25), new PrayerEffect(8, 0.25)))), + ZAMMY_BREW(new Potion(new int[] {2450, 189, 191, 193}, new MultiEffect(new DamageEffect(0.1, true), new SkillEffect(Skills.ATTACK, 0, 0.15), new SkillEffect(Skills.STRENGTH, 0, 0.25), new SkillEffect(Skills.DEFENCE, 0, -0.1), new RandomPrayerEffect(0, 10)))), + ANTIFIRE(new Potion(new int[] {2452, 2454, 2456, 2458}, new SetAttributeEffect("fire:immune", 600, true))), + GUTH_REST(new Potion(new int[] {4417, 4419, 4421, 4423}, new MultiEffect(new RemoveStateEffect(EntityState.POISONED.ordinal()), new EnergyEffect(5), new HealingEffect(5)))), + MAGIC_ESS(new Potion(new int[] {11491, 11489}, new SkillEffect(Skills.MAGIC,3,0))), + SANFEW(new Potion(new int[] {10925, 10927, 10929, 10931}, new MultiEffect(new RestoreEffect(8,0.25), new PrayerEffect(8,0.25), new RemoveStateEffect(EntityState.POISONED.ordinal()), new RemoveStateEffect("disease")))), + SUPER_ENERGY(new Potion(new int[] {3016, 3018, 3020, 3022}, new EnergyEffect(20))), + + /** Barbarian Mixes */ + PRAYERMIX(new BarbarianMix(new int[] {11467, 11465}, new MultiEffect(new PrayerEffect(7, 0.25), new HealingEffect(6)))), + ZAMMY_MIX(new BarbarianMix(new int[] {11523, 11521}, new MultiEffect(new SkillEffect(Skills.HITPOINTS, 0, -0.10), new SkillEffect(Skills.ATTACK, 0, 0.15), new SkillEffect(Skills.STRENGTH, 0, 0.25), new SkillEffect(Skills.DEFENCE, 0, -0.1), new RandomPrayerEffect(0, 10)))), + ATT_MIX(new BarbarianMix(new int[] {11431, 11429}, new MultiEffect(new SkillEffect(Skills.ATTACK, 3, 0.1), new HealingEffect(3)))), + ANTIP_MIX(new BarbarianMix(new int[] {11435, 11433}, new MultiEffect(new RemoveStateEffect(EntityState.POISONED.ordinal()), new SetAttributeEffect("poison:immunity", 143), new HealingEffect(3)))), + RELIC_MIX(new BarbarianMix(new int[] {11439, 11437}, new MultiEffect(new RemoveStateEffect("disease"), new SetAttributeEffect("disease:immunity", 300), new HealingEffect(3)))), + STR_MIX(new BarbarianMix(new int[] {11443, 11441}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 3, 0.1), new HealingEffect(3)))), + RESTO_MIX(new BarbarianMix(new int[] {11449, 11451}, new MultiEffect(new RestoreEffect(10, 0.3), new HealingEffect(3)))), + ENERGY_MIX(new BarbarianMix(new int[] {11453, 11455}, new MultiEffect(new EnergyEffect(10), new HealingEffect(6)))), + DEF_MIX(new BarbarianMix(new int[] {11457, 11459}, new MultiEffect(new SkillEffect(Skills.DEFENCE, 3, 0.1), new HealingEffect(6)))), + AGIL_MIX(new BarbarianMix(new int[] {11461, 11463}, new MultiEffect(new SkillEffect(Skills.AGILITY, 3, 0), new HealingEffect(6)))), + COMBAT_MIX(new BarbarianMix(new int[] {11445, 11447}, new MultiEffect(new SkillEffect(Skills.ATTACK, 3, 0.1), new SkillEffect(Skills.STRENGTH, 3, 0.1), new HealingEffect(6)))), + SUPER_ATT_MIX(new BarbarianMix(new int[] {11469, 11471}, new MultiEffect(new SkillEffect(Skills.ATTACK, 5, 0.15), new HealingEffect(6)))), + FISH_MIX(new BarbarianMix(new int[] {11477, 11479}, new MultiEffect(new SkillEffect(Skills.FISHING, 3, 0), new HealingEffect(6)))), + SUPER_ENERGY_MIX(new BarbarianMix(new int[] {11481, 11483}, new MultiEffect(new EnergyEffect(20), new HealingEffect(6)))), + HUNTING_MIX(new BarbarianMix(new int[] {11517, 11519}, new MultiEffect(new SkillEffect(Skills.HUNTER, 3, 0), new HealingEffect(6)))), + SUPER_STR_MIX(new BarbarianMix(new int[] {11485, 11487}, new MultiEffect(new SkillEffect(Skills.STRENGTH, 5, 0.15), new HealingEffect(6)))); + + public static HashMap consumables = new HashMap<>(); + + private final Consumable consumable; + + Consumables(Consumable consumable) { + this.consumable = consumable; + } + + public Consumable getConsumable() { + return consumable; + } + + public static Consumable getConsumableById(final int itemId) { + return consumables.get(itemId); + } + + public static void add(final Consumable consumable) { + for (int id : consumable.getIds()) { + consumables.putIfAbsent(id, consumable); + } + } + + /* + Static modifier used to populate search engine lists. + */ + static { + for (Consumables consumable : Consumables.values()) { + add(consumable.consumable); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/consumable/CookingProperties.java b/Server/src/main/java/Server/core/game/content/consumable/CookingProperties.java new file mode 100644 index 000000000..3e67b97e3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/CookingProperties.java @@ -0,0 +1,304 @@ +//package org.crandor.game.content.global.consumable; +// +//import org.crandor.game.content.global.SkillcapePerks; +//import core.game.node.entity.skill.Skills; +//import org.crandor.game.node.entity.player.Player; +//import org.crandor.game.node.entity.player.info.portal.Perks; +//import org.crandor.game.node.entity.player.link.audio.Audio; +//import org.crandor.game.node.item.Item; +//import org.crandor.game.node.object.GameObject; +// +//import java.security.SecureRandom; +// +///** +// * Represents the properties used when cooking the food. +// * @author 'Vexia +// * @date 22/12/2013 +// */ +//public class CookingProperties { +// +// /** +// * Represents the secure random. +// */ +// private static final SecureRandom RANDOM = new SecureRandom(); +// +// /** +// * Represents the cooking sound. +// */ +// private static final Audio SOUND = new Audio(65, 10, 0); +// +// /** +// * Represents the cooking gauntlets item. +// */ +// private static final Item GAUNTLETS = new Item(775); +// +// /** +// * Represents the fail message to display when burning food. +// */ +// public static final String FAIL_MESSAGE = "Oops! You accidently burnt the @name.."; +// +// /** +// * Represents the level needed to cook the item. +// */ +// private final int level; +// +// /** +// * Represents the cooking experience gained. +// */ +// private final double experience; +// +// /** +// * Represents the level the food stops burning at on the fire. +// */ +// private final int fireBurnLevel; +// +// /** +// * Represents the level the food stops burning at on the range. +// */ +// private final int rangeBurnLevel; +// +// /** +// * Represents the level the food stops burning at when wearing gauntlets. +// */ +// private final int gauntletsBurnLevel; +// +// /** +// * Represents if its a range only food (meaning only can be used on a range +// * not fire). +// */ +// private final boolean range; +// +// /** +// * Represents if its an iron spit roast. +// */ +// private final boolean spit; +// +// /** +// * Represents the messages displayed when cooking. +// */ +// private String[] messages = null; +// +// /** +// * Constructs a new {@code CookingProperties} {@code Object}. +// * @param level the level. +// * @param experience the experience. +// * @param fireBurnLevel the burning level. +// * @param rangeBurnLevel the burning level on the range. +// * @param gauntletsBurnLevel the burning level with gauntlets. +// * @param range if the food can only be used on a range. +// * @param spit if its an iron spit item. +// */ +// public CookingProperties(int level, double experience, int burnLevel, int rangeBurnLevel, int gauntletsBurnLevel, boolean range, boolean spit, final String... messages) { +// this.level = level; +// this.experience = experience; +// this.fireBurnLevel = burnLevel; +// this.rangeBurnLevel = rangeBurnLevel; +// this.gauntletsBurnLevel = gauntletsBurnLevel; +// this.range = range; +// this.spit = spit; +// this.messages = messages; +// } +// +// /** +// * Constructs a new {@code CookingProperties} {@code Object}. +// * @param level the level. +// * @param experience the experience. +// * @param fireBurnLevel the burning level. +// * @param messages the messages +// */ +// public CookingProperties(final int level, final double experience, final int burnLevel, final String... messages) { +// this(level, experience, burnLevel, burnLevel, burnLevel, false, false, messages); +// } +// +// /** +// * Constructs a new {@code CookingProperties} {@code Object}. +// * @param level the level. +// * @param experience the experience. +// * @param fireBurnLevel the burning level. +// * @param range if its a range item. +// * @param spit if its on an iron spit. +// * @param messages the messages +// */ +// public CookingProperties(final int level, final double experience, final int burnLevel, boolean range, boolean spit, final String... messages) { +// this(level, experience, burnLevel, burnLevel, burnLevel, false, spit, messages); +// } +// +// /** +// * Constructs a new {@code CookingProperties} {@code Object}. +// * @param level the level. +// * @param experience the experience. +// * @param fireBurnLevel the burning level. +// * @param range if its only cookable on the range +// * @param messages the messages +// */ +// public CookingProperties(final int level, final double experience, final int burnLevel, final boolean range, final String... messages) { +// this(level, experience, burnLevel, burnLevel, burnLevel, range, false, messages); +// } +// +// /** +// * Constructs a new {@code CookingProperties} {@code Object}. +// * @param level the level. +// * @param experience the experience. +// * @param fireBurnLevel the burning level. +// * @param rangeBurnLevel the range burning level. +// * @param gauntLetsBurnLevel the gauntletsBurn level. +// */ +// public CookingProperties(final int level, final double experience, final int burnLevel, final int rangeBurnLevel, final int gauntletsBurnLevel) { +// this(level, experience, burnLevel, rangeBurnLevel, gauntletsBurnLevel, false, false); +// } +// +// /** +// * Method used to cook a food. This method can be overried to intercept the +// * way a food is cooked. A prime example of how this can be used is with the +// * sinew consumable food. +// * @param food the food we're cooking. +// * @param player the player. +// * @param object the object. +// * @return True if we we're succesfull. +// */ +// public boolean cook(final Food food, final Player player, final GameObject object) { +// return cook(food, player, object, isBurned(player, object)); +// } +// +// /** +// * Method used to cook a food. This method can be overried to intercept the +// * way a food is cooked. A prime example of how this can be used is with the +// * sinew consumable food. +// * @param food the food we're cooking. +// * @param player the player. +// * @param object the object. +// * @param if it's burned. +// * @return True if we we're succesfull. +// */ +// public boolean cook(final Food food, final Player player, final GameObject object, final boolean burned) { +// if (player.getInventory().remove(food.getRaw())) { +// if (!burned) { +// Item item = food.getItem(); +// player.getInventory().add(item); +// Perks.addDouble(player, item); +// } else { +// player.getInventory().add(food.getBurnt()); +// } +// player.getSkills().addExperience(Skills.COOKING, burned ? 0 : getExperience(), true); +// player.getPacketDispatch().sendMessage(getMessage(food, player, object, burned)); +// player.getAudioManager().send(SOUND); +// return true; +// } +// return false; +// } +// +// /** +// * Gets the level. +// * @return The level. +// */ +// public int getLevel() { +// return level; +// } +// +// /** +// * Gets the experience. +// * @return The experience. +// */ +// public double getExperience() { +// return experience; +// } +// +// /** +// * Gets the fireBurnLevel. +// * @return The fireBurnLevel. +// */ +// public int getBurnLevel() { +// return fireBurnLevel; +// } +// +// /** +// * Gets the range. +// * @return The range. +// */ +// public boolean isRange() { +// return range; +// } +// +// /** +// * Gets the fireBurnLevel. +// * @return The fireBurnLevel. +// */ +// public int getFireBurnLevel() { +// return fireBurnLevel; +// } +// +// /** +// * Gets the rangeBurnLevel. +// * @return The rangeBurnLevel. +// */ +// public int getRangeBurnLevel() { +// return rangeBurnLevel; +// } +// +// /** +// * Gets the gauntletsBurnLevel. +// * @return The gauntletsBurnLevel. +// */ +// public int getGauntletsBurnLevel() { +// return gauntletsBurnLevel; +// } +// +// /** +// * Gets the spit. +// * @return The spit. +// */ +// public boolean isSpit() { +// return spit; +// } +// +// /** +// * Gets the burning level depicted by if the player has cooking gauntlets +// * on, or effected by the object they are interactign with. +// * @param player the player cooking. +// * @param object the object we check. +// * @return the level at which the player stops burning. +// */ +// private final int getBurnLevel(final Player player, final GameObject object) { +// return player.getEquipment().containsItem(GAUNTLETS) ? gauntletsBurnLevel : object.getName().toLowerCase().equals("fire") ? fireBurnLevel : rangeBurnLevel; +// } +// +// /** +// * Gets the true/false value if the food is burned by the player. +// * @param player the player. +// * @param object the object. +// * @return True if the food is burned or not. +// */ +// public boolean isBurned(final Player player, final GameObject object) { +// if (SkillcapePerks.hasSkillcapePerk(player, SkillcapePerks.COOKING)) { +// return false; +// } +// if (player.getSkills().getLevel(Skills.COOKING) > getBurnLevel(player, object)) { +// return false; +// } +// double burn_chance = 60.0 + (object.getName().equals("fire") ? 1.00 : 0) - (object.getId() == 114 ? 1.00 : 0); +// if (player.getDetails().getShop().hasPerk(Perks.MASTER_CHEF)) { +// burn_chance -= (burn_chance * 0.20); +// } +// double cook_level = (double) player.getSkills().getLevel(Skills.COOKING); +// double lev_needed = (double) getLevel(); +// double burn_stop = (double) getBurnLevel(player, object); +// double multi_a = (burn_stop - lev_needed); +// double burn_dec = (burn_chance / multi_a); +// double multi_b = (cook_level - lev_needed); +// burn_chance -= (multi_b * burn_dec); +// double randNum = RANDOM.nextDouble() * 100.0; +// return burn_chance <= randNum ? false : true; +// } +// +// /** +// * Gets the message displayed when the food is cooked or burned. +// * @param food the food we're cooking/burning. +// * @param player the player. +// * @param object the object we're cooking on. +// * @param burned if the food is burned. +// * @return the message to display. +// */ +// public String getMessage(final Food food, final Player player, final GameObject object, final boolean burned) { +// return messages != null && messages.length != 0 ? messages[burned ? 1 : 0].replace("@name", food.getItem().getName().toLowerCase()) : burned ? FAIL_MESSAGE.replace("@name", food.getItem().getName().toLowerCase()) + "." : "You successfully cook the " + food.getItem().getName().toLowerCase() + "."; +// } +//} diff --git a/Server/src/main/java/Server/core/game/content/consumable/Drink.java b/Server/src/main/java/Server/core/game/content/consumable/Drink.java new file mode 100644 index 000000000..6a72e6459 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/Drink.java @@ -0,0 +1,36 @@ +package core.game.content.consumable; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +public class Drink extends Consumable { + + public static final Audio SOUND = new Audio(4580, 1, 1); + + public Drink(int[] ids, ConsumableEffect effect, String... messages) { + super(ids, effect, messages); + animation = new Animation(1327); + } + + public Drink(int[] ids, ConsumableEffect effect, Animation animation, String... messages) { + super(ids, effect, animation, messages); + } + + @Override + protected void sendDefaultMessages(Player player, Item item) { + player.getPacketDispatch().sendMessage("You drink the " + getFormattedName(item) + "."); + } + + @Override + protected void executeConsumptionActions(Player player) { + player.animate(animation); + player.getAudioManager().send(SOUND); + } + + @Override + public String getFormattedName(Item item) { + return item.getName().replace("(4)", "").replace("(3)", "").replace("(2)", "").replace("(1)", "").replace("(m4)", "").replace("(m3)", "").replace("(m2)", "").replace("(m1)", "").replace("(m)", "").trim().toLowerCase(); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/FakeConsumable.java b/Server/src/main/java/Server/core/game/content/consumable/FakeConsumable.java new file mode 100644 index 000000000..019ff1757 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/FakeConsumable.java @@ -0,0 +1,31 @@ +package core.game.content.consumable; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a special type of consumable that cannot be consumed unless it is transformed into another item. + * During its 'consumption', only a message is sent to the player. + */ +public class FakeConsumable extends Consumable { + + public FakeConsumable(final int id, final String[] messages) { + super(new int[] {id}, null, messages); + } + + @Override + public void consume(Item item, Player player) { + sendDefaultMessages(player, item); + } + + @Override + protected void sendDefaultMessages(Player player, Item item) { + for (String message : messages) { + player.getPacketDispatch().sendMessage(message); + } + } + + @Override + protected void executeConsumptionActions(Player player) { + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/Food.java b/Server/src/main/java/Server/core/game/content/consumable/Food.java new file mode 100644 index 000000000..db0c6cff3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/Food.java @@ -0,0 +1,35 @@ +package core.game.content.consumable; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +public class Food extends Consumable { + + public static final Audio SOUND = new Audio(2393, 1, 1); + + public Food(final int[] ids, final ConsumableEffect effect, final String... messages) { + super(ids, effect, messages); + animation = new Animation(829); + } + + public Food(int[] ids, ConsumableEffect effect, Animation animation, String... messages) { + super(ids, effect, animation, messages); + } + + @Override + protected void sendDefaultMessages(Player player, Item item) { + player.getPacketDispatch().sendMessage("You eat the " + getFormattedName(item) + "."); + } + + @Override + protected void executeConsumptionActions(Player player) { + player.animate(animation); + playEatingSound(player); + } + + private void playEatingSound(Player player) { + player.getAudioManager().send(SOUND); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/HalfableFood.java b/Server/src/main/java/Server/core/game/content/consumable/HalfableFood.java new file mode 100644 index 000000000..46c299c91 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/HalfableFood.java @@ -0,0 +1,30 @@ +package core.game.content.consumable; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents any food that is consumed in two parts such as pies and pizzas. + */ +public class HalfableFood extends Food { + + public HalfableFood(int[] ids, ConsumableEffect effect, String... messages) { + super(ids, effect, messages); + } + + @Override + protected void sendDefaultMessages(Player player, Item item) { + if (item.getId() == ids[0]) { + player.getPacketDispatch().sendMessage("You eat half the "+ getFormattedName(item) + "."); + } else if (item.getId() == ids[1]) { + player.getPacketDispatch().sendMessage("You eat the remaining " + getFormattedName(item) + "."); + } else { + super.sendDefaultMessages(player, item); + } + } + + @Override + public String getFormattedName(Item item) { + return item.getName().replace("1/2", "").replace("Half an", "").replace("Half a", "").trim().toLowerCase(); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/Potion.java b/Server/src/main/java/Server/core/game/content/consumable/Potion.java new file mode 100644 index 000000000..48dc02c81 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/Potion.java @@ -0,0 +1,76 @@ +package core.game.content.consumable; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; + +public class Potion extends Drink { + + private static final int VIAL = 229; + + private static final Audio SOUND = new Audio(2401, 1, 1); + + public Potion(final int[] ids, final ConsumableEffect effect, final String... messages) { + super(ids, effect, messages); + } + + @Override + public void consume(Item item, Player player) { + executeConsumptionActions(player); + final int nextItemId = getNextItemId(item.getId()); + if (nextItemId != -1) { + player.getInventory().replace(new Item(nextItemId), item.getSlot()); + } else { + if (player.getBarcrawlManager().isFinished()) { + player.getInventory().remove(item); + } else { + player.getInventory().replace(new Item(VIAL), item.getSlot()); + } + } + final int initialLifePoints = player.getSkills().getLifepoints(); + Consumables.getConsumableById(item.getId()).effect.activate(player); + if (messages.length == 0) { + sendDefaultMessages(player, item); + } else { + sendCustomMessages(player, messages); + } + sendHealingMessage(player, initialLifePoints); + } + + @Override + protected void executeConsumptionActions(Player player) { + player.animate(animation); + player.getAudioManager().send(SOUND); + } + + @Override + protected void sendDefaultMessages(Player player, Item item) { + int consumedDoses = 1; + int i = 0; + while (ids[i] != item.getId()) { + consumedDoses++; + i++; + } + final int dosesLeft = ids.length - consumedDoses; + player.getPacketDispatch().sendMessage("You drink some of your " + getFormattedName(item) + "."); + if (dosesLeft > 1) { + player.getPacketDispatch().sendMessage("You have " + dosesLeft + " doses of your potion left."); + } else if (dosesLeft == 1) { + player.getPacketDispatch().sendMessage("You have 1 dose of your potion left."); + } else { + player.getPacketDispatch().sendMessage("You have finished your potion."); + } + } + + public static int getDose(Item potion){ + return Integer.parseInt(potion.getName().replaceAll("[^\\d.]","")); + } + + public int[] getIds() { + return ids; + } + + public ConsumableEffect getEffect() { + return effect; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/AchievementEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/AchievementEffect.java new file mode 100644 index 000000000..fcff49f2d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/AchievementEffect.java @@ -0,0 +1,21 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.content.consumable.ConsumableEffect; + +public class AchievementEffect extends ConsumableEffect { + private final DiaryType diary; + private final int level; + private final int task; + public AchievementEffect(DiaryType diary, int level, int task) { + this.diary = diary; + this.level = level; + this.task = task; + } + + @Override + public void activate(Player p) { + p.getAchievementDiaryManager().finishTask(p, diary, level, task); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/DamageEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/DamageEffect.java new file mode 100644 index 000000000..e615dbe15 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/DamageEffect.java @@ -0,0 +1,30 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class DamageEffect extends ConsumableEffect { + final double amt; + final boolean isPercent; + + public DamageEffect(double amt,boolean isPercent){ + this.amt = amt; + this.isPercent = isPercent; + } + + @Override + public void activate(Player p) { + p.getImpactHandler().manualHit(p,-getHealthEffectValue(p), ImpactHandler.HitsplatType.NORMAL); + } + + @Override + public int getHealthEffectValue(Player player) { + double amount = amt; + if (isPercent) { + amount /= 100; + return (int) -(amount * player.getSkills().getLifepoints()); + } + return (int) -amt; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/DraynorCabbageEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/DraynorCabbageEffect.java new file mode 100644 index 000000000..96a260e9c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/DraynorCabbageEffect.java @@ -0,0 +1,19 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; +import core.game.node.entity.skill.Skills; + +public class DraynorCabbageEffect extends ConsumableEffect { + + @Override + public void activate(Player p) { + final HealingEffect effect = new HealingEffect(getHealthEffectValue(p)); + effect.activate(p); + } + + @Override + public int getHealthEffectValue(Player player) { + return player.getSkills().getLevel(Skills.DEFENCE) > 50 ? 3 : 4; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/DwarvenRockCakeEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/DwarvenRockCakeEffect.java new file mode 100644 index 000000000..bd7bd887a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/DwarvenRockCakeEffect.java @@ -0,0 +1,21 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class DwarvenRockCakeEffect extends ConsumableEffect { + + private static final DamageEffect effect = new DamageEffect(1, false); + + @Override + public void activate(Player p) { + if (p.getSkills().getLifepoints() > 2) { + effect.activate(p); + } + } + + @Override + public int getHealthEffectValue(Player player) { + return player.getSkills().getLifepoints() > 2 ? -1 : 0; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/EnergyEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/EnergyEffect.java new file mode 100644 index 000000000..6ffb4987c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/EnergyEffect.java @@ -0,0 +1,15 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class EnergyEffect extends ConsumableEffect { + double amt; + public EnergyEffect(int amt){ + this.amt = amt; + } + @Override + public void activate(Player p) { + p.getSettings().updateRunEnergy(-amt); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/HealingEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/HealingEffect.java new file mode 100644 index 000000000..f6e81469e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/HealingEffect.java @@ -0,0 +1,20 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class HealingEffect extends ConsumableEffect { + int amt; + public HealingEffect(int amount){ + this.amt = amount; + } + @Override + public void activate(Player p) { + p.getSkills().heal(amt); + } + + @Override + public int getHealthEffectValue(Player player) { + return amt; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/KebabEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/KebabEffect.java new file mode 100644 index 000000000..d3851d2e0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/KebabEffect.java @@ -0,0 +1,62 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; +import core.game.content.consumable.ConsumableEffect; +import core.game.node.entity.skill.Skills; + +/** + * According to the OSRS wiki, a kebab has the following possible outcomes: + * 66% chance to heal 10% of total Hitpoints level, rounded down. Accompanied with the message "It heals some health." + * 21% chance to heal 10–20 Hitpoints. Accompanied with the message "That was a good kebab. You feel a lot better." + * 9% chance to heal nothing. Accompanied with the message "That kebab didn't seem to do a lot." + * In addition, there is a chance that a non-combat skill is lowered by 3 (with the message "That tasted a bit dodgy. You feel a bit ill."), or that melee skills are lowered by 3 (with the message "That tasted very dodgy. You feel very ill."). + * 4% chance to heal 30 Hitpoints and gain 1–3 levels in Attack, Strength and Defence. Accompanied with the message "Wow, that was an amazing kebab! You feel really invigorated." + */ +public class KebabEffect extends ConsumableEffect { + + @Override + public void activate(Player p) { + final int randomNumber = RandomFunction.nextInt(100); + ConsumableEffect effect; + String message; + if (randomNumber < 66) { + effect = new PercentageHealthEffect(10); + final int initialLifePoints = p.getSkills().getLifepoints(); + effect.activate(p); + if (p.getSkills().getLifepoints() > initialLifePoints) { + message = "It heals some health."; + p.getPacketDispatch().sendMessage(message); + } + } else if (randomNumber < 87) { + effect = new RandomHealthEffect(10, 20); + effect.activate(p); + message = "That was a good kebab. You feel a lot better."; + p.getPacketDispatch().sendMessage(message); + } else if (randomNumber < 96) { + if (RandomFunction.nextInt(100) < 50) { // As the probability of lowering by 3 a non-combat skill or all melee skills is not specified, 50% is the percentage that was chosen. + final int affectedSkillSlot = RandomFunction.nextInt(Skills.NUM_SKILLS - 1); + switch (affectedSkillSlot) { + case Skills.ATTACK: + case Skills.DEFENCE: + case Skills.STRENGTH: + effect = new MultiEffect(new SkillEffect(Skills.ATTACK, -3, 0), new SkillEffect(Skills.DEFENCE, -3, 0), new SkillEffect(Skills.STRENGTH, -3, 0)); + break; + default: + effect = new SkillEffect(affectedSkillSlot, -3, 0); + } + message = "That tasted a bit dodgy. You feel a bit ill."; + p.getPacketDispatch().sendMessage(message); + effect.activate(p); + } else { + message = "That kebab didn't seem to do a lot."; + p.getPacketDispatch().sendMessage(message); + } + } else { + effect = new MultiEffect(new HealingEffect(30), new RandomSkillEffect(Skills.ATTACK, 1, 3), new RandomSkillEffect(Skills.DEFENCE, 1, 3), new RandomSkillEffect(Skills.STRENGTH, 1, 3)); + effect.activate(p); + message = "Wow, that was an amazing kebab! You feel really invigorated."; + p.getPacketDispatch().sendMessage(message); + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/KegOfBeerEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/KegOfBeerEffect.java new file mode 100644 index 000000000..027f03c7b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/KegOfBeerEffect.java @@ -0,0 +1,22 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; +import core.game.node.entity.skill.Skills; + +public class KegOfBeerEffect extends ConsumableEffect { + + private final static int healing = 15; + + @Override + public void activate(Player p) { + final int attackLevelReduction = (p.getSkills().getLevel(Skills.ATTACK) * 65) / 99; + final MultiEffect effect = new MultiEffect(new HealingEffect(15), new RandomSkillEffect(Skills.STRENGTH, 2, 10), new SkillEffect(Skills.ATTACK, attackLevelReduction, 0)); + effect.activate(p); + } + + @Override + public int getHealthEffectValue(Player player) { + return healing; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/MatureWmbEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/MatureWmbEffect.java new file mode 100644 index 000000000..66e7c6936 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/MatureWmbEffect.java @@ -0,0 +1,22 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; +import core.game.node.entity.skill.Skills; + +public class MatureWmbEffect extends ConsumableEffect { + + private final static int healing = 1; + + @Override + public void activate(Player p) { + final int magicLevelBoost = p.getSkills().getLevel(Skills.MAGIC) > 50 ? 4 : 3; + final MultiEffect effect = new MultiEffect(new SkillEffect(Skills.MAGIC, magicLevelBoost, 0), new HealingEffect(healing), new SkillEffect(Skills.ATTACK, -5, 0), new SkillEffect(Skills.STRENGTH, -5, 0), new SkillEffect(Skills.DEFENCE, -5, 0)); + effect.activate(p); + } + + @Override + public int getHealthEffectValue(Player player) { + return healing; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/MultiEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/MultiEffect.java new file mode 100644 index 000000000..3b9b8e5ff --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/MultiEffect.java @@ -0,0 +1,26 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class MultiEffect extends ConsumableEffect { + private ConsumableEffect[] effects; + public MultiEffect(ConsumableEffect... effects){ + this.effects = effects; + } + @Override + public void activate(Player p) { + for(ConsumableEffect e : effects){ + e.activate(p); + } + } + + @Override + public int getHealthEffectValue(Player player) { + int healing = 0; + for (ConsumableEffect effect : effects) { + healing += effect.getHealthEffectValue(player); + } + return healing; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/NettleTeaEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/NettleTeaEffect.java new file mode 100644 index 000000000..068422de6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/NettleTeaEffect.java @@ -0,0 +1,20 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class NettleTeaEffect extends ConsumableEffect { + + private final static int healing = 3; + + @Override + public void activate(Player p) { + final ConsumableEffect effect = p.getSkills().getLifepoints() < p.getSkills().getMaximumLifepoints() ? new MultiEffect(new HealingEffect(3), new EnergyEffect(5)) : new HealingEffect(3); + effect.activate(p); + } + + @Override + public int getHealthEffectValue(Player player) { + return healing; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/PercentHeal.java b/Server/src/main/java/Server/core/game/content/consumable/effects/PercentHeal.java new file mode 100644 index 000000000..3f9c3509c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/PercentHeal.java @@ -0,0 +1,21 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class PercentHeal extends ConsumableEffect { + double perc = 0.0; + + public PercentHeal(double percent){ + perc = percent; + } + + @Override + public void activate(Player p) { + int amount = (int) Math.floor(p.getSkills().getMaximumLifepoints() * perc); + if(p.getSkills().getLifepoints() + amount > (p.getSkills().getMaximumLifepoints() + (p.getSkills().getMaximumLifepoints() * perc))){ + amount = 0; + } + p.getSkills().healNoRestrictions(amount); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/PercentageHealthEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/PercentageHealthEffect.java new file mode 100644 index 000000000..41383eec4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/PercentageHealthEffect.java @@ -0,0 +1,24 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class PercentageHealthEffect extends ConsumableEffect { + + private final double percentage; + + public PercentageHealthEffect(final int percentage) { + this.percentage = percentage * 0.01; + } + + @Override + public void activate(Player p) { + final HealingEffect effect = new HealingEffect(getHealthEffectValue(p)); + effect.activate(p); + } + + @Override + public int getHealthEffectValue(Player player) { + return (int) (player.getSkills().getMaximumLifepoints() * percentage); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/PoisonEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/PoisonEffect.java new file mode 100644 index 000000000..26e50dbd2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/PoisonEffect.java @@ -0,0 +1,24 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class PoisonEffect extends ConsumableEffect { + + private final int amount; + + public PoisonEffect(final int amount) { + this.amount = amount; + } + + @Override + public void activate(Player p) { + p.getImpactHandler().manualHit(p, amount, ImpactHandler.HitsplatType.POISON); + } + + @Override + public int getHealthEffectValue(Player player) { + return -amount; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/PoisonKarambwanEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/PoisonKarambwanEffect.java new file mode 100644 index 000000000..f2ed9cb46 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/PoisonKarambwanEffect.java @@ -0,0 +1,21 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class PoisonKarambwanEffect extends ConsumableEffect { + + private final PoisonEffect effect = new PoisonEffect(5); + + @Override + public void activate(Player p) { + if (p.getSkills().getLifepoints() > 5) { + effect.activate(p); + } + } + + @Override + public int getHealthEffectValue(Player player) { + return -5; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/PrayerEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/PrayerEffect.java new file mode 100644 index 000000000..0c87c5933 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/PrayerEffect.java @@ -0,0 +1,19 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; +import core.game.node.entity.skill.Skills; + +public class PrayerEffect extends ConsumableEffect { + double base, bonus; + public PrayerEffect(double base, double bonus){ + this.base = base; + this.bonus = bonus; + } + @Override + public void activate(Player p) { + int level = p.getSkills().getStaticLevel(Skills.PRAYER); + double amt = base + (level * bonus); + p.getSkills().incrementPrayerPoints(amt); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/RandomEnergyEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/RandomEnergyEffect.java new file mode 100644 index 000000000..ee8fe238f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/RandomEnergyEffect.java @@ -0,0 +1,21 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; +import core.game.content.consumable.ConsumableEffect; + +public class RandomEnergyEffect extends ConsumableEffect { + + private final int a, b; + + public RandomEnergyEffect(final int a, final int b) { + this.a = a; + this.b = b; + } + + @Override + public void activate(Player p) { + final EnergyEffect effect = new EnergyEffect(RandomFunction.random(a, b)); + effect.activate(p); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/RandomHealthEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/RandomHealthEffect.java new file mode 100644 index 000000000..59e00df59 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/RandomHealthEffect.java @@ -0,0 +1,32 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; +import core.game.content.consumable.ConsumableEffect; + +public class RandomHealthEffect extends ConsumableEffect { + + private final int a, b; + + public RandomHealthEffect(final int a, final int b) { + this.a = a; + this.b = b; + } + + @Override + public void activate(Player p) { + ConsumableEffect effect; + final int healthEffectValue = getHealthEffectValue(p); + if (healthEffectValue > 0) { + effect = new HealingEffect(healthEffectValue); + } else { + effect = new DamageEffect(healthEffectValue, false); + } + effect.activate(p); + } + + @Override + public int getHealthEffectValue(Player player) { + return RandomFunction.random(a, b); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/RandomPrayerEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/RandomPrayerEffect.java new file mode 100644 index 000000000..ab29251a3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/RandomPrayerEffect.java @@ -0,0 +1,21 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; +import core.game.content.consumable.ConsumableEffect; + +public class RandomPrayerEffect extends ConsumableEffect { + + private final int a, b; + + public RandomPrayerEffect(final int a, final int b) { + this.a = a; + this.b = b; + } + + @Override + public void activate(Player p) { + final PrayerEffect effect = new PrayerEffect(RandomFunction.random(a, b), 0); + effect.activate(p); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/RandomSkillEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/RandomSkillEffect.java new file mode 100644 index 000000000..d2a5fea6b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/RandomSkillEffect.java @@ -0,0 +1,22 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; +import core.game.content.consumable.ConsumableEffect; + +public class RandomSkillEffect extends ConsumableEffect { + + private final int skillSlot, a, b; + + public RandomSkillEffect(final int skillSlot, final int a, final int b) { + this.skillSlot = skillSlot; + this.a = a; + this.b = b; + } + + @Override + public void activate(Player p) { + final SkillEffect effect = new SkillEffect(skillSlot, RandomFunction.random(a, b), 0); + effect.activate(p); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/RemoveStateEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/RemoveStateEffect.java new file mode 100644 index 000000000..f6a64af83 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/RemoveStateEffect.java @@ -0,0 +1,25 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.content.consumable.ConsumableEffect; + +public class RemoveStateEffect extends ConsumableEffect { + int state = -1; + String statekey; + @Deprecated + public RemoveStateEffect(int state){ + this.state = state; + } + public RemoveStateEffect(String key){ + statekey = key; + } + @Override + public void activate(Player p) { + if(state == -1){ + p.clearState(statekey); + return; + } + p.getStateManager().remove(EntityState.values()[state]); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/RestoreEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/RestoreEffect.java new file mode 100644 index 000000000..f49c40e49 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/RestoreEffect.java @@ -0,0 +1,26 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; +import core.game.node.entity.skill.Skills; + +public class RestoreEffect extends ConsumableEffect { + double base,bonus; + public RestoreEffect(double base, double bonus){ + this.base = base; + this.bonus = bonus; + } + final int[] SKILLS = new int[] { Skills.DEFENCE, Skills.ATTACK, Skills.STRENGTH, Skills.MAGIC, Skills.RANGE }; + @Override + public void activate(Player p) { + Skills sk = p.getSkills(); + for(int skill : SKILLS){ + int statL = sk.getStaticLevel(skill); + int curL = sk.getLevel(skill); + if(curL < statL){ + int boost = (int) (base + (statL * bonus)); + p.getSkills().updateLevel(skill, boost, statL); + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/RestoreSummoning.kt b/Server/src/main/java/Server/core/game/content/consumable/effects/RestoreSummoning.kt new file mode 100644 index 000000000..506520c26 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/RestoreSummoning.kt @@ -0,0 +1,13 @@ +package core.game.content.consumable.effects + +import core.game.node.entity.player.Player +import core.game.content.consumable.ConsumableEffect +import core.game.node.entity.skill.Skills + +class RestoreSummoning(val percent: Double) : ConsumableEffect(){ + override fun activate(p: Player?) { + var amt = (p!!.skills!!.getStaticLevel(Skills.SUMMONING) * percent).toInt() + if(amt + p.skills.getLevel(Skills.SUMMONING) > p.skills.getStaticLevel(Skills.SUMMONING)) amt = p.skills.getStaticLevel(Skills.SUMMONING) - p.skills.getLevel(Skills.SUMMONING) + p.skills.setLevel(Skills.SUMMONING, p.skills.getLevel(Skills.SUMMONING) + amt) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/RockCakeEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/RockCakeEffect.java new file mode 100644 index 000000000..54d6c0afa --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/RockCakeEffect.java @@ -0,0 +1,21 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class RockCakeEffect extends ConsumableEffect { + + private static final DamageEffect effect = new DamageEffect(10, true); + + @Override + public void activate(Player p) { + if (p.getSkills().getLifepoints() > 1) { + effect.activate(p); + } + } + + @Override + public int getHealthEffectValue(Player player) { + return (int) (player.getSkills().getLifepoints() * -0.1); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/SetAttributeEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/SetAttributeEffect.java new file mode 100644 index 000000000..3b767d39f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/SetAttributeEffect.java @@ -0,0 +1,37 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.content.consumable.ConsumableEffect; + +public class SetAttributeEffect extends ConsumableEffect { + String attrString; + Object attrValue; + boolean isTicks; + + public SetAttributeEffect(String attr, Object value, boolean isTicks){ + this.attrString = attr; + this.attrValue = value; + this.isTicks = isTicks; + } + + public SetAttributeEffect(String attr, Object value){ + this.attrString = attr; + this.attrValue = value; + if (value instanceof Integer){ + this.isTicks = true; + } else { + this.isTicks = false; + } + } + + @Override + public void activate(Player p) { + if(isTicks){ + int val = (Integer) attrValue + GameWorld.getTicks(); + p.setAttribute(attrString,val); + return; + } + p.setAttribute(attrString,attrValue); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/SkillEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/SkillEffect.java new file mode 100644 index 000000000..9e0f460f3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/SkillEffect.java @@ -0,0 +1,23 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; +import core.game.node.entity.skill.Skills; + +public class SkillEffect extends ConsumableEffect { + private final int skill_slot; + private final double base; + private final double bonus; + public SkillEffect(int skill_slot, double base, double bonus){ + this.skill_slot = skill_slot; + this.base = base; + this.bonus = bonus; + } + @Override + public void activate(Player p) { + Skills skills = p.getSkills(); + int level = skills.getLevel(skill_slot); + int slevel = skills.getStaticLevel(skill_slot); + skills.updateLevel(skill_slot,(int)(base + (bonus * slevel)),slevel + (int)(base + (bonus * slevel))); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/SmellingUgthankiKebabEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/SmellingUgthankiKebabEffect.java new file mode 100644 index 000000000..c80c191e1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/SmellingUgthankiKebabEffect.java @@ -0,0 +1,30 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; +import core.game.content.consumable.ConsumableEffect; + +/** + * According to the OSRS wiki, the smelling ugthanki kebab will usually heal nothing when eaten, but sometimes heals for 9. + * As the chances of healing are unknown, the percentage is set to 10%. + */ +public class SmellingUgthankiKebabEffect extends ConsumableEffect { + + private static final int percentage = 10; + + private static final int healing = 9; + + private static final HealingEffect effect = new HealingEffect(healing); + + @Override + public void activate(Player p) { + if (RandomFunction.nextInt(100) < percentage) { + effect.activate(p); + } + } + + @Override + public int getHealthEffectValue(Player player) { + return RandomFunction.nextInt(100) < percentage ? healing : 0; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/SuperKebabEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/SuperKebabEffect.java new file mode 100644 index 000000000..127fd63e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/SuperKebabEffect.java @@ -0,0 +1,28 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; +import core.game.content.consumable.ConsumableEffect; +import core.game.node.entity.skill.Skills; + + +public class SuperKebabEffect extends ConsumableEffect { + + private static final MultiEffect healingEffect = new MultiEffect(new HealingEffect(3), new PercentageHealthEffect(7)); + + @Override + public void activate(Player p) { + if (RandomFunction.nextInt(8) < 5) { + healingEffect.activate(p); + } + if (RandomFunction.nextInt(32) < 1) { + final SkillEffect effect = new SkillEffect(RandomFunction.nextInt(Skills.NUM_SKILLS), -1, 0); + effect.activate(p); + } + } + + @Override + public int getHealthEffectValue(Player player) { + return RandomFunction.nextInt(8) < 5 ? (int) (3 + (player.getSkills().getMaximumLifepoints() * 0.07)) : 0; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/TroubleBrewingRumEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/TroubleBrewingRumEffect.java new file mode 100644 index 000000000..c9fa70b82 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/TroubleBrewingRumEffect.java @@ -0,0 +1,37 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.map.Location; +import core.game.content.consumable.ConsumableEffect; + +public class TroubleBrewingRumEffect extends ConsumableEffect { + + private static final Location TROUBLE_BREWING_MINIGAME = new Location(3813, 3022); + + private final String forceChatMessage; + + public TroubleBrewingRumEffect(final String forceChatMessage) { + this.forceChatMessage = forceChatMessage; + } + + @Override + public void activate(Player p) { + final Pulse teleportation = new Pulse(6) { + @Override + public boolean pulse() { + p.teleport(TROUBLE_BREWING_MINIGAME); + return true; + } + }; + final Pulse mainPulse = new Pulse(4) { + @Override + public boolean pulse() { + p.sendChat(forceChatMessage); + p.getPulseManager().run(teleportation); + return true; + } + }; + p.getPulseManager().run(mainPulse); + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/UgthankiKebabEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/UgthankiKebabEffect.java new file mode 100644 index 000000000..d141d365f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/UgthankiKebabEffect.java @@ -0,0 +1,24 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; + +public class UgthankiKebabEffect extends ConsumableEffect { + + private static final int healing = 19; + + private static final HealingEffect effect = new HealingEffect(healing); + + @Override + public void activate(Player p) { + if (p.getSkills().getLifepoints() < p.getSkills().getMaximumLifepoints()) { + p.sendChat("Yum!"); + } + effect.activate(p); + } + + @Override + public int getHealthEffectValue(Player player) { + return healing; + } +} diff --git a/Server/src/main/java/Server/core/game/content/consumable/effects/WizardsMindBombEffect.java b/Server/src/main/java/Server/core/game/content/consumable/effects/WizardsMindBombEffect.java new file mode 100644 index 000000000..c40e61480 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/consumable/effects/WizardsMindBombEffect.java @@ -0,0 +1,22 @@ +package core.game.content.consumable.effects; + +import core.game.node.entity.player.Player; +import core.game.content.consumable.ConsumableEffect; +import core.game.node.entity.skill.Skills; + +public class WizardsMindBombEffect extends ConsumableEffect { + + private final static int healing = 1; + + @Override + public void activate(Player p) { + final int magicLevelBoost = p.getSkills().getLevel(Skills.MAGIC) > 50 ? 3 : 2; + final MultiEffect effect = new MultiEffect(new SkillEffect(Skills.MAGIC, magicLevelBoost, 0), new HealingEffect(healing), new SkillEffect(Skills.ATTACK, -3, 0), new SkillEffect(Skills.STRENGTH, -4, 0), new SkillEffect(Skills.DEFENCE, -4, 0)); + effect.activate(p); + } + + @Override + public int getHealthEffectValue(Player player) { + return healing; + } +} diff --git a/Server/src/main/java/Server/core/game/content/cutscene/DBRCutscenePlugin.java b/Server/src/main/java/Server/core/game/content/cutscene/DBRCutscenePlugin.java new file mode 100644 index 000000000..0a01f49d7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/cutscene/DBRCutscenePlugin.java @@ -0,0 +1,893 @@ +package core.game.content.cutscene; + +import core.game.component.Component; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.global.action.DoorActionHandler; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.item.ItemPlugin; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the draynor bank robbery cutscene plugin. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DBRCutscenePlugin extends CutscenePlugin { + + /** + * Represents the cracked component. + */ + private static final Component CRACKED = new Component(385); + + /** + * Represents the stealing animation used for cool mom. + */ + private static final Animation STEAL_ANIMATION = new Animation(832); + + /** + * Represents the casting animation. + */ + private static final Animation CAST_ANIMATION = new Animation(1167); + + /** + * Represents the telekentic animation to use. + */ + private static final Animation TELEKENTIC_ANIMATION = new Animation(723); + + /** + * Represents the telekentic graphics. + */ + private static final Graphics TELEKENTIC_GRAPHIC = new Graphics(142, 96); + + /** + * Represents the casting animation. + */ + private static final Animation SECOND_CAST_ANIMATION = new Animation(1167); + + /** + * Represents the death animation to use. + */ + private static final Animation DEATH_ANIMATION = new Animation(2553); + + /** + * Represents the graphics to use. + */ + private static final Graphics SHOCK_GRAPHIC = new Graphics(432, 0, 0); + + /** + * Represents the teleport animation to use. + */ + private static final Animation TELEPORT_ANIMATION = new Animation(1816); + + /** + * Represents the graphics to use for teleother. + */ + private static final Graphics[] TELE_OTHERS = new Graphics[] { new Graphics(343), new Graphics(342) }; + + /** + * Represents the pick up animation to use. + */ + private static final Animation PICK_UP_ANIMATION = new Animation(827); + + /** + * Represents the hitting animation. + */ + private static final Animation HIT_ANIMATION = new Animation(401); + + /** + * Represents the blocking animation. + */ + private static final Animation BLOCK_ANIMATION = new Animation(425); + + /** + * Represents the thunder animation. + */ + private static final Animation THUNDER_ANIMATION = new Animation(811); + + /** + * Represents the purple graphics. + */ + private static final Graphics PURPLE_GRAPHIC = new Graphics(301, 100); + + /** + * Represents the thunder graphic. + */ + private static final Graphics THUNDER_GRAPHIC = new Graphics(76); + + /** + * Represents the animation to use for the wise old man. + */ + private static final Animation WISE_JUMP = new Animation(2555); + + /** + * Represents the market guard jump animation. + */ + private static final Animation GUARD_JUMP = new Animation(2556); + + /** + * Represents the stomp animation. + */ + private static final Animation STOMP_ANIM = new Animation(1820); + + /** + * Represents the ashes item. + */ + private static final Item ASHES = new Item(592); + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 60); + + /** + * Represents the party hat item. + */ + private static final Item PARTY_HAT = new Item(2422); + + /** + * Represents the recording pulse. + */ + private final RecordingPulse recordingPulse = new RecordingPulse(); + + /** + * Represents the npcs to use in the cutscene. + */ + private static final NPC[] NPCS = new NPC[] { + /** cool mom */ + NPC.create(2579, Location.create(2120, 4916, 0), Direction.NORTH), + /** olivia */ + NPC.create(2572, Location.create(2117, 4913, 0), Direction.WEST), + /** market guard */ + NPC.create(2571, Location.create(13, 48, 0), Direction.WEST), + /** purepker */ + NPC.create(2575, new Location(2136, 4914, 0), Direction.WEST), + /** first banker */ + NPC.create(2568, new Location(2130, 4909, 0), Direction.EAST), + /** second last banker. */ + NPC.create(2569, new Location(2130, 4907, 0)), + /** last banker */ + NPC.create(2570, new Location(2130, 4906, 0)), + /** efinlocks */ + NPC.create(2578, new Location(2133, 4908, 0)), + /** 1337sp34kr */ + NPC.create(2577, new Location(2134, 4906, 0), Direction.WEST), + /** quitedoll */ + NPC.create(2576, new Location(2133, 4906, 0), Direction.EAST), + /** oldman */ + NPC.create(2566, new Location(2128, 4915, 0), Direction.SOUTH) }; + + /** + * Constructs a new {@code DBRCutscenePlugin} {@code Object}. + */ + public DBRCutscenePlugin() { + super("dbr cutscene"); + } + + /** + * Constructs a new {@code DBRCutscenePlugin} {@code Object}. + * + * @param player + * the player. + */ + public DBRCutscenePlugin(final Player player) { + super("dbr cutscene"); + this.player = player; + } + + @Override + public void open() { + setNpcs(); + GameWorld.getPulser().submit(recordingPulse); + player.lock(); + player.getLocks().lockMovement(10000000); + camera(27, 45, -14, 2, 700, 100); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new DBRCutscenePlugin(p); + } + + @Override + public void register() { + super.register(); + try { + new DBRecordingNPC().newInstance(null); + } catch (Throwable e) { + e.printStackTrace(); + } + PluginManager.definePlugin(new BluePhatItem()); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return base.transform(17, 51, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(8524); + setRegionBase(); + registerRegion(region.getId()); + player.getDialogueInterpreter().sendPlainMessage(true, "You close your eyes and watch the recording..."); + } + + @Override + public void end() { + super.end(); + clearNpcs(); + player.getSavedData().getGlobalData().setDraynorRecording(true); + player.getDialogueInterpreter().sendDialogue("End of recording."); + } + + /** + * Gets the cool mom npc. + * + * @return the cool mom npc. + */ + public NPC getCoolMom() { + return getNpc(2579); + } + + /** + * Gets the olivia npc. + * + * @return the olivia npc. + */ + public NPC getOlivia() { + return getNpc(2572); + } + + /** + * Gets the market guard npc. + * + * @return the market guard. + */ + public NPC getMarketGuard() { + return getNpc(2571); + } + + /** + * Gets the pure pker npc. + * + * @return the pure pker npc. + */ + public NPC getPurePker() { + return getNpc(2575); + } + + /** + * Gets the elfinlocks npc. + * + * @return the elfinocks npc. + */ + public NPC getElfinocks() { + return getNpc(2578); + } + + /** + * Gets the 1337sp34kr npc. + * + * @return the 1337sp34kr npc. + */ + public NPC get1337() { + return getNpc(2577); + } + + /** + * Gets the quitedoll npc. + * + * @return the quitedoll npc. + */ + public NPC getQuiteDoll() { + return getNpc(2576); + } + + /** + * Gets the wise old man npc. + * + * @return the wise old man npc. + */ + public NPC getWiseOldMan() { + int size = region.getPlanes()[0].getNpcs().size(); + return region.getPlanes()[0].getNpcs().get(size - 1); + } + + /** + * Gets the first banker. + * + * @return the first banker. + */ + public NPC getFirstBanker() { + return getNpc(2568); + } + + /** + * Gets the second banker. + * + * @return the second banker. + */ + public NPC getSecondBanker() { + return getNpc(2569); + } + + /** + * Gets the last banker. + * + * @return the last banker. + */ + public NPC getLastBanker() { + return getNpc(2570); + } + + /** + * Method used to walk an npc. + * + * @param npc + * the npc. + * @param location + * the location. + */ + private void walk(NPC npc, final Location location) { + Pathfinder.find(npc, location, true, Pathfinder.DUMB).walk(npc); + } + + /** + * Method used to kill an npc. + * + * @param npc + * the npc. + */ + private void die(NPC npc) { + npc.getAnimator().reset(); + npc.animate(DEATH_ANIMATION); + npc.graphics(SHOCK_GRAPHIC); + npc.getImpactHandler().manualHit(npc, npc.getSkills().getLifepoints(), HitsplatType.NORMAL); + } + + /** + * Method used to cast a shock. + * + * @param target + * the target. + */ + private void castShock(Node target) { + getWiseOldMan().animate(CAST_ANIMATION); + getWiseOldMan().graphics(new Graphics(433)); + if (target instanceof Entity) { + Projectile.create(getWiseOldMan(), target instanceof Entity ? ((Entity) target) : null, 434).send(); + } else { + Projectile projectile = Projectile.create(getWiseOldMan(), null, 434, 30, 30, 41, 140, 0, 0); + projectile.setEndLocation((Location) target); + projectile.send(); + } + } + + /** + * Method used to cast the telekinetic grab spell. + */ + private void castTelekinetic() { + getWiseOldMan().animate(TELEKENTIC_ANIMATION); + getWiseOldMan().graphics(TELEKENTIC_GRAPHIC); + getWiseOldMan().getSkills().setStaticLevel(Skills.MAGIC, 99); + getWiseOldMan().getSkills().setLevel(Skills.MAGIC, 99); + SpellBookManager.SpellBook.MODERN.getSpell(65535).cast(getWiseOldMan(), GroundItemManager.get(PARTY_HAT.getId(), base.transform(20, 44, 0), player)); + } + + /** + * Method used to cast the thunder shock. + */ + private void castThunderShock() { + getWiseOldMan().animate(THUNDER_ANIMATION); + getWiseOldMan().graphics(PURPLE_GRAPHIC); + } + + /** + * Method used to handle the camera. + * + * @param x + * the x offset. + * @param y + * the y offset. + * @param xRot + * the xRotation. + * @param yRot + * the yRotation. + * @Param height the height. + */ + private void camera(int x, int y, int xRot, int yRot, int height, int speed) { + Location loc = base.transform(x, y, 0); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, loc.getX(), loc.getY(), height, 1, speed)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, loc.getX() + xRot, loc.getY() + yRot, height, 1, speed)); + } + + /** + * Method used to set npcs and their locations. + */ + private void setNpcs() { + for (NPC n : NPCS) { + n = NPC.create(n.getId(), n.getLocation(), n.getDirection()); + n.setLocation(base.transform(n.getLocation().getLocalX(), n.getLocation().getLocalY(), 0)); + n.setRespawn(false); + n.init(); + if (n.getName().equals("Banker")) { + n.getSkills().setStaticLevel(Skills.HITPOINTS, 15); + n.getSkills().setLevel(Skills.HITPOINTS, 15); + } + n.setWalks(false); + } + } + + /** + * Method used to clear all the npcs. + */ + private void clearNpcs() { + GameWorld.getPulser().submit(new Pulse(5) { + @Override + public boolean pulse() { + for (NPC n : region.getPlanes()[0].getNpcs()) { + n.clear(); + } + return true; + } + + }); + } + + /** + * Gets the npc. + * + * @param id + * the id. + * @return the npc. + */ + private NPC getNpc(int id) { + for (NPC n : region.getPlanes()[0].getNpcs()) { + if (n.getId() == id) { + return n; + } + } + return null; + } + + /** + * Represents the pulse used during recording. + * + * @author 'Vexia + * @version 1.0 + */ + public final class RecordingPulse extends Pulse { + + /** + * Represents the counter. + */ + private int counter; + + /** + * Constructs a new {@code FightPulse} {@code Object}. + */ + public RecordingPulse() { + super(1, player); + } + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + getCoolMom().animate(STEAL_ANIMATION); + getMarketGuard().getSkills().setStaticLevel(Skills.HITPOINTS, 99); + getMarketGuard().getSkills().setLifepoints(99); + getMarketGuard().sendChat("Hey! Get your hands off there!"); + getCoolMom().getLocks().lockMovement(1000); + getMarketGuard().getProperties().getCombatPulse().attack(getCoolMom()); + break; + case 8: + walk(getPurePker(), base.transform(20, 45, 0)); + break; + case 10: + camera(27, 43, -37, -3, 600, 5); + break; + case 12: + getQuiteDoll().sendChat("Thx"); + break; + case 14: + walk(getQuiteDoll(), base.transform(20, 42, 0)); + get1337().sendChat("Yw"); + getPurePker().faceLocation(base.getLocation().transform(19, 45, 0)); + break; + case 16: + getElfinocks().sendChat("Buying 2k nats - no noob offers"); + break; + case 20: + get1337().sendChat("I h4ve n4ts"); + break; + case 22: + getElfinocks().sendChat("You sell?"); + break; + case 25: + get1337().sendChat("Tr4de"); + get1337().faceTemporary(getElfinocks(), 5); + walk(get1337(), base.transform(21, 43, 0)); + break; + case 26: + camera(23, 49, -37, 0, 500, 3); + break; + case 28: + walk(getQuiteDoll(), base.transform(20, 49, 0)); + walk(getPurePker(), base.transform(16, 49, 0)); + break; + case 29: + walk(getOlivia(), base.transform(12, 48, 0)); + break; + case 36: + DoorActionHandler.handleAutowalkDoor(getWiseOldMan(), RegionManager.getObject(base.transform(16, 51, 0))); + break; + case 37: + getQuiteDoll().sendChat("Huh?"); + getQuiteDoll().faceTemporary(getWiseOldMan(), 2); + getWiseOldMan().sendChat("Please don't block my line of fire!"); + castShock(getPurePker()); + break; + case 38: + die(getPurePker()); + break; + case 39: + getOlivia().sendChat("Hey, what are you doing?"); + getWiseOldMan().faceTemporary(getOlivia(), 2); + GroundItemManager.create(ASHES, base.transform(16, 49, 0), player); + GroundItemManager.create(COINS, base.transform(16, 49, 0), player); + break; + case 42: + getWiseOldMan().sendChat("Olivia - Please go away!"); + getWiseOldMan().animate(SECOND_CAST_ANIMATION); + getWiseOldMan().graphics(TELE_OTHERS[0]); + break; + case 43: + getOlivia().animate(TELEPORT_ANIMATION); + getOlivia().graphics(TELE_OTHERS[1]); + getOlivia().sendChat("Eeeek!"); + GroundItemManager.destroy(GroundItemManager.get(ASHES.getId(), base.transform(16, 49, 0), player)); + break; + case 45: + getOlivia().setInvisible(true); + break; + case 48: + getWiseOldMan().sendChat("Ah, now I can get on with it..."); + getWiseOldMan().faceLocation(base.transform(16, 49, 0)); + break; + case 49: + getWiseOldMan().animate(PICK_UP_ANIMATION); + break; + case 50: + GroundItemManager.destroy(GroundItemManager.get(COINS.getId(), base.transform(16, 49, 0), player)); + break; + case 53: + castShock(base.transform(16, 46, 0)); + break; + case 55: + GameObject wall = RegionManager.getObject(base.transform(16, 46, 0)); + ObjectBuilder.replace(wall, wall.transform(9151, 0, 10)); + getWiseOldMan().getWalkingQueue().reset(); + getWiseOldMan().getWalkingQueue().addPath(base.getX() + 16, base.getY() + 46); + getWiseOldMan().getWalkingQueue().addPath(base.getX() + 17, base.getY() + 46); + break; + case 58: + camera(21, 38, -36, 43, 495, 99); + break; + case 59: + getWiseOldMan().sendChat("Could everyone please not move?"); + break; + case 62: + getFirstBanker().sendChat("Hey - you can't come in here!"); + walk(getFirstBanker(), base.transform(18, 46, 0)); + getFirstBanker().faceTemporary(getWiseOldMan(), 2); + getWiseOldMan().faceTemporary(getFirstBanker(), 2); + break; + case 64: + getWiseOldMan().animate(HIT_ANIMATION); + getFirstBanker().animate(BLOCK_ANIMATION); + getFirstBanker().getImpactHandler().manualHit(getWiseOldMan(), getFirstBanker().getSkills().getLifepoints(), HitsplatType.NORMAL); + getSecondBanker().sendChat("Oi!"); + getLastBanker().sendChat("Uh-oh!"); + getSecondBanker().getWalkingQueue().reset(); + getSecondBanker().getWalkingQueue().addPath(base.getX() + 17, base.getY() + 43); + getSecondBanker().getWalkingQueue().addPath(base.getX() + 16, base.getY() + 43); + getSecondBanker().getWalkingQueue().addPath(base.getX() + 16, base.getY() + 46); + break; + case 70: + walk(getLastBanker(), base.transform(18, 40, 0)); + getSecondBanker().faceTemporary(getWiseOldMan(), 2); + getSecondBanker().animate(new Animation(422)); + getWiseOldMan().animate(new Animation(403)); + getWiseOldMan().faceTemporary(getSecondBanker(), 2); + break; + case 73: + getWiseOldMan().animate(new Animation(401)); + getSecondBanker().animate(new Animation(435)); + getSecondBanker().getImpactHandler().manualHit(getWiseOldMan(), 11, HitsplatType.NORMAL); + break; + case 75: + getSecondBanker().animate(new Animation(422)); + NPC npc = getWiseOldMan(); + if (npc != null) { + getWiseOldMan().sendChat("I do wish you'd just stop it!"); + getWiseOldMan().animate(new Animation(403)); + } + break; + case 78: + getWiseOldMan().animate(new Animation(401)); + walk(getLastBanker(), base.transform(16, 40, 0)); + walk(getElfinocks(), base.transform(20, 44, 0)); + break; + case 80: + getWiseOldMan().faceLocation(base.transform(17, 43, 0)); + getLastBanker().faceTemporary(getWiseOldMan(), 1); + getSecondBanker().getImpactHandler().manualHit(getWiseOldMan(), getSecondBanker().getSkills().getLifepoints(), HitsplatType.NORMAL); + break; + case 85: + getWiseOldMan().faceLocation(base.transform(17, 43, 0)); + getElfinocks().sendChat("Hey - how'd he get in there?"); + break; + case 86: + camera(26, 40, -35, 13, 545, 32); + getLastBanker().sendChat("Help! Help!"); + get1337().sendChat("Hax!"); + get1337().faceLocation(base.transform(20, 43, 0)); + break; + case 90: + getWiseOldMan().sendChat("My sincerest regrets, dear lady..."); + break; + case 92: + getWiseOldMan().faceTemporary(getElfinocks(), 1); + castShock(getElfinocks()); + break; + case 94: + die(getElfinocks()); + break; + case 96: + GroundItemManager.create(ASHES, base.transform(20, 44, 0), player); + GroundItemManager.create(PARTY_HAT, base.transform(20, 44, 0), player); + break; + case 99: + getWiseOldMan().sendChat("And also you, sir..."); + GroundItemManager.destroy(GroundItemManager.get(ASHES.getId(), base.transform(20, 44, 0), player)); + break; + case 101: + castShock(get1337()); + walk(getQuiteDoll(), base.transform(21, 44, 0)); + break; + case 103: + getQuiteDoll().faceTemporary(getWiseOldMan(), 1); + break; + case 104: + getQuiteDoll().sendChat("How you do that?"); + die(get1337()); + break; + case 107: + GroundItemManager.create(ASHES, base.transform(21, 43, 0), player); + break; + case 109: + getWiseOldMan().sendChat("Oh dear - another one..."); + walk(getWiseOldMan(), base.transform(18, 46, 0)); + getWiseOldMan().faceTemporary(getQuiteDoll(), 1); + GroundItemManager.destroy(GroundItemManager.get(ASHES.getId(), base.transform(21, 43, 0), player)); + break; + case 110: + GroundItemManager.destroy(GroundItemManager.get(ASHES.getId(), base.transform(21, 43, 0), player)); + break; + case 111: + castShock(getQuiteDoll()); + break; + case 114: + die(getQuiteDoll()); + break; + case 115: + GroundItemManager.create(ASHES, base.transform(21, 44, 0), player); + getWiseOldMan().sendChat("Ooh - a party hat?"); + getWiseOldMan().faceLocation(base.transform(20, 44, 0)); + break; + case 116: + GroundItemManager.destroy(GroundItemManager.get(ASHES.getId(), base.transform(21, 44, 0), player)); + castTelekinetic(); + break; + case 118: + getWiseOldMan().transform(2567); + if (getOlivia().isActive()) { + getOlivia().getImpactHandler().manualHit(getMarketGuard(), getOlivia().getSkills().getLifepoints(), HitsplatType.NORMAL); + } + getMarketGuard().setInvisible(true); + break; + case 120: + getWiseOldMan().sendChat("Now, my dear..."); + walk(getWiseOldMan(), base.transform(18, 42, 0)); + break; + case 121: + getLastBanker().sendChat("Eeek!"); + break; + case 124: + getWiseOldMan().sendChat("Just give me the money, please."); + break; + case 126: + getMarketGuard().setInvisible(false); + getMarketGuard().getProperties().setTeleportLocation(base.transform(18, 46, 0)); + break; + case 127: + camera(25, 42, -20, 0, 400, 4); + getMarketGuard().sendChat("Old man, you're for da cage!"); + walk(getMarketGuard(), base.transform(18, 43, 0)); + break; + case 128: + getWiseOldMan().faceTemporary(getMarketGuard(), 1); + break; + case 129: + getWiseOldMan().sendChat("Oh, am I?"); + break; + case 131: + getWiseOldMan().sendChat("Ahh!"); + break; + case 133: + castThunderShock(); + break; + case 136: + getMarketGuard().graphics(THUNDER_GRAPHIC); + getMarketGuard().getImpactHandler().manualHit(getWiseOldMan(), 40, HitsplatType.NORMAL); + getMarketGuard().sendChat("Aaargh!"); + break; + case 138: + getWiseOldMan().sendChat("Yah!"); + getWiseOldMan().animate(WISE_JUMP); + break; + case 139: + getMarketGuard().animate(GUARD_JUMP); + break; + case 142: + getMarketGuard().clear(); + camera(24, 42, -20, 0, 400, 4); + break; + case 143: + getWiseOldMan().sendChat("And YOU can stop spying on me!"); + getWiseOldMan().faceLocation(base.transform(24, 42, 0)); + break; + case 145: + getWiseOldMan().animate(STOMP_ANIM); + Projectile projectile = Projectile.create(getWiseOldMan(), null, 434, 50, 130, 41, 140, 0, 0); + projectile.setEndLocation((Location) base.transform(24, 42, 0)); + projectile.send(); + break; + case 148: + player.getInterfaceManager().open(CRACKED); + break; + case 150: + DBRCutscenePlugin.this.stop(true); + return true; + } + return !player.isActive(); + } + + @Override + public void stop() { + super.stop(); + clearNpcs(); + } + + /** + * Gets the counter. + * + * @return the counter. + */ + public int getCounter() { + return counter; + } + } + + /** + * Represents an npc during the draynor bank recording cutscene. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class DBRecordingNPC extends AbstractNPC { + + /** + * Represents the ids to use. + */ + private static final int[] IDS = new int[] { 2579 }; + + /** + * Constructs a new {@code DBRecordingNPC} {@code Object}. + */ + public DBRecordingNPC() { + super(0, null, false); + } + + /** + * Constructs a new {@code DBRecordingNPC} {@code Object}. + * + * @param id + * the id. + * @param location + * the locastion. + */ + private DBRecordingNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DBRecordingNPC(id, location); + } + + @Override + public void init() { + super.init(); + getSkills().setLevel(Skills.ATTACK, 1); + getSkills().setStaticLevel(Skills.ATTACK, 1); + getSkills().setLevel(Skills.DEFENCE, 2); + getSkills().setStaticLevel(Skills.DEFENCE, 2); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + return true; + } + + @Override + public int[] getIds() { + return IDS; + } + } + + public static final class BluePhatItem extends ItemPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + register(PARTY_HAT.getId()); + return this; + } + + @Override + public boolean canPickUp(Player player, GroundItem item, int type) { + if (type == 1) { + player.sendMessage("Nice try ;)"); + } + return false; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/cutscene/GECutscenePlugin.java b/Server/src/main/java/Server/core/game/content/cutscene/GECutscenePlugin.java new file mode 100644 index 000000000..bdd679d68 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/cutscene/GECutscenePlugin.java @@ -0,0 +1,556 @@ +package core.game.content.cutscene; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.ge.GEGuidePrice; +import core.game.ge.GEGuidePrice.GuideType; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the cutscene used for the grand exchange tutorial. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GECutscenePlugin extends CutscenePlugin { + + /** + * Represents the main g.e interface. + */ + private static final Component MAIN_INTERFACE = new Component(106); + + /** + * Represents the config offer interface. + */ + private static final Component CONFIRM_INTERFACE = new Component(108); + + /** + * Represents the choose item interface. + */ + private static final Component CHOOSE_ITEM = new Component(110); + + /** + * Represents the hour glass interface. + */ + private static final Component HOUR_GLASS = new Component(646); + + /** + * Constructs a new {@code GECutscenePlugin} {@code Object}. + */ + public GECutscenePlugin() { + this(null); + } + + /** + * Constructs a new {@code GECutscenePlugin} {@code Object}. + * @param player the player. + */ + public GECutscenePlugin(final Player player) { + super("ge tutorial"); + this.player = player; + } + + @Override + public void open() { + player.setAttribute("ge-stage", 0); + player.setAttribute("ge-cutscene", this); + camera(3164, 3455, 0, 0, 800, 100); + player.lock(); + player.getDialogueInterpreter().sendDialogue(" - The Grand Exchange - "); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new GECutscenePlugin(p); + } + + @Override + public void register() { + new BrugsenBursenDialogue().init(); + try { + new TutorialInterfacePlugin().newInstance(null); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + + } + + /** + * Method used to handle the camera. + * @param x the x offset. + * @param y the y offset. + * @param xRot the xRotation. + * @param yRot the yRotation. + * @Param height the height. + */ + private static void camera(final Player player, int x, int y, int xRot, int yRot, int height, int speed) { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x, y, height, 1, speed)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + xRot, y + yRot, height, 1, speed)); + } + + /** + * Method used to handle the camera. + * @param x the x pos. + * @param y the y pos. + * @param xRot the xRot. + * @param yRot the yRot. + * @param height the height. + * @param speed the speed. + */ + private final void camera(int x, int y, int xRot, int yRot, int height, int speed) { + camera(player, x, y, xRot, yRot, height, speed); + } + + /** + * Represents the brugsen bursen dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ + public static final class BrugsenBursenDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BrugsenBursenDialogue} {@code Object}. + */ + public BrugsenBursenDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BrugsenBursenDialogue} {@code Object}. + * @param player the player. + */ + public BrugsenBursenDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BrugsenBursenDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (!player.getSavedData().getGlobalData().isGeTutorial()) { + player("What is this place?"); + stage = 0; + } else { + npc("It's the young entrepreneur! How can I help you?"); + stage = 112; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Well, this is the fantastic Grand Exchange!"); + stage = 1; + break; + case 1: + npc("I am only too happy to help teach you everything you", "could possibly want to know. The Tutor nearby can", "give a brief introduction, too, but he's not as fun as me!"); + stage = 2; + break; + case 2: + options("I want to know everything from you!", "I'd rather speak to the Tutor and get a plain idea.", "I'm not interested in either!"); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("I want to know everything from you!"); + stage = 10; + break; + case 2: + player("I'd rather speak to the Tutor and get a plain idea."); + stage = 20; + break; + case 3: + player("I'm not interested in either!"); + stage = 30; + break; + } + break; + case 10: + npc("Hahaha! Well, let's begin, my friend!"); + stage = 11; + break; + case 11: + close(); + ActivityManager.start(player, "ge tutorial", false); + stage = 100;// room for g.e cutscene + break; + case 20: + npc("Fine, have it your way."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + npc("Okay, if you ever need help don't", "hesitated to ask me."); + stage = 31; + break; + case 31: + end(); + break; + case 100: + close(); + camera(player, 3149, 3470, 1, 1, 870, 10); + GameWorld.getPulser().submit(new Pulse(16, player) { + @Override + public boolean pulse() { + npc("Welcome, my friend to the Grand Exchange! From", "here you can simply tell us what you want to buy or", "sell and for how much, and we'll pair you up with", "another player and make the trade!"); + stage = 101; + return true; + } + }); + break; + case 101: + camera(player, 3172, 3465, -20, 210, 870, 20); + npc("Let me start by telling you how to buy and sell items.", "They are both quite similar, and can be explained in", "five simple steps."); + stage = 102; + break; + case 102: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 580, 1, 100)); + final CutscenePlugin cutscene = player.getAttribute("ge-cutscene", null); + cutscene.stop(false); + player.getSavedData().getGlobalData().setGeTutorial(true); + npc("Step 1: You decide what to buy or sell and come here", "with the items to sell or the money to buy with."); + stage = 103; + break; + case 103: + npc("Step 2: Speak with one of the clerks, behind the desk in", "the middle of the building and you'll place an offer as", "follows..."); + stage = 104; + break; + case 104: + close(); + player.getPacketDispatch().sendString("First! you all see a selection of boxes, each of which represent a possible offer you can place.", 106, 124); + player.getInterfaceManager().open(MAIN_INTERFACE); + for (int i = 0; i < 130; i++) { + player.getPacketDispatch().sendInterfaceConfig(106, i, false); + } + int[] childs = new int[] { 33, 56, 57, 64, 98, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }; + for (int i : childs) { + player.getPacketDispatch().sendInterfaceConfig(106, i, true); + } + stage = 105; + break; + case 105: + npc("Step 3: The clerks will have taken the items or money", "off you and will look for someone to complete the trade."); + stage = 106; + break; + case 106: + npc("Step 4: You then need to wait perhaps a matter of", "moments or maybe days until someone is looking for", "what you have offered."); + stage = 107; + break; + case 107: + close(); + player.getInterfaceManager().open(HOUR_GLASS); + stage = 108; + break; + case 108: + npc("To see costs of commonly traded items, you can talk to", "one of the characters around the outside of the building."); + stage = 109; + break; + case 109: + npc("Taking note of past successes and failures is important, ", "so the clerks will show you your previous buy and sell", "attempts on the Grand Exchange."); + stage = 110; + break; + case 110: + npc("There's a lot to learn, but you're now free to use the", "Grand Exchange. If you speak with me further I'm", "more than happy to repeat this tutorial and give more", "information."); + stage = 111; + break; + case 111: + npc("This extra information will be crucial if you wish to", "make the best deals!"); + stage = 112; + break; + case 112: + options("Can you teach me about the Grand Exchange again?", "Can you tell me more about how the system works?", "Can you tell me prices for common items, like....", "Where did the Grand Exchange come from?"); + stage = 113; + break; + case 113: + switch (buttonId) { + case 1: + player("Can you teach me about the Grand Exchange again?"); + stage = 210; + break; + case 2: + player("Can you tell me more about how the system works?"); + stage = 220; + break; + case 3: + player("Can you tell me prices for common items, like...."); + stage = 230; + break; + case 4: + player("Where did the Grand Exchange come from?"); + stage = 240; + break; + } + break; + case 210: + npc("Hahaha. It would be my absolute pleasure!"); + stage = 11; + break; + case 220: + npc("Oh, I simply love passing on knowledge. Okay, let me hit", "you with some facts..."); + stage = 221; + break; + case 221: + npc("The Grand Exchange calculated a guide price for each", "item that can be traded through it, based on the price", "people paid for that item over the previous days."); + stage = 222; + break; + case 222: + npc("An item just a suggestion value, you can", "offer any price you like when setting up your bids."); + stage = 223; + break; + case 223: + end(); + break; + case 230: + options("The price of ores.", "The price of runes.", "The price of logs.", "The price of herbs.", "The price of weapons and armour."); + stage = 231; + break; + case 231: + switch (buttonId) { + case 1: + player("The price of ores."); + stage = 310; + break; + case 2: + player("The price of runes."); + stage = 320; + break; + case 3: + player("The price of logs."); + stage = 330; + break; + case 4: + player("The price of herbs."); + stage = 340; + break; + case 5: + player("The price of weapons and armour."); + stage = 350; + break; + } + break; + case 310: + npc("By all means, but you can probably get at this", "information quicker by visiting Farid M."); + stage = 311; + break; + case 311: + end(); + GEGuidePrice.open(player, GuideType.ORES); + break; + case 320: + npc("My pleasure, but you can probably get this", "information quicker by visitng Murky Matt."); + stage = 321; + break; + case 321: + end(); + GEGuidePrice.open(player, GuideType.RUNES); + break; + case 330: + npc("Sure thing, but you can probably get this", "information quicker by visiting Relobo."); + stage = 331; + break; + case 331: + end(); + GEGuidePrice.open(player, GuideType.LOGS); + break; + case 340: + npc("Of course, but you can probably get at this", "information quicker by visiting Bob Barter."); + stage = 341; + break; + case 341: + end(); + GEGuidePrice.open(player, GuideType.HERBS); + break; + case 350: + npc("That's easy, but you can probably get at this", "information quicker by visiting Hofuthand."); + stage = 351; + break; + case 351: + end(); + GEGuidePrice.open(player, GuideType.WEAPONS_AND_ARMOUR); + break; + case 240: + npc("I'm glad you ask! I like telling this story. Are you sitting", "comfortably?"); + stage = 241; + break; + case 241: + player("Erm, I'll stand if that's okay."); + stage = 242; + break; + case 242: + npc("Fine. *Ahem* I shall tell you a story of hard work,", "dedication and success. I grew up here in Varrock", "at my parent's general store. I got a good feel for how", "the price of items would rise and fall depending on supply"); + stage = 243; + break; + case 243: + npc("and demand; I always found it interesting how", "items would go from one person to another, in this long", " chain of transactions."); + stage = 244; + break; + case 244: + player("So you lived here?"); + stage = 245; + break; + case 245: + npc("Oh, yes. I'd never consider leaving. Anyway, as I became", "an adult, I got to know other shop owners around Varrock", "along with the rich traders that would exchange vast", "quantities of items in one go."); + stage = 246; + break; + case 246: + player("How do you class a big quantity?"); + stage = 247; + break; + case 247: + npc("Well, the quantities are always increasing, I", "remember the day when you could buy some cooked shark", "for five coins!"); + stage = 248; + break; + case 248: + player("Impossible!"); + stage = 249; + break; + case 249: + npc("Nope. Straight up. Anyway. I organised a group of us to", "meet each week to see what deals could be made. It", "seemed to work so well and we developed a system that", "become so popular, that each meeting would a see a variety"); + stage = 250; + break; + case 250: + npc("of new people joining. I kept improving the system that", "I had created, but soon it became too big a thing to", "manage."); + stage = 251; + break; + case 251: + player("I can imagine!"); + stage = 252; + break; + case 252: + npc("So, in the end, I decided why not make this a " + GameWorld.getSettings().getName() + "-", "wide phenomenon? Make it public and allow anyone to join", "in. Up to this point, it catered for people buying and selling", "large quantities, but I knew it would work on a smaller"); + stage = 253; + break; + case 253: + npc("scale."); + stage = 254; + break; + case 254: + npc("And I was also in for a bit of luck. You see, one of the", "initial patrons had deep connections to the banks of", "" + GameWorld.getSettings().getName() + ". Together, I think you'll agree we have a most", "friendly system."); + stage = 255; + break; + case 255: + player("I feel quite exited now! I have a strange urge to shout", "'Buy, buy, sell, sell!'"); + stage = 256; + break; + case 256: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6522 }; + } + + } + + /** + * Represents the interface plugin for the tutorial. + * @author 'Vexia + * @version 1.0 + */ + public final class TutorialInterfacePlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + int[] ids = new int[] { 106, 108, 110, 646 }; + for (int id : ids) { + ComponentDefinition.forId(id).setPlugin(this); + } + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (component.getId()) { + case 106: + switch (button) { + case 145:// next + if (player.getAttribute("ge-stage", 0) == 0) { + player.getPacketDispatch().sendInterfaceConfig(106, 131, false); + player.getPacketDispatch().sendString("Upon clicking on one of the boxes you will see two buttons appear - one to make a buy offer and one to make a sell offer", 106, 124); + player.setAttribute("ge-stage", 1); + } else if (player.getAttribute("ge-stage", 0) == 4) { + player.setAttribute("ge-stage", 5); + player.getInterfaceManager().close(); + player.getDialogueInterpreter().sendDialogues(6522, null, "Sellig items is a very much similar process, just that", "you are picking an item you already have."); + } else { + player.getPacketDispatch().sendString("If you selected the buy option you would the see this screen. Here you define what you buy by clicking on the box with the magnifying glass and choosing an item.", 110, 89); + player.setAttribute("ge-stage", 2); + player.getInterfaceManager().open(CHOOSE_ITEM); + } + break; + } + break; + case 108: + player.setAttribute("ge-stage", 4); + player.getInterfaceManager().open(MAIN_INTERFACE); + for (int i = 0; i < 130; i++) { + player.getPacketDispatch().sendInterfaceConfig(106, i, false); + } + int[] childs = new int[] { 33, 56, 57, 64, 98, 131 }; + for (int i : childs) { + player.getPacketDispatch().sendInterfaceConfig(106, i, true); + } + player.getPacketDispatch().sendString("Now the offer is placed! You can click on this anytime you want to see the details of your offer. The progress is shown with a progress bar underndeath", 106, 124); + break; + case 110: + switch (button) { + case 92: + player.setAttribute("ge-stage", 3); + player.getInterfaceManager().open(CONFIRM_INTERFACE); + player.getPacketDispatch().sendString("In this example we have selected a staff of air. You can then define the quantity and cost before selecting the Confirm Offer button", 108, 94); + break; + } + break; + case 646: + switch (button) { + case 13: + player.getInterfaceManager().close(); + player.setAttribute("ge-stage", 5); + player.getDialogueInterpreter().sendDialogues(6522, null, "Step 5: When the trade is complete, we will let you", "know with a message and you can pick up your", "winnings by talking to the clerks or by visiting any", "banker in " + GameWorld.getSettings().getName() + "."); + break; + } + break; + } + return true; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/cutscene/JulietCutscenePlugin.java b/Server/src/main/java/Server/core/game/content/cutscene/JulietCutscenePlugin.java new file mode 100644 index 000000000..3e1645307 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/cutscene/JulietCutscenePlugin.java @@ -0,0 +1,118 @@ +package core.game.content.cutscene; + +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.build.DynamicRegion; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the romeo and juliet cutscene plugin. + * + * @author 'Vexia + * @date 31/12/2013 + */ +@Initializable +public final class JulietCutscenePlugin extends CutscenePlugin { + + /** + * Represents the location the player will return to. + */ + private static final Location SPAWN_LOCATION = Location.create(3166, 3431, 1); + + /** + * Constructs a new {@code JulietCutscenePlugin} {@code Object}. + */ + public JulietCutscenePlugin() { + this(null); + PluginManager.definePlugin(new JulietDialogue()); + } + + /** + * Constructs a new {@code JulietCutscenePlugin} {@code Object}. + */ + public JulietCutscenePlugin(final Player player) { + super("Juliet Cutscene"); + this.player = player; + } + + @Override + public boolean start(final Player player, final boolean login, Object... args) { + NPC juliet = NPC.create(637, base.transform(29, 39, 1)); + juliet.setWalks(false); + npcs.add(juliet); + npcs.add(NPC.create(3325, base.transform(29, 38, 1))); + npcs.add(NPC.create(3324, base.transform(26, 41, 1))); + final GameObject door = RegionManager.getObject(getBase().transform(29, 41, 1)); + ObjectBuilder.remove(door); + for (NPC npc : npcs) { + npc.init(); + } + return super.start(player, login, args); + } + + @Override + public void open() { + int x = player.getLocation().getX(); + int y = player.getLocation().getY(); + CameraContext rot = null; + CameraContext pos = null; + int height = 390; + int speed = 100; + int other = 1; + pos = new CameraContext(player, CameraType.POSITION, x, y - 4, height, other, speed); + rot = new CameraContext(player, CameraType.ROTATION, x, y - 4, height, other, speed); + PacketRepository.send(CameraViewPacket.class, pos); + PacketRepository.send(CameraViewPacket.class, rot); + for (NPC npc : npcs) { + npc.face(player); + } + npcs.get(1).face(npcs.get(0)); + player.face(npcs.get(0)); + player.getDialogueInterpreter().open(npcs.get(0).getId(), npcs.get(0), this); + player.lock(); + player.getLocks().lockMovement(1000000); + } + + @Override + public void configure() { + region = DynamicRegion.create(12597); + setRegionBase(); + registerRegion(region.getId()); + } + + @Override + public Location getStartLocation() { + return getBase().transform(30, 39, 1); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new JulietCutscenePlugin(p); + } + + @Override + public Location getSpawnLocation() { + return SPAWN_LOCATION; + } + + /** + * Gets the phillipia npc. + * + * @return the npc. + */ + public NPC getPhillipia() { + return npcs.get(1); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/cutscene/JulietDialogue.java b/Server/src/main/java/Server/core/game/content/cutscene/JulietDialogue.java new file mode 100644 index 000000000..dddc30d12 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/cutscene/JulietDialogue.java @@ -0,0 +1,569 @@ +package core.game.content.cutscene; + +import core.game.content.activity.ActivityManager; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the dialogue of the juliet NPC. + * @author 'Vexia + * @date 31/12/2013 + */ +public final class JulietDialogue extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Represents the juliet cutscene plugin. + */ + private JulietCutscenePlugin cutscene; + + /** + * Represents the cadava potion(next stage = 70) + */ + private static final Item POTION = new Item(756); + + /** + * Represents the drinking animation. + */ + private static final Animation DRINK_ANIM = new Animation(1327); + + /** + * Constructs a new {@code JulietDialogue} {@code Object}. + */ + public JulietDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JulietDialogue} {@code Object}. + * @param player the player. + */ + public JulietDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JulietDialogue(player); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest("Romeo & Juliet"); + npc = (NPC) args[0]; + if (args.length > 1) { + cutscene = (JulietCutscenePlugin) args[1]; + interpreter.sendDialogues(npc, null, "Oh, here's Phillipa, my cousin...she's in on the plot too!"); + stage = 2000; + return true; + } + switch (quest.getStage(player)) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Romeo, Romeo, wherefore art thou Romeo? Bold", "adventurer, have you seen Romeo on your travels?", "Skinny guy, a bit wishy washy, head full of poetry."); + stage = 0; + break; + case 10: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Juliet, I come from Romeo.", "He begs me to tell you that he cares still."); + stage = 700; + break; + case 20: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello Juliet!"); + stage = 100; + break; + case 30: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi Juliet, I have passed your message on to", "Romeo...he's scared half out of his wits at the news that", "your father wants to kill him."); + stage = 900; + break; + case 40: + interpreter.sendDialogues(player, null, "Hi Juliet, I've found Father Lawrence and he has a", "cunning plan. But for it to work, I need to seek the", "Apothecary!"); + stage = 236; + break; + case 50: + interpreter.sendDialogues(player, null, "Hi Juliet!"); + stage = 656; + break; + case 60: + if (!player.getInventory().contains(756, 1)) { + interpreter.sendDialogues(player, null, "Hi Juliet! I have an interesting propostion for", "you...suggested by Father Lawrence. It may be the", "only way you'll be able to escape from this house and", "be with Romeo."); + stage = 950; + } else { + interpreter.sendDialogues(player, null, "Hi Juliet! I have an interesting propostion for", "you...suggested by Father Lawrence. It may be the", "only way you'll be able to escape from this house and", "be with Romeo."); + stage = 950; + } + break; + case 70: + interpreter.sendDialogues(npc, null, "Quickly! Go and tell Romeo the plan!"); + stage = 1002; + break; + default: + npc(FacialExpression.ANGRY,"Oh, Romeo, that no good scoundrel!"); + stage = 22; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Romeo & Juliet"); + final NPC phil = cutscene != null ? cutscene.getPhillipia() : (NPC) Repository.findNPC(3325); + final NPC dad = cutscene != null ? cutscene.getNPCS().get(2) : (NPC) Repository.findNPC(3324); + switch (stage) { + case 2000: + interpreter.sendDialogues(npc, null, "She's going to make it seem even more convincing!"); + stage = 2001; + break; + case 2001: + interpreter.sendDialogues(phil, null, "Yes, I'm quite the actress! Good luck dear cousin!"); + stage = 2002; + break; + case 2002: + interpreter.sendDialogues(npc, null, "Right...bottoms up!"); + stage = 2003; + break; + case 2003: + close(); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 0: + npc.animate(DRINK_ANIM); + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.THINKING, "Urk!"); + stage = 2004; + return true; + } + return false; + } + + }); + break; + case 2004: + close(); + npc.animate(new Animation(836)); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 2: + interpreter.sendDialogues(phil, FacialExpression.THINKING, "Oh no...Juliet has...died!"); + stage = 2005; + return true; + } + return false; + } + + }); + break; + case 2005: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You might be more believable if you're not smiling when", "you say it..."); + stage = 2006; + break; + case 2006: + interpreter.sendDialogues(phil, FacialExpression.HALF_GUILTY, "Oh yeah...you might be right...ok, let's try again."); + stage = 2007; + break; + case 2007: + interpreter.sendDialogues(phil, FacialExpression.HALF_GUILTY, "Oh no...Juliet has...died?"); + stage = 2008; + break; + case 2008: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Perhaps a bit louder, like you're upset...that your cousin", "has died!"); + stage = 2009; + break; + case 2009: + interpreter.sendDialogues(phil, FacialExpression.HALF_GUILTY, "Right...yes...Ok, ok, I think I'm getting my motivation", "now. Ok, let's try this again!"); + stage = 2010; + break; + case 2010: + interpreter.sendDialogues(phil, FacialExpression.FURIOUS, "OH NO...JULIET HAS...DIED?....", "Ooooooohhhhhhh.....(sob).Juliet...my poor dead cousin!"); + stage = 2011; + break; + case 2011: + interpreter.sendDialogues(dad, null, "What's all that screaming?"); + stage = 2012; + break; + case 2012: + final Path path = Pathfinder.find(dad, player.getLocation().transform(0, 1, 0)); + path.walk(dad); + interpreter.sendDialogues(dad, null, "Oh no! My poor daughter...what has become of you?"); + stage = 2013; + break; + case 2013: + interpreter.sendDialogues(phil, FacialExpression.FURIOUS, "Poor Juliet...make preparations for her body to be", "placed in the Crypt..."); + stage = 2014; + break; + case 2014: + if (player.getInventory().remove(POTION)) { + quest.setStage(player, 70); + cutscene.stop(true); + end(); + } + break; + case 0: + interpreter.sendOptions("Select an Option", "Yes I've met him.", "No, I think I'd have remembered if I'd met him.", "I guess I could look for him for you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes I've met him."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, I think I'd have remembered if I'd met him."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I guess I could look for him for you."); + stage = 30; + break; + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, well that's a shame, I was hopping that you might", "deliver a message to him for me."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, but I don't even know what he looks like."); + stage = 22; + break; + case 22: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, that would be so wonderful of you!", "I'd be most grateful if you could please deliver a", "message to him?"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Certainly, I'll do it straight away."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Many thanks! Oh, i'm so very grateful. You may be", "our only hope."); + stage = 33; + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'd be most grateful if you could please deliver a", "message to him?"); + stage = 31; + break; + case 33: + if (!player.getInventory().add(new Item(755))) { + GroundItemManager.create(new GroundItem(new Item(755), npc.getLocation(), player)); + } + quest.setStage(player, 20); + player.getQuestRepository().syncronizeTab(player); + interpreter.sendItemMessage(755, "Juliet gives you a message."); + stage = 34; + break; + case 34: + end(); + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there...have you delivered the message to Romeo", "yet? What news do you have from my loved one?"); + stage = 101; + break; + case 101: + if (!player.getInventory().contains(755, 1) && !player.getBank().contains(755, 1)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hmmm, that's the thing about messages....they're so easy", "to misplace..."); + stage = 105; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, sorry, I've not had a chance to deliver it yet!"); + stage = 102; + } + break; + case 102: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, that's a shame. I've been waiting so patiently to", "hear some word from him."); + stage = 103; + break; + case 103: + end(); + break; + case 105: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How could you lose that message?", "It was incredibly important...and it took me an age to", "write! I used joined up writing and everything!"); + stage = 106; + break; + case 106: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Please, take this new message to him,", "and please don't loose it."); + stage = 107; + break; + case 107: + if (!player.getInventory().add(new Item(755))) { + GroundItemManager.create(new GroundItem(new Item(755), npc.getLocation(), player)); + } + quest.setStage(player, 20); + player.getQuestRepository().syncronizeTab(player); + interpreter.sendItemMessage(755, "Juliet gives you another message."); + stage = 108; + break; + case 108: + end(); + break; + case 900: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "yes, unfortunately my father is quite the hunter, you", "may have seen some the animal head trophies on the", "wall. And it would be so awful to see Romeo's head up", "there with them!"); + stage = 901; + break; + case 901: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I know what you mean..."); + stage = 902; + break; + case 902: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "...this hair colour will clash terribly with the rest of the", "decoration."); + stage = 903; + break; + case 903: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That's not what I was suggesting at all..."); + stage = 904; + break; + case 904: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I know, I know...I was just kidding."); + stage = 905; + break; + case 905: + interpreter.sendDialogues(player, null, "Anyway, don't worry because I'm on the case. I'm", "going to get some help from Father Lawrence."); + stage = 906; + break; + case 906: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh yes, I'm sure that Father Lawrence will come up", "with a solution. I hope you find him soon."); + stage = 907; + break; + case 907: + end(); + break; + case 700: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh how my heart soars to hear this news! Please take", "this message to him with great haste."); + stage = 701; + break; + case 701: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, I hope it's good news...he was quite upset when I", "left him."); + stage = 702; + break; + case 702: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "He's quite often upset...the poor sensitive soul. But I", "don't think he's going to take this news very well,", "however, all is not lost."); + stage = 703; + break; + case 703: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Everything is explained in the letter, would you be so", "kind and deliver it to him please?"); + stage = 704; + break; + case 704: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Certainly, I'll do so straight away."); + stage = 705; + break; + case 705: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Many thanks! Oh, I'm so very grateful. You may be", "our only hope."); + stage = 706; + break; + case 706: + if (!player.getInventory().add(new Item(755))) { + GroundItemManager.create(new GroundItem(new Item(755), npc.getLocation(), player)); + } + quest.setStage(player, 20); + player.getQuestRepository().syncronizeTab(player); + interpreter.sendItemMessage(755, "Juliet gives you a message."); + stage = 707; + break; + case 707: + end(); + break; + case 236: + interpreter.sendDialogues(npc, null, "Oh good! I knew Father Lawrence would come up with", "something. However, I don't know where the apothecary", "is...I hope you find him soon. My father's temper gets", "no better."); + stage = 237; + break; + case 237: + end(); + break; + case 656: + interpreter.sendDialogues(npc, null, "Hi " + player.getUsername() + ", how close am I to being with my true", "love Romeo?"); + stage = 657; + break; + case 657: + interpreter.sendDialogues(player, null, "Sorry, I still have to get a speical potion for you."); + stage = 658; + break; + case 658: + interpreter.sendDialogues(npc, null, "Oh, I hope it isn't a love potion because you would be", "wasting your time. My love for Romeo grows stronger", "every minute..."); + stage = 659; + break; + case 659: + interpreter.sendDialogues(player, null, "That must be because you're not with him..."); + stage = 660; + break; + case 660: + interpreter.sendDialogues(npc, null, "Oh no! I long to be close to my true love Romeo!"); + stage = 661; + break; + case 661: + interpreter.sendDialogues(player, null, "Well, ok then...I'll set about getting this potion as quickly", "as I can!"); + stage = 662; + break; + case 662: + interpreter.sendDialogues(npc, null, "Fair luck to you, the end is close."); + stage = 663; + break; + case 663: + end(); + break; + case 950: + interpreter.sendDialogues(npc, null, "Go on...."); + stage = 951; + break; + case 951: + if (!player.getInventory().containsItem(POTION)) { + interpreter.sendDialogues(player, null, "Let me go get the potion.."); + stage = 663; + } else { + interpreter.sendDialogues(player, null, "I have a Cadava potion here, suggested by Father", "Lawrence. If you drink it, it will make you appear dead!"); + stage = 952; + } + break; + case 952: + interpreter.sendDialogues(npc, null, "Yes..."); + stage = 953; + break; + case 953: + interpreter.sendDialogues(player, null, "And when you appear dead...your still and lifeless", "corpse will be removed to the crypt!"); + stage = 954; + break; + case 954: + interpreter.sendDialogues(npc, null, "Oooooh, a cold dark creepy crypt..."); + stage = 955; + break; + case 955: + interpreter.sendDialogues(npc, null, "...sounds just peachy!"); + stage = 956; + break; + case 956: + interpreter.sendDialogues(player, null, "Then...Romeo can steal into the crypt and rescure you", "just as you wake up!"); + stage = 957; + break; + case 957: + interpreter.sendDialogues(npc, null, "...and this is the great idea for getting me out of here?"); + stage = 958; + break; + case 958: + interpreter.sendDialogues(player, null, "To be fair, I can't take all the credit...in fact...it was all", "Father Lawrence's suggestion..."); + stage = 959; + break; + case 959: + interpreter.sendDialogues(npc, null, "Ok...if this is the best we can do...hand over the potion!"); + stage = 960; + break; + case 960: + interpreter.sendItemMessage(756, "You pass the suspicious potion to Juliet."); + stage = 961; + break; + case 961: + interpreter.sendDialogues(npc, null, "Wonderful! I just hope Romeo can remember to get", "me from the crypt."); + stage = 962; + break; + case 962: + interpreter.sendDialogues(npc, null, "Please go to Romeo and make sure he understands.", "Although I love his gormless, lovelorn soppy ways, he", "can be a bit dense sometimes and I don't want to wake", "up in that crypt on my own."); + stage = 963; + break; + case 963: + interpreter.sendDialogues(npc, null, "Before I swig this potion down, let me stand on the", "balcony so that I might see the sun one last time before", "I am commited to the crypt."); + stage = 964; + break; + case 964: + end(); + ActivityManager.start(player, "Juliet Cutscene", false); + break; + case 965: + interpreter.sendDialogues(npc, null, "She's going to make it seem even more convincing!"); + stage = 966; + break; + case 966: + interpreter.sendDialogues(phil, null, "Yes, I'm quite the actress! Good luck dear cousin!"); + stage = 967; + break; + case 967: + interpreter.sendDialogues(npc, null, "Right...buttoms up!"); + stage = 968; + break; + case 968: + npc.animate(npc.getProperties().getDeathAnimation()); + interpreter.sendDialogues(npc, null, "Urk!"); + stage = 969; + break; + case 969: + interpreter.sendDialogues(phil, null, "Oh no...Juliet has...died!"); + stage = 970; + break; + case 970: + interpreter.sendDialogues(player, null, "You might be more believable if you're not smiling when", "you say it..."); + stage = 971; + break; + case 971: + interpreter.sendDialogues(phil, null, "Oh yeah...you might be right...ok, let's try again."); + stage = 972; + break; + case 972: + interpreter.sendDialogues(phil, null, "Oh no...Juliet has...died?"); + stage = 973; + break; + case 973: + interpreter.sendDialogues(player, null, "Perhaps a bit louder, like you're upset...that your cousin", "has died!"); + stage = 974; + break; + case 974: + interpreter.sendDialogues(phil, null, "Right...yes...Ok, ok, I think I'm getting my motivation", "now. Ok, let's try this again!"); + stage = 975; + break; + case 975: + interpreter.sendDialogues(phil, null, "OH NO...JULIET HAS...DIED?...", "Ooooooohhhhhh...(sob), (sob).Juliet...my poor dead cousin!"); + stage = 976; + break; + case 976: + interpreter.sendDialogues(dad, null, "What's all that screaming?"); + stage = 977; + break; + case 977: + interpreter.sendDialogues(dad, null, "Oh no! My poor daughter...what has become of you?"); + stage = 978; + break; + case 978: + interpreter.sendDialogues(phil, null, "Poor Juliet...make preparations for her body to be", "placed in the Crypt..."); + stage = 979; + break; + case 979: + end(); + break; + case 1002: + interpreter.sendDialogues(player, null, "I'm on my way!"); + stage = 979; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 637 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/cutscene/OrganCutScene.java b/Server/src/main/java/Server/core/game/content/cutscene/OrganCutScene.java new file mode 100644 index 000000000..387a6226a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/cutscene/OrganCutScene.java @@ -0,0 +1,94 @@ +package core.game.content.cutscene; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.build.DynamicRegion; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.plugin.Initializable; +import core.net.packet.out.CameraViewPacket; + +/** + * Represents the organ cutscene. + * @author 'Vexia + */ +@Initializable +public final class OrganCutScene extends CutscenePlugin { + + /** + * Constructs a new {@code OrganCutScene} {@code Object}. + */ + public OrganCutScene() { + super("organ cutscene"); + } + + /** + * Constructs a new {@code OrganCutScene} {@code Object}. + * @param player the player. + */ + public OrganCutScene(final Player player) { + super("organ cutscene"); + this.player = player; + } + + @Override + public void open() { + final GameObject orgin = RegionManager.getObject(base.transform(43, 14, 0)); + final GameObject newOrgin = new GameObject(36979, base.transform(42, 14, 0)); + ObjectBuilder.remove(orgin); + ObjectBuilder.add(newOrgin); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 2, player.getLocation().getY() - 7, 405, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 1, player.getLocation().getY(), 405, 1, 100)); + player.lock(); + GameWorld.getPulser().submit(new Pulse(3) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendObjectAnimation(RegionManager.getObject(base.transform(42, 14, 0)), new Animation(9841)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 2, player.getLocation().getY() - 3, 400, 1, 1)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 1, player.getLocation().getY(), 400, 1, 1)); + return true; + } + }); + GameWorld.getPulser().submit(new Pulse(30) { + @Override + public boolean pulse() { + unpause(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 16); + return true; + } + }); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new OrganCutScene(p); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return base.transform(42, 14, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(12850); + setRegionBase(); + registerRegion(region.getId()); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/cutscene/RJCutscenePlugin.java b/Server/src/main/java/Server/core/game/content/cutscene/RJCutscenePlugin.java new file mode 100644 index 000000000..b42019fb2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/cutscene/RJCutscenePlugin.java @@ -0,0 +1,833 @@ +package core.game.content.cutscene; + +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.plugin.Initializable; +import core.net.packet.out.CameraViewPacket; + +/** + * Represents the romeo and juliet cutscene plugin. + * + * @author 'Vexia + * @date 31/12/2013 + */ +@Initializable +public final class RJCutscenePlugin extends CutscenePlugin { + + /** + * Represents the location the player will return to. + */ + private static final Location SPAWN_LOCATION = Location.create(3211, 3424, 0); + + /** + * Constructs a new {@code RJCutscenePlugin} {@code Object}. + */ + public RJCutscenePlugin() { + this(null); + } + + /** + * Constructs a new {@code RJCutscenePlugin} {@code Object}. + */ + public RJCutscenePlugin(final Player player) { + super("Romeo & Juliet Cutscene"); + this.player = player; + } + + @Override + public boolean start(final Player player, final boolean login, Object... args) { + final NPC romeo = NPC.create(639, base.transform(30, 37, 0)); + romeo.setDirection(Direction.EAST); + romeo.faceLocation(getBase().transform(30, 38, 0)); + romeo.getLocks().lockMovement(10000); + romeo.setWalks(false); + npcs.add(NPC.create(639, base.transform(30, 37, 0))); + for (NPC npc : npcs) { + npc.init(); + } + return super.start(player, login, args); + } + + @Override + public void open() { + npcs.get(0).lock(); + player.getDialogueInterpreter().open(npcs.get(0).getId(), npcs.get(0), this); + int x = player.getLocation().getX(); + int y = player.getLocation().getY(); + CameraContext rot = null; + CameraContext pos = null; + int height = 450; + int speed = 100; + int other = 1; + pos = new CameraContext(player, CameraType.POSITION, x - 5, y - 4, height, other, speed); + rot = new CameraContext(player, CameraType.ROTATION, x + 2, y, height, other, speed); + PacketRepository.send(CameraViewPacket.class, pos); + PacketRepository.send(CameraViewPacket.class, rot); + player.lock(); + player.getLocks().lockMovement(1000000); + } + + @Override + public void configure() { + region = DynamicRegion.create(9288); + setRegionBase(); + registerRegion(region.getId()); + } + + @Override + public void fade() { + player.getQuestRepository().getQuest("Romeo & Juliet").finish(player); + } + + @Override + public void register() { + new RomeoDialogue().init(); + } + + @Override + public Location getStartLocation() { + return getBase().transform(30, 38, 0); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new RJCutscenePlugin(p); + } + + @Override + public Location getSpawnLocation() { + return SPAWN_LOCATION; + } + + /** + * Gets the phillipia npc. + * + * @return the npc. + */ + public NPC getPhillipia() { + return npcs.get(1); + } + + /** + * Represents the plugin used to handle the romeo dialogue. + * + * @author 'Vexia + * @date 31/12/2013 + */ + public class RomeoDialogue extends DialoguePlugin { + + /** + * Represents the cutscene instance. + */ + private RJCutscenePlugin cutscene; + + /** + * Represents the phil npc. + */ + private NPC phill; + + /** + * Constructs a new {@code RomeoDialogue} {@code Object}. + */ + public RomeoDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code RomeoDialogue} {@code Object}. + * + * @param player + * the player. + */ + public RomeoDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 639 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + Quest quest = player.getQuestRepository().getQuest("Romeo & Juliet"); + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "No sorry. I haven't seen her.", "Perhaps I could help to find her for you?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No sorry. I haven't seen her."); + stage = 200; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Perhaps I can help find her for you? What does she", "look like?"); + stage = 10; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh would you? That would be great! She has this sort", "of hair..."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hair...check.."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "...and she these...great lips..."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Lips...right."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh and she has these lovley shoulders as well.."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Shoulders...right so she has hair, lips and shoulders...that", "should cut it down a bit."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh yes, Juliet Is very different...please tell her that she", "is the love of my long and that I life to be with her?"); + stage = 17; + break; + case 17: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What?", "Surely you mean that 'she is the love of your life and", "that you long to be with her?"); + stage = 18; + break; + case 18: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh yeah...what you said...tell her that, it sounds much", "bettter!", "Oh you're so good at this!"); + stage = 19; + break; + case 19: + interpreter.sendOptions("Select an Option", "Yes okay, I'll let her know.", "Sorry Romeo, I've got better things to do right now but", "maybe later?"); + stage = 20; + break; + case 20: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, ok, I'll let her know."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry Romeo, I've got better things to do right now but maybe latter?"); + stage = 50; + break; + case 3: + end(); + break; + } + break; + case 100: + quest.setStage(player, 10); + player.getQuestRepository().syncronizeTab(player); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh great! And tell her that I want to kiss her a give."); + stage = 101; + break; + case 101: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You mean you want to give her a kiss!"); + stage = 102; + break; + case 102: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh you're good...you are good!"); + stage = 103; + break; + case 103: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I see I've picked a true professional...!"); + stage = 104; + break; + case 104: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ok, thanks."); + stage = 106; + break; + case 105: + switch (buttonId) { + case 1: + break; + case 2: + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ok, thanks."); + stage = 106; + break; + } + break; + case 106: + end(); + break; + case 200: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If you do see her please tell me!"); + stage = 201; + break; + case 201: + end(); + break; + case 230: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Please, oh please! Tell me where you have seen my juliet."); + stage = 231; + break; + case 231: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I found her alone on a balcony!"); + stage = 255; + break; + case 255: + end(); + break; + case 300: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh great! That is great news! Well done...well done...", "what a total success!"); + stage = 301; + break; + case 301: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, and she gave me a message to give you..."); + stage = 302; + break; + case 302: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ohh great! A message...wow!"); + stage = 303; + break; + case 303: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes!"); + stage = 304; + break; + case 304: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A message...oh, I can't wait to read what my dear Juliet", "has to say...."); + stage = 305; + break; + case 305: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I know...it's exiting isn't it...?"); + stage = 306; + break; + case 306: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes...yes..."); + stage = 307; + break; + case 307: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "..."); + stage = 308; + break; + case 308: + interpreter.sendDialogues(npc, FacialExpression.OLD_SNEAKY, "You've lost the message haven't you?"); + stage = 309; + break; + case 309: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yep, haven't got a clue where it is."); + stage = 310; + break; + case 310: + end(); + break; + case 400: + interpreter.sendItemMessage(755, "You hand over Juliet's message to Romeo."); + stage = 401; + break; + case 401: + interpreter.sendDialogues(npc, null, "Oh, a message! A message! I've never had a message", "before..."); + stage = 402; + break; + case 402: + interpreter.sendDialogues(player, null, "Really?"); + stage = 403; + break; + case 403: + interpreter.sendDialogues(npc, null, "No, no, not one!"); + stage = 404; + break; + case 404: + interpreter.sendDialogues(npc, null, "Oh, well, except for the occasional court summons."); + stage = 405; + break; + case 405: + interpreter.sendDialogues(npc, null, "But they're not really 'nice' messages. Not like this one!", "I'm sure that this message will be lovely."); + stage = 406; + break; + case 406: + interpreter.sendDialogues(player, null, "Well are you going to open it or not?"); + stage = 407; + break; + case 407: + interpreter.sendDialogues(npc, null, "Oh yes, yes, of course!", "'Dearest Romeo, I am very pleased that you sent", player.getUsername() + " to look for me and to tell me that you still", "hold affliction...', Affliction! She thinks I'm diseased?"); + stage = 408; + break; + case 408: + interpreter.sendDialogues(player, null, "'Affection?'"); + stage = 409; + break; + case 409: + interpreter.sendDialogues(npc, null, "Ahh yes...'still hold affection for me. I still feel great", "affection for you, but unfortunately my Father opposes", "our marriage.'"); + stage = 410; + break; + case 410: + interpreter.sendDialogues(player, null, "Oh dear...that doesn't sound too good."); + stage = 411; + break; + case 411: + interpreter.sendDialogues(npc, null, "What? '...great affection for you. Father opposes our.."); + stage = 412; + break; + case 412: + interpreter.sendDialogues(npc, null, "'...marriage and will..."); + stage = 413; + break; + case 413: + interpreter.sendDialogues(npc, null, "...will kill you if he sees you again!'"); + stage = 414; + break; + case 414: + interpreter.sendDialogues(player, null, "I have not be honest, it's not getting any better..."); + stage = 415; + break; + case 415: + interpreter.sendDialogues(npc, null, "'Our only hope is that Father Lawrence, our long time", "confidant, can help us in some way.'"); + stage = 416; + break; + case 416: + interpreter.sendItemMessage(755, "Romeo folds the message away."); + stage = 417; + break; + case 417: + interpreter.sendDialogues(npc, null, "Well, that's it then...we haven't got a chance."); + stage = 418; + break; + case 418: + interpreter.sendDialogues(player, null, "What about Father Lawrence?"); + stage = 419; + break; + case 419: + interpreter.sendDialogues(npc, null, "...our love is over...the great romance, the life of my", "love..."); + stage = 420; + break; + case 420: + interpreter.sendDialogues(player, null, "...or you could speak to Father Lawrence!"); + stage = 421; + break; + case 421: + interpreter.sendDialogues(npc, null, "Oh, my aching, breaking, heart...how useless the situation", "is now...we have no one to turn to..."); + stage = 422; + break; + case 422: + quest.setStage(player, 30); + player.getQuestRepository().syncronizeTab(player); + player.getInventory().remove(new Item(755)); + interpreter.sendDialogues(player, null, "FATHER LAWRENCE!"); + stage = 423; + break; + case 423: + interpreter.sendDialogues(npc, null, "Father Lawrence?"); + stage = 424; + break; + case 424: + interpreter.sendDialogues(npc, null, "Oh yes, Father Lawrence...he's our long time confidant,", "he might have a solution! yes, yes, you have to go and", "talk to Lather Fawrence for us and ask him if he's got", "any suggestions for our predicatment?"); + stage = 425; + break; + case 425: + interpreter.sendDialogues(player, null, "Where can I find Father Lawrence?"); + stage = 426; + break; + case 426: + interpreter.sendDialogues(npc, null, "Lawther Fawrence! Oh he's...."); + stage = 427; + break; + case 427: + interpreter.sendDialogues(npc, null, "You know he's not my 'real' Father don't you?"); + stage = 428; + break; + case 428: + interpreter.sendDialogues(player, null, "I think I suspected that he wasn't."); + stage = 429; + break; + case 429: + interpreter.sendDialogues(npc, null, "Well anyway...he tells these song, loring bermons...and", "keep these here Carrockian vitizens snoring in his", "church to the East North."); + stage = 430; + break; + case 430: + interpreter.sendOptions("Select an Option", "How are you?", "Where can I find Father Lawrence?", "Have you heard anything from Juliet?", "Ok, thanks."); + stage = 431; + break; + case 431: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "How are you?"); + stage = 500; + break; + case 2: + interpreter.sendDialogues(player, null, "Where can I find Father Lawrence?"); + stage = 530; + break; + case 3: + interpreter.sendDialogues(player, null, "Have you heard anything from Juliet?"); + stage = 560; + break; + case 4: + interpreter.sendDialogues(player, null, "Ok, thanks."); + stage = 580; + break; + } + break; + case 580: + end(); + break; + case 560: + interpreter.sendDialogues(npc, null, "Sadly not my friend! And what's worse, her Father has", "threatend to kill me if he sees me. I mean, that seems", "a bit harsh!"); + stage = 561; + break; + case 561: + interpreter.sendDialogues(player, null, "Well, I shouldn't worry too much...you can always run", "away if you see him..."); + stage = 562; + break; + case 562: + interpreter.sendDialogues(npc, null, "I just wish I could remember what he looks like! I live", "in fear of every man I see!"); + stage = 563; + break; + case 563: + interpreter.sendOptions("Select an Option", "How are you?", "Where can I find Father Lawrence?", "Have you heard anything from Juliet?", "Ok, thanks."); + stage = 431; + break; + case 530: + interpreter.sendDialogues(npc, null, "Lather Fawrence! Oh he's..."); + stage = 531; + break; + case 531: + interpreter.sendDialogues(npc, null, "You know he's not my 'real' Father don't you?"); + stage = 532; + break; + case 532: + interpreter.sendDialogues(player, null, "I think I suspected that he wasn't."); + stage = 533; + break; + case 533: + interpreter.sendDialogues(npc, null, "Well anyway...he tells these song, loring bermons...and", "keep these here Carrockian vitizens snoring in his", "church to the East North."); + stage = 534; + break; + case 534: + interpreter.sendOptions("Select an Option", "How are you?", "Where can I find Father Lawrence?", "Have you heard anything from Juliet?", "Ok, thanks."); + stage = 431; + break; + case 500: + interpreter.sendDialogues(npc, null, "Not so good my friend...I miss Judi..., Junie..., Jooopie..."); + stage = 501; + break; + case 501: + interpreter.sendDialogues(player, null, "Juliet?"); + stage = 502; + break; + case 502: + interpreter.sendDialogues(npc, null, "Juliet! I miss Juliet, terribly?"); + stage = 503; + break; + case 503: + interpreter.sendDialogues(player, null, "Hmmm, so I see!"); + stage = 504; + break; + case 504: + interpreter.sendOptions("Select an Option", "How are you?", "Where can I find Father Lawrence?", "Have you heard anything from Juliet?", "Ok, thanks."); + stage = 431; + break; + case 800: + interpreter.sendOptions("Select an Option", "How are you?", "Where can I find Father Lawrence?", "Have you heard anything from Juliet?", "Ok, thanks."); + stage = 431; + break; + case 236: + interpreter.sendDialogues(player, null, "Did not!"); + stage = 237; + break; + case 237: + interpreter.sendDialogues(npc, null, "Oh, come on, come on, what did he say?"); + stage = 238; + break; + case 238: + interpreter.sendDialogues(player, null, "He wants me to go to the Apothercary!"); + stage = 239; + break; + case 239: + interpreter.sendDialogues(npc, null, "The Apothecary?"); + stage = 240; + break; + case 240: + interpreter.sendDialogues(npc, null, "Oh...is he the one who mixes up all them magical potion-", "ey things?"); + stage = 241; + break; + case 241: + interpreter.sendDialogues(player, null, "Yeah, I think so...but the word potion-ey doesn't exist."); + stage = 242; + break; + case 242: + interpreter.sendDialogues(npc, null, "Well, you just used it...so I guess it does exist!"); + stage = 243; + break; + case 243: + interpreter.sendDialogues(player, null, "It doesn't matter...do you know where the Apothecary", "is?"); + stage = 244; + break; + case 244: + interpreter.sendDialogues(npc, null, "It is Wouth Sest of here and near a sword shop."); + stage = 245; + break; + case 245: + end(); + break; + case 326: + interpreter.sendDialogues(npc, null, "Oh hello, have you seen Lather Fawrence?"); + stage = 327; + break; + case 327: + interpreter.sendDialogues(player, null, "Yes, he's given me details of a potion which should help", "resolve this siution. The Apothecary is helping me", "prepare it."); + stage = 328; + break; + case 328: + interpreter.sendDialogues(npc, null, "Oooh, it all sounds horribly complicated?"); + stage = 329; + break; + case 329: + interpreter.sendDialogues(npc, null, "All I can say is I'll be glad when Juliet's finally in that", "crypt!"); + stage = 330; + break; + case 330: + interpreter.sendDialogues(player, null, "Spoken like a true lover!"); + stage = 331; + break; + case 331: + end(); + break; + case 350: + interpreter.sendDialogues(npc, null, "Ooohh, that's the potion is it?", "Rather you than me!"); + stage = 351; + break; + case 351: + interpreter.sendDialogues(player, null, "I'm not drinking it! It's for Juliet!"); + stage = 352; + break; + case 352: + end(); + break; + case 71: + interpreter.sendDialogues(npc, null, "Ah right, the potion! Great..."); + stage = 72; + break; + case 72: + interpreter.sendDialogues(npc, null, "What potion would that be then?"); + stage = 73; + break; + case 73: + interpreter.sendDialogues(player, null, "The Cadava potion...you know, the one which will make", "her appear dead! She's in the crypt, pop along and claim", "your true love."); + stage = 74; + break; + case 74: + interpreter.sendDialogues(npc, null, "But I'm scared...will you come with me?"); + stage = 75; + break; + case 75: + interpreter.sendDialogues(player, null, "Oh, ok...come on! I think I saw the entrance when I", "visited there last..."); + stage = 76; + break; + case 76: + end(); + ActivityManager.start(player, "Romeo & Juliet Cutscene", false); + player.lock(); + break; + case 456: + interpreter.sendDialogues(npc, null, "Her cousin and I are getting on well though. Thanks", "for your help."); + stage = 457; + break; + case 457: + end(); + break; + case 740: + interpreter.sendDialogues(player, null, "Oh, be quiet..."); + stage = 741; + break; + case 741: + interpreter.sendDialogues(player, null, "We're here. Look, Juliet is over there!"); + stage = 742; + break; + case 742: + close(); + Location ll = cutscene.getBase().transform(21, 36, 0); + int x = ll.getX(); + int y = ll.getY(); + CameraContext rot = null; + CameraContext pos = null; + int height = 450; + int speed = 55; + int other = 1; + pos = new CameraContext(player, CameraType.POSITION, x + 3, y + 4, height, other, speed); + rot = new CameraContext(player, CameraType.ROTATION, x - 1, y - 2, height, other, speed); + PacketRepository.send(CameraViewPacket.class, pos); + PacketRepository.send(CameraViewPacket.class, rot); + GameWorld.getPulser().submit(new Pulse(5) { + @Override + public boolean pulse() { + int x = player.getLocation().getX(); + int y = player.getLocation().getY(); + CameraContext rot = null; + CameraContext pos = null; + int height = 450; + int speed = 100; + int other = 1; + pos = new CameraContext(player, CameraType.POSITION, x - 5, y - 4, height, other, speed); + rot = new CameraContext(player, CameraType.ROTATION, x + 2, y, height, other, speed); + PacketRepository.send(CameraViewPacket.class, pos); + PacketRepository.send(CameraViewPacket.class, rot); + interpreter.sendDialogues(player, null, "You go over to her...and I'll go and wait over here..."); + stage = 743; + return true; + } + }); + break; + case 743: + interpreter.sendDialogues(npc, null, "Ohhh, ok then..."); + stage = 744; + break; + case 744: + Location l = cutscene.base.transform(18, 32, 0); + x = l.getX(); + y = l.getY(); + height = 330; + speed = 100; + other = 1; + pos = new CameraContext(player, CameraType.POSITION, x, y - 1, height, other, speed); + rot = new CameraContext(player, CameraType.ROTATION, x + 20, y + 50, height, other, speed); + PacketRepository.send(CameraViewPacket.class, pos); + PacketRepository.send(CameraViewPacket.class, rot); + close(); + npc.getWalkingQueue().reset(); + npc.getWalkingQueue().addPath(cutscene.getBase().transform(19, 35, 0).getX(), cutscene.getBase().transform(19, 35, 0).getY()); + GameWorld.getPulser().submit(new Pulse(12) { + @Override + public boolean pulse() { + interpreter.sendDialogues(npc, null, "Hey...Juliet..."); + stage = 745; + phill = NPC.create(3325, cutscene.getBase().transform(30, 37, 0)); + phill.init(); + cutscene.getNPCS().add(phill); + Path path = Pathfinder.find(phill, cutscene.getBase().transform(20, 35, 0)); + path.walk(phill); + return true; + } + }); + break; + case 745: + interpreter.sendDialogues(npc, null, "Juliet..."); + stage = 746; + break; + case 746: + interpreter.sendDialogues(npc, null, "Oh dear...you seem to be dead."); + stage = 747; + break; + case 747: + interpreter.sendDialogues(phill, null, "Hi Romeo...I'm Phillipa!"); + stage = 748; + break; + case 748: + npc.face(phill); + interpreter.sendDialogues(npc, null, "Wow! You're a fox!"); + stage = 749; + break; + case 749: + interpreter.sendDialogues(phill, null, "It's a shame about Juliet...but perhaps we can meet up", "later?"); + stage = 750; + break; + case 750: + interpreter.sendDialogues(npc, null, "Who's Juliet?"); + stage = 751; + break; + case 751: + end(); + cutscene.stop(true); + quest.finish(player); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RomeoDialogue(player); + } + + @Override + public boolean open(Object... args) { + Quest quest = player.getQuestRepository().getQuest("Romeo & Juliet"); + npc = (NPC) args[0]; + if (args.length > 1) { + cutscene = (RJCutscenePlugin) args[1]; + interpreter.sendDialogues(npc, null, "This is pretty scary..."); + stage = 740; + return true; + } + switch (quest.getStage(player)) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Juliet. Juliet, where art thou Juliet?", "Have you seen my Juliet?"); + stage = 0; + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Go and speak with Juliet!"); + stage = 457; + break; + case 20: + if (!player.getInventory().contains(755, 1)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Romeo...great news...I've been in touch with Juliet!"); + stage = 300; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Romeo...great news...I've been in touch with Juliet!", "She's written a message for you..."); + stage = 400; + } + break; + case 30: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hey again Romeo!"); + stage = 800; + break; + case 40: + interpreter.sendDialogues(npc, null, "Ooh did you manage to survive one of Lather", "Fawrences sermons? I bet not, you were ages! I bet", "you snoozed on the welcome mat just as soon as you", "heard his voice!"); + stage = 236; + break; + case 50: + interpreter.sendDialogues(player, null, "Hi Romeo!"); + stage = 326; + break; + case 60: + if (!player.getInventory().contains(756, 1)) { + interpreter.sendDialogues(player, null, "Hi Romeo!"); + stage = 326; + } else { + interpreter.sendItemMessage(756, "Romeo spots the Cadava potion."); + stage = 350; + } + break; + case 70: + interpreter.sendDialogues(player, null, "Romeo, it's all set. Juliet has drunk the potion and has", "been taken down into the Crypt...now you just need to", "pop along and collect her."); + stage = 71; + break; + case 100: + interpreter.sendDialogues(npc, null, "I heard Juliet had died. Terrible business."); + stage = 456; + break; + } + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AablaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/AablaDialogue.java new file mode 100644 index 000000000..e3c08a55d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AablaDialogue.java @@ -0,0 +1,137 @@ +package core.game.content.dialogue; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the npc aabla's dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AablaDialogue extends DialoguePlugin { + + /** + * Represents the npc animation to use. + */ + private static final Animation ANIMATION = new Animation(881); + + /** + * Constructs a new {@code AablaDialogue} {@code Object}. + */ + public AablaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AablaDialogue} {@code Object}. + * @param player the player. + */ + public AablaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AablaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Hi. How can I help?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Can you heal me?", "Do you see a lot of injured fighters?", "Do you come here often?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Can you heal me?"); + stage = 10; + break; + case 2: + player("Do you see a lot of injured fighters?"); + stage = 30; + break; + case 3: + player("Do you come here often?"); + stage = 20; + break; + } + break; + case 10: + npc("Of course!"); + stage = 11; + break; + case 11: + npc.faceTemporary(player, 2); + npc.animate(ANIMATION); + player.lock(4); + close(); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + if (player.getSkills().getLifepoints() == player.getSkills().getStaticLevel(Skills.HITPOINTS)) { + npc("You look healthy to me!"); + } else { + player.getSkills().heal(20); + npc("There you go!"); + } + stage = 12; + return true; + } + }); + break; + case 12: + end(); + break; + case 20: + npc("I work here, so yes!"); + stage = 21; + break; + case 21: + end(); + break; + case 30: + npc("Yes I do. Thankfully we can cope with almost aything.", "Jaraah really is a wonderful surgeon, his methods are a", "little unorthodox but he gets the job done."); + stage = 31; + break; + case 31: + npc("I shouldn't tell you this but his nickname is 'The", "Butcher'."); + stage = 32; + break; + case 32: + player("That's reassuring."); + stage = 33; + break; + case 33: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 959 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AbbotLangleyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/AbbotLangleyDialogue.java new file mode 100644 index 000000000..31004b87e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AbbotLangleyDialogue.java @@ -0,0 +1,166 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the abbot langley dialogue. + * @author Vexia + * @version 1.0 + */ +@Initializable +public final class AbbotLangleyDialogue extends DialoguePlugin { + + /** + * Represents the healing animation to use for the npc. + */ + private static final Animation ANIMATION = new Animation(717); + + /** + * Represents the healing craphics to use for the npc. + */ + private static final Graphics GRAPHICS = new Graphics(84); + + /** + * Constructs a new {@code AbbotLangleyDialogue} {@code Object}. + */ + public AbbotLangleyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AbbotLangleyDialogue} {@code Object}. + * @param player the player. + */ + public AbbotLangleyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AbbotLangleyDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length >= 1) { + if (args[0] instanceof NPC) { + npc = (NPC) args[0]; + } else { + npc("Only members of our order can go up there."); + stage = 23; + return true; + } + } + npc("Greetings traveller."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getSavedData().getGlobalData().isJoinedMonastery()) { + interpreter.sendOptions("Select an Option", "Can you heal me? I'm injured.", "Isn't this place built a bit out the way?"); + } else { + interpreter.sendOptions("Select an Option", "Can you heal me? I'm injured.", "Isn't this place built a bit out the way?", "How do I get further into the monastery?"); + } + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Can you heal me? I'm injured."); + stage = 10; + break; + case 2: + player("Isn't this place built a bit out of the way?"); + stage = 20; + break; + case 3: + player("How do I get further into the monastery?"); + stage = 30; + break; + } + break; + case 10: + npc("Ok."); + stage = 11; + break; + case 11: + player.getSkills().heal(((int) (player.getSkills().getStaticLevel(Skills.HITPOINTS) * 0.20))); + npc.animate(ANIMATION); + npc.graphics(GRAPHICS); + interpreter.sendDialogue("Abbot Langley places his hands on your head. You feel a little better."); + stage = 12; + break; + case 12: + end(); + break; + case 20: + npc("We like it that way actually! We get disturbed less. We still", "get rather a large amount of travellers looking for", "sanctuary and healing here as it is!"); + stage = 21; + break; + case 21: + end(); + break; + case 22: + npc("Only members of our order can go up there."); + stage++; + break; + case 23: + options("Well can I join your order?", "Oh, sorry."); + stage++; + break; + case 24: + switch (buttonId) { + case 1: + player("Well can I join your order?"); + stage = 26; + break; + case 2: + player("Oh, sorry."); + stage = 25; + break; + } + break; + case 25: + end(); + break; + case 26: + if (player.getSkills().getStaticLevel(Skills.PRAYER) < 31) { + npc("No. I am sorry, but I feel you are not devout enough."); + stage++; + } else { + npc("Ok, I see you are someone suitable for our order. You", "may join."); + stage = 31; + } + break; + case 27: + player.getPacketDispatch().sendMessage("You need a prayer level of 31 to join the order."); + end(); + break; + case 30: + npc("I'm sorry but only members of our order are allowed", "in the second level of the monastery."); + stage = 23; + break; + case 31: + player.getSavedData().getGlobalData().setJoinedMonastery(true); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 801 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AberabDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/AberabDialogue.kt new file mode 100644 index 000000000..54f9ccfb5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AberabDialogue.kt @@ -0,0 +1,36 @@ +package core.game.content.dialogue + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * Dialogue for Aberab + * @author qmqz + */ + +@Initializable +class AberabDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.CHILD_SUSPICIOUS,"Grr ... Get out of my way...") + stage = 99 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AberabDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1432) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AchiettiesDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/AchiettiesDialogue.kt new file mode 100644 index 000000000..48becf63d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AchiettiesDialogue.kt @@ -0,0 +1,35 @@ +package core.game.content.dialogue + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AchiettiesDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"Greetings. Welcome to the Heroes' Guild.") + stage = 99 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AchiettiesDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(796) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ActivateEnchantedGem.java b/Server/src/main/java/Server/core/game/content/dialogue/ActivateEnchantedGem.java new file mode 100644 index 000000000..a3858653d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ActivateEnchantedGem.java @@ -0,0 +1,47 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the enchanted gem related to slayer. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ActivateEnchantedGem extends OptionHandler { + + /** + * Constructs a new {@code ActivateEnchantedGem} {@Code Object}. + */ + public ActivateEnchantedGem() { + /** + * empty. + */ + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getSlayer().hasStarted()) { + player.getPacketDispatch().sendMessage("You try to activate the gem..."); + return true; + } + player.getDialogueInterpreter().open(77777); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(4155).getHandlers().put("option:activate", this); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AeonisigRaispher.java b/Server/src/main/java/Server/core/game/content/dialogue/AeonisigRaispher.java new file mode 100644 index 000000000..6309ba4ab --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AeonisigRaispher.java @@ -0,0 +1,154 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the npc Aeonisig Raispher dialogue plugin. + * @author 'Vexia + * @version 1.5 + * @note Found transcript on + * (http://2009scape.wikia.com/wiki/Aeonisig_Raispher/dialogue) + */ +@Initializable +public final class AeonisigRaispher extends DialoguePlugin { + + /** + * Represents the public id of this dialogue. + */ + public static final int ID = 4710; + + /** + * Constructs a new {@code AeonisigRaispher} {@code Object}. + */ + public AeonisigRaispher() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AeonisigRaispher} {@code Object}. + * @param player the player. + */ + public AeonisigRaispher(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AeonisigRaispher(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Please only talk to the King if it's important. He has a", "heavy burden to bear with the running of his Kingdom."); + stage = -1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case -1: + options("Who are you?", "What do you do here?", "Where did you come from?", "How did you come to be an advisor to King Roald?", "What is happening in the kingdom?"); + stage = -2; + break; + case -2: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 1; + break; + case 2: + player("What do you do here?"); + stage = 20; + break; + case 3: + player("Where did you come from?"); + stage = 30; + break; + case 4: + player("How did you come to be an advisor to King Roald?"); + stage = 40; + break; + case 5: + player("What is happening in the kingdom?"); + stage = 50; + break; + } + break; + case 20: + npc("My main function is to ensure that King Roald is apprised", "of all options, especially those that favour the", "righteous followers of Saradomin."); + stage = 21; + break; + case 21: + player("But surely the King should be able to make", "his own decisions on what's best for Misthalin?"); + stage = 22; + break; + case 22: + npc("What an interesting perspective you have! Totally", "unworkable of course, but interesting nonetheless."); + stage = 23; + break; + case 23: + end(); + break; + case 30: + npc("I took my religious and combat training in several parts", "of the known world. I've also fought despicable beasts", "in the wilderness in Saradomin's name. Needless to say I", "have great experienc in the ways of the world and am an"); + stage = 29; + break; + case 29: + npc("invaluable aid to his ordship's decision making process."); + stage = 31; + break; + case 31: + end(); + break; + case 40: + npc("The King of Misthalin, like any great leader, always", "requires the best advice and the best advisors. He very", "often summons occasional advisors to help him in", "certain situations, but it was felt by the Church"); + stage = 39; + break; + case 39: + npc("of Saradomin that a full time advisor on religious matters", "was needed to ensure fair treatement", "of Saradomin's followers."); + stage = 41; + break; + case 41: + player("How come he doesn't have an advisor for", "any other religious denominations?"); + stage = 42; + break; + case 42: + npc("Because I simply won't stand for it, that's why!", "Now, enough of your impertinent questions.", "I have work to do!"); + stage = 43; + break; + case 43: + end(); + break; + case 50: + npc("Nothing out of the usual."); + stage = 51; + break; + case 51: + end(); + break; + case 1: + npc("Apologies! Allow me to introduce myself. My", "name is Aeonisig Raispher, special advisor", "to King Roald on spiritual matters."); + stage = 2; + break; + case 2: + npc("It means that some decisions the King has to make might", "have unforeseen repercussions on the nation's spiritual", "sensibilities. My duty is to ensure that Saradomin", "ideals are not stomped underfoot."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AfflictedDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/AfflictedDialogue.kt new file mode 100644 index 000000000..0411bb398 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AfflictedDialogue.kt @@ -0,0 +1,42 @@ +package core.game.content.dialogue + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.tools.RandomFunction +import java.util.* +import java.util.Arrays + + +/** + * @author qmqz + */ + +@Initializable +class AfflictedDialogue : DialoguePlugin { + private val chats = arrayOf("ughugh", "knows'is", "knows'is", "nots", "pirsl", "wot's", "zurgle", "gurghl", "mee's", "seysyi", "sfriess", "says") + + override fun open(vararg args: Any): Boolean { + npc = args[0] as NPC + chats.shuffle() + interpreter.sendDialogues( npc, FacialExpression.ASKING, chats.copyOfRange(0, RandomFunction.random(1, 6)).contentToString() + .replace("[", "").replace("]", "").replace(",", "")) + return true + } + + constructor() + constructor(player: Player?) : super(player) + + override fun getIds(): IntArray { + return intArrayOf(1257, 1258, 1261, 1262) + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + end() + return true + } + + override fun newInstance(player: Player): DialoguePlugin { + return AfflictedDialogue(player) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AfrahDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/AfrahDialogue.kt new file mode 100644 index 000000000..ea3fb9064 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AfrahDialogue.kt @@ -0,0 +1,172 @@ +package core.game.content.dialogue + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AfrahDialogue : DialoguePlugin { + + private val conversations = arrayOf (0, 4, 10, 11, 15, 17, 20, 22, 23, 24, 29, 32) + + override fun open(vararg args: Any): Boolean { + player(FacialExpression.ASKING, "Hi!") + stage = conversations.random() + npc = args[0] as NPC + return true + } + + constructor() {} + constructor(player: Player?) : super(player) {} + + override fun getIds(): IntArray { + return intArrayOf(968) + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 0 -> { + npc(FacialExpression.ASKING, "Ooh. This is exciting!") + stage++ + } + 1 -> { + player(FacialExpression.ASKING, "Yup!") + stage = 99 + } + 2 -> { + npc(FacialExpression.ASKING, "I wouldn't want to be the poor guy that has to", "clean up after the duels.") + stage++ + } + 3 -> { + player(FacialExpression.ASKING, "Me neither.") + stage = 99 + } + 4 -> { + npc(FacialExpression.ASKING, "My son just won his first duel!") + stage++ + } + 5 -> { + player(FacialExpression.ASKING, "Congratulations!") + stage++ + } + 6 -> { + npc(FacialExpression.ASKING, "He ripped his opponent in half!") + stage++ + } + 7 -> { + player(FacialExpression.ASKING, "That's gotta hurt!") + stage++ + } + 8 -> { + npc(FacialExpression.ASKING, "He's only 10 as well!") + stage++ + } + 9 -> { + player(FacialExpression.ASKING, "You gotta start 'em young!") + stage = 99 + } + 10 -> { + npc(FacialExpression.ASKING, "Hmph.") + stage = 99 + } + 11 -> { + npc(FacialExpression.ASKING, "My favourite fighter is Mubariz!") + stage++ + } + 12 -> { + player(FacialExpression.ASKING, "The guy at the information kiosk?") + stage++ + } + 13 -> { + npc(FacialExpression.ASKING, "Yeah! He rocks!") + stage++ + } + 14 -> { + player(FacialExpression.ASKING, "Takes all sorts, I guess.") + stage = 99 + } + 15 -> { + npc(FacialExpression.ASKING, "Hi! I'm here to watch the duels!") + stage++ + } + 16 -> { + player(FacialExpression.ASKING, "Me too!") + stage = 99 + } + 17 -> { + npc(FacialExpression.ASKING, "Did you know they think this place dates","back to the second age?!") + stage++ + } + 18 -> { + player(FacialExpression.ASKING, "Really?") + stage++ + } + 19 -> { + npc(FacialExpression.ASKING, "Yeah. The guy at the information kiosk was telling me.") + stage = 99 + } + 20 -> { + npc(FacialExpression.ANGRY, "Can't you see I'm watching the duels?") + stage++ + } + 21 -> { + player(FacialExpression.SAD, "I'm sorry!") + stage = 99 + } + 22 -> { + npc(FacialExpression.ASKING, "Well. This beats doing the shopping!") + stage = 99 + } + 23 -> { + npc(FacialExpression.ASKING, "Hi!") + stage = 99 + } + 24 -> { + npc(FacialExpression.ASKING, "Knock knock!") + stage++ + } + 25 -> { + player(FacialExpression.ASKING, "Who's there?") + stage++ + } + 26 -> { + npc(FacialExpression.ASKING, "Boo!") + stage++ + } + 27 -> { + player(FacialExpression.ASKING, "Boo who?") + stage++ + } + 28 -> { + npc(FacialExpression.LAUGH, "Don't cry, it's just me!") + stage = 99 + } + 29 -> { + npc(FacialExpression.ASKING, "Why did the skeleton burp?") + stage++ + } + 30 -> { + player(FacialExpression.ASKING, "I don't know?") + stage++ + } + 31 -> { + npc(FacialExpression.ASKING, "'Cause it didn't have the guts to fart!") + stage = 99 + } + 32 -> { + npc(FacialExpression.ASKING, "Waaaaassssssuuuuupp?!.") + stage = 99 + } + 99 -> end() + } + return true + } + + override fun newInstance(player: Player): DialoguePlugin { + return AfrahDialogue(player) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AggieDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/AggieDialogue.java new file mode 100644 index 000000000..5a97e4a79 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AggieDialogue.java @@ -0,0 +1,404 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the dialogue plugin used for the aggie npc. + * @author 'Vexia + * @version 1.5 + */ +@Initializable +public final class AggieDialogue extends DialoguePlugin { + + /** + * Represents the animaton used to make the dye with aggie. + */ + private static final Animation ANIMATION = new Animation(4352); + + /** + * Represents the ingredients needed to make paste. + */ + private static final Item[] PASTE_INGREDIENTS = new Item[] { new Item(592), new Item(1951), new Item(1929), new Item(1933) }; + + /** + * Represents the cauldron location + */ + private final static Location CAULDRON_LOCATION = Location.create(3085, 3258, 0); + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 5); + + /** + * Represents the woad leaves item. + */ + private static final Item WOAD_LEAVES = new Item(1793, 2); + + /** + * Represents the onions item. + */ + private static final Item ONIONS = new Item(1957, 2); + + /** + * Represents the redberries item. + */ + private static final Item REDBERRIES = new Item(1951, 3); + + /** + * Represents the skin paste item. + */ + private static final Item PASTE = new Item(2424); + + /** + * Represents the blue dye. + */ + private static final Item BLUE_DYE = new Item(1767); + + /** + * Represents the yellow dye item. + */ + private static final Item YELLOW_DYE = new Item(1765); + + /** + * Represents the red dye item. + */ + private static final Item RED_DYE = new Item(1763); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code AggieDialogue} {@code Object}. + */ + public AggieDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AggieDialogue} {@code Object}. + * @param player the player. + */ + public AggieDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AggieDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length >= 2) { + interpreter.sendOptions("Select an Option", "What do you need to make a red dye?", "What do you need to make yellow dye?", "What do you need to make blue dye?"); + stage = 42; + return true; + } + quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + npc("What can I help you with?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (quest.getStage(player) == 20 || quest.getStage(player) == 30 || quest.getStage(player) == 40 || quest.getStage(player) == 50 || quest.getStage(player) == 60) { + interpreter.sendOptions("Select an Option", "Could you think of a way to make skin paste?", "What could you make for me?", "Cool, do you turn people into frogs?", "You mad old witch, you can't help me.", "Can you make dyes for me please?"); + stage = 720; + return true; + } + interpreter.sendOptions("Select an Option", "What could you make for me?", "Cool, do you turn people into frogs?", "You mad old witch, you can't help me.", "Can you make dyes for me please?"); + stage = 1; + break; + case 720: + switch (buttonId) { + case 1: + player("Could you think of a way to make skin paste?"); + stage = 721; + break; + case 2: + player("What could you make for me?"); + stage = 10; + break; + case 3: + player("Cool, do you turn people into frogs?"); + stage = 20; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "You mad old witch, you can't help me."); + stage = 30; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "Can you make dyes for me please?"); + stage = 40; + break; + } + break; + case 721: + if (!hasIngredients(player)) { + interpreter.sendDialogues(npc, null, "Why it's one of my most popular potions. The women", "here, they like to have smooth looking skin. And I must", "admit, some of the men buy it as well."); + stage = 722; + } else { + interpreter.sendDialogues(npc, null, "Yes I can, I see you already have the ingredients.", "Would you like me to mix some for you now?"); + stage = 726; + } + break; + case 722: + interpreter.sendDialogues(npc, null, "I can make it for you, just get me what's needed."); + stage = 723; + break; + case 723: + player("What do you need to make it?"); + stage = 724; + break; + case 724: + interpreter.sendDialogues(npc, null, "Well dearie, you need a base for the paste. That's a", "mix of ash, flour and water. Then you need redberries", "to colour it as you want. Bring me those four items", "and I will make you some."); + stage = 725; + break; + case 725: + end(); + break; + case 726: + interpreter.sendOptions("Select an Option", "Yes please. Mix me some skin paste.", "No thank you, I don't need any skin paste right now."); + stage = 727; + break; + case 727: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please. Mix me some skin paste."); + stage = 731; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thank you, I don't need any skin paste right now."); + stage = 729; + break; + } + break; + case 729: + npc("Okay dearie, that's always your choice."); + stage = 730; + break; + case 730: + end(); + break; + case 731: + npc("That should be simple. Hand the things to Aggie then."); + stage = 732; + break; + case 732: + if (player.getInventory().remove(PASTE_INGREDIENTS)) { + interpreter.sendDialogue("You hand the ash, flour, water and redberries to Aggie.", "Aggie tips the ingredients into a cauldron", "and mutters some words."); + stage = 733; + } + break; + case 733: + npc("Tourniquet, Fenderbaum, Tottenham, marshmaallow,", "MarbleArch."); + stage = 734; + break; + case 734: + if (player.getInventory().add(PASTE)) { + interpreter.sendDialogue("Aggie hands you the skin paste."); + stage = 735; + } + break; + case 735: + npc("There you go dearie, your skin potion. That will make", "you look good at the Varrock dances."); + stage = 736; + break; + case 736: + end(); + break; + case 1: + switch (buttonId) { + case 1: + player("What could you make for me?"); + stage = 10; + break; + case 2: + player("Cool, do you turn people into frogs?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "You mad old witch, you can't help me."); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "Can you make dyes for me please?"); + stage = 40; + break; + } + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "What sort of dye would you like? Red, yellow or blue?"); + stage = 41; + break; + case 41: + interpreter.sendOptions("Select an Option", "What do you need to make a red dye?", "What do you need to make yellow dye?", "What do you need to make blue dye?"); + stage = 42; + break; + case 42: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "What do you need to make red dye?"); + stage = 410; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "What do you need to make yellow dye?"); + stage = 420; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "What do you need to make blue dye?"); + stage = 430; + break; + } + break; + case 430: + interpreter.sendDialogues(npc, null, "2 woad leaves and 5 coins to you."); + stage = 431; + break; + case 431: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "Okay, make me some blue dye please."); + stage = 432; + break; + case 432: + if (player.getInventory().containsItem(COINS) && player.getInventory().containsItem(WOAD_LEAVES)) { + player.getInventory().remove(COINS); + player.getInventory().remove(WOAD_LEAVES); + player.getInventory().add(BLUE_DYE); + make(1767); + interpreter.sendItemMessage(1767, "You hand the woad leaves and payment to Aggie. Aggie produces a blue bottle and hands it to you."); + } else { + interpreter.sendDialogue("You need 2 woad leaves and 5 coins."); + } + stage = 413; + break; + case 433: + end(); + break; + case 420: + interpreter.sendDialogues(npc, null, "Yellow is a strange colour to get, comes from onion", "skins. I need 2 onions and 5 coins to make yellow dye."); + stage = 421; + break; + case 421: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "Okay, make me some yellow dye please."); + stage = 422; + break; + case 422: + if (player.getInventory().containsItem(COINS) && player.getInventory().containsItem(ONIONS)) { + player.getInventory().remove(COINS); + player.getInventory().remove(ONIONS); + player.getInventory().add(YELLOW_DYE); + make(1765); + interpreter.sendItemMessage(1765, "You hand the onions and payment to Aggie. Aggie produces a yellow bottle and hands it to you."); + } else { + interpreter.sendDialogue("You need 2 onions and 5 coins."); + } + stage = 423; + break; + case 423: + end(); + break; + case 410: + interpreter.sendDialogues(npc, null, "3 lots of redberries and 5 coins to you."); + stage = 411; + break; + case 411: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "Okay, make me some red dye please."); + stage = 412; + break; + case 412: + if (player.getInventory().containsItem(COINS) && player.getInventory().containsItem(REDBERRIES)) { + player.getInventory().remove(COINS); + player.getInventory().remove(REDBERRIES); + player.getInventory().add(RED_DYE); + make(1763); + interpreter.sendItemMessage(1763, "You hand the berries and payment to Aggie. Aggie produces a red bottle and hands it to you."); + } else { + interpreter.sendDialogue("You need 3 redberrie leaves and 5 coins."); + } + stage = 413; + break; + case 413: + end(); + break; + case 30: + interpreter.sendDialogues(npc, null, "Oh, you like to call a witch names do you?"); + stage = 31; + break; + case 31: + Item item = new Item(995, 20); + if (player.getInventory().remove(item)) { + interpreter.sendItemMessage(item, "Aggie waves her hands about, and you seem to be 20", "coins poorer."); + stage = 32; + } else { + interpreter.sendDialogues(npc, null, "You should be careful about insulting a witch. You", "never know what shape you could wake up in."); + stage = 34; + } + break; + case 32: + interpreter.sendDialogues(npc, null, "That's a fine for insulting a witch. You should learn", "some respect."); + stage = 33; + break; + case 34: + end(); + break; + case 33: + end(); + break; + case 20: + interpreter.sendDialogues(npc, null, "Oh, not for years, but if you meet a talking chicken,", "you have probably met the professor in the manor north", "of here. A few years ago it was flying fish. That", "machine is a menace."); + stage = 11; + break; + case 10: + interpreter.sendDialogues(npc, null, "I mostly make what I find pretty. I sometimes", "make dye for the women's clothes to brighten the place", "up. I can make red, yellow and blue dyes. If you'd like", "some, just bring me the appropriate ingredients."); + stage = 11; + break; + case 11: + end(); + break; + } + return true; + } + + /** + * Method used to make a dye. + * @param dye the dye. + */ + public final void make(int dye) { + npc.animate(ANIMATION); + npc.faceLocation(CAULDRON_LOCATION); + } + + /** + * Method used to check if the player has the ingredients for the paste. + * @param player the player. + * @return {@code True} if so. + */ + private final boolean hasIngredients(final Player player) { + for (Item i : PASTE_INGREDIENTS) { + if (!player.getInventory().containsItem(i)) { + return false; + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 922 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AgilityBossDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/AgilityBossDialogue.kt new file mode 100644 index 000000000..db4873faf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AgilityBossDialogue.kt @@ -0,0 +1,54 @@ +package core.game.content.dialogue + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AgilityBossDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + + if(player.equipment.contains(4202,1)) { + player(FacialExpression.ASKING,"How do I use the agility course?").also { stage = 0 } + } else { + npc(FacialExpression.CHILD_SUSPICIOUS,"Grrr - you don't belong in here, human!").also { stage = 99 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.CHILD_NORMAL,"I'll throw you a stick, which you need to", + "fetch as quickly as possible, ", + "from the area beyond the pipes.").also { stage++ } + + 1 -> npc(FacialExpression.CHILD_NORMAL,"Be wary of the deathslide - you must hang by your teeth,", + "and if your strength is not up to the job you will", + "fall into a pit of spikes. Also, I would advise not", + "carrying too much extra weight.").also { stage++ } + + 2 -> npc(FacialExpression.CHILD_NORMAL,"Bring the stick back to the werewolf waiting at", + "the end of the death slide to get your agility bonus.").also { stage++ } + + 3 ->npc(FacialExpression.CHILD_NORMAL,"I will throw your stick as soon as you jump onto the", + "first stone.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AgilityBossDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1661) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AgmundiDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/AgmundiDialogue.kt new file mode 100644 index 000000000..dec486ab8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AgmundiDialogue.kt @@ -0,0 +1,65 @@ +package core.game.content.dialogue + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AgmundiDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.CHILD_NORMAL,"Oh no, not another human... what do you want then?") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player(FacialExpression.ASKING, "Oh, do you get humans here often?").also { stage++ } + 1 -> npc(FacialExpression.CHILD_SUSPICIOUS, "Not that often, no, but sometimes.").also { stage++ } + 2 -> npc(FacialExpression.CHILD_THINKING, "Of course, since you people are too big for dwarven", + "clothes, they typically don't stay very long.").also { stage++ } + 3 -> player(FacialExpression.SUSPICIOUS, "Why don't you make bigger clothes then?").also { stage++ } + 4 -> npc(FacialExpression.CHILD_GUILTY, "What'd be the point? Besides, I don't make", "these clothes myself.").also { stage++ } + + 5 -> options ("Who makes these clothes then?", "I still want to buy your clothes.", "So do you have any quests for me?").also { stage++ } + 6 -> when(buttonId){ + 1 -> player(FacialExpression.GUILTY, "Who makes the clothes then?").also { stage = 10 } + 2 -> npc.openShop(player) + 3 -> npc(FacialExpression.CHILD_SUSPICIOUS,"Quests? Why would I have any quests?").also { stage = 20 } + + } + + 10 -> npc(FacialExpression.CHILD_NORMAL,"Oh, my sister, she lives in Keldagrim-East.", + "Has a little stall on the other side of", + "the Kelda.").also { stage++ } + 11 -> npc(FacialExpression.CHILD_NORMAL,"If she only worked a little harder, like me,", + "she wouldn't have to live in the sewers of the city.", + "Shame really.").also { stage++ } + 12 -> player("The sewers? Your sister lives in the sewers?").also { stage++ } + 13 -> npc(FacialExpression.CHILD_SAD,"Keldagrim-East, such a ghastly place.", + "Not civil, polite and clean like we are in the West.").also { stage++ } + 14 -> player(FacialExpression.SUSPICIOUS, "Uh-huh.").also { stage=99 } + + 20 -> player("Oh, just anything to do would be fine.").also { stage++ } + 21 -> npc(FacialExpression.CHILD_NORMAL,"No, not right now... maybe I'll have something", + "for you to do later, but nothing at the moment.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AgmundiDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(2161) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AhabDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/AhabDialogue.java new file mode 100644 index 000000000..6d0406266 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AhabDialogue.java @@ -0,0 +1,187 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the npc Ahav. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AhabDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code AhabDialogue} {@code Object}. + */ + public AhabDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AhabDialogue} {@code Object}. + * @param player the player. + */ + public AhabDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AhabDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if(args.length > 1) { + boolean isTelegrab = (boolean) args[1]; + player.debug("" + isTelegrab); + if (!isTelegrab) { + npc(FacialExpression.FURIOUS, "Oi! Get yer hands off me beer!"); + } else { + npc(FacialExpression.FURIOUS,"Don't ye go castin' spells on me beer!"); + } + stage = 301; + } else { + npc("Arrr, matey!"); + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Arrr!", "Are you going to sit there all day?", "Do you have anything for trade?"); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + player("Arrr!"); + stage = 10; + break; + case 2: + player("Are you going to sit there all day?"); + stage = 20; + break; + case 3: + player("Do you have anything for trade?"); + stage = 300; + break; + } + + break; + case 10: + npc("Arrr, matey!"); + stage = 0; + break; + case 20: + npc("Aye, I am. I canna walk, ye see."); + stage = 21; + break; + case 21: + player("What's stopping you from walking?"); + stage = 22; + break; + case 22: + npc("Arrr, I'ave only the one leg! I lost its twin when my last", "ship went down."); + stage = 23; + break; + case 23: + player("But I can see both your legs!"); + stage = 24; + break; + case 24: + npc("Nay, young laddie, this be a false leg. For years I had me a", "sturdy wooden peg-leg, but now I wear this dainty little", "feller."); + stage = 25; + break; + case 25: + npc("Yon peg-leg kept getting stuck in the floorboards."); + stage = 26; + break; + case 26: + player("Right..."); + stage = 27; + break; + case 27: + npc("Perhaps a bright young laddie like yerself would like to", "help me? I be needing another ship to go a-hunting my", "enemy."); + stage = 28; + break; + case 28: + if (player.getQuestRepository().isComplete("Dragon Slayer")) { + player("Well, I do have a ship that I'm not using.", "It's the Lady Lumbridge."); + stage = 29; + } else { + player("No, I don't have a ship."); + stage = 294; + } + break; + case 294: + npc("Arr matey... You make me sad."); + stage = 295; + break; + case 295: + end(); + break; + case 29: + npc("Arrr! That ship be known to me, and a fine lass she is."); + stage = 30; + break; + case 30: + player("I suppose she might be..."); + stage = 31; + break; + case 31: + npc("So would ye be kind enough to let", "me take her out to sea?"); + stage = 32; + break; + case 32: + player("I had to pay 2000gp for that ship! ", "Have you got that much?"); + stage = 33; + break; + case 33: + npc("Nay, I have nary a penny to my name. All my wordly goods", "went down with me old ship."); + stage = 34; + break; + case 34: + player("So you're actually asking me to give you a free ship."); + stage = 35; + break; + case 35: + npc("Arrr! Would ye be so kind?"); + stage = 36; + break; + case 36: + player("No I jolly well wouldn't!"); + stage = 37; + break; + case 37: + npc("Arrr."); + stage = 38; + break; + case 38: + end(); + break; + case 300: + npc("Nothin' at the moment, but then again the Customs", "Agents are on the warpath right now."); + stage = 301; + break; + case 301: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2692 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AjjatDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/AjjatDialoguePlugin.java new file mode 100644 index 000000000..c5a90e1b6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AjjatDialoguePlugin.java @@ -0,0 +1,163 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the ajjat npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AjjatDialoguePlugin extends DialoguePlugin { + + /** + * Constructs a new {@code AjjatDialoguePlugin} {@code Object}. + */ + public AjjatDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AjjatDialoguePlugin} {@code Object}. + * @param player the player. + */ + public AjjatDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AjjatDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Greetings, fellow warrior. I am Ajjat, former Black Knight", "and now traning officer here in the Warriors' Guild."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Can you tell me about skillcapes, please?", "Black knight? Why are you here?", "What's the dummy room all about?", "May I claim my tokens please?", "Bye!"); + stage = 1; + break; + case 1: + if (buttonId == 1) { + player("Can you tell me about skillcapes, please?"); + stage = 2; + } else if (buttonId == 2) { + player("Black knight? Why are you here?"); + stage = 4; + } else if (buttonId == 3) { + player("What's the dummy room all about?"); + stage = 6; + } else if (buttonId == 4) { + end(); + player.getDialogueInterpreter().open("wg:claim-tokens", npc.getId()); + } else if (buttonId == 5) { + player("Bye!"); + stage = 12; + } + break; + case 2: + npc("Skillcapes, also knows as Capes of Accomplishment, are", "reserved for the elite of the elite. Only a person who has", "truly mastered a skill can buy one, even then a", "Skillcape can only be bought from one who is recognised as"); + stage = 3; + break; + case 3: + npc("the highest skilled in the land at any particular skill. I", "have the privilege of being the person that controls", "acces to the Skillcape of Attack. Is there anything else I", "can help you with?"); + stage = 600; + break; + case 4: + npc("Indeed I was however, their... methods did not match", "with my ideals, so I left. Harrallak, recognsing my talent as", "a warrior, took me in and offered me a job here."); + stage = 5; + break; + case 5: + player("Hmm...well, if Harrallak trusts you, I guess I can."); + stage = 0; + break; + case 6: + npc("Ahh yes, the dummies. Another ingenious invention of the", "noble dwarf, Gamfred. They're mechanical, you see, and", "pop up out of the floor. You have to hit them with the", "correct attack mode before they dissapear again."); + stage = 7; + break; + case 7: + player("Do, how do I tell wich one is wich?"); + stage = 8; + break; + case 8: + npc("here are two different ways. One indication is their", "colour, the other is the pose and weapons they are", "holding, for instance, the one holding daggers you will", "to hit with a piercing attack."); + stage = 9; + break; + case 9: + npc("In the room, you will find a poster on the wall to", " help you recognize each different dummy."); + stage = 10; + break; + case 10: + player("That sounds ingenious!"); + stage = 11; + break; + case 11: + npc("Indeed, you may find that you need several weapons to", "be successfull all of the time, but keep trying", "The weapons Shop upstairs may help you there."); + stage = 0; + break; + case 12: + npc("Farewell, warrior. Stay away from the dark side."); + stage = 13; + break; + case 13: + end(); + break; + case 600: + if (player.getSkills().getStaticLevel(Skills.ATTACK) == 99) { + player("I'd like to buy a skillcape of Attack."); + stage = 601; + } else { + end(); + } + break; + case 601: + npc("Okay, it will cost you 99000 coins", "is that ok?"); + stage = 602; + break; + case 602: + options("Yes.", "No."); + stage = 603; + break; + case 603: + switch (buttonId) { + case 1: + player("Yes."); + stage = 604; + break; + case 2: + end(); + break; + } + break; + case 604: + if (Skillcape.purchase(player, Skills.ATTACK)) { + npc("There you go! Enjoy."); + } + stage = 605; + break; + case 605: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4288 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AleckDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/AleckDialogue.java new file mode 100644 index 000000000..1111f51c3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AleckDialogue.java @@ -0,0 +1,103 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the plugin dialogue used for the aleck npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AleckDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code AleckDialogue} {@code Object}. + */ + public AleckDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AleckDialogue} {@code Object}. + * @param player the player. + */ + public AleckDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AleckDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Hello, hello, and a most warm welcome to my Hunter", "Emporium. We have everything the discerning Hunter", "could need."); + stage = 1; + break; + case 1: + npc("Would you like me to show you our range of", "equipment? Or was there something specific you were", "after?"); + stage = 2; + break; + case 2: + interpreter.sendOptions("Select an Option", "Ok, let's see what you've got.", "I'm not interested, thanks.", "Who's that guy over there?"); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("Ok, let's see what you've got!"); + stage = 10; + break; + case 2: + player("I'm not interested, thanks."); + stage = 20; + break; + case 3: + player("Who's that guy over there?"); + stage = 30; + break; + + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + case 30: + npc("Him? I think he might be crazy. Either that or he's", "seeking attention."); + stage = 31; + break; + case 31: + npc("He keeps trying to sell me these barmy looking weapons", "he's invented. I can't see them working, personally."); + stage = 32; + break; + case 32: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5110 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AlfonseWaiterDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/AlfonseWaiterDialogue.java new file mode 100644 index 000000000..dc5145513 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AlfonseWaiterDialogue.java @@ -0,0 +1,90 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin for the npc alfonse the waiter. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AlfonseWaiterDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code AlfonseWaiterDialogue} {@code Object}. + */ + public AlfonseWaiterDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AlfonseWaiterDialogue} {@code Object}. + * @param player the player. + */ + public AlfonseWaiterDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AlfonseWaiterDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to the Shrimps and Parrot.", "Would you like to order, sir?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you.", "Where do you get your Karambwan from?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where do you get your Karambwan from?"); + stage = 30; + break; + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "We buy directly off Lubufu, a local fisherman. He", "seems to have a monopoly over Karambwan sale."); + stage = 31; + break; + case 31: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 793 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneJrDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneJrDialogue.kt new file mode 100644 index 000000000..24e07c0b2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneJrDialogue.kt @@ -0,0 +1,49 @@ +package core.game.content.dialogue + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.activity.gnomecooking.GC_BASE_ATTRIBUTE +import core.game.content.activity.gnomecooking.GC_TUT_PROG + +@Initializable +class AluftGianneJrDialogue(player: Player? = null) : DialoguePlugin(player) { + var tutorialStage = -1 + + override fun newInstance(player: Player?): DialoguePlugin { + return AluftGianneJrDialogue(player) + } + + override fun npc(vararg messages: String?): Component { + return super.npc(FacialExpression.OLD_NORMAL,*messages) + } + + override fun open(vararg args: Any?): Boolean { + tutorialStage = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",-1) + if(tutorialStage == -1){ + player("Hey can I get a job here?").also { stage = 0 } + } else { + npc("Having fun?").also { stage = 1000 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc("Sure, go talk to my dad. I'll put","a good word in!").also { stage++ } + 1 -> player(FacialExpression.THINKING,"Th-thanks...?").also { stage++ } + 2 -> { + end() + player.setAttribute("/save:$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",0) + } + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(4572) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneSnrDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneSnrDialogue.kt new file mode 100644 index 000000000..4b2bbc816 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AluftGianneSnrDialogue.kt @@ -0,0 +1,197 @@ +package core.game.content.dialogue + +import core.game.component.Component +import core.tools.Items +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.plugin.Initializable +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import core.game.content.activity.gnomecooking.* +import core.tools.stringtools.colorize +import java.util.concurrent.TimeUnit + +val gnomeItems = arrayOf(Items.FRUIT_BATTA_2277,Items.TOAD_BATTA_2255,Items.CHEESE_PLUSTOM_BATTA_2259,Items.WORM_BATTA_2253,Items.VEGETABLE_BATTA_2281, +Items.CHOCOLATE_BOMB_2185,Items.VEG_BALL_2195,Items.TANGLED_TOADS_LEGS_2187,Items.WORM_HOLE_2191,Items.TOAD_CRUNCHIES_2217,Items.WORM_CRUNCHIES_2205,Items.CHOCCHIP_CRUNCHIES_2209,Items.SPICY_CRUNCHIES_2213,Items.FRUIT_BLAST_9514,Items.DRUNK_DRAGON_2092,Items.CHOC_SATURDAY_2074, +Items.SHORT_GREEN_GUY_9510,Items.BLURBERRY_SPECIAL_9520,Items.PINEAPPLE_PUNCH_9512,Items.WIZARD_BLIZZARD_9508) + +val ALUFT_ALOFT_BOX = Item(Items.ALUFT_ALOFT_BOX_9477) + +@Initializable +class AluftGianneSnrDialogue(player: Player? = null) : DialoguePlugin(player) { + var tutorialProgress = -1 + var tutorialComplete = false + + override fun newInstance(player: Player?): DialoguePlugin { + return AluftGianneSnrDialogue(player) + } + + override fun npc(vararg messages: String?): Component { + return super.npc(FacialExpression.OLD_NORMAL,*messages) + } + + override fun open(vararg args: Any?): Boolean { + tutorialComplete = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_TUT_FIN",false) + tutorialProgress = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",-1) + + if(tutorialComplete){ + npc("Hello, adventurer. How can I help you?") + stage = 300 + return true + } + + if(tutorialProgress == -1){ + npc("Who are you and what do you want?") + stage = 1000 + return true + } + + if(tutorialProgress == 0){ + npc("Hello, adventurer. I heard from my son","that you'd like to do some work.") + stage = 0 + return true + } + + npc("Hello, adventurer. How goes the training?") + stage = tutorialProgress + + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player(FacialExpression.HAPPY,"Yes, how do I get started?").also { stage++ } + 1 -> npc("Well first thing's first I need to teach","you how to cook!").also { stage++ } + 2 -> player(FacialExpression.THINKING,"But I already-").also { stage++ } + 3 -> npc("Stop whatever it is you're saying, no one knows","how to cook gnome food except gnomes!").also { stage++ } + 4 -> player("Alright, go on...").also{stage++} + 5 -> npc("Alright, first thing I want you to do is","make me a toad batta. Here's all the","ingredients, now get to work!").also { stage++ } + 6 -> { + end() + val items = arrayOf(Item(Items.BATTA_TIN_2164),Item(Items.GIANNE_DOUGH_2171),Item(Items.EQUA_LEAVES_2128),Item(Items.GNOME_SPICE_2169),Item(Items.CHEESE_1985), Item(Items.TOADS_LEGS_2152)) + if(!player.inventory.hasSpaceFor(*items)){ + player.dialogueInterpreter.sendDialogue("You don't have space for the items.") + } else { + player.inventory.add(*items) + player.setAttribute("/save:$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",10) + } + } + + //Toad Batta completion check + 10 -> { + if(player.inventory.containsItem(Item(Items.TOAD_BATTA_2255))){ + player("Very well! I have the batta right here!").also { stage = 11 } + } else { + player("Not well, I haven't got the batta yet.").also { stage = 1000 } + } + } + 11 -> npc("Very well, hand it over then!").also { stage++ } + 12 -> { + player.inventory.remove(Item(Items.TOAD_BATTA_2255)) + player.setAttribute("/save:$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",13) + player.dialogueInterpreter.sendDialogue("You hand over the toad batta.").also { stage++ } + } + 13 -> npc("Very nicely done. Now I would like you to make me","toad crunchies. Here's everything you need.").also { stage++ } + 14 -> { + end() + val items = arrayOf(Item(Items.CRUNCHY_TRAY_2165),Item(Items.EQUA_LEAVES_2128),Item(Items.GIANNE_DOUGH_2171),Item(Items.TOADS_LEGS_2152,2)) + if(!player.inventory.hasSpaceFor(*items)){ + player.dialogueInterpreter.sendDialogue("You don't have enough space for the items.") + } else { + player.inventory.add(*items) + player.setAttribute("/save:$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",15) + } + } + + //Toad Crunchies completion check + 15 -> { + if(player.inventory.containsItem(Item(Items.TOAD_CRUNCHIES_2217))){ + player("Very well! I have the crunchies right here!").also { stage = 16 } + } else { + player("Not well, I haven't got the crunchies yet.").also { stage = 1000 } + } + } + + 16 -> npc("Very well, hand it over then!").also { stage++ } + 17 -> { + player.inventory.remove(Item(Items.TOAD_CRUNCHIES_2217)) + player.setAttribute("/save:$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",18) + player.dialogueInterpreter.sendDialogue("You hand over the toad crunchies.").also { stage++ } + } + 18 -> npc("Very nice indeed. Now I'd like you to go see my friend","Blurberry at the bar.").also { stage = 1000 } + + + //Dialogue for getting jobs + 300 -> options("I'd like to take on a hard job.","I'd like an easy job please.").also { stage++ } + 301 -> end().also{ when (buttonId) { + 1 -> getJob(GnomeTipper.LEVEL.HARD) + 2 -> getJob(GnomeTipper.LEVEL.EASY) + }} + + 1000 -> end() + + else -> player("Uhhhh, good.").also { stage = 1000 } + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(850) + } + + private fun getJob(level: GnomeTipper.LEVEL){ + if(!player.inventory.containsItem(ALUFT_ALOFT_BOX) && !player.bank.containsItem(ALUFT_ALOFT_BOX)){ + player.inventory.add(ALUFT_ALOFT_BOX) + } + if(player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_JOB_ORDINAL",-1) != -1){ + player.dialogueInterpreter.sendDialogue("You already have a job.") + } else { + GlobalScope.launch { + var job = GnomeCookingJob.values().random() + while (job.level != level) { + job = GnomeCookingJob.values().random() + } + val item = Item(gnomeItems.random()) + player.setAttribute("$GC_BASE_ATTRIBUTE:$GC_JOB_ORDINAL", job.ordinal) + player.setAttribute("$GC_BASE_ATTRIBUTE:$GC_NEEDED_ITEM", item) + player.dialogueInterpreter.sendDialogue("I need to deliver a ${item.name.toLowerCase()} to ${NPC(job.npc_id).name.toLowerCase()},", "who is ${job.tip}") + GameWorld.Pulser.submit(GnomeRestaurantPulse(player, if (level == GnomeTipper.LEVEL.HARD) 11L else 6L)) + } + } + } + + internal class GnomeRestaurantPulse(val player: Player,val minutes: Long): Pulse(){ + var endTime = 0L + var timerMsgSent = false + init { + endTime = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(minutes) + } + + override fun pulse(): Boolean{ + val isComplete = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_JOB_ORDINAL",-1) == -1 + + val minsLeft = TimeUnit.MILLISECONDS.toMinutes(endTime - System.currentTimeMillis()) + + if(minsLeft % 2L == 0L && !timerMsgSent){ + timerMsgSent = true + player.sendMessage(colorize("%RYou have $minsLeft minutes remaining on your job.")) + } else if(minsLeft % 2L != 0L) { + timerMsgSent = false + } + + if(System.currentTimeMillis() >= endTime){ + player.sendMessage(colorize("%RYou have run out of time and your job has expired.")) + player.removeAttribute("$GC_BASE_ATTRIBUTE:$GC_JOB_ORDINAL") + player.removeAttribute("$GC_BASE_ATTRIBUTE:$GC_JOB_COMPLETE") + player.removeAttribute("$GC_BASE_ATTRIBUTE:$GC_NEEDED_ITEM") + return true + } + + return isComplete + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AmbassadorFernook.java b/Server/src/main/java/Server/core/game/content/dialogue/AmbassadorFernook.java new file mode 100644 index 000000000..4cef10e39 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AmbassadorFernook.java @@ -0,0 +1,75 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for ambassador fernook. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AmbassadorFernook extends DialoguePlugin { + + /** + * Constructs a new {@code AmbassadorFernook} {@code Object}. + */ + public AmbassadorFernook() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AmbassadorFernook} {@code Object}. + * @param player the player. + */ + public AmbassadorFernook(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AmbassadorFernook(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello Ambassador. Are you here visiting King Roald?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, in theory, but he always seems to be busy."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You don't seem that upset by that, though..."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh no, I like travelling, and if you become a diplomat", "patience is a vital skill."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll try to remember that."); + stage = 4; + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4582 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AnjaDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/AnjaDialoguePlugin.java new file mode 100644 index 000000000..bed29eced --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AnjaDialoguePlugin.java @@ -0,0 +1,142 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the dialogue plugin used for the anja npc. + * @author jamix77 + */ +@Initializable +public final class AnjaDialoguePlugin extends DialoguePlugin { + + /** + * + * Constructs a new @{Code AnjaDialoguePlugin} object. + */ + public AnjaDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AjjatDialoguePlugin} {@code Object}. + * @param player the player. + */ + public AnjaDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AnjaDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Hello sir. What are you doing in my house?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "I'm just wandering around.", "I was hoping you'd give me some free stuff.", "I've come to kill you."); + stage = 2; + break; + case 2: + if (buttonId == 1) { + player("I'm just wondering around."); + stage = 3; + } else if (buttonId == 2) { + player("I was hoping you'd give me some free stuff."); + stage = 10; + } else if (buttonId == 3) { + player("I've come to kill you."); + stage = 13; + } + break; + case 3: + npc("Oh dear are you lost?"); + stage++; + break; + case 4: + interpreter.sendOptions("Select an Option.", "Yes, I'm lost.", "No, I know where I am."); + stage++; + break; + case 5: + switch (buttonId) { + case 1: + player("Yes, I'm lost."); + stage =6; + break; + case 2: + player("No I know where I am."); + stage = 8; + break; + } + break; + case 6: + npc("Okay, just walk north-east when you leave this house,","and soon you'll reach the big city of Falador."); + stage++; + break; + case 7: + player("Thanks a lot."); + stage = 605; + break; + case 8: + npc("Oh? Well, would you mind wandering somewhere else?", "This is my house."); + stage++; + break; + case 9: + player("Meh!"); + stage = 605; + break; + case 10: + String[] dialogues = {"Do you REALLY need it","I don't have much on me...", "I don't know..."}; + npc(dialogues[RandomFunction.random(0, 2)]); + stage++; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.ASKING, "I promise I'll stop bothering you!", "Pleeease!","Pwetty pleathe wiv thugar on top!"); + stage++; + break; + case 12: + npc("Oh, alright. Here you go."); + player.getInventory().add(new Item(995,RandomFunction.random(1, 3))); + stage = 605; + break; + case 13: + npc.sendChat("Eeeek!"); + for (NPC npc1 : RegionManager.getLocalNpcs(player)) { + if (npc1.getName().equalsIgnoreCase("Hengel")) { + npc1.sendChat("Aaaaarrgh!"); + break; + } + } + end(); + break; + case 605: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2684 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AnnaIsaakson.java b/Server/src/main/java/Server/core/game/content/dialogue/AnnaIsaakson.java new file mode 100644 index 000000000..5e5ffe51d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AnnaIsaakson.java @@ -0,0 +1,55 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Replacement for the Anna Isaakson .asc file + * @author ceik + */ + +@Initializable +public class AnnaIsaakson extends DialoguePlugin { + public AnnaIsaakson(){ + /** + * Empty on purpose + */ + } + public AnnaIsaakson(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){return new AnnaIsaakson(player);} + + @Override + public boolean open(Object... args) { + npc("Hello visitor, how are you?"); + stage = 1; + return true; + } + + @Override + public final boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 1: + player("Better than expected. Its a lot...nicer...here than I was", "expecting. Everyone seems pretty happy."); + stage = 2; + break; + case 2: + npc("Of course, the Burgher is strong and wise, and looks", "after us well"); + stage = 3; + break; + case 3: + player("I think some of those Jatizso citizens have got", "the wrong idea about this place."); + stage = 10; + break; + case 10: + end(); + break; + } + return true; + } + @Override + public int[] getIds() { + return new int[] { 5512 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AntonDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/AntonDialogue.java new file mode 100644 index 000000000..e39d56a77 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AntonDialogue.java @@ -0,0 +1,68 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used to handle the anton npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AntonDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code AntonDialogue} {@code Object}. + */ + public AntonDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AntonDialogue} {@code Object}. + * @param player the player. + */ + public AntonDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AntonDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Ahhh, hello there. How can I help?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Looks like you have a good", "selection of weapons around here..."); + stage = 1; + break; + case 1: + npc("Indeed so, specially imported from the finest smiths", "around the lands, take a look at my wares."); + stage = 2; + break; + case 2: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4295 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ApothecaryDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ApothecaryDialogue.java new file mode 100644 index 000000000..3a715cedf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ApothecaryDialogue.java @@ -0,0 +1,276 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the apothecary npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ApothecaryDialogue extends DialoguePlugin { + + /** + * Represents the potion requirements. + */ + private static final Item[] POTION_ITEMS = new Item[] { new Item(223), new Item(225), new Item(995, 5) }; + + /** + * Represents the potion item. + */ + private static final Item POTION = new Item(115); + + /** + * Represents the unkown potion. + */ + private static final Item UNKNOWN_POTION = new Item(195, 1); + + /** + * Represents the cadava berries item. + */ + private static final Item CADAVA_BERRIES = new Item(753); + + /** + * Represents the cadava potion item. + */ + private static final Item CADAVA_POTION = new Item(756); + + /** + * Constructs a new {@code ApothecaryDialogue} {@code Object}. + */ + public ApothecaryDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ApothecaryDialogue} {@code Object}. + * @param player the player. + */ + public ApothecaryDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ApothecaryDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getQuestRepository().getQuest("Romeo & Juliet").getStage(player) == 40) { + interpreter.sendDialogues(player, null, "Apothecary. Father Lawrence sent me."); + stage = 500; + return true; + } + if (player.getQuestRepository().getQuest("Romeo & Juliet").getStage(player) == 50) { + if (!player.getInventory().contains(753, 1)) { + npc("Keep searching for those Cadavaberries. They're needed", "for the potion."); + stage = 507; + return true; + } else { + npc("Well done. You have the berries."); + stage = 637; + return true; + } + } + if (player.getQuestRepository().getQuest("Romeo & Juliet").getStage(player) == 60) { + if (!player.getInventory().contains(756, 1) && !player.getBank().contains(756, 1)) { + if (player.getInventory().contains(753, 1)) { + npc("Well done. You have the berries."); + stage = 637; + return true; + } else { + npc("Keep searching for those Cadavaberries. They're needed", "for the potion."); + stage = 507; + return true; + } + } else { + npc("I am the Apothecary. I brew potions.", "Do you need anything specific?"); + } + } + npc("I am the Apothecary. I brew potions.", "Do you need anything specific?"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + options("Can you make a strength potion?", "Do you know a potion to mame hair fall out?", "Have you got any good potions to give away?", "Can you make a potion that makes it seem like I'm dead?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Can you make a strength potion?"); + stage = 10; + break; + case 2: + player("Do you know a potion to make hair fall out?"); + stage = 20; + break; + case 3: + player("Have you got any good potions to give away?"); + stage = 140; + break; + case 4: + player("Can you make a potion that makes it seems like I'm dead?"); + stage = 40; + break; + } + + break; + case 10: + if (player.getInventory().containItems(223, 225)) { + npc("Certainly, just hand over the ingredients and 5 coins."); + stage = 50; + return true; + } + npc("Yes, but the ingredients are a little hard to find. If you", "ever get them I will make it for you, for a fee."); + stage = 11; + break; + case 50: + if (!player.getInventory().contains(995, 5)) { + end(); + player.getPacketDispatch().sendMessage("You need 5 gold coins to do that."); + return true; + } + interpreter.sendDialogue("You hand over the ingredients and money."); + stage = 51; + break; + case 51: + if (player.getInventory().remove(POTION_ITEMS)) { + player.getInventory().add(POTION); + end(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 0); + } + break; + case 11: + player("So what are the ingredients?"); + stage = 12; + break; + case 12: + npc("You'll need to find the eggs of the deadly red spider and a", "limpwurt root."); + stage = 13; + break; + case 13: + npc("Oh and you'll have to pay me 5 coins."); + stage = 14; + break; + case 14: + player("Ok, I'll look out for them."); + stage = 15; + break; + case 15: + end(); + break; + case 20: + npc("I do indeed. I gave it to my mother. That's why I now live", "alone."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + npc("Ok then. Try this potion."); + player.getInventory().add(UNKNOWN_POTION); + stage = 31; + break; + case 31: + end(); + break; + case 40: + npc("What a strange and morbid request! I can as it happens.", "The berry of the cadava bush, prepared properly, will", "induce a coma so deep that you will seem to be dead. It's", "very dangerous."); + stage = 41; + break; + case 41: + npc("I have the other ingredients, but I'll need you to bring me", "one bunch of cadava berries."); + stage = 42; + break; + case 42: + player("I'll bear that in mind."); + stage = 43; + break; + case 43: + end(); + break; + case 140: + npc("Sorry, charity is not my strong point."); + stage = 141; + break; + case 141: + end(); + break; + case 500: + interpreter.sendDialogues(player, null, "I need a Cadava potion to help Romeo and Juliet."); + stage = 501; + break; + case 501: + interpreter.sendDialogues(npc, null, "Cadava potion. It's pretty nasty. And hard to make."); + stage = 502; + break; + case 502: + interpreter.sendDialogues(npc, null, "Wing of rat, tail of frog.", "Ear of snake and horn of dog."); + stage = 503; + break; + case 503: + interpreter.sendDialogues(npc, null, "I have all that, but i need some Cadava berries."); + stage = 504; + break; + case 504: + interpreter.sendDialogues(npc, null, "You will have to find them while I get the rest ready."); + stage = 505; + break; + case 505: + interpreter.sendDialogues(npc, null, "Bring them here when you have them. But be careful.", "They are nasty."); + stage = 506; + break; + case 506: + player.getQuestRepository().getQuest("Romeo & Juliet").setStage(player, 50); + interpreter.sendDialogues(player, null, "Ok, thanks."); + stage = 507; + break; + case 507: + end(); + break; + case 637: + interpreter.sendItemMessage(753, "You hand over the berries."); + stage = 638; + break; + case 638: + if (player.getInventory().remove(CADAVA_BERRIES)) { + npc("Phew! Here is what you need."); + } + stage = 639; + break; + case 639: + if (!player.getInventory().add(CADAVA_POTION)) { + GroundItemManager.create(new GroundItem(CADAVA_POTION, player.getLocation(), player)); + } + interpreter.sendItemMessage(756, "The Apothecary gives you a Cavada potion."); + stage = 640; + break; + case 640: + player.getQuestRepository().getQuest("Romeo & Juliet").setStage(player, 60); + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 638 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ArchaeologicalExpertDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ArchaeologicalExpertDialogue.java new file mode 100644 index 000000000..82ac3a222 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ArchaeologicalExpertDialogue.java @@ -0,0 +1,51 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the archaeologicals expert dialogue. + * @author Aero + * @version 1.0 + */ +@Initializable +public class ArchaeologicalExpertDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ArchaeologicalExpertDialogue} {@code Object}. + */ + public ArchaeologicalExpertDialogue() { + /** + * Empty to stop instantiation. + */ + } + + /** + * Constructs a new {@code ArchaeologicalExpertDialogue} {@code Object}. + * @param player The player to construct the class for. + */ + public ArchaeologicalExpertDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ArchaeologicalExpertDialogue(player); + } + + @Override + public boolean open(Object... args) { + return false; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 619 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ArdougneBaker.java b/Server/src/main/java/Server/core/game/content/dialogue/ArdougneBaker.java new file mode 100644 index 000000000..83b50d1a8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ArdougneBaker.java @@ -0,0 +1,58 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Replacement for ArdougneBaker.asc + * @author ceik + */ + +@Initializable +public class ArdougneBaker extends DialoguePlugin { + public ArdougneBaker(){ + /** + * Empty on purpose + */ + } + public ArdougneBaker(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){return new ArdougneBaker(player);} + + @Override + public boolean open(Object... args) { + npc = (NPC)args[0]; + npc("Good day, monsieur. Would you like ze nice", "freshly-baked bread? Or perhaps a nice piece of cake?"); + stage = 1; + return true; + } + + @Override + public final boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 1: + interpreter.sendOptions("Choose an option.", "Let's see what you have.", "No thank you."); + stage = 2; + break; + case 2: + switch(buttonId){ + case 1: + end(); + npc.openShop(player); + stage = 20; + break; + case 2: + end(); + break; + } + break; + } + return true; + } + @Override + public int[] getIds() { + return new int[] { 571 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ArdougneShopKeeperPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/ArdougneShopKeeperPlugin.java new file mode 100644 index 000000000..891fb7697 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ArdougneShopKeeperPlugin.java @@ -0,0 +1,83 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the arougne shop keepers. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ArdougneShopKeeperPlugin extends DialoguePlugin { + + /** + * Constructs a new {@code ArdouShopKeeperPlugin} {@code Object}. + */ + public ArdougneShopKeeperPlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ArdouShopKeeperPlugin} {@code Object}. + * @param player the player. + */ + public ArdougneShopKeeperPlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ArdougneShopKeeperPlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello, you look like a bold adventurer. You've come to the", "right place for adventurers' equipment."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Oh, that sounds interesting.", "How should I use your shop?", "No, sorry, I've come to the wrong place."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm glad you ask! You can buy as many of the items", "stocked as you wish. You can also sell most items to the", "shop."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmph. Well, perhaps next time you'll need something", "from me?"); + stage = 30; + break; + + } + break; + case 20: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 590, 591 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/AsyffDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/AsyffDialogue.kt new file mode 100644 index 000000000..85b5866f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/AsyffDialogue.kt @@ -0,0 +1,58 @@ +package core.game.content.dialogue + +import core.game.component.Component +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * Dialogue for Asyff, the fancy dress shop owner + * @author Ceikry + */ +@Initializable +class AsyffDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player(FacialExpression.ASKING,"Err...what are you saying exactly?").also { stage++ } + 1 -> npc(FacialExpression.LAUGH,"I'm just saying that perhaps you would","like to peruse my selection of garments.").also { stage++ } + 2 -> npc(FacialExpression.LAUGH,"Or, if that doesn't interest you, then maybe you have","something else to offer? I'm always on the look out","for interesting or unusual new materials.").also { stage++ } + 3 -> options("Okay, let's see what you've got then.","Can you make clothing suitable for hunting in?","I think I might just leave the perusing for now thanks.","What sort of unusual materials did you have in mind?").also { stage++ } + 4 -> when(buttonId){ + 1 -> player("Okay, let's see what you've got then.").also { stage = 10 } + 2 -> player("Can you make clothing suitable for hunting?").also { stage = 20 } + 3 -> player("I think I might just leave the perusing for now, thanks.").also { stage = 30 } + 4 -> player("What sort of unusual materials did you have in mind?").also { stage = 40 } + } + + //Okay, let's see what you've got then + 10 -> end().also { npc.openShop(player) } + + //Can you make clothing suitable for hunting + 20 -> end().also { player.interfaceManager.open(Component(477)) }//Open custom fur clothing interface + + //I think I might just leave the perusing for now, thanks. + 30 -> end() + + //What sort of unusual materials do you have in mind? + 40 -> npc("Well, some more colourful feathers might be useful.","For some surreal reason, all I normally seem to get offered","are large quantities of rather beaten up chicken feathers.").also { stage++ } + 41 -> npc("People must have some very strange pastimes around","these parts, that's all I can say.").also { stage++ } + 42 -> player("Ok, let's see what you've got then.").also { stage = 10 } + } + return true + } + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.HAPPY,"Now you look like someone who goes to","a lot of fancy dress parties.") + stage = 0 + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AsyffDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(554) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BKListenDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BKListenDialogue.java new file mode 100644 index 000000000..83bf1aa6e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BKListenDialogue.java @@ -0,0 +1,159 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the dialogue of listening throug a grill during the black knights' + * fortress quest. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BKListenDialogue extends DialoguePlugin { + + /** + * Represents the cabbage item. + */ + private static final Item CABBAGE = new Item(1965); + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(832); + + /** + * Represents the captain npc. + */ + private final int captain = 610; + + /** + * Represents the witch npc. + */ + private final int witch = 611; + + /** + * Represents the goblin greldo npc. + */ + private final int greldo = 612; + + /** + * Represents the cat npc. + */ + private final int cat = 4607; + + /** + * Constructs a new {@code BKListenDialogue} {@code Object}. + */ + public BKListenDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BKListenDialogue} {@code Object}. + * @param player the player. + */ + public BKListenDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BKListenDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args != null && args.length == 2) { + interpreter.sendDialogues(witch, null, "Where has Greldo got to with that magic cabbage!"); + stage = 10; + player.animate(ANIMATION); + return true; + } + interpreter.sendDialogues(captain, null, "So... how's the secret weapon coming along?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(witch, null, "The invincibility potion is almost ready..."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(witch, null, "It's taken me FIVE YEARS, but it's almost ready."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(witch, null, "Greldo the Goblin here is just going to fetch the last", "ingredient for me."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(witch, null, "It's a specially grown cabbage grown by my cousin", "Helda who lives in Draynor Manor."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(witch, null, "The soil there is slightly magical and it gives the", "cabbages slight magical properties...."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(witch, null, "...not to mention the trees!"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(witch, null, "Now remember Greldo, only a Draynor Manor", "cabbage will do! Don't get lazy and bring any old", "cabbage, THAT would ENTIRELY wreck the potion!"); + stage = 7; + break; + case 7: + interpreter.sendDialogues(greldo, null, "Yeth, Mithreth."); + stage = 8; + break; + case 8: + player.getQuestRepository().getQuest("Black Knights' Fortress").setStage(player, 20); + end(); + break; + case 10: + interpreter.sendDialogues(captain, null, "What's that noise?"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(witch, null, "Hopefully Greldo with the cabbage... yes, look her it", "co....NOOOOOoooo!"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(witch, null, "My potion!"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(captain, null, "Oh boy, this doesn't look good!"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(cat, null, "Meow!"); + stage = 15; + break; + case 15: + if (player.getInventory().remove(CABBAGE)) { + player.getQuestRepository().getQuest("Black Knights' Fortress").setStage(player, 30); + interpreter.sendDialogues(player, null, "Looks like my work here is done. Seems like that's", "succesfully sabotaged their little secret weapon plan."); + stage = 16; + } + break; + case 16: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 992752973 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BananaCrateDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BananaCrateDialogue.java new file mode 100644 index 000000000..e6b7dbb3c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BananaCrateDialogue.java @@ -0,0 +1,85 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the banana crate dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BananaCrateDialogue extends DialoguePlugin { + + /** + * Represents the dialogue id. + */ + public static final int ID = 9682749; + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(832); + + /** + * Represents the banana item. + */ + private static final Item BANANA = new Item(1963); + + /** + * Constructs a new {@code BananaCrateDialogue} {@code Object}. + */ + public BananaCrateDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BananaCrateDialogue} {@code Object}. + * @param player the player. + */ + public BananaCrateDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BananaCrateDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendOptions("Do you want to take a banana?", "Yes.", "No."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + if (player.getInventory().add(BANANA)) { + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You take a banana."); + } + end(); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BanditCampBartenderDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BanditCampBartenderDialogue.java new file mode 100644 index 000000000..152a7bb12 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BanditCampBartenderDialogue.java @@ -0,0 +1,52 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the Bandit Camp Bartender dialogue + * @author Aero + * @version 1.0 + */ +@Initializable +public class BanditCampBartenderDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BanditCampBartender} {@code Object}. + */ + public BanditCampBartenderDialogue() { + /** + * Empty to stop instantiation. + */ + } + + /** + * Constructs a new {@code BanditCampBartender} {@code Object}. + * @param player The player to construct the class for. + */ + public BanditCampBartenderDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BanditCampBartenderDialogue(player); + } + + @Override + public boolean open(Object... args) { + + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1921 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BankerTutorDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BankerTutorDialogue.java new file mode 100644 index 000000000..6d0b00d94 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BankerTutorDialogue.java @@ -0,0 +1,154 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the banker tutor dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BankerTutorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BankerTutorDialogue} {@code Object}. + * @param player the player. + */ + public BankerTutorDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code BankerTutorDialogue} {@code Object}. + */ + public BankerTutorDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BankerTutorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = args[0] instanceof NPC ? (NPC) args[0] : null; + npc("Good day, how may I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("How do I use the bank?", "I'd like to access my bank account please.", "I'd like to check my PIN settings."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + options("Using the bank itself.", "Using Bank deposit boxes.", "What's this PIN thing that people keep talking about?", "Goodbye."); + stage = 9; + break; + case 2: + end(); + player.getBank().open(); + break; + case 3: + end(); + player.getBankPinManager().openSettings(); + break; + } + break; + case 9: + switch (buttonId) { + case 1: + player("Using the bank itself. I'm not sure how....?"); + stage = 10; + break; + case 2: + player("Using Bank deposit boxes.... what are they?"); + stage = 20; + break; + case 3: + player("What's this PIN thing that people keep talking about?"); + stage = 30; + break; + case 4: + player("Goodbye."); + stage = 99; + break; + } + break; + case 10: + npc("Speak to any banker and ask to see your bank", "account. If you have set a PIN you will be asked for", "it, then all the belongings you have placed in the bank", "will appear in the window. To withdraw one item, left-"); + stage = 11; + break; + case 11: + npc("click on it once."); + stage = 12; + break; + case 12: + npc("To withdraw many, right-click on the item and select", "from the menu. The same for depositing, left-click on", "the item in your inventory to deposit it in the bank.", "Right-click on it to deposit many of the same items."); + stage = 13; + break; + case 13: + npc("To move things around in your bank: firstly select", "Swap or Insert as your default moving mode, you can", "find these buttons on the bank window itself. Then click", "and drag an item to where you want it to appear."); + stage = 14; + break; + case 14: + npc("You may withdraw 'notes' or 'certificates' when the", "items you are trying to withdraw do not stack in your", "inventory. This will only work for items which are", "tradeable."); + stage = 15; + break; + case 15: + npc("For instance, if you wanted to sell 100 logs to another", "player, they would not fit in one inventory and you", "would need to do multiple trades. Instead, click the", "Note button to do withdraw the logs as 'certs' or 'notes',"); + stage = 16; + break; + case 16: + npc("then withdraw the items you need."); + stage = 99; + break; + case 20: + npc("They look like grey pillars, there's one just over there,", "near the desk. Bank deposit boxes save so much time.", "If you're simply wanting to deposit a single item, 'Use'", "it on the deposit box."); + stage = 21; + break; + case 21: + npc("Otherwise, simply click once on the box and it will give", "you a choice of what to deposit in an interface very", "similar to the bank itself. Very quick for when you're", "simply fishing or mining etc."); + stage = 22; + break; + case 22: + end(); + break; + case 30: + npc("The PIN - Personal Identification Number - can be", "set on your bank account to protect the items there in", "case someone finds out your account password. It", "consists of four numbers that you remember and tell"); + stage = 31; + break; + case 31: + npc("no one."); + stage = 32; + break; + case 32: + npc("So if someone did manage to get your password they", "couldn't steal your items if they were in the bank."); + stage = 33; + break; + case 33: + end(); + break; + case 99: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4907 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BaraekDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BaraekDialogue.java new file mode 100644 index 000000000..d1ce7f83c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BaraekDialogue.java @@ -0,0 +1,383 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the baraek npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BaraekDialogue extends DialoguePlugin { + + /** + * Represents the fur item. + */ + private static final Item FUR = new Item(6814); + + /** + * Represents the buy coins item. + */ + private static final Item BUY_COINS = new Item(995, 12); + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 20); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code BaraekDialogue} {@code Object}. + */ + public BaraekDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BaraekDialogue} {@code Object}. + * @param player the player. + */ + public BaraekDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BaraekDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Shield of Arrav"); + switch (quest.getStage(player)) { + case 30: + if (!player.getInventory().containsItem(FUR)) { + interpreter.sendOptions("Select an Option", "Can you tell me where I can find the Phoenix Gang?", "Can you sell me some furs?", "Hello. I am in search of a quest."); + stage = 0; + } else { + interpreter.sendOptions("Select an Option", "Can you tell me where I can find the Phoenix Gang?", "Can you sell me some furs?", "Hello. I am in search of a quest.", "Would you like to buy my fur?"); + stage = 40; + } + break; + default: + if (player.getInventory().containsItem(FUR)) { + options("Can you sell me some furs?", "Hello. I am in search of a quest.", "Would you like to buy my fur?"); + stage = 40; + } else { + options("Can you sell me some furs?", "Hello. I am in search of a quest."); + stage = 0; + } + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 40: + switch (stage) { + case 111: + npc("Gang. they're operating there under the name of", "VTAM Corporation. Be careful. The Phoenixes ain't", "the type to be messed about."); + stage = 112; + break; + case 112: + player("Thanks!"); + stage = 113; + break; + case 113: + end(); + break; + case 120: + npc("Heh. If you wanna deal with the Phoenix Gand they're", "involved in much worse than a bit of briber."); + stage = 121; + break; + case 121: + end(); + break; + case 130: + end(); + break; + } + case 30: + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player("Can you tell me where I can find the Phoenix Gang?"); + stage = 10; + break; + case 2: + player("Can you sell me some furs?"); + stage = 20; + break; + case 3: + player("Hello! I am in search of a quest."); + stage = 30; + break; + } + break; + case 10: + npc("Sh sh sh, not so loud! You don't want to get me in", "trouble!"); + stage = 11; + break; + case 11: + player("So DO you know where they are?"); + stage = 12; + break; + case 12: + npc("I may do."); + stage = 13; + break; + case 13: + npc("But I don't to get in trouble for revealing their", "hideout."); + stage = 14; + break; + case 14: + npc("Of course, if I was, say 20 gold coins richer I may", "happen to be more inclined to take that sort of risk..."); + stage = 15; + break; + case 15: + options("Okay. Have 20 gold coins.", "No, I don't like things like bribery.", "Yes. I'd like to be 20 gold coins richer too."); + stage = 16; + break; + case 16: + switch (buttonId) { + case 1: + player("Okay. Have 20 gold coins."); + stage = 110; + break; + case 2: + player("No, I don't like things like bribery."); + stage = 120; + break; + case 3: + player("Yes. I'd like to be 20 gold coins richer too."); + stage = 130; + break; + } + break; + case 110: + if (!player.getInventory().containsItem(COINS)) { + break; + } + if (player.getInventory().remove(COINS)) { + quest.setStage(player, 40); + npc("Ok, to get to the gang hideout, enter Varrock through", "the south gate. Then, if you take the first turning east", "somewhere along there is an alleway to the south. The", "door at the end of there is an entrance to the Phoenix"); + stage = 111; + } else { + player("I don't have enough coins."); + stage = 121; + } + break; + case 121: + end(); + break; + case 30: + npc("Sorry kiddo, I'm a fur trader not a damsel in distress."); + stage = 31; + break; + case 31: + end(); + break; + case 40: + switch (buttonId) { + case 1: + player("Can you tell me where I can find the Phoenix Gang?"); + stage = 10; + break; + case 2: + stage = 80; + handleFurBuy(buttonId); + break; + case 3: + player("Hello! I am in search of a quest."); + stage = 30; + break; + case 4: + player("Can you sell me some furs?"); + stage = 20; + break; + } + break; + default: + handleFurBuy(buttonId); + handleFurSelling(buttonId); + break; + } + break; + default: + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player("Can you sell me some furs?"); + stage = 20; + break; + case 2: + player("Hello! I am in search of a quest."); + stage = 30; + break; + } + break; + case 30: + npc("Sorry kiddo, I'm a fur trader not a damsel in distress."); + stage = 31; + break; + case 31: + end(); + break; + case 40: + switch (buttonId) { + case 1: + player("Can you sell me some furs?"); + stage = 20; + break; + case 2: + player("Hello! I am in search of a quest."); + stage = 30; + break; + case 3: + stage = 80; + handleFurBuy(buttonId); + break; + } + break; + default: + handleFurBuy(buttonId); + handleFurSelling(buttonId); + break; + } + break; + } + return true; + } + + /** + * Method used to handle the fur selling. + * @param buttonId the button id. + */ + public void handleFurSelling(int buttonId) { + switch (stage) { + case 20: + npc("Yeah, sure. They're 20 gold coins each."); + stage = 21; + break; + case 21: + options("Yeah, okay, here you go.", "20 gold coins? That's an outrade!"); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + player("Yeah, OK, here you go."); + stage = 25; + break; + case 2: + player("20 gold coins? That's an outrage!"); + stage = 23; + break; + } + break; + case 23: + npc("Well, I can't go any cheaper than that mate. I have a", "family to feed."); + stage = 24; + break; + case 24: + end(); + break; + case 25: + if (player.getInventory().remove(COINS)) { + if (!player.getInventory().add(FUR)) { + GroundItemManager.create(FUR, player); + } + interpreter.sendItemMessage(FUR.getId(), "Baraeck sells you a fur."); + stage = 26; + } else { + player("Oops, I dont' seem to have enough coins."); + stage = 24; + } + break; + case 26: + end(); + break; + } + } + + /** + * Method used to handle the buying of fur. + * @param buttonId the buttonId. + */ + public void handleFurBuy(int buttonId) { + switch (stage) { + case 80: + player("Would you like to buy my fur?"); + stage = 81; + break; + case 81: + npc("Let's have a look at it."); + stage = 82; + break; + case 82: + interpreter.sendItemMessage(FUR.getId(), "You hand Baraeck your fur to look at."); + stage = 83; + break; + case 83: + npc("It's not in the best condition. I guess I could give you", "12 coins for it."); + stage = 84; + break; + case 84: + options("Yeah, that'll do.", "I think I'll keep hold of it actually."); + stage = 85; + break; + case 85: + switch (buttonId) { + case 1: + player("Yeah, that'll do."); + stage = 89; + break; + case 2: + player("I think I'll keep hold of it actually!"); + stage = 87; + break; + } + break; + case 87: + npc("Oh ok. Didn't want it anyway!"); + stage = 88; + break; + case 88: + end(); + break; + case 89: + if (player.getInventory().remove(FUR)) { + if (!player.getInventory().add(BUY_COINS)) { + GroundItemManager.create(BUY_COINS, player); + } + player("Thanks!"); + stage = 90; + } + break; + case 90: + end(); + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 547 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BarbarianDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BarbarianDialogue.java new file mode 100644 index 000000000..9bd76f415 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BarbarianDialogue.java @@ -0,0 +1,85 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for barbarians. + * @author 'Vexia + * @version 1.5 + */ +@Initializable +public final class BarbarianDialogue extends DialoguePlugin { + + /** + * Represents the barbarian npc ids. + */ + private static final int[] IDS = new int[] { 12, 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 5909 }; + + /** + * Constructs a new {@code BarbarianDialogue} {@code Object}. + */ + public BarbarianDialogue() { + /** + * empty + */ + } + + /** + * Constructs a new {@code BarbarianDialogue} {@code Object}. + * @param player the player. + */ + public BarbarianDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BarbarianDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What do you want, outerlander?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Let's fight!", "Goodbye."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Let's fight!"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Goodbye."); + stage = 10; + break; + } + break; + case 10: + end(); + break; + case 20: + end(); + npc.getProperties().getCombatPulse().attack(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return IDS; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BarfyBill.java b/Server/src/main/java/Server/core/game/content/dialogue/BarfyBill.java new file mode 100644 index 000000000..7420dbcb3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BarfyBill.java @@ -0,0 +1,151 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for barfy bill. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BarfyBill extends DialoguePlugin { + + /** + * Constructs a new {@code BarfyBill} {@code Object}. + */ + public BarfyBill() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BarfyBill} {@code Object}. + * @param player the player. + */ + public BarfyBill(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BarfyBill(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Oh! Hello there."); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Who are you?", "Can you teach me about Canoeing?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 1000; + break; + case 2: + npc("It's really quite simple. Just walk down to that tree on", "the water bank and chop it down."); + stage = 24; + break; + } + break; + case 24: + npc("Then take your hatchet to it and shape it how you like!"); + stage = 26; + break; + case 26: + npc("You look like you know your way around a tree,", "you can make a canoe."); + stage = 27; + break; + case 27: + end(); + break; + case 1000: + npc("My name is Ex Sea Captain Barfy Bill."); + stage = 1001; + break; + case 1001: + player("Ex sea captain?"); + stage = 1002; + break; + case 1002: + npc("Yeah, I bought a lovely ship and was planning to make", "a fortune running her as a merchant vessel."); + stage = 1003; + break; + case 1003: + player("Why are you not still sailing?"); + stage = 1004; + break; + case 1004: + npc("Chronic sea sickness. My first, and only, voyage was", "spent dry heaving over the rails."); + stage = 1005; + break; + case 1005: + npc("If I had known about the sea sickness I could have", "saved myself a lot of money."); + stage = 1006; + break; + case 1006: + player("What are you up to now then?"); + stage = 1007; + break; + case 1007: + npc("Well my ship had a little fire related problem.", "Fortunately it was well insured."); + stage = 1008; + break; + case 1008: + npc("Anyways, I don't have to work anymore so I've taken to", "canoeing on the river."); + stage = 1009; + break; + case 1009: + npc("I don't get river sick!"); + stage = 69; + break; + case 69: + npc("Would you like to know how to make a canoe?"); + stage = 6000; + break; + case 6000: + interpreter.sendOptions("Select an Option", "Yes", "No"); + stage = 504; + break; + case 504: + switch (buttonId) { + case 1: + player("Could you teach me about canoes?"); + stage = 560; + break; + case 2: + end(); + break; + } + break; + case 560: + npc("It's really quite simple. Just walk down to that tree on", "the water bank and chop it down."); + stage = 24; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3331 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BarkerDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BarkerDialogue.java new file mode 100644 index 000000000..1aacd65c7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BarkerDialogue.java @@ -0,0 +1,83 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the barker npc dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BarkerDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BarkerDialogue} {@code Object}. + */ + public BarkerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BarkerDialogue} {@code Object}. + * @param player the player. + */ + public BarkerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BarkerDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You are looking for clothes, yes? You look at my", "products! I have very many nice clothes, yes?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); + stage = 20; + break; + } + break; + case 20: + end(); + break; + case 10: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1039 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BeaverDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BeaverDialogue.java new file mode 100644 index 000000000..e00dfc218 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BeaverDialogue.java @@ -0,0 +1,64 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the beaver dialgoue. + * @author Empathy + * + */ +@Initializable +public final class BeaverDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BeaverDialogue} {@code Object}. + */ + public BeaverDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BeaverDialogue} {@code Object}. + * + * @param player the player. + */ + public BeaverDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BeaverDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How much wood would a woodchuck chuck if a", "woodchuck could chuck wood?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Approximately 32,768 depending on his woodcutting", "level."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8635 }; + } + } diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BennyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BennyDialogue.java new file mode 100644 index 000000000..a1852acf8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BennyDialogue.java @@ -0,0 +1,162 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the benny npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BennyDialogue extends DialoguePlugin { + + /** + * Represents the item coins related to benny. + */ + private static final Item COINS = new Item(995, 50); + + /** + * Represents the newspaper item related to benny. + */ + private static final Item NEWSPAPER = new Item(11169, 1); + + /** + * Constructs a new {@code BennyDialogue} {@code Object}. + */ + public BennyDialogue() { + /* + * ( empty. + */ + } + + /** + * Constructs a new {@code BennyDialogue} {@code Object}. + * @param player the player. + */ + public BennyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BennyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + options("Can I have a newspaper, please?", "How much does a paper cost?", "Varrock Herald? Never heard of it.", "Anything interesting in there?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player("Can I have a newspaper, please?"); + stage = 10; + break; + case 2: + player("How much does a paper cost?"); + stage = 20; + break; + case 3: + player("Varrock Herald? Never heard of it."); + stage = 30; + break; + case 4: + player("Anything interesting in there?"); + stage = 40; + break; + } + break; + case 10: + npc("Certainly, Guv. That'll be 50 gold pieces, please."); + stage = 11; + break; + case 11: + options("Sure, here you go.", "Uh, no thanks, I've changed my mind"); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("Sure, here you go."); + stage = 13; + break; + case 2: + player("No, thanks."); + stage = 14; + break; + } + break; + case 13: + if (!player.getInventory().contains(995, 50)) { + end(); + player.getPacketDispatch().sendMessage("You need 50 gold coins to buy a newspaper."); + + } else if (player.getInventory().freeSlot() == 0) { + end(); + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + } else { + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + player.getInventory().remove(COINS); + player.getInventory().add(NEWSPAPER); + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 7); + end(); + } + break; + case 14: + npc("Ok, suit yourself. Plenty more fish in the sea."); + stage = 100; + break; + case 20: + npc("Just 50 gold pieces! An absolute bargain! Want one?"); + stage = 21; + break; + case 21: + options("Yes, please.", "No, thanks."); + stage = 22; + break; + case 22: + if (buttonId == 1) { + player("Yes, please."); + stage = 13; + } else if (buttonId == 2) { + player("No, thanks."); + stage = 14; + } + break; + case 30: + npc("For the illiterate amongst us, I shall elucidate. The", "Varrock Herald is a new newspaper. It is edited, printed", "and published by myself, Benny Gutenberg, and each", "edition promises to enthrall the reader with captivating "); + stage = 31; + break; + case 31: + npc("material! Now, can I interest you in buying one for a mere", "50 gold?"); + stage = 21; + break; + case 40: + npc("Of course there is, mate. Packed full of thought provoking", "insights, contentious interviews and celebrity", "scandalmongering! An excellent read and all for just 50", "coins! Want one?"); + stage = 21; + break; + case 100: + end(); + break; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 5925 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BernaldDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BernaldDialogue.java new file mode 100644 index 000000000..9eeb1b769 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BernaldDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the bernald npc. + * @author 'Vexia + * @version 1.1 + */ +@Initializable +public final class BernaldDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BernaldDialogue} {@code Object}. + */ + public BernaldDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BernaldDialogue} {@code Object}. + * @param player the player. + */ + public BernaldDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BernaldDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("How are your grapes coming along?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Marvellous, thanks to your help, " + player.getUsername() + "!"); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2580 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BettyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BettyDialogue.java new file mode 100644 index 000000000..00632d34e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BettyDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin for the betty npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BettyDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BettyDialogue} {@code Object}. + */ + public BettyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BettyDialogue} {@code Object}. + * @param player the player. + */ + public BettyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BettyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to the magic emporium."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Can I see your wares?", "Sorry, I'm not into Magic."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I'm not into Magic."); + stage = 20; + break; + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, if you see ayone who is into Magic, please send", "them my way."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 583 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BillTeachDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BillTeachDialogue.java new file mode 100644 index 000000000..8ec4998bc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BillTeachDialogue.java @@ -0,0 +1,219 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the dialogue plugin used for Bill Teach + * @author Charlie + * @version 1.0 + */ +@Initializable +public final class BillTeachDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BarfyBill} {@code Object}. + */ + public BillTeachDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BarfyBill} {@code Object}. + * @param player the player. + */ + public BillTeachDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BillTeachDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = new NPC(3155); + player("Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Arr'! Avast ye' scallywag!", "You be lookin' to get somewhere " + (player.isMale() ? "lad?" : "lass?")); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Yes", "No, thank you"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Yes, where can you take me?"); + stage = 1000; + break; + case 2: + npc("Arr'! You be wastin' my time again.."); + stage = 7; + break; + } + break; + case 1000: + npc("Aye, take a browse through me options."); + stage++; + break; + case 1001: + interpreter.sendOptions("Select an Option", "Slayer Tower", "Zanaris Fairy Ring", "Gnome Stronghold", "Rellekka", "More"); + stage = 2000; + break; + case 2000: + switch (buttonId) { + case 1: + if(!player.getQuestRepository().isComplete("Priest in Peril")) { + npc("Aye, sorry there " + pirateGender() + ", but you'll be needing to ", "help King Roald with something first."); + stage = 7; + } else { + end(); + player.teleport(new Location(3429, 3526, 0)); + } + break; + case 2: + if(!player.getQuestRepository().isComplete("Lost City")) { + npc("Aye, sorry there " + pirateGender() + ", but you'll be needing to ", "discover Zanaris first."); + stage = 7; + } else { + end(); + player.teleport(new Location(2412, 4433, 0)); + } + break; + case 3: + end(); + player.teleport(new Location(2461, 3444, 0)); + break; + case 4: + end(); + player.teleport(new Location(2669, 3631, 0)); + break; + case 5: + interpreter.sendOptions("Select an Option", "Kalphite Lair", "Asgarnian Ice Dungeon", "Fremmenik Dungeon", "Taverley Dungeon", "More"); + stage = 3000; + break; + } + break; + case 3000: + switch (buttonId) { + case 1: + end(); + player.teleport(new Location(3227, 3107, 0)); + break; + case 2: + end(); + player.teleport(new Location(3007, 9550, 0)); + break; + case 3: + end(); + player.teleport(new Location(2808, 10002, 0)); + break; + case 4: + end(); + player.teleport(new Location(2884, 9798, 0)); + break; + case 5: + interpreter.sendOptions("Select an Option", "Waterfall Dungeon", "Brimhaven Dungeon", "Ape Atoll Dungeon", "God Wars Dungeon", "More"); + stage = 4000; + break; + } + break; + case 4000: + switch (buttonId) { + case 1: + end(); + player.teleport(new Location(2575, 9861, 0)); + break; + case 2: + end(); + player.teleport(new Location(2713, 9564, 0)); + break; + case 3: + end(); + player.teleport(new Location(2715, 9184, 0)); + break; + case 4: + end(); + player.teleport(new Location(2898, 3710, 0)); + break; + case 5: + interpreter.sendOptions("Select an Option", "Shilo Village", "Yanille", "Zul-Andra", "Piscatoris Fishing Colony", "More"); + stage = 5000; + break; + } + break; + case 5000: + switch (buttonId) { + case 1: + end(); + player.teleport(new Location(2867, 2952, 0)); + break; + case 2: + end(); + player.teleport(new Location(2544, 3096, 0)); + break; + case 3: + end(); + player.teleport(new Location(2193, 3055, 0)); + break; + case 4: + end(); + player.teleport(new Location(2343, 3663, 0)); + break; + case 5: + interpreter.sendOptions("Select an Option", "Bandit Camp", "Miscellenia", "Mort'ton", "Feldip Hills", "Back"); + stage = 6000; + break; + } + break; + case 6000: + switch (buttonId) { + case 1: + end(); + player.teleport(new Location(3176, 2987, 0)); + break; + case 2: + end(); + player.teleport(new Location(2581, 3845, 0)); + break; + case 3: + end(); + player.teleport(new Location(3488, 3296, 0)); + break; + case 4: + end(); + player.teleport(new Location(2525, 2915, 0)); + break; + case 5: + interpreter.sendOptions("Select an Option", "Slayer Tower", "Zanaris Fairy Ring", "Gnome Stronghold", "Rellekka", "More"); + stage = 2000; + break; + } + break; + case 7: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3155 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BlurberryDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/BlurberryDialogue.kt new file mode 100644 index 000000000..c9d879d80 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BlurberryDialogue.kt @@ -0,0 +1,91 @@ +package core.game.content.dialogue + +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.tools.Items +import core.game.content.activity.gnomecooking.GC_BASE_ATTRIBUTE +import core.game.content.activity.gnomecooking.GC_TUT_FIN +import core.game.content.activity.gnomecooking.GC_TUT_PROG + +@Initializable +class BlurberryDialogue(player: Player? = null): DialoguePlugin(player) { + var tutorialProgress = -1 + var tutorialComplete = false + + override fun newInstance(player: Player?): DialoguePlugin { + return BlurberryDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + tutorialComplete = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_TUT_FIN",false) + tutorialProgress = player.getAttribute("$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",-1) + + if(tutorialProgress == 18){ + npc("Yes, you, Aluft said you would be coming.") + stage = 0 + return true + } + + if(tutorialComplete){ + npc("I do hope you're enjoying your work!") + stage = 1000 + return true + } + + npc("Hello, have you made that drink for me?") + stage = tutorialProgress + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player("Yes! What is it I need to do?").also { stage++ } + 1 -> npc("Well, I'd like to show you how to make","a drink.").also { stage++ } + 2 -> player("Woah, sounds like fun!").also{ stage++ } + 3 -> npc("Alright, then, let's get to it!").also { stage++ } + 4 -> npc("I want you to make me a fruit blast. Simple drink!").also{ stage++ } + 5 -> npc("Here's everything you need.").also { stage++ } + 6 -> { + end() + val items = arrayOf(Item(Items.KNIFE_946),Item(Items.COCKTAIL_SHAKER_2025),Item(Items.COCKTAIL_GLASS_2026),Item(Items.PINEAPPLE_2114),Item(Items.LEMON_2102,2), Item(Items.ORANGE_2108)) + if(player.inventory.hasSpaceFor(*items)){ + player.inventory.add(*items) + player.setAttribute("/save:$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",20) + } else { + player.dialogueInterpreter.sendDialogue("You don't have enough room for the items.") + } + } + + 20 -> { + if(player.inventory.containsItem(Item(Items.FRUIT_BLAST_9514))){ + player("Yes, yes I have! Here you go.").also { stage++ } + } else { + player("No I have not.").also { stage = 1000 } + } + } + + 21 -> { + player.dialogueInterpreter.sendDialogue("You hand over the fruit blast.") + player.inventory.remove(Item(Items.FRUIT_BLAST_9514)) + player.setAttribute("/save:$GC_BASE_ATTRIBUTE:$GC_TUT_PROG",22) + stage++ + } + + 22 -> npc("Excellent, I think you're ready to go on the job!").also { stage++ } + 23 -> { + npc("Go back and speak with Aluft now.") + player.setAttribute("/save:$GC_BASE_ATTRIBUTE:$GC_TUT_FIN",true) + stage = 1000 + } + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(848) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BobBarterDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BobBarterDialogue.java new file mode 100644 index 000000000..1178c0166 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BobBarterDialogue.java @@ -0,0 +1,120 @@ +package core.game.content.dialogue; + +import core.game.ge.GEGuidePrice; +import core.game.ge.GEGuidePrice.GuideType; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the bob barter npc dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BobBarterDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BobBarterDialogue} {@code Object}. + */ + public BobBarterDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BobBarterDialogue} {@code Object}. + * @param player the player. + */ + public BobBarterDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BobBarterDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hi."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Hello, chum, fancy buyin' some designer", "jewellery? They've come all the way from", "Ardougne! most pukka!"); + stage = 1; + break; + case 1: + player("Erm, no. I'm all set, thanks."); + stage = 2; + break; + case 2: + npc("Okay, chum. So what can I do for you? I can", "tell you the very latest herb prices."); + stage = 3; + break; + case 3: + interpreter.sendOptions("Select an Option", "Who are you?", "Can you help me out with the prices for herbs?", "Sorry, I've got to split."); + stage = 4; + break; + case 4: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("Can you help me out with the prices for herbs?"); + stage = 20; + break; + case 3: + player("Sorry, I've got to split."); + stage = 30; + break; + } + break; + case 30: + end(); + break; + case 10: + npc("Why, I'm Bob! Your friendly seller of goods!"); + stage = 11; + break; + case 11: + player("So what do you have to sell?"); + stage = 12; + break; + case 12: + npc("Oh, not much at the moment. Cuz, ya know", "Business being so well and cushie."); + stage = 13; + break; + case 13: + player("You don't really look like you're being so", "successfull."); + stage = 14; + break; + case 14: + npc("You plonka! It's all a show, innit! If I let people", "knows I'm in good business they'll want a", "share of the moolah!"); + stage = 15; + break; + case 15: + end(); + break; + case 20: + end(); + GEGuidePrice.open(player, GuideType.HERBS); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6524 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BootDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BootDialogue.java new file mode 100644 index 000000000..50cb45987 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BootDialogue.java @@ -0,0 +1,82 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used with the boot npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BootDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BootDialogue} {@code Object}. + */ + public BootDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BootDialogue} {@code Object}. + * @param player the player. + */ + public BootDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BootDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello tall person."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Hello short person.", "Why are you called boot?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello short person."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why are you called boot?"); + stage = 20; + break; + } + break; + case 10: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm called Boot, because when I was very young, I", "used to sleep, in a large boot."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 665 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BorderGuardDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BorderGuardDialogue.java new file mode 100644 index 000000000..9dca1de15 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BorderGuardDialogue.java @@ -0,0 +1,158 @@ +package core.game.content.dialogue; + +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.world.map.RegionManager; + +/** + * Represents the border guard dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BorderGuardDialogue extends DialoguePlugin { + + /** + * Represents the array of object locations. + */ + private static final Location[] LOCATIONS = new Location[] { new Location(3267, 3228, 0), new Location(3267, 3229, 0), new Location(3268, 3228, 0), new Location(3268, 3228, 0), Location.create(3267, 3227, 0), Location.create(3268, 3227, 0), new Location(3268, 3227, 0) }; + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 10); + + /** + * Represents the door game object. + */ + private GameObject door; + + /** + * Constructs a new {@code BorderGuardDialogue} {@code Object}. + */ + public BorderGuardDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BorderGuardDialogue} {@code Object}. + * @param player the player. + */ + public BorderGuardDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BorderGuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length == 2) { + door = ((GameObject) args[1]); + } + if (player.getLocation().equals(LOCATIONS[0]) || player.getLocation().equals(LOCATIONS[1]) || player.getLocation().equals(LOCATIONS[2])) { + door = RegionManager.getObject(LOCATIONS[3]); + } + if (player.getLocation().equals(LOCATIONS[4]) || player.getLocation().equals(LOCATIONS[5])) { + door = RegionManager.getObject(LOCATIONS[6]); + } + if (door == null) { + end(); + return true; + } + player("Can I come through this gate?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getQuestRepository().getQuest("Prince Ali Rescue").getStage(player) > 50) { + npc("You may pass for free, you are a friend of Al-Kharid."); + stage = 100; + } else { + npc("You must pay a toll of 10 gold coins to pass."); + stage = 1; + } + break; + case 1: + options("Okay, I'll pay.", "Who does my money go to?", "No thanks, I'll walk around."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + end(); + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (player.getInventory().remove(COINS)) { + DoorActionHandler.handleAutowalkDoor(player, door); + } else { + player.getPacketDispatch().sendMessage("You need 10 gold coins to pay the toll."); + } + break; + case 2: + player("Who does my money go to?"); + stage = 20; + break; + case 3: + npc("As you wish. Don't go too near the scorpions."); + stage = 23; + break; + + } + break; + case 20: + npc("The money goes to the city of Al-Kharid.", "Will you pay the toll?"); + stage = 21; + break; + case 21: + options("Okay, I'll pay.", "No thanks, I'll walk around."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + end(); + if (player.getInventory().remove(new Item(995, 10))) { + DoorActionHandler.handleAutowalkDoor(player, door); + } else { + player.getPacketDispatch().sendMessage("You need 10 gold coins to pay the toll."); + } + break; + case 2: + npc("As you wish. Don't go too near the scorpions."); + stage = 23; + break; + } + break; + case 23: + end(); + break; + case 100: + end(); + DoorActionHandler.handleAutowalkDoor(player, door); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 925 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BreocaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BreocaDialogue.java new file mode 100644 index 000000000..14faebce1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BreocaDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the breoca dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BreocaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BreocaDialogue} {@code Object}. + */ + public BreocaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BreocaDialogue} {@code Object}. + * @param player the player. + */ + public BreocaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BreocaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello stranger."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1084 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BrianArcheryDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BrianArcheryDialogue.java new file mode 100644 index 000000000..c9a1f8ed1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BrianArcheryDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used to handle the brain archery npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BrianArcheryDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BrianArcheryDialogue} {@code Object}. + */ + public BrianArcheryDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BrianArcheryDialogue} {@code Object}. + * @param player the player. + */ + public BrianArcheryDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BrianArcheryDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy some archery equipment?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "No thanks, I've got all the archery equipment I need.", "Let's see what you've got, then."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks, I've got all the archery equipment I need."); + stage = 10; + break; + case 2: + end(); + npc.openShop(player); + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Okay. Fare well on your travels."); + stage = 11; + break; + case 11: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1860 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BrianORichardDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BrianORichardDialogue.java new file mode 100644 index 000000000..e708c621a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BrianORichardDialogue.java @@ -0,0 +1,126 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Reprepsents the dialogue plugin used to handle the brian orichard npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BrianORichardDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BrianORichardDialogue} {@code Object}. + */ + public BrianORichardDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BrianORichardDialogue}{@code Object}. + * @param player the player. + */ + public BrianORichardDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BrianORichardDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi there, looking for a challenge are you?"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + interpreter.sendOptions("Select an Option", "Yes, actually, what've you got?", "What is this place?", "No thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes actually, what've you got?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is this place?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); + stage = 30; + break; + } + break; + case 10: + if (player.getSkills().getLevel(Skills.THIEVING) < 50) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Shame, I don't think I have anything for you. Train up", "your Thieving skill to at least 50 and I might be able to", "help you out."); + stage = 11; + } else { + + } + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah welcome to my humble home, well actually it belongs", "to mummsie but she's getting on a bit so I look after", "the place for her."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So are you interested in a challenge?"); + stage = 22; + break; + case 22: + interpreter.sendOptions("Select an Option", "Yes actually, what've you got?", "No thanks."); + stage = 23; + break; + case 23: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes actually, what've you got?"); + stage = 24; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 25; + break; + } + break; + case 24: + if (player.getSkills().getLevel(Skills.THIEVING) < 50) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Shame, I don't think I have anything for you. Train up", "your Thieving skill to at least 50 and I might be able to", "help you out."); + stage = 25; + } else { + + } + break; + case 25: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2266 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BrimhavenBartenderDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BrimhavenBartenderDialogue.java new file mode 100644 index 000000000..eec906e9e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BrimhavenBartenderDialogue.java @@ -0,0 +1,138 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the brimhaven bartender. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BrimhavenBartenderDialogue extends DialoguePlugin { + + /** + * Represents the grog item. + */ + private static final Item GROG = new Item(1915); + + /** + * Represents the rum item. + */ + private static final Item RUM = new Item(8940); + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 3); + + /** + * Represents the amount of coins to buy a pin of rum. + */ + private static final Item RUM_COINS = new Item(995, 27); + + /** + * Constructs a new {@code BrimhavenBartenerDialogue.java} {@code Object}. + */ + public BrimhavenBartenderDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BrimhavenBartenerDialogue.java} {@code Object}. + * @param player the player. + */ + public BrimhavenBartenderDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BrimhavenBartenderDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yohoho me hearty what would you like to drink?"); + stage = 99; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 99: + interpreter.sendOptions("Select an Option", "Nothing, thank you.", "A pint of Grog please.", "A bottle of rum please."); + stage = 0; + break; + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nothing, thank you."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "A pint of Grog please.."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "A bottle of rum please."); + stage = 30; + break; + } + break; + case 10: + end(); + break; + case 20: + interpreter.sendDialogues(npc, null, "One grog coming right up, that'll be three coins."); + stage = 21; + break; + case 21: + if (!player.getInventory().containsItem(COINS)) { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough coins."); + stage = 22; + return true; + } + if (!player.getInventory().remove(COINS)) { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough coins."); + stage = 22; + return true; + } + if (player.getInventory().add(GROG)) { + player.getPacketDispatch().sendMessage("You buy a pint of Grog."); + end(); + } + break; + case 22: + end(); + break; + case 30: + interpreter.sendDialogues(npc, null, "That'll be 27 coins."); + stage = 31; + break; + case 31: + if (!player.getInventory().remove(RUM_COINS)) { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough coins."); + stage = 22; + return true; + } + if (player.getInventory().add(RUM)) { + end(); + player.getPacketDispatch().sendMessage("You buy a bottle of rum."); + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 735 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BrimhavenPirateDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BrimhavenPirateDialogue.java new file mode 100644 index 000000000..28c7eb27f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BrimhavenPirateDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the brimhaven pirate dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BrimhavenPirateDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BrimhavenPirateDialogue} {@code Object}. + */ + public BrimhavenPirateDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BrimhavenPirateDialogue} {@code Object}. + * @param player the player. + */ + public BrimhavenPirateDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BrimhavenPirateDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Man overboard!"); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 183, 6349, 6350, 6346, 6347, 6348, 799 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BrosDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BrosDialogue.java new file mode 100644 index 000000000..b50003353 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BrosDialogue.java @@ -0,0 +1,59 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the bros np.c + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BrosDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BrosDialogue} {@code Object}. + */ + public BrosDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BrosDialogue} {@code Object}. + * @param player the player. + */ + public BrosDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BrosDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Out of my way, punk"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6026, 6032 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BrotherBordissDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/BrotherBordissDialogue.kt new file mode 100644 index 000000000..de58736c9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BrotherBordissDialogue.kt @@ -0,0 +1,93 @@ +package core.game.content.dialogue + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.tools.Items + +@Initializable +/** + * Handles Boriss' dialogue + * @author Ceikry + */ +class BrotherBordissDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun newInstance(player: Player?): DialoguePlugin { + return BrotherBordissDialogue(player) + } + + override fun npc(vararg messages: String?): Component { + return npc(FacialExpression.OLD_NORMAL,*messages) + } + + override fun open(vararg args: Any?): Boolean { + player ?: return false + if(getSigil(player) != null && player.inventory.contains(Items.BLESSED_SPIRIT_SHIELD_13736,1)){ + player("Can you combine my shield and sigil for me?") + stage = 10 + return true + } + + npc("Lovely day, adventurer.") + stage = 1000 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 10 -> npc("I certainly can, for the price of","1,500,000 coins.").also { stage++ } + 11 -> options("Okay, sounds great!","No, thanks.").also { stage++ } + 12 -> when(buttonId){ + 1 -> if(player.inventory.contains(995,1500000)){ + player("Okay, sounds great!") + stage = 15 + } else { + player("I'd like to, but I don't have the coin.") + stage++ + } + 2 -> player("No, thanks").also { stage = 1000 } + } + 13 -> npc("That's a shame, then.").also { stage = 1000 } + 15 -> { + npc("Lovely, here you are.") + val sigil = getSigil(player) + if(sigil == null){ + end() + return true + } + if(player.inventory.remove(sigil,Item(995,1500000),Item(Items.BLESSED_SPIRIT_SHIELD_13736))){ + player.inventory.add(getShield(player,sigil)) + } + stage++ + } + 16 -> player("Thank you!").also { stage = 1000 } + + + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(7724) + } + + + fun getSigil(player: Player): Item?{ + for(sigil in arrayOf(Items.ARCANE_SIGIL_13746,Items.DIVINE_SIGIL_13748,Items.SPECTRAL_SIGIL_13752,Items.ELYSIAN_SIGIL_13750)){ + if(player.inventory.contains(sigil,1)) return Item(sigil) + } + return null + } + + fun getShield(player: Player, sigil: Item): Item?{ + return when(sigil.id){ + Items.ARCANE_SIGIL_13746 -> Item(Items.ARCANE_SPIRIT_SHIELD_13738) + Items.ELYSIAN_SIGIL_13750 -> Item(Items.ELYSIAN_SPIRIT_SHIELD_13742) + Items.DIVINE_SIGIL_13748 -> Item(Items.DIVINE_SPIRIT_SHIELD_13740) + Items.SPECTRAL_SIGIL_13752 -> Item(Items.SPECTRAL_SPIRIT_SHIELD_13744) + else -> null + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BrotherJeredDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BrotherJeredDialogue.java new file mode 100644 index 000000000..bdb1ee515 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BrotherJeredDialogue.java @@ -0,0 +1,165 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.game.node.item.Item; +import core.tools.Items; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the BrotherJeredDialogue dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BrotherJeredDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BrotherJeredDialogue} {@code Object}. + */ + public BrotherJeredDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BrotherJeredDialogue} {@code Object}. + * @param player the player. + */ + public BrotherJeredDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BrotherJeredDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if(player.getInventory().contains(Items.UNBLESSED_SYMBOL_1716,1)){ + player("Can you bless this symbol for me?"); + stage = 10; + return true; + } + if(player.getInventory().contains(Items.HOLY_ELIXIR_13754,1) && player.getInventory().contains(Items.SPIRIT_SHIELD_13734,1)){ + player("Can you bless this spirit shield for me?"); + stage = 100; + return true; + } + if (Skillcape.isMaster(player, Skills.PRAYER)) { + player("Can I buy a Skillcape of Prayer?"); + stage = 2; + } else { + player("Praise to Saradomin!"); + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Yes! Praise he who brings life to this world."); + stage = 1; + break; + case 1: + case 12: + end(); + break; + case 2: + npc("Certainly! Right when you give me 99000 coins."); + stage = 3; + break; + case 3: + options("Okay, here you go.", "No"); + stage = 4; + break; + case 4: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 5; + break; + case 2: + end(); + break; + } + break; + case 5: + if (Skillcape.purchase(player, Skills.PRAYER)) { + npc("There you go! Enjoy."); + } + stage = 6; + break; + case 6: + end(); + break; + case 10: + npc("Sure thing! Just give me a moment, here..."); + stage++; + break; + case 11: + npc("There we go! I have laid the blessing of", "Saradomin upon it."); + player.getInventory().remove(new Item(Items.UNBLESSED_SYMBOL_1716)); + player.getInventory().add(new Item(Items.HOLY_SYMBOL_1718)); + stage++; + break; + case 100: + npc("Yes I certainly can, but for", "1,000,000 coins."); + stage++; + break; + case 101: + options("Okay, sounds good.","Oh, no thanks.."); + stage++; + break; + case 102: + switch(buttonId){ + case 1: + if(player.getInventory().contains(995,1000000)){ + player("Okay, sounds good!"); + stage = 110; + } else { + player("I'd like to but I don't have","the coin."); + stage = 120; + } + break; + case 2: + player("Oh. No, thank you, then."); + stage = 1000; + break; + } + break; + case 110: + npc("Here you are."); + if(player.getInventory().remove(new Item(Items.HOLY_ELIXIR_13754), new Item(Items.SPIRIT_SHIELD_13734),new Item(995,1000000))){ + player.getInventory().add(new Item(Items.BLESSED_SPIRIT_SHIELD_13736)); + } + stage++; + break; + case 111: + player("Thank you!"); + stage = 1000; + break; + case 120: + npc("That's too bad then."); + stage = 1000; + break; + case 1000: + end(); + break; + + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 802 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/BurthorpeSoldierDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/BurthorpeSoldierDialogue.java new file mode 100644 index 000000000..366d24e0a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/BurthorpeSoldierDialogue.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the burthorpe soldier dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BurthorpeSoldierDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BurthorpeSoldierDialogue} {@code Object}. + */ + public BurthorpeSoldierDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BurthorpeSoldierDialogue} {@code Object}. + * @param player the player. + */ + public BurthorpeSoldierDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BurthorpeSoldierDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Vacca foeda."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Er..."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1065 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CabinBoyJenkins.java b/Server/src/main/java/Server/core/game/content/dialogue/CabinBoyJenkins.java new file mode 100644 index 000000000..bbace5ed8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CabinBoyJenkins.java @@ -0,0 +1,115 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the cabin boy jenkins dialogue. + * @author 'Vexia + */ +@Initializable +public class CabinBoyJenkins extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code CabinBoyJenkins} {@code Object}. + */ + public CabinBoyJenkins() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CabinBoyJenkins} {@code Object}. + * @param player the player. + */ + public CabinBoyJenkins(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CabinBoyJenkins(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Dragon Slayer"); + switch (quest.getStage(player)) { + case 20: + npc("Ahoy ! Whay d'ye think of yer ship then?"); + stage = 0; + break; + case 40: + case 30: + interpreter.sendDialogues(918, null, "Splice the mainsail!"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 40: + case 30: + switch (stage) { + case 0: + npc("Aye aye, cap'n!"); + stage = 1; + break; + case 1: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + player("Can you sail this ship to Crandor?"); + stage = 1; + break; + case 1: + npc("Not me, sir! I'm just an 'umble cabin boy. You'll need", "a proper cap'n."); + stage = 2; + break; + case 2: + player("Where can I find a captain?"); + stage = 3; + break; + case 3: + npc("The cap'ns round 'ere seem to be a mite scared of", "Crandor. I ask 'em why and they just say it was afore", "my time,"); + stage = 4; + break; + case 4: + end(); + npc("but there is one cap'n I reckon might 'elp. I 'eard", "there's a retired 'un who lives in Draynor Village who's", "so desperate to sail again 'ed' take any job."); + stage = 5; + break; + case 5: + npc("I can't remember 'is name, but 'e lives in Draynor", "Village an' makes rope."); + stage = 6; + break; + case 6: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6085 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CallistoCubDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CallistoCubDialogue.java new file mode 100644 index 000000000..28bbb725e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CallistoCubDialogue.java @@ -0,0 +1,87 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Dialogue for the boss pet, Calliso JR + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class CallistoCubDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + */ + public CallistoCubDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + * @param player the player. + */ + public CallistoCubDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CallistoCubDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why the grizzly face?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "You're not funny..."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You should get in the.... sun more."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "You're really not funny..."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "One second, let me take a picture of you with my....", "kodiak camera."); + stage = 4; + break; + case 4: + npc(FacialExpression.OLD_NORMAL, "..."); + stage = 5; + break; + case 5: + player("Feeling... blue."); + stage = 6; + break; + case 6: + npc(FacialExpression.OLD_NORMAL, "If you don't stop, I'm going to leave some...", "brown... at your feet, human."); + stage = 7; + break; + case 7: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8597 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CamelDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/CamelDialoguePlugin.java new file mode 100644 index 000000000..f3b5fc846 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CamelDialoguePlugin.java @@ -0,0 +1,60 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the camel npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CamelDialoguePlugin extends DialoguePlugin { + + /** + * Constructs a new {@code CamelDialoguePlugin} {@code Object}. + */ + public CamelDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CamelDialoguePlugin} {@code Object}. + * @param player the player. + */ + public CamelDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CamelDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "If I go near that camel, it'll probably bite my hand off."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + player.getPacketDispatch().sendMessage("The camel spits at you, and you jump back hurriedly."); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2813 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CamelotGuardDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CamelotGuardDialogue.java new file mode 100644 index 000000000..2cab50764 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CamelotGuardDialogue.java @@ -0,0 +1,55 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the camelot guards. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CamelotGuardDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CamelotGuardDialogue} {@code Object}. + */ + public CamelotGuardDialogue() { + /** + * empty. + */ + } + + public CamelotGuardDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CamelotGuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to the Seer's Village courthouse. Court", "is not in session today, so you're not allowed downstairs."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 812 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CandleSellerPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/CandleSellerPlugin.java new file mode 100644 index 000000000..b2c8fd710 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CandleSellerPlugin.java @@ -0,0 +1,229 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the candle seller. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CandleSellerPlugin extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 1000); + + /** + * Represents the candle item. + */ + private static final Item CANDLE = new Item(33, 1); + + /** + * Constructs a new {@code CandleSellerPlugin} {@code Object}. + */ + public CandleSellerPlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CandleSellerPlugin} {@code Object}. + * @param player the player. + */ + public CandleSellerPlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CandleSellerPlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you want a lit candle for 1000 gold?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes please.", "One thousand gold?!", "No thanks, I'd rather curse the darkness."); + stage = 1; + break; + case 800: + if (player.getInventory().freeSlots() == 0) { + end(); + player.getPacketDispatch().sendMessage("You don't have enough inventory space to buy a candle."); + break; + } + if (!player.getInventory().contains(995, 1000)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't seem to have enough coins."); + stage = 30; + break; + } + if (player.getInventory().contains(995, 1000)) { + player.getInventory().remove(COINS); + player.getInventory().add(new Item(33, 1)); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Here you go then."); + stage = 400; + } + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please."); + stage = 800; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "One thousand gold?!"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I'd rather curse the darkness."); + stage = 30; + break; + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Look, you're not going to be able to survive down that", "hole without a light source."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So you could go off to the candle shop to buy one", "more cheaply. You could even make your own lantern,", "which is a lot better."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "But I bet you want to find out what's down there right", "now, don't you? And you can pay me 1000 gold for", "the privilege!"); + stage = 23; + break; + case 23: + interpreter.sendOptions("Select an Option", "All right, you win, I'll buy a candle.", "No way.", "How do you make lanterns?"); + stage = 240; + break; + case 30: + end(); + break; + case 240: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "All right, you win, I'll buy a candle."); + stage = 350; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No way."); + stage = 30; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How do you make lanterns?"); + stage = 230; + break; + } + break; + case 230: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Out of glass. The more advanced lanterns have a", "metal component as well."); + stage = 231; + break; + case 231: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Firstly you can make a simple candle lantern out of", "glass. It's just like a candle, but the flame isn't exposed,", "so it's safer."); + stage = 232; + break; + case 232: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Then you can make an oil lamp, which is brighter but", "has an exposed flame. But if you make an iron frame", "for it you can turn it into an oil lantern."); + stage = 233; + break; + case 233: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Finally there's a Bullseye lantern. You'll need to", "make a frame out of steel and add a glass lens."); + stage = 234; + break; + case 234: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oce you've made your lamp or lantern, you'll need to", "make lamp oil for it. The chemist near Reimmington has", "a machine for that."); + stage = 235; + break; + case 235: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "For any light source, you'll need a tinderbox to light it.", "Keep your tinderbox handy in case it goes out!"); + stage = 236; + break; + case 236: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "But if all that's to complicated, you can buy a candle", "right here for 1000 gold!"); + stage = 237; + break; + case 237: + interpreter.sendOptions("Select an Option", "All right, you win, I'll buy a candle.", "No thanks, I'd rather curse the darkness."); + stage = 290; + break; + case 350: + if (player.getInventory().freeSlots() == 0) { + end(); + player.getPacketDispatch().sendMessage("You don't have enough inventory space to buy a candle."); + break; + } + if (!player.getInventory().contains(995, 1000)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't seem to have enough coins."); + stage = 30; + break; + } + + if (player.getInventory().remove(COINS)) { + player.getInventory().add(CANDLE); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Here you go then."); + stage = 400; + } + break; + case 400: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I should warn you, though, it can be dangerous to take", "a naked flame down there. You'd better off making", "a lantern."); + stage = 401; + break; + case 401: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, thanks."); + stage = 402; + break; + case 402: + end(); + break; + case 290: + switch (buttonId) { + case 1: + if (player.getInventory().freeSlots() == 0) { + end(); + player.getPacketDispatch().sendMessage("You don't have enough inventory space to buy a candle."); + break; + } + if (!player.getInventory().contains(995, 1000)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't seem to have enough coins."); + stage = 30; + break; + } + if (player.getInventory().remove(COINS)) { + player.getInventory().add(CANDLE); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Here you go then."); + stage = 400; + } + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I'd rather curse the darkness."); + stage = 291; + break; + } + break; + case 291: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1834 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CapeMerchantDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CapeMerchantDialogue.java new file mode 100644 index 000000000..20e772742 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CapeMerchantDialogue.java @@ -0,0 +1,93 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the cape merchant dialogue. + * @author Vexia + */ +@Initializable +public class CapeMerchantDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CapeMerchantDialogue} {@code Object} + * @param player the player. + */ + public CapeMerchantDialogue(Player player) { + super(player); + } + + /** + * Constructs a new {@code CapeMerchantDialogue} {@code Object} + */ + public CapeMerchantDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CapeMerchantDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hello there, are you interested in buying one of my", "special capes?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("What's so special about your capes?", "Yes please!", "No thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What's so special about your capes?"); + stage = 10; + break; + case 2: + player("Yes please!"); + stage = 20; + break; + case 3: + player("No thanks."); + stage = 30; + break; + } + break; + case 10: + npc("Ahh well they make it less likely that you'll accidently", "attack anyone wearing the same cape as you and easier", "to attack everyone else. They also make it easier to", "distinguish people who're wearing the same cape as you"); + stage++; + break; + case 11: + npc("from everyone else. They're very useful when out in", "the wilderness with friends or anyone else you don't", "want to harm."); + stage++; + break; + case 12: + end(); + break; + case 20: + end(); + npc.openShop(player); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, 1787 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CapnIzzyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CapnIzzyDialogue.java new file mode 100644 index 000000000..807eac738 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CapnIzzyDialogue.java @@ -0,0 +1,262 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the capn izzy dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CapnIzzyDialogue extends DialoguePlugin { + + /** + * Represents the parrot npc id. + */ + private static final int PARROT = 4535; + + /** + * Constructs a new {@code CapnIzzyDialogue.java} {@code Object}. + */ + public CapnIzzyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CapnIzzyDialogue.java} {@code Object}. + * @param player the player. + */ + public CapnIzzyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CapnIzzyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length > 1) { + interpreter.sendDialogues(PARROT, null, "Clap him in irons!"); + stage = 200; + return true; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ahoy Cap'n!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahoy there!"); + stage = 90; + break; + case 90: + interpreter.sendDialogues(PARROT, null, "Avast ye scurvy swabs!"); + stage = 91; + break; + case 91: + interpreter.sendDialogues(player, null, "Huh?"); + stage = 92; + break; + case 92: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Don't mind me parrot, he's Cracked Jenny's Tea Cup!"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "What is this place?", "What do I do in the arena?", "I'd like to use the Agility Arena, please.", "Can you tell me a bit about the Skillcape of Agility, please.", "See you later."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is this place?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do I do in the arena?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like to use the Agility Arena, please."); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you tell me a bit about the Skillcape of Agility,", "please?"); + stage = 40; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "See you later."); + stage = 50; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This, me hearty, is the entrance to the Brimhaven", "Agility Arena!"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I were diffin for buried treasure when I found it!", "Amazed I was! It was a sight to behold!"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It were the biggest thing I'd ever seen! it must've been", "at least a league from side to side!"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It made me list, I were that excited!"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'd found a huge cave with all these platforms. I reckon", "it be an ancient civilisation that made it. I had to be", "mighty careful as there was these traps everywehre!", "Dangerous it was!"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Entrance is only 200 coins!"); + stage = 1; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, me hearty, it's simple. Ye can cross between two", "platforms by using the traps or obstacles strung across", "'em. Try and make your way to the pillar that is", "indicated by the flashing arrow."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ye receive tickets for tagging more than one pillar in a", "row. So ye won't get a ticket from the first pillar but", "ye will for every platform ye tag in a row after that."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If ye miss a platform ye will miss out on the next ticket", "so try and get every platform you can! When ye be", "done, take the tickets to Jackie over there and she'll", "exchange them for more stuff!"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Thanks me hearty!"); + stage = 24; + break; + case 24: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks!"); + stage = 1; + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Aye, entrance be 200 coins."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A word of warning me hearty! There are dangerous", "traps down there!"); + stage = 32; + break; + case 32: + interpreter.sendOptions("Select an Option", "Ok, here's 200 coins.", "Never mind."); + stage = 33; + break; + case 33: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, here's 200 coins."); + stage = 35; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Never mind."); + stage = 34; + break; + } + break; + case 34: + end(); + break; + case 35: + if (!player.getAttribute("capn_izzy", false)) { + if (player.getInventory().contains(995, 200) && player.getInventory().remove(new Item(995, 200))) { + end(); + player.getDialogueInterpreter().sendItemMessage(new Item(995, 200), "You give Cap'n Izzy the 200 coin entrance fee."); + player.getPacketDispatch().sendMessage("You give Cap'n Izzy the 200 coin entrance fee."); + player.setAttribute("/save:capn_izzy", true); + return true; + } else { + player.getPacketDispatch().sendMessage("You don't have the 200 coin entrance fee."); + end(); + } + } else { + player.getDialogueInterpreter().sendDialogues(npc, null, "Avast there, ye've already paid!"); + stage = 36; + } + break; + case 36: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Aye, to be sure! The Skillcape of Agility be the symbol", "of the master of dexterity! One who wears it can climb", "like a cat, run like the wind and jump like...err, well", "jump like a jumping thing! Now, be there anything else"); + stage = 41; + break; + case 41: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "ye'd like to know?"); + if (!Skillcape.isMaster(player, Skills.AGILITY)) { + stage = 1; + } else { + stage = 99; + } + break; + case 99: + interpreter.sendDialogues(player, null, "I'd like to buy an Agility Skillcape."); + stage = 100; + break; + case 100: + interpreter.sendDialogues(npc, null, "That will cost you 99,000 gold coins."); + stage = 101; + break; + case 101: + interpreter.sendOptions("Select an Option", "Okay, I'll pay it.", "Nevermind."); + stage = 102; + break; + case 102: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Okay, I'll pay it."); + stage = 104; + break; + case 2: + interpreter.sendDialogues(player, null, "Nevermind."); + stage = 103; + break; + } + break; + case 104: + if (Skillcape.purchase(player, Skills.AGILITY)) { + interpreter.sendDialogues(npc, null, "There you go hearty! You're truly a master of Agility."); + } + stage = 105; + break; + case 105: + end(); + break; + case 103: + end(); + break; + case 50: + end(); + break; + case 200: + interpreter.sendDialogues(npc, null, "Ahoy there! Pay up first!"); + stage = 201; + break; + case 201: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 437 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CaptainBarnabyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CaptainBarnabyDialogue.java new file mode 100644 index 000000000..aaa56d81d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CaptainBarnabyDialogue.java @@ -0,0 +1,97 @@ +package core.game.content.dialogue; + +import core.game.content.global.travel.ship.Ships; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the captain barnaby dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CaptainBarnabyDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 30); + + /** + * Constructs a new {@code CaptainBarnabyDialogue} {@code Object}. + */ + public CaptainBarnabyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CaptainBarnabyDialogue} {@code Object}. + * @param player the player. + */ + public CaptainBarnabyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CaptainBarnabyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you want to go on a trip to Brimhaven?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The trip will cost you 30 coins."); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Yes please.", "No, thank you."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please."); + stage = 10; + break; + case 2: + end(); + break; + } + break; + case 10: + if (!player.getInventory().containsItem(COINS)) { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough coins."); + stage = 220; + return true; + } + if (player.getInventory().remove(COINS)) { + end(); + player.getPacketDispatch().sendMessage("You pay 30 coins and board the ship."); + Ships.ARDOUGNE_TO_BRIMHAVEN.sail(player); + } + break; + case 220: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 381 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CaptainBentleyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CaptainBentleyDialogue.java new file mode 100644 index 000000000..22052d3fb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CaptainBentleyDialogue.java @@ -0,0 +1,116 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.plugin.Initializable; +import core.net.packet.out.MinimapState; + +/** + * Handles the captain bentley dialogue. + * @author Vexia + */ +@Initializable +public class CaptainBentleyDialogue extends DialoguePlugin { + + /** + * If we're on the isle. + */ + private boolean onIsle; + + /** + * Constructs a new {@Code CaptainBentleyDialogue} {@Code + * Object} + */ + public CaptainBentleyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code CaptainBentleyDialogue} {@Code + * Object} + * @param player the player. + */ + public CaptainBentleyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CaptainBentleyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + onIsle = npc.getLocation().getRegionId() == 8508; + npc("Hi, would you like to travel to " + (onIsle ? "Pirate's Cove" : "Lunar Isle") + "?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes, please.", "No, thanks."); + stage++; + break; + case 1: + end(); + if (buttonId == 1) { + travel(player, !onIsle ? Location.create(2131, 3900, 2) : Location.create(2216, 3797, 2)); + return true; + } + break; + } + return true; + } + + /** + * Travels to a location. + * @param location the location. + */ + private void travel(final Player player, final Location location) { + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.lock(); + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 3: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + break; + case 4: + player.getProperties().setTeleportLocation(location); + break; + case 5: + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().close(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.unlock(); + return true; + } + return false; + } + + }); + } + + @Override + public int[] getIds() { + return new int[] { 4540 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CaptainDalburDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CaptainDalburDialogue.java new file mode 100644 index 000000000..639f4c7a4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CaptainDalburDialogue.java @@ -0,0 +1,76 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.content.global.travel.glider.Gliders; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the captain dalbur npc. + * @author 'Vexia + * @note complete with gnome city stuff. + * @version 1.0 + */ +@Initializable +public final class CaptainDalburDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CaptainDalburDialogue} {@code Object}. + */ + public CaptainDalburDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CaptainDalburDialogue.java} {@code Object}. + * @param player the player. + */ + public CaptainDalburDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CaptainDalburDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What do you want human?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "May you fly me somewhere on your glider?"); + stage = 1; + break; + case 1: + npc("If you wish."); + stage++; + /* + * interpreter.sendDialogues(npc, FacialExpression.NORMAL, + * "I only fly friends of the gnomes!"); stage = 2; + */ + break; + case 2: + end(); + player.getInterfaceManager().open(new Component(138)); + Gliders.sendConfig(npc, player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3809, 3810, 3811, 3812, 3813 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CaptainShanksDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CaptainShanksDialogue.java new file mode 100644 index 000000000..31ae90b8b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CaptainShanksDialogue.java @@ -0,0 +1,169 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.tools.Items; +import core.game.content.global.travel.ship.Ships; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.tools.RandomFunction; + +/** + * Represents the captain barnaby dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CaptainShanksDialogue extends DialoguePlugin { + + private Item coins; + private static final Item TICKET = new Item(Items.SHIP_TICKET_621); + + /** + * Constructs a new {@code CaptainBarnabyDialogue} {@code Object}. + */ + public CaptainShanksDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CaptainBarnabyDialogue} {@code Object}. + * @param player the player. + */ + public CaptainShanksDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CaptainShanksDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hello there shipmate! I sail to Khazard Port and", "to Port Sarim. Where are you bound?"); + if (!player.getInventory().containsAtLeastOneItem(TICKET)) { + stage = -1; + } else { + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + break; + case -1: + coins = new Item(995, RandomFunction.random(20, 50)); + npc("I see you don't have a ticket for the ship, my", "colleague normally only sells them in Shilo village.", "But I could sell you one for a small additional", "charge. Shall we say " + coins.getAmount() + " gold pieces?"); + stage = 3; + break; + case 0: + options("Khazard Port please.", "Port Sarim please.", "Nowhere just at the moment thanks."); + stage++; + break; + case 1: + switch(buttonId) { + case 1: + player("Khazard Port please."); + if (!player.getInventory().containsItem(TICKET)) { + stage = -1; + } else { + stage = 10; + } + break; + case 2: + player("Port Sarim please."); + if (!player.getInventory().containsItem(TICKET)) { + stage = -1; + } else { + stage = 20; + } + break; + case 3: + player("Nowhere just at the moment thanks."); + stage++; + break; + } + break; + case 2: + npc("Very well then me old shipmate, Just let me know", "if you change your mind."); + stage = 999; + break; + case 3: + interpreter.sendOptions("Buy a ticket for " + coins.getAmount() + " gold pieces.", "Yes, I'll buy a ticket for the ship.", "No thanks, not just at the moment."); + stage++; + break; + case 4: + switch(buttonId) { + case 1: + player("Yes, I'll buy a ticket for the ship."); + stage = 6; + break; + case 2: + player("No thanks, not just at the moment."); + stage++; + break; + } + break; + case 5: + npc("Very well me old shipmate, come back if you change", "your mind now."); + stage = 999; + break; + case 6: + if (!player.getInventory().containsItem(coins)) { + npc("Sorry me old ship mate, but you seem to be", "financially challenged at the moment. Come back", "when your coffers are full!"); + stage = 999; + } else if (!player.getInventory().hasSpaceFor(new Item(Items.SHIP_TICKET_621))) { + npc("Sorry me old ship mate, it looks like you haven't", "got enough space for a ticket. Come back when", "you've got rid of some of that junk."); + stage = 999; + } else { + npc("It's a good deal and no mistake. Here you go me old", "shipmate, here's your ticket."); + player.getInventory().remove(coins); + player.getInventory().add(new Item(Items.SHIP_TICKET_621)); + stage++; + } + break; + case 7: + npc("Ok, now you have your ticket, do you want to sail", "anywhere?"); + stage++; + break; + case 8: + interpreter.sendOptions("Captain Shanks asks, 'Do you want to sail anywhere?'", "Khazard Port please.", "Port Sarim please.", "Nowhere just at the moment thanks."); + stage = 1; + break; + case 10: + npc("Very well then me old shipmate, I'll just take your ticket and then we'll set sail."); + stage = 11; + break; + case 11: + end(); + if (player.getInventory().remove(TICKET)) { + Ships.sail(player, Ships.CAIRN_ISLAND_TO_PORT_KHAZARD); + } + break; + case 20: + npc("Very well then me old shipmate, I'll just take your ticket and then we'll set sail."); + stage = 21; + break; + case 21: + end(); + if (player.getInventory().remove(TICKET)) { + Ships.sail(player, Ships.CAIRN_ISLAND_TO_PORT_SARIM); + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 518 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CassieDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CassieDialogue.java new file mode 100644 index 000000000..664f01b98 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CassieDialogue.java @@ -0,0 +1,75 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the cassie npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CassieDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CassieDialogue} {@code Object}. + */ + public CassieDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CassieDialogue} {@code Object}. + * @param player the player. + */ + public CassieDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CassieDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I buy and sell shields; do you want to trade?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 20; + break; + } + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 577 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CaveMonk.java b/Server/src/main/java/Server/core/game/content/dialogue/CaveMonk.java new file mode 100644 index 000000000..1a9d79e95 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CaveMonk.java @@ -0,0 +1,120 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.world.map.Location; + +/** + * Represents the dialogue plugin used for a cave monk. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CaveMonk extends DialoguePlugin { + + /** + * Represents the dungeon location. + */ + private static final Location DUNGEON = Location.create(2822, 9774, 0); + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@code CaveMonk} {@code Object}. + */ + public CaveMonk() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CaveMonk} {@code Object}. + * @param player the player. + */ + public CaveMonk(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CaveMonk(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Lost City"); + switch (quest.getStage(player)) { + case 0: + case 10: + player("Hello, what are you doing here?"); + stage = 100; + break; + default: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Be careful going in there! You are unarmed, and there", "is much evilness lurking down there! The evilness seems", "to block off our contact with our gods,"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 100: + npc("None of your business."); + stage = 101; + break; + case 101: + end(); + break; + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "so our prayers seem to have less effect down there. Oh,", "also, you won't be able to come back this way - This", "ladder only goes one way!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The only exit from the caves below is a portal which", "leads only to the deepest wilderness!"); + stage = 2; + break; + case 2: + interpreter.sendOptions("Select an Option", "I don't think I'm strong enough to enter then.", "Well that is a risk I will have to take."); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't think I'm strong enough to enter then."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well that is a risk I will have to take."); + stage = 20; + break; + } + break; + case 10: + end(); + break; + case 20: + if (player.getSkills().getLevel(Skills.PRAYER) > 2 && player.getSkills().getPrayerPoints() > 2) { + player.getSkills().decrementPrayerPoints(player.getSkills().getLevel(Skills.PRAYER) - 2); + } + player.getProperties().setTeleportLocation(DUNGEON); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 656 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CeolburgDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CeolburgDialogue.java new file mode 100644 index 000000000..e4da19774 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CeolburgDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Rerpesents the dialogue plugin used for the celburg npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CeolburgDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CeolburgDialogue} {@code Object}. + */ + public CeolburgDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CeolburgDialogue} {@code Object}. + * @param player the player. + */ + public CeolburgDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CeolburgDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Trolls!"); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1089 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ChaosElementalJRDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ChaosElementalJRDialogue.java new file mode 100644 index 000000000..e4b9d9230 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ChaosElementalJRDialogue.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Dialogue for the boss pet, Chaos Ele JR. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class ChaosElementalJRDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + */ + public ChaosElementalJRDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + * @param player the player. + */ + public ChaosElementalJRDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ChaosElementalJRDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Is it true a level 3 skiller caught one of your", "siblings?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Yes, they killed my mummy, kidnapped", "my brother, smiled about it and","went to sleep."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Aww, well you have me now!", "I shall call you Squishy and you shall be","mine and you shall be my Squishy."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Come on, Squishy come on, little Squishy!"); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8595 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CharlieTheTrampDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CharlieTheTrampDialogue.java new file mode 100644 index 000000000..0dc669e76 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CharlieTheTrampDialogue.java @@ -0,0 +1,258 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the charlie the tramp dialogue. + * @author 'Vexia + * @dtae 3/1/14 + */ +@Initializable +public class CharlieTheTrampDialogue extends DialoguePlugin { + + /** + * Represents the quest. + */ + private Quest quest; + + /** + * Constructs a new {@code CharlieTheTrampDialogue} {@code Object}. + */ + public CharlieTheTrampDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CharlieTheTrampDialogue} {@code Object}. + * @param player the player. + */ + public CharlieTheTrampDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CharlieTheTrampDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Shield of Arrav"); + switch (quest.getStage(player)) { + default: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Spare some change guv?"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + regular(buttonId); + break; + } + return true; + } + + /** + * Method used to handle the regular dial. + * @param buttonId the buttonid. + */ + public void regular(int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Who are you?", "Sorry, I haven't got any.", "Go get a job!", "Ok. Here you go.", "Is there anything down this alleyway?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I haven't got any."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Go get a job!"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok. Here you go."); + stage = 40; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Is there anything down this alleyway?"); + stage = 50; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Charles. Charles E. Trampin' at your service. Now, about", "that change you were going to give me..."); + stage = 0; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Thanks anyways!"); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You startin? I hope your nose falls off!"); + stage = 21; + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hey, thanks alot!"); + stage = 41; + break; + case 41: + interpreter.sendOptions("Select an Option", "No problem.", "Don't I get some sort of quest hint or something now?"); + stage = 42; + break; + case 42: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No problem."); + stage = 180; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So...don't I get some sort of quest hint or something now?"); + stage = 190; + break; + } + break; + case 180: + end(); + if (player.getInventory().contains(995, 1)) + player.getInventory().remove(new Item(995, 1)); + else + player.getPacketDispatch().sendMessage("You need one coin to give away."); + break; + case 190: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Huh? What do you mean? That wasn't why", " I asked you for money."); + stage = 191; + break; + case 191: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I just need to eat..."); + stage = 192; + break; + case 192: + end(); + break; + case 800: + npc("The ruthless and notorious criminal gang known as the", "Black Arm Gang have their headquarters down there."); + stage = 801; + break; + case 801: + options("Thank you for the warning!", "Do you think they would let me join?"); + stage = 802; + break; + case 802: + switch (buttonId) { + case 1: + player("Thanks for the warning!"); + stage = 803; + break; + case 2: + player("Do you think they would let me join?"); + stage = 804; + break; + } + break; + case 803: + npc("Don't worry about it."); + stage = 806; + break; + case 804: + npc("You never know. You'll find a lady down there called", "Katrine. Speak to her."); + stage = 807; + break; + case 807: + npc("But don't upset her, she's pretty dangerous."); + stage = 808; + break; + case 808: + npc("I also heard that Reldo the librarian", "knows more about them, go talk to him."); + stage = 809; + break; + case 809: + end(); + break; + case 806: + player("Do you think they would let me join?"); + stage = 804; + break; + case 50: + if (quest.getStage(player) == 0) { + npc("Funny you should mention that...there is actually."); + stage = 800; + break; + } + if (quest.getStage(player) == 30 || quest.getStage(player) == 40 || quest.getStage(player) == 50) { + npc("Funny you should mention that...there is actually."); + stage = 51; + break; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nope, nothing at all."); + stage = 192; + break; + case 51: + npc("The ruthless and notorious criminal gang known as the", "Black Arm Gang have their headquarters down there."); + stage = 52; + break; + case 52: + options("Thank you for the warning!", "Do you think they would let me join?"); + stage = 53; + break; + case 53: + switch (buttonId) { + case 1: + player("Thanks for the warning!"); + stage = 54; + break; + case 2: + player("Do you think they would let me join?"); + stage = 55; + break; + } + break; + case 54: + npc("Don't worry about it."); + stage = 56; + break; + case 55: + npc("You never know. You'll find a lady down there called", "Katrine. Speak to her."); + stage = 57; + break; + case 57: + npc("But don't upset her, she's pretty dangerous."); + stage = 58; + break; + case 58: + quest.setStage(player, 50); + end(); + break; + case 56: + player("Do you think they would let me join?"); + stage = 55; + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 641 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ChemistDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ChemistDialogue.java new file mode 100644 index 000000000..d7c1c6130 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ChemistDialogue.java @@ -0,0 +1,424 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the chemist dialogue. + * + * @author Vexia + */ +@Initializable +public final class ChemistDialogue extends DialoguePlugin { + private boolean replacementReward = false; + private AchievementDiary diary; + private int level = 1; + + /** + * Constructs a new {@code ChemistDialogue} {@code Object}. + */ + public ChemistDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ChemistDialogue} {@code Object}. + * + * @param player the player. + */ + public ChemistDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ChemistDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendOptions("Do you want to talk about lamps?", "Yes.", "No.", "No, I'm more interested in impling jars.", "Falador Achievement Diary"); + stage = 0; + AchievementDiary diary = player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR); + replacementReward = diary.isLevelRewarded(level) + && diary.isComplete(level, true) + && !player.hasItem(diary.getType().getRewards(level)[0]); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player("Hi, I need fuel for a lamp."); + stage = 10; + break; + case 2: + player("Hello."); + stage = 20; + break; + case 3: + player("I have a slightly odd question."); + stage = 30; + break; + case 4: + npc("How are you getting on with the Achievement Diary?"); + stage = -1; + break; + } + break; + case 10: + npc("Hello there, the fuel you need is lamp oil, do you need", "help making it?"); + stage++; + break; + case 11: + player("Yes, please."); + stage++; + break; + case 12: + npc("It's really quite simple. You use the small still in here.", "It's all set up, so there's no fiddling around with dials..."); + stage++; + break; + case 13: + npc("Just put ordinary swamp tar in, and then use a lantern", "or lamp to get the oil out."); + stage++; + break; + case 14: + player("Thanks."); + stage++; + break; + case 15: + end(); + break; + case 20: + npc("Oh.. hello, how's it going?"); + stage++; + break; + case 21: + player("Good thanks."); + stage++; + break; + case 22: + npc("Good to hear, sorry but I have a few things to do", "now."); + stage++; + break; + case 23: + player("Well I'd better let you get on then."); + stage++; + break; + case 24: + end(); + break; + case 30: + npc("Jolly good, the odder the better. I like oddities."); + stage++; + break; + case 31: + player("Do you know how I might distill a mix of anchovy oil", "and flowers so that it forms a layer on the inside of a", "butterfly jar?"); + stage++; + break; + case 32: + npc("That is an odd question. I commend you for it. Why", "would you want to do that?"); + stage++; + break; + case 33: + player("Apparently, if I can make a jar like this it will be useful", "for storing implings in."); + stage++; + break; + case 34: + npc("My lamp oil still may be able to do what you want. Use the", "oil and flower mix on the still."); + stage++; + break; + case 35: + npc("Once that's done. Use one of those butterfly jars to", "collect the distillate."); + stage++; + break; + case 36: + player("Thanks!"); + stage++; + break; + case 37: + options("So how do you make anchovy oil?", "Do you have a sieve I can use?", "I'd better go and get the repellent."); + stage++; + break; + case 38: + switch (buttonId) { + case 1: + player("So, how do you make anchovy oil?"); + stage = 50; + break; + case 2: + player("Do you have a sieve I can use?"); + stage = 55; + break; + case 3: + player("I'd better go and get the repellent."); + stage = 51; + break; + } + break; + case 50: + npc("Anchovies are pretty oily fish. I'd have thought you", "could just grind them up and sieve out the bits. You'd", "probably want to remove any water first - Cooking", "should do that pretty well."); + stage++; + break; + case 51: + end(); + break; + case 55: + if (player.hasItem(new Item(6097))) { + npc("Errm, yes. But you already have one. Two sieves is a ", "bit exessive, don't you think?"); + stage = 60; + break; + } + npc("Errm, yes. Here have this one. It's only been used for", "sieving dead rats out of sewer water."); + stage++; + break; + case 56: + player("Err, why? Actually, on second thoughts I don't want to", "know."); + stage++; + break; + case 57: + npc("Well, it would be ideally suited to your task."); + stage++; + break; + case 58: + player("Fair enough."); + stage++; + break; + case 59: + player.getInventory().add(new Item(6097), player); + end(); + break; + case 60: + end(); + break; + + case -1: + if (replacementReward) { + player("I seem to have lost my Falador shield..."); + stage = 80; + } else { + npc("How are you getting on with the Achievement Diary?"); + stage = 90; + } + break; + case 80: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("Here's your replacement. Please be more careful."); + stage = 999; + break; + + case 90: + options("I've come for my reward.", "I'm doing good.", "I have a question."); + stage = 91; + break; + case 91: + switch (buttonId) { + case 1: + player("I've come for my reward."); + stage = 200; + break; + case 2: + player("I'm doing good."); + stage = 220; + break; + case 3: + player("I have a question."); + stage = 105; + break; + } + break; + // https://www.youtube.com/watch?v=ZW9k1922Ggk + case 105: + if (!diary.isLevelRewarded(1)) { + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 106; + } else { + options("Can you remind me what my Falador shield does, please?", "What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 107; + } + break; + case 106: + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 110; + break; + case 2: + player("What are the rewards?"); + stage = 120; + break; + case 3: + player("How do I claim the rewards?"); + stage = 130; + break; + case 4: + player("See you later."); + stage = 999; + break; + } + break; + + case 107: + switch (buttonId) { + case 1: + player("Can you remind me what my Falador shield does, please?"); + stage = 150; + break; + case 2: + player("What is the Achievement Diary?"); + stage = 110; + break; + case 3: + player("What are the rewards?"); + stage = 120; + break; + case 4: + player("How do I claim the rewards?"); + stage = 130; + break; + case 5: + player("See you later."); + stage = 999; + break; + } + break; + + case 110: + npc("Ah, well it's a diary that helps you keep track of", "particular achievements you've made here on", "2009Scape."); + stage = 111; + break; + case 111: + npc("If you manage to complete a particular set of tasks,", "you will be rewarded for your explorative efforts."); + stage = 112; + break; + case 112: + npc("You can access your Achievement Diary by going to", "the Quest Journal, then clicking on the green star icon", "in the top-right hand corner."); + stage = 105; + break; + + case 120: + npc("Ah, well there are different rewards for each", "Achievement Diary. For completing each stage of the", "Falador diary, you are presented with a Falador shield."); + stage = 121; + break; + case 121: + npc("There are three shields available, one for each difficulty", "level."); + stage = 122; + break; + case 122: + npc("When you are presented with your rewards, you will", "be told of their uses."); + stage = 105; + break; + + case 130: + npc("You need to complete all of the tasks in a particular", "difficulty, then you can claim your reward."); + stage = 131; + break; + case 131: + npc("Some of Falador's tasks are simple, some will require", "certain skill levels, and some might require quests to be", "started or completed."); + stage = 132; + break; + case 132: + npc("To claim your Falador Achievement Diary rewards,", "speak to Redbeard the Pirate in Port Sarim, Sir Vyvin's", "squire in the White Knight's Castle, or myself."); + stage = 105; + break; + + case 150: + npc("This is the second stage of the Falador shield: a kite", "shield. It grants you all the benefits fo the buckler, but", "with increased Prayer restore, and Farming experience", "when using the patches near Falador."); + stage = 151; + break; + case 151: + npc("As before, Prayer restore can only be used once per", "day, but it now restores half of your Prayer points."); + stage = 152; + break; + case 152: + npc("The increased Farming experience is only available at", "the allotments, flower and herb patches found just north", "of Port Sarim."); + stage = 153; + break; + case 153: + npc("As well as all of these features, the shield is pretty", "handy in combat, and gives you a good Prayer boost."); + stage = 105; + break; + + case 200: + if (diary.isLevelRewarded(level)) { + npc("But you've already gotten yours!"); + stage = 105; + } else if (diary.isComplete(level, true)) { + npc("So, you've finished. Well done! I believe congratulations", "are in order."); + stage = 201; + } else { + npc("But you haven't finished!"); + stage = 105; + } + break; + case 201: + player("I believe rewards are in order."); + stage = 202; + break; + case 202: + npc("Right you are."); + stage = 203; + break; + case 203: + npc("This is the second stage of the Falador shield: a kite", "shield. It grants you all the benefits fo the buckler, but", "with increased Prayer restore, and Farming experience", "when using the patches near Falador."); + if (!diary.isLevelRewarded(level)) { + for (Item i : diary.getType().getRewards(level)) { + if (!player.getInventory().add(i, player)) { + GroundItemManager.create(i, player); + } + } + diary.setLevelRewarded(level); + } + stage = 204; + break; + case 204: + npc("As before, Prayer restore can only be used once per", "day, but it now restores half of your Prayer points."); + stage = 205; + break; + case 205: + npc("The increased Farming experience is only available at", "the allotments, flower and herb patches found just north", "of Port Sarim."); + stage = 206; + break; + case 206: + npc("As well as all of these features, the shield is pretty", "handy in combat, and gives you a good Prayer boost."); + stage = 207; + break; + case 207: + npc("I've even thrown in an old lamp I found. Try as I", "might, I can't fill it with fuel or get it to light."); + stage = 208; + break; + case 208: + interpreter.sendDialogues(player, FacialExpression.AMAZED, "Wow, thanks!"); + stage = 209; + break; + case 209: + npc("If you should lose your shield, come back and see me", "for another one."); + stage = 105; + break; + case 220: + npc("Keep it up!"); + stage = 105; + break; + + case 999: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{367}; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ConeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ConeDialogue.java new file mode 100644 index 000000000..cb74607d8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ConeDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the cone npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ConeDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ConeDialogue} {@code Object}. + */ + public ConeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ConeDialogue} {@code Object}. + * @param player the player. + */ + public ConeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ConeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello deary."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Um... hello."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 217 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CookingTutorDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CookingTutorDialogue.java new file mode 100644 index 000000000..2e5568425 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CookingTutorDialogue.java @@ -0,0 +1,147 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Rerpresents the dialogue plugin used for the cooking tutor. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CookingTutorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CookingTutorDialogue} {@code Object}. + */ + public CookingTutorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CookingTutorDialogue} {@code Object}. + * @param player the player. + */ + public CookingTutorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CookingTutorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "Can you teach me the basics of cooking please?", "Tell me about different food I can make.", "Goodbye."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you teach me the basics of cooking please?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about different food I can make."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Goodbye."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The simplest thing to cook is raw meat or fish."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Fish can be caught, speak to the fishing tutor south of", "here in the swamp. Killing cows or chickens will yield", "raw meat to cook too."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You can use your own fire... but it's not as effective", "and you'll burn more. To build a fire use a tinderbox", "on logs."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Once you've found your range, click on your raw", "meat or fish in your inventory, then click on the", "cooking range. This will bring up an interface which", "you can right-click on to select the number to cook."); + stage = 14; + break; + case 14: + interpreter.sendOptions("Select an Option", "Can you teach me the basics of cooking please?", "Tell me about different food I can make.", "Goodbye."); + stage = 0; + break; + case 20: + interpreter.sendOptions("Select an Option", "Fish and Meat", "Brewing", "Vegetables", "Pie", "Go back to teaching"); + stage = 21; + break; + case 21: + switch (buttonId) { + case 1: + interpreter.sendDoubleItemMessage(2132, 2142, "Fish and meat of most varieties can be cooked very simply on either a fire or range, experiment which one works for you."); + stage = 20; + break; + case 2: + interpreter.sendDoubleItemMessage(1911, 1905, "You can brew your own beers using the fermenting vats in either Keldagrim or Port Phasmatys. Use two buckets of water, two handfuls of barley malt, 4 hops of your choice and a pot of ale yeast, then leave to"); + stage = 220; + break; + case 3: + interpreter.sendDoubleItemMessage(1942, 7058, "Baked potatoes are excellent foods and they are healthy too! You'll need to churn some butter and cheese. Look for the churn icon on the mini map. There is a churn in the farm building northwest of Lumbridge."); + stage = 230; + break; + case 4: + interpreter.sendDoubleItemMessage(1929, 1933, "Use a pot of flour with a bucket of water. You will then get an option to make bread dough, pitta bread dough, pastry dough, or pizza dough. Select pizza or pastry dough."); + stage = 240; + break; + case 5: + interpreter.sendOptions("Select an Option", "Can you teach me the basics of cooking please?", "Tell me about different food I can make.", "Goodbye."); + stage = 0; + break; + } + break; + case 220: + interpreter.sendDoubleItemMessage(1911, 1905, "ferment for a few days!"); + stage = 221; + break; + case 221: + interpreter.sendDoubleItemMessage(1911, 1905, "Simply turn the tap and let the ale flow into the barrel next to the vat, then use empty beer glasses on the barrel."); + stage = 20; + break; + case 230: + interpreter.sendDoubleItemMessage(6697, 1985, "The nearest dairy cow is noth of the nearby water mill. Take buckets of milk with you to the churn and use the milk on the churn to make butter or cheese."); + stage = 20; + break; + case 240: + interpreter.sendDoubleItemMessage(2313, 1953, "Use the pastry dough with a pie dish then add your filling such as apple or red berries."); + stage = 241; + break; + case 241: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Finally cook your pie by using the unbaked pie on a", "cooking range. Mmmm...pie."); + stage = 242; + break; + case 242: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There's pizza too! Find yourself some tomato and", "cheese, use on the Pizza dough. Cook the pizza on a", "range then add any other topping you want, such as", "anchovies."); + stage = 20; + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4899 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CraftingTutorDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CraftingTutorDialogue.java new file mode 100644 index 000000000..f7fee7485 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CraftingTutorDialogue.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the crafting tutor. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CraftingTutorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CraftingTutorDialogue} {@code Object}. + */ + public CraftingTutorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CraftingTutorDialogue} {@code Object}. + * @param player the player. + */ + public CraftingTutorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CraftingTutorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you teach me the basics of crafting please?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Firstly, you should know that not all places associated", "with crafting will be marked on your mini map. Some", "take quite a bit of hunting down to find, don't lose", "heart!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I see... so where should I start?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you have a full inventory, take it to the bank,", "you can find it on the roof of this very castle."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4900 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CrossbowDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CrossbowDialogue.java new file mode 100644 index 000000000..143002bcd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CrossbowDialogue.java @@ -0,0 +1,116 @@ +/* +package core.game.content.dialogue; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.fletching.items.crossbow.CrossbowPulse; +import core.game.node.entity.skill.fletching.items.crossbow.StringCross; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.entity.player.link.RunScript; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.game.node.item.Item; + +*/ +/** + * Represents the dialogue plugin used for the crossbow. + * @author 'Vexia + * @version 1.0 + *//* + +@InitializablePlugin +public final class CrossbowDialogue extends DialoguePlugin { + + */ +/** + * Represents the item used. + *//* + + private Item item; + + */ +/** + * The string cross. + *//* + + private StringCross cross; + + */ +/** + * Constructs a new {@code CrossbowDialogue} {@code Object}. + *//* + + public CrossbowDialogue() { + */ +/** + * empty. + *//* + + } + + */ +/** + * Constructs a new {@code CrossbowDialogue.java} {@code Object}. + * @param player + *//* + + public CrossbowDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CrossbowDialogue(player); + } + + @Override + public boolean open(Object... args) { + item = (Item) args[0]; + cross = StringCross.forItem(item); + if (cross == null) { + return true; + } + player.getInterfaceManager().openChatbox(309); + player.getPacketDispatch().sendString("



" + cross.getProduct().getName(), 309, 6); + player.getPacketDispatch().sendItemZoomOnInterface(cross.getProduct().getId(), 160, 309, 2); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + int amt = 0; + switch (buttonId) { + case 6: + amt = 1; + break; + case 5: + amt = 5; + break; + case 4: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + player.getPulseManager().run(new CrossbowPulse(player, item, cross, ammount)); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount"); + return true; + case 3: + amt = player.getInventory().getAmount(item); + break; + } + player.getPulseManager().run(new CrossbowPulse(player, item, cross, amt)); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 92747 }; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CuffsDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CuffsDialogue.java new file mode 100644 index 000000000..238059b19 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CuffsDialogue.java @@ -0,0 +1,75 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the cuffs npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CuffsDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CuffsDialogue} {@code Object}. + */ + public CuffsDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CuffsDialogue} {@code Object}. + * @param player the player. + */ + public CuffsDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CuffsDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello. nice day for a walk, isn't it?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A walk? Oh, yes, that's what we're doing.", "We're just out here for a walk."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm glad you're just out here for a walk. A more suspicious", "person would think you were waiting here to attack weak-", "looking travellers."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nope, we'd never do anuthing like that.", "Just a band of innocent walkers, that's us."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Alright, have a nice walk."); + stage = 4; + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3237 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/CustomsOfficerDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/CustomsOfficerDialogue.java new file mode 100644 index 000000000..37ab988b8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/CustomsOfficerDialogue.java @@ -0,0 +1,212 @@ +package core.game.content.dialogue; + +import core.game.content.global.travel.ship.Ships; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the dialogue plugin used to handle the customs officer. + * @author Vexia + */ +@Initializable +public final class CustomsOfficerDialogue extends DialoguePlugin { + + /** + * Represents the locations to check where we're. + */ + private static final Location[] LOCATIONS = new Location[] { Location.create(2771, 3227, 0), Location.create(2954, 3147, 0) }; + + /** + * Represents the illegal rum. + */ + private static final Item RUM = new Item(431); + + /** + * Constructs a new {@code CustomsOfficer} {@code Object}. + */ + public CustomsOfficerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CustomsOfficer} {@code Object}. + * @param player the player. + */ + public CustomsOfficerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CustomsOfficerDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length > 1) { + if (player.getQuestRepository().isComplete("Pirate's Treasure")) { + if (player.getInventory().containsItem(RUM)) { + interpreter.sendDialogues(npc, null, "Aha, trying to smuggle rum are we?"); + stage = 900; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well you've got some odd stuff, but it's all legal. Now", "you need to pay a boarding charge of " + getPrice() + " coins."); + stage = 121; + return true; + } + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Can I journey on this ship?", "Does Karamja have unusual customs then?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I journey on this ship?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Does Karamja have unusual customs then?"); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You need to be searched before you can board?"); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Why?", "Search away, I have nothing to hide.", "You're not putting your hands on my things!"); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why?"); + stage = 110; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Search away, I have nothing to hide."); + stage = 120; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You're not putting your hands on my things!"); + stage = 130; + break; + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm not that sort of customs officer."); + stage = 21; + break; + case 21: + end(); + break; + case 110: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Because Asgarnia has banned the import of intoxicating", "spirits."); + stage = 111; + break; + case 111: + end(); + break; + case 120: + if (player.getInventory().containsItem(RUM)) { + interpreter.sendDialogues(npc, null, "Aha, trying to smuggle rum are we?"); + stage = 900; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well you've got some odd stuff, but it's all legal. Now", "you need to pay a boarding charge of " + getPrice() + " coins."); + stage = 121; + break; + case 121: + interpreter.sendOptions("Select an Option", "Ok.", "Oh, I'll not bother then."); + stage = 122; + break; + case 900: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Umm... it's for personal use?"); + stage = 901; + break; + case 901: + for (int i = 0; i < player.getInventory().getAmount(RUM); i++) { + player.getInventory().remove(RUM); + } + player.getPacketDispatch().sendMessage("The customs officer confiscates your rum."); + player.getPacketDispatch().sendMessage("You will need to find some way to smuggle it off the island..."); + end(); + break; + case 122: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok."); + stage = 210; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, I'll not bother then."); + stage = 220; + break; + } + break; + case 210:// money + Item coins = new Item(995, getPrice()); + if (!player.getInventory().containsItem(coins)) { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough coins."); + stage = 220; + return true; + } + if (!player.getInventory().remove(coins)) { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough coins."); + stage = 220; + return true; + } + end(); + Ships ship = null; + if (player.getLocation().getDistance(LOCATIONS[0]) < 40) { + ship = Ships.BRIMHAVEN_TO_ARDOUGNE; + } + if (player.getLocation().getDistance(LOCATIONS[1]) < 40) { + ship = Ships.KARAMJAMA_TO_PORT_SARIM; + } + player.getPacketDispatch().sendMessage("You pay " + getPrice() + " coins and board the ship."); + ship.sail(player); + break; + case 220: + end(); + break; + case 130: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You're not getting on this ship then."); + stage = 131; + break; + case 131: + end(); + break; + } + return true; + } + + /** + * Gets the price of the fare. + * @return the price. + */ + public int getPrice() { + return player.getAchievementDiaryManager().getKaramjaGlove() != -1 ? 15 : 30; + } + + @Override + public int[] getIds() { + return new int[] { 380 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DSChestDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DSChestDialogue.java new file mode 100644 index 000000000..aade2c81c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DSChestDialogue.java @@ -0,0 +1,77 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; + +import core.game.content.quest.free.dragonslayer.DragonSlayer; + +/** + * Represents the dialogue plugin used for the dragon slayer chest. + * @author 'Vexia + * @version 1.0 + */ +public final class DSChestDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DSChestDialogue} {@code Object}. + */ + public DSChestDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DSChestDialogue} {@code Object}. + * @param player the player. + */ + public DSChestDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DSChestDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("As you open the chest, you notice an inscription on the lid:"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogue("Here I rest the map to my beloved home. To whoever finds it, I beg", "of you, let it be. I was honour-bound not to destroy the map piece,", "but I have used all my magical skill to keep it from being recovered."); + stage = 1; + break; + case 1: + interpreter.sendDialogue("This map leads to the lair of the beast that destroyed my home,", "devoured my family, and burned to a cinder all that I love. But", "revenge would not benefit me now, and to disturb this beast is to risk", "brining its wrath down upon another land."); + stage = 2; + break; + case 2: + interpreter.sendDialogue("I cannot stop you from taking this map piece now, but think on this:", "if you can slay the Dragon of Crandor, you are a greater hero than", "my land ever produced. There is no shame in backing out now."); + stage = 3; + break; + case 3: + interpreter.sendItemMessage(DragonSlayer.MAGIC_PIECE.getId(), "You find a map piece in the chest."); + stage = 4; + break; + case 4: + if (!player.getInventory().add(DragonSlayer.MAGIC_PIECE)) { + GroundItemManager.create(DragonSlayer.MAGIC_PIECE, player); + } + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3802875 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DairyChurnDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DairyChurnDialogue.java new file mode 100644 index 000000000..439215ebf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DairyChurnDialogue.java @@ -0,0 +1,107 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.plugin.Initializable; +import core.tools.Items; +import core.game.node.entity.skill.cooking.dairy.DairyChurnPulse; +import core.game.node.entity.skill.cooking.dairy.DairyProduct; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the dairy churn dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DairyChurnDialogue extends DialoguePlugin { + + /** + * Represents the item array. + */ + private static final Item[] ITEMS = new Item[] { + new Item(Items.BUCKET_OF_MILK_1927, 1), + new Item(Items.POT_OF_CREAM_2130, 1), + new Item(Items.PAT_OF_BUTTER_6697, 1) + }; + + /** + * Constructs a new {@code DairyChurnDialogue} {@code Object}. + */ + public DairyChurnDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DairyChurnDialogue} {@code Object}. + * @param player the player. + */ + public DairyChurnDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DairyChurnDialogue(player); + } + + @Override + public boolean open(Object... args) { + player.getInterfaceManager().openChatbox(new Component(74)); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + DairyProduct product = null; + int amount = 0; + switch (buttonId) { + case 6: + product = DairyProduct.POT_OF_CREAM; + amount = 1; + break; + case 5: + product = DairyProduct.POT_OF_CREAM; + amount = 5; + break; + case 4: + product = DairyProduct.POT_OF_CREAM; + amount = 10; + break; + case 9: + product = DairyProduct.PAT_OF_BUTTER; + amount = 1; + break; + case 8: + product = DairyProduct.PAT_OF_BUTTER; + amount = 5; + break; + case 7: + product = DairyProduct.PAT_OF_BUTTER; + amount = 10; + break; + case 12: + product = DairyProduct.CHEESE; + amount = 1; + break; + case 11: + product = DairyProduct.CHEESE; + amount = 5; + break; + case 10: + product = DairyProduct.CHEESE; + amount = 10; + break; + } + player.getPulseManager().run(new DairyChurnPulse(player, ITEMS[0], product, amount)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 984374 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DairyChurnOptionPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/DairyChurnOptionPlugin.java new file mode 100644 index 000000000..4de26e336 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DairyChurnOptionPlugin.java @@ -0,0 +1,38 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle dairy churning executing. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DairyChurnOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(10093).getHandlers().put("option:churn", this); + ObjectDefinition.forId(10094).getHandlers().put("option:churn", this); + ObjectDefinition.forId(25720).getHandlers().put("option:churn", this); + ObjectDefinition.forId(34800).getHandlers().put("option:churn", this); + ObjectDefinition.forId(35931).getHandlers().put("option:churn", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getInventory().contains(1927, 1) && !player.getInventory().contains(2130, 1) && !player.getInventory().contains(6697, 1)) { + player.getPacketDispatch().sendMessage("You need some milk, cream or butter to use in the churn."); + return true; + } + player.getDialogueInterpreter().open(984374); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DartCreateDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DartCreateDialogue.java new file mode 100644 index 000000000..061f4fc4c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DartCreateDialogue.java @@ -0,0 +1,105 @@ +/* +package core.game.content.dialogue; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.fletching.items.darts.Dart; +import core.game.node.entity.skill.fletching.items.darts.DartPulse; +import org.crandor.game.node.entity.player.Player; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.game.node.item.Item; + +*/ +/** + * Represents the dart creating dialogue. + * @author 'Vexia + * @version 1.0 + *//* + +@InitializablePlugin +public final class DartCreateDialogue extends DialoguePlugin { + + */ +/** + * Represents the first item parameter. + *//* + + private Item item; + + */ +/** + * Represents the second item parameter. + *//* + + private Item second; + + */ +/** + * Represents the dark. + *//* + + private Dart dart; + + */ +/** + * Constructs a new {@code DartCreateDialogue} {@code Object}. + *//* + + public DartCreateDialogue() { + */ +/** + * empty. + *//* + + } + + */ +/** + * Constructs a new {@code DartCreateDialogue} {@code Object}. + * @param player the player. + *//* + + public DartCreateDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DartCreateDialogue(player); + } + + @Override + public boolean open(Object... args) { + item = (Item) args[0]; + second = (Item) args[1]; + dart = Dart.forItem(item.getName().toLowerCase().contains("feather") ? second : item); + player.getInterfaceManager().openChatbox(582); + player.getPacketDispatch().sendString("



" + dart.getProduct().getName(), 582, 5); + player.getPacketDispatch().sendItemZoomOnInterface(dart.getProduct().getId(), 160, 582, 2); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + int amount = 0; + switch (buttonId) { + case 4: + amount = 5; + break; + case 5: + amount = 1; + break; + case 3: + amount = 10; + break; + } + player.getPulseManager().run(new DartPulse(player, item, dart, amount)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 328933 }; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DavonDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DavonDialogue.java new file mode 100644 index 000000000..1ec2a7140 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DavonDialogue.java @@ -0,0 +1,94 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the davon npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DavonDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DavonDialogue} {@code Object}. + */ + public DavonDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DavonDialogue} {@code Object}. + * @param player the player. + */ + public DavonDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DavonDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Pssst! Come here if you want to do some amulet", "trading."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What are you selling?", "What do you mean pssst?", "Why don't you ever restock some types of amulets?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What are you selling?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do you mean pssst?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why don'y you ever restock some types of amulets?"); + stage = 30; + break; + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Errr, I was...I was clearing my throat."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Some of these amulets are very hard to get. I have to", "wait until an adventurer supplies me."); + stage = 31; + break; + case 31: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 588 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DelMontyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DelMontyDialogue.java new file mode 100644 index 000000000..b3330f8ea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DelMontyDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the del monty npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DelMontyDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DelMontyDialogue} {@code Object}. + */ + public DelMontyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DelMontyDialogue} {@code Object}. + * @param player the player. + */ + public DelMontyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DelMontyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hey kitty!"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Meow."); + stage = 0; + break; + default: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "\"Meow.\""); + stage = 0; + break; + } + return true; + } + + /** + * Method used to check if a player has a cat speak amulet. + * @param player the player. + * @return {@code True} so. + */ + public static boolean hasCatAmulet(Player player) { + Item item = player.getEquipment().get(EquipmentContainer.SLOT_AMULET); + if (item == null) + return false; + return item.getId() == 4677 || item.getId() == 6544; + } + + @Override + public int[] getIds() { + return new int[] { 5563 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DenulthDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DenulthDialogue.java new file mode 100644 index 000000000..453b01d3f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DenulthDialogue.java @@ -0,0 +1,76 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the denulth dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DenulthDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DenulthDialogue} {@code Object}. + */ + public DenulthDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DenulthDialogue} {@code Object}. + * @param player the player. + */ + public DenulthDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DenulthDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome back friend!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How goes your fight with trolls?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Very good! We are winning."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Good luck!"); + stage = 4; + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1060 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DestroyItemPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/DestroyItemPlugin.java new file mode 100644 index 000000000..9825f1231 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DestroyItemPlugin.java @@ -0,0 +1,74 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the destroy item plugin. + * @author Vexia + * + */ +@Initializable +public final class DestroyItemPlugin extends DialoguePlugin { + + /** + * Represents the sound to send for destroying an item. + */ + private static final Audio SOUND = new Audio(4500, 1, 0); + + /** + * Represents the item parameter. + */ + private Item item; + + /** + * Constructs a new {@code DestroyItemPlugin} {@code Object}. + */ + public DestroyItemPlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DestroyItemPlugin} {@code Object}. + * @param player the player. + */ + public DestroyItemPlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DestroyItemPlugin(player); + } + + @Override + public boolean open(Object... args) { + item = (Item) args[0]; + interpreter.sendDestroyItem(item.getId(), item.getName()); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (buttonId == 2) { + if (player.getInventory().remove(item)) { + player.getAudioManager().send(SOUND); + end(); + } + } + if (buttonId == 3) { + end(); + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 9878 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DialogueAction.java b/Server/src/main/java/Server/core/game/content/dialogue/DialogueAction.java new file mode 100644 index 000000000..8f263e7e0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DialogueAction.java @@ -0,0 +1,18 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; + +/** + * A dialogue reward. + * @author Vexia + */ +public interface DialogueAction { + + /** + * Handles a dialogue click. + * @param player the player. + * @param buttonId the buttonId. + */ + public void handle(Player player, int buttonId); + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DialogueInterpreter.java b/Server/src/main/java/Server/core/game/content/dialogue/DialogueInterpreter.java new file mode 100644 index 000000000..aedde9913 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DialogueInterpreter.java @@ -0,0 +1,612 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.game.component.Component; +import core.game.system.SystemLogger; +import core.game.system.config.ItemConfigParser; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.script.ScriptContext; +import core.game.system.script.ScriptManager; +import core.game.system.script.context.*; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; +import core.plugin.PluginManifest; +import core.plugin.PluginType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Handles the dialogues. + * @author Emperor + */ +@PluginManifest(type = PluginType.DIALOGUE) +public final class DialogueInterpreter { + + /** + * The dialogue plugins. + */ + private static final Map PLUGINS = new HashMap<>(); + + /** + * The dialogue scripts. + */ + private static final Map SCRIPTS = new HashMap<>(); + + /** + * a List of dialogue actions. + */ + private final List actions = new ArrayList<>(); + + /** + * The currently opened dialogue. + */ + private DialoguePlugin dialogue; + + /** + * Scripted dialogue current stage. + */ + private ScriptContext dialogueStage; + + /** + * The current dialogue key. + */ + private int key; + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@code DialogueInterpreter} {@code Object}. + * @param player The player. + */ + public DialogueInterpreter(Player player) { + this.player = player; + } + + /** + * @param dialogue the dialogue to set. + */ + public void setDialogue(DialoguePlugin dialogue) { + this.dialogue = dialogue; + } + + /** + * Opens the dialogue for the given dialogue type. + * @param dialogueType The dialogue type. + * @param args the args. + * @return {@code True} if successful. + */ + public boolean open(String dialogueType, Object... args) { + return open(getDialogueKey(dialogueType), args); + } + + /** + * Opens the dialogue for the given NPC id. + * @param dialogueKey The dialogue key (usually NPC id). + * @param args The arguments. + * @return {@code True} if successful. + */ + public boolean open(int dialogueKey, Object... args) { + key = dialogueKey; + if (args.length > 0 && args[0] instanceof NPC) { + NPC npc = (NPC) args[0]; + npc.setDialoguePlayer(player); + try { //this prevents the dialogue interpreter from dying when you try opening an NPC's dialogue without passing the NPC itself as an argument + npc.getWalkingQueue().reset(); + npc.getPulseManager().clear(); + } catch(Exception e){ + } + } else if (args.length < 1) { + args = new Object[] { dialogueKey }; + } + ScriptContext script = SCRIPTS.get(dialogueKey); + if (script != null) { + Object[] arguments = new Object[args.length + 1]; + for (int i = 0; i < args.length; i++) { + arguments[i + 1] = args[i]; + } + arguments[0] = player; + startScript(script, arguments); + return true; + } + DialoguePlugin plugin = PLUGINS.get(dialogueKey); + if (plugin == null) { + return false; + } + if (player.isDebug()) { + player.sendMessage("Dialogue opening - " + plugin.getClass().getSimpleName() + ", key=" + dialogueKey + ""); + } + this.dialogue = plugin.newInstance(player); + if (dialogue == null || !dialogue.open(args)) { + dialogue = null; + return false; + } + return true; + } + + /** + * Starts a dialogue script. + * @param script The script. + * @param args The arguments. + */ + public void startScript(ScriptContext script, Object... args) { + startScript(key, script, args); + } + + /** + * Starts a dialogue script. + * @param dialogueKey The dialogue key. + * @param script The script. + * @param args The arguments. + */ + public void startScript(int dialogueKey, ScriptContext script, Object... args) { + key = dialogueKey; + (dialogueStage = script).execute(args); + if (script != null && script.isInstant()) { + dialogueStage = script = ScriptManager.run(script, args); + } + } + + /** + * Handles an dialogue input. + * @param componentId The id of the chatbox component. + * @param buttonId The button id. + */ + public void handle(int componentId, int buttonId) { + if (dialogueStage != null) { + dialogueStage = ScriptManager.run(dialogueStage, player, key, buttonId); + if (!(dialogueStage instanceof PDialInstruction || dialogueStage instanceof NPCDialInstruction || dialogueStage instanceof OptionDialInstruction || dialogueStage instanceof PlainMessageInstruction || dialogueStage instanceof ItemMessageInstruction)) { + player.getInterfaceManager().closeChatbox(); + } + return; + } + player.setAttribute("chatbox-buttonid",buttonId); + player.getDialogueInterpreter().getDialogue().handle(componentId, buttonId - 1);//here + } + + /** + * Closes the current dialogue. + * @return {@code True} if successful. + */ + public boolean close() { + if (dialogue != null || dialogueStage != null) { + actions.clear(); + if (player.getInterfaceManager().getChatbox() != null && player.getInterfaceManager().getChatbox().getCloseEvent() != null) { + return true; + } + if (dialogueStage != null) { + dialogueStage = null; + player.getInterfaceManager().closeChatbox(); + } + if (dialogue != null && dialogue.close()) { + dialogue = null; + } + } + return dialogue == null && dialogueStage == null; + } + + /** + * Puts a dialogue plugin on the mapping. + * @param id The NPC id (or {@code 1 << 16 | dialogueId} when the dialogue + * isn't for an NPC). + * @param plugin The plugin. + */ + public static void add(int id, DialoguePlugin plugin) { + if (PLUGINS.containsKey(id)) { + throw new IllegalArgumentException("Dialogue " + (id & 0xFFFF) + " is already in use - [old=" + PLUGINS.get(id).getClass().getSimpleName() + ", new=" + plugin.getClass().getSimpleName() + "]!"); + } + PLUGINS.put(id, plugin); + } + + /** + * Adds a dialogue script for the given key. + * @param dialogueKey The dialogue key. + * @param context The dialogue script. + */ + public static void add(int dialogueKey, ScriptContext context) { + if (SCRIPTS.containsKey(dialogueKey)) { + // throw new IllegalArgumentException("Dialogue " + dialogueKey + + // " is already in use - [old=" + + // SCRIPTS.get(dialogueKey).getClass().getSimpleName() + ", new=" + + // context.getClass().getSimpleName() + "]!"); + } + SCRIPTS.put(dialogueKey, context); + } + + /** + * Gets the script context for the given dialogue key. + * @param key The dialogue key. + * @return The script context. + */ + public static ScriptContext getScript(int key) { + return SCRIPTS.get(key); + } + + /** + * Send plain messages based on the amount of specified messages. + * @param messages The messages. + * @return The chatbox component. + */ + public Component sendDialogue(String... messages) { + if (messages.length < 1 || messages.length > 4) { + return null; + } + int interfaceId = 209 + messages.length; + for (int i = 0; i < messages.length; i++) { + player.getPacketDispatch().sendString(messages[i], interfaceId, i + 1); + } + player.getInterfaceManager().openChatbox(interfaceId); + if (player.getAttribute("tut-island", false)) { + + } + player.getPacketDispatch().sendInterfaceConfig(player.getInterfaceManager().getChatbox().getId(), 1, false); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Sends a plane message and hides the continue button. + * @param hideContinue if we should hide it or not. + * @param messages the messages. + * @return the component. + */ + public Component sendPlainMessage(final boolean hideContinue, String... messages) { + sendDialogue(messages); + player.getPacketDispatch().sendInterfaceConfig(player.getInterfaceManager().getChatbox().getId(), (messages.length + 1), hideContinue); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Opens the destroy item chatbox interface. + * @param id The item id. + * @param message The message to display. + * @return The component. + */ + public Component sendDestroyItem(int id, String message) { + player.getInterfaceManager().openChatbox(94); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 94, 93, 93, new Item[] { new Item(id) }, 1, false)); + String text = ItemDefinition.forId(id).getConfiguration(ItemConfigParser.DESTROY_MESSAGE, "Are you sure you want to destroy this object?"); + if (text.length() > 200) { + String[] words = text.split(" "); + StringBuilder sb = new StringBuilder(words[0]); + for (int i = 1; i < words.length; i++) { + if (i == (words.length / 2)) { + sb.append("
"); + } else { + sb.append(" "); + } + sb.append(words[i]); + } + text = sb.toString(); + } + player.getPacketDispatch().sendString("Are you sure you want to destroy this object?", 94, 2); + player.getPacketDispatch().sendString("Yes.", 94, 3); + player.getPacketDispatch().sendString("No.", 94, 4); + player.getPacketDispatch().sendString(text, 94, 7); + player.getPacketDispatch().sendString(ItemDefinition.forId(id).getName(), 94, 8); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send plane messages with a blue title. + * @param title The title. + * @param messages The messages. + * @return The chatbox component. + */ + public Component sendPlaneMessageWithBlueTitle(String title, String... messages) { + player.getPacketDispatch().sendString(title, 372, 0); + for (int i = 0; i < messages.length; i++) { + player.getPacketDispatch().sendString(messages[i], 372, i + 1); + } + player.getInterfaceManager().openChatbox(372); + if (player.getAttributes().containsKey("tut-island") || TutorialSession.getExtension(player).getStage() < TutorialSession.MAX_STAGE) { + } + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send plane messages with scroll and a blue title. + * @param title The title. + * @param messages The messages. + * @return The chatbox component. + */ + public Component sendScrollMessageWithBlueTitle(String title, String... messages) { + for (int i = 0; i < 11; i++) { + player.getPacketDispatch().sendString(" ", 421, i + 2); + } + player.getPacketDispatch().sendString(title, 421, 1); + for (int i = 0; i < messages.length; i++) { + player.getPacketDispatch().sendString(messages[i], 421, i + 2); + } + player.getInterfaceManager().openChatbox(421); + if (player.getAttributes().containsKey("tut-island")) { + } + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send a message with an item next to it. + * @param itemId The item id. + */ + public Component sendItemMessage(int itemId, String... messages) { + player.getInterfaceManager().openChatbox(131); + String message = messages[0]; + for (int i = 1; i < messages.length; i++) { + message += "
" + messages[i]; + } + player.getPacketDispatch().sendString(message, 131, 1); + player.getPacketDispatch().sendItemOnInterface(itemId, 1, 131, 2); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send a message with an item next to it. + */ + public Component sendItemMessage(final Item item, String... messages) { + player.getInterfaceManager().openChatbox(131); + String message = messages[0]; + for (int i = 1; i < messages.length; i++) { + message += "
" + messages[i]; + } + player.getPacketDispatch().sendString(message, 131, 1); + player.getPacketDispatch().sendItemOnInterface(item.getId(), item.getAmount(), 131, 2); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send a message with an item next to it. + * @param message The message. + */ + public Component sendDoubleItemMessage(int first, int second, String message) { + player.getInterfaceManager().openChatbox(131); + player.getPacketDispatch().sendString(message, 131, 1); + player.getPacketDispatch().sendItemOnInterface(first, 1, 131, 0); + player.getPacketDispatch().sendItemOnInterface(second, 1, 131, 2); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send a message with an item next to it. + * @param message The message. + */ + public Component sendDoubleItemMessage(Item first, Item second, String message) { + player.getInterfaceManager().openChatbox(131); + player.getPacketDispatch().sendString(message, 131, 1); + player.getPacketDispatch().sendItemOnInterface(first.getId(), first.getAmount(), 131, 0); + player.getPacketDispatch().sendItemOnInterface(second.getId(), second.getAmount(), 131, 2); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send dialogues based on the amount of specified messages. + * @param entity The entity. + * @param expression The entity's facial expression. + * @param messages The messages. + * @return The chatbox component. + */ + public Component sendDialogues(Entity entity, FacialExpression expression, String... messages) { + return sendDialogues(entity, expression == null ? -1 : expression.getAnimationId(), messages); + } + + /** + * Send dialogues based on the amount of specified messages. + * @param entity The entity. + * @param expression The entity's facial expression. + * @param messages The messages. + * @return The chatbox component. + */ + public Component sendDialogues(Entity entity, int expression, String... messages) { + return sendDialogues(entity instanceof Player ? -1 : ((NPC) entity).getShownNPC(player).getId(), expression, messages); + } + + /** + * Send dialogues based on the amount of specified messages. + * @param npcId The npc id. + * @param expression The entity's facial expression. + * @param messages The messages. + * @param hide the continue. + * @return The chatbox component. + */ + public Component sendDialogues(int npcId, FacialExpression expression, boolean hide, String... messages) { + sendDialogues(npcId, expression == null ? -1 : expression.getAnimationId(), messages); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send dialogues based on the amount of specified messages. + * @param expression The entity's facial expression. + * @param messages The messages. + * @param hide the continue. + * @return The chatbox component. + */ + public Component sendDialogues(Entity entity, FacialExpression expression, boolean hide, String... messages) { + sendDialogues(entity, expression, messages); + player.getPacketDispatch().sendInterfaceConfig(player.getInterfaceManager().getChatbox().getId(), 3, hide); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send dialogues based on the amount of specified messages. + * @param expression The entity's facial expression. + * @param messages The messages. + * @param hide the continue. + * @return The chatbox component. + */ + public Component sendDialogues(Entity entity, int expression, boolean hide, String... messages) { + sendDialogues(entity, expression, messages); + player.getPacketDispatch().sendInterfaceConfig(player.getInterfaceManager().getChatbox().getId(), 3, hide); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send dialogues based on the amount of specified messages. + * @param expression The entity's facial expression. + * @param messages The messages. + * @return The chatbox component. + */ + public Component sendDialogues(int npcId, int expression, boolean hide, String... messages) { + sendDialogues(npcId, expression, messages); + player.getPacketDispatch().sendInterfaceConfig(player.getInterfaceManager().getChatbox().getId(), 3, hide); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send dialogues based on the amount of specified messages. + * @param npcId The npc id. + * @param expression The entity's facial expression. + * @param messages The messages. + * @return The chatbox component. + */ + public Component sendDialogues(int npcId, FacialExpression expression, String... messages) { + return sendDialogues(npcId, expression == null ? -1 : expression.getAnimationId(), messages); + } + + /** + * Send dialogues based on the amount of specified messages. + * @param npcId The npc id. + * @param expression The entity's facial expression. + * @param messages The messages. + * @return The chatbox component. + */ + public Component sendDialogues(int npcId, int expression, String... messages) { + if (messages.length < 1 || messages.length > 4) { + return null; + } + boolean npc = npcId > -1; + int interfaceId = (npc ? 240 : 63) + messages.length; + if (expression == -1) { + expression = FacialExpression.HALF_GUILTY.getAnimationId(); + } + player.getPacketDispatch().sendAnimationInterface(expression, interfaceId, 2); + if (npc) { + player.getPacketDispatch().sendNpcOnInterface(npcId, interfaceId, 2); + player.getPacketDispatch().sendString(NPCDefinition.forId(npcId).getName(), interfaceId, 3); + } else { + player.getPacketDispatch().sendPlayerOnInterface(interfaceId, 2); + player.getPacketDispatch().sendString(player.getUsername(), interfaceId, 3); + } + for (int i = 0; i < messages.length; i++) { + player.getPacketDispatch().sendString(messages[i].toString().replace("@name", player.getUsername()), interfaceId, (i + 4)); + } + player.getInterfaceManager().openChatbox(interfaceId); + if (player.getAttributes().containsKey("tut-island") || TutorialSession.getExtension(player).getStage() < TutorialSession.MAX_STAGE) { + } + player.getPacketDispatch().sendInterfaceConfig(player.getInterfaceManager().getChatbox().getId(), 3, false); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send options based on the amount of specified options. + * @param title The title. + * @param options The options. + */ + public Component sendOptions(Object title, String... options) { + int interfaceId = 224 + (2 * options.length); + if (options.length < 2 || options.length > 5) { + return null; + } + if (title != null) { + player.getPacketDispatch().sendString(title.toString(), interfaceId, 1); + } + for (int i = 0; i < options.length; i++) { + player.getPacketDispatch().sendString(options[i].toString(), interfaceId, i + 2); + } + if (player.getAttributes().containsKey("tut-island")) { + } + player.getInterfaceManager().openChatbox(interfaceId); + return player.getInterfaceManager().getChatbox(); + } + + /** + * Send a input run script. + * @param string The strings. + * @param objects The arguments. + */ + public void sendInput(boolean string, Object... objects) { + player.getPacketDispatch().sendRunScript(string ? 109 : 108, "s", objects); + } + + /** + * Sends a long input. + * @param objects the objects. + */ + public void sendLongInput(Object... objects) { + player.getPacketDispatch().sendRunScript(110, "s", objects); + } + + /** + * Sends the private message input. + * @param reciever The receiver. + */ + public void sendMessageInput(String reciever) { + player.getPacketDispatch().sendRunScript(107, "s", reciever); + } + + /** + * Checks if the dialogue for the given id is added. + * @param id The NPC id/dialogue id. + * @return {@code True} if so. + */ + public static boolean contains(int id) { + return PLUGINS.containsKey(id); + } + + /** + * Gets the currently opened dialogue. + * @return The dialogue plugin. + */ + public DialoguePlugin getDialogue() { + return dialogue; + } + + /** + * Reserves a key for the name. + * @param name The name. + * @return The key. + */ + public static int getDialogueKey(String name) { + return 1 << 16 | name.hashCode(); + } + + /** + * Gets the dialogueStage. + * @return The dialogueStage. + */ + public ScriptContext getDialogueStage() { + return dialogueStage; + } + + /** + * Sets the dialogueStage. + * @param dialogueStage The dialogueStage to set. + */ + public void setDialogueStage(ScriptContext dialogueStage) { + this.dialogueStage = dialogueStage; + } + + /** + * Adds a dialogue reward. + * @param action the reward. + */ + public void addAction(DialogueAction action) { + actions.add(action); + } + + /** + * Gets the actions. + * @return The actions. + */ + public List getActions() { + return actions; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/DialoguePlugin.java new file mode 100644 index 000000000..22c12a1c8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DialoguePlugin.java @@ -0,0 +1,264 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; +import core.plugin.PluginManifest; +import core.plugin.PluginType; + +/** + * Represents a dialogue plugin. + * @author Emperor + */ +@PluginManifest(type = PluginType.DIALOGUE) +public abstract class DialoguePlugin implements Plugin { + + /** + * Represents the red string. + */ + protected static final String RED = ""; + + /** + * Represents the blue string. + */ + protected static final String BLUE = ""; + + /** + * The player. + */ + protected Player player; + + /** + * The dialogue interpreter. + */ + protected DialogueInterpreter interpreter; + + /** + * Two options interface. + */ + protected final int TWO_OPTIONS = 228; + + /** + * Three options interface. + */ + protected final int THREE_OPTIONS = 230; + + /** + * Four options interface. + */ + protected final int FOUR_OPTIONS = 232; + + /** + * Five options interface. + */ + protected final int FIVE_OPTIONS = 234; + + /** + * The NPC the player is talking with. + */ + protected NPC npc; + + /** + * The current dialogue stage. + */ + protected int stage; + + /** + * If the dialogue is finished. + */ + protected boolean finished; + + /** + * Constructs a new {@code DialoguePlugin} {@code Object}. + */ + public DialoguePlugin() { + /* + * empty. + */ + } + + public String pirateGender() { + return (player.isMale() ? "lad" : "lass"); + + } + + /** + * Constructs a new {@code DialoguePlugin} {@code Object}. + * @param player The player. + */ + public DialoguePlugin(Player player) { + this.player = player; + if (player != null) { + this.interpreter = player.getDialogueInterpreter(); + } + } + + /** + * Initializes this plugin. + */ + public void init() { + for (int id : getIds()) { + DialogueInterpreter.add(id, this); + } + } + + /** + * Closes (but does not end) the dialogue. + * @return {@code True} if the dialogue succesfully closed. + */ + public boolean close() { + player.getInterfaceManager().closeChatbox(); + player.getInterfaceManager().openChatbox(137); + finished = true; + return true; + } + + public void sendNormalDialogue(Entity entity, FacialExpression expression, String... messages) { + interpreter.sendDialogues(entity, expression, messages); + } + + /** + * Increments the stage variable. + */ + public void increment() { + stage++; + } + + + /** + * Increments the stage variable. + * @return The stage variable. + */ + public int getAndIncrement() { + return stage++; + } + + /** + * Ends the dialogue. + */ + public void end() { + if (interpreter != null) { + interpreter.close(); + } + } + + public void finish() { + setStage(-1); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public abstract DialoguePlugin newInstance(Player player); + + /** + * Opens the dialogue. + * @param args The arguments. + * @return {@code True} if the dialogue plugin succesfully opened. + */ + public abstract boolean open(Object... args); + + /** + * Handles the progress of this dialogue.. + * @return {@code True} if the dialogue has started. + */ + public abstract boolean handle(int interfaceId, int buttonId); + + /** + * Gets the ids of the NPCs using this dialogue plugin. + * @return The array of NPC ids. + */ + public abstract int[] getIds(); + + /** + * Method wrapper to send an npc dial. + * @return the component. + */ + public Component npc(final String... messages) { + if (npc == null) { + return interpreter.sendDialogues(getIds()[0], getIds()[0] > 8591 ? FacialExpression.OLD_NORMAL : FacialExpression.FRIENDLY, messages); + } + return interpreter.sendDialogues(npc, getIds()[0] > 8591 ? FacialExpression.OLD_NORMAL : FacialExpression.FRIENDLY, messages); + } + + /** + * Method wrapper to send an npc dial. + * @param id the id. + * @return the component. + */ + public Component npc(int id, final String... messages) { + return interpreter.sendDialogues(id, FacialExpression.FRIENDLY, messages); + } + + public Component sendDialogue(String... messages) { + return interpreter.sendDialogue(messages); + } + + /** + * Method wrapper to send an npc dial. + * @return the component. + */ + public Component npc(FacialExpression expression, final String... messages) { + if (npc == null) { + return interpreter.sendDialogues(getIds()[0], expression, messages); + } + return interpreter.sendDialogues(npc, expression, messages); + } + + /** + * Method wrapper to send a player dial. + * @return the component. + */ + public Component player(final String... messages) { + return interpreter.sendDialogues(player, null, messages); + } + /** + * Method wrapper to send a player dial. + * @return the component. + */ + public Component player(FacialExpression expression, final String... messages) { + return interpreter.sendDialogues(player, expression, messages); + } + + /** + * Method used to send options. + * @param options the options. + */ + public void options(final String... options) { + interpreter.sendOptions("Select an Option", options); + } + + /** + * Checks if the dialogue plugin is finished. + * @return {@code True} if so. + */ + public boolean isFinished() { + return finished; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Sets the stage. + * @param i the stage. + */ + public void setStage(int i) { + this.stage = i; + } + + public void next() { + this.stage += 1; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DiangoDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DiangoDialogue.java new file mode 100644 index 000000000..37d5c6c2d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DiangoDialogue.java @@ -0,0 +1,107 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used by diango. + * @author 'Vexia + * @version 1.1 + */ +@Initializable +public final class DiangoDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DiangoDialogue {@code Object}. + */ + public DiangoDialogue() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code DiangoDialogue} {@code Object}. + * @param player the player. + */ + public DiangoDialogue(Player player) { + super(player); + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Spinning plates?", "I'd like to check holiday items please!", "I'd like to claim purchased cosmetics."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Spinning plates?"); + stage = 10; + break; + case 2: + player("I'd like to check holiday items please?"); + stage = 20; + break; + case 3: + player("I'd like to claim purchased cosmetics."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That's right. There's a funny story behind them, their", "shipment was held up by thieves"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The crate was marked 'Dragon Plates'.", "Apparently they thought it was some kind of armour,", "when really it's just a plate!"); + stage = 12; + break; + case 12: + end(); + npc.openShop(player); + break; + case 20: + npc("Sure thing, let me just see what you're missing."); + stage++; + break; + case 21: + openItemReturn(player); + end(); + break; + case 30: + end(); + break; + } + return true; + } + + /** + * Opens the item return. + * @param player the player. + */ + private void openItemReturn(Player player) { + + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DiangoDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Howdy there, partner! Want to see my spinning plates?", "Or did ya want a holiday item back?"); + stage = 0; + return true; + } + + @Override + public int[] getIds() { + return new int[] { 970 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DismissDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/DismissDialoguePlugin.java new file mode 100644 index 000000000..a44cc3d89 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DismissDialoguePlugin.java @@ -0,0 +1,77 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.pet.Pet; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used to dismiss a follower. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DismissDialoguePlugin extends DialoguePlugin { + + /** + * Constructs a new {@code DismissDialoguePlugin} {@code Object}. + */ + public DismissDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DismissDialoguePlugin} {@code Object}. + * @param player the player. + */ + public DismissDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DismissDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + if (player.getFamiliarManager().getFamiliar() instanceof Pet) { + interpreter.sendOptions("Free pet", "Yes", "No"); + } else { + interpreter.sendOptions("Dismiss Familiar", "Yes", "No"); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + if (player.getFamiliarManager().getFamiliar() instanceof Pet) { + interpreter.sendDialogues(player, null, "Run along; I'm setting you free."); + } else { + end(); + } + player.getFamiliarManager().dismiss(false); + stage = 1; + break; + case 2: + end(); + break; + } + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("dismiss_dial") }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DommikDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DommikDialogue.java new file mode 100644 index 000000000..566f8f9b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DommikDialogue.java @@ -0,0 +1,70 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the DommikDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class DommikDialogue extends DialoguePlugin { + + public DommikDialogue() { + + } + + public DommikDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 545 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "No, thanks, I've got all the Crafting equipment I need.", "Let's see what you've got, then."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks, I've got all the Crafting equipment I need."); + stage = 10; + break; + case 2: + end(); + npc.openShop(player); + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Okay. Fare well on your travels."); + stage = 11; + break; + case 11: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new DommikDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy some Crafting equipment?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DonieDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DonieDialogue.java new file mode 100644 index 000000000..d1236b494 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DonieDialogue.java @@ -0,0 +1,127 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.GameWorld; + +/** + * Represents the dialogue plugin used for the donie npc. + * @author 'Vexia + * @version 1.00 + */ +@Initializable +public final class DonieDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DonieDialogue} {@code Object}. + */ + public DonieDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DonieDialogue} {@code Object}. + * @param player the player. + */ + public DonieDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DonieDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there, can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Where am I?", "How are you today?", "Your shoe lace is untied."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where am I?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How are you today?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Your shoe lace is untied."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is the town of Lumbridge my friend."); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Where am I?", "How are you today?", "Your shoe lace is untied."); + stage = 1; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Aye, not too bad thank you. Lovely weather in", "" + GameWorld.getSettings().getName() + " this fine day."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Weather?"); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes weather, you know."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The state or condition of the atmosphere at a time and", "place, with respect to variables such as temperature,", "moisture, wind velocity, and barometric pressure."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "..."); + stage = 25; + break; + case 25: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Not just a pretty face eh? Ha ha ha."); + stage = 26; + break; + case 26: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No it's not!"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No you're right. I have nothing to back that up."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Fool! Leave me alone!"); + stage = 33; + break; + case 33: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2238 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DoomsayerDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DoomsayerDialogue.java new file mode 100644 index 000000000..69b53d9c0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DoomsayerDialogue.java @@ -0,0 +1,129 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the doomsayer. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DoomsayerDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DoomsayerDialogue} {@code Object}. + */ + public DoomsayerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DoomsayerDialogue} {@code Object}. + * @param player the player. + */ + public DoomsayerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DoomsayerDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Dooooom!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "All around us! I can feel it in the air, hear it on the", "wind smell it....also in the air!"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Is there anything we can do about this doom?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There is nothing you need to do my friend! I am the", "Doomsayer, although my real title could be something like", "the Danger Tutor."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Danger Tutor?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes! I roam the world sensing danger."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If I find a dangerous area, then I put up warning signs", "that will tell you what is so dangerous about that area."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If you see the signs often enough, then you can", "turn them off; by that time you likely know what the", "area has in store for you."); + stage = 8; + break; + case 8: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "But what if I want to see the warning again?"); + stage = 9; + break; + case 9: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That's why I'm waiting here!"); + stage = 10; + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If you want to see the warning messages again, I", "can turn them back on for you."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you need to turn on any warning right now?"); + stage = 12; + break; + case 12: + interpreter.sendOptions("Select an Option", "Yes, I do.", "Not right now."); + stage = 13; + break; + case 13: + switch (buttonId) { + case 1: + end(); + player.getWarningMessages().open(player); + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ok, keep an eye out for the messages though!"); + stage = 30; + break; + } + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 3); + break; + case 30: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, " I will."); + stage = 31; + break; + case 31: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3777 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DoorPerilDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DoorPerilDialogue.java new file mode 100644 index 000000000..2f15635ae --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DoorPerilDialogue.java @@ -0,0 +1,142 @@ +package core.game.content.dialogue; + +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.object.GameObject; + +/** + * Represents the door peril dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DoorPerilDialogue extends DialoguePlugin { + + /** + * Represents the game object door. + */ + private GameObject door; + + /** + * Constructs a new {@code DoorPerilDialogue} {@code Object}. + */ + public DoorPerilDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DoorPerilDialogue} {@code Object}. + * @param player the player. + */ + public DoorPerilDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DoorPerilDialogue(player); + } + + @Override + public boolean open(Object... args) { + door = (GameObject) args[0]; + Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + if (quest.getStage(player) == 10) { + interpreter.sendDialogue("You knock at the door...You hear a voice from inside.", "Who are you, and what do you want?"); + stage = 0; + } + if (quest.getStage(player) == 12) {// just killed dog. + interpreter.sendDialogue("You knock at the door...You hear a voice from inside.", "You again?", "What do you want now?"); + stage = 11; + } + if (quest.getStage(player) >= 13) { + interpreter.sendDialogue("You knock at the door...The door swings open as you knock."); + stage = 20; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ummmm....."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Roald sent me to check on Drezel."); + stage = 2; + break; + case 2: + interpreter.sendDialogue("(Psst... Hey... Who's Roald? Who's Drezel?)(Uh... isn't Drezel that", "dude upstairs? Oh, wait, Roald's the King of Varrock right?)(He is???", "Aw man... Hey, you deal with this okay?) He's just coming! Wait a", "second!Hello, my name is Drevil. (Drezel!) I mean Drezel."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, as I say, the King sent me to make sure", "everything's okay with you."); + stage = 4; + break; + case 4: + interpreter.sendDialogue("And, uh, what would you do if everything wasn't okay with me?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm not sure. Ask you what help you need I suppose."); + stage = 6; + break; + case 6: + interpreter.sendDialogue("Ah, good, well, I don't think... (Psst... hey... the dog!) OH! Yes, of", "course! Will you do me a favour adventurer?"); + stage = 7; + break; + case 7: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sure. I'm a helpful person!"); + stage = 8; + break; + case 8: + interpreter.sendDialogue("HAHAHAHA! Really? Thanks buddy! You see that mausoleum out", "there? There's a horrible big dog underneath it that I'd like you to", "kill for me! It's been really bugging me! Barking all the time and", "stuff! Please kill it for me buddy!"); + stage = 9; + break; + case 9: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okey-dokey, one dead dog coming up."); + stage = 10; + break; + case 10: + Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + quest.setStage(player, 11); + end(); + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I killed that dog for you."); + stage = 12; + break; + case 12: + interpreter.sendDialogue("HAHAHAHAHA! Really? Hey, that's great! Yeah thanks a lot buddy!", "HAHAHAHAHAHA"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's so funny?"); + stage = 14; + break; + case 14: + interpreter.sendDialogue("HAHAHAHA nothing buddy! We're just so grateful to you!", "HAHAHA Yeah, maybe you should go tell the King what a great job", "you did buddy! HAHAHA"); + stage = 15; + break; + case 15: + end(); + break; + case 20: + end(); + DoorActionHandler.handleDoor(player, door); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 54584 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DoricDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DoricDialogue.java new file mode 100644 index 000000000..89779d01a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DoricDialogue.java @@ -0,0 +1,259 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.GameWorld; + +/** + * Represents the dialogue plugin used for the doric npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DoricDialogue extends DialoguePlugin { + + /** + * Represents the pickaxe item. + */ + private static final Item PICKAXE = new Item(1265, 1); + + /** + * Represents the requirement items. + */ + private static final Item[] REQUIREMENTS = new Item[] { new Item(436, 4), new Item(434, 6), new Item(440, 2) }; + + /** + * Constructs a new {@code DoricDialogue} {@code Object}. + */ + public DoricDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DoricDialogue} {@code Object}. + * @param player the player. + */ + public DoricDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DoricDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + final Quest quest = player.getQuestRepository().getQuest("Doric's Quest"); + if (!quest.isStarted(player)) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Hello traveller, what brings you to my humble smithy?"); + stage = 0; + } + if (quest.isStarted(player)) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Have you got my materials yet, traveller?"); + stage = 100; + } + if (quest.isCompleted(player)) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Hello traveller, how is your metalworking coming along?"); + stage = 500; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I wanted to use your anvils.", "I want to use your whetstone.", "Mind your own business, shortstuff!", "I was just checking out the landscape.", "What do you make here?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "I wanted to use your anvils."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "I want to use your whetsone."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Mind your own business, shortstuff!"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "I was just checking out the landscape."); + stage = 40; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "What do you make here?"); + stage = 50; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "My anvils get enough work with my own use. I make", "pickaxes, and it takes a lot of hard work. If you could", "get me some more materials, then I could let you use", "them."); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Yes, I will get you the materials.", "No, hitting rocks if for the boring people, sorry."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Yes I will get you the materials."); + stage = 15; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "No, hitting rocks is for the boring people, sorry."); + stage = 13; + break; + } + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "That is your choice. Nice to meet you anyway."); + stage = 14; + break; + case 14: + end(); + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Clay is what I use more than anything, to make casts.", "Could you get me 6 clay, 4 copper ore, and 2 iron ore,", "please? I could pay a little, and let you use my anvils.", "Take this pickaxe with you just in case you need it."); + stage = 16; + break; + case 16: + player.getQuestRepository().getQuest("Doric's Quest").setStage(player, 1); + player.getQuestRepository().syncronizeTab(player); + if (!player.getInventory().add(PICKAXE)) { + GroundItemManager.create(PICKAXE, player.getLocation()); + } + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Certainly, I'll be right back!"); + stage = 17; + break; + case 17: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "The whetstone is for more advanced smithing, but I", "could let you use it as well as my anvils if you could", "get me some more materials."); + stage = 11; + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "How nice to meet someone with such pleasant manners.", "Do come again when you need to shout at someone", "smaller than you!"); + stage = 31; + break; + case 31: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Hope you like it. I do enjoy the solitude of my little", "home. If you get time, please say hi to my friends in", "the Dwarven Mine."); + stage = 41; + break; + case 41: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Will do!"); + stage = 42; + break; + case 42: + end(); + break; + case 50: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "I make pickaxes. I am the best maker of pickaxes in the", "whole of " + GameWorld.getSettings().getName() + "."); + stage = 51; + break; + case 51: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Do you have any to sell?"); + stage = 52; + break; + case 52: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Sorry, but I've got a running order with Nurmof."); + stage = 53; + break; + case 53: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Ah, fair enough."); + stage = 54; + break; + case 54: + end(); + break; + case 100: + if (player.getInventory().contains(434, 6) && player.getInventory().contains(440, 2) && player.getInventory().contains(436, 4)) { + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "I have everything you need."); + stage = 200; + } else { + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Sorry, I don't have them all yet."); + stage = 101; + } + break; + case 101: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Not to worry, stick at it. Remember, I need 6 clay, 4", "copper ore, and 2 iron ore."); + stage = 102; + break; + case 102: + interpreter.sendOptions("Select an Option", "Where can I find those?", "Certainly, I'll be right back."); + stage = 103; + break; + case 103: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Where can I find those?"); + stage = 110; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Certainly, I'll be right back."); + stage = 113; + break; + + } + break; + case 110: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "You'll be able to find all those ores in the rocks just", "inside the Dwarven Mine. Head east from here and", "you'll find the entrance in the side of Ice Mountain."); + stage = 111; + break; + case 111: + end(); + break; + case 113: + end(); + break; + case 200: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Many thanks. Pass them here, please. I can spare you", "some coins for your trouble, and please use my anvils", "anytime you want."); + stage = 201; + break; + case 201: + interpreter.sendItemMessage(436, "You hand the clay, copper, and iron to Doric."); + stage = 202; + break; + case 202: + if (player.getInventory().remove(REQUIREMENTS)) { + end(); + player.getQuestRepository().getQuest("Doric's Quest").finish(player); + } + break; + case 500: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Not too bad, Doric."); + stage = 501; + break; + case 501: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Good, the love of metal is a thing close to my heart."); + stage = 502; + break; + case 502: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 284 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DrHarlowDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DrHarlowDialogue.java new file mode 100644 index 000000000..1ba632726 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DrHarlowDialogue.java @@ -0,0 +1,187 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue used for dr harlow. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DrHarlowDialogue extends DialoguePlugin { + + /** + * Represents the array of items related to dr harlow. + */ + private static final Item[] ITEMS = new Item[] { new Item(1549), new Item(1917, 1) }; + + /** + * Constructs a new {@code DrHarlowDialogue} {@code Object}. + */ + public DrHarlowDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DrHarlowDialogue} {@code Object}. + * @param player the player. + */ + public DrHarlowDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DrHarlowDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Buy me a drrink pleassh."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getQuestRepository().getQuest("Vampire Slayer").getStage(player) == 10) { + interpreter.sendOptions("Select an Option", "No, you've had enough.", "Morgan needs your help!"); + stage = 1; + } else if (player.getQuestRepository().getQuest("Vampire Slayer").getStage(player) == 20) { + if (player.getInventory().contains(1917, 1)) { + interpreter.sendDialogues(player, null, "Here you go."); + stage = 20; + } else { + interpreter.sendDialogues(player, null, "I'll just go and buy one."); + stage = 2; + } + } else if (player.getQuestRepository().getQuest("Vampire Slayer").getStage(player) == 30) { + if (!player.getBank().contains(1549, 1) && !player.getInventory().contains(1549, 1)) { + if (!player.getInventory().add(ITEMS[0])) { + GroundItem item = new GroundItem(ITEMS[0], npc.getLocation(), player); + GroundItemManager.create(item); + } + interpreter.sendItemMessage(1549, "Dr Harlow hands you a stake."); + stage = 27; + return true; + } + if (player.getInventory().contains(1917, 1)) { + interpreter.sendDialogues(player, null, "Here you go."); + stage = 20; + } else { + interpreter.sendDialogues(player, null, "I'll just go and buy one."); + stage = 2; + } + } else { + interpreter.sendDialogues(player, null, "No, you've had enough."); + stage = 2; + } + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "No, you've had enough."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, null, "Morgan needs your help!"); + stage = 5; + break; + } + break; + case 5: + interpreter.sendDialogues(npc, null, "Morgan you shhay..?"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(player, null, "His village is being terrorised by a vampire! He told me", "to ask you about how I can stop it."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(npc, null, "Buy me a beer... then I'll teash you what you need to", "know..."); + stage = 8; + break; + case 8: + interpreter.sendDialogues(player, null, "But this is your friend Morgan we're talking about!"); + stage = 9; + break; + case 9: + interpreter.sendDialogues(npc, null, "Buy ush a drink anyway..."); + stage = 10; + break; + case 10: + player.getQuestRepository().getQuest("Vampire Slayer").setStage(player, 20); + end(); + break; + case 2: + end(); + break; + case 20: + if (player.getInventory().remove(ITEMS[1])) { + interpreter.sendItemMessage(1917, "You give a beer to Dr Harlow."); + player.getQuestRepository().getQuest("Vampire Slayer").setStage(player, 30); + stage = 21; + } + break; + case 21: + interpreter.sendDialogues(npc, null, "Cheersh matey..."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(player, null, "So tell me how to kill vampires then."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, null, "Yesh Yesh vampires, I was very good at", "killing em once..."); + stage = 24; + break; + case 24: + interpreter.sendDialogue("Dr Harlow appears to sober up slightly."); + stage = 25; + break; + case 25: + interpreter.sendDialogues(npc, null, "Well you're gonna to need a stake, otherwise he'll just", "regenerate. Yes, you must have a stake to finish it off..", "I just happen to have one with me."); + stage = 26; + break; + case 26: + if (!player.getInventory().add(ITEMS[0])) { + GroundItem item = new GroundItem(ITEMS[0], npc.getLocation(), player); + GroundItemManager.create(item); + } + interpreter.sendItemMessage(1549, "Dr Harlow hands you a stake."); + stage = 27; + break; + case 27: + interpreter.sendDialogues(npc, null, "You'll need a hammer as well, to drive it in properly,", "your everyday general store hammer will do. One last", "thing... It's wise to carry garlic with you, vampires are", "somewhat weakend if they can smell garlic. Morgan"); + stage = 28; + break; + case 28: + interpreter.sendDialogues(npc, null, "alwys liked garlic, you should try his house. But", "remember, a vampire is still a dangerous foe!"); + stage = 29; + break; + case 29: + interpreter.sendDialogues(player, null, "Thank you very much!"); + stage = 30; + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 756 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DrOnglewipDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DrOnglewipDialogue.java new file mode 100644 index 000000000..9c8943794 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DrOnglewipDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dr onglewip dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DrOnglewipDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DrOnglewipDialogue} {@code Object}. + */ + public DrOnglewipDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DrOnglewipDialogue} {@code Object}. + * @param player the player. + */ + public DrOnglewipDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DrOnglewipDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Do you live here too?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Oh no, I come from Gnome Stronghold. I've been", "sent here by King Narnode to learn about human", "magics."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "So where's this Gnome Stronghold?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "It's in the North West of the continent - a long way", "away. You should visit us there some time. The food's", "great, and the company's delightful."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "I'll try and make time for it. Sounds like a nice place."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Well, it's full of gnomes. How much nicer could it be?"); + stage = 5; + break; + case 5: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4585 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DragonShieldDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DragonShieldDialogue.java new file mode 100644 index 000000000..ee016d005 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DragonShieldDialogue.java @@ -0,0 +1,121 @@ +package core.game.content.dialogue; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the dialogue plugin used for making a dragon shield. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DragonShieldDialogue extends DialoguePlugin { + + /** + * Represents the item shield parts. + */ + private static final Item[] SHIELD_PARTS = new Item[] { new Item(2366), new Item(2368) }; + + /** + * Represents th edraconic visage item. + */ + private static final Item DRACONIC_VISAGE = new Item(11286); + + /** + * Represents the anti dragon fire shield. + */ + private static final Item ANTI_DRAGONSHIELD = new Item(1540); + + /** + * Represents the dragon fire shield item. + */ + private static final Item DRAGON_FIRESHIELD = new Item(11284); + + /** + * Represents the shield item. + */ + private static final Item SQ_SHIELD = new Item(1187); + + /** + * Represents the hammering animation. + */ + private static Animation ANIMATION = new Animation(898); + + /** + * Represents the shield type. + */ + private int type; + + /** + * Constructs a new {@code DragonShieldDialogue} {@code Object}. + */ + public DragonShieldDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DragonShieldDialogue} {@code Object}. + * @param player the player. + */ + public DragonShieldDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DragonShieldDialogue(player); + } + + @Override + public boolean open(Object... args) { + type = (int) args[0]; + if (type == 1) { + interpreter.sendDialogue("You set to work trying to fix the ancient shield. It's seen some", "heavy reward and needs some serious work doing to it."); + stage = 0; + } else { + interpreter.sendDialogue("You set to work, trying to attach the ancient draconic", "visage to your anti-dragonbreath shield. It's not easy to", "work with the ancient artifact and it takes all of your", "skills as a master smith."); + stage = 10; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player.lock(5); + player.animate(ANIMATION); + interpreter.sendDialogue("Even for an experienced armourer it is not an easy task, but", "eventually it is ready. You have restored the dragon square shield to", "its former glory."); + if (player.getInventory().remove(SHIELD_PARTS)) { + player.getInventory().add(SQ_SHIELD); + } + player.getSkills().addExperience(Skills.SMITHING, 75, true); + stage = 1; + break; + case 1: + end(); + break; + case 10: + player.lock(5); + player.animate(ANIMATION); + interpreter.sendDialogue("Even for an experienced armourer it is not an easy task, but", "eventually it is ready. You have crafted the", "draconic visage and anti-dragonbreath shield into a", "dragonfire shield."); + if (player.getInventory().remove(DRACONIC_VISAGE, ANTI_DRAGONSHIELD)) { + player.getInventory().add(DRAGON_FIRESHIELD); + } + player.getSkills().addExperience(Skills.SMITHING, 2000); + stage = 1; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 82127843 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DraulLeptoc.java b/Server/src/main/java/Server/core/game/content/dialogue/DraulLeptoc.java new file mode 100644 index 000000000..9cb1c352f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DraulLeptoc.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin for the draul leptoc npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DraulLeptoc extends DialoguePlugin { + + /** + * Constructs a new {@code DraulLeptoc} {@code Object}. + */ + public DraulLeptoc() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DraulLeptoc} {@code Object}. + * @param player the player. + */ + public DraulLeptoc(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DraulLeptoc(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What are you doing in my house..why the", "impertinence...the sheer cheek...how dare you violate my", "personal lodgings...."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I...I was just looking around..."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well get out! Get out....this is my house....and don't go", "near my daughter Juliet...she's grounded in her room", "to keep her away from that good for nothing Romeo."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes....sir...."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3324 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DraynorBankGuard.java b/Server/src/main/java/Server/core/game/content/dialogue/DraynorBankGuard.java new file mode 100644 index 000000000..12ac334f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DraynorBankGuard.java @@ -0,0 +1,333 @@ +package core.game.content.dialogue; + +import core.game.content.activity.ActivityManager; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the draynor bank guard npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DraynorBankGuard extends DialoguePlugin { + + /** + * Represents the coins item needed to re-watch the recording. + */ + private static final Item COINS = new Item(995, 50); + + /** + * Constructs a new {@code DraynorBankGuard} {@code Object}. + */ + public DraynorBankGuard() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DraynorBankGuard} {@code Object}. + * @param player the player. + */ + public DraynorBankGuard(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DraynorBankGuard(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (!player.getSavedData().getGlobalData().isDraynorRecording()) { + interpreter.sendOptions("Select an option", "Can I deposit my stuff here?", "That wall doesn't look very good.", "Sorry, I don't want anything."); + stage = 1; + } else { + interpreter.sendOptions("Select an Option", "Can I see that recording again, please?", "Sorry, I don't want anything."); + stage = 70; + } + break; + case 70: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Can I see that recording again, please?"); + stage = 71; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't want anything."); + stage = 30; + break; + } + break; + case 71: + npc("I'd like you to pay me 50 gp first."); + stage = 72; + break; + case 72: + if (!player.getInventory().containsItem(COINS)) { + player("I'm not carrying that much."); + stage = 73; + return true; + } else { + options("Ok, here's 50 gp.", "Thanks, maybe another day."); + stage = 80; + } + break; + case 73: + if (player.getBank().containsItem(COINS)) { + npc("As a bank employee, I suppose I could take the money", "directly from your bank account."); + stage = 74; + } else { + npc("Come back when you do."); + stage = 75; + } + break; + case 74: + options("Ok, you can take 50 gp from my bank account.", "Thanks, maybe another day."); + stage = 76; + break; + case 75: + end(); + break; + case 76: + switch (buttonId) { + case 1: + player("Ok, you can take 50 gp from my bank account."); + stage = 79; + break; + case 2: + player("Thanks, maybe another day."); + stage = 77; + break; + } + break; + case 77: + npc("Ok."); + stage = 78; + break; + case 78: + end(); + break; + case 79: + end(); + if (player.getBank().containsItem(COINS) && player.getBank().remove(COINS)) { + startRecording(player); + } + break; + case 80: + switch (buttonId) { + case 1: + player("Ok, here's 50 gp."); + stage = 81; + break; + case 2: + player("Thanks, maybe another day."); + stage = 77; + break; + } + break; + case 81: + end(); + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (player.getInventory().remove(COINS)) { + startRecording(player); + } + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello. Can I deposit my stuff here?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That wall doesn't look very good."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't want anything."); + stage = 30; + break; + } + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ok."); + stage = 31; + break; + case 31: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, it doesn't."); + stage = 21; + break; + case 21: + options("Are you going to tell me what happened?", "Alright, I'll stop bothering you now."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + player("Are you going to tell me what happended?"); + stage = 25; + break; + case 2: + player("Alright, I'll stop bothering you now."); + stage = 23; + break; + } + break; + case 23: + npc("Good day, sir."); + stage = 24; + break; + case 24: + end(); + break; + case 25: + npc("I could do."); + stage = 26; + break; + case 26: + player("Ok, go on!"); + stage = 27; + break; + case 27: + npc("Someone smashed the wall when", "they were robbing the bank."); + stage = 28; + break; + case 28: + player("Someone's robbed the bank?"); + stage = 29; + break; + case 29: + npc("Yes."); + stage = 50; + break; + case 50: + player("But... was anyone hurt?", "Did they get anything valuable?"); + stage = 51; + break; + case 51: + npc("Yes, but we were able to get more staff and mend the", "wall easily enough."); + stage = 52; + break; + case 52: + npc("The Bank has already replaces all the stolen items that", "belonged to customers."); + stage = 53; + break; + case 53: + player("Oh, good... but the bank staff got hurt?"); + stage = 54; + break; + case 54: + npc("Yes but the new ones are just as good."); + stage = 55; + break; + case 55: + player("You're not very nice, are you?"); + stage = 56; + break; + case 56: + npc("No-one's expecting me to be nice."); + stage = 57; + break; + case 57: + player("Anyway... So, someone's robbed the bank?"); + stage = 58; + break; + case 58: + npc("Yes."); + stage = 59; + break; + case 59: + player("Do you know who did it?"); + stage = 60; + break; + case 60: + npc("We are fairly sure we know who the robber was. The", "security recording was damaged in the attack, but it still", "shows his face clearly enough."); + stage = 61; + break; + case 61: + player("You've got a security recording?"); + stage = 62; + break; + case 62: + npc("Yes. Our insurers insisted that we", "install a magical scrying orb."); + stage = 63; + break; + case 63: + player("Can I see the recording?"); + stage = 64; + break; + case 64: + npc("I suppose so. But it's quite long."); + stage = 65; + break; + case 65: + options("That's ok, show me the recording.", "Thanks, maybe another day."); + stage = 66; + break; + case 66: + switch (buttonId) { + case 1: + player("That's ok, show me the recording."); + stage = 68; + break; + case 2: + player("Thanks, maybe another day."); + stage = 67; + break; + } + break; + case 67: + end(); + break; + case 68: + npc("Alright... The bank's magical playback device will feed the", "recorded images into your mind. Just shut your eyes."); + stage = 69; + break; + case 69: + startRecording(player); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No. I'm a security guard, not a bank clerk."); + stage = 11; + break; + case 11: + end(); + break; + } + return true; + } + + /** + * Method used to start the recording. + * @param player the player. + */ + private void startRecording(Player player) { + end(); + ActivityManager.start(player, "dbr cutscene", false); + } + + @Override + public int[] getIds() { + return new int[] { 2574 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DrezelDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DrezelDialogue.java new file mode 100644 index 000000000..65adacc77 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DrezelDialogue.java @@ -0,0 +1,386 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.NPCDefinition; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the drezel npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DrezelDialogue extends DialoguePlugin { + + /** + * Represents the array of items related to drezel. + */ + private static final Item[] ITEMS = new Item[] { new Item(2953), new Item(2954) }; + + /** + * Constructs a new {@code DrezelDialogue} {@code Object}. + */ + public DrezelDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DrezelDialogue} {@code Object}. + * @param player the player. + */ + public DrezelDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DrezelDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc.setName("Drezel"); + NPCDefinition.forId(getIds()[0]).setName("Drezel"); + Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + if (quest.getStage(player) == 13) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + } else if (quest.getStage(player) == 14) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How does it adventurer? Any luck in finding the key to", "the cell or a way of stopping the vampire yet?"); + stage = 600; + } else if (quest.getStage(player) == 15) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "The key fitted the lock! You're free to leave now!"); + stage = 701; + } else if (quest.getStage(player) == 16) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I poured the blessed water over the vampires coffin. I", "think that should trap him in there long enough for you", "to escape."); + stage = 800; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh! You do not appear to be on of those Zamorkians", "who imprisoned me here! Who are you and why are", "you here?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "My name's " + player.getUsername() + ". King Roald sent me to find out", "what was going on at the temple. I take it you are", "Drezel?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That is right! Oh, praise be to Saradomin! All is not yet", "lost! I feared that when those Zamorakians attacked this", "place and imprisoned"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "me up here, Misthalin would be doomed! If they should", "manage to desecrate the holy river Salve we would be", "defenceless against Morytania!"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How is a river a good defence then?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, it is a long tale, and I am not sure we have time!"); + stage = 6; + break; + case 6: + interpreter.sendOptions("Select an Option", "Tell me anyway.", "You're right, we don't."); + stage = 7; + break; + case 7: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me anyway."); + stage = 8; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You're right, we don't."); + stage = 500; + break; + } + break; + case 8: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "d, Saradomin has granted you wisdom I see. Well, the", "story of the river Salve and of how it protects Mithsalin", "is the story of this temple,"); + stage = 9; + break; + case 9: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "and of the seven warrior priests who died here long ago,", "from whom I am descended. Once long ago Misthalin", "did not have the borders that"); + stage = 10; + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "it currently does. This entire area, as far West as", "Varrock itself was under the control of an evil god.", "There was frequent skirmishing"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "along the borders, as the brave heroes of Varrock", "fought to keep the evil creatures that now are trapped", "on the eastern side of the River Salve from over", "running"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "the human encampments, who worshipped Saradomin.", "Then one day, Saradomin himself appeared to one of", "our mighty heroes, whose name has been forgotten by", "history,"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "and told him that should we be able to take the pass that", "this temple now stands in, Saradomin would use his", "power to bless this river, and make it"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "impassable to all creatures with evil in their hearts. This", "unknown hero grouped together all of the mightiest", "fighters whose hearts were pure"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "that he could find, and the seven of them rode here to", "make a final stand. The enemies swarmed across the", "Salve but they did not yield"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "For then days and nights they fought, never sleeping,", "never eating, fuelled by their desire to make the world a", "better place for humans to live."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "On the eleventh day they were to be joined by", "reinforcements from a neighbouring encampment, but", "then those reinforecements arrived all they found"); + stage = 18; + break; + case 18: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "were the bodies of these seven brave but unknown", "heroes, surrounded by the piles of the dead creatures of", "evil that had tried to defeat them."); + stage = 19; + break; + case 19: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The men were saddend at the loss of such pure and", "mighty warriors, yet their sacrifice had not been in", "vain; for the water of the Salve"); + stage = 20; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "had indeed been filled with the power of Saradomin, and", "the evil creatures of Morytania were trapped beyond", "the river banks forever, by their own evil."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "In memory of this brave sacrifice my ancestors built", "this temple so that the land would always be free of the", "evil creatures"); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "who wish to destroy it, and laid the bodies of those brave", "warriors in tombs of honour below this temple with", "golden gifts on the tombs as marks of respect."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "They also built a statue on the river mouth so that all", "who mighty try and cross into Misthalin from Morytania", "would know that these lands are protected"); + stage = 24; + break; + case 24: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "by the glory of Saradomin and that good will always", "defeat evil, no matter how the odds are stacked against", "them."); + stage = 25; + break; + case 25: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, I can see how the river protects the border, but I", "can't see how anything could affect that from this", "temple."); + stage = 26; + break; + case 26: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, as much as it saddens me to say so adventurer,", "Lord Saradomin's presence has not been felt on the", "land for many years now, and even"); + stage = 27; + break; + case 27: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "though all true Saradominists know that he watches over", "us, his power upon the land is not as strong as it once", "was."); + stage = 28; + break; + case 28: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I fear that should those Zamorakians somehow pollute", "the Salve and desecrate his blessing, his power might not", "be able to stop."); + stage = 29; + break; + case 29: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "the army of evil that lurks to the east, longing for the", "opportunity to invade and destroy us all!"); + stage = 30; + break; + case 31: + interpreter.sendOptions("Select an Option", "Yes.", "No."); + stage = 503; + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So what do you say adventurer? Will you aid me and", "all of Misthalin in foiling this Zamorakian plot?"); + stage = 31; + break; + case 500: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, let's just say if we cannot undo whatever damage", "has been done here the entire land is in grave peril!"); + stage = 501; + break; + case 501: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So what do you say adventurer? Will you aid me and", "all of Misthalin in foiling this Zamorakian plot?"); + stage = 502; + break; + case 502: + interpreter.sendOptions("Select an Option", "Yes.", "No."); + stage = 503; + break; + case 503: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, ofcourse. Any threat to Misthalin must be", "neutralised immediately. So what can I do to help?"); + stage = 506; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "HA! NO! You can rot in there for all I care you", "stupid priest! All hail mighty Zamorak! Death to puny", "Misthalin!"); + stage = 504; + break; + } + break; + case 504: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oooooh... I knew it was too good to be true... then", "leave me to my fate villain, there's no need to taunt me", "as well as keeping me imprisoned."); + stage = 505; + break; + case 505: + end(); + break; + case 506: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, the immediate problem is that I am trapped in this", "cell. I know that they key to free me is nearby, for none", "of the Zamorakians"); + stage = 507; + break; + case 507: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "who imprisoned me here were ever gone for long", "periods of time, Should you find the key however, as", "you may have noticed,"); + stage = 508; + break; + case 508: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "there is a vampire in that coffin over there. I do not", "know how they managed to find it, but it is one of the", "ones that somehow"); + stage = 509; + break; + case 509: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "survived the battle here all those years ago, and is by", "now quite, quite, mad. It has been trapped on this side", "of the river for centuries,"); + stage = 510; + break; + case 510: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "and as those fiendish Zamorakians pointed out to me", "with delight, as a descendant of one of those who", "trapped it here, it will recognise"); + stage = 511; + break; + case 511: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "the smell of my blood should I come anywhere near it.", "It will of course then wake up and kill me, very", "probably slowly and painfully."); + stage = 512; + break; + case 512: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Maybe I could kill it somehow then while it is asleep?"); + stage = 513; + break; + case 513: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No adventurer, I do not think it would be wise for you", "to wake it at all. As I say, it is little more than a wild", "animal, and must"); + stage = 514; + break; + case 514: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "be extremely powerful to have survived until today. I", "suspect your best chance would be to incapacitate it", "somehow."); + stage = 515; + break; + case 515: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, find the key to your cell, and do something about", "the vampire."); + stage = 516; + break; + case 516: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you have done both of those I will be able to", "inspect the damage which those Zamorakians have done", "to the purity of the Salve"); + stage = 517; + break; + case 517: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Depending on the severity of the damage, I may", "require further assistance from you in restoring its", "purity."); + stage = 518; + break; + case 518: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, well first thing's first; let's get you out of here."); + stage = 519; + break; + case 519: + quest.setStage(player, 14); + end(); + break; + case 600: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, not yet..."); + stage = 601; + break; + case 601: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well don't give up adventurer! That key MUST be", "around here somewhere! I know none of those", "Zamorakians ever got very far from this building!"); + stage = 602; + break; + case 602: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How do you know that?"); + stage = 603; + break; + case 603: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I could hear them laughing about some gullible fool that", "they tricked into killing the guard dog at the", "monument."); + stage = 604; + break; + case 604: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh."); + stage = 605; + break; + case 605: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Honestly, what kind of idiot would go around killing", "things just because a stranger told them to? What kind", "of oafish, numb-skulled, dim-witted,"); + stage = 606; + break; + case 606: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, OKAY, I get the picture!"); + stage = 607; + break; + case 607: + end(); + break; + case 701: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well excellent work adventurer! Unfortunately, as you", "know, I cannot risk waking that vampire in the coffin."); + stage = 702; + break; + case 702: + if (player.getInventory().contains(2953, 1)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I have some water from the Salve. It seems to have", "been desecrated though. Do you think you could bless", "it for me?"); + stage = 703; + } else { + + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you have any idea about dealing with vampire?"); + stage = 730; + } + break; + case 703: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, good thinking adventurer! Give it to me, I will bless", "it!"); + stage = 704; + break; + case 704: + if (!player.getInventory().containsItem(ITEMS[0])) { + end(); + return true; + } + if (player.getInventory().remove(ITEMS[0])) { + player.getInventory().add(ITEMS[1]); + } + end(); + player.getPacketDispatch().sendMessage("The priest blesses the water for you."); + break; + case 730: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "well, the water of the salve should still have enough", "power to work against the vampie despite what those", "Zamorakians might have done to it..."); + stage = 731; + break; + case 731: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Maybe you should try and get hold of some from", "somewhere?"); + stage = 732; + break; + case 732: + end(); + break; + case 800: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Excellent work adventurer! I am free at last! Let me", "ensure that evil vampire is trapped for good. I will", "meet you down by the monument."); + stage = 801; + break; + case 801: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Look for me down there, I need to assess what damage", "has been done to our holy barrier by those evil", "Zamorakians!"); + stage = 802; + break; + case 802: + Quest quests = player.getQuestRepository().getQuest("Priest in Peril"); + quests.setStage(player, 17); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1047 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DrezelMonumentDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DrezelMonumentDialogue.java new file mode 100644 index 000000000..1af228462 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DrezelMonumentDialogue.java @@ -0,0 +1,244 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the drezel monument. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DrezelMonumentDialogue extends DialoguePlugin { + + /** + * Represents the items related to the drezel monument. + */ + private static final Item[] ITEMS = new Item[] { new Item(1436), new Item(7936) }; + + /** + * Constructs a new {@code DrezelMonumentDialogue} {@code Object}. + */ + public DrezelMonumentDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DrezelMonumentDialogue} {@code Object}. + * @param player the player. + */ + public DrezelMonumentDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DrezelMonumentDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + final Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + if (quest.getStage(player) == 17) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, " + player.getUsername() + ". I see you finally made it down here.", "Things are worse than I feared. I'm not sure if I will", "be able to repair the damage."); + stage = 900; + return true; + } + if (quest.getStage(player) == 18) { + if (player.getInventory().contains(1436, 1) || player.getInventory().contains(7936, 1)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I brought you some Rune Essence."); + stage = 100; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How many more essence do I need to bring you?"); + stage = 120; + } + return true; + } + if (quest.getStage(player) == 100 && !player.getSavedData().getQuestData().isTalkedDrezel()) { // guy. + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So can I pass through that barrier now?"); + stage = 400; + return true; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings again adventurer, How go your travels in", "Morytania? Is it as evil as I have heard?"); + stage = 420; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + switch (stage) { + case 400: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, " + player.getUsername() + ". For all the assistance you have given", "both myself and Misthalin in your actions, I cannot let", "you pass without warning you."); + stage = 401; + break; + case 401: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Morytania is an evil land, filled with creatures and", "monsters more terrifying than any you have yet", "encountered. Although I will pray for you"); + stage = 402; + break; + case 402: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "you should take some basic precautions before heading", "over the Salve into it. The first place you will come", "across is the Werewolf trading post."); + stage = 403; + break; + case 403: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "In many ways Werewolves are like you and me, except", "never forget that they are evil vicious beasts at heart.", "The dagger I have given you is named 'Wolfbane'"); + stage = 404; + break; + case 404: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "and it is a holy relic that pevents the werewolf people from", "chaning form, I suggest if you battle with them", "that you keep it always equipped, for their"); + stage = 405; + break; + case 405: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "wolf form is incredibly powerful, and would savage you", "very quickly. Please adventurer, promise me this: I", "should hate for you to die foolishly."); + stage = 406; + break; + case 406: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, I will keep it equipped whenever I fight", "werwolves."); + stage = 407; + break; + case 407: + player.getSavedData().getQuestData().setTalkedDrezel(true); + end(); + break; + case 420: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, I'm going to look around a bit more."); + stage = 421; + break; + case 421: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, that sounds like a good idea. Don't get into any", "trouble though!"); + stage = 422; + break; + case 422: + end(); + break; + case 120: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I need " + player.getGameAttributes().getAttribute("priest-in-peril:rune", 50) + " more."); + stage = 121; + break; + case 121: + end(); + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Quickly, give it to me!"); + stage = 101; + break; + case 101: + int amt = player.getInventory().contains(1436, 1) ? player.getInventory().getAmount(ITEMS[0]) : player.getInventory().getAmount(ITEMS[1]); + player.getInventory().remove(player.getInventory().contains(1436, 1) ? new Item(1436, amt) : new Item(7936, amt)); + int runes = player.getGameAttributes().getAttribute("priest-in-peril:rune", 50); + if (runes > amt) { + amt = runes - amt; + } + if (amt > runes) { + amt = 0; + } + if (amt == runes) { + amt = amt - runes; + } + if (amt < 0) { + amt = 0; + } + player.getGameAttributes().setAttribute("/save:priest-in-peril:rune", amt); + if (player.getGameAttributes().getAttribute("priest-in-peril:rune", 50) <= 0) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Excellent! That should do it! I will bless these stones", "and place them within the well, and Misthalin should be", "protected once more!"); + stage = 152; + } else { + end(); + } + break; + case 152: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Please take this dagger; it has been handed down within", "my family for generations and is filled with the power of", "Saradomin. You will find that"); + stage = 153; + break; + case 153: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "it has the power to prevent werewolves from adopting", "their wolf form in combat as long as you have it", "equipped."); + stage = 154; + break; + case 154: + quest.finish(player); + end(); + break; + case 900: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why, what happened?"); + stage = 901; + break; + case 901: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "From what I can tell, after you killed the guard dog", "who protected the entrance to the mouments, those", "Zamorakians forced the door into the main chamber"); + stage = 902; + break; + case 902: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "and have used some kind of evil potion upon the well", "which leads to the source of the river Salve. As they", "have done this at the very mouth of the river"); + stage = 903; + break; + case 903: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "it will spread along the entire river, disrupting the", "blessing placed upon it and allowing the evil creatures of", "Morytania to invade at their leisure."); + stage = 904; + break; + case 904: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What can we do to prevent that?"); + stage = 905; + break; + case 905: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, as you can see, I have placed a holy barrier on", "the entrance to this room from the South, but it is not", "very powerful and required me to remain"); + stage = 906; + break; + case 906: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "here focussing upon it to keep it intact. Should an", "attack come, they would be able to breach this defence", "very quickly indeed. What we need to do is"); + stage = 907; + break; + case 907: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "find some kind of way of removing or counteracting the", "evil magic that has been put into the river source at the", "well, so that the river will flow pure once again."); + stage = 908; + break; + case 908: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Couldn't you bless the river to purify it? Like you did", "with the water I took from the well?"); + stage = 909; + break; + case 909: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, that would not work, the power I have from", "Saradomin is not great enough to cleanse an entire", "river of this foul Zamorakian pollutant."); + stage = 910; + break; + case 910: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I have only one idea how we could possibly cleanse the", "river."); + stage = 911; + break; + case 911: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's that?"); + stage = 912; + break; + case 912: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I have heard rumours recently that Mages have found", "some secret ore that absorbs magic into it and allows", "them to create runes."); + stage = 913; + break; + case 913: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Should you be able to collect enough of this ore, it is", "possible it will soak up the evil potion that has been", "poured into the river, and purify it."); + stage = 914; + break; + case 914: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Kind of like a filter? Okay, I guess it's worth a try.", "How many should I get?"); + stage = 915; + break; + case 915: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, I have no knowledge of these ores other than", "speculation and gossip, but if the things I hear are true", "around fifty should be sufficient for the task."); + stage = 916; + break; + case 916: + quest.setStage(player, 18); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1049 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DrokarDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DrokarDialogue.java new file mode 100644 index 000000000..19349d3ea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DrokarDialogue.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for drokar. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DrokarDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DrokarDialogue} {@code Object}. + */ + public DrokarDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DrokarDialogue} {@code Object}. + * @param player the player. + */ + public DrokarDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DrokarDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, how are you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Packages, packages and more!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ugh.. Okay, have a good day."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7729 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DumpContainer.java b/Server/src/main/java/Server/core/game/content/dialogue/DumpContainer.java new file mode 100644 index 000000000..0d5057366 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DumpContainer.java @@ -0,0 +1,118 @@ +package core.game.content.dialogue; + +import core.game.container.Container; +import core.game.container.impl.BankContainer; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; +import core.plugin.Plugin; + +import java.util.Arrays; +import java.util.Objects; + +/** + * Represents the dialogue plugin used to handle the deposit all/deposit inventory/etc button + * @author Splinter + */ +@Initializable +public final class DumpContainer extends DialoguePlugin { + + /** + * Constructs a new {@code DumpContainer} {@code Object}. + */ + public DumpContainer() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DumpBOBDialogue} {@code Object}. + * @param player the player. + */ + public DumpContainer(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DumpContainer(player); + } + + @Override + public boolean open(Object... args) { + options("Deposit Inventory", "Deposit Equipment", "Deposit Beast of Burden", "Cancel"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (stage == 0) { + switch (buttonId) { + case 1: + if (player.getInventory().isEmpty()) { + player.getPacketDispatch().sendMessage("You have nothing to deposit."); + return true; + } else { + dump(player.getInventory()); + } + end(); + break; + case 2: + if (player.getEquipment().isEmpty()) { + player.getPacketDispatch().sendMessage("You have nothing to deposit."); + return true; + } else { + dump(player.getEquipment()); + } + end(); + break; + case 3: + player.getFamiliarManager().dumpBob(); + end(); + break; + case 4: + end(); + break; + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 628371 }; + } + + /** + * Dumps a container. + * @param inventory the player's inventory. + * @author ceik + */ + public void dump(Container inventory) { + BankContainer bank = player.getBank(); + Arrays.stream(inventory.toArray()).filter(Objects::nonNull).forEach(item -> { + if(!bank.hasSpaceFor(item)){ + player.getPacketDispatch().sendMessage("You have no more space in your bank."); + return; + } + if(!bank.canAdd(item)){ + player.getPacketDispatch().sendMessage("A magical force prevents you from banking your " + item.getName() + "."); + } else { + if(inventory instanceof EquipmentContainer){ + Object pluginobj = item.getDefinition().getHandlers().get("equipment"); + if(pluginobj != null && pluginobj instanceof Plugin){ + Plugin plugin = (Plugin) pluginobj; + plugin.fireEvent("unequip",player,item); + } + } + inventory.remove(item); + bank.add(item.getDefinition().isUnnoted() ? item : new Item(item.getNoteChange(), item.getAmount())); + } + }); + inventory.update(); + bank.update(); + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DunstanDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DunstanDialogue.java new file mode 100644 index 000000000..552ac6c6e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DunstanDialogue.java @@ -0,0 +1,98 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represnts the dialogue plugin used for dunstan. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DunstanDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DunstanDialogue} {@code Object}. + */ + public DunstanDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DunstanDialogue} {@code Object}. + * @param player the player. + */ + public DunstanDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DunstanDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi! Did you want something?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Is it OK if I use your anvil?", "Nothing, thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Is it OK if I use your anvil?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nothing, thanks."); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So you're a smithy are you?"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I dabble."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A fellow smith is welcome to use my anvil!"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks!"); + stage = 14; + break; + case 14: + end(); + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1082 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/DwarfShopDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/DwarfShopDialogue.java new file mode 100644 index 000000000..96c24987c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/DwarfShopDialogue.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialouge plugin used for the dward shop. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DwarfShopDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DwarfShopDialogue} {@code Object}. + */ + public DwarfShopDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DwarfShopDialogue} {@code Object}. + * @param player the player. + */ + public DwarfShopDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DwarfShopDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can I help you at all?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes please, what are you selling?", "No thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 582 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EadburgDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/EadburgDialogue.java new file mode 100644 index 000000000..67954f3f2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EadburgDialogue.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the eadburg npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EadburgDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code EadburgDialogue} {@code Object}. + */ + public EadburgDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EadburgDialogue} {@code Object}. + * @param player the player. + */ + public EadburgDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EadburgDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's cooking, good looking?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The stew for the servant's main meal."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Um...er...see you later."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Bye!"); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1072 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EblisDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/EblisDialogue.java new file mode 100644 index 000000000..3e630a03e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EblisDialogue.java @@ -0,0 +1,106 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; +import core.tools.Items; + +/** + * Handles Eblis's dialogue. + * @author ceik + * @version 1.0 + */ +@Initializable +public class EblisDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code EblisDialogue} {@code Object}. + */ + public EblisDialogue() { + /** + * Empty + */ + } + + /** + * Constructs a new {@code EblisDialogue} {@code Object}. + * @param player The player to construct the class for. + */ + public EblisDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EblisDialogue(player); + } + + @Override + public boolean open(Object... args) { + //TODO: Add proper dialogue once DT is implemented + NPC npc = (NPC) args[0]; + if(!player.getAttribute("DT:staff-bought",false)) { + player("Hey."); + stage = 0; + } else { + player("Say, what's up with your dialogue?"); + stage = 20; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + //TODO: Add proper dialogue once DT is implemented + switch(stage){ + case 0: + npc("Hey, you wanna buy this funny stick thing?"); + stage = 1; + break; + case 1: + options("Yes please.","No thanks."); + stage = 2; + break; + case 2: + switch(buttonId){ + case 1: + npc("Alright, that'll be 80,000 golden shekels."); + stage = 10; + break; + case 2: + player("Nah, I'm good, homie."); + stage = 30; + break; + } + break; + case 10: + player("Hmm.... ok."); + stage = 11; + break; + case 11: + if(!player.getInventory().contains(Items.COINS_995,80000)){ + npc("Oi vey... you dont have enough.."); + } else { + player.getInventory().remove(new Item(Items.COINS_995,80000)); + player.getInventory().add(new Item(Items.ANCIENT_STAFF_4675)); + } + stage = 30; + break; + case 20: + npc("Well I don't have me bloody quest yet, mate","so I needed SOMETHING to say,","oi vey."); + stage = 30; + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1923 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EdgevilleMonkDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/EdgevilleMonkDialogue.java new file mode 100644 index 000000000..3e6cf3538 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EdgevilleMonkDialogue.java @@ -0,0 +1,120 @@ +package core.game.content.dialogue; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Reprents the dialogue plugin used for the edgevill monk. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EdgevilleMonkDialogue extends DialoguePlugin { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(710); + + /** + * Represents the graphics to use. + */ + private static final Graphics GRAPHIC = new Graphics(84); + + /** + * Constructs a new {@code EdgevilleMonkDialogue} {@code Object}. + */ + public EdgevilleMonkDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EdgevilleMonkDialogue} {@code Object}. + * @param player the player. + */ + public EdgevilleMonkDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EdgevilleMonkDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length >= 1) { + if (args[0] instanceof NPC) { + npc = (NPC) args[0]; + } else { + interpreter.sendDialogues(7727, null, "Only members of our order can go up there. You'll", "need to talk to Abbot Langley if you want to explore", "the monastery further."); + stage = 21; + return true; + } + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings traveller."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Can you heal me? I'm injured.", "Isn't this place built a bit out of the way?", "How do I get further into the monastery?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you heal me? I'm injured."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Isn't this place built a bit out of the way?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How do i get farther into the monastery?"); + stage = 30; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ok."); + stage = 11; + break; + case 11: + end(); + npc.animate(ANIMATION); + npc.graphics(GRAPHIC); + player.getPacketDispatch().sendMessage("You feel a little better."); + player.getSkills().heal(((int) (player.getSkills().getStaticLevel(Skills.HITPOINTS) * 0.20))); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "We like it that way actually! We get disturbed less. We still", "get rather a large amount of travellers looking for", "sanctuary and healing here as it is!"); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You'll need to talk to Abbot Langley about that. He's", "usually to be found walking the halls of the monastery."); + stage = 21; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7727 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EdgevilleShopKeeperDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/EdgevilleShopKeeperDialogue.java new file mode 100644 index 000000000..613ba47e0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EdgevilleShopKeeperDialogue.java @@ -0,0 +1,78 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the edgeville shop keeper dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EdgevilleShopKeeperDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code EdgevilleShopKeeperDialogue} {@code Object}. + */ + public EdgevilleShopKeeperDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EdgevilleShopKeeperDialogue} {@code Object}. + * @param player the player. + */ + public EdgevilleShopKeeperDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EdgevilleShopKeeperDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can I help you at all?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please. What are you selling?", "How should I use your shop?", "No, thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm glas you ask! You can buy as many of the items", "stocked as you wish. You can also sell most items to the", "shop."); + stage = 20; + break; + case 3: + end(); + break; + } + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 528, 529 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EllamariaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/EllamariaDialogue.java new file mode 100644 index 000000000..d6a47fd94 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EllamariaDialogue.java @@ -0,0 +1,83 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the ellamaria dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EllamariaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code EllamariaDialogue} {@code Object}. + */ + public EllamariaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EllamariaDialogue} {@code Object}. + * @param player the player. + */ + public EllamariaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EllamariaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's going on here? I see a lot of farming patches", "with nothing growing in them."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, one has just had them installed. One has had the", "most marvellous idea to bring renewed happiness to", "one's own deatest husband."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "One? I'm not sure I understand you-"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh dear - the common classes, oh how they fill one with", "intolerable levels of exasperation, I swear to the most", "true."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ri-ight ... if you say so, my lady. I'll be off then, if you", "don't mind."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, be off with you, before I call the guards."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No problem, sorry to have bothered you."); + stage = 6; + break; + case 6:// TODO: ques.t + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2581 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EllyTheCamelDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/EllyTheCamelDialogue.java new file mode 100644 index 000000000..c5f381b3b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EllyTheCamelDialogue.java @@ -0,0 +1,74 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the elly the camel dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EllyTheCamelDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code EllyTheCamelDialogue} {@code Object}. + */ + public EllyTheCamelDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EllyTheCamelDialogue} {@code Object}. + * @param player the player. + */ + public EllyTheCamelDialogue(Player player) { + super(player); + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + player.getPacketDispatch().sendMessage("The camel tries to stomp on your foot, but you pull it back quickly."); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EllyTheCamelDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int rand = RandomFunction.random(1, 3); + switch (rand) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "If I go near that camel, it'll probably", "bite my hand off."); + stage = 0; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I wonder if that camel has fleas..."); + stage = 0; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I wonder if that camel has fleas..."); + stage = 0; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2810, 2812 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ElsieDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/ElsieDialogue.kt new file mode 100644 index 000000000..8d6e7a15f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ElsieDialogue.kt @@ -0,0 +1,97 @@ +package core.game.content.dialogue + +import core.tools.Items +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.Item +import core.plugin.Initializable + +/** + * Elsie + * @author afaroutdude + */ +@Initializable +class ElsieDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun open(vararg args: Any?): Boolean { + when (player.inventory.containsAtLeastOneItem(Items.CUP_OF_TEA_712)) { + true -> npc("Ooh - that looks like a lovely cup of tea, dearie. Is it for", "me?").also { stage = 100 } + false -> npc("Hello dearie! What can old Elsie do for you?").also { stage = 10 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 999 -> end() + + 10 -> interpreter.sendOptions("What would you like to say?", "What are you making?", "Can you tell me a story?", "Can you tell me how to get rich?").also { stage++ } + 11 -> + when (buttonId) { + 1 -> player("What are you making?").also { stage = 20 } + 2 -> player("Can you tell me a story?").also { stage = 30 } + 3 -> player("Can you tell me how to get rich?").also { stage = 40 } + } + 20 -> player("What are you making?").also { stage++ } + 21 -> npc("I'm knitting a new stole for Father Lawrence", "downstairs. He could do with something to keep his", "neck warm, standing in that draughty old church", "all day.").also { stage++ } + 22 -> interpreter.sendOptions("What would you like to say?", "Can you tell me a story?", "Can you tell me how to get rich?").also { stage++ } + 23 -> + when (buttonId) { + 1 -> player("Can you tell me a story?").also { stage = 30 } + 2 -> player("Can you tell me how to get rich?").also { stage = 40 } + } + 30 -> player("Can you tell me a story?").also { stage++ } + 31 -> npc("Maybe I could tell you a story if you'd fetch me", "a nice cup of tea.").also { stage++ } + 32 -> player("I'll think about it.").also { stage == 999 } + 40 -> player("Can you tell me how to get rich??").also { stage++ } + 41 -> npc("Well, dearie, I'm probably not the best person to ask about money, but I think the best thing would be for you to get a good trade. If you've got a trade you can earn your way, that's what my old father told me,").also { stage++ } + 42 -> npc("Saradomin rest his soul. I hear people try to get rich by fighting in the Wilderness north of here or the Duel Arena in the south, but that's no way for honest folks to earn a living! So get yourself a good trade, and keep").also { stage++ } + 43 -> npc("working at it. There's always folks wanting to buy ore and food around here.").also { stage++ } + 44 -> player("Thanks, old woman.").also { stage++ } + 45 -> interpreter.sendOptions("What would you like to say?", "What are you making?", "Can you tell me a story?").also { stage++ } + 46 -> + when (buttonId) { + 1 -> player("What are you making?").also { stage = 20 } + 2 -> player("Can you tell me a story?").also { stage = 30 } + } + + 100 -> interpreter.sendOptions("What would you like to say?", "Yes, you can have it.", "No, keep your hands off my tea.").also { stage++ } + 101 -> + when (buttonId) { + 1 -> player("Yes, you can have it.").also { stage++ } + 2 -> player("No, keep your hands off my tea.").also { stage = 120 } + } + 102 -> player("Yes, you can have it.").also { stage++ } + 103 -> npc("Ahh, there's nothing like a nice cuppa tea. I know what,", "I'll tell you a story to thank you for the lovely tea...").also { + player.inventory.remove(Item(Items.CUP_OF_TEA_712)) + player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 0, 14) + stage++ + } + 104 -> npc("A long time ago, when I was a little girl, there was a", "handsome young man living in Varrock. I saw him here", "in the church quite often. Everyone said he was going", "to become a priest, and we girls were so sad about that.").also { stage++ } + 105 -> npc("But young Dissy - that was the young man's nickname", "- he was a wild young thing. One night he gathered", "some lads together, and after the evening prayer-", "meeting they all put on masks and sneaked down to the").also { stage++ } + 106 -> npc("evil temple in the south of the city, the evil one. The", "next day, there was quite a hubbub. The guards told us", "that someone had painted 'Saradomin pwns' on the wall", "of the Zamorakian temple!").also { stage++ } + 107 -> npc("Now, we'd always been taught to keep well away from", "that dreadful place, but it really did us all good to see", "someone wasn't afraid of the scum who live at that end", "of town. Old Father Packett was furious, but Dissy just").also { stage++ } + 108 -> npc("laughed it off.").also { stage++ } + 109 -> npc("Dissy left town after that, saying he wanted to see the", "world. It was such a shame, he had the most handsome", "shoulders...").also { stage++ } + 110 -> npc("A young man came here looking for stories about Dissy", "- of course, that's not his proper name, but his friends", "called him Dissy - and I told him that one. He said", "Dissy had become a really famous man and there was").also { stage++ } + 111 -> npc("going to be a book about him. Well, that's all good, but I", "do wish Dissy had just come back to Varrock. I did", "miss him so much... well, until I met my Freddie and", "we got married, but that's another story.").also { stage++ } + 112 -> player("Thank you. I'll leave you to your knitting now.").also { stage = 999 } + 120 -> npc("Aww. Maybe another time. Anyway, what can old Elsie do for you?").also { stage++ } + 121 -> + when (buttonId) { + 1 -> player("What are you making?").also { stage = 20 } + 2 -> player("Can you tell me a story?").also { stage = 122 } + } + 122 -> npc("Well, maybe I could tell a story if you'd give me that lovely cup of tea you've got there.").also { stage = 100 } + } + return true; + } + + + override fun newInstance(player: Player?): DialoguePlugin { + return ElsieDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(5915) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EmeraldBenedictDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/EmeraldBenedictDialogue.java new file mode 100644 index 000000000..558ec7e5a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EmeraldBenedictDialogue.java @@ -0,0 +1,78 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the emerald benedict dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EmeraldBenedictDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code EmeraldBenedictDialogue} {@code Object}. + */ + public EmeraldBenedictDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EmeraldBenedictDialogue} {@code Object}. + * @param player the player. + */ + public EmeraldBenedictDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EmeraldBenedictDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Got anything you don't want to lose?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes actually, can you help?", "Yes, but can you show me my PIN settings?", "Yes thanks, and I'll keep hold of it too."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + player.getBank().open(); + break; + case 2: + end(); + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes thanks, and I'll keep hold of it too."); + stage = 99; + break; + } + break; + case 99: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2271 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EnchantTiaraDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/EnchantTiaraDialogue.java new file mode 100644 index 000000000..b7d937654 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EnchantTiaraDialogue.java @@ -0,0 +1,100 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.runecrafting.Altar; +import core.game.node.entity.skill.runecrafting.EnchantTiaraPulse; +import core.game.node.entity.skill.runecrafting.Talisman; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.object.GameObject; + +/** + * Represents the enchant tiara dialogue. + * @author Vexia + * @version 1.0 + */ +@Initializable +public final class EnchantTiaraDialogue extends DialoguePlugin { + + /** + * Represents the node usage event. + */ + private NodeUsageEvent event; + + /** + * The altar. + */ + private Altar altar; + + /** + * Constructs a new {@code EnchantTiaraDialogue} {@code Object}. + */ + public EnchantTiaraDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EnchantTiaraDialogue} {@code Object}. + * @param player the player. + */ + public EnchantTiaraDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EnchantTiaraDialogue(player); + } + + @Override + public boolean open(Object... args) { + event = ((NodeUsageEvent) args[0]); + altar = Altar.forObject(((GameObject) event.getUsedWith())); + if (!player.getInventory().containsItem(altar.getTalisman().getTalisman())) { + player.getPacketDispatch().sendMessage("You don't have the required talisman."); + return true; + } + player.getInterfaceManager().openChatbox(309); + player.getPacketDispatch().sendString("



" + altar.getTiara().getTiara().getName(), 309, 6); + player.getPacketDispatch().sendItemZoomOnInterface(altar.getTiara().getTiara().getId(), 175, 309, 2); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + int amt = 0; + switch (buttonId) { + case 6: + amt = 1; + break; + case 5: + amt = 5; + break; + case 4: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + player.getPulseManager().run(new EnchantTiaraPulse(player, event.getUsedItem(), (Talisman.forItem(event.getUsedItem()).getTiara()), ammount)); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount"); + return true; + case 3: + amt = player.getInventory().getAmount(event.getUsedItem()); + break; + } + player.getPulseManager().run(new EnchantTiaraPulse(player, event.getUsedItem(), altar.getTiara(), amt)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8432482 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EntranaChurchMonk.java b/Server/src/main/java/Server/core/game/content/dialogue/EntranaChurchMonk.java new file mode 100644 index 000000000..99906b51e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EntranaChurchMonk.java @@ -0,0 +1,59 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the entrana church monk. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EntranaChurchMonk extends DialoguePlugin { + + /** + * Constructs a new {@code EntranaChurchMonk} {@code Object}. + */ + public EntranaChurchMonk() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EntranaChurchMonk} {@code Object}. + * @param player the player. + */ + public EntranaChurchMonk(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EntranaChurchMonk(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings traveller."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 222 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ErnestDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ErnestDialogue.java new file mode 100644 index 000000000..459875009 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ErnestDialogue.java @@ -0,0 +1,86 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue which handles the interaction with ernest. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ErnestDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ErnestDialogue} {@code Object}. + */ + public ErnestDialogue() { + /** + * empty + */ + } + + /** + * Constructs a new {@code ErnestDialogue} {@code Object}. + * @param player the player. + */ + public ErnestDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ErnestDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Thank you sir. It was dreadfully irritating being a", "chicken. How can I ever thank you?"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well a cash reward is always nice..."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Of course, of course."); + stage = 3; + break; + case 3: + npc.clear(); + end();// this will trigger close event. + break; + } + return true; + } + + @Override + public boolean close() { + finish(); + return super.close(); + } + + /** + * Method used to finish the quest. + */ + public void finish() { + if (player.getQuestRepository().isComplete("Ernest the Chicken")) { + npc.clear(); + return; + } + npc.clear(); + player.getQuestRepository().getQuest("Ernest the Chicken").finish(player); + } + + @Override + public int[] getIds() { + return new int[] { 287 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/EventLocatorDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/EventLocatorDialoguePlugin.java new file mode 100644 index 000000000..87786d008 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/EventLocatorDialoguePlugin.java @@ -0,0 +1,275 @@ +package core.game.content.dialogue; + +import core.ServerConstants; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * Package -> core.game.content.dialogue + * Created on -> 9/7/2016 @10:33 PM for 530 + * + * @author Ethan Kyle Millard + */ +@Initializable +public class EventLocatorDialoguePlugin extends DialoguePlugin { + + private String eventName; + + private HashMap GOLDEN_ESSENCE = new HashMap<>(), THIEVES_JACKPOT = new HashMap<>(), HARVESTING_DOUBLES = new HashMap<>(), ALCHEMY_HELLENISTIC = new HashMap<>(); + + + private Map> HOURLY_EVENTS = new HashMap<>(); + + + public EventLocatorDialoguePlugin() { + + } + + public EventLocatorDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EventLocatorDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + fill(); + eventName = (String) args[0]; + System.out.println(eventName); + if (eventName == null) { + player.sendMessage("There no events active currently."); + return false; + } + for (Map.Entry> entry : HOURLY_EVENTS.entrySet()) { + for (Map.Entry values : entry.getValue().entrySet()) { + for (int i = 0; i < values.getKey().length; i ++) + System.out.println("Location Index -> " + getIndex(values.getKey(), i) + " for Location -> " + values.getKey()); + switch (eventName) { + case "Alchemy hellenistic": + if (entry.getKey().equalsIgnoreCase(eventName)) { + options(values.getValue()); + stage = 0; + } + break; + case "Harvesting doubles": + if (entry.getKey().equalsIgnoreCase(eventName)) { + options("Mining", "Woodcutting", "Fishing"); + stage = 1; + } + break; + case "Thieves jackpot": + if (entry.getKey().equalsIgnoreCase(eventName)) { + options(values.getValue()); + stage = 5; + } + break; + case "Golden essence": + if (entry.getKey().equalsIgnoreCase(eventName)) { + options(values.getValue()); + stage = 6; + } + break; + } + } + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + for (Map.Entry> entry : HOURLY_EVENTS.entrySet()) { + for (Map.Entry values : entry.getValue().entrySet()) {//Minning + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player.teleport(values.getKey()[2]);//Home + end(); + break; + case 2: + player.teleport(values.getKey()[3]);//Home + end(); + break; + } + break; + case 1: + switch (buttonId) { + case 1: + options(Arrays.copyOfRange(values.getValue(), 4, 5)); + stage = 2; + break; + case 2: + options(Arrays.copyOfRange(values.getValue(), 6, 7)); + stage = 3; + break; + case 3: + options(Arrays.copyOfRange(values.getValue(), 8, 10)); + stage = 4; + break; + } + break; + case 2: + switch (buttonId) { + case 1: + player.teleport(values.getKey()[4]);//Home + end(); + break; + case 2: + player.teleport(values.getKey()[5]);//Home + end(); + break; + } + break; + case 3: + switch (buttonId) { + case 1: + player.teleport(values.getKey()[6]);//Home + end(); + break; + case 2: + player.teleport(values.getKey()[7]);//Home + end(); + break; + } + break; + case 4: + switch (buttonId) { + case 1: + player.teleport(values.getKey()[8]);//Home + end(); + break; + case 2: + if (player.getSkills().getStaticLevel(Skills.FISHING) < 68) { + interpreter.sendDialogue("You must have at least 68 fishing to access this event location."); + stage = -2; + } else { + player.teleport(values.getKey()[9]);//Home + end(); + } + break; + case 3: + player.teleport(values.getKey()[10]);//Home + end(); + break; + } + break; + case 5: + switch (buttonId) { + case 1: + player.teleport(values.getKey()[11]);//Home + end(); + break; + case 2: + player.teleport(values.getKey()[12]);//Home + end(); + break; + } + break; + case 6: + switch (buttonId) { + case 1: + if (player.getQuestRepository().getQuest("Rune Mysteries").isCompleted(player)) { + player.teleport(values.getKey()[0]);//Home + end(); + } else { + interpreter.sendDialogue("You must have completed Rune Mysteries to access this", "event locator."); + stage = -2; + } + break; + case 2: + if (player.getQuestRepository().getQuest("Rune Mysteries").isCompleted(player) && player.getSkills().getLevel(Skills.MAGIC) >= 66) { + player.teleport(values.getKey()[1]);//Home + end(); + } else { + interpreter.sendDialogue("You must have completed Rune Mysteries and have a magic level of 66", " to access this event locator."); + stage = -2; + } + break; + } + break; + case -2: + end(); + break; + } + } + } + return false; + } + + private void fill() { + ALCHEMY_HELLENISTIC.put( + new Location[]{ + ServerConstants.HOME_LOCATION, + new Location(3164, 3485, 0) + }, + new String[]{ + "Home", "Grand Exchange" + }); + HARVESTING_DOUBLES.put( + new Location[]{ + new Location(3228, 3147, 0),//lumby + new Location(3184, 3374, 0),//varrock + new Location(2730, 3485, 0),//seers + new Location(2776, 3437, 0),//catherby yews + new Location(2842, 3440, 0),//catherby fish + new Location(2596, 3414, 0),//fishing guild + new Location(2338, 3701, 0)//pfc + }, + new String[]{ + //Mining Locations + "Lumbridge Swamp Mine (Copper, Tin)", "Varrock Mining Site (Clay, Iron, Tin)",//add rock names + //Woodcutting Locations + "Seers Village Forest (Normal, Oak, Maple, Yew)", "Catherby Yew Forest (Normal, Willow, Yew)",//add tree names + //Fishing Locations + "Catherby Fishing spot (Lobster, Tuna/Swordfish, Shark)", "Fishing Guild (Lobster, Tuna/Swordfish, Shark)", "Piscatoris Fishing Colony (Monkfish)"//Add fish names + }); + GOLDEN_ESSENCE.put( + new Location[] { + new Location(3104, 9571, 0), + new Location(2591, 3086, 0) + }, + new String[] { + "Wizards Tower Essence Mine", + "Magic Guild Essence Mine", + }); + THIEVES_JACKPOT.put( + new Location[]{ + new Location(3231, 3238, 0), + new Location(3154, 9646, 0) + }, + new String[]{ + "Lumbridge men", + "H.A.M Outlet" + }); + + HOURLY_EVENTS.put("Alchemy hellenistic", ALCHEMY_HELLENISTIC); + HOURLY_EVENTS.put("Harvesting Doubles", HARVESTING_DOUBLES); + HOURLY_EVENTS.put("Thieves jackpot", THIEVES_JACKPOT); + HOURLY_EVENTS.put("Golden essence", GOLDEN_ESSENCE); + } + + private int getIndex(Location[] loc, int value) { + for (int i = 0; i < loc.length; i ++) { + if (loc[i].getIndex() == value) { + return i; + } + } + return 0; + } + + @Override + public int[] getIds() { + return new int[] { + 175869 + }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ExplorerJackDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ExplorerJackDialogue.java new file mode 100644 index 000000000..6cc533d82 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ExplorerJackDialogue.java @@ -0,0 +1,175 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.emote.Emotes; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the explorer jack dialogue. + * @author Vexia + * + */ +@Initializable +public class ExplorerJackDialogue extends DialoguePlugin { + + /** + * The achievement diary. + */ + private AchievementDiary diary; + private final int level = 0; + + /** + * Constructs the new {@code ExplorerJackDialogue} + */ + public ExplorerJackDialogue() { + /* + * empty. + */ + } + + /** + * Constructs the new {@code ExplorerJackDialogue} + * @param player The player. + */ + public ExplorerJackDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ExplorerJackDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc("What ho! Where did you come from?"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE); + } + switch (stage) { + case -1: + if (diary.isComplete(level, true) && !diary.isLevelRewarded(level)) { + player("I've done all the beginner tasks in my Lumbridge", "Achievement Diary."); + stage = 50; + break; + } + if (diary.isLevelRewarded(level) && diary.isComplete(level, true) && !player.hasItem(diary.getType().getRewards(level)[0])) { + player("I've seemed to have lost my explorer's ring..."); + stage = 60; + break; + } + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 0; + break; + case 0: + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 10; + break; + case 2: + player("What are the rewards?"); + stage = 20; + break; + case 3: + player("How do I claim the rewards?"); + stage = 30; + break; + case 4: + player("See you later!"); + stage = 40; + break; + } + break; + case 1: + player("Oh sorry. I was just looking around"); + stage++; + break; + case 2: + npc("Oh thats perfectly alright. Mi Casa and all that what!"); + stage++; + break; + case 3: + player("Uh...and all what?"); + stage++; + break; + case 4: + npc("Splendid! I love a person with a sense of humour. I bet", "you're from Ardougne eh? Ha!"); + stage = -1; + break; + case 10: + npc("Ah, well it's a diary that helps you keep track of", "particular achievements you've made in the world of", "Keldagrim. In Lumbridge and Draynor i can help you", "discover some very useful things indeed."); + stage++; + break; + case 11: + npc("Eventually with enough exploration you will be", "rewarded for your explorative efforts."); + stage++; + break; + case 12: + npc("You can access your Achievement Diary by going to", "the Quest Journal. When you've opened the Quest", "Journal click on the green star icon on the top right", "hand corner. This will open the diary."); + stage = -1; + break; + case 20: + npc("Ah, well there are different rewards for each", "Achievement Diary. For completing the Lumbridge and", "Draynor diary you are presented with an explorer's", "ring."); + stage++; + break; + case 21: + npc("This ring will become increasingly useful with each", "section of the diary that you complete."); + stage = -1; + break; + case 30: + npc("You need to complete the taks so that they're all ticked", "off then you can claim your reward. Most of them are", "straightforward although you might find some required", "quests to be started, if not finished."); + stage++; + break; + case 31: + npc("To claim the explorer's ring speak to Bob in Bob's", "Axes in Lumbridge, Ned in Draynor Village or myself."); + stage = -1; + break; + case 40: + end(); + break; + case 50: + npc("Yes I see that, you'll be wanting your", "reward then I assume?"); + stage++; + break; + case 51: + player("Yes please."); + stage++; + break; + case 52: + diary.setLevelRewarded(level); + for (Item i : diary.getType().getRewards(level)) { + player.getInventory().add(i, player); + } + player.getEmoteManager().unlock(Emotes.EXPLORE); + npc("This ring is a representation of the adventures you", "went on to complete your tasks."); + stage ++; + break; + case 53: + player("Wow, thanks!"); + stage = -1; + break; + case 60: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("You better be more careful this time."); + stage = -1; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {7969}; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FacialExpression.java b/Server/src/main/java/Server/core/game/content/dialogue/FacialExpression.java new file mode 100644 index 000000000..51c2d34d7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FacialExpression.java @@ -0,0 +1,105 @@ +package core.game.content.dialogue; + +/** + * Represents the facial expressions (the animations the entity does when + * talking). + * + * @author Emperor + * @author Empathy + */ +public enum FacialExpression { + + /** + * The normal talking expression. + */ + + //Names based off https://2009scape.wiki/w/Chathead/Animations + + //Chat heads from oldschool 2009scape? + //Maybe for gnomes or dwarves? Chat heads are frozen when used on Human NPCs + OLD_HAPPY(588), + OLD_NORMAL(594), + OLD_SNEAKY(595), + OLD_SAD(596), + OLD_LAUGH1(605), + OLD_LAUGH2(606), + OLD_LAUGH3(607), + OLD_LAUGH4(608), //TODO: More + + //Chatheads from 2009? + NOD_YES(9741), + WORRIED(9743), + HALF_WORRIED(9745), //Not on the wiki, first half of worried + AMAZED(9746), + EXTREMELY_SHOCKED(9750), + GUILTY(9758), + HALF_GUILTY(9760), //Not on the wiki, first half of guilty + SAD(9761), + CRYING(9765), + HALF_CRYING(9768), //Not on the wiki, but plays the first half of the crying animation + AFRAID(9772), + SCARED(9776), + PANICKED(9780), + ANNOYED(9784), + ANGRY(9785), + FURIOUS(9792), + ANGRY_WITH_SMILE(9796), // Not on the wiki + ANGRY_WITH_SMILE_AND_EVIL_EYE(9798), //Not on the Wiki + SLEEPING(9802), + SILENT(9804), + NEUTRAL(9808), + THINKING(9812), + HALF_THINKING(9814), + DISGUSTED(9816), + DISGUSTED_HEAD_SHAKE(9823), //Not on the wiki + ASKING(9827), + HALF_ASKING(9830), //Not on wiki, first half of Asking + ROLLING_EYES(9831), //9832, 9833 are the same + HALF_ROLLING_EYES(9834), //Not on Wiki, first half of Rolling eyes + DRUNK(9835), + SUSPICIOUS(9836), + LAUGH(9840), + LOUDLY_LAUGHING(9841), + EVIL_LAUGH(9842), + FRIENDLY(9844), + HAPPY(9847), + JOLLY(9851), + STRUGGLE(9865), //TODO: More? + //9855-9857 are like disgusted? does it just repeat after this? + + //Child Chathead? + CHILD_EVIL_LAUGH(7171), + CHILD_FRIENDLY(7172), + CHILD_NORMAL(7173), + CHILD_NEUTRAL(7174), + CHILD_LOUDLY_LAUGHING(7175), + CHILD_THINKING(7176), + CHILD_SAD(7177), + CHILD_GUILTY(7178), + CHILD_SUSPICIOUS(7179); //TODO: More? + + + + /** + * The animation id. + */ + private final int animationId; + + /** + * Constructs a new {@code FacialExpression} {@code Object}. + * + * @param animationId The animation id. + */ + FacialExpression(int animationId) { + this.animationId = animationId; + } + + /** + * Gets the animation id. + * + * @return The animation id. + */ + public int getAnimationId() { + return animationId; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FadliDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FadliDialogue.java new file mode 100644 index 000000000..9958e85f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FadliDialogue.java @@ -0,0 +1,168 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the fadli dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FadliDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FadliDialogue} {@code Object}. + */ + public FadliDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FadliDialogue} {@code Object}. + * @param player the player. + */ + public FadliDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FadliDialogue(player); + } + + @Override + public void init() { + super.init(); + try { + new FadliPlugin().newInstance(null); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "What do you do?", "What is this place?", "I'd like to store some items please.", "Do you watch any matches?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do you do?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is this place?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like to store some items please."); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you watch any matches?"); + stage = 40; + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When I can."); + stage = 40; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You can store your stuff here if you want. You can", "dump anything you don't want to carry whilst your", "fighting duels and then pick it up again on the way out."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "To be honest I'm wasted here."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I should be winning duels in an arena! I'm the best", "warrior in Al Kharid!"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Easy, tiger!"); + stage = 14; + break; + case 14: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Isn't it obvious?"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is the Duel Arena...duh!"); + stage = 22; + break; + case 22: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Sure."); + stage = 31; + break; + case 31: + end(); + player.getBank().open(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Most aren't any good so I throw rotten fruit at them!"); + stage = 41; + break; + case 41: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 958 }; + } + + /** + * Represents the faldi interaction plugin. + * @author 'Vexia + * @version 1.0 + */ + public final class FadliPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(958).getHandlers().put("option:buy", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + node.asNpc().openShop(player); + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FaladorGardenerDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FaladorGardenerDialogue.java new file mode 100644 index 000000000..1f215517d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FaladorGardenerDialogue.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the falador gardener dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FaladorGardenerDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FaladorGardenerDialogue} {@code Object}. + */ + public FaladorGardenerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FaladorGardenerDialogue} {@code Object}. + * @param player the player. + */ + public FaladorGardenerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FaladorGardenerDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oi'm busy. If tha' wants owt, tha' can go find Wyson.", "He's ta boss 'round here. And,", "KEEP YE' TRAMPIN' FEET OFF MA'FLOWERS!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Right..."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1217, 3234 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FaladorManHouseDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FaladorManHouseDialogue.java new file mode 100644 index 000000000..59ecfe94c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FaladorManHouseDialogue.java @@ -0,0 +1,95 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the falador man house dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FaladorManHouseDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FaladorManHouseDialogue} {@code Object}. + */ + public FaladorManHouseDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FaladorManHouseDialogue} {@code Object}. + * @param player the player. + */ + public FaladorManHouseDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FaladorManHouseDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What are you doing in my house?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I was just exploring."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You're exploring my house?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You don't mind, do you?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "But... why are you exploring in my house?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, I don't know. I just wandered in, saw you and thought", "it'd be fun to speak to you."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "... you are very strange..."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Perhaps I should go now."); + stage = 8; + break; + case 8: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, please go away now."); + stage = 9; + break; + case 9: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3223 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FaladorShopKeeperDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FaladorShopKeeperDialogue.java new file mode 100644 index 000000000..d975af5b6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FaladorShopKeeperDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the falador shop keeper dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FaladorShopKeeperDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FaladorShopKeepDialogue} {@code Object}. + */ + public FaladorShopKeeperDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FaladorShopKeepDialogue} {@code Object}. + * @param player the player. + */ + public FaladorShopKeeperDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FaladorShopKeeperDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can I help you at all?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please. What are you selling?", "How should I use your shop?", "No, thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm glad you ask! You can buy as many of the items", "stocked as you wish. You can also sell most items to the", "shop."); + stage = 20; + break; + case 3: + end(); + break; + + } + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 526, 527 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FaladorSquireDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FaladorSquireDialogue.java new file mode 100644 index 000000000..9aa8cdf81 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FaladorSquireDialogue.java @@ -0,0 +1,579 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.GameWorld; + +/** + * Represents the falador squire dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FaladorSquireDialogue extends DialoguePlugin { + private boolean useDiaryDialogueTree = false; + private boolean replacementReward = false; + private AchievementDiary diary; + private int level = 2; + + /** + * Represents the blurite sword item. + */ + private static final Item BLURITE_SWORD = new Item(667); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code FaladorSquireDialogue} {@code Object}. + */ + public FaladorSquireDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FaladorSquireDialogue} {@code Object}. + * + * @param player the player. + */ + public FaladorSquireDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FaladorSquireDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("The Knight's Sword"); + interpreter.sendOptions("What do you want to do?", "Chat", "Talk about the Falador Achievement Diary"); + stage = -1; + diary = player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR); + replacementReward = diary.isLevelRewarded(level) + && diary.isComplete(level, true) + && !player.hasItem(diary.getType().getRewards(level)[0]); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (useDiaryDialogueTree || (stage == -1 && buttonId == 2)) { // Achievement Diary + useDiaryDialogueTree = true; + switch (stage) { + case -1: + if (replacementReward) { + player("I seem to have lost my Falador shield..."); + stage = 80; + } else { + npc("How are you getting on with the Achievement Diary?"); + stage = 90; + } + break; + case 80: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("Here's your replacement. Please be more careful."); + stage = 999; + break; + case 90: + options("I've come for my reward.", "I'm doing good.", "I have a question."); + stage = 91; + break; + case 91: + switch (buttonId) { + case 1: + player("I've come for my reward."); + stage = 200; + break; + case 2: + player("I'm doing good."); + stage = 220; + break; + case 3: + player("I have a question."); + stage = 105; + break; + } + break; + case 105: + if (!diary.isLevelRewarded(level)) { + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 106; + } else { + options("Can you remind me what my Falador shield does, please?", "What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 107; + } + break; + case 106: + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 110; + break; + case 2: + player("What are the rewards?"); + stage = 120; + break; + case 3: + player("How do I claim the rewards?"); + stage = 130; + break; + case 4: + player("See you later."); + stage = 999; + break; + } + break; + + case 107: + switch (buttonId) { + case 1: + player("Can you remind me what my Falador shield does, please?"); + stage = 150; + break; + case 2: + player("What is the Achievement Diary?"); + stage = 110; + break; + case 3: + player("What are the rewards?"); + stage = 120; + break; + case 4: + player("How do I claim the rewards?"); + stage = 130; + break; + case 5: + player("See you later."); + stage = 999; + break; + } + break; + + case 110: + npc("Ah, well it's a diary that helps you keep track of", "particular achievements you've made here on", "2009Scape."); + stage = 111; + break; + case 111: + npc("If you manage to complete a particular set of tasks,", "you will be rewarded for your explorative efforts."); + stage = 112; + break; + case 112: + npc("You can access your Achievement Diary by going to", "the Quest Journal, then clicking on the green star icon", "in the top-right hand corner."); + stage = 105; + break; + + case 120: + npc("Ah, well there are different rewards for each", "Achievement Diary. For completing each stage of the", "Falador diary, you are presented with a Falador shield."); + stage = 121; + break; + case 121: + npc("There are three shields available, one for each difficulty", "level."); + stage = 122; + break; + case 122: + npc("When you are presented with your rewards, you will", "be told of their uses."); + stage = 105; + break; + + case 130: + npc("You need to complete all of the tasks in a particular", "difficulty, then you can claim your reward."); + stage = 131; + break; + case 131: + npc("Some of Falador's tasks are simple, some will require", "certain skill levels, and some might require quests to be", "started or completed."); + stage = 132; + break; + case 132: + npc("To claim your Falador Achievement Diary rewards,", "speak to Redbeard the Pirate in Port Sarim, Sir Vyvin's", "squire in the White Knight's Castle, or myself."); + stage = 105; + break; + + case 150: + npc("This is the final stage of the Falador shield: a tower", "shield. It grants you all the benefits fo the buckler", "and kiteshield did, full Prayer restore, and access to", "some interesting new seeds that my friend Wyson has"); + stage = 151; + break; + case 151: + npc("found."); + stage = 152; + break; + case 152: + npc("As before, Prayer restore can only be used once per", "day, but this time it restores all of your Prayer points!"); + stage = 153; + break; + case 153: + npc("The new seeds I mentioned were discovered by Wyson,", "who can be found in Falador Park. He'll give you some", "new seeds in return for the skin of the giant mole", "beneath Falador Park.."); + stage = 154; + break; + case 154: + npc("He'll only offer them to you if you're wielding the", "Falador shield, though."); + stage = 155; + break; + case 155: + npc("As well as all these features, the shield is pretty handy", "in combat, and gives you a big Prayer boost."); + stage = 105; + break; + + case 200: + if (diary.isLevelRewarded(level)) { + npc("But you've already gotten yours!"); + stage = 105; + } else if (diary.isComplete(level, true)) { + npc("So, you've finished. Well done! I believe congratulations", "are in order."); + stage = 201; + } else { + npc("But you haven't finished!"); + stage = 105; + } + break; + case 201: + player("I believe rewards are in order."); + stage = 202; + break; + case 202: + npc("Right you are."); + stage = 203; + break; + case 203: + npc("This is the final stage of the Falador shield: a tower", "shield. It grants you all the benefits fo the buckler", "and kiteshield did, full Prayer restore, and access to", "some interesting new seeds that my friend Wyson has"); + if (!diary.isLevelRewarded(level)) { + for (Item i : diary.getType().getRewards(level)) { + if (!player.getInventory().add(i, player)) { + GroundItemManager.create(i, player); + } + } + diary.setLevelRewarded(level); + } + stage = 204; + break; + case 204: + npc("found."); + stage = 205; + break; + case 205: + npc("As before, Prayer restore can only be used once per", "day, but this time it restores all of your Prayer points!"); + stage = 206; + break; + case 206: + npc("The new seeds I mentioned were discovered by Wyson,", "who can be found in Falador Park. He'll give you some", "new seeds in return for the skin of the giant mole", "beneath Falador Park.."); + stage = 207; + break; + case 207: + npc("He'll only offer them to you if you're wielding the", "Falador shield, though."); + stage = 208; + break; + case 208: + npc("As well as all these features, the shield is pretty handy", "in combat, and gives you a big Prayer boost."); + stage = 209; + break; + case 209: + interpreter.sendDialogues(player, FacialExpression.AMAZED, "Wow, thanks!"); + stage = 210; + break; + case 210: + npc("If you should lose your shield, come back and see me", "for another one."); + stage = 105; + break; + case 220: + npc("Keep it up!"); + stage = 105; + break; + + case 999: + end(); + break; + } + } else { // chat + + switch (quest.getStage(player)) { + case 100: + switch (stage) { + case -1: + npc("Hello friend! Many thanks for all of your help! Vyvin", "never even realised it was a different sword, and I still", "have my job!"); + stage = 0; + break; + case 0: + end(); + break; + } + break; + case 60: + switch (stage) { + case -1: + npc("So how are you doing getting a sword?"); + stage = 0; + break; + case 0: + if (!player.getInventory().containsItem(BLURITE_SWORD)) { + player("I've found a dwarf who will make the sword, I've just", "got to find the materials for it now!"); + stage = 1; + } else { + player("I have retrieved your sword for you."); + stage = 2; + } + break; + case 1: + end(); + break; + case 2: + npc("Thank you, thank you, thank you! I was seriously", "worried I would have to own up to Sir Vyvin!"); + stage = 3; + break; + case 3: + interpreter.sendDialogue("You give the sword to the squire."); + stage = 4; + break; + case 4: + if (player.getInventory().remove(BLURITE_SWORD)) { + quest.finish(player); + end(); + } + break; + } + break; + case 50: + switch (stage) { + case -1: + npc("So how are you doing getting a sword?"); + stage = 0; + break; + case 0: + if (player.getInventory().contains(666, 1)) { + player("I have the picture, I'll just take it to the dwarf now!"); + stage = 3; + } else { + player("I didn't get the picture yet..."); + stage = 1; + } + break; + case 1: + npc("Please try and get it quickly... I am scared Sir Vyvin", "will find out!"); + stage = 2; + break; + case 2: + end(); + break; + case 3: + npc("Please hurry!"); + stage = 2; + break; + } + break; + case 40: + switch (stage) { + case -1: + npc("So how are you doing getting a sword?"); + stage = 0; + break; + case 0: + player("I have found an Imcando dwarf but he needs a picture", "of the sword before he can make it."); + stage = 1; + break; + case 1: + npc("A picture eh? Hmmm.... The only one I can think of is", "in a small portrait of Sir Vyvin's father... Sir Vyvin", "keeps it in a cupboard in is room I think."); + stage = 2; + break; + case 2: + player("Ok, I'll try to get that then."); + stage = 3; + break; + case 3: + npc("Please don't let him catch you! He MUSTN'T know", "what happened!"); + stage = 4; + break; + case 4: + quest.setStage(player, 50); + end(); + break; + } + break; + case 30: + switch (stage) { + case -1: + npc("So how are you doing getting a sword?"); + stage = 0; + break; + case 0: + player("I have found an Imcando Dwarf named Thurgo!", "I have given him Redberry pie, I hope he will", "help me now."); + stage = 1; + break; + case 1: + end(); + break; + } + break; + case 20: + case 10: + switch (stage) { + case -1: + npc("So how are you doing getting a sword?"); + stage = 0; + break; + case 0: + player("I'm still looking for Imcando dwarves to help me..."); + stage = 1; + break; + case 1: + npc("Please try and find them quickly... I am scared Sir", "Vyvin will find out!"); + stage = 2; + break; + case 2: + end(); + break; + case 166: + end(); + break; + } + break; + case 0: + switch (stage) { + case -1: + npc("Hello. I am the squire to Sir Vyvin."); + stage++; + break; + case 0: + options("And how is life as a squire?", "Wouldn't you prefer to be a squire for me?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("And how is life as a squire?"); + stage = 10; + break; + case 2: + player("Wouldn't you prefer to be a squire for me?"); + stage = 20; + break; + } + break; + case 10: + npc("Well, Sir Vyvin is a good guy to work for, however,", "I'm in a spot of trouble today. I've gone and lost Sir", "Vyvin's sword!"); + stage = 11; + break; + case 11: + options("Do you know where you lost it?", "I can make a new sword if you like...", "Is he angry?"); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("Do you know where you lost it?"); + stage = 100; + break; + case 2: + player("I can make a new sword if you like..."); + stage = 120; + break; + case 3: + player("Is he angry?"); + stage = 130; + break; + } + break; + case 20: + npc("No, sorry, I'm loyal to Sir Vyvin."); + stage = 999; + break; + case 100: + npc("Well now, if I knew THAT it wouldn't be lost, now", "would it?"); + stage = 999; + break; + case 120: + npc("Thanks for the offer. I'd be surprised if you could", "though."); + stage = 121; + break; + case 121: + npc("The thing is, this sword is a family heirloom. It has been", "passed down through Vyvin's family for five", "generations! It was originally made by the Imcando", "dwarves, who were"); + stage = 122; + break; + case 122: + npc("a particularly skilled tribe of dwarven smiths. I doubt", "anyone could make it in the style they do."); + stage = 123; + break; + case 123: + options("So would these dwarves make another one?", "Well I hope you find it soon."); + stage = 134; + break; + case 134: + switch (buttonId) { + case 1: + player("So would these dwarves make another one?"); + stage = 160; + break; + case 2: + player("Well I hope you find it soon."); + stage = 170; + break; + } + break; + case 160: + npc("I'm not a hundred percent sure the Imcando tribe", "exists anymore. I should think Reldo, the palace", "librarian in Varrock, will know; he has done a lot of", "research on the races of " + GameWorld.getSettings().getName() + "."); + stage = 161; + break; + case 161: + npc("I don't suppose you could try and track down the", "Imcando dwarves for me? I've got so much work to", "do..."); + stage = 162; + break; + case 162: + options("Ok, I'll give it a go.", "No, I've got lots of mining work to do."); + stage = 163; + break; + case 163: + switch (buttonId) { + case 1: + player("Ok, I'll give it a go."); + stage = 165; + break; + case 2: + player("No, I've got lots of mining work to do."); + stage = 164; + break; + } + break; + case 164: + npc("Oh man... I'm in such trouble..."); + stage = 999; + break; + case 165: + npc("Thank you very much! As I say, the best place to start", "should be with Reldo..."); + stage = 999; + quest.setStage(player, 10); + player.getQuestRepository().syncronizeTab(player); + break; + case 170: + npc("Yes, me too. I'm not looking forward to telling Vyvin", "I've lost it. He's going to want it for the parade next", "week as well."); + stage = 999; + break; + case 130: + npc("He doesn't know yet. I was hoping I could think of", "something to do before he does find out, But I find", "myself at a loss."); + stage = 999; + break; + case 999: + end(); + break; + } + break; + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{606}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FaladorWomenParkDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FaladorWomenParkDialogue.java new file mode 100644 index 000000000..3fd187da8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FaladorWomenParkDialogue.java @@ -0,0 +1,83 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the falador women park dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FaladorWomenParkDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FaladorWomenParkDialogue} {@code Object}. + */ + public FaladorWomenParkDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FaladorWomenParkDialogue} {@code Object}. + * @param player the player. + */ + public FaladorWomenParkDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FaladorWomenParkDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Grettings! Have you come to gaze in rapture at the", "natural beauty of Falador's parkland?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Um, yes, very nice. Lots of.... trees and stuff."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Trees! I do so love trees! And flowers! And squirrels."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I have a strange urge to be somewhere else."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Come back to me soon and we can talk again about trees!"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "..."); + stage = 6; + break; + case 6: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3226 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FamiliarDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/FamiliarDialoguePlugin.java new file mode 100644 index 000000000..7ac2bc312 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FamiliarDialoguePlugin.java @@ -0,0 +1,148 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; + +/** + * Represents the dialogue plugin used for familiars. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FamiliarDialoguePlugin extends DialoguePlugin { + + /** + * Constructs a new {@code FamiliarDialoguePlugin} {@code Object}. + */ + public FamiliarDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FamiliarDialoguePlugin} {@code Object}. + * @param player the player. + */ + public FamiliarDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FamiliarDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (!(npc instanceof Familiar)) { + return false; + } + final Familiar f = (Familiar) npc; + if (f.getOwner() != player) { + player.getPacketDispatch().sendMessage("This is not your follower."); + return true; + } + // if (f.getDetails().getType() == FamiliarType.PET) {TODO:Pet + // if (player.getSkills().getLevel(Skills.SUMMONING) < ((PetDetails) + // f.getDetails()).getPet().getSummoningLevel() + 10) { + // interpreter.sendDialogues(npc, null, "Grumble...!"); + // int lvl = ((PetDetails) f.getDetails()).getPet().getSummoningLevel() + // + 10; + // if (lvl > 99) { + // player.getPacketDispatch().sendMessage("It is impossible to talk to this pet.");//dragon, + // chamerelon, monket..etc + // return true; + // } + // player.getPacketDispatch().sendMessage("You need a summoning level of " + // + lvl + " in order to communicate with your pet."); + // stage = 99; + // return true; + // } + // } + stage = RandomFunction.random(1, 3); + switch (stage) { + case 1: + interpreter.sendDialogues(npc, null, "Are we going to be walking all day?"); + stage = 1; + break; + case 2: + interpreter.sendDialogues(npc, null, "Yer lookin' tired. You should have a nap."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(npc, null, "I could do wi' a cup of tea, mind."); + stage = 30; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1:// random first. + interpreter.sendDialogues(player, null, "Well, I could carry you if you like."); + stage = 10; + break; + case 10: + interpreter.sendDialogues(npc, null, "That would be great!"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, null, "You know, you won't grow up to be big and strong", "if you keep getting carried everywhere."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, null, "I know, I know."); + stage = 99; + break; + case 2:// random second dial. + interpreter.sendDialogues(npc, null, "Yer lookin' tired. You should have a nap."); + stage = 20; + break; + case 20: + interpreter.sendDialogues(player, null, "Is it me who needs a rest or you?"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, null, "Well, if you took one, I might too..."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(player, null, "Yeah, I thought as much."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, null, "Grumble..."); + stage = 99; + break; + case 3:// random third dial. + interpreter.sendDialogues(npc, null, "I could do wi' a cup of tea, mind."); + stage = 30; + break; + case 30: + interpreter.sendDialogues(player, null, "I don't know if a cup of tea would be good for you."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(npc, null, "Fair 'nuff, then."); + stage = 99; + break; + case 99: + end(); + player.getFamiliarManager().getFamiliar().startFollowing(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 761, 762, 763, 764, 765, 766, 3505, 3598, 6969, 7259, 7260, 6964, 7249, 7251, 6960, 7241, 7243, 6962, 7245, 7247, 6966, 7253, 7255, 6958, 7237, 7239, 6915, 7277, 7278, 7279, 7280, 7018, 7019, 7020, 6908, 7313, 7316, 6947, 7293, 7295, 7297, 7299, 6911, 7261, 7263, 7265, 7267, 7269, 6919, 7301, 7303, 7305, 7307, 6949, 6952, 6955, 6913, 7271, 7273, 6945, 7319, 7321, 7323, 7325, 7327, 6922, 6942, 7210, 7212, 7214, 7216, 7218, 7220, 7222, 7224, 7226, 6900, 6902, 6904, 6906, 768, 769, 770, 771, 772, 773, 3504, 8214, 6968, 7257, 7258, 6965, 7250, 7252, 6961, 7242, 7244, 6963, 7246, 7248, 6967, 7254, 7256, 6859, 7238, 7240, 6916, 7281, 7282, 7283, 7284, 7015, 7016, 7017, 6909, 7314, 7317, 11413, 6948, 7294, 7296, 7298, 7300, 6912, 7262, 7264, 7266, 7268, 7270, 6920, 7302, 7304, 7306, 7308, 6950, 6953, 6956, 6914, 7272, 7274, 13090, 6946, 7320, 7322, 7324, 7326, 7328, 6923, 6943, 7211, 7213, 7215, 7217, 7219, 7221, 7223, 7225, 7227, 6901, 6903, 6905, 6907, 774, 775, 776, 777, 778, 779, 3503, 8216, 6951, 6954, 6957 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FaridMorrisaneDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FaridMorrisaneDialogue.java new file mode 100644 index 000000000..ce470c3e3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FaridMorrisaneDialogue.java @@ -0,0 +1,120 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.ge.GEGuidePrice; +import core.game.ge.GEGuidePrice.GuideType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the farid morrisane dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FaridMorrisaneDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FaridMorrisaneDialogue} {@code Object}. + */ + public FaridMorrisaneDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FaridMorrisaneDialogue} {@code Object}. + * @param player the player. + */ + public FaridMorrisaneDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FaridMorrisaneDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, little boy."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I would prefer it if you didn't speak to me in such a", "manner. I'll have you know I'm an accomplished", "merchant."); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Calm down, junior.", "Can you help me out with the prices for ores?", "I best go and speak with someone my height."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Calm down, junior."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you help me out with the prices for ores?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I best go and speak with someone more my height."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Don't tell me to calm down! And don't call me 'junior'."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'll have you know I am Farid Morrisane, son of Ali", "Morrisane, the worlds greatest merchant!"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Then why are you here and not him?"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "My dad has given me the responsibility of", "expanding our business here."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "And you're up to the task?"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What a grown up boy you are! Mummy and", "daddy must be very pleased!"); + stage = 16; + break; + case 16: + end(); + break; + case 20: + end(); + GEGuidePrice.open(player, GuideType.ORES); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Then I shall not stop you, mister. I've too", "much work to do."); + stage = 31; + break; + case 31: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6523 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FatherLawrenceDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FatherLawrenceDialogue.java new file mode 100644 index 000000000..0fa382f28 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FatherLawrenceDialogue.java @@ -0,0 +1,181 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the father lawrence dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FatherLawrenceDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FatherLawrenceDialogue} {@code Object}. + */ + public FatherLawrenceDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FatherLawrenceDialogu} {@code Object}. + * @param player the player. + */ + public FatherLawrenceDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + final Quest quest = player.getQuestRepository().getQuest("Romeo & Juliet"); + if (quest.getStage(player) < 30) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh to be a father in the times of whiskey."); + stage = 0; + } + switch (quest.getStage(player)) { + case 30: + interpreter.sendDialogues(npc, null, "\"...and let Saradomin light the way for you... \"", "Urgh!"); + stage = 41; + break; + case 40: + interpreter.sendDialogues(npc, null, "Ah, have you found the Apothecary yet? Remember,", "Cadava potion, for Juliet."); + stage = 30; + break; + case 50: + interpreter.sendDialogues(npc, null, "Did you find the Apothecary?"); + stage = 820; + break; + case 60: + case 70: + interpreter.sendDialogues(npc, null, "Did you find the Apothecary?"); + stage = 820; + break; + case 100: + player("Hi again!"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Romeo & Juliet"); + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I sing and I drink and I wake up in gutters."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Top of the morning to you."); + stage = 2; + break; + case 2: + end(); + break; + case 41: + interpreter.sendDialogues(npc, null, "Can't you see that I'm in the middle of a Sermon?!"); + stage = 42; + break; + case 42: + interpreter.sendDialogues(player, null, "But Romeo sent me!"); + stage = 43; + break; + case 43: + interpreter.sendDialogues(npc, null, "But I'm busy delivering a sermon to my congregation!"); + stage = 44; + break; + case 44: + interpreter.sendDialogues(player, null, "Yes well it certainly seems like you have a captive", "audience!"); + stage = 45; + break; + case 45: + interpreter.sendDialogues(npc, null, "Ok, ok...what do you want so I can get rid of you and", "continue with my sermon?"); + stage = 46; + break; + case 46: + interpreter.sendDialogues(player, null, "Romeo sent me. He says you may be able to help."); + stage = 47; + break; + case 47: + interpreter.sendDialogues(npc, null, "Ah Romeo, yes. A fine lad, but a little bit confused."); + stage = 48; + break; + case 48: + interpreter.sendDialogues(player, null, "Yes, very confused...Anyway, Romeo wishes to be", "married to Juliet! She must be rescued from her", "father's control!"); + stage = 49; + break; + case 49: + interpreter.sendDialogues(npc, null, "I agree, and I think I have an idea! A potion to make", "her appear dead..."); + stage = 50; + break; + case 50: + interpreter.sendDialogues(player, null, "Dead! Sounds a bit creepy to me...but please, continue."); + stage = 51; + break; + case 51: + interpreter.sendDialogues(npc, null, "The potion will only make Juliet 'appear' dead...then", "she'll be taken to the crypt..."); + stage = 52; + break; + case 52: + interpreter.sendDialogues(player, null, "Crypt! Again...very creepy! You must have some", "strange hobbies."); + stage = 53; + break; + case 53: + interpreter.sendDialogues(npc, null, "Then Romeo can collect her from the crypt! Go to the", "Apothercary, tell him I sent you and that you'll need a", "'Cadava' potion."); + stage = 54; + break; + case 54: + interpreter.sendDialogues(player, null, "Apart from the strong overtones of death, this is", "turning out to be a real love story."); + stage = 55; + break; + case 55: + quest.setStage(player, 40); + end(); + break; + case 30: + end(); + break; + case 820: + interpreter.sendDialogues(player, null, "Yes I did. He's told me I must find some Cadava", "berries."); + stage = 821; + break; + case 821: + interpreter.sendDialogues(npc, null, "Well, good luck with that...they're quite tricky to find."); + stage = 822; + break; + case 822: + interpreter.sendDialogues(player, null, "Any clues where I can start to look?"); + stage = 823; + break; + case 823: + interpreter.sendDialogues(npc, null, "I heard some kids saying they saw some the other day.", "They were visiting the mining place to the south east", "Varrock."); + stage = 824; + break; + case 824: + interpreter.sendDialogues(player, null, "Ok, that's as good a place to start looking as any."); + stage = 825; + break; + case 825: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FatherLawrenceDialogue(player); + } + + @Override + public int[] getIds() { + return new int[] { 640 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FenitasDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FenitasDialogue.java new file mode 100644 index 000000000..19cac707b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FenitasDialogue.java @@ -0,0 +1,64 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the fenitas dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FenitasDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FenitasDialogue} {@code Object}. + */ + public FenitasDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FenitasDialogue} {@code Object}. + * @param player the player. + */ + public FenitasDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FenitasDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy some cooking equipment?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please."); + stage = 1; + break; + case 1: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 593 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FilelioDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FilelioDialogue.java new file mode 100644 index 000000000..41bc12aea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FilelioDialogue.java @@ -0,0 +1,84 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the filelio dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FilelioDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FilelioDialogue} {@code Object}. + */ + public FilelioDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FilelioDialogue} {@code Object}. + * @param player the player. + */ + public FilelioDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FilelioDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "H-hello. You l-look like a s-stranger to these p-parts.", "Would you l-ike to buy something? I h-have some s-", "special offers at the m-minute...some s-sample bottles for", "s-storing s-snail slime."); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); + stage = 20; + break; + + } + break; + case 20: + end(); + break; + case 10: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1040 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FishingTutorDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FishingTutorDialogue.java new file mode 100644 index 000000000..277642b8a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FishingTutorDialogue.java @@ -0,0 +1,159 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the fishing tutor dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FishingTutorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FishingTutorDialogue} {@code Object}. + */ + public FishingTutorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FishingTutorDialogue} {@code Object}. + * @param player the player. + */ + public FishingTutorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FishingTutorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "Can you teach me the basics of fishing please?", "Tell me about different fish.", "Where and what should I fish?", "Goodbye."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you teach me the basics of fishing please?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about different fish."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where and what should I fish?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Goodbye."); + stage = 40; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahoy, to fish, you click on your net in your inventory,", "then on the fishin' spot to put it in. Then you pull the", "net out and see if you got any shrimp."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I see.. is that it?"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There's far more as you progress, not just shrimps,", "you get more equipment, bigger fish and other things", "too..."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you have a full inventory, you can cook it or", "take it to the bank. You can find a bank on the roof of", "the castle in Lumbridge and a cookin' range in the", "castles kitchen."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Arrr.. if yer lookin' fer quests you should head to", "the Mountain Dwarf who lies north-west of Taverely", "and have a chat with him, I'm sure he can point you in", "the right direction."); + stage = 15; + break; + case 15: + interpreter.sendOptions("Select an Option", "Can you teach me the basics of fishing please?", "Tell me about different fish.", "Where and what should I fish?", "Goodbye."); + stage = 1; + break; + case 20: + interpreter.sendOptions("Select an Option", "Small Net Fish", "Big Net Fish", "Rod and Fly Fishing", "Tell me about..."); + stage = 21; + break; + case 21: + switch (buttonId) { + case 1: + interpreter.sendItemMessage(303, "Ahoy, small net fishin' you can do just south of Draynor Village and in these very spots here. Aye."); + stage = 210; + break; + case 2: + interpreter.sendItemMessage(305, "Aye, you can net yourself some big fish in Catherby, which is a good place to fish for most things, Gar!"); + stage = 220; + break; + case 3: + interpreter.sendItemMessage(307, "Aye, rod fishin' can be practiced here at these spots, as well as south of Draynor Village and in the Lumbridge river, depending upon your experience. You can get bait at any fishin' shop, there be one in Port Sarim."); + stage = 230; + break; + case 4: + interpreter.sendOptions("Select an Option", "Can you teach me the basics of fishing please?", "Tell me about different fish.", "Where and what should I fish?", "Goodbye."); + stage = 1; + break; + } + break; + case 210: + interpreter.sendItemMessage(315, "Shrimps and anchovies can be caught with your small fishin' net"); + stage = 20; + break; + case 220: + interpreter.sendItemMessage(355, "Mackerel and Cod will form the backbone of your catch when big net fishin'.. except for the added extras..."); + stage = 221; + break; + case 221: + interpreter.sendDialogues(npc, null, "Some rich rewards for big net fishin', make sure you be", "using a big net fishing spot though..."); + stage = 20; + break; + case 230: + interpreter.sendItemMessage(351, "With a rod you can catch pike, sardines and herring. Good eating on them."); + stage = 231; + break; + case 231: + interpreter.sendItemMessage(309, "The art of fly fishin' can be done in rivers, so the Lumbridge river here would suffice."); + stage = 232; + break; + case 232: + interpreter.sendItemMessage(329, "Aye, you can catch yourself a delicious trout or salmon."); + stage = 20; + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Herrin' can be fished from Catherby and some other", "places when you reach level 10."); + stage = 31; + break; + case 31: + interpreter.sendOptions("Select an Option", "Can you teach me the basics of fishing please?", "Tell me about different fish.", "Where and what should I fish?", "Goodbye."); + stage = 1; + break; + case 40: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4901 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FlynnDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FlynnDialogue.java new file mode 100644 index 000000000..6ae2ed85e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FlynnDialogue.java @@ -0,0 +1,76 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the flynn npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FlynnDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FlynnDialogue} {@code Object}. + */ + public FlynnDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FlynnDialogue} {@code Object}. + * @param player the player. + */ + public FlynnDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FlynnDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello. Do you want to buy or sell any maces?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "No, thanks.", "Well, I'll have a look, at least."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 10; + break; + case 2: + end(); + npc.openShop(player); + break; + + } + break; + case 10: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 580 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FortressGuardDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FortressGuardDialogue.java new file mode 100644 index 000000000..8cb158113 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FortressGuardDialogue.java @@ -0,0 +1,233 @@ +package core.game.content.dialogue; + +import java.util.List; + +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.map.RegionManager; + +/** + * Represents the fortress guard dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class FortressGuardDialogue extends DialoguePlugin { + + /** + * Represents the uniform item. + */ + private static final Item[] UNIFORM = new Item[] { new Item(1139), new Item(1101) }; + + /** + * Constructs a new {@code FortressGuardDialogue} {@code Object}. + */ + public FortressGuardDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FortressGuardDialogue} {@code Object}. + * @param player the player. + */ + public FortressGuardDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FortressGuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length == 2) { + interpreter.sendDialogues(npc, null, "Hey! You can't come in here! This is a high security", "military installation!"); + stage = 40; + return true; + } + if (args.length == 3) { + interpreter.sendDialogues(npc, null, "I wouldn't go in there if I were you. Those Black", "Knights are in an important meeting. They said they'd", "kill anyone who went in there!"); + stage = 50; + return true; + } + if (!inUniform(player)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Get lost. This is private property."); + stage = 0; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hey! Get back on duty!"); + stage = 30; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, but I work here!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, this is the guards' entrance. I might be new here", "but I can tell you're not a guard."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How can you tell?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You're not even wearing proper guards uniform!"); + stage = 4; + break; + case 4: + interpreter.sendOptions("Select an Option", "Oh pleeeaase let me in!", "So what is this uniform?"); + stage = 5; + break; + case 5: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh pleeeaaase let me in!"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So what is this uniform?"); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Go away. You're getting annoying."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well you can see me wearing it. It's an iron chainbody", "and a medium bronze helm."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hmmm... I wonder if I can make that or get some in", "the local towns..."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What was that you muttered?"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, nothing important!"); + stage = 24; + break; + case 24: + end(); + break; + case 30: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Uh..."); + stage = 31; + break; + case 31: + end(); + break; + case 40: + interpreter.sendOptions("Select an Option", "Yes, but I work here!", "Oh, sorry.", "So who does it belong to?"); + stage = 41; + break; + case 41: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, but I work here!"); + stage = 1; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, sorry."); + stage = 42; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So who does it belong to?"); + stage = 44; + break; + } + break; + case 42: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Don't let it happen again."); + stage = 43; + break; + case 43: + end(); + break; + case 44: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This fortress belongs to the order of Black Knights", "known as the Kinshra."); + stage = 45; + break; + case 45: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh. Okay, thanks."); + stage = 46; + break; + case 46: + end(); + break; + case 50: + interpreter.sendOptions("Select an Option", "Okay, I won't.", "I don't care. I'm going in anyway."); + stage = 51; + break; + case 51: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Okay, I won't."); + stage = 52; + break; + case 2: + interpreter.sendDialogues(player, null, "I don't care. I'm going in anyway."); + stage = 54; + break; + } + break; + case 52: + interpreter.sendDialogues(npc, null, "Wise move."); + stage = 53; + break; + case 53: + end(); + break; + case 54: + end(); + DoorActionHandler.handleAutowalkDoor(player, RegionManager.getObject(0, 3020, 3515)); + List npcs = RegionManager.getLocalNpcs(player); + for (NPC npc : npcs) { + if (npc.getId() == 179) { + npc.getProperties().getCombatPulse().attack(player); + npc.sendChat("Die, intruder!"); + return true; + } + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 609, 4603, 4604, 4605, 4606 }; + } + + /** + * Method used to cehck if the player is in the inventory. + * @param player the player. + * @return True if so. + */ + public static boolean inUniform(final Player player) { + for (Item i : UNIFORM) { + if (!player.getEquipment().containsItem(i)) { + return false; + } + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FortunatoDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FortunatoDialogue.java new file mode 100644 index 000000000..62c819ae3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FortunatoDialogue.java @@ -0,0 +1,113 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for fortunato. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FortunatoDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FortunatoDialogue} {@code Object}. + */ + public FortunatoDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FortunatoDialogue} {@code Object}. + * @param player the player. + */ + public FortunatoDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FortunatoDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can I help you at all?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, what are you selling?", "Not at the momennt."); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, what are you selling?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Then move along, you filthy ragamuffin, I have customers", "to server!"); + stage = 24; + break; + } + + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, indeed. The finest wine in Misthalin."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Care to take a look at my wares?"); + stage = 269; + break; + case 269: + interpreter.sendOptions("Select an Option", "Yes.", "Not at the moment."); + stage = 22; + break; + case 22: + + switch (buttonId) { + case 1: + end(); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Not at the moment."); + stage = 23; + break; + } + + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Then move along, you filthy ragamuffin, I have customers", "to server!"); + stage = 24; + break; + case 24: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3671 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FredTheFarmer.java b/Server/src/main/java/Server/core/game/content/dialogue/FredTheFarmer.java new file mode 100644 index 000000000..08e316b94 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FredTheFarmer.java @@ -0,0 +1,372 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +import core.plugin.Initializable; +import core.game.content.quest.free.SheepShearer; + +/** + * Represents the dialogue plugin used for fred the farmer npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FredTheFarmer extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code FredTheFarmer} {@code Object}. + */ + public FredTheFarmer() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FredTheFarmer} {@code Object}. + * @param player the player. + */ + public FredTheFarmer(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FredTheFarmer(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Sheep Shearer"); + if (player.getQuestRepository().getQuest("Sheep Shearer").getStage(player) == 10 || player.getQuestRepository().getQuest("Sheep Shearer").getStage(player) == 90) { + if (SheepShearer.getWoolGiven(player) == 20 && player.getQuestRepository().getQuest("Sheep Shearer").getStage(player) == 90) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's the last of them."); + stage = 999; + return true; + } + if (player.getInventory().contains(1737, 1) || player.getInventory().contains(1759, 1)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What are you doing on my land?"); + stage = 5000; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How are you doing getting those balls of wool?"); + stage = 4000; + return true; + } + + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What are you doing on my land? You're not the one", "who keeps leaving all my gates open and letting out all", "my sheep are you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + quest = player.getQuestRepository().getQuest("Sheep Shearer"); + switch (stage) { + case 0: + if (!player.getQuestRepository().isComplete("Sheep Shearer")) { + interpreter.sendOptions("Select an Option", "I'm looking for a quest.", "I'm looking for something to kill.", "I'm lost."); + stage = 1; + } else { + interpreter.sendOptions("Select an Option", "I'm looking for something to kill.", "I'm lost."); + stage = 346; + } + break; + case 346: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm looking for something to kill."); + stage = 20; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm lost."); + stage = 30; + break; + } + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm looking for a quest."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm looking for something to kill."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm lost."); + stage = 30; + break; + + } + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How can you be lost? Just follow the road east and", "south. You'll end up in Lumbridge fairly quickly."); + stage = 31; + break; + case 31: + end(); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You're after a quest, you say? Actually I could do with", "a bit of help."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "My sheep are getting mighty woolly. I'd be much", "obliged if you could shear them. And while you're at it", "spin the wool for me too."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, that's it. Bring me 20 balls of wool. And I'm sure", "I could sort out somesort of payment. Of course,", "there's a small matter of The Thing."); + stage = 13; + break; + case 13: + interpreter.sendOptions("Select an Option", "Yes okay. I can do that.", "That doesn't sound a very exiting quest.", "What do you mean, The Thing?"); + stage = 14; + break; + case 14: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes okay. I can do that."); + stage = 670; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That doesn't sound a very exiting quest."); + stage = 560; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do you mean, The Thing?"); + stage = 456; + break; + } + break; + case 670: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Good! Now one more thing, do you actually know how", "to shear a sheep?"); + stage = 678; + break; + case 678: + interpreter.sendOptions("Select an Option", "Of course!", "No, I don't know actually."); + stage = 679; + break; + case 679: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Of course!"); + stage = 954; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Err. No, I don't know actually."); + stage = 750; + break; + } + break; + case 954: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you know how to spin wool?"); + stage = 754; + break; + case 750: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Just use a set of shears on a sheep to shear it."); + stage = 751; + break; + case 751: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all I have to do?"); + stage = 752; + break; + case 752: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well once you've collected some wool you'll need to spin", "it into balls."); + stage = 753; + break; + case 753: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you know how to spin wool?"); + stage = 754; + break; + case 754: + interpreter.sendOptions("Select an Option", "I don't know how to spin wool, sorry.", "I'm something of an expert actually!"); + stage = 755; + break; + case 755: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't know how to spin wool, sorry."); + stage = 756; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm something of an expert actually!"); + stage = 850; + break; + } + break; + case 850: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well you can stop grinning and get to work then."); + stage = 851; + break; + case 851: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm not paying you by the hour!"); + stage = 852; + break; + case 852: + end(); + quest.start(player); + break; + case 756: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Don't worry, it's quite simple!"); + stage = 757; + break; + case 757: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The nearest Spinning Wheel can be found on the first", "floor of Lumbridge Castle."); + stage = 758; + break; + case 758: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "To get to the Lumbridge Castle just follow the road east."); + stage = 759; + break; + case 759: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thank you!"); + stage = 760; + break; + case 760: + end(); + quest.start(player); + break; + case 671: + end(); + break; + case 560: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well what do you expect if you ask a farmer for a", "quest?"); + stage = 21; + break; + case 456: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well now, no one has ever seen The Thing. That's", "why we call it The Thing, 'cos we don't know what it is."); + stage = 457; + break; + case 457: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Someone say it's a black hearted shapeshifter, hungering for", "the souls of hard working decent folk like me. Others", "say it's just a sheep."); + stage = 21; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What, on my land? Leave my livestock alone you", "scoundrel!"); + stage = 21; + break; + case 21: + end(); + break; + case 4000: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How many more do I need to give you?"); + stage = 4001; + break; + case 4001: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You need to collect " + SheepShearer.getWoolLeft(player) + " more balls of wool."); + stage = 4002; + break; + case 4002: + if (!player.getInventory().contains(1759, 1)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I haven't got any at the moment."); + stage = 4003; + break; + } + break; + case 4003: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well at least you haven't been eaten."); + stage = 21; + break; + case 4004: + break; + case 5000: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm back!"); + stage = 50001; + break; + case 50001: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How are you doing getting those balls of wool?"); + stage = 50002; + break; + case 50002: + if (player.getInventory().contains(1759, 1)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I have some."); + stage = 50010; + break; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How many more do I need to give you?"); + stage = 50003; + break; + case 50003: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You need to collect " + SheepShearer.getWoolLeft(player) + " more balls of wool."); + stage = 50004; + break; + case 50004: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well I've got some wool. I've not managed to make it", "into a ball though."); + stage = 50005; + break; + case 50005: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well go find a spinning wheel then. You can find one", "on the first floor of the Lumbridge Castle, just walk east on", "the road outside my house and you'll find Lumbridge."); + stage = 50006; + break; + case 50006: + end(); + break; + case 50010: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Give 'em here then."); + stage = 5011; + break; + case 5011: + int removeAmount = SheepShearer.getWoolRemove(player); + if (SheepShearer.addWool(player)) { + if (SheepShearer.getWoolGiven(player) == 20) { + player.getQuestRepository().getQuest("Sheep Shearer").setStage(player, 90); + } + interpreter.sendDialogue("You give fred " + removeAmount + " balls of wool"); + stage = 5012; + } + break; + case 5012: + if (SheepShearer.getWoolGiven(player) == 20) { + player.getQuestRepository().getQuest("Sheep Shearer").setStage(player, 90); + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's the last of them."); + stage = 999; + break;// enough + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all I've got so far."); + stage = 5013; + break; + case 5013: + if (SheepShearer.getWoolGiven(player) == 20) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's the last of them."); + stage = 999; + break;// enough + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I need " + SheepShearer.getWoolCollect(player) + " before I can pay you."); + stage = 5014; + break; + case 999: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I guess I'd better pay you then."); + stage = 1000; + break; + case 1000: + end(); + Quest quest11 = player.getQuestRepository().getQuest("Sheep Shearer"); + quest11.finish(player); + player.removeAttribute("sheep-shearer:wool"); + break; + case 5014: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, I'll work on it."); + stage = 5015; + break; + case 5015: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 758 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FrincosDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FrincosDialogue.java new file mode 100644 index 000000000..708c9a3db --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FrincosDialogue.java @@ -0,0 +1,86 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the frinco npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FrincosDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FrincosDialogue} {@code Object}. + */ + public FrincosDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FrincosDialogue} {@code Object}. + * @param player the player. + */ + public FrincosDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FrincosDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello, how can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What are you selling?", "You can't; I'm beyond help.", "I'm okay, thank you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What are you selling?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You can't; I'm beyond help."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm okay, thank you."); + stage = 30; + break; + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 578 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FritzGlassBlowerDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/FritzGlassBlowerDialogue.java new file mode 100644 index 000000000..cbdf0dd21 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FritzGlassBlowerDialogue.java @@ -0,0 +1,203 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the fritz glass blower npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FritzGlassBlowerDialogue extends DialoguePlugin { + + /** + * Represents the molten glass. + */ + private static final Item MOLTEN_GLASS = new Item(1775); + + /** + * Constructs a new {@code FritzGlassBlowerDialogue} {@code Object}. + */ + public FritzGlassBlowerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FritzGlassBlowerDialogue} {@code Object}. + * @param player the player. + */ + public FritzGlassBlowerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new FritzGlassBlowerDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (!player.getSavedData().getGlobalData().isFritzGlass()) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello adventurer, welcome to the Entrana furnace."); + stage = 0; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah " + player.getUsername() + ", have you come to sell me some molten", "glass?"); + stage = 100; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like me to explain my craft to you?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Yes please. I'd be fascinated to hear what you do.", "No thanks, I doubt I'll ever turn my hand to glassblowing."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please. I'd be fascinated to hear what you do."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I doubt I'll ever turn my hand to glassblowing."); + stage = 22; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm extremely pleased to hear that! I've always wanted", "an apprentice. Let me talk to you through the secrets of", "glassblowing."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Glass is made from soda ash and silica. We get out", "soda ash by collecting seaweed from the rocks - the", "prevailing currents make the north-west corner of the", "island the best place to find it, it can also be found in"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "your nets sometimes when you're fishing, on Karamja", "island or at the Piscatoris Fishing Colonly in the nets", "there. To turn seaweed into soda ash, all you need to", "do is burn it on a fire. Feel free to use the range in"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "my house for that; it's the one directly west of here.", "Next we collect sand from the sandpit that you'll also", "find just west of here, there are other located in", "Yanille and Shilo Village."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You'll need a bucket to cary it in. Tell you what, you", "can have this old one of mine."); + stage = 15; + break; + case 15: + if (!player.getInventory().add(new Item(1925))) { + GroundItemManager.create(new GroundItem(new Item(1925), player.getLocation(), player)); + } + player.getSavedData().getGlobalData().setFritzGlass(true); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Bring the sand and the soda ash back here and melt", "them together in the furnace, and there you have it -", "molten glass!"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There are many things you can use the molten glass", "for once you have made it. Depending on how talented", "you are, you could try turning it into something, like a", "fishbowl, for example. If you'd like to try your hand at"); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "the fine art of glassblowing you can use my spare", "glassblowing pipe. I think I left it on the chest of", "drawers in my house this morning."); + stage = 18; + break; + case 18: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Alternatively I am always happy to buy the molten glass", "from you, saves me running about making it for", "myself."); + stage = 19; + break; + case 19: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That sounds good. How much will you pay me?"); + stage = 20; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Tell you what, because you've been interested in my", "art, I'll pay you the premium price of 20 gold pieces", "for each piece of molten glass you bring me."); + stage = 21; + break; + case 21: + end(); + break; + case 22: + end(); + break; + case 100: + interpreter.sendOptions("Select an Option", "Yes.", "No."); + stage = 101; + break; + case 101: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes."); + stage = 110; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No."); + stage = 120; + break; + } + break; + case 110: + if (!player.getInventory().containsItem(MOLTEN_GLASS)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Umm, not much point me trying to pay you for glass", "you don't have, is there?"); + stage = 111; + } else { + int amt = player.getInventory().getAmount(MOLTEN_GLASS); + Item remove = new Item(MOLTEN_GLASS.getId(), amt); + if (!player.getInventory().containsItem(remove)) { + end(); + return true; + } + if (player.getInventory().remove(remove)) { + player.getInventory().add(new Item(995, amt * 20)); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Pleasure doing business with you " + player.getUsername() + "."); + stage = 118; + } + } + break; + case 111: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, actually, if you don't mind..."); + stage = 112; + break; + case 112: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I guess you've never heard of a rhetorical question", "then. I'll make it simple for you. You bring glass, me", "pay shiny gold coins."); + stage = 113; + break; + case 113: + end(); + break; + case 118: + end(); + break; + case 120: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh."); + stage = 121; + break; + case 121: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "...errr, well should you get any I'm quite happy to pay", "for it. Remember, I'll pay you 20 gold pieces for each", "piece of molten glass you get for me."); + stage = 122; + break; + case 122: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4909 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/FurTradePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/FurTradePlugin.java new file mode 100644 index 000000000..fa8791505 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/FurTradePlugin.java @@ -0,0 +1,75 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the plugin used for the fur trader. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FurTradePlugin extends DialoguePlugin { + + /** + * Constructs a new {@code FurTradePlugin} {@code Object}. + */ + public FurTradePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FurTradePlugin} {@code Object}. + * @param player the player. + */ + public FurTradePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FurTradePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to trade in fur?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes.", "No."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 20; + break; + } + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 573 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GWDKnightDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GWDKnightDialogue.java new file mode 100644 index 000000000..cfd65cca9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GWDKnightDialogue.java @@ -0,0 +1,114 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the dying knight dialogue. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class GWDKnightDialogue extends DialoguePlugin { + + /** + * Represents the scroll item. + */ + private static final Item SCROLL = new Item(11734); + + /** + * Constructs a new {@code GWDKnightDialogue} {@code Object}. + */ + public GWDKnightDialogue() { + NPCDefinition.forId(6201).getHandlers().put("option:talk-to", new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + NPC npc = (NPC) node; + return player.getDialogueInterpreter().open(6201, npc); + } + + @Override + public Location getDestination(Node n, Node node) { + return node.getLocation().transform(0, -1, 0); + } + }); + } + + /** + * Constructs a new {@code GWDKnightDialogue} {@code Object}. + * @param player the player. + */ + public GWDKnightDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GWDKnightDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if ((player.getConfigManager().get(1048) & 16) != 0) { + player.getPacketDispatch().sendMessage("The knight has already died."); + return false; + } + player("Who are you? What are you doing here in the snow?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("My name is...Sir Gerry. I am...a member of a", "secret...society of knights. My time is short and I", "need...your help."); + stage = 1; + break; + case 1: + player("A secret society of knights? What a surprise! Is there", "an old charter or decree that says if you're a knight", "you have to belong to a secret order?"); + stage = 2; + break; + case 2: + npc("I'm sorry, my friend... I do not understand your", "meaning. Please, time is short... Take this scroll to Sir", "Tiffy. You will find him in Falador park... You should", "not...read it... It contains information for his eyes only."); + stage = 3; + break; + case 3: + if (player.getInventory().add(SCROLL)) { + interpreter.sendItemMessage(11734, "The knight hands you a scroll."); + player.varpManager.get(1048).setVarbit(4,1).send(player); + stage = 5; + } else { + stage = 4; + } + break; + case 4: + interpreter.sendDialogue("The knight tries to give you something, but your inventory is full."); + stage = 5; + break; + case 5: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6201 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GabootyDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/GabootyDialogue.kt new file mode 100644 index 000000000..970dd610c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GabootyDialogue.kt @@ -0,0 +1,138 @@ +package core.game.content.dialogue + +import com.sun.org.apache.xpath.internal.operations.Bool +import core.cache.def.impl.NPCDefinition +import core.cache.def.impl.ObjectDefinition +import core.game.content.global.shop.Shop +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.system.config.ShopParser +import core.game.system.config.ShopParser.Companion.SHOPS +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * Dialogue for Gabooty + * @author qmqz + */ +@Initializable +class GabootyDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY, "What do you do here?").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FRIENDLY,"Not much really... I run a local shop which earns", "me a few trading sticks, but that's about it.", "I keep myself to myself really.").also { stage++ } + 1 -> player(FacialExpression.FRIENDLY, "What are trading sticks?").also { stage++ } + 2 -> npc(FacialExpression.FRIENDLY, + "They're the local currency Bwana, ", + "it's used in Tai Bwo Wannai, there's usually", + "some odd jobs that need doing around the village", + "which you could do to earn some trading sticks.").also { stage++ } + 3 -> npc(FacialExpression.FRIENDLY, + "Or, if you have something which the local villagers", + "might like, you could sell it to me and I'll pay", + "you for it in trading sticks.").also { stage++ } + + 4 -> interpreter.sendOptions("Select an Option", + "What sort of things do the local villagers like?", + "You run a shop?", + "I want to ask another question.", + "Ok, thanks.").also { stage++ } + + 5 -> + when (buttonId) { + 1 -> player("What sort of things do the local villagers like?").also { stage = 10 } + 2 -> player("You run a shop?").also { stage = 21 } + 3 -> player("I want to ask another question.").also { stage = 23 } + 4 -> player("Ok, thanks.").also { stage = 99 } + } + + 10 -> npc(FacialExpression.FRIENDLY, + "Gnome cocktails! It's amazing but we all just love them!", + "Luckily I've managed to get stocks of the gnome made", + "cocktails and I supply those to my favourite customers.", + "However, many of the customers really like the cocktails").also { stage++ } + 11 -> npc(FacialExpression.FRIENDLY, + "made by the adventurers passing through this way.", + "If you ever happen to have any, bring them my way! ", + "I'll give you a good deal on it that's for sure!").also { stage++ } + 12 -> player(FacialExpression.FRIENDLY, "How did the villagers ever get to try any gnome cocktails?").also { stage++ } + 13 -> npc(FacialExpression.FRIENDLY, + "I think it was that gnome pilot who crashed his glider,", + "perhaps he had a little mini-bar on board?", + "Come to think about it, you'd expect the little guy to get ", + "his stuff together and move on out of here wouldn't you?").also { stage++ } + 14 -> npc(FacialExpression.FRIENDLY, "He must love the jungle to have stayed here so long!").also { stage = 4 } + + 21 -> npc(FacialExpression.FRIENDLY, + "Yes, it's the Tai Bwo cooperative... catchy name huh!", + "We sell a few local village trinkets and tools.", + "Also, there are a few items that we're actually", + "looking to stock for the locals' sake.").also { stage++ } + 22 -> npc(FacialExpression.FRIENDLY, + "If you happen across any of them please bring them to me,", + "I'll pay a good price for them.", + "I'm sure you'll find the prices very reasonable.").also { stage++ } + 23 -> interpreter.sendOptions("Select an Option", + "What are trading sticks?", + "You run a shop?", + "Can I take a look at what you have to sell?", + "Why do you only take one sort of Gnome cocktail?", + "I want to ask another question.").also { stage++ } + + 24 -> + when (buttonId) { + 1 -> player("What are trading sticks?").also { stage = 2 } + 2 -> player("You run a shop?").also { stage = 21 } + 3 -> player("Can I take a look at what you have to sell?").also { stage = 30 } + 4 -> player("Why do you only take one sort of Gnome cocktail?").also { stage = 40 } + 5 -> player("I want to ask another question.").also { stage = 4 } + } + + 30 -> npc(FacialExpression.FRIENDLY, "Sure you can...which shop would you like to see?", + "The Cooperative or Drinks store?").also { stage++ } + + 31 ->interpreter.sendOptions("Select an Option", + "The Cooperative", + "The Drinks Store", + "None thanks...").also { stage++ } + + 32 -> + when (buttonId) { //gotta add shops + 1 -> player("The Cooperative").also { stage = 90 } + 2 -> player("The Drinks Store").also { stage = 91 } + 3 -> player("None thanks...").also { stage = 99 } + } + + 40 -> npc(FacialExpression.FRIENDLY, "It's funny that, actually. I've managed to get a ", + "good deal with the pilot of that gnome glider. He can supply", + "me directly now. However, it's really interesting that the ", + "local villagers really like the gnome cocktails made by the").also { stage++ } + 41 -> npc(FacialExpression.FRIENDLY, "adventurers passing through this way.").also { stage++ } + 42 -> player(FacialExpression.FRIENDLY, "Why, what's the difference?").also { stage++ } + 43 -> npc(FacialExpression.FRIENDLY, "I think it may just be that they're made fresher,", + "or there is a slight twist in the flavour of the drink,", + "you know, a little more of this, a little less of that, it all", + "adds up and makes for an interesting tipple!").also { stage = 23 } + + 90 -> end().also { ShopParser.Companion.openUid(player,226) } + 91 -> end().also { ShopParser.Companion.openUid(player,227) } + 99 -> end() + } + + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return GabootyDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(2519, 2520, 2521) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GalahadDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GalahadDialogue.java new file mode 100644 index 000000000..497892a9f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GalahadDialogue.java @@ -0,0 +1,78 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.tools.Items; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; + +/** + * Handles the Galahad dialogue + * @author afaroutdude + */ +@Initializable +public class GalahadDialogue extends DialoguePlugin { + + /** + * Represnets the bow item. + */ + private final Item TEA = new Item(Items.CUP_OF_TEA_712); + + public GalahadDialogue() {} + + public GalahadDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GalahadDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Welcome to my home. It's rare for me to have guests!", "Would you like a cup of tea? I'll just put the kettle on."); + stage = 2; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + break; + case 2: + sendDialogue("Brother Galahad hangs a kettle over the fire."); + stage++; + break; + case 3: + // This stage seems to break off based on the quest Holy Grail + // https://www.youtube.com/watch?v=XPTkSDyKpWs + player("Do you get lonely out here on your own?"); + stage++; + break; + case 4: + npc("Sometimes I do, yes. Still not many people to share my", + "solidarity with, as most of the religious men around here", + "are worshippers of Saradomin. Half a moment, your cup", + "of tea is ready."); + stage++; + break; + case 5: + sendDialogue("Brother Galahad gives you a cup of tea."); + player.getInventory().add(TEA); + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 0, 2); + stage = 999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 218 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GamFredDialoue.java b/Server/src/main/java/Server/core/game/content/dialogue/GamFredDialoue.java new file mode 100644 index 000000000..0eb75084f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GamFredDialoue.java @@ -0,0 +1,202 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the gam fred npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GamFredDialoue extends DialoguePlugin { + + /** + * Constructs a new {@code GamFredDialoue} {@code Object}. + */ + public GamFredDialoue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GamFredDialoue} {@code Object}. + * @param player the player. + */ + public GamFredDialoue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GamFredDialoue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length > 1) { + interpreter.sendDialogues(player, null, "May I have a shield please?"); + stage = 13; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Ello there. I'm Gamfred, the engineer in this here guild.", "Have you seen my catapult?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "That's not a catapult, it's a large crossbow.", "Yes, beautiful piece of enigneering.", "No, where is it?", "May I claim my tokens please?", "Bye!"); + stage = 1; + break; + case 1: + if (buttonId == 1) { + interpreter.sendDialogues(player, null, "That's not a catapult, it's a large crossbow."); + stage = 2; + } else if (buttonId == 2) { + interpreter.sendDialogues(player, null, "Yes, beautiful piece of engineering."); + stage = 4; + } else if (buttonId == 3) { + interpreter.sendDialogues(player, null, "No, where is it?"); + stage = 15; + } else if (buttonId == 4) { + end(); + player.getDialogueInterpreter().open("wg:claim-tokens", npc.getId()); + } else if (buttonId == 5) { + interpreter.sendDialogues(player, null, "Bye!"); + stage = 16; + } + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.CHILD_SAD, "WHAT!? I'll have you know that is the finest piece of", "dwarven engineering for miles around! How DARE you", "insult my work!"); + stage = 3; + break; + case 3: + end(); + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Nice to meet someone who appreicates fine work, have", "you tried it out yet?"); + stage = 5; + break; + case 5: + interpreter.sendOptions("Select an Option", "Yes", "No, how do I do that?"); + stage = 6; + break; + case 6: + if (buttonId == 1) { + interpreter.sendDialogues(player, null, "Yes."); + stage = 7; + } else if (buttonId == 2) { + interpreter.sendDialogues(player, null, "No, how do I do that?"); + stage = 17; + } + break; + case 7: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "What did you think?"); + stage = 8; + break; + case 8: + interpreter.sendOptions("Select an Option", "It was ok I guess.", "It was fun!", "I didn't like it.", "May i have a shield please?"); + stage = 9; + break; + case 9: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "It was ok I guess."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, null, "It was fun!"); + stage = 11; + break; + case 3: + interpreter.sendDialogues(player, null, "I didn't like it."); + stage = 12; + break; + case 4: + interpreter.sendDialogues(player, null, "May i have a shield please?"); + stage = 13; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Well I guess not everyone will like it."); + stage = 3; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Glad to hear it. Try it again sometime. We have more", "tests to run."); + stage = 3; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Well I guess not everyone will like it. But give it another", " chance before you go."); + stage = 3; + break; + case 13: + if (player.getBank().contains(8856, 1) || player.getInventory().contains(8856, 1) || player.getEquipment().contains(8856, 1)) { + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Silly muffin, you have one already!"); + stage = 3; + } else { + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "ofcourse!"); + stage = 14; + } + break; + case 14: + if (player.getInventory().hasSpaceFor(new Item(8856))) { + player.getInventory().add(new Item(8856)); + interpreter.sendItemMessage(8856, "The dwarf hands you a large shield."); + stage = 3; + } else { + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Muffin make some room in your inventory first!"); + stage = 3; + } + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Are ye blind lad? Tis over there in the next room with me", "assistant working it!"); + stage = 3; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Come back soon! My catapult needs more test subjects."); + stage = 3; + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Well ye take the big defence shield in both hands and", "watch the catapult. My assitant will fire different things", "at you and you need to defend against them. To see", "what might be comming your way and wich defensive"); + stage = 18; + break; + case 18: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "mode to choose, see the poster on the wall."); + stage = 19; + break; + case 19: + interpreter.sendOptions("Select an Option", "May I have a shield please?", "Sounds boring."); + stage = 20; + break; + case 20: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "May I have a shield please?"); + stage = 13; + break; + case 2: + interpreter.sendDialogues(player, null, "Sounds boring."); + stage = 21; + break; + } + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.CHILD_NORMAL, "Your loss..."); + stage = 3; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4287 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GarvDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GarvDialogue.java new file mode 100644 index 000000000..2c25885a4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GarvDialogue.java @@ -0,0 +1,86 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the garv dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GarvDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GarvDialogue} {@code Object}. + */ + public GarvDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GarvDialogue} {@code Object}. + * @param player the player. + */ + public GarvDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GarvDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello. What do you want?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Can I go in there?", "I want for nothing!"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I go in there?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I want for nothing!"); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No. In there is private."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You're one of a very lucky few then."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 788 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GeeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GeeDialogue.java new file mode 100644 index 000000000..74dc447e1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GeeDialogue.java @@ -0,0 +1,126 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the gee npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GeeDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GeeDialogue} {@code Object}. + */ + public GeeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GeeDialogue} {@code Object}. + * @param player the player. + */ + public GeeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GeeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there, can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What's up?", "Are there any quests I can do here?", "Can I buy your stick?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's up?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you know of any quests I can do?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I buy your stick?"); + stage = 30; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I assume the sky is up.."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You assume?"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yeah, unfortunately I don't seem to be able to look up."); + stage = 13; + break; + case 13: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nope, sorry."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "It's not a stick! I'll have you know it's a very powerful", "staff!"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Really? Show me what it can do!"); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Um..It's a bit low on power at the moment.."); + stage = 33; + break; + case 33: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "It's a stick isn't it?"); + stage = 34; + break; + case 34: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "...Ok it's a stick.. But only while I save up for a staff.", "Zaff in Varrock square sells them in his shop."); + stage = 35; + break; + case 35: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well good luck with that."); + stage = 36; + break; + case 36: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2237 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GemMerchantDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GemMerchantDialogue.java new file mode 100644 index 000000000..91fc251f7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GemMerchantDialogue.java @@ -0,0 +1,60 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the gem merchant dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GemMerchantDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GemMerchantDialogue} {@code Object}. + */ + public GemMerchantDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GemMerchantDialogue} {@code Object}. + * @param player the player. + */ + public GemMerchantDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GemMerchantDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Here, look at my lovely gems."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 570 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GemTradeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GemTradeDialogue.java new file mode 100644 index 000000000..eb0ea5af7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GemTradeDialogue.java @@ -0,0 +1,80 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the gem trade dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GemTradeDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GemTradeDialogue} {@code Object}. + */ + public GemTradeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GemTradeDialogue} {@code Object}. + * @param player the player. + */ + public GemTradeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GemTradeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello adventurer! Can I interest you in any of my gems?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes!", "No, thanks you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes!"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks though."); + stage = 20; + break; + + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 540 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GeoffreyDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/GeoffreyDialogue.kt new file mode 100644 index 000000000..089689824 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GeoffreyDialogue.kt @@ -0,0 +1,77 @@ +package core.game.content.dialogue + +import core.Util +import core.tools.Items +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.Item +import core.plugin.Initializable + +@Initializable +class GeoffreyDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun open(vararg args: Any?): Boolean { + val diary = player.achievementDiaryManager.getDiary(DiaryType.SEERS_VILLAGE) + if (diary.levelRewarded.any()) { + player("Hello there. Are you Geoff-erm-Flax? I've been told that", "you'll give me some flax.") + // If 1 day has not passed since last flax reward + if (player.getAttribute("diary:seers:flax-timer", 0) > System.currentTimeMillis()) { + stage = 98 + return true + } + // If player cannot receive flax reward + if (!player.inventory.hasSpaceFor(Item(Items.FLAX_1780, 1))) { + stage = 99 + return true + } + // Determine flax reward by seers diary reward status + when (diary.reward) { + -1 -> stage = 999 + 0 -> stage = 100 + 1 -> stage = 101 + 2 -> stage = 102 + } + } else { + player("Hello there. You look busy.") + stage = 0 + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return GeoffreyDialogue(player) + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 999 -> end() + 0 -> npc("Yes, I am very busy. Picking GLORIOUS flax.", "The GLORIOUS flax won't pick itself. So I pick it.", "I pick it all day long.").also { stage++ } + 1 -> player("Wow, all that flax must really mount up. What do you do with it all?").also { stage++ } + 2 -> npc("I give it away! I love picking the GLORIOUS flax,", "but, if I let it all mount up, I wouldn't have any", "room for more GLORIOUS flax.").also { stage++ } + 3 -> player("So, you're just picking the flax for fun? You must", "really like flax.").also { stage++ } + 4 -> npc("'Like' the flax? I don't just 'like' flax. The", "GLORIOUS flax is my calling, my reason to live.", "I just love the feeling of it in my hands!").also { stage++ } + 5 -> player("Erm, okay. Maybe I can have some of your spare flax?").also { stage++ } + 6 -> npc("No. I don't trust outsiders. Who knows what depraved", "things you would do with the GLORIOUS flax? Only", "locals know how to treat it right.").also { stage++ } + 7 -> player("I know this area! It's, erm, Seers' Village. There's", "a pub and, er, a bank.").also { stage++ } + 8 -> npc("Pah! You call that local knowledge? Perhaps if you", "were wearing some kind of item from one of the", "seers, I might trust you.").also { stage = 999 } + + 98 -> npc("I've already given you your GLORIOUS flax", "for the day. Come back tomorrow.").also { stage = 999 } // TODO find accurate dialogue + 99 -> npc("Yes, but your inventory is full. Come back", "when you have some space for GLORIOUS flax.").also { stage = 999 } // TODO find accurate dialogue + 100 -> {rewardFlax(30, "Yes. The seers have instructed me to give you an", "allowance of 30 GLORIOUS flax a day. I'm not going", "to argue with them, so here you go.")} // TODO find accurate dialogue + 101 -> {rewardFlax(60, "Yes. Stankers has instructed me to give you an", "allowance of 60 GLORIOUS flax a day. I'm not going", "to argue with a dwarf, so here you go.")} // TODO find accurate dialogue + 102 -> {rewardFlax(120, "Yes. Sir Kay has instructed me to give you an", "allowance of 120 GLORIOUS flax a day. I'm not going", "to argue with a knight, so here you go.")} + } + return true + } + + fun rewardFlax(n: Int, vararg messages: String): Unit { + npc(*messages) + player.inventory.add(Item(Items.FLAX_1780, n)) + player.setAttribute("/save:diary:seers:flax-timer", Util.nextMidnight(System.currentTimeMillis())) + stage = 999 + } + + override fun getIds(): IntArray { + return intArrayOf(8590) + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GerrantDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GerrantDialogue.java new file mode 100644 index 000000000..7acc2ddc5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GerrantDialogue.java @@ -0,0 +1,80 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the gerrant npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GerrantDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GerrantDialogue} {@code Object}. + */ + public GerrantDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GerrantDialogue} {@code Object}. + * @param player the player. + */ + public GerrantDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GerrantDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome! You can buy fishing equipment at my store.", "We'll also buy anything you catch off you."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Choose an option:", "Let's see what you've got then.", "Sorry, I'm not interested."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Let's see what you've got then."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I'm not interested."); + stage = 20; + break; + + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 558 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GertrudeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GertrudeDialogue.java new file mode 100644 index 000000000..f2cfb7038 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GertrudeDialogue.java @@ -0,0 +1,391 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the gertrude dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GertrudeDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 100); + + /** + * Constructs a new {@code GertrudeDialogue} {@code Object}. + */ + public GertrudeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GertrudeDialogue} {@code Object}. + * @param player the player. + */ + public GertrudeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GertrudeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + switch (quest.getStage(player)) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, are you ok?"); + break; + case 10: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello Gertrude."); + stage = 210; + break; + case 20: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello Gertrude."); + stage = 230; + break; + case 30: + case 50: + interpreter.sendDialogues(npc, null, "Please bring me my cat back!"); + stage = 235; + break; + case 40: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello Gertrude."); + stage = 300; + break; + case 60: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello Gertrude. Fluffs ran off with her kitten."); + stage = 320; + break; + case 100: + interpreter.sendDialogues(player, null, "Hello again."); + stage = 500; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do I look ok? Those kids drive me crazy."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm sorry. It's just that I've lost her."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Lost who?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Fluffs, poor Fluffs. She never hurt anyone."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who's Fluffs?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "My beloved feline friends Fluffs. She's been purring by", "my side for almost a decade. Please, could you go", "search for her while I look over the kids?"); + stage = 6; + break; + case 6: + interpreter.sendOptions("Select an Option", "Well, I suppose I could.", "Sorry, I'm too busy to play pet rescue."); + stage = 7; + break; + case 7: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, I suppose I could."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I'm to busy too play pet rescue."); + stage = 200; + break; + } + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Really? Thank you so much! I really have no idea", "where she could be!"); + stage = 101; + break; + case 101: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I think my sons, Shilop and Wilough, saw the cat last.", "They'll be out in the market place."); + stage = 102; + break; + case 102: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Alright then, I'll see what I can do."); + stage = 103; + break; + case 103: + quest.start(player); + player.getQuestRepository().syncronizeTab(player); + end(); + break; + case 200: + end(); + break; + case 210:// start of stage 10 + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Have you seen my poor Fluffs?"); + stage = 211; + break; + case 211: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm afraid not."); + stage = 212; + break; + case 212: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What about Shilop?"); + stage = 213; + break; + case 213: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No sign of him either."); + stage = 214; + break; + case 214: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmmm...strange, he should be at the market."); + stage = 215; + break; + case 215: + end(); + break; + case 230: + interpreter.sendDialogues(npc, null, "Hello again, did you manage to find Shilop? I can't keep", "an eye on him for the life of me."); + stage = 231; + break; + case 231: + interpreter.sendDialogues(player, null, "He does seem quite a handful."); + stage = 232; + break; + case 232: + interpreter.sendDialogues(npc, null, "You have no idea! Did he help at all?"); + stage = 233; + break; + case 233: + interpreter.sendDialogues(player, null, "I think so, I'm just going to look now."); + stage = 234; + break; + case 234: + interpreter.sendDialogues(npc, null, "Thanks again adventurer!"); + stage = 235; + break; + case 235: + end(); + break; + case 300: + interpreter.sendDialogues(npc, null, "Hi! Did you find fluffs?"); + stage = 301; + break; + case 301: + interpreter.sendDialogues(player, null, "Yes! But she won't follow me."); + stage = 302; + break; + case 302: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You should try tempting her with a", "seasoned sardine! Those are her favourite snacks."); + stage = 303; + break; + case 303: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks for the advice!"); + stage = 304; + break; + case 304: + end(); + break; + case 320: + interpreter.sendDialogues(npc, null, "You're back! Thank you! Thank you! Fluffs just came", "back! I think she was just upset as she couldn't find her", "kitten."); + stage = 321; + break; + case 321: + interpreter.sendDialogue("Gertrude gives you a hug."); + npc.face(player); + stage = 322; + break; + case 322: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If you hadn't found her kitten it would have died out", "there!"); + stage = 323; + break; + case 323: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's ok, I like to do my bit."); + stage = 324; + break; + case 324: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I don't know how to thank you. I have no real material", "possesions. I do have kittens! I can only really look", "after one."); + stage = 325; + break; + case 325: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, if it needs a home."); + stage = 326; + break; + case 326: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I would sell it to my cousin in West Ardougne. I hear", "there's a rat epidemic there. But it's too far."); + stage = 327; + break; + case 327: + if (player.getInventory().freeSlots() == 0) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't seem to have enough inventory space."); + stage = 1000; + break; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Here you go, look after her and thank you again!"); + stage = 328; + } + break; + case 328: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh by the way, the kitten can live in your backpack,", "but to make it grow you must take it out and feed and", "stroke it often."); + stage = 329; + break; + case 329: + interpreter.sendDialogue("Gertrude gives you a kitten."); + stage = 330; + break; + case 330: + player.getPacketDispatch().sendMessage("...and some food!"); + end(); + quest.finish(player); + player.getQuestRepository().syncronizeTab(player); + break; + case 331: + break; + case 1000: + interpreter.sendDialogues(npc, null, "Good good, See you again."); + stage = 1001; + break; + case 1001: + end(); + break; + case 500: + interpreter.sendDialogues(npc, null, "Hello my dear. How's things?"); + stage = 501; + break; + case 501: + interpreter.sendOptions("Select an Option", "I'm fine, thanks.", "Do you have any more kittens?"); + stage = 502; + break; + case 502: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I'm fine, thanks."); + stage = 1000; + break; + case 2: + interpreter.sendDialogues(player, null, "Do you have any more kittens?"); + stage = 503; + break; + } + break; + case 503: + boolean has = false; + int[] kittens = new int[] { 1555, 1556, 1557, 1558, 1559, 1560, 7583 }; + for (int i : kittens) { + // if (player.getFamiliarManager().hasFamiliar()) {TODO:Pet + // if + // (player.getFamiliarManager().getFamiliar().getDetails() + // instanceof PetDetails) { + // final PetDetails details = ((PetDetails) + // player.getFamiliarManager().getFamiliar().getDetails()); + // if (details.getPet().getBabyItemId() == i) { + // has = true; + // break; + // } + // } + // } + if (player.getInventory().contains(i, 1) || player.getBank().contains(i, 1)) { + has = true; + break; + } + } + if (has) { + interpreter.sendDialogues(npc, null, "Aren't you still raising that other kitten? Only once it's", "fully grown and it no longer needs your attention will", "I let you have another kitten."); + stage = 505; + } else { + interpreter.sendDialogues(npc, null, "Indeed I have. They are 100 coins each, do you want", "one?"); + stage = 900; + } + break; + case 900: + interpreter.sendOptions("Select an Option", "Yes please.", "No thanks."); + stage = 901; + break; + case 901: + switch (buttonId) { + case 1:// yes + if (!player.getInventory().contains(995, 100)) { + player.getPacketDispatch().sendMessage("You need a 100 coins to buy a kitten."); + end(); + break; + } else { + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + end(); + break; + } + interpreter.sendDialogues(player, null, "Yes please."); + stage = 903; + } + break; + case 2:// no + end(); + break; + } + break; + case 903: + interpreter.sendDialogues(npc, null, "Ok then, here you go."); + stage = 904; + break; + case 904: + interpreter.sendDialogues(player, null, "Thanks."); + stage = 905; + break; + case 905: + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (player.getInventory().remove(COINS)) { + interpreter.sendDialogue("Gertrude gives you another kitten."); + stage = 906; + final Item kitten = getKitten(); + player.getInventory().add(kitten); + player.getFamiliarManager().summon(kitten, true); + } + break; + case 906: + end(); + break; + case 505: + end(); + break; + } + return true; + } + + /** + * Method used to get a random kitten. + * @return the item. + */ + public Item getKitten() { + return new Item(RandomFunction.random(1555, 1560)); + } + + @Override + public int[] getIds() { + return new int[] { 780 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GertrudesCatDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GertrudesCatDialogue.java new file mode 100644 index 000000000..b525aedf4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GertrudesCatDialogue.java @@ -0,0 +1,169 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the gertrude cat dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GertrudesCatDialogue extends DialoguePlugin { + + /** + * Represents the animation of bending down. + */ + private final Animation BEND_DOWN = Animation.create(827); + + /** + * Constructs a new {@code GertrudesCatDialogue} {@code Object}. + */ + public GertrudesCatDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GertrudesCatDialogue} {@code Object}. + * @param player the player. + */ + public GertrudesCatDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GertrudesCatDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "Talk-with", "Pick-up", "Stroke"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + switch (stage) { + case 545: + end(); + break; + case 0: + switch (buttonId) { + case 1: + if (quest.getStage(player) < 60) { + end(); + npc.sendChat("Miaoww"); + } else { + interpreter.sendDialogues(player, null, "Oh, it looks like Fluffs has returned.", "I'd better leave her alone."); + stage = 99; + } + break; + case 2: + close(); + player.getPulseManager().run(new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + switch (count++) { + case 0: + player.animate(BEND_DOWN); + break; + case 2: + npc.sendChat("Hisss!"); + break; + case 3: + player.sendChat("Ouch!"); + break; + case 4: + if (quest.getStage(player) == 40) { + interpreter.sendDialogue("The cat seems afraid to leave.", "In the distance you can hear kittens mewing..."); + stage = 545; + return true; + } + if (quest.getStage(player) == 30) { + interpreter.sendDialogue("Maybe the cat is hungry?"); + stage = 545; + return true; + } + if (quest.getStage(player) == 50) { + end(); + return true; + } + end(); + interpreter.sendDialogue("Maybe the cat is thirsty?"); + stage = 545; + break; + } + return count == 5; + } + }); + break; + case 545: + end(); + break; + case 3: + close(); + player.getPulseManager().run(new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + switch (count++) { + case 0: + player.animate(BEND_DOWN); + break; + case 2: + npc.sendChat("Hisss!"); + break; + case 3: + player.sendChat("Ouch!"); + break; + case 4: + if (quest.getStage(player) == 40) { + return true; + } + interpreter.sendDialogue("Perhaps the cat want's something?"); + stage = 545; + break; + } + return count == 5; + } + + }); + if (quest.getStage(player) == 40) { + return true; + } + GameWorld.getPulser().submit(new Pulse(7, player) { + @Override + public boolean pulse() { + end(); + return true; + } + + }); + break; + } + break; + case 99: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2997 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GhommalDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GhommalDialogue.java new file mode 100644 index 000000000..36a784dd7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GhommalDialogue.java @@ -0,0 +1,92 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the ghommal dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GhommalDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GhommalDialogue} {@code Object}. + */ + public GhommalDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GhommalDialogue} {@code Object}. + * @param player the player. + */ + public GhommalDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GhommalDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getSkills().getLevel(Skills.ATTACK) + player.getSkills().getLevel(Skills.STRENGTH) >= 130 || player.getSkills().getLevel(Skills.ATTACK) == 99 || player.getSkills().getLevel(Skills.STRENGTH) == 99) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ghommal welcome you to Warrior Guild!"); + stage = 10; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You not pass. You too weedy."); + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What? But I'm a warrior!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Heehee... he say he warrior... I not heard that one", "for... at leas' 5 minutes!"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Go on, let me in, you know you want to. I could...", "make it worth your while..."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No! You is not a strong warrior, you not enter till you", "bigger, Ghommal does not takes bribes."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ghommal stick to Warrior's Code of Honour. When", "you a bigger, stronger warriror, you come back."); + stage = 5; + break; + case 5: + end(); + break; + case 10: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Umm...thank you, I think."); + stage = 11; + break; + case 11: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4285 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GnomeSpiritTreeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GnomeSpiritTreeDialogue.java new file mode 100644 index 000000000..9af8e9c8a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GnomeSpiritTreeDialogue.java @@ -0,0 +1,136 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the dialogue plugin used for the gnome spirit tree. + * + * @author 'Vexia + * @author SonicForce41 + */ +@Initializable +public final class GnomeSpiritTreeDialogue extends DialoguePlugin { + + /** + * Represents the locations to travel to. + */ + private static final Location[] LOCATIONS = new Location[]{Location.create(2542, 3170, 0), Location.create(2461, 3444, 0), Location.create(2556, 3259, 0), Location.create(3184, 3508, 0)}; + + /** + * Represents the animations to use. + */ + private static final Animation[] ANIMATIONS = new Animation[]{new Animation(7082), new Animation(7084)}; + + /** + * Represents the graphics to use. + */ + private static final Graphics[] GRAPHICS = new Graphics[]{new Graphics(1228), new Graphics(1229)}; + + /** + * Constructs a new {@code GnomeSpiritTreeDialogue} {@code Object}. + */ + public GnomeSpiritTreeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GnomeSpiritTreeDialogue} {@code Object}. + * + * @param player the player. + */ + public GnomeSpiritTreeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GnomeSpiritTreeDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogues(3636, null, "If you are a friend of the gnome people, you are a", "friend of mine, Do you wish to travel?"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + interpreter.sendOptions("Where would you like to go?", "Tree Gnome Village", "Tree Gnome Stronghold", "Battlefield of Khazard", "Grand Exchange"); + stage = 0; + break; + case 0: + Location location = null; + stage = 1; + switch (buttonId) { + case 1: + location = LOCATIONS[0]; + sendTeleport(player, location); + break; + case 2: + location = LOCATIONS[1]; + sendTeleport(player, location); + break; + case 3: + location = LOCATIONS[2]; + sendTeleport(player, location); + break; + case 4: + location = LOCATIONS[3]; + sendTeleport(player, location); + break; + } + return true; + } + return true; + } + + /** + * Method used to send a gnome teleport. + * + * @param player the player. + * @param location the location. + */ + private void sendTeleport(final Player player, final Location location) { + end(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int loop; + + @Override + public boolean pulse() { + if (loop == 0) { + player.animate(ANIMATIONS[0]); + player.graphics(GRAPHICS[0]); + } else if (loop == 3) { + player.getProperties().setTeleportLocation(location); + } else if (loop == 5) { + player.animate(ANIMATIONS[1]); + player.graphics(GRAPHICS[1]); + player.face(null); + if (player.getLocation().withinDistance(Location.create(3184, 3508, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 5); + } + } + loop++; + return loop == 8; + } + }); + } + + @Override + public int[] getIds() { + return new int[]{1293, 1317}; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GnomeTrainerPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/GnomeTrainerPlugin.java new file mode 100644 index 000000000..1cc5945e7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GnomeTrainerPlugin.java @@ -0,0 +1,110 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the dialogue plugin used for the gnome trainer. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GnomeTrainerPlugin extends DialoguePlugin { + + /** + * Constructs a new {@code GnomeTrainerPlugin} {@code Object}. + */ + public GnomeTrainerPlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GnomeTrainerPlugin} {@code Object}. + * @param player the player. + */ + public GnomeTrainerPlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GnomeTrainerPlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int rand = RandomFunction.random(0, 3); + switch (rand) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, what is this place?"); + stage = 3; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello how are you?"); + stage = 7; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "This is fun!"); + stage = 10; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This isn't a grannies' tea party, let's see some sweat", "human. Go! Go! Go!"); + stage = 1; + break; + case 1: + end(); + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This, my friend, is where we train. Here we improve", "out agility. It's an essential skill."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "It looks easy enough."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If you complete the course in order from the slippery", "log to the end, your agility will increase much faster", "than by repeating just one obstacle."); + stage = 6; + break; + case 6: + end(); + break; + case 7: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm amazed by how much humans chat. The sign over", "there says training area, not pointless conversation area."); + stage = 8; + break; + case 8: + end(); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is training soldier. If you want fun go make some", "cocktails."); + stage = 11; + break; + case 11: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 162 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GoblinVillageDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GoblinVillageDialogue.java new file mode 100644 index 000000000..a69bab074 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GoblinVillageDialogue.java @@ -0,0 +1,173 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the goblin village dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GoblinVillageDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GoblinVillageDialogue} {@code Object}. + */ + public GoblinVillageDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GoblinVillageDialogue} {@code Object}. + * @param player the player. + */ + public GoblinVillageDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GoblinVillageDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int rand = RandomFunction.random(5); + switch (rand) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I kill you human!"); + stage = 0; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Go away smelly human!"); + stage = 300; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Happy goblin new century!"); + stage = 100; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What you doing here?"); + stage = 200; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Brown armour best!"); + stage = 800; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Go away smelly human!"); + stage = 300; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + npc.getProperties().getCombatPulse().attack(player); + break; + case 100: + interpreter.sendOptions("Select an Option", "Happy new century!", "What is the goblin new century?"); + stage = 101; + break; + case 101: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Happy new century!"); + stage = 169; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is the goblin new century?"); + stage = 102; + break; + } + break; + case 169: + end(); + break; + case 102: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You tell human secrets!"); + stage = 103; + break; + case 103: + end(); + break; + case 200: + interpreter.sendOptions("Select an Option", "I'm here to kill all you goblins!", "I'm just looking around."); + stage = 201; + break; + case 201: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm here to kill all you goblins!"); + stage = 143; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm just looking around."); + stage = 260; + break; + } + break; + case 143: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I kill you!"); + stage = 0; + break; + case 260: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Me not sure that allowed. You have to check with", "generals."); + stage = 261; + break; + case 261: + end(); + break; + case 300: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What you call me?"); + stage = 301; + break; + case 301: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I kill you human!"); + stage = 0; + break; + case 800: + interpreter.sendOptions("Select an Option", "Err or.", "Why is brown best?"); + stage = 801; + break; + case 801: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Err ok."); + stage = 810; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why is brown best?"); + stage = 820; + break; + } + break; + case 810: + end(); + break; + case 820: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "General Wartface and General Bentnoze both say it is.", "And normally they never agree!"); + stage = 821; + break; + case 821: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4483, 4488, 4489, 4484, 4491, 4485, 4486, 4492, 4487, 4481, 4479, 4482, 4480 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GoblinVillageGuardDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GoblinVillageGuardDialogue.java new file mode 100644 index 000000000..77c1707dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GoblinVillageGuardDialogue.java @@ -0,0 +1,76 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Represents the dialogue plugin used for the goblin village guard npc. + * @author jamix77 + */ +@Initializable +public final class GoblinVillageGuardDialogue extends DialoguePlugin { + + /** + * + * Constructs a new @{Code HengelDialoguePlugin} object. + */ + public GoblinVillageGuardDialogue() { + /** + * empty. + */ + } + + /** + * + * Constructs a new @{Code GoblinVillageGuardDialogue} object. + * @param player + */ + public GoblinVillageGuardDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GoblinVillageGuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("You're a long way out from the city."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("I know. We guards uaully stay by banks and shops,", "but I got sent all the way out here to keep an eye on","the brigands loitering just south of here."); + stage = 1; + break; + case 1: + player("Sounds more exciting than standing", "around guarding banks and shops."); + stage = 2; + break; + case 2: + npc("It's not too bad. At least I don't get attacked so often", "out here. Guards in the cities get killed all the time."); + stage++; + break; + case 3: + player("Honestly people these days just don't know how to behave!"); + stage++; + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3241 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GodswordDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GodswordDialogue.java new file mode 100644 index 000000000..358a37873 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GodswordDialogue.java @@ -0,0 +1,157 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the godsword dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GodswordDialogue extends DialoguePlugin { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(898); + + /** + * Represents the godsword blade item. + */ + private static final Item BLADE = new Item(11690); + + /** + * Represents the used item id. + */ + private int used; + + /** + * Constructs a new {@code GodswordDialogue} {@code Object}. + */ + public GodswordDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GodswordDialogue} {@code Object}. + * @param player the player. + */ + public GodswordDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GodswordDialogue(player); + } + + @Override + public boolean open(Object... args) { + used = (int) args[0]; + interpreter.sendDialogue("You set to work, trying to fix the ancient sword."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + boolean passBlade = true; + int remove = -1; + if (used == 11692 && player.getInventory().contains(11710, 1)) { + passBlade = false; + remove = 11710; + } + if (used == 11710 && player.getInventory().containItems(11692)) { + passBlade = false; + remove = 11692; + } + if (used == 11688 && player.getInventory().contains(11712, 1)) { + passBlade = false; + remove = 11712; + } + if (used == 11712 && player.getInventory().containItems(11688)) { + passBlade = false; + remove = 11688; + } + if (used == 11686 && player.getInventory().contains(11714, 1)) { + passBlade = false; + remove = 11714; + } + if (used == 11714 && player.getInventory().containItems(11686)) { + passBlade = false; + remove = 11686; + } + if (!passBlade) { + if (player.getInventory().remove(new Item(used)) && player.getInventory().remove(new Item(remove))) { + player.lock(5); + player.animate(ANIMATION); + interpreter.sendDialogue("Even for an experienced smith it is not an easy task, but eventually", "it is done."); + player.getSkills().addExperience(Skills.SMITHING, 100, true); + player.getInventory().add(BLADE); + } + return true; + } + int base = -1; + if (used == 11710) { + if (player.getInventory().contains(11712, 1)) { + base = 11712; + } else if (player.getInventory().contains(11714, 1)) { + base = 11714; + } + } + if (used == 11712) { + if (player.getInventory().contains(11710, 1)) { + base = 11710; + } else if (player.getInventory().contains(11714, 1)) { + base = 11714; + } + } + if (used == 11714) { + if (player.getInventory().contains(11712, 1)) { + base = 11712; + } else if (player.getInventory().contains(11710, 1)) { + base = 11710; + } + } + if (base == -1) { + end(); + player.getPacketDispatch().sendMessage("You didn't have all the required items."); + return true; + } + if (player.getInventory().remove(new Item(used)) && player.getInventory().remove(new Item(base))) { + int shard = -1; + if (used == 11710 && base == 11712 || used == 11712 && base == 11710) { + shard = 11686; + } else if (used == 11710 && base == 11714 || used == 11714 && base == 11710) { + shard = 11688; + } + if (used == 11712 && base == 11714 || used == 11714 && base == 11712) { + shard = 11692; + } + player.lock(5); + player.animate(ANIMATION); + interpreter.sendDialogue("Even for an experienced smith it is not an easy task, but eventually", "it is done."); + player.getSkills().addExperience(Skills.SMITHING, 100); + player.getInventory().add(new Item(shard)); + } + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 62362 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GraardoorJRDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GraardoorJRDialogue.java new file mode 100644 index 000000000..7fa94ca10 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GraardoorJRDialogue.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Dialogue for the boss pet, General Graardoor JR. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class GraardoorJRDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GraardoorJRDialogue} {@code Object}. + */ + public GraardoorJRDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GraardoorJRDialogue} {@code Object}. + * @param player the player. + */ + public GraardoorJRDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GraardoorJRDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Not sure this is going to be worth my time but...", "how are you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "SFudghoigdfpDSOPGnbSOBNfdbdnopbdnopbddfnopdf", "pofhdARRRGGGGH!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nope. Not worth it."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8594 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GrandExchangeClerk.java b/Server/src/main/java/Server/core/game/content/dialogue/GrandExchangeClerk.java new file mode 100644 index 000000000..fc78a7f2e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GrandExchangeClerk.java @@ -0,0 +1,136 @@ +package core.game.content.dialogue; + +import core.game.ge.GrandExchangeDatabase; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the GrandExchangeClerk dialogue. + * @author 'Vexia + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class GrandExchangeClerk extends DialoguePlugin { + + /** + * Constructs a new {@code GrandExchangeClerk} {@code Object}. + */ + public GrandExchangeClerk() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GrandExchangeClerk} {@code Object}. + * @param player The player. + */ + public GrandExchangeClerk(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GrandExchangeClerk(player); + } + + @Override + public boolean open(Object... args) { + if (args.length > 0 && args[0] instanceof NPC) { + npc = (NPC) args[0]; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (stage < 50 && stage > 5 && !GrandExchangeDatabase.hasInitialized()) { + npc("The Grand Exchange is currently unavailable,", "it will be back soon!"); + stage = 51; + return true; + } + switch (stage) { + case 0: + npc("Good day to you, sir, How can I help?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "I want to access the Grand Exchange, please.", "I want to collect my items.", "Can I see a history of my offers?", "Can you help me with item sets?", "I'm fine, actually."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I want to access the Grand Exchange, please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I want to collect my items."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I see history of my offers?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you help me with item sets?"); + stage = 40; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm fine actually."); + stage = 50; + break; + } + break; + case 10: + npc("Only too happy to help you, sir."); + stage = 11; + break; + case 11: + end(); + player.getPlayerGrandExchange().open(); + break; + case 20: + npc("As you wish, sir."); + stage = 21; + break; + case 21: + end(); + player.getPlayerGrandExchange().openCollectionBox(); + break; + case 30: + npc("If that is your wish."); + stage = 31; + break; + case 31: + end(); + player.getPlayerGrandExchange().openHistoryLog(player); + break; + case 40: + npc("It would be my pleasure, sir."); + stage = 41; + break; + case 41: + end(); + player.getPlayerGrandExchange().openItemSets(); + break; + case 50: + npc("If you say so, sir."); + stage = 51; + break; + case 51: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6528, 6529, 6530, 6531 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GrandExchangeTutor.java b/Server/src/main/java/Server/core/game/content/dialogue/GrandExchangeTutor.java new file mode 100644 index 000000000..c9c92f9dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GrandExchangeTutor.java @@ -0,0 +1,139 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.GameWorld; + +/** + * Represents the dialogue plugin used for the grand exchange tutor. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GrandExchangeTutor extends DialoguePlugin { + + /** + * Constructs a new {@code GrandExchangeTutor} {@code Object}. + */ + public GrandExchangeTutor() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GrandExchangeTutor} {@code Object}. + * @param player the player. + */ + public GrandExchangeTutor(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GrandExchangeTutor(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How can I help?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Can you teach me about the Grand Exchange?", "Where can I found out more info?", "I'm okay thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you teach me about the Grand Exchange?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where can I find more info?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm okay thanks."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Of course."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is the Grand Exchange. You can tell us", "what you want to buy or sell, and for how much", "and we'll search for another player willing to do the trade!"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Let me describe the process in four steps:"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, getRed() + "Step 1: You come here with items to sell or money to", "spend."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, getRed() + "Step 2: Speak with one of the clerks at the desk.", "They will help you set up your bid."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, null, "When you're setting up a bid we'll show you a", "guide price for each item. This is just a suggestion", "though: you can offer any amount you like."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, getRed() + "Step 3: The clerks will take the items or money off you", "and look for someone to complete the trade. This may be", "very fast, or it could take several days."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, getRed() + "Step 4: When the trade is complete, we will send you a", "message. You can collect your stuff by talking to the", "clerks or by visiting any banker in " + GameWorld.getSettings().getName() + "."); + stage = 18; + break; + case 18: + interpreter.sendDialogues(npc, null, "There's plenty more information about the Grand", "Exchange, all of which can be found out from Brugsen", "Bursen, the guy with the megaphone. I would suggest", "you speak with him to fully get to grips with the Grand"); + stage = 19; + break; + case 19: + interpreter.sendDialogues(npc, null, "Exchange. Good luck!"); + stage = 99; + break; + case 99: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Go and speak to Brugsen who's standing over", "there, closer to the building. He'll help you out."); + stage = 31; + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Fair enough."); + stage = 31; + break; + case 31: + end(); + break; + } + return true; + } + + /** + * Gets the red color id. + * @return the color. + */ + public String getRed() { + return ""; + } + + @Override + public int[] getIds() { + return new int[] { 6521 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GregoryDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GregoryDialogue.java new file mode 100644 index 000000000..a603ca3fe --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GregoryDialogue.java @@ -0,0 +1,59 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the gregory npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GregoryDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GregoryDialogue} {@code Object}. + */ + public GregoryDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GregoryDialogue} {@code Object}. + * @param player the player. + */ + public GregoryDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GregoryDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If I were as ugly as you I would not dare to show my", "face in public!"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6033, 6027, 6043, 6036, 6040, 6038, 6045 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GrimgnashDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GrimgnashDialogue.java new file mode 100644 index 000000000..401828907 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GrimgnashDialogue.java @@ -0,0 +1,76 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the grimgnash dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GrimgnashDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GrimgnashDialogue} {@code Object}. + */ + public GrimgnashDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GrimgnashDialogue} {@code Object}. + * @param player the player. + */ + public GrimgnashDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GrimgnashDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What you want, little human? Grimgnash hungry. Want", "tasty morsel like you!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Like me? Why? Who are you?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I Grimngnash and I hungry! Perhaps I eat you!"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm really not that tasty. I think I should be going now.", "Goodbye."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Human lucky Grimgnash too tired to hunt for food. Stupid", "wolves keep Grimgnsh awake with howling. Grimgnash", "can't sleep."); + stage = 4; + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5997 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GruborDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GruborDialogue.java new file mode 100644 index 000000000..eb27daaca --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GruborDialogue.java @@ -0,0 +1,97 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the grubor dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GruborDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GruborDialogue} {@code Object}. + */ + public GruborDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GruborDialogue} {@code Object}. + * @param player the player. + */ + public GruborDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GruborDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes? What do you want?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Would you like your hedges trimming?", "I want to come in.", "Do you want to trade?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Would you like your hedges trimming?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I want to come in."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you want to trade?"); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Eh? Don't be daft! We don't even HAVE any hehdges!"); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, go away."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, I'm busy."); + stage = 31; + break; + case 31: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 789 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GrumDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GrumDialogue.java new file mode 100644 index 000000000..8b3ee9e95 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GrumDialogue.java @@ -0,0 +1,80 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the grum dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GrumDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GrumDialogue} {@code Object}. + */ + public GrumDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GrumDialogue} {@code Object}. + * @param player the player. + */ + public GrumDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GrumDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy or sell some gold jewellery?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, I'm not that rich."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, I', not that rich."); + stage = 20; + break; + + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Get out, then! We don't want any riff-raff in here."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 556 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GuidorsWifeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GuidorsWifeDialogue.java new file mode 100644 index 000000000..0c3a8a0fb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GuidorsWifeDialogue.java @@ -0,0 +1,75 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the guidors wife dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GuidorsWifeDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GuidorsWifeDialogue} {@code Object}. + */ + public GuidorsWifeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GuidorsWifeDialogue} {@code Object}. + * @param player the player. + */ + public GuidorsWifeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GuidorsWifeDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length == 2) { + interpreter.sendDialogues(342, FacialExpression.HALF_GUILTY, "Please leave my husband alone. He's very sick, and I don't", "want anyone bothering him."); + stage = 100; + return true; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendDialogues(342, FacialExpression.HALF_GUILTY, "Oh hello, I can't chat now. I have to keep an eye on my", "husband. He's very ill!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm sorry to hear that!"); + stage = 2; + break; + case 2: + end(); + break; + case 100: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 342 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/GunthorBraveDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/GunthorBraveDialogue.java new file mode 100644 index 000000000..66c7dbf6b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/GunthorBraveDialogue.java @@ -0,0 +1,56 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the gunthor brave dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GunthorBraveDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GunthorBraveDialogue} {@code Object}. + */ + public GunthorBraveDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GunthorBraveDialogue} {@code Object}. + * @param player the player. + */ + public GunthorBraveDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GunthorBraveDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("You look funny."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + npc.getProperties().getCombatPulse().attack(player); + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 199 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HairdresserDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HairdresserDialogue.java new file mode 100644 index 000000000..4d9d3e948 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HairdresserDialogue.java @@ -0,0 +1,173 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Represents the dialogue plugin used for the hairdresser. + */ +@Initializable +public final class HairdresserDialogue extends DialoguePlugin { + + + /** + * Constructs a new {@code HairdresserDialogue} {@code Object}. + */ + public HairdresserDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HairdresserDialogue} {@code Object}. + * @param player the player. + */ + public HairdresserDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HairdresserDialogue(player); + } + + @Override + public boolean open(Object... args) { + final String gender = player.isMale() ? "sir" : "madam"; + npc = (NPC) args[0]; + + + //If the player right clicks the hairdresser and presses Hair-cut + if (args.length == 2) { + if (player.getEquipment().get(EquipmentContainer.SLOT_HAT) == null && + player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) == null && player.getEquipment().get(EquipmentContainer.SLOT_SHIELD) == null) { + if (player.isMale()) { + player.getInterfaceManager().open(new Component(596)); + } else { + player.getInterfaceManager().open(new Component(592)); + } + } + else if(player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null || player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) != null || player.getEquipment().get(EquipmentContainer.SLOT_SHIELD) != null ) { + /** NOT ACCURATE DIALOGUE **/ + interpreter.sendDialogues(npc, FacialExpression.SCARED, (player.isMale() ? "Sir, " : "Madam, ") + "I can't cut your hair with those things pointing","at me. Please take them off and speak to me again."); + stage = 13; + }else{ //Not enough money + interpreter.sendDialogues(player, FacialExpression.SAD, "I don't have 2000 gold coins on me..."); + stage = 12; + } + return true; + } + + //If the player talks with the hairdresser + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "Good afternoon " + gender + ". In need of a haircut are we?", player.isMale() ? "Perhaps a shave too?" : ""); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + + case 1: + if (player.isMale()) { + interpreter.sendOptions("Select an Option", "I'd like a haircut please.", "I'd like a shave please.", "No thank you."); + stage = 2; + } else { + interpreter.sendOptions("Select an Option", "I'd like a haircut please.", "No thank you."); + stage = 5; + } + break; + + //Male Option responses + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HAPPY, "I'd like a haircut please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HAPPY, "I'd like a shave please."); + stage = 10; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "No thank you."); + stage = 20; + break; + } + break; + + //Female Option responses + case 5: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HAPPY, "I'd like a haircut please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "No thank you."); + stage = 20; + break; + } + break; + + //HairDresser Dialogues + case 10: + String gender = player.isMale() ? "sir" : "madam"; + String gender2 = player.isMale() ? "men's" : "women's"; + interpreter.sendDialogues(npc, FacialExpression.HAPPY, "Certainly " + gender + ". I cut " + gender2 + " hair at the bargain rate of", "only 2000 gold coins. I'll even throw in a free recolour!"); + stage++; + break; + case 11: + if (player.getEquipment().get(EquipmentContainer.SLOT_HAT) == null && + player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) == null && player.getEquipment().get(EquipmentContainer.SLOT_SHIELD) == null) { + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "Please select the hairstyle and colour you would like", "from this brochure."); + stage = 14; + } + //Has helmet or sword/shield + else if(player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null || player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) != null || player.getEquipment().get(EquipmentContainer.SLOT_SHIELD) != null ) { + /** NOT ACCURATE DIALOGUE **/ + interpreter.sendDialogues(npc, FacialExpression.SCARED, (player.isMale() ? "Sir, " : "Madam, ") + "I can't cut your hair with those things pointing","at me. Please take them off and speak to me again."); + stage = 13; + break; + } else { + interpreter.sendDialogues(player, FacialExpression.SAD, "I don't have 2000 gold coins on me..."); + stage = 12; + } + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.ANNOYED, "Well, come back when you do. I'm not running a", "charity here!"); + stage++; + break; + case 13: + end(); + break; + + //Opens the Hairstyle menu and ends the conversation + case 14: + end(); + if (player.isMale()) { + end(); + player.getInterfaceManager().open(new Component(596)); + } else { + end(); + player.getInterfaceManager().open(new Component(592)); + } + break; + + case 20: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "Very well. Come back if you change your mind."); + stage = 13; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 598 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HansDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/HansDialoguePlugin.java new file mode 100644 index 000000000..7ddba5574 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HansDialoguePlugin.java @@ -0,0 +1,436 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.link.IronmanMode; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + + +/** + * Represents the dialogue plugin used for the hans npc. + */ +@Initializable +public final class HansDialoguePlugin extends DialoguePlugin { + + private int[] timePlayed = new int[3]; + private int joinDateDays; + private boolean inStartDungeon; + + /** + * Constructs a new {@code HansDialoguePlugin} {@code Object}. + */ + public HansDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HansDialoguePlugin} {@code Object}. + * @param player the player. + */ + public HansDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HansDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "Hello. What are you doing here?"); + stage = 0; + if (new ZoneBorders(2528, 5004, 2520, 4997).insideBorder(player.getLocation())) { + inStartDungeon = true; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + if (inStartDungeon && stage == 0) { + stage = 1; + buttonId = 4; + } + + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I'm looking for whoever is in charge of this place.", "I have come to kill everyone in this castle!", "I don't know. I'm lost. Where am I?", "More Options..."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "Who, the Duke? He's in his study, on the first floor."); + stage = 50; + break; + case 2: + end(); + //TODO: + // Face the player and walk away from them (like moon walking?). + // After a moment, return to normal pathing associated with HansNPC.java + npc.sendChat("Help! Help!"); + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "You are in Lumbridge Castle."); + stage = 50; + break; + case 4: + if (!inStartDungeon) { + interpreter.sendOptions("Select an Option", "Have you been here as long as me?", "About my xp rate...", "About Iron Man mode...","About random events...", "Go Back..."); + } else { + interpreter.sendOptions("Select an Option", "Have you been here as long as me?", "About my xp rate...", "About Iron Man mode...","About random events..."); + } + stage = 10; + break; + } + break; + case 10: + switch (buttonId) { + case 1: + //Have you been here as long as me? + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "I've been patrolling this castle for years!"); + stage = 41; + break; + case 2: + npc("Your current XP rate is: " + player.getSkills().experienceMutiplier); + stage = 11; + break; + case 3: + //About Iron Man Mode... + if (player.getIronmanManager().isIronman()) { + npc("Your ironman mode is: " + player.getIronmanManager().getMode().name().toLowerCase()); + stage = 50; + } else { + interpreter.sendOptions("Select an Option", "I would like to be an Iron Man.", "What is an Iron Man?", "Go Back..."); + stage = 110; + } + break; + case 4: + if(player.getAntiMacroHandler().isDisabled){ + interpreter.sendOptions("Select an Option","I want to enable random events.","Nevermind."); + stage = 130; + break; + } else { + interpreter.sendOptions("Select an Option","I want to disable random events.","Nevermind."); + stage = 135; + break; + } + case 5: // Go back + interpreter.sendOptions("Select an Option", "I'm looking for whoever is in charge of this place.", "I have come to kill everyone in this castle!", "I don't know. I'm lost. Where am I?", "More Options..."); + stage = 1; + break; + } + break; + + case 11: + if (player.getSkills().experienceMutiplier == 5.0) { + player.newPlayer = player.getSkills().getTotalLevel() < 50; + options("Change xp rate", "Nevermind."); + stage++; + } else { + npc("Have a great day!"); + stage = 131; + } + break; + case 12: + switch(buttonId){ + case 1: + options("2.5x","5x","10x","20x"); + stage++; + break; + case 2: + npc(FacialExpression.LAUGH, "Haha, alright then!"); + stage = 50; + break; + } + break; + case 13: + switch(buttonId){ + case 1: + if(player.newPlayer) { + player.getSkills().experienceMutiplier = 2.5; + stage = 14; + } else { + stage = 15; + break; + } + break; + case 2: + if(player.newPlayer){ + player.getSkills().experienceMutiplier = 5.0; + stage = 14; + } else { + stage = 15; + } + break; + case 3: + player.getSkills().experienceMutiplier = 10.0; + stage = 14; + break; + case 4: + player.getSkills().experienceMutiplier = 20.0; + stage = 14; + break; + } + npc("One moment, please..."); + break; + case 14: + npc("Tada, your xp rate is now " + player.getSkills().experienceMutiplier); + stage = 131; + break; + case 15: + npc("Sorry, only new accounts can select 2.5x."); + stage = 131; + break; + //Have you been here as long as me? + case 41: + interpreter.sendDialogues(player, FacialExpression.THINKING, "You must be old then?"); + stage++; + break; + case 42: + interpreter.sendDialogues(npc, FacialExpression.LAUGH, "Haha, you could say I'm quite the veteran of these lands.", "Yes, I've been here a fair while..."); + stage++; + break; + case 43: //mixing OSRS here + interpreter.sendDialogues(player, FacialExpression.ASKING, "Can you tell me how long I've been here?"); + stage++; + break; + case 44: + if (!inStartDungeon) { + interpreter.sendDialogues(npc, FacialExpression.FRIENDLY, "Ahh, I see all the newcomers arriving in Lumbridge, ","fresh-faced and eager for adventure. I remember you..."); + player.sendMessage("Feature not currently available."); + } else { + interpreter.sendDialogues(npc, FacialExpression.FRIENDLY, "Ahh, I see all the newcomers arriving in Lumbridge, ","fresh-faced and eager for adventure.", "But this is the first time meeting you..."); + } + stage = 50; + break; + //TODO: + /*case 45: + getTimePlayed(); + + //The text: + //NOTE: it splits the text in different spots if the hours/minutes/days are 0 (because 0 days sounds weird, so it doesn't show it). + + //You've spent [amount] days, [amount] hours, [amount] minutes in the world (NEXT LINE) since you arrived [amount] days ago. + //You've spent [amount] (days/hours), [amount] (hours/minutes) in the world since (NEXT LINE) you arrived [amount] days ago. + //You've spent [amount] (days/hours/minutes) in the world since you arrived (NEXT LINE) [amount] days ago. + */ + + //Closing Chat + case 50: + end(); + break; + + //About Iron Man Mode... + case 100: + switch (buttonId) { + case 1: //no longer want to be iron + if (player.getSavedData().getActivityData().getHardcoreDeath() == true) { + interpreter.sendDialogues(npc, FacialExpression.GUILTY, "Sorry, but you've fallen as a Hardcore Iron Man", "already. It would be unfair for those with other", " restrictions if your status were to be removed!"); + stage = 50; + break; + } + if (player.getSkills().getTotalLevel() > 500 || player.getQuestRepository().getPoints() > 10){ + interpreter.sendDialogues(npc, FacialExpression.GUILTY, "Sorry, but you are too far along your journey.", "It would be unfair for those with other", " restrictions if your status were to be removed!"); + stage = 50; + break; + } else { + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "I have removed your Iron Man status."); + player.getIronmanManager().setMode(IronmanMode.NONE); + player.sendMessage("Your Iron Man status has been removed."); + stage = 50; + break; + } + case 2: //change ironman mode + if (player.getSavedData().getActivityData().getHardcoreDeath() == true) { + interpreter.sendDialogues(npc, FacialExpression.GUILTY, "Sorry, but you've fallen as a Hardcore Iron Man", "already. It would be unfair for those with other", " restrictions if your status were to be changed!"); + stage = 50; + break; + } + if (player.getSkills().getTotalLevel() > 500 || player.getQuestRepository().getPoints() > 10){ + interpreter.sendDialogues(npc, FacialExpression.GUILTY, "Sorry, but you are too far along your journey.", "It would be unfair for those with other", " restrictions if your status were to be changed!"); + stage = 50; + break; + } else { + interpreter.sendOptions("Select a Mode", "Standard", "Hardcore", "Ultimate", "Nevermind."); + stage = 150; + break; + } + case 3: // What is Iron Man Mode? + interpreter.sendDialogues(player, FacialExpression.ASKING,"What is an Iron Man?"); + stage = 120; + break; + case 4: //Go back. + interpreter.sendOptions("Select an Option", "Have you been here as long as me?", "I'd like to learn faster!", "About Iron Man mode...", "Go Back..."); + stage = 10; + break; + } + break; + case 110: + switch (buttonId) { + case 1: //I would like to be an Iron Man + if (player.getSkills().getTotalLevel() > 500 || player.getQuestRepository().getPoints() > 10){ + interpreter.sendDialogues(npc, FacialExpression.GUILTY, "Sorry, but you are too far along your journey.", "It would be unfair for those with other", " restrictions if your status were to be changed!"); + stage = 50; + break; + } else { + interpreter.sendOptions("Select a Mode", "Standard", "Hardcore", "Ultimate", "Nevermind."); + stage = 150; + break; + } + case 2: // What is Iron Man Mode? + player("What is an Iron Man?"); + stage = 120; + break; + case 3: //Go back. + interpreter.sendOptions("Select an Option", "Have you been here as long as me?", "I'd like to learn faster!", "About Iron Man mode...", "Go Back..."); + stage = 10; + break; + } + break; + + //What is an Iron Man? + case 120: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"An Iron Man account is a style of playing where players", "are completely self-sufficient."); + stage++; + break; + case 121: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"A Standard Ironman does not receive items or", "assistance from other players. They cannot trade, stake,", "receive PK loot, scavenge dropped items, nor play", "certain minigames."); + stage++; + break; + case 122: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"In addition to Standard Ironman restrictions,", "Hardcore Ironmen only have one life. In the event of","a dangerous death, a player will be downgraded to a", "Standard Ironman, and their stats frozen on the hiscores."); + stage++; + break; + case 123: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"For the ultimate challenge, players who choose the", "Ultimate Ironman mode cannot use banks, nor", "retain any items on death in dangerous areas."); + stage++; + break; + case 124: + if (player.getIronmanManager().isIronman()) { + interpreter.sendOptions("Select an Option", "I no longer want to be an Iron Man", "I'd like to change my Iron Man mode", "What is an Iron Man?", "Go Back."); + stage = 100; + } else { + interpreter.sendOptions("Select an Option", "I would like to be an Iron Man.", "What is an Iron Man?", "Go Back..."); + stage = 110; + } + break; + + case 130: + switch(buttonId){ + case 1: + npc("Voila, you should now get random events!"); + player.getAntiMacroHandler().isDisabled = false; + player.setAttribute("/save:randoms:disabled",false); + player.getAntiMacroHandler().init(); + stage = 131; + break; + case 2: + player("Never mind."); + stage = 131; + break; + } + break; + case 131: + end(); + break; + case 135: + switch(buttonId){ + case 1: + npc("Voila, you shouldn't get random events now!"); + player.getAntiMacroHandler().isDisabled = true; + player.setAttribute("/save:randoms:disabled",true); + stage = 131; + break; + case 2: + player("Never mind."); + stage = 131; + break; + } + break; + //Change Iron man mode dialogue/code + case 150: + switch(buttonId){ + case 1: + case 2: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"I have changed your Iron Man mode to: ","" + (buttonId == 1 ? "Standard" : "Hardcore" + " Ironman mode.")); + player.getSettings().toggleAcceptAid(); + player.getIronmanManager().setMode(IronmanMode.values()[buttonId]); + player.sendMessage("Your Iron Man status has been changed."); + stage = 50; + break; + case 3: //ultimate ironman + if (!player.getBank().isEmpty()) + { + if (!inStartDungeon) { + interpreter.sendDialogues(npc, FacialExpression.GUILTY, "Sorry, but your bank is has items in it.", "Please empty your bank and speak to me again."); + } + stage = 50; + break; + } else { + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"I have changed your Iron Man mode to:","Ultimate Ironman mode."); + player.getIronmanManager().setMode(IronmanMode.ULTIMATE); + player.sendMessage("Your Iron Man status has been changed."); + stage = 50; + break; + } + case 4: + if (player.getIronmanManager().isIronman()) { + interpreter.sendOptions("Select an Option", "I no longer want to be an Iron Man", "I'd like to change my Iron Man mode", "What is an Iron Man?", "Go Back..."); + stage = 100; + } else { + interpreter.sendOptions("Select an Option", "I would like to be an Iron Man.", "What is an Iron Man?", "Go Back..."); + stage = 110; + } + break; + } + break; + + + //About XP Multiplier + case 200: + interpreter.sendOptions("Select an Option", "Set my experience rate to 10x", "Nevermind."); + stage++; + break; + case 201: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.FRIENDLY, "Tada! Your experience rate is now 10x.", "Happy Scaping!"); + player.getSkills().experienceMutiplier = 10.0; + stage = 50; + break; + case 2: + end(); + break; + } + break; + } + + return true; + } + + /** + * Obtains the player's join date and time played. + */ + private void getPlayerTime() { + + //TODO: + // Find the Date Joined and Time Played variables for the player WITHOUT directly connecting to the SQL database here + // Split the Time Played variable into Days, Hours and Minutes + // Insert each calculation into the timePlayed array ( 0 for Days, 1 for Hours and 2 for Minutes) + // Calculate the Days Since registering by subtracting the Date Joined from the Current Server Date (ServerDate - Join_Date) + // Insert the date difference into joinDateDays variable + // return;??? + } + + @Override + public int[] getIds() { + return new int[] { 0 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HariDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HariDialogue.java new file mode 100644 index 000000000..f278a17ec --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HariDialogue.java @@ -0,0 +1,120 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the hari dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HariDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HariDialogue} {@code Object}. + */ + public HariDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HariDialogue} {@code Object}. + * @param player the player. + */ + public HariDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HariDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Who are you?", "Can you teach me about canoeing?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "My name is Hari."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's really quite simple to make. Just walk down to that", "tree on the bank and chop it down."); + stage = 18; + break; + + } + break; + case 10: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "And what are you going here Hari?"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Like most people who come to Edgeville, I am here to seek", "adventure in the Wilderness."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I found a secret underground riber that will take me quite", "a long way north."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Underground river? Where does it come out?"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It comes out in a pond located deep in Wilderness."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I had to find a very special type of canoe to get me up", "the river though, would you like to know more?"); + stage = 16; + break; + case 16: + interpreter.sendOptions("Select an Option", "Yes", "No"); + stage = 17; + break; + case 17: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's really quite simple to make. Just walk down to that", "tree on the bank and chop it down."); + stage = 18; + break; + case 2: + end(); + break; + } + break; + case 18: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you have done that you can shape the log further", "with your hatchet to make a canoe."); + stage = 19; + break; + case 19: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3330 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HarlanDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HarlanDialogue.java new file mode 100644 index 000000000..f14365e00 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HarlanDialogue.java @@ -0,0 +1,238 @@ +package core.game.content.dialogue; + +import core.game.container.Container; +import core.game.content.global.Skillcape; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the harlan npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HarlanDialogue extends DialoguePlugin { + + /** + * Represents the training sword. + */ + private static final Item SWORD = new Item(9703); + + /** + * Represents the training shield. + */ + private static final Item SHIELD = new Item(9704); + + /** + * Constructs a new {@code HarlanDialogue} {@code Object}. + */ + public HarlanDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HarlanDialogue} {@code Object}. + * @param player the player. + */ + public HarlanDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HarlanDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "Can you tell me about different weapon types I can use?", "Please tell me about skillcapes.", "Bye."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you tell me about different weapon types I can", "use?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Please tell me about skillcapes."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Bye."); + stage = 30; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well let me see now...There are stabbing type weapons", "such as daggers, then you have swords which are", "slashing, maces that have great crushing abilities, battle", "axes which are powerful and spears which can be good"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "for Defence and many forms of Attack."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It depends a lot on how you want to fight. Experiment", "and find out what is best for you. Never be scared to", "try out a new weapon; you never know, you might like", "it! Why, I tried all of them for a while and settled on"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "this rather good sword!"); + stage = 14; + break; + case 14: + interpreter.sendOptions("Select an Option", "I'd like a training sword and shield.", "Bye"); + stage = 15; + break; + case 15: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like a training sword and shield."); + stage = 16; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Bye."); + stage = 30; + break; + } + break; + case 16: + if (hasBoth()) { + interpreter.sendDialogues(npc, null, "You already have them! If they're not in your", "inventory, perhaps you should check your bank."); + stage = 99; + return true; + } + if (hasItem(SHIELD)) { + interpreter.sendDialogues(npc, null, "You already have a shield but I can give you a sword."); + stage = 16; + return true; + } + if (hasItem(SWORD)) { + interpreter.sendDialogues(npc, null, "You already have a sword but I can give you a shield."); + stage = 17; + return true; + } + if (player.getInventory().add(SWORD)) { + interpreter.sendItemMessage(SWORD, "Harlan gives you a training sword."); + } else { + end(); + } + stage = 17; + break; + case 17: + if (player.getInventory().add(SHIELD)) { + interpreter.sendItemMessage(SHIELD, "Harlan gives you a training shield."); + } else { + end(); + } + stage = 18; + break; + case 18: + end(); + break; + case 20: + interpreter.sendDialogues(npc, null, "Of course. Skillcapes are a symbol of achievement. Only", "people who have mastered a skill and reached level 99", "can get their hands on them and gain the benefits they", "carry. Is there something else I can help you with,"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, null, "perhaps?"); + stage = 22; + break; + case 22: + if (player.getSkills().getStaticLevel(Skills.DEFENCE) >= 99) { + interpreter.sendOptions("Select an Option", "Can you tell me about different weapon types I can use?", "Can I purchase a defence cape?", "Bye."); + stage = 23; + return true; + } + interpreter.sendOptions("Select an Option", "Can you tell me about different weapon types I can use?", "Please tell me about skillcapes.", "Bye."); + stage = 0; + break; + case 23: + interpreter.sendDialogues(npc, null, "You will have to pay a fee of 99,000 gp."); + stage = 24; + break; + case 24: + interpreter.sendOptions("Select an Option", "Okay.", "No, thanks."); + stage = 25; + break; + case 25: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Okay."); + stage = 27; + break; + case 2: + interpreter.sendDialogues(player, null, "No, thanks."); + stage = 26; + break; + } + break; + case 27: + if (Skillcape.purchase(player, Skills.DEFENCE)) { + npc("There you go! Enjoy."); + } + stage = 26; + break; + case 26: + end(); + break; + case 30: + end(); + break; + case 99: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 705 }; + } + + /** + * Method usd to check if the player has both. + * @return True if so. + */ + public boolean hasBoth() { + final Container[] containers = new Container[] { player.getInventory(), player.getBank(), player.getEquipment() }; + int count = 0; + for (Container c : containers) { + if (c.containsItem(SWORD)) { + count++; + } + if (c.containsItem(SHIELD)) { + count++; + } + } + return count >= 2; + } + + /** + * Method used to get the item if its in. + * @param item the item. + * @return True + */ + public boolean hasItem(final Item item) { + final Container[] containers = new Container[] { player.getInventory(), player.getBank(), player.getEquipment() }; + for (Container c : containers) { + if (c.containsItem(item)) { + return true; + } + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HarrallakMenarous.java b/Server/src/main/java/Server/core/game/content/dialogue/HarrallakMenarous.java new file mode 100644 index 000000000..0e8b89dcb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HarrallakMenarous.java @@ -0,0 +1,301 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the harrallak menarous npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HarrallakMenarous extends DialoguePlugin { + + /** + * Constructs a new {@code HarrallakMenarous} {@code Object}. + */ + public HarrallakMenarous() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HarrallakMenarous} {@code Object}. + * @param player the player. + */ + public HarrallakMenarous(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HarrallakMenarous(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to my humble guild, " + player.getUsername() + "."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Quite a place you've got here.", "You any good with a sword?", "Bye!"); + stage = 1; + break; + case 1: + if (buttonId == 1) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Quite a place you've got here. Tell me more about it."); + stage = 53; + } else if (buttonId == 2) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You any good with a sword?"); + stage = 5; + } else if (buttonId == 3) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Bye!"); + stage = 2; + } + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Farewell, brave warrior, I do hope you enjoy my guild."); + stage = 120; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You any good with a sword?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Am I any good with a sword'? Have you any clue who I", "am?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Not really, no."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Why, I could best any person alive in a rapier duel!"); + stage = 7; + break; + case 7: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Try me, then!"); + stage = 8; + break; + case 8: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "My dear man, I couldn't possibly duel you, I might hurt", "you and then what would happen to my reputation!", "Besides, I have this wonderful guild to run. Why don't", " you take a look at the various activities we have."); + stage = -8; + break; + case -8: + npc("You might even collect enough tokens to be allowed in", "to kill the strange beasts from the east!"); + stage = 10; + break; + case 10: + interpreter.sendOptions("Select an Option", "Tell me about the Strength training Area.", "Tell me about the Attack training area.", "Tell me about the Defence training area.", "Tell me about the Combat training area.", "Tell me about tokens."); + stage = 11; + break; + case 11: + if (buttonId == 1) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about the Strength training area."); + stage = 12; + } else if (buttonId == 2) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about the Attack training area."); + stage = 29; + } else if (buttonId == 3) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about the Defence training area"); + stage = 16; + } else if (buttonId == 4) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about the Combat training area"); + stage = 35; + } else if (buttonId == 5) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about tokens."); + stage = 42; + } + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh, the mighty warrior, Sloane, guards the Strength", "training area. This intriguing little area consits of two", "shotput lanes for different weights of shot. It's fairly", "simple, the referee or Sloane can explain more. There's"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "also the store room next door where Jimmy might share", "his talents with you, but don't tell him that I know", "he's not on guard duty!"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh? Why?"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, he's doing no harm and let's face it, with all these", "warriors around, the guild is hardly unguarded. You can", "find the strength area just up the stairs behind the bank."); + stage = 10; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "To polish your defensive skills to the very highest level,", "we've employed a most intentive dwarf and a catapult."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You're going to throw dwarves at me?"); + stage = 18; + break; + case 18: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh my, no! I think Gamfred would object to that most", "strongly."); + stage = 19; + break; + case 19: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "He's an inventor, you see, and has built a marvellous", "contraptiont hat can throw all sorts of things at you.", "Things such as magic missiles..."); + stage = 20; + break; + case 20: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Mmmm?"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "...spiked iron balls..."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Er..."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "...spinning, slashing bladed..."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ummm..."); + stage = 25; + break; + case 25: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "...and anvils."); + stage = 26; + break; + case 26: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "...and anvils."); + stage = 27; + break; + case 27: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "ANVILS?"); + stage = 28; + break; + case 28: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No need to be afraid, it's all under very controlled", "conditions! You can find it just up the stairs and", "behind the bank."); + stage = 10; + break; + case 29: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahhh, dummies."); + stage = 30; + break; + case 30: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm no dummy, I just want to know what is there!"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh no, my dear man, I did not mean you at all! The", "training area has mechanical dummies that pop up out of", "holes in the floor. The noble dward, Gamfred, invented the", "mechanism and Ajjat can explain more about what to do"); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "there."); + stage = 33; + break; + case 33: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, okay, I'll have to try it out."); + stage = 34; + break; + case 34: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You can find it just down the corridor and on", "your right."); + stage = 10; + break; + case 35: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh, yes, our redient magician from foreign lands", "created a most amazing gadget that can turn your own", "armour against you! It's really quite intriguing."); + stage = 36; + break; + case 36: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That sounds dangerous. What if I'm wearing it at the", "time?"); + stage = 37; + break; + case 37: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So far, that's not happend. You need to speak to", "Shanomi about the specifics of the process, but as I", "understand it, putting a suit of armour in one of these", "devices will make it come to life somehow. The better the"); + stage = 38; + break; + case 38: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "armour, the harder it is to defeat."); + stage = 39; + break; + case 39: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Fighting my own armour sounds weird. I could be", "killed by it..."); + stage = 40; + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Indeed, we have had a few fatalities from warriors", "overstretching themselves and not knowing their limits.", "Start small and work up, is my motto! That and go see", "Lidio for some food if you need it."); + stage = 41; + break; + case 41: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, thanks for the warning."); + stage = 10; + break; + case 42: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh, yes! The tokens allow you to spend an amount of", "time with my 'discovery', located on the top floor of the", "guild. Now, the amount of tokens you collect from the", "five activities around the guild will dictate how"); + stage = -43; + break; + case -43: + npc("long Kamfreena will allow in the enclosure on the very", "top floor. More tokens equals more time. There are", "also some bonuses available should you take part in all of", "the activites around the guild."); + stage = 44; + break; + case 43: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "will allow in the enclosure on the very top floor. More", "tokens equals more time. There are also some bonuses", "available should you take part in all of the activites", "around the guild."); + stage = 44; + break; + case 44: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, okay. So, how do i earn these tokens?"); + stage = 45; + break; + case 45: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You can earn them by simply using the traning exercises", "around the guild. The staff will enter your token", "earning into a ledger as you play."); + stage = 46; + break; + case 46: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sounds easy enough."); + stage = 120; + break; + case 47: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Should you part in all five activites around the guild", "you can choose to pay for your time on the top floor with", "tokens of all types. Should you do this then you'll find you", "spend less tokens overall and have a better chance of"); + stage = 48; + break; + case 48: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "getting the dragon defender, amongst other things."); + stage = 49; + break; + case 49: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Excellent, sounds good. So, what's up on the top floor?"); + stage = 50; + break; + case 50: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, wit giving too much away, they're big and mean,", "and you get to fight them for defenders. If you're really", "lucky, they'll summon a cyclossus...although that be", "unlucky. Still, if you manage to defeat him, you could win"); + stage = 51; + break; + case 51: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "his hat."); + stage = 52; + break; + case 52: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Interesting...I will have to explore the top floor then!"); + stage = 10; + break; + case 53: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes indeed. What would you like to know?"); + stage = 10; + break; + case 120: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4286 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HarryDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HarryDialogue.java new file mode 100644 index 000000000..f41daebb5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HarryDialogue.java @@ -0,0 +1,235 @@ +package core.game.content.dialogue; + +import core.tools.Items; +import core.game.node.entity.npc.NPC; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the harry npc. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HarryDialogue extends DialoguePlugin { + private final static int FISHBOWL_EMPTY = Items.FISHBOWL_6667; + private final static int FISHBOWL_WATER = Items.FISHBOWL_6668; + private final static int FISHBOWL_SEAWEED = Items.FISHBOWL_6669; + + private final static int FISHBOWL_BLUE = Items.FISHBOWL_6670; + private final static int FISHBOWL_GREEN = Items.FISHBOWL_6671; + private final static int FISHBOWL_SPINE = Items.FISHBOWL_6672; + + private final static int TINY_NET = Items.TINY_NET_6674; + + /** + * Constructs a new {@code HarryDialogue} {@code Object}. + */ + public HarryDialogue() { + } + + /** + * Constructs a new {@code HarryDialogue} {@code Object}. + * + * @param player the player. + */ + public HarryDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HarryDialogue(player); + } + + private boolean needsFish() { + return player.getInventory().containsAtLeastOneItem(FISHBOWL_SEAWEED); + } + + private boolean needsSeaWeed() { + return player.getInventory().containsAtLeastOneItem(FISHBOWL_WATER); + } + + private boolean needsFood() { + return player.getInventory().containsAtLeastOneItem(new int[] {FISHBOWL_SEAWEED, FISHBOWL_BLUE, FISHBOWL_GREEN, FISHBOWL_SPINE}); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome! You can buy Fishing equipment at my store.", "We'll also give you a good price for any fish that you", "catch."); + if (needsFish() || needsSeaWeed()) { + stage = 10; + } else if (needsFood()) { + stage = 20; + } else { + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + break; + case 0: + options("Let's see what you've got, then.", "Sorry, I'm not interested."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Let's see what you've got, then."); + stage++; + break; + case 2: + player("Sorry, I'm not interested."); + stage = 999; + break; + } + break; + case 2: + end(); + npc.openShop(player); + break; + case 10: + options("Let's see what you've got, then.", "Can I get a fish for this bowl?", "Do you have any fishfood?", "Sorry, I'm not interested."); + stage++; + break; + case 11: + switch (buttonId) { + case 1: + player("Let's see what you've got, then."); + stage = 2; + break; + case 2: + player("Can I get a fish for this bowl?"); + stage = 30; + break; + case 3: + player("Do you have any fishfood?"); + stage = 40; + break; + case 4: + player("Sorry, I'm not interested."); + stage = 999; + break; + } + break; + case 20: + options("Let's see what you've got, then.", "Do you have any fishfood?", "Sorry, I'm not interested."); + stage++; + break; + case 21: + switch (buttonId) { + case 1: + player("Let's see what you've got, then."); + stage = 2; + break; + case 2: + player("Do you have any fishfood?"); + stage = 40; + break; + case 3: + player("Sorry, I'm not interested."); + stage = 999; + break; + } + break; + case 30: + if (!needsFish()) { // ergo, needsSeaWeed() == true + npc("Sorry, you need to put some seaweed into the bowl", "first."); + stage++; + } else { + npc("Yes you can!"); + stage = 33; + } + break; + case 31: + player("Seaweed?"); + stage++; + break; + case 32: + npc("Yes, the fish seem to like it. Come and see me when", "you have put some in the bowl."); + stage = 999; + break; + case 33: + npc("I can see that you have a nicely filled fishbowl there to", "use, and you can catch a fish from my aquarium if", "you want."); + stage++; + break; + case 34: + npc("You will need a special net to do this though, and I sell", "them for 10 gold."); + stage++; + break; + case 35: + options("I'll take it!", "No thanks, later maybe");//[sic] no punctuation on last option + stage++; + break; + case 36: + switch (buttonId) { + case 1: + player("I'll take it!"); + stage++; + break; + case 2: + player("No thanks, later maybe"); + stage = 999; + break; + } + break; + case 37: + if (player.getInventory().getAmount(995) >= 10) { + if (!player.getInventory().hasSpaceFor(new Item(TINY_NET))) { + npc("Here you... oh."); + stage = 38; + } else { + npc("Here you go!"); + if (player.getInventory().remove(new Item(995, 10))) { + player.getInventory().add(new Item(TINY_NET)); + player.getPacketDispatch().sendMessage("Harry sells you a tiny net!"); + } + stage = 999; + } + } else { + npc("Well, I'll be happy to give you the net once you", "have the cash, but not before!"); + stage = 999; + } + break; + case 38: + npc("Well, you don't seem to have any free space for", "this right now. Come back later when you do."); + stage = 999; + break; + case 40: + npc("Sorry, I'm all out. I used up the last of it feeding the", "fish in the aquarium."); + stage++; + break; + case 41: + npc("I have some empty boxes though, they have the", "ingredients written on the back. I'm sure if you pick up", "a pestle and mortar you will be able to make your own."); + stage++; + break; + case 42: + npc("Here. I can hardly charge you for an empty box."); + player.getInventory().add(new Item(Items.AN_EMPTY_BOX_6675)); + if (needsFood() && !needsSeaWeed()) { + stage++; + } else { + stage = 999; + } + break; + case 43: + npc("Take good care of that fish!"); + stage = 999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{576}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HassanDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HassanDialogue.java new file mode 100644 index 000000000..6b6a08dea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HassanDialogue.java @@ -0,0 +1,160 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue used to handle the Hassan npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HassanDialogue extends DialoguePlugin { + + /** + * Represents the jug of water item. + */ + private static final Item JUG_OF_WATER = new Item(1937); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code HassanDialogue} {@code Object}. + */ + public HassanDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HassanDialogue} {@code Object}. + * @param player the player. + */ + public HassanDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HassanDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + switch (quest.getStage(player)) { + case 100: + interpreter.sendDialogues(npc, null, "You are a friend of the town of Al-Kharid. If we have", "more tasks to complete, we will ask you. Please, keep in", "contact. Good employees are not easy to find."); + stage = 0; + break; + case 60: + interpreter.sendDialogues(npc, null, "You have the eternal gratitude of the Emir for", "rescuing his son. I am authorised to pay you 700", "coins."); + stage = 0; + break; + case 40: + case 50: + case 20: + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I understand the Spymaster has hired you. I will pay", "the reward only when the Prince is rescued."); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Have you found the spymaster, Osman, yet? You", "cannot proceed in your task without reporting to him."); + break; + default: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings I am Hassan, Chancellor to the Emir of Al-", "Kharid."); + break; + } + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 100: + end(); + break; + case 60: + end(); + quest.finish(player); + break; + case 30: + case 40: + case 50: + case 20: + end(); + break; + case 10: + end(); + break; + case 0: + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Can I help you? You must need some help here in the desert.", "It's just too hot here. How can you stand it?", "Do you mind if I just kill your warriors?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I help you? You must need some help here in the", "desert."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "It's just too hot here. How can you stand it?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you mind if I just kill your warriors?"); + stage = 30; + break; + } + break; + case 10: + quest.start(player); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I need the services of someone yes. If you are", "interested, see the spymaster, Osman. I manage the", "finances here. Come to me when you need payment."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "We manage, in our humble way. We are a wealthy", "town and we have water. It cures many thirsts."); + stage = 21; + break; + case 21: + interpreter.sendDialogue("The chancellor hands you some water."); + stage = 22; + break; + case 22: + if (!player.getInventory().add(JUG_OF_WATER)) { + GroundItemManager.create(JUG_OF_WATER, player); + } + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You are welcome. They are not expensive. We have", "them here to stop the elite guard being bothered. They", "are a little harder to kill."); + stage = 31; + break; + case 31: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 923 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HeadChefDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HeadChefDialogue.java new file mode 100644 index 000000000..7acd07817 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HeadChefDialogue.java @@ -0,0 +1,167 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the head chef. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HeadChefDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HeadChefDialogue} {@code Object}. + */ + public HeadChefDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HeadChefDialogue} {@code Object}. + * @param player the player. + */ + public HeadChefDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HeadChefDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + boolean door = false; + if (args.length == 2) + door = (boolean) args[1]; + if (door) { + interpreter.sendDialogues(847, FacialExpression.HALF_GUILTY, "You can't come in here unless you're wearing a chef's", "hat or something like that."); + stage = 0; + return true; + } + if (player.getSkills().getStaticLevel(Skills.COOKING) >= 99) { + interpreter.sendDialogues(847, FacialExpression.HALF_GUILTY, "Hello, welcome to the Cooking Guild. It's always great to", "have such an accomplished chef visit. Say would you be", "interested in a Skillcape of Cooking? They're only available", "to master chefs."); + stage = 100; + return true; + } + interpreter.sendDialogues(847, FacialExpression.HALF_GUILTY, "Hello, welcome to the Cooking Guild. Only accomplished", "chefs and cooks are allowed in here. Feel free to use any", "of our facilities."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + end(); + break; + case 1: + interpreter.sendOptions("Select an Option", "Nice cape you're wearing!", "Thanks, bye."); + stage = 2; + break; + case 2: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nice cape, you're wearing!"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks, bye."); + stage = 3; + break; + } + + break; + case 3: + end(); + break; + case 10: + interpreter.sendDialogues(847, FacialExpression.HALF_GUILTY, "Thank you! It's my most prized possesion, it's a Skillcape", "of Cooking; it shows that I've achieved level 99 Cooking", "and am one of the best chefs in the land!"); + stage = 11; + break; + case 11: + end(); + break; + case 100: + interpreter.sendOptions("Select an Option", "No thanks.", "Yes please."); + stage = 101; + break; + case 101: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); + stage = 110; + break; + case 2: + player("Yes, please."); + stage = 150; + break; + } + break; + + case 110: + interpreter.sendDialogues(847, FacialExpression.HALF_GUILTY, "Okay, come back to me if you change your mind."); + stage = 111; + break; + case 111: + end(); + break; + case 150: + interpreter.sendDialogues(847, FacialExpression.HALF_GUILTY, "Most certainly, just as soon as you give me 99000 gold", "coins."); + stage = 151; + break; + case 151: + interpreter.sendOptions("Select an Option", "That's much too expensive.", "Sure."); + stage = 152; + break; + case 152: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's much too expensive."); + stage = 160; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sure."); + stage = 200; + break; + } + + break; + case 160: + interpreter.sendDialogues(847, FacialExpression.HALF_GUILTY, "I'm sorry you feel that way."); + stage = 161; + break; + case 161: + end(); + break; + case 200: + if (Skillcape.purchase(player, Skills.COOKING)) { + interpreter.sendDialogues(847, FacialExpression.HALF_GUILTY, "Now you can use the title Master Chef."); + } + stage = 202; + break; + case 202: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 847 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HengelDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/HengelDialoguePlugin.java new file mode 100644 index 000000000..e2fe49df9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HengelDialoguePlugin.java @@ -0,0 +1,114 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; + +/** + * Represents the dialogue plugin used for the hengel npc. + * @author jamix77 + */ +@Initializable +public final class HengelDialoguePlugin extends DialoguePlugin { + + /** + * + * Constructs a new @{Code HengelDialoguePlugin} object. + */ + public HengelDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AjjatDialoguePlugin} {@code Object}. + * @param player the player. + */ + public HengelDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HengelDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("What are you doing here?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "I'm just wandering around.", "I was hoping you'd give me some free stuff.", "I've come to kill you."); + stage = 2; + break; + case 2: + if (buttonId == 1) { + player("I'm just wondering around."); + stage = 3; + } else if (buttonId == 2) { + player("I was hoping you'd give me some free stuff."); + stage = 7; + } else if (buttonId == 3) { + player("I've come to kill you."); + stage = 9; + } + break; + case 3: + npc("You do realise you're wandering around in my house?"); + stage++; + break; + case 4: + player("Yep."); + stage++; + break; + case 5: + npc("Well please get out!"); + stage++; + break; + case 6: + player("Sheesh, keep your wig on!"); + stage = 605; + break; + case 7: + npc("No, I jolly well wouldn't!","Get out of my house"); + stage++; + break; + case 8: + player("Meanie!"); + stage = 605; + break; + case 9: + npc.sendChat("Aaaaarrgh!"); + for (NPC npc1 : RegionManager.getLocalNpcs(player)) { + if (npc1.getName().equalsIgnoreCase("anja")) { + npc1.sendChat("Eeeek!"); + break; + } + } + end(); + break; + case 605: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2683 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HeronDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HeronDialogue.java new file mode 100644 index 000000000..096ad4cb8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HeronDialogue.java @@ -0,0 +1,64 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the heron dialgoue. + * @author Empathy + * + */ +@Initializable +public final class HeronDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HeronDialogue} {@code Object}. + */ + public HeronDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HeronDialogue} {@code Object}. + * + * @param player the player. + */ + public HeronDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HeronDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Hop inside my mouth, if you want to live!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm not falling for that... I'm not a fish! I've got more", "foresight than that."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8647 }; + } + } diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HerquinDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HerquinDialogue.java new file mode 100644 index 000000000..5a5e6c98f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HerquinDialogue.java @@ -0,0 +1,80 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the herquin dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HerquinDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HerquinDialogue} {@code Object}. + */ + public HerquinDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HerquinDialogue} {@code Object}. + * @param player the player. + */ + public HerquinDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HerquinDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "Do you wish to trade?", "Sorry, I don't want to talk to you, actually."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you wish to trade?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't want to talk to you, actually."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Huh, charming."); + stage = 4; + break; + case 4: + end(); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Why, yes, this is a jewel shop after all."); + stage = 11; + break; + case 11: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 584 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HettyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HettyDialogue.java new file mode 100644 index 000000000..51ba420ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HettyDialogue.java @@ -0,0 +1,224 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the hetty npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HettyDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HettyDialogue} {@code Object}. + */ + public HettyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HettyDialogue} {@code Object}. + * @param player the player. + */ + public HettyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HettyDialogue(player); + } + + @Override + public boolean open(Object... args) { + Quest quest = player.getQuestRepository().getQuest("Witch's Potion"); + if (quest.isCompleted(player)) { + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "How's your magic coming along?"); + stage = 0; + } + switch (quest.getStage(player)) { + case 0: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "What could you want with an old woman like me?"); + stage = 11; + break; + case 20: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "So have you found the things for the potion?"); + stage = 100; + break; + case 40: + if (args.length == 2) { + interpreter.sendDialogue("You drink from the cauldron, it tastes horrible! You feel yourself", "imbued with power."); + stage = 41; + } else { + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Well are you going to drink the potion or not?"); + stage = 500; + } + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + Quest quest = player.getQuestRepository().getQuest("Witch's Potion"); + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm practicing and slowly getting better."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Good, good."); + stage = 2; + break; + case 2: + end(); + break; + case 11: + interpreter.sendOptions("Select an Option", "I am in search of a quest.", "I've heard that you are a witch."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I am in search of a quest."); + stage = 13; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I've heard that you are a witch."); + stage = 20; + break; + } + break; + case 13: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Hmmm... Maybe I can think of something for you."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Would you like to become more proficient in the dark", "arts?"); + stage = 15; + break; + case 15: + interpreter.sendOptions("Select an Option", "Yes help me become one with my darker side.", "No I have my prinicples and honour."); + stage = 16; + break; + case 16: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes help me become one with my darker side."); + stage = 30; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No I have m principles and honour."); + stage = 17; + break; + } + break; + case 17: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Suit yourself, but you're missing out."); + stage = 18; + break; + case 18: + end(); + break; + case 20: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Yes it does seem to be getting fairly common", "knowledge."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "I fear I may get a visit from the witch hunter of", "Falador before long."); + stage = 22; + break; + case 22: + end(); + break; + case 30: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Ok I'm going to make a potion to help bring out your", "darker self."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "You will need certain ingredients."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do i need?"); + stage = 33; + break; + case 33: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "You need an eye of newt, a rat's tail, and onion... Oh", "and a piece of burnt meat."); + stage = 34; + break; + case 34: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Great, I'll go get them."); + stage = 35; + break; + case 35: + quest.start(player); + quest.setStage(player, 20); + end(); + break; + case 100: + // Her:Well I can't make the potion without them! + // Remember.../You + // need an eye of newt, a rat's tail, an onion, and a/piece of + // burnt + // meat. Off you go dear! Me:end(); + if (!player.getInventory().containItems(1957, 300, 2146, 221)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm afraid I don't have all of them yet."); + stage = 101; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes I have everything!"); + stage = 110; + } + break; + case 110: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Excellent, can I have them then?"); + stage = 111; + break; + case 111: + interpreter.sendDialogue("You pass the ingredients to Hetty and she puts them all into her", "cauldron. Hetty closes her eyes and begins to chant. The cauldron", "bubbles mysteriously."); + stage = 112; + break; + case 112: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, is it ready?"); + stage = 113; + break; + case 113: + if (player.getInventory().remove(new Item(1957), new Item(300), new Item(2146), new Item(221))) { + quest.setStage(player, 40); + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Ok, now drink from the cauldron."); + stage = 114; + } + break; + case 114: + end(); + break; + case 101: + interpreter.sendDialogues(307, FacialExpression.HALF_GUILTY, "Well I can't make the potion without them! Remember...", "You need an eye of newt, a rat's tail, an onion, and a", "You need an eye of newt, a rat's tail, an onion, and a", "piece of burnt meat. Off you go dear!"); + stage = 102; + break; + case 102: + end(); + break; + case 500: + end(); + break; + case 41: + end(); + quest.finish(player); + player.getQuestRepository().syncronizeTab(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 307 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HicktonDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HicktonDialogue.java new file mode 100644 index 000000000..febb0b3bc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HicktonDialogue.java @@ -0,0 +1,126 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the hickton dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HicktonDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HicktonDialogue} {@code Object}. + */ + public HicktonDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HicktonDialogue} {@code Object}. + * @param player the player. + */ + public HicktonDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HicktonDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to Hickton's Archery Emporium. Do you", "want to see my wares?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (Skillcape.isMaster(player, Skills.FLETCHING)) { + interpreter.sendOptions("Select an Option", "Can I buy a Skillcape of Fletching?", "Yes, please.", "No, I prefer to bash things close up."); + stage = 100; + } else { + interpreter.sendOptions("Select an Option", "Yes, please.", "No, I prefer to bash things close up."); + stage = 1; + } + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, I prefer to bash things close up."); + stage = 20; + break; + } + break; + case 20: + end(); + break; + case 100: + switch (buttonId) { + case 1: + player("Can I buy a Skillcape of Fletching?"); + stage = -99; + break; + case 2: + end(); + npc.openShop(player); + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, I prefer to bash things close up."); + stage = 20; + break; + } + break; + case -99: + npc("You will have to pay a fee of 99,000 gp."); + stage = 101; + break; + case 101: + options("Yes, here you go.", "No, thanks."); + stage = 102; + break; + case 102: + switch (buttonId) { + case 1: + player("Yes, here you go."); + stage = 103; + break; + case 2: + end(); + break; + } + break; + case 103: + if (Skillcape.purchase(player, Skills.FLETCHING)) { + npc("There you go! Enjoy."); + } + stage = 104; + break; + case 104: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 575 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HighPriestDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HighPriestDialogue.java new file mode 100644 index 000000000..a9ab3fad7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HighPriestDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the high priest dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HighPriestDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HighPriestDialogue} {@code Object}. + */ + public HighPriestDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HighPriestDialogue} {@code Object}. + * @param player the player. + */ + public HighPriestDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HighPriestDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Many greetings. Welcome to our fair island."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Enjoy our stay here. May it be spiritually uplifting!"); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 216 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HildDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HildDialogue.java new file mode 100644 index 000000000..5d56af7ef --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HildDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represent the hild dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HildDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HildDialogue} {@code Object}. + */ + public HildDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HildDialogue} {@code Object}. + * @param player the player. + */ + public HildDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HildDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1090 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HistanDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HistanDialogue.java new file mode 100644 index 000000000..1a19016c5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HistanDialogue.java @@ -0,0 +1,87 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the histan dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HistanDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HistanDialogue} {@code Object}. + */ + public HistanDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HistanDialogue} {@code Object}. + * @param player the player. + */ + public HistanDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HistanDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to Burthorpe Supplies. Your last shop before", "heading north into the mountains!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy something?"); + stage = 2; + break; + case 2: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks."); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 20; + break; + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1083 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HiylikMynaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HiylikMynaDialogue.java new file mode 100644 index 000000000..1baecca1d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HiylikMynaDialogue.java @@ -0,0 +1,130 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the hiylikmyna dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HiylikMynaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HiylikMynaDialogue} {@code Object}. + */ + public HiylikMynaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HiylikMynaDialogue} {@code Object}. + * @param player the player. + */ + public HiylikMynaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HiylikMynaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "Can you tell me why you're here?", "Why is there a mini-game sign here?", "Ok, thanks."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you tell me why you're here?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why is there a mini-game sign here?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, thanks."); + stage = 30; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Of course. I plan to assist the forces of Saradomin who", "will come out to aid, and fight against the legion of", "vamypyres that infest this foul place. These brave", "mercenaries shall need a guide."); + stage = 11; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Mini-game sign? Surely sir it is confused and not at all", "in their right mind."); + stage = 21; + break; + case 30: + end(); + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is the collection area for the forces of Saradomin.", "If you know of the plight of the Myreque, you should", "understand what is at stake! Aid the Myreque if you", "can and attempt to draw back the darkness of"); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hallowvale."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Then perhaps you can then be a guiding light for the", "forces of Saradomin, as they enter the lair of the beast."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, thanks."); + stage = 25; + break; + case 25: + end(); + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When a guide arrives, I will aid the mercenary by", "holding their wealth for their eventual return. The", "mercenary will repay the guide by giving him a token", "for items which I am holding."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I shall give such items to the guide as a payment for their", "services once I'm handed the token."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What items will you hold?"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, the range of items is very varied. Mercenaries tend", "to hold raw materials in high esteem and so will deposit", "those with me. They also seem to be good battering", "items."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Generally, things like uncooked lobsters, coal, silver bars,", "bow strings. Things which are useful! Plus the odd", "tome of experience, which are considered incredibly", "useful."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, thanks."); + stage = 17; + break; + case 17: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1514 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HofutThandDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HofutThandDialogue.java new file mode 100644 index 000000000..e6379a4b2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HofutThandDialogue.java @@ -0,0 +1,93 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.ge.GEGuidePrice; +import core.game.ge.GEGuidePrice.GuideType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the hofut thand dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HofutThandDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HofutThandDialogue} {@code Object}. + */ + public HofutThandDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HofutThandDialogue} {@code Object}. + * @param player the player. + */ + public HofutThandDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HofutThandDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What? Oh, hello. I was deep in thought. Did", "you say something?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Do you know about the prices for armour and weapons?", "I didn't say anything at all."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you know about the prices for armour and weapons?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I didn't say anything at all."); + stage = 20; + break; + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I thought you at least said. 'Hello' I must be", "going mad. Do you think I'm going mad?"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, most definitely. You should see a doctor before it's", "too late."); + stage = 22; + break; + case 22: + end(); + break; + case 10: + end(); + GEGuidePrice.open(player, GuideType.WEAPONS_AND_ARMOUR); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6527 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HoodedMonkDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HoodedMonkDialogue.java new file mode 100644 index 000000000..889036451 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HoodedMonkDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the hooded monk dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HoodedMonkDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HoodedMonkDialogue} {@code Object}. + */ + public HoodedMonkDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HoodedMonkDialogue} {@code Object}. + * @param player the player. + */ + public HoodedMonkDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HoodedMonkDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Excuse me...oh, wait, I thought you were someone else."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No problem. Have a good day!"); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3074 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HooknosedJackDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HooknosedJackDialogue.java new file mode 100644 index 000000000..e7839a768 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HooknosedJackDialogue.java @@ -0,0 +1,69 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the hooknodes jack dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HooknosedJackDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HooknosedJackDialogue} {@code Object} + */ + public HooknosedJackDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HooknosedJackDialogue} {@code Object}. + * @param player the player. + */ + public HooknosedJackDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HooknosedJackDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Actually I've got no time for this. I don't want to talk to", "you."); + stage = 2; + break; + case 2: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2948 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HorvikDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HorvikDialogue.java new file mode 100644 index 000000000..902f33395 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HorvikDialogue.java @@ -0,0 +1,82 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the horvik dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HorvikDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HorvikDialogue} {@code Object}. + */ + public HorvikDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HorvikDialogue} {@code Object}. + * @param player the player. + */ + public HorvikDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HorvikDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello, do you need any help?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "No, thanks. I'm just looking around.", "Do you want to trade?"); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks. I'm just looking around."); + stage = 10; + break; + case 2: + end(); + npc.openShop(player); + break; + } + + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, come and see me if you're ever in need of armour!"); + stage = 11; + break; + case 11: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 549 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HuntingExpert.java b/Server/src/main/java/Server/core/game/content/dialogue/HuntingExpert.java new file mode 100644 index 000000000..94cafcbf0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HuntingExpert.java @@ -0,0 +1,275 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the hunting experience dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HuntingExpert extends DialoguePlugin { + + /** + * Represents the items used for buying skillcapes. + */ + private static final Item[] ITEMS = new Item[] { new Item(9948), new Item(9949), new Item(9950) }; + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 99000); + + /** + * Constructs a new {@code HuntingExpert} {@code Object}. + */ + public HuntingExpert() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HuntingExper} {@code Object}. + * @param player the player. + */ + public HuntingExpert(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HuntingExpert(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Whoah there, stranger, careful where you're walking. I", "almost clobbered you there; thought you were a larupia", "or something."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + interpreter.sendOptions("Select an Option", "What are you doing here?", "What's a laurpia?", "What is that cool cape you're wearing?", "Ahh, leave me alone you crazy killing person."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What are you doing here?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's a laurpia?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is that cool cape you're wearing?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ahh, leave me alone you crazy killing person."); + stage = 140; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Me? Oh, I'm just having some fun, capturing wild", "animals, living on the edge, stuff like that."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hey, want me to teach you how to catch the critters", "around here? Ain't come across anything yet that I", "couldn't capture."); + stage = 12; + break; + case 12: + interpreter.sendOptions("Select an Option", "Okay, where's a good place to start?", "What sort of things are there to catch around here?", "How can I improve my chances of making a capture?", "How can I get clothes and equipment like yours?", "I think I'll give it a miss right now."); + stage = 13; + break; + case 13: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, where's a good place to start?"); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What sort of things are there to catch around here?"); + stage = 110; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How can I improve my chances of making a capture?"); + stage = 120; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where can I get clothes and equipment like yours?"); + stage = 130; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I think I'll give it a miss right now, thanks."); + stage = 150; + break; + } + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Your easiest bet around here is probably to go for some", "of the birds. Go for crimson swifts; they're the", "bright red ones that hang around near the coast.", "They're as obliging as can be, or maybe they're just"); + stage = 101; + break; + case 101: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "plain dumb, but either way they just seem to throw", "themselves into traps half the time."); + stage = 102; + break; + case 102: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What sort of trap should I use?"); + stage = 103; + break; + case 103: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Just use a strandard bird snare and you'll be fine. You", "can get them in any decent shop that sells Hunter", "gear."); + stage = 104; + break; + case 104: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How do they work, then?"); + stage = 105; + break; + case 105: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, they're kind of sneaky, really. You've got a tall", "post with what appears to be a little perch sticking out", "the side. Now, that the bird will see this as somewhere to sit", "but the perch is actually rigged such that when the bird"); + stage = 106; + break; + case 106: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "lands on it, it'll drop away."); + stage = 107; + break; + case 107: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Futher, as the perch drops, it releases a noose that", "tightens around the bird's feet and captures it. Neat", "huh?"); + stage = 108; + break; + case 110: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What're you interested in? You've got anything from", "birds for begginers up to laurpias for the pros, not to", "mention weasels, butterflies, barb-tails and chinchompas."); + stage = 111; + break; + case 111: + end(); + break; + case 120: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There are four key factors that will affect your", "chances: what bait you use, how close to the trap you", "are, your appearance and your smell."); + stage = 121; + break; + case 121: + end(); + break; + case 130: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, the equipment isn't too hard to get hold of. You've", "got specialist shops like Aleck's in Yanille that'll see you", "right. He's a bit pricey, mind, but it's pretty decent kit."); + stage = 131; + break; + case 131: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The clothing is a tad trickier to get hold of, the", "materials required being rather difficult to seperate from", "their relucant owners."); + stage = 132; + break; + case 132: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "But, if you can get the furs, there are shops like the", "tailor's in east Varrock that can help you."); + stage = 133; + break; + case 133: + end(); + break; + case 140: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Heh, well I guess it's not everyone's thing."); + stage = 141; + break; + case 150: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Suit yourself!"); + stage = 151; + break; + case 151: + end(); + break; + case 108: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What's a laurpia? You don't know? You mean you", "really don't recognise the significance of these clothes", "I'm wearing?"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, they're certainly decorative...what about them?"); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, these are the furs from a laurpia. Caught the", "creature myself I did, and these make me blend in", "better, see?"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If you want to be successful as a hunter you've got to", "be as stealthy as a kyatt, as quiet as a mouse and blend", "in like a, well like a larupia, I guess!"); + stage = 24; + break; + case 24: + end(); + break; + case 30: + if (player.getSkills().getLevel(Skills.HUNTER) < 99) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This? It's a Hunter's Skillcape. It shows that I am a", "true master of the art of Hunting. If you ever manage", "to train your Hunter skill to it maximu level then I", "could sell you one."); + stage = 31; + } else { + interpreter.sendDialogues(npc, null, "An adventurer whom possesses the same level", "of Hunter as me, would you be interested in buying", "a skillcape of Hunter for 99,000 gold coins ?"); + stage = 35; + } + break; + case 31: + end(); + break; + case 35: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you."); + stage = 36; + break; + case 36: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Yes, please."); + stage = 38; + break; + case 2: + interpreter.sendDialogues(player, null, "Yes, please."); + stage = 99; + break; + } + break; + case 38: + if (!player.getInventory().contains(995, 99000)) { + interpreter.sendDialogues(player, null, "Sorry, I dont have that amount of money."); + stage = 99; + break; + } else { + if (player.getInventory().freeSlots() < 2) { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough inventory space."); + stage = 99; + break; + } + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (player.getInventory().remove(COINS)) { + player.getInventory().add(player.getSkills().getMasteredSkills() > 1 ? ITEMS[1] : ITEMS[0], ITEMS[2]); + interpreter.sendDialogues(npc, null, "There you go! Enjoy adventurer."); + stage = 99; + } + } + break; + case 99: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5112, 5113 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HuraDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HuraDialogue.java new file mode 100644 index 000000000..09ffe1f16 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HuraDialogue.java @@ -0,0 +1,154 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the hura npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HuraDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HuraDialogue} {@code Object}. + */ + public HuraDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HuraDialogue} {@code Object}. + * @param player the player. + */ + public HuraDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HuraDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "'Ello " + player.getUsername() + "."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, what's that you've got there?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A crossbow, are you interested?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Maybe, are they any good?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Are they any good?! They're dwarven engrineering at", "its best!"); + stage = 4; + break; + case 4: + interpreter.sendOptions("Select an Option", "How do I make one for myself?", "What about ammo?", "Thanks for teling me. Bye!"); + stage = 5; + break; + case 5: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How do I make one for myself?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What about ammo?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks for telling me. Bye!"); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, firstly you'll need to chop yourself some wood,", "then use a knife on the wood to whittle out a nice", "crossbow stock like these here."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Wood fletched into stock... check."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Then get yourself some metal and a hammer and smith", "yourself some limbs for the bow, mind that you use the", "right metals and wood though as some wood is too light", "to use with some metal and vice versa."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Which goes with which?"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Wood and Bronze as they're basic materials, Oak and", "Blurite, Willow and Iron, Steel and Teak, Mithril and", "Maple, Adamantite and Mahogany and finally Runite", "and Yew."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, so I have my stock and a pair of limbs... what now?"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Simply take a hammer and smack the limbs firmly onto", "the stock. You'll need a string, only they're not", "the same as normal bows. You'll need to dry some large", "animal's meat to get sinew, then spin that on a spinning"); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "wheel, it's the only thing we've found to be strong", "enough for a crossbow."); + stage = 18; + break; + case 18: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks for telling me. Bye!"); + stage = 30; + break; + case 30: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You can smith yourself lots of different bolts, don't", "forget to flight them with feathers like you do arrows", "though. You can poison any untipped bolt but there's", "also the option of tipping them with gems then"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "enchanting them with runes. This can have some pretty", "powerful effects."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh my poor bank, how will I store all those?!"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Find Hirko in Keldagrim, he also sells crossbow parts", "and I'm sure he has something you can use to store", "bolts in."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks for the info."); + stage = 25; + break; + case 25: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4563 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/HygdDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/HygdDialogue.java new file mode 100644 index 000000000..3ecf8be80 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/HygdDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the hygd dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HygdDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code HygdDialogue} {@code Object}. + */ + public HygdDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HygdDialogue} {@code Object}. + * @param player the player. + */ + public HygdDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HygdDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1088 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/IcyCavernDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/IcyCavernDialogue.java new file mode 100644 index 000000000..f364c0dad --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/IcyCavernDialogue.java @@ -0,0 +1,81 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the icy cavern dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class IcyCavernDialogue extends DialoguePlugin { + + /** + * Represents the dialogue id. + */ + public static final int ID = 238284; + + /** + * Represents the location to teleport to. + */ + private static final Location LOCATION = Location.create(3056, 9555, 0); + + /** + * Constructs a new {@code IcyCavernDialogue} {@code Object}. + */ + public IcyCavernDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code IcyCavernDialogue} {@code Object}. + * @param player the player. + */ + public IcyCavernDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new IcyCavernDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("STOP! The creatures in this cave are VERY Dangerous. Are you", "sure you want to enter?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, I'm not afraid of death!", "No thanks, I don't want to die!"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + player.getProperties().setTeleportLocation(LOCATION); + player.getPacketDispatch().sendMessage("You venture into the icy cavern."); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/IffieDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/IffieDialogue.kt new file mode 100644 index 000000000..1550208f2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/IffieDialogue.kt @@ -0,0 +1,32 @@ +package core.game.content.dialogue + +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * Iffie + * @author afaroutdude + */ +@Initializable +class IffieDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun open(vararg args: Any?): Boolean { + npc("Sorry, dearie, if I stop to chat I'll lose count.", "Talk to my sister instead; she likes to chat.", "You'll find her upstairs in the church.") + stage = 999; + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 999 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return IffieDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(5914) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/IgnatiusVulcanDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/IgnatiusVulcanDialogue.java new file mode 100644 index 000000000..19d2f80b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/IgnatiusVulcanDialogue.java @@ -0,0 +1,249 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the dialogue used for ignatius vulcan. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class IgnatiusVulcanDialogue extends DialoguePlugin { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(733, Priority.HIGH); + + /** + * Constructs a new {@code IgnatiusVulcanDialogue} {@code Object}. + */ + public IgnatiusVulcanDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code IgnatiusVulcanDialogue} {@code Object}. + * @param player the player. + */ + public IgnatiusVulcanDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new IgnatiusVulcanDialogue(player); + } + + @Override + public void init() { + super.init(); + try { + new IgnatiusVulcanNPC().newInstance(null); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Can I help you at all?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (Skillcape.isMaster(player, Skills.FIREMAKING)) { + options("Who are you?", "Could I buy a Skillcape of Firemaking?", "No, thanks."); + stage = 100; + } else { + options("Who are you?", "What is that cape you're wearing?", "No, thanks."); + stage = 1; + } + break; + case 100: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("Could I buy a Skillcape of Firemaking?"); + stage = 101; + break; + case 3: + player("No, thanks."); + stage = 30; + break; + } + break; + case 101: + npc("Certainly! Right when you give me 99000 coins."); + stage = 102; + break; + case 102: + options("Okay, here you go.", "No, thanks."); + stage = 103; + break; + case 103: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 104; + break; + case 2: + end(); + break; + } + break; + case 104: + if (Skillcape.purchase(player, Skills.FIREMAKING)) { + npc("There you go! Enjoy."); + } + stage = 105; + break; + case 105: + end(); + break; + case 1: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("What is that cape you're wearing?"); + stage = 20; + break; + case 3: + player("No, thanks."); + stage = 30; + break; + } + break; + case 10: + npc("My name is Ignatius Vulcan. Once I was - like you -", "an adventurer, but that was before I realised the", "beauty and power of flame! Just look at this..."); + stage = 11; + break; + case 11: + createFire(npc, player.getLocation()); + player.moveStep(); + player.sendChat("Yeeouch!"); + npc("Stare into the flame and witness the purity and power", "of fire! As my attraction to flame grew, so did my skills", "at firelighting. I began to neglect my combat skills, my", "Mining skills and my questing. Who needs such"); + stage = 12; + break; + case 12: + npc("mundane skills when one can harness the power of fire?", "After years of practice I am now the acknowledged", "master of Flame! Everything must be purified by fire!"); + stage = 13; + break; + case 13: + player("Okaaay! err, I'll be going now. Umm, get better soon."); + stage = 14; + break; + case 14: + end(); + break; + case 20: + npc("This is a Skillcape of Firemaking. I was given it in", "recognition of my skill as the greatest firemaker in the", "lands! I AM the Master of Flame!"); + stage = 21; + break; + case 21: + player("Hmm, I'll be going now. Keep a sharp look out for", "those men with their white jackets!"); + stage = 22; + break; + case 22: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + /** + * Method used to create an ignatius fire. + */ + public static void createFire(final NPC npc, final Location location) { + npc.getWalkingQueue().reset(); + npc.getAnimator().forceAnimation(ANIMATION); + if (RegionManager.getObject(location) == null) { + final GameObject fire = new GameObject(2732, location); + ObjectBuilder.add(fire, RandomFunction.random(100, 130)); + npc.faceLocation(fire.getLocation()); + } + } + + @Override + public int[] getIds() { + return new int[] { 4946 }; + } + + /** + * Represents the ignatius vulcan npc as a representation. + * @author 'Vexia + * @version 1.0 + */ + public final class IgnatiusVulcanNPC extends AbstractNPC { + + /** + * Represents the time till the last fire. + */ + private int lastFire; + + /** + * Constructs a new {@code IgnatiusVulcanNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public IgnatiusVulcanNPC(int id, Location location) { + super(id, location, true); + } + + /** + * Constructs a new {@code IgnatiusVulcanNPC} {@code Object}. + */ + public IgnatiusVulcanNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new IgnatiusVulcanNPC(id, location); + } + + @Override + public void tick() { + if (lastFire < GameWorld.getTicks()) { + createFire(this, getLocation()); + lastFire = GameWorld.getTicks() + RandomFunction.random(50, 200); + } + super.tick(); + } + + @Override + public int[] getIds() { + return new int[] { 4946 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/InformationclerkMuseumDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/InformationclerkMuseumDialogue.java new file mode 100644 index 000000000..5e3caf39a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/InformationclerkMuseumDialogue.java @@ -0,0 +1,220 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.GameWorld; +import core.tools.Items; + +/** + * Represents the information clerk museum dialogue plugin + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class InformationclerkMuseumDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code InformationclerkMuseumDialogue} {@code Object}. + */ + public InformationclerkMuseumDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code InformationclerkMuseumDialogue} {@code Object}. + * + * @param player the player. + */ + public InformationclerkMuseumDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new InformationclerkMuseumDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Welcome to Varrock Museum. How can I help you today?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 150: + npc("Of course. The Dig Site exhibit has several display cases", "of finds discovered on the Dig Site to the east of Varrock."); + stage = 151; + break; + case 151: + npc("As you've passed your Earth Science exams at the Dig", "Site, you can go through into the cleaning area and clean", "off some finds. This will help our Dig Site display floor to", "give a more accurate view of life back in the 3rd and fth"); + stage = 152; + break; + case 152: + npc("Ages, as well as earning you Kudos. If you'd like to know", "more about cleaning finds, just ask the archaeologists."); + stage = 153; + break; + case 153: + options("Ask about something else.", "Bye"); + stage = 154; + break; + case 154: + switch (buttonId) { + case 1: + player("What else can you inform me on?"); + stage = 0; + break; + case 2: + player("Bye!"); + stage = 200; + break; + } + break; + case 200: + end(); + break; + case 170: + npc("Why, yes. The Timeline exhibit has lots of display cases", "showing things from the beginning of time right up to the", "present day."); + stage = 171; + break; + case 171: + npc("I know you've helped out a bit in the Timeline exhibit", "upstairs, but I'm sure you can help more. When you're out", "on your travels being a vrave adventurer, remember that", "you can come back to the Museum after some quests to"); + stage = 172; + break; + case 172: + npc("let us know important historical facts. This will help us to", "update the displays and make the Museum a more", "informative place! You'll earn yourself Kudos too."); + stage = 173; + break; + case 173: + player("Okay, thanks. One more question: why are the display", "numbers all out of sequence?"); + stage = 174; + break; + case 174: + npc("Ahh, that's due to the numbering being done as we were", "constructing the cases and putting the displays in them,", "then suffling them into the right places. We thought", "rather than renumbering them all - such a boring job,"); + stage = 175; + break; + case 175: + npc("writing labels - we'd leave it. They all have unique numbers", "and future displays would mess up the consecutive", "numbering anyway."); + stage = 176; + break; + case 176: + player("Ahhh, I see."); + stage = 153; + break; + case 180: + npc("Why, yes. The Natural History exhibit has displays of", "various creatures you can find around " + GameWorld.getSettings().getName() + "."); + stage = 181; + break; + case 181: + npc("I see you have already demonstrated some of your", "knowledge of the natural world in the Natural History", "exhibit, so why not pop down and so some more quizzes", "with Orlando! You can earn Kudos at the same time."); + stage = 182; + break; + case 182: + options("But what's Natural History got to do with existing animals?", "Ask about something else.", "Bye"); + stage = 183; + break; + case 183: + switch (buttonId) { + case 1: + player("But what's natural history got to do with existing animals?"); + stage = 184; + break; + case 2: + player("What else can you inform me on?"); + stage = 0; + break; + case 3: + player("Bye!"); + stage = 200; + break; + } + break; + case 184: + npc("The study of nautral history is simply the study of the", "history of the species. The species doesn't neccasrily", "need to be an extinct one."); + stage = 153; + break; + case 230: + npc("Kudos is a measure of how much you've assisted the", "Museum. The more information you give us, Dig Site", "finds that you clean and quizzes you solve, the", "higher your Kudos."); + stage = 231; + break; + case 231: + player("But what's it for?"); + stage = 232; + break; + case 232: + npc("Well, recently we found a rather interesting island to the", "north of Morytania. We believe that it may be of", "archaeological significance. I suspect we'll be looking for", "qualified archaeologists once we have constructed out"); + stage = 233; + break; + case 233: + npc("canal and barge. So, we're using Kudos as a measure of", "who is willing and able to help us here at the Museum, so", "they can then be invited on our dig son the new island."); + stage = 234; + break; + case 234: + player("Would I qualify, then?"); + stage = 235; + break; + case 235: + npc("Unfortunately, you haven't earned enough Kudos yet, so", "you aren't qualified to help us on the dig. If you're", "interested in helping us out and getting that Kudos, simply", "help out around the museum."); + stage = 236; + break; + case 236: + player("Okay, thanks."); + stage = 237; + break; + case 237: + end(); + break; + case 0: + interpreter.sendOptions("What would you like to do?", + "Take a map of the Museum.", + "Find out about the Dig Site exhibit.", + "Find out about the Timeline exhibit.", + "Find out about the Natural History exhibit.", + "Find out about Kudos."); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + sendDialogue("You reach and take a map of the Museum."); + player.getInventory().add(new Item(Items.MUSEUM_MAP_11184, 1)); + stage = 999; + break; + case 2: + player("Could you tell me about the Dig Site exhibit please?"); + stage = 150; + break; + case 3: + player("Could you tell me about the Timeline exhibit please?"); + stage = 170; + break; + case 4: + player("Could you tell me about the Natural History exhibit", "please?"); + stage = 180; + break; + case 5: + npc("What is Kudos?"); + stage = 230; + break; + + } + + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{5938}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/IrinaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/IrinaDialogue.java new file mode 100644 index 000000000..3d30cb56a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/IrinaDialogue.java @@ -0,0 +1,59 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the irina npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class IrinaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code IrinaDialogue} {@code Object}. + */ + public IrinaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code IrinaDialogue} {@code Object}. + * @param player the player. + */ + public IrinaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new IrinaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Out of my way, punk."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6035 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/JackSeagullDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/JackSeagullDialogue.java new file mode 100644 index 000000000..c1bdfb4d1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/JackSeagullDialogue.java @@ -0,0 +1,96 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the hack seafull dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class JackSeagullDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code JackSeagullDialogue} {@code Object}. + */ + public JackSeagullDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JackSeagullDialogue} {@code Object}. + * @param player the player. + */ + public JackSeagullDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JackSeagullDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Arrr, matey!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("What would you like to say?", "What are you doing here?", "Have you got any quests I could do?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What are you doing here?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have you got any quests I could do?"); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Drinking."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Fair enough."); + stage = 12; + break; + case 12: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nay, I've nothing for ye to do."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks."); + stage = 22; + break; + case 22: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2690 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/JaraahDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/JaraahDialogue.java new file mode 100644 index 000000000..d0f62b2d8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/JaraahDialogue.java @@ -0,0 +1,118 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the jaraah dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class JaraahDialogue extends DialoguePlugin { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(881); + + /** + * Constructs a new {@code JaraahDialogue} {@code Object}. + */ + public JaraahDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JaraahDialogue} {@code Object}. + * @param player the player. + */ + public JaraahDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JaraahDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What? Can't you see I'm busy?!"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Can you heal me?", "You must see some gruesome things?", "Why do they call you 'The Butcher'?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you heal me?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You must see some gruesome things?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why do they call you 'The Butcher'?"); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "OK. This will hurt you more than it will me."); + stage = 11; + break; + case 11: + npc.animate(ANIMATION); + if (player.getSkills().getLifepoints() == player.getSkills().getStaticLevel(Skills.HITPOINTS)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You look healthy to me!"); + } else { + player.getSkills().heal(player.getSkills().getStaticLevel(Skills.HITPOINTS)); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There you go!"); + } + stage = 12; + break; + case 12: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's a gruesome business and with the tools they give", "me it gets more gruesome before it gets better!"); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I often have to amputate peoples limbs!"); + stage = 31; + break; + case 31: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 962 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/JatixDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/JatixDialogue.java new file mode 100644 index 000000000..dc5516890 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/JatixDialogue.java @@ -0,0 +1,68 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the jatix npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class JatixDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code JatixDialogue} {@code Object}. + */ + public JatixDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JatixDialogue} {@code Object}. + * @param player the player. + */ + public JatixDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JatixDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello, adventurer."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What are you selling?"); + stage = 2; + break; + case 2: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 587 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/JeffDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/JeffDialogue.java new file mode 100644 index 000000000..959729dd2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/JeffDialogue.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the jeff npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class JeffDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code JeffDialogue} {@code Object}. + */ + public JeffDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JeffDialogue} {@code Object}. + * @param player the player. + */ + public JeffDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JeffDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Tell me, is the guard still watching us?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why would you care if there's a guard watching you?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, forget it."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3240 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/JiminuaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/JiminuaDialogue.java new file mode 100644 index 000000000..5c1581541 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/JiminuaDialogue.java @@ -0,0 +1,146 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.tools.Items; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.item.Item; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the jiminua dialogue plugin. + * + * @author 'afaroutdude + */ +@Initializable +public final class JiminuaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code JiminuaDialogue} {@code Object}. + */ + public JiminuaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JiminuaDialogue} {@code Object}. + * + * @param player the player. + */ + public JiminuaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + PluginManager.definePlugin(new JiminuaUnnoteHandler()); + return new JiminuaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Welcome to Jiminua's Jungle Store, Can I help you", "at all?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + break; + case 0: + options("Yes please. What are you selling?", "How should I use your shop?", "Can you un-note any of my items?", "No thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Yes please. What are you selling?"); + stage = 10; + break; + case 2: + player("How should I use your shop?"); + stage = 20; + break; + case 3: + player("Can you un-note any of my items?"); + stage = 30; + break; + case 4: + player("No thanks."); + stage = 999; + break; + } + break; + case 10: + npc("Take a good look."); + stage++; + break; + case 11: + end(); + npc.openShop(player); + break; + case 20: + npc("I'm glad you ask! You can buy as many of the items", "stocked as you wish. You can also sell most items", "to the shop."); + stage = 999; + break; + case 30: + npc("I can un-note pure essence, but nothing else. Just", "give me the notes you wish to exchange."); + stage = 999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{560}; + } + + private static final class JiminuaUnnoteHandler extends UseWithHandler { + public JiminuaUnnoteHandler() { + super(Items.PURE_ESSENCE_7937); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(560, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + assert (event.getUsedItem().getId() == Items.PURE_ESSENCE_7937); + int ess = player.getInventory().getAmount(Items.PURE_ESSENCE_7937); + int coins = player.getInventory().getAmount(Items.COINS_995); + int freeSpace = player.getInventory().freeSlots(); + + if (ess == 0) { + player.getDialogueInterpreter().sendDialogues(560, FacialExpression.HALF_GUILTY, "You don't have any essence for me to un-note."); + return true; + } else if (freeSpace == 0) { + player.getDialogueInterpreter().sendDialogues(560, FacialExpression.HALF_GUILTY, "You don't have any free space."); + return true; + } else if (coins <= 1) { + player.getDialogueInterpreter().sendDialogues(560, FacialExpression.HALF_GUILTY, "I charge 2 gp to un-note each pure essence."); + return true; + } + + int unnote = Math.min(Math.min(freeSpace, ess), coins / 2); + player.getInventory().remove(new Item(Items.PURE_ESSENCE_7937, unnote)); + player.getInventory().remove(new Item(Items.COINS_995, 2 * unnote)); + player.getInventory().add(new Item(Items.PURE_ESSENCE_7936, unnote)); + player.getPacketDispatch().sendMessage("You hand Jiminua some notes and coins, and she hands you back pure essence."); + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/JoeGuardDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/JoeGuardDialogue.java new file mode 100644 index 000000000..f7d1018e7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/JoeGuardDialogue.java @@ -0,0 +1,186 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue of the Joe guard NPC. + * @author 'Vexia + * @date 1/14/1 + */ +@Initializable +public final class JoeGuardDialogue extends DialoguePlugin { + + /** + * Represents the beer item. + */ + private static final Item BEER = new Item(1917); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code JoeGuardDialogue} {@code Object}. + */ + public JoeGuardDialogue() { + + } + + /** + * Constructs a new {@code JoeGuardDialogue} {@code Object}. + * @param player the player. + */ + public JoeGuardDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JoeGuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + switch (quest.getStage(player)) { + case 40: + if (player.getAttribute("guard-drunk", false)) { + interpreter.sendDialogues(npc, null, "Halt! Who goes there?"); + stage = 23; + return true; + } + if (player.getInventory().contains(1917, 3)) { + interpreter.sendDialogues(player, null, "I have some beer here, fancy one?"); + stage = 10; + break; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi, I'm Joe, door guard for Lady Keli."); + stage = 0; + break; + case 60: + case 100: + interpreter.sendDialogues(npc, null, "Halt! Who goes there? Friend or foe?"); + stage = 0; + break; + default: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi, I'm Joe, door guard for Lady Keli."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (quest.getStage(player) > 50) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, null, "Hi friend, I am just checking out things here."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "The Prince got away, I am in trouble. I better not talk", "to you, they are not sure I was drunk."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + if (stage >= 10 && quest.getStage(player) == 40) { + switch (stage) { + case 10: + interpreter.sendDialogues(npc, null, "Ah, that would be lovely, just one now,", "just to wet my throat."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, null, "Of course, it must be tough being here without a drink."); + stage = 12; + break; + case 12: + interpreter.sendDialogue("You hand a beer to the guard, he drinks it in seconds."); + stage = 13; + break; + case 13: + if (!player.getInventory().containsItem(BEER)) { + end(); + return true; + } + if (player.getInventory().remove(BEER)) { + interpreter.sendDialogues(npc, null, "That was perfect, I can't thank you enough."); + stage = 14; + } + break; + case 14: + interpreter.sendDialogues(player, null, "How are you? Still ok? Not too drunk?"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(player, null, "Would you care for another, my friend?"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, null, "I better not, I don't want to be drunk on duty."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(player, null, "Here, just keep these for later,", "I hate to see a thirsty guard."); + stage = 18; + break; + case 18: + if (player.getInventory().remove(BEER) && player.getInventory().remove(BEER)) { + interpreter.sendDialogue("You hand two more beers to the guard.", "He takes a sip of one, and then he drinks the both."); + stage = 19; + player.setAttribute("/save:guard-drunk", true); + } + break; + case 19: + interpreter.sendDialogues(npc, null, "Franksh, that wash just what I need to shtay on guard.", "No more beersh, I don't want to get drunk."); + stage = 20; + break; + case 20: + interpreter.sendDialogue("The guard is drunk, and no longer a problem."); + stage = 21; + break; + case 21: + end(); + break; + case 23: + interpreter.sendDialogues(player, null, "Hello friend, I am just rescuing the prince, is that ok?"); + stage = 24; + break; + case 24: + interpreter.sendDialogues(npc, null, "Thatsh a funny joke. You are lucky I am shober. Go", "in peace, friend."); + stage = 21; + break; + } + return true; + } + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi, who are you guarding here?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can't say, all very secret. You should get out of here.", "I am not suposed to talk while I guard."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 916 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/JosephDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/JosephDialogue.java new file mode 100644 index 000000000..b116f8460 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/JosephDialogue.java @@ -0,0 +1,59 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the joseph npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class JosephDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code JosephDialogue} {@code Object}. + */ + public JosephDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JosephDialogue} {@code Object}. + * @param player the player. + */ + public JosephDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JosephDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I have no interest in talking to a pathetic meat bag like", "yourself."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6029 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/JossikDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/JossikDialogue.java new file mode 100644 index 000000000..2d677105b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/JossikDialogue.java @@ -0,0 +1,173 @@ +package core.game.content.dialogue; + +import java.util.ArrayList; +import java.util.List; + +import core.game.content.global.GodBook; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the dialogue for jossik. + * @author Vexia + */ +@Initializable +public class JossikDialogue extends DialoguePlugin { + + /** + * The uncompleted list of books. + */ + private List uncompleted; + + /** + * Constructs a new {@code JossikDialogue} {@code Object} + */ + public JossikDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JossikDialogue} {@code Object} + * @param player the player. + */ + public JossikDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JossikDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hello again, adventurer.", "What brings you this way?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Can I see your wares?", "Have you found any prayerbooks?"); + stage++; + break; + case 1: + if (buttonId == 1) { + player("Can I see your wares?"); + stage = 10; + } else { + player("Have you found any prayerbooks?"); + stage = 20; + } + break; + case 20: + boolean missing = false; + for (GodBook book : GodBook.values()) { + if (player.getSavedData().getGlobalData().hasCompletedGodBook(book) && !player.hasItem(book.getBook())) { + missing = true; + player.getInventory().add(book.getBook(), player); + npc("As a matter of fact, I did! This book washed up on the", "beach, and I recognised it as yours!"); + } + } + int damaged = player.getSavedData().getGlobalData().getGodBook(); + if (damaged != -1 && !player.hasItem(GodBook.values()[damaged].getDamagedBook())) { + missing = true; + player.getInventory().add(GodBook.values()[damaged].getDamagedBook(), player); + npc("As a matter of fact, I did! This book washed up on the", "beach, and I recognised it as yours!"); + } + if (missing) { + stage = 23; + return true; + } + uncompleted = new ArrayList<>(); + for (GodBook book : GodBook.values()) { + if (!player.getSavedData().getGlobalData().hasCompletedGodBook(book)) { + uncompleted.add(book); + } + } + boolean hasUncompleted = false; + for (GodBook book : GodBook.values()) { + if (player.hasItem(book.getDamagedBook())) { + hasUncompleted = true; + } + } + if (uncompleted.size() == 0 || hasUncompleted) {// all + // completed. + npc("No, sorry adventurer, I haven't."); + stage = 23; + return true; + } + npc("Funnily enough I have! I found some books in caskets", "just the other day! I'll sell one to you for 5000 coins;", "what do you say?"); + stage++; + break; + case 21: + String[] names = new String[uncompleted.size() + 1]; + for (int i = 0; i < uncompleted.size(); i++) { + names[i] = uncompleted.get(i).getName(); + } + names[names.length - 1] = "Don't buy anything."; + options(names); + stage++; + break; + case 22: + if (buttonId - 1 > uncompleted.size() - 1) { + player("Don't buy anything."); + stage = 23; + break; + } + if (!player.getInventory().contains(995, 5000)) { + player("Sorry, I don't seem to have enough coins."); + stage = 23; + break; + } + if (player.getInventory().freeSlots() == 0) { + player("Sorry, I don't have enough inventory space."); + stage = 23; + break; + } + GodBook purchase = uncompleted.get(buttonId - 1); + if (purchase != null && player.getInventory().remove(new Item(995, 5000))) { + npc("Here you go!"); + player.getSavedData().getGlobalData().setGodBook(purchase.ordinal()); + player.getInventory().add(purchase.getDamagedBook(), player); + stage = 23; + } else { + end(); + } + break; + case 23: + end(); + break; + case 10: + npc("Sure thing!", "I think you'll agree, my prices are remarkable!"); + stage++; + break; + case 11: + npc.openShop(player); + end(); + break; + } + return true; + } + + /** + * Checks if the player has a god book. + * @return {@code True} if so. + */ + public boolean hasGodBook() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1334, 1335 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/JungleForesterDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/JungleForesterDialogue.java new file mode 100644 index 000000000..d92570368 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/JungleForesterDialogue.java @@ -0,0 +1,160 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialoge used for a jungle forester. + * @author Vexia + */ +@Initializable +public class JungleForesterDialogue extends DialoguePlugin { + + /** + * The achievement diary. + */ + private AchievementDiary diary; + + /** + * Constructs a new {@code KalebParamaya} {@code Object} + */ + public JungleForesterDialogue() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code KalebParamaya} {@code Object} + * @param player the player. + */ + public JungleForesterDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JungleForesterDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("I have a question about my Achievement Diary."); + stage = 41; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 41: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); + } + if (diary.isComplete(2) && !diary.isLevelRewarded(2)) { + player("I've done all the hard tasks in my Karamja", "Achievement Diary."); + stage = 440; + break; + } + if (diary.isLevelRewarded(2) && diary.isComplete(2) && !player.hasItem(diary.getType().getRewards(2)[0])) { + player("I've seemed to have lost my gloves.."); + stage = 450; + break; + } + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage++; + break; + case 42: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); + } + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 410; + break; + case 2: + player("What are the rewards?"); + stage = 420; + break; + case 3: + player("How do I claim the rewards?"); + stage = 430; + break; + case 4: + end(); + break; + } + break; + case 440: + npc("Yes I see that, you'll be wanting your", "reward then I assume?"); + stage++; + break; + case 441: + player("Yes please."); + stage++; + break; + case 442: + diary.setLevelRewarded(2); + for (Item i : diary.getType().getRewards(2)) { + player.getInventory().add(i, player); + } + npc("These Karamja gloves are a symbol of your explorin'", "on the island. All the merchants will recognise them", "and mabe give you a discount. I'll", "have a word with some of the seafarin' folk who sail to"); + stage += 2; + case 443: + npc("Port Sarim and Ardougne, so they'll take you on board", "half price if you're wearing them. Ttake this lamp I", "found washed ashore too."); + stage++; + break; + case 444: + player("Wow, thanks!"); + stage = 41; + break; + case 450: + player.getInventory().add(diary.getType().getRewards(2)[0], player); + npc("You better be more careful this time."); + stage = 41; + break; + case 410: + npc("It's a diary that helps you keep track of particular", "achievements. Here on Karamja it can help you", "discover some quite useful things. Eventually, with", "enough exploration, the people of Karamja will reward"); + stage++; + break; + case 411: + npc("you."); + stage++; + break; + case 412: + npc("You can see what tasks you have listed by clicking on", "the green button in the Quest List."); + stage = 41; + break; + case 420: + npc("Well, there's three different pairs of Karamja gloves,", "which match up with the three levels of difficulty. Each", "has the same rewards as the previous level, and an", "additional one too... but I won't spoil your surprise."); + stage++; + break; + case 421: + npc("Rest assured, the people of Karamja are happy to see", "you visiting the island."); + stage = 41; + break; + case 430: + npc("Just complete the tasks so they're all ticked off, then", "you can claim yer reward. Most of them are", "straightforward; you might find some require quests to", "be started, if not finished."); + stage++; + break; + case 431: + npc("To claim the different Karamja gloves, speak to Pirate", "Jackie the Fruit in Brim Haven, one of the jungle foresters", "near the Kharazi Jungle, or me."); + stage = 41; + break; + case 50: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 401, 402 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KalebDialgoue.java b/Server/src/main/java/Server/core/game/content/dialogue/KalebDialgoue.java new file mode 100644 index 000000000..525046229 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KalebDialgoue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the kaleb dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KalebDialgoue extends DialoguePlugin { + + /** + * Constructs a new {@code KalebDialgoue} {@code Object}. + */ + public KalebDialgoue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KalebDialgoue} {@code Object}. + * @param player the player. + */ + public KalebDialgoue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KalebDialgoue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Bye!"); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 666 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KalebParamaya.java b/Server/src/main/java/Server/core/game/content/dialogue/KalebParamaya.java new file mode 100644 index 000000000..e23607abb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KalebParamaya.java @@ -0,0 +1,161 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialoge used for kaleb paramaya. + * @author Vexia + */ +@Initializable +public class KalebParamaya extends DialoguePlugin { + + /** + * The achievement diary. + */ + private AchievementDiary diary; + + /** + * Constructs a new {@code KalebParamaya} {@code Object} + */ + public KalebParamaya() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code KalebParamaya} {@code Object} + * @param player the player. + */ + public KalebParamaya(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KalebParamaya(player); + } + + @Override + public boolean open(Object... args) { + player("I have a question about my Achievement Diary."); + stage = 41; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 41: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); + } + if (diary.isComplete(1) && !diary.isLevelRewarded(1)) { + player("I've done all the medium tasks in my Karamja", "Achievement Diary."); + stage = 440; + break; + } + if (diary.isLevelRewarded(1) && diary.isComplete(1) && !player.hasItem(diary.getType().getRewards(1)[0])) { + player("I've seemed to have lost my gloves.."); + stage = 450; + break; + } + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage++; + break; + case 42: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); + } + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 410; + break; + case 2: + player("What are the rewards?"); + stage = 420; + break; + case 3: + player("How do I claim the rewards?"); + stage = 430; + break; + case 4: + end(); + break; + } + break; + case 440: + npc("Yes I see that, you'll be wanting your", "reward then I assume?"); + stage++; + break; + case 441: + player("Yes please."); + stage++; + break; + case 442: + diary.setLevelRewarded(1); + for (Item i : diary.getType().getRewards(1)) { + player.getInventory().add(i, player); + } + npc("These Karamja gloves are a symbol of your explorin'", "on the island. All the merchants will recognise them", "and mabe give you a discount. I'll", "have a word with some of the seafarin' folk who sail to"); + stage++; + break; + case 443: + npc("Port Sarim and Ardougne, so they'll take you on board", "half price if you're wearing them. Ttake this lamp I", "found washed ashore too."); + stage++; + break; + case 444: + player("Wow, thanks!"); + stage = 41; + break; + case 450: + player.getInventory().add(diary.getType().getRewards(1)[0], player); + npc("You better be more careful this time."); + stage = 41; + break; + case 410: + npc("It's a diary that helps you keep track of particular", "achievements. Here on Karamja it can help you", "discover some quite useful things. Eventually, with", "enough exploration, the people of Karamja will reward"); + stage++; + break; + case 411: + npc("you."); + stage++; + break; + case 412: + npc("You can see what tasks you have listed by clicking on", "the green button in the Quest List."); + stage = 41; + break; + case 420: + npc("Well, there's three different pairs of Karamja gloves,", "which match up with the three levels of difficulty. Each", "has the same rewards as the previous level, and an", "additional one too... but I won't spoil your surprise."); + stage++; + break; + case 421: + npc("Rest assured, the people of Karamja are happy to see", "you visiting the island."); + stage = 41; + break; + case 430: + npc("Just complete the tasks so they're all ticked off, then", "you can claim yer reward. Most of them are", "straightforward; you might find some require quests to", "be started, if not finished."); + stage++; + break; + case 431: + npc("To claim the different Karamja gloves, speak to Pirate", "Jackie the Fruit in Brim Haven, one of the jungle foresters", "near the Kharazi Jungle, or me."); + stage = 41; + break; + case 50: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 512 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KamfreenaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KamfreenaDialogue.java new file mode 100644 index 000000000..b4010d50d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KamfreenaDialogue.java @@ -0,0 +1,153 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the KamfreenaDialogue dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KamfreenaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KamfreenaDialogue} {@code Object}. + */ + public KamfreenaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KamfreenaDialogue} {@code Object}. + * @param player the player. + */ + public KamfreenaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KamfreenaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, null, "Why hello there! I'm Kamfreena. Like the look of my pets?", "I think they're eyeing you up."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, null, "That was a really bad pun."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "Sorry...I don't get to see the rest of the guild much", "stuck up here. The cyclopes don't talk much you see."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, null, "Shouldn't that be cyclopses?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, null, "Nope! Cyclopes is the plural of cyclops. One cyclops,", "many cyclopes."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, null, "Oh, right, thanks."); + stage = 5; + break; + case 5: + interpreter.sendOptions("Select an Option", "Where are they from?", "How did they get here?", "Why are they here?", "Bye!"); + stage = 6; + break; + case 6: + if (buttonId == 1) { + interpreter.sendDialogues(player, null, "Where are they from?"); + stage = 7; + } else if (buttonId == 2) { + interpreter.sendDialogues(player, null, "How did they get here?"); + stage = 8; + } else if (buttonId == 3) { + interpreter.sendDialogues(player, null, "Why are they here?"); + stage = 9; + } else if (buttonId == 4) { + interpreter.sendDialogues(player, null, "Bye!"); + stage = 20; + } + break; + case 7: + interpreter.sendDialogues(npc, null, "They're from the far east lands."); + stage = 5; + break; + case 8: + interpreter.sendDialogues(npc, null, "Ahh.. our guildmaster, Harrallak, went on an expedition", "there. He brought them back with him."); + stage = 5; + break; + case 9: + interpreter.sendDialogues(npc, null, "For the warriors to train on of course! They also drop a", "rather nice blade."); + stage = 10; + break; + case 10: + interpreter.sendDialogues(player, null, "Oh? What would that be?"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, null, "Defenders."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(player, null, "Err what are they?"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, null, "It's a blade you can defend with using your shield hand,", "like I have."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(player, null, "Wow!"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, null, "For every 10 tokens you collect around the guild, you", "can spend one minute in with my pets. As you get", "defenders you can show them to me to earn even", "better ones... but remember if you lose them you'll have"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, null, "to start at bronze again. I'd advise keeping a spare in", "your bank."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(player, null, "Ok!"); + stage = 18; + break; + case 18: + interpreter.sendDialogues(npc, null, "Oh, by the way, you need to earn 100 tokens", "before I'll let you in!"); + stage = 19; + break; + case 19: + interpreter.sendDialogues(player, null, "Right, I'd better go play some games then!"); + stage = 5; + break; + case 20: + interpreter.sendDialogues(npc, null, "See you back here soon I hope!"); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4289 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KanelDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KanelDialogue.java new file mode 100644 index 000000000..72d0dda2d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KanelDialogue.java @@ -0,0 +1,72 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for kanel. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KanelDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KanelDialogue} {@code Object}. + */ + public KanelDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KanelDialogue} {@code Object}. + * @param player the player. + */ + public KanelDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KanelDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hel-lo?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Right. Goodbye."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Bye?"); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 784 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KangaiMauDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KangaiMauDialogue.java new file mode 100644 index 000000000..4ad0a91fc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KangaiMauDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the knagi mau dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KangaiMauDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KangaiMauDialogue} {@code Object}. + */ + public KangaiMauDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KangaiMauDialogue} {@code Object}. + * @param player the player. + */ + public KangaiMauDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KangaiMauDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello. I Kangai Mau of the Rantuki tribe."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nice to meet you!"); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 846 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KaqemeexDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KaqemeexDialogue.java new file mode 100644 index 000000000..c5753648c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KaqemeexDialogue.java @@ -0,0 +1,323 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the kaqemeex dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KaqemeexDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KaqemeexDialogue} {@code Object}. + */ + public KaqemeexDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KaqemeexDialogue} {@code Object}. + * @param player the player. + */ + public KaqemeexDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KaqemeexDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length >= 2) { + interpreter.sendDialogues(npc, null, "I will now explain the fundamentals of Herblore:"); + stage = 1000; + return true; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getQuestRepository().isComplete("Druidic Ritual")) { + interpreter.sendDialogues(npc, null, "Hello again. How is the Herblore going?"); + stage = 600; + break; + } + if (player.getQuestRepository().getQuest("Druidic Ritual").getStage(player) == 10) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello again."); + stage = 40; + break; + } + if (player.getQuestRepository().getQuest("Druidic Ritual").getStage(player) == 99) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I have word from Sanfew that you have been very", "helpful in assisting him with his preparations for the", "purification ritual. As promised I will now teach you the", "ancient arts of Herblore."); + stage = 200; + break; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What brings you to our holy monument?"); + stage = 1; + break; + case 1: + if (player.getQuestRepository().getQuest("Druidic Ritual").isStarted(player)) { + if (Skillcape.isMaster(player, Skills.HERBLORE)) { + interpreter.sendOptions("Select an Option", "Can I buy a Skillcape of Herblore?", "Who are you?", "Did you build this?"); + stage = 800; + } else { + interpreter.sendOptions("Select an Option", "Who are you?", "Did you build this?"); + stage = 500; + } + break; + } else { + interpreter.sendOptions("Select an Option", "Who are you?", "I'm in search of a quest.", "Did you build this?"); + stage = 2; + } + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm in search of a quest."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Did you build this?"); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "We are the druids of Guthix. We worship our god at", "our famous stone circles. You will find them located", "throghout these lands."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, I'll be on my way now."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Goodbye adventurer. I feel we shall meet again."); + stage = 13; + break; + case 13: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What, personally? No, ofcoure I didn't. However, our", "four fathers did. The first Druids of Guthix built many", "stone circles across these lands over eight hundred", "years ago."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Unfortunately we only know of two remaining and of", "those only one is usuable by us anymore."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, I'll be on my way now."); + stage = 12; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm. I think I may have a worthwhile quest for you", "actually. I don't know if you are familiar with the stone", "circle south of Varrock or not, but..."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That used to be our stone circle. Unfortunately,", "many years ago, dark wizards cast a wicked spell", "upon it so that they could corrupt its power for their", "own evil ends."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When they cursed the rocks for their rituals they made", "them useless to us and our magics. We require a brave", "adevnturer to go on a quest for us to help purify the", "circle of Varrock."); + stage = 23; + break; + case 23: + interpreter.sendOptions("Select an Option", "Ok, I will try and help.", "No, that doesn't sound very interesting."); + stage = 24; + break; + case 24: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, I will try and help."); + stage = 26; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, that doesn't sound very interesting."); + stage = 25; + break; + } + break; + case 25: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I will not try and change your mind adventurer. Some", "day when you have matured you may reconsider your", "position. We will wait until then."); + stage = 13; + break; + case 26: + player.getQuestRepository().getQuest("Druidic Ritual").start(player); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Excellent. Go to the village south of this place and speak", "to my fellow Sanfew who is working on the purification", "ritual. He knows better than I what is required to", "complete it."); + stage = 27; + break; + case 27: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Will do."); + stage = 28; + break; + case 28: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You will need to speak to my fellow druid Sanfew in", "the village south of here to continue in your quest", "adventurer."); + stage = 41; + break; + case 41: + end(); + break; + case 200: + end(); + player.getQuestRepository().getQuest("Druidic Ritual").finish(player); + break; + case 500: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Did you build this?"); + stage = 30; + break; + } + break; + case 501: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I buy a Skillcape of Herblore?"); + stage = 800; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 10; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Did you build this?"); + stage = 30; + break; + } + break; + case 600: + interpreter.sendDialogues(player, null, "Good good!"); + stage = 601; + break; + case 601: + if (Skillcape.isMaster(player, Skills.HERBLORE)) { + interpreter.sendOptions("Select an Option", "Can I buy a Skillcape of Herblore?", "Who are you?", "Did you build this?"); + stage = 501; + } else { + interpreter.sendOptions("Select an Option", "Who are you?", "Did you build this?"); + stage = 500; + } + break; + case 1000: + interpreter.sendDialogues(npc, null, "Herblore is the skill of working with herbs and other", "ingredients, to make useful potions and poison."); + stage = 1001; + break; + case 1001: + interpreter.sendDialogues(npc, null, "First you will need a vial, which can be found or made", "with the crafting skill."); + stage = 1002; + break; + case 1002: + interpreter.sendDialogues(npc, null, "Then you must gather the herbs needed to make the", "potion you want."); + stage = 1003; + break; + case 1003: + interpreter.sendDialogues(npc, null, "Refer to the Council's instructions in the Skills section", "of the website for the items needed to make a particular", "kind of potion."); + stage = 1004; + break; + case 1004: + interpreter.sendDialogues(npc, null, "You must fill your vial with water and add the", "ingredients you need. There are normally 2 ingredients", "to each type of potion."); + stage = 1005; + break; + case 1005: + interpreter.sendDialogues(npc, null, "Bear in mind you must first identify each herb, to see", "what it is."); + stage = 1006; + break; + case 1006: + interpreter.sendDialogues(npc, null, "You may also have to grind some herbs before you can", "use them. You will need a pestle and mortar in order", "to do this."); + stage = 1007; + break; + case 1007: + interpreter.sendDialogues(npc, null, "Herbs can be found on the ground, and are also", "dropped by some monsters when you kill them."); + stage = 1008; + break; + case 1008: + interpreter.sendDialogues(npc, null, "Mix these in your water-filled vial, and you will produce", "an Attack potion."); + stage = 1009; + break; + case 1009: + interpreter.sendDialogues(npc, null, "Drink this poition to increase your Attack level."); + stage = 1010; + break; + case 1010: + interpreter.sendDialogues(npc, null, "Different potions also require different Herblore levels", "before you can make them."); + stage = 1011; + break; + case 1011: + interpreter.sendDialogues(npc, null, "Once again, check the instructions found on the", "Council's website for the levels needed to make a", "particulur potion."); + stage = 1012; + break; + case 1012: + interpreter.sendDialogues(npc, null, "Good luck with your Herblore practices, Good day", "Adventurer."); + stage = 1013; + break; + case 1013: + interpreter.sendDialogues(player, null, "Thanks for your help."); + stage = 1014; + break; + case 1014: + end(); + break; + case 800: + npc("Certainly! Right when you give me 99000 coins."); + stage = 801; + break; + case 801: + options("Yes, here you go,", "No, thanks."); + stage = 802; + break; + case 802: + switch (buttonId) { + case 1: + player("Yes, here you go."); + stage = 803; + break; + case 2: + end(); + break; + } + break; + case 803: + if (Skillcape.purchase(player, Skills.HERBLORE)) { + npc("There you go! Enjoy."); + } + stage = 804; + break; + case 804: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 455 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KaramajaManDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KaramajaManDialogue.java new file mode 100644 index 000000000..f54cd096e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KaramajaManDialogue.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the karamja man dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KaramajaManDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KaramajaManDialogue} {@code Object}. + */ + public KaramajaManDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KaramajaManDialogue} {@code Object}. + * @param player the player. + */ + public KaramajaManDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KaramajaManDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, how's it going?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Not too bad, but I'm a little worried about the increase", "of goblins these days."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Don't worry, I'll kill them."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3915 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KarimDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KarimDialogue.java new file mode 100644 index 000000000..e796c679a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KarimDialogue.java @@ -0,0 +1,103 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the karim dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KarimDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 1); + + /** + * Represents the mud kebab item. + */ + private static final Item KEBAB = new Item(1971, 1); + + /** + * Constructs a new {@code KarimDialogue} {@code Object}. + */ + public KarimDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KarimDialogue} {@code Object}. + * @param player the player. + */ + public KarimDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KarimDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy a nice kebab? Only one gold."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I think I'll give it a miss.", "Yes please."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I think I'll give it a miss."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please."); + stage = 20; + break; + + } + break; + case 10: + end(); + break; + case 20: + if (player.getInventory().freeSlots() == 0) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't have enough room, sorry."); + stage = 21; + } else if (!player.getInventory().contains(995, 1)) { + end(); + player.getPacketDispatch().sendMessage("You need 1 gp to buy a kebab."); + } else { + player.getInventory().remove(COINS); + player.getInventory().add(KEBAB); + end(); + } + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 543 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KayleeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KayleeDialogue.java new file mode 100644 index 000000000..260a9b585 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KayleeDialogue.java @@ -0,0 +1,211 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the kaylee dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KayleeDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 3); + + /** + * Represents the ale item. + */ + private static final Item ASGARNIAN_ALE = new Item(1905, 1); + + /** + * Represents the wizards mind bomb. + */ + private static final Item MIND_BOMB = new Item(1907, 1); + + /** + * Represents the dwarven stout item. + */ + private static final Item DWARVEN_STOUT = new Item(1913, 1); + + /** + * Constructs a new {@code KayleeDialogue} {@code Object}. + */ + public KayleeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KayleeDialogue} {@code Object}. + * @param player the player. + */ + public KayleeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KayleeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi! What can I get you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getInventory().contains(1919, 1)) { + interpreter.sendOptions("What would you like to say?", "What ales are you serving?", "I've got this beer glass..."); + stage = 1; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What ales are you serving?"); + stage = 20; + } + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What ales are you serving?"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I've got these beer glasses...."); + stage = 200; + break; + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, we've got Asgarnian Ale, Wizard's Mind Bomb", "and Dwarven Stout, all for only 3 coins."); + stage = 21; + break; + case 21: + interpreter.sendOptions("What would you like to say?", "One Asgarnian Ale, please.", "I'll try the Mind Bomb.", "Can I have A Dwarven Stout?", "I don't feel like any of those."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "One Asgarnian Ale, please."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll try the Mind Bomb."); + stage = 120; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I have a Dwarven Stout?"); + stage = 130; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't feel like any of those."); + stage = 444; + break; + + } + break; + case 100: + if (!player.getInventory().containsItem(COINS)) { + end(); + player.getPacketDispatch().sendMessage("You need 3 gold coins to buy ale."); + return true; + } + if (player.getInventory().remove(COINS)) { + player.getInventory().add(ASGARNIAN_ALE); + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks, " + npc.getName() + "."); + player.getPacketDispatch().sendMessage("You buy a Asgarnian Ale."); + stage = 101; + } else { + end(); + player.getPacketDispatch().sendMessage("You need 3 gold coins to buy ale."); + } + break; + case 101: + end(); + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR, 0, 1); + break; + case 120: + if (player.getInventory().remove(COINS)) { + player.getInventory().add(MIND_BOMB); + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks, " + npc.getName() + "."); + player.getPacketDispatch().sendMessage("You buy a Wizard's Mind Bomb."); + stage = 101; + } else { + end(); + player.getPacketDispatch().sendMessage("You need 3 gold coins to buy ale."); + } + break; + case 130: + if (player.getInventory().remove(COINS)) { + player.getInventory().add(DWARVEN_STOUT); + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks, " + npc.getName() + "."); + player.getPacketDispatch().sendMessage("You buy a Dwarven Stout."); + stage = 101; + } else { + end(); + player.getPacketDispatch().sendMessage("You need 3 gold coins to buy ale."); + } + break; + case 200: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ooh, we'll buy those off you if", "you're interested. 2gp per glass."); + stage = 201; + break; + case 201: + interpreter.sendOptions("What would you like to say?", "Okay, sure.", "No thanks, I like empty beer glasses."); + stage = 202; + break; + case 202: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, sure."); + stage = 190; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I like empty beer glasses."); + stage = 400; + break; + + } + break; + case 190: + if (player.getInventory().contains(1919, 1)) { + player.getInventory().add(new Item(995, 2 * player.getInventory().getAmount(new Item(1919)))); + player.getInventory().remove(new Item(1919, player.getInventory().getAmount(new Item(1919)))); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There you go."); + stage = 191; + } else + end(); + stage = 191; + break; + case 191: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks!"); + stage = 192; + break; + case 192: + end(); + break; + case 444: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3217, 736 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KeyMasterDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/KeyMasterDialoguePlugin.java new file mode 100644 index 000000000..65e0be363 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KeyMasterDialoguePlugin.java @@ -0,0 +1,182 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the key master dialogue. + * @author Empathy + * + */ +@Initializable +public class KeyMasterDialoguePlugin extends DialoguePlugin { + + /** + * Constructs a new @{Code KeyMasterDialoguePlugin} object. + */ + public KeyMasterDialoguePlugin() { + /** + * empty + */ + } + + /** + * Constructs a new @{Code KeyMasterDialoguePlugin} object. + * @param player + */ + public KeyMasterDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KeyMasterDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + player("Hello."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch(stage) { + case 1: + npc("Who goes there?"); + stage++; + break; + case 2: + npc("This is no place for a human. You need to leave."); + stage++; + break; + case 3: + player("Why?"); + stage++; + break; + case 4: + npc("The voices! The voices in my head!"); + stage++; + break; + case 5: + player("You're starting to scare me man..."); + stage++; + break; + case 6: + npc("I am no man! They changed me and cursed me to", "remain here..."); + stage++; + break; + case 7: + options("What do you mean they changed you?", "What was the curse?", "Goodbye"); + stage++; + break; + case 8: + switch(buttonId) { + case 1: + npc("I was once a free man, powerful and wealthy. I owned", "several apothecaries across Zeah and sold the tastiest", "potions in the land."); + stage = 20; + break; + case 2: + npc("I have been charged to stay here to prevent the", "Monstrosity from escaping. Those gates and the", "winches that operate them are the only thing that stops", "it from breaking free."); + stage = 40; + break; + case 3: + player("Goodbye."); + stage = 50; + break; + } + break; + case 20: + player("What happened?"); + stage++; + break; + case 21: + npc("One of my greatest inventions, it was going so well. I", "spent days finding the right herbs, I travelled across all", "of Zeah to find the most exotic weeds. Once I had", "gathered them all, I put them in a potion and mixed in"); + stage++; + break; + case 22: + npc("the final ingredient."); + stage++; + break; + case 23: + player("Zeah? Interesting..."); + stage++; + break; + case 24: + npc("Yes, yes... The potion tasted delicious but it was missing", "a tiny something so I added Magic roots to the potion.", "It started to pulsate and glow! I took a sip and I felt", "like a million gold! A few seconds later my eye sight"); + stage++; + break; + case 25: + npc("began to blur, my brain was throbbing. I fell and hit", "my head on my worktop, then it all went black."); + stage++; + break; + case 26: + player("Ouch! But, you still haven't said who changed you?"); + stage++; + break; + case 27: + npc("Will you let me finish??"); + stage++; + break; + case 28: + npc("I woke up screaming in pain. Blue foam streaming out", "of my mouth, my eye sight worse than before, the only", "things I could make out were 3 tall figures with green", "banners - they were of the Archeus Elders. They"); + stage++; + break; + case 29: + npc("muttered to each other in Archaic Language. After", "trying to get up several times, I lost hope and stared at", "the sky. I had given up when the tallest of the figures", "bent over and brought his face right to mine and spoke"); + stage++; + break; + case 30: + npc("very softly, 'We can save you, but it will come at a", "cost'."); + stage++; + break; + case 31: + player("So they saved you?"); + stage++; + break; + case 32: + npc("Yes of course they saved me but look at the cost! I", "have horns coming out of my head and I'm still blind", "and stuck here... forever alone."); + stage = 7; + break; + case 40: + player("What monstrosity? What's behind those gates?"); + stage++; + break; + case 41: + npc("You really do not want to know. Leave this place", "human."); + stage++; + break; + case 42: + player("Hey now, I'm no wimp. What's to stop me from just", "turning the winch to open the gate and going in?"); + stage++; + break; + case 43: + npc("Me. And of course your quick demise at the mercy of", "Cerberus, guardian of the river of souls."); + stage++; + break; + case 44: + player("But I can do it!"); + stage++; + break; + case 45: + npc("You are obviously passionate at trying. But only those", "with great skill at slaying these types of beast may", "enter."); + stage++; + break; + case 46: + npc("THE VOICES! AAAHHHHH! Leave this place human!"); + stage = 7; + break; + case 50: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8673 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KittenInteractDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KittenInteractDialogue.java new file mode 100644 index 000000000..48b8f431f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KittenInteractDialogue.java @@ -0,0 +1,138 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the dialogue plugin used for kitten interactions. + * @author Vexia + * @version 1.0 + */ +@Initializable +public final class KittenInteractDialogue extends DialoguePlugin { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(827); + + /** + * Constructs a new {@code KittenInterfactDialogue} {@code Object}. + */ + public KittenInteractDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KittenInterfactDialogue} {@code Object}. + * @param player the player. + */ + public KittenInteractDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KittenInteractDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendOptions("Interact with Kitten", "Stroke", "Chase-Vermin", "Shoo-away."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1:// stroke + player.animate(ANIMATION); + player.getFamiliarManager().getFamiliar().sendChat("Purr...purr..."); + interpreter.sendDialogues(player, null, "That cat sure loves to be stroked."); + stage = 99; + break; + case 2:// chase-vermine + end(); + player.sendChat("Go on puss...kill that rat!"); + boolean cant = true; + NPC rat = null; + for (NPC n : RegionManager.getLocalNpcs(player.getLocation(), 10)) { + if (!n.getName().contains("rat")) { + cant = false; + continue; + } + if (n.getLocation().getDistance(player.getFamiliarManager().getFamiliar().getLocation()) < 8) { + cant = true; + rat = n; + break; + } else { + cant = false; + } + } + if (!cant) { + player.getPacketDispatch().sendMessage("Your cat cannot get to its prey."); + } else { + player.getFamiliarManager().getFamiliar().sendChat("Meeeoooooowwww!"); + final Path path = Pathfinder.find(player.getFamiliarManager().getFamiliar(), rat); + path.walk(player.getFamiliarManager().getFamiliar()); + rat.sendChat("Eeek!"); + GameWorld.getPulser().submit(new Pulse(5) { + + @Override + public boolean pulse() { + player.getFamiliarManager().getFamiliar().call(); + player.getPacketDispatch().sendMessage("The rat manages to get away!"); + return true; + } + + }); + } + break; + case 3:// shoo-away + interpreter.sendOptions("Are you sure?", "Yes I am.", "No I'm not."); + stage = 560; + break; + } + break; + case 560: + switch (buttonId) { + case 1:// yes + player.sendChat("Shoo cat!"); + player.getFamiliarManager().getFamiliar().sendChat("Miaow!"); + // player.getFamiliarManager().getFamiliar().dismiss();//TODO: + // Pet + player.getPacketDispatch().sendMessage("The cat has run away."); + end(); + break; + case 2:// no + end(); + break; + } + break; + case 99: + if (player.getFamiliarManager().hasFamiliar()) { + player.getFamiliarManager().getFamiliar().sendChat("Miaow!"); + } + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 343823 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KlarenseDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KlarenseDialogue.java new file mode 100644 index 000000000..dc7e3ed95 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KlarenseDialogue.java @@ -0,0 +1,238 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue used for the klarense npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KlarenseDialogue extends DialoguePlugin { + + /** + * Represents the amount of coins. + */ + private static final Item COINS = new Item(995, 2000); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code KlarenseDialogue} {@code Object}. + */ + public KlarenseDialogue() { + /** + * emptpy. + */ + } + + /** + * Constructs a new {@code KlarenseDialogue} {@code Object}. + * @param player the player. + */ + public KlarenseDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KlarenseDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Dragon Slayer"); + if (args.length > 1) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hey, stay off my ship! That's private property!"); + stage = 0; + return true; + } + switch (quest.getStage(player)) { + case 100: + player("Hey, that's my ship!"); + stage = -1; + break; + default: + if (player.getSavedData().getQuestData().getDragonSlayerAttribute("ship")) { + npc("Hello, captain! Here to inspect your new ship? Just a", "little work and she'll be seaworthy again."); + stage = 400; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So, are you interested in buying the Lady Lumbridge?", "Now, I'll be straight with you: she's not quite seaworthy", "right now, but give her a bit of work and she'll be the", "nippiest ship this side of Port Khazard."); + stage = 1; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (stage == 400) { + end(); + return true; + } + switch (quest.getStage(player)) { + case 100: + switch (stage) { + case 0: + end(); + break; + case -1: + npc("No, it's not. It may, to the untrained eye, at first", "appear to be the Lady Lumbridge, but it is definitely", "not. It's my new ship. It just happens to look slightly", "similar, is all."); + stage = 1; + break; + case 1: + player("It has Lady Lumbridge pained out and 'Klarense's", "Cruiser' painted over it!"); + stage = 2; + break; + case 2: + npc("Nope, you're mistaken. It's my new boat."); + stage = 3; + break; + case 3: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + end(); + break; + case 1: + player("Would you take me to Crandor when she's ready?"); + stage = 2; + break; + case 2: + npc("Crandor? You're joking, right?"); + stage = 3; + break; + case 3: + player("No. I want to go to Crandor."); + stage = 4; + break; + case 4: + npc("Then you must be crazy."); + stage = 5; + break; + case 5: + npc("That island is surrounded by reefs that would rip this", "ship to shreds. Even if you found a map, you'd need", "an experienced captain to stand a chance of getting", "through"); + stage = 6; + break; + case 6: + npc("even if you gould get to it, there's no way I'm going", "any closer to that dragon than I have to. They say it", "can destroy whole ships with one bite."); + stage = 7; + break; + case 7: + player("I'd like to buy her."); + stage = 8; + break; + case 8: + npc("Of course! I'm sure the work needed to do on it", "wouldn't be too expensive."); + stage = 9; + break; + case 9: + npc("How does, 2,000 gold sound? I'll even throw in my", "cabin boy, Jenkiins, for free! He'll swab the decks and", "splice the mainsails for you!"); + stage = 10; + break; + case 10: + player("Yep, sounds good."); + stage = 11; + break; + case 11: + if (!player.getInventory().containsItem(COINS)) { + player("...except I don't have that kind of money on me..."); + stage = 12; + } else { + if (!player.getInventory().containsItem(COINS)) { + end(); + return false; + } + if (player.getInventory().remove(COINS)) { + npc("Okey dokey, she's all yours!"); + player.getSavedData().getQuestData().setDragonSlayerAttribute("ship", true); + stage = 12; + } + } + break; + case 12: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + end(); + break; + case 1: + interpreter.sendOptions("Select an Option", "Do you know when she will be seaworthy?", "Why is she damaged?", "Ah, well, never mind."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you know when she will be seaworthy?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why is she damaged?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ah, well, never mind."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, not really. Port Sarim's shipbuilders aren't very", "efficient so it could be quite a while."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, there was no particular accident. It's just years of", "wear and tear."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The Lady Lumbridge is an old Crandorian fishing ship -", "the last one of her kind, as far as I know. That kind of", "ship was always mightily manoeuvrable, but not too", "tough."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "She happened to be somewhere else when Crandor was", "destroyed, and she's had several owners since then. Not", "all of them have looked after her too well,"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "but once she's patched up, she'll be good as new!"); + stage = 24; + break; + case 24: + end(); + break; + case 30: + end(); + break; + case 400: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 744 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KreeJrDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KreeJrDialogue.java new file mode 100644 index 000000000..e0b354ae6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KreeJrDialogue.java @@ -0,0 +1,87 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Dialogue for the boss pet, Kree'Arra JR. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class KreeJrDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KreeJrDialogue} {@code Object}. + */ + public KreeJrDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KreeJrDialogue} {@code Object}. + * @param player the player. + */ + public KreeJrDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KreeJrDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Huh... that's odd... I thought that would", "be big news."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "You thought what would be big news?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well there seems to be an absence of a certain", " ornithological piece: a headline regarding mass", "awareness of a certain avian variety."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "What are you talking about?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh have you not heard? It was my understanding that", "everyone had heard...."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Heard wha...... OH NO!!!!?!?!!?!"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "OH WELL THE BIRD, BIRD, BIRD, BIRD", "BIRD IS THE WORD.", "OH WELL THE BIRD, BIRD, BIRD,", "BIRD BIRD IS THE WORD."); + stage = 6; + break; + case 6: + interpreter.sendDialogue("There's a slight pause as Kree'Arra Jr. goes stiff."); + stage = 7; + break; + case 7: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8592 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/KrilJRDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/KrilJRDialogue.java new file mode 100644 index 000000000..e5ef69164 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/KrilJRDialogue.java @@ -0,0 +1,83 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Dialogue for the boss pet, K'ril Tsutsaroth JR. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class KrilJRDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KrilJRDialogue} {@code Object}. + */ + public KrilJRDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KrilJRDialogue} {@code Object}. + * @param player the player. + */ + public KrilJRDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KrilJRDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How's life in the light?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Burns slightly."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You seem much nicer than your father. He's mean."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "If you were stuck in a very dark cave for centuries", "you'd be pretty annoyed too."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I guess."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "He's actually quite mellow really."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Uh.... Yeah."); + stage = 6; + break; + case 6: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8591 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LakkiDwarfDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LakkiDwarfDialogue.java new file mode 100644 index 000000000..0b607d66b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LakkiDwarfDialogue.java @@ -0,0 +1,64 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue used for lakki the dwarf npc. (holder dialogue until + * quest) + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LakkiDwarfDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LakkiDwarfDialogue} {@code Object}. + */ + public LakkiDwarfDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LakkiDwarfDialogue} {@code Object}. + * @param player the player. + */ + public LakkiDwarfDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LakkiDwarfDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm sorry, I can't talk right now."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7722 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LarxusDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LarxusDialogue.java new file mode 100644 index 000000000..541073dba --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LarxusDialogue.java @@ -0,0 +1,98 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the larxus npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LarxusDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LarxusDialogue} {@code Object}. + */ + public LarxusDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LarxusDialogue} {@code Object}. + * @param player the player. + */ + public LarxusDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LarxusDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length == 2) { + npc("You need to arrange a challenge with me before you", "enter the arena."); + stage = 30; + return true; + } + npc = (NPC) args[0]; + npc("Is there something I can help you with?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("I was given a challenge, what now?", "What is this place?", "Nothing thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("I was given a challenge, what now?"); + stage = 10; + break; + case 2: + player("What is this place?"); + stage = 20; + break; + case 3: + player("Nothing thanks."); + stage = 30; + break; + } + break; + case 10: + npc("Well pass it here and we'll get you started."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc("This is the champions' arena, the champions of various", "races use it to duel those they deem worthy of the", "honour."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3050 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LeatherCraftDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LeatherCraftDialogue.java new file mode 100644 index 000000000..c1ab6b422 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LeatherCraftDialogue.java @@ -0,0 +1,234 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.system.SystemLogger; +import core.game.node.entity.skill.crafting.armour.DragonCraftPulse; +import core.game.node.entity.skill.crafting.armour.HardCraftPulse; +import core.game.node.entity.skill.crafting.armour.LeatherCrafting; +import core.game.node.entity.skill.crafting.armour.LeatherCrafting.DragonHide; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for leather crafting. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LeatherCraftDialogue extends DialoguePlugin { + + /** + * Represents the type. + */ + private String type = ""; + + /** + * Represents the leather. + */ + private int leather; + + /** + * Constructs a new {@code LeatherCraftDialogue} {@code Object}. + */ + public LeatherCraftDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LeatherCraftDialogue} {@code Object}. + * @param player the player. + */ + public LeatherCraftDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LeatherCraftDialogue(player); + } + + @Override + public boolean open(Object... args) { + Component component = new Component(304); + type = (String) args[0]; + if (type.equals("hard")) { + player.getInterfaceManager().openChatbox(309); + player.getPacketDispatch().sendItemZoomOnInterface(1131, 150, 309, 2); + player.getPacketDispatch().sendString("



" + "Heardleather body", 309, 6); + } else { + /** dragon */ + leather = (int) args[1]; + player.getInterfaceManager().openChatbox(component); + int index[] = new int[3]; + if (leather == LeatherCrafting.GREEN_LEATHER) { + index[0] = DragonHide.GREEN_D_HIDE_BODY.getProduct(); + index[1] = DragonHide.GREEN_D_HIDE_VAMBS.getProduct(); + index[2] = DragonHide.GREEN_D_HIDE_CHAPS.getProduct(); + } + if (leather == LeatherCrafting.BLUE_LEATHER) { + index[0] = DragonHide.BLUE_D_HIDE_BODY.getProduct(); + index[1] = DragonHide.BLUE_D_HIDE_VAMBS.getProduct(); + index[2] = DragonHide.BLUE_D_HIDE_CHAPS.getProduct(); + } + if (leather == LeatherCrafting.RED_LEATHER) { + index[0] = DragonHide.RED_D_HIDE_BODY.getProduct(); + index[1] = DragonHide.RED_D_HIDE_VAMBS.getProduct(); + index[2] = DragonHide.RED_D_HIDE_CHAPS.getProduct(); + } + if (leather == LeatherCrafting.BLACK_LEATHER) { + index[0] = DragonHide.BLACK_D_HIDE_BODY.getProduct(); + index[1] = DragonHide.BLACK_D_HIDE_VAMBS.getProduct(); + index[2] = DragonHide.BLACK_D_HIDE_CHAPS.getProduct(); + } + player.getPacketDispatch().sendItemZoomOnInterface(index[0], 175, 304, 2); + player.getPacketDispatch().sendItemZoomOnInterface(index[1], 175, 304, 3); + player.getPacketDispatch().sendItemZoomOnInterface(index[2], 165, 304, 4); + player.getPacketDispatch().sendString("



" + ItemDefinition.forId(index[0]).getName(), 304, 8); + player.getPacketDispatch().sendString("



" + ItemDefinition.forId(index[1]).getName(), 304, 11); + player.getPacketDispatch().sendString("



" + ItemDefinition.forId(index[2]).getName(), 304, 16); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + player.getInterfaceManager().closeChatbox(); + int amt = 0; + switch (type) { + case "hard": + switch (buttonId) { + case 6: + amt = 1; + break; + case 4: + amt = 5; + break; + case 3: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + player.getPulseManager().run(new HardCraftPulse(player, null, ammount)); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount"); + return true; + case 2: + amt = player.getInventory().getAmount(new Item(LeatherCrafting.HARD_LEATHER)); + break; + } + player.getPulseManager().run(new HardCraftPulse(player, null, amt)); + break; + case "dragon": + int index = 0; + if (buttonId > 3 && buttonId < 8) { + index = 1; + } + if (buttonId > 7 && buttonId < 12) { + index = 2; + } + if (buttonId > 11 && buttonId < 16) { + index = 3; + } + DragonHide hide = null; + if (index == 1) { + switch (leather) { + case LeatherCrafting.GREEN_LEATHER: + hide = DragonHide.GREEN_D_HIDE_BODY; + break; + case LeatherCrafting.BLUE_LEATHER: + hide = DragonHide.BLUE_D_HIDE_BODY; + break; + case LeatherCrafting.RED_LEATHER: + hide = DragonHide.RED_D_HIDE_BODY; + break; + case LeatherCrafting.BLACK_LEATHER: + hide = DragonHide.BLACK_D_HIDE_BODY; + break; + } + } + if (index == 2) { + switch (leather) { + case LeatherCrafting.GREEN_LEATHER: + hide = DragonHide.GREEN_D_HIDE_VAMBS; + break; + case LeatherCrafting.BLUE_LEATHER: + hide = DragonHide.BLUE_D_HIDE_VAMBS; + break; + case LeatherCrafting.RED_LEATHER: + hide = DragonHide.RED_D_HIDE_VAMBS; + break; + case LeatherCrafting.BLACK_LEATHER: + hide = DragonHide.BLACK_D_HIDE_VAMBS; + break; + } + } + if (index == 3) { + switch (leather) { + case LeatherCrafting.GREEN_LEATHER: + hide = DragonHide.GREEN_D_HIDE_CHAPS; + break; + case LeatherCrafting.BLUE_LEATHER: + hide = DragonHide.BLUE_D_HIDE_CHAPS; + break; + case LeatherCrafting.RED_LEATHER: + hide = DragonHide.RED_D_HIDE_CHAPS; + break; + case LeatherCrafting.BLACK_LEATHER: + hide = DragonHide.BLACK_D_HIDE_CHAPS; + break; + } + } + switch (buttonId) { + case 7: + case 11: + case 15: + amt = 1; + break; + case 6: + case 10: + case 14: + amt = 5; + break; + case 5: + case 9: + case 13: + amt = 10; + break; + case 4: + case 8: + case 12: + final DragonHide hidee = hide; + if (hidee == null) { + return false; + } + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + player.getPulseManager().run(new DragonCraftPulse(player, null, hidee, (int) getValue())); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter amount:"); + return true; + } + if (hide == null) { + return false; + } + player.getPulseManager().run(new DragonCraftPulse(player, null, hide, amt)); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 48923 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LeelaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LeelaDialogue.java new file mode 100644 index 000000000..b5c35101c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LeelaDialogue.java @@ -0,0 +1,348 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represnets the dialogue used to handle the Leela npc. + * @author 'Vexia + * @date 1/14/1 + */ +@Initializable +public final class LeelaDialogue extends DialoguePlugin { + + /** + * Represents the rope item. + */ + private static final Item ROPE = new Item(954); + + /** + * Represents the pink skirt item. + */ + private static final Item SKIRT = new Item(1013); + + /** + * Represents the yellow wig item. + */ + private static final Item YELLOW_WIG = new Item(2419); + + /** + * Represents the skin paste item. + */ + private static final Item PASTE = new Item(2424); + + /** + * Represents the bronze key item. + */ + private static final Item BRONZE_KEY = new Item(2418); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Represents the count of materials you have gathered. + */ + private int itemCount; + + /** + * Constructs a new {@code LeelaDialogue} {@code Object}. + */ + public LeelaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LeelaDialogue} {@code Object}. + * @param player the player. + */ + public LeelaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LeelaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + switch (quest.getStage(player)) { + case 60: + case 100: + interpreter.sendDialogues(npc, null, "Thank you, Al-Kharid will forever owe you for your", "help. I think that if there is every anything that needs to", "be done, you will be someone they can rely on."); + stage = 0; + break; + case 50: + case 40: + if (!player.getInventory().containsItem(BRONZE_KEY) && !player.getBank().containsItem(BRONZE_KEY)) { + interpreter.sendDialogues(player, null, "I'm afraid I lost that key you gave me."); + stage = 0; + } else { + interpreter.sendDialogues(npc, null, "Ok now, you have all the basic equipment. What are", "your plans to stop the guard interfering?"); + stage = 10; + } + break; + case 30: + interpreter.sendDialogues(npc, null, "My father sent this key for you.", "Be careful not to lose it."); + stage = 0; + break; + case 20: + interpreter.sendDialogues(player, null, "I am here to help you free the prince."); + stage = 0; + break; + default: + interpreter.sendDialogues(player, null, "Hi!"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 60: + case 100: + end(); + break; + case 50: + case 40: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "Foolish man!", "A new key will cost 15 coins."); + stage = 1; + break; + case 1: + if (player.getInventory().contains(995, 15)) { + interpreter.sendDialogues(player, null, "Here, I have 15 coins."); + stage = 2; + } else { + end(); + player.getPacketDispatch().sendMessage("You don't have enough coins."); + } + break; + case 2: + Item remove = new Item(995, 15); + if (!player.getInventory().containsItem(remove)) { + end(); + return true; + } + if (player.getInventory().remove(remove)) { + if (!player.getInventory().add(BRONZE_KEY)) { + GroundItemManager.create(BRONZE_KEY, player); + } + end(); + player.getPacketDispatch().sendMessage("Leela gives you another key."); + } + stage = 99; + break; + case 99: + end(); + break; + case 10: + interpreter.sendOptions("Select an Option", "I haven't spoken to him yet.", "I was going to attack him.", "I hoped to get him drunk.", "Maybe I could bribe him to leave."); + stage = 11; + break; + case 11: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I haven't spoken to him yet."); + stage = 110; + break; + case 2: + interpreter.sendDialogues(player, null, "I was going to attack him."); + stage = 120; + break; + case 3: + interpreter.sendDialogues(player, null, "I hoped to get him drunk."); + stage = 130; + break; + case 4: + interpreter.sendDialogues(player, null, "Maybe I could bribe him to leave."); + stage = 140; + break; + } + break; + case 110: + interpreter.sendDialogues(npc, null, "Well, speaking to him may find a weakness he has. See", "if there's something that could stop him bothering us."); + stage = 111; + break; + case 111: + end(); + break; + case 120: + interpreter.sendDialogues(npc, null, "I don't thik you should. If you do the rest of the", "gang and Keli would attack you. The door guard", "should be removed first, to make it easy."); + stage = 121; + break; + case 121: + end(); + break; + case 130: + interpreter.sendDialogues(npc, null, "Well, that's possible. These guards do like a drink. I", "would think it will take at least 3 beers to do it well.", "You would probably have to do it all at the same time", "too. The effects of the local bear off quickly."); + stage = 131; + break; + case 131: + end(); + break; + case 140: + interpreter.sendDialogues(npc, null, "You could try. I don't think the emir will pay anything", "towards it. And we did bribe on of their guards once."); + stage = 141; + break; + case 141: + end(); + break; + } + break; + case 30: + switch (stage) { + case 0: + interpreter.sendDialogue("Leela gives you a copy of the key to the prince's door."); + stage = 1; + break; + case 1: + if (!player.getInventory().add(BRONZE_KEY)) { + GroundItemManager.create(BRONZE_KEY, player); + } + quest.setStage(player, 40); + interpreter.sendDialogues(npc, null, "Good, you have all the basic equipment. Next to deal", "with the guard on the door. he is talkative, try to find", "a weakness in him."); + stage = 2; + break; + case 2: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "Your employment is known to me. Now, do you know", "all that we need to make the break?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "I must make a disguise. What do you suggest?", "I need to get the key made.", "What can I do with the guards?", "I will go and get the rest of the escape equipment."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I must a make a disguise. What do you suggest?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, null, "I need to get the key made."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, null, "What can I do with the guards?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, null, "I will go and get the rest of the escape equipment."); + stage = 40; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, null, "Only the lady Keli, can wander about outside the jail.", "The guards will shoot to kill if they see the prince out", "so we need a disguise good enough to fool them at a", "distance."); + stage = 11; + break; + case 11: + if (player.getInventory().containsItem(YELLOW_WIG)) { + interpreter.sendDialogues(npc, null, "The wig you have got, well done."); + itemCount++; + } else { + interpreter.sendDialogues(npc, null, "You need a wig, maybe made from wool. If you find", "someone who can work with wool ask them about it.", "There's a witch nearby may be able to help you dye it."); + } + stage = 12; + break; + case 12: + if (player.getInventory().containsItem(SKIRT)) { + interpreter.sendDialogues(npc, null, "You have got the skirt, good."); + itemCount++; + } else { + interpreter.sendDialogues(npc, null, "You will need to get a pink skirt, same as Keli's."); + } + stage = 13; + break; + case 13: + if (player.getInventory().containsItem(PASTE)) { + interpreter.sendDialogues(npc, null, "You have the skin paint, well done. I thought you would", "struggle to make that."); + itemCount++; + } else { + interpreter.sendDialogues(npc, null, "We still need something to colour the Prince's skin", "lighter. There's a witch close to here. She knows about", "many things. She may know some way to make the", "skin lighter."); + } + stage = itemCount == 3 ? 14 : 15; + break; + case 14: + interpreter.sendDialogues(npc, null, "You do have everything for the disguise."); + stage = 15; + break; + case 15: + if (player.getInventory().containsItem(ROPE)) { + interpreter.sendDialogues(npc, null, "You have the rope I see, to tie up Keli. That will be the", "most dangerous part of the plan."); + stage = 16; + } else { + interpreter.sendDialogues(npc, null, "You will still need some rope to tie up Keli, of course. I", "heard that there's a good rope maker around here."); + stage = 16; + } + break; + case 16: + end(); + break; + case 20: + interpreter.sendDialogues(npc, null, "Yes, that is most important. There is no way you can", "get the real key. It is on a chain around Keli's neck.", "Almost impossible to steal."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, null, "Get some soft clay and get her to show you the key", "somehow. Then take the print, with bronze, to my", "father."); + stage = 22; + break; + case 22: + end(); + break; + case 30: + interpreter.sendDialogues(npc, null, "most of the guards will be easy. The disguise will get", "past them. The only guards who will be a problem will be", "the one at the door."); + stage = 31; + break; + case 31: + end(); + break; + case 40: + interpreter.sendDialogues(npc, null, "Good, I shall await your return with everything."); + stage = 41; + break; + case 41: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "Please leave me alone adventurer, I am", "a very busy woman."); + stage = 1; + break; + case 1: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 915 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LegendsGuardDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/LegendsGuardDialogue.kt new file mode 100644 index 000000000..031087455 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LegendsGuardDialogue.kt @@ -0,0 +1,45 @@ +package core.game.content.dialogue + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * Dialogue for Legends Guards at the Legends Guild + * @author qmqz + */ +@Initializable +class LegendsGuardDialogue(player: Player? = null) : DialoguePlugin(player){ + fun gender (male : String = "sir", female : String = "madam") = if (player.isMale) male else female + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc(FacialExpression.FRIENDLY,"! ! ! Attention ! ! !") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FRIENDLY,"Legends Guild Member Approaching").also { stage++ } + 1 -> npc(FacialExpression.FRIENDLY,"Welcome "+ gender() + "!", "I hope you enjoy your time in the Legends Guild.").also { stage = 99 } + + //while doing legend's quest + 10 -> npc(FacialExpression.FRIENDLY,"I hope the quest is going well " + gender() + ".").also { stage = 99 } + + //after the legend's quest is done + 20 -> npc(FacialExpression.FRIENDLY,"Legends Guild Member Approaching!").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return LegendsGuardDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(398, 399) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LensaDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/LensaDialogue.kt new file mode 100644 index 000000000..318e3433d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LensaDialogue.kt @@ -0,0 +1,39 @@ +package core.game.content.dialogue + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * Dialogue for Lensa on Jaitizso + * @author qmqz + */ +@Initializable +class LensaDialogue(player: Player? = null) : DialoguePlugin(player){ + fun gender (male : String = "brother", female : String = "sister") = if (player.isMale) male else female + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello.") + stage = 0 + return true + } + //should say [Fremennik name] after gender, but this is not yet implemented + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FURIOUS,"My apologies " + gender() + "!", "I have not time to tarry here with you!").also { stage++ } + 1 -> player(FacialExpression.AFRAID,"That's okay, I didn't really want anything.").also { stage = 99 } + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return LensaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(5494) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LeonDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LeonDialogue.java new file mode 100644 index 000000000..04e126753 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LeonDialogue.java @@ -0,0 +1,94 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the leon npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LeonDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LeonDialogue} {@code Object}. + */ + public LeonDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LeonDialogue} {@code Object}. + * @param player the player. + */ + public LeonDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LeonDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "What is this place?", "Can I have a go with your crossbow?", "What are you holding there?"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is this place?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I have a go with your crossbow?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What are you holding there?"); + stage = 30; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is Aleck's Hunter Emporium. Basically, it's just a", "shop with fancy name; you can buy various weapons", "and traps here."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm afraid with it being a prototype, I've only got a few", "for my own testing purposes."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This? This is a prototype for a new type of crossbow", "I've been designing."); + stage = 31; + break; + case 31: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5111 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LidioDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LidioDialogue.java new file mode 100644 index 000000000..1fb7b1d7b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LidioDialogue.java @@ -0,0 +1,64 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the lidio npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LidioDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LidioDialogue} {@code Object}. + */ + public LidioDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LidioDialogue} {@code Object}. + * @param player the player. + */ + public LidioDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LidioDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings, warrior, how can I fill your stomach today?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "With food preferrable."); + stage = 1; + break; + case 1: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4293 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LillyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LillyDialogue.java new file mode 100644 index 000000000..547a45e2b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LillyDialogue.java @@ -0,0 +1,103 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the lilly npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LillyDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LillyDialogue} {@code Object} + */ + public LillyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LillyDialogue} {@code Object}. + * @param player the player. + */ + public LillyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LillyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Uh..... hi... didn't see you there. Can.... I help?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Umm... do you sell potions?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Erm... yes. When I'm not drinking them."); + stage = 2; + break; + case 2: + interpreter.sendOptions("What would you like to say?", "I'd like to see what you have for sale.", "That's a pretty wall hanging.", "Bye!"); + stage = 3; + break; + case 3: + if (buttonId == 1) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like to see what you have for sale."); + stage = 4; + } else if (buttonId == 2) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's a pretty wall hanging."); + stage = 5; + } else if (buttonId == 3) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Bye!"); + stage = 9; + } + break; + case 4: + end(); + npc.openShop(player); + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you think so? I made it my self."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Really? Is that why there's all this cloth and dye around?"); + stage = 7; + break; + case 7: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, it's a hobby of mine when I'm.... relaxing."); + stage = 8; + break; + case 8: + end(); + break; + case 9: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Have fun and come back soon!"); + stage = 8; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4294 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LimbDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LimbDialogue.java new file mode 100644 index 000000000..691ce9a46 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LimbDialogue.java @@ -0,0 +1,124 @@ +/* +package core.game.content.dialogue; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.fletching.items.crossbow.Limb; +import core.game.node.entity.skill.fletching.items.crossbow.LimbPulse; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.entity.player.link.RunScript; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.game.node.item.Item; + +*/ +/** + * Represents the dialogue plugin used for making limbs. + * @author 'Vexia + * @version 1.0 + *//* + +@InitializablePlugin +public final class LimbDialogue extends DialoguePlugin { + + */ +/** + * Constructs a new {@code LimbDialogue} {@code Object}. + *//* + + public LimbDialogue() { + */ +/** + * empty. + *//* + + } + + */ +/** + * Constructs a new {@code LimbDialogue} {@code Object}. + * @param player the player. + *//* + + public LimbDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LimbDialogue(player); + } + + */ +/** + * The item. + *//* + + private Item item; + + */ +/** + * The second item. + *//* + + private Item second; + + */ +/** + * The string bow enum. + *//* + + private Limb bow; + + @Override + public boolean open(Object... args) { + item = (Item) args[0]; + second = (Item) args[1]; + bow = Limb.forItems(item, second); + if (bow == null) { + return true; + } + player.getInterfaceManager().openChatbox(309); + player.getPacketDispatch().sendString("



" + bow.getProduct().getName(), 309, 6); + player.getPacketDispatch().sendItemZoomOnInterface(bow.getProduct().getId(), 160, 309, 2); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + switch (stage) { + case 0: + int amt = 0; + switch (buttonId) { + case 6: + amt = 1; + break; + case 5: + amt = 5; + break; + case 4: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + player.getPulseManager().run(new LimbPulse(player, (item.getName().toLowerCase().contains("stock") ? second : item), bow, ammount)); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount"); + return true; + case 3: + amt = player.getInventory().getAmount(item); + break; + } + player.getPulseManager().run(new LimbPulse(player, (item.getName().toLowerCase().contains("stock") ? second : item), bow, amt)); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 84923 }; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LitaraDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LitaraDialogue.java new file mode 100644 index 000000000..a23319235 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LitaraDialogue.java @@ -0,0 +1,116 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the litara npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LitaraDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LitaraDialogue} {@code Object}. + */ + public LitaraDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LitaraDialogue} {@code Object}. + * @param player the player. + */ + public LitaraDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LitaraDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there. You look lost - are you okay?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I'm looking for stronghold, or something.", "I'm fine, just passing through."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm looking for a stronghold, or something."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm fine, just passing through."); + stage = 20; + break; + } + + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh, the Strnghold of Security. It's down there."); + stage = 11; + break; + case 11: + interpreter.sendDialogue("Litara points to the hole in the ground that looks", "like you could squeeze, through."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Looks kind of ...deep and dark."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yeah, tell that to my brother. He still hasn't come back."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Your brother?"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "He's an explorer too. When the miner fell down that hole", "he'd made and came back babbling about treasure, my", "brother went to explore. No one has seen him since."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, that's not good."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Lots of people have been down there, but none of them", "have seen him. Let me know if you do, will you?"); + stage = 18; + break; + case 18: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll certainly keep my eyes open."); + stage = 19; + break; + case 19: + end(); + break; + case 20: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4376 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LokarSearunnerDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LokarSearunnerDialogue.java new file mode 100644 index 000000000..fc307cecf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LokarSearunnerDialogue.java @@ -0,0 +1,146 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.plugin.Initializable; +import core.net.packet.out.MinimapState; + +/** + * Handles the lokar searunner dialogue. + * @author Vexia + */ +@Initializable +public class LokarSearunnerDialogue extends DialoguePlugin { + + /** + * The location of relekka. + */ + private static final Location RELEKKA = new Location(2621, 3687, 0); + + /** + * The pirate's minigame. + */ + private static final Location PIRATES_COVE = new Location(2213, 3794, 0); + + /** + * Constructs a new {@Code LokarSearunnerDialogue} {@Code + * Object} + */ + public LokarSearunnerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code LokarSearunnerDialogue} {@Code + * Object} + * @param player the player. + */ + public LokarSearunnerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LokarSearunnerDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + switch (npc.getId()) { + case 4536: + npc("Hi, would you like to take a boat trip to relekka?"); + break; + case 4537: + npc("Hi, would you like to take a boat trip to pirate's cove?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (npc.getId()) { + case 4536: + switch (stage) { + case 0: + options("Yes, please.", "No, thanks."); + stage++; + break; + case 1: + end(); + if (buttonId == 1) { + travel(player, RELEKKA); + return true; + } + break; + } + break; + case 4537: + switch (stage) { + case 0: + options("Yes, please.", "No, thanks."); + stage++; + break; + case 1: + end(); + if (buttonId == 1) { + travel(player, PIRATES_COVE); + return true; + } + break; + } + break; + } + return true; + } + + /** + * Travels to a location. + * @param location the location. + */ + private void travel(final Player player, final Location location) { + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.lock(); + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 3: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + break; + case 4: + player.getProperties().setTeleportLocation(location); + break; + case 5: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeOverlay(); + player.unlock(); + return true; + } + return false; + } + + }); + } + + @Override + public int[] getIds() { + return new int[] { 4536, 4537 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LongbowBenDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LongbowBenDialogue.java new file mode 100644 index 000000000..0740dd674 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LongbowBenDialogue.java @@ -0,0 +1,111 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the longow ben dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LongbowBenDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LongbowBenDialogue} {@code Object}. + */ + public LongbowBenDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LongbowBenDialogue} {@code Object}. + * @param player the player. + */ + public LongbowBenDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LongbowBenDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Arrr, matey!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("What would you like to say?", "Why are you called Longbow Ben?", "Have you got any quests I could do?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Why are you called Longbow Ben?"); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have you got any quests I could do?"); + stage = 200; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I was to be marooned, ye see. A srurvy troublemaker had", "taken my ship, and he put me ashore on a little island."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Gosh, how did you escape?"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Arrr, ye see, he made on mistake! Before he sailed", "he gave me a bow and one arrow so that I wouldn't have", "to die slowly."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So I shot him and took my ship back."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Right..."); + stage = 15; + break; + case 15: + end(); + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Arrr, that's a strange yarn."); + stage = 10; + break; + case 200: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nay, I've nothing for ye to do."); + stage = 201; + break; + case 201: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks."); + stage = 202; + break; + case 202: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2691 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LouiLegsDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LouiLegsDialogue.java new file mode 100644 index 000000000..080bab582 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LouiLegsDialogue.java @@ -0,0 +1,84 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the plugin used for loui legs. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LouiLegsDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LouiLegsDialogue} {@code Object}. + */ + public LouiLegsDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LouiLegsDialogue} {@code Object}. + * @param player the player. + */ + public LouiLegsDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LouiLegsDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hey, wanna buy some armour?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What have you got?", "No, thank you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What have you got?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 20; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I provide items to help you keep your legs!"); + stage = 11; + break; + case 11: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 542 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LoweDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LoweDialogue.java new file mode 100644 index 000000000..b113c9e8c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LoweDialogue.java @@ -0,0 +1,80 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represesents the dialogue plugin used for lowe. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LoweDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LoweDialogue} {@code Object}. + */ + public LoweDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LoweDialogue} {@code Object}. + * @param player the player. + */ + public LoweDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LoweDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to Lowe's Archery Emporium. Do you want", "to see my wares?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, I prefer to bash things close up."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, I prefer to bash things close up."); + stage = 3; + break; + } + + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Humph, philistine."); + stage = 4; + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 550 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LubufuDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LubufuDialogue.java new file mode 100644 index 000000000..dd96e353e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LubufuDialogue.java @@ -0,0 +1,105 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the lubufu dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LubufuDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LubufuDialogue} {@code Object}. + */ + public LubufuDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LubufuDialogue} {@code Object}. + * @param player the player. + */ + public LubufuDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LubufuDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Watch where you're going, young whippersnapper!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I wasn't going anywhere...", "What's a whippersnapper?", "Who are you?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I wasn't going anywhere..."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's a whippersnapper?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well then go away from here!"); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's a whip. Which snaps. Like me. Now leave!"); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I am Lubufu - the only fisherman who knows the secret", "of the Karambwan!"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's a Karambwan?"); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What a foolish question! Now leave!"); + stage = 33; + break; + case 33: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1171 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LucyPartyRoomDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/LucyPartyRoomDialoguePlugin.java new file mode 100644 index 000000000..f0fc88d0a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LucyPartyRoomDialoguePlugin.java @@ -0,0 +1,132 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the lucy npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LucyPartyRoomDialoguePlugin extends DialoguePlugin { + + /** + * Represents the npc ids. + */ + private static final int[] NPC_IDS = { 662 }; + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 2); + + /** + * Represents the beer item. + */ + private static final Item BEER = new Item(1917, 1); + + /** + * Constructs a new {@code LucyPartyRoomDialoguePlugin} {@code Object}. + */ + public LucyPartyRoomDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LucyPartyRoomDialoguePlugin} {@code Object}. + * @param player the player. + */ + public LucyPartyRoomDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LucyPartyRoomDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi! I'm Lucy. Welcome to the Party Room!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy a beer?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How much do they cost?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Just 2 gold pieces."); + stage = 4; + break; + case 4: + interpreter.sendOptions("Select an Option", "Yes please!", " No thanks, I can't afford that."); + stage = 5; + break; + case 5: + switch (interfaceId) { + case 228: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please!"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I can't afford that."); + stage = 69; + break; + } + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Coming right up sir!"); + stage = 11; + break; + case 11: + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (player.getInventory().remove(COINS)) { + interpreter.sendItemMessage(1917, "Lucy has given you a beer."); + player.getInventory().add(BEER); + stage = 100; + } else { + end(); + player.getPacketDispatch().sendMessage("You don't have enough coins."); + } + break; + case 69: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I see. Well, come and see me if you change your mind. YOu", "know where I am!"); + stage = 100; + break; + case 100: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return NPC_IDS; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeGuideDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeGuideDialogue.java new file mode 100644 index 000000000..a37cb9dd8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeGuideDialogue.java @@ -0,0 +1,290 @@ +package core.game.content.dialogue; + +import java.util.ArrayList; +import java.util.List; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.link.IronmanMode; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.GameWorld; +import core.game.world.map.zone.impl.ModeratorZone; +import core.plugin.Initializable; +import core.net.amsc.MSPacketRepository; + +/** + * Represents the lumbridge guide dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumbridgeGuideDialogue extends DialoguePlugin { + + /** + * The list of options. + */ + private List options; + + /** + * Constructs a new {@code LumbridgeGuideDialogue} {@code Object}. + */ + public LumbridgeGuideDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LumbridgeGuideDialogue} {@code Object}. + * @param player the player. + */ + public LumbridgeGuideDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LumbridgeGuideDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Greetings, adventurer. I am Phileas, the Lumbridge", "Guide. I am here to give information and directions to", "new players. Do you require any help?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (!player.isStaff() && !player.getIronmanManager().isIronman()) { + options("Where can I find a quest to go on?", "What monsters should I fight?", "Where can I make money?", "I'd like to know more about security.", "Where can I find a bank?"); + stage = 103; + return true; + } + options = new ArrayList<>(); + options.add("Yes please."); + if (player.getRights() == Rights.PLAYER_MODERATOR && ModeratorZone.isOpen() || player.isAdmin()) { + options.add("I would like to access the P-Mod room."); + } + if (player.getIronmanManager().isIronman()) { + options.add("Would you like to remove Ironman Mode?"); + } + options(options.toArray(new String[] {})); + stage = 900; + break; + case 900: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Yes please."); + stage = 102; + break; + case 2: + if (options.get(1).contains("remove")) { + options("Yes, please.", "No."); + stage = 804; + break; + } + if (options.get(1).contains("room")) { + stage = 690; + npc("Yes, of course."); + } else { + stage = 901; + npc("Yes, of course."); + } + break; + case 3: + if (options.get(2).contains("remove")) { + options("Yes, please.", "No."); + stage = 804; + break; + } + stage = 901; + npc("Yes, of course."); + break; + } + break; + case 804: + if (buttonId == 1) { + player("Yes, please."); + stage = 806; + } else { + player("No."); + stage = 805; + } + break; + case 805: + end(); + break; + case 806: + npc("You are no longer an Ironman."); + stage++; + break; + case 807: + player.getIronmanManager().setMode(IronmanMode.NONE); + MSPacketRepository.sendInfoUpdate(player); + end(); + break; + case 10: + options("Tell me about the town of Lumbridge.", "I'm fine for now, thanks."); + stage = 11; + break; + case 1: + case 11: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Yes please."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, null, "No, I can find things myself thank you."); + stage = 200; + break; + } + break; + case 200: + end(); + break; + case 100: + npc("First I must warn you to take every precaution to", "keep your " + GameWorld.getSettings().getName() + " password and PIN secure. The", "most important thing to remember is to never give your", "password to, or share you account with, anyone."); + stage = 101; + break; + case 101: + npc("I have much more information to impart; what would", "you like to know about?"); + stage = 102; + break; + case 102: + options("Where can I find a quest to go on?", "What monsters should I fight?", "Where can I make money?", "I'd like to know more about security.", "Where can I find a bank?"); + stage = 103; + break; + case 103: + switch (buttonId) { + case 1: + player("Where can I find a quest to go on?"); + stage = 1100; + break; + case 2: + player("What monsters should I fight?"); + stage = 1200; + break; + case 3: + player("Where can I make money?"); + stage = 1300; + break; + case 4: + player("I'd like to know more about security."); + stage = 1400; + break; + case 5: + player("Where can I find a bank?"); + stage = 1500; + break; + } + break; + case 1400: + npc("I can tell you about password security, avoiding item", "scamming and in-game moderation. I can also tell you", "about a place called the Stronghold of Security, where", "you can learn more about account security and have a"); + stage = 1401; + break; + case 1401: + npc("bit of an adventure at the same time."); + stage = 1402; + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 17); + break; + case 1402: + end(); + break; + case 1300: + npc("There are many ways to make money in the game. I", "would suggest either killing monsters or doing a trade", "skill such as Smithing or Fishing."); + stage = 1301; + break; + case 1301: + npc("Please don't try to get money by begging off other", "players. It will make you unpopular. Nobody likes a", "beggar. It is very irritating to have other players asking", "for your hard-earned cash."); + stage = 1302; + break; + case 1302: + end(); + break; + case 1200: + npc("You're strong enough to work out what monsters to", "fight for yourself now, but the combat tutors might help", "you with any questions you have about the skills;", "they're just over there to the south of the general store."); + stage = 1201; + break; + case 1201: + npc("There are things to kill all over the place! At your level,", "you might like to try wandering westwards to the", "Wizards' Tower or north-west to the Barbarian Village.", "Non-player characters usually appear as yellow dots on"); + stage = 1202; + break; + case 1202: + npc("your mini-map, although there are some that you won't", "be able to fight, such as myself. If you explore further", "afield you may be able to find areas that are less", "crowded, but watch out for monsters which are tougher"); + stage = 1203; + break; + case 1203: + npc("than you. A monster's combat level is shown next to", "their 'Attack' option. If that level is coloured green it", "means the monster is weaker than you. If it is red, it", "means that the monster is tougher than you."); + stage = 1204; + break; + case 1204: + npc("Remember, you wil do better if you have better", "armour and weapons and it's always worth carrying a", "bit of food to heal yourself."); + stage = 1205; + break; + case 1205: + end(); + break; + case 1500: + npc("You'll find a bank upstairs in Lumbridge Castle - go", "right to the top."); + stage = 1501; + break; + case 1501: + end(); + break; + case 1100: + stage = 1101; + if (!player.getQuestRepository().isComplete("Cook's Assistant")) { + npc("You can try talking to the Cook in the Lumbridge Castle", "I hear he is always looking for some help."); + return true; + } + if (!player.getQuestRepository().isComplete("Sheep Shearer")) { + npc("You can try talking to Fred the Farmer north-west of here", "I hear he is always looking for some help."); + return true; + } + interpreter.sendDialogues(npc, null, "You are such an accomplished adventurer already; you", "should be telling me some good quests to go on."); + break; + case 1101: + end(); + break; + case 104: + end(); + break; + case 680: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Yes please."); + stage = 100; + break; + case 2: + stage = 690; + npc("Yes, of course."); + break; + case 3: + interpreter.sendDialogues(player, null, "No, I can find things myself thank you."); + stage = 200; + break; + } + break; + case 690: + end(); + if (ModeratorZone.isOpen() && player.getDetails().getRights() == Rights.PLAYER_MODERATOR) { + ModeratorZone.teleport(player); + } else if (player.getDetails().getRights() == Rights.ADMINISTRATOR) { + ModeratorZone.teleport(player); + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2244 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeJailGuard.java b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeJailGuard.java new file mode 100644 index 000000000..8f1060749 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeJailGuard.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the lumbridge jail guard. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumbridgeJailGuard extends DialoguePlugin { + + /** + * Constructs a new {@code LumbridgeJailGuard} {@code Object}. + */ + public LumbridgeJailGuard() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LumbridgeJailGuard} {@code Object}. + * @param player the player. + */ + public LumbridgeJailGuard(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LumbridgeJailGuard(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Why are you here ? You must leave at once."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Err.. Okay."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 917, 447, 448, 449 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeSwampArcher.java b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeSwampArcher.java new file mode 100644 index 000000000..6b22afdc3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeSwampArcher.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the lumbridge swamp archer dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumbridgeSwampArcher extends DialoguePlugin { + + /** + * Constructs a new {@code LumbridgeSwampArcher} {@code Object}. + */ + public LumbridgeSwampArcher() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LumbridgeSwampArcher} {@code Object}. + * @param player the player. + */ + public LumbridgeSwampArcher(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LumbridgeSwampArcher(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why are you guys hanging around here?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "(ahem)...'Guys'?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Uh... yeah, sorry about that. Why are you all standing", "around out here?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, that's really none of your business."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 649 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeSwampMonk.java b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeSwampMonk.java new file mode 100644 index 000000000..1867cb940 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeSwampMonk.java @@ -0,0 +1,64 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the lumbridge swamp monk. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumbridgeSwampMonk extends DialoguePlugin { + + /** + * Constructs a new {@code LumbridgeSwampMonk} {@code Object}. + */ + public LumbridgeSwampMonk() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LumbridgeSwampMonk} {@code Object}. + * @param player the player. + */ + public LumbridgeSwampMonk(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LumbridgeSwampMonk(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why are all of you standing around here?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "None of your business. Get lost."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 651 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeSwampWizard.java b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeSwampWizard.java new file mode 100644 index 000000000..4de3879aa --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LumbridgeSwampWizard.java @@ -0,0 +1,68 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the lumbridge swamp lizard dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumbridgeSwampWizard extends DialoguePlugin { + + /** + * Constructs a new {@code LumbridgeSwampWizard} {@code Object}. + */ + public LumbridgeSwampWizard() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LumbridgeSwampWizard} {@code Object}. + * @param player the player. + */ + public LumbridgeSwampWizard(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why are all of you standing around here?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hahaha you dare talk to a mighty wizard such as", "myself? I bet you can't even cast windstrike yet", "amateur!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "...You're an idiot."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LumbridgeSwampWizard(player); + } + + @Override + public int[] getIds() { + return new int[] { 652 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/LuthasDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/LuthasDialogue.java new file mode 100644 index 000000000..bcf330a0e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/LuthasDialogue.java @@ -0,0 +1,144 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the luthas npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LuthasDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 30); + + /** + * Constructs a new {@code LuthasDialogue} {@code Object}. + */ + public LuthasDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LuthasDialogue} {@code Object}. + * @param player the player. + */ + public LuthasDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LuthasDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getSavedData().getGlobalData().isLuthasTask()) { + final int current = player.getSavedData().getGlobalData().getKaramjaBananas(); + if (current >= 10) { + interpreter.sendDialogues(player, null, "I've filled a crate with bananas."); + stage = 905; + return true; + } + interpreter.sendDialogues(npc, null, "Have you completed your task yet?"); + stage = 900; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello I'm Luthas, I run the banana plantation here."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Could you offer me employment on your plantation?", "That customs officer is annoying isn't he?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Could you offer me employment on your plantation?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That customs officer is annoying isn't she?"); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, I can sort something out. There's a crate ready to", "be loaded onto the ship."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You wouldn't believe the demand for bananas from", "Wydin's shop over in Port Sarim. I think this is the", "third crate I've shipped him this month.."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If you could go fill it up with bananas, I'll pay you 30", "gold."); + stage = 13; + player.getSavedData().getGlobalData().setLuthasTask(true); + break; + case 13: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I don't know about that."); + stage = 21; + break; + case 21: + end(); + break; + case 900: + int amt = player.getSavedData().getGlobalData().getKaramjaBananas(); + if (amt < 30) { + interpreter.sendDialogues(player, null, "No, the crate isn't full yet."); + stage = 901; + } else { + + } + break; + case 901: + interpreter.sendDialogues(npc, null, "Well come back when it is."); + stage = 21; + break; + case 905: + interpreter.sendDialogues(npc, null, "Well done, here's your payment."); + stage = 906; + break; + case 906: + end(); + player.getPacketDispatch().sendMessage("Luthas hands you 30 coins."); + player.getSavedData().getGlobalData().setKaramjaBannanas(0); + player.getSavedData().getGlobalData().setLuthasTask(false); + if (player.getAttribute("stashed-rum", false)) { + player.removeAttribute("stashed-rum"); + player.setAttribute("/save:wydin-rum", true); + } + if (!player.getInventory().add(COINS)) { + GroundItemManager.create(new GroundItem(COINS, player.getLocation(), player)); + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 379 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MagicStoreDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MagicStoreDialogue.java new file mode 100644 index 000000000..911400983 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MagicStoreDialogue.java @@ -0,0 +1,76 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the magic store dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MagicStoreDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MagicStoreDialogue} {@code Object}. + * @param player the player. + */ + public MagicStoreDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code MagicStoreDialogue} {@code Object}. + */ + public MagicStoreDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MagicStoreDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Welcome to the Magic Guild Store. Would you like to", "buy some magic supplies?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes please.", "No thank you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Yes please."); + stage = 10; + break; + case 2: + end(); + break; + } + break; + case 10: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 461 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MagicTutorDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MagicTutorDialogue.java new file mode 100644 index 000000000..ed19f0d0f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MagicTutorDialogue.java @@ -0,0 +1,213 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the magic tutor dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MagicTutorDialogue extends DialoguePlugin { + + /** + * Represents the mind runes item. + */ + private static final Item MIND_RUNE = new Item(558); + + /** + * Represents the air rune item. + */ + private static final Item AIR_RUNE = new Item(556); + + /** + * Constructs a new {@code MagicTutorDialogue} {@code Object}. + */ + public MagicTutorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MagicTutorDialogue} {@code Object}. + * @param player the player. + */ + public MagicTutorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MagicTutorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length == 2) { + if (player.getSavedData().getGlobalData().getTutorClaim() > System.currentTimeMillis()) { + interpreter.sendDialogues(npc, null, "I work with the Ranged Combat tutor to give out", "consumable items that you may need for combat such", "as arrows and runes. However we have had some", "cheeky people try to take both!"); + stage = 200; + return true; + } + stage = 99; + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + final GroundItem ground = GroundItemManager.get(MIND_RUNE.getId(), player.getLocation().transform(x, y, 0), player); + final GroundItem second = GroundItemManager.get(AIR_RUNE.getId(), player.getLocation().transform(x, y, 0), player); + if (ground != null && ground.droppedBy(player) || second != null && second.getDropper() != null && second.getDropper() == player) { + interpreter.sendDialogues(npc, null, "Someone seems to have dropped some " + (ground == null ? "air" : "mind") + " runes on", "the floor, perhaps you should pick them up to use them."); + return true; + } + } + } + if (player.getInventory().freeSlots() < 2) { + end(); + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return true; + } + if (player.getInventory().containsItem(MIND_RUNE) || player.getBank().containsItem(MIND_RUNE)) { + interpreter.sendDialogues(npc, null, "You have some mind runes already!"); + stage = 69; + return true; + } + if (player.getInventory().containsItem(AIR_RUNE) || player.getBank().containsItem(AIR_RUNE)) { + interpreter.sendDialogues(npc, null, "You have some air runes already!"); + stage = 70; + return true; + } + add(true); + add(false); + stage = 99; + return true; + } + interpreter.sendOptions("Select an Option", "Can you teach me the basics please?", "Teach me about making runes.", "Goodbye."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 69: + if (player.getInventory().containsItem(AIR_RUNE) || player.getBank().containsItem(AIR_RUNE)) { + interpreter.sendDialogues(npc, null, "You have some air runes already!"); + stage = 99; + return true; + } + add(false); + stage = 99; + end(); + break; + case 70: + if (player.getInventory().containsItem(MIND_RUNE) || player.getBank().containsItem(MIND_RUNE)) { + interpreter.sendDialogues(npc, null, "You have some mind runes already!"); + stage = 99; + return true; + } + add(true); + stage = 99; + end(); + break; + case 99: + end(); + break; + case 300: + add(false); + break; + case 301: + end(); + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you teach me the basics please?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Teach me about making runes."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Goodbye."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You can cast different spells according to what runes", "you have in your inventory. To start off with you'll", "need mind runes and air runes. These will allow you to", "cast Wind Strike like you did in the tutorial."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Use the spell book icon in the top right of the control", "panel to see what spells you can cast. If you have the", "correct runes, the spell will light up."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nemarti, the Ranged Combat tutor and I both give out", "items every 30 minutes, however you must choose", "whether you want runes or ranged equipment. To", "claim runes, right-click on me and choose Claim, to claim"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "ranged equipment right-click on the Ranged Combat", "tutor and select Claim."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you have the spell available, click on it once, then", "click on your target. A good target would be a monster", "that is below your combat level."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Try rats in the castle or if you're feeling brave, the", "goblins to the west of here have been causing a", "nuisance of themselves."); + stage = 16; + break; + case 16: + interpreter.sendOptions("Select an Option", "Can you teach me the basics please?", "Teach me about making runes.", "Goodbye."); + stage = 1; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'd talk to the Duke of Lumbridge if I were you. I", "hear he has an interesting artifact that might just have", "something to do with Runecrafting. I expect there wil", "be a quest involved too!"); + stage = 21; + break; + case 21: + interpreter.sendOptions("Select an Option", "Can you teach me the basics please?", "Teach me about making runes.", "Goodbye."); + stage = 1; + break; + case 30: + end(); + break; + case 200: + interpreter.sendDialogues(npc, null, "So, every half an hour, you may come back and claim", "either arrows OR runes, but not both. Come back in a", "while for runes, or simply make your own."); + stage = 201; + break; + case 201: + end(); + break; + } + return true; + } + + public void add(boolean mind) { + if (mind) { + if (player.getInventory().add(new Item(558, 30))) { + player.getPacketDispatch().sendMessage("Mikasi gives you 30 mind runes."); + stage = 300; + player.getSavedData().getGlobalData().setTutorClaim(System.currentTimeMillis() + 1800000); + } + } else { + if (player.getInventory().add(new Item(556, 30))) { + player.getPacketDispatch().sendMessage("Mikasi gives you 30 air runes."); + stage = 301; + player.getSavedData().getGlobalData().setTutorClaim(System.currentTimeMillis() + 1800000); + } + } + } + + @Override + public int[] getIds() { + return new int[] { 4707 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MakeOverMageDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MakeOverMageDialogue.java new file mode 100644 index 000000000..194fa2f90 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MakeOverMageDialogue.java @@ -0,0 +1,227 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the MakeOverMageDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class MakeOverMageDialogue extends DialoguePlugin { + + public MakeOverMageDialogue() { + + } + + public MakeOverMageDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new MakeOverMageDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length == 2) { + + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm... you didn't feel any unexpected growths", "aywhere around your head just then did you?"); + stage = 600; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there! I am known as the make-over mage! I", "have spent many years researching magics that can", "change your physical appearance!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I can alter your physical form for a small fee of", "only 3000 gold coins! Would you like me to perform my", "magics upon you?"); + stage = 1; + break; + case 1: + if (!player.getInventory().contains(7803, 1) && !player.getBank().contains(7803, 1) && !player.getEquipment().contains(7803, 1)) { + interpreter.sendOptions("Select an Option", "Tell me more about this 'make-over'.", "Sure. Do it.", "No thanks.", "Cool amulet! Can I have one?"); + } else { + interpreter.sendOptions("Select an Option", "Tell me more about this 'make-over'.", "Sure. Do it.", "No thanks."); + } + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me more about this 'make-over'."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sure. Do it."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks. I'm happy as Saradomin made me."); + stage = 19; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Cool amulet! Can I have one?"); + stage = 40; + break; + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You of course agree that if by some accident you", "are turned into a frog you have no rights for", "compensation or refund."); + stage = 25; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, go get it then. No freebies here!"); + stage = 22; + break; + case 22: + end(); + break; + case 25: + if(!player.getEquipment().isEmpty()){ + interpreter.sendDialogue("You need to take off all your equipment before the mage", "can change your appearance."); + stage = 900; + } else { + end(); + player.getInterfaceManager().open(new Component(205)); + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Why, of course! Basically, and I will try and explain", "this so that you will understant it correctly,"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I use my secret magical technique to melt your body", "down into a puddle of its elememnts."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When I have broken down all trace of your body, I", "then rebuild it into the form I am thinking of."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Or, you know, somewhere vaguely close enough", "anyway."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Uh... that doesn't sound particularly safe to me..."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's as safe as houses! Why, I have only had thrity-six", "major accidents this month!"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So what do you say? Feel like a change?"); + stage = 17; + break; + case 17: + interpreter.sendOptions("Select an Option", "Sure. Do it.", "No thanks."); + stage = 18; + break; + case 18: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sure. Do it."); + stage = 20; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks. I'm happy as Saradomin made me."); + stage = 19; + break; + } + break; + case 19: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ehhh... suit yourself."); + stage = 900; + break; + case 900: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No problem, but please remember that the amulet I will", "sell you is only a copy of my own. It contains no", "magical powers; and as such will only cost you 100", "coins."); + stage = 41; + break; + case 41: + interpreter.sendOptions("Select an Option", "Sure, here you go.", "No way! that's too expensive."); + stage = 42; + break; + case 42: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sure, here you go."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No way! That's too expensive."); + stage = 400; + break; + + } + break; + case 400: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That's fair enough, my jewellery is not to everyone's", "taste."); + stage = 401; + break; + case 401: + end(); + break; + case 600: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Uh... No...?"); + stage = 601; + break; + case 601: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Good, good, I was worried for a second there!"); + stage = 602; + break; + case 602: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Uh... Thanks, I guess."); + stage = 603; + break; + case 603: + end(); + break; + case 100: + if (player.getInventory().freeSlots() == 0) { + end(); + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + } + if (!player.getInventory().contains(995, 100)) { + end(); + player.getPacketDispatch().sendMessage("You need 100 coins."); + } else { + // you recieve an amulet in exchange for 100 coins. + // 7803 + Item remove = new Item(995, 100); + if (!player.getInventory().containsItem(remove)) { + end(); + return true; + } + if (player.getInventory().remove(remove)) { + interpreter.sendItemMessage(7803, "You receive an amulet in exchange for 100 coins."); + player.getInventory().add(new Item(7803, 1)); + stage = 101; + } + } + break; + case 101: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2676, 599 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MalakDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MalakDialogue.java new file mode 100644 index 000000000..88c016e5d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MalakDialogue.java @@ -0,0 +1,55 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue used for malak. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class MalakDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MalakDialogue} {@code Object}. + */ + public MalakDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MalakDialogue} {@code Object}. + * @param player the player. + */ + public MalakDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MalakDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Away from me, dog.", "I have business to discuss with the barkeeper."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1920 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MamaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MamaDialogue.java new file mode 100644 index 000000000..3f7d8e79e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MamaDialogue.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialouge plugin used for the dward shop. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MamaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DwarfShopDialogue} {@code Object}. + */ + public MamaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DwarfShopDialogue} {@code Object}. + * @param player the player. + */ + public MamaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MamaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ar, darlin'! How might ya' Mama help ye?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I'd like to see what you have", "Nevermind"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3164 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ManDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/ManDialoguePlugin.java new file mode 100644 index 000000000..4e4aa2a1b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ManDialoguePlugin.java @@ -0,0 +1,115 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.tools.Items; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.tools.RandomFunction; + +/** + * Handles the man dialogues. + * + * @author 'Vexia + */ +@Initializable +public class ManDialoguePlugin extends DialoguePlugin { + private static final Item CIDER = new Item(Items.CIDER_5763); + + /** + * The NPC ids that use this dialogue plugin. + */ + private static final int[] NPC_IDS = {1, 2, 3, 4, 5, 6, 16, 24, 25, 170, 351, 352, 353, 354, 359, 360, 361, 362, 363, 663, 726, 727, 728, 729, 730, 1086, 2675, 2776, 3224, 3225, 3227, 5923, 5924,}; + + public ManDialoguePlugin() { + } + + public ManDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ManDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (npc == null) + return false; + if (args.length > 1 + && args[1] instanceof Item + && ((Item) args[1]).equals(CIDER) + && player.getInventory().remove(CIDER)) { + + // Seers achievement diary + if (!player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0, 6)) { + if (player.getAttribute("diary:seers:pub-cider", 0) >= 4) { + player.setAttribute("/save:diary:seers:pub-cider", 5); + player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).updateTask(player, 0, 6, true); + } else { + player.setAttribute("/save:diary:seers:pub-cider", player.getAttribute("diary:seers:pub-cider", 0) + 1); + } + } + + npc("Ah, a glass of cider, that's very generous of you. I", "don't mind if I do. Thanks!"); + stage = 999; + return true; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, how's it going?"); + stage = RandomFunction.random(0, 5); + if (stage == 1) { + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm very well thank you."); + stage = 999; + break; + case 999: + end(); + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm fine, how are you?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, I don't want to buy anything!"); + stage = 999; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I think we need a new king. The one we've got isn't", "very good."); + stage = 999; + break; + case 20: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm a bold adventurer."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, a very noble profession."); + stage = 999; + break; + case 30: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Very well thank you."); + stage = 999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return NPC_IDS; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ManorFountainDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ManorFountainDialogue.java new file mode 100644 index 000000000..773004070 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ManorFountainDialogue.java @@ -0,0 +1,96 @@ +package core.game.content.dialogue; + +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue that handles the draynor manor fountain. + * @author 'Vexia + * @date 24/12/2013 + */ +@Initializable +public class ManorFountainDialogue extends DialoguePlugin { + + /** + * Represents the dialogue id of the fountain dialogue. + */ + public static final int DIALOGUE_ID = 3954922; + + /** + * Represents the pressure gauge item. + */ + private static final Item PRESSURE_GAUGE = new Item(271); + + /** + * Constructs a new {@code ManorFountainDialogue} {@code Object}. + */ + public ManorFountainDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ManorFountainDialogue} {@code Object}. + * @param player the player. + */ + public ManorFountainDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ManorFountainDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (player.getAttribute("pressure-gauge", false) && player.getInventory().containsItem(PRESSURE_GAUGE)) { + interpreter.sendDialogues(player, null, "It's full of dead fish!"); + stage = 5; + return true; + } + interpreter.sendDialogues(player, null, "There seems to be a pressure gauge in here..."); + stage = player.getAttribute("piranhas-killed", false) ? 3 : 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + player.getImpactHandler().manualHit(player, 1, HitsplatType.NORMAL); + player.sendChat("Ow!"); + interpreter.sendDialogues(player, null, "... and a lot of piranhas!", "I can't get the guage out."); + stage = 2; + break; + case 2: + end(); + break; + case 3: + interpreter.sendDialogues(player, null, "... and a lot of dead fish."); + stage = 4; + break; + case 4: + if (!player.getInventory().add(PRESSURE_GAUGE)) { + GroundItemManager.create(PRESSURE_GAUGE, player); + } + player.getPacketDispatch().sendMessage("You get the pressure gauge from the fountain."); + player.setAttribute("/save:pressure-gauge", true); + end(); + break; + case 5: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3954922 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MartinTheMasterGardener.java b/Server/src/main/java/Server/core/game/content/dialogue/MartinTheMasterGardener.java new file mode 100644 index 000000000..afc6cecd8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MartinTheMasterGardener.java @@ -0,0 +1,110 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for marti the master gardener. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MartinTheMasterGardener extends DialoguePlugin { + + /** + * Constructs a new {@code MartinTheMasterGardener} {@code Object}. + */ + public MartinTheMasterGardener() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MartinTheMasterGardener} {@code Object}. + * @param player the player. + */ + public MartinTheMasterGardener(Player player) { + super(player); + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is that cape that you're wearing?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I can't chat now, I have too many things to worry", "about."); + stage = 20; + break; + } + break; + case 20: + end(); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is a Skillcape of Farming, isn't it incredbile? It's a", "symbol of my ability as the finest farmer in the land!"); + stage = 11; + break; + case 11: + if (player.getSkills().getStaticLevel(Skills.FARMING) == 99) { + npc("Ah! I see you have mastered the skill of Farming,", "would you like to purchase a Farming cape for", "a fee of 99000 coins?"); + stage = 12; + } else { + end(); + } + break; + case 12: + options("Yes, please.", "No, thanks."); + stage = 13; + break; + case 13: + switch (buttonId) { + case 1: + player("Yes, please."); + stage = 14; + break; + case 2: + end(); + break; + } + break; + case 14: + if (Skillcape.purchase(player, Skills.FARMING)) { + npc("Have fun with it."); + stage = 15; + } + stage = 15; + break; + case 15: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MartinTheMasterGardener(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "Skillcape of Farming", "Quest."); + stage = 0; + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3299 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MartinThwaitDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MartinThwaitDialogue.java new file mode 100644 index 000000000..f0b584ebf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MartinThwaitDialogue.java @@ -0,0 +1,198 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.NPCDefinition; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the dialogue used for martin thwait. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MartinThwaitDialogue extends DialoguePlugin { + + /** + * Represents the skillcape items. + */ + private static final Item[] ITEMS = new Item[] { new Item(9777), new Item(9778), new Item(9779) }; + + /** + * Represents the coins to use. + */ + private static final Item COINS = new Item(995, 99000); + + /** + * Constructs a new {@code MartinThwait} {@code Object}. + */ + public MartinThwaitDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MartinThwait} {@code Object}. + * @param player the player. + */ + public MartinThwaitDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MartinThwaitDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You know it's sometimes funny how things work out, I", "lose some gold but find an item, or I lose an item and", "find some gold... no-one ever knows what's gone where", "ya know."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getSkills().getLevel(Skills.THIEVING) == 99) { + interpreter.sendOptions("Select an Option", "Yeah I know what you mean, found anything recently?", "Okay... I'll be going now.", "Can you tell me about your skillcape?"); + stage = 1; + } else { + interpreter.sendOptions("Select an Option", "Yeah I know what you mean, found anything recently?", "Okay... I'll be going now."); + stage = 1; + } + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yeah I know what you mean, found anything recently?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay... I'll be going now."); + stage = 20; + break; + case 3: + if (player.getSkills().getLevel(Skills.THIEVING) == 99) { + interpreter.sendDialogues(player, null, "Can you tell me about your skillcape?"); + stage = 30; + break; + } + break; + } + break; + case 10: + if (player.getSkills().getLevel(Skills.AGILITY) >= 50 && player.getSkills().getLevel(Skills.THIEVING) >= 50 || player.getSkills().getLevel(Skills.THIEVING) == 99) { + end(); + npc.openShop(player); + } else { + if (player.getSkills().getLevel(Skills.THIEVING) < 50) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Sorry, mate. Train up your Thieving skill to at least", "50 and I might be able to help you out."); + } + if (player.getSkills().getLevel(Skills.AGILITY) < 50) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Sorry, mate. Train up your Agility skill to at least", "50 and I might be able to help you out."); + } + } + stage = 11; + break; + case 11: + end(); + break; + case 20: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Sure, this is a Skillcape of Thieving. It shows my stature as", "a master thief! It has all sorts of uses , if you", "have a level of 99 Thieving I'll sell you one."); + stage = 31; + break; + case 31: + if (player.getSkills().getStaticLevel(Skills.THIEVING) == 99) { + options("Yes, please.", "No, thanks."); + stage = 32; + } else { + end(); + } + break; + case 32: + switch (buttonId) { + case 1: + player("Yes, please."); + stage = 33; + break; + case 2: + end(); + break; + } + break; + case 33: + if (player.getInventory().freeSlots() < 2) { + player("Sorry, I don't seem to have enough inventory space."); + stage = 34; + return true; + } + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (!player.getInventory().remove(COINS)) { + player("Sorry, I don't seem to have enoug coins", "with me at this time."); + stage = 34; + return true; + } + player.getInventory().add(ITEMS[player.getSkills().getMasteredSkills() > 1 ? 1 : 0], ITEMS[2]); + npc("There you go! Enjoy."); + stage = 34; + break; + case 34: + end(); + break; + } + return true; + } + + @Override + public void init() { + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(2270).getHandlers().put("option:trade", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getSkills().getLevel(Skills.AGILITY) > 50 && player.getSkills().getLevel(Skills.THIEVING) > 50 || player.getSkills().getLevel(Skills.THIEVING) == 99) { + if (npc == null) { + return true; + } + npc.openShop(player); + } else { + if (player.getSkills().getLevel(Skills.THIEVING) < 50) { + player.getDialogueInterpreter().sendDialogues(2270, FacialExpression.HALF_GUILTY, "Sorry, mate. Train up your Thieving skill to at least", "50 and I might be able to help you out."); + } + if (player.getSkills().getLevel(Skills.AGILITY) < 50) { + player.getDialogueInterpreter().sendDialogues(2270, FacialExpression.HALF_GUILTY, "Sorry, mate. Train up your Agility skill to at least", "50 and I might be able to help you out."); + } + } + return true; + } + + }); + super.init(); + } + + @Override + public int[] getIds() { + return new int[] { 2270 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MathiasFlaconryDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MathiasFlaconryDialogue.java new file mode 100644 index 000000000..a028320a9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MathiasFlaconryDialogue.java @@ -0,0 +1,157 @@ +package core.game.content.dialogue; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the MathiasFlaconryDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class MathiasFlaconryDialogue extends DialoguePlugin { + + public MathiasFlaconryDialogue() { + } + + public MathiasFlaconryDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 5093 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 90: + interpreter.sendOptions("Select an Option", "Ok, that seems reasonable.", "I'm not interested then, thanks."); + stage = 91; + break; + case 91: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, that seems reasonable."); + stage = 95; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm not interested then, thanks."); + stage = 323; + break; + + } + break; + case 323: + end(); + break; + case 95: + if (player.getBank().containsItem(FALCON) || player.getEquipment().containsItem(FALCON) || player.getInventory().containsItem(FALCON)) { + interpreter.sendDialogues(5093, FacialExpression.HALF_GUILTY, "You already have a falcon!"); + stage = 99; + return true; + } + if (player.getEquipment().get(EquipmentContainer.SLOT_HANDS) != null || player.getEquipment().get(EquipmentContainer.SLOT_SHIELD) != null || player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) != null) { + interpreter.sendDialogues(5093, FacialExpression.HALF_GUILTY, "Sorry, free your hands, weapon, and shield slot first."); + stage = 99; + break; + } + if (player.getInventory().contains(995, 500)) { + player.getInventory().remove(new Item(995, 500)); + player.getEquipment().add(new Item(10024), true, false); + interpreter.sendDialogue("The falconer gives you a large leather glove and brings one of the", "smaller birds over to land on it."); + stage = 97; + } else { + end(); + player.getPacketDispatch().sendMessage("You need 500 gold goins."); + } + break; + case 97: + interpreter.sendDialogues(5093, FacialExpression.HALF_GUILTY, "Don't worry: I'll keep and eye on you to make sure", "you don't upset it roo much."); + stage = 99; + break; + case 99: + end(); + break; + case 500: + interpreter.sendDialogues(5093, FacialExpression.HALF_GUILTY, "Greetings. Can I help you at all?"); + stage = 501; + break; + case 501: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Could I have a go with your bird?"); + stage = 502; + break; + case 502: + if (player.getSkills().getLevel(Skills.HUNTER) < 43) { + npc("Try coming back when you're more experienced", "I wouldn't want my birds being injured."); + stage = 967; + return true; + } + interpreter.sendDialogues(5093, FacialExpression.HALF_GUILTY, "Training falcons is a lot of work and I", "doubt you're up to the task. However, I suppose", "I could let you try hunting with one."); + stage = 503; + break; + case 503: + interpreter.sendDialogues(5093, FacialExpression.HALF_GUILTY, "I have some tamer birds that I occasionally lend to rich", "noblemen who consider it a sufficiently refined sport for", "their tastes. and you look like the kind who might", "appreciate a good hunt."); + stage = 90; + break; + case 900: + interpreter.sendOptions("Select an Option", "Yes, please.", "No thank you."); + stage = 901; + break; + case 901: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Yes, please."); + stage = 920; + break; + case 2: + end(); + break; + } + break; + case 920: + player.getBank().remove(FALCON, new Item(10023)); + player.getInventory().remove(new Item(10023), FALCON); + player.getEquipment().add(FALCON, true, false); + interpreter.sendDialogue("The falconer gives you a large leather glove and brings one of the", "smaller birds over to land on it."); + stage = 97; + break; + case 967: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MathiasFlaconryDialogue(player); + } + + private final Item FALCON = new Item(10024); + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + boolean quick = false; + if (player.getEquipment().contains(10023, 1)) { + interpreter.sendDialogues(5093, null, "Oh, it looks like you've lost your falcon.", "Would you like a new one?"); + stage = 900; + return true; + } + if (args.length == 2) + quick = true; + if (quick) { + interpreter.sendDialogues(5093, FacialExpression.HALF_GUILTY, "If you wish to try falconry, I request a small fee. How", "does 500 gold coins sound?"); + stage = 90; + return true; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 500; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MazionDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MazionDialogue.java new file mode 100644 index 000000000..ad36349af --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MazionDialogue.java @@ -0,0 +1,59 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue used for the mazion npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MazionDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MazionDialogue} {@code Object}. + */ + public MazionDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MazionDialogue} {@code Object}. + * @param player the player. + */ + public MazionDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MazionDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Please leave me along, a parrot stole my banana."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3114 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MeleeShopDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/MeleeShopDialoguePlugin.java new file mode 100644 index 000000000..e69a510fd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MeleeShopDialoguePlugin.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.content.global.shop.Shop; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Package -> core.game.content.dialogue + * Created on -> 9/10/2016 @10:33 PM for 530 + * + * @author Ethan Kyle Millard + */ +@Initializable +public class MeleeShopDialoguePlugin extends DialoguePlugin { + + private Shop shop; + + + public MeleeShopDialoguePlugin() { + /** + * Empty + */ + } + + public MeleeShopDialoguePlugin(Player player) { + super(player); + } + @Override + public DialoguePlugin newInstance(Player player) { + return new MeleeShopDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + options("Melee Shop 1", "Melee Shop 2"); + stage = 0; + return false; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch(stage) { + case 0: + switch (buttonId) { + case 1: + npc.openShop(player); + break; + case 2: + break; + } + break; + } + return true; + } + + + @Override + public int[] getIds() { + return new int[] { 5503 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MiningGuildDwarf.java b/Server/src/main/java/Server/core/game/content/dialogue/MiningGuildDwarf.java new file mode 100644 index 000000000..36906db41 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MiningGuildDwarf.java @@ -0,0 +1,133 @@ +package core.game.content.dialogue; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the mining guild dwarf. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MiningGuildDwarf extends DialoguePlugin { + + /** + * Constructs a new {@code MiningGuildDwarf} {@code Object}. + */ + public MiningGuildDwarf() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MiningGuildDwarf} {@code Object}. + * @param player the player. + */ + public MiningGuildDwarf(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MiningGuildDwarf(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length == 2) { + if (player.getSkills().getStaticLevel(Skills.MINING) < 60) { + interpreter.sendDialogues(npc, null, "Sorry, but you need level 60 Mining to go in there."); + stage = 69; + return true; + } + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to the Mining Guild.", "Can I help you with anything?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 69: + end(); + break; + case 0: + interpreter.sendOptions("What would you like to say?", "What have you got in the Guild?", "What do you dwarves do wiyth the ore you mine?", "No thanks, I'm fine."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What have you got in the Guild?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do you dwarves do with the ore you mine?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I'm fine."); + stage = 30; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ooh, it's WONDEFRFUL! There are lots of coal rocks,", "and even a few mithril rocks in the guild,", "all exclusively for people with at least level 60 mining", "There's no better mining site anywhere near here."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So you won't let me go in there?"); + stage = 12; + break; + case 12: + if (player.getSkills().getStaticLevel(Skills.MINING) < 60) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Sorry, but the rules are rules. Do some more training", "first."); + stage = 13; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, you can enter if you wish."); + stage = 14; + } + break; + case 13: + end(); + break; + case 14: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What do you think? We smelt it into bars, smith the", "metal to make armour and weapons, then we exchange", "them for goods and services."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't see many dwarves here."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, this is only a mining outpost. We dwarves don't", "much like to settle in human cities. Most of the ore is", "carted off to Keldagrim, the great dwarven city-", "They've got a special blast furnace up there - it makes"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "smelting the ore so much easier. There are plenty of", "dwarven traders working in Keldagrim."); + stage = 24; + break; + case 24: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 382 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MiningSkillCapeDwarfDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MiningSkillCapeDwarfDialogue.java new file mode 100644 index 000000000..779bc5ab1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MiningSkillCapeDwarfDialogue.java @@ -0,0 +1,190 @@ +package core.game.content.dialogue; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the skillcape dwarfs dialogue plugin. + * @author 'Vexia + * @version 1.5 + */ +@Initializable +public final class MiningSkillCapeDwarfDialogue extends DialoguePlugin { + + /** + * Represents the items used for skillcape purchasing. + */ + private static final Item[] ITEMS = new Item[] { new Item(9792), new Item(9793), new Item(9794) }; + + /** + * Represents the coins required to buy a skillcape. + */ + private static final Item COINS = new Item(995, 99000); + + /** + * Constructs a new {@code MiningSkillCapeDwarfDialogue} {@code Object}. + */ + public MiningSkillCapeDwarfDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MiningSkillCapeDwarfDialogue} {@code Object}. + * @param player the player. + */ + public MiningSkillCapeDwarfDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MiningSkillCapeDwarfDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Welcome to the Mining Guild.", "Can I help you with anything?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("What would you like to say?", "What have you got in the Guild?", "What do you dwarves do with the ore you mine?", "Can you tell me about your skillcape?", "No thanks, I'm fine."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What have you got in the guild?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do you dwarves do with the ore you mine?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you tell me about your skillcape?"); + stage = 40; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I'm fine."); + stage = 30; + break; + + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "What do you think? We smelt it into bars, smith the metal", "to make armour and weapons, then we exchange them for", "goods and services."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't see many dwarves", "selling armour or weapons here."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "No, this is only a mining outpost. We dwarves don't much", "like to settle in human cities. Most of the ore is carted off", "to Keldagrim, the great dwarven city. They've got a", "special blast furnace up there - it makes smelting the ore"); + stage = 12; + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Ooh, it's WONDERFUL! There are lots of coal rocks,", "and even a few mithril rocks in the guild,", "all exclusively for people with at least level 60 mining.", "There's no better mining site anywhere near here."); + stage = 11; + break; + case 11: + interpreter.sendOptions("What would you like to say?", "What have you got in the Guild?", "What do you dwarves do with the ore you mine?", "Can you tell me about your skillcape?", "No thanks, I'm fine."); + stage = 1; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "so much easier. There are plenty of dwarven traders", "working in Keldagrim. Anyway, can I help you with anything ", "else?"); + stage = 11; + break; + case 30: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Sure, this is a Skillcape of Mining. It shows my stature as", "a master miner! It has all sorts of uses , if you", "have a level of 99 mining I'll sell you one."); + stage = 41; + break; + case 41: + if (player.getSkills().getStaticLevel(Skills.MINING) < 99) { + interpreter.sendOptions("What would you like to say?", "What have you got in the Guild?", "What do you dwarves do with the ore you mine?", "Can you tell me about your skillcape?", "No thanks, I'm fine."); + stage = 1; + } else { + options("I'd like to buy a Skillcape of Mining.", "Goodbye."); + stage = 43; + } + break; + case 43: + switch (buttonId) { + case 1: + player("I'd like to buy a Skillcape of Mining."); + stage = 45; + break; + case 2: + player("Goodbye."); + stage = 44; + break; + } + break; + case 44: + end(); + break; + case 45: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "It will cost you 99,000 gold coins, are you sure?"); + stage = 46; + break; + case 46: + options("Yes.", "No."); + stage = 47; + break; + case 47: + switch (buttonId) { + case 1: + player("Yes."); + stage = 48; + break; + case 2: + end(); + break; + } + break; + case 48: + if (!player.getInventory().containsItem(COINS)) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "You need 99,000 gold coins in order to buy a Skillcape", "of mining."); + stage = 44; + return true; + } + if (player.getInventory().freeSlots() < 2) { + player.getPacketDispatch().sendMessage("You don't have enough room in your inventory."); + end(); + return true; + } + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (player.getInventory().remove(COINS) && player.getInventory().add(ITEMS[player.getSkills().getMasteredSkills() > 1 ? 1 : 0], ITEMS[2])) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Thanks!"); + stage = 49; + } + break; + case 49: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3295 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MiningtutorDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MiningtutorDialogue.java new file mode 100644 index 000000000..8f6415694 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MiningtutorDialogue.java @@ -0,0 +1,103 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the mining tutor dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MiningtutorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MiningtutorDialogue} {@code Object}. + */ + public MiningtutorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MiningtutorDialogue} {@code Object}. + * @param player the player. + */ + public MiningtutorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MiningtutorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "Can you teach me the basics of mining please?", "Are there any mining related quests?", "Goodbye."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you teach me the basics of mining please?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Are there are mining related quests?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Goodbye."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If you want to know what ore's in a rock before you", "mine it, right-click the rock and select prospect from the", "menu, it will take a little time, but you'll find out what's", "in the rock before you mine."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You can also tell the ore you'll get from the colour of", "the rock."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "To mine, simply click on the rock to mine it, but make", "sue you have your pick with you."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you have a full inventory, take it to the bank,", "you can find it on the roof of the castle in Lumbridge."); + stage = 14; + break; + case 14: + interpreter.sendOptions("Select an Option", "Can you teach me the basics of mining please?", "Are there any mining related quests?", "Goodbye."); + stage = 0; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh yes, if you haven't already, speak to Doric who can", "be found around the anvils north of Falador. I'm sure", "he can help you out."); + stage = 21; + break; + case 21: + interpreter.sendOptions("Select an Option", "Can you teach me the basics of mining please?", "Are there any mining related quests?", "Goodbye."); + stage = 0; + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4902 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MissSchismDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MissSchismDialogue.java new file mode 100644 index 000000000..92008a86a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MissSchismDialogue.java @@ -0,0 +1,187 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the miss schism dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MissSchismDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MissSchismDialogue} {@code Object}. + */ + public MissSchismDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MissSchismDialogue} {@code Object}. + * @param player the player. + */ + public MissSchismDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MissSchismDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oooh, my dear, have you heard the news?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("What would you like to say?", "Ok, tell me about the news.", "Who are you?", "I'm not talking to you, you horrible woman."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, tell me about the news."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm not talking to you, you horrible woman."); + stage = 30; + break; + } + + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, there's just to much to tell at once! What would", "you like to hear first: the vampire or the bank?"); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Tell me about the vampire.", "Tell me about the bank."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about the vampire."); + stage = 110; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What about the bank?"); + stage = 210; + break; + } + + break; + case 110: + if (player.getQuestRepository().isComplete("Vampire Slayer")) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, there's nothing to tell NOW. You killed it."); + stage = 111; + } else { + npc("There is an evil Vampire terrorizing the city!"); + stage = 119; + } + break; + case 111: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You could sound a little grateful."); + stage = 112; + break; + case 112: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm sure I could, but I don't see why. The vampie wasn't", "bothering me."); + stage = 113; + break; + case 113: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "..."); + stage = 114; + break; + case 114: + end(); + break; + case 119: + player("Oh, that's not good."); + stage = 120; + break; + case 120: + end(); + break; + case 210: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's terrible, absolutely terrible! Those poor people!"); + stage = 211; + break; + case 211: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, yeah."); + stage = 212; + break; + case 212: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "And who'd have ever thought such a sweet old genleman", "would do such a thing?"); + stage = 213; + break; + case 213: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Are we talking about the bank robbery?"); + stage = 214; + break; + case 214: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh yes, my dear. It was terrible! TERRIBLE!"); + stage = 215; + break; + case 215: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I, my dear, am a concerned citizen of Draynor Village.", "Ever since the Council allowed those farmers to set up", "their stalls here, we've had a constant flow of thieves and", "murderers through our fair village, and I decided that"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "someone HAD to stand up and", "keep an eye on the situation."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I also do voluntary work for the Draynor Manor", "Restoration Fund. We're campagning to have", "Draynor manor turned into a museum before the wet-rot", "destroys it completely."); + stage = 23; + break; + case 23: + if(player.getQuestRepository().isComplete("Vampire Slayer")) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, now that I've cleared the vampire out of the manor,", "I guess you won't have to mutch trouble turning it into a", "museum."); + stage = 24; + } else { + end(); + } + break; + case 24: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That's all very well dear, but no vampire was ever going to", "stop me making it a museum."); + stage = 25; + break; + case 25: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oooh."); + stage = 31; + break; + case 31: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2634 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MistagDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/MistagDialogue.kt new file mode 100644 index 000000000..950e86cf5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MistagDialogue.kt @@ -0,0 +1,92 @@ +package core.game.content.dialogue + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.activity.ActivityManager +import core.game.content.quest.members.thelosttribe.GoblinFollower + +@Initializable +class MistagDialogue (player: Player? = null) : DialoguePlugin(player){ + override fun newInstance(player: Player?): DialoguePlugin { + return MistagDialogue(player) + } + + override fun npc(vararg messages: String?): Component { + return npc(FacialExpression.OLD_NORMAL,*messages) + } + + override fun open(vararg args: Any?): Boolean { + if(args.size > 0 && args[0] == "greeting"){ + npc("A human knows ancient greeting?") + stage = 100 + return true + } + if(!player.getAttribute("mistag-greeted",false)){ + npc("Who...who are you? How did you get in here?") + stage = -100 + return true + } + if(player.questRepository.getQuest("Lost Tribe").getStage(player) == 45){ + npc("Greetings, friend. I am sorry I panicked when I saw you.") + stage = 102 + return true + } + if(player.questRepository.getQuest("Lost Tribe").getStage(player) == 50){ + npc("Hello, friend?") + stage = 150 + return true + } + npc("Hello friend!").also { stage = 0 } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + //Pre-greeting + -100 -> npc("Help! A surface dweller this deep in our mines? We will","all be destroyed!").also { stage++ } + -99 -> end() + + //Normal Dialogue + 0 -> options("May I mine the rocks here?","Can you show me the way out?").also { stage++ } + 1 -> when(buttonId){ + 1 -> player("May I mine the rocks here?").also { stage = 10 } + 2 -> player("Can you show me the way out of the mine?").also { stage = 20 } + } + 10 -> npc("Certainly, friend!").also { stage = 1000 } + 20 -> npc("Certainly!").also { stage++ } + 21 -> end().also { + GoblinFollower.sendToLumbridge(player) + } + + //Greeting dialogue + 100 -> npc("Perhaps you are a friend after all!").also { stage++ } + 101 -> npc("Greetings, friend. I am sorry I panicked when I saw you.").also { stage++ } + 102 -> npc("Our legends tell of the surface as a place of horror and","violence, where the gods forced us to fight in terrible","battles.").also { stage++ } + 103 -> npc("When I saw a surface-dweller appear I was afraid it","was a return to the old days!").also { stage++ } + 104 -> player("Did you break in to the castle cellar?").also { stage++ } + 105 -> npc("It was an accident. We were following a seam of iron","and suddenly we found ourselves in a room!").also { stage++ } + 106 -> npc("We blocked up our tunnel behind us and ran back","here. Then we did what cave goblins always do when","there is a problem: we hid and hoped it would go away.").also { stage++ } + 107 -> npc("We meant no harm! Please tell the ruler of the above","people that we want to make peace.").also { stage = 1000; player.questRepository.getQuest("Lost Tribe").setStage(player,46) } + + //Peace treaty dialogue + 150 -> player("I have a peace treaty from the Duke of Lumbridge.").also { stage++ } + 151 -> npc("A peace treaty? Then you will not invade?").also { stage++ } + 152 -> player("No. As long as you stick to the terms of this treaty","there will be no conflict. The Duke of Lumbridge wants","to meet your ruler to sign it.").also { stage++ } + 153 -> npc("I will summon Ur-tag, our headman, at once.").also { stage++ } + 154 -> { + end() + ActivityManager.start(player,"Lost Tribe Cutscene",false) + } + + 1000 -> end() + + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(2084) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MithGrappleDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MithGrappleDialogue.java new file mode 100644 index 000000000..bbf4dd5bf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MithGrappleDialogue.java @@ -0,0 +1,102 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.fletching.items.grapple.GrapplePulse; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; + +/** + * Represents the dialogue used to create a mith grapple. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MithGrappleDialogue extends DialoguePlugin { + + /** + * Represents the mith grapple tip. + */ + private static final Item MITH_GRAPPLE = new Item(9418); + + /** + * Represents the first item used. + */ + private Item first; + + /** + * Represents the second item used. + */ + private Item second; + + /** + * Constructs a new {@code MithGrappleDialogue} {@code Object}. + */ + public MithGrappleDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MithGrappleDialogue} {@code Object}. + * @param player the player. + */ + public MithGrappleDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MithGrappleDialogue(player); + } + + @Override + public boolean open(Object... args) { + first = (Item) args[0]; + second = (Item) args[1]; + player.getInterfaceManager().openChatbox(309); + player.getPacketDispatch().sendString("



Mith Grapple", 309, 6); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 215, 26)); + player.getPacketDispatch().sendItemZoomOnInterface(MITH_GRAPPLE.getId(), 175, 309, 2); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + player.getInterfaceManager().closeChatbox(); + int amount = 0; + switch (buttonId) { + case 6: + amount = 1; + break; + case 5: + amount = 5; + break; + case 4: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + player.getPulseManager().run(new GrapplePulse(player, first, ammount)); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount"); + return true; + case 3: + amount = player.getInventory().getAmount(second); + break; + } + player.getPulseManager().run(new GrapplePulse(player, first, amount)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 903213 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MithrilSeedsDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MithrilSeedsDialogue.java new file mode 100644 index 000000000..baa6b5c8f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MithrilSeedsDialogue.java @@ -0,0 +1,96 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.player.FaceLocationFlag; + +/** + * Represents the dialogue plugin used for mithril seeds. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MithrilSeedsDialogue extends DialoguePlugin { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(827); + + /** + * Represents the flower object. + */ + private GameObject flower; + + /** + * Constructs a new {@code MithrilSeedPluginDialogue}. + */ + public MithrilSeedsDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MithrilSeedPluginDialogue}. + */ + public MithrilSeedsDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MithrilSeedsDialogue(player); + } + + @Override + public boolean open(Object... args) { + flower = (GameObject) args[0]; + player.getDialogueInterpreter().sendOptions("Select an Option", "Pick the flowers.", "Leave the flowers."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (interfaceId) { + case 228: // Options chatbox interface id. + switch (buttonId) { + case 1: // First option + player.lock(2); + player.faceLocation(FaceLocationFlag.getFaceLocation(player, flower)); + player.animate(ANIMATION); + GameWorld.getPulser().submit(new Pulse(2, player, flower) { + @Override + public boolean pulse() { + Item reward = new Item(2460 + ((flower.getId() - 2980) << 1)); + if (reward == null || !player.getInventory().hasSpaceFor(reward)) { + player.getPacketDispatch().sendMessage("Not enough space in your inventory!"); + return true; + } + if (ObjectBuilder.remove(flower)) { + player.getInventory().add(reward); + player.getPacketDispatch().sendMessage("You pick the flowers."); + } + return true; + } + }); + break; + } + break; + } + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1 << 16 | 1 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MithrilSeedsPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/MithrilSeedsPlugin.java new file mode 100644 index 000000000..eb6717d3a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MithrilSeedsPlugin.java @@ -0,0 +1,93 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.player.FaceLocationFlag; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the plugin used for mithril seeds. + * @author 'Vexia + * @version 1.2 + */ +@Initializable +public final class MithrilSeedsPlugin extends OptionHandler { + + /** + * Represents the item to use. + */ + private static final Item ITEM = new Item(299, 1); + + /** + * Represents the common flower ids. + */ + private static final int FLOWERS[] = { 2980, 2981, 2982, 2983, 2984, 2985, 2986 }; + + /** + * Represents the rare flower ids. + */ + private static final int RARE[] = new int[] { 2987, 2988 }; + + /** + * Represents the animation. + */ + private static final Animation ANIMATION = new Animation(827); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(299).getHandlers().put("option:plant", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (player.getAttribute("delay:plant", -1) > GameWorld.getTicks()) { + return true; + } + if (RegionManager.getObject(player.getLocation()) != null) { + player.getPacketDispatch().sendMessage("You can't plant a flower here."); + return true; + } + player.animate(ANIMATION); + player.getInventory().remove(ITEM); + final GameObject object = ObjectBuilder.add(new GameObject(getFlower(RandomFunction.random(100) == 1 ? RARE : FLOWERS), player.getLocation()), 100); + player.moveStep(); + player.lock(3); + player.getPulseManager().run(new Pulse(1, player) { + @Override + public boolean pulse() { + player.faceLocation(FaceLocationFlag.getFaceLocation(player, object)); + player.getDialogueInterpreter().open(1 << 16 | 1, object); + return true; + } + }); + player.setAttribute("delay:plant", GameWorld.getTicks() + 3); + player.getPacketDispatch().sendMessage("You open the small mithril case and drop a seed by your feet."); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + /** + * Gets a random flower from an array. + * @return the flower. + */ + public static int getFlower(int[] array) { + return array[RandomFunction.random(array.length)]; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MonkOfEntranaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MonkOfEntranaDialogue.java new file mode 100644 index 000000000..9d94aead0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MonkOfEntranaDialogue.java @@ -0,0 +1,145 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.global.travel.ship.Ships; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the monk of entrana dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MonkOfEntranaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MonkOfEntranaDialogue} {@code Object}. + */ + public MonkOfEntranaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MonkOfEntranaDialogue} {@code Object}. + * @param player the player. + */ + public MonkOfEntranaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MonkOfEntranaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (npc.getId() == 2730 || npc.getId() == 658 || npc.getId() == 2731) { + interpreter.sendDialogues(npc, null, "Do you wish to leave holy entrana?"); + stage = 500; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you seek passage to holy Entrana? If so, you must", "leave your weaponry and armour behind. This is", "Saradomin's will."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "No, not right now.", "Yes, okay, I'm ready to go."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "No, not right now."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, null, "Yes, okay, I'm ready to go."); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, null, "Very well."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, null, "Very well. One moment please."); + stage = 21; + break; + case 21: + interpreter.sendDialogue("The monk quickly searches you."); + stage = 22; + break; + case 22: + if (!ItemDefinition.canEnterEntrana(player)) { + interpreter.sendDialogues(npc, null, "NO WEAPONS OR ARMOUR are permitted on holy", "Entrana AT ALL. We will not allow you to travel there", "in breach of mighty Saradomin's edict."); + stage = 23; + return true; + } + interpreter.sendDialogues(npc, null, "All is satisfactory. You may board the boat now."); + stage = 25; + break; + case 23: + interpreter.sendDialogues(npc, null, "Do not try and decieve us again. Come back when you", "have liad down your Zamorakian instruments of death."); + stage = 24; + break; + case 24: + end(); + break; + case 25: + end(); + Ships.PORT_SARIM_TO_ENTRANA.sail(player); + if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0, 14)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player, 0, 14, true); + } + break; + case 500: + interpreter.sendOptions("Select an Option", "Yes, I'm ready to go.", "Not just yet."); + stage = 501; + break; + case 501: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Yes, I'm ready to go."); + stage = 510; + break; + case 2: + interpreter.sendDialogues(player, null, "Not just yet."); + stage = 520; + break; + } + break; + case 510: + interpreter.sendDialogues(npc, null, "Okay, let's board..."); + stage = 511; + break; + case 511: + end(); + Ships.ENTRANA_TO_PORT_SARIM.sail(player); + break; + case 520: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2728, 657, 2729, 2730, 2731, 658 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MonkeyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MonkeyDialogue.java new file mode 100644 index 000000000..a6d1df32d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MonkeyDialogue.java @@ -0,0 +1,60 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * The dialogue for the desert monkey. + * @author 'Vexia + */ +@Initializable +public final class MonkeyDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MonkeyDialogue} {@code Object}. + */ + public MonkeyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MonkeyDialogue} {@code Object}. + * @param player the player. + */ + public MonkeyDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MonkeyDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Who's a cute little monkey?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Ukkuk oook! Eeek aka, ahh aka gonk."); + stage++; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2301 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MorganDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MorganDialogue.java new file mode 100644 index 000000000..1bbbae1ff --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MorganDialogue.java @@ -0,0 +1,144 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the dialogue plugin used for the morgan npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MorganDialogue extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code MorganDialogue} {@code Object}. + */ + public MorganDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MorganDialogue} {@code Object}. + * @param player the player. + */ + public MorganDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest("Vampire Slayer"); + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Vampire Slayer"); + if (quest.getStage(player) == 0) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Please please help us, bold adventurer!"); + stage = 0; + } + switch (quest.getStage(player)) { + case 10: + case 20: + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How are you doing with the quest?"); + stage = 10; + break; + case 100: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I have slain the foul creature!"); + stage = 101; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's the problem?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Our little village has been dreadfully ravaged by an evil", "vampire! He lives in the basement of the manor to the", "north, we need someone to get rid of him once and for", "all!"); + stage = 2; + break; + case 2: + interpreter.sendOptions("Select an Option", "No, vampires are scary!", "Ok, I'm up for an adventure.", "Have you got any tips on killing the vampire?"); + stage = 7; + break; + case 7: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, vampires are scary!"); + stage = 8; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, I'm up for an adventure."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have you got any tips on killing the vampire?"); + stage = 3; + break; + } + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I think first you should seek help. I have a friend who", "is a retired vampire hunter, his name is Dr. Harlow. He", "may be able to give you some tips. He can normally be", "found in the Blue Moon Inn in Varrock, he's a bit of"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "an old soak these days. Mention his old friend Morgan,", "I'm sure he wouldn't want me killed by a vampire."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll look him up then."); + stage = 6; + break; + case 6: + quest.start(player); + player.getQuestRepository().syncronizeTab(player); + end(); + break; + case 8: + end(); + break; + case 10: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm still working on it."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Please hurry! Every day we live in fear that we", "the vampire's next victim!"); + stage = 12; + break; + case 12: + end(); + break; + case 101: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Thank you, thank you! You will always be a hero in", "our village!"); + stage = 102; + break; + case 102: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MorganDialogue(player); + } + + @Override + public int[] getIds() { + return new int[] { 755 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MubarizDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MubarizDialogue.java new file mode 100644 index 000000000..525cd6532 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MubarizDialogue.java @@ -0,0 +1,165 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the mubariz dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MubarizDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MubarizDialogue {@code Object}. + */ + public MubarizDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MubarizDialogue} {@code Object}. + * @param player the player. + */ + public MubarizDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MubarizDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to the Duel Arena!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks! I need some information."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What would you like to know?"); + stage = 3; + break; + case 3: + interpreter.sendOptions("Information", "What is this place?", "How do I challenge someone to a duel?", "What kind of options are there?", "This place looks really old, where did it come from?"); + stage = 4; + break; + case 4: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is this place?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How do I challenge someone to a duel?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What kind of options are there?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "This place looks really old, where did it come from?"); + stage = 40; + break; + + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you go to the arena you'll go up an access ramp", "to the walkways that overlook the duel arenas. From the", "walkways you can watch the duels and challenge other", "players."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You'll know you're in the right place as you'll have a", "Duel-with option when you right-click a player."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm there!"); + stage = 23; + break; + case 23: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You and your opponent can offer items as a stake. If", "you win, you recieve what your opponent staked, but if", "you lose, your opponent will get whatever items you", "staked."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You can choose to use rules to spice things up a bit.", "For instance if you both agree to use the 'No Magic'", "rule then neither player can use magic to attack the", "other player. The fight will be restricted to ranging and"); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "melee only."); + stage = 33; + break; + case 33: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The rules are fairly self-evident with lots of different", "combinations for you to try out!"); + stage = 34; + break; + case 34: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Cool! Thanks!"); + stage = 35; + break; + case 35: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Now that the archaeologists have moved out, a group of", "warriors, headed by myself, have bought the land and", "converted it to a set of duel arenas. The best fighters", "from around the world come here to fight!"); + stage = 41; + break; + case 41: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I challenge you!"); + stage = 42; + break; + case 42: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ho! Ho! Ho!"); + stage = 43; + break; + case 43: + end(); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The Duel Arena has six duel arenas where you can", "fight other players in a controlled enviornment. We", "have our own dedicated hospital where we guarantee to", "put you back together, even if you lose."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Inbetween the arenas are walkways where you can", "watch the fights and challenge other players"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sounds great. Thanks!"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "See you in the arenas!"); + stage = 15; + break; + case 15: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 957 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/MurkyMattDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/MurkyMattDialogue.java new file mode 100644 index 000000000..f036114e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/MurkyMattDialogue.java @@ -0,0 +1,136 @@ +package core.game.content.dialogue; + +import core.game.ge.GEGuidePrice; +import core.game.ge.GEGuidePrice.GuideType; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the murly matt dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MurkyMattDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MurkyMattDialogue} {@code Object}. + */ + public MurkyMattDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MurkyMattDialogue} {@code Object}. + * @param player the player. + */ + public MurkyMattDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MurkyMattDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "A pirate!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Arrrr, How'd ye be guessing that, me-lad?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You're kidding, right?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nay! Now, what is it that ye be wantin?", "I can tell ye all about the prices of runes, I can."); + stage = 3; + break; + case 3: + interpreter.sendOptions("Select an Option", "What's a pirate doing here?", "Tell me about the prices of runes.", "I got to go, erm, swab some decks! Yar!"); + stage = 4; + break; + case 4: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's a pirate doing here?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about the prices of runes."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I got to go, erm, swab some decks! Yarr!"); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "By my sea-blistered skin, I could ask the same of you!"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "But... I'm not a pirate?"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No? Then what's that smell? The smell o'", "someone spent too long at sea without a bath!"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I think that's probably you."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Har har har!"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "We've got a stern landlubber 'ere'! Well, let", "me tell ye, I'm here for the Grand Exchange!"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Don't you just want to sell it in a shop or trade", "it to someone specific?"); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "By my wave-battered bones! Not when I can sell to", "the whole world from this very spot!"); + stage = 18; + break; + case 18: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You pirates are nothing but trouble!"); + stage = 19; + break; + case 19: + end(); + break; + case 20: + end(); + GEGuidePrice.open(player, GuideType.RUNES); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6525 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/NarfsDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/NarfsDialogue.java new file mode 100644 index 000000000..7a3f4258c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/NarfsDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the NarfsDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class NarfsDialogue extends DialoguePlugin { + + public NarfsDialogue() { + + } + + public NarfsDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 3238 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "'Narf'? You think that's funny?", "At least I Don't call myself '" + player.getDetails().getUsername() + "' ", "Where did you get a name like that?"); + stage = 100; + break; + case 100: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "It seemed like a good idea at the time!"); + stage = 101; + break; + case 101: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Bah!"); + stage = 102; + break; + case 102: + end(); + break; + + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new NarfsDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's a funny name you've got."); + stage = 1; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/NikitiaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/NikitiaDialogue.java new file mode 100644 index 000000000..f1a168089 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/NikitiaDialogue.java @@ -0,0 +1,46 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the NikitiaDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class NikitiaDialogue extends DialoguePlugin { + + public NikitiaDialogue() { + + } + + public NikitiaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new NikitiaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Don't talk to me again if you value your life!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6042 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/NurmofDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/NurmofDialogue.java new file mode 100644 index 000000000..32f2f67bd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/NurmofDialogue.java @@ -0,0 +1,62 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the NurmofDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class NurmofDialogue extends DialoguePlugin { + + public NurmofDialogue() { + + } + + public NurmofDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new NurmofDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings and welcome to my pickaxe shop. Do you", "want to buy my premium quality pickaxes?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 594 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/OcaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/OcaDialogue.java new file mode 100644 index 000000000..6a3980428 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/OcaDialogue.java @@ -0,0 +1,54 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the OcaDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class OcaDialogue extends DialoguePlugin { + + public OcaDialogue() { + + } + + public OcaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new OcaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello stranger."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1085 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/OliviaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/OliviaDialogue.java new file mode 100644 index 000000000..4987e797b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/OliviaDialogue.java @@ -0,0 +1,78 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the OliviaDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class OliviaDialogue extends DialoguePlugin { + + public OliviaDialogue() { + + } + + public OliviaDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 2233, 2572 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes", "No", "Where do I get rarer seeds from?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where do I get rarer seeds from?"); + stage = 40; + break; + + } + break; + case 20: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The Master Farmers usually carry a few rare seeds", "around with them, although I don't know if they'd want", "to part with them for any price to be honest."); + stage = 41; + break; + case 41: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new OliviaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to trade in seeds?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/OllieTheCamelDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/OllieTheCamelDialogue.java new file mode 100644 index 000000000..a480f139f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/OllieTheCamelDialogue.java @@ -0,0 +1,51 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the OllieTheCamelDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class OllieTheCamelDialogue extends DialoguePlugin { + + public OllieTheCamelDialogue() { + + } + + public OllieTheCamelDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 2811 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + player.getPacketDispatch().sendMessage("The camel tries to stamp on your foot, but you pull it back quickly."); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new OllieTheCamelDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I wonder if that camel has fleas..."); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/OracleDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/OracleDialogue.java new file mode 100644 index 000000000..95d4748f9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/OracleDialogue.java @@ -0,0 +1,96 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the oracle dialogue plugin related to dragon slayer. + * @author 'Vexia + */ +@Initializable +public final class OracleDialogue extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code OracleDialogue} {@code Object}. + */ + public OracleDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code OracleDialogue} {@code Object}. + * @param player the player. + */ + public OracleDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new OracleDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Dragon Slayer"); + switch (quest.getStage(player)) { + case 20: + player("I seek a piece of the map to the island of Crandor."); + stage = 0; + break; + default: + player("Can you impart your wise knowledge on me, O Oracle?"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 20: + switch (stage) { + case 0: + npc("The map's behind a door below,", "but entering is rather tough.", "This is that you need to know:", "You must use the following stuff."); + stage = 1; + break; + case 1: + npc("First, a drink used by a mage.", "Next, some worm string, changed to sheet.", "Then, a small crustacean cage.", "Last, a bowl that's not seen heat."); + stage = 2; + break; + case 2: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + npc("Don't judge a book by its cover - judge it on its'", "grammar and punctuation."); + stage = 1; + break; + case 1: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 746 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/OttoGodblessedDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/OttoGodblessedDialogue.kt new file mode 100644 index 000000000..9911b3835 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/OttoGodblessedDialogue.kt @@ -0,0 +1,100 @@ +package core.game.content.dialogue + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable + +/** + * Represents the dialogue plugin used for Otto + * @author Splinter + * @version 1.0 + */ +@Initializable +class OttoGodblessedDialogue(player: Player? = null) : DialoguePlugin(player) { + + override fun newInstance(player: Player): DialoguePlugin { + return OttoGodblessedDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc("Good day, you seem a hearty warrior. Maybe even", "some barbarian blood in that body of yours?") + stage = -1 + return true + } + + override fun init() { + super.init() + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + -1 -> options("Ask about hastas","Ask about barbarian training").also { stage++ } + 0 -> when(buttonId){ + 1 -> player("Can you help me with Zamorakian weapons?").also { stage++ } + 2 -> player("Is there anything you can teach me?").also { stage = 20 } + } + 1 -> { + npc("Yes, I can convert a Zamorakian spear into a hasta.", "The spirits require me to request 300,000 coins from", "you for this service.") + stage = 2 + } + 2 -> { + interpreter.sendOptions("Select an Option", "Spear into hasta", "Hasta back to spear") + stage = 3 + } + 3 -> when (buttonId) { + 1 -> if (player.inventory.contains(11716, 1) && player.inventory.contains(995, 300000)) { + interpreter.sendOptions("Convert your spear?", "Yes", "No") + stage = 4 + } else { + player.sendMessage("You need a Zamorakian Spear and 300,000 coins to proceed.") + end() + } + 2 -> if (player.inventory.contains(14662, 1)) { + interpreter.sendOptions("Revert back to spear?", "Yes", "No") + stage = 5 + } else { + player.sendMessage("You need a Zamorakian Hasta to proceed.") + end() + } + } + 4 -> when (buttonId) { + 1 -> if (player.inventory.remove(Item(11716, 1), Item(995, 300000))) { + player.inventory.add(Item(14662)) + interpreter.sendItemMessage(14662, "Otto converts your spear into a hasta.") + stage = 6 + } else { + end() + } + 2 -> end() + } + 5 -> when (buttonId) { + 1 -> if (player.inventory.remove(Item(14662, 1))) { + player.inventory.add(Item(11716)) + interpreter.sendItemMessage(11716, "Otto converts your hasta back into a spear.") + stage = 6 + } else { + end() + } + 2 -> end() + } + 6 -> end() + + 20 -> npc("I can teach you how to fish.").also { stage++ } + 21 -> player("Oh, that's pretty underwhelming. But uhhh, okay!").also { stage++ } + 22 -> npc("Alright so here's what you gotta do:","You need to grab a pole and some bait, and then","fling it into the water!").also { stage++ } + 23 -> player("The whole pole?").also { stage++ } + 24 -> npc(FacialExpression.ANGRY, "No, not the whole pole!").also { stage++ } + 25 -> npc("Look, just... grab the pole under my bed","and go click on that fishing spot.").also { stage++ } + 26 -> player(FacialExpression.ASKING,"...click?").also { stage++ } + 27 -> npc(FacialExpression.FURIOUS, "JUST GO DO IT!").also { stage++; player.setAttribute("/save:barbtraining:fishing",true) } + 28 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(2725) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/OutpostSquireDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/OutpostSquireDialogue.java new file mode 100644 index 000000000..1ff67fdc2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/OutpostSquireDialogue.java @@ -0,0 +1,221 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the outpost squire dialogue. + * @author 'Vexia + */ +@Initializable +public final class OutpostSquireDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code OutpostSquireDialogue} {@code Object}. + */ + public OutpostSquireDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code OutpostSquireDialogue} {@code Object}. + * @param player tge player. + */ + public OutpostSquireDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new OutpostSquireDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hi, how can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Who are you?", "What is this place?", "I'm fine thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("What is this place?"); + stage = 20; + break; + case 3: + player("I'm fine thanks."); + stage = 30; + break; + } + break; + case 10: + npc("I'm a a Squire for the Void Knights."); + stage = 5; + break; + case 5: + player("The who?"); + stage = 6; + break; + case 6: + npc("The Void Knights, they are great warriors of balance", "who do Guthix's work here in 2009scape."); + stage = 11; + break; + case 11: + options("Wow, can I join?", "What kind of work?", "What's '2009scape'?", "Uh huh, sure."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("Wow, can I join?"); + stage = 180; + break; + case 2: + player("What kind of work?"); + stage = 17; + break; + case 3: + player("What's '2009scape'?"); + stage = 15; + break; + case 4: + player("Uh huh, sure."); + stage = 14; + break; + } + break; + case 14: + end(); + break; + case 15: + npc("It is the name that Guthix gave to this world, so we", "honour him with its use."); + stage = 16; + break; + case 16: + end(); + break; + case 17: + npc("Ah well you see we try to keep 2009scape as Guthix", "intended, it's very challenging. Actually we've been", "having some problems recently, maybe you could help", "us?"); + stage = 18; + break; + case 18: + options("Yeah ok, what's the problem?", "What's '2009scape'?", "I'd rather not, sorry."); + stage = 19; + break; + case 19: + switch (buttonId) { + case 1: + player("Yeah ok, what's the problem?"); + stage = 191; + break; + case 2: + player("What's '2009scape'?"); + stage = 15; + break; + case 3: + player("I'd rather not sorry."); + stage = 190; + break; + } + break; + case 180: + npc("Entry is strictly invite only, however we do need help", "continuing Guthix's work."); + stage = 181; + break; + case 181: + player("What kind of work?"); + stage = 17; + break; + case 190: + end(); + break; + case 191: + npc("Well the order has become quite diminished over the", "years, it's a very long process to learn the skills of a", "Void Knight. Recently there have been breaches into", "our realm from somewhere else, and strange creatures"); + stage = 192; + break; + case 192: + npc("have been pouring through. We can't let that happen,", "and we'd be very grateful if you'd help us."); + stage = 193; + break; + case 193: + options("How can I help?", "Sorry, but I can't."); + stage = 194; + break; + case 194: + switch (buttonId) { + case 1: + player("How can I help?"); + stage = 195; + break; + case 2: + player("Sorry, but I can't."); + stage = 190; + break; + } + break; + case 195: + npc("We send launchers from our outpost to the nearby", "islands. If you go and wait in the lander there that'd", "really help."); + stage = 196; + break; + case 196: + end(); + break; + case 20: + npc("This is our outpost. From here we send launchers out to", "the nearby islands to beat back the invaders."); + stage = 21; + break; + case 21: + options("What invaders?", "How can I help?", "Good luck with that."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + player("What invaders?"); + stage = 24; + break; + case 2: + player("How can I help?"); + stage = 195; + break; + case 3: + player("Good luck with that."); + stage = 23; + break; + } + break; + case 23: + end(); + break; + case 24: + npc("Recently there have been breaches into our realm from", "somewhere else, and strange creatures have been", "pouring through. We can't let that happen, and we'd be", "very grateful if you'd help us."); + stage = 193; + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3791, 3792, 3793, 3801 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PartyPeteDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/PartyPeteDialoguePlugin.java new file mode 100644 index 000000000..6c9fbb537 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PartyPeteDialoguePlugin.java @@ -0,0 +1,177 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the party pete dialogue. + * @author 'Vexia + */ +@Initializable +public class PartyPeteDialoguePlugin extends DialoguePlugin { + + /** + * The npc ids pertained to this dialogue. + */ + private int[] NPC_IDS = { 659 }; + + /** + * Constructs a new {@code partyPeteDialoguePlugin}. + */ + public PartyPeteDialoguePlugin() { + + } + + /** + * Constructs a new {@code partyPeteDialoguePlugin} {@code Object}. + * @param player the player. + */ + public PartyPeteDialoguePlugin(Player player) { + super(player); + } + + /** + * interpreter.sendDialogues(player, FacialExpression.NORMAL, ""); + * interpreter.sendDialogues(npc, FacialExpression.NORMAL, ""); + */ + + @Override + public int[] getIds() { + return NPC_IDS; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi! I'm, Party Pete. Welcome to the Party Room!"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "So, what's this room for?", "What's the big lever over there for?", "What's the gold chest for?", "I wanna party!", "Nothing."); + stage = 2; + break; + case 2: + switch (interfaceId) { + case 234: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So, what's this room for?"); + stage = 50; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's the big lever over there for?"); + stage = 55; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's the gold chest for?"); + stage = 61; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I wanna party!"); + stage = 65; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nothing."); + stage = 100; + break; + } + break; + } + break; + case 50: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This room is for partying the night away!"); + stage = 51; + break; + case 51: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How do you have a party in " + GameWorld.getSettings().getName() + "?"); + stage = 52; + break; + case 52: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Get a few mates round, get the beers in and have fun!"); + stage = 53; + break; + case 53: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Some players organise parties so kee an eye open!"); + stage = 54; + break; + case 54: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Woop! Thanks Pete!"); + stage = 100; + break; + case 55: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Simple. With the lever you can do some fun stuff."); + stage = 56; + break; + case 56: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What kind of stuff?"); + stage = 57; + break; + case 57: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A balloon drop costs 1000 gold. For this, you get 200", "balloons dropped across the whole of the party room. You", "canthen have fun popping the balloons!"); + stage = 58; + break; + case 58: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Any items in the Party Drop Chest will be put into balloons", "as soon as you pull the lever."); + stage = 59; + break; + case 59: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When the balloons are released, you can burst them to", "get at the items!"); + stage = 60; + break; + case 60: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "For 500 gold, you can summon the Party Room Knights,", "who will dance for your delight. Their singing isn't a", "delight, though."); + stage = 100; + break; + case 61: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Any items in the chest will be dropped inside the ballons", "when you pull the lever."); + stage = 62; + break; + case 62: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Cool! Sounds like a fun way to do a drop party."); + stage = 63; + break; + case 63: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Exactly!"); + stage = 64; + break; + case 64: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A word of warning, though. Any items that you put into", "the chest can't be taken out again, and it costs 1000 gold", "pieces for each drop party."); + stage = 100; + break; + case 65: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I've won the Dance Trophy at the Kandarin Ball three", "years in a trot!"); + stage = 66; + break; + case 66: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Show me your moves Pete!"); + stage = 67; + break; + case 67: + npc.animate(new Animation(784)); + end(); + break; + case 100: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PartyPeteDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PatchyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PatchyDialogue.java new file mode 100644 index 000000000..aaab1bcfc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PatchyDialogue.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialouge plugin used for the dward shop. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class PatchyDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DwarfShopDialogue} {@code Object}. + */ + public PatchyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DwarfShopDialogue} {@code Object}. + * @param player the player. + */ + public PatchyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PatchyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Aye, can I help ye at all?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes please, what are you selling?", "No thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4359 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PeksaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PeksaDialogue.java new file mode 100644 index 000000000..18abcbe4a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PeksaDialogue.java @@ -0,0 +1,80 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the plugin used for peksa. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class PeksaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code PeksaDialogue} {@code Object}. + */ + public PeksaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code PeksaDialogue} {@code Object}. + * @param player the player. + */ + public PeksaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PeksaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Are you interested in buying or selling a helmet?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I could be, yes.", "No, I'll pass on that."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, I'll pass on that."); + stage = 20; + break; + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, come back if you change your mind."); + stage = 21; + break; + case 21: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[] { 538 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PendaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PendaDialogue.java new file mode 100644 index 000000000..d0508bcd0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PendaDialogue.java @@ -0,0 +1,54 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the PendaDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class PendaDialogue extends DialoguePlugin { + + public PendaDialogue() { + + } + + public PendaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new PendaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The trolls are coming!"); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1087 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PetshopOwnerTaverly.java b/Server/src/main/java/Server/core/game/content/dialogue/PetshopOwnerTaverly.java new file mode 100644 index 000000000..4895dc09d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PetshopOwnerTaverly.java @@ -0,0 +1,207 @@ +package core.game.content.dialogue; + +import java.util.List; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.map.RegionManager; + +/** + * Represents the dialogue for the taverly pet shop owner. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class PetshopOwnerTaverly extends DialoguePlugin { + + /** + * Represents the dog name. + */ + private String dogName; + + /** + * Represents the puppy. + */ + private Item puppy; + + /** + * Constructs a new {@code PetshopOwnerTaverly} {@code Object}. + */ + public PetshopOwnerTaverly() { + /** + * emppty. + */ + } + + /** + * Constructs a new {@code PetshopOwnerTaverly} {@code Object}. + * @param player the player. + */ + public PetshopOwnerTaverly(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PetshopOwnerTaverly(player); + } + + @Override + public boolean open(Object... args) { + if (args.length > 1) { + List npcs = RegionManager.getLocalNpcs(player); + for (NPC n : npcs) { + if (n.getId() == 6893) { + npc = n; + break; + } + } + dogName = (String) args[0]; + puppy = (Item) args[1]; + player("No, the " + dogName + "."); + stage = 699; + return true; + } + npc = (NPC) args[0]; + interpreter.sendOptions("Choose an option:", "Can I see your shop, please?", "How much is that puppy in the window?", "So, what sorts of pets are available?"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I see your shop please?"); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How much is that puppy in the window?"); + stage = 200; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So, what sorts of pets are available?"); + stage = 300; + break; + } + break; + case 100: + end(); + npc.openShop(player); + break; + case 200: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The one with the waggly tail?"); + stage = 201; + break; + case 201: + end(); + player.getInterfaceManager().openChatbox(668); + stage = 202; + break; + case 202: + break; + case 300: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, here we sell dogs, but we also have supplies for any", "other creatures you might want to raise."); + stage = 301; + break; + case 301: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Such as?"); + stage = 302; + break; + case 302: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, we sell nuts. Those can be used to feed squirrels. If", "you want to capture a squirrel, you'll need to use the nuts", "on the trap you set, as the little scamps won't be fooled", "by anything else."); + stage = 303; + break; + case 303: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll bear that in mind."); + stage = 304; + break; + case 304: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There are also a number of fabulous and exotic lizards in", "Karmja. Some can be caught easily in a box trap, while", "other will need to be raised from an egg."); + stage = 305; + break; + case 305: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thank's alot! You've been very helpfull."); + stage = 306; + break; + case 306: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's always a pleasure to help a fellow animal-lover. Come", "back and visit soon."); + stage = 307; + break; + case 307: + end(); + break; + case 700: + player("Isn't that a little steep?"); + stage = 701; + break; + case 701: + npc("Well, if we gave them away for free then people would", "just buy them and dump them without a care."); + stage = 702; + break; + case 702: + npc("Dogs are a big responsibility and should be cared for."); + stage = 703; + break; + case 703: + npc("If a person in unwilling to invest 500 coins, then they", "don't deserve to have the puppy in the first place."); + stage = 704; + break; + case 704: + npc("So, do you still want one?"); + stage = 705; + break; + case 705: + options("Okay, I'll take the " + dogName + ".", "No thanks."); + stage = 706; + break; + case 706: + switch (buttonId) { + case 1: + player("Okay, I'll take the " + dogName + "."); + stage = 707; + break; + case 2: + end(); + break; + } + break; + case 707: + if (player.getInventory().freeSlots() == 0) { + npc("You don't have enough inventory space."); + stage = 708; + return true; + } + if (!player.getInventory().containsItem(new Item(995, 500))) { + end(); + return true; + } + if (player.getInventory().remove(new Item(995, 500))) { + player.getInventory().add(puppy); + npc("There you go! I hope you two get on."); + stage = 708; + } else { + player.getPacketDispatch().sendMessage("You don't the required coins in order to do this."); + end(); + } + break; + case 708: + end(); + break; + case 699: + npc("500 gold."); + stage = 700; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6893 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PhantuwtiFantstuwiFarSight.java b/Server/src/main/java/Server/core/game/content/dialogue/PhantuwtiFantstuwiFarSight.java new file mode 100644 index 000000000..f5fcd18ef --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PhantuwtiFantstuwiFarSight.java @@ -0,0 +1,101 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the PhantuwtiFantstuwiFarSight dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class PhantuwtiFantstuwiFarSight extends DialoguePlugin { + + /** + * Constructs a new {@code PhantuwtiFantstuwiFarSight} {@code Object}. + */ + public PhantuwtiFantstuwiFarSight() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code PhantuwtiFantstuwiFarSight} {@code Object}. + * @param player the player. + */ + public PhantuwtiFantstuwiFarSight(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PhantuwtiFantstuwiFarSight(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "Hello, what is this place?", "What do you do here?", "Do you have any quests?", "Ok, thanks."); + stage = 0; + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1798 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, what is this place?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do you do here?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you have any quests?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, thanks."); + stage = 40; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is Seers Village! We're an organisation of mystically", "gifted people with the power of foresight...we see things", "that have yet to come to pass."); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Hello, what is this place?", "What do you do here?", "Do you have any quests?", "Ok, thanks."); + stage = 0; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A lot of our time is spent adressing everyday sorts of", "things, plus we meditate a lot and ehhance our", "powers of mystical foresight."); + stage = 31; + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Unfortunately no, sorry, but if adventure is what you", "seek, try checking through your quest list!"); + stage = 31; + break; + case 31: + interpreter.sendOptions("Select an Option", "Hello, what is this place?", "What do you do here?", "Do you have any quests?", "Ok, thanks."); + stage = 0; + break; + case 40: + end(); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PhillipaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PhillipaDialogue.java new file mode 100644 index 000000000..0d95fa1b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PhillipaDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the PhillipaDialogue dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class PhillipaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code PhillipaDialogue} {@code Object}. + */ + public PhillipaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code PhillipaDialogue} {@code Object}. + * @param player the player. + */ + public PhillipaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PhillipaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, who are you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi, I'm Phillipa! Juliet's cousin? I like to keep an eye on", "her, make sure that dashing young Romeo doesn't just", "steal away from here under our plain old noses!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "He'd do it to you know... he's ever so dashing, and", "cavalier, in a wet blanket sort of way."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Romeo? Where would I find him then?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, that's a good question! Who knows where his", "head's at most of the time... in the clouds most likely!"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "But he's probably chasing the ladies who frequent", "Varrockk market. He does like a bit of kiss chase so I've", "heard!"); + stage = 5; + break; + case 5: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3325 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PhilopDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PhilopDialogue.java new file mode 100644 index 000000000..bc564055b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PhilopDialogue.java @@ -0,0 +1,72 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the PhilopDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class PhilopDialogue extends DialoguePlugin { + + public PhilopDialogue() { + + } + + public PhilopDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 782 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Gwwrr!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Err, hello there. What's that you have there?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Gwwwrrr! Dwa-gon Gwwwwrrrr!"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Enjoy playing with your dragon, then."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Gwwwrrr!"); + stage = 5; + break; + case 5: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new PhilopDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, what's your name?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PikkupstixDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PikkupstixDialogue.java new file mode 100644 index 000000000..5a11ddea7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PikkupstixDialogue.java @@ -0,0 +1,818 @@ +package core.game.content.dialogue; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the PikkupstixDialogue dialogue. + * @author Vexia + * @author Splinter + * @version 1.1 + * @notice Modified March 2nd, 2015 to allow the bulk buying of shards. + * @notice The previous notice is dubious + * @notice Spirit shard packs were released 9 September 2009, outside of 530. Option removed. + */ +@Initializable +public final class PikkupstixDialogue extends DialoguePlugin { + + /** + * Represents the summoning mastering items. + */ + private static final Item[] ITEMS = new Item[] { new Item(12169), new Item(12170), new Item(12171) }; + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 99000); + + /** + * Represents the wolf bones item. + */ + private static final Item BONES = new Item(2859, 2); + + /** + * Represents the wolf items. + */ + private static final Item[] WOLF_ITEMS = new Item[] { new Item(12158, 2), new Item(12155, 2), new Item(12183, 14), new Item(12528) }; + + /** + * Represents the howl scroll item. + */ + private static final Item HOWL_SCROLL = new Item(12425); + + /** + * Represents the wolf pouch. + */ + private static final Item WOLF_POUCH = new Item(12047); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code PikkupstixDialogue} {@code Object}. + */ + public PikkupstixDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code PikkupstixDialogue} {@code Object}. + * @param player the player. + */ + public PikkupstixDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PikkupstixDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Wolf Whistle"); + switch (quest.getStage(player)) { + case 0: + npc("You there! What are you doing here, as if I didn't have", "enough troubles?"); + break; + case 10: + npc("Have you met the monster upstairs?"); + stage = 0; + break; + case 20: + player("The teeth!"); + stage = 0; + break; + case 30: + if (!player.getInventory().containsItem(BONES)) { + npc("You need to bring two lots of wolf bones. I can provide", "the other items you will need."); + stage = 0; + } else { + player("I have the wolf bones right here."); + stage = 1; + } + break; + case 40: + if (player.getInventory().containsItem(WOLF_POUCH) && player.getInventory().containsItem(HOWL_SCROLL)) { + player("Here is the pouch and scroll."); + stage = 1; + return true; + } + if (!player.getInventory().contains(12528, 1) && !player.getBank().contains(12528, 1) && !player.getAttribute("has-key", false)) { + player.getInventory().add(new Item(12528, 1), player); + } + if (!player.getInventory().containsItem(WOLF_POUCH) || !player.getInventory().containsItem(HOWL_SCROLL)) { + npc("You need to bring me a wolf pouch and a howl scroll."); + stage = 0; + } + break; + case 50: + if (!player.getInventory().containsItem(WOLF_POUCH) || !player.getInventory().containsItem(HOWL_SCROLL)) { + for (Item i : WOLF_ITEMS) { + if (i.getId() == 12183) { + continue; + } + if (!player.getInventory().containsItem(i) && !player.getBank().containsItem(i) && player.getAttribute("taken-summoning-supplies") == null) { + if (i.getId() == 12528 && player.getConfigManager().get(1178) == (2 << 11)) { + continue; + } + player.setAttribute("taken-summoning-supplies", true); + player.getInventory().add(i, player); + } + } + } + npc("Hurry up! Go remove the wolpertinger at last!"); + break; + case 60: + if (player.getSkills().getLevel(Skills.SUMMONING) < player.getSkills().getStaticLevel(Skills.SUMMONING)) { + npc("So, how did it go?"); + } else if (player.getSkills().getLevel(Skills.SUMMONING) >= player.getSkills().getStaticLevel(Skills.SUMMONING)) { + npc("Feeling refreshed?"); + stage = 20; + } + break; + case 100: + npc("Welcome to my humble abode. How can I help", "you?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 0: + switch (stage) { + case 0: + player("I'm just a passing adventurer. Who are you?"); + stage = 1; + break; + case 1: + npc("Who am I? My dear boy, I just so happen to be one", "of the most important druids in this village!"); + stage = 2; + break; + case 2: + player("Wow, I don't meet that many celebrities."); + stage = 3; + break; + case 3: + player("What do you do here?"); + stage = 4; + break; + case 4: + npc("Well, firstly, I-"); + stage = 5; + break; + case 5: + interpreter.sendDialogue("There is a loud crash from upstairs, followed by the tinkling of", "broken glass."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(getIds()[0], FacialExpression.FURIOUS, "Confound you, lapine menace!"); + stage = 7; + break; + case 7: + player("What was that?"); + stage = 8; + break; + case 8: + npc("That was the sound of my carefully arranged room", "being destroyed by a fluffy typhoon of wickedness!"); + stage = 9; + break; + case 9: + player("What?"); + stage = 10; + break; + case 10: + player("Wait, I'm good with monsters. Do you want me to go", "kill it for you?"); + stage = 11; + break; + case 11: + npc("Well, yes, but it's a little more complicated than that."); + stage = 12; + break; + case 12: + player("How complicated can it be?"); + stage = 13; + break; + case 13: + interpreter.sendDialogue("A resounding crash comes from upstairs."); + stage = 14; + break; + case 14: + npc("Complicated enough for me to waste time explaining it", "to you."); + stage = 15; + break; + case 15: + npc("Tell me, have you ever heard of Summoning?"); + stage = 16; + break; + case 16: + player("Not really."); + stage = 17; + break; + case 17: + npc("Well, some of the concepts I am about to discuss might", "go over your head, so I'll stick to the basics."); + stage = 18; + break; + case 18: + interpreter.sendDialogue("There is a series of loud crunches from upstairs."); + stage = 19; + break; + case 19: + interpreter.sendDialogues(getIds()[0], FacialExpression.FURIOUS, "Gah! That better not be my wardrobe!"); + stage = 20; + break; + case 20: + npc("Summoners are able to call upon animal familiars for a", "number of uses. These familiars can help the summoner", "practice their skills, fight on the battlefield, or offer any", "number of other benefits."); + stage = 21; + break; + case 21: + npc("Beneath this house is a monument - an obelisk - that", "allows us druids to trap this Summoning power."); + stage = 22; + break; + case 22: + interpreter.sendDialogue("A loud gnawing begins upstairs."); + stage = 23; + break; + case 23: + npc("I chased it upstairs, but I didn't have the necessary", "Summoning pouch to banish it."); + stage = 24; + break; + case 24: + npc("I sent my assistant, Stikklebrix, out to bring me what I", "needed, but he was not returned."); + stage = 25; + break; + case 25: + npc("If I leave this house, it will come down here, potentially", "even getting to the obelisk. If that happens, it could call", "another familiar through and multiply."); + stage = 26; + break; + case 26: + interpreter.sendDialogue("The gnawing stops. There is a crash."); + stage = 27; + break; + case 27: + player("How fast can it multiply?"); + stage = 28; + break; + case 28: + npc("Like a rabbit, because it is-"); + stage = 29; + break; + case 29: + player("A rabbit!"); + stage = 30; + break; + case 30: + npc("Well yes, rabbit-like, but-"); + stage = 31; + break; + case 31: + player("Oh, don't worry, I'll deal with this myself. One rabbit", "stew coming right up."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(getIds()[0], FacialExpression.FURIOUS, "Very well, young fool. You go see how well you do", "against it."); + stage = 33; + break; + case 33: + end(); + quest.start(player); + break; + } + break; + case 10: + switch (stage) { + case 0: + player("No, not yet."); + stage = 1; + break; + case 1: + npc("What are you waiting for? I need to get", "that monster out of my room."); + stage = 2; + break; + case 2: + player("Sorry, I'll go right now."); + stage = 3; + break; + case 3: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + npc("So, you finally saw what you're against, eh? Not as", "harmless as you assumed, I take it?"); + stage = 1; + break; + case 1: + player("Horns! Teeth!"); + stage = 2; + break; + case 2: + npc("Are you prepared to treat this situation with the gravity", "it deserves, now?"); + stage = 3; + break; + case 3: + player("What IS it?"); + stage = 4; + break; + case 4: + npc("A wolpertinger, and a pretty big one at that."); + stage = 5; + break; + case 5: + npc("They are spirits that tend to be on the energetic and", "destructive side when they manifest here, but are a little", "less violent on the spiritual plane."); + stage = 6; + break; + case 6: + player("So, what can be done about it? Can't you banish it?"); + stage = 7; + break; + case 7: + npc("Well, I could, but in order to do so, I'd need a spirit", "wolf pouch."); + stage = 8; + break; + case 8: + npc("Wolpertingers are generally afraid of wolves; that's the", "rabbity-side of them. A spirit wolf will scare it and banish", "it."); + stage = 9; + break; + case 9: + npc("The problem is that I don't have any of the necessary", "spirit wolf pouches, and the only thing keeping the giant", "wolpertingers upstairs is my presence. If I were to leave,", "it would amble downstairs to bring more of its kind."); + stage = 10; + break; + case 10: + npc("thought, as I said before."); + stage = 11; + break; + case 11: + player("Well, what if I were to bring you the elements you", "needed? Would that work?"); + stage = 12; + break; + case 12: + npc("Not really; I would need to go down to the obelisk in", "my cellar and use the necessary ingredients to make a", "spirit wolf pouch and some Howl scrolls, but it may slip", "out of the front door."); + stage = 13; + break; + case 13: + npc("You could infuse the pouch yourself, though. Would", "you like to learn the secrets of Summoning? I can", "sense the spark within you, urging you to master the", "art."); + stage = 14; + break; + case 14: + player("Certainly!"); + stage = 15; + break; + case 15: + player("What do you need me to bring?"); + stage = 16; + break; + case 16: + npc("That's wonderful!"); + stage = 17; + break; + case 17: + npc("You need to bring two lots of wolf bones. I can provide", "the other items you will need."); + stage = 18; + break; + case 18: + player("I'll get right on it."); + stage = 19; + break; + case 19: + end(); + quest.setStage(player, 30); + break; + } + break; + case 30: + switch (stage) { + case 0: + end(); + break; + case 1: + npc("Splendid, dear boy."); + stage = 2; + break; + case 2: + quest.setStage(player, 40); + for (Item i : WOLF_ITEMS) { + player.getInventory().add(i, player); + } + npc("Here are the pouches, spirit shards and charms you will", "need to make the spirit wolf pouch and Howl scrolls.", "This key is to the trapdoor over there, which leads to", "the obelisk."); + stage = 20; + break; + } + break; + case 40: + switch (stage) { + case 0: + end(); + break; + case 1: + npc("Wonderful! Now, all you have to do is go upstairs and", "summon the spirit wolf, then the Howl effect."); + stage = 2; + break; + case 2: + player("That's it?"); + stage = 3; + break; + case 3: + npc("It's that simple. The spirit wolf will, when you use the", "Howl scroll, chase away the giant wolpertinger and then", "disappear. Under normal circumstances, the spirit wolf", "would follow you around, defend you in combat and"); + stage = 4; + break; + case 4: + npc("often lend you its powers."); + stage = 5; + break; + case 5: + player("What sort of powers?"); + stage = 6; + break; + case 6: + npc("Well, for a start, it has the ability to perform a", "Summoning scroll that forces the oppnents to flee. That is", "what it will use on the giant wolpertinger, with the", "difference being that the giant wolpertinger will be so"); + stage = 7; + break; + case 7: + npc("scared that it will retreat to its spiritual plane, rather", "than face the spirit wolf."); + stage = 8; + break; + case 8: + player("Great! So, how will I make it perform that Summoning", "scroll?"); + stage = 9; + break; + case 9: + npc("All you need to do is use the special move button in", "your Summoning interface, and aim it at the giant", "wolpertinger, once the spirit wolf has been summoned.", "The spirit wolf will then perform its special ability."); + stage = 10; + break; + case 10: + player("What a relief!"); + stage = 11; + break; + case 11: + npc("Well, I think that I have talked enough. Now you have", "to put it into practice."); + stage = 12; + break; + case 12: + player("Wish me luck!"); + stage = 13; + break; + case 13: + quest.setStage(player, 50); + end(); + break; + case 20: + player("What are these things?"); + stage = 21; + break; + case 21: + npc("Well, the wolf bones, spirit shards and gold charms are", "all ingredients to go into the pouch."); + stage = 22; + break; + case 22: + npc("The wolf bones give a solidity to the spirit, the charm", "attracts the type of familiar that you desire - in this", "case a gold charm - and that shards are the spirit's", "focus."); + stage = 23; + break; + case 23: + npc("You will first need to make two Summoning pouches:", "one that can be used to summon the spirit wolf, and", "another to tear open at the obelisk, creating some Howl", "scrolls. These Howl scrolls will help make the spirit wolf"); + stage = 24; + break; + case 24: + npc("perform a fear-inducing Howl special move."); + stage = 25; + break; + case 25: + player("Okay, I think I understood that. So, how do I get the", "obelisk to work?"); + stage = 26; + break; + case 26: + npc("Well, you stand before the obelisk with the charms,", "pouches, shards and bones necessary to complete two", "Summoning pouches. You should then 'use' your empty", "pouch on the obelisk. Your ingredients will be added to"); + stage = 27; + break; + case 27: + npc("the pouch, mixing with the spirits of a familiar to create a", "spirit wolf pouch."); + stage = 28; + break; + case 28: + npc("Creating a scroll is a similar process. By using a", "Summoning pouch on an obelisk and breaking it open,", "you are allowing the spirit energy to transform into a", "different form - some scrolls."); + stage = 29; + break; + case 29: + npc("Once you have a spirit wolf pouch and some Howl", "scrolls, you can come upstairs to see me, to find out", "what must be done with the giant wolpertinger."); + stage = 30; + break; + case 30: + player("It all sounds simple enough."); + stage = 31; + break; + case 31: + end(); + break; + } + break; + case 50: + end(); + break; + case 60: + switch (stage) { + case 0: + player("The spirit wolf scared it away!"); + stage = 1; + break; + case 1: + npc("My dear boy, you've done it!"); + stage = 2; + break; + case 2: + npc("I just hope the damage to my room isn't too bad."); + stage = 3; + break; + case 3: + player("All in a day's..."); + stage = 4; + break; + case 4: + player("Woah, I feel a little dizzy."); + stage = 5; + break; + case 5: + npc("Well, that Summoning was a drain on your rather", "untrained reserves."); + stage = 6; + break; + case 6: + npc("Go downstairs to the obelisk, as it will renew your", "energy."); + stage = 7; + break; + case 7: + npc("You should do that immediately - you'll be cut off from", "Summoning while you have no Summoning skill points", "remaining."); + stage = 8; + break; + case 8: + player("Woooooah..."); + stage = 9; + break; + case 9: + npc("You really need to renew your Summoning skill points", "at the obelisk, " + player.getUsername() + "."); + stage = 10; + break; + case 10: + end(); + break; + case 20: + player("Yeah, that does feel a lot better!"); + stage = 21; + break; + case 21: + player("Won't my energy renew on its own?"); + stage = 22; + break; + case 22: + npc("Not really. Your Summoning skill points need to be", "renewed at the obelisks or mini obelisks scattered", "around the world, while your special move bar will", "recharge slowly over time."); + stage = 23; + break; + case 23: + npc("The special move bar is like your special attack bar, not", "only because it is useful when attacking, but because it", "recharges slowly overtime."); + stage = 24; + break; + case 24: + npc("To help you on your way, I can tell you that I know", "of two other obelisks you can use."); + stage = 25; + break; + case 25: + npc("One is guarded by the ogres in Gu'Tanoth, and the", "other is on the coast near Brimhaven. There will be", "others, however."); + stage = 26; + break; + case 26: + player("Thanks for the information."); + stage = 27; + break; + case 27: + npc("My dear boy, it was nothing."); + stage = 28; + break; + case 28: + npc("Well, from your actions, you have proved yourself", "worthy to learn the secrets of Summoning."); + stage = 29; + break; + case 29: + npc("Speak to me on the subject if you wish to learn more", "about it. In the meantime, I will use my power to grant", "you access to the skill."); + stage = 30; + break; + case 30: + npc("Here is a little something to help you start your", "Summoning training."); + stage = 31; + break; + case 31: + player("Thanks!"); + stage = 32; + break; + case 32: + end(); + quest.finish(player); + break; + } + break; + case 100: + switch (stage) { + case 0: + if (player.getSkills().getStaticLevel(Skills.SUMMONING) == 99) { + options("So, what's Summmoning all about, then?", "Can I buy some Summoning supplies?", "Can I buy a Summoning skillcape?"); + stage = 600; + } else { + options("So, what's Summmoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes."); + stage = 1; + } + break; + case 1: + switch (buttonId) { + case 1: + player("So, what's summoning all about, then?"); + stage = 10; + break; + case 2: + player("Can I buy some summoning supplies, please?"); + stage = 34; + break; + case 3: + player("Please tell me about skillcapes."); + stage = 400; + break; + } + break; + case 10: + npc("In general? Or did you have a specific topic in mind?"); + stage = 11; + break; + case 11: + options("In general.", "Tell me about summoning familiars.", "Tell me about special moves.", "Tell me about pets."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + npc("Well, you already know about Summoning in general;", "otherwise, we would not be having this conversation!"); + stage = 100; + break; + case 2: + npc("Summoned familiars are at the very core of Summoning.", "Each familiar is different, and the more powerful the", "summoner, the more powerful the familiar they can", "summon."); + stage = 20001; + break; + case 3: + npc("Well, if a Summoning pouch is split apart at an obelisk,", "then the energy it contained will reconstitute itself -", "transform - into a scroll. This scroll can then be used to", "make your familiar perform its special move."); + stage = 2001; + break; + case 4: + npc("Well, these are not really an element of the skill, as such,", "but more like a side-effect of training."); + stage = 2001; + break; + + } + break; + case 100: + npc("Effectively, the skill can be broken into two main parts:", "summoned familiars, and pets."); + stage = 101; + break; + case 101: + npc("Summoned familiars are spiritual animals that can be", "called to you from the spirit plane, to serve you for a", "period of time."); + stage = 102; + break; + case 102: + npc("These animals can also perform a special move, wich is", "specific to the species. For example, a spirit wolf can", "perform the Howl special move if you are holding the", "correct Howl scroll."); + stage = 103; + break; + case 103: + npc("The last part of Summoning: the pets. The more", "you practice the skill, the more you will comprehend the", "natural world around you."); + stage = 104; + break; + case 104: + npc("This is reflected in your increased ability to raise animals", "as pets. It takes a skilled summoner to be able to raise", "some of 2009scape's more exotic animals, such as the lizards", "of Karamja, or even dragons!"); + stage = 105; + break; + case 105: + npc("Now that I've given you this overview, do you want to", "know about anything specific?"); + stage = 106; + break; + case 106: + options("Tell me about summoning familiars.", "Tell me about special moves.", "Tell me about pets."); + stage = 107; + break; + case 107: + switch (buttonId) { + case 1: + npc("Summoned familiars are at the very core of Summoning.", "Each familiar is different, and the more powerful the", "summoner, the more powerful the familiar they can", "summon."); + stage = 20001; + break; + case 2: + npc("Well, if a Summoning pouch is split apart at an obelisk,", "then the energy it contained will reconstitute itself -", "transform - into a scroll. This scroll can then be used to", "make your familiar perform its special move."); + stage = 2001; + break; + case 3: + npc("Well, these are not really an element of the skill, as such,", "but more like a side-effect of training."); + stage = 2001; + break; + } + break; + case 2001: + end(); + break; + case 2000: + npc("Summoned familiars are at the very core of Summoning.", "Each familiar is different, and the more powerful the", "summoner, the more powerful the familiar they can", "summon."); + stage = 20001; + break; + case 20001: + end(); + break; + case 34: + npc("If you like! It's good to see you training."); + stage = 35; + break; + case 35: + end(); + npc.openShop(player); + break; + case 400: + npc("Of course. Skillcapes are a symbol of achievement. Only", "people who have mastered a skill and reached level 99 can", "get their hands on them and gain the benefits they carry.", "Is there something else I can help you with perhaps?"); + stage = 401; + break; + case 401: + interpreter.sendOptions("Choose an option:", "So, what's Summmoning all about, then?", "Can I buy some Summoning supplies?", "Please tell me about skillcapes."); + stage = 1; + break; + case 600: + switch (buttonId) { + case 1: + player("So, what's summoning all about, then?"); + stage = 10; + break; + case 2: + player("Can I buy some summoning supplies, please?"); + stage = 34; + break; + case 3: + player("Can I buy a Skillcape of Summoning?"); + stage = 599; + break; + } + break; + case 599: + npc("Why yes you can! I must warn you that they cost", "a total of 99000 coins. Do you wish to still", "buy a skillcape of Summoning?"); + stage = 601; + break; + case 601: + options("Yes.", "No."); + stage = 602; + break; + case 602: + switch (buttonId) { + case 1: + player("Yes, please."); + stage = 603; + break; + case 2: + end(); + break; + } + break; + case 603: + if (player.getInventory().freeSlots() < 2) { + player("Sorry, I don't seem to have enough inventory space."); + stage = 604; + return true; + } + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (!player.getInventory().remove(COINS)) { + player("Sorry, I don't seem to have enough coins", "with me at this time."); + stage = 604; + return true; + } + if (player.getInventory().add(ITEMS[player.getSkills().getMasteredSkills() > 1 ? 1 : 0], ITEMS[2])) { + player("There you go, enjoy!"); + stage = 604; + } + break; + case 604: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6971 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PirateJackieDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PirateJackieDialogue.java new file mode 100644 index 000000000..646595681 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PirateJackieDialogue.java @@ -0,0 +1,230 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for pirate jackie. + * @author Vexia + */ +@Initializable +public final class PirateJackieDialogue extends DialoguePlugin { + + /** + * Represents the interface component. + */ + private static final Component COMPONENT = new Component(6); + + /** + * The achievement diary. + */ + private AchievementDiary diary; + + /** + * Constructs a new {@code PirateJackieDialogue} {@code Object}. + */ + public PirateJackieDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code PirateJackieDialogue} {@code Object}. + * @param player the player. + */ + public PirateJackieDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PirateJackieDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ahoy there!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahoy!"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "What is this place?", "What do you do?", "I'd like to trade in my tickets, please.", "I have a question about my Achievement Diary.", "See you later."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is this place?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do you do?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like to trade in my tickets, please."); + stage = 30; + break; + case 4: + player("I have a question about my Achievement Diary."); + stage = 41; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "See you later."); + stage = 50; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to the Brimhaven Agility Arena!"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If ye want to know more talk to Cap'n Izzy, he found", "it!"); + stage = 12; + break; + case 12: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I be the Jack o' tickets. I exchange the tickets ye", "collect in the Agility Arena for more stuff. Ye can", "obtain more agility experience or some items ye won't", "find anywhere else!"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sounds good!"); + stage = 22; + break; + case 22: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Aye, ye be on the right track."); + stage = 31; + break; + case 31: + end(); + player.getInterfaceManager().open(COMPONENT); + break; + case 41: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); + } + if (diary.isComplete(0) && !diary.isLevelRewarded(0)) { + player("I've done all the easy tasks in my Karamja Achievement", "Diary."); + stage = 440; + break; + } + if (diary.isLevelRewarded(0) && diary.isComplete(0) && !player.hasItem(diary.getType().getRewards(0)[0])) { + player("I've seemed to have lost my gloves.."); + stage = 450; + break; + } + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage++; + break; + case 42: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA); + } + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 410; + break; + case 2: + player("What are the rewards?"); + stage = 420; + break; + case 3: + player("How do I claim the rewards?"); + stage = 430; + break; + case 4: + end(); + break; + } + break; + case 440: + npc("Arr, ye have that, I see yer list. I s'pose ye'll be wanting", "yer reward then!"); + stage++; + break; + case 441: + player("Yes please."); + stage++; + break; + case 442: + diary.setLevelRewarded(0); + for (Item i : diary.getType().getRewards(0)) { + player.getInventory().add(i, player); + } + npc("These 'ere Karamja gloves be a symbol of yer explorin'", "on the island. All the merchants will recognise 'em when", "yer wear 'em and mabe give ye a little discount. I'll", "ave a word with some of the seafarin' folk who sail to"); + stage++; + break; + case 443: + npc("Port Sarim and Ardougne, so they'll take ye on board", "half price if year wearin' them. Arrr, take this lamp I", "found washed ashore too."); + stage++; + break; + case 444: + player("Wow, thanks!"); + stage = 41; + break; + case 450: + player.getInventory().add(diary.getType().getRewards(0)[0], player); + npc("Arr matey, have another pair. Ye better be more", "careful this time."); + stage = 41; + break; + case 410: + npc("It's a diary that helps you keep track of particular", "achievements. Here on Karamja it can help you", "discover some quite useful things. Eventually, with", "enough exploration, the people of Karamja will reward"); + stage++; + break; + case 411: + npc("you."); + stage++; + break; + case 412: + npc("You can see what tasks you have listed by clicking on", "the green button in the Quest List."); + stage = 41; + break; + case 420: + npc("Well, there's three different pairs of Karamja gloves,", "which match up with the three levels of difficulty. Each", "has the same rewards as the previous level, and an", "additional one too... but I won't spoil your surprise."); + stage++; + break; + case 421: + npc("Rest assured, the people of Karamja are happy to see", "you visiting the island."); + stage = 41; + break; + case 430: + npc("Just complete the tasks so they're all ticked off, then", "you can claim yer reward. Most of them are", "straightforward; you might find some require quests to", "be started, if not finished."); + stage++; + break; + case 431: + npc("To claim the different Karamja gloves, speak to Kaleb", "Paramaya in Shilo Village, one of the jungle foresters", "near the Kharazi Jungle, or me."); + stage = 41; + break; + case 50: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1055 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PortSarimBartenderDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PortSarimBartenderDialogue.java new file mode 100644 index 000000000..e3ff6b50b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PortSarimBartenderDialogue.java @@ -0,0 +1,99 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the PortSarimBartenderDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class PortSarimBartenderDialogue extends DialoguePlugin { + + public PortSarimBartenderDialogue() { + + } + + public PortSarimBartenderDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 734 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there!"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Choose an option:", "Could I buy a beer, please.", "Bye, then."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Could I buy a beer, please?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Bye, then."); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Sure, that will be two gold coins, please."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, here you go."); + stage = 12; + break; + case 12: + if (player.getInventory().contains(995, 2)) { + interpreter.sendDialogue("You buy a pint of beer."); + player.getInventory().remove(new Item(995, 2)); + player.getInventory().add(new Item(1917, 1)); + stage = 13; + } else { + player.getPacketDispatch().sendMessage("You need 2 gold coins to buy beer."); + end(); + } + break; + case 13: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Come back soon!"); + stage = 21; + break; + case 21: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new PortSarimBartenderDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Good day to you!"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PortSarimBrianDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PortSarimBrianDialogue.java new file mode 100644 index 000000000..8c901d24f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PortSarimBrianDialogue.java @@ -0,0 +1,74 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the PortSarimBrianDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class PortSarimBrianDialogue extends DialoguePlugin { + + public PortSarimBrianDialogue() { + + } + + public PortSarimBrianDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 559 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So, are you selling something?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "'Ello."); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yep, take a look at these great axes."); + stage = 11; + break; + case 11: + end(); + npc.openShop(player); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "'Ello."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new PortSarimBrianDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "So, are you selling something?", "'Ello."); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PoxDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PoxDialogue.java new file mode 100644 index 000000000..2d88120ec --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PoxDialogue.java @@ -0,0 +1,56 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the PoxDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class PoxDialogue extends DialoguePlugin { + + public PoxDialogue() { + + } + + public PoxDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 2943 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Miaooow!"); + stage = 1; + break; + case 1: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new PoxDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi cat!"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PrayerTutorDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PrayerTutorDialogue.java new file mode 100644 index 000000000..1c11daecc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PrayerTutorDialogue.java @@ -0,0 +1,117 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the PrayerTutorDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class PrayerTutorDialogue extends DialoguePlugin { + + public PrayerTutorDialogue() { + + } + + public PrayerTutorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new PrayerTutorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendOptions("Select an Option", "I already know about the basic prayers, got any tips?", "Tell me about different bones.", "Goodbye."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I already know about the basic prayers, got any tips?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about different bones."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Goodbye."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "For you " + player.getUsername() + "? Always. There are many", "advantages to using the protection prayers when", "fighting the more dangerous foes. You can protect", "yourself from magic, melee or ranged attacks with these"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "useful prayers."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A good prayer to have when venturing into the", "wilderness is protect item. This will protect one of your", "items if you should die there."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Remember though that venturing into the wilderness is", "a risky business, store your items in a bank before you", "go there so that you don't lose them."); + stage = 14; + break; + case 14: + interpreter.sendOptions("Select an Option", "I already know about the basic prayers, got any tips?", "Tell me about different bones.", "Goodbye."); + stage = 0; + break; + case 20: + interpreter.sendOptions("Select an Option", "Basic Bones", "Big Bones", "Babydragon Bones", "Goodbye."); + stage = 21; + break; + case 21: + switch (buttonId) { + case 1: + interpreter.sendItemMessage(526, "Basic bones are left by many creatures such as goblins, monkeys and that sort of thing. They won't get you much when you burry them, but if you do it every time you come across them, it all adds up!"); + stage = 20; + break; + case 2: + interpreter.sendItemMessage(532, "Big bones you can get by killing things like ogres and giants, them being big things and all. They're quite a good boost for your prayer if you are up to fighting the big boys."); + stage = 220; + break; + case 3: + interpreter.sendItemMessage(536, "If you're feeling adventurous and up to tackling baby dragons, you can get these Baby Dragon bones which are even better than big bones."); + stage = 20; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Goodbye."); + stage = 40; + break; + } + break; + case 220: + interpreter.sendItemMessage(532, "You can probably find them in caves and such dark dank places."); + stage = 20; + break; + case 40: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4903 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PrinceAliDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PrinceAliDialogue.java new file mode 100644 index 000000000..4c43d3985 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PrinceAliDialogue.java @@ -0,0 +1,147 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.plugin.Initializable; +import core.game.world.GameWorld; + +/** + * Represents the dialogue used to handle the Pricne Ali NPC. + * @author 'Vexia + * @date 1/14/1/ + */ +@Initializable +public class PrinceAliDialogue extends DialoguePlugin { + + /** + * Represents the array of disguised items. + */ + private static final Item[] DISGUISE = new Item[] { new Item(2424), new Item(2419), new Item(2418), new Item(1013) }; + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code PrinceAliDialogue} {@code Object}. + */ + public PrinceAliDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code PrinceAliDialogue} {@code Object}. + * @param player the player. + */ + public PrinceAliDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PrinceAliDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + switch (quest.getStage(player)) { + case 50: + interpreter.sendDialogues(player, null, "Prince, I come to rescue you."); + stage = 0; + break; + case 60: + case 100: + interpreter.sendDialogues(npc, null, "I owe you my life for that escape. You cannot help me", "this time, they know who you are. Go in peace, friend", "of Al-Kharid"); + stage = 100; + break; + default: + end(); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 100: + end(); + break; + case 0: + interpreter.sendDialogues(npc, null, "That is very kind of you, how do I get out?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, null, "With a dusiguise. I have removed the Lady Keli. she is", "tied up, but will not stay tied up for long."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, null, "Take this disguise, and this key."); + stage = 3; + break; + case 3: + for (Item i : DISGUISE) { + if (!player.getInventory().containsItem(i)) { + player.getPacketDispatch().sendMessage("You don't have all the parts of the disguise."); + end(); + return true; + } + } + if (player.getInventory().remove(DISGUISE)) { + interpreter.sendDialogue("You hand the disguise and the key to the prince."); + stage = 4; + quest.setStage(player, 60); + player.removeAttribute("guard-drunk"); + player.getGameAttributes().removeAttribute("guard-drunk"); + } + break; + case 4: + // NPC 921 start dialogue.921 + npc.transform(921); + GameWorld.getPulser().submit(new Pulse(50) { + @Override + public boolean pulse() { + npc.transform(920); + return true; + } + }); + interpreter.sendDialogues(npc, null, "Thank you my friend, I must leave you now. My", "father will pay you well for this."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, null, "Go to Leela, she is close to here."); + stage = 6; + break; + case 6: + npc.setInvisible(true); + GameWorld.getPulser().submit(new Pulse(20) { + @Override + public boolean pulse() { + npc.transform(920); + npc.setInvisible(false); + return true; + } + }); + interpreter.sendDialogue("The prince has escaped, well done! You are now a friend of Al-", "Kharid and may pass through the Al-Kharid toll gate for free."); + stage = 7; + break; + case 7: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 920 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/PrinceBlackDragonDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/PrinceBlackDragonDialogue.java new file mode 100644 index 000000000..59fbd9b35 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/PrinceBlackDragonDialogue.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Dialogue for the boss pet, KBD JR + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class PrinceBlackDragonDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + */ + public PrinceBlackDragonDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + * @param player the player. + */ + public PrinceBlackDragonDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PrinceBlackDragonDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Shouldn't a prince only have two heads?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Why is that?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, a standard Black dragon has one,", "the King has three so inbetween must have two?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "You're overthinking this."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8596 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ProfessorOddensteinPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/ProfessorOddensteinPlugin.java new file mode 100644 index 000000000..afcd2d622 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ProfessorOddensteinPlugin.java @@ -0,0 +1,307 @@ +package core.game.content.dialogue; + +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the plugin dialogue to handle the interaction with professor + * oddenstein. + * @author 'Vexia + */ +@Initializable +public class ProfessorOddensteinPlugin extends DialoguePlugin { + + /** + * Represents the oil can item. + */ + private static final Item OIL_CAN = new Item(277); + + /** + * Represents the pressure guage item. + */ + private static final Item PRESSURE_GAUGE = new Item(271); + + /** + * Represents the rubber tube item. + */ + private static final Item RUBBER_TUBE = new Item(276); + + /** + * Represents the animation for professor to use. + */ + private static final Animation ANIMATION = new Animation(832); + + /** + * Represents the face location. + */ + private static final Location FACE_LOCATION = Location.create(3112, 3367, 2); + + /** + * The start graphic for spell. + */ + private static final Graphics WEAKEN_START = new Graphics(105, 96); + + /** + * The end graphic for the spell. + */ + private static final Graphics WEAKEN_END = new Graphics(107, 96); + + /** + * Constructs a new {@code ProfessorOddensteinPlugin} {@code Object}. + */ + public ProfessorOddensteinPlugin() { + + } + + /** + * Constructs a new {@code ProfessorOddensteinPlugin} {@code Object}. + * @param player the player. + */ + public ProfessorOddensteinPlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ProfessorOddensteinPlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + final Quest quest = player.getQuestRepository().getQuest("Ernest the Chicken"); + switch (quest.getStage(player)) { + case 0: + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Be careful in here, there's lots of dangerous equipment."); + stage = 0; + break; + case 20: + interpreter.sendDialogues(npc, null, "Have you found everything yet?"); + stage = 0; + break; + case 100: + interpreter.sendOptions("Select an Option", "What does this machine do?", "Is this your house?"); + stage = 1; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Ernest the Chicken"); + switch (quest.getStage(player)) { + case 0: + case 100: + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What does this machine do?", "Is this your house?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What does this machine do?"); + stage = 11; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Is this your house?"); + stage = 20; + break; + } + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nothing at the moment... It's broken. It's meant to be", "a transmutation machine."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It as also spent time as a time travel machine, and a", "dramatic light generator, and a thing for generating", "monsters."); + stage = 13; + break; + case 13: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, I'm just one of the tenants. It belongs to the count", "who lives in the basement."); + stage = 21; + break; + case 21: + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I'm looking for a guy called Ernest.", "What does this machine do?", "Is this your house?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I'm looking for a guy called Ernest."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What does this machine do?"); + stage = 11; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Is this your house?"); + stage = 20; + break; + } + break; + case 2: + interpreter.sendDialogues(npc, null, "Ah Ernest, top notch bloke. He's helping me with my", "experiments."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, null, "So you know where he is then?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, null, "He's that chicken over there."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, null, "Ernest is a chicken..? Are you sure..?"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, null, "Oh, he isn't normally a chicken, or at least he wasn't", "until he helped me test my pouletmorph machine."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(npc, null, "It was originally going to be called a transmutation", "machine. But after testing pouletmorph seems more", "appropriate."); + stage = 8; + break; + case 8: + interpreter.sendDialogues(player, null, "I'm glad Veronica didn't actually get engaged to a", "chicken."); + stage = 9; + break; + case 9: + interpreter.sendDialogues(npc, null, "Who's Veronica?"); + stage = 10; + break; + case 10: + interpreter.sendDialogues(player, null, "Ernest's fiancee. She probably doesn't want to marry a", "chicken."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, null, "Ooh I dunno. She could have free eggs for breakfast."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(player, null, "I think you'd better change him back."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, null, "Umm... It's not so easy..."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, null, "My machine is broken, and the house germlins have", "run off with some vital bits."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(player, null, "Well I can look for them."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, null, "That would be a help. They'll be somewhere in the", "manor house or its grounds, the gremlins never get", "further than the entrance gate."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, null, "I'm missing the pressure guage and a rubber tube.", "They've also taken my oil can, which I'm going to need", "to get this thing started again."); + stage = 18; + break; + case 18: + quest.setStage(player, 20); + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + if (player.getInventory().containsItem(OIL_CAN) && player.getInventory().containsItem(PRESSURE_GAUGE) && player.getInventory().containsItem(RUBBER_TUBE)) { + interpreter.sendDialogues(player, null, "I have everything!"); + stage = 3; + } else { + interpreter.sendDialogues(player, null, "I'm afraid I'm still looking for them!"); + stage = 1; + } + break; + case 1: + interpreter.sendDialogues(npc, null, "I need a rubber tube, a pressure gauge and a can of", "oil. Then your friend can stop being a chicken."); + stage = 2; + break; + case 2: + end(); + break; + case 3: + interpreter.sendDialogues(npc, null, "Give 'em here then."); + stage = 4; + break; + case 4: + end(); + player.lock(); + player.getPacketDispatch().sendMessage("You give a rubber tube, a pressure gauge,"); + player.getPacketDispatch().sendMessage("and a can of oil to the professor."); + player.getPacketDispatch().sendMessage("Oddenstein starts up the machine."); + final NPC chicken = Repository.findNPC(288); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + npc.animate(ANIMATION); + npc.faceLocation(FACE_LOCATION); + break; + case 2: + player.getPacketDispatch().sendMessage("The machine hums and shakes."); + npc.graphics(WEAKEN_START); + Projectile.create(npc, chicken, 106, 40, 36, 52, 75, 15, 11); + break; + case 4: + NPC ernest = NPC.create(287, chicken.getLocation()); + ernest.setAttribute("target", player); + ernest.init(); + player.setAttribute("ernest-hide", true); + if (player.getInventory().remove(OIL_CAN, PRESSURE_GAUGE, RUBBER_TUBE)) { + player.getDialogueInterpreter().open(287, ernest); + } + break; + case 5: + npc.graphics(WEAKEN_END); + return true; + } + return false; + } + }); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 286 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/QuarterMasterDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/QuarterMasterDialogue.java new file mode 100644 index 000000000..799b40248 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/QuarterMasterDialogue.java @@ -0,0 +1,65 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the quarter master dialogue. + * @author Vexia + */ +@Initializable +public final class QuarterMasterDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code QuarterMasterDialogue} {@Code + * Object} + * @param player the player. + */ + public QuarterMasterDialogue(Player player) { + super(player); + } + + /** + * Constructs a new {@Code QuarterMasterDialogue} {@Code + * Object} + */ + public QuarterMasterDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new QuarterMasterDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hi, would you like to see my wares?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Yes, please."); + stage++; + break; + case 1: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1208 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RanaelDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RanaelDialogue.java new file mode 100644 index 000000000..bbf86648c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RanaelDialogue.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the RanaelDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class RanaelDialogue extends DialoguePlugin { + + public RanaelDialogue() { + + } + + public RanaelDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 544 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you, that's not my scene."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you, that's not my scene."); + stage = 20; + break; + + } + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RanaelDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you want to buy any armoured skirts? Designed", "especially for ladies who like to fight."); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RangedTutorDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RangedTutorDialogue.java new file mode 100644 index 000000000..95175dc15 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RangedTutorDialogue.java @@ -0,0 +1,207 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the RangedTutorDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class RangedTutorDialogue extends DialoguePlugin { + + /** + * Represnets the bow item. + */ + private final Item BOW = new Item(9705); + + /** + * Represents the arrow item. + */ + private final Item ARROW = new Item(9706); + + public RangedTutorDialogue() { + + } + + public RangedTutorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RangedTutorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length == 2) { + if (player.getSavedData().getGlobalData().getTutorClaim() > System.currentTimeMillis()) { + interpreter.sendDialogues(npc, null, "I work with the Ranged Combat tutor to give out", "consumable items that you may need for combat such", "as arrows and runes. However we have had some", "cheeky people try to take both!"); + stage = 200; + return true; + } + stage = 99; + if (player.getInventory().containsItem(BOW)) { + interpreter.sendDialogues(npc, null, "You have a training bow in your inventory."); + return true; + } + if (player.getBank().containsItem(BOW)) { + interpreter.sendDialogues(npc, null, "You have a training bow in your bank."); + return true; + } + if (player.getEquipment().containsItem(BOW)) { + interpreter.sendDialogues(npc, null, "You're wielding your training bow."); + return true; + } + if (player.getInventory().containsItem(ARROW)) { + interpreter.sendDialogues(npc, null, "You have a training arrows in your inventory."); + return true; + } + if (player.getBank().containsItem(ARROW)) { + interpreter.sendDialogues(npc, null, "You have a training arrows in your bank."); + return true; + } + if (player.getEquipment().containsItem(ARROW)) { + interpreter.sendDialogues(npc, null, "You're wielding training arrows."); + return true; + } + if (player.getInventory().freeSlots() < 2) { + end(); + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return true; + } + if (player.getInventory().add(BOW)) { + interpreter.sendItemMessage(BOW, "Nemarti gives you a Training Shortbow. It can only be used with Training Arrows."); + stage = 230; + player.getSavedData().getGlobalData().setTutorClaim(System.currentTimeMillis() + 1800000); + return true; + } + return true; + } + interpreter.sendOptions("Select an Option", "Can you teach me the basics please?", "What about fletching?", "Goodbye."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 230: + final Item arrows = new Item(ARROW.getId(), 25); + if (player.getInventory().add(arrows)) { + interpreter.sendItemMessage(arrows, "Nemarti gives you 25 training arrows. They can only be used with the Training Shortbow."); + stage = 231; + player.getSavedData().getGlobalData().setTutorClaim(System.currentTimeMillis() + 1800000); + return true; + } + break; + case 231: + end(); + break; + case 99: + end(); + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you teach me the basics please?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What about fletching?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Goodbye."); + stage = 30; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "To start with you'll need a bow and arrows."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Mikasi, the Magic Combat tutor and I both give you", "items every 30 minutes, however you must choose", "wether you want runes or ranged equipment. To", "claim ranged equipment, right-click on me and choose"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Claim, to claim runes right-click on the Magic Combat", "tutor and select Claim."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you have both bow and arrows, wield them by", "right-clicking on them in your inventory and selecting", "wield."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "To set the way you shoot, click on the crossed swords", "above your inventory. This will open the combat", "interface where you can pick how you shoot your bow.", "Accurate means that you will shoot less often but be"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "more likely to hit, rapid means you shoot more often", "but might not hit so often and long range means just", "that, it increases your range. I prefer rapid personally,", "experiment and try it out!"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The Training Shortbow and Training Arrows can only", "be used together. Remember to pick up your arrows,", "re-use them and come back when you need more."); + stage = 17; + break; + case 17: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh the art of making your own bow and arrows. It's", "quite simple really. You'll need an axe to cut some logs", "from trees and a knife. Knives can be found in and", "arround the Lumbridge castle and in the Varrock"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "General store upstairs."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Use your knife on the logs, this will bring up a list of", "items you can make. Right-click on the item of your", "choice and choose the amount to fletch."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "For arrows you will need to smith some arrow heads", "and kill some chickens for feathers. Add the feathers", "and heads to the shafts to make arrows you can use."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You'll need to find a flax field, there's one south of", "Seer's Village. Gather flax, then spin it on a spinning", "wheel, there's one in Seers' Village too. This makes bow", "strings which you can then use on the unstrung bows"); + stage = 25; + break; + case 25: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "to make a working bow!"); + stage = 26; + break; + case 26: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Brilliant. If I forget anything I'll come talk to you", "again."); + stage = 27; + break; + case 27: + interpreter.sendOptions("Select an Option", "Can you teach me the basics please?", "What about fletching?", "Goodbye."); + stage = 1; + break; + case 30: + end(); + break; + case 200: + interpreter.sendDialogues(npc, null, "So, every half an hour, you may come back and claim", "either arrows OR runes, but not both. Come back in a", "while for runes, or simply make your own."); + stage = 201; + break; + case 201: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1861 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ReadbeardFrankDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ReadbeardFrankDialogue.java new file mode 100644 index 000000000..bf91fdd0a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ReadbeardFrankDialogue.java @@ -0,0 +1,513 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue to handle Rebeard Frank. + * + * @author afaroutdude + */ +@Initializable +public class ReadbeardFrankDialogue extends DialoguePlugin { + private boolean replacementReward = false; + private AchievementDiary diary; + private int level = 0; + + /** + * Represents the karamjan rum item. + */ + private static final Item KARAMJAN_RUM = new Item(431); + + /** + * Represents the chest key item. + */ + private static final Item KEY = new Item(432); + + /** + * Represents this quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code ReadbeardFrankDialogue} {@code Object}. + */ + public ReadbeardFrankDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ReadbeardFrankDialogue} {@code Object}. + * + * @param player the player. + */ + public ReadbeardFrankDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Pirate's Treasure"); + npc("Arr, Matey!"); + stage = 0; + AchievementDiary diary = player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR); + replacementReward = diary.isLevelRewarded(level) + && diary.isComplete(level, true) + && !player.hasItem(diary.getType().getRewards(level)[0]); + return true; + } + + // https://www.youtube.com/watch?v=U_sNcqQ2dtQ - achievement diary branch + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (quest.getStage(player) == 20 && !player.getInventory().containsItem(KEY) && !player.getBank().containsItem(KEY)) { + player("I seem to have lost my chest key..."); + stage = 700; + return true; + } + if (quest.getStage(player) == 10) { + npc("Have ye brought some rum for yer ol' mate Frank?"); + stage = 20; + break; + } + if (quest.getStage(player) == 0) { + options("I'm in search of treasure.", "Arr!", "Do you have anything for trade?", "Tell me about the Falador Achievement Diary."); + stage = 11; + break; + } + options("Arr!", "Do you have anything for trade?", "Tell me about the Falador Achievement Diary."); + stage = 10; + break; + case 10: + switch (buttonId) { + case 1: + player("Arr!"); + stage = 12; + break; + case 2: + player("Do you have anything for trade?"); + stage = 13; + break; + case 3: + player("Tell me about the Falador Achievement Diary."); + stage = 80; + break; + } + break; + case 11: + switch (buttonId) { + case 1: + player("I'm in search of treasure."); + stage = 40; + break; + case 2: + player("Arr!"); + stage = 12; + break; + case 3: + player("Do you have anything for trade?"); + stage = 13; + break; + case 4: + player("Tell me about the Falador Achievement Diary."); + stage = 80; + break; + } + break; + case 12: + npc("Arr!"); + stage = 0; + break; + case 13: + npc("Nothin' at the moment, but then again the Customs", "Agents are on the warpath right now."); + stage = 999; + break; + case 20: + if (!player.getInventory().containsItem(KARAMJAN_RUM)) { + player("No, not yet."); + stage = 21; + } else { + player("Yes, I've got some."); + stage = 31; + } + break; + case 21: + npc("Not suprising, tis no easy task to get it off Karamja."); + stage = 22; + break; + case 22: + player("What do you mean?"); + stage = 23; + break; + case 23: + npc("The Customs office has been clampin' down on the", "export of spirits. You seem like a resourceful young lad,", "I'm sure ye'll be able to find a way to slip the stuff past", "them."); + stage = 24; + break; + case 24: + player("Well I'll give it another shot."); + stage = 25; + break; + case 999: + end(); + break; + case 31: + npc("Now a deal's a deal, I'll tell ye about the treasure. I", "used to serve under a pirate captain called One-Eyed", "Hector."); + stage = 32; + break; + case 32: + npc("Hector were very successful and became very rich.", "But about a year ago we were boarded by the Customs", "and Excise Agents."); + stage = 33; + break; + case 33: + npc("Hector were killed along with many of the crew, I were", "one of the few to escape and I escaped with this."); + stage = 34; + break; + case 34: + if (player.getInventory().remove(KARAMJAN_RUM)) { + if (!player.getInventory().add(KEY)) { + GroundItemManager.create(KEY, player); + } + quest.setStage(player, 20); + interpreter.sendItemMessage(KEY.getId(), "Frank happily takes the rum... ... and hands you a key"); + stage = 35; + } + end(); + break; + case 35: + npc("This be Hector's key. I believe it opens his chest in his", "old room in the Blue Moon Inn in Varrock."); + stage = 36; + break; + case 36: + npc("With any luck his treasure will be in there."); + stage = 37; + break; + case 37: + player("Ok thanks, I'll go and get it."); + stage = 999; + break; + case 40: + npc("Arr, treasure you be after eh? Well I might be able to", "tell you where to find some... For a price..."); + stage = 41; + break; + case 41: + player("What sort of price?"); + stage = 42; + break; + case 42: + npc("Well for example if you go and get me a bottle of rum...", "Not just any rum mind..."); + stage = 43; + break; + case 43: + npc("I'd like some rum made on Karamja Island. There's no", "rum like Karamaja Rum!"); + stage = 44; + break; + case 44: + options("Ok, I will bring you some rum.", "Not right now."); + stage = 45; + break; + case 45: + switch (buttonId) { + case 1: + quest.start(player); + player("Ok, I will bring you some rum."); + stage = 47; + break; + case 2: + player("Not right now."); + stage = 46; + break; + } + break; + case 46: + npc("Fair enough. I'll still be here and thirsty whenever you", "feel like helpin' out."); + stage = 999; + break; + case 47: + npc("Yer a saint, although it'll take a miracle to get it off", "Karamja."); + stage = 48; + break; + case 48: + player("What do you mean?"); + stage = 49; + break; + case 49: + npc("The Customs office has been clampin' down on the", "export of spirits. You seem like a resourceful young lad,", "I'm sure ye'll be able to find a way to slip the stuff past", "them."); + stage = 50; + break; + case 50: + player("Well I'll give it a shot."); + stage = 51; + break; + case 51: + npc("Arr, that's the spirit!"); + stage = 999; + break; + + + case 700: + npc("Arr, silly you. Fortunately I took the precaution to have", "another one made."); + stage = 701; + break; + case 701: + interpreter.sendItemMessage(KEY.getId(), "Frank hands you a chest key."); + stage = 702; + break; + case 702: + end(); + if (!player.getInventory().add(KEY)) { + GroundItemManager.create(KEY, player); + } + break; + + + case 80: + if (player.getAttribute("falador-diary-talk-first-time", false)) { + npc("So you're interested in exploring Falador and it's", "surrounding areas, eh?"); + player.setAttribute("/save:falador-diary-talk-first-time", true); + stage = 100; + } else { + npc("How are you getting on with the Achievement Diary?"); + stage = 90; + } + break; + + case 90: + options("I've come for my reward.", "I'm doing good.", "I have a question."); + stage = 91; + break; + case 91: + switch (buttonId) { + case 1: + player("I've come for my reward."); + stage = 200; + break; + case 2: + player("I'm doing good."); + stage = 220; + break; + case 3: + player("I have a question."); + stage = 105; + break; + } + break; + + case 100: + player("Er... I guess."); + stage = 101; + break; + case 101: + npc("Arrr! That's the spirit! Soon ye'll be exploring", "underground caverns, sailin' the high seas and", "plundering booty!"); + stage = 102; + break; + case 102: + interpreter.sendDialogues(player, FacialExpression.AMAZED, "Plundering booty?"); + stage = 103; + break; + case 103: + npc("Arrr! Nay, that be a lie, I be getting carried away."); + stage = 104; + break; + case 104: + npc("Have you got any questions?"); + stage = 105; + break; + case 105: + if (!diary.isLevelRewarded(level)) { + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 106; + } else { + options("Can you remind me what my Falador shield does, please?", "What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 107; + } + break; + case 106: + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 110; + break; + case 2: + player("What are the rewards?"); + stage = 120; + break; + case 3: + player("How do I claim the rewards?"); + stage = 130; + break; + case 4: + player("See you later."); + stage = 999; + break; + } + break; + + case 107: + switch (buttonId) { + case 1: + player("Can you remind me what my Falador shield does, please?"); + stage = 150; + break; + case 2: + player("What is the Achievement Diary?"); + stage = 110; + break; + case 3: + player("What are the rewards?"); + stage = 120; + break; + case 4: + player("How do I claim the rewards?"); + stage = 130; + break; + case 5: + player("See you later."); + stage = 999; + break; + } + break; + + case 110: + npc("Ah, well it's a diary that helps you keep track of", "particular achievements you've made here on", "2009Scape."); + stage = 111; + break; + case 111: + npc("If you manage to complete a particular set of tasks,", "you will be rewarded for your explorative efforts."); + stage = 112; + break; + case 112: + npc("You can access your Achievement Diary by going to", "the Quest Journal, then clicking on the green star icon", "in the top-right hand corner."); + stage = 105; + break; + + case 120: + npc("Ah, well there are different rewards for each", "Achievement Diary. For completing each stage of the", "Falador diary, you are presented with a Falador shield."); + stage = 121; + break; + case 121: + npc("There are three shields available, one for each difficulty", "level."); + stage = 122; + break; + case 122: + npc("When you are presented with your rewards, you will", "be told of their uses."); + stage = 105; + break; + + case 130: + npc("You need to complete all of the tasks in a particular", "difficulty, then you can claim your reward."); + stage = 131; + break; + case 131: + npc("Some of Falador's tasks are simple, some will require", "certain skill levels, and some might require quests to be", "started or completed."); + stage = 132; + break; + case 132: + npc("To claim your Falador Achievement Diary rewards,", "speak to the chemist in Rimmington, Sir Vyvin's squire", "in the White Knight's Castle, or myself."); + stage = 105; + break; + + case 150: + npc("This is the first stage fo the Falador shield: a buckler. It", "grants you access to a Prayer restore ability and an", "emote."); + stage = 151; + break; + case 151: + npc("Each of these features can be triggered while wielding", "the shield by selecting the 'Operate' option. The Prayer", "restore can also be activated from your inventory."); + stage = 152; + break; + case 152: + npc("The Prayer restore ability can only be used once per", "day, and gives you back a quarter of your Prayer", "points."); + stage = 153; + break; + case 153: + npc("As well as all of these features, the shield is pretty", "handy in combat, and gives you a small Prayer boost."); + stage = 105; + break; + + case 200: + if (diary.isLevelRewarded(level)) { + npc("But you've already gotten yours!"); + stage = 105; + } else if (diary.isComplete(level, true)) { + npc("So, you've finished. Well done! I believe congratulations", "are in order."); + stage = 201; + } else { + npc("But you haven't finished!"); + stage = 105; + } + break; + case 201: + player("I believe rewards are in order."); + stage = 202; + break; + case 202: + npc("Right you are."); + stage = 203; + break; + case 203: + npc("This is the first stage of the Falador shield: a buckler. It", "grants you access to a Prayer restore ability and an", "emote."); + if (!diary.isLevelRewarded(level)) { + for (Item i : diary.getType().getRewards(level)) { + if (!player.getInventory().add(i, player)) { + GroundItemManager.create(i, player); + }; + } + diary.setLevelRewarded(level); + } + stage = 204; + break; + case 204: + npc("Each of these features can be triggered while wielding", "the shield by selecting the 'Operate' option. The Prayer", "restore can also be activated from your inventory."); + stage = 205; + break; + case 205: + npc("The Prayer restore ability can only be used once per", "day, and gives you back a quarter of your Prayer", "points."); + stage = 206; + break; + case 206: + npc("As well as all of these features, the shield is pretty", "handy in combat, and gives you a small Prayer boost."); + stage = 207; + break; + case 207: + npc("I've even thrown in a bit of booty I found on my", "travels."); + stage = 208; + break; + case 208: + interpreter.sendDialogues(player, FacialExpression.AMAZED, "Wow, thanks!"); + stage = 209; + break; + case 209: + npc("If you should lose your shield, come back and see me", "for another one."); + stage = 105; + break; + case 220: + npc("Keep it up!"); + stage = 105; + break; + + + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ReadbeardFrankDialogue(player); + } + + @Override + public int[] getIds() { + return new int[]{375}; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ReffDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ReffDialogue.java new file mode 100644 index 000000000..ca23880ae --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ReffDialogue.java @@ -0,0 +1,170 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * The ref dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ReffDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ReffDialogue} {@code Object}. + */ + public ReffDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ReffDialogue} {@code Object}. + * @param player the player. + */ + public ReffDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ReffDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Greetings " + (player.getAppearance().isMale() ? "Sir" : "Madam") + "."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Tell me about the Shot Put area.", "May I claim my tokens please?", "Do you have any tips for me?", "Bye!"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Tell me about the Shot Put area."); + stage = 10; + break; + case 2: + end(); + player.getDialogueInterpreter().open("wg:claim-tokens", npc.getId()); + break; + case 3: + player("Do you have any tips for me?"); + stage = 30; + break; + case 4: + player("Bye!"); + stage = 40; + break; + } + break; + case 10: + npc("Of course " + (player.getAppearance().isMale() ? "Sir" : "Madam") + ". There are two different weights of", "shot..."); + stage++; + break; + case 11: + player("Shot?"); + stage++; + break; + case 12: + npc("Yes Madam. Shot. The iron spheres that are propelled", "by chemical energy stored in your body."); + stage++; + break; + case 13: + player("The... what?"); + stage++; + break; + case 14: + npc("Your strength " + (player.getAppearance().isMale() ? "Sir" : "Madam") + ". The stronger you are, the", "further you can throw the shot, but there are other", "factors of course, like your technique."); + stage++; + break; + case 15: + player("What's that then?"); + stage++; + break; + case 16: + npc("The style of the shot " + (player.getAppearance().isMale() ? "Sir" : "Madam") + "."); + stage++; + break; + case 17: + player("Iron has style??"); + stage++; + break; + case 18: + interpreter.sendDialogue("The Referee sighs, rolls his eyes and continues...."); + stage++; + break; + case 19: + npc((player.getAppearance().isMale() ? "Sir" : "Madam") + ", the style in which you throw the shot, not the", "style of iron."); + stage = -1; + break; + case -1: + player("OH! You mean the spinny round thing or the chuck it", "straight?"); + stage = -2; + break; + case -2: + npc("Crudely put " + (player.getAppearance().isMale() ? "Sir" : "Madam") + ", but yes. Some are more difficult", "than others. Experiment and see which you prefer."); + stage = -3; + break; + case -3: + player("Thanks for the help!"); + stage = -4; + break; + case -4: + npc("You are welcome " + (player.getAppearance().isMale() ? "Sir" : "Madam") + "."); + stage = -5; + break; + case -5: + end(); + break; + case 30: + npc("Tips " + (player.getAppearance().isMale() ? "Sir" : "Madam") + "?"); + stage++; + break; + case 31: + player("Yes, like how can I do better than everyone else."); + stage++; + break; + case 32: + npc((player.getAppearance().isMale() ? "Sir" : "Madam") + " may find that a fine powder applied to the", "hands may give one an advantage when putting the", "shot."); + stage++; + break; + case 33: + player("You mean if I grind something up and put dust on my", "hands I'll chuck the ball further?"); + stage++; + break; + case 34: + npc("Yes " + (player.getAppearance().isMale() ? "Sir" : "Madam") + "."); + stage++; + break; + case 35: + player("Thanks!"); + stage = -4; + break; + case 40: + npc("Good luck " + (player.getAppearance().isMale() ? "Sir" : "Madam") + "."); + stage++; + break; + case 41: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4299, 4300 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ReloboBlinyoDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ReloboBlinyoDialogue.java new file mode 100644 index 000000000..094ed398e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ReloboBlinyoDialogue.java @@ -0,0 +1,120 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.ge.GEGuidePrice; +import core.game.ge.GEGuidePrice.GuideType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles the ReloboBlinyoDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class ReloboBlinyoDialogue extends DialoguePlugin { + + public ReloboBlinyoDialogue() { + + } + + public ReloboBlinyoDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new ReloboBlinyoDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hey there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Why hello to you too, my friend."); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "You look like you've travelled a fair distance.", "I'm trying to find the prices for logs.", "Sorry, I need to be macking tracks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You look like you've travelled a fair distance."); + stage = 20; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm trying to find the prices for logs."); + stage = 10; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I need to be making tracks."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Then you've come to the right person."); + stage = 11; + break; + case 11: + end(); + GEGuidePrice.open(player, GuideType.LOGS); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What gave me away?"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't mean to be rude, but the face paint and", "hair, for startes."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, yes I'm from Shilo Village on Karamja. It's a style", "I've had since I was little."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Then tell me, why are you so far from home?"); + stage = 24; + break; + case 24: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This Grand Exchange! Isn't it marvellous I've never seen", "anything like it in my life. My people were not pleased to", "see me break traditions to visit such a place. But i hope", "to make some serious profit. then they'll see I was right!"); + stage = 25; + break; + case 25: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So, what are you selling?"); + stage = 26; + break; + case 26: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Logs! of all kinds! That's my plan, at least. Nature", "is one thing my people understand very well."); + stage = 27; + break; + case 27: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Okay. Nice talking to you!"); + stage = 31; + break; + case 31: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6526 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ResearcherDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ResearcherDialogue.java new file mode 100644 index 000000000..14f4a81d3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ResearcherDialogue.java @@ -0,0 +1,96 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.GameWorld; + +/** + * Represents the dialogue plugin for the new Researcher NPC that sells unobtainable items. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class ResearcherDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ResearcherDialogue} {@code Object}. + */ + public ResearcherDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ResearcherDialogue} {@code Object}. + * @param player the player. + */ + public ResearcherDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ResearcherDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Hello, are you new around these parts?"); + stage = 1; + break; + case 1: + npc("I am indeed. I am a traveling researcher studying the", "lands of "+GameWorld.getSettings().getName()+"."); + stage = 2; + break; + case 2: + player("That's amazing! Surely you must have collected a few", "trinkets in your travels."); + stage = 3; + break; + case 3: + npc("I have. I suppose I could let you take a look at them","if you're interested."); + stage = 4; + break; + case 4: + interpreter.sendOptions("Select an Option", "Look at wares.", "Decline."); + stage = 5; + break; + case 5: + switch(buttonId){ + case 1: + player("Alright, show me your wares."); + stage = 6; + break; + case 2: + player("On second thought, I really must be going."); + stage = 7; + break; + } + break; + case 6: + end(); + npc.openShop(player); + break; + case 7: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4568 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RimmingtonShopKeeperDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RimmingtonShopKeeperDialogue.java new file mode 100644 index 000000000..8ce24372f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RimmingtonShopKeeperDialogue.java @@ -0,0 +1,72 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the RimmingtonShopKeeperDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class RimmingtonShopKeeperDialogue extends DialoguePlugin { + + public RimmingtonShopKeeperDialogue() { + + } + + public RimmingtonShopKeeperDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 531, 530 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please. What are you selling?", "How should I use your shop?", "No, thanks."); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm glas you ask! You can buy as many of the items", "stocked as you wish. You can also sell most items to the", "shop."); + stage = 10; + break; + case 3: + end(); + break; + } + + break; + case 10: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RimmingtonShopKeeperDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can I help you at all?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RockGolemDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RockGolemDialogue.java new file mode 100644 index 000000000..73ec63b94 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RockGolemDialogue.java @@ -0,0 +1,76 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the rock golem dialgoue. + * @author Empathy + * + */ +@Initializable +public final class RockGolemDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code RockGolemDialogue} {@code Object}. + */ + public RockGolemDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code RockGolemDialogue} {@code Object}. + * + * @param player the player. + */ + public RockGolemDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RockGolemDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So you're made entirely of rocks?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Not quite, my body is formed mostly of minerals."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Aren't minerals just rocks?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "No, rocks are rocks, minerals are minerals. I am", "formed from minerals."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "But you're a Rock Golem..."); + stage = 4; + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8637 }; + } + } diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RoladDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RoladDialogue.java new file mode 100644 index 000000000..55bb9a641 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RoladDialogue.java @@ -0,0 +1,58 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the RoladDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class RoladDialogue extends DialoguePlugin { + + public RoladDialogue() { + + } + + public RoladDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 1841 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ehm... well... my name is " + player.getUsername() + ", if that rings any bell?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, never heard of you."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RoladDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, hello... do I know you?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RomilyWeaklaxDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RomilyWeaklaxDialogue.java new file mode 100644 index 000000000..42468eac4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RomilyWeaklaxDialogue.java @@ -0,0 +1,255 @@ +package core.game.content.dialogue; + +import core.tools.Items; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the RomilyWeaklaxDialogue dialogue. + * + * @author 'Vexia + */ +@Initializable +public class RomilyWeaklaxDialogue extends DialoguePlugin { + private enum PieReward { + APPLE(Items.APPLE_PIE_2323, 84), + REDBERRY(Items.REDBERRY_PIE_2325, 90), + MEAT(Items.MEAT_PIE_2327, 96), + GARDEN(Items.GARDEN_PIE_7178, 112), + FISH(Items.FISH_PIE_7188, 125), + ADMIRAL(Items.ADMIRAL_PIE_7198, 387); + + int id, reward; + + PieReward(int id, int reward) { + this.id = id; + this.reward = reward; + } + + protected static PieReward forId(int id) { + for (PieReward pie : PieReward.values()) { + if (pie.id == id) { + return pie; + } + } + return null; + } + } + + private final static String keyAmt = "romily-weaklax:pie-amt"; + private final static String keyId = "romily-weaklax:pie-assigned"; + + private int pieId = 0; + private int pieAmt = 0; + private PieReward pieReward; + + public RomilyWeaklaxDialogue() { + + } + + public RomilyWeaklaxDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RomilyWeaklaxDialogue(player); + } + + @Override + public void init() { + super.init(); + PluginManager.definePlugin(new RomilyWildPieHandler()); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + pieId = player.getAttribute(keyId, 0); + pieAmt = player.getAttribute(keyAmt, 0); + pieReward = PieReward.forId(pieId); + + if (args.length > 1) { + Item usedWith = (Item) args[1]; + if (usedWith.getId() == Items.WILD_PIE_7208) { + npc("Is that a wild pie for me?"); // TODO not accurate dialogue, unfortunately offscreen in this video https://www.youtube.com/watch?v=FjlLZnDxofY + stage = 100; + return true; + } + } + + npc("Hello and welcome to my pie shop, how can I help you?"); + if (pieId != 0 && pieAmt != 0) { + stage = 2; + } else { + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + break; + case 0: + options("I'd like to buy some pies.", "Do you need any help?", "I'm good thanks."); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + player("I'd like to buy some pies."); + stage = 10; + break; + case 2: + player("Do you need any help?"); + stage = 20; + break; + case 3: + player("I'm good thanks."); + stage = 999; + break; + } + break; + case 2: + options("I'd like to buy some pies.", "I've got those pies you wanted.", "I'm good thanks."); + stage = 1; + break; + case 3: + + switch (buttonId) { + case 1: + player("I'd like to buy some pies."); + stage = 10; + break; + case 2: + player("I've got those pies you wanted."); + stage = 50; + break; + case 3: + player("I'm good thanks."); + stage = 999; + break; + } + break; + case 10: + npc("Take a look."); + stage++; + break; + case 11: + end(); + npc.openShop(player); + break; + case 20: + npc("Actually I could, you see I'm running out of stock and I", "don't have tme to bake any more pies. would you be", "willing to bake me some pies? I'll pay you well for them."); + stage = 21; + break; + case 21: + options("Sure, what do you need?", "Sorry, I can't help you."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + player("Sure, what do you need?"); + stage = 60; + break; + case 2: + player("Sorry, I can't help you."); + stage++; + break; + } + break; + case 23: + npc("Come back if you ever want to bake pies."); + stage = 999; + break; + case 50: + final int piesInInventory = player.getInventory().getAmount(pieId); + final int deficit = pieAmt - piesInInventory; + if (piesInInventory == 0) { + npc("Doesn't look like you have any of the", pieAmt + " " + new Item(pieId).getName() + "s I requested."); + stage = 999; + break; + } else if (deficit == 0) { + npc("Thank you very much!"); + player.removeAttribute(keyAmt); + player.removeAttribute(keyId); + } else { + npc("Thank you, if you could bring me the other " + deficit + " that'd", "be great!"); + player.setAttribute("/save:" + keyAmt, deficit); + } + player.getInventory().remove(new Item(pieId, piesInInventory)); + player.getInventory().add(new Item(995, pieReward.reward * piesInInventory)); + stage = 999; + break; + case 60: + pieAmt = RandomFunction.random(1, 28); + pieId = PieReward.values()[RandomFunction.nextInt(PieReward.values().length)].id; + player.setAttribute("/save:" + keyAmt, pieAmt); + player.setAttribute("/save:" + keyId, pieId); + npc("Great, can you bake me " + pieAmt + " " + new Item(pieId).getName() + "s please."); + stage = 999; + break; + + case 100: + player("Yes, it is."); + stage++; + break; + case 101: + npc("Oh, how splendid! Let me take that from you then."); + player.getInventory().remove(new Item(Items.WILD_PIE_7208)); + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 2, 5); + stage++; + break; + case 102: + npc("Now, was there anything else you needed?"); + if (pieId != 0 && pieAmt != 0) { + stage = 2; + } else { + stage = 0; + } + break; + } + + return true; + } + + + @Override + public int[] getIds() { + return new int[]{3205}; + } + + public static final class RomilyWildPieHandler extends UseWithHandler { + public RomilyWildPieHandler() { + super(Items.WILD_PIE_7208); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(3205, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (!event.getPlayer().getAchievementDiaryManager().getDiary(DiaryType.VARROCK).isComplete(2,5)) { + event.getPlayer().getDialogueInterpreter().open(3205, event.getUsedItem()); + } + return true; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RoomikDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RoomikDialogue.java new file mode 100644 index 000000000..9ebd94ea6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RoomikDialogue.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the RoomikDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class RoomikDialogue extends DialoguePlugin { + + public RoomikDialogue() { + + } + + public RoomikDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 585 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Choose an option:", "Let's see what you've got, then.", "No thanks, I've got all the crafting equipment I need."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I've got all the crafting euipment I need."); + stage = 20; + break; + + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Okay. Fare well on your travels."); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RoomikDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy some Crafting equipment?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RufusDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RufusDialogue.java new file mode 100644 index 000000000..7aaeec0ea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RufusDialogue.java @@ -0,0 +1,105 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the RufusDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class RufusDialogue extends DialoguePlugin { + + public RufusDialogue() { + + } + + public RufusDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RufusDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Grreeting frrriend! Welcome to my worrrld famous", "food emporrium! All my meats are so frrresh you'd", "swear you killed them yourrrself!"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Why do you only sell meats?", "Do you sell cooked food?", "Can I buy some food?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why do you only sell meats?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you sell cooked food?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I buy some food?"); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What? Why, what else would you want to eat? What", "kind of lycanthrrope are you anyway?"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "...A vegetarian one?"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Vegetarrrian...?"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Never mind."); + stage = 14; + break; + case 14: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Cooked food? Who would want that? You lose all the", "flavourrr of the meat when you can't taste the blood!"); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Cerrrtainly!"); + stage = 31; + break; + case 31: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1038 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RugMerchantDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RugMerchantDialogue.java new file mode 100644 index 000000000..4dcfc3a95 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RugMerchantDialogue.java @@ -0,0 +1,394 @@ +package core.game.content.dialogue; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * The dialogue plugin used for the rug merchant. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class RugMerchantDialogue extends DialoguePlugin { + + /** + * The ids of the rug merchants. + */ + private static final int[] IDS = new int[] { 2291, 2292, 2293, 2294, 2296, 2298, 3020 }; + + /** + * The floating animation. + */ + private static final Animation FLOATING_ANIMATION = new Animation(330); + + /** + * The current reg destination. + */ + private RugDestination current; + + /** + * The rug destination options,. + */ + private RugDestination[] options; + + /** + * The destinationt o travel to. + */ + private RugDestination destination; + + /** + * Constructs a new {@code RugMerchantDialogue} {@code Object}. + */ + public RugMerchantDialogue() { + } + + @Override + public void init() { + super.init(); + PluginManager.definePlugin(new RugMerchantPlugin()); + } + + /** + * Constructs a new {@code RugMerchantDialogue} {@code Object}. + * @param player the player. + */ + public RugMerchantDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RugMerchantDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + current = RugDestination.forId(npc.getId()); + if (args.length >= 2) { + options = getDestination(npc.getId()); + sendOptions(options); + stage = 11; + return true; + } + player("Hello."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + default: + handleDefault(buttonId); + break; + } + return true; + } + + /** + * Handles the defeault dialogue. + * @param buttonId the buttonId. + */ + private final void handleDefault(final int buttonId) { + switch (stage) { + case 0: + npc("Greetings, desert traveller. Do you require the services", "of Ali Morrisane's flying carpet fleet?"); + stage++; + break; + case 1: + options("Yes, please.", "No thanks."); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + player("Yes, please."); + stage = 10; + break; + case 2: + player("No thanks."); + stage = 20; + break; + } + break; + case 8: + options("Yes.", "No."); + stage++; + break; + case 9: + if (buttonId == 2) { + end(); + } else { + destination = options[0]; + player("Yes, please."); + stage = 11; + } + break; + case 10: + sendOptions((options = getDestination(npc.getId()))); + stage = 11; + break; + case 11: + if (!player.getInventory().contains(995, 200)) { + npc("A travel on one of my rugs costs 200 gold", "coins."); + stage = 20; + return; + } + destination = options.length == 1 ? options[0] : options[buttonId - 1]; + if (player.getInventory().remove(new Item(995, 200))) { + destination.travel(current, player); + } + end(); + break; + case 20: + end(); + break; + } + } + + /** + * Sends the rug travelling destination options. + * @param destinations the destinations. + */ + private void sendOptions(RugDestination[] destinations) { + String[] options = new String[destinations.length]; + if (destinations.length == 1) { + npc("Travel back to " + destinations[0].getName() + "?"); + stage = 8; + return; + } + for (int i = 0; i < destinations.length; i++) { + options[i] = destinations[i].getName(); + } + interpreter.sendOptions("Select a Destination", options); + } + + /** + * Gets the rug destinations for an npc id. + * @param npcId the npc id. + * @return the rug destinations. + */ + public static RugDestination[] getDestination(int npcId) { + switch (npcId) { + case 2291: + return new RugDestination[] { RugDestination.UZER, RugDestination.BEDABIN_CAMP, RugDestination.NORTH_POLLNIVNEACH }; + case 2292: + return new RugDestination[] { RugDestination.SHANTAY_PASS }; + case 2294: + return new RugDestination[] { RugDestination.SHANTAY_PASS }; + case 2293: + return new RugDestination[] { RugDestination.SHANTAY_PASS }; + case 3020: + return new RugDestination[] { RugDestination.NARDAH, RugDestination.SOPHANEM }; + default: + return new RugDestination[] { RugDestination.SOUTH_POLLNIVNEACH }; + } + } + + @Override + public int[] getIds() { + return IDS; + } + + /** + * Handles the right click on the rug merchant. + * @author Vexia + * + */ + public class RugMerchantPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : IDS) { + NPCDefinition.forId(id).getHandlers().put("option:travel", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(node.getId(), node, true, true); + return true; + } + + } + + /** + * A destination for a rug. + * @author 'Vexia + */ + public enum RugDestination { + SHANTAY_PASS(2291, Location.create(3308, 3110, 0), "Shantay Pass"), BEDABIN_CAMP(2292, Location.create(3180, 3045, 0), "Bedabin Camp", Location.create(3305, 3107, 0), Location.create(3299, 3107, 0), Location.create(3285, 3088, 0), Location.create(3285, 3073, 0), Location.create(3268, 3073, 0), Location.create(3263, 3068, 0), Location.create(3246, 3068, 0), Location.create(3246, 3057, 0), Location.create(3232, 3057, 0), Location.create(3215, 3057, 0), Location.create(3200, 3057, 0), Location.create(3179, 3057, 0), Location.create(3179, 3047, 0), Location.create(3180, 3045, 0)), NORTH_POLLNIVNEACH(2294, Location.create(3349, 3003, 0), "North Pollnivneach", new Location(3308, 3096, 0), new Location(3308, 3079, 0), new Location(3308, 3066, 0), new Location(3311, 3057, 0), new Location(3319, 3042, 0), new Location(3332, 3033, 0), new Location(3341, 3020, 0), new Location(3350, 3009, 0), new Location(3351, 3003, 0), new Location(3349, 3003, 0)), UZER(2293, Location.create(3469, 3113, 0), "Uzer", Location.create(3308, 3105, 0), Location.create(3325, 3105, 0), Location.create(3332, 3105, 0), Location.create(3332, 3080, 0), Location.create(3341, 3080, 0), Location.create(3341, 3082, 0), Location.create(3358, 3082, 0), Location.create(3370, 3082, 0), Location.create(3382, 3082, 0), Location.create(3396, 3082, 0), Location.create(3432, 3082, 0), Location.create(3432, 3093, 0), Location.create(3440, 3093, 0), Location.create(3454, 3107, 0), Location.create(3469, 3107, 0), Location.create(3469, 3113, 0)), NARDAH(2296, Location.create(3401, 2916, 0), "Nardah", new Location(3351, 2942, 0), new Location(3350, 2936, 0), new Location(3362, 2936, 0), new Location(3380, 2928, 0), new Location(3392, 2920, 0), new Location(3397, 2916, 0), new Location(3401, 2916, 0)), SOPHANEM(2298, Location.create(3285, 2813, 0), "Sophanem", Location.create(3351, 2934, 0), Location.create(3351, 2928, 0), Location.create(3351, 2919, 0), Location.create(3346, 2902, 0), Location.create(3339, 2884, 0), Location.create(3328, 2877, 0), Location.create(3328, 2862, 0), Location.create(3328, 2845, 0), Location.create(3318, 2838, 0), Location.create(3307, 2828, 0), Location.create(3292, 2817, 0), Location.create(3285, 2818, 0), Location.create(3285, 2813, 0)), SOUTH_POLLNIVNEACH(3020, Location.create(3351, 2942, 0), "South Pollnivneach"); + + /** + * The npc id. + */ + private final int npc; + + /** + * The destination to go to. + */ + private final Location location; + + /** + * The name of the destination. + */ + private final String name; + + /** + * The location data. + */ + private final Location[] locData; + + /** + * Constructs a new {@code RugDestination} {@code Object}. + * @param npc the npc. + * @param destination the destination. + */ + private RugDestination(int npc, Location destination, String name, Location... locData) { + this.npc = npc; + this.location = destination; + this.name = name; + this.locData = locData; + } + + /** + * Travels a player to a destination. + * @param player the player. + */ + public void travel(final RugDestination current, final Player player) { + player.lock(); + player.getConfigManager().set(499, 0); + player.getImpactHandler().setDisabledTicks(GameWorld.getTicks() + 200); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + int index; + Location[] locs = getLocData(); + + @Override + public boolean pulse() { + switch (++count) { + case 1: + if (RugDestination.this == SHANTAY_PASS || RugDestination.this == RugDestination.SOUTH_POLLNIVNEACH) { + Location[] temp = new Location[current.getLocData().length + 1]; + int counter = 0; + for (int i = current.getLocData().length - 1; i >= 0; i--) { + temp[counter++] = current.getLocData()[i]; + } + temp[temp.length - 1] = RugDestination.this.getLocation(); + locs = temp; + } + player.faceLocation(current.getLocation()); + break; + case 2: + AgilityHandler.walk(player, -1, player.getLocation(), current.getLocation(), null, 0.0, null); + break; + case 3: + player.faceLocation(getLocation()); + break; + case 4: + player.getConfigManager().set(499, 1); + player.animate(FLOATING_ANIMATION); + break; + case 200: + break; + case 901: + player.getImpactHandler().setDisabledTicks(0); + player.unlock(); + player.animate(new Animation(-1)); + player.getConfigManager().set(499, 0); + break; + case 902: + player.moveStep(); + return true; + default: + if (index > locs.length - 1) { + count = 900; + break; + } + if (index == 0 || player.getLocation().equals(locs[index - 1])) { + AgilityHandler.forceWalk(player, -1, player.getLocation(), locs[index++], FLOATING_ANIMATION, 40, 0.0, null); + } + return false; + } + return false; + } + + @Override + public void stop() { + super.stop(); + player.unlock(); + } + + }); + } + + /** + * Checks if the player has the requirements. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasRequirements(final Player player) { + return true; + } + + /** + * Gets the rug destination object for the npc id. + * @param id the id. + * @return the rug destination. + */ + public static RugDestination forId(int id) { + for (RugDestination dest : values()) { + if (dest.getNpc() == id) { + return dest; + } + } + return null; + } + + /** + * Gets the npc. + * @return The npc. + */ + public int getNpc() { + return npc; + } + + /** + * Gets the destination. + * @return The destination. + */ + public Location getLocation() { + return location; + } + + /** + * Gets the name. + * @return the name. + */ + public String getName() { + return name; + } + + /** + * Gets the locData. + * @return the locData. + */ + public Location[] getLocData() { + return locData; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/RustyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/RustyDialogue.java new file mode 100644 index 000000000..8d9bbdf37 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/RustyDialogue.java @@ -0,0 +1,82 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the RustyDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class RustyDialogue extends DialoguePlugin { + + public RustyDialogue() { + + } + + public RustyDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 3239 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why are you asking?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Um... It's a quiz. I'm asking everyone I meet if they're", "carrying anything valuable."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What would you do if I said I had loads of expensive items", "with me?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ooh, do you? It's been ages since anyone said they'd got", "anything worth stealing."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "'Anything worth stealing'?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Um... Not that I'd dream of stealing anything!"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, I'll say I'm not carrying anything valuable at all."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, what a shame."); + stage = 8; + break; + case 8: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RustyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hiya. Are you carrying anything valuable?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SabreenDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SabreenDialogue.java new file mode 100644 index 000000000..c5ba8dd6d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SabreenDialogue.java @@ -0,0 +1,112 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; + +/** + * @author 'Vexia + */ +@Initializable +public class SabreenDialogue extends DialoguePlugin { + + public SabreenDialogue() { + + } + + public SabreenDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SabreenDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi. How can I help?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Can you heal me?", "Do you see a lot of injured fighters?", "Do you come here often?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you heal me?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you see a lot of injured fighters?"); + stage = 30; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you come here often?"); + stage = 20; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Of course!"); + stage = 11; + break; + case 11: + npc.animate(new Animation(881)); + if (player.getSkills().getLifepoints() == player.getSkills().getStaticLevel(Skills.HITPOINTS)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You look healthy to me!"); + } else { + player.getSkills().heal(player.getSkills().getStaticLevel(Skills.HITPOINTS)); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There you go!"); + } + stage = 12; + break; + case 12: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I work here, so yes!"); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes I do. Thankfully we can cope with almost aything.", "Jaraah really is a wonderful surgeon, this methods are a", "little unorthodox but he gets the job done."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I shouldn't tell you this but his nickname is 'The", "Butcher'."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's reassuring."); + stage = 33; + break; + case 33: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 960 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SandyDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SandyDialogue.java new file mode 100644 index 000000000..be3217aee --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SandyDialogue.java @@ -0,0 +1,46 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SandyDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SandyDialogue extends DialoguePlugin { + + public SandyDialogue() { + + } + + public SandyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SandyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nice day for sand isn't it?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3110 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SanfewDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SanfewDialogue.java new file mode 100644 index 000000000..0cb3a771f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SanfewDialogue.java @@ -0,0 +1,146 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the SanfewDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SanfewDialogue extends DialoguePlugin { + + public SanfewDialogue() { + + } + + public SanfewDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SanfewDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What can I do for you young 'un?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getQuestRepository().getQuest("Druidic Ritual").getStage(player) == 20) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Did you bring me the required ingredients for the", "potion?"); + stage = 100; + break; + } + if (player.getQuestRepository().getQuest("Druidic Ritual").getStage(player) == 10) { + interpreter.sendOptions("Select an Option", "I've been sent to help purify the Varrock stone circle.", "Actually, I don't need to speak to you."); + stage = 2; + break; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nothing... I'll just be on my way now."); + stage = 1; + break; + case 1: + end(); + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I've been sent to assist you with the ritual to purify the", "Varrockian stone circle."); + stage = 5; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Actually, I don't need to speak to you."); + stage = 3; + break; + } + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, we all make mistakes sometimes."); + stage = 4; + break; + case 4: + end(); + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, what I'm struggling with right now is the meats", "needed for the potion to honour Guthix. I need the raw", "meat of four different animals for it, but not just any", "old meats will do."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Each meat has to be dipped individually into the", "Cauldron of Thunder for it to work correctly."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where can I find this cauldron?"); + stage = 8; + break; + case 8: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It is located somewhere in the mysterious underground", "halls which are located somewhere in the woods just", "South of here. They are too dangerous for me to go", "myself however."); + player.getQuestRepository().getQuest("Druidic Ritual").setStage(player, 20); + stage = 9; + break; + case 9: + end(); + break; + case 100: + if (player.getInventory().containItems(522, 523, 524, 525)) { + interpreter.sendDialogues(player, null, "Yes, I have all four now!"); + stage = 200; + break; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, not yet..."); + stage = 101; + break; + case 101: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well let me know when you do young 'un."); + stage = 102; + break; + case 102: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll get on with it."); + stage = 103; + break; + case 103: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Good, good."); + stage = 104; + break; + case 104: + end(); + break; + case 200: + interpreter.sendDialogues(npc, null, "Well hand 'em over then lad!"); + stage = 201; + break; + case 201: + interpreter.sendDialogues(npc, null, "Thank you so much adventurer! These meats will allow", "our potion to honour Guthix to be completed, and bring", "one step closer to reclaiming our stone circle!"); + stage = 202; + break; + case 202: + player.getInventory().remove(new Item(522, 1), new Item(523, 1), new Item(524, 1), new Item(525, 1)); + player.getQuestRepository().getQuest("Druidic Ritual").setStage(player, 99); + player.getQuestRepository().syncronizeTab(player); + interpreter.sendDialogues(npc, null, "Now go and talk to Kaqemeex and he will introduce", "you to the wonderful world of herblore and potion", "making!"); + stage = 203; + break; + case 203: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 454 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SaniDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SaniDialogue.java new file mode 100644 index 000000000..6ba5cd88a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SaniDialogue.java @@ -0,0 +1,151 @@ +package core.game.content.dialogue; + +import core.game.system.config.ShopParser; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles the SaniDialogue dialogue. + * @author Vexia + * + */ +@Initializable +public class SaniDialogue extends DialoguePlugin { + + /** + * Constructs the {@code SaniDialgoue} + */ + public SaniDialogue() { + /* + * empty. + */ + } + + /** + * Constructs the {@code SaniDialogue} + * @param player The player instance. + */ + public SaniDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Greetings, " + player.getUsername(), "I sell weapons and armour."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Let me see your stock.", "Where do I get other items, like gloves?", "How do I open these box sets?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Let me see your stock."); + stage = 10; + break; + case 2: + player("Where do I get other items, like gloves and capes?"); + stage = 20; + break; + case 3: + player("How do I open these box sets?"); + stage = 30; + break; + } + break; + case 10: + options("Weapons", "Armour"); + stage++; + break; + case 11: + switch (buttonId) { + case 1: + if (player.getSkills().getLevel(Skills.ATTACK) < 30) { + openWeaponShop(player, 204); + end(); + break; + } + options("Weapons (Bronze - Mithril)", "Weapons (Adamant - Dragon)"); + stage = 12; + break; + case 2: + end(); + ShopParser.Companion.getSHOPS().get(4905).open(player); + break; + } + break; + case 12: + switch (buttonId) { + case 1: + openWeaponShop(player, 204); + end(); + break; + case 2: + openWeaponShop(player, 205); + end(); + break; + } + break; + case 13: + end(); + break; + case 20: + npc("Gloves of all kinds may be feely purchased from the", "Culinaromancer's chest below the Lumbridge Castle.", "On the other hand, high-tier armours can be obtained", "by defeating high-levelled bosses, like the Corporeal Beast."); + stage++; + break; + case 21: + npc("Bossing is not the only source of high-tier armour.", "Try Slayer or Barrows, catching Dragon Implings or", "perhaps even defeating monsters inside the TzHaar", "cave for fabled onyx equipment is more your style."); + stage++; + break; + case 22: + player("I see...", "So this means that you only sell common armours", "to help adventurers like nyself get started in the world", "of Keldagrim."); + stage++; + break; + case 23: + npc("Indeed, that is true. If you have any more questions", "The Keldagrim guide near the green portal should be able", "to assist you further."); + stage = 0; + break; + case 30: + player("How exactly do I open these box sets that you", "are selling?"); + stage++; + break; + case 31: + npc("Take the box set to the Grand Exchange clerk. Right", "click her and select 'sets'. Next, right-click the box", "item that is in your inventory to exchange the set for", "the items that are inside the box."); + stage++; + break; + case 32: + npc("You may always convert the individual items back into", "a box set at any time in order to save banking", "space."); + stage = 0; + break; + } + return true; + } + + /** + * Opens the weapon shop. + * @param player The player. + * @param uid The uid. + */ + private void openWeaponShop(Player player, int uid) { + ShopParser.Companion.openUid(player, uid); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SaniDialogue(player); + } + + @Override + public int[] getIds() { + return new int[] { 4905 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SanibochDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SanibochDialogue.java new file mode 100644 index 000000000..0288317eb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SanibochDialogue.java @@ -0,0 +1,181 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the SanibochDialogue dialogue. + * @author Emperor + * @author 'Vexia + */ +@Initializable +public class SanibochDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code SanibochDialogue} {@code Object}. + */ + public SanibochDialogue() { + + } + + /** + * Constructs a new {@code SanibochDialogue} {@code Object}. + * @param player The player. + */ + public SanibochDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SanibochDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + stage = args.length > 1 ? (Integer) args[1] : 0; + if (stage == 0) { + interpreter.sendDialogues(1595, FacialExpression.HALF_GUILTY, "Good day to you bwana."); + } else { + handle(0, 0); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Can I go through that door please?", "Where does this strange entrance lead?", "Good day to you too.", "I'm impressed, that tree is growing on that shed."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Can I go through that door please?"); + stage = 10; + break; + case 2: + player("Where does this strange entrance lead?"); + stage = 20; + break; + case 3: + player("Good day to you too."); + stage = -1; + break; + case 4: + player("I'm impressed, that tree is growing on that shed."); + stage = 40; + break; + } + break; + case 10: + if (player.getAttribute("saniboch:paid", false)) { + npc("Most certainly, you have already given me lots of nice", "coins."); + stage = -1; + break; + } + npc("Most certainly, but I must charge you the sum of 875", "coins first."); + stage = 11; + break; + case 11: + if (!player.getInventory().contains(995, 875)) { + player("I don't have the money on me at the moment."); + stage = -1; + break; + } + options("Ok, here's 875 coins.", "Never mind.", "Why is it worth the entry cost?"); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("Ok, here's 875 coins."); + stage = 32; + break; + case 2: + player("Never mind."); + stage = -1; + break; + case 3: + player("Why is it worth the entry cost?"); + stage = 30; + break; + } + break; + case 20: + npc("To a huge fearsome dungeon, populated by giants and", "strange dogs. Adventurers come from all around to", "explore its depths."); + stage = 21; + break; + case 21: + npc("I know not what lies deeper in myself, for my skills in", "agility and woodcutting are inadequate."); + stage = -1; + break; + case 30: + npc("It leads to a huge fearsome dungeon, populated by", "giants and strange dogs. Adventurers come from all", "around to explore its depths."); + stage = 31; + break; + case 31: + npc("I know not what lies deeper in myself, for my skills in", "agility and woodcutting are inadequate, but I hear tell", "of even greater dangers deeper in."); + stage = -1; + break; + case 32: + Item item = new Item(995, 875); + if (player.getInventory().remove(item)) { + player.getPacketDispatch().sendMessage("You pay Saniboch 875 coins."); + player.setAttribute("saniboch:paid", true); + interpreter.sendItemMessage(item, "You give Saniboch 875 coins."); + stage = 33; + break; + } + end(); + break; + case 33: + npc("Many thanks. You may now pass the door. May your", "death be a glorious one!"); + stage = -1; + break; + case 35: + if (player.getAttribute("saniboch:paid", false)) { + npc("You have already given me lots of nice coins, you may", "go in."); + stage = -1; + break; + } + if (!player.getInventory().contains(995, 875)) { + player("I don't have the money on me at the moment."); + stage = 36; + break; + } + stage = 12; + handle(interfaceId, 1); + break; + case 36: + npc("Well this is a dungeon for the more wealthy discerning", "adventurer, be gone with your riff raff."); + stage = 37; + break; + case 37: + player("But you don't even have clothes, how can you seriously", "call anyone riff raff."); + stage = 38; + break; + case 38: + npc("Hummph."); + stage = -1; + break; + case 40: + npc("My employer tells me it is an uncommon sort of tree", "called the Fyburglars tree."); + stage = -1; + break; + case -1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1595 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SarahFarmingPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/SarahFarmingPlugin.java new file mode 100644 index 000000000..b657694e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SarahFarmingPlugin.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SarahFarmingPlugin dialogue. + * @author 'Vexia + */ +@Initializable +public class SarahFarmingPlugin extends DialoguePlugin { + + public SarahFarmingPlugin() { + + } + + public SarahFarmingPlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SarahFarmingPlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to see what I have in stock?"); + stage = 2; + break; + case 2: + interpreter.sendOptions("Select an Option", "Yes please.", "No, thank you."); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 20; + break; + + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2304 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SawmillOperator.java b/Server/src/main/java/Server/core/game/content/dialogue/SawmillOperator.java new file mode 100644 index 000000000..11779c29d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SawmillOperator.java @@ -0,0 +1,95 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SawmillOperator dialogue. + * @author Vexia + */ +@Initializable +public class SawmillOperator extends DialoguePlugin { + + public SawmillOperator() { + + } + + public SawmillOperator(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SawmillOperator(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Do you want me to make some planks for you? Or", "would you be interested in some other housing supplies?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Planks please!", "What kind of planks can you make?", "Can I buy some housing supplies?", "Nothing, thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Planks please!"); + stage = 10; + break; + case 2: + player("What kind of planks can you make?"); + stage = 20; + break; + case 3: + end(); + npc.openShop(player); + break; + case 4: + player("Nothing, thanks."); + stage = 40; + break; + } + break; + case 40: + npc("Well come back when you want some. You can't get", "good quality planks anywhere but here!"); + stage = 999; + break; + case 10: + npc("What kind of planks do you want?"); + stage = 11; + break; + case 11: + end(); + player.getInterfaceManager().open(new Component(403)); + break; + case 20: + npc("I can make planks from wood, oak, teak and mahogany.", "I don't make planks from other woods as they're no", "good for making furniture."); + stage = 21; + break; + case 21: + npc("Wood and oak are all over the place, but teak and", "mahogany can only be found in a few places like", "Karamja and Etceteria."); + stage = 999; + break; + case 999: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4250 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SbottDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SbottDialogue.java new file mode 100644 index 000000000..19e86753c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SbottDialogue.java @@ -0,0 +1,101 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.crafting.TanningProduct; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Handles the SbottDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SbottDialogue extends DialoguePlugin { + + public SbottDialogue() { + + } + + public SbottDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SbottDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello stranger. Would you like to me to tan any hides for", "you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + // interpreter.sendDialogues(npc, FacialExpression.NORMAL, + // "Soft leather - 2 gp per hide","Hard leather - 5 gp per hide","Snakeskins - 25 gp per hide","Dragon leather - 45 gp per hide."); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Soft leather - 1 gp per hide", "Hard leather - 3 gp per hide", "Snakeskins - 20 gp per hide", "Dragon leather - 20 gp per hide."); + stage = 1; + break; + case 1: + player.getInventory().refresh(); + Item items[] = player.getInventory().toArray(); + for (int i = 0; i < items.length; i++) { + if (items[i] == null) { + continue; + } + if (TanningProduct.forItemId(items[i].getId()) != null) { + interpreter.sendDialogues(npc, null, "I see you have brought me some hides.", "Would you like me to tan them for you?"); + stage = 100; + return true; + } + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I haven't any hides."); + stage = 2; + break; + case 2: + end(); + break; + case 100: + interpreter.sendOptions("Select an Option", "Yes please.", "No thanks."); + stage = 101; + break; + case 101: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Yes please."); + stage = 210; + break; + case 2: + interpreter.sendDialogues(player, null, "No thanks."); + stage = 200; + break; + } + break; + case 210: + end(); + TanningProduct.open(player, 2824); + break; + case 200: + interpreter.sendDialogues(npc, null, "Very well, sir, as you wish."); + stage = 201; + break; + case 201: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1041 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ScavvoDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ScavvoDialogue.java new file mode 100644 index 000000000..c9987c2c5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ScavvoDialogue.java @@ -0,0 +1,55 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the ScavvoDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class ScavvoDialogue extends DialoguePlugin { + + public ScavvoDialogue() { + + } + + public ScavvoDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new ScavvoDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "'Ello matey! D'ya wanna buy some exiting new toys?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Let's have a look then."); + stage = 1; + break; + case 1: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 537 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ScorpiasOffspringDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ScorpiasOffspringDialogue.java new file mode 100644 index 000000000..0c145077f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ScorpiasOffspringDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Dialogue for the boss pet, Scorpia JR + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class ScorpiasOffspringDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + */ + public ScorpiasOffspringDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + * @param player the player. + */ + public ScorpiasOffspringDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ScorpiasOffspringDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "At night time, if I were to hold ultraviolet", "light over you, would you glow?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Two things wrong there, human."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "One, when has it ever been night time here?"); + stage = 3; + break; + case 3: + npc("Two, when have you ever seen ultraviolet light", "around here?"); + stage = 4; + break; + case 4: + npc("In answer to your question though.","Yes I, like every scorpion, would glow."); + stage = 5; + break; + case 5: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8598 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SeamanDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/SeamanDialoguePlugin.java new file mode 100644 index 000000000..a5330fe1d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SeamanDialoguePlugin.java @@ -0,0 +1,156 @@ +package core.game.content.dialogue; + +import core.game.container.impl.EquipmentContainer; +import core.plugin.Initializable; +import core.tools.Items; +import core.game.content.global.travel.ship.Ships; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; + +/** + * Represents the dialogue used to handle the sailing from and to karamja. + * + * @author Vexia + */ +@Initializable +public class SeamanDialoguePlugin extends DialoguePlugin { + + /** + * Constructs a new {@code SeamanDialoguePlugin} {@code Object}. + */ + public SeamanDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SeamanDialoguePlugin} {@code Object}. + * + * @param player the player. + */ + public SeamanDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SeamanDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length > 1 && player.getQuestRepository().isComplete("Pirate's Treasure")) { + if (player.getEquipment().get(EquipmentContainer.SLOT_RING) != null && player.getEquipment().get(EquipmentContainer.SLOT_RING).getId() == Items.RING_OF_CHAROSA_6465) { + travel(); + } else if (player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA).isComplete(0)) { + pay(15); + } else { + pay(30); + } + return true; + } else { + player.getPacketDispatch().sendMessage("You may only use the Pay-fare option after completing Pirate's Treasure."); + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you want to go on a trip to Karamja?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The trip will cost you 30 coins."); + stage = 1; + break; + case 1: + boolean charos = false; + if (player.getEquipment().get(EquipmentContainer.SLOT_RING) != null) { + charos = player.getEquipment().get(EquipmentContainer.SLOT_RING).getId() == Items.RING_OF_CHAROSA_6465; + } + if (charos) { + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you.", "(Charm) Or I could pay you nothing at all..."); + } else { + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you."); + } + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + if (player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA).isComplete(0)) { + stage = 9; + } else { + stage = 11; + } + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Or I could pay you nothing at all..."); + stage = 5; + break; + } + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Mmmm ... Nothing at all you say ..."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, why not - jump aboard then."); + if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(1,10)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player, 1,10, true); + } + stage = 30; + break; + case 9: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Wait a minute... Aren't those Karamja gloves?", "Thought I'd seen you helping around the island.", "You can go on half price - 15 coins."); + stage = 10; + break; + case 10: + pay(15); + break; + case 11: + pay(30); + break; + case 20: + end(); + break; + case 30: + travel(); + + } + return true; + } + + /** + * Method used to pay the fare. + */ + public void pay(int price) { + if (!player.getInventory().contains(995, price)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't have enough coins for that."); + stage = 20; + } else { + player.getInventory().remove(new Item(995, price)); + player.getPacketDispatch().sendMessage("You pay " + price + " coins and board the ship."); + travel(); + } + } + + public void travel() { + end(); + Ships.PORT_SARIM_TO_KARAMAJA.sail(player); + } + + @Override + public int[] getIds() { + return new int[]{377, 378, 376}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SeerBartenderDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SeerBartenderDialogue.java new file mode 100644 index 000000000..492bd93f2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SeerBartenderDialogue.java @@ -0,0 +1,154 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the SeerBartenderDialogur dialogue. + * @author 'Vexia + */ +@Initializable +public class SeerBartenderDialogue extends DialoguePlugin { + + public SeerBartenderDialogue() { + + } + + public SeerBartenderDialogue(Player player) { + super(player); + } + + public void buy(int item, int ammount) { + if (player.getInventory().freeSlots() == 0) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't seem to have room, sorry."); + stage = 99; + } + if (!player.getInventory().contains(995, ammount)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't seem to have enough coins."); + stage = 99; + } else { + end(); + player.getInventory().remove(new Item(995, ammount)); + player.getInventory().add(new Item(item, 1)); + if (item == 1917) { + player.getPacketDispatch().sendMessage("You buy a beer."); + } else if (item == 2327) { + player.getPacketDispatch().sendMessage("You buy a nice hot meat pie."); + } else { + player.getPacketDispatch().sendMessage("You buy a bowl of home made stew."); + } + } + } + + @Override + public int[] getIds() { + return new int[] { 738, 737 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What do you have?", "Beer please.", "I don't really want anything thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do you have?"); + stage = 30; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Beer please."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't really want anything thanks."); + stage = 67; + break; + + } + break; + case 67: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well we have beer, or if you want some food, we have", "our home made stew and meat pies."); + stage = 31; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "One beer comng up. Ok, that'll be two coins."); + stage = 101; + break; + case 10: + end(); + break; + case 31: + interpreter.sendOptions("Select an Option", "Beer please.", "I'll try the meat pie.", "Could I have some stew please?", "I don't really want anything thanks."); + stage = 32; + break; + case 32: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Beer please."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll try the meat pie."); + stage = 200; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Could I have some stew please?"); + stage = 300; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't really want anything thanks."); + stage = 99; + break; + + } + break; + case 99: + end(); + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "One beer comng up. Ok, that'll be two coins."); + stage = 101; + break; + case 101: + buy(1917, 2); + break; + case 200: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Okay, that will be 16 coins."); + stage = 201; + break; + case 201: + buy(2327, 16); + break; + case 300: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A bowl of stew, that'll be 20 coins please."); + stage = 301; + break; + case 301: + buy(2003, 20); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SeerBartenderDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Good morning, what would you like?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SeerDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/SeerDialoguePlugin.java new file mode 100644 index 000000000..d057b5f0d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SeerDialoguePlugin.java @@ -0,0 +1,162 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SeerDialoguePlugin dialogue. + * + * @author 'afaroutdude + */ +@Initializable +public class SeerDialoguePlugin extends DialoguePlugin { + + public SeerDialoguePlugin() { + } + + public SeerDialoguePlugin(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[]{388}; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SeerDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + // npc("Uh, what was that dark force? I've never sensed", "anything like it..."); // https://www.youtube.com/watch?v=mYsxit46rGo May 14 2010 + // npc("Anyway, sorry about that."); + options("Talk about something else.", "Talk about achievement diary."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + AchievementDiary diary = player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE); + int level = 0; + + switch (stage) { + case 999: + end(); + break; + case 0: + switch (buttonId) { + case 1: + npc("Many greetings."); + stage = 1; + break; + case 2: + if (!diary.isStarted(level)) { + player("Do you have an Achievement Diary for me?"); + stage = 100; + break; + } + else if (diary.isLevelRewarded(level) && !player.hasItem(diary.getType().getRewards()[level][0])) { + player("I seem to have lost my seers' headband..."); + stage = 80; + break; + } + else if (diary.isLevelRewarded(level)) { + player("Can you remind me what my headband does?"); + stage = 90; + break; + } + else if (diary.isComplete(level, true)) { + player("Hi. I've completed the Easy tasks in my Achievement", "Diary."); + stage = 200; + break; + } + else { + player("Hi! Can you help me out with the Achievement Diary", "tasks?"); + stage = 101; + break; + } + } + break; + case 80: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("Here's your replacement. Please be more careful."); + stage = 999; + break; + case 90: + npc("Your headband marks you as an honourary seer.", "Geoffrey - who works in the field to the", "south - will give you free flax every day."); + stage = 999; + break; + case 100: + npc("I certainly do - we have a set of tasks spanning Seers'", "Village, Catherby, Hemenster and the Sinclair Mansion.", "Just complete the tasks listed in the Achievement Diary", "and they will be ticked off automatically."); + stage = 999; + break; + case 101: + npc("I'm afraid not. It is important that adventurers", "complete the tasks unaided. That way, only the truly", "worthy collect the spoils."); + stage = 999; + break; + case 200: + npc("Well done, adventurer. You are clearly a " + (player.isMale() ? "man" : "woman") + "of", "great wisdom. I have a gift for you."); + stage++; + break; + case 201: + if (!player.getInventory().hasSpaceFor(diary.getType().getRewards(level))) { + npc("Come back when you have two free inventory slots."); + stage = 999; + } else { + diary.setLevelRewarded(level); + player.getInventory().add(diary.getType().getRewards()[level][0]); + player.getInventory().add(diary.getType().getRewards()[level][1]); + interpreter.sendItemMessage(diary.getType().getRewards()[level][0], "The seer hands you a strange-looking headband and a", "rusty lamp."); + stage++; + } + break; + case 202: + npc("You are now an honourary seer and Geoffrey - who", "works in the field to the south - will give you free flax", "every day. Don't call him 'Geoffrey' though: he prefers", "to be known as 'Flax'."); + stage++; + break; + case 203: + player("Flax? What sort of name is that for a person."); + stage++; + break; + case 204: + npc("I know, I know. The poor boy is a simple soul - he just", "really loves picking flax. A little too much, I fear."); + stage=999; + break; + + case 1: + options("Many greetings.", "I seek knowledge and power!"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Many greetings."); + stage = 10; + break; + case 2: + player("I seek knowledge and power!"); + stage = 20; + break; + } + break; + case 10: + npc("Remember, whenever you set out to do something,", "something else must be done first."); + stage = 999; + break; + case 20: + npc("Knowledge comes from experience, power", "comes from battleaxes."); + stage = 999; + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SeravelDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SeravelDialogue.java new file mode 100644 index 000000000..e7b5ff147 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SeravelDialogue.java @@ -0,0 +1,101 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.tools.Items; + +@Initializable +public class SeravelDialogue extends DialoguePlugin { + public SeravelDialogue() { + } + public SeravelDialogue(Player player) { + super(player); + } + + private static final Item COINS = new Item(995, 20); + private static final Item TICKET = new Item(Items.SHIP_TICKET_621); + + @Override + public DialoguePlugin newInstance(Player player) { + return new SeravelDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hello."); + stage = -1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + break; + case -1: + npc("Hello Bwana. Are you interested in buying a ticket", "for the 'Lady of the Waves'?"); + stage++; + break; + case 0: + options("Yes, that sounds great!", "No thanks.", "Tell me more about the ship."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Yes, that sounds great!"); + stage = 10; + break; + case 2: + player("No thanks."); + stage = 20; + break; + case 3: + player("Tell me more about the ship."); + stage = 30; + break; + } + break; + case 10: + if (player.getInventory().containsItem(COINS)) { + if (player.getInventory().hasSpaceFor(TICKET)) { + npc("Great, nice doing business with you."); + player.getInventory().remove(COINS); + player.getInventory().add(TICKET); + } else { + npc("Sorry Bwana, you don't have enough space. Come back", "when you do!"); + } + } else { + npc("Sorry Bwana, you don't have enough money. Come back", "when you have 25 Gold Pieces."); + } + stage = 999; + break; + case 20: + npc("Fair enough Bwana, let me know if you change your", "mind."); + stage = 999; + break; + case 30: + npc("It's a ship that can take you to either Port Sarim", "or Port Khazard. The ship lies west of Shilo Village", "and south of Cairn Island."); + stage++; + break; + case 31: + npc("The tickets cost 25 Gold Pieces. Would you like to", "purchase a ticket Bwana?"); + stage++; + break; + case 32: + options("Yes, that sounds great!", "No thanks."); + stage = 1; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 514 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ServantDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ServantDialogue.java new file mode 100644 index 000000000..db100a414 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ServantDialogue.java @@ -0,0 +1,62 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the ServantDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class ServantDialogue extends DialoguePlugin { + + public ServantDialogue() { + + } + + public ServantDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new ServantDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Look, I'd better not talk. I'll get in trouble."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "If you want someone to show you round the castle ask", "Eohric, the Head Servant."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1081 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SethGroatsDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SethGroatsDialogue.java new file mode 100644 index 000000000..2606158d1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SethGroatsDialogue.java @@ -0,0 +1,46 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SethGroatsDialogue dialogue. + * @author Vexia + */ +@Initializable +public class SethGroatsDialogue extends DialoguePlugin { + + public SethGroatsDialogue() { + + } + + public SethGroatsDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SethGroatsDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "M'arnin'... going to milk me cowsies!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 452 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ShanomiDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ShanomiDialogue.java new file mode 100644 index 000000000..31ebd34d1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ShanomiDialogue.java @@ -0,0 +1,142 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * The dialogue used for shanomi. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ShanomiDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code Shanomi} {@code Object}. + */ + public ShanomiDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code Shanomi} {@code Object}. + * @param player the player. + */ + public ShanomiDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ShanomiDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, null, "Greetings " + player.getUsername() + ". Welcome you are in the test of", "combat."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What do I do here?", "Where do the machines come from?", "May I claim my tokens please?", "Bye."); + stage = 1; + break; + case 1: + if (buttonId == 1) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What do I do here?"); + stage = 2; + } else if (buttonId == 2) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where do the machines come from?"); + stage = 11; + } else if (buttonId == 3) { + end(); + player.getDialogueInterpreter().open("wg:claim-tokens", npc.getId()); + } else if (buttonId == 4) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Bye."); + stage = 16; + } + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A spare suit of plate armour need you will. Full helm", "plate, leggings and platebody. Placing it in the centre", "of the magical machines you will be doing. KA-POOF!", "The armour it attacks most furiously as if alive! Kill it"); + stage = -3; + break; + case -3: + npc("you must, yes."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So I use a full set of plate armour on the centre plate of", "the machines and it will animate it? Then I have to kill my", "own armour... how bizarre!"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes. It is as you are saying. For this earn tokens you", "will. Also gain experience in combat you will. Trained", "long and hard here have I."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You're not from around here are you...?"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It is as you say."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So will I lose my armour?"); + stage = 8; + break; + case 8: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Lose armour you will if damaged to much it becomes.", "Rare this is, but still possible. If kill you the armour does,", "also lose armour you will."); + stage = 9; + break; + case 9: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So, occasionally I might lose a bit because it's being", "bashed about and I'll obviously lose it if I die... that it?"); + stage = 10; + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It is as you say."); + stage = 0; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Make them I did, with magics."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Magic, in the Warrior's Guild?"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A skilled warrior also am I. Harrallak mistakes does not", "make. Potential in my invention he sees and opportunity", "grasps."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I see, so you made the magical machines and Harrallak", "saw how they could be used in the guild to train warrior's", "combat... interesting. Harrallak certainly is an intelligent", "guy."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It is as you say."); + stage = 0; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Health be with you travelling."); + stage = 100; + break; + case 100: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4290 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ShantayDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ShantayDialogue.java new file mode 100644 index 000000000..16c9fa469 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ShantayDialogue.java @@ -0,0 +1,294 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the dialogue plugin used for shantay. + * @author Vexia + * @version 1.0 + */ +@Initializable +public final class ShantayDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ShantayDialogue} {@code Object}. + */ + public ShantayDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ShantayDialogue} {@code Object}. + * @param player the player. + */ + public ShantayDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ShantayDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args[0] != null && args[0] instanceof NPC) { + npc = (NPC) args[0]; + } + if (args.length == 2) { + player.getPacketDispatch().sendMessage("Shantay saunters over to talk with you."); + interpreter.sendDialogues(836, FacialExpression.HALF_GUILTY, "If you want to be let out, you have to pay a fine of", "five gold. Do you want to pay now?"); + stage = 703; + return true; + } + interpreter.sendDialogues(836, FacialExpression.HALF_GUILTY, "Hello effendi, I am Shantay."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(836, FacialExpression.HALF_GUILTY, "I see you're new. Please read the billboard poster", "before going into the desert. It'll give yer details on the", "dangers you can face."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(836, FacialExpression.HALF_GUILTY, "There is a heartbroken mother just past the gates and", "in the desert. Her name is Irena and she mourns her", "lost daughter. Such a shame."); + stage = 2; + break; + case 2: + interpreter.sendOptions("Select an Option", "What is this place?", "Can I see what you have to sell please?", "I must be going.", "I want to buy a Shantay pass for 5 gold coins."); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is this place?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I see what you have to sell please?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I must be going."); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I want to buy a Shantay pass for 5 gold coins."); + stage = 40; + break; + + } + break; + case 40: + if (!player.getInventory().contains(995, 5)) { + end(); + return true; + } + if (player.getInventory().remove(new Item(995, 5))) { + player.getInventory().add(new Item(1854)); + interpreter.sendItemMessage(1854, "You purchase a Shantay Pass."); + } else { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough money."); + } + stage = 41; + break; + case 41: + end(); + break; + case 30: + interpreter.sendDialogues(836, FacialExpression.HALF_GUILTY, "So long..."); + stage = 31; + break; + case 31: + end(); + break; + case 10: + interpreter.sendDialogues(836, FacialExpression.HALF_GUILTY, "This is the pass of Shantay. I guard this area with my", "men. I am responsible for keeping this pass open and", "repaired."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(836, FacialExpression.HALF_GUILTY, "My men and I prevent outlaws from getting out of the", "desert. And we stop the inexeperienced from a dry death", "in the sands. Which would you say you were?"); + stage = 12; + break; + case 12: + interpreter.sendOptions("Select an Option", "I am definitely an outlaw, prepare to die!", "I am a little inexperienced.", "Er, neither, I'm an adventurer."); + stage = 13; + break; + case 13: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I am definitely an outlaw, prepare to die."); + stage = 700; + break; + case 2: + interpreter.sendDialogues(player, null, "I am a little inexperienced."); + stage = 710; + break; + case 3: + interpreter.sendDialogues(player, null, "Er, neither, I'm an adventurer."); + stage = 720; + break; + } + break; + case 20: + interpreter.sendDialogues(836, FacialExpression.HALF_GUILTY, "Absolutely Effendi!"); + stage = 21; + break; + case 21: + end(); + npc.openShop(player); + break; + case 700: + interpreter.sendDialogues(836, null, "Ha, very funny....."); + stage = 701; + break; + case 701: + interpreter.sendDialogues(836, null, "Guards arrest him!"); + stage = 702; + break; + case 702: + player.getPacketDispatch().sendMessage("The guards arrest you and place you in the jail."); + close(); + player.lock(10); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.setAttribute("/save:shantay-jail", true); + player.getProperties().setTeleportLocation(Location.create(3298, 3123, 0)); + interpreter.sendDialogues(836, null, "You'll have to stay in there until you pay the fine of", "five gold pieces. Do you want to pay now?"); + stage = 703; + return true; + } + }); + break; + case 703: + interpreter.sendOptions("Select an Option", "Yes, okay.", "No thanks, you're not having my money."); + stage = 704; + break; + case 704: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Yes, okay."); + stage = 705; + break; + case 2: + interpreter.sendDialogues(player, null, "No thanks, you're not having my money."); + stage = 800; + break; + } + break; + case 705: + if (player.getInventory().remove(new Item(995, 5))) { + player.getPacketDispatch().sendMessage("You hand over the five gold pieces to Shantay."); + player.getPacketDispatch().sendMessage("Shantay unlocks the door to the cell."); + interpreter.sendDialogues(836, null, "Great, Effendi, now please try to keep the peace."); + player.removeAttribute("shantay-jail"); + stage = 822; + } else { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough money."); + stage = 825; + } + break; + case 800: + interpreter.sendDialogues(836, null, "You have a choice. You can either pay five gold pieces", "or... You can be transported to a maximum security", "prision in Port Sarim"); + stage = 801; + break; + case 801: + interpreter.sendDialogues(836, null, "Will you pay the five gold pieces?"); + stage = 802; + break; + case 802: + interpreter.sendOptions("Select an Option", "Yes, okay.", "No, do your worst!"); + stage = 803; + break; + case 803: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Yes, okay."); + stage = 820; + break; + case 2: + interpreter.sendDialogues(player, null, "No, do your worst!"); + stage = 804; + break; + } + break; + case 804: + interpreter.sendDialogues(836, null, "You are to be transported to a maximum security", "prision in Port Sarim. I hope you've learn an important", "lesson from this."); + stage = 805; + break; + case 805: + player.getPacketDispatch().sendMessage("You find yourself in a prison."); + player.removeAttribute("shantay-jail"); + player.getProperties().setTeleportLocation(Location.create(3018, 3188, 0)); + end(); + break; + case 820: + interpreter.sendDialogues(836, null, "Good, I see that you have come to your senses."); + stage = 821; + break; + case 821: + if (player.getInventory().remove(new Item(995, 5))) { + player.getPacketDispatch().sendMessage("You hand over the five gold pieces to Shantay."); + player.getPacketDispatch().sendMessage("Shantay unlocks the door to the cell."); + interpreter.sendDialogues(836, null, "Great, Effendi, now please try to keep the peace."); + stage = 822; + } else { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough money."); + stage = 825; + } + break; + case 822: + end(); + break; + case 825: + end(); + break; + case 710: + interpreter.sendDialogues(836, null, "Can I recommend that you purchase a full waterskin", "and a knife! These items will no doubt save your life. A", "waterskin will keep water from evaporating in the desert."); + stage = 711; + break; + case 711: + interpreter.sendDialogues(836, null, "And a keen woodsman with a knife can extract juice", "from a cactus. Before you go into the desert, it's", "advisable to wear desert clothes. It's very hot in the", "desert and you'll surely cook if you wear amour."); + stage = 712; + break; + case 712: + end(); + break; + case 720: + interpreter.sendDialogues(836, null, "Great, I have just the thing for you the desert adventurer.", "I sell desert clothes which will keep you cool in the heat", "of the desert. I also sell waterskins so that you won't", "die in the desert."); + stage = 721; + break; + case 721: + interpreter.sendDialogues(836, null, "A waterskin and a knife help you survive from the juice", "of a cactus. Use the chest to store your items, we'll take", "them to the bank. It's hot in the desert, you'll bake in", "all that armour."); + stage = 722; + break; + case 722: + interpreter.sendDialogues(836, null, "To keep the pass open we ask for 5 gold pieces. And", "we give you a Shantay Pass, just ask to see what I sell", "to buy one."); + stage = 723; + break; + case 723: + end(); + break; + case 730: + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 836 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ShantayGuard.java b/Server/src/main/java/Server/core/game/content/dialogue/ShantayGuard.java new file mode 100644 index 000000000..43ecd4b00 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ShantayGuard.java @@ -0,0 +1,162 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.path.Pathfinder; +import core.game.world.repository.Repository; + +/** + * Represents the dialogue used for a shantay guard. + * @author Vexia + * @version 1.0 + */ +@Initializable +public final class ShantayGuard extends DialoguePlugin { + + /** + * Represents a shantay pass item. + */ + private static final Item PASS = new Item(1854); + + /** + * Constructs a new {@code ShantayGuard} {@code Object}. + */ + public ShantayGuard() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ShantayGuard} {@code Object}. + * @param player the player. + */ + public ShantayGuard(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ShantayGuard(player); + } + + @Override + public boolean open(Object... args) { + if (args[0] != null && args[0] instanceof NPC) { + npc = ((NPC) args[0]); + } + if (args.length == 2) { + interpreter.sendDialogues(838, null, "Can I see your Desert Pass please?"); + stage = 13; + return true; + } + if (npc != null && npc.getId() != 837) { + interpreter.sendDialogues(838, FacialExpression.HALF_GUILTY, "Hello there!"); + stage = 0; + } else { + interpreter.sendDialogues(838, null, "Go talk to Shantay. I'm on duty and I don't have time", "to talk to the likes of you!"); + stage = 100; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(838, FacialExpression.HALF_GUILTY, "What can I do for you?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "I'd like to go into the desert please.", "Nothing thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like to go into the desert please."); + stage = 10; + break; + case 2: + end(); + break; + } + break; + case 10: + interpreter.sendDialogues(838, FacialExpression.HALF_GUILTY, "Of course!"); + stage = 11; + break; + case 11: + if (!player.getInventory().containsItem(PASS)) { + player.getDialogueInterpreter().sendDialogues(Repository.findNPC(838), null, "You need a Shantay pass to get through this gate. See", "Shantay, he will sell you one for a very reasonable", "price."); + stage = 12; + return true; + } + interpreter.sendDialogues(838, null, "Can I see your Desert Pass please?"); + stage = 13; + break; + case 12: + end(); + break; + case 13: + if (!player.getInventory().containsItem(PASS)) { + player("Sorry, I don't have one with me."); + stage = 101; + return true; + } + interpreter.sendItemMessage(PASS, "You hand over a Shantay Pass."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(player, null, "Sure, here you go!"); + stage = 15; + break; + case 15: + if (player.getInventory().remove(PASS)) { + final Location dest = player.getLocation().getY() < 3304 ? Location.create(3303, 3117, 0) : Location.create(3305, 3117, 0); + Pathfinder.find(player, dest).walk(player); + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + if (player.getLocation().equals(dest)) { + player.unlock(); + handleShantayPass(player); + return true; + } + return false; + } + }); + } + end(); + break; + case 100: + interpreter.sendDialogue("The guard seems quite bad tempered, probably from having to wear", "heavy armour in this intense heat."); + stage = 101; + break; + case 101: + end(); + break; + } + return true; + } + + /** + * Method used to handle the shantay pass. + * @param player the player. + */ + public static void handleShantayPass(Player player) { + AgilityHandler.walk(player, 0, player.getLocation(), player.getLocation().transform(0, player.getLocation().getY() > 3116 ? -2 : 2, 0), null, 0, null); + } + + @Override + public int[] getIds() { + return new int[] { 837, 838 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ShilopDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ShilopDialogue.java new file mode 100644 index 000000000..6b5e61f13 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ShilopDialogue.java @@ -0,0 +1,240 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the shilop npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ShilopDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 100); + + /** + * Represents the id. + */ + private int id; + + /** + * Constructs a new {@code ShilopDialogue} {@code Object} + */ + public ShilopDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ShilopDialogue} {@code Object}. + * @param player the player. + */ + public ShilopDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ShilopDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args[0] instanceof NPC) { + id = ((NPC) args[0]).getId(); + } else if (args[0] instanceof Integer) { + id = (Integer) args[0]; + } + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + switch (quest.getStage(player)) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello again."); + stage = 0; + break; + case 10: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there, I've been looking for you."); + stage = 100; + break; + case 20: + case 30: + case 40: + case 50: + interpreter.sendDialogues(player, null, "Where did you say you saw Fluffs?"); + stage = 130; + break; + default: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello again."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + switch (stage) { + case 0: + interpreter.sendDialogues(id, FacialExpression.OLD_NORMAL, "You think you're tough do you?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Pardon?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(id, FacialExpression.OLD_NORMAL, "I can beat anyone up!"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(783, FacialExpression.OLD_NORMAL, "He can you know!"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Really?"); + stage = 5; + break; + case 5: + interpreter.sendDialogue("The boy begins to jump around with his fists up.", "You wonder what sort of desperado he'll grow up to be."); + stage = 6; + break; + case 6: + end(); + break; + case 100:// stage 10 + interpreter.sendDialogues(id, FacialExpression.OLD_NORMAL, "I didn't mean to take it! I just forgot to pay."); + stage = 101; + break; + case 101: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What? I'm trying to help your mum find Fluffs."); + stage = 102; + break; + case 102: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "I might be able to help. Fluffs followed me to our secret", "play area and I haven't seen her since."); + stage = 103; + break; + case 103: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where is this play area?"); + stage = 104; + break; + case 104: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "If I told you that, it wouldn't be a secret."); + stage = 105; + break; + case 105: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What will make you tell me?"); + stage = 106; + break; + case 106: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "Well...now you ask, I am a bit short on cash."); + stage = 107; + break; + case 107: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How much?"); + stage = 108; + break; + case 108: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "10 coins."); + stage = 109; + break; + case 109: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "10 coins?!"); + stage = 110; + break; + case 110: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "I'll handle this."); + stage = 111; + break; + case 111: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "100 coins should cover it."); + stage = 112; + break; + case 112: + interpreter.sendDialogues(player, null, "100 coins! Why should I pay you?"); + stage = 113; + break; + case 113: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "You shouldn't, but we won't help otherwise. We never", "liked that cat anyway, so what do you say?"); + stage = 114; + break; + case 114: + interpreter.sendOptions("Select an Option", "I'm not paying you a penny.", "Okay then, I'll pay."); + stage = 115; + break; + case 115: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I'm not paying you a penny."); + stage = 116; + break; + case 2: + interpreter.sendDialogues(player, null, "Okay then, I'll pay."); + stage = 118; + break; + } + break; + case 116: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "Okay then, I'll find another way to make money."); + stage = 117; + break; + case 117: + end(); + break; + case 118: + if (!player.getInventory().containsItem(COINS)) { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough coins."); + stage = 117; + return true; + } + if (player.getInventory().remove(COINS)) { + interpreter.sendItemMessage(COINS, "You give the lad 100 coins."); + stage = 119; + } else { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough coins."); + stage = 117; + } + quest.setStage(player, 20); + break; + case 119: + interpreter.sendDialogues(player, null, "There you go, now where did you see Fluffs?"); + stage = 120; + break; + case 120: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "We play at an abandoned lumber mill to the north east.", "Just beyond the Jolly Boar Inn. I saw Fluffs running", "around in there."); + stage = 121; + break; + case 121: + interpreter.sendDialogues(player, null, "Anything else?"); + stage = 122; + break; + case 122: + interpreter.sendDialogues(id == 781 ? 783 : 781, null, "Well, you'll have to find the broken fence to get in. I'm", "sure you can manage that."); + stage = 123; + break; + case 123: + end(); + break; + case 130: + interpreter.sendDialogues(id, null, "Weren't you listening? I saw the flea bag in the old", "lumber mill just north east of here. Just walk past the", "Jolly Boar Inn and you should find it."); + stage = 131; + break; + case 131: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 781 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ShopkeeperDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ShopkeeperDialogue.java new file mode 100644 index 000000000..053cd4fa4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ShopkeeperDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the generic shop keeper dialogue. + * @author Vexia + */ +@Initializable +public final class +ShopkeeperDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ShopkeeperDialogue} {@code Object}. + */ + public ShopkeeperDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ShopkeeperDialogue} {@code Object}. + * @param player the player. + */ + public ShopkeeperDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ShopkeeperDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can I help you at all?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please. What are you selling?", "No, thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Yes, please. I'd like to see your stock."); + stage = 11; + break; + case 2: + player("No thanks, I must be going now."); + stage = 10; + break; + } + break; + case 10: + end(); + break; + case 11: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 523, 522, 520, 521, 1699,555 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SigmundDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SigmundDialogue.java new file mode 100644 index 000000000..faf0ddd01 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SigmundDialogue.java @@ -0,0 +1,123 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SigmundDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SigmundDialogue extends DialoguePlugin { + + int[] TLTNPCS = {278,0,519,2244,3777}; + + public SigmundDialogue() { + + } + + public SigmundDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 2082, 2083, 2090, 3713, 3716, 3717, 3718, 3719, 3720, 4328, 4331, 4332, 4333, 4334, 4335 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Do you have any quests for me?", "Who are you?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you have any quests for me?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 20; + break; + + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm the Duke's advisor."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you give me any advice then?"); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I only advise the Duke. But if you want to make", "yourself useful, there are evil goblins to slay on the", "other side of the river."); + stage = 23; + break; + case 23: + end(); + break; + case 10: + if(player.getQuestRepository().hasStarted("Lost Tribe") && !player.getQuestRepository().isComplete("Lost Tribe")){ + npc("No, not right now."); + stage = 12; + break; + } + if(player.getQuestRepository().isComplete("Goblin Diplomacy") && player.getQuestRepository().isComplete("Rune Mysteries") && !player.getQuestRepository().hasStarted("Lost Tribe")){ + npc("There was recently some damage to the castle cellar.","Part of the wall has collapsed."); + stage = 30; + break; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I hear the Duke has a task for an adventurer.", "Otherwise, if you want to make yourself useful, there", "are always evil monsters to slay."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, I might just do that."); + stage = 12; + break; + case 12: + end(); + break; + case 30: + npc("The Duke insists that it was an earthquake, but I think","some kind of monsters are to blame."); + stage++; + break; + case 31: + npc("You should ask other people around the town if they","saw anything."); + stage++; + player.getQuestRepository().getQuest("Lost Tribe").start(player); + player.setAttribute("/save:tlt-witness", TLTNPCS[0]); + break; + case 32: + end(); + break; + case 34: + player("No..."); + stage = 32; + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SigmundDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can I help you?"); + if(player.getQuestRepository().getQuest("Lost Tribe").getStage(player) > 0 && player.getQuestRepository().getQuest("Lost Tribe").getStage(player) < 100){ + npc("Have you found out what it was?"); + stage = 34; + } + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SigurdDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SigurdDialogue.java new file mode 100644 index 000000000..f64b80363 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SigurdDialogue.java @@ -0,0 +1,149 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the Sigurd dialogue. + * @author 'Vexia + */ +@Initializable +public class SigurdDialogue extends DialoguePlugin { + + public SigurdDialogue() { + + } + + public SigurdDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 3329 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Who are you?", "Can you teach me about canoeing?"); + stage = 2; + break; + case 2: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's really quite simple. Just walk down to that", "tree on the water bank and chop it down."); + stage = 24; + break; + } + + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm Sigurd the Great and Brainy."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why do they call you the Great and Brainy?"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Because I Iinvented the Log Canoe!"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Log Canoe?"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yeash! Me and my cousins were having a great", "party by the river when we decided to have a", " game of 'Smack The SeasonDefinitions'"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Smack the SeasonDefinitions?"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's a game were you take it in turnsh shmacking", " a tree. First one to uproot the tree winsh!"); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Anyway, I won the game with a flying tackle.", " The tree came loose and down the river bank I went", " still holding the tree."); + stage = 18; + break; + case 18: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I woke up a few hours later and found myself", "several miles down river. and thatsh how I", "invented the log canoe!"); + stage = 19; + break; + case 19: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So you invented the 'Log Canoe' by falling into a river", "hugging a tree?"); + stage = 20; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well I refined the design from the original", "you know!"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I cut all the branches off to make it more", "comfortable. I could tell you how to if you like?"); + stage = 22; + break; + case 22: + interpreter.sendOptions("Select an Option", "Yes", "No"); + stage = 23; + break; + case 23: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's really quite simple. Just walk down to that tree", "on the water bank and chop it down."); + stage = 24; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Okay, if you change your mind you know where", "to find me."); + stage = 25; + break; + } + + break; + case 24: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Then take your hatchet to it and shape it how you", "like!"); + stage = 26; + break; + case 26: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You look like you know your way around a", "tree, you can you can make many canoes."); + stage = 27; + break; + case 27: + end(); + break; + case 25: + end(); + break; + case 100: + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SigurdDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ha Ha! Hello!"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SilkMerchantPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/SilkMerchantPlugin.java new file mode 100644 index 000000000..859e177dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SilkMerchantPlugin.java @@ -0,0 +1,218 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.game.world.map.RegionManager; + +/** + * Handles the SilkMerchantPlugin dialogue. + * @author 'Vexia + */ +@Initializable +public class SilkMerchantPlugin extends DialoguePlugin { + + /** + * Represents the silk item. + */ + private final Item SILK = new Item(950); + + /** + * Represents the noted silk item. + */ + private final Item NOTED_SILK = new Item(951); + + public SilkMerchantPlugin() { + + } + + public SilkMerchantPlugin(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 574 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getInventory().containsItem(SILK)) { + interpreter.sendDialogues(player, null, "Hello. I have some fine silk from Al-Kharid to sell to", "you."); + stage = 1; + } else if (player.getInventory().containsItem(NOTED_SILK)) { + interpreter.sendDialogues(player, null, "I've got some silk here. Will you buy it?"); + stage = 100; + } else { + interpreter.sendDialogues(player, null, "Sorry, I don't have any silk."); + stage = 200; + } + break; + case 200: + end(); + break; + case 201: + end(); + break; + case 1: + interpreter.sendDialogues(npc, null, "Ah, I may be interested in that. What sort of price were", "you looking at per piece of silk?"); + stage = 2; + break; + case 2: + interpreter.sendOptions("Select an Option", "20 coins.", "30 coins.", "120 coins.", "200 coins."); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "20 coins."); + stage = 1000; + break; + case 2: + interpreter.sendDialogues(player, null, "30 coins."); + stage = 2000; + break; + case 3: + interpreter.sendDialogues(player, null, "120 coins."); + stage = 300; + break; + case 4: + interpreter.sendDialogues(player, null, "200 coins."); + stage = 400; + break; + } + break; + case 1000: + case 2000: + interpreter.sendDialogues(npc, null, "That price is fine by me! Hand over your silk."); + stage = stage == 1000 ? 1010 : 1011; + break; + case 1010: + buy(20); + break; + case 1011: + buy(30); + break; + case 300: + case 400: + interpreter.sendDialogues(npc, null, "You'll never get that much for it. I'll be generous and", "give you 50 for it."); + stage = 500; + break; + case 500:// use this for selling. + interpreter.sendOptions("Select an Option", "Ok, I guess 50 will do.", "I'll give it to you for 60.", "No, that is not enough."); + stage = 501; + break; + case 501: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Ok, I guess 50 will do."); + stage = 510; + break; + case 2: + interpreter.sendDialogues(player, null, "I'll give it to you for 60."); + stage = 520; + break; + case 3: + interpreter.sendDialogues(player, null, "No, that is not enough."); + stage = 530; + break; + } + break; + case 510: + buy(50); + break; + case 520: + interpreter.sendDialogues(npc, null, "You drive a hard bargain, but", "I guess that will have to do."); + stage = 521; + break; + case 521: + buy(60); + break; + case 530: + end(); + break; + case 100: + interpreter.sendDialogues(npc, null, "Silk? Yo're not carrying any silk."); + stage = 101; + break; + case 101: + interpreter.sendDialogues(player, null, "Yes I am."); + stage = 102; + break; + case 102: + interpreter.sendDialogues(npc, null, "No, you're carrying " + player.getInventory().getAmount(NOTED_SILK) + " bits of paper that say they", "can be exchanged for silk at a bank or general store.", "I'm not buying those. Fetch me some real silk, then", "we'll trade."); + stage = 103; + break; + case 103: + interpreter.sendDialogues(player, null, "Oh, alright."); + stage = 104; + break; + case 104: + end(); + break; + } + return true; + } + + /** + * Method used to buy silk. + * @param price + */ + public final void buy(int price) { + end(); + int amt = player.getInventory().getAmount(SILK); + Item remove = new Item(SILK.getId(), amt); + if (!player.getInventory().containsItem(remove)) { + return; + } + if (player.getInventory().remove(remove)) { + player.getInventory().add(new Item(995, price * amt)); + } + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SilkMerchantPlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getSavedData().getGlobalData().getSilkSteal() > System.currentTimeMillis()) { + end(); + for (NPC npc : RegionManager.getLocalNpcs(player.getLocation(), 8)) { + if (!npc.getProperties().getCombatPulse().isAttacking() && npc.getId() == 32) { + npc.sendChat("Hey! Get your hands off there!"); + npc.getProperties().getCombatPulse().attack(player); + break; + } + } + GameWorld.getPulser().submit(new Pulse(1) { + int count = 0; + + @Override + public boolean pulse() { + if (count == 0) + npc.sendChat("You're the one who stole something from me!"); + if (count == 2) { + npc.sendChat("Guards guards!"); + return true; + } + count++; + return false; + } + + }); + return false; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I buy silk. If you ever want to", "sell any silk, bring it here."); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SilkTradeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SilkTradeDialogue.java new file mode 100644 index 000000000..dfa0f3af1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SilkTradeDialogue.java @@ -0,0 +1,145 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the SilkTradeDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SilkTradeDialogue extends DialoguePlugin { + + public SilkTradeDialogue() { + + } + + public SilkTradeDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 539 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "How much are they?", "No, slik doesn't suit me."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How much are they?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, silk doesn't suit me."); + stage = 2000; + break; + + } + + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "3gp."); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "No, that's too much for me.", "Okay, that sounds good."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, that's too much for me."); + stage = 110; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, that sounds good."); + stage = 6000; + break; + + } + break; + case 110: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "2gp and that's as low as I'll go."); + stage = 111; + break; + case 111: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm not selling it for any less. You'll only go and sell it", "in Varrock for a profit."); + stage = 113; + break; + case 113: + interpreter.sendOptions("Select an Option", "2gp sounds good.", "No really, I don't want it."); + stage = 114; + break; + case 114: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "2gp sounds good."); + stage = 1000; + break; + case 2: + + break; + + } + break; + case 1000: + if (player.getInventory().contains(995, 2) && player.getInventory().freeSlots() != 0) { + player.getInventory().remove(new Item(995, 2)); + player.getInventory().add(new Item(950, 1)); + interpreter.sendDialogue("You buy some silk for 2gp."); + stage = 1001; + } else if (player.getInventory().freeSlots() == 0) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't have enough room, sorry."); + stage = 2000; + } else if (!player.getInventory().contains(995, 2)) { + end(); + player.getPacketDispatch().sendMessage("You need 2 gold coins to buy silk."); + } + break; + case 1001: + end(); + break; + case 2000: + end(); + break; + case 6000: + if (player.getInventory().contains(995, 3) && player.getInventory().freeSlots() != 0) { + player.getInventory().remove(new Item(995, 3)); + player.getInventory().add(new Item(950, 1)); + interpreter.sendDialogue("You buy some silk for 3gp."); + stage = 1001; + } else if (player.getInventory().freeSlots() == 0) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't have enough room, sorry."); + stage = 2000; + } else if (!player.getInventory().contains(995, 3)) { + end(); + player.getPacketDispatch().sendMessage("You need 3 gold coins to buy silk."); + } + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SilkTradeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you want to buy any fine silks?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SilverMechantPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/SilverMechantPlugin.java new file mode 100644 index 000000000..e430324a5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SilverMechantPlugin.java @@ -0,0 +1,66 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SilverMechantPlugin dialogue. + * @author 'Vexia + */ +@Initializable +public class SilverMechantPlugin extends DialoguePlugin { + + public SilverMechantPlugin() { + + } + + public SilverMechantPlugin(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 569 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes please.", "No, thank you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 20; + break; + } + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SilverMechantPlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Silver! Silver! Best prices for buying and selling in all", "Kandarin!"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SimonTempleton.java b/Server/src/main/java/Server/core/game/content/dialogue/SimonTempleton.java new file mode 100644 index 000000000..abe12c03e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SimonTempleton.java @@ -0,0 +1,280 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the dialog for Simon Templeton + * @author ceik + */ +@Initializable +public final class SimonTempleton extends DialoguePlugin{ + public final Item[][] ARTIFACTS = { {new Item(9032),new Item(9036), new Item(9026)}, {new Item(9042), new Item(9030), new Item(9038)}, {new Item(9040), new Item(9028), new Item(9034)} }; + public SimonTempleton(){ + /** + * Empty on purpose + */ + } + + public SimonTempleton(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SimonTempleton(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + //Handles what happens when using a pharoah scepter on him (required for accuracy) + if(args.length == 4){ + if(((int) args[3] == 9044 || (int) args[3] == 9046 || (int) args[3] == 9048 || (int) args[3] == 9050)) { + npc("You sellin' me this gold colored", "stick thing. Looks fake to me.", "I'll give you 100 gold for it."); + stage = 30; + return true; + } + } + player.getPacketDispatch().sendMessage("" + args.length); + npc("G'day, mate!. Got any new", "pyramid artefacts for me?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + boolean hasArtefacts = false; + boolean hasPyramidTopper = false; + switch(stage){ + case 0: + for(int i = 0; i < ARTIFACTS.length; i++){ + for(int j = 0; j < 3; j++){ + if(player.getInventory().containsItem(ARTIFACTS[i][j])){ + hasArtefacts = true; + break; + } + } + } + hasPyramidTopper = player.getInventory().containsItem(new Item(6970)); + if(hasPyramidTopper){ + player("Yes, actually. The top of that pyramid."); + stage = 6; + break; + } + if(hasArtefacts && !hasPyramidTopper){ + player("Why, yes I do!"); + stage = 1; + break; + } + player("No, I haven't."); + stage = 3; + break; + case 1: + npc("Excellent! I would like to buy them."); + stage = 2; + break; + case 2: + interpreter.sendOptions("Sell artefacts?","Yes, I need money!!","No, I'll hang onto them."); + stage = 10; + break; + case 3: + npc("Well, keep my offer in mind", "if you do find one."); + stage = 4; + break; + case 4: + player("I will. Goodbye, Simon."); + stage = 5; + break; + case 5: + npc("Bye, mate."); + stage = 999; + break; + case 6: + npc("Hmmm, very nice. I'll buy them for 10k each."); + stage = 7; + break; + case 7: + interpreter.sendOptions("Select an option.","Sounds good!", "No thanks."); + stage = 8; + break; + case 8: + switch(buttonId){ + case 1: + for(int j = 0; j < 28; j++){ + switch(player.getInventory().getId(j)){ + case 6970: + player.getInventory().remove(new Item(6970),j,true); + player.getInventory().add(new Item(995, 10000)); + break; + } + } + end(); + break; + case 2: + npc("Have it your way."); + stage = 9; + break; + } + break; + case 9: + end(); + break; + case 10: + switch(buttonId){ + case 1: + interpreter.sendOptions("Which ones do you want to sell?", "Clay and Ivory", "Stone","Gold","Sell them all!"); + stage = 20; + break; + case 2: + npc("Aww, alright. Well, keep my", "offer in mind, will ya?"); + player("Sure thing, Simon."); + npc("Thanks, mate."); + stage = 999; + break; + } + break; + case 20: + switch(buttonId){ + case 1: + end(); + for(int j = 0; j < 28; j++){ + switch(player.getInventory().getId(j)){ + case 9032: + player.getInventory().remove(new Item(9032),j,true); + player.getInventory().add(new Item(995, 75)); + break; + case 9036: + player.getInventory().remove(new Item(9036),j,true); + player.getInventory().add(new Item(995, 100)); + break; + case 9026: + player.getInventory().remove(new Item(9026),j,true); + player.getInventory().add(new Item(995, 50)); + break; + } + } + stage = 999; + break; + case 2: + end(); + for(int j = 0; j < 28; j++){ + switch(player.getInventory().getId(j)){ + case 9042: + player.getInventory().remove(new Item(9042),j,true); + player.getInventory().add(new Item(995, 150)); + break; + case 9030: + player.getInventory().remove(new Item(9030),j,true); + player.getInventory().add(new Item(995, 175)); + break; + case 9038: + player.getInventory().remove(new Item(9038),j,true); + player.getInventory().add(new Item(995, 200)); + break; + } + } + stage = 999; + break; + case 3: + end(); + for(int j = 0; j < 28; j++){ + switch(player.getInventory().getId(j)){ + case 9040: + player.getInventory().remove(new Item(9040),j,true); + player.getInventory().add(new Item(995, 750)); + break; + case 9028: + player.getInventory().remove(new Item(9028),j,true); + player.getInventory().add(new Item(995, 1000)); + break; + case 9034: + player.getInventory().remove(new Item(9034),j,true); + player.getInventory().add(new Item(995, 1250)); + break; + } + } + stage = 999; + break; + case 4: + end(); + for(int j = 0; j < 28; j++){ + switch(player.getInventory().getId(j)){ + case 9040: + player.getInventory().remove(new Item(9040),j,true); + player.getInventory().add(new Item(995, 750)); + break; + case 9028: + player.getInventory().remove(new Item(9028),j,true); + player.getInventory().add(new Item(995, 1000)); + break; + case 9034: + player.getInventory().remove(new Item(9034),j,true); + player.getInventory().add(new Item(995, 1250)); + break; + case 9042: + player.getInventory().remove(new Item(9042),j,true); + player.getInventory().add(new Item(995, 150)); + break; + case 9030: + player.getInventory().remove(new Item(9030),j,true); + player.getInventory().add(new Item(995, 175)); + break; + case 9038: + player.getInventory().remove(new Item(9038),j,true); + player.getInventory().add(new Item(995, 200)); + break; + case 9032: + player.getInventory().remove(new Item(9032),j,true); + player.getInventory().add(new Item(995, 75)); + break; + case 9036: + player.getInventory().remove(new Item(9036),j,true); + player.getInventory().add(new Item(995, 100)); + break; + case 9026: + player.getInventory().remove(new Item(9026),j,true); + player.getInventory().add(new Item(995, 50)); + break; + } + } + stage = 999; + break; + } + break; + case 30: + player("What! This is a genuine pharaoh's scepter - made out of"," solid gold and finely jewelled with precious gems"," by the finest craftsmen in the area."); + stage = 31; + break; + case 31: + npc("Strewth! I can tell a pile of croc when I hear it!","You've got the patter mate, but I'm no mug.", "That's a fake."); + stage = 32; + break; + case 32: + player("It has magical powers!"); + stage = 33; + break; + case 33: + npc("Oh, magical powers... yeah yeah yeah. Heard it all before"," mate. I'll give you 100 gold, or some 'magic beans'.", "Take it or leave it."); + stage = 34; + break; + case 34: + player("I don't think so! I'll find someone who'll give me", "what it's worth."); + stage = 35; + break; + case 35: + npc("Suit yerself..."); + stage = 999; + break; + case 999: + end(); + break; + } + return true; + } + @Override + public int[] getIds() { + return new int[] { 3123 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SimpleDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/SimpleDialoguePlugin.java new file mode 100644 index 000000000..f39bc2daf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SimpleDialoguePlugin.java @@ -0,0 +1,46 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents a simple dialogue. + * @author 'Vexia + */ +@Initializable +public class SimpleDialoguePlugin extends DialoguePlugin { + + public SimpleDialoguePlugin() { + + } + + public SimpleDialoguePlugin(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 70099 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SimpleDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + String[] messages = new String[args.length]; + for (int i = 0; i < messages.length; i++) + messages[i] = (String) args[i]; + interpreter.sendDialogue(messages); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SimpleEntityMessage.java b/Server/src/main/java/Server/core/game/content/dialogue/SimpleEntityMessage.java new file mode 100644 index 000000000..e88d04674 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SimpleEntityMessage.java @@ -0,0 +1,46 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SimpleEntityMessage dialogue. + * @author 'Vexia + */ +@Initializable +public class SimpleEntityMessage extends DialoguePlugin { + + public SimpleEntityMessage() { + + } + + public SimpleEntityMessage(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 8000 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SimpleEntityMessage(player); + } + + @Override + public boolean open(Object... args) { + String[] messages = new String[args.length]; + for (int i = 0; i < messages.length; i++) + messages[i] = (String) args[i]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, messages); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SirReniteeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SirReniteeDialogue.java new file mode 100644 index 000000000..413f0965c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SirReniteeDialogue.java @@ -0,0 +1,465 @@ +package core.game.content.dialogue; + +import core.Util; +import core.plugin.Initializable; +import core.tools.Items; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.tools.RandomFunction; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.construction.CrestType; + +/** + * Represents the dialogue to handle Sir Renitee + * + * @author afaroutdude + */ +@Initializable +public class SirReniteeDialogue extends DialoguePlugin { + /** + * Constructs a new {@code SirReniteeDialogue} {@code Object}. + */ + public SirReniteeDialogue() { + } + + public SirReniteeDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm? What's that, young " + (player.getAppearance().isMale() ? "man" : "woman") + "? What can I do for", "you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I don't know, what can you do for me?", "Nothing, thanks"); + stage = 10; + break; + case 10: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't know, what can you do for me?"); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nothing, thanks."); + stage = 30; + break; + } + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Mmm, well, see you some other time maybe."); + stage = 40; + break; + case 40: + end(); + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm, well, mmm, do you have a family crest? I keep", "track of every 2009Scape family, you know, so I might", "be able to find yours."); + stage = 110; + break; + case 110: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm also something of an, mmm, a painter. If you've", "met any important persons or visited any nice places I", "could paint them for you."); + stage = 120; + break; + case 120: + interpreter.sendOptions("Select an Option", "Can you see if I have a family crest?", "Can I buy a painting?"); + stage = 130; + break; + case 130: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you see if I have a family crest?"); + stage = 200; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I buy a painting?"); + stage = 500; + break; + } + case 200: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What is your name?"); + stage = 210; + break; + case 210: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, player.getUsername() + "."); + stage = 220; + break; + case 220: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Mmm, " + player.getUsername() + ", let me see..."); + stage = 230; + break; + case 230: + if (player.getSkills().hasLevel(Skills.CONSTRUCTION, 16)) { + if (player.getAttribute("sir-renitee-assigned-crest", false)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "According to my records, your crest is ", player.getHouseManager().getCrest().getName() + "."); + } else { + final int c = RandomFunction.random(4); + final CrestType[] crests = {CrestType.VARROCK, CrestType.ASGARNIA, CrestType.KANDARIN, CrestType.MISTHALIN}; + final CrestType crest = crests[c]; + player.getHouseManager().setCrest(crest); + player.setAttribute("/save:sir-renitee-assigned-crest", true); + String message = "that can be your"; + if (crest == CrestType.VARROCK) { + message = "you can use that city's"; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, I don't think you have any noble blood,", + "but I see that your ancestors came from " + Util.enumToString(player.getHouseManager().getCrest().name()) + ",", " so " + message + " crest."); + } + if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0,4)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player,0,4,true); + } + stage = 240; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, + "First thing's first, young " + (player.getAppearance().isMale() ? "man" : "woman") + "! There is not much point", + "in having a family crest if you cannot display it."); + stage = 235; + } + break; + case 235: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You should train construction until you can build a wall", "decoration in your dining room."); + stage = 40; + break; + case 240: + interpreter.sendOptions("Select an Option", "I don't like that crest. Can I have a different one?", "Thanks!"); + stage = 250; + break; + case 250: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't like that crest. Can I have a different one?"); + stage = 300; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks!"); + stage = 260; + break; + } + break; + case 260: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You're welcome, my " + (player.getAppearance().isMale() ? "boy." : "girl.")); + stage = 40; + break; + case 300: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Mmm, very well. Changing your crest will cost", "5,000 coins."); + if (player.getInventory().getAmount(Items.COINS_995) < 5000) { + stage = 302; + } else { + stage = 305; + } + break; + case 302: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll have to go and get some money then."); + stage = 40; + break; + case 305: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There are sixteen different symbols;", "which one would you like?"); + stage = 310; + break; + case 310: + interpreter.sendOptions("Select an Option", "Shield of Arrav", "Asgarnia", "Dorgeshuun Symbol", "Dragon", "More..."); + stage = 320; + break; + case 320: + switch (buttonId) { + case 1: { + CrestType c = CrestType.ARRAV; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah yes, the shield that you helped to retrieve. You have", "certainly earned the right to wear its symbol."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 2: { + CrestType c = CrestType.ASGARNIA; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, splendid, splendid. There is no better symbol", "than that of our fair land!"); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 3: { + CrestType c = CrestType.DORGESHUUN; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah yes, our new neighbours under Lumbridge. I hear", "you were the one who made contact with them, jolly good."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm, have you ever even met the Dorgeshuun? I don't", "think you should wear their symbol until you have", "made contact with that lost tribe."); + stage = 310; + } + break; + } + case 4: { + CrestType c = CrestType.DRAGON; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I see you are a mighty dragon-slayer! You have", "certainly earned the right to wear a dragon symbol."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 5: + interpreter.sendOptions("Select an option", "Fairy", "Guthix", "HAM", "Horse", "More..."); + stage = 330; + break; + } + break; + case 330: + switch (buttonId) { + case 1: { + CrestType c = CrestType.FAIRY; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm, mmm, yes, everyone likes pretty fairies."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 2: { + CrestType c = CrestType.GUTHIX; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Guthix, god of balance! I'm a Saradominist myself,", "you know, but we all find meaning in our own way, what?"); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You do not seem to be very devoted to any god.", "I will not let you have a divine symbol", "unless you have level 70 prayer."); + stage = 310; + } + break; + } + case 3: { + CrestType c = CrestType.HAM; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm, I'm not sure I like that HAM group, their", "beliefs are a little extreme for me.", "But if that's what you want."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 4: { + CrestType c = CrestType.HORSE; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, I see you've brought a toy horse for me to see. An", + "interesting beast. Certainly you can use that as your", + "crest if you like, although it seems a bit strange to me."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A horse? I know people talk about them, but I'm not at all sure", + "they ever existed. I don't think I could let you use as", + "your symbol unless you can fetch me some kind of model of one."); + stage = 310; + } + break; + } + case 5: + interpreter.sendOptions("Select an option", "Jogre", "Kandarin", "Misthalin", "Money", "More..."); + stage = 340; + break; + } + break; + case 340: + switch (buttonId) { + case 1: { + CrestType c = CrestType.JOGRE; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A Jungle Ogre, eh? Odd beast, very odd."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 2: { + CrestType c = CrestType.KANDARIN; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Our neighbours in the west? Very good, very good."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 3: { + CrestType c = CrestType.MISTHALIN; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, the fair land of Lumbridge and Varrock."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You wish to represent yourself by a moneybag?", "I think to make that meaningful I should increase", "the price to 500,000 coins. Do you agree?"); + stage = 342; + break; + case 5: + interpreter.sendOptions("Select an option", "Saradomin", "Skull", "Varrock", "Zamorak", "More..."); + stage = 350; + break; + } + break; + case 341: + interpreter.sendOptions("Select an option", "All right.", "No way!"); + stage = 342; + break; + case 342: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "All right."); + CrestType c = CrestType.MONEY; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost()) { + stage = 343; + } else { + stage = 302; + } + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No way!"); + stage = 344; + break; + } + break; + case 343: { + CrestType c = CrestType.MONEY; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Thank you very much! You may now use a money-bag", "as your symbol."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 344: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well we can't have just any pauper using a money-bag", "as a symbol, can we? You'll have to choose a", "different symbol."); + stage = 310; + break; + case 350: + switch (buttonId) { + case 1: { + CrestType c = CrestType.SARADOMIN; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, the great god Saradomin! May he smile on your house", "as you adorn it with his symbol!"); + if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(2,1)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player,2,1,true); + } + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You do not seem to be very devoted to any god.", "I will not let you have a divine symbol", "unless you have level 70 prayer."); + stage = 310; + } + break; + } + case 2: { + CrestType c = CrestType.SKULL; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Of, of course you can have a skull symbol, " + (player.getAppearance().isMale() ? "sir!" : "madam!")); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A symbol of death? You do not seem like a killer to me;", "perhaps some other symbol would suit you better."); + stage = 310; + } + break; + } + case 3: { + CrestType c = CrestType.VARROCK; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, Varrock, a fine city!"); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - NOT ELIGIBLE]"); + stage = 310; + } + break; + } + case 4: { + CrestType c = CrestType.ZAMORAK; + if (c.eligible(player) && player.getInventory().getAmount(Items.COINS_995) > c.getCost() + && player.getInventory().remove(new Item(Items.COINS_995, c.getCost()))) { + player.getHouseManager().setCrest(c); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The god of Chaos? It is a terrible thing to worship", "that evil being. But if that is what you wish..."); + stage = 40; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You do not seem to be very devoted to any god.", "I will not let you have a divine symbol", "unless you have level 70 prayer."); + stage = 310; + } + break; + } + case 5: + interpreter.sendOptions("Select an Option", "Shield of Arrav", "Asgarnia", "Dorgeshuun Symbol", "Dragon", "More..."); + stage = 320; + break; + } + break; + case 500: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "[MISSING DIALOGUE - UNIMPLIMENTED]"); + stage = 40; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirReniteeDialogue(player); + } + + @Override + public int[] getIds() { + return new int[]{4249}; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SirTiffyCashienDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SirTiffyCashienDialogue.java new file mode 100644 index 000000000..741beb800 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SirTiffyCashienDialogue.java @@ -0,0 +1,87 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue used for sir tiffy. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SirTiffyCashienDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code SirTiffyCashienDialogue} {@code Object}. + */ + public SirTiffyCashienDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SirTiffyCashienDialogue} {@code Object}. + * @param player the player. + */ + public SirTiffyCashienDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirTiffyCashienDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What ho, sirrag.", "Spiffing day for a walk in the park, what?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Spiffing?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Absolutely, top-hole!", "Well, can't stay and chat all day, dontchaknow!", "Ta-ta for now!"); + stage = 10; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Erm...goodbye."); + stage = 4; + break; + case 4: + end(); + break; + case 10: + npc("Would you like to look at my wares?"); + stage++; + break; + case 11: + player("Yes, please."); + stage++; + break; + case 12: + npc.openShop(player); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2290 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SirVyvinDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SirVyvinDialogue.java new file mode 100644 index 000000000..8e0695de9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SirVyvinDialogue.java @@ -0,0 +1,54 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SirVyvinDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SirVyvinDialogue extends DialoguePlugin { + + public SirVyvinDialogue() { + + } + + public SirVyvinDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SirVyvinDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings traveller."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 605 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SkillDialogueHandler.kt b/Server/src/main/java/Server/core/game/content/dialogue/SkillDialogueHandler.kt new file mode 100644 index 000000000..10f9dac6b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SkillDialogueHandler.kt @@ -0,0 +1,338 @@ +package core.game.content.dialogue + +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.net.packet.PacketRepository +import core.net.packet.context.ChildPositionContext +import core.net.packet.out.RepositionChild +import core.tools.StringUtils + +/** + * Represents a skill dialogue handler class. + * @author Vexia + */ +open class SkillDialogueHandler( + /** + * Represents the player. + */ + val player: Player, + /** + * Represents the skill dialogue type. + */ + val type: SkillDialogue?, vararg data: Any) { + /** + * Gets the player. + * @return The player. + */ + + /** + * Gets the type. + * @return The type. + */ + + /** + * Gets the passed data. + * @return the data. + */ + /** + * Represents the object data passed through. + */ + val data: Array + + /** + * Method used to open a skill dialogue. + */ + fun open() { + player.dialogueInterpreter.open(SKILL_DIALOGUE, this) + } + + /** + * Method used to display the content on the dialogue. + */ + fun display() { + if (type == null) { + player.debug("Error! Type is null.") + return + } + type.display(player, this) + } + + /** + * Method used to create a product. + * @param amount the amount. + * @param index the index. + */ + open fun create(amount: Int, index: Int) {} + + /** + * Gets the total amount of items to be made. + * @param index the index. + * @return the amount. + */ + open fun getAll(index: Int): Int { + return player.inventory.getAmount(data[0] as Item) + } + + /** + * Gets the name. + * @param item the item. + * @return the name. + */ + protected open fun getName(item: Item): String { + return StringUtils.formatDisplayName(item.name.replace("Unfired", "")) + } + + /** + * Represents a skill dialogue type. + * @author 'Vexia + */ + enum class SkillDialogue + /** + * Constructs a new `SkillDialogue` `Object`. + * @param interfaceId the interface id. + * @param base the base button. + * @param length the length. + */( + /** + * Represents the interface id. + */ + val interfaceId: Int, + /** + * Represents the base button. + */ + private val baseButton: Int, + /** + * Represents the length. + */ + private val length: Int) { + ONE_OPTION(309, 5, 1) { + override fun display(player: Player, handler: SkillDialogueHandler) { + val item = handler.data[0] as Item + player.packetDispatch.sendString("



" + item.name, 309, 6) + player.packetDispatch.sendItemZoomOnInterface(item.id, 160, 309, 2) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 309, 6, 60, 20)) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 309, 2, 210, 30)) + } + + override fun getAmount(handler: SkillDialogueHandler, buttonId: Int): Int { + return when(buttonId){ + 5 -> 1 + 4 -> 5 + 3 -> -1 //-1 is used to prompt an "enter an amount" + else -> handler.getAll(getIndex(handler, buttonId)) + } + } + }, + TWO_OPTION(303, 7, 2) { + override fun display(player: Player, handler: SkillDialogueHandler) { + var item: Item + player.interfaceManager.openChatbox(306) + for (i in handler.data.indices) { + item = handler.data[i] as Item + player.packetDispatch.sendString("



" + handler.getName(item), 303, 7 + i) + player.packetDispatch.sendItemZoomOnInterface(item.id, 160, 303, 2 + i) + } + } + + override fun getIndex(handler: SkillDialogueHandler?, buttonId: Int): Int { + when (buttonId) { + 6, 5, 4, 3 -> return 0 + 10, 9, 8, 7 -> return 1 + } + return 1 + } + + override fun getAmount(handler: SkillDialogueHandler, buttonId: Int): Int { + when (buttonId) { + 6, 10 -> return 1 + 5, 9 -> return 5 + 4, 8 -> return 10 + 3, 7 -> return -1 + } + return 1 + } + }, + THREE_OPTION(304, 8, 3) { + override fun display(player: Player, handler: SkillDialogueHandler) { + var item: Item? = null + for (i in 0..2) { + item = handler.data[i] as Item + player.packetDispatch.sendItemZoomOnInterface(item.id, 135, 304, 2 + i) + player.packetDispatch.sendString("



" + item!!.name, 304, 304 - 296 + i * 4) + } + } + + override fun getIndex(handler: SkillDialogueHandler?, buttonId: Int): Int { + when (buttonId) { + 7, 6, 5, 4 -> return 0 + 11, 10, 9, 8 -> return 1 + 15, 14, 13, 12 -> return 2 + } + return 1 + } + + override fun getAmount(handler: SkillDialogueHandler, buttonId: Int): Int { + when (buttonId) { + 7, 11, 15 -> return 1 + 6, 10, 14 -> return 5 + 5, 9, 13 -> return 10 + 4, 8, 12 -> return -1 + } + return 1 + } + }, + FOUR_OPTION(305, 9, 4) { + override fun display(player: Player, handler: SkillDialogueHandler) { + var item: Item? = null + for (i in 0..3) { + item = handler.data[i] as Item + player.packetDispatch.sendItemZoomOnInterface(item!!.id, 135, 305, 2 + i) + player.packetDispatch.sendString("



" + item.name, 305, 305 - 296 + i * 4) + } + } + + override fun getIndex(handler: SkillDialogueHandler?, buttonId: Int): Int { + when (buttonId) { + 5, 8, 6, 7 -> return 0 + 9, 10, 11, 12 -> return 1 + 13, 14, 15, 16 -> return 2 + 17, 18, 19, 20 -> return 3 + } + return 0 + } + + override fun getAmount(handler: SkillDialogueHandler, buttonId: Int): Int { + when (buttonId) { + 8, 12, 16, 20 -> return 1 + 7, 11, 15, 19 -> return 5 + 6, 10, 14, 18 -> return 10 + 5, 9, 13, 17 -> return -1 + } + return 1 + } + }, + FIVE_OPTION(306, 7, 5) { + /** + * Represents the position data. + */ + private val positions = arrayOf(intArrayOf(10, 30), intArrayOf(117, 10), intArrayOf(217, 20), intArrayOf(317, 15), intArrayOf(408, 15)) + override fun display(player: Player, handler: SkillDialogueHandler) { + var item: Item + player.interfaceManager.openChatbox(306) + for (i in handler.data.indices) { + item = handler.data[i] as Item + player.packetDispatch.sendString("



" + handler.getName(item), 306, 10 + 4 * i) + player.packetDispatch.sendItemZoomOnInterface(item.id, 160, 306, 2 + i) + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(player, 306, 2 + i, positions[i][0], positions[i][1])) + } + } + + override fun getIndex(handler: SkillDialogueHandler?, buttonId: Int): Int { + when (buttonId) { + 9, 8, 7, 6 -> return 0 + 13, 12, 11, 10 -> return 1 + 17, 16, 15, 14 -> return 2 + 21, 20, 19, 18 -> return 3 + 25, 24, 23, 22 -> return 4 + } + return 0 + } + + override fun getAmount(handler: SkillDialogueHandler, buttonId: Int): Int { + when (buttonId) { + 9, 13, 17, 21, 25 -> return 1 + 8, 12, 16, 20, 24 -> return 5 + 7, 11, 15, 19, 23 -> return 10 + 6, 10, 14, 18, 22 -> return -1 + } + return 1 + } + }; + + /** + * Gets the interfaceId. + * @return The interfaceId. + */ + + /** + * Method used to display the content for this type. + * @param player the player. + * @param handler the handler. + */ + open fun display(player: Player, handler: SkillDialogueHandler) {} + + /** + * Gets the amount. + * @param handler the handler. + * @param buttonId the buttonId. + * @return the amount. + */ + open fun getAmount(handler: SkillDialogueHandler, buttonId: Int): Int { + for (k in 0..3) { + for (i in 0 until length) { + val `val` = baseButton - k + 4 * i + if (`val` == buttonId) { + return if (k == 13) 1 else if (k == 8) 5 else if (k == 7) 10 else 6 + } + } + } + return -1 + } + + /** + * Gets the index selected. + * @param handler the handler. + * @param buttonId the buttonId. + * @return the index selected. + */ + open fun getIndex(handler: SkillDialogueHandler?, buttonId: Int): Int { + var index = 0 + for (k in 0..3) { + for (i in 1 until length) { + val `val` = baseButton + k + 4 * i + if (`val` == buttonId) { + return index + 1 + } else if (`val` <= buttonId) { + index++ + } + } + index = 0 + } + return index + } + + companion object { + /** + * Gets the type for the length. + * @param length2 the length to compare. + * @return the type. + */ + fun forLength(length2: Int): SkillDialogue? { + for (dial in values()) { + if (dial.length == length2) { + return dial + } + } + return null + } + } + + } + + companion object { + /** + * Represents the skill dialogue id. + */ + const val SKILL_DIALOGUE = 3 shl 16 + } + + /** + * Constructs a new `SkillDialogueHandler` `Object`. + * @param player the player. + * @param type the type. + * @param data the data. + */ + init { + this.data = data as Array + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SkillDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/SkillDialoguePlugin.java new file mode 100644 index 000000000..acc57b927 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SkillDialoguePlugin.java @@ -0,0 +1,76 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.RunScript; + +/** + * Represents the dialogue plugin used to automatically handle skill dialogues with creation amounts. + * @author Vexia + * + */ +@Initializable +public class SkillDialoguePlugin extends DialoguePlugin { + + /** + * Represents the skill dialogue handler. + */ + private SkillDialogueHandler handler; + + /** + * Constructs a new {@code SkillDialogue} {@code Object}. + */ + public SkillDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SkillDialogue} {@code Object}. + * @param player the player. + */ + public SkillDialoguePlugin(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SkillDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + handler = (SkillDialogueHandler) args[0]; + handler.display(); + player.getInterfaceManager().openChatbox(handler.getType().getInterfaceId()); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final int amount = handler.getType().getAmount(handler, buttonId); + final int index = handler.getType().getIndex(handler, buttonId); + end(); + if (amount != -1) { + handler.create(amount, index); + } else { + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + handler.create((int) getValue(), index); + return true; + } + }); + return true; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { SkillDialogueHandler.SKILL_DIALOGUE }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SkullSceptreDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SkullSceptreDialogue.java new file mode 100644 index 000000000..9661657ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SkullSceptreDialogue.java @@ -0,0 +1,69 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * @author 'Vexia + */ +@Initializable +public class SkullSceptreDialogue extends DialoguePlugin { + + public SkullSceptreDialogue() { + + } + + public SkullSceptreDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 78489 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SkullSceptreDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendItemMessage(9009, "The two halves of the skull fit perfectly."); + if (args.length == 1) { + interpreter.sendItemMessage(9012, "The two halves of the sceptre fit perfectly.");// The + // Sceptre", "appears + // to + // be + // designed + // to + // have + // something + // on + // top."); + return true; + } + if (args.length == 2) { + interpreter.sendItemMessage(9013, "The skull fits perfectly atop the Sceptre.");// The + // Sceptre", "appears + // to + // be + // designed + // to + // have + // something + // on + // top."); + return true; + } + stage = 0; + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SloaneDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SloaneDialogue.java new file mode 100644 index 000000000..ae703e5e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SloaneDialogue.java @@ -0,0 +1,160 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for sloane. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SloaneDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code SloaneDialogue} {@code Object}. + */ + public SloaneDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SloaneDialogue} {@code Object}. + * @param player the player. + */ + public SloaneDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SloaneDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (Skillcape.isMaster(player, Skills.STRENGTH)) { + options("Ask about Skillcape", "Something else"); + stage = 0; + } else { + npc("Ahhh, hello there, " + player.getUsername() + "."); + stage = 10; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player("Can I buy a Skillcape of Strength?"); + stage = 100; + break; + case 2: + npc("Ahhh, hello there, " + player.getUsername() + "."); + stage = 10; + break; + } + break; + case 10: + options("What can I do here?", "That's a big axe!", "May I claim my tokens please?", "Bye!"); + stage++; + break; + case 11: + switch (buttonId) { + case 1: + player("What can I do here?"); + stage = 12; + break; + case 2: + player("That's a big axe!"); + stage = 30; + break; + case 3: + close(); + player.getDialogueInterpreter().open("wg:claim-tokens", npc.getId()); + break; + case 4: + player("Bye!"); + stage = 50; + break; + } + break; + case 12: + npc("Ahh, the shot put is a great test of strength and can be", "quite rewarding. Mind you do it properly though, you", "might want to dust your hands with some powdery", "substance first. It'll give better grip."); + stage++; + break; + case 13: + end(); + break; + case 30: + npc("Yes indeed it is. Have to be mighty strong to wield it", "too."); + stage++; + break; + case 31: + player("But you don't look that strong!"); + stage++; + break; + case 32: + npc("Maybe, maybe not, but I still had to beat a Barbarian", "to get it. Mind you, usually they don't part with them.", "This was an unusual circumstance."); + stage++; + break; + case 33: + end(); + break; + case 50: + npc("Be well, warrior " + player.getUsername() + "."); + stage++; + break; + case 51: + end(); + break; + case 40: + close(); + player.getDialogueInterpreter().open("wg:claim-tokens", npc.getId()); + break; + case 100: + npc("Certainly! Right when you give me 99000 coins."); + stage = 101; + break; + case 101: + options("Okay, here you go.", "No, thanks."); + stage = 102; + break; + case 102: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 103; + break; + case 2: + end(); + break; + } + break; + case 103: + if (Skillcape.purchase(player, Skills.STRENGTH)) { + npc("There you go! Enjoy."); + } + stage = 104; + break; + case 104: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4297 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SmithingApparenticeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SmithingApparenticeDialogue.java new file mode 100644 index 000000000..98b77c525 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SmithingApparenticeDialogue.java @@ -0,0 +1,54 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SmithingApparenticeDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SmithingApparenticeDialogue extends DialoguePlugin { + + public SmithingApparenticeDialogue() { + + } + + public SmithingApparenticeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SmithingApparenticeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you teach me the basics of smelting please?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You'll need to have mined some ore to smelt first. Go", "see the mining tutor to the south if you're not sure", "how to do this."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7959,4904 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SofiyaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SofiyaDialogue.java new file mode 100644 index 000000000..7f260b23a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SofiyaDialogue.java @@ -0,0 +1,50 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SofiyaDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SofiyaDialogue extends DialoguePlugin { + + public SofiyaDialogue() { + + } + + public SofiyaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SofiyaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Out of my way punk."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6039, 6030, 6037 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SorcceresDialouge.java b/Server/src/main/java/Server/core/game/content/dialogue/SorcceresDialouge.java new file mode 100644 index 000000000..417aa5a88 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SorcceresDialouge.java @@ -0,0 +1,144 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Handles the SorcceresDialouge dialogue. + * @author Vexia + */ +@Initializable +public class SorcceresDialouge extends DialoguePlugin { + + /** + * Constructs a new {@code SorcceresDialouge} {@code Object}. + */ + public SorcceresDialouge() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SorcceresDialouge} {@code Object}. + * @param player the player. + */ + public SorcceresDialouge(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SorcceresDialouge(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("What are you doing in my house?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "None of your business!", "I'm here to kill you!", "Can I have some sq'irks please?", "I'm just passing by."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "None of your business!"); + stage = 10; + break; + case 2: + player("I'm here to kill you!"); + stage = 20; + break; + case 3: + player("Can I have some sq'irks please?"); + stage = 30; + break; + case 4: + player("I'm just passing by."); + stage = 40; + break; + } + break; + case 10: + player("I go where I like and do what I like."); + stage = 11; + break; + case 11: + npc("Not in my house. Be gone!"); + stage = 12; + break; + case 12: + end(); + tele(); + break; + case 20: + npc("I think not!"); + stage = 21; + break; + case 21: + end(); + tele(); + break; + case 30: + npc("What do you want them for?"); + stage = 31; + break; + case 31: + player("Someone asked me to bring them some."); + stage = 32; + break; + case 32: + npc("Who?"); + stage = 33; + break; + case 33: + player("You find yourself compelled to answer truthfully:", "Osman."); + stage = 34; + break; + case 34: + npc("In that case I'm sorry, you can't. I have had a falling", "out with him recently and would rather not oblige him."); + stage = 35; + break; + case 35: + end(); + break; + case 40: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5531 }; + } + + /** + * Method used to tele the player out. + */ + public void tele() { + npc.sendChat("Be gone intruder!"); + player.lock(); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.unlock(); + player.getProperties().setTeleportLocation(new Location(3321, 3143, 0)); + return true; + } + }); + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SpellbookSwapDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SpellbookSwapDialogue.java new file mode 100644 index 000000000..164e38366 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SpellbookSwapDialogue.java @@ -0,0 +1,87 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; + +/** + * Handles the SpellbookSwapDialogue dialogue. + * @author Vexia + * + */ +@Initializable +public class SpellbookSwapDialogue extends DialoguePlugin { + + /** + * If we're using the perk. + */ + private boolean perk; + + /** + * Constructs a new {@Code SpellbookSwapDialogue} {@Code Object} + */ + public SpellbookSwapDialogue() { + /* + * empty. + */ + } + + /** + * Constructs a new {@Code SpellbookSwapDialogue} {@Code Object} + * @param player the player. + */ + public SpellbookSwapDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SpellbookSwapDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length > 1) { + perk = true; + interpreter.sendOptions("Select a Spellbook", "Modern", "Ancient", "Lunar"); + return true; + } + interpreter.sendOptions("Select a Spellbook", "Ancient", "Modern"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (perk) { + SpellBook book = SpellBook.values()[buttonId - 1]; + player.getSpellBookManager().setSpellBook(book); + player.getInterfaceManager().openTab(new Component(book.getInterfaceId())); + end(); + return true; + } + int type = 0; + switch (buttonId) { + case 1: + type = 1; + break; + case 2: + type = 2; + break; + } + final SpellBook book = type == 1 ? SpellBook.ANCIENT : SpellBook.MODERN; + player.getSpellBookManager().setSpellBook(book); + player.getInterfaceManager().openTab(new Component(book.getInterfaceId())); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3264731 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SpiceSellerPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/SpiceSellerPlugin.java new file mode 100644 index 000000000..8fdb90097 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SpiceSellerPlugin.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SpiceSellerPlugin dialogue. + * @author 'Vexia + */ +@Initializable +public class SpiceSellerPlugin extends DialoguePlugin { + + public SpiceSellerPlugin() { + + } + + public SpiceSellerPlugin(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 572 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes.", "No."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 20; + break; + + } + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SpiceSellerPlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Are you interested in buying or selling spice?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SpiritGraahkDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SpiritGraahkDialogue.java new file mode 100644 index 000000000..012053ff6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SpiritGraahkDialogue.java @@ -0,0 +1,81 @@ +package core.game.content.dialogue; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.world.map.zone.impl.WildernessZone; + +/** + * Represents the spirit graahk's dialogue + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class SpiritGraahkDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GertrudesCatDialogue} {@code Object}. + */ + public SpiritGraahkDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GertrudesCatDialogue} {@code Object}. + * @param player the player. + */ + public SpiritGraahkDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SpiritGraahkDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (!(npc instanceof Familiar)) { + return false; + } + final Familiar fam = (Familiar) npc; + if (fam.getOwner() != player) { + player.getPacketDispatch().sendMessage("This is not your familiar."); + return true; + } else { + interpreter.sendOptions("Select an Option", "Chat", "Teleport"); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (buttonId) { + case 1: + player.sendMessage("The Graahk does not feel like talking now."); + end(); + break; + case 2: + if (!WildernessZone.checkTeleport(player, 20)) { + player.sendMessage("You cannot teleport with the Graahk above level 20 wilderness."); + end(); + } else { + player.getTeleporter().send(new Location(2786, 3002), TeleportType.NORMAL); + end(); + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7353, 7364 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SpiritKyattDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SpiritKyattDialogue.java new file mode 100644 index 000000000..6ef1cf549 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SpiritKyattDialogue.java @@ -0,0 +1,81 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.world.map.Location; +import core.game.world.map.zone.impl.WildernessZone; + +/** + * Represents the spirit kyatt's dialogue + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class SpiritKyattDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GertrudesCatDialogue} {@code Object}. + */ + public SpiritKyattDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GertrudesCatDialogue} {@code Object}. + * @param player the player. + */ + public SpiritKyattDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SpiritKyattDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (!(npc instanceof Familiar)) { + return false; + } + final Familiar f = (Familiar) npc; + if (f.getOwner() != player) { + player.getPacketDispatch().sendMessage("This is not your follower."); + return true; + } else { + interpreter.sendOptions("Select an Option", "Chat", "Teleport"); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (buttonId) { + case 1: + player.sendMessage("The Kyatt does not feel like talking now."); + end(); + break; + case 2: + if (!WildernessZone.checkTeleport(player, 20)) { + player.sendMessage("You cannot teleport with the Kyatt above level 20 wilderness."); + end(); + } else { + player.getTeleporter().send(new Location(2326, 3636), TeleportType.NORMAL); + end(); + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7365, 7366 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SquireDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SquireDialogue.java new file mode 100644 index 000000000..1593ed347 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SquireDialogue.java @@ -0,0 +1,233 @@ +package core.game.content.dialogue; + +import core.game.content.global.travel.ship.Ships; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SquireDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SquireDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code SquireDialogue.java} {@code Object}. + */ + public SquireDialogue() { + /** + * empty. + */ + } + + public SquireDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SquireDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length == 3) { + int type = (int) args[1]; + if (type == 0) {// lost + interpreter.sendDialogues(3781, FacialExpression.HALF_GUILTY, "The Void Knight was killed, another of our Order has", "fallen and that Island is lost."); + stage = 110; + } else if (type == 1) {// won and awarded. + String points = (String) args[2]; + interpreter.sendDialogues(3781, FacialExpression.HALF_GUILTY, "Congratulations! You managed to destroy all the portals!", "We've awarded you " + points + " Void Knight Commendation", "points. Please also accept these coins as a reward."); + stage = 100; + } else {// won and not awarded. + interpreter.sendDialogues(3781, FacialExpression.HALF_GUILTY, "Congratulations! You managed to destroy all the portals!", "However, you did not succeed in reaching the required", "amount of damage delt we cannot grant you a reward."); + stage = 101; + } + return true; + } + npc = (NPC) args[0]; + if (args.length == 2) { + npc("Be quick, we're under attack!"); + stage = 699; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi, how can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (npc.getId() == 3781) { + interpreter.sendOptions("Select an Option", "I'd like to go back to Port Sarim please.", "I'm fine thanks."); + stage = 500; + return true; + } + interpreter.sendOptions("Select an Option", "Who are you?", "Where does this ship go?", "I'd like to go to your outpost.", "I'm fine thanks."); + stage = 1; + break; + case 500: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I'd like to go back to Port Sarim please."); + stage = 502; + break; + case 2: + interpreter.sendDialogues(player, null, "I'm fine thanks."); + stage = 501; + break; + } + break; + case 501: + end(); + break; + case 502: + interpreter.sendDialogues(npc, null, "Ok, but please come back soon and help us."); + stage = 503; + break; + case 503: + end(); + Ships.PEST_TO_PORT_SARIM.sail(player); + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where does this ship go?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like to go to your outpost."); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm fine thanks."); + stage = 40; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm a Squire for the Void Knights."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "The who?"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The Void Knights, they are great warriors of balance", "who do Guthix's work here in 2009scape."); + stage = 13; + break; + case 13: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "To the Void Knight outpost. It's a small island just off", "Karamja."); + stage = 21; + break; + case 21: + interpreter.sendOptions("Select an Option", "I'd like to go to your outpost.", "That's nice."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like to go to your outpost."); + stage = 23; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's nice."); + stage = 200; + break; + } + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Certainly, right this way."); + stage = 24; + break; + case 24: + end(); + Ships.PORT_SARIM_TO_PEST_CONTROL.sail(player); + break; + case 200: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Certainly, right this way."); + stage = 24; + break; + case 40: + end(); + break; + case 699: + options("What's going on?", "How do I repair things?", "I want to leave.", "I'd better get back to it then."); + stage = 700; + break; + case 700:// ingame + switch (buttonId) { + case 1: + player("What's going on?"); + stage = 710; + break; + case 2: + player("How do I repair things?"); + stage = 720; + break; + case 3: + player("I want to leave."); + stage = 730; + break; + case 4: + player("I'd better get back to it then."); + stage = 740; + break; + } + break; + case 710: + npc("This island is being invaded by outsiders and the Void", "Knight over there is using a ritual to unsummon their", "portals. We must defend the Void Knight at all costs.", "however if you get an opening you can destroy the portals."); + stage = 711; + break; + case 711: + end(); + break; + case 720: + npc("There are trees on the island. You'll need to chop them", "down for logs and use a hammer to repair the defences.", "Be careful tough, the trees here don't grow back very", "fast so your resources are limited!"); + stage = 721; + break; + case 721: + end(); + break; + case 730: + end(); + break; + case 740: + end(); + break; + case 100: + String RED = ""; + String BLUE = ""; + interpreter.sendDialogue(BLUE + "You now have " + RED + "" + player.getSavedData().getActivityData().getPestPoints() + "" + BLUE + " Void Knight Commendation points!", "You can speak to a Void Knight to exchange your points for", "rewards."); + stage = 101; + break; + case 101: + end(); + break; + case 110: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3781, 3790 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SquireMagicDialougue.java b/Server/src/main/java/Server/core/game/content/dialogue/SquireMagicDialougue.java new file mode 100644 index 000000000..29c21508a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SquireMagicDialougue.java @@ -0,0 +1,78 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the magic shop squire owner dialgoue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SquireMagicDialougue extends DialoguePlugin { + + /** + * Constructs a new {@code SquireMagicDialougue} {@code Object}. + */ + public SquireMagicDialougue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SquireMagicDialougue} {@code Object}. + * @param player the player. + */ + public SquireMagicDialougue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SquireMagicDialougue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hi, how can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("What do you have for sale?", "I'm fine thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + player("I'm fine thanks."); + stage = 20; + break; + } + break; + case 10: + end(); + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3796, 3798, 3799 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SquireTypeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SquireTypeDialogue.java new file mode 100644 index 000000000..80163abda --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SquireTypeDialogue.java @@ -0,0 +1,125 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the different tier of squire dialouges. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SquireTypeDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code SquireTypeDialogue} {@code Object}. + */ + public SquireTypeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SquireTypeDialogue} {@code Object}. + * @param player the player. + */ + public SquireTypeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SquireTypeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hi, how can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Who are you?", "What's going on here?", "I'm fine thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("What's going on here?"); + stage = 20; + break; + case 3: + player("I'm fine thanks."); + stage = 30; + break; + } + break; + case 10: + npc("I'm a squire for the Void Knights."); + stage = 11; + break; + case 11: + player("The who?"); + stage = 12; + break; + case 12: + npc("The Void Knights, they are great warriors of balance", "who do Guthix's work here in 2009scape."); + stage = 13; + break; + case 13: + end(); + break; + case 20: + npc("This is where we launch our landers to combat the", "invasion of the nearby islands. You'll see three landers - ", "one for novice, intermediate and veteran adventurers.", "Each has a different difficulty, but they therefore offer"); + stage = 21; + break; + case 21: + npc("varying rewards."); + stage = 22; + break; + case 22: + player("And this lander is...?"); + stage = 23; + break; + case 23: + npc("The " + (npc.getId() == 3802 ? "novice" : npc.getId() == 6140 ? "intermediate" : "veteran") + "."); + stage = 24; + break; + case 24: + player("So how do they work?"); + stage = 25; + break; + case 25: + npc("Simple. We send each lander out every five minutes,", "however we need at least five volunteers or it's a suicide", "mission. The lander can only hold a maximum of", "twenty five people though, so we do send them out"); + stage = 26; + break; + case 26: + npc("early if they get full. If you'd be willing to help us then", "just wait in the lander and we'll launch it as soon as it's", "ready. However you will need a combat level of " + (npc.getId() == 3802 ? "40" : npc.getId() == 6140 ? "70" : "100") + " to", "use this lander."); + stage = 27; + break; + case 27: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3802, 6140, 6141 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/StankersDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/StankersDialogue.java new file mode 100644 index 000000000..c3dbcee95 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/StankersDialogue.java @@ -0,0 +1,208 @@ +package core.game.content.dialogue; + +import core.tools.Items; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the Galahad dialogue + * @author afaroutdude + * https://chisel.weirdgloop.org/dialogue/content/486329 + * https://www.youtube.com/watch?v=XPTkSDyKpWs + */ +@Initializable +public class StankersDialogue extends DialoguePlugin { + + private final Item POISON_CHALICE = new Item(Items.POISON_CHALICE_197); + + public StankersDialogue() {} + + public StankersDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new StankersDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hello bold adventurer."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + AchievementDiary diary = player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE); + int level = 1; + + switch (stage) { + case 999: + end(); + break; + case 1: + options("Are these your trucks?", "Hello Stankers.","Talk about Achievement Diary."); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + player("Are these your trucks?"); + stage = 10; + break; + case 2: + player("Hello Mr. Stankers."); + stage = 20; + break; + case 3: + if (!diary.isStarted(level)) { + player("Do you have an Achievement Diary for me?"); + stage = 100; + break; + } + else if (diary.isLevelRewarded(level) && !player.hasItem(diary.getType().getRewards()[level][0])) { + player("I seem to have lost my seers' headband..."); + stage = 80; + break; + } + else if (diary.isLevelRewarded(level)) { + player("Can you remind me what my headband does?"); + stage = 90; + break; + } + else if (diary.isComplete(level, true)) { + player("Hi. I've completed the Medium tasks in my Achievement", "Diary. Can I have a reward?"); + stage = 200; + break; + } + else { + player("Hi! Can you help me out with the Achievement Diary", "tasks?"); + stage = 101; + break; + } + } + break; + case 10: + npc("Yes, I use them to transport coal over the river.", + "I will let other people use them too, I'm a nice", + "person like that..."); + stage++; + break; + case 11: + npc("Just put coal in a truck and I'll move it down to","my depot over the river."); + stage = 999; + break; + case 20: + npc("Would you like a poison chalice?"); + stage++; + break; + case 21: + options("Yes please.","What's a poison chalice?","No thank you."); + stage++; + break; + case 22: + switch (buttonId) { + case 1: + player("Yes please."); + stage = 30; + break; + case 2: + player("What's a poison chalice?"); + stage = 40; + break; + case 3: + player("No thank you."); + stage = 1; + break; + } + break; + case 30: + end(); + player.getInventory().add(POISON_CHALICE); + player.sendMessage("Stankers hands you a glass of strangely coloured liquid..."); + break; + case 40: + npc("It's an exciting drink I've invented. I don't know", + "what it tastes like, I haven't tried it myself."); + stage++; + break; + case 41: + options("Yes please.","No thank you."); + stage++; + break; + case 42: + switch (buttonId) { + case 1: + player("Yes please."); + stage = 30; + break; + case 2: + player("No thank you."); + stage = 1; + break; + } + break; + + case 80: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("Here's your replacement. Please be more careful."); + stage = 999; + break; + case 90: + npc("Your headband will help you get experience when", "woodcutting maple trees, and an extra log or two when", "cutting normal trees. I've also told Geoff to increase"); + stage++; + case 91: + npc("your flax allowance in acknowledgement of your", "standing."); + stage = 999; + break; + case 100: + npc("I certainly do - we have a set of tasks spanning Seers'", "Village, Catherby, Hemenster and the Sinclair Mansion.", "Just complete the tasks listed in the Achievement Diary", "and they will be ticked off automatically."); + stage = 999; + break; + case 101: + npc("I'm afraid not. It is important that adventurers", "complete the tasks unaided. That way, only the truly", "worthy collect the spoils."); + stage = 999; + break; + case 200: + npc("Well done! Yes, I have a reward for you. I'll just", "anoint your headband with one of my mixtures. Oh and", "here's an old lamp I had lying around."); + stage++; + break; + case 201: + if (!player.hasItem(diary.getType().getRewards()[level][0])) { + npc("I need your headband to anoint it! Come back when", "you have it."); + stage = 999; + } else { + diary.setLevelRewarded(level); + player.getInventory().add(diary.getType().getRewards()[level][1]); + sendDialogue("Stankers produces a chalice containing a vile-looking concoction that", "he pours all over your headband."); + stage++; + } + break; + case 202: + player("Erm, thank you... I guess."); + stage++; + break; + case 203: + npc("Don't worry, it may be a little sticky for a while, but", "now your headband will help you get experience when", "woodcutting maple trees, and an extra log or two when", "cutting normal trees. I'll also tell Geoff - erm - Flax to"); + stage++; + break; + case 204: + npc("increase your flax allowance in acknowledgement of your", "standing."); + stage=999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 383 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/StringBowDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/StringBowDialogue.java new file mode 100644 index 000000000..e53cca457 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/StringBowDialogue.java @@ -0,0 +1,112 @@ +/* +package core.game.content.dialogue; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.fletching.items.bow.StringBow; +import core.game.node.entity.skill.fletching.items.bow.StringPulse; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.entity.player.link.RunScript; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.game.node.item.Item; + +*/ +/** + * Handles the StringBowDialogue dialogue. + * @author Vexia + *//* + +@InitializablePlugin +public class StringBowDialogue extends DialoguePlugin { + + */ +/** + * Constructs a new {@code StringBowDialogue.java} {@code Object}. + *//* + + public StringBowDialogue() { + } + + */ +/** + * Constructs a new {@code StringBowDialogue.java} {@code Object}. + * @param player the player. + *//* + + public StringBowDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new StringBowDialogue(player); + } + + */ +/** + * The item. + *//* + + private Item item; + + */ +/** + * The string bow enum. + *//* + + private StringBow bow; + + @Override + public boolean open(Object... args) { + item = (Item) args[0]; + bow = StringBow.forItem(item.getId()); + if (bow == null) { + return true; + } + player.getInterfaceManager().openChatbox(309); + player.getPacketDispatch().sendString("



" + bow.getProduct().getName(), 309, 6); + player.getPacketDispatch().sendItemZoomOnInterface(bow.getProduct().getId(), 160, 309, 2); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + switch (stage) { + case 0: + System.out.println(buttonId); + int amt = 0; + switch (buttonId) { + case 5: + amt = 1; + break; + case 4: + amt = 5; + break; + case 3: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + player.getPulseManager().run(new StringPulse(player, item, bow, ammount)); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount"); + return true; + case 2: + amt = player.getInventory().getAmount(item); + break; + } + player.getPulseManager().run(new StringPulse(player, item, bow, amt)); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 9174399 }; + } + +} +*/ diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SurgeonGeneralTafani.java b/Server/src/main/java/Server/core/game/content/dialogue/SurgeonGeneralTafani.java new file mode 100644 index 000000000..fc23079cb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SurgeonGeneralTafani.java @@ -0,0 +1,195 @@ +package core.game.content.dialogue; + +import core.game.content.global.Skillcape; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the dialogue plugin used for surgeon general tafani. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SurgeonGeneralTafani extends DialoguePlugin { + + /** + * Constructs a new {@code SurgeonGeneralTafani} {@code Object} + */ + public SurgeonGeneralTafani() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SurgeonGeneralTafani} {@code Object}. + * @param player the player. + */ + public SurgeonGeneralTafani(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SurgeonGeneralTafani(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi. How can I help?"); + stage = 1; + break; + case 1: + if (Skillcape.isMaster(player, Skills.HITPOINTS)) { + interpreter.sendOptions("Select an Option", "Can you heal me?", "Do you see a lot of injured fighters?", "Do you come here often?", "Can I buy a Skillcape of Hitpoints from you?"); + stage = 80; + } else { + interpreter.sendOptions("Select an Option", "Can you heal me?", "Do you see a lot of injured fighters?", "Do you come here often?", "Where can I get a cape like yours?"); + stage = 2; + } + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you heal me?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you see a lot of injured fighters?"); + stage = 30; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you come here often?"); + stage = 20; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where can I get a cape like yours?"); + stage = 40; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Of course!"); + stage = 11; + break; + case 11: + npc.animate(new Animation(881)); + if (player.getSkills().getLifepoints() == player.getSkills().getStaticLevel(Skills.HITPOINTS)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You look healthy to me!"); + } else { + player.getSkills().heal(player.getSkills().getStaticLevel(Skills.HITPOINTS)); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There you go!"); + } + stage = 12; + break; + case 12: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I work here, so yes!"); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes I do. Thankfully we can cope with almost aything.", "Jaraah really is a wonderful surgeon, this methods are a", "little unorthodox but he gets the job done."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I shouldn't tell you this but his nickname is 'The", "Butcher'."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's reassuring."); + stage = 33; + break; + case 33: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, these capes are only available for people who have", "achieved a Hitpoint level of 99. You should go and train", "some more and come back to me when your Hitpoints", "are higher."); + stage = 41; + break; + case 41: + end(); + break; + case 80: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you heal me?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you see a lot of injured fighters?"); + stage = 30; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you come here often?"); + stage = 20; + break; + case 4: + player("Can I buy a Skillcape of Hitpoints from you?"); + stage = 81; + break; + } + break; + case 81: + npc("Why, certainly my friend. However, owning such an item", "makes you part of an elite group and that privilege will", "cost you 99000 coins."); + stage = 82; + break; + case 82: + options("Sorry, that's much too pricey.", "Sure, that's not too expensive for such a magnificent cape."); + stage = 83; + break; + case 83: + switch (buttonId) { + case 1: + player("Sorry, that's much too pricey."); + stage = 84; + break; + case 2: + player("Sure, that's not too expensive for such a magnificent", "cape."); + stage = 86; + break; + } + break; + case 84: + npc("I'm sorry you feel that way. Still if you change", "your mind..."); + stage = 85; + break; + case 85: + end(); + break; + case 86: + if (Skillcape.purchase(player, Skills.HITPOINTS)) { + npc("There you go! I hope you enjoy it."); + } + stage = 87; + break; + case 87: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 961 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SurokMagis.java b/Server/src/main/java/Server/core/game/content/dialogue/SurokMagis.java new file mode 100644 index 000000000..3d8fb3c01 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SurokMagis.java @@ -0,0 +1,76 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles the SurokMagis dialogue. + * @author 'Vexia + */ +public class SurokMagis extends DialoguePlugin { + + public SurokMagis() { + + } + + public SurokMagis(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 5834, 5835, 7002, 7136 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What do you want? ...Oh, wait. I know! You're", "porbably just like all the others, aren't you? After some", "fancy spell or potion from me, I bet!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No! atleast, I don't think so. What sort of spells", "do you have?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hah! I knew it! I expect you want my Aphro-Dizzy-", "Yak spell! Want someone to fall madly in love with you,", "eh?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That spell sounds very interesting, but I didn't mean to", "disturb you!"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, I see that you do have some manners. I'm glad", "to see that you use them."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Now, if it's all the same, I am very bust at the", "moment. Come back another time", "please and thank you."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, ofcourse!"); + stage = 7; + break; + case 7: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SurokMagis(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Excuse me?"); + stage = 0; + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/SvetlanaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/SvetlanaDialogue.java new file mode 100644 index 000000000..36f20e8d2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/SvetlanaDialogue.java @@ -0,0 +1,46 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the SvetlanaDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class SvetlanaDialogue extends DialoguePlugin { + + public SvetlanaDialogue() { + + } + + public SvetlanaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new SvetlanaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm... you smell strange..."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6034 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TakiDwarfDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TakiDwarfDialogue.java new file mode 100644 index 000000000..509cb5b5c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TakiDwarfDialogue.java @@ -0,0 +1,64 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TakiDwarfDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class TakiDwarfDialogue extends DialoguePlugin { + + public TakiDwarfDialogue() { + + } + + public TakiDwarfDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 7115 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Hi little fellow."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "What did you just say to me!?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.OLD_NORMAL, "Arrr! nothing, nothing at all.."); + stage = 3; + break; + case 3: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TakiDwarfDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Arrr!"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TarquinDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TarquinDialogue.java new file mode 100644 index 000000000..4561c7d50 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TarquinDialogue.java @@ -0,0 +1,140 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TarquinDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class TarquinDialogue extends DialoguePlugin { + + public TarquinDialogue() { + + } + + public TarquinDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 3328 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello old bean. Is there something I can help you", "with?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Who are you?", "Can you teach me about Canoeing?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's really quite simple. Just walk down to that tree on", "the water bank and chop it down."); + stage = 24; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "My name is Tarquin Marjoribanks."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'd be suprised if you haven't already heard of me?"); + stage = 12; + break; + case 12: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why would I have heard of you Mr. Marjoribanks?"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's pronounced 'Marchbanks'!"); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You should know of me because I am a member of the", "royal family of Misthalin!"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Are you related to King Roald?"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh yes! Quite closely actually."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm his 4th cousin, once removed on his mothers side."); + stage = 18; + break; + case 18: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Er... Okay. What are you doing here then?"); + stage = 19; + break; + case 19: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm canoeing on the river! It's enormous fun! Would", "you like to know how?"); + stage = 20; + break; + case 20: + interpreter.sendOptions("Select an Option", "Yes", "No"); + stage = 21; + break; + case 21: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's really quite simple. Just walk down to that tree on", "the water bank and chop it down."); + stage = 24; + break; + case 2: + end(); + break; + + } + break; + case 24: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Then take your hatchet to it and shape it how you like!"); + stage = 26; + break; + case 26: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You look like you know your way around a tree, you can", "you can make many canoes."); + stage = 27; + break; + case 27: + end(); + break; + case 25: + end(); + break; + case 100: + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TarquinDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TaxidermistDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TaxidermistDialogue.java new file mode 100644 index 000000000..5a7626b26 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TaxidermistDialogue.java @@ -0,0 +1,74 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TaxidermistDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class TaxidermistDialogue extends DialoguePlugin { + + public TaxidermistDialogue() { + + } + + public TaxidermistDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TaxidermistDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, hello. Have you got something you want", "preserving?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes please", "Not right now"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Not right now."); + stage = 20; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Give it to me to look at then."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4246 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TeaSellerDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TeaSellerDialogue.java new file mode 100644 index 000000000..ec41e9fea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TeaSellerDialogue.java @@ -0,0 +1,89 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TeaSellerDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class TeaSellerDialogue extends DialoguePlugin { + + public TeaSellerDialogue() { + + } + + public TeaSellerDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 595 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks.", "What are you selling?"); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What are you selling?"); + stage = 30; + break; + } + + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Only the most delicious infusion of the leaves of the tea", "plant. Grown in the exotic regions of this world. Buy", "yourself a cup."); + stage = 31; + break; + case 31: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, if you're sure. You know where to come if you do."); + stage = 21; + break; + case 21: + end(); + break; + case 10: + npc.openShop(player); + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TeaSellerDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings! Are you in need of refreshment?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TeegidDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TeegidDialogue.java new file mode 100644 index 000000000..22c21ed57 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TeegidDialogue.java @@ -0,0 +1,67 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Direction; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Handles the TeegidDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class TeegidDialogue extends DialoguePlugin { + + public TeegidDialogue() { + + } + + public TeegidDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 1213 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yeah. What is it to you?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nice day for it."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Suppose it is."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TeegidDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc.setDirection(Direction.SOUTH); + npc.faceLocation(Location.create(2923, 3418, 0)); + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So, you're doing laundry, eh?"); + stage = 0; + npc.faceLocation(Location.create(2923, 3418, 0)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ThessaliaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ThessaliaDialogue.java new file mode 100644 index 000000000..e084d2d48 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ThessaliaDialogue.java @@ -0,0 +1,196 @@ +package core.game.content.dialogue; + +import core.game.component.Component; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; + +/** + * Represents the thessalia dialogue plugin. + */ + +@Initializable +public final class ThessaliaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ThessaliaDialogue} {@code Object}. + */ + public ThessaliaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ThessaliaDialogue} {@code Object}. + * @param player the player. + */ + public ThessaliaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ThessaliaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + + //The trade argument is handled elsewhere + if (args.length == 3) { //Right-Click 'Change-Clothes' Option + if (player.getEquipment().isEmpty()) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 0); + if (player.isMale()) { + end(); + player.getInterfaceManager().open(new Component(591)); + } else { + end(); + player.getInterfaceManager().open(new Component(594)); + } + } + else{ //Has some armour equipped + interpreter.sendDialogues(548, FacialExpression.WORRIED, "You can't try them on while wearing armour. Take","it off and speak to me again."); + stage = 52; + } + return true; + } + + //Default Talk + + interpreter.sendDialogues(npc, FacialExpression.ASKING, "Would you like to buy any fine clothes?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Choose an option:", "What do you have?", "No, thank you."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.ASKING, "What do you have?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "No, thank you."); + stage = 51; + break; + } + break; + + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I have a number of fine pieces of clothing on sale or,", "if you prefer, I can offer you an exclusive", "total clothing makeover?"); + stage++; + break; + case 11: + interpreter.sendOptions("Select an Option", "Tell me more about this makeover.", "I'd just like to buy some clothes."); + stage++; + break; + + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.THINKING, "Tell me more about this makeover."); + stage = 20; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "I'd just like to buy some clothes."); + stage = 50; + break; + } + break; + + //More about the makeover + case 20: + interpreter.sendDialogues(npc, FacialExpression.HAPPY, "Certainly!"); + stage++; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HAPPY, "Here at Thessalia's fine clothing boutique, we offer a", "unique service where we will totally revamp your outfit", "to your choosing, for... wait for it..."); + stage++; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.FRIENDLY, "A fee of only 500 gold coins! Tired of always wearing", "the same old outfit, day in, day out? This is the service", "for you!"); + stage++; + break; + case 23: + interpreter.sendDialogues(npc, FacialExpression.ASKING, "So what do you say? Interested? We can change either", "your top, or your legwear for only 500 gold a item!"); + stage++; + break; + + //Buying Clothes or changing outfit + case 24: + interpreter.sendOptions("Select an Option", "I'd like to change my outfit, please.", "I'd just like to buy some clothes."); + stage++; + break; + case 25: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HAPPY, "I'd like to change my outfit, please."); + stage = 30; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "I'd just like to buy some clothes."); + stage = 50; + break; + } + break; + + //Changing outfit code + case 30: + if(player.getEquipment().isEmpty()){ + interpreter.sendDialogues(npc, FacialExpression.HAPPY, "Just select what style and colour you would like from", "this catalogue, and then give me the 1000 gold when", "you've picked."); + stage++; + break; + } else { //Has some armour equipped + interpreter.sendDialogues(npc, FacialExpression.WORRIED, "You can't try them on while wearing armour. Take", "it off and speak to me again."); + stage = 52; + break; + } + case 31://Player has money and is not wearing armour/weapons + if (player.getEquipment().isEmpty()) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 0); + if (player.isMale()) { + end(); + player.getInterfaceManager().open(new Component(591)); + } else { + end(); + player.getInterfaceManager().open(new Component(594)); + } + } + break; + + //Closing Remarks + case 49: //Not enough money + interpreter.sendDialogues(npc, FacialExpression.FRIENDLY, "That's ok! Just come back when you do have it!"); + stage = 52; + break; + + case 50://Just buying some clothes + end(); + npc.openShop(player); + break; + + case 51://No Thanks + npc("Well, please return if you change your mind."); + stage++; + break; + case 52: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 548 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ThormacDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/ThormacDialogue.kt new file mode 100644 index 000000000..4368d1886 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ThormacDialogue.kt @@ -0,0 +1,157 @@ +package core.game.content.dialogue + +import core.game.component.Component +import core.tools.Items +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.Item +import core.plugin.Initializable + +/** + * Thormac + * Involved in Scorpion Catcher + * @author afaroutdude + */ +@Initializable +class ThormacDialogue(player: Player? = null) : DialoguePlugin(player) { + val scorpionCageEmpty = Item(Items.SCORPION_CAGE_456) + val scorpionCageFull = Item(Items.SCORPION_CAGE_463) + val scorpionCages: IntArray = intArrayOf( + Items.SCORPION_CAGE_456, + Items.SCORPION_CAGE_457, + Items.SCORPION_CAGE_458, + Items.SCORPION_CAGE_459, + Items.SCORPION_CAGE_460, + Items.SCORPION_CAGE_461, + Items.SCORPION_CAGE_462, + Items.SCORPION_CAGE_463 + ) + + val COMPONENT = Component(332) + + override fun open(vararg args: Any?): Boolean { + val scorpionStage = try { + player?.questRepository?.getStage("Scorpion Catcher") ?: 100 + } catch (e: Exception) { + 100 + } + when (scorpionStage) { + 0 -> { + npc("Hello I am Thormac the Sorcerer, I don't suppose you could be of assistance to me?");stage = 0 + } + 10, 20, 30, 40, 50, 60, 70, 80, 90 -> { + npc("How goes your quest?");stage = 70 + } + 100 -> { + npc("Thank you for rescuing my scorpions.");stage = 100 + } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 999 -> {end()} + + // initial convo + 0 -> {options("What do you need assistance with?", "I'm a little busy.");stage++} + 1 -> when(buttonId){ + 1 -> {player ("What do you need assistance with?");stage=2} + 2 -> {player ("I'm a little busy.");stage=50} + } + 2 -> {npc ("I've lost my pet scorpions. They're lesser Kharid scorpions, a very rare breed. I left their cage door open, now I don't know where they've gone. There's three of them, and they're quick little beasties. They're all over 2009scape.")} + 3 -> {options ("So how would I go about catching them then?", "What's in it for me?", "I'm not interested then.");stage++} + 4 -> when(buttonId){ + 1 -> {player("So how would I go about catching them then?");stage++} + 2 -> {player("What's in it for me?");stage=20}} + 3 -> {player ("I'm not interested then.");stage=51} + 5 -> {npc("Well I have a scorpion cage here which you can use to catch them in.");stage++} + 6 -> { + sendDialogue("Thormac gives you a cage.") + player.inventory.add(scorpionCageEmpty) + stage++ + } + 7 -> {npc ("If you go up to the village of Seers, to the North of here, one of them will be able to tell you where the scorpions are now.");stage++} + 8 -> {options ("What's in it for me?", "Ok, I will do it then.");stage++} + 9 -> when(buttonId){ + 1 -> {player("What's in it for me?");stage=20} + 2 -> { + player("Ok, I will do it then.") + // start quest here + stage = 999 + } + } + + 20 -> {npc ("Well I suppose I can aid you with my skills as a staff sorcerer. Most battlestaffs around here are a bit puny. I can beef them up for you a bit. If you go up to the village of Seers, to the North of here, one of them will be able to tell you where the scorpions are now.");stage++} + 21 -> {options("So how would I go about catching them then?","Ok, I will do it then.");stage++} + 22 -> when(buttonId) { + 1 -> {player("So how would I go about catching them then?");stage=5} + 2 -> { + player("Ok, I wil do it then.") + // start quest here + stage = 999 + } + } + 50 -> {npc ("Come back if you have some spare time.");stage=999} // invention + 51 -> {npc ("Come back if you change your mind.");stage=999} // invention + + // after that + 70 -> { + if (!player.inventory.containsAtLeastOneItem(scorpionCages) + && !player.bank.containsAtLeastOneItem(scorpionCages)) { + player("I've lost my cage.") + stage = 71 + } else if (!player.inventory.containsAtLeastOneItem(scorpionCageFull.id)) { + player("I've not caught all the scorpions yet.") + stage = 72 + } else { + player("I have retrieved all your scorpions.") + stage = 73 + } + } + 71 -> { + // if lost or destroyed cage + npc("Ok, here's another cage. You're almost as bad at losing things as me.") + player.inventory.add(scorpionCageEmpty) + stage=999 + } + 72 -> {npc("Well remember to go speak to the Seers, North of here, if you need any help.");stage=999} + 73 -> { + npc("Aha, my little scorpions home at last!") + // complete quest here + stage=999 + } + + // post-quest + 100 -> { + if (!player.inventory.contains(84,1)) { + options("That's okay.", "You said you'd enchant my battlestaff for me.") + } else { + options("That's okay.", "You said you'd enchant my battlestaff for me.", "Could you enchant my Armadyl battlestaff?") + } + stage++ + } + 101 -> when (buttonId) { + 1 -> {player("That's okay.");stage=999} + 2 -> {player ("You said you'd enchant my battlestaff for me.");stage=110} + 3 -> {player ("Could you enchant my Armadyl battlestaff?");stage=150} + } + 110 -> {npc("Yes, although it'll cost you 40,000 coins for the","materials. What kind of staff did you want enchanting?");stage++} + 111 -> { + end() + player.interfaceManager.open(COMPONENT) + player.achievementDiaryManager.finishTask(player, DiaryType.SEERS_VILLAGE, 1, 1) + } + } + return true; + } + + + override fun newInstance(player: Player?): DialoguePlugin { + return ThormacDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(389) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ThuroDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ThuroDialogue.java new file mode 100644 index 000000000..1af14ae17 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ThuroDialogue.java @@ -0,0 +1,506 @@ +package core.game.content.dialogue; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for thurgo. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ThuroDialogue extends DialoguePlugin { + + /** + * Represents the skillcape items. + */ + private static final Item[] ITEMS = new Item[] { new Item(9795), new Item(9796), new Item(9797) }; + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 99000); + + /** + * Represents the redberry pie item. + */ + private static final Item REDBERRY_PIE = new Item(2325); + + /** + * Represents the blurite ore item. + */ + private static final Item BLURITE_ORE = new Item(668); + + /** + * Represents the iron bars item. + */ + private static final Item IRON_BARS = new Item(2351, 2); + + /** + * Represents the blurite sword item. + */ + private static final Item BLURITE_SWORD = new Item(667); + + /** + * Represents the current quest. + */ + private Quest quest; + + /** + * Constructs a new {@code ThuroDialogu} {@code Object}. + */ + public ThuroDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ThuroDialogue} {@code Object}. + * @param player the player. + */ + public ThuroDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ThuroDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("The Knight's Sword"); + player.removeAttribute("thurgo:1"); + switch (quest.getStage(player)) { + default: + interpreter.sendOptions("Ask a Question", "Skillcape of Smithing.", "Something else."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (stage == 0 && buttonId == 1 || player.getAttribute("thurgo:1", false)) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's an unusual cape you're wearing, what is it?"); + stage = 10; + player.setAttribute("thurgo:1", true); + break; + case 2: + interpreter.sendDialogue("Thurgo doesn't appear to be interested in talking."); + stage = 9000; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "It's a Skillcape of Smithing. Shows that I am a master", "blacksmith, but of course that's only to be expected. I", "am an Imcando dwarf after all and everybody knows", "we're the best blacksmiths."); + stage = 11; + break; + case 9000: + end(); + break; + case 11: + if (player.getSkills().getLevel(Skills.SMITHING) == 99) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Wow! An adventurer who is as skilled as me", "would you like to purchase a Skillcape of", "smithing for 99,000 coins?"); + stage = 12; + return true; + } + end(); + break; + case 12: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks."); + stage = 13; + break; + case 13: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 15; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 14; + break; + } + break; + case 14: + end(); + break; + case 15: + if (player.getInventory().freeSlots() < 2) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't have enough room in my inventory."); + stage = 14; + return true; + } + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (!player.getInventory().remove(COINS)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't seem to have enough coins."); + stage = 14; + return true; + } + player.getInventory().add(player.getSkills().getMasteredSkills() >= 1 ? ITEMS[1] : ITEMS[0]); + player.getInventory().add(ITEMS[2]); + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "There you go! You're truley a master of Smithing."); + stage = 16; + break; + case 16: + end(); + break; + } + return true; + } + switch (quest.getStage(player)) { + case 60: + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "About that sword..."); + stage = 1; + break; + case 1: + if (player.getInventory().contains(667, 1) || player.getEquipment().contains(667, 1) || player.getBank().contains(667, 1)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks for all your help in getting it for me!"); + stage = 9; + } else { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "How are you doing finding those sword materials?"); + stage = 2; + } + break; + case 2: + if (player.getInventory().containsItem(BLURITE_ORE) && player.getInventory().containsItem(IRON_BARS)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I have them right here."); + stage = 5; + } else { + if (player.getInventory().containsItem(BLURITE_ORE)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't have enough iron bars..."); + stage = 3; + return true; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't have any blurite ore yet..."); + stage = 3; + } + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Better go get some then, huh?"); + stage = 4; + break; + case 4: + end(); + break; + case 5: + interpreter.sendDialogue("You give the blurite ore and two iron bars to Thurgo. Thurgo starts", "to make the sword. Thurgo hands you a sword."); + stage = 6; + break; + case 6: + if (player.getInventory().remove(BLURITE_ORE) && player.getInventory().remove(IRON_BARS)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thank you very much!"); + player.getInventory().add(BLURITE_SWORD); + stage = 7; + } + break; + case 7: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Just remember to call in with more pie some time!"); + stage = 8; + break; + case 8: + end(); + break; + case 9: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "No worries mate."); + stage = 10; + break; + case 10: + end(); + break; + } + break; + case 50: + switch (stage) { + case 0: + if (player.getInventory().contains(666, 1)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I have found a picture of the sword I would like you to", "make."); + stage = 5; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "About that sword..."); + stage = 1; + } + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Have you got a picture of the sword for me yet?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, not yet."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Well, come back when you do."); + stage = 4; + break; + case 5: + interpreter.sendDialogue("You give the portrait to Thurgo. Thurgo studies the portrait."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Ok. You'll need to get me some stuff in order for me", "to make this."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "I'll need two iron bars to make the sword to start with.", "I'll also need an ore called blurite. It's useless for", "making actual weapons for fighting with except", "crossbows, but I'll need some as decoration for the hilt."); + stage = 8; + break; + case 8: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "It is fairly rare sort of ore... The only place I know", "where to get it is under this cliff here..."); + stage = 9; + break; + case 9: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "But it is guarded by a very powerful ice giant."); + stage = 10; + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Most of the rocks in that cliff are pretty useless, and", "don't contain much of anything, but there's", "DEFINITELY some blurite in there."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "You'll need a little bit of mining experience to be able to", "find it."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok. I'll go and find them then."); + stage = 13; + break; + case 13: + if (player.getInventory().remove(new Item(666))) { + quest.setStage(player, 60); + end(); + } + break; + } + break; + case 40: + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "About that sword..."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Have you got a picture of the sword for me yet?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, not yet."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Well, come back when you do."); + stage = 4; + break; + case 4: + end(); + break; + } + break; + case 30: + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you make me a special sword?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Well, after bringing me my favorite food I guess I", "should give it a go. What sort of sword is it?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I need you to make a sword for one of Falador's", "knights. He had one which was passed down through five", "generations, but his squire has lost it. So we need an", "identical one to replace it."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "A Knight's sword eh? Well I'd need to know exactly", "how it looked before I could make a new one."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "All the Faladian knights used to have swords with unique", "designs according to their position. Could you bring me", "a picture or something?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll go and ask if his squire and see if I can find one."); + stage = 6; + break; + case 6: + quest.setStage(player, 40); + end(); + break; + case 24: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + if (player.getInventory().containsItem(REDBERRY_PIE)) { + interpreter.sendOptions("Select an Option", "Hello. Are you an Imcando dwarf?", "Would you like some redberry pie?"); + stage = 1; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello. Are you an Imcando dwarf?"); + stage = 10; + } + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello. Are you an Imcando dwarf?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Would you like some redberry pie?"); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Maybe. Who wants to know?"); + stage = 11; + break; + case 11: + if (player.getInventory().containsItem(REDBERRY_PIE)) { + interpreter.sendOptions("Select an Option", "Would you like some redberry pie?", "Can you make me a special sword?"); + stage = 12; + } else { + end(); + } + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Would you like some redberry pie?"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you make me a special sword?"); + stage = 13; + break; + } + break; + case 13: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "No, I don't do that anymore. I'm getting old."); + stage = 14; + break; + case 14: + end(); + break; + case 20: + interpreter.sendDialogue("You see Thurgo's eyes light up."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "I'd never say no to a redberry pie! They're GREAT", "stuff!"); + stage = 22; + break; + case 22: + interpreter.sendDialogue("You hand over the pie. Thurgo eats the pie. Thurgo pats his", "stomach."); + stage = 23; + break; + case 23: + if (player.getInventory().remove(REDBERRY_PIE)) { + quest.setStage(player, 30); + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "By Guthix! THAT was good pie! Anyone who makes pie", "like THAT has got to be alright!"); + stage = 24; + } + break; + case 24: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's an unusual cape you're wearing, what is it?"); + stage = 10; + break; + case 2: + interpreter.sendDialogue("Thurgo doesn't appear to be interested in talking."); + stage = 9000; + break; + } + break; + case 9000: + end(); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "It's a Skillcape of Smithing. Shows that I am a master", "blacksmith, but of course that's only to be expected. I", "am an Imcando dwarf after all and everybody knows", "we're the best blacksmiths."); + stage = 11; + break; + case 11: + if (player.getSkills().getLevel(Skills.SMITHING) == 99) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Wow! An adventurer who is as skilled as me", "would you like to purchase a Skillcape of", "smithing for 99,000 coins?"); + stage = 12; + return true; + } + end(); + break; + case 12: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thanks."); + stage = 13; + break; + case 13: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 15; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 14; + break; + } + break; + case 14: + end(); + break; + case 15: + if (player.getInventory().freeSlots() < 2) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't have enough room in my inventory."); + stage = 14; + return true; + } + if (!player.getInventory().remove(COINS)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't seem to have enough coins."); + stage = 14; + return true; + } + player.getInventory().add(player.getSkills().getMasteredSkills() >= 1 ? ITEMS[1] : ITEMS[0]); + player.getInventory().add(ITEMS[2]); + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "There you go! You're truley a master of Smithing."); + stage = 16; + break; + case 16: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 604 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TostigDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TostigDialogue.java new file mode 100644 index 000000000..8310a55dd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TostigDialogue.java @@ -0,0 +1,90 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TostigDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class TostigDialogue extends DialoguePlugin { + + public TostigDialogue() { + + } + + public TostigDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TostigDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi, what ales are you serving?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well sir, our speciality is Asgarnian Ale, we also serve", "Wizard's Mind Bomb and Dwarven Stout."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy a drink?"); + stage = 2; + break; + case 2: + interpreter.sendOptions("Select An Option", "Yes, please.", "No, thanks."); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thanks."); + stage = 4; + break; + } + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah well... so um... does the grey squirrel sing in the", "grove?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Huh?"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Er... nevermind."); + stage = 7; + break; + case 7: + end(); + break; + case 100: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1079 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TownCrierDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TownCrierDialogue.java new file mode 100644 index 000000000..0f4554c4c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TownCrierDialogue.java @@ -0,0 +1,236 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the town crier dialogue plugin. + * @author 'Vexia + */ +@Initializable +public final class TownCrierDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code TownCrierDialogue} {@code Object}. + */ + public TownCrierDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TownCrierDialogue} {@code Object}. + * @param player the player. + */ + public TownCrierDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TownCrierDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hear ye! Hear ye! Player Moderators massive help to ", GameWorld.getSettings().getName().substring(0, GameWorld.getSettings().getName().length() - 3) + "-"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 1: + npc("Oh, hello citizen. Are you here to find out about Player", "Moderators? Or perhaps would you like to know about the", "laws of the land?"); + stage = 2; + break; + case 2: + options("Tell me about Player Moderators.", "Tell me about the Rules of " + GameWorld.getSettings().getName() + ".", "Can you give me a handy tip please?", "Bye!"); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("Tell me about Player Moderators."); + stage = 50; + break; + case 2: + player("Tell me about the Rules of " + GameWorld.getSettings().getName() + "."); + stage = 70; + break; + case 3: + player("Can you give me a handy tip please?"); + stage = 100; + break; + case 4: + player("Bye!"); + stage = 400; + break; + } + break; + case 400: + npc("Nice meeting you."); + stage = 401; + break; + case 401: + end(); + break; + case 50: + npc("Of course. What would you like to know?"); + stage = 51; + break; + case 51: + options("What is a Player Moderator?", "What can Player Moderators do?", "How do I become a Player Moderator?", "What can Player Moderators not do?"); + stage = 52; + break; + case 52: + + switch (buttonId) { + case 1: + player(" What is a Player Moderator?"); + stage = 150; + break; + case 2: + npc("What can Player Moderators do?"); + stage = 160; + break; + case 3: + player("How do I become a Player Moderator?"); + stage = 170; + break; + case 4: + player("What can Player Moderators not do?"); + stage = 180; + break; + } + break; + case 70: + player.lock(4); + npc("At once. Take a look at my book here."); + npc.animate(new Animation(6866)); + GameWorld.getPulser().submit(new Pulse(4) { + @Override + public boolean pulse() { + //player.getDialogueInterpreter().open(496107759); // TODO rulebook broken + return true; + } + }); + // Find out about the Rules of Conduct from the Draynor

Town Crier + if (npc.getId() == 6136) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 10); + } + stage = 71; + break; + case 71: + end(); + break; + + case 100: + int rand = RandomFunction.random(1, 5); + switch (rand) { + case 1: + npc("If the chat window is moving too quickly to report a", "player accurately, run to a quiet spot and review the chat", "at your leisure!"); + stage = 2; + break; + case 2: + npc("If you're lost and have no idea where to go, use the Home", "Teleporter spell for free!"); + stage = 2; + break; + case 3: + npc("Make your recovery questions and answers hard to guess", "but easy to remember."); + stage = 2; + break; + case 4: + npc("Beware of players trying to lue you into the wilderness.", "Your items cannot be returned if you lose them!"); + stage = 2; + break; + case 5: + npc("" + GameWorld.getSettings().getName() + " will never email you asking for your log-in details."); + stage = 2; + break; + } + stage = 2; + break; + case 150: + npc("Player Moderators are normal players of the game, just", "like you. However, since they have shown themselves to be", "trustworthy and active reporters, they have been invited", "by Jagex to monitor the game and take appropriate"); + stage = 151; + break; + case 151: + npc("reward when they see rule breaking. You can spot a Player", "Moderator in game by looking at the chat screen - when a", "Player Moderator speaks, a silver crown appears to the", "left of their name. Remember, if there's no silver crown"); + stage = 152; + break; + case 152: + npc("there, they are not a Player Moderator! You can check", "out the website if you'd like more information."); + stage = 153; + break; + case 153: + player("Thanks!"); + stage = 154; + break; + case 154: + npc("Is there anything else you'd like to know?"); + stage = 51; + break; + case 160: + npc("Player Moderators, or 'P-mods', have the ability to mute", "rule breakers and " + GameWorld.getSettings().getName() + " view their reports as a priority so", "that reward is taken as quickly as possible. P-Mods also", "have acces to the Player Moderator Centre. Within the"); + stage = 161; + break; + case 161: + npc("Centre are tools to help them Moderate " + GameWorld.getSettings().getName() + ".", "These tools include dedicated forums, the Player", "Moderator Guidelines and the Player Moderator Code of", "Conduct."); + stage = 153; + break; + case 170: + npc("" + GameWorld.getSettings().getName() + " picks players who spend their time and effort to", "help better the " + GameWorld.getSettings().getName() + " community. To increase your", "chances of becoming a Player Moderator:"); + stage = 171; + break; + case 171: + npc("Keep your account secure! This is very important, as a", "player with poor security will never be a P-Mod. Read our", "Security Tips for more information."); + stage = 173; + break; + case 173: + npc("Play by the rules! The rules of " + GameWorld.getSettings().getName() + " are enforced", "for a reason, to make the game a fair and enjoyable", "environment for all."); + stage = 174; + break; + case 174: + npc("Report accuratley! When " + GameWorld.getSettings().getName() + " consider an account for", "review they look for quality, not quantity. Ensure your", "reports are of a high quality by following the report", "guidelines."); + stage = 175; + break; + case 175: + npc("Be nice to each other! Treat others as you would", "want to be treated yourself. Respect your fellow player.", "More information can be found on the website."); + stage = 153; + break; + case 180: + npc("P-Mods cannot ban your account - they can only report", "offences. " + GameWorld.getSettings().getName() + " then take reward based on the evidence", "received. If you lose your password or get scamme dby", "another player, P_Mods cannot help you get your account"); + stage = 181; + break; + case 181: + npc("back. All they can do is recommend you to go to Player", "Support. They cannot retrieve any items you may have", "lost and they certainly do not recieve any free items", "from " + GameWorld.getSettings().getName() + " for moderating the game. They are players"); + stage = 182; + break; + case 182: + npc("who give their all to help the community, out of the", "goodness of their hearts! P-mods do not work for " + GameWorld.getSettings().getName() + "", "and so cannot make you a Moderator, or recommend", "other accounts to become Moderators. If you wish yo"); + stage = 183; + break; + case 183: + npc("become a Moderator, feel free to ask me!"); + stage = 153; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6135, 6136, 6137, 6138, 6139 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TownCrierDialogue.java.orig b/Server/src/main/java/Server/core/game/content/dialogue/TownCrierDialogue.java.orig new file mode 100644 index 000000000..72738fd3c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TownCrierDialogue.java.orig @@ -0,0 +1,284 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the town crier dialogue plugin. + * @author 'Vexia + */ +@InitializablePlugin +public final class TownCrierDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code TownCrierDialogue} {@code Object}. + */ + public TownCrierDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TownCrierDialogue} {@code Object}. + * @param player the player. + */ + public TownCrierDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TownCrierDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; +<<<<<<< HEAD + npc("Hear ye! Hear ye! Player Moderators massive help to ", GameWorld.getName().substring(0, GameWorld.getName().length() - 3) + "-"); +======= + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hear ye! Hear ye! Player Moderators massive help to ", GameWorld.getSettings().getName() + "!"); +>>>>>>> 3418fa0f93ea8241d77c5e9608bf40e3a441e2c5 + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 1: + npc("Oh, hello citizen. Are you here to find out about Player", "Moderators? Or perhaps would you like to know about the", "laws of the land?"); + stage = 2; + break; + case 2: +<<<<<<< HEAD + options("Tell me about Player Moderators.", "Tell me about the Rules of " + GameWorld.getName() + ".", "Can you give me a handy tip please?", "Bye!"); +======= + interpreter.sendOptions("Select an Option", "Tell me about Player Moderators.", "Tell me about the Rules of " + GameWorld.getSettings().getName() + ".", "Can you give me a handy tip please?", "Bye!"); +>>>>>>> 3418fa0f93ea8241d77c5e9608bf40e3a441e2c5 + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("Tell me about Player Moderators."); + stage = 50; + break; + case 2: +<<<<<<< HEAD + player("Tell me about the Rules of " + GameWorld.getName() + "."); +======= + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me about the Rules of " + GameWorld.getSettings().getName() + "."); +>>>>>>> 3418fa0f93ea8241d77c5e9608bf40e3a441e2c5 + stage = 70; + break; + case 3: + player("Can you give me a handy tip please?"); + stage = 100; + break; + case 4: + player("Bye!"); + stage = 400; + break; + } + break; + case 400: + npc("Nice meeting you."); + stage = 401; + break; + case 401: + end(); + break; + case 50: + npc("Of course. What would you like to know?"); + stage = 51; + break; + case 51: + options("What is a Player Moderator?", "What can Player Moderators do?", "How do I become a Player Moderator?", "What can Player Moderators not do?"); + stage = 52; + break; + case 52: + + switch (buttonId) { + case 1: + player(" What is a Player Moderator?"); + stage = 150; + break; + case 2: + npc("What can Player Moderators do?"); + stage = 160; + break; + case 3: + player("How do I become a Player Moderator?"); + stage = 170; + break; + case 4: + player("What can Player Moderators not do?"); + stage = 180; + break; + } + break; + case 70: + player.lock(4); + npc("At once. Take a look at my book here."); + npc.animate(new Animation(6866)); + GameWorld.getPulser().submit(new Pulse(4) { + @Override + public boolean pulse() { + //player.getDialogueInterpreter().open(496107759); // TODO rulebook broken + return true; + } + }); + // Find out about the Rules of Conduct from the Draynor

Town Crier + if (npc.getId() == 6136) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 10); + } + stage = 71; + break; + case 71: + end(); + break; + + case 100: + int rand = RandomFunction.random(1, 5); + switch (rand) { + case 1: + npc("If the chat window is moving too quickly to report a", "player accurately, run to a quiet spot and review the chat", "at your leisure!"); + stage = 2; + break; + case 2: + npc("If you're lost and have no idea where to go, use the Home", "Teleporter spell for free!"); + stage = 2; + break; + case 3: + npc("Make your recovery questions and answers hard to guess", "but easy to remember."); + stage = 2; + break; + case 4: + npc("Beware of players trying to lue you into the wilderness.", "Your items cannot be returned if you lose them!"); + stage = 2; + break; + case 5: +<<<<<<< HEAD + npc("" + GameWorld.getName() + " will never email you asking for your log-in details."); +======= + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "" + GameWorld.getSettings().getName() + " will never email you asking for your log-in details."); +>>>>>>> 3418fa0f93ea8241d77c5e9608bf40e3a441e2c5 + stage = 2; + break; + } + stage = 2; + break; + case 150: + npc("Player Moderators are normal players of the game, just", "like you. However, since they have shown themselves to be", "trustworthy and active reporters, they have been invited", "by Jagex to monitor the game and take appropriate"); + stage = 151; + break; + case 151: + npc("reward when they see rule breaking. You can spot a Player", "Moderator in game by looking at the chat screen - when a", "Player Moderator speaks, a silver crown appears to the", "left of their name. Remember, if there's no silver crown"); + stage = 152; + break; + case 152: + npc("there, they are not a Player Moderator! You can check", "out the website if you'd like more information."); + stage = 153; + break; + case 153: + player("Thanks!"); + stage = 154; + break; + case 154: + npc("Is there anything else you'd like to know?"); + stage = 51; + break; + case 160: +<<<<<<< HEAD + npc("Player Moderators, or 'P-mods', have the ability to mute", "rule breakers and " + GameWorld.getName() + " view their reports as a priority so", "that reward is taken as quickly as possible. P-Mods also", "have acces to the Player Moderator Centre. Within the"); + stage = 161; + break; + case 161: + npc("Centre are tools to help them Moderate " + GameWorld.getName() + ".", "These tools include dedicated forums, the Player", "Moderator Guidelines and the Player Moderator Code of", "Conduct."); + stage = 153; + break; + case 170: + npc("" + GameWorld.getName() + " picks players who spend their time and effort to", "help better the " + GameWorld.getName() + " community. To increase your", "chances of becoming a Player Moderator:"); +======= + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Player Moderators, or 'P-mods', have the ability to mute", "rule breakers and " + GameWorld.getSettings().getName() + " view their reports as a priority so", "that reward is taken as quickly as possible. P-Mods also", "have acces to the Player Moderator Centre. Within the"); + stage = 161; + break; + case 161: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Centre are tools to help them Moderate " + GameWorld.getSettings().getName() + ".", "These tools include dedicated forums, the Player", "Moderator Guidelines and the Player Moderator Code of", "Conduct."); + stage = 153; + break; + case 170: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "" + GameWorld.getSettings().getName() + " picks players who spend their time and effort to", "help better the " + GameWorld.getSettings().getName() + " community. To increase your", "chances of becoming a Player Moderator:"); +>>>>>>> 3418fa0f93ea8241d77c5e9608bf40e3a441e2c5 + stage = 171; + break; + case 171: + npc("Keep your account secure! This is very important, as a", "player with poor security will never be a P-Mod. Read our", "Security Tips for more information."); + stage = 173; + break; + case 173: +<<<<<<< HEAD + npc("Play by the rules! The rules of " + GameWorld.getName() + " are enforced", "for a reason, to make the game a fair and enjoyable", "environment for all."); + stage = 174; + break; + case 174: + npc("Report accuratley! When " + GameWorld.getName() + " consider an account for", "review they look for quality, not quantity. Ensure your", "reports are of a high quality by following the report", "guidelines."); +======= + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Play by the rules! The rules of " + GameWorld.getSettings().getName() + " are enforced", "for a reason, to make the game a fair and enjoyable", "environment for all."); + stage = 174; + break; + case 174: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Report accuratley! When " + GameWorld.getSettings().getName() + " consider an account for", "review they look for quality, not quantity. Ensure your", "reports are of a high quality by following the report", "guidelines."); +>>>>>>> 3418fa0f93ea8241d77c5e9608bf40e3a441e2c5 + stage = 175; + break; + case 175: + npc("Be nice to each other! Treat others as you would", "want to be treated yourself. Respect your fellow player.", "More information can be found on the website."); + stage = 153; + break; + case 180: +<<<<<<< HEAD + npc("P-Mods cannot ban your account - they can only report", "offences. " + GameWorld.getName() + " then take reward based on the evidence", "received. If you lose your password or get scamme dby", "another player, P_Mods cannot help you get your account"); + stage = 181; + break; + case 181: + npc("back. All they can do is recommend you to go to Player", "Support. They cannot retrieve any items you may have", "lost and they certainly do not recieve any free items", "from " + GameWorld.getName() + " for moderating the game. They are players"); + stage = 182; + break; + case 182: + npc("who give their all to help the community, out of the", "goodness of their hearts! P-mods do not work for " + GameWorld.getName() + "", "and so cannot make you a Moderator, or recommend", "other accounts to become Moderators. If you wish yo"); +======= + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "P-Mods cannot ban your account - they can only report", "offences. " + GameWorld.getSettings().getName() + " then take reward based on the evidence", "received. If you lose your password or get scamme dby", "another player, P_Mods cannot help you get your account"); + stage = 181; + break; + case 181: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "back. All they can do is recommend you to go to Player", "Support. They cannot retrieve any items you may have", "lost and they certainly do not recieve any free items", "from " + GameWorld.getSettings().getName() + " for moderating the game. They are players"); + stage = 182; + break; + case 182: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "who give their all to help the community, out of the", "goodness of their hearts! P-mods do not work for " + GameWorld.getSettings().getName() + "", "and so cannot make you a Moderator, or recommend", "other accounts to become Moderators. If you wish yo"); +>>>>>>> 3418fa0f93ea8241d77c5e9608bf40e3a441e2c5 + stage = 183; + break; + case 183: + npc("become a Moderator, feel free to ask me!"); + stage = 153; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6135, 6136, 6137, 6138, 6139 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TraderCrewmemberDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TraderCrewmemberDialogue.java new file mode 100644 index 000000000..0776a912e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TraderCrewmemberDialogue.java @@ -0,0 +1,181 @@ +package core.game.content.dialogue; + +import core.game.content.global.travel.ship.ShipCharter; +import core.game.content.global.travel.ship.ShipCharter.Destination; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.tools.StringUtils; + +/** + * Handles the TraderCrewmemberDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class TraderCrewmemberDialogue extends DialoguePlugin { + + /** + * Represents the ship charter destination. + */ + private Destination destination; + + /** + * Represents the cost of charting the ship. + */ + private int cost; + + /** + * Constructs a new {@code TraderCrewmemberDialogue} {@code Object}. + */ + public TraderCrewmemberDialogue() { + } + + /** + * Constructs a new {@code TraderCrewmemberDialogue} {@code Object}. + * @param player the player. + */ + public TraderCrewmemberDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 4651, 4652, 4653, 4654, 4655, 4656, 4650 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Choose an option:", "Yes, who are you?", "Yes, I would like to charter a ship."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Yes, who are you?"); + stage = 100; + break; + case 2: + player("Yes, I would like to charter a ship."); + stage = 2000; + break; + } + break; + case 100: + npc("I'm one of the Trader Stan's crew; we are all part of the", "largest fleet of trading and sailing vessels to ever sail the", "seven seas."); + stage = 101; + break; + case 101: + npc("If you want to get to a port in a hurry then you can", "charter one of our ships to take you there - if the price", "is right..."); + stage = 102; + break; + case 102: + player("So, where exactly can I go with your ships?"); + stage = 103; + break; + case 103: + npc("We run ships from Port Phasmatys over to Port Tyras,", "stopping at Port Sarim, Catherby, Jaramja,", "the Shipyard and Port Khazard."); + stage = 104; + break; + case 104: + player("Wow, that's a lot of ports. I take it you have some exotic", "stuff to trade?"); + stage = 105; + break; + case 105: + npc("We certainly do! We have access to items", "bought and sold from around the world."); + stage = 106; + break; + case 106: + npc("Would you like to take a look?"); + stage = 107; + break; + case 107: + options("Yes.", "No."); + stage = 108; + break; + case 108: + switch (buttonId) { + case 1: + player("Yes."); + stage = 1000; + break; + case 2: + end(); + break; + + } + break; + case 1000: + end(); + npc.openShop(player); + break; + case 2000: + npc("Certainly sir, where would you like to go?"); + stage = 2001; + break; + case 2001: + end(); + ShipCharter.open(player); + break; + case 3000: + options("Ok", "Choose again", "No"); + stage = 30001; + break; + case 30001: + switch (buttonId) { + case 1: + end(); + if (cost == 0) { + destination.sail(player); + break; + } + if (!player.getInventory().containsItem(new Item(995, cost))) { + end(); + return true; + } + if (!player.getInventory().remove(new Item(995, cost))) { + interpreter.sendDialogues(player, null, "I don't have the money for that."); + stage = 30002; + return true; + } + destination.sail(player); + break; + case 2: + end(); + ShipCharter.open(player); + break; + case 3: + end(); + break; + } + break; + case 30002: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TraderCrewmemberDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length > 1) { + destination = ((Destination) args[1]); + cost = (int) args[2]; + interpreter.sendDialogue("To sail to " + StringUtils.formatDisplayName(destination.name()) + " from here will cost you " + cost + " gold.", "Are you sure you want to pay that?"); + stage = 3000; + return true; + } + npc("Can I help you?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TraibornDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TraibornDialogue.java new file mode 100644 index 000000000..1fa045edc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TraibornDialogue.java @@ -0,0 +1,398 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +import core.game.content.quest.free.demonslayer.DemonSlayer; + +/** + * Represents the dialogue used to handle the Traiborn NPC. + * @author 'Vexia + * @date 3/1/14 + */ +public class TraibornDialogue extends DialoguePlugin { + + /** + * Represents the bones item. + */ + private static final Item BONES = new Item(526, 25); + + /** + * Represents the object animation. + */ + @SuppressWarnings("unused") + private static final Animation OBJECT_ANIM = new Animation(4599); + + /** + * Represents the animation of giving the key. + */ + private static final Animation ANIMATION = new Animation(536); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code TraibornDialogue} {@code Object}. + */ + public TraibornDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TraibornDialogue} {@code Object}. + * @param player the player. + */ + public TraibornDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TraibornDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Demon Slayer"); + switch (quest.getStage(player)) { + case 20: + if (player.getAttribute("demon-slayer:traiborn", false)) { + npc("How are you doing finding bones?"); + stage = 380; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ello young thingummywut."); + stage = 0; + } + break; + default: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ello young thingummywut."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 20: + switch (stage) { + case 0: + if (player.getInventory().containsItem(DemonSlayer.THIRD_KEY) && player.getBank().containsItem(DemonSlayer.THIRD_KEY)) { + options("What's a thingummywut?", "Teach me to be a mighty powerful wizard."); + stage = 1; + } else { + options("What's a thingummywut?", "Teach me to be a mighty powerful wizard.", "I need to get a key given to you by Sir Prysin."); + stage = 1; + } + break; + case 1: + switch (buttonId) { + case 1: + case 2: + handleDefault(buttonId); + break; + case 3: + player("I need to get a key given to you by Sir Prysin."); + stage = 300; + break; + } + break; + case 300: + npc("Sir Prysin? Who's that? What would I want his key", "for?"); + stage = 301; + break; + case 301: + player("Well, have you got any keys knocking around?"); + stage = 302; + break; + case 302: + npc("Now you come to mention it, yes I do have a key. It's", "in my special closet of valuable stuff. Now how do I get", "into that?"); + stage = 303; + break; + case 303: + npc("I sealed it using one of my magic rituals. So it would", "makes sense that another ritual would open it again."); + stage = 304; + break; + case 304: + player("So do you know what ritual to use?"); + stage = 305; + break; + case 305: + npc("Let me think a second."); + stage = 306; + break; + case 306: + npc("Yes a simple drazier style ritual should suffice. Hmm,", "main problem with that is I'll need 25 sets of bones.", "Now where am I going to get hold of something like", "that?"); + stage = 307; + break; + case 307: + options("Hmm, that's too bad. I really need that key.", "I'll get the bones for you."); + stage = 308; + break; + case 308: + switch (buttonId) { + case 1: + player("Hmm, that's too bad. I really need that key."); + stage = 330; + break; + case 2: + player("I'll get the bones for you."); + stage = 340; + break; + } + break; + case 330: + npc("Ah well, sorry I couldn't be any more help."); + stage = 331; + break; + case 331: + end(); + break; + case 340: + npc("Ooh that would be very good of you."); + stage = 341; + break; + case 341: + player("Ok I'll speak to you when I've got some bones."); + stage = 342; + break; + case 342: + player.setAttribute("/save:demon-slayer:traiborn", true); + end(); + break; + case 380: + if (player.getInventory().containsItem(BONES)) { + player("I have some bones."); + stage = 382; + } else { + player("I don't have all the bones yet."); + stage = 381; + } + break; + case 382: + npc("Give 'em here then."); + stage = 383; + break; + case 383: + interpreter.sendDialogue("You give Traiborn 25 sets of bones."); + stage = 384; + break; + case 384: + npc("Hurrah! That's all 25 sets of bones."); + stage = 385; + break; + case 385: + npc.animate(new Animation(4602)); + npc("Wings of dark and colour too,", "Spreading in the morning dew;", "Locked away I have a key;", "Return it now, please, unto me."); + stage = 386; + break; + case 386: + final GameObject object = new GameObject(17434, Location.create(3113, 3161, 1), 11, 1); + ObjectBuilder.add(object); + npc.faceLocation(object.getLocation()); + npc.animate(ANIMATION); + if (!player.getInventory().containsItem(BONES)) { + end(); + return true; + } + if (player.getInventory().remove(BONES)) { + player.removeAttribute("demon-slayer:traiborn"); + player.getInventory().add(DemonSlayer.THIRD_KEY); + interpreter.sendItemMessage(DemonSlayer.THIRD_KEY.getId(), "Traiborn hands you a key."); + stage = 387; + } + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 5: + npc.face(player); + break; + case 7: + ObjectBuilder.remove(object); + return true; + } + return false; + } + }); + break; + case 387: + player("Thank you very much."); + stage = 388; + break; + case 388: + npc("Not a problem for a friend of Sir What's-his-face."); + stage = 389; + break; + case 389: + end(); + break; + case 381: + end(); + break; + } + break; + case 0: + switch (stage) { + default: + handleDefault(buttonId); + break; + } + break; + } + return true; + } + + /** + * Method used to handle the default button id. + * @param buttonId the buttton id. + */ + private final void handleDefault(int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What's a thingummywut?", "Teach me to be a mighty and powerful wizard."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's a thingumywut?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Teach me to be a mighty and powerful wizard."); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A thingummywut? Where? Where?"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Those pesky thingummywuts. They get everywhere.", "They leave a terrible mess too."); + stage = 12; + break; + case 12: + interpreter.sendOptions("Select an Option", "Err you just called me a thingymummywut.", "Tell me what they look like and I'll mask 'em."); + stage = 13; + break; + case 13: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Err you just called me thingummywut."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me what they look like and I'll mash 'em."); + stage = 120; + break; + } + break; + case 120: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Don't be ridiculous. No-one has ever seen one."); + stage = 121; + break; + case 121: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "They're invisible, or a myth, or a figment of my", "imagination. Can't remember which right now."); + stage = 122; + break; + case 122: + end(); + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You're a thingummywut? I've never seen one up close", "before. They said I was mad!"); + stage = 101; + break; + case 101: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Now you are my proof! There ARE thingummywuts in", "this tower. Now where can I find a cage big enough to", "keep you?"); + stage = 102; + break; + case 102: + interpreter.sendOptions("Select an Option", "Err I'd better be off really.", "They're right, you are mad."); + stage = 103; + break; + case 103: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Err I'd better be off really."); + stage = 110; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "They're right, you are mad."); + stage = 130; + break; + } + break; + case 130: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That's a pity. I thought maybe they were winding me", "up."); + stage = 131; + break; + case 131: + end(); + break; + case 110: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh ok, have a good time, and watch out for sheep!", "They're more cunning than they look."); + stage = 111; + break; + case 111: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Wizard eh? You don't want any truck with that sort.", "They're not to be trusted. That's what I've heard", "anyways."); + stage = 21; + break; + case 21: + interpreter.sendOptions("Select an Option", "So aren't you a wizard?", "Oh I'd better stop talking to you then."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So aren't you a wizard?"); + stage = 40; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh I'd better stop talking to you then."); + stage = 60; + break; + } + break; + case 60: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Cheerio then. It was nice chatting to you."); + stage = 61; + break; + case 61: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How dare you? Of course I'm a wizard. Now don't be", "so cheeky or I'll turn you into a frog."); + stage = 41; + break; + case 41: + end(); + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 881 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/TrampDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/TrampDialogue.java new file mode 100644 index 000000000..8a084ccea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/TrampDialogue.java @@ -0,0 +1,85 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TrampDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class TrampDialogue extends DialoguePlugin { + + public TrampDialogue() { + + } + + public TrampDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 11 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendOptions("What would you like to say?", "Yes, I can spare a little money.", "Sorry, you'll have to earn it yourself."); + stage = 10; + break; + case 10: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, I can spare a little money."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.FURIOUS, "Sorry, you'll have to earn it yourself, just like I did."); + stage = 50; + break; + } + break; + case 100: + if (player.getInventory().contains(995, 1)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Thank's mate!"); + stage = 101; + } else { + end(); + player.getPacketDispatch().sendMessage("You only need one coin to give to this tramp."); + } + break; + case 101: + end(); + break; + case 50: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Please yourself."); + stage = 51; + break; + case 51: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TrampDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Got any spare change, mate?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/UliziusDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/UliziusDialogue.java new file mode 100644 index 000000000..441c75ff1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/UliziusDialogue.java @@ -0,0 +1,70 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the UliziusDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class UliziusDialogue extends DialoguePlugin { + + public UliziusDialogue() { + + } + + public UliziusDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new UliziusDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What... Oh, don't creep up on me like that... I thought", "you were a Ghast!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I go through the gate please?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Absolutely not. I've been given strict instructions not to", "let anyone through. It's just too dangerous. No one", "gets in without Drezels say so!"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where is Drezel?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, he's in the temple, just go back over the bridge,", "down the ladder and along the hallway, you can't miss", "him."); + stage = 5; + break; + case 5: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1054 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ValaineDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ValaineDialogue.java new file mode 100644 index 000000000..b601e2aa5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ValaineDialogue.java @@ -0,0 +1,70 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the ValaineDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class ValaineDialogue extends DialoguePlugin { + + public ValaineDialogue() { + + } + + public ValaineDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new ValaineDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there. Want to have a look at what we're selling", "today?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes please.", "No thank you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thank you."); + stage = 3; + break; + } + break; + case 3: + end(); + break; + case 10: + end(); + npc.openShop(player); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 536 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/VanessaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/VanessaDialogue.java new file mode 100644 index 000000000..c9ae93385 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/VanessaDialogue.java @@ -0,0 +1,82 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the VanessaDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class VanessaDialogue extends DialoguePlugin { + + public VanessaDialogue() { + + } + + public VanessaDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 2305 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What are you selling?", "Can you give me any Farming advice?", "I'm okay, thank you."); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "What are you selling?", "Can you give me any Farming advice?", "I'm okay, thank you."); + stage = 10; + break; + case 10: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you give me any Farming advice?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm okay, thank you."); + stage = 30; + break; + + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes - ask a gardener."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new VanessaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello. How can I help you?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/VanstromKlause.java b/Server/src/main/java/Server/core/game/content/dialogue/VanstromKlause.java new file mode 100644 index 000000000..4f4cdec88 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/VanstromKlause.java @@ -0,0 +1,58 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the VanstromKlause dialogue. + * @author 'Vexia + */ +@Initializable +public class VanstromKlause extends DialoguePlugin { + + public VanstromKlause() { + + } + + public VanstromKlause(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new VanstromKlause(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there, how goes it stranger?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Quite well thanks for asking, how about you?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Quite well my self."); + stage = 2; + break; + case 2: + end();// todo real dial at this part. + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2020 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/VelorinaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/VelorinaDialogue.java new file mode 100644 index 000000000..f0a420acd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/VelorinaDialogue.java @@ -0,0 +1,74 @@ +package core.game.content.dialogue; + +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the velorina dialogue. + * @author Vexia + */ +@Initializable +public class VelorinaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code VelorinaDialogue} {@code Object} + */ + public VelorinaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code VelorinaDialogue} {@code Object} + * @param player the player. + */ + public VelorinaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new VelorinaDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Can I have another ectophial?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.hasItem(new Item(4251)) || player.hasItem(new Item(4252))) { + npc("You already have an ectophial."); + stage = 1; + return true; + } + npc("Of course you can, you have helped us more than we", "could ever have hoped."); + stage = 2; + break; + case 1: + end(); + break; + case 2: + interpreter.sendItemMessage(4251, "Velorina gives you a vial of bright green ectoplasm."); + stage++; + break; + case 3: + player.getInventory().add(new Item(4251), player); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1683 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/VenenatisSpiderlingDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/VenenatisSpiderlingDialogue.java new file mode 100644 index 000000000..34c5bd636 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/VenenatisSpiderlingDialogue.java @@ -0,0 +1,71 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Dialogue for the boss pet, Venenatis JR + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class VenenatisSpiderlingDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + */ + public VenenatisSpiderlingDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + * @param player the player. + */ + public VenenatisSpiderlingDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new VenenatisSpiderlingDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "It's a damn good job I don't have arachnophobia."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "We're misunderstood. Without us in your house,", "you'd be infested with flies and other", "REAL nasties."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks for that enlightening fact."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Everybody gets one."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8599 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/VeronicaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/VeronicaDialogue.java new file mode 100644 index 000000000..942982b2e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/VeronicaDialogue.java @@ -0,0 +1,191 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the dialogue used to handle the interaction between veronica. + * @author 'Vexia + * @date 24/12/2013 + */ +@Initializable +public class VeronicaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code VeronicaDialogue} {@code Object}. + */ + public VeronicaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code VeronicaDialogue} {@code Object}. + * @param player the player. + */ + public VeronicaDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 285 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Ernest the Chicken"); + switch (quest.getStage(player)) { + case 0: + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Aha, sounds like a quest. I'll help.", "No, I'm looking for something to kill."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Aha, sounds like a quest. I'll help."); + stage = 4; + break; + case 2: + interpreter.sendDialogues(player, null, "No, I'm looking for something to kill."); + stage = 2; + break; + } + break; + case 2: + interpreter.sendDialogues(npc, null, "Oooh, you violent person you."); + stage = 3; + break; + case 3: + end(); + break; + case 4: + interpreter.sendDialogues(npc, null, "Yes yes, I suppose it is a quest. My fiance Ernest and", "I came upon this house."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, null, "Seeing as we were a little lost Ernest decided to go in", "and ask for direction."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, null, "That was an hour ago. That house looks spooky, can", "you go and see if you can find him for me?"); + stage = 7; + break; + case 7: + interpreter.sendDialogues(player, null, "Ok, I'll see what I can do."); + stage = 8; + break; + case 8: + quest.start(player); + player.getQuestRepository().syncronizeTab(player); + interpreter.sendDialogues(npc, null, "Thank you, thank you. I'm very grateful."); + stage = 9; + break; + case 9: + end(); + break; + } + break; + case 10: + switch (stage) { + case 9: + end(); + break; + case 0: + interpreter.sendDialogues(player, null, "No, not yet."); + stage = 1; + break; + case 1: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + interpreter.sendDialogues(player, null, "Yes, he's a chicken."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "I know he's not exactly brave but I think you're being", "a bit harsh."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, null, "No no, he's been turned into an actual chicken by a", "mad scientist."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, null, "Eeeeeek!"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, null, "My poor darling, why must these things happen to us."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, null, "Well I'm doing my best to turn him back."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, null, "Well be quick, I'm sure being a chicken can't be good", "for him."); + stage = 7; + break; + case 7: + end(); + break; + } + break; + case 100: + switch (stage) { + case 0: + interpreter.sendDialogues(player, null, "Where is he now?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "Oh he went off to talk to some green warty guy. I'm", "sure he'll be back soon."); + stage = 2; + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new VeronicaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + final Quest quest = player.getQuestRepository().getQuest("Ernest the Chicken"); + switch (quest.getStage(player)) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can you please help me? I'm in a terrible spot of", "trouble."); + stage = 0; + break; + case 10: + interpreter.sendDialogues(npc, null, "Have you foudn my sweetheart yet?"); + stage = 0; + break; + case 20: + interpreter.sendDialogues(npc, null, "Have you foudn my sweetheart yet?"); + stage = 0; + break; + case 100: + interpreter.sendDialogues(npc, null, "Thank you for resucing Ernest."); + stage = 0; + break; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/VetionJRDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/VetionJRDialogue.java new file mode 100644 index 000000000..83ddc67da --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/VetionJRDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Dialogue for the boss pet, Vet'ion JR. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class VetionJRDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + */ + public VetionJRDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ChaosElementalJRDialogue} {@code Object}. + * @param player the player. + */ + public VetionJRDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new VetionJRDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who is the true lord and king of the lands?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "The mighty heir and lord of the Wilderness."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where is he? Why hasn't he lifted your burden?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "I have not fulfilled my purpose."); + stage = 3; + break; + case 3: + player("What is your purpose?"); + stage = 4; + break; + case 4: + npc(FacialExpression.OLD_NORMAL, "Not what is, what was.", "A great war tore this land apart and, for my","failings in protecting this land, I carry the burden","of its waste."); + stage = 5; + break; + case 5: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8600, 8654 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/WayneDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/WayneDialogue.java new file mode 100644 index 000000000..857b414f1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/WayneDialogue.java @@ -0,0 +1,72 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the wayne npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WayneDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code WayneDialogue} {@code Object}. + */ + public WayneDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WayneDialogue} {@code Object}. + * @param player the player. + */ + public WayneDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WayneDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to Wayne's Chains. Do you wanna buy or", "sell some chain mail?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes please.", "No thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + end(); + break; + + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 581 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/WhiteKnightDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/WhiteKnightDialoguePlugin.java new file mode 100644 index 000000000..ed4653eac --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/WhiteKnightDialoguePlugin.java @@ -0,0 +1,62 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the white knight dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WhiteKnightDialoguePlugin extends DialoguePlugin { + + /** + * The NPC ids that use this dialogue plugin. + */ + private static final int[] NPC_IDS = { 660 }; + + /** + * Constructs a new {@code WhiteKnightDialoguePlugin} {@code Object}. + */ + public WhiteKnightDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WhiteKnightDialoguePlugin} {@code Object}. + * @param player the player. + */ + public WhiteKnightDialoguePlugin(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("He is too busy dancing to talk!"); + return true; + } + + @Override + public int[] getIds() { + return NPC_IDS; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WhiteKnightDialoguePlugin(player); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/WiloughDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/WiloughDialogue.java new file mode 100644 index 000000000..837b07591 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/WiloughDialogue.java @@ -0,0 +1,239 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue used for wilough. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WiloughDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 100); + + /** + * Represents the id. + */ + private int id; + + /** + * Constructs a new {@code WiloughDialogue} {@code Object}. + */ + public WiloughDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WiloughDialogue} {@code Object}. + * @param player the player. + */ + public WiloughDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WiloughDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args[0] instanceof NPC) { + id = ((NPC) args[0]).getId(); + } else if (args[0] instanceof Integer) { + id = (int) args[0]; + } + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + switch (quest.getStage(player)) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello again."); + stage = 0; + break; + case 10: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there, I've been looking for you."); + stage = 100; + break; + case 20: + case 30: + case 40: + case 50: + interpreter.sendDialogues(player, null, "Where did you say you saw Fluffs?"); + stage = 130; + break; + default: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello again."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + switch (stage) { + case 0: + interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "You think you're tough do you?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Pardon?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "I can beat anyone up!"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(781, FacialExpression.HALF_GUILTY, "He can you know!"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Really?"); + stage = 5; + break; + case 5: + interpreter.sendDialogue("The boy begins to jump around with his fists up.", "You wonder what sort of desperado he'll grow up to be."); + stage = 6; + break; + case 6: + end(); + break; + case 100:// stage 10 + interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "I didn't mean to take it! I just forgot to pay."); + stage = 101; + break; + case 101: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What? I'm trying to help your mum find Fluffs."); + stage = 102; + break; + case 102: + interpreter.sendDialogues(id == 783 ? 781 : 783, null, "I might be able to help. Fluffs followed me to our secret", "play area and I haven't seen her since."); + stage = 103; + break; + case 103: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where is this play area?"); + stage = 104; + break; + case 104: + interpreter.sendDialogues(id == 783 ? 781 : 783, null, "If I told you that, it wouldn't be a secret."); + stage = 105; + break; + case 105: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What will make you tell me?"); + stage = 106; + break; + case 106: + interpreter.sendDialogues(id == 783 ? 781 : 783, null, "Well...now you ask, I am a bit short on cash."); + stage = 107; + break; + case 107: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How much?"); + stage = 108; + break; + case 108: + interpreter.sendDialogues(id == 783 ? 781 : 783, null, "10 coins."); + stage = 109; + break; + case 109: + interpreter.sendDialogues(id == 783 ? 783 : id, null, "10 coins?!"); + stage = 110; + break; + case 110: + interpreter.sendDialogues(id == 783 ? 783 : id, null, "I'll handle this."); + stage = 111; + break; + case 111: + interpreter.sendDialogues(id == 783 ? 783 : id, null, "100 coins should cover it."); + stage = 112; + break; + case 112: + interpreter.sendDialogues(player, null, "100 coins! Why should I pay you?"); + stage = 113; + break; + case 113: + interpreter.sendDialogues(id == 783 ? 783 : id, null, "You shouldn't, but we won't help otherwise. We never", "liked that cat anyway, so what do you say?"); + stage = 114; + break; + case 114: + interpreter.sendOptions("Select an Option", "I'm not paying you a penny.", "Okay then, I'll pay."); + stage = 115; + break; + case 115: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I'm not paying you a penny."); + stage = 116; + break; + case 2: + interpreter.sendDialogues(player, null, "Okay then, I'll pay."); + stage = 118; + break; + } + break; + case 116: + interpreter.sendDialogues(id == 783 ? 783 : id, null, "Okay then, I'll find another way to make money."); + stage = 117; + break; + case 117: + end(); + break; + case 118: + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (player.getInventory().remove(COINS)) { + interpreter.sendItemMessage(COINS, "You give the lad 100 coins."); + quest.setStage(player, 20); + stage = 119; + } else { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough coins."); + stage = 117; + } + break; + case 119: + interpreter.sendDialogues(player, null, "There you go, now where did you see Fluffs?"); + stage = 120; + break; + case 120: + interpreter.sendDialogues(id == 783 ? 783 : id, null, "We play at an abandoned lumber mill to the north east.", "Just beyond the Jolly Boar Inn. I saw Fluffs running", "around in there."); + stage = 121; + break; + case 121: + interpreter.sendDialogues(player, null, "Anything else?"); + stage = 122; + break; + case 122: + interpreter.sendDialogues(id == 783 ? 783 : id, null, "Well, you'll have to find the broken fence to get in. I'm", "sure you can manage that."); + stage = 123; + break; + case 123: + end(); + break; + case 130: + interpreter.sendDialogues(id, null, "Weren't you listening? I saw the flea bag in the old", "lumber mill just north east of here. Just walk past the", "Jolly Boar Inn and you should find it."); + stage = 131; + break; + case 131: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 783 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/WiseOldManDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/WiseOldManDialogue.java new file mode 100644 index 000000000..54a0eab0b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/WiseOldManDialogue.java @@ -0,0 +1,195 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the wise old man. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WiseOldManDialogue extends DialoguePlugin { + + /** + * Represents the items to use. + */ + private static final Item[] ITEMS = new Item[]{new Item(9813), new Item(9814)}; + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 99000); + + /** + * Constructs a new {@code WiseOldManDialogue} {@code Object}. + */ + public WiseOldManDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WiseOldManDialogue} {@code Object}. + * + * @param player the player. + */ + public WiseOldManDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WiseOldManDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Greetings, " + player.getUsername() + ","); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getQuestRepository().hasCompletedAll()) { + options("Quest Point Cape.", "Something else."); + stage = 500; + return true; + } + options("Is there anything I can do for you?", "Could you check my things for junk, please?", "I've got something I'd like you to look at."); + stage = 1; + break; + case 500: + switch (buttonId) { + case 1: + player("I believe you are the person to talk to if I want to buy", "a Quest Point Cape?"); + stage = 501; + break; + case 2: + options("Is there anything I can do for you?", "Could you check my things for junk, please?", "I've got something I'd like you to look at."); + stage = 1; + break; + } + break; + case 501: + npc("Indeed you believe rightly, " + player.getUsername() + ", and if you know that", "then you'll also know that they cost 99000 coins."); + stage = 502; + break; + case 502: + options("No, I hadn't heard that!", "Yes, so I was lead to believe."); + stage = 503; + break; + case 503: + switch (buttonId) { + case 1: + player("No, I hadn't heard that!"); + stage = 504; + break; + case 2: + player("Yes, so I was lead to believe."); + stage = 506; + break; + } + break; + case 504: + npc("Well that's the cost, and it's not changing."); + stage = 505; + break; + case 505: + end(); + break; + case 506: + if (player.getInventory().freeSlots() < 2) { + player("I don't seem to have enough inventory space."); + stage = 507; + return true; + } + if (!player.getInventory().containsItem(COINS)) { + player("I don't seem to have enough coins with", "me at this time."); + stage = 507; + return true; + } + if (player.getInventory().remove(COINS) && player.getInventory().add(ITEMS)) { + npc("Have fun with it."); + stage = 507; + } else { + player("I don't seem to have enough coins with", "me at this time."); + stage = 507; + } + break; + case 507: + end(); + break; + case 1: + switch (buttonId) { + case 1: + player("Is there anything I can do for you?"); + stage = 10; + break; + case 2: + options("Could you check my bank for junk, please?", "Could you check my inventory for junk, please?"); + stage = 20; + break; + case 3: + player("I've got something I'd like you to look at."); + stage = 30; + break; + } + + break; + case 10: + npc("Thanks, but I don't have anything I need."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc("Certainly, but I should warn you that I don't know about", "all items."); + switch (buttonId) { + case 1: + stage = 100; + break; + case 2: + stage = 102; + break; + } + break; + case 100: + npc("You seem to have no junk in your bank, sorry."); + stage = 101; + break; + case 101: + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 16); + end(); + break; + case 102: + npc("You seem to have no junk in your inventory, sorry."); + stage = 101; + break; + case 30: + npc("Jolly good. Give it to me, and I'll tell you anything I know", "about it."); + stage = 31; + break; + case 31: + end(); + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[]{2253, 3820}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/WoodsmanTutorDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/WoodsmanTutorDialogue.java new file mode 100644 index 000000000..ae0cc228b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/WoodsmanTutorDialogue.java @@ -0,0 +1,235 @@ +package core.game.content.dialogue; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the woodsman tutor dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WoodsmanTutorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code WoodsmanTutorDialogue} {@code Object}. + */ + public WoodsmanTutorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WoodsmanTutorDialogue} {@code Object}. + * @param player the player. + */ + public WoodsmanTutorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WoodsmanTutorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getSkills().getLevel(Skills.WOODCUTTING) >= 99) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Wow! It's not often I meet somebody as accomplished", "as me in Woodcutting! Seeing as youre so skilled,", "maybe you are interested in buying a Skillcape of", "Woodcutting?"); + stage = 100; + } else { + interpreter.sendOptions("Select an Option", "Tell me about different trees and axes.", "What is that cape you're wearing?", "Goodbye."); + stage = 500; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is that cape you're wearing?"); + stage = 20; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "My name is Wilfred and I'm the best woodsman in", "Asgarnia! I've spent my life studying the best methods for", "woodcutting. That's why I have this cape, the Skillcape of", "Woodcutting."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is a Skillcape of Woodcutting. Only a person who has", "achieved the highest possible level in a skill can wear one."); + stage = 21; + break; + case 21: + end(); + break; + case 100: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you."); + stage = 101; + break; + case 101: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 1000; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 2000; + break; + } + break; + case 2000: + interpreter.sendOptions("Select an Option", "Tell me about different trees and axes.", "What is that cape you're wearing?", "Goodbye."); + stage = 500; + break; + case 2002: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Bye!"); + stage = 2003; + break; + case 2003: + end(); + break; + case 1000: + if (player.getInventory().freeSlots() == 1) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't have enough inventory space."); + stage = 99; + } + if (player.getInventory().contains(995, 99000)) { + player.getInventory().remove(new Item(995, 99000)); + player.getInventory().add(new Item(9807 + (player.getSkills().getMasteredSkills() > 1 ? 1 : 0))); + player.getInventory().add(new Item(9809, 1)); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Excellent! Wear that cape with pride my friend."); + stage = 107; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't seem to have enough coins."); + stage = 160; + } + break; + case 99: + end(); + break; + case 160: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Very well, farewell adventurer."); + stage = 2001; + break; + case 107: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Will do, Wilfred."); + stage = 108; + break; + case 108: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Very well, farewell adventurer."); + stage = 2001; + break; + case 2001: + end(); + break; + case 500: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Tell me about different trees and axes."); + stage = 510; + break; + case 2: + interpreter.sendDialogues(player, null, "What is that cape you're wearing?"); + stage = 520; + break; + case 3: + interpreter.sendDialogues(player, null, "Goodbye."); + stage = 530; + break; + } + break; + case 510: + interpreter.sendOptions("Trees", "Oak and Willow", "Maple and Yew", "Magic and other trees", "Axes", "Go back to teaching"); + stage = 511; + break; + case 511: + switch (buttonId) { + case 1: + interpreter.sendDoubleItemMessage(1511, 1521, "Almost every tree can be chopped down. Normal logs will be produced by chopping 'Trees' and Oak logs will come from chopping 'Oak Trees'. You can find Oak trees in amongst normal trees scatterd about the"); + stage = 5100; + break; + case 2: + interpreter.sendItemMessage(1517, "Maple logs can be gleaned from Maple trees. You'll usually find Maple trees standing alone amongst other trees."); + stage = 5200; + break; + case 3: + interpreter.sendItemMessage(1513, "Magic trees are... magic. A difficult wood to work with, but worth it for the rewards. Find them in the areas south of Seers village or on the East side of the Mage arena."); + stage = 5300; + break; + case 4: + interpreter.sendItemMessage(1351, "Bronze axes are easy to get, simply go visit Bob in his shop in Lumbridge, or talk to me if you have mislaid yours."); + stage = 5400; + break; + case 5: + interpreter.sendOptions("Select an Option", "Tell me about different trees and axes.", "What is that cape you're wearing?", "Goodbye."); + stage = 500; + + break; + } + break; + case 5400: + interpreter.sendDialogues(npc, null, "As you progress in your combat skill you will find you", "can wield your woodcutting axe as a weapon, it's not", "very effective, but it frees up a slot for another log."); + stage = 5401; + break; + case 5401: + interpreter.sendDoubleItemMessage(1349, 1353, "As your woodcutting skill increases you will find yourself able to use better axes to chop trees faster.... anything up to steel you can buy from Bob's axe shop."); + stage = 5402; + break; + case 5402: + interpreter.sendItemMessage(1359, "Rune axes can be player made with very high level smithing and mining. They can also be obtained through killing one of the fearsome tree spirits, though this is very rare."); + stage = 510; + break; + case 5300: + interpreter.sendDialogues(npc, null, "Hollow trees can be found in the Haunted Woods east", "of Canifis, but be careful of the leeches."); + stage = 510; + break; + case 5200: + interpreter.sendItemMessage(1515, "Yew trees are few and far between. We do our best to cultivate them. Look for the tree icon on your mini map to find rare trees. Try North of Port Sarim."); + stage = 510; + break; + case 5100: + interpreter.sendDoubleItemMessage(1511, 1521, "lands."); + stage = 5101; + break; + case 5101: + interpreter.sendItemMessage(1519, "Willow trees will yield willow logs. You'll find willows like to grow near water, you can find some south of Draynor."); + stage = 5102; + break; + case 5102: + interpreter.sendOptions("Trees", "Oak and Willow", "Maple and Yew", "Magic and other trees", "Axes", "Go back to teaching"); + stage = 511; + break; + case 520: + interpreter.sendDialogues(npc, null, "This is a Skillcape of Woodcutting. Only a person who", "has achieved the highest possible level in a skill can wear", "one."); + stage = 530; + break; + case 530: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4906 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/WydinDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/WydinDialogue.java new file mode 100644 index 000000000..31ff4db81 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/WydinDialogue.java @@ -0,0 +1,232 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue that handles the wydin npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WydinDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code WydinDialogue} {@code Object}. + */ + public WydinDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WydinDialogue} {@code Object}. + * @param player the player. + */ + public WydinDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WydinDialogue(player); + } + + @Override + public boolean open(Object... args) { + boolean door = false; + if (args.length == 2) + door = (boolean) args[1]; + if (door) { + if (player.getSavedData().getGlobalData().isWydinEmployee()) { + interpreter.sendDialogues(557, FacialExpression.HALF_GUILTY, "Can you put your white apron on before going in there", "please."); + stage = 100; + } else { + interpreter.sendDialogues(557, null, "Hey, you can't go in there. Only emplyees of the", "grocery store can go in."); + stage = 100; + } + return true; + } else { + npc = (NPC) args[0]; + } + if (player.getSavedData().getGlobalData().isWydinEmployee()) { + interpreter.sendDialogues(557, FacialExpression.HALF_GUILTY, "Is it nice and tidy round the back now?"); + stage = 0; + } else { + interpreter.sendDialogues(557, FacialExpression.HALF_GUILTY, "Welcome to my food store! Would you like to buy", "anything?"); + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getSavedData().getGlobalData().isWydinEmployee()) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, can I work out front now?", "Yes, are you going to pay me yet?", "No, it's a complete mess.", "Can I buy something please?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, can I work out front now?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, are you going to pay me yet?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, it's a complete mess."); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I buy something please?"); + stage = 40; + break; + + } + break; + case 10: + interpreter.sendDialogues(557, FacialExpression.HALF_GUILTY, "No, I'm the one who works here."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(557, FacialExpression.HALF_GUILTY, "Umm... No, not yet."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, it's a complete mess."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(557, FacialExpression.HALF_GUILTY, "Ah well, it'll give you something to do, won't it."); + stage = 32; + break; + case 32: + end(); + break; + case 40: + interpreter.sendDialogues(557, FacialExpression.HALF_GUILTY, "Yes, ofcourse."); + stage = 41; + break; + case 41: + end(); + npc.openShop(player); + break; + case 100: + end(); + break; + } + } else { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes please.", "No, thank you.", "What can you recommend?", "Can I get a job here?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What can you recommend?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I get a job here?"); + stage = 40; + break; + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + case 30: + interpreter.sendDialogues(557, null, "We have this really exotic fruit all the way from", "Karamja. It's called a banana."); + stage = 31; + break; + case 31: + interpreter.sendOptions("Select an Option", "Hmm, I think I'll try one.", "I don't like the sound of that."); + stage = 32; + break; + case 32: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Hmm, I think I'll try one."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, null, "I don't like the sound of that."); + stage = 100; + break; + } + break; + case 40: + interpreter.sendDialogues(557, null, "Well, you're keen, I'll give you that. Okay, I'll give you", "a go. Have you got your own white apron?"); + stage = 41; + break; + case 41: + if (!player.getInventory().contains(1005, 1) && !player.getEquipment().contains(1005, 1) && !player.getBank().contains(1005, 1)) { + interpreter.sendDialogues(player, null, "No, I haven't."); + stage = 42; + } else { + interpreter.sendDialogues(player, null, "Yes, I have one."); + stage = 50; + } + break; + case 42: + interpreter.sendDialogues(557, null, "Well, you can't work here unless you have a white", "apron. Health and safety regulations, you understand."); + stage = 43; + break; + case 43: + interpreter.sendDialogues(player, null, "Where can I get one of those?"); + stage = 44; + break; + case 44: + interpreter.sendDialogues(557, null, "Well, I get all of mine over at the clothing shop in", "Varrock. They sell them cheap there."); + stage = 45; + break; + case 45: + interpreter.sendDialogues(557, null, "Oh, and I'm sure that I've seen a spare one over in", "Gerrant's fish store somewhere. It's the little place just", "north of here."); + stage = 46; + break; + case 46: + end(); + break; + case 50: + player.getSavedData().getGlobalData().setWydinEmployee(true); + interpreter.sendDialogues(557, null, "Wow - you are well prepared! You're hired. Go through", "to the back and tidy up for me, please."); + stage = 100; + break; + case 100: + end(); + break; + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 557 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/WysonTheGardenerDialogue.kt b/Server/src/main/java/Server/core/game/content/dialogue/WysonTheGardenerDialogue.kt new file mode 100644 index 000000000..555fcc0be --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/WysonTheGardenerDialogue.kt @@ -0,0 +1,248 @@ +package core.game.content.dialogue + +import core.game.content.global.BirdNest +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryLevel +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.plugin.Initializable +import core.tools.Items + +/** + * Represents the Wyson the gardener dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +class WysonTheGardenerDialogue : DialoguePlugin { + /** + * If its a bird nest reward. + */ + private var birdNest = false + + /** + * Constructs a new `WysonTheGardenerDialogue` `Object`. + */ + constructor() { + /** + * empty. + */ + } + + /** + * Constructs a new `WysonTheGardenerDialogue` `Object`. + * @param player the player. + */ + constructor(player: Player?) : super(player) {} + + override fun newInstance(player: Player): DialoguePlugin { + return WysonTheGardenerDialogue(player) + } + + override fun open(vararg args: Any): Boolean { + npc = args[0] as NPC + birdNest = player.inventory.containsItem(MOLE_CLAW) || player.inventory.containsItem(MOLE_SKIN) + if (birdNest) { + npc("If I'm not mistaken, you've got some mole bits there!", "I'll trade 'em for bird nest if ye likes.") + stage = 100 + return true + } + npc("I'm the head gardener around here.", "If you're looking for woad leaves, or if you need help", "with owt, I'm yer man.") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 0 -> { + options("Yes please, I need woad leaves.", "Sorry, but I'm not interested.") + stage = 1 + } + 1 -> when (buttonId) { + 1 -> { + player("Yes please, I need woad leaves.") + stage = 10 + } + 2 -> { + player("Sorry, but I'm not interested.") + stage = 200 + } + } + 10 -> { + npc("How much are you willing to pay?") + stage = 11 + } + 11 -> { + options("How about 5 coins?", "How about 10 coins?", "How about 15 coins?", "How about 20 coins?") + stage = 12 + } + 12 -> when (buttonId) { + 1 -> { + player("How about 5 coins?") + stage = 110 + } + 2 -> { + player("How about 10 coins?") + stage = 110 + } + 3 -> { + player("How about 15 coins?") + stage = 130 + } + 4 -> { + player("How about 20 coins?") + stage = 140 + } + } + 110 -> { + npc("No no, that's far too little. Woad leaves are hard to get. I", "used to have plenty but someone kept stealing them off", "me.") + stage = 111 + } + 111 -> end() + 130 -> { + npc("Mmmm... ok, that sounds fair.") + stage = 131 + } + 131 -> if (player.inventory.contains(995, 15)) { + player.inventory.remove(COINS[0]) + player.inventory.add(WOAD_LEAF) + player("Thanks.") + player.packetDispatch.sendMessage("You buy a woad leaf from Wyson.") + stage = 132 + } else { + end() + player.packetDispatch.sendMessage("You need 15 cold coins to buy a woad leaf.") + } + 132 -> { + npc("I'll be around if you have any more gardening needs.") + stage = 133 + } + 133 -> end() + 140 -> { + npc("Thanks for being generous", "here's an extra woad leave.") + stage = 141 + } + 141 -> if (player.inventory.contains(995, 20)) { + player.inventory.remove(COINS[1]) + var i = 0 + while (i < 2) { + player.inventory.add(WOAD_LEAF, player) + i++ + } + player("Thanks.") + player.packetDispatch.sendMessage("You buy two woad leaves from Wyson.") + stage = 132 + } else { + end() + player.packetDispatch.sendMessage("You need 15 cold coins to buy a woad leaf.") + } + 200 -> { + npc("Fair enough.") + stage = 201 + } + 201 -> end() + 100 -> { + options("Yes, I will trade the mole claws.", "Okay, I will trade the mole skin.", "I'd like to trade both.", "No, thanks.") + stage = 900 + } + 900 -> when (buttonId) { + 1 -> { + player("Yes, I will trade the mole claws.") + stage = 910 + } + 2 -> { + player("Okay, I will trade the mole skin.") + stage = 920 + } + 3 -> { + player("I'd like to trade both.") + stage = 930 + } + 4 -> { + player("No, thanks.") + stage = 999 + } + } + 910 -> { + if (!player.inventory.containsItem(MOLE_CLAW)) { + player("Sorry, I don't have any mole claws.") + stage = 999 + } + end() + addRewards() + } + 920 -> { + if (!player.inventory.containsItem(MOLE_SKIN)) { + player("Sorry, I don't have any mole skins.") + stage = 999 + } + end() + addRewards() + } + 930 -> { + if (!player.inventory.containsItem(MOLE_CLAW) && !player.inventory.containsItem(MOLE_SKIN)) { + player("Sorry, I don't have any.") + stage = 999 + } + addRewards() + end() + } + 999 -> end() + } + return true + } + + /** + * Adds nests. + * @param nestAmount the amount. + */ + private fun addRewards() { + val moleClaws = player.inventory.getAmount(Items.MOLE_CLAW_7416) + val moleSkin = player.inventory.getAmount(Items.MOLE_SKIN_7418) + val nestAmount = moleClaws + moleSkin + + //Remove claws and skins + player.inventory.remove(Item(Items.MOLE_CLAW_7416,moleClaws)) + player.inventory.remove(Item(Items.MOLE_SKIN_7418, moleSkin)) + + //Add white lily seeds if the player has the hard diary done + if(moleSkin > 0 && player.achievementDiaryManager.getDiary(DiaryType.FALADOR).checkComplete(DiaryLevel.HARD)) { + player.inventory.add(Item(14589, moleSkin), player) + } + + //Add nests + for (i in 0 until nestAmount) { + if(!player.inventory.add(Item(BirdNest.getRandomNest(true).nest.id, 1), player)){ + GroundItemManager.create(Item(BirdNest.getRandomNest(true).nest.id,1),player.location,player) + } + } + } + + override fun getIds(): IntArray { + return intArrayOf(36) + } + + companion object { + /** + * Represents the coins item that can be used. + */ + private val COINS = arrayOf(Item(995, 15), Item(995, 20)) + + /** + * Represents the woad leaf item. + */ + private val WOAD_LEAF = Item(1793, 1) + + /** + * The mole claw item. + */ + private val MOLE_CLAW = Item(7416) + + /** + * The mole skin. + */ + private val MOLE_SKIN = Item(7418) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/dialogue/YadvigaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/YadvigaDialogue.java new file mode 100644 index 000000000..cfebf47e3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/YadvigaDialogue.java @@ -0,0 +1,59 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the yadviga dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class YadvigaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code YadvigaDialogue} {@code Object}. + */ + public YadvigaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code YadvigaDialogue} {@code Object}. + * @param player the player. + */ + public YadvigaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new YadvigaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Get lost!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6041 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/YuriDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/YuriDialogue.java new file mode 100644 index 000000000..48c40855b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/YuriDialogue.java @@ -0,0 +1,55 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue used for the yuri npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class YuriDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code YuriDialogue} {@code Object}. + */ + public YuriDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code YuriDialogue} {@code Object}. + * @param player the player. + */ + public YuriDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new YuriDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm... you smell strange..."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6028 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ZahwaDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ZahwaDialogue.java new file mode 100644 index 000000000..3bffea1aa --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ZahwaDialogue.java @@ -0,0 +1,63 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for zahwa. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ZahwaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ZahwaDialogue} {@code Object}. + */ + public ZahwaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ZahwaDialogue} {@code Object}. + * @param player the player. + */ + public ZahwaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ZahwaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hi!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ughhhh...."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 963 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ZamboDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ZamboDialogue.java new file mode 100644 index 000000000..f75fa6aa9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ZamboDialogue.java @@ -0,0 +1,75 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for zambo. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ZamboDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ZamboDialogue} {@code Object}. + */ + public ZamboDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ZamboDialogue} {@code Object}. + * @param player the player. + */ + public ZamboDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ZamboDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hey, are you wanting to try some of my fine wines", "and spririts? All brewed locally on Karamja island."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 20; + break; + } + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 568 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ZekeDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ZekeDialogue.java new file mode 100644 index 000000000..3b9817ad7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ZekeDialogue.java @@ -0,0 +1,135 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for zeke. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ZekeDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ZekeDialogue} {@code Object}. + */ + public ZekeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ZekeDialogue} {@code Object}. + * @param player the player. + */ + public ZekeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ZekeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A thousand greetings, sir."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Do you want to trade?", "Nice cloak.", "Could you sell me a dragon scimitar?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you want to trade?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nice cloak."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Could you sell me a dragon scimitar?"); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, certainly. I deal in scimitars."); + stage = 11; + break; + case 11: + npc.openShop(player); + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Thank you."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A dragon scimitar? A DRAGON scimitar?"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No way, man!"); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The banana-brained nitwits who make them would never", "dream of selling any to to me."); + stage = 33; + break; + case 33: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Seriously, you'll be a monkey's uncle before you'll ever", "hold a dragon scimitar."); + stage = 34; + break; + case 34: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hmmm, funny you should say that..."); + stage = 35; + break; + case 35: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Perhaps you'd lie to take a look at my stock?"); + stage = 36; + break; + case 36: + interpreter.sendOptions("Select an Option", "Yes, please, Zeke.", "Not today, thank you."); + stage = 37; + break; + case 37: + switch (buttonId) { + case 1: + npc.openShop(player); + end(); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No today, thank you."); + stage = 2000; + break; + } + break; + case 2000: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 541 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/ZilyanaJRDialogue.java b/Server/src/main/java/Server/core/game/content/dialogue/ZilyanaJRDialogue.java new file mode 100644 index 000000000..1c7b2bb96 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/ZilyanaJRDialogue.java @@ -0,0 +1,73 @@ +package core.game.content.dialogue; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Dialogue for the boss pet, Commander Zilyana JR. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class ZilyanaJRDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ZilyanaJRDialogue} {@code Object}. + */ + public ZilyanaJRDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ZilyanaJRDialogue} {@code Object}. + * @param player the player. + */ + public ZilyanaJRDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ZilyanaJRDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if(player.getInventory().containsItem(new Item(11698, 1)) || (player.getEquipment().get(3) != null && player.getEquipment().get(3).getId() == 11698)){ + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I FOUND THE GODSWORD!"); + stage = 0; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "FIND THE GODSWORD!"); + stage = 1; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "GOOD!"); + stage = 2; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "FIND THE GODSWORD!"); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8593 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/book/Book.java b/Server/src/main/java/Server/core/game/content/dialogue/book/Book.java new file mode 100644 index 000000000..561284a40 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/book/Book.java @@ -0,0 +1,193 @@ +package core.game.content.dialogue.book; + +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.plugin.PluginManifest; +import core.plugin.PluginType; + +/** + * Represents a dialogue book. + * @author 'Vexia + * @date 1/1/14 + */ +@PluginManifest(type = PluginType.DIALOGUE) +public abstract class Book extends DialoguePlugin { + + /** + * Represents the component interface of the book. + */ + private static final Component INTERFACE = new Component(49); + + /** + * Represents the red string. + */ + protected static final String RED = ""; + + /** + * Represents the blue string. + */ + protected static final String BLUE = ""; + + /** + * Represents the name of the book. + */ + protected String name; + + /** + * Represents the id of this book. + */ + protected int id; + + /** + * Represents the pages of this book. + */ + protected PageSet[] sets; + + /** + * Represents the index of the page set we're at. + */ + protected int index = -1; + + /** + * Constructs a new {@code Book} {@code Object}. + * @param name the name. + * @param id the id. + */ + public Book(final Player player, final String name, final int id, final PageSet... sets) { + this.player = player; + this.name = name; + this.id = id; + this.sets = sets; + } + + /** + * Constructs a new {@code Book} {@code Object}. + */ + public Book() { + /** + * empty. + */ + } + + @Override + public boolean open(Object... args) { + return open(player); + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (buttonId) { + case 112: + player.getInterfaceManager().close(); + break; + case 66: + case 52: + next(); + break; + case 64: + case 50: + previous(); + break; + } + return true; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return this; + } + + /** + * Method used to open a book. + * @return True if succesfully opened. + */ + public boolean open(final Player player) { + next(); + return true; + } + + /** + * Method used to write the next dialogue. + */ + public void next() { + player.lock(); + index++; + if (index > sets.length - 1) { + player.unlock(); + player.getInterfaceManager().close(); + return; + } + final Page[] set = sets[index].getPages(); + display(set); + player.unlock(); + } + + /** + * Method used to write the previous dialogue. + */ + public void previous() { + player.lock(); + index--; + if (index < 0) { + index = 0; + } + final Page[] set = sets[index].getPages(); + display(set); + player.unlock(); + } + + /** + * Method used to display a set of pages. + * @param set the set. + */ + public void display(Page[] set) { + } + + /** + * Method used when the book is finished. + */ + public void finish() { + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } + + /** + * Gets the index. + * @return The index. + */ + public int getIndex() { + return index; + } + + /** + * Sets the index. + * @param index The index to set. + */ + public void setIndex(int index) { + this.index = index; + } + + /** + * Gets the interface component. + * @return the component. + */ + public Component getInterface() { + return INTERFACE; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/book/BookLine.java b/Server/src/main/java/Server/core/game/content/dialogue/book/BookLine.java new file mode 100644 index 000000000..d274e0079 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/book/BookLine.java @@ -0,0 +1,46 @@ +package core.game.content.dialogue.book; + +/** + * Represents a book line. + * @author 'Vexia + * @date 31/12/2013 + */ +public class BookLine { + + /** + * Represents the message to display. + */ + private final String message; + + /** + * Represents the child if of the line. + */ + private final int child; + + /** + * Constructs a new {@code Page} {@code Object}. + * @param message the message. + * @param child the child. + */ + public BookLine(final String message, final int child) { + this.message = message; + this.child = child; + } + + /** + * Gets the message. + * @return The message. + */ + public String getMessage() { + return message; + } + + /** + * Gets the child. + * @return The child. + */ + public int getChild() { + return child; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/book/GrimDiary.java b/Server/src/main/java/Server/core/game/content/dialogue/book/GrimDiary.java new file mode 100644 index 000000000..e0ec70bb4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/book/GrimDiary.java @@ -0,0 +1,93 @@ +package core.game.content.dialogue.book; + +import core.game.component.Component; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * The grim diary book. + * @author Vexia + */ +@Initializable +public class GrimDiary extends Book { + + /** + * Represents the component interface. + */ + private static final Component INTERFACE = new Component(26); + + /** + * Represents the array of pages for this book. + */ + private static final PageSet[] PAGES = new PageSet[] { new PageSet(new Page(new BookLine("My Diary

by Grim

" + RED + "'''''''''''''''''''''''''''''''
" + RED + "''''12th Bennath
" + RED + "'''''''''''''''''''''''''''''''
I had such a busy day
dealing out death today
It's not as easy being grim.
Realised that Alfonse is
such a good servant. He





", 102)), new Page(new BookLine("seems to have the house
in full working order. I
shall have to congratulate
him tomorrow. Spent
some well-deserved time
sharpening my scythe -
Alfonse kindly reminded
me to put the sharpener
back in the cabinet. Such
a good chap.", 87))), new PageSet(new Page(new BookLine("

" + RED + "'''''''''''''''''''''''''''''''
" + RED + "'''13th Bennath
" + RED + "'''''''''''''''''''''''''''''''
Went to the Wilderness
today. Plenty of foolish
people surrendering their
lives to me without
thought. My back is
killing me from all the
standing around waiting.", 102)), new Page(new BookLine("Must get that seen to.
Got my robes stained
from one victim. Simply
ruined! I decided to
throw them in the
fireplace - will light the
fire soon. Oh, and I must
remember to call mother.", 87))), new PageSet(new Page(new BookLine("

" + RED + "'''''''''''''''''''''''''''''''
" + RED + "'''14th Bennath
" + RED + "'''''''''''''''''''''''''''''''
A tragic day. Alfonse and
I were in the garden
looking at the state of the
spider nest. I patted my
trusty servant on the
back in thanks for all his
hard work. Sadly, my
touch of death killed him", 102)), new Page(new BookLine("instantly. Feel quite guilty.", 87))), new PageSet(new Page(new BookLine("

" + RED + "'''''''''''''''''''''''''''''''
" + RED + "'''20th Bennath
" + RED + "'''''''''''''''''''''''''''''''
House is getting into
quite a state without
Alfonse - things strewn all
over the place. Almost
trod on the eye of my
mentor, eww. I put the
eye back on the shelf so
he can watch over me", 102)), new Page(new BookLine("and make sure I stay
true to his teachings.
Went into Varrock to
buy some new robes -
people kept running away
in fear, so it was difficult
to find a sale.", 87))), new PageSet(new Page(new BookLine("

" + RED + "'''''''''''''''''''''''''''''''
" + RED + "'''21st Bennath
" + RED + "'''''''''''''''''''''''''''''''
Decided to spend a bit of
time tidying today - it
really isn't an easy job.
In my activities I found
my old 'Voice of Doom'
potion on the bookcase -
perfect for giving people a
good scare. Oh, I do love", 102)), new Page(new BookLine("my job.


" + RED + "'''''''''''''''''''''''''''''''
" + RED + "'''22nd Bennath
" + RED + "'''''''''''''''''''''''''''''''
Ordered a new servant
today from the agency
and got a 10% discount
for getting past the
1000th servant mark.", 87))), new PageSet(new Page(new BookLine("Woo hoo! The agency
sent me his Last Will and
Testement. Shall have to
sit on that for a while.

" + RED + "'''''''''''''''''''''''''''''''
" + RED + "'''23rd Bennath
" + RED + "'''''''''''''''''''''''''''''''
Aquired some bones
today. Muncher should
appreciate them as a treat", 102)), new Page(new BookLine("the next time he behaves.
The problem is there
aren't many barriers he
can't devour, so I decided
to lock the bones up in
the chest.

" + RED + "'''''''''''''''''''''''''''''''" + RED + "
" + RED + "''''24th Bennath
" + RED + "'''''''''''''''''''''''''''''''
My plan to make undead", 87))), new PageSet(new Page(new BookLine("fish is going quite well. I
managed to obtain a
resurrection hourglass
today,so have added that
to the fishtank to finish
off the process. It's so
difficult to have pets when
everything you touch dies
horrifically. I remember
having a rabbit once that
exploded when I fed it a", 102)), new Page(new BookLine("carrot!

" + RED + "'''''''''''''''''''''''''''''''
" + RED + "'''25th Bennath
" + RED + "'''''''''''''''''''''''''''''''
Got back home today to
find Muncher has run
around the house
creating havok - he even
ate the postman! I", 87))), new PageSet(new Page(new BookLine("scolded him. So hopefully
he won't do it again
anytime soon. All my
things are in such a
mess. I'm surely going to
have to find someone to
tidy things up before my
new servant arrives.
Don't want to seem
totally incapable of looking
after myself.", 102)), new Page(new BookLine("", 87))), }; + + /** + * Represents all the array of all configs to hide. + */ + private static final int[] ALL = new int[] { 102, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101 }; + + /** + * Constructs a new {@code GrimDiary} {@code Object} + * @param player the player. + */ + public GrimDiary(final Player player) { + super(player, "Diary of Death", 2739823, PAGES); + } + + /** + * Constructs a new {@code GrimDiary} {@code Object} + */ + public GrimDiary() { + /** + * empty. + */ + } + + /** + * Method used to display a set of pages. + * @param set the set. + */ + public void display(Page[] set) { + player.lock(2); + player.getInterfaceManager().open(getInterface()); + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 65, index < 1 ? true : false); + boolean lastPage = index == 7; + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 67, lastPage ? true : false); + if (lastPage) { + finish(); + } + for (int i : ALL) { + player.getPacketDispatch().sendString("", 26, i); + } + player.getPacketDispatch().sendString(getName(), 26, 3); + player.getPacketDispatch().sendString("" + (index == 0 ? (index + 1) : (index + 2)), 26, 68); + player.getPacketDispatch().sendString("" + (index == 0 ? (index + 2) : (index + 3)), 26, 69); + for (Page page : set) { + for (BookLine line : page.getLines()) { + player.getPacketDispatch().sendString(line.getMessage(), getInterface().getId(), line.getChild()); + } + } + player.unlock(); + } + + /** + * Gets the interface. + * @return the interface. + */ + public Component getInterface() { + return INTERFACE; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GrimDiary(player); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("grim-diary") }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/book/KeldagrimRuleBook.java b/Server/src/main/java/Server/core/game/content/dialogue/book/KeldagrimRuleBook.java new file mode 100644 index 000000000..bcae90ba4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/book/KeldagrimRuleBook.java @@ -0,0 +1,106 @@ +package core.game.content.dialogue.book; + +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the strong hold of security book. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KeldagrimRuleBook extends Book { + + /** + * Represents the id of the book. + */ + public static final int ID = 496107759; + + /** + * Represents the component interface. + */ + private static final Component INTERFACE = new Component(26); + + /** + * Represents the array of pages for this book. + */ + private static final PageSet[] PAGES = new PageSet[] { new PageSet(new Page(new BookLine("Rules", 102), new BookLine("1 - Offensive Language", 74), new BookLine("2 - Item Scamming", 75), new BookLine("3 - Password Scamming", 76), new BookLine("4 - Cheating/Bug Abuse", 77), new BookLine("5 - Staff Impersonation", 78), new BookLine("6 - Account Sharing/Trading", 79), new BookLine("7 - Using Third Party", 80), new BookLine("Software", 81), new BookLine("8 - Multi Logging-in", 82), new BookLine("9 - Encouraging Others to", 83), new BookLine("Break Rules", 84), new BookLine("10 - False Representation", 85), new BookLine("11 - Website Advertising", 86)), new Page(new BookLine("12 - Read World Item", 87), new BookLine("Trading", 88), new BookLine("13 - Asking For Personal", 89), new BookLine("Details", 90), new BookLine("14 - Misuse of Official", 91), new BookLine("Forums", 92), new BookLine("15 - Advert Blocking", 93))), new PageSet(new Page(new BookLine(BLUE + "1 - Offensive Language", 102), new BookLine("You must not use any", 74), new BookLine("language which is offensive,", 75), new BookLine("racist or obscene. Remember,", 76), new BookLine("it's nice to be nice!", 77)), new Page(new BookLine(BLUE + "2 - Item Scamming", 87), new BookLine("You must not scam or", 89), new BookLine("deceive other players. This", 90), new BookLine("includes claiming that items", 91), new BookLine("are rare when they are not,", 92), new BookLine("team scamming or telling", 93), new BookLine("players that you can", 94), new BookLine("upgrade' their armour in", 95), new BookLine("any way!", 96))), new PageSet(new Page(new BookLine(BLUE + "3 - Password Scamming", 102), new BookLine("Asking for - or trying to", 74), new BookLine("obtain - another player's", 75), new BookLine("password in any way will not", 76), new BookLine("be tolerated, even in jest!", 77)), new Page(new BookLine(BLUE + "4 - Cheating/Bug Abuse", 87), new BookLine("A bug is a technical glitch", 89), new BookLine("found in the game. You", 90), new BookLine("must not use or attempt to", 91), new BookLine("use any cheats or errors that", 92), new BookLine("you find in our software.", 93), new BookLine("Any bugs found must be", 94), new BookLine("reported to Keldagrim", 95), new BookLine("immediately, by clicking the", 96), new BookLine("'Report a bug/fault' link", 97), new BookLine("found on the main page.", 98))), new PageSet(new Page(new BookLine(BLUE + "5 - Staff Impersonation", 102), new BookLine("You should not attempt to", 74), new BookLine("impersonate Keldagrim staff in", 75), new BookLine("any way.", 76)), new Page(new BookLine(BLUE + "6 - Account Sharing/Trading", 87), new BookLine("Each account should only be", 89), new BookLine("used by ONE person and", 90), new BookLine("ONE person alone.", 91), new BookLine("Remember that trying to", 92), new BookLine("buy, sell, borrow or give", 93), new BookLine("away an account is against", 94), new BookLine("the rules and will land you in", 95), new BookLine("trouble when caught!", 96))), new PageSet(new Page(new BookLine(BLUE + "7 - Using Third Party
" + BLUE + "Software

You must not use other
programs to gain an unfair
advantage in the game.", 102)), new Page(new BookLine(BLUE + "8 - Multi Logging-in

If you create more than one
Keldagrim account, they
must not interact. This
includes giving items to a
friend to transfer to another
account you own.", 87))), new PageSet(new Page(new BookLine(BLUE + "9 - Encouraging Others to
" + BLUE + "Break Rules

You must not encourage
others to break any of the
Keldagrim rules.", 102), new BookLine(BLUE + "10 - False Representation

You must not misuse
Keldagrim Customer
Support.Trying to get
another player into trouble
by reporting them for no
reason or framing them is an
abuse of the Customer
Support Team's service.
want to help as many
players as possible and so the
Customer Support Team's
service must be used
appropriately and treated with", 87))), new PageSet(new Page(new BookLine("respect at all times.", 102), new BookLine(BLUE + "11 - Website Advertising

You are not allowed to
actively advertise any
websites, fan-sites, IRC
channels or product
anywhere in Keldagrim,
including the Keldagrim
forums.", 87)), new Page()), new PageSet(new Page(new BookLine(BLUE + "12 - Real World Item
" + BLUE + "Trading

Keldagrim items must only
be exchanged for other items
or service within the game.
Buying or selling items
outside of the Keldagrim
enviironment is not in the
spirit of the game and is easy
for Keldagrim to trace!", 102), new BookLine(BLUE + "13 - Asking for Personal
" + BLUE + "Details

To protect player's safety
and privacy, you must not
ask for personal details. This
includes full names, phone
numbers, MSN, AIM, email
and home/school addresses!", 87))), new PageSet(new Page(new BookLine(BLUE + "14 - Misuse of Official
" + BLUE + "Forums

Forums must be used in
accordance with the Forum
Code of Conduct and treated
with respect at all times.", 102), new BookLine(BLUE + "15 - Advert Blocking

Blocking the adverts in the
free to play version of
Keldagrim is against the
rules.", 87))) }; + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public KeldagrimRuleBook(final Player player) { + super(player, "Keldagrim Rules", -1, PAGES); + } + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public KeldagrimRuleBook() { + /** + * empty. + */ + } + + /** + * Method used to display a set of pages. + * @param set the set. + */ + @Override + public void display(Page[] set) { + player.lock(2); + player.getInterfaceManager().open(getInterface()); + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 65, index < 1 ? true : false); + boolean lastPage = index == 8; + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 67, lastPage ? true : false); + if (lastPage) { + finish(); + } + for (int i : getHiddenChilds()) { + player.getPacketDispatch().sendString("", 26, i); + } + int page1 = index == 0 ? 1 : index == 1 ? 3 : index == 2 ? 5 : index == 3 ? 7 : index == 4 ? 9 : index == 5 ? 11 : index == 6 ? 13 : index == 7 ? 15 : index == 8 ? 17 : index == 9 ? 19 : 21; + player.getPacketDispatch().sendString(getName(), 26, 3); + player.getPacketDispatch().sendString("" + page1, 26, 68); + player.getPacketDispatch().sendString("" + (page1 + 1), 26, 69); + for (Page page : set) { + for (BookLine line : page.getLines()) { + player.getPacketDispatch().sendString(line.getMessage(), getInterface().getId(), line.getChild()); + } + } + player.unlock(); + } + + /** + * Gets the interface. + * @return the interface. + */ + public Component getInterface() { + return INTERFACE; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KeldagrimRuleBook(player); + } + + /** + * Represents all the array of all configs to hide. + */ + private static final int[] ALL = new int[] { 102, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101 }; + + /** + * Gets the hidden childs. + * @return the childs. + */ + private int[] getHiddenChilds() { + return ALL; + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/book/Page.java b/Server/src/main/java/Server/core/game/content/dialogue/book/Page.java new file mode 100644 index 000000000..96196b272 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/book/Page.java @@ -0,0 +1,31 @@ +package core.game.content.dialogue.book; + +/** + * Represents a page on a book. + * @author 'Vexia + * @date 1/1/14 + */ +public class Page { + + /** + * Represents the lines on a page. + */ + private final BookLine[] lines; + + /** + * Constructs a new {@code Page} {@code Object}. + * @param lines the lines. + */ + public Page(BookLine... lines) { + this.lines = lines; + } + + /** + * Gets the lines. + * @return The lines. + */ + public BookLine[] getLines() { + return lines; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/book/PageSet.java b/Server/src/main/java/Server/core/game/content/dialogue/book/PageSet.java new file mode 100644 index 000000000..bce595b70 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/book/PageSet.java @@ -0,0 +1,29 @@ +package core.game.content.dialogue.book; + +/** + * Represents a set of pages on a book. + * @author 'Vexia + */ +public class PageSet { + + /** + * Represents the set of pages. + */ + private final Page[] pages; + + /** + * Constructs a new {@code PageSet} {@code Object}. + * @param pages the pages. + */ + public PageSet(final Page... pages) { + this.pages = pages; + } + + /** + * Gets the pages. + * @return The pages. + */ + public Page[] getPages() { + return pages; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/book/SecurityBookPlugin.java b/Server/src/main/java/Server/core/game/content/dialogue/book/SecurityBookPlugin.java new file mode 100644 index 000000000..2f888913b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/book/SecurityBookPlugin.java @@ -0,0 +1,135 @@ +package core.game.content.dialogue.book; + +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.GameWorld; + +/** + * Represents the strong hold of security book. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SecurityBookPlugin extends Book { + + /** + * Represents the strong hold of security book. + */ + public static int ID = 49610759; + + /** + * Represents the component interface. + */ + private static final Component INTERFACE = new Component(26); + + /** + * Represents the array of pages for this book. + */ + private static final PageSet[] PAGES = new PageSet[] { new PageSet(new Page(new BookLine("Chapters", 102), new BookLine("

" + BLUE + "Password Tips

", 74), new BookLine("

" + BLUE + "Recovery Questions

", 75), new BookLine("

" + BLUE + "Password Tips

", 74), new BookLine("

" + BLUE + "Recovery Questions

", 75), new BookLine("

" + BLUE + "Other Security Tips

", 76), new BookLine("

" + BLUE + "Stringhold of Security

", 77)), new Page(new BookLine("

" + BLUE + "Password Tips

", 87), new BookLine("A good password should be", 88), new BookLine("easily remembered by", 89), new BookLine("yourself but not easily", 90), new BookLine("guessed by anyone else.", 91), new BookLine("Choose a password that has", 93), new BookLine("both letters and numbers in", 94), new BookLine("it for the best security but", 95), new BookLine("don't make it so hard that", 96), new BookLine("you'll forget it!", 97), new BookLine("Never write your password", 99), new BookLine("down or leave it in a text file", 100), new BookLine("on your computer, someone", 101))), new PageSet(new Page(new BookLine("could find it easily!", 102), new BookLine("Never tell anyone your", 74), new BookLine("password in " + GameWorld.getSettings().getName() + ", not", 75), new BookLine("even a Moderator of any", 76), new BookLine("kind.", 77)), new Page(new BookLine("

" + BLUE + "Recovery Questions

", 87), new BookLine("Ideally your recovery", 88), new BookLine("questions should be easily", 89), new BookLine("remembered by you but not", 90), new BookLine("guessable by anyone who", 91), new BookLine("may know you or given", 92), new BookLine("away in conversation. Choose", 93), new BookLine("things that do not change,", 94), new BookLine("like dates or names but don't", 95), new BookLine("choose obvious ones like your", 96), new BookLine("birthday and your sister or", 97), new BookLine("bother's name because lots", 98), new BookLine("of people will know that.", 99))), new PageSet(new Page(new BookLine("

" + BLUE + "Recovery Questions

", 102), new BookLine("Bear in mind that recovery", 73), new BookLine("questions will take 14 days to", 74), new BookLine("become active after you have", 75), new BookLine("applied for them to be", 76), new BookLine("changed. This is to protect", 77), new BookLine("your account from hijackers", 78), new BookLine("who may change them.", 79), new BookLine("Never give your password to", 81), new BookLine("ANYONE. This includes", 82), new BookLine("your friends, family, and", 83), new BookLine("moderators in game.", 84), new BookLine("Never leave your account", 86)), new Page(new BookLine("logged on if you are away", 87), new BookLine("from the computer, it only", 88), new BookLine("takes 5 seconds to steal your", 89), new BookLine("account!", 90))), new PageSet(new Page(new BookLine("

" + BLUE + "Stronghold of Security

", 102), new BookLine("Location: The Stronghold of", 73), new BookLine("Security, as we call it, is", 74), new BookLine("located under the village filled", 75), new BookLine("with Barbarians. It was", 76), new BookLine("found after they moved their", 77), new BookLine("mining operations and a", 78), new BookLine("miner fell through. The", 79), new BookLine("Stronghold contains many", 80), new BookLine("challenges. Both for those", 81), new BookLine("who enjoy combat and those", 82), new BookLine("who enjoy challenges of the", 83), new BookLine("mind. This book will be very", 84), new BookLine("useful to you in your travels", 85), new BookLine("there.", 86)), new Page(new BookLine("You can find the Stronghold", 87), new BookLine("of Security by looking for a", 88), new BookLine("hole in Barbarian Village.", 89), new BookLine("Be sure to take your combat", 90), new BookLine("equipment though!", 91))) }; + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public SecurityBookPlugin(final Player player) { + super(player, "" + GameWorld.getSettings().getName() + " Account Security", 9003, PAGES); + } + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public SecurityBookPlugin() { + /** + * empty. + */ + } + + /** + * Method used to display a set of pages. + * @param set the set. + */ + public void display(Page[] set) { + /*player.lock(2); + player.getInterfaceManager().open(getInterface()); + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 65, index < 1 ? true : false); + boolean lastPage = index == 3; + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 67, lastPage ? true : false); + if (lastPage) { + finish(); + } + for (int i : getHiddenChilds()) { + player.getPacketDispatch().sendString("", 26, i); + } + player.getPacketDispatch().sendString(getName(), 26, 3); + player.getPacketDispatch().sendString("" + (index == 0 ? (index + 1) : (index + 2)), 26, 68); + player.getPacketDispatch().sendString("" + (index == 0 ? (index + 2) : (index + 3)), 26, 69); + for (Page page : set) { + for (BookLine line : page.getLines()) { + player.getPacketDispatch().sendString(line.getMessage(), getInterface().getId(), line.getChild()); + } + } + player.unlock();*/ + } + + /** + * Gets the interface. + * @return the interface. + */ + public Component getInterface() { + return INTERFACE; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SecurityBookPlugin(player); + } + + /** + * Represents all the array of all configs to hide. + */ + private static final int[] ALL = new int[] { 102, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101 }; + + /** + * Represents the first page hidden configs. + */ + private static final int[] FIRST = new int[] { 73, 78, 79, 80, 81, 82, 83, 84, 85, 86, 92, 98 }; + + /** + * Represents the second stage hidden configs. + */ + private static final int[] SECOND = new int[] { 73, 78, 79, 80, 81, 82, 83, 84, 85, 86, 100, 101 }; + + /** + * Represents the third page hidden configs. + */ + private static final int[] THIRD = new int[] { 85, 80, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101 }; + + /** + * Represents the fourth page hidden configs. + */ + private static final int[] FOURTH = new int[] { 92, 93, 94, 95, 96, 97, 98, 99, 100, 101 }; + + /** + * Gets the hidden childs. + * @return the childs. + */ + @SuppressWarnings("unused") + private int[] getHiddenChilds() { + if (index == 0) { + return FIRST; + } else if (index == 1) { + return SECOND; + } else if (index == 3) { + return THIRD; + } else if (index == 4) { + return FOURTH; + } + return ALL; + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/dialogue/book/StrongholdNotes.java b/Server/src/main/java/Server/core/game/content/dialogue/book/StrongholdNotes.java new file mode 100644 index 000000000..d33f23741 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/dialogue/book/StrongholdNotes.java @@ -0,0 +1,96 @@ +package core.game.content.dialogue.book; + +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Represents the strong hold notes book. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class StrongholdNotes extends Book { + + /** + * Represents the strong hold of security book. + */ + public static int ID = 423943; + + /** + * Represents the component interface. + */ + private static final Component INTERFACE = new Component(26); + + /** + * Represents the array of pages for this book. + */ + private static final PageSet[] PAGES = new PageSet[] { new PageSet(new Page(new BookLine("Chapters

" + BLUE + "Description
" + BLUE + "Level 1
" + BLUE + "Level 2
" + BLUE + "Level 3
" + BLUE + "Level 4
" + BLUE + "Navigation
" + BLUE + "Diary









", 102)), new Page(new BookLine(BLUE + "Description
This stronghold was
unearthed by a miner
prospecting for new ores
around the Barbarian Village.
After gathering some
equipment he ventured into
the maze of tunnels and was
missing for a long time. He
finally emerged along with
copious notes refarding the
new beasts and strange
experiences which had befallen
him. He also mentioned that
there was treasure to be had,", 87))), new PageSet(new Page(new BookLine("but no one has been able to
wring a word from him about
this, he simply flapped his
arms and slapped his head.
This book details his notes
and my diary of exploration.
I am exploring to see if I
can find out more...", 102)), new Page(new BookLine(BLUE + "Level 1
As well as goblins, creatures
like a man but also like a cow
infest this place! I have never
seen anything like this before.
The area itself is reminiscent
of frontline castles, with
many walls, doors and
skeletons of dead enemies.
I'm sure I hear voices in my
head each time I pass
through the gates. I have
dubbed this level War as it
seems like an eternal
battleground. I found only", 87))), new PageSet(new Page(new BookLine("one small peaceful area here.", 102)), new Page(new BookLine(BLUE + "Level 2
My supplies are running low
and I find myself in barren
passages with seemingly
endless malnourished beasts
attacking me, revenous for
food. Nothing appears to be
able to grow, many
adventurers have died
through lack of food and the
very air appears to suck
vitality from me. I've come to
call this place famine.", 87))), new PageSet(new Page(new BookLine(BLUE + "Level 3
Just breathing in this place
makes me shudder at the
thought of what foul disease I
may contract. The walls and
floor ooze and pulsate like
something pox ridden. There
is a very strange beast whom
I narrowly escaped from. At
first I thought it to be a
cross between a cow and a
sheep, something
domesticated... but when it
looked up at me I was
overcome with weakness and", 102)), new Page(new BookLine("barely got way with my life!
Luckily I found a small place
where I could heal myself
and rest a while. I have
named this area pestilence for
it reeks with decay.", 87))), new PageSet(new Page(new BookLine(BLUE + "Level 4
On my first escapade into
this place I was utterly
shocked. The adventurers
who had come before me
must have made up a tiny
proportion of the skeletons of
the dead. Nothing truely
alive exists here, even those
beings who do wander the
halls are not alive as such,
but they do know that I am
and I get the distinct
impression that were they to
have their way, I would not", 102)), new Page(new BookLine("be for long! Death is
everywhere and thus I shall
name this place. There is one
small place of life, which was
gladdening to find and very
worth my while!", 87))), new PageSet(new Page(new BookLine(BLUE + "Navigation
After getting lost several
times I finally worked out the
key to all the ladders and
chains around this death
infested place. All ropes and
chains will take you to the
start of the level that you are
on. However most ladders will
simply take you to the level
above. The one esception is
the ladder in the bottom level
treasure room, which appears
to lead through several
extremely twisty passages.", 102)), new Page(new BookLine("and eventually takes you out
of the dungeon completely.
The portals may be used if
you are of sufficient level or
have already claimed your
reward from the treasure
room.", 102))), new PageSet(new Page(new BookLine(BLUE + "Diary
Day 1
Today I set out to find out
more about this place. From
my research I knew about
the sentient doors, imbued by
some unkown force to talk
to you and ask questions
before they will let you pass.
I have so far passed these
doors without incident, giving
the correct answer seems to
work a treat.

Day 2", 102)), new Page(new BookLine("I have fought my way
through the fearsome beasts
on the first level and am
preparing myself to journey
deeper. I hope that things are
not too difficult further on as
I am already sick of bread
and cheese for dinner.

Day 3
I ventured down into the
famine level today... I was
wounded and have returned
to the relative safety of the
level above. I am going to", 87))), new PageSet(new Page(new BookLine("try to make my way out
through the goblins and
mancow things... I hope I
make it.....", 102)), new Page(new BookLine("", 87))) }; + + /** + * Represents all the array of all configs to hide. + */ + private static final int[] ALL = new int[] { 102, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101 }; + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public StrongholdNotes(final Player player) { + super(player, "Stronghold of Security - Notes", 9004, PAGES); + } + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public StrongholdNotes() { + /** + * empty. + */ + } + + /** + * Method used to display a set of pages. + * @param set the set. + */ + public void display(Page[] set) { + player.lock(2); + player.getInterfaceManager().open(getInterface()); + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 65, index < 1 ? true : false); + boolean lastPage = index == 7; + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 67, lastPage ? true : false); + if (lastPage) { + finish(); + } + for (int i : ALL) { + player.getPacketDispatch().sendString("", 26, i); + } + player.getPacketDispatch().sendString(getName(), 26, 3); + player.getPacketDispatch().sendString("" + (index == 0 ? (index + 1) : (index + 2)), 26, 68); + player.getPacketDispatch().sendString("" + (index == 0 ? (index + 2) : (index + 3)), 26, 69); + for (Page page : set) { + for (BookLine line : page.getLines()) { + player.getPacketDispatch().sendString(line.getMessage(), getInterface().getId(), line.getChild()); + } + } + player.unlock(); + } + + /** + * Gets the interface. + * @return the interface. + */ + public Component getInterface() { + return INTERFACE; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new StrongholdNotes(player); + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/eco/EcoStatus.java b/Server/src/main/java/Server/core/game/content/eco/EcoStatus.java new file mode 100644 index 000000000..046ed2b53 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/eco/EcoStatus.java @@ -0,0 +1,24 @@ +package core.game.content.eco; + +/** + * The several statuses used for the economy. + * @author Emperor + */ +public enum EcoStatus { + + /** + * The status set when money should be drained from the economy. + */ + DRAINING, + + /** + * The status set when money should be pumped into the economy. + */ + BOOSTING, + + /** + * If we are maintaining the current economy. + */ + MAINTAINING; + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/eco/EconomyManagement.java b/Server/src/main/java/Server/core/game/content/eco/EconomyManagement.java new file mode 100644 index 000000000..f8d5788d5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/eco/EconomyManagement.java @@ -0,0 +1,68 @@ +package core.game.content.eco; + +/** + * Represents a managing class for the economy. + * @author Emperor + */ +public final class EconomyManagement { + + /** + * The current economy state. + */ + private static EcoStatus ecoState = EcoStatus.BOOSTING; + + /** + * The modification rate. + */ + private static double modificationRate = 10; + + /** + * Sets the ecoState. + * @param ecoState The ecoState to set. + */ + public static void update(EcoStatus ecoState, double modificationRate) { + boolean update = EconomyManagement.ecoState != ecoState; + EconomyManagement.ecoState = ecoState; + if (EconomyManagement.modificationRate != modificationRate) { + EconomyManagement.modificationRate = modificationRate; + update = true; + } + if (update) { + System.out.println("-------------------------------------------------------------------"); + System.out.println(" Switched economy management status to " + ecoState + " with a rate of " + modificationRate + " |"); + System.out.println("-------------------------------------------------------------------"); + } + } + + /** + * Sets the ecoState. + * @param ecoState The ecoState to set. + */ + public static void updateEcoState(EcoStatus ecoState) { + update(ecoState, modificationRate); + } + + /** + * Sets the modificationRate. + * @param modificationRate The modificationRate to set. + */ + public static void updateModificationRate(double modificationRate) { + update(ecoState, modificationRate); + } + + /** + * Gets the ecoState. + * @return The ecoState. + */ + public static EcoStatus getEcoState() { + return ecoState; + } + + /** + * Gets the modificationRate. + * @return The modificationRate. + */ + public static double getModificationRate() { + return modificationRate; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/BirdNest.java b/Server/src/main/java/Server/core/game/content/global/BirdNest.java new file mode 100644 index 000000000..b90e2112e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/BirdNest.java @@ -0,0 +1,176 @@ +package core.game.content.global; + +import core.tools.Items; +import core.game.node.entity.npc.drop.NPCDropTables; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +/** + * Represents a birds nest. + * @author Vexia + */ +public enum BirdNest { + SEED(new ChanceItem(5073, 1, 65), + new ChanceItem(Items.ACORN_5312, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.APPLE_TREE_SEED_5283, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.BANANA_TREE_SEED_5284, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.ORANGE_TREE_SEED_5285, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.WILLOW_SEED_5313, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.CURRY_TREE_SEED_5286, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.MAPLE_SEED_5314, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.PINEAPPLE_SEED_5287, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.PAPAYA_TREE_SEED_5288, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.PALM_TREE_SEED_5289, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.CALQUAT_TREE_SEED_5290, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3]), + new ChanceItem(Items.SPIRIT_SEED_5317, 1, NPCDropTables.DROP_RATES[3])), + RING(new ChanceItem(5074, 1, 30), + new ChanceItem(Items.GOLD_RING_1635, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.SAPPHIRE_RING_1637, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.EMERALD_RING_1639, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.RUBY_RING_1641, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.DIAMOND_RING_1643, 1, NPCDropTables.DROP_RATES[3])), + RED(new ChanceItem(5070, 1, 5), new ChanceItem(5076)), + GREEN(new ChanceItem(5071, 1, 5), new ChanceItem(5078)), + BLUE(new ChanceItem(5072, 1, 5), new ChanceItem(5077)), + RAVEN(new ChanceItem(11966, 1, 5), new ChanceItem(11964)), + + WYSON(new ChanceItem(7413, 1, 1), + new ChanceItem(Items.CABBAGE_SEED_5324, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.SWEETCORN_SEED_5320, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.TOMATO_SEED_5322, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.ONION_SEED_5319, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.POTATO_SEED_5318, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.LIMPWURT_SEED_5100, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.STRAWBERRY_SEED_5323, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.TOADFLAX_SEED_5296, 1, NPCDropTables.DROP_RATES[0]), + new ChanceItem(Items.WATERMELON_SEED_5321, 1, NPCDropTables.DROP_RATES[1]), + new ChanceItem(Items.RANARR_SEED_5295, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.MAPLE_SEED_5314, 1, NPCDropTables.DROP_RATES[2]), + new ChanceItem(Items.YEW_SEED_5315, 1, NPCDropTables.DROP_RATES[3]), + new ChanceItem(Items.MAGIC_SEED_5316, 1, NPCDropTables.DROP_RATES[3])); + + /** + * The random nest items. + */ + private static final ChanceItem[] NESTS = new ChanceItem[6]; + + /** + * The empty birds nest item. + */ + private static final Item EMPTY = new Item(5075); + + /** + * The birds nest item. + */ + private final ChanceItem nest; + + /** + * The loot item from the nest. + */ + private final ChanceItem[] loot; + + /** + * Constructs a new {@code BirdNest} {@code Object}. + * @param nest the nest. + * @param loot the loot. + */ + private BirdNest(final ChanceItem nest, final ChanceItem... loot) { + this.nest = nest; + this.loot = loot; + } + + /** + * Drops a birds nest. + * @param player the player. + */ + public static void drop(final Player player) { + final BirdNest nest = getRandomNest(false); + player.getAudioManager().send(1997); + GroundItemManager.create(nest.getNest(), player); + player.getPacketDispatch().sendMessage("A bird's nest falls out of the tree."); + } + + /** + * Searches a bird nest. + * @param player the player. + * @param item the item searched. + */ + public void search(final Player player, Item item) { + if (player.getInventory().freeSlots() < 1) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return; + } + final ChanceItem loot = ordinal() > 1 && this != WYSON ? getLoot()[0] : RandomFunction.getChanceItem(getLoot()); + final String name = loot.getName().toLowerCase(); + final String input = (StringUtils.isPlusN(name) ? "an" : "a") + " " + name; + player.lock(1); + player.getInventory().add(loot); + player.getInventory().replace(EMPTY, item.getSlot()); + player.getPacketDispatch().sendMessage("You take " + input + " out of the bird's nest."); + } + + /** + * Gets the random nest. + * @return the nest. + */ + public static BirdNest getRandomNest(boolean wyson) { + ChanceItem item = RandomFunction.getChanceItem(NESTS); + for (BirdNest n : BirdNest.values()) { + if (n.getNest() == item) { + if (wyson && n == SEED) { + return WYSON; + } else if (!wyson && n == WYSON) { + return SEED; + } + return n; + } + } + return null; + } + + /** + * Gets the nest by the id. + * @param nest the nest. + * @return the nest. + */ + public static BirdNest forNest(final Item nest) { + for (BirdNest n : values()) { + if (n.getNest().getId() == nest.getId()) { + return n; + } + } + return null; + } + + /** + * Gets the nest. + * @return The nest. + */ + public ChanceItem getNest() { + return nest; + } + + /** + * Gets the loot. + * @return The loot. + */ + public ChanceItem[] getLoot() { + return loot; + } + + /** + * static-block to add nests. + */ + static { + for (int i = 0; i < NESTS.length; i++) { + NESTS[i] = values()[i].getNest(); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/global/Bones.java b/Server/src/main/java/Server/core/game/content/global/Bones.java new file mode 100644 index 000000000..a86f1f71d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/Bones.java @@ -0,0 +1,152 @@ +package core.game.content.global; + +import core.game.node.item.Item; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Represents the type of bones. + * @author Apache Ah64 + */ +public enum Bones { + + BONES(2530, 4.5), + BONES_2(526,4.5), + WOLF_BONES(2859, 4.5), + BURNST_BONES(528, 4.5), + MONKEY_BONES(3183, 5), + MONKEY_BONES2(3179, 5), + BAT_BONES(530, 5.3), + BIG_BONES(532, 15), + JOGRE_BONES(3125, 15), + ZOGRE_BONES(4812, 12.5), + SHAIKAHAN_BONES(3123, 25), + BABY_DRAGON_BONES(534, 30), + WYVERN_BONES(6812, 50), + DRAGON_BONES(536, 72), + FAYRG(4830, 84), + RAURG_BONES(4832, 96), + DAGANNOTH(6729, 125), + OURG_BONES(4834, 140), + LAVA_DRAGON_BONES(14693, 85); + + /** + * Holds all bones. + */ + private static HashMap bones = new HashMap(); + + + /** + * The bone item id. + */ + private int itemId; + + /** + * The experience given by burying the bone. + */ + private double experience; + + /** + * Construct a new {@code Bones} {@code Object}. + * @param itemId The item id. + * @param experience The experience given by burying the bone. + */ + private Bones(int itemId, double experience) { + this.itemId = itemId; + this.experience = experience; + } + + /** + * Gets the bone meal item. + * @return the item. + */ + public Item getBoneMeal() { + return new Item(4255 + ordinal()); + } + + /** + * Get the bone experience given when you bury the bone. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + public int getItemId() { + return itemId; + } + + /** + * Gets the bones for the bone meal. + * @param itemId the item. + * @return the bones. + */ + public static Bones forBoneMeal(int itemId) { + for (Bones bone : Bones.values()) { + if (bone.getBoneMeal().getId() == itemId) { + return bone; + } + } + return null; + } + + /** + * Gets the config value for the bone. + * @param value the value. + * @param hopper hopper. + * @return {@code True} if so. + */ + public static Bones forConfigValue(int value, boolean hopper) { + for (Bones bone : Bones.values()) { + if (bone.getConfigValue(hopper) == value) { + return bone; + } + } + return null; + } + + /** + * Gets the config value for the bone type. + * @param hopper the hopper. + * @return the value. + */ + public int getConfigValue(boolean hopper) { + return (this == BONES_2 ? ordinal() : ordinal() - 1) | (hopper ? 4 : 8) << 16; + } + + /** + * Gets the bone ids. + * @return the ids. + */ + public static int[] getArray() { + List list = new ArrayList<>(); + for (int i : bones.keySet()) { + list.add(i); + } + int[] array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } + + /** + * Get the bone. + * @param itemId The item id. + * @return The bone. + */ + public static Bones forId(int itemId) { + return bones.get(itemId); + } + + /** + * Construct the bones. + */ + static { + for (Bones bone : Bones.values()) { + bones.put(bone.itemId, bone); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/BossKillCounter.java b/Server/src/main/java/Server/core/game/content/global/BossKillCounter.java new file mode 100644 index 000000000..49acae21f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/BossKillCounter.java @@ -0,0 +1,172 @@ +package core.game.content.global; + +import core.game.node.entity.player.Player; + +/** + * The BossKillcounter keeps track of the amount of bosses the player has slain. + * addtoKillcount(player, npcId) should be added in the finalizeDeath() method of the combat handler for the boss. + * @author Splinter + */ +public enum BossKillCounter { + + + /* ORDINAL BOUND */ + KING_BLACK_DRAGON(new int[] { 50 }, "King Black Dragon", 14649), + BORK(new int[] { 7133, 7134 }, "Bork", -1), + DAGANNOTH_SUPREME(new int[] { 2881 }, "Dagannoth Supreme", 14639), + DAGANNOTH_PRIME(new int[] { 2882 }, "Dagannoth Prime", 14640), + DAGANNOTH_REX(new int[] { 2883 }, "Dagannoth Rex", 14641), + CHAOS_ELEMENTAL(new int[] { 3200 }, "Chaos Elemental", 14638), + GIANT_MOLE(new int[] { 3340 }, "Giant Mole", 14642), + SARADOMIN(new int[] { 6247 }, "Commander Zilyana", 14647), + ZAMORAK(new int[] { 6203 }, "K'ril Tsutsaroth", 14648), + BANDOS(new int[] { 6260 }, "General Graardor", 14646), + ARMADYL(new int[] { 6222 }, "Kree'arra", 14645), + JAD(new int[] { 2745 }, "Tz-Tok Jad", 14828), + KALPHITE_QUEEN(new int[] { 1160 }, "Kalphite Queen", 14650), + CORPOREAL_BEAST(new int[] { 8133 }, "Corporeal Beast", 14653), + CALLISTO(new int[] { 8610 }, "Callisto", 14658), + SCORPIA(new int[] { 8611 }, "Scorpia", 14661), + VENENATIS(new int[] { 8612 }, "Venenatis", 14657), + VETION(new int[] { 8613 }, "Vet'ion", 14659), + KRAKEN(new int[] { 8614 }, "Cave Kraken", 14651), + + + ; + + /** + * The npcs that can increase the killcounter + */ + private final int[] npc; + + /** + * The name of the NPC, to be displayed as a sendMessage + */ + private final String name; + + /** + * The item ID of the pet relating to the boss. + */ + private final int petId; + + /** + * Constructs a new {@code BossKillCounter} {@code Object}. + * @param npc the npc. + * @param name the npc's string name + */ + BossKillCounter(final int[] npc, final String name, final int petId) { + this.npc = npc; + this.name = name; + this.petId = petId; + } + + /** + * Gets the npc. + * @return The npc. + */ + public int[] getNpc() { + return npc; + } + + /** + * Gets the NPC's name + * @return their name + */ + public String getName() { + return name; + } + + /** + * Gets the petId + * @return The petId + */ + public int getPetId() { + return petId; + } + + /** + * Gets the type for the npc. + * @param npc the npc. + * @return the BossKillcounter + */ + public static BossKillCounter forNPC(final int npc) { + for (BossKillCounter kc : BossKillCounter.values()) { + for (int i : kc.getNpc()) { + if (npc == i) { + return kc; + } + } + } + return null; + } + + /** + * Adds to the player's killcount for that particular boss. + * @param killer The player who killed the npc + * @param npcid the ID of the npc that just died + */ + public static void addtoKillcount(Player killer, int npcid) { + if (killer == null) { + return; + } + BossKillCounter boss = BossKillCounter.forNPC(npcid); + if (boss == null) { + return; + } + killer.getSavedData().getGlobalData().getBossCounters()[boss.ordinal()]++; + killer.getPacketDispatch().sendMessage("Your " + boss.getName() + " killcount is now: " + killer.getSavedData().getGlobalData().getBossCounters()[boss.ordinal()] + "."); +// addBossPet(killer, npcid, boss); + } + +// /** +// * Gives the player the pet if they killed a certain boss. +// * The chance by default is 1/5000. This rate lowers to 1/2200 if the for Boss Pets is active. +// * Note: Not all bosses have pet versions of themselves. +// */ +// private static void addBossPet(Player killer, int npcid, BossKillCounter boss){ +// if(boss.getPetId() == -1){ //The boss does not have a pet version. +// return; +// } +// int number = 5000; +// if (npcid == 2745) { +// number = 200; +// if (killer.getSlayer().getTask() == Tasks.JAD) { +// number = 100; +// } +// } else if (npcid == 3200) { +// number = 300; +// } +// int rand = number; +// if(rand == 10){ +// for (int i = 0; i < killer.getFamiliarManager().getInsuredPets().size(); i++) { +// if (killer.getFamiliarManager().getInsuredPets().get(i).getBabyItemId() == boss.getPetId()) { +// return; +// } +// } +// if(killer.getFamiliarManager().hasFamiliar() && killer.getInventory().freeSlots() < 1){ +// return; +// } +// if(!killer.getFamiliarManager().hasFamiliar()){ +// killer.getFamiliarManager().summon(new Item(boss.getPetId()), true); +// killer.sendNotificationMessage("You have a funny feeling like you're being followed."); +// } else if (killer.getInventory().freeSlots() > 0){ +// killer.getInventory().add(new Item(boss.getPetId(), 1)); +// killer.sendNotificationMessage("You feel something weird sneaking into your backpack."); +// } +// Repository.sendNews(killer.getUsername()+" now commands a miniature "+(boss.equals(CORPOREAL_BEAST) ? "Dark core" : boss.getName())+"!"); +// } +// } + + /** + * Increments the player's Barrows chest counter. + * @param player the player + */ + public static void addtoBarrowsCount(Player player) { + if (player == null) { + return; + } + player.getSavedData().getGlobalData().setBarrowsLoots(player.getSavedData().getGlobalData().getBarrowsLoots() + 1); + player.getPacketDispatch().sendMessage("Your Barrows chest count is: " + player.getSavedData().getGlobalData().getBarrowsLoots() + "."); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/Dyes.java b/Server/src/main/java/Server/core/game/content/global/Dyes.java new file mode 100644 index 000000000..63e47122c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/Dyes.java @@ -0,0 +1,54 @@ +package core.game.content.global; + +import core.game.node.item.Item; + +/** + * Represents a dye. + * @author Vexia + */ +public enum Dyes { + BLACK(new Item(4622)), + RED(new Item(1763)), + YELLOW(new Item(1765)), + BLUE(new Item(1767)), + ORANGE(new Item(1769)), + GREEN(new Item(1771)), + PURPLE(new Item(1773)), + PINK(new Item(6955)); + + /** + * The dye item. + */ + private final Item item; + + /** + * Constructs a new {@code Dyes} {@code Object}. + * @param item the item. + */ + Dyes(Item item) { + this.item = item; + } + + /** + * Gets the dye for the item. + * @param item the item. + * @return the dye. + */ + public static Dyes forItem(Item item) { + for (Dyes d : values()) { + if (d.getItem().getId() == item.getId()) { + return d; + } + } + return null; + } + + /** + * Gets the item. + * @return The item. + */ + public Item getItem() { + return item; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/global/EnchantedJewellery.java b/Server/src/main/java/Server/core/game/content/global/EnchantedJewellery.java new file mode 100644 index 000000000..880cbfb92 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/EnchantedJewellery.java @@ -0,0 +1,306 @@ +package core.game.content.global; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents an enchanted jewellery. + * @author Vexia + */ +public enum EnchantedJewellery { + RING_OF_SLAYING(new String[] { "Slayer Tower.", "Fremmenik Slayer Dungeon.", "Pollniveach Slayer Dungeon.", "Nowhere." }, new Location[] { Location.create(3429, 3533, 0), Location.create(2793, 3615, 0), Location.create(3313, 2960, 0) }, true, 13281, 13282, 13283, 13284, 13285, 13286, 13287, 13288), + RING_OF_DUELING(new String[] { "Al Kharid Duel Arena.", "Castle Wars Arena.", "Nowhere." }, new Location[] { Location.create(3314, 3235, 0), Location.create(2442, 3089, 0) }, true, 2552, 2554, 2556, 2558, 2560, 2562, 2564, 2566), + AMULET_OF_GLORY(new String[] { "Edgeville", "Karamja", "Draynor Village", "Al-Kharid", "Nowhere." }, new Location[] { Location.create(3087, 3495, 0), Location.create(2919, 3175, 0), Location.create(3104, 3249, 0), Location.create(3304, 3124, 0) }, 1712, 1710, 1708, 1706, 1704), + AMULET_OF_GLORY_T(new String[] { "Edgeville", "Karamja", "Draynor Village", "Al-Kharid", "Nowhere." }, new Location[] { Location.create(3087, 3495, 0), Location.create(2919, 3175, 0), Location.create(3081, 3250, 0), Location.create(3304, 3124, 0) }, 10354, 10356, 10358, 10360, 10362), + GAMES_NECKLACE(new String[] { "Burthorpe", "Barbarian Assault", "Clan Wars", "Bounty Hunter", "Corporeal Beast" }, new Location[] { Location.create(2899, 3563, 0), Location.create(2520, 3571, 0), Location.create(3266, 3686, 0), Location.create(3179, 3685, 0), Location.create(2885, 4372, 2) }, true, 3853, 3855, 3857, 3859, 3861, 3863, 3865, 3867), + DIGSITE_PENDANT(new String[] {}, new Location[] { Location.create(3342, 3445, 0) }, true, 11194, 11193, 11192, 11191, 11190), + COMBAT_BRACELET(new String[] { "Champions' Guild", "Monastery", "Ranging Guild", "Warriors' Guild", "Nowhere." }, new Location[] { Location.create(3191, 3365, 0), Location.create(3052, 3472, 0), Location.create(2657, 3439, 0), Location.create(2878, 3546, 0) }, 11118, 11120, 11122, 11124, 11126), + SKILLS_NECKLACE(new String[] { "Fishing Guild", "Mining Guild", "Crafting Guild", "Cooking Guild", "Nowhere." }, new Location[] { Location.create(2611, 3392, 0), Location.create(3016, 3338, 0), Location.create(2933, 3290, 0), Location.create(3143, 3442, 0) }, 11105, 11107, 11109, 11111, 11113), + RING_OF_WEALTH(new String[] {"Grand Exchange","Nowhere."}, new Location[] {Location.create(3163, 3464, 0)},14646,14644,14642,14640,14638); + + /** + * Represents the teleport animation. + */ + private static final Animation ANIMATION = new Animation(714); + + /** + * Represents the graphics to use. + */ + private static final Graphics GRAPHICS = new Graphics(308, 100, 50); + + /** + * Represents the charge numbers. + */ + private static final char[] NUMBERS = new char[] { '1', '2', '3', '4', '5', '6', '7', '8' }; + + /** + * Represents the teleport options. + */ + private final String[] options; + + /** + * Represents the locations. + */ + private final Location[] locations; + + /** + * Represents the ids of the jewellery. + */ + private final int[] ids; + + /** + * Represents if it crumbles away into nothing. + */ + private final boolean crumble; + + /** + * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. + * @param options the options. + * @param locations the locations. + * @parma crumble if it crumbles. + * @param ids the ids. + */ + EnchantedJewellery(final String[] options, final Location[] locations, final boolean crumble, final int... ids) { + this.options = options; + this.locations = locations; + this.ids = ids; + this.crumble = crumble; + } + + /** + * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. + * @param options the options. + * @param locations the locations. + * @param ids the ids. + */ + EnchantedJewellery(final String[] options, final Location[] locations, final int... ids) { + this(options, locations, false, ids); + } + + /** + * Method used to teleport the player to the desired location. + * @param player the player. + * @param item the item. + * @param index the index. + * @param operate If the player is operating. + */ + public void use(final Player player, final Item item, final int index, boolean operate) { + if ((index + 1) == getIds().length || item.getSlot() < 0) { + return; + } + if (index > getLocations().length - 1) { + return; + } + int itemIndex = getItemIndex(item); + Item replace = item; + if (!isLast(itemIndex)) { + if (!(isCrumble() && itemIndex == getIds().length - 1)) { + replace = getReplace(getNext(itemIndex)); + } + } else { + if (!isCrumble()) { + replace = getReplace(getIds()[getIds().length - 1]); + } + } + if (index > getLocations().length - 1) { + return; + } + if (!operate && !player.getInventory().containsItem(item)) { + player.sendMessage("Ooops, you don't have it anymore ;)"); + return; + } else if (operate && !player.getEquipment().containsItem(item)) { + player.sendMessage("Ooops, you don't have it anymore ;)"); + return; + } + if (teleport(player, itemIndex, replace, getLocation(index))) { + if (!isLast(itemIndex) && !(isCrumble() && itemIndex == getIds().length - 1)) { + if (operate) { + player.getEquipment().replace(replace, item.getSlot()); + } else { + player.getInventory().replace(replace, item.getSlot()); + } + } else { + if (isCrumble()) { + if (operate) { + player.getEquipment().replace(null, item.getSlot()); + } else { + if(item.getName().contains("slaying")){ + player.getInventory().replace(new Item(4155, 1), item.getSlot()); + player.sendMessage("Your Ring of Slaying reverts back into a regular enchanted gem."); + } else { + player.getInventory().replace(null, item.getSlot()); + } + } + } + } + if (getLocation(index).withinDistance(new Location(2657,3439,0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE,2,0); + } + } + } + + /** + * Method used to teleport to a location. + * @param player the player. + * @param itemIndex the old item index. + * @param item the item. + * @param location the location. + */ + private boolean teleport(final Player player, final int itemIndex, final Item item, final Location location) { + if (player.isTeleBlocked()) { + player.sendMessage("A magical force has stopped you from teleporting."); + return false; + } + if (!player.getZoneMonitor().teleport(1, item)) { + return false; + } + player.lock(); + player.visualize(ANIMATION, GRAPHICS); + player.getImpactHandler().setDisabledTicks(4); + GameWorld.getPulser().submit(new Pulse(4, player) { + @Override + public boolean pulse() { + player.unlock(); + player.getProperties().setTeleportLocation(location); + player.getAnimator().reset(); + return true; + } + }); + return true; + } + + /** + * Gets the charges of an item. + * @param item the item. + * @return the charges. + */ + public static String getCharges(Item item) { + String[] tokens = item.getName().replace("(t", "(").replace("(", " ").replace(")", "").split(" "); + return tokens[tokens.length - 1]; + } + + /** + * Gets the replacement item. + * @param id the id. + * @return the item. + */ + public Item getReplace(int id) { + return new Item(id); + } + + /** + * Gets the name. + * @param item the item. + * @return the name. + */ + public String getName(Item item) { + String name = item.getName().toLowerCase().replace("(t", "(").replace("(", "").replace(")", ""); + for (char number : NUMBERS) { + name = name.replace(number, '/'); + } + return name.trim().replace("/", ""); + } + + /** + * Gets the name type. + * @param item the item. + * @return + */ + public String getNameType(Item item) { + return this == GAMES_NECKLACE ? "games necklace" : this == DIGSITE_PENDANT ? "necklace" : this == COMBAT_BRACELET ? "bracelet" : this == SKILLS_NECKLACE ? "necklace" : item.getName().toLowerCase().split(" ")[0]; + } + + /** + * Checks if the index is last. + * @param index the index. + * @return {@code True} if so. + */ + public boolean isLast(int index) { + return !isCrumble() ? index == (ids.length - 1) : index == ids.length; + } + + /** + * Gets the next index. + * @param index the index. + * @return the new id + */ + public int getNext(int index) { + return ids[index + 1]; + } + + /** + * Gets the location. + * @param index the index. + * @return the location. + */ + public Location getLocation(int index) { + if (index > locations.length) { + index = locations.length - 1; + } + return locations[index]; + } + + /** + * Gets the options. + * @return The options. + */ + public String[] getOptions() { + return options; + } + + /** + * Gets the locations. + * @return The locations. + */ + public Location[] getLocations() { + return locations; + } + + /** + * Gets the ids. + * @return The ids. + */ + public int[] getIds() { + return ids; + } + + public boolean isCrumble() { + return crumble; + } + + /** + * Gets the enchanted jewellery. + * @param item the item. + * @return {@code EnchantedJewellery}. + */ + public static EnchantedJewellery forItem(final Item item) { + for (EnchantedJewellery jewellery : values()) { + for (int i : jewellery.getIds()) { + if (i == item.getId()) { + return jewellery; + } + } + } + return null; + } + + /** + * Gets the index. + * @param item the item. + * @return the item index. + */ + public int getItemIndex(Item item) { + for (int i = 0; i < getIds().length; i++) { + if (getIds()[i] == item.getId()) { + return i; + } + } + return -1; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/GodBook.java b/Server/src/main/java/Server/core/game/content/global/GodBook.java new file mode 100644 index 000000000..7198cf39c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/GodBook.java @@ -0,0 +1,243 @@ +package core.game.content.global; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * A god book. + * @author Vexia + */ +public enum GodBook { + HOLY_BOOK("Holy Book of Saradomin", new Item(3840), new Item(3839), new Item[] { new Item(1718) }, new Item(3827), new Item(3828), new Item(3829), new Item(3830)), BOOK_OF_BALANCE("Guthix's Book of Balance", new Item(3844), new Item(3843), new Item[] { new Item(1718), new Item(1724) }, new Item(3835), new Item(3836), new Item(3837), new Item(3838)), UNHOLY_BOOK("Unholy Book of Zamorak", new Item(3842), new Item(3841), new Item[] { new Item(1724) }, new Item(3831), new Item(3832), new Item(3833), new Item(3834)); + + /** + * The books name. + */ + private final String name; + + /** + * The god book. + */ + private final Item book; + + /** + * The damaged book. + */ + private final Item damagedBook; + + /** + * The items the book can bless. + */ + private final Item[] blessItems; + + /** + * The pages of items. + */ + private final Item[] pages; + + /** + * Constructs a new {@code GodBook} {@code Object} + * @param book the book. + * @param damagedBook the damged book. + * @param name the name of the book. + * @param pages the pages. + */ + private GodBook(String name, Item book, Item damagedBook, Item[] blessedItems, Item... pages) { + this.book = book; + this.damagedBook = damagedBook; + this.name = name; + this.blessItems = blessedItems; + this.pages = pages; + } + + /** + * Gets the god book for the item. + * @param item the item. + * @param damaged Flagged for the damaged book. + * @return {@code GodBook} the god book. + */ + public static GodBook forItem(Item item, boolean damaged) { + for (GodBook book : values()) { + if ((!damaged ? book.getBook().getId() : book.getDamagedBook().getId()) == item.getId()) { + return book; + } + } + return null; + } + + /** + * Checks if the player has this god book. + * @param player the player. + * @param both if we are checking for the damaged/good. + * @return {@code True} if so. + */ + public boolean hasGodBook(Player player, boolean both) { + return player.getInventory().containsItems(both ? new Item[] { book, damagedBook } : new Item[] { book }); + } + + /** + * Gets a good book based on the page id. + * @param page the page. + * @return the respective god book. + */ + public static GodBook forPage(Item page) { + for (GodBook book : values()) { + for (Item i : book.getPages()) { + if (i.getId() == page.getId()) { + return book; + } + } + } + return null; + } + + /** + * Inserts a page into the book. + * @param player the player. + * @param book the book. + * @param page the page. + */ + public void insertPage(Player player, Item book, Item page) { + if (hasPage(player, book, page)) { + player.sendMessage("The book already has that page."); + return; + } + if (player.getInventory().remove(new Item(page.getId(), 1))) { + setPageHash(player, book, getPageIndex(page)); + player.sendMessage("You add the page to the book..."); + if (isComplete(player, book)) { + player.getSavedData().getGlobalData().setGodPages(new boolean[4]); + player.getSavedData().getGlobalData().setGodBook(-1); + player.getInventory().replace(this.book, book.getSlot()); + player.getSavedData().getGlobalData().setGodBook(this); + player.sendMessage("The book is now complete!"); + String message = this == UNHOLY_BOOK ? "unholy symbols" : this == HOLY_BOOK ? "holy symbols" : "unblessed holy symbols"; + player.sendMessage("You can now use it to bless " + (message) + "!"); + } + } + } + + /** + * Checks if this item is a page of the book. + * @param asItem the item. + * @return {@code True} if so. + */ + public boolean isPage(Item asItem) { + for (Item item : pages) { + if (item.getId() == asItem.getId()) { + return true; + } + } + return false; + } + + /** + * Checks if a book is complete. + * @param book the book. + * @return {@code True} if so. + */ + public boolean isComplete(Player player, Item book) { + for (int i = 0; i < 4; i++) { + if (!hasPage(player, book, i + 1)) { + return false; + } + } + return true; + } + + /** + * Checks if there is a page in a book. + * @param book the book. + * @param page the page. + * @return {@code True} if so. + */ + public boolean hasPage(Player player, Item book, Item page) { + return hasPage(player, book, getPageIndex(page)); + } + + /** + * Sets a page hash. + * @param book the book. + * @param pageId the page Id. + */ + public void setPageHash(Player player, Item book, int pageId) { + // int hash = getHash(book); + // hash |= hash | (1 << pageId); + // book.setCharge(1000 + hash); + player.getSavedData().getGlobalData().getGodPages()[pageId - 1] = true; + } + + /** + * Checks if the book has a page. + * @param book the book. + * @param pageId the id of the page. + * @return {@code True} if so. + */ + public boolean hasPage(Player player, Item book, int pageId) { + // return (getHash(book) & (1 << pageId)) != 0; + return player.getSavedData().getGlobalData().getGodPages()[pageId - 1]; + } + + /** + * Gets the hash. + * @param book the book. + * @return the hash. + */ + public int getHash(Item book) { + return book.getCharge() - 1000; + } + + /** + * Gets the page index. + * @param page the page. + * @return the index. + */ + public int getPageIndex(Item page) { + for (int i = 0; i < pages.length; i++) { + if (pages[i].getId() == page.getId()) { + return i + 1; + } + } + return -1; + } + + /** + * Gets the name of the god book. + * @return the name. + */ + public String getName() { + return name; + } + + /** + * Gets the book. + * @return the book + */ + public Item getBook() { + return book; + } + + /** + * Gets the damagedBook. + * @return the damagedBook + */ + public Item getDamagedBook() { + return damagedBook; + } + + /** + * Gets the pages. + * @return the pages + */ + public Item[] getPages() { + return pages; + } + + /** + * Gets the blessItem. + * @return the blessItem + */ + public Item[] getBlessItem() { + return blessItems; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/GodType.java b/Server/src/main/java/Server/core/game/content/global/GodType.java new file mode 100644 index 000000000..5b6a49b40 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/GodType.java @@ -0,0 +1,235 @@ +package core.game.content.global; + +import core.game.content.dialogue.DialogueAction; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.tools.StringUtils; + +/** + * A god type. + * @author Vexia + */ +public enum GodType { + SARADOMIN(new Item(2412), new Item(2415), 2873, 913, "The cape disappears in a flash of light as it touches the ground."), GUTHIX(new Item(2413), new Item(2416), 2875, 914, "The cape disintegrates as it touches the earth."), ZAMORAK(new Item(2414), new Item(2417), 2874, 912, "The cape ignites and burns up as it touches the ground."); + + /** + * The cape. + */ + private final Item cape; + + /** + * The staff. + */ + private final Item staff; + + /** + * The statue id. + */ + private final int statueId; + + /** + * The npc id. + */ + private final int npcId; + + /** + * The drop message. + */ + private final String dropMessage; + + /** + * Constructs a new {@code GodCape} {@code Object}. + * @param cape the cape. + * @param staff the staff. + * @param statueId the id. + */ + private GodType(Item cape, Item staff, int statueId, int npcId, String dropMessage) { + this.cape = cape; + this.staff = staff; + this.statueId = statueId; + this.npcId = npcId; + this.dropMessage = dropMessage; + } + + /** + * Prays at a statue. + * @param player the player. + * @param statue the statue. + */ + public void pray(final Player player, final GameObject statue) { + if (hasAny(player)) { + player.lock(3); + player.animate(Animation.create(645)); + player.sendMessages("You kneel and begin to chant to " + getName() + "...", "...but there is no response."); + return; + } + player.getDialogueInterpreter().sendDialogue("You kneel and begin to chant to " + getName() + "..."); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(final Player player, int buttonId) { + player.lock(); + player.animate(Animation.create(645)); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + Location loc = statue.getLocation().transform(0, -1, 0); + GroundItem g = GroundItemManager.get(cape.getId(), loc, player); + if (g == null) { + GroundItemManager.create(cape, loc, player); + } + player.getPacketDispatch().sendPositionedGraphic(86, 0, 0, loc); + player.unlock(); + return true; + } + }); + } + + }); + } + + /** + * Gets the god type by the statue id. + * @param object the object. + * @return the type. + */ + public static GodType forObject(int object) { + for (GodType type : values()) { + if (type.getStatueId() == object) { + return type; + } + } + return null; + } + + /** + * Checks if they have a god cape & which one. + * @param player the player. + * @param invyOnly if invy check only. + * @return {@code GodCape} the cape. + */ + public static GodType getCape(Player player, boolean invyOnly) { + for (GodType cape : values()) { + if (invyOnly ? player.getInventory().containsItems(cape.getCape()) : (player.getEquipment().containsItem(cape.getCape()) || player.getInventory().containsItems(cape.getCape()))) { + return cape; + } + } + return null; + } + + /** + * Checks if they have a god cape. + * @param player the player. + * @return the cape. + */ + public static GodType getCape(Player player) { + return getCape(player, false); + } + + /** + * Gets a god cape type by the id. + * @param cape the cape. + * @return the cape. + */ + public static GodType forCape(final Item cape) { + for (GodType g : values()) { + if (g.getCape().getId() == cape.getId()) { + return g; + } + } + return null; + } + + /** + * Checks if the player is friendly. + * @param player the player. + * @return {@code True} if so. + */ + public boolean isFriendly(Player player) { + return player.getEquipment().containsItem(cape); + } + + /** + * Gets the mage type. + * @param id the id. + * @return te type. + */ + public static GodType forId(int id) { + for (GodType type : values()) { + if (type.getNpcId() == id) { + return type; + } + } + return null; + } + + /** + * Checks if the player has any capes. + * @param player the player. + * @return {@code True} if so. + */ + public static boolean hasAny(Player player) { + for (GodType t : values()) { + if (player.hasItem(t.getCape())) { + return true; + } + } + return false; + } + + /** + * Gets the cape. + * @return The cape. + */ + public Item getCape() { + return cape; + } + + /** + * Gets the staff. + * @return The staff. + */ + public Item getStaff() { + return staff; + } + + /** + * Gets the statueId. + * @return The statueId. + */ + public int getStatueId() { + return statueId; + } + + /** + * Gets the dropMessage. + * @return The dropMessage. + */ + public String getDropMessage() { + return dropMessage; + } + + /** + * Gets the npcId. + * @return The npcId. + */ + public int getNpcId() { + return npcId; + } + + /** + * Gets the name. + * @return the name. + */ + public String getName() { + return StringUtils.formatDisplayName(name().toLowerCase()); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/global/Lamps.java b/Server/src/main/java/Server/core/game/content/global/Lamps.java new file mode 100644 index 000000000..4abba5531 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/Lamps.java @@ -0,0 +1,111 @@ +package core.game.content.global; + +import core.game.node.item.Item; + +/** + * Represents an experience lamp. + * @author Vexia + */ +public enum Lamps { + GENIE_LAMP(new Item(2528), 10), + STRONGHOLD_LAMP(new Item(4447), 500), + + K_ACHIEVEMENT_1(new Item(11137), 1000, 30), + K_ACHIEVEMENT_2(new Item(11139), 5000, 40), + K_ACHIEVEMENT_3(new Item(11141), 10000, 50), + + V_ACHIEVEMENT_1(new Item(11753), 1000, 30), + V_ACHIEVEMENT_2(new Item(11754), 5000, 40), + V_ACHIEVEMENT_3(new Item(11755), 10000, 50), + + L_ACHIEVEMENT_1(new Item(11185), 500, 1), + L_ACHIEVEMENT_2(new Item(11186), 1000, 30), + L_ACHIEVEMENT_3(new Item(11187), 1500, 35), + + FALLY_ACHIEVEMENT_1(new Item(14580), 1000, 30), + FALLY_ACHIEVEMENT_2(new Item(14581), 5000, 40), + FALLY_ACHIEVEMENT_3(new Item(14582), 10000, 50), + + FREM_ACHIEVEMENT_1(new Item(14574), 5000, 30), + FREM_ACHIEVEMENT_2(new Item(14575), 10000, 40), + FREM_ACHIEVEMENT_3(new Item(14576), 15000, 50), + + SEERS_ACHIEVEMENT_1(new Item(14633), 1000, 30), + SEERS_ACHIEVEMENT_2(new Item(14634), 5000, 40), + SEERS_ACHIEVEMENT_3(new Item(14635), 10000, 50); + + /** + * The item id. + */ + private final Item item; + + /** + * The experience gained. + */ + private final int experience; + + /** + * The level requirement. + */ + private final int levelRequirement; + + /** + * Constructs a new {@code Lamps} {@code Object} + * @param item the item. + * @param experience the exp. + * @param levelRequirement the level requirement to meet. + */ + Lamps(Item item, int experience, int levelRequirement) { + this.item = item; + this.experience = experience; + this.levelRequirement = levelRequirement; + } + + /** + * Constructs a new {@code Lamps} {@code Object} + * @param item the item. + * @param experience the exp. + */ + Lamps(Item item, int experience) { + this(item, experience, 0); + } + + /** + * Gets the lamp by the item. + * @param item the item. + * @return the lamp. + */ + public static Lamps forItem(Item item) { + for (Lamps l : values()) { + if (l.getItem().getId() == item.getId()) { + return l; + } + } + return null; + } + + /** + * Gets the item. + * @return the item + */ + public Item getItem() { + return item; + } + + /** + * Gets the mod. + * @return the mod + */ + public int getExp() { + return experience; + } + + /** + * Gets the levelRequirement. + * @return the levelRequirement + */ + public int getLevelRequirement() { + return levelRequirement; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/global/LightSource.java b/Server/src/main/java/Server/core/game/content/global/LightSource.java new file mode 100644 index 000000000..5db547637 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/LightSource.java @@ -0,0 +1,201 @@ +package core.game.content.global; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +import static core.tools.Interfaces.*; +import static core.tools.Items.*; + +/** + * Represents a light source. + * @author Vexia + * @author Emperor + */ +public enum LightSource { + CANDLE(1, new Item(CANDLE_36, 1), new Item(LIT_CANDLE_33, 1), true, DARKNESS_MEDIUM_98), + BLACK_CANDLE(1, new Item(BLACK_CANDLE_38, 1), new Item(LIT_BLACK_CANDLE_32, 1), true, DARKNESS_MEDIUM_98), + TORCH(1, new Item(UNLIT_TORCH_596, 1), new Item(LIT_TORCH_594, 1), true, DARKNESS_MEDIUM_98), + CANDLE_LANTERN(4, new Item(CANDLE_LANTERN_4527, 1), new Item(CANDLE_LANTERN_4531, 1), false, DARKNESS_MEDIUM_98), + OIL_LAMP(12, new Item(OIL_LAMP_4522, 1), new Item(OIL_LAMP_4524, 1), true, DARKNESS_LIGHT_97), + OIL_LANTERN(26, new Item(OIL_LANTERN_4535, 1), new Item(OIL_LANTERN_4539, 1), false, DARKNESS_LIGHT_97), + BULLSEYE_LANTERN(49, new Item(BULLSEYE_LANTERN_4548, 1), new Item(BULLSEYE_LANTERN_4550, 1), false, -1), + SAPPHIRE_LANTERN(49, new Item(SAPPHIRE_LANTERN_4701, 1), new Item(SAPPHIRE_LANTERN_4702, 1), false, -1), + EMERALD_LANTERN(49, new Item(EMERALD_LANTERN_9064, 1), new Item(EMERALD_LANTERN_9065, 1), false, -1), + MINING_HELMET(65, new Item(MINING_HELMET_5014, 1), new Item(MINING_HELMET_5013, 1), false, DARKNESS_LIGHT_97); + + /** + * Represents the level required. + */ + private int level; + + /** + * Represents the raw item. + */ + private Item raw; + + /** + * Represents the product. + */ + private Item product; + + /** + * If the light source is open (eg. candles, torches, ...). + */ + private final boolean open; + + /** + * The interface id. + */ + private final int interfaceId; + + /** + * Constructs a new {@code LightSource} {@code Object}. + * @param level the level. + * @param raw the raw. + * @param product the product. + * @param open If it's an open light source. + * @param interfaceId The overlay interface id to display. + */ + LightSource(int level, Item raw, Item product, boolean open, int interfaceId) { + this.level = level; + this.raw = raw; + this.product = product; + this.open = open; + this.interfaceId = interfaceId; + } + + /** + * Checks if the player has a lit light source. + * @param player The player. + * @return {@code True} if so. + */ + public static boolean hasActiveLightSource(Player player) { + return getActiveLightSource(player) != null; + } + + /** + * Gets the light source used by the player. + * @param player The player. + * @return The light source object, or null if the player didn't have any + * light source. + */ + public static LightSource getActiveLightSource(Player player) { + LightSource source; + for (Item item : player.getInventory().toArray()) { + if (item != null && (source = forProductId(item.getId())) != null) { + return source; + } + } + for (Item item : player.getEquipment().toArray()) { + if (item != null && (source = forProductId(item.getId())) != null) { + return source; + } + } + return null; + } + + /** + * Gets the light source by the id. + * @param id the id. + * @return the source. + */ + public static LightSource forId(int id) { + for (LightSource light : LightSource.values()) { + if (light.raw.getId() == id) { + return light; + } + } + return null; + } + + /** + * Gets the light souce by the product id. + * @param id the id. + * @return the light source. + */ + public static LightSource forProductId(int id) { + for (LightSource light : LightSource.values()) { + if (light.product.getId() == id) { + return light; + } + } + return null; + } + + /** + * Gets the strength of the light source (1=dim, 2=medium, 3=bright). + * @return The strength. + */ + public int getStrength() { + switch (interfaceId) { + case DARKNESS_LIGHT_97: + return 1; + case DARKNESS_MEDIUM_98: + return 2; + case -1: + return 3; + } + return 0; + } + + /** + * Gets the name of the light source. + * @return The name. + */ + public String getName() { + return super.name().toLowerCase().replaceAll("_", " "); + } + + /** + * Gets the raw item. + * @return the raw. + */ + public Item getRaw() { + return raw; + } + + /** + * Gets the product. + * @return the product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the level. + * @return the level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the open. + * @return The open. + */ + public boolean isOpen() { + return open; + } + + /** + * Gets the interfaceId. + * @return The interfaceId. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Gets the ids of the raw items. + * @return The raw item ids. + */ + public static int[] getRawIds() { + int array[] = new int[LightSource.values().length]; + for (int i = 0; i < LightSource.values().length -1; i++) { + array[i] = LightSource.values()[i].getRaw().getId(); + } + return array; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/RepairItem.java b/Server/src/main/java/Server/core/game/content/global/RepairItem.java new file mode 100644 index 000000000..00ebd7a36 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/RepairItem.java @@ -0,0 +1,87 @@ +package core.game.content.global; + +import core.game.node.item.Item; + +/** + * Represents the repair item type. + * @author Vexia + */ +public enum RepairItem { + BRONZE_HATCHET(new Item(494, 1), new Item(1351, 1), 0), + BRONZE_PICKAXE(new Item(468, 1), new Item(1265, 1), 0), + IRON_HATCHET(new Item(496, 1), new Item(1349, 1), 0), + IRON_PICKAXE(new Item(470, 1), new Item(1267, 1), 0), + STEEL_HATCHET(new Item(498, 1), new Item(1353, 1), 0), + STEEL_PICKAXE(new Item(472, 1), new Item(1269, 1), 14), + BLACK_HATCHET(new Item(500, 1), new Item(1361, 1), 10), + MITHRIL_HATCHET(new Item(502, 1), new Item(1355, 1), 18), + MITHRIL_PICKAXE(new Item(474, 1), new Item(1273, 1), 43), + ADAMANT_HATCHET(new Item(504, 1), new Item(1357, 1), 43), + ADAMANT_PICKAXE(new Item(476, 1), new Item(1271, 1), 107), + RUNE_HATCHET(new Item(506, 1), new Item(1359, 1), 427), + RUNE_PICKAXE(new Item(478, 1), new Item(1275, 1), 1100), + DRAGON_HATCHET(new Item(6741, 1), new Item(6739, 1), 1800); + + /** + * The item id. + */ + private final Item item; + + /** + * The product item. + */ + private final Item product; + + /** + * The cost of the money to repair. + */ + private final int cost; + + /** + * Constructs a new {@code BobRepairItem} {@code Object}. + * @param item the item. + * @param product the product. + * @param cost the cost. + */ + RepairItem(Item item, Item product, int cost) { + this.item = item; + this.product = product; + this.cost = cost; + } + + /** + * Gets the item. + * @return The item. + */ + public Item getItem() { + return item; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the cost. + * @return The cost. + */ + public int getCost() { + return cost; + } + + /** + * Gets the reapir item by the id. + * @param id the id. + * @return the repair item. + */ + public static RepairItem forId(int id) { + for (RepairItem item : RepairItem.values()) + if (item.item.getId() == id) + return item; + return null; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/Skillcape.java b/Server/src/main/java/Server/core/game/content/global/Skillcape.java new file mode 100644 index 000000000..0b335eeec --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/Skillcape.java @@ -0,0 +1,112 @@ +package core.game.content.global; + +import core.game.container.Container; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a utility class for purchasing skillcapes. + * @author Vexia + */ +public final class Skillcape { + + /** + * Represents the amount needed to purchase a cape. + */ + private static final Item COINS = new Item(995, 99000); + + /** + * Represents the skillcapes to purchase. + */ + public static final int[] SKILLCAPES = { 9747, 9753, 9750, 9768, 9756, 9759, 9762, 9801, 9807, 9783, 9798, 9804, 9780, 9795, 9792, 9774, 9771, 9777, 9786, 9810, 9765, 9948, 9789, 12169 }; + + /** + * Method used to purchase a cape of accomplisment. + * @param player the player. + * @param skill the skill. + * @return {@code True} if purchased. + */ + public static boolean purchase(final Player player, final int skill) { + if (!isMaster(player, skill)) { + return false; + } + if (player.getInventory().freeSlots() < 2) { + player.getDialogueInterpreter().sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't seem to have inventory space."); + return false; + } + if (!player.getInventory().containsItem(COINS)) { + player.getDialogueInterpreter().sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't seem to have enough coins with", "me at this time."); + return false; + } + if (player.getInventory().remove(COINS)) { + return player.getInventory().add(getItems(player, skill)); + } else { + return false; + } + } + + /** + * Method used to trim the players skillcapes. + * @param player the player. + */ + public static void trim(final Player player) { + final Container[] containers = new Container[] { player.getInventory(), player.getEquipment(), player.getBank() }; + int skill = -1; + for (Container container : containers) { + for (Item item : container.toArray()) { + if (item == null || item.getId() < 9700) { + continue; + } + skill = getCapeIndex(item); + if (skill != -1) { + container.replace(new Item(getTrimmed(skill).getId(), item.getAmount()), item.getSlot()); + skill = -1; + } + } + } + } + + /** + * Checks if the player has the appropriate level. + * @param player the player. + * @param skill the skill. + * @return {@code True} if so. + */ + public static boolean isMaster(final Player player, final int skill) { + return player.getSkills().getStaticLevel(skill) == 99; + } + + /** + * Gets the items to purchase. + * @param player the player. + * @param skill the skill. + * @return {@code Items} to buy. + */ + public static Item[] getItems(final Player player, final int skill) { + return new Item[] { new Item(SKILLCAPES[skill] + (player.getSkills().getMasteredSkills() > 1 ? 1 : 0)), new Item(SKILLCAPES[skill] + 2) }; + } + + /** + * Gets the trimmed item. + * @param skill the skill. + * @return the trimmed cape. + */ + public static Item getTrimmed(final int skill) { + return new Item(SKILLCAPES[skill] + 1); + } + + /** + * Gets the cape index by the item. + * @param item the item. + * @return the skill index, if not (-1). + */ + public static int getCapeIndex(final Item item) { + for (int i = 0; i < SKILLCAPES.length; i++) { + if (SKILLCAPES[i] == item.getId()) { + return i; + } + } + return -1; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/SkillcapePerks.java b/Server/src/main/java/Server/core/game/content/global/SkillcapePerks.java new file mode 100644 index 000000000..25bb0b3f9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/SkillcapePerks.java @@ -0,0 +1,59 @@ +package core.game.content.global; + +/** + * Handles the skillcape perks. + * @author Empathy + * + */ +public enum SkillcapePerks { + + ATTACK(9747, 9748), + STRENGTH(9750, 9751), + DEFENCE(9753, 9754), + RANGING(9756, 9757), + PRAYER(9759, 9760), + MAGIC(9762, 9763), + RUNECRAFTING(9765, 9766), + HITPOINTS(9768, 9769), + AGILITY(9771, 9772), + HERBLORE(9774, 9775), + THIEVEING(9777, 9778), + CRAFTING(9780, 9781), + FLETCHING(9783, 9784), + SLAYER(9786, 9787), + CONSTRUCTION(9789, 9790), + MINING(9792, 9793), + SMITHING(9795, 9796), + FISHING(9798, 9799), + COOKING(9801, 9802), + FIREMAKING(9804, 9805), + WOODCUTTING(9807, 9808), + FARMING(9810, 9811), + HUNTING(9948, 9949), + SUMMONING(12169,12170), + MAX_CAPE(14831, 14833, 14835, 14839, 14840) + ; + + /** + * The skillcape Ids. + */ + private final int[] skillcapeIds; + + + /** + * + * Constructs a new {@code SkillcapePerks} object. + * @param skillcapeIds + */ + SkillcapePerks(int... skillcapeIds) { + this.skillcapeIds = skillcapeIds; + } + + /** + * The skillcapeIds. + * @return the skillcape ids. + */ + public int[] getSkillcapeIds() { + return skillcapeIds; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/SkillingPets.java b/Server/src/main/java/Server/core/game/content/global/SkillingPets.java new file mode 100644 index 000000000..efd9e8a21 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/SkillingPets.java @@ -0,0 +1,103 @@ +package core.game.content.global; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.repository.Repository; + +/** + * Represents the skilling pets obtained randomly. + * @author Empathy + * + */ +public enum SkillingPets { + + BABY_RED_CHINCHOMPA(new Item(14823), "Baby Chinchompa", Skills.HUNTER), + BABY_GREY_CHINCHOMPA(new Item(14824), "Baby Chinchompa", Skills.HUNTER), + BEAVER(new Item(14821), "Beaver", Skills.WOODCUTTING), + GOLEM(new Item(14822), "Rock Golem", Skills.MINING), + HERON(new Item(14827), "Heron", Skills.FISHING); + + /** + * The pet item drop. + */ + private final Item pet; + + /** + * The name. + */ + private final String name; + + /** + * The skill. + */ + private final int skill; + + /** + * Constructs a new {@code SkillingPets} object. + * @param skill The skill id. + * @param pet The pet item. + */ + SkillingPets(Item pet, String name, int skill) { + this.pet = pet; + this.name = name; + this.skill = skill; + } + + /** + * Checks the pet drop. + * @param player The player. + * @param pet The pet drop to check. + */ + public static void checkPetDrop(Player player, SkillingPets pet) { + if (pet == null) { + return; + } + int defaultChance = 15000; + int newChance = (defaultChance / player.getSkills().getStaticLevel(pet.getSkill()) * 55); + int outOf = (newChance > defaultChance ? defaultChance : newChance); + int getChance = outOf; + if (getChance != 1) { + return; + } + if (player.hasItem(pet.getPet())) { + return; + } + if (player.getFamiliarManager().hasFamiliar() && player.getInventory().isFull()) { + return; + } + if (player.getFamiliarManager().hasFamiliar()) { + if (player.getFamiliarManager().getFamiliar().getName().equalsIgnoreCase(pet.getName())) { + return; + } + player.getInventory().add(pet.getPet()); + player.sendNotificationMessage("You feel something weird sneaking into your backpack."); + } else { + player.getFamiliarManager().summon(pet.getPet(), true); + player.sendNotificationMessage("You have a funny feeling like you're being followed."); + } + Repository.sendNews(player.getUsername() + " has found a " + pet.getPet().getName() + "!"); + } + + + /** + * @return the pet + */ + public Item getPet() { + return pet; + } + + /** + * @return the pet name. + */ + public String getName() { + return name; + } + + /** + * @return the skill. + */ + public int getSkill() { + return skill; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/action/ClimbActionHandler.java b/Server/src/main/java/Server/core/game/content/global/action/ClimbActionHandler.java new file mode 100644 index 000000000..d9f8e914f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/action/ClimbActionHandler.java @@ -0,0 +1,394 @@ +package core.game.content.global.action; + +import core.game.container.impl.EquipmentContainer; +import core.tools.Items; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.system.SystemLogger; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; + +/** + * Handles a ladder climbing reward. + * @author Emperor + */ +public final class ClimbActionHandler { + + /** + * Represents the climb up animation of ladders. + */ + public static final Animation CLIMB_UP = new Animation(828); + + /** + * Represents the climb down animation of ladders. + */ + public static final Animation CLIMB_DOWN = new Animation(827); + + /** + * The climb dialogue. + */ + public static DialoguePlugin CLIMB_DIALOGUE = new ClimbDialogue(); + + /** + * Handles the climbing of a rope. + * + * @param player The player. + * @param object The rope object. + * @param option The option. + */ + public static void climbRope(Player player, GameObject object, String option) { + + } + + /** + * Handles the climbing of a trap door. + * + * @param player The player. + * @param object The trap door object. + * @param option The option. + */ + public static void climbTrapdoor(Player player, GameObject object, String option) { + + } + + /** + * Handles the climbing of a ladder. + * + * @param player The player. + * @param startLadder The game object. + * @param option The option. + * @return True if successfully climbed + */ + public static boolean climbLadder(Player player, GameObject startLadder, String option) { + GameObject endLadder = null; + Animation animation = CLIMB_UP; + if (startLadder.getName().startsWith("Stair")) { + animation = null; + } + if (SpecialLadders.getDestination(startLadder.getLocation()) != null) { + Location destination = SpecialLadders.getDestination(startLadder.getLocation()); + climb(player, animation, destination); + SpecialLadders.getSpecialLadder(startLadder.getLocation()).checkAchievement(player); + return true; + } + switch (option) { + case "climb-up": + endLadder = getLadder(startLadder, false); + break; + case "climb-down": + if (startLadder.getName().equals("Trapdoor")) { + animation = CLIMB_DOWN; + } + endLadder = getLadder(startLadder, true); + break; + case "climb": + GameObject upperLadder = getLadder(startLadder, false); + GameObject downLadder = getLadder(startLadder, true); + if (upperLadder == null && downLadder != null) { + return climbLadder(player, startLadder, "climb-down"); + } + if (upperLadder != null && downLadder == null) { + return climbLadder(player, startLadder, "climb-up"); + } + DialoguePlugin dialogue = CLIMB_DIALOGUE.newInstance(player); + if (dialogue != null && dialogue.open(startLadder)) { + player.getDialogueInterpreter().setDialogue(dialogue); + } + return false; + } + Location destination = endLadder != null ? getDestination(endLadder) : null; + if (endLadder == null || destination == null) { + player.getPacketDispatch().sendMessage("The ladder doesn't seem to lead anywhere."); + return false; + } + climb(player, animation, destination); + return true; + } + + /** + * Gets the teleport destination. + * + * @param object The object to teleport to. + * @return The teleport destination. + */ + public static Location getDestination(GameObject object) { + int sizeX = object.getDefinition().sizeX; + int sizeY = object.getDefinition().sizeY; + if (object.getRotation() % 2 != 0) { + int switcher = sizeX; + sizeX = sizeY; + sizeY = switcher; + } + Direction dir = Direction.forWalkFlag(object.getDefinition().getWalkingFlag(), object.getRotation()); + if (dir != null) { + return getDestination(object, sizeX, sizeY, dir, 0); + } + switch (object.getRotation()) { + case 0: + return getDestination(object, sizeX, sizeY, Direction.SOUTH, 0); + case 1: + return getDestination(object, sizeX, sizeY, Direction.EAST, 0); + case 2: + return getDestination(object, sizeX, sizeY, Direction.NORTH, 0); + case 3: + return getDestination(object, sizeX, sizeY, Direction.WEST, 0); + } + return null; + } + + /** + * Gets the destination for the given object. + * + * @param object The object. + * @param dir The preferred direction from the object. + * @return The teleporting destination. + */ + private static Location getDestination(GameObject object, int sizeX, int sizeY, Direction dir, int count) { + Location loc = object.getLocation(); + if (dir.toInteger() % 2 != 0) { + int x = dir.getStepX(); + if (x > 0) { + x *= sizeX; + } + for (int y = 0; y < sizeY; y++) { + Location l = loc.transform(x, y, 0); + if (RegionManager.isTeleportPermitted(l) && dir.canMove(l)) { + return l; + } + } + } else { + int y = dir.getStepY(); + if (y > 0) { + y *= sizeY; + } + for (int x = 0; x < sizeX; x++) { + Location l = loc.transform(x, y, 0); + if (RegionManager.isTeleportPermitted(l) && dir.canMove(l)) { + return l; + } + } + } + if (count == 3) { + return null; + } + return getDestination(object, sizeX, sizeY, Direction.get((dir.toInteger() + 1) % 4), count + 1); + } + + /** + * Executes the climbing reward. + * + * @param player The player. + * @param animation The climbing animation. + * @param destination The destination. + */ + public static void climb(final Player player, Animation animation, final Location destination, final String... messages) { + player.lock(2); + player.animate(animation); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + player.getProperties().setTeleportLocation(destination); + for (String message : messages) { + player.getPacketDispatch().sendMessage(message); + } + + // Achievement Diary Handlers + // falador climb to top of white knight's castle + player.debug(destination.toString()); + if ((destination.equals(2959, 3338, 3) || destination.equals(2983, 3350, 3) || destination.equals(2995, 3341, 3))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 0, 3); + } + // falador dark wizards tower proselyte + if (destination.equals(2908, 3336, 2) + && player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == Items.PROSELYTE_SALLET_9672 + && player.getEquipment().get(EquipmentContainer.SLOT_CHEST).getId() == Items.PROSELYTE_HAUBERK_9674 + && player.getEquipment().get(EquipmentContainer.SLOT_LEGS).getId() == Items.PROSELYTE_CUISSE_9676) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 2, 0); + } + // falador enter the mining guild + if (destination.equals(3021, 9739, 0)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 2, 6); + } + + // Climb to the highest point in Lumbridge + if (destination.equals(3207, 3222, 3)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 0); + } + + // Climb to the top of the Wizards' Tower + if (destination.equals(3104, 3161, 2)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 11); + } + + // Enter Edgeville Dungeon using the entrance to the south of

Edgeville + if (destination.equals(3096, 9867, 0)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 10); + } + + // Find the highest point in Varrock + if (destination.equals(3206, 3497, 3) || destination.equals(3223, 3472, 3) || destination.equals(3258, 3486, 3)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 18); + } + + return true; + } + }); + } + + /** + * Gets the ladder the object leads to. + * + * @param object The ladder object. + * @param down If the player is going down a floor. + * @return The ladder the current ladder object leads to. + */ + private static GameObject getLadder(GameObject object, boolean down) { + int mod = down ? -1 : 1; + GameObject ladder = RegionManager.getObject(object.getLocation().transform(0, 0, mod)); + if (ladder == null || !isLadder(ladder)) { + if (ladder != null && ladder.getName().equals(object.getName())) { + ladder = RegionManager.getObject(ladder.getLocation().transform(0, 0, mod)); + if (ladder != null) { + return ladder; + } + } + ladder = findLadder(object.getLocation().transform(0, 0, mod)); + if (ladder == null) { + ladder = RegionManager.getObject(object.getLocation().transform(0, mod * -6400, 0)); + if (ladder == null) { + ladder = findLadder(object.getLocation().transform(0, mod * -6400, 0)); + } + } + } + return ladder; + } + + /** + * Finds a ladder (by searching a 10x10 area around the given location). + * + * @param l The location. + * @return The ladder. + */ + private static GameObject findLadder(Location l) { + for (int x = -5; x < 6; x++) { + for (int y = -5; y < 6; y++) { + GameObject object = RegionManager.getObject(l.transform(x, y, 0)); + if (object != null && isLadder(object)) { + return object; + } + } + } + return null; + } + + /** + * Checks if the object is a ladder. + * + * @param object The object. + * @return {@code True} if so. + */ + private static boolean isLadder(GameObject object) { + for (String option : object.getDefinition().getOptions()) { + if (option != null && (option.contains("Climb"))) { + return true; + } + } + return object.getName().equals("Trapdoor"); + } + + /** + * Represents the dialogue plugin used for climbing stairs or a ladder. + * + * @author 'Vexia + * @version 1.0 + */ + static final class ClimbDialogue extends DialoguePlugin { + + /** + * Represents the climbing dialogue id. + */ + public static final int ID = 8 << 16; + + /** + * Constructs a new {@code ClimbDialogue} {@code Object}. + */ + public ClimbDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ClimbDialogue} {@code Object}. + * + * @param player the player. + */ + public ClimbDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ClimbDialogue(player); + } + + /** + * Represents the object to use. + */ + private GameObject object; + + @Override + public boolean open(Object... args) { + object = (GameObject) args[0]; + interpreter.sendOptions("What would you like to do?", "Climb Up.", "Climb Down."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player.lock(1); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + climbLadder(player, object, "climb-up"); + return true; + } + }); + end(); + break; + case 2: + player.lock(1); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + climbLadder(player, object, "climb-down"); + return true; + } + }); + end(); + break; + + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{ID}; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/action/DigAction.java b/Server/src/main/java/Server/core/game/content/global/action/DigAction.java new file mode 100644 index 000000000..7a49b68f7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/action/DigAction.java @@ -0,0 +1,17 @@ +package core.game.content.global.action; + +import core.game.node.entity.player.Player; + +/** + * Handles a digging reward. + * @author Emperor + */ +public interface DigAction { + + /** + * Runs the digging reward. + * @param player The player. + */ + void run(Player player); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/action/DigSpadeHandler.java b/Server/src/main/java/Server/core/game/content/global/action/DigSpadeHandler.java new file mode 100644 index 000000000..b525d9a27 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/action/DigSpadeHandler.java @@ -0,0 +1,65 @@ +package core.game.content.global.action; + +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +import java.util.HashMap; +import java.util.Map; + +/** + * Handles digging with a spade. + * @author Emperor + */ +public final class DigSpadeHandler { + + /** + * The digging actions. + */ + private static final Map ACTIONS = new HashMap<>(); + + /** + * The digging animation. + */ + public static final Animation ANIMATION = Animation.create(830); + + /** + * Handles a digging reward. + * @param player The player. + * @return {@code True} if the reward got handled. + */ + public static boolean dig(final Player player) { + final DigAction action = ACTIONS.get(player.getLocation()); + player.animate(ANIMATION); + player.lock(1); + if (action != null) { + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + action.run(player); + return true; + } + }); + return true; + } + return false; + } + + /** + * Registers a new digging reward. + * @param location The location to dig on. + * @param action The reward. + * @return {@code True} if the reward got registered. + */ + public static boolean register(Location location, DigAction action) { + if (ACTIONS.containsKey(location)) { + SystemLogger.logErr("Already contained dig reward for location " + location + "."); + return false; + } + ACTIONS.put(location, action); + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/action/DoorActionHandler.java b/Server/src/main/java/Server/core/game/content/global/action/DoorActionHandler.java new file mode 100644 index 000000000..e7becb234 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/action/DoorActionHandler.java @@ -0,0 +1,504 @@ +package core.game.content.global.action; + +import core.game.interaction.DestinationFlag; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.object.Constructed; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.SystemLogger; +import core.game.system.config.DoorConfigLoader; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Pathfinder; + +import java.awt.*; + +/** + * Handles door actions. + * + * @author Emperor + */ +public final class DoorActionHandler { + + /** + * The charge indicating the door is already in use. + */ + private static final int IN_USE_CHARGE = 88; + + /** + * Handles a door reward. + * + * @param player The player. + * @param object The object. + */ + public static void handleDoor(final Player player, final GameObject object) { + final GameObject second = (object.getId() == 1530 || object.getId() == 1531) ? null : getSecondDoor(object, player); + GameObject o = null; + if (object instanceof Constructed && (o = ((Constructed) object).getReplaced()) != null) { + player.getAudioManager().send(new Audio(43)); + ObjectBuilder.replace(object, o); + if (second instanceof Constructed && (o = ((Constructed) second).getReplaced()) != null) { + ObjectBuilder.replace(second, o); + return; + } + return; + } + if (object.getDefinition().hasAction("close")) { + if (second != null) { + player.getPacketDispatch().sendMessage("The doors appear to be stuck."); + return; + } + DoorConfigLoader.Door d = DoorConfigLoader.Companion.forId(object.getId()); + if (d == null) { + player.getPacketDispatch().sendMessage("The door appears to be stuck."); + return; + } + int firstDir = (object.getRotation() + 3) % 4; + Point p = getCloseRotation(object); + Location firstLoc = object.getLocation().transform((int) p.getX(), (int) p.getY(), 0); + ObjectBuilder.replace(object, object.transform(d.getReplaceId(), firstDir, firstLoc)); + return; + } + DoorConfigLoader.Door d = DoorConfigLoader.Companion.forId(object.getId()); + if (d == null) { + handleAutowalkDoor(player, object); + return; + } + if (d.isMetal()) { + player.getAudioManager().send(new Audio(71)); + } else { + player.getAudioManager().send(new Audio(81)); + } + if (second != null) { + DoorConfigLoader.Door s = DoorConfigLoader.Companion.forId(second.getId()); + open(object, second, d.getReplaceId(), s == null ? second.getId() : s.getReplaceId(), true, 500, d.isFence()); + return; + } + open(object, null, d.getReplaceId(), -1, true, 500, d.isFence()); + } + + /** + * Handles the opening and walking through a door. + * + * @param entity The entity walking through the door. + * @param object The door object. + * @return + */ + public static boolean handleAutowalkDoor(final Entity entity, final GameObject object, final Location endLocation) { + if (object.getCharge() == IN_USE_CHARGE) { + return false; + } + final GameObject second = (object.getId() == 3) ? null : getSecondDoor(object, entity); + entity.lock(4); + final Location loc = entity.getLocation(); + entity.addExtension(LogoutTask.class, new LocationLogoutTask(4, loc)); + object.setCharge(IN_USE_CHARGE); + if (second != null) { + second.setCharge(IN_USE_CHARGE); + } + if (entity instanceof Player) { + ((Player) entity).getAudioManager().send(new Audio(3419)); + } + GameWorld.getPulser().submit(new Pulse(1) { + boolean opened = false; + + @Override + public boolean pulse() { + if (!opened) { + open(object, second, object.getId(), second == null ? -1 : second.getId(), false, 2, false); + entity.getWalkingQueue().reset(); + entity.getWalkingQueue().addPath(endLocation.getX(), endLocation.getY()); + opened = true; + return false; + } + object.setCharge(1000); + if (second != null) { + second.setCharge(1000); + } + if (entity instanceof Player) { + Player player = entity.asPlayer(); + if (object.getId() == 2112 && player.getLocation().withinDistance(new Location(3046, 9756, 0), 10)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 2, 6); + } + + // pass the al kharid gate + if (object.getId() == 35549 || object.getId() == 35551 && player.getViewport().getRegion().getId() == 13106) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 4); + } + + // Search the shed in Lumbridge Swamp + if (object.getId() == 2406 && player.getLocation().withinDistance(Location.create(3202,3169,0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 6); + } + } + return true; + } + }); + return true; + } + + /** + * Method wrapper for handling the auto walk door. + * + * @param entity the entity. + * @param object the object. + */ + public static boolean handleAutowalkDoor(final Entity entity, final GameObject object) { + return handleAutowalkDoor(entity, object, getEndLocation(entity, object)); + } + + /** + * Gets the end location to walk to. + * + * @param entity the entity. + * @param object the object. + * @return the end location. + */ + public static Location getEndLocation(Entity entity, GameObject object){ + return getEndLocation(entity,object,false); + } + public static Location getEndLocation(Entity entity, GameObject object, Boolean isAutoWalk) { + Location l = object.getLocation(); + Location end = DestinationFlag.OBJECT.getDestination(entity,object); + switch (object.getRotation()) { + case 0: + if (entity.getLocation().getX() >= l.getX()) { + l = l.transform(-1, 0, 0); + } + break; + case 1: + if (entity.getLocation().getY() <= l.getY()) { + l = l.transform(0, 1, 0); + } + break; + case 2: + if (entity.getLocation().getX() <= l.getX()) { + l = l.transform(1, 0, 0); + } + break; + case 3: + if (entity.getLocation().getY() >= l.getY()) { + l = l.transform(0, -1, 0); + } + break; + } + return l; + } + + /** + * Gets the destination for the door. + * + * @param door The door. + * @return The destination location. + */ + public static Location getDestination(Entity entity, GameObject door) { + Location l = door.getLocation(); + int rotation = door.getRotation(); + if (door instanceof Constructed && door.getDefinition().hasAction("close")) { + GameObject o = ((Constructed) door).getReplaced(); + if (o != null) { + l = o.getLocation(); + rotation = o.getRotation(); + } + } + if (door.getType() == 9) { // Diagonal doors + switch (rotation) { + case 0: + case 2: + if (entity.getLocation().getY() < l.getY() || entity.getLocation().getX() < l.getX()) { + return l.transform(0, -1, 0); + } + return l.transform(0, 1, 0); + case 1: + case 3: + if (entity.getLocation().getX() > l.getX() || entity.getLocation().getY() > l.getY()) { + return l.transform(1, 0, 0); + } + return l.transform(-1, 0, 0); + } + } + switch (rotation) { + case 0: + if (entity.getLocation().getX() < l.getX()) { + if(Pathfinder.find(entity,l.transform(-1,0,0)).isMoveNear()){ + return l.transform(0,0,0); + } + return l.transform(-1, 0, 0); + } + break; + case 1: + if (entity.getLocation().getY() > l.getY()) { + if(Pathfinder.find(entity,l.transform(0,1,0)).isMoveNear()){ + return l.transform(0,0,0); + } + return l.transform(0, 1, 0); + } + break; + case 2: + if (entity.getLocation().getX() > l.getX()) { + if(Pathfinder.find(entity,l.transform(1,0,0)).isMoveNear()){ + return l.transform(0,0,0); + } + return l.transform(1, 0, 0); + } + break; + case 3: + if (entity.getLocation().getY() < l.getY()) { + if(Pathfinder.find(entity,l.transform(0,-1,0)).isMoveNear()){ + return l.transform(0,0,0); + } + return l.transform(0, -1, 0); + } + break; + } + return l; + } + + /** + * Opens the doors. + * + * @param object The door object. + * @param second The second door object. + * @param replaceId The replace id. + * @param secondReplaceId The second replace id. + * @param clip If clipping should be changed due to opening the door. + * @param restoreTicks The amount of ticks before the door(s) should be + * closed again. + */ + public static void open(GameObject object, GameObject second, int replaceId, int secondReplaceId, boolean clip, int restoreTicks, boolean fence) { + if(GameWorld.getSettings().getIncreased_door_time()){ + restoreTicks *= 5; + } + object = object.getWrapper(); + int mod = object.getType() == 9 ? -1 : 1; + int firstDir = (object.getRotation() + ((mod + 4) % 4)) % 4; + Point p = getRotationPoint(object.getRotation()); + Location firstLoc = object.getLocation().transform((int) p.getX() * mod, (int) p.getY() * mod, 0); + if (second == null) { + if (replaceId == 4577) { + replaceId = 4578; + firstDir = 3; + firstLoc = firstLoc.transform(0, 1, 0); + } + ObjectBuilder.replace(object, object.transform(replaceId, firstDir, firstLoc), restoreTicks, clip); + return; + } + second = second.getWrapper(); + if (fence) { + openFence(object, second, replaceId, secondReplaceId, clip, restoreTicks); + return; + } + Direction offset = Direction.getDirection(second.getLocation().getX() - object.getLocation().getX(), second.getLocation().getY() - object.getLocation().getY()); + int secondDir = (second.getRotation() + mod) % 4; + if (firstDir == 1 && offset == Direction.NORTH) { + firstDir = 3; + } else if (firstDir == 2 && offset == Direction.EAST) { + firstDir = 0; + } else if (firstDir == 3 && offset == Direction.SOUTH) { + firstDir = 1; + } else if (firstDir == 0 && offset == Direction.WEST) { + firstDir = 2; + } + if (firstDir == secondDir) { + secondDir = (secondDir + 2) % 4; + } + Location secondLoc = second.getLocation().transform((int) p.getX(), (int) p.getY(), 0); + ObjectBuilder.replace(object, object.transform(replaceId, firstDir, firstLoc), restoreTicks, clip); + ObjectBuilder.replace(second, second.transform(secondReplaceId, secondDir, secondLoc), restoreTicks, clip); + } + + /** + * Handles the opening of a fence. + * + * @param object The fence object. + * @param second The second fence object. + * @param replaceId The replace id. + * @param secondReplaceId The second replace id. + * @param clip If clipping should be changed due to opening the door. + * @param restoreTicks The amount of ticks before the door(s) should be + * closed again. + */ + private static void openFence(GameObject object, GameObject second, int replaceId, int secondReplaceId, boolean clip, int restoreTicks) { + Direction offset = Direction.getDirection(second.getLocation().getX() - object.getLocation().getX(), second.getLocation().getY() - object.getLocation().getY()); + int firstDir = (object.getRotation() + 3) % 4; + Point p = getRotationPoint(object.getRotation()); + Location firstLoc = null; + int secondDir = (second.getRotation() + 3) % 4; + if (offset == Direction.WEST || offset == Direction.SOUTH) { + firstLoc = second.getLocation().transform((int) p.getX(), (int) p.getY(), 0); + int s = replaceId; + replaceId = secondReplaceId; + secondReplaceId = s; + } else { + firstLoc = object.getLocation().transform((int) p.getX(), (int) p.getY(), 0); + } + if (object.getRotation() == 3 || object.getRotation() == 2) { + firstDir = (firstDir + 2) % 4; + secondDir = (secondDir + 2) % 4; + } + Location secondLoc = firstLoc.transform((int) p.getX(), (int) p.getY(), 0); + if ((object.getId() == 36917 || object.getId() == 36919)) { + switch (object.getDirection()) { + case SOUTH: + ObjectBuilder.replace(object, object.transform(36919, firstDir, firstLoc), restoreTicks, true); + ObjectBuilder.replace(second, second.transform(36917, secondDir, secondLoc), restoreTicks, true); + break; + case EAST: + ObjectBuilder.replace(object, object.transform(36917, firstDir, firstLoc), restoreTicks, true); + ObjectBuilder.replace(second, second.transform(36919, secondDir, secondLoc), restoreTicks, true); + break; + default: + ObjectBuilder.replace(object, object.transform(36919, firstDir, firstLoc), restoreTicks, true); + ObjectBuilder.replace(second, second.transform(36917, secondDir, secondLoc), restoreTicks, true); + break; + } + } else { + ObjectBuilder.replace(object, object.transform(replaceId, firstDir, firstLoc), restoreTicks, clip); + ObjectBuilder.replace(second, second.transform(secondReplaceId, secondDir, secondLoc), restoreTicks, clip); + } + } + + /** + * Handles the opening of a fence. + * + * @param object The fence object. + * @param replaceId The replace id. + * @param secondReplaceId The second replace id. + * closed again. + */ + public static boolean autowalkFence(final Entity entity, final GameObject object, final int replaceId, final int secondReplaceId) { + final GameObject second = getSecondDoor(object, entity); + if (object.getCharge() == IN_USE_CHARGE || second == null) { + return false; + } + entity.lock(4); + final Location loc = entity.getLocation(); + entity.addExtension(LogoutTask.class, new LocationLogoutTask(4, loc)); + object.setCharge(IN_USE_CHARGE); + second.setCharge(IN_USE_CHARGE); + GameWorld.getPulser().submit(new Pulse(1) { + boolean opened = false; + + @Override + public boolean pulse() { + if (!opened) { + openFence(object, second, replaceId, secondReplaceId, false, 2); + Location l = getEndLocation(entity, object); + entity.getWalkingQueue().reset(); + entity.getWalkingQueue().addPath(l.getX(), l.getY()); + opened = true; + return false; + } + object.setCharge(1000); + if (second != null) { + second.setCharge(1000); + } + return true; + } + }); + return true; + } + + /** + * Gets the closing rotation point. + * + * @param object The object. + * @return The point. + */ + private static Point getCloseRotation(GameObject object) { + switch (object.getRotation()) { + case 0: + return new Point(0, 1); + case 1: + return new Point(1, 0); + case 2: + return new Point(0, -1); + case 3: + return new Point(-1, 0); + } + return new Point(0, 0); + } + + /** + * Gets the rotation point for the object. + * + * @return The rotation point. + */ + public static Point getRotationPoint(int rotation) { + switch (rotation) { + case 0: + return new Point(-1, 0); + case 1: + return new Point(0, 1); + case 2: + return new Point(1, 0); + case 3: + return new Point(0, -1); + } + return null; + } + + /** + * Gets the door next to this door. + * + * @param object The door. + * @return The second door, if any, {@code null} if no second door existed. + */ + public static GameObject getSecondDoor(GameObject object, Entity entity) { + Location l = object.getLocation(); + Player player = entity instanceof Player ? (Player) entity : null; + GameObject o = null; + if ((o = RegionManager.getObject(l.transform(-1, 0, 0))) != null && o.getName().equals(object.getName())) { + return o; + } + if ((o = RegionManager.getObject(l.transform(1, 0, 0))) != null && o.getName().equals(object.getName())) { + return o; + } + if ((o = RegionManager.getObject(l.transform(0, -1, 0))) != null && o.getName().equals(object.getName())) { + return o; + } + if ((o = RegionManager.getObject(l.transform(0, 1, 0))) != null && o.getName().equals(object.getName())) { + return o; + } + return null; + } + + /** + * Gets the rotations to set the opened doors to. + * + * @param object The first door. + * @param second The second door. + * @param rp The rotation point. + * @return An int-array, with index 0 being first door rotation and index 1 + * being second door rotation. + */ + public static int[] getRotation(GameObject object, GameObject second, Point rp) { + if (second == null) { + return new int[]{(object.getRotation() + 1) % 4}; + } + int[] rotations = new int[]{3, 1}; + Location fl = object.getLocation(); + Location sl = second.getLocation(); + if (fl.getX() > sl.getX()) { + rotations = new int[]{2, 0}; + } + if (fl.getX() < sl.getX()) { + rotations = new int[]{0, 2}; + } + if (fl.getY() > sl.getY()) { + rotations = new int[]{1, 3}; + } + if (rp.getY() > 0 || rp.getX() > 0) { + rotations = new int[]{rotations[1], rotations[0]}; + } + return rotations; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/action/DropItemHandler.java b/Server/src/main/java/Server/core/game/content/global/action/DropItemHandler.java new file mode 100644 index 000000000..005757419 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/action/DropItemHandler.java @@ -0,0 +1,70 @@ +package core.game.content.global.action; + +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.PlayerParser; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.SystemLogger; +import core.game.world.GameWorld; + +/** + * Handles the dropping of an item. + * @author Vexia + */ +public final class DropItemHandler { + + /** + * Handles the droping of an item. + * @param player the player. + * @param node the node. + * @param option the option. + * @return {@code True} if so. + */ + public static boolean handle(final Player player, Node node, String option) { + Item item = (Item) node; + if (item.getSlot() == -1) { + player.getPacketDispatch().sendMessage("Invalid slot!"); + return false; + } + switch (option) { + case "drop": + case "destroy": + case "dissolve": + if (!player.getInterfaceManager().close()) { + return true; + } + player.getDialogueInterpreter().close(); + player.getAudioManager().send(new Audio(2393, 0, 0)); + player.getPulseManager().clear(); + if (option.equalsIgnoreCase("destroy") || option.equalsIgnoreCase("dissolve")) { + player.getDialogueInterpreter().open(9878, item); + return true; + } + if (player.getAttribute("equipLock:" + item.getId(), 0) > GameWorld.getTicks()) { + SystemLogger.logAlert(player + ", tried to do the drop & equip dupe."); + return true; + } + if (player.getInventory().replace(null, item.getSlot()) == item) { + item = item.getDropItem(); + player.getAudioManager().send(new Audio(item.getId() == 995 ? 10 : 2739, 1, 0)); + GroundItemManager.create(item, player.getLocation(), player); + PlayerParser.save(player); + } + player.setAttribute("droppedItem:" + item.getId(), GameWorld.getTicks() + 2); + return true; + } + return false; + } + + /** + * Drops an item. + * @param player the player. + * @param item the item. + * @return + */ + public static boolean drop(Player player, Item item) { + return handle(player, item, item.getDefinition().hasDestroyAction() ? "destroy" : "drop"); + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/action/EquipHandler.java b/Server/src/main/java/Server/core/game/content/global/action/EquipHandler.java new file mode 100644 index 000000000..a52941705 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/action/EquipHandler.java @@ -0,0 +1,136 @@ +package core.game.content.global.action; + +import core.game.container.impl.EquipmentContainer; +import core.tools.Items; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.lock.Lock; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.system.config.ItemConfigParser; +import core.game.world.GameWorld; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Plugin; + +/** + * Represents the equipment equipping handler plugin. + * @author Ceikry + * @author Woah + * + */ +public class EquipHandler extends OptionHandler { + + /** + * Represents the singleton. + */ + public static final EquipHandler SINGLETON = new EquipHandler(); + + /** + * The sound to send. + */ + private static final Audio DEFAULT = new Audio(2242, 1, 0); + + /** + * Constructs a new {@code EquipHandler} {@code Object}. + */ + public EquipHandler() { + super(); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final Item item = ((Item) node); + if (item == null || player.getInventory().get(item.getSlot()) != item) { + return true; + } + Plugin plugin = item.getDefinition().getConfiguration("equipment", null); + if (plugin != null) { + Boolean bool = (Boolean) plugin.fireEvent("equip", player, item); + if (bool != null && !bool) { + return true; + } + } + Lock lock = player.getLocks().getEquipmentLock(); + if (lock != null && lock.isLocked()) { + if (lock.getMessage() != null) { + player.getPacketDispatch().sendMessage(lock.getMessage()); + } + return true; + } + player.setAttribute("equipLock:" + item.getId(), GameWorld.getTicks() + 2); + if (player.getEquipment().add(item, item.getSlot(), true, true)) { + //check if a brawling glove is being equipped and register it + if(item.getId() >= 13845 && item.getId() <= 13857) { + player.debug("Registering gloves... ID: " + item.getId()); + player.getBrawlingGlovesManager().registerGlove(item.getId()); + } + + if (item.getId() == Items.BLACK_CHAINBODY_1107 + && player.getAttribute("diary:falador:black-chain-bought", false) + && new ZoneBorders(2969, 3310, 2975, 3314, 0).insideBorder(player)) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR, 0, 2); + } + + + player.getDialogueInterpreter().close(); + player.getAudioManager().send(item.getDefinition().getConfiguration(ItemConfigParser.EQUIP_AUDIO, 2244)); + if(player.getProperties().getAutocastSpell() != null) { + player.getProperties().setAutocastSpell(null); + WeaponInterface wif = player.getExtension(WeaponInterface.class); + wif.selectAutoSpell(-1, true); + wif.openAutocastSelect(); + } + } + return true; + } + + /** + * Unequips an item. + * @param player the player. + * @param slot the slot. + * @param itemId the item id. + */ + public static void unequip(Player player, int slot, int itemId) { + if (slot < 0 || slot > 13) { + return; + } + Item item = player.getEquipment().get(slot); + if (item == null) { + return; + } + Lock lock = player.getLocks().getEquipmentLock(); + if (lock != null && lock.isLocked()) { + if (lock.getMessage() != null) { + player.getPacketDispatch().sendMessage(lock.getMessage()); + } + return; + } + if (slot == EquipmentContainer.SLOT_WEAPON) { + player.getPacketDispatch().sendString("", 92, 0); + } + int maximumAdd = player.getInventory().getMaximumAdd(item); + if (maximumAdd < item.getAmount()) { + player.getPacketDispatch().sendMessage("Not enough free space in your inventory."); + return; + } + Plugin plugin = item.getDefinition().getConfiguration("equipment", null); + if (plugin != null) { + if (!(boolean) plugin.fireEvent("unequip", player, item)) { + return; + } + } + if (player.getEquipment().remove(item)) { + player.getAudioManager().send(new Audio(2238, 10, 1)); + player.getDialogueInterpreter().close(); + player.getInventory().add(item); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/action/PickupHandler.kt b/Server/src/main/java/Server/core/game/content/global/action/PickupHandler.kt new file mode 100644 index 000000000..f21dccc1e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/action/PickupHandler.kt @@ -0,0 +1,118 @@ +package core.game.content.global.action + +import core.tools.Items +import core.game.content.global.GodType +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.audio.Audio +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.GroundItem +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.system.config.GroundSpawnLoader.GroundSpawn +import core.game.world.GameWorld +import core.game.world.map.RegionManager +import core.game.world.update.flag.context.Animation +import plugin.ai.AIRepository.Companion.getItems +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.skill.runecrafting.RunePouch +import core.game.system.SystemLogger + +/** + * A class used to handle the picking up of ground items. + * @author 'Vexia + */ +object PickupHandler { + /** + * Method used to take a ground item. + * @param player the player. + * @param item the item. + * @return `True` if taken. + */ + @JvmStatic + fun take(player: Player, item: GroundItem): Boolean { + if (item.location == null) { + player.packetDispatch.sendMessage("Invalid ground item!") + return true + } + if (!GroundItemManager.getItems().contains(item)) { + player.packetDispatch.sendMessage("Too late!") + return true + } + if (player.getAttribute("droppedItem:" + item.id, 0) > GameWorld.ticks) { //Splinter + SystemLogger.logAlert("$player tried to do the drop & quick pick-up Ground Item dupe.") + return true + } + if (item !is GroundSpawn && item.isRemainPrivate && !item.droppedBy(player)) { + player.sendMessage("You can't take that item!") + return true + } + val add = Item(item.id, item.amount, item.charge) + if (!player.inventory.hasSpaceFor(add)) { + player.packetDispatch.sendMessage("You don't have enough inventory space to hold that item.") + return true + } + if (!canTake(player, item, 0)) { + return true + } + if (item.isActive && player.inventory.add(add)) { + if (!RegionManager.isTeleportPermitted(item.location)) { + player.animate(Animation.create(535)) + } + + if (item is GroundSpawn && item.getId() == Items.SEAWEED_401 + && player.zoneMonitor.isInZone("karamja") + && !player.achievementDiaryManager.hasCompletedTask(DiaryType.KARAMJA, 0, 7)) { + var seaweed = player.getAttribute("seaweed", 0) + seaweed++ + player.setAttribute("seaweed", seaweed) + player.achievementDiaryManager.updateTask(player, DiaryType.KARAMJA, 0, 7, seaweed >= 5) + } + // Collect five palm leaves + if (item.getId() == Items.PALM_LEAF_2339 && player.zoneMonitor.isInZone("karamja") && !player.achievementDiaryManager.hasCompletedTask(DiaryType.KARAMJA, 2, 7)) { + var palms = player.getAttribute("palms", 0) + palms++ + player.setAttribute("palms", palms) + player.achievementDiaryManager.updateTask(player, DiaryType.KARAMJA, 2, 7, palms >= 5) + } + GroundItemManager.destroy(item) + if (item.dropper?.isArtificial == true) { + getItems(item.dropper)?.remove(item) + } + player.audioManager.send(Audio(2582, 10, 1)) + } + return true + } + + /** + * Checks if the player can take an item. + * @param player the player. + * @param item the item. + * @param type the type (1= ground, 2=telegrab) + * @return `True` if so. + */ + @JvmStatic + fun canTake(player: Player, item: GroundItem, type: Int): Boolean { + if (item.dropper != null && !item.droppedBy(player) && player.ironmanManager.checkRestriction()) { + return false + } + if (item.id == 8858 || item.id == 8859) { + player.dialogueInterpreter.sendDialogues(4300, FacialExpression.FURIOUS, "Hey! You can't take that, it's guild property. Take one", "from the pile.") + return false + } + if (GodType.forCape(item) != null) { + if (GodType.hasAny(player)) { + player.sendMessages("You may only possess one sacred cape at a time.", "The conflicting powers of the capes drive them apart.") + return false + } + } + if (RunePouch.forItem(item) != null) { + if (player.hasItem(item)) { + player.sendMessage("A mystical force prevents you from picking up the pouch.") + return false + } + } + return if (item.hasItemPlugin()) { + item.plugin.canPickUp(player, item, type) + } else true + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/action/SpecialLadders.java b/Server/src/main/java/Server/core/game/content/global/action/SpecialLadders.java new file mode 100644 index 000000000..9f49974ba --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/action/SpecialLadders.java @@ -0,0 +1,78 @@ +package core.game.content.global.action; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; + +import java.util.Arrays; +import java.util.HashMap; + +public enum SpecialLadders implements LadderAchievementCheck { + HAM_STORAGE_UP(new Location(2567,5185,0), new Location(3166,9623,0)), + GEM_MINE(new Location(2821,2996,0), new Location(2838,9387,0)), + GEM_MINE_UP(new Location(2838,9388,0), new Location(2820, 2996, 0)), + BEAR_CAGE_UP(Location.create(3230, 9904, 0),Location.create(3231, 3504, 0)), + BEAR_CAGE_DOWN(Location.create(3230,3508,0),Location.create(3229, 9904, 0)), + GLARIAL_EXIT(Location.create(2556,9844,0),Location.create(2557,3444,0)), + SWENSEN_DOWN(Location.create(2644, 3657, 0), Location.create(2631, 10006, 0)), + SWENSEN_UP(Location.create(2665, 10037, 0),Location.create(2649, 3661, 0)), + FOG_ENTER(Location.create(3240,3575,0),Location.create(1675,5599,0)), + FOG_LEAVE(Location.create(1673,5598,0),Location.create(3242, 3574, 0)), + INTRO_LEAVE(Location.create(2522, 4999, 0),Location.create(3230, 3240, 0)), + + DRAYNOR_SEWER_SOUTHEAST_DOWN(new Location(3118, 3244, 0), new Location(3118, 9643, 0)), + DRAYNOR_SEWER_SOUTHEAST_UP(new Location(3118, 9643, 0), new Location(3118, 3243, 0)), + DRAYNOR_SEWER_NORTHWEST_DOWN(new Location(3084, 3272, 0), new Location(3085, 9672, 0)), + DRAYNOR_SEWER_NORTHWEST_UP(new Location(3084, 9672, 0), new Location(3084, 3271, 0)), + + PORT_SARIM_RAT_PITS_DOWN(new Location(3018,3232,0), new Location(2962,9650,0)) { + @Override + public void checkAchievement(Player player) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR,1,11); + } + }, + PORT_SARIM_RAT_PITS_UP(new Location(2962,9651,0), new Location(3018,3231,0)), + PHASMATYS_BAR_DOWN(new Location(3681,3498,0), new Location(3682,9961,0)), + PHASMATYS_BAR_UP(new Location(3682,9962,0), new Location(3681,3497,0)), + SEERS_VILLAGE_SPINNING_HOUSE_ROOFTOP_UP(new Location(2715,3472,1), new Location(2714,3472,3)) { + @Override + public void checkAchievement(Player player) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.SEERS_VILLAGE,1,3); + } + }, + SEERS_VILLAGE_SPINNING_HOUSE_ROOFTOP_DOWN(new Location(2715,3472,3), new Location(2714,3472,1)), + ELEMENTAL_WORKSHOP_STAIRS_DOWN(Location.create(2710,3497, 0), Location.create(2713,9887, 0)), + ELEMENTAL_WORKSHOP_STAIRS_UP(Location.create(2714,9887, 0), Location.create(2709,3498, 0)), + TORMENTED_DEMONS_ENTER(Location.create(3353,3951,0),Location.create(3218, 9532, 2)); + + private static HashMap destinationMap = new HashMap<>(); + private static HashMap ladderMap = new HashMap<>(); + static { + Arrays.stream(SpecialLadders.values()).forEach(entry -> { + destinationMap.putIfAbsent(entry.ladderLoc,entry.destLoc); + }); + Arrays.stream(SpecialLadders.values()).forEach(entry -> { + ladderMap.putIfAbsent(entry.ladderLoc, entry); + }); + } + + private Location ladderLoc,destLoc; + SpecialLadders(Location ladderLoc, Location destLoc){ + this.ladderLoc = ladderLoc; + this.destLoc = destLoc; + } + + public static Location getDestination(Location loc){ + return destinationMap.get(loc); + } + public static SpecialLadders getSpecialLadder(Location loc) { + return ladderMap.get(loc); + } + +} + +interface LadderAchievementCheck { + default void checkAchievement(Player player) { + return; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/presets/Preset.java b/Server/src/main/java/Server/core/game/content/global/presets/Preset.java new file mode 100644 index 000000000..b9806bc1a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/presets/Preset.java @@ -0,0 +1,33 @@ +package core.game.content.global.presets; + +import core.game.node.item.Item; + +import java.util.ArrayList; + +public class Preset { + + private ArrayList equipment; + + private ArrayList inventory; + + public Preset(ArrayList equipment, ArrayList inventory) { + setEquipment(equipment); + setInventory(inventory); + } + + public ArrayList getEquipment() { + return equipment; + } + + public void setEquipment(ArrayList equipment) { + this.equipment = equipment; + } + + public ArrayList getInventory() { + return inventory; + } + + public void setInventory(ArrayList inventory) { + this.inventory = inventory; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/presets/PresetManager.java b/Server/src/main/java/Server/core/game/content/global/presets/PresetManager.java new file mode 100644 index 000000000..e1c4bb96a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/presets/PresetManager.java @@ -0,0 +1,46 @@ +package core.game.content.global.presets; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +public class PresetManager { + + private Player player; + + private Map current_presets; + + public PresetManager() { + current_presets = new HashMap<>(); + } + + public PresetManager storeSet(String name_key) { + final Preset set = current_presets.get(name_key); + if (set != null) { + player.sendMessage("You were unable to store the set " + name_key + " as it already exists."); + } + name_key = name_key.toLowerCase(); + ArrayList equipment = new ArrayList(Arrays.asList(player.getEquipment().getEvent().getItems())), inventory = new ArrayList(Arrays.asList(player.getInventory().getEvent().getItems())); + current_presets.put(name_key, new Preset(equipment, inventory)); + return this; + } + + public void printAvailableSetups() { + final int size = current_presets.size(); + player.sendMessage("You have used "+size+"/"+maxSize()+" available setups."); + if (size > 0) { + player.sendMessage("Your available setups are:"); + for (final String key : current_presets.keySet()) { + player.sendMessage(key); + } + } + } + + public int maxSize() { + return 6; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/report/AbuseReport.java b/Server/src/main/java/Server/core/game/content/global/report/AbuseReport.java new file mode 100644 index 000000000..2a6c2f50b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/report/AbuseReport.java @@ -0,0 +1,91 @@ +package core.game.content.global.report; + +import core.game.node.entity.player.Player; + +/** + * Represents an abuse report to file. + * @author 'Vexia + */ +public final class AbuseReport { + + /** + * The name of the reporter. + */ + private final String reporter; + + /** + * The victim. + */ + private final String victim; + + /** + * The rule. + */ + private final Rule rule; + + /** + * The messages. + */ + private String messages; + + /** + * Constructs a new {@code AbuseReport {@code Object}. + * @param reporter the reporter. + * @param victim the victim. + * @param rule the rule broken. + */ + public AbuseReport(String reporter, String victim, Rule rule) { + this.reporter = reporter; + this.victim = victim; + this.rule = rule; + } + + /** + * Constructs the report and dispatches it to the database. + * @param player the player. + */ + public void construct(Player player, boolean mute) { + player.getPacketDispatch().sendMessage("Thank-you, your abuse report has been received."); + } + + /** + * Gets the reporter. + * @return The reporter. + */ + public String getReporter() { + return reporter; + } + + /** + * Gets the victim. + * @return The victim. + */ + public String getVictim() { + return victim; + } + + /** + * Gets the rule. + * @return The rule. + */ + public Rule getRule() { + return rule; + } + + /** + * Gets the messages. + * @return The messages. + */ + public String getMessages() { + return messages; + } + + /** + * Sets the messages. + * @param messages The messages to set. + */ + public void setMessages(String messages) { + this.messages = messages; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/global/report/Rule.java b/Server/src/main/java/Server/core/game/content/global/report/Rule.java new file mode 100644 index 000000000..e340e92df --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/report/Rule.java @@ -0,0 +1,60 @@ +package core.game.content.global.report; + +import core.game.node.entity.player.Player; + +/** + * Represents a rule. + * @author 'Vexia + */ +public enum Rule { + OFFENSIVE_LANGUAGE(0), ITEM_SCAMMING(1), PASSWORD_SCAMMING(2), BUG_ABUSE(3), KELDAGRIM_STAFF_IMPERSONATION(4), ACCCOUNT_SHARING(5), MACROING(6), MULTIPLE_LOGGING(7), ENCOURAGING_TO_BREAK_TULES(8), MISUSE_OF_CUSTOMER_SUPPORT(9), ADVERISTING(10), REAL_WORLD_ITEM_TRADING(11), ASKING_PERSONAL_DETAILS(12); + + /** + * Constructs a new {@code Rule.java} {@code Object}. + * @param rule the rule. + */ + Rule(int rule) { + this.rule = rule; + } + + /** + * The rule id opcode. + */ + private int rule; + + /** + * Represents if the rule is relative to the sequences that has happend. + * @return {@code True} if so. + */ + public boolean canRequest(Player target) { + if (target == null) { + return false; + } + if (target.getSavedData().getGlobalData().getChatPing() < System.currentTimeMillis()) { + return false; + } + return true; + } + + /** + * Gets the rule. + * @return the rule. + */ + public int getRule() { + return rule; + } + + /** + * Gets the rule. + * @param id the id. + * @return the rule. + */ + public static Rule forId(int id) { + for (Rule rule : Rule.values()) { + if (rule.getRule() == id) { + return rule; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/shop/Shop.java b/Server/src/main/java/Server/core/game/content/global/shop/Shop.java new file mode 100644 index 000000000..3676cb6bc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/shop/Shop.java @@ -0,0 +1,914 @@ +package core.game.content.global.shop; + +import core.cache.def.impl.ItemDefinition; +import core.game.container.Container; +import core.game.container.ContainerType; +import core.tools.Items; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.system.config.ItemConfigParser; +import core.game.world.GameWorld; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * A class representing a shop. + * + * @author 'Vexia + * @author Jamix77 + */ +public class Shop { + + /** + * Represents the general store items. + */ + public final static Item[] GENERAL_STORE_ITEMS = new Item[]{ + new Item(Items.EMPTY_POT_1931,5), + new Item(Items.JUG_1935,5), + new Item(Items.SHEARS_1735,2), + new Item(Items.BUCKET_1925,3), + new Item(Items.BOWL_1923,2), + new Item(Items.CAKE_TIN_1887,2), + new Item(Items.TINDERBOX_590,2), + new Item(Items.CHISEL_1755,2), + new Item(Items.HAMMER_2347,5), + new Item(Items.NEWCOMER_MAP_550,5), + new Item(Items.SECURITY_BOOK_9003,5) + }; + /** + * Represents the coins item. + */ + private static final int COINS = 995; + /** + * Represents the tokkul item id. + */ + private static final int TOKKUL = 6529; + + /** + * Represents the archery ticket item id + */ + private static final int ARCHERY_TICKET = 1464; + + /** + * Represents the shop containers. + */ + private final Container[] containers = new Container[]{new Container(40, ContainerType.SHOP), new Container(40, ContainerType.SHOP)}; + /** + * Represents the list of shop viewers. + */ + private final List viewers = new ArrayList<>(); + + /** + * Represents the title of the shop. + */ + private final String title; + + /** + * Represents the items in the store. + */ + private Item[] items; + + /** + * Represents if it's a general store. + */ + private final boolean general; + + /** + * Represents the currency the shop allows. + */ + private final int currency; + + /** + * If the shop buys for high alch. + */ + private final boolean highAlch; + + /** + * Sell price for all shop items, if needed. + */ + private int sellAllFor; + + /** + * The last restock. + */ + private int lastRestock; + + /** + * If the shop should restock. + */ + private boolean restock; + + /** + * If it's a point shop. + */ + private boolean pointShop; + + /** + * The npcs of the shop. + */ + private int[] npcs; + + /** + * Constructs a new {@code Shop} {@code Object}. + * + * @param title the title. + * @param items the items. + * @param general the general. + * @param currency the currency. + * @param highAlch if high alch. + */ + public Shop(String title, Item[] items, boolean general, int currency, boolean highAlch) { + this.title = title; + this.items = items; + this.general = general; + this.currency = currency; + this.highAlch = highAlch; + this.getContainer(0).add(items); + this.setRestock(true); + lastRestock = GameWorld.getTicks() + 100; + } + + + /** + * Constructs a new {@code Shop} {@code Object}. + * + * @param title the title. + * @param items the items. + * @param general the general. + * @param currency the currency. + * @param highAlch if high alch. + * @param restock if restock. + */ + public Shop(String title, Item[] items, boolean general, int currency, boolean highAlch, boolean restock, int sellAllFor) { + this(title, items, general, currency, highAlch); + this.sellAllFor = sellAllFor; + this.setRestock(restock); + } + + /** + * Constructs a new {@code Shop} {@code Object} + * + * @param title the shop title + * @param items items the shop can handle + * @param general is this a general store + * @param currency what currency is used + */ + public Shop(String title, Item[] items, int[] npcs, boolean general, int currency) { + this(title, items, general, currency, false); + this.setNpcs(npcs); + } + + /** + * Constructs a new {@code Shop} {@code Object}. + * + * @param title the title. + * @param items the items. + * @param general the general. + */ + public Shop(String title, Item[] items, boolean general) { + this(title, items, general, COINS, false); + } + + /** + * Constructs a new {@code Shop} {@code Object}. + * + * @param title the title. + * @param general the general. + */ + public Shop(String title, boolean general) { + this(title, GENERAL_STORE_ITEMS, general); + } + + /** + * Constructs a new {@code Shop} {@code Object}. + * + * @param title the title. + * @param general the general. + * @param highAlch if highAlch. + */ + public Shop(String title, boolean general, boolean highAlch) { + this(title, GENERAL_STORE_ITEMS, general, COINS, highAlch); + } + + /** + * Constructs a new {@code Shop} {@code Object}. + * + * @param title the title. + * @param general the general. + * @param highAlch if highAlch. + */ + public Shop(String title, boolean general, int currency, boolean highAlch) { + this(title, GENERAL_STORE_ITEMS, general, currency, highAlch); + } + + /** + * Constructs a new {@code Shop} {@code Object}. + * + * @param title the title. + * @param items the items. + * @param npcs the npcs. + * @param general the general. + */ + public Shop(String title, Item[] items, int[] npcs, boolean general) { + this(title, items, general, COINS, false); + this.setNpcs(npcs); + } + + /** + * Constructs a new {@code Shop} {@code Object}. + * + * @param title the title. + * @param npcs the npcs. + * @param general the general. + */ + public Shop(String title, int[] npcs, boolean general) { + this(title, GENERAL_STORE_ITEMS, npcs, general); + this.setNpcs(npcs); + } + + /** + * Constructs a new {@code Shop} {@code Object}. + * + * @param title the title. + * @param npcs the npcs. + * @param general the general. + * @param highAlch if highAlch. + */ + public Shop(String title, int[] npcs, boolean general, boolean highAlch) { + this(title, GENERAL_STORE_ITEMS, general, 995, highAlch); + this.setNpcs(npcs); + } + + /** + * Method used to open the shop. + * + * @param player the shop. + */ + public void open(final Player player) { + ShopViewer.extend(player, this).open(); + + // Browse the Lumbridge General Store + if (getTitle().equalsIgnoreCase("Lumbridge General Store")) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 18); + } + + // Browse through Oziach's Armour Shop + if (getTitle().equalsIgnoreCase("Oziach's Armour")) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 20); + } + } + + public void give(Player player, final int slot, int amount, int tabIndex) { + final Container container = getContainer(tabIndex); + final Item item = container.get(slot); + if (item == null) { + return; + } + final Item add = new Item(item.getId(), amount); + if (add.getAmount() < 1 || !player.getInventory().hasSpaceFor(add)) { + player.getPacketDispatch().sendMessage("You have no inventory space at the moment and cannot get anything."); + return; + } + add.setAmount(getAmount(player, add)); + if (add.getAmount() < 1 || !player.getInventory().hasSpaceFor(add)) { + player.getPacketDispatch().sendMessage("You have no inventory space at the moment and cannot get anything."); + return; + } + player.getInventory().add(add); + update(); + } + + /** + * Method used to buy an item from the shop. + * + * @param slot the slot. + * @param amount the amount. + */ + public void buy(Player player, final int slot, int amount, int tabIndex) { + if (tabIndex == 1 && player.getIronmanManager().checkRestriction()) { + return; + } + final Container container = getContainer(tabIndex); + final Item item = container.get(slot); + if (item == null) { + return; + } + if (item.getAmount() == 0) { + player.getPacketDispatch().sendMessage("There is no stock of that item at the moment."); + return; + } + if (amount > item.getAmount() && !(item.getAmount() == -1)) { + amount = item.getAmount(); + } + final Item add = new Item(item.getId(), amount); + if (player.getInventory().getMaximumAdd(add) < amount) { + add.setAmount(player.getInventory().getMaximumAdd(add)); + } + if (add.getAmount() < 1 || !player.getInventory().hasSpaceFor(add)) { + player.getPacketDispatch().sendMessage("You have no inventory space at the moment and cannot buy anything."); + return; + } + add.setAmount(getAmount(player, add)); + if (add.getAmount() < 1 || !player.getInventory().hasSpaceFor(add)) { + player.getPacketDispatch().sendMessage("You have no inventory space at the moment and cannot buy anything."); + return; + } + int price = add.getAmount() * getBuyPrice(item, player); + final Item currency = new Item(getCurrency(), price); + if (!canBuy(player, item, price, currency)) { + return; + } + if (handleBuy(player, currency)) { + if (pointShop) { + decrementPoints(player, price); + } + if (tabIndex == 0) { + if(!(container.getAmount(item) == -1)) + container.replace(new Item(item.getId(), container.getAmount(item) - add.getAmount()), slot, true); + } else { + container.remove(add); + container.shift(); + } + + // Achievement Diary Handlers + if (add.getId() == Items.BLACK_CHAINBODY_1107 && getTitle().equalsIgnoreCase("Wayne's Chains") && !player.getAttribute("diary:falador:black-chain-bought", false)) { + player.setAttribute("/save:diary:falador:black-chain-bought", true); + } + if (add.getId() == 12622 && getTitle().equalsIgnoreCase("Sarah's Farming Shop")) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 0, 0); + } + if (add.getId() == Items.CANDLE_36 && getTitle().equalsIgnoreCase("Candle Shop")) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 0, 9); + } + if (getTitle().equalsIgnoreCase("Ranging Guild Ticket Exchange")) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 8); + } + + player.getInventory().add(add); + update(); + } + } + + /** + * Method used to sell an item to the shop. + * + * @param slot the slot. + * @param amount the amount. + */ + public void sell(Player player, final int slot, int amount, int tabIndex) { + final Item item = player.getInventory().get(slot); + if (item == null) { + return; + } + final ItemDefinition def = ItemDefinition.forId(item.getId()); + if (!canSell(player, item, def)) { + return; + } + final Container container = getContainer(item); + if (amount > player.getInventory().getAmount(item)) { + amount = player.getInventory().getAmount(item); + } + Item add = new Item(item.getId(), amount); + if (add.getAmount() > container.getMaximumAdd(add)) { + add.setAmount(container.getMaximumAdd(add)); + } + player.debug("" + add.getAmount()); + if (!container.hasSpaceFor(add) || add.getAmount() < 1) { + player.getPacketDispatch().sendMessage("The shop has ran out of space."); + return; + } + final Item currency = new Item(getCurrency(), getSellingValue(add, player)); + if(item.getDefinition().isStackable()){ + if (!player.getInventory().hasSpaceFor(currency)) { + player.getPacketDispatch().sendMessage("You don't have enough space for that many " + currency.getName().toLowerCase() + "."); + return; + } + } + player.debug("Selling item"); + if (player.getInventory().remove(add, slot, true)) { + if (currency.getAmount() > player.getInventory().getMaximumAdd(currency)) { + currency.setAmount(player.getInventory().getMaximumAdd(currency)); + } + if (!add.getDefinition().isUnnoted()) { + add = new Item(add.getNoteChange(), add.getAmount()); + } + if (container.getAmount(add.getId()) == -1 || container.add(add)) { + if (currency.getAmount() > 0) { + player.debug("Adding coins to inventory"); + player.getInventory().add(currency); + } + final ShopViewer viewer = player.getExtension(ShopViewer.class); + tabIndex = container == getContainers()[0] ? 0 : 1; + sendStock(player, tabIndex); + if (viewer != null) { + viewer.setTabIndex(tabIndex); + } + update(); + } + } + } + + /** + * Values an item. + * + * @param player the player. + * @param viewer the viewer. + * @param item the item. + * @param sell the sell. + */ + public void value(Player player, ShopViewer viewer, Item item, boolean sell) { + if (sell) { + if (pointShop || item.getId() == viewer.getShop().getCurrency() || !item.getDefinition().isTradeable() || !viewer.getShop().itemAllowed(item.getId())) { + player.getPacketDispatch().sendMessage("You can't sell this item."); + return; + } + final int value = viewer.getShop().getSellingValue(new Item(item.getId(), 1), player); + String currency = pointShop ? getPointsName() : ItemDefinition.forId(viewer.getShop().getCurrency()).getName().toLowerCase(); + if (value == 1 && currency.charAt(currency.length() - 1) == 's') { + currency = currency.substring(0, currency.length() - 1); + } + player.getPacketDispatch().sendMessage(item.getName() + ": shop will buy for " + value + " " + currency + "."); + } else { + int value = viewer.getShop().getBuyPrice(item, player); + String name = pointShop ? getPointsName() + "s" : ItemDefinition.forId(viewer.getShop().getCurrency()).getName().toLowerCase(); + if (value == 1 && (name.charAt(name.length() - 1) == 's')) { + name = name.substring(0, name.length() - 1); + } + player.getPacketDispatch().sendMessage("" + item.getName() + ": currently costs " + value + " " + name + "."); + } + } + + /** + * Method used to send a stock + * + * @param player + * @param tabIndex + */ + public void sendStock(final Player player, int tabIndex) { + final boolean main = tabIndex == 0; + player.getPacketDispatch().sendInterfaceConfig(620, 23, !main); + player.getPacketDispatch().sendInterfaceConfig(620, 24, main); + player.getPacketDispatch().sendInterfaceConfig(620, 29, !main); + player.getPacketDispatch().sendInterfaceConfig(620, 25, main); + player.getPacketDispatch().sendInterfaceConfig(620, 27, main); + player.getPacketDispatch().sendInterfaceConfig(620, 26, false); + player.getPacketDispatch().sendAccessMask(1278, main ? 23 : 24, 620, 0, 40); + } + + /** + * Method used to update the viewers. + */ + public void update() { + for (ShopViewer viewer : viewers) { + viewer.update(); + } + } + + /** + * Method used to restock the shop. + */ + public void restock() { + for (Container container : containers) { + for (int i = 0; i < container.toArray().length; i++) { + final boolean main = (container == containers[0]); + final Item item = container.toArray()[i]; + if (item == null) { + continue; + } + boolean reduce = !main; + if (main) { + if (item.getAmount() < items[i].getAmount()) { + item.setAmount(item.getAmount() + 1); + } + reduce = item.getAmount() > items[i].getAmount(); + } + if (reduce) { + int amount = item.getAmount() - 1; + if (amount < 1 && !main) { + container.remove(item); + } else { + item.setAmount(amount); + } + if (!main) { + container.shift(); + } + } + } + } + update(); + } + + /** + * Checks if the player can sell an item to the shop. + * + * @param player the player. + * @param item the item. + * @param def the def. + * @return {@code True} if so. + */ + public boolean canSell(Player player, Item item, ItemDefinition def) { + if (pointShop || item.getDefinition().hasDestroyAction() || !def.isTradeable() || !itemAllowed(item.getId())) { + player.getPacketDispatch().sendMessage("You can't sell this item to this shop."); + return false; + } + if (item.getId() == getCurrency()) { + player.getPacketDispatch().sendMessage("You can't sell " + item.getName().toLowerCase() + " to a shop."); + return false; + } + return true; + } + + /** + * Gets the amount to buy/sell. + * + * @param player the player. + * @param add the added item. + * @return the amount. + */ + public int getAmount(Player player, Item add) { + return add.getAmount(); + } + + /** + * Checks if the player can buy the item. + * + * @param player the player. + * @param currency the currency. + * @return {@code True} if so. + */ + public boolean handleBuy(Player player, Item currency) { + return pointShop || player.getInventory().remove(currency); + } + + /** + * Checks if the player can buy from the shop. + * + * @param player the player. + * @param item the item. + * @param price the price. + * @param currency the currency. + * @return {@code True} if they can buy. + */ + public boolean canBuy(Player player, Item item, int price, Item currency) { + if (!pointShop && !player.getInventory().containsItem(currency)) { + player.getPacketDispatch().sendMessage("You don't have enough " + ItemDefinition.forId(getCurrency()).getName().toLowerCase() + "."); + return false; + } + if (pointShop && getPoints(player) < price) { + player.sendMessage("You don't have enough " + getPointsName() + "s."); + return false; + } + return true; + } + + /** + * Gets the points. + * + * @param player the player. + * @return the points. + */ + public int getPoints(Player player) { + return 0; + } + + /** + * Decrements the points. + * + * @param player the player. + * @param decrement the decrementation. + */ + public void decrementPoints(Player player, int decrement) { + + } + + /** + * Gets the points name. + * + * @return the name. + */ + public String getPointsName() { + return ""; + } + + /** + * Gets the value gained for selling this item to a certain shop. + * + * @param item The item to sell. + * @param player the player. + * @return The value. + */ + public int getSellingValue(Item item, Player player) { + if (!item.getDefinition().isUnnoted()) { + item = new Item(item.getNoteChange(), item.getAmount()); + } + int amount = getContainer(1).getAmount(item); + if (getCurrency() == TOKKUL) { + for (Item i : items) { + if (i.getId() == item.getId()) { + amount = i.getAmount(); + } + } + } + if (amount < 1) { + amount = getContainer(0).getAmount(item); + } + int value = getSellValue(player, amount, item); + if (getCurrency() == TOKKUL) { + int tokkul = item.getDefinition().getConfiguration("tokkul_price", -1); + if (tokkul > 0) { + value = tokkul /= 10; + } + } + return value; + } + + /** + * Gets the selling value formula based. + * + * @param amount the amount. + * @param item the item. + * @return the selling value. + */ + private int getSellValue(Player player, int amount, Item item) { + double diff = item.getDefinition().isStackable() ? 0.005 : 0.05; + double maxMod = 1.0 - (amount * diff); + if (maxMod < 0.25) { + maxMod = 0.25; + } + double minMod = maxMod - ((item.getAmount() - 1) * diff); + if (minMod < 0.25) { + minMod = 0.25; + } + double mod = (maxMod + minMod) / 2; + int value = (int) (item.getDefinition().getAlchemyValue(highAlch) * mod * item.getAmount()); + if(item.getId() == 12183){ + value = 25 * item.getAmount(); + } + return value; + } + + /** + * Gets the buying price. + * + * @param item the item. + * @return the price. + */ + public int getBuyPrice(Item item, Player player) { + item = new Item(item.getId(), 1); + int price = item.getDefinition().getMaxValue(); + int sellVal = getSellingValue(item, player); + if (price < sellVal) { + price = getSellValue(player, 0, item) + sellVal - (sellVal - item.getDefinition().getMaxValue()); + } + if (price < 0) { + price = 1; + } + if (getCurrency() == TOKKUL) { + int tokkul = item.getDefinition().getConfiguration("tokkul_price", -1); + if (tokkul > 0) { + price = tokkul; + } + if (player.getAchievementDiaryManager().getKaramjaGlove() != -1) { + price *= 0.86666666667; + } + } + if (getCurrency() == ARCHERY_TICKET) { + int tickets = item.getDefinition().getConfiguration(ItemConfigParser.ARCHERY_TICKET_PRICE,-1); + if (tickets > 0) { + price = tickets; + } + } + return (getSellAllFor() > 0 ? getSellAllFor() : price); + } + + /** + * Checks if the item is allowed to be sold to the shop. + * + * @param itemId the item id. + * @return {@code True} if so. + */ + public boolean itemAllowed(int itemId) { + if (general) { + return true; + } + int noteId = ItemDefinition.forId(itemId).getNoteId(); + if (!ItemDefinition.forId(itemId).isUnnoted()) { + noteId = ItemDefinition.forId(noteId).getNoteId(); + } + for (Item id : items) { + if (itemId == id.getId() || (noteId > -1 && noteId == ItemDefinition.forId(id.getId()).getNoteId())) { + return true; + } + } + return false; + } + + /** + * Gets the container the item should go to. + * + * @param item the item. + * @return the container. + */ + public Container getContainer(Item item) { + int itemId = item.getId(); + int noteId = ItemDefinition.forId(itemId).getNoteId(); + if (!ItemDefinition.forId(itemId).isUnnoted()) { + noteId = ItemDefinition.forId(noteId).getNoteId(); + } + for (Item i : items) { + if (i.getId() == item.getId() || (noteId > -1 && noteId == ItemDefinition.forId(i.getId()).getNoteId())) { + return getContainer(0); + } + } + return getContainer(1); + } + + /** + * Creates a copy of this shop. + * + * @return the shop. + */ + public Shop copy() { + return new Shop(title, items, general, currency, highAlch); + } + + /** + * Gets the container on the slot. + * + * @param tabIndex the tab index. + * @return the container. + */ + public Container getContainer(int tabIndex) { + if (tabIndex > containers.length) { + throw new IndexOutOfBoundsException("Error! Shop tab index out of bounds."); + } + return containers[tabIndex]; + } + + /** + * Gets the viewers. + * + * @return The viewers. + */ + public List getViewers() { + return viewers; + } + + /** + * Gets the title. + * + * @return The title. + */ + public String getTitle() { + return title; + } + + /** + * Gets the items. + * + * @return The items. + */ + public Item[] getItems() { + return items; + } + + /** + * Sets the items. + * + * @return true if the items were changed. + */ + public boolean setItems(Item... item) { + return items == item; + } + + /** + * Gets the general. + * + * @return The general. + */ + public boolean isGeneral() { + return general; + } + + /** + * Gets the currency. + * + * @return The currency. + */ + public int getCurrency() { + return currency; + } + + /** + * Gets the containers. + * + * @return The containers. + */ + public Container[] getContainers() { + return containers; + } + + /** + * Gets the bhighAlch. + * + * @return the highAlch + */ + public boolean isHighAlch() { + return highAlch; + } + + @Override + public String toString() { + return "Shop [containers=" + Arrays.toString(containers) + ", viewers=" + viewers + ", title=" + title + ", items=" + Arrays.toString(items) + ", general=" + general + ", currency=" + currency + ", highAlch=" + highAlch + "]"; + } + + /** + * Gets the lastRestock. + * + * @return the lastRestock + */ + public int getLastRestock() { + return lastRestock; + } + + /** + * Sets the balastRestock. + * + * @param lastRestock the lastRestock to set. + */ + public void setLastRestock(int lastRestock) { + this.lastRestock = lastRestock; + } + + /** + * Gets the npcs. + * + * @return the npcs + */ + public int[] getNpcs() { + return npcs; + } + + /** + * Sets the banpcs. + * + * @param npcs the npcs to set. + */ + public void setNpcs(int[] npcs) { + this.npcs = npcs; + } + + /** + * Gets the pointShop. + * + * @return the pointShop + */ + public boolean isPointShop() { + return pointShop; + } + + /** + * Sets the pointShop. + * + * @param pointShop the pointShop to set. + */ + public void setPointShop(boolean pointShop) { + this.pointShop = pointShop; + } + + /** + * Check if shop should restock. + * + * @return the restock + */ + public boolean isRestock() { + return restock; + } + + /** + * Sets the restock. + * + * @param reStock + */ + public void setRestock(boolean reStock) { + restock = reStock; + } + + + /** + * Gets the SellAllFor value. + * + * @return the sellAllFor + */ + public int getSellAllFor() { + return sellAllFor; + } + + public void setItems(ArrayList items){ + this.items = items.toArray(new Item[0]); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/shop/ShopViewer.java b/Server/src/main/java/Server/core/game/content/global/shop/ShopViewer.java new file mode 100644 index 000000000..c910aa992 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/shop/ShopViewer.java @@ -0,0 +1,154 @@ +package core.game.content.global.shop; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +/** + * Represents the viewing of a shop. + * @author 'Vexia + */ +public final class ShopViewer { + + /** + * Represents the main component. + */ + private static final Component COMPONENT = new Component(620).setCloseEvent(new ShopCloseEvent()); + + /** + * Represents the single tab component. + */ + private static final Component SINGLE_TAB = new Component(621); + + /** + * Represents the player. + */ + private final Player player; + + /** + * Represents the shop being viewed. + */ + private Shop shop; + + /** + * Represents the tab index. + */ + private int tabIndex; + + /** + * Constructs a new {@code ShopViewer} {@code Object}. + * @param player the player. + * @param shop the shop. + */ + public ShopViewer(Player player, Shop shop) { + this.player = player; + this.shop = shop; + } + + /** + * Extends a shop a shop viewer to the player instance. + * @param player the player. + * @param shop the shop. + * @return the viewer. + */ + public static ShopViewer extend(final Player player, Shop shop) { + ShopViewer viewer = player.getExtension(ShopViewer.class); + if (viewer != null) { + return viewer; + } + player.addExtension(ShopViewer.class, (viewer = new ShopViewer(player, shop))); + return viewer; + } + + /** + * Method used to open the shop visual. + */ + public void open() { + update(); + shop.getViewers().add(this); + player.getInterfaceManager().open(COMPONENT); + player.getInterfaceManager().openSingleTab(SINGLE_TAB); + shop.sendStock(player, tabIndex); + player.getPacketDispatch().sendRunScript(25, "vg", 868, 92); + player.getPacketDispatch().sendAccessMask(1278, 0, 621, 0, 28); + player.getPacketDispatch().sendString(shop.getTitle(), 620, 22); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", "", "", "", "", "Buy X", "Buy 10", "Buy 5", "Buy 1", "Value", -1, 0, 4, 10, 92, 620 << 16 | 23); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", "", "", "", "", "Buy X", "Buy 10", "Buy 5", "Buy 1", "Value", -1, 0, 4, 10, 31, (620 << 16) | 24); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", "", "", "", "", "Sell X", "Sell 10", "Sell 5", "Sell 1", "Value", -1, 0, 7, 4, 93, 621 << 16); + } + + /** + * Method used to update the contents on the component. + */ + public void update() { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 93, player.getInventory().toArray(), 28, false)); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 92, shop.getContainer(0).toArray(), shop.getContainer(0).itemCount(), false)); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, 64271, 31, shop.getContainer(1).toArray(), shop.getContainer(1).itemCount(), false)); + } + + /** + * Method used to show a stock. + */ + public void showStock(int tabIndex) { + this.tabIndex = tabIndex; + shop.sendStock(player, tabIndex); + update(); + } + + /** + * Sets the tabIndex. + * @param tabIndex The tabIndex to set. + */ + public void setTabIndex(int tabIndex) { + this.tabIndex = tabIndex; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the shop. + * @return The shop. + */ + public Shop getShop() { + return shop; + } + + /** + * Gets the tabIndex. + * @return The tabIndex. + */ + public int getTabIndex() { + return tabIndex; + } + + /** + * Represents the close event when a shop is closed. + * @author 'Vexia + */ + public static final class ShopCloseEvent implements CloseEvent { + + @Override + public boolean close(Player player, Component c) { + final ShopViewer viewer = player.getExtension(ShopViewer.class); + if (viewer == null) { + return true; + } + player.removeExtension(ShopViewer.class); + viewer.getShop().getViewers().remove(viewer); + player.getInterfaceManager().closeSingleTab(); + player.removeAttribute("spawning_items"); + return true; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/global/travel/EssenceTeleport.kt b/Server/src/main/java/Server/core/game/content/global/travel/EssenceTeleport.kt new file mode 100644 index 000000000..d3fe81bda --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/EssenceTeleport.kt @@ -0,0 +1,180 @@ +package core.game.content.global.travel + +import core.game.node.entity.impl.Projectile +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.tools.RandomFunction + +/** + * Represents a utilitity class for rune essence teleporting. + * @author 'Vexia + */ +object EssenceTeleport { + /** + * Array of all the possible `Location` locations. + */ + val LOCATIONS = arrayOf(Location.create(2911, 4832, 0), Location.create(2913, 4837, 0), Location.create(2930, 4850, 0), Location.create(2894, 4811, 0), Location.create(2896, 4845, 0), Location.create(2922, 4820, 0), Location.create(2931, 4813, 0)) + + /** + * Represents the animation to use. + */ + private val ANIMATION = Animation(437) + + /** + * Method used to teleport a player. + * @param npc the npc. + * @param player the player. + */ + @JvmStatic + fun teleport(npc: NPC, player: Player) { + npc.animate(ANIMATION) + npc.faceTemporary(player, 1) + npc.graphics(Graphics(108)) + player.lock() + player.audioManager.send(195) + Projectile.create(npc, player, 109).send() + npc.sendChat("Senventior Disthinte Molesko!") + GameWorld.Pulser.submit(object : Pulse(1) { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 2 -> { + if (getStage(player) == 2 && player.inventory.contains(5519, 1)) { + val item = player.inventory[player.inventory.getSlot(Item(5519))] + if (item != null) { + if (item.charge == 1000) { + player.savedData.globalData.resetAbyss() + } + val wizard = Wizard.forNPC(npc.id) + if (!player.savedData.globalData.hasAbyssCharge(wizard.ordinal)) { + player.savedData.globalData.setAbyssCharge(wizard.ordinal) + item.charge = item.charge + 1 + if (item.charge == 1003) { + player.sendMessage("Your scrying orb has absorbed enough teleport information.") + player.inventory.remove(Item(5519)) + player.inventory.add(Item(5518)) + } + } + } + } + player.savedData.globalData.essenceTeleporter = npc.id + val loc: Location =Location.create(2922, 4820, 0) + player.properties.teleportLocation = loc + + if (npc.id == 553) { + player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 0, 1) + } + if (npc.id == 300) { + player.achievementDiaryManager.finishTask(player, DiaryType.LUMBRIDGE, 1, 14) + } + } + 3 -> { + player.graphics(Graphics(110)) + player.unlock() + return true + } + } + return false + } + }) + } + + /** + * Method used to teleport back to the home. + * @param player the prayer. + */ + @JvmStatic + fun home(player: Player) { + val wizard = Wizard.forNPC(player.savedData.globalData.essenceTeleporter) + Projectile.create(player, player, 345).send() + player.properties.teleportLocation = wizard.location + } + + /** + * Gets the stage. + * @return the stage. + */ + fun getStage(player: Player): Int { + return player.varpManager.get(492).getValue() + } + + /** + * Method used to get a random location. + * @return the location. + */ + val location: Location + get() { + val count = RandomFunction.random(LOCATIONS.size) + return LOCATIONS[count] + } + + /** + * Represents the wizard npc who can teleport. + * @author 'Vexia + */ + enum class Wizard + /** + * Constructs a new `WizardTowerPlugin` `Object`. + * @param npc the npc. + * @param location the location. + */( + /** + * Represents the npc of this wizard. + */ + val npc: Int, + /** + * The mask. + */ + val mask: Int, + /** + * Represents the returining location. + */ + val location: Location) { + AUBURY(553, 0x2, Location(3253, 3401, 0)), + SEDRIDOR(300, 0x4, Location(3107, 9573, 0)), + DISTENTOR(462, 0x8, Location(2591, 3085, 0)), + CROMPERTY(2328, 0x12, Location.create(2682, 3323, 0)); + + /** + * Gets the npc. + * @return The npc. + */ + + /** + * Gets the mask. + * @return The mask. + */ + + /** + * Gets the location. + * @return The location. + */ + + companion object { + /** + * Method used to get a wizard by the npc. + * @param npc the npc. + * @return the wizard. + */ + fun forNPC(npc: Int): Wizard { + for (wizard in values()) { + if (npc == 844) { + return CROMPERTY + } + if (wizard.npc == npc) { + return wizard + } + } + return AUBURY + } + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/travel/MinigameGroupFinder.java b/Server/src/main/java/Server/core/game/content/global/travel/MinigameGroupFinder.java new file mode 100644 index 000000000..75d1a3bae --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/MinigameGroupFinder.java @@ -0,0 +1,159 @@ +package core.game.content.global.travel; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.world.map.Location; + +/** + * Handles the Minigame Group Finder teleport interface. + * + * @author Torchic + */ +public class MinigameGroupFinder { + + /** + * Opens the minigame finder for the player. + * @param player The player. + */ + public static void openFinder(Player player) { + player.setAttribute("minigameFinder:open", true); + player.getInterfaceManager().openTab(2, new Component(259)); + player.getPacketDispatch().sendString("Minigame Group Finder", 259, 9); + player.getPacketDispatch().sendString("Destinations", 259, 1); + player.getPacketDispatch().sendString(" Shilo Village", 259, 2); + player.getPacketDispatch().sendString("Warrior's Guild", 259, 3); + player.getPacketDispatch().sendString("Dagganoth Kings", 259, 4); + player.getPacketDispatch().sendString("God Wars Dungeon", 259, 5); + player.getPacketDispatch().sendString("Minigames", 259, 6); + player.getPacketDispatch().sendString(" Barbarian Assault", 259, 23); + player.getPacketDispatch().sendString("Blast Furnace", 259, 24); + player.getPacketDispatch().sendString("Burthorpe Games Room", 259, 25); + player.getPacketDispatch().sendString("Castle Wars", 259, 26); + player.getPacketDispatch().sendString(" Clan Wars", 259, 19); + player.getPacketDispatch().sendString("Duel Arena", 259, 20); + player.getPacketDispatch().sendString("Fishing Trawler", 259, 21); + player.getPacketDispatch().sendString("Fist of Guthix", 259, 22); + player.getPacketDispatch().sendString("Nightmare Zone", 259, 12); + player.getPacketDispatch().sendString(" Pest Control", 259, 11); + player.getPacketDispatch().sendString("Pyramid Plunder", 259, 13); + player.getPacketDispatch().sendString("Shades of Mort'ton", 259, 14); + player.getPacketDispatch().sendString("Stealing Creation", 259, 28); + player.getPacketDispatch().sendString(" Trouble Brewing", 259, 27); + player.getPacketDispatch().sendString("TzHaar Fight Pit", 259, 29); + player.getPacketDispatch().sendString("", 259, 30); + player.getPacketDispatch().sendString("", 259, 16); + player.getPacketDispatch().sendString("", 259, 15); + player.getPacketDispatch().sendString("", 259, 17); + player.getPacketDispatch().sendString("", 259, 18); + for (int i = 15; i < 19; i ++) { + player.getPacketDispatch().sendString("", 259, i); + } + } + + /** + * Holds all the optiosn for the minigame group finder. + * @author Torchic + * + */ + public enum MinigameOptions { + + /** + * Destinations + */ + SHILO_VILLAGE(2, Location.create(2876, 2954, 0)), + WARRIORS_GUILD(3, Location.create(2878, 3546, 0)), + DAGGANOTH_KINGS(4, Location.create(2524, 3739, 0)), + GOD_WARS_DUNGEON(5, Location.create(2898, 3712, 0)), + + /** + * Minigames + */ + BARBARIAN_ASSAULT(23, Location.create(2520, 3570, 0)), + BLAST_FURNACE(24, Location.create(1950, 4968, 0)), + BURTHORPE_GAMES_ROOM(25, Location.create(2899, 3563, 0)), + CASTLE_WARS(26, Location.create(2442, 3089, 0)), + CLAN_WARS(19, Location.create(3273, 3686, 0)), + DUEL_ARENA(20, Location.create(3365, 3265, 0)), + FISHING_TRAWLER(21, Location.create(2658, 3158, 0)), + FIST_OF_GUTHIX(22, Location.create(1675, 5599, 0)), + NIGHTMARE_ZONE(12, Location.create(3184, 3945, 0)), + PEST_CONTROL(11, Location.create(2659, 2676, 0)), + PYRAMID_PLUNDER(13, Location.create(3289, 2787, 0)), + SHADES_OF_MORTTON(14, Location.create(3504, 3284, 0)), + TROUBLE_BREWING(27, Location.create(3222, 3222, 0)), + STEALING_CREATION(28, Location.create(3135, 3627, 0)), + FIGHT_PITS(29, Location.create(2400, 5178, 0)); + + /** + * The option (button) id of the teleport. + */ + private int optionId; + + /** + * The location to send the player. + */ + private Location tile; + + /** + * Constructs a new {@Code MinigameOptions} {@Code Object} + * @param optionId The option id. + * @param tile The location tile. + */ + MinigameOptions(int optionId, Location tile) { + this.optionId = optionId; + this.tile = tile; + } + + /** + * Gets the location. + * @return + */ + public Location getLocation() { + return tile; + + } + + /** + * Gets the telport option id. + * @return + */ + public int getTeleportId() { + return optionId; + } + + /** + * Iterates through the options to find the correct teleport based on option id. + * @param optionId The option id. + * @return + */ + public static MinigameOptions getTeleportOptions(int optionId) { + for (MinigameOptions tele : MinigameOptions.values()) { + if (tele.getTeleportId() == optionId) { + return tele; + } + } + return null; + } + } + + /** + * Teleports the player to the location based on the componentId + * + * @param player + * @param buttonId + * @return true if teleport exists + */ + public static boolean teleport(final Player player, int buttonId) { + MinigameOptions option = MinigameOptions.getTeleportOptions(buttonId); + if (option == null || option.getLocation() == new Location(3222, 3222, 0)) { + player.sendMessage("Location has not been added!"); + return false; + } + player.getTeleporter().send(option.getLocation(), TeleportType.NORMAL, 1); + player.removeAttribute("minigameFinder:open"); + player.getInterfaceManager().openTab(2, new Component(274)); + player.getPacketDispatch().sendString("Minigame Group Finder", 274, 5); + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/travel/canoe/Canoe.java b/Server/src/main/java/Server/core/game/content/global/travel/canoe/Canoe.java new file mode 100644 index 000000000..5d900cb66 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/canoe/Canoe.java @@ -0,0 +1,79 @@ +package core.game.content.global.travel.canoe; + +/** + * Represents a canoe to craft. + * @author 'Vexia + * @date 09/11/2013 + */ +public enum Canoe { + LOG(12, 30, 30), + DUGOUT(27, 60, 31), + STABLE_DUGOUT(42, 90, 32), + WAKA(57, 150, 33); + + /** + * Constructs a new {@code Canoe.java} {@code Object}. + * @param level the woodcutting level requirement. + * @param experience the experience. + * @param child the child. + */ + Canoe(final int level, final double experience, final int child) { + this.level = level; + this.experience = experience; + this.child = child; + } + + /** + * Represents the woodcutting level requirement to craft the canoe. + */ + private final int level; + + /** + * Represents the experience received for crafting the canoe. + */ + private final double experience; + + /** + * Represents the child's id on the interface. + */ + private final int child; + + /** + * Gets the woodcutting level requirement. + * @return The required level. + */ + public int getRequiredLevel() { + return level; + } + + /** + * Gets the experience received. + * @return The experience amount. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the child. + * @return The child. + */ + public int getChild() { + return child; + } + + /** + * Method used to get the canoe from the child. + * @param child the child. + * @return True if so + */ + public static Canoe getCanoeFromChild(final int child) { + for (Canoe canoe : values()) { + if(canoe.getChild() == child) + { + return canoe; + } + } + return null; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/travel/canoe/CanoeExtension.java b/Server/src/main/java/Server/core/game/content/global/travel/canoe/CanoeExtension.java new file mode 100644 index 000000000..3589b4810 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/canoe/CanoeExtension.java @@ -0,0 +1,456 @@ +package core.game.content.global.travel.canoe; + +import core.game.component.Component; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.tools.RandomFunction; + +/** + * Represents a class that i used to hold relative information of the states of a canoe for a player. + * @author Vexia + * + */ +public final class CanoeExtension { + + /** + * Represents the canoe shaping component. + */ + private static final Component shape = new Component(52); + + /** + * Represents the destination selection interface component. + */ + private static final Component destinationSelector = new Component(53); + + /** + * Represents the animation of pushing a canoe. + */ + private static final Animation PUSH = new Animation(3301); + + /** + * Represents the animation of rowing a canoe. + */ + @SuppressWarnings("unused") + private static final Animation ROW = new Animation(3302); + + /** + * Represents the animation of falling over. + */ + private static final Animation FALL = new Animation(3303); + + /** + * Represents the animation of a floating canoe. + */ + private static final Animation FLOAT = new Animation(3304); + + /** + * Represents the animation of a sinking canoe. + */ + @SuppressWarnings("unused") + private static final Animation SINK = new Animation(3305); + + /** + * Represents multiple config base ids of different states of canoes. + */ + private static final int[] CONFIGS = new int[] { 9, 10, 1, 5, 11 }; + + /** + * Represents the shaping configs. + */ + private static final int[][] shapeConfigs = new int[][] {{ 9, 3 }, {10, 2 }, { 8, 5 }}; + + /** + * Represents the boat childs (indexes) + */ + private static final int[] boatChilds = new int[] { 47, 48, 3, 6, 49 }; + + /** + * Represents the location childs (indexes) + */ + private static final int[] locationChilds = new int[] { 50, 47, 44, 36 }; + + /** + * Represents the maximum distances that every canoe type can travel (indexes) + */ + private static final int[] maxDistances = new int[] { 1, 2, 3, 4 }; + + /** + * Represents the player instance. + */ + private final Player player; + + /** + * Represents the stage the player is at with crafting a canoe.(1=fallen, + * 2=crafted,3=floating) + */ + private int stage; + + /** + * Represents the current canoe station the {@link #player} is at. + */ + private CanoeStation currentStation; + + /** + * Represents the current canoe. + */ + private Canoe canoe; + + /** + * Constructs a new {@code CanoeExtension} {@code Object}. + * @param player the player. + */ + public CanoeExtension(final Player player) { + this.player = player; + } + + /** + * Method used to get the extension of this class, if its already there we + * return it if not we create a new instance which is added to the player. + * @param player the player. + * @return the CanoeExtension + */ + public static CanoeExtension extension(final Player player) { + CanoeExtension extension = player.getExtension(CanoeExtension.class); + if (extension == null) { + extension = new CanoeExtension(player); + player.addExtension(CanoeExtension.class, extension); + } + player.varpManager.get(674).setSave(false); + return extension; + } + + /** + * Method used to chop down a tree. + * @param object the object. + */ + public final void chopTree(final GameObject object) { + final CanoeStation station = CanoeStation.getStationByObject(object); + final SkillingTool axe = getTool(); + if (axe == null) { + player.getPacketDispatch().sendMessage("You do not have an axe which you have the woodcutting level to use."); + return; + } + if (player.getSkills().getLevel(Skills.WOODCUTTING) < 12) { + player.getPacketDispatch().sendMessage("You need a woodcutting level of at least 12 to chop down this tree."); + return; + } + player.lock(3); + player.animate(axe.getAnimation()); + player.varpManager.get(675).setVarbit(17, station.ordinal() + 1).send(player); + player.varpManager.get(674).setVarbit(station.ordinal() * 8,9).send(player); + GameWorld.getPulser().submit(new Pulse(4, player) { + @Override + public boolean pulse() { + player.animate(new Animation(-1, Priority.HIGH)); + player.varpManager.get(674).setVarbit(station.ordinal() * 8, 10).send(player); + player.getPacketDispatch().sendObjectAnimation(object.getChild(player), FALL, false); + setCurrentStation(station); + setStage(1); + return true; + } + }); + } + + /** + * Method used to shape a canoe. + */ + public final void shapeCanoe() { + player.getInterfaceManager().open(shape); + for (int i = 0; i < shapeConfigs.length; i++) { + if (player.getSkills().getLevel(Skills.WOODCUTTING) < Canoe.values()[i].getRequiredLevel()) { + continue; + } + player.getPacketDispatch().sendInterfaceConfig(52, shapeConfigs[i][0], true); + player.getPacketDispatch().sendInterfaceConfig(52, shapeConfigs[i][1], false); + } + } + + /** + * Method used to craft a canoe. + * @param canoe the canoe. + */ + public final void craftCanoe(final Canoe canoe) { + if (player.getSkills().getLevel(Skills.WOODCUTTING) < canoe.getRequiredLevel()) { + player.getPacketDispatch().sendMessage("You need a woodcutting level of at least " + canoe.getRequiredLevel() + " to make this canoe."); + return; + } + player.getInterfaceManager().close(); + final SkillingTool axe = getTool(); + if (axe == null) { + player.getPacketDispatch().sendMessage("You do not have an axe which you have the woodcutting level to use."); + return; + } + player.lock(20); + player.animate(getAnimation(axe)); + player.getPulseManager().run(new Pulse(3) { + @Override + public boolean pulse() { + if (RandomFunction.random(canoe == Canoe.WAKA ? 8 : 6) == 1) { + if (currentStation == CanoeStation.EDGEVILLE && canoe == Canoe.WAKA) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 2, 10); + } + player.varpManager.get(674) + .setVarbit(currentStation.ordinal() * 8, currentStation.getCraftConfig(canoe,false)) + .send(player); + player.varpManager.get(675).setVarbit(17, currentStation.ordinal() + 1).send(player); + player.getSkills().addExperience(Skills.WOODCUTTING, canoe.getExperience()); + setCanoe(canoe); + setStage(2); + player.unlock(); + return true; + } + player.animate(getAnimation(axe)); + return false; + } + + @Override + public void stop() { + super.stop(); + player.animate(new Animation(-1, Priority.HIGH)); + player.unlock(); + } + }); + } + + /** + * Method used to set afloat the canoe. + * @param object the object. + */ + public final void setAfloat(final GameObject object) { + player.animate(PUSH); + player.varpManager.get(674) + .setVarbit(currentStation.ordinal() * 8, currentStation.getCraftConfig(canoe,true)) + .send(player); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + if (counter == 1) { + player.getPacketDispatch().sendObjectAnimation(object, FLOAT, false); + player.varpManager.get(674) + .setVarbit(currentStation.ordinal() * 8, currentStation.getCraftConfig(canoe,true)) + .send(player); + setStage(3); + } + counter += 1; + return false; + } + }); + } + + /** + * Method used to travel to a canoe station. + * @param destinationStation the station to travel to. + */ + public final void travel(final CanoeStation destinationStation) { + player.getInterfaceManager().close(); + if (player.getFamiliarManager().hasFamiliar()) { + player.getPacketDispatch().sendMessage("You can't take a follower on a canoe."); + return; + } + player.lock(18); + GameWorld.getPulser().submit(new Pulse(1) { + int count = 0; + + @Override + public boolean pulse() { + switch (count++) { + case 1: + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 3: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 11, 12); + break; + case 16: + player.getProperties().setTeleportLocation(destinationStation.getDestination()); + break; + case 17: + + player.getInterfaceManager().close(); + player.getInterfaceManager().restoreTabs(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getPacketDispatch().sendMessage("You arrive " + (destinationStation != CanoeStation.WILDERNESS ? "at " + destinationStation.getName() + "." : "in the wilderness. There are no trees suitable to make a canoe.")); + player.getPacketDispatch().sendMessage(destinationStation != CanoeStation.WILDERNESS ? "Your canoe sinks into the water after the hard journey." : "Your canoe sinks into the water after the hard journey. Looks like you're"); + if (destinationStation == CanoeStation.WILDERNESS) { + player.getPacketDispatch().sendMessage("walking back."); + } + setCanoe(null); + player.varpManager.get(674).setVarbit(currentStation.ordinal() * 8,0).send(player); + setCurrentStation(null); + setStage(0); + player.unlock(); + player.getInterfaceManager().closeOverlay(); + return true; + } + return false; + } + + }); + } + + /** + * Method used to select the destination. + */ + public final void selectDestination() { + player.getInterfaceManager().open(destinationSelector); + int stationIndex = currentStation.ordinal(); + player.getPacketDispatch().sendInterfaceConfig(53, boatChilds[stationIndex], true); + player.getPacketDispatch().sendInterfaceConfig(53, locationChilds[stationIndex], false); + int maxDistance = maxDistances[canoe.ordinal()]; + for (int i = 0; i < CanoeStation.values().length; i++) { + if (Math.abs(currentStation.ordinal() - i) > maxDistance) { + player.getPacketDispatch().sendInterfaceConfig(53, boatChilds[i], true); + } + } + if (canoe != Canoe.WAKA) { + player.getPacketDispatch().sendInterfaceConfig(53, 49, true); + } + } + + /** + * Method used to get the axe to use. + */ + private SkillingTool getTool() { + SkillingTool tool = null; + if (checkTool(SkillingTool.DRAGON_AXE)) { + tool = SkillingTool.DRAGON_AXE; + } else if (checkTool(SkillingTool.RUNE_AXE)) { + tool = SkillingTool.RUNE_AXE; + } else if (checkTool(SkillingTool.ADAMANT_AXE)) { + tool = SkillingTool.ADAMANT_AXE; + } else if (checkTool(SkillingTool.MITHRIL_AXE)) { + tool = SkillingTool.MITHRIL_AXE; + } else if (checkTool(SkillingTool.BLACK_AXE)) { + tool = SkillingTool.BLACK_AXE; + } else if (checkTool(SkillingTool.STEEL_AXE)) { + tool = SkillingTool.STEEL_AXE; + } else if (checkTool(SkillingTool.IRON_AXE)) { + tool = SkillingTool.IRON_AXE; + } else if (checkTool(SkillingTool.BRONZE_AXE)) { + tool = SkillingTool.BRONZE_AXE; + } + return tool; + } + + /** + * Checks if the player has a tool and if he can use it. + * @param tool The tool. + * @return {@code True} if the tool is usable. + */ + private boolean checkTool(SkillingTool tool) { + if (player.getSkills().getStaticLevel(Skills.WOODCUTTING) < tool.getLevel()) { + return false; + } + if (player.getEquipment().getNew(3).getId() == tool.getId()) { + return true; + } + return player.getInventory().contains(tool.getId(), 1); + } + + /** + * Method used to get the shaping animation of a tool. + * @param tool the tool. + * @return the animation. + */ + private Animation getAnimation(final SkillingTool tool) { + Animation animation = null; + switch (tool) { + case BRONZE_AXE: + animation = Animation.create(3291); + break; + case IRON_AXE: + animation = Animation.create(3290); + break; + case STEEL_AXE: + animation = Animation.create(3289); + break; + case BLACK_AXE: + animation = Animation.create(3288); + break; + case MITHRIL_AXE: + animation = Animation.create(3287); + break; + case ADAMANT_AXE: + animation = Animation.create(3286); + break; + case RUNE_AXE: + animation = Animation.create(3285); + break; + case DRAGON_AXE: + animation = Animation.create(3292); + break; + default: + break; + } + return animation; + } + + /** + * Gets the station. + * @return The station. + */ + public CanoeStation getCurrentStation() { + return currentStation; + } + + /** + * Sets the station. + * @param currentStation The station to set. + */ + public void setCurrentStation(CanoeStation currentStation) { + this.currentStation = currentStation; + } + + /** + * Gets the canoe. + * @return The canoe. + */ + public Canoe getCanoe() { + return canoe; + } + + /** + * Sets the canoe. + * @param canoe The canoe to set. + */ + public void setCanoe(Canoe canoe) { + this.canoe = canoe; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the stage. + * @return The stage. + */ + public int getStage() { + return stage; + } + + /** + * Sets the stage. + * @param stage The stage to set. + */ + public void setStage(int stage) { + this.stage = stage; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/global/travel/canoe/CanoeStation.java b/Server/src/main/java/Server/core/game/content/global/travel/canoe/CanoeStation.java new file mode 100644 index 000000000..eac1632a1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/canoe/CanoeStation.java @@ -0,0 +1,153 @@ +package core.game.content.global.travel.canoe; + +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.tools.StringUtils; + +/** + * Represents a Canoe location. + * @author 'Vexia + * @date 09/11/2013 + */ +public enum CanoeStation { + LUMBRIDGE(12163, 47, Location.create(3240, 3242, 0), new Location(3241, 3235, 0)), + CHAMPIONS_GUILD(12164, 48, Location.create(3199, 3344, 0), new Location(3200, 3341, 0)), + BARBARIAN_VILLAGE(12165, 3, Location.create(3109, 3415, 0), new Location(3110, 3409, 0)), + EDGEVILLE(12166, 6, Location.create(3132, 3510, 0), new Location(3130, 3508, 0)), + WILDERNESS(-1, 49, Location.create(3139, 3796, 0), null); + + /** + * Constructs a new {@code CanoeStation} {@code Object}. + * @param objectId the object id of the station. + * @param button the button representing the station. + * @param location the location of the station. + * @param destination the location to end at when the station is the destination. + */ + CanoeStation(final int objectId, final int button, final Location destination, final Location location) { + this.object = objectId; + this.button = button; + this.destination = destination; + this.objLocation = location; + } + + /** + * Represents the object id of this station. + */ + private final int object; + + /** + * Represents the button. + */ + private final int button; + + /** + * Represents the location to end at when the station is the destination. + */ + private final Location destination; + + /** + * Represents the location of the canoe station object. + */ + private final Location objLocation; + + /** + * Gets the object id of the station. + * @return The object. + */ + public int getObject() { + return object; + } + + /** + * Method used to get the formatted name of the station. + * @return the name. + */ + public String getName() { + return (this == BARBARIAN_VILLAGE || this == CHAMPIONS_GUILD ? "the " : "") + StringUtils.formatDisplayName(name()); + } + + /** + * Method used to get the CanoeStation by the GameObject. + * @param object the object. + * @return the CanoeStation. + */ + public static CanoeStation getStationByObject(final GameObject object) { + CanoeStation[] stations = values(); + for (CanoeStation station : stations) { + if (station.getObjLocation() != null && station.getObjLocation().equals(object.getLocation())) { + return station; + } + } + return null; + } + + /** + * Method used to get the config for a floating canoe. + * @param canoe the canoe. + * @return the config. + */ + public int getFloatConfig(final Canoe canoe) { + int value = 0; + switch (this) { + case BARBARIAN_VILLAGE: + return (canoe != Canoe.LOG ? 65536 * canoe.ordinal() : 0); + case CHAMPIONS_GUILD: + return (canoe != Canoe.LOG ? 256 * canoe.ordinal() : 0); + case EDGEVILLE: + return (canoe != Canoe.LOG ? 16777216 * canoe.ordinal() : 0); + case LUMBRIDGE: + return (canoe != Canoe.LOG ? canoe.ordinal() : 0); + default: + break; + } + return value; + } + + /** + * Method used to get the config for a crafted canoe. + * @param canoe the canoe. + * @return the config. + */ + public int getCraftConfig(final Canoe canoe, boolean floating) { + return 1 + (canoe.ordinal() + (floating? 10 : 0)); + } + + /** + * Method used to get the canoe station from the button. + * @param button the button. + * @return the station. + */ + public static CanoeStation getStationFromButton(final int button) { + CanoeStation[] stations = values(); + for (CanoeStation station : stations) { + if (station.button == button) { + return station; + } + } + return null; + } + + /** + * Gets the buttons. + * @return the buttons. + */ + public int getButton() { + return button; + } + + /** + * Gets the destination. + * @return The destination. + */ + public Location getDestination() { + return destination; + } + + /** + * Gets the objLocation. + * @return The objLocation. + */ + public Location getObjLocation() { + return objLocation; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/travel/glider/GliderPulse.java b/Server/src/main/java/Server/core/game/content/global/travel/glider/GliderPulse.java new file mode 100644 index 000000000..35b6cdf80 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/glider/GliderPulse.java @@ -0,0 +1,81 @@ +package core.game.content.global.travel.glider; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.system.task.Pulse; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.CameraViewPacket; +import core.net.packet.out.MinimapState; + +/** + * Represents the pulse used for a glider. + * + * @author 'Vexia + */ +public final class GliderPulse extends Pulse { + + /** + * Represents the player. + */ + private final Player player; + + /** + * Represents the glider. + */ + private final Gliders glider; + + /** + * Represents the count. + */ + private int count; + + /** + * Constructs a new {@code GliderPulse.java} {@Code Object} + * + * @param delay + */ + public GliderPulse(int delay, Player player, Gliders glider) { + super(delay, player); + this.player = player; + this.glider = glider; + player.lock(); + } + + @Override + public boolean pulse() { + final boolean crash = glider == Gliders.LEMANTO_ADRA; + if (count == 1) { + player.varpManager.get(153).setVarbit(0,glider.getConfig()).send(player); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + } else if (count == 2 && crash) { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.SHAKE, 4, 4, 1200, 4, 4)); + player.getPacketDispatch().sendMessage("The glider almost gets blown from its path as it withstands heavy winds."); + } + if (count == 3) { + player.getInterfaceManager().openOverlay(new Component(115)); + } else if (count == 4) { + player.unlock(); + player.getProperties().setTeleportLocation(glider.getLocation()); + } else if (count == 5) { + if (crash) { + player.getPacketDispatch().sendMessage("The glider becomes uncontrolable and crashes down..."); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 0, 0)); + } + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().close(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.varpManager.get(153).setVarbit(0,0).send(player); + // Use the gnome glider to travel to Karamja + if (!crash && glider == Gliders.GANDIUS) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 11); + } + return true; + } + count++; + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/travel/glider/Gliders.java b/Server/src/main/java/Server/core/game/content/global/travel/glider/Gliders.java new file mode 100644 index 000000000..ae44c920a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/glider/Gliders.java @@ -0,0 +1,126 @@ +package core.game.content.global.travel.glider; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Represents an enum of glider locations. + * @author 'Vexia + */ +public enum Gliders { + TA_QUIR_PRIW(16, Location.create(2465, 3501, 3), 9, 3809), + SINDARPOS(17, Location.create(2848, 3497, 0), 1, 3810), + LEMANTO_ADRA(18, Location.create(3321, 3427, 0), 3, -1), + AR_HEWO(19, Location.create(3278, 3212, 0), 4, 3812), + LEMANTOLLY_UNDRI(20, Location.create(2544, 2970, 0), 10, 3813), + GANDIUS(15, Location.create(2972, 2969, 0), 8, 3811); + + /** + * The button of the location. + */ + private final int button; + + /** + * The location to fly to. + */ + private final Location location; + + /** + * The config value. + */ + private final int config; + + /** + * The npc. + */ + private final int npc; + + /** + * Constructs a new {@code Gliders.java} {@Code Object} + * @param button the button. + * @param location the location. + * @param config the config. + * @param npc the npc. + */ + Gliders(int button, Location location, int config, int npc) { + this.button = button; + this.location = location; + this.config = config; + this.npc = npc; + } + + /** + * Sends the config. + * @param asNpc the npc. + * @param player the player. + */ + public static void sendConfig(NPC asNpc, Player player) { + Gliders g = forNpc(asNpc.getId()); + if (g == null) { + return; + } + player.getConfigManager().set(153, g.getConfig()); + } + + /** + * Gets the glider by the npc. + * @param npc the npc. + * @return the gliders. + */ + public static Gliders forNpc(int npc) { + for (Gliders g : values()) { + if (g.getNpc() == npc) { + return g; + } + } + return null; + } + + /** + * Gets the button. + * @return The button. + */ + public int getButton() { + return button; + } + + /** + * Gets the location. + * @return The location. + */ + public Location getLocation() { + return location; + } + + /** + * Gets the config. + * @return The config. + */ + public int getConfig() { + return config; + } + + /** + * Gets the flider value for the button id. + * @param id the id. + * @return the value. + */ + public static Gliders forId(int id) { + for (Gliders i : Gliders.values()) { + if (i.getButton() == id) { + return i; + } + } + return null; + } + + /** + * Gets the npc. + * @return the npc + */ + public int getNpc() { + return npc; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/global/travel/ship/ShipCharter.java b/Server/src/main/java/Server/core/game/content/global/travel/ship/ShipCharter.java new file mode 100644 index 000000000..cf7776a74 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/ship/ShipCharter.java @@ -0,0 +1,338 @@ +package core.game.content.global.travel.ship; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.tools.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a class used to charter ships. + * @author 'Vexia + */ +public final class ShipCharter { + + /** + * Represents the component of charting a ship. + */ + private final static Component COMPONENT = new Component(95); + + /** + * Represents the ring of charos item. + */ + private final static Item RING_OF_CHAROS = new Item(6465); + + /** + * Constructs a new {@code ShipCharter} {@code Object}. + */ + public ShipCharter() { + /** + * empty. + */ + } + + /** + * Method used to open the ship chartering interface. + * @param player the player. + */ + public static void open(final Player player) { + final Destination current = Destination.getFromBase(player.getLocation()); + if (current != null) { + int[] hiddenComponents = getHiddenComponents(player, current); + for (int component : hiddenComponents) { + player.getPacketDispatch().sendInterfaceConfig(95, component, true); + } + player.getInterfaceManager().open(COMPONENT); + } + } + + /** + * Method used to handle a ship charter. + * @param player the player. + * @param button the button. + */ + public static void handle(final Player player, final int button) { + final Destination destination = Destination.forButton(button); + if (destination == null) { + return; + } + final int cost = getCost(player, destination); + player.getInterfaceManager().close(); + player.getDialogueInterpreter().open(4651, Repository.findNPC(4651), destination, cost); + } + + /** + * Method used to get the cost of the charter. + * @param player the player. + * @param destination the destination. + * @return the cost. + */ + public static int getCost(final Player player, Destination destination) { + int cost = destination.getCost(player, destination); + if (player.getEquipment().containsItem(RING_OF_CHAROS)) {// TODO: cabin fever quest + cost -= Math.round((cost / 2.)); + } + return cost; + } + + /** + * Method used to get the hidden childs on the screen. + * @param player the player. + * @return the hidden childs. + */ + public static int[] getHiddenComponents(final Player player, Destination base) { + final Destination[] restrictions = new Destination[] { /** + * + * Destination.MOS_LE_HARMLESS, + */ + Destination.OO_GLOG, Destination.SHIPYARD, /* Destination.PORT_TYRAS, */ + Destination.CRANDOR }; + List childs = new ArrayList<>(); + for (Destination destination : restrictions) { + childs.add(destination.getXChild()); + childs.add(destination.getNameChild()); + } + childs.add(base.getXChild()); + childs.add(base.getNameChild()); + if (base == Destination.KARAMJA) { + childs.add(Destination.PORT_SARIM.getXChild()); + childs.add(Destination.PORT_SARIM.getNameChild()); + } + if (base == Destination.PORT_SARIM) { + childs.add(Destination.KARAMJA.getXChild()); + childs.add(Destination.KARAMJA.getNameChild()); + } + int[] arrayChilds = new int[childs.size()]; + for (int i = 0; i < arrayChilds.length; i++) { + arrayChilds[i] = childs.get(i); + } + return arrayChilds; + } + + /** + * Method used to get the component of ship chartering. + * @return the component.. + */ + public static Component getComponent() { + return COMPONENT; + } + + /** + * Represents the destination to travel to. + * @author 'Vexia + */ + public enum Destination { + CATHERBY(Location.create(2792, 3417, 1), 25, new int[] { 480, -1, 480, 625, 1600, 3250, 1000, 1600, 3200, 3400 }, Location.create(2797, 3414, 0), 3, 14), + PORT_PHASMATYS(Location.create(3705, 3503, 1), 24, new int[] { 3650, 3250, 1850, -1, -1, -1, 2050, 1850, 3200, 1100 }, Location.create(3702, 3502, 0), 2, 13), + CRANDOR(new Location(2792, 3417, 1), 32, new int[] { -1, 480, 480, 925, 400, 3650, 1600, 400, 3200, 3800 }, null, 10, 21), + BRIMHAVEN(Location.create(2763, 3238, 1), 28, new int[] { -1, 480, 480, 925, 400, 3650, 1600, 400, 3200, 3800 }, Location.create(2760, 3238, 0), 6, 17), + PORT_SARIM(Location.create(3038, 3189, 1), 30, new int[] { 1600, 1000, -1, 325, 1280, 650, 1280, 400, 3200, 1400 }, Location.create(3039, 3193, 0), 8, 19), + PORT_TYRAS(Location.create(2142, 3122, 0), 23, new int[] { 3200, 3200, 3200, 1600, 3200, 3200, 3200, 3200, -1, 3200 }, Location.create(2143, 3122, 0), 1, 12), + KARAMJA(Location.create(2957, 3158, 1), 27, new int[] { 200, 480, -1, 225, 400, 1850, -1, 200, 3200, 2000 }, Location.create(2954, 3156, 0), 5, 16), + PORT_KHAZARD(Location.create(2674, 3141, 1), 29, new int[] { 1600, 1000, -1, 325, 180, 650, 1280, 400, 3200, 1400 }, Location.create(2674, 3144, 0), 7, 18), + SHIPYARD(Location.create(3001, 3032, 0), 26, new int[] { 400, 1600, 200, 225, 720, 1850, 400, -1, 3200, 900 }, Location.create(3001, 3032, 0), 4, 15), + OO_GLOG(Location.create(2623, 2857, 0), 33, new int[] { 300, 3400, 2000, 550, 5000, 2800, 1400, 900, 3200, -1 }, Location.create(2622, 2857, 0), 11, 22), + MOS_LE_HARMLESS(Location.create(3671, 2931, 0), 31, new int[] { 725, 625, 1025, -1, 1025, -1, 325, 275, 1600, 500 }, Location.create(3671, 2933, 0), 9, 20); + + /** + * Constructs a new {@code ShipCharter} {@code Object}. + * @param location the location. + * @param button the button. + * @param costs the money. + * @param base the base. + * @param components the children. + */ + Destination(Location location, int button, int[] costs, final Location base, int... components) { + this.location = location; + this.button = button; + this.costs = costs; + this.base = base; + this.childs = components; + } + + /** + * Represents the location of the destination. + */ + private final Location location; + + /** + * Represents the button of the destination. + */ + private final int button; + + /** + * Represents the costs from destination to destination. + */ + private final int[] costs; + + /** + * Represents the base location(how we find where we're at) + */ + private final Location base; + + /** + * Represents the childs on the screen. + */ + private final int[] childs; + + /** + * Gets the location. + * @return The location. + */ + public Location getLocation() { + return location; + } + + /** + * Gets the button. + * @return The button. + */ + public int getButton() { + return button; + } + + /** + * Gets the moneys. + * @return The moneys. + */ + public int[] getCosts() { + return costs; + } + + /** + * Gets the base. + * @return The base. + */ + public Location getBase() { + return base; + } + + /** + * Gets the childs. + * @return The childs. + */ + public int[] getComponents() { + return childs; + } + + /** + * Gets the x component. + * @return the component. + */ + public int getXChild() { + return childs[0]; + } + + /** + * Gets the name component. + * @return the component. + */ + public int getNameChild() { + return childs[1]; + } + + /** + * Gets the cost of chartering a ship. + * @param player the player. + * @return the cost. + */ + public int getCost(final Player player, final Destination destination) { + final Destination current = Destination.getFromBase(player.getLocation()); + if (current == null) { + return 0; + } + final Destination[] costTable = new Destination[] { BRIMHAVEN, CATHERBY, KARAMJA, MOS_LE_HARMLESS, PORT_KHAZARD, PORT_PHASMATYS, PORT_SARIM, SHIPYARD, PORT_TYRAS, OO_GLOG }; + int index = 0; + for (int i = 0; i < costTable.length; i++) { + if (costTable[i] == destination) { + index = i; + break; + } + } + return current.getCosts()[index]; + } + + /** + * Method used to get the destination from the base. + * @param location the location. + * @return the destination. + */ + public static Destination getFromBase(Location location) { + for (Destination destination : Destination.values()) { + if (destination.getBase() == null) { + continue; + } + if (destination.getBase().getDistance(location) < 30) { + return destination; + } + } + return null; + } + + /** + * Method used to get the destination for the button id. + * @param button the button. + * @return the destination. + */ + public static Destination forButton(final int button) { + for (Destination destination : values()) { + if (destination.getButton() == button) { + return destination; + } + } + return null; + } + + /** + * Method used to sail the ship. + * @param player the player. + */ + public void sail(final Player player) { + player.lock(7); + Location start = player.getLocation(); + GameWorld.getPulser().submit(new Pulse(1) { + int count = 0; + + @Override + public boolean pulse() { + switch (count++) { + case 0: + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 2: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + break; + case 3: + player.getProperties().setTeleportLocation(getLocation()); + break; + case 5: + player.unlock(); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().restoreTabs(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getPacketDispatch().sendMessage("You pay the fare and sail to " + StringUtils.formatDisplayName(name()) + "."); + // Charter a ship from the shipyard in the far east of Karamja + if (start.withinDistance(Location.create(3001,3032,0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 17); + } + return true; + } + return false; + } + + }); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/global/travel/ship/ShipTravelPulse.java b/Server/src/main/java/Server/core/game/content/global/travel/ship/ShipTravelPulse.java new file mode 100644 index 000000000..473c3e88f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/ship/ShipTravelPulse.java @@ -0,0 +1,101 @@ +package core.game.content.global.travel.ship; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.system.task.Pulse; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; + +/** + * Represents a pulse used to travel a player to a location. + * @author Vexia + */ +public final class ShipTravelPulse extends Pulse { + + /** + * Represents the player instance. + */ + private final Player player; + + /** + * Represents the ship we're using. + */ + private final Ships ship; + + /** + * Represents the current counter. + */ + private int counter = 0; + + /** + * Constructs a new {@code ShipTravelPulse.java} {@code Object}. + * @param player the Player. + */ + public ShipTravelPulse(Player player, Ships ship) { + super(1); + this.player = player; + this.ship = ship; + } + + @Override + public boolean pulse() { + switch (counter++) { + case 0: + prepare(); + break; + case 1: + if (ship != Ships.PORT_SARIM_TO_CRANDOR) { + player.getProperties().setTeleportLocation(ship.getLocation()); + } + break; + default: + if (counter == ship.getDelay()) { + arrive(); + return true; + } + break; + } + return false; + } + + /** + * Method used to arrive at a location. + */ + private void arrive() { + player.unlock(); + player.getConfigManager().set(75, -1); + player.getInterfaceManager().close(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + if (!ship.getName().equals("Crandor")) { + player.getDialogueInterpreter().sendDialogue("The ship arrives at " + ship.getName() + "."); + player.getInterfaceManager().close(); + } else { + player.getInterfaceManager().open(new Component(317)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getInterfaceManager().openOverlay(new Component(544)); + player.getInterfaceManager().open(new Component(317)); + } + + if (ship == Ships.KARAMJAMA_TO_PORT_SARIM) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 0, 3); + } + if (ship == Ships.BRIMHAVEN_TO_ARDOUGNE) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 0, 4); + } + if (ship == Ships.CAIRN_ISLAND_TO_PORT_KHAZARD) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 6); + } + } + + /** + * Method used to prepare the player. + */ + private void prepare() { + player.lock(ship.getDelay() + 1); + player.getInterfaceManager().open(new Component(299)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getConfigManager().set(75, ship.getConfig()); + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/travel/ship/Ships.java b/Server/src/main/java/Server/core/game/content/global/travel/ship/Ships.java new file mode 100644 index 000000000..1cc0d2598 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/travel/ship/Ships.java @@ -0,0 +1,109 @@ +package core.game.content.global.travel.ship; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Represents a ship to travel on. + * @author 'Vexia + */ +public enum Ships { + PORT_SARIM_TO_ENTRANA(Location.create(2834, 3331, 1), 1, 15, "Entrana"), + ENTRANA_TO_PORT_SARIM(Location.create(3048, 3234, 0), 2, 15, "Port Sarim"), + PORT_SARIM_TO_CRANDOR(Location.create(2849, 3238, 0), 3, 12, "Crandor"), + CRANDOR_TO_PORT_SARIM(Location.create(2834, 3335, 0), 4, 13, "Port Sarim"), + PORT_SARIM_TO_KARAMAJA(Location.create(2956, 3143, 1), 5, 9, "Karamja"), + KARAMJAMA_TO_PORT_SARIM(Location.create(3029, 3217, 0), 6, 8, "Port Sarim"), + ARDOUGNE_TO_BRIMHAVEN(Location.create(2775, 3234, 1), 7, 4, "Brimhaven"), + BRIMHAVEN_TO_ARDOUGNE(Location.create(2683, 3268, 1), 8, 4, "Ardougne"), + CAIRN_ISLAND_TO_PORT_KHAZARD(Location.create(2676, 3170, 0), 10, 8, "Port Khazard"), + PORT_KHAZARD_TO_SHIP_YARD(Location.create(2998, 3043, 0), 11, 23, "the Ship Yard"), + SHIP_YARD_TO_PORT_KHAZARD(Location.create(2676, 3170, 0), 12, 23, "Port Khazard"), + CAIRN_ISLAND_TO_PORT_SARIM(Location.create(3048, 3234, 0), 13, 17, "Port Sarim"), + PORT_SARIM_TO_PEST_CONTROL(Location.create(2663, 2676, 1), 14, 12, "Pest Control"), + PEST_TO_PORT_SARIM(Location.create(3041, 3198, 1), 15, 12, "Port Sarim"), + FELDIP_TO_KARAMJA(Location.create(2763, 2956, 0), 16, 10, "Karamja"), + KARAMJA_TO_FELDIP(Location.create(2763, 2956, 0), 17, 10, "Feldip"); + + /** + * Constructs a new {@code Ships} {@code Object}. + * @param location the destination location. + * @param config the config value. + */ + Ships(Location location, int config, int delay, final String name) { + this.location = location; + this.config = config; + this.delay = delay; + this.name = name; + } + + /** + * Represents the destination location of the ship. + */ + private final Location location; + + /** + * The config value. + */ + private final int config; + + /** + * The delay of the ship. + */ + private final int delay; + + /** + * Represents the name of returning. + */ + private final String name; + + /** + * Method used to sail across the sea. + * @param player the player. + * @param ship the ship. + */ + public static void sail(final Player player, final Ships ship) { + player.getPulseManager().run(new ShipTravelPulse(player, ship)); + } + + /** + * Method used to sail. + * @param player the player. + */ + public void sail(final Player player) { + player.getPulseManager().run(new ShipTravelPulse(player, this)); + } + + /** + * Gets the location. + * @return The location. + */ + public Location getLocation() { + return location; + } + + /** + * Gets the config. + * @return The config. + */ + public int getConfig() { + return config; + } + + /** + * Gets the delay. + * @return The delay. + */ + public int getDelay() { + return delay; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEvent.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEvent.kt new file mode 100644 index 000000000..fc28d7912 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEvent.kt @@ -0,0 +1,80 @@ +package core.game.content.global.worldevents + +import core.game.system.SystemLogger +import core.plugin.Plugin +import core.plugin.PluginManager +import java.util.* + +/** + * The class other world events should extend off of. + * @author Ceikry + */ +open class WorldEvent(var name: String) { + var plugins = PluginSet() + + /** + * if the event is active or not. Can be used to check dates or just always return true + * whatever you need for this specific event + */ + open fun checkActive(): Boolean { + return false + } + + /** + * Check to see if the event should trigger. An event trigger could spawn shooting stars, or a world boss + * or whatever kind of whacky shit you need it to do. + */ + open fun checkTrigger(): Boolean{ + return true + } + + /** + * Used to initialize the event, which loads all associated plugins. + * The WorldEventInitializer runs this if checkActive() returns true. + */ + open fun initialize(){ + plugins.initialize() + } + + /** + * Used to log world event messages in a standard and organized way. + */ + fun log(message: String){ + SystemLogger.logInfo("[World Events($name)] $message") + } + + /** + * Used to start, or "fire", world events. + */ + open fun fireEvent() {} +} + + +/** + * A class that holds a set of plugins that shouldn't be initialized by default. + * Can be used to initialize all of its plugins cleanly. + */ +class PluginSet(vararg val plugins: Plugin<*>){ + val set = ArrayList(plugins.asList()) + fun initialize() { + PluginManager.definePlugins(*set.toTypedArray()) + } + fun add(plugin: Plugin<*>){ + set.add(plugin) + } +} + +/** + * Static object for storing instances of loaded events. + */ +object WorldEvents { + private var events = hashMapOf() + + fun add(event: WorldEvent){ + events.put(event.name.toLowerCase(),event) + } + + fun get(name: String): WorldEvent?{ + return events.get(name.toLowerCase()) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEventInitializer.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEventInitializer.kt new file mode 100644 index 000000000..f4b9e48fe --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/WorldEventInitializer.kt @@ -0,0 +1,34 @@ +package core.game.content.global.worldevents + +import core.plugin.Initializable +import core.plugin.Plugin +import io.github.classgraph.ClassGraph +import io.github.classgraph.ClassInfo +import java.util.function.Consumer + +/** + * Responsible for initializing world events + * @author Ceikry + */ +@Initializable +class WorldEventInitializer : Plugin{ + override fun newInstance(arg: Any?): Plugin { + /** + * Here I used ClassGraph to scan the core.game.content.global.worldevents package for subclasses of the WorldEvent class and + * then initialize them if their active setting evaluates to true. This makes it so we don't have to manually add them to + * a list. It also prevents unnecessary plugins from being loaded if an event isn't currently active. + */ + + val result = ClassGraph().enableClassInfo().whitelistPackages("core.game.content.global.worldevents").scan() + result.getSubclasses("core.game.content.global.worldevents.WorldEvent").forEach(Consumer { p: ClassInfo -> + val c = p.loadClass().newInstance() as WorldEvent + if(c.checkActive()) c.initialize().also { WorldEvents.add(c) } + }) + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/CandyRewardPlugin.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/CandyRewardPlugin.kt new file mode 100644 index 000000000..b2d56df9f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/CandyRewardPlugin.kt @@ -0,0 +1,28 @@ +package core.game.content.global.worldevents.holiday + +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.tools.RandomFunction +import core.plugin.CorePluginTypes.XPGainPlugin +import core.game.node.entity.skill.Skills +import core.tools.stringtools.colorize + +class CandyRewardPlugin : XPGainPlugin(){ + override fun run(player: Player, skill: Int, amount: Double) { + val awardCandy = RandomFunction.random(1,200) == 55 + val candy = Item(14084) + + if(awardCandy){ + if(!player.inventory.add(candy)){ + GroundItemManager.create(candy,player) + } + player.sendMessage(colorize("%OYou receive a candy while training ${Skills.SKILL_NAME[skill]}!")) + } + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/GrimDialogue.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/GrimDialogue.kt new file mode 100644 index 000000000..383f0a795 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/GrimDialogue.kt @@ -0,0 +1,78 @@ +package core.game.content.global.worldevents.holiday + +import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +class GrimDialogue(player: Player? = null) : DialoguePlugin(player){ + var firstSpeak = true + val candy = Item(14084) + override fun newInstance(player: Player?): DialoguePlugin { + return GrimDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + firstSpeak = !player.getAttribute("hween:grim_spoken",false) + + if(firstSpeak){ + npc("YOU! Yes.... you! Come here!") + stage = 0 + } else { + npc("Hello, again, adventurer...") + stage = 100 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player(FacialExpression.AFRAID,"W-what... what do you want with","me?").also { stage++ } + 1 -> npc("I want you.... I NEED you....").also { stage++ } + 2 -> npc("TO BRING ME CANDY! Yes, candy...").also { stage++ } + 3 -> player(FacialExpression.THINKING,"Candy...? You want me to bring","you... candy?").also { stage++ } + 4 -> npc("Yes, candy! Did I not speak clearly","enough?").also { stage++ } + 5 -> player(FacialExpression.ASKING,"Well how do I even get candy?").also { stage++ } + 6 -> npc("It seems my candy collection has been scattered","into everything in 2009Scape!").also { stage++ } + 7 -> npc("I broke open a rock earlier when I was moving","my chair here, and I found one!").also { stage++ } + 8 -> npc("I suspect some of the vile creatures of","2009Scape have gotten ahold of some as well.").also { stage++ } + 9 -> npc("I need YOU to go collect this for me.").also { stage++ } + 10 -> player(FacialExpression.THINKING,"And what will I get in exchange?").also { stage++ } + 11 -> npc("Well I won't KILL YOU for starters.").also { stage++ } + 12 -> player(FacialExpression.ANGRY_WITH_SMILE, "Is that it?!").also { stage++ } + 13 -> npc("Well, I guess I could also give you this","odd currency. I suspect one of these mortal","shops allows you to buy holiday items with it.").also { stage++ } + 14 -> player(FacialExpression.AMAZED, "YOU MEAN CREDITS?!").also { stage++ } + 15 -> npc("Yes, I suppose I do.").also { stage++ } + 16 -> npc("I will give you 2 credits for every candy","you bring me.").also { stage++ } + 17 -> npc("NOW GET TO WORK!").also { player.setAttribute("/save:hween:grim_spoken",true); stage = 1000 } + + + 100 -> npc("I do hope you have... candy for me?").also { stage++ } + 101 -> if(player.inventory.containsItem(candy)){ + player("Yes, I do! Here you go.").also { stage = 150 } + } else { + player(FacialExpression.SAD, "No, I don't.").also { stage++ } + } + 102 -> npc("THEN GET TO WORK!").also { player.impactHandler.manualHit(player,5,ImpactHandler.HitsplatType.DISEASE); stage++ } + 103 -> player("YES SIR!").also { stage = 1000 } + + + 150 -> { + val candies = player.inventory.getAmount(candy) + player.inventory.remove(Item(candy.id,candies)) + player.details.credits += candies * 2 + npc("Thank you, adventurer, I have awarded you","with ${candies * 2} 'credits.'").also { stage = 1000 } + } + + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(6390) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/SimpleHalloweenEvent.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/SimpleHalloweenEvent.kt new file mode 100644 index 000000000..41122ce7c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/holiday/SimpleHalloweenEvent.kt @@ -0,0 +1,30 @@ +package core.game.content.global.worldevents.holiday + +import core.game.node.entity.npc.NPC +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.content.global.worldevents.PluginSet +import core.game.content.global.worldevents.WorldEvent +import java.util.* + +class SimpleHalloweenEvent : WorldEvent("hween"){ + override fun checkActive(): Boolean { + return Calendar.getInstance().get(Calendar.MONTH) == Calendar.OCTOBER + } + + override fun initialize() { + plugins = PluginSet( + CandyRewardPlugin(), + GrimDialogue() + ) + val grim = NPC(6390, Location(3247,3198)) + grim.isWalks = false + grim.walkRadius = 0 + grim.isNeverWalks = true + grim.init() + super.initialize() + GameWorld.settings?.message_model = 800 + GameWorld.settings?.message_string = "A mysterious figure has appeared in lumbridge cemetery! You should go investigate!" + log("Initialized.") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/LarryHandler.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/LarryHandler.kt new file mode 100644 index 000000000..b6e8b31cb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/LarryHandler.kt @@ -0,0 +1,82 @@ +package core.game.content.global.worldevents.penguinhns + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.content.dialogue.DialoguePlugin + +class LarryHandler(player: Player? = null) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + options("Can I have a spy notebook?","Can I have a hint?","I'd like to turn in my points.").also { stage = 0; return true } + } + + override fun newInstance(player: Player?): DialoguePlugin { + return LarryHandler(player) + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + class HintPulse : Pulse(){ + override fun pulse(): Boolean { + val hint = PenguinManager.penguins.random().hint + player.sendMessage("Here, I know one is...") + player.sendMessage(hint) + return true + } + } + when(stage){ + 0 -> when(buttonId){ + 1 -> player("Can I have a spy notebook?").also { stage++ } + 2 -> player("Can I have a hint?").also { stage = 10 } + 3 -> player("I'd like to turn in my points.").also { stage = 20 } + } + + //Spy notebook + 1 -> npc("Sure!").also { player.inventory.add(Item(13732));stage = 1000 } + + //Hint + 10 -> npc("Yes, but I will have to write it down","for you so these penguins don't overhear.").also { GameWorld.submit(HintPulse()); stage = 1000 } + + //Point turn-in + 20 -> if(player.getAttribute("phns:points",0) > 0) npc("Sure thing, what would you like to be","rewarded with?").also { stage++ } else npc("Uh, you don't have any points","to turn in.").also{stage = 1000} + + 21 -> options("Coins","Experience").also { stage++ } + 22 -> when(buttonId){ + 1 -> player.inventory.add(Item(995, 6500 * player.getAttribute("phns:points",0))).also { player("Thanks!"); player.removeAttribute("phns:points");stage = 1000 } + 2 -> { + player.setAttribute("caller",this) + player.interfaceManager.open(Component(134).setCloseEvent { player1: Player?, c: Component? -> + player.interfaceManager.openDefaultTabs() + player.removeAttribute("lamp") + player.unlock() + true + }).also { end() } + } + } + + 1000 -> end() + } + return true + } + + override fun handleSelectionCallback(skill: Int, player: Player?) { + val points = player?.getAttribute("phns:points",0) + if(points == 0){ + player.sendMessage("Sorry, but you have no points to redeem.") + return + } + + val level = player?.skills?.getLevel(skill) ?: 0 + System.out.println("Level: $level") + val expGained = points?.toDouble()?.times((level * 25)) + System.out.print("exp: $expGained") + player?.skills?.addExperience(skill,expGained!!) + player?.setAttribute("/save:phns:points",0) + } + + override fun getIds(): IntArray { + return intArrayOf(5424) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/NotebookHandler.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/NotebookHandler.kt new file mode 100644 index 000000000..54f039475 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/NotebookHandler.kt @@ -0,0 +1,22 @@ +package core.game.content.global.worldevents.penguinhns + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Plugin + +class NotebookHandler : OptionHandler(){ + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + val total = player?.getAttribute("phns:points",0) + val weekly = player?.getAttribute("phns:weekly",0) + player?.dialogueInterpreter?.sendDialogue("Total points: $total","Penguins spied this week: $weekly") + return true + } + + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(13732).handlers["option:read"] = this + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent.kt new file mode 100644 index 000000000..7fff1a0f7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinHNSEvent.kt @@ -0,0 +1,50 @@ +package core.game.content.global.worldevents.penguinhns + +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.content.global.worldevents.PluginSet +import core.game.content.global.worldevents.WorldEvent +import core.game.content.global.worldevents.WorldEvents + +class PenguinHNSEvent : WorldEvent("penguin-hns"){ + val manager = PenguinManager() + var lastTrigger: Int = 0 + var tickDelay = if(GameWorld.settings?.isDevMode == true) 100 else 100000 + + override fun checkActive(): Boolean { + return true //this event is always active. + } + + override fun checkTrigger(): Boolean { + return GameWorld.ticks - lastTrigger >= tickDelay + } + + override fun initialize() { + plugins = PluginSet( + LarryHandler(), + NotebookHandler(), + PenguinSpyingHandler() + ) + super.initialize() + GameWorld.Pulser.submit(PenguinRegeneration()) + log("Penguin HNS initialized.") + } + + override fun fireEvent() { + log("Reshuffling Penguins...") + manager.rebuildVars() + lastTrigger = GameWorld.ticks + log("Penguins Reshuffled.") + } + + class PenguinRegeneration : Pulse(25){ + override fun pulse(): Boolean { + val event = WorldEvents.get("penguin-hns") + event ?: return true + + if(event.checkTrigger()) event.fireEvent() + return false + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinManager.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinManager.kt new file mode 100644 index 000000000..1a7b18aa7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinManager.kt @@ -0,0 +1,32 @@ +package core.game.content.global.worldevents.penguinhns + +import core.game.node.entity.npc.NPC +import core.game.system.SystemLogger +import core.game.world.map.Location +import java.util.* + +class PenguinManager{ + companion object { + var penguins = ArrayList() + var npcs = ArrayList() + val spawner = PenguinSpawner() + var tagMapping = HashMap>() + } + + fun rebuildVars() { + for(p in npcs){ + p.clear() + p.isActive = false + } + npcs.clear() + penguins = spawner.spawnPenguins(6) + tagMapping.clear() + for(p in penguins){ + tagMapping.put(p.loc, ArrayList()) + } + } + + fun log(message: String){ + SystemLogger.logInfo("[Penguins] $message") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpawner.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpawner.kt new file mode 100644 index 000000000..b7ac8ab9d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpawner.kt @@ -0,0 +1,56 @@ +package core.game.content.global.worldevents.penguinhns + +import core.game.node.entity.npc.NPC +import core.game.world.map.Location +import core.game.content.global.worldevents.WorldEvents +import kotlin.collections.ArrayList + +class PenguinSpawner { + val CACTUS = 8107 + val CRATE = 8108 + val BARREL = 8104 + val BUSH = 8105 + val ROCK = 8109 + val TOADSTOOL = 8110 + class Penguin(val id: Int, val hint: String, val loc: Location) + val penguins = arrayListOf( + Penguin(CACTUS,"...located in the northern desert.",Location.create(3310, 3157, 0)), + Penguin(BUSH,"...located between Fremennik and barbarians.",Location.create(2532, 3588, 0)), + Penguin(BUSH,"...located where banana smugglers dwell.",Location.create(2740, 3233, 0)), + Penguin(BUSH,"...located south of Ardougne.",Location.create(2456, 3092, 0)), + Penguin(BUSH,"...located deep in the jungle.",Location.create(2832, 3053, 0)), + Penguin(ROCK,"...located where the Imperial Guard train.",Location.create(2852, 3578, 0)), + Penguin(ROCK,"...located in the kingdom of Misthalin.",Location.create(3356, 3416, 0)), + Penguin(CRATE,"...located in the kingdom of Misthalin.",Location.create(3112, 3332, 0)), + Penguin(BUSH,"...located where eagles fly.",Location.create(2326, 3516, 0)), + Penguin(BARREL,"...located where no weapons may go.",Location.create(2806, 3383, 0)), + Penguin(ROCK,"...located near some ogres.",Location.create(2631, 2980, 0)), + Penguin(BUSH,"...located south of Ardougne.",Location.create(2513, 3154, 0)), + Penguin(BUSH,"...located near a big tree surrounded by short people.",Location.create(2387, 3451, 0)), + Penguin(BUSH,"...located in the kingdom of Asgarnia.",Location.create(2951, 3511, 0)), + Penguin(ROCK,"...located in the Kingdom of Asgarnia.",Location.create(3013, 3501, 0)), + Penguin(ROCK,"...located between Fremennik and barbarians.",Location.create(2532, 3630, 0)), + Penguin(CRATE,"...located in the Kingdom of Misthalin.",Location.create(3305, 3508, 0)), + Penguin(TOADSTOOL,"...located in the kingdom of Misthalin.",Location.create(3156, 3178, 0)), + Penguin(BUSH,"...located in the northern desert.",Location.create(3350, 3311, 0)), + Penguin(BUSH,"...located somewhere in the kingdom of Kandarin.",Location.create(2633, 3501, 0)), + Penguin(BUSH,"...located south of Ardougne.",Location.create(2440, 3206, 0)), + Penguin(CACTUS,"...located in the southern desert.",Location.create(3259, 3052, 0)), + Penguin(BUSH,"...located where wizards study.",Location.create(3112, 3149, 0)), + Penguin(TOADSTOOL,"...located in the fairy realm.",Location.create(2409, 4462, 0)) + ) + + fun spawnPenguins(amount: Int): ArrayList { + var event = WorldEvents.get("penguin-hns") as PenguinHNSEvent + var counter = 0 + val list = penguins.toMutableList() + val penguinList = ArrayList() + while(counter < amount){ + val peng = list.random() + penguinList.add(peng).also { NPC(peng.id,peng.loc).also {PenguinManager.npcs.add(it);it.isNeverWalks = true; it.isWalks = false}.init() } + list.remove(peng) + counter++ + } + return penguinList + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler.kt new file mode 100644 index 000000000..0394c3a04 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/penguinhns/PenguinSpyingHandler.kt @@ -0,0 +1,72 @@ +package core.game.content.global.worldevents.penguinhns + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.interaction.Option +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +class PenguinSpyingHandler : PluginInteraction(8107,8108,8104,8105,8109,8110){ + + class SpyPulse(val player: Player) : Pulse() { + var stage = 0 + val curPoints = player.getAttribute("phns:points",0) + val weeklyPoints = player.getAttribute("phns:weekly",0) + val WEEKLY_CAP = 10 + + val ANIMATION = Animation(10355) + + override fun pulse(): Boolean { + when(stage++){ + 0 -> player.lock().also { player.animator.animate(ANIMATION) } + 1 -> player.sendMessage("You manage to spy on the penguin.").also { player.setAttribute("/save:phns:points",curPoints + 1);player.setAttribute("/save:phns:weekly",weeklyPoints + 1);player.unlock();} + 2 -> if(weeklyPoints + 1 >= WEEKLY_CAP) player.setAttribute("/save:phns:date", ((System.currentTimeMillis() * 0.001) + 604800).toLong()) + 3 -> return true + } + return false + } + } + + override fun handle(player: Player?, npc: NPC?, option: Option?): Boolean { + class movePulse : MovementPulse(player,DestinationFlag.ENTITY.getDestination(player,npc)){ + override fun pulse(): Boolean { + player.let { player?.face(npc);GameWorld.submit(SpyPulse(player!!)) } + return true + } + } + if(option?.name?.toLowerCase()?.equals("spy-on")!!){ + val currentDate = System.currentTimeMillis() * 0.001 + val playerDate: Long = player?.getAttribute("phns:date",0L)!! + if(currentDate < playerDate){ + player.sendMessage("You have already earned your maximum number of points this week.").also { return true } + } else if(playerDate != 0L){ + player.removeAttribute("phns:date") + player.removeAttribute("phns:weekly") + } + if(PenguinManager.tagMapping[npc?.location]?.contains(player.username)!!){ + player.sendMessage("You've already tagged this penguin.") + } else { + GameWorld.submit(movePulse()) + PenguinManager.tagMapping[npc?.location]?.add(player.username) + } + return true + } + return false + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.NPC) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardEntry.java b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardEntry.java new file mode 100644 index 000000000..0996dd66a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardEntry.java @@ -0,0 +1,10 @@ +package core.game.content.global.worldevents.shootingstar; + +public class ScoreboardEntry{ + public String playerName; + public int time; + public ScoreboardEntry(String player, int time){ + this.playerName = player; + this.time = time; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardHandler.java b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardHandler.java new file mode 100644 index 000000000..bc68f1fff --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardHandler.java @@ -0,0 +1,31 @@ +package core.game.content.global.worldevents.shootingstar; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.plugin.Plugin; + +public class ScoreboardHandler extends OptionHandler { + int index = 0; + int ifaceid = ShootingStarScoreboard.iface.getId(); + @Override + public boolean handle(Player player, Node node, String option) { + ScoreboardManager.getEntries().forEach(e -> { + player.getPacketDispatch().sendString("" + Math.floor(((GameWorld.getTicks() - e.time) / 0.6) / 60) + " minutes ago",ifaceid,index + 6); + player.getPacketDispatch().sendString(e.playerName,ifaceid,index + 11); + index++; + }); + index = 0; + player.getInterfaceManager().open(ShootingStarScoreboard.iface); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(38669).getHandlers().put("option:read",this); + + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardManager.java b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardManager.java new file mode 100644 index 000000000..e06962d46 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ScoreboardManager.java @@ -0,0 +1,23 @@ +package core.game.content.global.worldevents.shootingstar; + +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.world.GameWorld; + +import java.util.ArrayList; +import java.util.List; + +public class ScoreboardManager { + public static List entries = new ArrayList<>(); + + public static void submit(Player player){ + if(entries.size() == 5){ + entries.remove(0); + } + entries.add(new ScoreboardEntry(player.getUsername(), GameWorld.getTicks())); + } + + public static List getEntries(){ + return entries; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStar.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStar.kt new file mode 100644 index 000000000..0d7d16137 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStar.kt @@ -0,0 +1,152 @@ +package core.game.content.global.worldevents.shootingstar + +import core.game.node.`object`.GameObject +import core.game.node.`object`.ObjectBuilder +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.world.map.Location +import core.game.world.repository.Repository + +/** + * Represents a shooting star object (Only ever initialized once) (ideally) + * @author Ceikry + */ +class ShootingStar(var level: ShootingStarType = ShootingStarType.values().random()){ + val crash_locations = hashMapOf( + "Canifis Bank" to Location.create(3504, 3487, 0), + "Crafting Guild" to Location.create(2940, 3280, 0), + "Falador East Bank" to Location.create(3030, 3349, 0), + "Rimmington mining site" to Location.create(2975, 3237, 0), + "Rimmington mine" to Location.create(2975, 3240, 0), + "Karamja mining site" to Location.create(2737, 3223, 0), + "Brimhaven mining site" to Location.create(2743, 3143, 0), + "South Crandor mining site" to Location.create(2822, 3239, 0), + "Karamja mining site" to Location.create(2854, 3032, 0), + "Shilo Village mining site" to Location.create(2826, 2997, 0), + "Relleka mining site" to Location.create(2682, 3700, 0), + "Ardougne mining site" to Location.create(2600, 3232, 0), + "Yanille Bank" to Location.create(2603, 3087, 0), + "Al Kharid bank" to Location.create(3276, 3176, 0), + "Al Kharid mining site" to Location.create(3296, 3297, 0), + "Duel Arena bank chest" to Location.create(3342, 3267, 0), + "Nardah mining site" to Location.create(3320, 2872, 0), + "Nardah bank" to Location.create(3434, 2888, 0), + "South-east Varrock mine" to Location.create(3292, 3353, 0), + "South-west Varrock mine" to Location.create(3176, 3362, 0), + "Varrock east bank" to Location.create(3259, 3407, 0), + "Lumbridge Swamp mine" to Location.create(3227, 3150, 0), + "Gnome stronghold Bank" to Location.create(2460, 3432, 0), + "North Edgeville mining site" to Location.create(3101, 3569, 0), + "Southern wilderness mine" to Location.create(3025, 3591, 0), + "Pirates' Hideout mine" to Location.create(3059, 3940, 0), + "Lava Maze mining site" to Location.create(3062, 3885, 0), + "Mage Arena bank" to Location.create(3093, 3962, 0) + ) + val starSprite = NPC(8091) + var location = "Canifis Bank" + var maxDust = level.totalStardust + var dustLeft = level.totalStardust + var starObject = GameObject(level.objectId, crash_locations.get(location)) + var isDiscovered = false + var ticks = 0 + var isSpawned = false + var spriteSpawned = false + + /** + * Degrades a ShootingStar (or removes the starObject and spawns a Star Sprite if it's the last star) + */ + fun degrade() { + if(level.ordinal == 0){ + ObjectBuilder.remove(starObject) + isSpawned = false + starSprite.location = starObject.location + starSprite.init() + spriteSpawned = true + return + } + level = getNextType() + maxDust = level.totalStardust + dustLeft = level.totalStardust + + val newStar = GameObject(level.objectId, starObject.location) + ObjectBuilder.replace(starObject, newStar) + starObject = newStar + } + + private fun getNextType(): ShootingStarType{ + return ShootingStarType.values()[level.ordinal - 1] + } + + /** + * Fires the shooting star (spawns a new one). Only used when spawning new shooting stars, not for downgrading existing ones. + */ + fun fire() { + ObjectBuilder.remove(starObject) + rebuildVars() + clearSprite() + ObjectBuilder.add(starObject) + isSpawned = true + Repository.sendNews("A shooting star level ${level.ordinal + 1} just crashed near ${location.toLowerCase()}!") + } + + /** + * Rebuilds some of the variables with new information. + */ + fun rebuildVars(){ + level = ShootingStarType.values().random() + location = crash_locations.entries.random().key + maxDust = level.totalStardust + dustLeft = level.totalStardust + starObject = GameObject(level.objectId, crash_locations.get(location)) + isDiscovered = false + ticks = 0 + } + + fun clearSprite() { + starSprite.clear() + spriteSpawned = false + } + + /** + * Decrement the amount of dust left in the current star and degrade it if the amount left is 0 or less. + */ + fun decDust() { + if(--dustLeft <= 0) degrade() + } + + /** + * Proxy method for starting to mine a shooting star + */ + fun mine(player: Player) { + player.pulseManager.run(ShootingStarMiningPulse(player, starObject, this)) + } + + /** + * Prospecting shooting stars. + */ + fun prospect(player: Player) { + player.dialogueInterpreter.sendDialogue("This is a size " + (level.ordinal + 1) + " star. A Mining level of at least " + miningLevel + " is", "required to mine this layer. There is $dustLeft stardust remaining", "until the next layer.") + } + + /** + * Gets the mining level required based on the star's current level ordinal. + */ + val miningLevel: Int + get() = (level.ordinal + 1) * 10 +} + +/** + * Various levels of shooting stars + * @author Ceikry + */ +enum class ShootingStarType(val objectId: Int, val exp: Int, val totalStardust: Int,val rate: Double) { + LEVEL_1(38668, 14, 1200, 0.05), + LEVEL_2(38667, 25, 700, 0.1), + LEVEL_3(38666, 29, 439, 0.3), + LEVEL_4(38665, 32, 250, 0.4), + LEVEL_5(38664, 47, 175, 0.5), + LEVEL_6(38663, 71, 80, 0.70), + LEVEL_7(38662, 114, 40, 0.80), + LEVEL_8(38661, 145, 25, 0.85), + LEVEL_9(38660, 210, 15, 0.95); +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarCommands.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarCommands.kt new file mode 100644 index 000000000..922e20375 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarCommands.kt @@ -0,0 +1,40 @@ +package core.game.content.global.worldevents.shootingstar + +import core.game.node.entity.player.Player +import core.game.system.command.CommandPlugin +import core.game.system.command.CommandSet +import core.plugin.Plugin +import core.game.content.global.worldevents.WorldEvents +import java.util.concurrent.TimeUnit + +/** + * A few assorted commands for shooting stars. + */ +class ShootingStarCommands : CommandPlugin(){ + override fun newInstance(arg: Any?): Plugin{ + link(CommandSet.DEVELOPER) + return this + } + + override fun parse(player: Player?, name: String?, args: Array?): Boolean { + val star = (WorldEvents.get("shooting-stars") as ShootingStarEvent).star + when (name) { + "tostar" -> { + player!!.teleport(star.starObject.location.transform(1, 1, 0)) + } + "submit" -> { + star.fire() + } + "resettime" -> player!!.savedData.globalData.starSpriteDelay = 0L + "stardust" -> { + val dust = 8 + println("Cosmic Runes: " + 0.76 * dust) + println("Astral runes: " + 0.26 * dust) + println("Gold ores: " + 0.1 * dust) + println("GP: " + 250.1 * dust) + } + "setsprite" -> player!!.savedData.globalData.starSpriteDelay = System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1) + } + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarEvent.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarEvent.kt new file mode 100644 index 000000000..bb9ec99ef --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarEvent.kt @@ -0,0 +1,81 @@ +package core.game.content.global.worldevents.shootingstar + +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.content.global.worldevents.PluginSet +import core.game.content.global.worldevents.WorldEvent +import core.game.content.global.worldevents.WorldEvents + +/** + * The world event class for shooting stars. Keeps track of event-related data like the ShootingStar instance. + * Also handles spawning new shooting stars based on time. + * @author Ceikry + */ +class ShootingStarEvent : WorldEvent("shooting-stars") { + val star = ShootingStar() + val tickDelay = if(GameWorld.settings?.isDevMode == true) 200 else 25000 + + + override fun initialize() { + plugins = PluginSet( + ScoreboardHandler(), + ShootingStarOptionHandler(), + ShootingStarScoreboard(), + StarChartPlugin(), + ShootingStarCommands(), + StarSpriteDialogue(), + ShootingStarLogin() + ) + super.initialize() + GameWorld.Pulser.submit(StarPulse()) + log("Shooting Star event has been initialized.") + } + + override fun checkTrigger(): Boolean { + /** + * Spawn a new star only if: star's ticks are greater than the tickDelay and star sprite is not spawned OR, + * neither the star or the sprite are spawned. + */ + star.ticks += 10 + if ((star.ticks >= tickDelay && !star.spriteSpawned) || (!star.isSpawned && !star.spriteSpawned)) { + return true + } + + /** + * Clear the sprite when we have passed the tickDelay + (1/3) of the tickDelay. + * This gives players a little extra time before the star respawns to run to the bank and grab + * stardust or whatever. Once the sprite is cleared a new star will be allowed to spawn. + */ + val maxDelay = tickDelay + (tickDelay / 3) + if(star.ticks > maxDelay && star.spriteSpawned){ + star.clearSprite() + } + + return false + } + + override fun checkActive(): Boolean { + return true //this event is always active. + } + + override fun fireEvent() { + log("Fired new shooting star event.") + star.fire() + } + + /** + * Handles checking star status and spawning new ones if necessary. + */ + class StarPulse : Pulse(10){ + override fun pulse(): Boolean { + val event = WorldEvents.get("shooting-stars") + event ?: return true + + if(event.checkTrigger()){ + event.fireEvent() + } + + return false //always returns false because it needs to run forever. + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarLogin.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarLogin.kt new file mode 100644 index 000000000..e5815af9e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarLogin.kt @@ -0,0 +1,29 @@ +package core.game.content.global.worldevents.shootingstar + +import core.game.node.entity.player.Player +import core.plugin.Plugin +import core.plugin.PluginManifest +import core.plugin.PluginType +import core.game.content.global.worldevents.WorldEvents + +/** + * A plugin that handles the message a player receives on login pertaining to shooting stars. + */ +@PluginManifest(type = PluginType.LOGIN) +class ShootingStarLogin : Plugin { + @Throws(Throwable::class) + override fun newInstance(arg: Player?): Plugin? { + if (arg is Player) { + val star = (WorldEvents.get("shooting-stars") as ShootingStarEvent).star + if (star.isSpawned) { + arg.sendMessage("News: A shooting star (Level " + (star.level.ordinal + 1).toString() + ") has just crashed near the " + star.location + "!") + } + return this + } + return this + } + + override fun fireEvent(identifier: String, vararg args: Any): Any { + return Unit + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarMiningPulse.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarMiningPulse.kt new file mode 100644 index 000000000..5d8c005b6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarMiningPulse.kt @@ -0,0 +1,93 @@ +package core.game.content.global.worldevents.shootingstar + +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.GameWorld +import core.game.world.repository.Repository +import core.game.node.entity.skill.SkillPulse +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.gather.SkillingTool + +/** + * The pulse used to handle mining shooting stars. + */ +class ShootingStarMiningPulse(player: Player?, node: GameObject?, val star: ShootingStar) : SkillPulse(player, node) { + /** + * The amount of ticks it takes to get star dust. + */ + private var ticks = 0 + override fun start() { + if(!star.isSpawned) return + super.start() + } + + override fun checkRequirements(): Boolean { + tool = SkillingTool.getPickaxe(player) + if (!star.starObject.isActive || !star.isSpawned) { + return false + } + //checks if the star has been discovered and if not, awards the bonus xp. Xp can be awarded regardless of mining level as per the wiki. + if (!star.isDiscovered) { + player.skills.addExperience(Skills.MINING, 75 * player.skills.getStaticLevel(Skills.MINING).toDouble()) + Repository.sendNews(player.username + " is the discoverer of the crashed star near " + star.location + "!") + ScoreboardManager.submit(player) + star.isDiscovered = true + return player.skills.getLevel(Skills.MINING) >= star.miningLevel + } + + if (player.skills.getLevel(Skills.MINING) < star.miningLevel) { + player.dialogueInterpreter.sendDialogue("You need a Mining level of at least " + star.miningLevel + " in order to mine this layer.") + return false + } + if (tool == null) { + player.packetDispatch.sendMessage("You do not have a pickaxe to use.") + return false + } + if (player.inventory.freeSlots() < 1 && !player.inventory.contains(ShootingStarOptionHandler.STAR_DUST, 1)) { + player.dialogueInterpreter.sendDialogue("Your inventory is too full to hold any more stardust.") + return false + } + return true + } + + override fun animate() { + player.animate(tool.animation) + } + + override fun reward(): Boolean { + if (++ticks % 4 != 0) { + return false + } + if (!checkReward()) { + return false + } + if (GameWorld.settings?.isDevMode == true) { + star.dustLeft = 1 + } + star.decDust() + player.skills.addExperience(Skills.MINING,star.level.exp.toDouble()) + if (ShootingStarOptionHandler.getStarDust(player) < 200) { + player.inventory.add(Item(ShootingStarOptionHandler.STAR_DUST, 1)) + } + return false + } + + override fun message(type: Int) { + when (type) { + 0 -> player.packetDispatch.sendMessage("You swing your pickaxe at the rock...") + } + } + + /** + * Checks if the player gets rewarded. + * @return `True` if so. + */ + private fun checkReward(): Boolean { + val skill = Skills.MINING + val level = 1 + player.skills.getLevel(skill) + player.familiarManager.getBoost(skill) + val hostRatio: Double = Math.random() * (100.0 * star.level.rate) + val clientRatio: Double = Math.random() * ((level - star.miningLevel) * (1.0 + tool.ratio)) + return hostRatio < clientRatio + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler.kt new file mode 100644 index 000000000..22fcd714f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarOptionHandler.kt @@ -0,0 +1,68 @@ +package core.game.content.global.worldevents.shootingstar + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.world.GameWorld +import core.plugin.Plugin +import core.game.content.global.worldevents.WorldEvents +import java.util.concurrent.TimeUnit + +/** + * Option handlers for the various shooting star objects. + */ +class ShootingStarOptionHandler : OptionHandler() { + + override fun newInstance(arg: Any?): Plugin? { + for (star in ShootingStarType.values()) { + ObjectDefinition.forId(star.objectId).handlers["option:mine"] = this + ObjectDefinition.forId(star.objectId).handlers["option:prospect"] = this + } + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + val star: ShootingStar? = (WorldEvents.get("shooting-stars") as ShootingStarEvent).star + star ?: return false + when (option) { + "mine" -> { + star.mine(player) + } + "prospect" -> { + star.prospect(player) + } + "observe" -> if (star.isSpawned) { + player.dialogueInterpreter.sendDialogue("A shooting star (Level " + (star.level.ordinal + 1).toString() + ")", "is currently crashed near the " + star.location + ".") + } else { + val tickDiff = (if (GameWorld.settings?.isDevMode == true) 200 else 7200) - star.ticks + val seconds = Math.ceil((tickDiff.toFloat() / 1000.toFloat()) * 600.toDouble()).toInt() + val hours = TimeUnit.SECONDS.toHours(seconds.toLong()).toInt() + val minutes = TimeUnit.SECONDS.toMinutes(seconds.toLong()).toInt() + var time = "" + time += if (hours > 0) { + "$hours hour" + } else { + if (minutes > 0) { + "$minutes minute(s)" + } else { + "$seconds second(s)" + } + } + player.dialogueInterpreter.sendDialogue("The next star will crash in approximately:", time) + } + } + return true + } + companion object { + const val STAR_DUST = 13727 + /** + * Gets the star dust amount for a player. + * @param player The player. + * @return The stardust amount. + */ + fun getStarDust(player: Player): Int { + return player.inventory.getAmount(STAR_DUST) + player.bank.getAmount(STAR_DUST) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarScoreboard.java b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarScoreboard.java new file mode 100644 index 000000000..654151ffb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/ShootingStarScoreboard.java @@ -0,0 +1,22 @@ +package core.game.content.global.worldevents.shootingstar; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +public class ShootingStarScoreboard extends ComponentPlugin { + public static Component iface = new Component(787); + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(iface.getId(),this); + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/StarChartPlugin.java b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/StarChartPlugin.java new file mode 100644 index 000000000..02feb1f68 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/StarChartPlugin.java @@ -0,0 +1,51 @@ +package core.game.content.global.worldevents.shootingstar; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.PluginManifest; + +@PluginManifest(name="ShootingStars") +public class StarChartPlugin extends ComponentPlugin { + private Component iface = new Component(104); + private int index= 19; + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new StarChartOptions()); + ComponentDefinition.forId(iface.getId()).setPlugin(this); + return this; + } + + public class StarChartOptions extends OptionHandler{ + + @Override + public boolean handle(Player player, Node node, String option) { + player.getInterfaceManager().open(iface); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(25582).getHandlers().put("option:look-at",this); + ObjectDefinition.forId(25581).getHandlers().put("option:look-at",this); + ObjectDefinition.forId(25580).getHandlers().put("option:look-at",this); + ObjectDefinition.forId(25583).getHandlers().put("option:look-at",this); + ObjectDefinition.forId(25579).getHandlers().put("option:look-at",this); + ObjectDefinition.forId(25578).getHandlers().put("option:look-at",this); + return this; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/StarSpriteDialogue.kt b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/StarSpriteDialogue.kt new file mode 100644 index 000000000..037a9070b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/global/worldevents/shootingstar/StarSpriteDialogue.kt @@ -0,0 +1,194 @@ +package core.game.content.global.worldevents.shootingstar + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.content.dialogue.DialoguePlugin +import java.util.concurrent.TimeUnit + +/** + * Dialogue for the star sprite. + */ +class StarSpriteDialogue(player: Player? = null) : DialoguePlugin(player) { + + /** + * The cosmic rune item id. + */ + val COSMIC_RUNE = 564 + + /** + * The astral rune item id. + */ + val ASTRAL_RUNE = 9075 + + /** + * The gold ore item id. + */ + val GOLD_ORE = 445 + + /** + * The coins id. + */ + val COINS = 995 + + /** + * The amplifier amount. + */ + val AMPLIFIER = 1.0 + + + /** + * Constructs the star sprite dialogue. + */ + fun StarSpriteDialogue() { + /* + * empty. + */ + } + + override fun newInstance(player: Player?): DialoguePlugin? { + return StarSpriteDialogue(player) + } + + override fun open(vararg args: Any): Boolean { + npc = args[0] as NPC + if (player.getSavedData().getGlobalData().getStarSpriteDelay() > System.currentTimeMillis() || !player.getInventory().contains(ShootingStarOptionHandler.STAR_DUST, 1)) { + npc("Hello, strange creature.") + stage = 0 + } else { + npc("Thank you for helping me out of here.") + stage = 50 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 0 -> { + npc("I'm a star sprite! I Was in my star in the sky, when it", "lost control and crashed into the ground. With half my", "star sticking into the ground, I became stuck.", "Fortunately, I was mined out by the kind creatures of") + stage++ + } + 1 -> { + npc("your race.") + stage++ + } + 2 -> { + options("What's a star sprite?", "What are you going to do without your star?", "I thought stars were huge balls of burning gas.", "Well, I'm glad you're okay.") + stage++ + } + 3 -> when (buttonId) { + 1 -> { + player("What's a star sprite?") + stage = 10 + } + 2 -> { + player("What are you going to do without your star?") + stage = 20 + } + 3 -> { + player("I thought stars were huge balls of burning gas.") + stage = 30 + } + 4 -> { + player("Well, I'm glad you're okay.") + stage = 40 + } + } + 10 -> { + npc("We're what makes the stars in the sky shine. I made", "this star shine when it was in the sky.") + stage++ + } + 11 -> { + options("What are you going to do without your star?", "I thought stars were huge balls of burning gas.", "Well, I'm glad you're okay.") + stage++ + } + 12 -> when (buttonId) { + 1 -> { + player("What are you going to do without your star?") + stage = 20 + } + 2 -> { + player("I thought stars were huge balls of burning gas.") + stage = 30 + } + 3 -> { + player("Well, I'm glad you're okay.") + stage = 40 + } + } + 20 -> { + npc("Don't worry about me. I'm sure I'll find some good", "rocks around here and get back up into the sky in no", "time.") + stage++ + } + 21 -> { + options("What's a star sprite?", "I thought stars were huge balls of burning gas.", "Well, I'm glad you're okay.") + stage++ + } + 22 -> when (buttonId) { + 1 -> { + player("What's a star sprite?") + stage = 10 + } + 2 -> { + player("I thought stars were huge balls of burning gas.") + stage = 30 + } + 3 -> { + player("Well, I'm glad you're okay.") + stage = 40 + } + } + 30 -> { + npc("Most of them are, but a lot of shooting stars on this", "plane of the multiverse are rocks with star sprites in", "them.") + stage++ + } + 31 -> { + options("What's a star sprite?", "What are you going to do without your star?", "Well, I'm glad you're okay.") + stage++ + } + 32 -> when (buttonId) { + 1 -> { + player("What's a star sprite?") + stage = 10 + } + 2 -> { + player("What are you going to do without your star?") + stage = 20 + } + 3 -> { + player("Well, I'm glad you're okay.") + stage = 40 + } + } + 40 -> { + npc("Thank you.") + stage++ + } + 41 -> end() + 50 -> { + val dust = if (player.getInventory().getAmount(ShootingStarOptionHandler.STAR_DUST) > 200) 200 else player.getInventory().getAmount(ShootingStarOptionHandler.STAR_DUST) + if (player.getInventory().remove(Item(ShootingStarOptionHandler.STAR_DUST, dust))) { + val cosmicRunes = (Math.ceil(0.76 * dust) * AMPLIFIER).toInt() + val astralRunes = (Math.ceil(0.26 * dust) * AMPLIFIER).toInt() + val goldOre = (Math.ceil(0.1 * dust) * AMPLIFIER).toInt() + val coins = (Math.ceil(250.0 * dust) * AMPLIFIER).toInt() // limits the amount of gp per turn-in to 90k, same as 2009 rs, and minimum from all stardust from a level 1 star works out to 50k, same as rs in 2009 + player.getInventory().add(Item(COSMIC_RUNE, cosmicRunes), player) + player.getInventory().add(Item(ASTRAL_RUNE, astralRunes), player) + player.getInventory().add(Item(GOLD_ORE, goldOre), player) + player.getInventory().add(Item(COINS, coins), player) + npc("I have rewarded you by making it so you can mine", "extra ore for the next 15 minutes. Also, have $cosmicRunes", "cosmic runes, $astralRunes astral runes, $goldOre gold ore and $coins", "coins.") + player.getSavedData().getGlobalData().setStarSpriteDelay(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) + player.registerState("shooting-star").init() + } + stage = 52 + } + 52 -> end() + } + return true + } + + override fun getIds(): IntArray? { + return intArrayOf(8091) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/holiday/HolidayEvent.java b/Server/src/main/java/Server/core/game/content/holiday/HolidayEvent.java new file mode 100644 index 000000000..b9ba4446f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/holiday/HolidayEvent.java @@ -0,0 +1,281 @@ +package core.game.content.holiday; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.map.zone.ZoneType; +import core.plugin.Plugin; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles a holiday event. + * @author Vexia + */ +public abstract class HolidayEvent extends MapZone implements Plugin { + + /** + * The list of holiday events. + */ + private static final List EVENTS = new ArrayList<>(); + + /** + * The current holiday event. + */ + private static HolidayEvent current; + + /** + * The holiday type. + */ + private final HolidayType type; + + /** + * The config id used to handle the stages. + */ + private final int configId; + + /** + * The hash to use for this event. + */ + private final int hash; + + /** + * The max stage. + */ + private final int maxStage; + + /** + * Constructs a new {@code HolidayEvent} {@code Object} + * @param type the holiday type. + * @param name the name of the event. + * @param configId the config id. + * @param hash the hash. + * @param maxStage the max stage. + */ + public HolidayEvent(String name, HolidayType type, int configId, int hash, int maxStage) { + super(name, true, ZoneRestriction.CANNON, ZoneRestriction.FIRES, ZoneRestriction.FOLLOWERS, ZoneRestriction.RANDOM_EVENTS); + this.type = type; + this.hash = hash; + this.configId = configId; + this.maxStage = maxStage; + this.setZoneType(ZoneType.SAFE.getId()); + } + + /** + * Used to load all the necessary nodes for this event. + */ + public abstract void load(); + + /** + * Indicates whether or not this holiday event is active. + * @return {@code True} if so. + */ + public abstract boolean isActive(); + + /** + * Initializes the holiday events. + */ + public static void init() { + new ItemLimitation().parse(); + for (HolidayEvent event : EVENTS) { + if (event.isActive()) { + event.load(); + } + } + } + + @Override + public boolean enter(Entity entity) { + if (entity instanceof Player && isComplete(entity.asPlayer())) { + return false; + } + return super.enter(entity); + } + + @Override + public boolean leave(Entity e, boolean logout) { + return super.leave(e, logout); + } + + @Override + public boolean parseCommand(Player player, String name, String[] arguments) { + if (!player.isAdmin()) { + return false; + } + switch (name) { + case "setstage": + setStage(player, Integer.parseInt(arguments[1])); + return true; + } + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (isActive()) { + setCurrent(this); + ZoneBuilder.configure(this); + SystemLogger.logInfo("Holiday event active [type=" + type + "]!"); + } + EVENTS.add(this); + return this; + } + + /** + * Adds experience. + * @param player The player. + * @param skill The skill. + * @param experience The experience. + */ + public void addExperience(Player player, int skill, double experience) { + + } + + /** + * Commences the death event. + * @param killer The killing entity. + * @param victim The entity getting killed. + */ + public void commenceDeath(Entity killer, Entity victim) { + + } + + /** + * Finalizes the death event. + * @param killer The killing entity. + * @param victim The entity getting killed. + */ + public void finalizeDeath(Entity killer, Entity victim) { + + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Checks if it is a certain holiday. + * @param type the type. + * @return {@code True} if its a holiday. + */ + public static boolean isHoliday(HolidayType type) { + return current != null && current.getType() == type; + } + + /** + * Checks if the event is complete. + * @return {@code True} if so. + */ + public boolean isComplete(Player player) { + return getStage(player) >= maxStage; + } + + /** + * Sets the stage of the event. + * @param player the player. + * @param stage the stage. + */ + public void setStage(Player player, int stage) { + setStage(player, stage, hash); + } + + /** + * Sets the stage of the event. + * @param player the player. + * @param stage the stage. + * @param hash the hash. + */ + public void setStage(Player player, int stage, int hash) { + setStageValue(player, getConfig(player) + stage << hash); + } + + /** + * Sets the stage value of the event. + * @param player the player. + * @param value the value. + */ + public void setStageValue(Player player, int value) { + player.getConfigManager().set(configId, value, true); + } + + /** + * Gets the stage of the event. + * @param player the player. + * @return the stage. + */ + public int getStage(Player player) { + return getStage(player, hash); + } + + /** + * Gets the stage of the event. + * @param player the player. + * @return the stage. + */ + public int getStage(Player player, int hash) { + return getConfig(player) >> hash; + } + + /** + * Gets the config value. + * @param player the player. + * @return the value. + */ + public int getConfig(Player player) { + return player.getConfigManager().get(configId); + } + + /** + * Gets the max stage. + * @return the stage. + */ + public int getMaxStage() { + return maxStage; + } + + /** + * Gets the configId. + * @return the configId + */ + public int getConfigId() { + return configId; + } + + /** + * Gets the hash. + * @return the hash + */ + public int getHash() { + return hash; + } + + /** + * Gets the type. + * @return the type + */ + public HolidayType getType() { + return type; + } + + /** + * Gets the current. + * @return the current + */ + public static HolidayEvent getCurrent() { + return current; + } + + /** + * Sets the current. + * @param current the current to set. + */ + public static void setCurrent(HolidayEvent current) { + HolidayEvent.current = current; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/holiday/HolidayItem.java b/Server/src/main/java/Server/core/game/content/holiday/HolidayItem.java new file mode 100644 index 000000000..0c6d88578 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/holiday/HolidayItem.java @@ -0,0 +1,108 @@ +package core.game.content.holiday; + +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +import java.util.HashMap; +import java.util.Map; + +/** + * Used for releasing trade-able holiday items. + * @author Emperor + */ +public final class HolidayItem extends GroundItem { + + /** + * The location of a holiday item spawn. + */ + private static Map itemLoc = new HashMap<>(); + + /** + * Constructs a new {@code HolidayItem} {@code Object}. + * @param item the item. + * @param location the location. + */ + public HolidayItem(Item item, Location location) { + super(item, location); + } + + /** + * Starts random holiday item spawning. + * @param spawn The item. + * @param interval The interval between moving the location. + * @param spawnLocations The spawn locations. + */ + public static void startRandomSpawn(final Item spawn, int interval, final Location... spawnLocations) { + GameWorld.getPulser().submit(new Pulse(interval) { + GroundItem item; + int lastIndex = -1; + + @Override + public boolean pulse() { + if (item != null) { + if (!item.isRemoved()) { + Graphics.send(Graphics.create(85), item.getLocation()); + } else if (ItemLimitation.decreaseAmount(spawn.getId())) { + System.out.println("Released all " + spawn.getName() + "s!"); + return true; + } + GroundItemManager.destroy(item); + } + int index = RandomFunction.random(spawnLocations.length); + if (index == lastIndex) { + index = (index + 1) % spawnLocations.length; + } + spawn.setLocation(spawnLocations[index]); + item = GroundItemManager.create(new HolidayItem(spawn, spawnLocations[index])); + itemLoc.put(item.getId(), item.getLocation()); + lastIndex = index; + return false; + } + }); + } + + @Override + public String toString() { + return "HolidaySpawn [name=" + getName() + ", loc=" + getLocation() + "]"; + } + + @Override + public boolean isActive() { + return true; + } + + @Override + public boolean isPrivate() { + return false; + } + + @Override + public boolean isAutoSpawn() { + return false; + } + + @Override + public void respawn() { + /* + * empty. + */ + } + + /** + * Returns the location of a holiday item. + * @param itemId the itemId to check + * @return location of the item + */ + public static Location getHolidayItemLocation(int itemId) { + if (itemLoc.get(itemId) != null) { + return itemLoc.get(itemId); + } + return null; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/holiday/HolidayType.java b/Server/src/main/java/Server/core/game/content/holiday/HolidayType.java new file mode 100644 index 000000000..0a5daeb72 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/holiday/HolidayType.java @@ -0,0 +1,9 @@ +package core.game.content.holiday; + +/** + * The holiday type. + * @author Vexia + */ +public enum HolidayType { + HALLOWEEN(), CHRISTMAS(), EASTER(), THANKSGIVING; +} diff --git a/Server/src/main/java/Server/core/game/content/holiday/ItemLimitation.java b/Server/src/main/java/Server/core/game/content/holiday/ItemLimitation.java new file mode 100644 index 000000000..3c85a07a0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/holiday/ItemLimitation.java @@ -0,0 +1,119 @@ +package core.game.content.holiday; + +import core.cache.ServerStore; +import core.cache.def.impl.ItemDefinition; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +/** + * Handles limitation of holiday item releases. + * @author Emperor + */ +public final class ItemLimitation { + + /** + * The items. + */ + private static final Map ITEMS = new HashMap<>(); + + /** + * Constructs a new {@code ItemLimitation} {@code Object} + */ + public ItemLimitation() { + /* + * empty. + */ + } + + /** + * Parses the item limitation. + * @return {@code True} if parsed. + */ + public boolean parse() { + if (ServerStore.get("hir_limits") == null) { + return true; + } + ByteBuffer buffer = ServerStore.getArchive("hir_limits"); + int length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + int itemId = buffer.getShort() & 0xFFFF; + int amount = buffer.getShort() & 0xFFFF; + ITEMS.put(itemId, amount); + } + return true; + } + + /** + * Dumps the item limitation data. + */ + public static void dump() { + ByteBuffer buffer = ByteBuffer.allocate(ITEMS.size() * 4 + 1); + buffer.put((byte) ITEMS.size()); + for (int itemId : ITEMS.keySet()) { + buffer.putShort((short) itemId); + buffer.putShort((short) (int) ITEMS.get(itemId)); + } + buffer.flip(); + ServerStore.setArchive("hir_limits", buffer); + } + + /** + * Registers a new item release. + * @param itemId The item id. + * @param amount The amount. + */ + public static void register(int itemId, int amount) { + ITEMS.put(itemId, amount); + System.out.println("Registered item release [name=" + ItemDefinition.forId(itemId).getName() + ", id=" + itemId + ", limit=" + amount + "]."); + dump(); + } + + /** + * Checks if the item has been registered. + * @param itemId The item id. + * @return {@code True} if so. + */ + public static boolean isRegistered(int itemId) { + return ITEMS.containsKey(itemId); + } + + /** + * Gets the amount left to release. + * @param itemId The item id. + * @return The amount left. + */ + public static int getAmountLeft(int itemId) { + Integer amount = ITEMS.get(itemId); + if (amount == null) { + return -1; + } + return amount; + } + + /** + * Decreases the amount left. + * @param itemId The item id. + * @return {@code True} if the full amount has been fully released. + */ + public static boolean decreaseAmount(int itemId) { + if (!ITEMS.containsKey(itemId)) { + return false; + } + int amount = ITEMS.get(itemId); + if (amount > 0) { + ITEMS.put(itemId, amount - 1); + dump(); + } + return amount < 1; + } + + /** + * Gets the item limits. + * @return The item limits. + */ + public static Map getItems() { + return ITEMS; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/holiday/christmas/ChristmasEvent.java b/Server/src/main/java/Server/core/game/content/holiday/christmas/ChristmasEvent.java new file mode 100644 index 000000000..3da511e17 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/holiday/christmas/ChristmasEvent.java @@ -0,0 +1,1115 @@ +package core.game.content.holiday.christmas; +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.holiday.HolidayEvent; +import core.game.content.holiday.HolidayItem; +import core.game.content.holiday.HolidayType; +import core.game.content.holiday.ItemLimitation; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the 2009scape 2007 Christmas Event. + * @author Vexia + * + */ +@Initializable +public class ChristmasEvent extends HolidayEvent { + + /** + * The location of places where imps & snow are. + */ + private static final Location[] HUBS = new Location[] {Location.create(2965, 3380, 0), Location.create(3079, 3250, 0), Location.create(2659, 3657, 0), Location.create(2664, 3305, 0), Location.create(2898, 3544, 0), new Location(3159, 3490, 0)}; + + /** + * The santa hat item. + */ + private static final Item SANTA_HAT = new Item(1050); + + /** + * The christmas cracker item. + */ + private static final Item CHRISTMAS_CRACKER = new Item(962); + + /** + * The ball of snow item. + */ + private static final Item BALL_OF_SNOW = new Item(11951); + + /** + * The snow globe item. + */ + private static final Item SNOWGLOBE = new Item(11949); + + /** + * The array of snowman hat ids. + */ + private static final int[] SNOWMAN_HATS = new int[] {11955, 11956, 11957, 11958, 11959}; + + /** + * The snowman weapon ids. + */ + private static final int[] SNOWMAN_WEAPONS = new int[] {11952, 11953, 11954}; + + /** + * The pelt option. + */ + private static final Option PELT_OPTION = new Option("Pelt", 7); + + /** + * Constructs the {@code ChristmasEvent} object. + */ + public ChristmasEvent() { + super("2007 Christmas Event", HolidayType.CHRISTMAS, 1087, 16, 10); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (isActive()) { + PluginManager.definePlugins(new ChristmasEventOptionPlugin(), new SnowmanItemHandler(), new SnowImpDialogue(), new SnowmanHatComponentPlugin(), new QueenOfSnowDialogue(), new SnowballItemPlugin(), new SnowmanNPC(), new PeltOptionHandler()); + } + return super.newInstance(arg); + } + + @Override + public void load() { + if (!ItemLimitation.isRegistered(SANTA_HAT.getId())) { + ItemLimitation.register(SANTA_HAT.getId(), 25); + } + if (!ItemLimitation.isRegistered(CHRISTMAS_CRACKER.getId())) { + ItemLimitation.register(CHRISTMAS_CRACKER.getId(), 25); + } + if (ItemLimitation.getAmountLeft(SANTA_HAT.getId()) > 0) { + HolidayItem.startRandomSpawn(SANTA_HAT, 1000, Location.create(3047, 3296, 0), Location.create(3016, 3291, 0), Location.create(3013, 3260, 0), Location.create(3050, 3236, 0), Location.create(3091, 3275, 0), Location.create(3102, 3270, 1), Location.create(3210, 3221, 3), Location.create(3300, 3193, 0), Location.create(3284, 3162, 1), Location.create(2741, 3443, 0), Location.create(2695, 3462, 0), Location.create(2667, 3291, 1), Location.create(3079, 3512, 0), Location.create(3079, 3548, 0), Location.create(3018, 3602, 0), Location.create(3135, 3515, 0), Location.create(3216, 3412, 1), Location.create(2942, 3382, 0), Location.create(2973, 3338, 0)); + } + NPC imp; + for (Location location : HUBS) { + imp = NPC.create(6732, location); + imp.setWalks(true); + imp.init(); + } + snow(); + } + + @Override + public boolean enter(Entity entity) { + if (entity instanceof Player) { + Player player = entity.asPlayer(); + player.setAttribute("last-location", player.getRenderInfo().getLastLocation()); + } + return super.enter(entity); + } + + @SuppressWarnings("deprecation") + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player player = e.asPlayer(); + for (int i : SNOWMAN_WEAPONS) { + if (player.getInventory().contains(i, 1)) { + player.getInventory().remove(new Item(i, player.getInventory().getAmount(i))); + } + if (player.getBank().containItems(i, 1)) { + player.getBank().remove(new Item(i, player.getBank().getAmount(i))); + } + } + if (logout) { + player.setLocation(player.getAttribute("last-location", HUBS[0])); + } + } + return super.leave(e, logout); + } + + @Override + public void finalizeDeath(Entity killer, Entity victim) { + if (killer instanceof Player && victim instanceof NPC) { + Player player = (Player) killer; + if (victim.getProperties().getCurrentCombatLevel() > 0) { + int chance = (5_000 / victim.getProperties().getCurrentCombatLevel()) * 100; + if (RandomFunction.random(chance) == 0) { + int itemId = CHRISTMAS_CRACKER.getId(); + if (ItemLimitation.getAmountLeft(itemId) > 0) { + ItemLimitation.decreaseAmount(itemId); + Repository.sendNews(player.getUsername() + " found a christmas cracker. There are " + ItemLimitation.getAmountLeft(itemId) + " crackers left!"); + player.getPacketDispatch().sendMessage("You find a christmas cracker!."); + GroundItemManager.create(new Item(itemId), victim.getLocation(), player); + } + } + } + } + } + + /** + * Sends snow near the hub. + */ + private void snow() { + Location loc = null; + GameObject obj = null; + for (Location location : HUBS) { + for (int x = 2; x < 10; x++) { + for (int y = 2; y < 10; y++) { + loc = location.transform(x, y, 0); + if (RegionManager.getObject(loc) == null && RegionManager.isTeleportPermitted(loc) && RandomFunction.random(3) == 1) { + obj = new GameObject(28296, loc); + ObjectBuilder.add(obj); + RegionManager.removeClippingFlag(0, loc.getX(), loc.getY(), false, 0x100); + } + loc = location.transform(-x, y, 0); + if (RegionManager.getObject(loc) == null && RegionManager.isTeleportPermitted(loc) && RandomFunction.random(3) == 1) { + obj = new GameObject(28296, loc); + ObjectBuilder.add(obj); + RegionManager.removeClippingFlag(0, loc.getX(), loc.getY(), false, 0x100); + } + loc = location.transform(x, -y, 0); + if (RegionManager.getObject(loc) == null && RegionManager.isTeleportPermitted(loc) && RandomFunction.random(3) == 1) { + obj = new GameObject(28296, loc); + ObjectBuilder.add(obj); + RegionManager.removeClippingFlag(0, loc.getX(), loc.getY(), false, 0x100); + } + loc = location.transform(-x, -y, 0); + if (RegionManager.getObject(loc) == null && RegionManager.isTeleportPermitted(loc) && RandomFunction.random(3) == 1) { + obj = new GameObject(28296, loc); + ObjectBuilder.add(obj); + RegionManager.removeClippingFlag(0, loc.getX(), loc.getY(), false, 0x100); + } + } + } + } + } + + /** + * Sends a christmas teleport. + * @param player The player. + * @param location The location. + */ + public static void sendChristmasTeleport(Player player, Location location) { + player.getTeleporter().send(location, TeleportType.CHRISTMAS); + } + + @Override + public boolean isActive() { + return false; + } + + @Override + public void configure() { + registerRegion(10583); + } + + /** + * Handles interactions for the Christmas Event. + * @author Vexia + * + */ + public class ChristmasEventOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(28296).getHandlers().put("option:collect", this); + ItemDefinition.forId(BALL_OF_SNOW.getId()).getHandlers().put("option:build", this); + for (int i = 28266; i < 28296; i++) { + ObjectDefinition.forId(i).getHandlers().put("option:add-to", this); + } + ItemDefinition.forId(SNOWGLOBE.getId()).getHandlers().put("option:shake", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + switch (option) { + case "collect": + if (!player.getInventory().hasSpaceFor(BALL_OF_SNOW)) { + player.sendMessage("You don't have enough inventory space to collect any snow."); + return true; + } + if (player.getInventory().add(BALL_OF_SNOW)) { + player.lock(3); + player.animate(new Animation(7529)); + player.sendMessage("You collect a ball of snow."); + } + break; + case "build": + Location loc = player.getLocation().transform(player.getDirection()); + if (RegionManager.getObject(loc) != null || !RegionManager.isTeleportPermitted(loc)) { + player.sendMessage("You can't build a snowman here."); + return true; + } + if (player.getInventory().remove(node.asItem())) { + player.sendMessage("You start to build a snowman."); + player.animate(Animation.create(7532)); + ObjectBuilder.add(new GameObject(28266, loc)); + } + break; + case "add-to": + if (node.asObject().getId() == 28295) { + player.sendMessage("You need a " + (player.getZoneMonitor().isInZone(getName()) ? "weapon or hat " : "hat") + " to complete this snowman."); + return true; + } + if (!player.getInventory().containsItem(BALL_OF_SNOW)) { + player.sendMessage("You need snow in order to add to this snow man."); + return true; + } + if (player.getInventory().remove(BALL_OF_SNOW)) { + if (player.getLocation().equals(node.getLocation())) { + player.moveStep(); + player.faceLocation(node.getLocation()); + } + player.sendMessage("You add some snow to the snowman."); + player.lock(1); + player.animate(Animation.create(node.asObject().getId() <= 28278 ? 7532 : 7533)); + ObjectBuilder.replace(node.asObject(), node.asObject().transform(node.asObject().getId() + 1)); + if (node.asObject().getId() + 1 >= 28295) { + if (player.getZoneMonitor().isInZone(getName())) { + player.sendMessages("The snowman is almsot complete! Talk to a snow imp to get a hat or weapon to", "complete it."); + } else { + player.sendMessage("The snowman is almsot complete! Talk to a snow imp to get a hat to complete it."); + } + } + } + break; + case "shake": + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("You don't have enough inventory space to do that."); + return true; + } + player.lock(16); + player.animate(Animation.create(7535)); + player.sendMessage("You shake the snow globe."); + GameWorld.getPulser().submit(new Pulse(1, player) { + int ticks; + @Override + public boolean pulse() { + switch (++ticks) { + case 3: + player.getInterfaceManager().open(new Component(659)); + break; + case 7: + player.graphics(new Graphics(1284)); + player.sendMessage("The snow globe fills your inventory with snow."); + player.getInventory().add(new Item(BALL_OF_SNOW.getId(), player.getInventory().freeSlots())); + player.getInterfaceManager().close(); + return true; + } + return false; + } + + }); + break; + } + return true; + } + + } + + /** + * Handles the pelt option on entities. + * @author Vexia + * + */ + public class PeltOptionHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 6747; i < 6750; i++) { + NPCDefinition.forId(i).getHandlers().put("option:pelt", this); + } + PELT_OPTION.setHandler(this); + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + if (!player.getLocation().withinDistance(node.getLocation(), 6)) { + player.sendMessage("You are too far away to throw this snowball."); + return true; + } + if (player.getInventory().remove(BALL_OF_SNOW) || player.getEquipment().remove(BALL_OF_SNOW)) { + if (!player.getEquipment().containsItem(BALL_OF_SNOW)) { + player.getInteraction().remove(PELT_OPTION); + } + final Entity target = (Entity) node; + player.lock(4); + player.face(target); + player.animate(Animation.create(7530)); + player.graphics(Graphics.create(1282)); + if (node instanceof NPC) { + player.sendMessage("You throw a snowball."); + node.asNpc().getSkills().heal(1); + int delay = 41; + int speed = 60; + player.getLocation(); + int distance = (int) Location.getDistance(player.getLocation(), target.getLocation()); + int projectileSpeed = delay + speed + distance * 5; + double hitDelay = projectileSpeed * .02857; + GameWorld.getPulser().submit(new Pulse((int) hitDelay, target) { + @Override + public boolean pulse() { + target.getImpactHandler().manualHit(player, node instanceof NPC ? 1 : 0, HitsplatType.MISS); + return true; + } + }); + } else { + player.sendMessage("You pelt " + target.asPlayer().getUsername() + " with a snowball."); + } + Projectile.create(player, target, 1282, 30, 10).send(); + return true; + } + player.sendMessage("You need a snowball in order to do that."); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + } + + /** + * Handles the use of a snowman hat on a snowman. + * @author Vexia + * + */ + public class SnowmanItemHandler extends UseWithHandler { + + /** + * Constructs the {@code SnowmanItemHandler} + */ + public SnowmanItemHandler() { + super(11955, 11956, 11957, 11958, 11959, 11952, 11953, 11954); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(28295, OBJECT_TYPE, this); + PluginManager.definePlugin(new SnowmanDialogue()); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(event.getUsedItem())) { + boolean weapon = event.getUsedItem().getId() < 11955; + int id = weapon ? 6747 + (11954 - event.getUsedItem().getId()) : 6742 + (4 - (11959 - event.getUsedItem().getId())); + if (event.getUsedItem().getId() == 11953) { + id = 6749; + } else if (event.getUsedItem().getId() == 11952) { + id = 6748; + } + final int npcId = id; + ObjectBuilder.remove(event.getUsedWith().asObject()); + final NPC snowman = NPC.create(npcId, event.getUsedWith().getLocation()); + snowman.init(); + snowman.faceTemporary(player, 2); + snowman.setRespawn(false); + snowman.setWalks(true); + snowman.setAttribute("owner", player.getDetails().getUid()); + if (!player.getEmoteManager().isUnlocked(Emotes.SNOWMAN_DANCE)) { + player.getEmoteManager().unlock(Emotes.SNOWMAN_DANCE); + player.sendMessage("You've unlocked the snowman dance emote!"); + } + if (!weapon && HolidayEvent.getCurrent().getStage(player) < 2) { + HolidayEvent.getCurrent().setStage(player, 2); + } + if (!weapon) { + GameWorld.getPulser().submit(new Pulse(200) { + @Override + public boolean pulse() { + snowman.clear(); + return true; + } + }); + } + } + return true; + } + + /** + * Handles the snowman dialogue. + * @author Vexia + * + */ + public class SnowmanDialogue extends DialoguePlugin { + + /** + * Constructs the {@code SnowmanDialogue} + * @param player The player. + */ + public SnowmanDialogue(Player player) { + super(player); + } + + /** + * Constructs the {@code SnowmanDialogue} + */ + public SnowmanDialogue() { + /* + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SnowmanDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (npc.getAttribute("owner", 0) != player.getDetails().getUid()) { + player.sendMessage("The snowman doesn't seem interested in talking to you."); + return true; + } + npc("Happy Christmas, mortal!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Merry Christmas!"); + stage = 10; + break; + case 10: + npc("And a Happy New Year!"); + stage++; + break; + case 11: + npc("You should keep the spirit of Christmas in your heart at", "all times, mortal. If you do this, then to have a happy", "Christmas is to have a Happy New Year."); + stage++; + break; + case 12: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {6742, 6743, 6744, 6745, 6746}; + } + + } + } + + /** + * Represents the snow imp dialogue. + * @author Vexia + * + */ + public static class SnowImpDialogue extends DialoguePlugin { + + /** + * The saying of snow imps. + */ + private static final String[][] SAYINGS = new String[][] { + {"Let it snow, let it snow, let it snow."}, + {"I'm dreaming of a white Keldagrim"}, + {"There's no business like snow business!"}, + {"Snowflakes! Millions of snowflakes! No two are the", "same you know!"}, + {"Isn't snow brilliant?"}, + {"Snow! Ha ha ha ha! Snow everywhere!"} + }; + + /** + * Constructs the {@code SnowImpDialogue} + * @param player The player. + */ + public SnowImpDialogue(Player player) { + super(player); + } + + /** + * Constructs the {@code SnowImpDialogue} + */ + public SnowImpDialogue() { + /* + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SnowImpDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + switch (npc.getId()) { + case 8536: + npc("Go, snow warriors! Yeah!"); + stage = 100; + break; + default: + npc(SAYINGS[RandomFunction.random(SAYINGS.length - 1)]); + stage = HolidayEvent.getCurrent().getStage(player) > 1 ? 40 : 1; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + switch (HolidayEvent.getCurrent().getStage(player)) { + case 0: + options("Who are you?", "Why are you making it snow?", "What can I do with all this snow?"); + stage = 4; + break; + case 1: + player("Could I have a snowman hat, please?"); + stage = 2; + break; + } + break; + case 2: + for (int i : SNOWMAN_HATS) { + if (player.hasItem(new Item(i))) { + npc("You already have a snowman hat, mate."); + stage = 5; + break; + } + } + end(); + player.getInterfaceManager().open(new Component(658)); + break; + case 3: + options("Who are you?", "Why are you making it snow?", "What can I do with all this snow?"); + stage++; + break; + case 4: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("Why are you making it snow?"); + stage = 20; + break; + case 3: + player("What can I do with all this snow?"); + stage = 30; + break; + } + break; + case 5: + end(); + break; + case 10: + npc("It's a snow imp! From der Land of Snow!"); + stage++; + break; + case 11: + player("Can I go to the Land of Snow?"); + stage++; + break; + case 12: + if (HolidayEvent.getCurrent().getStage(player) > 1) { + sendChristmasTeleport(player, Location.create(2643, 5611, 0)); + end(); + break; + } + npc("We don't just let anyone into the Land of Snow, mate.", "You need to show you like snow first. Help to build a", "snowman!"); + if (HolidayEvent.getCurrent().getStage(player) < 1) { + HolidayEvent.getCurrent().setStage(player, 1); + } + stage++; + break; + case 13: + options("Who are you?", "Why are you making it snow?", "Could I have a snowman hat please?"); + stage++; + break; + case 14: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("Why are you making it snow?"); + stage = 20; + break; + case 3: + player("Could I have a snowman hat please?"); + stage = 2; + break; + } + break; + case 20: + npc("'Cause it's Christmas, innit."); + stage = 3; + break; + case 30: + npc("Whatever yer like! I don't care! There's plen'y more", "where this lot came from."); + stage = 3; + break; + case 40: + options("Who are you?", "Why are you making it snow?", "What can I do with all this snow?", "Could I have a snowman hat, please?", "Can I go to the Land of Snow?"); + stage++; + break; + case 41: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("Why are you making it snow?"); + stage = 20; + break; + case 3: + player("What can I do with all this snow?"); + stage = 30; + break; + case 4: + player("Could I have a snowman hat please?"); + stage = 2; + break; + case 5: + player("Can I go to the Land of Snow?"); + stage = 42; + break; + } + break; + case 42: + end(); + sendChristmasTeleport(player, Location.create(2643, 5611, 0)); + break; + case 100: + options("Who are you?", "Could I have a snowman hat, please?", "Could I have a snowman weapon, please?", "I want to go back to Keldagrim."); + stage++; + break; + case 101: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 110; + break; + case 2: + player("Could I have a snowman hat, please?"); + stage = 2; + break; + case 3: + player("Could I have a snowman weapon, please?"); + stage = 130; + break; + case 4: + player("I want to go back to Keldagrim."); + stage = 140; + break; + } + break; + case 110: + npc("It's a snow imp! From der Land of Snow!"); + stage = 100; + break; + case 130: + for (int i : SNOWMAN_WEAPONS) { + if (player.hasItem(new Item(i))) { + npc("You already have a snowman hat, mate."); + stage = 131; + break; + } + } + end(); + player.getPacketDispatch().sendString("Select a Snowman Hat or Weapon", 658, 13); + player.getPacketDispatch().sendInterfaceConfig(658, 53, false); + player.getInterfaceManager().open(new Component(658)); + break; + case 131: + break; + case 140: + npc("Very well. You may return here during Christmas-time, when", "the Land of Snow is close to Keldagrim."); + stage++; + break; + case 141: + sendChristmasTeleport(player, player.getAttribute("last-location", HUBS[0])); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {6732, 6733, 6734, 6735, 6736, 6737, 6738, 8536}; + } + + } + + /** + * Handles the snowman hat selector component. + * @author Vexia + * + */ + public class SnowmanHatComponentPlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(658).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (component.getId()) { + case 658: + switch (opcode) { + case 155: + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("You don't have enough inventory space."); + player.getInterfaceManager().close(); + return true; + } + boolean weapons = button >= 32; + for (int i : weapons ? SNOWMAN_WEAPONS : SNOWMAN_HATS) { + if (player.hasItem(new Item(i))) { + player.getInterfaceManager().close(); + player.sendMessage("You already have a snowman " + (weapons ? "weapon" : "hat") + "."); + return true; + } + } + if (!weapons) { + int dif = 30 - button; + int div = 4 - (dif / 2); + itemId = 11955 + div; + } else { + //11952-11954 + itemId = 11954; + if (button == 36) { + itemId = 11952; + } else if (button == 34) { + itemId = 11953; + } + } + player.getInventory().add(new Item(itemId)); + player.getInterfaceManager().close(); + break; + } + break; + } + return true; + } + + } + + /** + * Handles the dialogue for the queen of snow. + * @author Vexia + * + */ + public class QueenOfSnowDialogue extends DialoguePlugin { + + /** + * Constructs the {@code QueenOfSnowDialogue} object. + */ + public QueenOfSnowDialogue() { + /* + * empty. + */ + } + + /** + * Constructs the {@code QueenOfSnowDialogue} object. + * @param player The player. + */ + public QueenOfSnowDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new QueenOfSnowDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + switch (HolidayEvent.getCurrent().getStage(player)) { + case 2: + npc("Happy Christmas, noble visitor. Welcome to the Land of", "Snow. I have a gift for you, if you would like it."); + stage = 15; + break; + case 3: + npc("Happy Christmas, noble visitor. Welcome to the Land of", "Snow."); + stage = 100; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 15: + options("Ooh, a present?", "I want to go back to Keldagrim."); + stage++; + break; + case 16: + switch (buttonId) { + case 1: + player("Ooh, a present?"); + stage = 17; + break; + case 2: + player("I want to go back to Keldagrim."); + stage = 150; + break; + } + break; + case 17: + npc("It is a snow globe: a tiny model of your Lumbridge", "Castle enchanted with a little of this land's magical snow."); + stage++; + break; + case 18: + interpreter.sendItemMessage(SNOWGLOBE, "The Queen of Snow hands you a snow globe."); + stage++; + break; + case 19: + if (!player.getInventory().add(SNOWGLOBE)) { + end(); + player.sendMessage("You don't have enough room in your inventory."); + break; + } + if (HolidayEvent.getCurrent().getStage(player) < 3) { + HolidayEvent.getCurrent().setStage(player, 3); + } + end(); + break; + case 100: + if (!player.hasItem(SNOWGLOBE)) { + npc("I see that you have lost your snow globe, would", "you like another one?"); + stage = 200; + break; + } + options("Happy Christmas, Your Majesty.", "Why have you sent snow to Keldagrim?", "What is the Land of Snow?", "What is the snow globe for?", "I want to go back to Keldagrim."); + stage++; + break; + case 101: + switch (buttonId) { + case 1: + player("Happy Christmas, Your Majesty."); + stage = 110; + break; + case 2: + player("Why have you sent snow to Keldagrim?"); + stage = 120; + break; + case 3: + player("What is the Land of Snow?"); + stage = 130; + break; + case 4: + player("What is the snow globe for?"); + stage = 140; + break; + case 5: + player("I want to go back to Keldagrim."); + stage = 150; + break; + } + break; + case 110: + npc("And a Happy New Year to you."); + stage++; + break; + case 111: + end(); + break; + case 120: + npc("A snowy Christmas is a tradition that I have sadly neglected", "in recent years; what is Christmas without the hope", "of snow? There can be no hope of snow if snow", "never comes."); + stage = 111; + break; + case 130: + npc("The Land of Snow was created aeons ago by Guthix, as", "part of his balancing of the world. The coldness of this", "place counteracts the heat of the great deserts and volcanoes", "of others; ensuring the correct balance of hot and cold."); + stage = 111; + break; + case 140: + npc("Nothing, besides your idle amusement. It is imbued with a", "little of the snow imps' magic. When you shake it, it", "will call some snow to you from the Land of Snow."); + stage = 111; + break; + case 150: + npc("Very well. You may return here during Christmas-time,", "when the Land of Snow is close to Keldagrim. Just speak to", "a snowman or snow imp."); + stage++; + break; + case 151: + sendChristmasTeleport(player, player.getAttribute("last-location", HUBS[0])); + end(); + break; + case 200: + options("Yes, please.", "No, thank you."); + stage++; + break; + case 201: + switch (buttonId) { + case 1: + player("Yes, please."); + stage = 18; + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {6731}; + } + + } + + /** + * Represents the snowman NPC. + * @author Vexia + * + */ + public class SnowmanNPC extends AbstractNPC { + + /** + * Constructs the {@code SnowmanNPC}. + */ + public SnowmanNPC() { + super(-1, null); + } + + /** + * Constructs the {@code SnowmanNPC} + * @param id The id. + * @param loc The location. + */ + public SnowmanNPC(int id, Location loc) { + super(id, loc); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!getProperties().getCombatPulse().isAttacking()) { + final List surronding = RegionManager.getLocalNpcs(this, 10); + for (NPC n : surronding) { + if (n.getProperties().getCombatPulse().isAttacking()) { + continue; + } + if (n == this) { + continue; + } + for (int i : getIds()) { + if (n.getId() == i) { + getProperties().getCombatPulse().attack(n); + n.getProperties().getCombatPulse().attack(this); + break; + } + } + } + } + } + + @Override + public void sendImpact(BattleState state) { + if (state.getEstimatedHit() > 4) { + state.setEstimatedHit(4); + } + state.setEstimatedHit(0); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SnowmanNPC(id, location); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity instanceof Player) { + ((Player) entity).sendMessage("You can't attack a snowman."); + return false; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {6747, 6748, 6749}; + } + + } + + /** + * Handles the snow ball item plugin. + * @author Vexia + * + */ + public class SnowballItemPlugin implements Plugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + BALL_OF_SNOW.getDefinition().getHandlers().put("equipment", this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + final Player player = (Player) args[0]; + @SuppressWarnings("unused") + Item item = (Item) args[1]; + final Item other = args.length == 2 ? null : (Item) args[2]; + if (other != null) { + identifier = "equip"; + item = other; + } + switch (identifier) { + case "equip": + player.getInteraction().set(PELT_OPTION); + break; + case "unequip": + player.getInteraction().remove(PELT_OPTION); + break; + } + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/holiday/easter/BasketofEggsEvent.java b/Server/src/main/java/Server/core/game/content/holiday/easter/BasketofEggsEvent.java new file mode 100644 index 000000000..929e81368 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/holiday/easter/BasketofEggsEvent.java @@ -0,0 +1,528 @@ +package core.game.content.holiday.easter; + +import core.game.content.consumable.effects.HealingEffect; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.consumable.Consumables; +import core.game.content.consumable.Food; +import core.game.content.holiday.HolidayEvent; +import core.game.content.holiday.HolidayItem; +import core.game.content.holiday.HolidayType; +import core.game.content.holiday.ItemLimitation; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the 2005 Easter Event of giving out chocolate eggs. + * @author Vexia + * + */ +@Initializable +public class BasketofEggsEvent extends HolidayEvent { + + /** + * The chocolate eggs item. + */ + private static final Item[] CHOCOLATE_EGGS = new Item[] { new Item(12646), new Item(12647), new Item(12648) }; + + /** + * The egging option. + */ + private static final Option EGG_OPTION = new Option("Egg", 7); + + /** + * The whack option. + */ + private static final Option WHACK_OPTION = new Option("Whack", 7); + + /** + * The rubber chicken item. + */ + public static final Item RUBBER_CHICKEN = new Item(4566); + + /** + * The basket of eggs item. + */ + private static final Item BASKET_OF_EGGS = new Item(4565); + + /** + * The current egg item. + */ + private static Item egg; + + /** + * The bunny npc. + */ + private static NPC bunny; + + /** + * Constructs a new {@Code BasketofEggsEvent} {@Code Object} + */ + public BasketofEggsEvent() { + super("Basket of Eggs", HolidayType.EASTER, 1086, 16, 2); + PluginManager.definePlugins(new BasketofEggsPlugin(), new EasterBunnyDialogue(), new RubberchickenPlugin(), new ChocolateEggPlugin(), new EasterItemPlugin()); + } + + @Override + public void load() { + egg = new Item(1961); + if (!ItemLimitation.isRegistered(1037)) { + ItemLimitation.register(1037, 25); + } + if (!ItemLimitation.isRegistered(egg.getId())) { + ItemLimitation.register(egg.getId(), 100); + } + if (ItemLimitation.getAmountLeft(egg.getId()) > 0) { + HolidayItem.startRandomSpawn(egg, 1000, Location.create(3433, 3534, 0), Location.create(3099, 3548, 0), Location.create(3067, 10255, 0), Location.create(2913, 3746, 0), Location.create(3193, 3914, 0), Location.create(3214, 9618, 0), Location.create(3227, 3219, 2), Location.create(3300, 3312, 0), Location.create(3075, 3260, 0), Location.create(3213, 3428, 0), Location.create(3213, 3480, 0), Location.create(2710, 3460, 0), Location.create(2750, 3440, 0), Location.create(2927, 3144, 0), Location.create(2667, 3309, 0), Location.create(2600, 3104, 0), Location.create(2910, 4832, 0), Location.create(2925, 3445, 0), Location.create(2475, 3423, 1), Location.create(2817, 3441, 0), Location.create(2948, 3216, 0), Location.create(1864, 5243, 0), Location.create(2706, 3733, 0), Location.create(3186, 3446, 1), Location.create(3189, 9832, 0), Location.create(2655, 3310, 0), Location.create(3145, 9913, 0)); + } + bunny = NPC.create(1835, new Location(3008, 3294, 0)); + bunny.setWalks(true); + bunny.init(); + } + + @Override + public void finalizeDeath(Entity killer, Entity victim) { + if (killer instanceof Player && victim instanceof NPC) { + Player player = (Player) killer; + if (victim.getProperties().getCurrentCombatLevel() > 0) { + int chance = (5_000 / victim.getProperties().getCurrentCombatLevel()) * 100; + if (RandomFunction.random(chance) == 0) { + int itemId = 1037; + if (ItemLimitation.getAmountLeft(itemId) > 0) { + ItemLimitation.decreaseAmount(itemId); + Repository.sendNews(player.getUsername() + " found a pair of bunny ears!"); + player.getPacketDispatch().sendMessage("You find a set of bunny ears."); + GroundItemManager.create(new Item(itemId), victim.getLocation(), player); + } + } + } + } + } + + @Override + public boolean isActive() { + return false; + } + + @Override + public void configure() { + + } + + /** + * Gets the amount of eggs in a players inventory. + * @param player the player. + * @return the amount of eggs. + */ + public int getEggs(Player player) { + int eggs = 0; + for (Item item : CHOCOLATE_EGGS) { + eggs += player.getInventory().getAmount(item); + } + return eggs; + } + + /** + * Handlers the easter bunny dialogue. + * @author Vexia + * + */ + public class EasterBunnyDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code EasterBunnyDialogue} {@Code Object} + */ + public EasterBunnyDialogue() { + /* + * empty. + */ + } + + /** + * Constructs a new {@Code EasterBunnyDialogue} {@Code Object} + * @param player the player. + */ + public EasterBunnyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EasterBunnyDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (player.isAdmin()) { + player.sendMessage("" + egg.getLocation()); + } + switch (getStage(player)) { + case 0: + npc("Oh dear, the eggs, the eggs...", "What will I do about the eggs!? All of", "the eggs!!??"); + break; + case 1: + if (player.getAttribute("eggs", 0) >= 15) { + npc("Thank you, " + player.getUsername() + "! You handed out " + player.getAttribute("eggs", 0) + " eggs! Here", "is your Easter reward."); + } else { + Pulse pulse = player.getAttribute("egg-pulse", null); + if (pulse != null && pulse.isRunning() && player.hasItem(BASKET_OF_EGGS)) { + npc("You need to hand out a total of 15 eggs in order", "for me to give you a reward."); + stage = 4; + return true; + } + npc("You didn't hand out enough eggs in order to", "receive a prize. Take this basket and try", "again."); + stage = 2; + } + break; + case 2: + npc("Thank you for all of your help " + player.getUsername() + "!"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (getStage(player)) { + case 0: + switch (stage) { + case 0: + npc("I'm so sorry, I didn't realize you were there.", "What might I assist you with?"); + stage++; + break; + case 1: + options("What about eggs..?", "What are you doing here?", "Are you in a costume?", "Nothing."); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + player("What about eggs..?"); + stage = 10; + break; + case 2: + npc("I am the easter bunny, and since it is easter", "I must begin handing out chocolate eggs to all", "of " + GameWorld.getSettings().getName() + "."); + stage = 20; + break; + case 3: + player("Are you in a costume?"); + stage = 30; + break; + case 4: + player("Nothing, just passing through."); + stage = 40; + break; + } + break; + case 10: + npc("Being the easter bunny is no simple task and", "I have found myself very overwhelmed this year.", "I have no clue how I must deliver all of these basket", "of eggs to all the people of " + GameWorld.getSettings().getName() + "."); + stage = 21; + break; + case 20: + npc("I must admit that it is a very large task", "for such a bunny like myself. It takes a", "whole year to prepare and I am still behind!"); + stage++; + break; + case 21: + options("Do you need any help?", "Goodluck with that."); + stage++; + break; + case 22: + if (buttonId == 1) { + player("Do you need any help?"); + stage = 24; + } else { + player("Goodluck with that."); + stage++; + } + break; + case 23: + npc("Thank you for your concern..."); + stage = 31; + break; + case 24: + npc("I would appreciate your help very much " + player.getUsername() + ".", "You have two minutes to go and hand out 15", "eggs from the basket."); + stage++; + break; + case 25: + npc("Take this basket of eggs and hand out the chocolate eggs.", "When you're done come back and talk to me. I'm sure", "we can sort out some type of reward for your assistance."); + stage++; + break; + case 26: + interpreter.sendItemMessage(BASKET_OF_EGGS, "The easter bunny hands you a basket of eggs."); + stage++; + break; + case 27: + BasketofEggsEvent.this.setStage(player, 1); + player.getInventory().add(BASKET_OF_EGGS, player); + end(); + Pulse pulse = new Pulse(200, player) { + + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogue("Your time is up. Go and talk to the easter bunny."); + return true; + } + + @Override + public void stop() { + player.getBank().remove(BASKET_OF_EGGS); + player.getEquipment().remove(BASKET_OF_EGGS); + player.getInventory().remove(BASKET_OF_EGGS); + super.stop(); + } + }; + player.setAttribute("egg-pulse", pulse); + GameWorld.getPulser().submit(pulse); + break; + case 30: + npc("No you fool! I am an easter bunny!!"); + stage++; + break; + case 31: + end(); + break; + case 40: + end(); + break; + } + break; + case 1: + switch (stage) { + case 0: + player.removeAttribute("eggs"); + interpreter.sendItemMessage(RUBBER_CHICKEN, "The easter bunny hands you over a rubber chicken", "and unlocks the 'Bunny-hop' emote."); + stage++; + break; + case 1: + player.getBank().remove(BASKET_OF_EGGS); + player.getEquipment().remove(BASKET_OF_EGGS); + player.getInventory().remove(BASKET_OF_EGGS); + player.getInventory().add(RUBBER_CHICKEN, player); + player.getEmoteManager().unlock(Emotes.BUNNY_HOP); + BasketofEggsEvent.this.setStage(player, 2); + end(); + break; + case 2: + interpreter.sendItemMessage(BASKET_OF_EGGS, "The easter bunny hands you a basket of eggs."); + stage++; + break; + case 3: + player.removeAttribute("eggs"); + player.getInventory().add(BASKET_OF_EGGS, player); + end(); + Pulse pulse = new Pulse(200, player) { + + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogue("Your time is up. Go and talk to the easter bunny."); + return true; + } + + @Override + public void stop() { + player.getBank().remove(BASKET_OF_EGGS); + player.getEquipment().remove(BASKET_OF_EGGS); + player.getInventory().remove(BASKET_OF_EGGS); + super.stop(); + } + }; + player.setAttribute("egg-pulse", pulse); + GameWorld.getPulser().submit(pulse); + break; + case 4: + end(); + break; + } + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1835 }; + } + + } + + /** + * Handles the interactions related to the basket of eggs. + * @author Vexia + * + */ + public class BasketofEggsPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + EGG_OPTION.setHandler(this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!(node instanceof Player)) { + return false; + } + if (getStage(player) != 1) { + player.getEquipment().remove(BASKET_OF_EGGS); + player.getInventory().remove(BASKET_OF_EGGS); + player.getBank().remove(BASKET_OF_EGGS); + return true; + } + if (!player.getEquipment().containsItem(BASKET_OF_EGGS)) { + player.sendMessage("You need to be wielding a basket of eggs in order to do that."); + return true; + } + Pulse pulse = player.getAttribute("egg-pulse", null); + if (pulse == null || !pulse.isRunning()) { + player.getEquipment().remove(BASKET_OF_EGGS); + player.getInventory().remove(BASKET_OF_EGGS); + player.getBank().remove(BASKET_OF_EGGS); + return true; + } + Player target = node.asPlayer(); + if (getEggs(target) >= 4 && !GameWorld.getSettings().isDevMode()) { + player.sendMessage("That player already has enough chocolate eggs."); + return true; + } + if (target.getInventory().freeSlots() < 1) { + player.sendMessage("That player doesn't have enough room in their inventory."); + return true; + } + target.sendMessage(player.getUsername() + " gave you an easter egg!"); + player.setAttribute("eggs", player.getAttribute("eggs", 0) + 1); + player.sendMessage("You gave " + target.getUsername() + " an easter egg!"); + target.getInventory().add(RandomFunction.getRandomElement(CHOCOLATE_EGGS)); + return true; + } + + } + + /** + * Handles the easter item plugin. + * @author Vexia + * + */ + public class EasterItemPlugin implements Plugin { + @Override + public Plugin newInstance(Object arg) throws Throwable { + RUBBER_CHICKEN.getDefinition().getHandlers().put("equipment", this); + BASKET_OF_EGGS.getDefinition().getHandlers().put("equipment", this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + final Player player = (Player) args[0]; + Item item = (Item) args[1]; + final Item other = args.length == 2 ? null : (Item) args[2]; + if (other != null) { + identifier = "equip"; + item = other; + } + switch (identifier) { + case "equip": + player.getInteraction().set(item.getId() == BASKET_OF_EGGS.getId() ? EGG_OPTION : WHACK_OPTION); + break; + case "unequip": + player.getInteraction().remove(item.getId() == BASKET_OF_EGGS.getId() ? EGG_OPTION : WHACK_OPTION); + break; + } + return true; + } + } + + /** + * Handles the interactions related to the rubber chicken. + * @author Vexia + * + */ + public class RubberchickenPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + RUBBER_CHICKEN.getDefinition().getHandlers().put("option:operate", this); + RUBBER_CHICKEN.getDefinition().getHandlers().put("option:dance", this); + WHACK_OPTION.setHandler(this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "whack": + if (!(node instanceof Player)) { + return true; + } + Player target = (Player) node; + player.lock(4); + player.face(target); + player.animate(Animation.create(1833)); + player.getAudioManager().send(2257, true); + node.asPlayer().getPacketDispatch().sendMessage(player.getUsername() + " whacks you with a rubber chicken."); + return true; + case "dance": + case "operate": + if (player.getAttribute("chicken-delay", 0) > GameWorld.getTicks()) { + return true; + } + player.setAttribute("chicken-delay", GameWorld.getTicks() + 8); + player.animate(Animation.create(1835)); + return true; + } + return true; + } + + // http://www.rune-server.org/2009scape-development/rs-503-client-server/tutorials/461911-718-right-click-mute-option-mods.html + // http://www.rune-server.org/2009scape-development/rs2-server/snippets/513788-474-rs2-server-player-option-5-used-rubber-chicken-includes.html + + } + + /** + * Represents the chocolate egg plugin. + * @author Vexia + * + */ + public class ChocolateEggPlugin extends Food { + + /** + * Constructs a new {@Code ChocolateEggPlugin} {@Code Object} + */ + public ChocolateEggPlugin() { + this(-1); + } + + @Override + public ChocolateEggPlugin newInstance(Object object) { + for (Item item : CHOCOLATE_EGGS) { + Consumables.add(new ChocolateEggPlugin(item.getId())); + } + return this; + } + + /** + * Constructs a new {@code CupofTeaPlugin} {@code Object}. + */ + public ChocolateEggPlugin(int id) { + super(new int[] {id}, new HealingEffect(0), new Animation(1835)); + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/holiday/halloween/DeathMansionEvent.java b/Server/src/main/java/Server/core/game/content/holiday/halloween/DeathMansionEvent.java new file mode 100644 index 000000000..08fbf015b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/holiday/halloween/DeathMansionEvent.java @@ -0,0 +1,1726 @@ +package core.game.content.holiday.halloween; + +import java.util.ArrayList; +import java.util.List; + +import core.ServerConstants; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueAction; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.holiday.HolidayEvent; +import core.game.content.holiday.HolidayItem; +import core.game.content.holiday.HolidayType; +import core.game.content.holiday.ItemLimitation; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.node.entity.player.link.request.RequestType; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the death mansion halloween event set in 2007. + * @author Vexia + * @author Emperor + * @see http://2009scape.wikia.com/wiki/2007_Hallowe'en_event + */ +@Initializable +public class DeathMansionEvent extends HolidayEvent { + + /** + * The last pumpkin being rewarded for skilling. + */ + private static int lastPumpkinReward; + + /** + * The grim reaper chat messages. + */ + private static final String[] GRIM_CHATS = new String[] { "Let me escort you away, @name...", "@name is mine!", "Now is the time you die, @name.", "Muahahahahaha!", "There is no escape, @name...", "Beware Mortals. @name travels with me now.", "I claim @name as my own.", "Your time here is over, @name.", "I have come for you, @name!" }; + + /** + * The current pumpkin item. + */ + private static Item pumpkin; + + /** + * The location of bad webs to choose from. + */ + private static final Location[][] WEB_PATHS = new Location[][] { { new Location(1709, 4837, 0), new Location(1708, 4839, 0), new Location(1705, 4841, 0), new Location(1703, 4843, 0) },// path + // 1 + { new Location(1706, 4836, 0), new Location(1704, 4837, 0), new Location(1702, 4842, 0) },// path + // 2 + { new Location(1704, 4835, 0), new Location(1704, 4837, 0), new Location(1697, 4841, 0), new Location(1695, 4846, 0), new Location(1697, 4848, 0) },// path + // 3 + { new Location(1700, 4835, 0), new Location(1698, 4838, 0), new Location(1697, 4841, 0), new Location(1698, 4845, 0) },// path + // 4 + { new Location(1691, 4835, 0), new Location(1690, 4838, 0), new Location(1691, 4840, 0), new Location(1693, 4843, 0), new Location(1694, 4845, 0), new Location(1695, 4846, 0), new Location(1697, 4848, 0) },// path + // 5 + { new Location(1684, 4839, 0), new Location(1687, 4840, 0), new Location(1691, 4840, 0), new Location(1693, 4843, 0), new Location(1694, 4845, 0), new Location(1695, 4846, 0), new Location(1697, 4848, 0) },// path + // 6 + { new Location(1704, 4835, 0), new Location(1704, 4837, 0), new Location(1694, 4840, 0), new Location(1693, 4843, 0), new Location(1694, 4845, 0), new Location(1698, 4845, 0) } // 7 + }; + + /** + * The start location. + */ + public static final Location START = new Location(1697, 4814, 0); + + /** + * The portal location. + */ + public static final Location PORTAL_LOCATION = new Location(3000, 3270, 0); + + /** + * The servants skull item. + */ + public static final Item SERVANT_SKULL = new Item(11784); + + /** + * The diary item. + */ + public static final Item DIARY = new Item(11780); + + /** + * The hood item. + */ + public static final Item HOOD = new Item(11789); + + /** + * The grim reaper id. + */ + public static final int GRIM_REAPER = 6390; + + /** + * The muncher npc id. + */ + public static final int MUNCHER = 2329; + + /** + * The death portal id. + */ + public static final int DEATH_PORTAL = 27254; + + /** + * Constructs a new {@code DeathMansionEvent} {@code Object} + */ + public DeathMansionEvent() { + super("Death Mansion", HolidayType.HALLOWEEN, 1085, 16, 9); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (isActive()) { + PluginManager.definePlugins(new DarkPortalHandler(), new DeathPortalZone(), new GrimReaperDialogue(), new MuncherDialogue(), new MuncherNPC(), new GrimItemHandler()); + } + return super.newInstance(arg); + } + + @Override + public boolean enter(Entity entity) { + if (entity instanceof Player) { + Player player = entity.asPlayer(); + player.getProperties().setSpawnLocation(START); + if (getStage(player) == 3 && !player.hasItem(SERVANT_SKULL)) { + setStage(player, 2); + } + } + return super.enter(entity); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player player = e.asPlayer(); + if (!logout) { + if (player.getAttribute("grimDis", 0) > GameWorld.getTicks()) { + return super.leave(player, logout); + } + int stage = getStage(player); + if (stage == 5) { + GrimItem.resetItems(player); + player.sendMessage("Any items you were carrying from the house have been removed."); + } + cleanItems(player, GrimItem.getItems()); + cleanItems(player, new Item[] { DIARY, SERVANT_SKULL }); + } else { + List objs = player.getAttribute("objs", null); + if (objs == null) { + objs = new ArrayList(); + } + for (GameObject o : objs) { + if (RegionManager.getLocalEntitys(o.getLocation(), 1).size() != 0) { + continue; + } + if (!o.getLocation().withinDistance(player.getLocation(), 1)) { + player.getPacketDispatch().sendObjectAnimation(o, Animation.create(7286)); + } + } + } + player.getProperties().setSpawnLocation(ServerConstants.HOME_LOCATION); + } + return super.leave(e, logout); + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (e instanceof Player) { + if (type != -1) { + e.asPlayer().getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "Foolish mortal! Do you have no manners? Use", "the portal near me to exit my mansion."); + return false; + } + } + return super.teleport(e, type, node); + } + + @Override + public boolean isComplete(Player player) { + return super.isComplete(player) || getStage(player) < 0 || getConfig(player) == 249852; + } + + @Override + public boolean interact(Entity e, final Node target, Option option) { + if (e instanceof Player) { + final Player player = e.asPlayer(); + switch (target.getId()) { + case DEATH_PORTAL: + player.teleport(PORTAL_LOCATION); + return true; + case 27276: + handlePassageWay(player, target.asObject()); + return true; + case 27266: + passSpiderWeb(player, target.asObject()); + return true; + case 27242: + case 27243: + if (getStage(player) >= 6) { + player.setAttribute("grimDis", GameWorld.getTicks() + 2); + player.teleport(target.getId() == 27243 ? Location.create(1703, 4826, 0) : Location.create(1639, 4835, 0)); + return true; + } + player.getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "Don't go gallivanting around my house. Come and see", "me if you're not sure what to do."); + return true; + case 27257: + if (!player.getInventory().hasSpaceFor(SERVANT_SKULL)) { + player.sendMessage("You don't have enough inventory space."); + return true; + } + int webIndex = player.getAttribute("webIndex", 0); + int newIndex = -1; + while (newIndex == -1) { + newIndex = RandomFunction.random(WEB_PATHS.length); + if (newIndex == webIndex) { + newIndex = -1; + } + } + player.setAttribute("/save:webIndex", newIndex); + setStage(player, 3); + player.getInventory().add(SERVANT_SKULL); + player.getDialogueInterpreter().sendItemMessage(SERVANT_SKULL, "You found the servant's skull. Now to get out of the garden."); + return true; + case 2329: + player.getDialogueInterpreter().open("muncher-dialogue", target); + return true; + case 27245: + if (getStage(player) >= 6) { + player.sendMessage("There's no need to search the table any more."); + return true; + } + if (!player.hasItem(DIARY)) { + player.getInventory().add(DIARY); + player.getDialogueInterpreter().sendItemMessage(DIARY, "You find a diary on the table. This should give some clues as to where items within the room should go."); + } else { + player.sendMessage("You already have a copy of the diary, you don't need to take another."); + } + return true; + case 11780: + if (option.getName().toLowerCase().equals("read")) { + if (!player.getAttribute("read-diary", false)) { + player.getDialogueInterpreter().sendDialogues(player, null, "Hopefully, by reading this, I can find clues on where to", "put any items I find."); + player.setAttribute("/save:read-diary", true); + player.getDialogueInterpreter().addAction(new DialogueAction() { + @Override + public void handle(Player player, int buttonId) { + player.getDialogueInterpreter().open("grim-diary"); + } + }); + } else { + player.getDialogueInterpreter().open("grim-diary"); + } + return true; + } + break; + case 27255: + case 27247: + case 27246: + case 27261: + case 27252: + case 27250: + case 27248: + case 27251: + case 27249: + case 27253: + final GrimItem item = GrimItem.forObjectId(target.getId()); + if (item == GrimItem.HUMAN_BONES) { + player.getDialogueInterpreter().sendOptions("Where to search?", "Towards the left", "Towards the right"); + player.getDialogueInterpreter().addAction(new DialogueAction() { + @Override + public void handle(Player player, int buttonId) { + if (buttonId == 2) { + item.search(player, target.asObject()); + } else { + player.animate(Animation.create(7271)); + player.getDialogueInterpreter().sendDialogues(player, FacialExpression.SUSPICIOUS, "Arrghhh! My eyes!"); + } + } + }); + return true; + } else if (item == GrimItem.EYEBALL) { + player.getDialogueInterpreter().sendOptions("Where to search?", "Under the cushions", "Under the sofa"); + player.getDialogueInterpreter().addAction(new DialogueAction() { + @Override + public void handle(Player player, int buttonId) { + if (buttonId == 1) { + item.search(player, target.asObject()); + } else { + player.getPacketDispatch().sendObjectAnimation(target.asObject(), Animation.create(7278)); + player.animate(Animation.create(7272)); + player.getDialogueInterpreter().sendDialogues(player, FacialExpression.DISGUSTED, "That wasn't such a good idea."); + } + } + }); + return true; + } + item.search(player, target.asObject()); + return true; + case 27278: + final Location end = target.getLocation().equals(new Location(1633, 4824, 0)) ? new Location(1630, 4824, 0) : target.getLocation().equals(new Location(1627, 4819, 0)) ? new Location(1627, 4819, 0) : target.getLocation().equals(new Location(1630, 4819, 0)) ? new Location(1627, 4819, 0) : target.getLocation().equals(1624, 4822, 0) ? new Location(1624, 4828, 0) : new Location(1637, 4820, 0); + if (target.getLocation().equals(new Location(1637, 4820, 0)) || target.getLocation().equals(new Location(1630, 4824, 0)) || target.getLocation().equals(new Location(1627, 4819, 0))) { + player.sendMessage("You can't go back that way."); + return true; + } + player.lock(3); + if (target.getLocation().equals(1624, 4822, 0)) { + player.sendChat("Weeeeee"); + GameWorld.getPulser().submit(new Pulse(1, player) { + + @Override + public boolean pulse() { + player.getWalkingQueue().reset(); + player.getWalkingQueue().setRunDisabled(true); + player.addExtension(LogoutTask.class, new LocationLogoutTask(10000000, new Location(1624, 4821, 0))); + player.getInterfaceManager().closeDefaultTabs(); + player.getAppearance().setStandAnimation(7266); + player.getAppearance().setWalkAnimation(7267); + player.getAppearance().setRunAnimation(7267); + player.getAppearance().setTurn180(7267); + player.getAppearance().setTurn90ccw(7267); + player.getAppearance().setTurn90cw(7267); + player.getAppearance().sync(); + return true; + } + + }); + } + player.getPacketDispatch().sendObjectAnimation(target.asObject(), Animation.create(7296)); + AgilityHandler.walk(player, -1, player.getLocation(), target.getLocation(), null, 0.0, null); + GameWorld.getPulser().submit(new Pulse(1, player) { + + @Override + public boolean pulse() { + AgilityHandler.forceWalk(player, -1, player.getLocation(), end, Animation.create(target.getLocation().equals(1624, 4822, 0) ? 7269 : 7268), target.getLocation().equals(1624, 4822, 0) ? 80 : 40, 0.0, null); + return true; + } + + }); + return true; + case 27211: + player.getInterfaceManager().restoreTabs(); + player.removeExtension(LogoutTask.class); + player.getAppearance().setDefaultAnimations(); + player.getAppearance().sync(); + player.getWalkingQueue().setRunDisabled(false); + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(0, 3, 0), Animation.create(7273), 6, 0.0, null); + return true; + case 27212: + player.sendMessage("You can't go back that way."); + return true; + case 27218: + player.lock(10); + Location strt = player.getLocation().transform(0, -1, 0); + AgilityHandler.forceWalk(player, -1, player.getLocation(), strt, Animation.create(7274), 5, 0.0, null); + GameWorld.getPulser().submit(new Pulse(1, player) { + int ticks; + int x = 1636; + int y = 4829; + int yInc = 0; + int xInc = 0; + int speed = 100; + int height = 560; + + @Override + public boolean pulse() { + switch (++ticks) { + case 1: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x + xInc, y + yInc, height, 1, speed)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + 5, y - 4, height, 1, speed)); + break; + case 8: + x = 1637; + y = 4816; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x + xInc, y + yInc, height, 1, speed)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + 1, y + 1, height, 1, speed)); + ForceMovement.run(player, player.getLocation(), player.getLocation().transform(0, -5, 0), null, null, Direction.SOUTH, 50); + break; + case 10: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, x + 5, y - 4, height, 1, speed)); + return true; + } + return false; + } + }); + return true; + } + } + return super.interact(e, target, option); + } + + @Override + public void locationUpdate(Entity entity, Location last) { + if (entity instanceof Player) { + final Player p = entity.asPlayer(); + Location loc = p.getLocation(); + List objs = p.getAttribute("objs", null); + if (objs == null) { + objs = new ArrayList(); + } + for (int i = 0; i < 1; i++) { + for (Direction direction : Direction.values()) { + GameObject o = RegionManager.getObject(loc.transform(direction, 1)); + if (o != null && o.getId() == 27241) { + objs.add(o); + p.setAttribute("objs", objs); + p.getPacketDispatch().sendObjectAnimation(o, Animation.create(7289)); + } + } + } + for (GameObject o : objs) { + if (RegionManager.getLocalEntitys(o.getLocation(), 1).size() != 0) { + continue; + } + if (!o.getLocation().withinDistance(p.getLocation(), 1)) { + p.getPacketDispatch().sendObjectAnimation(o, Animation.create(7286)); + } + } + if (loc.getX() >= 1630 && loc.getX() <= 1646 && loc.getY() >= 4844 && loc.getY() <= 4852) { + final GameObject object = RegionManager.getObject(entity.getLocation()); + if (object != null && object.getId() == 27240) { + p.getWalkingQueue().reset(); + p.getLocks().lock(); + p.sendMessage("You accidentally trigger a trap."); + GameWorld.getPulser().submit(new Pulse(1, p) { + int ticks; + + @Override + public boolean pulse() { + switch (++ticks) { + case 1: + if (!p.getLocation().equals(object.getLocation())) { + p.teleport(object.getLocation()); + } + p.lock(); + p.getPacketDispatch().sendObjectAnimation(object, Animation.create(1939)); + break; + case 2: + p.animate(Animation.create(4366)); + break; + case 4: + p.getPacketDispatch().sendGlobalPositionGraphic(86, object.getLocation()); + p.teleport(new Location(1641, 4830, 0)); + break; + case 5: + p.unlock(); + p.getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "Look closely and you should see the joins", "of the doors on the ground."); + return true; + } + return false; + } + }); + return; + } + } + } + super.locationUpdate(entity, last); + } + + @Override + public boolean canRequest(RequestType type, Player player, Player target) { + if (player.getAppearance().getStandAnimation() == 7266 || target.getAppearance().getStandAnimation() == 7266) { + return false; + } + return super.canRequest(type, player, target); + } + + /** + * Handles the passage way. + * @param player the player. + * @param target the target. + */ + private void handlePassageWay(final Player player, final GameObject target) { + int stage = getStage(player); + if (stage < 1 || stage < 4 && target.getLocation().getX() == 1694) { + electrocute(player, target); + return; + } + if (stage >= 6 && target.getLocation().getX() == 1645) { + player.lock(2); + player.animate(Animation.create(7299)); + player.graphics(Graphics.create(281)); + setStage(player, stage + 1); + player.teleport(stage + 1 == 8 ? Location.create(1633, 4839, 0) : new Location(1642, 4828, 0), 1); + player.getDialogueInterpreter().open(GRIM_REAPER, true, true); + return; + } + if (stage >= 4 && player.getLocation().getX() == 1701 || stage >= 6 && (target.getLocation().getX() == 1694 && player.getLocation().getX() >= target.getLocation().getX()) || stage >= 8 && target.getLocation().equals(new Location(1641, 4829, 0))) { + player.getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "Foolish mortal! You have no business in there."); + return; + } + if (stage == 1 && player.getLocation().getX() == 1701) { + setStage(player, 2); + passDorway(player, target.getLocation()); + player.getDialogueInterpreter().open(GRIM_REAPER, true, true); + return; + } else if (stage == 3 && player.getLocation().getX() == 1701 && player.getInventory().containsItem(SERVANT_SKULL)) { + setStage(player, 4); + passDorway(player, target.getLocation()); + player.getInventory().remove(SERVANT_SKULL); + player.removeAttribute("webIndex"); + player.getDialogueInterpreter().open(GRIM_REAPER, true, true, true); + return; + } else if (getStage(player) == 4 && target.getLocation().getX() == 1694) { + setStage(player, 5); + passDorway(player, target.getLocation()); + player.getDialogueInterpreter().open(GRIM_REAPER, true, true); + return; + } + player.getDialogueInterpreter().sendDialogues(6389, 7292, "We're watching you..."); + player.getDialogueInterpreter().addAction(new DialogueAction() { + @Override + public void handle(Player player, int buttonId) { + passDorway(player, target.getLocation()); + } + }); + } + + /** + * Passes through a spider web. + * @param player the player. + * @param object the object. + */ + private void passSpiderWeb(Player player, GameObject object) { + int webIndex = player.getAttribute("webIndex", -1); + if (webIndex == -1) { + player.setAttribute("/save:webIndex", (webIndex = RandomFunction.random(WEB_PATHS.length))); + } + boolean goodWeb = false; + for (Location l : WEB_PATHS[webIndex]) { + if (l.equals(object.getLocation())) { + goodWeb = true; + break; + } + } + if (!goodWeb) { + player.sendMessage("You cannot pass through this particular web - try another."); + return; + } + player.getPacketDispatch().sendObjectAnimation(object, Animation.create(7280)); + player.lock(3); + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(Direction.getDirection(player.getLocation(), object.getLocation()), 2), Animation.create(2240), 8, 0.0, null); + } + + /** + * Passes through a doorway. + * @param player the player. + * @param location the location. + */ + public void passDorway(Player player, Location location) { + Location end = player.getLocation().transform(Direction.getDirection(player.getLocation(), location), 2); + player.addExtension(LogoutTask.class, new LocationLogoutTask(3, end)); + player.sendMessage("You safely pass through the gargoyles' judgement."); + player.lock(3); + AgilityHandler.walk(player, -1, player.getLocation(), end, null, 0.0, null); + } + + /** + * Electrocutes the player. + * @param player the player. + * @param object the object. + */ + private void electrocute(final Player player, GameObject object) { + player.lock(4); + player.animate(Animation.create(7299)); + player.graphics(Graphics.create(281)); + int x = 0, x2 = 0; + int y = 0, y2 = 0; + Direction dir = object.getDirection(); + if (dir == Direction.SOUTH || dir == Direction.NORTH) { + x = 1; + x2 = -1; + } else if (dir == Direction.WEST) { + y = 1; + y2 = -1; + } else { + y = -1; + y2 = 1; + } + GameObject first = RegionManager.getObject(object.getLocation().transform(x, y, 0)); + GameObject second = RegionManager.getObject(object.getLocation().transform(x2, y2, 0)); + if (first != null && second != null) { + player.getPacketDispatch().sendObjectAnimation(first, Animation.create(7285)); + player.getPacketDispatch().sendObjectAnimation(second, Animation.create(7285)); + } + player.sendMessage("You fail to pass through the gargoyles' judgement"); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.getImpactHandler().manualHit(player, player.getSkills().getLifepoints(), HitsplatType.NORMAL); + player.getDialogueInterpreter().sendDialogues(GRIM_REAPER, null, "You may be able to wander around other people's", "houses, but I shall not allow it."); + return true; + } + }); + } + + @Override + public void load() { + // ObjectBuilder.add(new GameObject(DEATH_PORTAL, new Location(2999, + // 3268, 0))); + pumpkin = new Item(1959); + for (int id = 1053; id < 1059; id += 2) { + if (!ItemLimitation.isRegistered(id)) { + ItemLimitation.register(id, 15); + } + } + if (!ItemLimitation.isRegistered(pumpkin.getId())) { + ItemLimitation.register(pumpkin.getId(), 100); + } + if (ItemLimitation.getAmountLeft(pumpkin.getId()) > 0) { + HolidayItem.startRandomSpawn(pumpkin, 1000, Location.create(3433, 3534, 0), Location.create(3099, 3548, 0), Location.create(3067, 10255, 0), Location.create(2913, 3746, 0), Location.create(3193, 3914, 0), Location.create(3214, 9618, 0), Location.create(3227, 3219, 2), Location.create(3300, 3312, 0), Location.create(3075, 3260, 0), Location.create(3213, 3428, 0), Location.create(3213, 3480, 0), Location.create(2710, 3460, 0), Location.create(2750, 3440, 0), Location.create(2927, 3144, 0), Location.create(2667, 3309, 0), Location.create(2600, 3104, 0), Location.create(2910, 4832, 0), Location.create(2925, 3445, 0), Location.create(2475, 3423, 1), Location.create(2817, 3441, 0), Location.create(2948, 3216, 0), Location.create(1864, 5243, 0), Location.create(2706, 3733, 0), Location.create(3186, 3446, 1), Location.create(3189, 9832, 0), Location.create(2655, 3310, 0), Location.create(3145, 9913, 0)); + } + } + + @Override + public void addExperience(Player player, int skill, double experience) { + if (skill <= Skills.MAGIC && skill != Skills.PRAYER) { + return; + } + if (GameWorld.getTicks() - lastPumpkinReward < 1000 && RandomFunction.random(2500) == 0 && ItemLimitation.getAmountLeft(pumpkin.getId()) > 0) { + if (player.getInventory().add(pumpkin)) { + player.getPacketDispatch().sendMessage("You found a pumpkin!"); + lastPumpkinReward = GameWorld.getTicks(); + ItemLimitation.decreaseAmount(pumpkin.getId()); + } + } + } + + @Override + public void commenceDeath(Entity killer, Entity victim) { + if (!(victim instanceof Player) || victim.getZoneMonitor().isInZone("Death Mansion")) { + return; + } + Player player = (Player) victim; + final NPC reaper = NPC.create(2862, player.getLocation()); + reaper.setLocation(RegionManager.getSpawnLocation(player, reaper)); + if (reaper.getLocation() == null) { + return; + } + reaper.init(); + reaper.face(player); + reaper.setWalks(false); + reaper.setNeverWalks(true); + reaper.setAggressive(false); + reaper.animate(Animation.create(392)); + reaper.sendChat(RandomFunction.getRandomElement(GRIM_CHATS).replace("@name", player.getUsername())); + GameWorld.getPulser().submit(new Pulse(4, reaper) { + @Override + public boolean pulse() { + reaper.clear(); + return true; + } + }); + } + + @Override + public void finalizeDeath(Entity killer, Entity victim) { + if (killer instanceof Player && victim instanceof NPC) { + Player player = (Player) killer; + if (victim.getProperties().getCurrentCombatLevel() > 0) { + int chance = (5_000 / victim.getProperties().getCurrentCombatLevel()) * 100; + if (RandomFunction.random(chance) == 0) { + int itemId = 1053 + (RandomFunction.random(3) * 2); + if (ItemLimitation.getAmountLeft(itemId) > 0) { + ItemLimitation.decreaseAmount(itemId); + Repository.sendNews(player.getUsername() + " found a halloween mask!"); + player.getPacketDispatch().sendMessage("You find a scary looking mask."); + GroundItemManager.create(new Item(itemId), victim.getLocation(), player); + } + } + } + } + } + + @Override + public boolean isActive() { + return false; + } + + @Override + public void configure() { + registerRegion(6731); + registerRegion(6475); + } + + /** + * Handles the grim item handler. + * @author Vexia + */ + public static class GrimItemHandler extends UseWithHandler { + + /** + * The object ids. + */ + private static final int[] OBJECTS = new int[] { 27249, 27255, 27247, 27246, 27261, 27260, 27252, 27248, 27250, 27251, 27253 }; + + /** + * Constructs a new {@code GrimItemHandler} {@code Object} + */ + public GrimItemHandler() { + super(11782, 11781, 11785, 11787, 11786, 11788, 11783); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : OBJECTS) { + addHandler(id, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + GrimItem item = GrimItem.forDestinationId(event.getUsedWith().getId()); + if (item == null || event.getUsedItem().getId() != item.getItem().getId()) { + return false; + } + item.useWithEvent(player, event.getUsedWith().asObject()); + return true; + } + + } + + /** + * A grim reaper item. + * @author Vexia + */ + public enum GrimItem { + TESTAMENT(new int[] { 27255 }, new Item(11782), "You found someone's Last Will and Testament.", new String[] { "You recall the entry in the diary, '...have to sit on that for a while...'", "and place the Last Will and Testament under the sofa cushions." }, 27252), ROBE(new int[] { 27247, 27246 }, new Item(11781), "You found the Grim Reaper's robes.", new String[] { "You recall the entry in the diary, '...decided to throw them in the", "fireplace...' and place the robes in the fireplace." }, 27251), HOURGLASS(new int[] { 27261, 27260 }, new Item(11785), "You found an hourglass.", new String[] { "You recall the entry in the diary, '...hourglass today so have added", "that to the fishtank...' and place the hourglass in the fishtank." }, 27253), EYEBALL(new int[] { 27252 }, new Item(11787), "You found someone's eye.", new String[] { "You recall the entry in the diary, '...I put the eye back on the", "shelf...' and place the eye on the shelf." }, 27261, 27260), SCYTHE_SHARPENER(new int[] { 27248, 27249, 27250 }, new Item(11786), "You found a scythe sharpener.", new String[] { "You recall the entry in the diary, '...put the sharpener back in the", "cabinet...' and place the scythe sharpener in the cabinet." }, 27247, 27246), POTION(new int[] { 27251 }, new Item(11788), "You found a 'Voice of Doom' potion.", new String[] { "You recall the entry in the diary, '...I found my old 'Voice of Doom'", "potion amongst some books...' and place the potion on the bookcase." }, 27248, 27249, 27250), HUMAN_BONES(new int[] { 27253 }, new Item(11783), "You found some bones. They look decidely human.", new String[] { "You recall the entry in the diary, '...decided to lock them up in the", "chest...' and place the bones in the chest." }, 27255); + + /** + * The object id. + */ + private final int[] objectIds; + + /** + * The item. + */ + private final Item item; + + /** + * The found text. + */ + private final String foundText; + + /** + * The return text. + */ + private final String[] returnText; + + /** + * The destination object id. + */ + private final int[] destinationIds; + + /** + * Constructs a new {@code GrimItem} {@code Object} + * @param objectIds the object ids. + * @param item the item. + * @param foundText the found text. + * @param returnText the returning text. + */ + private GrimItem(int[] objectIds, Item item, String foundText, String[] returnText, int... destinationIds) { + this.objectIds = objectIds; + this.item = item; + this.foundText = foundText; + this.returnText = returnText; + this.destinationIds = destinationIds; + } + + /** + * Searches for the grim item. + * @param player the player. + * @param object the object. + */ + public void search(Player player, GameObject object) { + if (!player.getInventory().hasSpaceFor(item)) { + player.sendMessage("You don't have enough inventory space."); + return; + } + if (player.getInventory().containsItem(item) || hasGrimItem(player, this)) { + player.getDialogueInterpreter().sendDialogue("You have already taken the item you were looking for", "from here."); + return; + } + if (player.getInventory().add(item)) { + player.animate(Animation.create(833)); + player.getDialogueInterpreter().sendItemMessage(item, foundText); + } + } + + /** + * Called on the use with event. + * @param player the player. + * @param object the object. + */ + public void useWithEvent(Player player, GameObject object) { + if (hasGrimItem(player, this)) { + player.getDialogueInterpreter().sendDialogue("You have already returned this item to it's proper", "spot in the mansion."); + return; + } + if (player.getInventory().remove(item)) { + setGrimItem(player, this); + player.animate(Animation.create(833)); + player.getDialogueInterpreter().sendDialogue(returnText); + if (getGrimItems(player).size() == values().length) { + DeathMansionEvent event = (DeathMansionEvent) player.getZoneMonitor().getZones().get(0).getZone(); + if (event != null) { + player.removeAttribute("ready-diary"); + event.setStage(player, 6); + player.getDialogueInterpreter().open(GRIM_REAPER, true, true); + } + } + } + } + + /** + * Checks if the player has the grim item. + * @param player the player. + * @param item the item. + * @return {@code True} if so. + */ + public static boolean hasGrimItem(Player player, GrimItem item) { + return getGrimItems(player).contains(item); + } + + /** + * Sets the grim item as completed. + * @param player the player. + * @param item the item. + */ + public static void setGrimItem(Player player, GrimItem item) { + List items = getGrimItems(player); + items.add(item); + player.setAttribute("grim-items", items); + } + + /** + * Resets the grim items. + * @param player the items. + */ + public static void resetItems(Player player) { + player.removeAttribute("grim-items"); + } + + /** + * Gets the list of set grim items. + * @param player the player. + * @return the items. + */ + public static List getGrimItems(Player player) { + List items = player.getAttribute("grim-items", null); + if (items == null) { + items = new ArrayList<>(); + } + player.setAttribute("grim-items", items); + return items; + } + + /** + * Gets the grim item by the destination id. + * @param objectId the object id. + * @return the id. + */ + public static GrimItem forDestinationId(int objectId) { + for (GrimItem item : values()) { + for (int id : item.getDestinationId()) { + if (id == objectId) { + return item; + } + } + } + return null; + } + + /** + * Gets the object id. + * @param objectId the object id. + * @return the grim item. + */ + public static GrimItem forObjectId(int objectId) { + for (GrimItem item : values()) { + for (int id : item.getObjectIds()) { + if (id == objectId) { + return item; + } + } + } + return null; + } + + /** + * Gets the items. + * @return the items. + */ + public static Item[] getItems() { + Item[] items = new Item[values().length]; + for (int i = 0; i < items.length; i++) { + items[i] = values()[i].getItem(); + } + return items; + } + + /** + * Gets the objectId. + * @return the objectId + */ + public int[] getObjectIds() { + return objectIds; + } + + /** + * Gets the item. + * @return the item + */ + public Item getItem() { + return item; + } + + /** + * Gets the foundText. + * @return the foundText + */ + public String getFoundText() { + return foundText; + } + + /** + * Gets the returnText. + * @return the returnText + */ + public String[] getReturnText() { + return returnText; + } + + /** + * Gets the destinationId. + * @return the destinationId + */ + public int[] getDestinationId() { + return destinationIds; + } + + } + + /** + * Handles the grim reaper dialogue. + * @author Vexia + */ + public class GrimReaperDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GrimReaperDialogue} {@code Object} + */ + public GrimReaperDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GrimReaperDialogue} {@code Object} + * @param player the player. + */ + public GrimReaperDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GrimReaperDialogue(player); + } + + @Override + public boolean open(Object... args) { + switch (getStage(player)) { + case 0: + player("Erm... Excuse me... Could I ask..."); + break; + case 1: + case 2: + case 3: + if (args.length > 1) { + npc("You have found my garden I see."); + stage = 100; + return true; + } + player("Erm... What was I supposed to do?"); + break; + case 4: + if (args.length == 0 && !player.getInventory().containsItem(SERVANT_SKULL)) { + player("Erm... What was I supposed to do?"); + stage = 2; + return true; + } + player("Woah, what'd I do? Oh no, the skull's gone."); + break; + case 5: + if (args.length > 1) { + npc("You made it."); + } else { + npc("Foolish mortal, get back to the task."); + stage = -1; + } + break; + case 6: + if (args.length > 1) { + npc("Looks like you've returned everything to its proper", "location."); + stage = 20; + } else { + player("Erm... What was I supposed to do?"); + } + break; + case 7: + if (args.length > 1) { + player("Huh? What happened there?"); + stage = 20; + } else { + player("Erm... What was I supposed to do?"); + } + break; + case 8: + if (args.length > 1) { + npc("That is sufficient."); + stage = 20; + } else { + player("You wished to speak with me?"); + } + break; + case 9: + case -12290: + end(); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getAttribute("lo", false)) { + end(); + return true; + } + switch (getStage(player)) { + case 0: + switch (stage) { + case 0: + npc("Speak, mortal."); + stage++; + break; + case 1: + player("Well, sir, lord, erm, your highness..."); + stage++; + break; + case 2: + npc("I need no title."); + stage++; + break; + case 3: + player("Well, of course. Sorry. I was just wondering, what is", "this place?"); + stage++; + break; + case 4: + npc("My house. You have found yourself here because I", "deem it necessary."); + stage++; + break; + case 5: + player("You do?"); + stage++; + break; + case 6: + npc("Long have I had a servant performing tasks as", "instructed. He left my service to pass on into death", "Such a role is to be replaced."); + stage++; + break; + case 7: + player("I see so you want me to be your servant?"); + stage++; + break; + case 8: + npc("Eager assumptions shall bring you regret, human. A", "worthy soul has already been picked for the position.", "My house is open now as various things need attending", "to before the transition can take place."); + stage++; + break; + case 9: + player("So basically you want me to tidy up some things before", "your new servant arrives?"); + stage++; + break; + case 10: + npc("Interpret as you will, mortal!"); + stage++; + break; + case 11: + options("I'll help out no problem.", "That doesn't really appeal, I'm off."); + stage++; + break; + case 12: + if (buttonId == 1) { + player("I'll help out no problem."); + stage = 15; + break; + } + player("That doesn't really appeal, I'm off."); + stage++; + break; + case 13: + npc("So be it, mortal!"); + stage++; + break; + case 14: + end(); + break; + case 15: + DeathMansionEvent.this.setStage(player, 1, 16); + npc("Proceeding as instructed is the best way to survive", "here, human. I can always see you and can speak with", "you whenever I wish as this is my domain. Go to the", "garden for further instructions."); + stage++; + break; + } + break; + case 1: + case 2: + case 3: + switch (stage) { + case 0: + npc("Foolish mortal! Proceed to the garden for", "further instructions."); + stage++; + break; + case 1: + end(); + break; + case 16: + player("Always watched, To the garden. Thank you. Much", "appreciated."); + stage++; + break; + case 17: + end(); + break; + case 100: + player("Woah. You made me jump. How does your voice carry", "so far?"); + stage++; + break; + case 101: + npc("That is not of your concern. Whilst in my domain you", "shall never be far from my gaze."); + stage++; + break; + case 102: + player("Okay... So, what exactly do you want me to do out", "here?"); + stage++; + break; + case 103: + npc("My last servant died in here. His skull still remains and", "you must bring it out to prevent my next servant from", "getting the wrong impression."); + stage++; + break; + case 104: + player("And I suppose your servant was killed by some huge", "man-eating spider?"); + stage++; + break; + case 105: + npc("That is not your business, mortal. Anyway, the webs", "you see are from a nest of very small spiders. Some", "webs you can pass, some you cannot. You will only", "need to use your bare hands to break though."); + stage++; + break; + case 106: + player("Sorry I asked. I'll go find the skull and bring it back", "out of the garden."); + stage++; + break; + case 107: + npc("Yes, and do not try teleporting out of the garden with", "the skull. The skull will remain behind and you'll have to", "find it again."); + stage++; + break; + case 108: + end(); + break; + } + break; + case 4: + switch (stage) { + case -1: + end(); + break; + case 0: + npc("Do not concern yourself. I had instructed the", "gargoyles to take it from you."); + stage++; + break; + case 1: + player("You could have let me know! I almost had a heart", "attack."); + stage++; + break; + case 2: + npc("Please proceed to the westernmost room for your next", "task."); + stage++; + break; + case 3: + player("You don't waste time, do you? So, the room that looks a", "bit like your lounge? I'm on my way."); + stage++; + break; + case 4: + end(); + break; + } + break; + case 5: + switch (stage) { + case -1: + end(); + break; + case 0: + player("You sound surprised."); + stage++; + break; + case 1: + npc("You wouldn't be the first, or last, to die in this house."); + stage++; + break; + case 2: + player("I'm so pleased. So, to the task at hand. What should I", "be doing in here?"); + stage++; + break; + case 3: + npc("If you search around the room you'll find various", "items. Put them back where they belong. My diary is", "on the table - read this for some clues, but tell anyone", "what you read and you die."); + stage++; + break; + case 4: + player("*Gulp* I shall have a look."); + stage++; + break; + case 5: + end(); + break; + } + break; + case 6: + switch (stage) { + case 0: + npc("Please proceed upstairs and enter", "the room you find there."); + stage = 22; + break; + case 20: + player("Woo hoo!"); + stage++; + break; + case 21: + npc("You've not finished yet, mortal. Please proceed upstairs", "and enter the room you find there."); + stage++; + break; + case 22: + player("Upstairs it is."); + stage++; + break; + case 23: + end(); + break; + } + break; + case 7: + switch (stage) { + case 0: + npc("You must complete the playground."); + stage = 23; + break; + case 20: + npc("Again."); + stage++; + break; + case 21: + player("What?"); + stage++; + break; + case 22: + npc("One more time around just to be sure all is in order."); + stage++; + break; + case 23: + end(); + break; + } + break; + case 8: + switch (stage) { + case 0: + npc("Correct. You have completed the tasks as ordered,", "hence your time here is done."); + stage++; + break; + case 1: + player("An I'm still alive. I rock!"); + stage++; + break; + case 2: + player("So...any chance of a reward for my service?"); + stage++; + break; + case 3: + npc("Hmmm. Mortals and their goal-driven attitude - one", "thing that shall forever elude my understanding. As you", "wish, but trouble me no more."); + stage++; + break; + case 4: + player("Thank you!"); + stage++; + break; + case 5: + if (!player.getInventory().hasSpaceFor(HOOD)) { + npc("You don't have enough inventory space,", "mortal."); + stage = 23; + break; + } + interpreter.sendItemMessage(HOOD, "The Grim Reaper has given you the " + RED + "Grim Reaper hood and you've unlocked the " + RED + "Zombie Hand Emote as well as the " + RED + "Scared emote."); + stage++; + break; + case 6: + npc("Death will find you one day..."); + stage++; + break; + case 7: + DeathMansionEvent.this.setStage(player, 9); + player.getConfigManager().set(1085, 249852, true); // hallowe'en + // hand + // emote + player.getEmoteManager().unlock(Emotes.SCARED); + player.getEmoteManager().unlock(Emotes.ZOMBIE_HAND); + player.addExtension(LogoutTask.class, new LocationLogoutTask(5, PORTAL_LOCATION)); + player.getInventory().add(HOOD); + player.lock(5); + player.getProperties().setSpawnLocation(PORTAL_LOCATION); + player.getImpactHandler().manualHit(player, player.getSkills().getLifepoints(), HitsplatType.NORMAL); + close(); + player.setAttribute("lo", true); + GameWorld.getPulser().submit(new Pulse(5, player) { + @Override + public boolean pulse() { + player.setAttribute("lo", true); + player("Well. That was an experience I shall never forget."); + stage++; + return true; + } + }); + break; + case 8: + end(); + break; + case 20: + player("Phew."); + stage++; + break; + case 21: + npc("Come and speak with me downstairs."); + stage++; + break; + case 22: + player("I'll be right down."); + stage++; + break; + case 23: + end(); + break; + } + break; + case 9: + case -12290: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { GRIM_REAPER }; + } + + } + + /** + * Represents the area around the death portal. (used to darken the screen) + * @author Vexia + */ + public class DeathPortalZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code DeathPortalZone} {@code Object} + */ + public DeathPortalZone() { + super("Death portal", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public boolean enter(Entity entity) { + if (entity instanceof Player) { + darken(entity.asPlayer()); + } + return super.enter(entity); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + e.asPlayer().getInterfaceManager().closeOverlay(); + } + return super.leave(e, logout); + } + + @Override + public void locationUpdate(Entity e, Location last) { + if (e instanceof Player) { + darken(e.asPlayer()); + } + super.locationUpdate(e, last); + } + + /** + * Darkens the players screen. + * @param player the player. + */ + private void darken(Player player) { + int distance = (int) player.getLocation().getDistance(new Location(3000, 3269, 0)); + int component = 97; + if (distance < 5) { + component = 98; + } + if (player.getInterfaceManager().getOverlay() == null || player.getInterfaceManager().getOverlay().getId() != component) { + player.getInterfaceManager().openOverlay(new Component(component)); + } + } + + @Override + public void configure() { + register(new ZoneBorders(2993, 3263, 3008, 3275)); + } + + } + + /** + * Handles the dark portal entrance. + * @author Vexia + */ + public class DarkPortalHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new DarkPortalDialogue()); + ObjectDefinition.forId(DEATH_PORTAL).getHandlers().put("option:enter", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getDetails().getRights() == Rights.ADMINISTRATOR) { + player.getPacketDispatch().sendMessage("Current pumpkin location: " + pumpkin.getLocation() + "."); + } + if (isComplete(player)) { + player.sendMessage("You've no need to return to the Grim Reaper's house."); + return true; + } + player.getDialogueInterpreter().open("dark-portal"); + return true; + } + + /** + * Handles the dark portals dialogue. + * @author Vexia + */ + public class DarkPortalDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DarkPortalDialogue} {@code Object} + */ + public DarkPortalDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DarkPortalDialogue} {@code Object} + * @param player the player. + */ + public DarkPortalDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DarkPortalDialogue(player); + } + + @Override + public boolean open(Object... args) { + switch (getStage(player)) { + case 0: + player("I can't believe I'm doing this.", "Oh, well, here goes nothing."); + break; + default: + player.teleport(START); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (getStage(player)) { + case 0: + switch (stage) { + case 0: + player.teleport(START); + GameWorld.getPulser().submit(new Pulse(1, player) { + + @Override + public boolean pulse() { + player("Well, I'm still in one piece - that's a good start."); + stage++; + return true; + } + + }); + close(); + break; + case 1: + end(); + break; + } + break; + default: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("dark-portal") }; + } + + } + + } + + /** + * Handles the muncher npc. + * @author Vexia + */ + public class MuncherNPC extends AbstractNPC { + + /** + * Constructs a new {@code MuncherNPC} {@code Object} + * @param id the id. + * @param location the location. + */ + public MuncherNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code MuncherNPC} {@code Object} + */ + public MuncherNPC() { + super(-1, null); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (RandomFunction.random(100) < 4) { + sendChat("Grrrrr"); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MuncherNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 2329 }; + } + + } + + /** + * Handles the muncher dialogue. + * @author Vexia + */ + public class MuncherDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MuncherDialogue} {@code Object} + */ + public MuncherDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MuncherDialogue} {@code Object} + * @param player the player. + */ + public MuncherDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MuncherDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.JOLLY, "Here, boy!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc.sendChat("Grrrrrrr"); + interpreter.sendDialogues(player, FacialExpression.SUSPICIOUS, "Whoaah!"); + stage++; + break; + case 1: + options("Stroke him", "Try to entertain him", "Blow a raspberry at him"); + stage++; + break; + case 2: + if (buttonId == 1) { + close(); + Animation a = Animation.create(7270); + player.animate(a); + player.lock(a.getDuration()); + npc.faceTemporary(player, 2); + npc.animate(Animation.create(6578)); + GameWorld.getPulser().submit(new Pulse(a.getDuration(), player) { + @Override + public boolean pulse() { + player("Okay, touching him seems to be a bad idea."); + stage++; + return true; + } + }); + } else if (buttonId == 2) { + close(); + Animation anim = new Animation(866); + player.animate(anim); + player.lock(anim.getDuration()); + GameWorld.getPulser().submit(new Pulse(anim.getDuration(), player) { + @Override + public boolean pulse() { + player("If it's possible for a skeletal dog to smile, I think he", "would be now."); + stage++; + return true; + } + }); + } else { + npc.sendChat("Grrrrrr"); + player.animate(Animation.create(2110)); + npc.faceTemporary(player, 3); + player.lock(4); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + npc.animate(Animation.create(6579)); + player.getImpactHandler().manualHit(player, player.getSkills().getLifepoints(), HitsplatType.NORMAL); + return true; + } + }); + end(); + } + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("muncher-dialogue") }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/jobs/JobManager.kt b/Server/src/main/java/Server/core/game/content/jobs/JobManager.kt new file mode 100644 index 000000000..7e14e8f03 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/jobs/JobManager.kt @@ -0,0 +1,84 @@ +package core.game.content.jobs + +import GatheringJobs +import SlayingJob +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.node.item.Item + +object JobManager { + @JvmStatic + fun updateJobRemaining(player: Player, amount: Int = 0) { + val cur = player.getAttribute("jobs:amount",0) + val new = cur - amount + val jobType = player.getAttribute("jobs:type",0) + val jobId = player.getAttribute("jobs:id",0) + + var gJob: GatheringJobs? = null + var sJob: SlayingJob? = null + + if(jobType == 0){ + gJob = GatheringJobs.values()[jobId] + } else { + sJob = SlayingJob.values()[jobId] + } + + if(new % 5 == 0 && sJob != null && new > 0){ + player.sendMessage("You have $new ${NPC(sJob.ids[0]).name.toLowerCase()} left to go.") + } + if(new == 0 && sJob != null){ + player.sendMessage("You have completed your job.") + } + player.setAttribute("jobs:amount",new) + } + + @JvmStatic + fun handleDeath(npc: Int, player: Player) { + val jobId = player.getAttribute("jobs:id",0) + val type = player.getAttribute("jobs:type",0) + if(type == 1) { + val job = SlayingJob.values()[jobId] + if (job.ids.contains(npc)) { + updateJobRemaining(player, 1) + } + } + } + + @JvmStatic + fun rewardPlayer(player: Player, npc: NPC){ + val amt = player.getAttribute("jobs:original_amount",0) + val type = player.getAttribute("jobs:type",0) + val jobId = player.getAttribute("jobs:id",0) + if(type == 0){ + val it = Item(GatheringJobs.values()[jobId].itemId) + var amount = player.inventory.getAmount(it) + val needed = player.getAttribute("jobs:amount",0) + if(amount == 0){ + player.dialogueInterpreter.open(9987215,npc) + return + } + if(amount < needed){ + player.dialogueInterpreter.sendItemMessage(GatheringJobs.values()[jobId].itemId,"You still need to gather ${needed - amount} more.") + player.inventory.remove(Item(it.id,amount)) + player.setAttribute("jobs:amount",needed - amount) + return + } + if(amount > needed) amount = needed + player.inventory.remove(Item(it.id,amount)) + } else { + val needed = player.getAttribute("jobs:amount",0) + if(needed > 0){ + player.dialogueInterpreter.sendDialogue("You still need to kill $needed more ${NPC(SlayingJob.values()[jobId].ids[0]).name.toLowerCase()}.") + return + } + } + if(!player.inventory.add(Item(995,250 * amt))){ + GroundItemManager.create(Item(995,250 * amt),player.centerLocation,player) + } + player.removeAttribute("jobs:id") + player.removeAttribute("jobs:amount") + player.removeAttribute("jobs:original_amount") + player.removeAttribute("jobs:type") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/jobs/WorkForOptionHandler.kt b/Server/src/main/java/Server/core/game/content/jobs/WorkForOptionHandler.kt new file mode 100644 index 000000000..60220b2b1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/jobs/WorkForOptionHandler.kt @@ -0,0 +1,174 @@ +package core.game.content.jobs + +import GatheringJobs +import SlayingJob +import core.cache.def.impl.NPCDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.plugin.PluginManager +import core.tools.Items +import core.game.content.dialogue.DialoguePlugin + +/** + * Handles the work-for actions for the NPCs + * @author Ceikry + */ +@Initializable +class WorkForOptionHandler : OptionHandler() { + val possibleWeaponLooks = arrayListOf( + Items.BRONZE_SCIMITAR_1321, + Items.STEEL_SCIMITAR_1325, + Items.RUNE_SCIMITAR_1333, + Items.BRONZE_MACE_1422, + Items.MITHRIL_WARHAMMER_1343 + ) + val gatheringMap = hashMapOf>( + 0 to listOf(GatheringJobs.AIR_RUNE,GatheringJobs.COWHIDES,GatheringJobs.WATER_RUNE), + 922 to listOf(GatheringJobs.ASHES,GatheringJobs.AIR_RUNE,GatheringJobs.WATER_RUNE), + 3807 to listOf(GatheringJobs.COWHIDES), + 4899 to listOf(GatheringJobs.CAKE,GatheringJobs.ANCHOVY_PIZZA,GatheringJobs.COOKED_SALMON,GatheringJobs.COOKED_TROUT,GatheringJobs.MEAT_PIE,GatheringJobs.MEAT_PIZZA,GatheringJobs.PLAIN_PIZZA), + 4901 to listOf(GatheringJobs.RAW_SALMON,GatheringJobs.RAW_SHRIMP,GatheringJobs.RAW_TROUT), + 4902 to listOf(GatheringJobs.COPPER_ORE,GatheringJobs.TIN_ORE,GatheringJobs.COAL,GatheringJobs.IRON_ORE,GatheringJobs.SILVER_ORE,GatheringJobs.GOLD_ORE), + 4903 to listOf(GatheringJobs.SILVER_ORE), + 4904 to listOf(GatheringJobs.BRONZE_BAR,GatheringJobs.IRON_BAR,GatheringJobs.STEEL_BAR), + 4906 to listOf(GatheringJobs.LOG,GatheringJobs.OAK,GatheringJobs.WILLOW) + ) + val typeMap = hashMapOf( + 0 to 0, + 705 to 1, + 922 to 0, + 1861 to 1, + 3807 to 0, + 4899 to 0, + 4901 to 0, + 4902 to 0, + 4903 to 0, + 4904 to 0, + 4906 to 0, + 4707 to 1 + ) + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin? { + NPCDefinition.forId(4906).handlers["option:work-for"] = this + NPCDefinition.forId(4707).handlers["option:work-for"] = this + NPCDefinition.forId(4904).handlers["option:work-for"] = this + NPCDefinition.forId(4903).handlers["option:work-for"] = this + NPCDefinition.forId(4902).handlers["option:work-for"] = this + NPCDefinition.forId(4901).handlers["option:work-for"] = this + NPCDefinition.forId(4899).handlers["option:work-for"] = this + NPCDefinition.forId(3807).handlers["option:work-for"] = this + NPCDefinition.forId(1861).handlers["option:work-for"] = this + NPCDefinition.forId(922).handlers["option:work-for"] = this + NPCDefinition.forId(705).handlers["option:work-for"] = this + NPCDefinition.forId(0).handlers["option:work-for"] = this + PluginManager.definePlugin(CancelJobDialogue()) + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + var amount = 0 + var jobId = 0 + + if(player.getAttribute("jobs:id",-1) != -1){ + JobManager.rewardPlayer(player,node.asNpc()) + return true + } + + val type = typeMap[node.id] ?: return false + jobId = if(type == 0) { + var job = gatheringMap[node.id]?.random() + while(!checkRequirement(player,job)){ + job = gatheringMap[node.id]?.random() + } + amount = job?.getAmount() ?: 0 + job?.ordinal ?: 0 + } else { + SlayingJob.values().random().ordinal.also { amount = SlayingJob.values()[it].getAmount() } + } + + when(type){ + 0 -> { + val job = GatheringJobs.values()[jobId] + player.dialogueInterpreter.sendItemMessage(job.itemId,"You are assigned to gather $amount ${Item(job.itemId).name.toLowerCase()}") + + // Have the Fishing Tutor send you on an errand + if (node.id == 4901) player.achievementDiaryManager.finishTask(player, DiaryType.LUMBRIDGE, 0, 14); + } + 1 -> { + val job = SlayingJob.values()[jobId] + player.dialogueInterpreter.sendItemMessage(possibleWeaponLooks.random(),"You are assigned to kill $amount ${NPC(job.ids[0]).name.toLowerCase()}") + } + } + + player.setAttribute("/save:jobs:id",jobId) + player.setAttribute("/save:jobs:amount",amount) + player.setAttribute("/save:jobs:original_amount",amount) + player.setAttribute("/save:jobs:type",type) + return true + } + + fun checkRequirement(player: Player, jobs: GatheringJobs?): Boolean{ + jobs ?: return true + val requirement: Pair = Pair(jobs.lvlReq,jobs.skill) + if(player.skills.getLevel(requirement.second) < requirement.first){ + return false + } + return true + } + + class CancelJobDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun newInstance(player: Player?): DialoguePlugin { + return CancelJobDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player ?: return false + npc("Would you like to cancel your job?","It will cost 500 coins.") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> options("Yes, please.","No, thanks.").also { stage++ } + 1 -> when(buttonId){ + 1 -> player("Yes, please.").also{ stage = 10 } + 2 -> player("No, thanks.").also { stage = 20 } + } + + 10 -> npc("Alright then, hand over the money.").also { stage++ } + 11 -> if(player.inventory.contains(995,500)){ + player("Here you go.") + player.inventory.remove(Item(995,500)) + player.removeAttribute("jobs:id") + player.removeAttribute("jobs:amount") + player.removeAttribute("jobs:original_amount") + player.removeAttribute("jobs:type") + stage = 1000 + } else { + player("Oh, I don't seem to have the money...") + stage++ + } + + 12 -> npc("Ah, that sucks! Get to work.").also { stage = 1000 } + + 20 -> npc("Alright then, get to work!").also { stage = 1000 } + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(9987215) //Random number to avoid colliding with other dialogues + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/jobs/impl/GatheringJob.kt b/Server/src/main/java/Server/core/game/content/jobs/impl/GatheringJob.kt new file mode 100644 index 000000000..68b7a0852 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/jobs/impl/GatheringJob.kt @@ -0,0 +1,66 @@ +import core.tools.RandomFunction +import core.game.node.entity.skill.Skills + +enum class GatheringJobs(val lower: Int, val upper: Int, val lvlReq: Int, val itemId: Int,val skill: Int) { + LOG(20, 28, 1, 1511, Skills.WOODCUTTING), + COWHIDES(20, 28, 1, 1739, 0), + OAK(22, 28, 15, 1521, Skills.WOODCUTTING), + WATER_RUNE(20, 28, 5, 555, Skills.RUNECRAFTING), + EARTH_RUNE(20, 28, 9, 557, Skills.RUNECRAFTING), + FIRE_RUNE(20, 28, 14, 554, Skills.RUNECRAFTING), + AIR_RUNE(20, 28, 1, 556, Skills.RUNECRAFTING), + RUNE_ESS(20, 28, 1, 1436, Skills.MINING), + BALL_OF_WOOL(20, 28, 1, 1759, Skills.CRAFTING), + LEATHER_GLOVE(20, 28, 1, 1059, Skills.CRAFTING), + WILLOW(22, 28, 30, 1519, Skills.WOODCUTTING), + LEATHER_BOOT(24, 24, 1, 1061, Skills.CRAFTING), + BRONZE_DAGGER(24, 24, 1, 1205, Skills.SMITHING), + BRONZE_HELMS(22, 22, 1, 1139, Skills.SMITHING), + BRONZE_FULL_HELM(10, 10, 7, 1155, Skills.SMITHING), + BRONZE_CHAINBODY(10, 10, 11, 1103, Skills.SMITHING), + BRONZE_2H(10, 10, 14, 1307, Skills.SMITHING), + BRONZE_SCIM(10, 10, 5, 1321, Skills.SMITHING), + BRONZE_PLATEBODY(9, 10, 18, 1117, Skills.SMITHING), + BRONZE_PLATELEGS(9, 10, 16, 1075, Skills.SMITHING), + BRONZE_PLATESKIRTS(9, 10, 16, 1087, Skills.SMITHING), + BRONZE_WARHAMMER(9, 9, 9, 1337, Skills.SMITHING), + IRON_DAGGER(13, 13, 15, 1203, Skills.SMITHING), + IRON_CHAINBODY(10, 10, 26, 1101, Skills.SMITHING), + IRON_2H(9, 9, 29, 1309, Skills.SMITHING), + STEEL_BATTLEAXE(9, 9, 40, 1365, Skills.SMITHING), + STEEL_SCIMITAR(9, 9, 35, 1325, Skills.SMITHING), + STEEL_PLATEBODY(9, 10, 48, 1119, Skills.SMITHING), + STEEL_WARHAMMER(9, 10, 39, 1339, Skills.SMITHING), + LEATHER_CHAPS(22, 28, 18, 1095, Skills.CRAFTING), + LEATHER_BODY(22, 28, 14, 1129, Skills.CRAFTING), + LEATHER_COWL(22, 28, 9, 1167, Skills.CRAFTING), + LEATHER_COIF(22, 28, 38, 1169, Skills.CRAFTING), + RAW_SHRIMP(22, 28, 1, 317, Skills.FISHING), + COOKED_SHRIMP(22, 28, 1, 315, Skills.COOKING), + RAW_CRAYFISH(22, 28, 1, 13435, Skills.FISHING), + COOKED_CRAYFISH(22, 28, 1, 13433, Skills.COOKING), + RAW_TROUT(22, 28, 20, 335, Skills.FISHING), + COOKED_TROUT(22, 28, 15, 333, Skills.COOKING), + RAW_SALMON(22, 28, 30, 331, Skills.FISHING), + COOKED_SALMON(22, 28, 25, 329, Skills.COOKING), + CAKE(12, 16, 40, 1891, Skills.COOKING), + MEAT_PIE(12, 16, 20, 2327, Skills.COOKING), + PLAIN_PIZZA(12, 16, 35, 2289, Skills.COOKING), + MEAT_PIZZA(12, 16, 45, 2293, Skills.COOKING), + ANCHOVY_PIZZA(12, 16, 55, 2297, Skills.COOKING), + REDBERRY_PIE(12, 16, 10, 2325, Skills.COOKING), + COPPER_ORE(22, 28, 1, 436, Skills.MINING), + TIN_ORE(23, 26, 1, 438, Skills.MINING), + IRON_ORE(24, 24, 15, 440, Skills.MINING), + SILVER_ORE(22, 28, 20, 442, Skills.MINING), + COAL(22, 26, 30, 453, Skills.MINING), + GOLD_ORE(22, 24, 40, 444, Skills.MINING), + BRONZE_BAR(10, 12, 1, 2349, Skills.SMITHING), + IRON_BAR(22, 28, 15, 2351, Skills.SMITHING), + STEEL_BAR(22, 28, 30, 2353, Skills.SMITHING), + ASHES(26, 26, 1, 592, 0); + + fun getAmount(): Int { + return RandomFunction.random(lower,upper + 1) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/jobs/impl/SlayingJob.kt b/Server/src/main/java/Server/core/game/content/jobs/impl/SlayingJob.kt new file mode 100644 index 000000000..13afc20c4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/jobs/impl/SlayingJob.kt @@ -0,0 +1,13 @@ +import core.tools.RandomFunction + +enum class SlayingJob(val lower: Int, val upper: Int, vararg val ids: Int) { + CHICKEN(25,26,41,1017), + COW(25,25,397,1766,81,1767), + GIANT_SPIDER(22,25,59,60), + SCORPION(25,25,107,108,109,144,4402,4403), + GOBLIN(25,25,100,101,102,298,299,444,445,489,745,1769,1770,1771,1772,1773,1774,1775,1776,2274,2275,2276,2277,2278,2279,2280,2281,2678,2679,2680,2681,3060,3264,3265,3266,3267); + + fun getAmount(): Int { + return RandomFunction.random(lower,upper + 1) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/package-info.java b/Server/src/main/java/Server/core/game/content/package-info.java new file mode 100644 index 000000000..f9a620503 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/package-info.java @@ -0,0 +1,7 @@ +/** + * Holds more important content classes. + * + * @author Emperor + * + */ +package core.game.content; \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/PluginInteraction.java b/Server/src/main/java/Server/core/game/content/quest/PluginInteraction.java new file mode 100644 index 000000000..c7d1e672e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/PluginInteraction.java @@ -0,0 +1,36 @@ +package core.game.content.quest; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +public abstract class PluginInteraction implements Plugin { + int[] ids; + Item item; + public boolean handle(Player player, Node node){ + return false; + }; + public boolean handle(Player player, NodeUsageEvent event){ + return false; + }; + public boolean handle(Player player, NPC npc, Option option){ + return false; + } + public boolean handle(Player player, Item item, Option option){return false;} + public PluginInteraction(int... ids){ + this.ids = ids; + } + public PluginInteraction(Item item){this.item = item;} + + public void setIds(int[] ids) { + this.ids = ids; + } + + public void setItem(Item item) { + this.item = item; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/PluginInteractionManager.java b/Server/src/main/java/Server/core/game/content/quest/PluginInteractionManager.java new file mode 100644 index 000000000..7ee3c45bd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/PluginInteractionManager.java @@ -0,0 +1,85 @@ +package core.game.content.quest; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.Option; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; + +import java.util.HashMap; + +public class PluginInteractionManager { + private static final HashMap npcInteractions = new HashMap<>(); + private static final HashMap objectInteractions = new HashMap<>(); + private static final HashMap useWithInteractions = new HashMap<>(); + private static final HashMap groundItemInteractions = new HashMap<>(); + + public static void register(PluginInteraction interaction, InteractionType type){ + switch(type){ + case OBJECT: + for(int i = 0; i < interaction.ids.length; i++){ + objectInteractions.putIfAbsent(interaction.ids[i],interaction); + } + break; + case USEWITH: + for(int i = 0; i < interaction.ids.length; i++){ + useWithInteractions.putIfAbsent(interaction.ids[i],interaction); + } + break; + case NPC: + for(int i = 0; i < interaction.ids.length; i++){ + npcInteractions.putIfAbsent(interaction.ids[i],interaction); + } + break; + case ITEM: + for(int i = 0; i < interaction.ids.length; i++){ + groundItemInteractions.putIfAbsent(interaction.ids[i],interaction); + } + break; + } + } + + public static boolean handle(Player player, GameObject object){ + PluginInteraction i = objectInteractions.get(object.getId()); + if(i == null) { + return false; + } else { + return i.handle(player,object); + } + } + + public static boolean handle(Player player, NodeUsageEvent event){ + PluginInteraction i = useWithInteractions.get(event.getUsed().asItem().getId()); + if(i == null) { + return false; + } else { + return i.handle(player,event); + } + } + + public static boolean handle(Player player, NPC npc, Option option){ + PluginInteraction i = npcInteractions.get(npc.getId()); + if(i == null) { + return false; + } else { + return i.handle(player,npc,option); + } + } + + public static boolean handle(Player player, Item item, Option option){ + PluginInteraction i = groundItemInteractions.get(item.getId()); + if(i == null){ + return false; + } else { + return i.handle(player,item,option); + } + } + + public enum InteractionType{ + NPC, + OBJECT, + USEWITH, + ITEM; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/DoricsQuest.java b/Server/src/main/java/Server/core/game/content/quest/free/DoricsQuest.java new file mode 100644 index 000000000..50d0b6008 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/DoricsQuest.java @@ -0,0 +1,72 @@ +package core.game.content.quest.free; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; + +/** + * Represents the Doric's Quest + * @author Vexia + * + */ +@Initializable +public class DoricsQuest extends Quest { + + /** + * Constructs a new {@Code DoricsQuest} {@Code Object} + */ + public DoricsQuest() { + super("Doric's Quest", 17, 16, 1, 31, 0, 1, 100); + } + + @Override + public Quest newInstance(Object object) { + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + player.getPacketDispatch().sendString("I can start this quest by speaking to Doric who is North of", 275, 4+ 7); + player.getPacketDispatch().sendString("Falador", 275, 5+ 7); + player.getPacketDispatch().sendString("There aren't any requirements but Level 15 Mining will help", 275, 7+ 7); + break; + case 1: + player.getPacketDispatch().sendString("I have spoken to Doric", 275, 4+ 7); + player.getPacketDispatch().sendString("I need to collect some items and bring them to Doric", 275, 6+ 7); + player.getPacketDispatch().sendString(player.getInventory().contains(434, 6) ? "6 Clay" : "6 Clay", 275, 7+ 7); + player.getPacketDispatch().sendString(player.getInventory().contains(436, 4) ? "4 Copper Ore" : "4 Copper Ore", 275, 8+ 7); + player.getPacketDispatch().sendString(player.getInventory().contains(440, 2) ? "2 Iron Ore" : "2 Iron Ore", 275, 9+ 7); + break; + case 100: + player.getPacketDispatch().sendString("I have spoken to Doric", 275, 4+ 7); + player.getPacketDispatch().sendString("QUEST COMPLETE!", 275, 10+ 7); + player.getPacketDispatch().sendString(" I have collected some Clay, Copper Ore, and Iron Ore", 275, 6+ 7); + player.getPacketDispatch().sendString("Doric rewarded me for all my hard work", 275, 8+ 7); + player.getPacketDispatch().sendString("I can now use Doric's Anvils whenever I want", 275, 9+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("1300 Mining XP", 277, 9 + 2); + player.getPacketDispatch().sendString("180 coins", 277, 10 + 2); + player.getPacketDispatch().sendString("Use of Doric's Anvils", 277, 11 + 2); + if (!player.getInventory().add(new Item(995, 180))) { + GroundItemManager.create(new Item(995, 180), player.getLocation()); + } + player.getSkills().addExperience(Skills.MINING, 1300); + player.getPacketDispatch().sendItemZoomOnInterface(1269, 240, 277, 5); + player.getInterfaceManager().closeChatbox(); + player.getPacketDispatch().sendString("You have completed Doric's Quest!", 277, 2 + 2); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/ErnestTheChicken.java b/Server/src/main/java/Server/core/game/content/quest/free/ErnestTheChicken.java new file mode 100644 index 000000000..6359b3541 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/ErnestTheChicken.java @@ -0,0 +1,189 @@ +package core.game.content.quest.free; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the ernest the chicken quest. + * @author 'Vexia + */ +@Initializable +public final class ErnestTheChicken extends Quest { + + /** + * Represents the oil can item. + */ + private static final Item OIL_CAN = new Item(277); + + /** + * Represents the pressure gauge item. + */ + private static final Item PRESSURE_GAUGE = new Item(271); + + /** + * Represents the rubber tube item. + */ + private static final Item RUBBER_TUBE = new Item(276); + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 300); + + /** + * Constructs a new {@code ErnestTheChicken} {@code Object}. + */ + public ErnestTheChicken() { + super("Ernest the Chicken", 19, 18, 4, 32, 0, 1, 3); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new ErnestNPC(), new ErnestChickenNPC()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + if (getStage(player) == 0) { + player.getPacketDispatch().sendString(BLUE + "I can start this quest by speaking to " + RED+ "Veronica " + BLUE + "who is", 275, 4+ 7); + player.getPacketDispatch().sendString(BLUE + "outside " + RED+ "Draynor Manor", 275, 5+ 7); + player.getPacketDispatch().sendString(BLUE + "There aren't any requirements for this quest.", 275, 7+ 7); + } else if (stage == 10) { + line(player, "I have spoken to Veronica", 4+ 7); + line(player, BLUE + "I need to find " + RED + "Ernest", 6+ 7); + line(player, BLUE + "He went into " + RED+ "Draynor Manor " + BLUE + "and hasn't returned", 7+ 7); + } else if (stage == 20) { + line(player, "I have spoken to Veronica", 4+ 7); + line(player, "I've spoken to Dr Oddenstein, and discovered Ernest is a", 6+ 7); + line(player, "chicken", 7+ 7); + line(player, BLUE + "I need to bring " + RED+ "Dr Oddenstein " + BLUE + "parts for his machine", 9+ 7); + line(player, player.getInventory().containsItem(OIL_CAN) ? "1 Oil Can" : RED+ "1 Oil Can", 10); + line(player, player.getInventory().containsItem(PRESSURE_GAUGE) ? "1 Pressure Gauge" : RED+ "1 Pressure Gauge", 11); + line(player, player.getInventory().containsItem(RUBBER_TUBE) ? "1 Rubber Tube" : RED+ "1 Rubber Tube", 12); + } else if (stage == 100) { + line(player, "I have spoken to Veronica", 4+ 7); + line(player, "I have collected all the parts for the machine", 6+ 7); + line(player, "Dr Oddenstein thanked me for helping fix his machine", 8+ 7); + line(player, "We turned Ernest back to normal and he rewarded me", 9+ 7); + line(player, "QUEST COMPLETE!", 10+ 7); + } + } + + @Override + public void finish(Player player) { + player.unlock(); + player.getPacketDispatch().sendMessage("Ernest hands you 300 coins."); + super.finish(player); + player.getPacketDispatch().sendString("4 Quest Points", 277, 8 + 2); + player.getPacketDispatch().sendString("300 coins", 277, 9 + 2); + player.getPacketDispatch().sendString("You have completed the Ernest The Chicken Quest!", 277, 2 + 2); + player.getGameAttributes().removeAttribute("piranhas-killed"); + player.getGameAttributes().removeAttribute("pressure-gauge"); + player.getPacketDispatch().sendItemZoomOnInterface(314, 230, 277, 3 + 2); + if (!player.getInventory().add(COINS)) { + GroundItemManager.create(COINS, player.getLocation(), player); + } + } + + /** + * Represents the abstract npc class to handle ernest the chicken. + * @author 'Vexia + * @version 1.0 + */ + public final static class ErnestChickenNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 288 }; + + /** + * Constructs a new {@code ErnestChickenNPC} {@code Object}. + */ + public ErnestChickenNPC() { + super(0, null, false); + } + + /** + * Constructs a new {@code ErnestChickenNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private ErnestChickenNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ErnestChickenNPC(id, location); + } + + @Override + public boolean isHidden(final Player player) { + return player.getQuestRepository().getQuest("Ernest the Chicken").getStage(player) == 100 || player.getAttribute("ernest-hide", false); + } + + @Override + public int[] getIds() { + return ID; + } + + } + + /** + * Represents the abstract npc class to handle ernest the chicken. + * @author 'Vexia + * @version 1.0 + */ + public final static class ErnestNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 287 }; + + /** + * Constructs a new {@code ErnestChickenNPC} {@code Object}. + */ + public ErnestNPC() { + super(0, null, false); + } + + /** + * Constructs a new {@code ErnestChickenNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private ErnestNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ErnestNPC(id, location); + } + + @Override + public boolean isHidden(final Player player) { + Player target = getAttribute("target", null); + if (target != null && target.getQuestRepository().getQuest("Ernest the Chicken").getStage(player) == 100) { + clear(); + return super.isHidden(player); + } + return target == null || player != target; + } + + @Override + public int[] getIds() { + return ID; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/ImpCatcher.java b/Server/src/main/java/Server/core/game/content/quest/free/ImpCatcher.java new file mode 100644 index 000000000..1b96745c9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/ImpCatcher.java @@ -0,0 +1,124 @@ +package core.game.content.quest.free; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.world.map.RegionManager; + +/** + * Represents the imp catcher quest. + * @author Vexia + * + */ +@Initializable +public class ImpCatcher extends Quest { + + /** + * Represents the black bead item. + */ + private static final Item BLACK_BEAD = new Item(1474); + + /** + * Represents the red bead item. + */ + private static final Item RED_BEAD = new Item(1470); + + /** + * Represents the white bead item. + */ + private static final Item WHITE_BEAD = new Item(1476); + + /** + * Represents the yellow bead item. + */ + private static final Item YELLOW_BEAD = new Item(1472); + + /** + * Represents the amulet item. + */ + private static final Item AMULET = new Item(1478); + + /** + * Constructs a new {@Code ImpCatcher} {@Code Object} + */ + public ImpCatcher() { + super("Imp Catcher", 21, 20, 1, 160, 0, 1, 2); + } + + @Override + public Quest newInstance(Object object) { + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + if (getStage(player) == 0) { + player.getPacketDispatch().sendString(BLUE + "I can start this quest by speaking to " + RED + "Wizard Mizgog " + BLUE + "who is", 275, 4+ 7); + player.getPacketDispatch().sendString(BLUE + "in the " + RED + "Wizard's Tower", 275, 5+ 7); + player.getPacketDispatch().sendString(BLUE + "There are no requirements for this quest.", 275, 7+ 7); + } else if (getStage(player) == 10) { + line(player, "I have spoken to Wizard Mizgog.", 4+ 7); + line(player, BLUE + "I need to collect some items by killing " + RED + " Imps.", 6+ 7); + if (player.getInventory().containItems(BLACK_BEAD.getId(), RED_BEAD.getId(), YELLOW_BEAD.getId(), WHITE_BEAD.getId())) { + line(player, BLUE + "I have collected all the missing beads and need to return", 6+ 7); + line(player, BLUE + "them to " + RED + "Wizard Mizgog.", 7+ 7); + return; + } + if (player.getInventory().containsItem(BLACK_BEAD)) { + line(player, "1 Black Bead", 7+ 7); + } else { + line(player, RED + "1 Black Bead", 7+ 7); + } + if (player.getInventory().containsItem(RED_BEAD)) { + line(player, "1 Red Bead", 8+ 7); + } else { + line(player, RED + "1 Red Bead", 8+ 7); + } + if (player.getInventory().containsItem(WHITE_BEAD)) { + line(player, "1 White Bead", 9+ 7); + } else { + line(player, RED + "1 White Bead", 9+ 7); + } + if (player.getInventory().containsItem(YELLOW_BEAD)) { + line(player, "1 Yellow Bead", 10+ 7); + } else { + line(player, RED + "1 Yellow Bead", 10+ 7); + } + } else { + line(player, "I have spoken to Wizard Mizgog.", 4+ 7); + line(player, "I have collected all the beads.", 6+ 7); + line(player, "Wizard Mizgog thanked me for finding his beads and gave", 8+ 7); + line(player, "me and Amulet of Accuracy.", 9+ 7); + line(player, "QUEST COMPLETE!", 10+ 7); + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.unlock(); + player.getPacketDispatch().sendMessage("The Wizard hands you an amulet."); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("875 Magic XP", 277, 9 + 2); + player.getPacketDispatch().sendString("Amulet of Accuracy", 277, 10 + 2); + player.getPacketDispatch().sendString("You have completed the Imp Catcher Quest!", 277, 2 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(AMULET.getId(), 230, 277, 3 + 2); + player.getSkills().addExperience(Skills.MAGIC, 875); + // 16170 + GameObject table = RegionManager.getObject(Location.create(3102, 3163, 2)); + if (table.getId() != 16170) { + ObjectBuilder.replace(table, table.transform(16170), 80); + } + if (!player.getInventory().add(AMULET)) { + GroundItemManager.create(AMULET, player.getLocation(), player); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/RomeoJuliet.java b/Server/src/main/java/Server/core/game/content/quest/free/RomeoJuliet.java new file mode 100644 index 000000000..55d13d11c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/RomeoJuliet.java @@ -0,0 +1,144 @@ +package core.game.content.quest.free; + +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the romeo and juliet quest. + * @author 'Vexia + */ +@Initializable +public class RomeoJuliet extends Quest { + + /** + * Constructs a new {@code RomeoJuliet} {@code Object}. + */ + public RomeoJuliet() { + super("Romeo & Juliet", 26, 25, 5, 144, 0, 1, 100); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (getStage(player)) { + case 0: + line(player, BLUE + "I can start this quest by speaking to " + RED + "Romeo " + BLUE + "in " + RED + "Varrock", 4 + 7); + line(player, BLUE + "central square by the " + RED + "fountain.", 5+ 7); + break; + case 10: + line(player, "I have agreed to find Juliet for Romeo and tell her how he", 4+ 7); + line(player, "feels. For some reason he can't just do this himself.", 5+ 7); + line(player, BLUE + "All I need to do now is find " + RED + "Juliet.", 6+ 7); + break; + case 20: + line(player, "I have agreed to find Juliet for Romeo and tell her how he", 4+ 7); + line(player, "feels. For some reason he can't just do this himself.", 5+ 7); + line(player, "I found Juliet on the Western edge of Varrock, and told", 6+ 7); + line(player, "her about Romeo. She gave me a message + 7+ 7); take back", 7+ 7); + line(player, BLUE + "I should take the " + RED + "message " + BLUE + "from" + RED + " Juliet " + BLUE + "to" + RED + " Romeo.", 8+ 7); + break; + case 30: + line(player, "I have agreed to find Juliet for Romeo and tell her how he", 4+ 7); + line(player, "feels. For some reason he can't just do this himself.", 5+ 7); + line(player, "I found Juliet on the Western edge of Varrock, and told", 6+ 7); + line(player, "her about Romeo. She gave me a message to take back", 7+ 7); + line(player, "I delivered the message to Romeo, and he was sad to hear", 8+ 7); + line(player, "that Juliet's father opposed their marriage. However, he", 9+ 7); + line(player, "said that Father Lawrence might be able to overcome this.", 10+ 7); + line(player, BLUE + "I should find" + RED + " Father Lawrence " + BLUE + "and see how we can help.", 11+ 7); + break; + case 40: + line(player, "I have agreed to find Juliet for Romeo and tell her how he", 4+ 7); + line(player, "feels. For some reason he can't just do this himself.", 5+ 7); + line(player, "I found Juliet on the Western edge of Varrock, and told", 6+ 7); + line(player, "her about Romeo. She gave me a message to take back", 7+ 7); + line(player, "I delivered the message to Romeo, and he was sad to hear", 8+ 7); + line(player, "that Juliet's father opposed their marriage. However, he", 9+ 7); + line(player, "said that Father Lawrence might be able to overcome this.", 10+ 7); + line(player, "I found Father Lawrence and he suggested the use of a", 11+ 7); + line(player, "potion to fool Juliet's father that she is dead so that", 12+ 7); + line(player, "Romeo and Juliet can be together in peace.", 13+ 7); + line(player, BLUE + "I need to find the " + RED + "Apothecary" + " " + BLUE + "to make a " + RED + "cadava potion.", 14+ 7); + break; + case 50: + line(player, "I have agreed to find Juliet for Romeo and tell her how he", 4+ 7); + line(player, "feels. For some reason he can't just do this himself.", 5+ 7); + line(player, "I found Juliet on the Western edge of Varrock, and told", 6+ 7); + line(player, "her about Romeo. She gave me a message to take back", 7+ 7); + line(player, "I delivered the message to Romeo, and he was sad to hear", 8+ 7); + line(player, "that Juliet's father opposed their marriage. However, he", 9+ 7); + line(player, "said that Father Lawrence might be able to overcome this.", 10+ 7); + line(player, "I found Father Lawrence and he suggested the use of a", 11+ 7); + line(player, "potion to fool Juliet's father that she is dead so that", 12+ 7); + line(player, "Romeo and Juliet can be together in peace.", 13+ 7); + line(player, "I went to the Apothecary regarding making this cadava", 14+ 7); + line(player, "potion, and he told me to bring him some cadava berries", 15+ 7); + if (!player.getInventory().contains(753, 1)) { + line(player, BLUE + "I will have to find some " + RED + "Cadava berries" + BLUE + " somewhere!", 16+ 7); + } else { + line(player, BLUE + "I should take these " + RED + "cadava berries" + BLUE + " to the " + RED + "Apothecary.", 16+ 7); + } + break; + case 60: + line(player, "I have agreed to find Juliet for Romeo and tell her how he", 4+ 7); + line(player, "feels. For some reason he can't just do this himself.", 5+ 7); + line(player, "I found Juliet on the Western edge of Varrock, and told", 6+ 7); + line(player, "her about Romeo. She gave me a message to take back", 7+ 7); + line(player, "I delivered the message to Romeo, and he was sad to hear", 8+ 7); + line(player, "that Juliet's father opposed their marriage. However, he", 9+ 7); + line(player, "said that Father Lawrence might be able to overcome this.", 10+ 7); + line(player, "I found Father Lawrence and he suggested the use of a", 11+ 7); + line(player, "potion to fool Juliet's father that she is dead so that", 12+ 7); + line(player, "Romeo and Juliet can be together in peace.", 13+ 7); + line(player, "I went to the Apothecary regarding making this cadava", 14+ 7); + line(player, "potion, and he told me to bring him some cadava berries", 15+ 7); + line(player, BLUE + "I should take this " + RED + "cadava potion " + BLUE + "to " + RED + "Juliet.", 16+ 7); + break; + case 70: + line(player, "I have agreed to find Juliet for Romeo and tell her how he", 4+ 7); + line(player, "feels. For some reason he can't just do this himself.", 5+ 7); + line(player, "I found Juliet on the Western edge of Varrock, and told", 6+ 7); + line(player, "her about Romeo. She gave me a message to take back", 7+ 7); + line(player, "I delivered the message to Romeo, and he was sad to hear", 8+ 7); + line(player, "that Juliet's father opposed their marriage. However, he", 9+ 7); + line(player, "said that Father Lawrence might be able to overcome this.", 10+ 7); + line(player, "I found Father Lawrence and he suggested the use of a", 11+ 7); + line(player, "potion to fool Juliet's father that she is dead so that", 12+ 7); + line(player, "Romeo and Juliet can be together in peace.", 13+ 7); + line(player, "I went to the Apothecary regarding making this cadava", 14+ 7); + line(player, "potion, and he told me to bring him some cadava berries", 15+ 7); + line(player, "After the Apothecary made me the potion, I delivered it to", 16+ 7); + line(player, "Juliet. She asked me to tell Romeo the plan.", 17+ 7); + line(player, BLUE + "I have to find " + RED + "Romeo" + BLUE + " and tell him what's happened.", 18+ 7); + break; + case 100: + line(player, "Romeo and Juliet can be together in peace.", 4+ 7); + line(player, "I went to the Apothecary regarding making this cadava", 5+ 7); + line(player, "potion, and he told me to bring him some cadava berries.", 6+ 7); + line(player, "After the Apothecary made me the potion, I delivered it to", 7+ 7); + line(player, "Juliet. She asked me to tell Romeo the plan.", 8+ 7); + line(player, "I told Romeo what was going to happen, but I'm not exactly", 9+ 7); + line(player, "sure he understood what was happening. Ah well, I was", 10+ 7); + line(player, "rewarded for all of my help regardless.", 11+ 7); + line(player, "QUEST COMPLETE!", 12+ 7); + break; + } + } + + @Override + public void finish(Player player) { + if(player.getQuestRepository().getQuest("Romeo & Juliet").isCompleted(player)){ + return; + } + super.finish(player); + player.getPacketDispatch().sendString("5 Quest Points", 277, 8 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(756, 240, 277, 3 + 2); + player.getQuestRepository().syncronizeTab(player); + } + + @Override + public Quest newInstance(Object object) { + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/RuneMysteries.java b/Server/src/main/java/Server/core/game/content/quest/free/RuneMysteries.java new file mode 100644 index 000000000..400e722b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/RuneMysteries.java @@ -0,0 +1,111 @@ +package core.game.content.quest.free; + +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the rune mysteries fortress quest. + * @author 'Vexia + */ +@Initializable +public class RuneMysteries extends Quest { + + /** + * Constructs a new {@code RuneMysteries} {@code Object}. + */ + public RuneMysteries() { + super("Rune Mysteries", 27, 26, 1, 63, 0, 1, 6); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + if (getStage(player) == 0) { + line(player, BLUE + "I can start this quest by speaking to " + RED + "Duke Horacio " + BLUE + "of", 4+ 7); + line(player, RED + "Lumbridge, " + BLUE + "upstairs in " + RED + "Lumbridge Castle.", 5+ 7); + } + if (getStage(player) == 10) { + line(player, "I spoke to Duke Horacio and he showed me a strange", 4+ 7); + line(player, "talisman that had been found by one of his subjects.", 5+ 7); + line(player, "I agreed to take it to the Wizards' Tower, South West of", 6+ 7); + line(player, "Lumbridge for further examination by the wizards.", 7+ 7); + line(player, BLUE + "I need to find the " + RED + "Head Wizard " + BLUE + "and give him the " + RED + "Talisman", 8+ 7); + } + if (getStage(player) == 20) { + line(player, "I spoke to Duke Horacio and he showed me a strange", 4+ 7); + line(player, "talisman that had been found by one of his subjects.", 5+ 7); + line(player, "I agreed to take it to the Wizards' Tower, South West of", 6+ 7); + line(player, "Lumbridge for further examination by the wizards.", 7+ 7); + line(player, "I gave the Talisman to the Wizard but I didn't want to help", 8+ 7); + line(player, "him in his research right now.", 9+ 7); + line(player, BLUE + "I should talk to " + RED + "Sedridor " + BLUE + "again to continue this quest.", 10+ 7); + } + if (getStage(player) == 30) { + line(player, "I spoke to Duke Horacio and he showed me a strange", 4+ 7); + line(player, "talisman that had been found by one of his subjects.", 5+ 7); + line(player, "I agreed to take it to the Wizards' Tower, South West of", 6+ 7); + line(player, "Lumbridge for further examination by the wizards.", 7+ 7); + line(player, "I gave the Talisman to the Head of the Tower and", 8+ 7); + line(player, "agreed to help him with his research into rune stones.", 9+ 7); + line(player, BLUE + "I should take this " + RED + "Research Package " + BLUE + "to " + RED + "Aubury " + BLUE + "in " + RED + "Varrock", 10+ 7); + } + if (getStage(player) == 40) { + line(player, "I spoke to Duke Horacio and he showed me a strange", 4+ 7); + line(player, "talisman that had been found by one of his subjects.", 5+ 7); + line(player, "I agreed to take it to the Wizards' Tower, South West of", 6+ 7); + line(player, "Lumbridge for further examination by the wizards.", 7+ 7); + line(player, "I gave the Talisman to the Head of the Tower and", 8+ 7); + line(player, "agreed to help him with his research into rune stones.", 9+ 7); + line(player, "I took the research package to Varrock and delivered it.", 10+ 7); + line(player, BLUE + "I should speak to " + RED + "Aubury " + BLUE + "again when he has finished", 11+ 7); + line(player, BLUE + "examining the " + RED + "research package " + BLUE + " I have delivered to him.", 12+ 7); + } + if (getStage(player) == 50) { + line(player, "I spoke to Duke Horacio and he showed me a strange", 4+ 7); + line(player, "talisman that had been found by one of his subjects.", 5+ 7); + line(player, "I agreed to take it to the Wizards' Tower, South West of", 6+ 7); + line(player, "Lumbridge for further examination by the wizards.", 7+ 7); + line(player, "I gave the Talisman to the Head of the Tower and", 8+ 7); + line(player, "agreed to help him with his research into rune stones.", 9+ 7); + line(player, "I took the research package to Varrock and delivered it.", 10+ 7); + line(player, "Aubury was interested in the research package and gave", 11+ 7); + line(player, "me his own research notes to deliver to Sedridor.", 12+ 7); + line(player, BLUE + "I should take the " + RED + "notes " + BLUE + "to " + RED + "Sedridor " + BLUE + "and see what he says", 13+ 7); + } + if (stage == 100) { + line(player, "I spoke to Duke Horacio and he showed me a strange", 4+ 7); + line(player, "talisman that had been found by one of his subjects.", 5+ 7); + line(player, "I agreed to take it to the Wizards' Tower, South West of", 6+ 7); + line(player, "Lumbridge for further examination by the wizards.", 7+ 7); + line(player, "I gave the Talisman to the Head of the Tower and", 8+ 7); + line(player, "agreed to help him with his research into rune stones.", 9+ 7); + line(player, "I took the research package to Varrock and delivered it.", 10+ 7); + line(player, "Aubury was interested in the research package and gave", 11+ 7); + line(player, "me his own research notes to deliver to Sedridor.", 12+ 7); + line(player, "I brought Sedridor the research notes that Aubury had", 13+ 7); + line(player, "compiled so that he could compare their research. They", 14+ 7); + line(player, "They discovered that it was now possible to create new rune", 15+ 7); + line(player, "stones, a skill that had been thought lost forever.", 16+ 7); + line(player, "In return for all of my help they taught me how to do this,", 17+ 7); + line(player, "and will teleport me to mine blank runes anytime.", 18+ 7); + line(player, "QUEST COMPLETE!", 20 + 7); + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("Runecrafting skill", 277, 9 + 2); + player.getPacketDispatch().sendString("Air talisman", 277, 10 + 2); + player.getPacketDispatch().sendString("You have completed the Rune Mysteries Quest!", 277, 2 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(1438, 240, 277, 3 + 2); + } + + @Override + public Quest newInstance(Object object) { + // TODO Auto-generated method stub + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/SheepShearer.java b/Server/src/main/java/Server/core/game/content/quest/free/SheepShearer.java new file mode 100644 index 000000000..4a60ac85c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/SheepShearer.java @@ -0,0 +1,136 @@ +package core.game.content.quest.free; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; + +/** + * Represents the sheep shearer quest. + * @author 'Veixa + */ +@Initializable +public class SheepShearer extends Quest { + + /** + * Constructs a new {@code SheepShearer} {@code Object}. + */ + public SheepShearer() { + super("Sheep Shearer", 28, 27, 1, 179, 0, 20, 21); + } + + /** + * Represents the wool item. + */ + public static final Item WOOL = new Item(1759); + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("150 Crafting XP", 277, 9 + 2); + player.getPacketDispatch().sendString("60 coins", 277, 10 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(1735, 240, 277, 3 + 2); + player.getSkills().addExperience(Skills.CRAFTING, 150); + player.getInterfaceManager().closeChatbox(); + if (player.getInventory().freeSlots() == 0) { + GroundItemManager.create(new Item(995, 60), player.getLocation()); + } else { + player.getInventory().add(new Item(995, 60)); + } + player.getPacketDispatch().sendMessage("Congratulations! Quest complete!"); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + if (stage < 10) { + player.getPacketDispatch().sendString("I can start this quest by speaking to Farmer Fred at his", 275, 4+ 7); + player.getPacketDispatch().sendString("farm just a little way North West of Lumbridge", 275, 5+ 7); + return; + } + if (stage == 10 || stage == 90) { + player.getPacketDispatch().sendString("I can start this quest by speaking to Farmer Fred at his", 275, 4+ 7); + player.getPacketDispatch().sendString("farm just a little way North West of Lumbridge", 275, 5+ 7); + int wool = getWoolCollect(player); + if (wool == 0) { + player.getPacketDispatch().sendString("I have enough balls of wool to give Fred and get my reward", 275, 7+ 7); + player.getPacketDispatch().sendString("money!", 275, 8+ 7); + } + if (wool != 0) { + player.getPacketDispatch().sendString("I need to collect " + wool + " more balls of wool.", 275, 7+ 7); + } + } + if (stage == 100) { + player.getPacketDispatch().sendString("I brought Farmer Fred 20 balls of wool, and he paid me for", 275, 4+ 7); + player.getPacketDispatch().sendString("it!", 275, 5+ 7); + player.getPacketDispatch().sendString("QUEST COMPLETE!", 275, 7+ 7); + } + } + + /** + * Method used to get the wool given. + * @param player the player. + * @return the wool given. + */ + public static int getWoolGiven(final Player player) { + return player.getAttribute("sheep-shearer:wool", 0); + } + + /** + * Method used to get the wool left to give. + * @param player the player. + * @return the wool. + */ + public static int getWoolLeft(final Player player) { + int left = 20 - getWoolGiven(player); + return left; + } + + /** + * Method used to add wool to the current amount given. + * @param player the player. + * @return True if added. + */ + public static boolean addWool(final Player player) { + final int removeAmount = getWoolRemove(player); + if (player.getInventory().remove(new Item(1759, removeAmount))) { + player.setAttribute("sheep-shearer:wool", getWoolGiven(player) + removeAmount); + return true; + } + return false; + } + + /** + * Method used to get the wool to remove. + * @param player the player. + * @return the amount that can be removed from the inventory. + */ + public static int getWoolRemove(final Player player) { + int woolAmount = player.getInventory().getAmount(WOOL); + int remove = getWoolLeft(player) - (getWoolLeft(player) - woolAmount); + int realRemove = remove > 20 ? remove - (remove - getWoolLeft(player)) : remove; + if (realRemove > getWoolLeft(player)) { + realRemove = getWoolLeft(player); + } + return realRemove; + } + + /** + * Method used to get the wool left to collect. + * @param player the player. + * @return the wool. + */ + public static int getWoolCollect(final Player player) { + return 20 - (getWoolGiven(player) + getWoolRemove(player)); + } + + @Override + public Quest newInstance(Object object) { + // TODO Auto-generated method stub + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/TheKnightsSword.java b/Server/src/main/java/Server/core/game/content/quest/free/TheKnightsSword.java new file mode 100644 index 000000000..ff19f2d26 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/TheKnightsSword.java @@ -0,0 +1,129 @@ +package core.game.content.quest.free; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents The KnightSword quest. + * @author Vexia + * + */ +@Initializable +public class TheKnightsSword extends Quest { + + /** + * Represents the portrait item. + */ + private static final Item PORTRAIT = new Item(666); + + /** + * Constructs a new {@code TheKnightsSword} {@code Object}. + */ + public TheKnightsSword() { + super("The Knight's Sword", 22, 21, 1, 122, 0, 1, 7); + } + + @Override + public Quest newInstance(Object object) { + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + player.getPacketDispatch().sendString(BLUE + "I can start this quest by speaking to the " + RED + "Squire " + BLUE + "in the", 275, 4+ 7); + player.getPacketDispatch().sendString(BLUE + "courtyard of the " + RED + "White Knights' Castle " + BLUE + "in " + RED + "southern Falador", 275, 5+ 7); + player.getPacketDispatch().sendString(BLUE + "To complete this quest I need:", 275, 6+ 7); + player.getPacketDispatch().sendString(RED + "Level 10 Mining", 275, 7+ 7); + player.getPacketDispatch().sendString(BLUE + "and to be unafraid of " + RED + "Level 57 Ice Warriors.", 275, 8+ 7); + break; + case 10: + line(player, "I told the Squire I would help him to replace the sword he", 4+ 7); + line(player, "has lost. It could only be made by an Imcando Dwarf.", 5+ 7); + line(player, BLUE + "The Squire suggests I speak to " + RED + "Reldo " + BLUE + "in the " + RED + " Varrock Palace", 6+ 7); + line(player, RED + "Library " + BLUE + "for information about the " + RED + "Imcando Dwarves", 7+ 7); + break; + case 20: + line(player, "I told the Squire I would help him to replace the sword he", 4+ 7); + line(player, "has lost. It could only be made by an Imcando Dwarf.", 5+ 7); + line(player, BLUE + "Reldo couldn't give me much information about the", 6+ 7); + line(player, RED + "Imcando " + BLUE + "except a few live on the " + RED + "southern peninsula of", 7+ 7); + line(player, RED + "Asgarnia, " + BLUE + "they dislike strangers, and LOVE " + RED + "redberry pies.", 8+ 7); + break; + case 30: + line(player, "I told the Squire I would help him to replace the sword he", 4+ 7); + line(player, "has lost. It could only be made by an Imcando Dwarf.", 5+ 7); + line(player, "I found an Imcando Dwarf named Thurgo thanks to", 6+ 7); + line(player, "information provided by Reldo. He wasn't very talkative", 7+ 7); + line(player, "until I gave him a Redberry pie, which he gobbled up.", 8+ 7); + line(player, BLUE + "He will help me now I have gained his trust through " + RED + "pie", 9+ 7); + break; + case 40: + line(player, "I told the Squire I would help him to replace the sword he", 4+ 7); + line(player, "has lost. It could only be made by an Imcando Dwarf.", 5+ 7); + line(player, "I found an Imcando Dwarf named Thurgo thanks to", 6+ 7); + line(player, "information provided by Reldo. He wasn't very talkative", 7+ 7); + line(player, "until I gave him a Redberry pie, which he gobbled up.", 8+ 7); + line(player, RED + "Thurgo " + BLUE + "needs a " + RED + "picture of the sword " + BLUE + "before he can help.", 9+ 7); + line(player, BLUE + "I should probably ask the " + RED + "Squire " + BLUE + "about obtaining one", 10+ 7); + break; + case 50: + line(player, "I told the Squire I would help him to replace the sword he", 4+ 7); + line(player, "has lost. It could only be made by an Imcando Dwarf.", 5+ 7); + line(player, "I found an Imcando Dwarf named Thurgo thanks to", 6+ 7); + line(player, "information provided by Reldo. He wasn't very talkative", 7+ 7); + line(player, "until I gave him a Redberry pie, which he gobbled up.", 8+ 7); + line(player, "Thurgo needed a picture of the sword to replace.", 9+ 7); + if (!player.getInventory().containsItem(PORTRAIT)) { + line(player, BLUE + "The Squire told me about a " + RED + "portrait ", 10+ 7); + line(player, BLUE + "which has a " + RED + "picture of the sword " + BLUE + "in " + RED + "Sir Vyvin's room", 11+ 7); + } else { + line(player, BLUE + "I now have a picture of the " + RED + "Knight's Sword " + BLUE + "- I should take it", 10+ 7); + line(player, BLUE + "to " + RED + "Thurgo " + BLUE + "so that he can duplicate it.", 11+ 7); + } + break; + case 60: + line(player, "I told the Squire I would help him to replace the sword he", 4+ 7); + line(player, "has lost. It could only be made by an Imcando Dwarf.", 5+ 7); + line(player, "I found an Imcando Dwarf named Thurgo thanks to", 6+ 7); + line(player, "information provided by Reldo. He wasn't very talkative", 7+ 7); + line(player, "until I gave him a Redberry pie, which he gobbled up.", 8+ 7); + line(player, "Thurgo needed a picture of the sword before he could", 9+ 7); + line(player, "start work on a replacement. I took him a portrait of it.", 10+ 7); + if (player.getInventory().contains(667, 1) || player.getEquipment().contains(667, 1) || player.getBank().contains(667, 1)) { + line(player, "Thurgo has now smithed me a replica of Sir Vyvin's sword.", 11+ 7); + line(player, BLUE + "I should return it to the " + RED + "Squire " + BLUE + "for my " + RED + "reward", 13+ 7); + } else { + line(player, BLUE + "according to " + RED + "Thurgo " + BLUE + "to make a " + RED + "replica sword " + BLUE + "he will need", 11+ 7); + line(player, RED + "two Iron Bars " + BLUE + "and some " + RED + "Blurite Ore. Blurite Ore " + BLUE + "can only be", 12+ 7); + line(player, BLUE + "found " + RED + "deep in the caves below Thurgo's house", 13+ 7); + } + break; + case 100: + line(player, "Thurgo needed a picture of the sword before he could", 4+ 7); + line(player, "start work on a replacement. I took him a portrait of it.", 5+ 7); + line(player, "After bringing Thurgo two iron bars and some blurite ore", 6+ 7); + line(player, "he made me a fine replica of Sir Vyvin's Sword, which I", 7+ 7); + line(player, "returned to the Squire for a reward.", 8+ 7); + line(player, "QUEST COMPLETE!", 10+ 7); + break; + } + + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("12,725 Smithing XP", 277, 9 + 2); + player.getPacketDispatch().sendString("You have completed the Knight's Sword Quest!", 277, 2 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(667, 230, 277, 3 + 2); + player.getSkills().addExperience(Skills.SMITHING, 12725); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/VampireSlayer.java b/Server/src/main/java/Server/core/game/content/quest/free/VampireSlayer.java new file mode 100644 index 000000000..72104e3f0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/VampireSlayer.java @@ -0,0 +1,84 @@ +package core.game.content.quest.free; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the vampire quest. + * @author 'Vexia + */ +@Initializable +public class VampireSlayer extends Quest { + + /** + * Constructs a new {@code VampireSlayer} {@code Object}. + */ + public VampireSlayer() { + super("Vampire Slayer", 30, 29, 3, 178, 0, 1, 3); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + if (getStage(player) == 0) { + line(player, BLUE + "I can start this quest by speaking to " + RED + "Morgan who is in", 4+ 7); + line(player, RED + "Draynor Village.", 5+ 7); + line(player, BLUE + "Requirements:", 7+ 7); + line(player, BLUE + "Must be able to kill a level 34 " + RED + "Vampire.", 8+ 7); + } + if (getStage(player) == 10) { + line(player, "I spoke to Morgan in Draynor Village. He told me that the", 4+ 7); + line(player, "locals are being attacked by a terrifying Vampire!", 5+ 7); + line(player, BLUE + "I need to speak to " + RED + "Dr Harlow " + BLUE + "who can normally be found in", 7+ 7); + line(player, BLUE + "the " + RED + " Blue Moon Inn" + BLUE + " in " + RED + "Varrock.", 8+ 7); + } + if (getStage(player) == 20) { + line(player, "I spoke to Morgan in Draynor Village. He told me that the", 4+ 7); + line(player, "locals are being attacked by a terrifying Vampire!", 5+ 7); + line(player, "I have spoken to Dr Harlow. He seemed terribly drunk, and", 7+ 7); + line(player, "he kept asking me to buy him drinks.", 8+ 7); + line(player, BLUE + "I should see what advice " + RED + "Dr Harlow" + BLUE + " can give me about killing", 10+ 7); + line(player, RED + "Vampires.", 11+ 7); + line(player, BLUE + "When I'm ready, I should go to " + RED + "Draynor Manor" + BLUE + ", north of", 12+ 7); + line(player, BLUE + "Draynor to kill the " + RED + "Vampire" + BLUE + " that's living in the basement.", 13+ 7); + } + if (getStage(player) == 30) { + line(player, "I spoke to Morgan in Draynor Village. He told me that the", 4+ 7); + line(player, "locals are being attacked by a terrifying Vampire!", 5+ 7); + line(player, "I have spoken to Dr Harlow. He seemed terribly drunk, and", 7+ 7); + line(player, "he kept asking me to buy him drinks.", 8+ 7); + line(player, "Dr Harlow gave me a stake to finish off the Vampire then", 10+ 7); + line(player, "I'm fighting it. I've got a hammer to drive the stake deep", 11+ 7); + line(player, "into the Vampire's chest, and I have some garlic which", 12+ 7); + line(player, "should weaken the Vampire.", 13+ 7); + line(player, BLUE + "When i'm ready, I should go to " + RED + "Draynor Manor" + BLUE + ", north of", 14+ 7); + line(player, BLUE + "Draynor to kill the " + RED + "Vampire" + BLUE + " that's living in the basement.", 15+ 7); + } + if (getStage(player) == 100) { + line(player, "I spoke to Morgan in Draynor Village. He told me that the", 4+ 7); + line(player, "locals are being attacked by a terrifying Vampire!", 5+ 7); + line(player, "I have spoken to Dr Harlow. He seemed terribly drunk, and", 7+ 7); + line(player, "he kept asking me to buy him drinks.", 8+ 7); + line(player, "I have killed the Vampire, Count Draynor. Draynor Village is", 10+ 7); + line(player, "now safe!", 11+ 7); + line(player, "QUEST COMPLETE!", 12+ 7); + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getSkills().addExperience(Skills.ATTACK, 4825); + player.getPacketDispatch().sendString("3 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("4825 Attack XP", 277, 9 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(1549, 260, 277, 3 + 2); + } + + @Override + public Quest newInstance(Object object) { + // TODO Auto-generated method stub + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/WitchsPotion.java b/Server/src/main/java/Server/core/game/content/quest/free/WitchsPotion.java new file mode 100644 index 000000000..6968f1dc8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/WitchsPotion.java @@ -0,0 +1,91 @@ +package core.game.content.quest.free; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the witch's potion quest. + * @author 'Vexia + */ +@Initializable +public class WitchsPotion extends Quest { + + /** + * Constructs a new {@code WitchsPotion} {@code Object}. + */ + public WitchsPotion() { + super("Witch's Potion", 31, 30, 1, 67, 0, 1, 3); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (getStage(player)) { + case 0: + line(player, BLUE + "I can start this quest by speaking to " + RED + "Hetty " + BLUE + "in her house in", 4+ 7); + line(player, RED + "Rimmington" + BLUE + ", West of " + RED + "Port Sarim", 5+ 7); + break; + case 20: + line(player, "I spoke to Hetty in her house at Rimmington. hetty told me", 4+ 7); + line(player, "she could increase my magic power if I can bring her", 5+ 7); + line(player, "certain ingredients for a potion.", 6+ 7); + line(player, BLUE + "Hetty needs me to bring her the following:", 8+ 7); + if (player.getInventory().contains(1957, 1)) { + line(player, "I have an onion with me", 9+ 7); + } else { + line(player, RED + "An onion", 9+ 7); + } + if (player.getInventory().contains(1957, 1)) { + line(player, "I have an onion with me", 9+ 7); + } else { + line(player, RED + "An onion", 9+ 7); + } + if (player.getInventory().contains(300, 1)) { + line(player, "I have a rat's tail with me", 10+ 7); + } else { + line(player, RED + "A rat's tail", 10+ 7); + } + if (player.getInventory().contains(2146, 1)) { + line(player, "I have a piece of burnt meat with me", 11+ 7); + } else { + line(player, RED + "A piece of burnt meat", 11+ 7); + } + if (player.getInventory().contains(221, 1)) { + line(player, "I have an eye of newt with me", 12+ 7); + } else { + line(player, RED + "An eye of newt", 12+ 7); + } + break; + case 40: + line(player, "I brought her an onion, a rat's tail, a piece of burnt meat", 4+ 7); + line(player, "and eye of newt which she used to make a potion.", 5+ 7); + line(player, BLUE + "I should drink from the " + RED + "cauldron" + BLUE + " and improve my magic!", 7+ 7); + break; + case 100: + line(player, "I brought her an onion, a rat's tail, a piece of burnt meat", 4+ 7); + line(player, "and an eye of newt which she used to make a potion.", 5+ 7); + line(player, "I drank from the cauldron and my magic power increased!", 7+ 7); + line(player, "QUEST COMPLETE!", 9+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getConfigManager().set(101, player.getQuestRepository().getPoints()); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("325 Magic XP", 277, 9 + 2); + player.getSkills().addExperience(Skills.MAGIC, 325); + player.getInterfaceManager().closeChatbox(); + player.getPacketDispatch().sendItemZoomOnInterface(221, 240, 277, 3 + 2); + } + + @Override + public Quest newInstance(Object object) { + // TODO Auto-generated method stub + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/BKCabbagePlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/BKCabbagePlugin.java new file mode 100644 index 000000000..8faa8ee2d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/BKCabbagePlugin.java @@ -0,0 +1,46 @@ +package core.game.content.quest.free.blackknightsfortress; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Plugin; + +/** + * Represents the plugin used to send the cabbage down the hole. + * @author 'Vexia + * @version 1.0 + */ +public class BKCabbagePlugin extends UseWithHandler { + + /** + * Constructs a new {@code BKCabbagePlugin} {@code Object}. + */ + public BKCabbagePlugin() { + super(1965, 1967); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2336, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest("Black Knights' Fortress"); + if (quest.getStage(player) == 20) { + if (event.getUsedItem().getId() == 1967) { + player.getDialogueInterpreter().sendDialogue("This is the wrong sort of cabbage!"); + return true; + } + player.getDialogueInterpreter().open(992752973, true, true); + return true; + } else { + player.getDialogueInterpreter().sendDialogues(player, null, "Why exactly would I want to do that?"); + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin.java new file mode 100644 index 000000000..aac9914b2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/BKFortressPlugin.java @@ -0,0 +1,193 @@ +package core.game.content.quest.free.blackknightsfortress; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Represents the black knights fortress node option plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class BKFortressPlugin extends OptionHandler { + + /** + * Represents the listening animation. + */ + private static final Animation LISTEN_ANIM = new Animation(4195); + + /** + * Represents the lowering animation. + */ + private static final Animation LOWER_ANIM = new Animation(4552); + + /** + * Represents the first animation. + */ + private static final Animation FIRST_ANIM = new Animation(4549); + + /** + * Represents the last anim. + */ + private static final Animation LAST_ANIM = new Animation(4551); + + /** + * Represents the smoke graphic. + */ + private static final Graphics SMOKE = new Graphics(86, 109, 1); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(9589).getHandlers().put("option:read", this); + ObjectDefinition.forId(74).getHandlers().put("option:open", this); + ObjectDefinition.forId(73).getHandlers().put("option:open", this); + ObjectDefinition.forId(2337).getHandlers().put("option:open", this); + ObjectDefinition.forId(2338).getHandlers().put("option:open", this); + ObjectDefinition.forId(2341).getHandlers().put("option:push", this); + ObjectDefinition.forId(17148).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(17149).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(17160).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(2342).getHandlers().put("option:listen-at", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final int id = node instanceof Item ? ((Item) node).getId() : ((GameObject) node).getId(); + GameObject object = node instanceof GameObject ? ((GameObject) node) : null; + Location dest = null; + switch (id) { + case 2342:// listen at grill. + player.animate(LISTEN_ANIM); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.animate(LOWER_ANIM); + player.getDialogueInterpreter().open(992752973); + return true; + } + }); + break; + case 17160: + if (object.getLocation().equals(new Location(3022, 3518, 1))) { + dest = Location.create(3022, 3517, 0); + } + if (dest != null) { + ClimbActionHandler.climb(player, new Animation(828), dest); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + } + break; + case 17149: + if (object.getLocation().equals(new Location(3023, 3513, 2))) { + dest = Location.create(3023, 3514, 1); + } else if (object.getLocation().equals(new Location(3025, 3513, 2))) { + dest = Location.create(3025, 3514, 1); + } else if (object.getLocation().equals(new Location(3016, 3519, 2))) { + dest = Location.create(3016, 3518, 1); + } else if (object.getLocation().equals(new Location(3015, 3519, 1))) { + dest = Location.create(3015, 3518, 0); + } else if (object.getLocation().equals(new Location(3017, 3516, 2))) { + dest = Location.create(3017, 3515, 1); + } + if (dest != null) { + ClimbActionHandler.climb(player, new Animation(828), dest); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + } + break; + case 17148: + if (object.getLocation().equals(new Location(3021, 3510, 0))) { + dest = Location.create(3022, 3510, 1); + } else if (object.getLocation().equals(new Location(3015, 3519, 0))) { + dest = Location.create(3015, 3518, 1); + } else if (object.getLocation().equals(new Location(3016, 3519, 0))) { + dest = Location.create(3016, 3518, 2); + } + if (dest != null) { + ClimbActionHandler.climb(player, new Animation(828), dest); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + } + break; + case 2341: + player.getPacketDispatch().sendMessage("You push against the wall. You find a secret passage."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + case 2338: + if (player.getLocation().getX() > 3019) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + player.getDialogueInterpreter().open(4605, Repository.findNPC(4605), true, true); + break; + case 2337: + if (!player.getEquipment().containsAtLeastOneItem(1139) || !player.getEquipment().containsAtLeastOneItem(1101)) { + player.getDialogueInterpreter().open(4605, Repository.findNPC(4604), true); + } else { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } + break; + case 74: + case 73: + player.getPacketDispatch().sendMessage("You can't open this door."); + break; + case 9589: + switch (option) { + case "read":// 4549, 4551 + if (player.getInventory().remove((Item) node)) { + player.lock(); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.animate(FIRST_ANIM); + player.getDialogueInterpreter().sendDialogue("Infiltrate fortress... sabotage secret weapon... self", "destruct in 3...2...ARG!"); + break; + case 5: + player.graphics(SMOKE); + break; + case 7: + player.getInterfaceManager().closeChatbox(); + player.animate(LAST_ANIM); + player.unlock(); + return true; + } + return false; + } + }); + } + break; + } + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public boolean isWalk(final Player player, final Node node) { + return !(node instanceof Item); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.java b/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.java new file mode 100644 index 000000000..3a054cccf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/BlackKnightsFortress.java @@ -0,0 +1,96 @@ +package core.game.content.quest.free.blackknightsfortress; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the black knights fortress quest. + * @author Vexia + * + */ +@Initializable +public final class BlackKnightsFortress extends Quest { + + /** + * Represents the dossier item. + */ + public static final Item DOSSIER = new Item(9589); + + /** + * Constructs a new {@Code BlackKnightsFortress} {@Code Object} + */ + public BlackKnightsFortress() { + super("Black Knights' Fortress", 14, 13, 3, 130, 0, 1, 4); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new BKCabbagePlugin(), new BKFortressPlugin(), new SirAmikVarzeDialogue()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + player.getPacketDispatch().sendString("I can start this quest by speaking to the Sir Amik Varze at the", 275, 4 + 7); + player.getPacketDispatch().sendString(RED + " White Knight's Castle " + BLUE + "in " + RED + "Falador.", 275, 12); + if (player.getQuestRepository().getPoints() < 12) { + player.getPacketDispatch().sendString(RED + "I must have a total of at least 12 Quest Points", 275, 13); + } else { + line(player, "I have a total of at least 12 Quest Points", 13); + } + player.getPacketDispatch().sendString(BLUE + "I would have an advantage if I could fight " + RED + "Level 33 Knights", 275, 14); + player.getPacketDispatch().sendString(BLUE + "and if I had a smithing level of " + RED + "26.", 275, 15); + break; + case 10: + line(player, RED + "Sir Amik Varze " + BLUE + "has asked me to investigate the " + RED + "Black", 4 + 7); + line(player, RED + "Knights' Fortress " + BLUE + "which is located on " + RED + "Ice Mountain.", 5 + 7); + line(player, BLUE + "I need to disguise myself to gain entry to the " + RED + "Black", 6 + 7); + line(player, RED + "Knights' Fortress.", 7 + 7); + break; + case 20: + line(player, "Sir Amik Varze asked me to investigate the Black Knights'", 4 + 7); + line(player, "Fortress. I sneaked inside disguised as a Guard.", 5 + 7); + line(player, BLUE + "I eavesdropped on a Witch and the Black Knight Captain", 6+ 7); + line(player, BLUE + "and discovered that their invincibility potion can be", 7+ 7); + line(player, BLUE + "destroyed with a normal " + RED + "cabbage.", 8+ 7); + break; + case 30: + line(player, "Sir Amik Varze asked me to investigate the Black Knights'", 4+ 7); + line(player, "Fortress. I sneaked inside disguised as a Guard.", 5+ 7); + line(player, "I eavesdropped on a Witch and the Black Knight Captain", 6+ 7); + line(player, "and discovered that their invincibility potion could be", 7+ 7); + line(player, "destroyed with a normal cabbage.", 8+ 7); + line(player, BLUE + "Now that I have sabotaged the witch's potion, I can claim", 9+ 7); + line(player, BLUE + "my " + RED + "reward " + BLUE + "from " + RED + "Sir Amik Varze " + BLUE + "in " + RED + "Falador Castle.", 10+ 7); + break; + case 100: + line(player, "Sir Amik Varze asked me to investigate the Black Knights'", 4+ 7); + line(player, "Fortress. I sneaked inside disguised as a Guard.", 5+ 7); + line(player, "I eavesdropped on a Witch and the Black Knight Captain", 6+ 7); + line(player, "and discovered that their invincibility potion could be", 7+ 7); + line(player, "destroyed with a normal cabbage.", 8+ 7); + line(player, "I found a cabbage, and used it to a destroy the potion, then", 9+ 7); + line(player, "claimed my reward for a job well done.", 10+ 7); + line(player, "QUEST COMPLETE!", 12+ 7); + line(player, RED + "Reward:", 13+ 7); + line(player, BLUE + "3 Quest Points", 14+ 7); + line(player, BLUE + "2500gp", 15+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("3 Quests Points", 277, 10); + player.getPacketDispatch().sendString("2500 Coins", 277, 11); + player.getPacketDispatch().sendItemZoomOnInterface(9591, 230, 277, 5); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/SirAmikVarzeDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/SirAmikVarzeDialogue.java new file mode 100644 index 000000000..9e7f1ecfc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/blackknightsfortress/SirAmikVarzeDialogue.java @@ -0,0 +1,354 @@ +package core.game.content.quest.free.blackknightsfortress; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; + +/** + * Represents the sir amik varze dialogue. + * @author Vexia + * + */ +public class SirAmikVarzeDialogue extends DialoguePlugin { + + /** + * Represents the instanced quest. + */ + private Quest quest; + + /** + * Constructs a new {@code SirAmikVarzeDialogue} {@code Object}. + */ + public SirAmikVarzeDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SirAmikVarzeDialogue} {@code Object}. + * @param player the player. + */ + public SirAmikVarzeDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirAmikVarzeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Black Knights' Fortress"); + switch (quest.getStage(player)) { + case 30: + interpreter.sendDialogues(player, null, "I have ruined the Black Knights' invincibility potion."); + stage = 0; + break; + case 10: + case 20: + interpreter.sendDialogues(npc, null, "How's the mission going?"); + stage = 0; + break; + case 100: + interpreter.sendDialogues(player, null, "Hello Sir Amik."); + stage = 0; + break; + default: + interpreter.sendDialogues(npc, null, "I am the leader of the White Knights of Falador. Why", "do you seek my audience?"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 100: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "Hello, friend!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, null, "Do you have any other quests for me to do?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, null, "Quests, eh?", "Well, I don't have anything on the go at the moment,", "but there is an organisation that is always looking for", "capable adventurers to assist them."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, null, "Your excellent work sorting out those Black Knights", "means I will happily write you a letter of", "recommendation."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, null, "Would you like me to put your name forwards to", "them?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, null, "No thanks."); + stage = 6; + break; + case 6: + end(); + break; + } + break; + case 30: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "Yes, we have just received a message from the Black", "Knights saying they withdraw their demands, which", "would seem to confirm your story."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, null, "No I believe there was some talk of a cash reward..."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, null, "Absolutely right. Please accept this reward."); + stage = 3; + break; + case 3: + interpreter.sendDialogue("Sir Amik hands you 2500 coins."); + stage = 4; + break; + case 4: + if (!player.getInventory().add(new Item(995, 2500))) { + GroundItemManager.create(new Item(995, 2500), player); + } + quest.finish(player); + player.getQuestRepository().syncronizeTab(player); + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + interpreter.sendDialogues(player, null, "I have managed to find what the secret weapon is", "I am now in the process of destroying it."); + stage = 1; + break; + case 1: + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + interpreter.sendDialogues(player, null, "I haven't managed to find what the secret weapon is", "yet..."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "Well keep at it! Falador's future is at stake!"); + stage = 2; + break; + case 2: + if (!player.getInventory().containsItem(BlackKnightsFortress.DOSSIER) && !player.getBank().containsItem(BlackKnightsFortress.DOSSIER)) { + interpreter.sendDialogues(npc, null, "Here's the dossier on the case."); + stage = 3; + } else { + interpreter.sendDialogues(npc, null, "Don't forget to read that dossier of information I gave", "you."); + stage = 4; + } + break; + case 3: + player.getInventory().add(BlackKnightsFortress.DOSSIER); + end(); + break; + case 4: + end(); + break; + } + break; + case 0: + switch (stage) { + case 0: + if (player.getQuestRepository().getPoints() < 12) { + interpreter.sendDialogues(player, null, "I don't I'm just looking around."); + stage = 2; + } else { + interpreter.sendOptions("Select an Option", "I seek a quest!", "I don't, I'm just looking around."); + stage = 1; + } + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I seek a quest."); + stage = 5; + break; + case 2: + interpreter.sendDialogues(player, null, "I don't I'm just looking around."); + stage = 2; + break; + } + break; + case 2: + end(); + break; + case 3: + interpreter.sendDialogues(npc, null, "Ok. Please don't break anything."); + stage = 4; + break; + case 4: + end(); + break; + case 5: + interpreter.sendDialogues(npc, null, "Well, I need some spy work doing but it's quite", "dangerous. It will involve going into the Black Knights'", "fortress."); + stage = 6; + break; + case 6: + interpreter.sendOptions("Select an Option", "I laugh in the face of danger!", "I go and cower in the corner at the first sign of danger!"); + stage = 7; + break; + case 7: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I laugh in the face of danger!"); + stage = 15; + break; + case 2: + interpreter.sendDialogues(player, null, "I go and cower in a corner at the first sign of danger!"); + stage = 8; + break; + } + break; + case 8: + interpreter.sendDialogues(npc, null, "Err...."); + stage = 9; + break; + case 9: + interpreter.sendDialogues(npc, null, "Well."); + stage = 10; + break; + case 10: + interpreter.sendDialogues(npc, null, "I... suppose spy work DOES involve a little hiding in", "corners."); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Oh. I suppose I'll give it a go then.", "No, I'm not ready to do that."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Oh. I suppose I'll give it a go then."); + stage = 17; + break; + case 2: + interpreter.sendDialogues(player, null, "No, I'm not ready to do that."); + stage = 13; + break; + } + break; + case 13: + interpreter.sendDialogues(npc, null, "Come see me again if you change your mind."); + stage = 14; + break; + case 14: + end(); + break; + case 15: + interpreter.sendDialogues(npc, null, "Well that's good. Don't get too overconfident though."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, null, "You've come along at just the right time actually. All of", "my knights are already known to the Black Knights."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, null, "Subtlety isn't exactly our strong point."); + stage = 18; + break; + case 18: + interpreter.sendDialogues(player, null, "Can't you just take your White Knights' armour off?", "They wouldn't recognise you then!"); + stage = 19; + break; + case 19: + interpreter.sendDialogues(npc, null, "I am afraid our charter prevents us using espionage in", "any form, that is the domain of the Temple Knights."); + stage = 20; + break; + case 20: + interpreter.sendDialogues(player, null, "Temple Knights? Who are they?"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, null, "The information is classified. I am forbidden to share it", "with outsiders."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(player, null, "So... What do you need doing?"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, null, "Well, the Black Knights have started making strange", "threats to us; demanding large amounts of money and", "land, and threatening to invade Falador if we don't pay", "them."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(npc, null, "Now, NORMALLY this wouldn't be a problem..."); + stage = 25; + break; + case 25: + interpreter.sendDialogues(npc, null, "But they claim to have a powerful new secret weapon."); + stage = 26; + break; + case 26: + interpreter.sendDialogues(npc, null, "Your mission, should you decide to accept it, is to", "infiltrate their fortress, find out what their secret", "weapon is, and then sabotage it."); + stage = 27; + break; + case 27: + interpreter.sendOptions("Select an Option", "Ok, I'll do my best.", "No, I'm not ready to do that."); + stage = 28; + break; + case 28: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Ok, I'll do my best."); + stage = 31; + break; + case 2: + interpreter.sendDialogues(player, null, "No, I'm not ready to do that."); + stage = 29; + break; + } + break; + case 29: + interpreter.sendDialogues(npc, null, "Come see me again if you change your mind."); + stage = 30; + break; + case 30: + end(); + break; + case 31: + interpreter.sendDialogues(npc, null, "Good luck! Let me know how you get on. Here's the", "dossier for the case, I've already given you the details."); + stage = 32; + break; + case 32: + if (player.getInventory().add(BlackKnightsFortress.DOSSIER)) { + quest.start(player); + } else { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + } + end(); + break; + } + break; + default: + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 608 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/CooksAssistant.kt b/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/CooksAssistant.kt new file mode 100644 index 000000000..390053073 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/CooksAssistant.kt @@ -0,0 +1,112 @@ +package core.game.content.quest.free.cooksassistant + +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.quest.Quest +import core.plugin.Initializable +import core.game.node.entity.skill.Skills + +/** + * The Quest Journal and Configuration for the Cook's Assistant Quest. + * @author Qweqker + */ + +@Initializable +class CooksAssistant : Quest("Cook's Assistant",15, 14, 1, 29, 0, 1, 2){ + val MILK = 1927 + val FLOUR = 1933 + val EGG = 1944 + + override fun drawJournal(player: Player?, stage: Int) { + + super.drawJournal(player, stage) + + var line = 12 + var stage = player?.questRepository?.getStage("Cook's Assistant")!! + + + if(stage < 10){ //If the quest has not been started + + line(player,"I can start this quest by speaking to the !!Cook?? in the", line++) + line(player,"!!Kitchen?? on the ground floor of !!Lumbridge Castle.??", line) + + } else if (stage in 10..99) { //Player has started Cook's Assistant + + //Situation + line(player,"It's the !!Duke of Lumbridge's?? birthday and I have to help", line++) + line(player,"his !!Cook?? make him a !!birthday cake.?? To do this I need to", line++) + line(player,"bring him the following ingredients:", line++) + + //MILK + if (player.getAttribute("cooks_assistant:milk_submitted", false) || player.getAttribute("cooks_assistant:all_submitted", false)) { //If the player has handed in the bucket of milk + line(player,"---I have given the cook a bucket of milk./--", line++) + } else if (player.inventory.contains(MILK, 1)){ // If the player has a bucket of milk in their inventory + line(player, "I have found a !!bucket of milk?? to give to the cook.", line++) + } else { //If the player satisfies none of the above + line(player,"I need to find a !!bucket of milk.?? There's a cattle field east", line++) + line(player,"of Lumbridge, I should make sure I take an empty bucket", line++) + line(player, "with me.", line++) + } + + //FLOUR + if (player.getAttribute("cooks_assistant:flour_submitted", false) || player.getAttribute("cooks_assistant:all_submitted", false)) { //If the player has handed in the pot of flour + line(player,"---I have given the cook a pot of flour./--", line++) + } else if (player.inventory.contains(FLOUR, 1)){ // If the player has a pot of flour in their inventory + line(player, "I have found a !!pot of flour?? to give to the cook.", line++) + } else { //If the player satisfies none of the above + line(player,"I need to find a !!pot of flour.?? There's a mill found north-", line++) + line(player,"west of Lumbridge, I should take an empty pot with me.", line++) + } + + //EGG + if (player.getAttribute("cooks_assistant:egg_submitted", false) || player.getAttribute("cooks_assistant:all_submitted", false)) { //If the player has handed in the egg + line(player,"---I have given the cook an egg./--", line++) + } else if (player.inventory.contains(EGG, 1)){ // If the player has an egg in their inventory + line(player, "I have found an !!egg?? to give to the cook.", line++) + } else { //If the player satisfies none of the above + line(player,"I need to find an !!egg.?? The cook normally gets his eggs from", line++) + line(player,"the Groats' farm, found just to the west of the cattle", line++) + line(player,"field.", line) + } + + //If the player has handed everything in but was interrupted the final dialogue + if (player.getAttribute("cooks_assistant:all_submitted", false) || (player.getAttribute("cooks_assistant:milk_submitted", false) && player.getAttribute("cooks_assistant:flour_submitted", false) && player.getAttribute("cooks_assistant:egg_submitted", false))) { + line(player,"I should return to the !!Cook.??", line) + } + + } else if (stage >= 100) { //If the player has completed the quest + line(player,"---It was the Duke of Lumbridge's birthday, but his cook had/--", line++) + line(player,"---forgotten to buy the ingredients he needed to make him a/--", line++) + line(player,"---cake. I brought the cook an egg, some flour and some milk/--", line++) + line(player,"---and then cook made a delicious looking cake with them./--", line++) + line += 1 + line(player,"---As a reward he now lets me use his high quality range/--", line++) + line(player,"---which lets me burn things less whenever I wish to cook/--",line++) + line(player,"---there./--", line++) + line += 1 + line(player,"QUEST COMPLETE!",line) + } + } + + //The Quest Finish Certificate + override fun finish(player: Player) { + var ln = 10 + super.finish(player) + player.packetDispatch.sendString("You have completed the Cook's Assistant Quest!", 277, 4) + player.packetDispatch.sendItemZoomOnInterface(1891, 240, 277, 5) + + drawReward(player,"1 Quest Point", ln++) + drawReward(player,"300 Cooking XP", ln) + player.skills.addExperience(Skills.COOKING, 300.0) + + //Removing these attributes in the event that they weren't already cleared in the Cook's Dialogue + player.removeAttribute("cooks_assistant:milk_submitted") + player.removeAttribute("cooks_assistant:flour_submitted") + player.removeAttribute("cooks_assistant:egg_submitted") + player.removeAttribute("cooks_assistant:all_submitted") + player.removeAttribute("cooks_assistant:submitted_some_items") + } + + override fun newInstance(`object`: Any?): Quest { + return this + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/GillieGroatsDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/GillieGroatsDialogue.kt new file mode 100644 index 000000000..c897cac40 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/GillieGroatsDialogue.kt @@ -0,0 +1,73 @@ +package core.game.content.quest.free.cooksassistant + +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +/** + * Dialogue for Gillie Groats. + * @author Qweqker + */ + +@Initializable +class GillieGroatsDialogue (player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + var milk = false + if (args.size == 2) milk = true + if (milk) { //If the player attempts to milk a dairy cow without a bucket + npc(FacialExpression.LAUGH, "Tee hee! You've never milked a cow before, have you?") + stage = 100 + return true + } + npc(FacialExpression.HAPPY, "Hello, I'm Gillie the Milkmaid. What can I do for you?") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + + //If the player talks to Gillie directly + 0 -> options("Who are you?", "Can you tell me how to milk a cow?", "I'm fine, thanks.").also { stage++ } + 1 -> when(buttonId) { + 1 -> npc(FacialExpression.HAPPY, "My name's Gillie Groats. My father is a farmer and I", "milk the cows for him.").also { stage = 10 } + 2 -> player(FacialExpression.ASKING, "So how do you get milk from a cow then?").also { stage = 20 } + 3 -> player(FacialExpression.NEUTRAL, "I'm fine, thanks.").also { stage = 1000 } + } + + //Who are you? + 10 -> player(FacialExpression.ASKING, "Do you have any buckets of milk spare?").also { stage++ } + 11 -> npc(FacialExpression.SUSPICIOUS, "I'm afraid not. We need all of our milk to sell to", "market, but you can milk the cow yourself if you need", "milk.").also { stage++ } + 12 -> player(FacialExpression.HAPPY,"Thanks.").also { stage = 1000 } + + //Can you tell me how to milk a cow? + 20 -> npc(FacialExpression.FRIENDLY, "It's very easy. First you need an empty bucket to hold", "the milk.").also { stage++ } + 21 -> npc(FacialExpression.FRIENDLY, "Then find a dairy cow to milk - you can't milk just", "any cow.").also { stage++ } + 22 -> player(FacialExpression.ASKING, "How do I find a dairy cow?").also { stage++ } + 23 -> npc(FacialExpression.FRIENDLY, "They are easy to spot - they are dark brown and", "white, unlike beef cows, which are light brown and white.", "We also tether them to a post to stop them wandering", "around all over the place.").also {stage++ } + 24 -> npc(FacialExpression.FRIENDLY, "There are a couple very near, in this field.").also { stage++ } + 25 -> npc(FacialExpression.HAPPY, "Then just milk the cow and your bucket will fill with", "tasty, nutritious milk.").also { stage = 1000 } + + //Continuation of attempting to milk a dairy cow without a bucket + 100 -> player(FacialExpression.ASKING, "Erm... No. How could you tell?").also { stage++ } + 101 -> npc(FacialExpression.LAUGH, "Because you're spilling milk all over the floor. What a","waste ! You need something to hold the milk.").also { stage++ } + 102 -> player(FacialExpression.NEUTRAL, "Ah yes, I really should have guessed that one, shouldn't", "I?").also { stage++ } + 103 -> npc(FacialExpression.LAUGH, "You're from the city, aren't you... Try it again with an","empty bucket.").also{ stage++ } + 104 -> player(FacialExpression.NEUTRAL,"Right, I'll do that.").also { stage = 1000 } + + //Dialogue Endpoint + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return GillieGroatsDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(3807) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/LumbridgeCookDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/LumbridgeCookDialogue.kt new file mode 100644 index 000000000..73edbbe44 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/LumbridgeCookDialogue.kt @@ -0,0 +1,283 @@ +package core.game.content.quest.free.cooksassistant + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +/** + * Dialogue for the Lumbridge Cook. + * @author Qweqker + */ + +@Initializable +class LumbridgeCookDialogue (player: Player? = null) : DialoguePlugin(player){ + + //Item declaration + val EMPTY_BUCKET = 1925 + val MILK = 1927 + val EMPTY_POT = 1931 + val FLOUR = 1933 + val EGG = 1944 + + //Default settings for the Cook checking for ingredients in the player's inventory + var gave = false + var leftoverItems = "" + + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + if(player?.questRepository?.getQuest("Lost Tribe")?.getStage(player) == 10){ + player("Did you see what happened in the cellar?") + stage = 0 + return true + } + if (player?.questRepository?.getQuest("Cook's Assistant")!!.getStage(player) <= 0) { //If the player has ot started cook's assistant + npc(FacialExpression.SAD, "What am I to do?") + stage = 0 + return true + } else if (player?.questRepository?.getQuest("Cook's Assistant")!!.getStage(player) in 10..99) { //During the Cook's Assistant Quest + if (player.getAttribute("cooks_assistant:all_submitted", false) || (player.getAttribute("cooks_assistant:milk_submitted", false) && player.getAttribute("cooks_assistant:flour_submitted", false) && player.getAttribute("cooks_assistant:egg_submitted", false))){ //If the player has handed all the ingredients to the chef but did not continue the dialogue + npc(FacialExpression.HAPPY, "You've brought me everything I need! I am saved!", "Thank you!") + stage = 200 + return true + } else { //If the player has not handed all the items to the chef + npc(FacialExpression.SAD, "How are you getting on with finding the ingredients?") + gave = false //Resetting to false here to prevent dialogue skipping later + stage = 100 + return true + } + } + //After completing Cook's Assistant + npc(FacialExpression.HAPPY, "Hello friend, how is the adventuring going?") + stage = 300 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + if(player.questRepository.getQuest("Lost Tribe").getStage(player) == 10){ + when(stage){ + //Lost Tribe + 0 -> npc("Last night I was in the kitchen and I heard a noise","from the cellar. I opened the trapdoor and saw a","creature dart into a hole in the wall.").also { stage++ } + 1 -> npc("It looked a bit like a goblin, but it had big bulging eyes.","It wasn't wearing armour, but it had this odd helmet","with a light on it.").also { stage++ } + 2 -> npc("The tunnel was too dark for me to follow it, so I went","to tell the Duke. But when we went down to the cellar","the hole had been blocked up, and no one believes me.").also { stage++ } + 3 -> player("I believe you.").also { stage++ } + 4 -> npc("Thank you, ${player.name}! If you can convince the Duke","I'm telling the truth then we can get to the bottom of","this mystery.").also { stage = 1000; player.questRepository.getQuest("Lost Tribe").setStage(player,20) } + 5 -> end() + } + return true + } + when (stage) { + 0 -> options("What's wrong?", "Can you make me a cake?", "You don't look very happy.", "Nice hat!").also { stage++ } + 1 -> when(buttonId) { + 1 -> player(FacialExpression.NEUTRAL, "What's wrong?").also { stage = 10 } + 2 -> player(FacialExpression.ASKING, "You're a cook, why don't you bake me a cake?").also { stage = 20 } + 3 -> player(FacialExpression.NEUTRAL,"You don't look very happy.").also { stage = 30; } + 4 -> player(FacialExpression.HAPPY, "Nice hat!").also { stage = 40 } + } + + //What's wrong? + 10 -> npc(FacialExpression.SCARED, "Oh dear, oh dear, oh dear, I'm in a terrible terrible", "mess! It's the Duke's birthday today, and I should be", "making him a lovely big birthday cake.").also { stage++ } + 11 -> npc(FacialExpression.SAD, "I've forgotten to buy the ingredients. I'll never get", "them in time now. He'll sack me! What will I do? I have", "four children and a goat to look after. Would you help", "me? Please?").also { stage++ } + 12 -> options("I'm always happy to help a cook in distress.", "I can't right now, Maybe later.").also { stage++ } + 13 -> when(buttonId) { + 1 -> player(FacialExpression.HAPPY, "Yes, I'll help you.").also { stage = 50 } + 2 -> player(FacialExpression.ANNOYED, "No, I don't feel like it. Maybe later.").also { stage++ } + } + + //I can't right now + 14 -> npc(FacialExpression.SAD, "Fine. I always knew you Adventurer types were callous", "beasts. Go on your merry way!").also { stage = 1000 } + + //Can you make me a cake? + 20 -> npc(FacialExpression.SAD, "*sniff* Don't talk to me about cakes...").also { stage++ } + 21 -> player(FacialExpression.NEUTRAL, "What's wrong?").also { stage = 10} + + //You don't look very happy + 30 -> npc(FacialExpression.SAD, "No, I'm not. The world is caving in around me - I am", "overcome by dark feelings of impending doom.").also { stage++ } + 31 -> options("What's wrong?","I'd take the rest of the day off if I were you.").also { stage++ } + 32 -> when(buttonId) { + 1 -> player(FacialExpression.NEUTRAL, "What's wrong?").also { stage = 10} + 2 -> player(FacialExpression.NEUTRAL,"I'd take the rest of the day off if I were you.").also { stage++ } + } + 33 -> npc(FacialExpression.SAD,"No, that's the worst thing I could do. I'd get in terrible","trouble.").also { stage++ } + 34 -> player(FacialExpression.ASKING,"Well maybe you need to take a holiday...").also { stage++ } + 35 -> npc(FacialExpression.SAD,"That would be nice, but the Duke doesn't allow holidays","for core staff").also { stage++ } + 36 -> player(FacialExpression.SUSPICIOUS,"Hmm, why not run away to the sea and start a new","life as a Pirate?").also { stage++ } + 37 -> npc(FacialExpression.SAD,"My wife gets sea sick, and I have an irrational fear of","eyepatches. I don't see it working myself.").also { stage++ } + 38 -> player(FacialExpression.NEUTRAL,"I'm afraid I've run out of ideas.").also { stage++ } + 39 -> npc(FacialExpression.SAD,"I know I'm doomed.").also { stage = 21 } + + //Nice hat! + 40 -> npc(FacialExpression.SAD, "Er, thank you. It's a pretty ordinary cook's hat, really.").also { stage++ } + 41 -> player(FacialExpression.HAPPY, "Still, it suits you. The trousers are pretty special too.").also { stage++ } + 42 -> npc(FacialExpression.SAD, "It's all standard-issue cook's uniform.").also { stage++ } + 43 -> player(FacialExpression.HAPPY, "The whole hat, apron, stripy trousers ensemble. It", "works. It makes you looks like a real cook.").also { stage++ } + 44 -> npc(FacialExpression.ANGRY, "I AM a real cook! I haven't got time to be chatting", "about culinary fashion. I'm in desperate need of help!").also { stage = 21 } + + //Yes, I'll help you + 50 -> npc(FacialExpression.HAPPY, "Oh thank you, thank you. I need milk, an egg and", "flour. I'd be very grateful if you can get them for me.").also{ player?.questRepository?.getQuest("Cook's Assistant")?.start(player!!); stage++ } + 51 -> player(FacialExpression.NEUTRAL, "So where do I find these ingredients then?").also { stage = 60 } + + //Where do I find these ingredients? + 60 -> options("Where do I find some flour?","How about milk?","And eggs? Where are they found?","Actually, I know where to find this stuff.").also { stage++ } + 61 -> when(buttonId) { + 1 -> npc(FacialExpression.NEUTRAL,"There is a Mill fairly close, go North and then West.","Mill Lane Mill is just off the road to Draynor. I","usually get my flour from there.").also {stage = 70 } + 2 -> npc(FacialExpression.NEUTRAL,"There is a cattle field on the other side of the river,","just across the road from the Groats' Farm.").also { stage = 71 } + 3 -> npc(FacialExpression.NEUTRAL,"I normally get my eggs from the Groats' farm, on the","other side of the river.").also { stage = 73 } + 4 -> player(FacialExpression.NEUTRAL,"Actually, I know where to find this stuff.").also { stage = 1000 } + } + + //Where do I find some flour? + 70 -> npc(FacialExpression.SUSPICIOUS,"Talk to Millie, she'll help, she's a lovely girl and a fine","Miler. Make sure you take a pot with you for the flour","though, " + if (player.inventory.contains(EMPTY_POT, 1)) "you've got one on you already." else "there should be one on the table in here.").also { stage = 80 } + + //How about milk? + 71 -> npc(FacialExpression.SUSPICIOUS,"Talk to Gillie Groats, she looks after the Dairy cows -","she'll tell you everything you need to know about","milking cows!").also { stage++ } + 72 -> + if (player.inventory.contains(EMPTY_BUCKET , 1)) { + npc(FacialExpression.NEUTRAL,"You'll need an empty bucket for the milk itself. I do see", "you've got a bucket with you already luckily!").also { stage = 80 } + } else { + npc(FacialExpression.NEUTRAL,"You'll need an empty bucket for the milk itself. The", "general store just north of the castle will sell you one", "for a couple of coins.").also { stage = 80 } + } + + //And Eggs? + 73 -> npc(FacialExpression.NEUTRAL,"But any chicken should lay eggs.").also { stage = 80 } + + //Alternative menu for "Where do I find these ingredients?" + 80 -> options("Where do I find some flour?","How about milk?","And eggs? Where are they found?","I've got all the information I need. Thanks.").also { stage++ } + 81 -> when(buttonId) { + 1 -> npc(FacialExpression.NEUTRAL,"There is a Mill fairly close, go North and then West.","Mill Lane Mill is just off the road to Draynor. I","usually get my flour from there.").also {stage = 70 } + 2 -> npc(FacialExpression.NEUTRAL,"There is a cattle field on the other side of the river,","just across the road from the Groats' Farm.").also { stage = 71 } + 3 -> npc(FacialExpression.NEUTRAL,"I normally get my eggs from the Groats' farm, on the","other side of the river.").also { stage = 73 } + 4 -> player(FacialExpression.NEUTRAL,"I've got all the information I need. Thanks.").also { stage = 1000 } + } + + 100 -> + if (!player.getAttribute("cooks_assistant:milk_submitted", false) && player.inventory.contains(MILK, 1)) { + player.setAttribute("/save:cooks_assistant:milk_submitted", true).also { + player(FacialExpression.HAPPY, "Here's a bucket of milk.") + player.inventory.remove(Item(MILK)) + gave = true + stage = 100 + } + } else if (!player.getAttribute("cooks_assistant:flour_submitted", false) && player.inventory.contains(FLOUR, 1)) { + player.setAttribute("/save:cooks_assistant:flour_submitted", true).also { + player(FacialExpression.HAPPY, "Here's a pot of flour.") + player.inventory.remove(Item(FLOUR)) + gave = true + stage = 100 + } + } else if (!player.getAttribute("cooks_assistant:egg_submitted", false) && player.inventory.contains(EGG, 1)) { + player.setAttribute("/save:cooks_assistant:egg_submitted", true).also { + player(FacialExpression.HAPPY, "Here's a fresh egg.") + player.inventory.remove(Item(EGG)) + gave = true + stage = 100 + } + } else { + if (gave) { + + //If this is the first time the player gave an item (or items) to the Lumbridge cook + if (!player.getAttribute("cooks_assistant:submitted_some_items", false)) { + player.setAttribute("/save:cooks_assistant:submitted_some_items", true) + } + + //If the player has now handed in all the ingredients + if (player.getAttribute("cooks_assistant:milk_submitted", false) && player.getAttribute("cooks_assistant:flour_submitted", false) && player.getAttribute("cooks_assistant:egg_submitted", false)) { + npc(FacialExpression.HAPPY, "You've brought me everything I need! I am saved!", "Thank you!").also { player.setAttribute("/save:cooks_assistant:all_submitted",true); stage = 200 } + } else { + npc(FacialExpression.WORRIED,"Thanks for the ingredients you have got so far, please get","the rest quickly. I'm running out of time! The Duke","will throw me into the streets!").also { stage = 151 } + } + + } else { //If the player did not give an item to the Lumbridge cook + + //If the player also has never submitted anything before + if (!player.getAttribute("cooks_assistant:submitted_some_items", false)) { + player(FacialExpression.NEUTRAL, "I haven't gotten any of them yet, I'm still looking.").also { stage = 155 } + } else { + options("I'll get right on it.", "Can you remind me how to find these things again?").also { stage = 161 } + } + } + } + + //If the player has submitted some ingredients but not all of them + 150 -> npc(FacialExpression.WORRIED,"Thanks for the ingredients you have got so far, please get","the rest quickly. I'm running out of time! The Duke","will throw me into the streets!").also { stage++ } + + //Checking what the player has left over + 151 -> leftoverItems = "".also{ + if (!player.getAttribute("cooks_assistant:milk_submitted", false)){ + leftoverItems += "A bucket of milk. " + } + if (!player.getAttribute("cooks_assistant:flour_submitted", false)){ + leftoverItems += "A pot of flour. " + } + if (!player.getAttribute("cooks_assistant:egg_submitted", false)){ + leftoverItems += "An egg." + } + if (leftoverItems != ""){ + sendDialogue("You still need to get:",leftoverItems).also {stage = 160} + } else { + npc(FacialExpression.HAPPY, "You've brought me everything I need! I am saved!", "Thank you!").also { player.setAttribute("/save:cooks_assistant:all_submitted",true); stage = 200 } + } + } + + //If the player has yet to collect or hand in any of the ingredients + 155 -> npc(FacialExpression.WORRIED,"Please get the ingredients quickly. I'm running out of","time! The Duke will throw me into the streets!").also { stage++ } + 156 -> sendDialogue("You still need to get:", "A bucket of milk. A pot of flour. An egg.").also { stage = 160 } + + + // Menu after checking the items handed in + 160 -> options("I'll get right on it.","Can you remind me how to find these things again?").also { stage++ } + 161 -> when(buttonId) { + 1 -> player(FacialExpression.NEUTRAL,"I'll get right on it.").also { stage = 1000 } + 2 -> player(FacialExpression.ASKING,"Can you remind me how to find these things again?").also { stage = 60 } + } + + //Final Cooks Assistant Dialogue + 200 -> player(FacialExpression.HAPPY, "So do I get to go to the Duke's Party?").also { stage++ } + 201 -> npc(FacialExpression.SAD, "I'm afraid not, only the big cheeses get to dine with the", "Duke.").also { stage++ } + 202 -> player(FacialExpression.NEUTRAL, "Well, maybe one day I'll be important enough to sit on", "the Duke's table.").also { stage ++ } + 203 -> npc(FacialExpression.NEUTRAL, "Maybe, but I won't be holding my breath.").also { stage++ } + + //Activate the Cook's Assistant Quest Complete Certificate + 204 -> end().also { player?.questRepository?.getQuest("Cook's Assistant")?.finish(player!!) } + + //Dialogue after Cook's Assistant Completion + 300 -> if(player.questRepository.getQuest("Lost Tribe").getStage(player) == 10) { + player("Do you know what happened in the castle cellar?").also { stage = 600 } + } else { + options("I am getting strong and mighty.", "I keep on dying.", "Can I use your range?").also { stage++ } + } + 301 -> when (buttonId) { + 1 -> player(FacialExpression.HAPPY, "I am getting strong and mighty. Grrr").also { stage = 310 } + 2 -> player(FacialExpression.SAD, "I keep on dying.").also { stage = 320 } + 3 -> player(FacialExpression.ASKING, "Can I use your range?").also { stage = 330 } + } + + //I am getting strong and mighty + 310 -> npc(FacialExpression.HAPPY,"Glad to hear it!").also { stage = 1000 } + + //I keep on dying + 320 -> npc(FacialExpression.HAPPY, "Ah, well, at least you keep coming back to life too!").also { stage = 1000 } + + //Can I use your range? + 330 -> npc(FacialExpression.HAPPY, "Go ahead! It's a very good range; it's better than most" ,"other ranges.").also { stage++ } + 331 -> npc(FacialExpression.NEUTRAL, "It's called the Cook-o-Matic 100 and it uses a combination","of state-of-the-art temperature regulation and magic.").also { stage++ } + 332 -> player(FacialExpression.ASKING,"Will it mean my food will burn less often?").also { stage++ } + 333 -> npc(FacialExpression.NEUTRAL,"Well, that's what the salesman told us anyway...").also { stage++ } + 334 -> player(FacialExpression.THINKING, "Thanks?").also { stage = 1000 } + //Conversation Endpoint + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return LumbridgeCookDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(278) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/MillieMillerDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/MillieMillerDialogue.kt new file mode 100644 index 000000000..7dcb5f5f4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/cooksassistant/MillieMillerDialogue.kt @@ -0,0 +1,70 @@ + package core.game.content.quest.free.cooksassistant + + import core.ServerConstants + import core.game.node.entity.player.Player + import core.plugin.Initializable + import core.game.content.dialogue.DialoguePlugin + import core.game.content.dialogue.FacialExpression + + /** + * Dialogue for Millie Miller. + * @author Qweqker + */ + + @Initializable + class MillieMillerDialogue (player: Player? = null) : DialoguePlugin(player) { + + override fun open(vararg args: Any?): Boolean { + + npc(FacialExpression.HAPPY, "Hello Adventurer. Welcome to Mill Lane Mill. Can I", "help you?") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + + //Continuation of Millie's greeting + 0 -> options("Who are you?", "What is this place?", "How do I mill flour?", "I'm fine, thanks.").also { stage++ } + 1 -> when (buttonId) { + 1 -> player(FacialExpression.ASKING, "Who are you?").also { stage = 10 } + 2 -> player(FacialExpression.ASKING, "What is this place?").also { stage = 20 } + 3 -> player(FacialExpression.ASKING, "How do I mill flour?").also { stage = 30 } + 4 -> player(FacialExpression.NEUTRAL, "I'm fine, thanks.").also { stage = 1000 } + } + + //Who are you? + 10 -> npc(FacialExpression.FRIENDLY, "I'm Miss Millicent Miller the Miller of Mill Lane Mill.", "Our family have been milling flour for generations.").also { stage = 10 } + 11 -> player(FacialExpression.FRIENDLY, "It's a good business to be in. People will always need", "flour.").also { stage++ } + 12 -> player(FacialExpression.ASKING, "How do I mill flour?").also { stage = 30 } + + //What is this place? + 20 -> npc(FacialExpression.SUSPICIOUS, "This is Mill Lane Mill. Millers of the finest flour in", ServerConstants.SERVER_NAME + ", and home to the Miller family for many", "generations").also { stage++ } + 21 -> npc(FacialExpression.HAPPY, "We take grain from the field nearby and mill into flour.").also { stage++ } + 22 -> player(FacialExpression.ASKING, "How do I mill flour?").also { stage = 30 } + + //How do I mill flour? + 30 -> npc(FacialExpression.FRIENDLY, "Making flour is pretty easy. First of all you need to", "get some grain. You can pick some from wheat fields.", "There is one just outside the Mill, but there are many", "others scattered across " + ServerConstants.SERVER_NAME + ". Feel free to pick wheat").also { stage++ } + 31 -> npc(FacialExpression.FRIENDLY, "from our field! There always seems to be plenty of", "wheat there.").also { stage++ } + 32 -> player(FacialExpression.ASKING, "Then I bring my wheat here?").also { stage++ } + 33 -> npc(FacialExpression.FRIENDLY, "Yes, or one of the other mills in " + ServerConstants.SERVER_NAME + ". They all work", "the same way. Just take your grain to the top floor of", "the mill (up two ladders, there are three floors including", "this one) and then place some grain in to the hopper.").also { stage++ } + 34 -> npc(FacialExpression.HAPPY, "Then you need to start the grinding process by pulling", "the hopper lever. You can add more grain, but each", "time you add grain you have to pul the hopper lever", "again.").also { stage++ } + 35 -> player(FacialExpression.ASKING, "So where does the flour go then?").also { stage++ } + 36 -> npc(FacialExpression.SUSPICIOUS, "The flour appears in this room here, you'll need a pot", "to put the flour into. One pot will hold the flour made", "by one load of grain").also { stage++ } + 37 -> npc(FacialExpression.HAPPY, "And that's it! You now have some pots of finely ground", "flour of the highest quality. Ideal for making tasty cakes", "or delicous bread. I'm not a cook so you'll have to ask a", "cook to ind out how to bake things.").also { stage++ } + 38 -> npc(FacialExpression.HAPPY, "Great! Thanks for your help.").also { stage = 1000 } + + //Conversation Endpoint + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return MillieMillerDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(3806) + } + } \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DSlayerDrainPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DSlayerDrainPlugin.java new file mode 100644 index 000000000..1d349e2d0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DSlayerDrainPlugin.java @@ -0,0 +1,86 @@ +package core.game.content.quest.free.demonslayer; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the demon slayer plugin used to handle washing the key down the drain. + * @author 'Vexia + * @version 1.0 + */ +public final class DSlayerDrainPlugin extends UseWithHandler { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(827); + + /** + * Represents the bucket of water item. + */ + private static final Item BUCKET_OF_WATER = new Item(1929); + + /** + * Represents the bucket item. + */ + private static final Item BUCKET = new Item(1925); + + /** + * Constructs a new {@code DSlayerDrainPlugin} {@code Object}. + */ + public DSlayerDrainPlugin() { + super(1929); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(17424, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest("Demon Slayer"); + if (player.getInventory().remove(BUCKET_OF_WATER)) { + player.getInventory().add(BUCKET); + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You pour the liquid down the drain."); + if (quest.getStage(player) != 20) { + System.out.println("1"); + return true; + } + if (player.getAttribute("demon-slayer:just-poured", false)) { + System.out.println("2"); + return true; + } + if (!player.hasItem(DemonSlayer.FIRST_KEY)) { + System.out.println("3"); + player.getSavedData().getQuestData().getDemonSlayer()[0] = false; + } + if (quest.getStage(player) == 20 && !player.hasItem(DemonSlayer.FIRST_KEY) && !player.getSavedData().getQuestData().getDemonSlayer()[0]) { + System.out.println("4"); + player.getDialogueInterpreter().sendDialogues(player, null, "OK, I think I've washed the key down into the sewer.", "I'd better go down and get it!"); + player.getSavedData().getQuestData().getDemonSlayer()[0] = true;// poured + player.getConfigManager().set(222, 2660610, true); + player.setAttribute("demon-slayer:just-poured", true); + return true; + } + } + return true; + } + + @Override + public Location getDestination(Player player, Node with) { + return new Location(3225, 3495); + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DemonSlayer.java b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DemonSlayer.java new file mode 100644 index 000000000..46d4a4056 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DemonSlayer.java @@ -0,0 +1,382 @@ +package core.game.content.quest.free.demonslayer; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.PluginManager; + +/** + * Represents the demon slayer quest. + * @author Vexia + * + */ +@Initializable +public class DemonSlayer extends Quest { + + /** + * Represents the silverlight item. + */ + public static final Item SILVERLIGHT = new Item(2402); + + /** + * Represents the incantations we can use to generate a total incantation. + */ + private static final String[] INCANTATIONS = new String[] { "Carlem", "Aber", "Purchai", "Camerinthum", "Gabindo" }; + + /** + * Represents the first key item. + */ + public static final Item FIRST_KEY = new Item(2401); + + /** + * Represents the second key item. + */ + public static final Item SECOND_KEY = new Item(2400); + + /** + * Represents the third key item. + */ + public static final Item THIRD_KEY = new Item(2399); + + /** + * Constructs a new {@Code DemonSlayer} {@Code Object} + */ + public DemonSlayer() { + super("Demon Slayer", 16, 15, 3, 222, 0, 1, 3); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new DemonSlayerPlugin(), new DSlayerDrainPlugin(), new DemonSlayerCutscene(), new WallyCutscenePlugin(), new GypsyArisDialogue(), new SirPyrsinDialogue(), new TraibornDialogue(), new CaptainRovinDialogue()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (getStage(player)) { + case 0: + player.getPacketDispatch().sendString(BLUE + "I can start this quest by speaking to the " + RED + "Gypsy " + BLUE + "in the " + RED + "tent", 275, 4 + 8); + player.getPacketDispatch().sendString(BLUE + "in " + RED + "Varrock's main square", 275, 5+ 8); + player.getPacketDispatch().sendString(BLUE + "I must be able to defeat a level 27 " + RED + "apocalyptic demon" + BLUE + "!", 275, 7+ 8); + break; + case 10: + line(player, "I spoke to the Gypsy in Varrock Square who saw my future.", 4+ 8); + line(player, "Unfortunately it involved killing a demon who nearly", 5+ 8); + line(player, "destroyed Varrock over 150 years ago.", 6+ 7); + line(player, BLUE + "To defeat the " + RED + "demon " + BLUE + "I need the magical sword " + RED + "Silverlight.", 8+ 8); + line(player, BLUE + "I should ask " + RED + "Sir Prysin " + BLUE + "in " + RED + "Varrock Palace " + BLUE + "where it is.", 9+ 8); + break; + case 20: + line(player, "I spoke to the Gypsy in Varrock Square who saw my future.", 4+ 8); + line(player, "Unfortunately it involved killing a demon who nearly", 5+ 8); + line(player, "destroyed Varrock over 150 years ago.", 6+ 8); + line(player, BLUE + "To defeat the " + RED + "demon " + BLUE + "I need the magical sword " + RED + "Silverlight.", 8+ 8); + line(player, RED + "Sir Prysin " + BLUE + "needs " + RED + "3 keys " + BLUE + "before he can give me " + RED + "Silverlight.", 9+ 8); + if (player.getInventory().containsItem(FIRST_KEY) && player.getInventory().containsItem(SECOND_KEY) && player.getInventory().containsItem(THIRD_KEY)) { + line(player, BLUE + "Now I have " + RED + "all 3 keys " + BLUE + "I should go and speak to " + RED + "Sir Prysin", 9+ 8); + line(player, BLUE + "and collect the magical sword " + RED + "Silverlight " + BLUE + "from him.", 10+ 8); + } else { + line(player, player.hasItem(FIRST_KEY) ? "I have the 1st Key with me." : BLUE + "The " + RED + "1st Key " + BLUE + "was dropped down the palace kitchen drains.", 11+ 8); + line(player, player.hasItem(SECOND_KEY) ? "I have the 2nd Key with me." : BLUE + "The " + RED + "2nd Key " + BLUE + "is with Captain Rovin in Varrock Palace.", 12+ 8); + line(player, player.hasItem(THIRD_KEY) ? "I Have the 3rd key with me." : BLUE + "The " + RED + "3rd Key " + BLUE + "is with the Wizard Traiborn at the Wizards' Tower.", 13+ 8); + if (player.getAttribute("demon-slayer:traiborn", false)) { + line(player, BLUE + "The " + RED + "3rd Key " + BLUE + "is with Wizard Traiborn at the Wizards' Tower.", 13); + line(player, RED + "Traiborn " + BLUE + "needs " + RED + "25 " + BLUE + "more " + RED + "bones.", 14); + } + } + break; + case 30: + line(player, "I spoke to the Gypsy in Varrock Square who saw my future.", 4+ 8); + line(player, "Unfortunately it involved killing a demon who nearly", 5+ 8); + line(player, "destroyed Varrock over 150 years ago.", 6+ 8); + line(player, "I reclaimed the magical sword Silverlight from Sir Prysin.", 8+ 8); + line(player, BLUE + "Now I should go to the stone circle south of the city and", 9+ 8); + line(player, BLUE + "destroy " + RED + "Delrith " + BLUE + "using " + RED + "Silverlight" + BLUE + "!", 10+ 8); + break; + case 100: + line(player, "I spoke to the Gypsy in Varrock Square who saw my future.", 4+ 8); + line(player, "Unfortunately it involved killing a demon who nearly", 5+ 8); + line(player, "destroyed Varrock over 150 years ago.", 6+ 7); + line(player, "I reclaimed the magical sword Silverlight from Sir Prysin.", 8+ 8); + line(player, "Using its power I managed to destroy the demon Delrith", 9+ 8); + line(player, "like the great hero Wally did many years before.", 10+ 8); + line(player, "QUEST COMPLETE!", 12+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("3 Quests Points", 277, 8+ 2); + player.getPacketDispatch().sendString("Silverlight", 277, 9+ 2); + player.getPacketDispatch().sendItemZoomOnInterface(SILVERLIGHT.getId(), 230, 277, 5); + player.removeAttribute("demon-slayer:traiborn"); + player.removeAttribute("demon-slayer:incantation"); + player.removeAttribute("demon-slayer:poured"); + player.removeAttribute("demon-slayer:received"); + player.getQuestRepository().syncronizeTab(player); + } + + /** + * Gets the incantation the player was given. + * @param player the player. + * @return the incantation given. + */ + public static String getIncantation(final Player player) { + return player.getAttribute("demon-slayer:incantation", generateIncantation(player)); + } + + /** + * Generates an incantation. + * @param player the player. + * @return the incantation. + */ + public static String generateIncantation(final Player player) { + final String incantation = player.getAttribute("demon-slayer:incantation", generateIncantation()); + player.setAttribute("/save:demon-slayer:incantation", incantation); + return incantation; + } + + /** + * Gets the generated incantation. + * @return the incantation. + */ + private final static String generateIncantation() { + List incantations = new ArrayList<>(); + for (String s : INCANTATIONS) { + incantations.add(s); + } + Collections.shuffle(incantations); + return incantations.get(0) + "... " + incantations.get(1) + "... " + incantations.get(2) + "... " + incantations.get(3) + "... " + incantations.get(4); + } + /** + * Represents the dialogue plugin used for the captain rovin npc. + * @author 'Vexia + * @version 1.0 + */ + public final class CaptainRovinDialogue extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code CaptainRovin} {@code Object}. + */ + public CaptainRovinDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CaptainRovin} {@code Object}. + * @param player the player. + */ + public CaptainRovinDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CaptainRovinDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Demon Slayer"); + switch (quest.getStage(player)) { + default: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What are you doing up here? Only the palace guards", "are allowed up here."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + defaultDialogue(buttonId); + break; + } + return true; + } + + /** + * Method used to handle the default dialogue. + * @param buttonId the button id. + */ + private final void defaultDialogue(int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "I am one of the palace guards.", "What about the King?", "Yes I know, but this is important."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I am one of the palace guards."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What about the King? Surely you'd let him up here."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, I know but this is important."); + stage = 30; + break; + } + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ok, I'm listening. Tell me what's so important."); + stage = 31; + break; + case 31: + if (quest.getStage(player) == 20) { + player("There's a demon who wants to invade the city."); + stage = 600; + return; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Erm... I forgot."); + stage = 32; + break; + case 32: + end(); + break; + case 21: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, yes I suppose we'd let him up, He doesn't", "generally want to come up here, but if he did want to,", "he could."); + stage = 21; + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No, you're not! I know all the palace guards."); + stage = 11; + break; + case 11: + end(); + break; + case 600: + if (player.getInventory().containsItem(DemonSlayer.SECOND_KEY) || player.getBank().containsItem(DemonSlayer.SECOND_KEY)) { + npc("Yes, you said before, haven't you killed it yet?"); + stage = 620; + return; + } + npc("Is it a powerful demon?"); + stage = 601; + break; + case 601: + player("Yes, very."); + stage = 602; + break; + case 602: + npc("As good as the palace guards are, I don't know if", "they're up to taking on a very powerful demon."); + stage = 603; + break; + case 603: + player("It's not them who are going to fight the demon, it's me."); + ; + stage = 604; + break; + case 604: + npc("What, all by yourself? How are you going to do that?"); + stage = 605; + break; + case 605: + player("I'm going to use the powerful sword Silverlight, which I", "believe you have one of the keys for?"); + stage = 606; + break; + case 606: + npc("Yes, I do. But why should I give it to you?"); + stage = 607; + break; + case 607: + player("Sir Prysin said you would give me the key."); + stage = 608; + break; + case 608: + npc("Oh, he did, did he? Well I don't report to Sir Prysin, I", "report directly to the king!"); + stage = 609; + break; + case 609: + npc("I didn't work my way up through the ranks of the", "palace guards so I could take orders from an ill-bred", "moron who only has his job because his great-", "grandfather was a hero with a silly name!"); + stage = 610; + break; + case 610: + player("Why did he give you one of the keys then?"); + stage = 611; + break; + case 611: + npc("Only because the king ordered him to! The king", "couldn't get Sir Prysin to part with his precious", "ancestral sword, but he made him lock it up so he", "couldn't lose it."); + stage = 612; + break; + case 612: + npc("I got one key and I think some wizard got another.", "Now what happened to the third one?"); + stage = 613; + break; + case 613: + player("Sir Prysin dropped it down a drain!"); + stage = 614; + break; + case 614: + npc("Ha ha ha! The idiot!"); + stage = 615; + break; + case 615: + npc("Okay, I'll give you the key, just so that it's you that", "kills the demon and not Sir Prysin!"); + stage = 616; + break; + case 616: + if (player.getInventory().freeSlots() == 0) { + npc("Talk to me again when you have free inventory space."); + stage = 617; + return; + } + if (player.getInventory().add(DemonSlayer.SECOND_KEY)) { + interpreter.sendItemMessage(DemonSlayer.SECOND_KEY.getId(), "Captain Rovin hands you a key."); + stage = 618; + } + break; + case 617: + end(); + break; + case 618: + end(); + break; + case 620: + player("Well I'm going to use the powerful sword Silverlight", "which I believe you have one of the keys for?"); + stage = 621; + break; + case 621: + npc("I already gave you my key. Check your pockets."); + stage = 622; + break; + case 622: + end(); + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 884 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DemonSlayerCutscene.java b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DemonSlayerCutscene.java new file mode 100644 index 000000000..4f558f283 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DemonSlayerCutscene.java @@ -0,0 +1,590 @@ +package core.game.content.quest.free.demonslayer; + +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.net.packet.out.MinimapState; + +/** + * Represents the cutscene during the combat of fighting delrith the demon. + * @author Vexia + * + */ +public final class DemonSlayerCutscene extends CutscenePlugin { + + /** + * Represents the id of delrith. + */ + public static final int DELRITH = 879; + + /** + * Represents the id of weakened delrith. + */ + public static final int WEAKENED_DELRITH = 880; + + /** + * Represents the wizard animation. + */ + private static final Animation WIZARD_ANIM = new Animation(4617); + + /** + * Represents the stone table. + */ + public GameObject stoneTable; + + /** + * Represents the delrith npc. + */ + public NPC delrith; + + /** + * Constructs a new {@code DemonSlayerCutscene} {@code Object}. + */ + public DemonSlayerCutscene() { + super("Demon Slayer Cutscene"); + } + + /** + * Constructs a new {@code DemonSlayerCutscene} {@code Object}. + * @param player the player. + */ + public DemonSlayerCutscene(final Player player) { + super("Demon Slayer Cutscene"); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new DemonSlayerCutscene(p); + } + + @Override + public boolean start(final Player player, final boolean login, Object... args) { + final NPC npcs[] = new NPC[] { NPC.create(4658, base.transform(29, 43, 0)), NPC.create(4659, base.transform(29, 40, 0)), NPC.create(4662, base.transform(26, 40, 0)), NPC.create(4660, base.transform(26, 43, 0)) }; + for (NPC n : npcs) { + n.init(); + n.faceLocation(base.transform(27, 42, 0)); + this.npcs.add(n); + } + player.lock(); + return super.start(player, login, args); + } + + @Override + public void open() { + player.setAttribute("cutscene:original-loc", Location.create(3221, 3373, 0)); + player.setAttribute("real-end", Location.create(3221, 3373, 0)); + for (NPC n : npcs) { + n.animate(WIZARD_ANIM); + } + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX(), player.getLocation().getY(), 450, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() - 15, player.getLocation().getY() + -55, 450, 1, 100)); + player.lock(); + player.getDialogueInterpreter().open(4662, npcs.get(3), this); + } + + @Override + public void end() { + super.end(); + player.unlock(); + } + + @Override + public boolean enter(final Entity entity) { + if (!(entity instanceof Player)) { + return true; + } + final Player player = ((Player) entity); + final Quest quest = player.getQuestRepository().getQuest("Demon Slayer"); + boolean in = player.getAttribute("demon-slayer:cutscene", false); + if (quest.getStage(player) == 30 && !in && (player.getEquipment().containsItem(DemonSlayer.SILVERLIGHT) || player.getInventory().containsItem(DemonSlayer.SILVERLIGHT))) { + ActivityManager.start(player, "Demon Slayer Cutscene", false); + player.setAttribute("demon-slayer:cutscene", true); + return super.enter(entity); + } + return super.enter(entity); + } + + @Override + public void locationUpdate(Entity entity, Location last) { + if (!(entity instanceof Player)) { + super.locationUpdate(entity, last); + return; + } + Player player = ((Player) entity); + if (base != null && player.getAttribute("demon-slayer:cutscene", false) && player.getLocation().getDistance(base.transform(27, 42, 0)) > 8) { + stop(true); + } + super.locationUpdate(entity, last); + } + + @Override + public boolean leave(final Entity e, final boolean logout) { + if (!(e instanceof Player)) { + return true; + } + final Player player = ((Player) e); + if (player.getAttribute("demon-slayer:cutscene", false)) { + if (base != null && player.getLocation().getDistance(base.transform(27, 42, 0)) > 13) { + player.removeAttribute("demon-slayer:cutscene"); + } + return super.leave(player, logout); + } + return super.leave(player, logout); + } + + @Override + public Location getStartLocation() { + return base.transform(29, 47, 0); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + region = DynamicRegion.create(12852); + setRegionBase(); + registerRegion(region.getId()); + } + + @Override + public void register() { + register(new ZoneBorders(3222, 3364, 3234, 3375)); + try { + new DarkWizardNPC().newInstance(null); + new DelrithNPC().newInstance(null); + new DelrithDialoguePlugin().init(); + new DenathDialogue().init(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + /** + * Handles the dark wizard npc. + * @author 'Vexia + */ + public static class DarkWizardNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] IDS = { 4658 }; + + /** + * Constructs a new {@code DarkWizardNPC} {@code Object}. + */ + public DarkWizardNPC() { + super(0, null); + } + + /** + * Constructs a new {@code DarkWizardNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private DarkWizardNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DarkWizardNPC(id, location); + } + + @Override + public void init() { + super.init(); + this.getSkills().setLevel(Skills.MAGIC, 11); + this.setRespawn(false); + } + + @Override + public void tick() { + super.tick(); + getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(4)); + getProperties().getCombatPulse().setStyle(CombatStyle.MAGIC); + } + + @Override + public int[] getIds() { + return IDS; + } + + } + + /** + * Handles the delrith NPC. + * @author 'Vexia + */ + public class DelrithNPC extends AbstractNPC {// 65, 64 + + /** + * The NPC ids of NPCs using this plugin. + */ + private final int[] IDS = { WEAKENED_DELRITH, DELRITH }; + + /** + * Constructs a new {@code DarkWizardNPC} {@code Object}. + */ + public DelrithNPC() { + super(0, null); + } + + /** + * Constructs a new {@code DarkWizardNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private DelrithNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DelrithNPC(id, location); + } + + @Override + public void init() { + super.init(); + } + + @Override + public void finalizeDeath(final Entity killer) { + if (getId() == DELRITH) { + setAttribute("disable:drop", true); + super.finalizeDeath(killer); + super.setRespawnTick(-1); + super.getWalkingQueue().reset(); + super.getLocks().lockMovement(10); + transform(WEAKENED_DELRITH); + getProperties().setTeleportLocation(null); + lock(); + } else { + super.finalizeDeath(killer); + } + } + + @Override + public void tick() { + super.tick(); + } + + @Override + public int[] getIds() { + return IDS; + } + + @Override + public int getWalkRadius() { + return 3; + } + } + + /** + * Represents the dialogue for delrith. + * @author 'Vexia + * @version 1.0 + */ + public static final class DelrithDialoguePlugin extends DialoguePlugin { + + /** + * Represents the word array. + */ + private static final String[] WORDS = new String[] { "Carlem", "Aber", "Camerinthum", "Purchai", "Gabindo" }; + + /** + * Represents the incantationc ounter. + */ + private int counter = 0; + + /** + * Represents the cutscene. + */ + private DemonSlayerCutscene cutscene; + + /** + * Represents the string builder. + */ + private StringBuilder incantation = new StringBuilder(); + + /** + * Constructs a new {@code DelrithDialoguePlugin} {@code Object}. + */ + public DelrithDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DelrithDialoguePlugin} {@code Object}. + * @param player the player. + */ + public DelrithDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DelrithDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + cutscene = player.getAttribute("cutscene", null); + player("Now what was that incantation again?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select a word", WORDS); + stage = 1; + break; + case 1: + switch (buttonId) { + default: + String text = ((String) WORDS[buttonId - 1]) + (counter != 4 ? "..." : "!"); + if (text.contains("!")) { + incantation.append(text.replace("!", "")); + } else { + incantation.append(text + " "); + } + player.sendChat(text); + player(text); + if (counter == 4) { + if (incantation.toString().equals(DemonSlayer.getIncantation(player).trim())) { + stage = 4; + } else { + stage = 2; + } + } else { + stage = 0; + } + break; + } + counter++; + break; + case 2: + cutscene.delrith.reTransform(); + cutscene.delrith.animate(new Animation(4620)); + cutscene.delrith.unlock(); + interpreter.sendDialogue("The vortex collapses. That was the wrong incantation."); + stage = 3; + break; + case 3: + end(); + break; + case 4: + interpreter.sendPlainMessage(true, "Delrith is sucked into the vortex..."); + cutscene.delrith.animate(new Animation(4624)); + player.lock(); + GameWorld.getPulser().submit(new Pulse(10) { + @Override + public boolean pulse() { + cutscene.delrith.clear(); + interpreter.sendDialogue("...back into the dark dimension from which he came."); + player.unlock(); + cutscene.end(); + cutscene.delrith.clear(); + player.getConfigManager().set(222, 5653570, true); + player.getQuestRepository().getQuest("Demon Slayer").finish(player); + end(); + return true; + } + + }); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8427322 }; + } + } + + /** + * Represents the dialogue which handles the denath NPC. + * @author 'Vexia + * @version 1.0 + */ + public static final class DenathDialogue extends DialoguePlugin { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(4623); + + /** + * Represents the cutscene plugin. + */ + public DemonSlayerCutscene cutscene; + + /** + * Constructs a new {@code DenathDialogue} {@code Object}. + */ + public DenathDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DenathDialogue} {@code Object}. + * @param player the player. + */ + public DenathDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DenathDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = ((NPC) args[0]); + cutscene = ((DemonSlayerCutscene) args[1]); + npc("Arise, O mighty Delrith! Bring destruction to this soft,", "weak city!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(cutscene.getNPCS().get(0), null, "Arise, Delrith!"); + for (NPC n : cutscene.getNPCS()) { + n.sendChat("Arise, Delrith!"); + } + stage = 1; + break; + case 1: + player.getProperties().setTeleportLocation(cutscene.getBase().transform(28, 35, 0)); + cutscene.stoneTable = new GameObject(17437, cutscene.getBase().transform(27, 41, 0)); + ObjectBuilder.add(cutscene.stoneTable); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() - 1, player.getLocation().getY() + 2, 380, 1, 98)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 19, player.getLocation().getY() - 55, 380, 1, 98)); + interpreter.sendPlainMessage(true, "The wizards cast an evil spell..."); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 0; + + @SuppressWarnings("deprecation") + @Override + public boolean pulse() { + switch (counter++) { + case 5: + cutscene.delrith = NPC.create(DemonSlayerCutscene.DELRITH, cutscene.getBase().transform(27, 40, 0)); + cutscene.delrith.init(); + cutscene.delrith.animate(ANIMATION); + player.getProperties().setTeleportLocation(cutscene.getBase().transform(26, 48, 0)); + player.setLocation(cutscene.getBase().transform(26, 48, 0)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() - 1, player.getLocation().getY() - 3, 390, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 30, player.getLocation().getY() - 55, 390, 1, 100)); + player.getConfigManager().set(222, 14194946, true); + ObjectBuilder.replace(cutscene.stoneTable, cutscene.stoneTable.transform(17438)); + npc("Ha ha ha! At last you are free, my demonic brother!", "Rest now, and then have your revenge on this pitiful", "city!"); + stage = 2; + return true; + } + return false; + } + }); + break; + case 2: + interpreter.sendDialogues(cutscene.getNPCS().get(0), null, "Who's that?"); + for (NPC n : cutscene.getNPCS()) { + n.animate(new Animation(-1)); + n.face(player); + } + stage = 3; + break; + case 3: + npc = cutscene.getNPCS().get(2); + npc("Noo! Not Silverlight! Delrith is not ready yet!"); + stage = 4; + break; + case 4: + npc("I've got to get out of here..."); + npc.faceLocation(null); + npc.face(null); + Path path = Pathfinder.find(npc, cutscene.getBase().transform(18, 40, 0)); + path.walk(npc); + stage = 5; + break; + case 5: + player.getProperties().setTeleportLocation(cutscene.getBase().transform(24, 42, 0)); + npc.clear(); + cutscene.getNPCS().remove(npc); + end(); + cutscene.delrith.moveStep(); + cutscene.delrith.setWalks(true); + player.unlock(); + player.getInterfaceManager().restoreTabs(); + player.getInterfaceManager().close(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, player.getLocation().getX(), player.getLocation().getY(), 390, 1, 100)); + for (NPC n : cutscene.getNPCS()) { + n.clear(); + } + cutscene.getNPCS().clear(); + final Location base = cutscene.getBase(); + cutscene.getNPCS().add(NPC.create(4658, base.transform(29, 40, 0))); + cutscene.getNPCS().add(NPC.create(4658, base.transform(26, 40, 0))); + cutscene.getNPCS().add(NPC.create(4658, base.transform(26, 43, 0))); + for (NPC n : cutscene.getNPCS()) { + n.init(); + n.setWalks(true); + n.unlock(); + } + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 0, 0)); + cutscene.getNPCS().get(0).getProperties().getCombatPulse().attack(player); + player.setAttribute("cutscene", cutscene); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4662 }; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.java new file mode 100644 index 000000000..d23e7a767 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/DemonSlayerPlugin.java @@ -0,0 +1,117 @@ +package core.game.content.quest.free.demonslayer; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the demon slayer plugin used to handle relative node interactions. + * @author 'Vexia + * @date 3/1/14 + */ +public final class DemonSlayerPlugin extends OptionHandler { + + /** + * Represents the object id of the drain. + */ + public static final int DRAIN_ID = 17424; + + /** + * Represents the location of the lumbridge sewers. + */ + private static final Location SEWER_LOCATION = new Location(3237, 9858, 0); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(881).getHandlers().put("option:open", this); + ObjectDefinition.forId(882).getHandlers().put("option:close", this); + ObjectDefinition.forId(882).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(DRAIN_ID).getHandlers().put("option:search", this); + ObjectDefinition.forId(17429).getHandlers().put("option:take", this); + NPCDefinition.forId(DemonSlayerCutscene.DELRITH).getHandlers().put("option:attack", this); + NPCDefinition.forId(DemonSlayerCutscene.WEAKENED_DELRITH).getHandlers().put("option:banish", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Demon Slayer"); + final int id = node instanceof GameObject ? ((GameObject) node).getId() : node instanceof Item ? ((Item) node).getId() : ((NPC) node).getId(); + switch (id) { + case 880: + player.getDialogueInterpreter().open(8427322); + break; + case 879: + if (!player.getEquipment().containsItem(DemonSlayer.SILVERLIGHT)) { + player.getPacketDispatch().sendMessage("I'd better wield Silverlight first."); + return true; + } + player.face(((NPC) node)); + player.getPulseManager().clear("interaction:attack:" + node.hashCode()); + player.getProperties().getCombatPulse().attack(node); + return true; + case DRAIN_ID: + if (quest.getStage(player) == 20) { + player.getDialogueInterpreter().open(883, 883, "key"); + return true; + } else { + player.sendMessage("You search the castle drain and find nothing of value."); + } + return true; + case 881: + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(882)); + break; + case 882: + switch (option) { + case "climb-down": + if (node.getLocation().equals(new Location(3237, 3458, 0))) { + ClimbActionHandler.climb(player, new Animation(828), SEWER_LOCATION); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + } + break; + case "close": + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(881)); + break; + } + break; + case 17429: + if (quest.getStage(player) == 20 && player.getInventory().add(DemonSlayer.FIRST_KEY)) { + player.getConfigManager().set(222, 4757762, true); + player.removeAttribute("demon-slayer:poured"); + player.removeAttribute("demon-slayer:just-poured"); + player.getDialogueInterpreter().sendItemMessage(DemonSlayer.FIRST_KEY.getId(), "You pick up an old rusty key."); + } else { + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return true; + } + } + break; + } + return true; + } + + @Override + public Location getDestination(final Node node, final Node n) { + if (n instanceof NPC) { + return n.getLocation().transform(2, 0, 0); + } + if (n.getId() == DRAIN_ID) { + return Location.create(3226, 3496, 0); + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/GypsyArisDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/GypsyArisDialogue.java new file mode 100644 index 000000000..b80f08ee2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/GypsyArisDialogue.java @@ -0,0 +1,672 @@ +package core.game.content.quest.free.demonslayer; + +import core.game.component.Component; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; + +/** + * Represents the dialogue which handles the transcript for the gypsy aris. + * @author 'Vexia + * @version 1.0 + */ +public final class GypsyArisDialogue extends DialoguePlugin { + + /** + * Represents the coins to remove. + */ + private static final Item COINS = new Item(995, 1); + + /** + * Represents the animation used to look into a crystal ball. + */ + private static final Animation ANIMATION = new Animation(4615); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Represents the wally npc. + */ + private NPC wally; + + /** + * Represents the cutscene plugin instance. + */ + private CutscenePlugin cutscene; + + /** + * Constructs a new {@code GypsyArisDialogue} {@code Object}. + */ + public GypsyArisDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GypsyArisDialogue} {@code Object}. + * @param player the player. + */ + public GypsyArisDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GypsyArisDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Demon Slayer"); + switch (quest.getStage(player)) { + case 100: + npc("Greetings young one."); + stage = 0; + break; + case 30: + case 10: + case 20: + if (args.length > 1) { + npc("Delrith will come forth from the stone circle again."); + stage = 200; + return true; + } + npc("Greetings. How goes the quest?"); + if (quest.getStage(player) != 30) { + stage = 1; + } else { + stage = 0; + } + break; + case 0: + if (args.length > 1) { + cutscene = ((CutscenePlugin) args[1]); + npc("Wally managed to arrive at the stone circle just as", "Delrith was summoned by a cult of chaos druids..."); + stage = 200; + return true; + } + npc("Hello young one."); + stage = 1; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 100: + switch (stage) { + case 0: + npc("You're a hero now. That was a good bit of", "demonslaying."); + stage = 1; + break; + case 1: + player("Thanks."); + stage = 2; + break; + case 2: + end(); + break; + } + break; + case 30: + switch (stage) { + case 0: + player("I have the sword now. I just need to kill the demon, I", "think."); + stage = 1; + break; + case 1: + npc("Yep, that's right."); + stage = 2; + break; + case 2: + options("What is the magical incantation?", "Well I'd better press on with it", "Where can I find the demon?"); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("What is the magical incantation?"); + stage = 10; + break; + case 2: + player("Well I'd better press on with it."); + stage = 20; + break; + case 3: + player("Where can I find the demon?"); + stage = 30; + break; + } + break; + case 10: + npc(DemonSlayer.getIncantation(player) + "."); + stage = 11; + break; + case 11: + player("Well I'd better press on with it."); + stage = 20; + break; + case 20: + npc("See you anon."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + npc("Just head south and you should find the stone circle", "just outside the city gate."); + stage = 31; + break; + case 31: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + player("I found Sir Prysin. Unfortunately I haven't got the", "sword yet. He's made it complicated for me."); + stage = 1; + break; + case 1: + npc("Ok, hurry, we haven't much time."); + stage = 2; + break; + case 2: + options("What is the magical incantation?", "Well I'd better press on with it."); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("What is the magical incantation?"); + stage = 10; + break; + case 2: + player("Well I'd better press on with it."); + stage = 20; + break; + } + break; + case 10: + npc(DemonSlayer.getIncantation(player) + "."); + stage = 11; + break; + case 11: + player("Well I'd better press on with it."); + stage = 20; + break; + case 20: + player("See you anon."); + stage = 21; + break; + case 21: + end(); + break; + } + break; + case 10: + switch (stage) { + case 1: + player("I'm still working on it."); + stage = 2; + break; + case 2: + npc("Well if you need any advice I'm always here, young", "one."); + stage = 3; + break; + case 3: + options("What is the magical incantation?", "Where can I find Silverlight?", "Stop calling me that!", "Well I'd better press on with it."); + stage = 4; + break; + case 4: + switch (buttonId) { + case 1: + player("What is the magical incantation?"); + stage = 10; + break; + case 2: + player("Where can I find Silverlight?"); + stage = 20; + break; + case 3: + player("Stop calling me that!"); + stage = 30; + break; + case 4: + player("Well I'd better press on with it."); + stage = 40; + break; + } + break; + case 10: + npc("Oh yes, let me think a second..."); + stage = 11; + break; + case 11: + npc("Alright, I think I've got it now, it goes..."); + stage = 12; + break; + case 12: + npc(DemonSlayer.getIncantation(player) + ".", "Have you got that?"); + stage = 13; + break; + case 13: + player("I think so, yes."); + stage = 14; + break; + case 14: + end(); + break; + case 20: + npc("Silverlight has been passed down through Wally's", "descendants. I believe it is currently in the care of one", "of the King's knights called Sir Prysin."); + stage = 21; + break; + case 21: + npc("He shouldn't be too hard to find. He lives in the royal", "palace in this city. Tell him Gypsy Aris sent you."); + stage = 22; + break; + case 22: + end(); + break; + case 30: + npc("In the scheme of things you are very young."); + stage = 31; + break; + case 31: + end(); + break; + case 40: + npc("See you anon."); + stage = 41; + break; + case 41: + end(); + break; + case 200: + npc("I would imagine an evil sorcerer is already starting on", "the rituals to summon Delrith as we speak."); + stage = 201; + break; + case 201: + options("How am I meant to fight a demon who can destroy cities?", "Okay, where is he? I'll kill him for you!", "What is the magical incantation?", "Where can I find Silverlight?"); + stage = 202; + break; + case 202: + switch (buttonId) { + case 1: + player("How am I meant to fight a demon who can destroy ", "cities?!"); + stage = 110; + break; + case 2: + player("Okay, where is he? I'll kill him for you!"); + stage = 120; + break; + case 3: + player("What is the magical incantation?"); + stage = 10; + break; + case 4: + player("Where can I find Silverlight?"); + stage = 20; + break; + } + break; + case 120: + npc("Ah, the overconfidence of the young!"); + stage = 121; + break; + case 121: + npc("Delrith can't be harmed by ordinary weapons. You", "must face him using the same weapon that Wally used."); + stage = 201; + break; + case 110: + npc("If you face Delrith while he is still weak from being", "summoned, and use the correct weapon, you will not", "find the task to arduous."); + stage = 111; + break; + case 111: + npc("Do not fear. If you follow the path of the great hero", "Wally, then you are sure to defeat the demon."); + stage = 201; + break; + } + break; + case 0: + switch (stage) { + case 1: + npc("Cross my palm with silver and the future will be", "revealed to you."); + stage = 2; + break; + case 2: + options("Ok, here you go.", "Who are you calling young one?!", "No, I don't believe in that stuff.", "With silver?"); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("Ok, here you go."); + stage = 10; + break; + case 2: + player("Who are you calling young one?!"); + stage = 20; + break; + case 3: + player("No, I don't believe in that stuff."); + stage = 30; + break; + case 4: + player("With silver?"); + stage = 40; + break; + } + break; + case 10: + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (player.getInventory().remove(COINS)) { + npc("Come closer, and listen carefully to what the future", "holds for you, as I peer int the swirling mists of the", "crystal ball."); + npc.animate(ANIMATION); + stage = 12; + } else { + player("Sorry, I don't seem to have enough coins."); + stage = 11; + } + break; + case 11: + end(); + break; + case 12: + npc("I can see images forming. I can see you."); + stage = 13; + break; + case 13: + npc("You are holding a very impressive looking sword. I'm", "sure I recognize that sword..."); + stage = 14; + break; + case 14: + npc("There is a big dark shadow appearing now."); + stage = 15; + break; + case 15: + npc("Aargh!"); + stage = 16; + break; + case 16: + player("Are you all right?"); + stage = 17; + break; + case 17: + npc("It's Delrith! Delrith is coming!"); + stage = 18; + break; + case 18: + player("Who's Delrith?"); + stage = 50; + break; + case 50: + npc("Delrith..."); + stage = 51; + break; + case 51: + npc("Delrith is a powerful demon."); + stage = 52; + break; + case 52: + npc("Oh! I really hope he didn't see me looking at him", "through my crystal ball!"); + stage = 53; + break; + case 53: + npc("He tried to destroy this city 150 years ago. He was", "stopped just in time by the great hero Wally."); + stage = 54; + break; + case 54: + npc("Using his magic sword Silverlight, Wally managed to", "trap the demon in the stone circle just south", "of this city."); + stage = 55; + break; + case 55: + npc("Ye gods! Silverlight was the sword you were holding in", "my vision! You are the one destined to stop the demon", "this time."); + stage = 56; + break; + case 56: + options("How am I meant to fight a demon who can destroy cities?", "Okay, where is he? I'll kill him for you!", "Wally doesn't sound like a very heroic name."); + stage = 57; + break; + case 57: + switch (buttonId) { + case 1: + player("How am I meant to fight a demon who can destroy ", "cities?!"); + stage = 110; + break; + case 2: + player("Okay, where is he? I'll kill him for you!"); + stage = 120; + break; + case 3: + player("Wally doesn't sound like a very heroic name."); + stage = 130; + break; + } + break; + case 110: + npc("If you face Delrith while he is still weak from being", "summoned, and use the correct weapon, you will not", "find the task to arduous."); + stage = 111; + break; + case 111: + npc("Do not fear. If you follow the path of the great hero", "Wally, then you are sure to defeat the demon."); + stage = 112; + break; + case 112: + options("Okay, where is he? I'll kill him for you!", "Wally doesn't sound like a very heroic name.", "So how did Wally kill Delrith?"); + stage = 113; + break; + case 113: + switch (buttonId) { + case 1: + player("Okay, where is he? I'll kill him for you!"); + stage = 120; + break; + case 2: + player("Wally doesn't sound like a very heroic name."); + stage = 130; + break; + case 3: + player("So how did Wally kill Delrith?"); + stage = 180; + break; + } + break; + case 120: + npc("Ah, the overconfidence of the young!"); + stage = 121; + break; + case 121: + npc("Delrith can't be harmed by ordinary weapons. You", "must face him using the same weapon that Wally used."); + stage = 122; + break; + case 122: + options("How am I meant to fight a demon who can destroy cities?", "Wally doesn't sound like a very heroic name.", "So how did wally kill Delrith?"); + stage = 123; + break; + case 123: + switch (buttonId) { + case 1: + player("How am I meant to fight a demon who can destroy ", "cities?!"); + stage = 110; + break; + case 2: + player("Wally doesn't sound like a very heroic name."); + stage = 130; + break; + case 3: + player("So how did Wally kill Delrith?"); + stage = 180; + break; + } + break; + case 130: + npc("Yes I know. Maybe this is why history doesn't", "remember him. However he was a very great hero."); + stage = 131; + break; + case 131: + npc("Who knows how much pain and suffering Delrith would", "have brought forth without Wally to stop him!"); + stage = 132; + break; + case 132: + npc("It looks like you are going to need to perform similar", "heroics."); + stage = 133; + break; + case 133: + options("How am I meant to fight a demon who can destroy cities?", "Okay, where is he? I'll kill him for you!", "So how did Wally kill Delrith?"); + stage = 134; + break; + case 134: + switch (buttonId) { + case 1: + player("How am I meant to fight a demon who can destroy ", "cities?!"); + stage = 110; + break; + case 2: + player("Okay, where is he? I'll kill him for you!"); + stage = 120; + break; + case 3: + player("So how did Wally kill Delrith?"); + stage = 180; + break; + } + break; + case 180: + ActivityManager.start(player, "Wally cutscene", false); + end(); + break; + case 20: + npc("You have been on this world a relatively short time. At", "least compared to me."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + npc("Ok suit yourself."); + stage = 31; + break; + case 31: + end(); + break; + case 40: + npc("Oh, sorry, I forgot. With gold, I mean. They haven't", "used silver coins since before you were born! So, do", "you want your fortune told?"); + stage = 41; + break; + case 41: + options("Ok, here you go.", "No, I don't believe in that stuff."); + stage = 42; + break; + case 42: + switch (buttonId) { + case 1: + player("Ok, here you go."); + stage = 10; + break; + case 2: + player("No, I don't believe in that stuff."); + stage = 30; + break; + } + break; + case 200:// Wally cutscene dialogue. + wally = NPC.create(4664, cutscene.getBase().transform(31, 40, 0)); + wally.setDirection(Direction.WEST); + cutscene.getNPCS().add(wally); + wally.init(); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 2, player.getLocation().getY() + 2, 260, 1, 10)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 190, player.getLocation().getY() + 14, 260, 1, 10)); + interpreter.sendDialogues(wally, FacialExpression.FURIOUS, "Die, foul demon!"); + GameWorld.getPulser().submit(new Pulse(5) { + @Override + public boolean pulse() { + wally.animate(new Animation(4603)); + return true; + } + }); + stage = 201; + break; + case 201: + interpreter.sendDialogues(wally, null, "Now, what was that incantation again?"); + stage = 202; + break; + case 202: + interpreter.sendDialogues(wally, null, DemonSlayer.generateIncantation(player) + "!"); + stage = 203; + break; + case 203: + close(); + player.getInterfaceManager().openOverlay(new Component(115)); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.getProperties().setTeleportLocation(cutscene.getBase().transform(25, 36, 0)); + break; + case 3: + wally.setDirection(Direction.SOUTH_WEST); + wally.getProperties().setTeleportLocation(cutscene.getBase().transform(28, 40, 0)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX(), player.getLocation().getY(), 440, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 1, player.getLocation().getY() + 1, 440, 1, 100)); + case 4: + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().close(); + wally.animate(new Animation(4604)); + interpreter.sendDialogues(wally, null, "I am the greatest demon slayer EVER!"); + stage = 204; + break; + case 5: + wally.animate(new Animation(4604)); + return true; + } + return false; + } + }); + break; + case 204: + npc("By reciting the correct magical incantation, and", "thrusting Silverlight into Delrith while he was newly", "summoned, Wally was able to imprison Delrith in the", "stone block in the centre of the circle."); + stage = 205; + break; + case 205: + cutscene.stop(true); + close(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 882 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/SirPyrsinDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/SirPyrsinDialogue.java new file mode 100644 index 000000000..273c5acda --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/SirPyrsinDialogue.java @@ -0,0 +1,512 @@ +package core.game.content.quest.free.demonslayer; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the dialogue which handles the Sir Prysin NPC. + * @author Vexia + * @date 3/1/13 + */ +public class SirPyrsinDialogue extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Represents the current npc id. + */ + private int id; + + /** + * Constructs a new {@code SirPyrsinDialogue} {@code Object}. + */ + public SirPyrsinDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SirPyrsinDialogue} {@code Object}. + * @param player the player. + */ + public SirPyrsinDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirPyrsinDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args[0] instanceof NPC) { + npc = (NPC) args[0]; + id = npc.getId(); + } else if (args[0] instanceof Integer) { + id = ((int) args[0]); + } + quest = player.getQuestRepository().getQuest("Demon Slayer"); + switch (quest.getStage(player)) { + case 30: + npc(id, "Have you sorted that demon out yet?"); + stage = 0; + break; + case 20: + if (args.length > 1) { + player("That must be the key Sir Prysin dropped."); + stage = 800; + return true; + } + npc(id, "So how are you doing with getting the keys?"); + stage = 0; + break; + default: + npc(id, "Hello, who are you?"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 30: + switch (stage) { + case 0: + if (!player.getInventory().containsItem(DemonSlayer.SILVERLIGHT) && !player.getBank().containsItem(DemonSlayer.SILVERLIGHT) && !player.getEquipment().containsItem(DemonSlayer.SILVERLIGHT)) { + player("Not yet. And I, um, lost Silverlight."); + stage = 1; + } else { + player("No, not yet."); + stage = 3; + } + break; + case 1: + if (player.getInventory().add(DemonSlayer.SILVERLIGHT)) { + npc(id, "Yes, I know, someone returned it to me. Take better", "care of it this time."); + stage = 2; + } + break; + case 2: + end(); + break; + case 3: + npc(id, "Well get on with it. He'll be pretty powerful when he", "gets to full strength."); + stage = 4; + break; + case 4: + end(); + break; + case 302: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + if (player.getInventory().containsItem(DemonSlayer.FIRST_KEY) && player.getInventory().containsItem(DemonSlayer.SECOND_KEY) && player.getInventory().containsItem(DemonSlayer.THIRD_KEY)) { + player("I've got all three keys!"); + stage = 300; + } else { + player("I haven't found them all yet."); + stage = 1; + } + break; + case 1: + options("Can you remind me where all the keys were again?", "I'm still looking."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Can you remind me where all the keys were again?"); + stage = 62; + break; + case 2: + player("I'm still looking."); + stage = 20; + break; + } + break; + case 20: + npc(id, "Ok, tell me when you've got them all."); + stage = 21; + break; + case 21: + end(); + break; + case 62: + npc(id, "I kept one of the keys. I gave the other two to other", "people for safe keeping."); + stage = 63; + break; + case 63: + npc(id, "One I gave to Rovin, the captain of the palace guard."); + stage = 64; + break; + case 64: + npc(id, "I gave the other to the wizard Traiborn."); + stage = 65; + break; + case 65: + end(); + break; + case 300: + npc(id, "Excellent! Now I can give you Silverlight."); + stage = 301; + break; + case 301: + if (player.getInventory().freeSlots() == 0) { + npc(id, "You don't have any inventory space for Silverlight."); + stage = 302; + return true; + } + close(); + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.getProperties().setTeleportLocation(Location.create(3204, 3470, 0)); + if (!npc.getLocation().equals(Location.create(3204, 3469, 0))) { + npc.getProperties().setTeleportLocation(Location.create(3204, 3469, 0)); + } + npc.lock(); + npc.getWalkingQueue().reset(); + npc.getPulseManager().clear(); + npc.faceLocation(Location.create(3204, 3468, 0)); + player.face(npc); + break; + case 2: + npc.animate(new Animation(4597)); + break; + case 9: + player.getConfigManager().set(222, 5653570, true); + player.setAttribute("/save:demon-slayer:received", true); + npc.animate(new Animation(4607)); + break; + case 10: + npc.transform(4657); + break; + case 11: + npc.faceLocation(player.getLocation()); + break; + case 12: + npc.transform(883); + if (player.getInventory().remove(DemonSlayer.FIRST_KEY, DemonSlayer.SECOND_KEY, DemonSlayer.THIRD_KEY)) { + if (player.getInventory().add(DemonSlayer.SILVERLIGHT)) { + npc.animate(new Animation(4608)); + player.animate(new Animation(4604)); + quest.setStage(player, 30); + } + } + break; + case 13: + npc.getWalkingQueue().reset(); + npc.unlock(); + interpreter.sendItemMessage(DemonSlayer.SILVERLIGHT.getId(), "Sir Prysin hands you a very shiny sword."); + stage = 302; + player.unlock(); + return true; + } + return false; + } + }); + break; + case 302: + end(); + break; + case 800: + player("I don't seem to be able to reach it. I wonder if I can", "dislodge it somehow. That way it may go down into the", "sewers."); + stage = 801; + break; + case 801: + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + options("I am a mighty adventurer. Who are you?", "I'm not sure, I was hoping you could tell me.", "Gypsy Aris said I should come and talk to you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + case 2: + handleDefault(buttonId); + break; + case 3: + player("Gypsy Aris said I should come and talk to you."); + stage = 2; + break; + } + break; + case 2: + npc(id, "Gypsy Aris? Is she still alive? I remember her from", "when I was pretty young. Well what do you need to", "talk to me about?"); + stage = 3; + break; + case 3: + options("I need to find the Silverlight.", "Yes, she is still alive."); + stage = 4; + break; + case 4: + switch (buttonId) { + case 1: + player("I need to find the Silverlight."); + stage = 40; + break; + case 2: + player("Yes, she is still alive. She lives right outside the castle!"); + stage = 50; + break; + } + break; + case 40: + npc(id, "What do you need to find that for?"); + stage = 41; + break; + case 41: + player("I need it to fight Delrith."); + stage = 42; + break; + case 42: + npc(id, "Delrith? I thought the world was rid of him, thanks to", "my great-grandfather."); + stage = 43; + break; + case 43: + options("Well, the gypsy's crystal ball seems to think otherwise.", "He's back and unfortunately I've got to deal with him."); + stage = 44; + break; + case 44: + switch (buttonId) { + case 1: + player("Well the gypsy's crystal ball seems to think otherwise."); + stage = 45; + break; + case 2: + player("He's back and unfortunately I've got to deal with him."); + stage = 48; + break; + } + break; + case 45: + npc(id, "Well if the ball says so, I'd better help you."); + stage = 46; + break; + case 46: + npc(id, "The problem is getting Silverlight."); + stage = 47; + break; + case 47: + player("You mean you don't have it?"); + stage = 60; + break; + case 48: + npc(id, "You don't look up to much. I suppose Silverlight may be", "good enough to carry you though though."); + stage = 46; + break; + case 60: + npc(id, "Oh I do have it, but it is so powerful that the king", "made me put it in a special box which needs three", "different keys to open it. That way it won't fall into the", "wrong hands."); + stage = 61; + break; + case 61: + player("And why is this a problem?"); + stage = 62; + break; + case 62: + npc(id, "I kept one of the keys. I gave the other two to other", "people for safe keeping."); + stage = 63; + break; + case 63: + npc(id, "One I gave to Rovin, the captain of the palace guard."); + stage = 64; + break; + case 64: + npc(id, "I gave the other to the wizard Traiborn."); + stage = 65; + break; + case 65: + player("Can you give me your key?"); + stage = 66; + break; + case 66: + npc(id, "Um.... ah...."); + stage = 67; + break; + case 67: + npc(id, "Well there's a problem there as well."); + stage = 68; + break; + case 68: + npc(id, "I managed to drop the key in the drain just outside the", "palace kitchen. It is just inside and I can't reach it."); + stage = 69; + break; + case 69: + player("So what does the drain lead to?"); + stage = 70; + break; + case 70: + npc(id, "It is the drain for the drainpipe running from the sink", "in the kitchen down to the palace sewers."); + stage = 71; + break; + case 71: + options("Where can I find Captain Rovin?", "Where does the wizard live?", "Well I'd better go key hunting."); + stage = 72; + break; + case 72: + switch (buttonId) { + case 1: + player("Where can I find Captain Rovin?"); + stage = 110; + break; + case 2: + player("Where does the wizard live?"); + stage = 120; + break; + case 3: + player("Well I'd better go key hunting."); + stage = 130; + break; + } + break; + case 130: + npc(id, "Ok, goodbye."); + stage = 131; + break; + case 131: + quest.setStage(player, 20); + end(); + break; + case 120: + npc(id, "Wizard Traiborn?"); + stage = 121; + break; + case 121: + npc(id, "He is one of the wizards who lives in the tower on the", "little island just south coast. I believe his", "quarters are on the first floor of the tower."); + stage = 122; + break; + case 122: + options("Where can I find Captain Rovin?", "Well I'd better go key hunting."); + stage = 123; + break; + case 123: + switch (buttonId) { + case 1: + player("Where can I find Captain Rovin?"); + stage = 110; + break; + case 2: + player("Well I'd better go key hunting."); + stage = 130; + break; + } + break; + case 110: + npc(id, "Captain Rovin lives at the top of the guards' quarters in", "the north-west wing of this palace."); + stage = 111; + break; + case 111: + options("Can you give me your key?", "Where does the wizard live?", "Well I'd better go key hunting."); + stage = 112; + break; + case 112: + switch (buttonId) { + case 1: + player("Can you give me your key?"); + stage = 66; + break; + case 2: + player("Where does the wizard live?"); + stage = 120; + break; + case 3: + player("Well I'd better go key hunting."); + stage = 130; + break; + } + break; + case 50: + npc(id, "Oh , is that the same gypsy? I would have thought she", "would have died by now. She was pretty old when I", "was a lad."); + stage = 51; + break; + case 51: + npc(id, "Anyway, what can I do for you?"); + stage = 52; + break; + case 52: + player("I need to find the Silverlight."); + stage = 40; + break; + default: + handleDefault(buttonId); + break; + } + break; + default: + handleDefault(buttonId); + break; + } + return true; + } + + /** + * Method used to handle default chat. + * @param buttonId the button id. + */ + private final void handleDefault(int buttonId) { + switch (stage) { + case 0: + options("I am a mighty adventurer. Who are you?", "I'm not sure, I was hoping you could tell me."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("I am a mighty adventurer, Who are you?"); + stage = 10; + break; + case 2: + player("I'm not sure, I was hoping you could tell me."); + stage = 20; + break; + } + break; + case 10: + npc(id, "I am Sir Prysin. A bold and famous knight of the", "realm."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc(id, "Well I've never met you before."); + stage = 21; + break; + case 21: + end(); + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 883, 4657 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/TraibornDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/TraibornDialogue.java new file mode 100644 index 000000000..d3b293b0a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/TraibornDialogue.java @@ -0,0 +1,392 @@ +package core.game.content.quest.free.demonslayer; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the dialogue used to handle the Traiborn NPC. + * @author 'Vexia + * @date 3/1/14 + */ +public class TraibornDialogue extends DialoguePlugin { + + /** + * Represents the bones item. + */ + private static final Item[] BONES = {new Item(526, 25), new Item(2530, 25)}; + + /** + * Represents the animation of giving the key. + */ + private static final Animation ANIMATION = new Animation(536); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code TraibornDialogue} {@code Object}. + */ + public TraibornDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TraibornDialogue} {@code Object}. + * @param player the player. + */ + public TraibornDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TraibornDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Demon Slayer"); + switch (quest.getStage(player)) { + case 20: + if (player.getAttribute("demon-slayer:traiborn", false)) { + npc("How are you doing finding bones?"); + stage = 380; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ello young thingummywut."); + stage = 0; + } + break; + default: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ello young thingummywut."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 20: + switch (stage) { + case 0: + if (player.getInventory().containsItem(DemonSlayer.THIRD_KEY) && player.getBank().containsItem(DemonSlayer.THIRD_KEY)) { + options("What's a thingummywut?", "Teach me to be a mighty powerful wizard."); + stage = 1; + } else { + options("What's a thingummywut?", "Teach me to be a mighty powerful wizard.", "I need to get a key given to you by Sir Prysin."); + stage = 1; + } + break; + case 1: + switch (buttonId) { + case 1: + case 2: + handleDefault(buttonId); + break; + case 3: + player("I need to get a key given to you by Sir Prysin."); + stage = 300; + break; + } + break; + case 300: + npc("Sir Prysin? Who's that? What would I want his key", "for?"); + stage = 301; + break; + case 301: + player("Well, have you got any keys knocking around?"); + stage = 302; + break; + case 302: + npc("Now you come to mention it, yes I do have a key. It's", "in my special closet of valuable stuff. Now how do I get", "into that?"); + stage = 303; + break; + case 303: + npc("I sealed it using one of my magic rituals. So it would", "makes sense that another ritual would open it again."); + stage = 304; + break; + case 304: + player("So do you know what ritual to use?"); + stage = 305; + break; + case 305: + npc("Let me think a second."); + stage = 306; + break; + case 306: + npc("Yes a simple drazier style ritual should suffice. Hmm,", "main problem with that is I'll need 25 sets of bones.", "Now where am I going to get hold of something like", "that?"); + stage = 307; + break; + case 307: + options("Hmm, that's too bad. I really need that key.", "I'll get the bones for you."); + stage = 308; + break; + case 308: + switch (buttonId) { + case 1: + player("Hmm, that's too bad. I really need that key."); + stage = 330; + break; + case 2: + player("I'll get the bones for you."); + stage = 340; + break; + } + break; + case 330: + npc("Ah well, sorry I couldn't be any more help."); + stage = 331; + break; + case 331: + end(); + break; + case 340: + npc("Ooh that would be very good of you."); + stage = 341; + break; + case 341: + player("Ok I'll speak to you when I've got some bones."); + stage = 342; + break; + case 342: + player.setAttribute("/save:demon-slayer:traiborn", true); + end(); + break; + case 380: + if (player.getInventory().containsItem(BONES[0]) || player.getInventory().containsItem(BONES[1])) { + player("I have some bones."); + stage = 382; + } else { + player("I don't have all the bones yet."); + stage = 381; + } + break; + case 382: + npc("Give 'em here then."); + stage = 383; + break; + case 383: + interpreter.sendDialogue("You give Traiborn 25 sets of bones."); + stage = 384; + break; + case 384: + npc("Hurrah! That's all 25 sets of bones."); + stage = 385; + break; + case 385: + npc.animate(new Animation(4602)); + npc("Wings of dark and colour too,", "Spreading in the morning dew;", "Locked away I have a key;", "Return it now, please, unto me."); + stage = 386; + break; + case 386: + final GameObject object = new GameObject(17434, Location.create(3113, 3161, 1), 11, 1); + ObjectBuilder.add(object); + npc.faceLocation(object.getLocation()); + npc.animate(ANIMATION); + if (!player.getInventory().containsItem(BONES[0]) && !player.getInventory().containsItem(BONES[1])) { + end(); + return true; + } + if (player.getInventory().remove(BONES[0]) || player.getInventory().remove(BONES[1])) { + player.removeAttribute("demon-slayer:traiborn"); + player.getInventory().add(DemonSlayer.THIRD_KEY); + interpreter.sendItemMessage(DemonSlayer.THIRD_KEY.getId(), "Traiborn hands you a key."); + stage = 387; + } + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 5: + npc.face(player); + break; + case 7: + ObjectBuilder.remove(object); + return true; + } + return false; + } + }); + break; + case 387: + player("Thank you very much."); + stage = 388; + break; + case 388: + npc("Not a problem for a friend of Sir What's-his-face."); + stage = 389; + break; + case 389: + end(); + break; + case 381: + end(); + break; + } + break; + case 0: + switch (stage) { + default: + handleDefault(buttonId); + break; + } + break; + } + return true; + } + + /** + * Method used to handle the default button id. + * @param buttonId the button id. + */ + private final void handleDefault(int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What's a thingummywut?", "Teach me to be a mighty and powerful wizard."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's a thingummywut?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Teach me to be a mighty and powerful wizard."); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A thingummywut? Where? Where?"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Those pesky thingummywuts. They get everywhere.", "They leave a terrible mess too."); + stage = 12; + break; + case 12: + interpreter.sendOptions("Select an Option", "Err you just called me a thingummywut.", "Tell me what they look like and I'll mask 'em."); + stage = 13; + break; + case 13: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Err you just called me thingummywut."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me what they look like and I'll mash 'em."); + stage = 120; + break; + } + break; + case 120: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Don't be ridiculous. No-one has ever seen one."); + stage = 121; + break; + case 121: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "They're invisible, or a myth, or a figment of my", "imagination. Can't remember which right now."); + stage = 122; + break; + case 122: + end(); + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You're a thingummywut? I've never seen one up close", "before. They said I was mad!"); + stage = 101; + break; + case 101: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Now you are my proof! There ARE thingummywuts in", "this tower. Now where can I find a cage big enough to", "keep you?"); + stage = 102; + break; + case 102: + interpreter.sendOptions("Select an Option", "Err I'd better be off really.", "They're right, you are mad."); + stage = 103; + break; + case 103: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Err I'd better be off really."); + stage = 110; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "They're right, you are mad."); + stage = 130; + break; + } + break; + case 130: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That's a pity. I thought maybe they were winding me", "up."); + stage = 131; + break; + case 131: + end(); + break; + case 110: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh ok, have a good time, and watch out for sheep!", "They're more cunning than they look."); + stage = 111; + break; + case 111: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Wizard eh? You don't want any truck with that sort.", "They're not to be trusted. That's what I've heard", "anyways."); + stage = 21; + break; + case 21: + interpreter.sendOptions("Select an Option", "So aren't you a wizard?", "Oh I'd better stop talking to you then."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So aren't you a wizard?"); + stage = 40; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh I'd better stop talking to you then."); + stage = 60; + break; + } + break; + case 60: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Cheerio then. It was nice chatting to you."); + stage = 61; + break; + case 61: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How dare you? Of course I'm a wizard. Now don't be", "so cheeky or I'll turn you into a frog."); + stage = 41; + break; + case 41: + end(); + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 881 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/WallyCutscenePlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/WallyCutscenePlugin.java new file mode 100644 index 000000000..796df85e7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/demonslayer/WallyCutscenePlugin.java @@ -0,0 +1,78 @@ +package core.game.content.quest.free.demonslayer; + +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.repository.Repository; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; + +/** + * Represents the wally cutscene plugin. + * @author 'Vexia + * @date 3/1/14 + */ +public class WallyCutscenePlugin extends CutscenePlugin { + + /** + * Constructs a new {@code WallyCutscenePlugin} {@code Object}. + */ + public WallyCutscenePlugin() { + this(null); + } + + /** + * Constructs a new {@code WallyCutscenePlugin} {@code Object}. + * @param player the player. + */ + public WallyCutscenePlugin(final Player player) { + super("Wally cutscene"); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new WallyCutscenePlugin(p); + } + + @Override + public void open() { + player.lock(); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 2, player.getLocation().getY() + 3, 305, 1, 35)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 10, player.getLocation().getY() + 12, 305, 1, 35)); + player.getDialogueInterpreter().open(882, Repository.findNPC(882), this); + } + + @Override + public void end() { + player.unlock(); + } + + @Override + public void fade() { + player.getQuestRepository().getQuest("Demon Slayer").start(player); + player.getDialogueInterpreter().open(882, Repository.findNPC(882), this); + } + + @Override + public Location getSpawnLocation() { + return Location.create(3203, 3423, 0); + } + + @Override + public Location getStartLocation() { + return base.transform(26, 38, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(12852); + setRegionBase(); + registerRegion(region.getId()); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/CrandorMapPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/CrandorMapPlugin.java new file mode 100644 index 000000000..454bf72e3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/CrandorMapPlugin.java @@ -0,0 +1,42 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.plugin.Plugin; + +/** + * Represents the crandor map creating plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class CrandorMapPlugin extends UseWithHandler { + + /** + * Constructs a new {@code CrandorMapPlugin} {@code Object}. + */ + public CrandorMapPlugin() { + super(DragonSlayer.MAGIC_PIECE.getId(), DragonSlayer.MAZE_PIECE.getId(), DragonSlayer.WORMBRAIN_PIECE.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(DragonSlayer.MAGIC_PIECE.getId(), ITEM_TYPE, this); + addHandler(DragonSlayer.MAZE_PIECE.getId(), ITEM_TYPE, this); + addHandler(DragonSlayer.WORMBRAIN_PIECE.getId(), ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (!event.getPlayer().getInventory().containsItem(DragonSlayer.MAGIC_PIECE) || !event.getPlayer().getInventory().containsItem(DragonSlayer.MAZE_PIECE) || !event.getPlayer().getInventory().containsItem(DragonSlayer.WORMBRAIN_PIECE)) { + event.getPlayer().getPacketDispatch().sendMessage("You don't have all the map pieces yet."); + return true; + } + if (event.getPlayer().getInventory().remove(DragonSlayer.MAGIC_PIECE) && event.getPlayer().getInventory().remove(DragonSlayer.MAZE_PIECE) && event.getPlayer().getInventory().remove(DragonSlayer.WORMBRAIN_PIECE)) { + event.getPlayer().getInventory().add(DragonSlayer.CRANDOR_MAP); + event.getPlayer().getDialogueInterpreter().sendItemMessage(DragonSlayer.CRANDOR_MAP.getId(), "You put the three pieces together and assemble a map that shows the route through the reefs to Crandor."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DSChestDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DSChestDialogue.java new file mode 100644 index 000000000..bcd1b56f7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DSChestDialogue.java @@ -0,0 +1,76 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; + +/** + * Represents the dialogue plugin used for the dragon slayer chest. + * @author 'Vexia + * @version 1.0 + */ +public final class DSChestDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DSChestDialogue} {@code Object}. + */ + public DSChestDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DSChestDialogue} {@code Object}. + * @param player the player. + */ + public DSChestDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DSChestDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("As you open the chest, you notice an inscription on the lid:"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogue("Here I rest the map to my beloved home. To whoever finds it, I beg", "of you, let it be. I was honour-bound not to destroy the map piece,", "but I have used all my magical skill to keep it from being recovered."); + stage = 1; + break; + case 1: + interpreter.sendDialogue("This map leads to the lair of the beast that destroyed my home,", "devoured my family, and burned to a cinder all that I love. But", "revenge would not benefit me now, and to disturb this beast is to risk", "brining its wrath down upon another land."); + stage = 2; + break; + case 2: + interpreter.sendDialogue("I cannot stop you from taking this map piece now, but think on this:", "if you can slay the Dragon of Crandor, you are a greater hero than", "my land ever produced. There is no shame in backing out now."); + stage = 3; + break; + case 3: + interpreter.sendItemMessage(DragonSlayer.MAGIC_PIECE.getId(), "You find a map piece in the chest."); + stage = 4; + break; + case 4: + if (!player.getInventory().add(DragonSlayer.MAGIC_PIECE)) { + GroundItemManager.create(DragonSlayer.MAGIC_PIECE, player); + } + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3802875 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DSMagicDoorPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DSMagicDoorPlugin.java new file mode 100644 index 000000000..4ac5ea792 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DSMagicDoorPlugin.java @@ -0,0 +1,65 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Represents the dragon slayer magic door plugin. + * @author Vexia + * + */ +public final class DSMagicDoorPlugin extends UseWithHandler { + + /** + * Represents the location to go to. + */ + private static final Location LOC = Location.create(3049, 9840, 0); + + /** + * Represents the ids of the items. + */ + private static final int[] IDS = new int[] { 301, 1791, 950, 1907 }; + + /** + * Constructs a new {@code DSMagicDoorPlugin} {@code Object}. + */ + public DSMagicDoorPlugin() { + super(301, 1791, 950, 1907); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(25115, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) < 20) { + return true; + } + if (player.getInventory().remove(event.getUsedItem())) { + player.getPacketDispatch().sendMessage("You put " + event.getUsedItem().getName().toLowerCase() + " into the opening in the door."); + int index = 0; + for (int i = 0; i < IDS.length; i++) { + if (IDS[i] == event.getUsedItem().getId()) { + index = i; + break; + } + } + player.getSavedData().getQuestData().getDragonSlayerItems()[index] = true; + DragonSlayer.handleMagicDoor(player, false); + } + return true; + } + + @Override + public Location getDestination(final Player player, Node node) { + return LOC; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DSNedNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DSNedNPC.java new file mode 100644 index 000000000..056195966 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DSNedNPC.java @@ -0,0 +1,50 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Represents the dragon slayer npc. + * @author 'Vexia + * @version 1.0 + */ +public final class DSNedNPC extends AbstractNPC { + + /** + * Represents the NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 918 }; + + /** + * Constructs a new {@code DSNedNPC} {@code Object}. + */ + public DSNedNPC() { + super(0, null); + } + + /** + * Constructs a new {@code DSNedNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private DSNedNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DSNedNPC(id, location); + } + + @Override + public boolean isHidden(final Player player) { + return player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) != 30 && player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) != 40; + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DragonSlayer.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DragonSlayer.java new file mode 100644 index 000000000..2f0979ae7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DragonSlayer.java @@ -0,0 +1,350 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.PluginManager; + +/** + * Represents the dragon slayer quest. + * @author Vexia + * + */ +@Initializable +public final class DragonSlayer extends Quest { + + /** + * Represents the maze key given by the guildmaster. + */ + public static final Item MAZE_KEY = new Item(1542); + + /** + * Represents the red key item. + */ + public static final Item RED_KEY = new Item(1543); + + /** + * Represents the orange key item. + */ + public static final Item ORANGE_KEY = new Item(1544); + + /** + * Represents the yellow key item. + */ + public static final Item YELLOW_KEY = new Item(1545); + + /** + * Represents the blue key item. + */ + public static final Item BLUE_KEY = new Item(1546); + + /** + * Represents the purple key item. + */ + public static final Item PURPLE_KEY = new Item(1547); + + /** + * Represents the green key item. + */ + public static final Item GREEN_KEY = new Item(1548); + + /** + * Represents the maze map piece. + */ + public static final Item MAZE_PIECE = new Item(1535); + + /** + * Represents the magic door map piece. + */ + public static final Item MAGIC_PIECE = new Item(1537); + + /** + * Represents the wormbrain piece. + */ + public static final Item WORMBRAIN_PIECE = new Item(1536); + + /** + * Represents the anti dragon fire shield. + */ + public static final Item SHIELD = new Item(1540); + + /** + * Represents the crandor map item. + */ + public static final Item CRANDOR_MAP = new Item(1538); + + /** + * Represents the map component interface. + */ + public static final Component MAP_COMPONENT = new Component(547); + + /** + * Represents the nails item. + */ + public static final Item NAILS = new Item(1539, 30); + + /** + * Represents the plank item. + */ + public static final Item PLANK = new Item(960); + + /** + * Represents the hammer item. + */ + public static final Item HAMMER = new Item(2347); + + /** + * Represents the elvarg head item. + */ + public static final Item ELVARG_HEAD = new Item(11279); + + /** + * Constructs a new {@Code DragonSlayer} {@Code Object} + */ + public DragonSlayer() { + super("Dragon Slayer", 18, 17, 2, 176, 0, 1, 10); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new CrandorMapPlugin(), new DragonSlayerPlugin(), new DSMagicDoorPlugin(), new DragonSlayerCutscene(), new MazeDemonNPC(), new MazeGhostNPC(), new MazeSkeletonNPC(), new MazeZombieNPC(), new MeldarMadNPC(), new WormbrainNPC(), new ZombieRatNPC(), new DSChestDialogue(), new GuildmasterDialogue(), new ElvargNPC(), new WormbrainDialogue(), new OziachDialogue(), new NedDialogue(), new DukeHoracioDialogue()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (getStage(player)) { + case 0: + player.getPacketDispatch().sendString(BLUE + "I can start this quest by speaking to the " + RED + "Guildmaster " + BLUE + "in", 275, 4+ 7); + player.getPacketDispatch().sendString(BLUE + "the " + RED + "Champions' Guild" + BLUE + " , south-west of Varrock.", 275, 5+ 7); + player.getPacketDispatch().sendString(BLUE + "I will need to be able to defeat a " + RED + "level 83 dragon.", 275, 6+ 7); + if (player.getQuestRepository().getPoints() < 32) { + player.getPacketDispatch().sendString(BLUE + "To enter the Champions' Guild I need" + RED + " 32 Quest Points.", 275, 7+ 7); + } else { + player.getPacketDispatch().sendString("To enter the Champions' Guild I need 32 Quest Points.", 275, 7+ 7); + } + break; + case 10: + line(player, "The Guildmaster of the Champions' Guild said I could earn", 4+ 7); + line(player, "the right to wear rune armour if I went on a quest for", 5+ 7); + line(player, "Oziach, who makes the armour.", 6+ 7); + line(player, BLUE + "I should speak to " + RED + "Oziach" + BLUE + ", who lives by the cliffs to the", 7+ 7); + line(player, BLUE + "west of " + RED + "Edgeville.", 8+ 7); + break; + case 15: + line(player, "The Guildmaster of the Champions' Guild said I could earn", 4+ 7); + line(player, "the right to wear rune armour if I went on a quest for", 5+ 7); + line(player, "Oziach, who makes the armour.", 6+ 7); + line(player, "I spoke to Oziach in Edgeville. He told me to slay the", 7+ 7); + line(player, "dragon of Crandor island.", 8+ 7); + line(player, BLUE + "I should return to the " + RED + "Champions' Guild Guildmaster " + BLUE + "for", 9+ 7); + line(player, BLUE + "more detailed instructions.", 10+ 7); + break; + case 20: + line(player, "The Guildmaster of the Champions' Guild said I could earn", 4+ 7); + line(player, "the right to wear rune armour if I went on a quest for", 5+ 7); + line(player, "Oziach, who makes the armour.", 6+ 7); + line(player, "I spoke to Oziach in Edgeville. He told me to slay the", 7+ 7); + line(player, "dragon of Crandor island.", 8+ 7); + line(player, "The Champions' Guild Guildmaster gave me more detailed", 9+ 7); + line(player, "instructions.", 10+ 7); + line(player, BLUE + "To defeat the dragon I will need to find a " + RED + "map " + BLUE + "to Crandor, a", 11+ 7); + line(player, RED + "ship" + BLUE + ", a " + RED + "captain " + BLUE + "to take me there and some kind of", 12+ 7); + line(player, RED + "protection " + BLUE + "against the dragon's breath.", 13+ 7); + if (!player.getInventory().containsItem(MAZE_PIECE) && !player.getBank().containsItem(MAZE_PIECE)) { + line(player, BLUE + "One-third of the map is in " + RED + "Melzar's Maze" + BLUE + ", near", 14+ 7); + line(player, RED + "Rimmington" + ".", 15+ 7); + } else { + line(player, "I found the piece of the map that was hidden in Melzar's", 14+ 7); + line(player, "Maze.", 15+ 7); + } + if (!player.getInventory().containsItem(MAGIC_PIECE) && !player.getBank().containsItem(MAGIC_PIECE)) { + line(player, BLUE + "One)2third of the map is hidden and only the " + RED + "Oracle " + BLUE + "on " + RED + "Ice", 16+ 7); + line(player, RED + "Mountain" + BLUE + " will know where it is.", 17+ 7); + } else { + line(player, "I found the piece of the map that was hidden beneath Ice", 16+ 7); + line(player, "Mountain.", 18+ 7); + } + if (!player.getInventory().containsItem(WORMBRAIN_PIECE) && !player.getBank().containsItem(WORMBRAIN_PIECE)) { + line(player, BLUE + "One-third of the map was stolen by a " + RED + "goblin " + BLUE + "from the", 18+ 7); + line(player, RED + "Goblin Village.", 19+ 7); + } else { + line(player, "I found the piece of the map that the goblin, Wormbrain,", 18+ 7); + line(player, "stole.", 19+ 7); + } + if (!player.getInventory().containsItem(SHIELD) && !player.getBank().containsItem(SHIELD)) { + line(player, BLUE + "I should ask the " + RED + "Duke of Lumbridge " + BLUE + "for an " + RED + "anti-", 20+ 7); + line(player, RED + "dragonbreath shield.", 21+ 7); + } else { + line(player, "The Duke of Lumbridge gave me an anti-dragonbreath", 20+ 7); + line(player, "shield.", 21+ 7); + + } + if (!player.getSavedData().getQuestData().getDragonSlayerAttribute("ship")) { + line(player, BLUE + "I should see if there is a " + RED + "ship " + BLUE + "for sale in " + RED + "Port Sarim", 22+ 7); + } else { + line(player, "I bought a ship in Port Sarim called the Lady Lumbridge.", 22+ 7); + if (!player.getSavedData().getQuestData().getDragonSlayerAttribute("repaired")) { + line(player, "I need to repair the hole in bottom of the ship.", 23+ 7); + } else { + line(player, "I have repaired my ship using wooden planks and steel", 23+ 7); + line(player, "nails.", 24+ 7); + } + } + break; + case 30: + line(player, "The Guildmaster of the Champions' Guild said I could earn", 4+ 7); + line(player, "the right to wear rune armour if I went on a quest for", 5+ 7); + line(player, "Oziach, who makes the armour.", 6+ 7); + line(player, "I spoke to Oziach in Edgeville. He told me to slay the", 7+ 7); + line(player, "dragon of Crandor island.", 8+ 7); + line(player, "The Champions' Guild Guildmaster told me I had to find", 9+ 7); + line(player, "three pieces of a map to Crandor, a ship, a captain to take", 10+ 7); + line(player, "me there and a shield to protect me from the dragon's", 11+ 7); + line(player, "breath.", 12+ 7); + line(player, "I found the piece of the map that was hidden in Melzar's", 13+ 7); + line(player, "Maze.", 14+ 7); + line(player, "I found the piece of the map that was hidden beneath Ice", 15+ 7); + line(player, "Mountain.", 16+ 7); + line(player, "I found the piece of the map that the goblin, Wormbrain,", 17+ 7); + line(player, "stole.", 18+ 7); + line(player, "The Duke of Lumbridge gave me an anti-dragonbreath", 19+ 7); + line(player, "shield.", 20+ 7); + line(player, "I bought a ship in Port Sarim called the Lady Lumbridge", 21+ 7); + line(player, "I have repaired my ship using wooden planks and steel", 22+ 7); + line(player, "nails.", 23+ 7); + line(player, "Captain Ned from Draynor Village has agreed to sail the", 24+ 7); + line(player, "ship to Crandor for me.", 25+ 7); + line(player, BLUE + "Now I should go to my ship in " + RED + "Port Sarim " + BLUE + "and set sail for", 26+ 7); + line(player, RED + "Crandor" + BLUE + "!", 27+ 7); + break; + case 40: + line(player, "The Guildmaster of the Champions' Guild said I could earn", 4+ 7); + line(player, "the right to wear rune armour if I went on a quest for", 5+ 7); + line(player, "Oziach, who makes the armour.", 6+ 7); + line(player, "I spoke to Oziach in Edgeville. He told me to slay the", 7+ 7); + line(player, "dragon of Crandor island.", 8+ 7); + line(player, "The Champions' Guild Guildmaster told me I had to find", 9+ 7); + line(player, "three pieces of a map to Crandor, a ship, a captain to take", 10+ 7); + line(player, "me there and a shield to protect me from the dragon's", 11+ 7); + line(player, "breath.", 12+ 7); + line(player, "I found the piece of the map that was hidden in Melzar's", 13+ 7); + line(player, "Maze.", 14+ 7); + line(player, "I found the piece of the map that was hidden beneath Ice", 15+ 7); + line(player, "Mountain.", 16+ 7); + line(player, "I found the piece of the map that the goblin, Wormbrain,", 17+ 7); + line(player, "stole.", 18+ 7); + line(player, "The Duke of Lumbridge gave me an anti-dragonbreath", 19+ 7); + line(player, "shield.", 20+ 7); + if (!player.getAttribute("demon-slayer:memorize", false)) { + if (!player.getInventory().containsItem(ELVARG_HEAD)) { + line(player, BLUE + "Now all I need to do is kill the " + RED + "dragon" + BLUE + "!", 21+ 7); + } else { + line(player, BLUE + "I have slain the dragon! Now I just need to tell " + RED + "Oziach.", 21+ 7); + } + } else { + line(player, "I have found a secret passage leading from Karamja to", 21+ 7); + line(player, "Crandor, so I no longer need to worry about finding a", 22+ 7); + line(player, "seaworthy ship and captain to take me there.", 23+ 7); + if (!player.getInventory().containsItem(ELVARG_HEAD)) { + line(player, BLUE + "Now all I need to do is kill the " + RED + "dragon" + BLUE + "!", 24+ 7); + } else { + line(player, BLUE + "I have slain the dragon! Now I just need to tell " + RED + "Oziach.", 24+ 7); + } + } + break; + case 100: + line(player, "The Guildmaster of the Champions' Guild said I could earn", 4+ 7); + line(player, "the right to wear rune armour if I went on a quest for", 5+ 7); + line(player, "Oziach, who makes the armour.", 6+ 7); + line(player, "I spoke to Oziach in Edgeville. He told me to slay the", 7+ 7); + line(player, "dragon of Crandor island.", 8+ 7); + line(player, "The Champions' Guild Guildmaster told me I had to find", 9+ 7); + line(player, "three pieces of a map to Crandor, a ship, a captain to take", 10+ 7); + line(player, "me there and a shield to protect me from the dragon's", 11+ 7); + line(player, "breath.", 12+ 7); + line(player, "I found the piece of the map that was hidden in Melzar's", 13+ 7); + line(player, "Maze.", 14+ 7); + line(player, "I found the piece of the map that was hidden beneath Ice", 15+ 7); + line(player, "Mountain.", 16+ 7); + line(player, "I found the piece of the map that the goblin, Wormbrain,", 17+ 7); + line(player, "stole.", 18+ 7); + line(player, "The Duke of Lumbridge gave me an anti-dragonbreath", 19+ 7); + line(player, "shield.", 20+ 7); + line(player, "I have found a secret passage leading from Karamja to", 21+ 7); + line(player, "Crandor, so I no longer need to worry about finding a", 22+ 7); + line(player, "seaworthy ship and captain to take me there.", 23+ 7); + line(player, "I sailed to Crandor and killed the dragon. I am not a true", 24+ 7); + line(player, "champion and have proved myself worthy to wear rune", 25+ 7); + line(player, "platemail!", 26+ 7); + line(player, "QUEST COMPLETE!", 27+ 7); + line(player, BLUE + "I gained " + RED + "2 Quest Points" + BLUE + ", " + RED + "18,650 Strength XP" + BLUE + ", " + RED + "18,650", 28+ 7); + line(player, RED + "Defence XP " + BLUE + "and the right to wear " + RED + "rune platebodies.", 29+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("2 Quests Points", 277, 8 + 2); + player.getPacketDispatch().sendString("Ability to wear rune platebody", 277, 9 + 2); + player.getPacketDispatch().sendString("18,650 Strength XP", 277, 10 + 2); + player.getPacketDispatch().sendString("18,650 Defence XP", 277, 11 + 2); + player.getPacketDispatch().sendString("You have completed the Dragon Slayer Quest!", 277, 2 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(ELVARG_HEAD.getId(), 230, 277, 3 + 2); + player.getSkills().addExperience(Skills.STRENGTH, 18650); + player.getSkills().addExperience(Skills.DEFENCE, 18650); + } + + /** + * Method used to handle going through the magic door. + * @param player the player. + * @param interaction the interaction. + * @return True if so. + */ + public static boolean handleMagicDoor(final Player player, boolean interaction) { + if (!player.getSavedData().getQuestData().getDragonSlayerItem("lobster") || !player.getSavedData().getQuestData().getDragonSlayerItem("bowl") || !player.getSavedData().getQuestData().getDragonSlayerItem("silk") || !player.getSavedData().getQuestData().getDragonSlayerItem("wizard")) { + if (interaction) { + player.getPacketDispatch().sendMessage("You can't see any way to open the door."); + } + return true; + } + player.getPacketDispatch().sendMessage("The door opens..."); + final GameObject object = RegionManager.getObject(new Location(3050, 9839, 0)); + player.faceLocation(object.getLocation()); + player.getPacketDispatch().sendObjectAnimation(object, new Animation(6636)); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 4: + AgilityHandler.walk(player, 0, player.getLocation(), player.getLocation().getX() == 3051 ? Location.create(3049, 9840, 0) : Location.create(3051, 9840, 0), null, 0, null); + break; + case 5: + player.getPacketDispatch().sendObjectAnimation(object, new Animation(6637)); + break; + case 6: + player.getPacketDispatch().sendObjectAnimation(object, new Animation(6635)); + return true; + } + return false; + } + }); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene.java new file mode 100644 index 000000000..6b5b36dc7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DragonSlayerCutscene.java @@ -0,0 +1,559 @@ + package core.game.content.quest.free.dragonslayer; + +import java.util.ArrayList; +import java.util.List; + +import core.game.component.Component; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.travel.ship.Ships; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.net.packet.out.MinimapState; + +/** + * Represents the dragon slayer cutscene. + * @author Vexia + * + */ +public final class DragonSlayerCutscene extends CutscenePlugin { + + /** + * Represents the animation for the player to use. + */ + private static final Animation ANIMATION = new Animation(4191); + + /** + * Represents the bobbin pulse. + */ + private final BobingPulse bobinPulse = new BobingPulse(); + + /** + * Constructs a new {@code DragonSlayerCutscene} {@code Object}. + */ + public DragonSlayerCutscene() { + this(null); + } + + /** + * Constructs a new {@code DragonSlayerCutscene} {@code Object}. + * @param p the player. + */ + public DragonSlayerCutscene(final Player p) { + super("Dragon Slayer", true); + this.player = p; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new DragonSlayerCutscene(p); + } + + @Override + public boolean start(final Player player, final boolean login, Object... args) { + npcs.add(NPC.create(918, base.transform(39, 6, 1))); + npcs.add(NPC.create(6085, base.transform(39, 7, 1))); + for (NPC n : npcs) { + n.setWalks(false); + n.init(); + } + player.lock(); + return super.start(player, login, args); + } + + @Override + public void register() { + new DSNedDialogue().init(); + } + + @Override + public void open() { + player.lock(); + player.getDialogueInterpreter().open(918, npcs.get(0), this); + player.getLocks().unlockMovement(); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 11, player.getLocation().getY() + 1, 190, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 3, player.getLocation().getY(), 190, 1, 100)); + bob(new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 7, player.getLocation().getY() - 3, 250, 1, 1), new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 4, player.getLocation().getY(), 210, 1, 1)); + } + + @Override + public void end() { + super.end(); + this.getBobinPulse().stop(); + player.getProperties().setTeleportLocation(Ships.PORT_SARIM_TO_CRANDOR.getLocation()); + player.getInterfaceManager().close(); + player.animate(ANIMATION); + player.getDialogueInterpreter().close(); + player.getDialogueInterpreter().sendDialogue("You are knocked unconscious and later awake on an ash-strewn", "beach."); + player.getQuestRepository().getQuest("Dragon Slayer").setStage(player, 40); + player.getSavedData().getQuestData().setDragonSlayerAttribute("repaired", false); + player.getConfigManager().set(177, 8257540); + player.getConfigManager().set(176, 8); + player.getSavedData().getQuestData().setDragonSlayerPlanks(0); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, player.getLocation().getX() + 13, player.getLocation().getY() - 3, 250, 1, 100)); + player.lock(3); + } + + @Override + public Location getStartLocation() { + return base.transform(38, 5, 1); + } + + /** + * Method used to bob the camera. + * @param position the position. + * @param rotation the rotation. + */ + public void bob(final CameraContext position, final CameraContext rotation) { + PacketRepository.send(CameraViewPacket.class, position); + PacketRepository.send(CameraViewPacket.class, rotation); + if (bobinPulse.position == null || bobinPulse.rotation == null) { + GameWorld.getPulser().submit(bobinPulse); + } + bobinPulse.position = position; + bobinPulse.rotation = rotation; + } + + /** + * Represents a pulse used to bob a camera. + * @author 'Vexia + */ + public class BobingPulse extends Pulse { + + /** + * Represents if it's the alternate position. + */ + boolean alternate = false; + + /** + * Represents the position. + */ + private CameraContext position = null; + + /** + * Represents the rotation. + */ + private CameraContext rotation = null; + + /** + * Represents the counter. + */ + private int counter = 0; + + /** + * Constructs a new {@code DragonSlayerCutscene} {@code Object}. + */ + public BobingPulse() { + super(1); + } + + @Override + public boolean pulse() { + if (counter == 3) { + if (alternate) { + PacketRepository.send(CameraViewPacket.class, position); + PacketRepository.send(CameraViewPacket.class, rotation); + alternate = false; + } else { + PacketRepository.send(CameraViewPacket.class, position.transform(840)); + alternate = true; + } + counter = 0; + } + counter++; + return false; + } + } + + @Override + public Location getSpawnLocation() { + return Location.create(3047, 3203, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(7500); + setRegionBase(); + registerRegion(region.getId()); + } + + @Override + public Pulse getStartPulse() { + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, getMapState())); + player.getInterfaceManager().hideTabs(getRemovedTabs()); + return new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.getProperties().setTeleportLocation(getStartLocation()); + break; + case 2: + player.getInterfaceManager().close(); + player.unlock(); + player.getWalkingQueue().reset(); + player.getLocks().lockMovement(1000000); + open(); + return true; + } + return false; + } + }; + } + + /** + * Gets the bobinPulse. + * @return The bobinPulse. + */ + public BobingPulse getBobinPulse() { + return bobinPulse; + } + + /** + * Represents the dialogue plugin used for the dragon slayer ned. + * @author 'Vexia + * @version 1.0 + */ + public static final class DSNedDialogue extends DialoguePlugin { + + /** + * Represents the animations used during the cutscene. + */ + private static final Animation[] ANIMATIONS = new Animation[] { new Animation(2105), new Animation(4280), new Animation(6649) }; + + /** + * Represents the fire graphics. + */ + private static final Graphics FIRE = new Graphics(453); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Represents the cutscene. + */ + private CutscenePlugin cutscene; + + /** + * Represents the active fires. + */ + private List fires = new ArrayList<>(); + + /** + * Represents if the fires are done burning. + */ + private boolean finished = false; + + /** + * Constructs a new {@code DSNedDialogue} {@code Object}. + */ + public DSNedDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DSNedDialogue} {@code Object}. + * @param player the player. + */ + public DSNedDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DSNedDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Dragon Slayer"); + if (args.length > 1) { + cutscene = ((DragonSlayerCutscene) args[1]); + npc("Ah it's good to feel that salt spray on my face once", "again!"); + stage = 500; + return true; + } + switch (quest.getStage(player)) { + case 40: + if (!player.getSavedData().getQuestData().getDragonSlayerAttribute("repaired")) { + npc("The ship's in a sorry state. You'd better fix up the hole", "in the hull before we can go anywhere."); + stage = 100; + } else { + npc("Ah, it's good to be on board a ship again! No matter", "how long I live on land, a ship will always seem better.", "Are you ready to depart?"); + stage = 0; + } + break; + case 30: + npc("Ah, it's good to be on board a ship again! No matter", "how long I live on land, a ship will always seem better.", "Are you ready to depart?"); + stage = 0; + break; + default: + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 40: + case 30: + switch (stage) { + case 500:/*------cutscene--------*/ + ((DragonSlayerCutscene) cutscene).bob(new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 6, player.getLocation().getY() - 3, 350, 1, 1), new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 2, player.getLocation().getY(), 190, 1, 1)); + npc("And this is a mighty fine ship. She don't look much, but", "she handles like a dream."); + stage = 501; + break; + case 501: + ((DragonSlayerCutscene) cutscene).bob(new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 5, player.getLocation().getY() - 3, 350, 1, 1), new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 1, player.getLocation().getY(), 350, 1, 1)); + player.face(npc); + npc.face(player); + player("How much longer until we reach Crandor?"); + stage = 502; + break; + case 502: + npc("Not long now! According to the chart, we'd be able to", "see Crandor if it wasn't for those clouds on the horizon."); + stage = 503; + break; + case 503: + player.getInterfaceManager().open(new Component(543)); + interpreter.sendPlainMessage(true, "Clouds surround the ship."); + GameWorld.getPulser().submit(new Pulse(6, player) { + @Override + public boolean pulse() { + player.getInterfaceManager().close(); + interpreter.sendDialogues(6085, null, "Looks like theres a storm coming up, cap'n. Soon we", "won't be able to see anything!"); + stage = 504; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 8, player.getLocation().getY() + 15, 1200, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX(), player.getLocation().getY(), 1200, 1, 100)); + ((DragonSlayerCutscene) cutscene).bob(new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 5, player.getLocation().getY() + 18, 1200, 1, 1), new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() - 2, player.getLocation().getY(), 1200, 1, 1)); + return true; + } + }); + break; + case 504: + ((DragonSlayerCutscene) cutscene).bob(new CameraContext(player, CameraType.POSITION, player.getLocation().getX() - 2, player.getLocation().getY() + 14, 1000, 1, 1), new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() - 2, player.getLocation().getY() - 50, 1000, 1, 1)); + npc("Oh, well. The weather has been so good up until now."); + stage = 505; + break; + case 505: + player.getInterfaceManager().open(new Component(545)); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player("Did you see that?"); + stage = 506; + player.getInterfaceManager().close(); + return true; + } + }); + break; + case 506: + npc("See what?"); + stage = 507; + break; + case 507: + player("I thought I saw something up above us."); + stage = 508; + break; + case 508: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 7, player.getLocation().getY() + 2, 400, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() - 3, player.getLocation().getY(), 400, 1, 100)); + ((DragonSlayerCutscene) cutscene).bob(new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 8, player.getLocation().getY() + 5, 400, 1, 1), new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() - 3, player.getLocation().getY(), 400, 1, 1)); + close(); + player.getPacketDispatch().sendPositionedGraphic(446, 70, 1, cutscene.getBase().transform(37, 5, 1)); + player.getPacketDispatch().sendPositionedGraphic(446, 70, 2, cutscene.getBase().transform(36, 5, 1)); + player.getPacketDispatch().sendPositionedGraphic(446, 70, 3, cutscene.getBase().transform(35, 5, 1)); + GameWorld.getPulser().submit(new Pulse(1, player) { + + @Override + public boolean pulse() { + // Projectile.create(, loc, id, startHeight, + // endHeight, delay, speed, angle, + // distance).send(); + fires.add(Location.create(37, 5, 1)); + fires.add(Location.create(36, 5, 1)); + fires.add(Location.create(35, 5, 1)); + return true; + } + + }); + startFires(); + npc.animate(ANIMATIONS[0]); + cutscene.getNPCS().get(1).animate(ANIMATIONS[1]); + npc("It's the dragon!"); + npc.face(player); + player.face(npc); + stage = 509; + break; + case 509: + close(); + player.getInterfaceManager().open(new Component(546)); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 2: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 5, player.getLocation().getY() + 2, 400, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() - 3, player.getLocation().getY(), 400, 1, 100)); + ((DragonSlayerCutscene) cutscene).bob(new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 7, player.getLocation().getY() + 2, 400, 1, 1), new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() - 3, player.getLocation().getY(), 400, 1, 1)); + // player.getPacketDispatch().sendPositionedGraphic(446, + // 20, 1, + // cutscene.getBase().transform(39, + // 7, 1)); + player.getPacketDispatch().sendPositionedGraphic(446, 20, 2, cutscene.getBase().transform(38, 7, 1)); + player.getPacketDispatch().sendPositionedGraphic(446, 20, 1, cutscene.getBase().transform(37, 7, 1)); + player.getPacketDispatch().sendPositionedGraphic(446, 20, 2, cutscene.getBase().transform(38, 6, 1)); + player.getPacketDispatch().sendPositionedGraphic(446, 20, 1, cutscene.getBase().transform(36, 6, 1)); + fires.add(cutscene.getBase().transform(39, 7, 1)); + fires.add(cutscene.getBase().transform(38, 7, 1)); + fires.add(cutscene.getBase().transform(37, 7, 1)); + fires.add(cutscene.getBase().transform(38, 6, 1)); + fires.add(cutscene.getBase().transform(36, 6, 1)); + player.getInterfaceManager().close(); + npc.animate(ANIMATIONS[1]); + cutscene.getNPCS().get(1).animate(ANIMATIONS[0]); + break; + case 4: + cutscene.getNPCS().get(1).animate(ANIMATIONS[2]); + break; + case 5: + player.getPacketDispatch().sendPositionedGraphic(446, 20, 1, npc.getLocation()); + break; + case 6: + player.getPacketDispatch().sendPositionedGraphics(FIRE, cutscene.getNPCS().get(1).getLocation()); + cutscene.getNPCS().get(1).animate(new Animation(836)); + cutscene.getNPCS().get(1).getImpactHandler().manualHit(player, 10, HitsplatType.NORMAL); + break; + case 10: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 13, player.getLocation().getY() + 2, 400, 1, 40)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() - 3, player.getLocation().getY(), 400, 1, 40)); + ((DragonSlayerCutscene) cutscene).bob(new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 2, player.getLocation().getY() + 2, 400, 1, 1), new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() - 4, player.getLocation().getY(), 400, 1, 1)); + npc("We're going to sink!"); + stage = 510; + return true; + } + return false; + } + }); + break; + case 510: + player("Look! Land ahead!"); + ((DragonSlayerCutscene) cutscene).bob(new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 2, player.getLocation().getY() + 3, 350, 1, 1), new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 70, player.getLocation().getY() - 30, 350, 1, 1)); + player.face(npc); + stage = 511; + break; + case 511: + npc.faceLocation(npc.getLocation().transform(-1, 0, 0)); + player.faceLocation(player.getLocation().transform(-1, 0, 0)); + npc("We're going to crash!"); + stage = 512; + break; + case 512: + player.setAttribute("real-end", Ships.PORT_SARIM_TO_CRANDOR.getLocation()); + player.setAttribute("cutscene:original-loc", Ships.PORT_SARIM_TO_CRANDOR.getLocation()); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.SHAKE, 4, 4, 1200, 4, 4)); + player.getDialogueInterpreter().sendPlainMessage(true, "CRASH!"); + cutscene.stop(true); + finished = true; + break; + case 0: + options("Yes, let's go!", "No, I'm not quite ready yet."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Yes, let's go!"); + stage = 10; + break; + case 2: + player("No, I'm not quite ready yet."); + stage = 30; + break; + } + break; + case 30: + end(); + break; + case 10: + end(); + Ships.PORT_SARIM_TO_CRANDOR.sail(player); + GameWorld.getPulser().submit(new Pulse(17) { + @Override + public boolean pulse() { + player.getInterfaceManager().open(new Component(317)); + ActivityManager.start(player, "Dragon Slayer", false); + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().open(new Component(317)); + return true; + } + }); + break; + case 100: + end(); + break; + case 20: + end(); + break; + } + break; + default: + break; + } + return true; + } + + /** + * Method used to start the fires. + */ + public void startFires() { + for (Location fire : fires) { + player.getPacketDispatch().sendPositionedGraphic(453, 0, 1, fire); + } + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + for (Location fire : fires) { + player.getPacketDispatch().sendPositionedGraphic(453, 0, 1, fire); + } + if (finished) { + return true; + } + return false; + } + + }); + } + + @Override + public int[] getIds() { + return new int[] { 918 }; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.java new file mode 100644 index 000000000..a07c123cb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DragonSlayerPlugin.java @@ -0,0 +1,494 @@ +package core.game.content.quest.free.dragonslayer; + +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.content.global.action.EquipHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle node interactions related to dragon slayer. + * + * @author Vexia + * + */ +public final class DragonSlayerPlugin extends OptionHandler { + + /** + * Represents the hammer animation. + */ + private static final Animation HAMMER_ANIM = new Animation(3676); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(25115).getHandlers().put("option:open", this);// magic + // door. + NPCDefinition.forId(747).getHandlers().put("option:trade", this);// oziach. + ObjectDefinition.forId(2595).getHandlers().put("option:open", this);// maze + // main + // door. + // maze first floor. + ObjectDefinition.forId(32968).getHandlers().put("option:open", this); + ObjectDefinition.forId(2602).getHandlers().put("option:open", this); + ObjectDefinition.forId(2596).getHandlers().put("option:open", this);// red + // door. + ObjectDefinition.forId(1752).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(25038).getHandlers().put("option:climb-up", this);// trapdoor + // ladder + ObjectDefinition.forId(25214).getHandlers().put("option:open", this);// trapdoor + ObjectDefinition.forId(1746).getHandlers().put("option:climb-down", this);// ladder + ObjectDefinition.forId(2605).getHandlers().put("option:climb-down", this);// ladder + + // maze second floor. + ObjectDefinition.forId(2597).getHandlers().put("option:open", this);// orange + // door. + ObjectDefinition.forId(1747).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(25045).getHandlers().put("option:climb-down", this); + // maze third floor + ObjectDefinition.forId(2598).getHandlers().put("option:open", this);// yellow + // door. + // basement floor + ObjectDefinition.forId(2599).getHandlers().put("option:open", this);// blue + // door. + ObjectDefinition.forId(2600).getHandlers().put("option:open", this);// purple + // door. + ObjectDefinition.forId(2601).getHandlers().put("option:open", this);// green + // door. + ObjectDefinition.forId(2603).getHandlers().put("option:open", this);// closed + // chest. + ObjectDefinition.forId(2604).getHandlers().put("option:search", this);// search + // chest. + ObjectDefinition.forId(2604).getHandlers().put("option:close", this);// search + // chest. + ObjectDefinition.forId(1755).getHandlers().put("option:climb-up", this); + // map parts + ItemDefinition.forId(DragonSlayer.MAZE_PIECE.getId()).getHandlers().put("option:study", this); + ItemDefinition.forId(DragonSlayer.MAGIC_PIECE.getId()).getHandlers().put("option:study", this); + ItemDefinition.forId(DragonSlayer.WORMBRAIN_PIECE.getId()).getHandlers().put("option:study", this); + ItemDefinition.forId(DragonSlayer.CRANDOR_MAP.getId()).getHandlers().put("option:study", this); + // dwarv mine + ObjectDefinition.forId(2587).getHandlers().put("option:open", this); + NPCDefinition.forId(745).getHandlers().put("option:talk-to", this); + // lady lumby + ObjectDefinition.forId(25036).getHandlers().put("option:repair", this); + ObjectDefinition.forId(2589).getHandlers().put("option:repair", this); + + // crandor + ObjectDefinition.forId(25154).getHandlers().put("option:enter", this); + ObjectDefinition.forId(2606).getHandlers().put("option:open", this); + ObjectDefinition.forId(25213).getHandlers().put("option:climb", this); + ObjectDefinition.forId(25161).getHandlers().put("option:climb-over", this); + NPCDefinition.forId(742).getHandlers().put("option:attack", this); + NPCDefinition.forId(745).getHandlers().put("option:attack", this); + // reward items + ItemDefinition.forId(1127).getHandlers().put("option:wear", this); + ItemDefinition.forId(1135).getHandlers().put("option:wear", this); + ItemDefinition.forId(2653).getHandlers().put("option:wear", this); + ItemDefinition.forId(2669).getHandlers().put("option:wear", this); + ItemDefinition.forId(2661).getHandlers().put("option:wear", this); + // guild + ObjectDefinition.forId(24357).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(10558).getHandlers().put("option:open", this); + ObjectDefinition.forId(10560).getHandlers().put("option:climb-up", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Dragon Slayer"); + final int id = node instanceof Item ? ((Item) node).getId() : node instanceof GameObject ? ((GameObject) node).getId() : ((NPC) node).getId(); + switch (id) { + case 10560: + ClimbActionHandler.climb(player, new Animation(828), Location.create(3191, 3355, 0)); + break; + case 10558: + ClimbActionHandler.climb(player, new Animation(-1), Location.create(3189, 9758, 0)); + return true; + case 1755: + if (player.getLocation().withinDistance(Location.create(2939, 9656, 0))) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(2939, 3256, 0)); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + } + break; + case 24357: + if (player.getLocation().getDistance(Location.create(3188, 3358, 0)) < 3) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(3188, 3354, 1)); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, "climb-up"); + } + break; + case 1127: + case 1135: + case 2653: + case 2661: + case 2669: + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) != 100) { + player.getPacketDispatch().sendMessage("You need to complete the Dragon Slayer Quest in order to wear this."); + return true; + } + EquipHandler.SINGLETON.handle(player, node, option); + break; + case 742: + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 40 && (player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD) || player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD))) { + player.getPacketDispatch().sendMessage("You have already slain the dragon. Now you just need to return to Oziach for"); + player.getPacketDispatch().sendMessage("your reward!"); + return true; + } + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) > 40) { + player.getPacketDispatch().sendMessage("You have already slain Elvarg the dragon."); + return true; + } + player.getPulseManager().clear("interaction:attack:" + node.hashCode()); + player.getProperties().getCombatPulse().attack(node); + player.face((Entity) node); + break; + case 25161: + if (player.getLocation().getX() >= 2847) { + ForceMovement movement = new ForceMovement(player, player.getLocation(), player.getLocation().transform(player.getLocation().getX() == 2845 ? 2 : -2, 0, 0), new Animation(839)); + movement.run(player, 10); + return true; + } + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 40 && (player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD) || player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD))) { + player.getPacketDispatch().sendMessage("You have already slain the dragon. Now you just need to return to Oziach for"); + player.getPacketDispatch().sendMessage("your reward!"); + return true; + } + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) > 40) { + player.getPacketDispatch().sendMessage("You have already slain the dragon."); + return true; + } + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 40 && !player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD)) { + ForceMovement movement = new ForceMovement(player, player.getLocation(), player.getLocation().transform(player.getLocation().getX() == 2845 ? 2 : -2, 0, 0), new Animation(839)); + movement.run(player, 10); + if (player.getLocation().getX() <= 2845) { + List npcs = RegionManager.getLocalNpcs(player); + for (NPC n : npcs) { + if (n.getId() == 742) { + n.getProperties().getCombatPulse().attack(player); + return true; + } + } + } + } + break; + case 25213: + ClimbActionHandler.climb(player, new Animation(828), new Location(2834, 3258, 0)); + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 2); + break; + case 2606: + if (player.getLocation().getY() < 9600 && !player.getSavedData().getQuestData().getDragonSlayerAttribute("memorized") && player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) != 100) { + player.getPacketDispatch().sendMessage("The door is securely locked."); + } else { + if (!player.getSavedData().getQuestData().getDragonSlayerAttribute("memorized")) { + player.getPacketDispatch().sendMessage("You found a secret door."); + player.getPacketDispatch().sendMessage("You remember where the secret door is for future reference."); + } + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 1); + player.getSavedData().getQuestData().setDragonSlayerAttribute("memorized", true); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } + break; + case 25154: + ClimbActionHandler.climb(player, new Animation(828), new Location(2833, 9658, 0)); + break; + case 25036: + case 2589: + if (player.getSavedData().getQuestData().getDragonSlayerAttribute("memorized")) { + player.getDialogueInterpreter().sendDialogue("You don't need to mess about with broken ships now that you have", "found the secret passage from Karamja."); + return true; + } + if (!player.getInventory().containsItem(DragonSlayer.NAILS)) { + player.getDialogueInterpreter().sendDialogue("You need 30 steel nails to attach the plank with."); + return true; + } + if (!player.getInventory().containsItem(DragonSlayer.PLANK)) { + player.getDialogueInterpreter().sendDialogue("You'll need to use wooden planks on this hole to patch it up."); + return true; + } + if (!player.getInventory().containsItem(DragonSlayer.HAMMER)) { + player.getDialogueInterpreter().sendDialogue("You need a hammer to force the nails in with."); + return true; + } + if (player.getInventory().remove(DragonSlayer.NAILS) && player.getInventory().remove(DragonSlayer.PLANK)) { + player.lock(2); + player.animate(HAMMER_ANIM); + player.getSavedData().getQuestData().setDragonSlayerPlanks(player.getSavedData().getQuestData().getDragonSlayerPlanks() + 1); + if (player.getSavedData().getQuestData().getDragonSlayerPlanks() < 3) { + player.getDialogueInterpreter().sendDialogue("You nail a plank over the hole, but you still need more planks to", "close the hole completely."); + } else { + player.getSavedData().getQuestData().setDragonSlayerAttribute("repaired", true); + player.getConfigManager().set(177, 1967876); + player.getDialogueInterpreter().sendDialogue("You nail a final plank over the hole. You have successfully patched", "the hole in the ship."); + } + } + break; + case 1538: + player.getInterfaceManager().open(DragonSlayer.MAP_COMPONENT); + break; + case 745: + if (option.equals("attack")) { + player.getPulseManager().clear("interaction:attack:" + node.hashCode()); + player.getProperties().getCombatPulse().attack(node); + return true; + } + player.getDialogueInterpreter().open(745, ((NPC) node)); + break; + case 1535:// maze map piece. + player.getDialogueInterpreter().sendItemMessage(1535, "This is a piece of map that you found in Melzar's Maze. You will need to join it to the other two map pieces before you can see the route to Crandor."); + break; + case 1536: + player.getDialogueInterpreter().sendItemMessage(1536, "This is a piece of map that you got from Wormbrain, the goblin thief. You will need to join it to the other two map pieces before you can see the route to Crandor."); + break; + case 1537:// magic map piece. + player.getDialogueInterpreter().sendItemMessage(1537, "This is a piece of map that you found in a secret chest in the Dwarven Mine. You will need to join it to the other two map pieces before you can see the route to Crandor."); + break; + case 2587: + if (!player.getInventory().containsItem(DragonSlayer.MAGIC_PIECE) && !player.getBank().containsItem(DragonSlayer.MAGIC_PIECE)) { + player.getDialogueInterpreter().open(3802875); + } else { + player.getPacketDispatch().sendMessage("You already have the map piece."); + } + break; + case 25115:// magic door. + DragonSlayer.handleMagicDoor(player, true); + return true; + case 747:// oziach. + switch (quest.getStage(player)) { + case 100: + node.asNpc().openShop(player); + break; + case 20: + case 30: + case 40: + case 15: + case 10: + player.getDialogueInterpreter().open(((NPC) node).getId(), ((NPC) node), true); + break; + default: + player.getDialogueInterpreter().sendDialogues(((NPC) node), null, "I ain't got nothing to sell ye, adventurer. Leave me be!"); + break; + } + break; + default: + handleMelzarMaze(player, node, option, id, quest); + break; + } + return true; + } + + /** + * Method used to handle the melzar maze nodes. + * @param player the player. + * @param node the node. + * @param option the option. + * @param id the id. + * @param quest the quest. + * @return True if so. + */ + private final boolean handleMelzarMaze(final Player player, final Node node, final String option, final int id, final Quest quest) { + switch (id) { + case 2603: + player.getPacketDispatch().sendMessage("You open the chest."); + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(2604)); + break; + case 2605: + ClimbActionHandler.climb(player, new Animation(827), Location.create(2933, 9640, 0)); + break; + case 2604: + switch (option) { + case "search": + if (!player.getInventory().containsItem(DragonSlayer.MAZE_PIECE) && !player.getInventory().containsItem(DragonSlayer.MAZE_PIECE)) { + if (!player.getInventory().add(DragonSlayer.MAZE_PIECE)) { + GroundItemManager.create(DragonSlayer.MAZE_PIECE, player); + } + player.getDialogueInterpreter().sendItemMessage(DragonSlayer.MAZE_PIECE.getId(), "You find a map piece in the chest."); + } else { + player.getPacketDispatch().sendMessage("You find nothing in the chest."); + } + break; + case "close": + player.getPacketDispatch().sendMessage("You shut the chest."); + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(2603)); + break; + } + break; + case 2601:// green door. + if (!player.getInventory().containsItem(DragonSlayer.GREEN_KEY)) { + player.getPacketDispatch().sendMessage("This door is securely locked."); + } else { + player.getInventory().remove(DragonSlayer.GREEN_KEY); + player.getPacketDispatch().sendMessage("The key disintegrates as it unlocks the door."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + break; + case 2600:// purple door. + if (!player.getInventory().containsItem(DragonSlayer.PURPLE_KEY)) { + player.getPacketDispatch().sendMessage("This door is securely locked."); + } else { + player.getInventory().remove(DragonSlayer.PURPLE_KEY); + player.getPacketDispatch().sendMessage("The key disintegrates as it unlocks the door."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + break; + case 2599:// blue door. + if (!player.getInventory().containsItem(DragonSlayer.BLUE_KEY)) { + player.getPacketDispatch().sendMessage("This door is securely locked."); + } else { + player.getInventory().remove(DragonSlayer.BLUE_KEY); + player.getPacketDispatch().sendMessage("The key disintegrates as it unlocks the door."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + break; + case 2598:// yellow door. + if (!player.getInventory().containsItem(DragonSlayer.YELLOW_KEY)) { + player.getPacketDispatch().sendMessage("This door is securely locked."); + } else { + player.getInventory().remove(DragonSlayer.YELLOW_KEY); + player.getPacketDispatch().sendMessage("The key disintegrates as it unlocks the door."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + break; + case 25045: + if (player.getLocation().getDistance(new Location(2925, 3259, 1)) < 3) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(2924, 3258, 0)); + return true; + } + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + case 1747:// ladder with wrong spawn. + if (player.getLocation().getDistance(new Location(2940, 3256, 1)) < 3) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(2940, 3256, 2)); + return true; + } + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + case 25214:// trapdoor. + player.getPacketDispatch().sendMessage("The trapdoor can only be opened from below."); + break; + case 25038:// melzar's maze trapdoor ladder + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + case 1752: + player.getPacketDispatch().sendMessage("The ladder is broken, I can't climb it."); + break; + case 1746: + if (player.getLocation().getDistance(Location.create(2923, 3241, 1)) < 3) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(2923, 3241, 0)); + return true; + } + if (player.getLocation().getDistance(Location.create(2932, 3245, 2)) < 3) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(2932, 3245, 1)); + return true; + } + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + case 2596:// red door. + if (!player.getInventory().containsItem(DragonSlayer.RED_KEY)) { + player.getPacketDispatch().sendMessage("This door is securely locked."); + } else { + player.getInventory().remove(DragonSlayer.RED_KEY); + player.getPacketDispatch().sendMessage("The key disintegrates as it unlocks the door."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + break; + case 2597:// orange door. + if (!player.getInventory().containsItem(DragonSlayer.ORANGE_KEY)) { + player.getPacketDispatch().sendMessage("This door is securely locked."); + } else { + player.getInventory().remove(DragonSlayer.ORANGE_KEY); + player.getPacketDispatch().sendMessage("The key disintegrates as it unlocks the door."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + case 32968: + case 2602: + if (player.getLocation().equals(new Location(2931, 9640, 0))) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + if (player.getLocation().equals(new Location(2927, 9649, 0))) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + if (player.getLocation().equals(Location.create(2924, 9654, 0)) || player.getLocation().equals(Location.create(2938, 3252, 0))) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + player.getPacketDispatch().sendMessage("The door is locked."); + break; + case 2595: + if (player.getLocation().equals(Location.create(2940, 3248, 0))) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + if (player.getInventory().containsItem(DragonSlayer.MAZE_KEY)) { + player.getPacketDispatch().sendMessage("You use the key and the door opens."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } else { + player.getPacketDispatch().sendMessage("This door is securely locked."); + } + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + GameObject obj = (GameObject) n; + if (obj.getId() == 25115) { + if (node.getLocation().getX() <= 3049) { + return Location.create(3049, 9840, 0); + } else { + return Location.create(3051, 9840, 0); + } + } else if (obj.getId() == 2587) { + return Location.create(3056, 9841, 0); + } + } else if (n instanceof NPC) { + NPC npc = ((NPC) n); + if (npc.getId() == 745) { + return Location.create(3012, 3188, 0); + } + } + return null; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public boolean isWalk(final Player player, Node node) { + return !(node instanceof Item); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DukeHoracioDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DukeHoracioDialogue.java new file mode 100644 index 000000000..e196ce9fd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/DukeHoracioDialogue.java @@ -0,0 +1,552 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.tools.Items; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the duke horacio + * @author 'Vexia + * @version 1.0 + */ +public final class DukeHoracioDialogue extends DialoguePlugin { + + /** + * Represents the air talisman item. + */ + private static final Item TALISMAN = new Item(1438); + + private static final NPC Sigmund = new NPC(2082); + + /** + * Constructs a new {@code DukeHoracioDialogue} {@code Object}. + */ + public DukeHoracioDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DukeHoracioDialogue} {@code Object}. + * + * @param player the player. + */ + public DukeHoracioDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[]{741}; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) >= 20 + && !player.getInventory().containsItem(DragonSlayer.SHIELD) + && !player.getBank().containsItem(DragonSlayer.SHIELD) && !player.getEquipment().containsItem(DragonSlayer.SHIELD)) { + switch (stage) { + case 0: + player("I seek a shield that will protect me from dragonbreath."); + stage = 400; + break; + case 400: + npc("A knight going on a dragon quest, hmm? What", "dragon do you intend to slay?"); + stage = 401; + break; + case 401: + player("Elvarg, the dragon of Crandor island!"); + stage = 402; + break; + case 402: + npc("Elvarg? Are you sure?"); + stage = 403; + break; + case 403: + player("Yes!"); + stage = 404; + break; + case 404: + npc("Well, you're a braver man than I!"); + stage = 405; + break; + case 405: + player("Why is everyone scared of this dragon?"); + stage = 406; + break; + case 406: + npc("Back in my father's day, Crandor was an important", "city-state. Politically, it was important as Falador or", "Varrock and its shipes traded with every port."); + stage = 407; + break; + case 407: + npc("But, one day when I was little, all contact was lost. The", "trading ships and diplomatic envoys just stopped", "coming."); + stage = 408; + break; + case 408: + npc("I remember my father being very scared. He posted", "lookouts on the roof to warn if the dragon was", "approaching. All the city rulers worried that", "Elvarg would devastate the whole continent."); + stage = 409; + break; + case 409: + player("So, are you going to give me the shield or not?"); + stage = 410; + break; + case 410: + npc("If you really think you're up to it then perhaphs you", "are the one who can kill this dragon."); + stage = 411; + break; + case 411: + if (!player.getInventory().add(DragonSlayer.SHIELD)) { + GroundItemManager.create(DragonSlayer.SHIELD, player); + } + interpreter.sendItemMessage(DragonSlayer.SHIELD, "The Duke hands you a heavy orange shield."); + // Obtain an Anti-dragonbreath shield from Duke Horacio + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 5); + stage = 412; + break; + } + return true; + } + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 20) { + switch (stage) { + case 412: + npc("Take care out there. If you kill it..."); + stage = 413; + return true; + case 413: + npc("If you kill it, for Saradomin's sake make sure it's really", "dead!"); + stage = 414; + return true; + case 414: + end(); + return true; + } + } + final Quest quest = player.getQuestRepository().getQuest("Rune Mysteries"); + switch (stage) { + case 0: + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 100 && !player.getInventory().containsItem(DragonSlayer.SHIELD) && !player.getBank().containsItem(DragonSlayer.SHIELD)) { + interpreter.sendOptions("Select an Option", "I seek a shield that will protect me from dragonbreath.", "Have you any quests for me?", "Where can I find money?"); + stage = -5; + return true; + } else if(player.getQuestRepository().getQuest("Lost Tribe").getStage(player) == 20){ + interpreter.sendOptions("Select an Option","Have you any quests for me?","Where can I find money?","I know what happened in the cellar."); + stage = -10; + return true; + } else if(player.getQuestRepository().getQuest("Lost Tribe").getStage(player) == 30 && player.getInventory().containsItem(new Item(Items.BROOCH_5008))){ + options("Have you any quests for me?","Where can I find money?","I found something in the rubble."); + stage = -15; + return true; + } else if(player.getQuestRepository().getQuest("Lost Tribe").getStage(player) == 44){ + options("Have you any quests for me?","Where can I find money?","I spoke with the goblin generals."); + stage = -20; + return true; + } else if(player.getQuestRepository().getQuest("Lost Tribe").getStage(player) == 46){ + options("Have you any quests for me?","Where can I find money?","I made contact with the Dorgeshuun."); + stage = -25; + return true; + } else if(player.getQuestRepository().getQuest("Lost Tribe").getStage(player) == 49 && player.getInventory().contains(Items.SILVERWARE_5011,1)){ + options("Have you any quests for me?","Where can I find money?","I found the silverware."); + stage = -30; + return true; + } + + else { + interpreter.sendOptions("Select an Option", "Have you any quests for me?", "Where can I find money?"); + } + stage = 1; + break; + case -5: + switch (buttonId) { + case 1: + stage = 800; + handleShield(buttonId); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have any quests for me?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I hear many of the local people earn money by", "learning a skill. Many people get by in life by becoming", "accomplished smiths, cooks, miners and woodcutters."); + stage = 30; + break; + } + break; + case -10: + switch(buttonId){ + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have any quests for me?"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I hear many of the local people earn money by", "learning a skill. Many people get by in life by becoming", "accomplished smiths, cooks, miners and woodcutters."); + stage = 30; + break; + case 3: + NPC witness = new NPC(player.getAttribute("tlt-witness",0)); + player(witness.getName() + " says he saw something in the cellar.","Like a goblin with big eyes."); + stage = 500; + break; + } + break; + case -15: + switch(buttonId){ + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have any quests for me?"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I hear many of the local people earn money by", "learning a skill. Many people get by in life by becoming", "accomplished smiths, cooks, miners and woodcutters."); + stage = 30; + break; + case 3: + player("I dug through the rubble in the cellar and found a","tunnel!"); + stage = 520; + break; + } + break; + case -20: + switch(buttonId){ + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have any quests for me?"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I hear many of the local people earn money by", "learning a skill. Many people get by in life by becoming", "accomplished smiths, cooks, miners and woodcutters."); + stage = 30; + break; + case 3: + player("I spoke to the goblin generals in the goblin village. They","told me about an ancient goblin tribe that went to live","underground."); + stage = 540; + break; + } + break; + case -25: + switch(buttonId){ + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have any quests for me?"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I hear many of the local people earn money by", "learning a skill. Many people get by in life by becoming", "accomplished smiths, cooks, miners and woodcutters."); + stage = 30; + break; + case 3: + player("I've made contact with the cave goblins. They say they","were following a seam and broke into the cellar by","mistake."); + stage = 550; + break; + } + break; + case -30: + switch(buttonId){ + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have any quests for me?"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I hear many of the local people earn money by", "learning a skill. Many people get by in life by becoming", "accomplished smiths, cooks, miners and woodcutters."); + stage = 30; + break; + case 3: + player("I found the missing silverware in the HAM cave!"); + stage = 560; + break; + } + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Have any quests for me?"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I hear many of the local people earn money by learning a", "skill. Many people get by in life by becoming accomplished", "smiths, cooks, miners and woodcutters."); + stage = 30; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You haven't seem to have slain Elvarg yet!", "Once you have slain Elvarg come back and talk to me."); + stage = 11; + break; + case 20: + if (quest.getStage(player) == 10) { + interpreter.sendDialogues(npc, null, "The only task remotely approaching a quest is the", "delivery of the talisman I gave you to the head wizard", "of the Wizards' Tower,"); + stage = 1000; + break; + } + if (quest.getStage(player) > 10) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Nope, I've got everything under control", "in the castle at the moment."); + stage = 69; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, it's not really a quest but I recently discovered", "this strange talisman."); + stage = 21; + break; + case 69: + end(); + break; + case 1000: + interpreter.sendDialogues(npc, null, "south-west of here. I suggest you deliver it to him as", "soon as possible. I have the oddest feeling that is", "important..."); + stage = 1001; + break; + case 1001: + end(); + break; + case 21: + interpreter.sendDialogues(npc, null, "It seems to be mystical and I have never seen anything", "like it before. Would you take it to the head wizard at"); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, null, "the Wizards' Tower for me? It's just south-west of here", "and should not take you very long at all. I would be", "awfully grateful."); + stage = 23; + break; + case 23: + interpreter.sendOptions("Select an Option", "Sure, no problem.", "Not right now."); + stage = 24; + break; + case 24: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Sure, no problem."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, null, "Not right now."); + stage = 26; + break; + } + break; + case 100: + interpreter.sendDialogues(npc, null, "Thank you very much, stranger. I am sure the head", "wizard will reward you for such an interesting find."); + stage = 101; + break; + case 101: + interpreter.sendDialogue("The Duke hands you an " + Quest.BLUE + "air talisman."); + stage = 102; + break; + case 102: + quest.start(player); + player.getQuestRepository().syncronizeTab(player); + if (!player.getInventory().add(TALISMAN)) { + GroundItemManager.create(TALISMAN, player.getLocation(), player); + } + end(); + break; + case 26: + interpreter.sendDialogues(npc, null, "As you wish, stranger, although I have this strange", "feeling that it is important. Unfortunately, I cannot", "leave my castle unattended."); + stage = 27; + break; + case 27: + end(); + break; + case 30: + end(); + break; + case 500: + npc("Yes, he mentioned that to me. But I think he was","imagining things. Goblins live in natural caves but","everyone knows they don't have the wit to make their","own tunnels."); + stage++; + break; + case 501: + sendNormalDialogue(Sigmund,FacialExpression.ANGRY,"Yes your grace, but if there is any possibility that this","is a goblin incursion then we should take that possibility","very seriously!"); + stage++; + break; + case 502: + player("I think we should at least investigate."); + stage++; + break; + case 503: + sendNormalDialogue(Sigmund,FacialExpression.WORRIED,"Your grace, I think you should listen to " + (player.isMale() ? "him" : "her") + "."); + stage++; + break; + case 504: + npc("Hmm, very well. I give you permission to investigate","this mystery. If there is a blocked tunnel then perhaps","you should try to un-block it."); + player.getQuestRepository().getQuest("Lost Tribe").setStage(player,30); + stage++; + break; + case 505: + end(); + break; + case 520: + player("On the ground I found this brooch."); + stage++; + break; + case 521: + npc("I've never seen anything like that before. It doesn't","come from Lumbridge. What do you think, Sigmund?"); + stage++; + break; + case 522: + sendNormalDialogue(Sigmund,FacialExpression.WORRIED,"It is unknown to me, your grace. But the fact it is","there is enough to prove the Cook's story. It must have","been dropped by a goblin as it fled."); + stage++; + break; + case 523: + npc("I've never heard of a goblin wearing something so well-","crafted."); + stage++; + break; + case 524: + sendNormalDialogue(Sigmund,FacialExpression.ANGRY,"Then it must have been stolen!"); + stage++; + break; + case 525: + npc("But it wasn't stolen from us. Where could it be from?"); + stage++; + break; + case 526: + sendNormalDialogue(Sigmund,FacialExpression.ANGRY,"That doesn't matter! You said yourself that goblins","couldn't have made that, so they must have stolen it","from somewhere."); + stage++; + break; + case 527: + sendNormalDialogue(Sigmund,FacialExpression.ANGRY,"Horrible, thieving goblins have broken into our cellar!","We must retaliate immediately!"); + stage++; + break; + case 528: + sendNormalDialogue(Sigmund,FacialExpression.ANGRY,"First we should wipe out the goblins east of the river,","then we can march on the goblin village to the north-","west..."); + stage++; + break; + case 529: + npc("I will not commit troops until I have proof that goblins","are behind this."); + stage++; + break; + case 530: + npc(player.getName() + ", please find out what you can about this","brooch. The librarian in Varrock might be able to help","identify the symbol."); + player.getQuestRepository().getQuest("Lost Tribe").setStage(player,40); + stage++; + break; + case 531: + end(); + break; + case 540: + sendNormalDialogue(Sigmund,FacialExpression.ANGRY,"What more proof do we need? Nasty, smelly goblins","have been living under our feet all this time! We must","crush them at once!"); + stage++; + break; + case 541: + npc("Hmm, perhaps you are right. I will send word to the","army to prepare for an underground assault."); + stage++; + break; + case 542: + npc(player.getName() + ", I would still like you to find out more","about this tribe. It cannot hurt to know one's enemy."); + player.getQuestRepository().getQuest("Lost Tribe").setStage(player,45); + stage++; + break; + case 543: + end(); + break; + case 550: + sendNormalDialogue(Sigmund,FacialExpression.ANGRY,"And I suppose you believe them, goblin lover?"); + stage++; + break; + case 551: + player("Well, they seemed friendlier than most goblins, and","nothing was taken from the cellar."); + stage++; + break; + case 552: + npc("Actually, something was taken. Sigmund has informed","me that some of the castle silverware is missing from","the cellar."); + stage++; + break; + case 553: + npc("Unless it is returned, I am afraid I will have no option","but war."); + player.getQuestRepository().getQuest("Lost Tribe").setStage(player,47); + stage++; + break; + case 554: + end(); + break; + case 560: + npc("Sigmund! Is this your doing?"); + stage++; + break; + case 561: + sendNormalDialogue(Sigmund,FacialExpression.WORRIED,"Of...of course not! The goblins must have, um, dropped","the silverware as they ran away."); + stage++; + break; + case 562: + npc("Don't lie to me! I knew you were a HAM member but","I didn't think you would stoop to this. You are","dismissed from my service."); + stage++; + break; + case 563: + sendNormalDialogue(Sigmund,FacialExpression.THINKING,"But don't you see it was for the best? For goblins to be","living under our feet like this... ugh. It doesn't matter","how civilised they are: all sub-human species must be","wiped out!"); + stage++; + break; + case 564: + npc("That's enough! Get out of my castle now!"); + stage++; + break; + case 565: + npc("I see I was ill-advised. Unless there is an act of","aggression by the cave goblins there is no need for war."); + stage++; + break; + case 566: + interpreter.sendItemMessage(Items.PEACE_TREATY_5012,"The Duke writes a document and signs it."); + stage++; + break; + case 567: + npc("This peace treaty specifies the border between","Lumbridge and the Cave Goblin realm. Please take it to","the cave goblins and tell them I would like to meet with","their leader to sign it."); + player.getInventory().add(new Item(Items.PEACE_TREATY_5012)); + player.getQuestRepository().getQuest("Lost Tribe").setStage(player,50); + player.varpManager.get(465).setVarbit(0,9).send(player); + stage++; + break; + case 568: + end(); + break; + default: + handleShield(buttonId); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DukeHoracioDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings. Welcome to my castle."); + stage = 0; + // Speak to the Duke of Lumbridge + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 2); + return true; + } + + public void handleShield(int buttonId) { + switch (stage) { + case 800: + player("I seek a shield that will protect me from dragonbreath."); + stage = 801; + break; + case 801: + npc("A knight going on a dragon quest, hmm? What", "dragon do you intend to slay?"); + stage = 802; + break; + case 802: + player("Oh, no dragon in particular. I just feel like killing a", "dragon."); + stage = 803; + break; + case 803: + npc("Of course. Now you've slain Elvarg, you've earned", "the right to call the shield your own!"); + stage = 804; + break; + case 804: + if (!player.getInventory().add(DragonSlayer.SHIELD)) { + GroundItemManager.create(DragonSlayer.SHIELD, player); + } + interpreter.sendItemMessage(DragonSlayer.SHIELD, "The Duke hands you the shield."); + // Obtain an Anti-dragonbreath shield from Duke Horacio + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 5); + stage = 805; + break; + case 805: + end(); + break; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/ElvargNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/ElvargNPC.java new file mode 100644 index 000000000..e28a4da9c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/ElvargNPC.java @@ -0,0 +1,325 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.combat.equipment.FireType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the elvarg npc. + * @author 'Vexia + * @version 1.0 + */ +public final class ElvargNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 742 }; + + /** + * Represents the animations to use. + */ + private static final Animation[] ANIMATIONS = new Animation[] { new Animation(6654), new Animation(6655) }; + + /** + * Represents the combat swing handler. + */ + private final CombatSwingHandler combatHandler = new ElvargCombatSwingHandler(); + + /** + * Constructs a new {@code MeldarMadNPC} {@code Object}. + */ + public ElvargNPC() { + super(0, null); + } + + /** + * Constructs a new {@code MeldarMadNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private ElvargNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ElvargNPC(id, location); + } + + @Override + public void commenceDeath(Entity killer) { + final Direction direction = Direction.getLogicalDirection(getLocation(), killer.getLocation()); + GameWorld.getPulser().submit(new Pulse(1, this) { + @Override + public boolean pulse() { + faceLocation(getCenterLocation().transform(direction.getStepX() * 3, direction.getStepY() * 3, 0)); + return true; + } + }); + setDirection(direction); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + final GameObject object = new GameObject(25202, getLocation(), getRotation()); + ObjectBuilder.add(object); + killer.faceLocation(object.getCenterLocation()); + killer.lock(); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + counter++; + if (counter == 1) { + killer.animate(ANIMATIONS[0]); + } else if (counter == 4) { + final Player player = ((Player) killer); + ObjectBuilder.replace(object, object.transform(25203)); + if (!player.getInventory().add(DragonSlayer.ELVARG_HEAD)) { + GroundItemManager.create(DragonSlayer.ELVARG_HEAD, player); + } + killer.animate(ANIMATIONS[1]); + killer.unlock(); + } else if (counter == 12) { + ObjectBuilder.remove(RegionManager.getObject(object.getLocation())); + return true; + } + return false; + } + + }); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatHandler; + } + + @Override + public int[] getIds() { + return ID; + } + + /** + * Method used to get the rotation. + * @return the rotation. + */ + public int getRotation() { + switch (getDirection()) { + case EAST: + return 3; + case NORTH: + return 2; + case WEST: + return 1; + case SOUTH: + return 0; + default: + break; + } + return 0; + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (!(entity instanceof Player)) { + return super.isAttackable(entity, style); + } + final Player player = (Player) entity; + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 40 && (player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD) || player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD))) { + player.getPacketDispatch().sendMessage("You have already slain the dragon. Now you just need to return to Oziach for"); + player.getPacketDispatch().sendMessage("your reward!"); + return true; + } + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) > 40) { + player.getPacketDispatch().sendMessage("You have already slain Elvarg."); + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public int getDragonfireProtection(boolean fire) { + return 0x2 | 0x4 | 0x8; + } + + /** + * Handles the elvarg combat swing handler. + * @author Emperor + */ + static class ElvargCombatSwingHandler extends CombatSwingHandler { + + /** + * The style. + */ + private CombatStyle style = CombatStyle.RANGE; + + /** + * The melee attack animation. + */ + private static final Animation MELEE_ATTACK = new Animation(80, Priority.HIGH); + + /** + * The fire type. + */ + private final FireType fireType = FireType.FIERY_BREATH; + + /** + * Constructs a new {@code KBDCombatSwingHandler} {@Code Object}. + * The combat style. + */ + public ElvargCombatSwingHandler() { + super(CombatStyle.RANGE); + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + if (style == CombatStyle.RANGE) { + fireType.getTask().exec(victim, entity); + if (victim.hasProtectionPrayer(CombatStyle.MAGIC)) { + state.setEstimatedHit((int) (state.getEstimatedHit() * 0.6)); + } + state.setEstimatedHit(formatHit(victim, state.getEstimatedHit())); + return; + } + style.getSwingHandler().adjustBattleState(entity, victim, state); + } + + @Override + public int calculateAccuracy(Entity entity) { + if (style == CombatStyle.MELEE) { + return style.getSwingHandler().calculateAccuracy(entity); + } + return 600; + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return style.getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + if (style == CombatStyle.MELEE) { + return style.getSwingHandler().calculateHit(entity, victim, modifier); + } + int max = 56; + int damage = max; + if (victim instanceof Player) { + int val = victim.getDragonfireProtection(true); + if ((val & 0x2) != 0) { + damage *= 0.5; + } + if ((val & 0x4) != 0) { + damage -= (int) (damage * 0.85); + } + if ((val & 0x6) != 0) { + damage *= 0.6; + } + if (damage < 3) { + damage = 3; + } + } + if (fireType != FireType.FIERY_BREATH) { + damage += 11; + } + return damage; + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + if (!isProjectileClipped(entity, victim, false)) { + return InteractionType.NO_INTERACT; + } + if (victim.getCenterLocation().withinDistance(entity.getCenterLocation(), getCombatDistance(entity, victim, 9)) && super.canSwing(entity, victim) != InteractionType.NO_INTERACT) { + entity.getWalkingQueue().reset(); + return InteractionType.STILL_INTERACT; + } + return InteractionType.NO_INTERACT; + } + + @Override + public ArmourSet getArmourSet(Entity e) { + return style.getSwingHandler().getArmourSet(e); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return style.getSwingHandler().getSetMultiplier(e, skillId); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + style.getSwingHandler().impact(entity, victim, state); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + style = CombatStyle.RANGE; + int hit = 0; + int ticks = 1; + if (victim.getCenterLocation().withinDistance(entity.getCenterLocation(), getCombatDistance(entity, victim, 1)) && RandomFunction.random(10) < 7) { + style = CombatStyle.MELEE; + } else { + ticks += (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3); + } + state.setStyle(style); + if (isAccurateImpact(entity, victim)) { + int max = calculateHit(entity, victim, 1.0); + state.setMaximumHit(max); + hit = RandomFunction.random(max); + } + state.setEstimatedHit(hit); + return ticks; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + switch (style) { + case MELEE: + entity.animate(MELEE_ATTACK); + break; + case RANGE: + Projectile.ranged(entity, victim, 450, 20, 36, 50, 15).send(); + entity.animate(fireType.getAnimation()); + break; + default: + break; + } + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + style.getSwingHandler().visualizeImpact(entity, victim, state); + if (style != CombatStyle.MELEE && victim instanceof Player) { + Player p = (Player) victim; + p.getPacketDispatch().sendMessage(getDragonfireMessage(victim.getAttribute("fire_resistance", 0), fireType.name().toLowerCase().replaceAll("_", " "))); + p.graphics(new Graphics(346, 100, 1)); + } + } + + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/GuildmasterDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/GuildmasterDialogue.java new file mode 100644 index 000000000..548ddf8d4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/GuildmasterDialogue.java @@ -0,0 +1,491 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; + +/** + * Represents the guild master dialogue at the champions guild related to dragon slayer. + * @author Vexia + * + */ +public final class GuildmasterDialogue extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code GuildmasterDialogue} {@code Object}. + */ + public GuildmasterDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GuildmasterDialogue} {@code Object}. + * @param player the player. + */ + public GuildmasterDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GuildmasterDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getQuestRepository().getPoints() < 32) { + return true; + } + quest = player.getQuestRepository().getQuest("Dragon Slayer"); + npc("Greetings!"); + if (quest.getStage(player) == 10) { + stage = 0; + } else { + stage = 1; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 30: + end(); + break; + case 40: + end(); + break; + case 100: + switch (stage) { + case 1: + options("What is this place?", "Can I have another key to Melzar's Maze?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + handleDescription(buttonId); + break; + case 2: + player("Can I have another key to Melzar's Maze?"); + stage = 20; + break; + } + break; + case 99: + end(); + break; + case 20: + if (!player.getInventory().containsItem(DragonSlayer.MAZE_KEY) && !player.getBank().containsItem(DragonSlayer.MAZE_KEY)) { + if (!player.getInventory().add(DragonSlayer.MAZE_KEY)) { + GroundItemManager.create(DragonSlayer.MAZE_KEY, player); + } + interpreter.sendItemMessage(DragonSlayer.MAZE_KEY.getId(), "The Guildmaster hands you a key."); + stage = 21; + break; + } + npc("I think you've already got a key."); + stage = 21; + break; + case 21: + end(); + break; + } + break; + case 20: + switch (stage) { + case 1: + player("About my quest to kill the dragon..."); + stage = 2; + break; + case 2: + npc("If you're serious about taking on Elvarg, first you'll", "need to get to Crandor. The island is surrounded by", "dangerous reefs, so you'll need a ship capable of getting", "through them and a map to show you the way."); + stage = 3; + break; + case 3: + npc("When you reach Crandor, you'll also need some kind of", "protection against the dragon's breath."); + stage = 18; + break; + case 18: + options("How can I find the route to Crandor?", "Where can I find the right ship?", "How can I protect myself from the dragon's breath?", "What's so special about this dragon?", "Okay, I'll get going."); + stage = 19; + break; + case 19: + switch (buttonId) { + case 1: + player("How can I find the route to Crandor?"); + stage = 100; + break; + case 2: + player("Where can I find the right ship?"); + stage = 110; + break; + case 3: + player("How can I protect myself from the dragon's breath?"); + stage = 120; + break; + case 4: + player("What's so special about this dragon?"); + stage = 130; + break; + case 5: + player("Okay, I'll get going."); + stage = 140; + break; + } + break; + case 100: + npc("Only one map exists that shows the route through the", "reefs of Crandor. That map was split into three pieces", "by Melzar, Thalzar and Lozar, the wizards who escaped", "from the dragon. Each of them took one piece."); + stage = 101; + break; + case 101: + options("Where is Melzar's map piece?", "Where is Thalzar's map piece?", "Where is Lozar's map piece?"); + stage = 102; + break; + case 102: + switch (buttonId) { + case 1: + player("Where is Melzar's map piece?"); + stage = 1000; + break; + case 2: + player("Where is Thalzar's map piece?"); + stage = 1020; + break; + case 3: + player("Where is Lozar's map piece?"); + stage = 1030; + break; + } + break; + case 1000: + npc("Melzar built a castle on the site of the Crandorian", "refugee camp, north of Rimmington. He's locked himself", "in there and no one's seen him for years."); + stage = 1001; + break; + case 1001: + npc("The inside of his castle is like a maze, and is populated", "by undead monsters. Maybe, if you could get all the", "way through the maze, you could find his piece of the", "map."); + if (player.getInventory().containsItem(DragonSlayer.MAZE_KEY) || player.getBank().containsItem(DragonSlayer.MAZE_KEY)) { + stage = 1004; + return true; + } + stage = 1002; + break; + case 1002: + npc("Adventurers sometimes go in there to prove themselves,", "so I can give you this key to Melzar's Maze."); + stage = 1003; + break; + case 1003: + if (!player.getInventory().add(DragonSlayer.MAZE_KEY)) { + GroundItemManager.create(DragonSlayer.MAZE_KEY, player); + } + interpreter.sendItemMessage(DragonSlayer.MAZE_KEY.getId(), "The Guildmaster hands you a key."); + stage = 1004; + break; + case 1004: + end(); + break; + case 1020: + npc("Thalzar was the most paranoid of the three wizards. He", "hid his map piece and took the secret of its location to", "his grave."); + stage = 1021; + break; + case 1021: + npc("I don't think you'll be able to find out where it is by", "ordinary means. You'll need to talk to the Oracle on", "Ice Mountain."); + stage = 1022; + break; + case 1022: + end(); + break; + case 1030: + npc("A few weeks ago, I'd have told you to speak to Lozar", "herself, in her house across the river from Lumbridge."); + stage = 1031; + break; + case 1031: + npc("Unfortunately, goblin raiders killed her and stole", "everything. One of the goblins from the Goblin Village", "probably has the map piece now."); + stage = 1032; + break; + case 1032: + end(); + break; + case 110: + npc("Even if you find the right route, only a ship made to", "the old crandorian design would be able to navigate", "through the reefs to the island."); + stage = 111; + break; + case 111: + npc("If there's still one in existence, it's probably in Port", "Sarim."); + stage = 112; + break; + case 112: + npc("Then, of course, you'll need to find a captain willy to", "sail to Crandor, and I'm not sure where you'd find one", "of them!"); + stage = 113; + break; + case 113: + end(); + break; + case 120: + npc("That part shouldn't be too different, actually. I believe", "the Duke of Lumbridge has a special shield in his", "armoury that is enchanted against dragon's breath."); + stage = 121; + break; + case 121: + end(); + break; + case 130: + npc("Thirty years ago, Candor was a thriving community", "with a great tradition of mages and adventurers. Many", "Crandorians even earned the right to be part of the", "Champions' Guild!"); + stage = 131; + break; + case 131: + npc("One of their adventurers went too far, however. He", "descended into the volcano in the centre of Crandor", "and woke the dragon Elvarg."); + stage = 132; + break; + case 132: + npc("He must have fought valiantly against the dragon", "because they say that, to this day, she has a scar down", "her side,"); + stage = 133; + break; + case 133: + npc("but the dragon still won the fight. She emerged and laid", "waste to the whole of Crandor with her fire breath!"); + stage = 134; + break; + case 134: + npc("Some refugees managed to escape in fishing boats.", "They landed on the coast, north of Rimmington, and", "set up camp but the dragon followed them and burned", "the camp to the ground."); + stage = 135; + break; + case 135: + npc("Out of all the people of Crandor there were only three", "survivors: a trio of wizards who used magic to escape.", "Their names were Thalzar, Lozar and Melzar."); + stage = 140; + break; + case 136: + npc("If you're serious about taking on Elvarg, first you'll", "need to get to Crandor. The island is surrounded by", "dangerous reefs, so you'll need a ship capable of getting", "through them and a map to show you the way."); + stage = 17; + break; + case 140: + end(); + break; + case 99: + end(); + break; + } + break; + case 15: + switch (stage) { + case 1: + options("What is this place?", "I talked to Oziach..."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + handleDescription(buttonId); + break; + case 2: + player("I talked to Oziach and he have me a quest."); + stage = 3; + break; + } + break; + case 3: + npc("Oh? What did he tell you to do?"); + stage = 4; + break; + case 4: + player("Defeat the dragon of Crandor."); + stage = 5; + break; + case 5: + npc("The dragon of Crandor?"); + stage = 7; + break; + case 7: + player("Um, yes..."); + stage = 8; + break; + case 8: + npc("Goodness, he hasn't given you an easy job, has he?"); + stage = 9; + break; + case 9: + player("What's so special about this dragon?"); + stage = 10; + break; + case 10: + npc("Thirty years ago, Crandor was a thriving community", "with a great tradition of mages and adventurers. Many", "Crandorians even earned the right to be part of the", "Champion's Guild!"); + stage = 11; + break; + case 11: + npc("One of their adventurers went too far, however. He", "descended into the volcano in the centre of Crandor", "and woke the dragon Elvarg."); + stage = 12; + break; + case 12: + npc("He must have fought valiantly against the dragon", "because they say that, to this day, she has a scar down", "her side,"); + stage = 13; + break; + case 13: + npc("but the dragon still won the fight. She emerged and laid", "waste to the whole of Crandor with her fire breath!"); + stage = 14; + break; + case 14: + npc("Some refuegees managed to escape in fishing boats.", "They landed on the coast, north of Rimmington, and", "set up camp but the dragon followed them and burned", "the camp to the ground."); + stage = 15; + break; + case 15: + npc("Out of all the people of Crandor there were only three", "surviors: a trio of wizards who used the magic to escape.", "Their names were Thalzar, Lozar and Melzar."); + stage = 16; + break; + case 16: + npc("If you're serious about taking on Elvarg, first you'll", "need to get to Crandor. The island is surrounded by", "dangerous reefs, so you'll need a ship capable of getting", "through them and a map to show you the way."); + stage = 17; + break; + case 17: + npc("When you reach Crandor, you'll also need some kind of", "protection against the dragon's breath."); + stage = 19; + break; + case 19: + player("Okay, I'll get going."); + stage = 20; + break; + case 20: + quest.setStage(player, 20); + end(); + break; + case 99: + end(); + break; + } + break; + case 10: + switch (stage) { + case 18: + end(); + break; + case 0: + npc("Have you gone to talk to Oziach yet?"); + stage = 1; + break; + case 1: + player("No, not yet."); + stage = 2; + break; + case 2: + npc("You can only begin your journey once you've", "spoken to Oziach who is located near Edgeville."); + stage = 3; + break; + case 3: + player("Okay, thanks."); + stage = 4; + break; + case 4: + end(); + break; + } + break; + case 0: + switch (stage) { + case 1: + options("What is this place?", "Can I have a quest?"); + stage = 10; + break; + case 10: + switch (buttonId) { + case 1: + handleDescription(buttonId); + break; + case 2: + player("Can I have a quest?"); + stage = 13; + break; + } + break; + case 11: + if (quest.getStage(player) == 10) { + npc("You're already on a quest for me, if I recall correctly.", "Have you talked to Oziach yet?"); + stage = 20; + return true; + } + npc("This is the Champions' Guild. Only adventurers who", "have proved themselves worthy by gaining influence", "from quests are allowed in here."); + stage = 12; + break; + case 12: + end(); + break; + case 13: + npc("Aha!"); + stage = 14; + break; + case 14: + npc("Yes! A mighty and perilous quest fit only for the most", "powerful champion! And, at the end of it, you will earn", "the right to wear the legendary rune platebody!"); + stage = 15; + break; + case 15: + player("So, what is this quest?"); + stage = 16; + break; + case 16: + npc("You'll have to speak to Oziach, the maker of rune", "armour. He sets the quests that champions must", "complete in order to wear it."); + stage = 17; + break; + case 17: + npc("Oziach lives in a hut, by the cliffs to the west of", "Edgeville. he can be a little...odd...sometimes, though."); + stage = 18; + quest.start(player); + break; + case 18: + end(); + break; + case 20: + player("No, not yet."); + stage = 21; + break; + case 21: + npc("Well, he's the only one who can grant you the right to", "wear rune platemail. He lives in a hut, by the cliffs west", "of Edgeville."); + stage = 22; + break; + case 22: + player("Okay, I'll go and talk to him."); + stage = 23; + break; + case 23: + end(); + break; + case 99: + end(); + break; + } + break; + } + return true; + } + + /** + * Method used to handle the description. + * @param buttonId the id. + */ + public void handleDescription(int buttonId) { + switch (buttonId) { + case 1: + if (quest.getStage(player) == 10) { + npc("You're already on a quest for me, if I recall correctly.", "Have you talked to Oziach yet?"); + stage = 20; + return; + } + npc("This is the Champions' Guild. Only adventurers who", "have proved themselves worthy by gaining influence", "from quests are allowed in here."); + stage = 99; + break; + case 2: + end(); + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 198 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeDemonNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeDemonNPC.java new file mode 100644 index 000000000..05545cf9f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeDemonNPC.java @@ -0,0 +1,62 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.world.map.Location; + +/** + * Represents the lesser demon maze npc. + * @author 'Vexia + * @version 1.0 + */ +public final class MazeDemonNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 82 }; + + /** + * Represents the location to be near to count as a maze npc. + */ + private final static Location LOCATION = Location.create(2936, 9652, 0); + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public MazeDemonNPC() { + super(0, null); + } + + /** + * Constructs a new {@code MazeDemonNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private MazeDemonNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MazeDemonNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer.getLocation().withinDistance(LOCATION)) { + if (killer instanceof Player) { + GroundItemManager.create(DragonSlayer.GREEN_KEY, getLocation(), ((Player) killer)); + } + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeGhostNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeGhostNPC.java new file mode 100644 index 000000000..af2934b63 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeGhostNPC.java @@ -0,0 +1,65 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Represents a ghosts in melzar's maze. + * @author 'Vexia + * @version 1.0 + */ +public final class MazeGhostNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 103 }; + + /** + * Represents the location to be near. + */ + private static final Location LOCATION = Location.create(2926, 3253, 1); + + /** + * Constructs a new {@code MazeGhostNPC} {@code Object}. + */ + public MazeGhostNPC() { + super(0, null); + } + + /** + * Constructs a new {@code MazeGhostNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private MazeGhostNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MazeGhostNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer.getLocation().withinDistance(LOCATION)) { + if (killer instanceof Player) { + if (RandomFunction.random(0, 4) == 2) { + GroundItemManager.create(DragonSlayer.ORANGE_KEY, getLocation(), ((Player) killer)); + } + } + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeSkeletonNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeSkeletonNPC.java new file mode 100644 index 000000000..2039b4603 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeSkeletonNPC.java @@ -0,0 +1,65 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Represents a skeleton in melzars maze. + * @author 'Vexia + * @version 1.0 + */ +public final class MazeSkeletonNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 90 }; + + /** + * Represents the location to be near to count as a maze npc. + */ + private static Location LOCATION = Location.create(2927, 3253, 2); + + /** + * Constructs a new {@code MazeSkeletonNPC} {@code Object}. + */ + public MazeSkeletonNPC() { + super(0, null); + } + + /** + * Constructs a new {@code MazeSkeletonNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private MazeSkeletonNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MazeSkeletonNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer.getLocation().withinDistance(LOCATION)) { + if (killer instanceof Player) { + if (RandomFunction.random(0, 5) == 2) { + GroundItemManager.create(DragonSlayer.YELLOW_KEY, getLocation(), ((Player) killer)); + } + } + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeZombieNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeZombieNPC.java new file mode 100644 index 000000000..68927b4a2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MazeZombieNPC.java @@ -0,0 +1,65 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Represents a skeleton in melzars maze. + * @author 'Vexia + * @version 1.0 + */ +public final class MazeZombieNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 75 }; + + /** + * Represents the location to be near. + */ + private final static Location LOCATION = Location.create(2933, 9641, 0); + + /** + * Constructs a new {@code MazeZombieNPC.java} {@code Object}. + */ + public MazeZombieNPC() { + super(0, null); + } + + /** + * Constructs a new {@code MazeZombieNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private MazeZombieNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MazeZombieNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer.getLocation().withinDistance(LOCATION)) { + if (killer instanceof Player) { + if (RandomFunction.random(0, 3) == 2) { + GroundItemManager.create(DragonSlayer.BLUE_KEY, getLocation(), ((Player) killer)); + } + } + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java new file mode 100644 index 000000000..52b64e16c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java @@ -0,0 +1,204 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.tools.RandomFunction; + +/** + * Represents the medlar the mad npc. + * @author 'Vexia + * @version 1.0 + */ +public final class MeldarMadNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 753 }; + + /** + * Represents the cabbage npc. + */ + public static final Item CABBAGE = new Item(1965); + + /** + * Represents the messages to say when fighting. + */ + public static final String[] MESSAGES = new String[] { "Feel the wrath of my feet!", "By the power of custard!", "Let me drink my tea in peace.", "Leave me alone, I need to feed my pet rock." }; + + /** + * Represents the swing handler. + */ + private final MeldarSwingHandler combatHandler = new MeldarSwingHandler(); + + /** + * Constructs a new {@code MeldarMadNPC} {@code Object}. + */ + public MeldarMadNPC() { + super(0, null); + } + + /** + * Constructs a new {@code MeldarMadNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private MeldarMadNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MeldarMadNPC(id, location); + } + + @Override + public void init() { + super.init(); + getSkills().setLevel(Skills.MAGIC, 40); + getSkills().setLevel(Skills.ATTACK, 30); + getSkills().setLevel(Skills.STRENGTH, 35); + getSkills().setLevel(Skills.DEFENCE, 10); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!DeathTask.isDead(this) && getProperties().getCombatPulse().isAttacking() && RandomFunction.random(0, 4) == 1) { + sendChat(MESSAGES[RandomFunction.random(MESSAGES.length)]); + } + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + GroundItemManager.create(DragonSlayer.PURPLE_KEY, getLocation(), ((Player) killer)); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatHandler; + } + + @Override + public int[] getIds() { + return ID; + } + + /** + * Represents the combat swing handler for meldar the mad npc. + * @author 'Vexia + */ + public class MeldarSwingHandler extends CombatSwingHandler { + + /** + * Represents the style to use. + */ + private CombatStyle style = CombatStyle.MAGIC; + + /** + * Represents the spell ids. + */ + private final int SPELL_IDS[] = new int[] { 8, 2, 7, 11 }; + + /** + * Constructs a new {@code MeldarMapNPC} {@code Object}. + */ + public MeldarSwingHandler() { + super(CombatStyle.MAGIC); + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + return getType().getSwingHandler().canSwing(entity, victim); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (RandomFunction.random(5) == 3) { + style = CombatStyle.MELEE; + } else { + style = CombatStyle.MAGIC; + } + return 2; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + if (style == CombatStyle.MAGIC) { + state.setSpell(getCombatSpell()); + for (int i = 0; i < 2; i++) { + Location l = getLocation().transform(RandomFunction.random(1, 5), RandomFunction.random(1, 5), 0); + if (RegionManager.isTeleportPermitted(l) && GroundItemManager.get(CABBAGE.getId(), l, null) == null && l.getY() <= 9651 && l.getY() >= 9644) { + if (victim instanceof Player) + ((Player) victim).getPacketDispatch().sendPositionedGraphic(86, 1, 0, l); + GroundItemManager.create(CABBAGE, l, ((Player) victim)); + } + } + } + style.getSwingHandler().visualize(entity, victim, state); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + style.getSwingHandler().visualizeImpact(entity, victim, state); + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + style.getSwingHandler().adjustBattleState(entity, victim, state); + } + + @Override + public int calculateAccuracy(Entity entity) { + return style.getSwingHandler().calculateAccuracy(entity); + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return style.getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + return style.getSwingHandler().calculateHit(entity, victim, modifier); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + style.getSwingHandler().impact(entity, victim, state); + } + + @Override + public ArmourSet getArmourSet(Entity e) { + return style.getSwingHandler().getArmourSet(e); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return style.getSwingHandler().getSetMultiplier(e, skillId); + } + + /** + * Method used to get a combat spell. + * @return the spell. + */ + public CombatSpell getCombatSpell() { + return ((CombatSpell) SpellBookManager.SpellBook.MODERN.getSpell(SPELL_IDS[RandomFunction.random(SPELL_IDS.length)])); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/NedDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/NedDialogue.java new file mode 100644 index 000000000..0d275f79e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/NedDialogue.java @@ -0,0 +1,624 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.GameWorld; + +/** + * Represents the dialogue to handle the transcript of hed. + * @author 'Vexia + * @date 31/12/2013 + */ +public final class NedDialogue extends DialoguePlugin { + + /** + * Represents the coins item to remove. + */ + private static final Item COINS = new Item(995, 15); + + /** + * Represents the rope item to add. + */ + private static final Item ROPE = new Item(954); + + /** + * Represents the ball of wool item. + */ + private static final Item WOOL = new Item(1759, 4); + + /** + * Represents the wool item needed to make a wig. + */ + private static final Item WIG_WOOL = new Item(1759, 3); + + /** + * Represents the undyed wig item. + */ + private static final Item WIG = new Item(2421); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * What quest option to use. + */ + private String q; + + /** + * The achievement diary. + */ + private AchievementDiary diary; + private final int level = 2; + + /** + * Constructs a new {@code NedDialogue} {@code Object}. + */ + public NedDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code NedDialogue} {@code Object}. + * @param player the player. + */ + public NedDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new NedDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + if (player.getQuestRepository().getQuest("Dragon Slayer").isStarted(player) && player.getQuestRepository().getQuest("Prince Ali Rescue").isStarted(player)) { + options("Dragon Slayer", "Prince Ali Rescue"); + stage = -400; + return true; + } + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 20) { + if (player.getSavedData().getQuestData().getDragonSlayerAttribute("ned")) { + player("Will you take me to Crandor now, then?"); + stage = 520; + return true; + } + npc("Why, hello there, lad. Me friends call me Ned. I was a", "man of the sea, but it's past me now. Could I be", "making or selling you some rope?"); + stage = 499; + return true; + } + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 30) { + player("Will you take me to Crandor now, then?"); + stage = 520; + return true; + } + switch (quest.getStage(player)) { + case 20:// wig + case 30: + case 40: + case 50: + options("Ned, could you make other things from wool?", "Yes, I would like some rope.", "No thanks Ned, I don't need any."); + stage = 40; + break; + default: + npc("Why, hello there, lad. Me friends call me Ned. I was a", "man of the sea, but it's past me now. Could I be", "making or selling you some rope?"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case -400: + switch (buttonId) { + case 1: + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 20) { + if (player.getSavedData().getQuestData().getDragonSlayerAttribute("ned")) { + player("Will you take me to Crandor now, then?"); + stage = 520; + return true; + } + npc("Why, hello there, lad. Me friends call me Ned. I was a", "man of the sea, but it's past me now. Could I be", "making or selling you some rope?"); + stage = 499; + return true; + } + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 30) { + player("Will you take me to Crandor now, then?"); + stage = 520; + return true; + } + q = "dSlayer"; + return true; + case 2: + switch (quest.getStage(player)) { + case 40: + case 50: + case 20:// wig + case 30: + options("Ned, could you make other things from wool?", "Yes, I would like some rope.", "No thanks Ned, I don't need any."); + stage = 40; + break; + default: + npc("Why, hello there, lad. Me friends call me Ned. I was a", "man of the sea, but it's past me now. Could I be", "making or selling you some rope?"); + stage = 0; + break; + } + q = "ali"; + return true; + } + } + if ((q == null || q.equals("dSlayer")) && (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 20 || (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 30) && player.getSavedData().getQuestData().getDragonSlayerAttribute("repaired"))) { + switch (stage) { + case 499: + player("You're a sailor? Could you take me to Crandor?"); + stage = 500; + break; + case 500: + npc("Well, I was a sailor. I've not been able to get work at", "sea these days, though. They say I'm too old."); + stage = 501; + break; + case 501: + npc("Sorry, where was it you said you wanted to go?"); + stage = 502; + break; + case 502: + player("To the island of Crandor."); + stage = 503; + break; + case 503: + npc("Crandor? You've got to be out of your mind!"); + stage = 504; + break; + case 504: + npc("But... It would be a chance to sail a ship once more.", "I'd sail anywhere if it was a chance to sail again."); + stage = 505; + break; + case 505: + npc("Then again, no captain in his right mind would sail to", "that island..."); + stage = 506; + break; + case 506: + npc("Ah, you only live once! I'll do it!"); + player.getSavedData().getQuestData().setDragonSlayerAttribute("ned", true); + stage = 507; + break; + case 507: + npc("So, where's your ship?"); + stage = 508; + break; + case 508: + if (player.getSavedData().getQuestData().getDragonSlayerAttribute("ship")) { + player("It's the Lady Lumbridge, in Port Sarim."); + stage = 509; + } else { + player("I'm still looking..."); + stage = 511; + } + break; + case 509: + npc("That old pile of junk? Last I heard, she wasn't", "seaworthy."); + stage = 510; + break; + case 510: + if (player.getSavedData().getQuestData().getDragonSlayerAttribute("repaired")) { + player("I fixed her up!"); + stage = 512; + } else { + player("Oh, I better go inspect her."); + stage = 511; + } + break; + case 511: + end(); + break; + case 512: + npc("You did? Excellent!"); + stage = 513; + break; + case 513: + npc("Just show me the map and we can get ready to go!"); + stage = 514; + break; + case 514: + if (player.getInventory().containsItem(DragonSlayer.CRANDOR_MAP)) { + player("Here you go."); + stage = 515; + } else { + player.getPacketDispatch().sendMessage("You don't have the map to Crandor."); + end(); + } + break; + case 515: + if (player.getInventory().remove(DragonSlayer.CRANDOR_MAP)) { + interpreter.sendItemMessage(DragonSlayer.CRANDOR_MAP.getId(), "You hand the map to Ned."); + player.getQuestRepository().getQuest("Dragon Slayer").setStage(player, 30); + stage = 516; + } + break; + case 516: + npc("Excellent! I'll meet you at the ship, then."); + stage = 517; + break; + case 517: + end(); + break; + case 520: + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 30) { + npc("I Said I would and old Ned is a man of his word! I'll", "meet you on board the Lady Lumbridge in Port Sarim."); + stage = 517; + return true; + } + npc("I Said I would and old Ned is a man of his word!"); + stage = 521; + break; + case 521: + npc("So, where's your ship?"); + stage = 508; + break; + } + return true; + } + switch (stage) { + case 0: + options("Yes, I would like some rope.", "No thanks Ned, I don't need any.", "Ask about Achievement Diaries"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Yes, I would like some rope."); + stage = 10; + break; + case 2: + player("No thanks Ned, I don't need any."); + stage = 20; + break; + case 3: + player("I'd like to talk about Achievement Diaries."); + stage = 900; + break; + } + break; + case 10: + npc("Well, I can sell you some rope for 15 coins. Or I can", "be making you some if you gets me 4 balls of wool. I", "strands them together I does, makes em strong."); + stage = 11; + break; + case 11: + player("You make rope from wool?"); + stage = 12; + break; + case 12: + npc("Of course you can!"); + stage = 13; + break; + case 13: + player("I thought you needed hemp or jute."); + stage = 14; + break; + case 14: + npc("Do you want some rope or not?"); + stage = 15; + break; + case 15: + if (!player.getInventory().containsItem(WOOL)) { + options("Okay, please sell me some rope.", "That's a little more than I want to pay.", "I will go and get some wool."); + stage = 16; + } else { + options("Okay, please sell me some rope.", "I have some balls of wool. Could you make me some rope?", "That's a little more than I want to pay."); + stage = 17; + } + break; + case 17: + switch (buttonId) { + case 1: + player("Okay, please sell me some rope."); + stage = 100; + break; + case 2: + player("I have some balls of wool.", "Could you make me some rope?"); + stage = 120; + break; + case 3: + player("That's a little more than I want to pay."); + stage = 200; + break; + } + break; + case 16: + switch (buttonId) { + case 1: + player("Okay, please sell me some rope."); + stage = 100; + break; + case 2: + player("That's a little more than I want to pay."); + stage = 200; + break; + case 3: + player("I will go and get some wool."); + stage = 300; + break; + } + break; + case 40: + switch (buttonId) { + case 1: + player("Ned could you make other things from wool?"); + stage = 41; + break; + case 2: + player("Yes, I would like some rope."); + stage = 10; + break; + case 3: + player("No thanks Ned, I don't need any."); + stage = 20; + break; + } + break; + case 41: + npc("I am sure I can. What are you thinking of?"); + stage = 42; + break; + case 42: + options("Could you knit me a sweater?", "How about some sort of wig?", "Could you repair the arrow holes in the back of my shirt?"); + stage = 43; + break; + case 43: + switch (buttonId) { + case 1: + player("Could you knit me a sweater?"); + stage = 44; + break; + case 2: + player("How about some sort of wig?"); + stage = 50; + break; + case 3: + player("Could you repair the arrow holes in the", "back of my shirt?"); + stage = 4; + break; + case 4: + npc("Ah yes, it's a tough world these days. There's a few", "brave enough to attack from 10 metres away."); + stage = 47; + break; + } + break; + case 44: + npc("Do I look like a member of a sewing circle?", "Be off wi' you. I have fought monsters.", "that would turn your hair blue."); + stage = 45; + break; + case 45: + npc("I dont't need to be laughted at just 'cos I am getting", "a bit old."); + stage = 46; + break; + case 46: + end(); + break; + case 47: + sendDialogue("Ned pulls out a nettle and attacks your shirt."); + stage = 48; + break; + case 48: + npc("There you go, good as new."); + stage = 46; + break; + case 50: + npc("Well... That's an interesting thought. Yes, I think I", "could do something. Give me 3 balls of wool and I", "might be able to do it."); + stage = 51; + break; + case 51: + options("I have that now. Please, make me a wig.", "I will come back when I need you to make me one."); + stage = 52; + break; + case 52: + switch (buttonId) { + case 1: + player("I have that now. Please, make me a wig."); + stage = 53; + break; + case 2: + player("I will come back when I need you to make me one."); + stage = 46; + break; + } + break; + case 53: + if (!player.getInventory().containsItem(WIG_WOOL)) { + player("Oh, I seem to have forgotten my wool."); + stage = 46; + return true; + } + npc("Okay, I will have a go."); + stage = 54; + break; + case 54: + sendDialogue("You hand Ned 3 balls of wool. Ned works with the wool", "His hands move with a speed you couldn't imagine."); + stage = 55; + break; + case 55: + if (player.getInventory().remove(WIG_WOOL)) { + if (!player.getInventory().add(WIG)) { + GroundItemManager.create(WIG, player); + } + } + npc("Here you go, how's that for a quick effort?", "Not bad I think!"); + stage = 56; + break; + case 56: + interpreter.sendDialogue("Ned gives you a pretty good wig."); + stage = 57; + break; + case 57: + player("Thanks Ned, there's more to you than meets the eye."); + stage = 46; + break; + case 100: + npc("There you go, finest rope in " + GameWorld.getSettings().getName() + "."); + stage = 101; + break; + case 101: + interpreter.sendDialogue("You hand Ned 15 coins. Ned gives you a coil of rope."); + stage = 102; + break; + case 102: + if (player.getInventory().remove(COINS)) { + if (!player.getInventory().add(ROPE)) { + GroundItemManager.create(ROPE, player); + } + } else { + player.getPacketDispatch().sendMessage("You don't have enough coins to pay for rope."); + } + end(); + break; + case 120: + interpreter.sendDialogues(npc, null, "Sure I can."); + stage = 121; + break; + case 121: + interpreter.sendDialogue("You hand over 4 balls of wool. Ned gives you a coil of rope."); + stage = 122; + break; + case 122: + if (player.getInventory().remove(WOOL)) { + player.getInventory().add(ROPE); + } + end(); + break; + case 200: + npc("Well, if you ever need rope that's the price. Sorry.", "An old sailor needs money for a little drop o' rum."); + stage = 201; + break; + case 201: + end(); + break; + case 300: + npc("Aye, you do that. Remember, it takes 4 balls of wool to", "make strong rope."); + stage = 301; + break; + case 301: + end(); + break; + case 20: + npc("Well, old Neddy is always here if you do. Tell your", "friends. I can always be using the business."); + stage = 21; + break; + case 21: + end(); + break; + case 900: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE); + } + if (diary.isComplete(level, true) && !diary.isLevelRewarded(level)) { + player("I've done all the hard tasks in my Lumbridge", "Achievement Diary."); + stage = 950; + break; + } + if (diary.isLevelRewarded(level) && diary.isComplete(level, true) && !player.hasItem(diary.getType().getRewards(level)[0])) { + player("I've seemed to have lost my explorer's ring..."); + stage = 960; + break; + } + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 901; + break; + case 901: + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 910; + break; + case 2: + player("What are the rewards?"); + stage = 920; + break; + case 3: + player("How do I claim the rewards?"); + stage = 930; + break; + case 4: + player("See you later!"); + stage = 940; + break; + } + break; + case 910: + npc("Ah, well it's a diary that helps you keep track of", "particular achievements you've made in the world of", "2009Scape. In Lumbridge and Draynor i can help you", "discover some very useful things indeed."); + stage++; + break; + case 911: + npc("Eventually with enough exploration you will be", "rewarded for your explorative efforts."); + stage++; + break; + case 912: + npc("You can access your Achievement Diary by going to", "the Quest Journal. When you've opened the Quest", "Journal click on the green star icon on the top right", "hand corner. This will open the diary."); + stage = 900; + break; + case 920: + npc("Ah, well there are different rewards for each", "Achievement Diary. For completing the Lumbridge and", "Draynor diary you are presented with an explorer's", "ring."); + stage++; + break; + case 921: + npc("This ring will become increasingly useful with each", "section of the diary that you complete."); + stage = 900; + break; + case 930: + npc("You need to complete the task so that they're all ticked", "off then you can claim your reward. Most of them are", "straightforward although you might find some required", "quests to be started, if not finished."); + stage++; + break; + case 931: + npc("To claim the explorer's ring speak to Explorer Jack in ", "Lumbridge, Bob in Bob's Axes in Lumbridge, or myself."); + stage = 900; + break; + case 940: + end(); + break; + case 950: + npc("Yes I see that, you'll be wanting your", "reward then I assume?"); + stage++; + break; + case 951: + player("Yes please."); + stage++; + break; + case 952: + diary.setLevelRewarded(level); + for (Item i : diary.getType().getRewards(level)) { + player.getInventory().add(i, player); + } + npc("This ring is a representation of the adventures you", "went on to complete your tasks."); + stage ++; + break; + case 953: + player("Wow, thanks!"); + stage = 900; + break; + case 960: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("You better be more careful this time."); + stage = 900; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 743 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/OziachDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/OziachDialogue.java new file mode 100644 index 000000000..fb0a5b758 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/OziachDialogue.java @@ -0,0 +1,413 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Represents the dialogue used to handle the oziach dialogue. + * @author Aero + * @author 'Vexia + */ +public final class OziachDialogue extends DialoguePlugin { + + /** + * Represents the demon slayer quest. + */ + private Quest quest; + + /** + * Constructs a new {@code OziachDialogue} {@code Object}. + */ + public OziachDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code OziachDialogue} {@code Object}. + * @param player the player. + */ + public OziachDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new OziachDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Dragon Slayer"); + player.debug("" + quest.getStage(player)); + switch (quest.getStage(player)) { + case 100: + npc("Aye, 'tis a fair day, my mighty dragon-slaying friend."); + if (player.getInventory().containsItem(new Item(11286))) {// player.getEquipment().containsItem(new + // Item(1540))//TODO: + // Anti-drag + // shield + // dialogue. + stage = 42; + } else { + stage = 0; + } + break; + case 40: + case 30: + case 20: + case 15: + if (args.length > 1) { + npc("I'm not selling' ye anything till you've slayed that", "dragon! Now be off wi' ye."); + stage = -1; + return true; + } else { + npc("Have ye slayed that dragon yet?"); + stage = 0; + } + break; + case 10: + if (args.length > 1) { + player("Can you sell me a rune platebody?"); + stage = 0; + } else { + npc("Aye, 'tis a fair day my friend."); + stage = -1; + } + break; + default: + npc("Aye, 'tis a fair day my friend."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 30: + case 20: + if (stage == -1) { + end(); + } else { + end(); + break; + } + break; + case 100: + switch (stage) { + case 0: + options("Can I buy a rune platebody now, please?", "I'm not your friend.", "Yes, it's a very nice day.", "Can I have another key to Melzar's Maze?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Can I buy a rune platebody now, please?"); + stage = 10; + break; + case 2: + player("I'm not your friend."); + stage = 20; + break; + case 3: + player("Yes, it's a very nice day."); + stage = 30; + break; + case 4: + player("Can I have another key to Melzar's Maze?"); + stage = 40; + break; + case 5: + player("Here you go."); + stage = 44; + break; + } + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + end(); + break; + case 30: + end(); + break; + case 40: + npc("It's the Guildmaster in the Champions' Guild who hands", "those keys out now. Go talk to him. No need to bother", "me if you don't need armour."); + stage = 41; + break; + case 41: + end(); + break; + case 42: + npc("Ye've got... Ye've found a draconic visage! Could I look at", "it?"); + stage++; + break; + case 43: + options("Can I buy a rune platebody now, please?", "I'm not your friend.", "Yes, it's a very nice day.", "Can I have another key to Melzar's Maze?", "Here you go"); + stage = 1; + break; + case 44: + npc("Amazin'! Ye can almost feel it pulsin with draconic power!"); + stage++; + break; + case 45: + npc("Now, if ye want me to, I could attach this to yer anti-", "dragonbreath shield and make something pretty special."); + stage++; + break; + case 46: + npc("The shield won't be easy to weild though; ye'll need level", "75 Defence."); + stage++; + break; + case 47: + npc("I'll charge 1,250,000 coins to construct it. What d'ye say?"); + stage++; + break; + case 48: + options("Yes, please!", "No, thanks.", "That's a bit expensive!"); + stage++; + break; + case 49: + switch (buttonId) { + case 1: + player("Yes please!"); + stage = 50; + break; + case 2: + player("No thanks."); + stage = 52; + break; + case 3: + player("That's a bit expensive!"); + stage = 53; + break; + } + break; + case 50: + if (player.getInventory().contains(11286, 1)) { + if (player.getInventory().contains(995, 1250000)) { + if (player.getInventory().contains(1540, 1)) { + player.getInventory().remove(new Item(1540, 1)); + player.getInventory().remove(new Item(11286, 1)); + player.getInventory().remove(new Item(995, 1250000)); + player.getInventory().add(new Item(11283, 1)); + player.getDialogueInterpreter().sendItemMessage(11283, "Oziach skillfully forges the shield and visage into a new shield."); + stage = 51; + } else { + npc("Ye need an anti-dragonbreath shield for me to", "attach this onto, talk to me again once you do."); + stage = 41; + } + } else { + player("I don't seem to have enough coins tho,", "I will return once I do."); + stage = 41; + } + } else { + npc("Ye need the draconic visage for me to attach.", "Talk to me again once you have it."); + stage = 41; + } + break; + case 51: + npc("There ye go. Now, the more dragonfire your shield", "absorbs, the more powerful it'll become."); + stage = 41; + break; + case 52: + npc("Talk to me again if ye change your mind", "mighty dragon slayer."); + stage = 41; + break; + case 53: + npc("It's the price ye pay to make such a magnificent shield."); + stage = 41; + break; + } + break; + case 40: + switch (stage) { + case -1: + end(); + break; + case 0: + if (!player.getInventory().containsItem(DragonSlayer.ELVARG_HEAD)) { + player("Nope, not yet."); + stage = -1; + return true; + } + player("Yes, I have!"); + stage = 2; + break; + case 2: + player("I have its head here."); + stage = 3; + break; + case 3: + npc("You actually did it?"); + stage = 4; + break; + case 4: + npc("I underestimated ye, adventurer. I apologize."); + stage = 5; + break; + case 5: + npc("Yer a true hero, and I'd be happy to sell ye rune", "platebodies."); + stage = 6; + break; + case 6: + end(); + int heads = player.getInventory().getAmount(DragonSlayer.ELVARG_HEAD); + if (player.getInventory().remove(new Item(DragonSlayer.ELVARG_HEAD.getId(),heads)) && !player.getQuestRepository().getQuest("Dragon Slayer").isCompleted(player)) { + quest.finish(player); + } + break; + } + break; + case 15: + switch (stage) { + case -1: + end(); + break; + case 0: + player("Um... no."); + stage = 2; + break; + case 1: + player("Um... no."); + stage = 2; + break; + case 2: + npc("Be off with ye then."); + stage = 3; + break; + case 3: + end(); + break; + } + break; + case 10: + switch (stage) { + case -1: + player("Can you sell me a rune platebody?"); + stage = 0; + break; + case 0: + npc("So, how does thee know I 'ave some?"); + stage = 2; + break; + case 2: + player("The Guildmaster of the Champions' Guild told me."); + stage = 3; + break; + case 3: + npc("Yes, I suppose he would, wouldn't he? He's always", "sending you fancy-pants 'heroes' up to bother me.", "Telling me I'll give them a quest or sommat like that."); + stage = 4; + break; + case 4: + npc("Well, I'm not going to let just anyone wear my rune", "platemail. It's only for heroes. So, leave me alone."); + stage = 5; + break; + case 5: + player("I thought you were going to give me a quest."); + stage = 6; + break; + case 6: + npc("*Sigh*"); + stage = 7; + break; + case 7: + npc("All right, I'll give ye a quest. I'll let ye wear my rune", "platemail if ye..."); + stage = 8; + break; + case 8: + npc("Slay the dragon of Crandor!"); + stage = 9; + break; + case 9: + options("A dragon, that sounds like fun.", "I may be a champion, but I don't think I'm up to dragon-killing yet."); + stage = 10; + break; + case 10: + switch (buttonId) { + case 1: + player("A dragon, that sounds like fun!"); + stage = 100; + break; + case 2: + player("I may be a champion, but I don't think I'm up to", "dragon-killing yet."); + stage = 200; + break; + } + break; + case 100: + npc("Hah, yes, you are a typical reckless adventurer, aren't", "you? Now go kill the dragon and get out of my face."); + stage = 101; + break; + case 101: + player("But how can I defeat the dragon?"); + stage = 102; + break; + case 102: + npc("Go talk to the Guildmaster in the Champions' Guild. He'll", "help ye out if yer so keen on doing a quest. I'm not", "going to be handholding any adventurers."); + stage = 103; + break; + case 103: + quest.setStage(player, 15); + end(); + break; + case 200: + npc("Yes, I can understand that. Yer a coward."); + stage = 201; + break; + case 201: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + options("I'm not your friend.", "Yes, it's a very nice day."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("I'm not your friend."); + stage = 10; + break; + case 2: + player("Yes, it's a very nice day."); + stage = 20; + break; + } + break; + case 10: + npc("I'm surprised if you're anyone's friend with those kind", "of manners."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc("Aye, may the gods walk by yer side. Now leave me", "alone."); + stage = 21; + break; + case 21: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 747 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/WormbrainDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/WormbrainDialogue.java new file mode 100644 index 000000000..723a7503f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/WormbrainDialogue.java @@ -0,0 +1,189 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; + +/** + * Represents the dialogue used to handle the wormbrain npc related to the + * dragon slayer. + * @author 'Vexia + * @version 1.0 + */ +public final class WormbrainDialogue extends DialoguePlugin { + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 10000); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code WormbrainDialogue} {@code Object}. + */ + public WormbrainDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WormbrainDialogue} {@code Object}. + * @param player the player. + */ + public WormbrainDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WormbrainDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Dragon Slayer"); + switch (quest.getStage(player)) { + default: + npc("Whut you want?"); + stage = -1; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 20: + switch (stage) { + case -1: + if (!player.getInventory().containsItem(DragonSlayer.WORMBRAIN_PIECE) && !player.getBank().containsItem(DragonSlayer.WORMBRAIN_PIECE)) { + player("I believe you've got a piece of a map that I need."); + stage = 500; + } else { + defaultDial(buttonId); + } + break; + case 500: + npc("So? Why should I be giving it to you? What you do", "for Wormbrain?"); + stage = 501; + break; + case 501: + player("I suppose I could pay you for the map piece. Say, 500", "coins?"); + stage = 502; + break; + case 502: + npc("Me not stoopid, it worth at least 10,000 coins!"); + stage = 503; + break; + case 503: + options("You must be joking! Forget it.", "Alright then, 10,000 it is."); + stage = 504; + break; + case 504: + switch (buttonId) { + case 1: + player("You must be joking! Forget it."); + stage = 505; + break; + case 2: + player("Alrigt, then, 10,000 it is."); + stage = 506; + break; + } + break; + case 505: + end(); + break; + case 506: + if (player.getInventory().containsItem(COINS) && player.getInventory().remove(COINS)) { + if (!player.getInventory().add(DragonSlayer.WORMBRAIN_PIECE)) { + GroundItemManager.create(DragonSlayer.WORMBRAIN_PIECE, player); + } + interpreter.sendItemMessage(DragonSlayer.WORMBRAIN_PIECE.getId(), "You buy the map piece from Wormbrain."); + stage = 507; + } else { + end(); + player.getPacketDispatch().sendMessage("You don't have enough coins in order to do that."); + } + break; + case 507: + npc("Fank you very much! Now me can bribe da guards,", "hehehe."); + stage = 508; + break; + case 508: + end(); + break; + } + default: + defaultDial(buttonId); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 745 }; + } + + /** + * Method used to handle the default dial. + * @param buttonId the button id. + */ + public void defaultDial(int buttonId) { + switch (stage) { + case -1: + options("What are you in for?", "Sorry, thought this was a zoo."); + stage = 0; + break; + case 0: + switch (buttonId) { + case 1: + player("What are you in for?"); + stage = 10; + break; + case 2: + player("Sorry, thought this was a zoo."); + stage = 20; + break; + } + break; + case 10: + npc("Me not sure. Me pick some stuff up and take it away."); + stage = 11; + break; + case 11: + player("Well, did the stuff belong to you?"); + stage = 12; + break; + case 12: + npc("Umm...no."); + stage = 13; + break; + case 13: + player("Well, that would be why then."); + stage = 14; + break; + case 14: + npc("Oh, right."); + stage = 15; + break; + case 15: + end(); + break; + case 20: + end(); + break; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/WormbrainNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/WormbrainNPC.java new file mode 100644 index 000000000..104e8c013 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/WormbrainNPC.java @@ -0,0 +1,71 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.world.map.Location; + +/** + * Represents the worm brain npc. + * @author 'Vexia + * @versin 1.0 + */ +public final class WormbrainNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 745 }; + + /** + * Constructs a new {@code WormBrainPlugin} {@code Object}. + */ + public WormbrainNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private WormbrainNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new WormbrainNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + if (((Player) killer).getQuestRepository().getQuest("Dragon Slayer").getStage(killer.asPlayer()) == 20 && !((Player) killer).getInventory().containsItem(DragonSlayer.WORMBRAIN_PIECE) && !((Player) killer).getBank().containsItem(DragonSlayer.WORMBRAIN_PIECE)) { + GroundItemManager.create(DragonSlayer.WORMBRAIN_PIECE, getLocation(), ((Player) killer)); + ((Player) killer).getPacketDispatch().sendMessage("Wormbrain drops a map piece on the floor."); + } + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity instanceof Player) { + final Player player = (Player) entity; + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) != 20) { + player.getPacketDispatch().sendMessage("The goblin is already in prison. You have no reason to attack him."); + return false; + } + } + return super.isAttackable(entity, style); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/ZombieRatNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/ZombieRatNPC.java new file mode 100644 index 000000000..d56ae4205 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/dragonslayer/ZombieRatNPC.java @@ -0,0 +1,72 @@ +package core.game.content.quest.free.dragonslayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Represents a zombie rat npc related to dragon slayer and witch's potion. + * @author 'Vexia + * @version 1.0 + */ +public final class ZombieRatNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 6088, 6089, 6090 }; + + /** + * Represents the rat tail item. + */ + private static final Item RAT_TAIL = new Item(300, 1); + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public ZombieRatNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private ZombieRatNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ZombieRatNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player p = ((Player) killer); + Quest quest = p.getQuestRepository().getQuest("Dragon Slayer"); + if (RandomFunction.random(0, 4) == 2) { + GroundItemManager.create(DragonSlayer.RED_KEY, getLocation(), ((Player) killer)); + } + quest = p.getQuestRepository().getQuest("Witch's Potion"); + if (quest.getStage(p) > 0 && quest.getStage(p) < 100) { + GroundItemManager.create(RAT_TAIL, getLocation(), p); + } + GroundItemManager.create(new Item(526), getLocation(), p); + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene.java b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene.java new file mode 100644 index 000000000..0ac578b50 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GDiplomacyCutscene.java @@ -0,0 +1,891 @@ +package core.game.content.quest.free.goblindiplomacy; + +import core.game.component.Component; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.path.Pathfinder; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.tools.RandomFunction; +import core.tools.StringUtils; +import core.game.content.dialogue.FacialExpression; + +/** + * Represents the goblin diplomacy cutscene plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class GDiplomacyCutscene extends CutscenePlugin { + + /** + * Constructs a new {@code GDiplomacyCutscene} {@code Object}. + */ + public GDiplomacyCutscene() { + this(null); + } + + /** + * Constructs a new {@code GDiplomacyCutscene} {@code Object}. + */ + public GDiplomacyCutscene(final Player player) { + super("Goblin Diplomacy Cutscene"); + this.player = player; + } + + @Override + public boolean start(final Player player, final boolean login, Object... args) { + Quest quest = player.getQuestRepository().getQuest(GoblinDiplomacy.NAME); + final NPC grubfoot = NPC.create(quest.getStage(player) == 10 ? 4495 : quest.getStage(player) == 20 ? 4497 : quest.getStage(player) == 30 ? 4498 : 4496, getBase().transform(10, 55, 0)); + grubfoot.setWalks(false); + npcs.add(grubfoot); + npcs.add(NPC.create(4494, getBase().transform(14, 55, 0))); + npcs.add(NPC.create(4493, getBase().transform(14, 56, 0))); + for (NPC npc : npcs) { + npc.setDirection(Direction.WEST); + npc.init(); + } + return super.start(player, login, args); + } + + @Override + public void open() { + player.getDialogueInterpreter().open(4494, npcs.get(1), this); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + 4, player.getLocation().getY() + 1, 390, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + 2, player.getLocation().getY(), 390, 1, 100)); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + region = DynamicRegion.create(11830); + setRegionBase(); + registerRegion(region.getId()); + } + + @Override + public void register() { + new GoblinGeneralDialogue().init(); + } + + @Override + public Location getStartLocation() { + return getBase().transform(13, 57, 0); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new GDiplomacyCutscene(p); + } + + /** + * Represents the dialogue which handles the dialogues between the goblin + * generals. + * @author 'Vexia + * @version 1.0 + */ + public static final class GoblinGeneralDialogue extends DialoguePlugin { + + /** + * Represents an array of dialogues to send. + */ + private static final String[][] DIALOGUES = new String[][] { { "@base (@color) armour best.", "@other No it has to be @ocolor.", "@base Go away human, we busy." }, { "@base I tell all goblins in village to wear @color armour now!", "@other They not listen to you! I already tell them wear @ocolor /n armour!", "@base They listen to me not you! They know me bigger /n general!", "@other Me bigger general! They listen to me!", "@base Human! What colour armour they wearing out there?", "@player Half of them wearing red and half of them green.", "@base Shut up human! They wearing green armour really! /n Human lying because he scared of you!", "@other Human scared of me not you! THen you think me /n bigger general!", "@base What? Me mean...", "@base Shut up! Me bigger general!" }, { "@base All goblins should wear @color armour!", "@other Not @ocolor! @ocolor make you look fat.", "@base Everything make YOU look fat!", "@other Shut up!", "@base Fatty!", "@other SHUT UP!", "@base Even this human think you look fat! Don't you, human?", "@player Um...", "@player No, he doesn't look fat.", "@base Shut up human! @oname fat and human stupid!", "@other Shut up @bname" }, { "@other (@ocolor) armour best.", "@base No no @color every time.", "@other Go away human, we busy." }, }; + + /** + * Represents the cutscene. + */ + private GDiplomacyCutscene cutscene; + + /** + * Represents the instanced quest. + */ + private Quest quest; + + /** + * Represents the other general. + */ + private NPC other; + + /** + * Represents the grubfoot npc. + */ + private NPC grubfoot; + + /** + * Represents the dialogue index we're at. + */ + private int dialIndex; + + /** + * Represents the dialogue index we're at. + */ + private int index; + + /** + * The current grubfoot type. + */ + private GrubFoot type; + + /** + * Constructs a new {@code GeneralWartface} {@code Object}. + */ + public GoblinGeneralDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GeneralWartface} {@code Object}. + * @param player the player. + */ + public GoblinGeneralDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GoblinGeneralDialogue(player); + } + + @Override + public Component npc(String... messages) { + return npc(FacialExpression.OLD_NORMAL,messages); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + type = GrubFoot.forConfig(player); + dialIndex = RandomFunction.random(DIALOGUES.length); + other = Repository.findNPC(npc.getId() == 4494 ? 4493 : 4494); + quest = player.getQuestRepository().getQuest(GoblinDiplomacy.NAME); + if(player.getQuestRepository().getQuest("Lost Tribe").getStage(player) == 43){ + player("Have you heard of the Dorgeshuun?"); + stage = 5000; + return true; + } + switch (quest.getStage(player)) { + case 100: + npc("Now you've solved out argument we gotta think of", "something else to do."); + stage = 0; + break; + default: + if (args.length >= 2) { + setUpCutScene(args); + return true; + } else { + parseDialogue(DIALOGUES[dialIndex]); + return true; + } + } + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if(stage >= 5000){ + switch (stage){ + case 5000: + npc("Dorgeshuun? That old goblin legend. Lost tribe."); + stage++; + break; + case 5001: + sendNormalDialogue(other, FacialExpression.OLD_NORMAL,"In time of much war there many tribes. Big High War","God send Dorgesh-tribe to fight beardy short-people","in mountains."); + stage++; + break; + case 5002: + npc("No no, he send them to fight tall people with biting","blades, that what I hear."); + stage++; + break; + case 5003: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"It was beardy short-people, that how legend go."); + stage++; + break; + case 5004: + options("Make up your minds!","Do you want me to decide for you again?","It doesn't really matter."); + stage++; + break; + case 5005: + switch(buttonId){ + case 1: + player("Make up your minds!"); + stage = 5010; + break; + case 2: + player("Do you want me to decide for you again?"); + stage = 5020; + break; + case 3: + player("It doesn't really matter. So what happened to them?"); + stage = 5030; + break; + } + break; + case 5010: + npc("It was tall people! That what old storyteller say!"); + stage++; + break; + case 5011: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"No, beardy-short-people. That how legend always go,","stupid."); + stage++; + break; + case 5012: + npc("You stupid!"); + stage = 5004; + break; + case 5020: + npc("That most stupid idea yet! If it happen it either happen","one way or the other. You can't just decide whice."); + stage++; + break; + case 5021: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"Yeah even goblins know that."); + stage = 5004; + break; + case 5030: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"Well, they say, 'We not want to fight,' so god punish","them."); + stage++; + break; + case 5031: + npc("That silly. No goblin ever say that."); + stage++; + break; + case 5032: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"What happen then?"); + stage++; + break; + case 5033: + npc("They lose battle, that why god punish them."); + stage++; + break; + case 5034: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"Ha ha! If they lost battle they all be dead!"); + stage++; + break; + case 5035: + npc("No no, they losing so they run away, and Big High","War God punish them for running away."); + stage++; + break; + case 5036: + player("Well, either way they refused to fight."); + stage++; + break; + case 5037: + npc("Yeah I suppose so."); + stage++; + break; + case 5038: + npc("Anyway, then Big High War God punish them. He turn","their insides to stone."); + stage++; + break; + case 5039: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"Ha ha ha! That silly!"); + stage++; + break; + case 5040: + npc("Not as silly as green armour! What happen then?"); + stage++; + break; + case 5041: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"He put them inside stone! Big hole open in ground and","they all go into cave."); + stage++; + break; + case 5042: + npc("That not punishment! Caves nice and cool."); + stage++; + break; + case 5043: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"But then he close cave so they not get out!","You not want to stay in cave all the time."); + stage++; + break; + case 5044: + player("Well I found a brooch underground, and I looked up","the symbol and it was the symbol of the Dorgeshuun."); + stage++; + break; + case 5045: + npc("That not look like goblin brooch."); + stage++; + break; + case 5046: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"Goblins not wear jewellery."); + stage++; + break; + case 5047: + npc("Well if it is Dorgeshuun tribe they not know who won big","wars. You should greet them with goblin victory dance!"); + stage++; + break; + case 5048: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"No no, you greet them with goblin tribal bow."); + stage++; + break; + case 5049: + npc("Doing bow make you look like a wimp."); + stage++; + break; + case 5050: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"It how tribes greet each other in old days."); + stage++; + break; + case 5051: + npc("Only if they wimpy tribes! Goblin salute strong!"); + stage++; + break; + case 5052: + player("Well, why not show me both greetings?"); + stage++; + break; + case 5053: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"That good idea. Watch."); + stage++; + break; + case 5054: + interpreter.sendDialogue("The generals show you the goblin bow and","goblin salute emotes."); + player.setAttribute("/save:tlt-goblin-emotes",true); + player.getEmoteManager().unlock(Emotes.GOBLIN_BOW); + player.getEmoteManager().unlock(Emotes.GOBLIN_SALUTE); + player.varpManager.get(465).setVarbit(0,7).send(player); + player.getQuestRepository().getQuest("Lost Tribe").setStage(player,44); + stage++; + break; + case 5055: + player("Thanks."); + stage++; + break; + case 5056: + npc("Bye then."); + stage++; + break; + case 5057: + sendNormalDialogue(other,FacialExpression.OLD_NORMAL,"Bye."); + stage++; + break; + case 5058: + player("Bye."); + stage++; + break; + case 5059: + end(); + break; + } + return true; + } + switch (quest.getStage(player)) { + case 0: + handleStart(buttonId); + break; + case 10: + case 20: + case 30: + handleDefault(buttonId); + break; + case 100: + switch (stage) { + case 0: + interpreter.sendDialogues(other, null, "Yep we bored now."); + stage = 1; + break; + case 1: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { /** wartface */ + 4494, /** bentnoze */ + 4493 }; + } + + /** + * Method used to parse the dialogue. + * @param dialogue the dialogue. + */ + public void parseDialogue(String[] dialogue) { + if (index == DIALOGUES.length - 1) { + if (quest.getStage(player) == 0) { + interpreter.sendOptions("Select an Option", "Why are you arguing about the colour of your armour?", "Wouldn't you prefer peace?", "Do you want me to pick an armour colour for you?"); + stage = 1; + } else { + if (!player.getInventory().containsItem(type.getMail())) { + options("Why are you arguing about the colour of your armour?", "Wouldn't you prefer peace?", "Where am I meant to get " + type.name().toLowerCase() + " amour?"); + stage = 1; + } else { + options("Why are you arguing about the colour of your armour?", "Wouldn't you prefer peace?", "I have some " + type.name().toLowerCase() + " armour here."); + stage = 1; + } + } + return; + } + final Entity entity = getSpeaker(dialogue[index]); + final String[] lines = getLines(dialogue[index]); + String line = null; + for (int i = 0; i < lines.length; i++) { + line = (String) lines[i]; + line = ((String) line).replace("(@color)", StringUtils.formatDisplayName(getColor((String) line))); + line = ((String) line).replace("(@ocolor)", StringUtils.formatDisplayName(getOtherColor((String) line))); + line = ((String) line).replace("@color", getColor((String) line)); + line = ((String) line).replace("@ocolor", getOtherColor((String) line)); + line = ((String) line).replace("@player", "").replace("@base", "").replace("@other", "").trim(); + line = ((String) line).trim(); + lines[i] = line; + } + interpreter.sendDialogues(entity, null, lines); + index++; + } + + /** + * Handles the default options for each stage. + */ + public void defaultOptions(int buttonId) { + switch (stage) { + case 10: + npc("We decide to celebrate goblin new century by changing", "colour of our armour, brown get boring after a bit.", "We want change."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(other, null, "Problem is they want different change to us."); + stage = 12; + break; + case 12: + end(); + break; + case 20: + interpreter.sendDialogues(other, null, "Yeah peace is good as long as it peace wearing my", "armour."); + stage = 21; + break; + case 21: + npc("But his color too ugly. Nearly make you look", "like an ugly goblin!"); + stage = 22; + break; + case 22: + end(); + break; + case 30: + npc("Well first you get goblin armour..."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(other, null, "...And then you dye it " + type.name().toLowerCase() + "!"); + stage = 32; + break; + case 32: + npc("Even human should be able to work that out!"); + stage = 33; + break; + case 33: + interpreter.sendOptions("Select an Option", "But where do I get goblin armour?", "But where do I get dye?"); + stage = 34; + break; + case 34: + switch (buttonId) { + case 1: + player("But where do I get goblin armour?"); + stage = 35; + break; + case 2: + player("But where do I get dye?"); + stage = 38; + break; + } + break; + case 35: + npc("There some spare armour around village somewhere.", "You can take that."); + stage = 36; + break; + case 36: + interpreter.sendDialogues(other, null, "It in crates somewhere. Can't remember which crates", "now."); + stage = 37; + break; + case 37: + end(); + break; + case 38: + interpreter.sendDialogues(other, null, "You go north of here into wilderness. There you find", "many ways to die!"); + stage = 40; + break; + case 40: + player("no, D-Y-E, not D-I-E."); + stage = 41; + break; + case 41: + npc("Stupid " + other.getName() + ", you not know how to spell!"); + stage = 42; + break; + case 42: + interpreter.sendDialogues(other, null, "Shut up " + npc.getName() + "!"); + stage = 43; + break; + case 43: + player("Do you know where I can get dye though?"); + stage = 44; + break; + case 44: + interpreter.sendDialogues(other, null, "Me not know where dye come from."); + stage = 45; + break; + case 45: + player("Well where did you get your red and green dye from?"); + stage = 46; + break; + case 46: + npc("Some goblin or other, he steal it. Say he steal it from", "old witch in Draynor Village."); + stage = 47; + break; + case 47: + interpreter.sendDialogues(other, null, "Maybe you can get more dye from here?"); + stage = 48; + break; + case 48: + end(); + break; + } + } + + /** + * Handles the default started quest dialogue. + * @param buttonId the buttonId. + */ + public void handleDefault(int buttonId) { + if (stage > 99) { + handleFinishDialogues(); + } + switch (stage) { + case 0: + parseDialogue(DIALOGUES[dialIndex]); + break; + case 1: + switch (buttonId) { + case 1: + player("Why are you arguing about the colour of", "your armour?"); + stage = 10; + break; + case 2: + player("Wouldn't you prefer peace?"); + stage = 20; + break; + case 3: + if (!player.getInventory().containsItem(type.getMail())) { + player("Where am I meant to get " + type.name().toLowerCase() + " armour?"); + stage = 30; + } else { + player("I have some " + type.name().toLowerCase() + " armour here."); + stage = 50; + } + break; + } + break; + case 50: + end(); + ActivityManager.start(player, "Goblin Diplomacy Cutscene", false); + break; + case 60: + player.face(grubfoot); + interpreter.sendDialogues(grubfoot, null, "Yes General Wartface sir?"); + Pathfinder.find(grubfoot, npc.getLocation().transform(-1, 0, 0)).walk(grubfoot); + stage = 61; + break; + case 61: + npc("Put on this armour!"); + player.face(npc); + stage = 62; + break; + case 62: + sendGrubFoot(type, 100); + break; + case 39: + end(); + break; + default: + defaultOptions(buttonId); + break; + } + } + + /** + * Sets up the cutscene. + */ + private void setUpCutScene(Object... args) { + player.lock(); + cutscene = (GDiplomacyCutscene) args[1]; + other = cutscene.getNPCS().get(2); + grubfoot = cutscene.getNPCS().get(0); + npc("Grubfoot!"); + player.face(npc); + stage = 60; + } + + /** + * Sends the new grubfoot. + * @param grubFoot the grubfoot. + * @param endStage the end stage. + */ + public void sendGrubFoot(final GrubFoot grubFoot, final int endStage) { + Pathfinder.find(grubfoot, grubfoot.getLocation().transform(-4, 0, 0)).walk(grubfoot); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + player.getDialogueInterpreter().sendPlainMessage(true, "Grubfoot goes into the changing room..."); + break; + case 7: + grubfoot.transform(grubFoot.getId()); + grubfoot.getProperties().setTeleportLocation(grubfoot.getLocation().transform(-1, 0, 0)); + player.getPacketDispatch().sendObjectAnimation(RegionManager.getObject(cutscene.getBase().transform(9, 55, 0)), new Animation(24)); + break; + case 11: + grubfoot.getProperties().setTeleportLocation(grubfoot.getLocation().transform(1, 0, 0)); + player.getPacketDispatch().sendObjectAnimation(RegionManager.getObject(cutscene.getBase().transform(9, 55, 0)), new Animation(24)); + break; + case 12: + player.getDialogueInterpreter().sendPlainMessage(true, "...And emerges wearing " + type.name().toLowerCase() + " armour."); + break; + case 13: + Pathfinder.find(grubfoot, npc.getLocation().transform(-1, 0, 0)).walk(grubfoot); + break; + case 16: + stage = endStage; + player.faceLocation(grubfoot.getLocation()); + player.getDialogueInterpreter().sendDialogues(grubfoot, null, "What do you think?"); + return true; + } + return false; + } + + }); + } + + /** + * Handles the starting of the quest. + * @param buttonId the buttonId. + */ + private void handleStart(int buttonId) { + switch (stage) { + case 0: + parseDialogue(DIALOGUES[dialIndex]); + break; + case 1: + switch (buttonId) { + case 1: + player("Why are you arguing about the colour of", "your armour?"); + stage = 10; + break; + case 2: + player("Wouldn't you prefer peace?"); + stage = 20; + break; + case 3: + player("Do you want me to pick an armour colour for you?"); + stage = 30; + break; + } + break; + case 30: + npc("Yes as long as you pick " + (npc.getId() == 4494 ? "green" : "red") + "."); + stage = 31; + break; + case 31: + interpreter.sendDialogues(other, null, "No you have to pick " + (npc.getId() == 4493 ? "green" : "red") + "!"); + stage = 32; + break; + case 32: + player("What about a different colour? Not green or red?"); + stage = 33; + break; + case 33: + npc("That would mean me wrong... but at least", "" + other.getName() + " not right!"); + stage = 34; + break; + case 34: + interpreter.sendDialogues(other, null, "Me dunno what that look like. Have to see armour", "before we decide."); + stage = 35; + break; + case 35: + npc("Human! You bring us armour in new colour!"); + stage = 36; + break; + case 36: + interpreter.sendDialogues(other, null, "What colour we try?"); + stage = 37; + break; + case 37: + npc("Orange armour might be good."); + stage = 38; + break; + case 38: + quest.start(player); + interpreter.sendDialogues(other, null, "Yes bring us orange armour."); + stage = 39; + break; + default: + defaultOptions(buttonId); + break; + } + } + + /** + * Handles the finishing dialogues. + */ + private void handleFinishDialogues() { + if (stage == 120) { + if (player.getInventory().remove(type.getMail())) { + quest.setStage(player, quest.getStage(player) + 10); + } + end(); + cutscene.unpause(); + type.setConfig(player); + return; + } + switch (quest.getStage(player)) { + case 10: + switch (stage) { + case 100: + interpreter.sendDialogues(npc, null, "No I don't like that much."); + player.face(npc); + stage++; + break; + case 101: + interpreter.sendDialogues(other, null, "It clashes with skin colour."); + player.face(other); + stage++; + break; + case 102: + interpreter.sendDialogues(npc, null, "We need darker colour, like blue."); + player.face(npc); + stage++; + break; + case 103: + interpreter.sendDialogues(other, null, "Yeah blue might be good."); + player.face(other); + stage++; + break; + case 104: + interpreter.sendDialogues(npc, null, "Human! Get us blue armour!"); + player.face(npc); + stage = 120; + break; + } + break; + case 20: + switch (stage) { + case 100: + interpreter.sendDialogues(other, null, "That not right. Not goblin colour at all."); + player.face(other); + stage++; + break; + case 101: + interpreter.sendDialogues(npc, null, "Goblins wear dark earthy colours like brown."); + player.face(npc); + stage++; + break; + case 102: + interpreter.sendDialogues(other, null, "Yeah brown might be good."); + player.face(other); + stage++; + break; + case 103: + interpreter.sendDialogues(npc, null, "Human! Get us brown armour!"); + player.face(npc); + stage++; + break; + case 104: + interpreter.sendDialogues(player, null, "I thought that was the armour you were changing", "from. Never mind, anything is worth a try."); + stage = 120; + break; + } + break; + case 30: + switch (stage) { + case 100: + interpreter.sendDialogues(npc, null, "That colour quite nice. Me can see myself wearing", "that."); + player.face(npc); + stage++; + break; + case 101: + interpreter.sendDialogues(other, null, "It a deal then. Brown armour it is."); + player.face(other); + stage++; + break; + case 102: + interpreter.sendDialogues(npc, null, "Thank you for sorting out our argument. Take this", "gold bar as reward!"); + npc.face(player); + other.face(player); + stage++; + break; + case 103: + end(); + cutscene.unpause(); + if (player.getInventory().remove(GrubFoot.BROWN.getMail())) { + quest.finish(player); + GrubFoot.BROWN.setConfig(player); + } + break; + } + break; + } + } + + /** + * Gets the speaker of the dialogue. + * @param line the line. + * @return the entity speaker. + */ + public Entity getSpeaker(final String line) { + return line.contains("@player") ? player : line.contains("@base") ? npc : other; + } + + /** + * Gets the color of the base entity. + * @param line the line. + * @return the color. + */ + public String getColor(final String line) { + return npc.getId() == 4494 ? "green" : "red"; + } + + /** + * Gets the other color of the general. + * @param line the line. + * @return the other color. + */ + public String getOtherColor(final String line) { + return other.getId() == 4493 ? "red" : "green"; + } + + /** + * Gets the lines of the dialogue. + * @param line the line. + * @return the lines. + */ + public String[] getLines(final String line) { + return line.split("/n"); + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.java b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.java new file mode 100644 index 000000000..07a90b327 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacy.java @@ -0,0 +1,159 @@ +package core.game.content.quest.free.goblindiplomacy; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.PluginManager; + +/** + * Represents the demon slayer quest. + * @author Vexia + * + */ +@Initializable +public class GoblinDiplomacy extends Quest { + + /** + * The name of the quest. + */ + public static final String NAME = "Goblin Diplomacy"; + + /** + * Represents the orange goblin mail. + */ + private static final Item ORANGE_MAIL = new Item(286); + + /** + * Represents the blue goblin mail. + */ + private static final Item BLUE_MAIL = new Item(287); + + /** + * Represents the goblin mail. + */ + private static final Item GOBLIN_MAIL = new Item(288); + + /** + * Represents the gold bar item. + */ + private static final Item GOLD_BAR = new Item(2357); + + /** + * Constructs a new {@Code GoblinDiplomacy} {@Code Object} + */ + public GoblinDiplomacy() { + super("Goblin Diplomacy", 20, 19, 5); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new GDiplomacyCutscene(), new GoblinDiplomacyPlugin(), new GrubfootDialogue()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + player.getPacketDispatch().sendString(BLUE + "I can start this quest by speaking to " + RED + "Generals Wartface", 275, 4 + 7); + player.getPacketDispatch().sendString(RED + "and Bentnoze " + BLUE + "in the " + RED + " Goblin Village.", 275, 5+ 7); + player.getPacketDispatch().sendString(BLUE + "There are no requirements for this quest.", 275, 6+ 7); + break; + case 10: + line(player, "I spoke to Generals Wartface and Bentnoze in the Goblin", 4+ 7); + line(player, "Village and found that the goblins were on the bring of civil", 5+ 7); + line(player, "war over the colour of their armour. I offered to help the", 6+ 7); + line(player, "generals by finding another colour that they both like.", 7+ 7); + if (player.getInventory().containsItem(ORANGE_MAIL)) { + line(player, BLUE + "I have some " + RED + "Orange Goblin Armour. " + BLUE + "I should show it to the", 9+ 7); + line(player, BLUE + "generals.", 10+ 7); + } else { + line(player, BLUE + "I should bring the goblins some " + RED + "Orange Goblin Armour", 9+ 7); + line(player, BLUE + "Maybe the generals will know where to get some.", 10+ 7); + } + break; + case 20: + line(player, "I spoke to Generals Wartface and Bentnoze in the Goblin", 4+ 7); + line(player, "Village and found that the goblins were on the bring of civil", 5+ 7); + line(player, "war over the colour of their armour. I offered to help the", 6+ 7); + line(player, "generals by finding another colour that they both like.", 7+ 7); + line(player, "I brought the goblins some orange goblin armour, but they", 9+ 7); + line(player, "didn't like it.", 10+ 7); + if (player.getInventory().containsItem(BLUE_MAIL)) { + line(player, BLUE + "I have some " + RED + "Blue Goblin Armour. " + BLUE + "I should show it to the", 12+ 7); + line(player, BLUE + "generals.", 13+ 7); + } else { + line(player, BLUE + "I should bring the goblins s+ 7+ 7);e " + RED + "Blue Goblin Armour", 12+ 7); + line(player, BLUE + "Maybe the generals will know where to get some.", 13+ 7); + } + break; + case 30: + line(player, "I spoke to Generals Wartface and Bentnoze in the Goblin", 4+ 7); + line(player, "Village and found that the goblins were on the bring of civil", 5+ 7); + line(player, "war over the colour of their armour. I offered to help the", 6+ 7); + line(player, "generals by finding another colour that they both like.", 7+ 7); + line(player, "I brought the goblins some orange goblin armour, but they", 9+ 7); + line(player, "didn't like it.", 10+ 7); + line(player, "I brought the goblins some blue goblin armour, but they", 12+ 7); + line(player, "didn't like it.", 13+ 7); + if (player.getInventory().containsItem(GOBLIN_MAIL)) { + line(player, BLUE + "I have some " + RED + "Brown Goblin Armour. " + BLUE + "I should show it to the", 12+ 7); + line(player, BLUE + "generals.", 13+ 7); + } else { + line(player, BLUE + "I should bring the goblins some " + RED + "Brown Goblin Armour", 12+ 7); + line(player, BLUE + "Maybe the generals will know where to get some.", 13+ 7); + } + break; + case 100: + line(player, "I spoke to Generals Wartface and Bentnoze in the Goblin", 4+ 7); + line(player, "Village and found that the goblins were on the bring of civil", 5+ 7); + line(player, "war over the colour of their armour. I offered to help the", 6+ 7); + line(player, "generals by finding another colour that they both like.", 7+ 7); + line(player, "I brought the goblins some orange goblin armour, but they", 9+ 7); + line(player, "didn't like it.", 10+ 7); + line(player, "I brought the goblins some blue goblin armour, but they", 12+ 7); + line(player, "didn't like it.", 13+ 7); + line(player, "Unfortunately the goblins were very stupid, and it turned", 15+ 7); + line(player, "out that they liked the original colour the most. That's goblins", 16+ 7); + line(player, "for you I guess.", 17+ 7); + line(player, "QUEST COMPLETE!", 18+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("5 Quests Points", 277, 8 + 2); + player.getPacketDispatch().sendString("200 Crafting XP", 277, 9 + 2); + player.getPacketDispatch().sendString("A gold bar", 277, 10 + 2); + player.getPacketDispatch().sendString("You have completed the Goblin Diplomacy Quest!", 277, 2 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(288, 230, 277, 3 + 2); + player.getSkills().addExperience(Skills.CRAFTING, 200); + if (!player.getInventory().add(GOLD_BAR)) { + GroundItemManager.create(GOLD_BAR, player); + } + } + + @Override + public int[] getConfig(Player player, int stage) { + if (stage == 0) { + return new int[] { 62, 0 }; + } + if (stage == 10) { + return new int[] { 62, 1 }; + } else if (stage == 20) { + return new int[] { 62, 4 }; + } else if (stage == 30) { + return new int[] { 62, 5 }; + } else if (stage == 100) { + return new int[] { 62, 6 }; + } + return new int[] { 62, 0 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.java new file mode 100644 index 000000000..b83768506 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GoblinDiplomacyPlugin.java @@ -0,0 +1,267 @@ +package core.game.content.quest.free.goblindiplomacy; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.GameWorld; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.StringUtils; + +/** + * Represents the plugin used to handle node interactions related to goblin + * diplomacy. + * @author Vexia + * @version 1.0 + */ +public final class GoblinDiplomacyPlugin extends OptionHandler { + + /** + * Represents the goblin mail item. + */ + private static final Item GOBLIN_MAIL = new Item(288); + + /** + * Represents the creates item. + */ + private static final int[] CRATES = new int[] { 16557, 16561, 16560, 16559 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(288).getHandlers().put("option:wear", this); + for (int object : CRATES) { + ObjectDefinition.forId(object).getHandlers().put("option:search", this); + } + for (GoblinMailPlugin.GoblinMail mail : GoblinMailPlugin.GoblinMail.values()) { + ItemDefinition.forId(mail.getProduct().getId()).getHandlers().put("option:wear", this); + } + PluginManager.definePlugin(new GoblinMailPlugin()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int id = node instanceof Item ? ((Item) node).getId() : ((GameObject) node).getId(); + switch (option) { + case "wear": + player.getPacketDispatch().sendMessage("That armour is to small for a human."); + break; + } + switch (id) { + case 16559: + case 16557: + case 16561: + case 16560: + if (player.getAttribute("crate:" + id, 0) < GameWorld.getTicks()) { + player.setAttribute("crate:" + id, GameWorld.getTicks() + 500); + if (!player.getInventory().add(GOBLIN_MAIL)) { + GroundItemManager.create(GOBLIN_MAIL, player); + } + player.getDialogueInterpreter().sendItemMessage(GOBLIN_MAIL.getId(), "You find some goblin armour."); + return true; + } + player.getPacketDispatch().sendMessage("You search the crate but find nothing."); + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public boolean isWalk(final Player player, final Node node) { + return !(node instanceof Item); + } + + /** + * Represents the goblin mail plugin. + * @author 'Vexia + * @version 1.0 + */ + public static final class GoblinMailPlugin extends UseWithHandler { + + /** + * Constructs a new {@code GoblinMailPlugin} {@code Object}. + */ + public GoblinMailPlugin() { + super(1763, 1769, 1765, 1771, 1767, 1773, 4622, 11808, 6955); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(288, ITEM_TYPE, this); + int[] ids = new int[] { 1763, 1769, 1765, 1771, 1767, 1773, 4622, 11808, 6955 }; + for (int i : ids) { + addHandler(i, ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final GoblinMail mail = GoblinMail.forItem(event.getUsedItem()); + final Dyes dye = Dyes.forItem(event.getUsedItem(), event.getBaseItem()); + if (dye != null && (event.getUsedItem().getId() != 288 || event.getBaseItem().getId() != 288)) { + handleDyeMix(player, dye, event); + return true; + } + if (mail == null || (event.getUsedItem().getId() != 288 && event.getBaseItem().getId() != 288)) { + return false; + } + if (player.getInventory().remove(mail.getDye(), event.getBaseItem())) { + player.getInventory().add(mail.getProduct()); + player.getPacketDispatch().sendMessage("You dye the goblin armour " + mail.name().toLowerCase() + "."); + } + return true; + } + + /** + * Handles the mixing of dyes. + * @param player the player. + * @param dye the dye. + * @param event the event. + */ + public void handleDyeMix(final Player player, Dyes dye, NodeUsageEvent event) { + if (dye == null) { + player.getPacketDispatch().sendMessage("Those dyes dont mix together."); + return; + } + if (player.getInventory().remove(dye.getMaterials())) { + player.getInventory().add(dye.getProduct()); + } + player.getPacketDispatch().sendMessage("You mix the two dyes and make " + (StringUtils.isPlusN(dye.getProduct().getName().toLowerCase().replace("dye", "").trim()) ? "an " : "a ") + dye.getProduct().getName().toLowerCase().replace("dye", "").trim() + " one."); + + } + + /** + * Represents the goblin mail. + * @author 'Vexia + */ + public enum GoblinMail { + RED(new Item(1763), new Item(9054)), ORANGE(new Item(1769), new Item(286)), YELLOW(new Item(1765), new Item(9056)), GREEN(new Item(1771), new Item(9057)), BLUE(new Item(1767), new Item(287)), PURPLE(new Item(1773), new Item(9058)), BLACK(new Item(4622), new Item(9055)), WHITE(new Item(11808), new Item(11791)), PINK(new Item(6955), new Item(9059)); + + /** + * Represents the dye needed. + */ + private final Item dye; + + /** + * Represents the product. + */ + private final Item product; + + /** + * Constructs a new {@code GoblinMailPlugin} {@code Object}. + * @param dye the dye. + * @param product the product. + */ + GoblinMail(Item dye, Item product) { + this.dye = dye; + this.product = product; + } + + /** + * Gets the dye. + * @return The dye. + */ + public Item getDye() { + return dye; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Method used to get the goblin mail. + * @param item the item. + * @return the goblin mail. + */ + public static GoblinMail forItem(final Item item) { + for (GoblinMail mail : GoblinMail.values()) { + if (mail.getDye().getId() == item.getId()) { + return mail; + } + } + return null; + } + } + + /** + * Represents the dye types. + * @author 'Vexia + */ + public static enum Dyes { + ORANGE(new Item(1769), new Item(1763), new Item(1765)), + GREEN(new Item(1771), new Item(1765), new Item(1767)), + PURPLE(new Item(1773), new Item(1767), new Item(1763)); + + /** + * Constructs a new {@code MixDyePlugin} {@code Object}. + * @param product the product. + * @param materials the materials. + */ + Dyes(Item product, Item... materials) { + this.product = product; + this.materials = materials; + } + + /** + * Represents the product item. + */ + private final Item product; + + /** + * Represents the materials. + */ + private final Item[] materials; + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the materials. + * @return The materials. + */ + public Item[] getMaterials() { + return materials; + } + + /** + * Method used to get the dye by item. + * @param item the item. + * @param second the second. + * @return the dye. + */ + public static Dyes forItem(final Item item, final Item second) { + for (Dyes dye : Dyes.values()) { + if (dye.getMaterials()[0].getId() == item.getId() && dye.getMaterials()[1].getId() == second.getId() || dye.getMaterials()[0].getId() == second.getId() && dye.getMaterials()[1].getId() == item.getId()) { + return dye; + } + } + return null; + } + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GrubFoot.java b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GrubFoot.java new file mode 100644 index 000000000..3b110f9d1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GrubFoot.java @@ -0,0 +1,90 @@ +package core.game.content.quest.free.goblindiplomacy; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a grub foot. + * @author Vexia + */ +public enum GrubFoot { + NORMAL(4495, 1, new Item(288)), ORANGE(4497, 4, new Item(286)), BLUE(4498, 5, new Item(287)), BROWN(4496, 6, new Item(288)); + + /** + * The id. + */ + private final int id; + + /** + * The config value. + */ + private final int value; + + /** + * The goblin mail. + */ + private final Item mail; + + /** + * Constructs a new {@code GrubFoot} {@code Object}. + * @param id the id. + * @param value the value. + * @param mail the mail. + */ + private GrubFoot(int id, int value, Item mail) { + this.id = id; + this.value = value; + this.mail = mail; + } + + /** + * Gets the grub foot for the config. + * @param player the player. + * @return the grub foot. + */ + public static GrubFoot forConfig(final Player player) { + int config = player.getConfigManager().get(62); + for (GrubFoot foot : values()) { + if (foot.getValue() == config) { + if (foot.ordinal() + 1 >= values().length) { + return BROWN; + } + return values()[foot.ordinal() + 1]; + } + } + return NORMAL; + } + + /** + * Sets the config value. + * @param player the player. + */ + public void setConfig(Player player) { + player.getConfigManager().set(62, value); + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } + + /** + * Gets the value. + * @return The value. + */ + public int getValue() { + return value; + } + + /** + * Gets the mail. + * @return The mail. + */ + public Item getMail() { + return mail; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GrubfootDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GrubfootDialogue.java new file mode 100644 index 000000000..021702cb2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/goblindiplomacy/GrubfootDialogue.java @@ -0,0 +1,166 @@ +package core.game.content.quest.free.goblindiplomacy; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the grub foot dialogue. + * @author 'Vexia + * @date 28/12/2013 + */ +public final class GrubfootDialogue extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code GrubfootDialogue} {@code Object}. + */ + public GrubfootDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GrubfootDialogue} {@code Object}. + * @param player the player. + */ + public GrubfootDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GrubfootDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(GoblinDiplomacy.NAME); + switch (quest.getStage(player)) { + case 100: + npc("Me lonely."); + stage = 0; + break; + case 30: + npc("Me not like this blue colour."); + stage = 0; + break; + case 20: + npc("Me not like this orange armour. Make me look like that", "thing."); + stage = 0; + break; + default: + npc("Grubfoot wear red armour! Grubfoot wear green", "armour!"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 100: + switch (stage) { + case 0: + player("Why?"); + stage = 1; + break; + case 1: + npc("Other goblins in village follow either General Wartface", "or General Bentnoze. Me try to follow both but then", "me get left out of both groups."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(4493, null, "Shut up Grubfoot!"); + stage = 3; + break; + case 3: + end(); + break; + } + break; + case 30: + switch (stage) { + case 0: + player("Why not?"); + stage = 1; + break; + case 1: + npc("Me not know. It just make me feel..."); + stage = 2; + break; + case 2: + player("Makes you feel blue?"); + stage = 3; + break; + case 3: + npc("Makes me feel kinda of sad."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(4493, null, "Shut up Grubfoot!"); + stage = 5; + break; + case 5: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + player("Look like what thing?"); + stage = 1; + break; + case 1: + npc("That fruit thing. The one that orange. What it called?"); + stage = 2; + break; + case 2: + player("An orange?"); + stage = 3; + break; + case 3: + npc("That right. This armour make me look same colour as", "orange-fruit."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(4493, null, "Shut up Grubfoot!"); + stage = 5; + break; + case 5: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + npc("Why they not make up their minds?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(4493, null, "Shut up Grubfoot!"); + stage = 2; + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4495, 4497, 4498, 4496 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/piratestreasure/PiratesTreasure.java b/Server/src/main/java/Server/core/game/content/quest/free/piratestreasure/PiratesTreasure.java new file mode 100644 index 000000000..73a7f396d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/piratestreasure/PiratesTreasure.java @@ -0,0 +1,142 @@ +package core.game.content.quest.free.piratestreasure; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the pirates treasure quest. + * @author Vexia + * + */ +@Initializable +public final class PiratesTreasure extends Quest { + + /** + * Represents the message component for pirates treasure quest. + */ + public static final Component MESSAGE_COMPONENT = new Component(222); + + /** + * Represents the casket rewards (pirates treasure). + */ + public static final Item[] CASKET_REWARDS = new Item[] { new Item(995, 450), new Item(1635), new Item(1605) }; + + /** + * Represents the karamjan rum item. + */ + public static final Item KARAMJAN_RUM = new Item(431); + + /** + * Represents the chest key item. + */ + public static final Item KEY = new Item(432); + + /** + * Represents the pirate message item. + */ + public static final Item PIRATE_MESSAGE = new Item(433); + + /** + * Represents the casket item. + */ + public static final Item CASKET = new Item(7956); + + /** + * Constructs a new {@Code PiratesTreasure} {@Code Object} + */ + public PiratesTreasure() { + super("Pirate's Treasure", 23, 22, 2, 71, 0, 1, 4); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugin(new PiratesTreasurePlugin()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + player.getPacketDispatch().sendString(BLUE + "I can start this quest by speaking to " + RED + "Redbeard Frank " + BLUE + "who", 275, 4+ 7); + player.getPacketDispatch().sendString(BLUE + "is at " + RED + " Port Sarim.", 275, 5+ 7); + player.getPacketDispatch().sendString(BLUE + "There aren't any requirements for this quest.", 275, 7+ 7); + break; + case 10: + if (!player.getInventory().containsItem(KARAMJAN_RUM)) { + line(player, BLUE + "I have spoken to " + RED + " Redbeard Frank." + BLUE + " He has agreed to tell me", 4+ 7); + line(player, BLUE + "the location of some " + RED + " treasure " + BLUE + "for some " + RED + "Karamjan rum.", 5+ 7); + line(player, BLUE + "I have taken employment on the " + RED + "banana plantation " + BLUE + ", as the", 6+ 7); + line(player, RED + "Customs Officers " + BLUE + "might not notice the " + RED + "rum " + BLUE + "if it is covered", 7+ 7); + line(player, BLUE + "in " + RED + "bananas.", 8+ 7); + line(player, BLUE + "Now all I need is some " + RED + " rum " + BLUE + "to hide in the next crate", 10+ 7); + line(player, BLUE + "destined for " + RED + "Wydin's store" + BLUE + "...", 11+ 7); + } else { + line(player, BLUE + "I have spoken to " + RED + "Redbeard Frank " + BLUE + ". He has agreed to tell me", 5+ 7); + line(player, BLUE + "the location of some " + RED + "treasure " + BLUE + "for some " + RED + "Karamjan rum.", 6+ 7); + line(player, BLUE + "I have the " + RED + "Karamjan rum. " + BLUE + "I should take it to " + RED + "Redbeard Frank.", 8+ 7); + } + break; + case 20: + line(player, "I have smuggled some rum off Karamja, and retrieved it", 4+ 7); + line(player, "from the back room of Wydin's shop.", 5+ 7); + line(player, BLUE + "I have given the rum to " + RED + "Redbeard Frank." + BLUE + " He has told me", 7+ 7); + line(player, BLUE + "that the " + RED + "treasure " + BLUE + "is hidden in the chest in the upstairs", 8+ 7); + line(player, BLUE + "room of the " + RED + "Blue Moon Inn " + BLUE + "in " + RED + "Varrock.", 9+ 7); + if (player.getAttributes().containsKey("pirate-read")) { + line(player, BLUE + "The note reads " + RED + "'Visit the city of the White Knights. In the", 11+ 7); + line(player, RED + "park, Saradomin points to the X which marks the spot.'", 12+ 7); + if (!player.getInventory().containsItem(PIRATE_MESSAGE) && !player.getBank().containsItem(PIRATE_MESSAGE)) { + line(player, BLUE + "It's a good job I remembered that, as I have lost the " + RED + "note.", 14+ 7); + } + return; + } + if (player.getInventory().containsItem(PIRATE_MESSAGE)) { + line(player, BLUE + "I have opened the chest in the " + RED + "Blue Moon" + BLUE + ", and found a", 11+ 7); + line(player, RED + "note " + BLUE + "inside. I think it will tell me where to dig.", 12+ 7); + return; + } + if (player.getInventory().containsItem(KEY)) { + line(player, BLUE + "I have a " + RED + "key " + BLUE + "that can be used to unlock the chest that", 11+ 7); + line(player, BLUE + "holds the treasure.", 12+ 7); + } else { + line(player, BLUE + "I have lost the " + RED + "key " + BLUE + "that " + RED + "Redbeard Frank " + BLUE + "gave me. I should", 11+ 7); + line(player, BLUE + "see if he has another.", 12+ 7); + } + break; + case 100: + line(player, "The note reads 'Visit the city of the White Knights. In the", 4+ 7); + line(player, "park, Saradomin points to the X which marks the spot.'", 5+ 7); + line(player, "QUEST COMPLETE!", 7+ 7); + line(player, BLUE + "I've found a treasure, gained 2 Quest Points and gained", 9+ 7); + line(player, BLUE + "access to the Pay-fare option to travel to and from", 10+ 7); + line(player, BLUE + "Karamja!", 11+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("2 Quest Points", 277, 8 + 2); + player.getPacketDispatch().sendString("One-Eyed Hector's Treasure", 277, 9 + 2); + player.getPacketDispatch().sendString("Chest", 277, 10 + 2); + player.getPacketDispatch().sendString("You can also use the Pay-", 277, 11 + 2); + player.getPacketDispatch().sendString("fare option to go to and from", 277, 12 + 2); + player.getPacketDispatch().sendString("Karamja", 277, 13 + 2); + player.getPacketDispatch().sendString("You have completed the Pirate's Treasure Quest!", 277, 2 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(7956, 230, 277, 3 + 2); + player.removeAttribute("gardener-attack"); + player.removeAttribute("pirate-read"); + if (!player.getInventory().add(CASKET)) { + GroundItemManager.create(CASKET, player); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/piratestreasure/PiratesTreasurePlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/piratestreasure/PiratesTreasurePlugin.java new file mode 100644 index 000000000..9c64e3d10 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/piratestreasure/PiratesTreasurePlugin.java @@ -0,0 +1,120 @@ +package core.game.content.quest.free.piratestreasure; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DigAction; +import core.game.content.global.action.DigSpadeHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Represents the pirates treasure plugin. + * @author Vexia + * + */ +public final class PiratesTreasurePlugin extends OptionHandler { + + /** + * Represents the dig reward to use. + */ + private static final DigAction DIG_ACTION = new TreasureDigPlugin(); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2079).getHandlers().put("option:open", this);// blue + // moon + // chest(pirates + // treasure + // quest) + ItemDefinition.forId(433).getHandlers().put("option:read", this);// pirate + // message. + ItemDefinition.forId(7956).getHandlers().put("option:open", this); + for (Location l : TreasureDigPlugin.LOCATIONS) { + DigSpadeHandler.register(l, DIG_ACTION); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int id = node instanceof GameObject ? ((GameObject) node).getId() : ((Item) node).getId(); + switch (id) { + case 2079: + switch (option) { + case "open": + player.getPacketDispatch().sendMessage("The chest is locked."); + break; + } + break; + case 7956:// hectors casket + if (player.getInventory().remove(PiratesTreasure.CASKET)) { + for (Item i : PiratesTreasure.CASKET_REWARDS) { + if (!player.getInventory().add(i)) { + GroundItemManager.create(i, player); + } + } + player.getPacketDispatch().sendMessage("You open the casket, and find One-Eyed Hector's treasure."); + } + break; + case 433: + switch (option) { + case "read": + player.getInterfaceManager().open(PiratesTreasure.MESSAGE_COMPONENT); + player.getPacketDispatch().sendString("Visit the city of the White Knights. In the park,", 222, 5); + player.getPacketDispatch().sendString("Saradomin points to the X which marks the spot.", 222, 6); + player.setAttribute("/save:pirate-read", true); + break; + } + } + return true; + } + + /** + * Represents the treasure dig plugin. + * @author 'Vexia + * @version 1.0 + */ + public static final class TreasureDigPlugin implements DigAction { + + /** + * Represents the locations at which this event will occur. + */ + private static final Location[] LOCATIONS = new Location[] { new Location(2999, 3383, 0), Location.create(3000, 3383, 0) }; + + @Override + public void run(Player player) { + final Quest quest = player.getQuestRepository().getQuest("Pirate's Treasure"); + player.lock(2); + if (quest.getStage(player) == 20) { + if (player.getSavedData().getQuestData().isGardenerAttack()) { + player.getPacketDispatch().sendMessage("You dig a hole in the ground..."); + player.getPacketDispatch().sendMessage("and find a little chest of treasure."); + quest.finish(player); + } else { + if (player.getAttribute("gardener-dug", false)) { + return; + } + NPC npc = NPC.create(1217, player.getLocation().transform(0, 1, 0)); + npc.setAttribute("target", player); + npc.setRespawn(false); + npc.init(); + npc.sendChat("First moles, now this! Take this, vandal!"); + npc.getProperties().getCombatPulse().attack(player); + HintIconManager.registerHintIcon(player, npc); + player.setAttribute("gardener-dug", true); + } + return; + } + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/LadyKeliDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/LadyKeliDialogue.java new file mode 100644 index 000000000..5b086d50b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/LadyKeliDialogue.java @@ -0,0 +1,263 @@ +package core.game.content.quest.free.princealirescue; + +import java.util.List; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; + +/** + * Represents the dialogue which handles the lady keli transcript. + * @author 'Vexia + * @version 1.0 + */ +public final class LadyKeliDialogue extends DialoguePlugin { + + /** + * Represents the soft clay item. + */ + private static final Item SOFT_CLAY = new Item(1761); + + /** + * Represents the key print item. + */ + private static final Item KEY_PRINT = new Item(2423); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code LadyKeliDialogue} {@code Object}. + */ + public LadyKeliDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LadyKeliDialogue} {@code Object}. + * @param player the player. + */ + public LadyKeliDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LadyKeliDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + switch (quest.getStage(player)) { + case 60: + case 100: + npc.sendChat("You tricked me, and tied me up, Guards kill this stranger!"); + List npcc = RegionManager.getLocalNpcs(player); + for (NPC n : npcc) { + if (n.getId() == 917) { + n.sendChat("Yes M'lady"); + n.getProperties().getCombatPulse().attack(player); + } + } + end(); + break; + default: + interpreter.sendDialogues(player, null, "Are you the famous Lady Keli? Leader of the toughest", "gang of mercenary killers around?"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "I am Keli, you have heard of me then?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Heard of you? You are famous in " + GameWorld.getSettings().getName() + "!", "I have heard a little, but I think Katrine is tougher.", "I have heard rumours that you kill people.", "No I have never really heard of you."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "The great Lady Keli, of course I have heard of you.", "You are famous in " + GameWorld.getSettings().getName() + "!"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, null, "I think Katrine is tougher."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, null, "I have heard rumours that you kill people."); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, null, "No I have never really heard of you."); + stage = 40; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, null, "That's very kind of you to say. Reputations are", "not easily earned. I have managed to succeed", "where many fail."); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "I think Katrine is still tougher.", "What is your latest plan then?", "You must have trained a lot for this work.", "I should not disturb someone as tough as you."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "I think Katrine is tougher."); + stage = 20; + break; + case 2: + interpreter.sendDialogues(player, null, "What is your latest plan then? Of course, you need", "not go into specific details."); + stage = 22; + break; + case 3: + interpreter.sendDialogues(player, null, "You must have trained a lot for this work."); + stage = 25; + break; + case 4: + interpreter.sendDialogues(player, null, "I should not disturb someone as tough as you."); + stage = 27; + break; + } + break; + case 20: + interpreter.sendDialogues(npc, null, "Well you can think that all you like. I know those", "blackarm cowards dare not leave the city. Out here, I", "am the toughest. You can tell them that! Now get out of", "my sight, before I call my guards."); + stage = 21; + break; + case 21: + end(); + break; + case 22: + interpreter.sendDialogues(npc, null, "Well, I can tell you I have a valuable prisoner here", "in my cells."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, null, "I can expect a high reward to be paid very soon for", "this guy. I can't tell you who he is, but he is a lot", "colder now."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(player, null, "You must have been very skillful."); + stage = 50; + break; + case 50: + interpreter.sendDialogues(npc, null, "Yes. I did most of the work. We had to grab the Pr..."); + stage = 51; + break; + case 51: + interpreter.sendDialogues(npc, null, "Er, we had to grab him without his ten bodyguards", "noticing. It was a stroke of genius."); + stage = 52; + break; + case 52: + interpreter.sendDialogues(player, null, "Can you be sure they will not try to get him out?"); + stage = 53; + break; + case 53: + interpreter.sendDialogues(npc, null, "There is no way to release him. The only key to the", "door is on a chain around my neck and the locksmith", "who made the lock died suddenly when he had finished."); + stage = 54; + break; + case 54: + interpreter.sendDialogues(npc, null, "There is not another key like this in the world."); + stage = 55; + break; + case 55: + interpreter.sendDialogues(player, null, "Could I see the key please? Just for a moment. It", "would be something I can tell my grandchildren. When", "you are even more famous than you are now."); + stage = 56; + break; + case 56: + interpreter.sendDialogues(npc, null, "As you put it that way I am sure you can see it. You", "cannot steal the key, it is on a Runite chain."); + stage = 57; + case 57: + interpreter.sendDialogue("Keli shows you a small key on a strong looking chain."); + stage = 58; + break; + case 58: + if (player.getInventory().remove(SOFT_CLAY)) { + if (!player.getInventory().add(KEY_PRINT)) { + GroundItemManager.create(KEY_PRINT, player); + } + interpreter.sendDialogues(player, null, "Could I touch the key for a moment please?"); + stage = 59; + } else { + interpreter.sendDialogues(npc, null, "There, run along now I am very busy."); + stage = 63; + } + break; + case 59: + interpreter.sendDialogues(npc, null, "Only for a moment then."); + stage = 60; + break; + case 60: + interpreter.sendDialogue("You put a piece of your soft clay in your hand. As you touch the", "key, you take an imprint of it."); + stage = 61; + break; + case 61: + interpreter.sendDialogues(player, null, "Thank you so much, you are too kind, o great Keli."); + stage = 62; + break; + case 62: + interpreter.sendDialogues(npc, null, "You are welcome, run along now, I am very busy."); + stage = 63; + break; + case 63: + end(); + break; + case 25: + interpreter.sendDialogues(npc, null, "I have used a sword since I was a small girl. I stabbed", "three people before I was 6 years old."); + stage = 26; + break; + case 26: + end(); + break; + case 27: + interpreter.sendDialogues(npc, null, "I need to do a lot of work, goodbye. When you get a", "little tougher, maybe I will give you a job."); + stage = 28; + break; + case 28: + end(); + break; + case 30: + interpreter.sendDialogues(npc, null, "There's always someone ready to spread rumours. I", "hear all sort of ridiculous things these days."); + stage = 31; + break; + case 31: + end(); + break; + case 40: + interpreter.sendDialogues(npc, null, "You must be new to this land then. EVERYONE", "knows of Lady Keli and her prowess with the sword."); + stage = 41; + break; + case 41: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 919 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/LadyKeliNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/LadyKeliNPC.java new file mode 100644 index 000000000..b3c563c81 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/LadyKeliNPC.java @@ -0,0 +1,56 @@ +package core.game.content.quest.free.princealirescue; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; + +/** + * Represents the abstract lady keli npc. + * @author 'Vexia + * @version 1.0 + */ +public final class LadyKeliNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 919 }; + + /** + * Constructs a new {@code LadyKeliNPC} {@code Object}. + */ + public LadyKeliNPC() { + super(0, null, true); + } + + /** + * Constructs a new {@code LadyKeliNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private LadyKeliNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new LadyKeliNPC(id, location); + } + + @Override + public boolean isHidden(final Player player) { + return player.getAttribute("keli-gone", 0) > GameWorld.getTicks(); + } + + @Override + public int[] getIds() { + return ID; + } + + @Override + public int getWalkRadius() { + return 2; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/PrinceAliRescue.java b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/PrinceAliRescue.java new file mode 100644 index 000000000..b947f7245 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/PrinceAliRescue.java @@ -0,0 +1,203 @@ +package core.game.content.quest.free.princealirescue; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the prince ali rescue quest. + * @author Vexia + * + */ +@Initializable +public class PrinceAliRescue extends Quest { + + /** + * Represents the rope item. + */ + private static final Item ROPE = new Item(954); + + /** + * Represents the pink skirt item. + */ + private static final Item SKIRT = new Item(1013); + + /** + * Represents the yellow wig item. + */ + private static final Item YELLOW_WIG = new Item(2419); + + /** + * Represents the skin paste item. + */ + private static final Item PASTE = new Item(2424); + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 700); + + /** + * Constructs a new {@Code PrinceAliRescue} {@Code Object} + */ + public PrinceAliRescue() { + super("Prince Ali Rescue", 24, 23, 3, 273, 0, 1, 110); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new LadyKeliDialogue(), new LadyKeliNPC(), new PrinceAliRescuePlugin(), new WigDyePlugin()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + player.getPacketDispatch().sendString(BLUE + "I can start this quest by speaking to " + RED + "Hassan " + BLUE + "at the palace", 275, 4+ 7); + player.getPacketDispatch().sendString(BLUE + "in" + RED + " Al-Kharid.", 275, 5+ 7); + break; + case 10: + line(player, "I started this quest by speaking to Hassan in Al-Kharid", 4+ 7); + line(player, "Palace. he told me I should speak to Osman the spymaster.", 5+ 7); + line(player, BLUE + "I should go and speak to " + RED + "Osman " + BLUE + "for details on the quest.", 6+ 7); + break; + case 20: + line(player, "I started this quest by speaking to Hassan in Al-Kharid", 4+ 7); + line(player, "Palace. he told me I should speak to Osman the spymaster.", 5+ 7); + line(player, "I should go and speak to Osman for details on the quest.", 6+ 7); + line(player, RED + "Prince Ali " + BLUE + "has been " + RED + "kidnapped " + BLUE + "but luckily the spy " + RED + "Leela " + BLUE + "has", 7+ 7); + line(player, BLUE + "found he is being held near " + RED + "Draynor village. " + BLUE + "I will need to", 8+ 7); + line(player, RED + "disguise " + BLUE + "the " + RED + "Price " + BLUE + "and " + RED + "tie " + BLUE + "up his " + RED + "captop " + BLUE + "to " + RED + "free " + BLUE + "him from", 9+ 7); + line(player, BLUE + "their " + RED + "clutches.", 10+ 7); + line(player, BLUE + "To do this I should:-", 11+ 7); + line(player, BLUE + "Talk to " + RED + "Leela " + BLUE + "near " + RED + "Draynor Village " + BLUE + "for advice.", 12+ 7); + line(player, BLUE + "Get a " + RED + "duplicate " + BLUE + "of the " + RED + "key " + BLUE + "that is " + RED + "imprisoning " + BLUE + "the " + RED + "prince.", 13+ 7); + line(player, hasItem(player, ROPE) ? "I have some rope with me." : BLUE + "Get some " + RED + "rope " + BLUE + "to tie up the Princes' " + RED + "kidnapper.", 14+ 7); + line(player, hasItem(player, PASTE) ? "I have some skin paste suitable for disguise with me." : BLUE + "Get something to " + RED + "colour " + BLUE + "the " + RED + "Princes' skin " + BLUE + "as a " + RED + "disguise.", 15+ 7); + line(player, hasItem(player, SKIRT) ? "I have a skirt suitable for a disguise with me." : BLUE + "Get a " + RED + "skirt " + BLUE + "similar to his " + RED + "kidnapper " + BLUE + "as " + RED + "disguise.", 16+ 7); + line(player, hasItem(player, YELLOW_WIG) ? "I have a wig suitable for disguise with me." : BLUE + "Get a " + RED + "Wig " + BLUE + "to " + RED + "help disguise " + BLUE + "the " + RED + "prince.", 17+ 7); + break; + case 30: + line(player, "I started this quest by speaking to Hassan in Al-Kharid", 4+ 7); + line(player, "Palace. he told me I should speak to Osman the spymaster.", 5+ 7); + line(player, "I should go and speak to Osman for details on the quest.", 6+ 7); + line(player, RED + "Prince Ali " + BLUE + "has been " + RED + "kidnapped " + BLUE + "but luckily the spy " + RED + "Leela " + BLUE + "has", 7+ 7); + line(player, BLUE + "found he is being held near " + RED + "draynor village. " + BLUE + "I will need to", 8+ 7); + line(player, RED + "disguise " + BLUE + "the " + RED + "Price " + BLUE + "and " + RED + "tie " + BLUE + "up his " + RED + "captop " + BLUE + "to " + RED + "free " + BLUE + "him from", 9+ 7); + line(player, BLUE + "their " + RED + "clutches.", 10+ 7); + line(player, BLUE + "To do this I should:-", 11+ 7); + line(player, BLUE + "Talk to " + RED + "Leela " + BLUE + "near " + RED + "Draynor Village " + BLUE + "for advice.", 12+ 7); + line(player, BLUE + "I have duplicated a key, I need to get it from " + RED + "Leela.", 13+ 7); + line(player, hasItem(player, ROPE) ? "I have some rope with me." : BLUE + "Get some " + RED + "rope " + BLUE + "to tie up the Princes' " + RED + "kidnapper.", 14+ 7); + line(player, hasItem(player, PASTE) ? "I have some skin paste suitable for disguise with me." : BLUE + "Get something to " + RED + "colour " + BLUE + "the " + RED + "Princes' skin " + BLUE + "as a " + RED + "disguise.", 15+ 7); + line(player, hasItem(player, SKIRT) ? "I have a skirt suitable for a disguise with me." : BLUE + "Get a " + RED + "skirt " + BLUE + "similar to his " + RED + "kidnapper " + BLUE + "as " + RED + "disguise.", 16+ 7); + line(player, hasItem(player, YELLOW_WIG) ? "I have a wig suitable for disguise with me." : BLUE + "Get a " + RED + "Wig " + BLUE + "to " + RED + "help disguise" + BLUE + "the " + RED + "prince.", 17+ 7); + break; + case 40: + line(player, "I started this quest by speaking to Hassan in Al-Kharid", 4+ 7); + line(player, "Palace. he told me I should speak to Osman the spymaster.", 5+ 7); + line(player, "I should go and speak to Osman for details on the quest.", 6+ 7); + if (player.getAttribute("guard-drunk", false)) { + line(player, "Prince Ali has been kidnapped but luckily the spy Leela has", 7+ 7); + line(player, "found he is being held near Draynor village. I will need to", 8+ 7); + line(player, "disguise the Prince and tie up his captor to free him from", 9+ 7); + line(player, "their clutches.", 10+ 7); + line(player, "I also had to prevent the Guard from seeing that I was up", 10+ 7); + line(player, "to, by getting him drunk.", 11+ 7); + line(player, BLUE + "With the guard out of the way, all I have to do now is use", 11+ 7); + line(player, BLUE + "the " + RED + "Skin Potion" + BLUE + ", " + RED + "Pink Skirt" + BLUE + ", " + RED + "Rope" + BLUE + ", " + RED + "Blonde Wig " + BLUE + "and " + RED + "Cell Key " + BLUE + "to", 12+ 7); + line(player, BLUE + "free " + RED + "Prince Ali " + BLUE + "from his cell somehow.", 13+ 7); + } else { + line(player, BLUE + "Do something to prevent " + RED + "Joe the Guard " + BLUE + "seeing the", 7+ 7); + line(player, BLUE + "escape.", 8+ 7); + line(player, BLUE + "Use the " + RED + "Skin potion" + BLUE + ", " + RED + "Pink Skirt" + BLUE + "," + RED + "Rope" + BLUE + "," + RED + "Blonde Wig " + BLUE + "and " + RED + "Cell", 9+ 7); + line(player, RED + "Key" + BLUE + " to free " + RED + "Prince Ali " + BLUE + "from his cell somehow.", 10+ 7); + } + break; + case 50: + line(player, "I started this quest by speaking to Hassan in Al-Kharid", 4+ 7); + line(player, "Palace. he told me I should speak to Osman the spymaster.", 5+ 7); + line(player, "I should go and speak to Osman for details on the quest.", 6+ 7); + line(player, "Prince Ali has been kidnapped but luckily the spy Leela has", 7+ 7); + line(player, "found he is being held near Draynor village. I will need to", 8+ 7); + line(player, "disguise the Prince and tie up his captor to free him from", 9+ 7); + line(player, "their clutches.", 10+ 7); + line(player, "I also had to prevent the Guard from seeing that I was up", 10+ 7); + line(player, "to, by getting him drunk.", 11+ 7); + line(player, "With the guard disposed of, I used my rope to tie up Lady", 11+ 7); + line(player, "Keli in a cupboard, so I could disguise the Prince.", 12+ 7); + line(player, BLUE + "I need to " + RED + "Unlock the cell door " + BLUE + "and then give the Prince the", 13+ 7); + line(player, RED + "Pink Skirt" + BLUE + ", the " + RED + "Skin paste " + BLUE + "and the " + RED + "Blonde Swig " + BLUE + "so that the", 14+ 7); + line(player, BLUE + "can safely " + RED + "escape " + BLUE + "disguised as " + RED + "Lady Keli.", 15+ 7); + break; + case 60: + line(player, "I started this quest by speaking to Hassan in Al-Kharid", 4+ 7); + line(player, "Palace. he told me I should speak to Osman the spymaster.", 5+ 7); + line(player, "I should go and speak to Osman for details on the quest.", 6+ 7); + line(player, "Prince Ali has been kidnapped but luckily the spy Leela has", 7+ 7); + line(player, "found he is being held near Draynor village. I will need to", 8+ 7); + line(player, "disguise the Prince and tie up his captor to free him from", 9+ 7); + line(player, "their clutches.", 10+ 7); + line(player, "I also had to prevent the Guard from seeing that I was up", 10+ 7); + line(player, "to, by getting him drunk.", 11+ 7); + line(player, "With the guard disposed of, I used my rope to tie up Lady", 11+ 7); + line(player, "Keli in a cupboard, so I could disguise the Prince.", 12+ 7); + line(player, "I then used a wig, and some skin paste to make the", 13+ 7); + line(player, "prince look like Lady Keli so he could escape to his", 14+ 7); + line(player, "freedom with Leela after unlocking his cell door.", 15+ 7); + line(player, BLUE + "I should return to " + RED + "Hassan " + BLUE + "to claim my reward.", 16+ 7); + break; + case 100: + line(player, "I started this quest by speaking to Hassan in Al-Kharid", 4+ 7); + line(player, "Palace. he told me I should speak to Osman the spymaster.", 5+ 7); + line(player, "I should go and speak to Osman for details on the quest.", 6+ 7); + line(player, "Prince Ali has been kidnapped but luckily the spy Leela has", 7+ 7); + line(player, "found he is being held near Draynor village. I will need to", 8+ 7); + line(player, "disguise the Prince and tie up his captor to free him from", 9+ 7); + line(player, "their clutches.", 10+ 7); + line(player, "I also had to prevent the Guard from seeing that I was up", 10+ 7); + line(player, "to, by getting him drunk.", 11+ 7); + line(player, "With the guard disposed of, I used my rope to tie up Lady", 11+ 7); + line(player, "Keli in a cupboard, so I could disguise the Prince.", 12+ 7); + line(player, "I then used a wig, and some skin paste to make the", 13+ 7); + line(player, "prince look like Lady Keli so he could escape to his", 14+ 7); + line(player, "freedom with Leela after unlocking his cell door.", 15+ 7); + line(player, "Hassan the chancellor rewarded me for all of my help.", 16+ 7); + line(player, "I am now a friend of Al-Kharid and may pass through the", 17+ 7); + line(player, "gate leading between Lumbridge and Al-Kharid for free", 18+ 7); + line(player, "QUEST COMPLETE!", 19+ 7); + break; + } + } + + /** + * Check if the player has the item. + * @param player the player. + * @param item the item. + * @return true or false. + */ + public static boolean hasItem(final Player player, final Item item) { + return player.getInventory().containsItem(item); + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendMessage("The chancellor pays you 700 coins."); + player.getPacketDispatch().sendString("3 Quests Points", 277, 8 + 2); + player.getPacketDispatch().sendString("700 Coins", 277, 9 + 2); + player.getPacketDispatch().sendString("You have completed the Prince Ali Rescue Quest!", 277, 2 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(995, 20, 230, 277, 3 + 2); + if (!player.getInventory().add(COINS)) { + GroundItemManager.create(COINS, player); + } + player.removeAttribute("guard-drunk"); + } + + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/PrinceAliRescuePlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/PrinceAliRescuePlugin.java new file mode 100644 index 000000000..9d057b59e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/PrinceAliRescuePlugin.java @@ -0,0 +1,89 @@ +package core.game.content.quest.free.princealirescue; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.object.GameObject; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle prince ali rescue quest interaction nodes. + * @author Vexia + * + */ +@Initializable +public class PrinceAliRescuePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2881).getHandlers().put("option:open", this);// prison + // door. + ObjectDefinition.forId(4639).getHandlers().put("option:open", this);// door + // to + // jail + NPCDefinition.forId(925).getHandlers().put("option:talk-to", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + final int id = node instanceof GameObject ? ((GameObject) node).getId() : node instanceof NPC ? ((NPC) node).getId() : 0; + switch (id) { + case 925: + player.getDialogueInterpreter().open(925, node); + break; + case 2881: + switch (quest.getStage(player)) { + case 60: + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + break; + case 50: + if (player.getAttribute("keli-gone", 0) > GameWorld.getTicks()) { + if (player.getInventory().contains(2418, 1)) { + player.getPacketDispatch().sendMessage("You unlock the door."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } else { + player.getPacketDispatch().sendMessage("The door is locked."); + } + } else { + player.getPacketDispatch().sendMessage("You'd better get rid of Lady Keli before trying to go through there."); + } + break; + default: + player.getPacketDispatch().sendMessage("You'd better get rid of Lady Keli before trying to go through there."); + break; + } + break; + } + return true; + } + + static Location[] locs = new Location[] { new Location(3268, 3227, 0), Location.create(3268, 3228, 0), Location.create(3267, 3228, 0), Location.create(3267, 3227, 0) }; + + @Override + public Location getDestination(final Node node, Node n) { + if (n instanceof NPC) { + NPC npc = ((NPC) n); + if (npc.getLocation().equals(new Location(3268, 3226, 0))) { + return locs[0]; + } else if (npc.getLocation().equals(new Location(3268, 3229, 0))) { + return locs[1]; + } else if (npc.getLocation().equals(new Location(3267, 3229, 0))) { + return locs[2]; + } else if (npc.getLocation().equals(new Location(3267, 3226, 0))) { + return locs[3]; + } + } + return null; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/WigDyePlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/WigDyePlugin.java new file mode 100644 index 000000000..5cf2bebfe --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/princealirescue/WigDyePlugin.java @@ -0,0 +1,54 @@ +package core.game.content.quest.free.princealirescue; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Represents the plugin used to dye a wig yellow. + * @author 'Vexia + * @version 1.0 + */ +public final class WigDyePlugin extends UseWithHandler { + + /** + * Represents the yellow dye item. + */ + private static final Item YELLOW_DYE = new Item(1765); + + /** + * Represents the wig item. + */ + private static final Item WIG = new Item(2421); + + /** + * Represents the yellow wig item. + */ + private static final Item YELLOW_WIG = new Item(2419); + + /** + * Constructs a new {@code WigDyePlugin} {@code Object}. + */ + public WigDyePlugin() { + super(1765); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2421, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(WIG, YELLOW_DYE)) { + player.getInventory().add(YELLOW_WIG); + player.getPacketDispatch().sendMessage("You dye the wig blonde."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/CertificatePlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/CertificatePlugin.java new file mode 100644 index 000000000..8579c012c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/CertificatePlugin.java @@ -0,0 +1,46 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin handler used for the certificates related to shield of + * arrav. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CertificatePlugin extends UseWithHandler { + + /** + * Represents the certificate item. + */ + private static final Item CERTIFICATE = new Item(769); + + /** + * Constructs a new {@code CertificatePlugin} {@code Object}. + */ + public CertificatePlugin() { + super(11173); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(11174, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(new Item(event.getUsedItem().getId(), 1), new Item(event.getBaseItem().getId(), 1))) { + player.getInventory().add(CERTIFICATE); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/CuratorHaigHalenDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/CuratorHaigHalenDialogue.java new file mode 100644 index 000000000..33cb116d6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/CuratorHaigHalenDialogue.java @@ -0,0 +1,140 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the curator haig halen dialogue. + * @author 'Vexia + * @version 1.0 + */ +public final class CuratorHaigHalenDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CuratorHaigHalenDialogue} {@code Object}. + */ + public CuratorHaigHalenDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CuratorHaigHalenDialogue} {@code Object}. + * @param player the player. + */ + public CuratorHaigHalenDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CuratorHaigHalenDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Welcome to the museum of Varrock."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getQuestRepository().getQuest("Shield of Arrav").getStage(player) == 70 && player.getInventory().containsItem(ShieldofArrav.PHOENIX_SHIELD) || player.getInventory().containsItem(ShieldofArrav.BLACKARM_SHIELD)) { + switch (stage) { + case 0: + player("I have half the shield of Arrav here. Can I get a", "reward?"); + stage = 1; + break; + case 1: + npc("The Shield of Arrav! Goodness, the Museum has been", "searching for that for years! The late King Roald II", "offered a reward for it years ago!"); + stage = 2; + break; + case 2: + player("Well, I'm here to claim it."); + stage = 3; + break; + case 3: + npc("Let me have a look at it first."); + stage = 4; + break; + case 4: + interpreter.sendItemMessage(ShieldofArrav.getShield(player), "The curator peers at the shield."); + stage = 5; + break; + case 5: + npc("This is incredible!"); + stage = 6; + break; + case 6: + npc("That shield has been missing for over twenty-five years!"); + stage = 7; + break; + case 7: + npc("Leave the shield here with me and I'll write you out a", "certificate saying that you have returned the shield, so", "that you can claim your reward from the King."); + stage = 8; + break; + case 8: + player("Can I have two certificates please?"); + stage = 9; + break; + case 9: + npc("Yes, certainly. Please hand over the shield."); + stage = 10; + break; + case 10: + interpreter.sendItemMessage(ShieldofArrav.getShield(player), "You hand over the shield half."); + stage = 11; + break; + case 11: + final Item shield = ShieldofArrav.getShield(player); + final Item certificate = shield == ShieldofArrav.BLACKARM_SHIELD ? ShieldofArrav.BLACKARM_CERTIFICATE : ShieldofArrav.PHOENIX_CERTIFICATE; + if (player.getInventory().remove(shield)) { + player.getInventory().add(certificate); + interpreter.sendItemMessage(certificate, "The curator writes out two half-certificates."); + stage = 12; + } + break; + } + return true; + } else { + switch (stage) { + case 12: + npc("Of course you won't actually be able to claim the", "reward with only half the reward certificate..."); + stage = 13; + break; + case 13: + player("What? I went through a lot of trouble to get that shield", "piece and now you tell me it was for nothing? That's", "not very fair!"); + stage = 14; + break; + case 14: + npc("Well, if you were to get me the other half of the shield,", "I could give you the other half of the reward certificate.", "It's rumoured to be in the possession of the infamous", "Blackarm Gang, beyond that I can't help you."); + stage = 15; + break; + case 15: + player("Okay, I'll see what I can do."); + stage = 16; + break; + case 16: + end(); + break; + } + } + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 646 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/JohnnyBeardNPC.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/JohnnyBeardNPC.java new file mode 100644 index 000000000..b298a0a5c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/JohnnyBeardNPC.java @@ -0,0 +1,58 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.world.map.Location; + +/** + * Represents the npc to handle Johnny the beard npc. + * @author 'Vexia + * @version 1.0 + */ +public final class JohnnyBeardNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 645 }; + + /** + * Constructs a new {@code JohnnyBeardNPC} {@code Object}. + */ + public JohnnyBeardNPC() { + super(0, null); + } + + /** + * Constructs a new {@code JohnnyBeardNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private JohnnyBeardNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new JohnnyBeardNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + final Player p = ((Player) killer); + final Quest quest = p.getQuestRepository().getQuest("Shield of Arrav"); + if (quest.getStage(p) == 60 && ShieldofArrav.isPhoenixMission(p) && !p.getInventory().containsItem(ShieldofArrav.INTEL_REPORT) && !p.getBank().containsItem(ShieldofArrav.INTEL_REPORT)) { + GroundItemManager.create(ShieldofArrav.INTEL_REPORT, getLocation(), p); + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/JonnytheBeardPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/JonnytheBeardPlugin.java new file mode 100644 index 000000000..4a8ff5ec0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/JonnytheBeardPlugin.java @@ -0,0 +1,68 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the plugin used for jonny the beard. + * @author 'Vexia + * @version 1.0 + */ +public final class JonnytheBeardPlugin extends DialoguePlugin { + + /** + * Constructs a new {@code JonnytheBearPlugin} {@code Object}. + */ + public JonnytheBeardPlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JonnytheBearPlugin} {@code Object}. + * @param player the player. + */ + public JonnytheBeardPlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JonnytheBeardPlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (ShieldofArrav.isPhoenixMission(player)) { + player.getPacketDispatch().sendMessage("Johnny the beard is not interested in talking."); + end(); + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Will you buy me a beer?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, I don't think I will."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 645 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/KatrineDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/KatrineDialogue.java new file mode 100644 index 000000000..250b17f1d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/KatrineDialogue.java @@ -0,0 +1,454 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Represents the katrine NPC dialogue. + * @author 'Vexia + * @version 1.0 + */ +public final class KatrineDialogue extends DialoguePlugin { + + /** + * Represents the corssbow items. + */ + private static final Item CROSSBOWS = new Item(767, 2); + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code KatrineDialogue} {@code Object}. + */ + public KatrineDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KatrineDialogue} {@code Object}. + * @param player the player. + */ + public KatrineDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KatrineDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Shield of Arrav"); + switch (quest.getStage(player)) { + case 80: + case 90: + case 100: + case 70: + if (ShieldofArrav.isPhoenix(player)) { + npc("You've got some guts coming here, Phoenix guy!"); + stage = 200; + } else { + player("Hey."); + stage = 0; + } + break; + case 60: + if (ShieldofArrav.isBlackArmMission(player)) { + npc("Have you got those crossbows for me yet?"); + stage = 200; + } else { + player("What is this place?"); + stage = 0; + } + break; + default: + player("What is this place?"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (quest.getStage(player) == 60 && stage >= 200) { + switch (stage) { + case 200: + if (!player.getInventory().containsItem(CROSSBOWS)) { + player("No, I haven't found them yet."); + stage = 201; + } else { + player("Yes, I have."); + stage = 204; + } + break; + case 201: + npc("I need two crossbows stolen from the Phoenix Gang", "weapons stash, which if you head east for a bit, is a", "building on the south side of the road."); + stage = 202; + break; + case 202: + npc("Come back when you got 'em."); + stage = 203; + break; + case 203: + end(); + break; + case 204: + interpreter.sendDialogue("You give the crossbows to Katrine."); + stage = 205; + break; + case 205: + if (!player.getInventory().containsItem(CROSSBOWS)) { + end(); + return true; + } + if (player.getInventory().remove(CROSSBOWS)) { + npc("Ok. You can join our gang now. Feel free to enter", "any of the rooms of the ganghouse."); + stage = 206; + quest.setStage(player, 70); + ShieldofArrav.setBlackArm(player); + } + break; + case 206: + end(); + break; + } + return true; + } + switch (quest.getStage(player)) { + case 80: + case 90: + case 100: + case 70: + switch (stage) { + case 0: + npc("Hey."); + stage = 1; + break; + case 1: + end(); + break; + case 200: + interpreter.sendDialogue("Katrine spits."); + stage = 201; + break; + case 201: + npc("Now get lost!"); + stage = 202; + break; + case 202: + end(); + break; + case 206: + end(); + break; + } + break; + case 60: + case 50: + switch (stage) { + case 0: + npc("It's a private business. Can I help you at all?"); + stage = 1; + break; + case 1: + options("I've heard you're the Black Arm Gang.", "What sort of business?", "I'm looking for fame and riches."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("I've heard you're the Black Arm Gang."); + stage = 100; + break; + case 2: + player("What sort of business?"); + stage = 10; + break; + case 3: + player("I'm looking for fame and riches."); + stage = 20; + break; + } + break; + case 100: + npc("Who told you that?"); + stage = 101; + break; + case 101: + options("I'd rather not reveal my sources.", "It was Charlie, the tramp outside.", "Everyone knows - it's no great secret."); + stage = 102; + break; + case 102: + switch (buttonId) { + case 1: + player("I'd rather not reveal my sources."); + stage = 110; + break; + case 2: + player("It was Charlie, the tramp outside."); + stage = 120; + break; + case 3: + player("Everyone knows - it's not great secret."); + stage = 130; + break; + } + break; + case 110: + npc("Yes, I can understand that. So what do you want with", "us?"); + stage = 111; + break; + case 111: + options("I want to become a member of your gang.", "I want some hints for becoming a thief.", "I'm looking for the door out of here."); + stage = 112; + break; + case 112: + switch (buttonId) { + case 1: + player("I want to become a member of your gang."); + stage = 160; + break; + case 2: + player("I want some hints for becoming a thief."); + stage = 113; + break; + case 3: + player("I'm looking for the door out of here."); + stage = 115; + break; + } + break; + case 160: + npc("How unusual."); + stage = 161; + break; + case 161: + npc("Normally we recruit for our gang by watching local", "thugs and thieves in reward. People don't normally waltz", "in here saying 'hello, can I play'."); + stage = 162; + break; + case 162: + npc("How can I be sure you can be trusted?"); + stage = 163; + break; + case 163: + options("Well, you can give me a try can't you?", "Well, people tell me I have an honest face."); + stage = 164; + break; + case 164: + switch (buttonId) { + case 1: + player("Well, you can give me a try can't you?"); + stage = 167; + break; + case 2: + player("Well, people tell me I have an honest face."); + stage = 165; + break; + } + break; + case 165: + npc("... How unusual. Someone honest wanting to join a", "gang of thieves. Excuse me if I remain unconvinced."); + stage = 166; + break; + case 166: + npc("Thinking about it... I may have a solution actually."); + stage = 169; + break; + case 167: + npc("I'm not so sure."); + stage = 166; + break; + case 169: + npc("Our rival gang - the Phoenix Gang - has a weapons", "stash a little east of here."); + stage = 170; + break; + case 170: + npc("We're fresh out of crossbows, so if you could steal a", "couple of crossbows for us it would be very much", "appreciated."); + stage = 171; + break; + case 171: + npc("Then I'll be happy to call you a Black Arm."); + stage = 172; + break; + case 172: + player("Sounds simple enough. Any particular reason you need", "two of them?"); + stage = 173; + break; + case 173: + npc("I have an idea for framing a local merchant who is", "refusing to pay our, very reasonable, 'keep-your-life-", "pleasant' insurance rates. I need two phoenix crossbows;", "one to kill somebody important with and the other to"); + stage = 174; + break; + case 174: + npc("hide in the merchant's house where the local law can", "find it! When they find it, they'll suspect him of", "murdering the target for the Phoenix gang and", "hopefully, arrest the whole gang! Leaving us as the only"); + stage = 175; + break; + case 175: + npc("thieves gang in Varrock! Brilliant, eh?"); + stage = 176; + break; + case 176: + player("Yeah, brilliant. So who are you planning to murder?"); + stage = 177; + break; + case 177: + npc("I haven't decided yet, but it'll need to be somebody", "important. Say, why you being so nosey? You aren't", "with the law are you?"); + stage = 178; + break; + case 178: + player("No, no! Just curious."); + stage = 179; + break; + case 179: + npc("You'd better just keep your mouth shut about this plan,", "or I'll make sure it stays shut for you. Now, are you", "going to get those crossbows or not?"); + stage = 180; + break; + case 180: + options("Ok, no problem.", "Sounds a little tricky. Got anything easier?"); + stage = 181; + break; + case 181: + switch (buttonId) { + case 1: + player("Ok, no problem."); + stage = 184; + break; + case 2: + player("Sounds a little tricky. Got anything easier?"); + stage = 182; + break; + } + break; + case 182: + npc("If you're not up to a little bit of dager I don't think", "you've got anything to offer our gang."); + stage = 183; + break; + case 183: + end(); + break; + case 184: + quest.setStage(player, 60); + ShieldofArrav.setBlackArmMission(player); + npc("Great! You'll find the Phoenix gang's weapon stash just", "next to a temple, due east of here."); + stage = 185; + break; + case 185: + end(); + break; + case 113: + npc("Well, I'm sorry luv, I'm not giving away any of my", "secrets."); + stage = 114; + break; + case 114: + end(); + break; + case 115: + interpreter.sendDialogue("Katrine groans."); + stage = 116; + break; + case 116: + npc("Try... the one you just came in?"); + stage = 117; + break; + case 117: + end(); + break; + case 120: + npc("Is that guy still out there? He's getting to be a", "nuisance. Remind me to send someone to kill him."); + stage = 121; + break; + case 121: + end(); + break; + case 130: + npc("I thought we were safe back here!"); + stage = 131; + break; + case 131: + player("Oh no, not at all... It's so obvious! Even the town", "guard have caught on..."); + stage = 132; + break; + case 132: + npc("Wow! We MUSE be obvious! I guess they'll be", "expecting bribes again soon in that case."); + stage = 133; + break; + case 133: + npc("Thanks for the information."); + stage = 134; + break; + case 134: + end(); + break; + case 10: + npc("A small, family business. We give financial advice to", "other companies."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc("And you expect to find it up the back streets of", "Varrock?"); + stage = 21; + break; + case 21: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + npc("It's a private business. Can I help you at all?"); + stage = 1; + break; + case 1: + options("What sort of business?", "I'm looking for fame and riches."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("What sort of business?"); + stage = 10; + break; + case 2: + player("I'm looking for fame and riches."); + stage = 20; + break; + } + break; + case 10: + npc("A small, family business. We give financial advice to", "other companies."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc("And you expect to find it up the back streets of", "Varrock?"); + stage = 21; + break; + case 21: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 642 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/KingRoaldDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/KingRoaldDialogue.java new file mode 100644 index 000000000..ef38bab69 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/KingRoaldDialogue.java @@ -0,0 +1,516 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.tools.Items; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.entity.skill.Skills; + +/** + * Represents the dialogue used to handle king roald NPC. + * @author 'Vexia + * @version 1.0 + */ +public class KingRoaldDialogue extends DialoguePlugin { + + /** + * Represents the certificate item. + */ + private static final Item CERTIFICATE = new Item(769); + + /** + * Constructs a new {@code KingRoaldDialogue} {@code Object}. + */ + public KingRoaldDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KingRoaldDialogue} {@code Object}. + * @param player the player. + */ + public KingRoaldDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KingRoaldDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if(player.getQuestRepository().getQuest("All Fired Up").getStage(player) == 90){ + player("Greetings, your majesty."); + stage = 600; + return true; + } + if(player.getAttribute("afu-mini:ring",false) || player.getAttribute("afu-mini:gloves",false) || player.getAttribute("afu-mini:adze",false)){ + player("Your Majesty! I did it!"); + stage = 700; + return true; + } + if(player.getQuestRepository().getQuest("Shield of Arrav").isStarted(player) && !player.getQuestRepository().getQuest("Shield of Arrav").isCompleted(player)){ + player("Greetings, your majesty."); + stage = 0; + return true; + } + switch (player.getQuestRepository().getQuest("Priest in Peril").getStage(player)) { + case 0: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Greetings, your majesty."); + stage = 0; + break; + case 100: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Greetings, your majesty."); + if(player.getQuestRepository().getQuest("All Fired Up").isCompleted(player)){ + stage = 200; + } else { + stage = 499; + } + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getQuestRepository().getQuest("Shield of Arrav").getStage(player) == 70 && player.getInventory().containsItem(ShieldofArrav.PHOENIX_SHIELD) || player.getInventory().containsItem(ShieldofArrav.BLACKARM_SHIELD)) { + switch (stage) { + case 0: + if (player.getInventory().containsItem(ShieldofArrav.PHOENIX_SHIELD) || player.getInventory().containsItem(ShieldofArrav.BLACKARM_SHIELD)) { + player("Your majesty, I have recovered the Shield of Arrav; I", "would like to claim the reward."); + stage = 1; + } + break; + case 1: + npc("The Shield of Arrav, eh? Yes, I do recall my father,", "King Roald, put a reward out for that."); + stage = 2; + break; + case 2: + npc("Very well."); + stage = 3; + break; + case 3: + npc("If you get the authenticity of the shield verified by the", "curator at the museum and then return here with", "authentication, I will grant your reward."); + stage = 4; + break; + case 4: + end(); + break; + } + return true; + } + if (player.getQuestRepository().getQuest("Shield of Arrav").getStage(player) == 70 && player.getInventory().containsItem(ShieldofArrav.BLACKARM_CERTIFICATE) || player.getInventory().containsItem(ShieldofArrav.PHOENIX_CERTIFICATE)) { + switch (stage) { + case 0: + player("Your majesty, I have come to claim the reward for the", "return of the Shield of Arrav."); + stage = 1; + break; + case 1: + interpreter.sendItemMessage(player.getInventory().containsItem(ShieldofArrav.BLACKARM_CERTIFICATE) ? ShieldofArrav.BLACKARM_CERTIFICATE.getId() : ShieldofArrav.PHOENIX_CERTIFICATE.getId(), "You show the certificate to the king."); + stage = 2; + break; + case 2: + npc("I'm afraid that's only half the reward certificate. You'll", "have to get the other half and join them together if you", "want to cliam the reward."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + if (player.getQuestRepository().getQuest("Shield of Arrav").getStage(player) == 70 && player.getInventory().containsItem(CERTIFICATE)) { + switch (stage) { + case 0: + player("Your majesty, I have come to claim the reward for the", "return of the Shield of Arrav."); + stage = 1; + break; + case 1: + interpreter.sendItemMessage(CERTIFICATE.getId(), "You show the certificate to the king."); + stage = 2; + break; + case 2: + npc("My goodness! This claim is for the reward offered by", "my father many years ago!"); + stage = 3; + break; + case 3: + npc("I never thought I would live to see the day when", "someone came forward to claim this reward!"); + stage = 4; + break; + case 4: + npc("I heard that you found half the shield, so I will give", "you half of the bounty. That comes to exactly 600 gp!"); + stage = 5; + break; + case 5: + interpreter.sendItemMessage(CERTIFICATE.getId(), "You hand over a certificate. The king gives you 600 gp."); + stage = 6; + break; + case 6: + if (player.getInventory().remove(CERTIFICATE)) { + if (!player.getInventory().add(new Item(995, 600))) { + GroundItemManager.create(new Item(995, 600), player); + } + player.getQuestRepository().getQuest("Shield of Arrav").finish(player); + end(); + } + break; + } + return true; + } + Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well hello there. What do you want?"); + stage = 1; + break; + case 1: + if (quest.getStage(player) == 0) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I am looking for a quest!"); + stage = 2; + return true; + } + if (quest.getStage(player) <= 11) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You have news of Drezel for me?"); + stage = 20; + } + if (quest.getStage(player) == 12) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You have news of Drezel for me?"); + stage = 23; + } + if (quest.getStage(player) == 13) { + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "AND MORE IMPORTANTLY, WHY HAVEN'T", "YOU ENSURED THE BORDER TO", "MORYTANIA IS SECURE YET?"); + stage = 40; + } + if (quest.getStage(player) == 14) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm looking for a key to unlock drezel!"); + stage = 50; + } + if (quest.getStage(player) == 15 || quest.getStage(player) == 16 || quest.getStage(player) == 17) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm helping Drezel!"); + stage = 50; + } + if (quest.getStage(player) == 100) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, it's you again. Hello there."); + stage = 200; + } + break; + case 200: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Do you have anything of importace to say?"); + stage = 201; + break; + case 201: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "...Not really."); + stage = 202; + break; + case 202: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You will have to excuse me, then. I am very busy as I", "have a kingdom to run!"); + stage = 203; + break; + case 203: + end(); + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "A quest you say? Hmm, what an odd request to make", "of the king. It's funny you should mention it though, as", "there is something you can do for me."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Are you aware of the temple easy of here? It stands on", "the river Salve and guards the entrance to the lands of", "Morytania?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, I don't think I know it..."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hmm, how strange that you don't. Well anyway, it has", "been some days since last I heard from Drezel, the", "priest who lives there."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Be a sport and go make sure that nothing untoward", "has happend to the silly old codger for me, would you?"); + stage = 7; + break; + case 7: + interpreter.sendOptions("Select an Option", "Sure.", "No, that sounds boring."); + stage = 8; + break; + case 8: + switch (buttonId) { + case 1: + quest.start(player); + player.getQuestRepository().syncronizeTab(player); + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sure. I don't have anything better to do right now."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, I dare say it does. I wouldn't even have", "mentioned it had you not seemed to be looking for", "something to do anyway."); + stage = 9; + break; + } + break; + case 9: + end(); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Many thanks adventurer! I would have sent one of my", "squires but they wanted payment for it!"); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No not yet."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I would wish you would go check on my dear friend."); + stage = 22; + break; + case 22: + end(); + break; + case 23: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yeah, I spoke to the guys at the temple and they said", "they were being bothered by that dog in the crypt, so I", "went and killed it for them. No problem."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "YOU DID WHAT???"); + stage = 25; + break; + case 25: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "Are you mentally deficient??? That guard dog was", "protecting the route to Morytania! Without it we could", "be in severe peril of attack!"); + stage = 26; + break; + case 26: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Did I make a mistake?"); + stage = 27; + break; + case 27: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "YES YOU DID!!!!! You need to get there", "and find out what is happening! Before it is too late for", "us all!"); + stage = 28; + break; + case 28: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "B-but Drezel TOLD me to...!"); + stage = 29; + break; + case 29: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "No, you absolute cretin! Obviously some fiend has done", "something to Drezel and tricked your feeble intellect", "into helping them kill that guard dog!"); + stage = 30; + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "You get back there and do whatever is necessary to", "safeguard my kingdom from attack, or I will see you", "beheaded for high treason!"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Y-yes your Highness."); + stage = 32; + break; + case 32: + quest.setStage(player, 13); + end(); + break; + case 40: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, okay, I'm going, I'm going.... There's no need to", "shout..."); + stage = 41; + break; + case 41: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "NO NEED TO SHOUT???"); + stage = 42; + break; + case 42: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Listen, and listen well, and see if your puny mind can", "comprehend this; if the border is not protected, then we", "are at the mercy of the evil beings"); + stage = 43; + break; + case 43: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "that live in Morytania. Given the most of the", "inhabitants consider humans to be nothing more than", "over talkative snack foods, I would"); + stage = 44; + break; + case 44: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "say that me shouting at you for your incompetence is", "the LEAST of your worries right now NOW GO!"); + stage = 45; + break; + case 45: + end(); + break; + case 50: + end(); + break; + case 499: + npc("Ah, it's you again. Hello there."); + stage = 500; + break; + case 500: + player("Hello, Your Majesty. I am happy to report that the", "situation at the Temple of Paterdomus has been sorted.", "Misthalin's borders should once again be fully protected", "against the threats of Morytania."); + stage++; + break; + case 501: + npc("Ah, thank you! The kingdom is forever in your", "debt."); + stage++; + break; + case 502: + player("In your debt? Does that mean you're going to give me", "fabulous rewards for my efforts?"); + stage++; + break; + case 503: + npc("Of course not; however, if it's rewards you're after, it", "occurs to me that you could be of even more service to", "the kingdom...and this time, there's payment in it for", "you."); + stage++; + break; + case 504: + options("Oh, tell me more!", "Sorry, not interested."); + stage++; + break; + case 505: + switch (buttonId) { + case 1: + player("Oh, tell me more!"); + stage++; + break; + case 2: + player("Sorry, not interested."); + stage = 50; + break; + } + break; + case 506: + npc("Well, you see, because of the mounting threats from", "Morytania and the Wilderness, the southern kingdoms", "have banded together to take action."); + stage++; + break; + case 507: + npc("We have constructed a network of beacons that stretch", "all the way from the source of the River Salve to the", "northwestern-most edge of the Wilderness."); + stage++; + break; + case 508: + npc("Should there be any threat from these uncivilized lands,", "we'll be able to spread the word as fast as the light of", "the flames can travel."); + stage++; + break; + case 509: + player("So how could I be of help?"); + stage++; + break; + case 510: + npc("The task itself should be rather straightforward: I need", "you to help us test the network of beacons to make", "sure everything is in order, in case the worst", "should occur."); + stage++; + break; + case 511: + options("I'd be happy to help.", "I'm a bit busy right now."); + stage++; + break; + case 512: + switch (buttonId) { + case 1: + player("I'd be happy to help."); + stage++; + break; + case 2: + player("I'm a bit busy right now."); + stage = 50; + break; + } + break; + case 513: + if (player.getSkills().getLevel(Skills.FIREMAKING) < 43) { + npc("I'd love for you to help, but you need", "to get better at lighting fires first."); + stage = 50; + } else { + npc("Excellent! The kingdom of Misthalin is eternally", "grateful."); + stage++; + } + break; + case 514: + player("So what do I need to do?"); + stage++; + break; + case 515: + npc("Talk to the head fire tender, Blaze Sharpeye - he'll", "explain everything. He is stationed just south of the", "Temple of Paterdomus, on the cliffs by the River Salve."); + stage++; + break; + case 516: + player("Thank you, Your Majesty. I'll seek out Blaze", "right away."); + stage = 50; + player.getQuestRepository().getQuest("All Fired Up").start(player); + break; + case 600: + player("I'm happy to report that the beacon network seems to", "be working as expected."); + stage++; + break; + case 601: + npc("Excellent! I'm delighted to hear it."); + stage++; + break; + case 602: + player("So, about that reward you promised?"); + stage++; + break; + case 603: + npc("What happened to the days when adventurers felt", "rewarded in full by the knowledge of a job well done?"); + stage++; + break; + case 604: + player("Well before my time, I'm afraid."); + stage++; + break; + case 605: + npc("Hmph. Well, I suppose a king must stick to his word.", "Mind you, let me stress how grateful we are - and how", "grateful we'd be if you could continue helping us test", "the beacons."); + stage++; + break; + case 606: + npc("There is much more to be done and this is but a", "pittance compared to what I'm willing to offer for", "further assistance!"); + stage++; + break; + case 607: + end(); + player.getQuestRepository().getQuest("All Fired Up").finish(player); + break; + case 700: + npc("Did what?"); + stage++; + break; + case 701: + if (player.getAttribute("afu-mini:adze", false)) { + player("I lit all 14 beacons at once!"); + } else if (player.getAttribute("afu-mini:gloves", false)) { + player("I lit 10 beacons at once!"); + } else if (player.getAttribute("afu-mini:ring", false)) { + player("I lit 6 beacons at once!"); + } + stage++; + break; + case 702: + npc("Oh, wonderful! Here is your reward then."); + if (player.getAttribute("afu-mini:adze", false)) + if (player.getInventory().add(new Item(Items.INFERNO_ADZE_13661))) + player.removeAttribute("afu-mini:adze"); + if (player.getAttribute("afu-mini:gloves", false)) + if (player.getInventory().add(new Item(Items.FLAME_GLOVES_13660))) + player.removeAttribute("afu-mini:gloves"); + if (player.getAttribute("afu-mini:ring", false)) + if (player.getInventory().add(new Item(Items.RING_OF_FIRE_13659))) + player.removeAttribute("afu-mini:ring"); + stage++; + break; + case 703: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 648, 2590, 5838 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ReldoDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ReldoDialogue.java new file mode 100644 index 000000000..490db4dac --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ReldoDialogue.java @@ -0,0 +1,617 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.tools.Items; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; + +/** + * Represents the dialogue to handle reldo. + * + * @author 'Vexia + * @dtae 27/12/2013 + */ +public class ReldoDialogue extends DialoguePlugin { + + /** + * Represents the knight sword quest instance. + */ + private Quest knightSword; + + /** + * Represents the shield of arrav quest instance. + */ + private Quest shieldArrav; + + /** + * The achievement diary. + */ + private AchievementDiary diary; + + /** + * If w'ere chatting about our diary. + */ + private boolean isDiary; + + private final int level = 1; + + /** + * Constructs a new {@code ReldoDialogue} {@code Object}. + */ + public ReldoDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ReldoDialogue} {@code Object}. + * + * @param player the player. + */ + public ReldoDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + knightSword = player.getQuestRepository().getQuest("The Knight's Sword"); + shieldArrav = player.getQuestRepository().getQuest("Shield of Arrav"); + if (args.length == 2 && ((String) args[1]).equals("book")) { + player("Aha! 'The Shield of Arrav'! Exactly what I was looking", "for."); + stage = 3; + return true; + } + if(player.getQuestRepository().getQuest("Lost Tribe").getStage(player) == 40 && player.getInventory().contains(Items.BROOCH_5008,1)){ + options("Hello stranger.","I have a question about my Achievement Diary.","Ask about the brooch."); + } else { + options("Hello stranger.", "I have a question about my Achievement Diary."); + } + stage = -1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (isDiary) { + // https://www.youtube.com/watch?v=2q-29WxUl1U + switch (stage) { + case 999: + end(); + break; + case -1: + // when available, "Can I change my Varrock teleport point?" is option 2 + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage++; + break; + case 0: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); + } + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 410; + break; + case 2: + player("What are the rewards?"); + stage = 420; + break; + case 3: + player("How do I claim the rewards?"); + stage = 430; + break; + case 4: + player("See you later."); + stage = 999; + break; + } + break; + case 440: + npc("Really? How extraordinary! Well, that certainly is a ", "worthy achievement indeed."); + stage++; + break; + case 441: + player("Thanks. Was there a reward?"); + stage++; + break; + case 442: + npc("A reward? Well, yes, I suppose I can help you there."); + stage = 444; + break; + case 444: + diary.setLevelRewarded(level); + for (Item i : diary.getType().getRewards(level)) { + player.getInventory().add(i, player); + } + sendDialogue("Reldo takes the Varrock armour and attaches some more plate metal", "to it, filling it out to look like a proper suit of armour. He etches", "some words into the armour, which glows slightly before fading."); + stage++; + break; + case 445: + npc("I have enhanced your body armour with a spell so that,", "when using the Edgeville furnace, you'll have the chance", "of smelting an extra bar up to mithril. It will also give", "you the chance of an extra ore when Mining up to"); + stage++; + break; + case 446: + npc("mithril as well."); + stage++; + break; + case 447: + npc("Smithing can take time, so I have placed a small speed", "enhancement on the armour. When you smith with this armour on, there is a chance that you will be able to", "smith faster each time and thus decrease the time it"); + stage++; + break; + case 448: + npc("takes to produce forged items."); + stage++; + break; + case 449: + npc("I can also change your Varrock Teleport spell so that it", "takes you to the Grand Exchange, if you'd find that more convenient."); + stage++; + break; + case 450: + npc("As an extra reward I have also given you a magical lamp to help with your skills."); + stage++; + break; + case 451: + player("Wow, thanks! What if I lose the armour?"); + stage++; + break; + case 452: + npc("Oh, that's not a problem. You can come back to see me", "and I'll get you another set."); + stage = -1; + break; + + case 460: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("You better be more careful this time."); + stage = 999; + break; + + case 410: + npc("It's a diary that helps you keep track of particular", "achievements. Here in Varrock it can help you", "discover some quite useful things. Eventually, with", "enough exploration, the people of Varrock will reward"); + stage++; + break; + case 411: + npc("you."); + stage++; + break; + case 412: + npc("You can see what tasks you have listed by clicking on", "the green button in the Quest List."); + stage = 999; + break; + case 420: + npc("Well, there's three different levels of Varrock Armour,", "which match up with the three levels of difficulty. Each", "has the same rewards as the previous level, and an", "additional one too... but I won't spoil your surprise."); + stage++; + break; + case 421: + npc("Rest assured, the people of Varrock are happy to see", "you visiting the land."); + stage = 999; + break; + case 430: + npc("Just complete the tasks so they're all ticked off, then", "you can claim your reward. Most of them are", "straightforward; you might find some require quests to", "be started, if not finished."); + stage++; + break; + case 431: + npc("To claim the different Varrock Armour, speak to Vannaka", "Rat Burgis, and myself."); + stage = 999; + break; + } + return true; + } + if (stage == -1) { + switch (buttonId) { + case 1: + npc("Hello stranger."); + stage = 0; + break; + case 2: + player("I have a question about my Achievement Diary."); + stage = 900; + break; + case 3: + player("What can you tell me about this brooch?"); + stage = 2000; + break; + } + return true; + } + if (stage == 900) { + sendDiaryDialogue(); + return true; + } + //Lost Tribe + if(stage >= 2000){ + switch(stage){ + case 2000: + npc("I've never seen that symbol before. Where did you find","it?"); + stage++; + break; + case 2001: + player("In a cave beneath Lumbridge."); + stage++; + break; + case 2002: + npc("Very odd. Have you any idea how it got there?"); + stage++; + break; + case 2003: + player("A goblin might have dropped it."); + stage++; + break; + case 2004: + npc("I've never heard of a goblin carrying a brooch like this.","But just a minute..."); + stage++; + break; + case 2005: + npc("The other day I filed a book about ancient goblin tribes.","It's somewhere on the west end of the library, I think.","Maybe that will be of some use."); + player.getQuestRepository().getQuest("Lost Tribe").setStage(player,42); + stage++; + break; + case 2006: + + } + return true; + } + if (knightSword.getStage(player) == 10) { + switch (stage) { + default: + handleKnightSword(buttonId); + handleQuest(buttonId); + break; + } + return true; + } + switch (shieldArrav.getStage(player)) { + case 20: + switch (stage) { + case 0: + player("Ok. I've read the book. Do you know where I can find", "the Phoenix Gang?"); + stage = 1; + break; + case 1: + npc("No, I don't. I think I know someone who might", "however."); + stage = 2; + break; + case 2: + npc("If I were you I would talk to Baraeck, the fur trader in", "the market place. I've heard he has connections with the", "Phoenix Gang."); + stage = 3; + break; + case 3: + player("Thanks, I'll try that!"); + stage = 4; + break; + case 4: + shieldArrav.setStage(player, 30); + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + player("About that book... where is it again?"); + stage = 1; + break; + case 1: + npc("I'm not sure where it is exactly... but I'm sure it's", "around here somewhere."); + stage = 2; + break; + case 2: + end(); + break; + case 14: + end(); + break; + case 3: + interpreter.sendDialogue("You take the book from the bookcase."); + stage = 4; + break; + case 4: + if (!player.getInventory().add(ShieldofArrav.BOOK)) { + GroundItemManager.create(ShieldofArrav.BOOK, player); + } + end(); + break; + } + break; + case 0: + switch (stage) { + case 0: + options("I'm in search of a quest.", "Do you have anything to trade?", "What do you do?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("I'm in search of a quest."); + stage = 10; + break; + case 2: + player("Do you have anything to trade?"); + stage = 20; + break; + case 3: + player("What do you do?"); + stage = 30; + break; + } + break; + case 30: + npc("I am the palace librarian."); + stage = 31; + break; + case 31: + player("Ah. That's why you're in the library then."); + stage = 32; + break; + case 32: + npc("Yes."); + stage = 33; + break; + case 33: + end(); + break; + case 20: + npc("Only knowledge."); + stage = 21; + break; + case 21: + player("How much do you want for that then?"); + stage = 22; + break; + case 22: + npc("No, sorry, that was just my little joke. I'm not the", "trading type."); + stage = 23; + break; + case 23: + player("Ah well."); + stage = 24; + break; + case 24: + end(); + break; + default: + handleQuest(buttonId); + break; + } + break; + default: + switch (stage) { + case 0: + options("Do you have anything to trade?", "What do you do?"); + stage = 1; + break; + default: + regular(buttonId); + break; + } + break; + } + return true; + } + + /** + * Method used to handle the quest. + */ + public final void handleQuest(int buttonId) { + switch (stage) { + case 10: + npc("Hmmm. I don't... believe there are any here..."); + stage = 11; + break; + case 11: + npc("Let me think actually..."); + stage = 12; + break; + case 12: + npc("Ah yes. I know. If you look in a book called 'The Shield", "of Arrav', you'll find a quest in there."); + stage = 13; + break; + case 13: + shieldArrav.start(player); + npc("I'm not not sure where the book is mind you... but I'm", "sure it's around here somewhere."); + stage = 14; + break; + case 14: + player("Thank you."); + stage = 15; + break; + case 15: + end(); + break; + } + } + + /** + * Method used to handle his regular chat. + * + * @param buttonId the buttonId. + */ + public void regular(int buttonId) { + switch (stage) { + case 1: + switch (buttonId) { + case 1: + player("Do you have anything to trade?"); + stage = 20; + break; + case 2: + player("What do you do?"); + stage = 30; + break; + } + break; + case 30: + npc("I am the palace librarian."); + stage = 31; + break; + case 31: + player("Ah. That's why you're in the library then."); + stage = 32; + break; + case 32: + npc("Yes."); + stage = 33; + break; + case 33: + end(); + break; + case 20: + npc("Only knowledge."); + stage = 21; + break; + case 21: + player("How much do you want for that then?"); + stage = 22; + break; + case 22: + npc("No, sorry, that was just my little joke. I'm not the", "trading type."); + stage = 23; + break; + case 23: + player("Ah well."); + stage = 24; + break; + case 24: + end(); + break; + } + } + + /** + * Handles the knight sword dial. + * + * @param buttonId the button Id. + */ + public void handleKnightSword(int buttonId) { + switch (stage) { + case 0: + options("Do you have anything to trade?", "What do you do?", "What do you know about Imcando dwarves?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Do you have anything to trade?"); + stage = 20; + break; + case 2: + player("What do you do?"); + stage = 30; + break; + case 3: + player("What do you know about Imcando dwarves?"); + stage = 40; + break; + } + break; + case 30: + npc("I am the palace librarian."); + stage = 31; + break; + case 31: + player("Ah. That's why you're in the library then."); + stage = 32; + break; + case 32: + npc("Yes."); + stage = 33; + break; + case 33: + end(); + break; + case 20: + npc("Only knowledge."); + stage = 21; + break; + case 21: + player("How much do you want for that then?"); + stage = 22; + break; + case 22: + npc("No, sorry, that was just my little joke. I'm not the", "trading type."); + stage = 23; + break; + case 23: + player("Ah well."); + stage = 24; + break; + case 24: + end(); + break; + case 40: + npc("The Imcando dwarves, you say?"); + stage = 41; + break; + case 41: + npc("Ah yes... for many hundreds of years they were the", "world's most skilled smiths. They used secret smithing", "knowledge passed down from generation to generation."); + stage = 42; + break; + case 42: + npc("Unfortunately, about a century ago, the once thriving", "race was wiped out during the barbarian invasions of", "that time."); + stage = 43; + break; + case 43: + player("So are there any Imcando left at all?"); + stage = 44; + break; + case 44: + npc("I believe a few of them survived, but with the bulk of", "their population destroyed their numbers have dwindled", "even further."); + stage = 45; + break; + case 45: + npc("I believe I remember a couple living in Asgarnia near", "the cliffs on the Asgarnian southern peninusla, but they", "DO tend to keep to themselves."); + stage = 46; + break; + case 46: + npc("They tend not to tell people that they're the", "descendants of the Imcando, which is why people think", "that the tribe has died out totally, but you may well", "have more luck talking to them if you bring them some"); + stage = 47; + break; + case 47: + npc("redberry pie. They REALLY like redberry pie."); + stage = 48; + break; + case 48: + knightSword.setStage(player, 20); + end(); + break; + } + } + + /** + * Sends the diary dialogue. + */ + private void sendDiaryDialogue() { + isDiary = true; + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); + } + if (diary.isComplete(level) && !diary.isLevelRewarded(level)) { + player("I've finished all the medium tasks in my Varrock", "Achievement Diary."); + stage = 440; + return; + } + if (diary.isLevelRewarded(level) && diary.isComplete(level) && !player.hasItem(diary.getType().getRewards(level)[0])) { + player("I've seemed to have lost my armour..."); + stage = 460; + return; + } + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 0; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ReldoDialogue(player); + } + + @Override + public int[] getIds() { + return new int[]{2660, 2661}; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ShieldArravPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ShieldArravPlugin.java new file mode 100644 index 000000000..170b94042 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ShieldArravPlugin.java @@ -0,0 +1,230 @@ +package core.game.content.quest.free.shieldofarrav; + +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.content.global.action.PickupHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the shield of arrav plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class ShieldArravPlugin extends OptionHandler { + + /** + * Represents the message component for intel report. + */ + private static final Component MESSAGE_COMPONENT = new Component(222); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2402).getHandlers().put("option:search", this); + ObjectDefinition.forId(2397).getHandlers().put("option:open", this); + ObjectDefinition.forId(2399).getHandlers().put("option:open", this); + ObjectDefinition.forId(2398).getHandlers().put("option:open", this); + ItemDefinition.forId(761).getHandlers().put("option:read", this); + ObjectDefinition.forId(2403).getHandlers().put("option:open", this); + ObjectDefinition.forId(2404).getHandlers().put("option:close", this); + ObjectDefinition.forId(2404).getHandlers().put("option:search", this); + ItemDefinition.forId(767).getHandlers().put("option:take", this); + ObjectDefinition.forId(24356).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(2400).getHandlers().put("option:open", this); + ObjectDefinition.forId(2401).getHandlers().put("option:search", this); + ObjectDefinition.forId(2401).getHandlers().put("option:shut", this); + ItemDefinition.forId(ShieldofArrav.PHOENIX_CERTIFICATE.getId()).getHandlers().put("option:read", this); + ItemDefinition.forId(ShieldofArrav.BLACKARM_CERTIFICATE.getId()).getHandlers().put("option:read", this); + ItemDefinition.forId(769).getHandlers().put("option:read", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Shield of Arrav"); + final int id = node instanceof GameObject ? ((GameObject) node).getId() : node instanceof Item ? ((Item) node).getId() : ((NPC) node).getId(); + switch (id) { + case 769: + player.getInterfaceManager().open(new Component(526)); + player.getPacketDispatch().sendString("You can use this certificate in order to claim your reward.", 526, 2); + break; + case 11173: + player.getInterfaceManager().open(new Component(525)); + player.getPacketDispatch().sendString("Attach this certificate to another.", 525, 2); + break; + case 11174: + player.getInterfaceManager().open(new Component(529)); + player.getPacketDispatch().sendString("Attach this certificate to another.", 529, 2); + break; + case 2400: + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(2401)); + break; + case 2401: + switch (option) { + case "search": + if (quest.getStage(player) == 70 && ShieldofArrav.isBlackArm(player)) { + if (!player.getInventory().containsItem(ShieldofArrav.BLACKARM_SHIELD) && !player.getBank().containsItem(ShieldofArrav.BLACKARM_SHIELD)) { + if (!player.getInventory().add(ShieldofArrav.BLACKARM_SHIELD)) { + GroundItemManager.create(ShieldofArrav.BLACKARM_SHIELD, player); + } + player.getDialogueInterpreter().sendItemMessage(ShieldofArrav.BLACKARM_SHIELD.getId(), "You find half of a shield, which you take."); + } else { + player.getDialogueInterpreter().sendDialogue("The cupboard is bare."); + } + } + break; + case "shut": + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(2400)); + break; + } + break; + case 24356: + if (node.getLocation().getX() == 3188) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(3188, 3392, 1)); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + } + break; + case 767: + List npcs = RegionManager.getLocalNpcs(player); + NPC master = null; + for (NPC n : npcs) { + if (n.getId() == 643) { + master = n; + break; + } + } + if (master == null) { + return true; + } + if (!ShieldofArrav.isPhoenix(player) && !master.isInvisible()) { + player.getDialogueInterpreter().open(643, master, true); + } else { + return PickupHandler.take(player, (GroundItem) node); + } + break; + case 2403: + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(2404)); + break; + case 2404: + switch (option) { + case "close": + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(2403)); + break; + case "search": + if (quest.getStage(player) == 70 && ShieldofArrav.isPhoenix(player)) { + if (!player.getInventory().containsItem(ShieldofArrav.PHOENIX_SHIELD) && !player.getBank().containsItem(ShieldofArrav.PHOENIX_SHIELD)) { + if (!player.getInventory().add(ShieldofArrav.PHOENIX_SHIELD)) { + GroundItemManager.create(ShieldofArrav.PHOENIX_SHIELD, player); + } + player.getDialogueInterpreter().sendItemMessage(ShieldofArrav.PHOENIX_SHIELD.getId(), "You find half of a shield, which you take."); + } else { + player.getDialogueInterpreter().sendDialogue("The chest is empty."); + } + } + break; + } + break; + case 761: + player.getPacketDispatch().sendString("Intelligence Report", 222, 1); + player.getPacketDispatch().sendString("There is an archeologist hanging around the", 222, 1); + player.getPacketDispatch().sendString("statue outside of the city, with mining equipment", 222, 2); + player.getPacketDispatch().sendString("Could she be onto a hidden treasure buried near", 222, 3); + player.getPacketDispatch().sendString("the statue?", 222, 4); + player.getPacketDispatch().sendString("There is a new channel being dug and a barge", 222, 5); + player.getPacketDispatch().sendString("being assembled near the digsite. The Varrock", 222, 6); + player.getPacketDispatch().sendString("museum seems to be paying for it. Could they", 222, 7); + player.getPacketDispatch().sendString("have information about new treasures?", 222, 8); + player.getInterfaceManager().open(MESSAGE_COMPONENT); + break; + case 2398: + if (quest.getStage(player) == 60 && ShieldofArrav.isBlackArmMission(player) && !player.getInventory().containsItem(ShieldofArrav.KEY)) { + player.getDialogueInterpreter().sendDialogue("This is the door to the weapon stash you were looking for. Maybe if", "you can find another adventurer who happens to be a member of the", "Phoenix Gang, they could help you."); + return true; + } else if (quest.getStage(player) == 60 && player.getInventory().containsItem(ShieldofArrav.KEY)) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + if (quest.getStage(player) == 70 && player.getInventory().containsItem(ShieldofArrav.KEY)) { + if (!player.getInventory().containsItem(ShieldofArrav.KEY) && player.getLocation().getY() > 3385) { + player.getPacketDispatch().sendMessage("You should get a replacement key from Straven to enter here."); + return true; + } else { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + } + player.getPacketDispatch().sendMessage("The door is securely locked."); + break; + case 2399: + if (!ShieldofArrav.isBlackArm(player)) { + player.getPacketDispatch().sendMessage("This door seems to be locked from the inside."); + } else { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } + break; + case 2397: + if (ShieldofArrav.isPhoenix(player)) { + player.getPacketDispatch().sendMessage("The door automatically opens for you."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + player.getPacketDispatch().sendMessage("The door is securely locked."); + break; + case 2402: + if (quest.getStage(player) != 10) { + player.getPacketDispatch().sendMessage("A large collection of books."); + } else { + if (!player.getInventory().containsItem(ShieldofArrav.BOOK) && !player.getBank().containsItem(ShieldofArrav.BOOK)) { + player.getDialogueInterpreter().open(2660, Repository.findNPC(2660), "book"); + } else { + player.getPacketDispatch().sendMessage("You already own 'The Shield of Arrav', the book that was kept here."); + } + } + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public boolean isWalk(final Player player, final Node node) { + if (node instanceof GroundItem) { + return true; + } + return !(node instanceof Item); + } + + @Override + public Location getDestination(Node n, Node node) { + if (node instanceof GameObject) { + if (node.getName().toLowerCase().contains("door")) { + return DoorActionHandler.getDestination((Player) n, (GameObject) node); + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java new file mode 100644 index 000000000..283c5bcfc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ShieldofArrav.java @@ -0,0 +1,289 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the shield of arrav quest. + * @author Vexia + * + */ +@Initializable +public class ShieldofArrav extends Quest { + + /** + * Represents the shield of arrav book item. + */ + public static final Item BOOK = new Item(757); + + /** + * Represents the intel report item. + */ + public static final Item INTEL_REPORT = new Item(761); + + /** + * Represents the weapon store item key. + */ + public static final Item KEY = new Item(759); + + /** + * Represents the phoenix shield item. + */ + public static final Item PHOENIX_SHIELD = new Item(763); + + /** + * Represents the black arm shield item. + */ + public static final Item BLACKARM_SHIELD = new Item(765); + + /** + * Represents the blackarm certificate item. + */ + public static final Item BLACKARM_CERTIFICATE = new Item(11174, 2); + + /** + * Represents the phoenix certificate item. + */ + public static final Item PHOENIX_CERTIFICATE = new Item(11173, 2); + + /** + * Constructs a new {@Code ShieldofArrav} {@Code Object} + */ + public ShieldofArrav() { + super("Shield of Arrav", 29, 28, 1, 145, 0, 1, 7); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new CertificatePlugin(), new CuratorHaigHalenDialogue(), new JohnnyBeardNPC(), new JonnytheBeardPlugin(), new KatrineDialogue(), new KingRoaldDialogue(), new ReldoDialogue(), new ShieldArravPlugin(), new ShieldofArravBook(), new StravenDialogue(), new WeaponsMasterDialogue()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + player.getPacketDispatch().sendString(BLUE + "I can start this quest by speaking to " + RED + "Reldo " + BLUE + "in " + RED + "Varrock's", 275, 4+ 7); + player.getPacketDispatch().sendString(RED + "Palace Library" + BLUE + ", or by speaking to " + RED + "Charlie the Tramp" + BLUE + " near", 275, 5+ 7); + player.getPacketDispatch().sendString(BLUE + "the " + RED + "Blue Moon Inn " + BLUE + "in " + RED + "Varrock.", 275, 6+ 7); + player.getPacketDispatch().sendString(BLUE + "I will need a friend to help me and some combat experience", 275, 7+ 7); + player.getPacketDispatch().sendString(BLUE + "may be an advantage.", 275, 8+ 7); + break; + case 10: + line(player, RED + "Reldo " + BLUE + "says there is a " + RED + "quest " + BLUE + "hidden in one of the books in", 4+ 7); + line(player, BLUE + "his " + RED + "library" + BLUE + " somewhere. I should look for it and see.", 5+ 7); + break; + case 20: + line(player, "I read about a valuable shield stolen long ago by a gang of", 4+ 7); + line(player, "thieves with an outstanding reward upon it.", 5+ 7); + line(player, BLUE + "I should ask " + RED + "Reldo " + BLUE + "if he knows anything more about this.", 6+ 7); + break; + case 30: + line(player, "I read about a valuable shield stolen long ago by a gang of", 4+ 7); + line(player, "thieves with an outstanding reward upon it.", 5+ 7); + line(player, BLUE + "Reldo told me that the fur trader in " + RED + "Varrock" + BLUE + ", named", 6+ 7); + line(player, RED + "Baraek" + BLUE + ", knows about the " + RED + "Phoenix Gang." + BLUE + " I should speak to", 7+ 7); + line(player, BLUE + "him next.", 8+ 7); + break; + case 40: + line(player, "I read about a valuable shield stolen long ago by a gang of", 4+ 7); + line(player, "thieves with an outstanding reward upon it.", 5+ 7); + line(player, BLUE + "Baraek told me that the " + RED + "'Phoenix Gang' " + BLUE + "have a hideout in", 6+ 7); + line(player, BLUE + "the " + RED + "south-eastern part of Varrock" + BLUE + ", disgusing themselves", 7+ 7); + line(player, BLUE + "as the " + RED + "VTAM Corporation" + BLUE + ". I should find them and join.", 8+ 7); + break; + case 50: + line(player, "I read about a valuable shield stolen long ago by a gang of", 4+ 7); + line(player, "thieves with an outstanding reward upon it.", 5+ 7); + line(player, BLUE + "Baraek told me that the " + RED + "'Phoenix Gang' " + BLUE + "have a hideout in", 6+ 7); + line(player, BLUE + "the " + RED + "south-eastern part of Varrock" + BLUE + ", disguising themselves", 7+ 7); + line(player, BLUE + "as the " + RED + "VTAM Corporation" + BLUE + ". I should find them and join.", 8+ 7); + line(player, "I also spoke to Charlie the tramp in Varrock.", 9+ 7); + line(player, BLUE + "According to him there is a criminal organisation known as", 10+ 7); + line(player, BLUE + "the " + RED + "'Black Arm Gang' " + BLUE + "down an alley near to him. I should", 11+ 7); + line(player, BLUE + "speak to their " + RED + "leader, Katrine" + BLUE + ", about joining.", 12+ 7); + break; + case 60: + line(player, "I read about a valuable shield stolen long ago by a gang of", 4+ 7); + line(player, "thieves with an outstanding reward upon it. Baraek told me", 5+ 7); + line(player, "the location of the Phoenix Gang hideout.", 6+ 7); + line(player, "I also spoke to Charlie the tramp in Varrock.", 7+ 7); + line(player, "According to him there is a criminal organisation known as", 8+ 7); + line(player, "the " + RED + "'Black Arm Gang'" + BLUE + "down the alley near to him.", 9+ 7); + if (isPhoenixMission(player) && isBlackArmMission(player)) { + line(player, "I read about a valuable shield stolen long ago by a gang of", 4+ 7); + line(player, "thieves with an outstanding reward upon it. Baraek told me", 5+ 7); + line(player, "the location of the Phoenix Gang hideout.", 6+ 7); + line(player, "To start this quest, I spoke to Charlie the tramp in Varrock.", 7+ 7); + line(player, "He gave me the location of the Black Arm gang HQ.", 8+ 7); + line(player, "According to him there is a criminal organisation known as", 9+ 7); + line(player, "the " + RED + "'Black Arm Gang'" + BLUE + "down the alley near to him.", 10+ 7); + line(player, BLUE + "If I want to join the " + RED + "Phoenix Gang " + BLUE + "I need to kill" + RED + " Jonny The", 11+ 7); + line(player, RED + "Beard " + BLUE + "in the " + RED + "Blue Moon Inn " + BLUE + "and retreive his " + RED + "report.", 12+ 7); + line(player, RED + "Katrine " + BLUE + "said if I wanted to join the " + RED + "Black Arm Gang," + BLUE + " I'd", 13+ 7); + line(player, BLUE + "have to steal " + RED + "two Phoenix crossbows " + BLUE + "from the rival gang.", 14+ 7); + line(player, BLUE + "Maybe " + RED + "Charlie the tramp " + BLUE + "can give me some ideas about", 15+ 7); + line(player, BLUE + "how to do this.", 16+ 7); + } else if (isPhoenixMission(player)) { + line(player, BLUE + "If I want to join the " + RED + "Phoenix Gang " + BLUE + "I need to kill" + RED + " Jonny The", 10+ 7); + line(player, RED + "Beard " + BLUE + "in the " + RED + "Blue Moon Inn " + BLUE + "and retreive his " + RED + "report.", 11+ 7); + line(player, BLUE + "Alternatively, if I want to join the " + RED + "Blackarm gang " + BLUE + "I should", 12+ 7); + line(player, BLUE + "speak to their " + RED + "leader, Katrine, " + BLUE + "about joining.", 13+ 7); + } else if (isBlackArmMission(player)) { + line(player, RED + "Katrine " + BLUE + "said if I wanted to join the " + RED + "Black Arm Gang" + BLUE + ", I'd", 10+ 7); + line(player, BLUE + "have to steal " + RED + "two Phoenix crossbows " + BLUE + "from the rival gang.", 11+ 7); + line(player, BLUE + "Maybe " + RED + "Charlie the tramp " + BLUE + "can give me some ideas about", 12+ 7); + line(player, BLUE + "how to do this.", 13+ 7); + } + break; + case 70: + if (isPhoenix(player)) { + line(player, "I read about a valuable shield stolen long ago by a gang of", 4+ 7); + line(player, "thieves with an outstanding reward upon it. Baraek told me", 5+ 7); + line(player, "the location of the Phoenix Gang hideout.", 6+ 7); + line(player, "I killed Jonny the Beard and was welcomed into the Phoenix", 7+ 7); + line(player, "Gang. Straven gave me a key to the weapons room.", 8+ 7); + if (!player.getInventory().containsItem(PHOENIX_SHIELD) && !player.getBank().containsItem(PHOENIX_SHIELD)) { + line(player, BLUE + "I need to search the " + RED + "Phoenix Gang's hideout " + BLUE + "to find half", 10+ 7); + line(player, BLUE + "of the " + RED + "Shield of Arrav.", 11+ 7); + } else { + line(player, BLUE + "I found half of the " + RED + "Shield of Arrav " + BLUE + "in the " + RED + "Phoenix Gang's", 10+ 7); + line(player, RED + "hideout.", 11+ 7); + } + line(player, BLUE + "The second half of the " + RED + "shield" + BLUE + " belongs to a rival gang", 12+ 7); + line(player, BLUE + "known as the " + RED + "Black Arm Gang. " + BLUE + "I will need " + RED + "a friend's help " + BLUE + "to", 13+ 7); + line(player, BLUE + "retreive it before claiming the " + RED + "reward " + BLUE + "for it.", 14+ 7); + } else { + line(player, "I read about a valuable shield stolen long ago by a gang of", 4+ 7); + line(player, "thieves with an outstanding reward upon it. Baraek told me", 5+ 7); + line(player, "the location of the Phoenix Gang hideout.", 6+ 7); + line(player, "With the help of a friend, I managed to obtain two Phoenix", 8+ 7); + line(player, "Crossbows from the Phoenix Gang's weapons store, and", 9+ 7); + line(player, "Katrine welcomes me as a Black Arm Gang member.", 10+ 7); + line(player, BLUE + "With " + RED + "my friend's help" + BLUE + ", I can get both pieces of the shield", 12+ 7); + line(player, BLUE + "and return it to " + RED + "King Roald " + BLUE + "for my " + RED + "reward.", 13+ 7); + } + break; + case 100: + line(player, "I read about a valuable shield stolen long ago by a gang of", 4+ 7); + line(player, "thieves with an outstanding reward upon it. Baraek told me", 5+ 7); + line(player, "the location of the Phoenix Gang hideout.", 6+ 7); + if (!isPhoenix(player)) { + line(player, "With the help of a friend, I managed to obtain two Phoenix", 8+ 7); + line(player, "Crossbows from the Phoenix Gang's weapons store, and", 9+ 7); + line(player, "Katrine welcomes me as a Black Arm Gang member.", 10+ 7); + line(player, "With the help of my friend in the rival gang, I was able to", 12+ 7); + line(player, "retreive both parts of the fabled Shield of Arrav and", 13+ 7); + line(player, "return it to the Museum of Varrock. In Recognition of my", 14+ 7); + line(player, "efforts, King Roald paid me the reward set by his", 15+ 7); + line(player, "ancestor.", 16+ 7); + line(player, "QUEST COMPLETE!", 18+ 7); + line(player, RED + "I received a reward of 600 coins and got 1 quest point.", 19+ 7); + } else { + line(player, "I killed Jonny the Beard and was welcomed into the Phoenix", 7+ 7); + line(player, "Gang. Straven gave me a key to the weapons room.", 8+ 7); + line(player, "With the help of my friend in the rival gang, I was able to", 10+ 7); + line(player, "retreive both parts of the fabled Shield of Arrav and", 11+ 7); + line(player, "return it to the Museum of Varrock. In Recognition of my", 12+ 7); + line(player, "efforts, King Roald paid me the reward set by his", 13+ 7); + line(player, "ancestor.", 14+ 7); + line(player, "QUEST COMPLETE!", 16+ 7); + line(player, RED + "I received a reward of 600 coins and got 1 quest point.", 17+ 7); + } + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.removeAttribute("blackarm-mission"); + player.removeAttribute("phoenix-mission"); + player.getPacketDispatch().sendString("1 Quests Points", 277, 8 + 2); + player.getPacketDispatch().sendString("600 Coins", 277, 9 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(767, 1, 230, 277, 3 + 2); + } + + /** + * Sets the phoenix gang. + * @param player the player. + */ + public static void setPhoenix(final Player player) { + player.setAttribute("/save:phoenix-gang", true); + } + + /** + * Sets the black arm gang. + * @param player the player. + */ + public static void setBlackArm(final Player player) { + player.setAttribute("/save:black-arm-gang", true); + } + + /** + * Method used to check if the player is part of the phoenix gang. + * @param player the player. + * @return True if so. + */ + public static boolean isPhoenix(final Player player) { + return player.getAttribute("phoenix-gang", false); + } + + /** + * Method used to check if the player is part of the black arm gang. + * @param player the player. + * @return True if so. + */ + public static boolean isBlackArm(final Player player) { + return player.getAttribute("black-arm-gang", false); + } + + /** + * Method used to set that the player is trying to do the phoennix mission. + * @param player the player. + */ + public static void setPhoenixMission(final Player player) { + player.setAttribute("/save:phoenix-mission", true); + } + + /** + * Method used to set that the player is trying to do the black arm gang + * mission. + * @param player the player. + */ + public static void setBlackArmMission(final Player player) { + player.setAttribute("/save:blackarm-mission", true); + } + + /** + * Method used to check if they're doing the black arm gang mission. + * @param player the player. + * @return True if so. + */ + public static boolean isBlackArmMission(final Player player) { + return player.getAttribute("blackarm-mission", false); + } + + /** + * Method used to check if they're doing the phoenix gang mission. + * @param player the player. + * @return True if so. + */ + public static boolean isPhoenixMission(final Player player) { + return player.getAttribute("phoenix-mission", false); + } + + /** + * Gets the shield item. + * @param player the player. + * @return + */ + public static final Item getShield(final Player player) { + return isBlackArm(player) ? BLACKARM_SHIELD : PHOENIX_SHIELD; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ShieldofArravBook.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ShieldofArravBook.java new file mode 100644 index 000000000..42200330d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/ShieldofArravBook.java @@ -0,0 +1,84 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.book.Book; +import core.game.content.dialogue.book.BookLine; +import core.game.content.dialogue.book.Page; +import core.game.content.dialogue.book.PageSet; +import core.game.node.entity.player.Player; + +/** + * Represents the shield of arrav book. + * @author 'Vexia + * @author Empathy + * @version 2.0 + */ +public final class ShieldofArravBook extends Book { + + /** + * Represents the shield of arrav book id. + */ + public static int ID = 49610758; + + /** + * Represents the array of pages for this book. + */ + private static final PageSet[] PAGES = new PageSet[] { new PageSet(new Page(new BookLine("The Shield of Arrav", 55), new BookLine("by A.R Wright", 57), new BookLine("Arrav is probably the best", 61), new BookLine("known hero of the 4th", 62), new BookLine("age. Many legends are", 63), new BookLine("told of his heroics. One", 64), new BookLine("surviving artefact from", 65)), new Page(new BookLine("the 4th age is a fabulous", 66), new BookLine("shield.", 67), new BookLine("This shield is believed to", 69), new BookLine("have once belonged to", 70), new BookLine("Arrav and is now indeed", 71), new BookLine("known as the Shield of", 72), new BookLine("Arrav. For over 150", 73), new BookLine("years it was the prize", 74), new BookLine("piece in the royal", 75), new BookLine("museum of Varrock.", 76))), new PageSet(new Page(new BookLine("However, in the year 143", 55), new BookLine("of the fith age a gang of", 56), new BookLine("thieves called the Phoenix", 57), new BookLine("Gang broke into the", 58), new BookLine("museum and stole the", 59), new BookLine("shield in a daring raid. As", 60), new BookLine("a result, the current", 61), new BookLine("ruler, King Roald, put a", 62), new BookLine("1200 gold bounty (a", 63), new BookLine("massive sum of money in", 64), new BookLine("those days) on the return", 65)), new Page(new BookLine("of the shield, hoping that", 66), new BookLine("one of the culprits would", 67), new BookLine("betray his fellows out of", 68), new BookLine("greed.", 69))), new PageSet(new Page(new BookLine("This tactic did not work", 55), new BookLine("however, and the thieves", 56), new BookLine("who stole the shield have", 57), new BookLine("since gone on to become", 58), new BookLine("the most powerful crime", 59), new BookLine("gang in Varrock, despite", 60), new BookLine("making an enemy of the", 61), new BookLine("Royal Family many", 62), new BookLine("years ago.", 63)), new Page(new BookLine("The reward for the", 66), new BookLine("return of the shield still", 67), new BookLine("stands.", 68))) }; + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public ShieldofArravBook(final Player player) { + super(player, "The Shield of Arrav", ShieldofArrav.BOOK.getId(), PAGES); + } + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public ShieldofArravBook() { + /** + * empty. + */ + } + + @Override + public void finish() { + if (player.getQuestRepository().getQuest("Shield of Arrav").getStage(player) == 10) { + player.getQuestRepository().getQuest("Shield of Arrav").setStage(player, 20); + } + } + + @Override + public void display(Page[] set) { + player.lock(); + player.getInterfaceManager().open(getInterface()); + for (int i = 55; i < 77; i++) { + player.getPacketDispatch().sendString("", getInterface().getId(), i); + } + player.getPacketDispatch().sendString(getName(), getInterface().getId(), 6); + player.getPacketDispatch().sendString("", getInterface().getId(), 77); + player.getPacketDispatch().sendString("", getInterface().getId(), 78); + for (Page page : set) { + for (BookLine line : page.getLines()) { + player.getPacketDispatch().sendString(line.getMessage(), getInterface().getId(), line.getChild()); + } + } + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 51, index < 1 ? true : false); + boolean lastPage = index == sets.length - 1; + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 53, lastPage ? true : false); + if (lastPage) { + finish(); + } + player.unlock(); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ShieldofArravBook(player); + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/StravenDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/StravenDialogue.java new file mode 100644 index 000000000..1c583672a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/StravenDialogue.java @@ -0,0 +1,406 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; + +/** + * Represents the dialogue which handles the straven NPC. + * @author 'Vexia + * @date 3/1/14 + */ +public class StravenDialogue extends DialoguePlugin { + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code StravenDialogue} {@code Object}. + */ + public StravenDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code StravenDialogue} {@code Object}. + * @param player the player. + */ + public StravenDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new StravenDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Shield of Arrav"); + switch (quest.getStage(player)) { + case 100: + case 70: + if (ShieldofArrav.isPhoenix(player)) { + npc("Greetings fellow gang member."); + stage = 10; + } else { + player.getPacketDispatch().sendMessage("I wouldn't talk to him if I was you."); + end(); + } + break; + case 60: + if (ShieldofArrav.isPhoenixMission(player)) { + npc("How's your little mission going?"); + stage = 200; + } else { + player("What's through the door?"); + stage = 100; + } + break; + default: + player("What's through the door?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (quest.getStage(player) == 60 && stage >= 200) { + switch (stage) { + case 200: + if (!player.getInventory().containsItem(ShieldofArrav.INTEL_REPORT)) { + player("I haven't managed to find the report yet..."); + stage = 201; + } else { + player("I have the intelligence report!"); + stage = 204; + } + break; + case 201: + npc("You need to kill Johnny the Beard, who should be in the", "Blue Moon Inn."); + stage = 202; + break; + case 202: + npc("...I would guess. Not being a member of the Phoenix", "Gang and all."); + stage = 203; + break; + case 203: + end(); + break; + case 204: + npc("Let's see it then."); + stage = 205; + break; + case 205: + interpreter.sendDialogue("You hand over the report. The man reads the report."); + stage = 206; + break; + case 206: + npc("Yes. Yes, this is very good."); + stage = 207; + break; + case 207: + npc("Ok! You can join the Phoenix Gang! I am Straven, one", "of the gang leaders."); + stage = 208; + break; + case 208: + player("Nice to meet you."); + stage = 209; + break; + case 209: + npc("Take this key."); + stage = 210; + break; + case 210: + if (player.getInventory().remove(ShieldofArrav.INTEL_REPORT)) { + if (!player.getInventory().add(ShieldofArrav.KEY)) { + GroundItemManager.create(ShieldofArrav.KEY, player); + } + interpreter.sendItemMessage(ShieldofArrav.KEY.getId(), "Straven hands you a key."); + quest.setStage(player, 70); + ShieldofArrav.setPhoenix(player); + stage = 211; + } + break; + } + return true; + } + switch (quest.getStage(player)) { + case 100: + case 70: + switch (stage) { + case 10: + if (!player.getInventory().containsItem(ShieldofArrav.KEY) && !player.getBank().containsItem(ShieldofArrav.KEY)) { + player("I'm afraid I've lost the key you gave me..."); + stage = 80; + } else { + options("I've heard you've got some cool treasure in this place.", "Any suggestions for where I can go thieving?", "Where's the Black Arm Gang hideout?"); + stage = 11; + } + break; + case 80: + npc("You really need to be more careful. We don't want", "that key falling into the wrong hands. Ah well... Have", "this spare. Don't lose THIS one."); + stage = 81; + break; + case 81: + if (!player.getInventory().add(ShieldofArrav.KEY)) { + GroundItemManager.create(ShieldofArrav.KEY, player); + } + interpreter.sendItemMessage(ShieldofArrav.KEY.getId(), "Straven hands you a key."); + stage = 82; + break; + case 82: + end(); + break; + case 11: + switch (buttonId) { + case 1: + player("I've heard you've got some cool treasures in this place..."); + stage = 110; + break; + case 2: + player("Any suggestions on where I can go thieving?"); + stage = 120; + break; + case 3: + player("Where's the Black Arm Gang hideout? I wanna go", "sabotage 'em!"); + stage = 130; + break; + } + break; + case 130: + npc("That would be a little tricky; their security is pretty", "good."); + stage = 131; + break; + case 131: + end(); + break; + case 120: + npc("You can always try the marketplace in Ardougne.", "LOTS of opportunity there!"); + stage = 121; + break; + case 121: + end(); + break; + case 110: + npc("Oh yeah, we've all stolen some stuff in our time. Those", "candelsticks down here, for example, were quite a", "challenge to get out of the palace."); + stage = 111; + break; + case 111: + player("And the shield of Arrav? I heard you got that!"); + stage = 112; + break; + case 112: + npc("Woah... thats a blast from the past! We stole that years", "and years ago! We don't even have all the shield", "anymore."); + stage = 113; + break; + case 113: + end(); + break; + case 211: + npc("This key will give you access to our weapons supply", "depot round the front of this building."); + stage = 212; + break; + case 212: + end(); + break; + default: + handleDefault(buttonId); + break; + } + break; + case 60: + case 50: + case 40: + switch (stage) { + case 0: + npc("Hey! You can't go in there. Only authories personnel", "of the VTAM Corporation are allowed beyond this point."); + stage = 1; + break; + case 1: + options("I know who you are!", "How do I get a job with the VTAM corporation?", "Why not?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("I know who you are!"); + stage = 10; + break; + case 2: + player("How do I get a job with the VTAM corporation?"); + stage = 20; + break; + case 3: + player("Why not?"); + stage = 30; + break; + } + break; + case 10: + npc("Really?"); + stage = 11; + break; + case 11: + npc("Well?"); + stage = 12; + break; + case 12: + npc("Who are we then?"); + stage = 13; + break; + case 13: + player("This is the headquarters of the Phoenix Gang, the most", "powerful crime syndicate this city has ever seen!"); + stage = 14; + break; + case 14: + npc("No, this is a legitimate business run by legitimate", "businessmen."); + stage = 15; + break; + case 15: + npc("Supposing we were this crime gang however, what would", "you want with us?"); + stage = 16; + break; + case 16: + options("I'd like to offer you my services.", "I want nothing. I was just making sure you were them."); + stage = 17; + break; + case 17: + switch (buttonId) { + case 1: + player("I'd like to offer you my services."); + stage = 41; + break; + case 2: + player("I want nothing. I was just making sure you were them."); + stage = 18; + break; + } + break; + case 18: + npc("Well then get lost and stop wasting my time."); + stage = 19; + break; + case 19: + npc("...if you know what's good for you."); + stage = 40; + break; + case 40: + end(); + break; + case 41: + npc("You mean you'd like to join the Phoenix Gang?"); + stage = 42; + break; + case 42: + npc("well obviously I can't speak for them, but the Phoenix", "Gang doesn't let people join just like that."); + stage = 43; + break; + case 43: + npc("You can't be too careful, you understand."); + stage = 44; + break; + case 44: + npc("Generally someone has to prove their loyalty before", "they can join."); + stage = 45; + break; + case 45: + player("How would I go about doing that?"); + stage = 46; + break; + case 46: + npc("Obviously, I would have no idea about that."); + stage = 47; + break; + case 47: + npc("Although having said that, a rival gang of ours, er,", "theirs, called the Black Arm Gang is supposedly metting", "a contact from Port Sarim today in the Blue Moon", "Inn."); + stage = 48; + break; + case 48: + npc("The Blue Moon Inn is just by the south entrance to", "this city, and supposedly the name of the contact is", "Jonny the Beard."); + stage = 49; + break; + case 49: + npc("OBVIOUSLY I know NOTHING about the dealing", "of the Phoenix Gang, but I bet if SOMEBODY were", "to kill him and bring back his intelligence report, they", "would be considered loyal enough to join."); + stage = 50; + break; + case 50: + player("Ok, I'll get right on it."); + stage = 51; + break; + case 51: + quest.setStage(player, 60); + ShieldofArrav.setPhoenixMission(player); + end(); + break; + case 20: + npc("Get a copy of the Varrock Herald. If we have any", "positions right now, they'll be advertised in there."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + npc("Sorry. That's classified information."); + stage = 31; + break; + case 31: + end(); + break; + default: + handleDefault(buttonId); + break; + } + break; + default: + switch (stage) { + case 0: + npc("Hey! You can't go in there. Only authories personnel", "of the VTAM Corporation are allowed beyond this point."); + stage = 1; + break; + case 1: + player("Ok, sorry."); + stage = 2; + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + /** + * Method used to handle the default dial. + * @param buttonId the button id. + */ + public void handleDefault(int buttonId) { + switch (stage) { + case 0: + npc("Hey! You can't go in there. Only authories personnel", "of the VTAM Corporation are allowed beyond this point."); + stage = 1; + break; + case 1: + player("Ok, sorry."); + stage = 2; + break; + case 2: + end(); + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 644 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/WeaponsMasterDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/WeaponsMasterDialogue.java new file mode 100644 index 000000000..24d0b11fd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/shieldofarrav/WeaponsMasterDialogue.java @@ -0,0 +1,122 @@ +package core.game.content.quest.free.shieldofarrav; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the dialogue which handles the weapons master. + * @author 'Vexia + * @version 1.0 + */ +public final class WeaponsMasterDialogue extends DialoguePlugin { + + /** + * Represents the quest. + */ + private Quest quest; + + /** + * Constructs a new {@code WeaponsMasterDialogue} {@code Object}. + */ + public WeaponsMasterDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WeaponsMasterDialogue} {@code Object}. + * @param player the player. + */ + public WeaponsMasterDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WeaponsMasterDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Shield of Arrav"); + switch (quest.getStage(player)) { + default: + if (args.length > 1) { + npc("Stop! Thief!"); + stage = 600; + return true; + } + player("Hello."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + switch (stage) { + case 600: + end(); + npc.getProperties().getCombatPulse().attack(player); + break; + case 0: + if (ShieldofArrav.isPhoenix(player)) { + npc("Hello fellow Phoenix! What are you after?"); + stage = 1; + } else { + npc("Hey! Who are you? I'm gonna teach you not to stick", "your nose where it don't belong!"); + stage = 50; + } + break; + case 50: + end(); + npc.getProperties().getCombatPulse().attack(player); + break; + case 1: + options("I'm after a weapon or two.", "I'm looking for treasure."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("I'm after a weapon or two."); + stage = 10; + break; + case 2: + player("I'm looking for treasure."); + stage = 20; + break; + } + break; + case 10: + npc("No problem. Feel free to look around."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc("Aren't we all? We've not got any up here. Go mug", "someone somewhere if you want some treasure."); + stage = 21; + break; + case 21: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 643 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/FatherAereckDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/FatherAereckDialogue.java new file mode 100644 index 000000000..34083b405 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/FatherAereckDialogue.java @@ -0,0 +1,347 @@ +package core.game.content.quest.free.therestlessghost; + +import core.game.component.Component; +import core.game.container.access.BitregisterAssembler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; +import core.game.content.dialogue.DialoguePlugin; + + +/** + * Represents the father aereck dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FatherAereckDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FatherAereckDialogue} {@code Object}. + */ + public FatherAereckDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FatherAereckDialogue} {@code Object}. + * + * @param player the player. + */ + public FatherAereckDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FatherAereckDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int questStage = player.getQuestRepository().getQuest(RestlessGhost.NAME).getStage(player); + if (questStage == 10) { + npc("Have you got rid of the ghost yet?"); + stage = 520; + return true; + } + if (questStage == 20) { + player("I had a talk with Father Urhney. He has given me this", "funny amulet to talk to the ghost with."); + stage = 530; + return true; + } + if (questStage == 30) { + player("I've found out that the ghost's corpse has lost its skull.", "If I can find the skull, the ghost should leave."); + stage = 540; + return true; + } + if (questStage == 40) { + player("I've finally found the ghost's skull!"); + stage = 550; + return true; + } + npc("Welcome to the church of holy Saradomin, my", "friend! What can I do for you today?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getQuestRepository().isComplete("The Restless Ghost")) { + interpreter.sendOptions("What would you like to say?", "Can you change my gravestone now?", "Who's Saradomin?", "Nice place you've got here."); + stage = 1; + } else { + interpreter.sendOptions("What would you like to say?", "Can you change my gravestone now?", "Who's Saradomin?", "Nice place you've got here.", "I'm looking for a quest."); + stage = 500; + } + break; + case 500: + switch (buttonId) { + case 1: + npc("Certainly. All proceeds are donated to the", "Varrockian Guards' Widows & Orphans Fund."); + stage = 10; + break; + case 2: + npc("Surely you have heard of our god, Saradomin?"); + stage = 20; + break; + case 3: + npc("It is, isn't it? It was built over two centuries ago."); + stage = 300; + break; + case 4: + player("I'm looking for a quest."); + stage = 505; + break; + } + break; + case 505: + npc("That's lucky, I need someone to do a quest for me."); + stage = 506; + break; + case 506: + options("Ok, let me help then.", "Sorry, I don't have time right now."); + stage = 507; + break; + case 507: + switch (buttonId) { + case 1: + player("Ok, let me help then."); + stage = 510; + break; + case 2: + player("Sorry, I don't have time right now."); + stage = 508; + break; + } + break; + case 508: + npc("Oh well. If you do have some spare time on your", "hands, come back and talk to me."); + stage = 509; + break; + case 509: + end(); + break; + case 510: + player.getQuestRepository().getQuest(RestlessGhost.NAME).start(player); + player.getQuestRepository().syncronizeTab(player); + npc("Thank you. The problem is, there is a ghost in the", "church graveyard. I would like you to get rid of it."); + stage = 511; + break; + case 511: + npc("If you need any help, my friend Father Urhney is an", "expert on ghosts."); + stage = 512; + break; + case 512: + npc("I believe he is currently living as a hermit in Lumbridge", "swamp. He has a little shack in the south-west of the", "swamps."); + stage = 513; + break; + case 513: + npc("Exit the graveyard through the south gate to reach the", "swamp. I'm sure if you told him that I sent you he'd", "be willing to help."); + stage = 514; + break; + case 514: + npc("My name is Father Aereck by the way. Pleased to", "meet you."); + stage = 515; + break; + case 515: + player("Likewise."); + stage = 516; + break; + case 516: + npc("Take care travelling through the swamps, I have heard", "they can be quite dangerous."); + stage = 517; + break; + case 517: + player("I will, thanks."); + stage = 518; + break; + case 518: + end(); + break; + case 520: + if (!player.getGameAttributes().getAttributes().containsKey("restless-ghost:urhney")) { + player("I can't find Father Urhney at the moment."); + stage = 521; + break; + } + break; + case 521: + npc("Well, you can get to the swamp he lives in by going", "south through the cemetery."); + stage = 522; + break; + case 522: + npc("You'll have to go right into the western depths of the", "swamp, near the coastline. That is where his house is."); + stage = 523; + break; + case 523: + end(); + break; + case 530: + npc("I always wondered what that amulet was... Well, I hope", "it's useful. Tell me when you get rid of the ghost!"); + stage = 531; + break; + case 531: + end(); + break; + case 540: + npc("That WOULD explain it."); + stage = 541; + break; + case 541: + npc("Hmmmmm. Well, I haven't seen any skulls."); + stage = 542; + break; + case 542: + player("Yes, I think a warlock has stolen it."); + stage = 543; + break; + case 543: + npc("I hate warlocks."); + stage = 544; + break; + case 544: + npc("Ah well, good luck!"); + stage = 545; + break; + case 545: + end(); + break; + case 550: + npc("Great! Put it in the ghost's coffin and see what", "happens!"); + stage = 545; + break; + case 1: + switch (buttonId) { + case 1: + npc("Certainly. All proceeds are donated to the", "Varrockian Guards' Widows & Orphans Fund."); + stage = 10; + break; + case 2: + npc("Surely you have heard of our god, Saradomin?"); + stage = 20; + break; + case 3: + npc("It is, isn't it? It was built over two centuries ago."); + stage = 300; + break; + } + + break; + case 10: + end(); + player.getInterfaceManager().open(new Component(652)); + BitregisterAssembler.send(player, 652, 34, 0, 13, new BitregisterAssembler(0)); + player.getConfigManager().set(1146, player.getGraveManager().getType().ordinal() | 262112); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 15); + break; + case 20: + npc("He who created the forces of goodness and purity in this", "world? I cannot believe your ignorance!"); + stage = 21; + break; + case 21: + npc("This is the god with more followers than any other ...at", "least in this part of the world."); + stage = 22; + break; + case 22: + npc("He who forged the world as we know it, along with his", "brothers Guthix and Zamorak?"); + stage = 23; + break; + case 23: + options("Oh, THAT Saradomin.", "Oh, sorry, I'm not from this world."); + stage = 24; + break; + case 24: + switch (buttonId) { + case 1: + npc("There is only one Saradomin."); + stage = 200; + break; + case 2: + npc("..."); + stage = 250; + break; + } + + break; + case 200: + player("Yeah. I, uh, thought you said something else."); + stage = 201; + break; + case 201: + end(); + break; + case 250: + npc("That's...strange."); + stage = 251; + break; + case 251: + npc("I thought things not from this world were all, you know,", "slime and tentacles."); + stage = 270; + break; + case 270: + options("Not me.", "I am! Do you like my disguise?"); + stage = 271; + break; + case 271: + + switch (buttonId) { + case 1: + npc("Well, I can see that. Still, there's something special about", "you."); + stage = 253; + break; + case 2: + npc("Argh! Avaunt, foul creature from another dimension!", "Avaunt! Begone in the name of Saradomin!"); + stage = 291; + break; + } + break; + case 291: + player("Okay, okay, I was only joking!"); + stage = 292; + break; + case 292: + end(); + break; + case 253: + player("Thanks, I think."); + stage = 254; + break; + case 254: + end(); + break; + case 300: + end(); + break; + case 570: + interpreter.sendDialogues(player, null, "Yes, I have!"); + stage = 571; + break; + case 571: + interpreter.sendDialogues(npc, null, "Thank you for getting rid of that awful ghost for me!", "May Saradomin always smile upon you!"); + stage = 572; + break; + case 572: + interpreter.sendDialogues(player, null, "I'm looking for a new quest."); + stage = 573; + break; + case 573: + interpreter.sendDialogues(npc, null, "Sorry, I only had the one quest."); + stage = 300; + break; + } + + return true; + } + + @Override + public int[] getIds() { + return new int[]{456}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/FatherUhrneyDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/FatherUhrneyDialogue.java new file mode 100644 index 000000000..a4c47507b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/FatherUhrneyDialogue.java @@ -0,0 +1,283 @@ +package core.game.content.quest.free.therestlessghost; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.item.Item; +import core.game.content.dialogue.DialoguePlugin; + +/** + * Represents the father urgney dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FatherUhrneyDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FatherUhrneyDialogue} {@code Object}. + */ + public FatherUhrneyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FatherUhrneyDialogue} {@code Object}. + * @param player the player. + */ + public FatherUhrneyDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FatherUhrneyDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Go away! I'm meditating!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getQuestRepository().getQuest(RestlessGhost.NAME).getStage(player) == 0) { + options("Well, that's friendly.", "I've come to respossess your house."); + stage = 1; + } else if (player.getQuestRepository().getQuest(RestlessGhost.NAME).getStage(player) == 10) { + options("Well, that's friendly.", "I've come to respossess your house.", "Father Aereck sent me to talk to you."); + stage = 500; + } else if (player.getGameAttributes().getAttributes().containsKey("restless-ghost:urhney") || player.getQuestRepository().isComplete(RestlessGhost.NAME)) { + options("Well, that's friendly.", "I've come to respossess your house.", "I've lost the Amulet of Ghostspeak."); + stage = 514; + } + break; + case 500: + switch (buttonId) { + case 1: + player("Well, that's friendly."); + stage = 10; + break; + case 2: + player("I've come to repossess your house."); + stage = 20; + break; + case 3: + player("Father Aereck sent me to talk to you."); + stage = 501; + break; + } + break; + case 501: + npc("I suppose I'd better talk to you then. What problems", "has he got himself into this time?"); + stage = 502; + break; + case 502: + player("He's got a ghost haunting his graveyard."); + stage = 503; + break; + case 503: + npc("Oh, the silly fool."); + stage = 504; + break; + case 504: + npc("I leave town for just five months, and ALREADY he", "can't manage."); + stage = 505; + break; + case 505: + npc("(sigh)"); + stage = 506; + break; + case 506: + npc("Well, I can't go back and exorcise it. I vowed not to", "leave this place. Until I had done a full two years of", "prayer and meditation."); + stage = 507; + break; + case 507: + npc("Tell you what I can do though; take this amulet."); + stage = 508; + break; + case 508: + if (player.getInventory().freeSlots() == 0) { + end(); + player.getPacketDispatch().sendMessage("You don't have enough inventory space to accept this amulet."); + break; + } + interpreter.sendItemMessage(552, "Father Urhney hands you an amulet."); + player.getInventory().add(new Item(552, 1)); + player.getQuestRepository().getQuest(RestlessGhost.NAME).setStage(player, 20); + player.getGameAttributes().setAttribute("/save:restless-ghost:urhney", true); + stage = 509; + break; + case 509: + npc("It is an Amulet of Ghostspeak."); + stage = 510; + break; + case 510: + npc("So called, because when you wear it you can speak to", "ghosts. A lot of ghosts are doomed to be ghosts because", "they have left some important task uncompleted."); + stage = 511; + break; + case 511: + npc("Maybe if you know what this task is, you can get rid of", "the ghost. I'm not making any gurantees mind you,", "but it is the best I can do right now."); + stage = 512; + break; + case 512: + player("Thank you. I'll give it a try!"); + stage = 513; + break; + case 513: + end(); + break; + case 514: + switch (buttonId) { + case 1: + player("Well, that's friendly."); + stage = 10; + break; + case 2: + player("I've come to repossess your house."); + stage = 20; + break; + case 3: + player("I've lost the Amulet of Ghostpeak."); + stage = 515; + break; + } + break; + case 515: + if (player.getInventory().contains(552, 1) || player.getEquipment().contains(552, 1)) { + interpreter.sendDialogue("Father Urhney sighs."); + stage = 516; + break; + } + if (player.getBank().contains(552, 1)) { + interpreter.sendDialogue("Father Urhney sighs."); + stage = 517; + break; + } + interpreter.sendDialogue("Father Urhney sighs."); + stage = 519; + break; + case 516: + npc("What are you talking about? I can see you've got it", "with you!"); + stage = 518; + break; + case 517: + npc("What are you talking about? I can see you've got it", "in your bank!"); + stage = 518; + break; + case 518: + end(); + break; + case 519: + npc("How careless can you get? Those things aren't easy to", "come by you know! It's a good job I've got a spare."); + stage = 520; + break; + case 520: + player.getInventory().add(new Item(552)); + interpreter.sendItemMessage(552, "Father Urhney hands you an amulet."); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 12); + stage = 521; + break; + case 521: + npc("Be more careful this time."); + stage = 522; + break; + case 522: + player("Ok, I'll try to be."); + stage = 523; + break; + case 523: + end(); + break; + case 1: + switch (buttonId) { + case 1: + player("Well, that's friendly."); + stage = 10; + break; + case 2: + player("I've come to repossess your house."); + stage = 20; + break; + + } + break; + case 10: + npc("I SAID go AWAY."); + stage = 11; + break; + case 11: + player("Ok, ok... sheesh, what a grouch."); + stage = 12; + break; + case 12: + end(); + break; + case 20: + npc("Under what grounds???"); + stage = 21; + break; + case 21: + options("Repeated failure on mortgage repayments.", "I don't know, I just wanted this house."); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + player("Repeated failure on mortgage repayments."); + stage = 100; + break; + case 2: + player("I don't know. I just wanted this house..."); + stage = 200; + break; + + } + break; + case 100: + npc("What?"); + stage = 101; + break; + case 101: + npc("I don't have a mortgage! I built this house."); + stage = 102; + break; + case 102: + player("Sorry. I mus thave got the wrong address. All the", "houses look the same around here."); + stage = 103; + break; + case 103: + npc("What? What houses? What ARE you talking about???"); + stage = 104; + break; + case 104: + player("Never mind."); + stage = 105; + break; + case 105: + end(); + break; + case 200: + npc("Oh... go away and stop wasting my time!"); + stage = 201; + break; + case 201: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 458 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhost.java b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhost.java new file mode 100644 index 000000000..ad39206d0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhost.java @@ -0,0 +1,115 @@ +package core.game.content.quest.free.therestlessghost; + +import core.game.content.quest.members.animalmagnetism.OldCronDialogue; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the restless ghost quest. + * @author Vexia + * + */ +@Initializable +public class RestlessGhost extends Quest { + + /** + * The name of the quest. + */ + public static final String NAME = "The Restless Ghost"; + + /** + * The ghost speak amulet. + */ + public static final Item AMULET = new Item(552); + + /** + * Constructs a new {@Code RestlessGhost} {@Code Object} + */ + public RestlessGhost() { + super(NAME, 25, 24, 1, 107, 0, 4, 5); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugin(new OldCronDialogue()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + if (stage == 0) { + player.getPacketDispatch().sendString("I can start this quest by speaking to Father Aereck in the", 275, 4+ 7); + player.getPacketDispatch().sendString("church next to Lumbridge Castle.", 275, 5+ 7); + player.getPacketDispatch().sendString("I must be unafraid of a Level 13 Skeleton ", 275, 6+ 7); + } + if (stage == 10) { + player.getPacketDispatch().sendString("Father Aereck asked me to help him deal with the Ghost in", 275, 4+ 7); + player.getPacketDispatch().sendString("the graveyard next to the church.", 275, 5+ 7); + player.getPacketDispatch().sendString("I should find Father Urhney who is an expert on ghosts. ", 275, 6+ 7); + player.getPacketDispatch().sendString("He lives in a shack in Lumbridge Swamp.", 275, 7+ 7); + + } + if (stage == 20) { + player.getPacketDispatch().sendString("Father Aereck asked me to help him deal with the Ghost in", 275, 4+ 7); + player.getPacketDispatch().sendString("the graveyard next to the church.", 275, 5+ 7); + player.getPacketDispatch().sendString("I should find Father Urhney who is an expert on ghosts. ", 275, 6+ 7); + player.getPacketDispatch().sendString("He lives in a shack in Lumbridge Swamp.", 275, 7+ 7); + player.getPacketDispatch().sendString("I should talk to the Ghost to find out why it is haunting the", 275, 8+ 7); + player.getPacketDispatch().sendString("graveyard crypt", 275, 9+ 7); + } + if (stage == 30) { + player.getPacketDispatch().sendString("Father Aereck asked me to help him deal with the Ghost in", 275, 4+ 7); + player.getPacketDispatch().sendString("the graveyard next to the church.", 275, 5+ 7); + player.getPacketDispatch().sendString("I found Father Urhney in the swamp south of Lumbridge.He ", 275, 6+ 7); + player.getPacketDispatch().sendString("gave me an Amulet of Ghostspeak to talk to the ghost.", 275, 7+ 7); + player.getPacketDispatch().sendString("I spoke to the Ghost and he told me he could not rest in", 275, 8+ 7); + player.getPacketDispatch().sendString("peace because an evil wizard had stolen his skull.", 275, 9+ 7); + player.getPacketDispatch().sendString("I should go and search the Wizard's Tower South West of", 275, 10+ 7); + player.getPacketDispatch().sendString("Lumbridge for the Ghost's Skull.", 275, 11+ 7); + } + if (stage == 40) { + player.getPacketDispatch().sendString("Father Aereck asked me to help him deal with the Ghost in", 275, 4+ 7); + player.getPacketDispatch().sendString("the graveyard next to the church.", 275, 5+ 7); + player.getPacketDispatch().sendString("I found Father Urhney in the swamp south of Lumbridge.He ", 275, 6+ 7); + player.getPacketDispatch().sendString("gave me an Amulet of Ghostspeak to talk to the ghost.", 275, 7+ 7); + player.getPacketDispatch().sendString("I spoke to the Ghost and he told me he could not rest in", 275, 8+ 7); + player.getPacketDispatch().sendString("peace because an evil wizard had stolen his skull.", 275, 9+ 7); + player.getPacketDispatch().sendString("I found the Ghost's Skull in the basement of the Wizards'", 275, 10+ 7); + player.getPacketDispatch().sendString("Tower. It was guarded by a skeleton, but I took it anyways.", 275, 11+ 7); + player.getPacketDispatch().sendString("I should take the Skull back to the Ghost so it can rest.", 275, 12+ 7); + } + if (stage == 100) { + player.getPacketDispatch().sendString("Father Aereck asked me to help him deal with the Ghost in", 275, 4+ 7); + player.getPacketDispatch().sendString("the graveyard next to the church.", 275, 5+ 7); + player.getPacketDispatch().sendString("I found Father Urhney in the swamp south of Lumbridge.He ", 275, 6+ 7); + player.getPacketDispatch().sendString("gave me an Amulet of Ghostspeak to talk to the ghost.", 275, 7+ 7); + player.getPacketDispatch().sendString("I spoke to the Ghost and he told me he could not rest in", 275, 8+ 7); + player.getPacketDispatch().sendString("peace because an evil wizard had stolen his skull.", 275, 9+ 7); + player.getPacketDispatch().sendString("I found the Ghost's Skull in the basement of the Wizards'", 275, 10+ 7); + player.getPacketDispatch().sendString("Tower. It was guarded by a skeleton, but I took it anyways.", 275, 11+ 7); + player.getPacketDispatch().sendString("I placed the Skull in the Ghost's coffin, and allowed it to", 275, 12+ 7); + player.getPacketDispatch().sendString("rest in peace once more, with gratitude for my help.", 275, 13+ 7); + player.getPacketDispatch().sendString("QUEST COMPLETE!", 275, 16+ 7); + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("1125 Prayer XP", 277, 9 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(964, 240, 277, 3 + 2); + player.getSkills().addExperience(Skills.PRAYER, 1125); + player.getInterfaceManager().closeChatbox(); + player.getPacketDispatch().sendString("You have completed The Restless Ghost Quest!", 277, 2 + 2); + player.getConfigManager().set(728, 31, true); + player.getPacketDispatch().sendMessage("Congratulations! Quest complete!"); + player.getGameAttributes().removeAttribute("restless-ghost:urhney"); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhostDialogue.java b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhostDialogue.java new file mode 100644 index 000000000..1e30d2b14 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhostDialogue.java @@ -0,0 +1,251 @@ +package core.game.content.quest.free.therestlessghost; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; + +/** + * Handles the RestlessGhostDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class RestlessGhostDialogue extends DialoguePlugin { + + public RestlessGhostDialogue() { + + } + + public RestlessGhostDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RestlessGhostDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello ghost, how are you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (!player.getEquipment().contains(552, 1)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Wooo wooo wooooo!"); + stage = 1; + } else { + if (player.getQuestRepository().getQuest(RestlessGhost.NAME).getStage(player) == 20) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Not very good actually."); + stage = 500; + break; + } + if (player.getQuestRepository().getQuest(RestlessGhost.NAME).getStage(player) == 30) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How are you doing finding my skull?"); + stage = 520; + break; + } + if (player.getQuestRepository().getQuest(RestlessGhost.NAME).getStage(player) == 40) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How are you doing finding my skull?"); + stage = 550; + break; + } + interpreter.sendDialogues(npc, null, "Fine, thanks."); + stage = 990; + } + break; + case 990: + end(); + break; + case 500: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's the problem then?"); + stage = 501; + break; + case 501: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Did you just understand what I said???"); + stage = 502; + break; + case 502: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yep, now tell me what the problem is."); + stage = 503; + break; + case 503: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "WOW! This is INCREDIBLE! I didn't expect anyone", "to ever understand me again!"); + stage = 504; + break; + case 504: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok, Ok, I can understand you!"); + stage = 505; + break; + case 505: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "But have you any idea WHY you're doomed to be a", "ghost?"); + stage = 506; + break; + case 506: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, to be honest... I'm not sure."); + stage = 507; + break; + case 507: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I've been told a certain task may need to be completed", "so you can rest in peace."); + stage = 508; + break; + case 508: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I should think it is probably because a warlock has come", "along and stolen my skull. If you look inside my coffin", "there, you'll find my corpse without a head on it."); + stage = 509; + break; + case 509: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you know where this warlock might be now?"); + stage = 510; + break; + case 510: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I think it was one of the warlocks who lives in the big", "tower by the sea south-west from here."); + stage = 511; + break; + case 511: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok. I will try and get the skull back for you, then you", "can rest in peace."); + player.getQuestRepository().getQuest(RestlessGhost.NAME).setStage(player, 30); + stage = 512; + break; + case 512: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ooh, thank you. That would be such a great relief!"); + stage = 513; + break; + case 513: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It is so dull being a ghost..."); + stage = 514; + break; + case 514: + end(); + break; + case 520: + if (player.getInventory().contains(964, 1)) { + + break; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I can't find it at the moment."); + stage = 521; + } + break; + case 521: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah well. Keep on looking."); + stage = 522; + break; + case 522: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm pretty sure it's somewhere in the tower south-west", "from here. There's a lot of levels to the tower, though. I", "suppose it might take a little while to find."); + stage = 523; + break; + case 523: + end(); + break; + case 550: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I have found it!"); + stage = 551; + break; + case 551: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hurrah! Now I can stop being a ghost! You just need", "to put it on my coffin there, and I will be free!"); + stage = 523; + break; + case 1: + interpreter.sendOptions("Select an Option", "Sorry, I don't speak ghost.", "Ooh... THAT'S interesting.", "Any hints where I can find some treasure?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't speak ghost."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ooh... THAT'S interesting."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Any hints where I can find some treasure?"); + stage = 30; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Woo woo?"); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nope, still don't understand you."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "WOOOOOOOOO!"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Never mind."); + stage = 14; + break; + case 14: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Wooooooo woo! Wooooo woo wooooo woowoowoo wooo", "Woo woooo. Wooooo woo woo? Wooooooooooooooooooo!"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sorry, I don't speak ghost."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Woo woo?"); + stage = 11; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Woo woooo. Woooooooooooooooooo!"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Did he really?"); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Woo."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "My brother had EXACTLY the same problem."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Woo Wooooo!"); + stage = 25; + break; + case 25: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Wooooo Woo woo woo!"); + stage = 26; + break; + case 26: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Goodbye. Thanks for the chat."); + stage = 27; + break; + case 27: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Wooo wooo?"); + stage = 28; + break; + case 28: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 457 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.java new file mode 100644 index 000000000..3a6a821cd --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhostPlugin.java @@ -0,0 +1,269 @@ +package core.game.content.quest.free.therestlessghost; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the restless ghost plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class RestlessGhostPlugin extends OptionHandler { + + /** + * Represents the close animation of a content. + */ + private static final Animation OPEN_ANIM = new Animation(536); + + /** + * Represents the close animation of a content. + */ + private static final Animation CLOSE_ANIM = new Animation(535); + + /** + * Represents the skull item. + */ + private static final Item SKULL = new Item(964); + + /** + * Represents the ghost npc spawned. + */ + private static RestlessGhostNPC GHOST; + + /** + * Represents the coffin inds. + */ + private static final int[] COFFIN_IDS = new int[] { 2145, 15061, 15052, 15053, 15050, 15051 }; + + /** + * Represents the options. + */ + private static final String[] OPTIONS = new String[] { "open", "close", "search" }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int coffin : COFFIN_IDS) { + for (String option : OPTIONS) { + ObjectDefinition.forId(coffin).getHandlers().put("option:" + option, this); + } + } + new RestlessGhostNPC().newInstance(arg); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (GHOST == null) { + GHOST = new RestlessGhostNPC(457, Location.create(3250, 3195, 0)); + GHOST.init(); + GHOST.setInvisible(true); + } + final int id = ((GameObject) node).getId(); + final GameObject object = (GameObject) node; + switch (option) { + case "open": + switch (id) { + case 2145: + toggleCoffin(player, object); + break; + } + case "close": + switch (id) { + case 15052: + case 15053: + toggleCoffin(player, object); + break; + } + break; + case "search": + switch (id) { + case 15052: + player.getPacketDispatch().sendMessage("You search the coffin and find some human remains."); + break; + case 15053: + player.getDialogueInterpreter().sendDialogue("There's a nice and complete skeleton in here!"); + break; + case 15050: + searchAltar(player, object); + break; + case 15051: + if (!player.getQuestRepository().isComplete(RestlessGhost.NAME) && !player.getBank().containsItem(SKULL) && !player.getInventory().containsItem(SKULL)) { + player.getInventory().add(SKULL); + player.getPacketDispatch().sendMessage("You find another skull."); + } + break; + case 2145: + toggleCoffin(player, object); + break; + } + break; + } + return true; + } + + /** + * Method used to toggle the coffin. + * @param player the player. + * @param object the object. + */ + private void toggleCoffin(final Player player, final GameObject object) { + final boolean open = object.getId() == 2145; + player.lock(2); + player.animate(open ? OPEN_ANIM : CLOSE_ANIM); + ObjectBuilder.replace(object, object.transform(open ? 15061 : 2145)); + player.getPacketDispatch().sendMessage("You " + (open ? "open" : "close") + " the coffin."); + if (open && !player.getQuestRepository().isComplete(RestlessGhost.NAME)) { + sendGhost(); + } + } + + /** + * Method used to send the restless ghost npc. + */ + private void sendGhost() { + if (!GHOST.isInvisible()) { + return; + } + GHOST.setInvisible(false); + GameWorld.getPulser().submit(new Pulse(100, GHOST) { + @Override + public boolean pulse() { + GHOST.setInvisible(true); + return true; + } + }); + } + + /** + * Method used to search the altar. + * @param player the player. + * @param object the object. + */ + private void searchAltar(final Player player, final GameObject object) { + final boolean hasSkull = object.getId() == 15051; + if (player.getQuestRepository().getQuest(RestlessGhost.NAME).getStage(player) != 30) { + player.getPacketDispatch().sendMessage("You search the altar and find nothing."); + return; + } + if (!hasSkull) { + if (!player.getInventory().add(SKULL)) { + GroundItemManager.create(SKULL, player); + } + player.getConfigManager().set(728, 5, true); + player.getQuestRepository().getQuest(RestlessGhost.NAME).setStage(player, 40); + player.getPacketDispatch().sendMessage("The skeleton in the corner suddenly comes to life!"); + sendSkeleton(player); + } + } + + /** + * Method used to send the skeleton. + * @param player the player. + */ + private void sendSkeleton(final Player player) { + final NPC skeleton = NPC.create(459, Location.create(3120, 9568, 0)); + skeleton.setWalks(false); + skeleton.setRespawn(false); + skeleton.setAttribute("player", player); + skeleton.init(); + skeleton.getProperties().getCombatPulse().setStyle(CombatStyle.MELEE); + skeleton.getProperties().getCombatPulse().attack(player); + } + + /** + * Handles the temple guardian npc. + * @author 'Vexia + */ + public static final class RestlessGhostNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 459, 457 }; + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public RestlessGhostNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private RestlessGhostNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new RestlessGhostNPC(id, location); + } + + @Override + public void init() { + super.init(); + this.getProperties().getCombatPulse().setStyle(CombatStyle.MELEE); + } + + @Override + public void tick() { + super.tick(); + final Player pl = getAttribute("player", null); + if (pl != null) { + if (getAttribute("dead", false) || !getLocation().withinDistance(pl.getLocation(), 16)) { + clear(); + return; + } + } + } + + @Override + public boolean isAttackable(final Entity entity, final CombatStyle style) { + final Player player = ((Player) entity); + final Player pl = getAttribute("player", null); + return pl == null ? false : pl == player ? true : false; + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + removeAttribute("player"); + } + + @Override + public boolean isHidden(final Player player) { + final Player pl = getAttribute("player", null); + if (this.getRespawnTick() > GameWorld.getTicks()) { + return true; + } + return player.getQuestRepository().isComplete(RestlessGhost.NAME) || (pl != null && player != pl); + } + + @Override + public int[] getIds() { + return ID; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhostSkull.java b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhostSkull.java new file mode 100644 index 000000000..581dc86e2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/RestlessGhostSkull.java @@ -0,0 +1,46 @@ +package core.game.content.quest.free.therestlessghost; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to add the skull to the cofin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class RestlessGhostSkull extends UseWithHandler { + + /** + * Constructs a new {@code RestlessGhostSkull} {@code Object}. + */ + public RestlessGhostSkull() { + super(964); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2145, OBJECT_TYPE, this); + addHandler(15052, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final GameObject object = (GameObject) event.getUsedWith(); + if (object.getId() == 2145) { + event.getPlayer().getDialogueInterpreter().sendDialogue("Maybe I should open it first."); + return true; + } + if (event.getPlayer().getInventory().remove(new Item(964, 24))) { + event.getPlayer().getPacketDispatch().sendMessage("You put the skull in the coffin."); + event.getPlayer().getQuestRepository().getQuest(RestlessGhost.NAME).finish(event.getPlayer()); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/SkullDropPlugin.java b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/SkullDropPlugin.java new file mode 100644 index 000000000..cb782206c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/free/therestlessghost/SkullDropPlugin.java @@ -0,0 +1,32 @@ +package core.game.content.quest.free.therestlessghost; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/* + * 8 + */ +@Initializable +public class SkullDropPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(964).getHandlers().put("option:drop", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getPacketDispatch().sendMessage("You can't drop this! Return it to the ghost."); + return true; + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/DruidicRitual.java b/Server/src/main/java/Server/core/game/content/quest/members/DruidicRitual.java new file mode 100644 index 000000000..bf45d21fb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/DruidicRitual.java @@ -0,0 +1,82 @@ +package core.game.content.quest.members; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.entity.player.link.quest.Quest; + +/** + * The main type for the druidic ritual quest. + * @author Vexia + * + */ +@Initializable +public class DruidicRitual extends Quest { + + /** + * Constructs a new {@code DruidicRitual} {@code Object}. + */ + public DruidicRitual() { + super("Druidic Ritual", 48, 47, 4, 80, 0, 3, 4); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + player.getPacketDispatch().sendString("I can start this quest by speaking to the Kaqemeex who is at", 275, 4+ 7); + player.getPacketDispatch().sendString("the Druids Circle just North of Taverley.", 275, 5+ 7); + if (stage == 10) { + player.getPacketDispatch().sendString("I told Kaqemeex I would help them prepare their ceremony.", 275, 4+ 7); + player.getPacketDispatch().sendString("I should speak to Sanfew in the village to the South", 275, 5+ 7); + } + if (stage == 20) { + player.getPacketDispatch().sendString("", 275, 5+ 7); + player.getPacketDispatch().sendString("I told Kaqemeex I would help them prepare their ceremony.", 275, 4+ 7); + player.getPacketDispatch().sendString("Sanfew told me for the ritual they would need me to place", 275, 6+ 7); + player.getPacketDispatch().sendString("raw bear meat, raw chicken, raw rat meat, and raw beef in", 275, 7+ 7); + player.getPacketDispatch().sendString("the Cauldron of Thunder in the dungeon South of Taverley", 275, 8+ 7); + } + if (stage == 99) { + player.getPacketDispatch().sendString("I told Kaqemeex I would help them prepare their ceremony.", 275, 4+ 7); + player.getPacketDispatch().sendString("The ceremony required various meats being placed in the.", 275, 5+ 7); + player.getPacketDispatch().sendString("Cauldron of Thunder. I did this and gave them to Sanfew.", 275, 6+ 7); + player.getPacketDispatch().sendString("I should speak to Kaqemeex again and claim my reward", 275, 7+ 7); + } + if (stage == 100) { + player.getPacketDispatch().sendString("I told Kaqemeex I would help them prepare their ceremony.", 275, 4+ 7); + player.getPacketDispatch().sendString("The ceremony required various meats being placed in the.", 275, 5+ 7); + player.getPacketDispatch().sendString("Cauldron of Thunder. I did this and gave them to Sanfew.", 275, 6+ 7); + player.getPacketDispatch().sendString("Kaqemeex then taught me the basics of the skill Herblore", 275, 7+ 7); + player.getPacketDispatch().sendString("QUEST COMPLETE!", 275, 11+ 7); + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getInterfaceManager().open(new Component(277).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + if (player != null) { + player.getDialogueInterpreter().open(455, NPC.create(455, player.getLocation()), true); + } + return true; + } + })); + player.getPacketDispatch().sendString("4 Quest Points", 277, 8 + 2); + player.getPacketDispatch().sendString("250 Herblore XP", 277, 9 + 2); + player.getPacketDispatch().sendString("Access to Herblore skill", 277, 10 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(249, 240, 277, 3 + 2); + player.getSkills().addExperience(Skills.HERBLORE, 250); + player.getInterfaceManager().closeChatbox(); + } + + @Override + public Quest newInstance(Object object) { + // TODO Auto-generated method stub + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/GertrudesCat.java b/Server/src/main/java/Server/core/game/content/quest/members/GertrudesCat.java new file mode 100644 index 000000000..fbc2cfa11 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/GertrudesCat.java @@ -0,0 +1,112 @@ +package core.game.content.quest.members; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.tools.RandomFunction; + +/** + * Represents the gertrudes fortress quest. + * @author 'Vexia + */ +@Initializable +public class GertrudesCat extends Quest { + + /** + * Constructs a new {@code GertrudesCat} {@code Object}. + */ + public GertrudesCat() { + super("Gertrude's Cat", 67, 66, 1, 180, 0, 1, 100); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + player.getPacketDispatch().sendString(BLUE+ "I can start this quest by speaking to " + RED + "Gertrude.", 275, 4+ 7); + player.getPacketDispatch().sendString(BLUE+ "She can be found to the " + RED + "west of Varrock.", 275, 5+ 7); + break; + case 10: + player.getPacketDispatch().sendString("I accepted the challenge of finding Gertrude's lost cat.", 275, 4+ 7); + player.getPacketDispatch().sendString(BLUE+ "I need " + RED + "to speak to Shilop and Wilough" + BLUE+ " at the " + RED + "marketplace.", 275, 6+ 7); + break; + case 20: + player.getPacketDispatch().sendString("I accepted the challenge of finding Gertrude's lost cat.", 275, 4+ 7); + player.getPacketDispatch().sendString("I spoke to Shilop, Gertrude's Son.", 275, 5+ 7); + player.getPacketDispatch().sendString(BLUE+ "I need to " + RED + "go to their play area " + BLUE+ "and " + RED + "find the lost cat and", 275, 7+ 7); + player.getPacketDispatch().sendString(RED + "return it to Gertrude.", 275, 8+ 7); + break; + case 30: + player.getPacketDispatch().sendString("I accepted the challenge of finding Gertrude's lost cat.", 275, 4+ 7); + player.getPacketDispatch().sendString("I spoke to Shilop, Gertrude's Son.", 275, 5+ 7); + player.getPacketDispatch().sendString("I found the lost cat but it won't come back.", 275, 6+ 7); + player.getPacketDispatch().sendString(RED + "I still need to " + RED + "get her to follow me home.", 275, 8+ 7); + break; + case 40: + case 50: + player.getPacketDispatch().sendString("I accepted the challenge of finding Gertrude's lost cat.", 275, 4+ 7); + player.getPacketDispatch().sendString("I spoke to Shilop, Gertrude's Son.", 275, 5+ 7); + player.getPacketDispatch().sendString("I found the lost cat but it won't come back.", 275, 6+ 7); + player.getPacketDispatch().sendString("I gave the cat milk and sardines.", 275, 7+ 7); + player.getPacketDispatch().sendString(BLUE+ "I still need to " + RED + "get her to follow me home.", 275, 9+ 7); + break; + case 60: + player.getPacketDispatch().sendString("I accepted the challenge of finding Gertrude's lost cat.", 275, 4+ 7); + player.getPacketDispatch().sendString("I spoke to Shilop, Gertrude's Son.", 275, 5+ 7); + player.getPacketDispatch().sendString("I found the lost cat but it won't come back.", 275, 6+ 7); + player.getPacketDispatch().sendString("I gave the cat milk and sardines.", 275, 7+ 7); + player.getPacketDispatch().sendString(BLUE+ "She ran off home.", 275, 9+ 7); + break; + case 100: + player.getPacketDispatch().sendString("I helped Gertrude to find her lost cat,", 275, 4+ 7); + player.getPacketDispatch().sendString("I fed it and returned her missing kitten,", 275, 5+ 7); + player.getPacketDispatch().sendString("Gertrude gave me my very own pet for a reward.", 275, 6+ 7); + player.getPacketDispatch().sendString("QUEST COMPLETE!", 275, 8+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + final Item kitten = getKitten(); + player.getConfigManager().set(101, player.getQuestRepository().getPoints()); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("A kitten!", 277, 9 + 2); + player.getPacketDispatch().sendString("1525 Cooking XP", 277, 10 + 2); + player.getPacketDispatch().sendString("A chocolate cake", 277, 11 + 2); + player.getPacketDispatch().sendString("A bowl of stew", 277, 12 + 2); + player.getPacketDispatch().sendString("Raise cats.", 277, 13 + 2); + player.getSkills().addExperience(Skills.COOKING, 1525); + player.getPacketDispatch().sendItemZoomOnInterface(kitten.getId(), 240, 277, 3 + 2); + setStage(player, 100); + player.getInventory().add(kitten); + player.getFamiliarManager().summon(kitten, true); + final Item cake = new Item(1897); + final Item stew = new Item(2003); + if (!player.getInventory().add(cake)) { + GroundItemManager.create(cake, player.getLocation(), player); + } + if (!player.getInventory().add(stew)) { + GroundItemManager.create(stew, player.getLocation(), player); + } + } + + /** + * Method used to get a random kitten. + * @return the item. + */ + public Item getKitten() { + return new Item(RandomFunction.random(1555, 1560)); + } + + @Override + public Quest newInstance(Object object) { + // TODO Auto-generated method stub + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/PriestInPeril.java b/Server/src/main/java/Server/core/game/content/quest/members/PriestInPeril.java new file mode 100644 index 000000000..af84d6df1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/PriestInPeril.java @@ -0,0 +1,191 @@ +package core.game.content.quest.members; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; + +/** + * Represents the Quest priest in peril. + * @author 'Vexia + */ +@Initializable +public class PriestInPeril extends Quest { + + /** + * Constructs a new {@code PriestInPeril} {@code Object}. + */ + public PriestInPeril() { + super("Priest in Peril", 99, 98, 1, 302, 0, 1, 100); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + player.getPacketDispatch().sendString("I can start this quest by speaking to King Roald in Varrock", 275, 4+ 7); + player.getPacketDispatch().sendString("Palace", 275, 5+ 7); + player.getPacketDispatch().sendString("I must be able to defeat a level 30 enemy", 275, 7+ 7); + break; + case 10: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("Drezel lives in a temple to the east of Varrock Palace. I", 275, 7+ 7); + player.getPacketDispatch().sendString("should head there and investigate what's happened to him", 275, 8+ 7); + break; + case 11: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("I headed to the temple where Drezel lives, but it was all", 275, 6+ 7); + player.getPacketDispatch().sendString("locked shut. I spoke through the locked door to Drezel.", 275, 7+ 7); + player.getPacketDispatch().sendString("He told me that there was an annoying dog below the", 275, 8+ 7); + player.getPacketDispatch().sendString("temple, and has asked me to kill it for him.", 275, 9+ 7); + break; + case 12: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("I headed to the temple where Drezel lives, but it was all", 275, 6+ 7); + player.getPacketDispatch().sendString("locked shut. I spoke through the locked door to Drezel.", 275, 7+ 7); + player.getPacketDispatch().sendString("He told me that there was an annoying dog below the", 275, 8+ 7); + player.getPacketDispatch().sendString("temple, and asked me to kill it, which I did easily.", 275, 9+ 7); + player.getPacketDispatch().sendString("I should tell King Roald everything's fine with Drezel now I", 275, 11+ 7); + player.getPacketDispatch().sendString("have killed that dog for him, and claim my reward.", 275, 12+ 7); + break; + case 13: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("I headed to the temple where Drezel lives, but it was all", 275, 6+ 7); + player.getPacketDispatch().sendString("locked shut. I spoke through the locked door to Drezel.", 275, 7+ 7); + player.getPacketDispatch().sendString("He told me that there was an annoying dog below the", 275, 8+ 7); + player.getPacketDispatch().sendString("temple, and asked me to kill it, which I did easily.", 275, 9+ 7); + player.getPacketDispatch().sendString("When I told Roald what I had done, he was furious. The", 275, 10+ 7); + player.getPacketDispatch().sendString("person who told me to kill the dog wasn't Drezel at all!", 275, 11+ 7); + player.getPacketDispatch().sendString("I must return to the temple and find out what happened to", 275, 13+ 7); + player.getPacketDispatch().sendString("the real Drezel, or the King will have me executed!", 275, 14+ 7); + break; + case 14: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("I headed to the temple where Drezel lives, but it was all", 275, 6+ 7); + player.getPacketDispatch().sendString("locked shut. I spoke through the locked door to Drezel.", 275, 7+ 7); + player.getPacketDispatch().sendString("He told me that there was an annoying dog below the", 275, 8+ 7); + player.getPacketDispatch().sendString("temple, and asked me to kill it, which I did easily.", 275, 9+ 7); + player.getPacketDispatch().sendString("When I told Roald what I had done, he was furious. The", 275, 10+ 7); + player.getPacketDispatch().sendString("person who told me to kill the dog wasn't Drezel at all!", 275, 11+ 7); + player.getPacketDispatch().sendString("I returned to the temple and found the real Drezel locked", 275, 12+ 7); + player.getPacketDispatch().sendString("in a makeshift cell upstairs, guarded by a vampire.", 275, 13+ 7); + player.getPacketDispatch().sendString("I need to find the key to his cell and free him!", 275, 15+ 7); + break; + case 15: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("I headed to the temple where Drezel lives, but it was all", 275, 6+ 7); + player.getPacketDispatch().sendString("locked shut. I spoke through the locked door to Drezel.", 275, 7+ 7); + player.getPacketDispatch().sendString("He told me that there was an annoying dog below the", 275, 8+ 7); + player.getPacketDispatch().sendString("temple, and asked me to kill it, which I did easily.", 275, 9+ 7); + player.getPacketDispatch().sendString("When I told Roald what I had done, he was furious. The", 275, 10+ 7); + player.getPacketDispatch().sendString("person who told me to kill the dog wasn't Drezel at all!", 275, 11+ 7); + player.getPacketDispatch().sendString("I returned to the temple and found the real Drezel locked", 275, 12+ 7); + player.getPacketDispatch().sendString("in a makeshift cell upstairs, guarded by a vampire.", 275, 13+ 7); + player.getPacketDispatch().sendString("I used a key from the monument to open the cell door", 275, 14+ 7); + player.getPacketDispatch().sendString("but I still have to do something about that vampire", 275, 15+ 7); + break; + case 16: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("I headed to the temple where Drezel lives, but it was all", 275, 6+ 7); + player.getPacketDispatch().sendString("locked shut. I spoke through the locked door to Drezel.", 275, 7+ 7); + player.getPacketDispatch().sendString("He told me that there was an annoying dog below the", 275, 8+ 7); + player.getPacketDispatch().sendString("temple, and asked me to kill it, which I did easily.", 275, 9+ 7); + player.getPacketDispatch().sendString("When I told Roald what I had done, he was furious. The", 275, 10+ 7); + player.getPacketDispatch().sendString("person who told me to kill the dog wasn't Drezel at all!", 275, 11+ 7); + player.getPacketDispatch().sendString("I returned to the temple and found the real Drezel locked", 275, 12+ 7); + player.getPacketDispatch().sendString("in a makeshift cell upstairs, guarded by a vampire.", 275, 13+ 7); + player.getPacketDispatch().sendString("I used a key from the monument to open the cell door and", 275, 14+ 7); + player.getPacketDispatch().sendString("used Holy Water to trap the vampire in his coffin.", 275, 15+ 7); + player.getPacketDispatch().sendString("I should speak to Drezel again.", 275, 16+ 7); + break; + case 17: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("I headed to the temple where Drezel lives, but it was all", 275, 6+ 7); + player.getPacketDispatch().sendString("locked shut. I spoke through the locked door to Drezel.", 275, 7+ 7); + player.getPacketDispatch().sendString("He told me that there was an annoying dog below the", 275, 8+ 7); + player.getPacketDispatch().sendString("temple, and asked me to kill it, which I did easily.", 275, 9+ 7); + player.getPacketDispatch().sendString("When I told Roald what I had done, he was furious. The", 275, 10+ 7); + player.getPacketDispatch().sendString("person who told me to kill the dog wasn't Drezel at all!", 275, 11+ 7); + player.getPacketDispatch().sendString("I returned to the temple and found the real Drezel locked", 275, 12+ 7); + player.getPacketDispatch().sendString("in a makeshift cell upstairs, guarded by a vampire.", 275, 13+ 7); + player.getPacketDispatch().sendString("I used a key from the monument to open the cell door and", 275, 14+ 7); + player.getPacketDispatch().sendString("used Holy Water to trap the vampire in his coffin.", 275, 15+ 7); + player.getPacketDispatch().sendString("I should head downstairs to the monument like Drezel", 275, 16+ 7); + player.getPacketDispatch().sendString("asked me to, and asses what damage has been done.", 275, 17+ 7); + break; + case 18: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("I headed to the temple where Drezel lives, but it was all", 275, 6+ 7); + player.getPacketDispatch().sendString("locked shut. I spoke through the locked door to Drezel.", 275, 7+ 7); + player.getPacketDispatch().sendString("He told me that there was an annoying dog below the", 275, 8+ 7); + player.getPacketDispatch().sendString("temple, and asked me to kill it, which I did easily.", 275, 9+ 7); + player.getPacketDispatch().sendString("When I told Roald what I had done, he was furious. The", 275, 10+ 7); + player.getPacketDispatch().sendString("person who told me to kill the dog wasn't Drezel at all!", 275, 11+ 7); + player.getPacketDispatch().sendString("I returned to the temple and found the real Drezel locked", 275, 12+ 7); + player.getPacketDispatch().sendString("in a makeshift cell upstairs, guarded by a vampire.", 275, 13+ 7); + player.getPacketDispatch().sendString("I used a key from the monument to open the cell door and", 275, 14+ 7); + player.getPacketDispatch().sendString("used Holy Water to trap the vampire in his coffin.", 275, 15+ 7); + player.getPacketDispatch().sendString("I followed Drezel downstairs only to find that the Salve", 275, 16+ 7); + player.getPacketDispatch().sendString("had been contaminated and now needed purifying", 275, 17+ 7); + int amt = player.getGameAttributes().getAttribute("priest-in-peril:rune", 50+ 7); + player.getPacketDispatch().sendString("I need to bring " + amt + " rune essence to undo the damage", 275, 19+ 7); + player.getPacketDispatch().sendString("done by the Zamorakians and purify the salve", 275, 20+ 7); + break; + case 100: + player.getPacketDispatch().sendString("I spoke to King Roald who asked me to investigate why his", 275, 4+ 7); + player.getPacketDispatch().sendString("friend Priest Drezel has stopped communicating with him.", 275, 5+ 7); + player.getPacketDispatch().sendString("I headed to the temple where Drezel lives, but it was all", 275, 6+ 7); + player.getPacketDispatch().sendString("locked shut. I spoke through the locked door to Drezel.", 275, 7+ 7); + player.getPacketDispatch().sendString("He told me that there was an annoying dog below the", 275, 8+ 7); + player.getPacketDispatch().sendString("temple, and asked me to kill it, which I did easily.", 275, 9+ 7); + player.getPacketDispatch().sendString("When I told Roald what I had done, he was furious. The", 275, 10+ 7); + player.getPacketDispatch().sendString("person who told me to kill the dog wasn't Drezel at all!", 275, 11+ 7); + player.getPacketDispatch().sendString("I returned to the temple and found the real Drezel locked", 275, 12+ 7); + player.getPacketDispatch().sendString("in a makeshift cell upstairs, guarded by a vampire.", 275, 13+ 7); + player.getPacketDispatch().sendString("I used a key from the monument to open the cell door and", 275, 14+ 7); + player.getPacketDispatch().sendString("used Holy Water to trap the vampire in his coffin.", 275, 15+ 7); + player.getPacketDispatch().sendString("I followed Drezel downstairs only to find that the Salve", 275, 16+ 7); + player.getPacketDispatch().sendString("had been contaminated and now needed purifying", 275, 17+ 7); + player.getPacketDispatch().sendString("I brought Drezel fifty rune essences and the", 275, 18+ 7); + player.getPacketDispatch().sendString("contaminants were dissolved from the Salve, and Drezel", 275, 19+ 7); + player.getPacketDispatch().sendString("Rewarded me for all of my help with an ancient holy weapon", 275, 20+ 7); + player.getPacketDispatch().sendString("to fight with.", 275, 21+ 7); + player.getPacketDispatch().sendString("QUEST COMPLETE!", 275, 23+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getGameAttributes().removeAttribute("priest-in-peril:rune"); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8+ 2); + player.getPacketDispatch().sendString("1406 Prayer XP", 277, 9+ 2); + player.getPacketDispatch().sendString("Wolfbane dagger", 277, 10+ 2); + player.getPacketDispatch().sendString("Route to Canifis", 277, 11+ 2); + if (!player.getInventory().add(new Item(2952, 1))) { + GroundItemManager.create(new Item(2952, 1), player.getLocation(), player); + } + player.removeAttribute("priest_in_peril:key"); + player.removeAttribute("priest-in-peril:rune"); + player.getSkills().addExperience(Skills.PRAYER, 1406); + player.getPacketDispatch().sendItemZoomOnInterface(2952, 240, 277, 3+ 2); + } + + @Override + public Quest newInstance(Object object) { + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/WolfWhistle.java b/Server/src/main/java/Server/core/game/content/quest/members/WolfWhistle.java new file mode 100644 index 000000000..3baab8b77 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/WolfWhistle.java @@ -0,0 +1,97 @@ +package core.game.content.quest.members; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Represents the demon slayer quest. + * @author 'Vexia + */ +@Initializable +public class WolfWhistle extends Quest { + + /** + * The wolf bones item. + */ + public static final Item WOLF_BONES = new Item(2859, 2); + + /** + * Constructs a new {@code WolfWhistle} {@code Object}. + */ + public WolfWhistle() { + super("Wolf Whistle", 146, 145, 1); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + line(player, BLUE + "I can begin this quest by talking to " + RED + "Pikkupstix" + BLUE + ", who lives in", 4+ 7); + line(player, RED + "Taverley.", 5+ 7); + break; + case 10: + line(player, "Having spoken to Pikkupstix, it seems that all I have to do

is get rid of the little rabbit upstairs in his house.", 4+ 7); + break; + case 20: + line(player, "Having spoken to Pikkupstix, it seems that all I have to do

is get rid of the little rabbit upstairs in his house.



It appears that I have underestimated the rabbit in this

case; it is some huge rabbit-wolf-monster-bird-thing. I

think I should speak to Pikkupstix to find out what is going

on.", 4+ 7); + break; + case 30: + line(player, "Having spoken to Pikkupstix, it seems that all I have to do

is get rid of the little rabbit upstairs in his house.

It appears that I have underestimated the rabbit in this

case; it is some huge rabbit-wolf-monster-bird-thing. I

think I should speak to Pikkupstix to find out what is going

on.



I have spoken to Pikkupstix, who has promised to teach me

the secrets of Summoning if I can help dismiss the giant

wolpertinger. To do this, I need to bring him 2 lots of wolf

bones.

" + (player.getInventory().containsItem(WOLF_BONES) ? "" : "") + "I need to get 2 lots of wolf bones.", 4+ 7); + break; + case 40: + line(player, "Having spoken to Pikkupstix, it seems that all I have to do

is get rid of the little rabbit upstairs in his house.

It appears that I have underestimated the rabbit in this

case; it is some huge rabbit-wolf-monster-bird-thing. I

think I should speak to Pikkupstix to find out what is going

on.



I have spoken to Pikkupstix, who has promised to teach me

the secrets of Summoning if I can help dismiss the giant

wolpertinger. To do this, I need to bring him 2 lots of wolf

bones.

I have given Pikkupstix all of the items he requested.



Pikkupstix has given me some gold charms, spirit shards

and pouches, with which to make a spirit wolf pouch and

some Howl scrolls. I will then be able to use them to dismiss

the giant wolpertinger.

I need to open the trapdoor with the trapdoor key that I

have been given. ", 4+ 7); + break; + case 50: + line(player, "Having spoken to Pikkupstix, it seems that all I have to do

is get rid of the little rabbit upstairs in his house.

It appears that I have underestimated the rabbit in this

case; it is some huge rabbit-wolf-monster-bird-thing. I

think I should speak to Pikkupstix to find out what is going

on.



I have spoken to Pikkupstix, who has promised to teach me

the secrets of Summoning if I can help dismiss the giant

wolpertinger. To do this, I need to bring him 2 lots of wolf

bones.



Pikkupstix has given me some gold charms, spirit shards

and pouches, with which to make a spirit wolf pouch and

some Howl scrolls. I will then be able to use them to dismiss

the giant wolpertinger.

I have infused the 2 spirit wolf pouches, but I need to

transform one of them into scrolls at the obelisk.", 4+ 7); + break; + case 60: + line(player, "Having spoken to Pikkupstix, it seems that all I have to do

is get rid of the little rabbit upstairs in his house.

It appears that I have underestimated the rabbit in this

case; it is some huge rabbit-wolf-monster-bird-thing. I

think I should speak to Pikkupstix to find out what is going

on.



I have spoken to Pikkupstix, who has promised to teach me

the secrets of Summoning if I can help dismiss the giant

wolpertinger. To do this, I need to bring him 2 lots of wolf

bones.



Pikkupstix has given me some gold charms, spirit shards

and pouches, with which to make a spirit wolf pouch and

some Howl scrolls. I will then be able to use them to dismiss

the giant wolpertinger.

I have infused the 2 spirit wolf pouches, but I need to

transform one of them into scrolls at the obelisk.

I have dismissed the giant wolpertinger.", 4+ 7); + break; + case 100: + line(player, "Having spoken to Pikkupstix, it seems that all I have to do

is get rid of the little rabbit upstairs in his house.

It appears that I have underestimated the rabbit in this

case; it is some huge rabbit-wolf-monster-bird-thing. I

think I should speak to Pikkupstix to find out what is going

on.



I have spoken to Pikkupstix, who has promised to teach me

the secrets of Summoning if I can help dismiss the giant

wolpertinger. To do this, I need to bring him 2 lots of wolf

bones.



Pikkupstix has given me some gold charms, spirit shards

and pouches, with which to make a spirit wolf pouch and

some Howl scrolls. I will then be able to use them to dismiss

the giant wolpertinger.

I have infused the 2 spirit wolf pouches, but I need to

transform one of them into scrolls at the obelisk.

I have dismissed the giant wolpertinger.



QUEST COMPLETE!", 4+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("1 Quest Points", 277, 8+ 2); + player.getPacketDispatch().sendString("276 Summoning XP", 277, 9+ 2); + player.getPacketDispatch().sendString("Access to the Summoning", 277, 10+ 2); + player.getPacketDispatch().sendString("skill.", 277, 11+ 2); + player.getPacketDispatch().sendString("275 gold charms.", 277, 12+ 2); + player.getPacketDispatch().sendItemZoomOnInterface(12047, 230, 277, 3+ 2); + player.getSkills().addExperience(Skills.SUMMONING, 276); + player.getInventory().add(new Item(12158, 275), player); + player.removeAttribute("searched-body"); + player.getQuestRepository().syncronizeTab(player); + player.getInterfaceManager().openInfoBars(); + } + + @Override + public int[] getConfig(Player player, int stage) { + int val = player.getConfigManager().get(1178); + boolean open = val >= 4096; + boolean closed = val == 2048; + if (stage == 100) { + if (val == 5 || val == 0) { + return new int[] { 1178, 32989 }; + } else if (val == 4101) { + return new int[] { 1178, 28893 }; + } + return new int[] { 1178, val }; + } + return new int[] { 1178, stage > 0 ? 5 + (open ? 4096 : 0) : stage >= 100 ? !closed ? 28893 : 32989 : 0 }; + } + + @Override + public Quest newInstance(Object object) { + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/AllFiredUp.kt b/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/AllFiredUp.kt new file mode 100644 index 000000000..c60d3db80 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/AllFiredUp.kt @@ -0,0 +1,95 @@ +package core.game.content.quest.members.allfiredup + +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.quest.Quest +import core.game.node.item.Item +import core.plugin.Initializable +import core.tools.Items +import core.game.content.activity.allfiredup.AFUBeacon +import core.game.node.entity.skill.Skills + +/** + * Represents the "All Fired Up" quest. + * @author Ceikry + */ +@Initializable +class AllFiredUp : Quest("All Fired Up", 157, 156, 1){ + override fun newInstance(`object`: Any?): Quest { + return this + } + + override fun drawJournal(player: Player?, stage: Int) { + super.drawJournal(player, stage) + var line = 11 + player ?: return + if(stage == 0){ + line(player, "I can start this quest by speaking to !!King Roald?? in Varrock Palace.", line++) + line++ + line(player, "To start this quest, I require:", line++) + line(player, "!!43 Firemaking??", line++, player.skills.getLevel(Skills.FIREMAKING) >= 43) + line(player, "!!Completion of Priest in Peril??", line++, player.questRepository.isComplete("Priest in Peril")) + + } else { + if(stage >= 10){ + line(player, "!!King Roald?? needs me to test the !!beacons??. He has sent me", line++, stage >= 20) + line(player, "to speak with !!Blaze Sharpeye??, by the beacon near the !!River Salve??.", line++, stage >= 20) + } + if(stage >= 20){ + line(player, "Blaze Sharpeye asked me to light the !!beacon??. I'm going to need:", line++, stage >= 30) + line(player, "20 logs of a single kind", line++, stage >= 30) + line(player, "A tinderbox", line++, stage >= 30) + } + if(stage == 30){ + line(player, "I lit the beacon. I should speak to !!Blaze Sharpeye?? again.", line++, stage >= 40) + } + if(stage >= 40){ + line(player, "Blaze Sharpeye asked me to go and speak with !!Squire Fyre?? near the !!limestone quarry??.", line++, stage >= 50) + } + if(stage >= 50){ + line(player, "Squire Fyre permitted me to light the !!beacon??. I'm going to need:", line++, stage >= 60) + line(player, "20 logs of a single kind", line++, stage >= 60) + line(player, "A tinderbox", line++, stage >= 60) + } + if(stage == 60){ + line(player, "I should return to !!Blaze Sharpeye??.", line++) + } + if(stage >= 70){ + line(player, "Blaze asked me to add more logs to the dying fire. I'll need:", line++, stage >= 80) + line(player, "5 logs of a single kind", line++, stage >= 80) + line(player, "A tinderbox", line++, stage >= 80) + } + if(stage == 80){ + line(player, "I should speak to !!Blaze?? again.", line++) + } + if(stage == 90){ + line(player, "I should report to !!King Roald??.", line++) + } + if(stage == 100){ + line(player, "I helped King Roald test the beacon network", line++) + line(player, " and have gained full access to it.", line++) + } + } + } + + override fun finish(player: Player?) { + super.finish(player) + player ?: return + player.packetDispatch.sendString("20,000gp,", 277, 8 + 2) + player.packetDispatch.sendString("5,500 Firemaking XP", 277, 9 + 2) + player.packetDispatch.sendString("Full access to the beacon network", 277, 10 + 2) + player.packetDispatch.sendString("1 Quest Point", 277, 11 + 2) + player.packetDispatch.sendItemZoomOnInterface(Items.TINDERBOX_590, 235, 277, 3 + 2) + player.skills.addExperience(Skills.FIREMAKING, 5500.0) + player.inventory.add(Item(995,20000)) + player.varpManager.unflagSave(1283) + AFUBeacon.resetAllBeacons(player) + player.varpManager.get(1283).setVarbit(0,0).send(player) + player.questRepository.syncronizeTab(player) + } + + override fun getConfig(player: Player?, stage: Int): IntArray { + if(stage == 100) return intArrayOf(1282, 90) + if(stage > 0) return intArrayOf(1282, 1) + else return intArrayOf(1282, 0) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue.kt new file mode 100644 index 000000000..a85cb9519 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/BlazeSharpeyeDialogue.kt @@ -0,0 +1,109 @@ +package core.game.content.quest.members.allfiredup + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +@Initializable +class BlazeSharpeyeDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun newInstance(player: Player?): DialoguePlugin { + return BlazeSharpeyeDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + npc = (args[0] as NPC).getShownNPC(player) + val qstage = player?.questRepository?.getStage("All Fired Up") ?: -1 + when(qstage){ + 0 -> player.dialogueInterpreter.sendDialogue("He seems uninterested in talking.").also { stage = 1000 } + 10 -> player("So, what's going on?").also { stage = 100 } + 20 -> npc("Well, go on, light the fire, then.").also { stage = 1000 } + 30 -> npc("Ah, I see you've managed to successfully light the","beacon and have mastered our super-secret beacon","lighting technique. Well done!").also { stage = 200 } + 40,50 -> npc("Please go and light the other beacon.").also { stage = 116 } + 60 -> npc("Ah, ${player.username}, you're back! Great news - I can see","you've managed to light the beacon over yonder. Many","thanks!").also { stage = 300 } + 70 -> npc("Well, GO ON, BURN IT!!!").also { stage = 1000 } + 80 -> player("I've added some logs to the beacon; it's now blazing","away.").also { stage = 400 } + 90 -> npc("Go talk to King Roald!").also { stage = 1000 } + else -> npc("Ah yes, hello adventurer!").also { stage = 600 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + //Stage = 10 + 100 -> npc("Well, King Roald has commissioned these lovely beacons","to serve as an early warning system. We'll be able to","see their huge, majestic flames from great distances.").also { stage++ } + 101 -> npc("There are 14 beacons in total, spanning the south","and west borders of the Wilderness.").also { stage++ } + 102 -> player("It sounds like you've already got everything figured","out. How do I fit into this?").also { stage++ } + 103 -> npc("Well, to test these beacons, we need someone to light a","couple of them for us, so that we can determine","whether or not they'll actually be visible.").also { stage++ } + 104 -> player("You mean, you went out and built these huge things","without knowing that they'd work?").also { stage++ } + 105 -> npc("Dont interrupt. Now, yours truly has recruited some","of the sharpest eyes this side of the River Salve to look","after these beacons and to watch the horizon for signs","of danger.").also { stage++ } + 106 -> npc("In case of emergency, we've all got a supply of logs","and can start a fire faster than a cat can sneeze.").also { stage++ } + 107 -> npc("As soon as we spot a threat from the Wilderness or the","glow from another beacon, we can light our own","beacons and send a warning right across Misthalin,","faster than any courier could ever run.").also { stage++ } + 108 -> npc("We've agreed to use gnomish firelighters to colour the","flames of our beacons' fires in an actual emergency, so","it's safe to test the network with normal fires.").also { stage++ } + 109 -> player("So, what do you want me to actually do?").also { stage++ } + 110 -> npc("I need you to light a couple of beacons for me to make","sure we can see the glow from the flames over the","horizon.").also { stage++ } + 111 -> npc("So! First of all, you'll need to know how to light a beacon.").also { stage++ } + 112 -> npc("Our technique is super-secret, but quite effective. All","you do is put twenty logs of the same type on a","beacon and...").also { stage++ } + 113 -> npc(FacialExpression.AMAZED,"SET IT ON FIRE WITH A TINDERBOX").also { stage++ } + 114 -> player("You really enjoy your job, don't you?").also { stage++ } + 115 -> npc("Yes. Yes I do. Now, why don't you go over there and","try lighting that beacon. Show us what you've got.").also { stage++; player.questRepository.getQuest("All Fired Up").setStage(player,20) } + 116 -> options("Does it matter what type of log I use?","Okay.").also { stage++ } + 117 -> when(buttonId){ + 1 -> player("Does it matter what type of log I use?").also { stage = 150 } + 2 -> player("Okay.").also { stage = 1000 } + } + 150 -> npc("Normal, Oak, Willow, Maple, Yew and Magic.").also { stage = 1000 } + + //Stage = 30 + 200 -> player("Well, it's not like it was all that complicated.").also { stage++ } + 201 -> npc("Well, apparently, not for someone of your Firemaking","calibre and expertise. Now that you've got the hang of","things, we can get this show on the road.").also { stage++ } + 202 -> npc("If you'd be so kind as to light the beacon to the west","and report back to me, I can make sure I can clearly","see its glow on the horizon.").also { stage++ } + 203 -> npc("It's near the limestone quarry, north-east of Varrock,","west of the Rag and Bone Man's hovel.").also { stage++ } + 204 -> npc("My colleague, Squire Fyre, is tending that beacon.","She'll help you out if you run into any trouble.").also { stage = 116; player.questRepository.getQuest("All Fired Up").setStage(player,40) } + + //Stage = 60 + 300 -> player("Can you really see it from this far away?").also { stage++ } + 301 -> npc("Absolutely! I can see a warm, delicious glow on the","horizon. If you have sharp eyes and know what to look","for it's trivial.").also { stage++ } + 302 -> npc("This beacon, however, is struggling at the moment.","Do you see how the fire has died down?").also { stage++ } + 303 -> player("Hmm, yes. The fire is a bit smaller and the logs look","rather charred.").also { stage++ } + 304 -> npc("If a beacon's fire starts to die down, you can restor it","to its blazing glory by adding five logs.").also { stage++ } + 305 -> npc("You wouldn't mind topping this one up for me, would","you? Oh, how I love to see things burn!").also { stage++; player.questRepository.getQuest("All Fired Up").setStage(player, 70) } + 306 -> options("Oh, alright, then.","Don't you have logs of your own you can use?").also { stage++ } + 307 -> when(buttonId){ + 1 -> player("Oh, alright, then.").also { stage++ } + 2 -> player("Don't you have logs of your own that you","can use?").also { stage = 310 } + } + 308 -> npc("MORE FIRE for ME!!!").also { stage++ } + 309 -> player("Backing away now...").also { stage = 1000 } + 310 -> npc("Nope.").also { stage = 1000 } + + + //Stage = 80 + 400 -> npc("Beautiful...mesmerising...").also { stage++ } + 401 -> player("Uh...Blaze?").also { stage++ } + 402 -> npc("Ah, yes, it's you again. Brilliant work; an incandescent","effort.").also { stage++ } + 403 -> player("So, what now?").also { stage++ } + 404 -> npc("We're all pretty pleased with the results of the trial run","and are gearing up for more serious testing. There's a","lot at stake, so we'll need to test out the entire network","as soon as possible.").also { stage++ } + 405 -> options("When's all this to take place?","More serious testing?").also { stage++ } + 406 -> when(buttonId){ + 1 -> player("When's all this taking place?").also { stage = 410 } + 2 -> player("More serious testing?").also { stage = 420 } + } + 410 -> npc("Imminently, I'm sure - we're just waiting for the word","from King Roald. Speaking of which, have you reported","back to him about the progress we've made?").also { stage++ } + 411 -> player("Not yet, I'm afraid.").also { stage++ } + 412 -> npc("Well, what are you waiting for? This is a serious","matter! I'm sure King Roald is on the edge of his","throne, waiting for the news.").also { stage++ } + 413 -> player("I'll get right on that.").also { stage = 1000; player.questRepository.getQuest("All Fired Up").setStage(player,90) } + 420 -> npc("Yes... YESS HAHAHAHHA FIRE").also { stage = 412 } + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(8065) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/SquireFyreDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/SquireFyreDialogue.kt new file mode 100644 index 000000000..4f7815131 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/allfiredup/SquireFyreDialogue.kt @@ -0,0 +1,52 @@ +package core.game.content.quest.members.allfiredup + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.activity.allfiredup.BeaconState +import core.game.content.dialogue.DialoguePlugin + +@Initializable +class SquireFyreDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun newInstance(player: Player?): DialoguePlugin { + return SquireFyreDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + npc = (args[0] as NPC).getShownNPC(player) + val qstage = player.questRepository.getQuest("All Fired Up").getStage(player) + when(qstage){ + 40 -> player("Hi there. I'm helping Blaze and King Roald test the","beacon network. Can you see it from here? Blaze said","you have pretty sharp eyes.").also { stage = 100 } + else -> npc("Carry on, friend.").also { stage = 1000 } + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 100 -> npc("Of course I can see it. I haven't spent my entire life","practising my seeing skills for nothing! I'm happy to","report that the fire near Blaze is burning brightly.").also { stage++ } + 101 -> player("Terrific! Blaze has asked me to light this fire as well, so","he can see how things look from his vantage point.").also { stage++ } + 102 -> npc("Be my guest!").also { stage++; player.questRepository.getQuest("All Fired Up").setStage(player,50); player.varpManager.get(1283).setVarbit(0,BeaconState.DYING.ordinal).send(player) } + 103 -> options("How do I light the beacon?","I suppose you don't have any logs I could have?","Okay, thanks.").also { stage++ } + 104 -> when(buttonId){ + 1 -> player("How do I light the beacon?").also { stage = 110 } + 2 -> player("I suppose you don't have any logs I could have?").also { stage = 120 } + 3 -> player("Okay, thanks").also { stage = 1000 } + } + 110 -> npc("Put in 20 logs of the same kind, and then light it.").also { stage = 1000 } + 120 -> npc("No, I do not.").also { stage = 1000 } + + + + + 1000 -> end() + } + + return true + } + + override fun getIds(): IntArray { + return intArrayOf(8066) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AliceDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AliceDialogue.java new file mode 100644 index 000000000..296a6e3df --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AliceDialogue.java @@ -0,0 +1,310 @@ +package core.game.content.quest.members.animalmagnetism; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Handles the alice npc dialogue. + * @author Vexia + */ +public final class AliceDialogue extends DialoguePlugin { + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@code AliceDialogue} {@code Object}. + */ + public AliceDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AliceDialogue} {@code Object}. + * @param player the player. + */ + public AliceDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AliceDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(AnimalMagnetism.NAME); + switch (quest.getStage(player)) { + default: + options("What are you selling?", "I'm okay, thank you."); + break; + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + options("What are you selling?", "I'm okay, thank you.", "I'm here about a quest."); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + switch (stage) { + case 0: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + player("I'm okay, thank you."); + stage++; + break; + } + break; + case 1: + end(); + break; + } + break; + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + switch (stage) { + case 0: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + player("I'm okay, thank you."); + stage++; + break; + case 3: + player("I'm here about a quest."); + stage = 2; + break; + } + break; + case 1: + end(); + break; + default: + handleQuest(buttonId); + break; + } + break; + } + return true; + } + + /** + * Handles a quest stage. + * @param buttonId the buttonId. + */ + private void handleQuest(int buttonId) { + switch (quest.getStage(player)) { + case 10: + switch (stage) { + case 2: + player("I am after one of your, er, unhealthier poultry. Could", "you help me?"); + stage++; + break; + case 3: + npc("You need those useless, undead chickens? How odd you", "adventurers are."); + stage++; + break; + case 4: + npc("You need to talk to my husband though - not that I", "can these days."); + stage++; + break; + case 5: + player("Whyever would this be?"); + stage++; + break; + case 6: + npc("Can't you see, he is dead. I can't talk to the dead."); + stage++; + break; + case 7: + end(); + break; + } + break; + case 11: + switch (stage) { + case 2: + player("I have a message from your husband. He wants you to", "know that he still loves you, despite his ghostly state."); + stage++; + break; + case 3: + npc("The curse of undeath was so cruel; all the men out", "here succumbed, but Lyra and I were left alive."); + stage++; + break; + case 4: + npc("Ever since that day, I've not been able to speak to him."); + stage++; + break; + case 5: + npc("Tell him I love him but I can't find our savings. I", "know he had our collection of gold and 'prize cow'", "rosettes just before the curse struck."); + stage++; + break; + case 6: + player("I'll have a word with him then; magic has its uses I", "suppose."); + stage++; + break; + case 7: + quest.setStage(player, 12); + end(); + break; + } + break; + case 12: + switch (stage) { + case 2: + npc("Have you spoken to my husband yet?"); + stage++; + break; + case 3: + player("I'm working on it."); + stage++; + break; + case 4: + end(); + break; + } + break; + case 13: + switch (stage) { + case 2: + player("Your husband say he put the cash in the bank."); + stage++; + break; + case 3: + npc("I'll need his bank pass, in that case."); + stage++; + break; + case 4: + player("Can't you just take a ghostspeak amulet? Then you", "could talk to him directly?"); + stage++; + break; + case 5: + npc("I tried that once, but all those other ghosts - and even", "the undead chickens and cows - scared me so much. I", "wouldn't try it again for all the cash in Varrock bank."); + stage++; + break; + case 6: + quest.setStage(player, 14); + end(); + break; + } + break; + case 14: + switch (stage) { + case 2: + npc("Have you asked him about the bank pass?"); + stage++; + break; + case 3: + player("Not yet."); + stage++; + break; + case 4: + end(); + break; + } + break; + case 15: + switch (stage) { + case 2: + player("He says he won't trust me with the bank pass."); + stage++; + break; + case 3: + player("What if I gave some sort of altered ghostspeak amulet", "to him - surely that would work?"); + stage++; + break; + case 4: + npc("You're so clever; I've overheard passing adventurers", "say that there's some witch near here who changes", "ghostspeak amulets."); + stage++; + break; + case 5: + npc("I think she lives a bit west of that mad Professor", "Frenksomething, past the Farming patch."); + stage++; + break; + case 6: + player("I'll see if I can find her. Big nose and a monstrous hat", "I assume? I wonder where the beautiful young witches", "hide..."); + stage++; + break; + case 7: + npc("Mysterious indeed, but in this case she actually looks", "preety normal."); + stage++; + break; + case 8: + quest.setStage(player, 16); + end(); + break; + } + break; + case 16: + case 17: + switch (stage) { + case 2: + npc("Have you found a way for me to talk to my husband", "yet?"); + stage++; + break; + case 3: + player("I've not progressed at all, I'm afraid."); + stage++; + break; + case 4: + end(); + break; + } + break; + case 18: + switch (stage) { + case 2: + npc("Have you handed him an enhanced amulet?"); + stage++; + break; + case 3: + player("I Have obtained the amulet; I just haven't handed it", "over yet. So, it's looking good!"); + stage++; + break; + case 4: + end(); + break; + } + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 2307 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.java new file mode 100644 index 000000000..f2d488590 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AliceHusbandDialogue.java @@ -0,0 +1,734 @@ +package core.game.content.quest.members.animalmagnetism; + +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.PluginManager; + +/** + * Handles the husband of alice's npc dialogue. + * @author Vexia + */ +public final class AliceHusbandDialogue extends DialoguePlugin { + + /** + * The quest. + */ + private Quest quest; + + /** + * The chicken catch scene. + */ + private ChickenCatchScene scene; + + /** + * Constructs a new {@code AliceHusbandDialogue} {@code Object}. + */ + public AliceHusbandDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AliceHusbandDialogue} {@code Object}. + * @param player the player. + */ + public AliceHusbandDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AliceHusbandDialogue(player); + } + + @Override + public void init() { + super.init(); + PluginManager.definePlugin(new ChickenCatchScene()); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest(AnimalMagnetism.NAME); + switch (quest.getStage(player)) { + case 0: + npc("Hi, I don't feel like talking."); + break; + case 10: + player("Your animals don't look too healthy."); + break; + case 11: + npc("'Ave you talked to the wife for me?"); + break; + case 12: + player("Your wife says she needs the family cash and wants to", "know what you did with it."); + stage++; + break; + case 13: + npc("Any luck wiv me wife?"); + break; + case 14: + case 15: + npc("'Ave you talked to 'er?"); + break; + case 16: + case 17: + case 18: + player("I talked to your wife and thought that if you had a", "special amulet, you could speak to her and sort out the", "bank situation without me being involved."); + break; + case 19: + npc("Ahh, many thanks. Now what was it you were wanting", "again?"); + break; + default: + npc("Hello, how can I help you? I'm sellin' if you have ecto-", "tokens."); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + switch (stage) { + case 0: + options("Could I buy those chickens now, then?", "Your animals don't look too healthy.", "I'm okay, thank you.", "Where can I get these ecto-tokens?"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Could I buy those chickens now, then?"); + stage = 10; + break; + case 2: + player("Your animals don't look too healthy."); + stage = 20; + break; + case 3: + player("I'm okay, thank you."); + stage = 30; + break; + case 4: + player("Where can I get these ecto-tokens?"); + stage = 40; + break; + } + break; + case 10: + npc("I can hand over a chicken if you give me 10 of them", "ecto-token thingies per bird."); + stage++; + break; + case 11: + options("Could I buy 1 chicken now?", "Could I buy 2 chickens now?", "Your animals don't look too healthy; I'll buy elsewhere."); + stage++; + break; + case 12: + switch (buttonId) { + case 1: + player("Could I buy 1 chicken now?"); + stage = 14; + break; + case 2: + player("Could I buy 2 chickens now?"); + stage = 15; + break; + case 3: + player("Your animals don't look too healthy; I'll buy elsewhere."); + stage++; + break; + } + break; + case 13: + end(); + break; + case 14: + case 15: + buy(stage == 14 ? 1 : 2); + stage = 16; + break; + case 16: + end(); + break; + case 20: + npc("It's that fountain thingy in the temple to the east. It's", "turned them all into zombies."); + stage++; + break; + case 21: + player("What use are zombie animals?"); + stage++; + break; + case 22: + npc("None at all, mate, except that those worshippers at that", "temple keep comin' and killin' em all for their bones.", "Don't ask me why."); + stage++; + break; + case 23: + player("But you're a ghost - surely you know", "something about it."); + stage++; + break; + case 24: + npc("I don't know nuthin' about nuthin'. Oim a simple ghost", "with simple needs. All I know is, years ago, that temple", "started glowing green and, a few months later, I woke", "up dead. That's all there is to it."); + stage++; + break; + case 25: + end(); + break; + case 30: + end(); + break; + case 40: + npc("The ghosts I talk to say that the tokens have something", "to do with the tower just east of here. If you need to", "collect some I'd try there."); + stage++; + break; + case 41: + end(); + break; + } + break; + case 0: + switch (stage) { + default: + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + npc("It's that fountain thingy in the temple to the east. It's", "turned them all into zombies."); + stage++; + break; + case 1: + player("What use are zombie animals?"); + stage++; + break; + case 2: + npc("None at all, mate, except that those worshippers at that", "temple keep comin' and killin' em all for their bones.", "Don't ask me why."); + stage++; + break; + case 3: + player("But you're a ghost - surely you know", "something about it."); + stage++; + break; + case 4: + npc("I don't know nuthin' about nuthin'. Oim a simple ghost", "with simple needs. All I know is, years ago, that temple", "started glowing green and, a few months later, I woke", "up dead. That's all there is to it."); + stage++; + break; + case 5: + npc("I do miss the wife though; tell 'er I still loves her."); + stage++; + break; + case 6: + player("Would I be able to buy some of your chickens?"); + stage++; + break; + case 7: + npc("Talk to my wife and I'll think about it."); + stage++; + break; + case 8: + if (quest.getStage(player) == 10) { + quest.setStage(player, 11); + } + end(); + break; + } + break; + case 11: + switch (stage) { + case 0: + player("Not yet; I've been distracted by the thought of undead", "cow milk."); + stage++; + break; + case 1: + end(); + break; + } + break; + case 12: + switch (stage) { + case 1: + npc("Tell 'er I spent it on cheap spirits, har har."); + stage++; + break; + case 2: + player("Your sense of humour died too, it seems..."); + stage++; + break; + case 3: + npc("Hah, just trying to lift your spirits."); + stage++; + break; + case 4: + player("I rest my case."); + stage++; + break; + case 5: + npc("Suit yerself, stick-in-the-mud. Anyway, Oim not one o'", "them yokels. Tell 'er I putted the cash in the bank like", "she always told me to."); + stage++; + break; + case 6: + npc("A warning to ya, too; annoy her and I'll haunt ya till", "yer hair turns white."); + stage++; + break; + case 7: + quest.setStage(player, 13); + end(); + break; + } + break; + case 13: + switch (stage) { + case 0: + player("Nothing new, no."); + stage++; + break; + case 1: + end(); + break; + } + break; + case 14: + switch (stage) { + case 0: + player("You may not believe me, but she wants me to find", "your bank pass now."); + stage++; + break; + case 1: + npc("Maybe she said that, maybe she didn't. I think you're", "just after me savings. Tell 'er that no one but a fool", "gives away their pass numbers."); + stage++; + break; + case 2: + npc("Go tell 'er now, if you're not a double-dealing' scammer,", "that is."); + stage++; + break; + case 3: + quest.setStage(player, 15); + end(); + break; + } + break; + case 15: + switch (stage) { + case 0: + player("Not since we last spoke."); + stage++; + break; + case 1: + end(); + break; + } + break; + case 16: + case 17: + case 18: + switch (stage) { + case 0: + npc("Arr, that makes far more sense than I was expecting", "from a muscle-head like you. My wife's a clever one."); + stage++; + break; + case 1: + if (player.getInventory().containsItem(AnimalMagnetism.CRONE_AMULET)) { + player("Well... oh, never mind. I'm desperate enough for those", "chickens to let that pass."); + stage += 2; + break; + } + player("Well...oh, never mind. I'm working on getting the", "amulet anyway."); + stage++; + break; + case 2: + end(); + break; + case 3: + npc("Give me that amulet, then, and we'll be seeing about", "your unnatural desire for chickens."); + stage++; + break; + case 4: + player("Okay, you need it more than I do, I suppose."); + stage++; + break; + case 5: + npc("Ta, mate."); + stage++; + break; + case 6: + player("Lucky we had such a brilliant idea."); + stage++; + break; + case 7: + if (player.getInventory().remove(AnimalMagnetism.CRONE_AMULET)) { + quest.setStage(player, 19); + end(); + } + break; + } + break; + case 19: + switch (stage) { + case 0: + player("I need a couple of your chickens."); + stage++; + break; + case 1: + npc("Chickens is tricksy, 'specially dead 'uns. I'll have to catch", "'em for ye."); + stage++; + break; + case 2: + player("They look preety pathetic, how hard can it be?"); + stage++; + break; + case 3: + npc("Stand back while I catches 'em, ya city slicker."); + stage++; + break; + case 4: + stage++; + close(); + ActivityManager.start(player, ChickenCatchScene.NAME, false, this); + break; + case 5: + close(); + player.face(scene.chicken); + scene.walk(scene.husband, 46, 9); + scene.walk(scene.chicken, 46, 9); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 3: + scene.walk(scene.husband, 53, 8); + scene.walk(scene.chicken, 52, 8); + break; + case 11: + scene.walk(scene.chicken, 40, 10); + scene.walk(scene.husband, 40, 10); + break; + case 22: + npc("Git 'ere, yer pesky bird!"); + stage++; + return true; + } + return false; + } + }); + break; + case 6: + stage++; + close(); + scene.husband.getAnimator().forceAnimation(new Animation(5377, Priority.HIGH)); + scene.walk(scene.husband, 51, 8); + scene.walk(scene.chicken, 45, 10); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 2: + scene.husband.getAnimator().forceAnimation(new Animation(5377, Priority.HIGH)); + break; + case 5: + scene.husband.getAnimator().forceAnimation(new Animation(5377, Priority.HIGH)); + break; + case 7: + scene.walk(scene.chicken, 47, 7); + break; + case 8: + scene.husband.animate(new Animation(5377, Priority.HIGH)); + break; + case 12: + scene.walk(scene.chicken, 47, 11); + break; + case 17: + npc("Where'd she go?"); + return true; + } + return false; + } + }); + break; + case 7: + close(); + stage++; + scene.allice.init(); + scene.cow.init(); + scene.cowKiller.init(); + scene.walk(scene.allice, 48, 8); + scene.walk(scene.cowKiller, 46, 9); + scene.walk(scene.cow, 46, 10); + scene.walk(scene.husband, 44, 10); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 2: + scene.walk(scene.chicken, 45, 9); + break; + case 8: + scene.allice.face(player); + scene.husband.face(player); + npc("Git orf my laaand!"); + return true; + } + return false; + } + }); + break; + case 8: + interpreter.sendDialogues(scene.allice, null, "You heard my husband: leave now!"); + stage++; + break; + case 9: + scene.allice.face(scene.cowKiller); + scene.cowKiller.face(scene.allice); + interpreter.sendDialogues(scene.cowKiller, null, "Always the same; I can never get these animals to", "myself."); + stage = 20; + break; + case 20: + scene.cowKiller.animate(Animation.create(2067)); + scene.cowKiller.faceTemporary(scene.cow, 1); + scene.cow.getImpactHandler().manualHit(scene.cowKiller, scene.cow.getSkills().getLifepoints(), HitsplatType.NORMAL); + interpreter.sendDialogues(scene.allice, null, "You killed Bessie!"); + stage++; + break; + case 21: + interpreter.sendDialogues(scene.cowKiller, null, "Buying cowhides and feathers - ahh, that chicken is", "next, feathers for me!"); + stage++; + break; + case 22: + close(); + stage++; + scene.allice.face(scene.husband); + scene.walk(scene.cowKiller, 46, 10); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 4: + scene.cowKiller.animate(Animation.create(832)); + break; + case 6: + scene.cowKiller.face(scene.chicken); + scene.chicken.sendChat("Woo woo!"); + break; + case 8: + scene.husband.face(scene.cowKiller); + scene.walk(scene.chicken, 45, 10); + break; + case 10: + scene.cowKiller.animate(Animation.create(2067)); + scene.chicken.getImpactHandler().manualHit(player, 0, HitsplatType.MISS); + scene.chicken.face(scene.husband); + break; + case 12: + interpreter.sendDialogues(5209, null, "Woo woo woo!"); + break; + } + return false; + } + + }); + break; + case 23: + close(); + stage++; + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + scene.husband.animate(Animation.create(5377)); + break; + case 3: + scene.chicken.clear(); + break; + case 6: + player("Well, that's one way to catch a chicken, I suppose."); + return true; + } + return false; + } + }); + break; + case 24: + quest.setStage(player, 20); + close(); + scene.stop(true); + break; + } + break; + } + return true; + } + + /** + * Buys an undead chicken(s). + * @param amount the amount. + */ + private void buy(int amount) { + final Item tokens = new Item(4278, amount * 10); + if (!player.getInventory().containsItem(tokens)) { + npc("I'm not a charity here, ya know. Bad enough all you", "cow-killing folks are a'slaughterin' me beasts. Come back", "when ya have enough tokens."); + return; + } + if (player.getInventory().freeSlots() < amount) { + player("Sorry, I don't have enough inventory space."); + return; + } + if (player.getInventory().remove(tokens)) { + player.getInventory().add(new Item(10487, amount), player); + npc("Great! I'm laying away me tokens for some killer cows.", "That'll learn them bones rustlers."); + } + } + + /** + * Handles the cutscene used to catch a chicken. + * @author Vexia + */ + public static final class ChickenCatchScene extends CutscenePlugin { + + /** + * The name of the cutscene. + */ + public static final String NAME = "am:chicken"; + + /** + * The npcs used. + */ + public NPC chicken, husband, cowKiller, cow, allice; + + /** + * Constructs a new {@code ChickenCatchScene} {@code Object}. + */ + public ChickenCatchScene() { + super(NAME); + } + + /** + * Constructs a new {@code ChickenCatchScene} {@code Object}. + * @param player the player. + */ + public ChickenCatchScene(Player player) { + super(NAME); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new ChickenCatchScene(p); + } + + @Override + public boolean start(final Player player, boolean login, Object... args) { + setNpcs(); + AliceHusbandDialogue dial = (AliceHusbandDialogue) args[0]; + dial.scene = this; + return super.start(player, login, args); + } + + @Override + public void open() { + super.open(); + player.getLocks().lock(); + Location loc = player.getLocation(); + int height = 480, xRot = -6, yRot = -28; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, loc.getX() + 2, loc.getY() + 3, height, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, loc.getX() + xRot, loc.getY() + yRot, height, 1, 100)); + player.faceTemporary(chicken, 1); + player.getLocks().lockMovement(GameWorld.getTicks() + 1000000); + player.getDialogueInterpreter().sendDialogues(5202, null, "Here, chicky chicky!"); + } + + @Override + public boolean leave(final Entity e, boolean logout) { + chicken.clear(); + husband.clear(); + cowKiller.clear(); + allice.clear(); + cow.clear(); + return super.leave(e, logout); + } + + /** + * Sets the npc instances. + */ + private void setNpcs() { + chicken = NPC.create(1692, base.transform(44, 10, 0)); + husband = NPC.create(5205, base.transform(42, 10, 0)); + cow = NPC.create(5211, base.transform(42, 10, 0)); + cowKiller = NPC.create(5210, base.transform(51, 8, 0)); + allice = NPC.create(5212, base.transform(47, 5, 0)); + allice.setWalks(false); + cow.setWalks(false); + cowKiller.setWalks(false); + chicken.setWalks(false); + husband.setWalks(false); + husband.init(); + chicken.init(); + chicken.faceLocation(husband.getLocation()); + walk(husband, chicken.getLocation().getX() - 1, chicken.getLocation().getY()); + } + + /** + * Walks an npc. + * @param npc the npc. + */ + public void walk(NPC npc, int x, int y) { + Location loc = base.transform(x, y, 0); + npc.getWalkingQueue().reset(); + Pathfinder.find(npc, loc).walk(npc); + } + + @Override + public Location getStartLocation() { + return base.transform(46, 13, 0); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + region = DynamicRegion.create(14391); + setRegionBase(); + registerRegion(region.getId()); + } + + } + + @Override + public int[] getIds() { + return new int[] { 5202 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.java b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.java new file mode 100644 index 000000000..ad0366c8a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AnimalMagnetism.java @@ -0,0 +1,271 @@ +package core.game.content.quest.members.animalmagnetism; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.PluginManager; + +import core.game.content.quest.members.animalmagnetism.AnimalMagnetismPlugin.ContainerHandler; +import core.game.content.quest.members.animalmagnetism.AnimalMagnetismPlugin.HammerMagnetPlugin; +import core.game.content.quest.members.animalmagnetism.AnimalMagnetismPlugin.ResearchNoteHandler; +import core.plugin.Initializable; +import core.game.content.quest.members.animalmagnetism.AnimalMagnetismPlugin.UndeadTreePlugin; + +/** + * Handles the animal magnetism quest. + * @author Vexia + */ +@Initializable +public final class AnimalMagnetism extends Quest { + + /** + * The name of this quest. + */ + public static String NAME = "Animal Magnetism"; + + /** + * The crone made amulet item. + */ + public static final Item CRONE_AMULET = new Item(10500); + + /** + * The selected iron item. + */ + public static final Item SELECTED_IRON = new Item(10488); + + /** + * The bar magnet item. + */ + public static final Item BAR_MAGNET = new Item(10489); + + /** + * The undead twigs item. + */ + public static final Item UNDEAD_TWIGS = new Item(10490); + + /** + * The blessed axe item. + */ + public static final Item BLESSED_AXE = new Item(10491); + + /** + * The research notes. + */ + public static final Item RESEARCH_NOTES = new Item(10492); + + /** + * The translated notes. + */ + public static final Item TRANSLATED_NOTES = new Item(10493); + + /** + * The pattern item. + */ + public static final Item PATTERN = new Item(10494); + + /** + * The container item. + */ + public static final Item CONTAINER = new Item(10495); + + /** + * The polished items. + */ + public static final Item POLISHED_BUTTONS = new Item(10496); + + /** + * The hard leather item. + */ + public static final Item HARD_LEATHER = new Item(1743); + + /** + * The avas attractor item. + */ + public static final Item AVAS_ATTRACTOR = new Item(10498); + + /** + * The avas accumulator item. + */ + public static final Item AVAS_ACCUMULATOR = new Item(10499); + + /** + * The requirements messages. + */ + private static final String[] REQS = new String[] { "I must have completed Restless Ghost.", "I must have completed Ernest the Chicken", "I must have completed Priest in Peril.", "Level 30 Ranged", "Level 18 Slayer", "Level 19 Crafting", "Level 35 Woodcutting" }; + + /** + * The requirements. + */ + private boolean[] requirements = new boolean[7]; + + /** + * Constructs a new {@code AnimalMagnetism} {@code Object}. + */ + public AnimalMagnetism() { + super("Animal Magnetism", 33, 32, 1); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugin(new AvaDialogue()); + PluginManager.definePlugin(new AliceDialogue()); + PluginManager.definePlugin(new WitchDialogue()); + PluginManager.definePlugin(new ContainerHandler()); + PluginManager.definePlugin(new UndeadTreePlugin()); + PluginManager.definePlugin(new AvasDevicePlugin()); + PluginManager.definePlugin(new HammerMagnetPlugin()); + PluginManager.definePlugin(new ResearchNoteHandler()); + PluginManager.definePlugin(new AliceHusbandDialogue()); + PluginManager.definePlugin(new AnimalMagnetismPlugin()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + line(player, "I can start this quest by talking to", 4+ 7); + line(player, "Ava who lives in Draynor Manor.", 5+ 7); + line(player, "Minimum requirements:", 7+ 7); + drawRequirements(player); + break; + case 10: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...", 4+ 7); + break; + case 11: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.", 11); + break; + case 12: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

The ghost farmer's wife needs to know bank information

that only the farmer can supply.", 11); + break; + case 13: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

The ghost farmer won't tell me the information his wife is

after. Perhaps I should talk to her again.", 11); + break; + case 14: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

The ghost farmer's wife still needs to know bank

information that only the farmer can supply.", 11); + break; + case 15: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I still need to find a way to allow the undead farmer and his

wife to communicate with each other.", 11); + break; + case 16: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.", 11); + break; + case 17: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.", 11); + break; + case 18: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.", 11); + break; + case 19: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.", 11); + break; + case 20: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.", 11); + break; + case 25: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward.", 11); + break; + case 26: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward

I need to deliver 5 iron bars to the Witch in Draynor Manor.

She will select one most suitable for both magnetising and

mystical use.", 11); + break; + case 27: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward

I need to deliver 5 iron bars to the Witch in Draynor Manor.

She will select one most suitable for both magnetising and

mystical use.

I need to make a magnet by hammering the selected iron

bar while facing north in Rimmington mines. I then need

to pass this magnet to Ava.", 11); + break; + case 28: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward

I need to deliver 5 iron bars to the Witch in Draynor Manor.

She will select one most suitable for both magnetising and

mystical use.

I need to make a magnet by hammering the selected iron

bar while facing north in Rimmington mines. I then need

to pass this magnet to Ava.

I need to chop some wood from the undead trees near

Draynor Manor. Ava can use this wood as a source of

unending arrow shafts in my reward. She suggested that I

use a Woodcutting axe made of nothing less powerful than

mithril.", 11); + break; + case 29: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward

I need to deliver 5 iron bars to the Witch in Draynor Manor.

She will select one most suitable for both magnetising and

mystical use.

I need to make a magnet by hammering the selected iron

bar while facing north in Rimmington mines. I then need

to pass this magnet to Ava.

I need to find some way of chopping the undead trees

near Draynor Manor so that Ava can use this wood as a

source of unending arrow shafts.

Perhaps Ava could give me some advice...", 11); + break; + case 30: + case 31: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward

I need to deliver 5 iron bars to the Witch in Draynor Manor.

She will select one most suitable for both magnetising and

mystical use.

I need to make a magnet by hammering the selected iron

bar while facing north in Rimmington mines. I then need

to pass this magnet to Ava.

I need to find some way of chopping the undead trees

near Draynor Manor so that Ava can use this wood as a

source of unending arrow shafts.

Ava suspects that Turael, the Slayer Master in Burthorpe,

might be able to help.

I need to collect a holy symbol of Saradomin and a mithril

axe. Turael, the Burthorpe Slayer, can use these to

construct a new axe for my undead tree cutting.", 11); + break; + case 32: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward

I need to deliver 5 iron bars to the Witch in Draynor Manor.

She will select one most suitable for both magnetising and

mystical use.

I need to make a magnet by hammering the selected iron

bar while facing north in Rimmington mines. I then need

to pass this magnet to Ava.

I need to find some way of chopping the undead trees

near Draynor Manor so that Ava can use this wood as a

source of unending arrow shafts.

Ava suspects that Turael, the Slayer Master in Burthorpe,

might be able to help.

I need to collect a holy symbol of Saradomin and a mithril

axe. Turael, the Burthorpe Slayer, can use these to

construct a new axe for my undead tree cutting.

I need to chop some undead wood with the silver-edged

mithril axe. Then Ava will want the wood for constructing

my reward.

I should ask Ava for the garbled research notes that she

cannot translate. When translated, these notes will tell

her how to combine the undead wood, undead chicken and

magnet into some bizarre device.", 11); + break; + case 33: + if (!player.hasItem(TRANSLATED_NOTES)) { + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward

I need to deliver 5 iron bars to the Witch in Draynor Manor.

She will select one most suitable for both magnetising and

mystical use.

I need to make a magnet by hammering the selected iron

bar while facing north in Rimmington mines. I then need

to pass this magnet to Ava.

I need to find some way of chopping the undead trees

near Draynor Manor so that Ava can use this wood as a

source of unending arrow shafts.

Ava suspects that Turael, the Slayer Master in Burthorpe,

might be able to help.

I need to collect a holy symbol of Saradomin and a mithril

axe. Turael, the Burthorpe Slayer, can use these to

construct a new axe for my undead tree cutting.

I need to chop some undead wood with the silver-edged

mithril axe. Then Ava will want the wood for constructing

my reward.

I should ask Ava for the garbled research notes that she

cannot translate. When translated, these notes will tell

her how to combine the undead wood, undead chicken and

magnet into some bizarre device.

The research notes must be translated. I should try to

decipher them even though they look like total gibberish.

to me.", 11); + } else { + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward

I need to deliver 5 iron bars to the Witch in Draynor Manor.

She will select one most suitable for both magnetising and

mystical use.

I need to make a magnet by hammering the selected iron

bar while facing north in Rimmington mines. I then need

to pass this magnet to Ava.

I need to find some way of chopping the undead trees

near Draynor Manor so that Ava can use this wood as a

source of unending arrow shafts.

Ava suspects that Turael, the Slayer Master in Burthorpe,

might be able to help.

I need to collect a holy symbol of Saradomin and a mithril

axe. Turael, the Burthorpe Slayer, can use these to

construct a new axe for my undead tree cutting.

I need to chop some undead wood with the silver-edged

mithril axe. Then Ava will want the wood for constructing

my reward.

I should ask Ava for the garbled research notes that she

cannot translate. When translated, these notes will tell

her how to combine the undead wood, undead chicken and

magnet into some bizarre device.

The research notes must be translated. I should try to

decipher them even though they look like total gibberish.

to me.

The notes look less confusing now. Ava will want to see

these translated research notes.", 11); + } + break; + case 34: + line(player, "Ava has asked me for undead chickens. One will go toward

making her bed more comfortable, the other will be used in

some unexplained reward for me.

I need to find someone who will supply undead chickens to

me. Perhaps the farm near Port Phasmatys sells them...

The ghost farmer wants me to talk to his wife for him. I

need to do this before he will sell chickens.

I should talk to the crone west of the undead farm and ask

about ghostspeak amulets. Perhaps she can enable the

ghost farmer to talk to his wife directly.

I need to talk the crone while I have a ghostspeak

amulet so that she can create a new amulet specifically

for the ghost farmer.

I should give the ghost farmer a crone-made amulet so

that he can talk directly to his wife.

The farmer seems friendlier now; I need to talk to him

about the undead chickens.

The farmer has agreed to sell chickens; now he needs to

catch one for me.

The ghost farmer caught some chickens; now I need to buy

2 from him and deliver them to Ava.

I need to talk to the Witch in Draynor Manor about

magically attuned magnets. Apparently, the undead

chicken will be using magnets in my reward

I need to deliver 5 iron bars to the Witch in Draynor Manor.

She will select one most suitable for both magnetising and

mystical use.

I need to make a magnet by hammering the selected iron

bar while facing north in Rimmington mines. I then need

to pass this magnet to Ava.

I need to find some way of chopping the undead trees

near Draynor Manor so that Ava can use this wood as a

source of unending arrow shafts.

Ava suspects that Turael, the Slayer Master in Burthorpe,

might be able to help.

I need to collect a holy symbol of Saradomin and a mithril

axe. Turael, the Burthorpe Slayer, can use these to

construct a new axe for my undead tree cutting.

I need to chop some undead wood with the silver-edged

mithril axe. Then Ava will want the wood for constructing

my reward.

I should ask Ava for the garbled research notes that she

cannot translate. When translated, these notes will tell

her how to combine the undead wood, undead chicken and

magnet into some bizarre device.

The research notes must be translated. I should try to

decipher them even though they look like total gibberish.

to me.

The notes look less confusing now. Ava will want to see

these translated research notes.

Almost finished! I must combine the pattern which Ava

gave to me with some polished buttons and a bit of hard

leather. Ava tells me that the H.A.M hideout is a good

place to obtain buttons.", 11); + // Almost finished! I must combine the pattern which + // Ava

gave to me with some polished buttons and a bit of + // hard

leather. Ava tells me that the H.A.M hideout is a + // good

place to obtain buttons. + break; + case 100: + line(player, "Ava has asked me for undead chickens. One will gotowards making her bed more comfortable, the other willbe used in some unexplained reward for me.I need to find someone who will supply undead chickens tome. Perhaps the farm near Port Phasmatys sells them...The ghost farmer wants me to talk to his wife for him. Ineed to do this before he will sell the chickens.I should talk to the crone west of the undead farm and askabout ghostspeak amulets. Perhaps she can enable theghost farmer to talk to his wife directly.I need to talk to the crone while I have a ghostspeakamulet so that she can create a new amulet specificallyfor the ghost farmer.I should give the ghost farmer a crone-made amulet sothat he can talk directly to his wife.The farmer seems friendlier now; I need to talk to himabout the undead chickens.The farmer has agreed to sell chickens; now he needs tocatch one for me.The ghost farmer caught some chickens;now I need to buy2 and deliver them to Ava.I need to talk to the Witch in Draynor Manor aboutmagically attuned magnets. Apparently, the undeadchicken will be using magnets in my reward.I need to deliver 5 iron bars to the Witch in Draynor Manor.She will select one most suitable for both magnetising andmystical use.I need to make a magnet by hammering the selected ironbar while facing north in Rimmington mines. I then needto pass this magnet to Ava.I need to find some way of chopping the undead treesnear Draynor manor so that Ava can use this wood as asource of unending arrow shafts.Ava suspects that Turael, the Slayer Master in Burthorpe,might be able to help.I need to collect a holy symbol of Saradomin and a mithrilaxe. Turael, the Burthorpe Slayer, can use these toconstruct a new axe for my undead tree cutting.I need to chop some undead wood with the silver edgedmithril axe. Then Ava will want the wood for constructingmy reward.I should ask Ava for the garbled research notes that shecannot translate. When translated, these notes will tellher how to combine the undead wood, undead chicken andmagnet into some bizarre device.The research notes must be translated. I should try todecipher them even though they look like total gibberishto me.The notes look less confusing now. Ava will want to see", 11); + line(player, "these translated research notes.Almost finished!I must combine the pattern which Avagave to me with some polished buttons and a bit of hardleather.Ava wants the completed container. She can then combineit with the undead chicken, undead wood and magnet.QUEST COMPLETE!Ava's reward for me is an arrow attracting and creatingbackpack.The method is this: the undead chicken can attract lost,stray arrowheads with a magnet, add wood from theundead twigs and then finish the arrows using its ownfeathers. This will give me an unending source of arrows.The cunning bird will also attract some of the arrows which Ihave fired, preventing these arrows from falling upon theground.If I lost my device, I can talk to Ava for a new one,although it will cost me around 1000 gold.Once I achieve a Ranger level of 50 or more, I can upgradethe attractor if I give Ava 75 steel arrows.", 63); + break; + } + } + + /** + * Draws the requirements. + */ + private void drawRequirements(Player player) { + hasRequirements(player); + int line = 8 + 7; + for (int i = 0; i < requirements.length; i++) { + line(player, (requirements[i] ? "" : "") + REQS[i], line++); + } + } + + @Override + public boolean hasRequirements(Player player) { + requirements[0] = player.getQuestRepository().isComplete("The Restless Ghost"); + requirements[1] = player.getQuestRepository().isComplete("Ernest the Chicken"); + requirements[2] = player.getQuestRepository().isComplete("Priest in Peril"); + requirements[3] = player.getSkills().getStaticLevel(Skills.RANGE) >= 30; + requirements[4] = player.getSkills().getStaticLevel(Skills.SLAYER) >= 18; + requirements[5] = player.getSkills().getStaticLevel(Skills.CRAFTING) >= 19; + requirements[6] = player.getSkills().getStaticLevel(Skills.WOODCUTTING) >= 35; + for (boolean bool : requirements) { + if (!bool) { + return false; + } + } + return true; + } + + @Override + public void finish(Player player) { + super.finish(player); + Item item = player.getSkills().getStaticLevel(Skills.RANGE) >= 50 ? AVAS_ACCUMULATOR : AVAS_ATTRACTOR; + player.getPacketDispatch().sendString("1000 XP in each of Crafting,", 277, 8 + 2); + player.getPacketDispatch().sendString("Fletching and Slayer", 277, 9 +2); + player.getPacketDispatch().sendString("2500 Woodcutting XP", 277, 10 + 2); + player.getPacketDispatch().sendString("1 Quest Point", 277, 11 + 2); + player.getPacketDispatch().sendString("Ava's device", 277, 12 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(item.getId(), 235, 277, 3 + 2); + player.getSkills().addExperience(Skills.CRAFTING, 1000); + player.getSkills().addExperience(Skills.SLAYER, 1000); + player.getSkills().addExperience(Skills.FLETCHING, 1000); + player.getSkills().addExperience(Skills.WOODCUTTING, 2500); + player.getInventory().add(item); + player.getQuestRepository().syncronizeTab(player); + } + + @Override + public int[] getConfig(Player player, int stage) { + if (getStage(player) >= 28 && getStage(player) != 100) { + return new int[] { 939, 150 }; + } + int val = stage < 100 && stage > 0 ? 10 : stage >= 100 ? 240 : 0; + return new int[] { 939, val }; + // This config affects object bed in ava's room + // multiples of 10 + // 0 - broken + // 170 - still broken + // 180 - bed is made + // 240 - quest complete + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.java new file mode 100644 index 000000000..3c3591473 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AnimalMagnetismPlugin.java @@ -0,0 +1,464 @@ +package core.game.content.quest.members.animalmagnetism; + +import java.util.HashMap; +import java.util.Map; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the animal magnetism plugin. + * @author Vexia + */ +@Initializable +public final class AnimalMagnetismPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(688).getHandlers().put("option:polish", this); + ItemDefinition.forId(4251).getHandlers().put("option:empty", this); + ItemDefinition.forId(4251).getHandlers().put("option:drop", this); + ItemDefinition.forId(4252).getHandlers().put("option:drop", this); + NPCDefinition.forId(5198).getHandlers().put("option:trade", this); + ObjectDefinition.forId(5167).getHandlers().put("option:push", this); + AnimalMagnetism.RESEARCH_NOTES.getDefinition().getHandlers().put("option:translate", this); + ItemDefinition.forId(AnimalMagnetism.CRONE_AMULET.getId()).getHandlers().put("option:wear", this); + ItemDefinition.forId(AnimalMagnetism.CRONE_AMULET.getId()).getHandlers().put("option:equip", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 5167: + player.teleport(new Location(3577, 9927)); + break; + case 5198: + case 5199: + if (player.getQuestRepository().getQuest(AnimalMagnetism.NAME).getStage(player) == 0) { + player.getDialogueInterpreter().sendDialogues((NPC) node, null, "Hello there, I'm busy with my research. Come back in a", "bit, could you?"); + break; + } + node.asNpc().openShop(player); + break; + case 10500: + player.getPacketDispatch().sendMessage("Perhaps you should wait a few hundred years or so?"); + break; + case 4251: + case 4252: + if (option.equalsIgnoreCase("empty")) { + handleEctophial(player, (Item) node); + } else { + player.getInventory().remove(node.asItem()); + player.sendMessage("The ectophial disappears as it hits the ground..."); + } + break; + case 10492: + open(player); + break; + case 688: + player.lock(1); + if (player.getSkills().getLevel(Skills.CRAFTING) < 3) { + player.getPacketDispatch().sendMessage("You need a Crafting level of at least 3 in order to do that."); + return true; + } + player.getSkills().addExperience(Skills.CRAFTING, 5, true); + player.getInventory().replace(AnimalMagnetism.POLISHED_BUTTONS, ((Item) node).getSlot()); + break; + } + return true; + } + + /** + * Clears the note cache. + * @param player the player. + */ + private void clearCache(Player player) { + player.removeAttribute("note-cache"); + player.removeAttribute("note-disabled"); + } + + /** + * Opens the interface. + * @param player the player. + */ + public void open(Player player) { + clearCache(player); + player.getInterfaceManager().open(new Component(480)); + player.getPacketDispatch().sendMessage("You fiddle with the notes."); + } + + /** + * Handles the ectophial emptying. + * @param player the player. + * @param item the item. + */ + private void handleEctophial(final Player player, final Item item) { + player.getInventory().replace(new Item(4252), item.getSlot()); + player.sendMessage("...and the world changes around you.", 4); + player.getTeleporter().send(Location.create(3658, 3517, 0), TeleportType.ECTOPHIAL); + player.sendMessage("You empty the ectoplasm onto the ground around your feet..."); + player.getPulseManager().run(new Pulse(9, player) { + @Override + public boolean pulse() { + player.faceLocation(new Location(3659, 3519, 0)); + if (player.getInventory().containsItem(new Item(4252))) { + player.animate(Animation.create(1652)); + player.getInventory().remove(new Item(4252)); + player.getInventory().add(item); + player.sendMessage("Your ectophial vial automatically refills."); + } + return true; + } + }); + } + + /** + * Handles the hammering of a magnet. + * @author Vexia + */ + public static final class HammerMagnetPlugin extends UseWithHandler { + + /** + * The animation used when hammering a magnet. + */ + private static final Animation ANIMATION = new Animation(5365); + + /** + * Constructs a new {@code HammerMagnetPlugin} {@code Object}. + */ + public HammerMagnetPlugin() { + super(2347); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(new MapZone("rimmington mine", true) { + @Override + public void configure() { + register(new ZoneBorders(2970, 3230, 2984, 3249)); + } + }); + addHandler(AnimalMagnetism.SELECTED_IRON.getId(), ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.animate(ANIMATION); + player.lock(ANIMATION.getDefinition().getDurationTicks()); + GameWorld.getPulser().submit(new Pulse(ANIMATION.getDefinition().getDurationTicks(), player) { + @Override + public boolean pulse() { + if (!player.getZoneMonitor().isInZone("rimmington mine")) { + player.getPacketDispatch().sendMessage("You aren't in the right area for this to work."); + } else { + if (player.getDirection() != Direction.NORTH) { + player.getPacketDispatch().sendMessage("You think that facing North might work better."); + } else { + player.getInventory().replace(AnimalMagnetism.BAR_MAGNET, event.getUsedItem().getSlot()); + player.getPacketDispatch().sendMessage("You hammer the iron bar and create a magnet."); + } + } + return true; + } + }); + return true; + } + + } + + /** + * Handles the axe on a undead tree. + * @author Vexia + */ + public static final class UndeadTreePlugin extends UseWithHandler { + + /** + * The axe ids. + */ + private final int[] IDS = new int[] { 1355, 1357, 1359, 6739 }; + + /** + * Constructs a new {@code UndeadTreePlugin} {@code Object}. + */ + public UndeadTreePlugin() { + super(1355, 1357, 1359, 6739); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(5208).getHandlers().put("option:chop", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest(AnimalMagnetism.NAME); + if (quest.getStage(player) <= 28) { + SkillingTool tool = SkillingTool.getHatchet(player); + if (tool == null || tool.ordinal() < 4) { + player.getPacketDispatch().sendMessage("You don't have the required axe in order to do that."); + return true; + } + final Animation animation = getAnimation(tool.getId()); + player.animate(animation, 2); + if (quest.getStage(player) == 28) { + quest.setStage(player, 29); + } + player.sendMessage("The axe bounces off the undead wood." + (quest.getStage(player) == 28 || quest.getStage(player) == 29 ? " I should report this to Ava." : "")); + return true; + } + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("Your inventory is full right now."); + return true; + } + if (!player.getInventory().containsItem(AnimalMagnetism.BLESSED_AXE) && !player.getEquipment().containsItem(AnimalMagnetism.BLESSED_AXE)) { + player.getPacketDispatch().sendMessage("You need a blessed axe in order to do that."); + return true; + } + Animation animation = getAnimation(1355); + player.lock(animation.getDefinition().getDurationTicks()); + if (RandomFunction.random(10) < 3) { + player.sendMessage("You almost remove a suitable twig, but you don't quite manage it."); + } else { + player.getInventory().add(AnimalMagnetism.UNDEAD_TWIGS); + player.sendMessage("You cut some undead twigs."); + } + player.animate(animation, 2); + return true; + } + + }); + addHandler(5208, NPC_TYPE, this); + addHandler(152, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Animation animation = getAnimation(event.getUsedItem().getId()); + final Quest quest = player.getQuestRepository().getQuest(AnimalMagnetism.NAME); + player.animate(animation, 2); + if (quest.getStage(player) == 28) { + quest.setStage(player, 29); + } + player.sendMessage("The axe bounces off the undead wood." + (quest.getStage(player) == 28 || quest.getStage(player) == 29 ? " I should report this to Ava." : "")); + return true; + } + + /** + * Gets the animation id. + * @param itemId the item id. + * @return {@code Animation} the animation. + */ + public Animation getAnimation(int itemId) { + for (int i = 0; i < IDS.length; i++) { + if (IDS[i] == itemId) { + return new Animation(5366 + i, Priority.HIGH); + } + } + return null; + } + } + + /** + * Handles the research note handler. + * @author Vexia + * @version 1.0 + */ + public static final class ResearchNoteHandler extends ComponentPlugin { + + /** + * The button ids. + */ + private final int[][] BUTTONS = new int[][] { { 40, 39, 6 }, { 42, 41, 3 }, { 44, 43, 7 }, { 46, 45, 8}, { 48, 47, 4 }, { 50, 49, 9 }, { 52, 51, 10 }, { 54, 53, 11 }, { 56, 55, 5 } }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(480).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (player.getAttribute("note-disabled", false)) { + return true; + } + final Object[] data = getIndex(button); + final boolean toggled = (boolean) data[1]; + final int[] configs = getConfigs((int) data[0]); + final Quest quest = player.getQuestRepository().getQuest(AnimalMagnetism.NAME); + player.getPacketDispatch().sendInterfaceConfig(480, configs[0], !toggled); + player.getPacketDispatch().sendInterfaceConfig(480, (int) data[2], toggled); + if (quest.getStage(player) == 33) { + setNoteCache(player, (int) data[0], !toggled); + if (isTranslated(player)) { + if (player.getInventory().remove(AnimalMagnetism.RESEARCH_NOTES)) { + player.setAttribute("note-disabled", true); + player.getInventory().add(AnimalMagnetism.TRANSLATED_NOTES); + player.getPacketDispatch().sendMessage("It suddenly all makes sense."); + } + } + } + return true; + } + + /** + * Sets the note in the cache. + * @param player the player. + * @param index the index. + * @param toggled if toggled. + */ + private void setNoteCache(Player player, int index, boolean toggled) { + Map cache = getNoteCache(player); + cache.put(index, toggled); + player.setAttribute("note-cache", cache); + } + + /** + * Checks if the notes are translated. + * @param player the player. + * @return {@code True} if so. + */ + private boolean isTranslated(Player player) { + Map cache = getNoteCache(player); + int[] correct = new int[] { 0, 2, 3, 5, 6, 7 }; + int[] wrong = new int[] { 1, 4, 8 }; + for (int i : correct) { + if (cache.get(i).booleanValue()) { + return false; + } + } + for (int i : wrong) { + if (!cache.get(i).booleanValue()) { + return false; + } + } + return true; + } + + /** + * Gets the note cache. + * @param player the player. + * @return the cache of toggled buttons. + */ + private Map getNoteCache(Player player) { + Map cache = player.getAttribute("note-cache", null); + if (cache == null) { + cache = new HashMap(); + for (int i = 0; i < BUTTONS.length; i++) { + cache.put(i, true); + } + } + return cache; + } + + + /** + * Gets the hidden config ids. + * @param index the index. + * @return the configs. + */ + private int[] getConfigs(int index) { + return new int[] { 21 + index, 0 }; + } + + /** + * Gets the index by the button id. + * @param buttonId the buttonId. + * @return the object data. + */ + private Object[] getIndex(int buttonId) { + for (int i = 0; i < BUTTONS.length; i++) { + for (int k = 0; k < BUTTONS[i].length - 1; k++) { + if (buttonId == BUTTONS[i][k]) { + return new Object[] { i, k == 0, BUTTONS[i][2] }; + } + } + } + return new Object[] { 0, true }; + } + } + + /** + * Handles the creating of a container. + * @author Vexia + */ + public static final class ContainerHandler extends UseWithHandler { + + /** + * Constructs a new {@code ContainerHandler} {@code Object}. + */ + public ContainerHandler() { + super(10496, 1743); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(AnimalMagnetism.PATTERN.getId(), ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (!player.getInventory().containsItem(AnimalMagnetism.HARD_LEATHER)) { + player.sendMessage("You need hard leather as well as these 2 items."); + return true; + } + if (!player.getInventory().containsItem(AnimalMagnetism.POLISHED_BUTTONS)) { + player.sendMessage("You need polished buttons as well as these 2 items."); + return true; + } + if (player.getInventory().remove(AnimalMagnetism.HARD_LEATHER, AnimalMagnetism.POLISHED_BUTTONS, AnimalMagnetism.PATTERN)) { + player.getInventory().add(AnimalMagnetism.CONTAINER); + } + return true; + } + + } + + @Override + public boolean isWalk(Player player, Node node) { + return !(node instanceof Item); + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AvaDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AvaDialogue.java new file mode 100644 index 000000000..19fc32890 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AvaDialogue.java @@ -0,0 +1,766 @@ +package core.game.content.quest.members.animalmagnetism; + +import java.util.ArrayList; +import java.util.List; + +import core.game.container.Container; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.world.GameWorld; + +/** + * Handles the ava npc dialogue. + * @author Vexia + */ +public final class AvaDialogue extends DialoguePlugin { + + /** + * The undead chicken items. + */ + private static final Item UNDEAD_CHICKENS = new Item(10487, 2); + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@code AvaDialogue} {@code Object}. + */ + public AvaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AvaDialogue} {@code Object}. + * @param player the player. + */ + public AvaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AvaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(AnimalMagnetism.NAME); + if (!quest.hasRequirements(player)) { + player.getPacketDispatch().sendMessage("She doesn't seem interested in talking to you."); + return false; + } + switch (quest.getStage(player)) { + case 0: + npc("Hello there and welcome to my humble abode. It's sadly", "rather more humble than I'd like, to be honest, although", "perhaps you can help with that?"); + break; + case 10: + npc("Do you need a reminder what you are supposed to do?", "I know you must have shiny beads distracting you, but", "it is an important job you are doing for me."); + break; + case 20: + npc("My spiritometric devices show that you have been in", "close contact with ghostly animals. Are we closer to", "success?"); + break; + case 25: + npc("Go and talk to the Witch next door. She'd talk the hind", "legs off a donkey but she can select the iron with which", "it is suitable for the chicken to interact."); + break; + case 27: + if (player.getInventory().containsItem(AnimalMagnetism.BAR_MAGNET)) { + player("I've manufactured the magnet; here it is."); + stage = 4; + } else { + player("I've talked to the Witch and now I've given her some", "iron bars."); + } + break; + case 28: + npc("So, what terrible hitch have you encountered now?"); + break; + case 29: + case 30: + player("Well, I tried to hack the trees with my axe, but it just", "bounced off the trunk! It did all seem all-too-convenient", "to work on the first try."); + break; + case 31: + if (player.getInventory().containsItem(AnimalMagnetism.UNDEAD_TWIGS)) { + player("I have that undead wood at last. Well, twigs anyway."); + stage++; + } else { + npc("Come back when you have undead wood..."); + } + break; + case 32: + player("I'd like to look at those research notes now, unless you", "have translated them without me?"); + break; + case 33: + if (player.getInventory().containsItem(AnimalMagnetism.TRANSLATED_NOTES)) { + player("I've translated the notes. See? I'm not just a thuggish", "moron like you seem to think."); + stage = 10; + break; + } + if (player.hasItem(AnimalMagnetism.RESEARCH_NOTES)) { + player("I have the notes but haven't translated them yet. Any", "hints?"); + } else { + player("I seem to have lost the research notes."); + stage = 4; + } + break; + case 34: + if (player.getInventory().containsItem(AnimalMagnetism.CONTAINER)) { + npc("Wow, great, now the arrow manufacturer is ready for", "use...there you are! Talk to me if you need more", "information later."); + stage = 20; + break; + } + if (player.hasItem(AnimalMagnetism.PATTERN)) { + player("So what do I do with this pattern again?"); + } else { + player("My pattern seems to have vanished from my pack...not", "my fault, of course."); + stage = 10; + } + break; + case 100: + npc("I'm busy with my newest research, so can't gossip too", "much. Are you after an upgrade to your device, or a", "new device, or some information, of would you like to", "see my goods for sale?"); + break; + default: + npc("How's the quest going?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 0: + switch (stage) { + case 0: + player("I would be happy to make your home a better place."); + stage++; + break; + case 1: + npc("Yay, I didn't even have to talk about a reward; you're", "more gullible than most adventurers, that's for sure."); + stage++; + break; + case 2: + npc("Don't worry, though; I just need you to help fix this", "vile old bed for me. Then I'll find a suitable reward for", "you."); + stage++; + break; + case 3: + player("Great, will I be able to take a nap in it?"); + stage++; + break; + case 4: + npc("Don't be silly; everyone knows that true warriors don't", "ever sleep...or perform many other bodily functions, for", "that matter. I'll come up with something, though."); + stage++; + break; + case 5: + player("I'm not convinced by just a vague something; can you", "be a slight bit more inspiring in your offer?"); + stage++; + break; + case 6: + npc("I'll use one for my bed, then see what I can make", "from the other in the way of a reward. I have some", "ideas involving infinite feathers."); + stage++; + break; + case 7: + player("Very well then, I shall await my mystery prize with", "bated breath."); + stage++; + break; + case 8: + quest.start(player); + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + player("Yes, please."); + stage++; + break; + case 1: + npc("...And people say we scientists are absent minded..."); + stage++; + break; + case 2: + npc("You need to fetch 2 undead chickens for me to use in", "my redecoration. It's not rocket science."); + stage++; + break; + case 3: + player("Rocket?"); + stage++; + break; + case 4: + npc("If they existed, they would be like arrows but much,", "much bigger. Considering the mess you rangers make", "with small bits of sticks, we scientists have decided they", "don't exist. Now get chicken hunting."); + stage++; + break; + case 5: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + if (player.getInventory().containsItem(UNDEAD_CHICKENS)) { + player("Here they are."); + stage = 2; + } else { + player("I'm still looking for undead chickens..."); + stage = 1; + } + break; + case 1: + end(); + break; + case 2: + npc("Amazing! Success! I can look forward to some good", "nights' sleep after all."); + stage++; + break; + case 3: + player("Can I ask exactly how an undead chicken will help you", "sleep?"); + stage++; + break; + case 4: + npc("Well, I need the feathers to make my bed more", "comfortable. A comfortable bed will help me sleep.", "Obvious, really."); + stage++; + break; + case 5: + player("Obvious, yes, but why on " + GameWorld.getSettings().getName() + " would you need", "an undead chicken when there are perfectly good live", "chickens just down the road?"); + stage++; + break; + case 6: + npc("Well, for a start, undead feathers are much cleaner", "than living ones; no dust mites or anything. Secondly, I", "always think of Ernest when I see a chicken, so my", "nerves can't take killing them."); + stage++; + break; + case 7: + player("Then why do I need a chicken for my reward; we", "already established that I don't use a bed?"); + stage++; + break; + case 8: + npc("Seeing as how you ranger types use so many feathers", "in your arrows, I was thinking I could harness an", "undead chicken to make an unending supply of arrow", "flights for you."); + stage++; + break; + case 9: + player("Beats chicken slaying or hanging around in fishing", "shops, I suppose. So, what next?"); + stage++; + break; + case 10: + npc("We'll need a magnet next, one with purely natural", "fields and made from a carefully selected iron bar. A", "firm impact when the iron is parallel to " + GameWorld.getSettings().getName() + "'s", "field will stabilise this field in the rod."); + stage++; + break; + case 11: + npc("Go and talk to the Witch next door."); + stage++; + break; + case 12: + if (player.getInventory().remove(UNDEAD_CHICKENS)) { + quest.setStage(player, 25); + end(); + } + break; + } + break; + case 25: + switch (stage) { + case 0: + npc("Despite my extensive studies, her years of experience", "make her better at instinctive magico-mystical", "interaction. Oh well, at least I'm cleverer, prettier and", "will have a better bed."); + stage++; + break; + case 1: + player("Okay, okay, you're great. Yes, I'll go and talk to her", "when you've finished praising yourself."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 27: + switch (stage) { + case 0: + npc("I'm thrilled for you. What about my magnet?"); + stage++; + break; + case 1: + player("The process is subject to some unexpected delays."); + stage++; + break; + case 2: + npc("I can see now why Frenekstrain prefers to work with", "dead folk. It can't be more frustrating than working", "with you."); + stage++; + break; + case 3: + end(); + break; + case 4: + npc("Great stuff! with the Witch's influence within the", "magnet, the undead chicken can use this, I'm sure."); + stage++; + break; + case 5: + npc("The plan is that the chicken will operate the magnet to", "attract bits of iron and steel, maybe even your own", "recently fired arrows. There are plenty of totally lost", "arrowheads lying about in the Fields of " + GameWorld.getSettings().getName() + ", I"); + stage++; + break; + case 6: + npc("bet."); + stage++; + break; + case 7: + npc("In addition, arrows which you fire should be able to be", "attracted back to your quiver by cunning avian."); + stage++; + break; + case 8: + player("I begin to understand your plan. We've covered", "feathers and arrowheads now; what next?"); + stage++; + break; + case 9: + npc("We need a source of wood, but one which is spiritually", "active and can regenerate itself. That will save you", "some axework in the future."); + stage++; + break; + case 10: + npc("Try using a woodcutting axe on the pesky trees in the", "garden here, that ones that attack rather than the really", "dead ones. They are probably just the sort of thing we", "could use."); + stage++; + break; + case 11: + player("They will try to kill me, though, and I can't fight back!"); + stage++; + break; + case 12: + npc("Now you know how those poor guards feel when you", "hide behind mushrooms and fences and attack them", "from afar! Anyway, I reckon you'll need to try a", "mithril or better axe on the trees. At least the trees axe"); + stage++; + break; + case 13: + npc("pretty close."); + stage++; + break; + case 14: + if (player.getInventory().remove(AnimalMagnetism.BAR_MAGNET)) { + player.getConfigManager().set(939, 150, true); + quest.setStage(player, 28); + end(); + } + break; + } + break; + case 28: + switch (stage) { + case 0: + player("Nothing really; I just decided to talk to you in case", "you have any great advice for me."); + stage++; + break; + case 1: + npc("Nope, sorry."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 29: + case 30: + switch (stage) { + case 0: + npc("Fortunately for you, I've done some research and it", "seems to suggest that there are two choices open to", "you."); + stage++; + break; + case 1: + player("Tell me the worst."); + stage++; + break; + case 2: + npc("The first is more interesting. We cut off your arms,", "have them reanimated as undead, reattach them and", "then you should be able to cut the trees normally."); + stage++; + break; + case 3: + npc("Of course, you won't be able to pick your nose any", "more, so I suppose you'll want to try the second option."); + stage++; + break; + case 4: + player("I'm not exactly addicted to picking my nose, but I do", "think I'll pass on that method."); + stage++; + break; + case 5: + npc("Well, in that case, I think it may have something to do", "with Slayer abilities. After all, I did see Turael poking", "around the trees while I was moving in."); + stage++; + break; + case 6: + npc("As he's not known for his random touristic activities,", "you should try chatting with this Turael. He's the", "Slayer Master near Burthorpe."); + stage++; + break; + case 7: + player("Oh dear, I hope he doesn't want me to buy one of his", "ridiculous fashion accessories. Those earmuffs he sells", "make heroic adventurers into a laughing stock."); + stage++; + break; + case 8: + if (quest.getStage(player) == 29) { + quest.setStage(player, 30); + } + end(); + break; + } + break; + case 31: + switch (stage) { + case 0: + end(); + break; + case 1: + npc("You certainly took your time."); + stage++; + break; + case 2: + player("I'd say they didn't grow on trees, but I guess you'd", "just be sarcastic about my sense of humour."); + stage++; + break; + case 3: + npc("Quite. Now that we have all the ingredients for infinite", "arrows, we just need a container in which we can keep", "the components in the correct mutual alignment."); + stage++; + break; + case 4: + npc("I've gathered together some research notes from various", "sources but I can't quite make out what they mean. If", "you want to have a go at making them out, just ask me", "for a copy."); + stage++; + break; + case 5: + if (player.getInventory().remove(AnimalMagnetism.UNDEAD_TWIGS)) { + quest.setStage(player, 32); + } + end(); + break; + } + break; + case 32: + switch (stage) { + case 0: + npc("They are still stumping me. Here are the notes; I", "really hope your head doesn't explode from reading", "them."); + stage++; + break; + case 1: + player("I'd find it slightly inconvenient, I'm sure."); + stage++; + break; + case 2: + npc("It wouldn't be all bad as your body would be useful for", "research after death. What I'd be upset about was if", "bits of you landed in my nice new bed."); + stage++; + break; + case 3: + player("Your concern is touching."); + stage++; + break; + case 4: + quest.setStage(player, 33); + player.getInventory().add(AnimalMagnetism.RESEARCH_NOTES); + end(); + break; + } + break; + case 33: + switch (stage) { + case 0: + npc("I know you have the notes; I gave them to you, in case", "you forgot! Furthermore, if I had hints, I'd have", "translated those notes myself."); + stage++; + break; + case 1: + npc("So, take the hint and go off and translate them. If it's", "too hard, you can always go and shoot demons in", "cages."); + stage++; + break; + case 2: + end(); + break; + case 4: + if (!player.getInventory().hasSpaceFor(AnimalMagnetism.RESEARCH_NOTES)) { + player("Sorry, I don't have enough inventory space."); + stage++; + return true; + } + player.getInventory().add(AnimalMagnetism.RESEARCH_NOTES); + npc("Don't tell me, your cat ate them? You won't get out of", "the job that easily; here are some copies I made."); + stage++; + break; + case 5: + end(); + break; + case 10: + npc("For all I know, it was pure luck, so don't jump to any", "conclusions about your mighty intellect."); + stage++; + break; + case 11: + player("I can see why you don't have any assistants, you're", "not exactly easy to work with."); + stage++; + break; + case 12: + npc("Let's get back to the work we're doing, then.", "Remember, this is all a favour to you. I could have just", "decided to fob you off with a feather duster."); + stage++; + break; + case 13: + npc("I've given you a pattern for the container; you'll need", "to combine them with some polished buttons and hard", "leather. Then we're almost done. Good news, eh?"); + stage++; + break; + case 14: + npc("If you are having trouble finding buttons, I've heard", "rumours that the H.A.M society carry this sort of stuff", "more than most."); + stage++; + break; + case 15: + player("Really? How would you know this strange detail?"); + stage++; + break; + case 16: + npc("I hear they lose their clothes a lot to thieves so they", "have to make do with shoddy goods. Whatever the", "reason, they seem to carry buttons about in their pockets."); + stage++; + break; + case 17: + if (player.getInventory().remove(AnimalMagnetism.TRANSLATED_NOTES)) { + player.getInventory().add(AnimalMagnetism.PATTERN); + quest.setStage(player, 34); + end(); + } + break; + } + break; + case 34: + switch (stage) { + case 0: + npc("Your short-term memory loss worries me. Combine the", "pattern with hard leather and some polished buttons,", "then hand the resulting container to me."); + stage++; + break; + case 1: + end(); + break; + case 10: + npc("You're pretty careless, aren't you. I assume you're the", "type who leaves a trail of arrows and knives behind", "behind them when they train?"); + stage++; + break; + case 11: + if (!player.getInventory().hasSpaceFor(AnimalMagnetism.PATTERN)) { + player("Sorry, I don't have enough room in my backpack."); + stage++; + break; + } + player.getInventory().add(AnimalMagnetism.PATTERN); + npc("Here's a replacement; perhaps if I charged for them,", "you'd be more careful."); + stage++; + break; + case 12: + end(); + break; + case 20: + if (player.getInventory().remove(AnimalMagnetism.CONTAINER)) { + quest.finish(player); + end(); + } + break; + } + break; + case 100: + switch (stage) { + case 0: + options("Devices, please.", "I'd like information, please.", "I'd like to see your stuff for sale, please.", "I'll just head off, I think."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Devices, please."); + stage = 10; + break; + case 2: + player("I'd like information, please."); + stage = 20; + break; + case 3: + player("I'd like to see your stuff for sale, please."); + stage = 30; + break; + case 4: + player("I'll just head off, I think."); + stage = 40; + break; + } + break; + case 10: + String first = "Basic: 999 coins"; + String second = "Upgraded: 999 coins
+ 75 steel arrows"; + if (!canBuyUpgrade(player)) { + second = " Upgraded: Level 50 Ranged"; + } + player.getPacketDispatch().sendItemZoomOnInterface(10498, 170, 140, 5); + player.getPacketDispatch().sendItemZoomOnInterface(10499, 170, 140, 6); + player.getPacketDispatch().sendString("Which device would you like?", 140, 4); + player.getPacketDispatch().sendString(first, 140, 2); + player.getPacketDispatch().sendString(second, 140, 3); + player.getInterfaceManager().openChatbox(140); + stage++; + break; + case 11: + switch (buttonId) { + case 1: + end(); + buy(buttonId == 2); + break; + case 2: + if (!canBuyUpgrade(player)) { + if (player.getSkills().getStaticLevel(Skills.RANGE) < 50) { + npc("I'm afraid you aren't yet skilled enough for the", "upgraded version. You need a Range level of 50 or", "greater."); + } else { + npc("You need to have an avas attractor in order", "to upgrade it."); + } + stage++; + } else { + buy(true); + } + break; + } + break; + case 12: + end(); + break; + case 20: + npc("Just a few bits of information before you run away to", "persecute rock crabs or cows."); + stage++; + break; + case 21: + npc("First, your new device won't work if you are wearing", "certain metallic chest armours."); + stage++; + break; + case 22: + npc("The magnetic attraction required for operation would", "cause feedback, so the device does not allow such", "incompatible item equippage."); + stage++; + break; + case 23: + npc("Secondly, although the device is calibrated to attract", "only arrow heads, there is a chance that other", "magnetically active items will be attracted."); + stage++; + break; + case 24: + npc("The arrow recovery function of the devices is slightly", "different and relies upon a harmonic bond between", "your arrows and the chicken's magnet. You'll thus only", "recover arrows which you have fired rather than those"); + stage++; + break; + case 25: + npc("fired by nearby folks."); + stage++; + break; + case 26: + npc("Thirdly, there is an upgraded version available when", "your Ranged level is 50 or greater."); + stage++; + break; + case 27: + npc("You'll also need to move about if you want to collect", "arrows since the gathering of long-lost arrowheads can't", "work otherwise."); + stage++; + break; + case 28: + npc("Finally, the device will only work when worn. It", "automatically deactivates in other circumstances."); + stage++; + break; + case 29: + npc("I was worried about what would happen if you were to", "place it in a bank in its active state, so I've made sure", "it only works when it's on your back."); + stage = 41; + break; + case 30: + npc("Here's my shop."); + stage++; + break; + case 31: + end(); + npc.openShop(player); + break; + case 40: + npc("Thanks for the help with my bed; see you again."); + stage++; + break; + case 41: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + player("It's going..."); + stage++; + break; + case 1: + end(); + break; + } + break; + } + return true; + } + + /** + * Checks if the player can buy an upgrade. + * @param player the player. + * @return {@code True} if so. + */ + public boolean canBuyUpgrade(Player player) { + if (player.hasItem(AnimalMagnetism.AVAS_ACCUMULATOR)){ + return true; + } + return player.getSkills().getStaticLevel(Skills.RANGE) >= 50; + } + + /** + * Buys a device. + * @param upgrade if upgraded. + */ + private void buy(boolean upgrade) { + Item item = upgrade ? AnimalMagnetism.AVAS_ACCUMULATOR : AnimalMagnetism.AVAS_ATTRACTOR; + if (!player.getInventory().hasSpaceFor(item)) { + player("Sorry, I don't have enough inventory space."); + stage++; + return; + } + Item coins = new Item(995, 999); + if (upgrade) { + if (!player.getInventory().contains(886, 75)) { + player("Sorry, I don't have enough arrows."); + stage++; + return; + } + } + if (!player.getInventory().containsItem(coins)) { + player("Sorry, I don't have enough coins."); + return; + } + if (upgrade) { + player.getInventory().remove(new Item(886, 75)); + } + removeAll(player, item, upgrade ? AnimalMagnetism.AVAS_ATTRACTOR : AnimalMagnetism.AVAS_ACCUMULATOR); + player.getInventory().remove(coins); + npc("Here's your device; take good care of your chicken."); + stage++; + } + + /** + * Removes all the items. + * @param player the player. + * @param add the add item. + * @param remove the remove item. + */ + private void removeAll(Player player, Item add, Item remove) { + List containers = new ArrayList<>(); + containers.add(player.getInventory()); + containers.add(player.getEquipment()); + containers.add(player.getBank()); + boolean replace = false; + for (Container c : containers) { + if (c.containsItem(remove)) { + c.replace(add, c.getSlot(remove)); + replace = true; + break; + } + } + if (!replace) { + player.getInventory().add(add); + } + } + + @Override + public int[] getIds() { + return new int[] { 5198, 5199 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java new file mode 100644 index 000000000..f57629c0d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/AvasDevicePlugin.java @@ -0,0 +1,77 @@ +package core.game.content.quest.members.animalmagnetism; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.node.entity.state.newsys.State; +import core.game.node.entity.state.newsys.StateRepository; +import core.game.node.entity.state.newsys.states.AvaDeviceState; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the equippage event of an ava device. + * @author Vexia + */ +public final class AvasDevicePlugin implements Plugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + AnimalMagnetism.AVAS_ACCUMULATOR.getDefinition().getHandlers().put("equipment", this); + AnimalMagnetism.AVAS_ATTRACTOR.getDefinition().getHandlers().put("equipment", this); + PluginManager.definePlugin(new DisableDevicePlugin()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + final Player player = (Player) args[0]; + final Item item = (Item) args[1]; + switch (identifier) { + case "equip": + AvaDeviceState state = (AvaDeviceState) player.registerState("avadevice"); + state.setDevice(item.getId()); + state.init(); + break; + case "unequip": + if (args.length == 3) { + Item second = (Item) args[2]; + if (second.getId() == 10498 || second.getId() == 10499) { + player.clearState("avadevice"); + AvaDeviceState newState = (AvaDeviceState) player.registerState("avadevice"); + newState.setDevice(second.getId()); + newState.init(); + break; + } + } + if(player.hasActiveState("avadevice")) player.states.get("avadevice").getPulse().stop(); + break; + } + return true; + } + + /** + * Handles the disabling of Ava's devices -- they'll no longer randomly collect loot. + * @author Splinter + */ + public final class DisableDevicePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(10499).getHandlers().put("option:operate", this); + ItemDefinition.forId(10498).getHandlers().put("option:operate", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getGlobalData().setAvasDisabled(!player.getGlobalData().isAvasDisabled()); + player.sendMessage("Ava's device will "+(player.getGlobalData().isAvasDisabled() ? "no longer" : "now")+" randomly collect loot for you."); + return true; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/OldCronDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/OldCronDialogue.java new file mode 100644 index 000000000..741330b0a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/OldCronDialogue.java @@ -0,0 +1,213 @@ +package core.game.content.quest.members.animalmagnetism; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.content.quest.free.therestlessghost.RestlessGhost; + +/** + * Handles the dialogue used for the old crone. + * @author Vexia + */ +public final class OldCronDialogue extends DialoguePlugin { + + /** + * The crone made amulet item. + */ + public static final Item CRONE_AMULET = new Item(10500); + + /** + * The quest used. + */ + private Quest quest; + + /** + * Constructs a new {@code OldCronDialogue} {@code Object}. + */ + public OldCronDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code OldCronDialogue} {@code Object}. + * @param player the player. + */ + public OldCronDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new OldCronDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Animal Magnetism"); + switch (quest.getStage(player)) { + case 16: + case 17: + case 18: + player("I'm here about the farmers east of here."); + break; + default: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello, old woman."); + stage = 1; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 18: + switch (stage) { + case 0: + if (!player.hasItem(CRONE_AMULET)) { + player("Would you be able to replace the amulet you made? I", "seem to have lost it."); + stage = 4; + break; + } + npc("Yes?"); + stage++; + break; + case 1: + player("Well, to tell the truth, I just came back to chat with", "you. Any news?"); + stage++; + break; + case 2: + npc("Disgraceful! Deliver that amulet; a young lady's", "happiness depends upon it."); + stage++; + break; + case 3: + end(); + break; + case 4: + npc("Here you are; luckily, I saved some of Alice's hair in", "case you were careless. Which you were."); + stage++; + break; + case 5: + if (!player.getInventory().hasSpaceFor(RestlessGhost.AMULET)) { + npc("You don't have enough space in your inventory."); + stage = 3; + break; + } + if (!player.getInventory().containsItem(RestlessGhost.AMULET) && !player.getEquipment().containsItem(RestlessGhost.AMULET)) { + npc("You need to bring me a ghostspeak amulet."); + stage = 3; + break; + } + player.getInventory().add(CRONE_AMULET); + end(); + break; + } + break; + case 17: + switch (stage) { + case 0: + player("I'm here to see if you are ready to do your mystical", "stuff with my ghostspeak amulet."); + stage++; + break; + case 1: + if (!player.getInventory().hasSpaceFor(RestlessGhost.AMULET)) { + npc("I most certainly am, but you don't have enough", "space in your backpack."); + stage++; + break; + } + if (!player.getInventory().containsItem(RestlessGhost.AMULET) && !player.getEquipment().containsItem(RestlessGhost.AMULET)) { + npc("I most certainly am, but you don't have an ghostspeak", "amulet."); + stage++; + } else { + npc("I most certainly am; there you go."); + stage += 2; + } + break; + case 2: + end(); + break; + case 3: + player("Wow, that was quick and painless."); + stage++; + break; + case 4: + npc("Just being a good neighbour."); + stage++; + break; + case 5: + player.getInventory().add(CRONE_AMULET); + quest.setStage(player, 18); + end(); + break; + } + break; + case 16: + switch (stage) { + case 0: + player("Alice and her husband are having trouble talking to one", "another and said you might be able to help."); + stage++; + break; + case 1: + npc("Ah, I know them; shame about those cows. Why would", "they think that I could help?"); + stage++; + break; + case 2: + player("Alice seems to think you could alter a ghostspeak amulet", "in order to allow them to communicate."); + stage++; + break; + case 3: + npc("Well, the poor young lady has such family problems; I", "quite feel her pain. I'd be happy to help."); + stage++; + break; + case 4: + npc("You seem to have one of her golden hairs on your", "shoulder, so I can use that..."); + stage++; + break; + case 5: + interpreter.sendDialogue("In a flash, the crone whisks away an unseen hair from your", "shoulder."); + stage++; + break; + case 6: + npc("Talk to me again with a ghostspeak amulet and some", "space in your backpack and I'll be ready to work on", "the little good deed. The way I plan is quite simple,", "really."); + stage++; + break; + case 7: + npc("I can mirror part of the unused mystical essence of the", "ghostspeak amulet, bind it with Alice's hair and thus", "create a second amulet."); + stage++; + break; + case 8: + npc("The second amulet will be useful for the purpose you", "desire, thought it won't work for any other ghost or", "human other than the farmer and his wife."); + stage++; + break; + case 9: + quest.setStage(player, 17); + end(); + break; + } + break; + default: + switch (stage) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I lived here when this was all just fields, you know."); + stage = 2; + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1695 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/WitchDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/WitchDialogue.java new file mode 100644 index 000000000..cd893002f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/animalmagnetism/WitchDialogue.java @@ -0,0 +1,210 @@ +package core.game.content.quest.members.animalmagnetism; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Handles the witch dialogue. + * @author Vexia + */ +public final class WitchDialogue extends DialoguePlugin { + + /** + * The iron bar items. + */ + private static final Item IRON_BARS = new Item(2351, 5); + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@code WitchDialogue} {@code Object}. + */ + public WitchDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WitchDialogue} {@code Object}. + * @param player the player. + */ + public WitchDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WitchDialogue(player); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest(AnimalMagnetism.NAME); + switch (quest.getStage(player)) { + case 25: + npc("Hello, hello, my poppet. What brings you to my little", "room?"); + break; + case 26: + if (!player.getInventory().containsItem(IRON_BARS)) { + player("I am back."); + } else { + npc("Great, you'll go far! I made some nice painted metal", "toys for you, smookums."); + } + break; + case 27: + if (player.hasItem(AnimalMagnetism.SELECTED_IRON)) { + npc("You were sent to try my patience, weren't you? Go", "away and make that magnet, then hand it to Ava."); + } else { + player("I have lost the selected iron..."); + stage++; + } + break; + default: + npc("Hello there, deary. Don't worry; I'm friendly."); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 25: + switch (stage) { + case 0: + player("Ava told me to ask you about making magnets.", "Something about natural fields and other stuff. Sounded", "like she needed a farmer, to be honest."); + stage++; + break; + case 1: + npc("Don't worry, deary, I can tell you just what to do and", "you won't have to worry your pretty head about the", "complicated bits."); + stage++; + break; + case 2: + player("No need to patronise me quite so much, you know."); + stage++; + break; + case 3: + npc("I went to anger management classes, my lambkin; that's", "why I was treating you so kindly. It's either this way", "or talking or I'll go back to shoving children into ovens."); + stage++; + break; + case 4: + npc("Just bring me 5 iron bars, though, and you've well on", "the way to never having to talk to me again."); + stage++; + break; + case 5: + player("I'll be back."); + stage++; + break; + case 6: + quest.setStage(player, 26); + end(); + break; + } + break; + case 26: + switch (stage) { + case 0: + if (!player.getInventory().containsItem(IRON_BARS)) { + npc("Oh, but sugarpie, I need 5 iron bars, you don't have", "enough. Come back to me quickly with all 5 of them."); + stage++; + } else { + player("Toys? Snookums? What are you on about, you", "deranged old bar?"); + stage += 2; + } + break; + case 2: + npc("Oh, forget it, then. If you won't react to kindness, I'm", "back to luring infants into my oven. You'll have it on", "your conscience."); + stage++; + break; + case 3: + npc("Go to the iron mine just north-east of Rimmington and", "hit the bar with a plain old smithing hammer while facing", "north. Then take your new magnet to Ava. Poor girl,", "having to deal with whippersnappers like you."); + stage++; + break; + case 4: + if (player.getInventory().remove(IRON_BARS)) { + player.getInventory().add(AnimalMagnetism.SELECTED_IRON); + quest.setStage(player, 27); + end(); + } + break; + case 1: + end(); + break; + } + break; + case 27: + switch (stage) { + case 0: + end(); + break; + case 1: + npc("Oh, deary, deary... I had a feeling. I can", "make you another for five more iron bars."); + stage++; + break; + case 2: + if (!player.getInventory().containsItem(IRON_BARS)) { + player("Okay, I'll go get some."); + stage++; + break; + } + if (player.getInventory().remove(IRON_BARS)) { + player.getInventory().add(AnimalMagnetism.SELECTED_IRON); + end(); + } + break; + case 3: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + player("You look very familiar but I can't remember chatting to", "you before."); + stage++; + break; + case 1: + npc("Well, my sisters used to live here but folk kept on", "killing them. A terrible affair, it was. I knew that no one", "would want to kill a chatty old dear like me, though."); + stage++; + break; + case 2: + player("Oh, well..."); + stage++; + break; + case 3: + npc("We still have a terrible problem with local louts, though.", "Poisoning my fish, spilling my compost all over the place", "and causing a nuisance for the dear count."); + stage++; + break; + case 4: + player("I think..."); + stage++; + break; + case 5: + npc("I'm sure a nice young sort like you won't be any", "trouble though. In any case, the Professor will soon", "share the secret of chickenisation with me... Not that I'd", "use it these days of course."); + stage++; + break; + case 6: + player("I have to go now."); + stage++; + break; + case 7: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5200 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/ASoulsBane.java b/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/ASoulsBane.java new file mode 100644 index 000000000..08d2a1136 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/ASoulsBane.java @@ -0,0 +1,100 @@ +package core.game.content.quest.members.asoulsbane; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Author: afaroutdude + */ +@Initializable +public class ASoulsBane extends Quest { + public static final String NAME = "A Soul's Bane"; + + public ASoulsBane() { + super(NAME, 115, 114, 1, 709, 0, 1, 1261); + } + + // config 710 does a lot of shit + // launa 3638 quest start? can disappear w/ config 710 + // launa 3639 ?? + // launa 3640 standing upright w/out staff + // sconfigrange 710 711 + // 2^0 Launa disappears + // 2^13 warning signs appear around rift entrance + // 2^11 rope appears at rift entrance + + // rage iface 315 + // rage config ??? + // fear black iface 317 + // fear ghost iface 318 + // https://www.youtube.com/watch?v=Ad5KUHV7duQ + // https://www.youtube.com/watch?v=bKaaEqmS9KU + + // animGFX 3804 630 - Get Angry In Tolna’s Rift + // anim 3807 - Tolna Awakens From Nightmare + // anim 3838 - Crawl Into Tolna’s Rift + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new SoulsBaneLaunaDialogue(), new ASoulsBanePlugin()); + return this; + } + + protected enum JournalEntries { + a(0, 5,"I can start this quest by talking to !!Launa?? at the !!Rift

!!entrance north west of the dig site."), + b(5, 15, "I spoke with !!Launa?? next to the rift and she told me

about her lost !!Son.??"), + d(15, 20, "I heard Tolna's voice say, 'Why should I, Tolna, be

trapped in such a wretched place? Feel my ANGER!'"), + e(20, 25, "I beat the anger beasts in the rift."), + f(25, 30, "I heard Tolna's voice say, 'I'm trapped and it's so dark. I FEAR I may never escape this place. Mum, help me!'"), + g(30, 35, "I defeated the fear beasts in the rift."), + h(35, 40, "I heard Tolna's voice say, 'Where am I? How long have I been here? Am I still the person I once was? I hate my CONFUSION'"), + i(40, 45, "I conquered the beasts of confusion."), + j(45, 50, "I heard Tolna's voice say, 'What's the point? Why do I defy such HOPELESSNESS? No-one will ever help me.'"), + k(50, 55, "I overcame the emotion of hopelessness."), + l(55, 60, "I've discovered the physical form of Tolna, and his father."), + m(60, 70, "I fought Tolna and he appears to have returned to his human form."), + n(70, 100, "Tolna has repented and returned to the entrance of the rift."), + o(100, 110, "Tolna has set up a dungeon to help others avoid his mistakes."); + + int stageIntroduce; + int stageStrikeout; + String msg; + + JournalEntries(int stageIn, int stageOut, String msg) { + this.stageIntroduce = stageIn; + this.stageStrikeout = stageOut; + this.msg = msg; + } + } + + private int drawJournalSub(Player player, int questStage, int line) { + // todo this doesn't work right + for (JournalEntries stageLine : JournalEntries.values()) { + if (stageLine.stageIntroduce > questStage) + break; + + line(player, stageLine.msg, line++, stageLine.stageStrikeout <= questStage); + } + return line; + } + + + @Override + public void drawJournal(Player player, int stage) { + int line = 11; + super.drawJournal(player, stage); + + line = drawJournalSub(player, stage, line); + switch (stage) { + case 0: + line(player, "There are no minimum requirements.", line + 2); + break; + case 100: + line(player, "--- QUEST COMPLETE ---", line + 2); + default: + break; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin.java new file mode 100644 index 000000000..a7ef9922f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/ASoulsBanePlugin.java @@ -0,0 +1,159 @@ +package core.game.content.quest.members.asoulsbane; + +import core.cache.def.impl.ObjectDefinition; +import core.tools.Items; +import core.game.interaction.MovementPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Author: afaroutdude + */ + +public class ASoulsBanePlugin extends OptionHandler { + private static final int[] RIFT_IDS = {13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993}; + private static final int[] OBJ_EXIT = {13878, 13901, 13904, 13932}; + private static final int WEAPONS_RACK = 13993; + private static final int FINAL_EXIT = 13933; + private static final int OBJ_CONFIG = 710; + //private static final Animation CLIMB_DOWN = new Animation(); + private static final Location ROPE_STAND_LOC = Location.create(3309, 3452, 0); + private static final Location RIFT_RAGE = Location.create(3015, 5244, 0); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugins(new SoulsBaneRiftRopeHandler()); + for (int obj : RIFT_IDS) { + ObjectDefinition.forId(obj).getHandlers().put("option:enter", this); + } + + for (int obj : OBJ_EXIT) { + ObjectDefinition.forId(obj).getHandlers().put("option:use", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node instanceof Item ? ((Item) node).getId() : ((GameObject) node).getId(); + GameObject object = node instanceof GameObject ? ((GameObject) node) : null; + Location dest = null; + Quest quest = player.getQuestRepository().getQuest(ASoulsBane.NAME); + + boolean isRift = false; + for (int obj : RIFT_IDS) { + if (id == obj) { + isRift = true; + break; + } + } + + if (isRift) { + switch (quest.getStage(player)) { + case 0: + case 5: + player.getPacketDispatch().sendMessage("You can't just jump down there."); + break; + case 10: + player.getPulseManager().run(new MovementPulse(player, ROPE_STAND_LOC) { + @Override + public boolean pulse() { + return false; + } + + // todo this is janky, what's the better way to do this? Make sure you run to rope before descending + @Override + public void stop() { + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 1; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.animate(new Animation(3838)); + break; + case 3: + // todo there should be a fade to black here + break; + case 6: + player.teleport(RIFT_RAGE); + player.getAnimator().reset(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 9); + player.unlock(); + return true; + } + return false; + } + }); + } + }, "movement"); + } + return true; + } + + boolean isEarlyExit = false; + for (int obj : OBJ_EXIT) { + if (id == obj) { + isEarlyExit = true; + break; + } + } + + if (isEarlyExit) { + player.teleport(ROPE_STAND_LOC); + } + + return false; + } + + public class SoulsBaneRiftRopeHandler extends UseWithHandler { + public SoulsBaneRiftRopeHandler() { + super(Items.ROPE_954); + } + + @Override + public Location getDestination(Player player, Node node) { + return ROPE_STAND_LOC; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + Item usedItem = event.getUsedItem(); + final Quest quest = player.getQuestRepository().getQuest(ASoulsBane.NAME); + final GameObject object = event.getUsedWith().asObject(); + + if (quest.getStage(player) == 5 && usedItem.getId() == Items.ROPE_954) { + player.getConfigManager().set(OBJ_CONFIG, player.getConfigManager().get(OBJ_CONFIG) | 1<<11, true); + player.getInventory().remove(usedItem); + quest.setStage(player, 10); + return true; + } + + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : RIFT_IDS) { + addHandler(id, OBJECT_TYPE, this); + } + return this; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/SoulsBaneLaunaDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/SoulsBaneLaunaDialogue.kt new file mode 100644 index 000000000..406e1c933 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/asoulsbane/SoulsBaneLaunaDialogue.kt @@ -0,0 +1,81 @@ +package core.game.content.quest.members.asoulsbane + +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.quest.Quest +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +/** + * Launa + * @author afaroutdude + */ +class SoulsBaneLaunaDialogue(player: Player? = null) : DialoguePlugin(player) { + lateinit var quest: Quest + + override fun open(vararg args: Any?): Boolean { + player?.let { + player("Hi there.") + quest = it.questRepository.getQuest(ASoulsBane.NAME) + //quest = it.questRepository.getQuest(ASoulsBane.NAME) + when (quest.getStage(player)) { + 0 -> { + stage = 0 + } + 5, 10 -> stage = 999 + } + return true + } + return false + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 999 -> end() + + 0 -> npc(FacialExpression.SAD, "Hello.").also { stage++ } + 1 -> player("What's this big hole in the ground all about?").also { stage++ } + 2 -> npc(FacialExpression.SAD, "Oh I wish I knew for sure... All I do know is that it", "opened seemingly by itself a few months ago. It was", "first discovered by the students over at the digsite, a", "few of which have gone down there but never returned.").also { stage++ } + 3 -> npc(FacialExpression.SAD, "They told me about it straight away.").also { stage++ } + 4 -> player("So why is it important to you?").also { stage++ } + 5 -> npc(FacialExpression.SAD, "A few reasons, but I think the situation is beyond help", "now.").also { stage++ } + 6 -> player("What situation? Maybe I can help.").also { stage++ } + 7 -> npc(FacialExpression.SAD, "I suppose it wouldn't hurt to tell you. I'm waiting to", "see my son Tolna. Don't suppose you've seen him?").also { stage++ } + 8 -> player("Your son, Tolna? I don't know, what does he look like?").also { stage++ } + 9 -> npc(FacialExpression.SAD, "I don't really know.").also { stage++ } + 10 -> player("You don't know what your own son looks like?").also { stage++ } + 11 -> npc(FacialExpression.SAD, "No. You see, I haven't seen him for... for... 25 years", "now. He just ran away one day and never returned.", "I'm hoping he's down this rift as I know he headed in", "this direction. My husband went to look, but he hasn't").also { stage++ } + 12 -> npc(FacialExpression.SAD, "returned for days.").also { stage++ } + 13 -> options("Would you like me to go down to look for your husband and son?", "Surely by now they'd both be dead?").also { stage++ } + 14 -> + when (buttonId) { + 1 -> player("Would you like me to go down to look for your", "husband and son?").also { stage = 20 } + 2 -> player("Surely by now they'd both be dead?").also { stage++ } + } + 15 -> npc(FacialExpression.ANGRY, "What?!?!").also { stage++ } + 16 -> player("Oops.").also { stage++ } + 17 -> npc(FacialExpression.ANGRY, "How could you say such a thing? Get away from me!").also { stage = 999 } + + 20 -> npc("You would do that? Oh thank you so much!").also { stage++ } + 21 -> player("Don't worry. I'll investigate.").also { stage++ } + 22 -> npc("Thank you. You can use a rope to get into the rift,", "just attach it at the edge.").also { stage++ } + 23 -> player("No problem.").also { stage++ } + 24 -> { + npc("Be careful.") + stage = 999 + quest.setStage(player, 5) + player.questRepository.syncronizeTab(player) + println(quest.getStage(player)) + } + } + return true; + } + + + override fun newInstance(player: Player?): DialoguePlugin { + return SoulsBaneLaunaDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(3638, 3639, 3640) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/CannonBallPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/CannonBallPlugin.java new file mode 100644 index 000000000..502f26365 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/CannonBallPlugin.java @@ -0,0 +1,138 @@ +package core.game.content.quest.members.dwarfcannon; + +import core.tools.Items; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the cannon ball making. + * @author Vexia + */ +public class CannonBallPlugin extends UseWithHandler { + + /** + * The furnaces. + */ + private static final int[] FURNACES = new int[] { 4304, 6189, 11010, 11666, 12100, 12809, 18497, 26814, 30021, 30510, 36956, 37651 }; + + /** + * Constructs a new {@Code CannonBallPlugin} {@Code Object} + */ + public CannonBallPlugin() { + super(Items.STEEL_BAR_2353); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : FURNACES) { + addHandler(id, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (!player.getQuestRepository().isComplete(DwarfCannon.NAME)) { + player.getDialogueInterpreter().sendDialogue("You need to complete the Dwarf Cannon quest in order to do this."); + return true; + } + SkillDialogueHandler dialogue = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, event.getUsedItem()) { + + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new CannonBallPulse(player, event.getUsedItem(), amount)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(event.getUsedItem()); + } + + }; + dialogue.open(); + return true; + } + + /** + * Handles the pulse used to create a cannon ball. + * @author Vexia + */ + public class CannonBallPulse extends SkillPulse { + + /** + * The amount to make. + */ + private int amount; + + /** + * The ticks. + */ + private int ticks; + + /** + * Constructs a new {@Code CannonBallPulse} {@Code Object} + * @param player the player. + * @param node the node. + * @param amount the amount. + */ + public CannonBallPulse(Player player, Item node, int amount) { + super(player, node); + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.SMITHING) < 35) { + player.getDialogueInterpreter().sendDialogue("You need a Smithing level of at least 35 in order to do this."); + return false; + } + if (!player.getInventory().contains(Items.AMMO_MOULD_4, 1)) { + player.getDialogueInterpreter().sendDialogue("You need an ammo mould in order to make a cannon ball."); + return false; + } + if (!player.getInventory().containsItem(node)) { + stop(); + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks == 0 || ticks % 6 == 0) { + player.sendMessage("You heat the steel bar into a liquid state."); + player.animate(Animation.create(827)); //Bone burying animation (2009 used the same animation as burying bones) + } else if (ticks % 3 == 0) { + player.sendMessage("You pour the molten metal into your cannonball mould."); + } + } + + @Override + public boolean reward() { + if (++ticks % 6 != 0) { + return false; + } + amount--; + if (player.getInventory().remove(node)) { + player.getInventory().add(new Item(Items.CANNONBALL_2, 4)); + player.getSkills().addExperience(Skills.SMITHING, 25.6, true); + player.sendMessage("The molten metal cools slowly to form 4 cannonballs."); + } + return amount <= 0; + } + + @Override + public void message(int type) { + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/CaptainLawgofDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/CaptainLawgofDialogue.java new file mode 100644 index 000000000..d1be4ca8f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/CaptainLawgofDialogue.java @@ -0,0 +1,490 @@ +package core.game.content.quest.members.dwarfcannon; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Handles captains lawgof dialogue. + * @author Vexia + */ +public class CaptainLawgofDialogue extends DialoguePlugin { + + /** + * The quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@Code CaptainLawgofDialogue} {@Code + * Object} + */ + public CaptainLawgofDialogue() { + /** + * empty + */ + } + + /** + * Constructs a new {@Code CaptainLawgofDialogue} {@Code + * Object} + * @param player the player. + */ + public CaptainLawgofDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CaptainLawgofDialogue(player); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest(DwarfCannon.NAME); + switch (quest.getStage(player)) { + case 80: + player("Hi."); + break; + case 50: + npc("How are you doing in there, trooper? We've been", "trying our best with that thing, but I just haven't got", "the patience."); + break; + case 40: + player("Hello, has Lollk returned yet?"); + break; + default: + player("Hello."); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 0: + switch (stage) { + case 0: + npc("Guthix be praised, the cavalry has arrived! Hero, how", "would you like to be made an honorary member of the", "Black Guard?"); + stage++; + break; + case 1: + player("The Black Guard, what's that?"); + stage++; + break; + case 2: + npc("Hawhaw! 'What's that' " + (player.getAppearance().isMale() ? "he" : "she") + " asks, what a sense of", "humour! The Black Guard is the finest regiment in the", "dwarven army. Only the best of the best are allowed to", "join it and then they receive months of rigorous"); + stage++; + break; + case 3: + npc("training. However, we are currently in need of a hero,", "so for a limited time only I'm offering you, a human, a", "chance to join this prestigious regiment. What do you", "say?"); + stage++; + break; + case 4: + player("Sure, I'd be honoured to join."); + stage++; + break; + case 5: + quest.start(player); + npc("That's the spirit! Now trooper, we have no time to waste", "- the goblins are attacking from the forests to the", "South. There are so many of them, they are", "overwhelming my men and breaking through our"); + stage = 100; + break; + } + break; + case 10: + switch (stage) { + case 0: + if (player.getConfigManager().get(1) == 2016) { + npc("Well done, trooper! The goblins seems to have stopped", "getting in. I think you've done the job!"); + stage = 105; + break; + } + npc("Hello, trooper, how are you doing with those railings?"); + stage++; + break; + case 1: + player("I'm getting there."); + stage++; + break; + case 2: + npc("The goblins are still getting in, so there must still be", "some broken railings."); + stage++; + break; + case 3: + if (!player.hasItem(new Item(14))) { + player("But I'm out of railings..."); + stage = 5; + break; + } + player("Don't worry, I'll find them soon enough."); + stage++; + break; + case 4: + end(); + break; + case 5: + npc("That's okay, we've got plenty, here you go."); + stage++; + break; + case 6: + player.getPacketDispatch().sendMessage("The Dwarf Captain gives you another railing."); + player.getInventory().add(new Item(14), player); + end(); + break; + case 100: + npc("perimeter defences; could you please try to fix the", "stockade by replacing the broken rails with these new", "ones?"); + stage++; + break; + case 101: + player("Sure, sounds easy enough..."); + stage++; + break; + case 102: + player.getInventory().add(new Item(14, 6), player); + player.getDialogueInterpreter().sendDialogue("The Dwarf Captain gives you six railings."); + stage++; + break; + case 103: + npc("Report back to me once you've fixed the railings."); + stage++; + break; + case 104: + player("Yes Sir, Captain!"); + end(); + break; + case 105: + player("Great, I'll be getting on then."); + stage++; + break; + case 106: + npc("What? I'll have you jailed for desertion!"); + stage++; + break; + case 107: + npc("Besides, I have another commission for you. Just", "before the goblins over-ran us we lost contact with our", "watch tower to the South, that's why the goblins", "managed to catch us unawares. I'd like you to perform."); + stage++; + break; + case 108: + npc("a covert operation into enemy territory, to check up on", "the guards we have stationed there."); + stage++; + break; + case 109: + npc("They should have reported in by now ..."); + stage++; + break; + case 110: + player("Okay, I'll see what I can find out."); + stage++; + break; + case 111: + npc("Excellent! I have two men there, the dwarf-in-charge is", "called Gilob, find him and tell him that I'll send him a", "relief guard just as soon as we mop up these remaining", "goblins."); + stage++; + break; + case 112: + player.getConfigManager().set(0, 3, true); + quest.setStage(player, 20); + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + if (player.getInventory().containsItem(DwarfCannon.DWARF_REMAINS)) { + npc("Have you been to the watch tower yet?"); + stage = 4; + break; + } + npc("Hello, any news from the watchman?"); + stage++; + break; + case 1: + player("Not yet."); + stage++; + break; + case 2: + npc("Well, as quick as you can then."); + stage++; + break; + case 3: + end(); + break; + case 4: + player("I have some terrible news for you Captain, the goblins", "over ran the tower, your guards fought well but were", "overwhelmed."); + stage++; + break; + case 5: + interpreter.sendItemMessage(DwarfCannon.DWARF_REMAINS, "You give the Dwarf Captain his subordinate's remains..."); + stage++; + break; + case 6: + npc("I can't believe it, Gilob was the finest lieutenant I had!", "We'll give him a fitting funeral, but what of his", "command? His son, Lollk, was with him. Did you find", "his body too?"); + stage++; + break; + case 7: + player("No, there was only one body there, I searched pretty", "well."); + stage++; + break; + case 8: + npc("The goblins must have taken him. Please traveller, seek", "out the goblin's hideout and return the lad to us. They", "always attack from the South-west, so they must be", "based down there."); + stage++; + break; + case 9: + player("Okay, I'll see if I can find their hideout."); + stage++; + break; + case 10: + end(); + player.getConfigManager().set(0, 5, true); + player.getInventory().remove(DwarfCannon.DWARF_REMAINS); + quest.setStage(player, 30); + break; + } + break; + case 30: + switch (stage) { + case 0: + npc("Trooper, have you managed to find the goblins' base?"); + stage++; + break; + case 1: + player("Not yet I'm afraid, but I'll keep looking..."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 40: + switch (stage) { + case 0: + npc("He has, and I thank you from the bottom of my heart", "- without you he'd be a goblin barbecue!"); + stage++; + break; + case 1: + player("Always a please to help."); + stage++; + break; + case 2: + npc("In that case could I ask one more favour of you..."); + stage++; + break; + case 3: + npc("When the goblins attacked us some of them managed to", "slip past my guards and sabotage our cannon. I don't", "have anybody who understands how it works, could you,", "have a look at it and see if you could get it working for"); + stage++; + break; + case 4: + npc("us, please?"); + stage++; + break; + case 5: + player("Okay, I'll see what I can do."); + stage++; + break; + case 6: + npc("Thank you, take this toolkit, you'll need it..."); + stage++; + break; + case 7: + npc("Report back to me if you manage to fix it."); + stage++; + break; + case 8: + player.getInventory().add(DwarfCannon.TOOL_KIT, player); + player.getConfigManager().set(0, 7); + quest.setStage(player, 50); + end(); + break; + } + break; + case 50: + switch (stage) { + case 0: + player("It's not an easy job, but I'm getting there."); + stage++; + break; + case 1: + if (!player.hasItem(DwarfCannon.TOOL_KIT)) { + player("I'm afraid I lost the toolkit..."); + stage = 3; + break; + } + npc("Good stuff, let me know if you have any luck. If we", "manage to get that thing working, those goblins will be", "no trouble at all."); + stage++; + break; + case 2: + end(); + break; + case 3: + npc("That was silly... never mind, here you go."); + stage++; + break; + case 4: + end(); + player.sendMessage("The Dwarf Captain gives you another toolkit."); + player.getInventory().add(DwarfCannon.TOOL_KIT, player); + break; + } + break; + case 60: + switch (stage) { + case -1: + end(); + break; + case 0: + npc("Hello there trooper, how's things?"); + stage++; + break; + case 1: + player("Well, I think I've done it, take a look..."); + stage++; + break; + case 2: + if (!player.getInventory().contains(1, 1)) { + npc("Bring me back the toolkit please."); + stage = -1; + break; + } + npc("That's fantastic, well done!"); + stage++; + break; + case 3: + npc("Well I don't believe it, it seems to be working perfectly!", "I seem to have underestimated you, trooper!"); + stage++; + break; + case 4: + player("Not bad for an adventurer eh?"); + stage++; + break; + case 5: + npc("Not bad at all, your effort is appreciated, my friend.", "Now, if I could figure what the thing uses as ammo..."); + stage++; + break; + case 6: + npc("The Black Guard forgot to send instructions. I know I", "said that was the last favour, but..."); + stage++; + break; + case 7: + player("What now?"); + stage++; + break; + case 8: + npc("I can't leave this post, could you go to the Black Guard", "base and find out what this thing actually shoots?"); + stage++; + break; + case 9: + player("Okay then, just for you!"); + stage++; + break; + case 10: + npc("That's great, we were lucky you came along when you", "did. The base is located just South of the Ice Mountain."); + stage++; + break; + case 11: + npc("You'll need to speak to Nulodion, the Dwarf Cannon", "engineer. He's the Weapons Development Chief for the", "Black Guard, so if anyone knows how to fire this thing,", "it'll be him."); + stage++; + break; + case 12: + player("Okay, I'll see what I can do."); + stage++; + break; + case 13: + player.getInventory().remove(DwarfCannon.TOOL_KIT); + player.sendMessage("You giv the toolkit back to Captain Lawgof."); + player.getConfigManager().set(0, 9, true); + quest.setStage(player, 70); + end(); + break; + } + break; + case 80: + switch (stage) { + case 0: + npc("Hello trooper, any word from the Cannon Engineer?"); + stage++; + break; + case 1: + player("Yes, I have spoken to him."); + stage++; + break; + case 2: + if (!player.getInventory().containsItem(DwarfCannon.MOULD) || !player.getInventory().containsItem(DwarfCannon.NULODION_NOTES)) { + player("He gave me some items to give you... but I seem to", "have lost something."); + stage++; + } else { + player("He gave me an ammo mould and some notes to give to", "you..."); + stage = 6; + } + break; + case 3: + npc("If you could go back and get another, I'd appreciate it."); + stage++; + break; + case 4: + player("Oh, okay then."); + stage++; + break; + case 5: + end(); + break; + case 6: + npc("Aah, of course, we make the ammo! This is great, now", "we will be able to defend ourselves. I don't know how to", "thank you..."); + stage++; + break; + case 7: + player("You could give me a cannon..."); + stage++; + break; + case 8: + npc("Hah! You'd be lucky, those things are worth a fortune."); + stage++; + break; + case 9: + npc("I'll tell you what, I'll write to the Cannon", "Engineer requesting him to sell you one. He controls", "production of the cannons."); + stage++; + break; + case 10: + npc("He won't be able to give you one, but for the right", "price, I'm sure he'll sell one to you."); + stage++; + break; + case 11: + player("Hmmm... sounds interesting, I might take you up on", "that."); + stage++; + break; + case 12: + quest.finish(player); + end(); + break; + } + break; + case 100: + switch (stage) { + case 0: + npc("Well hello there, how you doing?"); + stage++; + break; + case 1: + player("Not bad, yourself?"); + stage++; + break; + case 2: + npc("I'm great now, those goblins can't get close with this", "cannon blasting at them!"); + stage++; + break; + case 3: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 208 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/CaptainLawgofNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/CaptainLawgofNPC.java new file mode 100644 index 000000000..ea462387d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/CaptainLawgofNPC.java @@ -0,0 +1,52 @@ +package core.game.content.quest.members.dwarfcannon; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Handles the captain lawgof npc. + * @author Vexia + */ +public class CaptainLawgofNPC extends AbstractNPC { + + /** + * The force chats. + */ + private static final String[] CHATS = new String[] { "Don't just stand there, do something!", "Stop dawdling solider! You're in the army now!", "Hurry up on that patrol route, trooper!", "Keep an eye open for goblins!" }; + + /** + * Constructs a new {@Code CaptainLawgofNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public CaptainLawgofNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@Code CaptainLawgofNPC} {@Code Object} + */ + public CaptainLawgofNPC() { + super(-1, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new CaptainLawgofNPC(id, location); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (RandomFunction.random(100) < 3) { + sendChat(RandomFunction.getRandomElement(CHATS)); + } + } + + @Override + public int[] getIds() { + return new int[] { 208 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/DwarfCannon.java b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/DwarfCannon.java new file mode 100644 index 000000000..aa2d16a12 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/DwarfCannon.java @@ -0,0 +1,126 @@ +package core.game.content.quest.members.dwarfcannon; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.PluginManager; +import core.game.node.entity.skill.Skills; + +/** + * Represents the dwarf cannon quest. + * @author Vexia + */ +@Initializable +public class DwarfCannon extends Quest { + + /** + * The name of this quest. + */ + public static final String NAME = "Dwarf Cannon"; + + /** + * The dwarf remain item. + */ + public static final Item DWARF_REMAINS = new Item(0); + + /** + * The tool kit item. + */ + public static final Item TOOL_KIT = new Item(1); + + /** + * The nulodion notes. + */ + public static final Item NULODION_NOTES = new Item(3); + + /** + * The mould item. + */ + public static final Item MOULD = new Item(4); + + /** + * Constructs a new {@Code DwarfCannon} {@Code Object} + */ + public DwarfCannon() { + super(NAME, 49, 48, 1); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugin(new LollkDialogue()); + PluginManager.definePlugin(new NulodionDialogue()); + PluginManager.definePlugin(new CaptainLawgofNPC()); + PluginManager.definePlugin(new CannonBallPlugin()); + PluginManager.definePlugin(new CaptainLawgofDialogue()); + PluginManager.definePlugin(new DwarfCannonPlugin()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + line(player, "I can start this quest by speaking to Lawgof the DwarvenCaptain of the Black Watch , he is defending an areaNorth-west of the Fishing Guild against goblin attack.", 11); + break; + case 10: + line(player, "I have spoken to Captain Lawgof, he recruited me into theBlack Guard and asked me to help the dwarves." + (player.getConfigManager().get(1) == 2016 ? "I have repaired all the broken railings,I should report back to Captain Lawgof." : "My first task is to fix the broken railingsin the dwarves defensive perimeter."), 11); + break; + case 20: + line(player, "I have spoken to Captain Lawgof, he recruited me into theBlack Guard and asked me to help the dwarves." + (player.hasItem(DWARF_REMAINS) ? "I went to the watchtower where I found the remains ofGilob.I should take them back to Captain Lawgof." : "I have repaired all the broken railings,Captain Lawgof has asked me to check up on his guards atthe watchtower to the South of this camp."), 11); + break; + case 30: + line(player, "I have spoken to Captain Lawgof, he recruited me into theBlack Guard and asked me to help the dwarves.I gave the remains to Captain Lawgof.he sent me to find the Goblin base, South-east of thecamp.", 11); + break; + case 40: + line(player, "I have spoken to Captain Lawgof, he recruited me into theBlack Guard and asked me to help the dwarves.I have rescued Lollk and sent him back to the Captain.I need to speak to Captain Lawgof again.", 11); + break; + case 50: + line(player, "I have spoken to Captain Lawgof, he recruited me into theBlack Guard and asked me to help the dwarves.Captain Lawgof has asked me to fix the multicannon.", 11); + break; + case 60: + line(player, "I have spoken to Captain Lawgof, he recruited me into theBlack Guard and asked me to help the dwarves.I've fixed the broken multicannon,I need to speak to Captain Lawgof again.", 11); + break; + case 70: + line(player, "I have spoken to Captain Lawgof, he recruited me into theBlack Guard and asked me to help the dwarves.Captain Lawgof asked me to find Nulodion the Engineer, heneeds to know what ammunition the multicannon fires.", 11); + break; + case 80: + line(player, "I have spoken to Captain Lawgof, he recruited me into theBlack Guard and asked me to help the dwarves.I've spoken to Nulodion,He gave me an ammo mould and notesI need to speak to Captain Lawgof again.", 11); + break; + case 100: + line(player, "I have spoken to Captain Lawgof, he recruited me into theBlack Guard and asked me to help the dwarves.I've helped the dwarves keep out the Goblins, and foundthe remains of their friend.I fixed the cannon and got a mould for Captain Lawgof.I can now buy a multicannon from Nulodion as a reward.QUEST COMPLETE!", 11); + break; + } + } + + @Override + public void start(Player player) { + super.start(player); + player.getConfigManager().set(0, 1); + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("750 Crafting XP", 277, 9 + 2); + player.getPacketDispatch().sendString("Permission to purchase and", 277, 10 + 2); + player.getPacketDispatch().sendString("use the Dwarf Multicannon", 277, 11 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(TOOL_KIT.getId(), 235, 277, 3 + 2); + player.getSkills().addExperience(Skills.CRAFTING, 750); + player.getQuestRepository().syncronizeTab(player); + } + + @Override + public int[] getConfig(Player player, int stage) { + int val = 0; + if (stage >= 100) { + val = 11; + } else if (stage > 0 && stage < 100) { + val = player.getConfigManager().get(0); + } + return new int[] { 0, val }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin.java new file mode 100644 index 000000000..610ed29f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/DwarfCannonPlugin.java @@ -0,0 +1,471 @@ +package core.game.content.quest.members.dwarfcannon; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.dialogue.DialogueAction; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the dwarf cannon quest interactions. + * @author Vexia + */ +public class DwarfCannonPlugin extends OptionHandler { + + /** + * The lollk npc. + */ + private static NPC lollk; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(3).getHandlers().put("option:open", this); + ObjectDefinition.forId(5).getHandlers().put("option:inspect", this); + ObjectDefinition.forId(2).getHandlers().put("option:enter", this); + ObjectDefinition.forId(13).getHandlers().put("option:climb-over", this); + ObjectDefinition.forId(15601).getHandlers().put("option:inspect", this); + for (int i = 15; i < 21; i++) { + ObjectDefinition.forId(i).getHandlers().put("option:inspect", this); + } + ObjectDefinition.forId(15596).getHandlers().put("option:take", this); + ObjectDefinition.forId(1).getHandlers().put("option:search", this); + UseWithHandler.addHandler(5, UseWithHandler.OBJECT_TYPE, new UseWithHandler(1) { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest(DwarfCannon.NAME); + if (quest.getStage(player) > 50) { + player.getDialogueInterpreter().sendDialogues(player, null, "This should work nicely now that I've fixed it."); + return true; + } + player.getConfigManager().set(1, 2041, true); + player.getConfigManager().set(0, 8, true); + player.getQuestRepository().getQuest(DwarfCannon.NAME).setStage(player, 60); + player.sendMessage("Well done! You've fixed the cannon! Better go and tell Captain Lawgof."); + /* + * Component component = new Component(409); + * component.setPlugin(new ToolKitHandler()); + * event.getPlayer().getConfigManager().set(1, 2016);//reset + * event.getPlayer().getInterfaceManager(). open(component); + */ + return true; + } + + }); + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest(DwarfCannon.NAME); + switch (node.getId()) { + case 3: + if (!node.getLocation().equals(new Location(3015, 3453, 0))) { + return DoorActionHandler.handleAutowalkDoor(player, node.asObject()); + } + if (quest.getStage(player) < 70) { + player.sendMessage("The door is locked."); + break; + } + return DoorActionHandler.handleAutowalkDoor(player, node.asObject()); + case 5: + if (quest.getStage(player) == 50) { + player.getDialogueInterpreter().sendDialogues(player, null, "I guess I'd better fix it with the toolkit I was given."); + break; + } else if (quest.getStage(player) > 50) { + player.getDialogueInterpreter().sendDialogues(player, null, "This should work nicely now that I've fixed it."); + break; + } + player.getDialogueInterpreter().sendDialogue("The Black Guard sent Lawgof this cannon to help defend the mines", "against the goblins."); + break; + case 2: + player.animate(Animation.create(845)); + player.teleport(new Location(2619, 9797, 0), 2); + break; + case 13: + ClimbActionHandler.climb(player, new Animation(828), new Location(2623, 3391, 0)); + break; + case 15601: + if (node.getId() != node.asObject().getWrapper().getId()) { + player.getDialogueInterpreter().sendDialogues(player, null, "I think I've already fixed this one."); + } + return true; + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + final int shift = 10 - (20 - node.getId()); + player.faceLocation(node.getLocation()); + player.getDialogueInterpreter().sendDialogue("The railing is broken and needs to be replaced."); + player.getDialogueInterpreter().addAction(new DialogueAction() { + @Override + public void handle(final Player player, int buttonId) { + if (quest.getStage(player) < 10) { + return; + } + if (!player.getInventory().contains(14, 1)) { + player.getDialogueInterpreter().sendDialogues(player, null, "I'm not going to be able to fix this without a new", "railing. Lawgof should have some spare ones."); + return; + } + player.sendMessage("You attempt to replace the broken railing..."); + if (!player.getInventory().contains(2347, 1)) { + player.sendMessage("You will need a hammer to fix the railings."); + return; + } + player.animate(Animation.create(4190)); + player.getPulseManager().run(new Pulse(1, player) { + int count; + boolean failed = RandomFunction.random(5) == 2; + + @Override + public boolean pulse() { + switch (++count) { + case 1: + if (RandomFunction.random(3) == 1) { + player.sendChat("Urrghh!"); + } + break; + case 3: + if (failed) { + player.sendChat("Ow!"); + player.getImpactHandler().manualHit(player, 2, HitsplatType.NORMAL); + } + break; + case 5: + if (failed) { + player.sendMessage("You accidentally crush your hand in the railing."); + return true; + } + player.getInventory().remove(new Item(14)); + player.sendMessage("The railing is now fixed."); + player.getConfigManager().set(1, player.getConfigManager().get(1) + (1 << shift), true); + if (player.getConfigManager().get(1) == 2016) { + player.getDialogueInterpreter().sendDialogues(player, null, "I've fixed all these railings now."); + } + return true; + } + return false; + } + + }); + } + }); + break; + case 15596: + if (player.hasItem(DwarfCannon.DWARF_REMAINS)) { + player.getDialogueInterpreter().sendDialogues(player, null, "What? Carrying one set of Dwarf remains is enough..."); + return true; + } + player.getDialogueInterpreter().sendDialogues(player, null, "I had better take these remains."); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + if (!player.getInventory().hasSpaceFor(DwarfCannon.DWARF_REMAINS)) { + return; + } + player.getConfigManager().set(0, 4); + player.getInventory().add(DwarfCannon.DWARF_REMAINS); + } + + }); + break; + case 1: + if (quest.getStage(player) != 30 || isSpawned()) { + player.sendMessage("You search the crate but find nothing."); + return true; + } + quest.setStage(player, 40); + player.getConfigManager().set(0, 6, true); + spawnLollk(player); + break; + } + return true; + } + + /** + * Spawns the lollk npc. + * @param player the player. + */ + private void spawnLollk(Player player) { + player.sendMessages("You search the crate...", "Inside you see a dwarf child, tied up!", "You untie the child."); + lollk.setInvisible(false); + lollk.sendChat("Hooray!"); + GameWorld.getPulser().submit(new Pulse(150, lollk) { + + @Override + public boolean pulse() { + lollk.setInvisible(true); + return true; + } + + }); + } + + /** + * Checks if lollk is spawned. + * @return {@code True} if so. + */ + private boolean isSpawned() { + if (lollk == null) { + lollk = NPC.create(207, new Location(2571, 9851, 0)); + lollk.init(); + lollk.setInvisible(true); + lollk.setWalks(false); + } + return !lollk.isInvisible(); + } + + @Override + public Location getDestination(Node node, Node n) { + if (n.getId() == 3) { + return DoorActionHandler.getDestination(node.asPlayer(), n.asObject()); + } else if (n.getId() == 15601) { + if (n.getLocation().equals(new Location(2565, 3456, 0))) { + return new Location(2566, 3456, 0); + } + } + return null; + } + + /** + * Handles the tool kit. + * @author Vexia + */ + public static final class ToolKitHandler extends ComponentPlugin { + + /** + * The selected tool. + */ + private Tool tool; + + /** + * The toggled parts. + */ + private boolean[] toggled = new boolean[3]; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(409).setPlugin(this); + return null; + } + + @Override + public boolean handle(final Player player, Component component, int opcode, int button, int slot, int itemId) { + Tool tool = Tool.forId(button); + if (tool != null) { + this.tool = tool.select(player); + return true; + } + if (this.tool == null) { + player.sendMessage("You need to select a tool first."); + return true; + } + Part part = Part.forId(button); + if (part == null) { + SystemLogger.logErr("Unhandled part id - " + button + "!"); + return true; + } + if (this.tool.getPart() != part) { + player.sendMessage("This is the wrong tool to fix this part."); + return true; + } + toggled[part.ordinal()] = !toggled[part.ordinal()]; + part.interact(player, this.tool, toggled[part.ordinal()]); + if (toggled[0] && toggled[1] && toggled[2]) { + player.lock(5); + player.getConfigManager().set(1, 2041, true); + player.getConfigManager().set(0, 8, true); + player.getQuestRepository().getQuest(DwarfCannon.NAME).setStage(player, 60); + player.sendMessage("Well done! You've fixed the cannon! Better go and tell Captain Lawgof."); + GameWorld.getPulser().submit(new Pulse(5, player) { + @Override + public boolean pulse() { + player.getInterfaceManager().close(); + return true; + } + }); + } + player.sendMessage("Interacting with a part. Toggled=" + toggled[part.ordinal()] + ", configVal=" + player.getConfigManager().get(1) + "."); + return true; + } + + /** + * A tool. + * @author Vexia + */ + public static enum Tool { + WRENCH(1, 2017, Part.GEAR), PLIERS(2, 2018, Part.SAFETY_SWITCH), HOOK(3, 2020, Part.SPRING); + + /** + * The button. + */ + private final int button; + + /** + * The config value. + */ + private final int configValue; + + /** + * The part the tool fixes. + */ + private final Part part; + + /** + * Constructs a new {@Code Tool} {@Code Object} + * @param button the button. + * @param configValue the config value. + * @param part the part to fix. + */ + private Tool(int button, int configValue, Part part) { + this.button = button; + this.configValue = configValue; + this.part = part; + } + + /** + * Selects a tool. + * @param player the player. + */ + public Tool select(Player player) { + player.getConfigManager().set(1, configValue); + return this; + } + + /** + * Gets a tool. + * @param id the id. + * @return the tool. + */ + public static Tool forId(int id) { + for (Tool tool : values()) { + if (tool.getButton() == id) { + return tool; + } + } + return null; + } + + /** + * Gets the button. + * @return the button + */ + public int getButton() { + return button; + } + + /** + * Gets the configValue. + * @return the configValue + */ + public int getConfigValue() { + return configValue; + } + + /** + * Gets the part. + * @return the part + */ + public Part getPart() { + return part; + } + + } + + /** + * A part of the cannon. + * @author Vexia + */ + public static enum Part { + SPRING(8, 2025), SAFETY_SWITCH(7, 2026), GEAR(9, 2036); + + /** + * The button of the part. + */ + private final int button; + + /** + * The config value. + */ + private final int configValue; + + /** + * Constructs a new {@Code Part} {@Code Object} + * @param button the button. + * @param configValue the config value. + */ + private Part(int button, int configValue) { + this.button = button; + this.configValue = configValue; + } + + /** + * Handles the interaction of a part. + * @param player the player. + * @param tool the tool. + * @param toggled if toggled on. + */ + public void interact(Player player, Tool tool, boolean toggled) { + player.getConfigManager().set(1, toggled ? getConfigValue() : tool.getConfigValue()); + } + + /** + * Gets the part. + * @param id the id. + * @return the part. + */ + public static Part forId(int id) { + for (Part part : values()) { + if (part.getButton() == id) { + return part; + } + } + return null; + } + + /** + * Gets the button. + * @return the button + */ + public int getButton() { + return button; + } + + /** + * Gets the configValue. + * @return the configValue + */ + public int getConfigValue() { + return configValue; + } + + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/LollkDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/LollkDialogue.java new file mode 100644 index 000000000..c1c00777d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/LollkDialogue.java @@ -0,0 +1,92 @@ +package core.game.content.quest.members.dwarfcannon; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Handles captains lawgof dialogue. + * @author Vexia + */ +public class LollkDialogue extends DialoguePlugin { + + /** + * The quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@Code LollkDialogue} {@Code Object} + */ + public LollkDialogue() { + /** + * empty + */ + } + + /** + * Constructs a new {@Code LollkDialogue} {@Code Object} + * @param player the player. + */ + public LollkDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LollkDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(DwarfCannon.NAME); + switch (quest.getStage(player)) { + case 40: + npc("Thank the heavens, you saved me!", "I thought I'd be goblin lunch for sure!"); + break; + default: + player.sendMessage("The dwarf doesn't seem interested in talking to you."); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 40: + switch (stage) { + case 0: + player("Are you ok?"); + stage++; + break; + case 1: + npc("I think so, I'd better run off home."); + stage++; + break; + case 2: + player("That's right, you get going. I'll catch up."); + stage++; + break; + case 3: + npc("Thanks again, brave adventurer."); + stage++; + break; + case 4: + npc.setInvisible(true); + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 207 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/NulodionDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/NulodionDialogue.java new file mode 100644 index 000000000..a2c1accd9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/dwarfcannon/NulodionDialogue.java @@ -0,0 +1,334 @@ +package core.game.content.quest.members.dwarfcannon; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Handles captains lawgof dialogue. + * @author Vexia + */ +public class NulodionDialogue extends DialoguePlugin { + + /** + * The cannon pieces. + */ + private static final Item[] CANNON_PIECES = new Item[] { new Item(6), new Item(8), new Item(10), new Item(12) }; + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@Code NulodionDialogue} {@Code Object} + */ + public NulodionDialogue() { + /** + * empty + */ + } + + /** + * Constructs a new {@Code NulodionDialogue} {@Code Object} + * @param player the player. + */ + public NulodionDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new NulodionDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(DwarfCannon.NAME); + switch (quest.getStage(player)) { + case 70: + player("Hello there."); + break; + default: + player("Hello again."); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 70: + switch (stage) { + case 0: + npc("Can I help you?"); + stage++; + break; + case 1: + player("Captain Lawgof sent me. He's having trouble with his", "cannon."); + stage++; + break; + case 2: + npc("Of course, we forgot to send the ammo mould!"); + stage++; + break; + case 3: + player("It fires a mould?"); + stage++; + break; + case 4: + npc("Don't be silly - the ammo's made by using a mould.", "Here, take these to him. The instructions explain", "everything."); + stage++; + break; + case 5: + player("That's great, thanks."); + stage++; + break; + case 6: + npc("Thank you, adventurer. The Dwarf Black Guard will", "remember this."); + stage++; + break; + case 7: + player.getConfigManager().set(0, 10); + quest.setStage(player, 80); + player.sendMessage("The Cannon Engineer gives you some notes and a mould."); + player.getInventory().add(DwarfCannon.NULODION_NOTES, player); + player.getInventory().add(DwarfCannon.MOULD, player); + end(); + break; + } + break; + case 80: + switch (stage) { + case 0: + if (!player.hasItem(DwarfCannon.NULODION_NOTES)) { + player("I've lost the notes."); + stage = 100; + break; + } + if (!player.hasItem(DwarfCannon.MOULD)) { + player("I've lost the cannonball mould."); + stage = 102; + break; + } + npc("So has the Captain figured out how to work the cannon", "yet?"); + stage++; + break; + case 1: + player("Not yet, but I'm sure he will."); + stage++; + break; + case 2: + npc("If you can get those items to him it'll be a great help."); + stage++; + break; + case 3: + end(); + break; + case 100: + npc("Here, take these..."); + stage++; + break; + case 101: + player.sendMessage("The Cannon Engineer gives you some more notes."); + player.getInventory().add(DwarfCannon.NULODION_NOTES, player); + end(); + break; + case 102: + npc("Deary me, you are trouble. Here, take this one."); + stage++; + break; + case 103: + player.sendMessage("The Cannon Engineer gives you another mould."); + player.getInventory().add(DwarfCannon.MOULD, player); + end(); + break; + } + break; + default: + switch (stage) { + case 0: + npc("Hello traveller, how's things?"); + stage++; + break; + case 1: + player("Not bad thanks, yourself?"); + stage++; + break; + case 2: + npc("I'm good, just working hard as usual..."); + stage++; + break; + case 3: + options("I was hoping you might sell a cannon?", "Well, take care of yourself then.", "I want to know more about the cannon.", "I've lost my cannon."); + stage++; + break; + case 4: + switch (buttonId) { + case 1: + player("I was hoping you might sell me a cannon?"); + stage = 10; + break; + case 2: + player("Well, take care of yourself then."); + stage = 20; + break; + case 3: + player("I want to know more about the cannon."); + stage = 30; + break; + case 4: + player("I've lost my cannon."); + stage = 40; + break; + } + break; + case 10: + npc("Hmmmmmmm..."); + stage++; + break; + case 11: + npc("I shouldn't really, but as you helped us so much, well, I", "could sort something out. I'll warn you though, they", "don't come cheap!"); + stage++; + break; + case 12: + player("How much?"); + stage++; + break; + case 13: + npc("For the full setup, 750,000 coins. Or I can sell you", "the separate parts... but it'll cost extra!"); + stage++; + break; + case 14: + player("That's not cheap!"); + stage++; + break; + case 15: + options("Okay, I'll take a cannon please.", "Can I look at the separate parts please?", "Sorry, that's too much for me.", "Have you any ammo or instructions to sell?"); + stage++; + break; + case 16: + switch (buttonId) { + case 1: + player("Okay, I'll take a cannon please."); + stage = 110; + break; + case 2: + player("Can I look at the separate parts please?"); + stage = 120; + break; + case 3: + player("Sorry, that's too much for me."); + stage = 130; + break; + case 4: + player("Have you any ammo or instructions to sell?"); + stage = 140; + break; + } + break; + case 20: + npc("Indeed I will adventurer."); + stage++; + break; + case 21: + end(); + break; + case 30: + npc("There's only so much I can tell you, adventurer.", "We've been working on this little beauty for some time", "now."); + stage++; + break; + case 31: + player("Is it effective?"); + stage++; + break; + case 32: + npc("In short bursts it's very effective, the most destructive", "weapon to date. The cannon automatically targets", "monsters close by. You just have to make the ammo", "and let rip."); + stage++; + break; + case 33: + end(); + break; + case 40: + npc("That's unfortunate... but don't worry, I can sort you", "out."); + stage++; + break; + case 41: + if (player.getSavedData().getActivityData().isLostCannon()) { + npc("There you go, take better care next time."); + stage = 43; + break; + } + npc("Oh dear, I'm only allowed to replace cannons that were", "stolen in reward. I'm sorry, but you'll have to buy a", "new set."); + stage++; + break; + case 43: + player.getSavedData().getActivityData().setLostCannon(false); + for (Item i : CANNON_PIECES) { + player.getInventory().add(i, player); + } + end(); + break; + case 42: + end(); + break; + case 110: + npc("Okay then, but keep it quiet... This thing's top secret!"); + stage++; + break; + case 111: + if (!player.getInventory().contains(995, 750000)) { + player("Oops, I don't have enough money."); + stage++; + break; + } + if (player.getInventory().remove(new Item(995, 750000))) { + for (Item i : CANNON_PIECES) { + player.getInventory().add(i, player); + } + } + npc("There you go adventurer, I hope you enjoy this", "fine work of craftsmanship."); + stage = 113; + break; + case 112: + npc("Sorry, I can't go any lower than that."); + stage++; + break; + case 113: + end(); + break; + case 120: + npc("Of course!"); + stage++; + break; + case 121: + end(); + npc.openShop(player); + break; + case 130: + npc("Fair enough, it's too much for most of us."); + stage++; + break; + case 131: + end(); + break; + case 140: + npc("Of course!"); + stage = 121; + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 209 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/BigDaveDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/BigDaveDialogue.java new file mode 100644 index 000000000..9623d5585 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/BigDaveDialogue.java @@ -0,0 +1,96 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; + + +/** + * Handles the SinisterStrangerDialogue dialogue. + * @author Woah + */ +@Initializable +public class BigDaveDialogue extends DialoguePlugin { + + public BigDaveDialogue(){ + //empty + } + + public BigDaveDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new BigDaveDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hey lad! Always nice to see a fresh face!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + + case 0: + interpreter.sendOptions("Choose an option:", "So you're the champ?", "Can I fish here instead of you?", "Do you have any tips for me?"); + stage++; + break; + + case 1: + switch (buttonId) { + case 1: + player("So you're the champ?"); + stage = 10; + break; + case 2: + player("Can I fish here instead of you?"); + stage = 20; + break; + case 3: + player("Do you have any tips for me?"); + stage = 30; + break; + } + break; + + + case 9: + end(); + break; + + case 10: + npc("That's right, lad!", "Ain't nobody better at fishing round here", "than me! That's for sure!"); + stage = 9; + break; + + case 20: + npc("Sorry lad! This is my lucky spot!"); + stage = 9; + break; + + case 30: + npc("Why would I help you? I wanna stay the best!", "I'm not givin' away my secrets like", "old Grandpa Jack does!"); + stage++; + break; + case 31: + player("Who's Grandpa Jack?"); + stage++; + break; + case 32: + npc("You really have no clue do you!", "He won this competition four years in a row!", "He lives in the house just outside the gate."); + stage = 9; + break; + + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{228}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/BonzoDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/BonzoDialogue.java new file mode 100644 index 000000000..f6d6665a9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/BonzoDialogue.java @@ -0,0 +1,146 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.node.entity.player.link.quest.QuestRepository; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; +import core.game.content.activity.ActivityManager; +import core.game.content.dialogue.DialoguePlugin; + + +@Initializable +public final class BonzoDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BonzoDialogue} {@code Object}. + */ + public BonzoDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BonzoDialogue} {@code Object}. + * @param player + */ + public BonzoDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + if(args.length < 2) { + if(player.getInventory().containsItem(FishingContest.FISHING_ROD)) { + npc("Roll up, roll up! Enter the great Hemenster", "Fishing Contest! Only 5gp entrance fee!"); + stage = 0; + } else { + npc("Sorry, lad, but you need a fishing","rod to compete."); + stage = 100; + } + } else { + npc("Ok folks, time's up! Let's see who caught","the biggest fish!"); + stage = 1000; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("I'll enter the competition please.", "No thanks, I'll just watch the fun."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("I'll enter the competition please."); + if (player.getAttribute("fishing_competition:garlic-stuffed", false)) { + stage = 50; + } else { + stage = 10; + } + break; + case 2: + player("No thanks, I'll just watch the fun."); + stage = 100; + break; + } + break; + case 10: + npc("Marvelous!"); + stage++; + break; + case 11: + if (player.getInventory().remove(new Item(995, 5))) { + stage = 20; + player.getDialogueInterpreter().sendDialogue("You pay Bonzo 5 coins"); + break; + } else { + player("I don't have the 5gp though..."); + stage++; + break; + } + case 12: + npc("No pay, no play."); + stage = 100; + break; + case 20: + npc("Ok, we've got all the fishermen! It's time", "to roll! Ok, nearly everyone is in their", "place already. You fish in the spot by the"); + stage++; + break; + case 21: + npc("willow tree, and the Sinister Stranger, you fish by the pipes."); + stage++; + break; + case 22: + player.getDialogueInterpreter().sendDialogue("Your fishing competition spot is by the willow tree."); + stage++; + break; + case 23: + ActivityManager.start(player, "Fishing Contest Cutscene", false); + end(); + break; + case 100: + end(); + break; + case 1000: + if (player.getInventory().containsItem(FishingContest.RAW_GIANT_CARP)) { + player("I have a fish."); + stage++; + } else { + npc("And our winner is... the stranger who", "was fishing over by the pipes!"); + stage = 100; + } + break; + case 1001: + player.getDialogueInterpreter().sendDialogue("You hand over your fish."); + stage++; + break; + case 1002: + npc("We have a new winner! The", "heroic-looking person who was fishing", "by the pipes has caught the biggest carp I've", "seen since Grandpa Jack used to compete!"); + stage++; + break; + case 1003: + player.getDialogueInterpreter().sendDialogue("You are given the Hemenester fishing trophy!"); + player.getInventory().add(FishingContest.FISHING_TROPHY); + player.getInventory().remove(FishingContest.RAW_GIANT_CARP); + player.getQuestRepository().setStage(QuestRepository.getQuests().get("Fishing Contest"),20); + stage = 100; + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new BonzoDialogue(player); + } + + @Override + public int[] getIds() { + return new int[] { 225 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/DwarfDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/DwarfDialogue.java new file mode 100644 index 000000000..1f3b66bc0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/DwarfDialogue.java @@ -0,0 +1,246 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; + +@Initializable +public class DwarfDialogue extends DialoguePlugin { + public DwarfDialogue(){ + //empty + } + public DwarfDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new DwarfDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int questStage = player.getQuestRepository().getStage("Fishing Contest"); + if((questStage < 20 && questStage > 0) && !player.getInventory().containsItem(FishingContest.FISHING_PASS)){ + player("I lost my fishing pass..."); + stage = 1000; + return true; + } + if(player.getInventory().containsItem(FishingContest.FISHING_TROPHY) && player.getAttribute("fishing_contest:won",false)){ + npc(FacialExpression.OLD_NORMAL,"Have you won yet?"); + stage = 2000; + return true; + } + if(player.getQuestRepository().getStage("Fishing Contest") >= 10 && !player.getAttribute("fishing_contest:won",false)){ + npc(FacialExpression.OLD_NORMAL,"Have you won yet?"); + stage = 1500; + return true; + } + if(player.getQuestRepository().getStage("Fishing Contest") == 100){ + npc(FacialExpression.OLD_NORMAL,"Welcome, oh great fishing champion!","Feel free to pop by and use","our tunnel any time!"); + stage = 2500; + return true; + } + npc(FacialExpression.OLD_NORMAL,"Hmph! What do you want?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch(stage){ + case 0: + player("I was wondering what was down that tunnel?"); + stage++; + break; + case 1: + npc(FacialExpression.OLD_NORMAL,"You can't go down there!"); + stage++; + break; + case 2: + options("I didn't want to anyway.","Why not?"); + stage++; + break; + case 3: + switch(buttonId){ + case 1: + player("I didn't want to anyway."); + stage = 10; + break; + case 2: + player("Why not?"); + stage = 21; + break; + } + break; + case 10: + npc(FacialExpression.OLD_NORMAL,"Good. Because you can't."); + stage++; + break; + case 11: + player("Because I don't want to."); + stage++; + break; + case 12: + npc(FacialExpression.OLD_NORMAL,"Because you can't. So that's fine."); + stage++; + break; + case 13: + player("Yes it is."); + stage++; + break; + case 14: + npc(FacialExpression.OLD_NORMAL,"Yes. Fine."); + stage++; + break; + case 15: + player("Absolutely."); + stage++; + break; + case 16: + npc(FacialExpression.OLD_NORMAL,"Well then."); + stage = 100; + break; + case 20: + player("Why not?"); + stage++; + break; + case 21: + npc(FacialExpression.OLD_NORMAL,"This is the home of the Mountain Dwarves.","How would you like it if I","wanted to take a shortcut through your home?"); + stage++; + break; + case 22: + options("Ooh... is this a short cut to somewhere?","Oh, sorry, I hadn't realized it was private.","If you were my friend I wouldn't mind it."); + stage++; + break; + case 23: + switch(buttonId) { + case 1: + player("Ooh... is this a short cut to somewhere?"); + stage = 30; + break; + case 2: + player("Oh, sorry, I hadn't realized it was private."); + stage = 40; + break; + case 3: + player("If you were my friend I wouldn't mind it."); + stage = 50; + break; + } + break; + case 30: + npc(FacialExpression.OLD_NORMAL,"Well, it is a lot easier to go this way", "to get past White Wolf Mountain than through", "those wolf filled passes."); + stage = 22; + break; + case 40: + npc(FacialExpression.OLD_NORMAL,"Well, it is."); + stage = 22; + break; + case 50: + npc(FacialExpression.OLD_NORMAL,"Yes, but I don't even know you."); + stage++; + break; + case 51: + player("Well, let's be friends!"); + stage++; + break; + case 52: + npc(FacialExpression.OLD_NORMAL,"I don't make friends easily.","People need to earn my trust first."); + stage++; + break; + case 53: + player("And how am I to do that?"); + stage++; + break; + case 54: + npc(FacialExpression.OLD_NORMAL,"My, we are the persistent one aren't we?","Well, there's a certain gold artefact we're after.","We dwarves are big fans of gold! This artefact","is the first prize at the Hemenster fishing competition."); + stage++; + break; + case 55: + npc(FacialExpression.OLD_NORMAL,"Fortunately we have acquired a pass to enter","that competition... Unfortunately Dwarves don't","make good fisherman. Okay, I entrust you with our","competition pass."); + stage++; + break; + case 56: + npc(FacialExpression.OLD_NORMAL,"Don't forget to take some gold","with you for the entrance fee."); + stage++; + break; + case 57: + player.getDialogueInterpreter().sendDialogue("You got the Fishing Contest Pass!"); + if(!player.getInventory().add(FishingContest.FISHING_PASS)){ + GroundItemManager.create(FishingContest.FISHING_PASS,player.getLocation()); + } + player.getQuestRepository().getQuest("Fishing Contest").start(player); + stage++; + break; + case 58: + npc(FacialExpression.OLD_NORMAL,"Go to Hemenster and do us proud!"); + stage = 100; + break; + case 100: + end(); + break; + case 1000: + npc(FacialExpression.OLD_NORMAL,"Hmm. It's a good job they sent us spares.","There you go. Try not to lose that one."); + player.getInventory().add(FishingContest.FISHING_PASS); + stage++; + break; + case 1001: + player("No, it takes preparation to win","fishing competitions."); + stage++; + break; + case 1002: + npc(FacialExpression.OLD_NORMAL,"Maybe that's where we are going wrong","when we try fishing?"); + stage++; + break; + case 1003: + player("Probably."); + stage++; + break; + case 1004: + npc(FacialExpression.OLD_NORMAL,"Maybe we should talk to that old Jack","fella near the competition, everyone","seems to be ranting about him."); + stage = 100; + break; + case 2000: + player("Yes, I have!"); + stage++; + break; + case 2001: + npc(FacialExpression.OLD_NORMAL,"Well done! That's brilliant, do you have","the trophy?"); + stage++; + break; + case 2002: + player("Yep, I have it right here!"); + stage++; + break; + case 2003: + npc(FacialExpression.OLD_NORMAL,"Oh, it's even more shiny and gold than","I thought possible..."); + stage++; + break; + case 2004: + player.getQuestRepository().getQuest("Fishing Contest").finish(player); + player.getInventory().remove(FishingContest.FISHING_TROPHY); + end(); + break; + case 1500: + player("No, I haven't."); + stage++; + break; + case 1501: + end(); + break; + case 2500: + player("Thanks, I think I will stop by."); + stage = 100; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {232,3679}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FenceInteraction.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FenceInteraction.java new file mode 100644 index 000000000..7e74f82da --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FenceInteraction.java @@ -0,0 +1,80 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.interaction.MovementPulse; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + +@Initializable +public class FenceInteraction extends PluginInteraction { + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[]{51}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.OBJECT); + return this; + } + + @Override + public boolean handle(Player player, Node node) { + player.getPulseManager().run(new MovementPulse(player, node.asObject().getLocation().transform(player.getLocation().getX() == node.getLocation().getX() ? 0 : -1, 0, 0)) { + @Override + public boolean pulse() { + GameWorld.getPulser().submit(new SqueezePulse(player)); + return true; + } + }, "movement"); + return true; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + public class SqueezePulse extends Pulse { + Player player; + Location start,end; + Animation walk; + public SqueezePulse(Player p){ + this.player = p; + if(player.getLocation().equals(Location.create(2661, 3500, 0))){ + start = Location.create(2661, 3500, 0); + end = Location.create(2662, 3500, 0); + } else { + start = Location.create(2662, 3500, 0); + end = Location.create(2661, 3500, 0); + } + walk = new Animation(2240); + } + int counter = 0; + + @Override + public boolean pulse() { + switch(counter++){ + case 0: + player.getAnimator().reset(); + player.lock(); + player.faceLocation(end); + break; + case 1: + player.getAnimator().animate(new Animation(2594)); + break; + case 2: + player.getProperties().setTeleportLocation(end); + player.getAnimator().animate(new Animation(2595)); + break; + case 4: + player.unlock(); + return true; + } + return false; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FishingContest.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FishingContest.java new file mode 100644 index 000000000..7b413d739 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FishingContest.java @@ -0,0 +1,63 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; + +@Initializable +public class FishingContest extends Quest { + public FishingContest(){super("Fishing Contest",62,61,1,11,0,1,5);} + public static final Item FISHING_ROD = new Item(307); + public static final Item FISHING_PASS = new Item(27); + public static final Item RED_VINE_WORM = new Item(25); + public static final Item RAW_GIANT_CARP = new Item(338); + public static final Item GIANT_CARP = new Item(337); + public static final Item FISHING_TROPHY = new Item(26); + public static final Item GARLIC = new Item(1550); + public static final Item SPADE = new Item(952); + + + @Override + public void drawJournal(Player player, int stage) { + int line = 11; + super.drawJournal(player, stage); + if(stage < 10) { + line(player, "I can start this quest by trying to take the !!shortcut??", line++); + line(player, "near !!White Wolf Mountain??", line++); + line(player,"I need level !!10 Fishing?? to start this quest.",line++,player.getSkills().getLevel(Skills.FISHING) >= 10); + } else if (stage >= 10){ + line(player,"The !!mountain Dwarves' home?? would be an ideal way to get across ",line++,stage >= 20); + line(player,"White Wolf Mountain safely. However, the Dwarves aren't too",line++, stage >= 20); + line(player,"fond of strangers. They will let you through if you can !!bring ",line++, stage >= 20); + line(player,"!!them a trophy.?? The trophy is the prize for the annual Hemenster",line++,stage >= 20); + line(player,"!!fishing competition.??",line++,stage >= 20); + if(stage == 20) + line(player,"I should return to !!Austri?? or !!Vestri??.",line++); + + if(stage >= 100){ + line(player,"!!QUEST COMPLETE",line++); + } + } + } + + @Override + public void finish(Player player) { + int ln = 10; + super.finish(player); + player.getPacketDispatch().sendItemZoomOnInterface(FISHING_TROPHY.getId(), 230, 277, 5); + drawReward(player,"1 Quest Point",ln++); + drawReward(player,"2437 Fishing XP.",ln++); + drawReward(player,"Access to the White Wolf Mountain shortcut.",ln); + player.removeAttribute("fishing_contest:garlic"); + player.removeAttribute("fishing_contest:won"); + player.removeAttribute("fishing_contest:pass-shown"); + player.getSkills().addExperience(Skills.FISHING,2437); + } + + @Override + public Quest newInstance(Object object) { + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FishingContestCutscene.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FishingContestCutscene.java new file mode 100644 index 000000000..e27104df7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FishingContestCutscene.java @@ -0,0 +1,189 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.interaction.MovementPulse; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; + +@Initializable +public class FishingContestCutscene extends CutscenePlugin { + + public final int S_STRANGER = 3678; + public final int BIG_DAVE = 228; + + public FishingContestCutscene(){super("Fishing Contest Cutscene");} + + public FishingContestCutscene(Player player){ + super("Fishing Contest Cutscene"); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new FishingContestCutscene(p); + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + NPC Bonzo = NPC.create(225,base.transform(17,45,0));//base.transform(145,45,0)); + NPC Stranger = NPC.create(S_STRANGER,base.transform(14,51,0)); + NPC Dave = NPC.create(BIG_DAVE,base.transform(9,34,0)); + Bonzo.init(); + Stranger.init(); + Dave.init(); + Bonzo.faceLocation(base.transform(16,45,0)); + Stranger.faceLocation(base.transform(13,51,0)); + Dave.faceLocation(base.transform(8,34,0)); + this.npcs.add(Bonzo); + this.npcs.add(Dave); + this.npcs.add(Stranger); + player.faceLocation(base.transform(6,43,0)); + return super.start(player, login, args); + } + + @Override + public void register() { + register(new ZoneBorders(2623, 3426,2644, 3448)); + super.register(); + } + + @Override + public void open() { + player.setAttribute("cutscene:original-loc", Location.create(2639, 3437, 0)); + player.setAttribute("real-end", Location.create(2639, 3437, 0)); + //PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraContext.CameraType.POSITION, player.getLocation().getX(), player.getLocation().getY(), 450, 1, 100)); + //PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraContext.CameraType.ROTATION, player.getLocation().getX() - 15, player.getLocation().getY() + -55, 450, 1, 100)); + if(player.getAttribute("fishing_contest:garlic",false)){ + NPC stranger = npcs.get(2); + stranger.sendChat("What is this smell??"); + GameWorld.getPulser().submit(new SwitchPulse()); + } else { + GameWorld.getPulser().submit(new FishingPulse()); + } + player.lock(); + } + + private class FishingPulse extends Pulse{ + int counter = 0; + @Override + public boolean pulse() { + switch(counter++){ + case 6: + for(NPC n : npcs){ + n.faceLocation(n.getLocation().transform(Direction.WEST,1)); + n.getAnimator().animate(new Animation(622)); + } + player.faceLocation(player.getLocation().transform(Direction.WEST,1)); + player.getAnimator().animate(new Animation(622)); + break; + case 12: + if(player.getAttribute("fishing_contest:garlic",false) && player.getInventory().containsItem(FishingContest.RED_VINE_WORM)){ + player.getInventory().remove(FishingContest.RED_VINE_WORM); + player.getInventory().add(FishingContest.RAW_GIANT_CARP); + player.setAttribute("/save:fishing_contest:won",true); + player.getWalkingQueue().setRunDisabled(false); + } + GameWorld.getPulser().submit(getEndPulse()); + break; + case 15: + GameWorld.getPulser().submit(new Pulse(){ + int counter = 0; + @Override + public boolean pulse() { + switch(counter++){ + case 2: + player.faceLocation(Location.create(2642, 3437, 0)); + break; + case 4: + player.getDialogueInterpreter().open(225,true,true); + return true; + } + return false; + } + }); + return true; + } + return false; + } + } + + @Override + public boolean leave(Entity e, boolean logout) { + return true;//super.leave(e, logout); + } + + @Override + public void stop(boolean fade) { + super.stop(fade); + } + + public class SwitchPulse extends Pulse{ + NPC stranger = npcs.get(2); + int counter = 0; + @Override + public boolean pulse() { + switch (counter++) { + case 1: + stranger.getPulseManager().run(new MovementPulse(stranger, base.getLocation().transform(8, 42, 0)) { + @Override + public boolean pulse() { + player.getWalkingQueue().setRunDisabled(true); + return true; + } + }, "movement"); + break; + case 12: + stranger.sendChat("You're switching with me. Go."); + break; + case 16: + player.getPulseManager().run(new MovementPulse(player, base.getLocation().transform(14, 51, 0)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogue("Your spot is now by the pipes."); + return true; + } + }, "movement"); + break; + case 22: + stranger.getPulseManager().run(new MovementPulse(stranger, base.getLocation().transform(7, 43, 0)) { + @Override + public boolean pulse() { + return true; + } + }, "movement"); + GameWorld.getPulser().submit(new FishingPulse()); + return true; + } + return false; + } + } + + + + @Override + public Location getStartLocation() { + return base.transform(7,43,0); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + region = DynamicRegion.create(10549); + setRegionBase(); + registerRegion(region.getId()); + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.java new file mode 100644 index 000000000..c425e1971 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/FishingSpotInteraction.java @@ -0,0 +1,72 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.interaction.MovementPulse; +import core.game.interaction.Option; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + +@Initializable +public class FishingSpotInteraction extends PluginInteraction { + @Override + public boolean handle(Player player, NPC npc, Option option) { + Location npc_loc = npc.getLocation(); + if(!player.getAttribute("fishing_contest:fee-paid",false)) { + if(npc_loc.equals(new Location(2637, 3444, 0))) { + player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 0)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogues(3677, FacialExpression.NEUTRAL, "I think you will find that is","my spot."); + return true; + } + }, "movement"); + return true; + } else if (npc_loc.equals(2630, 3435, 0)){ + player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 0)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogues(225, FacialExpression.NEUTRAL, "Hey, you need to pay to enter the", "competition first! Only 5gp entrance fee!"); + return true; + } + }, "movement"); + return true; + } else if (npc_loc.equals(Location.create(2632, 3427, 0))){ + player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 0)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogues(228, FacialExpression.NEUTRAL, "I think you will find that is my spot."); + return true; + } + }, "movement"); + return true; + } else if(npc_loc.equals(Location.create(2627,3415,0))) { + player.getPulseManager().run(new MovementPulse(player, npc.getLocation().transform(1, 0, 0)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogues(228, FacialExpression.NEUTRAL, "I think you will find that is my spot."); + return true; + } + }, "movement"); + return true; + } + } + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[]{309}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.NPC); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/ForesterDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/ForesterDialogue.java new file mode 100644 index 000000000..ae49b472e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/ForesterDialogue.java @@ -0,0 +1,43 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; + + +/** + * Handles the SinisterStrangerDialogue dialogue. + * @author Woah + */ +@Initializable +public class ForesterDialogue extends DialoguePlugin { + + public ForesterDialogue() { + //empty + } + + public ForesterDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new ForesterDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Yeah? What do you want?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + return true; + } + + @Override + public int[] getIds() { + return new int[] {231}; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.java new file mode 100644 index 000000000..f4d9a6cb4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/GarlicPipeInteraction.java @@ -0,0 +1,71 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.interaction.MovementPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.Items; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + +@Initializable +public class GarlicPipeInteraction extends PluginInteraction { + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[]{FishingContest.GARLIC.getId(),41}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.USEWITH); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.OBJECT); + return this; + } + + @Override + public boolean handle(Player player, NodeUsageEvent event) { + System.out.println("Trying to handle it"); + if(event.getUsed() instanceof Item && event.getUsedWith() instanceof GameObject){ + GameObject usedWith = event.getUsedWith().asObject(); + Item used = event.getUsedItem(); + + if(used.getId() == Items.GARLIC_1550 && usedWith.getId() == 41 && usedWith.getLocation().equals(Location.create(2638, 3446, 0)) && player.getQuestRepository().getStage("Fishing Contest") > 0){ + player.getPulseManager().run(new MovementPulse(player, usedWith.getLocation().transform(0, -1, 0)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogue("You stuff the garlic into the pipe."); + player.getInventory().remove(new Item(Items.GARLIC_1550)); + player.setAttribute("fishing_contest:garlic",true); + return true; + } + }, "movement"); + return true; + } + } + return false; + } + + @Override + public boolean handle(Player player, Node node) { + if(node instanceof GameObject){ + GameObject object = node.asObject(); + if(object.getId() == 41 && object.getLocation().equals(Location.create(2638, 3446, 0)) && player.getAttribute("fishing_contest:garlic",false)){ + player.getPulseManager().run(new MovementPulse(player, object.getLocation().transform(0, -1, 0)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogue("This is the pipe I stuffed that garlic into."); + return true; + } + }, "movement"); + return true; + } + } + return false; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/GateInteraction.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/GateInteraction.java new file mode 100644 index 000000000..76638f9c0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/GateInteraction.java @@ -0,0 +1,75 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.interaction.MovementPulse; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + +@Initializable +public class GateInteraction extends PluginInteraction { + + @Override + public boolean handle(Player player, Node node) { + switch(node.getId()){ + case 47: + case 48: + return handleGate(player,node); + case 52: + case 53: + return handleGruborGate(player,node); + } + return false; + } + + public boolean handleGate(Player player, Node node){ + if(!player.getAttribute("fishing_contest:pass-shown",false) || player.getQuestRepository().getStage("Fishing Contest") < 10) { + player.getPulseManager().run(new MovementPulse(player, node.asObject().getLocation().transform(1, 0, 0)) { + @Override + public boolean pulse() { + if(player.getQuestRepository().getStage("Fishing Contest") >= 10){ + player.sendMessage("You should give your pass to Morris."); + } else { + player.sendMessage("You need a fishing pass to fish here."); + } + return true; + } + }, "movement"); + return true; + } else { + if(!player.getInventory().containsItem(FishingContest.FISHING_ROD)){ + player.getDialogueInterpreter().sendDialogue("I should probably get a rod from","Grandpa Jack before starting."); + } + } + return false; + } + + public boolean handleGruborGate(Player player, Node node){ + if(node.getLocation().withinDistance(Location.create(2650, 3469, 0),4)) { + player.getPulseManager().run(new MovementPulse(player, node.asObject().getLocation().transform(0,-1 , 0)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogue("This gate is locked."); + return true; + } + }, "movement"); + return true; + } + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[]{47,48,52,53}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.OBJECT); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/JoshuaDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/JoshuaDialogue.java new file mode 100644 index 000000000..1bdf638a6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/JoshuaDialogue.java @@ -0,0 +1,96 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; + + +/** + * Handles the SinisterStrangerDialogue dialogue. + * @author Woah + */ +@Initializable +public class JoshuaDialogue extends DialoguePlugin { + + public JoshuaDialogue() { + //empty + } + + public JoshuaDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new JoshuaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Yeah? What do you want?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + + case 0: + interpreter.sendOptions("Choose an option:", "Um... nothing really...", "Can I fish here instead of you?", "Do you have any tips for me?"); + stage++; + break; + + case 1: + switch (buttonId) { + case 1: + player("Um... nothing really..."); + stage = 10; + break; + case 2: + player("Can I fish here instead of you?"); + stage = 20; + break; + case 3: + player("Do you have any tips for me?"); + stage = 30; + break; + } + break; + + + case 9: + end(); + break; + + case 10: + npc("Quit bugging me then, dude!", "I got me some fish to catch!"); + stage = 9; + break; + + case 20: + npc("nuh uh dude. Less talk, more fishing!"); + stage = 9; + break; + + case 30: + npc("Dude! Why should I help you?", "You like, might beat me!", "I'm not giving away my secrets like that", "dude Grandpa Jack does!"); + stage++; + break; + case 31: + player("Who's Grandpa Jack?"); + stage++; + break; + case 32: + npc("Who's Grandpa Jack you say!", "He won this competition four years in a row!", "He lives in the house just outside the gate."); + stage = 9; + break; + + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {229}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/MorrisDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/MorrisDialogue.java new file mode 100644 index 000000000..af0684b99 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/MorrisDialogue.java @@ -0,0 +1,79 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; + +@Initializable +public final class MorrisDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MorrisDialogue} {@code Object}. + */ + public MorrisDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MorrisDialogue} {@code Object}. + * @param player the player. + */ + public MorrisDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MorrisDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What are you sitting around here for?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm making sure only those with a competition pass enter", "the fishing contest."); + stage++; + break; + case 1: + if(player.getInventory().containsItem(FishingContest.FISHING_PASS)){ + player("I have one here..."); + stage++; + break; + } else { + end(); + break; + } + case 2: + player.getDialogueInterpreter().sendDialogue("You show Morris your pass."); + stage ++; + break; + case 3: + npc("Move on through. Talk to Bonzo","to enter the competition."); + player.setAttribute("/save:fishing_contest:pass-shown",true); + player.getInventory().remove(FishingContest.FISHING_PASS); + stage = 100; + break; + case 100: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 227 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/SinisterStrangerDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/SinisterStrangerDialogue.java new file mode 100644 index 000000000..ef09b148a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/SinisterStrangerDialogue.java @@ -0,0 +1,194 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; +import core.game.content.dialogue.DialoguePlugin; + +/** + * Handles the SinisterStrangerDialogue dialogue. + * @author Woah + */ + +@Initializable +public class SinisterStrangerDialogue extends DialoguePlugin { + + public SinisterStrangerDialogue() { + + } + + public SinisterStrangerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { return new SinisterStrangerDialogue(player); } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("..."); + return true; + } + + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Choose an option:", "...?", "Who are you?", "So... you like fishing?"); + stage++; + break; + + case 1: + switch (buttonId) { + case 1: + player("...?"); + stage = 10; + break; + case 2: + player("Who are you?"); + stage = 20; + break; + case 3: + player("So... you like fishing?"); + stage = 30; + break; + } break; + + case 2: + interpreter.sendOptions("Choose an option:", "You're a vampire aren't you?", "Is it nice there?", "So you like fishing?"); + stage++; + break; + + + case 3: + switch (buttonId) { + case 1: + player("You're a vampire aren't you?"); + stage = 21; + break; + case 2: + player("Is it nice there?"); + stage = 50; + break; + case 3: + player("So you like fishing?"); + stage = 30; + break; + } break; + + + case 4: + interpreter.sendOptions("Choose an option:", "You're a vampire aren't you?", "So you like fishing?", "Well, good luck with the fishing."); + stage++; + break; + + case 5: + switch (buttonId) { + case 1: + player("You're a vampire aren't you?"); + stage = 21; + break; + case 2: + player("So you like fishing?"); + stage = 30; + break; + case 3: + player("Well, good luck with the fishing."); + stage = 70; + break; + } break; + + case 6: + interpreter.sendOptions("Choose an option:", "You're a vampire aren't you?", "If you get thirsty you should drink something.", "Well, good luck with the fishing."); + stage++; + break; + + case 7: + switch (buttonId) { + case 1: + player("You're a vampire aren't you?"); + stage = 21; + break; + case 2: + player("If you get thirsty you should drink something."); + stage = 40; + break; + case 3: + player("Well, good luck with the fishing."); + stage = 70; + break; + } break; + + + case 9: + end(); + break; + + case 10: + npc("..."); + stage++; + break; + case 11: + player("......?"); + stage++; + break; + case 12: + npc("......"); + stage = 9; + break; + + case 20: + npc("My name is Vlad.", "I come from far avay,", "vere the sun iz not so bright."); + stage = 2; + break; + + case 21: + npc("Just because I can't stand ze smell ov garlic", "and I don't like bright sunlight doesn't", "necessarily mean I'm ein vampire!"); + stage = 9; + break; + + + case 30: + npc("My doctor told me to take up ein velaxing hobby.", "Vhen I am stressed I tend to get ein little"); + stage++; + break; + case 31: + npc("... thirsty."); + stage = 6; + break; + + case 40: + npc("I tsink I may do zat soon..."); + stage = 9; + break; + + + + case 50: + npc("It is vonderful!", "Zev omen are beautiful und ze nights are long!"); + stage = 4; + break; + + case 70: + npc("Luck haz notsing to do vith it.", "It is all in ze technique."); + stage = 9; + break; + + + + + + } + return true; + } + + + + + @Override + public int[] getIds() { + return new int[] { 3677 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/StairInteraction.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/StairInteraction.java new file mode 100644 index 000000000..1f5e00b31 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/StairInteraction.java @@ -0,0 +1,52 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.interaction.MovementPulse; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + +@Initializable +public class StairInteraction extends PluginInteraction { + @Override + public boolean handle(Player player, Node node) { + if(!player.getQuestRepository().isComplete("Fishing Contest")) { + GameObject object = node.asObject(); + switch (object.getId()) { + case 57: + handleStairs(player,232,object); + return true; + case 55: + handleStairs(player,3679,object); + return true; + } + } + return false; + } + + private void handleStairs(Player player,int npc_id,GameObject object){ + player.getPulseManager().run(new MovementPulse(player,object.getLocation().transform(0,2,0)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().open(npc_id,new NPC(npc_id)); + return true; + } + }, "movement"); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[]{57,55}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.OBJECT); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/VineInteraction.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/VineInteraction.java new file mode 100644 index 000000000..f096dd572 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/VineInteraction.java @@ -0,0 +1,51 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.interaction.MovementPulse; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + +@Initializable +public class VineInteraction extends PluginInteraction { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[]{58,2989,2990,2991,2992,2993,2994,2013}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.OBJECT); + return this; + } + + @Override + public boolean handle(Player player, Node node) { + if(node instanceof GameObject){ + GameObject obj = node.asObject(); + if(player.getQuestRepository().getStage("Fishing Contest") > 0 && player.getQuestRepository().getStage("Fishing Contest") < 100){ + player.getPulseManager().run(new MovementPulse(player, node.asObject().getLocation().transform(0, 0, 0)) { + @Override + public boolean pulse() { + if(player.getInventory().containsItem(FishingContest.SPADE)) { + player.getAnimator().animate(new Animation(830)); + player.getDialogueInterpreter().sendDialogue("You find some worms."); + player.getInventory().add(FishingContest.RED_VINE_WORM); + } else { + player.getDialogueInterpreter().sendDialogue("The ground looks promising around these vines.","Perhaps you should dig."); + } + return true; + } + }, "movement"); + return true; + } + } + return false; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/grandpaJack.java b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/grandpaJack.java new file mode 100644 index 000000000..cb2198ea6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/fishingcontest/grandpaJack.java @@ -0,0 +1,271 @@ +package core.game.content.quest.members.fishingcontest; + +import core.game.node.entity.npc.NPC; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; +import core.game.content.dialogue.DialoguePlugin; + +/** + * Represents the dialogue plugin used for the grandpaJack npc. + * @author Woah + * @note finish with fishing contests. + **/ +@Initializable +public final class grandpaJack extends DialoguePlugin { + + + + /** + * Constructs a new {@code grandpaJack} {@code Object}. + * @param player + */ + public grandpaJack(final Player player) { + super(player); + } + + /** + * Constructs a new {@code grandpaJack} {@code Object}. + */ + public grandpaJack() { + /** + * empty. + */ + } + + + @Override + public DialoguePlugin newInstance(Player player) { + return new grandpaJack(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hello young'on!", "Come to visit old Grandpa Jack? I can tell ye stories", " for sure. I used to be the best fisherman these parts", "have seen!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + + case 0: + interpreter.sendOptions("Choose an option:", "Tell me a story then.", "Are you entering the fishing competition?", "Sorry, I don't have time now.", "Can I buy one of your fishing rods?", "I've forgotten how to fish, can you remind me?"); + stage++; + break; + + case 1: + switch (buttonId) { + case 1: + player("Tell me a story then."); + stage = 10; + break; + case 2: + player("Are you entering the fishing competition?"); + stage = 20; + break; + case 3: + player("Sorry, I don't have time now."); + stage = 35; + break; + case 4: + player("Can I buy one of your fishing rods?"); + stage = 40; + break; + case 5: + player("I've forgotten how to fish, can you remind me?"); + stage = 50; + break; + } + break; + + case 4: + interpreter.sendOptions("Choose an option:", "I don't suppose you could give me any hints?", "That's less competition for me then."); + stage++; + break; + + case 5: + switch (buttonId) { + case 1: + player("I don't suppose you could give me any hints?"); + stage = 22; + break; + case 2: + player("That's less competition for me then."); + stage = 30; + break; + } + break; + + case 6: + interpreter.sendOptions("Choose an option:", "Very fair, I'll buy that rod!", "That's too rich for me, I'll go to Catherby."); + stage++; + break; + + case 7: + switch (buttonId) { + case 1: + player("Very fair, I'll buy that rod!"); + if(player.getInventory().containsItem(new Item(995,5))){ + stage = 42; + } else { + stage = 60; + } + break; + case 2: + player("That's too rich for me, I'll go to Catherby."); + stage = 44; + break; + } + break; + + + //CASE 9 is break + case 9: + end(); + break; + + + //Case 1 Option 1 - Tell me a story then. + case 10: + npc("Well, when I were a young man we used", "to take fishing trips over to Catherby.", "The fishing over there, now that was something!"); + stage++; + break; + case 11: + npc("Anyway, we decided to do a bit of fishing with our nets,", "I wasn't having the best of days turning up", "nothing but old boots and bits of seaweed."); + stage++; + break; + case 12: + npc("Then my net suddenly got really heavy!", "I pulled it up... To my amazement", "I'd caught this little chest thing!"); + stage++; + break; + case 13: + npc("Even more amazing was when I opened it", "it contained a diamond the size of a radish!", "That's the best catch I've ever had!"); + stage = 0; + break; + + + //Case 1 Option 2 - Are you entering the fishing competition? + case 20: + npc("Ah... the Hemenster fishing competition..."); + stage++; + break; + + case 21: + npc(" I know all about that... I won that four years straight!", "I'm too old for that lark now though..."); + stage = 4; + break; + + //Case 5 Option 1 - I don't suppose you could give me any hints? + case 22: + npc("Well, you sometimes get these really big fish in the", "water just by the outflow pipes."); + stage++; + break; + case 23: + npc("I think they're some kind of carp..."); + stage++; + break; + case 24: + npc("Try to get a spot round there. ", "The best sort of bait for them is red vine worms."); + stage++; + break; + case 25: + npc("I used to get those from McGrubor's wood, north of", "here. Just dig around in the red vines up there but be", "careful of the guard dogs."); + stage++; + break; + case 26: + player("There's this weird creepy guy who says he's not a", "vampire using that spot. He keeps winning too."); + stage++; + break; + case 27: + npc("Ahh well, I'm sure you'll find something to put him off.", "After all, there must be a kitchen around here with", "some garlic in it, perhaps in Seers Village or Ardougne.", "If he's pretending to be a vampire then he can pretend"); + stage++; + break; + case 28: + npc("to be scared of garlic!"); + stage++; + break; + case 29: + player("You're right! Thanks Jack!"); + stage = 9;//End + break; + + //Case 5 Option 2 - That's less competition for me then. + case 30: + npc("Why you young whippersnapper!", "If I was twenty years younger I'd show you something that's for sure!"); + stage = 0; + break; + + //Case 1 Option 3 - Sorry, I don't have time now. + case 35: + npc("Sigh... Young people - always in such a rush. "); + stage = 9; + break; + + //Case 1 Option 4 - Can I buy one of your fishing rods? + case 40: + npc("Of course you can young man. Let's see now...", "I think 5 gold is a fair price for a rod which" , "has won the Fishing contest before eh?"); + stage = 6; + break; + + //Case 7 Option 1 - Very fair, I'll buy that rod! (player has 5 gp) + case 42: + npc("Excellent choice!"); + player.getInventory().remove(new Item(995, 5)); + player.getInventory().add(FishingContest.FISHING_ROD, player);// + stage = 9; + break; + + + //Case 7 Option 2 - That's too rich for me, I'll go to Catherby. + case 44: + npc("If you're sure... passing up an opportunity of a lifetime you are."); + stage = 9; + break; + + //Case 1 Option 5 - I've forgotten how to fish, can you remind me? + case 50: + npc("Of course! Let me see now... You'll need a rod and bait.", "You can fish with a net too, but not in the competition."); + stage++; + break; + case 51: + player("Ok... I think I can get those in Catherby."); + stage++; + break; + case 52: + npc("Then simply find yourself a fishing spot, ", "either in the competition near here, or wherever you can.", "I recommend net fishing in Catherby."); + stage++; + break; + case 53: + npc("Net or Lure the fish in the fishing spot", "by clicking on it and then be patient..."); + stage++; + break; + case 54: + player("It's that simple?"); + stage++; + break; + case 55: + npc("Yep! Go get em tiger."); + stage = 0; + break; + + //Case 7 Option 1 - Very fair, I'll buy that rod! (not enough gp) + case 60: + player("I don't have enough money for that,", "I'll go get some and come back."); + stage++; + break; + case 61: + npc("Right you are. I'll be here. "); + stage = 9; + break; + } + return true; + } + + + @Override + public int[] getIds() { + return new int[] { 230 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/icthlarinslittlehelper/WandererDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/icthlarinslittlehelper/WandererDialogue.java new file mode 100644 index 000000000..660e1a777 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/icthlarinslittlehelper/WandererDialogue.java @@ -0,0 +1,49 @@ +package core.game.content.quest.members.icthlarinslittlehelper; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * @author Ethan Kyle Millard + * @since Tue, October 09, 2018 @ 9:02 PM + */ +public class WandererDialogue extends DialoguePlugin { + + public WandererDialogue() { + } + + public WandererDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WandererDialogue(player); + } + + @Override + public boolean open(Object... args) { + player ("Good day, wanderer."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage){ + case 0: + npc ("Hello to you too adventurer."); + next(); + break; + case 1: + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {}; + + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/junglepotion/JunglePotion.java b/Server/src/main/java/Server/core/game/content/quest/members/junglepotion/JunglePotion.java new file mode 100644 index 000000000..bc89700a1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/junglepotion/JunglePotion.java @@ -0,0 +1,271 @@ +package core.game.content.quest.members.junglepotion; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.herblore.Herbs; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.plugin.PluginManager; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +import core.game.content.quest.members.junglepotion.JunglePotionPlugin.JogreCavernDialogue; + +/** + * The main type or the jungle potion quest. + * @author Vexia + * + */ +@Initializable +public final class JunglePotion extends Quest { + + /** + * The name of the quest. + */ + public static final String NAME = "Jungle Potion"; + + /** + * Constructs a new {@code JunglePotion} {@code Object}. + */ + public JunglePotion() { + super(NAME, 81, 80, 1, 175, 0, 1, 12); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugin(new TrufitusDialogue()); + PluginManager.definePlugin(new JogreCavernDialogue()); + PluginManager.definePlugin(new JunglePotionPlugin()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + line(player, "I can start this quest by speaking to Trufitus Shakayawho lives in the main hut in Tai Bwo Wannaivillage on the island of Karamja.", 11); + break; + case 10: + case 20: + case 30: + case 40: + case 50: + JungleObjective objective = JungleObjective.forStage(stage); + if (player.getInventory().containsItem(objective.getHerb().getProduct())) { + line(player, "I spoke to Trufitus, he needs to commune with thegods, he's asked me to help him by collecting herbs.I picked some fresh " + objective.getName() + " for Trufitus.I need to give the " + objective.getName() + " to Trufitus.", 11); + return; + } + line(player, "I spoke to Trufitus, he needs to commune with thegods, he's asked me to help him by collecting herbs.I need to pick some fresh " + objective.getName() + " for Trufitus.", 11); + break; + case 60: + line(player, "I spoke to Trufitus, he needs to commune with thegods, he's asked me to help him by collecting herbs.I have given Trufitus Snakeweed, Ardrigal,Sito Foil, Volencia moss and Rogues purse.Trufitus needs to commune with the gods.I should speak to Trufitus.", 11); + break; + case 100: + line(player, "Trufitus Shakaya of the Tai Bwo Wannai village neededsome jungle herbs in order to make a potion which wouldhelp him commune with the gods. I collected five lotsof jungle herbs for him and he was able tocommune with the gods.As a reward he showed me some herblore techniques.QUEST COMPLETE!", 11); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8 + 2); + player.getPacketDispatch().sendString("775 Herblore XP", 277, 9 + 2); + player.getPacketDispatch().sendItemZoomOnInterface(Herbs.VOLENCIA_MOSS.getProduct().getId(), 235, 277, 3 + 2); + player.getSkills().addExperience(Skills.HERBLORE, 775); + player.getQuestRepository().syncronizeTab(player); + player.varpManager.get(534).setVarbit(15,2).setVarbit(18,2).setVarbit(21,2).setVarbit(24,2).setVarbit(12,2).send(player); + player.varpManager.flagSave(534); + } + + @Override + public int[] getConfig(Player player, int stage) { + if(stage == 0) return new int []{175,0}; + if(stage == 100) return new int [] {175,15}; + if(stage > 0) return new int [] {175,1}; + return new int [] {175,15}; + } + + /** + * An objective during the quest. + * @author Vexia + */ + public static enum JungleObjective { + JUNGLE_VINE(2575, Herbs.SNAKE_WEED, 10, "It grows near vines in an area to the south west where", "the ground turns soft and the water kisses your feet.") { + @Override + public void search(final Player player, final GameObject object) { + final Animation animation = Animation.create(2094); + player.animate(animation); + player.getPulseManager().run(new Pulse(animation.getDefinition().getDurationTicks(), player, object) { + @Override + public boolean pulse() { + boolean success = RandomFunction.random(3) == 1; + if (success) { + switchObject(object); + findHerb(player); + return true; + } + player.animate(animation); + return false; + } + }); + } + }, + PALM_TREE(2577, Herbs.ARDRIGAL, 20, "You are looking for Ardrigal. It is related to the palm", "and grows in its brothers shady profusion."), SITO_FOIL(2579, Herbs.SITO_FOIL, 30, "You are looking for Sito Foil, and it grows best where", "the ground has been blackened by the living flame."), VOLENCIA_MOSS(2581, Herbs.VOLENCIA_MOSS, 40, "You are looking for Volencia Moss. It clings to rocks", "for its existence. It is difficult to see, so you must", "search for it well."), ROGUES_PURSE(32106, Herbs.ROGUES_PUSE, 50, "It inhabits the darkness of the underground, and grows", "in the caverns to the north. A secret entrance to the", "caverns is set into the northern cliffs, be careful Bwana.") { + @Override + public void search(final Player player, final GameObject object) { + final Animation animation = Animation.create(2097); + player.animate(animation); + player.getPulseManager().run(new Pulse(animation.getDefinition().getDurationTicks(), player, object) { + @Override + public boolean pulse() { + boolean success = RandomFunction.random(4) == 1; + if (success) { + switchObject(object); + findHerb(player); + return true; + } + player.animate(animation, 1); + return false; + } + }); + } + }; + + /** + * The object id. + */ + private final int objectId; + + /** + * The herb. + */ + private final Herbs herb; + + /** + * The stage required to search this. + */ + private final int stage; + + /** + * The objective clue. + */ + private final String[] clue; + + /** + * Constructs a new {@code Searchable} {@code Object}. + * @param objectId the object id. + * @param herb the herb. + * @param stage the stage.. + */ + private JungleObjective(int objectId, Herbs herb, int stage, final String... clue) { + this.objectId = objectId; + this.herb = herb; + this.stage = stage; + this.clue = clue; + } + + /** + * Handles the search function of the objective. + * @param player the player. + * @param object the object. + */ + public void search(final Player player, final GameObject object) { + findHerb(player); + switchObject(object); + } + + /** + * Switches the object's id. + * @param object the object. + */ + public void switchObject(GameObject object) { + if (object.isActive()) { + ObjectBuilder.replace(object, object.transform(object.getId() + 1), 80); + } + } + + /** + * Finds a herb. + * @param player the player. + */ + public void findHerb(final Player player) { + player.getInventory().add(getHerb().getHerb()); + player.getDialogueInterpreter().sendItemMessage(getHerb().getHerb(), "You find a herb."); + } + + /** + * Gets the jungle objective. + * @param stage the stage. + * @return the objective. + */ + public static JungleObjective forStage(int stage) { + for (JungleObjective o : values()) { + if (o.getStage() == stage) { + return o; + } + } + return null; + } + + /** + * Gets a searchable by the object id. + * @param objectId the object id. + * @return the searchable. + */ + public static JungleObjective forId(int objectId) { + for (JungleObjective s : values()) { + if (s.getObjectId() == objectId) { + return s; + } + } + return null; + } + + /** + * Gets the name of the herb objective. + * @return the name. + */ + public String getName() { + return StringUtils.formatDisplayName(herb.getProduct().getName().replace("Clean", "").trim()); + } + + /** + * Gets the objectId. + * @return The objectId. + */ + public int getObjectId() { + return objectId; + } + + /** + * Gets the herb. + * @return The herb. + */ + public Herbs getHerb() { + return herb; + } + + /** + * Gets the stage. + * @return The stage. + */ + public int getStage() { + return stage; + } + + /** + * Gets the clue. + * @return The clue. + */ + public String[] getClue() { + return clue; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/junglepotion/JunglePotionPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/junglepotion/JunglePotionPlugin.java new file mode 100644 index 000000000..7169447f8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/junglepotion/JunglePotionPlugin.java @@ -0,0 +1,160 @@ +package core.game.content.quest.members.junglepotion; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.plugin.Plugin; + +import core.game.content.quest.members.junglepotion.JunglePotion.JungleObjective; + +/** + * Handles any interactions of the jungle potion quest. + * @author Vexia + */ +public final class JunglePotionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2584).getHandlers().put("option:search", this); + ObjectDefinition.forId(2585).getHandlers().put("option:climb", this); + for (JungleObjective s : JungleObjective.values()) { + ObjectDefinition.forId(s.getObjectId()).getHandlers().put("option:search", this); + } + ObjectBuilder.add(new GameObject(2585, Location.create(2828, 9522, 0), 8, 0)); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest(JunglePotion.NAME); + switch (node.getId()) { + case 2584: + player.getDialogueInterpreter().open("jogre_dialogue"); + return true; + case 2585: + player.getDialogueInterpreter().open("jogre_dialogue", true, true); + return true; + } + switch (option) { + case "search": + search(player, quest, (GameObject) node, JungleObjective.forId(node.getId())); + break; + } + return true; + } + + /** + * Searches an object for a herb. + * @param player the player. + * @param quest the quest. + * @param object the object. + * @param objective the searchable. + */ + private void search(final Player player, Quest quest, final GameObject object, final JungleObjective objective) { + if (quest.getStage(player) < objective.getStage()) { + player.sendMessage("Unfortunately, you find nothing of interest."); + return; + } + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("You don't have enough inventory space."); + return; + } + player.sendMessage("You search the " + object.getName().toLowerCase() + "..."); + objective.search(player, object); + } + + @Override + public Location getDestination(Node n, Node node) { + if (node.getId() == 2585) { + return Location.create(2830, 9521, 0); + } + return null; + } + + /** + * Handles the jogre cavern dialogue. + * @author Vexia + */ + public static final class JogreCavernDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code JogreCavernDialogue} {@code Object}. + */ + public JogreCavernDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JogreCavernDialogue} {@code Object}. + * @param player the player. + */ + public JogreCavernDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JogreCavernDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length > 1) { + interpreter.sendDialogue("You attempt to climb the rocks back out."); + stage = 13; + return true; + } + interpreter.sendDialogue("You search the rocks... You find an entrance into some caves."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes, I'll enter the cave.", "No thanks, I'll give it a miss."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogue("You decide to enter the caves. You climb down several steep rock", "faces into the cavern below."); + stage = 10; + break; + case 2: + interpreter.sendDialogue("You decide to stay where you are!"); + stage = 11; + break; + } + break; + case 10: + end(); + player.getProperties().setTeleportLocation(Location.create(2830, 9520, 0)); + break; + case 11: + end(); + break; + case 13: + end(); + player.getProperties().setTeleportLocation(Location.create(2823, 3120, 0)); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("jogre_dialogue") }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/junglepotion/TrufitusDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/junglepotion/TrufitusDialogue.java new file mode 100644 index 000000000..05864a255 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/junglepotion/TrufitusDialogue.java @@ -0,0 +1,365 @@ +package core.game.content.quest.members.junglepotion; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +import core.game.content.quest.members.junglepotion.JunglePotion.JungleObjective; + +/** + * Handles the trufitus dialogue. + * + * @author Vexia + */ +public final class TrufitusDialogue extends DialoguePlugin { + + /** + * The objective. + */ + private JungleObjective objective; + + /** + * The quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code TrufitusDialogue} {@code Object}. + */ + public TrufitusDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TrufitusDialogue} {@code Object}. + * + * @param player the player. + */ + public TrufitusDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TrufitusDialogue(player); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest(JunglePotion.NAME); + switch (quest.getStage(player)) { + case 0: + npc("Greetings Bwana! I am Trufitus Shakaya of the Tai", "Bwo Wannai village."); + break; + case 10: + case 20: + case 30: + case 40: + case 50: + objective = JungleObjective.forStage(quest.getStage(player)); + npc("Hello, Bwana, do you have the " + objective.getName() + "?"); + break; + case 60: + interpreter.sendDialogue("Trufitus shows you some techniques in Herblore. You gain some", "experience in Herblore."); + break; + case 100: + if (!player.getAttribute("trufitus-post-jp", false)) { + npc("My greatest respect Bwana, I have communed with", "my gods and the future"); + player.setAttribute("/save:trufitus-post-jp", true); + stage = 0; + } else { + player("Hello Bwana!"); + stage = 10; + } + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 0: + switch (stage) { + case 0: + npc("Welcome to our humble village."); + stage++; + break; + case 1: + options("What does Bwana mean?", "Tai Bwo Wannai? What does that mean?", "It's a nice village, where is everyone?"); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + player("What does Bwana mean?"); + stage = 10; + break; + case 2: + player("Tai Bwo Wannai? What does that mean?"); + stage = 20; + break; + case 3: + player("It's a nice village, where is everyone?"); + stage = 30; + break; + } + break; + case 10: + npc("Gracious sir, it means friend. And friends come in", "peace. I assume that you come in peace?"); + stage++; + break; + case 11: + player("Yes, of course I do."); + stage++; + break; + case 12: + npc("Well, that is good news, as I have a proposition for", "you."); + stage++; + break; + case 13: + player("A proposition eh? Sounds interesting!"); + stage++; + break; + case 14: + npc("I hoped you would think so. My people are afraid to", "stay in the village."); + stage++; + break; + case 15: + npc("They have returned to the jungle and I need to", "commune with the gods"); + stage++; + break; + case 16: + npc("to see what fate befalls us. You can help me by", "collecting some herbs that I need."); + stage++; + break; + case 17: + player("Me? How Can I help?"); + stage = 33; + break; + case 20: + npc("it means 'small clearing in the jungle' but it is now the", "name of our village."); + stage++; + break; + case 21: + player("It's a nice village, where is everyone?"); + stage = 30; + break; + case 30: + npc("My people are afraid to stay in the village. They have", "returned to the jungle. I need to commune with the", "gods to see what fate befalls us."); + stage++; + break; + case 31: + npc("You may be able to help with this."); + stage++; + break; + case 32: + player("Me? How Can I help?"); + stage++; + break; + case 33: + npc("I need to make a special brew! A potion that helps", "to commune with the gods. For this potion, I need", "special herbs, that are only found deep in the jungle."); + stage++; + break; + case 34: + npc("I can only guide you so far as the herbs are not easy", "to find. With some luck, you will find each herb in turn", "and bring it to me. I will then give you details of where", "to find the next herb."); + stage++; + break; + case 35: + npc("In return for this great favour I will give you training", "in Herblore."); + stage++; + break; + case 36: + player("It sounds like just the challenge for me. And it would", "make a nice break from killing things!"); + stage++; + break; + case 37: + npc("That is excellent Bwana! The first herb that you need", "to gather is called"); + stage++; + break; + case 38: + npc("Snake Weed."); + stage++; + break; + case 39: + npc("It grows near vines in an area to the south west where"); + stage++; + break; + case 40: + npc("the ground turns soft and the water kisses your feet."); + stage++; + break; + case 41: + quest.start(player); + end(); + break; + } + break; + case 10: + case 20: + case 30: + case 40: + case 50: + switch (stage) { + case 0: + options("Of course!", "Not yet, sorry, what's the clue again?"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Of course!"); + stage = 10; + break; + case 2: + player("Not yet, sorry, what's the clue again?"); + stage = 20; + break; + } + break; + case 10: + if (!player.getInventory().containsItem(objective.getHerb().getProduct())) { + npc("Please, don't try to deceive me."); + stage = 11; + } else { + if (player.getInventory().remove(objective.getHerb().getProduct())) { + quest.setStage(player, quest.getStage(player) + 10); + interpreter.sendItemMessage(objective.getHerb().getProduct(), "You give the " + objective.getName() + " to Trufitus."); + stage = 50; + } + } + break; + case 11: + npc("I really need that " + objective.getName() + " if I am to make this", "potion."); + stage++; + break; + case 12: + end(); + break; + case 20: + npc(objective.getClue()); + stage = 11; + break; + case 50: + objective = JungleObjective.forStage(quest.getStage(player)); + switch (quest.getStage(player)) { + case 20: + npc("Great, you have the Snake Weed! Many thanks. Ok,", "the next herb is called " + objective.getName() + ". It is related to the palm", "and crows to the east in its brother's shady profusion."); + stage = 200; + break; + case 30: + npc("Great, you have the Ardrigal! Many thanks."); + stage = 300; + break; + case 40: + npc("Well done Bwana, just two more herbs to collect."); + stage = 400; + break; + case 50: + npc("Ah Volencia Moss, beautiful. One final herb and the", "potion will be complete."); + stage = 500; + break; + } + break; + case 200: + npc("To the east you will find a small peninsula, it is just", "after the cliffs come down to meet the sands, here is", "where you should search for it."); + ; + stage++; + break; + case 201: + end(); + break; + case 300: + npc("You are doing well Bwana. The next herb is called Sito", "Foil, and it grows best where the ground has been", "blackened by the living flame."); + stage++; + break; + case 301: + end(); + break; + case 400: + npc("The next herb is called Volencia Moss. It clings to", "rocks for its existence. It is difficult to see, so you", "must search for it well."); + stage++; + break; + case 401: + npc("It prefers rocks of high metal content and a frequently", "disturbed environment. There is some, I believe to the", "south east of this village."); + stage++; + break; + case 402: + end(); + break; + case 500: + npc("This is the most difficult to find as it is inhabits the", "darkness of the underground. It is called Rogues", "Purse, and is only to be found in caverns"); + stage++; + break; + case 501: + npc("in the northern part of this island. A secret entrance to", "the caverns is set int the northern cliffs of this land.", "Take care Bwana as it may be dangerous."); + stage++; + break; + case 502: + end(); + break; + } + break; + case 60: + switch (stage) { + case 50: + npc("Most excellent Bwana! You have returned all the herbs", "to me and, I can finish the preparations for the potion,", "and at last divine with the gods."); + stage = 600; + break; + case 600: + npc("Many blessings on you! I must now prepare, please", "excuse me while I make the arrangements."); + stage = -1; + break; + case -1: + interpreter.sendDialogue("Trufitus shows you some techniques in Herblore. You gain some", "experience in Herblore."); + stage++; + break; + case 0: + quest.finish(player); + end(); + break; + } + break; + case 100: + switch (stage) { + case 0: + npc("looks good for my people. We are happy now that the", "gods are not angry with us."); + stage++; + break; + case 1: + npc("With some blessings we will be safe here."); + stage++; + break; + case 2: + npc("You should deliver the good news to Bwana Timfraku,", "Chief of Tai Bwo Wannai. He lives in a raised hut not", "far from here."); + stage++; + break; + case 3: + end(); + break; + case 10: + npc("Greetings! I hope things are going well for you now.", "I have no new information since we last spoke."); + stage++; + break; + case 11: + npc("Needless to say, that if something does come up I", "will certainly get in touch directly."); + stage = 3; + break; + } + break; + } + return true; + } + //merlin + //ptreas + //prince alli + //roving elves + + @Override + public int[] getIds() { + return new int[]{740}; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/lostcity/DramenStaffPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/DramenStaffPlugin.java new file mode 100644 index 000000000..6dba562c5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/DramenStaffPlugin.java @@ -0,0 +1,49 @@ +package core.game.content.quest.members.lostcity; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Handles the dramen staff cutting plugin. + * @author Vexia + */ +public final class DramenStaffPlugin extends UseWithHandler { + + /** + * The dramen branch item. + */ + private static final Item DRAMEN_BRANCH = new Item(771); + + /** + * The dramen staff item. + */ + private static final Item DRAMEN_STAFF = new Item(772); + + /** + * Constructs a new {@code DramenStaffPlugin} {@code Object}. + */ + public DramenStaffPlugin() { + super(DRAMEN_BRANCH.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(946, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(DRAMEN_BRANCH)) { + player.getInventory().add(DRAMEN_STAFF); + player.getPacketDispatch().sendMessage("You carve the branch into a staff."); + } + player.lock(1); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/lostcity/LostCity.java b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/LostCity.java new file mode 100644 index 000000000..dfa33a0a0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/LostCity.java @@ -0,0 +1,104 @@ +package core.game.content.quest.members.lostcity; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * The main type for the lost city Quest. + * @author Vexia + * @author Aero + */ +@Initializable +public class LostCity extends Quest { + + /** + * The requirement titles. + */ + private static final String[] TITLES = new String[] { "Level 31 Crafting", "Level 36 Woodcutting" }; + + /** + * The dramen staff item. + */ + private static final Item DRAMEN_STAFF = new Item(772); + + /** + * The quest requirements. + */ + private boolean[] questRequirements = new boolean[2]; + + /** + * Constructs a new {@code LostCity} {@code Object}. + */ + public LostCity() { + super("Lost City", 83, 82, 3, 147, 0, 1, 6); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + line(player, BLUE + "I can start this quest by speaking to the Adventurers in", 4+ 7); + line(player, BLUE + "the Swamp just south of Lumbridge.", 5+ 7); + drawQuestRequirements(player); + break; + case 10: + line(player, "According to one of the adventurers in Lumbridge Swamp

the entrance to Zanaris is somewhere around there.

Apparently there is a leprechaun hiding in a tree nearby

who can tell me how to enter the Lost City of Zanaris", 4+ 7); + break; + case 20: + line(player, "According to one of the adventurers in Lumbridge Swamp

the entrance to Zanaris is somewhere around there.

I found the Leprechaun hiding in a nearby tree.

He told me that the entrance to Zanaris is in the shed in

Lumbridge swamp but only if I am carrying a Dramen Staff

I can find a Dramen Tree in a cave on Entrana somewhere", 4+ 7); + break; + case 21: + if (player.getBank().containsItem(DRAMEN_STAFF) || player.getInventory().containsItem(DRAMEN_STAFF) || player.getEquipment().containsItem(DRAMEN_STAFF)) { + line(player, "According to one of the adventurers in Lumbridge Swamp

the entrance to Zanaris is somewhere around there.

I found the Leprechaun hiding in a nearby tree.

He told me that the entrance to Zanaris is in the shed in

Lumbridge swamp but only if I am carrying a Dramen Staff.

The Dramen Tree was guarded by a powerful Tree Spirit.

I cut a branch from the tree and crafted a Dramen Staff.

I should enter Zanaris by going to the shed in Lumbridge

Swamp while keeping the Dramen staff with me", 4+ 7); + } else { + line(player, "According to one of the adventurers in Lumbridge Swamp

the entrance to Zanaris is somewhere around there.

I found the Leprechaun hiding in a nearby tree.

He told me that the entrance to Zanaris is in the shed in

Lumbridge swamp but only if I am carrying a Dramen Staff.

The Dramen Tree was guarded by a powerful Tree Spirit.

With the Spirit defeated I can cut a branch from the tree", 4+ 7); + } + break; + case 100: + line(player, "According to one of the adventurers in Lumbridge Swamp

the entrance to Zanaris is somewhere around there.

I found the Leprechaun hiding in a nearby tree.

He told me that the entrance to Zanaris is in the shed in

Lumbridge swamp but only if I am carrying a Dramen Staff.

The Dramen Tree was guarded by a powerful Tree Spirit.

I cut a branch from the tree and crafted a Dramen Staff.

With the mystical Dramen Staff in my possession I was

able to enter Zanaris through the shed in Lumbridge

swamp.


QUEST COMPLETE!", 4+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("3 Quest Points", 277, 8+ 2); + player.getPacketDispatch().sendString("Access to Zanaris", 277, 9+ 2); + player.getPacketDispatch().sendItemZoomOnInterface(772, 235, 277, 3+ 2); + player.getQuestRepository().syncronizeTab(player); + } + + /** + * Draws the quest requirements onto the journal component. + * @param player The player to draw the requirements for. + */ + private final void drawQuestRequirements(final Player player) { + int line = 7 + 7; + questRequirements[0] = player.getSkills().getStaticLevelByExperience(Skills.CRAFTING) > 30; + questRequirements[1] = player.getSkills().getStaticLevelByExperience(Skills.WOODCUTTING) > 35; + line(player, BLUE + "To complete this quest I will need:", 6); + for (int i = 0; i < questRequirements.length; i++) { + boolean bool = !questRequirements[i]; + String str = TITLES[i]; + line(player, (bool ? RED + str : str), line++, !bool); + } + line(player, BLUE + "and be able to defeat a " + RED + "Level 101 Spirit without weapons", line++); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugin(new LostCityPlugin()); + PluginManager.definePlugin(new TreeSpiritNPC()); + PluginManager.definePlugin(new ShamusDialogue()); + PluginManager.definePlugin(new WarriorDialogue()); + PluginManager.definePlugin(new DramenStaffPlugin()); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/lostcity/LostCityPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/LostCityPlugin.java new file mode 100644 index 000000000..f60b25749 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/LostCityPlugin.java @@ -0,0 +1,164 @@ +package core.game.content.quest.members.lostcity; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.action.DoorActionHandler; +import core.game.content.global.action.EquipHandler; +import core.game.node.entity.skill.gather.GatheringSkillPulse; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Handles the lost city quest. + * @author Vexia + */ +public final class LostCityPlugin extends OptionHandler { + + /** + * The dramen staff item. + */ + private static final Item DRAMEN_STAFF = new Item(772); + + /** + * The shamus npc. + */ + public static NPC SHAMUS; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(1305).getHandlers().put("option:wield", this); + ItemDefinition.forId(1215).getHandlers().put("option:wield", this); + ItemDefinition.forId(1231).getHandlers().put("option:wield", this); + ItemDefinition.forId(5680).getHandlers().put("option:wield", this); + ObjectDefinition.forId(2409).getHandlers().put("option:chop", this); + ObjectDefinition.forId(2406).getHandlers().put("option:open", this); + ObjectDefinition.forId(1292).getHandlers().put("option:chop down", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Lost City"); + switch (node.getId()) { + case 2409: + handleShamusTree(player, quest); + break; + case 1292: + if (SkillingTool.getHatchet(player) == null) { + player.getPacketDispatch().sendMessage("You do not have an axe which you have the level to use."); + return true; + } + if (quest.getStage(player) < 20) { + return true; + } + if (quest.getStage(player) == 20) { + if (player.getAttribute("treeSpawned", false)) { + return true; + } + TreeSpiritNPC spirit = (TreeSpiritNPC) TreeSpiritNPC.create(655, Location.create(2862, 9734, 0)); + spirit.setPlayer(player); + spirit.setRespawn(false); + spirit.init(); + spirit.attack(player); + player.setAttribute("treeSpawned", true); + spirit.sendChat("You must defeat me before touching the tree!"); + return true; + } + player.getPulseManager().run(new GatheringSkillPulse(player, (GameObject) node)); + break; + case 2406: + final boolean dramenTeleport = player.getEquipment().containsItem(DRAMEN_STAFF) && quest.getStage(player) > 20 && player.getLocation().getX() <= 3201; + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + if (dramenTeleport) { + player.getPacketDispatch().sendMessage("The world starts to shimmer..."); + player.getTeleporter().send(Location.create(2452, 4473, 0), TeleportType.FAIRY_RING); + } + break; + case 1305: + case 1215: + case 1231: + case 5680: + if (!player.getQuestRepository().isComplete("Lost City")) { + player.getPacketDispatch().sendMessage("You need to have completed the Lost City quest in order to wield that weapon."); + return true; + } + return EquipHandler.SINGLETON.handle(player, node, option); + } + return true; + } + + /** + * Handles the shamus tree interaction. + * @param player the player. + * @param quest the quest. + */ + private void handleShamusTree(Player player, Quest quest) { + if (SkillingTool.getHatchet(player) == null) { + player.getPacketDispatch().sendMessage("You do not have an axe which you have the level to use."); + return; + } + if (SHAMUS == null) { + initializeShamus(); + } + if (SHAMUS.isInvisible()) { + showShamus(); + return; + } + player.getDialogueInterpreter().sendDialogues(SHAMUS, FacialExpression.FURIOUS, "Hey! Yer big elephant! Don't go choppin' down me", "house, now!"); + } + + /** + * Shows the shamus npc. + */ + private void showShamus() { + if (SHAMUS == null) { + initializeShamus(); + } + SHAMUS.setInvisible(false); + SHAMUS.getProperties().setTeleportLocation(SHAMUS.getProperties().getSpawnLocation()); + GameWorld.getPulser().submit(new Pulse(100, SHAMUS) { + @Override + public boolean pulse() { + if (SHAMUS.getDialoguePlayer() != null) { + return false; + } + SHAMUS.setInvisible(true); + return true; + } + }); + } + + /** + * Initializes the shamus npc. + */ + private void initializeShamus() { + if (SHAMUS == null) { + SHAMUS = NPC.create(654, Location.create(3138, 3211, 0)); + } + SHAMUS.init(); + SHAMUS.setWalks(true); + SHAMUS.setInvisible(true); + } + + @Override + public boolean isWalk(Player player, Node node) { + return !(node instanceof Item); + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/lostcity/ShamusDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/ShamusDialogue.java new file mode 100644 index 000000000..1796d8cd8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/ShamusDialogue.java @@ -0,0 +1,163 @@ +package core.game.content.quest.members.lostcity; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Handles the shamus npc dialogue. + * @author Vexia + */ +public final class ShamusDialogue extends DialoguePlugin { + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@code ShamusDialogue} {@code Object}. + */ + public ShamusDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ShamusDialogue} {@code Object}. + * @param player the player. + */ + public ShamusDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ShamusDialogue(player); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest("Lost City"); + npc("Ay yer big elephant! Yer've caught me, to be sure!", "What would an elephant like yer be wanting wid ol'", "Shamus then?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 0: + switch (stage) { + case 0: + player("I'm not sure."); + stage++; + break; + case 1: + npc("Well you'll have to be catchin' me again when yer are,", "elephant!"); + stage++; + break; + case 2: + disappear(); + break; + case 3: + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + player("I want to find Zanaris."); + stage++; + break; + case 1: + npc("Zanaris is it now? Well well well... Yer'll be needing to", "be going further to that funny little shed out there in the", "swamp, so you will."); + stage++; + break; + case 2: + player("...but... I thought... Zanaris was a city?"); + stage++; + break; + case 3: + npc("Aye that it is!"); + stage++; + break; + case 4: + player("...How does it fit in a shed then?"); + stage++; + break; + case 5: + npc("Ah yer stupid elephant! The city isn't IN the shed! The", "doorway to the shed is being a portal to Zanaris, so it", "is."); + stage++; + break; + case 6: + player("So I just walk into the shed and end up in Zanaris", "then?"); + stage++; + break; + case 7: + npc("Oh, was I fergetting to say? Yer need to be carrying a", "Dramenwood staff to be getting there! Otherwise Yer'll", "just be ending up in the shed."); + stage++; + break; + case 8: + player("So where would I get a staff?"); + stage++; + break; + case 9: + npc("Dramenwood staffs are crafted from branches of the", "Dramen tree, so they are. I hear there's a Dramen", "tree over on the island of Entrana in a cave."); + stage++; + break; + case 10: + npc("or some such. There would be probably be a good place", "for an elephant like yer to be starting looking I reckon."); + stage++; + break; + case 11: + npc("The monks are running a ship from Port Sarim to", "Entrana, I hear too. Now leave me alone yer elephant!"); + stage++; + break; + case 12: + disappear(); + break; + case 13: + quest.setStage(player, 20); + end(); + break; + } + break; + default: + switch (stage) { + case 0: + player("I'm not sure."); + stage++; + break; + case 1: + npc("HA! Look at yer! Look at the supid elephant who tries", "to go catching a leprechaun when he don't even be", "knowing what he wants!"); + increment(); + break; + case 2: + disappear(); + break; + case 3: + end(); + break; + } + break; + } + return true; + } + + /** + * Makes dhamus disappear. + */ + private void disappear() { + LostCityPlugin.SHAMUS.setInvisible(true); + interpreter.sendPlainMessage(false, "The leprechaun magically disappears."); + stage++; + } + + @Override + public int[] getIds() { + return new int[] { 654 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/lostcity/TreeSpiritNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/TreeSpiritNPC.java new file mode 100644 index 000000000..35859986a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/TreeSpiritNPC.java @@ -0,0 +1,101 @@ +package core.game.content.quest.members.lostcity; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.world.map.Location; + +/** + * Handles the tree spirit npc. + * @author Vexia + */ +public final class TreeSpiritNPC extends AbstractNPC { + + /** + * The player. + */ + private Player player; + + /** + * Constructs a new {@code TreeSpiritNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public TreeSpiritNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code TreeSpiritNPC} {@code Object}. + */ + public TreeSpiritNPC() { + super(0, null); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!inCombat()) { + attack(player); + } + if (!player.isActive() || player.getLocation().getDistance(getLocation()) > 15) { + clear(); + } + } + + @Override + public void clear() { + super.clear(); + player.removeAttribute("treeSpawned"); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity != player) { + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + Player player = (Player) killer; + Quest quest = player.getQuestRepository().getQuest("Lost City"); + if (quest.getStage(player) == 20) { + quest.setStage(player, 21); + player.getDialogueInterpreter().sendPlainMessage(false, "With the Tree Spirit defeated you can now chop the tree."); + } + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TreeSpiritNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 655 }; + } + + /** + * Sets the player. + * @param player the player. + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/lostcity/WarriorDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/WarriorDialogue.java new file mode 100644 index 000000000..91723e22f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/lostcity/WarriorDialogue.java @@ -0,0 +1,282 @@ +package core.game.content.quest.members.lostcity; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Handles the warriors dialogue in the lost city quest. + * @author Vexia + * @version 1.0 + */ +public final class WarriorDialogue extends DialoguePlugin { + + /** + * Represents the quest. + */ + private Quest quest; + + /** + * Constructs a new {@code WarriorDialogue} {@code Object}. + */ + public WarriorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WarriorDialogue} {@code Object}. + * @param player the player. + */ + public WarriorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WarriorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Lost City"); + switch (quest.getStage(player)) { + case 10: + player("So let me get this straight: I need to search the trees", "around here for a leprechaun; and then when I find", "him, he will tell me where this 'Zanaris' is?"); + break; + case 20: + case 21: + player("Have you found anything yet?"); + break; + case 100: + player("Hey, thanks for all the information. It REALLY helped", "me out in finding the lost city of Zanaris and all."); + break; + default: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there traveller."); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 0: + handleFirstStage(buttonId); + break; + case 10: + switch (stage) { + case 0: + npc("What? How did you know that? Uh... I mean, no, no", "you're very wrong. Very wrong, and not right at all,", "and I definitely didn't tell you about that at all."); + stage++; + break; + case 1: + end(); + break; + } + break; + case 20: + case 21: + switch (stage) { + case 0: + npc("We're still searching for Zanaris...GAH! I mean we're", "not doing anything here at all."); + stage++; + break; + case 1: + player("I haven't found it yet either."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 100: + switch (stage) { + case 0: + npc("Oh please don't say that anymore! If the rest of my", "party knew I'd helped you they'd probably throw me", "out and make me walk home by myself!"); + stage++; + break; + case 1: + end(); + break; + } + break; + + } + return true; + } + + /** + * Handles the first dialogue quest stage. + * @param buttonId the buttonId. + */ + private void handleFirstStage(int buttonId) { + switch (stage) { + case 0: + options("Why are you camped out here for?", "Do you know any good adventures I can go on?"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What are you camped here for?"); + stage++; + break; + case 2: + player("Do you know any good adventurers I can go on?"); + stage = 50; + break; + } + break; + case 2: + npc("We're looking for Zanaris...GAH! I mean we're not", "here for any particular reason at all."); + stage++; + break; + case 3: + options("Who's Zanaris?", "What's Zanaris?", "What makes you think it's out here?"); + stage++; + break; + case 4: + switch (buttonId) { + case 1: + player("Who's Zanaris?"); + stage = 10; + break; + case 2: + player("What's Zanaris?"); + stage = 20; + break; + case 3: + player("What makes you think it's out here?"); + stage = 30; + break; + } + break; + case 10: + npc("Ahahahaha! Zanaris isn't a person! It's a magical hidden", "city filled with treasure and rich... uh, nothing. It's", "nothing."); + stage = 31; + break; + case 20: + npc("I don't think we want other people competing with us to", "find it. Forget I said anything."); + stage = 34; + break; + case 30: + npc("Don't you know of the legends that tell of the magical", "city, hidden in the swamp... Uh, no, you're right, we're", "wasting our time here."); + stage++; + break; + case 31: + options("If it's hidden how are you planning to find it?", "There's no such thing!"); + stage++; + break; + case 32: + switch (buttonId) { + case 1: + player("If it's hidden how are you planning to find it?"); + stage = 33; + break; + case 2: + player("There's no such thing!"); + stage = 33; + break; + } + break; + case 33: + npc("Well, we don't want to tell anyone else about that,", "because we don't want anyone else sharing in all that", "glory and treasure."); + stage++; + break; + case 34: + options("Please tell me.", "Looks like you don't know either."); + stage++; + break; + case 35: + switch (buttonId) { + case 1: + player("Please tell me?"); + stage = 37; + break; + case 2: + player("Well, it looks to me like YOU don't know EITHER", "seeing as you're all just sat around here."); + stage = 60; + break; + } + break; + case 37: + npc("No."); + stage++; + break; + case 38: + player("Please?"); + stage++; + break; + case 39: + npc("No!"); + stage++; + break; + case 40: + player("PLEEEEEEEEEEEEEEEEEEEEEEEEESE???"); + stage = 42; + break; + case 42: + npc("NO!"); + stage++; + break; + case 43: + end(); + break; + case 41: + npc("When we've found Zanaris you'll... GAH! I mean, we're", "not here for any particular reason at all."); + stage = 3; + break; + case 50: + npc("Well we're on an adventure right now. Mind you, this", "is OUR adventure and we don't want to share it - find", "your own!"); + stage++; + break; + case 51: + end(); + break; + case 60: + if (quest.hasRequirements(player)) { + npc("Of course we know! We just haven't found which tree", "the stupid leprechaun's hiding in yet!"); + stage++; + } else { + npc("When we've found Zanaris you'll... GAH! I mean, we're", "not here for any particular reason at all."); + stage = 3; + } + break; + case 61: + npc("GAH! I didn't mean to tell you that! Look, just forget I", "said anything okay?"); + stage++; + break; + case 62: + player("So a leprechaun knows where Zanaris is eh?"); + stage++; + break; + case 63: + npc("Ye.. uh, no. No, not at all. And even if he did - which", "he doesn't he DEFINITELY ISN'T hiding in some", "tree around here. Nope, definitely not. Honestly."); + stage++; + break; + case 64: + player("Thanks for the help!"); + stage++; + break; + case 65: + npc("Help? What help? I didn't help! Please don't say I did,", "I'll get in trouble!"); + stage++; + break; + case 66: + end(); + quest.start(player); + break; + } + } + + @Override + public int[] getIds() { + return new int[] { 650 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/ArheinShopDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/ArheinShopDialogue.java new file mode 100644 index 000000000..4787892ea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/ArheinShopDialogue.java @@ -0,0 +1,185 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the dialogue plugin used for the arhein npc. + * @author 'Vexia + * @version 1.0 + */ +public final class ArheinShopDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ArheinShopDialogue} {@code Object}. + */ + public ArheinShopDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ArheinShopDialogue} {@code Object}. + * @param player the player. + */ + public ArheinShopDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ArheinShopDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length > 1) { + interpreter.sendDialogues(npc, null, "Hey buddy! Get away from my ship alright?"); + stage = 2000; + return true; + } + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello! Would you like to trade? I've a variety of wares", "for sale!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Let's trade.", "No thank you.", "Is that your ship?"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Let's trade."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); + stage = 200; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Is that your ship?"); + stage = 300; + break; + } + break; + case 100: + end(); + npc.openShop(player); + break; + case 300: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, I use it to make deliveries to my customers up and", "down the coast. These crates here are all ready for my", "next trip."); + stage = 301; + break; + case 301: + interpreter.sendOptions("Select an Option", "Where do you deliver to?", "Are you rich then?", "Do you deliver to the fort just down the coast?"); + stage = 303; + break; + case 303: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where do you deliver to?"); + stage = 1000; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Are you rich then?"); + stage = 2500; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you deliver to the fort just down the coast?"); + stage = 3000; + break; + + } + break; + case 1000: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Various places up and down the coast. Mostly Karamja", "and Port Sarim."); + stage = 1001; + break; + case 1001: + interpreter.sendOptions("Select an Option", "I don't suppose I could get a lift anywhere?", "Well, good luck with your business."); + stage = 1002; + break; + case 1002: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't suppose I could get a lift anywhere?"); + stage = 1003; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well, good luck with your business."); + stage = 2700; + break; + + } + break; + case 1003: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Sorry pal, but I'm afraid I'm not quite ready to sail yet."); + stage = 1004; + break; + case 1004: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm waiting on a big delivery of candles which I need to", "deliver further along the coast."); + stage = 1005; + break; + case 1005: + end(); + break; + case 2500: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Business is going reasonably well... I wouldn't say I was the", "richest of merchants every, but I'm doing fairly well all", "things considered."); + stage = 2501; + break; + case 2501: + end(); + break; + case 2700: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Thanks buddy!"); + stage = 2701; + break; + case 2701: + end(); + break; + case 200: + end(); + break; + case 2000: + interpreter.sendDialogues(player, null, "Yeah... uh... sorry..."); + stage = 2001; + break; + case 2001: + end(); + break; + case 3000: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Yes, I do have orders to deliver there from time to", "time. I think I may have some bits and pieces for them", "when I leave here next actually."); + if (quest.getStage(player) == 30 || quest.getStage(player) == 40) { + stage = 3001; + } else { + stage = 2701; + } + break; + case 3001: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you drop me off on the way down please?"); + stage = 3002; + break; + case 3002: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I don't think Sir Mordred would like that. He wants as", "few outsiders visiting as possible. I wouldn't want to lose", "his business."); + quest.setStage(player, 40); + stage = 2701; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 563 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/BeggarDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/BeggarDialogue.java new file mode 100644 index 000000000..fafb2f487 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/BeggarDialogue.java @@ -0,0 +1,144 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for king arthur. + * @author 'Vexia + * @author Splinter + * @version 2.0 + */ +public final class BeggarDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + */ + public BeggarDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + * @param player the player. + */ + public BeggarDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BeggarDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.SCARED, "Please kind " + (player.isMale() ? "sir" : "lady") + "... my family and I are starving..."); + player.lock(); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + switch (stage) { + case 1: + if (quest.getStage(player) == 60 && player.getAttribute("beggar_npc") != null) { + interpreter.sendDialogues(252, FacialExpression.HALF_GUILTY, "Could you find it in your heart to spare me a simple", "loaf of bread?"); + stage = 2; + } else { + interpreter.sendDialogue("Despite the fact that he is starving,", "he does not feel like speaking to you at the moment."); + stage = 15; + } + break; + case 2: + player.getDialogueInterpreter().sendOptions("Select an Option", "Yes certainly.", "No, I don't have any bread with me."); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("Yes, certainly."); + stage = 4; + break; + case 2: + player("No, I don't have any bread with me."); + stage = 15; + break; + } + break; + case 4: + if (player.getInventory().contains(2309, 1)) { + interpreter.sendDialogue("You give the bread to the beggar."); + player.getInventory().remove(new Item(2309, 1)); + stage = 5; + } else { + player("... except I don't have any bread on me at the moment..."); + stage = 9; + } + break; + case 5: + npc("Thank you very much!"); + stage = 6; + break; + case 6: + interpreter.sendDialogue("The beggar has turned into the Lady of the Lake!"); + stage = 7; + break; + case 7: + interpreter.sendDialogues(250, FacialExpression.HALF_GUILTY, "Well done. You have passed my test."); + npc.transform(250); + stage = 8; + break; + case 8: + npc("Here is Excalibur, guard it well."); + stage = 16; + break; + case 9: + npc("Well, if you get some, you know where to come."); + stage = 15; + break; + case 15: + player.unlock(); + end(); + break; + case 16: + player.unlock(); + player.getInventory().add(new Item(35, 1), player); + quest.setStage(player, 70); + end(); + npc.clear(); + break; + } + return true; + } + + @Override + public boolean close() { + if (npc.getId() != npc.getOriginalId()) { + npc.reTransform(); + } + return super.close(); + } + + @Override + public void end() { + if (npc.getId() != npc.getOriginalId()) { + npc.reTransform(); + } + super.end(); + } + + @Override + public int[] getIds() { + return new int[] { 252 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.java new file mode 100644 index 000000000..88e0f8f10 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/CandleMakerDialogue.java @@ -0,0 +1,213 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.cache.def.impl.NPCDefinition; +import core.game.system.config.ShopParser; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the dialogue plugin used to handle the candle maker npc. + * @author 'Vexia + * @author Splinter + * @version 1.0 + */ +public final class CandleMakerDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CandleMakerDialogue} {@code Object}. + */ + public CandleMakerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CandleMakerDialogue} {@code Object}. + * @param player the player. + */ + public CandleMakerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CandleMakerDialogue(player); + } + + @Override + public void init() { + super.init(); + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(getIds()[0]).getHandlers().put("option:trade", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + NPC npc = node.asNpc(); + Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + if (quest.getStage(player) > 60) { + ShopParser.Companion.openUid(player, 198); + } else { + npc.openShop(player); + } + return true; + } + + }); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hi! Would you be interested in some of my fine", "candles?"); + stage = 2; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + switch (stage) { + case 2: + if (quest.getStage(player) == 50 || quest.getStage(player) == 60) {// the player has defeated mordred and learned about the black candles + options("Have any black candles?", "Yes, let me see your stock.", "No thanks."); + stage = 3; + } else if (quest.getStage(player) > 60) {// they're farther along in the quest + options("Have any black candles?", "Yes, let me see your stock.", "No thanks."); + stage = 25; + } else {// they haven't started the quest or are too low + options("Yes, let me see your stock.", "No thanks."); + stage = 10; + } + break; + case 3: + switch (buttonId) { + case 1: + player("Have you got any black candles?"); + stage = 4; + break; + case 2: + player("Yes, let me see your stock."); + stage = 30; + break; + case 3: + player("No thank you."); + stage = 40; + break; + } + break; + case 4: + npc("BLACK candles???"); + stage = 5; + break; + case 5: + npc("Hmmm. In the candle making trade, we have a tradition", "that it's very bad luck to make black candles."); + stage = 6; + break; + case 6: + npc("VERY bad luck."); + stage = 7; + break; + case 7: + player("I will pay good money for one."); + stage = 8; + break; + case 8: + npc("I still dunno..."); + stage = 9; + break; + case 9: + npc("Tell you what. I'll supply you with a black candle..."); + stage = 11; + break; + case 11: + npc("IF you can bring me a bucket FULL of wax."); + stage = 40; + break; + case 10: + switch (buttonId) { + case 1: + player("Yes, let me see your stock."); + stage = 30; + break; + case 2: + player("No thank you."); + stage = 40; + break; + } + break; + case 25: + switch (buttonId) { + case 1: + npc("Ah, you again. You're quite a trend setter. Can't believe", "the number of black candle requests I've had since you", "came. I couldn't pass up a business opportunity like that,", "bad luck or no. So I'm selling them now. Would you be"); + stage = 26; + break; + case 2: + player("Yes, let me see your stock."); + stage = 30; + break; + case 3: + player("No thank you."); + stage = 40; + break; + } + break; + case 26: + npc("interested in purchasing another?"); + stage = 27; + break; + case 27: + options("Yes, let me see your stock.", "No thanks."); + stage = 10; + break; + case 30: + end(); + if (quest.getStage(player) > 60) { + ShopParser.Companion.openUid(player, 198); + } else { + npc.openShop(player); + } + break; + case 40: + if (quest.getStage(player) == 50 && player.getInventory().contains(MerlinCrystalPlugin.BUCKET_OF_WAX.getId(), 1)) { + npc("Wha- what's that? You've already got a bucket of wax!"); + stage = 41; + } else { + end(); + } + break; + case 41: + npc("Give it 'ere and I'll trade you for a black candle."); + stage = 42; + break; + case 42: + interpreter.sendDialogue("You hand over a bucket of wax in exchange for a black candle."); + player.getInventory().remove(new Item(MerlinCrystalPlugin.BUCKET_OF_WAX.getId(), 1)); + player.getInventory().add(new Item(MerlinCrystalPlugin.BLACK_CANDLE.getId(), 1)); + stage = 43; + break; + case 43: + end(); + break; + + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 562 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/CrateCutscenePlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/CrateCutscenePlugin.java new file mode 100644 index 000000000..6e8e9ea40 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/CrateCutscenePlugin.java @@ -0,0 +1,108 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; + +/** + * Handles the crate cutscene plugin. + * @author Vexia + */ +public class CrateCutscenePlugin extends CutscenePlugin { + + /** + * The dialogue plugin. + */ + private DialoguePlugin dialogue; + + /** + * Constructs a new {@code CrateCutscenePlugin} {@code Object} + */ + public CrateCutscenePlugin() { + super("Merlin Crate Cutscene", false); + } + + /** + * Constructs a new {@code CrateCutscenePlugin} {@code Object} + * @param player the player. + */ + public CrateCutscenePlugin(Player player) { + this(); + this.player = player; + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + setDialogue((DialoguePlugin) args[0]); + return super.start(player, login, args); + } + + @Override + public void open() { + super.open(); + player.setAttribute("cutscene", this); + player.getDialogueInterpreter().sendDialogue("You wait."); + } + + @Override + public void stop(boolean fade) { + end(); + } + + @Override + public boolean leave(Entity entity, boolean logout) { + if (logout && entity.isPlayer()) { + entity.setLocation(Location.create(2778, 3401, 0)); + } + return super.leave(entity, logout); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new CrateCutscenePlugin(p); + } + + @Override + public Location getStartLocation() { + return base.transform(18, 25, 0); + } + + @Override + public Location getSpawnLocation() { + return Location.create(2778, 3401, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(12609); + setRegionBase(); + registerRegion(region.getId()); + ObjectBuilder.add(new GameObject(65, base.transform(18, 25, 0), 0, 0)); + ObjectBuilder.add(new GameObject(65, base.transform(19, 25, 0), 0, 4)); + ObjectBuilder.add(new GameObject(65, base.transform(18, 24, 0), 0, 1)); + ObjectBuilder.add(new GameObject(65, base.transform(18, 26, 0), 0, 3)); + } + + /** + * Gets the dialogue. + * @return the dialogue + */ + public DialoguePlugin getDialogue() { + return dialogue; + } + + /** + * Sets the dialogue. + * @param dialogue the dialogue to set. + */ + public void setDialogue(DialoguePlugin dialogue) { + this.dialogue = dialogue; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/KingArthurDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/KingArthurDialogue.java new file mode 100644 index 000000000..42653bd0b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/KingArthurDialogue.java @@ -0,0 +1,149 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.tools.Items; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the dialogue plugin used for king arthur. + * + * @author 'Vexia + * @author Splinter + * @version 2.0 + */ +public final class KingArthurDialogue extends DialoguePlugin { + final static Item POISON_CHALICE = new Item(Items.POISON_CHALICE_197); + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + */ + public KingArthurDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + * + * @param player the player. + */ + public KingArthurDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KingArthurDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length > 1 + && args[1] instanceof Item + && ((Item) args[1]).equals(POISON_CHALICE) + && player.getInventory().remove(POISON_CHALICE)) { + if (!player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0, 3)) { + player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).updateTask(player, 0, 3, true); + } + npc("You have chosen... poorly."); + stage = 80; + return true; + } else { + Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + if (quest.getStage(player) == 99) { + player("I have freed Merlin from his crystal!"); + stage = 900; + return true; + } + if (quest.getStage(player) == 100) { + npc("Thank you for all of your help!"); + stage = 999; + return true; + } + if (quest.getStage(player) <= 0) { + npc("Welcome to my court. I am King Arthur."); + stage = 0; + } else { + npc("If you're having any troubles talk to the other", "knights around the room."); + stage = 9; + } + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + switch (stage) { + case 900: + end(); + quest.finish(player); + break; + case 999: + end(); + break; + case 0: + player("I want to become a knight of the round table!"); + stage = 1; + break; + case 1: + npc("Well, in that case I think you need to go on a quest to", "prove yourself worthy."); + stage = 2; + break; + case 2: + npc("My knights all appreciate a good quest."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.DISGUSTED, "Unfortunately, our current quest is to rescue Merlin."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.THINKING, "Back in England, he got himself trapped in some sort of", + "magical Crystal. We've moved him from the cave we", + "found him in and now he's upstairs in his tower."); + stage = 5; + break; + case 5: + player("I will see what I can do then."); + quest.start(player); + stage = 6; + break; + case 6: + npc("Talk to my knights if you need any help."); + stage = 999; + break; + case 80: + player("Excuse me?"); + stage++; + break; + case 81: + npc("Sorry, I meant to say 'thank you.' Most refreshing."); + stage++; + break; + case 82: + player("Are you sure that stuff is safe to drink?"); + stage++; + break; + case 83: + npc("Oh yes, Stankers' creations may be dangerous for those", + "with weak constitutions, but, personally, I find", + "them rather invigorating."); + stage = 999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{251}; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java new file mode 100644 index 000000000..7fcd8394e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/MerlinCrystal.java @@ -0,0 +1,97 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the merlin's crystal quest. + * @author Splinter + */ +@Initializable +public final class MerlinCrystal extends Quest { + + /** + * Constructs a new {@code MerlinCrystal} {@code Object}. + */ + public MerlinCrystal() { + super("Merlin's Crystal", 87, 86, 6, 14, 0, 1, 7); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0:// not started + line(player, "I can start this quest by speaking to King Arthur at Camelot Castle, just North West of CatherbyI must be able to defeat a level 37 enemy", 11); + break; + case 10:// after talking to arthur + line(player, "I spoke to King Arthur and he said I would be worthy of becoming a Knight of the Round Table if I could free Merlinfrom a giant crystal that he has been trapped in." + "


I should ask the other Knights if they have any advice forme on how I should go about doing this.", 11); + break; + case 20:// upon talking to kay/gawain and learning how merlin got trapped + line(player, "I spoke to King Arthur and he said I would be worthy of becoming a Knight of the Round Table if I could free Merlinfrom a giant crystal that he has been trapped in." + "Gawain told me it was the work of Morgan Le Faye.", 11); + break; + case 30:// after talking to lancelot + case 40:// after talking to arhein + line(player, "I spoke to King Arthur and he said I would be worthy of becoming a Knight of the Round Table if I could free Merlinfrom a giant crystal that he has been trapped in." + "Gawain told me it was the work of Morgan Le Faye.I told Lancelot of Gawain's suspicions, and he told me thatMordred's Fortress is not completely impenetrable." + "There might be a way to enter with a delivery by sea...", 11); + break; + case 50:// defeated mordred + line(player, "I spoke to King Arthur and he said I would be worthy of becoming a Knight of the Round Table if I could free Merlinfrom a giant crystal that he has been trapped in." + "Gawain told me it was the work of Morgan Le Faye.I told Lancelot of Gawain's suspicions, and he told me thatMordred's Fortress is not completely impenetrable." + "There might be a way to enter with a delivery by sea...I have broken into Keep Le Faye and slain Sir Mordred." + "Morgan Le Faye disclosed the secret of how to free Merlin. I'll need the sword Excalibur and a lit black candle first." + "According to Morgan, the Lady of the Lake has thesword that can be used to free Merlin.", 11); + break; + case 60:// talking to lady of the lake + line(player, "I spoke to King Arthur and he said I would be worthy of becoming a Knight of the Round Table if I could free Merlinfrom a giant crystal that he has been trapped in." + "Gawain told me it was the work of Morgan Le Faye.I told Lancelot of Gawain's suspicions, and he told me thatMordred's Fortress is not completely impenetrable." + "There might be a way to enter with a delivery by sea...I have broken into Keep Le Faye and slain Sir Mordred." + "Morgan Le Faye disclosed the secret of how to free Merlin.I'll need the sword Excalibur and a lit black candle." + "The Lady of the Lake told me she had the Excalibur but I'd have to meet her in the jewellery store" + " in Port Sarimbefore she'd give it to me.", 11); + break; + case 70:// after actually obtaining excalibur + line(player, "I spoke to King Arthur and he said I would be worthy of becoming a Knight of the Round Table if I could free Merlinfrom a giant crystal that he has been trapped in." + "Gawain told me it was the work of Morgan Le Faye.I told Lancelot of Gawain's suspicions, and he told me thatMordred's Fortress is not completely impenetrable." + "There might be a way to enter with a delivery by sea...I have broken into Keep Le Faye and slain Sir Mordred." + "Morgan Le Faye disclosed the secret of how to free Merlin.I'll need the sword Excalibur and a lit black candle." + "The Lady of the Lake told me she had the Excalibur but I'd have to visit the jewellery store" + " in Port Sarim first." + "I have the sword Excalibur and can free Merlin from the crystal." + "I must now memorize an incantation inscribed on a Chaos altarthat is located somewhere in the world in order to banish" + "the spirit." + "I will also need to find some bat bones and drop themon the magical symbol to the North East of Camelot." + "after I have learned the incantation.", 11); + break; + case 80:// after reading the incantation + line(player, "I spoke to King Arthur and he said I would be worthy of becoming a Knight of the Round Table if I could free Merlinfrom a giant crystal that he has been trapped in." + "Gawain told me it was the work of Morgan Le Faye.I told Lancelot of Gawain's suspicions, and he told me thatMordred's Fortress is not completely impenetrable." + "There might be a way to enter with a delivery by sea...I have broken into Keep Le Faye and slain Sir Mordred." + "Morgan Le Faye disclosed the secret of how to free Merlin.I'll need the sword Excalibur and a lit black candle." + "The Lady of the Lake told me she had the Excalibur but I'd have to visit the jewellery store" + " in Port Sarim first." + "I have the sword Excalibur and can free Merlin from the crystal." + "I must now memorize an incantation inscribed on a Chaos altarthat is located somewhere in the world in order to banish" + "the spirit." + " I managed to find the Chaos Altar that Morgan described." + "The incantation is 'Snarthon Candtrick Termanto'." + "I now need to find some bat bones and drop themon the magical symbol to the North East of Camelot.", 11); + break; + case 90: + line(player, "I spoke to King Arthur and he said I would be worthy of becoming a Knight of the Round Table if I could free Merlinfrom a giant crystal that he has been trapped in." + "Gawain told me it was the work of Morgan Le Faye.I told Lancelot of Gawain's suspicions, and he told me thatMordred's Fortress is not completely impenetrable." + "There might be a way to enter with a delivery by sea...I have broken into Keep Le Faye and slain Sir Mordred." + "Morgan Le Faye disclosed the secret of how to free Merlin.I'll need the sword Excalibur and a lit black candle." + "The Lady of the Lake told me she had the Excalibur but I'd have to visit the jewellery store" + " in Port Sarim first." + "I have the sword Excalibur and can free Merlin from the crystal." + "I must now memorize an incantation inscribed on a Chaos altarthat is located somewhere in the world in order to banish" + "the spirit.Now is your time to free Merlin!", 11); + break; + case 99: + line(player, "I spoke to King Arthur and he said I would be worthy of becoming a Knight of the Round Table if I could free Merlinfrom a giant crystal that he has been trapped in." + "Gawain told me it was the work of Morgan Le Faye.I told Lancelot of Gawain's suspicions, and he told me thatMordred's Fortress is not completely impenetrable." + "There might be a way to enter with a delivery by sea...I have broken into Keep Le Faye and slain Sir Mordred." + "Morgan Le Faye disclosed the secret of how to free Merlin.I'll need the sword Excalibur and a lit black candle." + "The Lady of the Lake told me she had the Excalibur but I'd have to visit the jewellery store" + " in Port Sarim first." + "I have the sword Excalibur and can free Merlin from the crystal." + "I must now memorize an incantation inscribed on a Chaos altarthat is located somewhere in the world in order to banish" + "the spirit.Speak to King Arthur for a reward.", 11); + break; + case 100: + line(player, "You helped King Arthur free Merlin from the crystal.QUEST COMPLETE!", 11); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("6 Quest Points", 277, 8+ 2); + player.getPacketDispatch().sendString("Excalibur", 277, 9+ 2); + player.getPacketDispatch().sendItemZoomOnInterface(35, 235, 277, 3+ 2); + player.getQuestRepository().syncronizeTab(player); + } + + @Override + public boolean hasRequirements(Player player) { + return true; + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new CrateCutscenePlugin(), + new MerlinCrystalPlugin(), + new ArheinShopDialogue(), + new BeggarDialogue(), + new CandleMakerDialogue(), + new KingArthurDialogue(), + new MerlinCrystalOptionPlugin(), + new SirKayDialogue(), + new SirLancelotDialogue(), + new SirLucan(), + new SirMordredNPC(), + new SirPalomedes(), + new TheLadyOfTheLake(), + new ThrantaxDialogue(), + new RenegadeKnightDialogue()); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/MerlinCrystalOptionPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/MerlinCrystalOptionPlugin.java new file mode 100644 index 000000000..1ab4d927f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/MerlinCrystalOptionPlugin.java @@ -0,0 +1,48 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.object.GameObject; +import core.plugin.Plugin; + +/** + * Represents the quest node plugin handler. + * @author Splinter + */ +public class MerlinCrystalOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(247).getHandlers().put("option:attack", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + int id = node instanceof GameObject ? ((GameObject) node).getId() : ((NPC) node).getId(); + switch (id) { + case 247: + if (quest.getStage(player) < 40) { + player.getProperties().getCombatPulse().stop(); + player.getPacketDispatch().sendMessage("You have no reason to attack this valiant knight."); + return true; + } + if (quest.getStage(player) == 40) { + player.getProperties().getCombatPulse().attack(node); + } + if (quest.getStage(player) > 40) { + player.getProperties().getCombatPulse().stop(); + player.getPacketDispatch().sendMessage("You've already bested Sir Mordred in combat."); + return true; + } + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.java new file mode 100644 index 000000000..acea9cbd8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/MerlinCrystalPlugin.java @@ -0,0 +1,614 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.content.global.action.DropItemHandler; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the Merlin's Crystal Dialogue/Interactions. + * @author Splinter + */ +public final class MerlinCrystalPlugin extends OptionHandler { + + /** + * The empty folder item. + */ + public final static Item REPELLENT = new Item(28); + + /** + * The empty folder item. + */ + public static final Item BUCKET = new Item(1925); + + /** + * The empty folder item. + */ + public static final Item BUCKET_OF_WAX = new Item(30); + + /** + * The empty folder item. + */ + public static final Item BLACK_CANDLE = new Item(38); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new MerlinCrystalDialogue()); + PluginManager.definePlugin(new MerlinCrystalItemHandler()); + ObjectDefinition.forId(63).getHandlers().put("option:hide-in", this); + ObjectDefinition.forId(40026).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(72).getHandlers().put("option:open", this); + ObjectDefinition.forId(71).getHandlers().put("option:open", this); + ObjectDefinition.forId(71).getHandlers().put("option:knock-at", this); + ObjectDefinition.forId(72).getHandlers().put("option:knock-at", this); + ItemDefinition.forId(530).getHandlers().put("option:drop", this); + ObjectDefinition.forId(62).getHandlers().put("option:smash", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + final int id = node instanceof Item ? ((Item) node).getId() : node instanceof GameObject ? ((GameObject) node).getId() : ((NPC) node).getId(); + switch (id) { + case 62: + if (quest.getStage(player) == 90 && player.getEquipment().contains(35, 1)) { + player.sendMessages("You attempt to smash the crystal...", "... and it shatters under the force of Excalibur!"); + player.animate(Animation.create(390)); + player.lock(); + ObjectBuilder.remove(node.asObject(), 60); + quest.setStage(player, 99); + final NPC merlin = NPC.create(249, Location.create(2767, 3493, 2)); + merlin.init(); + player.getDialogueInterpreter().open(merlin.getId(), merlin); + GameWorld.getPulser().submit(new Pulse(100, player, merlin) { + + @Override + public boolean pulse() { + return true; + } + + @Override + public void stop() { + super.stop(); + if (merlin != null && merlin.isActive()) { + merlin.clear(); + } + } + + }); + } else { + player.sendMessage("You need something stronger to smash it."); + } + return true; + case 63: + player.getDialogueInterpreter().open("merlin_dialogue"); + return true; + case 71: + case 72: + if (quest.getStage(player) == 10) { + player.getDialogueInterpreter().sendDialogue("The door is securely locked."); + } + else if (quest.getStage(player) < 50) { + switch(option) { + case "open": + player.getDialogueInterpreter().sendDialogue("The door is securely locked. You will have to find", "another way in."); + break; + case "knock-at": + player.getDialogueInterpreter().open("renegade-knight"); + break; + } + } else { + DoorActionHandler.handleAutowalkDoor(player, node.asObject()); + } + return true; + case 530: + if (player.getLocation().equals(new Location(2780, 3515, 0)) && quest.getStage(player) == 80) { + if (player.getInventory().contains(32, 1) && player.getAttribute("thrantax_npc") == null) { + ForceMovement.run(player, player.getLocation().transform(-2, 0, 0)).setDirection(Direction.EAST); + NPC npc = new ThrantaxNPC(player, Location.create(2780, 3515, 0)); + npc.init(); + npc.setRespawn(false); + player.setAttribute("thrantax_npc", npc); + npc.setAttribute("thrantax_owner", player.getUsername()); + player.getDialogueInterpreter().open("thrantax_dialogue", 34, 248); + } else { + player.getDialogueInterpreter().sendDialogue("You'll need to light the black candle before the spirit", "will appear."); + } + return true; + } else { + DropItemHandler.drop(player, node.asItem()); + } + return true; + case 40026: + if (player.getLocation().withinDistance(Location.create(3013, 3245, 0)) && quest.getStage(player) == 60 && player.getAttribute("beggar_npc") == null) { + NPC npc = new BeggarNPC(player, Location.create(3012, 3248, 1)); + npc.init(); + player.setAttribute("beggar_npc", 1); + npc.setAttribute("beggar_owner", player.getUsername()); + ClimbActionHandler.climb(player, new Animation(828), Location.create(3013, 3245, 1)); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + } + return true; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + return null; + } + + /** + * Handles the dialogue + * @author Splinter + */ + public final class MerlinCrystalDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code JogreCavernDialogue} {@code Object}. + */ + public MerlinCrystalDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JogreCavernDialogue} {@code Object}. + * @param player the player. + */ + public MerlinCrystalDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MerlinCrystalDialogue(player); + } + + @Override + public boolean open(Object... args) { + final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + if (quest.getStage(player) == 99) { + npc = (NPC) args[0]; + npc("Thank you! Thank you! Thank you!"); + stage = 900; + return true; + } + if (quest.getStage(player) == 40 && player.getLocation().withinDistance(new Location(2801, 3442, 0), 2)) { + player.getDialogueInterpreter().sendDialogue("The crate is empty. It's just about big enough to hide inside."); + stage = 0; + } + if (quest.getStage(player) == 50 && player.getLocation().withinDistance(new Location(2770, 3402, 2), 8)) { + interpreter.sendDialogues(248, FacialExpression.SCARED, "STOP! Please... spare my son."); + player.lock(); + stage = 34; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 900: + npc("It's not fun being trapped in a giant crystal!"); + stage++; + break; + case 901: + npc("Go speak to King Arthur, I'm sure he'll reward you!"); + stage++; + break; + case 902: + interpreter.sendDialogue("You have set Merlin free. Now talk to King Arthur."); + stage++; + break; + case 903: + end(); + player.unlock(); + npc.clear(); + break; + case 0: + player.getDialogueInterpreter().sendOptions("Hide inside the crate?", "Yes.", "No."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogue("You climb inside the crate and wait."); + player.lock(); + player.animate(new Animation(827)); + stage = 10; + break; + case 2: + interpreter.sendDialogue("You leave the empty crate alone."); + stage = 200; + break; + } + break; + case 10: + ActivityManager.start(player, "Merlin Crate Cutscene", false, this); + stage = 11; + break; + case 11: + interpreter.sendDialogue("And wait..."); + stage = 13; + break; + case 13: + interpreter.sendDialogue("You hear voices outside the crate.", "Is this your crate Arnhein?"); + stage = 14; + break; + case 14: + interpreter.sendDialogue("Yeah I think so. Pack it aboard as soon as you can.", "I'm on a tight schedule for deliveries!"); + stage = 15; + break; + case 15: + interpreter.sendDialogue("You feel the crate being lifted", "Oof. Wow, this is pretty heavy!", "I never knew candles weighed so much!"); + stage = 16; + break; + case 16: + interpreter.sendDialogue("Quit your whining, and stow it in the hold."); + stage = 17; + break; + case 17: + interpreter.sendDialogue("You feel the crate being put down inside the ship."); + stage = 18; + break; + case 18: + interpreter.sendDialogue("You wait..."); + stage = 19; + break; + case 19: + interpreter.sendDialogue("And wait..."); + stage = 20; + break; + case 20: + interpreter.sendDialogue("Casting off!"); + stage = 21; + break; + case 21: + interpreter.sendDialogue("You feel the ship start to move."); + stage = 22; + break; + case 22: + interpreter.sendDialogue("Feels like you're now out at sea."); + stage = 23; + break; + case 23: + interpreter.sendDialogue("The ship comes to a stop."); + stage = 24; + break; + case 24: + interpreter.sendDialogue("Unload Mordred's deliveries onto the jetty.", "Aye-aye cap'n!"); + stage = 25; + break; + case 25: + interpreter.sendDialogue("You feel the crate being lifted."); + stage = 26; + break; + case 26: + interpreter.sendDialogue("You can hear someone mumbling outside the crate.", "...stupid Arhein... making me... candles...", "never weigh THIS much....hurts....union about this!..."); + stage = 27; + break; + case 27: + interpreter.sendDialogue("...if....MY ship be different!...", "stupid Arhein..."); + stage = 28; + break; + case 28: + interpreter.sendDialogue("You feel the crate being put down."); + stage = 29; + break; + case 29: + player.getDialogueInterpreter().sendOptions("Get out of the crate?", "Yes.", "No."); + stage = 30; + break; + case 30: + switch (buttonId) { + case 1: + interpreter.sendDialogue("You climb out of the crate."); + stage = 31; + break; + case 2: + interpreter.sendDialogue("You decide to stay in the crate."); + stage = 32; + break; + } + break; + case 31: + CutscenePlugin p = player.getAttribute("cutscene", null); + if (p != null) { + p.stop(false); + } + if (player.getQuestRepository().getQuest("Merlin's Crystal").getStage(player) == 30) { + player.getQuestRepository().getQuest("Merlin's Crystal").setStage(player, 40); + } + player.unlock(); + player.getProperties().setTeleportLocation(Location.create(2778, 3401, 0)); + end(); + break; + case 32: + interpreter.sendDialogue("You wait..."); + stage = 33; + break; + case 33: + interpreter.sendDialogue("And wait..."); + stage = 29; + break; + case 34: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Tell me how to untrap Merlin and I might."); + stage = 35; + break; + case 35: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "You have guessed correctly that I'm responsible for", "that."); + stage = 36; + break; + case 36: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "I suppose I can live with that fool Merlin being loose", "for the sake of my son."); + stage = 37; + break; + case 37: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "Setting him free won't be easy though."); + stage = 38; + break; + case 38: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "You will need to find a magic symbol as close to the", "crystal as you can find."); + stage = 39; + break; + case 39: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "You will then need to drop some bat's bones on the", "magic symbol while holding a lit black candle."); + stage = 40; + break; + case 40: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "This will summon a mighty spirit named Thrantax."); + stage = 41; + break; + case 41: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "You will need to bind him with magic words."); + stage = 42; + break; + case 42: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "Then you will need the sword Excalibur with which the", "spell was bound in order to shatter the crystal."); + stage = 43; + break; + case 43: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where can I find the sword Excalibur?"); + stage = 44; + break; + case 44: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "The lady of the lake has it. I don't know if she'll give it", "to you though, she can be rather temperamental."); + stage = 45; + break; + case 45: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What are these magic words?"); + stage = 46; + break; + case 46: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "You will find the magic words at the base of one of the", "chaos altars."); + stage = 47; + break; + case 47: + interpreter.sendDialogues(248, FacialExpression.HALF_GUILTY, "Which chaos altar I cannot remember."); + stage = 48; + break; + case 48: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Okay, I can do all of that."); + stage = 49; + break; + case 49: + NPC n = player.getAttribute("morgan", null); + if (n != null) { + n.graphics(Graphics.create(86)); + n.clear(); + } + interpreter.sendDialogue("Morgan Le Faye vanishes."); + player.unlock(); + stage = 200; + break; + case 200: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("merlin_dialogue"), 248, 249 }; + } + } + + /** + * Handles the beggar NPC. + * @author Vexia + */ + public final class BeggarNPC extends NPC { + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@code AnimatedArmour} {@code Object}. + * @param player The player. + * @param location The location to spawn. + */ + protected BeggarNPC(Player player, Location location) { + super(252, location); + this.player = player; + } + + @Override + public boolean isHidden(final Player player) { + if (player.getQuestRepository().getQuest("Merlin's Crystal").getStage(player) == 60 && this.getAttribute("beggar_owner", "").equals(player.getUsername())) { + return false; + } + return true; + } + + @Override + public void handleTickActions() { + if (player != null && (!player.isActive())) { + clear(); + } + } + + @Override + public void init() { + super.init(); + } + + @Override + public void clear() { + super.clear(); + player.getHintIconManager().clear(); + } + } + + /** + * Handles the thrantax npc. + * @author Vexia + */ + public final class ThrantaxNPC extends NPC { + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@code AnimatedArmour} {@code Object}. + * @param player The player. + * @param location The location to spawn. + */ + protected ThrantaxNPC(Player player, Location location) { + super(238, location); + this.player = player; + } + + @Override + public boolean isHidden(final Player player) { + if (player.getQuestRepository().getQuest("Merlin's Crystal").getStage(player) == 80 && this.getAttribute("thrantax_owner", "").equals(player.getUsername())) { + return false; + } + return true; + } + + @Override + public void init() { + super.init(); + } + + @Override + public void handleTickActions() { + if (player != null && !player.isActive() || !player.getLocation().withinDistance(getLocation(), 20)) { + clear(); + } + super.handleTickActions(); + } + + @Override + public void finalizeDeath(Entity entity) { + if (entity instanceof Player) { + Player p = entity.asPlayer(); + super.finalizeDeath(p); + } + } + + @Override + public boolean canAttack(Entity entity) { + if (getAttribute("thrantax_owner", entity) == entity) { + return true; + } + return false; + } + + @Override + public void clear() { + super.clear(); + player.getHintIconManager().clear(); + } + } + + /** + * Used for item handling during the quest. + * @author Adam Rodrigues + */ + public static class MerlinCrystalItemHandler extends UseWithHandler { + + /** + * The object id of the beehives + */ + private static final int[] OBJECTS = new int[] { 68 }; + + /** + * Constructs a new {@Code MerlinCrystalItemHandler} {@Code + * Object} + */ + public MerlinCrystalItemHandler() { + super(REPELLENT.getId(), BUCKET.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : OBJECTS) { + addHandler(id, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + Item useditem = event.getUsedItem(); + final GameObject object = (GameObject) event.getUsedWith(); + + if (player.getAttribute("cleared-beehives", false) && useditem.getId() == REPELLENT.getId() && object.getId() == 68) { + player.getDialogueInterpreter().sendDialogue("You have already cleared the hive of its bees.", "You can now safely collect wax from the hive."); + } + + if (useditem.getId() == REPELLENT.getId() && object.getId() == 68 && player.getAttribute("cleared-beehives", false)) { + player.getDialogueInterpreter().sendDialogue("You pour insect repellent on the beehive. You see the bees leaving the", "hive."); + player.setAttribute("cleared-beehives", true); + } + + if (useditem.getId() == BUCKET.getId() && player.getAttribute("cleared-beehives", false)) { + player.getDialogueInterpreter().sendDialogue("You get some wax from the beehive."); + player.getInventory().remove(new Item(BUCKET.getId(), 1)); + player.getInventory().add(new Item(BUCKET_OF_WAX.getId(), 1)); + } else if (useditem.getId() == BUCKET.getId() && !player.getAttribute("cleared-beehives", false)) { + player.getDialogueInterpreter().sendDialogue("It would be dangerous to stick the bucket into the hive while", "the bees are still in it. Perhaps you can clear them out", "somehow."); + } + + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/RenegadeKnightDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/RenegadeKnightDialogue.java new file mode 100644 index 000000000..c66a97092 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/RenegadeKnightDialogue.java @@ -0,0 +1,86 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; + +public class RenegadeKnightDialogue extends DialoguePlugin { + public RenegadeKnightDialogue() {} + public RenegadeKnightDialogue(Player player) {super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new RenegadeKnightDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = new NPC(237); + + sendDialogue("You knock at the door. You hear a voice from", "inside..."); + stage = 0; + + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch(stage) { + case 999: + end(); + break; + case 0: + player("Um..."); + stage++; + break; + case 1: + options("Pizza Delivery!", "Have you ever thought about letting Saradomin into your life?", "Can I interest you in some double glazing?", "Would you like to buy some lucky heather?"); + stage++; + break; + case 2: + switch(buttonId) { + case 1: + player("Pizza delivery!"); + stage = 3; + break; + case 2: + player("Have you ever thought about letting Saradomin into", "your life? I have some pamphlets you may be", "interested in reading and discussing with me."); + stage = 4; + break; + case 3: + player("Can I interest you in some double glazing? An old", "castle like this must get very draughty in the", "winter..."); + stage = 5; + break; + case 4: + player("Would you like to buy some lucky heather?"); + stage = 4; + break; + } + break; + case 3: + npc("We didn't order any Pizza. Get lost!"); + stage = 10; + break; + case 4: + npc("No. Go away."); + stage = 10; + break; + case 5: + npc("No. Get out of here before I run you through."); + stage = 10; + break; + case 10: + sendDialogue("It looks like you'll have to find another way in..."); + stage = 999; + break; + + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{ DialogueInterpreter.getDialogueKey("renegade-knight") }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirGawainDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirGawainDialogue.java new file mode 100644 index 000000000..65e78b594 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirGawainDialogue.java @@ -0,0 +1,179 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.node.entity.player.link.quest.Quest; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for Sir Gawain. + * + * @author afaroutdude + */ +public final class SirGawainDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + */ + public SirGawainDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + * + * @param player the player. + */ + public SirGawainDialogue(Player player) { + super(player); + } + + private Quest quest; + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirGawainDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + + npc("Good day to you " + (player.isMale() ? "sir" : "madam") + "!"); + stage = 0; + + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 999: + end(); + break; + case 0: + switch(quest.getStage(player)) { + case 0: + options("Good day.", "Know you of any quests sir knight?"); + stage = 1; + break; + case 10: + options("Good day.", "Any ideas on how to get Merlin out of that crystal?", "Do you know how Merlin got trapped?"); + stage = 2; + break; + case 20: + options("Any idea how to get into Morgan Le Faye's stronghold?", "Hello again."); + stage = 3; + break; + case 50: + player("Any ideas on finding Excalibur?"); + stage = 4; + break; + default: + end(); + break; + } + case 1: + switch(buttonId) { + case 1: + player("Good day."); + stage = 999; + break; + case 2: + player("Know you of any quests sir knight?"); + stage = 5; + break; + } + break; + case 2: + switch(buttonId) { + case 1: + player("Good day."); + stage = 999; + break; + case 2: + player("Any ideas on how to get Merlin out of that crystal?"); + stage = 6; + break; + case 3: + player("Do you know how Merlin got trapped?"); + stage = 7; + break; + } + break; + case 3: + switch(buttonId) { + case 1: + player("Any idea how to get into Morgan Le Faye's stronghold?"); + stage = 12; + break; + case 2: + player("Hello again."); + stage = 999; + break; + } + break; + case 4: + npc("Unfortunately not, adventurer."); + stage = 999; + break; + case 5: + npc("The king is the man to talk to if you want a quest."); + stage = 999; + break; + case 6: + npc("I'm a little stumped myself. We've tried opening it", "with anything and everything!"); + stage = 999; + break; + case 7: + npc("I would guess this is the work of the evil", "Morgan Le Faye!"); + stage++; + break; + case 8: + player("And where could I find her?"); + stage++; + break; + case 9: + npc("She lives in her stronghold to the south of here,", "guarded by some renegade knights led by Sir Mordred."); + quest.setStage(player, 20); + player.getQuestRepository().syncronizeTab(player); + stage++; + break; + case 10: + options("Any idea how to get into Moran Le Faye's stronghold?", "Thank you for the information."); + stage++; + break; + case 11: + switch(buttonId) { + case 1: + player("Any idea how to get into Moran Le Faye's stronghold?"); + stage = 12; + break; + case 2: + player("Thank you for the information."); + stage = 13; + break; + } + break; + case 12: + npc("No, you've got me stumped there..."); + stage = 999; + break; + case 13: + npc("It is the least I can do."); + stage = 999; + break; + + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{240}; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirKayDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirKayDialogue.java new file mode 100644 index 000000000..327a87636 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirKayDialogue.java @@ -0,0 +1,215 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for Sir Kay. + * + * @author afaroutdude + */ +public final class SirKayDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + */ + public SirKayDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + * + * @param player the player. + */ + public SirKayDialogue(Player player) { + super(player); + } + + private Quest quest; + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirKayDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + + options("Hello.", "Talk about achievement diary."); + stage = 0; + + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + AchievementDiary diary = player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE); + int level = 2; + + switch (stage) { + case 999: + end(); + break; + case 0: + switch(buttonId) { + case 1: + player("Hello."); + stage = 1; + break; + case 2: + if (!diary.isStarted(level)) { + player("Do you have an Achievement Diary for me?"); + stage = 100; + break; + } + else if (diary.isLevelRewarded(level) && !player.hasItem(diary.getType().getRewards()[level][0])) { + player("I seem to have lost my seers' headband..."); + stage = 80; + break; + } + else if (diary.isLevelRewarded(level)) { + player("Can you remind me what my headband does?"); + stage = 90; + break; + } + else if (diary.isComplete(level, true)) { + player("Greetings, Sir Kay. I have completed all of the Hard", "tasks in my Achievement Diary. May I have a reward?"); + stage = 200; + break; + } + else { + player("Hi! Can you help me out with the Achievement Diary", "tasks?"); + stage = 101; + break; + } + } + break; + case 1: + npc("Good morrow " + (player.isMale() ? "sirrah" : "madam") + "!"); + stage++; + break; + case 2: + switch(quest.getStage(player)) { + case 0: + player("Morning. Know where an adventurer has to go to", "find a quest around here?"); + stage = 3; + break; + case 10: + player("Any ideas on getting Merlin out of that crystal?"); + stage = 4; + break; + case 20: + player("Any ideas on getting into Mordred's fort?"); + stage = 5; + break; + case 50: + player("Any ideas on finding Excalibur?"); + stage = 4; + break; + case 100: + npc("Many thanks for your assistance in restoring Merlin", "to his former freedom!"); + stage = 10; + break; + default: + end(); + break; + } + break; + case 3: + npc("An adventurer eh? There is no service finer than", "serving the bountiful King Arthur, and I happen to", "know there's an important quest to fulfill."); + stage = 999; + break; + case 4: + npc("Unfortunately not, " + (player.isMale() ? "sirrah" : "madam") + "."); + stage = 999; + break; + case 5: + npc("Mordred... So you think he may be involved with", "the curse upon Merlin?"); + stage++; + break; + case 6: + player("Good a guess as any right?"); + stage++; + break; + case 7: + npc("I think you may be on to something there.", "Unfortunately his fortress is impregnable!"); + stage++; + break; + case 8: + player("... I'll figure something out."); + stage = 999; + break; + case 10: + player("Hey, no problem."); + stage = 999; + break; + + case 80: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("Here's your replacement. Please be more careful."); + stage = 999; + break; + case 90: + npc("Your headband will help you get experience when", "woodcutting maple trees, and an extra log or two when", "cutting normal trees. I've also told Geoff to increase"); + stage++; + case 91: + npc("your flax allowance in acknowledgement of your", "standing."); + stage = 999; + break; + case 100: + npc("I certainly do - we have a set of tasks spanning Seers'", "Village, Catherby, Hemenster and the Sinclair Mansion.", "Just complete the tasks listed in the Achievement Diary", "and they will be ticked off automatically."); + stage = 999; + break; + case 101: + npc("I'm afraid not. It is important that adventurers", "complete the tasks unaided. That way, only the truly", "worthy collect the spoils."); + stage = 999; + break; + case 200: + npc("Well done, young " + (player.isMale() ? "sir" : "madam") + ". You must be a mighty", "adventurer indeed to have completed the Hard tasks."); + stage++; + break; + case 201: + if (!player.hasItem(diary.getType().getRewards()[level][0])) { + npc("I need your headband. Come back when", "you have it."); + stage = 999; + } else { + diary.setLevelRewarded(level); + player.getInventory().add(diary.getType().getRewards()[level][1]); + sendDialogue("You hand Sir Kay your headband and he concentrates for a", "moment. Some mysterious knightly energy passes through his hands", "and he gives the headband back to you, along with an old lamp."); + stage++; + } + break; + case 202: + npc("You will find that your headband now blesses you with", "the power to spin fabrics at extreme speed in Seers'", "Village. I will also instruct Geoff-erm-Flax to offer you", "a far larger flax allowance. Use your new powers"); + stage++; + break; + case 203: + npc("wisely."); + stage++; + break; + case 204: + player("Thank you, Sir Kay, I'll try not to harm anyone with", "my spinning."); + stage++; + break; + case 205: + npc("You are most welcome. You may also find that the", "Lady of the Lake is prepared to reward you for your", "services if you wear the headband in her presence."); + stage=999; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{241}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirLancelotDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirLancelotDialogue.java new file mode 100644 index 000000000..310f7b2c1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirLancelotDialogue.java @@ -0,0 +1,96 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.node.entity.player.link.quest.Quest; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for king arthur. + * @author 'Vexia + * @author Splinter + * @version 2.0 + */ +public final class SirLancelotDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + */ + public SirLancelotDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KingArthurDialogue} {@code Object}. + * @param player the player. + */ + public SirLancelotDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirLancelotDialogue(player); + } + + private Quest quest; + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Greetings! I am Sir Lancelot, the greatest Knight in the", "land! What do you want?"); + + quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + // TODO more accurate dialogue https://2009scape.wiki/w/Transcript:Merlin%27s_Crystal#Sir_Lancelot + switch (stage) { + case 0: + if (quest.getStage(player) >= 20 && quest.getStage(player) < 50) { + player("Any idea on how to get into Morgan Le Faye's", "stronghold?"); + stage = 1; + } else { + player("You're a little full of yourself, aren't you?"); + stage = 16; + } + break; + case 1: + npc("That stronghold is built in a strong defensive position."); + stage = 2; + break; + case 2: + npc("There are two ways in that I know of, the large heavy", "front doors, and the sea entrance, only penetrable by", "boat."); + stage = 3; + break; + case 3: + npc("They take all their deliveries by boat."); + quest.setStage(player, 30); + player.getQuestRepository().syncronizeTab(player); + stage = 15; + break; + case 15: + end(); + break; + case 16: + npc("I have every right to be proud of myself."); + stage = 17; + break; + case 17: + npc("My prowess in battle is world renowned!"); + stage = 15; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 239 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirLucan.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirLucan.java new file mode 100644 index 000000000..a78534880 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirLucan.java @@ -0,0 +1,93 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Handles the dialogue for Sir Lucan + * @author Splinter + * @author Vexia + */ +public class SirLucan extends DialoguePlugin { + + /** + * Constructs a new {@code SirLucan} {@code Object} + */ + public SirLucan() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code SirLucan} {@code Object} + * @param player the player. + */ + public SirLucan(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there adventurer."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + if (quest.getStage(player) == 100) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Congratulations on freeing Merlin!"); + stage = 20; + } else if (quest.getStage(player) >= 10 && quest.getStage(player) < 50) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Any suggestions on freeing Merlin?"); + stage = 1; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I am afraid I have no time to chat."); + stage = 20; + } + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I've tried all the weapons I can find, yet none are", "powerful enough to break his crystal prison..."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Perhaps the mighty Excalibur would be strong enough..."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Excalibur eh? Where would I find that?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The Lady of the Lake is looking after it I believe... but", "I know not where she resides currently."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks. I'll try and find someone who does."); + stage = 20; + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirLucan(player); + } + + @Override + public int[] getIds() { + return new int[] { 245 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirMordredNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirMordredNPC.java new file mode 100644 index 000000000..423a04cfa --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirMordredNPC.java @@ -0,0 +1,89 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles Sir Mordred + * @author Vexia + * @author Splinter + */ +public class SirMordredNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 247 }; + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public SirMordredNPC() { + super(0, null); + } + + /** + * Constructs a new {@code SirMordredNPC} {@code Object} + * @param id the id. + * @param location the location. + */ + private SirMordredNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SirMordredNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + super.getProperties().getCombatPulse().stop(); + super.getSkills().setLifepoints(50); + if (killer != null && killer.isPlayer()) { + final Player p = ((Player) killer); + Quest quest = p.getQuestRepository().getQuest("Merlin's Crystal"); + if (quest.getStage(p) == 40) { + quest.setStage(p, 50); + p.getQuestRepository().syncronizeTab(p); + p.getDialogueInterpreter().open("merlin_dialogue", 34, 248); + final NPC npc = NPC.create(248, p.getLocation()); + p.setAttribute("morgan", npc); + npc.init(); + npc.graphics(Graphics.create(86)); + npc.moveStep(); + npc.face(p); + GameWorld.getPulser().submit(new Pulse(100, p, npc) { + + @Override + public boolean pulse() { + return true; + } + + @Override + public void stop() { + super.stop(); + if (npc != null && npc.isActive()) { + npc.clear(); + } + } + + }); + } + } + } + + @Override + public int[] getIds() { + return ID; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirPalomedes.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirPalomedes.java new file mode 100644 index 000000000..ff3d47c3d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/SirPalomedes.java @@ -0,0 +1,76 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Handles the SirPalomedes dialogue. + * @author Vexia + */ +public class SirPalomedes extends DialoguePlugin { + + /** + * Constructs a new {@code SirPalomedes} {@code Object} + */ + public SirPalomedes() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code SirPalomedes} {@code Object} + * @param player the player. + */ + public SirPalomedes(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there adventurer, what do you want of me?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + if (quest.getStage(player) == 100) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Congratulations on freeing Merlin!"); + stage = 20; + } else if (quest.getStage(player) >= 10 && quest.getStage(player) < 50) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like some advice on breaking that Crystal Merlin's", "trapped in."); + stage = 1; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I am afraid I have no time to chat."); + stage = 20; + } + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Sorry, I cannot help you with that."); + stage = 20; + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirPalomedes(player); + } + + @Override + public int[] getIds() { + return new int[] { 3787 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java new file mode 100644 index 000000000..32e586334 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/TheLadyOfTheLake.java @@ -0,0 +1,262 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.container.impl.EquipmentContainer; +import core.tools.Items; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Handles the LadyOfTheLake dialogue. + * + * @author Vexia + * @author Splinter + */ +public class TheLadyOfTheLake extends DialoguePlugin { + + /** + * Constructs a new {@code TheLadyOfTheLake} {@code Object} + */ + public TheLadyOfTheLake() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code TheLadyOfTheLake} {@code Object} + * + * @param player the player. + */ + public TheLadyOfTheLake(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (!player.hasItem(new Item(35, 1))) { + npc("Good day to you, " + (player.isMale() ? "sir" : "madam") + "."); + stage = 0; + } else { + npc("Good day to you, " + (player.isMale() ? "sir" : "madam") + "."); + stage = 699; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + switch (stage) { + case 999: + end(); + break; + case 0: + options("Who are you?", "I seek the sword Excalibur.", "Good day."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 100; + break; + case 2: + player("I seek the sword Excalibur."); + if (quest.getStage(player) < 50) { + stage = 250; + } else { + stage = 161; + } + break; + case 3: + player("Good day."); + stage = 999; + break; + } + break; + case 250: + npc("I am afraid I do not know what you are talking about."); + stage = 171; + break; + case 100: + npc("I am the Lady of the Lake."); + if (player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(2) + && player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null + && player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == 14631 + && (player.getInventory().containsAtLeastOneItem(Items.EXCALIBUR_35) || player.getEquipment().containsAtLeastOneItem(Items.EXCALIBUR_35))) { + stage = 110; + } else { + stage = 145; + } + break; + case 110: + player("And I'm-"); + stage++; + break; + case 111: + npc("You're " + player.getName() + ". And I see from the sign you", "wear that you have earned the trust of Sir Kay."); + stage++; + break; + case 112: + player("It was nothing.. really..."); + stage++; + break; + case 113: + npc("You shall be rewarded handsomely!"); + stage++; + break; + case 114: + interpreter.sendItemMessage(Items.EXCALIBUR_35, "The Lady of the Lake reaches out and touches the", "blade Excalibur which seems to vibrate with new power."); + if (player.getInventory().containsAtLeastOneItem(Items.EXCALIBUR_35)) { + player.getInventory().remove(new Item(Items.EXCALIBUR_35)); + player.getInventory().add(new Item(14632)); + } else if (player.getEquipment().containsAtLeastOneItem(Items.EXCALIBUR_35)) { + player.getEquipment().remove(new Item(Items.EXCALIBUR_35)); + player.getEquipment().add(new Item(14632), true, false); + } + stage++; + break; + case 115: + player("What does this do then?"); + stage++; + break; + case 116: + npc("I made the blade more powerful, and also gave it a", "rather healthy effect when you use the special."); + stage++; + break; + case 117: + player("Thanks!"); + stage = 999; + break; + case 145: + options("I seek the sword Excalibur.", "Good day."); + stage = 150; + break; + case 150: + switch (buttonId) { + case 1: + player("I seek the sword Excalibur."); + stage = 161; + break; + case 2: + player("Good day."); + stage = 999; + break; + } + break; + case 161: + if (quest.getStage(player) == 50 || quest.getStage(player) == 60) {// they haven't proven themselves yet + npc("Aye, I have that artefact in my possession."); + stage = 300; + } else if (quest.getStage(player) >= 70) { + npc("... But you have already proved thyself to be worthy", "of wielding it once already. I shall return it to you", "if you can prove yourself to still be worthy."); + stage = 162; + } + break; + case 162: + player("... And how can I do that?"); + stage = 163; + break; + case 163: + npc("Why, by proving yourself to be above material goods."); + stage = 164; + break; + case 164: + npc("500 coins ought to do it."); + stage = 166; + break; + case 166: + if (player.getInventory().contains(995, 500)) { + player("Ok, here you go."); + stage = 168; + } else { + player("I don't have that kind of money..."); + stage = 167; + } + break; + case 167: + npc("Well, come back when you do."); + stage = 999; + break; + case 168: + if (player.getInventory().freeSlots() == 0) { + player("Sorry, I don't seem to have enough inventory space."); + stage = 999; + } else if (player.getInventory().contains(995, 500)) { + player.getInventory().remove(new Item(995, 500)); + player.getInventory().add(new Item(35, 1)); + npc("You are still worthy to wield Excalibur! And thanks", "for the cash! I felt like getting a new haircut!"); + stage = 170; + } else { + player("I don't have that kind of money..."); + stage = 167; + } + break; + case 170: + interpreter.sendDialogue("The lady of the Lake hands you Excalibur."); + stage = 999; + break; + case 300: + npc("'Tis very valuable, and not an artefact to be given", "away lightly."); + stage = 301; + break; + case 301: + npc("I would want to give it away only to one who is worthy", "and good."); + stage = 302; + break; + case 302: + player("And how am I meant to prove that?"); + stage = 303; + break; + case 303: + npc("I shall set a test for you."); + stage = 304; + break; + case 304: + npc("First I need you to travel to Port Sarim. Then go to", "the upstairs room of the jeweller's shop there."); + stage = 305; + break; + case 305: + player("Ok. That seems easy enough."); + quest.setStage(player, 60); + stage = 171; + break; + case 699: + options("Who are you?", "Good day."); + stage = 700; + break; + case 700: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 720; + break; + case 2: + player("Good day."); + stage = 999; + break; + } + break; + case 720: + npc("I am the Lady of the Lake."); + stage = 999; + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TheLadyOfTheLake(player); + } + + @Override + public int[] getIds() { + return new int[]{250}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/ThrantaxDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/ThrantaxDialogue.java new file mode 100644 index 000000000..1737c9d5b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/merlinscrystal/ThrantaxDialogue.java @@ -0,0 +1,158 @@ +package core.game.content.quest.members.merlinscrystal; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Handles the thrantax dialogue. + * @author Vexia + * @author Splinter + */ +public class ThrantaxDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ThrantaxDialogue} {@code Object} + */ + public ThrantaxDialogue() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code ThrantaxDialogue} {@code Object} + * @param player the player. + */ + public ThrantaxDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("Suddenly a mighty spirit appears!"); + player.lock(); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Now what were those magic words again?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Snarthtrick Candanto Termon", "Snarthon Candtrick Termanto", "Snarthanto Cando Termtrick"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Snarthtrick..."); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Snarthon..."); + stage = 201; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Snarthanto..."); + stage = 300; + break; + } + break; + case 100: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Candanto..."); + stage = 101; + break; + case 101: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Termon!"); + stage = 500; + break; + case 200: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Candtrick..."); + stage = 201; + break; + case 201: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Termanto!"); + stage = 203; + break; + case 300: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Cando..."); + stage = 301; + break; + case 301: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Termtrick!"); + stage = 500; + break; + case 203: + interpreter.sendDialogues(238, FacialExpression.HALF_GUILTY, "GRAAAAAARGH!"); + stage = 204; + break; + case 204: + interpreter.sendDialogues(238, FacialExpression.HALF_GUILTY, "Thou hast me in thine control. So that I mayst return", "from whence I came, I must grant thee a boon."); + stage = 205; + break; + case 205: + interpreter.sendDialogues(238, FacialExpression.HALF_GUILTY, "What dost thou wish of me?"); + stage = 206; + break; + case 206: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I wish you to free Merlin from his giant crystal!"); + stage = 207; + break; + case 207: + interpreter.sendDialogues(238, FacialExpression.HALF_GUILTY, "GRAAAAAARGH!"); + stage = 208; + break; + case 208: + interpreter.sendDialogues(238, FacialExpression.HALF_GUILTY, "The deed is done."); + stage = 209; + break; + case 209: + interpreter.sendDialogues(238, FacialExpression.HALF_GUILTY, "Thou mayst now shatter Merlin's Crystal with", "Excalibur,"); + stage = 210; + break; + case 210: + interpreter.sendDialogues(238, FacialExpression.HALF_GUILTY, "and I can once more rest. Begone! And leave me once", "more in peace."); + stage = 1000; + break; + case 303: + break; + case 500: + end(); + player.getPacketDispatch().sendMessage("That was the incorrect incantation. The spirit attacks!"); + player.unlock(); + NPC npc = player.getAttribute("thrantax_npc", null); + if (npc != null) { + npc.attack(player); + } + player.removeAttribute("thrantax_npc"); + end(); + break; + case 1000: + player.removeAttribute("thrantax_npc"); + player.unlock(); + quest.setStage(player, 90); + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ThrantaxDialogue(player); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("thrantax_dialogue"), 238 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/ElunedDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/ElunedDialogue.java new file mode 100644 index 000000000..37f29b19b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/ElunedDialogue.java @@ -0,0 +1,187 @@ +package core.game.content.quest.members.rovingelves; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Handles Eluned's Dialogue for Roving Elves. + * @author Splinter + */ +public class ElunedDialogue extends DialoguePlugin { + + public ElunedDialogue() { + + } + + public ElunedDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 1679 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Roving Elves"); + switch (stage) { + case 500: + end(); + break; + case 1000: + if (quest.getStage(player) == 15 && !player.getInventory().contains(RovingElves.CONSECRATION_SEED_CHARGED.getId(), 1)) { + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Hello, any luck finding the consecration seed?"); + stage = 1002; + } + if (quest.getStage(player) == 15 && player.getInventory().contains(RovingElves.CONSECRATION_SEED_CHARGED.getId(), 1)) { + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "You still have the charged seed with you, I can feel it.", "Hurry adventurer, go plant the seed and free", "my grandmother's spirit."); + stage = 500; + } + if (quest.getStage(player) == 15 && player.getInventory().contains(RovingElves.CONSECRATION_SEED.getId(), 1)) { + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Hello, any luck finding the consecration seed?"); + stage = 1002; + } + if (quest.getStage(player) == 20) { + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Hey... how's it going? Have you managed to", "reconsecrate Glarial's resting place?"); + stage = 12; + } else if (quest.getStage(player) != 15) { + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Hello there, it's a lovely day for a walk in the woods.", "So what can I help you with?"); + stage = 1001; + } + break; + case 1001: + if (quest.getStage(player) >= 100) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I am looking to buy teleportation crystals."); + stage = 1200; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm just looking around."); + stage = 500; + } + break; + case 1002: + if (player.getInventory().contains(RovingElves.CONSECRATION_SEED.getId(), 1)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, I have it here."); + stage = 6; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I forgot what you told me to do."); + stage = 1003; + } + break; + case 1003: + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Re-enter Glarial's tomb and defeat the tomb's guardian.", "Take the consecration seed it is guarding and", "bring it back to me."); + stage = 500; + break; + case 1200: + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Very well. I'll sell you a brand new teleportation", "crystal for 750 gold. What do you say?"); + stage = 1202; + break; + case 1202: + interpreter.sendOptions("Select an Option", "Buy a crystal", "Nevermind"); + stage = 1203; + break; + case 1203: + switch (buttonId) { + case 1: + stage = 1204; + if (!player.getInventory().contains(995, 750)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Actually, I don't have enough coins."); + } else { + interpreter.sendDialogue("You purchase an elven teleportation crystal for 750 gold."); + if (player.getInventory().remove(new Item(995, 750))) { + player.getInventory().add(new Item(6099, 1)); + } + } + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nevermind, I really must be going."); + stage = 1204; + break; + } + break; + case 1204: + end(); + break; + + /* Main dialogue */ + + case 1: + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "That I do... It is elvish tradition to plant a specially", "enchanted crystal seed at the graves of our ancestors.", "The seed will create guardians to protect the area."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Unfortunately the crystal seed must be tuned to the", "person it's protecting... a new seed won't do. But you", "should be able to recover the seed from her old tomb."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "The tomb's guardian will be protecting the seed, you'll", "need to defeat him to get it. Once you have it, return", "here and I will re-enchant it."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "OK... I'll be back as soon as I have it."); + stage = 5; + break; + case 5: + quest.setStage(player, 15); + end(); + break; + case 6: + interpreter.sendItemMessage(RovingElves.CONSECRATION_SEED.getId(), "You hand the crystal seed to Eluned."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, ""); + stage = 8; + break; + case 8: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How odd. I can see her lips moving... But there's no", "sound."); + stage = 9; + break; + case 9: + if (player.getInventory().remove(RovingElves.CONSECRATION_SEED)) { + player.getInventory().add(RovingElves.CONSECRATION_SEED_CHARGED); + } + interpreter.sendItemMessage(RovingElves.CONSECRATION_SEED_CHARGED.getId(), "Eluned hands you an enchanted crystal seed."); + stage = 10; + break; + case 10: + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Plant this seed in Glarial's new tomb, close to her", "remains and she will rest in peace."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "OK."); + stage = 500; + break; + case 12: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, it's done."); + stage = 13; + break; + case 13: + interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Well done... You should go see Islwyn, but I'd guess he", "already knows."); + stage = 500; + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ElunedDialogue(player); + } + + @Override + public boolean open(Object... args) { + final Quest quest = player.getQuestRepository().getQuest("Roving Elves"); + if (quest.getStage(player) == 10) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hey there... Islwyn said you may be able to help me.", "He told me you know how to consecrate ground for an", "elven burial. I need to reconsecrate Glarial's resting", "place."); + stage = 1; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Good day."); + stage = 1000; + } + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/IslwynDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/IslwynDialogue.java new file mode 100644 index 000000000..bd44ad462 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/IslwynDialogue.java @@ -0,0 +1,374 @@ +package core.game.content.quest.members.rovingelves; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; + +/** + * Handles Islwyn's dialogue for Roving Elves. + * @author Splinter + */ +public class IslwynDialogue extends DialoguePlugin { + + public IslwynDialogue() { + + } + + public IslwynDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("islwyn_dialogue"), 1680 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Roving Elves"); + switch (stage) { + case 500: + end(); + break; + case 1000: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Hello there, it's a lovely day for a walk in the woods.", "So what can I help you with?"); + stage = 1001; + break; + case 1001: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm just looking around."); + stage = 500; + break; + case 2000: + if (quest.getStage(player) == 15) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes I have! She explained that I have to visit", "Glarial's old tomb and obtain a consecration seed", "from the temple guardian in there."); + stage = 2001; + } + if (quest.getStage(player) != 15) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Not yet, I'll be back when I have."); + stage = 500; + } + break; + case 2001: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Good luck against the guardian, adventurer.", "Do it in the name of my grandmother Glarial."); + stage = 500; + break; + /* main dialogue sequence */ + case 0: + if (quest.getStage(player) == 10 || quest.getStage(player) == 15) { + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Have you spoken to Eluned yet?"); + stage = 2000; + } + if (quest.getStage(player) == 20) { + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "You have returned! Thank you for all you have done.", "Now both me and my grandmother can rest in peace."); + stage = 19; + } else if (quest.getStage(player) != 10 && quest.getStage(player) != 15) { + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Leave me be, I have no time for easterners. Between", "your lot and them gnomes, all you do is take and", "destroy. No thought for others."); + stage = 1; + } + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "...but..."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Save your excuses young one! It was one of your", "species that disturbed my grandmother's remains. Will", "she never get the peace she deserves?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Grandmother?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Yes! Someone took her ashes from her tomb. If it", "wasn't for them gnomes she'd have been left in peace.", "But now I can sense her restlessness."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Gnomes?"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Yes gnomes! One of those little pests took the key to", "my grandmother's tomb. He must've given it to the", "human that desecrated the tomb."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Was your grandmother's name Glarial?"); + stage = 8; + break; + case 8: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Yes... How did you know that?"); + stage = 9; + break; + case 9: + interpreter.sendOptions("Do you want to;", "Tell the truth?", "Lie?", "Leave the old elf be?"); + stage = 10; + break; + case 10: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "It's a bit of a long tale, but to cut the story short, her", "remains reside in Baxtorian's home. I thought it's where", "she'd want to be. It was I that removed your", "grandmother's ashes."); + stage = 11; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I just guessed.", "Well, now that that's over, I really need to be", "going."); + stage = 500; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "On second thought, I really should be going."); + stage = 500; + break; + } + break; + case 11: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "You've been in grandfather's home? That's where we", "originally wanted to leave Glarial's ashes to rest, but we", "could not understand how to enter."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "This is gravely concerning... Her resting place must be", "consecrated."); + stage = 13; + break; + case 13: + interpreter.sendOptions("Select an Option", "Maybe I could help.", "Sounds like you've got a lot to do."); + stage = 14; + break; + case 14: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Maybe I could help. What needs doing to consecrate", "her new tomb?"); + stage = 15; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sounds like you've got a lot to do."); + stage = 500; + break; + } + break; + case 15: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Are you offering to help?!? Maybe not all humans are", "as bad as I thought."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "I don't know the consecration process. You should speak", "with Eluned... she is wise in the ways of the ritual."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'll see what I can do."); + stage = 18; + break; + case 18: + end(); + quest.start(player); + break; + case 19: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How did you know that I have consecrated the tomb?"); + stage = 20; + break; + case 20: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Her restlessness has finally left me. Here - I should", "give you something for your effort."); + stage = 21; + break; + case 21: + interpreter.sendDoubleItemMessage(RovingElves.CRYSTAL_BOW_FULL, RovingElves.CRYSTAL_SHIELD_FULL, "Islwyn shows you a crystal bow and a crystal shield."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Crystal equipment is at its best when new and", "previously unused. The bow does not require", "ammunition and reduces in strength the more it's fired.", "The shield decreases in defensive capabilities the more"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "it's hit. Both the shield and the bow I am carrying only", "have 500 uses before they revert to seed."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Revert to seed? What do you mean?"); + stage = 25; + break; + case 25: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Ahhh, young one. It was thousands of years before we", "fully understood that ourselves. All will be explained if", "we feel you are ready. Now which one of these crystal", "creations would you like?"); + stage = 26; + break; + case 26: + interpreter.sendOptions("Select an Option", "Shields are for wimps! Give me the bow!", "I don't like running and hiding behind mushrooms. Shield please!"); + stage = 27; + break; + case 27: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Shields are for wimps! Give me the bow!"); + stage = 30; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't like running and hiding behind mushrooms.", "Shield please!"); + stage = 301; + break; + } + break; + case 30: + if (!quest.isCompleted(player)) { + if (!player.getInventory().add(new Item(4222, 1))) { + GroundItemManager.create(new Item(4222, 1), player); + } + end(); + quest.setStage(player, 100); + quest.finish(player); + } + end(); + break; + case 301: + if (!quest.isCompleted(player)) { + if (!player.getInventory().add(new Item(4233, 1))) { + GroundItemManager.create(new Item(4233, 1), player); + } + end(); + quest.setStage(player, 100); + quest.finish(player); + } + end(); + break; + case 31: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Welcome back to the land of the elves, friend!", "Do you need your seeds charged into equipment?"); + stage = 32; + break; + case 32: + interpreter.sendOptions("Select an Option", "I need to buy a new piece of equipment.", "I need to recharge my seeds into equipment."); + stage = 33; + break; + case 33: + switch (buttonId) { + case 1: + interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Ah, very well.", "I will sell you a new bow or shield for 750,000 coins."); + stage = 37; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I need to recharge my current seeds into equipment."); + stage = 34; + break; + } + break; + case 34: + interpreter.sendOptions("Select an Option", "Recharge seed into bow", "Recharge seed into shield"); + stage = 35; + break; + case 35: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Recharge my seed into a bow, please."); + stage = 36; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Recharge my seed into a shield, please."); + stage = 3601; + break; + } + break; + case 36: + if (!player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { + interpreter.sendDialogue("You don't have any seeds to recharge."); + stage = 500; + } + if (!player.getInventory().contains(995, 500000)) { + interpreter.sendDialogue("You don't have enough coins."); + stage = 500; + } + if (player.getInventory().contains(995, 500000) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { + if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(995, 500000))) { + player.getInventory().add(new Item(4214, 1)); + end(); + } + } + break; + case 3601: + if (!player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { + interpreter.sendDialogue("You don't have any seeds to recharge."); + stage = 500; + } + if (!player.getInventory().contains(995, 500000)) { + interpreter.sendDialogue("You don't have enough coins."); + stage = 500; + } + if (player.getInventory().contains(995, 500000) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { + if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(995, 500000))) { + player.getInventory().add(new Item(4225, 1)); + end(); + } + } + break; + case 37: + interpreter.sendOptions("Select an Option", "Purchase bow", "Purchase shield"); + stage = 38; + break; + case 38: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like to buy a new bow."); + stage = 39; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'd like to buy a new shield."); + stage = 40; + break; + } + break; + case 39: + if (!player.getInventory().contains(995, 750000)) { + interpreter.sendDialogue("You don't have enough coins."); + stage = 500; + } + if (player.getInventory().contains(995, 750000)) { + if (player.getInventory().remove(new Item(995, 750000))) { + if (!player.getInventory().add(new Item(4214, 1))) { + GroundItemManager.create(new Item(4214, 1), player); + } + end(); + } + } + break; + case 40: + if (!player.getInventory().contains(995, 750000)) { + interpreter.sendDialogue("You don't have enough coins."); + stage = 500; + } + if (player.getInventory().contains(995, 750000)) { + if (player.getInventory().remove(new Item(995, 750000))) { + if (!player.getInventory().add(new Item(4225, 1))) { + GroundItemManager.create(new Item(4225, 1), player); + } + end(); + } + } + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new IslwynDialogue(player); + } + + @Override + public boolean open(Object... args) { + final Quest quest = player.getQuestRepository().getQuest("Roving Elves"); + final Quest waterfall = player.getQuestRepository().getQuest("Waterfall"); + if (quest.getStage(player) == 0 && waterfall.isCompleted(player)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + } + if (!waterfall.isCompleted(player)) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 1000; + } + if (quest.isStarted(player) && quest.getStage(player) >= 10) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello Islwyn."); + stage = 0; + } + if (quest.isCompleted(player) || quest.getStage(player) >= 100) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello Islwyn, I'm back."); + stage = 31; + } + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.java new file mode 100644 index 000000000..0eae0aad4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/MossGiantGuardianNPC.java @@ -0,0 +1,83 @@ +package core.game.content.quest.members.rovingelves; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * The level 84 Moss Giant in Glarial's tomb. + * @author Splinter + */ +public final class MossGiantGuardianNPC extends AbstractNPC { + + /** + * Constructs a new {@code MossGiantGuardianNPC} {@code Object}. + */ + public MossGiantGuardianNPC() { + super(0, null); + } + + /** + * Constructs a new {@code MossGiantGuardianNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public MossGiantGuardianNPC(int id, Location location) { + super(id, location); + this.setAggressive(true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MossGiantGuardianNPC(id, location); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player player = (Player) killer; + final Quest quest = player.getQuestRepository().getQuest("Roving Elves"); + if (quest.getStage(player) == 15 && !player.getInventory().contains(RovingElves.CONSECRATION_SEED.getId(), 1)) { + player.getPacketDispatch().sendMessages("A small grey seed drops on the ground."); + GroundItemManager.create(new Item(RovingElves.CONSECRATION_SEED.getId()), getLocation(), player); + } + } + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(getIds()[0]).getHandlers().put("option:attack", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + ((NPC) node).attack(player); + return true; + } + + }); + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return new int[] { 1681 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/RovingElves.java b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/RovingElves.java new file mode 100644 index 000000000..fe008b98c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/RovingElves.java @@ -0,0 +1,105 @@ +package core.game.content.quest.members.rovingelves; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * The Roving Elves quest. + * @author Splinter + */ +@Initializable +public class RovingElves extends Quest { + + /** + * Crystal Bow (full) + */ + public static final Item CRYSTAL_BOW_FULL = new Item(4214); + + /** + * Crystal Shield (full) + */ + public static final Item CRYSTAL_SHIELD_FULL = new Item(4225); + + /** + * The little seed. + */ + public static final Item CONSECRATION_SEED = new Item(4205); + + /** + * The little seed. (charged) + */ + public static final Item CONSECRATION_SEED_CHARGED = new Item(4206); + + /** + * Crystal seed, ready to be made into equipment + */ + public static final Item CRYSTAL_SEED = new Item(4207); + + /** + * Constructs a new {@Code RovingElves} {@Code Object} + */ + public RovingElves() { + super("Roving Elves", 105, 104, 1, 402, 0, 1, 6); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + line(player, "I can start this quest by talking to Islwyn found in Isafdar.Minimum requirements:I must have completed the Waterfall questI must be able to kill a level 84 moss giant unarmed", 11); + break; + case 10: + line(player, "It appears that when I recovered Glarial's ashes fromher tomb near the waterfall, I disturbed her peace.I talked to Islwyn, an elf that I found in the woods.When I offered to help he said I should talk with Eluned,she will tell me how elven consecration is done.", 11); + break; + case 15: + if (player.getInventory().contains(CONSECRATION_SEED.getId(), 1)) { + line(player, "It appears that when I recovered Glarial's ashes fromher tomb near the waterfall, I disturbed her peace.I talked to Islwyn, an elf that I found in the woods.When I offered to help he said I should talk with Eluned,she will tell me how elven consecration is done.Eluned told me that I must acquire the old consecration seed from the guardian spirit in Glarial's old tomb.Once I have the old seed I will need to return to Eluned, whowill re-enchant it for me.I have the consecration seed. I should return to Elunedand have her enchant it for me.", 11); + } else { + line(player, "It appears that when I recovered Glarial's ashes fromher tomb near the waterfall, I disturbed her peace.I talked to Islwyn, an elf that I found in the woods.When I offered to help he said I should talk with Eluned,she will tell me how elven consecration is done.Eluned told me that I must acquire the old consecration seed from the guardian spirit in Glarial's old tomb.Once I have the old seed I will need to return to Eluned, whowill re-enchant it for me.", 11); + } + if (player.getInventory().contains(CONSECRATION_SEED_CHARGED.getId(), 1)) { + line(player, "It appears that when I recovered Glarial's ashes fromher tomb near the waterfall, I disturbed her peace.I talked to Islwyn, an elf that I found in the woods.When I offered to help he said I should talk with Eluned,she will tell me how elven consecration is done.Eluned told me that I must acquire the old consecration seed from the guardian spirit in Glarial's old tomb.Once I have the old seed I will need to return to Eluned, whowill re-enchant it for me.I have the charged consecration seed.I need to head to the treasure room under the waterfall and plant the consecration seed near the chalice in order to free Glarial's spirit.", 11); + } + break; + case 20: + line(player, "It appears that when I recovered Glarial's ashes fromher tomb near the waterfall, I disturbed her peace.I talked to Islwyn, an elf that I found in the woods.When I offered to help he said I should talk with Eluned,she will tell me how elven consecration is done.Eluned told me that I must acquire the old consecration seed from the guardian spirit in Glarial's old tomb.Once I have the old seed I will need to return to Eluned, whowill re-enchant it for me.I have the charged consecration seed.I need to head to the treasure room under the waterfall and plant the consecration seed near the chalice in order to free Glarial's spirit.I have freed Glarial's spirit by planting the consecration seed nearthe chalice under the waterfall. The seed I planted vanished. I should go speak to Eluned again.", 11); + break; + case 100: + line(player, "It appears that when I recovered Glarial's ashes fromher tomb near the waterfall, I disturbed her peace.I talked to Islwyn, an elf that I found in the woods.When I offered to help he said I should talk with Eluned,she will tell me how elven consecration is done.Eluned told me that I must acquire the old consecration seed from the guardian spirit in Glarial's old tomb.Once I have the old seed I will need to return to Eluned, whowill re-enchant it for me.I have the charged consecration seed.I need to head to the treasure room under the waterfall and plant the consecration seed near the chalice in order to free Glarial's spirit.I have freed Glarial's spirit by planting the consecration seed nearthe chalice under the waterfall. The seed I planted vanished. I should go speak to Eluned again.QUEST COMPLETE!", 11); + break; + } + } + + @Override + public void start(Player player) { + super.start(player); + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("1 Quest Point", 277, 8+ 2); + player.getPacketDispatch().sendString("Used elf equipment.", 277, 9+ 2); + player.getPacketDispatch().sendString("10000 Strength XP", 277, 10+ 2); + player.getPacketDispatch().sendString("You have completed Roving Elves!", 277, 2+ 2); + player.getPacketDispatch().sendItemZoomOnInterface(CRYSTAL_BOW_FULL.getId(), 235, 277, 3+ 2); + player.getSkills().addExperience(Skills.STRENGTH, 10000); + player.getQuestRepository().syncronizeTab(player); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugin(new RovingElvesPlugin()); + PluginManager.definePlugin(new RovingElvesObstacles()); + PluginManager.definePlugin(new ElunedDialogue()); + PluginManager.definePlugin(new IslwynDialogue()); + PluginManager.definePlugin(new MossGiantGuardianNPC()); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/RovingElvesObstacles.java b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/RovingElvesObstacles.java new file mode 100644 index 000000000..8cc28ef43 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/RovingElvesObstacles.java @@ -0,0 +1,91 @@ +package core.game.content.quest.members.rovingelves; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles all the agility obstacles for Roving Elves. + * @author Splinter + */ +public final class RovingElvesObstacles extends OptionHandler { + + // TODO: TRIPWIRE + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(3999).getHandlers().put("option:enter", this); + ObjectDefinition.forId(3939).getHandlers().put("option:enter", this); + ObjectDefinition.forId(3998).getHandlers().put("option:enter", this); + ObjectDefinition.forId(3938).getHandlers().put("option:enter", this); + ObjectDefinition.forId(3937).getHandlers().put("option:enter", this); + ObjectDefinition.forId(3924).getHandlers().put("option:jump", this); + ObjectDefinition.forId(3925).getHandlers().put("option:jump", this); + ObjectDefinition.forId(8742).getHandlers().put("option:pass", this); + return this; + } + + final Animation OVER = new Animation(840); + final Animation THROUGH = new Animation(749); + final Animation JUMP = new Animation(3067); + + @Override + public boolean handle(final Player player, Node node, String option) { + Direction NORTH_SOUTH = player.getLocation().getY() < node.getLocation().getY() ? Direction.NORTH : Direction.SOUTH; + Direction EAST_WEST = player.getLocation().getX() > node.getLocation().getX() ? Direction.WEST : Direction.EAST; + switch (node.getId()) { + case 8742: + player.teleport(player.getLocation().transform(EAST_WEST, 2)); + break; + case 3999: + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(NORTH_SOUTH, 3), OVER, 25, 0, null); + break; + case 3939: + case 3998: + case 3938: + if (node.getLocation().equals(new Location(2235, 3148)) || node.getLocation().equals(new Location(2238, 3148)) || node.getLocation().equals(new Location(2236, 3218)) || node.getLocation().equals(new Location(2230, 3218)) || node.getLocation().equals(new Location(2227, 3218))) { + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(EAST_WEST, 3), THROUGH, 25, 0, null); + } else { + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(NORTH_SOUTH, 3), THROUGH, 25, 0, null); + } + break; + case 3937: + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(EAST_WEST, 3), OVER, 25, 0, null); + break; + case 3924: + case 3925: + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(NORTH_SOUTH, 4), JUMP, 25, 0, null); + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + switch (node.getId()) { + case 3999: + return new Location(2188, 3162); + case 3998: + return new Location(2188, 3171); + } + return null; + } + + @Override + public boolean isWalk(Player player, Node node) { + return !(node instanceof Item); + } + + @Override + public boolean isWalk() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/RovingElvesPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/RovingElvesPlugin.java new file mode 100644 index 000000000..a4c1f0e86 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/rovingelves/RovingElvesPlugin.java @@ -0,0 +1,102 @@ +package core.game.content.quest.members.rovingelves; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Master plugin file for Roving Elves. + * @author Splinter + */ +public final class RovingElvesPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(5252).getHandlers().put("option:search", this); + ItemDefinition.forId(RovingElves.CONSECRATION_SEED_CHARGED.getId()).getHandlers().put("option:plant", this); + return this; + } + + /** + * The digging animation. + */ + public static final Animation ANIMATION_DIG = Animation.create(830); + + /** + * The drop animation. + */ + public static final Animation ANIMATION_DROP = Animation.create(827); + + @SuppressWarnings("static-access") + @Override + public boolean handle(final Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Roving Elves"); + if (quest == null) { + player.sendMessage("Error! RovingElves quest cannot be found, please contact an admin!"); + return true; + } + switch (node.getId()) { + case 5252: + player.getDialogueInterpreter().sendDialogue("The firepit is still warm, there must be travellers about. Maybe I", "should look for them."); + break; + case 4206: + if (player.getLocation().getDistance(new Location(2603, 9911), player.getLocation()) <= 3 && quest.getStage(player) == 15) { + if (!player.getInventory().containsItem(new Item(952, 1))) { + player.getPacketDispatch().sendMessage("You need a spade to plant the seed."); + } else { + player.animate(ANIMATION_DIG); + player.getPacketDispatch().sendMessage("You dig a small hole with your spade."); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (counter++) { + case 3: + player.getPacketDispatch().sendMessage("You drop the crystal seed in the hole."); + player.animate(ANIMATION_DROP); + player.faceLocation(new Location(2604, 9907, 0)); + break; + case 6: + player.getInventory().remove(new Item(RovingElves.CONSECRATION_SEED_CHARGED.getId())); + quest.setStage(player, 20); + player.getPacketDispatch().sendGlobalPositionGraphic(719, new Location(2604, 9907, 0)); + player.getPacketDispatch().sendMessage("The seed vanishes in a puff of smoke."); + break; + } + return false; + } + }); + } + } + break; + } + + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + return null; + } + + @Override + public boolean isWalk(Player player, Node node) { + return !(node instanceof Item); + } + + @Override + public boolean isWalk() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/GateInteractionHandler.java b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/GateInteractionHandler.java new file mode 100644 index 000000000..0c133bf0e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/GateInteractionHandler.java @@ -0,0 +1,53 @@ +package core.game.content.quest.members.sheepherder; + +import core.game.interaction.DestinationFlag; +import core.game.interaction.MovementPulse; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + + +@Initializable +public class GateInteractionHandler extends PluginInteraction { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[]{167,166}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.OBJECT); + return this; + } + + @Override + public boolean handle(Player player, Node node) { + switch(node.getId()){ + case 167: + case 166: + return handleGate(player,node); + } + return false; + } + + public boolean handleGate(Player player, Node obj){ + if(!player.getEquipment().containsAll(SheepHerder.PLAGUE_BOTTOM.getId(),SheepHerder.PLAGUE_TOP.getId())) { + player.getPulseManager().run(new MovementPulse(player, DestinationFlag.OBJECT.getDestination(player, obj)) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogues(SheepHerder.FARMER_BRUMTY, FacialExpression.SUSPICIOUS, "You can't enter without your protective gear!", "Can't have you spreading the plague!"); + return true; + } + }, "movement"); + return true; + } + return false; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/HalgriveDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/HalgriveDialogue.java new file mode 100644 index 000000000..1ee9aa794 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/HalgriveDialogue.java @@ -0,0 +1,166 @@ +package core.game.content.quest.members.sheepherder; + +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; + +@Initializable +public class HalgriveDialogue extends DialoguePlugin { + public HalgriveDialogue(){ + //empty + } + + public HalgriveDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new HalgriveDialogue(player); + } + + @Override + public boolean open(Object... args) { + if(player.getQuestRepository().getStage("Sheep Herder") < 10) { + player("Hello. How are you?"); + stage = 0; + return true; + } else { + npc("Have you managed to find and dispose of those four","plague-bearing sheep yet?"); + stage = 200; + return true; + } + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch(stage){ + case 0: + npc("I've been better."); + stage++; + break; + case 1: + options("What's wrong?","That's life for you."); + stage++; + break; + case 2: + switch(buttonId){ + case 1: + player("What's wrong?"); + stage = 10; + break; + case 2: + player("That's life for you."); + stage = 108; + break; + } + break; + case 10: + npc("You may or may not be aware, but a plague has","spread across Western Ardougne. Now, so far, our","efforts to contain it have been largely successful, for the","most part."); + stage++; + break; + case 11: + npc("However, four sheep recently escaped from a farm near","the city. When they were found, we noticed that they","were strangely discoloured, so we asked the mourners","to examine them."); + stage++; + break; + case 12: + npc("They found that the sheep had become infected with the","plague."); + stage++; + break; + case 13: + npc("As the councillor responsible for public health and safety","here in East Ardougne I am looking for someone to","herd these sheep into a safe enclosure, kill them quickly","and cleanly and then dispose of the remains hygienically"); + stage++; + break; + case 14: + npc("in a special incinerator."); + stage++; + break; + case 15: + npc("Unfortunately nobody wants to risk catching the plague,","and I am unable to find someone willing to undertake","this mission for me."); + stage++; + break; + case 16: + options("I can do that for you.","That's not a job for me."); + stage++; + break; + case 17: + switch(buttonId){ + case 1: + player("I can do that for you."); + stage = 100; + break; + case 2: + player("That's not a job for me."); + stage = 108; + break; + } + break; + case 100: + player.getQuestRepository().getQuest("Sheep Herder").start(player); + npc("Y-you will??? That is excellent news! Head to the","enclosure we have set up on Farmer Brumty's land to","the north of the city; the four infected sheep should still","be somewhere in that vicinity. Before you will be allowed"); + stage++; + break; + case 101: + npc("to enter the enclosure, however, you must ensure you","have some kind of protective clothing to prevent","contagion."); + stage++; + break; + case 102: + player("Where can I find some protective clothing then?"); + stage++; + break; + case 103: + npc("Doctor Orbon wears it when conducting mercy","missions to the infected parts of the city. You should be","able to find him in the chapel just north of here. Please","also take this poisoned sheep feed; we believe poisoning"); + stage++; + break; + case 104: + npc("the sheep will minimise the risk of airborne","contamination, and is of course also more humane to","the sheep."); + stage++; + break; + case 105: + player.getDialogueInterpreter().sendDialogue("The councillor gives you some poisoned sheep feed."); + player.getInventory().add(SheepHerder.POISON); + stage++; + break; + case 106: + player("How will I know which sheep are infected?"); + stage++; + break; + case 107: + npc("The poor creatures have developed strangely discoloured","wool and flesh. You should have no trouble spotting","them."); + stage++; + break; + case 108: + end(); + break; + case 200: + if(player.getAttribute("sheep_herder:all_dead",false)){ + player("Yes, I have."); + stage = 205; + } else { + player("No, I haven't."); + stage++; + } + break; + case 201: + npc("Well, please do hurry!"); + stage = 108; + break; + case 205: + npc("Excellent work adventurer! Please let me reimburse","you the 100 gold it cost you to purchase your","protective clothing."); + stage++; + break; + case 206: + npc("And in recognition of your service to the public health","of Ardougne please accept this further 3000 coins as a","reward."); + stage++; + break; + case 207: + player.getQuestRepository().getQuest("Sheep Herder").finish(player); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {289} ; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/HerderSheepNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/HerderSheepNPC.java new file mode 100644 index 000000000..05e9e6d38 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/HerderSheepNPC.java @@ -0,0 +1,63 @@ +package core.game.content.quest.members.sheepherder; + +import core.game.interaction.MovementPulse; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.path.Pathfinder; + +public class HerderSheepNPC extends NPC { + int ticksTilReturn = 0; + Location spawnLocation; + + public HerderSheepNPC(int id, Location location) { + super(id, location); + this.spawnLocation = location; + this.setNeverWalks(false); + this.unlock(); + this.setRespawn(true); + } + + @Override + public void handleTickActions() { + if(getAttribute("recently-prodded",false)) { + if(getLocation().withinDistance(Location.create(2593, 3362, 0),2)){ + getProperties().setTeleportLocation(Location.create(2599, 3360, 0)); + } + if (ticksTilReturn < GameWorld.getTicks()) { + sendChat("Baa"); + this.getPulseManager().run(new MovementPulse(this, spawnLocation) { + @Override + public boolean pulse() { + return true; + } + }); + this.removeAttribute("recently-prodded"); + } + } else { + if(nextWalk < GameWorld.getTicks() && !getPulseManager().hasPulseRunning()){ + setNextWalk(); + Location to = getMovementDestination(); + if (canMove(to)) { + Pathfinder.find(this, to, true, Pathfinder.DUMB).walk(this); + } + } + } + } + + public void moveTo(Location l){ + this.getPulseManager().run(new MovementPulse(this,l) { + @Override + public boolean pulse() { + return true; + } + }); + } + + @Override + public void finalizeDeath(Entity killer) { + this.setRespawnTick(GameWorld.getTicks() + 100); + super.finalizeDeath(killer); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/IncineratorHandler.java b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/IncineratorHandler.java new file mode 100644 index 000000000..5d36b96df --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/IncineratorHandler.java @@ -0,0 +1,70 @@ +package core.game.content.quest.members.sheepherder; + +import core.game.interaction.DestinationFlag; +import core.game.interaction.MovementPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + +import java.util.Objects; + +@Initializable +public class IncineratorHandler extends PluginInteraction { + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[] {SheepHerder.RED_SHEEP_BONES.getId(), SheepHerder.GREEN_SHEEP_BONES.getId(), SheepHerder.BLUE_SHEEP_BONES.getId(),SheepHerder.YELLOW_SHEEP_BONES.getId()}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.USEWITH); + return this; + } + + @Override + public boolean handle(Player player, NodeUsageEvent event) { + Node n = event.getUsedWith(); + if(n instanceof GameObject){ + GameObject obj = (GameObject) n; + if (n.getId() == 165) { + player.getPulseManager().run(new MovementPulse(player, DestinationFlag.OBJECT.getDestination(player,obj)) { + @Override + public boolean pulse() { + player.lock(2); + player.getInventory().remove(event.getUsedItem()); + player.getAnimator().reset(); + player.getAnimator().animate(new Animation(3243)); + switch (Objects.requireNonNull(event.getUsedItem()).getId()) { + case 280: + player.setAttribute("/save:sheep_herder:red_dead", true); + break; + case 281: + player.setAttribute("/save:sheep_herder:green_dead", true); + break; + case 282: + player.setAttribute("/save:sheep_herder:blue_dead", true); + break; + case 283: + player.setAttribute("/save:sheep_herder:yellow_dead", true); + break; + } + if (player.getAttribute("sheep_herder:red_dead", false) && player.getAttribute("sheep_herder:green_dead", false) && player.getAttribute("sheep_herder:blue_dead", false) && player.getAttribute("sheep_herder:yellow_dead", false)) { + player.setAttribute("/save:sheep_herder:all_dead", true); + } + return true; + } + }); + return true; + } + } + return false; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/OrbonDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/OrbonDialogue.java new file mode 100644 index 000000000..07a6476a9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/OrbonDialogue.java @@ -0,0 +1,98 @@ +package core.game.content.quest.members.sheepherder; + +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; + +@Initializable +public class OrbonDialogue extends DialoguePlugin { + public OrbonDialogue(){ + //empty + } + public OrbonDialogue(Player player){super(player);} + + + @Override + public DialoguePlugin newInstance(Player player) { + return new OrbonDialogue(player); + } + + @Override + public boolean open(Object... args) { + if(player.getQuestRepository().getStage("Sheep Herder") == 10){ + player("Hello doctor. I need to acquire some protective clothing","so that I can dispose of some escaped sheep infected","with the plague."); + stage = 100; + return true; + } else { + player.sendMessage("He doesn't seem interested in talking with you right now."); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch(stage){ + case 100: + npc("Protective clothing? I'm afraid I only have the one suit","which I made myself to prevent infection from the","contaminated patients I treat."); + stage++; + break; + case 101: + npc("I suppose I could sell you this one and make myself","another, but it would cost you at least 100 gold so that","I could afford a replacement."); + stage++; + break; + case 102: + options("Sorry doc, that's too much.","Ok, I'll take it."); + stage++; + break; + case 103: + switch(buttonId){ + case 1: + player("Sorry doc, that's too much."); + stage = 120; + break; + case 2: + player("Ok, I'll take it."); + stage++; + break; + } + break; + case 104: + if(player.getInventory().containsItem(new Item(995,100))){ + player.getInventory().remove(new Item(995,100)); + if(!player.getInventory().add(SheepHerder.PLAGUE_BOTTOM, SheepHerder.PLAGUE_TOP)){ + GroundItemManager.create(SheepHerder.PLAGUE_TOP,player.getLocation(),player); + GroundItemManager.create(SheepHerder.PLAGUE_BOTTOM,player.getLocation(),player); + } + player.getDialogueInterpreter().sendDialogue("You give Doctor Orbon 100 coins. Doctor Orbon hands over a","protective suit."); + stage++; + break; + } else { + player("I would love to, but I don't have enough.."); + stage = 120; + break; + } + case 105: + npc("These should protect you from infection."); + stage++; + break; + case 106: + end(); + break; + case 120: + npc("That's unfortunate."); + stage++; + break; + case 121: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {290}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/ProdActionHandler.java b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/ProdActionHandler.java new file mode 100644 index 000000000..b1214c5cc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/ProdActionHandler.java @@ -0,0 +1,80 @@ +package core.game.content.quest.members.sheepherder; + +import core.game.interaction.DestinationFlag; +import core.game.interaction.MovementPulse; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + +@Initializable +public class ProdActionHandler extends PluginInteraction { + + @Override + public boolean handle(Player player, NPC npc, Option option) { + HerderSheepNPC n = (HerderSheepNPC) npc; + if(option.getName().toLowerCase().equals("prod")){ + player.getPulseManager().run(new MovementPulse(player,getDestination(player,n)) { + @Override + public boolean pulse() { + handleProd(player,n); + return true; + } + }, "movement"); + return true; + } + return false; + } + + public Location getDestination(Player p, Node n){ + return DestinationFlag.ENTITY.getDestination(p,n); + } + + public void handleProd(Player p, HerderSheepNPC n){ + p.faceLocation(n.getLocation()); + Pulse prodPulse = new Pulse() { + @Override + public boolean pulse() { + if(p.getEquipment().containsItem(SheepHerder.CATTLE_PROD)){ + p.getAnimator().reset(); + p.getAnimator().animate(new Animation(412)); + int diffX = n.getLocation().getX() - p.getLocation().getX(); + int diffY = n.getLocation().getY() - p.getLocation().getY(); + int steps = RandomFunction.random(3,5); + Location destination = n.getLocation().transform((diffX) * steps, (diffY) * steps,0); + n.sendChat("BAAAAA!"); + n.moveTo(destination); + n.setAttribute("recently-prodded",true); + n.ticksTilReturn = GameWorld.getTicks() + 20; + return true; + } else { + p.sendMessage("You can't prod a sheep with your bare hands."); + return true; + } + } + }; + p.getPulseManager().run(prodPulse); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[] {SheepHerder.RED_SHEEP,SheepHerder.BLUE_SHEEP,SheepHerder.GREEN_SHEEP,SheepHerder.YELLOW_SHEEP}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.NPC); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/SheepHerder.java b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/SheepHerder.java new file mode 100644 index 000000000..06d28051a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/SheepHerder.java @@ -0,0 +1,115 @@ +package core.game.content.quest.members.sheepherder; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.Items; + +import java.util.HashMap; + +@Initializable +public class SheepHerder extends Quest { + public static Item CATTLE_PROD = new Item(Items.CATTLEPROD_278); + public static Item POISON = new Item(279); + public static Item PLAGUE_TOP = new Item(284); + public static Item PLAGUE_BOTTOM = new Item(285); + public static Item RED_SHEEP_BONES = new Item(Items.SHEEP_BONES_1_280); + public static Item GREEN_SHEEP_BONES = new Item(Items.SHEEP_BONES_2_281); + public static Item BLUE_SHEEP_BONES = new Item(Items.SHEEP_BONES_3_282); + public static Item YELLOW_SHEEP_BONES = new Item(Items.SHEEP_BONES_4_283); + public static int RED_SHEEP = 2345; + public static int GREEN_SHEEP = 2346; + public static int BLUE_SHEEP = 2347; + public static int YELLOW_SHEEP = 2348; + public static int FARMER_BRUMTY = 291; + + public static HashMap boneMap = new HashMap<>(); + static{ + boneMap.put(RED_SHEEP,RED_SHEEP_BONES); + boneMap.put(GREEN_SHEEP,GREEN_SHEEP_BONES); + boneMap.put(YELLOW_SHEEP,YELLOW_SHEEP_BONES); + boneMap.put(BLUE_SHEEP,BLUE_SHEEP_BONES); + } + + public SheepHerder(){super("Sheep Herder",113,112,4,60,0,1,3);} + + @Override + public void drawJournal(Player player, int stage) { + boolean hasGear = (player.getInventory().containsItem(PLAGUE_BOTTOM) && player.getInventory().containsItem(PLAGUE_TOP) || (player.getEquipment().containsItem(PLAGUE_BOTTOM) && player.getEquipment().containsItem(PLAGUE_TOP))) || stage >= 20; + int line = 11; + boolean sheepDead = player.getAttribute("sheep_herder:all_dead",false); + super.drawJournal(player, stage); + if(stage < 10){ + line(player,"I can start this quest by speaking to !!Councillor Halgrive??",line++); + line(player, "near to the !!Zoo?? in !!East Ardougne.??",line++); + } else { + switch(stage){ + case 10: + line(player, "!!Councillor Halgrive?? said I should speak to !!Doctor Orbon?? about", line++, hasGear); + line(player, "Getting some protective gear.", line++, hasGear); + line(player, "I need to !!locate the diseased sheep?? and corral them !!into the pin??", line++,sheepDead); + line(player, "After which, I need to !!poison them?? and !!incinerate their bones.??", line++,sheepDead); + if(sheepDead) { + line(player,"I should inform !!Councillor Halgrive?? that I have taken care of the problem.",line++); + } else { + line(player, "I still need:", line++); + line(player, "A !!Red Sheep??", line++, player.getAttribute("sheep_herder:red_dead", false)); + line(player, "A !!Blue Sheep??", line++, player.getAttribute("sheep_herder:blue_dead", false)); + line(player, "A !!Green Sheep??", line++, player.getAttribute("sheep_herder:green_dead", false)); + line(player, "A !!Yellow Sheep??", line++, player.getAttribute("sheep_herder:yellow_dead", false)); + } + break; + case 100: + line(player,"I helped Councillor Halgrive by putting down",line++,true); + line(player,"plague-bearing sheep.",line++,true); + line(player,"!!QUEST COMPLETE",line++); + break; + } + } + } + + @Override + public void finish(Player player) { + int ln = 10; + super.finish(player); + player.getPacketDispatch().sendItemZoomOnInterface(995, 230, 277, 5); + drawReward(player,"4 Quest Points",ln++); + drawReward(player,"3100 coins",ln++); + player.removeAttribute("sheep_herder:red_dead"); + player.removeAttribute("sheep_herder:blue_dead"); + player.removeAttribute("sheep_herder:green_dead"); + player.removeAttribute("sheep_herder:yellow_dead"); + player.removeAttribute("sheep_herder:all_dead"); + player.getInventory().add(new Item(995,3100)); + } + + @Override + public Quest newInstance(Object object) { + new HerderSheepNPC(RED_SHEEP, Location.create(2609, 3343, 0)).init(); + new HerderSheepNPC(RED_SHEEP,Location.create(2610, 3344, 0)).init(); + new HerderSheepNPC(RED_SHEEP,Location.create(2609, 3345, 0)).init(); + new HerderSheepNPC(RED_SHEEP,Location.create(2615, 3343, 0)).init(); + new HerderSheepNPC(GREEN_SHEEP,Location.create(2622, 3366, 0)).init(); + new HerderSheepNPC(GREEN_SHEEP,Location.create(2622, 3366, 0)).init(); + new HerderSheepNPC(GREEN_SHEEP,Location.create(2619, 3371, 0)).init(); + new HerderSheepNPC(GREEN_SHEEP,Location.create(2617, 3365, 0)).init(); + new HerderSheepNPC(YELLOW_SHEEP,Location.create(2610, 3390, 0)).init(); + new HerderSheepNPC(YELLOW_SHEEP,Location.create(2613, 3389, 0)).init(); + new HerderSheepNPC(YELLOW_SHEEP,Location.create(2606, 3391, 0)).init(); + new HerderSheepNPC(YELLOW_SHEEP,Location.create(2608, 3387, 0)).init(); + new HerderSheepNPC(BLUE_SHEEP,Location.create(2559, 3388, 0)).init(); + new HerderSheepNPC(BLUE_SHEEP,Location.create(2562, 3388, 0)).init(); + new HerderSheepNPC(BLUE_SHEEP,Location.create(2563, 3383, 0)).init(); + new HerderSheepNPC(BLUE_SHEEP,Location.create(2570, 3381, 0)).init(); + NPC Brumty = new NPC(FARMER_BRUMTY,Location.create(2594,3357,0)); + Brumty.setWalks(false); + Brumty.setRespawn(true); + Brumty.init(); + Brumty.setDirection(Direction.NORTH); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/SheepPoisonHandler.java b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/SheepPoisonHandler.java new file mode 100644 index 000000000..ab52094c6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/sheepherder/SheepPoisonHandler.java @@ -0,0 +1,87 @@ +package core.game.content.quest.members.sheepherder; + +import core.game.interaction.DestinationFlag; +import core.game.interaction.MovementPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; + +@Initializable +public class SheepPoisonHandler extends PluginInteraction { + @Override + public Plugin newInstance(Object arg) throws Throwable { + setIds(new int[]{SheepHerder.POISON.getId()}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.USEWITH); + return null; + } + + @Override + public boolean handle(Player player, NodeUsageEvent event) { + Node n = event.getUsedWith(); + Item i = event.getUsedItem(); + if(n instanceof HerderSheepNPC){ + if (withinBorders(n.getLocation(),Location.create(2595, 3364, 0),Location.create(2609, 3351, 0))){ + handlePoisoning(player,(HerderSheepNPC) n); + return true; + } + } + return false; + } + + public void handlePoisoning(Player p, HerderSheepNPC n){ + p.lock(1); + Pulse deathPulse = new Pulse() { + int counter = 0; + @Override + public boolean pulse() { + switch(counter){ + case 0: + p.getDialogueInterpreter().sendDialogue("You feed some poisoned sheep food to the sheep.","It happily eats it."); + counter++; + break; + case 1: + n.getAnimator().animate(new Animation(5336)); + counter++; + break; + case 2: + p.getDialogueInterpreter().sendDialogue("You watch as the sheep collapses dead onto the floor."); + counter++; + break; + case 3: + n.getProperties().setTeleportLocation(n.spawnLocation); + GroundItemManager.create(SheepHerder.boneMap.get(n.getId()),n.getLocation(),p); + return true; + } + return false; + } + }; + p.getPulseManager().run(new MovementPulse(p, DestinationFlag.ENTITY.getDestination(p,n)) { + @Override + public boolean pulse() { + p.faceLocation(n.getLocation()); + GameWorld.getPulser().submit(deathPulse); + return true; + } + }); + } + + + private boolean withinBorders(Location toCheck, Location sW, Location nE){ + return (toCheck.getX() >= sW.getX() && toCheck.getX() <= nE.getX()) && (toCheck.getY() <= sW.getY() && toCheck.getY() >= nE.getY()); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.kt new file mode 100644 index 000000000..7069386c2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/AskeladdenDialogue.kt @@ -0,0 +1,57 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.player.Player +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +//@InitializablePlugin +//Disabled because the quest isn't done yet. +class AskeladdenDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun open(vararg args: Any?): Boolean { + player?.let { + if (it.questRepository.getStage("Fremennik Trials") > 0) { + player("Hello there.").also { stage = 0; return true } + } + if(it.getAttribute("fremtrials:lalli-talkedto",false)!!){ + player("Hello there. I understand you managed to get some", "golden wool from Lalli?") + stage = 0 + return true + } + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AskeladdenDialogue(player) + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 0 -> npc(FacialExpression.CHILD_LOUDLY_LAUGHING, "HAHAHA! Yeah, that Lalli... what a maroon!").also { stage++ } + 1 -> player("So how did you manage to get the wool?").also { stage++ } + 2 -> npc(FacialExpression.CHILD_FRIENDLY, "Well, as you know, I am doing the same trials that you", "are as part of my test of manhood, and that troll is the", "only one who can get that wool.").also { stage++ } + 3 -> npc(FacialExpression.CHILD_NORMAL, "You might have noticed he's kind of... messed in the", "head buddy! He's real paranoid about people stealing his", "golden apples, isn't he?").also { stage++ } + 4 -> player(FacialExpression.HALF_ASKING,"Indeed he is. So how did you manage to get some", "golden wool from him?").also { stage++ } + 5 -> npc(FacialExpression.CHILD_NORMAL, "It was easy buddy! I persuaded him he needed a pet to", "help him guard his apples. A pet that would never sleep!", "A pet that would never need food or exercise!").also { stage++ } + 6 -> npc(FacialExpression.CHILD_NORMAL, "A pet that would never need him to clean up its... well,", "you know, buddy. A pet that would always be loyal to", "him! A faithful companion for life!").also { stage++ } + 7 -> player(FacialExpression.HALF_ASKING, "What pet is this then?").also { stage++ } + 8 -> npc(FacialExpression.CHILD_LOUDLY_LAUGHING, "A pet ROCK!").also { stage++ } + 9 -> npc(FacialExpression.CHILD_NORMAL, "Man, can you believe that stupid troll traded me some", "of his golden wool for a worthless ROCK?").also { stage++ } + 10 -> npc(FacialExpression.CHILD_FRIENDLY, "Buddy, I hafta say: if brains were explosives, that troll", "wouldn't have enough to blow his nose!").also { stage++ } + 11 -> player(FacialExpression.HALF_ASKING, "Do you have any spare rocks then?").also { stage++ } + 12 -> npc(FacialExpression.CHILD_NEUTRAL, "Sure thing buddy, although I have to say, I doubt even", "that troll is stupid enough to fall for the SAME trick", "TWICE in a row! You can try anyways though!").also { + player.setAttribute("/save:fremtrials:askeladden-talkedto",true); + stage++} + //Give player ROCK + + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(2439) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorker.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorker.kt new file mode 100644 index 000000000..21d63c4db --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BeerOnCouncilWorker.kt @@ -0,0 +1,32 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.interaction.NodeUsageEvent +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class BeerOnCouncilWorker : PluginInteraction(1917){ + + override fun handle(player: Player?, event: NodeUsageEvent?): Boolean { + val with = event?.usedWith + if(with?.id?.equals(1287)!! && with is NPC){ + player?.dialogueInterpreter?.open(1287,true,true) + return true + } + return false + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.USEWITH) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BranchFletcher.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BranchFletcher.kt new file mode 100644 index 000000000..837ef9e04 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/BranchFletcher.kt @@ -0,0 +1,52 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.interaction.NodeUsageEvent +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class BranchFletcher : PluginInteraction(3692){ + + class BranchFletchingPulse(val player: Player?) : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player?.animator?.animate(Animation(1248)).also { player!!.lock() } + 3 -> player?.inventory?.remove(Item(3692)).also { player?.inventory?.add(Item(3688)); player!!.unlock(); return true} + } + return false + } + } + + override fun handle(player: Player?, event: NodeUsageEvent?): Boolean { + val with = event?.usedWith + if(with is Item && with.id == 946) { + player?.let { + if (it.inventory.containsItem(Item(946))) { + GameWorld.submit(BranchFletchingPulse(it)) + } else { + it.sendMessage("You need a knife to do this.") + } + } + return true + } + return false + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.USEWITH) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.kt new file mode 100644 index 000000000..e8790e512 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ChieftanBrundtDialogue.kt @@ -0,0 +1,78 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin + +@Initializable +class ChieftanBrundt(player: Player? = Player(PlayerDetails("",""))) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + if(player?.questRepository?.getStage("Fremennik Trials")!! == 0) { + npc("Greetings outlander!") + stage = 0 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + //Pre-Quest + 0 -> { options("What is this place?", "Why will no-one talk to me?", "Do you have any quests?", "Nice hat!");stage++} + 1 -> when(buttonId){ + 1 -> TODO("Not yet implemented") + 2 -> TODO("Not yet implemented") + 3 -> {player("Do you have any quests?");stage = 300} + 4 -> TODO("Not yet implemented") + } + + //Do you have any quests? + 300 -> {npc("Quests, you say outlander? Well, I would not call it a","quest as such, but if you are brave of heart and strong","of body, perhaps..."); stage++} + 301 -> {npc("No, you would not be interested. Forget I said","anything, outerlander.");stage++} + 302 -> {options("Yes, I am interested.","No, I'm not interested.");stage++} + 303 -> when(buttonId){ + 1 -> {player("Actually, I would be very interested to hear what you","have to offer.");stage = 310} + 2 -> {player("No, I'm not interested.");stage = 340} + } + + //Yes, I am interested in what you have to say. + 310 -> {npc("You would? These are unusual sentiments to hear from","an outerlander! My suggestion was going to be that if","you crave adventure and battle,"); stage++} + 311 -> {npc("and your heart sings for glory, then perhaps you would","be interested in joining our clan, and becoming a","Fremennik yourself?");stage++} + 312 -> {player("What would that involve exactly?");stage++} + 313 -> {npc("Well, there are two ways to become a member of our","clan and call yourself a Fremennik: be born a","Fremennik, or be voted in by our council of elders.");stage++} + 314 -> {player("Well, I think I've missed the first way, but how can I","get the council of elders to vote to let me join your","clan?");stage++} + 315 -> {npc("Well, that I cannot answer myself. You will need to","speak to each of them and see what they require of you","as proof of your dedication.");stage++} + 316 -> {npc("There are twelve council members around this village;","you will need to gain a majority vote of at least seven","councillors in your favor.");stage++} + 317 -> {npc("So, what say you? Give me the word and I will tell all","of my tribe of your intentions, be they yes or nay.");stage++} + 318 -> {options("I want to become a Fremennik!","I don't want to become a Fremennik.");stage++} + 319 -> when(buttonId){ + 1 -> {player("I think I would enjoy the challenge of becoming an","honorary Fremennik. Where and how do I start?");stage = 320} + 2 -> {player("That sounds too complicated to me.");stage = 322} + } + + //I think I would enjoy the challenge of becoming an honorary fremennik + 320 -> {npc("As I say outerlander, you must find and speak to the","twelve members of the council of elders, and see what","tasks they might set you.");stage++} + 321 -> {npc("If you can gain the support of seven of the twelve, then","you will be accepted as one of us without question.");stage = 1000;player?.questRepository?.getQuest("Fremennik Trials")?.start(player)} + + //That sounds too complicated for me. + 322 -> {npc("Well, that's what I expect from an outerlander.");stage = 1000} + + //No, I'm not interested + 340 -> TODO("Not implemented yet") + + + 1000 -> end() + } + return true + } + + + override fun newInstance(player: Player?): DialoguePlugin { + return ChieftanBrundt(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1294) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue.kt new file mode 100644 index 000000000..306ab170c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/CouncilWorkerDialogue.kt @@ -0,0 +1,56 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.game.node.item.Item +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin + +@Initializable +class CouncilWorkerDialogue(player: Player? = Player(PlayerDetails("",""))) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + if(args.size > 1){ + npc("Ta very much like. That'll hit the spot nicely.. Here,","You can have this. I picked it up as a souvenir on me","last holz") + player?.inventory?.add(Item(3713)); player?.inventory?.remove(Item(1917)); stage = 10 + stage = 100; + } else { + npc("'Ello there.") + stage = 0; + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> if(player?.questRepository?.getStage("Fremennik Trials")!! > 0){ + player("I know this is an odd question, but are you","a member of the elder council?") + stage++ + } else { + end() + } + 1 -> {npc("'fraid not, ${if(player?.appearance?.isMale!!) "sir" else "miss"}"); stage++} + 2 -> {npc("Say, would you do me a favor? I'm quite parched.","If you bring me a beer, I'll make it worthwhile.");stage++} + 3 -> if(player?.inventory?.containsItem(Item(1917))!!){ + player("Oh, I have one here! Take it.") + stage++ + } else { + end() + } + 4 -> {npc("Oh, thank you much ${if(player?.appearance?.isMale!!) "sir" else "miss"}");stage++} + 5 -> {npc("Ta very much like. That'll hit the spot nicely.. Here,","You can have this. I picked it up as a souvenir on me","last holz");player?.inventory?.add(Item(3713)); player?.inventory?.remove(Item(1917)); stage = 100} + + 100 -> end() + + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return CouncilWorkerDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1287) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/Draugen.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/Draugen.kt new file mode 100644 index 000000000..7e5e50f33 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/Draugen.kt @@ -0,0 +1,29 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item + +class Draugen(val player: Player?) : NPC(1279,player?.location?.transform(1,0,0)){ + + override fun init() { + super.init() + isRespawn = false + } + + override fun handleTickActions() { + super.handleTickActions() + if(!properties.combatPulse.isAttacking){ + properties.combatPulse.attack(player) + } + } + + override fun finalizeDeath(killer: Entity?) { + super.finalizeDeath(killer) + player?.setAttribute("/save:fremtrials:draugen-killed",true) + player?.removeAttribute("fremtrials:draugen-loc") + player?.inventory?.remove(Item(3696)) + player?.inventory?.add(Item(3697)) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FishOnAltar.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FishOnAltar.kt new file mode 100644 index 000000000..22d676bfb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FishOnAltar.kt @@ -0,0 +1,78 @@ +package core.plugin.quest.fremtrials + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.interaction.NodeUsageEvent +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.dialogue.FacialExpression +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class FishOnAltar : PluginInteraction(383, 389, 395){ + var fishUsed = 0 + + override fun handle(player: Player?, event: NodeUsageEvent?): Boolean { + fishUsed = event?.used!!.id + val with = event.usedWith + if(with is GameObject && with.id == 4141){ + if(player?.questRepository?.getStage("Fremennik Trials")!! >= 10){ + GameWorld.submit(moveToPulse(player,with,fishUsed)) + return true + } + } + return false + } + + class moveToPulse(val player: Player?, dest: Node, val fish: Int) : MovementPulse(player,dest, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + if(player?.inventory?.containsItem(Item(3689))!!){ + GameWorld.submit(spiritPulse(player, fish)) + } else { + player.dialogueInterpreter.sendDialogue("I should probably have my lyre with me.") + } + return true + } + } + + class spiritPulse(val player: Player?, val fish: Int) : Pulse(){ + var counter = 0 + val npc = NPC(1273,player?.location) + override fun pulse(): Boolean { + when(counter++){ + 0 -> npc.init().also { player?.lock() }.also { player?.inventory?.remove(Item(fish)) } + 1 -> npc.moveStep() + 2 -> npc.face(player).also { player?.face(npc) } + 3 -> player?.dialogueInterpreter?.sendDialogues(npc,FacialExpression.HAPPY,"I will kindly accept this offering, and","bestow upon you a gift in return.") + 4 -> player?.inventory?.remove(Item(3689)) + 5 -> when(fish){ + 383 -> player?.inventory?.add(Item(6125)) + 389 -> player?.inventory?.add(Item(6126)) + 395 -> player?.inventory?.add(Item(6127)) + } + 6 -> player?.unlock() + 10 -> npc.clear().also { return true } + } + return false + } + } + + override fun fireEvent(identifier: String, vararg args: Any): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.USEWITH) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FremennikTrials.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FremennikTrials.kt new file mode 100644 index 000000000..29cb7b2a2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/FremennikTrials.kt @@ -0,0 +1,52 @@ +/* +package core.game.content.quest.fremtrials + +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.quest.Quest +import core.plugin.InitializablePlugin +import core.game.node.entity.skill.Skills + +@InitializablePlugin +class FremennikTrials : Quest("Fremennik Trials",64,63,3,347,0,1,10){ + + class SkillRequirement(val skill: Int?, val level: Int?) + + val requirements = arrayListOf() + + override fun drawJournal(player: Player?, stage: Int) { + super.drawJournal(player, stage) + var line = 11 + val started = player?.questRepository?.getStage("Fremennik Trials")!! > 0 + + if(!started){ + line(player,"Requirements to complete quest:",line++) + line += 1 + line(player,"Level 40 Woodcutting",line++, player.skills.getStaticLevel(Skills.WOODCUTTING) >= 40) + line(player,"Level 40 Crafting",line++,player.skills.getStaticLevel(Skills.CRAFTING) >= 40) + line(player,"Level 25 Fletching",line++,player.skills.getStaticLevel(Skills.FLETCHING) >= 25) + line(player,"I must also be able to defeat a !!level 69 enemy?? and must",line++) + line(player,"not be afraid of !!combat without any weapons or armour.",line++) + line += 1 + line(player,"I can start this quest by speaking to !!Chieftan Brundt?? on",line++) + line(player,"the !!Fremennik Longhall,?? which is in the town of !!Rellekka?? to",line++) + line(player,"the north of !!Sinclair Mansion??.",line) + } else { + line(player,"In order to join the Fremenniks, I need to",line++) + line(player,"!!earn the approval?? of !!7 members?? of the elder council.",line++) + line(player,"I've written down the members who I can try to help:",line++) + line(player,"Manni the Reveller",line++,player.getAttribute("fremtrials:manni-vote",false)) + line(player,"Swensen the Navigator",line++,player.getAttribute("fremtrials:swensen-vote",false)) + line(player,"Sigli the Huntsman",line++,player.getAttribute("fremtrials:sigli-vote",false)) + line(player,"Olaf the Bard",line++,player.getAttribute("fremtrials:olaf-vote",false)) + line(player,"So far I have gotten ${player.getAttribute("fremtrials:votes",0)} votes.",line++) + } + } + + override fun newInstance(`object`: Any?): Quest { + requirements.add(SkillRequirement(Skills.FLETCHING,25)) + requirements.add(SkillRequirement(Skills.CRAFTING,40)) + requirements.add(SkillRequirement(Skills.WOODCUTTING,40)) + return this + } + +}*/ diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/KegOnKegAction.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/KegOnKegAction.kt new file mode 100644 index 000000000..00faeb5f9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/KegOnKegAction.kt @@ -0,0 +1,50 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.interaction.NodeUsageEvent +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.map.RegionManager +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class KegOnKegAction : PluginInteraction(3712){ + + override fun handle(player: Player?, event: NodeUsageEvent?): Boolean { + val used = event?.used + val with = event?.usedWith + if(with?.id?.equals(3711)!! && player?.isInLongHouse()!!){ + if(!player.getAttribute("fremtrials:keg-mixed",false)!!){ + if(player.getAttribute("fremtrials:cherrybomb",false)) { + player.inventory?.remove(used as? Item) + player.setAttribute("/save:fremtrials:keg-mixed", true) + player.sendMessage("The cherry bomb in the pipe goes off.") + RegionManager.getLocalEntitys(player).stream().forEach { e -> e.sendChat("What was THAT??") } + player.sendMessage("You mix the kegs together.") + return true + } else { + player.dialogueInterpreter?.sendDialogue("I can't do this right now. I should create","a distraction.") + return true + } + } + return false + } + return false + } + + fun Player.isInLongHouse(): Boolean{ + return this.location.x >= 2655 && this.location.y >= 3665 && this.location.x <= 2662 && this.location.y <= 3681 + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.USEWITH) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LalliDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LalliDialogue.kt new file mode 100644 index 000000000..92644eb78 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LalliDialogue.kt @@ -0,0 +1,73 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +@Initializable +class LalliDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + player?.let { + if (it.questRepository.getStage("Fremennik Trials") > 0) { + player("Hello there.").also { stage = 0; return true } + } + if (it.getAttribute("fremtrials:askeladden-talkedto", false)!!) { + player("Hello there.") + stage = 50 + return true + } + } + return true + } + + + + override fun newInstance(player: Player?): DialoguePlugin { + return LalliDialogue(player) + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.OLD_SNEAKY,"Bah! Puny humans always try steal Lalli's golden","apples! You go away now!").also { stage++ } + 1 -> player(FacialExpression.ANNOYED,"Actually, I'm not after your golden apples. I was","wondering if I could have some golden wool, I need it","to string a lyre.").also { stage++ } + 2 -> npc(FacialExpression.OLD_SNEAKY,"Ha! You not fool me human! Me am smart! Other","trolls so jealous of how brainy I are, they kick me out","of camp and make me live down here in cave! But me","have last funny!").also { stage++ } + 3 -> npc(FacialExpression.OLD_SNEAKY,"Me find golden apples on tree and me build wall to stop","anyone who not Lalli eating lovely golden apples! Did","me not tell you I are smart?").also { stage++ } + 4 -> player("Yes, yes, you are incredibly clever. Now please can I","have some golden wool?").also { stage++ } + 5 -> npc(FacialExpression.OLD_SNEAKY,"Hmm, me think you not really think I are clever. Me","think you is trying to trick Lalli. Me not like you as much","as other human. He give me present. I give him wool.").also { stage++ } + 6 -> options("Other human?","No, honest, you're REALLY clever.","Can I give you a present?").also { stage++ } + 7 -> when(buttonId){ + 1 -> player("Other human? You mean someone else has been here","and you gave them wool?").also { stage = 10 } + 2 -> player("No, honest, you're REALLY clever!").also { stage = 20 } + 3 -> player("Can I give you a present.").also { stage = 30 } + } + + //Other human? + 10 -> npc(FacialExpression.OLD_SNEAKY,"Human call itself Askeladden! It not trick Lalli. Lalli do","good deal with human! Stupid human get some dumb","wool, but did not get golden apples!").also { stage++ } + 11 -> player("I see... okay, well, bye!").also { player.setAttribute("/save:fremtrials:lalli-talkedto",true); stage++ } + + //Honest, you're clever + 20 -> npc(FacialExpression.OLD_SNEAKY,"Me no believe you tell truth. Go away.").also { stage = 1000 } + + //Can I give you a present + 30 -> npc(FacialExpression.OLD_SNEAKY,"Me think about that.").also { stage = 1000 } + + 50 -> npc(FacialExpression.OLD_SNEAKY,"Bah! Puny humans always try steal Lalli's golden","apples! You go away now!").also { stage++ } + 51 -> player("Wait! I have something that might interest you... a pet", "rock!").also { stage++ } + 52 -> npc(FacialExpression.OLD_LAUGH2, "Hah! You think me stupid or something human? Me", "already got one! Me don't want lots of baby rocks either,", "so me don't want another one around the place!").also { stage++ } + 53 -> player(FacialExpression.HALF_CRYING,"Please... all I want is some of your golden wool...").also { stage++ } + 54 -> npc(FacialExpression.OLD_SNEAKY, "Stupid human think he can trick me into giving away", "some golden apples! Hah! Golden apples is all me got to", "eat. you not get them. no way!").also { stage++ } + 55 -> player(FacialExpression.HALF_THINKING, "Hmm... So you're hungry? I think I will have the", "perfect thing for you to eat... I just need to get myself", "an onion, a potato, and a cabbage...").also { stage++ } + 56 -> interpreter.sendDialogue("You have a cunning plan to trick this troll. You need your pet rock,", "a cabbage, a potato and an onion.").also { player.removeAttribute("fremtrials:fremtrials:lalli-talkedto");stage = 1000 } + + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(1270) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LyreOptionHandler.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LyreOptionHandler.kt new file mode 100644 index 000000000..acadb6996 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/LyreOptionHandler.kt @@ -0,0 +1,65 @@ +package core.plugin.quest.fremtrials + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.impl.Animator +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class LyreOptionHandler : OptionHandler(){ + val ids = arrayListOf(14591,14590,6127,6126,6125,3691,3690) + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + if(player?.questRepository?.getStage("Fremennik Trials")!! < 20){ + player.sendMessage("You lack the knowledge to play this.") + return true + } + if(ids.isLast(ids.indexOf(node?.id))){ + player.sendMessage("Your lyre is out of charges!") + } else { + player.inventory?.remove(node as Item) + player.inventory?.add(Item(ids.getNext(node?.id))) + player.lock() + GameWorld.submit(telePulse(player)) + } + return true + } + + class telePulse(val player: Player) : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.animator.animate(Animation(9600,Animator.Priority.VERY_HIGH), Graphics(1682)) + 6 -> player.properties.teleportLocation = Location.create(2661, 3646, 0) + 7 -> player.unlock().also { return true } + } + return false + } + } + + override fun newInstance(arg: Any?): Plugin { + for(id in ids){ + ItemDefinition.forId(id).handlers.put("option:play",this) + } + return this + } + + private fun ArrayList.getNext(any: Any?): T{ //gets the next member from a list + val indexOfCurrent = this.indexOf(any) + return get(indexOfCurrent + 1) + } + + private fun ArrayList.isLast(current: Int): Boolean{ + return current + 1 > size - 1 + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ManniDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ManniDialogue.kt new file mode 100644 index 000000000..9c5a17597 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/ManniDialogue.kt @@ -0,0 +1,120 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.impl.Animator +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +@Initializable +class ManniDialogue(player: Player? = Player(PlayerDetails("",""))) : DialoguePlugin(player){ + var curNPC: NPC? = NPC(0,Location(0,0,0)) + override fun open(vararg args: Any?): Boolean { + curNPC = args[0] as? NPC + if(player?.questRepository?.getStage("Fremennik Trials")!! > 0){ + if(player?.getAttribute("fremtrials:manni-accepted",false) == true) { + if (player?.inventory?.containsItem(Item(3712)) == true || player?.inventory?.containsItem(Item(3711)) == true) { + npc("Ah, I see you have your keg of beer. Are ye ready to", "drink against each other?") + stage = 101 + return true + } else { + npc("Come back when you're ready to begin", "the contest.") + stage = 1000; + return true + } + } else if(player?.getAttribute("fremtrials:manni-vote",false) == true){ + npc("e have my vote!") + stage = 1000 + return true + } + player("Hello there!") + stage = 0 + return true + } else { + TODO("Uncertain what should go here") + } + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> {npc("Hello outerlander. I overheard your conversation with","Brundt just now. You wish to become a member of the","Fremennik?");stage++} + 1 -> {player("That's right! Why, are you on the counsel?");stage++} + 2 -> {npc("Do not let my drink-ssussed appearance fool you, I","earnt my place on the council many years past.I am","always glad to see new blood enter our tribe, and will","happily vote for you.");stage++} + 3 -> {player("Great!");stage++} + 4 -> {npc("Providing you can pass a little test for me. As a","Fremennik, you will need to show cunning, stamina,","fastitude, and an iron constitution. I know of only one","way to test all of these.");stage++} + 5 -> {player("And what's that?");stage++} + 6 -> {npc("Why, a drinking contest!");stage++} + 7 -> {npc("The task is simple enough! You versus me, a stiff drink","each, last man standing wins the trial. So what say you?");stage++} + 8 -> {options("Yes","No");stage++} + 9 -> when(buttonId){ + 1 -> {player("A drinking contest? Easy. Set them up, and I'll knock","them back.");stage++} + 2 -> {player("I don't like the sound of that.");stage = 12} + } + + //Yes + 10 -> {npc("When you are ready to begin, go and pick up a keg","from that table over there, and come back here.");stage++} + 11 -> {npc("We start when you have your keg of beer with you","and finish when one of us can drink no more and","yields.");stage = 1000;player?.setAttribute("/save:fremtrials:manni-accepted",true)} + + //No + 12 -> {npc("That's a shame."); stage = 1000} + + + //Begin drinking competition + 101 -> {options("Yes","No");stage++} + 102 -> when(buttonId){ + 1 -> {player("Yes, let's start this drinking contest!");stage++} + 2 -> {player("No, I don't think I am.");stage = 1000} + } + 103 -> {npc("As you wish outerlander; I will drink first, then you will","drink.");stage++} + 104 -> {GameWorld.submit(DrinkingPulse(player,curNPC,player?.getAttribute("fremtrials:keg-mixed",false))); end()} + + 1000 -> end() + } + return true + } + + class DrinkingPulse(val player: Player?,val npc: NPC?, val lowAlcohol: Boolean? = false) : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + if(!lowAlcohol!!){ + when(counter++){ + 0 -> {player?.lock();npc?.lock(); npc?.isNeverWalks = true} + 1 -> {player?.face(npc); npc?.face(player)} + 3 -> npc?.animator?.animate(Animation(1330,Animator.Priority.HIGH)) + 5 -> {player?.animator?.animate(Animation(1330,Animator.Priority.HIGH)); player?.inventory?.remove(Item(3711))} + 7 -> player?.dialogueInterpreter?.sendDialogues(player,FacialExpression.DRUNK,"Ish no fair!! I canna drink another drop! I alsho","feel veddy, veddy ill...") + 15 -> player?.dialogueInterpreter?.sendDialogues(npc,FacialExpression.DRUNK,"I guessh I win then ouddaladder! (hic) Niche try,","anyway!") + 16 -> {player?.unlock(); npc?.unlock(); player?.face(player);npc?.face(npc); npc?.isNeverWalks = false; return true} + } + } else { + when(counter++){ + 0 -> {player?.lock();npc?.lock(); npc?.isNeverWalks = true} + 1 -> {player?.face(npc); npc?.face(player)} + 3 -> npc?.animator?.animate(Animation(1330,Animator.Priority.HIGH)) + 5 -> {player?.animator?.animate(Animation(1330,Animator.Priority.HIGH)); player?.inventory?.remove(Item(3711))} + 7 -> player?.dialogueInterpreter?.sendDialogues(player,FacialExpression.HAPPY,"Aaaah, lovely stuff. So you want to get the next round","in, or shall I? You don't look so good there!") + 15 -> player?.dialogueInterpreter?.sendDialogues(npc,FacialExpression.DRUNK,"Wassha? Guh? You drank that whole keg! But it dinnna","affect you at all! I conshede! You can probably","outdrink me!") + 21 -> player?.dialogueInterpreter?.sendDialogues(npc,FacialExpression.DRUNK,"I jusht can't (hic) believe it! Thatsh shome might fine","drinking legs you got! Anyone who can drink like","THAT getsh my vote atta somsh.... coumah... gets my","vote!") + 22 -> {player?.unlock(); npc?.unlock(); player?.face(player);npc?.face(npc); npc?.isNeverWalks = false;player?.removeAttribute("fremtrials:cherrybomb");player?.removeAttribute("fremtrials:manni-accepted");player?.removeAttribute("fremtrials:keg-mixed"); player?.setAttribute("/save:fremtrials:manni-vote",true); player?.setAttribute("/save:fremtrials:votes",player.getAttribute("fremtrials:votes",0) + 1); return true} + } + } + return false + } + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ManniDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1286) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/OlafTheBard.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/OlafTheBard.kt new file mode 100644 index 000000000..55b94adf6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/OlafTheBard.kt @@ -0,0 +1,71 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin + +@Initializable +class OlafTheBard(player: Player? = Player(PlayerDetails("",""))) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + if(player?.getAttribute("fremtrials:olaf-accepted",false)!!){ + npc("I can't wait to see your performance.") + stage = 1000 + return true + } + npc("Hello? Yes? You want something outerlander?") + stage = 0; + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player("Are you a member of the council?").also { stage++ } + 1 -> npc("Why, indeed I am, outerlander! My talents as an","exemplary musician made it difficult for them not to","accept me! Why do you wish to know this?").also { stage++ } + 2 -> player("Well, I ask because I am currently doing the","Fremennik trials so as to join you clan. I need seven","of the twelve council of elders to vote for me.").also { stage++ } + 3 -> npc("Ahhh... and you wish to earn my vote? I will gladly","accept you as a Fremennik should you be able to prove","yourself to have a little musical ability!").also { stage++ } + 4 -> player("So how would I do that?").also { stage++ } + 5 -> npc("Why, by playing in our longhall! All you need to do is","impress the revellers there with a few verses of an epic","of your own creation!").also { stage++ } + 6 -> npc("So what say you outerlander? Are you up for the","challenge?").also { stage++ } + 7 -> options("Yes","No").also { stage++ } + 8 -> when(buttonId){ + 1 -> player("Sure! This certainly sounds pretty easy to accomplish.","I'll have your vote in no time!").also { stage++ } + 2 -> player("No, that sounds like too much work.").also { stage = 1000 } + } + + //Yes + 9 -> npc("That is great news outerlander! We always need more","music lovers here!").also { stage++;player?.setAttribute("/save:fremtrials:olaf-accepted",true) } + 10 -> player("So how would I go about writing this epic?").also { stage++ } + 11 -> npc("Well, first of all you are going to need an instrument.","Like all true bards you are going to have to make this","yourself.").also { stage++ } + 12 -> player("How do I make an instrument?").also { stage++ } + 13 -> npc("Well, it is a long and drawn-out process. Just east of","this village there is an unusually musical tree that can","be used to make very high quality instruments.").also { stage++ } + 14 -> npc("Cut a piece from it, and then carve it into a special","shape that will allow you to string it. Using a knife as","you would craft any other wooden object would be best","for this.").also { stage++ } + 15 -> player("Then what do I need to do?").also { stage++ } + 16 -> npc("Next you will need to string your lyre. There is a troll","to the South-east who has some golden wool. I would","not recommend using anything else to string your lyre","with.").also { stage++ } + 17 -> player("Anything else?").also { stage++ } + 18 -> npc("Well, when you have crafted your lyre you will need","the blessing of the Fossegrimen to tune your lyre to","perfection before you even consider a public","performance.").also { stage++ } + 19 -> player("Who or what is Fossegrimen?").also { stage++ } + 20 -> npc("Fossegrimen is a lake spirit that lives just a little way","South-west of this village. Make her an offering of fish,","and you will then be ready for your performance.").also { stage++ } + 21 -> npc("Make sure you give her a suitable offering however. If","the offering is found to be unworthy, then you may","find yourself unable to play your lyre with any skill at","all!").also { stage++ } + 22 -> player("So what would be a worthy offering?").also { stage++ } + 23 -> npc("A raw shark, manta ray, or sea turtle should be","sufficient as an offering.").also { stage++ } + 24 -> player("Ok, what else do I need to do?").also { stage++ } + 25 -> npc("When you have crafted your lyre and been blessed by","Fossegrimen, then you will finally be ready to make","your performance to the revellers at the longhall.").also { stage++ } + 26 -> npc("Head past the bouncers and onto the stage, and then","begin to play. If all goes well, you should find the music","spring to your mind and sing your own epic on the","spot").also { stage++ } + 27 -> npc("I will observe both you and the audience, and if you","show enough talent, I will happily vote in your favour at","the council of elders.").also { stage++ } + 28 -> npc("Is that clear enough, outerlander? Would you like me","to repeat anything?").also { stage++ } + 29 -> player("No thanks. I think I've got it.").also { stage = 1000 } + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return OlafTheBard(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1269) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PipeInserter.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PipeInserter.kt new file mode 100644 index 000000000..8476d32d5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PipeInserter.kt @@ -0,0 +1,47 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.GameWorld +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class PipeInserter : PluginInteraction(4162){ + + override fun handle(player: Player?, node: Node?): Boolean { + class toPipePulse : MovementPulse(player,DestinationFlag.OBJECT.getDestination(player,node)) { + override fun pulse(): Boolean { + if(player?.inventory?.containsItem(Item(3714))!!){ + player.sendMessage("You stuff the lit object into the pipe.") + player.setAttribute("/save:fremtrials:cherrybomb",true) + player.inventory?.remove(Item(3714)) + } else { + player.sendMessage("What am I supposed to put in there? A shoe?") + } + return true + } + } + + if(node is GameObject){ + GameWorld.submit(toPipePulse()) + return true + } + return false + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.OBJECT) + return this + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PoisonSalesman.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PoisonSalesman.kt new file mode 100644 index 000000000..d74ef750b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/PoisonSalesman.kt @@ -0,0 +1,90 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.game.node.item.Item +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin + +@Initializable +class PoisonSalesman(player: Player? = Player(PlayerDetails("",""))) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + options("Talk about the Murder Mystery Quest","Talk about the Fremennik Trials") + stage = 0 + return true + } + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + val fremStage = player?.questRepository?.getStage("Fremennik Trials") ?: 0 + when(stage){ + 0 -> when(buttonId){ + 1 -> {player("Err... nevermind");stage = 1000} + 2 -> {player("Hello.");stage = 10} + } + + //Fremennik Trials + 10 -> if(fremStage == 0){ npc("Come see me if you ever need low-alcohol beer!"); stage = 1000} + else if(fremStage > 30){npc("Thanks for buying out all that low-alcohol beer!"); stage = 1000} + else if(fremStage > 0){npc("Howdy! You seem like someone with discerning taste!","Howsabout you try my brand new range of alcohol?");stage++;} + 11 -> {player("Didn't you used to sell poison?");stage++} + 12 -> {npc("That I did indeed! Peter Potter's Patented","Multipurpose poison! A miracle of modern apothecarys!","My exclusive concoction has been test on...");stage++} + 13 -> {player("Uh, yeah. I've already heard the sales pitch.");stage++} + 14 -> {npc("Sorry stranger, old habits die hard I guess.");stage++} + 15 -> {player("So you don't sell poison anymore?");stage++} + 16 -> {npc("Well I would, but I ran out of stock. Business wasn't","helped with that stuff that happened up at the Sinclair","Mansion much either, I'll be honest.");stage++} + 17 -> {npc("So, being the man of enterprise that I am I decided to","branch out a little bit!");stage++} + 18 -> {player("Into alcohol?");stage++} + 19 -> {npc("Absolutely! The basic premise between alcohol and poison","is pretty much the same, after all! The difference is that","my alcohol has a unique property others do not!");stage++} + 20 -> {player("And what is that?");stage++} + 21 -> {sendDialogue("The salesman takes a deep breath.");stage++} + 22 -> {npc("Ever been too drunk to find your own home? Ever","wished that you could party away all night long, and","still wake up fresh as a daisy the next morning?");stage++} + 23 -> {npc("Thanks to the miracles of modern magic we have come","up with just the solution you need! Peter Potter's","Patented Party Potions!");stage++} + 24 -> {npc("It looks just like beer! It tastes just like beer! It smells","just like beer! But... it's not beer!");stage++} + 25 -> {npc("Our mages have mused for many moments to bring","you this miracle of modern magic! It has all the great","tastes you'd expect, but contains absolutely no alcohol!");stage++} + 26 -> {npc("That's right! You can drink Peter Potter's Patented","Party Potion as much as you want, and suffer","absolutely no ill effects whatsoever!");stage++} + 27 -> {npc("The clean fresh taste you know you can trust, from","the people who brought you: Peter Potters Patented","multipurpose poison, Pete Potters peculiar paint packs");stage++} + 28 -> {npc("and Peter Potters paralyzing panic pins. Available now","from all good stockists! Ask your local bartender now,","and experience the taste revolution of the century!");stage++} + 29 -> {sendDialogue("He seems to have finished for the time being.");stage++} + 30 -> {player("So.. when you say 'all good stockists'...");stage++} + 31 -> {npc("Yes?");stage++} + 32 -> {player("How many inns actually sell this stuff?");stage++} + 33 -> {npc("Well.. nobody has actually bought any yet. Everyone I","try and sell it to always asks me what exactly the point","of beer that has absolutely no effect on you is.");stage++} + 34 -> {player("So what is the point?");stage++} + 35 -> {npc("Well... Um... Er... Hmmm. You, er, don't get drunk.");stage++} + 36 -> {player("I see...");stage++} + 37 -> {npc("Aw man.. you don't want any now do you? I've really","tried to push this product, but I just don't think the","world is ready for beer that doesn't get you drunk.");stage++} + 38 -> {npc("I'm a man ahead of my time I tell you! It's not that","my products are bad, it's that they're too good for the","market!");stage++} + 39 -> {player("Actually, I would like some. How much do you want for it?");stage++} + 40 -> {npc("Y-you would??? Um, okay! I knew I still had the old","salesmans skills going on!");stage++} + 41 -> {npc("I will sell you a keg of it for only 250 gold pieces! So","What do you say?");stage++} + 42 -> {options("Yes","No");stage++} + 43 -> when(buttonId){ + 1 -> {player("Yes please!");stage++} + 2 -> {player("No, thanks.");stage = 1000} + } + //Yes + 44 -> if(player?.inventory?.containsItem(Item(995,250)) == true){ + player?.inventory?.remove(Item(995,250)) + player?.inventory?.add(Item(3712)) + npc("Here you go.") + stage = 1000 + } else { + player("I don't seem to have enough.") + stage++ + } + 45 -> {npc("Well come back when you do!");stage = 1000} + + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return PoisonSalesman(player) + } + + override fun getIds(): IntArray { + return intArrayOf(820) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt new file mode 100644 index 000000000..b930226dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SigliTheHuntsman.kt @@ -0,0 +1,88 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.game.node.item.Item +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin + +@Initializable +class SigliTheHuntsman(player: Player? = Player(PlayerDetails("",""))) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + if(player?.getAttribute("fremtrials:sigli-vote",false)!!){ + npc("You have my vote!") + stage = 1000 + return true + } + if(player?.getAttribute("fremtrials:draugen-killed",false)!!){ + npc("I saw the entire hunt. Let me take that talisman from","you, I would be honored to speak out for you to our","council of elders after such a hunt, outerlander.") + stage = 100 + return true + } + npc("What do you want outerlander?") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player("Are you a member of the council?").also{stage++} + 1 -> npc("The Fremennik council of elders? I am pleased to say","that I am. My value as a huntsman is recognized by","my position there.").also { stage++ } + 2 -> player("I was wondering if I could persuade you to vouch for","me as a member of your clan?").also { stage++ } + 3 -> npc("You? ... well... I am not totally against the idea","outerlander. If you can demonstrate some hunting skills","then perhaps I may offer my vote.").also { stage++ } + 4 -> player("How can I prove my hunting skills to you? I can go","kill, like, a hundred chickens for you right now!").also { stage++ } + 5 -> npc("Chickens? You think that would impress me?").also { stage++ } + 6 -> player("Cows then? I can kill cows until, er, the cows come","home.").also { stage++ } + 7 -> npc("No. The prey I have in mind for you to prove your","worth to me is something far more dangerous. Far","more difficult. Far more deadly.").also { stage++ } + 8 -> player("Not... Giant Rats?!?!").also { stage++ } + 9 -> npc("I suspect you are mocking me outerlander. You will","need to prove your skill as a hunter to me by tracking","and defeating... The Draugen.").also { stage++ } + 10 -> options("What's a Draugen?","Forget it.").also { stage++ } + 11 -> when(buttonId){ + 1 -> player("What's a Draugen? Some kind of cheap rip-","off of a dragon?").also { stage++ } + 2 -> player("Forget it.").also { stage = 1000 } + } + + //What's a Draugen + 12 -> npc("Hmmm.. No, the words are slightly similar I suppose,","but they are very different creatures.").also { stage++ } + 13 -> npc("The Draugen is an evil ghost from Fremennik","mythology, that devours souls of those brave","warriors who meet their ends at sea.").also { stage++ } + 14 -> npc("It stalks the coastlines, invisible to all. It brings us bad","fortunes, and curses our journeys across the seas. It is","also unkillable by normal means.").also { stage++ } + 15 -> player("...Let me get this straight; You want me to hunt an","unkillable, invincible, and invisible enemy? How am I","supposed to do that?").also { stage++ } + 16 -> npc("Well outerlander, should you accept my challenge I will","show you a special hunter's trick that will help you. Do","you accept the challenge?").also { stage++ } + 17 -> options("Yes","No").also { stage++ } + 18 -> when(buttonId){ + 1 -> player("Well, I need every vote I can get in the council of","elders, but this certainly sounds impossible to do...").also { stage++ } + 2 -> player("No, I don't think I will.").also { stage = 1000 } + } + + //Yes + 19 -> npc("Not at all outerlander. The Draugen is indeed","impossible to kill but that is not the same as being","impossible to fight against.").also { stage++ } + 20 -> npc("Every time he takes a Fremennik life, he gains in","power, so to keep it from becoming too powerful we","hunters hunt it and steal its life force.").also { stage++ } + 21 -> npc("We do this with a special talisman. Here, take it, it will","let you track the Draugen while it's invisible, and when","you defeat it will absorb its essence.").also { stage++; player?.inventory?.add(Item(3696)) } + 22 -> npc("I want you to track the Draugen, defeat it, and store","its essence in that talisman for me. If you can do this","important task for my clan, I will vote for you.").also { stage++ } + 23 -> npc("Take care of the talisman, and see me when you have","completed this task.").also{stage = 1000; player?.setAttribute("/save:fremtrials:sigli-accepted",true)} + + //Draugen killed + 100 -> player("Thanks!").also { + player.removeAttribute("fremtrials:draugen-killed"); + player.setAttribute("fremtrials:sigli-vote",true) + player?.setAttribute("/save:fremtrials:votes",player.getAttribute("fremtrials:votes",0) + 1) + player?.inventory?.remove(Item(3697)) + stage = 1000 + } + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return SigliTheHuntsman(player) + } + + + + override fun getIds(): IntArray { + return intArrayOf(1281) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler.kt new file mode 100644 index 000000000..58c4058c6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwayingTreeHandler.kt @@ -0,0 +1,61 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager +import core.game.node.entity.skill.gather.SkillingTool + +@Initializable +class SwayingTreeHandler : PluginInteraction(4142) { + + class ChoppingPulse(val player: Player) : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.animator.animate(SkillingTool.getHatchet(player).animation) + 4 -> player.animator.reset().also { player.inventory.add(Item(3692));return true} + } + return false + } + } + + override fun handle(player: Player?, node: Node?): Boolean { + class toTreePulse(player: Player) : MovementPulse(player,DestinationFlag.OBJECT.getDestination(player,node)){ + override fun pulse(): Boolean { + SkillingTool.getHatchet(player)?.let { GameWorld.submit(ChoppingPulse(player!!)).also { return true } } + + player?.sendMessage("You need an axe which you have the woodcutting level to use to do this.") + return true + } + } + + if(node is GameObject){ + if(!player?.inventory?.containsItem(Item(3692))!!){ + GameWorld.submit(toTreePulse(player)) + return true + } else { + player.sendMessage("You already have a branch.") + } + } + return false + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.OBJECT) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenLadder.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenLadder.kt new file mode 100644 index 000000000..444fcdb79 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenLadder.kt @@ -0,0 +1,34 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.dialogue.FacialExpression +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class SwensenLadder : PluginInteraction(4158){ + + override fun handle(player: Player?, node: Node?): Boolean { + if(node is GameObject){ + if(player?.getAttribute("fremtrials:swensen-accepted",false) == false){ + player.dialogueInterpreter?.sendDialogues(1283,FacialExpression.ANGRY,"Where do you think you're going?") + return true + } + } + return false + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.OBJECT) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenPortals.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenPortals.kt new file mode 100644 index 000000000..1de0de41c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenPortals.kt @@ -0,0 +1,72 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.world.GameWorld +import core.game.world.map.Location +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class SwensenPortals : PluginInteraction(2273,2274,2506,2507,2508,2505,2503,2504,5138){ + + class destRoom(val swx: Int, val swy: Int, val nex: Int, val ney: Int) + + fun destRoom.getCenter(): Location{ + return Location((swx + nex) / 2, (swy + ney) / 2).transform(1,0,0) + } + + override fun handle(player: Player?, node: Node?): Boolean { + val portal: GameObject? = node as GameObject + var toLocation: Location? = Location(0,0,0) + if(portal != null){ + class toPortal(val to: GameObject?) : MovementPulse(player,DestinationFlag.OBJECT.getDestination(player,portal)){ + override fun pulse(): Boolean { + when(to?.id){ + 2273 -> toLocation = destRoom(2639,10012,2645,10018).getCenter() + 2274 -> toLocation = destRoom(2650,10034,2656,10040).getCenter() + 2506 -> toLocation = destRoom(2662,10023,2669,10029).getCenter() + 2507 -> toLocation = destRoom(2626,10023,2633,10029).getCenter() + 2505 -> toLocation = destRoom(2650,10001,2656,10007).getCenter() + 2503 -> toLocation = destRoom(2662,10012,2668,10018).getCenter() + 2504 -> {toLocation = destRoom(2662,10034,2668,10039).getCenter(); player?.setAttribute("/save:fremtrials:maze-complete",true)} + 5138 -> toLocation = getRandomLocation(player) + } + player?.properties?.teleportLocation = toLocation + return true; + } + } + GameWorld.submit(toPortal(portal)) + return true + } + return false + } + + fun getRandomLocation(player: Player?): Location{ + var obj: GameObject? = null + + while(obj?.id != 5138) { + val objects = player?.viewport?.chunks?.random()?.random()?.objects + obj = objects?.random()?.random() + if(obj == null || obj.location?.equals(Location(0,0,0))!!){ + continue + } + } + return obj.location + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.OBJECT) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.kt new file mode 100644 index 000000000..beae808cc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/SwensenTheNavigator.kt @@ -0,0 +1,72 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin + +@Initializable +class SwensenTheNavigator(player: Player? = Player(PlayerDetails("",""))) : DialoguePlugin(player){ + override fun open(vararg args: Any?): Boolean { + if(player?.getAttribute("fremtrials:maze-complete",false) == true){ + npc("Outerlander! You have finished my maze!","I am genuinely impressed!") + stage = 100 + return true + } else if(player?.getAttribute("fremtrials:swensen-vote",false) == true){ + npc("You have my vote!") + stage = 1000 + return true + } + player("Hello!") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> {player("I am trying to become a member of the Fremennik","clan! The Chieftan told me that I may be able to gain","your vote at the council of elders?");stage++} + 1 -> {npc("You wish to stop being an outerlander? I can","understand that! I have no reason why I would prevent","you becoming a Fremennik...");stage++} + 2 -> {npc("...but you must first pass a little test for me to prove","you are worthy.");stage++} + 3 -> {player("What kind of test?");stage++} + 4 -> {npc("Well, I serve our clan as a navigator. The seas can be","a fearful place when you know not where you are","heading.");stage++} + 5 -> {npc("Should something happen to me, all members of our","tribe have some basic sense of direction so that they","may always return safely home.");stage++} + 6 -> {npc("If you are able to demonstrate to me that you too have","a good sense of direction then I will recommend you to","the rest of the council of elders immediately.");stage++} + 7 -> {player("Well, how would I go about showing that?");stage++} + 8 -> {npc("Ah, a simple task! Below this building I have constructed","a maze; should you be able to walk from one side to the","other that will be proof to me.");stage++} + 9 -> {npc("You wish to try my challenge?");stage++} + 10 -> {options("Yes","No");stage++} + 11 -> when(buttonId){ + 1 -> {player("A maze? Is that all? Sure, it sounds simple enough.");stage++} + 2 -> {player("No, that sounds too hard.");stage = 1000} + } + + //Yes + 12 -> {npc("I will warn you outerlander, this maze was designed by","myself, and is of the most fiendish complexity!");stage++} + 13 -> {player("Oh really? Watch and learn...");stage = 1000;player?.setAttribute("/save:fremtrials:swensen-accepted",true)} + + //After maze + 100 -> {player("So does that mean I can rely on your vote at the","council of elders to allow me into your village?");stage++} + 101 -> {npc("Of course outerlander! I am nothing if not a man of","my word!");stage++} + 102 -> { + player("Thanks!"); + player?.removeAttribute("fremtrials:maze-complete") + player?.removeAttribute("fremtrials:swensen-accepted") + player?.setAttribute("/save:fremtrials:swensen-vote",true) + player?.setAttribute("/save:fremtrials:votes",player.getAttribute("fremtrials:votes",0) + 1) + stage = 1000 + } + + 1000 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return SwensenTheNavigator(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1283) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TalismanHandler.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TalismanHandler.kt new file mode 100644 index 000000000..0345f83b5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TalismanHandler.kt @@ -0,0 +1,120 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.Entity +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.plugin.Initializable +import core.plugin.Plugin +import kotlin.math.abs +import kotlin.math.atan2 + +@Initializable +class TalismanHandler : OptionHandler() { + + val possibleLocations = listOf(Location(2625,3608), + Location(2602,3628), + Location(2668,3714), + Location(2711,3602), + Location(2664,3592)) + + + fun Location.getDirection(entity: Entity): String{ + val loc: Location = this + val difX: Double = (loc.x - entity.location.x).toDouble() + val difY: Double = (loc.y - entity.location.y).toDouble() + val angle = Math.toDegrees(atan2(difX,difY)) + val NORTH = 0.toDouble() + val SOUTH = 180.toDouble() + val EAST = (-90).toDouble() + val WEST = 90.toDouble() + val NORTHEAST = (-135).toDouble() + val NORTHWEST = 135.toDouble() + val SOUTHEAST = (-45).toDouble() + val SOUTHWEST = 45.toDouble() + if(diff(angle,NORTH) < 3){ + return "north" + } + if(diff(angle,SOUTH) < 3){ + return "south" + } + if(diff(angle,EAST) < 3){ + return "west" + } + if(diff(angle,WEST) < 3){ + return "east" + } + if(diff(angle,SOUTHEAST) < 45){ + return "north-west" + } + if(diff(angle,SOUTHWEST) < 45){ + return "north-east" + } + if(diff(angle,NORTHEAST) < 45){ + return "south-west" + } + if(diff(angle,NORTHWEST) < 45){ + return "south-east" + } + return "Dunno. ${angle}" + } + + fun diff(x: Double,y: Double): Double{ + return abs(x - y) + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + + class DraugenPulse(player: Player?) : Pulse(){ + var count = 0 + override fun pulse(): Boolean { + when(count++){ + 3 -> Draugen(player).init().also { return true } + } + return false + } + } + + var item: Item? = Item(0) + if(node is Item){ + item = node + } else { + return false + } + if(item.id == 3696){ + var locationString = player?.getAttribute("fremtrials:draugen-loc","none") + if(locationString == "none"){ + val newLoc = possibleLocations.random() + player?.setAttribute("/save:fremtrials:draugen-loc","${newLoc.x},${newLoc.y}") + locationString = "${newLoc.x},${newLoc.y}" + } + val locationComponents = locationString?.split(",") + val draugenLoc = Location(Integer.parseInt(locationComponents?.get(0)),Integer.parseInt(locationComponents?.get(1))) + + if(player?.location?.withinDistance(draugenLoc,5)!!){ + player.dialogueInterpreter.sendDialogue("The Draugen is nearby, be careful!") + GameWorld.submit(DraugenPulse(player)) + } else { + val neededDirection = draugenLoc.getDirection(player as Entity) + player.sendMessage("The talisman pulls you to the $neededDirection") + } + return true + } + return false + } + + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(3696).handlers["option:locate"] = this + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TinderboxOnBomb.kt b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TinderboxOnBomb.kt new file mode 100644 index 000000000..1bcfbda53 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thefremenniktrials/TinderboxOnBomb.kt @@ -0,0 +1,34 @@ +package core.game.content.quest.members.thefremenniktrials + +import core.game.interaction.NodeUsageEvent +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.quest.PluginInteraction +import core.game.content.quest.PluginInteractionManager + +@Initializable +class TinderboxOnBomb : PluginInteraction(3713){ + + override fun handle(player: Player?, event: NodeUsageEvent?): Boolean { + val with = event?.usedWith + if(with is Item && with.id.equals(590)){ + player?.inventory?.remove(event.used as Item) + player?.inventory?.add(Item(3714)) + player?.sendMessage("You light the strange object.") + return true + } + return false + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun newInstance(arg: Any?): Plugin { + PluginInteractionManager.register(this,PluginInteractionManager.InteractionType.USEWITH) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPC.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPC.kt new file mode 100644 index 000000000..e87b792b2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveGoblinMinerNPC.kt @@ -0,0 +1,50 @@ +package core.game.content.quest.members.thelosttribe + +import core.game.node.entity.Entity +import core.game.node.entity.npc.AbstractNPC +import core.game.world.map.Location +import core.plugin.Initializable + +@Initializable +/** + * Handles the cave goblin miner npc + * @author Ceikry + */ +class CaveGoblinMinerNPC(id: Int = 0, location: Location? = null) : AbstractNPC(id,location) { + var mining = false + var originallyMiner = false + init { + originallyMiner = id > 2073 + } + + override fun construct(id: Int, location: Location?, vararg objects: Any?): AbstractNPC { + return CaveGoblinMinerNPC(id,location) + } + + override fun getIds(): IntArray { + return intArrayOf(2078,2077,2076,2075,2072,2071,2070,2069) + } + + override fun tick() { + mining = (id > 2074) + + if(properties.combatPulse.isAttacking && mining){ + transform(id - 6) + this.isWalks = true + this.walkRadius = 4 + this.isNeverWalks = false + } + super.tick() + } + + override fun finalizeDeath(killer: Entity?) { + if(!mining && originallyMiner){ + transform(id + 6) + this.isWalks = false + this.walkRadius = 0 + this.isNeverWalks = true + } + super.finalizeDeath(killer) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveRockHandler.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveRockHandler.kt new file mode 100644 index 000000000..8ff74503f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveRockHandler.kt @@ -0,0 +1,62 @@ +package core.game.content.quest.members.thelosttribe + +import core.cache.def.impl.ObjectDefinition +import core.game.component.Component +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.system.SystemLogger +import core.game.world.map.Direction +import core.game.world.map.Location +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +/** + * Handles looking at the rocks in the tunnels leading up to the dorg mines + * @author Ceikry + */ +class CaveRockHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + for(i in 6921..6924){ + ObjectDefinition.forId(i).handlers["option:look-at"] = this + } + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + when(node?.id){ + 6921 -> showRock(player,6923) + 6922 -> showRock(player,6924) + 6923 -> showRock(player,6922) + 6924 -> showRock(player,6927) + } + return true + } + + + fun showRock(player: Player, model: Int){ + player.interfaceManager.open(Component(62)) + player.packetDispatch.sendModelOnInterface(model,62,1,1) + } + + override fun getDestination(n: Node?, node: Node?): Location { + n ?: return super.getDestination(n, node) + node ?: return super.getDestination(n, node) + + var diffX = 0 + var diffY = 0 + + if(node.direction == Direction.SOUTH) + diffX = -1 + if(node.direction == Direction.NORTH) + diffX = 1 + if(node.direction == Direction.WEST) + diffY = 1 + if(node.direction == Direction.EAST) + diffY = -1 + + return node.location.transform(diffX,diffY,0) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveZone.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveZone.kt new file mode 100644 index 000000000..645046035 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/CaveZone.kt @@ -0,0 +1,76 @@ +package core.game.content.quest.members.thelosttribe + +import core.game.node.entity.Entity +import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.zone.MapZone +import core.game.world.map.zone.ZoneBorders +import core.game.world.map.zone.ZoneBuilder +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.RandomFunction + +@Initializable +/** + * Handles the movement traps and such for the caves in front of the dorg mines + * @author Ceikry + */ +class CaveZone : MapZone("TLT Cave Zone", true), Plugin { + val triggers = ArrayList() + + override fun configure() { + register(ZoneBorders(3306, 9661, 3222, 9600)) + triggers.add(Location.create(3241, 9614, 0)) + triggers.add(Location.create(3257, 9616, 0)) + triggers.add(Location.create(3258, 9633, 0)) + triggers.add(Location.create(3244, 9635, 0)) + triggers.add(Location.create(3233, 9626, 0)) + triggers.add(Location.create(3249, 9646, 0)) + triggers.add(Location.create(3260, 9638, 0)) + triggers.add(Location.create(3273, 9641, 0)) + triggers.add(Location.create(3275, 9631, 0)) + triggers.add(Location.create(3287, 9631, 0)) + triggers.add(Location.create(3302, 9618, 0)) + } + + override fun move(e: Entity?, from: Location?, to: Location?): Boolean { + if(triggers.contains(from) && e is Player){ + e.asPlayer().walkingQueue.reset() + e.asPlayer().lock() + trigger(e.asPlayer()) + } + return super.move(e, from, to) + } + + fun trigger(player: Player){ + if(RandomFunction.random(1,6) <= 2) { + player.animator.animate(Animation(1950), Graphics(572,1,3)) + GameWorld.Pulser.submit(object : Pulse(5) { + override fun pulse(): Boolean { + player.unlock() + player.properties.teleportLocation = Location.create(3159, 9546, 0) + player.animator.reset() + return true + } + }) + } else { + player.unlock() + player.animator.animate(Animation.RESET,Graphics(302)) + player.impactHandler.manualHit(player,RandomFunction.random(1,7),ImpactHandler.HitsplatType.NORMAL) + } + } + + override fun newInstance(arg: Unit?): Plugin { + ZoneBuilder.configure(this) + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/DorgCbowEquipPlugin.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/DorgCbowEquipPlugin.kt new file mode 100644 index 000000000..6e11fb665 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/DorgCbowEquipPlugin.kt @@ -0,0 +1,32 @@ +package core.game.content.quest.members.thelosttribe + +import core.cache.def.impl.ItemDefinition +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +@Initializable +/** + * Prevents players from equipping the dorg cbow without completing lost tribe + * @author Ceikry + */ +class DorgCbowEquipPlugin : Plugin{ + override fun newInstance(arg: Item?): Plugin { + ItemDefinition.forId(Items.DORGESHUUN_CBOW_8880).handlers["equipment"] = this + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + val player = args[0] as Player + if(identifier == "unequip") return true + if(!player.questRepository.isComplete("Lost Tribe")){ + player.dialogueInterpreter.sendDialogue("You must complete Lost Tribe to use this.") + return false + } else { + return true + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/GoblinFollower.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/GoblinFollower.kt new file mode 100644 index 000000000..e8bc0c3ea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/GoblinFollower.kt @@ -0,0 +1,38 @@ +package core.game.content.quest.members.thelosttribe + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location + +/** + * Small object for the goblin follow options + * @author Ceikry + */ +object GoblinFollower { + fun sendToMines(player: Player){ + travel(player,Location.create(3319, 9616, 0)) + } + fun sendToLumbridge(player: Player){ + travel(player,Location.create(3232, 9610, 0)) + } + + private fun travel(player: Player,location: Location){ + GameWorld.Pulser.submit(object: Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.lock().also { player.interfaceManager.open(Component(115)) } + 3 -> player.properties.teleportLocation = location + 4 -> { + player.interfaceManager.close(Component(115)) + player.interfaceManager.open(Component(170)) + } + 6 -> player.unlock().also { player.interfaceManager.close(Component(170)); return true } + } + return false + } + }) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace.kt new file mode 100644 index 000000000..c4339ecec --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/HistoryOfTheGoblinRace.kt @@ -0,0 +1,63 @@ +package core.game.content.quest.members.thelosttribe + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.dialogue.FacialExpression + +@Initializable +/** + * Handles the HOTGR interface + * @author Ceikry + */ +class HistoryOfTheGoblinRace : ComponentPlugin() { + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(183,this) + return this + } + + override fun open(player: Player?, component: Component?) { + player ?: return + super.open(player, component) + player.packetDispatch.sendInterfaceConfig(183,17,true) + val qstage = player.questRepository.getQuest("Lost Tribe").getStage(player) + component?.setCloseEvent { player, c -> + if(qstage == 42 || qstage == 41 ) { + player.dialogueInterpreter.sendDialogues(player, FacialExpression.THINKING, "Hey... The symbol of the 'Dorgeshuun' tribe looks just", "like the symbol on the brooch I found.") + player.questRepository.getQuest("Lost Tribe").setStage(player, 43) + } + player.removeAttribute("hgr-index") + true + } + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + when(button){ + 16 -> setIndex(player,getIndex(player) + 1) + 17 -> setIndex(player,getIndex(player) - 1) + } + update(player) + return true + } + + fun update(player: Player){ + val index = getIndex(player) + player.packetDispatch.sendInterfaceConfig(183,32,index != 0) + player.packetDispatch.sendInterfaceConfig(183,14,index != 1) + player.packetDispatch.sendInterfaceConfig(183,15,index != 2) + player.packetDispatch.sendInterfaceConfig(183,16,index == 2) + player.packetDispatch.sendInterfaceConfig(183,17,index == 0) + } + + fun setIndex(player: Player, index: Int){ + player.setAttribute("hgr-index",index) + } + + fun getIndex(player: Player): Int{ + return player.getAttribute("hgr-index",0) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/KazgarDialogue.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/KazgarDialogue.kt new file mode 100644 index 000000000..2daf41786 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/KazgarDialogue.kt @@ -0,0 +1,46 @@ +package core.game.content.quest.members.thelosttribe + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin + +@Initializable +/** + * Dialogue for Kazgar + * @author Ceikry + */ +class KazgarDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun newInstance(player: Player?): DialoguePlugin { + return KazgarDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + npc = (args[0] as NPC).getShownNPC(player) + options("Who are you?","Can you show me to the mine?") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage) { + 0 -> when (buttonId) { + 1 -> player("Who are you?").also { stage = 10 } + 2 -> player("Can you show me the way to the other side?").also { stage = 20 } + } + 10 -> npc("I'm Kazgar, I guide people through the mines.").also { stage = 1000 } + 20 -> npc("Certainly!").also { stage++ } + 21 -> end().also { + GoblinFollower.sendToMines(player) + } + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(2085) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribe.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribe.kt new file mode 100644 index 000000000..3f7cb6437 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribe.kt @@ -0,0 +1,126 @@ +package core.game.content.quest.members.thelosttribe + +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.quest.Quest +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.plugin.Initializable +import core.tools.Items +import core.game.node.entity.skill.Skills + +@Initializable +/** + * Represents the lost tribe quest and quest journal + * @author Ceikry + */ +class LostTribe : Quest("Lost Tribe",84,83,1) { + override fun newInstance(`object`: Any?): Quest { + return this + } + + override fun drawJournal(player: Player?, stage: Int) { + super.drawJournal(player, stage) + player ?: return + var line = 11 + if(stage == 0){ + line(player,"I can start this quest by speaking to !!Sigmund?? in !!Lumbridge??",line++) + line(player,"!!Castle.??",line++) + line(player,"I must have completed:",line++) + line(player,"Rune Mysteries",line++,player?.questRepository?.isComplete("Rune Mysteries") == true) + line(player,"Goblin Diplomacy",line++,player?.questRepository?.isComplete("Goblin Diplomacy") == true) + line(player,"and have:",line++) + line(player,"Level 17 mining",line++,player.skills.getLevel(Skills.MINING) >= 17) + line(player,"Level 13 agility",line++,player.skills.getLevel(Skills.AGILITY) >= 13) + line(player,"Level 13 thieving",line++,player.skills.getLevel(Skills.THIEVING) >= 13) + } else { + if(stage >= 10) { + line(player, "!!Sigmund?? said I should ask around town and see", line++, stage >= 20) + line(player, "if anyone had seen what happened in the !!cellar??.", line++, stage >= 20) + } + if(stage >= 20){ + line(player, "I found out that someone had seen a !!goblin-like?? creature in the cellar.",line++,stage >= 30) + line(player,"I should go speak to !!The Duke?? about this.",line++,stage >= 30) + } + if(stage >= 30){ + line(player,"The Duke gave me permission to investigate !!the tunnel??.",line++,stage >= 40) + line(player,"I should get down into the !!cellar?? and try to unblock the !!tunnel??.",line++,stage >= 40) + } + if(stage >= 40){ + line(player,"The Duke asked me to speak with the !!librarian?? in !!Varrock??",line++,stage >= 43) + line(player,"and see if he can identify the brooch.",line++,stage >= 43) + } + if(stage >= 43){ + line(player,"I should go speak with some !!goblins?? who might be able",line++,stage >= 44) + line(player,"to teach me more about the !!Dorgeshuun??. Perhaps the",line++,stage >= 44) + line(player,"!!generals in Goblin Village?? can help.",line++,stage >= 44) + } + if(stage >= 44){ + line(player,"I should return to !!Duke Horacio?? with my findings.",line++,stage >= 45) + } + if(stage >= 45){ + line(player,"I should try to make contact with the !!Dorgeshuun??.",line++,stage >= 46) + } + if(stage >= 46){ + line(player,"I need to return to !!Duke Horacio?? and ask him to stop",line++,stage >= 47) + line(player,"the war!",line++,stage >= 47) + } + if(stage >= 47){ + line(player,"Duke Horacio said the goblins stole some !!silverware??.",line++,stage >= 49) + line(player,"I need to find it if I want to stop the war.",line++,stage >= 49) + } + if(stage >= 48){ + line(player,"I found !!H.A.M. robes?? in !!Sigmund??'s chest. Perhaps",line++,stage >= 49) + line(player,"I should check the !!H.A.M. hideout?? behind the castle",line++,stage >= 49) + line(player,"for the missing !!silverware??.",line++,stage >= 49) + } + if(stage >= 49){ + line(player,"I found the !!silverware?? in the !!H.A.M. hideout??.",line++,stage >= 50) + line(player,"I should go inform !!Duke Horacio?? immediately!",line++,stage >= 50) + } + if(stage >= 50){ + line(player,"!!The Duke?? gave me a !!peace treaty?? to take to",line++,stage >= 51) + line(player,"the cave goblins. I should do so at once!",line++,stage >= 51) + } + if(stage >= 100){ + line(player,"!!QUEST COMPLETE!??",line++) + } + } + + } + + override fun finish(player: Player?) { + super.finish(player) + player ?: return + var ln = 10 + player.packetDispatch.sendItemZoomOnInterface(Items.BROOCH_5008,230,277,5) + drawReward(player,"1 Quest Point",ln++) + drawReward(player,"3000 Mining XP",ln++) + drawReward(player,"A Ring of Life",ln++) + drawReward(player,"Freedom of the",ln++) + drawReward(player,"Dorgeshuun mines.",ln++) + player.skills.addExperience(Skills.MINING,3000.0) + if(!player.inventory.add(Item(Items.RING_OF_LIFE_2570))){ + GroundItemManager.create(Item(Items.RING_OF_LIFE_2570),player) + } + player.varpManager.get(465).setVarbit(0,11).send(player) + } + + override fun getConfig(player: Player?, stage: Int): IntArray { + player ?: return intArrayOf(465,0) + if(stage in 50..99){ + return intArrayOf(465,9) + } + if(stage in 46..49){ + return intArrayOf(465,8) + } + if(stage in 44..45){ + return intArrayOf(465,7) + } + if(stage in 30..43 && player.getAttribute("tlt-hole-cleared",false)){ + return intArrayOf(465,4) + } + if(stage >= 100) return intArrayOf(465,11) + if(stage > 0) return intArrayOf(465,1) + return intArrayOf(465,0) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeCutscene.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeCutscene.kt new file mode 100644 index 000000000..e17373548 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeCutscene.kt @@ -0,0 +1,240 @@ +package core.game.content.quest.members.thelosttribe + +import core.game.camerautils.PlayerCamera +import core.game.content.global.action.DoorActionHandler +import core.game.interaction.MovementPulse +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.emote.Emotes +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.GameWorld.Pulser +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.map.build.DynamicRegion +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.game.content.activity.ActivityPlugin +import core.game.content.activity.CutscenePlugin +import core.game.content.dialogue.FacialExpression + +private const val DUKE = 2088 +private const val MISTAG = 2089 +private const val SIGMUND = 2090 +private const val URTAG = 5858 +private const val BOW_ANIM = 6000 +@Initializable +/** + * Final cutscene for the lost tribe + * @author Ceikry + */ +class LostTribeCutscene(val pl: Player? = null) : CutscenePlugin("Lost Tribe Cutscene",true) { + var camera: PlayerCamera = PlayerCamera(null) + + init { + this.player = pl + } + + override fun configure() { + region = DynamicRegion.create(12850) + setRegionBase() + registerRegion(region.id) + } + + override fun getStartLocation(): Location { + return base.transform(7,17,0) + } + + override fun newInstance(p: Player?): ActivityPlugin { + return LostTribeCutscene(player) + } + + override fun getSpawnLocation(): Location { + return Location.create(3208, 3213, 0) + } + + override fun open() { + player.setAttribute("cutscene:original-loc",player.location) + player.setAttribute("real-end",Location.create(3207, 3221, 0)) + player.interfaceManager.hideTabs(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14) + if(player.settings.isRunToggled){ + player.settings.toggleRun() + } + + camera = PlayerCamera(player) + var loc = coords(8,26) + camera.panTo(loc.x,loc.y,300,100) + loc = coords(5,18) + camera.rotateTo(loc.x,loc.y,300,100) + + player.faceLocation(coords(7,18)) + + val mistag = npcs.get(1) + val urtag = npcs.get(2) + val duke = npcs.get(0) + val sigmund = npcs.get(3) + + Pulser.submit(object: Pulse(){ + var counter = 0 + var stage = 0 + override fun pulse(): Boolean { + if(!player.isPlaying || !player.isActive) return true + when(counter++){ + 5 -> DoorActionHandler.handleDoor(player, RegionManager.getObject(coords(7,17))) + 7 -> { + player.pulseManager.run(object: MovementPulse(player,coords(7,22),false){ + override fun pulse(): Boolean { + return true + } + }, "movement") + mistag.pulseManager.run(object : MovementPulse(mistag,coords(7,19)){//coords(7,20)){ + override fun pulse(): Boolean { + return true + } + }, "movement") + urtag.pulseManager.run(object : MovementPulse(urtag,coords(7,18)){ + override fun pulse(): Boolean { + return true + } + }) + } + 12 -> { + mistag.pulseManager.run(object : MovementPulse(mistag,coords(7,20)){//coords(7,20)){ + override fun pulse(): Boolean { + return true + } + }, "movement") + urtag.pulseManager.run(object : MovementPulse(urtag,coords(6,21)){ + override fun pulse(): Boolean { + return true + } + }) + } + 15 -> { + player.faceLocation(duke.location) + player.dialogueInterpreter.sendDialogues(player,FacialExpression.FRIENDLY,"Your grace, I present Ur-tag, headman of the","Dorgeshuun.") + Emotes.BOW.play(player) + player.dialogueInterpreter.addAction { player, buttonId -> + Pulser.submit(object: MovementPulse(player,coords(7,24)){ + override fun pulse(): Boolean { + return true + } + }) + Pulser.submit(object : Pulse(5){ + var counter = 0 + override fun pulse(): Boolean { + duke.animator.animate(Emotes.BOW.animation) + urtag.animator.animate(Animation(BOW_ANIM)) + player.dialogueInterpreter.sendDialogues(duke,FacialExpression.FRIENDLY,"Welcome, Ur-tag. I am sorry that your race came","under suspicion.") + player.dialogueInterpreter.addAction { player, buttonId -> + player.dialogueInterpreter.sendDialogues(duke,FacialExpression.ANGRY,"I assure you that the warmongering element has been","dealt with.") + loc = coords(9,22) + camera.panTo(loc.x,loc.y,300,2) + loc = coords(6,22) + camera.rotateTo(loc.x,loc.y,300,2) + player.dialogueInterpreter.addAction { player, buttonId -> + player.dialogueInterpreter.sendDialogues(urtag,FacialExpression.OLD_NORMAL,"I apologize for the damage to your cellar. I will send","workers to repair the hole.") + player.dialogueInterpreter.addAction { player, buttonId -> + player.dialogueInterpreter.sendDialogues(duke,FacialExpression.FRIENDLY,"No, let it stay. It can be a route of commerce between","our lands.") + player.dialogueInterpreter.addAction { player, buttonId -> + duke.faceLocation(player.location) + player.faceLocation(duke.location) + camera.rotateTo(duke.location.x,duke.location.y,350,4) + loc = coords(11,22) + camera.panTo(loc.x,loc.y,325,3) + loc = coords(6,22) + camera.rotateTo(loc.x,loc.y,300,3) + player.dialogueInterpreter.sendDialogues(duke,FacialExpression.FRIENDLY,"${player.name}, Lumbridge is in your debt. Please accept","this ring as a token of my thanks.") + player.dialogueInterpreter.addAction { player, buttonId -> + player.dialogueInterpreter.sendDialogues(duke,FacialExpression.FRIENDLY,"It is enchanted to save you in your hour of need.") + player.dialogueInterpreter.addAction { player, buttonId -> + urtag.pulseManager.run(object: MovementPulse(urtag,coords(7,23)){ + override fun pulse(): Boolean { + return true + } + }) + urtag.faceLocation(player.location) + player.dialogueInterpreter.sendDialogues(urtag,FacialExpression.OLD_NORMAL,"I too thank you. Accept the freedom of the Dorgeshuun","mines.") + player.dialogueInterpreter.addAction { player, buttonId -> + player.dialogueInterpreter.sendDialogues(urtag,FacialExpression.OLD_NORMAL,"These are strange times. I never dreamed that I would","see the surface, still less that I would be on friendly","terms with its people.") + loc = coords(16,21) + camera.panTo(loc.x,loc.y,300,3) + loc = coords(6,22) + camera.rotateTo(loc.x,loc.y,300,2) + player.dialogueInterpreter.addAction { player, buttonId -> + Pulser.submit(object : Pulse(5) { + override fun pulse(): Boolean { + player.dialogueInterpreter.sendDialogues(sigmund,FacialExpression.ANGRY,"Prattle on, goblin.") + player.dialogueInterpreter.addAction { player, buttonId -> + player.dialogueInterpreter.sendDialogues(sigmund,FacialExpression.EVIL_LAUGH,"Soon you will be destroyed!") + sigmund.animator.animate(Emotes.LAUGH.animation) + player.dialogueInterpreter.addAction { player, buttonId -> + loc = coords(16,17) + sigmund.pulseManager.run(object: MovementPulse(sigmund,loc){ + override fun pulse(): Boolean { + return true + } + }) + Pulser.submit(object : Pulse(4){ + override fun pulse(): Boolean { + Pulser.submit(endPulse) + Pulser.submit(object : Pulse(7){ + override fun pulse(): Boolean { + player.questRepository.getQuest("Lost Tribe").setStage(player,100) + player.questRepository.getQuest("Lost Tribe").finish(player) + return true + } + }) + return true + } + }) + } + } + return true + } + }) + } + } + } + } + } + } + } + } + return true + } + }) + } + loc = coords(7,25) + camera.panTo(loc.x,loc.y,300,3) + return true + } + } + return false + } + }) + } + + override fun start(player: Player?, login: Boolean, vararg args: Any?): Boolean { + val duke = NPC(DUKE,coords(6,23)) + val mistag = NPC(MISTAG,coords(8,17)) + val urtag = NPC(URTAG,coords(8,15)) + val sigmund = NPC(SIGMUND,coords(13,22)) + duke.init() + duke.faceLocation(coords(6,22)) + mistag.init() + urtag.init() + sigmund.init() + sigmund.faceLocation(coords(11,18)) + npcs.add(duke) + npcs.add(mistag) + npcs.add(urtag) + npcs.add(sigmund) + return super.start(player, login, *args) + } + + fun coords(x: Int, y: Int): Location { + return base.transform(x,y,0) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeOptionHandler.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeOptionHandler.kt new file mode 100644 index 000000000..a3633b9da --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/LostTribeOptionHandler.kt @@ -0,0 +1,72 @@ +package core.game.content.quest.members.thelosttribe + +import core.cache.def.impl.ItemDefinition +import core.cache.def.impl.NPCDefinition +import core.cache.def.impl.ObjectDefinition +import core.game.component.Component +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.game.content.dialogue.FacialExpression + +private val BOOK = Item(Items.GOBLIN_SYMBOL_BOOK_5009) +@Initializable +/** + * Handles misc. lost tribe interactions + * @author Ceikry + */ +class LostTribeOptionHandler : OptionHandler(){ + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(5008).handlers["option:look-at"] = this + ItemDefinition.forId(5009).handlers["option:read"] = this + ObjectDefinition.forId(6916).handlers["option:search"] = this + ObjectDefinition.forId(6911).handlers["option:search"] = this + NPCDefinition.forId(2084).handlers["option:follow"] = this + NPCDefinition.forId(2086).handlers["option:follow"] = this + ObjectDefinition.forId(32952).handlers["option:open"] = this + ObjectDefinition.forId(32953).handlers["option:open"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + when(node.id){ + 5008 -> player.interfaceManager.open(Component(50)) + 5009 -> player.interfaceManager.open(Component(183)) + 6916 -> { + if(!player.inventory.containsItem(BOOK) && !player.bank.containsItem(BOOK) && player.questRepository.getQuest("Lost Tribe").getStage(player) >= 41){ + player.dialogueInterpreter.sendDialogue("'A History of the Goblin Race.' This must be it.") + player.inventory.add(BOOK) + } else { + return false + } + } + 6911 -> { + if(!player.inventory.containsItem(Item(Items.SILVERWARE_5011)) && player.questRepository.getQuest("Lost Tribe").getStage(player) == 48){ + player.dialogueInterpreter.sendItemMessage(Items.SILVERWARE_5011,"You find the missing silverware!") + player.inventory.add(Item(Items.SILVERWARE_5011)) + player.questRepository.getQuest("Lost Tribe").setStage(player,49) + } else { + player.sendMessage("You find nothing.") + } + } + 32952,32953 -> { + player.dialogueInterpreter.sendDialogues(player,FacialExpression.THINKING,"I don't think I have permission to go in there.") + } + } + + if(option.equals("follow")){ + when(node.id){ + 2084 -> GoblinFollower.sendToLumbridge(player) + 2085 -> GoblinFollower.sendToMines(player) + } + } + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickaxeOnRubble.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickaxeOnRubble.kt new file mode 100644 index 000000000..0cbf5405a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickaxeOnRubble.kt @@ -0,0 +1,69 @@ +package core.game.content.quest.members.thelosttribe + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.gather.SkillingTool + +@Initializable +/** + * Handles the usage of a pickaxe on the rubble for lost tribe + * @author Ceikry + */ +class PickaxeOnRubble : UseWithHandler(1265,1267,1269,1271,1273,1275){ + override fun newInstance(arg: Any?): Plugin { + addHandler(6898, OBJECT_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + val player = event?.player ?: return false + val stage = player.questRepository.getQuest("Lost Tribe").getStage(player) + if(stage < 30){ + player.dialogueInterpreter.sendItemMessage(event.usedItem.id,"I should probably figure out what happened","before vandalizing the castle more.") + return true + } + + val tool = SkillingTool.getPickaxe(player) + if(tool == null){ + player.dialogueInterpreter.sendDialogue("You don't have a pick which you have the level to use.") + return true + } + + if(player.skills.getLevel(Skills.MINING) < 13){ + player.dialogueInterpreter.sendDialogue("You need 13 mining to break through.") + return true + } + + player.lock() + GameWorld.Pulser.submit(object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> { + player.walkingQueue.reset() + player.walkingQueue.addPath(3219,9618,true) + } + 1 -> { + player.animator.animate(tool.animation) + delay = tool.animation.duration + } + 2 -> { + player.dialogueInterpreter.sendItemMessage(tool.id,"You dig a narrow tunnel through the rocks.") + player.setAttribute("/save:tlt-hole-cleared",true) + player.varpManager.get(465).setVarbit(0,4).send(player) + player.unlock() + return true + } + } + return false + } + }) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickpocketSigmund.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickpocketSigmund.kt new file mode 100644 index 000000000..4bb07765e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/PickpocketSigmund.kt @@ -0,0 +1,54 @@ +package core.game.content.quest.members.thelosttribe + +import core.cache.def.impl.NPCDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.game.content.dialogue.FacialExpression + +@Initializable +/** + * handles pickpocketing sigmund during the lost tribe quest + * @author Ceikry + */ +class PickpocketSigmund : OptionHandler(){ + override fun newInstance(arg: Any?): Plugin { + NPCDefinition.forId(2082).handlers["option:pickpocket"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + + player.lock() + GameWorld.Pulser.submit(object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.animator.animate(Animation(881)) + 3 -> { + if(player.questRepository.getQuest("Lost Tribe").getStage(player) == 47 && !player.inventory.containsItem(Item(Items.KEY_423))){ + player.inventory.add(Item(Items.KEY_423)) + player.dialogueInterpreter.sendItemMessage(Items.KEY_423,"You find a small key on Sigmund.") + } else { + player.dialogueInterpreter.sendDialogues(2082,FacialExpression.ANGRY,"What do you think you're doing?!") + } + player.unlock() + return true + } + } + return false + } + }) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/SigmundChestHandler.kt b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/SigmundChestHandler.kt new file mode 100644 index 000000000..e540e25f1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thelosttribe/SigmundChestHandler.kt @@ -0,0 +1,39 @@ +package core.game.content.quest.members.thelosttribe + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +@Initializable +/** + * Handles sigmund's chest + * @author Ceikry + */ +class SigmundChestHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(6910).handlers["option:open"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + if(player.questRepository.getQuest("Lost Tribe").getStage(player) == 47 && player.inventory.contains(Items.KEY_423,1)){ + player.inventory.remove(Item(Items.KEY_423)) + for(item in arrayOf(Items.HAM_ROBE_4300,Items.HAM_SHIRT_4298,Items.HAM_HOOD_4302).map { Item(it) }){ + if(!player.inventory.add(item)){ + GroundItemManager.create(item,player) + } + } + player.questRepository.getQuest("Lost Tribe").setStage(player,48) + } else { + player.sendMessage("This chest requires a key.") + } + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/AlShabimDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/AlShabimDialogue.java new file mode 100644 index 000000000..febde8bdf --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/AlShabimDialogue.java @@ -0,0 +1,309 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * The dialogue used for the al shabim npc. + * @author 'Vexia + * @version 1.0 + */ +public final class AlShabimDialogue extends DialoguePlugin { + + /** + * The bronze darts item. + */ + private static final Item BRONZE_DARTS = new Item(806, 6); + + /** + * The quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code AlShabimDialogue} {@code Object}. + */ + public AlShabimDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AlShabimDialogue} {@code Object}. + * @param player the player. + */ + public AlShabimDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AlShabimDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (quest.getStage(player)) { + default: + npc("Hello Effendi!"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 54:// build tool. + switch (stage) { + case 0: + if (player.getInventory().containsItem(TouristTrap.PROTOTYPE_DART)) { + npc("Wonderful, I see you have made the new weapon!"); + stage = 20; + } else { + if (!player.hasItem(TouristTrap.BEDABIN_KEY)) { + player("I seemed to have lost the key..."); + stage++; + } else { + npc("Have you figured out the plans yet?"); + stage = 3; + } + } + break; + case 1: + npc("Ahh Effendi, it's a good thing I have a spare!"); + stage++; + break; + case 2: + player.getInventory().add(TouristTrap.BEDABIN_KEY, player); + interpreter.sendItemMessage(TouristTrap.BEDABIN_KEY, "Al Shabim gives you a key."); + stage = 11; + break; + case 3: + player("No, not yet."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendItemMessage(TouristTrap.PROTOTYPE_DART, "You show Al Shabim the prototype dart."); + ; + stage++; + break; + case 21: + npc("This is truly fantastic Effendi!"); + stage++; + break; + case 22: + if (player.getInventory().containsItem(TouristTrap.TECHNICAL_PLANS)) { + npc("We will take the technical plans for the weapon as well."); + stage++; + } else { + player.getInventory().remove(TouristTrap.TECHNICAL_PLANS); + npc("We are forever grateful for this gift. My advisor have", "discovered some secrets which we will share with you."); + stage = 25; + } + break; + case 23: + interpreter.sendItemMessage(TouristTrap.TECHNICAL_PLANS, "You hand over the technical plans for the weapon."); + stage++; + break; + case 24: + player.getInventory().remove(TouristTrap.TECHNICAL_PLANS); + npc("We are forever grateful for this gift. My advisor have", "discovered some secrets which we will share with you."); + stage++; + break; + case 25: + interpreter.sendDialogue("Al Shabim's advisors show you some advanced techniques for making", "the new weapon."); + stage++; + break; + case 26: + npc("Please accept this selection of six bronze throwing darts", "as a token of our appreciation."); + stage++; + break; + case 27: + player.getInventory().add(BRONZE_DARTS, player); + interpreter.sendItemMessage(806, "You receive six bronze throwing darts from Al Shabim."); + stage = player.getInventory().containsItem(TouristTrap.BEDABIN_KEY) ? 28 : 29; + break; + case 28: + player.getInventory().remove(TouristTrap.BEDABIN_KEY); + npc("I'll take that key off your hands as well effendi! Many", "thanks."); + stage++; + break; + case 29: + quest.setStage(player, 60); + player.getInventory().remove(TouristTrap.PROTOTYPE_DART); + player.getInventory().add(TouristTrap.TENTI_PINEAPPLE); + interpreter.sendItemMessage(806, "*** Dart Construction ***", "Congratulations! You can now construct darts."); + stage++; + break; + } + break; + case 50: + switch (stage) { + case 0: + npc("I am Al Shabim, greetings on behalf of the Bedabin", "nomads. Now... what can I do for you?"); + stage++; + break; + case 1: + player("I am looking for a pineapple."); + stage++; + break; + case 2: + npc("Oh yes, well that is interesting. Our sweet pineapples", "are renowned throughout the whole of Kharid! and I'll", "give you one if you do me a favour?"); + stage++; + break; + case 3: + player("Oh yes?"); + stage++; + break; + case 4: + npc("Captain Siad at the mining camp is holding some secret", "information. It is very important to us and we would", "like you to get it for us. It gives details of an", "interesting, yet ancient weapon."); + stage++; + break; + case 5: + npc("We would gladly share this information with you. All", "you have to do is gain access to his private room", "upstairs. We have a key for the chest that contains this", "information. Are you interested in our deal?"); + stage++; + break; + case 6: + player("Yes, I'm interested."); + stage++; + break; + case 7: + npc("That's great Effendi!"); + stage++; + break; + case 8: + npc("Here is a copy of the key that should give you access", "to the chest."); + stage++; + break; + case 9: + quest.setStage(player, 51); + player.getInventory().add(TouristTrap.BEDABIN_KEY, player); + interpreter.sendItemMessage(TouristTrap.BEDABIN_KEY, "Al Shabim gives you a key."); + stage++; + break; + } + break; + case 51: + case 52: + case 53: + switch (stage) { + case 0: + if (player.getInventory().containsItem(TouristTrap.TECHNICAL_PLANS)) { + npc("Aha! I see you have the plans. This is great! However,", "these plans do indeed look very technical. My people", "have further need of your skills."); + stage = 20; + } else { + if (!player.hasItem(TouristTrap.BEDABIN_KEY)) { + player("I seemed to have lost the key..."); + stage++; + } else { + npc("Have you found the plans yet?"); + stage = 3; + } + } + break; + case 1: + npc("Ahh Effendi, it's a good thing I have a spare!"); + stage++; + break; + case 2: + player.getInventory().add(TouristTrap.BEDABIN_KEY, player); + interpreter.sendItemMessage(TouristTrap.BEDABIN_KEY, "Al Shabim gives you a key."); + stage = 11; + break; + case 3: + player("No, sorry. I'm still looking for them."); + stage++; + break; + case 4: + npc("Okay, Effendi!"); + stage = 11; + break; + case 10: + npc("Bring us back the plans inside the chest, they should be", "sealed. All haste to you Effendi!"); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc("If you can help us to manufacture this item, we will", "share its secret with you. Does this deal interest you", "effendi?"); + stage++; + break; + case 21: + player("Yes, I'm very interested."); + stage++; + break; + case 22: + npc("Okay Effendi, you need to follow the plans. You will", "need some special tools for this... There is an anvil in", "the other tent. You have my permission to use it, but", "show the plans to the guard."); + stage++; + break; + case 23: + quest.setStage(player, 54); + end(); + break; + } + break; + case 100: + case 60: + case 70: + case 80: + case 90: + switch (stage) { + case 0: + if (quest.getStage(player) == 60 && !player.hasItem(TouristTrap.TENTI_PINEAPPLE)) { + player.getInventory().add(TouristTrap.TENTI_PINEAPPLE, player); + interpreter.sendItemMessage(TouristTrap.TENTI_PINEAPPLE, "You receive a tasty looking pineapple from Al Shabim."); + stage++; + stage = 32; + break; + } + npc("Many thanks with helping previously Effendi!"); + stage++; + break; + case 30: + npc("Oh, and here is your pineapple!"); + stage++; + break; + case 31: + interpreter.sendItemMessage(TouristTrap.TENTI_PINEAPPLE, "You receive a tasty looking pineapple from Al Shabim."); + stage++; + break; + case 32: + end(); + break; + case 1: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + player("Hi"); + stage++; + break; + case 1: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 832 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/AnaDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/AnaDialogue.java new file mode 100644 index 000000000..510777f15 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/AnaDialogue.java @@ -0,0 +1,336 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * The dialogue plugin used to handle the ana npc. + * @author 'Vexia + * @version 1.0 + */ +public final class AnaDialogue extends DialoguePlugin { + + /** + * The quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code AnaDialogue} {@code Object}. + */ + public AnaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AnaDialogue} {@code Object}. + * @param player the player. + */ + public AnaDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AnaDialogue(player); + } + + @Override + public void init() { + super.init(); + PluginManager.definePlugin(new AnaNPC()); + PluginManager.definePlugin(new AnaBarrelHandler()); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + if ((quest.getStage(player) == 71 || quest.getStage(player) == 72) && args.length > 1) { + player.getDialogueInterpreter().sendDialogue("You see a barrel coming to the surface. Before too long you haul it", "onto the side. The barrel seems quite heavy and you hear a muffled", "sound coming from inside."); + stage = 400; + return true; + } + switch (quest.getStage(player)) { + case 98: + switch (stage) { + case 0: + npc("Great! Thanks for getting me out of that mine! And", "that barrel wasn't too bad anyway! Pop by again", "sometime, I'm sure we'll have a barrel of laughs!"); + stage++; + break; + } + break; + case 60: + player("Hello!"); + break; + case 61: + if (args.length > 1) { + npc("Hey, what do you think you're doing?"); + stage = 20; + return true; + } + player("Hello again!"); + break; + default: + player.getPacketDispatch().sendMessage("This slave does not appear interested in talking to you."); + end(); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 98: + switch (stage) { + case 1: + npc("Oh! I nearly forgot! Here's a key I found in the", "tunnels. It might be some use to you, not sure what", "it opens. Sorry, but I have to go now."); + stage++; + break; + case 2: + interpreter.sendItemMessage(TouristTrap.WROUGHT_IRON_KEY, "Ana gives you a wrought iron key..."); + stage++; + break; + case 3: + player.getInventory().add(TouristTrap.WROUGHT_IRON_KEY, player); + player.getPacketDispatch().sendMessage("Ana spots Irena and waves..."); + NPC irena = RegionManager.getNpc(player, 4986); + irena.sendChat("Hi Ana!"); + quest.setStage(player, 98); + end(); + player.getDialogueInterpreter().open(4986, irena); + break; + } + break; + case 71: + switch (stage) { + case 400: + interpreter.sendDialogues(823, null, "Get me OUT OF HERE!"); + stage++; + break; + case 401: + quest.setStage(player, 72); + end(); + break; + } + break; + case 61: + switch (stage) { + case 0: + npc("Hello there, how's it going? Do you have a plan to get", "out of here yet?"); + stage++; + break; + case 1: + player("Well, I'm working on it, have you got any suggestions?"); + stage++; + break; + case 2: + npc("Hmmm."); + stage++; + break; + case 3: + npc("No, sorry..."); + stage++; + break; + case 4: + npc("The only thing that gets out of here is the rock that we", "mine."); + stage++; + break; + case 5: + npc("Not even the dead get a decent funeral. Bodies are", "just thrown down disused mine holes. It's very", "disrespectful..."); + stage++; + break; + case 6: + player("How does the rock get out?"); + stage++; + break; + case 7: + npc("Well, we mine it in this section, then someone scoops it", "into a barrel. The barrels are loaded onto a mine cart.", "Then they're deposited near the surface lift."); + stage++; + break; + case 8: + npc("I have no idea where they go from there. But that's", "not going to help us, is it?"); + stage++; + break; + case 9: + player("Where would I get one of those barrels from?"); + stage++; + break; + case 10: + npc("Well, you would get one from around by the life area.", "But why would you want one of those?"); + stage++; + break; + case 11: + player("I could try to sneak you out if you were in a barrel!"); + stage++; + break; + case 12: + npc("There is no way you are getting me into a barrel. No", "WAY! Do you understand?"); + stage++; + break; + case 13: + player("Well, we'll see, it might be the only way."); + stage++; + break; + case 14: + end(); + break; + case 20:// barrel dialogue. + if (player.getInventory().remove(TouristTrap.BARREL)) { + player.sendChat("Shush... It's for your own good!"); + player.getInventory().add(TouristTrap.ANNA_BARREL); + close(); + player.lock(3); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + interpreter.sendDialogues(823, null, "-- You manage to squeeze Ana into the barrel, --", "-- despite her many complaints. --", "I djont fit in dis bawwel... Wet me out!!"); + stage++; + return true; + } + }); + } + break; + case 21: + end(); + break; + } + break; + case 60: + switch (stage) { + case 0: + npc("Hello there, I don't think I've seen you before."); + stage++; + break; + case 1: + player("What's your name?"); + stage++; + break; + case 2: + npc("My name? Oh, how sweet, my name is Ana. I come from", "Al-Kharid though we've only recently moved there. I was", "born, and did most of my growing up, in Varrock. I", "thought the desert might be interesting. What a surprise"); + stage++; + break; + case 3: + npc("I got!"); + stage++; + break; + case 4: + player("Do you want to go back to Al-Kharid?"); + stage++; + break; + case 5: + npc("Sure, I miss my Mum, her name is Irena and she is", "probably waiting for me. How do you propose we get out", "of here though?"); + stage++; + break; + case 6: + npc("I'm sure you've noticed the many square jawed guards", "around here. You look like you can handle yourself", "but I have my doubts that you can take them all on!"); + stage++; + break; + case 7: + quest.setStage(player, 61); + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 822 }; + } + + /** + * The use with handler for the barrel on ana. + * @author 'Vexia + * @version 1.0 + */ + public static final class AnaBarrelHandler extends UseWithHandler { + + /** + * Constructs a new {@code AnaBarrelHandler} {@code Object}. + */ + public AnaBarrelHandler() { + super(TouristTrap.BARREL.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(822, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (quest.getStage(player)) { + case 61: + player.getDialogueInterpreter().open(822, event.getUsedWith(), true); + break; + default: + return false; + } + return true; + } + + } + + /** + * The ana npc. + * @author 'Vexia + * @version 1.0 + */ + public static final class AnaNPC extends AbstractNPC { + + /** + * Constructs a new {@code AnaNPC} {@code Object}. + */ + public AnaNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AnaNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public AnaNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new AnaNPC(id, location); + } + + @Override + public boolean isHidden(final Player player) { + Quest quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + if (quest.getStage(player) > 61) { + return true; + } + return player.getInventory().containsItem(TouristTrap.ANNA_BARREL) || player.getBank().containsItem(TouristTrap.ANNA_BARREL); + } + + @Override + public int[] getIds() { + return new int[] { 822 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/BedabinNomadDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/BedabinNomadDialogue.java new file mode 100644 index 000000000..c8ef45759 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/BedabinNomadDialogue.java @@ -0,0 +1,202 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; + +/** + * The dialogue plugin used for the bedabin nomad npcs. + * @author 'Vexia + * @version 1.0 + */ +public final class BedabinNomadDialogue extends DialoguePlugin { + + /** + * The quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code BedabinNomadDialogue} {@code Object}. + */ + public BedabinNomadDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BedabinNomadDialogue} {@code Object}. + * @param player the player. + */ + public BedabinNomadDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BedabinNomadDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (npc.getId()) { + case 834:// guard + switch (quest.getStage(player)) { + default: + npc("Sorry, but you can't use the tent without permission."); + break; + case 54: + if (player.getInventory().containsItem(TouristTrap.TECHNICAL_PLANS)) { + player("Al Shabim said I could enter, here are the plans!"); + stage++; + } else { + npc("Sorry, but you can't use the tent without permission."); + } + break; + case 100: + npc("Sorry, but you can't use the tent without permission. But", "thanks for all your help with the Bedabin people."); + break; + } + break; + case 833:// nomad + case 1239:// fighter + npc("Hello Effendi! How can I help you?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (npc.getId()) { + case 834:// guard + switch (quest.getStage(player)) { + default: + end(); + break; + case 54: + switch (stage) { + case 0: + end(); + break; + case 1: + npc("Okay, go ahead."); + stage = 2; + break; + case 2: + end(); + final GameObject door = RegionManager.getObject(new Location(3169, 3046, 0)); + ObjectBuilder.replace(door, door.transform(2701), 2); + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(3169, 3046); + player.getPacketDispatch().sendMessage("You walk into the tent."); + break; + } + break; + case 100: + end(); + break; + } + break; + case 833:// nomad + switch (stage) { + case 0: + options("What is this place?", "Where is Shantay Pass?", "What do you have to sell?", "Okay, thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What is this place?"); + stage = 10; + break; + case 2: + player("Where is Shantay pass?"); + stage = 20; + break; + case 3: + npc.openShop(player); + end(); + break; + case 4: + player("Okay, thanks."); + stage = 40; + break; + } + case 10: + npc("This is the camp of Bedabin. Talk to our leader, Al", "Shabim, he'll be happy to chat. We can sell you very", "reasonably priced water..."); + stage++; + break; + case 11: + end(); + break; + case 20: + npc("It is North East of here effendi, across the trackless", "desert. It will be a thirsty trip."); + stage = 41; + break; + case 40: + case 41: + end(); + break; + } + break; + case 1239:// fighter + switch (stage) { + case 0: + options("What is this place?", "Where is Shantay Pass?", "Okay, thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What is this place?"); + stage = 10; + break; + case 2: + player("Where is Shantay pass?"); + stage = 20; + break; + case 3: + player("Okay, thanks."); + stage = 40; + break; + } + break; + case 10: + npc("This is the camp of Bedabin. Talk to our leader, Al", "Shabim, he'll be happy to chat. We can sell you very", "reasonably priced water..."); + stage++; + break; + case 11: + end(); + break; + case 20: + npc("It is North East of here effendi, across the trackless", "desert. It will be a thirsty trip."); + stage = 41; + break; + case 40: + case 41: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { /** bedabin nomad guard */ + 834, /** bedabin nomad */ + 833, /** bedabin nomad fighter */ + 1239 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/CaptainSiadDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/CaptainSiadDialogue.java new file mode 100644 index 000000000..6839eba09 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/CaptainSiadDialogue.java @@ -0,0 +1,134 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * The dialogue used for the captain siad npc. + * @author 'Vexia + * @version 1.0 + */ +public final class CaptainSiadDialogue extends DialoguePlugin { + + /** + * The quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code CaptainSiadDialogue} {@code Object}. + */ + public CaptainSiadDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CaptainSiadDialogue} {@code Object}. + * @param player the player. + */ + public CaptainSiadDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CaptainSiadDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (quest.getStage(player)) { + default: + player.getPacketDispatch().sendMessage("The captain looks up from his work as you address him."); + npc("What are you doing in here?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 52: + switch (stage) { + case 0: + player("I wanted to have a chat?"); + stage++; + break; + case 1: + npc("You don't belong in here, get out!"); + stage++; + break; + case 2: + player("You seem to have a lot of books!"); + stage++; + break; + case 3: + npc("Yes, I do. Now please get to the point?"); + stage++; + break; + case 4: + player("So, you're interested in sailing?"); + stage++; + break; + case 5: + interpreter.sendDialogue("The captain's interest seems to perk up."); + stage++; + break; + case 6: + npc("Well, yes actually... It's been a passion of mine for", "some years..."); + stage++; + break; + case 7: + player("I could tell by the cut of your jib."); + stage++; + break; + case 8: + npc("Oh yes? Really?"); + stage++; + break; + case 9: + npc("Well, I was quite a catch in my day you know!"); + stage++; + break; + case 10: + interpreter.sendDialogue("The captain starts rambling on about his days as a salty sea dog. He", "looks quite distracted..."); + stage++; + break; + case 11: + end(); + quest.setStage(player, 53); + break; + } + break; + default: + switch (stage) { + case 0: + player("I wanted to have a chat?"); + stage++; + break; + case 1: + npc("You don't belong in here, get out!"); + stage++; + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 831 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.java new file mode 100644 index 000000000..bc77cc528 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/DesertGuardDialogue.java @@ -0,0 +1,369 @@ +package core.game.content.quest.members.thetouristrap; + +import java.util.List; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Represents the mining desert camp guard dialogue. + * @author 'Vexia + * @version 1.0 + */ +public final class DesertGuardDialogue extends DialoguePlugin { + + /** + * Represents the quest. + */ + private Quest quest; + + /** + * Constructs a new {@code DesertGuardDialogue} {@code Object}. + */ + public DesertGuardDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DesertGuardDialogue} {@code Object}. + * @param player the player. + */ + public DesertGuardDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DesertGuardDialogue(player); + } + + @Override + public void init() { + super.init(); + PluginManager.definePlugin(new DesertGuardNPC()); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (npc.getId()) { + case 5001: + switch (quest.getStage(player)) { + default: + npc("What are you looking at?"); + break; + case 40: + npc("Yeah, what do you want?"); + break; + case 50: + case 51: + case 52: + case 53: + case 54: + if (player.getInventory().containsItem(TouristTrap.TENTI_PINEAPPLE)) { + player("Hey... I have something for you!"); + stage = 0; + } else { + npc("Do you have my tenti pineapple yet?"); + stage = 10; + } + break; + case 60: + case 70: + case 80: + case 90: + case 100: + if (stage == 60) { + end(); + return true; + } + npc("That pineapple was just delicious, many thanks. I don't", "suppose you could get me another? -- The guard looks at", "you pleadingly."); + break; + } + break; + default: + switch (quest.getStage(player)) { + default: + npc("What are you looking at?"); + break; + } + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (npc.getId()) { + case 5001: + switch (quest.getStage(player)) { + case 51: + case 52: + case 53: + case 54: + switch (stage) { + case 0: + interpreter.sendItemMessage(TouristTrap.TENTI_PINEAPPLE, "You show the Tenti pineapple to the guard."); + stage++; + break; + case 1: + if (player.getInventory().remove(TouristTrap.TENTI_PINEAPPLE)) { + quest.setStage(player, 60); + npc("Great! Just what I've been looking for! Mmmmmmm...", "Delicious! This is so nice! Mmmmm, *SLURP*", "Yummmm... Oh yes, this is great."); + stage = 10; + } + break; + case -10: + player("Sorry, I don't have it yet."); + stage = -11; + break; + case -11: + end(); + break; + case 10: + player("So, can I go through now please?"); + stage++; + break; + case 11: + npc("Yes, yes, of course... a deal's a deal!"); + stage++; + break; + case 12: + end(); + break; + } + break; + case 50: + switch (stage) { + case 0: + interpreter.sendItemMessage(TouristTrap.TENTI_PINEAPPLE, "You show the Tenti pineapple to the guard."); + stage++; + break; + case 1: + if (player.getInventory().remove(TouristTrap.TENTI_PINEAPPLE)) { + quest.setStage(player, 60); + npc("Great! Just what I've been looking for! Mmmmmmm...", "Delicious!! This is so nice! Mmmmm, *SLURP*", "Yummmm... Oh yes, this is great."); + stage = 10; + } + break; + case 10: + player("Sorry, I don't have it yet."); + stage++; + break; + case 11: + end(); + break; + } + break; + case 40: + switch (stage) { + case 0: + player("I'd like to mine in a different area."); + stage++; + break; + case 1: + npc("Oh, you want to work in another area of the mine eh?", "-- The guard seems pleased with his rhetorical question.--", "Well, I can understand that! A change is as good as a", "rest they say."); + stage++; + break; + case 2: + player("Yes sir, you're quite right sir."); + stage++; + break; + case 3: + npc("Of course I'm right. And what goes around comes", "around as they say. And it's been absolutely ages since", "I've had anything different to eat."); + stage++; + break; + case 4: + npc("What I wouldn't give for some whole, fresh, ripe and", "juicy pineapple for a change. And those Tenti's have the", "best pineapple in this entire area."); + stage++; + break; + case 5: + interpreter.sendDialogue("The guard winks at you."); + stage++; + break; + case 6: + npc("I'm sure you get my meaning..."); + stage++; + break; + case 7: + player("Yes sir, we understand each other perfectly."); + stage++; + break; + case 8: + npc("Okay, good the. And remember, I prefer my", "pineapples whole, not chopped up with all the juice gone."); + stage++; + break; + case 9: + interpreter.sendDialogue("The guard moves back to his post and winks at you knowingly."); + stage++; + break; + case 10: + quest.setStage(player, 50); + end(); + break; + } + break; + case 100: + case 60: + switch (stage) { + case 0: + player("You must be joking! The last one I got you cost me", "double shifts working copper ore! You should be", "grateful you got one at all."); + stage++; + break; + case 1: + end(); + break; + case 10: + player("So, can I go through now please?"); + stage++; + break; + case 11: + npc("Yes, yes, of course... a deal's a deal!"); + stage++; + break; + case 12: + end(); + break; + } + break; + default: + end(); + break; + } + break; + default: + switch (quest.getStage(player)) { + default: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4993, 4994, 4995, 4996, 4997, 4998, 4999, 5000, 5001 }; + } + + /** + * The desert guard npc. + * @author 'Vexia + */ + public static final class DesertGuardNPC extends AbstractNPC { + + /** + * Represents the last check. + */ + private int lastCheck; + + /** + * Constructs a new {@code DesertGuardNPC} {@code Object}. + */ + public DesertGuardNPC() { + super(0, null); + } + + /** + * Constructs a new {@code DesertGuardNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public DesertGuardNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DesertGuardNPC(id, location); + } + + @Override + public void tick() { + if (lastCheck < GameWorld.getTicks()) { + lastCheck = GameWorld.getTicks() + RandomFunction.random(50, 150); + if (!inCombat()) { + warn(); + } + } + super.tick(); + } + + /** + * Method used to warn players whom are breaking rules. + */ + private void warn() { + final List players = RegionManager.getLocalPlayers(this); + for (final Player player : players) { + if (player.getAttribute("guard-warning", 0) > GameWorld.getTicks() || !player.getZoneMonitor().isInZone("mining camp") || player.inCombat() || !player.getLocation().withinDistance(this.getLocation(), 8)) { + continue; + } + if (TouristTrap.inJail(player)) { + continue; + } + if (!TouristTrap.hasSlaveClothes(player)) { + player.setAttribute("guard-warning", GameWorld.getTicks() + 300); + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, this, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 1: + face(player); + if (!TouristTrap.hasSlaveClothes(player)) { + sendChat("Hey, they're interesting clothes!"); + player.getPacketDispatch().sendMessage("Guard: You're no slave."); + } else { + sendChat("Hey - you with the armour!"); + player.getPacketDispatch().sendMessage("Guard: Hey - You with the armour!"); + } + break; + case 5: + if (!TouristTrap.hasSlaveClothes(player)) { + sendChat("You're no slave."); + player.getPacketDispatch().sendMessage("Guard: What are you doing in here?"); + } else { + sendChat("You're not allowed in here!"); + player.getPacketDispatch().sendMessage("Guard: You're not allowed in here!"); + } + break; + case 8: + sendChat("Intel the cell you go! I hope this teaches you a lesson."); + getProperties().getCombatPulse().attack(player); + break; + case 10: + if (!TouristTrap.inJail(player)) { + TouristTrap.jail(player); + } + break; + } + return false; + } + }); + break; + } + } + } + + @Override + public int[] getIds() { + return new int[] { 4993, 4994, 4995, 4996, 4997, 4998, 4999, 5000, 5001, 5002 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/IrenaDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/IrenaDialogue.java new file mode 100644 index 000000000..6ec1cc6d0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/IrenaDialogue.java @@ -0,0 +1,237 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Represents the irena dialogue used during tourist trap. + * @author 'Vexia + * @version 1.0 + */ +public final class IrenaDialogue extends DialoguePlugin { + + /** + * The array of skills to choose. + */ + private static final int[] SKILLS = new int[] { Skills.FLETCHING, Skills.AGILITY, Skills.SMITHING, Skills.THIEVING }; + + /** + * Represents the quest. + */ + private Quest quest; + + /** + * Constructs a new {@code IrenaDialogue} {@code Object}. + */ + public IrenaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code IrenaDialogue} {@code Object}. + * @param player the player. + */ + public IrenaDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new IrenaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + if (quest.getStage(player) == 95 && player.getInventory().containsItem(TouristTrap.ANNA_BARREL)) { + npc("Hey, great you've found Ana!"); + stage = 900; + return true; + } + switch (quest.getStage(player)) { + case 98: + npc("Thank you very much for returning my daughter to", "me. I'm really very grateful... I would like to reward", "you for your bravery and daring."); + stage++; + break; + case 0: + interpreter.sendDialogue("Irena seems to be very upset and cries as you approach her."); + break; + case 100: + case 95: + case 99: + player.getPacketDispatch().sendMessage("Irena seems happy now that her daughter has returned home."); + npc("Thanks so much for returning my daughter to me.", "I expect that she will go on another trip soon though.", "She is the adventurous type... a bit like yourself really!", "Okay, see you around then!"); + break; + default: + npc("*Sob* Have you found my daughter yet?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 900: + interpreter.sendDialogues(823, null, "-- You show Irena the barrel with Ana in it. --", "Hey great, there's my Mum!"); + stage++; + return true; + case 901: + player.getInventory().remove(TouristTrap.ANNA_BARREL); + end(); + quest.setStage(player, 98); + player.getDialogueInterpreter().open(822); + return true; + } + switch (quest.getStage(player)) { + case 98:// reward. + switch (stage) { + case 1: + npc("I can offer you increased knowledge in two of the", "following areas."); + stage++; + break; + case 2: + options("Fletching.", "Agility.", "Smithing.", "Thieving."); + stage++; + break; + case 3: + player.setAttribute("first-skill", buttonId); + npc("Okay, now choose your second skills."); + stage++; + break; + case 4: + options("Fletching.", "Agility.", "Smithing.", "Thieving."); + stage++; + break; + case 5: + player.setAttribute("second-skill", buttonId); + npc("Okay, that's all the skills I can teach you!"); + stage++; + break; + case 6: + int skills[] = new int[] { SKILLS[player.getAttribute("first-skill", 0) - 1], SKILLS[player.getAttribute("second-skill", 0) - 1] }; + for (int i : skills) { + player.getSkills().addExperience(i, 4650); + } + quest.finish(player); + end(); + break; + } + break; + case 0: + switch (stage) { + case 0: + if (quest.hasRequirements(player)) { + npc("Boo hoo! Oh dear, my only daughter...."); + stage++; + } else { + npc("Boo hoo! Go away!"); + stage = 99; + } + break; + case 1: + player("What's the matter?"); + stage++; + break; + case 2: + npc("Oh dear... my daughter, Ana, has gone missing in the", "desert. I fear that she is lost, or perhaps... *sob* even", "worse."); + stage++; + break; + case 3: + player("When did she go into the desert?"); + stage++; + break; + case 4: + npc("*Sob* she went in there just a few days ago, *Sob*", "she said she would be back yesterday."); + stage++; + break; + case 5: + npc("*Sob* And she's not..."); + stage++; + break; + case 6: + player("Is there a reward if I get her back?"); + stage++; + break; + case 7: + npc("Well, yes, you'll have my gratitude young man."); + stage++; + break; + case 8: + npc("And I'm sure that Ana will also be very pleased! And I", "may see if I can get a small reward together... But I", "cannot promise anything. So does that mean that you'll", "look for her then?"); + stage++; + break; + case 9: + player("Okay Irena, calm down. I'll get your daughter back for", "you."); + stage++; + break; + case 10: + npc("That would be great! That's really very nice of you!", "She was wearing a red silk scarf when she left."); + stage++; + break; + case 11: + npc("Are you 'really' sure you want to do this? I mean, go", "on this quest?"); + stage++; + break; + case 12: + player("Yes, I'll go on this quest!"); + stage++; + break; + case 13: + npc("Oh thank you! You've made me a very happy mother, I", "just hope it's not too late!"); + stage++; + break; + case 14: + player("Do you have any other hints on where she may have", "gone?"); + stage++; + break; + case 15: + npc("I did go looking for her myself and I came across some", "footprints just a little way south. I'm worried that they", "lead to the desert mining camp."); + stage++; + break; + case 16: + quest.start(player); + end(); + break; + case 99: + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + player("No, not yet."); + stage++; + break; + case 1: + npc("Please! Hurry up."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 100: + case 95: + case 99: + player.getPacketDispatch().sendMessage("Irena goes back to work."); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4986 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MaleSlaveDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MaleSlaveDialogue.java new file mode 100644 index 000000000..aa75ad9c9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MaleSlaveDialogue.java @@ -0,0 +1,364 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * The dialogue for the male slave at the desert camp. + * @author 'Vexia + * @version 1.0 + */ +public final class MaleSlaveDialogue extends DialoguePlugin { + + /** + * The quest instance. + */ + private Quest quest; + + /** + * Constructs a new {@code MaleSlaveDialogue} {@code Object}. + */ + public MaleSlaveDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MaleSlaveDialogue} {@code Object}. + * @param player the player. + */ + public MaleSlaveDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MaleSlaveDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (npc.getShownNPC(player).getId()) { + case 4985: + case 825: + switch (quest.getStage(player)) { + case 40: + npc("Do you want to trade clothes now?"); + break; + case 30: + npc("Hello again, do you want to try and unlock my chains?", "I'd really appreciate it!"); + break; + case 20: + npc("You look like a new 'recruit'. How long have you been", "here?"); + break; + case 100: + npc("Oh bother, I was caught by the guards again... Listen, if", "you can get me some Desert Clothes, I'll trade you for my", "slave clothes again... Do you want to trade?"); + break; + default: + npc("Please, just leave me alone my life is", "terrible as it is."); + break; + } + break; + case 826: + switch (quest.getStage(player)) { + default: + npc("Yay! I'm finally free."); + stage = 0; + break; + } + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (npc.getShownNPC(player).getId()) { + case 4985: + case 825: + switch (quest.getStage(player)) { + case 30: + switch (stage) { + case 0: + player("Yeah, okay, let's give it a go."); + stage++; + break; + case 1: + quest.setStage(player, 40); + npc("Great! You did it! Do you want to trade clothes now?"); + stage = 0; + break; + } + break; + case 40: + switch (stage) { + case 0: + player("Yes, I'll trade."); + stage = 11; + break; + case 11: + if (!TouristTrap.hasDesertClothes(player)) { + npc("I need desert boots, a desert robe and a desert", "shirt if you want these clothes off me."); + stage++; + } else { + npc("Great! You have the Desert Clothes! -- the slave starts", "undressing right in front of you -- Okay, here's the", "clothes, I won't need them anymore."); + stage += 2; + } + break; + case 12: + end(); + break; + case 13: + interpreter.sendItemMessage(1845, "The slave gives you his dirty, flea infested robe."); + stage++; + break; + case 14: + interpreter.sendItemMessage(1844, "The slave gives you his muddy, sweat soaked shirt."); + stage++; + break; + case 15: + interpreter.sendItemMessage(1846, "The slave gives you a smelly pair of decomposing boots."); + stage++; + break; + case 16: + if (player.getEquipment().remove(TouristTrap.DESERT_CLOTHES)) { + stage++; + npc("Right, I'm off! Good luck!"); + TouristTrap.addConfig(player, (1 << 4)); + for (Item item : TouristTrap.SLAVE_CLOTHES) { + player.getEquipment().add(item, true, false); + } + player.getPacketDispatch().sendMessages("The slave takes your desert robe.", "The slave takes your desert shirt.", "The slave takes your desert boots."); + } + break; + case 17: + player("Yeah, good luck to you too!"); + break; + } + break; + case 20: + switch (stage) { + case 0: + player("I've just arrived."); + stage++; + break; + case 1: + npc("Yeah, it looks like it as well. It's a shame that I won't be", "around long enough to get to know you. I'm making a", "break for it today. I have a plan to get out of here! It's", "amazing in its sophistication."); + stage++; + break; + case 2: + player("Oh yes, that sounds interesting."); + stage++; + break; + case 3: + npc("Yes, it is actually. I have all the details figured out", "except for one."); + stage++; + break; + case 4: + player("What's that then?"); + stage++; + break; + case 5: + npc("-- The slave rattles the chains on his arms loudly. --", "These bracelets, I can't seem to get them off. If I", "could get them off, I'd be able to climb my way out of", "here."); + stage++; + break; + case 6: + player("I can try to undo them for you."); + stage++; + break; + case 7: + npc("Really, that would be great... --The slave looks at you", "strangely. -- Hang on a minute... I suppose you want", "something for doing this?"); + stage++; + break; + case 8: + npc("The last time I did a trade in this place, I nearly lost", "the shirt from my back!"); + stage++; + break; + case 9: + player("It's funny you should say that actually."); + stage++; + break; + case 10: + npc("-- the slave looks at you blankly. --"); + stage++; + break; + case 11: + npc("Yeah, go on!"); + stage++; + break; + case 12: + player("If I can get the chains off, you have to give me", "something, okay?"); + stage++; + break; + case 13: + npc("Sure, what do you want?"); + stage++; + break; + case 14: + player("I want your clothes!"); + stage++; + break; + case 15: + npc("Blimey!"); + stage++; + break; + case 16: + player("I can dress like a slave and gain access to the mine", "area to scout it out."); + stage++; + break; + case 17: + npc("You're either incredibly brave or incredibly stupid. But", "what would I wear if you take my clothes? Get me", "some nice desert clothes and I'll think about it?"); + stage++; + break; + case 18: + npc("Do you still want to try and undo the locks for me?"); + stage++; + break; + case 19: + player("Yeah, okay, let's give it a go."); + stage++; + break; + case 20: + npc("Great!"); + stage++; + break; + case 21: + interpreter.sendDialogue("You use some nearby bits of wood and wire to try and pick the lock."); + stage++; + break; + case 22: + final int random = RandomFunction.random(3); + if (random == 1) { + interpreter.sendDialogue("You didn't manage to pick the lock this time would you like another", "go?"); + stage++; + } else if (random == 2) { + interpreter.sendDialogue("A nearby guard spots you!"); + stage = 24; + } else { + quest.setStage(player, 40); + npc("Great! You did it! Do you want to trade clothes now?"); + stage = 0; + } + break; + case 23: + player("Yeah, I'll give it another go."); + stage = 21; + break; + case 24: + player.lock(); + interpreter.sendDialogues(getIds()[0], null, true, "Oh oh!"); + GameWorld.getPulser().submit(new Pulse(4, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + interpreter.sendDialogues(4993, null, true, "Oi, what are you two doing?"); + break; + case 2: + end(); + player.getPacketDispatch().sendMessage("Slave: Oh oh!"); + player.getPacketDispatch().sendMessage("Guard: Oi, what are you two doing?"); + ; + player.getPacketDispatch().sendMessage("The guards search you!"); + break; + case 3: + player.getPacketDispatch().sendMessage("You are roughed up by the guards and manhandled into a cell."); + break; + case 4: + player.unlock(); + quest.setStage(player, 30); + player.getProperties().setTeleportLocation(Location.create(3285, 3034, 0)); + return true; + } + return false; + } + }); + stage++; + break; + case 25: + interpreter.sendDialogues(4993, null, true, "Oi, what are you two doing?"); + break; + } + break; + case 100: + switch (stage) { + case 0: + player("Yes, I'll trade."); + stage++; + break; + case 1: + if (!TouristTrap.hasDesertClothes(player)) { + npc("I need desert boots, a desert robe and a desert", "shirt if you want these clothes off me."); + stage++; + break; + } + npc("Great! You have the Desert Clothes! -- the slave starts", "undressing right in front of you -- Okay, here's the", "clothes, I won't need them anymore."); + stage = 13; + break; + case 2: + end(); + break; + case 13: + interpreter.sendItemMessage(1845, "The slave gives you his dirty, flea infested robe."); + stage++; + break; + case 14: + interpreter.sendItemMessage(1844, "The slave gives you his muddy, sweat soaked shirt."); + stage++; + break; + case 15: + interpreter.sendItemMessage(1846, "The slave gives you a smelly pair of decomposing boots."); + stage++; + break; + case 16: + if (player.getEquipment().remove(TouristTrap.DESERT_CLOTHES)) { + stage++; + npc("Right, I'm off! Good luck!"); + TouristTrap.addConfig(player, (1 << 4)); + player.getEquipment().add(TouristTrap.SLAVE_CLOTHES); + player.getPacketDispatch().sendMessages("The slave takes your desert robe.", "The slave takes your desert shirt.", "The slave takes your desert boots."); + } + break; + case 17: + player("Yeah, good luck to you too!"); + break; + } + break; + default: + switch (stage) { + case 0: + end(); + break; + } + break; + } + break; + case 826: + switch (quest.getStage(player)) { + default: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 825, 826, 4985 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.java new file mode 100644 index 000000000..3f35fc01e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MercenaryCaptainDialogue.java @@ -0,0 +1,209 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.world.map.Location; +import core.plugin.PluginManager; + +/** + * Represents the mercenary captain dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class MercenaryCaptainDialogue extends DialoguePlugin { + + /** + * Represents the quest. + */ + private Quest quest; + + /** + * Constructs a new {@code MercenaryCaptainDialogue} {@code Object}. + */ + public MercenaryCaptainDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MercenaryCaptainDialogue} {@code Object}. + * @param player the player. + */ + public MercenaryCaptainDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MercenaryCaptainDialogue(player); + } + + @Override + public void init() { + super.init(); + PluginManager.definePlugin(new MercenaryCaptain()); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (quest.getStage(player)) { + case 11: + interpreter.sendDialogue("You approach the Mercenary Captain."); + break; + default: + npc("What are you doing here?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + switch (stage) { + case 0: + player("Nothing, just passing by."); + stage++; + break; + case 1: + end(); + break; + } + break; + case 11: + switch (stage) { + case 0: + player("Wow! A real captain!"); + stage++; + break; + case 1: + npc("Be off effendi, you are not wanted around here."); + stage++; + break; + case 2: + player("I'd love to work for a tough guy like you!"); + stage++; + break; + case 3: + npc("Hmmm, oh yes, what can you do?"); + stage++; + break; + case 4: + player("Can't I do something for a strong Captain like you?"); + stage++; + break; + case 5: + interpreter.sendDialogue("The Captain ponders a moment and then looks at you critically."); + stage++; + break; + case 6: + npc("You could bring me the head of Al Zaba Bhasim."); + stage++; + break; + case 7: + npc("He is the leader of the notorious desert bandits, they", "plague us daily. You should find them west of here.", "You should have no problem in finishing them all off.", "Do this for me and maybe I will consider helping you."); + stage++; + break; + case 8: + player("Sorry Sir, I don't think I can do that."); + stage++; + break; + case 9: + npc("Hmm, well yes, I did consider that you might not be", "right for the job. be off with you then before I turn", "my men loose on you."); + stage++; + break; + case 10: + player("It's a funny captain who can't fight his own battles!"); + stage++; + break; + case 11: + interpreter.sendDialogue("The men around you fall silent and the Captain silently fumes. All", "eyes turn to the Captain..."); + stage++; + break; + case 12: + npc("Very well, if you're challenging me, let's get on with it!"); + stage++; + break; + case 13: + interpreter.sendDialogue("The guards gather around to watch the fight."); + stage++; + break; + case 14: + end(); + npc.getProperties().getCombatPulse().attack(player); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 830 }; + } + + /** + * The mercenary captain npc. + * @author 'Vexia + */ + public static final class MercenaryCaptain extends AbstractNPC { + + /** + * Constructs a new {@code MercenaryCaptain} {@code Object}. + */ + public MercenaryCaptain() { + super(0, null); + } + + /** + * Constructs a new {@code MercenaryCaptain} {@code Object}. + * @param id the id.. + * @param location the location. + */ + public MercenaryCaptain(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MercenaryCaptain(id, location); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player player = (Player) killer; + final Quest quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (quest.getStage(player)) { + case 0: + case 10: + + break; + default: + if (!player.getInventory().containsItem(TouristTrap.METAL_KEY) && !player.getBank().containsItem(TouristTrap.METAL_KEY)) { + player.getInventory().add(TouristTrap.METAL_KEY, player); + player.getDialogueInterpreter().sendItemMessage(TouristTrap.METAL_KEY, "The mercenary captain drops a metal key on the floor.", "You quickly grab the key and add it to your inventory."); + } + quest.setStage(player, 20); + break; + } + } + } + + @Override + public int[] getIds() { + return new int[] { 830 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MercenaryDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MercenaryDialogue.java new file mode 100644 index 000000000..d97a2263a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MercenaryDialogue.java @@ -0,0 +1,204 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Represents the mercenary dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class MercenaryDialogue extends DialoguePlugin { + + /** + * Represents the coins item to bribe. + */ + private static final Item COINS = new Item(995, 5); + + /** + * Represents the quest. + */ + private Quest quest; + + /** + * Constructs a new {@code MercenaryDialogue} {@code Object}. + */ + public MercenaryDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MercenaryDialogue} {@code Object}. + * @param player the player. + */ + public MercenaryDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MercenaryDialogue(player); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (quest.getStage(player)) { + default: + npc("What are you doing here?"); + break; + case 10: + npc("Yeah, what do you want?"); + break; + case 100: + npc("What are you looking at?"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + switch (stage) { + case 0: + player("Nothing, just passing by."); + stage++; + break; + case 1: + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + player("I'm looking for a woman called Ana, have you seen her?"); + stage++; + break; + case 1: + npc("No, now get lost!"); + stage++; + break; + case 2: + player("Perhaps five gold coins will help you remember?"); + stage++; + break; + case 3: + npc("Well, it certainly will help!"); + stage = 4; + break; + case 4: + if (!player.getInventory().containsItem(COINS)) { + player("Sorry, I don't seem to have enough coins."); + stage++; + break; + } + if (player.getInventory().remove(COINS)) { + interpreter.sendItemMessage(COINS, "-- The guard takes the five gold coins. --"); + stage = 6; + } + break; + case 5: + end(); + break; + case 6: + npc("Now then, what did you want to know?"); + stage++; + break; + case 7: + player("I'm looking for a woman called Ana, have you seen her?"); + stage++; + break; + case 8: + npc("Hmm, well, we get a lot of people in here. But not", "many women through... Saw one come in last week...."); + stage++; + break; + case 9: + npc("But I don't know if it's the woman you're looking for?"); + stage++; + break; + case 10: + player("What are you guarding?"); + stage = 11; + break; + case 11: + npc("Well, if you have to know, we're making sure that no", "prisoners get out. -- The guard gives you a", "disapproving look. -- And to make sure that", "unauthorised people don't get in."); + stage = 12; + break; + case 12: + npc("-- The guard looks around nervously. -- You'd better", "go soon before the Captain orders us to kill you."); + stage++; + break; + case 13: + player("Does the Captain order you to kill a lot of people?"); + stage++; + break; + case 14: + npc("-- The guard snorts. -- *Snort* Just about anyone", "who talks to him."); + stage++; + break; + case 15: + npc("Unless he has a use for you, he'll probably just order", "us to kill you. And it's such a horrible job cleaning up", "the mess afterwards."); + stage++; + break; + case 16: + player("Not to mention the senseless waste of human life."); + stage++; + break; + case 17: + npc("Huh? Them's your words, not mine."); + stage++; + break; + case 18: + player("It doesn't sound as if you respect your Captain much."); + stage++; + break; + case 19: + interpreter.sendDialogue("-- The guard looks around conspiratorially. --"); + stage++; + break; + case 20: + npc("Well, to be honest. We think he's not exactly as brave", "as he makes out. But we have to follow his orders. If", "someone called him a coward, or managed to trick him", "into a one-on-one duel many of us bet that he'd be"); + stage++; + break; + case 21: + npc("beaten."); + stage++; + break; + case 22: + player("And how could I trick him into a one-on-one duel?"); + stage++; + break; + case 23: + npc("Like all cowards, he likes to be made to feel important.", "If anyone insults him outright, he just gets us to do his", "dirty work. However, if he thinks he's better than you,", "if you compliment him, he may feel that he can defeat"); + stage = 24; + break; + case 24: + npc("you. And if he initiated a duel, all the men agreed that", "they wouldn't intervene. We think he'd be slaughtered", "in double quick time."); + stage++; + break; + case 25: + quest.setStage(player, 11); + end(); + break; + } + break; + case 100: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4989, 4990, 4991, 4992 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MineSlaveNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MineSlaveNPC.java new file mode 100644 index 000000000..c01f6b999 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MineSlaveNPC.java @@ -0,0 +1,60 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * The mining slave npc at the desert camp. + * @author 'Vexia + */ +public final class MineSlaveNPC extends AbstractNPC { + + /** + * The random force chats to say. + */ + private static final String[] CHATS = new String[] { "I'm sick of this place.", "What I wouldn't give for a good nights rest.", "I feel so weak I could faint.", "I didn't want to be a miner anyway.", "Ooh my back.", "I'm rich in experience, poor in wealth.", "I can' think straight, i'm so tired." }; + + /** + * The delay until the next chat. + */ + private int delay; + + /** + * Constructs a new {@code MineSlaveNPC} {@code Object}. + */ + public MineSlaveNPC() { + super(0, null); + } + + /** + * Constructs a new {@code MineSlaveNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public MineSlaveNPC(int id, Location location) { + super(id, location); + delay = GameWorld.getTicks() + RandomFunction.random(20, 100); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MineSlaveNPC(id, location); + } + + @Override + public void tick() { + if (delay < GameWorld.getTicks()) { + sendChat(CHATS[RandomFunction.random(CHATS.length)]); + delay = GameWorld.getTicks() + RandomFunction.random(20, 100); + } + super.tick(); + } + + @Override + public int[] getIds() { + return new int[] { 4975, 4976, 4977, 4978 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MinecartDriverDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MinecartDriverDialogue.java new file mode 100644 index 000000000..e2c2ff30a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MinecartDriverDialogue.java @@ -0,0 +1,216 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * The dialogue plugin used to handle the minecart driver. + * @author 'Vexia + * @version 1.0 + */ +public final class MinecartDriverDialogue extends DialoguePlugin { + + /** + * The coins item. + */ + private static final Item COINS = new Item(995, 100); + + /** + * The quest npc. + */ + private Quest quest; + + /** + * Constructs a new {@code MinecartDriverDialogue} {@code Object}. + * @param player the player. + */ + public MinecartDriverDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code MinecartDriverDialogue} {@code Object}. + */ + public MinecartDriverDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MinecartDriverDialogue(player); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + switch (quest.getStage(player)) { + case 90: + npc("Quickly, get in the back of the cart."); + break; + case 80: + interpreter.sendDialogue("The cart driver seems to be fastidiously cleaning his cart.", "It doesn't look as if he wants to be disturbed."); + break; + default: + player("Hello!"); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 90: + switch (stage) { + case 0: + player("Okay, sorry."); + stage++; + break; + case 1: + end(); + break; + case 24: + end(); + break; + } + break; + case 80: + switch (stage) { + case 0: + player("Nice cart."); + stage++; + break; + case 1: + interpreter.sendDialogue("The cart driver looks around at you and tries to weigh you up."); + stage++; + break; + case 2: + npc("Hmmm."); + stage++; + break; + case 3: + interpreter.sendDialogue("He tuts to himself and starts checking the wheels."); + stage++; + break; + case 4: + player("One wagon wheel says to the other, 'I'll see you", "around'."); + stage++; + break; + case 5: + npc("-- The cart driver smirks a little. --"); + stage++; + break; + case 6: + interpreter.sendDialogue("He starts checking the steering on the cart."); + stage++; + break; + case 7: + player("One good turn deserves another�."); + stage++; + break; + case 8: + interpreter.sendDialogue("The cart driver smiles a bit and then turns to you."); + stage++; + break; + case 9: + npc("Are you trying to get me fired?"); + stage++; + break; + case 10: + player("Fired.... no, shot perhaps!"); + stage++; + break; + case 11: + npc("Ha ha ha! -- The cart driver checks that", "guards aren't watching. -- What're you in fer?"); + stage++; + break; + case 12: + player("In for a penny in for a pound."); + stage++; + break; + case 13: + interpreter.sendDialogue("The cart drivers laughs at your pun..."); + stage++; + break; + case 14: + npc("Ha ha ha, oh stop it!"); + stage++; + break; + case 15: + interpreter.sendDialogue("The cart driver seems much happier now."); + stage++; + break; + case 16: + npc("What can I do for you anyway?"); + stage++; + break; + case 17: + player("Well, you see, it's like this..."); + stage++; + break; + case 18: + npc("Yeah!"); + stage++; + break; + case 19: + player("There's ten gold in it for you if you leave now no", "questions asked."); + stage++; + break; + case 20: + npc("If you're going to bribe me, at least make it worth my", "while. Now, let's say 100 Gold pieces should we? Ha ha", "ha!"); + stage++; + break; + case 21: + player("A hundred it is!"); + stage++; + break; + case 22: + npc("Great!"); + stage++; + break; + case 23: + if (!player.getInventory().containsItem(COINS)) { + player.getPacketDispatch().sendMessage("You need 100 gold coins."); + end(); + return true; + } + if (player.getInventory().remove(COINS)) { + quest.setStage(player, 90); + npc("Okay, get in the back of the cart then!"); + stage++; + } + break; + case 24: + end(); + break; + } + break; + default: + switch (stage) { + case 0: + npc("Hello, what do you want?"); + stage++; + break; + case 1: + player("Nothing, just passing by."); + stage++; + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 841 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MiningCampZone.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MiningCampZone.java new file mode 100644 index 000000000..28933afa0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/MiningCampZone.java @@ -0,0 +1,113 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Plugin; + +/** + * The map zone for the mining camp. + * @author 'Vexia + * @version 1.0 + */ +public final class MiningCampZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code MiningCampZone} {@code Object}. + */ + public MiningCampZone() { + super("mining camp", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public boolean enter(Entity entity) { + return super.enter(entity); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (!logout && e instanceof Player) { + if (checkAnna((Player) e)) { + return false; + } + } + return super.leave(e, logout); + } + + @Override + public boolean interact(Entity e, final Node node, Option option) { + switch (option.getName()) { + case "Equip": + case "Wear": + final Player player = (Player) e; + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + if (TouristTrap.isJailable(player)) { + TouristTrap.jail(player, "Hey! What do you think you're doing!?"); + } + return true; + } + }); + break; + } + return super.interact(e, node, option); + } + + @Override + public boolean teleport(Entity entity, final int type, Node node) { + if (entity instanceof Player && type != -1) { + return !checkAnna((Player) entity); + } else { + return super.teleport(entity, type, node); + } + } + + /** + * Checks for anna. + * @param p the player. + * @return {@code True} if removed. + */ + public boolean checkAnna(final Player p) { + final Quest quest = p.getQuestRepository().getQuest(TouristTrap.NAME); + if (p.getAttribute("ana-delay", 0) > GameWorld.getTicks()) { + return false; + } + if (quest.getStage(p) > 60 && quest.getStage(p) < 95 && p.getInventory().containsItem(TouristTrap.ANNA_BARREL)) { + p.getInventory().remove(TouristTrap.ANNA_BARREL); + p.lock(5); + TouristTrap.addConfig(p, (1 << 4)); + quest.setStage(p, 61); + p.getProperties().setTeleportLocation(Location.create(3285, 3034, 0)); + p.getPacketDispatch().sendMessage("The guards spot anna and throw you in jail."); + return true; + } + return false; + } + + @Override + public void configure() { + register(new ZoneBorders(3274, 3014, 3305, 3041)); + register(new ZoneBorders(3260, 9408, 3331, 9472)); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.java new file mode 100644 index 000000000..6dafea57d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/RowdySlaveNPC.java @@ -0,0 +1,92 @@ +package core.game.content.quest.members.thetouristrap; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * The rowdy slave npc. + * @author 'Vexia + * @version 1.0 + */ +public final class RowdySlaveNPC extends AbstractNPC { + + /** + * The chats to say when talked to. + */ + private static final String[] CHATS = new String[] { "Oi! Are you looking at me?", "I'm going to teach you some respect!", "Hey, you're in for a good beating!" }; + + /** + * Constructs a new {@code RowdySlaveNPC} {@code Object}. + */ + public RowdySlaveNPC() { + super(0, null); + } + + /** + * Constructs a new {@code RowdySlaveNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public RowdySlaveNPC(int id, Location location) { + super(id, location); + this.setAggressive(true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new RowdySlaveNPC(id, location); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player player = (Player) killer; + GroundItemManager.create(new Item(526), getLocation(), player); + if (!TouristTrap.hasSlaveClothes(player) && !player.getEquipment().containsItems(TouristTrap.SLAVE_CLOTHES)) { + player.getPacketDispatch().sendMessages("The slave drops his shirt.", "The slave drops his robe.", "The slave drops his boots."); + for (Item i : TouristTrap.SLAVE_CLOTHES) { + GroundItemManager.create(i, getLocation(), player); + } + } + } + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(getIds()[0]).getHandlers().put("option:talk-to", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + ((NPC) node).sendChat(CHATS[RandomFunction.random(CHATS.length)]); + ((NPC) node).attack(player); + return true; + } + + }); + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return new int[] { 827 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/TouristTrap.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/TouristTrap.java new file mode 100644 index 000000000..e811d62b3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/TouristTrap.java @@ -0,0 +1,310 @@ +package core.game.content.quest.members.thetouristrap; + +import core.game.component.Component; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * The main type for the tourist trap quest. + * @author Aero + * @author Vexia + * + */ +@Initializable +public final class TouristTrap extends Quest { + + /** + * The name of the quest. + */ + public static final String NAME = "The Tourist Trap"; + + /** + * The metal key item. + */ + public static final Item METAL_KEY = new Item(1839); + + /** + * The desert gear items. + */ + public static final Item[] DESERT_CLOTHES = new Item[] { new Item(1833), new Item(1835), new Item(1837) }; + + /** + * The slave clothes items. + */ + public static final Item[] SLAVE_CLOTHES = new Item[] { new Item(1846), new Item(1844), new Item(1845) }; + + /** + * Teh tenti pineapple item. + */ + public static final Item TENTI_PINEAPPLE = new Item(1851); + + /** + * The cell door key item. + */ + public static final Item CELL_DOOR_KEY = new Item(1840); + + /** + * The wrought iron key item. + */ + public static final Item WROUGHT_IRON_KEY = new Item(1843); + + /** + * The bedabin key item. + */ + public static final Item BEDABIN_KEY = new Item(1852); + + /** + * The config id for this quest. + */ + public static final int CONFIG_ID = 907; + + /** + * The technical plans item. + */ + public static final Item TECHNICAL_PLANS = new Item(1850); + + /** + * The prototype dart tip item. + */ + public static final Item PROTOTYPE_DART_TIP = new Item(1853); + + /** + * The prototype dart item. + */ + public static final Item PROTOTYPE_DART = new Item(1849); + + /** + * The barrel item. + */ + public static final Item BARREL = new Item(1841); + + /** + * The anna barrel item. + */ + public static final Item ANNA_BARREL = new Item(1842); + + /** + * The jail location. + */ + public static final Location JAIL = Location.create(3285, 3034, 0); + + /** + * The zone borders. + */ + public static final ZoneBorders JAIL_BORDER = new ZoneBorders(3284, 3032, 3287, 3037); + + /** + * The slots to check for items on. + */ + public static final int[] SLOTS = new int[] { EquipmentContainer.SLOT_WEAPON, EquipmentContainer.SLOT_FEET, EquipmentContainer.SLOT_SHIELD, EquipmentContainer.SLOT_HAT, EquipmentContainer.SLOT_CHEST, EquipmentContainer.SLOT_LEGS }; + + /** + * Constructs a new {@code TouristTrap} {@code Object}. + */ + public TouristTrap() { + super(NAME, 123, 122, 2, 197, 0, 1, 30); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new TouristTrapPlugin(), new AnaDialogue(), new CaptainSiadDialogue(), new DesertGuardDialogue(), new IrenaDialogue(), new MaleSlaveDialogue(), new MercenaryCaptainDialogue(), new MercenaryDialogue(), new MinecartDriverDialogue(), new MineSlaveNPC(), new MiningCampZone(), new RowdySlaveNPC(), new AlShabimDialogue(), new BedabinNomadDialogue()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (getStage(player)) { + case 0: + line(player, "I can start this quest by speaking to Irena after I have

gone through the Shantay Pass, South of Al-Kharid.

To complete this quest I need:-

" + (player.getSkills().getStaticLevel(Skills.FLETCHING) > 9 ? "" : "") + "Level 10 Fletching

" + (player.getSkills().getStaticLevel(Skills.SMITHING) > 19 ? "" : "") + "Level 20 Smithing" + (hasRequirements(player) ? "

I have all the requirements to begin and complete this

quest." : ""), 11); + break; + case 10: + case 11: + case 30: + case 40: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I need to head into the desert and search for Ana", 11); + break; + case 50: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I need to find the guard a Tenti Pineapple for the guard.", 11); + break; + case 51: + case 52: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I have found a way to get Tenti Pineapple I need to find

the research plans that Captain Siad has.", 11); + break; + case 53: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I have found a way to get Tenti Pineapple

I found the technical plans Al Shabim was looking for.", 11); + break; + case 54: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I have found a way to get Tenti Pineapple

I need to manufacture the Prototype weapon for Al Shabim.", 11); + break; + case 60: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I manufactured the Prototype weapon and received

a tasty Tenti Pineapple.", 11); + break; + case 61: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I finally found Anna. I just need to find a way to smuggle

her out of here.", 11); + break; + case 71: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I need to operate the Winch to lift Ana back up here.", 11); + break; + case 72: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I need to get Ana from one of the barrels lifted.", 11); + break; + case 80: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I loaded Ana into the Cart I now need to get the cart driver

to transport it.", 11); + break; + case 90: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I payed the Mine cart driver and he agreed to smuggle me and Anna

out of the Mining camp.", 11); + break; + case 95: + case 98: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I smuggled both me and Anna from the Mining camp. I should

go tell Irena straight away.", 11); + break; + case 100: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I returned Ana back to her mother and was rewarded

with a key and the knowledge in two skills.



QUEST COMPLETE!", 11); + break; + default: + line(player, "Irena was distraught that her daughter Ana had vanished

somewhere in the desert, and I agreed to help find her.

I need to head into the desert and search for Ana", 11); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("2 Quest Points", 277, 8+ 2); + player.getPacketDispatch().sendString("4650 XP in each of the two skills", 277, 9+ 2); + player.getPacketDispatch().sendString("Ability to make throwing darts", 277, 10+ 2); + player.getPacketDispatch().sendString("Access to desert mining camp", 277, 11+ 2); + player.getPacketDispatch().sendString("mithril and adamantite rocks.", 277, 12+ 2); + player.getPacketDispatch().sendItemZoomOnInterface(806, 230, 277, 3+ 2); + player.getQuestRepository().syncronizeTab(player); + player.getInventory().remove(new Item(1842, player.getInventory().getAmount(ANNA_BARREL))); + player.getBank().remove(new Item(1842, player.getBank().getAmount(ANNA_BARREL))); + } + + /** + * Sends the player to jail. + * @param player the player. + */ + public static void jail(final Player player, String dialogue) { + player.getDialogueInterpreter().sendDialogues(4999, null, dialogue); + player.lock(); + GameWorld.getPulser().submit(new Pulse(1) { + int counter; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.lock(); + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 3: + player.getProperties().setTeleportLocation(Location.create(3285, 3034, 0)); + player.getPacketDispatch().sendMessage("You are roughed up by the guards and manhandled into a cell."); + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().close(); + player.unlock(); + return true; + } + return false; + } + }); + } + + /** + * Jails a player. + * @param player the player. + */ + public static void jail(final Player player) { + jail(player, "Hey you! You're not supposed to be in here!"); + } + + /** + * Checks if the player is jailable. + * @param player the player. + * @return {@code True} if so. + */ + public static boolean isJailable(final Player player) { + if (inJail(player)) { + return false; + } + if (player.getEquipment().itemCount() > 3 || (!hasDesertClothes(player) && !hasSlaveClothes(player))) { + for (int i : SLOTS) { + if (player.getEquipment().get(i) != null) { + return true; + } + } + } + return false; + } + + /** + * Adds a config value pertaining to this quest. + * @param player the player. + */ + public static void addConfig(final Player player, final int value) { + player.getConfigManager().set(CONFIG_ID, value, true); + } + + /** + * Checks if the player has desert gear. + * @param player the player. + * @return {@code True} if so. + */ + public static boolean hasDesertClothes(final Player player) { + for (Item i : DESERT_CLOTHES) { + if (!player.getEquipment().containsItem(i)) { + return false; + } + } + return true; + } + + /** + * Checks if the player has slave clothes. + * @param player the player. + * @return {@code True} if so. + */ + public static boolean hasSlaveClothes(final Player player) { + for (Item i : SLAVE_CLOTHES) { + if (!player.getEquipment().containsItem(i)) { + return false; + } + } + return true; + } + + /** + * Checks if the player has armour. + * @param player the player. + * @return + */ + public static boolean hasArmour(final Player player) { + return player.getEquipment().itemCount() > 0 && !hasDesertClothes(player) && !hasSlaveClothes(player); + } + + /** + * Checks if the player is in jail. + * @param player the player. + * @return {@code True} if so. + */ + public static boolean inJail(final Player player) { + return JAIL_BORDER.insideBorder(player); + } + + @Override + public boolean hasRequirements(Player player) { + return player.getSkills().getStaticLevel(Skills.FLETCHING) > 9 && player.getSkills().getStaticLevel(Skills.SMITHING) > 19; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.java new file mode 100644 index 000000000..f3fe944d1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/thetouristrap/TouristTrapPlugin.java @@ -0,0 +1,1692 @@ +package core.game.content.quest.members.thetouristrap; + +import core.cache.def.impl.AnimationDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.smithing.smelting.Bar; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.build.DynamicRegion; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +import core.game.content.quest.members.thetouristrap.TouristTrapPlugin.AnnaCartHandler.AnnaCartCutscene; +import core.game.content.quest.members.thetouristrap.TouristTrapPlugin.BedabinAnvilHandler.AnnaWinchHandler; + +/** + * Represents the plugin used to handle interactions for tourist trap. + * + * @author 'Vexia + * @version 1.0 + */ +public final class TouristTrapPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2673).getHandlers().put("option:open", this); + ObjectDefinition.forId(2674).getHandlers().put("option:open", this); + ObjectDefinition.forId(2673).getHandlers().put("option:search", this); + ObjectDefinition.forId(2674).getHandlers().put("option:search", this); + ObjectDefinition.forId(2688).getHandlers().put("option:open", this); + ObjectDefinition.forId(2688).getHandlers().put("option:search", this); + ObjectDefinition.forId(2687).getHandlers().put("option:open", this); + ObjectDefinition.forId(2687).getHandlers().put("option:search", this); + ObjectDefinition.forId(2685).getHandlers().put("option:open", this); + ObjectDefinition.forId(2685).getHandlers().put("option:open", this); + ObjectDefinition.forId(2686).getHandlers().put("option:search", this); + ObjectDefinition.forId(2686).getHandlers().put("option:search", this); + ObjectDefinition.forId(18958).getHandlers().put("option:search", this); + ObjectDefinition.forId(18958).getHandlers().put("option:look at", this); + ObjectDefinition.forId(18959).getHandlers().put("option:search", this); + ObjectDefinition.forId(18959).getHandlers().put("option:look at", this); + ObjectDefinition.forId(18888).getHandlers().put("option:look at", this); + ObjectDefinition.forId(18888).getHandlers().put("option:operate", this); + ObjectDefinition.forId(36748).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(18869).getHandlers().put("option:bend", this); + ObjectDefinition.forId(18870).getHandlers().put("option:escape", this); + ObjectDefinition.forId(2689).getHandlers().put("option:open", this); + ObjectDefinition.forId(1528).getHandlers().put("option:open", this); + ObjectDefinition.forId(1529).getHandlers().put("option:close", this); + ObjectDefinition.forId(18899).getHandlers().put("option:search", this); + ObjectDefinition.forId(18899).getHandlers().put("option:look at", this); + ObjectDefinition.forId(18878).getHandlers().put("option:search", this); + ObjectDefinition.forId(18878).getHandlers().put("option:look at", this); + ObjectDefinition.forId(18879).getHandlers().put("option:search", this); + ObjectDefinition.forId(18879).getHandlers().put("option:look at", this); + ObjectDefinition.forId(18898).getHandlers().put("option:search", this); + ObjectDefinition.forId(18898).getHandlers().put("option:look at", this); + ObjectDefinition.forId(18902).getHandlers().put("option:search", this); + ObjectDefinition.forId(18871).getHandlers().put("option:climb", this); + ObjectDefinition.forId(18923).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(18924).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(2676).getHandlers().put("option:open", this); + ObjectDefinition.forId(2675).getHandlers().put("option:open", this); + ObjectDefinition.forId(2676).getHandlers().put("option:watch", this); + ObjectDefinition.forId(2675).getHandlers().put("option:watch", this); + ObjectDefinition.forId(2690).getHandlers().put("option:open", this); + ObjectDefinition.forId(2691).getHandlers().put("option:open", this); + ObjectDefinition.forId(2698).getHandlers().put("option:walk through", this); + ObjectDefinition.forId(2699).getHandlers().put("option:walk through", this); + ObjectDefinition.forId(2677).getHandlers().put("option:open", this); + ObjectDefinition.forId(2678).getHandlers().put("option:search", this); + ObjectDefinition.forId(2684).getHandlers().put("option:search", this); + ObjectDefinition.forId(2684).getHandlers().put("option:look at", this); + ObjectDefinition.forId(2680).getHandlers().put("option:search", this); + ObjectDefinition.forId(2680).getHandlers().put("option:look-in", this); + ObjectDefinition.forId(2681).getHandlers().put("option:search", this); + ObjectDefinition.forId(2681).getHandlers().put("option:look in", this); + ObjectDefinition.forId(18962).getHandlers().put("option:search", this); + ObjectDefinition.forId(18962).getHandlers().put("option:look in", this); + ObjectDefinition.forId(18963).getHandlers().put("option:search", this); + ObjectDefinition.forId(18963).getHandlers().put("option:look in", this); + ObjectDefinition.forId(18951).getHandlers().put("option:look at", this); + ObjectDefinition.forId(18951).getHandlers().put("option:use", this); + ObjectDefinition.forId(2684).getHandlers().put("option:search", this); + ObjectDefinition.forId(2684).getHandlers().put("option:look at", this); + NPCDefinition.forId(830).getHandlers().put("option:watch", this); + NPCDefinition.forId(4975).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(4976).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(4977).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(4978).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(5002).getHandlers().put("option:talk-to", this); + TouristTrap.TECHNICAL_PLANS.getDefinition().getHandlers().put("option:read", this); + TouristTrap.ANNA_BARREL.getDefinition().getHandlers().put("option:look", this); + TouristTrap.ANNA_BARREL.getDefinition().getHandlers().put("option:drop", this); + PluginManager.definePlugin(new BedabinKeyHandler()); + PluginManager.definePlugin(new BedabinAnvilHandler()); + PluginManager.definePlugin(new BarrelDialogue()); + PluginManager.definePlugin(new WinchDialogue()); + PluginManager.definePlugin(new MineCartDialogue()); + PluginManager.definePlugin(new AnnaCartHandler()); + PluginManager.definePlugin(new AnnaCartCutscene()); + PluginManager.definePlugin(new AnnaWinchHandler()); + PluginManager.definePlugin(new WinchCutscene()); + PluginManager.definePlugin(new CartDialogue()); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + final int id = node.getId(); + switch (option) { + case "read": + player.getDialogueInterpreter().sendDialogue("The plans look very technical! But you can see that this item will", "require a bronze bar and at least 10 feathers."); + break; + case "watch": + switch (id) { + case 2676: + case 2675: + player.getDialogueInterpreter().sendDialogue("You watch the doors for some time. You notice that only slaves seem", "to do down there. You might be able to sneak down if you pass as a", "slave."); + break; + default: + player.getDialogueInterpreter().sendDialogue("You watch the Mercenary Captain for some time. He has a large", "metal key attached to his belt. You notice that he usually gets his", "men to do his dirty work."); + break; + } + break; + case "walk through": + switch (id) { + case 2698: + case 2699: + if (quest.getStage(player) < 60) { + player.getDialogueInterpreter().sendDialogues(5001, null, "Hey you! You're not allowed in there."); + break; + } + if (!TouristTrap.hasSlaveClothes(player)) { + player.getDialogueInterpreter().sendDialogues(5001, null, "Hey you're not a slave!"); + break; + } + player.getProperties().setTeleportLocation(player.getLocation().transform(player.getLocation().getX() >= 3284 ? -4 : 4, 0, 0)); + player.getPacketDispatch().sendMessages("You walk into the darkness of the cavern...", "... and emerge in a different part of this huge underground complex."); + break; + } + break; + case "look": + player.getDialogueInterpreter().sendDialogues(823, null, "Let me out of here, I feel sick!"); + break; + case "drop": + player.getDialogueInterpreter().sendDialogues(823, null, "Don't let me out!"); + break; + case "open": + switch (id) { + case 2688: + case 2687: + if (!player.getInventory().containsItem(TouristTrap.WROUGHT_IRON_KEY)) { + player.getPacketDispatch().sendMessage("This gate looks like it needs a key to open it."); + break; + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + break; + case 2686: + case 2685: + player.getDialogueInterpreter().sendDialogues(4999, null, "Hey, move away from the gate. There's nothing", "interesting for you here."); + break; + case 2677: + if (!player.getInventory().containsItem(TouristTrap.BEDABIN_KEY)) { + player.getPacketDispatch().sendMessage("This chest needs a key to unlock it."); + break; + } + if (quest.getStage(player) <= 54 && quest.getStage(player) != 53) { + player.getPacketDispatch().sendMessage("The captain spots you before you manage to open the chest..."); + player.lock(3); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().open(831, RegionManager.getNpc(player, 831)); + return true; + } + }); + } else if (quest.getStage(player) == 53) { + if (!player.hasItem(TouristTrap.TECHNICAL_PLANS)) { + player.getDialogueInterpreter().sendItemMessage(TouristTrap.TECHNICAL_PLANS, "While the Captain's distracted, you quickly unlock the", "chest with the Bedabins' copy of the key. You take out", "the plans."); + player.getInventory().add(TouristTrap.TECHNICAL_PLANS, player); + } + } + break; + case 2690: + case 2691: + player.setAttribute("ana-delay", GameWorld.getTicks() + 2); + player.getProperties().setTeleportLocation(Location.create(3301, 3035, 0)); + break; + case 2676: + case 2675: + if (!TouristTrap.hasSlaveClothes(player)) { + player.getDialogueInterpreter().sendDialogues(4997, null, "Watch it! Only slaves can travel into the mine."); + break; + } + player.setAttribute("ana-delay", GameWorld.getTicks() + 2); + player.getProperties().setTeleportLocation(Location.create(3278, 9427, 0)); + player.getDialogueInterpreter().sendDialogue("The huge doors open into a dark, dank and smelly tunnel. The", "associated smells of a hundred sweaty miners greets your nostrils.", "And your ears ring with the 'CLANG CLANG CLANG' as metal hits", "rock."); + break; + case 2674: + case 2673: + if (quest.getStage(player) > 60 && quest.getStage(player) < 98 && player.getInventory().containsItem(TouristTrap.ANNA_BARREL)) { + player.lock(); + player.getDialogueInterpreter().sendDialogues(4999, null, true, "Would you like me to take that heavy barrel", "for you?"); + GameWorld.getPulser().submit(new Pulse(4, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + player.getDialogueInterpreter().sendDialogues(player, null, "No, please don't."); + break; + case 2: + player.getDialogueInterpreter().close(); + player.getPacketDispatch().sendMessage("The guards search you!"); + break; + case 3: + player.getPacketDispatch().sendMessage("You are roughed up by the guards and manhandled into a cell."); + break; + case 4: + player.unlock(); + player.getInventory().remove(TouristTrap.ANNA_BARREL); + TouristTrap.addConfig(player, (1 << 4)); + quest.setStage(player, 61); + player.getProperties().setTeleportLocation(Location.create(3285, 3034, 0)); + return true; + } + return false; + } + }); + return true; + } + if (node.getLocation().withinDistance(new Location(3273, 3028, 0)) && !((player.getLocation().getX() >= 3274))) { + if (!player.getInventory().containsItem(TouristTrap.METAL_KEY)) { + player.getPacketDispatch().sendMessage("The gate needs a key in order to be opened."); + return true; + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + player.getPacketDispatch().sendMessage("The guards search you thoroughly as you go through the gates."); + return true; + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + break; + case 2689: + if (!player.getInventory().containsItem(TouristTrap.CELL_DOOR_KEY)) { + player.getPacketDispatch().sendMessage("The door seems to be pretty locked."); + break; + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + break; + case 1528: + ObjectBuilder.replace((GameObject) node, ((GameObject) node).transform(1529)); + break; + } + break; + case "close": + if (id == 1529) { + ObjectBuilder.replace((GameObject) node, ((GameObject) node).transform(1528)); + } + break; + case "look-in": + case "look in": + switch (id) { + case 2681: + case 18962: + case 18963: + player.getDialogueInterpreter().sendDialogue("This looks like an empty mining barrel. Slaves use this to load up the", "rocks and stones that they're mining."); + break; + case 2680: + player.getDialogueInterpreter().sendDialogue("You search the full barrel... It's full of rocks."); + break; + } + break; + case "use": + if (id == 18951) { + player.getDialogueInterpreter().open("winch dialogue"); + } + break; + case "search": + switch (id) { + case 2688: + case 2687: + player.getDialogueInterpreter().sendDialogue("These wrought iron gates look like they're designed to keep people out.", "it looks like you'll need a key to get past these."); + break; + case 2686: + case 2685: + player.getDialogueInterpreter().sendDialogue("It looks as if this is where very difficult prisoners are sent as a", "punishment."); + break; + case 2681: + case 18962: + case 18963: + player.getDialogueInterpreter().open("barrel dialogue", node); + break; + case 2680:// barrel of rocks. + player.getDialogueInterpreter().sendDialogue("This looks like a full mining barrel. Slaves use this to load up the", "rocks and stones that they're mining. This barrel is full of rocks."); + break; + case 2684:// cart + player.getDialogueInterpreter().open("cart dialogue", node); + break; + case 2678: + if (quest.getStage(player) == 51) { + quest.setStage(player, 52); + } + player.getDialogueInterpreter().sendItemMessage(9904, "You notice several books on the subject of sailing."); + break; + case 2673: + case 2674: + player.getDialogueInterpreter().sendDialogue("You see what looks like a mining compound. There seems to be people", "mining rocks. They look as if they're chained to the rocks and they're", "being watched over by the guards. It's not a very happy place."); + break; + case 18958: + case 18959: + if (quest.getStage(player) == 90) { + player.getDialogueInterpreter().open("ana cart dialogue"); + break; + } + player.getPacketDispatch().sendMessage("This looks like a mine cart which takes barrels out of the encampment to Al Kharid."); + break; + case 18899: + case 18898: + case 18878: + case 18879: + player.getDialogueInterpreter().sendDialogue("You search the footsteps more closely. You can see that there are", "five sets of footprints. One set of footprints seem lighter than the", "others. The four other footsteps were made by heavier people", "with boots."); + break; + case 18902: + if (hasItem(player, TouristTrap.CELL_DOOR_KEY)) { + player.getInventory().add(TouristTrap.CELL_DOOR_KEY, player); + player.getDialogueInterpreter().sendItemMessage(TouristTrap.CELL_DOOR_KEY, "You find a cell door key."); + break; + } else if (hasItem(player, TouristTrap.WROUGHT_IRON_KEY) && player.getQuestRepository().isComplete(TouristTrap.NAME)) { + player.getInventory().add(TouristTrap.WROUGHT_IRON_KEY, player); + player.getDialogueInterpreter().sendItemMessage(TouristTrap.WROUGHT_IRON_KEY, "You find the key to the main gate."); + break; + } + player.getPacketDispatch().sendMessage("You search the captains desk while he's not looking..."); + player.getPacketDispatch().sendMessage("...but you find nothing of interest."); + break; + } + break; + case "operate": + if (quest.getStage(player) != 71) { + player.getDialogueInterpreter().sendDialogue("There doesn't seem anything to lift."); + break; + } + ActivityManager.start(player, "winch cutscene", false); + break; + case "look at": + switch (id) { + case 18888: + player.getDialogueInterpreter().sendDialogue("This looks like a winch, it probably brings rocks up from", "underground."); + break; + case 18951: + player.getDialogueInterpreter().sendDialogue("This looks like a lift of some sort. You see barrels of rocks being", "placed on the lift and they're hauled up to the surface."); + break; + case 2684: + if (node.getLocation().getX() == 3318) { + player.getDialogueInterpreter().sendDialogue("This mine cart is being loaded up with new rocks and stone.", "It gets sent to a different section of the mine for unloading."); + break; + } + player.getDialogueInterpreter().sendDialogue("This cart is being unloaded into this section of the mine. Before being", "sent back to another section for another load."); + break; + case 18958: + case 18959: + player.getDialogueInterpreter().sendDialogue("A sturdy looking cart for carrying barrels of rocks out of ", "the mining camp."); + break; + case 18900: + case 18899: + case 18898: + case 18887: + case 18886: + case 18885: + case 18884: + case 18883: + case 18882: + case 18881: + case 18880: + case 18879: + case 18878: + case 18877: + player.getDialogueInterpreter().sendDialogue("This looks like some disturbed sand. Footsteps seem to be heading off", "towards the South."); + break; + } + break; + case "talk-to": + switch (id) { + case 5002: + ((NPC) node).sendChat("Move along please, don't want any trouble today!"); + break; + case 36748: + player.getDialogueInterpreter().sendDialogues(player, null, "Mmm... looks like that camel would make a nice kebab."); + break; + case 4975: + case 4977: + case 4978: + case 4976: + ((NPC) node).sendChat("Hey leave me alone, can't you see that i'm busy?"); + break; + } + break; + case "bend": + player.animate(Animation.create(5037)); + GameWorld.getPulser().submit(new Pulse(5, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("You bend the bars back."); + player.getConfigManager().set(907, player.getConfigManager().get(907) + 1); + return true; + } + }); + break; + case "escape": + player.getPacketDispatch().sendMessage("You prepare to squeeze through the bars."); + AgilityHandler.forceWalk(player, 0, player.getLocation(), player.getLocation().transform(player.getLocation().getX() <= node.getLocation().getX() ? 1 : -1, 0, 0), Animation.create(5038), 4, 0.0, null); + break; + case "climb": + player.getPacketDispatch().sendMessage("You scrape your hands and knees as you climb up."); + AgilityHandler.forceWalk(player, 0, player.getLocation(), Location.create(3279, 3037, 0), Animation.create(5041), 10, 0, null); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getAnimator().reset(); + return true; + } + }); + break; + case "climb-up": + if (id == 18923) { + if (player.getLocation().getX() <= 3278) { + return true; + } + player.animate(Animation.create(5039)); + GameWorld.getPulser().submit(new Pulse(6, player) { + @Override + public boolean pulse() { + player.getAnimator().reset(); + player.getProperties().setTeleportLocation(Location.create(3278, 3037, 0)); + return true; + } + }); + } + break; + case "climb-down": + if (id == 18924) { + if (player.getLocation().getX() <= 3273) { + return true; + } + AgilityHandler.forceWalk(player, 0, player.getLocation(), Location.create(3270, 3039, 0), Animation.create(5040), 20, 0, null); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getAnimator().reset(); + return true; + } + }); + } + break; + } + return true; + } + + @Override + public boolean isWalk(final Player player, Node node) { + return !(node instanceof Item); + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n.getId() == 18923) { + return new Location(3279, 3037, 0); + } + return null; + } + + /** + * Checks if the player contains an item. + * + * @param player the player. + * @param item the item. + * @return the item. + */ + private boolean hasItem(final Player player, final Item item) { + return !player.getInventory().containsItem(item) && !player.getBank().containsItem(item); + } + + /** + * The winch dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class WinchDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code WinchDialogue} {@code Object}. + */ + public WinchDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WinchDialogue} {@code Object}. + * + * @param player the player. + */ + public WinchDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WinchDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args.length >= 1) { + interpreter.sendDialogue("The guard notices the barrel (with Ana in it) that you're carrying."); + stage = 500; + return true; + } + interpreter.sendDialogues(4999, null, "Hey there, what do you want?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 500:// winch + interpreter.sendDialogues(5002, null, "Hey, that Barrel looks heavy, do you need a hand?"); + stage++; + break; + case 501: + player("Yes please."); + stage++; + break; + case 502: + interpreter.sendDialogue("The guard comes over and helps you. He takes one end of the", "barrel."); + stage++; + break; + case 503: + interpreter.sendDialogues(5002, null, "Blimey! This is heavy!"); + stage++; + break; + case 504: + interpreter.sendDialogues(823, null, "Why you cheeky....!"); + stage++; + break; + case 505: + interpreter.sendDialogues(5002, null, "- The guard looks around surprised at Ana's outburst. -", "What was that?"); + stage++; + break; + case 506: + player("Oh, it was nothing."); + stage++; + break; + case 507: + interpreter.sendDialogues(5002, null, "I could have sworn I heard something!"); + stage++; + break; + case 508: + interpreter.sendDialogues(823, null, "Yes you did you ignoramus."); + stage++; + break; + case 509: + interpreter.sendDialogues(5002, null, "What was that you said?"); + stage++; + break; + case 510: + player("I said you were very gregarious!"); + stage++; + break; + case 511: + interpreter.sendDialogues(823, null, "You creep!"); + stage++; + break; + case 512: + interpreter.sendDialogues(5002, null, "Oh, right, how very nice of you to say so.", "-- The guard seems flattered. --"); + stage++; + break; + case 513: + interpreter.sendDialogues(5002, null, "Anyway, let's get this barrel up to the surface, plenty", "more work for you to do!"); + stage++; + break; + case 514: + interpreter.sendDialogue("The guard places the barrel carefully on the lift platform."); + stage++; + break; + case 515: + interpreter.sendDialogues(5002, null, "Oh, there's no one operating the lift up top, hope this", "barrel isn't urgent? You'd better get back to work!"); + stage = 516; + break; + case 516: + player.getInventory().remove(TouristTrap.ANNA_BARREL); + player.getBank().remove(TouristTrap.ANNA_BARREL); + player.getQuestRepository().getQuest(TouristTrap.NAME).setStage(player, 71); + end(); + break; + case 0: + options("What is this thing?", "Can I use this?"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("What is this thing?"); + stage = 10; + break; + case 2: + player("Can I use this?"); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(4999, null, "It is quite clearly a lift. Any fool can see that it's used to", "transport rock to the surface."); + stage++; + break; + case 11: + case 21: + end(); + break; + case 20: + interpreter.sendDialogues(4999, null, "Of course not, you'd be doing me out of a job. Anyway", "you haven't got any barrels that need to go to", "the surface."); + stage++; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("winch dialogue")}; + } + + } + + /** + * The use with handler for anna on the cart. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class AnnaCartHandler extends UseWithHandler { + + /** + * Constructs a new {@code AnnaCartHandler} {@code Object}. + */ + public AnnaCartHandler() { + super(TouristTrap.ANNA_BARREL.getId()); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(2684, OBJECT_TYPE, this); + addHandler(18958, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + if (event.getUsedWith().getId() == 18958) {// cart + if (quest.getStage(player) == 72) { + player.lock(4); + player.animate(Animation.create(5050)); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getInventory().remove(event.getUsedItem()); + TouristTrap.addConfig(player, 4096 + (2048 + (1 << 4))); + quest.setStage(player, 80); + player.getDialogueInterpreter().sendDialogue("You place Ana (In the barrel) carefully on the cart. This was the last", "barrel to go on the cart, but the cart driver doesn't seem to be", "any rush to get going. And the desert heat will soon get to Ana."); + return true; + } + }); + } + return true; + } + if (!event.getUsedWith().getLocation().equals(Location.create(3318, 9430, 0))) { + return false; + } + if (quest.getStage(player) != 61) { + return false; + } + player.getDialogueInterpreter().sendDialogue("You carefully place Ana in the barrel into the mine", "cart. Soon the cart moves out of sight and then it", "returns."); + player.setAttribute("ana-delay", GameWorld.getTicks() + 100000000); + ActivityManager.start(player, "ana cart", false); + return true; + } + + /** + * The ana cart cutscene plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class AnnaCartCutscene extends CutscenePlugin { + + /** + * The paths. + */ + private static final Location[][] PATHS = new Location[][]{{Location.create(3315, 9417, 0), Location.create(3317, 9417, 0), Location.create(3318, 9418, 0), Location.create(3318, 9428, 0)}, {Location.create(3318, 9430, 0), Location.create(3318, 9418, 0), Location.create(3317, 9417, 0), Location.create(3316, 9417, 0), Location.create(3314, 9417, 0), Location.create(3303, 9417, 0)}}; + + /** + * Constructs a new {@code AnnaCartCutscene} {@code Object}. + */ + public AnnaCartCutscene() { + super("ana cart"); + } + + /** + * Constructs a new {@code AnnaCartCutscene} {@code Object}. + * + * @param player the player. + */ + public AnnaCartCutscene(final Player player) { + super("ana cart"); + this.player = player; + } + + @Override + public void open() { + super.open(); + player.setAttribute("ana-delay", GameWorld.getTicks() + 100000000); + player.faceLocation(base.transform(54, 22, 0)); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + NPC cart; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + player.animate(Animation.create(5052)); + break; + case 3: + ObjectBuilder.remove(RegionManager.getObject(base.transform(54, 22, 0))); + cart = NPC.create(4980, base.transform(54, 22, 0)); + cart.init(); + break; + case 4: + cart.getWalkingQueue().reset(); + for (Location l : PATHS[1]) { + Location loc = base.transform(l.getLocalX(), l.getLocalY(), 0); + cart.getWalkingQueue().addPath(loc.getX(), loc.getY()); + } + break; + case 18: + cart.clear(); + break; + case 22: + cart = NPC.create(4981, base.transform(51, 9, 0)); + cart.init(); + cart.getWalkingQueue().reset(); + for (Location l : PATHS[0]) { + Location loc = base.transform(l.getLocalX(), l.getLocalY(), 0); + cart.getWalkingQueue().addPath(loc.getX(), loc.getY()); + } + break; + case 33: + player.getQuestRepository().getQuest(TouristTrap.NAME).setStage(player, 70); + player.getInventory().remove(TouristTrap.ANNA_BARREL); + player.removeAttribute("ana-delay"); + AnnaCartCutscene.this.stop(true); + return true; + } + return false; + } + }); + } + + @Override + public ActivityPlugin newInstance(Player p) { + return new AnnaCartCutscene(p); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return base.transform(54, 23, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(13203); + setRegionBase(); + registerRegion(region.getId()); + } + } + } + + /** + * The cart dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class CartDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CartDialogue} {@code Object}. + * + * @param player the player. + */ + public CartDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code CartDialogue} {@code Object}. + */ + public CartDialogue() { + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CartDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogue("There is space on the cart for you get on, would you like to try?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes, I'll get on.", "No, I've got other plans."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogue("You decide to climb onto the cart."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 2: + player.lock(); + player.animate(ClimbActionHandler.CLIMB_UP); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 4: + player.getDialogueInterpreter().sendDialogue("As soon as you get on the cart, it starts to move.", "Before too long you are past the gates. You jump off", "the cart taking Ana with you."); + break; + case 6: + player.unlock(); + player.getInterfaceManager().closeOverlay(); + player.getQuestRepository().getQuest(TouristTrap.NAME).setStage(player, 95); + player.getInterfaceManager().close(); + player.getProperties().setTeleportLocation(Location.create(3258, 3029, 0)); + player.getInventory().add(TouristTrap.ANNA_BARREL); + return true; + } + return false; + } + }); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("ana cart dialogue")}; + } + + } + + /** + * The minecart dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class MineCartDialogue extends DialoguePlugin { + + /** + * The failing animation of getting in the cart. + */ + private static final Animation FAIL_ANIMATION = new Animation(5048); + + /** + * The jumping animation. + */ + private static final Animation JUMP_ANIMATION = new Animation(5049); + + /** + * The cart. + */ + private GameObject cart; + + /** + * Constructs a new {@code MineCartDialogue} {@code Object}. + */ + public MineCartDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MineCartDialogue} {@code Object}. + * + * @param player the player. + */ + public MineCartDialogue(final Player player) { + super(player); + } + + @Override + public void init() { + super.init(); + PluginManager.definePlugin(new MiningCartCutscene()); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MineCartDialogue(player); + } + + @Override + public boolean open(Object... args) { + cart = (GameObject) args[0]; + if (player.getInventory().containsItem(TouristTrap.ANNA_BARREL)) { + player("There's not enough room for both of us."); + stage = -1; + return true; + } + interpreter.sendDialogue("You search the mine cart..."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case -1: + end(); + break; + case 0: + interpreter.sendDialogue("There may be just enough space to squeeze yourself into the cart.", "Would you like to try?"); + stage++; + break; + case 1: + options("Yes, of course.", "No thanks, it looks pretty dangerous."); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + end(); + enterCart(player); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + /** + * Method used to enter the cart. + * + * @param player the player. + */ + public void enterCart(final Player player) { + if (RandomFunction.random(3) == 1) { + player.lock(FAIL_ANIMATION.getDelay()); + player.animate(FAIL_ANIMATION); + player.getImpactHandler().manualHit(player, 2, HitsplatType.NORMAL); + player.getPacketDispatch().sendMessages("You fail to fit yourself into the cart in time before it starts its journey.", "You bang your head on the cart as you try to jump in."); + } else { + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.animate(JUMP_ANIMATION); + return true; + } + }); + ActivityManager.start(player, "mining cart", false, cart.getLocation().getX() == 3303 ? 0 : 1); + } + } + + /** + * The mining cart cutscene plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class MiningCartCutscene extends CutscenePlugin { + + /** + * The paths. + */ + private static final Location[][] PATHS = new Location[][]{{Location.create(3303, 9417, 0), Location.create(3316, 9417, 0), Location.create(3317, 9417, 0), Location.create(3318, 9418, 0), Location.create(3318, 9430, 0)}, {Location.create(3318, 9430, 0), Location.create(3318, 9418, 0), Location.create(3317, 9417, 0), Location.create(3303, 9417, 0)}}; + + /** + * The path index. + */ + private int index; + + /** + * Constructs a new {@code MiningCartCutscene} {@code Object}. + */ + public MiningCartCutscene() { + super("mining cart"); + } + + /** + * Constructs a new {@code MiningCartCutscene} {@code Object}. + * + * @param player the player. + */ + public MiningCartCutscene(final Player player) { + super("mining cart"); + this.player = player; + } + + @Override + public boolean start(final Player player, boolean login, Object... args) { + index = (int) args[0]; + return super.start(player, login, args); + } + + @Override + public void open() { + ObjectBuilder.remove(RegionManager.getObject(base.getLocation().transform(getPath()[0].getLocalX(), getPath()[0].getLocalY(), 0))); + ObjectBuilder.remove(RegionManager.getObject(base.getLocation().transform(getPath()[getPath().length - 1].getLocalX(), getPath()[getPath().length - 1].getLocalY(), 0))); + player.getAppearance().setAnimations(Animation.create(211)); + player.getAppearance().setRidingMinecart(true); + player.getAppearance().sync(); + player.getWalkingQueue().reset(); + for (Location l : getPath()) { + Location loc = base.transform(l.getLocalX(), l.getLocalY(), 0); + player.getWalkingQueue().addPath(loc.getX(), loc.getY(), true); + } + GameWorld.getPulser().submit(new Pulse(22, player) { + @Override + public boolean pulse() { + player.setAttribute("real-end", index == 0 ? Location.create(3319, 9431, 0) : Location.create(3303, 9416, 0)); + player.setAttribute("cutscene:original-loc", index == 0 ? Location.create(3319, 9431, 0) : Location.create(3303, 9416, 0)); + MiningCartCutscene.this.stop(true); + return true; + } + }); + } + + @Override + public void end() { + super.end(); + player.getAppearance().setDefaultAnimations(); + player.getAppearance().setRidingMinecart(false); + player.getAppearance().sync(); + } + + @Override + public void fade() { + if (index == 0) { + player.getDialogueInterpreter().sendDialogue("You appear in a large open room with what looks like lots of miners", "working away. This is a very rough looking area, the miners look like", "they're on their last legs."); + } else { + player.getDialogueInterpreter().sendDialogue("You appear back in the barrel loading room. A nearby slave looks", "surprised to see you popping out of the cart."); + } + } + + @Override + public ActivityPlugin newInstance(Player p) { + return new MiningCartCutscene(p); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return base.transform(getPath()[0].getLocalX(), getPath()[0].getLocalY(), 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(13203); + setRegionBase(); + registerRegion(region.getId()); + } + + /** + * Gets the path index. + * + * @return the location. + */ + public Location[] getPath() { + return PATHS[index]; + } + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("cart dialogue")}; + } + + } + + /** + * The winch cutscene plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class WinchCutscene extends CutscenePlugin { + + /** + * Constructs a new {@code WinchCutscene} {@code Object}. + */ + public WinchCutscene() { + super("winch cutscene"); + } + + /** + * Constructs a new {@code WinchCutscene} {@code Object}. + * + * @param player the player. + */ + public WinchCutscene(final Player player) { + super("winch cutscene"); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) { + return new WinchCutscene(p); + } + + @Override + public void open() { + super.open(); + player.getPacketDispatch().sendMessage("You try to operate the winch."); + player.faceLocation(base.transform(15, 9, 0)); + player.animate(Animation.create(5054)); + GameWorld.getPulser().submit(new Pulse(AnimationDefinition.forId(5054).getDurationTicks(), player) { + @Override + public boolean pulse() { + TouristTrap.addConfig(player, 2048 + (1 << 4)); + WinchCutscene.this.stop(true); + player.getDialogueInterpreter().open(822, true, true); + return true; + } + }); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return base.transform(16, 10, 0); + } + + @Override + public void configure() { + region = DynamicRegion.create(13103); + setRegionBase(); + registerRegion(region.getId()); + } + + } + + /** + * The use with handler on the chest. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BedabinKeyHandler extends UseWithHandler { + + /** + * Constructs a new {@code BedabinKeyHandler} {@code Object}. + */ + public BedabinKeyHandler() { + super(TouristTrap.BEDABIN_KEY.getId()); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(2677, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.getDialogueInterpreter().open(831, RegionManager.getNpc(player, 831)); + return true; + } + + } + + /** + * The barrel dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BarrelDialogue extends DialoguePlugin { + + /** + * The game object barrel. + */ + private GameObject barrel; + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@code BarrelDialogue} {@code Object}. + */ + public BarrelDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BarrelDialogue} {@code Object}. + * + * @param player the player. + */ + public BarrelDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BarrelDialogue(player); + } + + @Override + public boolean open(Object... args) { + barrel = (GameObject) args[0]; + quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + if ((quest.getStage(player) == 70 || quest.getStage(player) == 72) && !player.hasItem(TouristTrap.ANNA_BARREL)) { + interpreter.sendDialogue("You search the barrels and find Ana."); + stage = 400; + return true; + } + if (player.getInventory().containsItem(TouristTrap.BARREL)) { + player.getPacketDispatch().sendMessage("You can only manage to have one of these at a time."); + end(); + return true; + } + interpreter.sendItemMessage(TouristTrap.BARREL, "This barrel is quite big. but you may be able to carry one. Would you like to take one?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 400:// finding anna. + interpreter.sendDialogues(823, null, "Let me out!"); + stage++; + break; + case 401: + if (!player.getInventory().hasSpaceFor(TouristTrap.ANNA_BARREL)) { + end(); + return true; + } + player.getPacketDispatch().sendMessage("You pick up Ana in a Barrel."); + player.getInventory().add(TouristTrap.ANNA_BARREL); + end(); + break; + case 402: + end(); + break; + case 0: + options("Yeah, cool!", "No thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendItemMessage(TouristTrap.BARREL, "You take the barrel, it's not heavy, just awkward."); + stage = 3; + break; + case 2: + end(); + break; + } + break; + case 3: + end(); + player.getInventory().add(TouristTrap.BARREL, player); + ObjectBuilder.remove(barrel); + GameWorld.getPulser().submit(new Pulse(40) { + @Override + public boolean pulse() { + ObjectBuilder.add(barrel); + return true; + } + }); + break; + + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("barrel dialogue")}; + } + + } + + /** + * The use with handler for the bedabin anvil. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BedabinAnvilHandler extends UseWithHandler { + + /** + * Constructs a new {@code BedabinAnvilHandler} {@code Object}. + */ + public BedabinAnvilHandler() { + super(2349); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(2672, OBJECT_TYPE, this); + PluginManager.definePlugin(new PrototypeDartHandler()); + PluginManager.definePlugin(new BedabinAnvilDialogue()); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + if (quest.getStage(player) == 54 && player.getInventory().containsItem(TouristTrap.TECHNICAL_PLANS)) { + player.getDialogueInterpreter().open("bedabin-anvil"); + return true; + } else { + player.getPacketDispatch().sendMessage("You need technical plans in order to do this."); + } + return true; + } + + /** + * The handler used to handle the anna barrel on the winch. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class AnnaWinchHandler extends UseWithHandler { + + /** + * Constructs a new {@code AnnaWinchHandler} {@code Object}. + */ + public AnnaWinchHandler() { + super(TouristTrap.ANNA_BARREL.getId()); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(18951, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest(TouristTrap.NAME); + if (!event.getUsedWith().getLocation().equals(Location.create(3292, 9423, 0))) { + return false; + } + if (quest.getStage(player) == 70) { + player.getDialogueInterpreter().open("winch dialogue", true); + return true; + } + return false; + } + + } + + /** + * The prototype dart creation handler. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class PrototypeDartHandler extends UseWithHandler { + + /** + * Constructs a new {@code PrototypeDartHandler} {@code Object}. + */ + public PrototypeDartHandler() { + super(314); + } + + @Override + public Plugin newInstance(Object arg) { + addHandler(TouristTrap.PROTOTYPE_DART_TIP.getId(), ITEM_TYPE, this); + PluginManager.definePlugin(new ProtoTypeDialogue()); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.getDialogueInterpreter().open("prototype dart"); + return true; + } + + /** + * The prototype dialogue plugin. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class ProtoTypeDialogue extends DialoguePlugin { + + /** + * The feathers item. + */ + private static final Item FEATHERS = new Item(314, 10); + + /** + * Constructs a new {@code ProtoTypeDialogue} {@code Object}. + * + * @param player the player. + */ + public ProtoTypeDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code ProtoTypeDialogue} {@code Object}. + */ + public ProtoTypeDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ProtoTypeDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (!player.getInventory().containsItem(FEATHERS)) { + interpreter.sendDialogue("You need 10 feathers in order to do this."); + stage = 10; + return false; + } + interpreter.sendItemMessage(314, "You try to attach feathers to the bronze dart tip."); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + interpreter.sendDialogue("Following the plans is tricky, but you persevere."); + stage++; + break; + case 2: + interpreter.sendItemMessage(TouristTrap.PROTOTYPE_DART, "You successfully attach the feathers to the dart tip."); + stage++; + break; + case 3: + player.getInventory().remove(FEATHERS, TouristTrap.PROTOTYPE_DART_TIP); + player.getInventory().add(TouristTrap.PROTOTYPE_DART); + end(); + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("prototype dart")}; + } + + } + } + + /** + * The bedabin dialogue plugin handler. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BedabinAnvilDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BedabinAnvilDialogue} {@code Object}. + */ + public BedabinAnvilDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BedabinAnvilDialogue} {@code Object}. + * + * @param player the player. + */ + public BedabinAnvilDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BedabinAnvilDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (!player.getInventory().containsItem(TouristTrap.TECHNICAL_PLANS)) { + player.getPacketDispatch().sendMessage("You need the plans to do this."); + return false; + } + player.getDialogueInterpreter().sendItemMessage(TouristTrap.TECHNICAL_PLANS, "Do you want to follow the technical plans ?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes. I'd like to try.", "No, not just yet."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + end(); + player.getPulseManager().run(new ProtoTypePulse(player)); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + /** + * The skill pulse used to make a prototype dart. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class ProtoTypePulse extends SkillPulse { + + /** + * The hammer item. + */ + private static final Item HAMMER = new Item(2347); + + /** + * The ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code ProtoTypePulse} {@code Object}. + * + * @param player the player. + */ + public ProtoTypePulse(Player player) { + super(player, null); + } + + @Override + public boolean checkRequirements() { + if (!player.getInventory().hasSpaceFor(TouristTrap.PROTOTYPE_DART_TIP)) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return false; + } + if (!player.getInventory().containsItem(HAMMER)) { + player.getPacketDispatch().sendMessage("You need a hammer in order to work metal with."); + return false; + } + return player.getInventory().containsItem(Bar.BRONZE.getProduct()); + } + + @Override + public void animate() { + if (ticks % 4 == 0) { + player.animate(Animation.create(898)); + } + } + + @Override + public boolean reward() { + if (++ticks % 4 != 0) { + return false; + } + if (ticks == 4) { + player.getDialogueInterpreter().sendPlainMessage(true, "You begin experimenting in forging the weapon..."); + } else if (ticks == 8) { + player.getInventory().remove(Bar.BRONZE.getProduct()); + player.getInventory().add(TouristTrap.PROTOTYPE_DART_TIP); + player.getDialogueInterpreter().sendItemMessage(TouristTrap.PROTOTYPE_DART_TIP, "You follow the plans carefully, and after some careful", "work, you finally manage to forge a sharp, pointed...", "dart tip."); + return true; + } + return false; + } + + @Override + public void stop() { + super.stop(); + } + + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("bedabin-anvil")}; + } + + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/AlmeraDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/AlmeraDialogue.java new file mode 100644 index 000000000..6c05aa308 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/AlmeraDialogue.java @@ -0,0 +1,149 @@ +package core.game.content.quest.members.waterfallquest; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Handles Almera's Dialogue for the Waterfall Quest. + * @author Splinter + */ +public class AlmeraDialogue extends DialoguePlugin { + + public AlmeraDialogue() { + + } + + public AlmeraDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("almera_dialogue"), 304 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest(WaterFall.NAME); + switch (stage) { + /* Main dialogue sequence */ + case 0: + if (quest.getStage(player) == 0) { + interpreter.sendDialogues(304, FacialExpression.ASKING, "Ah, hello there. Nice to see an outsider for a change,", "are you busy? I have a problem."); + stage = 1; + } else if (quest.getStage(player) == 10) { + interpreter.sendDialogues(304, FacialExpression.JOLLY, "Hello brave adventurer, have you seen my boy yet?"); + stage = 200; + } else if (quest.getStage(player) >= 20) { + interpreter.sendDialogues(304, FacialExpression.JOLLY, "Well hello, you're still around then."); + stage = 202; + } else { + + } + break; + case 1: + interpreter.sendOptions("Select an Option", "I'm afraid I'm in a rush.", "How can I help?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm afraid I am in a rush."); + stage = 99; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How can I help?"); + stage = 3; + break; + } + break; + case 3: + interpreter.sendDialogues(304, FacialExpression.DISGUSTED, "It's my son Hudon, he's always getting to trouble, the", "boy's convinced there's hidden treasure in the river and", "I'm a bit worried about his safety, the poor lad can't", "even swim."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I could go and take a look for you if you like?"); + stage = 5; + break; + case 5: + interpreter.sendDialogues(304, FacialExpression.DISGUSTED, "Would you? You are kind. You can use the small raft", "out back if you wish, do be careful, the current down", "stream is very strong."); + quest.start(player); + stage = 100; + break; + case 6: + interpreter.sendDialogues(304, FacialExpression.HALF_GUILTY, "Perhaps you can speak to Hadley a further bit down", "south for more information on how to find the treasure."); + stage = 100; + break; + case 7: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I did it, I found the treasure under the waterfall!"); + stage = 8; + break; + case 8: + interpreter.sendDialogues(304, FacialExpression.HALF_GUILTY, "Ah, very well done, adventurer!", "My boy Hudon was searching for that treasure too."); + stage = 9; + break; + case 9: + interpreter.sendDialogues(304, FacialExpression.HALF_GUILTY, "Maybe you could share it with him, he's just a boy."); + stage = 10; + break; + case 10: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "On second thought, I really have to go."); + stage = 100; + break; + + case 99: + interpreter.sendDialogues(304, FacialExpression.HALF_GUILTY, "Oh okay, never mind."); + stage = 100; + break; + case 100: + end(); + break; + case 200: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm afraid not, but I'm sure he hasn't gone far."); + stage = 201; + break; + case 201: + interpreter.sendDialogues(304, FacialExpression.HALF_GUILTY, "I do hope so, you can't be too careful these days."); + stage = 100; + break; + case 202: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I saw Hudon by the river but he refused to come back", "with me."); + stage = 203; + break; + case 203: + interpreter.sendDialogues(304, FacialExpression.HALF_GUILTY, "Yes he told me, the foolish lad came in drenched to the", "bone, he had fallen into the waterfall, lucky he wasn't", "killed! Now he can spend the rest of the summer in his", "room."); + stage = 204; + break; + case 204: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Any ideas on what I could do while I'm here?"); + stage = 205; + break; + case 205: + interpreter.sendDialogues(304, FacialExpression.HALF_GUILTY, "Why don't you visit the tourist centre south of the", "waterfall?"); + stage = 100; + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AlmeraDialogue(player); + } + + @Override + public boolean open(Object... args) { + final Quest quest = player.getQuestRepository().getQuest(WaterFall.NAME); + if (quest.getStage(player) == 100) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello Almera."); + stage = 7; + } else { + interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "Hello."); + stage = 0; + } + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/BookOnBaxtorianPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/BookOnBaxtorianPlugin.java new file mode 100644 index 000000000..b6577572b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/BookOnBaxtorianPlugin.java @@ -0,0 +1,122 @@ +package core.game.content.quest.members.waterfallquest; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.book.Book; +import core.game.content.dialogue.book.BookLine; +import core.game.content.dialogue.book.Page; +import core.game.content.dialogue.book.PageSet; +import core.game.node.entity.player.Player; + +/** + * Handles the book on Baxtorian that nobody will read. + * @author Splinter + */ +public final class BookOnBaxtorianPlugin extends Book { + + /** + * Represents the book id + */ + public static int ID = 183764; + + /** + * Represents the array of pages for this book. + */ + private static final PageSet[] PAGES = new PageSet[] { + new PageSet( + new Page( + new BookLine("The missing relics", 55), new BookLine("", 56), new BookLine(" Many artefacts of", 57), new BookLine("elven history were lost", 58), + new BookLine("after the fourth age. The", 59), new BookLine("greatest loss to our", 60), new BookLine("collections of elf history", 61), + new BookLine("were the hidden treasures", 62), new BookLine("of Baxtorian.", 63), new BookLine(" Some believe these", 64), new BookLine("treasures are still", 65)), + new Page( + new BookLine("unclaimed, but it is more", 66), new BookLine("commonly believed that", 67), new BookLine("dwarf miners recovered", 68), + new BookLine("the treasure at the", 69), new BookLine("beginning of the third", 70), new BookLine("age. Another great loss", 71), new BookLine("was Glarial's pebble, a key", 72), + new BookLine("which allowed her family", 73), new BookLine("to visit her tomb.", 74), new BookLine(" The stone was taken", 75), new BookLine("by a gnome family over a", 76))), + new PageSet( + new Page( + new BookLine("century ago. It is", 55), new BookLine("believed that the gnomes'", 56), new BookLine("descendant Golrie still has", 57), new BookLine("the stone hidden in the", 58), + new BookLine("caves under the gnome", 59), new BookLine("tree village.", 60), new BookLine("", 61), new BookLine("The sonnet of Baxtorian", 62), new BookLine("", 63), + new BookLine("The love between", 64), new BookLine("Baxtorian and Glarial was", 65)), new Page(new BookLine("said to have lasted over a", 66), new BookLine("century. They lived a", 67), + new BookLine("peaceful life learning and", 68), new BookLine("teaching the laws of", 69), new BookLine("nature. When Baxtorian's", 70), new BookLine("kingdom was invaded by", 71), + new BookLine("the dark forces he left on", 72), new BookLine("a five year campaign. He", 73), new BookLine("returned to find his", 74), new BookLine("people slaughtered and his", 75), + new BookLine("wife taken by the enemy.", 76))), + new PageSet( + new Page( + new BookLine(" After years of", 55), new BookLine("searching for his love he", 56), + new BookLine("finally gave up and", 57), new BookLine("returned to the home he", 58), new BookLine("made for Glarial under", 59), new BookLine("the Baxtorian Waterfall.", 60), + new BookLine("Once he entered he", 61), new BookLine("never returned. Only", 62), new BookLine("Glarial had the power to", 63), new BookLine("also enter the waterfall.", 64), + new BookLine(" Since Baxtorian", 65)), + new Page(new BookLine("entered no one but her", 66), new BookLine("can follow him in, it's as if", 67), new BookLine("the powers of nature still", 68), new BookLine("work to protect him.", 69), + new BookLine("", 70), new BookLine("The power of nature", 71), new BookLine("", 72), new BookLine(" Glarial and Baxtorian", 73), new BookLine("were masters of nature.", 74), + new BookLine("Trees would grow, hills", 75), new BookLine("form and rivers flood on", 76))), + new PageSet( + new Page( + new BookLine("their command. Baxtorian", 55), new BookLine("in particular had", 56), new BookLine("perfected rune lore. It", 57), new BookLine("was said that he could", 58), + new BookLine("uses the stones to control", 59), new BookLine("water, earth, and air.", 60), new BookLine("", 61), new BookLine("Ode to eternity", 62), new BookLine("", 63), + new BookLine("A short piece written by", 64), new BookLine("Baxtorian himself.", 65)), + new Page(new BookLine("", 66), new BookLine("What care I for this", 67), new BookLine("mortal coil,", 68), new BookLine("where treasures are yet", 69), + new BookLine("so frail,", 70), new BookLine("for it is you that is my", 71), new BookLine("life blood,", 72), new BookLine("the wine to my holy grail", 73), + new BookLine("and if I see the", 74), new BookLine("judgement day,", 75), new BookLine("when the gods fill the air", 76))), + new PageSet( + new Page( + new BookLine("with dust,", 55), new BookLine("I'll happily choke on your", 56), new BookLine("memory,", 57), new BookLine("as my kingdom turns to", 58), new BookLine("rust", 59))), + + }; + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public BookOnBaxtorianPlugin(final Player player) { + super(player, "Book On Baxtorian", 260, PAGES); + } + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public BookOnBaxtorianPlugin() { + /** + * empty. + */ + } + + @Override + public void finish() { + if (player.getQuestRepository().getQuest(WaterFall.NAME).getStage(player) == 20) { + player.getQuestRepository().getQuest(WaterFall.NAME).setStage(player, 30); + } + } + + @Override + public void display(Page[] set) { + player.lock(); + player.getInterfaceManager().open(getInterface()); + player.getPacketDispatch().sendString("Previous", getInterface().getId(), 77); + player.getPacketDispatch().sendString("Next", getInterface().getId(), 78); + if (player.getQuestRepository().getQuest(WaterFall.NAME).getStage(player) == 20) { + player.getQuestRepository().getQuest(WaterFall.NAME).setStage(player, 30); + } + for (int i = 55; i < 77; i++) { + player.getPacketDispatch().sendString("", getInterface().getId(), i); + } + player.getPacketDispatch().sendString(getName(), getInterface().getId(), 6); + for (Page page : set) { + for (BookLine line : page.getLines()) { + player.getPacketDispatch().sendString(line.getMessage(), getInterface().getId(), line.getChild()); + } + } + boolean lastPage = index == sets.length - 1; + if (lastPage) { + finish(); + } + player.unlock(); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BookOnBaxtorianPlugin(player); + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/GolrieDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/GolrieDialogue.java new file mode 100644 index 000000000..d78137290 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/GolrieDialogue.java @@ -0,0 +1,97 @@ +package core.game.content.quest.members.waterfallquest; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Handles Golrie's Dialogue for the Waterfall quest + * @author Splinter + */ +public class GolrieDialogue extends DialoguePlugin { + + public GolrieDialogue() { + + } + + public GolrieDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("golrie_dialogue"), 306 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 100: + end(); + break; + + /* Main dialogue sequence */ + case 0: + interpreter.sendDialogues(306, FacialExpression.OLD_NORMAL, "That's me. I've been stuck in here for weeks, those", "goblins are trying to steal my family's heirlooms. My", "grandad gave me all sorts of old junk."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.ASKING, "Do you mind if I have a look?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(306, FacialExpression.OLD_HAPPY, "No, of course not."); + stage = 3; + break; + case 3: + //TODO: Possibly change this to chat message + interpreter.sendDialogue("You look amongst the junk on the floor."); + stage = 4; + break; + case 4: + //TODO: Possibly change this to chat message + interpreter.sendDialogue("Mixed with the junk on the floor you find Glarial's pebble."); + stage = 5; + break; + case 5: + //TODO: Possibly change to HAPPY + interpreter.sendDialogues(player, FacialExpression.ASKING, "Could I take this old pebble?"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(306, FacialExpression.OLD_NORMAL, "Oh that, yes have it, it's just some old elven junk I", "believe."); + player.getInventory().add(new Item(294, 1)); + stage = 7; + break; + case 7: + //TODO: Possibly change this to chat message + interpreter.sendDialogue("You give the key to Golrie."); + stage = 8; + break; + case 8: + interpreter.sendDialogues(306, FacialExpression.OLD_HAPPY, "Thanks a lot for the key traveller. I think I'll wait in", "here until those goblins get bored and leave."); + player.getInventory().remove(new Item(293, 1)); + stage = 9; + break; + case 9: + interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "OK... Take care Golrie."); + stage = 100; + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GolrieDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "Hello, is your name Golrie?"); + stage = 0; + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/HadleyDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/HadleyDialogue.java new file mode 100644 index 000000000..aca74c1e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/HadleyDialogue.java @@ -0,0 +1,80 @@ +package core.game.content.quest.members.waterfallquest; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; + +/** + * Handles Almera's Dialogue for the Waterfall Quest. + * @author Splinter + */ +public class HadleyDialogue extends DialoguePlugin { + + public HadleyDialogue() { + + } + + public HadleyDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("hadley_dialogue"), 302 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 100: + end(); + break; + + /* Main dialogue sequence */ + case 0: + if (player.getInventory().contains(292, 1)) { + interpreter.sendDialogues(302, FacialExpression.HALF_GUILTY, "I hope you're enjoying your stay, there should be lots", "of useful information in that book: places to go, people to", "see."); + stage = 100; + } else { + interpreter.sendDialogues(302, FacialExpression.HALF_GUILTY, "Are you on holiday? If so you've come to the right", "place. I'm Hadley the tourist guide, anything you need", "to know just ask me. We have some of the most unspoilt", "wildlife and scenery in " + GameWorld.getSettings().getName() + "."); + stage = 1; + } + break; + case 1: + interpreter.sendDialogues(302, FacialExpression.HALF_GUILTY, "People come from miles around to fish in the clear lakes", "or to wander the beautiful hill sides."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "It is quite pretty."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(302, FacialExpression.HALF_GUILTY, "Surely pretty is an understatement kind Sir. Beautiful,", "amazing or possibly life-changing would be more suitable", "wording. Have you seen the Baxtorian waterfall?", "Named after the elf king who was buried underneath."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Thanks then, goodbye."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(302, FacialExpression.HALF_GUILTY, "Enjoy your visit."); + stage = 100; + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HadleyDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there."); + stage = 0; + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/HudonDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/HudonDialogue.java new file mode 100644 index 000000000..cebc27e7c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/HudonDialogue.java @@ -0,0 +1,122 @@ +package core.game.content.quest.members.waterfallquest; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; + +/** + * Handles Hudon's Dialogue for the Waterfall Quest. + * @author Splinter + */ +public class HudonDialogue extends DialoguePlugin { + + public HudonDialogue() { + + } + + public HudonDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("hudon_dialogue"), 305 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest(WaterFall.NAME); + switch (stage) { + + case 100: // Generic end to the dlg + end(); + break; + case 101: // Generic end to the dlg + player.getPacketDispatch().sendMessage("Hudon is refusing to leave the waterfall."); + end(); + break; + + /* Main dialogue sequence */ + case 0: + if (quest.getStage(player) == 10) { + interpreter.sendDialogues(305, FacialExpression.CHILD_NORMAL, "It looks like you need the help."); + stage = 1; + } + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Your mum sent me to find you."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(305, FacialExpression.CHILD_NORMAL, "Don't play nice with me, I know you're looking for the", "treasure too."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where is this treasure you talk of?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(305, FacialExpression.CHILD_SUSPICIOUS, "Just because I'm small doesn't mean I'm dumb! If I", "told you, you would take it all for yourself."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Maybe I could help."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(305, FacialExpression.CHILD_NORMAL, "I'm fine alone."); + quest.setStage(player, 20); + stage = 101; + break; + case 20: + interpreter.sendDialogues(305, FacialExpression.CHILD_NORMAL, "I'll find that treasure soon, just you wait and see."); + if (quest.getStage(player) == 100) { + stage = 21; + } else { + stage = 100; + } + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I hate to break it to you kid, but I found the treasure."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(305, FacialExpression.CHILD_NORMAL, "Wha- are you serious? Are you going to at least share?"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(305, FacialExpression.CHILD_NORMAL, "Aww, come on... I helped you find it.", "This isn't fair!"); + stage = 25; + break; + case 25: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Life ain't fair kid."); + stage = 100; + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HudonDialogue(player); + } + + @Override + public boolean open(Object... args) { + final Quest quest = player.getQuestRepository().getQuest(WaterFall.NAME); + if (quest.getStage(player) >= 20) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "So you're still here."); + stage = 20; + } else { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello son, are you okay? You need help?"); + stage = 0; + } + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/WaterFall.java b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/WaterFall.java new file mode 100644 index 000000000..4c078204a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/WaterFall.java @@ -0,0 +1,91 @@ +package core.game.content.quest.members.waterfallquest; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.PluginManager; + +/** + * The main type for the waterfall quest. + * @author Splinter + */ +@Initializable +public class WaterFall extends Quest { + + /** + * The name of this quest. + */ + public static final String NAME = "Waterfall"; + + /** + * Constructs a new {@code WaterFall} {@code Object}. + */ + public WaterFall() { + super("Waterfall", 65, 64, 1, 65, 0, 1, 10); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + line(player, "I can start this quest by speaking to Almera in her house next to the Baxtorian Falls.I need to be able to fight Level 84 Giants.", 12); + break; + case 10: + line(player, "I spoke to Almera in a house close to the Baxtorianwaterfall. Her son was missing so I offered to help findhim. The boy, Hudon's looking for treasure in the waterfall.", 12); + break; + case 20: + line(player, "I spoke to Almera in a house close to the Baxtorianwaterfall. Her son was missing so I offered to help findhim. The boy, Hudon's looking for treasure in the waterfall.I found Hudon a short raft ride down the river. He isconvinced there is treasure here somewhere. Maybe Ineed to do a little research.", 12); + break; + case 30: + if (player.getInventory().containsItem(new Item(294, 1))) { + line(player, "I spoke to Almera in a house close to the Baxtorianwaterfall. Her son was missing so I offered to help findhim. The boy, Hudon's looking for treasure in the waterfall.I found Hudon a short raft ride down the river. He isconvinced there is treasure here somewhere. Maybe Ineed to do a little research.I found a book in the tourist office about Baxtorian. Thebook tells of a sad love story about 2 elf lovers. It endswith Baxtorian withdrawing to his home under the waterfallafter his wife dies. It is told that only Glarial could entertheir home.The book also mentions Glarial's tomb and a pebble, itappears that the pebble is used to enter the tomb.From what I understand Glarial's pebble was hidden in a cave under the Tree Gnome Village by Golrie's ancestors.", 12); + } else { + line(player, "I spoke to Almera in a house close to the Baxtorianwaterfall. Her son was missing so I offered to help findhim. The boy, Hudon's looking for treasure in the waterfall.I found Hudon a short raft ride down the river. He isconvinced there is treasure here somewhere. Maybe Ineed to do a little research.I found a book in the tourist office about Baxtorian. Thebook tells of a sad love story about 2 elf lovers. It endswith Baxtorian withdrawing to his home under the waterfallafter his wife dies. It is told that only Glarial could entertheir home.The book also mentions Glarial's tomb and a pebble, itappears that the pebble is used to enter the tomb.From what I understand Glarial's pebble was hidden in a cave under the Tree Gnome Village by Golrie's ancestors.", 12); + } + if (player.getInventory().containsItem(new Item(295, 1)) || player.getEquipment().containsAtLeastOneItem(295)) { + line(player, "I spoke to Almera in a house close to the Baxtorianwaterfall. Her son was missing so I offered to help findhim. The boy, Hudon's looking for treasure in the waterfall.I found Hudon a short raft ride down the river. He isconvinced there is treasure here somewhere. Maybe Ineed to do a little research.I found a book in the tourist office about Baxtorian. Thebook tells of a sad love story about 2 elf lovers. It endswith Baxtorian withdrawing to his home under the waterfallafter his wife dies. It is told that only Glarial could entertheir home.The book also mentions Glarial's tomb and a pebble, itappears that the pebble is used to enter the tomb.From what I understand Glarial's pebble was hidden in a cave under the Tree Gnome Village by Golrie's ancestors.Inside the tomb I found Glarial's amulet and ashes.", 12); + } + if (player.getLocation().getY() >= 9902) { + line(player, "I spoke to Almera in a house close to the Baxtorianwaterfall. Her son was missing so I offered to help findhim. The boy, Hudon's looking for treasure in the waterfall.I found Hudon a short raft ride down the river. He isconvinced there is treasure here somewhere. Maybe Ineed to do a little research.I found a book in the tourist office about Baxtorian. Thebook tells of a sad love story about 2 elf lovers. It endswith Baxtorian withdrawing to his home under the waterfallafter his wife dies. It is told that only Glarial could entertheir home.The book also mentions Glarial's tomb and a pebble, itappears that the pebble is used to enter the tomb.From what I understand Glarial's pebble was hidden in a cave under the Tree Gnome Village by Golrie's ancestors.Inside the tomb I found Glarial's amulet and ashes.I finally got access to the derelict home of Baxtorian. Thedoor must have been keyed to Glarial's amulet.I have found a room containing the Chalice of Eternity. Thechalice is suspended in midair just out of reach.", 12); + } + break; + case 100: + line(player, "I spoke to Almera in a house close to the Baxtorianwaterfall. Her son was missing so I offered to help findhim. The boy, Hudon's looking for treasure in the waterfall.I found Hudon a short raft ride down the river. He isconvinced there is treasure here somewhere. Maybe Ineed to do a little research.I found a book in the tourist office about Baxtorian. Thebook tells of a sad love story about 2 elf lovers. It endswith Baxtorian withdrawing to his home under the waterfallafter his wife dies. It is told that only Glarial could entertheir home.The book also mentions Glarial's tomb and a pebble, itappears that the pebble is used to enter the tomb.From what I understand Glarial's pebble was hidden in a cave under the Tree Gnome Village by Golrie's ancestors.Inside the tomb I found Glarial's amulet and ashes.I finally got access to the derelict home of Baxtorian. Thedoor must have been keyed to Glarial's amulet.I have found a room containing the Chalice of Eternity. Thechalice is suspended in midair just out of reach. Using Glarial's ashes as a counterweight, I was able toremove the treasure that had been left in the chalice.QUEST COMPLETE!", 12); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getQuestRepository().syncronizeTab(player); + player.getConfigManager().set(101, player.getQuestRepository().getPoints()); + + player.getPacketDispatch().sendString("1 Quest Point", 277, 8+ 2); + player.getPacketDispatch().sendString("13,750 Strength XP", 277, 9+ 2); + player.getPacketDispatch().sendString("13,750 Attack XP", 277, 10+ 2); + player.getPacketDispatch().sendString("2 diamonds", 277, 11+ 2); + player.getPacketDispatch().sendString("2 gold bars", 277, 12+ 2); + player.getPacketDispatch().sendString("40 Mithril seeds", 277, 13+ 2); + player.getPacketDispatch().sendString("You have completed the Waterfall Quest!", 277, 2+ 2); + player.getPacketDispatch().sendItemZoomOnInterface(1601, 230, 277, 3+ 2); + player.getSkills().addExperience(Skills.STRENGTH, 13750); + player.getSkills().addExperience(Skills.ATTACK, 13750); + player.getInventory().add(new Item(1601, 2));// diamonds + player.getInventory().add(new Item(2357, 2));// gold bars + player.getInventory().add(new Item(299, 40));// seeds + + setStage(player, 100); + player.getQuestRepository().syncronizeTab(player); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugins(new AlmeraDialogue(), new BookOnBaxtorianPlugin(), new GolrieDialogue(), new HadleyDialogue(), new HudonDialogue(), new WaterfallPlugin(), new WaterfallTreeDialogue()); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/WaterfallPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/WaterfallPlugin.java new file mode 100644 index 000000000..fe73e5399 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/WaterfallPlugin.java @@ -0,0 +1,571 @@ +package core.game.content.quest.members.waterfallquest; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Master plugin file for the Waterfall quest. + * + * This is one of the most disgusting files I have ever seen. -Ceikry + * + * @author Splinter + * @version 1.0 - Feb 28th, 2015 + */ +public final class WaterfallPlugin extends OptionHandler { + + /** + * The rope + */ + public final static Item ROPE = new Item(954); + + /** + * The first ket + */ + public final static Item KEY = new Item(293); + + /** + * The second key + */ + public final static Item KEY_2 = new Item(298); + + /** + * The glarial's pebble + */ + public final static Item PEBBLE = new Item(294); + + /** + * The glarial's amulet + */ + public final static Item AMULET = new Item(295); + + /** + * The glarial's urn + */ + public final static Item URN = new Item(296); + + /** + * The glarial's urn + */ + public final static Item URN_EMPTY = new Item(297); + + /** + * Air rune + */ + public final static Item AIR_RUNE = new Item(556, 6); + + /** + * Water rune + */ + public final static Item WATER_RUNE = new Item(555, 6); + + /** + * Earth rune + */ + public final static Item EARTH_RUNE = new Item(557, 6); + + /** + * The swimmer swimming. + */ + private static final List SWIMMERS = new ArrayList<>(); + + /** + * The ropes. + */ + private static final List ROPES = new ArrayList<>(); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new WaterfallUseWithHandler()); + NPCDefinition.forId(305).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(1987).getHandlers().put("option:board", this); + ObjectDefinition.forId(2020).getHandlers().put("option:climb", this); + ObjectDefinition.forId(2022).getHandlers().put("option:get in", this); + ObjectDefinition.forId(10283).getHandlers().put("option:swim", this); + ObjectDefinition.forId(1996).getHandlers().put("option:swim to", this); + ObjectDefinition.forId(1989).getHandlers().put("option:search", this); + ObjectDefinition.forId(1990).getHandlers().put("option:search", this); + ObjectDefinition.forId(1991).getHandlers().put("option:open", this); + ObjectDefinition.forId(37247).getHandlers().put("option:open", this); + ObjectDefinition.forId(32711).getHandlers().put("option:open", this); + ObjectDefinition.forId(33046).getHandlers().put("option:open", this); + ObjectDefinition.forId(42313).getHandlers().put("option:open",this); + ObjectDefinition.forId(33047).getHandlers().put("option:search", this); + ObjectDefinition.forId(33047).getHandlers().put("option:close", this); + ObjectDefinition.forId(33066).getHandlers().put("option:search", this); + ObjectDefinition.forId(1999).getHandlers().put("option:search", this); + ObjectDefinition.forId(42319).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(2002).getHandlers().put("option:open", this); + ObjectDefinition.forId(1992).getHandlers().put("option:read", this); + ObjectDefinition.forId(2014).getHandlers().put("option:take treasure", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final int id = node.getId(); + final Quest quest = player.getQuestRepository().getQuest(WaterFall.NAME); + if (quest == null) { + player.sendMessage("Error! Waterfall quest cannot be found."); + return true; + } + switch (id) { + case 37247: + player.getPacketDispatch().sendMessage("The door opens..."); + player.getPulseManager().run(new Pulse(2, player) { + @Override + public boolean pulse() { + if ((player.getEquipment().containsAtLeastOneItem(295) || player.getInventory().contains(295, 1)) || player.getQuestRepository().isComplete("Waterfall")) { + player.getPacketDispatch().sendMessage("You walk through the door."); + player.teleport(new Location(2575, 9861)); + } else { + player.getPacketDispatch().sendMessage("The cave floods and washes you away!"); + player.teleport(new Location(2527, 3413)); + } + return true; + } + }); + break; + case 1992: + player.lock(16); + player.getPacketDispatch().sendMessage("The grave is covered in elven script.", 1); + player.getPacketDispatch().sendMessage("Some of the writing is in common tongue, it reads:", 3); + player.getPacketDispatch().sendMessage("Here lies Glarial, wife of Baxtorian,", 6); + player.getPacketDispatch().sendMessage("true friend of nature in life and death.", 9); + player.getPacketDispatch().sendMessage("May she now rest knowing", 12); + player.getPacketDispatch().sendMessage("only visitors with peaceful intent can enter.", 15); + break; + case 2014: + if (quest.getStage(player) != 100) { + player.getPacketDispatch().sendMessage("The cavern floods!"); + player.lock(6); + player.getPulseManager().run(new Pulse(5, player) { + @Override + public boolean pulse() { + player.teleport(new Location(2566, 9901)); + player.getPacketDispatch().sendMessage("You are washed out of the chalice room."); + player.removeAttribute("waterfall_placed_runes"); + return true; + } + }); + } else { + player.getPacketDispatch().sendMessage("You have already looted the treasure."); + } + break; + case 1999:// Second key (in the actual waterfall dungeon) + if (player.getInventory().contains(298, 1) || quest.getStage(player) < 30) { + player.getPacketDispatch().sendMessage("You search the crate and find nothing."); + } else if (quest.getStage(player) >= 30 && !player.getInventory().contains(298, 1)) { + player.getPacketDispatch().sendMessage("You find a large key."); + player.getInventory().add(new Item(298, 1)); + } + break; + case 2002:// + if (player.getLocation().equals(new Location(2568, 9893))) { + player.getPacketDispatch().sendMessage("The door is locked."); + } else if (node.getLocation().equals(new Location(2566, 9901)) || player.getLocation().equals(new Location(2568, 9894, 0))) { + if (quest.getStage(player) >= 100 && node.getLocation().equals(new Location(2566, 9901)) && player.getLocation().equals(new Location(2566, 9901))) { + player.teleport(new Location(2604, 9901)); + } else { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } + } + if (node.getLocation().equals(new Location(2604, 9900))) { + player.teleport(new Location(2566, 9901)); + player.removeAttribute("waterfall_placed_runes"); + } + break; + case 33046: + ObjectBuilder.add(new GameObject(33047, Location.create(2530, 9844, 0), 10, 1)); + break; + case 42319: + if (node.getLocation().equals(new Location(2556, 9844))) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(2557, 3444, 0)); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + } + break; + case 33047: + switch (option) { + case "open": + case "search": + if (quest.getStage(player) >= 30) { + if (!player.hasItem(new Item(295))) { + player.getPacketDispatch().sendMessage("You search the chest and find a small amulet."); + player.getInventory().add(new Item(295, 1)); + } else { + player.getPacketDispatch().sendMessage("You search the chest and find nothing."); + } + } + break; + case "close": + ObjectBuilder.add(new GameObject(33046, Location.create(2530, 9844, 0), 10, 1)); + break; + } + break; + case 33066: + if (quest.getStage(player) >= 30) { + if (!player.getInventory().contains(296, 1)) { + player.getPacketDispatch().sendMessage("You search the coffin and inside you find an urn full of ashes."); + player.getInventory().add(new Item(296, 1)); + } else { + player.getPacketDispatch().sendMessage("You search the coffin and find nothing."); + } + } + break; + case 32711: + player.teleport(new Location(2511, 3463)); + break; + case 2020: + player.getDialogueInterpreter().open("waterfall_tree_dialogue", 0); + break; + case 305: + player.getDialogueInterpreter().open(305, ((NPC) node)); + break; + case 1990: + if (player.getInventory().contains(293, 1) || quest.getStage(player) < 30) { + player.getPacketDispatch().sendMessage("You search the crate and find nothing."); + } else if (quest.getStage(player) >= 30 && !player.getInventory().contains(293, 1)) { + player.getPacketDispatch().sendMessage("You find a large key."); + player.getInventory().add(new Item(293, 1)); + } + break; + case 1991: + if (player.getLocation().getY() >= 9576) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + player.getPacketDispatch().sendMessage("You open the gate and walk through."); + } else if (player.getInventory().contains(293, 1) && player.getLocation().getY() < 9576) { + player.getPacketDispatch().sendMessage("The gate is locked. You need to use the key on the door to enter."); + } else { + player.getDialogueInterpreter().sendDialogues(306, FacialExpression.HALF_GUILTY, "Hello? Ah yes, the door is still locked.", "If you want to get in here, you'll need to find the key", "that I hid in some crates in the eastern room."); + } + break; + case 1989: + if (player.getInventory().contains(292, 1) || quest.getStage(player) != 20) { + player.getPacketDispatch().sendMessage("You search the bookcase and find nothing of interest."); + break; + } else if (!player.hasItem(new Item(292)) && quest.getStage(player) == 20) { + player.getInventory().add(new Item(292, 1)); + player.getPacketDispatch().sendMessage("You search the bookcase and find a book named 'Book on Baxtorian'"); + } + break; + case 10283: + case 1996: + player.addExtension(LogoutTask.class, new LocationLogoutTask(10, player.getLocation())); + player.getPacketDispatch().sendGraphic(68); + player.lock(6); + AgilityHandler.walk(player, -1, player.getLocation(), new Location(2512, 3471, 0), Animation.create(164), 0, null); + player.getPacketDispatch().sendMessage("It looks like a long distance, but you swim out into the water."); + player.getPacketDispatch().sendMessage("The current is too strong, you feel yourself being pulled under", 3); + player.getPulseManager().run(new Pulse(6, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("You are washed downstream but feel lucky to be alive."); + player.teleport(new Location(2527, 3413)); + return true; + } + }); + break; + case 2022:// Barrel + player.getPacketDispatch().sendMessage("You get in the barrel and start rocking."); + player.getPacketDispatch().sendMessage("The barrel falls off the ledge."); + player.teleport(new Location(2527, 3413)); + break; + case 1987:// Raft + if (quest.getStage(player) >= 10) { + player.getPacketDispatch().sendMessage("You board the small raft", 2); + player.lock(13); + player.getPacketDispatch().sendMessage("and push off down stream.", 6); + player.getPacketDispatch().sendMessage("The raft is pulled down stream by strong currents", 9); + player.getPulseManager().run(new Pulse(12, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("You crash into a small land mound."); + player.teleport(new Location(2512, 3481)); + return true; + } + }); + } else { + player.getDialogueInterpreter().sendDialogue("You have no reason to board this raft."); + } + return true; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof NPC) { + NPC npc = ((NPC) n); + if (npc.getId() == 305) { + return Location.create(2512, 3481, 0); + } + } + if (n instanceof GameObject) { + GameObject obj = ((GameObject) n); + if (obj.getId() == 1996 || obj.getId() == 1997) { + return Location.create(2512, 3476, 0); + } + } + return null; + } + + @Override + public boolean isWalk(Player player, Node node) { + return !(node instanceof Item); + } + + @Override + public boolean isWalk() { + return false; + } + + public void handleObjects(boolean add, final Player player) {// very ugly + // code + if (add) { + ROPES.add(new GameObject(1997, Location.create(2512, 3468, 0), 10, 0)); + ROPES.add(new GameObject(1998, Location.create(2512, 3469, 0), 10, 0)); + ROPES.add(new GameObject(1998, Location.create(2512, 3470, 0), 10, 0)); + ROPES.add(new GameObject(1998, Location.create(2512, 3471, 0), 10, 0)); + ROPES.add(new GameObject(1998, Location.create(2512, 3472, 0), 10, 0)); + ROPES.add(new GameObject(1998, Location.create(2512, 3473, 0), 10, 0)); + ROPES.add(new GameObject(1998, Location.create(2512, 3474, 0), 10, 0)); + ROPES.add(new GameObject(1998, Location.create(2512, 3475, 0), 10, 0)); + for (GameObject rope : ROPES) { + ObjectBuilder.add(rope); + } + } else { + for (GameObject rope : ROPES) { + ObjectBuilder.remove(rope); + } + ROPES.clear(); + ObjectBuilder.add(new GameObject(1996, Location.create(2512, 3468, 0), 10, 0)); + + } + } + + /** + * Handles the runestone graphic. + * @param player the player. + */ + public void playRunestoneGraphics(final Player player) { + player.getPacketDispatch().sendGlobalPositionGraphic(580, new Location(2562, 9914)); + player.getPacketDispatch().sendGlobalPositionGraphic(580, new Location(2562, 9912)); + player.getPacketDispatch().sendGlobalPositionGraphic(580, new Location(2562, 9910)); + player.getPacketDispatch().sendGlobalPositionGraphic(580, new Location(2569, 9914)); + player.getPacketDispatch().sendGlobalPositionGraphic(580, new Location(2569, 9912)); + player.getPacketDispatch().sendGlobalPositionGraphic(580, new Location(2569, 9910)); + } + + /** + * Handles using items on objects for the quest. + * @author Splinter + */ + public class WaterfallUseWithHandler extends UseWithHandler { + + private final int[] OBJECTS = new int[] { 1996, 1997, 2020, 1991, 1992, 2002, 2006, 2014, 2004 }; + + /** + * Constructs a new {@Code WaterfallUseWithItemHandler} {@Code + * Object} + */ + public WaterfallUseWithHandler() { + super(ROPE.getId(), KEY.getId(), PEBBLE.getId(), KEY_2.getId(), AMULET.getId(), URN.getId(), AIR_RUNE.getId(), EARTH_RUNE.getId(), WATER_RUNE.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : OBJECTS) { + addHandler(id, OBJECT_TYPE, this); + } + return this; + } + + @Override + public Location getDestination(Player playa, Node n) { + if (n instanceof GameObject) { + GameObject obj = (GameObject) n; + if (obj.getId() == 1996 || obj.getId() == 1997) { + return Location.create(2512, 3476, 0); + } + } + return null; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + Item useditem = event.getUsedItem(); + final Quest quest = player.getQuestRepository().getQuest(WaterFall.NAME); + final GameObject object = (GameObject) event.getUsedWith(); + + if (useditem.getId() == ROPE.getId() && object.getId() == 1996 || object.getId() == 1997) { + player.lock(8); + player.animate(Animation.create(774)); + SWIMMERS.add(player); + if (SWIMMERS.size() == 0 || ROPES.size() == 0) { + handleObjects(true, player); + } + player.addExtension(LogoutTask.class, new LocationLogoutTask(13, player.getLocation())); + player.getPulseManager().run(new Pulse(2, player) { + @Override + public boolean pulse() { + player.faceLocation(new Location(2512, 3468, 0)); + AgilityHandler.walk(player, -1, player.getLocation(), new Location(2512, 3469, 0), Animation.create(273), 0, null); + player.getPulseManager().run(new Pulse(8, player) { + @Override + public boolean pulse() { + player.teleport(new Location(2513, 3468)); + player.faceLocation(new Location(2512, 3468, 0)); + player.animate(Animation.create(780)); + return true; + } + + @Override + public void stop() { + super.stop(); + if (SWIMMERS.remove(player) && SWIMMERS.size() == 0) { + handleObjects(false, player); + } + } + }); + return true; + } + }); + } + + if (useditem.getId() == ROPE.getId() && object.getId() == 2020) { + player.getPacketDispatch().sendMessage("You tie the rope to the tree and let yourself down on the ledge."); + player.teleport(new Location(2511, 3463)); + } + + if (useditem.getId() == KEY.getId() && object.getId() == 1991) { + player.getPacketDispatch().sendMessage("The key fits the gate."); + player.getPacketDispatch().sendMessage("You open the gate and walk through."); + DoorActionHandler.handleAutowalkDoor(player, object); + } + + if (useditem.getId() == KEY_2.getId() && object.getId() == 2002 && !object.getLocation().equals(new Location(2566, 9901))) { + player.getPacketDispatch().sendMessage("You open the door and walk through."); + DoorActionHandler.handleAutowalkDoor(player, object); + } + + if (useditem.getId() == PEBBLE.getId() && object.getId() == 1992 && ItemDefinition.canEnterEntrana(player)) { + player.getPacketDispatch().sendMessage("You place the pebble in the gravestone's small indent."); + player.getPacketDispatch().sendMessage("It fits perfectly."); + player.getPacketDispatch().sendMessage("You hear a loud creak.", 4); + player.getPacketDispatch().sendMessage("The stone slab slides back revealing a ladder down.", 7); + player.getPacketDispatch().sendMessage("You climb down to an underground passage.", 12); + player.getPulseManager().run(new Pulse(13, player) { + @Override + public boolean pulse() { + player.getSkills().setPrayerPoints(0); + player.teleport(new Location(2555, 9844)); + return true; + } + }); + } else if (!ItemDefinition.canEnterEntrana(player) && useditem.getId() == PEBBLE.getId() && object.getId() == 1992) { + player.getPacketDispatch().sendMessage("You place the pebble in the gravestone's small indent."); + player.getPacketDispatch().sendMessage("It fits perfectly."); + player.getPacketDispatch().sendMessage("But nothing happens.", 4); + } + + if ((useditem.getId() == AIR_RUNE.getId() || useditem.getId() == EARTH_RUNE.getId() || useditem.getId() == WATER_RUNE.getId()) && object.getId() == 2004) { + if (player.getInventory().contains(555, 6) && player.getInventory().contains(556, 6) && player.getInventory().contains(557, 6)) { + if (player.getAttribute("waterfall_placed_runes") != null) { + player.getPacketDispatch().sendMessage("You have already placed the runes on the pillars."); + return false; + } + playRunestoneGraphics(player); + player.getPacketDispatch().sendMessage("You place one of each runestone on all six of the pillars."); + player.setAttribute("waterfall_placed_runes", 1); + player.getInventory().remove(new Item(AIR_RUNE.getId(), 6)); + player.getInventory().remove(new Item(EARTH_RUNE.getId(), 6)); + player.getInventory().remove(new Item(WATER_RUNE.getId(), 6)); + } else { + player.getPacketDispatch().sendMessage("You do not have enough runestones to place on the pillars."); + } + } + + if (useditem.getId() == AMULET.getId() && object.getId() == 2006 && quest.getStage(player) != 100 && !player.getLocation().equals(new Location(2603, 9914))) { + if (player.getAttribute("waterfall_placed_runes") == null) { + player.getPacketDispatch().sendMessage("You place the amulet around the neck of the statue."); + player.lock(4); + player.getPulseManager().run(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendGraphic(74); + player.getImpactHandler().manualHit(player, 20, HitsplatType.NORMAL); + player.getPacketDispatch().sendMessage("Rocks fall from the ceiling and hit you in the head."); + return true; + } + }); + } else if (player.getAttribute("waterfall_placed_runes") != null) { + player.lock(7); + player.getInventory().remove(AMULET); + player.getPacketDispatch().sendMessage("You place the amulet around the neck of the statue."); + player.getPacketDispatch().sendMessage("You hear a loud rumble from beneath...", 3); + player.getPacketDispatch().sendMessage("The ground raises up before you!", 6); + player.getPulseManager().run(new Pulse(6, player) { + @Override + public boolean pulse() { + player.teleport(new Location(2603, 9914)); + return true; + } + }); + } + } + + if (useditem.getId() == URN.getId() && object.getId() == 2014 && quest.getStage(player) != 100) { + if (player.getInventory().freeSlots() < 5) { + player.getPacketDispatch().sendMessage("You'll need 5 free inventory slots to take Glarial's treasure."); + return false; + } else { + player.lock(10); + player.getInventory().remove(URN); + player.getInventory().add(URN_EMPTY); + player.getPacketDispatch().sendMessage("You carefully pour the ashes into the chalice"); + player.getPacketDispatch().sendMessage("as you remove the Treasure of Baxtorian", 3); + player.getPacketDispatch().sendMessage("The chalice remains standing.", 6); + player.getPacketDispatch().sendMessage("Inside you find a mithril case", 6); + player.getPacketDispatch().sendMessage("containing 40 seeds,", 6); + player.getPacketDispatch().sendMessage("two diamonds and two gold bars.", 6); + player.getPulseManager().run(new Pulse(8, player) { + @Override + public boolean pulse() { + quest.finish(player); + return true; + } + }); + + } + } + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/WaterfallTreeDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/WaterfallTreeDialogue.java new file mode 100644 index 000000000..1b7bd1271 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/waterfallquest/WaterfallTreeDialogue.java @@ -0,0 +1,80 @@ +package core.game.content.quest.members.waterfallquest; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the dialogue for the tree on the edge of the Waterfall. + * @author Splinter + */ +public class WaterfallTreeDialogue extends DialoguePlugin { + + public WaterfallTreeDialogue() { + + } + + public WaterfallTreeDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("waterfall_tree_dialogue") }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + + case 100: // Generic end to the dlg + end(); + break; + + /* Main dialogue sequence */ + case 0: + player.getDialogueInterpreter().sendOptions("Select an Option", "Climb down anyway", "Back away"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + player.getPacketDispatch().sendMessage("You climb down the tree"); + player.animate(new Animation(828)); + player.getPulseManager().run(new Pulse(4, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("and lose your grip."); + player.getPacketDispatch().sendMessage("You get washed away in the current."); + player.teleport(new Location(2527, 3413)); + player.getImpactHandler().manualHit(player, 8, HitsplatType.NORMAL); + return true; + } + }); + break; + case 2: + player.getDialogueInterpreter().sendDialogue("You leave the tree alone."); + stage = 100; + break; + } + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WaterfallTreeDialogue(player); + } + + @Override + public boolean open(Object... args) { + player.getDialogueInterpreter().sendDialogue("It would be difficult to get down this tree without using a rope", "on it first."); + stage = 0; + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/AnnaJonesDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/AnnaJonesDialogue.java new file mode 100644 index 000000000..e0537c678 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/AnnaJonesDialogue.java @@ -0,0 +1,270 @@ +package core.game.content.quest.members.whatliesbelow; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Handles the anna jones dialogue. + * @author Vexia + */ +public class AnnaJonesDialogue extends DialoguePlugin { + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@Code AnnaJonesDialogue} {@Code Object} + */ + public AnnaJonesDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code AnnaJonesDialogue} {@Code Object} + * @param player the player. + */ + public AnnaJonesDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AnnaJonesDialogue(player); + } + + @Override + public boolean open(Object... args) { + quest = player.getQuestRepository().getQuest(WhatLiesBelow.NAME); + switch (quest.getStage(player)) { + default: + if (args.length >= 2) { + npc("Excuse me. I am working on that statue at the moment", "Please don't touch it."); + stage = 50; + break; + } + npc("Yes? Can I help you?"); + break; + case 30: + npc("Ah. You must be " + player.getUsername() + ", right? I have a bronze", "pickaxe here for you."); + break; + case 40: + if (args.length >= 2) { + npc("You did it! oh, well done! How exciting!"); + stage = 10; + break; + } + npc("You opened the tunnel; well done!"); + stage++; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + switch (stage) { + case 0: + options("Who are you?", "What are you doing here?", "Who does this statue represent?", "Okay, I'd better go."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("What are you doing here?"); + stage = 30; + break; + case 3: + player("Who does this statue represent?"); + stage = 20; + break; + case 4: + player("Okay, I'd better go."); + stage = 40; + break; + } + break; + case 10: + npc("Well, now. Do you always go around asking about people", "like that? It's very rude, you know."); + stage++; + break; + case 11: + player("Sorry! I didn't mean to pry!"); + stage++; + break; + case 12: + npc("That's alright. My name is Louisiana Jones, although", "most people call me Anna. I'm an archaeologist."); + stage++; + break; + case 13: + player("Oh. Do you work for the Varrock Museum?"); + stage++; + break; + case 14: + npc("Hah! No. I used to, but now I prefer to work", "freelance for independent employers."); + stage++; + break; + case 15: + player("I see."); + stage++; + break; + case 16: + end(); + break; + case 20: + npc("That, my dear, is the statue of the great god Saradomin", "himself. Stand and admire in awe, for you are in the", "presence of greatness!"); + stage++; + break; + case 21: + end(); + break; + case 30: + npc("I'm investigating something for someone."); + stage++; + break; + case 31: + player("That doesn't really explain anything!"); + stage++; + break; + case 32: + npc("I never said it would."); + stage++; + break; + case 33: + end(); + break; + case 40: + end(); + break; + case 50: + player("You are? But you're just sitting there."); + stage++; + break; + case 51: + npc("Yes. I'm on a break."); + stage++; + break; + case 52: + player("Oh, I see. When does your break finish?"); + stage++; + break; + case 53: + npc("When I decide to start working again. Right now, I'm", "enjoying sitting on this bench."); + stage++; + break; + case 54: + end(); + break; + } + break; + case 30: + switch (stage) { + case 0: + if (!player.getInventory().contains(1265, 1)) { + player.getInventory().add(new Item(1265), player); + player("Thank you very much!"); + stage++; + } else { + player("Thanks, but I already have one."); + stage = 1; + } + break; + case 1: + npc("My employer, Surok Magis, sent word to me that you", "may come to use the tunnel. You will need something to", "help you get in there. The pickaxe will help."); + stage++; + break; + case 2: + player("Uh, thanks."); + stage++; + break; + case 3: + npc("Okay, then. The tunnel awaits..."); + stage++; + break; + case 4: + options("What tunnel?", "Sorry, who are you?", "Who does this statue represent?", "What are you doing here?", "Okay, I'd better go."); + stage++; + break; + case 5: + switch (buttonId) { + case 1: + player("What tunnel?"); + stage = 10; + break; + case 2: + player("Sorry, who are you?"); + stage = 20; + break; + case 3: + player("Who does this statue represent?"); + stage = 30; + break; + case 4: + player("What are you doing here?"); + stage = 40; + break; + case 5: + player("Okay, I'd better go."); + stage = 50; + break; + } + break; + case 10: + npc("Why, the Chaos Tunnel of course! I imagine Surok will", "have told you of it."); + stage = 41; + break; + case 20: + npc("My name is Louisiana Jones, although most people", "call me Anna. I'm an archaeologist."); + stage = 41; + break; + case 30: + npc("That, my dear, is the statue of the great god Saradomin", "himself. Stand and admire in awe for you are in the", "presence of greatness!"); + stage = 41; + break; + case 40: + npc("Well story and rumour has it that Dagon'hai built a", "tunnel under this statue of Saradomin that would allow", "them to visit the Chaos Altar without having to go", "through the Wilderness."); + stage++; + break; + case 41: + end(); + break; + case 50: + end(); + break; + } + break; + case 40: + switch (stage) { + case 1: + end(); + break; + case 10: + player("Right, well, I better see what's down there, then."); + stage++; + break; + case 11: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5837 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/KingRoaldNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/KingRoaldNPC.java new file mode 100644 index 000000000..41b20c1ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/KingRoaldNPC.java @@ -0,0 +1,83 @@ +package core.game.content.quest.members.whatliesbelow; + +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; + +/** + * Handles the king roald npc. + * @author Vexia + */ +public class KingRoaldNPC extends AbstractNPC { + + /** + * The cutscene. + */ + private WLBelowCutscene cutscene; + + /** + * Constructs a new {@Code KingRoaldNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public KingRoaldNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@Code KingRoaldNPC} {@Code Object} + */ + public KingRoaldNPC() { + super(-1, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new KingRoaldNPC(id, location); + } + + @Override + public void checkImpact(BattleState state) { + int lp = getSkills().getLifepoints(); + if (state.getEstimatedHit() > -1) { + if (lp - state.getEstimatedHit() < 1) { + state.setEstimatedHit(0); + if (lp > 1) { + state.setEstimatedHit(lp - 1); + } + } + } + if (state.getSecondaryHit() > -1) { + if (lp - state.getSecondaryHit() < 1) { + state.setSecondaryHit(0); + if (lp > 1) { + state.setSecondaryHit(lp - 1); + } + } + } + int totalHit = state.getEstimatedHit() + state.getSecondaryHit(); + if (lp - totalHit < 1) { + state.setEstimatedHit(0); + state.setSecondaryHit(0); + } + if (lp <= 1 && !getAttribute("message", false)) { + setAttribute("message", true); + cutscene.getPlayer().sendMessage("Now would be a good time to summon Zaff!"); + ; + } + } + + /** + * Sets the cutscene. + * @param cutscene the cutscene. + */ + public void setCutscene(WLBelowCutscene cutscene) { + this.cutscene = cutscene; + } + + @Override + public int[] getIds() { + return new int[] { 5838 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/OutlawNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/OutlawNPC.java new file mode 100644 index 000000000..8fda7be09 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/OutlawNPC.java @@ -0,0 +1,62 @@ +package core.game.content.quest.members.whatliesbelow; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.world.map.Location; + +/** + * Handles the outlaw npc. + * @author adam + */ +public class OutlawNPC extends AbstractNPC { + + /** + * Constructs a new {@Code OutlawNPC} {@Code Object} + */ + public OutlawNPC() { + super(-1, null); + } + + /** + * Constructs a new {@Code OutlawNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public OutlawNPC(int id, Location location) { + super(id, location); + } + + @Override + public void onAttack(Entity e) { + sendChat("Stand and deliver!"); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + Player p = killer.asPlayer(); + Quest quest = p.getQuestRepository().getQuest(WhatLiesBelow.NAME); + if (quest.getStage(p) == 10) { + int amount = p.getInventory().getAmount(WhatLiesBelow.RATS_PAPER) + p.getBank().getAmount(WhatLiesBelow.RATS_PAPER); + if (amount < 5) { + GroundItemManager.create(WhatLiesBelow.RATS_PAPER, getLocation()); + } + } + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new OutlawNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 5842, 5843, 5844, 5845, 5846, 5847, 5848, 5849, 5850, 5852 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.java new file mode 100644 index 000000000..e5e3d5ad5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/RatBurgissDialogue.java @@ -0,0 +1,614 @@ +package core.game.content.quest.members.whatliesbelow; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * The rat burgiss dialogue. + * + * @author Vexia + */ +public class RatBurgissDialogue extends DialoguePlugin { + + /** + * The achievement diary. + */ + private AchievementDiary diary; + + /** + * The quest. + */ + private Quest quest; + + /** + * If we're chatting about our diary. + */ + private boolean isDiary; + + private final int level = 0; + + /** + * Constructs a new {@Code RatBurgissDialogue} {@Code Object} + * + * @param player the player. + */ + public RatBurgissDialogue(Player player) { + super(player); + } + + /** + * + */ + public RatBurgissDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RatBurgissDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(WhatLiesBelow.NAME); + options("Hello there!", "I have a question about my Achievement Diary."); + stage = -1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (isDiary) { + // https://www.youtube.com/watch?v=j-wvq79hUgU&t=309s + switch (stage) { + case 999: + end(); + break; + case -1: + // when available, "Can I change my Varrock teleport point?" is option 2 + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage++; + break; + case 0: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); + } + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 410; + break; + case 2: + player("What are the rewards?"); + stage = 420; + break; + case 3: + player("How do I claim the rewards?"); + stage = 430; + break; + case 4: + player("See you later."); + stage = 999; + break; + } + break; + case 440: + npc("You have? Excellent! Well done."); + stage++; + break; + case 441: + player("Thank you. Uh... can I have the reward?"); + stage++; + break; + case 442: + npc("Reward? Ah yes! Of course. Your reward, it's right", "here."); + stage = 444; + break; + case 444: + diary.setLevelRewarded(level); + for (Item i : diary.getType().getRewards(level)) { + player.getInventory().add(i, player); + } + npc("Now, this body armour is magically enhanced to help", "you with your Smithing and Mining. There is a", "furnace, not far from here, in Edgeville. Use this", "armour there and, when smelting ores up to and"); + stage++; + break; + case 445: + npc("including steel, you will have a chance of making an", "extra bar every time. Also, when you mine with this", "armour on, you will have a chance of Mining extra", "ores from rocks up to and including coal."); + stage++; + break; + case 446: + npc("Bear in mind that you will need to be wearing the", "armour for either of these to work. I will speak to the", "shopkeepers around Varrock who sell armour and", "weapons to get you better prices when you are wearing"); + stage++; + break; + case 447: + npc("the Varrock armour."); + stage = 449; + break; + case 449: + npc("I can also change your Varrock Teleport spell so that it", "takes you to the Grand Exchange, if you'd find that more convenient."); + stage++; + break; + case 450: + npc("As an extra reward, you can also have this old magical", "lamp to help you with your skills. I was going to use it", "myself, but I don't really need it."); + stage++; + break; + case 451: + player("Wow, thanks!"); + stage++; + break; + case 452: + npc("If you should lose this armour, come back and see me", "for another set."); + stage = -1; + break; + + case 460: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("You better be more careful this time."); + stage = 999; + break; + + case 410: + npc("It's a diary that helps you keep track of particular", "achievements. Here in Varrock it can help you", "discover some quite useful things. Eventually, with", "enough exploration, the people of Varrock will reward"); + stage++; + break; + case 411: + npc("you."); + stage++; + break; + case 412: + npc("You can see what tasks you have listed by clicking on", "the green button in the Quest List."); + stage = 999; + break; + case 420: + npc("Well, there's three different levels of Varrock Armour,", "which match up with the three levels of difficulty. Each", "has the same rewards as the previous level, and an", "additional one too... but I won't spoil your surprise."); + stage++; + break; + case 421: + npc("Rest assured, the people of Varrock are happy to see", "you visiting the land."); + stage = 999; + break; + case 430: + npc("Just complete the tasks so they're all ticked off, then", "you can claim your reward. Most of them are", "straightforward; you might find some require quests to", "be started, if not finished."); + stage++; + break; + case 431: + npc("To claim the different Varrock Armour, speak to Vannaka", "Reldo, and myself."); + stage = 999; + break; + } + return true; + } + if (stage == -1) { + switch (buttonId) { + case 1: + player("Hello there!"); + stage = 5; + break; + case 2: + player("I have a question about my Achievement Diary."); + stage = 900; + break; + } + return true; + } + if (stage == 900) { + sendDiaryDialogue(); + return true; + } + switch (quest.getStage(player)) { + case 0: + switch (stage) { + /* + * case 0: interpreter.sendDialogues(npc, FacialExpression.NORMAL, + * "Oh, hello. I'd love to chat right now, but I'm a bit busy.", + * "Perhaps you could come back and chat another time?"); stage = 1; + * break; case 1: interpreter.sendDialogues(player, + * FacialExpression.NORMAL, "Of course. Sorry to bother you!"); + * stage = 2; break; case 2: interpreter.sendDialogues(npc, + * FacialExpression.NORMAL, + * "No problem! Say, have you been to see the wizard's", + * "tower in the south yet? It's an amazing sight! you", + * "should go and see it!"); stage = 3; break; case 3: + * interpreter.sendDialogues(player, FacialExpression.NORMAL, + * "Thanks! I will!"); stage = 4; break; case 4: end(); break; + */ + case 5: + npc("Oh, hello. I'm Rat."); + stage++; + break; + case 6: + player("You're a what?"); + stage++; + break; + case 7: + npc("No, no. My name is Rat. Rat Burgiss."); + stage++; + break; + case 8: + player("Ohhhhh, well, what's up, Ratty?"); + stage++; + break; + case 9: + npc("It's Rat, thank you. And I, uh..heh...I seem to", "be in a bit of trouble here, as", "you can probably see."); + stage++; + break; + case 10: + player("Why, what seems to be the matter?"); + stage++; + break; + case 11: + npc("Well, I'm a trader by nature and I was on the way to", "Varrock with my cart here when I was set upon by", "outlaws! They ransacked my cart and stole", "some very important papers that I must get back."); + stage++; + break; + case 12: + player("Shall I get them back for you?"); + stage++; + break; + case 13: + npc("You mean you want to help?"); + stage++; + break; + case 14: + player("Of course! Tell me what you need me to do."); + stage++; + break; + case 15: + npc("Right, now I heard those outlaws say something about", "having a small campsite somewhere to the west of the", "Grand Exchange. They headed off to the north-west of", "here, taking five pages with them."); + stage++; + break; + case 16: + npc("Kill the outlaws and get those papers back from them for", "me. Here's a folder in which you can put the", "pages. Be careful, though; those outlaws are tough."); + stage++; + break; + case 17: + npc("When you find all 5 pages, put them back in the folder", "and bring them back to me!"); + stage++; + break; + case 18: + player("Don't worry, Ratty! I won't let you down!"); + stage++; + break; + case 19: + npc("..."); + stage++; + break; + case 20: + quest.start(player); + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + npc("Hello again! How are things going?"); + stage++; + break; + case 1: + if (player.getInventory().containsItem(WhatLiesBelow.FULL_FOLDER)) { + player("I got your pages back!"); + stage = 5; + break; + } + if (!player.hasItem(WhatLiesBelow.EMPTY_FOLDER) && !player.hasItem(WhatLiesBelow.USED_FOLDER) && !player.hasItem(WhatLiesBelow.FULL_FOLDER)) { + player("I lost the folder you gave me. Do you have another", "one?"); + stage = 3; + break; + } else { + player("Good!"); + } + stage++; + break; + case 2: + end(); + break; + case 3: + player.getInventory().add(WhatLiesBelow.EMPTY_FOLDER); + npc("Sure. Here you go. I'll add it to your account."); + stage++; + break; + case 4: + end(); + break; + case 5: + npc("Excellent! I knew you could help! Let me take", "those from you, there."); + stage++; + break; + case 6: + npc("Now, I liked the way you handled yourself on that last", "little 'mission' I gave you there, so I'm going to let", "you in on a little secret!"); + stage++; + break; + case 7: + player("Wait! Wait! Let me guess! You're a actually a rich prince", "in disguise who wants to help poor people", "like me!?"); + stage++; + break; + case 8: + npc("Uhhh...no. No, that's not it. You know, on second thought. I", "think I'll keep my secret for now. Look, instead", "you can do another job for me."); + stage++; + break; + case 9: + player("All work and no play makes " + player.getUsername() + " a dull adventurer!"); + stage++; + break; + case 10: + npc("Yes, well, I'm sure that may be the case. However, what", "I want you to do is take this letter to someone", "for me. It's in a different language so, trust me you", "won't be able to read it."); + stage++; + break; + case 11: + npc("Take it to a wizard named Surok Magis who resides in", "the Varrock Palace Library. I'll see about some sort of", "reward for your work when I get myself sorted out here."); + stage++; + break; + case 12: + player("Letter. Wizard. Varrock. Library. Got it!"); + stage++; + break; + case 13: + npc("Yes, good luck then."); + stage++; + break; + case 14: + player.getInventory().remove(WhatLiesBelow.FULL_FOLDER); + player.getInventory().add(WhatLiesBelow.RATS_LETTER); + quest.setStage(player, 20); + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + npc("Ah, hello. How is your task going?"); + stage++; + break; + case 1: + if (!player.hasItem(WhatLiesBelow.RATS_LETTER)) { + player("I think I lost that letter you gave me!"); + stage = 3; + break; + } + player("Good!"); + stage++; + break; + case 2: + end(); + break; + case 3: + npc("Goodness me! Not much of a messenger, are you? Here's", "another one; try not to lose it this time! I've charged the", "parchment to your account."); + stage++; + break; + case 4: + player("Will you take cheque?"); + stage++; + break; + case 5: + npc("No thanks. I prefer tartan."); + stage++; + break; + case 6: + if (!player.getInventory().contains(WhatLiesBelow.RATS_LETTER.getId(), 1)) { + player.getInventory().add(WhatLiesBelow.RATS_LETTER, player); + } + end(); + break; + } + break; + default: + end(); + break; + case 50: + switch (stage) { + case 0: + npc("Ah, " + player.getUsername() + "! You've returned!"); + stage++; + break; + case 1: + if (!player.getInventory().containsItem(WhatLiesBelow.SUROKS_LETTER)) { + player("I'm still searching!"); + stage = 2; + break; + } + player("Yes! I have a letter for you."); + stage = 3; + break; + case 2: + end(); + break; + case 3: + npc("A letter for me? Let me see."); + stage++; + break; + case 4: + if (player.getInventory().containsItem(WhatLiesBelow.SUROKS_LETTER)) { + npc("This letter is treasonous! This does indeed confirm my", "worst fears. It is time I let you into my", "secret and hopefully this will answer any questions", "you may have."); + stage++; + } + break; + case 5: + player("Okay, go on."); + stage++; + break; + case 6: + npc("I am not really a trader. I am the Commander of", "the Varrock Palace Secret Guard, VPSG for short."); + stage++; + break; + case 7: + player("Okay, I had a feeling you weren't a real trader due to", "the fact that you had nothing to sell! So why", "the secrecy?"); + stage++; + break; + case 8: + npc("I'm just getting to that. A short while ago, we received", "word that Surok had discovered a powerful mind-control", "spell and intended to use it on King Roald himself!"); + stage++; + break; + case 9: + npc("He could control the whole kingdom that way!"); + stage++; + break; + case 10: + player("I think I can believe that. Surok's not the nicest", "person in Misthalin!"); + stage++; + break; + case 11: + npc("Yes, but until now, the spell has been useless to him", "as he is currently under guard at the palace and not", "allowed to leave. He could not get the tools for the spell", "because if he left the palace he would be arrested!"); + stage++; + break; + case 12: + player("Uh oh! I think I may have helped him by mistake, here.", "He promised me a big reward if I collected some items for", "him..but he said it was for a spell to make gold!"); + stage++; + break; + case 13: + npc("I assume you did not know of his plans; that is", "why you weren't arrested!"); + stage++; + break; + case 14: + player("Thank you! How can I help fix this mistake?"); + stage++; + break; + case 15: + npc("Okay, here's what I need you to do. One of my contacts", "has devised a spell that he is sure will be able to", "counteract the effects of the mind-control spell. I need", "you to visit him."); + stage++; + break; + case 16: + player("Okay, who is it?"); + stage++; + break; + case 17: + npc("His name is Zaff. He runs a staff shop in Varrock. Go", "and speak to him and he will tell you what you should", "do. I will send word to him to let him know that", "you are coming."); + stage++; + break; + case 18: + player("Yes, sir! I'm on my way!"); + stage++; + break; + case 19: + player.getInventory().remove(WhatLiesBelow.SUROKS_LETTER); + quest.setStage(player, 60); + end(); + break; + } + break; + case 60: + case 70: + switch (stage) { + case 0: + npc("Yes, " + player.getUsername() + "?"); + stage++; + break; + case 1: + player("Nevermind."); + stage++; + break; + case 2: + end(); + break; + } + break; + case 80: + case 90: + switch (stage) { + case 0: + npc("Well, " + player.getUsername() + ", how did it go?"); + stage++; + break; + case 1: + player("You should have been there! There was this...and Surok", "was like...and I was...and then King...and", "and...uh...ahem! The mission was accomplished and the", "king has been saved."); + stage++; + break; + case 2: + npc("I take it that it went alright, then? That's great news!"); + stage++; + break; + case 3: + npc("Zaff has already briefed me on the events. We will", "arrange for Surok to be fed and watched. I think he", "will not to be a problem any more."); + stage++; + break; + case 4: + player("You know, one thing bother's me. He's now stuck in the", "library, but wasn't that the reason we were in this mess", "in the first place?"); + stage++; + break; + case 5: + npc("Yes, you are right. But rest assured, we will be", "watching him much more closely from now on."); + stage++; + break; + case 6: + npc("You've done very well and have been a credit to the", "VPSG; perhaps one day there may be a place for you", "here!"); + stage++; + break; + case 7: + npc("In the meantime, let me reward you for what you've", "done. I will be sure to call on you if we ever need help", "in the future."); + stage++; + break; + case 8: + quest.finish(player); + end(); + break; + } + break; + case 100: + switch (stage) { + case 0: + npc("Ah, " + player.getUsername() + "! You did a fine service for us. You might", "make a good member of the VPSG one day. With a little", "training and a bit more muscle!"); + stage++; + break; + case 1: + end(); + break; + } + break; + } + return true; + } + + /** + * Sends the diary dialogue. + */ + private void sendDiaryDialogue() { + isDiary = true; + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); + } + if (diary.isComplete(level) && !diary.isLevelRewarded(level)) { + player("I think I've finished all of the tasks in my Varrock", "Achievement Diary."); + stage = 440; + return; + } + if (diary.isLevelRewarded(0) && diary.isComplete(level) && !player.hasItem(diary.getType().getRewards(level)[0])) { + player("I've seemed to have lost my armour..."); + stage = 460; + return; + } + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 0; + } + + @Override + public int[] getIds() { + return new int[]{5833}; + } + + /** + * Gets the isDiary. + * + * @return the isDiary + */ + public boolean isDiary() { + return isDiary; + } + + /** + * Sets the isDiary. + * + * @param isDiary the isDiary to set. + */ + public void setDiary(boolean isDiary) { + this.isDiary = isDiary; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.java b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.java new file mode 100644 index 000000000..e307fcf08 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/SurokMagisDialogue.java @@ -0,0 +1,528 @@ +package core.game.content.quest.members.whatliesbelow; + +import core.game.content.activity.ActivityManager; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the surok magis dialogue. + * @author Vexia + */ +public class SurokMagisDialogue extends DialoguePlugin { + + /** + * The quest instance. + */ + private Quest quest; + + /** + * The cutscene. + */ + private WLBelowCutscene cutscene; + + /** + * Constructs a new {@Code SurokMagisDialogue} {@Code Object} + */ + public SurokMagisDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code SurokMagisDialogue} {@Code Object} + * @param player the player. + */ + public SurokMagisDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SurokMagisDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest(WhatLiesBelow.NAME); + switch (quest.getStage(player)) { + default: + npc("Excuse me?"); + break; + case 20: + player("Hello."); + break; + case 30: + case 40: + npc("Ah! You're back. Have you found the things I need yet?"); + break; + case 50: + if (!player.hasItem(WhatLiesBelow.SUROKS_LETTER)) { + player("That letter was treasonous so I destroyed it!"); + stage = 10; + break; + } + player("This letter is treasonous! I'm going to report you to the", "king!"); + break; + case 60: + npc("Hi, " + player.getUsername() + "!"); + break; + case 70: + if (!player.getInventory().containsItem(WhatLiesBelow.BEACON_RING) && !player.getEquipment().containsItem(WhatLiesBelow.BEACON_RING)) { + player("I should probably get my beacon ring first..."); + stage = -1; + break; + } + if (args.length >= 2) { + cutscene = player.getAttribute("cutscene", null); + if (args.length == 3) { + player.getDialogueInterpreter().sendDialogues(cutscene.getZaff(), null, "Your teleport spell has been corrupted, Surok! I have", "placed a magic block on this room. You will remain here,", "under guard, in the library from now on."); + stage = 12; + return true; + } + interpreter.sendPlainMessage(true, "The room grows dark and you sense objects moving..."); + stage = 10; + break; + } + player("Surok!! Your plans have been uncovered! You are hereby", "under arrest on the authority of the Varrock Palace", "Secret Guard!"); + break; + case 80: + case 90: + case 100: + npc("You have foiled my plans, " + player.getUsername() + "... I obviously", "underestimated you."); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + default: + switch (stage) { + case 0: + player("What do you want? ...Oh, wait. I know! You're", "probably just like all the others, aren't you? After some", "fancy spell or potion from me, I bet!"); + stage = 1; + break; + case 1: + npc("No! at least, I don't think so. What sort of spells", "do you have?"); + stage = 2; + break; + case 2: + player("Hah! I knew it! I expect you want my Aphro-Dizzy-", "Yak spell! Want someone to fall madly in love with you,", "eh?"); + stage = 3; + break; + case 3: + npc("That spell sounds very interesting, but I didn't mean to", "disturb you!"); + stage = 4; + break; + case 4: + player("Well, I see that you do have some manners. I'm glad", "to see that you use them."); + stage = 5; + break; + case 5: + player("Now, if it's all the same, I am very bust at the", "moment. Come back another time", "please and thank you."); + stage = 6; + break; + case 6: + npc("Yes, of course!"); + stage = 7; + break; + case 7: + end(); + break; + } + break; + case 20: + switch (stage) { + case 0: + npc("Hah! Come for my Aphro-Dizzy-Yak spell! Want", "someone to fall madly in love with you eh? Not", "surprised with a face like that, to be honest!"); + stage++; + break; + case 1: + player("I didn't come here to be insulted!"); + stage++; + break; + case 2: + npc("Really? Well, with ears like that, you do surprise me!"); + stage++; + break; + case 3: + if (!player.getInventory().containsItem(WhatLiesBelow.RATS_LETTER)) { + player("Nevermind!"); + stage = 99; + break; + } + player("No, look. I have a letter for you."); + stage++; + break; + case 4: + npc("Really? Well then, let me see it!"); + stage++; + break; + case 5: + player("Here it is!"); + stage++; + break; + case 6: + npc.animate(Animation.create(6096)); + npc("Of all the luck!"); + stage++; + break; + case 7: + player("Why did you destroy the letter?"); + stage++; + break; + case 8: + npc("None of your business! It's a secret!"); + stage++; + break; + case 9: + player("Yes, there seems to be a lot of them going around at", "the moment."); + stage++; + break; + case 10: + npc("Of course. Hmmm. However, I could let you in on", "another secret, if you like?"); + stage++; + break; + case 11: + player("Go on, then!"); + stage++; + break; + case 12: + npc("My secret is this. I have been spending time here in", "the palace library trying to discover some ancient spells", "and magics."); + stage++; + break; + case 13: + npc("In my research, I have uncovered the most astounding", "spell that will allow me to transform simple clay into solid", "gold bars!"); + stage++; + break; + case 14: + npc("Now I am ready to use the spell to create all the gold", "I...uh...the city wants. I would gladly share this gold", "with you; I simply need a few more things."); + stage++; + break; + case 15: + player("Okay, what do you need?"); + stage++; + break; + case 16: + npc("I will only need a couple of items. The first is very", "simple: an ordinary bowl to use as a casting vessel."); + stage++; + break; + case 17: + npc("You should be able to find one of these at any local", "store here in Varrock. I would go myself but I", "am...uh...busy with my research."); + stage++; + break; + case 18: + npc("The other item is much harder. I need a metal wand", "infused with chaos magic."); + stage++; + break; + case 19: + player("How would I get something like that?"); + stage++; + break; + case 20: + npc("Take this metal wand. You will also need 15 chaos", "runes. When you get to the Chaos Altar, use the wand", "on the altar itself. This would infuse the runes into the", "wand."); + stage++; + break; + case 21: + player("How on earth do you know about Runecrafting? I", "thought only a few people knew of it."); + stage++; + break; + case 22: + npc("Hah! Don't presume to think that those wizards in their", "fancy towers are the only people to have heard of", "Runecrafting! Now pay attention!"); + stage++; + break; + case 23: + npc("You will need to have the 15 chaos runes in your", "inventory. Make sure you also have either a chaos", "talisman or chaos tiara to complete the infusion."); + stage++; + break; + case 24: + player("Where can I get a talisman or a tiara?"); + stage++; + break; + case 25: + npc("I'm afraid I don't know. You will need to research for", "one."); + stage++; + break; + case 26: + npc("Bring the infused wand and a bowl back to me and I", "will make us both rich!"); + stage++; + break; + case 27: + npc("One more thing. I have uncovered information here in", "the library which may be of use to you. It tells of a", "safe route to the Chaos Altar that avoids the Wilderness."); + stage++; + break; + case 28: + player("Great! What is it?"); + stage++; + break; + case 29: + npc("It is an old tome...a history book of sorts. It's", "somewhere here in the library. I forget where I left it,", "but it should be easy enough for you to find."); + stage++; + break; + case 30: + npc("I have also given you a copy of a diary", "I...uh...acquired. It may also help you to find that which", "you seek."); + stage++; + break; + case 31: + player.getInventory().remove(WhatLiesBelow.RATS_LETTER); + player.getInventory().add(WhatLiesBelow.WAND, player); + player.getInventory().add(WhatLiesBelow.SIN_KETH_DIARY, player); + quest.setStage(player, 30); + end(); + break; + case 99: + end(); + break; + } + break; + case 30: + case 40: + switch (stage) { + case 0: + if (player.getInventory().containsItem(WhatLiesBelow.INFUSED_WAND)) { + if (!player.getInventory().containsItem(WhatLiesBelow.BOWL)) { + player("No, I still need to get you a bowl."); + stage = 1; + break; + } + player("I have the things you wanted."); + stage = 6; + break; + } + if (!player.hasItem(WhatLiesBelow.WAND)) { + player("I lost the wand!"); + stage = 2; + break; + } + if (!player.hasItem(WhatLiesBelow.SIN_KETH_DIARY)) { + player("I lost the diary!"); + stage = 4; + break; + } + player("No not yet."); + stage++; + break; + case 1: + end(); + break; + case 2: + npc("Somehow, I knew that would happen so I have made a", "few spares for just such an occasion!"); + stage++; + break; + case 3: + npc("Here you are. Try not to lose this one!"); + player.getInventory().add(WhatLiesBelow.WAND, player); + stage = 1; + break; + case 4: + player.getInventory().add(WhatLiesBelow.SIN_KETH_DIARY, player); + npc("Here you are, Try not to lose this one!"); + stage = 5; + break; + case 5: + end(); + break; + case 6: + npc("Excellent! Well done! I knew that you would not let", "me down."); + stage++; + break; + case 7: + player("So...about this gold that you're going to", "give me?"); + stage++; + break; + case 8: + npc("All in good time. I must prepare the spell first", ", and that will take a little time. While I am", "doing that, please take this letter to Rat, the trader", "outside the city who sent you here."); + stage++; + break; + case 9: + player("Okay, but I'll be back for my gold."); + stage++; + break; + case 10: + npc("Yes, yes, yes. Now off you go!"); + stage++; + break; + case 11: + quest.setStage(player, 50); + player.getInventory().add(WhatLiesBelow.SUROKS_LETTER, player); + end(); + break; + } + break; + case 50: + switch (stage) { + case 0: + npc("Hah! Have fun with that!"); + stage++; + break; + case 1: + end(); + break; + case 10: + npc("Really? You destroyed it?"); + stage++; + break; + case 11: + player("Yes!"); + stage++; + break; + case 12: + npc("You want another one, don't you?"); + stage++; + break; + case 13: + player("Ah..uh..yes..yes, I do."); + stage++; + break; + case 14: + player.getInventory().add(WhatLiesBelow.SUROKS_LETTER, player); + npc("Fine. Here you are. And stop all this complaining; it's", "getting me down!"); + stage++; + break; + case 15: + end(); + break; + } + break; + case 60: + switch (stage) { + case 0: + player("You are a bad man!"); + stage++; + break; + case 1: + end(); + break; + } + break; + case 70: + switch (stage) { + case -1: + end(); + break; + case 0: + npc("So! You're with the Secret Guard, eh? I should have", "known! I knew you had ugly ears from the start...", "and your nose is too short!"); + stage++; + break; + case 1: + player("Give yourself up, Surok!"); + stage++; + break; + case 2: + npc("Never! I am Surok Magis, descendant of the High Elder", "Sin'keth Magis, rightful heir of the Dagon'hai Order! I will", "have my revenge on those who destroyed my people!"); + stage++; + break; + case 3: + player("The place is surrounded. There is nowhere to run!"); + stage++; + break; + case 4: + npc("Do you really wish to die so readily? Are you prepared", "to face your death?"); + stage++; + break; + case 5: + player("Bring it on!"); + stage++; + break; + case 6: + npc("I am Dagon'hai! I run from nothing. My spell has", "been completed and it is time for you to meet your", "end, " + player.getUsername() + "! The king is now under my control!"); + stage++; + break; + case 7: + end(); + ActivityManager.start(player, "What Lies below", false); + break; + case 10: + close(); + player.unlock(); + cutscene.getKing().unlock(); + cutscene.reset(); + player.getInterfaceManager().restoreTabs(); + cutscene.getKing().getProperties().getCombatPulse().attack(player); + stage = 11; + break; + case 11: + close(); + stage = 12; + break; + case 12: + player.lock(); + npc("No! All is lost! I must escape!"); + stage++; + break; + case 13: + interpreter.sendDialogues(cutscene.getZaff(), null, "You will not escape justice this time, Surok!"); + stage = 14; + break; + case 14: + npc("No! My plans have been ruined! I was so close to", "success!"); + stage = 16; + break; + case 16: + interpreter.sendDialogues(cutscene.getZaff(), null, "Thank you for your help, " + player.getUsername() + ". I will put the", "room back in order and then I must leave. Surok is", "defeated and will be no more trouble for us. We will", "guard him more closely from now on!"); + stage++; + break; + case 17: + quest.setStage(player, 80); + interpreter.sendPlainMessage(true, "The room grows dark and you sense objects moving..."); + cutscene.stop(true); + break; + } + break; + case 80: + case 90: + case 100: + switch (stage) { + case 0: + player("Yes. Let this be a lesson to you."); + stage++; + break; + case 1: + npc("..."); + stage++; + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public void end() { + if (cutscene != null) { + return; + } + super.end(); + } + + @Override + public int[] getIds() { + return new int[] { 5834, 5835 }; + } + + /** + * Gets the cutscene. + * @return the cutscene + */ + public WLBelowCutscene getCutscene() { + return cutscene; + } + + /** + * Sets the cutscene. + * @param cutscene the cutscene to set. + */ + public void setCutscene(WLBelowCutscene cutscene) { + this.cutscene = cutscene; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/WLBelowCutscene.java b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/WLBelowCutscene.java new file mode 100644 index 000000000..fdc35d34e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/WLBelowCutscene.java @@ -0,0 +1,352 @@ +package core.game.content.quest.members.whatliesbelow; + +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.build.DynamicRegion; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; + +/** + * Handles the what lies below cutscene. + * @author Vexia + */ +public class WLBelowCutscene extends CutscenePlugin { + + /** + * The surok npc. + */ + private NPC surok; + + /** + * The king. + */ + private NPC king; + + /** + * The zaff npc. + */ + private NPC zaff; + + /** + * Constructs a new {@Code WLBelowCutscene} {@Code Object} + */ + public WLBelowCutscene() { + super("What Lies below"); + } + + /** + * Constructs a new {@Code WLBelowCutscene} {@Code Object} + * @param player the player. + */ + public WLBelowCutscene(Player player) { + this(); + this.player = player; + this.setUid(getName().hashCode()); + } + + @Override + public boolean start(final Player player, boolean login, Object... args) { + player.lock(); + player.setAttribute("cutscene", this); + GameObject table = RegionManager.getObject(base.transform(9, 37, 0)); + if (table != null) { + ObjectBuilder.remove(table); + } + surok = NPC.create(5835, base.transform(8, 39, 0)); + surok.init(); + king = KingRoaldNPC.create(5838, base.transform(10, 34, 0)); + king.lock(); + ((KingRoaldNPC) king).setCutscene(this); + king.init(); + king.face(player); + surok.face(king); + player.face(surok); + player.getDialogueInterpreter().open(5834, surok, this); + return super.start(player, login, args); + } + + @Override + public void open() { + player.lock(); + sendCamera(0, -6, 0, 0, 500, 100); + surok.animate(Animation.create(1084)); + surok.graphics(Graphics.create(108)); + surok.sendChat("Annach Narh Hin Dei!"); + sendCamera(0, 3, 0, 0, 450, 95, 5); + king.animate(Animation.create(860), 7); + king.sendChat("What's going on?", 6); + king.sendChat("I...must...kill..." + player.getUsername() + "!!", 9); + player.sendChat("Uh oh! King Roald looks evil!", 13); + GameWorld.getPulser().submit(new Pulse(13) { + @Override + public boolean pulse() { + reset(); + player.face(king); + player.getDialogueInterpreter().sendDialogues(player, FacialExpression.ANNOYED, "Uh oh! King Roald looks evil!"); + return true; + } + }); + super.open(); + } + + @Override + public void end() { + super.end(); + player.removeAttribute("cutscene"); + player.getDialogueInterpreter().close(); + if (player.getDialogueInterpreter().getDialogue() != null) { + player.getDialogueInterpreter().getDialogue().end(); + } + } + + @Override + public boolean interact(Entity entity, Node target, Option option) { + if (entity instanceof Player) { + switch (target.getId()) { + case 5835: + if (player.getAttribute("can-arrest", false)) { + Location loc = base.transform(9, 34, 0); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, loc.getX(), loc.getY(), 450, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, loc.getX(), loc.getY(), 450, 1, 100)); + zaff.face(surok); + surok.face(zaff); + player.lock(); + surok.animate(Animation.create(1084)); + surok.sendChat("Mirra din namus!!", 1); + player.sendMessage("Surok looks like he's trying to teleport away!"); + zaff.sendChat("Stop!!", 3); + surok.sendChat("Nooooooooooooo!", 6); + GameWorld.getPulser().submit(new Pulse(3, player) { + + @Override + public boolean pulse() { + surok.animate(Animation.create(6098)); + zaff.animate(Animation.create(1819)); + Projectile.magic(zaff, surok, 109, 60, 36, 36, 10).send(); + return true; + } + + }); + GameWorld.getPulser().submit(new Pulse(9, player) { + + @Override + public boolean pulse() { + player.getDialogueInterpreter().open(5834, surok, this, true); + return true; + } + + }); + return true; + } + return true; + case 11014: + if (option.getName().toLowerCase().equals("operate") || option.getName().toLowerCase().equals("summon")) { + if (king.getAttribute("message", false)) { + summonZaff(); + return true; + } + } + break; + case 15536: + return true; + } + } + return super.interact(entity, target, option); + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (type != -1) { + return false; + } + return super.teleport(e, type, node); + } + + /** + * Summons zaff. + */ + public void summonZaff() { + if (!king.getAttribute("message", false)) { + player.sendMessage("Zaff isn't ready to be summoned."); + return; + } + player.lock(); + king.lock(); + king.getProperties().getCombatPulse().stop(); + player.getProperties().getCombatPulse().stop(); + player.getInterfaceManager().hideTabs(getRemovedTabs()); + zaff = NPC.create(5836, player.getLocation()); + Location loc = RegionManager.getSpawnLocation(player, zaff); + if (loc != null) { + zaff.setLocation(loc); + } + zaff.init(); + zaff.graphics(Graphics.create(110)); + if (zaff.getLocation().equals(king.getLocation()) || zaff.getLocation().equals(surok.getLocation())) { + zaff.moveStep(); + } + zaff.face(king); + king.face(zaff); + zaff.animate(Animation.create(5633)); + zaff.sendChat("Sin danna nim borha!!", 2); + king.animate(Animation.create(6099), 5); + zaff.graphics(Graphics.create(108), 3); + king.graphics(Graphics.create(110), 8); + king.sendChat("Wh...!", 7); + GameWorld.getPulser().submit(new Pulse(9, player) { + + @Override + public boolean pulse() { + king.clear(); + player.unlock(); + player.setAttribute("can-arrest", true); + player.getDialogueInterpreter().sendDialogues(zaff, null, "The king's mind has been restored to him and he has", "been teleported away to safety. Now, to deal with", "Surok!"); + return true; + } + + }); + } + + /** + * Sends the camera on a tick. + * @param x1 the x. + * @param y1 the y1. + * @param x2 the x2. + * @param y2 the y2. + * @param height the height. + * @param speed the speed. + * @param ticks the ticks. + */ + public void sendCamera(final int x1, final int y1, final int x2, final int y2, final int height, final int speed, int ticks) { + GameWorld.getPulser().submit(new Pulse(ticks, player) { + + @Override + public boolean pulse() { + sendCamera(x1, y1, x2, y2, height, speed); + return true; + } + + }); + } + + /** + * Sends a camera. + * @param height the height. + * @param speed the speed. + */ + public void sendCamera(int x1, int y1, int x2, int y2, int height, int speed) { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, player.getLocation().getX() + x1, player.getLocation().getY() + y1, height, 1, speed)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, player.getLocation().getX() + x2, player.getLocation().getY() + y2, height, 1, speed)); + } + + /** + * Resets the camera on a tick. + * @param ticks the ticks. + */ + public void reset(int ticks) { + GameWorld.getPulser().submit(new Pulse(1, player) { + + @Override + public boolean pulse() { + reset(); + return true; + } + + }); + } + + /** + * Resets the camera. + */ + public void reset() { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 0, 0)); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new WLBelowCutscene(p); + } + + @Override + public Location getStartLocation() { + return base.transform(10, 38, 0); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + region = DynamicRegion.create(12854); + setRegionBase(); + registerRegion(region.getId()); + } + + /** + * Gets the surok. + * @return the surok + */ + public NPC getSurok() { + return surok; + } + + /** + * Sets the surok. + * @param surok the surok to set. + */ + public void setSurok(NPC surok) { + this.surok = surok; + } + + /** + * Gets the king. + * @return the king + */ + public NPC getKing() { + return king; + } + + /** + * Sets the baking. + * @param king the king to set. + */ + public void setKing(NPC king) { + this.king = king; + } + + /** + * Gets the zaff. + * @return the zaff + */ + public NPC getZaff() { + return zaff; + } + + /** + * Sets the zaff. + * @param zaff the zaff to set. + */ + public void setZaff(NPC zaff) { + this.zaff = zaff; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.java new file mode 100644 index 000000000..3d3b22c4e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/WLBelowPlugin.java @@ -0,0 +1,253 @@ +package core.game.content.quest.members.whatliesbelow; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.content.activity.ActivityManager; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.node.entity.skill.runecrafting.Altar; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the what lies below options. + * @author Vexia + * + */ +public class WLBelowPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new OutlawNPC()); + PluginManager.definePlugin(new KingRoaldNPC()); + ActivityManager.register(new WLBelowCutscene()); + PluginManager.definePlugin(new FolderHandler()); + PluginManager.definePlugin(new MetalWandHandler()); + PluginManager.definePlugin(new AnnaJonesDialogue()); + PluginManager.definePlugin(new SurokMagisDialogue()); + PluginManager.definePlugin(new RatBurgissDialogue()); + ObjectDefinition.forId(23095).getHandlers().put("option:use", this); + ObjectDefinition.forId(23058).getHandlers().put("option:enter", this); + ObjectDefinition.forId(23057).getHandlers().put("option:excavate", this); + WhatLiesBelow.RATS_PAPER.getDefinition().getHandlers().put("option:read", this); + WhatLiesBelow.EMPTY_FOLDER.getDefinition().getHandlers().put("option:read", this); + WhatLiesBelow.USED_FOLDER.getDefinition().getHandlers().put("option:read", this); + WhatLiesBelow.FULL_FOLDER.getDefinition().getHandlers().put("option:read", this); + WhatLiesBelow.RATS_LETTER.getDefinition().getHandlers().put("option:read", this); + WhatLiesBelow.SUROKS_LETTER.getDefinition().getHandlers().put("option:read", this); + WhatLiesBelow.BEACON_RING.getDefinition().getHandlers().put("option:summon", this); + WhatLiesBelow.BEACON_RING.getDefinition().getHandlers().put("option:operate", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest(WhatLiesBelow.NAME); + switch (option) { + case "summon": + case "operate": + if (quest.getStage(player) > 70) { + player.sendMessage("Zaff has removed the summon charges from the ring. It will not summon him again."); + } else { + if (quest.getStage(player) == 70 && player.getZoneMonitor().isInZone("What Lies below")) { + WLBelowCutscene cutscene = player.getAttribute("cutscene", null); + cutscene.summonZaff(); + return true; + } + player.sendMessage("You need to use this at the proper time."); + } + break; + case "enter": + switch (node.getId()) { + case 23058: + player.animate(Animation.create(6103)); + player.teleport(new Location(3179, 5191, 0), 2); + + break; + } + break; + case "use": + switch (node.getId()) { + case 23095: + player.teleport(new Location(2270, 4836, 1)); + // Take the Dagon'Hai shortcut to the chaos portal + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 2); + break; + } + break; + case "excavate": + switch (quest.getStage(player)) { + case 30: + final SkillingTool tool = SkillingTool.getPickaxe(player); + if (tool == null) { + player.sendMessage("You need a pickaxe in order to do that."); + break; + } + player.lock(); + player.animate(tool.getAnimation()); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + count++; + int duration = 7; + if (count == duration) { + player.sendChat("Hmmm..."); + } else if (count == duration + 2) { + player.animate(tool.getAnimation()); + } else if (count == duration * 2) { + quest.setStage(player, 40); + player.getAnimator().reset(); + player.getConfigManager().set(992, 1 << 8, true); + player.getDialogueInterpreter().open(5837, true, true, true); + player.unlock(); + return true; + } + return false; + } + + }); + break; + default: + player.sendMessage("Nothing interesting happened."); + break; + } + break; + case "read": + switch (node.getId()) { + case 11003: + String message = "The folder is empty at the moment so there is nothing inside to read!"; + player.sendMessage(message); + break; + case 11009: + case 11010: + player.sendMessage("You read the letter."); + player.getInterfaceManager().open(new Component(node.getId() == 11009 ? 249 : 250)); + break; + case 11008: + case 11007: + case 11006: + player.getDialogueInterpreter().sendDialogue("The piece of papers appears to contain lots of facts and figures.", "They look like accounts and lists of items. You're", "not sure what they all mean."); + break; + } + break; + } + return true; + } + + /** + * Handles the infusion of the metal wand. + * @author Vexia + */ + public static class MetalWandHandler extends UseWithHandler { + + /** + * The chaos runes. + */ + private static final Item CHAOS_RUNES = new Item(562, 15); + + /** + * The chaos talisman. + */ + private static final Item CHAOS_TALISMAN = new Item(1452); + + /** + * The chaos tiara. + */ + private static final Item CHAOS_TIARA = new Item(5543); + + /** + * Constructs a new {@Code MetalWandHandler} {@Code + * Object} + */ + public MetalWandHandler() { + super(WhatLiesBelow.WAND.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(Altar.CHAOS.getObject(), OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + if (!player.getInventory().containsItem(CHAOS_RUNES)) { + player.sendMessage("You need 15 chaos runes."); + return true; + } + /*if (!player.getInventory().containsItem(CHAOS_TALISMAN) && !player.getInventory().containsItem(CHAOS_TIARA)) { + player.sendMessage("You need a chaos talisman or chaos tiara."); + return true; + }*/ + Item chaosItem = player.getInventory().containsItem(CHAOS_TALISMAN) ? CHAOS_TALISMAN : CHAOS_TIARA; + if (chaosItem != null && player.getInventory().remove(CHAOS_RUNES)) { + player.lock(5); + player.getInventory().remove(WhatLiesBelow.WAND); + player.getInventory().add(WhatLiesBelow.INFUSED_WAND); + player.animate(Animation.create(6104)); + player.getDialogueInterpreter().sendDialogue("The metal wand bursts into life and crackles with arcane", "power. This is a powerful instrument indeed!"); + } + return true; + } + + } + + /** + * Handles the empty folder. + * @author Vexia + */ + public class FolderHandler extends UseWithHandler { + + /** + * Constructs a new {@Code FolderHandler} {@Code Object} + */ + public FolderHandler() { + super(WhatLiesBelow.EMPTY_FOLDER.getId(), WhatLiesBelow.USED_FOLDER.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(WhatLiesBelow.RATS_PAPER.getId(), ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + Item paper = event.getUsedItem(); + Item folder = event.getUsedWith().asItem(); + if (player.getInventory().remove(paper)) { + if (folder.getId() == 11003) { + player.getInventory().replace(WhatLiesBelow.USED_FOLDER, folder.getSlot()); + folder = player.getInventory().get(folder.getSlot()); + } + folder.setCharge(folder.getCharge() + 1); + int amount = 1005 - folder.getCharge(); + player.sendMessage("You add the page to the folder that Rat gave to you."); + if (amount <= 0) { + player.getInventory().replace(WhatLiesBelow.FULL_FOLDER, folder.getSlot()); + player.sendMessage("You add the last page to Rat's folder. You should take this back to Rat as soon as"); + player.sendMessage("possible."); + player.getDialogueInterpreter().sendDialogue("You have added all the pages to the folder that Rat gave to you.", "You should take this folder back to Rat."); + return true; + } + player.sendMessage("You need to find " + amount + " more page" + (amount <= 1 ? "." : "s.")); + } + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.java b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.java new file mode 100644 index 000000000..dfa02f33d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/whatliesbelow/WhatLiesBelow.java @@ -0,0 +1,203 @@ +package core.game.content.quest.members.whatliesbelow; + +import core.plugin.Initializable; +import core.tools.Items; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.PluginManager; + +/** + * The what lies below quest. + * @author Vexa + * + */ +@Initializable +public class WhatLiesBelow extends Quest { + + /** + * The name of the quest. + */ + public static final String NAME = "What Lies Below"; + + /** + * The bowl item. + */ + public static final Item BOWL = new Item(Items.BOWL_1923); + + /** + * The sin keth diary. + */ + public static final Item SIN_KETH_DIARY = new Item(Items.SINKETHS_DIARY_11002); + + /** + * The empty folder item. + */ + public static final Item EMPTY_FOLDER = new Item(Items.AN_EMPTY_FOLDER_11003); + + /** + * The used folder. + */ + public static final Item USED_FOLDER = new Item(Items.USED_FOLDER_11006); + + /** + * The full folder. + */ + public static final Item FULL_FOLDER = new Item(Items.FULL_FOLDER_11007); + + /** + * The rats paper item. + */ + public static final Item RATS_PAPER = new Item(Items.RATS_PAPER_11008); + + /** + * The rats letter. + */ + public static final Item RATS_LETTER = new Item(Items.RATS_LETTER_11009); + + /** + * The suroks letter. + */ + public static final Item SUROKS_LETTER = new Item(Items.SUROKS_LETTER_11010); + + /** + * The wand item. + */ + public static final Item WAND = new Item(Items.WAND_11012); + + /** + * The infused item. + */ + public static final Item INFUSED_WAND = new Item(Items.INFUSED_WAND_11013); + + /** + * The bacon ring. + */ + public static final Item BEACON_RING = new Item(Items.BEACON_RING_11014); + + /** + * The requirement messages. + */ + private static final String[] REQS = new String[] { + "Have level 35 Runecrafting.", + "Be able to defeat a level 47 enemy.", + "I need to have completed the Rune Mysteries quest.", + "Have a Mining level of 42 to use the Chaos Tunnel." + }; + + /** + * The requirements. + */ + private final boolean[] requirements = new boolean[4]; + + /** + * Constructs a new {@Code WhatLiesBelow} {@Code Object} + */ + public WhatLiesBelow() { + super(NAME, 136, 135, 1); + } + + @Override + public Quest newInstance(Object object) { + PluginManager.definePlugin(new WLBelowPlugin()); + return this; + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (stage) { + case 0: + line(player, "I can start this quest by speaking to Rat Burgiss on theroad south of Varrock.Before I begin I will need to:" + getReqMessage(player), 11); + break; + case 10: + line(player, "Rat, a trader in Varrock, has asked me to help him with a task.I need to kill outlaws west of Varrock so that I can collect 5 of Rat's papers.", 11); + break; + case 20: + line(player, "Rat, a trader in Varrock, has asked me to help him with a task.I need to kill outlaws west of Varrock so that I can collect5 of Rat's papers.I have delivered Rat's folder to him. Perhaps Ishould speak to him again.I need to deliver Rat's letter to Surok Magisin Varrock.", 11); + break; + case 30: + case 40: + line(player, "Rat, a trader in Varrock, has asked me to help him with a task.Surok, a Wizard in Varrock, has asked me to complete a task for him.I need to kill the outlaws west of Varrock so that I can collect5 of Rat's papers.I have delivered Rat's folder to him. Perhaps Ishould speak to him again.I need to deliver Rat's letter to Surok Magis in Varrock. I need to talk to Surok about thesecret he has for me.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also needto find or buy an empty bowl.", 11); + break; + case 50: + line(player, "Rat, a trader in Varrock, has asked me to help him with a task.Surok, a Wizard in Varrock, has asked me to complete a task for him.I need to kill the outlaws west of Varrock so that I can collect5 of Rat's papers.I have delivered Rat's folder to him. Perhaps Ishould speak to him again.I need to deliver Rat's letter to Surok Magis in Varrock. I need to talk to Surok about thesecret he has for me.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to take the glowing wand I have created back to Surok in Varrockwith an empty bowl.I need to deliver Surok's letter to Rat who is waiting for me southof Varrock. I should speak to Rat again; he is waiting for me south of Varrock", 11); + break; + case 60: + line(player, "Rat, a trader in Varrock, has asked me to help him with a task.Surok, a Wizard in Varrock, has asked me to complete a task for him.I need to kill the outlaws west of Varrock so that I can collect5 of Rat's papers.I have delivered Rat's folder to him. Perhaps Ishould speak to him again.I need to deliver Rat's letter to Surok Magis in Varrock. I need to talk to Surok about thesecret he has for me.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to take the glowing wand I have created back to Surok in Varrockwith an empty bowl.I need to deliver Surok's letter to Rat who is waiting for me southof Varrock.I should speak to Rat again; he is waiting for me south of VarrockI need to speak to Zaff of Zaff's Staffs in Varrock.", 11); + break; + case 70: + line(player, "Rat, a trader in Varrock, has asked me to help him with a task.Surok, a Wizard in Varrock, has asked me to complete a task for him.I need to kill the outlaws west of Varrock so that I can collect5 of Rat's papers.I have delivered Rat's folder to him. Perhaps Ishould speak to him again.I need to deliver Rat's letter to Surok Magis in Varrock. I need to talk to Surok about thesecret he has for me.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to take the glowing wand I have created back to Surok in Varrockwith an empty bowl.I need to deliver Surok's letter to Rat who is waiting for me southof Varrock.I should speak to Rat again; he is waiting for me south of VarrockI need to speak to Zaff of Zaff's Staffs in Varrock.I need to tell Surok in Varrock that he is under arrest.", 11); + break; + case 80: + case 90: + line(player, "Rat, a trader in Varrock, has asked me to help him with a task.Surok, a Wizard in Varrock, has asked me to complete a task for him.I need to kill the outlaws west of Varrock so that I can collect5 of Rat's papers.I have delivered Rat's folder to him. Perhaps Ishould speak to him again.I need to deliver Rat's letter to Surok Magis in Varrock. I need to talk to Surok about thesecret he has for me.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to take the glowing wand I have created back to Surok in Varrockwith an empty bowl.I need to deliver Surok's letter to Rat who is waiting for me southof Varrock.I should speak to Rat again; he is waiting for me south of VarrockI need to speak to Zaff of Zaff's Staffs in Varrock.I need to tell Surok in Varrock that he is under arrest.I need to defeat King Roald in Varrock so that Zaff can remove themind-control spell.I need to tell Rat what has happened; he is waiting for mesouth of Varrock.", 11); + break; + case 100: + line(player, "Rat, a trader in Varrock, has asked me to help him with a task.Surok, a Wizard in Varrock, has asked me to complete a task for him.I need to kill the outlaws west of Varrock so that I can collect5 of Rat's papers.I have delivered Rat's folder to him. Perhaps Ishould speak to him again.I need to deliver Rat's letter to Surok Magis in Varrock. I need to talk to Surok about thesecret he has for me.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to infuse the metal wand with chaos runes at the Chaos Altar.I also need to find or buy an empty bowl.I need to take the glowing wand I have created back to Surok in Varrockwith an empty bowl.I need to deliver Surok's letter to Rat who is waiting for me southof Varrock.I should speak to Rat again; he is waiting for me south of VarrockI need to speak to Zaff of Zaff's Staffs in Varrock.I need to tell Surok in Varrock that he is under arrest.I need to defeat King Roald in Varrock so that Zaff can remove themind-control spell.I need to tell Rat what has happened; he is waiting for mesouth of Varrock.QUEST COMPLETE!I have been given information about the Chaos Tunnel.Zaff has given me the Beacon Ring.", 11); + break; + } + } + + @Override + public void start(Player player) { + super.start(player); + player.getInventory().add(EMPTY_FOLDER, player); + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getPacketDispatch().sendString("8,000 Runecrafting XP", 277, 8+ 2); + player.getPacketDispatch().sendString("2,000 Defence XP", 277, 9+ 2); + player.getPacketDispatch().sendString("Beacon Ring", 277, 10+ 2); + player.getPacketDispatch().sendString("Knowledge of Chaos Tunnel", 277, 11+ 2); + player.getPacketDispatch().sendItemZoomOnInterface(BEACON_RING.getId(), 235, 277, 3+ 2); + player.getSkills().addExperience(Skills.RUNECRAFTING, 8000); + player.getSkills().addExperience(Skills.DEFENCE, 2000); + player.getQuestRepository().syncronizeTab(player); + } + + /** + * Gets the req message. + * @return the message. + */ + public String getReqMessage(Player player) { + hasRequirements(player); + String s = ""; + for (int i = 0; i < requirements.length; i++) { + String l = REQS[i]; + if (requirements[i]) { + l = l.replace("", "").replace("", "").trim(); + } + s += (requirements[i] ? "" : "") + l + ""; + } + return s; + } + + @Override + public boolean hasRequirements(Player player) { + requirements[0] = player.getSkills().getStaticLevel(Skills.RUNECRAFTING) >= 35; + requirements[1] = false; + requirements[3] = player.getSkills().getStaticLevel(Skills.MINING) >= 42; + requirements[2] = player.getQuestRepository().isComplete("Rune Mysteries"); + return requirements[0] && requirements[2] && requirements[3]; + } + + @Override + public int[] getConfig(Player player, int stage) { + int id = 992; + if (stage >= 40 && stage != 100) { + return new int[] { id, (1 << 8) + 1 }; + } + if (stage == 0) { + return new int[] { id, 0 }; + } else if (stage > 0 && stage < 100) { + return new int[] { id, 1 }; + } + player.getConfigManager().set(1181, (1 << 8) + (1 << 9), true); + return new int[] { id, 502 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/BallInteraction.java b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/BallInteraction.java new file mode 100644 index 000000000..337af2bd2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/BallInteraction.java @@ -0,0 +1,75 @@ +package core.game.content.quest.members.witchshouse; + +import core.game.interaction.MovementPulse; +import core.game.interaction.Option; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.combat.spell.SpellBlocks; +import core.game.content.activity.mta.TelekineticGrabSpell; +import core.game.content.quest.PluginInteraction; +import core.game.content.quest.PluginInteractionManager; +import core.game.node.entity.skill.Skills; + +@Initializable +public class BallInteraction extends PluginInteraction { + private boolean handled; + @Override + public Plugin newInstance(Object arg) throws Throwable { + SpellBlocks.register(TelekineticGrabSpell.SPELL_ID, new Item(2407)); + setIds(new int[]{2407}); + PluginInteractionManager.register(this, PluginInteractionManager.InteractionType.ITEM); + return this; + } + + @Override + public boolean handle(Player player, Item item, Option option) { + player.debug("Trying to handle ball..."); + if(option.getName().toLowerCase().equals("take")){ + + player.debug("Take option used..."); + player.getPulseManager().run(new MovementPulse(player, item.getLocation().transform(0, -1, 0)) { + @Override + public boolean pulse() { + return true; + } + }, "movement"); + handleBall(player); + } + return handled; + } + + public void handleBall(Player player){ + if(player.getAttribute("witchs_house:experiment_killed",false)) { + if (player.getInventory().containsItem(new Item(2407))) { + player.sendMessage("You already have the ball."); + handled = true; + player.debug("Handled in branch 1"); + } else { + handled = false; + player.debug("Unhandled."); + } + } else { + if(player.getAttribute("witchs-experiment:npc_spawned", false)){ + player.sendMessage("Finish fighting the experiment first!"); + return; + } + player.debug("Handled in branch 2."); + int[] skillsToDecrease = {Skills.DEFENCE, Skills.ATTACK, Skills.STRENGTH, Skills.RANGE, Skills.MAGIC}; + for (int i = 0; i < skillsToDecrease.length; i++) { + player.getSkills().setLevel(i, player.getSkills().getLevel(i) > 5 ? player.getSkills().getLevel(i) - 5 : 1); + } + player.getPacketDispatch().sendMessage("The experiment glares at you, and you feel yourself weaken."); + new WitchsExperimentNPC(player.getAttribute("witchs_house:experiment_id",897), Location.create(2936, 3463, 0),player).init(); + player.setAttribute("witchs-experiment:npc_spawned",true); + handled = true; + } + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/BoyDialoguePlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/BoyDialoguePlugin.java new file mode 100644 index 000000000..421608273 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/BoyDialoguePlugin.java @@ -0,0 +1,151 @@ +package core.game.content.quest.members.witchshouse; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; + +/** + * Created for 2009Scape + * User: Ethan Kyle Millard + * Date: March 15, 2020 + * Time: 11:49 AM + */ +@Initializable +public class BoyDialoguePlugin extends DialoguePlugin { + + private static final Item BALL = new Item(2407); + + public BoyDialoguePlugin() { + } + + public BoyDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BoyDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + final Quest quest = player.getQuestRepository().getQuest("Witch's House"); + player.debug(quest.isStarted(player) + " " + quest.getStage(player) ); + if (!quest.isStarted(player) && quest.getStage(player) < 10) { + player("Hello young man."); + setStage(1); + return true; + } + if (quest.isCompleted(player) || quest.getStage(player) == 100) { + sendDialogue("The boy is too busy playing with his ball to talk."); + finish(); + return true; + } + if (!player.getInventory().containsItem(BALL)) { + npc( FacialExpression.OLD_NORMAL, "Have you gotten my ball back yet?"); + } else { + player("Hi, I have got your ball back. It was MUCH harder", "than I thought it would be."); + } + setStage(11); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Witch's House"); + switch(stage) { + case -1: + end(); + break; + case 1: + sendDialogue("The boy sobs."); + next(); + break; + case 2: + options("What's the matter?", "Well if you're not going to answer then I'll go."); + next(); + break; + case 3: + switch(buttonId) { + case 1: + player("What's the matter?"); + setStage(5); + break; + case 2: + player("Well if you're not going to answer then I'll go."); + next(); + break; + } + break; + case 4: + sendDialogue("The boy sniffs slightly."); + finish(); + break; + case 5: + npc(FacialExpression.OLD_NORMAL, "I've kicked my ball over that hedge, into that garden!", "The old lady who lives there is scary... She's locked the","ball in her wooden shed! Can you get my ball back for", "me please?"); + next(); + break; + case 6: + options("Ok, I'll see what I can do.", "Get it back yourself."); + next(); + break; + case 7: + switch(buttonId) { + case 1: + player("Ok, I'll see what I can do."); + setStage(10); + break; + case 2: + player("Get it back yourself."); + next(); + break; + } + break; + case 8: + npc(FacialExpression.OLD_NORMAL, "You're a meany."); + next(); + break; + case 9: + sendDialogue("The boy starts crying again."); + finish(); + break; + case 10: + npc(FacialExpression.OLD_NORMAL, "Thanks mister!"); + finish(); + quest.start(player); + break; + case 11: + if (!player.getInventory().containsItem(BALL)) { + player("Not yet."); + next(); + } else { + if (player.getInventory().remove(BALL)) + sendDialogue("You give the ball back."); + setStage(13); + } + break; + case 12: + npc(FacialExpression.OLD_NORMAL, "Well it's in the shed in that garden."); + finish(); + break; + case 13: + npc(FacialExpression.OLD_NORMAL, "Thank you so much!"); + next(); + break; + case 14: + quest.setStage(player, 100); + quest.finish(player); + finish(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 895 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/ExperimentSession.java b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/ExperimentSession.java new file mode 100644 index 000000000..016372446 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/ExperimentSession.java @@ -0,0 +1,111 @@ +/* +package core.game.content.quest.witchs_house; + +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; + +public final class ExperimentSession { + + */ +/** + * The player. + *//* + + private final Player player; + + */ +/** + * The npc npc. + *//* + + private final WitchsExperimentNPC npc; + + */ +/** + * Constructs a new {@code ExperimentSession} {@code Object}. + * + * @param player the player. + *//* + + public ExperimentSession(final Player player) { + this.player = player; + this.npc = new WitchsExperimentNPC(WitchsExperimentNPC.ExperimentType.values()[0].getId(), Location.create(2936, 3463, 0), this); + if (player.getExtension(ExperimentSession.class) != null) { + player.removeExtension(ExperimentSession.class); + } + player.addExtension(ExperimentSession.class, this); + } + + */ +/** + * Creates the npc session. + * + * @param player the player. + * @return the session. + *//* + + public static ExperimentSession create(Player player) { + return new ExperimentSession(player); + } + + */ +/** + * Starts the session. + *//* + + public void start() { + if (npc.getType().ordinal() > 0) { + npc.init(); + npc.getProperties().getCombatPulse().attack(player); + return; + } + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + if (++count == 1) { + npc.init(); + npc.setCommenced(true); + return true; + } + return false; + } + }); + } + + */ +/** + * Closes the session. + *//* + + public void close() { + npc.clear(); + player.removeExtension(ExperimentSession.class); + } + + */ +/** + * Gets the npc session. + * + * @param player the player. + * @return the session. + *//* + + public static ExperimentSession getSession(Player player) { + return player.getExtension(ExperimentSession.class); + } + + */ +/** + * Gets the player. + * + * @return The player. + *//* + + public Player getPlayer() { + return player; + } +}*/ diff --git a/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/MouseNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/MouseNPC.java new file mode 100644 index 000000000..b04e75294 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/MouseNPC.java @@ -0,0 +1,97 @@ +package core.game.content.quest.members.witchshouse; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; + +/** + * Created for 2009Scape + * User: Ethan Kyle Millard + * Date: March 15, 2020 + * Time: 10:56 AM + */ +public class MouseNPC extends AbstractNPC { + + /** + * The player. + */ + private Player player; + + /** + * The end time of the mouse being spawned. + */ + private int endTime; + + /** + * Represents the NPC ids of NPCs using this plugin. + */ + private static final int[] ID = {901}; + + /** + * Constructs a new {@code DSNedNPC} {@code Object}. + */ + public MouseNPC() { + super(0, null); + } + + /** + * Constructs a new {@code DSNedNPC} {@code Object}. + * + * @param id The NPC id. + * @param location The location. + */ + private MouseNPC(int id, Location location) { + super(id, location); + this.endTime = (int) (GameWorld.getTicks() + (4 / 0.6)); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MouseNPC(id, location); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (player.getAttribute("mouse_out") == null) { + clear(); + } + if (GameWorld.getTicks() > endTime) { + clear(); + } + if (!player.isActive() || player.getLocation().getDistance(getLocation()) > 8) { + clear(); + } + + } + + @Override + public void clear() { + super.clear(); + player.removeAttribute("mouse_out"); + } + + @Override + public int[] getIds() { + return ID; + } + + /** + * Sets the player. + * @param player the player. + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/NoraTHaggNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/NoraTHaggNPC.java new file mode 100644 index 000000000..7c8ddf9c8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/NoraTHaggNPC.java @@ -0,0 +1,149 @@ +package core.game.content.quest.members.witchshouse; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.util.List; + +/** + * Nora T Hagg NPC + * @author Ethan, cleaned up by ceik + * @date y'know + */ + +@Initializable +public class NoraTHaggNPC extends AbstractNPC { + + boolean walkdir; + + public NoraTHaggNPC() { + super(896, Location.create(2904, 3463, 0)); + } + private Location getRespawnLocation() { + return Location.create(2900, 3473, 0); + } + + private NoraTHaggNPC(int id, Location location) { + super(id, location); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + this.configure(); + init(); + return super.newInstance(arg); + } + + private boolean canTeleport(Entity t) { + int playerX = t.getLocation().getX(); + int npcX = getLocation().getX(); + int[] sectors = { 2904, 2907, 2910, 2914, 2918, 2922, 2926, 2928 }; + for (int i = 0; i < sectors.length -1; i++) { + if (npcX >= sectors[i] && npcX <= sectors[i+1] && playerX >= sectors[i] && playerX <= sectors[i+1]) { + if (playerX < npcX && getDirection() == Direction.WEST || playerX > npcX && getDirection() == Direction.EAST) { + return true; + } + if (playerX == npcX) { + return true; + } + } + } + return false; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new NoraTHaggNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 896 }; + } + + + @Override + public int getWalkRadius() { + return 50; + } + + + public void configure() { + super.configure(); + setWalks(false); + setPathBoundMovement(true); + } + + private void sendTeleport(final Player player) { + player.lock(); + GameWorld.getPulser().submit(new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + face(player); + player.getInventory().remove(WitchsHousePlugin.BALL); + player.getInventory().remove(WitchsHousePlugin.KEY); + player.getInventory().remove(WitchsHousePlugin.DOOR_KEY); + sendChat("Stop! Thief!"); + player.getPacketDispatch().sendMessage("You've been spotted by the witch."); + player.graphics(new Graphics(110, 100)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + } else if (delay == 2) { + sendChat("Klarata... Seppteno... Valkan!"); + face(null); + } else if (delay == 4) { + player.getProperties().setTeleportLocation(Location.create(getRespawnLocation())); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + face(null); + player.unlock(); + return true; + } + delay++; + return false; + } + }); + } + + @Override + public void tick() { + super.tick(); + List players = getViewport().getCurrentPlane().getPlayers(); + if(getLocation().getX() == 2930){ + walkdir = false; + } else if(getLocation().getX() == 2904){ + walkdir = true; + } + for (Player player : players) { + if (player == null || !player.isActive() || player.getLocks().isInteractionLocked() || DeathTask.isDead(player) || !canTeleport(player) || !CombatSwingHandler.isProjectileClipped(this, player, false)) { + continue; + } + animate(new Animation(5803)); + sendTeleport(player); + player.getPacketDispatch().sendMessage("" + getLocation() + " matches? " + (getLocation().getX() == 2904)); + } + if (location.getX() != 2930 && walkdir) { + this.getWalkingQueue().reset(); + this.getWalkingQueue().addPath(location.getX() + 1,3463,true); + } else if (location.getX() != 2904 && !walkdir) { + this.getWalkingQueue().reset(); + this.getWalkingQueue().addPath(location.getX() - 1,3463,true); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsDiaryBook.java b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsDiaryBook.java new file mode 100644 index 000000000..47f261d87 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsDiaryBook.java @@ -0,0 +1,163 @@ +package core.game.content.quest.members.witchshouse; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.book.Book; +import core.game.content.dialogue.book.BookLine; +import core.game.content.dialogue.book.Page; +import core.game.content.dialogue.book.PageSet; +import core.game.node.entity.player.Player; + +/** + * Created for 2009Scape + * User: Ethan Kyle Millard + * Date: March 30, 2020 + * Time: 2:49 PM + */ +@Initializable +public class WitchsDiaryBook extends Book { + + /** + * Represents the shield of arrav book id. + */ + public static int ID = 4501993; + + /** + * Represents the array of pages for this book. + */ + private static final PageSet[] PAGES = new PageSet[]{ + new PageSet( + new Page(new BookLine("2nd of Pentember", 55), + new BookLine("Experiment is growing", 56), + new BookLine("larger daily. Making", 57), + new BookLine("excellent progress now. I", 58), + new BookLine("am currently feeding it", 59), + new BookLine("on a mixture of fungus,", 60), + new BookLine("tar and clay.", 61), + new BookLine("It seems to like this", 62), + new BookLine("combination a lot!", 63)), + new Page(new BookLine("3rd of Pentember", 66), + new BookLine("Experiment still going", 67), + new BookLine("extremely well. Moved it", 68), + new BookLine("to the wooden garden", 69), + new BookLine("shed; it does too much", 70), + new BookLine("damage in the house! it", 71), + new BookLine("is getting very strong", 72), + new BookLine("now, but unfortunately is", 73), + new BookLine("not too intelligent yet. It", 74), + new BookLine("has a really mean stare", 75), + new BookLine("too!", 76))), + new PageSet( + new Page(new BookLine("4th of Pentember", 55), + new BookLine("Sausages for dinner", 56), + new BookLine("tonight! Lovely!", 57), + new BookLine("5th of Pentember", 59), + new BookLine("A guy called Professor", 60), + new BookLine("Oddenstein installed a", 61), + new BookLine("new security system for", 62), + new BookLine("me in the basement. He", 63), + new BookLine("seems to have a lot of", 64), + new BookLine("good security ideas.", 65)), + new Page(new BookLine("6th of Pentember", 66), + new BookLine("Don't want people getting", 67), + new BookLine("into back garden to see", 68), + new BookLine("the experiment. Professor", 69), + new BookLine("Oddenstein is fitting me a", 70), + new BookLine("new security system,", 71), + new BookLine("after his successful", 72), + new BookLine("installation in the cellar.", 73))), + new PageSet( + new Page(new BookLine("7th of Pentember", 55), + new BookLine("That pesky kid keeps", 56), + new BookLine("kicking his ball into my", 57), + new BookLine("garden. I swear, if he", 58), + new BookLine("does it AGAIN, I'm going", 59), + new BookLine("to lock his ball away in", 60), + new BookLine("the shed.", 61), + new BookLine("8th of Pentember.", 63), + new BookLine("The security system is", 64), + new BookLine("done. By Zamorak! Wow,", 65)), + new Page(new BookLine("is it contrived! Now, to", 66), + new BookLine("open my own back door,", 67), + new BookLine("I lure a mouse out of a", 68), + new BookLine("hole in the back porch, I", 69), + new BookLine("fit a magic curved piece", 70), + new BookLine("of metal to the harness", 71), + new BookLine("on its back, the mouse", 72), + new BookLine("goes back in the hole, and", 73), + new BookLine("the door unlocks! The", 74), + new BookLine("prof tells me that this is", 75), + new BookLine("cutting edge technology!", 76))), + new PageSet( + new Page(new BookLine("As an added precaution I", 55), + new BookLine("have hidden the key to", 56), + new BookLine("the shed in a secret", 57), + new BookLine("compartment of the", 58), + new BookLine("fountain in the garden.", 59), + new BookLine("No one will ever look", 60), + new BookLine("there.", 61), + new BookLine("9th of Pentember", 63), + new BookLine("Still can't think of a good", 64), + new BookLine("name of 'The", 65)), + new Page(new BookLine("Experiment'. Leaning", 66), + new BookLine("Towards 'fritz'... Although", 67), + new BookLine("am considering Lucy as", 68), + new BookLine("it reminds me of my", 69), + new BookLine("Mother!", 70))), + }; + + /** + * Constructs a new {@code WitchsDiaryBook} {@code Object}. + */ + public WitchsDiaryBook(final Player player) { + super(player, "Witches' Diary", 2408, PAGES); + } + + /** + * Constructs a new {@code WitchsDiaryBook} {@code Object}. + */ + public WitchsDiaryBook() { + /** + * empty. + */ + } + + @Override + public void finish() { + + } + + @Override + public void display(Page[] set) { + player.lock(); + player.getInterfaceManager().open(getInterface()); + for (int i = 55; i < 77; i++) { + player.getPacketDispatch().sendString("", getInterface().getId(), i); + } + player.getPacketDispatch().sendString(getName(), getInterface().getId(), 6); + player.getPacketDispatch().sendString("", getInterface().getId(), 77); + player.getPacketDispatch().sendString("", getInterface().getId(), 78); + for (Page page : set) { + for (BookLine line : page.getLines()) { + player.getPacketDispatch().sendString(line.getMessage(), getInterface().getId(), line.getChild()); + } + } + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 51, index < 1); + boolean lastPage = index == sets.length - 1; + player.getPacketDispatch().sendInterfaceConfig(getInterface().getId(), 53, lastPage); + if (lastPage) { + finish(); + } + player.unlock(); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WitchsDiaryBook(player); + } + + @Override + public int[] getIds() { + return new int[]{ID}; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.java b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.java new file mode 100644 index 000000000..4b057d892 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsExperimentNPC.java @@ -0,0 +1,183 @@ +package core.game.content.quest.members.witchshouse; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; + +/** + * Created for 2009Scape + * User: Ethan Kyle Millard + * Date: March 25, 2020 + * Time: 8:28 PM + */ +@Initializable +public class WitchsExperimentNPC extends AbstractNPC { + + private ExperimentType type; + private boolean commenced; + Player p; + + public WitchsExperimentNPC() { + super(0, null); + } + + WitchsExperimentNPC(int id, Location location, Player player) { + super(id, location); + this.setWalks(true); + this.setRespawn(false); + this.type = WitchsExperimentNPC.ExperimentType.forId(id); + p = player; + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if(!p.isActive() || !RegionManager.getLocalPlayers(this).contains(p)){ + p.removeAttribute("witchs-experiment:npc_spawned"); + clear(); + } + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(p); + } + } + + @Override + public void startDeath(Entity killer) { + if (killer == p) { + type.transform(this, p); + return; + } + super.startDeath(killer); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + return p == entity; + } + + @Override + public boolean canSelectTarget(Entity target) { + if (target instanceof Player) { + Player p = (Player) target; + return p == this.p; + } + return true; + } + + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new WitchsExperimentNPC(id, location, null); + } + + @Override + public int[] getIds() { + return new int[] { 897, 898, 899, 900 }; + } + + public void setType(ExperimentType type) { + this.type = type; + } + + public ExperimentType getType() { + return type; + } + + public void setCommenced(boolean commenced) { + this.commenced = commenced; + } + + public enum ExperimentType { + FIRST(897, ""), + SECOND(898, "The shapeshifter's body begins to deform!", "The shapeshifter turns into a spider!"), + THIRD(899, "The shapeshifter's body begins to twist!", "The shapeshifter turns into a bear!"), + FOURTH(900, "The shapeshifter's body pulses!", "The shapeshifter turns into a wolf!"), + END(-1, ""), + + ; + + private int id; + private String[] message; + + ExperimentType(int id, String... message) { + this.id = id; + this.message = message; + } + + /** + * Transforms the new npc. + */ + public void transform(final WitchsExperimentNPC npc, final Player player) { + final ExperimentType newType = next(); + npc.lock(); + npc.getPulseManager().clear(); + npc.getWalkingQueue().reset(); + player.setAttribute("/save:witchs_house:experiment_id",this.id); + GameWorld.getPulser().submit(new Pulse(1, npc, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + + case 1: + npc.unlock(); + npc.getAnimator().reset(); + npc.fullRestore(); + npc.setType(newType); + npc.transform(newType.getId()); + npc.getImpactHandler().setDisabledTicks(1); + if (newType != END) { + npc.getProperties().getCombatPulse().attack(player); + } + if (newType.getMessage() != null && newType != END) { + player.sendMessage(newType.getMessage()[0]); + player.sendMessage(newType.getMessage()[1]); + } + if (newType == END) { + player.setAttribute("witchs_house:experiment_killed",true); + npc.clear(); + return false; + } + player.unlock(); + return true; + } + return false; + } + + }); + } + + public static ExperimentType forId(int id) { + for (ExperimentType type : values()) { + if (type.getId() == id) { + return type; + } + } + return null; + } + + private static ExperimentType[] experimentTypes = values(); + + public ExperimentType next() + { + return experimentTypes[this.ordinal() + 1]; + } + + public int getId() { + return id; + } + + public String[] getMessage() { + return message; + } + + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsHouse.java b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsHouse.java new file mode 100644 index 000000000..c9e25b614 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsHouse.java @@ -0,0 +1,64 @@ +package core.game.content.quest.members.witchshouse; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; + +/** + * Created for 2009Scape + * User: Ethan Kyle Millard + * Date: March 15, 2020 + * Time: 9:21 AM + */ +@Initializable +public class WitchsHouse extends Quest { + + /** + * Constructs a new {@code WitchsHouse} {@code Object}. + */ + public WitchsHouse() { + super("Witch's House", 124, 123, 4, 226, 0, 1, 7); + } + + @Override + public void drawJournal(Player player, int stage) { + super.drawJournal(player, stage); + switch (getStage(player)) { + case 0: + line(player, "I can start this quest by speaking to the little boy", 4+ 7); + line(player, "standing by the long garden just north of Taverley", 5+ 7); + line(player, "I must be able to defeat a level 53 enemy.", 6+ 7); + break; + case 10: + line(player, "A small boy has kicked his ball over the fence into the", 4+ 7); + line(player, "nearby garden, and I have agreed to retrieve it for him.", 5+ 7); + line(player, "I should find a way into the garden where the ball is.", 6+ 7); + break; + case 100: + line(player, "A small boy has kicked his ball over the fence into the", 4+ 7); + line(player, "nearby garden, and I have agreed to retrieve it for him.", 5+ 7); + line(player, "After puzzling through the strangely elaborate security", 6+ 7); + line(player, "system, and defeating a very strange monster, I returned", 7+ 7); + line(player, "the child's ball to him, and he thanked me for my help.", 8+ 7); + line(player, "QUEST COMPLETE!", 10+ 7); + break; + } + } + + @Override + public void finish(Player player) { + super.finish(player); + player.getConfigManager().set(101, player.getQuestRepository().getPoints()); + player.getPacketDispatch().sendString("4 Quest Points", 277, 8 + 2); + player.getPacketDispatch().sendString("6325 Hitpoints XP", 277, 9 + 2); + player.getSkills().addExperience(Skills.HITPOINTS, 6325); + player.getInterfaceManager().closeChatbox(); + player.getPacketDispatch().sendItemZoomOnInterface(2407, 240, 277, 3 + 2); + } + + @Override + public Quest newInstance(Object object) { + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsHousePlugin.java b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsHousePlugin.java new file mode 100644 index 000000000..d6f45f33a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/members/witchshouse/WitchsHousePlugin.java @@ -0,0 +1,261 @@ +package core.game.content.quest.members.witchshouse; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Created for 2009Scape + * User: Ethan Kyle Millard + * Date: March 15, 2020 + * Time: 9:54 AM + */ +@Initializable +public class WitchsHousePlugin extends OptionHandler { + + private static final Item LEATHER_GLOVES = new Item(1059); + public static final Item KEY = new Item(2411); + public static final Item DOOR_KEY = new Item(2409); + private static final Item MAGNET = new Item(2410); + public static final Item BALL = new Item(2407); + private static final Item CHEESE = new Item(1985); + + // private WitchsExperimentNPC experiment; + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Witch's House"); + final GroundItem ball = GroundItemManager.get(2407, new Location(2935, 3460, 0), null); + final int id = node instanceof Item ? ((Item) node).getId() : node instanceof GameObject ? ((GameObject) node).getId() : node instanceof NPC ? ((NPC) node).getId() : node.getId(); + // boolean killedExperiment = player.getAttribute("witchs_house:experiment_killed",false); + // boolean experimentAlive = !player.getAttribute("witchs_house:experiment_killed", false); + boolean readBook = player.getAttribute("readWitchsBook", false); + boolean magnetAttached = player.getAttribute("attached_magnet", false); + switch (id) { + case 897: + case 898: + case 899: + case 900: + player.debug("Option is: " + option); + if (option.equals("attack")) { + player.getProperties().getCombatPulse().attack(node); + } + break; + case 24692: + int[] items = {1733, 1059, 1061, 1965, 1734}; + for (int item : items) { + if (!player.getInventory().containsItem(new Item(item))) { + switch (item) { + case 1733: + player.getInventory().add(new Item(item)); + player.sendMessage("You find a sewing needle in the bottom of one of the boxes!"); + return true; + case 1734: + player.getInventory().add(new Item(item)); + player.sendMessage("You find some sewing thread in the bottom of one of the boxes!"); + return true; + case 1059: + player.getInventory().add(new Item(item)); + player.sendMessage("You find a pair of leather gloves in the bottom of one of the boxes!"); + return true; + case 1061: + player.getInventory().add(new Item(item)); + player.sendMessage("You find a pair of leather boots in the bottom of one of the boxes!"); + return true; + case 1965: + player.getInventory().add(new Item(item)); + player.sendMessage("You find an old cabbage in the bottom of one of the boxes!"); + return true; + + } + } + } + player.sendMessage("You find nothing interesting in the boxes."); + break; + case 2869: + if (player.getInventory().addIfDoesntHave(MAGNET)) { + player.getDialogueInterpreter().sendDialogue("You find a magnet in the cupboard."); + } else { + player.sendMessage("You search the cupboard but find nothing interesting."); + } + break; + case 2867: + if (player.getInventory().addIfDoesntHave(DOOR_KEY)) { + player.getDialogueInterpreter().sendDialogue("You find a key hidden under the flower pot."); + } else { + player.sendMessage("You search under the flower pot and find nothing."); + } + break; + case 2861: + if (quest.isCompleted(player)) { + player.sendMessage("The lock has seemed to changed since the last time you visited."); + break; + } + if (player.getInventory().containsItem(DOOR_KEY) || player.getLocation().getX() >= 2901) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } else { + player.sendMessage("The door is locked."); + } + break; + case 2862: + if (magnetAttached || player.getLocation().getY() < 3466) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + player.removeAttribute("attached_magnet"); + } else { + player.getDialogueInterpreter().sendDialogue("Strange... I can't see any kind of lock or handle to open this door."); + } + break; + case 2865: + case 2866: + if (player.getEquipment().containsItem(LEATHER_GLOVES)) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } else { + player.getImpactHandler().manualHit(player, RandomFunction.random(2, 3), ImpactHandler.HitsplatType.NORMAL); + player.getDialogueInterpreter().sendDialogue("As your bare hands touch the gate you feel a shock."); + } + break; + case 24721: + player.sendMessage("You decide to not attract the attention of the witch by playing the piano."); + break; + case 2863: + if (player.getLocation().getX() >= 2934) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + if (player.getInventory().containsItem(KEY)) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } else { + player.sendMessage("The door is locked."); + } + break; + case 2864: + player.debug(readBook + ""); + if (readBook && player.getInventory().addIfDoesntHave(KEY)) { + player.getDialogueInterpreter().sendDialogue("You search for the secret compartment mentioned in the diary.", "Inside it you find a small key. You take the key."); + } else { + player.sendMessage("You search the fountain but find nothing."); + } + break; + case 24724: + player.sendMessage("The gramophone doesn't have a record on it."); + break; + case 24672: + player.teleport(Location.create(2906, 3472, 1)); + break; + case 24673: + player.teleport(Location.create(2906, 3468, 0)); + break; + case 2408: + player.getDialogueInterpreter().open(4501993, node); + player.setAttribute("/save:readWitchsBook", true); + break; + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new WitchsHouseUseWithHandler()); + PluginManager.definePlugin(new MouseNPC()); + ObjectDefinition.forId(2867).getHandlers().put("option:look-under", this); + ObjectDefinition.forId(2861).getHandlers().put("option:open", this); + ObjectDefinition.forId(2865).getHandlers().put("option:open", this); + ObjectDefinition.forId(2866).getHandlers().put("option:open", this); + ObjectDefinition.forId(2862).getHandlers().put("option:open", this); + ObjectDefinition.forId(24724).getHandlers().put("option:wind-up", this); + ObjectDefinition.forId(24673).getHandlers().put("option:walk-down", this); + ObjectDefinition.forId(24672).getHandlers().put("option:walk-up", this); + ObjectDefinition.forId(24721).getHandlers().put("option:play", this); + ObjectDefinition.forId(24692).getHandlers().put("option:search", this); + ObjectDefinition.forId(2869).getHandlers().put("option:search", this); + ObjectDefinition.forId(2863).getHandlers().put("option:open", this); + ObjectDefinition.forId(2864).getHandlers().put("option:check", this); + ItemDefinition.forId(2408).getHandlers().put("option:read", this); + + return this; + } + + private void startFight(final Player player) { + player.setAttribute("experimentAlive", true); + player.getSavedData().getQuestData().setWitchsExperimentKilled(false); + //ExperimentSession.create(player).start(); + } + + public static class WitchsHouseUseWithHandler extends UseWithHandler { + + private WitchsHouseUseWithHandler() { + super(CHEESE.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(15518, OBJECT_TYPE, this); + UseWithHandler.addHandler(901, UseWithHandler.NPC_TYPE, new UseWithHandler(2410) { + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(901, UseWithHandler.NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + Item useditem = event.getUsedItem(); + final NPC npc = (NPC) event.getUsedWith(); + assert useditem != null; + assert npc != null; + if (useditem.getId() == MAGNET.getId() && npc.getId() == 901 && player.getAttribute("mouse_out") != null) { + player.getDialogueInterpreter().sendDialogue("You attach a magnet to the mouse's harness."); + player.removeAttribute("mouse_out"); + if (player.getInventory().remove(MAGNET)) + player.setAttribute("attached_magnet", true); + + } + return true; + } + }); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + Item useditem = event.getUsedItem(); + final GameObject object = (GameObject) event.getUsedWith(); + assert useditem != null; + assert object != null; + if (player.getAttribute("mouse_out") != null && useditem.getId() == CHEESE.getId() && object.getId() == 15518) { + player.getDialogueInterpreter().sendDialogue("You can't do this right now."); + } + if (useditem.getId() == CHEESE.getId() && object.getId() == 15518 && player.getAttribute("mouse_out") == null) { + if (player.getInventory().remove(CHEESE)) + player.getDialogueInterpreter().sendDialogue("A mouse runs out of the hole."); + MouseNPC mouse = (MouseNPC) MouseNPC.create(901, Location.create(2903, 3466, 0)); + mouse.setPlayer(player); + mouse.setRespawn(false); + mouse.setWalks(false); + mouse.init(); + mouse.faceLocation(Location.create(2903, 3465, 0)); + player.setAttribute("mouse_out", true); + } + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.java b/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.java new file mode 100644 index 000000000..49f24dd69 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlDialogue.java @@ -0,0 +1,94 @@ +package core.game.content.quest.miniquest.barcrawl; + +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; + +/** + * The barcrawl diaogue plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class BarcrawlDialogue extends DialoguePlugin { + + /** + * The npc id being used. + */ + private BarcrawlPlugin.BarcrawlType type; + + /** + * The npc id. + */ + private int npcId; + + /** + * Constructs a new {@code BarcrawlDialogue} {@code Object}. + * @param player the player. + */ + public BarcrawlDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code BarcrawlDialogue} {@code Object}. + */ + public BarcrawlDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BarcrawlDialogue(player); + } + + @Override + public boolean open(Object... args) { + npcId = (Integer) args[0]; + type = (BarcrawlPlugin.BarcrawlType) args[1]; + player("I'm doing Alfred Grimhand's Barcrawl."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npcId, null, type.getDialogue()[0]); + stage = type.getDialogue().length > 1 ? 1 : 2; + break; + case 1: + interpreter.sendDialogues(npcId, null, type.getDialogue()[1]); + stage++; + break; + case 2: + end(); + if (!player.getInventory().containsItem(type.getCoins())) { + break; + } + type.message(player, true); + player.getInventory().remove(type.getCoins()); + player.getBarcrawlManager().complete(type.ordinal()); + player.lock(6); + GameWorld.getPulser().submit(new Pulse(6, player) { + @Override + public boolean pulse() { + type.message(player, false); + type.effect(player); + return true; + } + }); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("barcrawl dialogue") }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.java b/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.java new file mode 100644 index 000000000..9896653c6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlManager.java @@ -0,0 +1,185 @@ +package core.game.content.quest.miniquest.barcrawl; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.item.Item; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; + +/** + * Manages the players barcrawl quest. + * @author 'Vexia + */ +public final class BarcrawlManager implements SavingModule { + + /** + * The barcrawl card. + */ + public static final Item BARCRAWL_CARD = new Item(455); + + /** + * The name of bars. + */ + public static final String[] NAMES = new String[] { "BlueMoon Inn", "Blueberry's Bar", "Dead Man's Chest", "Dragon Inn", "Flying Horse Inn", "Foresters Arms", "Jolly Boar Inn", "Karamja Spirits bar", "Rising Sun Inn", "Rusty Anchor Inn" }; + + /** + * The component used to draw the completed bars on. + */ + public static final Component COMPONENT = new Component(220); + + /** + * The player. + */ + private final Player player; + + /** + * The bars completed. + */ + private final boolean[] bars = new boolean[10]; + + /** + * If the quest has been started. + */ + private boolean started; + + /** + * Constructs a new {@code BarcrawlManager} {@code Object}. + * @param player the player. + */ + public BarcrawlManager(final Player player) { + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + if (started) { + buffer.put((byte) 1); + } + for (int i = 0; i < bars.length; i++) { + if (bars[i]) { + buffer.put((byte) 2); + buffer.put((byte) i); + } + } + buffer.put((byte) 0); + } + + public void parse(JSONObject data){ + started = (boolean) data.get("started"); + JSONArray barsVisisted = (JSONArray) data.get("bars"); + for(int i = 0; i < barsVisisted.size(); i++){ + bars[i] = (boolean) barsVisisted.get(i); + } + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get() & 0xFF) != 0) { + switch (opcode) { + case 1: + started = true; + break; + case 2: + bars[buffer.get()] = true; + break; + } + } + } + + /** + * Method used to read the card. + */ + public void read() { + if (isFinished()) { + player.getPacketDispatch().sendMessage("You are too drunk to be able to read the barcrawl card."); + ; + return; + } + player.getInterfaceManager().open(COMPONENT); + drawCompletions(); + } + + /** + * Draws the completed bars on the interface. + */ + private void drawCompletions() { + player.getPacketDispatch().sendString("The Official Alfred Grimhand Barcrawl!", 220, 1); + boolean complete; + for (int i = 0; i < bars.length; i++) { + complete = bars[i]; + player.getPacketDispatch().sendString((complete ? "" : "") + NAMES[i] + " - " + (complete ? "Complete!" : "Not Completed..."), 220, 3 + i); + } + } + + /** + * Completes a bar challenge. + * @param index the index. + */ + public void complete(int index) { + bars[index] = true; + } + + /** + * Checks if the barcrawl quest is completed. + * @return {@code True} if so. + */ + public boolean isFinished() { + for (int i = 0; i < bars.length; i++) { + if (!isCompleted(i)) { + return false; + } + } + return true; + } + + /** + * Resets the bars. + */ + public void reset() { + started = false; + for (int i = 0; i < bars.length; i++) { + bars[i] = false; + } + } + + /** + * Checks if a bar is completed. + * @param index the index. + * @return {@code True} if completed. + */ + public boolean isCompleted(int index) { + return bars[index]; + } + + /** + * Checks if the player has the card. + * @return the card. + */ + public boolean hasCard() { + return player.getInventory().containsItem(BARCRAWL_CARD) || player.getBank().containsItem(BARCRAWL_CARD); + } + + /** + * Gets the started. + * @return The started. + */ + public boolean isStarted() { + return started; + } + + /** + * Sets the started. + * @param started The started to set. + */ + public void setStarted(boolean started) { + this.started = started; + } + + public boolean[] getBars() { + return bars; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin.java b/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin.java new file mode 100644 index 000000000..6dc2a949a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/miniquest/barcrawl/BarcrawlPlugin.java @@ -0,0 +1,382 @@ +package core.game.content.quest.miniquest.barcrawl; + +import core.cache.def.impl.NPCDefinition; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.StringUtils; + +/** + * Handles the barcrawl npc interactions. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BarcrawlPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (BarcrawlType type : BarcrawlType.values()) { + for (int npc : type.getNpc()) { + NPCDefinition.forId(npc).getHandlers().put("option:talk-to", this); + } + } + PluginManager.definePlugin(new BarcrawlDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final BarcrawlType type = BarcrawlType.forId(node.getId()); + if (player.getBarcrawlManager().isFinished() || !player.getBarcrawlManager().isStarted() || player.getBarcrawlManager().isCompleted(type.ordinal())) { + player.getDialogueInterpreter().open(node.getId(), node); + } else { + player.getDialogueInterpreter().open("barcrawl dialogue", node.getId(), type); + } + return true; + } + + /** + * A barcrawl type npc. + * @author 'Vexia + * @version 1.0 + */ + public enum BarcrawlType { + BLUE_MOON(733, 50, "Uncle Humphrey's Gutrot", new String[] { "Oh no not another of you guys. These barbarian", "barcrawls cause too much damage to my bar." }, new String[] { "You're going to have to pay me 50 gold for the Uncle", "Humphrey's Gutrot." }) { + @Override + public void effect(final Player player) { + player.sendChat("Blearrgh!"); + player.getImpactHandler().manualHit(player, 1, HitsplatType.NORMAL); + addBonus(player, 1, Skills.ATTACK, Skills.DEFENCE, Skills.STRENGTH, Skills.SMITHING); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessages("Your insides feel terrible.", "The bartender signs your card."); + } else { + player.getPacketDispatch().sendMessages("You buy some " + getName() + ".", "You drink the " + getName() + "."); + } + } + }, + BLUEBERRY_BAR(848, 10, "Fire Toad Blast", new String[] { "Ah, you've come to the best stop on your list! I'll give", "you my famous Fire Toad last! It'll cost you 10", "coins." }) { + @Override + public void effect(final Player player) { + player.getImpactHandler().manualHit(player, 1, HitsplatType.NORMAL); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessage("Blueberry signs your card."); + } else { + super.message(player, start); + player.getPacketDispatch().sendMessage("Your mouth and throat burns as you gulp it down."); + } + } + + }, + DEADMAN_CHEST(735, 15, "Supergrog", new String[] { "Haha time to be breaking out the old Supergrog. That'll", "be 15 coins please." }) { + @Override + public void effect(final Player player) { + addBonus(player, 1, Skills.ATTACK, Skills.DEFENCE, Skills.HERBLORE, Skills.CONSTRUCTION, Skills.PRAYER); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessages("You stagger backwards.", "You think you see 2 bartenders signing 2 barcrawl cards."); + } else { + player.getPacketDispatch().sendMessages("The bartender serves you a glass of strange thick dark liquid.", "You wince and drink it."); + } + } + + }, + DRAGON_INN(739, 12, "Fire Brandy", new String[] { "I suppose you'll be wanting some Fire Brandy. That'll", "cost you 12 coins." }) { + @Override + public void effect(final Player player) { + addBonus(player, 1, Skills.ATTACK, Skills.DEFENCE); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessages("Your vision blurs and you stagger slightly.", "You can just about make out the bartender signing your barcrawl card."); + } else { + player.getPacketDispatch().sendMessages("The bartender hands you a small glass and sets light to the contents.", "You blow out the flame and drink it."); + } + } + + }, + FLYING_HORSE_INN(737, 8, "Heart Stopper", new String[] { "Fancy a bit of Heart Stopper then do you? It'll only be", "8 coins." }) { + @Override + public void effect(final Player player) { + player.getImpactHandler().manualHit(player, (int) (player.getSkills().getLevel(Skills.HITPOINTS) * 0.15), HitsplatType.NORMAL); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessages("You clutch your chest.", "Through your tears you see the bartender...", "signing your barcrawl card."); + } else { + player.getPacketDispatch().sendMessages("The bartender hands you a shot of Heart Stopper.", "You grimace and drink it."); + } + } + }, + FORESTERS_ARMS(738, 18, "Liverbane Ale", new String[] { "Oh you're a barbarian then. Now which of these barrels", "contained the Liverbane Ale? That'll be 18 coins please." }) { + @Override + public void effect(final Player player) { + addBonus(player, Skills.ATTACK, Skills.DEFENCE, Skills.FLETCHING, Skills.FIREMAKING, Skills.WOODCUTTING); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessages("The room seems to be swaying.", "The bartender scrawls his signature on your card."); + } else { + player.getPacketDispatch().sendMessages("The bartender gives you a glass of Liverbane Ale.", "You gulp it down."); + } + } + + }, + JOLLY_BOAR(731, 10, "Olde Suspiciouse", new String[] { "Ah, there seems to be a fair few doing that one these", "days. My supply of Olde suspiciouse is starting to run", "low, it'll cost you 10 coins." }) { + @Override + public void effect(final Player player) { + addBonus(player, 1, Skills.ATTACK, Skills.DEFENCE, Skills.STRENGTH, Skills.MINING, Skills.CRAFTING, Skills.MAGIC); + player.getImpactHandler().manualHit(player, 1, HitsplatType.NORMAL); + player.getDialogueInterpreter().sendDialogues(player, null, "Thanksh very mush..."); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessages("Your head is spinning.", "The bartender signs your card."); + } else { + player.getPacketDispatch().sendMessages("You buy a pint of Olde Suspiciouse.", "You gulp it down."); + } + } + }, + KARAMJA_SPIRITS(568, 7, "Ape Bite Liqueur", new String[] { "Ah, you'll be wanting some Ape Bite Liqueur then. It's", "got a lovely bannana taste, and it'll only cost you 7", "coins." }) { + @Override + public void effect(final Player player) { + addBonus(player, 1, Skills.ATTACK, Skills.DEFENCE); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessages("Zamo signs your card."); + player.getDialogueInterpreter().sendDialogues(player, null, "Mmmmm, dat was luverly..."); + } else { + player.getPacketDispatch().sendMessages("You buy some Ape Bite liqueur.", "You swirl it around and swallow it."); + } + } + + }, + RISING_SUNN_INN(new int[] { 3217, 736 }, 70, "Hand of Death Cocktail", new String[] { "Heehee, this'll be fun!" }, new String[] { "You'll be after our Hand of Death cocktail, then. Lots", "of expensive parts to the cocktail, though, so it will cost", "you 70 coins." }) { + @Override + public void effect(final Player player) { + addBonus(player, 1, Skills.ATTACK, Skills.DEFENCE, Skills.RANGE, Skills.FIREMAKING); + player.getImpactHandler().manualHit(player, 1, HitsplatType.NORMAL); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessages("The barmaid giggles.", "The barmaid signs your card."); + } else { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.SHAKE, 4, 4, 1, 4, 4)); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 4, 4, 1, 4, 4)); + return true; + } + }); + player.getPacketDispatch().sendMessages("You buy a Hand of Death cocktail.", "You drink the cocktail.", "You stumble around the room."); + } + } + }, + RUSTY_ANCHOR_INN(734, 8, "Black Skull Ale", new String[] { "Okay, one Black Skull Ale coming up. Eight coins, please." }) { + @Override + public void effect(final Player player) { + player.sendChat("Hiccup!"); + } + + @Override + public void message(final Player player, boolean start) { + if (!start) { + super.message(player, start); + } else { + player.getPacketDispatch().sendMessages("You buy a Black Skull Ale...", "You drink your Black Skull Ale...", "Your vision blurs."); + } + } + }; + + /** + * The npc id. + */ + private final int[] npc; + + /** + * The name. + */ + private final String name; + + /** + * The coin required. + */ + private final Item coins; + + /** + * The dialogue to use. + */ + private final String[][] dialogue; + + /** + * Constructs a new {@code BarcrawlType} {@code Object}. + * @param npc the npc. + * @param name the name. + * @param coins the coins. + * @param dialogue the dialogue. + */ + private BarcrawlType(int npc, Item coins, String name, String[][] dialogue) { + this.npc = new int[] { npc }; + this.name = name; + this.coins = coins; + this.dialogue = dialogue; + } + + /** + * Constructs a new {@code BarcrawlType} {@code Object}. + * @param npc the npc. + * @param coins the coins. + */ + private BarcrawlType(int npc, int coins, final String name, String[] first, String[] second) { + this.npc = new int[] { npc }; + this.name = name; + this.coins = new Item(995, coins); + this.dialogue = new String[][] { first, second }; + } + + /** + * Constructs a new {@code BarcrawlType} {@code Object}. + * @param npc the npc. + * @param coins the coins. + * @param first the first dial. + * @param second the second dial. + */ + private BarcrawlType(int[] npc, int coins, String name, String[] first, String[] second) { + this.npc = npc; + this.name = name; + this.coins = new Item(995, coins); + this.dialogue = new String[][] { first, second }; + } + + /** + * Constructs a new {@code BarcrawlType} {@code Object}. + * @param npc the npc. + * @param coins the coins. + */ + private BarcrawlType(int npc, int coins, String name, String[] first) { + this.npc = new int[] { npc }; + this.name = name; + this.coins = new Item(995, coins); + this.dialogue = new String[][] { first }; + } + + /** + * Method used to effect the player. + * @param player the player. + */ + public void effect(final Player player) { + + } + + /** + * Method used to message the player. + * @param player the player. + * @param start or finish. + */ + public void message(final Player player, boolean start) { + if (!start) { + player.getPacketDispatch().sendMessage("The bartender signs your card."); + } else { + player.getPacketDispatch().sendMessage("You buy a " + (StringUtils.isPlusN(getName()) ? "an" : "a") + " " + getName() + "."); + } + } + + /** + * Method used to a skill bonus. + * @param player the player. + * @param amount the amount. + * @param skills the skills. + */ + public void addBonus(final Player player, int amount, final int... skills) { + for (int i : skills) { + player.getSkills().updateLevel(i, -amount, 0); + } + } + + /** + * Gets the bar crawl type. + * @param id the id. + * @return the type. + */ + public static BarcrawlType forId(int id) { + for (BarcrawlType type : values()) { + for (int npc : type.getNpc()) { + if (npc == id) { + return type; + } + } + } + return null; + } + + /** + * Gets the npc. + * @return The npc. + */ + public int[] getNpc() { + return npc; + } + + /** + * Gets the coins. + * @return The coins. + */ + public Item getCoins() { + return coins; + } + + /** + * Gets the dialogue. + * @return The dialogue. + */ + public String[][] getDialogue() { + return dialogue; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/DakhThoulanAegisDialogue.java b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/DakhThoulanAegisDialogue.java new file mode 100644 index 000000000..1beead186 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/DakhThoulanAegisDialogue.java @@ -0,0 +1,73 @@ +package core.game.content.quest.miniquest.surok; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the mishkaun dorn dialogue. + * @author Vexia + */ +public class DakhThoulanAegisDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code MishkalunDornDialogue} {@Code + * Object} + * @param player the player. + */ + public DakhThoulanAegisDialogue(Player player) { + super(player); + } + + /** + * Constructs a new {@Code MishkalunDornDialogue} {@Code + * Object} + */ + public DakhThoulanAegisDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DakhThoulanAegisDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hi there."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Hello, you one. What brings you to our humble", "dwelling?"); + stage++; + break; + case 1: + player("I was wondering what this place was?"); + stage++; + break; + case 2: + npc("These are the Tunnels of Chaos. They radiate", "with the energy of chaos magic. At the far end of the", "tunnel, you will find a portal to the Chaos Altar itself", "where chaos runes are crafted!"); + stage++; + break; + case 3: + player("Thanks for your time."); + stage++; + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5840 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.java b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.java new file mode 100644 index 000000000..e7faf1d4e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/HuntForSurokPlugin.java @@ -0,0 +1,42 @@ +package core.game.content.quest.miniquest.surok; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the hunt for surok mini quest. + * @author Vexia + */ + +public class HuntForSurokPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new DakhThoulanAegisDialogue()); + PluginManager.definePlugin(new MishkalunDornDialogue()); + PluginManager.definePlugin(new SilasDahcsnuDialogue()); + PluginManager.definePlugin(new SurokMagisDialogue()); + ObjectDefinition.forId(28780).getHandlers().put("option:use", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "use": + switch (node.getId()) { + case 28780: + player.teleport(new Location(3326, 5469, 0)); + break; + } + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/MishkalunDornDialogue.java b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/MishkalunDornDialogue.java new file mode 100644 index 000000000..5c0b83772 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/MishkalunDornDialogue.java @@ -0,0 +1,97 @@ +package core.game.content.quest.miniquest.surok; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the mishkaun dorn dialogue. + * @author Vexia + */ +public class MishkalunDornDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code MishkalunDornDialogue} {@Code + * Object} + * @param player the player. + */ + public MishkalunDornDialogue(Player player) { + super(player); + } + + /** + * Constructs a new {@Code MishkalunDornDialogue} {@Code + * Object} + */ + public MishkalunDornDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MishkalunDornDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc("You are excused. And you are welcome."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Excuse me...er..thanks."); + stage++; + break; + case 1: + npc("We are the Order of the Dagon'hai."); + stage++; + break; + case 2: + player("Who are you?"); + stage++; + break; + case 3: + npc("Through my magic, I can see a short way into", "the future."); + stage++; + break; + case 4: + player("How do you seem to know what i'm going to", "say? ...Er...oh."); + stage++; + break; + case 5: + npc("These are the Tunnels of Chaos."); + stage++; + break; + case 6: + player("What is...uh..aha! I'm not going to ask that. So you got it", "wrong!"); + stage++; + break; + case 7: + npc("Indeed. You are very clever."); + stage++; + break; + case 8: + player("So I won!"); + stage++; + break; + case 9: + npc("Yes."); + stage++; + break; + case 10: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5839 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/SilasDahcsnuDialogue.java b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/SilasDahcsnuDialogue.java new file mode 100644 index 000000000..ae7079bc1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/SilasDahcsnuDialogue.java @@ -0,0 +1,81 @@ +package core.game.content.quest.miniquest.surok; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the mishkaun dorn dialogue. + * @author Vexia + */ +public class SilasDahcsnuDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code SilasDahcsnuDialogue} {@Code + * Object} + * @param player the player. + */ + public SilasDahcsnuDialogue(Player player) { + super(player); + } + + /** + * Constructs a new {@Code SilasDahcsnuDialogue} {@Code + * Object} + */ + public SilasDahcsnuDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SilasDahcsnuDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hello there."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Can't you see that I'm busy here?"); + stage++; + break; + case 1: + player("Oh, Sorry, you don't look very busy."); + stage++; + break; + case 2: + npc("Don't look busy? I've got a lot of important work to do", "here."); + stage++; + break; + case 3: + player("Really? What do you do?"); + stage++; + break; + case 4: + npc("That doesn't concern you. What are you doing", "here anyway?"); + stage++; + break; + case 5: + player("None of your business!"); + stage++; + break; + case 6: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5841 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/SurokMagisDialogue.java b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/SurokMagisDialogue.java new file mode 100644 index 000000000..902d15c18 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/miniquest/surok/SurokMagisDialogue.java @@ -0,0 +1,201 @@ +package core.game.content.quest.miniquest.surok; + +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; + +/** + * Handles the surok magis dialogue. + * @author Vexia + */ +public class SurokMagisDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code SurokMagisDialogue} {@Code Object} + * @param player the player. + */ + public SurokMagisDialogue(Player player) { + super(player); + } + + /** + * Constructs a new {@Code SurokMagisDialogue} {@Code Object} + */ + public SurokMagisDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SurokMagisDialogue(player); + } + + @Override + public boolean open(Object... args) { + player(player.getUsername() + "! The meddling adventurer."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Surok! What are you doing here?", "How did you-"); + stage++; + break; + case 1: + npc("Escape from Varrock Palace Library? That cruel", "imprisonment you left me in?"); + stage++; + break; + case 2: + player("Well...er..yes."); + stage++; + break; + case 3: + npc("Bah! A mere trifle for a powerful mage such as myself.", "There were plenty of other foolish people to help with", "my plans, you would do well to stay out of my way."); + stage++; + break; + case 4: + player("Stop, Surok! As a member of the Varrock Palace Secret", "Guard, I arrest you! Again!"); + stage++; + break; + case 5: + npc("Ha! I tire of this meaningless drivel. Catch me if you can."); + stage++; + break; + case 6: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7002, 7136 }; + } + + /** + * Handles a surok cutscene. + * @author Vexia + */ + public static class SurokCutscene extends CutscenePlugin { + + /** + * The surok scene. + */ + private SurokScene scene; + + /** + * Constructs a new {@Code SurokCutscene} {@Code Object} + */ + public SurokCutscene() { + super("Surok Cutscene"); + } + + /** + * Constructs a new {@Code SurokCutscene} {@Code Object} + * @param player the player. + */ + public SurokCutscene(Player player) { + this(); + this.player = player; + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + scene = (SurokScene) args[0]; + region = DynamicRegion.create(scene.getRegionId()); + setRegionBase(); + registerRegion(region.getId()); + return super.start(player, login, args); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new SurokCutscene(p); + } + + @Override + public Location getStartLocation() { + return base.transform(scene.getStartData()[0], scene.getStartData()[1], 0); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + + } + + /** + * Gets the scene. + * @return the scene + */ + public SurokScene getScene() { + return scene; + } + + /** + * Sets the bascene. + * @param scene the scene to set. + */ + public void setScene(SurokScene scene) { + this.scene = scene; + } + + /** + * The surok scene. + * @author Vexia + */ + public static enum SurokScene { + ESCAPE(-1, new int[] {}); + + /** + * The region id. + */ + private final int regionId; + + /** + * The start data. + */ + private final int[] startData; + + /** + * Constructs a new {@Code SurokScene} {@Code Object} + * @param regionId the region id. + * @param startData the start data. + */ + private SurokScene(int regionId, int[] startData) { + this.regionId = regionId; + this.startData = startData; + } + + /** + * Gets the regionId. + * @return the regionId + */ + public int getRegionId() { + return regionId; + } + + /** + * Gets the startData. + * @return the startData + */ + public int[] getStartData() { + return startData; + } + + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/learningtheropes/CellarMapZone.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/learningtheropes/CellarMapZone.java new file mode 100644 index 000000000..2c2211712 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/learningtheropes/CellarMapZone.java @@ -0,0 +1,98 @@ +package core.game.content.quest.tutorials.learningtheropes; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.zone.MapZone; +import core.game.world.update.flag.context.Animation; + +/** + * @author Ethan Kyle Millard + * @since Wed, October 10, 2018 @ 1:03 PM + */ +public class CellarMapZone extends MapZone { + + private static final NPC[] NPCS = new NPC[]{ + /** sir vant */ + NPC.create(7938, Location.create(2524, 5005, 0), Direction.NORTH), + /** goblin*/ + NPC.create(7965, Location.create(2524, 4997, 0), Direction.NORTH), + }; + + public static final CellarMapZone INSTANCE = new CellarMapZone(); + + /** + * The region of the zone. + */ + private DynamicRegion region; + + /** + * The base location. + */ + private Location base; + + + /** + * Constructs a new {@code MapZone} {@code Object}. + */ + public CellarMapZone() { + super("Cellar Map Zone", true); + } + + @Override + public void configure() { + region = DynamicRegion.create(10062); + setRegionBase(); + registerRegion(region.getId()); + setNpcs(); + } + + public void create(Player player) { + configure(); + player.teleport(getBase().transform(28, 12, 0)); + } + + private void setNpcs() { + for (NPC n : NPCS) { + n = NPC.create(n.getId(), n.getLocation(), n.getDirection()); + n.setLocation(base.transform(n.getLocation().getLocalX(), n.getLocation().getLocalY(), 0)); + n.setRespawn(false); + n.init(); + n.setWalks(false); + n.animate(new Animation(-1)); + } + } + + /** + * Sets the region base. + */ + private void setRegionBase() { + if (region != null) { + setBase(Location.create(region.getBorders().getSouthWestX(), region.getBorders().getSouthWestY(), 0)); + } + } + + /** + * Gets the base. + * + * @return the base + */ + public Location getBase() { + return base; + } + + /** + * Sets the base. + * + * @param base the base to set. + */ + public void setBase(Location base) { + this.base = base; + } + + public static CellarMapZone get() { + return INSTANCE; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene.java new file mode 100644 index 000000000..1d798b190 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/learningtheropes/LTRDragonFightCutscene.java @@ -0,0 +1,355 @@ +package core.game.content.quest.tutorials.learningtheropes; + +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Initializable; + +/** + * @author Ethan Kyle Millard + * @since Mon, October 08, 2018 @ 5:00 PM + */ +@Initializable +public class LTRDragonFightCutscene extends CutscenePlugin { + + private static final NPC[] NPCS = new NPC[] { + /** dragon */ + NPC.create(7943, Location.create(2524, 5015, 0), Direction.SOUTH), + /** sir vant */ + NPC.create(7938, Location.create(2524, 5005, 0), Direction.NORTH), + /** goblin*/ + NPC.create(7964, Location.create(2522, 5000, 0), Direction.NORTH), + }; + + private static final Animation SIR_VANT_BLOCK = Animation.create(9941); + private static final Animation SIR_VANT_STAB = Animation.create(9938); + private static final Animation SIR_VANT_SLASH = Animation.create(9939); + private static final Animation SIR_VANT_BLOCK_FIRE = Animation.create(9942); + private static final Animation SIR_VANT_BIG_SLASH = Animation.create(9943); + private static final Animation DRAGON_ATTACK = Animation.create(9922); + private static final Animation DRAGON_BLOCK = Animation.create(9923); + private static final Animation DRAGON_FIRE_BREATH = Animation.create(9919); + private static final Graphics DRAGON_FIRE_BREATH_GFX = new Graphics(1, 64); + private static final Animation DRAGON_SLASHED = Animation.create(9921); + private static final Animation DRAGON_STANDING_UNCUT = Animation.create(9914); + private static final Animation DRAGON_STANDING_CUT = Animation.create(9915); + private static final Animation DRAGON_STANDING_WOBBLING = Animation.create(9916); + private static final Animation DRAGON_STANDING_CUTTING = Animation.create(9917); + private static final Animation DRAGON_FLYING = Animation.create(9913); + private static final Animation GOBLIN_FALLING = Animation.create(9965); + private static final Animation GOBLIN_PLUNDERING = Animation.create(9963); + private static final Animation GOBLIN_HIT_ON_HEAD= Animation.create(9964); + + + + private final FightPulse fightPulse = new FightPulse(); + + + public LTRDragonFightCutscene() { + this(null); + } + + public LTRDragonFightCutscene(final Player player) { + super("ltr:dragon_fight_cs"); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new LTRDragonFightCutscene(p); + } + + @Override + public Location getSpawnLocation() { + return getBase().transform(28, 12, 0); + } + + @Override + public Location getStartLocation() { + return getBase().transform(28, 12, 0); + } + + @Override + public void register() { + super.register(); + } + + @Override + public void open() { + ZoneBuilder.configure(CellarMapZone.get()); + setNpcs(); + GameWorld.getPulser().submit(fightPulse); + player.lock(); + player.getLocks().lockMovement(1000000); + camera(31, 12, -45, 0, 300, 95); + } + + + public final class FightPulse extends Pulse { + + /** + * Represents the counter. + */ + private int counter; + + /** + * Constructs a new {@code FightPulse} {@code Object}. + */ + public FightPulse() { + super(1, player); + } + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + System.out.println("Fight begin"); + getSirVant().getSkills().setStaticLevel(Skills.HITPOINTS, 99); + getSirVant().getSkills().setLifepoints(99); + getDragon().getSkills().setStaticLevel(Skills.HITPOINTS, 99); + getDragon().getSkills().setLifepoints(99); + System.out.println("getGoblin().getLocation().getLocalX() = " + getGoblin().getLocation().getLocalX()); + System.out.println("getGoblin().getLocation().getLocalY() = " + getGoblin().getLocation().getLocalY()); + break; + + case 4: + camera(28, 21, 1, 4, 220, 100); + Path path = Pathfinder.find(getDragon(), getDragon().getLocation().transform(-1, -9, 0), true, Pathfinder.DUMB, (a, b, c) -> 0); + path.walk(getDragon()); + break; + + case 9: + camera(31, 12, -5, 3, 300, 100); + break; + + case 13: + camera(32, 10, -4, 5, 450, 100); + break; + + case 15: + getDragon().animate(DRAGON_ATTACK);//attack + getSirVant().animate(SIR_VANT_BLOCK);//block + getSirVant().getImpactHandler().manualHit(getDragon(), 12, ImpactHandler.HitsplatType.NORMAL); + break; + + case 17: + getDragon().animate(DRAGON_BLOCK); + getSirVant().animate(SIR_VANT_STAB); + getDragon().getImpactHandler().manualHit(getSirVant(), 11, ImpactHandler.HitsplatType.NORMAL); + break; + + case 19: + getDragon().animate(DRAGON_BLOCK); + getSirVant().animate(SIR_VANT_SLASH); + getDragon().getImpactHandler().manualHit(getSirVant(), 8, ImpactHandler.HitsplatType.NORMAL); + break; + + case 21: + getDragon().animate(DRAGON_FIRE_BREATH); + getDragon().graphics(DRAGON_FIRE_BREATH_GFX); + getSirVant().animate(SIR_VANT_BLOCK_FIRE); + getSirVant().getImpactHandler().manualHit(getDragon(), 18, ImpactHandler.HitsplatType.NORMAL); + break; + + case 23: + getSirVant().sendChat("Look out behind you!"); + break; + + case 25: + camera(32, 13, -5, -5, 300, 100); + getGoblin().animate(GOBLIN_FALLING); + break; + case 26: + camera(31, 9, -3, -3, 250, 75); + break; + case 27: + path = Pathfinder.find(getGoblin(), getGoblin().getLocation().transform(2, -3, 0), true, Pathfinder.DUMB, (a, b, c) -> 0); + path.walk(getGoblin()); + break; + + case 30: + getGoblin().sendChat("What can I steal in here?"); + getGoblin().animate(GOBLIN_PLUNDERING); + break; + + case 34: + camera(32, 10, -3, 5, 500, 100); + break; + + case 35: + getDragon().animate(DRAGON_FLYING); + break; + + case 39: + getDragon().animate(DRAGON_STANDING_UNCUT); + break; + case 40: + getDragon().animate(DRAGON_STANDING_CUT); + getSirVant().animate(SIR_VANT_BIG_SLASH); + getDragon().getImpactHandler().manualHit(getSirVant(), 30, ImpactHandler.HitsplatType.NORMAL); + break; + case 42: + getDragon().animate(DRAGON_STANDING_WOBBLING); + break; + + case 45: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraContext.CameraType.SHAKE, 4, 4, 1200, 4, 4)); + camera(31, 9, -3, -3, 250, 45); + break; + case 46: + getGoblin().face(player); + break; + case 47: + getGoblin().animate(GOBLIN_HIT_ON_HEAD); + break; + case 50: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraContext.CameraType.SHAKE, 3, 2, 2, 2, 2)); + getGoblin().getStateManager().set(EntityState.STUNNED, 4); + player.face(getGoblin()); + break; + case 53: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraContext.CameraType.RESET, 5, 2, 450, 100, 0)); + break; + case 54: + camera(28, 5, 2, 6, 450, 100); + break; + case 55: + path = Pathfinder.find(getDragon(), getDragon().getLocation().transform(0, 9, 0), true, Pathfinder.DUMB, (a, b, c) -> 0); + path.walk(getDragon()); + break; + case 60: + System.out.println("Fight end"); + LTRDragonFightCutscene.this.stop(true); + TutorialStage.load(player, 3, false); + CellarMapZone.get().create(player); + return true; + case 61: + break; + } + return !player.isActive(); + } + + @Override + public void stop() { + super.stop(); + clearNpcs(); + } + + /** + * Gets the counter. + * + * @return the counter. + */ + public int getCounter() { + return counter; + } + } + + /** + * Method used to handle the camera. + * + * @param x + * the x offset. + * @param y + * the y offset. + * @param xRot + * the xRotation. + * @param yRot + * the yRotation. + * @Param height the height. + */ + private void camera(int x, int y, int xRot, int yRot, int height, int speed) { + Location loc = base.transform(x, y, 0); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraContext.CameraType.POSITION, loc.getX(), loc.getY(), height, 1, speed)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraContext.CameraType.ROTATION, loc.getX() + xRot, loc.getY() + yRot, height, 1, speed)); + } + + @Override + public void configure() { + region = DynamicRegion.create(10062); + setRegionBase(); + registerRegion(region.getId()); + } + + private void setNpcs() { + for (NPC n : NPCS) { + n = NPC.create(n.getId(), n.getLocation(), n.getDirection()); + n.setLocation(base.transform(n.getLocation().getLocalX(), n.getLocation().getLocalY(), 0)); + n.setRespawn(false); + n.init(); + n.setWalks(false); + } + } + + @Override + public void stop(boolean fade) { + super.stop(false); + player.teleport(Location.create(2524, 5004, 0)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraContext.CameraType.RESET, 0, 0, 0, 0, 0)); + } + + /** + * Method used to clear all the npcs. + */ + private void clearNpcs() { + GameWorld.getPulser().submit(new Pulse(5) { + @Override + public boolean pulse() { + for (NPC n : region.getPlanes()[0].getNpcs()) { + n.clear(); + } + return true; + } + + }); + } + /** + * Gets the npc. + * + * @param id + * the id. + * @return the npc. + */ + private NPC getNpc(int id) { + for (NPC n : region.getPlanes()[0].getNpcs()) { + if (n.getId() == id) { + return n; + } + } + return null; + } + + private void walk(NPC npc, final Location location) { + Pathfinder.find(npc, location, true, Pathfinder.DUMB).walk(npc); + } + + public NPC getDragon() { + return getNpc(7943); + } + public NPC getSirVant() { + return getNpc(7938); + } + public NPC getGoblin() { + return getNpc(7964); + } + + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/learningtheropes/SirVantDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/learningtheropes/SirVantDialogue.java new file mode 100644 index 000000000..5fc5e3547 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/learningtheropes/SirVantDialogue.java @@ -0,0 +1,127 @@ +package core.game.content.quest.tutorials.learningtheropes; + +import core.game.container.impl.EquipmentContainer; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; + +/** + * @author Ethan Kyle Millard + * @since Mon, October 08, 2018 @ 4:19 PM + */ +@Initializable +public class SirVantDialogue extends DialoguePlugin { + + + /** + * Default Constructor + */ + public SirVantDialogue() { + /** + * Leave this empty + */ + } + + public SirVantDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SirVantDialogue(player); + } + + @Override + public boolean open(Object... args) { + int tut_stage = TutorialSession.getExtension(player).getStage(); + System.out.println("tut_stage = " + tut_stage); + switch (tut_stage) { + case 0: + case 1: + case 2: + case 72: + npc(FacialExpression.JOLLY, "My Word! You scared me there, friend. I have no idea", "where you came from, but you have fantastic timing.", "You see, I have come across a dragon."); + setStage(1); + break; + case 3: + player.getEquipment().replace(new Item(9703), EquipmentContainer.SLOT_WEAPON); + player.getEquipment().replace(new Item(9704), EquipmentContainer.SLOT_SHIELD); + npc("I think we have found a job for you, whoever you are.", "Here, take this sword and shield."); + setStage(10); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + player("A dragon?"); + next(); + break; + case 2: + npc("Oh yes. It's not usually a problem. After all, I am a", "White Knight! I just haven't really had time to prepare:", "food, runes, legions of other White Knights - those sorts", "of things."); + next(); + break; + case 3: + player ("You didn't prepare for facing a dragon?"); + next(); + break; + case 4: + npc ("It's not as of I woke with a dragon-slaying urge! I", "was on my way through Lumbridge when it started", "attacking. It's a rather larger, three-headed variant. Very", "rare."); + next(); + break; + case 5: + player ("So, what can I do?"); + next(); + break; + case 6: + npc ("You can keep back - it's returning!"); + next(); + break; + case 7: + end(); + TutorialStage.load(player, 2, false); + break; + case 10: + npc("I think the value of this property has slumped a little."); + next(); + break; + case 11: + player(FacialExpression.ASKING, "A little? It's got a huge dragon on it!"); + next(); + break; + case 12: + npc(FacialExpression.JOLLY, "I'm sure the owners has no idea when they bought it.", "It would take and interesting individual to deliberately","build a cellar in a dragon's den."); + next(); + break; + case 13: + npc("I believe this dragon has been asleep for a while - at", "least as long as it has taken Lumbridge, the town above","us, to be established. Something must have roused the","dragon - a large noise, tail cramp, the smell of damsels."); + next(); + break; + case 14: + npc("Don't worry, the goblin is stunned, so it can't hurt you", "at the moment. You should know something about","basic combat before tackling it."); + next(); + break; + case 15: + npc("Now, I have to keep watch for the dragon."); + next(); + break; + case 16: + end(); + TutorialStage.load(player, 4, false); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {7938}; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/BasicStarter.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/BasicStarter.java new file mode 100644 index 000000000..7ea33875e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/BasicStarter.java @@ -0,0 +1,44 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManifest; +import core.plugin.PluginType; + +/** + * Basic starter until tutorial is completed. + * + * @author Michael Sasse (https://github.com/mikeysasse/) + */ +@Initializable +@PluginManifest(type = PluginType.LOGIN) +public class BasicStarter implements Plugin { + + private static final int[][] STARTER_ITEMS = { { 1351, 1 }, { 590, 1 }, + { 303, 1 }, { 315, 1 }, { 1925, 1 }, { 1931, 1 }, { 2309, 1 }, + { 1265, 1 }, { 1205, 1 }, { 1277, 1 }, { 1171, 1 }, { 841, 1 }, + { 882, 25 }, { 556, 25 }, { 558, 15 }, { 555, 6 }, { 557, 4 }, + { 559, 2 } }; + + public BasicStarter() { } + + @Override + public Plugin newInstance(Player player) throws Throwable { + if (player.getDetails().getLastLogin() == 0) { + //Redundant if the Tutorial Completion Dialogue is going to clear the bank, inventory and equipment after teleporting to Lumbridge. + //Causes a full inventory on tutorial island when the instructors are giving the player more items. + //The Starter pack array exists in the TutorialCompletionDialogue file... So could this file be deleted? + + /*for (int[] item : STARTER_ITEMS) { + player.getInventory().add(new Item(item[0], item[1])); + }*/ + } + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/BrotherBraceDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/BrotherBraceDialogue.java new file mode 100644 index 000000000..3a36d5693 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/BrotherBraceDialogue.java @@ -0,0 +1,136 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Represents the dialogue plugin used for the brother brace npc. + * @author Vexia + */ +@Initializable +public final class BrotherBraceDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BrotherBraceDialogue} {@code Object}. + */ + public BrotherBraceDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BrotherBraceDialogue} {@code Object}. + * @param player the player. + */ + public BrotherBraceDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BrotherBraceDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + switch (TutorialSession.getExtension(player).getStage()) { + case 60: + interpreter.sendDialogues(player, null, "Good day, brother my name's " + player.getUsername() + "."); + stage = 0; + break; + case 62: + interpreter.sendDialogues(npc, null, "This is your Prayer list. Prayers can help a lot in", "combat. Click on the prayer you wish to use to activate", "it and click it again to deactivate it."); + stage = 0; + break; + case 65: + interpreter.sendDialogues(npc, null, "Good. Now you have both menus open, I'll tell you a ", "little about each. You can add people to either list by", "clicking the add button then typing their name into the", "box that appears."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (TutorialSession.getExtension(player).getStage()) { + case 60: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "Hello, " + player.getUsername() + ". I'm Brother Brace. I'm here to tell", "you all about Prayer."); + stage = 1; + break; + case 1: + end(); + TutorialStage.load(player, 61, false); + break; + } + break; + case 62: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "Active prayers wil drain your Prayer Points which", "you can recharge by finding an altar or other holy spot", "and praying there."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "As you noticed, most enemies will drop bones when", "defeated. Burying bones by clicking them in your", "inventory will gain you Prayer experience."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, null, "I'm also the community officer 'round here, so it's my", "job to tell you about your friends and ignore list."); + stage = 3; + break; + case 3: + end(); + TutorialStage.load(player, 63, false); + break; + } + break; + case 65: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "You remove people from the lists in the same way. If", "you add someone to your ignore list they will not be", "able to talk to you or send any form of message to", "you."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "Your friends list shows the online status of your", "friends. Friends in the red are offline, friends in green", "are online and on the same server and friends in yellow", "are online but on a different server."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, null, "Are there rules on in-game behaviour? "); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, null, "Yes, you should read the rules of conduct on the", "website to make sure you do nothing to get yourself", "banned."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, null, "But in general, always try to be courteous to other", "players - remember the people in the game are real", "people with real feelings."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, null, "If you go 'round being abusive or causing trouble your", "character could end up being the one in trouble"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(player, null, "Okay thanks. I'll bear that in mind."); + stage = 7; + break; + case 7: + end(); + TutorialStage.load(player, 66, false); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 954 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/CharacterDesign.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/CharacterDesign.java new file mode 100644 index 000000000..52277ee56 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/CharacterDesign.java @@ -0,0 +1,398 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.appearance.Gender; +import core.game.node.entity.player.link.music.MusicEntry; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.amsc.MSPacketRepository; +import core.net.amsc.WorldCommunicator; +import core.tools.RandomFunction; + +/** + * Represents the class used to handle the character design. + * @author Emperor + * @author Vexia + * + */ +public final class CharacterDesign { + + private static final Item[] STARTER_PACK = new Item[] { new Item(1351, 1), new Item(590, 1), new Item(303, 1), new Item(315, 1), new Item(1925, 1), new Item(1931, 1), new Item(2309, 1), new Item(1265, 1), new Item(1205, 1), new Item(1277, 1), new Item(1171, 1), new Item(841, 1), new Item(882, 25), new Item(556, 25), new Item(558, 15), new Item(555, 6), new Item(557, 4), new Item(559, 2) }; + private static final Item[] STARTER_BANK = new Item[] { new Item( 995, 25)}; + + + /** + * The male head ids. + */ + private static final int[] MALE_HEAD_IDS = {0, 1, 2, 3, 4, 5, 6, 7, 8, 91, 92, 93, 94, 95, 96, 97, 261, 262, 263, 264, 265, 266, 267, 268}; + + /** + * The female head ids. + */ + private static final int[] FEMALE_HEAD_IDS = {45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280}; + + /** + * The male jaw ids. + */ + private static final int[] MALE_JAW_IDS = { 10, 11, 12, 13, 14, 15, 16, 17, 98, 99, 100, 101, 102, 103, 104, 305, 306, 307, 308}; + + /** + * The female jaw ids. + */ + private static final int[] FEMALE_JAW_IDS = { 1000 }; + + /** + * The male torso ids. + */ + private static final int[] MALE_TORSO_IDS = {18, 19, 20, 21, 22, 23, 24, 25, 111, 112, 113, 114, 115, 116 }; + + /** + * The female torso ids. + */ + private static final int[] FEMALE_TORSO_IDS = { 56, 57, 58, 59, 60, 153, 154, 155, 156, 157, 158}; + + /** + * The male arms ids. + */ + private static final int[] MALE_ARMS_IDS = {26, 27, 28, 29, 30, 31, 105, 106, 107, 108, 109, 110}; + + /** + * The female arms ids. + */ + private static final int[] FEMALE_ARMS_IDS = {61, 62, 63, 64, 65, 147, 148, 149, 150, 151, 152 }; + + /** + * The male hands ids. + */ + private static final int[] MALE_HANDS_IDS = {33, 34, 84, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126}; + + /** + * The female hands ids. + */ + private static final int[] FEMALE_HANDS_IDS = {67, 68, 127, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168}; + + /** + * The male legs ids. + */ + private static final int[] MALE_LEGS_IDS = {36, 37, 38, 39, 40, 85, 86, 87, 88, 89, 90}; + + /** + * The female legs ids. + */ + private static final int[] FEMALE_LEGS_IDS = {70, 71, 72, 73, 74, 75, 76, 77, 128, 129, 130, 131, 132, 133, 134 }; + + /** + * The male feet ids. + */ + private static final int[] MALE_FEET_IDS = { 42, 43 }; + + /** + * The female feet ids. + */ + private static final int[] FEMALE_FEET_IDS = { 79, 80 }; + + /** + * The male look ids. + */ + private static final int[][] MALE_LOOK_IDS = { MALE_HEAD_IDS, MALE_JAW_IDS, MALE_TORSO_IDS, MALE_ARMS_IDS, MALE_HANDS_IDS, MALE_LEGS_IDS, MALE_FEET_IDS }; + + /** + * The female look ids. + */ + private static final int[][] FEMALE_LOOK_IDS = { FEMALE_HEAD_IDS, FEMALE_JAW_IDS, FEMALE_TORSO_IDS, FEMALE_ARMS_IDS, FEMALE_HANDS_IDS, FEMALE_LEGS_IDS, FEMALE_FEET_IDS }; + + /** + * The hair colors. + */ + private static final int[] HAIR_COLORS = new int[] {20, 19, 10, 18, 4, 5, 15, 7, 0, 6, 21, 9, 22, 17, 8, 16, 11, 24, 23, 3, 2, 1, 14, 13, 12}; + + /** + * The torso colors. + */ + private static final int[] TORSO_COLORS = new int[] {24, 23, 2, 22, 12, 11, 6, 19, 4, 0, 9, 13, 25, 8, 15, 26, 21, 7, 20, 14, 10, 28, 27, 3, 5, 18, 17, 1, 16}; + + /** + * The leg colors. + */ + private static final int[] LEG_COLORS = new int[] {26, 24, 23, 3, 22, 13, 12, 7, 19, 5, 1, 10, 14, 25, 9, 0, 21, 8, 20, 15, 11, 28, 27, 4, 6, 18, 17, 2, 16}; + + /** + * The feet colors. + */ + private static final int[] FEET_COLORS = new int[] {0, 1, 2, 3, 4, 5}; + + /** + * The skin colors. + */ + private static final int[] SKIN_COLORS = new int[] {7, 6, 5, 4, 3, 2, 1, 0}; + + /** + * Method used to open the design. + * @param player the player. + */ + public static void open(final Player player) { + player.unlock(); + player.removeAttribute("char-design:accepted"); + player.getPacketDispatch().sendPlayerOnInterface(771, 79); + player.getPacketDispatch().sendAnimationInterface(9806, 771, 79); + player.getAppearance().changeGender(player.getAppearance().getGender()); + Component c = player.getInterfaceManager().openComponent(771); + if (c != null) { + c.setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { // Unclosable! + return player.getAttribute("char-design:accepted", false); + } + }); + } + reset(player); + player.getPacketDispatch().sendInterfaceConfig(771, 22, false); + player.getPacketDispatch().sendInterfaceConfig(771, 92, false); + player.getPacketDispatch().sendInterfaceConfig(771, 97, false); + player.getConfigManager().set(1262, player.getAppearance().isMale()); + } + + /** + * Handles the buttons. + */ + public static boolean handleButtons(Player player, int buttonId) { + switch (buttonId) { + case 37: + case 40: + player.getSettings().toggleMouseButton(); + break; + case 92://hair style + case 93: + changeLook(player, 0, buttonId == 93); + break; + case 97: + case 98://facial hair style + changeLook(player, 1, buttonId == 98); + break; + case 341: + case 342://torso style + changeLook(player, 2, buttonId == 342); + break; + case 345: + case 346://arms style + changeLook(player, 3, buttonId == 346); + break; + case 349: + case 350://wrists style + changeLook(player, 4, buttonId == 350); + break; + case 353: + case 354://legs style + changeLook(player, 5, buttonId == 354); + break; + case 357: + case 358://feet style + changeLook(player, 6, buttonId == 358); + break; + case 49: + case 52://change gender + changeGender(player, buttonId == 49); + break; + case 321://randomize body + randomize(player, false); + return true; + case 169: + randomize(player, true);//randomize hair + return true; + case 362://confirm + confirm(player, true); + return true; + } + if (buttonId >= 100 && buttonId <= 124) { + changeColor(player, 0, HAIR_COLORS, 100, buttonId); + } + if (buttonId >= 189 && buttonId <= 217) { + changeColor(player, 2, TORSO_COLORS, 189, buttonId); + } + if (buttonId >= 248 && buttonId <= 276) { + changeColor(player, 5, LEG_COLORS, 248, buttonId); + } + if (buttonId >= 307 && buttonId <= 312) { + changeColor(player, 6, FEET_COLORS, 307, buttonId); + } + if (buttonId <= 158 && buttonId >= 151) { + changeColor(player, 4, SKIN_COLORS, 158, buttonId); + } + return false; + } + + /** + * Changes the gender of a player. + * @param player The player. + * @param male If we're changing to male. + */ + private static void changeGender(Player player, boolean male) { + player.setAttribute("male", male); + player.getConfigManager().set(1262, male ? 1 : -1); + reset(player); + } + + /** + * Changes the look of a player. + * @param player The player. + * @param index The index. + * @param increment If we're incrementing. + */ + private static void changeLook(Player player, int index, boolean increment) { + if (index < 2 && player.getAttribute("first-click:" + index, false) == false) { + player.setAttribute("first-click:" + index, true); + return; + } + player.setAttribute("look-val:" + index, getValue(player, "look", index, (int) player.getAttribute("look:" + index, 0), increment)); + } + + /** + * Changes the color of a player. + * @param player The player. + * @param index The body index. + * @param array The color array. + */ + private static void changeColor(Player player, int index, int[] array, int startId, int buttonId) { + int col = array[Math.abs(buttonId - startId)]; + player.setAttribute("color-val:" + index, array[Math.abs(buttonId - startId)]); + } + + /** + * Resets the players design. + * @param player the player. + */ + private static void reset(Player player) { + for (int i = 0; i < player.getAppearance().getAppearanceCache().length; i++) { + player.removeAttribute("look:" + i); + player.removeAttribute("look-val:" + i); + player.removeAttribute("color-val:" + i); + } + player.removeAttribute("first-click:0"); + player.removeAttribute("first-click:1"); + } + + /** + * Randomizes the player's look. + * @param player the player. + */ + public static void randomize(Player player, boolean head) { + if (head) { + changeLook(player, 0, RandomFunction.random(2) == 1); + changeLook(player, 1, RandomFunction.random(2) == 1); + changeColor(player, 0, HAIR_COLORS, 100, RandomFunction.random(100, 124)); + changeColor(player, 4, SKIN_COLORS, 158, RandomFunction.random(158, 151)); + } else { + for (int i = 0; i < player.getAppearance().getAppearanceCache().length; i++) { + changeLook(player, i, RandomFunction.random(2) == 1); + } + changeColor(player, 2, TORSO_COLORS, 189, RandomFunction.random(189, 217)); + changeColor(player, 5, LEG_COLORS, 248, RandomFunction.random(248, 276)); + changeColor(player, 6, FEET_COLORS, 307, RandomFunction.random(307, 312)); + } + confirm(player, false); + } + + /** + * Confirms the character screen. + * @param player The player. + * @param close If we should close the interface. + */ + private static void confirm(Player player, boolean close) { + if (close) { + player.setAttribute("char-design:accepted", true); + player.getInterfaceManager().close(); + //Removing Tutorial Island properties on the account (?) and sending the Player to Lumbridge + player.getMusicPlayer().play(MusicEntry.forId(62)); + player.removeAttribute("tut-island"); + player.getConfigManager().set(1021, 0); + TutorialSession.getExtension(player).setStage(72); + player.getInterfaceManager().closeOverlay(); + + //Clears and Resets the Player's account and focuses the default interface to their Inventory + player.getInventory().clear(); + player.getEquipment().clear(); + player.getBank().clear(); + player.getInterfaceManager().restoreTabs(); //This still hides the Attack (double swords) in the player menu until Player wields a weapon. + player.getInterfaceManager().setViewedTab(3); + player.getInventory().add(STARTER_PACK); + player.getBank().add(STARTER_BANK); + + player.getPulseManager().run(new Pulse(1){ + @Override + public boolean pulse() { + player.unlock(); + if (player.getIronmanManager().isIronman() && player.getSettings().isAcceptAid()) { + player.getSettings().toggleAcceptAid(); + } + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendInfoUpdate(player); + } + //This overwrites the stuck dialogue after teleporting to Lumbridge for some reason + //Dialogue from 2007 or thereabouts + //Original is five lines, but if the same is done here it will break. Need to find another way of showing all this information. + //player.getDialogueInterpreter().sendDialogue("Welcome to Lumbridge! To get more help, simply click on the", "Lumbridge Guide or one of the Tutors - these can be found by looking", "for the question mark icon on your mini-map. If you find you are", "lost at any time, look for a signpost or use the Lumbridge Home Port Spell."); + player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Welcome to " + GameWorld.getSettings().getName() + "!","Hans at the castle in Lumbridge can","enable ironman mode, modify xp rate settings,","toggle random events, and more!","Use the ladder to leave."); + + //Appending the welcome message and some other stuff + player.getPacketDispatch().sendMessage("Welcome to " + GameWorld.getSettings().getName() + "."); + return true; + } + }); + } + player.getAppearance().setGender(player.getAttribute("male", player.getAppearance().isMale()) ? Gender.MALE : Gender.FEMALE); + for (int i = 0; i < player.getAppearance().getAppearanceCache().length; i++) { + player.getAppearance().getAppearanceCache()[i].changeLook(player.getAttribute("look-val:" + i, player.getAppearance().getAppearanceCache()[i].getLook())); + player.getAppearance().getAppearanceCache()[i].changeColor(player.getAttribute("color-val:" + i, player.getAppearance().getAppearanceCache()[i].getColor())); + } + player.getAppearance().sync(); + + } + + /** + * Gets the look value for the index. + * @param player The player. + * @param key The key. + * @param index The index. + * @param currentIndex The current index. + * @param increment The increment. + * @return The look value. + */ + private static int getValue(Player player, String key, int index, int currentIndex, boolean increment) { + int[] array = player.getAttribute("male", player.getAppearance().isMale()) ? MALE_LOOK_IDS[index] : FEMALE_LOOK_IDS[index]; + int val = 0; + if (increment && currentIndex + 1 > array.length -1) { + val = (int) array[0]; + currentIndex = 0; + } else if (!increment && currentIndex -1 < 0) { + val = (int) array[array.length -1]; + currentIndex = array.length -1; + } else if (increment) { + val = (int) array[currentIndex + 1]; + currentIndex++; + } else { + val = (int) array[currentIndex - 1]; + currentIndex--; + } + player.setAttribute(key + ":" + index, currentIndex); + return val; + } + + //Male head ids : Script - 701 [0: 1 1: 2 2: 3 3: 4 4: 5 5: 6 6: 7 7: 8 8: 9 91: 10 92: 11 93: 12 94: 13 95: 14 96: 15 97: 16 261: 17 262: 18 263: 19 264: 20 265: 21 266: 22 267: 23 268: 24 ] + //Female head ids: Script - 689 [45: 1 46: 2 47: 3 48: 4 49: 5 50: 6 51: 7 52: 8 53: 9 54: 10 135: 11 136: 12 137: 13 138: 14 139: 15 140: 16 141: 17 142: 318 143: 19 144: 20 145: 21 146: 22 269: 23 270: 24 271: 25 272: 26 273: 27 274: 28 275: 29 276: 30 277: 31 278: 32 279: 33 280: 34 ] + //Male jaw ids: Script - 703 [10: 1 11: 2 12: 3 13: 4 14: 5 15: 6 16: 7 17: 8 98: 9 99: 10 100: 11 101: 12 102: 13 103: 14 104: 15 305: 16 306: 17 307: 18 308: 19 ] + //Male torso ids: Script - 1128 [19: 1 20: 2 21: 3 22: 4 23: 5 24: 6 25: 7 111: 8 112: 9 113: 10 114: 11 115: 12 116: 13 ] + //Female torso ids: Script - 1129 [57: 1 58: 2 59: 3 60: 4 153: 5 154: 6 155: 7 156: 8 157: 9 158: 10 ] + //Male arm ids: Script - 1130 [27: 1 28: 2 29: 3 30: 4 31: 5 105: 6 106: 7 107: 8 108: 9 109: 10 110: 11 ] + //Female arm ids: Script - 1131 [62: 1 63: 2 64: 3 65: 4 147: 5 148: 6 149: 7 150: 8 151: 9 152: 10 ] + //Male hand ids: Script - 1132 [34: 1 84: 2 117: 3 118: 4 119: 5 120: 6 121: 7 122: 8 123: 9 124: 10 125: 11 126: 12 ] + //Female hand ids: Script - 1133 [68: 1 127: 2 159: 3 160: 4 161: 5 162: 6 163: 7 164: 8 165: 9 166: 10 167: 11 168: 12 ] + //Male leg ids: Script - 1134 [37: 1 38: 2 39: 3 40: 4 85: 5 86: 6 87: 7 88: 8 89: 9 90: 10 ] + //Female leg ids: Script - 1135 [71: 1 72: 2 73: 3 74: 4 75: 5 76: 6 77: 7 128: 8 129: 9 130: 10 131: 11 132: 12 133: 13 134: 14 ] + //Male feet ids: Script - 1136 [43: 1 ] + //Female feet ids: Script - 1137 [80: 1 ] + +} + diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/CombatInstructorDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/CombatInstructorDialogue.java new file mode 100644 index 000000000..a0a722be7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/CombatInstructorDialogue.java @@ -0,0 +1,166 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin related to the combat instructor npc. + * @author Vexia + */ +@Initializable +public final class CombatInstructorDialogue extends DialoguePlugin { + + /** + * Represents the items related to the combat instructor. + */ + private static final Item[] ITEMS = new Item[] { new Item(882, 50), new Item(841, 1), new Item(1171, 1), new Item(1277, 1) }; + + /** + * Constructs a new {@code CombatInstructorDialogue} {@code Object}. + */ + public CombatInstructorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CombatInstructorDialogue} {@code Object}. + * @param player the player. + */ + public CombatInstructorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CombatInstructorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + switch (TutorialSession.getExtension(player).getStage()) { + case 44: + interpreter.sendDialogues(player, null, "Hi! My name's " + player.getUsername() + "."); + stage = 0; + break; + case 47: + interpreter.sendDialogues(npc, null, "Very good, but that little butter knife isn't going to ", "protect you much. Here, take these."); + stage = 0; + break; + case 53: + interpreter.sendDialogues(player, null, "I did it! I killed a giant rat! "); + stage = 0; + break; + case 54: + if (!player.getInventory().containItems(841, 882)) { + if (player.getInventory().freeSlots() > 2) { + interpreter.sendDoubleItemMessage(ITEMS[0], ITEMS[1], "The Combat Guide gives you some bronze arrows and a shortbow!"); + player.getInventory().add(ITEMS[0], ITEMS[1]); + stage = 3; + } else { + end(); + TutorialStage.load(player, 54, false); + } + } else { + end(); + TutorialStage.load(player, 54, false); + } + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (TutorialSession.getExtension(player).getStage()) { + case 44: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "Do I look like I care? To me you're just another", "newcomer who thinks they're ready to fight."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "I am Vannaka, the greatest swordsman alive."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, null, "Let's get started by teaching you to wield a weapon."); + stage = 3; + break; + case 3: + end(); + TutorialStage.load(player, 45, false); + break; + } + break; + case 54: + end(); + TutorialStage.load(player, 54, false); + break; + case 47: + switch (stage) { + case 0: + if (!player.getInventory().containItems(1171, 1277)) { + if (player.getInventory().freeSlots() > 2) { + interpreter.sendDoubleItemMessage(1171, 1277, "The Combat Guide gives you a bronze sword and a wooden shield!"); + player.getInventory().add(ITEMS[2]); + player.getInventory().add(ITEMS[3]); + stage = 1; + } + } else { + end(); + TutorialStage.load(player, 48, false); + stage = 1; + } + break; + case 1: + end(); + TutorialStage.load(player, 48, false); + break; + } + break; + case 53: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "I saw, " + player.getUsername() + ". You seem better at this than I", "thought. Now that you have grasped basic swordplay", "let's move on."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "Let's try some ranged attacking, with this you can kill", "foes from a distance. Also, foes unable to reach you are", "as good as dead. You'll be able to attack the rats, ", "without entering the pit."); + stage = 2; + break; + case 2: + if (!player.getInventory().containItems(841, 882)) { + if (player.getInventory().freeSlots() > 2) { + interpreter.sendDoubleItemMessage(ITEMS[0], ITEMS[1], "The Combat Guide gives you some bronze arrows and a shortbow!"); + player.getInventory().add(ITEMS[0], ITEMS[1]); + stage = 3; + } else { + end(); + TutorialStage.load(player, 53, false); + } + } else { + end(); + TutorialStage.load(player, 54, false); + } + break; + case 3: + end(); + TutorialStage.load(player, 54, false); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 944 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/FinancialAdvisorDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/FinancialAdvisorDialogue.java new file mode 100644 index 000000000..6881023c1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/FinancialAdvisorDialogue.java @@ -0,0 +1,101 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.plugin.Initializable; + +/** + * Represents the financial advisor plugin. + * @author Vexia + */ +@Initializable +public final class FinancialAdvisorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code FinancialAdvisorPlugin {@code Object}. + */ + public FinancialAdvisorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FinancialAdvisorPlugin} {@code Object}. + * @param player the player. + */ + public FinancialAdvisorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FinancialAdvisorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + switch (TutorialSession.getExtension(player).getStage()) { + case 58: + interpreter.sendDialogues(player, null, "Hello. Who are you?"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (TutorialSession.getExtension(player).getStage()) { + case 58: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "I'm the Financial Advisor. I'm here to tell people how to", "make money."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, null, "Okay. How can I make money then?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, null, "How you can make money? Quite."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(npc, null, "Well there are three basic ways of making money here:", "combat, quests, and trading. I will talk you through each", "of them very quickly."); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, null, "Let's start with combat as it is probably still fresh in", "your mind. Many enemies, both human and monster", "will drop items when they die."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(npc, null, "Now, the next way to earn money quickly is by quests", "Many people on " + GameWorld.getSettings().getName() + " have things they need", "doing, which they will reward you for."); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, null, "By getting a high level in skills such as Cooking, Mining,", "Smithing or Fishing, you can create or catch your own", "items and sell them for pure profit."); + stage = 7; + break; + case 7: + interpreter.sendDialogues(npc, null, "Well that about covers it. Come back if you'd like to go", "over this again."); + stage = 8; + break; + case 8: + end(); + TutorialStage.load(player, 59, false); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 947 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/MasterChefDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/MasterChefDialogue.java new file mode 100644 index 000000000..ed08ab6a9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/MasterChefDialogue.java @@ -0,0 +1,168 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; + +/** + * Handles the master chef dialogue plugin. + * @author 'Vexia + */ +@Initializable +public class MasterChefDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MasterChefDialogue} {@code Object} + */ + public MasterChefDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MasterChefDialogue} {@code Object} + * @param player the player. + */ + public MasterChefDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int tut_stage = TutorialSession.getExtension(player).getStage(); + switch (tut_stage) { + case 18: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh! Welcome, newcomer. I am the Master Chef, Lev. It", "is here I will teach you how to cook food truly fit for a", "king.")); + break; + case 20: + if (player.getInventory().containsAll(1933,1929)) { + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "Mix together the flour and water to form a dough.")); + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "Mix together the flour and water to form a dough.")); + stage = 1; + + } else if (player.getInventory().containsItem(new Item(2307))) { + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "You already have some dough, no need", "to make more.")); + stage = 1; + + } else if (player.getInventory().containsItem(new Item(2307))) { + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "You already have some dough, no need", "to make more.")); + stage = 1; + /* Disabled for now, not sure what is supposed to be happening here, but the else can't be here + } else { + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "I see you have lost your pot of flour and bucket of water,", "No worries i will supply you with more.")); + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Mix together the flour and water to form a dough.")); + stage = 1; + */ + } else if (player.getInventory().containsItem(new Item(2307))) { + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You already have some dough, no need", "to make more.")); + stage = 1; + } else { + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I see you have lost your pot of flour and bucket of water,", "No worries i will supply you with more.")); + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "I see you have lost your pot of flour and bucket of water,", "No worries i will supply you with more.")); + if (player.getInventory().freeSlots() >= 2) { + player.getInventory().add(new Item(1933)); + player.getInventory().add(new Item(1929)); + stage = 1; + } else { + Component.setUnclosable(player, interpreter.sendDialogue("You don't have enough inventory space.")); + stage = 99; + } + break; + } + + case 19: + if (!player.getInventory().contains(1929, 1) && !player.getInventory().containItems(1933)) { + if (player.getInventory().hasSpaceFor(new Item(1929, 1)) && player.getInventory().hasSpaceFor(new Item(1933, 1))) { + Component.setUnclosable(player, interpreter.sendDoubleItemMessage(1929, 1933, "The Cooking Guide gives you a bucket of water and a pot of flour.")); + player.getInventory().add(new Item(1933)); + player.getInventory().add(new Item(1929)); + stage = 4; + } + } else { + end(); + TutorialStage.load(player, 19, false); + } + stage = 4; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + int tut_stage = TutorialSession.getExtension(player).getStage(); + switch (tut_stage) { + case 20: + switch (stage) { + case 1: + end(); + TutorialStage.load(player, 20, false); + break; + case 99: + TutorialStage.load(player, 20, false); + break; + } + break; + case 19: + switch (stage) { + case 4: + end(); + TutorialStage.load(player, 19, false); + break; + } + break; + case 18: + switch (stage) { + case 0: + Component.setUnclosable(player, interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I already know how to cook. Brynna taught me just", "now.")); + stage = 1; + break; + case 1: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hahahahahaha! You call THAT cooking? Some shrimp", "on an open log fire? Oh, no, no no. I am going to", "teach you the fine art of cooking bread.")); + stage = 2; + break; + case 2: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "And no fine meal is complete without good music, so", "we'll cover that while you're here too.")); + stage = 3; + break; + case 3: + if (!player.getInventory().contains(1929, 1) && !player.getInventory().containItems(1933)) { + if (player.getInventory().hasSpaceFor(new Item(1929, 1)) && player.getInventory().hasSpaceFor(new Item(1933, 1))) { + Component.setUnclosable(player, interpreter.sendDoubleItemMessage(1929, 1933, "The Cooking Guide gives you a bucket of water and a pot of flour.")); + player.getInventory().add(new Item(1933)); + player.getInventory().add(new Item(1929)); + stage = 4; + } + } else { + end(); + TutorialStage.load(player, 19, false); + } + stage = 4; + break; + case 4: + end(); + TutorialStage.load(player, 19, false); + break; + } + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MasterChefDialogue(player); + } + + @Override + public int[] getIds() { + return new int[] { 942 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/MiningInstructorDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/MiningInstructorDialogue.java new file mode 100644 index 000000000..7ec019f51 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/MiningInstructorDialogue.java @@ -0,0 +1,188 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the mining instructor dialogue. + * @author Vexia + */ +@Initializable +public final class MiningInstructorDialogue extends DialoguePlugin { + + /** + * Represents the hammer item. + */ + private static final Item HAMMER = new Item(2347, 1); + + /** + * Represents the pickaxe item. + */ + private static final Item PICKAXE = new Item(1265); + + /** + * Constructs a new {@code MiningInstructorDialogue} {@code Object}. + */ + public MiningInstructorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MiningInstructorDialogue} {@code Object}. + * @param player the player. + */ + public MiningInstructorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MiningInstructorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + switch (TutorialSession.getExtension(player).getStage()) { + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hi there. You must be new around here. So what do I", "call you? 'Newcomer' seems so impersonal, and if we're", "going to be working together, I'd rather call you by", "name."); + break; + case 34: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I prospected both types of rock! One set contains tin", "and the other has copper ore inside."); + break; + case 35: + if (!player.getInventory().contains(1265, 1)) { + if (player.getInventory().hasSpaceFor(PICKAXE)) { + interpreter.sendItemMessage(1265, "Dezzick gives you a bronze pickaxe!"); + player.getInventory().add(PICKAXE); + stage = 3; + } else { + end(); + TutorialStage.load(player, 35, false); + } + } else { + end(); + TutorialStage.load(player, 35, false); + } + break; + case 40: + interpreter.sendDialogues(player, null, "How do I make a weapon out of this?"); + stage = 1; + break; + case 41: + if (!player.getInventory().contains(2347, 1)) { + if (player.getInventory().hasSpaceFor(HAMMER)) { + interpreter.sendItemMessage(2347, "Dezzick gives you a hammer!"); + player.getInventory().add(HAMMER); + stage = 3; + } + } else { + end(); + TutorialStage.load(player, 41, false); + } + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (TutorialSession.getExtension(player).getStage()) { + case 30: + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "You can call me " + player.getUsername() + "."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ok then, " + player.getUsername() + ". My name is Dezzick and I'm a", "miner by Trade. Let's prospect some of those rocks."); + stage = 2; + break; + case 2: + end(); + TutorialStage.load(player, 31, false); + break; + } + break; + case 35: + end(); + TutorialStage.load(player, 35, false); + break; + case 40: + switch (stage) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Okay, I'll show you how to make a dagger out of it.", "You'll be needing this.."); + stage = 2; + break; + case 2: + if (!player.getInventory().contains(2347, 1)) { + if (player.getInventory().hasSpaceFor(HAMMER)) { + interpreter.sendItemMessage(2347, "Dezzick gives you a hammer!"); + player.getInventory().add(HAMMER); + stage = 3; + } + } else { + end(); + TutorialStage.load(player, 41, false); + } + break; + case 3: + end(); + TutorialStage.load(player, 41, false); + break; + } + break; + case 41: + end(); + TutorialStage.load(player, 41, false); + break; + case 34: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Absolutely right, " + player.getUsername() + ". These two ore types can be", "Smelted together to make bronze."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "So now you know what ore is in the rocks over there,", "why don't you have a go at mining some tin and", "copper? Here, you'll need this to start with."); + stage = 2; + break; + case 2: + if (!player.getInventory().contains(1265, 1)) { + if (player.getInventory().hasSpaceFor(PICKAXE)) { + interpreter.sendItemMessage(1265, "Dezzick gives you a bronze pickaxe!"); + player.getInventory().add(PICKAXE); + stage = 3; + } else { + end(); + TutorialStage.load(player, 34, false); + } + } else { + end(); + TutorialStage.load(player, 35, false); + } + break; + case 3: + end(); + TutorialStage.load(player, 35, false); + break; + case 99: + end(); + TutorialStage.load(player, 34, false); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 948 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/QuestGuideDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/QuestGuideDialogue.java new file mode 100644 index 000000000..e771b9ab7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/QuestGuideDialogue.java @@ -0,0 +1,93 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Handles the quest guide. + * @author Vexia + */ +@Initializable +public class QuestGuideDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code QuestGuide} {@code Object}. + */ + public QuestGuideDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code QuestGuideDialogue} {@code Object} + * @param player the player. + */ + public QuestGuideDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + switch (TutorialSession.getExtension(player).getStage()) { + case 27: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah. Welcome adventurer. I'm here to tell you all about", "quests. Lets start by opening the Quest list.")); + stage = 0; + break; + case 28: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Now you have the journal open. I'll tell you a bit about", "it At the moment all the quests are shown in red. Which", "means you have not started them yet.")); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (TutorialSession.getExtension(player).getStage()) { + case 27: + switch (stage) { + case 0: + Component.setUnclosable(player, interpreter.sendPlaneMessageWithBlueTitle("Open the Quest Journal.", "Click on the flashing icon next to your inventory.", "", "", "")); + player.getConfigManager().set(1021, 3); + player.getInterfaceManager().openTab(new Component(274)); + break; + } + break; + case 28: + switch (stage) { + case 0: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you start a quest it will change colour to yellow,", "and to green when you've finished. This is so you can", "easily see what's complete, what's started and what's left", "to begin.")); + stage = 1; + break; + case 1: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "The start of quests are easy to find. Look out for the", "star icons on the minimap, just like the one you should", "see marking my house.")); + stage = 2; + break; + case 2: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "There's not a lot more I can tell you about questing.", "You have to experience the thrill of it yourself to fully", "understand. You may find some adevnture in the caves", "under my house.")); + stage = 3; + break; + case 3: + end(); + TutorialStage.load(player, 29, false); + break; + } + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new QuestGuideDialogue(player); + } + + @Override + public int[] getIds() { + return new int[] { 949 }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/RSGuideDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/RSGuideDialogue.java new file mode 100644 index 000000000..cf2de8ab9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/RSGuideDialogue.java @@ -0,0 +1,243 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.plugin.Initializable; + +/** + * Hanldes the 2009scape guide's dialogue. + * @author Vexia + * @author Splinter + */ +@Initializable +public class RSGuideDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code 2009scapeGuideDialogue} {@code Object}. + */ + public RSGuideDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code 2009scapeGuideDialogue} {@code Object}. + * @param player The player. + */ + private RSGuideDialogue(Player player) { + super(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int tut_stage = TutorialSession.getExtension(player).getStage(); + if(tut_stage < TutorialSession.MAX_STAGE){ + switch (tut_stage) { + case 0: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greetings! I see you are a new arrival to this land. My", "job is to welcome all new visitors. So welcome!")); + return true; + case 1: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You will notice a flashing icon of a spanner; please click", "on this to continue the tutorial.")); + return true; + case 2: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm glad you're making progress!")); + stage = 1; + return true; + } + } else { + if(player.getSkills().getTotalLevel() < 300){ + interpreter.sendDialogues(npc, null, "Greetings, "+player.getUsername()+". Welcome to "+GameWorld.getSettings().getName()+".", "The flashing icon above my head will disappear once", "you've reached a total level of three hundred."); + } else { + interpreter.sendDialogues(npc, null, "Greetings, "+player.getUsername()+". Welcome to "+GameWorld.getSettings().getName()+"."); + } + stage = 10; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final int tut_stage = TutorialSession.getExtension(player).getStage(); + if(tut_stage < TutorialSession.MAX_STAGE){ + switch (tut_stage) { + case 0: + switch (stage) { + case 0: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You have already learned the first thing needed to", "succeed in this world: talking to other people!")); + stage = 1; + break; + case 1: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You will find many inhabitants of this world have useful", "things to say to you. By clicking on them with your", "mouse you can talk to them.")); + stage = 2; + break; + case 2: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I would also suggest reading through some of the", "supporting information on the website. There you can", "find the Knowledge Base, which contains all the", "additional information you're ever likely to need. It also")); + stage = 3; + break; + case 3: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "contains maps and helpful tips to help you on your", "journey.")); + stage = 4; + break; + case 4: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You will notice a flashing icon of a wrench, please click", "on this to continue the tutorial.")); + player.getInterfaceManager().openTab(new Component(261)); + player.getConfigManager().set(1021, 12); + stage = 5; + break; + case 5: + end(); + TutorialStage.load(player, 1, false); + stage = 1; + return true; + } + break; + case 2: + switch (stage) { + case 1: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "To continue the tutorial go through that door over", "there and speak to your first instructor!")); + stage = 2; + break; + case 2: + end(); + TutorialStage.load(player, 3, false); + stage = 1; + break; + } + break; + case 1: + end(); + break; + } + } else { + switch(stage){ + case 10: + interpreter.sendDialogues(npc, null, "I am the "+GameWorld.getSettings().getName()+" guide. I offer free and helpful assistance", "for newcomers. What would you like to ask about?"); + stage++; + break; + case 11: + interpreter.sendOptions("Select a Question", "Money making", "Getting around", "List of game content"); + stage++; + break; + case 12: + switch(buttonId){ + case 1: + interpreter.sendDialogues(player, null, "I'd like to ask about money-making techniques."); + stage = 13; + break; + case 2: + interpreter.sendDialogues(player, null, "I'd like to know how to get around on "+GameWorld.getSettings().getName()+"."); + stage = 18; + break; + case 3: + interpreter.sendDialogues(player, null, "I'd like to know about all the content in "+GameWorld.getSettings().getName()+"."); + stage = 25; + break; + } + break; + case 13: + interpreter.sendDialogues(npc, null, "That is one of the most commonly asked questions.", "First of all, there are many different ways to make large", "amounts of coins in "+GameWorld.getSettings().getName()+". There's hundreds", "of hours of emulated content awaiting you."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, null, "Many players prefer to start with leveling their Slayer skill.", "The skill is profitable because of the vast amount of items","that come with defeating monsters in combat. Speak", "to Turael to the east. He is the lowest level"); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, null, "Slayer Master available. He will get you started with Slayer.", "The other Slayer Masters may be found spread through", "out the game world."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, null, "As for other money-making methods, consider all of the other", "skills available to you. You may chop down Magic trees and","sell the valuable logs to players, or you may even catch", "sharks and sell them for over one thousand gold pieces each."); + stage = 17; + break; + case 17: + interpreter.sendDialogues(npc, null, GameWorld.getSettings().getName()+" is an economy-driven server. All gathering skills", "are highly profitable and sought after. Herblore and", "Farming, for example, are guaranteed to make you", "profit."); + stage = 11; + break; + case 18: + interpreter.sendDialogues(npc, null, "A good question indeed. Traveling is the key to"," experiencing all the game content that "+GameWorld.getSettings().getName()+" has to offer."); + stage = 19; + break; + case 19: + interpreter.sendDialogues(npc, null, "First of all, you may use your spellbook to teleport to", "major cities. There are three fully working spellbooks", "available to you. However, they require a Magic level", "in order to be used."); + stage = 20; + break; + case 20: + interpreter.sendDialogues(npc, null, "Next we have teletabs. They may be bought by accessing", "the green teleporter to the west of me.", "These tablets are very convenient and only require", "a single inventory space."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, null, "We also have Spirit trees. These talkative trees are", "willing to take you to a few odd locations."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, null, "Next up is the charter system. You make take a ferry boat", "to many coastal cities like Port Phasmatys and", "Catherby."); + stage = 23; + break; + case 23: + interpreter.sendDialogues(npc, null, "We also have the convenient Gnome glider system.", "The friendly Gnomes of "+GameWorld.getSettings().getName()+" offer their services","completely free of charge."); + stage = 24; + break; + case 24: + interpreter.sendDialogues(npc, null, "Finally, we have the green teleporter located in the", "Grand Exchange and Fairy rings.", "All of these teleportation methods should assist you", "in traveling the wide-open world of "+GameWorld.getSettings().getName()+"."); + stage = 50; + break; + case 25: + interpreter.sendDialogues(npc, null, "First up, we have our emulated quests. You may", "type ::quests in your chatbox in order to view a full", "list of ones that fully work.", "I will now begin listing off a lot of other game content."); + stage = 26; + break; + case 26: + interpreter.sendDialogue("Current OSRS content:", "Rune packs, the Zamorakian Hasta, Lava dragons,","Boss pets, Ecumenical keys, Staff of the Dead,", "Armadyl C'bow, colored Dark bows, and the Dragon defender."); + stage = 27; + break; + case 27: + interpreter.sendDialogue("Boss content:", "The Tz-Tok Jad, King Black Dragon, Dagannoth kings, Bork,","Godwars Dungeon bosses, Giant Mole, Kalphite Queen,", "Chaos elemental, and the Corporeal beast."); + stage = 28; + break; + case 28: + interpreter.sendDialogue("Minigame content:", "Barrows, Bounty Hunter, Clan Wars, Duel Arena,","Gnomecopters, Magic Training Area, Falador Partyroom,","Pest Control, Puro Puro, The Stronghold of Security,"); + stage = 29; + break; + case 29: + interpreter.sendDialogue("Minigame content continued:", "The Stronghold of Player Safety, the Warrior's Guild,", "Sorceress' Garden, and the Fight Pits."); + stage = 30; + break; + case 30: + interpreter.sendDialogue("Skill content:", "All skills except Construction are fully functional."); + stage = 31; + break; + case 31: + interpreter.sendDialogue("Misc content:", "Achievement Diaries, Grand Exchange, Clue scrolls,", "Game sounds, Random events, Lootshare, Slayer points,","Cutscenes, Bank tabs,"); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, null, "... and simply too much else to list.", "There's lots of content out there for you to explore.", "Don't just take my word for it. Experience our perfected", "game content for yourself."); + stage = 11; + break; + case 50: + interpreter.sendDialogues(npc, null, "Oh... I almost forgot.", "Our world also has unique teleport methods like the", "convenient ectophial and enchanted rings and amulets."); + stage = 11; + break; + + } + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RSGuideDialogue(player); + } + + @Override + public int[] getIds() { + return new int[] { 945 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/SurvivalExpertDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/SurvivalExpertDialogue.java new file mode 100644 index 000000000..c76bf8da9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/SurvivalExpertDialogue.java @@ -0,0 +1,173 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.plugin.Initializable; +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Handles survival expert dialogue. + * @author 'Vexia + */ +@Initializable +public class SurvivalExpertDialogue extends DialoguePlugin { + + /** + * The NPC ids that use this dialogue plugin. + */ + private static final int[] NPC_IDS = { 943 }; + + public SurvivalExpertDialogue() { + /* + * empty. + */ + } + + public SurvivalExpertDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return NPC_IDS; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + int tut_stage = TutorialSession.getExtension(player).getStage(); + switch (tut_stage) { + case 6: + end(); + TutorialStage.load(player, 6, false); + break; + case 12: + end(); + TutorialStage.load(player, 15, false); + break; + case 4: + switch (stage) { + case 0: + Component.setUnclosable(player, interpreter.sendDoubleItemMessage(590, 1351, "The Surivival Guide gives you a tinderbox and a bronze axe!")); + player.getInventory().add(new Item(590, 1)); + player.getInventory().add(new Item(1351, 1)); + stage = 1; + break; + case 1: + end();// Component.setUnclosable(player, + TutorialStage.load(player, 5, false); + break; + } + break; + case 11: + switch (stage) { + case 0: + Component.setUnclosable(player, interpreter.sendItemMessage(303, "The Survival Guide gives you a net!")); + player.getInventory().add(new Item(303)); + stage = 1; + break; + case 1: + end(); + TutorialStage.load(player, 12, false); + break; + } + break; + case 8: + end(); + TutorialStage.load(player, TutorialSession.getExtension(player).getStage(), false); + break; + case 14: + switch (stage) { + case 0: + end(); + TutorialStage.load(player, TutorialSession.getExtension(player).getStage(), false); + break; + } + break; + case 15: + end(); + TutorialStage.load(player, TutorialSession.getExtension(player).getStage(), false); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SurvivalExpertDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int tut_stage = TutorialSession.getExtension(player).getStage(); + switch (tut_stage) { + case 4: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there, newcomer. My name is Brynna. My job is", "to teach you a few suvival tips and tricks. First off", "we're going to start with the most basic skill of", "all: making a fire.")); + break; + case 6: + if (!player.getInventory().contains(1351, 1) && player.getInventory().contains(590, 1)) { + Component.setUnclosable(player, interpreter.sendItemMessage(1351, "The Surivival Guide gives you a bronze axe.")); + player.getInventory().add(new Item(1351)); + } else if (!player.getInventory().contains(590, 1) && player.getInventory().contains(1351, 1)) { + player.getInventory().add(new Item(590, 1)); + Component.setUnclosable(player, interpreter.sendDialogue("The Surivival Guide gives you a tinderbox.")); + } else if (!player.getInventory().contains(590, 1) && !player.getInventory().contains(1351, 1)) { + Component.setUnclosable(player, interpreter.sendDoubleItemMessage(590, 1351, "The Surivival Guide gives you a tinderbox and a bronze axe!")); + player.getInventory().add(new Item(590, 1)); + player.getInventory().add(new Item(1351, 1)); + } + stage = 90; + break; + case 11: + Component.setUnclosable(player, interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well done! Next we need to get some food in our", "bellies. We'd need something to cook. There are shrimp", "in the pond there. So let's catch and cook some.")); + break; + case 8: + if (!player.getInventory().contains(1351, 1) && player.getInventory().contains(590, 1)) { + Component.setUnclosable(player, interpreter.sendItemMessage(1351, "The Surivival Guide gives you a bronze axe.")); + player.getInventory().add(new Item(1351)); + } else if (!player.getInventory().contains(590, 1) && player.getInventory().contains(1351, 1)) { + player.getInventory().add(new Item(590, 1)); + Component.setUnclosable(player, interpreter.sendDialogue("The Surivival Guide gives you a tinderbox.")); + } else { + end(); + TutorialStage.load(player, 8, false); + } + break; + case 14: + if (!player.getInventory().contains(1351, 1) && player.getInventory().contains(590, 1)) { + Component.setUnclosable(player, interpreter.sendItemMessage(1351, "The Surivival Guide gives you a bronze axe.")); + player.getInventory().add(new Item(1351)); + } else if (!player.getInventory().contains(590, 1) && player.getInventory().contains(1351, 1)) { + player.getInventory().add(new Item(590, 1)); + Component.setUnclosable(player, interpreter.sendDialogue("The Surivival Guide gives you a tinderbox.")); + } else { + end(); + TutorialStage.load(player, 14, false); + } + break; + case 12: + if (!player.getInventory().contains(303, 1)) { + player.getInventory().add(new Item(303, 1)); + Component.setUnclosable(player, interpreter.sendDialogue("The Surivival Guide gives you a net.")); + } else { + end(); + TutorialStage.load(player, 12, false); + } + break; + case 15: + if (!player.getInventory().contains(303, 1)) { + player.getInventory().add(new Item(303, 1)); + Component.setUnclosable(player, interpreter.sendDialogue("The Surivival Guide gives you a net.")); + } else { + end(); + TutorialStage.load(player, 15, false); + } + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialBook.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialBook.java new file mode 100644 index 000000000..7856d83ef --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialBook.java @@ -0,0 +1,97 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.book.Book; +import core.game.content.dialogue.book.BookLine; +import core.game.content.dialogue.book.Page; +import core.game.content.dialogue.book.PageSet; +import core.game.node.entity.player.Player; + +/** + * Handles the introductory after-tutorial book. + * @author Splinter + */ +@Initializable +public final class TutorialBook extends Book { + + /** + * Represents the book id + */ + public static int ID = 387454; + + /** + * Represents the array of pages for this book. + */ + private static final PageSet[] PAGES = new PageSet[] { + new PageSet( + new Page( + new BookLine("THIS BOOK NEEDS TO HAVE ITS TEXT CHANGED Starting off", 55), new BookLine("", 56), new BookLine(" It is a good idea", 57), new BookLine("to raid the two strongholds", 58), + new BookLine("in Barbarian Village in order", 59), new BookLine("to gain a ludicrous amount of", 60), new BookLine("coins to start with. Also", 61), + new BookLine("Consider collecting skilling", 62), new BookLine("materials to sell in bulk", 63), new BookLine("on the Grand Exchange.", 64), + new BookLine("Raw meat, dropped from", 65)), + new Page( + new BookLine("cows, is useful in the", 66), new BookLine("Summoning skill and can", 67), + new BookLine("be easily sold for coins.", 68), new BookLine(" ", 69), new BookLine(" Credits/Double XP", 70), new BookLine("Credits are our way", 71), + new BookLine("of thanking you for voting.", 72), new BookLine("You may spend credits", 73), new BookLine("in the online store at:", 74), + new BookLine("www.2009Scape-pk.com/shop or", 75), new BookLine("by using our in-game ::shop.", 76))), + new PageSet( + new Page( + new BookLine(" Suggestions", 55), + new BookLine("Please suggest new features", 56), new BookLine("you'd like to see via", 57), new BookLine("the forums located at", 58), + new BookLine("www.2009Scape-pk.com.", 59), new BookLine("We wholeheartedly look over", 60), new BookLine("and consider all suggestions.", 61))), + + }; + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public TutorialBook(final Player player) { + super(player, "Early Guide Book", 1856, PAGES); + } + + /** + * Constructs a new {@code ShieldofArravBook} {@code Object}. + */ + public TutorialBook() { + /** + * empty. + */ + } + + @Override + public void finish() { + } + + @Override + public void display(Page[] set) { + player.lock(); + player.getInterfaceManager().open(getInterface()); + player.getPacketDispatch().sendString("Previous", getInterface().getId(), 77); + player.getPacketDispatch().sendString("Next", getInterface().getId(), 78); + for (int i = 55; i < 77; i++) { + player.getPacketDispatch().sendString("", getInterface().getId(), i); + } + player.getPacketDispatch().sendString(getName(), getInterface().getId(), 6); + for (Page page : set) { + for (BookLine line : page.getLines()) { + player.getPacketDispatch().sendString(line.getMessage(), getInterface().getId(), line.getChild()); + } + } + boolean lastPage = index == sets.length - 1; + if (lastPage) { + finish(); + } + player.unlock(); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TutorialBook(player); + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialCompletionDialogue.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialCompletionDialogue.java new file mode 100644 index 000000000..05723bed1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialCompletionDialogue.java @@ -0,0 +1,397 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.entity.player.link.IronmanMode; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.net.amsc.MSPacketRepository; +import core.net.amsc.WorldCommunicator; +import core.plugin.Initializable; + +/** + * Handles the tutorial completition dialogue (skippy, magic instructor) + * @author Vexia + * @author Splinter + * + */ +@Initializable +public class TutorialCompletionDialogue extends DialoguePlugin { + + /** + * The starter pack of items. + */ + private static final Item[] STARTER_PACK = new Item[] { new Item(1351, 1), new Item(590, 1), new Item(303, 1), new Item(315, 1), new Item(1925, 1), new Item(1931, 1), new Item(2309, 1), new Item(1265, 1), new Item(1205, 1), new Item(1277, 1), new Item(1171, 1), new Item(841, 1), new Item(882, 25), new Item(556, 25), new Item(558, 15), new Item(555, 6), new Item(557, 4), new Item(559, 2) }; + private static final Item[] STARTER_BANK = new Item[] { new Item( 995, 25)}; + + /** + * Represents the rune items. + */ + private static final Item[] RUNES = new Item[] { new Item(556, 5), new Item(558, 5) }; + + /** + * If ironman is enabled. + */ + private static final boolean IRONMAN = true; + + /** + * Constructs a new {@code TutorialCompletionDialogue} {@code Object} + */ + public TutorialCompletionDialogue() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code TutorialCompletionDialogue} {@code Object} + * @param player the player. + */ + public TutorialCompletionDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TutorialCompletionDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (npc == null) { + return true; + } + + //Magic Instructor Dialogue + if (npc.getId() == 946) { + switch (TutorialSession.getExtension(player).getStage()) { + case 67: + interpreter.sendDialogues(player, FacialExpression.FRIENDLY, "Hello."); + stage = 0; + return true; + case 69: + interpreter.sendDialogues(946, FacialExpression.NEUTRAL, "Good. This is a list of your spells. Currently you can", "only cast one offensive spell called Wind Strike. Let's", "try it out on one of those chickens."); + stage = 0; + return true; + case 70: + if (!player.getInventory().contains(556, 1) && !player.getInventory().contains(558, 1)) { + if (player.getInventory().hasSpaceFor(RUNES[0]) && player.getInventory().hasSpaceFor(RUNES[1])) { + interpreter.sendDoubleItemMessage(RUNES[0], RUNES[1], "Terrova gives you five air runes and five mind runes!"); + player.getInventory().add(RUNES); + stage = 3; + } else { + GroundItemManager.create(RUNES, player.getLocation(), player); + stage = 3; + } + } else { + end(); + TutorialStage.load(player, 70, false); + } + return true; + case 71: + interpreter.sendDialogues(946, FacialExpression.NEUTRAL, "Well you're all finished here now. I'll give you a", "reasonable number of runes when you leave."); + stage = -2; + return true; + } + } + + //Skippy Dialogue used whenever the Player talks to Skippy during the tutorial + else { + interpreter.sendDialogues(npc, FacialExpression.SUSPICIOUS, "*psst.* Hey, do you want to skip the tutorial?", "I can send you straight to the mainland, easy."); + stage = 1; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + //Final Dialogue from the either the Magic Instructor or Skippy + if (npc.getId() == 2796 || TutorialSession.getExtension(player).getStage() >= 71) { + switch (stage) { + case -2: //Only used by the Magic Instructor + interpreter.sendOptions("Leave Tutorial Island?", "Yes.", "No."); + stage = -1; + break; + case -1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.ASKING,"One more thing: Would you like to", "be an Ironman account?"); + stage = 501; + break; + case 2: + end(); + TutorialStage.load(player, 71, false); + break; + } + break; + + //Dialogue used by Skippy to leave Tutorial Island + case 1: + interpreter.sendOptions("What would you like to say?", "Leave Tutorial Island.", "Can I decide later?", "I'll stay here for the Tutorial."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.ASKING,"One more thing: Would you like to", "be an Ironman account?"); + stage = 501; + if (!IRONMAN) { + stage = 1205; + } + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.THINKING, "Can I decide later?."); + stage = 39; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.NEUTRAL, "I'll stay here for the Tutorial."); + stage = 40; + break; + } + break; + case 39: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "Yes. Talk to me at any point during this tutorial", "if you change your mind."); + stage = 99; + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "Very well. Have fun, adventurer."); + stage = 99; + break; + + //Continuation of Ironman Dialogues + case 501: + player.removeAttribute("ironMode"); + player.removeAttribute("ironPermanent"); + options("Yes, please.", "What is an Ironman account?", "No, thanks."); + stage++; + break; + case 502: + switch (buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.HAPPY,"Yes, please."); + stage = 506; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.ASKING,"What is an Ironman account?"); + stage = 530; + break; + case 3: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"No, thanks."); + stage = 534; + break; + } + break; + case 506: + interpreter.sendOptions("Select a Mode", "Standard", "Hardcore", "Ultimate", "Go back."); + stage++; + break; + case 507: + switch (buttonId) { + case 1: + case 2: + case 3: + npc("You have chosen the " + (buttonId == 1 ? "Standard" : (buttonId == 2 ? "Hardcore" : "Ultimate")) + " Ironman mode."); + player.setAttribute("ironMode", IronmanMode.values()[buttonId]); + player.getSavedData().getActivityData().setHardcoreDeath(false); + stage = 516; + break; + case 4: + player.removeAttribute("ironMode"); + player.removeAttribute("ironPermanent"); + options("Yes, please.", "What is an Ironman account?", "No, thanks."); + stage = 502; + break; + } + break; + case 516: + player.getIronmanManager().setMode(player.getAttribute("ironMode")); + MSPacketRepository.sendInfoUpdate(player); + + //Split Dialogue depending on if the Player is talking to the Magic Instructor or Skippy. + if (npc.getId() == 946) { + interpreter.sendDialogues(npc, FacialExpression.HAPPY,"Congratulations, you have setup your Ironman account.", "Let's continue."); + stage = 1199; + break; + } else { + interpreter.sendDialogues(npc, FacialExpression.FRIENDLY,"Congratulations, you have setup your Ironman account.", "You will travel to the mainland in a moment."); + stage = 1204; + break; + } + + //About Ironman mode + case 530: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"An Iron Man account is a style of playing where players", "are completely self-sufficient."); + stage++; + break; + case 531: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"A Standard Ironman does not receive items or", "assistance from other players. They cannot trade, stake,", "receive PK loot, scavenge dropped items, nor play", "certain minigames."); + stage++; + break; + case 532: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"In addition to Standard Ironman restrictions,", "Hardcore Ironmen only have one life. In the event of","a dangerous death, a player will be downgraded to a", "Standard Ironman, and their stats frozen on the hiscores."); + stage++; + break; + case 533: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"For the ultimate challenge, players who choose the", "Ultimate Ironman mode cannot use banks, nor", "retain any items on death in dangerous areas."); + stage = 501; + break; + + case 534: + // From saying no thanks to being an ironman. + //Split Dialogue depending on if the Player is talking to the Magic Instructor or Skippy. + if (npc.getId() == 946) { + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"Very well.", "Let's continue."); + stage = 1199; + break; + } else { + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL,"Very well.", "You will travel to the mainland in a moment."); + stage = 1204; + break; + } + //Final Regards from the Magic Instructor + case 1199: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "When you get to the mainland you will find yourself in", "the town of Lumbridge. If you want some ideas on", "where to go next talk to my friend the Lumbridge", "Guide. You can't miss him; he's holding a big staff with"); + stage++; + break; + case 1200: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "a question mark on the end. He also has a white beard","and carries a rucksack full of scrolls. There are also","many tutors willing to teach you about the many skills","you could learn."); + stage++; + break; + case 1201: //TODO: Needs to be the Lumbridge Guide Icon... Not sure of the ID or interface. + interpreter.sendItemMessage(RUNES[1], "When you get to Lumbridge, look for this icon on you","mini-map. The Lumbridge Guide or one of the other","tutors should be near there. The Lumbridge","Guide should be standing slightly to the north-east of"); + stage++; + break; + case 1202: //TODO: Needs to be the Lumbridge Guide Icon... Not sure of the ID or interface. + interpreter.sendItemMessage(RUNES[1], "the castle's courtyard and the others you will find","scattered around Lumbridge."); + stage++; + break; + case 1203: + interpreter.sendDialogues(npc, FacialExpression.NEUTRAL, "If all else fails, visit the "+ GameWorld.getSettings().getName()+ " website for a whole","chestload of information on quests, skills, and minigames","as well as a very good starter's guide."); + stage++; + break; + + //Final words, if using Skippy it should go straight to this + //Could be removed to try and keep the 'nostalgic' feeling of Tutorial Island. + case 1204: + npc("Keep in mind: our server has more content than any other", "server ever released. There's hundreds of hours of", "exciting and flawless gameplay awaiting you, "+player.getUsername()+".", "Enjoy your time playing "+GameWorld.getSettings().getName()+"!"); + stage++; + break; + + //End of Tutorial + case 1205: + stage = 7; //Next Stage force ends any conversations? + + //Removing Tutorial Island properties on the account (?) and sending the Player to Lumbridge + player.removeAttribute("tut-island"); + player.getConfigManager().set(1021, 0); + player.getProperties().setTeleportLocation(new Location(3233, 3230)); + TutorialSession.getExtension(player).setStage(72); + player.getInterfaceManager().closeOverlay(); + + //Clears and Resets the Player's account and focuses the default interface to their Inventory + player.getInventory().clear(); + player.getEquipment().clear(); + player.getBank().clear(); + player.getInterfaceManager().restoreTabs(); //This still hides the Attack (double swords) in the player menu until Player wields a weapon. + player.getInterfaceManager().setViewedTab(3); + player.getInventory().add(STARTER_PACK); + player.getBank().add(STARTER_BANK); + + //This overwrites the stuck dialogue after teleporting to Lumbridge for some reason + //Dialogue from 2007 or thereabouts + //Original is five lines, but if the same is done here it will break. Need to find another way of showing all this information. + interpreter.sendDialogue("Welcome to Lumbridge! To get more help, simply click on the","Lumbridge Guide or one of the Tutors - these can be found by looking","for the question mark icon on your mini-map. If you find you are","lost at any time, look for a signpost or use the Lumbridge Home Port Spell."); + + //Appending the welcome message and some other stuff + player.getPacketDispatch().sendMessage("Welcome to " + GameWorld.getSettings().getName() + "."); + + + + player.unlock(); + TutorialSession.getExtension(player).setStage(TutorialSession.MAX_STAGE + 1); + if (player.getIronmanManager().isIronman() && player.getSettings().isAcceptAid()) { + player.getSettings().toggleAcceptAid(); + } + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendInfoUpdate(player); + } + int slot = player.getAttribute("tut-island:hi_slot", -1); + if (slot < 0 || slot >= HintIconManager.MAXIMUM_SIZE) { + break; + } + + player.removeAttribute("tut-island:hi_slot"); + HintIconManager.removeHintIcon(player, slot); + break; + case 7: + end(); + break; + case 99: + end(); + TutorialStage.load(player, TutorialSession.getExtension(player).getStage(), false); + break; + } + return true; + } + + //Magic Instructor Dialogue during the Tutorial, Repeated from above? + switch (TutorialSession.getExtension(player).getStage()) { + case 67: + switch (stage) { + case 0: + interpreter.sendDialogues(946, FacialExpression.NEUTRAL, "Good day, newcomer. My name is Terrova. I'm here", "to tell you about Magic. Let's start by opening your", "spell list."); + stage = 1; + break; + case 1: + end(); + TutorialStage.load(player, 68, false); + break; + } + break; + case 69: + switch (stage) { + case 0: + if (!player.getInventory().contains(556, 1) && !player.getInventory().contains(558, 1)) { + if (player.getInventory().freeSlots() > 2) { + interpreter.sendDoubleItemMessage(RUNES[0], RUNES[1], "Terrova gives you five air runes and five mind runes!"); + player.getInventory().add(RUNES[0], RUNES[1]); + stage = 3; + } + } else { + end(); + TutorialStage.load(player, 70, false); + } + break; + case 3: + end(); + TutorialStage.load(player, 70, false); + break; + } + break; + case 70: + switch (stage) { + case 0: + break; + case 3: + end(); + TutorialStage.load(player, 70, false); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {/* skippy */2796, /* magic instructor */946 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialIslandPlugin.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialIslandPlugin.java new file mode 100644 index 000000000..ae4550c23 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialIslandPlugin.java @@ -0,0 +1,175 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the node options in tutorial island. + * @author Vexia + */ +@Initializable +public class TutorialIslandPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(3015).getHandlers().put("option:open", this); + ObjectDefinition.forId(3016).getHandlers().put("option:open", this); + NPCDefinition.forId(2796).getHandlers().put("option:skip-tutorial", this); + ObjectDefinition.forId(3014).getHandlers().put("option:open", this); + ObjectDefinition.forId(3017).getHandlers().put("option:open", this); + ObjectDefinition.forId(3018).getHandlers().put("option:open", this); + ObjectDefinition.forId(3019).getHandlers().put("option:open", this); + ObjectDefinition.forId(3020).getHandlers().put("option:open", this); + ObjectDefinition.forId(3021).getHandlers().put("option:open", this); + ObjectDefinition.forId(3022).getHandlers().put("option:open", this); + ObjectDefinition.forId(3023).getHandlers().put("option:open", this); + ObjectDefinition.forId(3024).getHandlers().put("option:open", this); + ObjectDefinition.forId(3025).getHandlers().put("option:open", this); + ObjectDefinition.forId(3026).getHandlers().put("option:open", this); + ObjectDefinition.forId(3029).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(3030).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(3031).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(1740).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(3028).getHandlers().put("option:climb-up", this); +// PluginManager.definePlugin(new BrotherBraceDialogue(), new CombatInstructorDialogue(), new TutorialBook(), new FinancialAdvisorDialogue(), new MasterChefDialogue(), new MiningInstructorDialogue(), new QuestGuideDialogue(), new RSGuideDialogue(), new SurvivalExpertDialogue(), new TutorialCompletionDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (node instanceof NPC) { + if (option.equals("skip-tutorial")) { + player.getDialogueInterpreter().open(((NPC) node).getId(), ((NPC) node)); + return true; + } + } else if (node instanceof GameObject) { + if (TutorialSession.getExtension(player).getStage() == 16) { + int first = node.getId(); + int second = first == 3015 ? 3016 : 3015; + if (DoorActionHandler.autowalkFence(player, (GameObject) node, first, second)) { + TutorialStage.load(player, 17, false); + } + return true; + } + final int tut_stage = TutorialSession.getExtension(player).getStage(); + final GameObject object = (GameObject) node; + if (object.getId() == 3028) { + return true; + } + if (object.getId() == 3023 || object.getId() == 3022) { + if (tut_stage == 54) { + player.getDialogueInterpreter().sendDialogues(944, null, "No, don't enter the pit. Range the rats from outside", "the cage."); + return true; + } + if (tut_stage > 54) { + player.getDialogueInterpreter().sendDialogues(944, null, "Oi! Get away from there. Only enter the rat cage", "when I say so."); + return true; + } + if (tut_stage >= 50) { + if (DoorActionHandler.handleAutowalkDoor(player, object) && tut_stage == 50) { + TutorialStage.load(player, 51, false); + } + return true; + } + } + if (object.getId() == 3031) { + return true; + } + if (object.getId() == 1740) { + if (player.getLocation().equals(Location.create(3084, 3124, 1))) { + ClimbActionHandler.climb(player, new Animation(827), Location.create(3084, 3124, 0)); + return true; + } + ClimbActionHandler.climbLadder(player, object, option); + return true; + } + switch (tut_stage) { + case 3: + if (DoorActionHandler.handleAutowalkDoor(player, object)) { + TutorialStage.load(player, 4, false); + } + break; + case 17: + if (DoorActionHandler.handleAutowalkDoor(player, object)) { + TutorialStage.load(player, 18, false); + } + break; + case 22: + if (object.getId() == 3018 && DoorActionHandler.handleAutowalkDoor(player, object)) { + TutorialStage.load(player, 23, false); + } + break; + case 26: + if (DoorActionHandler.handleAutowalkDoor(player, object)) { + TutorialStage.load(player, 27, false); + } + break; + case 29: + if (object.getId() != 3019) { + ClimbActionHandler.climbLadder(player, object, option); + TutorialStage.load(player, 30, false); + } + break; + case 43: + if (object.getId() == 3021 || object.getId() == 3020) { + if (DoorActionHandler.handleAutowalkDoor(player, object)) { + TutorialStage.load(player, 44, false); + } + } + break; + case 55: + if (object.getId() == 3030) { + ClimbActionHandler.climbLadder(player, object, option); + TutorialStage.load(player, 56, false); + } + break; + case 57: + if (object.getId() == 3024) { + if (DoorActionHandler.handleAutowalkDoor(player, object)) { + TutorialStage.load(player, 58, false); + } + } + break; + case 59: + if (object.getId() == 3025) { + if (DoorActionHandler.handleAutowalkDoor(player, object)) { + TutorialStage.load(player, 60, false); + } + } + break; + case 66: + if (object.getId() == 3026) { + if (DoorActionHandler.handleAutowalkDoor(player, object)) { + TutorialStage.load(player, 67, false); + } + } + break; + } + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + GameObject object = (GameObject) n; + if (object.getDefinition().hasAction("open")) { + return DoorActionHandler.getDestination((Entity) node, object); + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialSession.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialSession.java new file mode 100644 index 000000000..5bc9da7be --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialSession.java @@ -0,0 +1,191 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.packet.PacketRepository; +import core.net.packet.context.InterfaceConfigContext; +import core.net.packet.out.InterfaceConfig; + +/** + * Represents the session used during tutorial. + * @author 'Vexia + */ +public final class TutorialSession { + + /** + * The maximum stage, the tutorial can go to. + */ + public final static int MAX_STAGE = 72; + + /** + * Represents the player instance. + */ + private Player player; + + /** + * Represents the delay pulse. + */ + private DelayPulse delayPulse; + + /** + * Constructs a new {@code TutorialSession} {@code Object}. + * @param player the player. + */ + public TutorialSession(Player player) { + this.player = player; + } + + /** + * Method used to extend this class. + * @param player the player. + */ + public static void extend(Player player) { + player.addExtension(TutorialSession.class, new TutorialSession(player)); + } + + /** + * Method used to init this session. + */ + public void init() { + if (getStage() >= MAX_STAGE) { + player.removeAttribute("tut-island"); + setStage(MAX_STAGE + 1); + return; + } + /*if (getStage() < 26) { + player.getSettings().setRunToggled(true); + }*/ + delayPulse = new DelayPulse(); + //player.setAttribute("tut-island", true); + //player.getInterfaceManager().openOverlay(new Component(371)); + //GameWorld.getPulser().submit(delayPulse); + //PacketRepository.send(InterfaceConfig.class, new InterfaceConfigContext(player, 371, 25, true)); + TutorialStage.load(player, getStage(), true); + } + + /** + * If the player has finished tutorial island. + * @return {@code True} if so. + */ + public boolean finished() { + return getStage() >= MAX_STAGE; + } + + /** + * Method used to return the instance of the tutorial session. + * @param player the player. + * @return the session. + */ + public static TutorialSession getExtension(Player player) { + if (player.getExtension(TutorialSession.class) == null) { + extend(player); + } + return player.getExtension(TutorialSession.class); + } + + /** + * Method used to return the stage of the tutorial, the stage is saved in + * the {@link Player#getGameAttributes()} since it's a single piece of data + * to save, the stage should never be reset after the tutorial is finished. + * @return the value of the stage. + */ + public int getStage() { + if (player.isArtificial()) { + return MAX_STAGE + 1; + } + return player.getSavedData().getGlobalData().getTutorialStage(); + } + + /** + * Gets the delay pulse. + * @return the delay pulse. + */ + public DelayPulse getDelayPulse() { + return delayPulse == null ? new DelayPulse() : delayPulse; + } + + /** + * Method used to set the stage of the tutorial. + */ + public void setStage(int stage) { + getDelayPulse().reset(); + getDelayPulse().hide(); + player.getSavedData().getGlobalData().setTutorialStage(stage); + } + + /** + * Gets the player. + * @return the player. + */ + public Player getPlayer() { + return player; + } + + /** + * Sets the player. + * @param player the player to set. + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * Gets the maximum stage. + * @return the max stage. + */ + public int getMaxStage() { + return MAX_STAGE; + } + + /** + * Represents the pulse used to inform a player to go to the next stage. + * @author 'Vexia + * @version 1.0 + */ + public final class DelayPulse extends Pulse { + + /** + * Represents the delay. + */ + private int delay; + + /** + * Constructs a new {@code DelayPulse} {@code Object}. + */ + public DelayPulse() { + super(1, player); + reset(); + } + + @Override + public boolean pulse() { + if (delay < GameWorld.getTicks()) { + show(); + } + return false; + } + + /** + * Method used to reset the delay. + */ + public void reset() { + delay = GameWorld.getTicks() + 20000; + } + + /** + * Method used to hide the arrow. + */ + public void hide() { + PacketRepository.send(InterfaceConfig.class, new InterfaceConfigContext(player, 371, 24, true)); + } + + /** + * Method used to show the arrow. + */ + public void show() { + reset(); + PacketRepository.send(InterfaceConfig.class, new InterfaceConfigContext(player, 371, 24, false)); + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialStage.java b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialStage.java new file mode 100644 index 000000000..3c3ff8eaa --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/quest/tutorials/tutorialisland/TutorialStage.java @@ -0,0 +1,1032 @@ +package core.game.content.quest.tutorials.tutorialisland; + +import core.game.component.Component; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; + +/** + * Represents a tutorial stage. + * @author 'Vexia + * @date 06/03/2013 + */ + + +public enum TutorialStage { + STAGE_0(0) { + @Override + public void run(final Player player) { + if (login) { + player.lock(1); + // player.getProperties().setTeleportLocation(Location.create(3094, 3107, 0)); + player.getProperties().setTeleportLocation(Location.create(2524, 5002, 0)); // Since tutorial is disabled... + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13); + GameWorld.getPulser().submit(new Pulse(2) { + @Override + public boolean pulse() { + CharacterDesign.open(player); + return true; + } + }); + } + } + }, + STAGE_1(1) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(1021, 12); + } else { + removeHintIcon(player); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("", "Player controls", "Please click on the flashing spanner icon found at the bottom", "right of your screen. This will display your player controls.", "")); + } + }, + STAGE_2(2) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13); + } else { + player.getConfigManager().set(1021, 0); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(945))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendScrollMessageWithBlueTitle("Player controls", "On the side panel you can now see a variety of options from", "changing the brightness of the screen and the volume of", "music, to selecting whether your player should accept help", "from other players. Don't worry about these too much for now,", "they will become clearer as you explore the game. Talk to the", GameWorld.getSettings().getName() + " Guide to continue.")); + } + }, + STAGE_3(3) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Location.create(3098, 3107, 0), 1, -1, player.getHintIconManager().freeSlot(), 125, 3)); + Component.setUnclosable(player, player.getDialogueInterpreter().sendScrollMessageWithBlueTitle("Interacting with scenery", "You can interact with many items of scenery by simply clicking", "on them. Right clicking will also give more options. Feel free to", "try it with the things in this room, then click on the door", "indicated with the yellow arrow to go though to the next", "instructor.")); + } + }, + STAGE_4(4) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13); + } else { + removeHintIcon(player); + } + player.getConfigManager().set(406, 2); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(943))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Moving around", "Follow the path to find the next instructor. Clicking on the", "ground will walk you to that point. Talk to the Survival Expert by", "the pond to continue the tutorial. Remember you can rotate", "the view by pressing the arrow keys.")); + } + }, + STAGE_5(5) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 2); + } else { + player.getInterfaceManager().openTab(new Component(149)); + removeHintIcon(player); + } + player.getConfigManager().set(1021, 4); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Viewing the items that you were given.", "Click on the flashing backpack icon to the right hand side of", "the main window to view your inventory. Your inventory is a list", "of everything you have in your backpack.", "")); + } + }, + STAGE_6(6) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 2); + } else { + player.getConfigManager().set(1021, 0); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Cut down a tree", "You can click on the backpack icon at any time to view the", "items that you currently have in your inventory. You will see", "that you now have an axe in your inventory. Use this to get", "some logs by clicking on one of the trees in the area.")); + } + }, + STAGE_7(7) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 2); + } else { + removeHintIcon(player); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Please wait.", "", "Your character is now attempting to cut down the tree. Sit back", "for a moment while " + (player.getAppearance().isMale() ? "he" : "she") + " does all the hard work.", "")); + } + }, + STAGE_8(8) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 2); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Making a fire", "Well done! You managed to cut some logs from the tree! Next,", "use the tinderbox in your inventory to light the logs.", "First click on the tinderbox to 'use' it.", "Then click on the logs in your inventory to light them.")); + } + }, + STAGE_9(9) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 2); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Please wait.", "", "Your character is now attempting to light a fire.", "This should only take a few seconds.", "")); + } + }, + STAGE_10(10) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 2); + } else { + player.getInterfaceManager().openTab(new Component(320)); + } + player.getConfigManager().set(1021, 2); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("You gained some experience.", "Click on the flashing bar graph icon near the inventory button to see", "your skill state.", "", "")); + } + }, + STAGE_11(11) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 2); + } else { + player.getConfigManager().set(1021, 0); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(943))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Your skill stats.", "Here you will see how good your skills are. As you move your mouse", "over any of the icons in this tab, the small yellow popup box will show", "you the exact amount of experience you have and how much is", "needed to get to the next level. Speak to the survival guide.")); + } + }, + STAGE_12(12) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 2); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(952))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Catch some shrimp", "Click on the bubbling fishing spot indicated by the flashing arrow.", "Remember, you can check your inventory by clicking the backpack", "icon.", "")); + } + }, + STAGE_13(13) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 2); + } else { + removeHintIcon(player); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Please wait.", "", "This should only take a few seconds.", "As you gain Fishing experience you'll find that there are many types", "of fish and many ways to catch them.")); + } + }, + STAGE_14(14) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + } + player.getConfigManager().set(406, 3); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Cooking your shrimp", "Now you have caught some shrimp, let's cook it. First light a fire: chop", "down a tree and then use the tinderbox on the logs. If you've lost", "your hatchet or tinderbox Brynna will give you another.", "")); + } + }, + STAGE_15(15) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 3); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Burning your shrimp", "You have just burnt your first shrimp. This is normal. As you get", "more experience in Cooking you will burn stuff less often. Let's try", "cooking without burning it this time.", ""));/* + * "First catch some more shrimp," + * , + * "then use them on a fire." + * ) + * ) + * ; + */ + } + }, + STAGE_16(16) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 3); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Location.create(3089, 3091, 0), 1, -1, player.getHintIconManager().freeSlot(), 75, 4)); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Well done, you've just cooked your first " + GameWorld.getSettings().getName() + " meal.", "If you'd like a recap on anything you've learnt so far, speak to", "the Survival Expert. You can now move on to the next", "instructor. Click on the gate shown and follow the path.", "Remember, you can move the camera with the arrow keys.")); + } + }, + STAGE_17(17) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + } else { + removeHintIcon(player); + } + player.getConfigManager().set(406, 4); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Location.create(3078, 3084, 0), 1, -1, player.getHintIconManager().freeSlot(), 125, 4)); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Find your next instructor.", "Follow the path until you get to the door with the yellow arrow", "above it. Click on the door to open it. Notice the mini-map in", "the top right, this shows a top down view of the area around", "you. This can also be used for navigation.")); + } + }, + STAGE_18(18) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 4); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(942))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Find your next instructor", "Talk to the chef indicated. He will teach you the more advanced", "aspects of Cooking such as combining ingredients. He will also", "teach you about your music player menu as well.", "")); + } + }, + STAGE_19(19) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 4); + } else { + removeHintIcon(player); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Making dough", "This is the base for many of the meals. To make dough we must mix", "flour and water. First right click the bucket of water and select use.", "then left click on the pot of flour.", "")); + } + }, + STAGE_20(20) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13); + player.getConfigManager().set(406, 4); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Location.create(3075, 3081, 0), 1, -1, player.getHintIconManager().freeSlot(), 75, 2)); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Cooking dough", "Now you have made dough you can cook it. To cook the dough use", "it with the range shown by the arrow. If you lose your dough talk to", "Lev he will give you more ingredients.", "")); + } + }, + STAGE_21(21) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12); + player.getConfigManager().set(406, 4); + } else { + removeHintIcon(player); + player.getInterfaceManager().openTab(new Component(187)); + } + player.getConfigManager().set(1021, 14); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Cooking dough", "Well done! Your first loaf of bread. As you gain experience in", "Cooking, you will be able to make other things like pies, cakes and even ", "kebabs. Now you've got the hang of cooking, lets move on. Click on", "the flashing icon in the bottom right to see the Music Player.")); + } + }, + STAGE_22(22) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10, 12); + player.getConfigManager().set(406, 4); + } else { + player.getConfigManager().set(1021, 0); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Location.create(3072, 3090, 0), 1, -1, player.getHintIconManager().freeSlot(), 125, 4)); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("The Music Player", "From this interface you can control the music that is played. As you", "explore the world and complete quests, more of the tunes will become", "unlocked. Once you've examined this menu use the next door to", "continue.")); + } + }, + STAGE_23(23) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10); + } else { + removeHintIcon(player); + player.getInterfaceManager().openTab(new Component(464)); + } + player.getWalkingQueue().reset(); + player.getLocks().lockMovement(GameWorld.getTicks() + 100000); + player.getConfigManager().set(406, 6); + player.getConfigManager().set(1021, 13); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Emotes", "Now how about showing some feelings? You will see a flashing icon in", "the shape of a person. Click on that to acces your emotes.", "", "")); + } + }, + STAGE_24(24) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 6); + } + player.getLocks().unlockMovement(); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Emotes", "For those situtation where words don't quite describe how you feel try", "an emote. Go ahead try one out! You might notice that some of the", "emotes are grey and cannot be used now. Don't worry! As you", "progress further into the game you'll gain acces to all sorts of things.")); + } + }, + STAGE_25(25) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 6); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Running", "It's only a short distance to the next guide.", "Why not try running there? To do this click on the run icon in", "your settings tab.", "")); + } + }, + STAGE_26(26) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 6); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(949))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendScrollMessageWithBlueTitle("Run to the next guide", "Now that you have the run button turned on, follow the path", "until you come to the end. You may notice that the number on", "the button goes down. This is your run energy. If your run", "energy reaches zero, you'll stop running. Click on the door to", "pass through it.")); + } + }, + STAGE_27(27) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 2, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 7); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Talk with the Quest Guide.", "", "He will tell you all about quests.", "", "")); + } + }, + STAGE_28(28) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 7); + } + player.getConfigManager().set(1021, 0); + player.getInterfaceManager().openTab(new Component(274)); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Your quest Journal", "This is your quest Journal, a list of all the quests in the game. Talk", "to the Quest Guide again for an explanation.", "", "")); + } + }, + STAGE_29(29) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 7); + } else { + removeHintIcon(player); + } + player.getConfigManager().set(1021, 0); + player.getInterfaceManager().openTab(new Component(274)); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(0, 3088, 3119))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("", "Moving on.", "It's time to enter some caves. Click on the ladder to go down to the", "next area.", "")); + } + }, + STAGE_30(30) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + } else { + removeHintIcon(player); + } + player.getConfigManager().set(1021, 0); + player.getInterfaceManager().openTab(new Component(274)); + player.getConfigManager().set(406, 8); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(948))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Mining and Smithing", "Next let's get you a weapon, or more to the point, you can make", "your first weapon yourself. Don't panic, the Mining Instructor will", "help you. Talk to him and he'll tell you all about it.", "")); + } + }, + STAGE_31(31) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 8); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(0, 3076, 9504))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Prospecting", "To prospect a mineable rock, just right click it and select the prospect", "rock option. This will tell you the type of ore you can mine from it.", "Try it now on one of the rocks indicated", "")); + } + }, + STAGE_32(32) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 8); + } else { + removeHintIcon(player); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("", "", "Please wait.", "Your character is now attempting to prospect the rock. This should", "Only take a few seconds.")); + } + }, + STAGE_33(33) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 8); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(0, 3086, 9501))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("It's tin.", "So now you know there's tin in the grey rocks, try prospecting the", "brown ones next.", "", "")); + } + }, + STAGE_34(34) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 8); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(948))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendScrollMessageWithBlueTitle("It's copper.", "Talk to the Mining Instructor to find out about these types of", "ore and how you can mine them.", "He'll even give you the required tools.", "")); + } + }, + STAGE_35(35) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 8); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(0, 3076, 9504))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Mining", "It's quite simple really. All you need to do is right click on the rock", "and select 'mine'. You can only mine when you have a pickaxe. So", "give it a try: first mine one tin ore.", "")); + } + }, + STAGE_36(36) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 8); + } else { + removeHintIcon(player); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("", "Please wait.", "Your character is now attempting to mine the rock.", "This should only take a few seconds.", "")); + } + }, + STAGE_37(37) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 8); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(0, 3086, 9501))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Mining", "Now you have some tin ore you just need some copper ore, then", "you'll have all you need to create a bronze bar. As you did before", "right click on the copper rock and select 'mine'.", "")); + } + }, + STAGE_38(38) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 8); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(0, 3076, 9504))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Mining", "Now you have some copper ore you just need some tin ore, then", "you'll have all you need to create a bronze bar. As you did before", "right click on the tin rock and select 'mine'.", "")); + } + }, + STAGE_39(39) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 9); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(0, 3078, 9495))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Smelting", "You should now have both some copper and tin ore. So let's smelt", "them to make a bronze bar. To do this right click on either tin or", "copper ore and select use then left click on the furnance. Try it now.", "")); + } + }, + STAGE_40(40) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 9); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(948))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("You've made a bronze bar!", "Speak to the Mining Instructor and he'll show you how to make", "it into a weapon.", "", "")); + } + }, + STAGE_41(41) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 9); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(Location.create(3083, 9499, 0)))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Smithing a dagger", "To smith you'll need a hammer - like the one you were given by", "Dezzick - access to an anvil like the one with the arrow over it", "and enough metal bars to make what you are trying to smith.", "To start the process, use the bar on one of the anvils.")); + } + }, + STAGE_42(42) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 9); + } else { + removeHintIcon(player); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Smithing a dagger.", "Now you have the Smithing menu open, you will see a list of all", "the thing you can make. Only the dagger can be made at this time", "this is shown by the white text under it. You'll need", "to select the dagger to continue.")); + } + }, + STAGE_43(43) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 9); + } else { + removeHintIcon(player); + } + GameObject object = RegionManager.getObject(Location.create(3094, 9502, 0)); + if (object != null) { + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, object)); + } else { + System.out.println("Object is null tutorial stage 43!"); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("You've finished in this area.", "So let's move on. Go through the gates shown by the arrow.", "Remember, you may need to move the camera to see your", "surroundings.", "")); + } + }, + STAGE_44(44) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 10); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(944))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Combat.", "In this area you will find out about combat, both melee and", "ranged. Speak to the guide and he'll tell you about it.", "", "")); + } + }, + STAGE_45(45) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 4, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 10); + } else { + removeHintIcon(player); + } + player.getInterfaceManager().openTab(new Component(387)); + player.getConfigManager().set(1021, 5); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Wielding weapons.", "", "You now have access to a new interface. Click on the flashing", "icon of a man, the one to the right of your backpack icon.", "")); + } + }, + STAGE_46(46) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 10); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("This is your worn inventory.", "From here you can see what items you have equipped. Let's", "get one of those slots filled, go back to your inventory and", "right click your dagger, select wield from the menu.", "")); + } + }, + STAGE_47(47) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 10); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(944))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendScrollMessageWithBlueTitle("You're now holding your dagger.", "Clothes, armor, weapons and many other items are equipped", "like this. You can unequip items by clicking on the item in the", "worn inventory. You can close this window by clicking on the", "small 'x' in the top right hand corner. Speak to the Combat", "Instructor to continue.")); + } + }, + STAGE_48(48) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 10); + } else { + removeHintIcon(player); + } + player.getInterfaceManager().openTab(new Component(387)); + Component.setUnclosable(player, player.getDialogueInterpreter().sendScrollMessageWithBlueTitle("Unequipping items.", "In your worn inventory panel, right click on the dagger and", "select the remove option from the drop down list. After you've", "unequipped the dagger, wield the sword and shield. As you", "pass the mouse over an item you will see its name appear at", "the top left of the screen.")); + } + }, + STAGE_49(49) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(0, 5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 10); + } + player.getConfigManager().set(406, 10); + player.getConfigManager().set(1021, 1); + WeaponInterface inter = player.getExtension(WeaponInterface.class); + if (inter == null) { + player.addExtension(WeaponInterface.class, inter = new WeaponInterface(player)); + } + player.getInterfaceManager().openTab(inter); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Combat interface.", "Click on the flashing crossed swords icon to see the combat", "interface.", "", "")); + } + }, + STAGE_50(50) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 11); + } + player.getConfigManager().set(406, 11); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(Location.create(3110, 9518, 0)))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendScrollMessageWithBlueTitle("This is your combat interface.", "From this interface you can select the type of attack your", "character will use. Different monsters have different", "weaknesses. If you hover your mouse over the buttons, you", "will see the type of XP you will receive when using each type of", "attack. Now you have the tools needed for battle why not slay", "some rats. Click on the gates indicated to continue.")); + } + }, + STAGE_51(51) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 11); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(87))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Attacking", "To attack the rat, click it and select the attack option. You", "will then walk over to it and start hitting it.", "", "")); + } + }, + STAGE_52(52) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 11); + } else { + removeHintIcon(player); + } + player.getConfigManager().set(406, 11); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Sit back and watch", "While you are fighting you will see a bar over your head. The", "bar shows how much health you have left. Your opponent will", "have one too. You will continue to attack the rat until it's dead", "or you do something else.")); + } + }, + STAGE_53(53) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 12); + } + player.getConfigManager().set(406, 12); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Well done, you've made your first kill!", "Pass through the gate and talk to the Combat Instructor; he", "will give you your next task.", "", "")); + } + }, + STAGE_54(54) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 12); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(87))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Rat ranging.", "Now you have a bow and some arrows. Before you can use", "them you'll need to equip them. Once equipped with the", "ranging gear try killing another rat. Remember, to attack right", "click on the monster and select attack.")); + } + }, + STAGE_55(55) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 12); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(Location.create(3111, 9526, 0)))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Moving on.", "You have completed the tasks here, to move on click on the", "ladder shown. If you need to go over any of what you learned", "here just talk to Vannaka and he'll tell you what he can.", "")); + } + }, + STAGE_56(56) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 14); + } else { + removeHintIcon(player); + } + player.getConfigManager().set(406, 14); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(Location.create(3122, 3124, 0)))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Banking.", "Follow the path and you will come to the front of a building.", "This is the 'Bank of " + GameWorld.getSettings().getName() + "' where you can store all your", "most valued items. To open your bank box just right click on an", "open booth indicated and select use.")); + } + }, + STAGE_57(57) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 14); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(Location.create(3125, 3124, 0)))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("This is your bank box.", "You can store stuff here for safekeeping. If you die, anything", "in your bank will be saved. To deposit something, right click it", "and select 'store'. One you've had a good look, close the", "window and move on through the door indicated.")); + } + }, + STAGE_58(58) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 14); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(947))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Financial advice.", "The guide here will tell you about making cash. Just click on", "him to hear what he's got to say.", "", "")); + } + }, + STAGE_59(59) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 14); + } else { + removeHintIcon(player); + } + GameObject object = RegionManager.getObject(Location.create(3130, 3124, 0)); + if (object != null) { + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, object)); + } else { + System.out.println("Object is null tutorial stage 59!"); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("", "Continue through the next door.", "", "", "")); + } + }, + STAGE_60(60) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 16); + } else { + removeHintIcon(player); + } + player.getConfigManager().set(406, 16); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(954))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Prayer", "Follow the path to the chapel and enter it.", "Once inside talk to the monk. He'll tell you all about the prayer", "skill.", "")); + } + }, + STAGE_61(61) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(5, 6, 7, 8, 9, 10); + player.getConfigManager().set(406, 16); + } else { + removeHintIcon(player); + } + player.getInterfaceManager().openTab(new Component(271)); + player.getConfigManager().set(1021, 6); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Your Prayer menu", "Click on the flashing icon to open the Prayer menu.", "", "", "")); + + } + }, + STAGE_62(62) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(6, 7, 8, 9, 10); + player.getConfigManager().set(406, 16); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(954))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("", "Your Prayer menu.", "Talk with Brother Brace and he'll tell you all about prayer.", "", "")); + } + }, + STAGE_63(63) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(6, 7, 8, 9, 10); + player.getConfigManager().set(406, 16); + } + player.getInterfaceManager().openTab(new Component(550)); + player.getConfigManager().set(1021, 9); + removeHintIcon(player); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("", "Friends list.", "You should now see another new icon. Click on the flashing", "smiling face to open your friend list.", "")); + } + }, + STAGE_64(64) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(6, 7, 10); + player.getConfigManager().set(406, 16); + } + player.getInterfaceManager().openTab(new Component(589)); + player.getInterfaceManager().openTab(new Component(551)); + player.getInterfaceManager().openTab(new Component(589)); + player.getConfigManager().set(1021, 10); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("This is your friends list.", "This will be explained by Brother Brace shortly, but first click", "the other flashing icon next to the friends list one.", "", "")); + } + }, + STAGE_65(65) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(6, 7); + player.getConfigManager().set(406, 16); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(954))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("This is your ignore list.", "The two lists, friends and ignore, can be very helpful for", "keeping track of when your friends are online or for blocking", "messages from people you simply don't like. Speak with", "Brother Brace and he will tell you more.")); + } + }, + STAGE_66(66) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(6, 7); + player.getConfigManager().set(406, 16); + } + removeHintIcon(player); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, RegionManager.getObject(Location.create(3122, 3102, 0)))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Your final instructor!", "You're almost finished on tutorial island. Pass through the", "door to find the path leading to your last instructor.", "", "")); + } + }, + STAGE_67(67) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(6, 7); + player.getConfigManager().set(406, 17); + } else { + removeHintIcon(player); + } + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(946))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Your final instructor!", "Just follow the path to the wizards house, where you will be", "shown how to cast spells. Just talk with the mage indicated to", "find out more.", "")); + } + }, + STAGE_68(68) { + @Override + public void run(final Player player) { + if (login) { + player.getInterfaceManager().hideTabs(6, 7); + player.getConfigManager().set(406, 17); + } else { + removeHintIcon(player); + } + player.getInterfaceManager().openTab(new Component(player.getSpellBookManager().getSpellBook())); + player.getConfigManager().set(1021, 7); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("Open up your final menu.", "Open up the Magic Spellbook tab by clicking on the flashing spellbook", "icon next to the Prayer List tab you just learned about.", "", "")); + } + }, + STAGE_69(69) { + @Override + public void run(final Player player) { + if (login) { + player.getConfigManager().set(406, 19); + } + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("", "This is your spell list.", "", "Ask the mage about it.", "")); + } + }, + STAGE_70(70) { + @Override + public void run(final Player player) { + if (login) { + player.getConfigManager().set(406, 20); + } + player.getInterfaceManager().restoreTabs(); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(41))); + Component.setUnclosable(player, player.getDialogueInterpreter().sendScrollMessageWithBlueTitle("Cast Wind Strike at a chicken.", "Now you have the runes you should see the Wind Strike icon", "at the top-left of your spellbook, second from the left. Walk over to", "the caged chickens, click the Wind Strike icon and then ", "select one of the chickens to cast it on. It may take", "several tries. If you need more runes ask Terrova")); + } + }, + STAGE_71(71) { + @Override + public void run(final Player player) { + if (login) { + player.getConfigManager().set(406, 20); + } else { + removeHintIcon(player); + } + TutorialSession.getExtension(player).getDelayPulse().stop(); + player.getInterfaceManager().restoreTabs(); + player.setAttribute("tut-island:hi_slot", HintIconManager.registerHintIcon(player, Repository.findNPC(946))); + player.removeAttribute("tut-island"); + Component.setUnclosable(player, player.getDialogueInterpreter().sendPlaneMessageWithBlueTitle("You have almost completed the tutorial!", "All you need to do now is teleport to the mainland. Just speak with", "Terrova and he'll tell you how to do that.", "You have almost completed the tutorial!", "")); + } + }; + + /** + * The stage. + */ + private final int stage; + + /** + * Represents if it's a login, when the stage is loaded. + */ + protected boolean login; + + /** + * Constructs a new {@code TutorialStage} {@code Object}. + * @param stage the stage, + */ + TutorialStage(int stage) { + this.stage = stage; + } + + /** + * Method used to handle when the stage is loaded, + * @param player the player. + */ + public void run(final Player player) { + } + + /** + * Represents if it is a login stage. + * @param login the login value. + * @return {@code True} if so. + */ + public boolean isLogin(boolean login) { + return this.login = login; + } + + /** + * @return the stage. + */ + public int getStage() { + return stage; + } + + /** + * Method used to load a new stage of the tutorial. + * @param stage the stage. + * @param login the login. + */ + public static void load(final Player player, int stage, boolean login) { + if (TutorialSession.getExtension(player) != null) { + TutorialSession.extend(player); + } + + final TutorialStage tutorial_stage = forStage(stage); + if (tutorial_stage == null) { + SystemLogger.logErr("Unhandled tutorial stage " + stage + "."); + return; + } + player.setAttribute("tut-island", true); + tutorial_stage.isLogin(login); + tutorial_stage.run(player); + TutorialSession.getExtension(player).setStage(stage); + TutorialSession.getExtension(player).getDelayPulse().reset(); + TutorialSession.getExtension(player).getDelayPulse().hide(); + } + + /** + * Gets the tutorial stage by the stage id. + * @param id the id. + * @return the tutorial stage. + */ + public static TutorialStage forStage(int id) { + for (TutorialStage stage : TutorialStage.values()) { + if (stage.getStage() == id) { + return stage; + } + } + return null; + } + + /** + * Removes the current hint icon (if any). + * @param player The player. + */ + public static void removeHintIcon(Player player) { + int slot = player.getAttribute("tut-island:hi_slot", -1); + if (slot < 0 || slot >= HintIconManager.MAXIMUM_SIZE) { + return; + } + player.removeAttribute("tut-island:hi_slot"); + HintIconManager.removeHintIcon(player, slot); + } +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/ClueLevel.java b/Server/src/main/java/Server/core/game/content/ttrail/ClueLevel.java new file mode 100644 index 000000000..0b6655517 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/ClueLevel.java @@ -0,0 +1,672 @@ +package core.game.content.ttrail; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.container.access.InterfaceContainer; +import core.game.node.entity.npc.drop.DropFrequency; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.game.node.item.WeightedChanceItem; +import core.game.world.GameWorld; +import core.tools.RandomFunction; + +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * A clue scroll level. + * + * @author Vexia + */ +public enum ClueLevel { + + EASY(new Item(2714), 1 << 16 | 5, + new ChanceItem(2633, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2635, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2637, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2587, 1, 1, DropFrequency.UNCOMMON), + // black + // t + new ChanceItem(2583, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2585, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(3472, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2589, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2595, 1, 1, DropFrequency.UNCOMMON), + // black + // g + new ChanceItem(2591, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2593, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(3473, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2597, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2631, 1, 1, DropFrequency.UNCOMMON), + // highway + // man + // mask + new ChanceItem(7392, 1, 1, DropFrequency.UNCOMMON), + // wizard t + new ChanceItem(7396, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7388, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7390, 1, 1, DropFrequency.UNCOMMON), + // wizard + // g + new ChanceItem(7386, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7394, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7362, 1, 1, DropFrequency.UNCOMMON), + // studded + // g + new ChanceItem(7366, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7364, 1, 1, DropFrequency.UNCOMMON), + // studded + // t + new ChanceItem(7368, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10404, 1, 1, DropFrequency.UNCOMMON), + // red + // ele + // shirt + new ChanceItem(10406, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10424, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10426, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10408, 1, 1, DropFrequency.UNCOMMON), + // blue + // ele + // shirt + new ChanceItem(10410, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10428, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10430, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10412, 1, 1, DropFrequency.UNCOMMON), + // green + // ele + // shirt + new ChanceItem(10414, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10432, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10434, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10316, 1, 1, DropFrequency.RARE), + // bob + // the + // cat + new ChanceItem(10318, 1, 1, DropFrequency.RARE), + new ChanceItem(10320, 1, 1, DropFrequency.RARE), + new ChanceItem(10322, 1, 1, DropFrequency.RARE), + new ChanceItem(10324, 1, 1, DropFrequency.RARE), + new ChanceItem(10392, 1, 1, DropFrequency.RARE), + // emote + // enhancers + new ChanceItem(10394, 1, 1, DropFrequency.RARE), + new ChanceItem(10396, 1, 1, DropFrequency.RARE), + new ChanceItem(10398, 1, 1, DropFrequency.RARE), + new ChanceItem(10366, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10458, 1, 1, DropFrequency.UNCOMMON), + // vestement + // robes(sara, + // guthix, + // zammy) + new ChanceItem(10464, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10462, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10466, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10460, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10468, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(13095, 1, 1, DropFrequency.UNCOMMON), + // black + // cane + new ChanceItem(13105, 1, 1, DropFrequency.RARE), + // spikey + // helmet + new ChanceItem(1077, 1, 1, DropFrequency.COMMON), + new ChanceItem(1089, 1, 1, DropFrequency.COMMON), + new ChanceItem(1107, 1, 1, DropFrequency.COMMON), + new ChanceItem(1125, 1, 1, DropFrequency.COMMON), + new ChanceItem(1151, 1, 1, DropFrequency.COMMON), + new ChanceItem(1165, 1, 1, DropFrequency.COMMON), + new ChanceItem(1179, 1, 1, DropFrequency.COMMON), + new ChanceItem(1195, 1, 1, DropFrequency.COMMON), + new ChanceItem(1217, 1, 1, DropFrequency.COMMON), + new ChanceItem(1283, 1, 1, DropFrequency.COMMON), + new ChanceItem(1297, 1, 1, DropFrequency.COMMON), + new ChanceItem(1313, 1, 1, DropFrequency.COMMON), + new ChanceItem(1327, 1, 1, DropFrequency.COMMON), + new ChanceItem(1341, 1, 1, DropFrequency.COMMON), + new ChanceItem(1361, 1, 1, DropFrequency.COMMON), + new ChanceItem(1367, 1, 1, DropFrequency.COMMON), + new ChanceItem(1426, 1, 1, DropFrequency.COMMON), + new ChanceItem(3098, 1, 1, DropFrequency.COMMON), + new ChanceItem(4821, 1, 1, DropFrequency.COMMON), + new ChanceItem(8779, 4, 38, DropFrequency.COMMON), + new ChanceItem(850, 1, 4, DropFrequency.COMMON), + new ChanceItem(334, 4, 19, DropFrequency.COMMON), + new ChanceItem(1169, 1, 1, DropFrequency.COMMON), + new ChanceItem(1059, 1, 1, DropFrequency.COMMON), + new ChanceItem(1061, 1, 1, DropFrequency.COMMON), + new ChanceItem(1063, 1, 1, DropFrequency.COMMON), + new ChanceItem(1095, 1, 1, DropFrequency.COMMON), + new ChanceItem(1129, 1, 1, DropFrequency.COMMON), + new ChanceItem(1167, 1, 1, DropFrequency.COMMON), + new ChanceItem(1131, 1, 1, DropFrequency.COMMON), + new ChanceItem(858, 1, 4, DropFrequency.COMMON), + new ChanceItem(330, 3, 23, DropFrequency.COMMON), + new ChanceItem(1441, 1, 3, DropFrequency.COMMON), + new ChanceItem(1443, 1, 3, DropFrequency.COMMON), + new ChanceItem(1270, 1, 3, DropFrequency.COMMON), + new ChanceItem(1097, 1, 1, DropFrequency.COMMON), + new ChanceItem(1133, 1, 1, DropFrequency.COMMON)), + + MEDIUM(new Item(2717), 1 << 16 | 6, + new ChanceItem(2605, 1, 1, DropFrequency.UNCOMMON), + // Trimmed + // addy + // shit + new ChanceItem(2599, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2601, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2603, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(3474, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2613, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2607, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2609, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(3475, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2611, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2579, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2647, 1, 1, DropFrequency.UNCOMMON), + // Headbands + new ChanceItem(2645, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2649, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2605, 1, 1, DropFrequency.UNCOMMON), + // addy + // trimmed + // shit + new ChanceItem(2599, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2601, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2603, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(3474, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2613, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2607, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2609, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(3475, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2611, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2577, 1, 1, DropFrequency.RARE), + // Boots + new ChanceItem(2579, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2647, 1, 1, DropFrequency.UNCOMMON), + // Headbands + new ChanceItem(2645, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2649, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7319, 1, 1, DropFrequency.UNCOMMON), + // Boaters + new ChanceItem(7321, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7323, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7325, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7327, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7372, 1, 1, DropFrequency.UNCOMMON), + // Trimmed + // Dragonhide + // shit + new ChanceItem(7380, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7370, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7378, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(13103, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(13097, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(13109, 1, 1, DropFrequency.UNCOMMON), + // animal + // masks + new ChanceItem(13107, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(13111, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(13113, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(13115, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10364, 1, 1, DropFrequency.UNCOMMON), + // ammy + // of + // strength + // (t) + new ChanceItem(10420, 1, 1, DropFrequency.UNCOMMON), + // white ele + new ChanceItem(10422, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10400, 1, 1, DropFrequency.RARE), + // black + // ele + new ChanceItem(10402, 1, 1, DropFrequency.RARE), + new ChanceItem(10416, 1, 1, DropFrequency.UNCOMMON), + // purple + // ele + new ChanceItem(10418, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10436, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10438, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10296, 1, 1, DropFrequency.UNCOMMON), + // addy + // heraldic + // helms + new ChanceItem(10298, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10300, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10302, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10304, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10666, 1, 1, DropFrequency.UNCOMMON), + // addy + // heraldic + // shield + new ChanceItem(10669, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10672, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10675, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10678, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10446, 1, 1, DropFrequency.UNCOMMON), + // cloaks + new ChanceItem(10448, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10450, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(1161, 1, 1, DropFrequency.COMMON), + new ChanceItem(1123, 1, 1, DropFrequency.COMMON), + new ChanceItem(1073, 1, 1, DropFrequency.COMMON), + new ChanceItem(1091, 1, 1, DropFrequency.COMMON), + new ChanceItem(1199, 1, 1, DropFrequency.COMMON), + new ChanceItem(1183, 1, 1, DropFrequency.COMMON), + new ChanceItem(1111, 1, 1, DropFrequency.COMMON), + new ChanceItem(1211, 1, 1, DropFrequency.COMMON), + new ChanceItem(1271, 1, 1, DropFrequency.COMMON), + new ChanceItem(1287, 1, 1, DropFrequency.COMMON), + new ChanceItem(1301, 1, 1, DropFrequency.COMMON), + new ChanceItem(1317, 1, 1, DropFrequency.COMMON), + new ChanceItem(1357, 1, 1, DropFrequency.COMMON), + new ChanceItem(1371, 1, 1, DropFrequency.COMMON), + new ChanceItem(1430, 1, 1, DropFrequency.COMMON), + new ChanceItem(4823, 10, 40, DropFrequency.COMMON), + new ChanceItem(9183, 1, 1, DropFrequency.COMMON), + new ChanceItem(1393, 1, 1, DropFrequency.COMMON), + new ChanceItem(1099, 1, 1, DropFrequency.COMMON), + new ChanceItem(1135, 1, 1, DropFrequency.COMMON), + new ChanceItem(857, 1, 1, DropFrequency.COMMON), + new ChanceItem(8781, 10, 43, DropFrequency.COMMON), + new ChanceItem(374, 6, 23, DropFrequency.COMMON), + new ChanceItem(380, 15, 43, DropFrequency.COMMON), + new ChanceItem(10452, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10454, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10456, 1, 1, DropFrequency.UNCOMMON)), + + HARD(new Item(2720), 1 << 16 | 8, + new ChanceItem(13101, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(13099, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10470, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10472, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10474, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10440, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10442, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10444, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2628, 1, 1, DropFrequency.UNCOMMON), + // Trimmed + // rune + // shit + new ChanceItem(2623, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2625, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2629, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2619, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(3477, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2615, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2617, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2628, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2628, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(3476, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2621, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2673, 1, 1, DropFrequency.UNCOMMON), + // God + // armour + // shit + new ChanceItem(2669, 1, 1, DropFrequency.RARE), + new ChanceItem(2671, 1, 1, DropFrequency.RARE), + new ChanceItem(3480, 1, 1, DropFrequency.RARE), + new ChanceItem(2675, 1, 1, DropFrequency.RARE), + new ChanceItem(2657, 1, 1, DropFrequency.RARE), + new ChanceItem(2653, 1, 1, DropFrequency.RARE), + new ChanceItem(2655, 1, 1, DropFrequency.RARE), + new ChanceItem(2659, 1, 1, DropFrequency.RARE), + new ChanceItem(2665, 1, 1, DropFrequency.RARE), + new ChanceItem(2661, 1, 1, DropFrequency.RARE), + new ChanceItem(3478, 1, 1, DropFrequency.RARE), + new ChanceItem(2663, 1, 1, DropFrequency.RARE), + new ChanceItem(2667, 1, 1, DropFrequency.RARE), + new ChanceItem(3479, 1, 1, DropFrequency.RARE), + new ChanceItem(10286, 1, 1, DropFrequency.RARE), + // heraldic + // shit + new ChanceItem(10667, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10288, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10670, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10290, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10673, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10292, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10676, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10294, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10679, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7376, 1, 1, DropFrequency.UNCOMMON), + // Blue + // dragonhide + // trimmed + new ChanceItem(7384, 1, 1, DropFrequency.COMMON), + new ChanceItem(7374, 1, 1, DropFrequency.COMMON), + new ChanceItem(7382, 1, 1, DropFrequency.COMMON), + // God + // dhide + new ChanceItem(10368, 1, 1, DropFrequency.RARE), + new ChanceItem(10370, 1, 1, DropFrequency.RARE), + new ChanceItem(10372, 1, 1, DropFrequency.RARE), + new ChanceItem(10376, 1, 1, DropFrequency.RARE), + new ChanceItem(10378, 1, 1, DropFrequency.RARE), + new ChanceItem(10380, 1, 1, DropFrequency.RARE), + new ChanceItem(10384, 1, 1, DropFrequency.RARE), + new ChanceItem(10386, 1, 1, DropFrequency.RARE), + new ChanceItem(10388, 1, 1, DropFrequency.RARE), + // Hats + new ChanceItem(2651, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2581, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(2639, 1, 1, DropFrequency.UNCOMMON), + // Cavaliers + new ChanceItem(2641, 1, 1, DropFrequency.COMMON), + new ChanceItem(2643, 1, 1, DropFrequency.COMMON), + new ChanceItem(1163, 1, 1, DropFrequency.COMMON), + new ChanceItem(1127, 1, 1, DropFrequency.COMMON), + new ChanceItem(1079, 1, 1, DropFrequency.COMMON), + new ChanceItem(1093, 1, 1, DropFrequency.COMMON), + new ChanceItem(1201, 1, 1, DropFrequency.COMMON), + new ChanceItem(1185, 1, 1, DropFrequency.COMMON), + new ChanceItem(1213, 1, 1, DropFrequency.COMMON), + new ChanceItem(1275, 1, 1, DropFrequency.COMMON), + new ChanceItem(1289, 1, 1, DropFrequency.COMMON), + new ChanceItem(1303, 1, 1, DropFrequency.COMMON), + new ChanceItem(1319, 1, 1, DropFrequency.COMMON), + new ChanceItem(1359, 1, 1, DropFrequency.COMMON), + new ChanceItem(1373, 1, 1, DropFrequency.COMMON), + new ChanceItem(1432, 1, 1, DropFrequency.COMMON), + new ChanceItem(4824, 10, 43, DropFrequency.COMMON), + new ChanceItem(9144, 6, 23, DropFrequency.COMMON), + new ChanceItem(9185, 1, 1, DropFrequency.COMMON), + new ChanceItem(1747, 1, 1, DropFrequency.COMMON), + new ChanceItem(2503, 1, 1, DropFrequency.COMMON), + new ChanceItem(861, 1, 2, DropFrequency.COMMON), + new ChanceItem(859, 1, 2, DropFrequency.COMMON), + new ChanceItem(8783, 6, 27, DropFrequency.COMMON), + new ChanceItem(380, 16, 38, DropFrequency.COMMON), + new ChanceItem(386, 7, 32, DropFrequency.COMMON), + new ChanceItem(10382, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10374, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(10389, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7398, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7399, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(7400, 1, 1, DropFrequency.UNCOMMON)), + + ; + + /** + * The default rewards. + */ + private static final ChanceItem[] DEFAULT_REWARDS = new ChanceItem[] { + new ChanceItem(995, 500, 7000, DropFrequency.COMMON), + new ChanceItem(10326, 15, 40, DropFrequency.UNCOMMON), + new ChanceItem(7329, 15, 40, DropFrequency.UNCOMMON), + new ChanceItem(7331, 15, 40, DropFrequency.UNCOMMON), + new ChanceItem(7330, 15, 40, DropFrequency.UNCOMMON), + new ChanceItem(10327, 15, 40, DropFrequency.UNCOMMON), + new ChanceItem(10476, 1, 27, DropFrequency.UNCOMMON), + new ChanceItem(556, 1, 228, DropFrequency.COMMON), + new ChanceItem(554, 1, 228, DropFrequency.COMMON), + new ChanceItem(557, 1, 228, DropFrequency.COMMON), + new ChanceItem(557, 1, 228, DropFrequency.COMMON), + new ChanceItem(1694, 1, 1, DropFrequency.RARE), + new ChanceItem(1696, 1, 1, DropFrequency.RARE), + new ChanceItem(1698, 1, 1, DropFrequency.RARE), + new ChanceItem(1700, 1, 1, DropFrequency.RARE), + new ChanceItem(1702, 1, 1, DropFrequency.RARE), + new ChanceItem(847, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(855, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(859, 1, 1, DropFrequency.UNCOMMON), + new ChanceItem(3827, 1, 1, DropFrequency.RARE), + new ChanceItem(3828, 1, 1, DropFrequency.RARE), + new ChanceItem(3829, 1, 1, DropFrequency.RARE), + new ChanceItem(3830, 1, 1, DropFrequency.RARE), + new ChanceItem(3831, 1, 1, DropFrequency.RARE), + new ChanceItem(3832, 1, 1, DropFrequency.RARE), + new ChanceItem(3833, 1, 1, DropFrequency.RARE), + new ChanceItem(3834, 1, 1, DropFrequency.RARE), + new ChanceItem(3835, 1, 1, DropFrequency.RARE), + new ChanceItem(3836, 1, 1, DropFrequency.RARE), + new ChanceItem(3837, 1, 1, DropFrequency.RARE), + new ChanceItem(3838, 1, 1, DropFrequency.RARE) + }; + + /** + * The super rare items. + */ + private static final WeightedChanceItem[] SUPER_RARE = new WeightedChanceItem[] { + //1 Trimmed Glory = 50 = to hit 15% + new WeightedChanceItem(10362, 1, 1, 50), + //5 Gilded Items = 150 = to hit 9% + new WeightedChanceItem(3486, 1, 1, 30), + new WeightedChanceItem(3481, 1, 1, 30), + new WeightedChanceItem(3483, 1, 1, 30), + new WeightedChanceItem(3485, 1, 1, 30), + new WeightedChanceItem(3488, 1, 1, 30), + //12 3rd Age = 120 = to hit 3% + new WeightedChanceItem(10330, 1, 1, 10), + new WeightedChanceItem(10332, 1, 1, 10), + new WeightedChanceItem(10334, 1, 1, 10), + new WeightedChanceItem(10336, 1, 1, 10), + new WeightedChanceItem(10338, 1, 1, 10), + new WeightedChanceItem(10340, 1, 1, 10), + new WeightedChanceItem(10342, 1, 1, 10), + new WeightedChanceItem(10344, 1, 1, 10), + new WeightedChanceItem(10346, 1, 1, 10), + new WeightedChanceItem(10348, 1, 1, 10), + new WeightedChanceItem(10350, 1, 1, 10), + new WeightedChanceItem(10352, 1, 1, 10) }; + + /** + * The casket. + */ + private final Item casket; + + /** + * The length hash of the level. + */ + private final int lengthHash; + + /** + * The reward items. + */ + private final ChanceItem[] rewards; + + /** + * Constructs a new {@Code ClueLevel} {@Code Object} + * + * @param casket + * the casket. + * @param lengthHash + * the hash. + * @param rewards + * the rewards. + */ + private ClueLevel(Item casket, int lengthHash, ChanceItem... rewards) { + this.casket = casket; + this.lengthHash = lengthHash; + this.rewards = rewards; + } + + /** + * Opens a cakset for the player. + * + * @param player + * the player. + * @param casket + * the casket. + */ + public void open(Player player, Item casket) { + if (casket != null) { + if (!player.getInventory().containsItem(casket)) { + return; + } + } + if (player.getTreasureTrailManager().isCompleted() || GameWorld.getSettings().isDevMode()) { + final List rewards = getLoot(player); + player.getInterfaceManager().open(new Component(364).setCloseEvent(new CloseEvent() { + private boolean given; + + @Override + public boolean close(Player player, Component c) { + if (!given) { + for (Item item : rewards) { + player.getInventory().add(item, player); + } + given = true; + } + return true; + } + })); + if (casket != null) { + player.getInventory().remove(casket); + } + player.getTreasureTrailManager().incrementClues(this); + player.getTreasureTrailManager().clearTrail(); + player.sendMessage("Well done, you've completed the Treasure Trail!"); + player.sendMessage(getChatColor(this) + "You have completed " + player.getTreasureTrailManager().getCompletedClues(this) + " " + this.getName().toLowerCase() + " Treasure Trails."); + long value = 0; + for (Item item : rewards) { + value += item.getValue(); + } + player.sendMessage("Your clue is worth approximately " + NumberFormat.getInstance().format(value) + " coins!"); + player.getPacketDispatch().sendAccessMask(1278, 4, 364, 0, 6); + InterfaceContainer.generateItems(player, rewards.toArray(new Item[] {}), new String[] { "" }, 364, 4, 3, 3); + return; + } + Item clue = ClueScrollPlugin.getClue(this); + if (clue == null) { + player.sendMessage("Error! Clue not found! Report to admin."); + return; + } + if (casket != null) { + player.getInventory().replace(clue, casket.getSlot()); + } else { + player.getInventory().add(clue); + } + player.getTreasureTrailManager().setClueId(clue.getId()); + player.getDialogueInterpreter().sendItemMessage(clue, "You've found another clue!"); + } + + /** + * Gets the rewards.ds. + * + * @return the rewar + */ + public List getLoot(Player player) { + List items = new ArrayList<>(); + List ids = new ArrayList<>(); + items.addAll(Arrays.asList(DEFAULT_REWARDS)); + items.addAll(Arrays.asList(this.getRewards())); + List rewards = new ArrayList<>(); + int size = RandomFunction.random(1, 6); + if (this == HARD) { + size = RandomFunction.random(4, 6); + } + Item item = null; + for (int i = 0; i < size; i++) { + rewards.addAll(RandomFunction.rollChanceTable(false,items)); + } + /* + int rand = 1400;// 2000 + if (this == HARD && rand == 11) + */ + //Super Rare Table + if (this == HARD && RandomFunction.random(100) == 50) { + rewards.remove(0); + rewards.add(RandomFunction.rollWeightedChanceTable(SUPER_RARE).asItem()); + } + return rewards; + } + + /** + * Gets a reward item. + * + * @return the item. + */ + public Item getReward(List items) { + Collections.shuffle(items); + return RandomFunction.getChanceItem(items.toArray(new ChanceItem[] {})).getRandomItem(); + } + + /** + * Gets the clue level for the casket. + * + * @param node + * the node. + * @return the level. + */ + public static ClueLevel forCasket(Item node) { + for (ClueLevel level : values()) { + if (node.getId() == level.getCasket().getId()) { + return level; + } + } + return null; + } + + /** + * Gets the Chat color to send on completed clues. + * @param level The clue level. + * @return the chat color. + */ + public static String getChatColor(ClueLevel level) { + if (level == ClueLevel.HARD) { + return ""; + } + if (level == ClueLevel.MEDIUM) { + return ""; + } + return ""; + } + /** + * Gets the maximum length. + * + * @return the length. + */ + public int getMaximumLength() { + return lengthHash & 0xFFFF; + } + + /** + * Gets the minimum length. + * + * @return the length. + */ + public int getMinimumLength() { + return lengthHash >> 16 & 0xFFFF; + } + + /** + * Gets the brewards. + * + * @return the rewards + */ + public ChanceItem[] getRewards() { + return rewards; + } + + /** + * Gets the bcasket. + * + * @return the casket + */ + public Item getCasket() { + return casket; + } + + /** + * Gets the blengthHash. + * + * @return the lengthHash + */ + public int getLengthHash() { + return lengthHash; + } + + /** + * Gets the name of the clue level. + * @return the name. + */ + public String getName() { + return toString(); + } +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/ClueScrollPlugin.java b/Server/src/main/java/Server/core/game/content/ttrail/ClueScrollPlugin.java new file mode 100644 index 000000000..26f22d221 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/ClueScrollPlugin.java @@ -0,0 +1,233 @@ +package core.game.content.ttrail; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.SystemLogger; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Represents a clue scroll plugin. + * @author Vexia + */ +public abstract class ClueScrollPlugin extends MapZone implements Plugin { + + /** + * The wilderness cape ids. + */ + protected static final int[] WILDY_CAPES = new int[] { 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 10638 }; + + /** + * The mapping of clue scrolls. + */ + private static final Map CLUE_SCROLLS = new HashMap<>(); + + /** + * A map of pre organized clue scrolls. + */ + private static final Map> ORGANIZED = new HashMap<>(); + + /** + * The id of the clue scroll. + */ + protected final int clueId; + + /** + * The clue scroll level. + */ + protected final ClueLevel level; + + /** + * The interface id of the clue. + */ + protected final int interfaceId; + + /** + * The zone borders. + */ + protected final ZoneBorders[] borders; + + /** + * Constructs a new {@Code ClueScrollPlugin} {@Code Object} + * @param clueId the id. + * @param level the level. + * @param interfaceId the id. + */ + public ClueScrollPlugin(final String name, final int clueId, ClueLevel level, final int interfaceId, final ZoneBorders... borders) { + super(name, true); + this.clueId = clueId; + this.level = level; + this.interfaceId = interfaceId; + this.borders = borders; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Rewards the player with a casket. + * @param player the player. + * @param casket if we give a ckaset. + */ + public void reward(Player player, boolean casket) { + Item clue = player.getInventory().getItem(new Item(getClueId())); + if (clue == null) { + return; + } + nextStage(player, clue); + if (casket) { + player.getInventory().replace(level.getCasket(), clue.getSlot()); + } else { + player.getInventory().remove(clue); + } + } + + /** + * Rewards the player. + * @param player the player. + */ + public void reward(Player player) { + reward(player, true); + } + + /** + * Increments the next stage of the clue. + * @param player the player. + * @param clue the clue. + */ + public void nextStage(Player player, Item clue) { + if (!player.getTreasureTrailManager().hasTrail() || player.getTreasureTrailManager().hasTrail() && clue.getId() != player.getTreasureTrailManager().getClueId()) { + player.getTreasureTrailManager().startTrail(this); + } + int currentStage = player.getTreasureTrailManager().getTrailStage(); + if (currentStage >= player.getTreasureTrailManager().getTrailLength()) { + player.getTreasureTrailManager().clearTrail(); + } else { + player.getTreasureTrailManager().incrementStage(); + } + } + + /** + * Reads a clue scroll. + * @param player the player. + */ + public void read(Player player) { + if (player.getInterfaceManager().isOpened()) { + player.sendMessage("Please finish what you're doing first."); + return; + } + player.getInterfaceManager().open(new Component(interfaceId)); + } + + /** + * Reigsters a clue scroll into the repository. + * @param clue the plugin. + */ + public void register(ClueScrollPlugin clue) { + if(clue.getClueId() == 2681) + return; + if (CLUE_SCROLLS.containsKey(clue.getClueId())) { + SystemLogger.logErr("Error! Plugin already registered with clue id - " + clue.getClueId() + ", trying to register " + clue.getClass().getCanonicalName() + " the real plugin using the id is " + CLUE_SCROLLS.get(clue.getClueId()).getClass().getCanonicalName() + "!"); + return; + } + List organized = (List) ORGANIZED.get(clue.getLevel()); + if (organized == null) { + organized = new ArrayList<>(); + } + organized.add(clue); + ZoneBuilder.configure(clue); + CLUE_SCROLLS.put(clue.getClueId(), clue); + ORGANIZED.put(clue.getLevel(), organized); + } + + @Override + public void configure() { + if (borders == null) { + return; + } + for (ZoneBorders border : borders) { + register(border); + } + } + + /** + * Gets a clue item. + * @param clueLevel the level. + * @return the item. + */ + public static Item getClue(ClueLevel clueLevel) { + List clues = ORGANIZED.get(clueLevel); + if (clues == null) { + SystemLogger.logErr("Error! There are no clues for level " + clueLevel + "!"); + return null; + } + ClueScrollPlugin clue = clues.get(RandomFunction.random(clues.size())); + return new Item(clue.getClueId()); + } + + /** + * Checks if the player has equipment. + * @param player the player. + * @param equipment the equipment. + * @return {@code True} if so. + */ + public boolean hasEquipment(Player player, int[][] equipment) { + if (equipment == null || equipment.length == 0) { + return true; + } + int hasAmt = 0; + for (int i = 0; i < equipment.length; i++) { + for (int k = 0; k < equipment[i].length; k++) { + if (player.getEquipment().contains(equipment[i][k], 1)) { + hasAmt++; + break; + } + } + } + return hasAmt == equipment.length; + } + + /** + * Gets the bclueId. + * @return the clueId + */ + public int getClueId() { + return clueId; + } + + /** + * Gets the blevel. + * @return the level + */ + public ClueLevel getLevel() { + return level; + } + + /** + * Gets the bclueScrolls. + * @return the clueScrolls + */ + public static Map getClueScrolls() { + return CLUE_SCROLLS; + } + + /** + * Gets the binterfaceId. + * @return the interfaceId + */ + public int getInterfaceId() { + return interfaceId; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/CoordinateCluePlugin.java b/Server/src/main/java/Server/core/game/content/ttrail/CoordinateCluePlugin.java new file mode 100644 index 000000000..6f7b48c5e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/CoordinateCluePlugin.java @@ -0,0 +1,100 @@ +package core.game.content.ttrail; + +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Initializes the coordinate clues. + * @author Vexia + */ +public final class CoordinateCluePlugin extends CoordinateClueScroll { + + /** + * Constructs a new {@code CoordinateCluePlugin} {@code Object} + */ + public CoordinateCluePlugin() { + this(null, -1, null, null, null); + } + + /** + * Constructs a new {@code CoordinateCluePlugin} {@code Object} + * @param name the name. + * @param clueId the clue id. + * @param level the level. + * @param location the location. + * @param clue the clue. + */ + public CoordinateCluePlugin(String name, int clueId, ClueLevel level, Location location, String clue) { + super(name, clueId, level, location, clue); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + register(new CoordinateCluePlugin("tree-gnome-coord", 2807, ClueLevel.MEDIUM, new Location(2478, 3158, 0), "00 degrees 05 minutes south
01 degrees 13 minutes east")); + register(new CoordinateCluePlugin("karamja-coord", 2809, ClueLevel.MEDIUM, new Location(2888, 3153, 0), "00 degrees 13 minutes south
13 degrees 58 minutes east")); + register(new CoordinateCluePlugin("brimhaven-coord", 2811, ClueLevel.MEDIUM, new Location(2743, 3151, 0), "00 degrees 18 minutes south
09 degrees 28 minutes east")); + register(new CoordinateCluePlugin("lumbridge-swamp-coord", 2813, ClueLevel.MEDIUM, new Location(3183, 3151, 0), "00 degrees 20 minutes south
23 degrees 15 minutes east")); + register(new CoordinateCluePlugin("zanaris-shed-coord", 2815, ClueLevel.MEDIUM, new Location(3217, 3178, 0), "00 degrees 30 minutes north
24 degrees 16 minutes east")); + register(new CoordinateCluePlugin("port-sarim-coord", 2817, ClueLevel.MEDIUM, new Location(3007, 3145, 0), "00 degrees 31 minutes south
17 degrees 43 minutes east")); + register(new CoordinateCluePlugin("musa-point-coord", 2819, ClueLevel.MEDIUM, new Location(2896, 3119, 0), "01 degrees 18 minutes south
14 degrees 15 minutes east")); + register(new CoordinateCluePlugin("moss-giant-coord", 2821, ClueLevel.MEDIUM, new Location(2696, 3206, 0), "01 degrees 26 minutes north
08 degrees 01 minutes east")); + register(new CoordinateCluePlugin("hazelmere-coord", 2823, ClueLevel.MEDIUM, new Location(2680, 3111, 0), "01 degrees 35 minutes south
07 degrees 28 minutes east")); + register(new CoordinateCluePlugin("uzer-coord", 2825, ClueLevel.MEDIUM, new Location(3510, 3075, 0), "02 degrees 43 minutes south
33 degrees 26 minutes east")); + register(new CoordinateCluePlugin("ham-coord", 2827, ClueLevel.MEDIUM, new Location(3161, 3251, 0), "02 degrees 48 minutes north
22 degrees 30 minutes east")); + register(new CoordinateCluePlugin("ardy-zoo-coord", 2829, ClueLevel.MEDIUM, new Location(2644, 3251, 0), "02 degrees 50 minutes north
06 degrees 20 minutes east")); + register(new CoordinateCluePlugin("nature-altar-coord", 2831, ClueLevel.HARD, new Location(2874, 3047, 0), "03 degrees 35 minutes south
13 degrees 35 minutes east")); + register(new CoordinateCluePlugin("shilo-mine-coord", 2833, ClueLevel.MEDIUM, new Location(2849, 3033, 0), "04 degrees 00 minutes south
12 degrees 46 minutes east")); + register(new CoordinateCluePlugin("bedapin-camp-coord", 2835, ClueLevel.HARD, new Location(3168, 3041, 0), "03 degrees 45 minutes south
22 degrees 45 minutes east")); + // register(new CoordinateCluePlugin("gorad-coord", 2837, + // ClueLevel.HARD, new Location(2580, 3029, 0), + // "04 degrees 05 minutes south
04 degrees 24 minutes east")); + register(new CoordinateCluePlugin("crandor-coord", 2839, ClueLevel.MEDIUM, new Location(2848, 3297, 0), "04 degrees 13 minutes north
12 degrees 45 minutes east")); + register(new CoordinateCluePlugin("champions-guild-coord", 2841, ClueLevel.MEDIUM, new Location(3179, 3343, 0), "05 degrees 43 minutes north
23 degrees 05 minutes east")); + register(new CoordinateCluePlugin("cairn-island-coord", 2843, ClueLevel.HARD, new Location(2764, 2974, 0), "05 degrees 50 minutes south
10 degrees 05 minutes east")); + register(new CoordinateCluePlugin("bandit-camp-coord", 2845, ClueLevel.HARD, new Location(3139, 2969, 0), "06 degrees 00 minutes south
21 degrees 48 minutes east")); + // register(new CoordinateCluePlugin("east-karamja-coord", 2847, + // ClueLevel.HARD, new Location(2924, 2963, 0), + // "06 degrees 11 minutes south
15 degrees 07 minutes east")); + register(new CoordinateCluePlugin("three-ponds-coord", 2849, ClueLevel.MEDIUM, new Location(2383, 3369, 0), "06 degrees 31 minutes north
01 degrees 46 minutes west")); + register(new CoordinateCluePlugin("draynor-manor-coord", 2851, ClueLevel.MEDIUM, new Location(3120, 3384, 0), "06 degrees 58 minutes north
21 degrees 16 minutes east")); + register(new CoordinateCluePlugin("nature-spirit-coord", 2853, ClueLevel.MEDIUM, new Location(3430, 3388, 0), "07 degrees 05 minutes north
30 degrees 56 minutes east")); + register(new CoordinateCluePlugin("southeast-taverly-coord", 2855, ClueLevel.MEDIUM, new Location(2920, 3404, 0), "07 degrees 33 minutes north
15 degrees 00 minutes east")); + register(new CoordinateCluePlugin("swamp-coord", 2856, ClueLevel.HARD, new Location(3441, 3419, 0), "08 degrees 03 minutes north
31 degrees 16 minutes east")); + register(new CoordinateCluePlugin("feldip-coord", 2857, ClueLevel.MEDIUM, new Location(2593, 2899, 0), "08 degrees 11 minutes south
4 degrees 48 minutes east")); + register(new CoordinateCluePlugin("gnome-terribirds-coord", 2858, ClueLevel.MEDIUM, new Location(2387, 3435, 0), "08 degrees 33 minutes north
01 degrees 39 minutes west")); + register(new CoordinateCluePlugin("north-gnome-terribirds-coord", 3490, ClueLevel.MEDIUM, new Location(2382, 3467, 0), "09 degrees 35 minutes north
01 degrees 50 minutes west")); + register(new CoordinateCluePlugin("ice-mountain-coord", 3491, ClueLevel.MEDIUM, new Location(3006, 3475, 0), "09 degrees 48 minutes north
17 degrees 39 minutes east")); + register(new CoordinateCluePlugin("coal-line-coord", 3492, ClueLevel.MEDIUM, new Location(2585, 3505, 0), "10 degrees 45 minutes north
04 degrees 31 minutes east")); + register(new CoordinateCluePlugin("slayer-tower-coord", 3493, ClueLevel.MEDIUM, new Location(3442, 3515, 0), "11 degrees 03 minutes north
31 degrees 20 minutes east")); + register(new CoordinateCluePlugin("gnome-stronghold-coord", 3494, ClueLevel.MEDIUM, new Location(2416, 3515, 0), "11 degrees 05 minutes north
00 degrees 45 minutes west")); + register(new CoordinateCluePlugin("eagles-peak-coord", 3495, ClueLevel.MEDIUM, new Location(2362, 3531, 0), "11 degrees 33 minutes north
02 degrees 24 minutes west")); + register(new CoordinateCluePlugin("burthorpe-coord", 3496, ClueLevel.MEDIUM, new Location(2920, 3534, 0), "11 degrees 41 minutes north
14 degrees 58 minutes east")); + register(new CoordinateCluePlugin("fenkenstrain-castle-coord", 3497, ClueLevel.MEDIUM, new Location(3548, 3559, 0), "12 degrees 28 minutes north
34 degrees 37 minutes east")); + register(new CoordinateCluePlugin("lvl-11-wildy-coord", 3498, ClueLevel.HARD, new Location(3113, 3602, 0), "13 degrees 46 minutes north
21 degrees 01 minutes east")); + register(new CoordinateCluePlugin("swaying-tree-coord", 3499, ClueLevel.MEDIUM, new Location(2735, 3639, 0), "14 degrees 54 minutes north
9 degrees 13 minutes east")); + register(new CoordinateCluePlugin("rellekka-coord", 3500, ClueLevel.MEDIUM, new Location(2680, 3652, 0), "15 degrees 22 minutes north
07 degrees 31 minutes east")); + register(new CoordinateCluePlugin("trollheim-coord", 3501, ClueLevel.HARD, new Location(2892, 3674, 0), "16 degrees 03 minutes north
14 degrees 07 minutes east")); + register(new CoordinateCluePlugin("graveyard-wildy-coord", 3502, ClueLevel.HARD, new Location(3229, 3687, 0), "16 degrees 07 minutes north
22 degrees 45 minutes east")); + // not sure if this is accessible + register(new CoordinateCluePlugin("troll-stronghold-coord", 3503, ClueLevel.HARD, new Location(2853, 3689, 0), "16 degrees 31 minutes north
12 degrees 54 minutes east")); + register(new CoordinateCluePlugin("level-22-wildy-coord", 3504, ClueLevel.HARD, new Location(3304, 3692, 0), "16 degrees 35 minutes north
27 degrees 01 minutes east")); + register(new CoordinateCluePlugin("bandit-camp-coord", 3505, ClueLevel.HARD, new Location(3055, 3696, 0), "16 degrees 43 minutes north
19 degrees 13 minutes east")); + register(new CoordinateCluePlugin("level-23-wildy-coord", 3506, ClueLevel.HARD, new Location(3302, 3696, 0), "16 degrees 43 minutes north
26 degrees 56 minutes east")); + register(new CoordinateCluePlugin("northeast-rellekka-coord", 3507, ClueLevel.HARD, new Location(2711, 3732, 0), "17 degrees 50 minutes north
08 degrees 30 minutes east")); + register(new CoordinateCluePlugin("level-29-wildy-coord", 3508, ClueLevel.HARD, new Location(2970, 3749, 0), "18 degrees 22 minutes north
16 degrees 33 minutes east")); + register(new CoordinateCluePlugin("level-31-wildy-coord", 3509, ClueLevel.HARD, new Location(3034, 3804, 0), "18 degrees 50 minutes north
20 degrees 26 minutes east")); + register(new CoordinateCluePlugin("level-35-wildy-coord", 3510, ClueLevel.HARD, new Location(3244, 3792, 0), "19 degrees 43 minutes north
25 degrees 07 minutes east")); + register(new CoordinateCluePlugin("level-36-wildy-coord", 3512, ClueLevel.HARD, new Location(3139, 3803, 0), "20 degrees 05 minutes north
21 degrees 52 minutes east")); + register(new CoordinateCluePlugin("kbd-wildy-coord", 3513, ClueLevel.HARD, new Location(3014, 3847, 0), "21 degrees 24 minutes north
17 degrees 54 minutes east")); + register(new CoordinateCluePlugin("chaos-temple-wildy-coord", 3514, ClueLevel.HARD, new Location(2946, 3818, 0), "20 degrees 33 minutes north
15 degrees 48 minutes east")); + register(new CoordinateCluePlugin("rune-rocks-wildy-coord", 3515, ClueLevel.HARD, new Location(3059, 3884, 0), "22 degrees 35 minutes north
19 degrees 18 minutes east")); + register(new CoordinateCluePlugin("demonic-ruins-wildy-coord", 3516, ClueLevel.HARD, new Location(3290, 3889, 0), "22 degrees 45 minutes north
26 degrees 33 minutes east")); + register(new CoordinateCluePlugin("rogues-castle-coord", 3518, ClueLevel.HARD, new Location(3285, 3943, 0), "24 degrees 24 minutes north
26 degrees 24 minutes east")); + register(new CoordinateCluePlugin("wildy-lever-coord", 3520, ClueLevel.HARD, new Location(3158, 3958, 0), "24 degrees 56 minutes north
22 degrees 28 minutes east")); + register(new CoordinateCluePlugin("pirates-hideout-coord", 3522, ClueLevel.HARD, new Location(3040, 3961, 0), "24 degrees 58 minutes north
18 degrees 43 minutes east")); + register(new CoordinateCluePlugin("agility-wildy-coord", 3524, ClueLevel.HARD, new Location(2987, 3964, 0), "25 degrees 03 minutes north
17 degrees 05 minutes east")); + register(new CoordinateCluePlugin("axe-hut-coord", 3525, ClueLevel.HARD, new Location(3190, 3963, 0), "25 degrees 03 minutes north
23 degrees 24 minutes east")); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/CoordinateClueScroll.java b/Server/src/main/java/Server/core/game/content/ttrail/CoordinateClueScroll.java new file mode 100644 index 000000000..2fd0096ba --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/CoordinateClueScroll.java @@ -0,0 +1,102 @@ +package core.game.content.ttrail; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents a coordinate clue scroll. + * @author Vexia + */ +public abstract class CoordinateClueScroll extends MapClueScroll { + + /** + * The sextant item. + */ + public static final Item SEXTANT = new Item(2574); + + /** + * The watch item. + */ + public static final Item WATCH = new Item(2575); + + /** + * The chart item. + */ + public static final Item CHART = new Item(2576); + + /** + * The clock tower location. + */ + public static final Location CLOCK_TOWER = new Location(2440, 3161, 0); + + /** + * The clue message. + */ + private final String clue; + + /** + * Constructs a new {@code CoordinateClueScroll} {@code Object} + * @param name the name. + * @param clueId the clue id. + * @param level the level. + * @param location the location. + * @param clue the clue. + */ + public CoordinateClueScroll(String name, int clueId, ClueLevel level, Location location, String clue) { + super(name, clueId, level, 345, location, 0); + this.clue = clue; + } + + @Override + public void read(Player player) { + for (int i = 1; i < 9; i++) { + player.getPacketDispatch().sendString("", interfaceId, i); + } + super.read(player); + player.getPacketDispatch().sendString("




" + clue.replace("
", "

"), interfaceId, 1); + } + + @Override + public void dig(Player player) { + /*int killed = player.getAttribute("killed-wizard", -1); + if (getLevel() == ClueLevel.HARD && killed == -1) { + NPC wizard = player.getAttribute("t-wizard", null); + if (wizard != null && wizard.isActive()) { + return; + } + spawnWizard(player); + return; + }*/ + super.dig(player); + //player.removeAttribute("killed-wizard"); + } + + /** + * Spawns a zamorak or saradomin wizard. + * @param player the player. + */ + private void spawnWizard(Player player) { + int id = !player.getSkullManager().isWilderness() ? 1264 : 1007; + final NPC wizard = NPC.create(id, player.getLocation().transform(1, 0, 0)); + player.setAttribute("t-wizard", wizard); + wizard.setAttribute("clue", this); + wizard.setAttribute("player", player); + wizard.init(); + wizard.graphics(Graphics.create(86)); + wizard.faceTemporary(player, 1); + wizard.sendChat(id == 1264 ? "For Saradomin!" : "Die human!"); + wizard.getProperties().getCombatPulse().attack(player); + } + + /** + * Gets the clue. + * @return the clue + */ + public String getClue() { + return clue; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/EmoteCluePlugin.java b/Server/src/main/java/Server/core/game/content/ttrail/EmoteCluePlugin.java new file mode 100644 index 000000000..f543d6ff4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/EmoteCluePlugin.java @@ -0,0 +1,152 @@ +package core.game.content.ttrail; + +import core.game.node.entity.player.link.emote.Emotes; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Initializes the emote clue plugins. + * @author Vexia + */ +public final class EmoteCluePlugin extends EmoteClueScroll { + + /** + * Constructs a new {@Code EmoteCluePlugin} {@Code Object} + */ + public EmoteCluePlugin() { + super(null, -1, null, null, null, null, null); + } + + /** + * Constructs a new {@Code EmoteCluePlugin} {@Code Object} + * @param name the name. + * @param clueId the clue id. + * @param level the level. + * @param emote the Emotes. + * @param commenceEmote the commence Emotes. + * @param equipment the equipment. + * @param clue the clue. + * @param borders the borders. + */ + public EmoteCluePlugin(String name, int clueId, ClueLevel level, Emotes emote, Emotes commenceEmote, int[][] equipment, String clue, ZoneBorders... borders) { + super(name, clueId, level, emote, commenceEmote, equipment, clue, borders); + } + + /** + * Constructs a new {@Code EmoteCluePlugin} {@Code Object} + * @param name the name. + * @param clueId the clue id. + * @param level the level. + * @param emote the Emotes. + * @param equipment the equipment. + * @param clue the clue. + * @param borders the borders. + */ + public EmoteCluePlugin(String name, int clueId, ClueLevel level, Emotes emote, int[][] equipment, String clue, ZoneBorders... borders) { + super(name, clueId, level, emote, null, equipment, clue, borders); + } + + // register(new EmoteCluePlugin(clue, clueId, level, commenceEmote, + // commenceEmote, equipment, clue, borders)); + // register(new EmoteCluePlugin(clue, clueId, level, commenceEmote, + // equipment, clue, borders)); + // register(new EmoteCluePlugin()); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + Emotes emote = Emotes.BECKON; + register(new EmoteCluePlugin("digsite-beckon", 2677, ClueLevel.MEDIUM, emote, Emotes.BOW, new int[][] { { 6328 }, { 1267 }, { 658 } }, "Beckon in the Digsite, near the
eastern winch. Bow or curtsy
before you talk to me.
Equip a green gnome hat,
snakeskin boots and an
iron pickaxe.", new ZoneBorders(3368, 3425, 3371, 3429))); + register(new EmoteCluePlugin("tai-bwo-beckon", 2678, ClueLevel.MEDIUM, emote, Emotes.CLAP, new int[][] { { 1099 }, { 2552, 2554, 2556, 2558, 2560, 2562, 2564, 2568 }, { 1143 } }, "Beckon in Tai Bwo
Wannai. Clap before
you talk to me.
Equip green
dragonhide chaps, a
ring of dueling and a
mithril medium helmet.", new ZoneBorders(2771, 3053, 2814, 3074))); + emote = Emotes.BLOW_KISS; + //register(new EmoteCluePlugin("shilo-kiss", 2681, ClueLevel.HARD, emote, new int[][] { { 4089 }, { 5016 }, { 1127 } }, "Blow a kiss between
the tables in Shilo
Village bank. Beware
of double agents!
Equip a blue mystic
hat, bone spear and
rune plate body.", new ZoneBorders(2849, 2950, 2855, 2957))); + emote = Emotes.BOW; + register(new EmoteCluePlugin("legends-guild", 2682, ClueLevel.EASY, emote, new int[][] { { 1067 }, { 1696 }, { 845 } }, "Bow outside the entrance
to the Legends' Guild.
Equip iron platelegs, an
emerald amulet and an oak
longbow.", new ZoneBorders(2726, 3346, 2731, 3349))); + emote = Emotes.RASPBERRY; + register(new EmoteCluePlugin("monkey-cage", 2679, ClueLevel.EASY, emote, new int[][] { { 1133 }, { 1075 }, { 1379 } }, "Blow a raspberry at the
monkey cage in
Ardougne Zoo.
Equip a studded
leather body, bronze
platelegs and a normal
staff with no orb.", new ZoneBorders(2597, 3274, 2609, 3284))); + register(new EmoteCluePlugin("keep-le-faye", 2680, ClueLevel.EASY, emote, new int[][] { { 1169 }, { 1115 }, { 1059 } }, "Blow raspberries out
the entrance to Keep Le
Faye.
Equip a coif, an iron
platebody and leather
gloves.", new ZoneBorders(2759, 3401, 2762, 3403))); + // register(new EmoteCluePlugin("fishing-guild-blow", 2683, + // ClueLevel.HARD, emote, new int[][] {{2890}, {2493}, {1347}}, + // "Blow a raspberry in the
Fighing Guild bank. Beware
of double agents!
Equip and elemental shield
,blue dragonhide chaps
and a rune warhammer.", + // new ZoneBorders(2586, 3418, 2590, 3422))); + emote = Emotes.CHEER; + register(new EmoteCluePlugin("druid-circle-cheer", 2684, ClueLevel.EASY, emote, new int[][] { { 4310 }, { 579 }, { 1307 } }, "Cheer at the Druids'
Circle.
Equip a blue wizard
hat, a bronze
two-handed sword and
HAM boots.", new ZoneBorders(2920, 3478, 2930, 3940))); + register(new EmoteCluePlugin("games-room-cheer", 2685, ClueLevel.EASY, emote, new int[][] {}, "Cheer at the games
room.
Have nothing equipped
at all when you do.", new ZoneBorders(2194, 4946, 2221, 4973))); + register(new EmoteCluePlugin("barb-agility-cheer", 2686, ClueLevel.MEDIUM, emote, new int[][] { { 1119 }, { 853 }, { 4315, 4316, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, 4380, 4381, 4382, 4383, 4384, 4385, 4386, 4387, 4388, 4389, 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, 4407, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 10638 } }, "Cheer in the Barbarian
Agility Arena.
Headbang before you
talk to me.
Equip a steel plate
body, maple shortbow, and a wilderness
cape.", new ZoneBorders(2550, 3556, 2553, 3559), new ZoneBorders(2529, 3542, 2553, 3559))); + register(new EmoteCluePlugin("edge-gen-cheer", 2687, ClueLevel.MEDIUM, emote, Emotes.DANCE, new int[][] { { 1757 }, { 1061 }, { 1059 } }, "Cheer in the Edgeville general
store. Dance
before you talk to me.
Equip a brown apron,
leather boots and
leather gloves.", new ZoneBorders(3076, 3507, 3084, 3513))); + register(new EmoteCluePlugin("ogre-pen-cheer", 2688, ClueLevel.MEDIUM, emote, Emotes.ANGRY, new int[][] { { 1135 }, { 1099 }, { 1177 } }, "Cheer in the Ogre Pen
in the Training Camp.
Show you are angry
before you talk to me.
Equip a green
dragonhide body and
chaps and a steel
square shield.", new ZoneBorders(2523, 3373, 2533, 3377))); + emote = Emotes.CLAP; + register(new EmoteCluePlugin("exam-room-clap", 2689, ClueLevel.EASY, emote, new int[][] { { 1005 }, { 628 }, { 1059 } }, "Clap in the main exam room
in the Exam Centre.
Equip a white apron, green
gnome boots and leather
gloves.", new ZoneBorders(3357, 3332, 3367, 3348))); + register(new EmoteCluePlugin("wizard-tower-clap", 2690, ClueLevel.EASY, emote, new int[][] { { 1137 }, { 1639 }, { 1005 } }, "Clap on the causeway to the
Wizards' Tower.
Equip an iron medium
helmet, emerald ring and a
white apron.", new ZoneBorders(3112, 3173, 3115, 3206))); + // 2nd plane for ardy mill + register(new EmoteCluePlugin("ardgoune-mill-clap", 2691, ClueLevel.EASY, emote, new int[][] { { 640 }, { 4300 }, { 5525 } }, "Clap on the top level of the
mill, north of East Ardougne.
Equip a blue gnome robe top,
HAM robe bottom and an
unenchanted tiara.", new ZoneBorders(2628, 3382, 2636, 3390, 2))); + register(new EmoteCluePlugin("seers-court-clap", 2692, ClueLevel.MEDIUM, emote, Emotes.SPIN, new int[][] { { 3200 }, { 4093 }, { 1643 } }, "Clap in Seers court house.
Spin before you talk to me.
Equip an adamant halberd,
blue mystic robe bottom and
a diamond ring.", new ZoneBorders(2732, 3467, 2739, 3471))); + //Fix clue remove vexia + //emote = Emotes.CRY; + register(new EmoteCluePlugin("catherby-range-cry", 2693, ClueLevel.MEDIUM, Emotes.CRY, Emotes.BOW, new int[][] { { 630 }, { 1131 }, { 2961 } }, "Cry in the Catherby
Ranging shop. Bow before you talk to me.
Equip blue gnome
boots, a hard leather
body and an
unblessed silver
sickle.", new ZoneBorders(2821, 3441, 2825, 3445))); + register(new EmoteCluePlugin("catherby-shore-cry", 2694, ClueLevel.MEDIUM, Emotes.CRY, Emotes.LAUGH, new int[][] { { 1183 }, { 8872 }, { 1121 } }, "Cry on the shore of
Catherby beach.
Laugh before you talk to me.
Equip an adamant sq
shield, a bone dagger
and mithril platebody.", new ZoneBorders(2849, 3423, 2857, 3430), new ZoneBorders(2845, 3428, 2852, 3430))); + emote = Emotes.DANCE; + register(new EmoteCluePlugin("draynor-cross-dance", 2695, ClueLevel.EASY, emote, new int[][] { { 1101 }, { 1637 }, { 839 } }, "Dance at the
crossroads north of
Draynor.
Equip an iron chain
body, a sapphire ring
and a longbow.", new ZoneBorders(3109, 3293, 3110, 3296), new ZoneBorders(3108, 3294, 3111, 3295))); + register(new EmoteCluePlugin("fally-party-dance", 2696, ClueLevel.EASY, emote, new int[][] { { 1157 }, { 1119 }, { 1081 } }, "Dance in the Party
Room.
Equip a steel full
helmet, steel
platebody and an iron
plateskirt.", new ZoneBorders(3041, 3372, 3050, 3384), new ZoneBorders(3051, 3371, 3054, 3385), new ZoneBorders(3073, 3371, 3040, 3385))); + register(new EmoteCluePlugin("fish-guild-jig", 2697, ClueLevel.EASY, Emotes.JIG, new int[][] { { 1639 }, { 1694 }, { 1103 } }, "Dance a jig by the
entrance to the
Fishing Guild.
Equip an emerald ring,
a sapphire amulet,
and a bronze chain
body.", new ZoneBorders(2610, 3392, 2612, 3393))); + register(new EmoteCluePlugin("lumb-shack-dance", 2698, ClueLevel.EASY, emote, new int[][] { { 1205 }, { 1153 }, { 1635 } }, "Dance in
the shack in Lumbridge Swamp.
Equip a bronze
dagger, iron full helmet
and a gold ring.", new ZoneBorders(3202, 3167, 3205, 3170))); + register(new EmoteCluePlugin("lumb-cave-dance", 2699, ClueLevel.MEDIUM, emote, Emotes.BLOW_KISS, new int[][] { { 1381 }, { 1155 }, { 1731 } }, "Dance in the dark
cave beneath
Lumbridge Swamp.
Blow a kiss before
you talk to me.
Equip an air staff,
bronze full helm and
an amulet of power.", new ZoneBorders(3139, 9534, 3260, 9587))); + register(new EmoteCluePlugin("shantay-guild-jig", 2700, ClueLevel.MEDIUM, Emotes.JIG, Emotes.BOW, new int[][] { { 3343 }, { 1381 }, { 1173 } }, "Dance a jig under
Shantay's Awning.
Bow before you talk to
me.
Equip a pointed blue
snail helmet, an air
staff and a bronze
square shield.", new ZoneBorders(3302, 3122, 3305, 3125))); + register(new EmoteCluePlugin("cat-entrance-dance", 2701, ClueLevel.HARD, emote, new int[][] { { 2570 }, { 1704 }, { 1317 } }, "Dance at the
cat doored pyramid in
Sophanem. Beware of double agents!
Equip a ring of life,
an uncharged amulet
of glory and an adamant two handed
sword.", new ZoneBorders(3293, 2781, 3296, 2782))); + emote = Emotes.HEADBANG; + register(new EmoteCluePlugin("al-kharid-headbang", 2702, ClueLevel.EASY, emote, new int[][] { { 1833 }, { 1059 }, { 1061 } }, "Headbang in the mine north of Al
Kharid.
Equip a desert shirt, leather gloves and
leather boots.", new ZoneBorders(3297, 3286, 3301, 3316))); + //Removed Vexia code that bricked emotes for certain clues. + //Fixed JFJ and Laugh Clues + //When Vexia emote is removed below. + //emote = Emotes.JUMP_FOR_JOY; + register(new EmoteCluePlugin("beehive-jump", 2703, ClueLevel.EASY, Emotes.JUMP_FOR_JOY, new int[][] { { 1833 }, { 648 }, { 1353 } }, "Jump for joy at the beehives.
Equip a desert shirt, green
gnome robe bottoms and a
steel axe.", new ZoneBorders(2762, 3439, 2764, 3441))); + // And emote, is replaced with what it is shortcutting Emotes.JUMP_FOR_JOY + // the clues work perfect. It seems to only be a problem with multiple emote clues. + // If you look around EmoteCluePlugin you will see there are multiple emote, shortcuts + // I do not know what should be done as there are so many. + register(new EmoteCluePlugin("yanille-jump", 2704, ClueLevel.MEDIUM, Emotes.JUMP_FOR_JOY, Emotes.JIG, new int[][] { { 1757 }, { 1145 }, { 6324 } }, "Jump for joy in Yanille
bank. Dance a jig before you
talk to me.
Equip a brown apron,
adamantite medium helmet
and snakeskin chaps.", new ZoneBorders(2609, 3088, 2614, 3097))); + register(new EmoteCluePlugin("tzhaar-jump", 2705, ClueLevel.MEDIUM, Emotes.JUMP_FOR_JOY, Emotes.SHRUG, new int[][] { { 1295 }, { 2499 }, { 4095 } }, "Jump for joy in the TzHaar
sword shop. Shrug before you
talk to me.
Equip a Steel longsword,
Blue D'hide body and blue
mystic gloves.", new ZoneBorders(2477, 5144, 2480, 5147))); + //Removed Vexia code that bricked emotes for certain clues. + register(new EmoteCluePlugin("jokul-tent-laugh", 2706, ClueLevel.HARD, Emotes.LAUGH, new int[][] { { 1163 }, { 2493 }, { 1393 } }, "Laugh in the Jokul's tent in the
Mountain Camp.
Beware of double agents! Equip a
rune full helmet, blue dragonhide
chaps and a fire battlestaff.", new ZoneBorders(2811, 3678, 2813, 3682))); + emote = Emotes.PANIC; + register(new EmoteCluePlugin("limestone-mine-panic", 2707, ClueLevel.EASY, emote, new int[][] { { 1075 }, { 1269 }, { 1141 } }, "Panic in the
Limestone Mine.
Equip bronze
platelegs, a steel
pickaxe and a steel
medium helmet.", new ZoneBorders(3368, 3496, 3374, 3505))); + register(new EmoteCluePlugin("fish-trawler-panic", 2708, ClueLevel.EASY, emote, new int[][] {}, "Panic on the pier
where you catch the
Fishing trawler.
Have nothing equipped
at all when you do.", new ZoneBorders(2675, 3162, 2677, 3175))); + emote = Emotes.SALUTE; + // vexia make banana saulte so it won't work if u are wearing anything + // on chest or legs + register(new EmoteCluePlugin("banana-salute", 2710, ClueLevel.HARD, emote, new int[][] { { 1643 }, { 1731 } }, "Salute in the banana
plantation. Beware of
double agents!
Equip a diamond ring,
amulet of power, and nothing on
your chest and legs.", new ZoneBorders(2911, 3156, 2935, 3175))); + emote = Emotes.SHRUG; + register(new EmoteCluePlugin("rimmington-shrug", 2711, ClueLevel.EASY, emote, new int[][] { { 1654 }, { 1635 }, { 1237 } }, "Shrug in the mine near
Rimmington.
Equip a gold
necklace, a gold ring
and a bronze spear.", new ZoneBorders(2970, 3230, 2987, 3251))); + register(new EmoteCluePlugin("catherby-shrug", 2712, ClueLevel.MEDIUM, emote, Emotes.YAWN, new int[][] { { 851 }, { 1099 }, { 1137 } }, "Shrug in Catherby
bank. Yawn before
you talk to me.
Equip a maple
longbow, green d'hide
chaps and an iron
med helm.", new ZoneBorders(2806, 3438, 2812, 3442))); + register(new EmoteCluePlugin("zammy-altar-shrug", 2713, ClueLevel.HARD, emote, new int[][] { { 1079 }, { 1115 }, { 2487 } }, "Shrug in the Zamorak
temple found in the
Eastern Wilderness.
Beware of double
agents!
Equip rune plate legs,
an iron plate body and
blue dragonhide
vambraces.", new ZoneBorders(3233, 3603, 3246, 3614))); + emote = Emotes.SPIN; + register(new EmoteCluePlugin("rimmington-cross-spin", 2716, ClueLevel.EASY, emote, new int[][] { { 658 }, { 642 }, { 1095 } }, "Spin at the crossroads
north of Rimmington.
Equip a green gnome
hat, cream gnome top
and leather chaps.", new ZoneBorders(2979, 3275, 2985, 3279))); + register(new EmoteCluePlugin("draynor-manor-spin", 2719, ClueLevel.EASY, emote, new int[][] { { 1115 }, { 1097 }, { 1155 } }, "Spin in the Draynor
Manor by the fountain.
Equip an iron
platebody, studded
leather chaps and a
bronze full helmet.", new ZoneBorders(3085, 3332, 3090, 3337))); + register(new EmoteCluePlugin("varrock-court-spin", 2722, ClueLevel.EASY, emote, new int[][] { { 1361 }, { 1169 }, { 1641 } }, "Spin in the Varrock
Castle courtyard.
Equip a black axe, a
coif and a ruby ring.", new ZoneBorders(3202, 3459, 3223, 3468))); + register(new EmoteCluePlugin("barb-bridge-spin", 2723, ClueLevel.MEDIUM, emote, Emotes.SALUTE, new int[][] { { 2942 }, { 1193 }, { 1159 } }, "Spin on the bridge by
the Barbarian Village.
Salute before you talk
to me.
Equip purple gloves, a
steel kiteshield and a
mithril full helmet.", new ZoneBorders(3102, 3419, 3108, 3422))); + emote = Emotes.THINK; + register(new EmoteCluePlugin("lumb-wheat-think", 2725, ClueLevel.EASY, emote, new int[][] { { 640 }, { 654 }, { 843 } }, "Think in middle of the
wheat field by the
lumbridge mill.
Equip a blue gnome
robetop, a turquoise
gnome robe bottom
and an oak shortbow.", new ZoneBorders(3157, 3298, 3159, 3300))); + // register(new EmoteCluePlugin("observatory-think", 2727, + // ClueLevel.MEDIUM, emote, Emotes.SPIN, new int[][] {{1109}, {1099}, + // {1698}}, + // "Think in the centre of
the Observatory. Spin
before you talk to me.
Equip a mithril chain
body, green
dragonhide chaps and
a ruby amulet.", + // new ZoneBorders(2439, 3160, 2442, 3163))); + emote = Emotes.WAVE; + register(new EmoteCluePlugin("lumber-wave", 2729, ClueLevel.EASY, emote, new int[][] { { 1131 }, { 1095 }, { 1351 } }, "Wave along the south fence of
the Lumber Yard.
Equip a hard leather body,
leather chaps and a
bronze axe.", new ZoneBorders(3306, 3490, 3309, 3492))); + register(new EmoteCluePlugin("fally-gem-wave", 2731, ClueLevel.EASY, emote, new int[][] { { 1273 }, { 1125 }, { 1191 } }, "Wave in the Falador
gem store.
Equip a Mithril pickaxe,
Black platebody and
an Iron Kiteshield.", new ZoneBorders(2944, 3332, 2946, 3337))); + register(new EmoteCluePlugin("mudskipper-wave", 2733, ClueLevel.EASY, emote, new int[][] { { 1019 }, { 1095 }, { 1424 } }, "Wave on Mudskipper Point.
Equip a black cape, leather
chaps and a steel mace.", new ZoneBorders(2979, 3105, 3008, 3115))); + emote = Emotes.YAWN; + register(new EmoteCluePlugin("varrock-library-yawn", 2735, ClueLevel.EASY, emote, new int[][] { { 638 }, { 4300 }, { 1335 } }, "Yawn in the Varrock
library.
Equip a green gnome
robe top, HAM robe
bottom and an iron
warhammer.", new ZoneBorders(3207, 3490, 3214, 3497), new ZoneBorders(3214, 3494, 3217, 3497))); + register(new EmoteCluePlugin("draynor-market-yawn", 2737, ClueLevel.EASY, emote, new int[][] { { 1097 }, { 1191 }, { 1295 } }, "Yawn in Draynor
Marketplace.
Equip studded leather
chaps, an iron
kiteshield and a steel
longsword.", new ZoneBorders(3075, 3245, 3086, 3255))); + register(new EmoteCluePlugin("castle-wars-yawn", 2739, ClueLevel.MEDIUM, emote, Emotes.SHRUG, new int[][] { { 1698 }, { 1329 }, WILDY_CAPES }, "Yawn in the Castle
Wars lobby. Shrug
before you talk to me.
Equip ruby amulet, a
mithril scimitar and a
Wilderness cape.", new ZoneBorders(2434, 3061, 2464, 3102))); + register(new EmoteCluePlugin("rogue-gen-yawn", 2741, ClueLevel.HARD, emote, new int[][] { { 1183 }, { 2487 }, { 1275 } }, "Yawn in the rogues'
general store. Beware
of double agents!
Equip an adamant
square shield, blue
dragon vambraces
and a rune pickaxe.", new ZoneBorders(3024, 3699, 3027, 3704))); + PluginManager.definePlugin(new UriNPC()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/EmoteClueScroll.java b/Server/src/main/java/Server/core/game/content/ttrail/EmoteClueScroll.java new file mode 100644 index 000000000..b559fae2f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/EmoteClueScroll.java @@ -0,0 +1,152 @@ +package core.game.content.ttrail; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles an emote clue scroll. + * @author Vexia + */ +public abstract class EmoteClueScroll extends ClueScrollPlugin { + + /** + * The emote id. + */ + private final Emotes emote; + + /** + * The commening emote. + */ + private final Emotes commenceEmote; + + /** + * The equipment ids. + */ + private final int[][] equipment; + + /** + * The clue message. + */ + private final String clue; + + /** + * Constructs a new {@Code EmoteClueScroll} {@Code Object} + * @param name the name. + * @param clueId the clue id. + * @param level the level. + * @param emote the emote. + * @param commenceEmote the emote. + * @param equipment the equipment. + * @param clue the clue. + * @param borders the borders. + */ + public EmoteClueScroll(String name, int clueId, ClueLevel level, Emotes emote, Emotes commenceEmote, int[][] equipment, final String clue, ZoneBorders... borders) { + super(name, clueId, level, 345, borders); + this.emote = emote; + this.commenceEmote = commenceEmote; + this.equipment = equipment; + this.clue = clue; + } + + @Override + public boolean actionButton(Player player, int interfaceId, int buttonId, int slot, int itemId, int opcode) { + if (!player.getInventory().contains(clueId, 1)) { + return false; + } + final Emotes emote = Emotes.forId(buttonId); + if (emote == null) { + return false; + } + if (emote == this.emote) { + NPC oldUri = player.getAttribute("uri", null); + if (oldUri != null && oldUri.isActive()) { + return false; + } + spawnUri(player); + } else if (emote == commenceEmote) { + player.setAttribute("commence-emote", true); + } + if(this.emote == emote) { + return super.actionButton(player, interfaceId, buttonId, slot, itemId, opcode); + } else { + return false; + } + } + + @Override + public void read(Player player) { + for (int i = 1; i < 9; i++) { + player.getPacketDispatch().sendString("", interfaceId, i); + } + super.read(player); + player.getPacketDispatch().sendString(clue.replace("
", "

"), interfaceId, 1); + } + + /** + * Spawns the uri npc for the player. + * @param player the player. + */ + public void spawnUri(Player player) { + boolean doubleAgent = level == ClueLevel.HARD && player.getAttribute("killed-agent", 0) != clueId; + //changed this + int id = 5141; + if (doubleAgent) { + boolean wilderness = player.getSkullManager().isWilderness(); + if (wilderness) { + id = 5141; + doubleAgent = false; + } else { + id = 5145; + } + } + final NPC uri = NPC.create(id, player.getLocation().transform(1, 0, 0)); + player.setAttribute("uri", uri); + player.removeAttribute("commence-emote"); + uri.setAttribute("double-agent", doubleAgent); + uri.setAttribute("player", player); + uri.setAttribute("clue", this); + uri.init(); + uri.graphics(Graphics.create(86)); + uri.faceTemporary(player, 1); + if (doubleAgent) { + uri.sendChat("I expect you to die!"); + uri.getProperties().getCombatPulse().attack(player); + } + } + + /** + * Checks if a commence emote is needed. + * @return {@code True} if so. + */ + public boolean hasCommencEmote() { + return commenceEmote != null; + } + + /** + * Gets the emote. + * @return the emote. + */ + public Emotes getEmote() { + return emote; + } + + /** + * Gets the bequipment. + * @return the equipment + */ + public int[][] getEquipment() { + return equipment; + } + + /** + * Gets the bcommenceEmote. + * @return the commenceEmote + */ + public Emotes getCommenceEmote() { + return commenceEmote; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/MapCluePlugin.java b/Server/src/main/java/Server/core/game/content/ttrail/MapCluePlugin.java new file mode 100644 index 000000000..c82e0343a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/MapCluePlugin.java @@ -0,0 +1,74 @@ +package core.game.content.ttrail; + +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Plugin; + +/** + * Initializes the map clues. + * @author Vexia + */ +public final class MapCluePlugin extends MapClueScroll { + + /** + * Constructs a new {@Code MapCluePlugin} {@Code Object} + */ + public MapCluePlugin() { + this(null, -1, null, -1, null); + } + + /** + * Constructs a new {@Code MapCluePlugin} {@Code Object} + * @param name the name. + * @param clueId the clue id. + * @param level the level. + * @param interfaceId the interface id. + * @param location the location. + */ + public MapCluePlugin(String name, int clueId, ClueLevel level, int interfaceId, Location location) { + super(name, clueId, level, interfaceId, location); + } + + /** + * Constructs a new {@Code MapCluePlugin} {@Code Object} + * @param name the name. + * @param clueId the clue id. + * @param level the level. + * @param interfaceId the interface id. + * @param location the location. + * @param object the object. + * @param borders the borders. + */ + public MapCluePlugin(String name, int clueId, ClueLevel level, int interfaceId, Location location, int object, ZoneBorders... borders) { + super(name, clueId, level, interfaceId, location, object, borders); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + register(new MapCluePlugin("mc-grubber-crate", 2743, ClueLevel.MEDIUM, 355, Location.create(2658, 3488, 0), 357, new ZoneBorders(2657, 3487, 2660, 3489))); + register(new MapCluePlugin("ardy-crate", 2747, ClueLevel.MEDIUM, 361, Location.create(2565, 3248, 0), 354, new ZoneBorders(2564, 3247, 2566, 3249))); + register(new MapCluePlugin("wildy-crate", 2773, ClueLevel.HARD, 359, Location.create(3026, 3628, 0), 354, new ZoneBorders(3025, 3627, 3027, 3629))); + register(new MapCluePlugin("goblin-crate", 2774, ClueLevel.HARD, 358, Location.create(2457, 3182, 0), 18506, new ZoneBorders(2456, 3181, 2458, 3183))); + register(new MapCluePlugin("miscellania-dig", 2776, ClueLevel.MEDIUM, 340, Location.create(2536, 3865, 0))); + register(new MapCluePlugin("crafting-guild-dig", 2778, ClueLevel.MEDIUM, 352, Location.create(2906, 3294, 0))); + register(new MapCluePlugin("wizard-tower-dig", 2745, ClueLevel.EASY, 356, Location.create(3110, 3152, 0))); + register(new MapCluePlugin("east-dig", 2805, ClueLevel.EASY, 360, Location.create(2651, 3231, 0))); + register(new MapCluePlugin("rimmington", 2780, ClueLevel.MEDIUM, 362, Location.create(2924, 3209, 0))); + register(new MapCluePlugin("west-ardy", 2782, ClueLevel.HARD, 357, Location.create(2488, 3308, 0))); + register(new MapCluePlugin("yanille", 2783, ClueLevel.HARD, 353, Location.create(2616, 3077, 0))); + register(new MapCluePlugin("mcgrubber", 2785, ClueLevel.EASY, 354, Location.create(2611, 3481, 0))); + register(new MapCluePlugin("falador-stone", 2786, ClueLevel.EASY, 351, Location.create(3043, 3399, 0))); + register(new MapCluePlugin("champion's-guild", 2788, ClueLevel.EASY, 346, Location.create(3166, 3360, 0))); + register(new MapCluePlugin("falador-statue", 2790, ClueLevel.EASY, 337, Location.create(2970, 3415, 0))); + register(new MapCluePlugin("varrock-mine", 2792, ClueLevel.EASY, 347, Location.create(3289, 3373, 0))); + register(new MapCluePlugin("khazard-altar", 2793, ClueLevel.MEDIUM, 342, Location.create(2455, 3230, 0))); + register(new MapCluePlugin("light-house", 2794, ClueLevel.MEDIUM, 343, Location.create(2578, 3597, 0))); + register(new MapCluePlugin("north-seers", 2796, ClueLevel.MEDIUM, 344, Location.create(2666, 3562, 0))); + register(new MapCluePlugin("legends-guild", 2797, ClueLevel.HARD, 339, Location.create(2723, 3338, 0))); + register(new MapCluePlugin("wilderness", 2799, ClueLevel.HARD, 338, Location.create(3021, 3911, 0))); + register(new MapCluePlugin("draynor", 2801, ClueLevel.MEDIUM, 348, Location.create(3092, 3227, 0))); + register(new MapCluePlugin("abandoned-mine", 2803, ClueLevel.MEDIUM, 341, Location.create(3434, 3266, 0))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/MapClueScroll.java b/Server/src/main/java/Server/core/game/content/ttrail/MapClueScroll.java new file mode 100644 index 000000000..a0b5b5e88 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/MapClueScroll.java @@ -0,0 +1,129 @@ +package core.game.content.ttrail; + +import core.game.content.global.action.DigAction; +import core.game.content.global.action.DigSpadeHandler; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; + +/** + * A map clue scroll. + * @author Vexia + */ +public abstract class MapClueScroll extends ClueScrollPlugin { + + /** + * The location of the x spot. + */ + private final Location location; + + /** + * The object id. + */ + private final int object; + + /** + * Constructs a new {@Code MapClueScroll} {@Code Object} + * @param name the name. + * @param clueId the clue id. + * @param level the level. + * @param interfaceId the interface id. + * @param location the location. + * @param object the object. + */ + public MapClueScroll(String name, int clueId, ClueLevel level, int interfaceId, Location location, final int object, ZoneBorders... borders) { + super(name, clueId, level, interfaceId, borders); + this.location = location; + this.object = object; + } + + /** + * Constructs a new {@Code MapClueScroll} {@Code Object} + * @param name the name. + * @param clueId the clue id. + * @param level the level. + * @param interfaceId the interface id. + * @param location the location. + */ + public MapClueScroll(String name, int clueId, ClueLevel level, int interfaceId, Location location) { + this(name, clueId, level, interfaceId, location, 0); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + Player p = e.asPlayer(); + if (target.getId() == object && option.getName().equals("Search")) { + if (!p.getInventory().contains(clueId, 1) || !target.getLocation().equals(location)) { + p.sendMessage("Nothing interesting happens."); + return false; + } + reward(p, false); + level.open(p, null); + return true; + } + } + return super.interact(e, target, option); + } + + @Override + public void configure() { + DigSpadeHandler.register(getLocation(), new MapDigAction()); + super.configure(); + } + + /** + * The dig method called when the player digs. + * @param player the player. + */ + public void dig(Player player) { + reward(player); + player.getDialogueInterpreter().sendItemMessage(405, "You've found a casket!"); + } + + /** + * Handles the map digging reward. + * @author Vexia + */ + public final class MapDigAction implements DigAction { + + @Override + public void run(Player player) { + if (!hasRequiredItems(player)) { + player.sendMessage("Nothing interesting happens."); + return; + } + dig(player); + } + + } + + /** + * Checks if the player has the required items. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasRequiredItems(Player player) { + return player.getInventory().contains(clueId, 1); + } + + /** + * Gets the blocation. + * @return the location + */ + public Location getLocation() { + return location; + } + + /** + * Gets the bobject. + * @return the object + */ + public int getObject() { + return object; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/SaradominWizardNPC.java b/Server/src/main/java/Server/core/game/content/ttrail/SaradominWizardNPC.java new file mode 100644 index 000000000..8545125b0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/SaradominWizardNPC.java @@ -0,0 +1,178 @@ +package core.game.content.ttrail; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Plugin; + +/** + * Handles saradomin npc. + * @author Vexia + */ +public final class SaradominWizardNPC extends AbstractNPC { + + /** + * The combat handler to use. + */ + private static final MultiSwingHandler COMBAT_HANDLER = new MultiSwingHandler(new SwitchAttack(CombatStyle.MELEE).setUseHandler(true), new SwitchAttack(CombatStyle.MAGIC).setUseHandler(true)); + + /** + * The npc ids. + */ + private static final int[] IDS = new int[] { 1264 }; + + /** + * The clue scroll. + */ + private ClueScrollPlugin clueScroll; + + /** + * The player. + */ + private Player player; + + /** + * Constructs a new {@code SaradominWizardNPC} {@code Object} + */ + public SaradominWizardNPC() { + super(0, null); + } + + /** + * Constructs a new {@Code SaradominWizardNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public SaradominWizardNPC(int id, Location location) { + super(id, location, false); + this.setRespawn(false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SaradominWizardNPC(id, location); + } + + @Override + public void init() { + Player player = getAttribute("player", null); + ClueScrollPlugin clueScroll = getAttribute("clue", null); + if (player != null) { + this.player = player; + } + if (clueScroll != null) { + this.clueScroll = clueScroll; + } + if (player != null) { + location = RegionManager.getSpawnLocation(player, this); + if (location == null) { + location = player.getLocation(); + } + } + super.init(); + getProperties().setSpell((CombatSpell) SpellBook.MODERN.getSpell(41)); + getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(41)); + } + + @Override + public void finalizeDeath(Entity killer) { + if (killer instanceof Player) { + Player p = killer.asPlayer(); + if (p == player) { + p.setAttribute("killed-wizard", clueScroll.getClueId()); + } + } + super.finalizeDeath(killer); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (player != null) { + if (player.getLocation().getDistance(getLocation()) > 10 || !player.isActive()) { + clear(); + } + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return COMBAT_HANDLER; + } + + @Override + public boolean canAttack(Entity entity) { + if (!(entity instanceof Player)) { + return false; + } + if (player != null) { + Player p = entity.asPlayer(); + return p == player; + } + return super.canAttack(entity); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (!(entity instanceof Player)) { + return false; + } + if (player != null) { + Player p = entity.asPlayer(); + return p == player; + } + return super.isAttackable(entity, style); + } + + @Override + public boolean canSelectTarget(Entity target) { + return target == player; + + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return IDS; + } + + /** + * Gets the bplayer. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Sets the baplayer. + * @param player the player to set. + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * Gets the bclueScroll. + * @return the clueScroll + */ + public ClueScrollPlugin getClueScroll() { + return clueScroll; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/TreasureTrailManager.java b/Server/src/main/java/Server/core/game/content/ttrail/TreasureTrailManager.java new file mode 100644 index 000000000..ee4e32088 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/TreasureTrailManager.java @@ -0,0 +1,288 @@ +package core.game.content.ttrail; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.tools.RandomFunction; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; + +/** + * Handles the treasure trail of a player. + * @author Vexia + */ +public final class TreasureTrailManager implements SavingModule { + + /** + * The ids of the clues. + */ + private static final int[] IDS = new int[] { 2677, 2678, 2679, 2680, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2716, 2719, 2722, 2723, 2725, 2727, 2729, 2731, 2733, 2735, 2737, 2739, 2741, 2743, 2745, 2747, 2773, 2774, 2776, 2778, 2780, 2782, 2783, 2785, 2786, 2788, 2790, 2792, 2793, 2794, 2796, 2797, 2799, 2801, 2803, 2805, 2807, 2809, 2811, 2813, 2815, 2817, 2819, 2821, 2823, 2825, 2827, 2829, 2831, 2833, 2835, 2837, 2839, 2841, 2843, 2845, 2847, 2848, 2849, 2851, 2853, 2855, 2856, 2857, 2858, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3512, 3513, 3514, 3515, 3516, 3518, 3520, 3522, 3524, 3525, 3526, 3528, 3530, 3532, 3534, 3536, 3538, 3540, 3542, 3544, 3546, 3548, 3550, 3552, 3554, 3556, 3558, 3560, 3562, 3564, 3566, 3568, 3570, 3572, 3573, 3574, 3575, 3577, 3579, 3580, 3582, 3584, 3586, 3588, 3590, 3592, 3594, 3596, 3598, 3599, 3601, 3602, 3604, 3605, 3607, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 7236, 7238, 7239, 7241, 7243, 7245, 7247, 7248, 7249, 7250, 7251, 7252, 7253, 7254, 7255, 7256, 7258, 7260, 7262, 7264, 7266, 7268, 7270, 7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294, 7296, 7298, 7300, 7301, 7303, 7304, 7305, 7307, 7309, 7311, 7313, 7315, 7317, 10180, 10182, 10184, 10186, 10188, 10190, 10192, 10194, 10196, 10198, 10200, 10202, 10204, 10206, 10208, 10210, 10212, 10214, 10216, 10218, 10220, 10222, 10224, 10226, 10228, 10230, 10232, 10234, 10236, 10238, 10240, 10242, 10244, 10246, 10248, 10250, 10252, 10254, 10256, 10258, 10260, 10262, 10264, 10266, 10268, 10270, 10272, 10274, 10276, 10278, 13010, 13012, 13014, 13016, 13018, 13020, 13022, 13024, 13026, 13028, 13030, 13032, 13034, 13036, 13038, 13040, 13041, 13042, 13044, 13046, 13048, 13049, 13050, 13051, 13053, 13055, 13056, 13058, 13060, 13061, 13063, 13065, 13067, 13068, 13069, 13070, 13071, 13072, 13074, 13075, 13076, 13078, 13079, 13080 }; + + /** + * The player. + */ + private final Player player; + + /** + * The current clue id. + */ + private int clueId; + + /** + * The clue level. + */ + private ClueLevel level; + + /** + * The trail stage. + */ + private int trailStage; + + /** + * The current length of the trail. + */ + private int trailLength; + + /** + * The amount of completed clues. + */ + private final int[] completedClues = new int[3]; + + /** + * Constructs a new {@Code TreasureTrailManager} {@Code + * Object} + * @param player the player. + */ + public TreasureTrailManager(Player player) { + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + if (hasTrail()) { + buffer.put((byte) 1); + buffer.putInt(clueId << 16 | trailLength); + buffer.put((byte) 2); + buffer.putInt(trailStage); + } + if (completedClues[0] != 0 || completedClues[1] != 0 || completedClues[2] != 0) { + buffer.put((byte) 4); + for (int i = 0; i < completedClues.length; i++) { + buffer.putInt(completedClues[i]); + } + } + buffer.put((byte) 0); + } + + public void parse(JSONObject data){ + JSONArray cc = (JSONArray) data.get("completedClues"); + for(int i = 0; i < cc.size(); i++){ + completedClues[i] = Integer.parseInt(cc.get(i).toString()); + } + + if(data.containsKey("trail")){ + JSONObject trail = (JSONObject) data.get("trail"); + clueId = Integer.parseInt(trail.get("clueId").toString()); + trailLength = Integer.parseInt(trail.get("length").toString()); + trailStage = Integer.parseInt(trail.get("stage").toString()); + } + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get() & 0xFFFF) != 0) { + switch (opcode) { + case 1: + int hash = buffer.getInt(); + clueId = hash >> 16 & 0xFFFF; + trailLength = hash & 0xFFFF; + ClueScrollPlugin p = ClueScrollPlugin.getClueScrolls().get(clueId); + if (p != null) { + level = p.getLevel(); + } + break; + case 2: + trailStage = buffer.getInt(); + break; + case 3: + buffer.getInt();// old + break; + case 4: + for (int i = 0; i < completedClues.length; i++) { + completedClues[i] = buffer.getInt(); + } + break; + } + } + } + + /** + * Starts a treasure trail. + * @param clue the clue. + */ + public void startTrail(ClueScrollPlugin clue) { + setClue(clue); + trailLength = RandomFunction.random(clue.getLevel().getMinimumLength(), clue.getLevel().getMaximumLength()); + trailStage = 0; + } + + /** + * Clears the trail. + */ + public void clearTrail() { + clueId = 0; + level = null; + trailLength = 0; + trailStage = 0; + } + + /** + * Sets the current clue. + * @param clue the clue. + */ + public void setClue(ClueScrollPlugin clue) { + clueId = clue.getClueId(); + level = clue.getLevel(); + } + + /** + * Checks if the player has a clue. + * @return {@code True} if so. + */ + public boolean hasClue() { + if (player == null) { + return true; + } + if (player.hasItem(ClueLevel.EASY.getCasket()) || player.hasItem(ClueLevel.MEDIUM.getCasket()) || player.hasItem(ClueLevel.HARD.getCasket())) { + return true; + } + for (int id : IDS) { + if (player.getInventory().contains(id, 1) || player.getBank().contains(id, 1)) { + return true; + } + } + return false; + } + + /** + * Increments a trail stage. + */ + public void incrementStage() { + trailStage += 1; + } + + /** + * Checks if the trail is completed. + * @return {@code True} if so. + */ + public boolean isCompleted() { + return trailStage != 0 && trailLength != 0 && trailStage >= trailLength; + } + + /** + * Checks if the player has an active trail. + * @return the trail. + */ + public boolean hasTrail() { + return clueId != 0 && level != null & trailLength != 0 && trailStage != 0; + } + + /** + * Incremented the clues. + */ + public void incrementClues(ClueLevel level) { + completedClues[level.ordinal()]++; + } + + /** + * Gets the amount of completed clues for the level. + * @param level the level. + * @return the amount. + */ + public int getCompletedClues(ClueLevel level) { + return completedClues[level.ordinal()]; + } + + /** + * Gets the completed clue amount. + * @return the completed clues. + */ + public int[] getCompletedClues() { + return completedClues; + } + + /** + * Gets the bclueId. + * @return the clueId + */ + public int getClueId() { + return clueId; + } + + /** + * Sets the baclueId. + * @param clueId the clueId to set. + */ + public void setClueId(int clueId) { + this.clueId = clueId; + } + + /** + * Gets the blevel. + * @return the level + */ + public ClueLevel getLevel() { + return level; + } + + /** + * Sets the balevel. + * @param level the level to set. + */ + public void setLevel(ClueLevel level) { + this.level = level; + } + + /** + * Gets the bplayer. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the btrailLength. + * @return the trailLength + */ + public int getTrailLength() { + return trailLength; + } + + /** + * Sets the batrailLength. + * @param trailLength the trailLength to set. + */ + public void setTrailLength(int trailLength) { + this.trailLength = trailLength; + } + + /** + * Gets the btrailStage. + * @return the trailStage + */ + public int getTrailStage() { + return trailStage; + } + + /** + * Sets the batrailStage. + * @param trailStage the trailStage to set. + */ + public void setTrailStage(int trailStage) { + this.trailStage = trailStage; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/TreasureTrailPlugin.java b/Server/src/main/java/Server/core/game/content/ttrail/TreasureTrailPlugin.java new file mode 100644 index 000000000..13cc682bb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/TreasureTrailPlugin.java @@ -0,0 +1,194 @@ +package core.game.content.ttrail; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.system.config.NPCConfigParser; +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.Item; +import core.game.node.item.ItemPlugin; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the clue scroll options. + * @author Vexia + */ +@Initializable +public final class TreasureTrailPlugin extends OptionHandler { + + /** + * The ids of the clues. + */ + private static final int[] IDS = new int[] { 2677, 2678, 2679, 2680, 2682, 2683, 2684, 2685, 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2716, 2719, 2722, 2723, 2725, 2727, 2729, 2731, 2733, 2735, 2737, 2739, 2741, 2743, 2745, 2747, 2773, 2774, 2776, 2778, 2780, 2782, 2783, 2785, 2786, 2788, 2790, 2792, 2793, 2794, 2796, 2797, 2799, 2801, 2803, 2805, 2807, 2809, 2811, 2813, 2815, 2817, 2819, 2821, 2823, 2825, 2827, 2829, 2831, 2833, 2835, 2837, 2839, 2841, 2843, 2845, 2847, 2848, 2849, 2851, 2853, 2855, 2856, 2857, 2858, 3490, 3491, 3492, 3493, 3494, 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3512, 3513, 3514, 3515, 3516, 3518, 3520, 3522, 3524, 3525, 3526, 3528, 3530, 3532, 3534, 3536, 3538, 3540, 3542, 3544, 3546, 3548, 3550, 3552, 3554, 3556, 3558, 3560, 3562, 3564, 3566, 3568, 3570, 3572, 3573, 3574, 3575, 3577, 3579, 3580, 3582, 3584, 3586, 3588, 3590, 3592, 3594, 3596, 3598, 3599, 3601, 3602, 3604, 3605, 3607, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 7236, 7238, 7239, 7241, 7243, 7245, 7247, 7248, 7249, 7250, 7251, 7252, 7253, 7254, 7255, 7256, 7258, 7260, 7262, 7264, 7266, 7268, 7270, 7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294, 7296, 7298, 7300, 7301, 7303, 7304, 7305, 7307, 7309, 7311, 7313, 7315, 7317, 10180, 10182, 10184, 10186, 10188, 10190, 10192, 10194, 10196, 10198, 10200, 10202, 10204, 10206, 10208, 10210, 10212, 10214, 10216, 10218, 10220, 10222, 10224, 10226, 10228, 10230, 10232, 10234, 10236, 10238, 10240, 10242, 10244, 10246, 10248, 10250, 10252, 10254, 10256, 10258, 10260, 10262, 10264, 10266, 10268, 10270, 10272, 10274, 10276, 10278, 13010, 13012, 13014, 13016, 13018, 13020, 13022, 13024, 13026, 13028, 13030, 13032, 13034, 13036, 13038, 13040, 13041, 13042, 13044, 13046, 13048, 13049, 13050, 13051, 13053, 13055, 13056, 13058, 13060, 13061, 13063, 13065, 13067, 13068, 13069, 13070, 13071, 13072, 13074, 13075, 13076, 13078, 13079, 13080 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : IDS) { + ItemDefinition.forId(id).getHandlers().put("option:read", this); + } + for (ClueLevel level : ClueLevel.values()) { + ItemDefinition.forId(level.getCasket().getId()).getHandlers().put("option:open", this); + } + ItemDefinition.forId(CoordinateClueScroll.SEXTANT.getId()).getHandlers().put("option:look through", this); + PluginManager.definePlugin(new MapCluePlugin()); + PluginManager.definePlugin(new ClueItemPlugin()); + PluginManager.definePlugin(new EmoteCluePlugin()); + PluginManager.definePlugin(new TTrailOptionHandler()); + PluginManager.definePlugin(new SextantComponentPlugin()); + PluginManager.definePlugin(new CoordinateCluePlugin()); + PluginManager.definePlugin(new SaradominWizardNPC()); + PluginManager.definePlugin(new ZamorakWizardNPC()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.lock(1); + switch (option) { + case "read": + final ClueScrollPlugin plugin = ClueScrollPlugin.getClueScrolls().get(node.getId()); + if (plugin == null) { + player.sendMessage("Unused clue scroll item! Removed."); + player.getInventory().remove((Item) node); + return false; + } + plugin.read(player); + break; + case "open": + if (!player.getInventory().containsItem(node.asItem())) { + return true; + } + ClueLevel.forCasket((Item) node).open(player, (Item) node); + break; + case "look through": + player.getInterfaceManager().open(new Component(365)); + return true; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + /** + * Handles options related to treasure trails. + * @author Vexia + */ + public static final class TTrailOptionHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(19171).getHandlers().put("option:squeeze-through", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 19171: + Location start = player.getLocation().getX() <= 2522 ? node.getLocation() : node.getLocation().transform(1, 0, 0); + player.lock(1); + AgilityHandler.forceWalk(player, -1, start, start.transform(player.getLocation().getX() <= 2522 ? 1 : -1, 0, 0), Animation.create(2240), 5, 1, null, 0); + break; + } + return true; + } + + } + + /** + * Represents a clue scroll item. + * @author Vexia + */ + public final class ClueItemPlugin extends ItemPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + register(IDS); + return this; + } + + @Override + public boolean canPickUp(Player player, GroundItem item, int type) { + if (hasClue(player)) { + player.sendMessage("A magical force prevents you from picking the clue scroll up."); + return false; + } + return true; + } + + @Override + public boolean createDrop(Item item, Player player, NPC npc, Location l) { + if ((npc.getId() == 49 || npc.getId() == 3586)) { + return true; + } + if (npc.getDefinition().getDropTables().getMainTable().size() < 3) { + return false; + } + if (!hasClue(player)) { + return true; + } + return false; + } + + @Override + public Item getItem(Item item, NPC npc) { + return ClueScrollPlugin.getClue(npc.getDefinition().getConfiguration(NPCConfigParser.CLUE_LEVEL, ClueLevel.EASY)).copy(); + } + + /** + * Checks if the player has a clue. + * @param player the player. + * @return {@code True} if so. + */ + private boolean hasClue(Player player) { + return player.getTreasureTrailManager().hasClue(); + } + + } + + /** + * Handles the sextant interface. + * @author Vexia + */ + public class SextantComponentPlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(365).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 5:// horizon up + break; + case 4:// horizon down + break; + case 6:// sun down + break; + case 7:// sun up + break; + case 11: + player.sendMessage("You need to get the horizon in the middle of the eye piece."); + break; + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/UriNPC.java b/Server/src/main/java/Server/core/game/content/ttrail/UriNPC.java new file mode 100644 index 000000000..4a6ac8fd9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/UriNPC.java @@ -0,0 +1,266 @@ +package core.game.content.ttrail; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the uri npc. + * @author Vexia + */ +public final class UriNPC extends AbstractNPC { + + /** + * The npc ids. + */ + private static final int[] IDS = new int[] { 5141, 5142, 5143, 5144, 5145 }; + + /** + * The clue scroll. + */ + private ClueScrollPlugin clueScroll; + + /** + * The player. + */ + private Player player; + + /** + * Constructs a new {@Code UriNPC} {@Code Object} + */ + public UriNPC() { + super(0, null); + } + + /** + * Constructs a new {@Code UriNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public UriNPC(int id, Location location) { + super(id, location, false); + this.setRespawn(false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new UriNPC(id, location); + } + + @Override + public void init() { + Player player = getAttribute("player", null); + ClueScrollPlugin clueScroll = getAttribute("clue", null); + if (player != null) { + this.player = player; + } + if (clueScroll != null) { + this.clueScroll = clueScroll; + } + if (player != null) { + location = RegionManager.getSpawnLocation(player, this); + if (location == null) { + location = player.getLocation(); + } + } + super.init(); + } + + @Override + public void finalizeDeath(Entity killer) { + if (killer instanceof Player) { + Player p = killer.asPlayer(); + if (p == player && isDoubleAgent()) { + p.setAttribute("killed-agent", clueScroll.getClueId()); + } + } + super.finalizeDeath(killer); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (player != null) { + if (player.getLocation().getDistance(getLocation()) > 10 || !player.isActive()) { + clear(); + } + if (isDoubleAgent()) { + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (!(entity instanceof Player)) { + return false; + } + if (player != null) { + Player p = entity.asPlayer(); + return p == player; + } + return super.isAttackable(entity, style); + } + + @Override + public boolean canSelectTarget(Entity target) { + return target == player; + + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new UriDialogue()); + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return IDS; + } + + /** + * Checks if uri is a double agent. + * @return {@code True} if so. + */ + public boolean isDoubleAgent() { + return getAttribute("double-agent", false); + } + + /** + * Gets the bplayer. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Sets the baplayer. + * @param player the player to set. + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * Gets the bclueScroll. + * @return the clueScroll + */ + public ClueScrollPlugin getClueScroll() { + return clueScroll; + } + + /** + * Handles the uri dialogue. + * @author Vexia + */ + public static final class UriDialogue extends DialoguePlugin { + + /** + * The quotes uri says. + */ + private static final String[] QUOTES = new String[] { "Once, I was a poor man, but then I found a party hat.", "There were three goblins in a bar, which one left first?", "Would you like to buy a pewter spoon?", "In the end, only the three-legged survive.", "I heard that the tall man fears only strong winds.", "In Canifis the men are known for eating much spam.", "I am the egg man, are you one of the egg men?", "I believe that it is very rainy in Varrock.", "The slowest of fishermen catch the swiftest of fish.", "It is quite easy being green.", "Don't forget to find the jade monkey.", "Don't forget to find the jade monkey.", "Do you want ants? Because that's how you get ants.", "I once named a duck after a girl. Big mistake.", "Loser says what.", "I'm looking for a girl named Molly. I can't find her.", "Guys, let's lake dive!", "I gave you what you needed; not what you think you needed.", "Want to see me bend a spoon?", "Is that Deziree?", "This is the last night you'll spend alone.", "(Breathing intensifies)", "Init doe. Lyk, I hope yer reward iz goodd aye?" }; + + /** + * Constructs a new {@Code UriDialogue} {@Code Object} + */ + public UriDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code UriDialogue} {@Code Object} + * @param player + */ + public UriDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new UriDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (!canSpeak()) { + npc("I do not believe we have any business, Comrade."); + stage = -1; + return true; + } + npc(RandomFunction.getRandomElement(QUOTES)); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case -1: + end(); + break; + case 0: + player("What?"); + asUri().getClueScroll().reward(player); + stage++; + break; + case 1: + interpreter.sendItemMessage(405, "You've been given a casket!"); + stage++; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public boolean close() { + if (stage >= 1) { + npc.clear(); + player.removeAttribute("killed-agent"); + } + return super.close(); + } + + /** + * Checks if the player can speak to the npc. + * @return {@code True} if so. + */ + public boolean canSpeak() { + EmoteClueScroll scroll = (EmoteClueScroll) asUri().getClueScroll(); + if (asUri().getPlayer() != player || !player.getAttribute("commence-emote", !scroll.hasCommencEmote())) { + return false; + } + return scroll.hasEquipment(player, scroll.getEquipment()); + } + + /** + * Casts to the uri npc. + * @return the npc. + */ + public UriNPC asUri() { + return (UriNPC) npc; + } + + @Override + public int[] getIds() { + return IDS; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/ttrail/ZamorakWizardNPC.java b/Server/src/main/java/Server/core/game/content/ttrail/ZamorakWizardNPC.java new file mode 100644 index 000000000..897fdc3d1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/ttrail/ZamorakWizardNPC.java @@ -0,0 +1,165 @@ +package core.game.content.ttrail; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Plugin; + +/** + * Handles saradomin npc. + * @author Vexia + */ +public final class ZamorakWizardNPC extends AbstractNPC { + + /** + * The npc ids. + */ + private static final int[] IDS = new int[] { 1007 }; + + /** + * The clue scroll. + */ + private ClueScrollPlugin clueScroll; + + /** + * The player. + */ + private Player player; + + /** + * Constructs a new {@code SaradominWizardNPC} {@code Object} + */ + public ZamorakWizardNPC() { + super(0, null); + } + + /** + * Constructs a new {@Code SaradominWizardNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public ZamorakWizardNPC(int id, Location location) { + super(id, location, false); + this.setRespawn(false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ZamorakWizardNPC(id, location); + } + + @Override + public void init() { + Player player = getAttribute("player", null); + ClueScrollPlugin clueScroll = getAttribute("clue", null); + if (player != null) { + this.player = player; + } + if (clueScroll != null) { + this.clueScroll = clueScroll; + } + if (player != null) { + location = RegionManager.getSpawnLocation(player, this); + if (location == null) { + location = player.getLocation(); + } + } + super.init(); + getProperties().setSpell((CombatSpell) SpellBook.MODERN.getSpell(43)); + getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(43)); + } + + @Override + public void finalizeDeath(Entity killer) { + if (killer instanceof Player) { + Player p = killer.asPlayer(); + if (p == player) { + p.setAttribute("killed-wizard", clueScroll.getClueId()); + } + } + super.finalizeDeath(killer); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (player != null) { + if (player.getLocation().getDistance(getLocation()) > 10 || !player.isActive()) { + clear(); + } + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (!(entity instanceof Player)) { + return false; + } + if (player != null) { + Player p = entity.asPlayer(); + return p == player; + } + return super.isAttackable(entity, style); + } + + @Override + public boolean canAttack(Entity entity) { + if (!(entity instanceof Player)) { + return false; + } + if (player != null) { + Player p = entity.asPlayer(); + return p == player; + } + return super.canAttack(entity); + } + + @Override + public boolean canSelectTarget(Entity target) { + return target == player; + + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return IDS; + } + + /** + * Gets the bplayer. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Sets the baplayer. + * @param player the player to set. + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * Gets the bclueScroll. + * @return the clueScroll + */ + public ClueScrollPlugin getClueScroll() { + return clueScroll; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/CairnIslandZone.java b/Server/src/main/java/Server/core/game/content/zone/CairnIslandZone.java new file mode 100644 index 000000000..e6ce81b89 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/CairnIslandZone.java @@ -0,0 +1,44 @@ +package core.game.content.zone; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class CairnIslandZone extends MapZone implements Plugin { + + public CairnIslandZone() { + super("cairn-island", true); + } + + @Override + public void configure() { + register(new ZoneBorders(2752, 2963, 2774, 2992)); + } + + @Override + public boolean enter(Entity entity) { + // Explore Cairn Island to the west of Karamja + if (entity.isPlayer()) { + Player player = entity.asPlayer(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 0, 5); + } + return super.enter(entity); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/ChaosTunnelZone.java b/Server/src/main/java/Server/core/game/content/zone/ChaosTunnelZone.java new file mode 100644 index 000000000..6c14c9a94 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/ChaosTunnelZone.java @@ -0,0 +1,355 @@ +package core.game.content.zone; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.activity.ActivityManager; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the chaos tunnels. + * @author Vexia + */ +@Initializable +public final class ChaosTunnelZone extends MapZone implements Plugin { + + /** + * The entrance data. + */ + private static final Object[][] ENTRANCE_DATA = new Object[][] { { 28891, new Location(3182, 5471, 0), 28782, new Location(3059, 3549, 0) },// 1 + { 28893, new Location(3248, 5489, 0), 28782, new Location(3120, 3571, 0) },// 2 + { 28892, new Location(3292, 5479, 0), 28782, new Location(3166, 3561, 0) },// 3 + { 28893, new Location(3234, 5558, 0), 28782, new Location(3107, 3640, 0) },// 4 + { 28892, new Location(3290, 5538, 0), 28782, new Location(3165, 3617, 0) },// 5 + }; + + /** + * The mapping of portals. + */ + private static final Map PORTALS = new HashMap<>(); + + /** + * Constructs a new {@Code ChaosTunnelZone} {@Code Object} + */ + public ChaosTunnelZone() { + super("Chaos tunnel", true, ZoneRestriction.CANNON); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugin(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 0; i < ENTRANCE_DATA.length; i++) { + ObjectDefinition.forId((int) ENTRANCE_DATA[i][0]).getHandlers().put("option:enter", this); + ObjectDefinition.forId((int) ENTRANCE_DATA[i][2]).getHandlers().put("option:climb-up", this); + } + ObjectDefinition.forId(23074).getHandlers().put("option:climb", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Object[] data = null; + switch (option) { + case "enter": + case "climb-up": + switch (node.getId()) { + case 28891: + case 28893: + case 28892: + case 28782: + if (option.equals("enter") && player.inCombat()) { + player.sendMessage("You can't enter the rift when you've recently been in combat."); + return true; + } + for (int i = 0; i < ENTRANCE_DATA.length; i++) { + if ((int) ENTRANCE_DATA[i][option.equals("enter") ? 0 : 2] == node.getId() && player.getLocation().withinDistance((Location) ENTRANCE_DATA[i][option.equals("enter") ? 3 : 1])) { + data = ENTRANCE_DATA[i]; + break; + } + } + if (data == null) { + player.sendMessage("Error! Data null."); + break; + } + player.teleport((Location) data[option.equals("enter") ? 1 : 3]); + break; + } + break; + case "climb": + switch (node.getId()) { + case 23074: + player.teleport(new Location(3283, 3467, 0)); + break; + } + break; + } + return true; + } + }); + return this; + } + + @Override + public boolean interact(Entity entity, Node target, Option option) { + if (entity instanceof Player) { + switch (target.getId()) { + case 29537: + break; + case 28779:// portal + if (target.getLocation().equals(new Location(3326, 5469, 0))) { + entity.asPlayer().sendMessage("You can't go back throught his portal."); + return true; + } + teleport(entity.asPlayer(), target.asObject()); + break; + } + } + return super.interact(entity, target, option); + } + + @Override + public boolean enter(Entity entity) { + if (entity instanceof NPC) { + NPC n = entity.asNpc(); + if (!n.isAggressive()) { + n.setAggressive(true); + } + } + return super.enter(entity); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(3116, 5412, 3362, 5584)); + /* top left */ + addLink(3158, 5561, 3162, 5557); + addLink(3162, 5545, 3166, 5553); + addLink(3147, 5541, 3143, 5535); + addLink(3148, 5533, 3153, 5537); + addLink(3152, 5520, 3156, 5523); + addLink(3165, 5515, 3173, 5530); + addLink(3169, 5510, 3159, 5501); + addLink(3181, 5517, 3185, 5518); + addLink(3182, 5530, 3187, 5531); + addLink(3190, 5519, 3190, 5515); + addLink(3196, 5512, 3202, 5515); + addLink(3197, 5529, 3201, 5531); + addLink(3190, 5549, 3190, 5554); + addLink(3180, 5557, 3174, 5558); + addLink(3171, 5542, 3168, 5541); + /* top middle */ + addLink(3206, 5553, 3204, 5546); + addLink(3226, 5553, 3230, 5547); + addLink(3214, 5533, 3211, 5533); + addLink(3208, 5527, 3211, 5523); + addLink(3238, 5507, 3232, 5501); + addLink(3241, 5529, 3243, 5526); + addLink(3261, 5536, 3268, 5534); + addLink(3252, 5543, 3249, 5546); + addLink(3262, 5552, 3266, 5552); + addLink(3256, 5561, 3253, 5561); + addLink(3297, 5536, 3299, 5533); + /* top right */ + addLink(3285, 5556, 3291, 5555); + addLink(3288, 5536, 3289, 5533); + addLink(3285, 5527, 3282, 5531); + addLink(3285, 5508, 3280, 5501); + addLink(3300, 5514, 3297, 5510); + addLink(3325, 5518, 3323, 5531); + addLink(3321, 5554, 3315, 5552); + /* bottom left */ + addLink(3142, 5489, 3141, 5480); + addLink(3142, 5462, 3154, 5462); + addLink(3143, 5443, 3155, 5449); + addLink(3167, 5478, 3171, 5478); + addLink(3171, 5473, 3167, 5471); + addLink(3168, 5456, 3178, 5460); + addLink(3187, 5460, 3189, 5444); + addLink(3192, 5472, 3186, 5472); + addLink(3185, 5478, 3191, 5482); + addLink(3197, 5448, 3204, 5445); + addLink(3191, 5482, 3185, 5478); + addLink(3191, 5495, 3194, 5490); + /* bottom middle */ + addLink(3214, 5456, 3212, 5452); + addLink(3229, 5454, 3235, 5457); + addLink(3233, 5445, 3241, 5445); + addLink(3239, 5498, 3244, 5495); + addLink(3233, 5470, 3241, 5469); + addLink(3241, 5445, 3233, 5445); + addLink(3259, 5446, 3265, 5491); + addLink(3260, 5491, 3266, 5446); + addLink(3218, 5478, 3215, 5475); + addLink(3208, 5471, 3210, 5477); + /* bottom right */ + addLink(3283, 5448, 3287, 5448); + addLink(3296, 5455, 3299, 5450); + addLink(3302, 5469, 3290, 5463); + addLink(3286, 5470, 3285, 5474); + addLink(3322, 5480, 3318, 5481); + addLink(3317, 5496, 3307, 5496); + addLink(3299, 5484, 3303, 5477); + addLink(3280, 5460, 3273, 5460); + addLink(3285, 5474, 3286, 5470); + addLink(3222, 5474, 3224, 5479); + addLink(3222, 5488, 3218, 5497); + } + + /** + * Teleports a player through a portal. + * @param object the object. + * @param player the player. + */ + private void teleport(Player player, GameObject object) { + if (object.getLocation().getX() == 3142 || object.getLocation().getY() == 5545) { + commenceBorkBattle(player); + return; + } + Location loc = getLocation(object.getLocation()); + if (loc == null) { + player.sendMessage("Error! Unhandled portal for - " + object + "!"); + return; + } + if (!isFixed(player)) { + boolean stained = isStained(object); + if (!stained && RandomFunction.random(100) <= 3) { + stained = true; + setStainedTime(object); + } + if (stained) { + player.sendMessage("The portal is stained with dark magic."); + return; + } + if (RandomFunction.random(100) <= 3) { + loc = getRandomLocation(); + player.sendMessage("The dark magic teleports you into a random location."); + } + } + player.teleport(loc); + player.graphics(Graphics.create(110)); + } + + /** + * Starts the instanced battle against Bork. + * @param player The player. + */ + private void commenceBorkBattle(Player player) { + if ((System.currentTimeMillis() - player.getSavedData().getActivityData().getLastBorkBattle()) < 24 * 60 * 60_000 && GameWorld.getSettings().isHosted()) { + player.getPacketDispatch().sendMessage("The portal's magic is too weak to teleport you right now."); + return; + } + player.lock(10); + player.graphics(Graphics.create(110)); + player.getSavedData().getActivityData().setLastBorkBattle(System.currentTimeMillis()); + ActivityManager.start(player, "Bork cutscene", false); + } + + /** + * Gets a random location. + * @return the location. + */ + private Location getRandomLocation() { + return (Location) RandomFunction.getRandomElement(PORTALS.values().toArray()); + } + + /** + * Checks if the object is stained. + * @param object the object. + * @return {@code True} if so. + */ + private boolean isStained(GameObject object) { + return getStainedTime(object) > GameWorld.getTicks(); + } + + /** + * Sets stained time. + * @param object the object. + */ + private void setStainedTime(GameObject object) { + object.getAttributes().setAttribute("stained", (int) GameWorld.getTicks() + RandomFunction.random(50, 150)); + } + + /** + * Gets the stained tiem. + * @param object the object. + * @return the time. + */ + private int getStainedTime(GameObject object) { + return object.getAttributes().getAttribute("stained", 0); + } + + /** + * Checks if the portals are fixed. + * @param player the player. + * @return {@code True} if so. + */ + private boolean isFixed(Player player) { + return false; + } + + /** + * Gets a location from the portal. + * @param location the location. + * @return the location. + */ + public Location getLocation(Location location) { + Location l = PORTALS.get(location); + if (l != null) { + return l; + } + for (Entry entry : PORTALS.entrySet()) { + if (entry.getValue().equals(location)) { + return entry.getKey(); + } + } + return null; + } + + /** + * Adds a portal link. + * @param x the x. + * @param y the x. + * @param x2 the second x. + * @param y2 the second y. + */ + private void addLink(int x, int y, int x2, int y2) { + addLink(new Location(x, y, 0), new Location(x2, y2, 0)); + } + + /** + * Adds a portal link. + * @param location the location. + * @param loc the second location. + */ + private void addLink(Location location, Location loc) { + PORTALS.put(location, loc); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/CrandorZone.java b/Server/src/main/java/Server/core/game/content/zone/CrandorZone.java new file mode 100644 index 000000000..70c3fc020 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/CrandorZone.java @@ -0,0 +1,46 @@ +package core.game.content.zone; + +import core.game.node.entity.Entity; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the crandor zone. + * + * @author Vexia + */ +@Initializable +public class CrandorZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code CrandorZone} {@code Object} + */ + public CrandorZone() { + super("crandor", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public boolean enter(Entity entity) { + return super.enter(entity); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(2813, 3223, 2864, 3312)); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/DesertZone.java b/Server/src/main/java/Server/core/game/content/zone/DesertZone.java new file mode 100644 index 000000000..92088ea4e --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/DesertZone.java @@ -0,0 +1,204 @@ +package core.game.content.zone; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * The desert zone map. + * @author Emperor + * @author 'Vexia + * @version 2.0 + */ +@Initializable +public final class DesertZone extends MapZone implements Plugin { + + /** + * Represents the hydrateable waterskin items. + */ + private static final Item[] WATER_SKINS = new Item[] { new Item(1823), new Item(1825), new Item(1827), new Item(1829) }; + + /** + * Represents data of water vessils to dry up. + */ + private static final int[][] VESSILS = new int[][] { { 1937, 1935 }, { 1929, 1925 }, { 1921, 1923 }, { 227, 229 } }; + + /** + * Represents the animation of drinking water. + */ + private static final Animation ANIMATION = new Animation(829); + + /** + * The players list. + */ + private static final List PLAYERS = new ArrayList<>(); + + /** + * The water draining pulse. + */ + private static Pulse pulse = new Pulse(3) { + @Override + public boolean pulse() { + for (Player player : PLAYERS) { + if (player.getInterfaceManager().isOpened() || player.getInterfaceManager().hasChatbox() || player.getLocks().isMovementLocked()) { + continue; + } + if (player.getAttribute("desert-delay", -1) < GameWorld.getTicks()) { + effect(player); + } + } + return PLAYERS.isEmpty(); + } + }; + + /** + * Method used to handle the desert effect on the Player. + * @param p the Player. + */ + private static void effect(Player p) { + p.setAttribute("desert-delay", GameWorld.getTicks() + getDelay(p)); + evaporate(p); + if (drink(p)) { + return; + } + p.getImpactHandler().manualHit(p, RandomFunction.random(1, p.getLocation().getY() < 2990 ? 12 : 8), HitsplatType.NORMAL); + p.getPacketDispatch().sendMessage("You start dying of thirst while you're in the desert."); + } + + /** + * Method used to evaporate the water vessils in the inventory. + * @param p the Player + */ + public static void evaporate(Player p) { + for (int i = 0; i < VESSILS.length; i++) { + if (p.getInventory().contains(VESSILS[i][0], 1)) { + if (p.getInventory().remove(new Item(VESSILS[i][0]))) { + p.getInventory().add(new Item(VESSILS[i][1])); + p.getPacketDispatch().sendMessage("The water in your " + ItemDefinition.forId(VESSILS[i][0]).getName().toLowerCase().replace("of water", "").trim() + " evaporates in the desert heat."); + } + } + } + } + + /** + * Method used to drink a waterskin in the inventory. + * @param p the player. + */ + public static boolean drink(Player p) { + for (Item i : WATER_SKINS) { + if (p.getInventory().containsItem(i) && p.getInventory().remove(i)) { + p.getInventory().add(new Item(i.getId() + 2)); + p.animate(ANIMATION); + p.getPacketDispatch().sendMessage("You take a drink of water."); + return true; + } + } + if (p.getInventory().contains(1831, 1)) { + p.getPacketDispatch().sendMessage("Perhaps you should fill up one of your empty waterskins."); + } else { + p.getPacketDispatch().sendMessage("You should get a waterskin for any travelling in the desert."); + } + return false; + } + + /** + * Method used to calculate the delay to the next desert effect. + * @param player the player. + * @return Long the amount of the delay. + */ + private static int getDelay(Player player) { + int delay = 116; + if (player.getEquipment().contains(1833, 1)) { + delay += 17; + } + if (player.getEquipment().contains(1835, 1)) { + delay += 17; + } + if (player.getEquipment().contains(1837, 1)) { + delay += 17; + } + return delay; + } + + /** + * Constructs a new {@code DesertZone} {@code Object}. + */ + public DesertZone() { + super("Desert Zone", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + ZoneBorders borders = new ZoneBorders(3063, 2725, 3544, 3115); + borders.addException(new ZoneBorders(3152, 2961, 3191, 2999));// Bandit + // camp + borders.addException(new ZoneBorders(3398, 2914, 3450, 2941));//Nardah + borders.addException(new ZoneBorders(3410, 2883, 3450, 2941));//Nardah2 + borders.addException(new ZoneBorders(3147, 3019, 3185, 3059));// Bedabin + borders.addException(new ZoneBorders(3217, 2881, 3248, 2914));// pyramid + borders.addException(new ZoneBorders(3264, 2752, 3323, 2810));// Sophanem + borders.addException(new ZoneBorders(3326,2942,3371,3006)); //Pollnivneach + borders.addException(new ZoneBorders(3007, 4672, 3071, 4735));// agility-pyramid + // top(region12105) + borders.addException(new ZoneBorders(3274, 3014, 3305, 3041));// Mining + // camp + borders.addException(new ZoneBorders(3260, 9408, 3331, 9472));// Mining + // camp + register(borders); + pulse.stop(); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player p = (Player) e; + if (TutorialSession.getExtension(p).getStage() < TutorialSession.MAX_STAGE) { + return true; + } + p.setAttribute("desert-delay", GameWorld.getTicks() + getDelay(p)); + PLAYERS.add(p); + if (!pulse.isRunning()) { + pulse.restart(); + pulse.start(); + GameWorld.getPulser().submit(pulse); + } + } + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + PLAYERS.remove(e); + e.removeAttribute("desert-delay"); + } + return super.leave(e, logout); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/zone/DraynorMansionCourtyardZone.java b/Server/src/main/java/Server/core/game/content/zone/DraynorMansionCourtyardZone.java new file mode 100644 index 000000000..e75b30b8c --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/DraynorMansionCourtyardZone.java @@ -0,0 +1,44 @@ +package core.game.content.zone; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class DraynorMansionCourtyardZone extends MapZone implements Plugin { + + public DraynorMansionCourtyardZone() { + super("draynor-mansion-courtyard", true); + } + + @Override + public void configure() { + register(new ZoneBorders(3100, 3333, 3114, 3346)); + } + + @Override + public boolean enter(Entity entity) { + // Enter the courtyard of the spooky mansion in Draynor Village + if (entity.isPlayer()) { + Player player = entity.asPlayer(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 8); + } + return super.enter(entity); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/DraynorMarketZone.java b/Server/src/main/java/Server/core/game/content/zone/DraynorMarketZone.java new file mode 100644 index 000000000..8861f10c4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/DraynorMarketZone.java @@ -0,0 +1,44 @@ +package core.game.content.zone; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class DraynorMarketZone extends MapZone implements Plugin { + + public DraynorMarketZone() { + super("draynor-market", true); + } + + @Override + public void configure() { + register(new ZoneBorders(3074, 3245, 3086, 3255)); + } + + @Override + public boolean enter(Entity entity) { + // Visit the Draynor Village market + if (entity.isPlayer()) { + Player player = entity.asPlayer(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 9); + } + return super.enter(entity); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/FredsFarmHouseZone.java b/Server/src/main/java/Server/core/game/content/zone/FredsFarmHouseZone.java new file mode 100644 index 000000000..81a6d9213 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/FredsFarmHouseZone.java @@ -0,0 +1,44 @@ +package core.game.content.zone; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class FredsFarmHouseZone extends MapZone implements Plugin { + + public FredsFarmHouseZone() { + super("freds-farm-house", true); + } + + @Override + public void configure() { + register(new ZoneBorders(3188, 3275, 3192, 3270)); + } + + @Override + public boolean enter(Entity entity) { + // Visit Fred the Farmer's chicken and sheep farm + if (entity.isPlayer()) { + Player player = entity.asPlayer(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 19); + } + return super.enter(entity); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/IcePathZone.java b/Server/src/main/java/Server/core/game/content/zone/IcePathZone.java new file mode 100644 index 000000000..1e219f73f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/IcePathZone.java @@ -0,0 +1,91 @@ +package core.game.content.zone; + +import core.game.component.Component; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * The God Wars entrance zone monitor. + * @author Emperor + */ +@Initializable +public final class IcePathZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code IcePathZone} {@code Object}. + */ + public IcePathZone() { + super("Ice path zone", true); + } + + @Override + public void configure() { + ZoneBorders border = new ZoneBorders(2821, 3712, 2940, 3839); + border.addException(new ZoneBorders(2821, 3712, 2838, 3745)); + register(border); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + final Player player = (Player) e; + player.getInterfaceManager().openOverlay(new Component(482)); // TODO: + // find + // the + // real + // one + Pulse pulse = new Pulse(10, player) { + @Override + public boolean pulse() { + if (player.getLocks().isMovementLocked()) { + return false; + } + player.getSettings().updateRunEnergy(100); + player.getImpactHandler().manualHit(player, 1, HitsplatType.NORMAL); + int skill = RandomFunction.randomize(7); + if (skill == 3 || skill == 5) { + skill++; + } + player.getSkills().updateLevel(skill, -1, 0); + return false; + } + }; + player.setAttribute("ice_path_pulse", pulse); + GameWorld.getPulser().submit(pulse); + } + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + ((Player) e).getInterfaceManager().closeOverlay(); + Pulse pulse = e.getAttribute("ice_path_pulse"); + if (pulse != null) { + pulse.stop(); + e.removeAttribute("ice_path_pulse"); + } + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/TzhaarZone.java b/Server/src/main/java/Server/core/game/content/zone/TzhaarZone.java new file mode 100644 index 000000000..2e56f6dea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/TzhaarZone.java @@ -0,0 +1,40 @@ +package core.game.content.zone; + +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the tzhaar zone. + * @author Vexia + */ +@Initializable +public class TzhaarZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code TzhaarZone} {@code Object} + */ + public TzhaarZone() { + super("Tzhaar zone", true, ZoneRestriction.CANNON); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(2369, 5054, 2549, 5188)); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/WildernessAreaZone.java b/Server/src/main/java/Server/core/game/content/zone/WildernessAreaZone.java new file mode 100644 index 000000000..83ea6185b --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/WildernessAreaZone.java @@ -0,0 +1,580 @@ +package core.game.content.zone; + +import core.game.content.dialogue.DialogueAction; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.action.DoorActionHandler; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.gather.SkillingResource; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.Option; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the Wilderness Area Zone. + * @author Empathy + * @author Vexia + * + */ +@Initializable +public class WildernessAreaZone extends MapZone implements Plugin { + + /** + * The list of players in the arena. + */ + private final List players = new ArrayList<>(); + + /** + * Constructs a new {@code WildernessAreaZone} {@code Object} + */ + public WildernessAreaZone() { + super("Wilderness Area Zone", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugins(new MandrithDialoguePlugin(), new PilesDialoguePlugin(), new PilesItemHandler(), new RuniteGolemNPC()); + return this; + } + + @Override + public boolean interact(Entity e, final Node node, Option option) { + if (e instanceof Player) { + Player player = e.asPlayer(); + switch (node.getId()) { + case 42044: + switch (option.getName()) { + case "Open": + if (player.getLocation().equals(Location.create(3184, 3945, 0))) { + if (player.getInventory().contains(995, 7500)) { + player.getDialogueInterpreter().sendOptions("Pay 7500 coins?", "Yes", "No"); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 2: + if (player.getInventory().remove(new Item(995, 7500))) { + DoorActionHandler.handleDoor(player, node.asObject()); + player.sendMessage("You pay 7500 coins and enter the resource arena."); + } + break; + } + } + + }); + return true; + } + player.sendMessage("You do not have enough coins to enter the Arena."); + return true; + } + DoorActionHandler.handleDoor(player, node.asObject()); + return true; + case "Players-inside": + if (player.getLocation().getY() < 3495) { + player.sendMessage("All you see is the barren wasteland of the Wilderness."); + return true; + } + String message = "You peek inside the gate and see no adventurers inside the arena."; + if (players.size() > 0) { + message = players.size() == 1 ? "You peek inside the gate and see 1 adventurer inside the arena." : "You peek inside the gate and see " + players.size() + " inside the arena."; + } + player.getDialogueInterpreter().sendDialogue(message); + break; + } + break; + case 8666: + switch (option.getName()) { + case "Mine": + player.getPulseManager().run(new RuniteGolemMinePulse(player, node.asNpc())); + return true; + case "Prospect": + player.sendMessages("You examine the rock for ores...", "This rock contains runite ore."); + return true; + } + break; + } + } + return super.interact(e, node, option); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(3174, 3924, 3196, 3945)); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player p = e.asPlayer(); + players.add(p); + } + return super.enter(e); + } + + @SuppressWarnings("deprecation") + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player p = e.asPlayer(); + players.remove(p); + if (logout && p.getLocation().getY() <= 3944) { + p.setLocation(Location.create(3184, 3945, 0)); + return true; + } + } + return super.leave(e, logout); + } + + /** + * The mining of a runite golem. + * @author Vexia + * + */ + public class RuniteGolemMinePulse extends SkillPulse { + + /** + * The skilling tool used. + */ + private SkillingTool tool; + + /** + * The ticks. + */ + private int ticks; + + /** + * Constructs a new @{Code RuniteGolemMinePulse} object. + * @param player The player. + * @param node The node. + */ + public RuniteGolemMinePulse(Player player, NPC node) { + super(player, node); + } + + @Override + public void start() { + resource = SkillingResource.RUNITE_ORE_0; + if (node.getId() != 8666) { + player.getPacketDispatch().sendMessage("This rock contains no ore."); + return; + } + if (resource == null) { + return; + } + if (TutorialSession.getExtension(player).getStage() == 35) { + TutorialStage.load(player, 36, false); + } + super.start(); + } + + + @Override + public boolean checkRequirements() { + if (node.getId() != 8666) { + return false; + } + if (player.getSkills().getLevel(resource.getSkillId()) < resource.getLevel()) { + player.getPacketDispatch().sendMessage("You need a " + Skills.SKILL_NAME[resource.getSkillId()] + " level of " + resource.getLevel() + " to mine this rock."); + return false; + } + if ((tool = SkillingTool.getPickaxe(player)) == null) { + player.getPacketDispatch().sendMessage("You do not have a pickaxe to use."); + return false; + } + if (player.getInventory().freeSlots() < 1) { + player.getDialogueInterpreter().sendDialogue("Your inventory is too full to hold any more runite ore."); + return false; + } + return true; + } + + @Override + public void animate() { + if (tool != null) { + player.animate(tool.getAnimation()); + } + } + + @Override + public boolean reward() { + if (++ticks % 4 != 0) { + return false; + } + if (!checkReward()) { + return false; + } + node.transform(8667); + node.setAttribute("reward-tick", GameWorld.getTicks() + resource.getRespawnDuration()); + final Item item = new Item(resource.getReward()); + player.getInventory().add(item); + player.getSkills().addExperience(resource.getSkillId(), resource.getExperience(), true); + return true; + } + + /** + * Checks if the player gets rewarded. + * @return {@code True} if so. + */ + private boolean checkReward() { + int skill = Skills.MINING; + int level = 1 + player.getSkills().getLevel(skill) + player.getFamiliarManager().getBoost(skill); + double hostRatio = Math.random() * (100.0 * resource.getRate()); + double clientRatio = Math.random() * ((level - resource.getLevel()) * (1.0 + tool.getRatio())); + return hostRatio < clientRatio; + } + } + + /** + * Handles the runite golem npc. + * @author Vexia + * + */ + public class RuniteGolemNPC extends AbstractNPC { + + /** + * The respawn time. + */ + private int respawn = -1; + + /** + * Constructs a new @{Code RuniteGolemNPC} object. + * @param id The npc id. + * @param location The location. + */ + public RuniteGolemNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new @{Code RuniteGolemNPC} object. + */ + public RuniteGolemNPC() { + super(-1, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new RuniteGolemNPC(id, location); + } + + @Override + public void init() { + super.init(); + setAggressive(false); + } + + @Override + public void sendImpact(BattleState state) { + super.sendImpact(state); + if (state.getEstimatedHit() > 16) { + state.setEstimatedHit(16); + } + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (isAggressive()) { + setAggressive(false); + } + if (respawn != -1 && respawn < GameWorld.getTicks() && getId() > 8664) { + transform(8664); + unlock(); + } + if (getId() == 8667) { + int rewardTick = getAttribute("reward-tick", -1); + if (rewardTick != -1 && rewardTick < GameWorld.getTicks()) { + transform(8666); + } + } + } + + @Override + public void finalizeDeath(Entity killer) { + respawn = GameWorld.getTicks() + 500; + fullRestore(); + getProperties().setTeleportLocation(getLocation()); + setRespawnTick(0); + setInvisible(false); + transform(8666); + lock(); + faceLocation(null); + face(null); + } + + @Override + public int[] getIds() { + return new int[] {8664}; + } + + + } + + /** + * Handles the item on piles interaction. + * @author Vexia + * + */ + public static class PilesItemHandler extends UseWithHandler { + + /** + * The allowed items for piles. + */ + private static final int[] ALLOWED = new int[] {14937, 14939, 449, 447, 440, 444, 453, 451, 1515, 1513, 2349, 9467,2351,2355,2353,2357,2359,2361,2363}; + + /** + * Constructs a new @{Code PilesItemHandler} object. + */ + public PilesItemHandler() { + super(); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(8663, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + for (int itemId : ALLOWED) { + if (event.getUsedItem().getId() == itemId) { + final int amount = player.getInventory().getAmount(itemId); + final int price = 50 * amount; + if (!player.getInventory().contains(995, price)) { + player.getDialogueInterpreter().sendDialogues(8663, FacialExpression.OLD_NORMAL, "I'll need 50 coins per item."); + return true; + } + player.getDialogueInterpreter().sendOptions("Banknote " + amount + " x " + event.getUsedItem().getName() + "?", "Yes - " + price + " gp", "Cancel"); + player.getDialogueInterpreter().addAction((player1, buttonId) -> { + if (player1.getInventory().remove(new Item(995, price)) && player1.getInventory().remove(new Item(event.getUsedItem().getId(), amount))) { + player1.getInventory().add(new Item(event.getUsedItem().getNoteChange(), amount)); + player1.getDialogueInterpreter().sendItemMessage(event.getUsedItem().getId(), "Piles converts your items to banknotes."); + } + }); + return true; + } + } + player.getDialogueInterpreter().sendDialogues(8663, FacialExpression.OLD_NORMAL, "Sorry, I wasn't expecting anyone to want to convert", "that sort of item, so I haven't any banknotes for it."); + return true; + } + + @Override + public boolean isDynamic() { + return true; + } + } + + /** + * Handles the Piles dialogue. + * @author Vexia + * + */ + public class PilesDialoguePlugin extends DialoguePlugin { + + /** + * Constructs a new @{Code PilesDialoguePlugin} object. + */ + public PilesDialoguePlugin() { + /* + * empty. + */ + } + + /** + * Constructs a new @{Code PilesDialoguePlugin} object. + * @param player The player. + */ + public PilesDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PilesDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc("Hello. I can convert items to banknotes, for 50 coins", "per item. Just hand me the items you'd like me to", "convert."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Who are you?", "Thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("Thanks."); + stage = 2; + break; + } + break; + case 2: + end(); + break; + case 10: + npc("I'm Piles. I lived in Draynor Village when I was", "young, where I saw three men working in the market,", "converting items to banknotes."); + stage++; + break; + case 11: + npc("Their names were Niles, Miles and Giles. I'm trying to", "be like them, so I've changed my name and started this", "business here."); + stage++; + break; + case 12: + player("Thanks."); + stage = 2; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {8663}; + } + + } + + /** + * Handles the Mandrith dialogue. + * @author Empathy + * + */ + public class MandrithDialoguePlugin extends DialoguePlugin { + + /** + * + * Constructs a new @{Code MandrithDialoguePlugin} object. + */ + public MandrithDialoguePlugin() { + /* + * empty + */ + } + + /** + * + * Constructs a new @{Code MandrithDialoguePlugin} object. + * @param player + */ + public MandrithDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MandrithDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + player("Who are you and what is this place?" ); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + npc("My name is Mandrith." ); + stage = 2; + break; + case 2: + npc("I collect valuable resources and pawn off access to them", "to foolish adventurers, like yourself" ); + stage = 3; + break; + case 3: + npc("You should take a look inside my arena. There's an", "abundance of valuable resources inside." ); + stage = 4; + break; + case 4: + player("And I can take whatever I want?" ); + stage = 5; + break; + case 5: + npc("It's all yours. All I ask is that you pay the upfront fee." ); + stage = 6; + break; + case 6: + player("Will others be able to kill me inside?" ); + stage = 7; + break; + case 7: + npc("Yes. These walls will only hold them back for so long." ); + stage = 8; + break; + case 8: + player("You'll stop them though, right?" ); + stage = 9; + break; + case 9: + npc("Haha! For the right price, I won't deny anyone access", "to my arena. Even if their intention is to kill you." ); + stage = 10; + break; + case 10: + player("Right..." ); + stage = 11; + break; + case 11: + npc("My arena holds many treasure that I've acquired at", "great expense, adventurer. Their bounty can come at a", "price." ); + stage = 12; + break; + case 12: + npc("One day, adventurer, I will boast ownership of a much", "larger, much more dangerous arena than this. Take", "advantage of this offer while it lasts." ); + stage = 13; + break; + case 13: + end(); + break; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 8662 }; + } + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/YanilleAgilityDungeon.java b/Server/src/main/java/Server/core/game/content/zone/YanilleAgilityDungeon.java new file mode 100644 index 000000000..fc4e29d7d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/YanilleAgilityDungeon.java @@ -0,0 +1,220 @@ +package core.game.content.zone; + +import core.game.content.global.action.ClimbActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the yanille agility dungeon. + * @author Vexia + */ +@Initializable +public class YanilleAgilityDungeon extends MapZone implements Plugin { + + /** + * The herb items. + */ + private static final Item[] HERBS = new Item[] { new Item(205, 2), new Item(207, 3), new Item(209), new Item(211), new Item(213), new Item(219) }; + + /** + * Constructs a new {@Code YanilleAgilityDungeon} {@Code + * Object} + */ + public YanilleAgilityDungeon() { + super("Yanilee agility", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugin(new SalarinTwistedNPC()); + return this; + } + + @Override + public boolean interact(Entity entity, Node target, Option option) { + if (entity instanceof Player) { + Player player = entity.asPlayer(); + switch (target.getId()) { + case 1728: + player.teleport(new Location(2620, 9565, 0)); + return true; + case 1729: + player.teleport(new Location(2620, 9496, 0)); + return true; + case 2316: + player.teleport(Location.create(2569, 9525, 0)); + return true; + case 2318: + case 2317: + if (player.getSkills().getLevel(Skills.AGILITY) < 67) { + player.getDialogueInterpreter().sendDialogue("You need an Agility level of at least 67 in order to do this."); + return true; + } + Location loc = target.getId() == 2317 ? new Location(2615, 9503, 0) : new Location(2617, 9572, 0); + ClimbActionHandler.climb(player, target.getId() == 2317 ? ClimbActionHandler.CLIMB_UP : ClimbActionHandler.CLIMB_DOWN, loc); + player.sendMessage("You climb " + (target.getId() == 2317 ? "up" : "down") + " the pile of rubble..."); + player.getSkills().addExperience(Skills.AGILITY, 5.5, true); + return true; + case 35969: + case 2303: + handleBalancingLedge(player, target.asObject()); + return true; + case 377: + if (!player.getInventory().contains(993, 1)) { + player.sendMessage("The chest is locked."); + } else { + if (player.getInventory().freeSlots() == 0) { + player.sendMessage("You don't have enough inventory space."); + return true; + } + player.lock(1); + player.getInventory().remove(new Item(993)); + player.sendMessages("You unlock the chest with your key...", "A foul gas seeps from the chest"); + player.getStateManager().register(EntityState.POISONED, true, 28, player); + for (Item item : HERBS) { + player.getInventory().add(item, player); + } + ObjectBuilder.replace(target.asObject(), target.asObject().transform(target.getId() + 1), 5); + } + return true; + case 378: + switch (option.getName().toLowerCase()) { + case "search": + player.sendMessage("The chest is empty."); + break; + case "shut": + break; + } + return true; + } + } + return super.interact(entity, target, option); + } + + /** + * Handles the balancing ledge. + * @param player the player. + * @param object the object. + */ + private void handleBalancingLedge(final Player player, GameObject object) { + if (player.getSkills().getLevel(Skills.AGILITY) < 40) { + player.getDialogueInterpreter().sendDialogue("You need an Agility level of at least 40 in order to do this."); + return; + } + final Direction dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + final int diff = player.getLocation().getY() == 9512 ? 0 : 1; + Location end = object.getLocation(); + double xp = 0.0; + if (AgilityHandler.hasFailed(player, 40, 0.01)) { + player.lock(3); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + AgilityHandler.fail(player, 1, new Location(2572, 9570, 0), Animation.create(761 - diff), RandomFunction.random(1, 3), "You lost your balance!"); + return true; + } + }); + } else { + xp = 22.5; + end = object.getLocation().transform(dir.getStepX() * 7, dir.getStepY() * 7, 0); + } + AgilityHandler.walk(player, -1, player.getLocation(), end, Animation.create(157 - diff), xp, null); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(2544, 9481, 2631, 9587)); + } + + /** + * Handles the salarin twisted npc. + * @author Vexia + */ + public static class SalarinTwistedNPC extends AbstractNPC { + + /** + * The spell ids. + */ + private static final int[] SPELL_IDS = new int[] { 1, 4, 6, 8 }; + + /** + * Constructs a new {@Code SalarinTwistedNPC} {@Code + * Object} + */ + public SalarinTwistedNPC() { + super(-1, null); + } + + /** + * Constructs a new {@Code SalarinTwistedNPC} {@Code + * Object} + * @param id the id. + * @param location the location. + */ + public SalarinTwistedNPC(int id, Location location) { + super(id, location); + super.setAggressive(true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SalarinTwistedNPC(id, location); + } + + @Override + public void checkImpact(BattleState state) { + if (state.getStyle() != CombatStyle.MAGIC) { + state.neutralizeHits(); + return; + } + if (state.getSpell() == null) { + state.neutralizeHits(); + return; + } + CombatSpell spell = state.getSpell(); + for (int id : SPELL_IDS) { + if (id == spell.getSpellId()) { + return; + } + } + state.neutralizeHits(); + } + + @Override + public int[] getIds() { + return new int[] { 205 }; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/fremmenik/FremmenikPlugin.java b/Server/src/main/java/Server/core/game/content/zone/fremmenik/FremmenikPlugin.java new file mode 100644 index 000000000..ff42e1fdb --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/fremmenik/FremmenikPlugin.java @@ -0,0 +1,30 @@ +package core.game.content.zone.fremmenik; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Handles the fremmenik plugin. + * @author Vexia + */ +public class FremmenikPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(5508).getHandlers().put("option:ferry-neitiznot", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "ferry-neitiznot": + return true; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/keldagrim/CartConductorDialogue.kt b/Server/src/main/java/Server/core/game/content/zone/keldagrim/CartConductorDialogue.kt new file mode 100644 index 000000000..e7b595dc2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/keldagrim/CartConductorDialogue.kt @@ -0,0 +1,87 @@ +package core.game.content.zone.keldagrim + +import core.game.component.Component +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.map.Location +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +private const val ICE_MOUNTAIN_CONDUCTOR = 2180 +private const val WHITE_WOLF_CONDUCTOR = 2181 +private const val KELDAGRIM_CONDUCTOR = 2182 + +@Initializable +class CartConductorDialogue(player: Player? = null) : DialoguePlugin(player) { + var visitedKeldagrim = false + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc("Sorry, but I can only take people","who have been there before.").also { stage = 1000 } + + //Start Ice Mountain (Dwarven Mines) Conductor Dialogue + 100 -> npc("Alright, that'll cost ye 150gp.").also { stage++ } + 101 -> options("Okay, sure.","No, thanks.").also { stage++ } + 102 -> when(buttonId){ + 1 -> end().also { purchaseTrip(player,150) } + 2 -> end() + } + + //Start White Wolf Mountain Conductor Dialogue + 200 -> npc("Alright, that'll cost ye 100gp.").also { stage++ } + 201 -> options("Okay, sure.","No, thanks.").also { stage++ } + 202 -> when(buttonId){ + 1 -> end().also { purchaseTrip(player,100) } + 2 -> end() + } + + //Start Keldagrim Conductor Dialogue + 300 -> npc("Alright, where would ye like to go?").also { stage++ } + 301 -> options("Grand Exchange","White Wolf Mountain","Ice Mountain").also { stage++ } + 302 -> when(buttonId){ + 1 -> KeldagrimCartMethods.leaveKeldagrimTo(player, Location.create(3140, 3507, 0)).also{ end() } + 2 -> KeldagrimCartMethods.leaveKeldagrimTo(player,Location.create(2875, 9871, 0)).also{ end() } + 3 -> KeldagrimCartMethods.leaveKeldagrimTo(player,Location.create(2997, 9837, 0)).also{ end() } + } + 1000 -> end() + } + return true + } + + fun purchaseTrip(player: Player, cost: Int){ + val coins = Item(995,cost) + if(player.inventory.containsItem(coins)){ + player.inventory.remove(coins) + KeldagrimCartMethods.goToKeldagrim(player) + } else { + player.dialogueInterpreter.sendDialogue("You can not afford that.") + } + } + + override fun npc(vararg messages: String?): Component { + return super.npc(FacialExpression.OLD_NORMAL, *messages) + } + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC //get which conductor specifically is being used + visitedKeldagrim = player.getAttribute("keldagrim-visited",false) //visited keldagrim? + + player("I'd like to use your cart, please.") + when(npc.id){ + ICE_MOUNTAIN_CONDUCTOR -> stage = if(!visitedKeldagrim) 0 else 100 + WHITE_WOLF_CONDUCTOR -> stage = if(!visitedKeldagrim) 0 else 200 + KELDAGRIM_CONDUCTOR -> stage = 300 + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return CartConductorDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(ICE_MOUNTAIN_CONDUCTOR, WHITE_WOLF_CONDUCTOR, KELDAGRIM_CONDUCTOR) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/zone/keldagrim/DwarvenBoatmanDialogue.kt b/Server/src/main/java/Server/core/game/content/zone/keldagrim/DwarvenBoatmanDialogue.kt new file mode 100644 index 000000000..2d53ae391 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/keldagrim/DwarvenBoatmanDialogue.kt @@ -0,0 +1,68 @@ +package core.game.content.zone.keldagrim + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression + +@Initializable +class DwarvenBoatmanDialogue(player: Player? = null) : DialoguePlugin(player) { + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage++){ + 0 -> player("I'd like to go to Keldagrim please.") + 1 -> npc("How do you know about that?") + 2 -> player("Look, I just do, okay?") + 3 -> npc("uhhhh") + 4 -> player("I'm, errr, from the future!") + 5 -> npc("hmmm") + 6 -> player("Can I please just go?") + 7 -> npc("Hmmmmmmmmmmm") + 8 -> player("Ok, fine! I'll prove it! errrr....") + 9 -> npc("Hm?") + 10 -> player("In the future your big statue gets knocked over!") + 11 -> npc("How do you even know about-") + 12 -> npc("Gah, nevermind! Just climb","on board!") + 13 -> player("Thank you!") + 14 -> end().also { GameWorld.Pulser.submit(travelPulse(player)) } + } + return true + } + + override fun open(vararg args: Any?): Boolean { + npc("Aye, what do you want?") + stage = 0 + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return DwarvenBoatmanDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(2205,1844,1843) + } + + override fun npc(vararg messages: String?): Component { + return super.npc(FacialExpression.OLD_NORMAL, *messages) + } +} + +class travelPulse(val player: Player): Pulse(1){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.lock().also { player.interfaceManager.open(Component(115)) } + 3 -> player.properties.teleportLocation = Location.create(2888, 10225, 0) + 4 -> { + player.interfaceManager.close(Component(115)) + player.interfaceManager.open(Component(170)) + } + 6 -> player.unlock().also { player.interfaceManager.close(Component(170)); player.setAttribute("/save:keldagrim-visited",true); return true } + } + return false + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimCartMethods.kt b/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimCartMethods.kt new file mode 100644 index 000000000..a1f381028 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimCartMethods.kt @@ -0,0 +1,92 @@ +package core.game.content.zone.keldagrim + +import core.game.component.Component +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Direction +import core.game.world.map.Location + +object KeldagrimCartMethods { + @JvmStatic + fun goToKeldagrim(player: Player){ + GameWorld.Pulser.submit(TravelToKeldagrimPulse(player)) + } + + @JvmStatic + fun leaveKeldagrimTo(player: Player, dest: Location){ + GameWorld.Pulser.submit(TravelFromKeldagrimPulse(player,dest)) + } +} + + +class TravelFromKeldagrimPulse(val player: Player, val dest: Location): Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.lock().also { player.interfaceManager.open(Component(115)) } + 4 -> { + player.properties.teleportLocation = Location.create(2911, 10171, 0) + player.appearance.rideCart(true) + } + 5 -> { + player.walkingQueue.reset() + player.walkingQueue.addPath(2936, 10171) + } + 6 -> { + player.interfaceManager.close(Component(115)) + player.interfaceManager.open(Component(170)) + } + 14 -> { + player.interfaceManager.open(Component(115)) + } + 21 -> { + player.walkingQueue.reset() + player.properties.teleportLocation = dest + player.appearance.rideCart(false) + } + 23 -> { + player.interfaceManager.close(Component(115)) + player.interfaceManager.open(Component(170)) + } + 25 -> { + player.unlock() + player.interfaceManager.close(Component(170)) + return true + } + } + return false + } +} + +class TravelToKeldagrimPulse(val player: Player) : Pulse(){ + var counter = 0 + var cartNPC = NPC(1546) + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.lock().also { player.interfaceManager.open(Component(115)) } + 3 -> player.properties.teleportLocation = Location.create(2942, 10175, 0).also { player.appearance.rideCart(true) } + 5 -> { + player.walkingQueue.reset() + player.walkingQueue.addPath(2915, 10175) + } + 7 -> { + player.interfaceManager.close(Component(115)) + player.interfaceManager.open(Component(170)) + } + 19 -> { + player.interfaceManager.close(Component(170)) + player.unlock() + player.appearance.rideCart(false) + cartNPC.location = player.location + cartNPC.direction = Direction.WEST + cartNPC.init() + player.properties.teleportLocation = player.location.transform(0,1,0) + } + 33 -> return true.also { cartNPC.clear() } + + } + return false + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimPlugin.kt b/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimPlugin.kt new file mode 100644 index 000000000..d4f9241d5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/keldagrim/KeldagrimPlugin.kt @@ -0,0 +1,107 @@ +package core.game.content.zone.keldagrim + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.world.map.Location +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.dialogue.DialoguePlugin + +/** + * File that contains several plugins relating to Keldagrim, + * most notably the KeldagrimOptionHandlers and GETrapdoorDialogue + * Anything that wasn't significant enough for its own individual file, tbh. + * @author Ceikry + */ + +const val GETrapdoorDialogueID = 22381232 + +/** + * Handles various options around keldagrim that weren't significant enough for a separate file + */ +@Initializable +class KeldagrimOptionHandlers : OptionHandler() { + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + option ?: return false + when(option){ + "go-through" -> { + when (node.id) { + 5973 -> player.properties.teleportLocation = Location.create(2838, 10125) + 5998 -> player.properties.teleportLocation = Location.create(2780, 10161) + } + } + "climb-up" -> { + when(node.id){ + 9138 -> player.properties.teleportLocation = Location.create(2931, 10196, 0) + } + } + "climb-down" -> { + when(node.id){ + 9084 -> player.properties.teleportLocation = Location.create(1940, 4958, 0) + } + } + "open" -> { + when(node.id){ + 28094 -> player.dialogueInterpreter.open(GETrapdoorDialogueID) + } + } + "enter" -> { + when(node.id){ + 5014 -> player.properties.teleportLocation = Location.create(2730, 3713, 0) + } + } + } + return true + } + + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(5973).handlers["option:go-through"] = this + ObjectDefinition.forId(5998).handlers["option:go-through"] = this + ObjectDefinition.forId(9084).handlers["option:climb-down"] = this + ObjectDefinition.forId(9138).handlers["option:climb-up"] = this + ObjectDefinition.forId(28094).handlers["option:open"] = this + ObjectDefinition.forId(5014).handlers["option:enter"] = this + return this + } +} + +/** + * Dialogue used for the trapdoor in the grand exchange. + */ +@Initializable +class GETrapdoorDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> end() + 10 -> when(buttonId){ + 1 -> KeldagrimCartMethods.goToKeldagrim(player).also { end() } + 2 -> end() + } + } + return true + } + + override fun open(vararg args: Any?): Boolean { + val keldagrimVisited = player.getAttribute("keldagrim-visited",false) + if(keldagrimVisited){ + options("Travel to Keldagrim","Nevermind.") + stage = 10 + } else { + player.dialogueInterpreter.sendDialogue("Perhaps I should visit Keldagrim first.") + stage = 0 + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return GETrapdoorDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(GETrapdoorDialogueID) + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/keldagrim/Reinald.kt b/Server/src/main/java/Server/core/game/content/zone/keldagrim/Reinald.kt new file mode 100644 index 000000000..7be0477b3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/keldagrim/Reinald.kt @@ -0,0 +1,59 @@ +package core.game.content.zone.keldagrim + +import core.cache.def.impl.NPCDefinition +import core.game.component.Component +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.dialogue.DialoguePlugin + +const val REINALD = 2194 + +/** + * File for handling Reinald's dialogue and right-click option + * @author Ceikry + */ +@Initializable +class ReinaldDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage++){ + 0 -> options("Yes, please!", "No, thanks.") + 1 -> when(buttonId){ + 1 -> end().also { player.interfaceManager.open(Component(REINALD_COMPONENT_ID)) } + 2 -> end() + } + } + return true + } + + override fun open(vararg args: Any?): Boolean { + npc("Hello, human! Would you like to browse","my little shop of bracelets?") + stage = 0 + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return ReinaldDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(REINALD) + } + +} + +@Initializable +class ReinaldOptionHandler : OptionHandler(){ + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player?.interfaceManager?.open(Component(REINALD_COMPONENT_ID)) + return true + } + + override fun newInstance(arg: Any?): Plugin { + NPCDefinition.forId(REINALD).handlers["option:change-armguards"] = this + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface.kt b/Server/src/main/java/Server/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface.kt new file mode 100644 index 000000000..717bd64e7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/keldagrim/ReinaldSmithingEmporiumInterface.kt @@ -0,0 +1,124 @@ +package core.game.content.zone.keldagrim + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin + +const val REINALD_COMPONENT_ID = 593 +private const val BRACELET_INTERFACE_CHILD_ID = 69 + +//Models to send for various wristguards +private const val SILVER_WRISTGUARDS = 27703 +private const val SILVER_CLASPS = 27704 +private const val SILVER_BANGLES = 27706 +private const val SILVER_BANDING = 27707 +private const val SILVER_BANDS = 27697 +private const val SILVER_ARMGUARDS = 27699 + +private const val GOLD_WRISTGUARDS = 27698 +private const val GOLD_CLASPS = 27708 +private const val GOLD_BANGLES = 27702 +private const val GOLD_BANDING = 27705 +private const val GOLD_BANDS = 27700 +private const val GOLD_ARMGUARDS = 27709 + +private const val NONE = 0 + +private val COINS = Item(995,500) + +//Appearance Indexes for Various Wristguards +//117S 118G 119S 120G 121S 122G 123S 124G 125S 126G M +//159S 160G 161S 162G 163S 164G 165S 166G 167S 168G F +//67SF 68NF 127GF 33SM 34NM 84GM +@Initializable +/** + * Handle's Reinald's bracelet shop + * @author Ceikry + */ +class ReinaldSmithingEmporiumInterface : ComponentPlugin(){ + override fun open(player: Player?, component: Component?) { + super.open(player, component) + //make sure the player can't just close the interface and get it for free (lol) + player?.setAttribute("wrists-look",player.appearance.wrists.look) + player?.toggleWardrobe(true) + component?.setCloseEvent(){pl,_ -> + player?.toggleWardrobe(false) + val orindex = pl.getAttribute("wrists-look", if(pl.isMale) 34 else 68) + val paid = pl.getAttribute("bracelet-paid",false) + if(!paid) { + pl.appearance.wrists.changeLook(orindex) + pl.appearance.sync() + } + pl.removeAttribute("bracelet-paid") + true + } + } + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + when(button){ + 122, + 129 -> sendModel(NONE,player) + 123 -> sendModel(SILVER_WRISTGUARDS,player) + 124 -> sendModel(SILVER_CLASPS,player) + 125 -> sendModel(SILVER_BANGLES,player) + 126 -> sendModel(SILVER_BANDING,player) + 127 -> sendModel(SILVER_BANDS,player) + 128 -> sendModel(SILVER_ARMGUARDS,player) + 130 -> sendModel(GOLD_WRISTGUARDS,player) + 131 -> sendModel(GOLD_CLASPS, player) + 132 -> sendModel(GOLD_BANGLES,player) + 133 -> sendModel(GOLD_BANDING,player) + 134 -> sendModel(GOLD_BANDS,player) + 135 -> sendModel(GOLD_ARMGUARDS,player) + 117 -> confirm(player) + } + return true + } + + fun confirm(player: Player){ + if(player.inventory.containsItem(COINS)){ + player.inventory.remove(COINS) + player.setAttribute("bracelet-paid",true) + player.interfaceManager.close() + } else { + player.dialogueInterpreter.sendDialogue("You can not afford that.") + } + } + + fun sendModel(id: Int, player: Player){ + var appearanceIndex = when(id){ + SILVER_CLASPS -> 117 + GOLD_CLASPS -> 118 + SILVER_BANDS -> 119 + GOLD_BANDS -> 120 + SILVER_ARMGUARDS -> 123 + GOLD_ARMGUARDS -> 124 + SILVER_BANDING -> 121 + GOLD_BANDING -> 122 + SILVER_BANGLES -> 125 + GOLD_BANGLES -> 126 + SILVER_WRISTGUARDS -> if(player.isMale) 33 else 67 + GOLD_WRISTGUARDS -> if(player.isMale) 84 else 127 + NONE -> if(player.isMale) 34 else 68 + else -> 0 + } + if(!player.isMale && id != SILVER_WRISTGUARDS && id != GOLD_WRISTGUARDS && id != NONE){ + appearanceIndex += 42 //Female is almost always 42 higher than male, except for the above cases in the if + } + player.packetDispatch.sendModelOnInterface(id, REINALD_COMPONENT_ID, BRACELET_INTERFACE_CHILD_ID, 1) + player.packetDispatch.sendInterfaceConfig(REINALD_COMPONENT_ID, BRACELET_INTERFACE_CHILD_ID,id == 0) //hide/show bracelet model depending on if 0 or not + player.appearance.wrists.changeLook(appearanceIndex) + player.debug("USING WRIST APPEARANCE ID $appearanceIndex") + player.appearance.sync() + player.packetDispatch.sendPlayerOnInterface(REINALD_COMPONENT_ID,60) + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(REINALD_COMPONENT_ID,this) + return this + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/zone/neitiznot/MawnisBurowgarDialogue.java b/Server/src/main/java/Server/core/game/content/zone/neitiznot/MawnisBurowgarDialogue.java new file mode 100644 index 000000000..d341a0c1d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/neitiznot/MawnisBurowgarDialogue.java @@ -0,0 +1,105 @@ +package core.game.content.zone.neitiznot; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Handles the mawnis burowgar dialogue. + * @author Vexia + */ +public class MawnisBurowgarDialogue extends DialoguePlugin { + + /** + * The helmet of neitiznot. + */ + private static final Item HELM = new Item(10828); + + /** + * Constructs a new {@code MawnisBurowgarDialogue} {@code Object} + */ + public MawnisBurowgarDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MawnisBurowgarDialogue} {@code Object} + * @param player the player. + */ + public MawnisBurowgarDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MawnisBurowgarDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc("It makes me proud to know that the helm of my", "ancestors will be worn in battle."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("I thank you on behalf of all my kinsmen Talvald."); + stage++; + break; + case 1: + if (player.hasItem(HELM) || player.hasItem(new Item(10843))) { + end(); + break; + } + player("Ah yes, about that beautiful helmet."); + stage++; + break; + case 2: + npc("You mean the priceless heirloom that I have to you as", "a sign of my trust and gratitude?"); + stage++; + break; + case 3: + player("Err yes, that one. I may have mislaid it."); + stage++; + break; + case 4: + npc("It's a good job I have alert and loyal men who notice", "when something like this is left lying around and picks it", "up."); + stage++; + break; + case 5: + npc("I'm afraid I'm going to have to charge you a", "50,000GP handling cost."); + stage++; + break; + case 6: + if (!player.getInventory().contains(995, 50000)) { + player("I don't have that much money on me."); + stage++; + break; + } + if (player.getInventory().remove(new Item(995, 50000))) { + player.getInventory().add(HELM, player); + interpreter.sendItemMessage(HELM, "The Burgher hands you his crown."); + stage = 8; + } + break; + case 7: + npc("Well, come back when you do."); + stage++; + break; + case 8: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5504 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/neitiznot/NeitiznotZone.java b/Server/src/main/java/Server/core/game/content/zone/neitiznot/NeitiznotZone.java new file mode 100644 index 000000000..a21c2971d --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/neitiznot/NeitiznotZone.java @@ -0,0 +1,63 @@ +package core.game.content.zone.neitiznot; + +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the neitiznot zone. + * @author Vexia + */ +@Initializable +public class NeitiznotZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code NeitiznotZone} {@code Object} + */ + public NeitiznotZone() { + super("Neitiznot zone", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugins(new MawnisBurowgarDialogue(), new ThakkradYakDialogue(), new YakArmourPlugin(), new YakArmourPlugin()); + return this; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + Player player = e.asPlayer(); + switch (target.getId()) { + case 21301: + player.getBank().open(); + return true; + case 5506: + if (option.getName().equals("Craft-goods")) { + player.getDialogueInterpreter().open("thakkrad-yak"); + return true; + } + break; + } + } + return super.interact(e, target, option); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + registerRegion(9275); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/neitiznot/ThakkradYakDialogue.java b/Server/src/main/java/Server/core/game/content/zone/neitiznot/ThakkradYakDialogue.java new file mode 100644 index 000000000..09a556bd5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/neitiznot/ThakkradYakDialogue.java @@ -0,0 +1,144 @@ +package core.game.content.zone.neitiznot; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Handles the thakkrad yak dialogue. + * @author Vexia + */ +public class ThakkradYakDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ThakkradYakDialogue} {@code Object} + */ + public ThakkradYakDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ThakkradYakDialogue} {@code Object} + * @param player the player. + */ + public ThakkradYakDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ThakkradYakDialogue(player); + } + + @Override + public boolean open(Object... args) { + options("Cure my yak-hide, please.", "Nothing, thanks."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player("Cure my yak-hide, please."); + stage = 4; + break; + case 2: + player("Nothing, thanks."); + stage++; + break; + } + break; + case 1: + interpreter.sendDialogues(5506, null, "See you later."); + stage++; + break; + case 2: + interpreter.sendDialogues(5506, null, "You won't find anyone else who can cure yak-hide."); + stage++; + break; + case 3: + end(); + break; + case 4: + interpreter.sendDialogues(5506, null, "I will cure yak-hide for a fee of 5 gp per hide."); + stage++; + break; + case 5: + if (!player.getInventory().contains(10818, 1)) { + interpreter.sendDialogues(5506, null, "You have no yak-hide to cure."); + stage = 7; + break; + } + if (!player.getInventory().contains(995, 5)) { + interpreter.sendDialogues(5506, null, "You don't have enough gold to pay me!"); + stage = 7; + break; + } + options("Cure all my hides.", "Cure one hide.", "Cure no nide.", "Can you cure any other type of leather?"); + stage++; + break; + case 6: + switch (buttonId) { + case 1: + case 2: + cure(player, buttonId == 2 ? 1 : player.getInventory().getAmount(10818)); + stage = 8; + break; + case 3: + interpreter.sendDialogues(5506, null, "Bye!"); + stage = 7; + break; + case 4: + interpreter.sendDialogues(5506, null, "Other types of leather? Why would you need any other", "type of leather?"); + stage = 40; + break; + } + break; + case 7: + end(); + break; + case 40: + player("I'll take that as a no then."); + stage = 7; + break; + case 8: + end(); + break; + } + return true; + } + + /** + * Cures the yak hide. + * @param player the player. + * @param amount the amount. + * @return {@code True} if cured. + */ + private boolean cure(Player player, int amount) { + if (!player.getInventory().contains(995, 5 * amount)) { + interpreter.sendDialogues(5506, null, "You don't have enough gold to pay me!"); + return false; + } + if (player.getInventory().remove(new Item(995, 5 * amount))) { + for (int i = 0; i < amount; i++) { + if (player.getInventory().remove(new Item(10818))) { + player.getInventory().add(new Item(10820)); + } + } + } + player("There you go!"); + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("thakkrad-yak") }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/neitiznot/YakArmourPlugin.java b/Server/src/main/java/Server/core/game/content/zone/neitiznot/YakArmourPlugin.java new file mode 100644 index 000000000..5ad3169f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/neitiznot/YakArmourPlugin.java @@ -0,0 +1,148 @@ +package core.game.content.zone.neitiznot; + +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.armour.LeatherCrafting; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the crafting of yak armour. + * @author Vexia + */ +public class YakArmourPlugin extends UseWithHandler { + + /** + * The body item. + */ + private static final Item BODY = new Item(10822); + + /** + * The legs item. + */ + private static final Item LEGS = new Item(10824); + + /** + * Constructs a new {@code YakArmourPlugin} {@code Object} + */ + public YakArmourPlugin() { + super(1733); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(10820, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + SkillDialogueHandler dialogue = new SkillDialogueHandler(player, SkillDialogue.TWO_OPTION, LEGS, BODY) { + + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new YakArmourPulse(player, index == 1 ? BODY : LEGS, index, amount)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(event.getUsedItem()); + } + + }; + dialogue.open(); + return true; + } + + /** + * Handles the crafting of yak armour. + * @author Vexia + */ + public class YakArmourPulse extends SkillPulse { + + /** + * The index. + */ + private final int index; + + /** + * The ticks. + */ + private int ticks; + + /** + * The amount. + */ + private int amount; + + /** + * Constructs a new {@code YakArmourPulse} {@code Object} + * @param player the player. + * @param node the node. + * @param index the index. + */ + public YakArmourPulse(Player player, Item node, int index, int amount) { + super(player, node); + this.index = index; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + int level = (index == 1 ? 43 : 46); + if (player.getSkills().getLevel(Skills.CRAFTING) < level) { + player.getDialogueInterpreter().sendDialogue("You need a Crafting level of at least " + level + " in order to do this."); + return false; + } + if (!player.getInventory().contains(LeatherCrafting.NEEDLE, 1)) { + return false; + } + if (!player.getInventory().containsItem(LeatherCrafting.THREAD)) { + player.getDialogueInterpreter().sendDialogue("You need some thread to make anything out of leather."); + return false; + } + int reqAmount = index == 1 ? 1 : 2; + if (!player.getInventory().contains(10820, reqAmount)) { + player.getDialogueInterpreter().sendDialogue("You don't have the required amount of yak-hide in order to do this."); + return false; + } + player.getInterfaceManager().close(); + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(Animation.create(1249)); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + int reqAmount = index == 1 ? 1 : 2; + if (player.getInventory().remove(new Item(10820, reqAmount))) { + player.getInventory().add(node); + player.getSkills().addExperience(Skills.CRAFTING, 32, true); + LeatherCrafting.decayThread(player); + if (LeatherCrafting.isLastThread(player)) { + LeatherCrafting.removeThread(player); + } + player.sendMessage("You make " + node.getName().toLowerCase() + "."); + } + amount--; + return amount < 1; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/phasmatys/EctoplasmFillPlugin.java b/Server/src/main/java/Server/core/game/content/zone/phasmatys/EctoplasmFillPlugin.java new file mode 100644 index 000000000..df3641fe7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/phasmatys/EctoplasmFillPlugin.java @@ -0,0 +1,58 @@ +package core.game.content.zone.phasmatys; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the ectoplasm filling. + * @author Vexia + */ +public class EctoplasmFillPlugin extends UseWithHandler { + + /** + * The object ids of the slime. + */ + private static final int[] OBJECTS = new int[] { 5461, 17116, 17117, 17118, 17119 }; + + /** + * Constructs a new {@code EctoplasmFillPlugin} {@code Object}. + */ + public EctoplasmFillPlugin() { + super(1925); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : OBJECTS) { + addHandler(id, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.animate(Animation.create(4471)); + player.getPacketDispatch().sendMessage("You fill the bucket with ectoplasm."); + player.getPulseManager().run(new Pulse(3, player) { + @Override + public boolean pulse() { + if (player.getInventory().remove(new Item(1925, 1))) { + player.getInventory().add(new Item(4286)); + if (player.getInventory().contains(1925, 1)) { + player.animate(Animation.create(4471), 1); + return false; + } + } + return !player.getInventory().contains(1925, 1); + } + }); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostDiscipleDialogue.java b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostDiscipleDialogue.java new file mode 100644 index 000000000..a471e3fcc --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostDiscipleDialogue.java @@ -0,0 +1,189 @@ +package core.game.content.zone.phasmatys; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Handles the dialogue used for a ghost disciple. + * @author Vexia + */ +public final class GhostDiscipleDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GhostDiscipleDialogue} {@code Object}. + */ + public GhostDiscipleDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GhostDiscipleDialogue} {@code Object}. + * @param player the player. + */ + public GhostDiscipleDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GhostDiscipleDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if(args.length > 1){ + final int amount = player.getSavedData().getGlobalData().getEctoCharges() * 5; + final Item tokens = new Item(4278, amount); + if (!player.getInventory().hasSpaceFor(tokens)) { + player("Sorry, I don't have enough inventory space."); + return true; + } + if(amount > 0) { + player.getInventory().add(tokens); + player.getSavedData().getGlobalData().setEctoCharges(0); + npc("Certainly, mortal. Here's " + (amount) + " ectotokens."); + } else { + npc("I'm sorry, but you haven't earned any."); + } + stage = 81; + return true; + } + if (player.getSavedData().getGlobalData().getEctoCharges() > 0) { + player("Can I have the tokens I have earned?"); + stage = 80; + return true; + } + if (player.getLocation().getZ() > 0) { + if (args.length > 1) { + npc("What are you doing going in there?"); + stage = 70; + return true; + } + player("How do I use the bone grinder?"); + stage = 60; + return true; + } + player("What is this strange fountain?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("This is the Ectofuntus, the most marvellous creation of", "Necrovarus, our glorious leader."); + stage++; + break; + case 1: + options("What is the Ectofunuts?", "Where do I get ectoplasm from?", "How do I grind bones?", "How do I receive Ectotokens?", "Thanks for your time."); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + player("What is the Ectofunuts?"); + stage = 10; + break; + case 2: + player("Where do I get ectoplasm from?"); + stage = 20; + break; + case 3: + player("How do I grind bones?"); + stage = 30; + break; + case 4: + player("How do I receive Ectotokens?"); + stage = 40; + break; + case 5: + player("Thanks for your time."); + stage = 50; + break; + } + break; + case 10: + npc("It provides the power to keep us ghosts from passing", "over into the next plane of existence."); + stage++; + break; + case 11: + player("And how does it work?"); + stage++; + break; + case 12: + npc("You have to pour a bucket of ectoplasm into the", "fountain, a pot of ground bones, and then worship at", "the Ectofuntus. A unit of unholy power will then be", "created."); + stage = 1; + break; + case 20: + npc("Necrovarus sensed the power bubbling beneath our feet,", "and we delved long and deep beneath Port Phasmatys,", "until we found a pool of natural ectoplasm. You may", "find it by using the trapdoor over there."); + stage = 1; + break; + case 30: + npc("There is a bone grinding machine upstairs. Put bones", "of any type into the machine's hopper, and then turn", "the handle to grind them. You will need a pot to empty", "the machine of ground up bones."); + stage = 1; + break; + case 40: + npc("We disciples keep track of how many units of power", "have been produced. Just talk to us once you have", "generated some and we will reimburse you with the", "correct amount of Ectotokens."); + stage++; + break; + case 41: + player("How do I generate units of power?"); + stage++; + break; + case 42: + npc("You have to pour a bucket of ectoplasm into the", "fountain and then worship at the Ectofuntus with a pot", "of ground bones. This will create a unit of unholy", "power."); + stage = 1; + break; + case 50: + end(); + break; + case 60: + npc("Put bones of any type into the machine's hopper, and", "then turn the handle to grind them. You will need a pot", "to empty the machine of ground up bones."); + stage++; + break; + case 61: + end(); + break; + case 70: + player("Err, I was just curious..."); + stage++; + break; + case 71: + npc("Inside that room is a coffin, inside which lie the mortal", "remains of our most glorious master. Necrovarus.", "None may enter."); + stage++; + break; + case 72: + end(); + break; + case 80: { + final int amount = player.getSavedData().getGlobalData().getEctoCharges() * 5; + final Item tokens = new Item(4278, amount); + if (!player.getInventory().hasSpaceFor(tokens)) { + player("Sorry, I don't have enough inventory space."); + stage++; + break; + } + stage++; + player.getInventory().add(tokens); + player.getSavedData().getGlobalData().setEctoCharges(0); + npc("Certainly, mortal. Here's " + (amount) + " ectotokens."); + break; + } + case 81: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1686 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostInkeeperDialogue.java b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostInkeeperDialogue.java new file mode 100644 index 000000000..4adbbfe04 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostInkeeperDialogue.java @@ -0,0 +1,145 @@ +package core.game.content.zone.phasmatys; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the ghost inkeeper dialogue. + * @author Vexia + */ +public class GhostInkeeperDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GhostInkeeperDialogue} {@code Object}. + * @param player the player. + */ + public GhostInkeeperDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code GhostInkeeperDialogue} {@code Object}. + */ + public GhostInkeeperDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GhostInkeeperDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (PhasmatysZone.hasAmulet(player)) { + player("Hello there!"); + } else { + npc("Woooo wooo wooooo woooo"); + stage = 10; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Greetings, traveller. Welcome to 'The Green Ghost'", "Tavern. What can I do you for?"); + stage++; + break; + case 1: + options("Can I buy a beer?", "Can I hear some gossip?", "What happened to the folk of this town?", "Do you have any jobs I can do?", "Nothing, thanks."); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + player("Can I buy a beer?"); + stage = 3; + break; + case 2: + player("Can I hear some gossip?"); + stage = 20; + break; + case 3: + player("What happened to the folk of this town?"); + stage = 30; + break; + case 4: + player("Do you have any jobs I can do?"); + stage = 40; + break; + case 5: + player("Nothing, thanks."); + stage = 50; + break; + } + break; + case 3: + npc("Sorry, but our pumps dried up over half a century", "ago. We of this village do not have much of a thirst", "these days."); + stage++; + break; + case 4: + end(); + break; + case 20: + npc("I suppose, as long as you keep it to yourself..."); + stage++; + break; + case 21: + npc("You see Gravingas out there in the marketplace? He", "speaks for the silent majoirty of Port Phasmatys, for", "those of us who would prefer to pass over into the next", "world."); + stage++; + break; + case 22: + npc("But old Gravingas is far too obvious in his methods.", "Now Velorina, she's a ghost of a different colour", "altogether. If you feel like helping our cause at all, go", "speak to Velorina."); + stage++; + break; + case 23: + end(); + break; + case 30: + npc("That's a long story, my friend, but you look like you", "have the time..."); + stage++; + break; + case 31: + player("Nope, you are right. I am very busy!");// .. I dont want + // to do this + // dialogue. + stage++; + break; + case 32: + end(); + break; + case 40: + npc("Yes, actually, I do. We have a very famous Master", "Bowman named Robin staying with us at the moment.", "Could you take him some clean bed linen for me?"); + stage++; + break; + case 41: + npc("No, I didn't mean a job like that."); + stage++; + break; + case 42: + end(); + break; + case 50: + end(); + break; + case 10: + interpreter.sendDialogue("You cannot understand the ghost."); + stage++; + break; + case 11: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1700 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostSailorDialogue.java b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostSailorDialogue.java new file mode 100644 index 000000000..033c67148 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostSailorDialogue.java @@ -0,0 +1,83 @@ +package core.game.content.zone.phasmatys; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Represents the ghost sailor dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +public final class GhostSailorDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GhostSailorDialogue} {@code Object}. + */ + public GhostSailorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GhostSailorDialogue} {@code Object}. + * @param player the player. + */ + public GhostSailorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GhostSailorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (PhasmatysZone.hasAmulet(player)) { + player("Hi there. Why do you still bother having ships here? I", "mean - you're dead, what use are they to you?"); + stage = 10; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Woooo wooo wooooo woooo"); + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogue("You cannot understand the ghost."); + stage = 1; + break; + case 1: + end(); + break; + case 10: + npc("We keep ships because we still need trade in", "Phasmatys. Every trader that comes to Phastmatys is", "made to worship the Ectofuntus, so that the Ectopower", "doesn't run out."); + stage++; + break; + case 11: + player("So, without traders to worship in the Temple you're", "history right?"); + stage++; + break; + case 12: + npc("Aye, matey."); + stage++; + break; + case 13: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1703, 1704 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostVillagerDialogue.java b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostVillagerDialogue.java new file mode 100644 index 000000000..b8678aa16 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GhostVillagerDialogue.java @@ -0,0 +1,73 @@ +package core.game.content.zone.phasmatys; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; + +/** + * Handles the ghost villager dialogue. + * @author Vexia + */ +public final class GhostVillagerDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GhostVillagerDialogue} {@code Object}. + */ + public GhostVillagerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GhostVillagerDialogue} {@code Object}. + * @param player the player. + */ + public GhostVillagerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GhostVillagerDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (PhasmatysZone.hasAmulet(player)) { + final int random = RandomFunction.random(10); + switch (random) { + default: + npc("What do you want, mortal?"); + break; + } + } else { + npc("Woooo wooo wooooo woooo"); + stage = 10; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + case 10: + interpreter.sendDialogue("You cannot understand the ghost."); + stage++; + break; + case 11: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1697 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/phasmatys/GravingasNPC.java b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GravingasNPC.java new file mode 100644 index 000000000..f53738cea --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/phasmatys/GravingasNPC.java @@ -0,0 +1,134 @@ +package core.game.content.zone.phasmatys; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the gravingas npc. + * @author Vexia + */ +public final class GravingasNPC extends AbstractNPC { + + /** + * The force chats. + */ + private static final String[] CHATS = new String[] { "Down with Necrovaus!!", "Rise up my fellow ghosts, and we shall be victorious!", "Power to the Ghosts!!", "Rise together, Ghosts without a cause!!", "United we conquer - divided we fall!!", "We shall overcome!!", "Let Necrovarus know we want out!!", "Don't stay silent - victory in numbers!!" }; + + /** + * Constructs a new {@code GravingasNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public GravingasNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code GravingasNPC} {@code Object}. + */ + public GravingasNPC() { + super(0, null); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (RandomFunction.random(45) == 5) { + sendChat(CHATS[RandomFunction.random(CHATS.length)]); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new GravingasNPC(id, location); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new GravingasDialogue()); + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return new int[] { 1685 }; + } + + /** + * Handles the gravingas dialogue. + * @author Vexia + */ + public final class GravingasDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code GravingasDialogue} {@code Object}. + * @param player the player. + */ + public GravingasDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code GravingasDialogue} {@code Object}. + */ + public GravingasDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GravingasDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (PhasmatysZone.hasAmulet(player)) { + npc("Will you join with me and protect against the evil ban", "of Nercrovarus and his disciples?"); + stage = 0; + } else { + npc("Woooo wooo wooooo woooo"); + stage = 10; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("I'm sorry, I don't really think I should get involved."); + stage++; + break; + case 1: + npc("Ah, the youth of today - so apathetic to politics."); + stage++; + break; + case 2: + end(); + break; + case 10: + interpreter.sendDialogue("You cannot understand the ghost."); + stage = 11; + break; + case 11: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return GravingasNPC.this.getIds(); + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/phasmatys/NecrovarusDialogue.java b/Server/src/main/java/Server/core/game/content/zone/phasmatys/NecrovarusDialogue.java new file mode 100644 index 000000000..ad1dd2324 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/phasmatys/NecrovarusDialogue.java @@ -0,0 +1,89 @@ +package core.game.content.zone.phasmatys; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the dialogue used for necrovarus. + * @author Vexia + */ +public final class NecrovarusDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code NecrovarusDialogue} {@code Object}. + */ + public NecrovarusDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code NecrovarusDialogue} {@code Object}. + * @param player the player. + */ + public NecrovarusDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new NecrovarusDialogue(player); + } + + @Override + public boolean open(Object... args) { + options("What is this place?", "What happened to everyone here?", "How do I get into the town?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player("What is this place?"); + stage = 10; + break; + case 2: + player("What happened to everyone here?"); + stage = 20; + break; + case 3: + player("How do I get into the town?"); + stage = 30; + break; + } + break; + case 10: + npc("Speak to me again and I will rend the soul from your", "flesh."); + stage++; + break; + case 11: + end(); + break; + case 20: + npc("You dare to speak to me??? Have you lost your", "wits????"); + stage++; + break; + case 21: + end(); + break; + case 30: + npc("I do not answer questions, mortal fool!"); + stage++; + break; + case 31: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1684 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/phasmatys/PhasmatysZone.java b/Server/src/main/java/Server/core/game/content/zone/phasmatys/PhasmatysZone.java new file mode 100644 index 000000000..c3e4164e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/phasmatys/PhasmatysZone.java @@ -0,0 +1,440 @@ +package core.game.content.zone.phasmatys; + +import core.game.content.global.Bones; +import core.game.content.global.action.ClimbActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.Option; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +import static java.lang.Thread.sleep; + +/** + * Handles the phasmatyz zone area. + * + * @author Vexia + */ +@Initializable +public final class PhasmatysZone extends MapZone implements Plugin { + int b; + Bones[] bones; + Player player; + Bones bone; + boolean notFirst; + + + /** + * Constructs a new {@code PhasmatysZone} {@code Object}. + */ + public PhasmatysZone() { + super("Port phasmatys", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugin(new GravingasNPC()); + PluginManager.definePlugin(new BoneLoaderHandler()); + PluginManager.definePlugin(new NecrovarusDialogue()); + PluginManager.definePlugin(new GhostSailorDialogue()); + PluginManager.definePlugin(new EctoplasmFillPlugin()); + PluginManager.definePlugin(new GhostDiscipleDialogue()); + PluginManager.definePlugin(new GhostVillagerDialogue()); + PluginManager.definePlugin(new GhostInkeeperDialogue()); + return this; + } + + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e.isPlayer()) { + player = e.asPlayer(); + if (target instanceof NPC) { + NPC npc = (NPC) target; + if ((npc.getName().toLowerCase().contains("ghost") || npc.getName().equalsIgnoreCase("velorina") || npc.getName().contains("husband")) && !hasAmulet(player)) { + player.getDialogueInterpreter().open("ghosty dialogue", target); + return true; + } + } + switch (target.getId()) { + case 5259: + handleEnergyBarrier(player, (GameObject) target); + return true; + case 5267: + player.animate(Animation.create(536)); + player.getPacketDispatch().sendMessage("The trapdoor opens..."); + ObjectBuilder.replace((GameObject) target, ((GameObject) target).transform(5268)); + return true; + case 5268: + if (option.getName().equals("Close")) { + player.animate(Animation.create(535)); + player.getPacketDispatch().sendMessage("You close the trapdoor."); + ObjectBuilder.replace((GameObject) target, ((GameObject) target).transform(5267)); + } else { + player.getPacketDispatch().sendMessage("You climb down through the trapdoor..."); + player.getProperties().setTeleportLocation(Location.create(3669, 9888, 3)); + } + return true; + case 7434: // Trapdoors in bar + if (option.getName().equalsIgnoreCase("open")) { + ObjectBuilder.replace(target.asObject(), target.asObject().transform(7435)); + } + break; + case 7435: // open trapdoor in bar + if (option.getName().equalsIgnoreCase("close")) { + ObjectBuilder.replace(target.asObject(), target.asObject().transform(7434)); + } + break; + case 9308: + if (player.getSkills().getStaticLevel(Skills.AGILITY) < 58) { + player.sendMessage("You need an agility level of at least 58 to climb down this wall."); + return true; + } + player.getProperties().setTeleportLocation(Location.create(3671, 9888, 2)); + return true; + case 9307: + if (player.getSkills().getStaticLevel(Skills.AGILITY) < 58) { + player.sendMessage("You need an agility level of at least 58 to climb up this wall."); + return true; + } + player.getProperties().setTeleportLocation(Location.create(3670, 9888, 3)); + return true; + case 5264: + ClimbActionHandler.climb(player, Animation.create(828), Location.create(3654, 3519, 0)); + return true; + /*case 5244: + player.getDialogueInterpreter().open(1686, null, true); + return true;*/ + case 11162: + case 11163: + case 11164: + GameObject obj = (GameObject) target; + switch (option.getName().toLowerCase()) { + case "fill": + player.getPulseManager().run(fillPulse); + return true; + case "wind": + wind(player, obj); + return true; + case "empty": + empty(player, obj); + return true; + case "status": + checkStatus(player, obj); + return true; + } + case 5282: + worship(player); + return true; + } + } + return super.interact(e, target, option); + } + + public Pulse emptyPulse = new Pulse(5) { + //the bin + GameObject emptyobj = new GameObject(11164, 3658, 3525, 1); + + @Override + public boolean pulse() { + //player.getProperties().setTeleportLocation(new Location(3658,3524,1)); + player.faceLocation(new Location(3658, 3525, 1)); + empty(player, emptyobj); + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(3660, 3524, true); + player.setAttribute("bgfirst?", false); + player.getPulseManager().run(fillPulse); + return true; + } + }; + public Pulse windPulse = new Pulse(5) { + //the crank + GameObject windobj = new GameObject(11163, 3659, 3525, 1); + + @Override + public boolean pulse() { + //player.getProperties().setTeleportLocation(new Location(3659,3524,1)); + player.faceLocation(new Location(3659, 3525, 1)); + wind(player, windobj); + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(3658, 3524, true); + player.getPulseManager().run(emptyPulse); + return true; + } + }; + public Pulse fillPulse = new Pulse(5) { + //the hopper + @Override + public boolean pulse() { + if (hasBoneInInventory(player)) { + bone = getBone(player); + } else { + player.debug("No bones in inventory, or bones not in bones array."); + player.setAttribute("bgfirst?", true); + return true; + } + + player.faceLocation(new Location(3660, 3525, 1)); + if (player.getInventory().remove(new Item(bone.getItemId()))) { + player.getLocks().lockInteractions(2); + player.debug("Using bone " + bone.getItemId() + " on grinder.. bone info:" + b); + player.animate(Animation.create(1649)); + player.getConfigManager().set(408, bone.getConfigValue(true), true); + player.sendMessage("You put some bones in the grinder's hopper.", 1); + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(3659, 3524, true); + player.getPulseManager().run(windPulse); + } + return true; + } + }; + + /** + * Checks if the player has the amulet equipped. + * + * @param player the player. + * @return {@code True} if so. + */ + public static boolean hasAmulet(Player player) { + return player.getEquipment().contains(552, 1); + } + + /** + * Checks the status of a grinder. + * + * @param player the player. + * @param object the object. + */ + private void checkStatus(Player player, GameObject object) { + String status = "The grinder is empty."; + if (hasBones(player, object, true)) { + status = "There are some bones in the hopper."; + } else if (hasBones(player, object, false)) { + status = "There are some crushed bones in the bin."; + } + player.sendMessage(status); + } + + /** + * Emptys the grinder. + * + * @param player the player. + * @param object the object. + */ + private void empty(Player player, GameObject object) { + if (hasBones(player, object, true)) { + player.sendMessage("You need to wind the handle to grind the bones."); + return; + } + if (!hasBones(player, object, false)) { + player.sendMessage("The grinder is already empty."); + return; + } + if (!player.getInventory().contains(1931, 1)) { + player.sendMessage("You need an empty pot to put the crushed bones into."); + return; + } + final Bones bone = Bones.forConfigValue(player.getConfigManager().get(408), false); + player.getLocks().lockInteractions(2); + player.animate(Animation.create(1650)); + player.getConfigManager().set(408, 0, true); + player.sendMessage("You fill a pot with crushed bones."); + player.getInventory().replace(bone.getBoneMeal(), player.getInventory().getSlot(new Item(1931))); + } + + /** + * Windws the grinder. + * + * @param player the player. + * @param object the object. + */ + private void wind(Player player, GameObject object) { + final Bones bone = Bones.forConfigValue(player.getConfigManager().get(408), true); + player.getLocks().lockInteractions(3); + player.animate(Animation.create(1648)); + player.sendMessage("You wind the grinder handle."); + if (hasBones(player, object, true)) { + player.getConfigManager().set(408, bone.getConfigValue(false), true); + player.sendMessage("Some crushed bones pour into the bin.", 3); + } + } + + /** + * Checks if bones are in the hopper. + * + * @param player the player. + * @param inHopper in the hopper or in the bin. + * @param object the object. + * @return {@code True} if so. + */ + public static boolean hasBones(Player player, GameObject object, boolean inHopper) { + int value = player.getConfigManager().get(408); + for (Bones bone : Bones.values()) { + if (bone.getConfigValue(inHopper) == value) { + return true; + } + } + return false; + } + + public static boolean hasBoneInInventory(Player player) { + Bones[] bones = Bones.values(); + for (int c = 0; c < bones.length; c++) { + Bones bone = bones[c]; + int boneId = bone.getItemId(); + if (player.getInventory().containsItem(new Item(boneId))) { + return true; + } + } + return false; + } + + public static Bones getBone(Player player) { + Bones[] bones = Bones.values(); + for (int b = 0; b < bones.length; b++) { + Bones bone = bones[b]; + int boneId = bone.getItemId(); + if (player.getInventory().containsItem(new Item(boneId))) { + return bone; + } + } + return null; + } + + /** + * Worships the ectofuntus. + * + * @param player the player. + */ + private void worship(Player player) { + Bones bone = null; + for (Item i : player.getInventory().toArray()) { + if (i == null) { + continue; + } + Bones b = Bones.forBoneMeal(i.getId()); + if (b != null) { + bone = b; + break; + } + } + if (!player.getInventory().contains(4286, 1) && bone == null) { + player.getDialogueInterpreter().sendDialogue("You don't have any ectoplasm or crushed bones to put into the", "Ectofuntus."); + return; + } + if (bone == null) { + player.getDialogueInterpreter().sendDialogue("You need a pot of crushed bones to put into the Ectofuntus."); + return; + } + if (!player.getInventory().contains(4286, 1)) { + player.getDialogueInterpreter().sendDialogue("You need ectoplasm to put into the Ectofuntus."); + return; + } + if (player.getInventory().remove(bone.getBoneMeal(), new Item(4286, 1))) { + player.lock(1); + player.animate(Animation.create(1651)); + player.getInventory().add(new Item(1925), new Item(1931)); + player.getSkills().addExperience(Skills.PRAYER, bone.getExperience() * 4, true); + player.sendMessage("You put some ectoplasm and bonemeal into the Ectofuntus, and worship it."); + player.getSavedData().getGlobalData().setEctoCharges(player.getSavedData().getGlobalData().getEctoCharges() + 1); + } + } + + /** + * Handles the passing of the energy barrier. + * + * @param player the player. + * @param object the object. + */ + private void handleEnergyBarrier(Player player, GameObject object) { + boolean force = object.getLocation().equals(3659, 3508, 0) && player.getLocation().getY() < 3508 || object.getLocation().equals(3652, 3485, 0) && player.getLocation().getX() > 3652; + if (!force && !player.getInventory().contains(4278, 2)) { + player.getDialogueInterpreter().open(1706); + return; + } + if (force || player.getInventory().remove(new Item(4278, 2))) { + final Direction direction = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + Location end = player.getLocation().transform(direction, 2); + if (player.getLocation().getY() >= 3508) { + end = object.getLocation().transform(0, -2, 0); + } + if (object.getLocation().equals(new Location(3652, 3485, 0))) { + end = object.getLocation().transform(player.getLocation().getX() >= 3653 ? -1 : 2, 0, 0); + } + AgilityHandler.walk(player, -1, player.getLocation(), end, null, 0.0, null); + } + } + + /** + * Handles the bone loader. + * + * @author Vexia + */ + public static final class BoneLoaderHandler extends UseWithHandler { + + /** + * Constructs a new {@code BoneLoaderHandler} {@code Object}. + */ + public BoneLoaderHandler() { + super(Bones.getArray()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(11162, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final GameObject object = (GameObject) event.getUsedWith(); + final Bones bone = Bones.forId(event.getUsedItem().getId()); + if (hasBones(player, object, true)) { + player.sendMessage("There are already some bones in the grinder's hopper."); + return true; + } else if (hasBones(player, object, false)) { + player.sendMessage("You need to empty the grinder's bin before you put more bones in it."); + return true; + } + if (player.getInventory().remove(event.getUsedItem())) { + player.lock(2); + player.animate(Animation.create(1649)); + player.getConfigManager().set(408, bone.getConfigValue(true), true); + player.sendMessage("You put some bones in the grinder's hopper.", 1); + } + return true; + } + + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(3583, 3456, 3701, 3552)); + register(new ZoneBorders(3667, 9873, 3699, 9914)); + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/phasmatys/TokenCollectOption.java b/Server/src/main/java/Server/core/game/content/zone/phasmatys/TokenCollectOption.java new file mode 100644 index 000000000..497f65a2f --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/phasmatys/TokenCollectOption.java @@ -0,0 +1,27 @@ +package core.game.content.zone.phasmatys; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class TokenCollectOption extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + if(option.equals("collect")){ + player.getDialogueInterpreter().open(1686,new NPC(1686),true); + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(1686).getHandlers().put("option:collect",this); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/rellekka/JarvaldDialogue.java b/Server/src/main/java/Server/core/game/content/zone/rellekka/JarvaldDialogue.java new file mode 100644 index 000000000..e50ac39e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/rellekka/JarvaldDialogue.java @@ -0,0 +1,246 @@ +package core.game.content.zone.rellekka; + +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; + +/** + * Handles the jarvald dialogue. + * @author Vexia + */ +public final class JarvaldDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code JarvaldDialogue} {@code Object}. + */ + public JarvaldDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code JarvaldDialogue} {@code Object}. + * @param player the player. + */ + public JarvaldDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JarvaldDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length > 1) { + handleTravelStage(); + return true; + } + if (npc.getId() == 2438) { + npc("Ah, you live yet, outerlander!"); + stage = 37; + return true; + } + npc("What do you want from me outerlander?", "It is our policy not to associate with those not of our", "tribe."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Where is your chieftain?", "What Jarvald is doing.", "Nothing"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Where is your chieftain?", "I find it highly discriminatory to refuse to talk to", "someone on the grounds that they are not part of your", "tribe."); + stage = 10; + break; + case 2: + player("So what are you doing here?"); + stage = 20; + break; + case 3: + end(); + break; + } + break; + case 10: + npc("I don't rightly understand your speech outerlander, but", "my loyality is with Chieftain Brundt."); + stage++; + break; + case 11: + npc("He resides in our longhall; it is the large building over", "there, you should speak to him for he speaks for us all."); + stage++; + break; + case 12: + end(); + break; + case 20: + handleTravelStage(); + break; + case 21: + player("Hey, scary barbarian type guy, think I can join you on", "this expedition?"); + stage++; + break; + case 22: + npc("An outerlander join us on a honoured hunt???"); + stage++; + break; + case 23: + npc("Well.....", "I gues...", "I might be able to allow you to join us, although it is a", "breach of many of our customs..."); + stage++; + break; + case 24: + player("Oh, pleeeeeeease?", "I really LOVE killing stuff!"); + stage++; + break; + case 25: + npc("Well...", "I remain unconvinced that it would be wise to allow an", "outerlander to join us in such dangerous battle, but", "your ethusiasm seems genuine enough..."); + stage++; + break; + case 26: + npc("I will allow you to escort us, but you must pay me a", "sum of money first."); + stage++; + break; + case 27: + player("What?", "That's outrageous, why charge me money?", "And, uh, how much does it cost me?"); + stage++; + break; + case 28: + npc("Ah, the outerlander have stolen from my people for", "many years, in this way you can help my community", "with a small amount of money..."); + stage++; + break; + case 29: + npc("Let us say...", "1000 coins.", "Payable in advance, of course."); + stage++; + break; + case 30: + npc("For this I will take you to Waterbirth Island on my", "boat, and will bring you back here when you have had", "your fill of the hunt.", "Assuming you are still alive to wish to leave, of course."); + stage++; + break; + case 31: + player.getConfigManager().set(520, 1 << 13, true); + end(); + break; + case 32: + options("YES", "NO"); + stage++; + break; + case 33: + switch (buttonId) { + case 1: + if (!player.getInventory().contains(995, 1000)) { + player("Sorry, I don't have enough coins."); + stage = 35; + break; + } + if (player.getInventory().remove(new Item(995, 1000))) { + sail(player, true); + } + end(); + break; + case 2: + player("No, actually I have some stuff to do here first."); + stage = 34; + break; + } + break; + case 34: + npc("As you wish.", "Come and see me when your bloodlust needs sating."); + stage++; + break; + case 35: + end(); + break; + case 36: + switch (buttonId) { + case 1: + npc("Then let us away;", "There will be death to bring here another day!"); + stage = 39; + break; + case 2: + end(); + break; + } + break; + case 37: + npc("Have you had your fill of the hunt and wish to return,", "or are you still feeling the joy of the cull?"); + stage++; + break; + case 38: + interpreter.sendOptions("Leave island?", "YES", "NO"); + stage = 36; + break; + case 39: + end(); + sail(player, false); + break; + } + return true; + } + + /** + * Sails the player to and from waterbirth. + * @param player the player. + */ + public void sail(final Player player, final boolean to) { + player.lock(); + player.getInterfaceManager().open(new Component(224)); + player.addExtension(LogoutTask.class, new LocationLogoutTask(5, to ? Location.create(2544, 3759, 0) : Location.create(2620, 3685, 0))); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 5: + player.unlock(); + player.getInterfaceManager().close(); + player.getProperties().setTeleportLocation(to ? Location.create(2544, 3759, 0) : Location.create(2620, 3685, 0)); + player.getDialogueInterpreter().close(); + player.getDialogueInterpreter().sendDialogue("The ship arrives at " + (to ? "Waterbirth Island" : "Rellekka") + "."); + return true; + } + return false; + } + + }); + } + + /** + * Handles the travel stage. + */ + private void handleTravelStage() { + if (npc.getId() == 2438) { + interpreter.sendOptions("Leave island?", "YES", "NO"); + stage = 36; + return; + } + if (player.getConfigManager().get(520) == 0) { + npc("This should not concern you, outerlander.", "I am awaiting other Fremenniks to join me on an", "expedition to Waterbirth Island."); + stage = 21; + } else { + npc("So do you have the 1000 coins for my service, and are", "you ready to leave?"); + stage = 32; + } + } + + @Override + public int[] getIds() { + return new int[] { 2435, 2436, 2437, 2438 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/rellekka/LightHousePlugin.java b/Server/src/main/java/Server/core/game/content/zone/rellekka/LightHousePlugin.java new file mode 100644 index 000000000..56317ca56 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/rellekka/LightHousePlugin.java @@ -0,0 +1,46 @@ +package core.game.content.zone.rellekka; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the light house plugin. + * @author Vexia + */ +@Initializable +public class LightHousePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(4577).getHandlers().put("option:walk-through", this); + ObjectDefinition.forId(4383).getHandlers().put("option:climb", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 4577: + DoorActionHandler.handleDoor(player, node.asObject()); + return true; + case 4383: + return false; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n.getName().equals("Door")) { + return DoorActionHandler.getDestination((Entity) node, n.asObject()); + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/rellekka/MariaGunnarsDialogue.java b/Server/src/main/java/Server/core/game/content/zone/rellekka/MariaGunnarsDialogue.java new file mode 100644 index 000000000..c64867e42 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/rellekka/MariaGunnarsDialogue.java @@ -0,0 +1,92 @@ +package core.game.content.zone.rellekka; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Handles the maria gunnars dialogue. + * @author Vexia + */ +public class MariaGunnarsDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MariaGunnarsDialogue} {@code Object} + */ + public MariaGunnarsDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MariaGunnarsDialogue} {@code Object} + * @param player the player. + */ + public MariaGunnarsDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MariaGunnarsDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Welcome, Talvald. Do you have any questions?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Can you ferry me to " + (npc.getId() == 5508 ? "Neitiznot?" : "Relleka") + "?", "I just stopped to say 'hello'."); + stage++; + break; + case 1: + if (buttonId == 1) { + player("Can you ferry me to " + (npc.getId() == 5508 ? "Neitiznot?" : "Relleka") + "?"); + stage++; + } else { + player("I just stopped to say 'hello'."); + stage = 4; + } + break; + case 2: + npc("Let's set sail then."); + stage++; + break; + case 3: + if (npc.getId() == 5508) { + RellekkaZone.sail(player, "Relleka", new Location(2310, 3782, 0)); + } else { + RellekkaZone.sail(player, "Neitiznot", new Location(2644, 3710, 0)); + } + end(); + break; + case 4: + npc("Thanks!"); + stage++; + break; + case 5: + player("I may be back later."); + stage++; + break; + case 6: + end(); + npc.sendChat("Bye"); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5508, 5507 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/rellekka/RellekkaZone.java b/Server/src/main/java/Server/core/game/content/zone/rellekka/RellekkaZone.java new file mode 100644 index 000000000..be2dc7835 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/rellekka/RellekkaZone.java @@ -0,0 +1,220 @@ +package core.game.content.zone.rellekka; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the rellekka zone. + * @author Vexia + */ +@Initializable +public final class RellekkaZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code RellekkaZone} {@code Object}. + */ + public RellekkaZone() { + super("rellekka", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugin(new SailorDialogue()); + PluginManager.definePlugin(new JarvaldDialogue()); + PluginManager.definePlugins(new RellekaOptionHandler(), new MariaGunnarsDialogue()); + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(5507).getHandlers().put("option:ferry-rellekka", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + sail(player, "Relleka", new Location(2644, 3710, 0)); + return true; + } + + }); + return this; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + final Player player = (Player) e; + switch (target.getId()) { + case 4306: + case 4310: + case 4309: + case 4304: + case 4308: + player.sendMessage("Only Fremenniks may use this " + target.getName().toLowerCase() + "."); + return true; + /* + * case 1301: player.sendMessage("Only Fremenniks may " + + * (option.equals("Trade") ? "buy clothes here" : + * "change their shoes here") + "."); return true; + */ + case 4165: + player.getDialogueInterpreter().open(1288); + return true; + case 4166: + player.sendMessage("This door is locked tightly shut."); + return true; + case 1288: + player.getDialogueInterpreter().sendDialogues((NPC) target, null, "I have no interest in talking to you just now", "outerlander."); + return true; + case 34286: + player.getDialogueInterpreter().sendDialogues(1289, null, "Outerlander... do not test my patience. I do not take", "kindly to people wandering in here and acting as though", "they own the place."); + return true; + case 4148: + player.getDialogueInterpreter().sendDialogues(1278, null, "Hey, outerlander. You can't go through there. Talent", "only, backstage."); + return true; + case 100: + player.getDialogueInterpreter().sendDialogue("You try to open the trapdoor but it won't budge! It looks like the", "trapdoor can only be opened from the other side."); + return true; + case 2435: + case 2436: + case 2437: + case 2438: + if (option.getName().equals("Travel")) { + player.getDialogueInterpreter().open(target.getId(), target, true); + return true; + } + break; + case 5508: + if (option.getName().equals("Ferry-Neitiznot")) { + sail(player, "Neitiznot", new Location(2310, 3782, 0)); + } + return true; + } + } + return super.interact(e, target, option); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(2602, 3639, 2739, 3741)); + } + + /** + * Sails a player using the relleka ships. + * @param player the player. + * @param name the name. + * @param destination the destination. + */ + public static void sail(final Player player, final String name, final Location destination) { + player.lock(); + player.getInterfaceManager().open(new Component(224)); + player.addExtension(LogoutTask.class, new LocationLogoutTask(5, destination)); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 5: + player.unlock(); + player.getInterfaceManager().close(); + player.getProperties().setTeleportLocation(destination); + player.getDialogueInterpreter().sendDialogue("The ship arrives at " + name + "."); + return true; + } + return false; + } + + }); + } + + /** + * Handles options related to relleka. + * @author Vexia + */ + public static final class RellekaOptionHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(4616).getHandlers().put("option:cross", this); + ObjectDefinition.forId(4615).getHandlers().put("option:cross", this); + ObjectDefinition.forId(5847).getHandlers().put("option:climb-over", this); + ObjectDefinition.forId(5008).getHandlers().put("option:enter",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "cross": + switch (node.getId()) { + case 4616: + case 4615: + crossRellekaBridge(player, (GameObject) node); + break; + } + break; + case "climb-over": + switch (node.getId()) { + case 5847: + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(0, player.getLocation().getY() <= 3657 ? 3 : -3, 0), Animation.create(840), 20, 1, null, 0); + break; + } + break; + case "enter": + switch(node.getId()){ + case 5008: + player.getProperties().setTeleportLocation(Location.create(2773, 10162, 0)); + break; + } + break; + } + return true; + } + + /** + * Crosses the relleka bridge. + * @param player the player. + * @param node the node. + */ + private void crossRellekaBridge(Player player, GameObject node) { + boolean east = node.getId() == 4616; + player.lock(2); + if (player.getLocation().equals(node.getLocation())) { + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(east ? -2 : 2, 0, 0), Animation.create(1115), 20, 1.0, null, 1); + return; + } + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(east ? -1 : 1, 0, 0), ForceMovement.WALK_ANIMATION, 10, 0.0, null); + AgilityHandler.forceWalk(player, -1, player.getLocation().transform(east ? -1 : 1, 0, 0), player.getLocation().transform(east ? -3 : 3, 0, 0), Animation.create(1115), 20, 1.0, null, 1); + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/rellekka/SailorDialogue.java b/Server/src/main/java/Server/core/game/content/zone/rellekka/SailorDialogue.java new file mode 100644 index 000000000..ab9210a08 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/rellekka/SailorDialogue.java @@ -0,0 +1,73 @@ +package core.game.content.zone.rellekka; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Handles the sailor dialogue. + * @author Vexia + */ +public final class SailorDialogue extends DialoguePlugin { + + /** + * If its the relleka npc. + */ + private boolean rellekaNpc; + + /** + * Constructs a new {@Code SailorDialogue} {@Code Object} + */ + public SailorDialogue() { + + } + + /** + * Constructs a new {@Code SailorDialogue} {@Code Object} + * @param player the player. + */ + public SailorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SailorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + rellekaNpc = npc.getId() == 1385; + player("Hello. Can I get a ride on your ship?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Hello again, brother " + player.getUsername() + ". If you're ready to jump", "aboard, we're all ready to set sail with the tide!"); + stage++; + break; + case 1: + player("Let's go!"); + stage++; + break; + case 2: + end(); + player.lock(); + player.sendMessage("You board the longship..."); + RellekkaZone.sail(player, rellekaNpc ? "Miscellania" : "Rellekka", rellekaNpc ? Location.create(2581, 3845, 0) : Location.create(2629, 3693, 0)); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1304 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/wbisland/DagannothKingNPC.java b/Server/src/main/java/Server/core/game/content/zone/wbisland/DagannothKingNPC.java new file mode 100644 index 000000000..36dabfe40 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/wbisland/DagannothKingNPC.java @@ -0,0 +1,217 @@ +package core.game.content.zone.wbisland; + +import java.util.List; + +import core.game.content.global.BossKillCounter; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.tools.RandomFunction; + +/** + * Represents a dagannoth king npc. + * @author Vexia + */ +public final class DagannothKingNPC extends AbstractNPC { + + /** + * The type of dag. + */ + private DagType type; + + /** + * Constructs a new {@Code DagannothKingNPC} {@Code Object} + */ + public DagannothKingNPC() { + super(-1, null); + } + + /** + * Constructs a new {@Code DagannothKingNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public DagannothKingNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + type = DagType.forId(getId()); + super.init(); + } + + @Override + public void checkImpact(BattleState state) { + CombatStyle style = state.getStyle(); + if (style == null) { + style = state.getAttacker().getProperties().getCombatPulse().getStyle(); + } + if (type.isImmune(style)) { + state.neutralizeHits(); + } + } + + @Override + public double getLevelMod(Entity entity, Entity victim) { + if (type == DagType.PRIME) { + return 3.5; + } + return 0.0; + } + + @Override + public void sendImpact(BattleState state) { + if (state.getEstimatedHit() > type.getMaxHit()) { + state.setEstimatedHit(RandomFunction.random(type.getMaxHit() - 5, type.getMaxHit())); + } + if (type != DagType.REX && RandomFunction.random(5) <= 2) { + List players = RegionManager.getLocalPlayers(this, 9); + if (players.size() <= 1) { + return; + } + Player newP = players.get(RandomFunction.random(players.size())); + if (newP != null) { + getProperties().getCombatPulse().stop(); + getAggressiveHandler().setPauseTicks(2); + attack(newP); + } + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DagannothKingNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 2881, 2882, 2883 }; + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (getId() == 2881 || getId() == 2882 || getId() == 2883) { + BossKillCounter.addtoKillcount((Player) killer, this.getId()); + } + } + + /** + * ß A king type. + * @author Vexia + */ + public enum DagType { + SUPREME(2881, CombatStyle.RANGE, CombatStyle.MELEE, CombatStyle.MAGIC, 30), PRIME(2882, CombatStyle.MAGIC, CombatStyle.RANGE, CombatStyle.MELEE, 61), REX(2883, CombatStyle.MELEE, CombatStyle.MAGIC, CombatStyle.RANGE, 28); + + /** + * The npc id. + */ + private final int id; + + /** + * The combat style. + */ + private final CombatStyle style; + + /** + * The style he is weak to. + */ + private final CombatStyle weakStyle; + + /** + * The style he is immunned to. + */ + private final CombatStyle immuneStyle; + + /** + * The max hit. + */ + private final int maxHit; + + /** + * Constructs a new {@Code DagType} {@Code Object} + * @param id the id. + * @param style the style. + * @param weakStyle the weak style. + * @parmam immuneStyle the style. + * @param maxHit the max hit. + */ + private DagType(int id, CombatStyle style, CombatStyle weakStyle, CombatStyle immuneStyle, int maxHit) { + this.id = id; + this.style = style; + this.weakStyle = weakStyle; + this.immuneStyle = immuneStyle; + this.maxHit = maxHit; + } + + /** + * Gets the maxHit. + * @return the maxHit + */ + public int getMaxHit() { + return maxHit; + } + + /** + * Gets a dag type. + * @param id the id. + * @return the type. + */ + public static DagType forId(int id) { + for (DagType type : values()) { + if (type.getId() == id) { + return type; + } + } + return null; + } + + /** + * Checks if the dag is immune to a style. + * @param style the style. + * @return {@code True} if so. + */ + public boolean isImmune(CombatStyle style) { + return style == immuneStyle || style == this.style; + } + + /** + * Gets the id. + * @return the id + */ + public int getId() { + return id; + } + + /** + * Gets the style. + * @return the style + */ + public CombatStyle getStyle() { + return style; + } + + /** + * Gets the immuneStyle. + * @return the immuneStyle + */ + public CombatStyle getImmuneStyle() { + return immuneStyle; + } + + /** + * Gets the weakStyle. + * @return the weakStyle + */ + public CombatStyle getWeakStyle() { + return weakStyle; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/wbisland/SpinolypNPC.java b/Server/src/main/java/Server/core/game/content/zone/wbisland/SpinolypNPC.java new file mode 100644 index 000000000..81f871162 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/wbisland/SpinolypNPC.java @@ -0,0 +1,158 @@ +package core.game.content.zone.wbisland; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.state.EntityState; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Represents a spinolyp npc. + * @author Vexia + */ +public final class SpinolypNPC extends AbstractNPC { + + /** + * The swing handler. + */ + private static final CombatSwingHandler SWING_HANDLER = new SpinolpySwingHandler(); + + /** + * Constructs a new {@Code SpinolypNPC} {@Code Object} + */ + public SpinolypNPC() { + this(-1, null); + } + + /** + * Constructs a new {@Code SpinolypNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public SpinolypNPC(int id, Location location) { + super(id, location); + super.setAggressive(true); + super.setNeverWalks(true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SpinolypNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return SWING_HANDLER; + } + + @Override + public void init() { + super.init(); + super.getLocks().lockMovement(Integer.MAX_VALUE); + setSpell(); + } + + /** + * Sets the spell. + */ + public void setSpell() { + CombatSpell spell = (CombatSpell) SpellBook.MODERN.getSpell(14); + getProperties().setSpell(spell); + getProperties().setAutocastSpell(spell); + } + + @Override + public void sendImpact(BattleState state) { + if (state.getEstimatedHit() == 0 && RandomFunction.random(15) < 2) { + state.setEstimatedHit(RandomFunction.random(1, 11)); + } + if (state.getEstimatedHit() > 11) { + state.setEstimatedHit(RandomFunction.random(3, 9)); + } + } + + @Override + public int[] getIds() { + return new int[] { 2894, 2896 }; + } + + /** + * Handles the spinolpys swings. + * @author Vexia + */ + public static final class SpinolpySwingHandler extends MultiSwingHandler { + + /** + * Constructs a new {@Code SpinolpySwingHandler} {@Code + * Object} + */ + public SpinolpySwingHandler() { + super(new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), null), new SwitchAttack(CombatStyle.RANGE.getSwingHandler(), null)); + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + InteractionType type = super.canSwing(entity, victim); + if (type == InteractionType.MOVE_INTERACT) { + type = InteractionType.NO_INTERACT; + } + return type; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + int swing = super.swing(entity, victim, state); + if (getType() == CombatStyle.MAGIC) { + setSpell(entity); + } + return swing; + } + + @Override + public int getCombatDistance(Entity e, Entity v, int distance) { + return 12; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + super.visualize(entity, victim, state); + if (state.getStyle() == CombatStyle.MAGIC) { + setSpell(entity); + CombatSpell spell = (CombatSpell) SpellBook.MODERN.getSpell(14); + state.setSpell(spell); + } + state.getStyle().getSwingHandler().visualize(entity, victim, state); + entity.getAnimator().forceAnimation(entity.getProperties().getAttackAnimation()); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + super.impact(entity, victim, state); + if (super.getType() == CombatStyle.MAGIC) { + victim.getSkills().decrementPrayerPoints(1); + } else { + if (RandomFunction.random(20) == 5) { + victim.getStateManager().register(EntityState.POISONED, false, 68, entity); + } + } + } + + /** + * Sets the spell. + */ + public void setSpell(Entity e) { + CombatSpell spell = (CombatSpell) SpellBook.MODERN.getSpell(14); + e.getProperties().setSpell(spell); + e.getProperties().setAutocastSpell(spell); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/content/zone/wbisland/WaterBirthDungeonZone.java b/Server/src/main/java/Server/core/game/content/zone/wbisland/WaterBirthDungeonZone.java new file mode 100644 index 000000000..a2432f2a1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/wbisland/WaterBirthDungeonZone.java @@ -0,0 +1,408 @@ +package core.game.content.zone.wbisland; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialogueAction; +import core.game.content.global.action.ClimbActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the waterbirth dungeon zone. + * @author Vexia + */ +public final class WaterBirthDungeonZone extends MapZone implements Plugin { + + /** + * The door support locations. + */ + private static final Location[] DOOR_SUPPORTS = new Location[] { Location.create(2545, 10145, 0), Location.create(2543, 10143, 0), Location.create(2545, 10141, 0) }; + + /** + * Constructs a new {@code WaterBirthDungeonZone} {@code Object}. + */ + public WaterBirthDungeonZone() { + super("Water birth dungeon", true, ZoneRestriction.CANNON, ZoneRestriction.RANDOM_EVENTS); + PluginManager.definePlugin(new DagannothKingNPC()); + PluginManager.definePlugin(new DoorSupportNPC()); + PluginManager.definePlugin(new DungeonOptionHandler()); + PluginManager.definePlugin(new SpinolypNPC()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public boolean move(Entity e, Location from, Location to) { + for (Location location : DOOR_SUPPORTS) { + if (location.equals(to)) { + List npcs = RegionManager.getLocalNpcs(location, 0); + NPC npc = null; + if (npcs.size() != 0) { + npc = npcs.get(0); + } + if (npc != null && npc instanceof DoorSupportNPC) { + DoorSupportNPC door = (DoorSupportNPC) npc; + if (door.getId() != door.getOriginalId()) { + return true; + } + } + return false; + } + } + if (e instanceof Player) { + final Player p = (e.asPlayer()); + if (p.getLocation().equals(new Location(2545, 10144, 0)) || p.getLocation().equals(new Location(2545, 10142, 0))) { + final List eggs = new ArrayList<>(); + NPC n = Repository.findNPC(new Location(2546, 10142, 0)); + if (n != null && n.getId() == 2449) { + eggs.add(n); + } + n = Repository.findNPC(new Location(2546, 10144, 0)); + if (n != null && n.getId() == 2449) { + eggs.add(n); + } + if (eggs.size() == 0) { + return true; + } + for (NPC npc : eggs) { + if (npc.getAttribute("transforming", 0) > GameWorld.getTicks()) { + return true; + } + npc.setAttribute("transforming", GameWorld.getTicks() + 3); + } + GameWorld.getPulser().submit(new Pulse(1) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + for (NPC n : eggs) { + n.transform(n.getId() + 1); + } + break; + case 3: + final List spawns = new ArrayList<>(); + for (NPC n : eggs) { + n.transform(n.getId() + 1); + NPC spawn = NPC.create(2454, n.getLocation().transform(-1, 0, 0)); + spawn.init(); + spawn.setWalks(true); + spawn.setAggressive(true); + spawn.setRespawn(false); + spawn.attack(p); + spawns.add(spawn); + } + GameWorld.getPulser().submit(new Pulse(GameWorld.getSettings().isDevMode() ? 10 : 45) { + + @Override + public boolean pulse() { + for (NPC n : eggs) { + n.reTransform(); + } + for (NPC spawn : spawns) { + if (spawn.isActive() && !spawn.inCombat()) { + spawn.clear(); + } + } + return true; + } + + }); + break; + } + return counter == 3; + } + + }); + } + } + return super.move(e, from, to); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + final Player player = (Player) e; + switch (target.getId()) { + case 8966: + player.getProperties().setTeleportLocation(Location.create(2523, 3740, 0)); + return true; + case 10193: + player.getProperties().setTeleportLocation(new Location(2545, 10143, 0)); + return true; + case 10177: + switch (option.getName()) { + case "Climb": + player.getDialogueInterpreter().sendOptions("Select an Option", "Climb Up.", "Climb Down."); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 1: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, new Location(2544, 3741, 0)); + break; + case 2: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_DOWN, new Location(1799, 4406, 3)); + break; + } + } + + }); + break; + case "Climb-down": + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_DOWN, new Location(1799, 4406, 3)); + break; + case "Climb-up": + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, new Location(2544, 3741, 0)); + break; + } + return true; + case 10217: + player.sendMessage("You need to have completed Horror from the Deep in order to do this."); + return true; + case 10230: + player.teleport(Location.create(2899, 4450, 0)); + return true; + case 10229: + player.teleport(Location.create(1912, 4367, 0)); + return true; + } + } + return super.interact(e, target, option); + } + + @Override + public void configure() { + register(new ZoneBorders(2423, 10090, 2585, 10195)); + registerRegion(7236); + registerRegion(7492); + registerRegion(7748); + registerRegion(11589); + } + + /** + * Handles the dungeon options. + * @author Vexia + */ + public static final class DungeonOptionHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(8958).getHandlers().put("option:open", this); + ObjectDefinition.forId(8959).getHandlers().put("option:open", this); + ObjectDefinition.forId(8960).getHandlers().put("option:open", this); + NPCDefinition.forId(2440).getHandlers().put("option:destroy", this); + NPCDefinition.forId(2443).getHandlers().put("option:destroy", this); + NPCDefinition.forId(2446).getHandlers().put("option:destroy", this); + for (Location l : DOOR_SUPPORTS) { + ObjectBuilder.remove(RegionManager.getObject(l)); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 8958: + case 8959: + case 8960: + boolean behind = player.getLocation().getX() >= 2492; + if (!behind) { + if (RegionManager.getLocalPlayers(node.getLocation().transform(-1, 0, 0), 0).size() == 0 || RegionManager.getLocalPlayers(node.getLocation().getLocation().transform(-1, 2, 0), 0).size() == 0) { + player.sendMessage("You cannot see a way to open this door..."); + break; + } + } + if (!node.isActive()) { + return true; + } + ObjectBuilder.replace(node.asObject(), node.asObject().transform(8962), 30); + break; + case 2440: + case 2443: + case 2446: + int x = node.getLocation().getX(); + int y = node.getLocation().getY(); + boolean canAttack = true; + if (x == 2545 && y == 10145 && player.getLocation().getY() > y) {// top + // north + canAttack = false; + } else if (x == 2543 && y == 10143 && player.getLocation().getX() < x) {// middle + canAttack = false; + } else if (x == 2545 && y == 10141 && player.getLocation().getY() < y) {// south + canAttack = false; + } + if (!canAttack) { + player.sendMessage("The door is propped securely shut from this side..."); + break; + } + player.attack(node); + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n.getName().equals("Door-support")) { + Player player = node.asPlayer(); + if (player.getProperties().getCombatPulse().getStyle() != CombatStyle.MELEE) { + return node.getLocation(); + } + } + return null; + } + } + + /** + * Represents a door support npc. + * @author Vexia + */ + public static final class DoorSupportNPC extends AbstractNPC { + + /** + * The death spawn. + */ + private long deathSpawn = -1; + + /** + * Constructs a new {@Code DoorSupportNPC} {@Code Object} + */ + public DoorSupportNPC() { + super(-1, null); + } + + /** + * Constructs a new {@Code DoorSupportNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public DoorSupportNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DoorSupportNPC(id, location); + } + + @Override + public void init() { + lock(); + super.init(); + getSkills().setStaticLevel(Skills.HITPOINTS, 1); + getSkills().setLevel(Skills.HITPOINTS, 1); + getSkills().setLifepoints(1); + getProperties().setDeathAnimation(new Animation(-1)); + } + + @Override + public void handleTickActions() { + if (deathSpawn != -1 && deathSpawn < GameWorld.getTicks()) { + deathSpawn = -1; + transform(getOriginalId()); + getSkills().setStaticLevel(Skills.HITPOINTS, 1); + getSkills().setLevel(Skills.HITPOINTS, 1); + getSkills().setLifepoints(1); + fullRestore(); + getSkills().heal(100); + } + } + + @Override + public boolean face(Entity entity) { + return false; + } + + @Override + public boolean faceLocation(Location locatin) { + return false; + } + + @Override + public void checkImpact(BattleState state) { + getSkills().setStaticLevel(Skills.HITPOINTS, 1); + getSkills().setLevel(Skills.HITPOINTS, 1); + getSkills().setLifepoints(1); + getSkills().setLifepoints(1); + state.setEstimatedHit(1); + lock(); + getWalkingQueue().reset(); + } + + @Override + public boolean canStartCombat(Entity victim) { + return false; + } + + @Override + public void commenceDeath(Entity killer) { + getAnimator().reset(); + transform(getOriginalId() + 1); + lock(); + } + + @Override + public void finalizeDeath(Entity killer) { + getAnimator().reset(); + transform(getOriginalId() + 2); + deathSpawn = GameWorld.getTicks() + 55; + lock(); + + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (getId() != getOriginalId()) { + return false; + } + if (entity.getLocation().getDistance(getLocation()) <= 3) { + if (entity instanceof Player) { + Player player = entity.asPlayer(); + player.sendMessage("The door is propped securely shut from this side..."); + } + return false; + } + return style != CombatStyle.MELEE; + } + + @Override + public int[] getIds() { + return new int[] { 2440, 2443, 2446 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/content/zone/wbisland/WaterBirthIslandZone.java b/Server/src/main/java/Server/core/game/content/zone/wbisland/WaterBirthIslandZone.java new file mode 100644 index 000000000..b31ac824a --- /dev/null +++ b/Server/src/main/java/Server/core/game/content/zone/wbisland/WaterBirthIslandZone.java @@ -0,0 +1,103 @@ +package core.game.content.zone.wbisland; + +import core.game.component.Component; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the waterbirth island zone. + * @author Vexia + */ +@Initializable +public final class WaterBirthIslandZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code WaterBirthIslandZone} {@code Object}. + */ + public WaterBirthIslandZone() { + super("Water birth island", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + ZoneBuilder.configure(new WaterBirthDungeonZone()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + final Player player = (Player) e; + switch (target.getId()) { + case 2438: + if (option.getName().equals("Travel")) { + player.getDialogueInterpreter().open(target.getId(), target, true); + return true; + } + break; + case 8929: + player.getInterfaceManager().open(new Component(574)); + return true; + case 8930: + player.getProperties().setTeleportLocation(new Location(2545, 10143, 0)); + return true; + } + } + return super.interact(e, target, option); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + final Player player = (Player) e; + player.getInterfaceManager().openOverlay(new Component(482)); + } + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + ((Player) e).getInterfaceManager().closeOverlay(); + } + return true; + } + + @Override + public boolean actionButton(Player player, int interfaceId, int buttonId, int slot, int itemId, int opcode) { + switch (interfaceId) { + case 574: + switch (buttonId) { + case 17: + player.getInterfaceManager().close(); + player.getProperties().setTeleportLocation(Location.create(2443, 10146, 0)); + break; + case 18: + player.getInterfaceManager().close(); + break; + } + break; + } + return super.actionButton(player, interfaceId, buttonId, slot, itemId, opcode); + } + + @Override + public void configure() { + register(new ZoneBorders(2487, 3711, 2565, 3776)); + } + +} diff --git a/Server/src/main/java/Server/core/game/ge/BotPrices.kt b/Server/src/main/java/Server/core/game/ge/BotPrices.kt new file mode 100644 index 000000000..294806390 --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/BotPrices.kt @@ -0,0 +1,45 @@ +package core.game.ge + +import core.cache.def.impl.ItemDefinition +import core.tools.Items + +class BotPrices { + + companion object { + @JvmStatic + fun getPrice(id: Int): Int { + return getPriceOverrides(id) ?: ItemDefinition.forId(id).value + } + + @JvmStatic + private fun getPriceOverrides(id: Int): Int? { + return when (id) { + Items.PURE_ESSENCE_7936 -> 50 + Items.BOW_STRING_1777 -> 250 + Items.MAGIC_LOGS_1513 -> 750 + Items.COWHIDE_1739 -> 250 + Items.DRAGON_BONES_536 -> 1250 + Items.GREEN_DRAGONHIDE_1753 -> 550 + Items.GRIMY_RANARR_207 -> 1214 + Items.GRIMY_AVANTOE_211 -> 453 + Items.GRIMY_CADANTINE_215 -> 232 + Items.GRIMY_DWARF_WEED_217 -> 86 + Items.GRIMY_GUAM_199 -> 50 + Items.GRIMY_HARRALANDER_205 -> 115 + Items.GRIMY_IRIT_209 -> 860 + Items.GRIMY_KWUARM_213 -> 334 + Items.GRIMY_LANTADYME_2485 -> 115 + Items.GRIMY_MARRENTILL_201 -> 250 + Items.LOBSTER_379 -> 268 + Items.RAW_LOBSTER_377 -> 265 + Items.LOOP_HALF_OF_A_KEY_987 -> 5250 + Items.TOOTH_HALF_OF_A_KEY_985 -> 4263 + Items.SWORDFISH_373 -> 400 + Items.RAW_SWORDFISH_371 -> 390 + Items.SHARK_385 -> 720 + Items.RAW_SHARK_383 -> 710 + else -> null + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/ge/BuyingLimitation.java b/Server/src/main/java/Server/core/game/ge/BuyingLimitation.java new file mode 100644 index 000000000..3b2b4289f --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/BuyingLimitation.java @@ -0,0 +1,89 @@ +package core.game.ge; + +import core.cache.def.impl.ItemDefinition; +import core.game.system.config.ItemConfigParser; + +import java.util.HashMap; +import java.util.Map; + +/** + * Handles the buying limitations. + * @author Emperor + */ +public final class BuyingLimitation { + + /** + * Mapping holding buying amounts per player for every item id. + */ + private static final Map> CACHE = new HashMap<>(); + + /** + * Constructs a new {@code BuyingLimitation} {@code Object}. + */ + private BuyingLimitation() { + /* + * empty. + */ + } + + /** + * Gets the maximum amount the player can buy of this item. + * @param itemId The item id. + * @param playerUID The player UID. + * @return The maximum amount to buy. + */ + public static int getMaximumBuy(int itemId, int playerUID) { + Map data = CACHE.get(itemId); + Integer current = 0; + if (data != null) { + current = data.get(playerUID); + } + if (current == null) { + current = 0; + } + return ItemDefinition.forId(itemId).getConfiguration(ItemConfigParser.GE_LIMIT, 25000) - current; + } + + /** + * Updates the currently bought amount. + * @param itemId The item id. + * @param playerUID The player UID. + * @param amount The amount. + */ + public static void updateBoughtAmount(int itemId, int playerUID, int amount) { + Map data = CACHE.get(itemId); + if (data == null) { + CACHE.put(itemId, data = new HashMap<>()); + } + Integer current = data.get(playerUID); + if (current == null) { + current = 0; + } + current += amount; + data.put(playerUID, current); + } + + /** + * Checks if the offer is limited. + * @return {@code True} if so. + */ + public static boolean isLimited(int itemId, int playerUID) { + Map data = CACHE.get(itemId); + if (data == null) { + return false; + } + Integer current = data.get(playerUID); + if (current == null) { + return false; + } + int max = ItemDefinition.forId(itemId).getConfiguration(ItemConfigParser.GE_LIMIT, 25000); + return current >= max; + } + + /** + * Clears the cached data. + */ + public static void clear() { + CACHE.clear(); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/ge/GEAutoStock.kt b/Server/src/main/java/Server/core/game/ge/GEAutoStock.kt new file mode 100644 index 000000000..25768799a --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/GEAutoStock.kt @@ -0,0 +1,30 @@ +package core.game.ge + +import core.ServerConstants +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.File +import java.io.FileReader + +class GEAutoStock { + companion object { + // autostock format should be identical to the botoffers json format. + private val DB_PATH = "data" + File.separator + "eco" + File.separator + "autostock.json" + + fun autostock() { + if(ServerConstants.GE_AUTOSTOCK_ENABLED) { + val parser = JSONParser() + val botReader: FileReader? = FileReader(DB_PATH) + val botSave = parser.parse(botReader) as JSONObject + if (botSave.containsKey("offers")) { + val offers = botSave["offers"] as JSONArray + for (offer in offers) { + val o = offer as JSONObject + OfferManager.addBotOffer(o["item"].toString().toInt(), o["qty"].toString().toInt()) + } + } + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/ge/GEGuidePrice.java b/Server/src/main/java/Server/core/game/ge/GEGuidePrice.java new file mode 100644 index 000000000..7500c90e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/GEGuidePrice.java @@ -0,0 +1,147 @@ +package core.game.ge; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.tools.StringUtils; + +/** + * Represents the glass used to open the guide prices for the different type of + * trade(herbs, logs, runes, etc...) + * @author 'Vexia + * @date 30/11/2013 + */ +public final class GEGuidePrice { + + /** + * Represents the guide price component. + */ + private static final Component COMPONENT = new Component(642); + + /** + * Method used to open a Grand Exchange guide price type. + * @param player the player. + * @param type the type. + */ + public static final void open(final Player player, final GuideType type) { + player.getInterfaceManager().open(COMPONENT); + type.display(player); + } + + /** + * Method used to clear the current items being showed. + * @param player the player. + */ + public static final void clear(final Player player) { + for (int i = 135; i < 165; i++) { + player.getPacketDispatch().sendInterfaceConfig(COMPONENT.getId(), i, true); + } + } + + /** + * Represents a guide item shown on the Guide Price interface. + * @author 'Vexia + * @date 01/12/2013 + */ + public static class GuideItem { + + /** + * Represents the item of this type. + */ + private final int item; + + /** + * Represents the unlock child. + */ + private final int[] childData; + + /** + * Constructs a new {@code GEGuidePrice} {@code Object}. + * @param item the item. + * @param childData the child data. + */ + public GuideItem(final int item, final int... childData) { + this.item = item; + this.childData = childData; + } + + /** + * Gets the item. + * @return The item. + */ + public int getItem() { + return item; + } + + /** + * Gets the childData. + * @return The childData. + */ + public int[] getChildData() { + return childData; + } + } + + /** + * Represents a guide price type of trade(herbs, logs, etc...) + * @author 'Vexia + * @date 30/11/2013 + */ + public enum GuideType { + LOGS(new int[] { 0, 0 }, new GuideItem(1511, 155), new GuideItem(2862, 156), new GuideItem(1521, 157), new GuideItem(1519, 158), new GuideItem(6333, 159), new GuideItem(1517, 160), new GuideItem(6332, 161), new GuideItem(12581, 162), new GuideItem(1515, 163), new GuideItem(1513, 164)), ORES(new int[] { 40, 44 }, new GuideItem(436, 33), new GuideItem(438, 34), new GuideItem(440, 35), new GuideItem(442, 36), new GuideItem(453, 37), new GuideItem(444, 38), new GuideItem(447, 39), new GuideItem(449, 40), new GuideItem(451, 41)), RUNES(new int[] { 215, 216 }, new GuideItem(1436, 183), new GuideItem(7936, 184), new GuideItem(556, 185), new GuideItem(558, 186), new GuideItem(555, 187), new GuideItem(557, 188), new GuideItem(554, 189), new GuideItem(559, 190), new GuideItem(564, 191), new GuideItem(562, 192), new GuideItem(9075, 193), new GuideItem(561, 194), new GuideItem(563, 195), new GuideItem(560, 196), new GuideItem(565, 197), new GuideItem(566, 198)), HERBS(new int[] { 130, 135 }, new GuideItem(249, 119), new GuideItem(251, 120), new GuideItem(253, 121), new GuideItem(255, 122), new GuideItem(257, 123), new GuideItem(2998, 124), new GuideItem(259, 125), new GuideItem(12172, 126), new GuideItem(261, 127), new GuideItem(263, 128), new GuideItem(3000, 129), new GuideItem(265, 130), new GuideItem(2481, 131), new GuideItem(267, 132), new GuideItem(269, 133)), WEAPONS_AND_ARMOUR(new int[] { 88, 89 }, new GuideItem(11834, 73), new GuideItem(11838, 74), new GuideItem(11842, 75), new GuideItem(11864, 76), new GuideItem(11870, 77), new GuideItem(11846, 78), new GuideItem(11848, 79), new GuideItem(11850, 80), new GuideItem(11856, 81), new GuideItem(11732, 82), new GuideItem(4151, 83), new GuideItem(11235, 84), new GuideItem(6739, 85), new GuideItem(4587, 86), new GuideItem(4153, 87)); + + /** + * Constructs a new {@code GEGuidePrice} {@code Object}. + * @param childData the childData. + * @param items the guide items. + */ + GuideType(final int[] childData, final GuideItem... items) { + this.childData = childData; + this.items = items; + } + + /** + * Represents the guide items. + */ + private final GuideItem[] items; + + /** + * Represents the child data for the guide type. + */ + private final int childData[]; + + /** + * Gets the items. + * @return The items. + */ + public GuideItem[] getItems() { + return items; + } + + /** + * Gets the childData. + * @return The childData. + */ + public int[] getChildData() { + return childData; + } + + /** + * Method used to display the guide type. + * @param player the player. + */ + public void display(final Player player) { + player.setAttribute("guide-price", this); + if (this != LOGS) { + clear(player); + } + player.getPacketDispatch().sendString("Guide Prices: " + StringUtils.formatDisplayName(name()), COMPONENT.getId(), 14); + for (int i = getChildData()[0]; i < getChildData()[1]; i++) { + player.getPacketDispatch().sendInterfaceConfig(642, i, false); + } + for (GuideItem item : getItems()) { + player.getPacketDispatch().sendString("" + GrandExchangeDatabase.getDatabase().get(item.getItem()).getValue() + " gp", COMPONENT.getId(), item.getChildData()[0]); + } + } + } + +} diff --git a/Server/src/main/java/Server/core/game/ge/GEItemSet.java b/Server/src/main/java/Server/core/game/ge/GEItemSet.java new file mode 100644 index 000000000..0042c1e3a --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/GEItemSet.java @@ -0,0 +1,109 @@ +package core.game.ge; + +import core.game.node.item.Item; + +import java.util.HashMap; +import java.util.Map; + +/** + * Holds the Grand Exchange item sets. + * @author Emperor + */ +public enum GEItemSet { + + BRONZE_L(11814, 1155, 1117, 1075, 1189), BRONZE_SK(11816, 1155, 1117, 1087, 1189), IRON_L(11818, 1153, 1115, 1067, 1191), IRON_SK(11820, 1153, 1115, 1081, 1191), STEEL_L(11822, 1157, 1119, 1069, 1193), STEEL_SK(11824, 1157, 1119, 1083, 1193), BLACK_L(11826, 1165, 1125, 1077, 1195), BLACK_SK(11828, 1165, 1125, 1089, 1195), MITHRIL_L(11830, 1159, 1121, 1071, 1197), MITHRIL_SK(11832, 1159, 1121, 1085, 1197), ADAMANT_L(11834, 1161, 1123, 1073, 1199), ADAMANT_SK(11836, 1161, 1123, 1091, 1199), RUNE_L(11838, 1163, 1127, 1079, 1201), RUNE_SK(11840, 1163, 1127, 1093, 1201), DRAGON_L(11842, 1149, 3140, 4087), DRAGON_SK(11844, 1149, 3140, 4585), + // NULL_1(-1), //This would create the spaces between the sets (uncomment + // when needed) + AHRIMS(11846, 4708, 4712, 4714, 4710), DHAROKS(11848, 4716, 4720, 4722, 4718), GUTHANS(11850, 4724, 4728, 4730, 4726), KARILS(11852, 4732, 4736, 4738, 4734), TORAGS(11854, 4745, 4749, 4751, 4747), VERACS(11856, 4753, 4757, 4759, 4755), THIRD_AGE_MELEE(11858, 10350, 10348, 10346, 10352), THIRD_AGE_RANGE(11860, 10334, 10330, 10332, 10336), THIRD_AGE_MAGE(11862, 10342, 10338, 10340, 10344), GREEN_DHIDE(11864, 1135, 1099, 1065), BLUE_DHIDE(11866, 2499, 2493, 2487), RED_DHIDE(11868, 2501, 2495, 2489), BLACK_DHIDE(11870, 2503, 2497, 2491), MYSTIC(11872, 4089, 4091, 4093, 4095, 4097), LIGHT_MYSTIC(11960, 4109, 4111, 4113, 4115, 4117), DARK_MYSTIC(11962, 4099, 4101, 4103, 4105, 4107), INFINITY(11874, 6918, 6916, 6924, 6922, 6920), SPLITBARK(11876, 3385, 3387, 3389, 3391, 3393), BLACK_TRIMMED_L(11878, 2587, 2583, 2585, 2589), BLACK_TRIMMED_SK(11880, 2587, 2583, 3472, 2589), BLACK_GOLD_TRIMMED_L(11882, 2595, 2591, 2593, 2597), BLACK_GOLD_TRIMMED_SK(11884, 2595, 2591, 3473, 2597), ADAMANT_TRIMMED_L(11886, 2605, 2599, 2601, 2603), ADAMANT_TRIMMED_SK(11888, 2605, 2599, 3474), ADAMANT_GOLD_TRIMMED_L(11890, 2613, 2607, 2609, 2611), ADAMANT_GOLD_TRIMMED_SK(11892, 2613, 3475, 2611), RUNE_TRIMMED_L(11894, 2627, 2623, 2625, 2629), RUNE_TRIMMED_SK(11896, 2627, 2623, 3477, 2629), RUNE_GOLD_TRIMMED_L(11898, 2619, 2615, 2617, 2621), RUNE_GOLD_TRIMMED_SK(11900, 2619, 2615, 3476, 2621), ENCHANTED(11902, 7400, 7399, 7398), TRIMMED_BLUE_WIZARD(11904, 7396, 7392, 7388), GOLD_TRIMMED_BLUE_WIZARD(11906, 7394, 7390, 7386), TRIMMED_LEATHER(11908, 7364, 7368), GOLD_TRIMMED_LEATHER(11910, 7362, 7366), GREEN_DHIDE_T(11912, 7372, 7380), GREEN_DHIDE_G(11914, 7370, 7378), BLUE_DHIDE_T(11916, 7376, 7384), BLUE_DHIDE_G(11918, 7374, 7382), GREEN_DHIDE_BLESSED(11920, 10382, 10378, 10380, 10376), BLUE_DHIDE_BLESSED(11922, 10390, 10386, 10388, 10384), RED_DHIDE_BLESSED(11924, 10374, 10370, 10372, 10368), GUTHIX_L(11926, 2673, 2669, 2671, 2675), SARADOMIN_L(11928, 2665, 2661, 2663, 2667), ZAMORAK_L(11930, 2657, 2653, 2655, 2659), GUTHIX_SK(11932, 2673, 2669, 3480, 2675), SARADOMIN_SK(11934, 2665, 2661, 3479, 2667), ZAMORAK_SK(11936, 2657, 2653, 3478, 2659), GILDED_L(11938, 3486, 3481, 3483, 3488), GILDED_SK(11940, 3486, 3481, 3485, 3488), ROCKSHELL(11942, 6128, 6129, 6130, 6151, 6145), SPINED(11944, 6131, 6133, 6135, 6149, 6143), SKELETAL(11946, 6137, 6139, 6141, 6153, 6147), CANNON(11967, 6, 8, 10, 12); + + /** + * The item sets mapping. + */ + private static final Map ITEM_SETS = new HashMap<>(); + + /** + * The items array. + */ + private static Item[] itemArray; + + /** + * Populate the mapping. + */ + static { + itemArray = new Item[values().length]; + for (int i = 0; i < itemArray.length; i++) { + GEItemSet set = values()[i]; + itemArray[i] = set.itemId == -1 ? new Item() : new Item(set.itemId); + ITEM_SETS.put(set.itemId, set); + } + } + + /** + * Gets the item set for the given id. + * @param setId The set item id. + * @return The item set object. + */ + public static GEItemSet forId(int setId) { + return ITEM_SETS.get(setId); + } + + /** + * The item id. + */ + private int itemId; + + /** + * The components. + */ + private int[] components; + + /** + * Constructs a new {@code GEItemSet} {@code Object}. + * @param itemId The item id. + * @param components The components. + */ + private GEItemSet(int itemId, int... components) { + this.itemId = itemId; + this.components = components; + } + + /** + * Gets the itemId. + * @return The itemId. + */ + public int getItemId() { + return itemId; + } + + /** + * Sets the itemId. + * @param itemId The itemId to set. + */ + public void setItemId(int itemId) { + this.itemId = itemId; + } + + /** + * Gets the components. + * @return The components. + */ + public int[] getComponents() { + return components; + } + + /** + * Sets the components. + * @param components The components to set. + */ + public void setComponents(int[] components) { + this.components = components; + } + + /** + * Gets the item array. + * @return The item array. + */ + public static Item[] getItemArray() { + return itemArray; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/ge/GrandExchangeDatabase.java b/Server/src/main/java/Server/core/game/ge/GrandExchangeDatabase.java new file mode 100644 index 000000000..b0a37eca9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/GrandExchangeDatabase.java @@ -0,0 +1,258 @@ +package core.game.ge; + +import core.ServerConstants; +import core.cache.def.impl.ItemDefinition; +import core.game.system.SystemLogger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +/** + * Represents the grand exchange database. + * @author Ceikry + */ +public final class GrandExchangeDatabase { + + /** + * The grand exchange database mapping. + */ + private static final Map DATABASE = new HashMap<>(); + + /** + * The minimum amount of unique trades required for an entry to change its + * value. + */ + private static final int MINIMUM_TRADES = 10;// 200 + + /** + * The amount of hours between each update cycle. + */ + private static final int UPDATE_CYCLE_HOURS = 3; + + /** + * The next update. + */ + private static long nextUpdate; + + /** + * If the G.E database has initialized. + */ + private static boolean initialized; + + /** + * Initializes the database + */ + public static void init() { + try { + File db = new File(ServerConstants.GRAND_EXCHANGE_DATA_PATH + "gedb.xml"); + if(!db.exists()){ + initNewDB(); + return; + } + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); + Document doc = builder.parse(db); + + doc.getDocumentElement().normalize(); + NodeList offers = doc.getElementsByTagName("offer"); + for(int i = 0; i < offers.getLength(); i++){ + Node offer = offers.item(i); + if(offer.getNodeType() == Node.ELEMENT_NODE){ + Element offerElement = (Element) offer; + int itemId = Integer.parseInt(offerElement.getElementsByTagName("id").item(0).getTextContent()); + int value = Integer.parseInt(offerElement.getElementsByTagName("value").item(0).getTextContent()); + if(value < 1){ + value = 1; + } + int uniqueTrades = Integer.parseInt(offerElement.getElementsByTagName("uniqueTrades").item(0).getTextContent()); + long totalValue = Integer.parseInt(offerElement.getElementsByTagName("totalValue").item(0).getTextContent()); + long lastUpdate = Integer.parseInt(offerElement.getElementsByTagName("lastUpdate").item(0).getTextContent()); + + + GrandExchangeEntry e = new GrandExchangeEntry(itemId); + e.setValue(value); + e.setUniqueTrades(uniqueTrades); + e.setTotalValue(totalValue); + e.setLastUpdate(lastUpdate); + NodeList valueLog = offerElement.getElementsByTagName("valueLog"); + e.setLogLength(valueLog.getLength()); + for(int logEntry = 0; logEntry < valueLog.getLength(); logEntry++){ + int val = Integer.parseInt(valueLog.item(logEntry).getTextContent()); + e.getValueLog()[logEntry] = val; + } + DATABASE.put(itemId,e); + } + } + initialized = true; + } catch (Exception e){ + initNewDB(); + } + } + + public static void initNewDB(){ + SystemLogger.logWarn("Initializing new Grand Exchange DB! This may take a moment..."); + ItemDefinition.getDefinitions().values().forEach(def -> { + if(def.getId() != 2572){ + GrandExchangeEntry e = new GrandExchangeEntry(def.getId()); + e.setValue(def.getValue()); + e.setLogLength(0); + DATABASE.put(def.getId(), e); + } + }); + initialized = true; + } + + + /** + * Updates the entry values, if needed. + */ + public static void checkUpdate() { + if (nextUpdate < System.currentTimeMillis()) { + updateValues(); + } + } + + /** + * Dumps the grand exchange database. + */ + public static void save() { + File f = new File(ServerConstants.GRAND_EXCHANGE_DATA_PATH + "gedb.xml"); + if(f.exists()){ + f.delete(); + } + try{ + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = dbFactory.newDocumentBuilder(); + Document doc = builder.newDocument(); + + Element root = doc.createElement("database"); + doc.appendChild(root); + + for(GrandExchangeEntry e : DATABASE.values()) { + Element offer = doc.createElement("offer"); + root.appendChild(offer); + + Element itemId = doc.createElement("id"); + itemId.setTextContent("" + e.getItemId()); + offer.appendChild(itemId); + + Element value = doc.createElement("value"); + value.setTextContent("" + e.getValue()); + offer.appendChild(value); + + Element uniqueTrades = doc.createElement("uniqueTrades"); + uniqueTrades.setTextContent("" + e.getUniqueTrades()); + offer.appendChild(uniqueTrades); + + Element totalValue = doc.createElement("totalValue"); + totalValue.setTextContent("" + e.getTotalValue()); + offer.appendChild(totalValue); + + Element lastUpdate = doc.createElement("lastUpdate"); + lastUpdate.setTextContent("" + e.getLastUpdate()); + offer.appendChild(lastUpdate); + + int[] vLog = e.getValueLog(); + for (int item : vLog) { + if (item == 0) { + continue; + } + Element valueLog = doc.createElement("valueLog"); + valueLog.setTextContent("" + item); + offer.appendChild(valueLog); + } + } + + TransformerFactory factory = TransformerFactory.newInstance(); + Transformer transformer = factory.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + DOMSource source = new DOMSource(doc); + StreamResult result = new StreamResult(f); + transformer.transform(source,result); + } catch (Exception e){ + e.printStackTrace(); + } + } + + /** + * Updates the item values. + */ + public static void updateValues() { + try { + for (GrandExchangeEntry entry : DATABASE.values()) { + if (entry.getUniqueTrades() < MINIMUM_TRADES || entry.getTotalValue() == 0) { + continue; + } + double newAverage = entry.getTotalValue() / entry.getUniqueTrades(); + double changePercentage = newAverage / (double) (entry.getValue() + .001); + if (changePercentage == 1.0) { + continue; + } else if (changePercentage > 1.15) { + changePercentage = 1.15; + } else if (changePercentage < 0.85) { + changePercentage = 0.85; + } + int newValue = (int) (entry.getValue() * changePercentage); + if (newValue == entry.getValue()) { + if (changePercentage > 1.0) { // Fixes 1gp not being + // influenced. + newValue++; + } else if (newValue > 0) { + newValue--; + } + } + entry.updateValue(newValue); + entry.setLastUpdate(nextUpdate); + } + } catch (Throwable t) { + t.printStackTrace(); + } + nextUpdate = System.currentTimeMillis() + (UPDATE_CYCLE_HOURS * (60 * 60 * 1000)); + } + + /** + * Gets the database. + * @return The database. + */ + public static Map getDatabase() { + return DATABASE; + } + + /** + * Gets the nextUpdate. + * @return The nextUpdate. + */ + public static long getNextUpdate() { + return nextUpdate; + } + + /** + * Sets the nextUpdate. + * @param nextUpdate The nextUpdate to set. + */ + public static void setNextUpdate(long nextUpdate) { + GrandExchangeDatabase.nextUpdate = nextUpdate; + } + + /** + * Checks if the grand exchange database has initialized. + * @return {@code True} if so. + */ + public static boolean hasInitialized() { + return initialized; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/ge/GrandExchangeEntry.java b/Server/src/main/java/Server/core/game/ge/GrandExchangeEntry.java new file mode 100644 index 000000000..fa0119f8f --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/GrandExchangeEntry.java @@ -0,0 +1,219 @@ +package core.game.ge; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * Represents a grand exchange entry, which contains the item id, current price + * and previous prices. + * @author Emperor + */ +public final class GrandExchangeEntry { + + /** + * The item id. + */ + private final int itemId; + + /** + * The item value. + */ + private int value; + + /** + * The value log. + */ + private int[] valueLog = new int[256]; + + /** + * The log length. + */ + private int logLength; + + /** + * The amount of unique trades completed. + */ + private int uniqueTrades; + + /** + * The total value amount of each the unique trades.
This is used to + * calculate the average price, so we know whether or not to update price. + */ + private long totalValue; + + /** + * The last update time stamp. + */ + private long lastUpdate; + + /** + * The mapping of completed buying offers. + */ + private Map boughtMap = new HashMap<>(); + + /** + * Constructs a new {@code GrandExchangeEntry} {@code Object}. + * @param itemId The item id. + */ + public GrandExchangeEntry(int itemId) { + this.itemId = itemId; + } + + /** + * Updates the item value. + * @param value The new item value to set. + */ + public void updateValue(int value) { + int[] newValueLog = new int[256]; + System.arraycopy(valueLog, 0, newValueLog, 1, logLength); + newValueLog[0] = this.value; + this.valueLog = newValueLog; + this.value = value; + this.uniqueTrades = 0; + this.totalValue = 0; + if (++logLength > 255) { + logLength = 255; + } + } + + /** + * Influences the price of this item. + * @param value The value offered in the exchange. + */ + public void influenceValue(int value) { + if (value < this.value * 0.5) { // Makes sure the player can't influence + // too much + value = (int) (this.value * 0.5); + } else if (value > this.value * 1.5) { + value = (int) (this.value * 1.5); + } + uniqueTrades++; + totalValue += value; + } + + /** + * Gets the itemId. + * @return The itemId. + */ + public int getItemId() { + return itemId; + } + + /** + * Gets the value. + * @return The value. + */ + public int getValue() { + return value; + } + + /** + * Sets the value. + * @param value The value to set. + */ + public void setValue(int value) { + this.value = value; + } + + /** + * Gets the valueLog. + * @return The valueLog. + */ + public int[] getValueLog() { + return valueLog; + } + + /** + * Sets the valueLog. + * @param valueLog The valueLog to set. + */ + public void setValueLog(int[] valueLog) { + this.valueLog = valueLog; + } + + /** + * Gets the uniqueTrades. + * @return The uniqueTrades. + */ + public int getUniqueTrades() { + return uniqueTrades; + } + + /** + * Sets the uniqueTrades. + * @param uniqueTrades The uniqueTrades to set. + */ + public void setUniqueTrades(int uniqueTrades) { + this.uniqueTrades = uniqueTrades; + } + + /** + * Gets the totalValue. + * @return The totalValue. + */ + public long getTotalValue() { + return totalValue; + } + + /** + * Sets the totalValue. + * @param totalValue The totalValue to set. + */ + public void setTotalValue(long totalValue) { + this.totalValue = totalValue; + } + + /** + * Gets the lastUpdate. + * @return The lastUpdate. + */ + public long getLastUpdate() { + return lastUpdate; + } + + /** + * Sets the lastUpdate. + * @param lastUpdate The lastUpdate to set. + */ + public void setLastUpdate(long lastUpdate) { + this.lastUpdate = lastUpdate; + } + + /** + * Gets the logLength. + * @return The logLength. + */ + public int getLogLength() { + return logLength; + } + + /** + * Sets the logLength. + * @param logLength The logLength to set. + */ + public void setLogLength(int logLength) { + this.logLength = logLength; + } + + /** + * Gets the boughtMap. + * @return The boughtMap. + */ + public Map getBoughtMap() { + return boughtMap; + } + + /** + * Sets the boughtMap. + * @param boughtMap The boughtMap to set. + */ + public void setBoughtMap(Map boughtMap) { + this.boughtMap = boughtMap; + } + + @Override + public String toString() { + return "GrandExchangeEntry [itemId=" + itemId + ", value=" + value + ", valueLog=" + Arrays.toString(valueLog) + ", logLength=" + logLength + ", uniqueTrades=" + uniqueTrades + ", totalValue=" + totalValue + ", lastUpdate=" + lastUpdate + ", boughtMap=" + boughtMap + "]"; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/ge/GrandExchangeOffer.kt b/Server/src/main/java/Server/core/game/ge/GrandExchangeOffer.kt new file mode 100644 index 000000000..b6b4adf94 --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/GrandExchangeOffer.kt @@ -0,0 +1,57 @@ +package core.game.ge + +import core.game.node.entity.player.Player +import core.game.node.item.Item + +import core.cache.def.impl.ItemDefinition + + + + +/** + * A struct holding all the data for grand exchange offers as stored in json database. + * + * @author Angle + */ + +class GrandExchangeOffer() { + var itemID = 0 + var amount = 0 + var completedAmount = 0 + var offeredValue = 0 + var index = 0 + var sell = false + var offerState = OfferState.PENDING + var uid: Long = 0 + var timeStamp: Long = 0 + var withdraw = arrayOfNulls(2) + var totalCoinExchange = 0 + var player: Player? = null + var playerUID = 0 + var isLimitation = false + + /** + * Gets the total amount of money entered. + * @return The total value. + */ + val totalValue: Int + get() = offeredValue * amount + + /** + * Gets the amount of this item left to buy. + * @return The amount. + */ + val amountLeft: Int + get() = amount - completedAmount + + /** + * Checks if this offer is still active for dispatching. + * @return `True` if so. + */ + val isActive: Boolean + get() = offerState != OfferState.ABORTED && offerState != OfferState.PENDING && offerState != OfferState.COMPLETED && offerState != OfferState.REMOVED + + override fun toString(): String { + return "[name=" + ItemDefinition.forId(itemID).name + ", itemId=" + itemID + ", amount=" + amount + ", completedAmount=" + completedAmount + ", offeredValue=" + offeredValue + ", index=" + index + ", sell=" + sell + ", state=" + offerState + ", withdraw=" + withdraw.contentToString() + ", totalCoinExchange=" + totalCoinExchange + ", playerUID=" + playerUID + "]" + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/ge/OfferManager.kt b/Server/src/main/java/Server/core/game/ge/OfferManager.kt new file mode 100644 index 000000000..f2672ad18 --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/OfferManager.kt @@ -0,0 +1,544 @@ +package core.game.ge + +import core.ServerConstants +import core.cache.def.impl.ItemDefinition +import core.game.content.eco.EcoStatus +import core.game.content.eco.EconomyManagement +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.game.node.entity.player.link.audio.Audio +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.callback.CallBack +import core.game.world.repository.Repository +import core.net.packet.PacketRepository +import core.net.packet.context.ContainerContext +import core.net.packet.out.ContainerPacket +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import plugin.ai.AIPlayer +import java.io.File +import java.io.FileReader +import java.io.FileWriter +import java.io.IOException +import java.lang.Exception +import java.lang.Integer.min +import java.util.HashMap +import java.util.concurrent.locks.ReentrantLock +import javax.script.ScriptEngineManager + +class OfferManager : Pulse(), CallBack { + /** + * How often in ticks should ge offers that hit the buying limit be reprocessed? + */ + private val RESET_BUYING_LIMIT_INTERVAL = 24000 + + /** + * How often should the database be saved to disk? + */ + private val SAVE_EVERY = ServerConstants.GE_AUTOSAVE_FREQUENCY + + override fun call(): Boolean { + init() + delay = 1 + GameWorld.Pulser.submit(this) + return true + } + + override fun pulse(): Boolean { + // TODO: Update offers code + if (GameWorld.ticks % RESET_BUYING_LIMIT_INTERVAL == 0) { + BuyingLimitation.clear() + for (offer in OFFER_MAPPING.values) { + if (offer.isActive && offer.isLimitation) { + updateOffer(offer) + } + } + } + + if (dumpDatabase && (GameWorld.ticks % SAVE_EVERY == 0)) { + //save() + dumpDatabase = false + } + + return false + } + + + companion object { + /** + * The update notification. + */ + private const val UPDATE_NOTIFICATION = "One or more of your grand exchange offers have been updated." + + /** + * The database path. + */ + private val DB_PATH = ServerConstants.GRAND_EXCHANGE_DATA_PATH + "offer_dispatch.json" + + /** + * Bot DB path + */ + private val BOT_DB_PATH = ServerConstants.GRAND_EXCHANGE_DATA_PATH + "bot_offers.json" + + /** + * The offset of the offer UIDs. + */ + private var offsetUID: Long = 1 + + /** + * The mapping of all current offers. Stored in multiple maps. + * + * First map is offsetID, Offer + * Second is itemID, offsetID, Offer + * Final is playerID, offsetID, Offer + */ + val OFFER_MAPPING: MutableMap = HashMap() + val OFFERS_BY_ITEMID: MutableMap> = HashMap() + private val GE_OFFER_LOCK = ReentrantLock() + + /** + * Bot offers are sorted by itemID. + * the second int shows the offer amount. Negative is buying positive selling. + */ + public val BOT_OFFERS: HashMap = HashMap() + + /** + * If the database should be dumped. + */ + public var dumpDatabase = false + + /** + * Initializes the Grand Exchange. + */ + fun init() { + GE_OFFER_LOCK.lock() + val file = File(DB_PATH) + + if(file.exists() && file.length() != 0L) { + val parser = JSONParser() + val reader: FileReader? = FileReader(DB_PATH) + val saveFile = parser.parse(reader) as JSONObject + + offsetUID = saveFile["offsetUID"].toString().toLong() + + if (saveFile.containsKey("offers")) { + val offers = saveFile["offers"] as JSONArray + for (offer in offers) { + val o = offer as JSONObject + // Copy all the bot offers from the file + if (o["playerUID"].toString().toInt() == 0) { + addBotOffer(o["itemId"].toString().toInt(), o["amount"].toString().toInt() - o["completedAmount"].toString().toInt()) + } + val no = GrandExchangeOffer() + no.itemID = o["itemId"].toString().toInt() + no.sell = o["sale"] as Boolean + no.offeredValue = o["offeredValue"].toString().toInt() + no.amount = o["amount"].toString().toInt() + no.timeStamp = o["timeStamp"].toString().toLong() + no.uid = o["uid"].toString().toLong() + no.completedAmount = o["completedAmount"].toString().toInt() + no.playerUID = o["playerUID"].toString().toInt() + no.offerState = OfferState.values()[o["offerState"].toString().toInt()] + no.totalCoinExchange = o["totalCoinExchange"].toString().toInt() + val withdrawData = o["withdrawItems"] as JSONArray + for ((index, data) in withdrawData.withIndex()) { + val item = data as JSONObject + val it = Item(item["id"].toString().toInt(), item["amount"].toString().toInt()) + no.withdraw[index] = it + } + addEntry(no) + } + } + } + + if(File(BOT_DB_PATH).exists()) { + try { + val botReader: FileReader? = FileReader(BOT_DB_PATH) + val botSave = JSONParser().parse(botReader) as JSONObject + if (botSave.containsKey("offers")) { + val offers = botSave["offers"] as JSONArray + for (offer in offers) { + val o = offer as JSONObject + addBotOffer(o["item"].toString().toInt(), o["qty"].toString().toInt()) + } + } + } catch (e: IOException) { + SystemLogger.logWarn("Unable to load bot offers. Perhaps it doesn't exist?") + } + } + GE_OFFER_LOCK.unlock() + } + + fun buyFromBots(offer: GrandExchangeOffer) { + if (BOT_OFFERS[offer.itemID] == null) { + return + } + val botPrice = BotPrices.getPrice(offer.itemID) + if (offer.offeredValue < botPrice) { + return + } + val amount = min(BOT_OFFERS[offer.itemID]!!, getBuylimitAmount(offer)) + val botOffer = GrandExchangeOffer() + botOffer.sell = true + botOffer.amount = amount + botOffer.offerState = OfferState.REGISTERED + botOffer.offeredValue = botPrice + exchange(offer, botOffer) + BOT_OFFERS[offer.itemID] = BOT_OFFERS[offer.itemID]!! - amount + } + + private fun buyFromBotsWithItem(itemID: Int) { + if (OFFERS_BY_ITEMID[itemID] == null || BOT_OFFERS[itemID] == null) { + return + } + for (trade in OFFERS_BY_ITEMID[itemID]!!) { + if (!trade.sell) { + buyFromBots(trade) + } + } + } + + fun addBotOffer(itemID: Int, qty: Int): Boolean { + if (GrandExchangeDatabase.getDatabase()[itemID] == null) { + SystemLogger.logWarn("Bot attempted to sell invalid item $itemID") + return false + } + + if (BOT_OFFERS[itemID] == null) { + BOT_OFFERS[itemID] = qty + } else { + BOT_OFFERS[itemID] = (qty + BOT_OFFERS[itemID]!!) + } + buyFromBotsWithItem(itemID) + return true + } + + fun amtBotsSelling(itemID: Int): Int { + if (BOT_OFFERS[itemID] == null) { + return 0 + } + if (BOT_OFFERS[itemID]!! <= 0) { + return 0 + } + return BOT_OFFERS[itemID]!! + } + + fun setIndex(offerID: Long, idx: Int) { + if (!OFFER_MAPPING.containsKey(offerID)) { + println("ERROR. GE Entry $offerID not found in database. Playerdata may be corrupted.") + return + } + OFFER_MAPPING[offerID]!!.index = idx + } + + fun removeEntry(offer: GrandExchangeOffer): Boolean{ + println("REMOVING ENTRY of ID " + offer.itemID) + GE_OFFER_LOCK.lock() + if (!OFFER_MAPPING.containsKey(offer.uid)){ + GE_OFFER_LOCK.unlock() + return false + } + OFFER_MAPPING.remove(offer.uid) + OFFERS_BY_ITEMID[offer.itemID]!!.remove(offer) + GE_OFFER_LOCK.unlock() + return true + } + + fun addEntry(offer: GrandExchangeOffer){ + GE_OFFER_LOCK.lock() + OFFER_MAPPING[offer.uid] = offer + if (!OFFERS_BY_ITEMID.containsKey(offer.itemID)) { + OFFERS_BY_ITEMID[offer.itemID] = mutableListOf() + } + OFFERS_BY_ITEMID[offer.itemID]!!.add(offer) + GE_OFFER_LOCK.unlock() + } + + fun getQuantitySoldForItem(item: Int): Int { + var qty = 0 + val offs = getOffersForItem(item) + for (o in offs) { + if (o.sell) { + qty += o.amountLeft + } + } + qty += amtBotsSelling(item) + return qty + } + + fun getOffersForItem(item: Int): MutableList { + if (OFFERS_BY_ITEMID.containsKey(item)) { + return OFFERS_BY_ITEMID[item]!! + } + return mutableListOf() + } + + @JvmStatic + fun save(){ + GE_OFFER_LOCK.lock() + val root = JSONObject() + val offers = JSONArray() + + if(OFFER_MAPPING.isEmpty() && BOT_OFFERS.isEmpty()){ + return + } + + for(entry in OFFER_MAPPING){ + val offer = entry.value + if (offer.offerState == OfferState.REMOVED || entry.value.playerUID == PlayerDetails.getDetails("2009scape").uid) { + continue + } + val o = JSONObject() + o["uid"] = entry.key.toString() + o["itemId"] = offer.itemID.toString() + o["sale"] = offer.sell + o["amount"] = offer.amount.toString() + o["completedAmount"] = offer.completedAmount.toString() + o["offeredValue"] = offer.offeredValue.toString() + o["timeStamp"] = offer.timeStamp.toString() + o["offerState"] = offer.offerState.ordinal.toString() + o["totalCoinExchange"] = offer.totalCoinExchange.toString() + o["playerUID"] = offer.playerUID.toString() + val withdrawItems = JSONArray() + for(item in offer.withdraw){ + item ?: continue + val it = JSONObject() + it["id"] = item.id.toString() + it["amount"] = item.amount.toString() + withdrawItems.add(it) + } + o["withdrawItems"] = withdrawItems + offers.add(o) + } + root["offsetUID"] = offsetUID.toString() + root["offers"] = offers + + val manager = ScriptEngineManager() + val scriptEngine = manager.getEngineByName("JavaScript") + scriptEngine.put("jsonString", root.toJSONString()) + scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)") + val prettyPrintedJson = scriptEngine["result"] as String + + val botRoot = JSONObject() + val botOffers = JSONArray() + + for ((item, qty) in BOT_OFFERS) { + val o = JSONObject() + o["item"] = item + o["qty"] = qty + botOffers.add(o) + } + botRoot["offers"] = botOffers + + scriptEngine.put("jsonString", botRoot.toJSONString()) + scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)") + val botJson = scriptEngine["result"] as String + + + try { + FileWriter(DB_PATH).use { file -> + file.write(prettyPrintedJson) + file.flush() + file.close() + } + FileWriter(BOT_DB_PATH).use { file -> + file.write(botJson) + file.flush() + file.close() + } + } catch (e: Exception) { + e.printStackTrace() + } + GE_OFFER_LOCK.unlock() + } + + /** + * Dispatches an offer. + * @param player The player. + * @param offer The grand exchange offer. + * @return `True` if successful. + */ + @JvmStatic + fun dispatch(player: Player, offer: GrandExchangeOffer): Boolean { + if (offer.amount < 1) { + player.packetDispatch.sendMessage("You must choose the quantity you wish to buy!") + println("amountthing") + return false + } + if (offer.offeredValue < 1) { + player.packetDispatch.sendMessage("You must choose the price you wish to buy for!") + println("pricethng") + return false + } + if (offer.offerState != OfferState.PENDING || offer.uid != 0L) { + println("pendingthing") + return false + } + if (player.isArtificial) { + offer.playerUID = PlayerDetails.getDetails("2009scape").uid + // Repository.sendNews("2009scape wants " + offer.amount + " " + ItemDefinition.forId(offer.itemID).name.toLowerCase() + " for " + offer.offeredValue + "each.") + } else { + offer.playerUID = player.details.uid + } + offer.uid = nextUID() + offer.offerState = OfferState.REGISTERED + addEntry(offer) + offer.timeStamp = System.currentTimeMillis() + player.playerGrandExchange.update(offer) + if (offer.sell) { + Repository.sendNews(player.username + " just offered " + offer.amount + " " + ItemDefinition.forId(offer.itemID).name.toLowerCase() + " on the GE.") + } + if(player !is AIPlayer) { + SystemLogger.logTrade("[GE] ${player.username} ${if (offer.sell) "listed for sale" else "listed buy offer for"} ${offer.amount} ${ItemDefinition.forId(offer.itemID).name.toLowerCase()}") + } + dumpDatabase = true + return true + } + + /** + * Updates the offer. + * @param offer The G.E. offer to update. + */ + @JvmStatic + fun updateOffer(offer: GrandExchangeOffer) { + if (!offer.isActive) { + return + } + GE_OFFER_LOCK.lock() + for (o in OFFERS_BY_ITEMID[offer.itemID]!!) { + if (o.sell != offer.sell && o.isActive) { + exchange(offer, o) + if (offer.offerState == OfferState.COMPLETED) { + break + } + } + } + buyFromBots(offer) + GE_OFFER_LOCK.unlock() + } + + private fun getBuylimitAmount(offer: GrandExchangeOffer): Int { + var left = offer.amountLeft + if (!offer.sell && left > 0) { + val maximum = BuyingLimitation.getMaximumBuy(offer.itemID, offer.playerUID) + if (left >= maximum) { + left = maximum + offer.isLimitation = true + } + } + return left + } + + /** + * Exchanges between 2 offers. + * @param offer The grand exchange offer to update. + * @param o The other offer to exchange with. + */ + private fun exchange(offer: GrandExchangeOffer, o: GrandExchangeOffer) { + if (o.sell == offer.sell) { + return + } + if (offer.sell && o.offeredValue < offer.offeredValue || !offer.sell && o.offeredValue > offer.offeredValue) { + return + } + var amount = min(getBuylimitAmount(offer), getBuylimitAmount(o)) + if (amount < 1) { + return + } + var coinDifference = if (offer.sell) o.offeredValue - offer.offeredValue else offer.offeredValue - o.offeredValue + if (coinDifference < 0) { + return + } + if (EconomyManagement.getEcoState() == EcoStatus.DRAINING) { + coinDifference *= (1.0 - EconomyManagement.getModificationRate()).toInt() + } + offer.completedAmount = offer.completedAmount + amount + o.completedAmount = o.completedAmount + amount + offer.offerState = if (offer.amountLeft < 1) OfferState.COMPLETED else OfferState.UPDATED + o.offerState = if (o.amountLeft < 1) OfferState.COMPLETED else OfferState.UPDATED + if (offer.sell) { + if (offer.amountLeft < 1 && offer.player != null) { + offer.player!!.audioManager.send(Audio(4042, 1, 1)) + } + addWithdraw(offer,995, amount * offer.offeredValue) + addWithdraw(o, o.itemID, amount) + BuyingLimitation.updateBoughtAmount(o.itemID, o.playerUID, amount) + } else { + if (o.amountLeft < 1 && o.player != null) { + o.player!!.audioManager.send(Audio(4042, 1, 1)) + } + addWithdraw(offer, offer.itemID, amount) + addWithdraw(o, 995, amount * o.offeredValue) + BuyingLimitation.updateBoughtAmount(offer.itemID, offer.playerUID, amount) + } + if (coinDifference > 0) { + if (offer.sell) { + addWithdraw(o, 995, coinDifference * amount) + } else { + addWithdraw(offer, 995, coinDifference * amount) + } + } + GrandExchangeDatabase.getDatabase()[o.itemID]?.influenceValue(o.offeredValue) + offer.player?.packetDispatch?.sendMessage(UPDATE_NOTIFICATION) + o.player?.packetDispatch?.sendMessage(UPDATE_NOTIFICATION) + o.player?.playerGrandExchange?.update(o) + offer.player?.playerGrandExchange?.update(offer) + dumpDatabase = true + } + + /** + * Adds a new item to withdraw. + * @param itemId The item id. + * @param amount The amount to add. + * @param abort If the item is added due to abort. + */ + fun addWithdraw(offer: GrandExchangeOffer, itemId: Int, amount: Int, abort: Boolean = false) { + if (!abort) { + if (offer.sell) { + if (itemId == 995) { + offer.totalCoinExchange += amount + } + } else { + if (itemId == 995) { + offer.totalCoinExchange -= amount + } else { + offer.totalCoinExchange += offer.offeredValue * amount + } + } + } + for (i in offer.withdraw.indices) { + if (offer.withdraw[i] == null) { + offer.withdraw[i] = Item(itemId, amount) + break + } + if (offer.withdraw[i]!!.id == itemId) { + offer.withdraw[i]!!.amount = offer.withdraw[i]!!.amount + amount + break + } + } + if (offer.player != null) { + PacketRepository.send( + ContainerPacket::class.java, + ContainerContext(offer.player, -1, -1757, 523 + offer.index, offer.withdraw, false) + ) + } + } + + /** + * Gets the next UID. + * @return The UID. + */ + private fun nextUID(): Long { + val id = offsetUID++ + return if (id == 0L) { + nextUID() + } else id + } + } + + +} diff --git a/Server/src/main/java/Server/core/game/ge/OfferState.java b/Server/src/main/java/Server/core/game/ge/OfferState.java new file mode 100644 index 000000000..745f8705c --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/OfferState.java @@ -0,0 +1,43 @@ +package core.game.ge; + +/** + * Represents the state of a Grand Exchange offer. + * @author Emperor + */ +public enum OfferState { + + /** + * The player is still constructing the offer. + */ + PENDING, + + /** + * The player has confirmed the offer (the offer is being dispatched). + */ + REGISTERED, + + /** + * The offer has been aborted. + */ + ABORTED, + + /** + * The offer has been updated. + */ + UPDATED, + + /** + * The offer is completed. + */ + COMPLETED, + + /** + * The offer is outdated. + */ + OUTDATED, + + /** + * The offer has been removed. + */ + REMOVED; +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/ge/PlayerGrandExchange.kt b/Server/src/main/java/Server/core/game/ge/PlayerGrandExchange.kt new file mode 100644 index 000000000..a568b2078 --- /dev/null +++ b/Server/src/main/java/Server/core/game/ge/PlayerGrandExchange.kt @@ -0,0 +1,723 @@ +package core.game.ge + +import core.cache.def.impl.ItemDefinition +import core.game.component.CloseEvent +import core.game.component.Component +import core.game.container.Container +import core.game.container.ContainerEvent +import core.game.container.ContainerListener +import core.game.container.access.InterfaceContainer +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.login.SavingModule +import core.game.node.entity.player.link.audio.Audio +import core.game.node.item.Item +import core.game.system.monitor.PlayerMonitor +import core.net.packet.PacketRepository +import core.net.packet.context.ConfigContext +import core.net.packet.context.ContainerContext +import core.net.packet.context.GrandExchangeContext +import core.net.packet.out.Config +import core.net.packet.out.ContainerPacket +import core.net.packet.out.GrandExchangePacket +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import core.game.ge.OfferManager.Companion.dispatch +import core.game.ge.OfferManager.Companion.updateOffer +import java.lang.StringBuilder +import java.nio.ByteBuffer +import java.text.DecimalFormat +import java.text.NumberFormat +import java.util.* +import core.game.component.InterfaceType +import core.game.container.access.BitregisterAssembler +import core.game.system.SystemLogger + + +/** + * Handles the grand exchange interfaces for the player. + * + * @author Emperor + * @author Angle + */ + +class PlayerGrandExchange(private val player: Player) : SavingModule { + + var history = arrayOfNulls(5) + + public val offers = arrayOfNulls(6) + + private var openedIndex = -1 + + public var temporaryOffer: GrandExchangeOffer? = null + + /** + * Opens the Grand Exchange menu. + * + * @NOTICE: The amount of GE boxes is limited at LoginWriteEvent.java (2 or 6 GE boxes, set it 0 for 2, 1 for 6) + */ + fun open() { + if (player.ironmanManager.checkRestriction()) { + return + } + if (!player.bankPinManager.isUnlocked) { + player.bankPinManager.openType(4) + return + } + player.interfaceManager.open(Component(105)).closeEvent = + CloseEvent { player, _ -> + temporaryOffer = null + player.packetDispatch.sendRunScript(571, "") + player.interfaceManager.closeChatbox() + player.interfaceManager.closeSingleTab() + true + } + player.packetDispatch.sendInterfaceConfig(105, 193, true) + player.packetDispatch.sendAccessMask(6, 211, 105, -1, -1) + player.packetDispatch.sendAccessMask(6, 209, 105, -1, -1) + toMainInterface() + } + + /** + * Opens the collection box. + */ + fun openCollectionBox() { + if (!player.bankPinManager.isUnlocked) { + player.bankPinManager.openType(3) + return + } + player.interfaceManager.openComponent(109) + player.packetDispatch.sendAccessMask(6, 18, 109, 0, 2) + player.packetDispatch.sendAccessMask(6, 23, 109, 0, 2) + player.packetDispatch.sendAccessMask(6, 28, 109, 0, 2) + player.packetDispatch.sendAccessMask(6, 36, 109, 0, 2) + player.packetDispatch.sendAccessMask(6, 44, 109, 0, 2) + player.packetDispatch.sendAccessMask(6, 52, 109, 0, 2) + for (offer in offers) { + if (offer != null) { + PacketRepository.send( + ContainerPacket::class.java, + ContainerContext(player, -1, -1757, 523 + offer.index, offer.withdraw, false) + ) + } + } + } + + /** + * Opens the history log. + * + * @param p The player to open it for. + */ + fun openHistoryLog(p: Player) { + p.interfaceManager.open(Component(643)) + for (i in history.indices) { + val o: GrandExchangeOffer? = history[i] + if (o == null) { + for (j in 0..3) { + p.packetDispatch.sendString("-", 643, 25 + i + j * 5) + } + continue + } + p.packetDispatch.sendString(if (o.sell) "You sold" else "You bought", 643, 25 + i) + p.packetDispatch.sendString( + NumberFormat.getNumberInstance(Locale.US).format(o.completedAmount.toLong()), + 643, + 30 + i + ) + p.packetDispatch.sendString(ItemDefinition.forId(o.itemID).name, 643, 35 + i) + p.packetDispatch.sendString( + NumberFormat.getNumberInstance(Locale.US).format(o.totalCoinExchange.toLong()) + " gp", 643, 40 + i + ) + } + } + + /** + * Opens the item sets interface. + */ + fun openItemSets() { + player.inventory.listeners.add(object : ContainerListener { + override fun update(c: Container, event: ContainerEvent) { + player.setAttribute( + "container-key", + InterfaceContainer.generateItems( + player, + player.inventory.toArray(), + arrayOf("Examine", "Exchange", "Components"), + 644, + 0, + 7, + 4 + ) + ) + InterfaceContainer.generateItems( + player, + GEItemSet.getItemArray(), + arrayOf("Examine", "Exchange", "Components"), + 645, + 16, + 15, + 10 + ) + } + + override fun refresh(c: Container) { + player.setAttribute( + "container-key", + InterfaceContainer.generateItems( + player, + player.inventory.toArray(), + arrayOf("Examine", "Exchange", "Components"), + 644, + 0, + 7, + 4 + ) + ) + InterfaceContainer.generateItems( + player, + GEItemSet.getItemArray(), + arrayOf("Examine", "Exchange", "Components"), + 645, + 16, + 15, + 10 + ) + } + }) + player.interfaceManager.open(Component(645)).closeEvent = + CloseEvent { player, _ -> + player.inventory.listeners.removeAt(1) + player.interfaceManager.closeSingleTab() + player.removeAttribute("container-key") + true + } + player.interfaceManager.openSingleTab(Component(644)).open(player) + player.setAttribute( + "container-key", + InterfaceContainer.generateItems( + player, + player.inventory.toArray(), + arrayOf("Examine", "Exchange", "Components"), + 644, + 0, + 7, + 4 + ) + ) + InterfaceContainer.generateItems( + player, + GEItemSet.getItemArray(), + arrayOf("Examine", "Exchange", "Components"), + 645, + 16, + 15, + 10 + ) + } + + + /** + * Returns to the main interface. + */ + fun toMainInterface() { + PacketRepository.send(Config::class.java, ConfigContext(player, 1112, -1)) + PacketRepository.send(Config::class.java, ConfigContext(player, 1112, -1)) + player.interfaceManager.closeChatbox() + player.interfaceManager.closeSingleTab() + openedIndex = -1 + } + + + override fun save(buffer: ByteBuffer?) { + TODO("Not yet implemented. NOT Ever implemented. Saving a bytebuffer is dumb") + } + + fun parse(geData: JSONObject) { + val offersRaw = geData["offers"] + + if (offersRaw != null) { + val offersJSON = offersRaw as JSONArray + for (i in offersJSON.indices) { + val offer = offersJSON[i] as JSONObject + val index = offer["offerIndex"].toString().toInt() + if (index > offers.size - 1) { + SystemLogger.logAlert("Grand Exchange: INVALID OFFER INDEX FOR " + player.name + " INDEX: " + index + ", SKIPPING!") + SystemLogger.logAlert("IF YOU SEE THIS MESSAGE, THE GRAND EXCHANGE NEEDS TO BE FIXED.") + SystemLogger.logAlert("Check your logs, AVENGING ANGLE might have fucked up HARD and now " + player.name + "'s trade with index " + index + "is gone :(") + continue + } + OfferManager.setIndex(offer["offerUID"].toString().toInt().toLong(), index) + offers[index] = OfferManager.OFFER_MAPPING[offer["offerUID"].toString().toLong()] + update(offers[index]) + } + } + val historyRaw = geData["history"] + if(historyRaw != null){ + val history = historyRaw as JSONArray + for (i in history.indices) { + val offer = history[i] as JSONObject + var o = GrandExchangeOffer() + o.itemID = offer["itemId"].toString().toInt() + o.sell = offer["isSell"] as Boolean + o.totalCoinExchange = (offer["totalCoinExchange"].toString().toInt()) + o.completedAmount = (offer["completedAmount"].toString().toInt()) + history[i] = o + } + } + } + + override fun parse(buffer: ByteBuffer) { + var index = -1 + while (buffer.get().also { index = it.toInt() }.toInt() != -1) { + val key = buffer.long + OfferManager.setIndex(key, index) + } + for (i in history.indices) { + val s = buffer.get().toInt() + if (s == -1) { + continue + } + var o = GrandExchangeOffer() + o.itemID = buffer.short.toInt() + o.sell = true + o.totalCoinExchange = buffer.int + o.completedAmount = buffer.int + history[i] = o + } + } + + /** + * Initializes the grand exchange. + */ + fun init() { + // Were trades made while gone? + var updated = false + for (offer in offers) { + if (offer != null) { + offer.player = player + if (!updated && (offer.withdraw[0] != null || offer.withdraw[1] != null)) { + updated = true + } + update(offer) + } + } + if (updated) { + player.packetDispatch.sendMessage("You have items from the Grand Exchange waiting in your collection box.") + } + } + + /** + * Updates the client with the grand exchange data. + */ + fun update() { + for (offer in offers) { + update(offer) + } + } + + /** + * Updates a grand exchange offer. + * + * @param offer The offer to update. + */ + fun update(offer: GrandExchangeOffer?) { + if (offer != null) { + PacketRepository.send( + GrandExchangePacket::class.java, + GrandExchangeContext(player, offer.index.toByte(), offer.offerState.ordinal.toByte(), offer.itemID.toShort(), + offer.sell, offer.offeredValue, offer.amount, offer.completedAmount, offer.totalCoinExchange) + ) + } + } + + /** + * Constructs a new buy offer. + * + * @param itemId The item id. + */ + fun constructBuy(itemId: Int) { + if (openedIndex < 0) { + return + } + temporaryOffer = GrandExchangeOffer() + temporaryOffer!!.itemID = itemId + temporaryOffer!!.sell = false + var itemDb = GrandExchangeDatabase.getDatabase()[itemId] + if (itemDb == null) { + player.packetDispatch.sendMessage("This item has been blacklisted from the Grand Exchange.") + return + } + temporaryOffer!!.player = player + temporaryOffer!!.amount = 1 + temporaryOffer!!.offeredValue = itemDb.value + temporaryOffer!!.index = openedIndex + sendConfiguration(temporaryOffer, false) + } + + // GrandExchangeDatabase.getDatabase()[offer?.itemID] + + /** + * Constructs a new sale offer. + * + * @param item The item to sell. + */ + fun constructSale(item: Item) { + if (openedIndex < 0 || offers[openedIndex] != null) { + return + } + if (item.id == 995) { + player.packetDispatch.sendMessage("You can't offer money!") + return + } + var id = item.id + if (!item.definition.isUnnoted) { + id = item.noteChange + } + var itemDb = GrandExchangeDatabase.getDatabase()[id] + if (itemDb == null) { + player.packetDispatch.sendMessage("This item can't be sold on the Grand Exchange.") + return + } + temporaryOffer = GrandExchangeOffer() + temporaryOffer!!.itemID = id + temporaryOffer!!.sell = true + temporaryOffer!!.player = player + temporaryOffer!!.offeredValue = itemDb.value + temporaryOffer!!.amount = item.amount + temporaryOffer!!.index = openedIndex + sendConfiguration(temporaryOffer, true) + } + + companion object { + /** + * Gets the total amount of this item in the inventory (including noted + * version). + * + * @param player The player. + * @param itemId the item id. + * @return The amount of items + notes in the inventory. + */ + @JvmStatic + fun getInventoryAmount(player: Player, itemId: Int): Int { + val item = Item(itemId) + var amount = player.inventory.getAmount(item) + if (item.definition.noteId > -1) { + amount += player.inventory.getAmount(Item(item.definition.noteId)) + } + return amount + } + } + + /** + * Confirms the current offer. + */ + fun confirmOffer() { + if (openedIndex < 0 || temporaryOffer == null || temporaryOffer!!.amount == 0) { + return + } + if (temporaryOffer!!.offeredValue < 1) { + player.audioManager.send(Audio(4039, 1, 1)) + player.packetDispatch.sendMessage("You can't make an offer for 0 coins.") + return + } + if (temporaryOffer!!.amount > Int.MAX_VALUE / temporaryOffer!!.offeredValue) { + player.audioManager.send(Audio(4039, 1, 1)) + player.packetDispatch.sendMessage("You can't " + (if (temporaryOffer!!.sell) "sell " else "buy ") + " this much!") + return + } + temporaryOffer!!.index = openedIndex + if (temporaryOffer!!.sell) { + val maxAmount = getInventoryAmount(player, temporaryOffer!!.itemID) + if (temporaryOffer!!.amount > maxAmount) { + player.audioManager.send(Audio(4039, 1, 1)) + player.packetDispatch.sendMessage("You do not have enough of this item in your inventory to cover the") + player.packetDispatch.sendMessage("offer.") + return + } + var item: Item + val amountLeft: Int = + temporaryOffer!!.amount - player.inventory.getAmount(Item(temporaryOffer!!.itemID)) + val remove = player.inventory.remove(Item(temporaryOffer!!.itemID, temporaryOffer!!.amount).also { + item = it + }) + var note: Int + if (amountLeft > 0) { + if (item.noteChange.also { note = it } > 0) { + player.inventory.remove(Item(note, amountLeft)) + } else if (remove) { + player.inventory.add(Item(temporaryOffer!!.itemID, temporaryOffer!!.amount - amountLeft)) + return + } + } + if (dispatch(player, temporaryOffer!!)) { + offers[openedIndex] = temporaryOffer + updateOffer(temporaryOffer!!) + } + } else { + val total: Int = temporaryOffer!!.amount * temporaryOffer!!.offeredValue + if (total > player.inventory.getAmount(Item(995))) { + player.audioManager.send(Audio(4039, 1, 1)) + player.packetDispatch.sendMessage("You do not have enough coins to cover the offer.") + return + } + if (dispatch(player, temporaryOffer!!) && player.inventory.remove(Item(995, total))) { + offers[openedIndex] = temporaryOffer + updateOffer(temporaryOffer!!) + } + } + player.monitor.log( + (if (temporaryOffer!!.sell) "selling" else "buying") + " offer => item => " + ItemDefinition.forId( + temporaryOffer!!.itemID + ).name + " => amount => " + temporaryOffer!!.amount + " => price => " + temporaryOffer!!.offeredValue, + PlayerMonitor.GRAND_EXCHANGE_LOG + ) + toMainInterface() + player.audioManager.send(Audio(4043, 1, 1)) + temporaryOffer = null + } + + /** + * Aborts an offer. + * + * @param index The offer index. + */ + fun abort(index: Int) { + val offer: GrandExchangeOffer? = offers[index] + player.packetDispatch.sendMessage("Abort request acknowledged. Please be aware that your offer may") + player.packetDispatch.sendMessage("have already been completed.") + if (offer == null || !offer.isActive) { + return + } + offer.offerState = OfferState.ABORTED + if (offer.sell) { + OfferManager.addWithdraw(offer, offer.itemID, offer.amountLeft, true) + } else { + OfferManager.addWithdraw(offer, 995, offer.amountLeft * offer.offeredValue, true) + } + update(offer) + player.monitor.log( + "aborted offer => item => " + ItemDefinition.forId(offer.itemID).name + " => amount => " + offer.amount + "", + PlayerMonitor.GRAND_EXCHANGE_LOG + ) + OfferManager.dumpDatabase = true + } + + /** + * Removes an offer. + * + * @param index The offer index. + */ + fun remove(index: Int): Boolean { + if (offers[index] == null) { + return false + } + var offer: GrandExchangeOffer = offers[index]!! + if (offer.completedAmount > 0) { + val newHistory = arrayOfNulls(5) + newHistory[0] = offer + System.arraycopy(history, 0, newHistory, 1, 4) + history = newHistory + player.monitor.log( + "offer removed => item => " + ItemDefinition.forId(offer.itemID).name + " => amount => " + offer.amount + " => amount_left => " + offer.amountLeft + " => completed_amount => " + offer.completedAmount + "", + PlayerMonitor.GRAND_EXCHANGE_LOG + ) + } + offer.withdraw = arrayOfNulls(2) + var didExist = OfferManager.removeEntry(offer) + offer.uid = 0 + offer.offerState = OfferState.REMOVED + offers[index] = null + update(offer) + toMainInterface() + return didExist + } + + fun hasActiveOffer(): Boolean { + for (i in offers) { + if (i != null) + return true + } + return false + } + + + /** + * Sends the configuration packets for the offer. + * + * @param offer The grand exchange offer. + * @param sell If it's a selling offer. + */ + fun sendConfiguration(offer: GrandExchangeOffer?, sell: Boolean) { + var entry: GrandExchangeEntry? = GrandExchangeDatabase.getDatabase()[offer?.itemID] + var examine: String? = "" + val formatter = DecimalFormat("###,###,###,###") + val text = StringBuilder() + var lowestOfferValue = 0 + var totalAmounts = 0 + val foundOffers: MutableList = ArrayList() + val foundAmounts: MutableList = ArrayList() + if (offer != null) { + examine = ItemDefinition.forId(offer.itemID).examine + var count = 0 + if (!offer.sell) { + for (o in OfferManager.getOffersForItem(offer.itemID)) { + if (o != null) if (o.sell && o.isActive) { + foundOffers.add(o.offeredValue) + foundAmounts.add(o.amountLeft) + count++ + } + } + val botSales = OfferManager.amtBotsSelling(offer.itemID) + if (botSales > 0) { + foundAmounts.add(botSales) + foundOffers.add(BotPrices.getPrice(offer.itemID)) + count++ + } + if (foundOffers.isNotEmpty()) { + lowestOfferValue = Collections.min(foundOffers) + totalAmounts = foundAmounts.stream().mapToInt { obj: Int -> obj }.sum() + } + if (count == 0) text.append("There are currently no sell offers for this item.") + else text.append("Lowest price: ") + .append(formatter.format(lowestOfferValue.toLong())).append(" gp") + .append("
Quantity: ") + .append(formatter.format(totalAmounts.toLong())).append("
Users: ") + .append(formatter.format(count.toLong())) + } + } + player.packetDispatch.sendString(if (offer != null && !offer.sell) text.toString() else examine, 105, 142) + var lowPrice = 0 + var highPrice = 0 + if (entry != null) { + lowPrice = (entry.value * 0.95).toInt() + highPrice = (entry.value * 1.05).toInt() + } + player.varpManager.get(1109).setVarbit(0, offer?.itemID ?: -1).send(player) + player.varpManager.get(1110).setVarbit(0, offer?.amount ?: 0).send(player) + player.varpManager.get(1111).setVarbit(0, offer?.offeredValue ?: 0).send(player) + player.varpManager.get(1112).setVarbit(0, openedIndex).send(player) + player.varpManager.get(1113).setVarbit(0, if (sell) 1 else 0).send(player) + player.varpManager.get(1114).setVarbit(0, entry?.value ?: 0).send(player) + player.varpManager.get(1115).setVarbit(0, lowPrice).send(player) + player.varpManager.get(1116).setVarbit(0, highPrice).send(player) + if (offer != null) { + PacketRepository.send( + ContainerPacket::class.java, + ContainerContext(player, -1, -1757, 523 + offer.index, offer.withdraw, false) + ) + } + } + + /** + * Opens the search interface. + */ + fun openSearch() { + val c = Component(389) + c.definition.type = InterfaceType.CS_CHATBOX + c.closeEvent = CloseEvent { player, c -> + player.packetDispatch.sendRunScript(571, "") + true + } + player.packetDispatch.sendRunScript(570, "s", "Grand Exchange Item Search") + player.interfaceManager.openChatbox(c) + } + + /** + * Opens the buying screen. + * + * @param index The offer index. + */ + fun openBuy(index: Int) { + openedIndex = index + sendConfiguration(offers[index], false) + openSearch() + } + + /** + * Opens the selling screen. + */ + fun openSell(index: Int) { + openedIndex = index + sendConfiguration(offers[index], true) + player.interfaceManager.openSingleTab(Component(107)).open(player) + player.packetDispatch.sendRunScript( + 149, "IviiiIsssss", "", "", "", "Examine", "Offer", + -1, 0, 7, 4, 93, 7012370 + ) + BitregisterAssembler.send(player, 107, 18, 0, 27, BitregisterAssembler(0, 1)) + } + + /** + * Withdraws an item. + * + * @param offer The offer to withdraw from. + * @param index The item index. + */ + fun withdraw(offer: GrandExchangeOffer, index: Int) { + val item = offer.withdraw[index] ?: return + if (player.inventory.getMaximumAdd(item) < item.amount) { + val note = item.noteChange + if (note == -1 || player.inventory.getMaximumAdd(Item(note)) < item.amount) { + player.audioManager.send(Audio(4039, 1, 1)) + player.packetDispatch.sendMessage("You do not have enough room in your inventory.") + return + } + player.inventory.add(Item(note, item.amount)) + } else { + player.inventory.add(item) + } + offer.withdraw[index] = null + if (!offer.isActive && offer.withdraw[0] == null && offer.withdraw[1] == null) { + remove(offer.index) + } + player.audioManager.send(Audio(4040, 1, 1)) + PacketRepository.send( + ContainerPacket::class.java, + ContainerContext(player, -1, -1757, 523 + offer.index, offer.withdraw, false) + ) + OfferManager.dumpDatabase = true + } + + /** + * Gets the currently opened offer. + * + * @return The grand exchange offer currently opened. + */ + fun getOpenedOffer(): GrandExchangeOffer? { + return if (openedIndex < 0) { + null + } else offers[openedIndex] + } + + /** + * Views a registered offer. + * + * @param index The index. + */ + fun view(index: Int) { + if (offers[index] == null) { + return + } + openedIndex = index + sendConfiguration(offers[index], false) + } + + /** + * Formats the grand exchange. + * + * @return the formatted offer for the SQL database. + */ + fun format(): String? { + var log = "" + for (offer in offers) { + if (offer != null) { + log += offer.itemID.toString() + "," + offer.amount + "," + offer.sell + "|" + } + } + if (log.isNotEmpty() && log[log.length - 1] == '|') { + log = log.substring(0, log.length - 1) + } + return log + } + + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/CorporealBeastWarningInterface.kt b/Server/src/main/java/Server/core/game/interaction/CorporealBeastWarningInterface.kt new file mode 100644 index 000000000..85395b797 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/CorporealBeastWarningInterface.kt @@ -0,0 +1,46 @@ +package core.game.interaction + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.world.GameWorld +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +/** + * Handles the corporeal beast warning interface + * @author Ceikry + */ +class CorporealBeastWarningInterface : ComponentPlugin(){ + companion object{ + const val COMPONENT_ID = 650 + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + when(button){ + 17 -> { + if(player.getAttribute("corp-beast-cave-delay",0) <= GameWorld.ticks) { + player.properties.teleportLocation = player.location.transform(4, 0, 0).also { close(player) } + player.setAttribute("corp-beast-cave-delay",GameWorld.ticks + 5) + } else { + close(player) + } + } + else -> close(player) + } + return true + } + + fun close(player: Player){ + player.interfaceManager.close(Component(650)) + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(COMPONENT_ID,this) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/DestinationFlag.java b/Server/src/main/java/Server/core/game/interaction/DestinationFlag.java new file mode 100644 index 000000000..dd7dc2c23 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/DestinationFlag.java @@ -0,0 +1,267 @@ +package core.game.interaction; + +import core.game.content.global.action.DoorActionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.object.GameObject; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; + +/** + * Holds the destination flags for all types of nodes. + * @author Emperor + */ +public class DestinationFlag { + + /** + * The Location destination flag. + */ + public static final DestinationFlag LOCATION = new DestinationFlag(); + + /** + * The entity destination flag. + */ + public static final DestinationFlag ENTITY = new DestinationFlag() { + + @Override + public Location getDestination(Entity mover, Node n) { + Location l = getClosestTo(mover, n, n.getLocation().transform(0, -1, 0)); + if (mover.size() > 1) { + if (l.getX() < n.getLocation().getX()) { + l = l.transform(-(mover.size() - 1), 0, 0); + } + if (l.getY() < n.getLocation().getY()) { + l = l.transform(0, -(mover.size() - 1), 0); + } + } + return l; + } + }; + + /** + * The following an entity destination flag. + */ + public static final DestinationFlag FOLLOW_ENTITY = new DestinationFlag() { + + @Override + public Location getDestination(Entity mover, Node n) { + Direction dir = n.getDirection(); + Location l = n.getLocation().transform(-dir.getStepX(), -dir.getStepY(), 0); + if (!checkTraversal(l, dir)) { + l = getClosestTo(mover, n, l); + } + if (mover.size() > 1) { + if (l.getX() < n.getLocation().getX()) { + l = l.transform(-(mover.size() - 1), 0, 0); + } + if (l.getY() < n.getLocation().getY()) { + l = l.transform(0, -(mover.size() - 1), 0); + } + } + return l; + } + }; + + /** + * The entity destination flag. + */ + public static final DestinationFlag COMBAT = new DestinationFlag() { + + @Override + public Location getDestination(Entity mover, Node n) { + return null;// MovementPulse.getClosest(mover, (Entity) n); + } + }; + + /** + * The item destination flag. + */ + public static final DestinationFlag ITEM = new DestinationFlag() { + + @Override + public Location getDestination(Entity mover, Node n) { + if (!RegionManager.isTeleportPermitted(n.getLocation())) { + return getClosestTo(mover, n, n.getLocation().transform(1, 0, 0)); + } + return n.getLocation(); + } + + }; + + /** + * The object destination flag. + */ + public static final DestinationFlag OBJECT = new DestinationFlag() { + + @Override + public Location getDestination(Entity mover, Node n) { + GameObject object = (GameObject) n; + if (object.getType() < 4 || object.getType() == 9) { + return DoorActionHandler.getDestination(mover, object); + } + if (object.getType() == 4 || object.getType() == 5) { // Wall + // decoration + return object.getLocation(); + } + int sizeX = object.getDefinition().sizeX; + int sizeY = object.getDefinition().sizeY; + if (object.getRotation() % 2 != 0) { + int switcher = sizeX; + sizeX = sizeY; + sizeY = switcher; + } + Direction dir = Direction.forWalkFlag(object.getDefinition().getWalkingFlag(), object.getRotation()); + if (dir != null) { + return getDestination(mover, object, sizeX, sizeY, dir, 3); + } + // System.out.println(dir); + return getDestination(mover, object, sizeX, sizeY, Direction.getLogicalDirection(object.getLocation(), mover.getLocation()), 0); + } + + /** + * Gets the destination for the given object. + * @param object The object. + * @param dir The preferred direction from the object. + * @return The teleporting destination. + */ + private Location getDestination(Entity mover, GameObject object, int sizeX, int sizeY, Direction dir, int count) { + Location closest = null; + double distance = 9999.9; + Location loc = object.getLocation(); + for (int i = count; i < 4; i++) { + if (dir.toInteger() % 2 != 0) { + int x = dir.getStepX(); + if (x > 0) { + x *= sizeX; + } + for (int y = 0; y < sizeY; y++) { + Location l = loc.transform(x, y, 0); + if (checkTraversal(l, dir)) { + double dist = mover.getLocation().getDistance(l); + if (dist < distance) { + distance = dist; + closest = l; + } + } + } + } else { + int y = dir.getStepY(); + if (y > 0) { + y *= sizeY; + } + for (int x = 0; x < sizeX; x++) { + Location l = loc.transform(x, y, 0); + if (checkTraversal(l, dir)) { + double dist = mover.getLocation().getDistance(l); + if (dist < distance) { + distance = dist; + closest = l; + } + } + } + } + dir = Direction.get((dir.toInteger() + 1) % 4); + } + return closest; + } + + @Override + public boolean checkTraversal(Location l, Direction dir) { + return RegionManager.isTeleportPermitted(l) && dir.canMove(l); + } + }; + + /** + * Constructs a new {@code DestinationFlag} {@code Object}. + */ + public DestinationFlag() { + /* + * empty. + */ + } + + /** + * Gets the default destination location. + * @param mover The moving entity. + * @param node The node to move to. + * @return The location to walk to. + */ + public Location getDestination(Entity mover, Node node) { + return node.getLocation(); + } + + /** + * Checks if traversal is permitted. + * @param l The location to check. + * @param dir The direction to move. + * @return {@code True}. + */ + public boolean checkTraversal(Location l, Direction dir) { + return Direction.get((dir.toInteger() + 2) % 4).canMove(l); + } + + /** + * Gets the closest destination to the current destination, to reach the + * node. + * @param mover The moving entity. + * @param node The node to move to. + * @param suggestion The suggested destination location. + * @return The destination location. + */ + public Location getClosestTo(Entity mover, Node node, Location suggestion) { + Location nl = node.getLocation(); + int diffX = suggestion.getX() - nl.getX(); + int diffY = suggestion.getY() - nl.getY(); + Direction moveDir = Direction.NORTH; + if (diffX < 0) { + moveDir = Direction.EAST; + } else if (diffX >= node.size()) { + moveDir = Direction.WEST; + } else if (diffY >= node.size()) { + moveDir = Direction.SOUTH; + } + double distance = 9999.9; + Location destination = suggestion; + for (int c = 0; c < 4; c++) { + for (int i = 0; i < node.size() + 1; i++) { + for (int j = 0; j < (i == 0 ? 1 : 2); j++) { + Direction current = Direction.get((moveDir.toInteger() + (j == 1 ? 3 : 1)) % 4); + Location loc = suggestion.transform(current.getStepX() * i, current.getStepY() * i, 0); + if (moveDir.toInteger() % 2 == 0) { + if (loc.getX() < nl.getX() || loc.getX() > nl.getX() + node.size() - 1) { + continue; + } + } else { + if (loc.getY() < nl.getY() || loc.getY() > nl.getY() + node.size() - 1) { + continue; + } + } + if (checkTraversal(loc, moveDir)) { + double dist = mover.getLocation().getDistance(loc); + if (dist < distance) { + distance = dist; + destination = loc; + } + } + } + } + moveDir = Direction.get((moveDir.toInteger() + 1) % 4); + int offsetX = Math.abs(moveDir.getStepY() * (node.size() >> 1)); // Not + // a + // mixup + // between + // x + // & + // y! + int offsetY = Math.abs(moveDir.getStepX() * (node.size() >> 1)); + if (moveDir.toInteger() < 2) { + suggestion = node.getLocation().transform(-moveDir.getStepX() + offsetX, -moveDir.getStepY() + offsetY, 0); + } else { + suggestion = node.getLocation().transform(-moveDir.getStepX() * node.size() + offsetX, -moveDir.getStepY() * node.size() + offsetY, 0); + } + } + return destination; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/FOGRewardsInterface.kt b/Server/src/main/java/Server/core/game/interaction/FOGRewardsInterface.kt new file mode 100644 index 000000000..53b0715f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/FOGRewardsInterface.kt @@ -0,0 +1,124 @@ +package core.game.interaction + +import core.cache.def.impl.ItemDefinition +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class FOGRewardsInterface : ComponentPlugin(){ + class ShopItem(val id: Int,val price: Int,val amount: Int) + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + var choice = ShopItem(0, 0, 0) + when(button){ + 2 -> choice = Druidic_Mage_Top + 7 -> choice = Druidic_Mage_Bottom + 12 -> choice = Druidic_Mage_Hood + 19 -> choice = Combat_Robe_Top + 24 -> choice = Combat_Robe_Bottom + 29 -> choice = Combat_Robe_Hood + 36 -> choice = Battle_Robe_Top + 41 -> choice = Battle_Robe_Bottom + 46 -> choice = Battle_Robe_Hood + 53 -> choice = Green_Coif + 58 -> choice = Blue_Coif + 63 -> choice = Red_Coif + 68 -> choice = Black_Coif + 75 -> choice = Bronze_Gaunt + 80 -> choice = Iron_Gaunt + 85 -> choice = Steel_Gaunt + 90 -> choice = Black_Gaunt + 95 -> choice = Mithril_Gaunt + 100 -> choice = Adamant_Gaunt + 105 -> choice = Rune_Gaunt + 110 -> choice = Dragon_Gaunt + 117 -> choice = Addy_Spike + 122 -> choice = Addy_Beserk + 127 -> choice = Rune_Spike + 132 -> choice = Rune_Beserk + 139 -> choice = Irit_Gloves + 144 -> choice = Avantoe_Gloves + 149 -> choice = Kwuarm_Gloves + 154 -> choice = Cadantine_Gloves + 161 -> choice = Swordfish_Gloves + 166 -> choice = Shark_Gloves + 171 -> choice = Dragon_Gloves + 176 -> choice = Air_Gloves + 181 -> choice = Water_Gloves + 186 -> choice = Earth_Gloves + else -> SystemLogger.logWarn("Unhandled button ID for FOG interface: $button").also { return true } + } + handleOpcode(choice,opcode,player!!) + return true + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.forId(732).plugin = this + return this + } + + private fun handleOpcode(item: ShopItem, opcode: Int, player: Player){ + when(opcode){ + 155 -> player.sendMessage("${ItemDefinition.forId(item.id).name.replace("100","")}: costs ${item.price} tokens.") + 196 -> handleBuyOption(item,1,player) + 124 -> handleBuyOption(item,5,player) + 199 -> handleBuyOption(item,10,player) + 234 -> player.sendMessage(ItemDefinition.forId(item.id).examine.replace("100","")) + } + } + + private fun handleBuyOption(item: ShopItem, amount: Int, player: Player){ + val neededTokens = Item(12852,item.price * amount) + if(player.inventory.containsItem(neededTokens)){ + if(player.inventory.hasSpaceFor(Item(item.id,amount))){ + player.inventory.remove(neededTokens) + player.inventory.add(Item(item.id,amount)) + } else { + player.sendMessage("You don't have enough space in your inventory.") + } + } + } + + + val Druidic_Mage_Top = (ShopItem(12894, 300, 1)) + val Druidic_Mage_Hood = (ShopItem(12887, 100, 1)) + val Druidic_Mage_Bottom = (ShopItem(12901, 200, 1)) + val Combat_Robe_Top = (ShopItem(12971, 150, 1)) + val Combat_Robe_Hood = (ShopItem(12964, 50, 1)) + val Combat_Robe_Bottom = (ShopItem(12978, 100, 1)) + val Battle_Robe_Hood = (ShopItem(12866, 250, 1)) + val Battle_Robe_Top = (ShopItem(12873, 1500, 1)) + val Battle_Robe_Bottom = (ShopItem(12880, 1000, 1)) + val Green_Coif = (ShopItem(12936, 150, 1)) + val Blue_Coif = (ShopItem(12943, 200, 1)) + val Red_Coif = (ShopItem(12950, 300, 1)) + val Black_Coif = (ShopItem(12957, 500, 1)) + val Bronze_Gaunt = (ShopItem(12985, 15, 1)) + val Iron_Gaunt = (ShopItem(12988, 30, 1)) + val Steel_Gaunt = (ShopItem(12991, 50, 1)) + val Black_Gaunt = (ShopItem(12994, 75, 1)) + val Mithril_Gaunt = (ShopItem(12997, 100, 1)) + val Adamant_Gaunt = (ShopItem(13000, 150, 1)) + val Rune_Gaunt = (ShopItem(13003, 200, 1)) + val Dragon_Gaunt = (ShopItem(13006, 300, 1)) + val Addy_Spike = (ShopItem(12908, 50, 1)) + val Addy_Beserk = (ShopItem(12915, 100, 1)) + val Rune_Spike = (ShopItem(12922, 200, 1)) + val Rune_Beserk = (ShopItem(12929, 300, 1)) + val Air_Gloves = (ShopItem(12863, 75, 1)) + val Water_Gloves = (ShopItem(12864, 75, 1)) + val Earth_Gloves = (ShopItem(12865, 75, 1)) + val Irit_Gloves = (ShopItem(12856, 75, 1)) + val Avantoe_Gloves = (ShopItem(12857, 100, 1)) + val Kwuarm_Gloves = (ShopItem(12858, 200, 1)) + val Cadantine_Gloves = (ShopItem(12859, 200, 1)) + val Swordfish_Gloves = (ShopItem(12860, 200, 1)) + val Shark_Gloves = (ShopItem(12861, 200, 1)) + val Dragon_Gloves = (ShopItem(12862, 200, 1)) +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/Interaction.java b/Server/src/main/java/Server/core/game/interaction/Interaction.java new file mode 100644 index 000000000..47ef367cf --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/Interaction.java @@ -0,0 +1,339 @@ +package core.game.interaction; + +import core.game.container.Container; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.player.FaceLocationFlag; +import core.net.packet.PacketRepository; +import core.net.packet.context.InteractionOptionContext; +import core.net.packet.out.InteractionOption; + +/** + * Handles interaction between nodes. + * @author Emperor + */ +public class Interaction { + + /** + * The current options. + */ + private Option[] options = new Option[8]; + + /** + * The player. + */ + private final Node node; + + /** + * If the interaction option handlers have been initialized. + */ + private boolean initialized; + + /** + * Constructs a new {@code Interaction} {@code Object}. + * @param node The node reference. + */ + public Interaction(Node node) { + this.node = node; + } + + /** + * Sends the current option. + * @param node The node. + * @param index The index. + * @param name The option name. + */ + public static void sendOption(Node node, int index, String name) { + if (!(node instanceof Player)) { + return; + } + PacketRepository.send(InteractionOption.class, new InteractionOptionContext((Player) node, index, name)); + } + + /** + * Handles an interaction option being clicked. + * @param player The player using the option. + * @param option The option used. + */ + public void handle(final Player player, final Option option) { + try { + if (player.getLocks().isInteractionLocked() || option == null) { + return; + } + player.debug("Received interaction request " + option.getName()); + boolean hasHandler = option.getHandler() != null; + String pulseType = "interaction:" + option.getName() + ":" + node.hashCode(); + boolean walk = hasHandler && option.getHandler().isWalk(); + if (!walk && hasHandler && option.getHandler().isWalk(player, node)) { + walk = true; + } + if (!hasHandler || walk) { + handleWalkOption(player, option, pulseType); + } else if (hasHandler) { + player.debug("Option handler being used=" + option.getHandler().getClass().getSimpleName()); + handleDefaultOption(player, option, pulseType); + } else { + player.getPulseManager().runUnhandledAction(player, pulseType); + } + } catch (Exception e){ + e.printStackTrace(); + SystemLogger.logErr(this.getClass().getName() + e.getMessage()); + } + } + + /** + * Handles an item option. + * @param player The player. + * @param option The option. + * @param container The container the item is in. + */ + public void handleItemOption(final Player player, final Option option, final Container container) { + if (player.getLocks().isInteractionLocked()) { + return; + } + player.getPulseManager().clear("interaction:" + option.getName() + ":" + node.hashCode()); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + try { + if (player.getLocks().isInteractionLocked() || player.getZoneMonitor().interact(node, option)) { + return true; + } + if (option.getHandler() == null || !option.getHandler().handle(player, node, option.getName().toLowerCase())) { + player.getPacketDispatch().sendMessage("Nothing interesting happens."); + } + if (option != null && option.getHandler() != null) { + player.debug("Using item handler " + option.getHandler().getClass().getSimpleName()); + } + } catch (Exception e){ + e.printStackTrace(); + SystemLogger.logErr(this.getClass().getName() + e.getMessage()); + } + return true; + } + }); + } + + /** + * Handles an invalid interaction. + * @param player The player. + * @param node The node to interact with. + */ + public static void handleInvalidInteraction(final Player player, final Node node, final Option option) { + if (node == null) { + return; + } + if (node.getLocation() != null) { + if (player.getLocks().isMovementLocked()) { + return; + } + player.getPulseManager().run(new MovementPulse(player, node) { + @Override + public boolean pulse() { + try { + player.faceLocation(FaceLocationFlag.getFaceLocation(player, node)); + if (player.getLocks().isInteractionLocked() || player.getZoneMonitor().interact(node, option)) { + return true; + } + player.getPacketDispatch().sendMessage("Nothing interesting happens."); + } catch (Exception e){ + e.printStackTrace(); + SystemLogger.logErr(this.getClass().getName() + e.getMessage()); + } + return true; + } + }, "interaction:invalid:" + node.hashCode()); + } else { + player.getPulseManager().runUnhandledAction(player, "interaction:invalid:" + node.hashCode()); + } + } + + /** + * Handles an option requiring the player to walk to the node. + * @param player The player. + * @param option The option. + * @param pulseType The pulse type. + */ + private void handleWalkOption(final Player player, final Option option, String pulseType) { + if (node.getLocation() == null) { + player.getPulseManager().runUnhandledAction(player, pulseType); + return; + } + if (player.getLocks().isMovementLocked()) { + player.getPulseManager().clear(pulseType); + return; + } + player.getPulseManager().run(new MovementPulse(player, node, option.getHandler()) { + @Override + public boolean pulse() { + try { + player.faceLocation(FaceLocationFlag.getFaceLocation(player, node)); + if (player.getLocks().isInteractionLocked() || player.getZoneMonitor().interact(node, option)) { + return true; + } + if (option == null || option.getHandler() == null || !option.getHandler().handle(player, node, option.getName().toLowerCase())) { + player.getPacketDispatch().sendMessage("Nothing interesting happens."); + } + } catch (Exception e){ + e.printStackTrace(); + SystemLogger.logErr(this.getClass().getName() + e.getMessage()); + } + return true; + } + }, pulseType); + } + + /** + * Handles a default option. + * @param player The player. + * @param option The option. + * @param pulseType The pulse type. + */ + private void handleDefaultOption(final Player player, final Option option, String pulseType) { + if (!option.getHandler().isDelayed(player)) { + if (player.getZoneMonitor().interact(node, option)) { + return; + } + player.getProperties().getCombatPulse().stop(); + if (!option.getHandler().handle(player, node, option.getName().toLowerCase())) { + player.getPulseManager().runUnhandledAction(player, pulseType); + } + return; + } + player.getPulseManager().run(new Pulse(1, player, node) { + @Override + public boolean pulse() { + if (player.getLocks().isInteractionLocked() || player.getZoneMonitor().interact(node, option)) { + return true; + } + if (!option.getHandler().handle(player, node, option.getName().toLowerCase())) { + player.getPacketDispatch().sendMessage("Nothing interesting happens."); + } + return true; + } + }, pulseType); + } + + /** + * Initializes the interaction options. + * @param nodeId The node id. + * @param names The option names. + */ + public void init(int nodeId, String... names) { + options = new Option[names.length]; + for (int i = 0; i < options.length; i++) { + String name = names[i]; + if (name != null && !name.equals("null")) { + set(new Option(name, i).setHandler(Option.defaultHandler(node, nodeId, name))); + } + continue; + } + } + + /** + * Sets the default option handlers (if not yet initialized). + */ + public void setDefault() { + if (initialized) { + return; + } + if (node instanceof Player) { + for (int i = 0; i < options.length; i++) { + remove(i); + } + set(Option._P_FOLLOW); + set(Option._P_TRADE); + set(Option._P_ASSIST); + } else if (node instanceof NPC) { + NPC npc = (NPC) node; + init(npc.getId(), npc.getDefinition().getOptions()); + } else if (node instanceof GameObject) { + GameObject object = (GameObject) node; + init(object.getId(), object.getDefinition().getOptions()); + } else if (node instanceof Item) { + Item item = (Item) node; + if (item.getLocation() != null) { + init(item.getId(), item.getDefinition().getGroundOptions()); + } else { + init(item.getId(), item.getDefinition().getInventoryOptions()); + } + } else { + throw new IllegalStateException("Unsupported node type - " + node); + } + initialized = true; + } + + /** + * Sets a new option. + * @param option The option. + */ + public void set(Option option) { + options[option.getIndex()] = option; + sendOption(node, option.getIndex(), option.getName()); + } + + /** + * Removes an option. + * @return {@code True} if the option got removed, {@code false} if the + * option wasn't set. + */ + public boolean remove(Option option) { + if (options[option.getIndex()] == option) { + remove(option.getIndex()); + return true; + } + return false; + } + + /** + * Removes an option. + * @param index The index. + */ + public void remove(int index) { + if (options[index] == null) { + return; + } + options[index] = null; + sendOption(node, index, "null"); + } + + /** + * Gets the option on the requested slot. + * @param index The slot index. + * @return The option on that slot, or {@code null} if there was no option. + */ + public Option get(int index) { + return options[index]; + } + + /** + * Gets the options. + * @return The options. + */ + public Option[] getOptions() { + return options; + } + + /** + * Gets the initialized value. + * @return The initialized. + */ + public boolean isInitialized() { + return initialized; + } + + /** + * Sets the initialized value. + * @param initialized The initialized to set. + */ + public void setInitialized(boolean initialized) { + this.initialized = initialized; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/ItemOnBankBooth.kt b/Server/src/main/java/Server/core/game/interaction/ItemOnBankBooth.kt new file mode 100644 index 000000000..3360355ca --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/ItemOnBankBooth.kt @@ -0,0 +1,51 @@ +package core.game.interaction + +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.plugin.Plugin + +class ItemOnBankBooth : UseWithHandler(0) { + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + player.pulseManager.run(object : MovementPulse(player, event.usedWith, DestinationFlag.OBJECT) { + override fun pulse(): Boolean { + return handleNote(event) + } + }, "movement") + return true + } + + fun handleNote(event: NodeUsageEvent?): Boolean { + event ?: return false + val item = event.usedItem + val player = event.player + if (item.noteChange != item.id) { + if (item.definition.isUnnoted) { + val amount = player.inventory.getAmount(item.id) + player.inventory.remove(Item(item.id, amount)) + player.inventory.add(Item(item.noteChange, amount)) + } else { + var amount = item.amount + if (amount > player.inventory.freeSlots()) { + amount = player.inventory.freeSlots() + } + player.inventory.remove(Item(item.id, amount)) + player.inventory.add(Item(item.noteChange, amount)) + } + return true + } else { + player.sendMessage("This item can't be noted.") + return true + } + } + + override fun newInstance(arg: Any?): Plugin { + return this + } + + override fun nodeAllowed(nodeId: Int): Boolean { + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/MovementPulse.java b/Server/src/main/java/Server/core/game/interaction/MovementPulse.java new file mode 100644 index 000000000..67986c00a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/MovementPulse.java @@ -0,0 +1,387 @@ +package core.game.interaction; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.Point; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.net.packet.PacketRepository; +import core.net.packet.context.PlayerContext; +import core.net.packet.out.ClearMinimapFlag; + +import java.util.Deque; + +/** + * Handles a movement task. + * + * @author Emperor + */ +public abstract class MovementPulse extends Pulse { + + /** + * The moving entity. + */ + protected Entity mover; + + /** + * The destination node. + */ + protected Node destination; + + /** + * The destination's last location. + */ + private Location last; + + /** + * The pathfinder. + */ + private Pathfinder pathfinder; + + /** + * If running should be forced. + */ + private boolean forceRun; + + /** + * The option handler. + */ + private OptionHandler optionHandler; + + /** + * The use with handler. + */ + private UseWithHandler useHandler; + + /** + * The destination flag. + */ + private DestinationFlag destinationFlag; + + /** + * The location to interact from. + */ + private Location interactLocation; + + /** + * If the path couldn't be fully found. + */ + private boolean near; + + /** + * Constructs a new {@code MovementPulse} {@code Object}. + * + * @param mover The moving entity. + * @param destination The destination node. + */ + public MovementPulse(Entity mover, Node destination) { + this(mover, destination, null, false); + } + + /** + * Constructs a new {@code MovementPulse} {@code Object}. + * + * @param mover The moving entity. + * @param destination The destination node. + * @param forceRun If the entity is forced to run. + */ + public MovementPulse(Entity mover, Node destination, boolean forceRun) { + this(mover, destination, null, forceRun); + } + + /** + * Constructs a new {@code MovementPulse} {@code Object}. + * + * @param mover The moving entity. + * @param destination The destination node. + * @param pathfinder The pathfinder to use. + */ + public MovementPulse(Entity mover, Node destination, Pathfinder pathfinder) { + this(mover, destination, pathfinder, false); + } + + /** + * Constructs a new {@code MovementPulse} {@code Object}. + * + * @param mover The moving entity. + * @param destination The destination node. + * @param optionHandler The option handler used. + */ + public MovementPulse(Entity mover, Node destination, OptionHandler optionHandler) { + this(mover, destination, null, false); + this.optionHandler = optionHandler; + } + + /** + * Constructs a new {@code MovementPulse} {@code Object}. + * + * @param mover The moving entity. + * @param destination The destination node. + * @param useHandler The use with handler used. + */ + public MovementPulse(Entity mover, Node destination, UseWithHandler useHandler) { + this(mover, destination, null, false); + this.useHandler = useHandler; + } + + /** + * Constructs a new {@code MovementPulse} {@code Object}. + * + * @param mover The moving entity. + * @param destination The destination node. + * @param destinationFlag The destination flag. + */ + public MovementPulse(Entity mover, Node destination, DestinationFlag destinationFlag) { + this(mover, destination, null, false); + this.destinationFlag = destinationFlag; + } + + /** + * Constructs a new {@code MovementPulse} {@code Object}. + * + * @param mover The moving entity. + * @param destination The destination node. + * @param pathfinder The pathfinder to use. + * @param forceRun If the entity is forced to run. + */ + public MovementPulse(Entity mover, Node destination, Pathfinder pathfinder, boolean forceRun) { + super(1, mover, destination); + this.mover = mover; + this.destination = destination; + if (pathfinder == null) { + if (mover instanceof Player) { + this.pathfinder = Pathfinder.SMART; + } else { + this.pathfinder = Pathfinder.DUMB; + } + } else { + this.pathfinder = pathfinder; + } + this.forceRun = forceRun; + } + + @Override + public boolean update() { + mover.face(null); + if (mover == null || destination == null || mover.getViewport().getRegion() == null) { + return false; + } + + if (hasInactiveNode() || !mover.getViewport().getRegion().isActive()) { + stop(); + return true; + } + if (!isRunning()) { + return true; + } + findPath(); + if (mover.getLocation().equals(interactLocation)) { + try { + if (near || pulse()) { + if (mover instanceof Player) { + if (near) { + ((Player) mover).getPacketDispatch().sendMessage("I can't reach that."); + } + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext((Player) mover)); + } + stop(); + return true; + } + } catch (Exception e){ + e.printStackTrace(); + stop(); + } + } + return false; + } + + @Override + public void stop() { + super.stop(); + if (destination instanceof Entity) { + mover.face(null); + } + last = null; + } + + /** + * Finds a path to the destination, if necessary. + */ + public void findPath() { + if (mover instanceof NPC && mover.asNpc().isNeverWalks()) { + return; + } + boolean inside = isInsideEntity(mover.getLocation()); + if (last != null && last.equals(destination.getLocation()) && !inside) { + return; + } + Location loc = null; + if (destinationFlag != null) { + loc = destinationFlag.getDestination(mover, destination); + } + if (loc == null && optionHandler != null) { + loc = optionHandler.getDestination(mover, destination); + } + if (loc == null && useHandler != null) { + loc = useHandler.getDestination((Player) mover, destination); + } + if (loc == null && inside) { + loc = findBorderLocation(); + } + if (destination == null) { + return; + } + Path path = Pathfinder.find(mover, loc != null ? loc : destination, true, pathfinder); + near = !path.isSuccessful() || path.isMoveNear(); + interactLocation = mover.getLocation(); + if (!path.getPoints().isEmpty()) { + Point point = path.getPoints().getLast(); + interactLocation = Location.create(point.getX(), point.getY(), mover.getLocation().getZ()); + if (forceRun) { + mover.getWalkingQueue().reset(forceRun); + } else { + mover.getWalkingQueue().reset(); + } + int size = path.getPoints().toArray().length; + Deque points = path.getPoints(); + for (int i = 0; i < size; i++) { + point = path.getPoints().pop(); + mover.getWalkingQueue().addPath(point.getX(), point.getY()); + if (destination instanceof Entity) { + mover.face((Entity) destination); + } else { + mover.face(null); + } + } + } + last = destination.getLocation(); + } + + /** + * Finds the closest location next to the node. + * + * @return The location to walk to. + */ + private Location findBorderLocation() { + int size = destination.size(); + Location centerDest = destination.getLocation().transform(size >> 1, size >> 1, 0); + Location center = mover.getLocation().transform(mover.size() >> 1, mover.size() >> 1, 0); + Direction direction = Direction.getLogicalDirection(centerDest, center); + Location delta = Location.getDelta(destination.getLocation(), mover.getLocation()); + main: + for (int i = 0; i < 4; i++) { + int amount = 0; + switch (direction) { + case NORTH: + amount = size - delta.getY(); + break; + case EAST: + amount = size - delta.getX(); + break; + case SOUTH: + amount = mover.size() + delta.getY(); + break; + case WEST: + amount = mover.size() + delta.getX(); + break; + default: + return null; + } + for (int j = 0; j < amount; j++) { + for (int s = 0; s < mover.size(); s++) { + switch (direction) { + case NORTH: + if (!direction.canMove(mover.getLocation().transform(s, j + mover.size(), 0))) { + direction = Direction.get((direction.toInteger() + 1) & 3); + continue main; + } + break; + case EAST: + if (!direction.canMove(mover.getLocation().transform(j + mover.size(), s, 0))) { + direction = Direction.get((direction.toInteger() + 1) & 3); + continue main; + } + break; + case SOUTH: + if (!direction.canMove(mover.getLocation().transform(s, -(j + 1), 0))) { + direction = Direction.get((direction.toInteger() + 1) & 3); + continue main; + } + break; + case WEST: + if (!direction.canMove(mover.getLocation().transform(-(j + 1), s, 0))) { + direction = Direction.get((direction.toInteger() + 1) & 3); + continue main; + } + break; + default: + return null; + } + } + } + Location location = mover.getLocation().transform(direction, amount); + return location; + } + return null; + } + + /** + * Checks if the mover is standing on an invalid position. + * + * @param l The location. + * @return {@code True} if so. + */ + private boolean isInsideEntity(Location l) { + if (!(destination instanceof Entity)) { + return false; + } + if (((Entity) destination).getWalkingQueue().isMoving()) { + return false; + } + Location loc = destination.getLocation(); + int size = destination.size(); + return Pathfinder.isStandingIn(l.getX(), l.getY(), mover.size(), mover.size(), loc.getX(), loc.getY(), size, size); + } + + /** + * Gets the forceRun. + * + * @return The forceRun. + */ + public boolean isForceRun() { + return forceRun; + } + + /** + * Sets the forceRun. + * + * @param forceRun The forceRun to set. + */ + public void setForceRun(boolean forceRun) { + this.forceRun = forceRun; + } + + /** + * Sets the current destination. + * + * @param destination The destination. + */ + public void setDestination(Node destination) { + this.destination = destination; + } + + /** + * Sets the last location. + * + * @param last The last location. + */ + public void setLast(Location last) { + this.last = last; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/NodeUsageEvent.java b/Server/src/main/java/Server/core/game/interaction/NodeUsageEvent.java new file mode 100644 index 000000000..7f817034d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/NodeUsageEvent.java @@ -0,0 +1,95 @@ +package core.game.interaction; + +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a node use-with (other node) option. + * @author Emperor + */ +public final class NodeUsageEvent { + + /** + * The player. + */ + private final Player player; + + /** + * The component id. + */ + private final int componentId; + + /** + * The used node. + */ + private final Node used; + + /** + * The node we used the other node on. + */ + private final Node with; + + /** + * Constructs a new {@code NodeUsageEvent} {@code Object}. + * @param player The player. + * @param componentId The component id. + * @param used The used node. + * @param with The node the other node is used on. + */ + public NodeUsageEvent(Player player, int componentId, Node used, Node with) { + this.player = player; + this.componentId = componentId; + this.used = used; + this.with = with; + } + + /** + * Gets the base item. + * @return The base item. + */ + public Item getBaseItem() { + return with instanceof Item ? (Item) with : null; + } + + /** + * Gets the used item. + * @return The used item. + */ + public Item getUsedItem() { + return used instanceof Item ? (Item) used : null; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the componentId. + * @return The componentId. + */ + public int getComponentId() { + return componentId; + } + + /** + * Gets the used. + * @return The used. + */ + public Node getUsed() { + return used; + } + + /** + * The node the other node is used on. + * @return The node. + */ + public Node getUsedWith() { + return with; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/Option.java b/Server/src/main/java/Server/core/game/interaction/Option.java new file mode 100644 index 000000000..71932fa86 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/Option.java @@ -0,0 +1,125 @@ +package core.game.interaction; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.item.Item; +import core.game.node.object.GameObject; + +/** + * Represents an Interaction option. + * @author Emperor + */ +public final class Option { + + /** + * The player attack option. + */ + public static final Option _P_ATTACK = new Option("Attack", 0); + + /** + * The player follow option. + */ + public static final Option _P_FOLLOW = new Option("Follow", 2); + + /** + * The player trade option. + */ + public static final Option _P_TRADE = new Option("Trade with", 3); + + + public static final Option _P_EXAMINE = new Option("Examine", 7); + + /** + * The player assist option. + */ + public static final Option _P_ASSIST = new Option("Req Assist", 6); + + /** + * A null option. + */ + public static final Option NULL = new Option("null", 0); + + /** + * The option name. + */ + private final String name; + + /** + * The index. + */ + private final int index; + + /** + * The option handler. + */ + private OptionHandler handler; + + /** + * Constructs a new {@code Interaction} {@code Object}. + * @param name The name. + * @param index The index. + */ + public Option(String name, int index) { + this.name = name; + this.index = index; + } + + /** + * Gets the default option handler for the given name. + * @param node The node type that has this option. + * @param nodeId The id of the node. + * @param name The name of the option. + * @return The default option handler for this option. + */ + public static OptionHandler defaultHandler(Node node, int nodeId, String name) { + name = name.toLowerCase(); + if (node instanceof NPC) { + return NPCDefinition.getOptionHandler(nodeId, name); + } + if (node instanceof GameObject) { + return ObjectDefinition.getOptionHandler(nodeId, name); + } + if (node instanceof Item) { + return ItemDefinition.getOptionHandler(nodeId, name); + } + System.out.println("Unhandled node type " + node + "!"); + return null; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Gets the index. + * @return The index. + */ + public int getIndex() { + return index; + } + + /** + * Gets the handler. + * @return The handler. + */ + public OptionHandler getHandler() { + return handler; + } + + /** + * Sets the handler. + * @param handler The handler to set. + * @return This option instance. + */ + public Option setHandler(OptionHandler handler) { + this.handler = handler; + return this; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/OptionHandler.java b/Server/src/main/java/Server/core/game/interaction/OptionHandler.java new file mode 100644 index 000000000..5850d269b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/OptionHandler.java @@ -0,0 +1,93 @@ +package core.game.interaction; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.world.map.Location; +import core.plugin.Plugin; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles an interaction option. + * @author Emperor + */ +public abstract class OptionHandler implements Plugin { + + /** + * Handles the interaction option. + * @param player The player who used the option. + * @param node The node the player selected an option on. + * @param option The option selected. + * @return {@code True} if successful. + */ + public abstract boolean handle(Player player, Node node, String option); + + /** + * Checks if the option should be handled after 1 game tick. + * @param player The player. + * @return {@code True} if so. + */ + public boolean isDelayed(Player player) { + return true; + } + + /** + * Checks if it needs a walk.. + * @param node the node. + * @return true if so. + */ + public boolean isWalk(final Player player, final Node node) { + return false; + } + + /** + * Gets the walk. + * @return if a walk is required. + */ + public boolean isWalk() { + return true; + } + + /** + * Gets the custom destination for the node. + * @param n The moving node. + * @param node The node to walk to. + * @return The custom destination, or {@code null} if we should use the + * default destination. + */ + public Location getDestination(Node n, Node node) { + return null; + } + + /** + * Gets the valid children for the wrapper id. + * @param wrapper the wrapper id. + * @return the valid children. + */ + public int[] getValidChildren(int wrapper) { + final ObjectDefinition definition = ObjectDefinition.forId(wrapper); + final List list = new ArrayList<>(); + if (definition.getChildrenIds() == null) { + SystemLogger.logErr("Null child wrapper in option handler wrapperId=" + wrapper); + return new int[] { wrapper }; + } + for (int child : definition.getChildrenIds()) { + if (child != -1 && !list.contains(child)) { + list.add(child); + } + } + int[] array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/QCRepository.kt b/Server/src/main/java/Server/core/game/interaction/QCRepository.kt new file mode 100644 index 000000000..a32bf3759 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/QCRepository.kt @@ -0,0 +1,380 @@ +package core.game.interaction + +import core.cache.Cache +import core.cache.def.impl.ItemDefinition +import core.cache.def.impl.NPCDefinition +import core.cache.misc.buffer.ByteBufferUtils +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld.Pulser +import core.game.world.update.flag.context.ChatMessage +import core.game.world.update.flag.player.ChatFlag +import core.net.amsc.MSPacketRepository +import core.net.amsc.WorldCommunicator +import core.net.packet.`in`.QCPacketType +import core.game.node.entity.skill.Skills +import java.nio.ByteBuffer + + +/** + * Handles the sending of quick chat messages and string-replacement for specific messages. + * @author Ceikry + */ +//TODO: A lot of the menus defined in the massive arrays at the bottom need to be rearranged because the order they appear in the menu and the order they are actually in is quite different. Start clicking through the "can you cook me..." menu to see what I mean. +//TODO: I've done the groundwork, Please someone else take up the task of rearranging these menus +object QCRepository { + + val skillIDs = hashMapOf( + 0 to "Agility", + 1 to "Attack", + 2 to "Construction", + 3 to "Cooking", + 4 to "Crafting", + 5 to "Defence", + 6 to "Farming", + 7 to "Firemaking", + 8 to "Fishing", + 9 to "Fletching", + 10 to "Herblore", + 11 to "Hitpoints", + 12 to "Hunter", + 13 to "Thieving", + 14 to "Summoning", + 15 to "Strength", + 16 to "Smithing", + 19 to "Slayer", + 20 to "Runecrafting", + 21 to "Ranged", + 22 to "Prayer", + 23 to "Mining", + 24 to "Magic", + 25 to "Woodcutting" + ) + + private val quickChatIndex = Cache.getIndexes()[24] + + /** + * The entry method that connects to the other more specific methods + */ + @JvmStatic + fun sendQC(player: Player?, multiplier: Int?, offset: Int?, packetType: QCPacketType, selection_a_index: Int, selection_b_index: Int, forClan: Boolean){ + val index = getIndex(offset, multiplier) + player?.setAttribute("qc_offset", offset) //Slapping this in an attribute because it's only useful for one or two messages + val qcString = when(packetType){ + QCPacketType.SINGLE -> getSingleQC(player, index, selection_a_index) + QCPacketType.DOUBLE -> getDoubleQC(player, index, selection_a_index, selection_b_index) + QCPacketType.STANDARD -> getStandardQC(player, index) + else -> "" + } + + + if(forClan) { + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendClanMessage(player, qcString) + } else { + player?.communication?.clan?.message(player, qcString) + } + } else { + val ctx = ChatMessage(player, qcString, 0, qcString.length) + ctx.isQuickChat = true + Pulser.submit(object : Pulse(0, player) { + override fun pulse(): Boolean { + player!!.updateMasks.register(ChatFlag(ctx)) + return true + } + }) + } + } + + /** + * For standard quick chat messages with no string replacements + */ + @JvmStatic + fun getStandardQC(player: Player?, index: Int): String{ + var qcString = getQCString(index) + + //XP to next level + if (qcString.contains("to get my next")) { + val offset = player?.getAttribute("qc_offset", 0) ?: 0 + val skillName = skillIDs[offset - 103] + val skill = Skills.getSkillByName(skillName?.toUpperCase()) + val playerXP = player?.skills?.getExperience(skill) + val playerLevel = player?.skills?.getStaticLevel(skill) + val nextXP = player?.skills?.getExperienceByLevel(playerLevel?.plus(1) ?: 1) + qcString = qcString.replace("<", "${(nextXP?.minus(playerXP ?: 0.0) ?: 0.0).toInt()}") + } + + //My X level is + else if (qcString.contains("level is")) { + val skillName = qcString.split(" ")[1] + val skill = Skills.getSkillByName(skillName.toUpperCase()) + val level = player?.skills?.getStaticLevel(skill) + qcString = qcString.replace("<", level.toString()) + } + + //My current slayer assignment is + else if(qcString.contains("My current Slayer assignment is")){ + val amount = player?.slayer?.amount + val taskName = NPCDefinition.forId(player?.slayer?.task?.ids?.get(0) ?: 0).name.toLowerCase() + if(amount ?: 0 > 0){ + qcString = qcString.replace("complete", "$amount $taskName") + } + } + + return qcString + } + + + /** + * For Single-replacement quick chat messages with one replacement selection + */ + @JvmStatic + fun getSingleQC(player: Player?, index: Int, selectionIndex: Int): String{ + var qcString = getQCString(index) + + //Messages that include items + if ((qcString.contains("item") || qcString.contains("Can I buy your") || qcString.contains("What is the best world to buy") || qcString.contains("What is the best world to sell") || qcString.contains("Would you like to borrow") || qcString.contains("Could I please borrow") ) && qcString.contains("<") ){ + val itemName = ItemDefinition.forId(selectionIndex).name + qcString = qcString.replace("<", itemName) + } + + //Loan duration + else if (qcString.contains("I'd like the loan duration to be")){ + qcString = when(selectionIndex){ + 0 -> qcString.replace("<", "just until one of us logs out") + else -> qcString.replace("<", "${selectionIndex} hours") + } + } + + //Go to agility course / Try training your agility at + else if (qcString.contains("Let's go to Agility course:") || qcString.contains("Try training your Agility at:")){ + qcString = qcString.replace("<", AGILITY_COURSES[selectionIndex]) + } + + //Try training on + else if(qcString.contains("Try training on")){ + qcString = qcString.replace("<", TRAIN_MELEE_NPCS[selectionIndex]) + } + + //Try ranging + else if(qcString.contains("Try ranging")){ + qcString = qcString.replace("<", TRAIN_RANGE_NPCS[selectionIndex]) + } + + //flat-pack + else if(qcString.contains("flat-pack")){ + qcString = qcString.replace("<", FLATPAKS[selectionIndex]) + } + + //Cooking + else if(qcString.contains("I'm cooking") || qcString.contains("Would you please cook me") || qcString.contains("Try cooking")){ + qcString = qcString.replace("<", COOK_ITEMS[selectionIndex]) + } + + //Crafting + else if(qcString.contains("I am crafting") || qcString.contains("Try crafting") || qcString.contains("Would you please craft me")){ + qcString = qcString.replace("<", CRAFT_ITEMS[selectionIndex]) + } + + //Farming + else if(qcString.contains("I'm growing crop") || qcString.contains("Try growing crop")){ + qcString = qcString.replace("<", FARM_CROPS[selectionIndex]) + } + + //I'm burning logs... + else if(qcString.contains("I'm burning logs")){ + qcString = qcString.replace("<", FM_LOGS[selectionIndex]) + } + + //Try burning logs at + else if(qcString.contains("Try burning logs at")){ + qcString = qcString.replace("<", FM_LOCATIONS[selectionIndex]) + } + + //Fishing + else if(qcString.contains("I'm fishing") || qcString.contains("Would you please fish me") || qcString.contains("Try fishing for")){ + qcString = qcString.replace("<", FISH[selectionIndex]) + } + + //Fletching + else if(qcString.contains("I'm fletching") || qcString.contains("Try fletching") || qcString.contains("Would you please fetch me")){ + qcString = qcString.replace("<", FLETCH_ITEMS[selectionIndex]) + } + + //Herblore + else if(qcString.contains("I'm mixing potion") || qcString.contains("Would you please mix me a potion") || qcString.contains("Try mixing potion")){ + qcString = qcString.replace("<", HERB_POTIONS[selectionIndex]) + } + + //Herblore secondaries + else if(qcString.contains("Where can I get the secondary ingredient")){ + qcString = qcString.replace("<", HERB_SECONDARIES[selectionIndex]) + } + + //Hunter + else if(qcString.contains("Would you please hunt me") || qcString.contains("Try hunting")){ + qcString = qcString.replace("<", HUNTER_ANIMALS[selectionIndex]) + } + + //Casting spell + else if(qcString.contains("I'm casting spell") || qcString.contains("Would you please cast")){ + qcString = qcString.replace("<", MAGIC_SPELLS[selectionIndex]) + } + + //Spellbook + else if(qcString.contains("I am on spell book")){ + qcString = qcString.replace("<", MAGIC_BOOKS[selectionIndex]) + } + + //Mining ore + else if(qcString.contains("I'm mining ore")){ + qcString = qcString.replace("<", ORES[selectionIndex]) + } + + //Pickaxe using + else if(qcString.contains("I'm using a pick")){ + qcString = qcString.replace("<", PICKAXE_TYPES[selectionIndex]) + } + + //Try mining at + else if(qcString.contains("Try mining at")){ + qcString = qcString.replace("<", MINING_LOCATIONS[selectionIndex]) + } + + //Use your prayer + else if(qcString.contains("Use your prayer")){ + qcString = qcString.replace("<", PRAYERS[selectionIndex]) + } + + //i'm going to craft rune + else if(qcString.contains("I'm going to craft rune")){ + qcString = qcString.replace("<", RUNES[selectionIndex]) + } + + //try crafting runes at + else if(qcString.contains("Try crafting runes at")){ + qcString = qcString.replace("<", RC_LOCATIONS[selectionIndex]) + } + + //Slayer master in + else if(qcString.contains("You should use the Slayer master in")){ + qcString = qcString.replace("<", SLAYER_LOCATIONS[selectionIndex]) + } + + //Spare slayer equipment + else if(qcString.contains("Do you have spare Slayer equipment")){ + qcString = qcString.replace("<", SLAYER_EQUIPMENT[selectionIndex]) + } + + //familiars + else if(qcString.contains("I like the familiar") || qcString.contains("I can summon up to")){ + qcString = qcString.replace("<", FAMILIARS[selectionIndex]) + } + + //charm droppers + else if(qcString.contains("Good charm droppers are")){ + qcString = qcString.replace("<", CHARM_DROPPERS[selectionIndex]) + } + + //Thieving + else if(qcString.contains("Try thieving from")){ + qcString = qcString.replace("<", THIEVE_TARGETS[selectionIndex]) + } + + //Axe made of + else if(qcString.contains("I'm using a woodcutting axe made")){ + qcString = qcString.replace("<", AXE_TYPES[selectionIndex]) + } + + //Try training woodcutting at + else if(qcString.contains("Try training Woodcutting at")){ + qcString = qcString.replace("<", WOODCUTTING_LOCATIONS[selectionIndex]) + } + + //Nice level in + else if(qcString.contains("Nice level in")){ + qcString = qcString.replace("<", SKILL_NAMES[selectionIndex]) + } + + + return qcString + } + + + /** + * For Double-replacement quick chat messages with 2 selection replacements. + */ + @JvmStatic + fun getDoubleQC(player: Player?, index: Int, selection_a_index: Int, selection_b_index: Int): String{ + var qcString = getQCString(index) + + //Giving directions: That is _ of _ + if(qcString.contains("That is < of <")){ + qcString = qcString.replaceFirst("<", DIRECTIONS[selection_a_index]) + qcString = qcString.replaceFirst("<", DIR_LOCATIONS[selection_b_index]) + } + + //Smithing + else if(qcString.contains("I am smithing") || qcString.contains("Try smithing") || qcString.contains("Would you please smith me")){ + qcString = qcString.replaceFirst("<", SMITHING_BARTYPES[selection_a_index]) + qcString = qcString.replaceFirst("<", SMITHING_PRODUCTS[selection_b_index]) + } + + return qcString + } + + private fun getIndex(offset: Int?, multiplier: Int?): Int{ + offset ?: return 0 + multiplier ?: return 0 + //for some reason it subtracts only from 512 if it's negative (Jagex idk) or 256 if type is 0 but not from 768 if type is 3? + return if(offset >= 0) { + (256 * multiplier) + offset + }else { + when(multiplier){ + 0 -> 256 + offset + 1 -> 512 + offset + 2 -> 768 + offset + else -> 1024 + offset + } + } + } + + private fun getQCString(index: Int): String{ + return ByteBufferUtils.getString(ByteBuffer.wrap(QCRepository.quickChatIndex.getFileData(1, index))) + } +} + +private val AGILITY_COURSES: Array = arrayOf("Agility Pyramid", "Ape Atoll", "Barbarian Outpost", "Brimhaven Agility Arena", "Dorgesh-Kaan", "Gnome Stronghold Course", "Penguin Course", "Werewolf Agility Course", "Wilderness Course", "Gnome Ball", "Werewolf Skullball") +private val TRAIN_MELEE_NPCS: Array = arrayOf("black demons", "blue dragons", "chickens", "cows", "cyclopes", "dagannoths", "experiments", "fire giants", "goblins", "guards", "hill giants", "ice giants", "lesser demons", "moss giants", "Slayer creatures") +private val TRAIN_RANGE_NPCS: Array = arrayOf("barbarians", "black demons", "blue dragons", "chickens", "cows", "dark wizards", "dwarves", "fire giants", "goblins", "guards", "hill giants", "lesser demons", "moss giants", "rats", "zombies") +private val FLATPAKS: Array = arrayOf("Asgarnian Ale barrel", "beer barrel", "carved oak bench", "carved oak dining table", "carved oak magic wardrobe", "carved teak bench", "carved teak magic wardrobe", "carved teak table", "Chef's Delight barrel", "cider barrel", "crude wooden chair", "Dragon Bitter barrel", "fancy teak dresser", "four-poster bed", "gilded bench", "gilded cape rack", "gilded clock", "gilded dresser", "gilded four-poster bed", "gilded magic wardrobe", "gilded wardrobe", "Greenman's Ale barrel", "large oak bed", "large teak bed", "magical cape rack", "mahogany armchair", "mahogany armour case", "mahogany bench", "mahogany bookcase", "mahogany cape rack", "mahogany costume box", "mahogany dresser", "mahogany magic wardrobe", "mahogany table", "mahogany toy box", "mahogany treasure chest", "mahogany wardrobe", "marble cape rack", "marble magic wardrobe", "oak armchair", "oak armour case", "oak bed", "oak bench", "oak bookcase", "oak cape rack", "oak chair", "oak clock", "oak costume box", "oak dining table", "oak drawers", "oak dresser", "oak kitchen table", "oak magic wardrobe", "oak shaving stand", "oak toy box", "oak treasure chest", "oak wardrobe", "opulent table", "rocking chair", "shaving stand", "shoe box", "teak armchair", "teak armour case", "teak bed", "teak cape rack", "teak clock", "teak costume box", "teak dining bench", "teak drawers", "teak dresser", "teak kitchen table", "teak magic wardrobe", "teak table", "teak toy box", "teak treasure chest", "teak wardrobe", "wooden bed", "wooden bench", "wooden bookcase", "wooden chair", "wooden dining table", "wooden kitchen table") +private val COOK_ITEMS: Array = arrayOf("admiral pie", "anchovies", "anchovy pizza", "apple pie", "bass", "bear meat", "bread", "bird meat", "cake", "cave eel", "cheese and tomato batta", "chicken", "chilli con carne", "chilli potato", "choc chip crunchies", "chocolate bomb", "chocolate cake", "chompy", "cod", "cooked pawya", "cooked rabbit", "crab meat", "crayfish", "curry", "egg and tomato", "egg and tomato potato", "fat snail", "fish pie", "fishcake", "fried mushrooms", "fried onions", "fruit batta", "garden pie", "herring", "jubbly", "karambwan", "karambwanji", "lava eel", "lean snail", "leaping salmon", "leaping sturgeon", "leaping trout", "lobster", "mackerel", "manta ray", "meat", "meat pie", "meat pizza", "monkfish", "mud pie", "mushroom and onion", "mushroom and onion potato", "oomlie wrap", "pawya", "pike", "pineapple pizza", "pitta bread", "plain pizza", "potato", "rabbit", "rainbow fish", "rat meat", "redberry pie", "roasted beast meat", "roasted rabbit", "baked potato with butter", "salmon", "sardine", "baked potato", "scrambled egg", "sea turtle", "seaweed", "shark", "shrimp", "slimy eel", "spice crunchies", "spicy meat", "spicy sauce", "spider on a stick", "stew", "summer pie", "sweetcorn", "swordfish", "tangled toads' legs", "thin snail", "toad batta", "toad crunchies", "trout", "tuna", "tuna and corn", "tuna and corn potato", "ugthanki kebab", "ugthanki meat", "vegball", "vegetable ball", "vegetable batta", "wild pie", "worm batta", "worm crunchies", "worm hole") +private val CRAFT_ITEMS: Array = arrayOf("air battlestaves", "balls of wool", "baskets", "beer glasses", "black dragonhide bodies", "black dragonhide chaps", "black dragonhide vambraces", "black spiked vambraces", "blue dragonhide bodies", "blue dragonhide chaps", "blue dragonhide vambraces", "blue spiked vambraces", "bowls", "bowstrings", "bullseye lanterns", "candle lanterns", "cloth", "coifs", "crossbow strings", "diamond amulets", "diamond bracelets", "diamond necklaces", "diamond rings", "diamonds", "Dorgeshuun light orbs", "dragonstone amulets", "dragonstone bracelets", "dragonstone necklaces", "dragonstone rings", "dragonstones", "earth battlestaves", "emerald amulets", "emerald bracelets", "emerald necklaces", "emerald rings", "emeralds", "feather headdresses", "fire battlestaves", "fishbowls", "fremennik round shields", "glass orbs", "gold amulets", "gold bracelets", "gold necklaces", "gold rings", "green dragonhide bodies", "green dragonhide chaps", "green dragonhide vambraces", "green spiked vambraces", "hard leather bodies", "holy symbols", "leather bodies", "leather boots", "leather chaps", "leather cowls", "leather gloves", "leather vambraces", "lightning conductors", "limestone bricks", "magic string", "oil lamps", "oil lanterns", "onyx", "onyx amulets", "onyx bracelets", "onyx necklaces", "onyx rings", "pie dishes", "plant pots", "pot lids", "pots", "red dragonhide bodies", "red dragonhide chaps", "red dragonhide vambraces", "red spiked vambraces", "rope", "rubies", "ruby amulets", "ruby bracelets", "ruby necklaces", "ruby rings", "sacks", "sapphire amulets", "sapphire bracelets", "sapphire necklaces", "sapphire rings", "sapphires", "silver bolts", "silver sickles", "snakeskin bandannas", "snakeskin bodies", "snakeskin boots", "snakeskin chaps", "snakeskin vambraces", "snelms", "spiked vambraces", "studded bodies", "studded leather chaps", "tiaras", "unholy symbols", "unpowered orbs", "vials", "water battlestaves", "yak-hide bodies", "yak-hide legs") +private val FARM_CROPS: Array = arrayOf("apples", "Asgarnian hops", "avantoe", "bananas", "barley", "bittercap mushrooms", "cabbages", "cacti", "cadantine", "cadavaberries", "calquats", "coconuts", "curry leaves", "deadly nightshade", "dwarf weed", "dwellberries", "evil turnips", "goutweed", "guam", "hammerstone hops", "harralander", "irit", "jade vine", "jangerberries", "jute fiber", "Krandorian hops", "kwuarm", "lantadyme", "limpwurt roots", "magic trees", "maple trees", "marigolds", "marrentill", "nasturtium", "oak trees", "onions", "oranges", "papayas", "pineapples", "poison ivy berries", "potatoes", "ranarr", "redberries", "rosemary", "snapdragon", "spirit trees", "spirit weed", "strawberries", "sweetcorn", "tarromin", "toadflax", "tomatoes", "torstol", "watermelons", "whiteberries", "wildblood hops", "willow trees", "woad leaves", "Yanillian hops", "yew trees") +private val FM_LOGS: Array = arrayOf("achey", "arctic pine", "eucalyptus", "logs", "magic", "mahogany", "maple", "oak", "teak", "willow", "yew") +private val FM_LOCATIONS: Array = arrayOf("Draynor Village", "Falador east bank", "Fishing Colony", "Oo'glog", "Port Phasmatys", "Yanille") +private val FISH: Array = arrayOf("anchovies", "bass", "caskets", "cave eel", "cod", "crayfish", "frog spawn", "herring", "karambwan", "karambwanji", "lava eel", "leaping salmon", "leaping sturgeon", "leaping trout", "lobster", "mackerel", "manta ray", "monkfish", "oysters", "pike", "rainbow fish", "salmon", "sardine", "sea turtle", "seaweed", "shark", "shrimp", "slimy eel", "swordfish", "trout", "tuna") +private val FLETCH_ITEMS: Array = arrayOf("adamant arrows", "adamant bolts", "adamant brutal arrows", "adamant crossbows", "adamant darts", "arrow shafts", "barbed bolts", "black brutal arrows", "blurite bolts", "blurite crossbows", "bronze arrows", "bronze bolts", "bronze brutal arrows", "bronze crossbows", "bronze darts", "composite ogre bows", "crossbow stocks", "diamond bolts", "dragon arrows", "dragon darts", "dragonstone bolts", "emerald bolts", "flighted ogre arrows", "headless arrows", "iron arrows", "iron bolts", "iron brutal arrows", "iron crossbows", "iron darts", "jade bolts", "longbows", "magic longbows", "magic shortbows", "mahogany crossbow stocks", "maple crossbow stocks", "maple longbows", "maple shortbows", "mithril arrows", "mithril bolts", "mithril brutal arrows", "mithril crossbows", "mithril darts", "mithril grapples", "oak crossbow stocks", "oak longbows", "oak shortbows", "ogre arrow shafts", "ogre arrows", "onyx bolts", "opal bolts", "pearl bolts", "red topaz bolts", "ruby bolts", "rune arrows", "rune bolts", "rune brutal arrows", "rune crossbows", "rune darts", "sapphire bolts", "shortbows", "silver bolts", "steel arrows", "steel bolts", "steel brutal arrows", "steel crossbows", "steel darts", "teak crossbow stocks", "willow crossbow stocks", "willow longbows", "willow shortbows", "yew crossbow stocks", "yew longbows", "yew shortbows") +private val HERB_POTIONS: Array = arrayOf("Agility potion", "Anti fire-breath potion", "Antipoison", "Attack potion", "Blamish oil", "Combat potion", "Defence potion", "Energy potion", "Fishing potion", "Guthix Balance", "Hunter potion", "Magic essence potion", "Magic potion", "Prayer restore", "Ranging potion", "Relicym's Balm", "Restore potion", "Sanfew Serum", "Saradomin Brew", "Strength potion", "Summoning potion", "Super antipoison", "Super antipoison+", "Super antipoison++", "Super Attack potion", "Super Defence potion", " Super energy potion", "Super fishing explosive", "Super restore potion", "Super Strength potion", "Weapon poison", "Weapon poison+", "Weapon poison++", "Zamorak Brew") +private val HERB_SECONDARIES: Array = arrayOf("blamish snail slime", "cactus spine", "chocolate dust", "cockatrice egg", "crushed nest", "deadly nightshade", "eye of newt", "garlic", "ground blue dragon scale", "ground goat's horn", "ground gorak claw", "ground unicorn horn", "jangerberries", "kebbit teeth dust", "limpwurt root", "magic tree roots", "Mort Myre fungi", "nail beast nails", "poison ivy berries", "potato cactus", "red spiders' eggs", "rubium", "silver dust", "snake weed", "snape grass", "toad's legs", "white berries", "wine of Zamorak", "yew roots") +private val HUNTER_ANIMALS: Array = arrayOf("baby impling", "barbtailed kebbit", "black salamander", "black warlock", "cerulean twitch", "chinchompa", "common kebbit", "copper longtail", "crimson swift", "dark kebbit", "dashing kebbit", "desert devil", "dragon impling", "earth impling", "eclectic impling", "essence impling", "Feldip weasel", "ferret", "golden warbler", "gourmet impling", "grenwall", "horned graahk", "imp", "magpie impling", "nature impling", "ninja impling", "orange salamander", "pawya", "polar kebbit", "prickly kebbit", "rabbit", "razorbacked kebbit", "red chinchompa", "red salamander", "ruby harvest", "sabretooth kebbit", "sabretooth kyatt", "sapphire glacialis", "snowy knight", "spined larupia", "spotted kebbit", "swamp lizard", "tropical wagtail", "wild kebbit", "young impling") +private val MAGIC_SPELLS: Array = arrayOf("Annakarl Teleport", "Ape Atoll Teleport", "Ardougne Teleport", "Bake Pie", "Barbarian Teleport", "Bind", "Blood Barrage", "Blood Blitz", "Blood Burst", "Blood Rush", "Bones to Bananas", "Bones to Peaches", "Boost Potion Share", "Bounty Locate", "Camelot Teleport", "Carrallangar Teleport", "Catherby Teleport", "Charge", "Charge Air Orb", "Charge Earth Orb", "Charge Fire Orb", "Charge Water Orb", "Claws of Guthix", "Confuse", "Crumble Undead", "Cure Group", "Cure Me", "Cure Other", "Cure Plant", "Curse", "Dareeyak Teleport", "Dream", "Earth Blast", "Earth Bolt", "Earth Strike", "Earth Wave", "Enchant 1 - Sapphire", "Enchant 2 - Emerald", "Enchant 3 - Ruby", "Enchant 4 - Diamond", "Enchant 5 - Dragonstone", "Enchant 6 - Onyx", "Enchant Bolt", "Energy Transfer", "Enfeeble", "Entangle", "Falador Teleport", "Fertilise Soil", "Fire Blast", "Fire Bolt", "Fire Strike", "Fire Wave", "Fishing Guild Teleport", "Flames of Zamorak", "Ghorrock Teleport", "Heal Group", "Heal Other", "High Level Alchemy", "Home Teleport", "House Teleport", "Humidify", "Hunter Kit", "Iban Blast", "Ice Barrage", "Ice Blitz", "Ice Burst", "Ice Plateau Teleport", "Ice Rush", "Kharyll Teleport", "Khazard Teleport", "Lassar Teleport", "Low Level Alchemy", "Lumbridge Teleport", "Magic Dart", "Magic Imbue", "Monster Examine", "Moonclan Teleport", "NPC Contact", "Ourania Teleport", "Paddewwa Teleport", "Plank Make", "Saradomin Strike", "Senntisten Teleport", "Shadow Barrage", "Shadow Blitz", "Shadow Burst", "Shadow Rush", "Smoke Barrage", "Smoke Blitz", "Smoke Burst", "Smoke Rush", "Snare", "Spellbook Swap", "Stat Restore Pot Share", "Stat Spy", "String Jewellery", "Stun", "Superglass Make", "Superheat Item", "Tele Group Barbarian", "Tele Group Catherby", "Tele Group Fishing Guild", "Tele Group Ice Plateau", "Tele Group Khazard", "Tele Group Moonclan", "Tele Group Waterbirth", "Telegrab", "Teleother Camelot", "Teleother Falador", "Teleother Lumbridge", "Trollheim Teleport", "Varrock Teleport", "Vengeance", "Vengeance Other", "Vulnerability", "Watchtower Teleport", "Water Blast", "Water Bolt", "Water Strike", "Water Wave", "Waterbirth Teleport", "Weaken", "Wind Blast", "Wind Bolt", "Wind Strike", "Wind Wave") +private val MAGIC_BOOKS: Array = arrayOf("Standard", "Ancients", "Lunar") +private val ORES: Array = arrayOf("adamantite", "blurite", "clay", "coal", "copper", "elemental", "gold", "granite", "iron", "limestone", "mithril", "obsidian", "pure essence", "rubium", "rune essence", "runite", "sandstone", "silver", "tin") +private val MINING_LOCATIONS: Array = arrayOf("Ardougne south", "Barbarian village", "Brimhaven north-west", "Brimhaven south-west", "Brimhaven volcano gold mine", "Coal Trucks", "Crafting Guild", "Crandor Isle", "Dorgeshuun mine", "Dwarven Mine", "East of Ardougne", "Edgeville", "Edgeville dungeon mine", "Elemental Workshop", "Fremennik Isles mine", "Grand Tree", "Haunted Mine", "Heroes' Guild", "Ice Caves", "Keldagrim", "Kharid Scorpion chasm", "Lumbridge Caves", "Lumbridge swamp", "Lunar Isle", "Mining Guild", "North of Yanille", "Piscatoris", "Port Khazard", "Rimmington", "Shilo Village gem mine", "TzHaar City", "Varrock south-east", "Varrock south-west", "Wilderness Hobgoblins' mine", "Wilderness Lava Maze", "Wilderness Pirates' mine", "Wilderness runite mine") +private val PRAYERS: Array = arrayOf("Burst of Strength", "Chivalry", "Clarity of Thought", "Eagle Eye", "Hawk Eye", "Improved Reflexes", "Incredible Reflexes", "Mystic Lore", "Mystic Might", "Mystic Will", "Piety", "Protect from Magic", "Protect from Melee", "Protect from Missiles", "Protect from Summoning", "Protect Item", "Rapid Heal", "Rapid Restore", "Redemption", "Retribution", "Rock Skin", "Sharp Eye", "Smite", "Steel Skin", "Superhuman Strength", "Thick Skin", "Ultimate Strength") +private val RUNES: Array = arrayOf("air runes", "astral runes", "blood runes", "body runes", "chaos runes", "cosmic runes", "death runes", "dust runes", "earth runes", "fire runes", "lava runes", "law runes", "mind runes", "mist runes", "mud runes", "nature runes", "smoke runes", "soul runes", "steam runes", "water runes") +private val RC_LOCATIONS: Array = arrayOf("Air Altar", "Astral Altar", "Blood Altar", "Body Altar", "Chaos Altar", "Cosmic Altar", "Death Altar", "Earth Altar", "Fire Altar", "Law Altar", "Mind Altar", "Nature Altar", "Ourania Altar", "Water Altar") +private val SLAYER_LOCATIONS: Array = arrayOf("Burthorpe", "Canifis", "Edgeville Dungeon", "Pollnivneach", "Shilo Village", "Zanaris") +private val FAMILIARS: Array = arrayOf("abyssal lurker", "abyssal parasite", "abyssal titan", "adamant minotaur", "albino rat", "arctic bear", "barker toad", "beaver", "bloated leech", "bronze minotaur", "bull ant", "bunyip", "compost mound", "desert wyrm", "dreadfowl", "evil turnip", "fire titan", "forge regent", "fruit bat", "geyser titan", "giant chinchompa", "giant ent", "granite crab", "granite lobster", "honey badger", "hydra", "ibis", "ice titan", "iron minotaur", "iron titan", "karamthulhu overlord", "lava titan", "macaw", "magpie", "mithril minotaur", "moss titan", "obsidian golem", "pack yak", "phoenix", "praying mantis", "pyrelord", "ravenous locust", "rune minotaur", "smoke devil", "spirit cobra", "spirit cockatrice", "spirit coraxatrice", "spirit dagannoth", "spirit graahk", "spirit guthatrice", "spirit jelly", "spirit kalphite", "spirit kyatt", "spirit larupia", "spirit mosquito", "spirit pengatrice", "spirit saratrice", "spirit scorpion", "spirit spider", "spirit terrorbird", "spirit Tz-Kih", "spirit vulatrice", "spirit wolf", "spirit zamatrice", "steel minotaur", "steel titan", "stranger plant", "swamp titan", "talon beast", "thorny snail", "unicorn stallion", "vampire bat", "void ravager", "void shifter", "void spinner", "void torcher", "war tortoise", "wolpertinger") +private val CHARM_DROPPERS: Array = arrayOf("basilisks", "bloodvelds", "dust devils", "fire giants", "ice giants", "ice warriors", "jogres", "ogres", "rock crabs", "rock lobsters", "waterfiends", "wolves") +private val THIEVE_TARGETS: Array = arrayOf("bearded Pollnivnian bandits", "cave goblins", "chests", "desert bandits", "elves", "farmers", "Fremenniks", "gnomes", "guards", "H.A.M. members", "heroes", "knights", "master farmers", "men and women", "Menaphite thugs", "paladins", "Pollnivnian bandits", "rogues", "stalls", "warriors", "watchmen") +private val PICKAXE_TYPES: Array = arrayOf("adamant", "bronze", "iron", "mithril", "rune", "steel") +private val AXE_TYPES: Array = arrayOf("adamant", "black", "bronze", "dragon", "iron", "mithril", "rune", "steel") +private val WOODCUTTING_LOCATIONS: Array = arrayOf("Ape Atoll", "Draynor", "Edgeville", "Gnome Stronghold", "Isafdar", "Kharazi Jungle", "Mage Training Area", "Neitiznot", "Piscatoris", "Seers' Village", "Seers' Village cemetery", "Sinclair Mansion", "Sorcerer's Tower", "South of Castle Wars", "South of Falador", "South of the Lumberyard", "Tai Bwo Bwannai", "Uzer", "Varrock Palace", "West of Barbarian Assault", "West of Catherby", "West of Lumbridge Castle", "West of Oo'glog") +private val SLAYER_EQUIPMENT: Array = arrayOf("a bug lantern", "a crystal chime", "a face mask", "a mirror shield", "a nosepeg", "a Slayer bell", "a spiny helmet", "a witchwood icon", "an enchanted gem", "bags of salt", "broad arrows", "earmuffs", "Fishing explosives", "fungicide spray", "ice coolers", "insulated boots", "leaf-bladed spear", "rock hammers", "Slayer gloves", "Slayer staff", "super fishing explosive") +private val DIRECTIONS: Array = arrayOf("north", "south", "east", "west", "north-east", "north-west", "south-east", "south-west") +private val DIR_LOCATIONS: Array = arrayOf("Al Kharid", "Ape Atoll", "Ardougne (East)", "Ardougne (West)", "Barbarian Village", "Braindeath Island", "Brimhaven", "BUrdh de Rott", "Burthorpe", "Camelot", "Canifis", "Catherby", "Crandor", "Dorgesh-Kaan", "Draynor Manor", "Draynor Village", "Edgeville", "Entrana", "Etceteria", "Falador", "Goblin Village", "God Wars Dungeon", "Grand Exchange", "Gu'Tanoth", "Harmony Island", "Hemenster", "Isafdar", "Jatizso", "Kalphite Lair", "Karamja", "Keldagrim", "Lletya", "Lumbridge", "Lunar Isle", "Meiyerditch", "Miscellania", "Mort'ton", "Mos Le Harmless", "Nardah", "Neitiznot", "Oo'glog", "Paterdomus", "Piscatoris", "Pollnivneach", "Port Khazard", "Port Phasmatys", "Port Sarim", "Rellekka", "Rimmington", "Seers' Village", "Shilo Village", "Sophanem", "Tai Bwo Wannai Village", "Taverley", "Tree Gnome Stronghold", "Tree Gnome Village", "Troll Stronghold", "TzHaar city", "Varrock", "Waterbirth Island", "Witchaven", "Yanille", "Zanaris") +private val SKILL_NAMES: Array = arrayOf("Agility", "Attack", "Construction", "Cooking", "Crafting", "Defence", "Farming", "Firemaking", "Fishing", "Fletching", "Herblore", "Hitpoints", "Hunter", "Magic", "Mining", "Prayer", "Ranged", "Runecrafting", "Slayer", "Smithing", "Strength", "Summoning", "Thieving", "Woodcutting") +private val SMITHING_BARTYPES: Array = arrayOf("adamant", "blurite", "bronze", "iron", "item", "mithril", "rune", "steel") +private val SMITHING_PRODUCTS: Array = arrayOf("arrow tips", "axes", "battleaxes", "bolts", "bullseye lantern frames", "cannonballs", "chainbodies", "claws", "crossbow limbs", "daggers", "dart tips", "full helms", "grapple tips", "hastae", "kite shields", "longswords", "maces", "medium helms", "nails", "oil lantern frames", "pickaxes", "platebodies", "platelegs", "plateskirts", "scimitars", "short swords", "spears", "spits", "square shields", "studs", "throwing knives", "two-handed swords", "warhammers", "wire") \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/SpecialGroundInteraction.java b/Server/src/main/java/Server/core/game/interaction/SpecialGroundInteraction.java new file mode 100644 index 000000000..0fe6180b3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/SpecialGroundInteraction.java @@ -0,0 +1,15 @@ +package core.game.interaction; + +import core.game.node.entity.player.Player; + +/** + * Stub class for special ground item interactions + * @author ceik + */ +public class SpecialGroundInteraction { + public void handle(Player player, Option option){ + } + public void configure(){ + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/SpecialGroundItems.java b/Server/src/main/java/Server/core/game/interaction/SpecialGroundItems.java new file mode 100644 index 000000000..0e86dbd28 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/SpecialGroundItems.java @@ -0,0 +1,32 @@ +package core.game.interaction; + +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.world.map.Location; +import core.game.interaction.city.falador.WineOfZamorakInteraction; +import core.game.interaction.city.portsarim.AhabBeerInteraction; + +/** + * Handles interactions for special ground items + * @author ceik + */ +public enum SpecialGroundItems { + //Ahab's beer + AHAB_BEER(1917,new Location(3049,3257,0), new AhabBeerInteraction()), + WINE_OF_ZAMORAK(245, Location.create(2931, 3515, 0), new WineOfZamorakInteraction()); + + private int itemid; + private Location location; + private SpecialGroundInteraction inter; + + SpecialGroundItems(int itemId, Location location, SpecialGroundInteraction inter){ + this.itemid = itemId; + this.location = location; + this.inter = inter; + } + + public SpecialGroundInteraction getInteraction() { return inter;} + public int getItemid() {return itemid;} + public Location getLocation() {return location;} + public GroundItem asGroundItem(){return GroundItemManager.get(itemid,location,null);} +} diff --git a/Server/src/main/java/Server/core/game/interaction/UseWithHandler.java b/Server/src/main/java/Server/core/game/interaction/UseWithHandler.java new file mode 100644 index 000000000..20349286e --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/UseWithHandler.java @@ -0,0 +1,269 @@ +package core.game.interaction; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.map.Location; +import core.game.world.update.flag.player.FaceLocationFlag; +import core.plugin.Plugin; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Handles the "use {@code node a} with {@code node b}" option. + * + * @author Emperor + */ +public abstract class UseWithHandler implements Plugin { + + /** + * The item type. + */ + public static final int ITEM_TYPE = 0; + + /** + * The NPC type. + */ + public static final int NPC_TYPE = 1; + + /** + * The object type. + */ + public static final int OBJECT_TYPE = 2; + + /** + * The player type. + */ + public static final int PLAYER_TYPE = 3; + + /** + * The handlers. + */ + private static final Map> HANDLERS = new HashMap<>(); + + /** + * The allowed node ids. + */ + private int[] allowedNodes; + + /** + * Constructs a new {@code UseWithHandler.java} {@code Object}. + * + * @param allowedNodes + */ + public UseWithHandler(int... allowedNodes) { + this.allowedNodes = allowedNodes; + } + + public UseWithHandler(ArrayList allowedNodes){ + this.allowedNodes = allowedNodes.stream().mapToInt(i -> i).toArray(); + } + + public void setAllowedNodes(ArrayList allowedNodes){ + this.allowedNodes = allowedNodes.stream().mapToInt(i -> i).toArray(); + } + + /** + * Adds a handler. + * + * @param id The node id. + * @param type The node type (0=item, 1=NPC, 2=object, 3=player). + * @param handler The handler. + */ + public static void addHandler(int id, int type, UseWithHandler handler) { + int key = id | type << 16; + List handlers = HANDLERS.get(key); + if (handlers == null) { + HANDLERS.put(key, handlers = new ArrayList<>()); + } + if (type == PLAYER_TYPE) { + if (handler.allowedNodes == null) { + handler.allowedNodes = new int[]{id}; + } else { + int[] array = handler.allowedNodes; + handler.allowedNodes = new int[handler.allowedNodes.length + 1]; + System.arraycopy(array, 0, handler.allowedNodes, 0, array.length); + handler.allowedNodes[handler.allowedNodes.length - 1] = id; + } + } + handlers.add(handler); + } + + /** + * Runs the event. + * + * @param event The event. + */ + public static void run(final NodeUsageEvent event) { + try { + if (event.getPlayer() != null) { + event.getPlayer().getInterfaceManager().close(); + } + Node n = event.getUsedWith(); + List handler = null; + if (n instanceof Item) { + handler = HANDLERS.get(((Item) event.getUsed()).getId());// fixed. + if (handler == null) { + handler = HANDLERS.get(((Item) event.getUsedWith()).getId()); + } + } else if (n instanceof NPC) { + handler = HANDLERS.get(((NPC) n).getId() | NPC_TYPE << 16); + } else if (n instanceof GameObject) { + handler = HANDLERS.get(((GameObject) n).getId() | OBJECT_TYPE << 16); + } else if (n instanceof Player) { + handler = HANDLERS.get(((Item) event.getUsed()).getId() | PLAYER_TYPE << 16); + } else { + handler = HANDLERS.get(((NPC) n).getId() | NPC_TYPE << 16); + } + if (handler == null) { + if (n instanceof Item && !(event.getUsed() instanceof Player)) { + event.getPlayer().getPulseManager().runUnhandledAction(event.getPlayer()); + } else { + event.getPlayer().getPulseManager().run(new MovementPulse(event.getPlayer(), event.getUsedWith()) { + @Override + public boolean pulse() { + event.getPlayer().debug("Unhandled use with interaction: item used: " + event.getUsed() + " with: " + event.getUsedWith()); + event.getPlayer().getPacketDispatch().sendMessage("Nothing interesting happens."); + return true; + } + }, "movement"); + } + return; + } + final List handlers = handler; + if (n instanceof Item && !(event.getUsed() instanceof Player)) { + event.getPlayer().getPulseManager().run(new Pulse(1, event.getPlayer(), event.getUsed(), event.getUsedWith()) { + @Override + public boolean pulse() { + boolean handled = false; + if (event.getPlayer() != null) { + event.getPlayer().getInterfaceManager().close(); + } + for (UseWithHandler h : handlers) { + if (!h.nodeAllowed(((Item) event.getUsedWith()).getId()) && !h.nodeAllowed(event.getUsedItem().getId()) || !h.handle(event)) {// fixed, + continue; + } + event.getPlayer().debug("Handler=" + h.getClass().getSimpleName() + ", used item=" + event.getUsedItem() + ", used with=" + event.getUsedWith()); + handled = true; + break; + } + if (!handled) { + event.getPlayer().debug("Handler=none, used item=" + event.getUsedItem()); + event.getPlayer().debug("used with=" + event.getUsedWith()); + event.getPlayer().getPacketDispatch().sendMessage("Nothing interesting happens."); + } + return true; + } + }); + return; + } + event.getPlayer().getPulseManager().run(new MovementPulse(event.getPlayer(), event.getUsedWith(), handler.get(0)) { + @Override + public boolean pulse() { + event.getPlayer().faceLocation(FaceLocationFlag.getFaceLocation(event.getPlayer(), event.getUsedWith())); + boolean handled = false; + Item used = (Item) event.getUsed(); + for (UseWithHandler h : handlers) { + if ((used != null && !h.nodeAllowed(used.getId())) || !h.handle(event)) { + continue; + } + event.getPlayer().debug("Handler=" + h.getClass().getSimpleName() + ", used item=" + event.getUsedItem() + ", used with=" + event.getUsedWith()); + handled = true; + break; + } + if (!handled) { + event.getPlayer().debug("Handler=none, used item=" + event.getUsedItem() + ", used with=" + event.getUsedWith()); + event.getPlayer().getPacketDispatch().sendMessage("Nothing interesting happens."); + } + return true; + } + }, "movement"); + } catch (Exception e){ + e.printStackTrace(); + } + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Gets the valid children for the wrapper id. + * + * @param wrapper the wrapper id. + * @return the valid children. + */ + public int[] getValidChildren(int wrapper) { + final ObjectDefinition definition = ObjectDefinition.forId(wrapper); + final List list = new ArrayList<>(); + if (definition.getChildrenIds() == null) { + SystemLogger.logErr("Null child wrapper in option handler wrapperId=" + wrapper); + return new int[]{wrapper}; + } + for (int child : definition.getChildrenIds()) { + if (child != -1 && !list.contains(child)) { + list.add(child); + } + } + int[] array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } + + /** + * Method used to get the destination to go to, leave null to go to proper + * one. + * + * @param player the player. + * @return the location. + */ + public Location getDestination(Player player, Node with) { + return null; + } + + /** + * Checks if the node is allowed to be used with the base node. + * + * @param nodeId The node id. + * @return {@code True} if so. + */ + public boolean nodeAllowed(int nodeId) { + if (isDynamic()) { + return true; + } + for (int id : allowedNodes) { + if (nodeId == id) { + return true; + } + } + return false; + } + + /** + * Handles the interaction option. + * + * @param event The node usage event. + * @return {@code True} if successful. + */ + public abstract boolean handle(NodeUsageEvent event); + + /** + * Checks if the handler excepts all dynamic items. + * + * @return {@code True} if so. + */ + public boolean isDynamic() { + return false; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/city/BedabinPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/BedabinPlugin.java new file mode 100644 index 000000000..d735824ea --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/BedabinPlugin.java @@ -0,0 +1,75 @@ +package core.game.interaction.city; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * The plugin used to handle bedabin interactions. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BedabinPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2700).getHandlers().put("option:walk-through", this); + ObjectDefinition.forId(2672).getHandlers().put("option:use", this); + NPCDefinition.forId(834).getHandlers().put("option:talk-to", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node.getId(); + switch (option) { + case "talk-to": + player.getDialogueInterpreter().open(node.getId(), node); + break; + case "walk-through": + switch (id) { + case 2700: + if (player.getLocation().getY() >= 3046) { + final GameObject door = RegionManager.getObject(new Location(3169, 3046, 0)); + ObjectBuilder.replace(door, door.transform(2701), 2); + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(3169, 3045); + player.getPacketDispatch().sendMessage("You walk back out the tent."); + break; + } + player.getDialogueInterpreter().open(834, RegionManager.getNpc(player, 834)); + break; + } + break; + case "use": + switch (id) { + case 2672: + player.getPacketDispatch().sendMessage("To forge items use the metal you wish to work with the anvil."); + break; + } + break; + } + return true; + } + + @Override + public Location getDestination(Node n, Node node) { + if (node instanceof NPC) { + if (node.getId() == 834) { + return new Location(3169, 3045, 0); + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/BrimhavenDungeonPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/BrimhavenDungeonPlugin.java new file mode 100644 index 000000000..135275366 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/BrimhavenDungeonPlugin.java @@ -0,0 +1,175 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Brimhaven dungeon. + * @author Emperor + */ +@Initializable +public final class BrimhavenDungeonPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(5084).getHandlers().put("option:leave", this); + ObjectDefinition.forId(5088).getHandlers().put("option:walk-across", this); + ObjectDefinition.forId(5090).getHandlers().put("option:walk-across", this); + ObjectDefinition.forId(5094).getHandlers().put("option:walk-up", this); + ObjectDefinition.forId(5096).getHandlers().put("option:walk-down", this); + ObjectDefinition.forId(5097).getHandlers().put("option:walk-up", this); + ObjectDefinition.forId(5098).getHandlers().put("option:walk-down", this); + ObjectDefinition.forId(5103).getHandlers().put("option:chop-down", this); + ObjectDefinition.forId(5104).getHandlers().put("option:chop-down", this); + ObjectDefinition.forId(5105).getHandlers().put("option:chop-down", this); + ObjectDefinition.forId(5106).getHandlers().put("option:chop-down", this); + ObjectDefinition.forId(5107).getHandlers().put("option:chop-down", this); + ObjectDefinition.forId(5110).getHandlers().put("option:jump-from", this); + ObjectDefinition.forId(5111).getHandlers().put("option:jump-from", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final GameObject object = (GameObject) node; + switch (object.getId()) { + case 5084: + player.getProperties().setTeleportLocation(Location.create(2745, 3152, 0)); + return true; + case 5103: + case 5104: + case 5105: + case 5106: + case 5107: + int level = 10 + ((object.getId() - 5103) * 6); + if (player.getSkills().getLevel(Skills.WOODCUTTING) < level) { + player.getPacketDispatch().sendMessage("You need a woodcutting level of " + level + " to chop down this vine."); + return true; + } + SkillingTool tool = SkillingTool.getHatchet(player); + if (tool == null) { + player.getPacketDispatch().sendMessage("You don't have an axe to cut these vines."); + return true; + } + player.animate(tool.getAnimation()); + player.getPulseManager().run(new Pulse(3, player) { + @Override + public boolean pulse() { + if (ObjectBuilder.replace(object, object.transform(0), 2)) { + Location destination = getVineDestination(player, object); + player.lock(3); + player.getWalkingQueue().reset(); + // Chop the vines to gain deeper access to Brimhaven Dungeon + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 14); + player.getWalkingQueue().addPath(destination.getX(), destination.getY(), true); + } + return true; + } + }); + return true; + case 5110: + case 5111: + if (player.getSkills().getLevel(Skills.AGILITY) < 12) { + player.getPacketDispatch().sendMessage("You need an agility level of 12 to cross this."); + return true; + } + player.lock(12); + final Direction dir = AgilityHandler.forceWalk(player, -1, player.getLocation(), object.getLocation(), Animation.create(769), 10, 0, null).getDirection(); + GameWorld.getPulser().submit(new Pulse(3, player) { + int stage = dir == Direction.NORTH ? -1 : 0; + Direction direction = dir; + + @Override + public boolean pulse() { + Location l = player.getLocation(); + switch (stage++) { + case 1: + direction = Direction.get(direction.toInteger() + 1 & 3); + break; + case 3: + direction = Direction.get(direction.toInteger() - 1 & 3); + break; + case 5: + if (direction == Direction.NORTH) { + return true; + } + } + if (stage == 6) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 15); + } + AgilityHandler.forceWalk(player, -1, l, l.transform(direction), Animation.create(769), 10, 0, null); + return stage == 6; + } + }); + player.addExtension(LogoutTask.class, new LocationLogoutTask(13, player.getLocation())); + return true; + case 5094: + ClimbActionHandler.climb(player, null, Location.create(2643, 9594, 2)); + return true; + case 5096: + ClimbActionHandler.climb(player, null, Location.create(2649, 9591, 0)); + return true; + case 5097: + // Climb the stairs within Brimhaven Dungeon + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 16); + ClimbActionHandler.climb(player, null, Location.create(2636, 9510, 2)); + return true; + case 5098: + ClimbActionHandler.climb(player, null, Location.create(2636, 9517, 0)); + return true; + case 5088: + if (player.getSkills().getLevel(Skills.AGILITY) < 30) { + player.getPacketDispatch().sendMessage("You need an agility level of 30 to cross this."); + return true; + } + AgilityHandler.walk(player, -1, player.getLocation(), Location.create(2687, 9506, 0), Animation.create(155), 0, null); + return true; + case 5090: + if (player.getSkills().getLevel(Skills.AGILITY) < 30) { + player.getPacketDispatch().sendMessage("You need an agility level of 30 to cross this."); + return true; + } + AgilityHandler.walk(player, -1, player.getLocation(), Location.create(2682, 9506, 0), Animation.create(155), 0, null); + return true; + } + return false; + } + + /** + * Gets the destination for chopping vines. + * @param player The player. + * @param object The object. + * @return The destination location. + */ + private static Location getVineDestination(Player player, GameObject object) { + if (object.getRotation() % 2 != 0) { + if (player.getLocation().getX() > object.getLocation().getX()) { + return object.getLocation().transform(-1, 0, 0); + } + return object.getLocation().transform(1, 0, 0); + } + if (player.getLocation().getY() > object.getLocation().getY()) { + return object.getLocation().transform(0, -1, 0); + } + return object.getLocation().transform(0, 1, 0); + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/BurthorpePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/BurthorpePlugin.java new file mode 100644 index 000000000..78947c7ac --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/BurthorpePlugin.java @@ -0,0 +1,37 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the burthorpe plugin. + * @author Emperor + */ +@Initializable +public final class BurthorpePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(4627).getHandlers().put("option:climb-up", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + GameObject object = (GameObject) node; + switch (object.getId()) { + case 4627: + ClimbActionHandler.climb(player, null, Location.create(2899, 3565, 0)); + return true; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/CamelotNodePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/CamelotNodePlugin.java new file mode 100644 index 000000000..35604b0f2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/CamelotNodePlugin.java @@ -0,0 +1,53 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle nodes related to camelot. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CamelotNodePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(26017).getHandlers().put("option:climb-down", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = ((GameObject) node).getId(); + switch (id) { + case 26017: + player.getPacketDispatch().sendMessage("Court is not in session."); + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + int id = ((GameObject) n).getId(); + switch (id) { + case 993: + if (node.getLocation().getX() <= 2638) { + return Location.create(2637, 3350, 0); + } else { + return Location.create(2640, 3350, 0); + } + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/DraynorManorPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/DraynorManorPlugin.java new file mode 100644 index 000000000..d85afd8ae --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/DraynorManorPlugin.java @@ -0,0 +1,250 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle node interactions at draynor manor. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DraynorManorPlugin extends OptionHandler { + + /** + * Represents the lever animation. + */ + private static final Animation LEVER_ANIMATION = new Animation(834); + + /** + * Represents the basement location. + */ + private static final Location BASEMENT = new Location(3117, 9753, 0); + + /** + * Represents the digging animation. + */ + private static final Animation DIG_ANIM = new Animation(830); + + /** + * Represents the searching animation. + */ + private static final Animation SEARCH_ANIM = new Animation(881); + + /** + * Represents the spade item. + */ + private static final Item SPADE = new Item(952); + + /** + * Represents the key item. + */ + private static final Item KEY = new Item(275); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(156).getHandlers().put("option:search", this); + ObjectDefinition.forId(155).getHandlers().put("option:search", this); + ObjectDefinition.forId(160).getHandlers().put("option:pull", this); + ObjectDefinition.forId(131).getHandlers().put("option:open", this); + ObjectDefinition.forId(133).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(134).getHandlers().put("option:open", this); + ObjectDefinition.forId(135).getHandlers().put("option:open", this); + ObjectDefinition.forId(152).getHandlers().put("option:search", this); + ObjectDefinition.forId(153).getHandlers().put("option:search", this); + ObjectDefinition.forId(11498).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(37703).getHandlers().put("option:squeeze-through", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + int id = ((GameObject) node).getId(); + switch (id) { + case 11498: + ClimbActionHandler.climb(player, new Animation(828), Location.create(3108, 3366, 1)); + break; + case 160: + case 156: + case 155: + handleBookCase(player, ((GameObject) node)); + break; + case 133: + ClimbActionHandler.climb(player, new Animation(827), BASEMENT); + break; + case 134:// big doors + case 135: + if (player.getLocation().getY() >= 3354) { + player.getPacketDispatch().sendMessage("The doors won't open."); + return true; + } + player.getPacketDispatch().sendMessage("The doors slam shut behind you."); + DoorActionHandler.handleDoor(player, (GameObject) node); + return true; + case 131: + if (!player.getInventory().containsItem(KEY)) { + player.getPacketDispatch().sendMessage("The door is locked."); + } else { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } + break; + case 152: + if (!player.getInventory().containsItem(SPADE)) { + player.getDialogueInterpreter().sendDialogues(player, FacialExpression.FURIOUS, "I'm not looking through that with my hands!"); + return true; + } + player.lock(3); + player.animate(DIG_ANIM); + player.getPacketDispatch().sendMessage("You dig throug the compost..."); + if (!player.getInventory().containsItem(KEY)) { + player.getPacketDispatch().sendMessage("... and find a small key."); + if (!player.getInventory().add(KEY)) { + GroundItemManager.create(KEY, player); + } + } else { + player.getPacketDispatch().sendMessage("... but you find nothing of interest."); + } + break; + case 153: + player.lock(3); + player.animate(SEARCH_ANIM); + player.getDialogueInterpreter().open(3954922); + break; + case 37703: + AgilityHandler.walk(player, 0, player.getLocation(), node.getLocation().transform(player.getLocation().getX() <= 3085 ? 1 : 0, 0, 0), new Animation(1426), 0, null); + break; + } + return true; + } + + /** + * Method used to handle the secret book case opening. + * @param player the player. + */ + private final void handleBookCase(final Player player, final GameObject object) { + Location dest = null; + if (RegionManager.getObject(Location.create(3097, 3359, 0)) == null || RegionManager.getObject(Location.create(3097, 3358, 0)) == null) { + return; + } + if (player.getLocation().getX() > 3096) { + if (player.getLocation().getY() >= 3359) { + dest = Location.create(3096, 3359, 0); + } else { + dest = Location.create(3096, 3358, 0); + } + } else { + if (object.getId() != 160) { + return; + } + if (player.getLocation().getY() >= 3359) { + dest = Location.create(3098, 3359, 0); + } else { + dest = Location.create(3098, 3358, 0); + } + } + final Location destination = dest; + if (object.getId() == 160) { + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.getPacketDispatch().sendMessage("The lever opens the secret door!"); + player.animate(LEVER_ANIMATION); + break; + case 2: + ObjectBuilder.replace(object, object.transform(161), 6); + break; + case 3: + Pathfinder.find(player, Location.create(3096, 3358, 0)).walk(player); + break; + case 4: + player.faceLocation(destination); + break; + case 5: + ObjectBuilder.remove(RegionManager.getObject(Location.create(3097, 3359, 0))); + ObjectBuilder.remove(RegionManager.getObject(Location.create(3097, 3358, 0))); + ObjectBuilder.add(new GameObject(156, new Location(3097, 3357, 0))); + ObjectBuilder.add(new GameObject(157, new Location(3097, 3360, 0))); + break; + case 6: + AgilityHandler.walk(player, -1, player.getLocation(), destination, null, 0.0, null); + break; + case 8: + ObjectBuilder.remove(RegionManager.getObject(new Location(3097, 3360, 0))); + ObjectBuilder.remove(RegionManager.getObject(new Location(3097, 3357, 0))); + ObjectBuilder.add(new GameObject(155, new Location(3097, 3359, 0))); + ObjectBuilder.add(new GameObject(156, new Location(3097, 3358, 0))); + break; + } + return false; + } + }); + return; + } + GameWorld.getPulser().submit(new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + switch (count) { + case 0: + player.getPacketDispatch().sendMessage("You've found a secret door!"); + ObjectBuilder.remove(RegionManager.getObject(Location.create(3097, 3359, 0))); + ObjectBuilder.remove(RegionManager.getObject(Location.create(3097, 3358, 0))); + ObjectBuilder.add(new GameObject(156, new Location(3097, 3357, 0))); + ObjectBuilder.add(new GameObject(157, new Location(3097, 3360, 0))); + break; + case 1: + AgilityHandler.walk(player, -1, player.getLocation(), destination, null, 0.0, null); + break; + case 3: + ObjectBuilder.remove(RegionManager.getObject(new Location(3097, 3360, 0))); + ObjectBuilder.remove(RegionManager.getObject(new Location(3097, 3357, 0))); + ObjectBuilder.add(new GameObject(155, new Location(3097, 3359, 0))); + ObjectBuilder.add(new GameObject(156, new Location(3097, 3358, 0))); + break; + } + count++; + return count == 4; + } + + }); + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + final int id = ((GameObject) n).getId(); + switch (id) { + case 155: + return Location.create(3098, 3359, 0); + case 156: + return Location.create(3098, 3358, 0); + case 160: + return Location.create(3096, 3357, 0); + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/DraynorNodePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/DraynorNodePlugin.java new file mode 100644 index 000000000..6acfa0bde --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/DraynorNodePlugin.java @@ -0,0 +1,245 @@ +package core.game.interaction.city; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.object.ObjectBuilder; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Plugin; + +/** + * Represents the node plugin used to handle draynor interactions. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DraynorNodePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(922).getHandlers().put("option:make-dyes", this); + ObjectDefinition.forId(7092).getHandlers().put("option:observe", this); + ObjectDefinition.forId(6434).getHandlers().put("option:open", this); + ActivityManager.register(new TelescopeCutscene()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node instanceof NPC ? ((NPC) node).getId() : ((GameObject) node).getId(); + switch (id) { + case 922: + player.getDialogueInterpreter().open(((NPC) node).getId(), ((NPC) node), true); + break; + case 7092: + ActivityManager.start(player, "draynor telescope", false); + break; + case 6434: // Trapdoors above NW and SE corners of Draynor sewer + if (option.equalsIgnoreCase("open")) { + ObjectBuilder.replace(node.asObject(), node.asObject().transform(6435), 500); + } + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + final GameObject object = (GameObject) n; + if (object.getId() == 7092) { + return n.getLocation().transform(0, 1, 0); + } + } + return null; + } + + /** + * Represents the telescope cutscene. + * @author 'Vexia + * @version 1.0 + */ + public static final class TelescopeCutscene extends CutscenePlugin { + + /** + * Represents the telescope interface. + */ + private static final Component INTERFACE = new Component(386); + + /** + * Represents the animation used to look into a telescope. + */ + private static final Animation TELESCOPE_ANIM = new Animation(2171); + + /** + * Constructs a new {@code TelescopeCutscene} {@code Object}. + */ + public TelescopeCutscene() { + super("draynor telescope"); + } + + /** + * Constructs a new {@code TelescopeCutscene} {@code Object}. + * @param player the player. + */ + public TelescopeCutscene(Player player) { + super("draynor telescope"); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new TelescopeCutscene(p); + } + + @Override + public boolean start(final Player player, boolean login, Object... args) { + player.animate(TELESCOPE_ANIM); + player.getDialogueInterpreter().sendPlainMessage(true, "You look through the telescope..."); + return super.start(player, login, args); + } + + @Override + public void open() { + player.setAttribute("cutscene:original-loc", Location.create(3088, 3254, 0)); + player.setDirection(Direction.NORTH); + player.faceLocation(player.getLocation().transform(0, 1, 0)); + int x = 3104; + int y = 3175; + int height = 900; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x, y, height, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + 1, y - 30, height, 1, 100)); + x = 3111; + y = 3172; + height = 700; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x, y, height, 1, 2)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x - 1, y + 230, height, 1, 1)); + player.getInterfaceManager().open(INTERFACE); + GameWorld.getPulser().submit(new Pulse(22, player) { + @Override + public boolean pulse() { + TelescopeCutscene.this.stop(true); + return true; + } + }); + } + + @Override + public void register() { + super.register(); + new EndDialogue().init(); + } + + @Override + public void end() { + player.getInterfaceManager().close(); + player.getDialogueInterpreter().open(32389023); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 17); + super.end(); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return new Location(3104, 3175, 0); + } + + @Override + public void configure() { + + } + + /** + * Represents the ending dialogue. + * @author 'Vexia + * @version 1.0 + */ + public static final class EndDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code EndDialogue} {@code Object}. + * @param player the player. + */ + public EndDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code EndDialogue} {@code Object}. + */ + public EndDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EndDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("I see you've got your telescope", "pointing at the Wizard's Tower."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(3820, null, "Oh, do I? Well, why does that interest you?"); + stage = 1; + break; + case 1: + player("Well, you robbed a bank, and I bet you're now", "planning something to do with that Tower!"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(3820, null, "No, no, I'm not planning anything like that again."); + stage = 3; + break; + case 3: + player("Well I'll be watching you..."); + stage = 4; + break; + case 4: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 32389023 }; + } + + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/EdgevilleNodePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/EdgevilleNodePlugin.java new file mode 100644 index 000000000..f35836ccd --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/EdgevilleNodePlugin.java @@ -0,0 +1,69 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle edgeville related interactions. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EdgevilleNodePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(9262).getHandlers().put("option:take-seed", this); + ObjectDefinition.forId(9261).getHandlers().put("option:take-seed", this); + ObjectDefinition.forId(30806).getHandlers().put("option:take-seed", this); + ObjectDefinition.forId(12265).getHandlers().put("option:climb", this); + + ObjectDefinition.forId(12266).getHandlers().put("option:open", this); + + ObjectDefinition.forId(26933).getHandlers().put("option:open", this); + ObjectDefinition.forId(26934).getHandlers().put("option:close", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int id = ((GameObject) node).getId(); + switch (id) { + case 9262: + case 9261: + case 30806: + player.getPacketDispatch().sendMessage("There doesn't seem to be any seeds on this rosebush."); + break; + case 12265: + ClimbActionHandler.climb(player, null, Location.create(3078, 3493, 0)); + break; + case 12266: + if (option.equalsIgnoreCase("open")) { + player.getConfigManager().set(680, 1<<22); + } else if (option.equalsIgnoreCase("close")) { + player.getConfigManager().set(680, 0); + } + break; + case 26933: // Trapdoors at edgeville dungeon entrance + if (option.equalsIgnoreCase("open")) { + ObjectBuilder.replace(node.asObject(), node.asObject().transform(26934), 500); + } + break; + case 26934: // Trapdoors at edgeville dungeon entrance + if (option.equalsIgnoreCase("close")) { + ObjectBuilder.replace(node.asObject(), node.asObject().transform(26933)); + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/EntranaObjectPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/EntranaObjectPlugin.java new file mode 100644 index 000000000..066cb3743 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/EntranaObjectPlugin.java @@ -0,0 +1,47 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents a plugin used to handle entrana related objects. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EntranaObjectPlugin extends OptionHandler { + + /** + * Represents the location to teleport to. + */ + private static final Location LOCATION = Location.create(3208, 3764, 0);// magic door + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2408).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(2407).getHandlers().put("option:open", this);// magic door + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "climb-down": + player.getDialogueInterpreter().open(656, Repository.findNPC(656)); + break; + case "open": + player.getPacketDispatch().sendMessage("You feel the world around you dissolve..."); + player.getTeleporter().send(LOCATION, TeleportManager.TeleportType.ENTRANA_MAGIC_DOOR); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/FaladorNodePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/FaladorNodePlugin.java new file mode 100644 index 000000000..193bf6c09 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/FaladorNodePlugin.java @@ -0,0 +1,159 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle node interactions in falador. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FaladorNodePlugin extends OptionHandler { + + /** + * Represents the opening of a cupboard animation. + */ + private static final Animation OPEN_ANIMATION = new Animation(536); + + /** + * Represents the closing of a cupboard animation. + */ + private static final Animation CLOSE_ANIMATION = new Animation(535); + + /** + * Represents the portrait item. + */ + private static final Item PORTRAIT = new Item(666); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2271).getHandlers().put("option:open", this);// sir + // vyvans + // cupboard + // (closed) + ObjectDefinition.forId(2272).getHandlers().put("option:shut", this);// sir + // vyvans + // cupboard + // (open) + ObjectDefinition.forId(2272).getHandlers().put("option:search", this);// sir + // vyvans + // cupboard + // (open) + // dwarven mine + ObjectDefinition.forId(30868).getHandlers().put("option:squeeze-through", this); + ObjectDefinition.forId(5020).getHandlers().put("option:ride", this); + ItemDefinition.forId(245).getHandlers().put("option:take", this); + // fally park. + NPCDefinition.forId(2290).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(11708).getHandlers().put("option:close", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final int id = node.getId(); + switch (id) { + case 11708:// estate door. + DoorActionHandler.handleDoor(player, (GameObject) node); + break; + case 2290: + player.getDialogueInterpreter().open(id, node); + return true; + case 5020: + player.getDialogueInterpreter().sendDialogue("You must visit Keldagrim before you are allowed to ride mine carts."); + break; + case 30868: + if (player.getSkills().getLevel(Skills.AGILITY) < 42) { + player.getPacketDispatch().sendMessage("You need an agility level of 42 to do this."); + return true; + } + Location dest = player.getLocation().equals(new Location(3035, 9806, 0)) ? new Location(3028, 9806, 0) : new Location(3035, 9806, 0); + player.animate(new Animation(2240)); + ForceMovement movement = new ForceMovement(player, player.getLocation(), dest, new Animation(2240)) { + @Override + public void stop() { + super.stop(); + } + }; + movement.run(player, 8); + GameWorld.getPulser().submit(new Pulse(7, player) { + + @Override + public boolean pulse() { + player.animate(new Animation(2240)); + return true; + } + }); + break; + case 2271: + ObjectBuilder.replace((GameObject) node, ((GameObject) node).transform(2272)); + player.animate(OPEN_ANIMATION); + break; + case 2272: + switch (option) { + case "shut": + ObjectBuilder.replace((GameObject) node, ((GameObject) node).transform(2271)); + player.animate(CLOSE_ANIMATION); + break; + case "search": + if (player.getInventory().containsItem(PORTRAIT)) { + player.getDialogueInterpreter().sendDialogue("There is just a load of junk in here."); + return true; + } else { + + if (!player.getInventory().add(PORTRAIT)) { + GroundItemManager.create(PORTRAIT, player); + } + player.getDialogueInterpreter().sendDialogue("You find a small portrait in here which you take."); + } + break; + } + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof NPC) { + final NPC npc = (NPC) n; + if (npc.getId() == 2290) { + return Location.create(2997, 3374, 0); + } + } else if (n instanceof GameObject) { + if (n.getId() == 11708 && node.getLocation().equals(new Location(2981, 3370, 0))) { + return node.getLocation(); + } + } + return null; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public boolean isWalk(final Player player, Node node) { + return !(node instanceof Item); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/GnomeStrongholdPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/GnomeStrongholdPlugin.java new file mode 100644 index 000000000..daa3c1692 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/GnomeStrongholdPlugin.java @@ -0,0 +1,130 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles Gnome stronghold options. + * @author Emperor + */ +@Initializable +public final class GnomeStrongholdPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(190).getHandlers().put("option:open", this); + ObjectDefinition.forId(1967).getHandlers().put("option:open", this); + ObjectDefinition.forId(1968).getHandlers().put("option:open", this); + ObjectDefinition.forId(9316).getHandlers().put("option:climb",this); + ObjectDefinition.forId(9317).getHandlers().put("option:climb",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + GameObject object = (GameObject) node; + switch (object.getId()) { + case 9316: + case 9317: + final boolean scale = player.getLocation().getY() <= object.getLocation().getY(); + final Location end = object.getLocation().transform(scale ? 3 : -3, scale ? 6 : -6, 0); + if (player.getSkills().hasLevel(Skills.AGILITY, 37)) { + player.getPacketDispatch().sendMessage("You must be level 37 agility or higher to climb down the rocks."); + break; + } + if (!scale) { + ForceMovement.run(player, player.getLocation(), end, Animation.create(740), Animation.create(740), Direction.SOUTH, 13).setEndAnimation(Animation.RESET); + } else { + ForceMovement.run(player, player.getLocation(), end, Animation.create(1148), Animation.create(1148), Direction.SOUTH, 13).setEndAnimation(Animation.RESET); + } + break; + case 1967: + case 1968: + openTreeDoor(player, object); + return true; + case 190: + openGates(player, object); + return true; + } + return true; + } + + /** + * Opens the tree doors. + * @param player the player. + * @param object the object. + */ + private void openTreeDoor(final Player player, final GameObject object) { + if (object.getCharge() == 88) { + return; + } + object.setCharge(88); + ObjectBuilder.replace(object, object.transform(object.getId() == 1967 ? 1969 : 1970), 4); + AgilityHandler.walk(player, -1, player.getLocation(), player.getLocation().transform(0, player.getLocation().getY() <= 3491 ? 2 : -2, 0), new Animation(1426), 0, null); + GameWorld.getPulser().submit(new Pulse(4) { + @Override + public boolean pulse() { + object.setCharge(1000); + return true; + } + }); + } + + /** + * Opens the stronghold gates. + * @param player The player. + * @param object The door. + */ + private void openGates(Player player, final GameObject object) { + if (object.getCharge() == 88) { + return; + } + object.setCharge(88); + ObjectBuilder.replace(object, object.transform(191), 4); + ObjectBuilder.add(new GameObject(192, Location.create(2462, 3383, 0)), 4); + Location start = Location.create(2461, 3382, 0); + Location end = Location.create(2461, 3385, 0); + if (player.getLocation().getY() > object.getLocation().getY()) { + Location s = start; + start = end; + end = s; + } + AgilityHandler.walk(player, -1, start, end, new Animation(1426), 0, null); + GameWorld.getPulser().submit(new Pulse(4) { + @Override + public boolean pulse() { + object.setCharge(1000); + return true; + } + }); + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + switch (((GameObject) n).getId()) { + case 190: + if (node.getLocation().getY() < n.getLocation().getY()) { + return Location.create(2461, 3382, 0); + } + return Location.create(2461, 3385, 0); + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/HamHideoutPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/HamHideoutPlugin.java new file mode 100644 index 000000000..b7a3313c4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/HamHideoutPlugin.java @@ -0,0 +1,111 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the ham hide out node interaction plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HamHideoutPlugin extends OptionHandler { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(827); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(5490).getHandlers().put("option:open", this); + ObjectDefinition.forId(5490).getHandlers().put("option:pick-lock", this); + ObjectDefinition.forId(5491).getHandlers().put("option:close", this); + ObjectDefinition.forId(5491).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(5493).getHandlers().put("option:climb-up", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final int id = ((GameObject) node).getId(); + switch (id) { + case 5493: + if (player.getLocation().withinDistance(Location.create(3149, 9652, 0))) { + ClimbActionHandler.climb(player, new Animation(828), new Location(3165, 3251, 0)); + return true; + } + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + case 5490: + case 5491: + switch (option) { + case "open": + if (player.getConfigManager().get(174) == 0) { + player.getPacketDispatch().sendMessage("This trapdoor seems totally locked."); + } else { + player.getConfigManager().set(346, 272731282); + ClimbActionHandler.climb(player, new Animation(827), new Location(3149, 9652, 0)); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.getConfigManager().set(174, 0); + return true; + } + }); + } + break; + case "close": + player.getConfigManager().set(174, 0); + break; + case "climb-down": + switch (id) { + case 5491: + player.getProperties().setTeleportLocation(Location.create(3149, 9652, 0)); + break; + } + break; + case "pick-lock": + player.lock(3); + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You attempt to pick the lock on the trap door."); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You attempt to pick the lock on the trap door."); + boolean success = RandomFunction.random(3) == 1; + player.getPacketDispatch().sendMessage(success ? ("You pick the lock on the trap door.") : "You fail to pick the lock - your fingers get numb from fumbling with the lock."); + player.unlock(); + if (success) { + player.getConfigManager().set(174, 1 << 14); + GameWorld.getPulser().submit(new Pulse(40, player) { + @Override + public boolean pulse() { + player.getConfigManager().set(174, 0); + return true; + } + }); + } + return true; + } + }); + break; + } + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/HomePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/HomePlugin.java new file mode 100644 index 000000000..1b6acbc8f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/HomePlugin.java @@ -0,0 +1,34 @@ +package core.game.interaction.city; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Package -> core.game.interaction.city + * Created on -> 9/10/2016 @10:42 PM for 530 + * + * @author Ethan Kyle Millard + */ +@Initializable +public class HomePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(552).getHandlers().put("talk-to", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 552: + player.getDialogueInterpreter().open(552); + break; + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/IsafdarPlugin.kt b/Server/src/main/java/Server/core/game/interaction/city/IsafdarPlugin.kt new file mode 100644 index 000000000..214d7311b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/IsafdarPlugin.kt @@ -0,0 +1,58 @@ +package core.game.interaction.city + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.world.map.Location +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * File to be used for anything Isafdar related. + * Handles the summoning/altar cave enter and exit in Isafdar. + * @author Sir Kermit + */ + +@Initializable +class IsafdarPlugin : OptionHandler() { + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin { + + //Outside Cave + ObjectDefinition.forId(4006).handlers["option:enter"] = this + + //Inside Cave + ObjectDefinition.forId(4007).handlers["option:exit"] = this + + return this + + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + + val id = (node as GameObject).id + val outside = Location.create(2312, 3217, 0) + val inside = Location.create(2314, 9624, 0) + + when (id) { + //Handles sending the player inside of the cave. + 4006 -> { + if (node.id == 4006) { + player.teleport(inside) + return true + } + } + //Handles sending the player outside of the cave. + 4007 -> { + if (node.id == 4007) { + player.teleport(outside) + return true + } + } + } + return false + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/city/KaramajaOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/KaramajaOptionPlugin.java new file mode 100644 index 000000000..6d17d7844 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/KaramajaOptionPlugin.java @@ -0,0 +1,286 @@ +package core.game.interaction.city; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.plugin.Initializable; +import core.tools.Items; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.plugin.Plugin; + +/** + * Represents the option plugin used to handle karamaja options. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KaramajaOptionPlugin extends OptionHandler { + + /** + * Represents the banana item. + */ + private static final Item BANANA = new Item(1963); + + /** + * Represents the pineapple item. + */ + private static final Item PINEAPPLE = new Item(2114); + + /** + * Represents the pine apple objects. + */ + private static final int[] PINEAPPLE_OBJECTS = new int[]{ 1408, 1409, 1410, 1411, 1412, 1413 }; + + /** + * Represents the musa point dungeon. + */ + private static final Location MUSA_POINT_DUNGEON = Location.create(2856, 9567, 0); + + /** + * Represents the volacno rim location. + */ + private static final Location VOLCANO_RIM = new Location(2856, 3167, 0); + + /** + * Represents the agility brimhaven location. + */ + private static final Location AGILITY_LOCATION = new Location(2805, 9589, 3); + + /** + * Represents the main base asgility location (ground floor) + */ + private static final Location AGILITY_MAIN = new Location(2809, 3193, 0); + + /** + * Represents the component. + */ + private static final Component TICKET_EXCHANGE = new Component(6); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2072).getHandlers().put("option:search", this);// banana crate. + ObjectDefinition.forId(2072).getHandlers().put("option:fill", this);// banana crate. + ObjectDefinition.forId(2078).getHandlers().put("option:search", this);// random crate. + ObjectDefinition.forId(492).getHandlers().put("option:climb-down", this);// musa point rock + ObjectDefinition.forId(1764).getHandlers().put("option:climb", this);// musa dungeon rope + ObjectDefinition.forId(3617).getHandlers().put("option:climb-down", this);// agility ladder + ObjectDefinition.forId(3618).getHandlers().put("option:climb-up", this);// agility ladder + NPCDefinition.forId(437).getHandlers().put("option:pay", this);// capn izzy + NPCDefinition.forId(1055).getHandlers().put("option:trade", this);// capn izzy trader (tickets) + ObjectDefinition.forId(2626).getHandlers().put("option:open", this);// grubors locked door + ObjectDefinition.forId(2628).getHandlers().put("option:open", this);// the shrimp and parrot door (chef) + ObjectDefinition.forId(2627).getHandlers().put("option:open", this);// garv door + ObjectDefinition.forId(1591).getHandlers().put("option:open", this);// garv door + NPCDefinition.forId(1178).getHandlers().put("option:fish", this);// lubufu fishing spot + ObjectDefinition.forId(5083).getHandlers().put("option:enter", this);// sanibock dungeon entrance + ObjectDefinition.forId(2439).getHandlers().put("option:open", this); + for (int pineapple : PINEAPPLE_OBJECTS) { + ObjectDefinition.forId(pineapple).getHandlers().put("option:pick", this);// pineapple picking + } + ObjectDefinition.forId(2975).getHandlers().put("option:shake", this); // leafy palm tree + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "pick":// pineapples. + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return true; + } + final GameObject pineApple = ((GameObject) node); + if (pineApple.getId() == 1413) { + player.getPacketDispatch().sendMessage("There are no pineapples left on this plant."); + return true; + } + boolean last = pineApple.getId() == 14012; + if (player.getInventory().add(PINEAPPLE)) { + ObjectBuilder.replace(pineApple, pineApple.transform(pineApple.getId() + 1), last ? 270 : 40); + player.getPacketDispatch().sendMessage("You pick a pineapple."); + } + break; + case "enter": + switch (((GameObject) node).getId()) { + case 5083: + if (player.getAttribute("saniboch:paid", false) || player.getAchievementDiaryManager().getDiary(DiaryType.KARAMJA).isComplete()) { + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, Location.create(2713, 9564, 0)); + player.removeAttribute("saniboch:paid"); + break; + } + player.getDialogueInterpreter().sendDialogues(1595, null, "You can't go in there without paying!"); + break; + } + break; + case "trade": + switch (((NPC) node).getId()) { + case 1055: + player.getInterfaceManager().open(TICKET_EXCHANGE); + break; + } + break; + case "fish": + player.getDialogueInterpreter().sendDialogues(1171, FacialExpression.FURIOUS, "Keep off my fishing spot, whippersnapper!"); + break; + case "pay": + if (!player.getAttribute("capn_izzy", false)) { + if (player.getInventory().contains(995, 200) && player.getInventory().remove(new Item(995, 200))) { + player.getDialogueInterpreter().sendItemMessage(new Item(995, 200), "You give Cap'n Izzy the 200 coin entrance fee."); + player.getPacketDispatch().sendMessage("You give Cap'n Izzy the 200 coin entrance fee."); + player.setAttribute("/save:capn_izzy", true); + return true; + } else { + player.getPacketDispatch().sendMessage("You don't have the 200 coin entrance fee."); + } + } else { + player.getDialogueInterpreter().sendDialogues(437, null, "Avast there, ye've already paid!"); + } + break; + case "pay-fare": + switch (((GameObject) node).getId()) { + case 2230: + player.getPacketDispatch().sendMessage("This cart appears to have been out of reward for some time."); + break; + } + break; + case "climb-up": + switch (((GameObject) node).getId()) { + case 3618: + player.getProperties().setTeleportLocation(AGILITY_MAIN); + break; + } + break; + case "climb-down": + switch (((GameObject) node).getId()) { + case 492: + player.getPacketDispatch().sendMessage("You climb down through the pot hole."); + player.getProperties().setTeleportLocation(MUSA_POINT_DUNGEON); + break; + case 3617: + if (!player.getAttribute("capn_izzy", false)) { + player.getDialogueInterpreter().open(437, Repository.findNPC(437), true); + return true; + } + player.removeAttribute("capn_izzy"); + player.getProperties().setTeleportLocation(AGILITY_LOCATION); + break; + } + break; + case "climb": + switch (((GameObject) node).getId()) { + case 1764: + player.getProperties().setTeleportLocation(VOLCANO_RIM); + player.getPacketDispatch().sendMessage("You climb up the hanging rope..."); + player.getPacketDispatch().sendMessage("You appear on the volcano rim."); + break; + } + break; + case "open": + switch (((GameObject) node).getId()) { + case 2626: + player.getDialogueInterpreter().open(789, Repository.findNPC(789)); + break; + case 2628: + player.getPacketDispatch().sendMessage("The door is securely closed."); + break; + case 2627: + player.getDialogueInterpreter().open(788, Repository.findNPC(788), true); + break; + case 1591: + player.getPacketDispatch().sendMessage("You try and open the door..."); + player.getPacketDispatch().sendMessage("The door is locked tight, I can't open it."); + break; + case 2439: + player.getPacketDispatch().sendMessage("The gate doesn't open."); + break; + } + break; + case "search": + switch (((GameObject) node).getId()) { + case 2078: + player.getPacketDispatch().sendMessage("There are no bananas left on the tree."); + break; + case 2072: + int amt = player.getSavedData().getGlobalData().getKaramjaBananas(); + if (amt >= 10) { + player.getPacketDispatch().sendMessage("The crate is full of bananas."); + return true; + } + if (amt == 0) { + player.getPacketDispatch().sendMessage("The crate is completely empty."); + } else { + player.getPacketDispatch().sendMessage("The crate has " + amt + " banana " + (amt > 1 ? "s" : "") + "inside."); + } + break; + } + break; + case "fill": + if (player.getSavedData().getGlobalData().isLuthasTask()) { + int bananas = player.getInventory().getAmount(BANANA); + if (bananas > 0) { + player.getDialogueInterpreter().sendDialogue("You pack all your bananas into the crate."); + if (player.getInventory().remove(new Item(BANANA.getId(), bananas))) { + player.getSavedData().getGlobalData().setKaramjaBannanas(bananas + player.getSavedData().getGlobalData().getKaramjaBananas()); + } + } + } else { + player.getPacketDispatch().sendMessage("I don't know what goes in there."); + } + break; + case "shake": + if (player.getInventory().hasSpaceFor(new Item(Items.PALM_LEAF_2339))) { + player.getPacketDispatch().sendMessage("You shake the tree..."); + ObjectBuilder.replace(node.asObject(), node.asObject().transform(2976), 60); // 35 second cool-down + player.lock(); + final Pulse palmPulse = new Pulse(2) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("You pick up a fallen palm leaf off of the ground."); + player.getInventory().add(new Item(Items.PALM_LEAF_2339)); + // Collect five palm leaves + if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.KARAMJA, 2, 7)) { + int palms = player.getAttribute("palms", 0); + palms++; + player.setAttribute("palms", palms); + player.getAchievementDiaryManager().updateTask(player, DiaryType.KARAMJA, 2, 7, palms >= 5); + } + player.unlock(); + return true; + } + }; + GameWorld.getPulser().submit(palmPulse); + } else { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + } + break; + } + + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + if (((GameObject) n).getDefinition().hasAction("open")) { + return DoorActionHandler.getDestination((Player) node, (GameObject) n); + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/KhardianDesertPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/KhardianDesertPlugin.java new file mode 100644 index 000000000..e1894795f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/KhardianDesertPlugin.java @@ -0,0 +1,47 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles interactions in the khardian desert. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KhardianDesertPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(6481).getHandlers().put("option:enter", this); + ObjectDefinition.forId(6545).getHandlers().put("option:open", this); + ObjectDefinition.forId(6547).getHandlers().put("option:open", this); + ObjectDefinition.forId(6551).getHandlers().put("option:use", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 6481: + player.teleport(new Location(3233, 9313, 0)); + break; + case 6545: + case 6547: + // player.getPacketDispatch().sendMessage("A mystical power has sealed this door..."); + DoorActionHandler.handleAutowalkDoor(player, node.asObject()); + break; + case 6551: + player.teleport(new Location(3233, 2887, 0)); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/LumbridgeNodePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/LumbridgeNodePlugin.java new file mode 100644 index 000000000..9c79b83b8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/LumbridgeNodePlugin.java @@ -0,0 +1,200 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.component.Component; +import core.game.content.activity.ActivityManager; +import core.game.content.global.action.ClimbActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.Ammunition; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the node option handler for lumbridge. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumbridgeNodePlugin extends OptionHandler { + + /** + * If the flag is in use. + */ + private static boolean FLAG_IN_USE; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(36978).getHandlers().put("option:play", this); + ObjectDefinition.forId(37335).getHandlers().put("option:raise", this); + ObjectDefinition.forId(37095).getHandlers().put("option:shoot-at", this); + ObjectDefinition.forId(36976).getHandlers().put("option:ring", this); + ObjectDefinition.forId(22114).getHandlers().put("option:open", this); + ObjectDefinition.forId(29355).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(37655).getHandlers().put("option:view", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + int id = ((GameObject) node).getId(); + switch (id) { + case 29355: + if (node.getLocation().getX() == 3209) { + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, new Location(3210, 3216, 0)); + break; + } + ClimbActionHandler.climbLadder(player, node.asObject(), "climb-up"); + return true; + case 37095: + if (!player.getEquipment().contains(9706, 1) || !player.getEquipment().contains(9705, 1)) { + player.getPacketDispatch().sendMessage("You need a training bow and arrow to practice here."); + return true; + } + player.getPulseManager().run(new ArcheryTargetPulse(player, (GameObject) node)); + return true; + case 36978: + player.lock(); + ActivityManager.start(player, "organ cutscene", false); + return true; + case 37335: + if (!FLAG_IN_USE) { + FLAG_IN_USE = true; + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 0: + player.lock(); + player.sendMessage("You start cranking the lever."); + player.getPacketDispatch().sendObjectAnimation(((GameObject) node), new Animation(9979)); + player.animate(new Animation(9977)); + break; + case 8: + player.sendMessage("The flag reaches the top..."); + player.animate(new Animation(9978)); + break; + case 9: + player.sendChat("All Hail the Duke!"); + case 12: + player.sendMessage("...and slowly descends."); + player.unlock(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 1); + break; + } + return counter >= 20; + } + + @Override + public void stop() { + super.stop(); + FLAG_IN_USE = false; + } + }); + } + break; + case 36976: + player.getPacketDispatch().sendMessage("The townspeople wouldn't appreciate you ringing their bell."); + break; + case 37655: + player.getInterfaceManager().open(new Component(270)); + break; + + + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + final GameObject object = (GameObject) n; + if (object.getId() == 36976) { + return Location.create(3243, 3205, 2); + } else if (object.getId() == 37095) { + return n.getLocation().transform(5, 0, 0); + } + } + return null; + } + + /** + * Represents the archery target pulse. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class ArcheryTargetPulse extends Pulse { + + /** + * Represents the player instance. + */ + private final Player player; + + /** + * Represents the game object. + */ + private final GameObject object; + + /** + * Constructs a new {@code ArcheryCompetitionPulse} {@code Object}. + * + * @param player the player. + * @param object the object. + */ + public ArcheryTargetPulse(final Player player, final GameObject object) { + super(1, player, object); + this.player = player; + this.object = object; + } + + @Override + public boolean pulse() { + if (getDelay() == 1) { + setDelay(player.getProperties().getAttackSpeed()); + } + if (player.getEquipment().remove(new Item(9706, 1))) { + Projectile p = Ammunition.get(9706).getProjectile().transform(player, object.getLocation()); + p.setEndLocation(object.getLocation()); + p.setEndHeight(25); + p.send(); + player.animate(new Animation(426)); + Entity entity = player; + int level = entity.getSkills().getLevel(Skills.RANGE); + int bonus = entity.getProperties().getBonuses()[14]; + double prayer = 1.0; + if (entity instanceof Player) { + prayer += ((Player) entity).getPrayer().getSkillBonus(Skills.RANGE); + } + double cumulativeStr = Math.floor(level * prayer); + if (entity.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_RANGE_ACCURATE) { + cumulativeStr += 3; + } else if (entity.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_LONG_RANGE) { + cumulativeStr += 1; + } + cumulativeStr *= 1.0; + int hit = (int) ((14 + cumulativeStr + (bonus / 8) + ((cumulativeStr * bonus) * 0.016865)) * 1.0) / 10 + 1; + player.getSkills().addExperience(Skills.RANGE, ((hit * 1.33) / 10)); + return !player.getEquipment().contains(9706, 1) || !player.getEquipment().contains(9705, 1); + } else { + return true; + } + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/LunarIslePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/LunarIslePlugin.java new file mode 100644 index 000000000..a5e2876f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/LunarIslePlugin.java @@ -0,0 +1,43 @@ +package core.game.interaction.city; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * The plugin used to handle the interactions on Lunar Isle (Moonclan island). + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class LunarIslePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(16777).getHandlers().put("option:close", this); + ObjectDefinition.forId(16774).getHandlers().put("option:open", this); + NPCDefinition.forId(4512).getHandlers().put("option:go-inside", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node.getId(); + switch (id) { + case 16777: + case 16774: + player.getTeleporter().send(Location.create(2101, 3926, 0), TeleportType.FAIRY_RING); + break; + case 4512: + player.getTeleporter().send(Location.create(2451, 4645, 0), TeleportType.FAIRY_RING); + break; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/MonasteryPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/MonasteryPlugin.java new file mode 100644 index 000000000..604b4b4f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/MonasteryPlugin.java @@ -0,0 +1,41 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the edgeville monastery. + * @author Vexia + */ +@Initializable +public final class MonasteryPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2641).getHandlers().put("option:climb-up", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 2641: + final boolean abbot = node.getLocation().equals(new Location(3057, 3483, 0)); + if (!player.getSavedData().getGlobalData().isJoinedMonastery()) { + player.getDialogueInterpreter().open(abbot ? 801 : 7727, true); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + } + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/MorytaniaPlugin.kt b/Server/src/main/java/Server/core/game/interaction/city/MorytaniaPlugin.kt new file mode 100644 index 000000000..ce7268d43 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/MorytaniaPlugin.kt @@ -0,0 +1,67 @@ +package core.game.interaction.city + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.impl.ForceMovement +import core.game.node.entity.player.Player +import core.game.world.map.Direction +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * File to be used for anything Morytania related. + * Handles the summoning/altar cave enter and exit in Morytania. + * @author Sir Kermit + */ + +@Initializable +class MorytaniaPlugin : OptionHandler() { + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin { + //Outside Grotto + ObjectDefinition.forId(3516).handlers["option:enter"] = this + //Inside Grotto + ObjectDefinition.forId(3526).handlers["option:exit"] = this + //Bridge Outside Grotto + ObjectDefinition.forId(3522).handlers["option:jump"] = this + return this + } + private val RUNNING_ANIM = Animation(1995) + private val JUMP_ANIM = Animation(1603) + + override fun handle(player: Player, node: Node, option: String): Boolean { + + val id = (node as GameObject).id + val outside = Location.create(3439, 3337, 0) + val inside = Location.create(3442, 9734, 1) + + when (id) { + //Handles sending the player inside of the cave. + 3516 -> { + if (node.id == 3516) { + player.teleport(inside) + return true + } + } + //Handles sending the player outside of the cave. + 3526 -> { + if (node.id == 3526) { + player.teleport(outside) + return true + } + } + //Handles Jumping over grotto bridge + 3522 -> if (player.location.y == 3328) { + ForceMovement.run(player, node.location, node.location.transform(0, 3, 0), RUNNING_ANIM, JUMP_ANIM, Direction.NORTH, 15).endAnimation = Animation.RESET + } else if (player.location.y == 3332){ + ForceMovement.run(player, node.location, node.location.transform(0, -3, 0), RUNNING_ANIM, JUMP_ANIM, Direction.SOUTH, 15).endAnimation = Animation.RESET + } + + } + return false + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/city/PortSarimPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/PortSarimPlugin.java new file mode 100644 index 000000000..d416bf138 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/PortSarimPlugin.java @@ -0,0 +1,147 @@ +package core.game.interaction.city; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the port sarim plugin. + * + * @author 'Vexia + * @date 30/11/2013 + */ +@Initializable +public final class PortSarimPlugin extends OptionHandler { + + /** + * Represents the taking animation. + */ + private static final Animation TAKE_ANIM = new Animation(832); + + /** + * Represents the karamjan rum item. + */ + private static final Item KARAMJAN_RUM = new Item(431); + + /** + * Represents the messages the sleeping guard can say. + */ + private static final String MESSAGES[] = new String[] { "Hmph... heh heh heh...", "Mmmm... big pint of beer... kebab...", "Mmmmmm... donuts...", "Guh.. mwww... zzzzzz..." }; + + /** + * Represents the entrana monks. + */ + private static final int[] MONKS = new int[] { 2728, 657, 2729, 2730, 2731, 658 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(2704).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(9565).getHandlers().put("option:open", this); + ObjectDefinition.forId(9565).getHandlers().put("option:pick-lock", this); + ObjectDefinition.forId(9563).getHandlers().put("option:open", this); + for (int i : MONKS) { + NPCDefinition.forId(i).getHandlers().put("option:take-boat", this); + } + ObjectDefinition.forId(2071).getHandlers().put("option:search", this); + NPCDefinition.forId(745).getHandlers().put("option:attack", this); + ObjectDefinition.forId(33173).getHandlers().put("option:exit", this); + ObjectDefinition.forId(33174).getHandlers().put("option:enter", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + switch (option) { + case "enter": + player.getProperties().setTeleportLocation(Location.create(3056, 9562, 0)); + player.getPacketDispatch().sendMessage("You leave the icy cavern."); + break; + case "exit": + player.getDialogueInterpreter().open(238284); + break; + case "attack": + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) != 20) { + player.getPacketDispatch().sendMessage("The goblin is already in prison. You have no reason to attack him."); + } else { + player.getPulseManager().clear("interaction:attack:" + node.hashCode()); + player.getProperties().getCombatPulse().attack(node); + } + break; + case "take-boat": + player.getDialogueInterpreter().open(((NPC) node).getId(), ((NPC) node)); + break; + case "open": + switch (((GameObject) node).getId()) { + case 9565: + case 9563: + player.getPacketDispatch().sendMessage("The door is securely locked."); + break; + } + break; + case "pick-lock": + switch (((GameObject) node).getId()) { + case 9565: + if (player.getLocation().getY() <= 3187) { + player.getPacketDispatch().sendMessage("You simply cannot find a way to pick the lock from this side."); + return true; + } + break; + } + break; + case "talk-to": + player.lock(2); + ((NPC) node).sendChat(MESSAGES[RandomFunction.random(MESSAGES.length)]); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogues(player, null, "Maybe I should let him sleep."); + return true; + } + }); + break; + case "search":// banan box + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return true; + } + player.getPacketDispatch().sendMessage("There are lots of bananas in the crate."); + player.lock(2); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + if (player.getAttribute("wydin-rum", false)) { + if (player.getInventory().add(KARAMJAN_RUM)) { + player.removeAttribute("wydin-rum"); + player.removeAttribute("stashed-rum"); + player.animate(TAKE_ANIM); + player.getPacketDispatch().sendMessage("You find your bottle of rum in amongst the bananas."); + } + return true; + } + player.getDialogueInterpreter().open(9682749); + return true; + } + + }); + break; + } + return true; + } + + @Override + public boolean isWalk(final Player player, final Node node) { + return !(node instanceof Item); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/RCGuildMap.java b/Server/src/main/java/Server/core/game/interaction/city/RCGuildMap.java new file mode 100644 index 000000000..3b5b405f3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/RCGuildMap.java @@ -0,0 +1,29 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + + +/** + * Map in RC guild/wiz tower + * @author ceik + */ +public class RCGuildMap extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(38422).getHandlers().put("option:study",this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if(option.equals("study")){ + player.getPacketDispatch().sendMessage("A map of 2009scape."); + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/RCGuildPortal.java b/Server/src/main/java/Server/core/game/interaction/city/RCGuildPortal.java new file mode 100644 index 000000000..72dd4fd3c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/RCGuildPortal.java @@ -0,0 +1,33 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Portal in wiz tower + * @author ceik + */ + +@Initializable +public class RCGuildPortal extends OptionHandler { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(38279).getHandlers().put("option:examine",this); + ObjectDefinition.forId(38279).getHandlers().put("option:enter",this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String string){ + if(string.equals("examine")){ + player.getPacketDispatch().sendMessage("The portal to the runecrafting guild."); + }else { + player.getPacketDispatch().sendMessage("Currently under construction."); + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/ShiloVillagePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/ShiloVillagePlugin.java new file mode 100644 index 000000000..bee04b4ce --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/ShiloVillagePlugin.java @@ -0,0 +1,149 @@ +package core.game.interaction.city; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles shilo village interactions. + * @author Vexia + */ +@Initializable +public final class ShiloVillagePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(511).getHandlers().put("option:pay-fare", this); + NPCDefinition.forId(510).getHandlers().put("option:pay-fare", this); + ObjectDefinition.forId(2230).getHandlers().put("option:board", this);// cart + // travel. + ObjectDefinition.forId(2230).getHandlers().put("option:pay-fare", this);// cart + // travel. + ObjectDefinition.forId(2265).getHandlers().put("option:board", this);// cart + // travel. + ObjectDefinition.forId(2265).getHandlers().put("option:pay-fare", this);// cart + // travel. + PluginManager.definePlugin(new VillageCartDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 511: + case 510: + player.getDialogueInterpreter().open(510, node); + break; + case 2230: + case 2265: + player.getDialogueInterpreter().open(510, RegionManager.getNpc(player, node.getId() == 2230 ? 510 : 511)); + break; + } + return true; + } + + /** + * Handles the vigroy dialogue. + * @author Vexia + */ + public static final class VillageCartDialogue extends DialoguePlugin { + + /** + * If the ride is to shilo. + */ + private boolean shilo; + + /** + * Constructs a new {@Code VigroyDialogue} {@Code Object} + * @param player the player. + */ + public VillageCartDialogue(Player player) { + super(player); + } + + /** + * Constructs a new {@Code VigroyDialogue} {@Code Object} + */ + public VillageCartDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new VillageCartDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + shilo = npc.getId() == 510; + npc("Hello Bwana!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("I am offering a cart ride to " + (shilo ? "Shilo Village" : "Brimhaven") + " if you're", "interested? It will cost 10 gold coins. Is that Ok?"); + stage++; + break; + case 1: + player("Yes please, I'd like to go to " + (shilo ? "Shilo Village" : "Brimhaven") + "."); + stage++; + break; + case 2: + npc("Great! Just hop into the cart then and we'll go!"); + stage++; + break; + case 3: + if (!player.getInventory().contains(995, 10)) { + player.sendMessage("Not enough coins."); + end(); + break; + } + interpreter.sendDialogue("You hop into the cart and the driver urges the horses on. You take", "a taxing journey through the jungle to " + (shilo ? "Shilo Village" : "Brimhaven") + "."); + stage++; + break; + case 4: + interpreter.sendDialogue("You pay the fare and hand 10 gold coins to " + npc.getName() + "."); + stage++; + break; + case 5: + if (player.getInventory().remove(new Item(995, 10))) { + interpreter.sendDialogue("You feel tired from the journey, but at least you didn't have to walk", "all that distance."); + stage++; + } else { + end(); + } + break; + case 6: + end(); + player.getProperties().setTeleportLocation(shilo ? Location.create(2834, 2951, 0) : Location.create(2780, 3212, 0)); + // Use Vigroy and Hajedy's cart service + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 3); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 511, 510 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/SophanemPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/SophanemPlugin.java new file mode 100644 index 000000000..1783b7a47 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/SophanemPlugin.java @@ -0,0 +1,44 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * The plugin for handling stuff in Sophanem. + * @author jamix77 + * + */ +@Initializable +public class SophanemPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(20277).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(20275).getHandlers().put("option:climb-down", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node instanceof GameObject ? ((GameObject) node).getId() : ((Item) node).getId(); + switch (id) { + case 20275: + ClimbActionHandler.climb(player, new Animation(827), Location.create(2799, 5160, 0)); + break; + case 20277: + ClimbActionHandler.climb(player, new Animation(828), Location.create(3315,2796,0)); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/TaverlyDungeonPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/TaverlyDungeonPlugin.java new file mode 100644 index 000000000..887a71241 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/TaverlyDungeonPlugin.java @@ -0,0 +1,71 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for taverly dungeon. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class TaverlyDungeonPlugin extends OptionHandler { + + /** + * The suits of armour. + */ + private static final NPC[] ARMOUR_SUITS = new NPC[2]; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2143).getHandlers().put("option:open", this); + ObjectDefinition.forId(2144).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = ((GameObject) node).getId(); + switch (id) { + case 2143: + case 2144: + if (player.getLocation().getX() < node.getLocation().getX() && !player.getAttribute("spawned_suits", false)) { + boolean alive = true; + for (int i = 0; i < ARMOUR_SUITS.length; i++) { + NPC npc = ARMOUR_SUITS[i]; + if (npc == null || !npc.isActive()) { + Location location = Location.create(2887, 9829 + (i * 3), 0); + ARMOUR_SUITS[i] = npc = NPC.create(453, location); + npc.init(); + npc.getProperties().getCombatPulse().attack(player); + GameObject object = RegionManager.getObject(location); + if (object != null) { + ObjectBuilder.remove(object); + } + alive = false; + } + } + if (!alive) { + player.setAttribute("spawned_suits", true); + player.getPacketDispatch().sendMessage("Suddenly the suit of armour comes to life!"); + return true; + } + } + player.removeAttribute("spawned_suits"); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/TrollheimPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/TrollheimPlugin.java new file mode 100644 index 000000000..afdd6eb6f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/TrollheimPlugin.java @@ -0,0 +1,890 @@ +package core.game.interaction.city; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the plugin used to handle all trollheim node interations. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class TrollheimPlugin extends OptionHandler { + + /** + * Represents the locations to use. + */ + private static final Location[] LOCATIONS = new Location[] { new Location(2269, 4752, 0), new Location(2858, 3577, 0), Location.create(2808, 10002, 0), Location.create(2796, 3615, 0), Location.create(2907, 10019, 0), Location.create(2904, 3643, 0), new Location(2908, 3654, 0), Location.create(2907, 10035, 0), new Location(2893, 10074, 0), new Location(2893, 3671, 0) }; + + /** + * Represents the climbing boots item. + */ + private static final Item CLIMBING_BOOTS = new Item(3105); + + /** + * Represents the climb down animation. + */ + private static final Animation CLIMB_DOWN = new Animation(1148); + + /** + * Represents the climb up animation. + */ + private static final Animation CLIMB_UP = new Animation(740); + + /** + * Represents the climb fail animation. + */ + public static final Animation CLIMB_FAIL = new Animation(739); + + /** + * Represents the low jumpa nimation. + */ + private static final Animation JUMP = new Animation(839); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(3735).getHandlers().put("option:enter", this); + ObjectDefinition.forId(32738).getHandlers().put("option:exit", this); + NPCDefinition.forId(1069).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(3742).getHandlers().put("option:read", this); + ObjectDefinition.forId(3774).getHandlers().put("option:leave", this); + ObjectDefinition.forId(3723).getHandlers().put("option:climb", this);// located + // in + // circle + // area. + ObjectDefinition.forId(3722).getHandlers().put("option:climb", this);// located + // in + // circle + // area. + ObjectDefinition.forId(3748).getHandlers().put("option:climb", this); + ObjectDefinition.forId(3790).getHandlers().put("option:climb", this);// pos=Location.create(2858, + // 3627, + // 0) + ObjectDefinition.forId(3791).getHandlers().put("option:climb", this);// pos=Location.create(2858, + // 3627, + // 0) + ObjectDefinition.forId(3782).getHandlers().put("option:open", this);// arena + // entrance + ObjectDefinition.forId(3783).getHandlers().put("option:open", this);// arena + // entrance + ObjectDefinition.forId(3762).getHandlers().put("option:open", this);// secret + // door. + ObjectDefinition.forId(4499).getHandlers().put("option:enter", this);// entrance + // near + // golden + // apple. + ObjectDefinition.forId(4500).getHandlers().put("option:enter", this);// entrance + // near + // golden + // apple. + ObjectDefinition.forId(9303).getHandlers().put("option:climb", this);// lvl + // 41. + ObjectDefinition.forId(3782).getHandlers().put("option:open", this);// arena + // entrance. + ObjectDefinition.forId(3783).getHandlers().put("option:open", this);// arena + // entrance. + ObjectDefinition.forId(3785).getHandlers().put("option:open", this);// arena + // exit. + ObjectDefinition.forId(3786).getHandlers().put("option:open", this);// arena + // exit. + ObjectDefinition.forId(3757).getHandlers().put("option:enter", this);// arena + // cave + // entrance. + ObjectDefinition.forId(3758).getHandlers().put("option:exit", this);// arena + // cave + // exit. + ObjectDefinition.forId(9327).getHandlers().put("option:climb", this);// lvl + // 64 + ObjectDefinition.forId(9304).getHandlers().put("option:climb", this); + ;// lvl + // 43 + ObjectDefinition.forId(3803).getHandlers().put("option:climb", this); + ;// lvl + // 43 + // near + // trollheim + // top. + ObjectDefinition.forId(3804).getHandlers().put("option:climb", this); + ;// lvl + // 43 + // near + // trollheim + // top. + ObjectDefinition.forId(9306).getHandlers().put("option:climb", this);// lvl + // 47 + ObjectDefinition.forId(9305).getHandlers().put("option:climb", this);// lvl + // 44 + ObjectDefinition.forId(3759).getHandlers().put("option:enter", this);// top + // cave. + ObjectDefinition.forId(3771).getHandlers().put("option:enter", this);// stronghold + // to + // herb + // patch + ObjectDefinition.forId(18834).getHandlers().put("option:climb-up", this);// stronghold + // ladder + ObjectDefinition.forId(18833).getHandlers().put("option:climb-down", this);// stronghold + // ladder + PluginManager.definePlugin(new SabaDialogue()); + PluginManager.definePlugin(new WoundedSoldier()); + PluginManager.definePlugin(new WarningZone()); + ActivityManager.register(new WarningCutscene()); + PluginManager.definePlugin(new TenzingDialogue()); + PluginManager.definePlugin(new TrollNPC()); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final int id = node instanceof GameObject ? ((GameObject) node).getId() : ((NPC) node).getId(); + final Location loc = node.getLocation(); + int xOffset = 0, yOffset = 0; + Direction direction = Direction.SOUTH; + switch (option) { + case "enter": + switch (id) { + case 3735: + player.getProperties().setTeleportLocation(LOCATIONS[0]); + break; + case 4499: + player.getProperties().setTeleportLocation(LOCATIONS[2]); + break; + case 4500: + player.getProperties().setTeleportLocation(LOCATIONS[3]); + break; + case 3723: + player.getProperties().setTeleportLocation(LOCATIONS[4]); + break; + case 3757: + player.getProperties().setTeleportLocation(loc.equals(new Location(2907, 3652, 0)) ? LOCATIONS[7] : LOCATIONS[4]); + break; + case 3759: + player.getProperties().setTeleportLocation(LOCATIONS[8]); + break; + case 3771: + player.teleport(new Location(2837, 10090, 2)); + break; + } + break; + case "leave": + player.teleport(new Location(2840, 3690)); + break; + case "exit": + switch (id) { + case 32738: + if (loc.equals(new Location(2892, 10072, 0))) { + player.getProperties().setTeleportLocation(LOCATIONS[0]); + return true; + } + player.teleport(LOCATIONS[1]); + break; + case 3758: + player.getProperties().setTeleportLocation(loc.equals(new Location(2906, 10036, 0)) ? LOCATIONS[6] : LOCATIONS[5]); + break; + } + break; + case "talk-to": + switch (id) { + case 1069: + player.getDialogueInterpreter().open(id, node); + break; + } + break; + case "read": + switch (id) { + case 3742: + ActivityManager.start(player, "trollheim-warning", false); + break; + } + break; + case "open": + switch (id) { + case 3785:// exit + case 3786:// exit + case 3782:// entrance + case 3783:// entrance. + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + case 3672: + player.getPacketDispatch().sendMessage("You don't know how to open the secret door."); + break; + } + break; + case "climb-up": + switch (id) { + case 18834: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, new Location(2828, 3678), "You climb up the ladder to the surface."); + break; + } + break; + case "climb-down": + switch (id) { + case 18833: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_DOWN, new Location(2831, 10076, 2), "You climb down the ladder."); + break; + } + break; + case "climb": + if (!player.getEquipment().containsItem(CLIMBING_BOOTS)) { + player.getPacketDispatch().sendMessage("You need Climbing boots to negotiate these rocks."); + return true; + } + final GameObject object = ((GameObject) node); + switch (id) { + case 3723: + bandaid(player, player.getLocation(), object.getLocation().transform(0, 2, 0), CLIMB_UP); + break; + case 3722: + bandaid(player, player.getLocation(), object.getLocation().transform(0, -3, 0), CLIMB_DOWN, CLIMB_DOWN, object.getDirection()); + break; + case 3790:// rock scalling. + xOffset = player.getLocation().getX() < loc.getX() ? 2 : -2; + direction = getOpposite(ForceMovement.direction(player.getLocation(), object.getLocation().transform(xOffset, yOffset, 0))); + //bandaid(player, player.getLocation(), object.getLocation().transform(xOffset, yOffset, 0), CLIMB_DOWN, CLIMB_DOWN, direction); + player.getProperties().setTeleportLocation(object.getLocation().transform(xOffset, yOffset, 0)); + break; + case 3791:// rock scalling. + xOffset = player.getLocation().getX() < loc.getX() ? 2 : -2; + //bandaid(player, player.getLocation(), object.getLocation().transform(xOffset, yOffset, 0), CLIMB_UP); + player.getProperties().setTeleportLocation(object.getLocation().transform(xOffset, yOffset, 0)); + break; + case 3748: + player.getPacketDispatch().sendMessage("You climb onto the rock..."); + if (loc.equals(new Location(2821, 3635, 0))) { + bandaid(player, player.getLocation(), loc.transform(player.getLocation().getX() > loc.getX() ? -1 : 1, 0, 0), JUMP); + } else if (loc.equals(new Location(2910, 3687, 0)) || loc.equals(new Location(2910, 3686, 0))) { + if (player.getSkills().getLevel(Skills.AGILITY) < 43) { + player.getPacketDispatch().sendMessage("You need an Agility level of 43 in order to climb this mountain side."); + return true; + } + if (player.getLocation().equals(Location.create(2911, 3687, 0))) { + bandaid(player, player.getLocation(), Location.create(2909, 3687, 0), JUMP); + } else if (player.getLocation().equals(new Location(2909, 3687, 0))) { + bandaid(player, player.getLocation(), Location.create(2911, 3687, 0), JUMP); + } else if (player.getLocation().equals(Location.create(2911, 3686, 0))) { + bandaid(player, player.getLocation(), Location.create(2909, 3686, 0), JUMP); + } else { + bandaid(player, player.getLocation(), Location.create(2911, 3686, 0), JUMP); + } + } else { + bandaid(player, player.getLocation(), player.getLocation().getY() < object.getLocation().getY() ? player.getLocation().transform(0, 2, 0) : player.getLocation().transform(0, -2, 0), JUMP); + } + player.getPacketDispatch().sendMessage("...and step down the other side."); + break; + case 3803: + case 3804: + if (player.getSkills().getLevel(Skills.AGILITY) < 43) { + player.getPacketDispatch().sendMessage("You need an Agility level of 43 in order to climb this mountain side."); + return true; + } + if (player.getLocation().equals(Location.create(2884, 3684, 0))) { + bandaid(player, player.getLocation(), Location.create(2886, 3684, 0), CLIMB_UP); + } else if (player.getLocation().equals(Location.create(2884, 3683, 0))) { + bandaid(player, player.getLocation(), Location.create(2886, 3683, 0), CLIMB_UP); + } else if (player.getLocation().equals(Location.create(2886, 3683, 0))) { + bandaid(player, player.getLocation(), Location.create(2884, 3683, 0), CLIMB_DOWN, CLIMB_DOWN, Direction.EAST); + } else if (player.getLocation().equals(Location.create(2888, 3660, 0)) || player.getLocation().equals(Location.create(2887, 3660, 0))) { + bandaid(player, player.getLocation(), player.getLocation().transform(0, 2, 0), CLIMB_UP); + } else if (player.getLocation().equals(Location.create(2888, 3662, 0)) || player.getLocation().equals(Location.create(2887, 3662, 0))) { + bandaid(player, player.getLocation(), player.getLocation().transform(0, -2, 0), CLIMB_DOWN, CLIMB_DOWN, Direction.NORTH); + } else { + bandaid(player, player.getLocation(), Location.create(2884, 3684, 0), CLIMB_DOWN, CLIMB_DOWN, Direction.EAST); + } + break; + case 9306: + if (player.getSkills().getLevel(Skills.AGILITY) < 47) { + player.getPacketDispatch().sendMessage("You need an Agility level of 47 in order to climb this mountain side."); + return true; + } + if (player.getLocation().equals(Location.create(2903, 3680, 0))) { + bandaid(player, player.getLocation(), Location.create(2900, 3680, 0), CLIMB_UP); + } else { + bandaid(player, player.getLocation(), Location.create(2903, 3680, 0), CLIMB_DOWN, CLIMB_DOWN, Direction.WEST); + } + break; + case 9303: + if (player.getSkills().getLevel(Skills.AGILITY) < 41) { + player.getPacketDispatch().sendMessage("You need an Agility level of 41 in order to climb this mountain side."); + return true; + } + if (player.getLocation().getX() > loc.getX()) { + bandaid(player, player.getLocation(), object.getLocation().transform(-2, 0, 0), CLIMB_DOWN, CLIMB_DOWN, Direction.EAST); + } else { + bandaid(player, player.getLocation(), object.getLocation().transform(2, 0, 0), CLIMB_UP); + } + break; + case 9304: + if (player.getSkills().getLevel(Skills.AGILITY) < 47) { + player.getPacketDispatch().sendMessage("You need an Agility level of 47 in order to climb this mountain side."); + return true; + } + if (player.getLocation().equals(Location.create(2878, 3665, 0))) { + bandaid(player, player.getLocation(), new Location(2878, 3668, 0), CLIMB_UP); + } else { + bandaid(player, player.getLocation(), new Location(2878, 3665, 0), CLIMB_DOWN, CLIMB_DOWN, Direction.NORTH); + } + break; + case 9305: + if (player.getSkills().getLevel(Skills.AGILITY) < 44) { + player.getPacketDispatch().sendMessage("You need an Agility level of 44 in order to climb this mountain side."); + return true; + } + if (player.getLocation().equals(new Location(2909, 3684, 0))) { + bandaid(player, player.getLocation(), Location.create(2907, 3682, 0), CLIMB_UP, CLIMB_UP, Direction.SOUTH); + } else { + bandaid(player, player.getLocation(), Location.create(2909, 3684, 0), CLIMB_DOWN, CLIMB_DOWN, Direction.SOUTH); + + } + break; + case 9327: + if (player.getSkills().getLevel(Skills.AGILITY) < 64) { + player.getPacketDispatch().sendMessage("You need an Agility level of 64 in order to climb this mountain side."); + return true; + } + if (object.getLocation().equals(new Location(2916, 3672, 0))) { + bandaid(player, player.getLocation(), Location.create(2918, 3672, 0), CLIMB_UP); + } else if (object.getLocation().equals(new Location(2917, 3672, 0))) { + bandaid(player, player.getLocation(), Location.create(2915, 3672, 0), CLIMB_DOWN, CLIMB_DOWN, Direction.EAST); + } else if (object.getLocation().equals(new Location(2923, 3673, 0))) { + bandaid(player, player.getLocation(), Location.create(2921, 3672, 0), CLIMB_UP); + } else if (object.getLocation().equals(new Location(2922, 3672, 0))) { + bandaid(player, player.getLocation(), Location.create(2924, 3673, 0), CLIMB_DOWN, CLIMB_DOWN, Direction.WEST); + } + break; + } + break; + } + return true; + } + + public void bandaid(Player player, Location l, Location e, Animation a){ + player.getProperties().setTeleportLocation(e); + } + + public void bandaid(Player player, Location l, Location e, Animation a, Animation b, Direction d){ + player.getProperties().setTeleportLocation(e); + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + final GameObject object = ((GameObject) n); + if (object.getId() == 3782) { + if (node.getLocation().getX() >= 2897) { + return Location.create(2897, 3618, 0); + } + } else if (object.getId() == 3804) { + if (object.getLocation().equals(new Location(2885, 3684, 0)) && node.getLocation().getX() >= 2885) { + return object.getLocation().transform(1, 0, 0); + } + } else if (object.getId() == 9306 && node.getLocation().getX() >= 2902) { + return Location.create(2903, 3680, 0); + } + } + return null; + } + + /** + * Gets the opposite direction. + * @param dir the dir. + * @return the opposite direction. + */ + private Direction getOpposite(Direction dir) { + switch (dir) { + case EAST: + return Direction.WEST; + case NORTH: + return Direction.SOUTH; + case SOUTH: + return Direction.NORTH; + case WEST: + return Direction.EAST; + default: + break; + } + return null; + } + + /** + * Represents the saba dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ + public final class SabaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code TrolleimPlugin} {@code Object}. + */ + public SabaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TrolleimPlugin} {@code Object}. + * @param player the player. + */ + public SabaDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SabaDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hello!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Why won't people leave me alone?!"); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1070 }; + } + + } + + /** + * Represents the wounded soldiers dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ + public final class WoundedSoldier extends DialoguePlugin { + + /** + * Constructs a new {@code WoundedSoldier} {@code Object}. + */ + public WoundedSoldier() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TrolleimPlugin} {@code Object}. + * @param player the player. + */ + public WoundedSoldier(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WoundedSoldier(player); + } + + @Override + public boolean open(Object... args) { + player("Are you OK?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Urrrgggh....."); + stage = 1; + break; + case 1: + npc("I'll be OK, the trolls only leave the plateau at nightfall.", "The guys are bringing a stretcher shortly."); + stage = 2; + break; + case 2: + player("As long as you're sure."); + stage = 3; + break; + case 3: + npc("It's my own fault really, I was having a walk and", "wandered past the danger sign. The trolls throw rocks", "down at any one who goes up the path!"); + stage = 4; + break; + case 4: + npc("Don't go up there!"); + stage = 5; + break; + case 5: + player("OK, thanks for the warning."); + stage = 6; + break; + case 6: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1069 }; + } + + } + + /** + * Represents the warning map zone. + * @author 'Vexia + * @version 1.0 + */ + public static final class WarningZone extends MapZone implements Plugin { + + /** + * Represents the warning component interface, + */ + private static final Component COMPONENT = new Component(581); + + /** + * Constructs a new {@code WarningZone} {@code Object}. + */ + public WarningZone() { + super("trollheim-warning", true); + } + + @Override + public boolean enter(final Entity entity) { + if (entity instanceof Player) { + final Player p = (Player) entity; + if (p.getWalkingQueue().getFootPrint().getY() < 3592) { + p.getWalkingQueue().reset(); + p.getPulseManager().clear(); + p.getInterfaceManager().open(COMPONENT); + } + } + return super.enter(entity); + } + + @Override + public void configure() { + register(new ZoneBorders(2837, 3592, 2838, 3593)); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + } + + /** + * Represents the warning cutscene plugin. + * @author 'Vexia + * @version 1.0 + */ + public static final class WarningCutscene extends CutscenePlugin { + + /** + * Represents the throwing animation. + */ + private static final Animation THROW = new Animation(1142); + + /** + * Represents the troll location. + */ + private static final Location TROLL_LOCATION = new Location(2851, 3598, 0); + + /** + * Constructs a new {@code WarningCutscene} {@code Object}. + */ + public WarningCutscene() { + super("trollheim-warning"); + } + + /** + * Constructs a new {@code WarningCutscene} {@code Object}. + * @param p the player. + */ + public WarningCutscene(Player p) { + super("trollheim-warning", false); + this.player = p; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new WarningCutscene(p); + } + + @Override + public void open() { + final NPC npc = Repository.findNPC(TROLL_LOCATION); + Location loc = Location.create(2849, 3597, 0); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, loc.getX() - 2, loc.getY(), 1300, 1, 30)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, loc.getX() + 22, loc.getY() + 10, 1300, 1, 30)); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + switch (count++) { + case 4: + if (npc != null) { + npc.faceTemporary(player, 3); + npc.animate(THROW); + } + break; + case 6: + WarningCutscene.this.stop(false); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 1300, 1, 30)); + return true; + } + return false; + } + }); + } + + @Override + public int getMapState() { + return 0; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + ActivityManager.register(this); + } + + } + + /** + * Represents the dialogue plugin used for the tenzing npc. + * @author 'Vexia + * @version 1.0 + */ + public static final class TenzingDialogue extends DialoguePlugin { + + /** + * Represents the coins items. + */ + private static final Item COINS = new Item(995, 12); + + /** + * Constructs a new {@code TenzingDialogue} {@code Object}. + */ + public TenzingDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TenzingDialogue} {@code Object}. + * @param player the player. + */ + public TenzingDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TenzingDialogue(player); + } + + @Override + public boolean open(Object... args) { + player("Hello Tenzing!"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Hello traveller. What can I do for you?"); + stage = 1; + break; + case 1: + options("Can I buy some Climbing boots?", "What does a Sherpa do?", "How did you find out about the secret way?", "Nice place you have here.", "Nothing, thanks!"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Can I buy some Climbing boots?"); + stage = 10; + break; + case 2: + player("What does a Sherpa do?"); + stage = 20; + break; + case 3: + player("How did you find out about the secret way?"); + stage = 30; + break; + case 4: + player("Nice place you have here."); + stage = 40; + break; + case 5: + player("Nothing, thanks!"); + stage = 50; + break; + } + break; + case 10: + npc("Sure, I'll sell you some in your size for 12 gold."); + stage = 11; + break; + case 11: + options("OK, sounds good.", "No, thanks."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("OK, sounds good."); + stage = 13; + break; + case 2: + player("No, thanks."); + stage = 50; + break; + } + break; + case 13: + if (!player.getInventory().hasSpaceFor(CLIMBING_BOOTS)) { + player("I don't have enough space in my backback right", "this second."); + stage = 50; + return true; + } + if (!player.getInventory().containsItem(COINS)) { + end(); + return true; + } + if (!player.getInventory().remove(COINS)) { + player("I don't have enough coins right now."); + stage = 50; + return true; + } + if (player.getInventory().add(CLIMBING_BOOTS)) { + interpreter.sendItemMessage(CLIMBING_BOOTS, "Tenzing has given you some Climbing boots."); + player.getPacketDispatch().sendMessage("Tenzing has given you some Climbing boots."); + } + stage = 50; + break; + case 20: + npc("We are expert guides that take adventurers such as", "yourself, on mountaineering expeditions."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + npc("I used to take adventurers up Death Plateau and", "further north before the trolls came. I know these", "mountains well."); + stage = 31; + break; + case 31: + end(); + break; + case 40: + npc("Thanks, I built it myself! I'm usually self sufficient but", "I can't earn any money with the trolls camped on", "Death Plateau,"); + stage = 41; + break; + case 41: + end(); + break; + case 50: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1071 }; + } + } + + /** + * Represents the a trollheim troll. + * @author 'Vexia + * @version 1.0 + */ + public final class TrollNPC extends AbstractNPC { + + /** + * Constructs a new {@code TrollNPC} {@code Object}. + */ + public TrollNPC() { + super(0, null); + } + + /** + * Constructs a new {@code TrollNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public TrollNPC(int id, Location location) { + super(id, location, true); + this.setAggressive(true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TrollNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1138 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/TzhaarCityPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/TzhaarCityPlugin.java new file mode 100644 index 000000000..18fc15f71 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/TzhaarCityPlugin.java @@ -0,0 +1,198 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.activity.ActivityManager; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for tzhaar city. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class TzhaarCityPlugin extends OptionHandler { + + /** + * Represents the locations to use. + */ + private static final Location[] LOCATIONS = new Location[] { Location.create(2480, 5175, 0), Location.create(2866, 9571, 0) }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(31284).getHandlers().put("option:enter", this);// karamja + // cave. + ObjectDefinition.forId(9359).getHandlers().put("option:enter", this);// tzhaar + // exit + ObjectDefinition.forId(9356).getHandlers().put("option:enter", this); + ObjectDefinition.forId(9369).getHandlers().put("option:pass", this); + new TzhaarDialogue().init(); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int id = ((GameObject) node).getId(); + switch (option) { + case "enter": + switch (id) { + case 31284: + player.getProperties().setTeleportLocation(LOCATIONS[0]); + break; + case 9359: + player.getProperties().setTeleportLocation(LOCATIONS[1]); + break; + case 9356: + if (player.getFamiliarManager().hasFamiliar()) { + player.getPacketDispatch().sendMessage("You can't enter this with a follower."); + break; + } + ActivityManager.start(player, "fight caves", false); + break; + } + break; + case "pass": + switch (id) { + case 9369: + ActivityManager.start(player, "fight pits", false); + break; + } + break; + } + return true; + } + + /** + * Represents the dialogue plugin used for the tzhaar npcs. + * @author 'Vexia + * @version 1.0 + */ + public static final class TzhaarDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code TzhaarDialogue} {@code Object}. + */ + public TzhaarDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TzhaarDialogue} {@code Object}. + * @param player the player. + */ + public TzhaarDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TzhaarDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Can I help you JalYt-Ket-" + player.getUsername() + "?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("What do you have to trade?", "What did you call me?", "No I'm fine thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + player("What did you call me?"); + stage = 20; + break; + case 3: + player("No I'm fine thanks."); + stage = 30; + break; + } + break; + case 10: + break; + case 20: + npc("Are you not JalYt-Ket?"); + stage = 21; + break; + case 21: + options("What's a 'JalYt-Ket'?", "I guess so...", "No I'm not!"); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + player("What's a 'JalYt-Ket'?"); + stage = 100; + break; + case 2: + player("I guess so..."); + stage = 120; + break; + case 3: + player("No I'm not!"); + stage = 130; + break; + } + break; + case 100: + npc("That what you are... you tough and strong no?"); + stage = 101; + break; + case 101: + player("Well yes I suppose I am..."); + stage = 102; + break; + case 102: + npc("Then you JalYt-Ket!"); + stage = 103; + break; + case 103: + end(); + break; + case 120: + npc("Well then, no problems."); + stage = 121; + break; + case 121: + end(); + break; + case 130: + end(); + break; + case 23: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2620, 2622, 2623 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/VarrockNodePlugin.java b/Server/src/main/java/Server/core/game/interaction/city/VarrockNodePlugin.java new file mode 100644 index 000000000..c380138ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/VarrockNodePlugin.java @@ -0,0 +1,310 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle node interactions in varrock. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class VarrockNodePlugin extends OptionHandler { + + /** + * Represents the bronze axe item. + */ + private static final Item BRONZE_AXE = new Item(1351); + + /** + * Represents the spade item. + */ + private static final Item SPADE = new Item(952); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(24357).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(5581).getHandlers().put("option:take-axe", this); + ObjectDefinition.forId(36974).getHandlers().put("option:take-axe", this); + ObjectDefinition.forId(24427).getHandlers().put("option:walk-up", this); + ObjectDefinition.forId(24428).getHandlers().put("option:walk-down", this); + ObjectDefinition.forId(1749).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(23636).getHandlers().put("option:read", this); + ObjectDefinition.forId(24389).getHandlers().put("option:knock-at", this); + ObjectDefinition.forId(9662).getHandlers().put("option:take", this); + ObjectDefinition.forId(17974).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(29534).getHandlers().put("option:enter", this); + ObjectDefinition.forId(17985).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(24366).getHandlers().put("option:climb-up", this); + ObjectBuilder.add(new GameObject(17974, new Location(3204, 9911), 10, 0)); + new KnockatDoorDialogue().init(); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final int id = node instanceof GameObject ? ((GameObject) node).getId() : ((Item) node).getId(); + switch (id) { + case 24366: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, new Location(3237, 3459)); + return true; + case 29534: + player.getDialogueInterpreter().open(543543); + return true; + case 17985: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_DOWN, new Location(3204, 9910), "You enter the murky sewers."); + return true; + case 17974: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, new Location(3179, 3472), "You resurface."); + return true; + case 24389: + player.getDialogueInterpreter().open(KnockatDoorDialogue.ID, player.getLocation().getX() == 3182 ? 45 : 44); + break; + case 28094: + player.getDialogueInterpreter().sendDialogues(player, FacialExpression.THINKING, "I don't think I should go inside."); + break; + case 23636: + player.getInterfaceManager().open(new Component(531)); + break; + case 1749: + if (player.getLocation().getZ() == 2 && player.getLocation().getDistance(new Location(3096, 3433, 2)) < 4) { + ClimbActionHandler.climb(player, new Animation(827), Location.create(3097, 3432, 1)); + return true; + } else if (player.getLocation().getZ() == 1 && player.getLocation().getDistance(new Location(3095, 3433, 1)) < 4) { + ClimbActionHandler.climb(player, new Animation(827), Location.create(3096, 3432, 0)); + return true; + } + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + case 5581: + case 36974: + if (!player.getInventory().add(BRONZE_AXE)) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return true; + } + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(5582), 5000); + break; + case 24357: + if (player.getLocation().getDistance(Location.create(3188, 3358, 0)) < 3) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(3188, 3354, 1)); + return true; + } + if (((GameObject) node).getLocation().equals(new Location(3156, 3435, 0))) { + ClimbActionHandler.climb(player, new Animation(828), Location.create(3155, 3435, 1)); + return true; + } + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + + case 24427: //varrock museum stairs that lead upstairs + if (player.getLocation().getDistance(Location.create(1758, 4959, 0)) < 3) { + ClimbActionHandler.climb(player, new Animation(-1), Location.create(3258, 3452, 0)); + return true; + } + return true; + + case 24428: //varrock museum stairs that lead downstairs + if (player.getLocation().getDistance(Location.create(3255, 3451, 0)) < 4) { + ClimbActionHandler.climb(player, new Animation(-1), Location.create(1759, 4958, 0)); + return true; + } + return true; + case 9662: + if (!player.getInventory().hasSpaceFor(SPADE)) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return true; + } + player.getInventory().add(SPADE); + ObjectBuilder.replace((GameObject) node, ((GameObject) node).transform(0), 250); + return true; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public boolean isWalk(final Player player, final Node node) { + return !(node instanceof Item); + } + + /** + * Represents the dialogue used for the knocking at a door in varrock bank. + * + * @author 'Vexia + * @version 1.0 + */ + public final class KnockatDoorDialogue extends DialoguePlugin { + + /** + * Represents the id of this dialogue. + */ + private static final int ID = 903042893; + + /** + * Represents the id to use. + */ + private int npcId; + + /** + * Constructs a new {@code KnockatDoorDialogue} {@code Object}. + */ + public KnockatDoorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KnockatDoorDialogue} {@code Object}. + * + * @param player the player. + */ + public KnockatDoorDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KnockatDoorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npcId = (int) args[0]; + player("I don't think I'm ever going to be allowed in there."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player.lock(3); + interpreter.sendPlainMessage(true, "Knock knock..."); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + interpreter.sendDialogues(npcId, null, "Who's there?"); + stage = 1; + return true; + } + }); + break; + case 1: + options("I'm " + player.getUsername() + ". Please let me in.", "Boo.", "Kanga.", "Thank.", "Doctor."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("I'm " + player.getUsername() + ". Please let me in."); + stage = 10; + break; + case 2: + player("Boo."); + stage = 20; + break; + case 3: + player("Kanga."); + stage = 30; + break; + case 4: + player("Thank."); + stage = 40; + break; + case 5: + player("Doctor."); + stage = 50; + break; + } + break; + case 10: + interpreter.sendDialogues(npcId, null, "No. Staff only beyond this point.", "You can't come in here."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + interpreter.sendDialogues(npcId, null, "Boo who?"); + stage = 21; + break; + case 21: + player("There's no need to cry!"); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npcId, FacialExpression.FURIOUS, "What? I'm not... oh, just go away!"); + stage = 23; + break; + case 23: + end(); + break; + case 30: + interpreter.sendDialogues(npcId, null, "Kanga who?"); + stage = 31; + break; + case 31: + player("No, 'kangaroo'."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npcId, FacialExpression.FURIOUS, "Stop messing about and go away!"); + stage = 33; + break; + case 33: + end(); + break; + case 40: + interpreter.sendDialogues(npcId, null, "Thank who?"); + stage = 41; + break; + case 41: + player("You're welcome!"); + stage = 42; + break; + case 42: + interpreter.sendDialogues(npcId, FacialExpression.FURIOUS, "Stop it!"); + stage = 43; + break; + case 43: + end(); + break; + case 50: + interpreter.sendDialogues(npcId, FacialExpression.FURIOUS, "Doctor. wh.. hang on, I'm not falling for that one again!", "Go away."); + stage = 51; + break; + case 51: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{903042893}; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/WildernessPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/WildernessPlugin.java new file mode 100644 index 000000000..ae1085388 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/WildernessPlugin.java @@ -0,0 +1,150 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents a plugin used to handle wilderness nodes. + * + * @author 'Vexia + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class WildernessPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new KBDPlugin().newInstance(arg); + ObjectDefinition.forId(37749).getHandlers().put("option:go-through", this); + ObjectDefinition.forId(37928).getHandlers().put("option:go-through", this); + ObjectDefinition.forId(37929).getHandlers().put("option:go-through", this); + ObjectDefinition.forId(38811).getHandlers().put("option:go-through", this); + ObjectDefinition.forId(39191).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(39188).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 37749: + player.teleport(Location.create(2885, 4372, 2)); + break; + case 39191: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, Location.create(3239, 3606, 0), "You climb up the ladder to the surface."); + break; + case 39188: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_DOWN, Location.create(3241, 9991, 0), "You descend into the cavern below."); + break; + case 37928: + player.teleport(Location.create(3214, 3782, 0)); + break; + case 38811: + case 37929: + if(player.getLocation().getX() < node.getLocation().getX()){ + player.getInterfaceManager().open(new Component(650)); + } else { + player.teleport(player.getLocation().transform(player.getLocation().getX() < node.getLocation().getX() ? 4 : -4, 0, 0)); + } + break; + } + return true; + } + + /** + * Represents the plugin used to handle kbd nodes. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class KBDPlugin extends OptionHandler { + + /** + * Represents the locations used for kbd interactions. + */ + private static final Location[] LOCATIONS = new Location[] { new Location(3017, 3849, 0), Location.create(3069, 10257, 0), new Location(3069, 3856, 0), new Location(3017, 3850, 0), Location.create(2272, 4680, 0), Location.create(3067, 10253, 0), new Location(3069, 10256, 0) }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(1765).getHandlers().put("option:climb-down", this);// ladder + ObjectDefinition.forId(1766).getHandlers().put("option:climb-up", this);// ladder + ObjectDefinition.forId(1816).getHandlers().put("option:pull", this);// kbd + ObjectDefinition.forId(1817).getHandlers().put("option:pull", this);// kbd + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int id = ((GameObject) node).getId(); + switch (option) { + case "climb-down": + switch (id) { + case 1765:// kbd ladder. + if (node.getLocation().equals(LOCATIONS[0])) { + ClimbActionHandler.climb(player, new Animation(827), LOCATIONS[1]); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + } + break; + } + break; + case "climb-up": + switch (id) { + case 1766:// kbd leave ladder. + if (node.getLocation().equals(LOCATIONS[6])) { + ClimbActionHandler.climb(player, new Animation(828), LOCATIONS[3]); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + } + break; + } + break; + case "pull": + switch (id) { + case 1816:// kbd lever. + if (player.getLocation().withinDistance(LOCATIONS[5])) { + player.getPacketDispatch().sendMessage("You pull the lever..."); + player.getTeleporter().send(LOCATIONS[4], TeleportType.NORMAL); + player.getPacketDispatch().sendMessage("... and teleport into the lair of the King Black Dragon!", 5); + } + break; + case 1817: + if (player.getLocation().withinDistance(LOCATIONS[4])) { + player.getPacketDispatch().sendMessage("You pull the lever..."); + player.getTeleporter().send(LOCATIONS[5], TeleportType.NORMAL); + player.getPacketDispatch().sendMessage("... and teleport out of the lair of the King Black Dragon!", 5); + } + break; + } + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + // if (n instanceof GameObject) { + // int id = ((GameObject) n).getId(); + // if (id == 1817) { + // return Location.create(2273, 4680, 0); + // } else if (id == 1816) { + // return Location.create(3067, 10253, 0); + // } + // } + return null; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/WizardTowerPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/WizardTowerPlugin.java new file mode 100644 index 000000000..591f7ae93 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/WizardTowerPlugin.java @@ -0,0 +1,1796 @@ +package core.game.interaction.city; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.Skillcape; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.content.global.travel.EssenceTeleport; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; +import core.plugin.Initializable; +import core.tools.StringUtils; + +/** + * Represents the plugins used related to the wizard tower. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WizardTowerPlugin extends OptionHandler { + + /** + * Represents the location of the wizard tower. + */ + private static final Location BASEMENT = new Location(3104, 9576, 0); + + /** + * Represents the location of the ground floor. + */ + private static final Location GROUND_FLOOR = new Location(3105, 3162, 0); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(12540).getHandlers().put("option:search", this); + ObjectDefinition.forId(12539).getHandlers().put("option:search", this); + ObjectDefinition.forId(2147).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(32015).getHandlers().put("option:climb-up", this); + NPCDefinition.forId(300).getHandlers().put("option:teleport", this); + ObjectDefinition.forId(11993).getHandlers().put("option:open", this); + PluginManager.definePlugin(new WizardtowerWizardNPC()); + PluginManager.definePlugin(new WizardTowerDialogue()); + PluginManager.definePlugin(new WizardMisgogDialogue()); + PluginManager.definePlugin(new WizardGrayzagDialogue()); + PluginManager.definePlugin(new WizardDialogue()); + PluginManager.definePlugin(new SedridorDialogue()); + PluginManager.definePlugin(new AuburyDialoguePlugin()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "teleport": + if (!player.getQuestRepository().isComplete("Rune Mysteries")) { + player.getPacketDispatch().sendMessage("You need to have completed the Rune Mysteries Quest to use this feature."); + return true; + } + EssenceTeleport.teleport(((NPC) node), player); + break; + case "climb-down": + player.getProperties().setTeleportLocation(BASEMENT); + break; + case "climb-up": + if (node.getLocation().equals(new Location(3017, 10249))) { + ClimbActionHandler.climb(player, new Animation(828), new Location(3069, 3857, 0)); + return true; + } + if (node.getLocation().equals(new Location(3069, 10256))) { + ClimbActionHandler.climb(player, new Animation(828), new Location(3017, 3850, 0)); + return true; + } + if (player.getLocation().withinDistance(Location.create(3117, 9753, 0))) { + ClimbActionHandler.climb(player, new Animation(828), new Location(3092, 3361, 0)); + return true; + } + if (!Location.create(3103, 9576, 0).equals(((GameObject) node).getLocation())) { + return ObjectDefinition.getOptionHandler(2147, "climb-up").handle(player, node, option); + } + player.getProperties().setTeleportLocation(GROUND_FLOOR); + break; + case "search": + player.getDialogueInterpreter().open(458543948); + break; + case "open": + if (node.getLocation().equals(new Location(3107, 3162, 0))) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node, player.getLocation().getX() >= 3107 ? Location.create(3106, 3161, 0) : Location.create(3108, 3163, 0)); + } else { + DoorActionHandler.handleDoor(player, (GameObject) node); + } + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + final GameObject object = (GameObject) n; + if (object.getId() == 11993 && object.getLocation().equals(new Location(3107, 3162, 0))) { + return node.getLocation().getX() >= 3107 ? Location.create(3108, 3163, 0) : Location.create(3106, 3161, 0); + } + } + return null; + } + + /** + * Represents a wizard at the wizard tower. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class WizardtowerWizardNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = {13}; + + /** + * Constructs a new {@code WizardtowerWizardNPC} {@code Object}. + */ + public WizardtowerWizardNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * + * @param id The NPC id. + * @param location The location. + */ + private WizardtowerWizardNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new WizardtowerWizardNPC(id, location); + } + + @Override + public void init() { + super.init(); + getProperties().getCombatPulse().setStyle(CombatStyle.MAGIC); + getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(8)); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + GroundItemManager.create(new Item(526), getLocation(), (Player) killer); + } + + @Override + public int[] getIds() { + return ID; + } + + } + + /** + * Represents the dialogue used in the wizard tower. + * + * @author 'Vexia + * @version 1.0 + */ + public final class WizardTowerDialogue extends DialoguePlugin { + + /** + * Represents the book name to use. + */ + private String bookName = ""; + + /** + * Represents the book names. + */ + private final String[] books = new String[]{"Living with a Wizard Husband - a Housewife's Story", "Wind Strike for Beginners", "So you think you're a Mage? Volume 28", "101 Ways to Impress your Mates with Magic", "The Life & Times of a Thingummywut by Traiborn the Wizard", "How to become the Ulitmate Wizard of the Universe", "The Dark Arts of Magical Wands"}; + + /** + * Constructs a new {@code WizardTowerDialogue.java} {@code Object}. + */ + public WizardTowerDialogue() { + } + + /** + * Constructs a new {@code WizardTowerDialogue.java} {@code Object}. + * + * @param player the player. + */ + public WizardTowerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WizardTowerDialogue(player); + } + + @Override + public boolean open(Object... args) { + sendDialogue("There's a large selection of books, the majority of which look fairly", "old. Some very strange names... You pick one at random :"); + bookName = books[RandomFunction.random(books.length)]; + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + sendDialogue("'" + bookName + "'"); + stage = 1; + break; + case 1: + sendDialogue("Interesting..."); + stage = 2; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{458543948}; + } + } + + /** + * Handles the WizardMisgogDialogue dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class WizardMisgogDialogue extends DialoguePlugin { + + /** + * Represents the black bead item. + */ + private static final Item BLACK_BEAD = new Item(1474); + + /** + * Represents the red bead item. + */ + private static final Item RED_BEAD = new Item(1470); + + /** + * Represents the white bead item. + */ + private static final Item WHITE_BEAD = new Item(1476); + + /** + * Represents the yellow bead item. + */ + private static final Item YELLOW_BEAD = new Item(1472); + + /** + * Represents the animation. + */ + private static final Animation ANIMATION = new Animation(4285); + + /** + * Constructs a new {@code WizardMisgogDialogue} {@code Object}. + */ + public WizardMisgogDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WizardMisgogDialogue} {@code Object}. + * + * @param player the player. + */ + public WizardMisgogDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WizardMisgogDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + Quest quest = player.getQuestRepository().getQuest("Imp Catcher"); + switch (quest.getStage(player)) { + case 0: + player("Give me a quest!"); + stage = 0; + break; + case 10: + npc("So how are you doing finding my beads?"); + stage = 0; + break; + case 100: + options("Got any more quests?", "Do you know any interesting spells you could teach me?"); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Imp Catcher"); + switch (quest.getStage(player)) { + case 0: + switch (stage) { + case 0: + npc("Give me a quest what?"); + stage = 1; + break; + case 1: + options("Give me a quest please.", "Give me a quest or else!", "Just stop messing around and give me a quest!"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + player("Give me a quest please."); + stage = 10; + break; + case 2: + player("Give me a quest or else!"); + stage = 20; + break; + case 3: + player("Just stop messing around and give me a quest!"); + stage = 30; + break; + } + break; + case 10: + npc("Well seeing as you asked nicely... I could do with some", "help."); + stage = 11; + break; + case 11: + npc("The wizard Grayzag next door decided he didn't like", "me so he enlisted an army of hundreds of imps."); + stage = 12; + break; + case 12: + npc("The imps stole all sorts of my things. Most of these", "things I don't really care about, just eggs and balls of", "string and things."); + stage = 13; + break; + case 13: + npc("But they stole my four magical beads. There was a red", "one, a yellow one, a black one, and a white one."); + stage = 14; + break; + case 14: + npc("These imps have now spread out all over the kingdom.", "Could you get my beads back for me?"); + stage = 15; + break; + case 15: + options("I'll try", "I've better things to do than chase imps."); + stage = 16; + break; + case 16: + switch (buttonId) { + case 1: + player("I'll try."); + stage = 17; + break; + case 2: + player("I've better things to do than chase imps."); + stage = 18; + break; + } + break; + case 17: + npc("That's great, thank you."); + stage = 19; + break; + case 19: + quest.start(player); + player.getQuestRepository().syncronizeTab(player); + end(); + break; + case 18: + end(); + break; + case 20: + npc("Or else what? You'll attack me?"); + stage = 21; + break; + case 21: + npc("Hahaha!"); + stage = 22; + break; + case 22: + end(); + break; + case 30: + npc("Ah now you're assuming I have one to give."); + stage = 31; + break; + case 31: + end(); + break; + } + break; + case 10: + switch (stage) { + case 0: + if (player.getInventory().containItems(BLACK_BEAD.getId(), RED_BEAD.getId(), YELLOW_BEAD.getId(), WHITE_BEAD.getId())) { + player("I've got all four beads. It was hard work I can tell you."); + stage = 5; + break; + } + if (!player.getInventory().containsItem(WHITE_BEAD) && !player.getInventory().containsItem(RED_BEAD) && !player.getInventory().containsItem(YELLOW_BEAD) && !player.getInventory().containsItem(BLACK_BEAD)) { + player("I've not found any yet."); + stage = 1; + } else { + player("I have found some of your beads."); + stage = 3; + } + break; + case 1: + npc("Well get on with it. I've lost a white bead, a read bead, a", "black bead, and a yellow bead. Go kill some imps!"); + stage = 2; + break; + case 2: + end(); + break; + case 3: + npc("Come back when you have them all. The colour of the", "four beads that I need are red, yellow, black, and white.", "Go chase some imps!"); + stage = 4; + break; + case 4: + end(); + break; + case 5: + npc("Give them here and I'll check that they really are MY", "beads, before I give you your reward. You'll like it, it's", "an amulet of accuracy."); + stage = 6; + break; + case 6: + sendDialogue("You give four coloured beads to Wizard Mizgog."); + stage = 7; + break; + case 7: + end(); + if (player.getInventory().remove(BLACK_BEAD, WHITE_BEAD, RED_BEAD, YELLOW_BEAD)) { + player.lock(7); + npc.faceLocation(Location.create(3102, 3163, 2)); + npc.animate(ANIMATION); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + quest.finish(player); + player.getQuestRepository().syncronizeTab(player); + return true; + } + + }); + } + break; + } + break; + case 100: + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player("Got any more quests?"); + stage = 10; + break; + case 2: + player("Do you know any interesting spells you could teach me?"); + stage = 20; + break; + } + break; + case 10: + npc("No, everything is good with the world today."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc("I don't think so, the type of magic I study involves", "years of meditation and research."); + stage = 11; + break; + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{706}; + } + } + + /** + * Handles the WizardGrayzagDialogue dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final class WizardGrayzagDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code WizardGrayzagDialogue} {@code Object}. + */ + public WizardGrayzagDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WizardGrayzagDialogue} {@code Object}. + * + * @param player the player. + */ + public WizardGrayzagDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WizardGrayzagDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Not now, I'm trying to concentrate on a", "very difficult spell!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{707}; + } + } + + /** + * Handles the WizardDialogue dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class WizardDialogue extends DialoguePlugin { + + /** + * Represents the bark item used to make split bark equipment. + */ + private static final Item BARK = new Item(3239); + + /** + * Constructs a new {@code WizardDialogue} {@code Object}. + */ + public WizardDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code WizardDialogue.java} {@code Object}. + * + * @param player the player. + */ + public WizardDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new WizardDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hello there, can I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("What do you do here?", "What's that you're wearing?", "Can you make me some armour please?", "No thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("What do you do here?"); + stage = 10; + break; + case 2: + player("What's that you're wearing?"); + stage = 20; + break; + case 3: + player("Can you make me some armour please?"); + stage = 30; + break; + case 4: + player("No thanks."); + stage = 40; + break; + } + break; + case 30: + npc("Certainly, what would like to me to make?"); + stage = 31; + break; + case 31: + player.getInterfaceManager().openChatbox(new Component(306)); + int count = 2; + int shift = 75; + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 306, 26, 10, shift)); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 306, 22, 88, shift)); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 306, 18, 288, shift)); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 306, 14, 188, shift + 5)); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 306, 10, 380, shift)); + int indexes[] = new int[]{26, 22, 14, 18, 10}; + for (SplitBark bark : SplitBark.values()) { + player.getPacketDispatch().sendItemZoomOnInterface(bark.itemId, 170, 306, count); + player.getPacketDispatch().sendString(StringUtils.formatDisplayName(bark.name()), 306, indexes[bark.ordinal()]); + count++; + } + stage = 32; + break; + case 32: + final SplitBark bark = SplitBark.forButton(buttonId); + if (bark == null) { + end(); + return true; + } + + if (!player.getInventory().contains(BARK.getId(), bark.getAmt())) { + String name = bark == SplitBark.HELM ? "a splitbark helm" : bark == SplitBark.BODY ? "a splitbark body" : bark == SplitBark.BOOTS ? "splitbark boots" : bark == SplitBark.GAUNTLETS ? "splitbark gauntlets" : "splitbark legs"; + npc("You need " + bark.getAmt() + " pieces of bark for " + name + "."); + return true; + } + final int amount = getAmt(buttonId); + if (amount == -1) {// rscript. + player.getDialogueInterpreter().sendInput(false, "Enter amount:"); + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + final int amt = (int) getValue(); + make(bark, amt); + return true; + } + }); + return true; + } + make(bark, amount); + break; + case 33: + end(); + break; + case 20: + npc("Split-bark armour is special armour for mages, it's much", "more resistant to physical attacks than normal robes.", "It's actually very easy for me to make, but I've been", "having trouble getting hold of the pieces."); + stage = 14; + break; + case 10: + npc("I've been studying the practice of making split-bark", "armour."); + stage = 11; + break; + case 11: + options("Split-bark armour, what's that?", "Can you make me some?"); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("Split-bark armour, what's that?"); + stage = 13; + break; + case 2: + player("Can you make me some?"); + stage = 9000; + break; + } + break; + case 13: + npc("Split-bark armour is special armour for mages, it's much", "more resistant to physical attacks than normal robes.", "It's actually very easy for me to make, but I've been", "having trouble getting hold of the pieces."); + stage = 14; + break; + case 14: + options("Well good luck with that.", "Can you make me some?"); + stage = 15; + break; + case 15: + switch (buttonId) { + case 1: + player("Well good luck with that."); + stage = 16; + break; + case 2: + player("Can you make me some?"); + stage = 9000; + break; + } + break; + case 16: + end(); + break; + case 9000: + npc("I need bark from a hollow tree, and some fine cloth.", "Unfortunately both these items can be found in", "Morytania, especially the cloth which is found in the", "tombs of shades."); + stage = 9001; + break; + case 9001: + npc("Of course I'd happily sell you some at a discounted", "price if you bring me those items."); + stage = 9002; + break; + case 9002: + options("Ok, guess I'll go looking then!", "Ok, how much do I need?"); + stage = 9003; + break; + case 9003: + switch (buttonId) { + case 1: + player("Ok, guess I'll go looking then!"); + stage = 9004; + break; + case 2: + player("Ok, how much do I need?"); + stage = 9005; + break; + } + break; + case 9004: + end(); + break; + case 9005: + npc("1 need 1 piece of each for either gloves or boots,", "2 pieces of each for a hat,", "3 pieces of each for leggings,", "and 4 pieces of each for a top."); + stage = 9006; + break; + case 9006: + npc("I'll charge you 1,000 coins for either gloves or boots,", "6,000 coins for a hat", "32,000 coins for leggings,", "and 37,000 for a top."); + stage = 9007; + break; + case 9007: + player("Ok, guess I'll go looking then!"); + stage = 9008; + break; + case 9008: + end(); + break; + case 40: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{1263}; + } + + /** + * Method used to make split bark. + * + * @param bark the bark. + * @param amount the amount. + */ + public final void make(final SplitBark bark, int amount) { + final int barkAmt = player.getInventory().getAmount(BARK); + if (barkAmt < amount * bark.getAmt()) { + npc("You don't have enough bark to make that many."); + stage = 33; + return; + } + if (amount < 1) { + end(); + return; + } + if (player.getInventory().freeSlots() < amount) { + player("Sorry, I don't seem to have enough inventory space."); + stage = 33; + return; + } + if (!player.getInventory().contains(995, bark.getCost() * amount)) { + player("Sorry, I don't seem to have enough coins."); + stage = 33; + return; + } + final Item money = new Item(995, bark.getCost() * amount); + final Item barkRemove = new Item(BARK.getId(), amount * bark.getAmt()); + if (player.getInventory().remove(money) && player.getInventory().remove(barkRemove)) { + player.getInventory().add(new Item(bark.getItemId(), amount)); + npc("There you go, enjoy your new armour!"); + return; + } + end(); + } + + /** + * Method used to get the amount to make. + * + * @param buttonId the button id. + * @return the amt. + */ + public final int getAmt(final int buttonId) { + int amount = -1; + switch (buttonId) { + case 10: + case 14: + case 18: + case 22: + case 26: + amount = 1; + break; + case 9: + case 13: + case 17: + case 21: + case 25: + amount = 5; + break; + case 8: + case 12: + case 16: + case 20: + case 24: + amount = 10; + break; + case 7: + case 11: + case 15: + case 19: + case 23: + amount = -1; + break; + } + return amount; + } + + /** + * Represents the split bark item info. + * + * @author 'Vexia + * @date 21/11/2013 + */ + public enum SplitBark { + HELM(3385, 6000, 2, 9), BODY(3387, 37000, 4, 13), LEGS(3389, 32000, 3, 17), GAUNTLETS(3391, 1000, 1, 21), BOOTS(3393, 1000, 1, 25); + + /** + * Constructs a new {@code WizardDialogue.java} {@code Object}. + * + * @param itemId the item id. + * @param cost the cost. + * @param buttonId the button id. + */ + SplitBark(final int itemId, final int cost, final int amt, final int buttonId) { + this.itemId = itemId; + this.cost = cost; + this.amt = amt; + this.buttonId = buttonId; + } + + /** + * Represents the item to give. + */ + private final int itemId; + + /** + * Represents the cost of the item. + */ + private final int cost; + + /** + * Represents the needed amt. + */ + private final int amt; + + /** + * Represents the button id. + */ + private final int buttonId; + + /** + * Gets the itemId. + * + * @return The itemId. + */ + public int getItemId() { + return itemId; + } + + /** + * Gets the cost. + * + * @return The cost. + */ + public int getCost() { + return cost; + } + + /** + * Gets the buttonId. + * + * @return The buttonId. + */ + public int getButtonId() { + return buttonId; + } + + /** + * Method used to get the splitbark armour. + * + * @return the split bark. + */ + public static SplitBark forButton(final int buttonId) { + SplitBark bark = null; + if (buttonId >= 7 && buttonId <= 10) { + bark = HELM; + } + if (buttonId >= 11 && buttonId <= 14) { + bark = BODY; + } + if (buttonId >= 15 && buttonId <= 18) { + bark = LEGS; + } + if (buttonId >= 19 && buttonId <= 22) { + bark = GAUNTLETS; + } + if (buttonId >= 23 && buttonId <= 26) { + bark = BOOTS; + } + if (buttonId == 26) { + bark = HELM; + } + return bark; + } + + /** + * Gets the amt. + * + * @return The amt. + */ + public int getAmt() { + return amt; + } + } + } + + /** + * Handles the SedridorDialogue dialogue. + * + * @author 'Vexia + * @version 1.0 + */ + public final static class SedridorDialogue extends DialoguePlugin { + + /** + * Represents the talisman item. + */ + private static final Item TALISMAN = new Item(1438); + + /** + * Represents the package item. + */ + private static final Item PACKAGE = new Item(290); + + /** + * Represents the notes item. + */ + private static final Item NOTES = new Item(291); + + /** + * Represents the graphic to use. + */ + private static final Graphics GRAPHIC = new Graphics(6); + + /** + * Constructs a new {@code SedridorDialogue} {@code Object}. + */ + public SedridorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SedridorDialogue} {@code Object}. + * + * @param player the player. + */ + public SedridorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SedridorDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Welcome adventurer, to the world renowned", "Wizards' Tower. How may I help you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Rune Mysteries"); + switch (stage) { + case 0: + if (quest.getStage(player) == 100) { + player("Hello there."); + stage = 400; + return true; + } + if (quest.getStage(player) == 10) { + options("Nothing thanks, I'm just looking around.", "What are you doing down here?", "I'm looking for the head wizard."); + stage = 1000; + return true; + } + if (quest.getStage(player) == 20) { + npc("Wow! This is... incredible!"); + stage = 52; + return true; + } + if (quest.getStage(player) == 30) { + npc("Ah, " + player.getUsername() + ". How goes your quest? Have you", "delivered the research notes to my friend Aubury yet?"); + stage = 800; + return true; + } + if (quest.getStage(player) == 50) { + npc("Ah, " + player.getUsername() + ". How goes your quest? Have you", "delivered the research notes to my friend Aubury yet?"); + stage = 900; + return true; + } + options("Nothing thanks, I'm just looking around.", "What are you doing down here?"); + stage = 1; + break; + case 400: + npc("Hello again " + player.getUsername() + ". What can I do for you?"); + stage = 401; + break; + case 401: + options("Nothing thanks, I'm just looking around.", "Can you teleport me to the Rune Essence?"); + stage = 402; + break; + case 402: + switch (buttonId) { + case 1: + player("Nothing thanks, I'm just looking around."); + stage = 403; + break; + case 2: + player("Can you teleport me to the Rune Essence?"); + stage = 405; + break; + } + break; + case 403: + npc("Well, take care adventurer. You stand on the", "ruins of the old destroyed Wizards' Tower.", "Strange and powerful magicks lurk here,"); + stage = 404; + break; + case 404: + end(); + break; + case 405: + end(); + EssenceTeleport.teleport(npc, player); + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 14); + break; + case 900: + player("Yes, I have. He gave me some research notes", "to pass on to you."); + stage = 901; + break; + case 901: + npc("May I have his notes then?"); + stage = 902; + break; + case 902: + if (!player.getInventory().containsItem(NOTES)) { + player("Uh... I kind of... lost them..."); + stage = 903; + break; + } + player("Sure. I have them here."); + stage = 905; + break; + case 905: + npc("Well, before you hand them over to me, as you", "have been nothing but truthful with me to this point,", "and I admire that in an adventurer, I will let you", "into the secret of our research."); + stage = 906; + break; + case 906: + npc("Now as you may or may not know, many", "centuries ago, the wizards at this Tower", "learnt the secret of creating Rune Stones, which", "allowed us to cast Magic very easily."); + stage = 907; + break; + case 907: + npc("When this Tower was burnt down the secret of", "creating runes was lost ot us for all time... except it", "wasn't. Some months ago, while searching these ruins", "for information from the old days,"); + stage = 908; + break; + case 908: + npc("I came upon a scroll, almost destroyed, that detailed a", "magical rock deep in the icefields of the North, closed", "off from access by anything other than magical means."); + stage = 909; + break; + case 909: + npc("This rock was called the 'Rune Essence' by the", "magicians who studied its power. Apparently, by simply", "breaking a chunk from it, a Rune Stone could be", "fashioned very quickly and easily at certain"); + stage = 910; + break; + case 910: + npc("elemental altars that were scattered across the land", "back then. Now, this is an interesting little piece of", "history, but not much use to us as modern wizards", "without access to the Rune Essence,"); + stage = 911; + break; + case 911: + npc("or these elemental altars. This is where you and", "Aubury come into this story. A few weeks back,", "Aubury discovered in a standard delivery of runes", "to his store, a parchment detailing a"); + stage = 912; + break; + case 912: + npc("teleportation spell that he had never come across", "before. To his shock, when cast it took him to a", "strange rock he had never encountered before...", "yet that he felt strangely famliar..."); + stage = 913; + break; + case 913: + npc("As I'm sure you have now guessed, he had discovered a", "portal leading to the mythical Rune Essence. As soon as", "he told me of this spell, I saw the importance of his find,"); + stage = 914; + break; + case 914: + npc("for it we could but find the elemental altars spoken", "of in the ancient texts, we would once more be able", "to create runes as our ancestors had done! It would", "be the saviour of the wizards' art!"); + stage = 915; + break; + case 915: + player("I'm still not sure how I fit into", "this little story of yours..."); + stage = 916; + break; + case 916: + npc("You haven't guessed? This talisman you brought me...", "it is the key to the elemental altar of air! When", "you hold it next, it will direct you towards"); + stage = 917; + break; + case 917: + npc("the entrance to the long forgotten Air Altar! By", "bringing pieces of the Rune Essence to the Air Temple,", "you will be able to fashion your own Air Runes!"); + stage = 918; + break; + case 918: + npc("And this is not all! By finding other talismans similar", "to this one, you will eventually be able to craft every", "rune that is available on this world! Just"); + stage = 919; + break; + case 919: + npc("as our ancestors did! I cannot stress enough what a", "find this is! Now, due to the risks involved of letting", "this mighty power fall into the wrong hands"); + stage = 920; + break; + case 920: + npc("I will keep the teleport skill to the Rune Essence", "a closely guarded secret, shared only by myself", "and those Magic users around the world", "whom I trust enough to keep it."); + stage = 921; + break; + case 921: + npc("This means that if any evil power should discover", "the talismans required to enter the elemental", "temples, we will be able to prevent their access", "to the Rune Essence and prevent"); + stage = 922; + break; + case 922: + npc("tragedy befalling this world. I know not where the", "temples are located, nor do I know where the talismans", "have been scattered to in this land, but I now"); + stage = 923; + break; + case 923: + npc("return your Air Talisman to you. Find the Air", "Temple, and you will be able to charge your Rune", "Essences to become Air Runes at will. Any time"); + stage = 924; + break; + case 924: + npc("you wish to visit the Rune Essence, speak to me", "or Aubury and we will open a portal to that", "mystical place for you to visit."); + stage = 925; + break; + case 925: + player("So only you and Aubury know the teleport", "spell to the Rune Essence?"); + stage = 926; + break; + case 926: + npc("No... there are others... whom I will tell of your", "authorisation to visit that place. When you speak", "to them, they will know you, and grant you", "access to that place when asked."); + stage = 927; + break; + case 927: + npc("Use the Air Talisman to locate the air temple,", "and use any further talismans you find to locate", "the other missing elemental temples.", "Now... my research notes please?"); + stage = 928; + break; + case 928: + sendDialogue("You hand the head wizard the research notes.", "He hands you back the Air Talisman."); + stage = 929; + break; + case 929: + if (player.getInventory().remove(NOTES)) { + if (!player.getInventory().add(TALISMAN)) { + GroundItemManager.create(new GroundItem(TALISMAN, player.getLocation(), player)); + } + quest.finish(player); + player.getQuestRepository().syncronizeTab(player); + } + end(); + break; + case 903: + npc("You did? You are extremely careless aren't you? I", "suggest you go and speak to Aubury once more, with", "luck he will have made copies of his research."); + stage = 904; + break; + case 904: + end(); + break; + case 800: + player("Not yet..."); + stage = 801; + break; + case 801: + if (!player.getInventory().containsItem(PACKAGE) && !player.getBank().containsItem(PACKAGE)) { + player("...I lost the package you gave me."); + stage = 804; + return true; + } + npc("Well, please do so as soon as possible. Remember: to get", "to Varrock, head due North, through Draynor Village,", "around Draynor Manor, and then head East when"); + stage = 802; + break; + case 802: + npc("you get to the Barbarian village. The man you seek", "is named Aubury, and he owns the rune shop there.", "It is vital he receives this package."); + stage = 803; + break; + case 803: + end(); + break; + case 804: + npc("You WHAT?"); + stage = 805; + break; + case 805: + npc("Tch, that was really very careless of you. Luckily as", "head wizard I have great powers, and will be able to", "teleport it back here without too much effort."); + stage = 806; + break; + case 806: + close(); + npc.graphics(GRAPHIC); + player.lock(3); + GameWorld.getPulser().submit(new Pulse(2) { + @Override + public boolean pulse() { + npc("Ok, I have retrieved it. Luckily it doesn't appear to", "have been damaged. Now please take it to Aubury, ", "and try not to lose it again."); + stage = 807; + return true; + } + }); + break; + case 807: + if (!player.getInventory().add(PACKAGE)) { + GroundItemManager.create(new GroundItem(PACKAGE, player.getLocation(), player)); + } + end(); + break; + case 1000: + switch (buttonId) { + case 1: + player("Nothing thanks, I'm just looking around."); + stage = 10; + break; + case 2: + player("What are you doing down here?"); + stage = 20; + break; + case 3: + player("I'm looking for the head wizard."); + stage = 30; + break; + } + break; + case 30: + npc("Oh, you are, are you?", "And just why would you be doing that?"); + stage = 31; + break; + case 31: + player("The Duke of Lumbridge sent me to find him. I have", "this weird talisman he found. He said the head wizard", "would be very interested in it."); + stage = 32; + break; + case 32:// ...except I don't have it with me..." + npc("Did he now? HmmmMMMMMmmmmm.", "Well that IS interesting. Hand it over then adventurer,", "let me see what all the hubbub about it is.", "Just come amulet I'll wager."); + stage = 33; + break; + case 33: + options("Ok, here you are.", "No, I'll only give it to the head wizard."); + stage = 34; + break; + case 34: + switch (buttonId) { + case 1: + player("Ok, here you are."); + stage = 50; + break; + case 2: + player("No, I'll only give it to the head wizard."); + stage = 40; + break; + } + break; + case 50: + if (!player.getInventory().containsItem(TALISMAN)) { + player("...except I don't have it with me..."); + stage = 99; + break; + } + sendDialogue("You hand the Talisman to the wizard."); + stage = 51; + break; + case 51: + if (player.getInventory().remove(TALISMAN)) { + quest.setStage(player, 20); + npc("Wow! This is... incredible!"); + stage = 52; + } + break; + case 52: + npc("Th-this talisman you brought me...! It is the last piece", "of the puzzle, I think! Finally! The legacy of our", "ancestors... it will return to us once more!"); + stage = 53; + break; + case 53: + npc("I need time to study this, " + player.getUsername() + ". Can you please", "do me this task while I study this talisman you have", "brought me? In the mighty town of Varrock, which"); + stage = 54; + break; + case 54: + npc("is located North East of here, there is a certain shop", "that sells magical runes. I have in this package all of the", "research I have done relating to the Rune Stones, and"); + stage = 55; + break; + case 55: + npc("require somebody to take them to the shopkeeper so that", "he may share my research and offer me his insights.", "Do this thing for me, and bring back what he gives you,"); + stage = 56; + break; + case 56: + npc("and if my suspicions are correct, I will let you into the", "knowledge of one of the greatest secrets this world has", "ever known! A secret so powerful that is destroyed the"); + stage = 57; + break; + case 57: + npc("original Wizards' Tower all of those centuries", "ago! My research, combined with this mysterious", "talisman... I cannot believe the answer", "the mysteries is so close now!"); + stage = 58; + break; + case 58: + npc("Do this thing for me " + player.getUsername() + ". Be rewarded in a", "way you can never imagine."); + stage = 59; + break; + case 59: + options("Yes, certainly.", "No, I'm busy."); + stage = 60; + break; + case 60: + switch (buttonId) { + case 1: + player("Yes, certainly."); + stage = 70; + break; + case 2: + player("No, I'm busy."); + stage = 61; + break; + } + break; + case 70: + npc("Take this package, and head directly North", "from here, through Draynor village, until you reach", "the Barbarian Village. Then head East from there", "until you reach Varrock."); + stage = 71; + break; + case 71: + npc("Once in Varrock, take this package to the owner of the", "rune shop. His name is Aubury. You may find it", "helpful to ask one of Varrock's citizens for directions,"); + stage = 72; + break; + case 72: + npc("as Varrock can be a confusing place for the first time", "visitor. He will give you a special item - bring it back to", "me, and I shall show you the mystery of the runes..."); + stage = 73; + break; + case 73: + sendDialogue("The head wizard gives you a package."); + stage = 74; + break; + case 74: + quest.setStage(player, 30); + npc("Best of luck with your quest, " + player.getUsername() + "."); + if (!player.getInventory().add(PACKAGE)) { + GroundItemManager.create(new GroundItem(PACKAGE, player.getLocation(), player)); + } + stage = 75; + break; + case 75: + end(); + break; + case 61: + npc("As you wish adventurer. I will continue to study this", "talisman you have brought me. Return here if you find", "yourself with some spare time to help me."); + stage = 62; + break; + case 62: + end(); + break; + case 99: + end(); + break; + case 40: + npc("HA HA HA HA HA! I can tell you are new to this", "land, for I AM the head wizard! Hand it over and", "let me have a proper look at it, hmmm?"); + stage = 41; + break; + case 41: + options("Ok, here you are.", "No, I'll only give it to the head wizard."); + stage = 34; + break; + case 1: + switch (buttonId) { + case 1: + player("Nothing thanks, I'm just looking around."); + stage = 10; + break; + case 2: + player("What are you doing down here?"); + stage = 20; + break; + } + break; + case 10: + npc("Well, take care adventurer. You stand on the", "ruins of the destroyed Wizards' Tower.", "Strange and powerful magicks lurk here."); + stage = 11; + break; + case 11: + end(); + break; + case 20: + npc("That is indeed a good question. Here in the cellar", "of the Wizards' Tower you find the remains of", "the old Wizards' Tower, destroyed by fire"); + stage = 21; + break; + case 21: + npc("many years past by the treachery of the Zamorakians.", "Many mytseries were lost, which we try to find once", "more. By building this tower on the remains of the old,"); + stage = 22; + break; + case 22: + npc("we sought to show the world of our dedication to", "learning the mysteries of Magic. I am here searching", "through these fragments for knowledge from", "the artefacts from our past."); + stage = 23; + break; + case 23: + player("And have you found anything useful?"); + stage = 24; + break; + case 24: + npc("Aaah... that would be telling adventurer. Anything I", "have found I cannot speak freely of, for fear the", "treachery of the past might be repeated."); + stage = 25; + break; + case 25: + player("Ok, well I'll leave you to it."); + stage = 26; + break; + case 26: + npc("Perhaphs I will see you later " + player.getUsername() + "."); + stage = 27; + break; + case 27: + player("How did you know my name???"); + stage = 28; + break; + case 28: + npc("Well, I AM the head wizard here..."); + stage = 29; + break; + case 29: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{300}; + } + } + + /** + * Represents the dialogue plugin used for aubury. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class AuburyDialoguePlugin extends DialoguePlugin { + + /** + * Represents the package item. + */ + private static final Item PACKAGE = new Item(290); + + /** + * Represents the package item. + */ + private static final Item NOTES = new Item(291); + + /** + * The NPC ids that use this dialogue plugin. + */ + private static final int[] NPC_IDS = {553}; + + /** + * Constructs a new {@code AuburyDialoguePlugin} {@code Object}. + */ + public AuburyDialoguePlugin() { + /* + * empty. + */ + } + + public AuburyDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AuburyDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + final Quest quest = player.getQuestRepository().getQuest("Rune Mysteries"); + if (quest.getStage(player) == 40) { + npc("My gratitude to you adventurer for bringing me these", "research notes. I notice that you brought the head", "wizard a special talisman that was the key to our finally", "unlocking the puzzle."); + stage = 900; + return true; + } + if (Skillcape.isMaster(player, Skills.RUNECRAFTING)) { + options("Can I buy a Skillcape of Runecrafting?", "Something else"); + stage = 450; + } else { + npc("Do you want to buy some runes?"); + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + final Quest quest = player.getQuestRepository().getQuest("Rune Mysteries"); + switch (stage) { + case 0: + if (quest.getStage(player) == 30) { + options("Yes please!", "Oh, it's a rune shop. No thank you, then.", "I have been sent here with a package for you."); + stage = 800; + return true; + } + if (quest.getStage(player) == 40) { + npc("My gratitude to you adventurer for bringing me these", "research notes. I notice that you brought the head", "wizard a speical talisman that was the key to our finally", "unlocking the puzzle."); + stage = 900; + return true; + } + if (quest.getStage(player) == 50) { + npc("I suggest you take those research notes of mine back", "to the head wizard at the Wizards' Tower."); + stage = 950; + return true; + } + if (!player.getQuestRepository().isComplete("Rune Mysteries")) { + options("Yes please!", "Oh, it's a rune shop. No thank you, then."); + stage = 100; + } else { + options("Yes, please.", "No thanks.", "Can you teleport me to the rune essence?"); + stage = 1; + } + break; + case 900:// quest + npc("Combined with the information I had already collated", "regarding the Rune Essence, I think we have finally", "unlocked the power to"); + stage = 901; + break; + case 901: + npc("...no. I am getting ahead of myself. Please take this", "summary of my research back to the head wizard at", "the Wizards' Tower. I trust his judgement on whether", "to let you in on our little secret or not."); + stage = 902; + break; + case 902: + quest.setStage(player, 50); + if (!player.getInventory().add(NOTES)) { + GroundItemManager.create(new GroundItem(NOTES, player.getLocation(), player)); + } + sendDialogue("Aubury gives you his research notes."); + stage = 903; + break; + case 903: + end(); + break; + case 950: + if (!player.getBank().containsItem(NOTES) && !player.getInventory().containsItem(NOTES)) { + player("I can't... I lost them..."); + stage = 955; + return true; + } + player("Ok then, I will do that."); + stage = 951; + break; + case 951: + npc("Unless you were talking to me because you wished to", "buy some runes?"); + stage = 952; + break; + case 952: + options("Yes please!", "Oh, it's a rune shop. No thank you, then."); + stage = 100; + break; + case 955: + npc("Well, luckily I have duplicates. It's a good thing they", "are written in code, I would not want the wrong kind", "of person to get access to the information contained", "within."); + stage = 956; + break; + case 956: + if (!player.getInventory().add(NOTES)) { + GroundItemManager.create(new GroundItem(NOTES, player.getLocation(), player)); + } + sendDialogue("Aubury gives you his research notes."); + stage = 957; + break; + case 957: + end(); + break; + case 800:// quest + switch (buttonId) { + case 1: + npc.openShop(player); + end(); + break; + case 2: + player("Oh, it's a rune shop. No thank you, then."); + stage = 105; + break; + case 3: + player("I have been sent here with a package for you. It's from ", "the head wizard at the Wizards' Tower."); + stage = 801; + break; + } + break; + case 801: + player("I have been sent here with a package for you. It's from ", "the head wizard at the Wizards' Tower."); + stage = 802; + break; + case 802: + npc("Really? But... surely he can't have..? Please, let me", "have it, it must be extremely important for him to have", "sent a stranger."); + stage = 803; + break; + case 803: + if (!player.getInventory().containsItem(PACKAGE)) { + player("Uh... yeah... about that... I kind of don't have it with", "me..."); + stage = 804; + return true; + } + sendDialogue("You hand Aubury the research package."); + stage = 807; + break; + case 804: + npc("What kind of person tells me theyhave a delivery for", "me, but not with them? Honestly."); + stage = 805; + break; + case 805: + npc("Come back when you do."); + stage = 806; + break; + case 806: + end(); + break; + case 807: + if (player.getInventory().remove(PACKAGE)) { + quest.setStage(player, 40); + npc("This... this is incredible. Please, give me a few moments", "to quickly look over this, and then talk to me again."); + stage = 808; + } + break; + case 808: + end(); + break; + case 1: + switch (interfaceId) { + case 230: + switch (buttonId) { + case 1: + npc.openShop(player); + end(); + break; + case 2: + player("No thanks."); + stage = 10; + break; + case 3: + player("Can you teleport me to the rune essence?"); + stage = 11; + break; + } + } + break; + case 100: + switch (buttonId) { + case 1: + npc.openShop(player); + end(); + break; + case 2: + player("Oh, it's a rune shop. No thank you, then."); + stage = 105; + break; + } + break; + case 105: + end(); + break; + case 106: + end(); + break; + case 10: + end(); + break; + case 11: + EssenceTeleport.teleport(npc, player); + end(); + break; + case 450: + switch (buttonId) { + case 1: + player("Can I buy a Skillcape of Runecrafting?"); + stage = 2; + break; + case 2: + npc("Do you want to buy some runes?"); + stage = 0; + break; + } + break; + case 2: + npc("Certainly! Right when you give me 99000 coins."); + stage = 3; + break; + case 3: + options("Okay, here you go.", "No"); + stage = 4; + break; + case 4: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 5; + break; + case 2: + end(); + break; + } + break; + case 5: + if (Skillcape.purchase(player, Skills.RUNECRAFTING)) { + npc("There you go! Enjoy."); + } + stage = 6; + break; + case 6: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return NPC_IDS; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/ZanarisPlugin.java b/Server/src/main/java/Server/core/game/interaction/city/ZanarisPlugin.java new file mode 100644 index 000000000..ab028131b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/ZanarisPlugin.java @@ -0,0 +1,189 @@ +package core.game.interaction.city; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.crafting.gem.Gems; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the zanaris city plugin. + * @author Vexia + */ +@Initializable +public final class ZanarisPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new MagicDoorDialogue()); + ObjectDefinition.forId(12094).getHandlers().put("option:use", this); + ObjectDefinition.forId(12045).getHandlers().put("option:open", this); + ObjectDefinition.forId(12047).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 12094: + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(2452, 4473); + player.getTeleporter().send(Location.create(3201, 3169, 0), TeleportType.FAIRY_RING); + break; + case 12045: + case 12047: + if ((node.getId() == 12045 && node.getLocation().equals(new Location(2469, 4438, 0)) && player.getLocation().getX() >= 2470) || player.getLocation().getY() < 4434 && (node.getId() == 12045 || node.getId() == 12047 && node.getLocation().equals(new Location(2465, 4434, 0))) || node.getId() == 12047 && player.getLocation().getX() >= 2470) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + player.getDialogueInterpreter().open(MagicDoorDialogue.NAME, node); + break; + } + return true; + } + + /** + * Handles the magic door dialogue. + * @author Vexia + */ + public final class MagicDoorDialogue extends DialoguePlugin { + + /** + * The dialogue name. + */ + public static final String NAME = "tax door"; + + /** + * The object. + */ + private GameObject door; + + /** + * Constructs a new {@code MagicDoorDialogue} {@code Object}. + */ + public MagicDoorDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MagicDoorDialogue} {@code Object}. + * @param player the player. + */ + public MagicDoorDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MagicDoorDialogue(player); + } + + @Override + public boolean open(Object... args) { + door = (GameObject) args[0]; + npc("You may not pass through this door without paying the", "trading tax."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("So how much is the tax?"); + stage++; + break; + case 1: + npc("The cost is one diamond."); + stage++; + break; + case 2: + options("Okay...", "A diamond? Are you crazy?", "I haven't brought my diamonds with me.", "What do you do with all the diamonds you get?"); + stage++; + break; + case 3: + switch (buttonId) { + case 1: + player("Okay..."); + stage = 10; + break; + case 2: + player("A diamond? Are you crazy?"); + stage = 20; + break; + case 3: + player("I haven't brought my diamonds with me."); + stage = 30; + break; + case 4: + player("What do you do with all the diamonds you get?"); + stage = 40; + break; + } + break; + case 10: + if (!player.getInventory().containsItem(Gems.DIAMOND.getGem())) { + player("...but..."); + stage = 11; + } else { + end(); + if (player.getInventory().remove(Gems.DIAMOND.getGem())) { + DoorActionHandler.handleAutowalkDoor(player, door); + player.getPacketDispatch().sendMessage("You give the doorman a diamond."); + } + } + break; + case 11: + player("I haven't brought my diamonds with me."); + stage = 30; + break; + case 20: + npc("Not at all. Those are the rules."); + stage++; + break; + case 21: + end(); + break; + case 30: + npc("No tax, no entry."); + stage++; + break; + case 31: + end(); + break; + case 40: + npc("Ever heard of fairylights? Well how do you think we", "make 'em? First we collect a pile of gems and then we", "get a spider to spin 'em into a long web, we light the", "jewels by imbuing each one with a little bit of magic."); + stage++; + break; + case 41: + player("So you're telling me fairylights are made out of gems?"); + stage++; + break; + case 42: + npc("That's right, how else could we make 'em twinkle so", "beautifully?"); + stage++; + break; + case 43: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3321, DialogueInterpreter.getDialogueKey(NAME) }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/falador/MakeoverMageInterface.kt b/Server/src/main/java/Server/core/game/interaction/city/falador/MakeoverMageInterface.kt new file mode 100644 index 000000000..65d1f645d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/falador/MakeoverMageInterface.kt @@ -0,0 +1,40 @@ +/* +package core.game.interaction.city.falador + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.game.node.entity.player.link.appearance.Gender +import core.plugin.InitializablePlugin +import core.plugin.Plugin +import core.game.interaction.inter.FEMALE_HAIR_STYLES +import core.game.interaction.inter.MALE_HAIR_STYLES + +const val MAKEOVER_COMPONENT_ID = 205 + +private const val MALE_CHILD_ID = 90 +private const val FEMALE_CHILD_ID = 92 + +@InitializablePlugin +class MakeoverMageInterface : ComponentPlugin(){ + override fun open(player: Player?, component: Component?) { + player ?: return + super.open(player, component) + player.packetDispatch.sendModelOnInterface(114,MAKEOVER_COMPONENT_ID, MALE_CHILD_ID,100) + player.packetDispatch.sendModelOnInterface(118,MAKEOVER_COMPONENT_ID, FEMALE_CHILD_ID,100) + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + player.appearance.hair.changeLook(MALE_HAIR_STYLES.random()) + player.appearance.sync() + return true + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(MAKEOVER_COMPONENT_ID,this) + return this + } +}*/ diff --git a/Server/src/main/java/Server/core/game/interaction/city/falador/WineOfZamorakInteraction.java b/Server/src/main/java/Server/core/game/interaction/city/falador/WineOfZamorakInteraction.java new file mode 100644 index 000000000..a73c42490 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/falador/WineOfZamorakInteraction.java @@ -0,0 +1,24 @@ +package core.game.interaction.city.falador; + +import core.game.interaction.Option; +import core.game.interaction.SpecialGroundInteraction; +import core.game.interaction.SpecialGroundItems; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.RegionManager; + +import java.util.List; + +public class WineOfZamorakInteraction extends SpecialGroundInteraction { + @Override + public void handle(Player player, Option option){ + player.faceLocation(SpecialGroundItems.WINE_OF_ZAMORAK.getLocation()); + final List npcs = RegionManager.getLocalNpcs(player); + for (NPC n : npcs) { + if (n.getId() == 188) { + n.sendChat("Hands off zamorak's wine!"); + n.getProperties().getCombatPulse().attack(player); + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/lumbridge/CowFieldSign.java b/Server/src/main/java/Server/core/game/interaction/city/lumbridge/CowFieldSign.java new file mode 100644 index 000000000..7040ef143 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/lumbridge/CowFieldSign.java @@ -0,0 +1,54 @@ +package core.game.interaction.city.lumbridge; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Cow field sign manager + * @author ceik + */ + +@Initializable +public class CowFieldSign extends OptionHandler { + private int DIALOGUE_KEY = 87905733; + @Override + public Plugin newInstance(Object arg) throws Throwable{ + new SignDialogue().init(); + ObjectDefinition.forId(31297).getHandlers().put("option:read",this); + return this; + } + @Override + public boolean handle(Player player, Node node, String option){ + if(node.getId() == 31297){ + player.getDialogueInterpreter().open(DIALOGUE_KEY); + } + return true; + } + public final class SignDialogue extends DialoguePlugin{ + public SignDialogue(){ + /** + * Empty + */ + } + public SignDialogue(Player player){super(player);} + @Override + public DialoguePlugin newInstance(Player player){return new SignDialogue(player);} + @Override + public boolean open(Object... args){ + interpreter.sendPlainMessage(false,"Wandering adventurers have killed " + CowPenZone.CowDeaths + " cows in this field.", "Local farmers call it an epidemic."); + return true; + } + + @Override + public boolean handle(int componentId, int buttonId){ + end(); + return true; + } + public int[] getIds() {return new int[] {DIALOGUE_KEY};} + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/lumbridge/CowPenZone.java b/Server/src/main/java/Server/core/game/interaction/city/lumbridge/CowPenZone.java new file mode 100644 index 000000000..d9577f8c7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/lumbridge/CowPenZone.java @@ -0,0 +1,48 @@ +package core.game.interaction.city.lumbridge; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Zone for the lumbridge cow pen + * @author ceik + */ + + +@Initializable +public class CowPenZone extends MapZone implements Plugin { + public static int CowDeaths; + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + public CowPenZone() { + super("lumbridge cows", true); + } + @Override + public void configure() { + super.register(new ZoneBorders(3242, 3255, 3265, 3297)); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public boolean death(Entity e, Entity killer) { + if (killer instanceof Player && e instanceof NPC) { + CowDeaths++; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/lumbridge/FredChest.java b/Server/src/main/java/Server/core/game/interaction/city/lumbridge/FredChest.java new file mode 100644 index 000000000..26ca21b65 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/lumbridge/FredChest.java @@ -0,0 +1,38 @@ +package core.game.interaction.city.lumbridge; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the chest in farmer fred's house + * + * @author ceik + */ + +@Initializable +public class FredChest extends OptionHandler { + @Override + public Plugin newInstance(Object arg) throws Throwable{ + ObjectDefinition.forId(37009).getHandlers().put("option:open",this); + ObjectDefinition.forId(37010).getHandlers().put("option:shut",this); + ObjectDefinition.forId(37010).getHandlers().put("option:search",this); + return this; + } + @Override + public boolean handle(Player player, Node node, String option){ + if(option.equals("open")){ + ObjectBuilder.replace(node.asObject(),new GameObject(37010,node.asObject().getLocation(),node.asObject().getRotation())); + } else if (option.equals("shut")){ + ObjectBuilder.replace(node.asObject(),new GameObject(37009,node.asObject().getLocation(),node.asObject().getRotation())); + } else if (option.equals("search")){ + player.getPacketDispatch().sendMessage("You search the chest but find nothing."); + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/lumbridge/GnomeCopterSign.java b/Server/src/main/java/Server/core/game/interaction/city/lumbridge/GnomeCopterSign.java new file mode 100644 index 000000000..f0c113aeb --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/lumbridge/GnomeCopterSign.java @@ -0,0 +1,52 @@ +package core.game.interaction.city.lumbridge; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +@Initializable +public class GnomeCopterSign extends OptionHandler { + public int DIALOGUE_ID = 989769182; + @Override + public Plugin newInstance(Object arg) throws Throwable { + new SignDialogue().init(); + ObjectDefinition.forId(30037).getHandlers().put("option:read",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String string) { + if (node.getId() == 30037) { + player.getDialogueInterpreter().open(DIALOGUE_ID); + } + return true; + } + public final class SignDialogue extends DialoguePlugin{ + public SignDialogue(){ + /** + * Empty + */ + } + public SignDialogue(Player player){super(player);} + @Override + public DialoguePlugin newInstance(Player player){ return new SignDialogue(player);} + + @Override + public boolean open(Object... args){ + interpreter.sendPlainMessage(false,"Come check out our gnome copters up north!","Disclaimer: EXTREMELY WIP"); + stage = 0; + return true; + } + @Override + public boolean handle(int componentId, int buttonId){ + end(); + return true; + } + @Override + public int[] getIds(){return new int[] {DIALOGUE_ID};} + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/city/portsarim/AhabBeerInteraction.java b/Server/src/main/java/Server/core/game/interaction/city/portsarim/AhabBeerInteraction.java new file mode 100644 index 000000000..1f9a943c6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/city/portsarim/AhabBeerInteraction.java @@ -0,0 +1,28 @@ +package core.game.interaction.city.portsarim; + +import core.game.interaction.Option; +import core.game.interaction.SpecialGroundInteraction; +import core.game.interaction.SpecialGroundItems; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles Ahab's beer in port sarim + * @author ceik + */ + +public class AhabBeerInteraction extends SpecialGroundInteraction { + //The dialogue key + public static final int DIALOGUE_KEY = 2692; + + @Override + public void handle(final Player player, final Option option){ + configure(); + if(option.getName() == "take"){ + player.faceLocation(SpecialGroundItems.AHAB_BEER.getLocation()); + player.getDialogueInterpreter().open(DIALOGUE_KEY, new NPC(2692), false); + } else { + player.debug("Unhandled option: " + option.getName()); + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/AgilityTicketInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/AgilityTicketInterface.java new file mode 100644 index 000000000..aefb9e933 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/AgilityTicketInterface.java @@ -0,0 +1,116 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.tools.StringUtils; + +/** + * Represents the plugin used to handle the agility ticket interface. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AgilityTicketInterface extends ComponentPlugin { + + /** + * Represents the pirate hook item. + */ + private static final Item PIRATE_HOOK = new Item(2997); + + /** + * Represents the toadflax item. + */ + private static final Item TOADFLAX = new Item(2998); + + /** + * Represents the snapdragon item. + */ + private static final Item SNAPDRAGON = new Item(3000); + + /** + * Represents the aerna ticket. + */ + private static final int ARENA_TICKET = 2996; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(6).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + Item reward = null; + double experience = 0; + int tickets = 0; + switch (button) { + case 21:// 1 exp + experience = 240; + tickets = 1; + break; + case 22:// 10 exp. + experience = 2480; + tickets = 10; + break; + case 23:// 25 exp. + experience = 6500; + tickets = 25; + break; + case 24:// 100 exp. + experience = 28000; + tickets = 100; + break; + case 25:// 1000 exp. + experience = 320000; + tickets = 1000; + break; + case 8:// toadflax. + reward = TOADFLAX; + tickets = 3; + break; + case 9:// snap dragon. + reward = SNAPDRAGON; + tickets = 10; + break; + case 10:// pirates hook. + reward = PIRATE_HOOK; + tickets = 800; + break; + } + if (experience > 0 && !player.getInventory().contains(ARENA_TICKET, tickets)) { + player.getPacketDispatch().sendMessage("This Agility experience costs " + tickets + " tickets."); + } + if (reward != null && !player.getInventory().contains(ARENA_TICKET, tickets)) { + player.getPacketDispatch().sendMessage(StringUtils.formatDisplayName(reward.getName().replace("Clean", "").trim()) + " costs " + tickets + " tickets."); + } + if (!player.getInventory().contains(ARENA_TICKET, tickets)) { + return true; + } + if (experience > 0) { + if (!player.getInventory().containsItem(new Item(ARENA_TICKET, tickets))) { + return false; + } + if (player.getInventory().remove(new Item(ARENA_TICKET, tickets))) { + if (player.getAchievementDiaryManager().getKaramjaGlove() >= 1) { + experience *= 1.1; + } + player.getSkills().addExperience(Skills.AGILITY, experience); + player.getPacketDispatch().sendMessage("You have been granted some Agility experience!"); + } + } + if (reward != null) { + if (player.getInventory().remove(new Item(ARENA_TICKET, tickets))) { + player.getInventory().add(reward); + player.getPacketDispatch().sendMessage("You have been granted a " + StringUtils.formatDisplayName(reward.getName().replace("Clean", "").trim()) + "."); + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/AutocastSelectPlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/AutocastSelectPlugin.java new file mode 100644 index 000000000..b3711bf82 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/AutocastSelectPlugin.java @@ -0,0 +1,42 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the auto casting component plugin. + * @author Emperor + * + */ +@Initializable +public final class AutocastSelectPlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(797).setPlugin(this); + ComponentDefinition.forId(319).setPlugin(this); + ComponentDefinition.forId(310).setPlugin(this); + ComponentDefinition.forId(406).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (!player.getAttribute("autocast_select", false)) { + return true; + } + player.removeAttribute("autocast_select"); + final WeaponInterface w = player.getExtension(WeaponInterface.class); + if (w != null) { + w.selectAutoSpell(button, true); + player.getInterfaceManager().openTab(w); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/BankPinInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/BankPinInterface.java new file mode 100644 index 000000000..8b44885c0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/BankPinInterface.java @@ -0,0 +1,69 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.BankPinManager; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the bank pin interfaces. + * @author Vexia + */ +@Initializable +public class BankPinInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(13).setPlugin(this); + ComponentDefinition.forId(14).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + BankPinManager manager = player.getBankPinManager(); + switch (component.getId()) { + case 14:// setting + switch (button) { + case 60: + case 62: + if (!manager.hasPin()) { + manager.toggleConfirmInterface(button == 60); + } else { + manager.setChangingState(1); + manager.openPin(); + } + break; + case 63: + manager.toggleConfirmInterface(true); + break; + case 65: + manager.cancelPin("The PIN has been cancelled", "and will NOT be set.", "", "You still do not have a Bank", "PIN."); + break; + case 89: + case 91: + manager.handleConfirmInterface(button); + break; + case 61: + case 64: + manager.switchRecovery(); + break; + } + break; + case 13:// pin + switch (button) { + case 30: + break; + default: + player.getBankPinManager().updateTempPin(button - 1); + break; + } + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/BoltEnchantingInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/BoltEnchantingInterface.java new file mode 100644 index 000000000..86f6e40b3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/BoltEnchantingInterface.java @@ -0,0 +1,290 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.MagicStaff; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Represents the component plugin used to handle the bolt enchanting interface. + * @author Emperor + * @author SonicForce41 + */ +@Initializable +public final class BoltEnchantingInterface extends ComponentPlugin { + + /** + * Represents the graphics to use. + */ + private static final Graphics GRAPHICS = new Graphics(759); + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(4462); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(432, this); + return this; + } + + @Override + public boolean handle(final Player player, Component component, int opcode, int button, int slot, int itemId) { + final Bolts bolts = Bolts.forId(button); + if (bolts != null) { + player.getInterfaceManager().close(); + if (player.getSkills().getLevel(Skills.MAGIC) < bolts.getLevel()) { + player.getPacketDispatch().sendMessage("You need a level of " + bolts.getLevel() + " to cast this spell."); + return true; + } + for (Item item : bolts.getRunes()) { + if (!player.getInventory().containsItem(item) && !usingStaff(player, item.getId())) { + player.getPacketDispatch().sendMessage("You do not have enough runes to cast this spell."); + return true; + } + } + final int amount = player.getInventory().getAmount(new Item(bolts.getBolt(), 1)); + if (amount < 1) { + player.getPacketDispatch().sendMessage("You don't have any bolts to enchant."); + return true; + } + final Item add = new Item(bolts.getEnchanted()); + if (amount > 10 && !player.getInventory().hasSpaceFor(add)) { + player.getPacketDispatch().sendMessage("Not enough space in your inventory!"); + return true; + } + player.graphics(GRAPHICS); + player.animate(ANIMATION); + player.getPulseManager().run(new Pulse(1) { + @Override + public boolean pulse() { + int enchant = amount; + if (enchant > 10) { + enchant = 10; + } + add.setAmount(enchant); + player.getInventory().remove(new Item(bolts.getBolt(), enchant)); + player.getInventory().add(add); + for (Item item : bolts.getRunes()) { + boolean staff = usingStaff(player, item.getId()); + if (!player.getInventory().containsItem(item) && !staff) { + player.getPacketDispatch().sendMessage("You do not have enough " + item.getName() + "s to cast this spell."); + return true; + } + if (!staff) { + player.getInventory().remove(item); + } + } + player.getSkills().addExperience(Skills.MAGIC, bolts.getExp(), true); + player.getPacketDispatch().sendMessage("The magic of the runes coaxes out the true nature of the gem tips."); + return true; + } + }); + return true; + } + return false; + } + + /** + * Checks if the player is holding the staff that will be used instead of + * the rune. + * @param p The player. + * @param rune The rune item id. + * @return {@code True} if the player is wearing the correct staff for this + * rune. + */ + public boolean usingStaff(Player p, int rune) { + Item weapon = p.getEquipment().get(3); + if (weapon == null) { + return false; + } + MagicStaff staff = MagicStaff.forId(rune); + if (staff == null) { + return false; + } + int[] staves = staff.getStaves(); + for (int id : staves) { + if (weapon.getId() == id) { + return true; + } + } + return false; + } + + /** + * Represents the enumeration of bolts. + * @author SonicForce41 + * @version 1 + */ + public enum Bolts { + OPAL(14, 879, 4, new Item[] { new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.AIR_RUNE.getId(), 2) }, 9, 9236), SAPPHIRE(29, 9337, 7, new Item[] { new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.MIND_RUNE.getId(), 1), new Item(Runes.WATER_RUNE.getId(), 1) }, 17, 9240), JADE(18, 9335, 14, new Item[] { new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.EARTH_RUNE.getId(), 2) }, 19, 9237), PEARL(22, 880, 24, new Item[] { new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.WATER_RUNE.getId(), 2) }, 29, 9238), EMERALD(32, 9338, 27, new Item[] { new Item(Runes.NATURE_RUNE.getId(), 1), new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.AIR_RUNE.getId(), 3) }, 37, 9241), RED_TOPAZ(26, 9336, 29, new Item[] { new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.FIRE_RUNE.getId(), 2) }, 33, 9239), RUBY(35, 9339, 49, new Item[] { new Item(Runes.BLOOD_RUNE.getId(), 1), new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.FIRE_RUNE.getId(), 5) }, 59, 9242), DIAMOND(38, 9340, 57, new Item[] { new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.EARTH_RUNE.getId(), 10) }, 67, 9243), DRAGONSTONE(41, 9341, 68, new Item[] { new Item(Runes.SOUL_RUNE.getId(), 1), new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.EARTH_RUNE.getId(), 15) }, 78, 9244), ONYX(44, 9342, 87, new Item[] { new Item(Runes.DEATH_RUNE.getId(), 1), new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.FIRE_RUNE.getId(), 20) }, 97, 9245); + + /** + * The button + */ + private int button; + + /** + * The actual bolt + */ + private int bolt; + + /** + * The level + */ + private int level; + + /** + * The runes required + */ + private Item[] runes; + + /** + * The exp gained + */ + private double exp; + + /** + * The enchanted bolt + */ + private int enchanted; + + /** + * Constructs a new {@code BoltEnchantingInterface} {@code Object}. + * @param button the button. + * @param bolt the bolt. + * @param level the level. + * @param runes the runes. + * @param exp the exp. + * @param enchanted the enchanted. + */ + Bolts(int button, int bolt, int level, Item[] runes, double exp, int enchanted) { + this.button = button; + this.bolt = bolt; + this.level = level; + this.runes = runes; + this.exp = exp; + this.enchanted = enchanted; + } + + /** + * Gets the button. + * @return The button. + */ + public int getButton() { + return button; + } + + /** + * Sets the button. + * @param button The button to set. + */ + public void setButton(int button) { + this.button = button; + } + + /** + * Gets the bolt. + * @return The bolt. + */ + public int getBolt() { + return bolt; + } + + /** + * Sets the bolt. + * @param bolt The bolt to set. + */ + public void setBolt(int bolt) { + this.bolt = bolt; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Sets the level. + * @param level The level to set. + */ + public void setLevel(int level) { + this.level = level; + } + + /** + * Gets the runes. + * @return The runes. + */ + public Item[] getRunes() { + return runes; + } + + /** + * Sets the runes. + * @param runes The runes to set. + */ + public void setRunes(Item[] runes) { + this.runes = runes; + } + + /** + * Gets the exp. + * @return The exp. + */ + public double getExp() { + return exp; + } + + /** + * Sets the exp. + * @param exp The exp to set. + */ + public void setExp(double exp) { + this.exp = exp; + } + + /** + * Gets the enchanted. + * @return The enchanted. + */ + public int getEnchanted() { + return enchanted; + } + + /** + * Sets the enchanted. + * @param enchanted The enchanted to set. + */ + public void setEnchanted(int enchanted) { + this.enchanted = enchanted; + } + + /** + * Gets the bolt by the id. + * @param button the button. + * @return the bolt. + */ + public static Bolts forId(int button) { + for (Bolts bolts : Bolts.values()) { + if (bolts.getButton() == button) + return bolts; + } + return null; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/CanoeInterfacePlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/CanoeInterfacePlugin.java new file mode 100644 index 000000000..6d0a21852 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/CanoeInterfacePlugin.java @@ -0,0 +1,53 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.global.travel.canoe.Canoe; +import core.game.content.global.travel.canoe.CanoeExtension; +import core.game.content.global.travel.canoe.CanoeStation; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the canoe interface plugins. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CanoeInterfacePlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(52, this); + ComponentDefinition.put(53, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + final CanoeExtension extension = CanoeExtension.extension(player); + switch (component.getId()) { + case 52: + final Canoe canoe = Canoe.getCanoeFromChild(button); + if (canoe == null) { + return true; + } + extension.craftCanoe(canoe); + break; + case 53: + final CanoeStation station = CanoeStation.getStationFromButton(button); + if (station == null) { + return true; + } + if (extension.getStage() < 3) { + return true; + } + extension.travel(station); + break; + } + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/inter/CharacterDesignInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/CharacterDesignInterface.java new file mode 100644 index 000000000..91649baec --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/CharacterDesignInterface.java @@ -0,0 +1,34 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.quest.tutorials.tutorialisland.CharacterDesign; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents a component plugin to handle the character design interface. + * @author 'Vexia + * @version 1.9 + */ +@Initializable +public final class CharacterDesignInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(771, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (opcode) { + case 155: + CharacterDesign.handleButtons(player, button); + break; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/ChocatriceIncubationInterface.kt b/Server/src/main/java/Server/core/game/interaction/inter/ChocatriceIncubationInterface.kt new file mode 100644 index 000000000..94065297d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/ChocatriceIncubationInterface.kt @@ -0,0 +1,35 @@ +package core.game.interaction.inter + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.plugin.Plugin + +/** + * I found a bunch of varps for this interface so I've documented them here. + * to set, for example, COLD/HOT bar height, you need to send player.configmanager.set(GAUGE_VARP, (height shl COLD_OFFSET) or (height shl HOT_OFFSET)) + * bar gauges go up to 12 + * heat gauge at the top goes a full 360, though the edge is at roughly 160 + * @author Ceikry + */ +private const val GAUGE_UPDATE_SCRIPT = 894 +private const val COLD_OFFSET = 22 +private const val HOT_OFFSET = 18 +private const val GAUGE_OFFSET = 15 +private const val GAUGE_VARP = 1205 +private const val METER_VARP = 1201 +private const val BUTTON_ADD_COLD = 16 +private const val BUTTON_ADD_HOT = 18 + +class IncubationInterface : ComponentPlugin() { + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + TODO("Not yet implemented") + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(717, this) + return this + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/inter/ClanInterfacePlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/ClanInterfacePlugin.java new file mode 100644 index 000000000..4c281ce87 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/ClanInterfacePlugin.java @@ -0,0 +1,155 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.system.communication.ClanRank; +import core.game.system.communication.ClanRepository; +import core.net.amsc.MSPacketRepository; +import core.net.amsc.WorldCommunicator; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.StringUtils; + +/** + * Represents the plugin used to handle the clan interfaces. + * @author Vexia + */ +@Initializable +public final class ClanInterfacePlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(590, this); + ComponentDefinition.put(589, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (component.getId()) { + case 589: + switch (button) { + case 9: + if (player.getInterfaceManager().getComponent(590) != null) { + player.getPacketDispatch().sendMessage("Please close the interface you have open before using 'Clan Setup'"); + return true; + } + ClanRepository.openSettings(player); + return true; + case 14: + player.getDetails().getCommunication().toggleLootshare(player); + return true; + } + break; + case 590: + final ClanRepository clan = ClanRepository.get(player.getName(), true); + switch (button) { + case 23: + if (opcode == 155) { + clan.setJoinRequirement(ClanRank.NONE); + } else { + clan.setJoinRequirement(getRank(opcode)); + } + player.getDetails().getCommunication().setJoinRequirement(clan.getJoinRequirement()); + MSPacketRepository.setClanSetting(player, 0, clan.getJoinRequirement()); + player.getPacketDispatch().sendString(clan.getJoinRequirement().getInfo(), 590, 23); + break; + case 24: + clan.setMessageRequirement(getRank(opcode)); + player.getDetails().getCommunication().setMessageRequirement(clan.getMessageRequirement()); + MSPacketRepository.setClanSetting(player, 1, clan.getMessageRequirement()); + player.getPacketDispatch().sendString(clan.getMessageRequirement().getInfo(), 590, 24); + break; + case 25: + clan.setKickRequirement(getRank(opcode)); + player.getDetails().getCommunication().setKickRequirement(clan.getKickRequirement()); + MSPacketRepository.setClanSetting(player, 2, clan.getKickRequirement()); + player.getPacketDispatch().sendString(clan.getKickRequirement().getInfo(), 590, 25); + clan.update(); + break; + case 26: + if (opcode == 230) { + clan.setLootRequirement(ClanRank.ADMINISTRATOR); + } else { + clan.setLootRequirement(getRank(opcode)); + } + player.getDetails().getCommunication().setLootRequirement(clan.getLootRequirement()); + MSPacketRepository.setClanSetting(player, 3, clan.getLootRequirement()); + player.getPacketDispatch().sendString(clan.getLootRequirement().getInfo(), 590, 26); + break; + case 22: + switch (opcode) { + case 196: + clan.setName("Chat disabled"); + player.getCommunication().setClanName(""); + player.getPacketDispatch().sendString(clan.getName(), 590, 22); + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendClanRename(player, ""); + break; + } + clan.clean(true); + break; + default: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + String name = StringUtils.formatDisplayName((String) value); + player.getPacketDispatch().sendString(name, 590, 22);//30 + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendClanRename(player, name); + clan.setName(name); + return true; + } + if (clan.getName().equals("Chat disabled")) { + player.getPacketDispatch().sendMessage("Your clan channel has now been enabled!"); + player.getPacketDispatch().sendMessage("Join your channel by clicking 'Join Chat' and typing: " + player.getUsername()); + } + clan.setName(name); + player.getCommunication().setClanName(name); + clan.update(); + return true; + } + }); + player.getDialogueInterpreter().sendInput(true, "Enter clan prefix:"); + break; + } + break; + } + break; + } + return true; + } + + /** + * Gets the value to set. + * @param opcode the opcode. + * @return the value. + */ + public static ClanRank getRank(int opcode) { + switch (opcode) { + case 155: + return ClanRank.NONE; + case 196: + return ClanRank.FRIEND; + case 124: + return ClanRank.RECRUIT; + case 199: + return ClanRank.CORPORAL; + case 234: + return ClanRank.SERGEANT; + case 168: + return ClanRank.LIEUTENANT; + case 166: + return ClanRank.CAPTAIN; + case 64: + return ClanRank.GENERAL; + case 53: + return ClanRank.OWNER; + } + return ClanRank.NONE; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/CombatTabInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/CombatTabInterface.java new file mode 100644 index 000000000..72cd609bd --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/CombatTabInterface.java @@ -0,0 +1,103 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.combat.equipment.WeaponInterface.WeaponInterfaces; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the combat tab interface. + * @author Emperor + * @author Vexia' + * @version 1.0 + */ +@Initializable +public class CombatTabInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (WeaponInterfaces inter : WeaponInterfaces.values()) { + ComponentDefinition.put(inter.getInterfaceId(), this); + } + ComponentDefinition.put(92, this); + return this; + } + + @Override + public boolean handle(final Player p, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 7: + case 9: + case 24: + case 26: + case 27: + GameWorld.getPulser().submit(new Pulse(1, p) { + @Override + public boolean pulse() { + p.getSettings().toggleRetaliating(); + return true; + } + }); + break; + case 11: + case 10: + case 8: + case 85: + GameWorld.getPulser().submit(new Pulse(1, p) { + @Override + public boolean pulse() { + WeaponInterface inter = p.getExtension(WeaponInterface.class); + if (inter != null && inter.isSpecialBar()) { + p.getSettings().toggleSpecialBar(); + if (p.getSettings().isSpecialToggled()) { + CombatSwingHandler handler; + if ((handler = CombatStyle.MELEE.getSwingHandler().getSpecial(p.getEquipment().getNew(3).getId())) != null) { + @SuppressWarnings("unchecked") + Plugin plugin = (Plugin) ((Object) handler); + if (plugin.fireEvent("instant_spec", p) == Boolean.TRUE) { + handleInstantSpec(p, handler, plugin); + } + } + } + } + return true; + } + }); + break; + case 0: + default: + WeaponInterface inter = p.getExtension(WeaponInterface.class); + if (inter == null) { + return false; + } + if (inter.setAttackStyle(button)) { + if (button == 4 || button == 5) { + inter.openAutocastSelect(); + } else if (p.getProperties().getAutocastSpell() != null) { + inter.selectAutoSpell(-1, false); + } + return true; + } + return false; + } + return true; + } + + /** + * Method used to handle an instance special attack. + * @param p the player. + * @param handler the handler. + * @param plugin the plugin. + */ + private static void handleInstantSpec(Player p, CombatSwingHandler handler, Plugin plugin) { + handler.swing(p, p.getProperties().getCombatPulse().getVictim(), null); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/CrystalKeyChestPlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/CrystalKeyChestPlugin.java new file mode 100644 index 000000000..69656ef8b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/CrystalKeyChestPlugin.java @@ -0,0 +1,50 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class CrystalKeyChestPlugin extends ComponentPlugin { + + private final Integer CHEST_INTERFACE = 501; + + private Player player; + + public CrystalKeyChestPlugin() { + /* + * Empty + */ + } + + public CrystalKeyChestPlugin(Player player) { + this.player = player; + } + + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(CHEST_INTERFACE, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + return false; + } + + public void constructInterface(Player player) { + Integer[] hiddenChildren = new Integer[] { 3, 4, 5, 6, 7}; + Component component = new Component(CHEST_INTERFACE); + for (int i = 3; i < hiddenChildren.length; i++) { + player.getPacketDispatch().sendInterfaceConfig(CHEST_INTERFACE, i, true); + } + player.getPacketDispatch().sendItemOnInterface(989, 1, CHEST_INTERFACE, hiddenChildren[2]); + player.getInterfaceManager().open(component); + this.player = player; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/DeathInterfacePlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/DeathInterfacePlugin.java new file mode 100644 index 000000000..44139de63 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/DeathInterfacePlugin.java @@ -0,0 +1,32 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the death interface. + * @author Vexia + */ +@Initializable +public final class DeathInterfacePlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(153).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (button == 1) { + player.getSavedData().getGlobalData().setDisableDeathScreen(true); + player.getInterfaceManager().close(); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/EllisDialogue.java b/Server/src/main/java/Server/core/game/interaction/inter/EllisDialogue.java new file mode 100644 index 000000000..80e8dd455 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/EllisDialogue.java @@ -0,0 +1,136 @@ +package core.game.interaction.inter; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.crafting.TanningProduct; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the ellis dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EllisDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code EllisDialogue} {@code Object}. + */ + public EllisDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EllisDialogue} {@code Object}. + * @param player the player. + */ + public EllisDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EllisDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Greetings friend I am a manufacturer of leather."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player.getInventory().refresh(); + Item items[] = player.getInventory().toArray(); + for (int i = 0; i < items.length; i++) { + if (items[i] == null) { + continue; + } + if (TanningProduct.forItemId(items[i].getId()) != null) { + npc("I see you have brought me some hides.", "Would you like me to tan them for you?"); + stage = 100; + return true; + } + } + options("Can I buy some leather?", "Leather is rather weak stuff."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Can I buy some leather then?"); + stage = 10; + break; + case 2: + player("Leather is rather weak stuff."); + stage = 3000; + break; + } + break; + case 10: + npc("I make leather from animal hides. Bring me some cowhides", "and one gold coin per hide, and I'll tan them into soft", "leather for you."); + stage = 2000; + break; + case 2000: + end(); + break; + case 3000: + npc("Normal leather may be quite weak, but it's very cheap - I", "make it from cowhides for only 1 gp per hide - and it's so", "easy to craft that anyone can work with it."); + stage = 3001; + break; + case 3001: + npc("Alernatively you could try hard leather. It's not so easy", "to craft, but I only charge 3 gp per cowhide to prepare it,", "and it makes much sturdier armour."); + stage = 3002; + break; + case 3002: + player("Thanks; I'll bear it in mind."); + stage = 3003; + break; + case 3003: + end(); + break; + case 100: + options("Yes please.", "No thanks."); + stage = 101; + break; + case 101: + switch (buttonId) { + case 1: + player("Yes please."); + stage = 210; + break; + case 2: + player("No thanks."); + stage = 200; + break; + } + break; + case 210: + end(); + TanningProduct.open(player, 2824); + break; + case 200: + npc("Very well, sir, as you wish."); + stage = 201; + break; + case 201: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2824 }; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/EmoteTabInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/EmoteTabInterface.java new file mode 100644 index 000000000..63a541aab --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/EmoteTabInterface.java @@ -0,0 +1,30 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the emote tab interface. + * @author Vexia + * + */ +@Initializable +public final class EmoteTabInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(464, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + Emotes.handle(player, button); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/EquipmentInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/EquipmentInterface.java new file mode 100644 index 000000000..6aa2fc2a2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/EquipmentInterface.java @@ -0,0 +1,200 @@ +package core.game.interaction.inter; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.Container; +import core.game.container.ContainerEvent; +import core.game.container.ContainerListener; +import core.game.container.access.BitregisterAssembler; +import core.game.container.access.InterfaceContainer; +import core.game.container.impl.EquipmentContainer; +import core.game.content.global.action.EquipHandler; +import core.game.interaction.OptionHandler; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the equipment interface. + * @author Emperor + * + */ +@Initializable +public final class EquipmentInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(387, this); + ComponentDefinition.put(667, this); + ComponentDefinition.put(670, this); + return this; + } + + @Override + public boolean handle(final Player p, Component component, int opcode, int button, final int slot, final int itemId) { + if (component.getId() == 667) { + if (button != 14) { + return false; + } + switch (opcode) { + case 155: + p.getPulseManager().clear(); + GameWorld.getPulser().submit(new Pulse(1, p) { + @Override + public boolean pulse() { + EquipHandler.unequip(p, slot, itemId); + return true; + } + }); + return true; + case 9: + p.sendMessage(p.getEquipment().get(slot).getDefinition().getExamine()); + return true; + case 196: + GameWorld.getPulser().submit(new Pulse(1, p) { + @Override + public boolean pulse() { + operate(p, slot, itemId); + return true; + } + }); + return true; + } + return false; + } + else if (component.getId() == 670) { + switch (opcode) { + case 155: + p.getPulseManager().clear(); + final Item item = p.getInventory().get(slot); + GameWorld.getPulser().submit(new Pulse(1, p) { + @Override + public boolean pulse() { + EquipHandler.SINGLETON.handle(p, item, "equip"); + return true; + } + }); + return true; + case 9: + p.sendMessage(p.getInventory().get(slot).getDefinition().getExamine()); + return true; + } + } + switch (opcode) { + case 206: + if (button != 28) { + return false; + } + GameWorld.getPulser().submit(new Pulse(1, p) { + @Override + public boolean pulse() { + operate(p, slot, itemId); + return true; + } + }); + return true; + default: + switch (button) { + case 52: + if (p.getInterfaceManager().isOpened() && p.getInterfaceManager().getOpened().getId() == 102) { + return true; + } + boolean skulled = p.getSkullManager().isSkulled(); + boolean usingProtect = p.getPrayer().get(PrayerType.PROTECT_ITEMS); + p.getInterfaceManager().openComponent(102); + p.getPacketDispatch().sendAccessMask(211, 0, 2, 6684690, 4); + p.getPacketDispatch().sendAccessMask(212, 0, 2, 6684693, 42); + Container[] itemArray = DeathTask.getContainers(p); + Container kept = itemArray[0]; + int state = 0; // 1=familiar carrying items + int keptItems = skulled ? (usingProtect ? 1 : 0) : (usingProtect ? 4 : 3); + int zoneType = p.getZoneMonitor().getType(); + int pvpType = p.getSkullManager().isWilderness() ? 0 : 1; + Object[] params = new Object[] { 11510, 12749, "", state, pvpType, kept.getId(3), kept.getId(2), kept.getId(1), kept.getId(0), keptItems, zoneType }; + PacketRepository.send(ContainerPacket.class, new ContainerContext(p, 149, 0, 91, itemArray[1], false)); + p.getPacketDispatch().sendRunScript(118, "iiooooiisii", params); + break; + case 28: + if (opcode == 81) { + p.getPulseManager().clear(); + GameWorld.getPulser().submit(new Pulse(1, p) { + @Override + public boolean pulse() { + EquipHandler.unequip(p, slot, itemId); + return true; + } + }); + return true; + } + break; + case 55: + if (p.getInterfaceManager().isOpened() && p.getInterfaceManager().getOpened().getId() == 667) { + return true; + } + final ContainerListener listener = new ContainerListener() { + @Override + public void update(Container c, ContainerEvent e) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(p, -1, -1, 98, e.getItems(), false, e.getSlots())); + } + + @Override + public void refresh(Container c) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(p, -1, -1, 98, c, false)); + } + }; + p.getInterfaceManager().openComponent(667).setCloseEvent((player, c) -> { + player.removeAttribute("equip_stats_open"); + player.getInterfaceManager().closeSingleTab(); + player.getInventory().getListeners().remove(listener); + return true; + }); + p.setAttribute("equip_stats_open", true); + EquipmentContainer.update(p); + p.getInterfaceManager().openSingleTab(new Component(670)); + InterfaceContainer.generateItems(p, p.getInventory().toArray(), new String[] { "Equip" }, 670, 0, 7, 4, 93); + BitregisterAssembler assembly = new BitregisterAssembler(new String[] { "Equip" }); + assembly.enableExamineOption(); + assembly.enableSlotSwitch(); + p.getPacketDispatch().sendAccessMask(assembly.calculateRegister(), 0, 670, 0, 27); + p.getInventory().getListeners().add(listener); + p.getInventory().refresh(); + ItemDefinition.statsUpdate(p); + p.getPacketDispatch().sendAccessMask(1278, 14, 667, 0, 13); + break; + } + } + return true; + } + + /** + * Operates an item. + * @param player The player. + * @param slot The container slot. + * @param itemId The item id. + */ + public void operate(Player player, int slot, int itemId) { + if (slot < 0 || slot > 13) { + return; + } + Item item = player.getEquipment().get(slot); + if (item == null) { + return; + } + OptionHandler handler = item.getOperateHandler(); + if (handler != null && handler.handle(player, item, "operate")) { + return; + } + player.getPacketDispatch().sendMessage("You can't operate that."); + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/ExperienceInterface.kt b/Server/src/main/java/Server/core/game/interaction/inter/ExperienceInterface.kt new file mode 100644 index 000000000..388f213e2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/ExperienceInterface.kt @@ -0,0 +1,95 @@ +package core.game.interaction.inter + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.audio.Audio +import core.game.system.SystemLogger +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +/** + * Represents the experience interface. + * @author Ceikry + */ +@Initializable +class ExperienceInterface() : ComponentPlugin() { + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(134, this) + return this + } + + override fun handle(player: Player, component: Component, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + if(button == 2){ + val confirmedSkill = player.getAttribute("exp_interface:skill",-1) + if(confirmedSkill == -1){ + player.sendMessage("You must first select a skill.") + } else { + player.removeAttribute("exp_interface:skill") + when(confirmedSkill){ + Skills.HERBLORE -> if(!checkHerblore(player)) player.sendMessage("You need to have completed Druidic Ritual for this.").also { return true } + Skills.RUNECRAFTING -> if(!checkRunecrafting(player)) player.sendMessage("You need to have completed Rune Mysteries for this.").also { return true } + Skills.SUMMONING -> if(!checkSummoning(player)) player.sendMessage("You need to have completed Wolf Whistle for this.").also { return true } + } + val caller = player.attributes["caller"] + caller ?: return true + (caller as Plugin<*>).handleSelectionCallback(confirmedSkill, player) + player.audioManager.send(SOUND) + player.interfaceManager.close() + } + } else { + val skill = when (button) { + 29 -> Skills.ATTACK + 30 -> Skills.STRENGTH + 31 -> Skills.DEFENCE + 32 -> Skills.RANGE + 35 -> Skills.MAGIC + 39 -> Skills.CRAFTING + 34 -> Skills.HITPOINTS + 33 -> Skills.PRAYER + 36 -> Skills.AGILITY + 37 -> Skills.HERBLORE + 38 -> Skills.THIEVING + 43 -> Skills.FISHING + 47 -> Skills.RUNECRAFTING + 48 -> Skills.SLAYER + 50 -> Skills.FARMING + 41 -> Skills.MINING + 42 -> Skills.SMITHING + 49 -> Skills.HUNTER + 52 -> Skills.SUMMONING + 45 -> Skills.COOKING + 44 -> Skills.FIREMAKING + 46 -> Skills.WOODCUTTING + 40 -> Skills.FLETCHING + 51 -> Skills.CONSTRUCTION + 52 -> Skills.SUMMONING + else -> Skills.SLAYER.also { SystemLogger.logWarn("EXP_INTERFACE: Invalid SKILL CHOICE BUTTON: $button") } + } + player.setAttribute("exp_interface:skill",skill) + } + return true + } + + private fun checkHerblore(player: Player): Boolean{ + return (player.questRepository.isComplete("Druidic Ritual")) + } + + private fun checkSummoning(player: Player): Boolean{ + return player.questRepository.isComplete("Wolf Whistle") + } + + private fun checkRunecrafting(player: Player): Boolean{ + return player.questRepository.isComplete("Rune Mysteries") + } + + companion object { + /** + * Represents the sound to send. + */ + private val SOUND = Audio(1270, 12, 1) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/inter/FairyRingInterface.kt b/Server/src/main/java/Server/core/game/interaction/inter/FairyRingInterface.kt new file mode 100644 index 000000000..b3e783303 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/FairyRingInterface.kt @@ -0,0 +1,202 @@ +package core.game.interaction.inter + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.TeleportManager +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.RandomFunction + +val RING_1 = arrayOf('a','d','c','b') +val RING_2 = arrayOf('i','l','k','j') +val RING_3 = arrayOf('p','s','r','q') + +/** + * Handles the fairy ring interface + * @author Ceikry + */ +@Initializable +class FairyRingInterface : ComponentPlugin(){ + override fun open(player: Player?, component: Component?) { + player ?: return + super.open(player, component) + if(component?.id == 734) { + player.setAttribute("fr:ring1", 0) + player.setAttribute("fr:ring2", 0) + player.setAttribute("fr:ring3", 0) + FairyRing.drawLog(player) + + component.setCloseEvent { pl, _ -> + pl.removeAttribute("fr:ring1") + pl.removeAttribute("fr:ring2") + pl.removeAttribute("fr:ring3") + pl.configManager.forceSet(816,0,false) + pl.interfaceManager.closeSingleTab() + true + } + } + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + val delay = player.getAttribute("fr:time",0L) + if(delay > System.currentTimeMillis()){ + return true + } + + var delayIncrementer = 1750L + when(button){ + 23 -> delayIncrementer += increment(player,1) + 25 -> delayIncrementer += increment(player,2) + 27 -> delayIncrementer += increment(player,3) + 24 -> decrement(player,1) + 26 -> decrement(player,2) + 28 -> decrement(player,3) + 21 -> confirm(player) + 12 -> delayIncrementer += toggleSortOrder(player) + } + player.setAttribute("fr:time",System.currentTimeMillis() + delayIncrementer) + return true + } + + fun toggleSortOrder(player: Player): Long{ + val ring1index = player.getAttribute("fr:ring1",0) + var toSet = player.getAttribute("fr:sortorder",true) + toSet = !toSet + player.setAttribute("fr:sortorder",toSet) + if(toSet) { + player.configManager.forceSet(816, ring1index, false) + player.setAttribute("fr:ring2",0) + player.setAttribute("fr:ring3",0) + } + return -1750L + } + + fun increment(player: Player,ring: Int): Long{ + val curIndex = player.getAttribute("fr:ring$ring",0) + var nextIndex = 0 + if(curIndex == 3) nextIndex = 0 + else if(curIndex == 1) nextIndex = 3 + else if(curIndex == 2) nextIndex = 2 + else nextIndex = curIndex + 1 + player.setAttribute("fr:ring$ring",nextIndex) + return if (curIndex == 1) 1750L else 0L + } + + fun decrement(player: Player,ring: Int){ + val curIndex = player.getAttribute("fr:ring$ring",0) + var nextIndex = 0 + if(curIndex == 0) nextIndex = 3 + else nextIndex = curIndex - 1 + player.setAttribute("fr:ring$ring",nextIndex) + } + + fun confirm(player: Player){ + val ring1index = player.getAttribute("fr:ring1",0) + val ring2index = player.getAttribute("fr:ring2",0) + val ring3index = player.getAttribute("fr:ring3",0) + val code = "${RING_1[ring1index]}${RING_2[ring2index]}${RING_3[ring3index]}" + val ring: FairyRing? = FairyRing.valueOf(code.toUpperCase()) + var tile = ring?.tile + if(ring == FairyRing.CIP){ + player.dialogueInterpreter.sendDialogue("The ring seems to reject you.") + } + if (ring == null || tile == null) { + val center = Location(2412, 4434, 0) + tile = if (RandomFunction.random(2) == 1) { + center.transform(RandomFunction.random(2, 6), RandomFunction.random(2, 6), 0) + } else { + center.transform(RandomFunction.random(-2, -6), RandomFunction.random(-2, -6), 0) + } + if (!RegionManager.isTeleportPermitted(tile) || RegionManager.getObject(tile) != null) { + tile = Location.create(2412, 4431, 0) + } + GameWorld.Pulser.submit(object : Pulse(4, player) { + override fun pulse(): Boolean { + player.dialogueInterpreter.sendDialogues(player, null, "Wow, fairy magic sure is useful, I hardly moved at all!") + return true + } + }) + } else { + if (!player.savedData.globalData.hasTravelLog(ring.ordinal)) { + player.savedData.globalData.setTravelLog(ring.ordinal) + } + } + player.interfaceManager.close() + player.teleporter.send(tile,TeleportManager.TeleportType.FAIRY_RING) + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(734,this) + ComponentDefinition.put(735,this) + return this + } + +} + +enum class FairyRing(val tile: Location?, val tip: String = "", val childId: Int = -1) { + AIQ(Location.create(2996, 3114, 0), "Asgarnia: Mudskipper Point", 15), + AIR(Location.create(2700, 3247, 0), "Islands: South of Witchaven", 16), + AJQ(Location.create(2735, 5221, 0), "Dungeons: Dark cave south of Dorgesh-Kaann", 19), + ALR(Location.create(3059, 4875, 0), "Other realms: Abyssal Area", 28), + AJR(Location.create(2780, 3613, 0), "Kandarin: Slayer cave south-east of Rellekka", 20), + AJS(Location.create(2500, 3896, 0), "Islands: Penguins near Miscellania", 21), + AKQ(Location.create(2319, 3619, 0), "Kandarin: Piscatoris Hunter area", 23), + AKS(Location.create(2571, 2956, 0), "Feldip Hills: Jungle Hunter area", 25), + ALQ(Location.create(3597, 3495, 0), "Morytania: Haunted Woods east of Canifis", 27), + ALS(Location.create(2644, 3495, 0), "Kandarin: McGrubor's Wood", 29), + BIP(Location.create(3410, 3324, 0), "Islands: River Salve", 30), + BIQ(Location.create(3251, 3095, 0), "Kharidian Desert: Near Kalphite hive", 31), + BIS(Location.create(2635, 3266, 0), "Kandarin: Ardougne Zoo unicorns", 33), + BJR(null, "Other Realms: Realm of the Fisher King", 36), + BKP(Location.create(2385, 3035, 0), "Feldip Hills: South of Castle Wars", 38), + BKQ(Location.create(3041, 4532, 0), "Other realms: Enchanted Valley", 39), + BKR(Location.create(3469, 3431, 0), "Morytania: Mort Myre, south of Canifis", 40), + BLP(Location.create(2437, 5126, 0), "Dungeons: TzHaar area", 42), + BLQ(null, "Yu'biusk", 43),//Location.create(2229, 4244, 1) + BLR(Location.create(2740, 3351, 0), "Kandarin: Legends' Guild", 44), + CIP(null, "Islands: Miscellania", 46), //Location.create(2513, 3884, 0) + CIQ(Location.create(2528, 3127, 0), "Kandarin: North-west of Yanille", 47), + CJR(Location.create(2705, 3576, 0), "Kandarin: Sinclair Mansion", 52), + CKP(Location.create(2075, 4848, 0), "Other realms: Cosmic Entity's plane", 54), + CKR(Location.create(2801, 3003, 0), "Karamja: South of Tai Bwo Wannai Village", 56), + CKS(Location.create(3447, 3470, 0), "Morytania: Canifis", 57), + CLP(Location.create(3082, 3206, 0), "Islands: South of Draynor Village", 58), + CLS(Location.create(2682, 3081, 0), "Islands: Jungle spiders near Yanille", 61), + DIR(Location.create(3038, 5348, 0), "Other realms: Goraks' Plane", 64), + DIS(Location.create(3108, 3149, 0), "Misthalin: Wizards' Tower", 65), + DJP(Location.create(2658, 3230, 0), "Kandarin: Tower of Life", 66), + DJR(Location.create(2676, 3587, 0), "Kandarin: Sinclair Mansion (west)", 68), + DKP(Location.create(2900, 3111, 0), "Karamja: South of Musa Point", 70), + DKR(Location.create(3129, 3496, 0), "Misthalin: Edgeville", 72), + DKS(Location.create(2744, 3719, 0), "Kandarin: Snowy Hunter area", 73), + DLQ(Location.create(3423, 3016, 0), "Kharidian Desert: North of Nardah", 75), + DLR(Location.create(2213, 3099, 0), "Islands: Poison Waste south of Isafdar", 76), + AIS(null), AIP(null), AKP(null), FAIRY_HOME(Location.create(2412, 4434, 0)); + + companion object { + /** + * Draws the travel log. + * @param player the player. + */ + fun drawLog(player: Player) { + for (i in FairyRing.values().indices) { + if (!player.savedData.globalData.hasTravelLog(i)) { + continue + } + val ring = FairyRing.values()[i] + if (ring.childId == -1) { + continue + } + player.packetDispatch.sendString("
" + ring.tip, 735, ring.childId) + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/FurClothingInterface.kt b/Server/src/main/java/Server/core/game/interaction/inter/FurClothingInterface.kt new file mode 100644 index 000000000..759ab5b27 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/FurClothingInterface.kt @@ -0,0 +1,198 @@ +package core.game.interaction.inter + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.container.access.InterfaceContainer +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import core.tools.stringtools.colorize + +private const val FUR_CLOTHING_COMPONENT_ID = 477 + +//Polar Kebbit +private val POLAR_CAMO_TOP = Item(10065) +private val POLAR_CAMO_LEGS = Item(10067) + +//COMMON/WOOD CAMO +private val WOOD_CAMO_TOP = Item(10053) +private val WOOD_CAMO_LEGS = Item(10055) + +//FELDIP/JUNGLE CAMO +private val JUNGLE_CAMO_TOP = Item(10057) +private val JUNGLE_CAMO_LEGS = Item(10059) + +//DESERT CAMO +private val DESERT_CAMO_TOP = Item(10061) +private val DESERT_CAMO_LEGS = Item(10063) + + +//Larupia +private val LARUPIA_HAT = Item(10045) +private val LARUPIA_TOP = Item(10043) +private val LARUPIA_LEGS = Item(10041) + +//Graahk +private val GRAAHK_HEADDRESS = Item(10051) +private val GRAAHK_TOP = Item(10049) +private val GRAAHK_LEGS = Item(10047) + +//KYATT +private val KYATT_HAT = Item(10039) +private val KYATT_TOP = Item(10037) +private val KYATT_LEGS = Item(10035) + +//SPECIAL +private val GLOVES_OF_SILENCE = Item(10075) +private val SPOTTED_CAPE = Item(10069) +private val SPOTTIER_CAPE = Item(10071) + + +private val OPTIONS = arrayOf("Buy 10","Buy 5","Buy 1","Value") + +//I just want to say that this monolith of fuckery ACTUALLY SEEMS TO BE THE WAY +//J*GEX HANDLED THIS. This is THEIR packet this is being sent in! The spacing lines up 1:1! +//Like holy what the fuck j*gex +private val ITEMS = arrayOf( + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,POLAR_CAMO_TOP, null,null, POLAR_CAMO_LEGS,null,null,null,null, + null,WOOD_CAMO_TOP, null,null, WOOD_CAMO_LEGS,null,null,null, + null,JUNGLE_CAMO_TOP,null,null, JUNGLE_CAMO_LEGS,null,null,null, + null,DESERT_CAMO_TOP,null,null, DESERT_CAMO_LEGS,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + LARUPIA_HAT,null,null,LARUPIA_TOP,null,null,LARUPIA_LEGS,null,null,null,null, + GRAAHK_HEADDRESS,null,null,GRAAHK_TOP,null,null,GRAAHK_LEGS,null,null,null,null,null, + KYATT_HAT,null,null,KYATT_TOP,null,null,KYATT_LEGS, null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null, + null,null,null, GLOVES_OF_SILENCE,null,null,null,null,null,null,null, + null,null,null, SPOTTED_CAPE,null,null,null,null,null,null,null,null, + null,null,null, SPOTTIER_CAPE,null) + +/** + * Interface for custom fur clothing that is a 1:1 matchup in functionality and appearance to OSRS's. + * It's got a fuckhuge hideous monolith and I'm okay with that, it seems to be AUTHENTIC. + * @author Ceikry + */ +@Initializable +class FurClothingInterface : ComponentPlugin(){ + override fun open(player: Player?, component: Component?) { + super.open(player, component) + player ?: return + //Send the monolith of fuckery to the client to deal with + InterfaceContainer.generateItems(player, ITEMS, OPTIONS, FUR_CLOTHING_COMPONENT_ID, 26,12,33,5000) + + //Highlight the names of groups that contain a craftable item + //Running in a crouton because why the hell not. + GlobalScope.launch { + val checkedFurs = arrayListOf() + for(CLOTHING in FUR_CLOTHING.values()){ + if(checkedFurs.contains(CLOTHING.textContent)) continue + if(player.inventory.containsItem(CLOTHING.requiredFur)){ + player.packetDispatch.sendString(colorize("%G" + CLOTHING.textContent), FUR_CLOTHING_COMPONENT_ID,CLOTHING.textChildID) + checkedFurs.add(CLOTHING.textContent) + } + } + } + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + + val clothingItem: FUR_CLOTHING? = when(slot){ + 34 -> FUR_CLOTHING.POLAR_KEBBIT_TOP + 37 -> FUR_CLOTHING.POLAR_KEBBIT_BOT + 43 -> FUR_CLOTHING.COMMON_KEBBIT_TOP + 46 -> FUR_CLOTHING.COMMON_KEBBIT_BOT + 51 -> FUR_CLOTHING.FELDIP_WEASEL_TOP + 54 -> FUR_CLOTHING.FELDIP_WEASEL_BOT + 59 -> FUR_CLOTHING.DESERT_DEVIL_TOP + 62 -> FUR_CLOTHING.DESERT_DEVIL_BOT + 166 -> FUR_CLOTHING.LARUPIA_HEAD + 169 -> FUR_CLOTHING.LARUPIA_CHEST + 172 -> FUR_CLOTHING.LARUPIA_BOT + 177 -> FUR_CLOTHING.GRAAHK_HEAD + 180 -> FUR_CLOTHING.GRAAHK_CHEST + 183 -> FUR_CLOTHING.GRAAHK_BOT + 189 -> FUR_CLOTHING.KYATT_HEAD + 192 -> FUR_CLOTHING.KYATT_CHEST + 195 -> FUR_CLOTHING.KYATT_BOT + 334 -> FUR_CLOTHING.GLOVES_SILENCE + 345 -> FUR_CLOTHING.SPOT_CAPE + 357 -> FUR_CLOTHING.DASH_CAPE + else -> null + } + + clothingItem ?: return false + + when(opcode){ + 196 -> buy(player,clothingItem,1) + 124 -> buy(player,clothingItem,5) + 199 -> buy(player,clothingItem,10) + 155 -> value(player,clothingItem) + } + return true + } + + private fun value(player: Player, clothing: FUR_CLOTHING){ + player.sendMessage("${clothing.product.name} requires ${clothing.requiredFur.amount} ${clothing.requiredFur.name.toLowerCase()} and costs ${clothing.price} coins.") + } + + private fun buy(player: Player, clothing: FUR_CLOTHING, amount: Int){ + val coins = Item(995,clothing.price * amount) + val amtFurRequired = clothing.requiredFur.amount * amount + val requiredFur = Item(clothing.requiredFur.id,amtFurRequired) + + if(!player.inventory.containsItem(requiredFur)){ + player.dialogueInterpreter.sendDialogue("You don't have enough fur for that.") + return + } + + if(!player.inventory.containsItem(coins)){ + player.dialogueInterpreter.sendDialogue("You can't afford that.") + return + } + + player.inventory.remove(requiredFur) + player.inventory.remove(coins) + player.inventory.add(Item(clothing.product.id,amount)) + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(FUR_CLOTHING_COMPONENT_ID,this) + return this + } + + + //Enum for the various pieces, requirements, etc. + internal enum class FUR_CLOTHING(val requiredFur: Item, val price: Int, val product: Item, val textChildID: Int, val textContent: String){ + POLAR_KEBBIT_TOP(Item(10117,2),20, POLAR_CAMO_TOP,18,"Polar kebbit"), + POLAR_KEBBIT_BOT(Item(10117,2),20, POLAR_CAMO_LEGS,18,"Polar kebbit"), + COMMON_KEBBIT_TOP(Item(10121,2),20, WOOD_CAMO_TOP,19,"Common kebbit"), + COMMON_KEBBIT_BOT(Item(10121,2),20, WOOD_CAMO_LEGS,19,"Common kebbit"), + FELDIP_WEASEL_TOP(Item(10119,2),20, JUNGLE_CAMO_TOP,20,"Feldip weasel"), + FELDIP_WEASEL_BOT(Item(10119,2),20, JUNGLE_CAMO_LEGS,20,"Feldip weasel"), + DESERT_DEVIL_TOP(Item(10123,2),20, DESERT_CAMO_TOP,21,"Desert devil"), + DESERT_DEVIL_BOT(Item(10123,2),20, DESERT_CAMO_LEGS, 21, "Desert devil"), + LARUPIA_HEAD(Item(10095),500, LARUPIA_HAT,15,"Larupia"), + LARUPIA_CHEST(Item(10095),500, LARUPIA_TOP,15,"Larupia"), + LARUPIA_BOT(Item(10095),500, LARUPIA_LEGS,15,"Larupia"), + GRAAHK_HEAD(Item(10099),750, GRAAHK_HEADDRESS,16,"Graahk"), + GRAAHK_CHEST(Item(10099),750, GRAAHK_TOP,16,"Graahk"), + GRAAHK_BOT(Item(10099),750, GRAAHK_LEGS,16,"Graahk"), + KYATT_HEAD(Item(10039),1000, KYATT_HAT,17,"Kyatt"), + KYATT_CHEST(Item(10039),1000, KYATT_TOP,17,"Kyatt"), + KYATT_BOT(Item(10039),1000, KYATT_LEGS,17,"Kyatt"), + GLOVES_SILENCE(Item(10115),600, GLOVES_OF_SILENCE,22,"Dark kebbit"), + SPOT_CAPE(Item(10125),400, SPOTTED_CAPE,23,"Spotted kebbit"), + DASH_CAPE(Item(10127),800, SPOTTIER_CAPE,24,"Dashing kebbit") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/inter/GameInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/GameInterface.java new file mode 100644 index 000000000..1fb366010 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/GameInterface.java @@ -0,0 +1,241 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.combat.equipment.WeaponInterface.WeaponInterfaces; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.plugin.Plugin; + +/** + * Represents the component plugin used for the game interface. + * @author Vexia + * + */ +@Initializable +public final class GameInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(548, this); + ComponentDefinition.put(750, this); + ComponentDefinition.put(751, this); + ComponentDefinition.put(740, this); + ComponentDefinition.put(746, this); + return this; + } + + @Override + public boolean handle(final Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (component.getId()) { + case 740: + switch (button){ + case 3: + player.getInterfaceManager().closeChatbox(); + break; + } + return true; + case 746: + switch (button){ + case 12: + player.getPacketDispatch().sendString("When you have finished playing " + GameWorld.getSettings().getName() + ", always use the button below to logout safely. ", 182, 0); + break; + case 49: + player.getPacketDispatch().sendString("Friends List - " + GameWorld.getSettings().getName() + " " + GameWorld.getSettings().getWorldId(), 550, 3); + break; + case 110: + configureWorldMap(player); + break; + } + return true; + case 548: + int tut_stage = TutorialSession.getExtension(player).getStage(); + if (button >= 38 && button<= 44 || button >= 20 && button <= 26) { + player.getInterfaceManager().setCurrentTabIndex(getTabIndex(button)); + } + //Interface buttons that advance the Tutorial Island stages + switch (button) { + case 21://Friends Tab + if (tut_stage == 63) { + player.getConfigManager().set(1021, 0); + TutorialStage.load(player, 64, false); + } + player.getPacketDispatch().sendString("Friends List -" + GameWorld.getSettings().getName() + " " + GameWorld.getSettings().getWorldId(), 550, 3); + break; + case 22://Ignore Tab + if (tut_stage == 64) { + player.getConfigManager().set(1021, 0); + TutorialStage.load(player, 65, false); + } + break; + case 24://Settings Tab + if (tut_stage == 1) { + TutorialStage.load(player, 2, false); + } + break; + case 25://Emotes Tab + if (tut_stage == 23) { + TutorialStage.load(player, 24, false); + } + break; + case 26://Music Tab + if (tut_stage == 21) { + TutorialStage.load(player, 22, false); + } + break; + case 38://Attack Tab + if (tut_stage == 49) { + player.getConfigManager().set(1021, 0); + TutorialStage.load(player, 50, false); + } else { + if (TutorialSession.getExtension(player).getStage() > TutorialSession.MAX_STAGE) { + if (player.getExtension(WeaponInterface.class) == WeaponInterfaces.STAFF) { + final Component c = new Component(WeaponInterfaces.STAFF.getInterfaceId()); + player.getInterfaceManager().openTab(0, c); + final WeaponInterface inter = player.getExtension(WeaponInterface.class); + inter.updateInterface(); + } + } + } + break; + case 39://Skill Tab + if (tut_stage == 10) { + player.getConfigManager().set(1021, 0); + TutorialStage.load(player, 11, false); + } + break; + case 40://Quest Tab + if (tut_stage == 27) { + TutorialStage.load(player, 28, false); + } + /*if (GameWorld.isEconomyWorld()) { + player.getQuestRepository().syncronizeTab(player); + } else { + player.getSavedData().getSpawnData().drawStatsTab(player); + }*/ + + player.getQuestRepository().syncronizeTab(player); + break; + case 41://Inventory Tab + if (tut_stage == 5) { + player.getConfigManager().set(1021, 0); + TutorialStage.load(player, 6, false); + } + player.getInventory().refresh(); + break; + case 42://Worn Equipment Tab + if (tut_stage == 45) { + player.getConfigManager().set(1021, 0); + TutorialStage.load(player, 46, false); + } + break; + case 43://Prayer Tab + if (tut_stage == 61) { + player.getConfigManager().set(1021, 0); + TutorialStage.load(player, 62, false); + } + break; + case 44://Magic Tab + if (tut_stage == 68) { + player.getConfigManager().set(1021, 0); + TutorialStage.load(player, 69, false); + player.getDialogueInterpreter().open(946, RegionManager.getNpc(player, 946)); + } + break; + case 66://World map + case 110: + configureWorldMap(player); + break; + case 69://Logout + player.getPacketDispatch().sendString("When you have finished playing " + GameWorld.getSettings().getName() + ", always use the button below to logout safely. ", 182, 0); + break; + } + return true; + case 750: + switch (opcode) { + case 155: + switch (button) { + case 1: + player.getSettings().toggleRun(); + break; + } + break; + } + return true; + case 751: + switch (opcode) { + case 155: + switch (button) { + case 27: + openReport(player); + break; + } + break; + } + return true; + } + return true; + } + + /** + * World map + * Thanks, Snickerize! + */ + private void configureWorldMap(Player player) { + if (player.inCombat()) { + player.getPacketDispatch().sendMessage("It wouldn't be very wise opening the world map during combat."); + return; + } + if(player.getLocks().isInteractionLocked() || player.getLocks().isMovementLocked()){ + player.getPacketDispatch().sendMessage("You can't do this right now."); + return; + } + player.getInterfaceManager().openWindowsPane(new Component(755)); + int posHash = (player.getLocation().getZ() << 28) | (player.getLocation().getX() << 14) | player.getLocation().getY(); + player.getPacketDispatch().sendScriptConfigs(622, posHash, "", 0); + player.getPacketDispatch().sendScriptConfigs(674, posHash, "", 0); + } + + /** + * Method used to open the report interface. + * @param player the player. + */ + public static void openReport(final Player player) { + player.getInterfaceManager().open(new Component(553)).setCloseEvent((player1, c) -> { + player1.getPacketDispatch().sendRunScript(80, ""); + player1.getPacketDispatch().sendRunScript(137, ""); + return true; + }); + player.getPacketDispatch().sendRunScript(508, ""); + if (player.getDetails().getRights() != Rights.REGULAR_PLAYER) { + for (int i = 0; i < 18; i++) { + player.getPacketDispatch().sendInterfaceConfig(553, i, false); + } + } + } + + /** + * Gets the tab index. + * @param button The button id. + * @return The tab index. + */ + private static int getTabIndex(int button) { + int tabIndex = button - 38; + if (button < 27) { + tabIndex = (button - 20) + 7; + } + return tabIndex; + } + + /** + * Configures the world map for a player. + * @param player The player. + */ +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/GlassInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/GlassInterface.java new file mode 100644 index 000000000..c6ba188ce --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/GlassInterface.java @@ -0,0 +1,122 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.GlassProduct; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the glass making interface plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GlassInterface extends ComponentPlugin { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(884); + + /** + * Represents the molten glass item. + */ + private static final Item MOLTEN_GLASS = new Item(1775); + + /** + * Represents the soda ash item. + */ + private static final Item SODA_ASH = new Item(1781, 1); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(542, this); + return this; + } + + @Override + public boolean handle(final Player p, Component component, int opcode, int button, int slot, int itemId) { + final GlassProduct def = GlassProduct.forId(button); + if (def == null) { + return true; + } + if (!p.getInventory().contains(1785, 1)) { + p.getPacketDispatch().sendMessage("You need a glassblowing pipe to do this."); + return true; + } + if (!p.getInventory().contains(1775, 1)) { + p.getPacketDispatch().sendMessage("You need molten glass to do this."); + return true; + } + if (p.getSkills().getLevel(Skills.CRAFTING) < def.getLevel()) { + p.getPacketDispatch().sendMessage("You need a crafting level of " + def.getLevel() + " to make this."); + return true; + } + int real = -1; + switch (opcode) { + case 230: + real = 1; + break; + case 205: + real = 5; + break; + case 127: + real = p.getInventory().getAmount(MOLTEN_GLASS); + break; + case 211: + p.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + make(p, def, ammount); + return true; + } + }); + p.getDialogueInterpreter().sendInput(false, "Enter the amount."); + break; + } + if (opcode == 211) { + return true; + } + make(p, def, real); + return true; + } + + /** + * Method used to make a glass product. + * @param player the player. + * @param glass the glass. + * @param amount the amount. + */ + public static void make(final Player player, final GlassProduct glass, final int amount) { + player.getInterfaceManager().close(); + player.animate(ANIMATION); + GameWorld.getPulser().submit(new Pulse(2, player) { + int amt = amount; + + @Override + public boolean pulse() { + if (!player.getInventory().contains(1775, 1) || amt == 0) { + return true; + } + player.animate(ANIMATION); + player.getInventory().remove(MOLTEN_GLASS); + player.getInventory().add(new Item(glass.getProduct(), 1)); + player.getSkills().addExperience(Skills.CRAFTING, glass.getExperience(), true); + player.getPacketDispatch().sendMessage("You make a " + new Item(glass.getProduct()).getName().toLowerCase().replace("unpowered", "").trim() + "."); + amt--; + return false; + } + + }); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/GliderInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/GliderInterface.java new file mode 100644 index 000000000..5ea3aa3c2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/GliderInterface.java @@ -0,0 +1,36 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.global.travel.glider.GliderPulse; +import core.game.content.global.travel.glider.Gliders; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the glider interface component. + * @author Emperor + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GliderInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(138, this); + return this; + } + + @Override + public boolean handle(final Player player, Component component, int opcode, int button, int slot, int itemId) { + final Gliders glider = Gliders.forId(button); + if (glider == null) { + return true; + } + player.getPulseManager().run(new GliderPulse(1, player, glider)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/GrandExchangeInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/GrandExchangeInterface.java new file mode 100644 index 000000000..e8fc896d0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/GrandExchangeInterface.java @@ -0,0 +1,427 @@ +package core.game.interaction.inter; + +import core.cache.def.impl.CS2Mapping; +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.ge.*; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.interaction.npc.BogrogPouchSwapper; + +/** + * Handles the Grand Exchange interface options. + * @author Emperor + * @version 1.0 + */ +@Initializable +public class GrandExchangeInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(105, this); // Main interface + ComponentDefinition.put(107, this); // Selling tab + ComponentDefinition.put(109, this); // Collection interface + ComponentDefinition.put(389, this); // Search interface + ComponentDefinition.put(644, this); // Item sets inventory interface + ComponentDefinition.put(645, this); // Item sets interface + ComponentDefinition.put(642, this); // Guide Prices interface. + return this; + } + + /** + * Increments the opened grand exchange offer amount. + * @param player The player. + * @param amount The amount to increment. + */ + @SuppressWarnings("deprecation") + private void setOfferAmount(Player player, GrandExchangeOffer offer, int amount) { + if (offer == null || amount < 0 || offer.getOfferState() != OfferState.PENDING) { + return; + } + offer.setAmount(amount); + player.getConfigManager().send(1110, offer.getAmount()); + } + + /** + * Increments the opened grand exchange offer amount. + * @param player The player. + */ + @SuppressWarnings("deprecation") + private void setOfferValue(Player player, GrandExchangeOffer offer, int value) { + if (offer == null || value < 1 || offer.getOfferState() != OfferState.PENDING) { + return; + } + if (value == GrandExchangeDatabase.getDatabase().get(offer.getItemID()).getValue()) { + player.getAudioManager().send(new Audio(4043, 1, 1)); + } else if (value > offer.getOfferedValue()) { + player.getAudioManager().send(new Audio(4041, 1, 1)); + } else { + player.getAudioManager().send(new Audio(4045, 1, 1)); + } + offer.setOfferedValue(value); + player.getConfigManager().send(1111, offer.getOfferedValue()); + } + + @Override + public boolean handle(final Player player, final Component component, final int opcode, final int button, final int slot, final int itemId) { + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + switch (component.getId()) { + case 644: + case 645: + handleItemSet(player, component, opcode, button, slot, itemId); + return true; + case 389: + handleSearchInterface(player, opcode, button, slot, itemId); + return true; + case 107: + handleSellingTab(player, opcode, button, slot, itemId); + return true; + case 109: + handleCollectionBox(player, opcode, button, slot, itemId); + return true; + case 642: + handleGuidePrice(player, opcode, button, slot, itemId); + return true; + } + handleMainInterface(player, opcode, button, slot, itemId); + return true; + } + }); + return true; + } + + /** + * Handles the search interface options. + * @param player The player. + * @param opcode The packet opcode. + * @param button The button id. + * @param slot The slot. + * @param itemId The item id. + * @return {@code true} if the option got handled. + */ + public boolean handleSearchInterface(final Player player, int opcode, int button, int slot, int itemId) { + switch (button) { + case 10: + player.getInterfaceManager().closeChatbox(); + return true; + } + return false; + } + + /** + * Handles the selling tab interface options. + * @param player The player. + * @param opcode The packet opcode. + * @param button The button id. + * @param slot The slot. + * @param itemId The item id. + * @return {@code true} if the option got handled. + */ + public boolean handleSellingTab(final Player player, int opcode, int button, int slot, int itemId) { + if (button != 18 || slot < 0 || slot > 27) { + return false; + } + Item item = player.getInventory().get(slot); + if (item == null) { + return false; + } + switch (opcode) { + case 196: + player.getPacketDispatch().sendMessage(item.getDefinition().getExamine()); + return true; + case 155: + player.getPlayerGrandExchange().constructSale(item); + return true; + } + return false; + } + + /** + * Handles the selling tab interface options. + * @param player The player. + * @param opcode The packet opcode. + * @param button The button id. + * @param slot The slot. + * @param itemId The item id. + * @return {@code true} if the option got handled. + */ + public boolean handleCollectionBox(final Player player, int opcode, int button, int slot, int itemId) { + int index = -1; + switch (button) { + case 18: + case 23: + case 28: + index = (button - 18) >> 2; + break; + case 36: + case 44: + case 52: + index = 3 + ((button - 36) >> 3); + break; + } + GrandExchangeOffer offer; + if (index > -1 && (offer = player.getPlayerGrandExchange().getOffers()[index]) != null) { + player.getPlayerGrandExchange().withdraw(offer, slot >> 1); + } + return true; + } + + /** + * Handles the item set. + * @param player The player. + * @param opcode The opcode. + * @param button The button. + * @param slot The slot. + * @param itemId The item id. + */ + private void handleItemSet(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (button != 16 && button != 0) { + return; + } + boolean inventory = component.getId() == 644; + if (slot < 0 || slot >= (inventory ? 28 : GEItemSet.values().length)) { + return; + } + GEItemSet set = GEItemSet.values()[slot]; + Item item = inventory ? player.getInventory().get(slot) : new Item(set.getItemId()); + if (item == null) { + return; + } + if (opcode != 127 && inventory && ((set = GEItemSet.forId(item.getId())) == null) && !BogrogPouchSwapper.handle(player,opcode,slot,itemId)) { + player.getPacketDispatch().sendMessage("This isn't a set item."); + return; + } + switch (opcode) { + case 124: + player.getPacketDispatch().sendMessage(item.getDefinition().getExamine()); + break; + case 196: + if (inventory) { + if (player.getInventory().freeSlots() < set.getComponents().length - 1) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space for the component parts."); + return; + } + if (!player.getInventory().remove(item, false)) { + return; + } + for (int id : set.getComponents()) { + player.getInventory().add(new Item(id, 1)); + } + player.getInventory().refresh(); + player.getPacketDispatch().sendMessage("You successfully traded your set for its component items!"); + } else { + if (!player.getInventory().containItems(set.getComponents())) { + player.getPacketDispatch().sendMessage("You don't have the parts that make up this set."); + break; + } + for (int id : set.getComponents()) { + player.getInventory().remove(new Item(id, 1), false); + } + player.getInventory().add(item); + player.getInventory().refresh(); + player.getPacketDispatch().sendMessage("You successfully traded your item components for a set!"); + } + player.getAudioManager().send(new Audio(4044, 1, 1)); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, player.getAttribute("container-key", 93), player.getInventory(), false)); + break; + case 155: + player.getPacketDispatch().sendMessage((String) CS2Mapping.forId(1089).getMap().get(set.getItemId())); + break; + } + } + + /** + * Handles the main interface options. + * @param player The player. + * @param opcode The packet opcode. + * @param button The button id. + * @param slot The slot. + * @param itemId The item id. + * @return {@code true} if the option got handled. + */ + public boolean handleMainInterface(final Player player, int opcode, int button, int slot, int itemId) { + final GrandExchangeOffer offer = player.getPlayerGrandExchange().getTemporaryOffer(); + final GrandExchangeOffer opened = player.getPlayerGrandExchange().getOpenedOffer(); + int amount = offer == null ? 0 : offer.getAmount(); + switch (button) { + case 209: + case 211: + if (opened == null) { + return false; + } + player.getPlayerGrandExchange().withdraw(opened, (button - 209) >> 1); + return true; + case 190: + player.getPlayerGrandExchange().confirmOffer(); + player.getPlayerGrandExchange().setTemporaryOffer(null); + return true; + case 194: + player.getPlayerGrandExchange().openSearch(); + return true; + case 203: + if (opened == null) { + return false; + } + player.getPlayerGrandExchange().abort(opened.getIndex()); + return true; + case 18: + case 34: + case 50: + case 69: + case 88: + case 107: + if (opcode == 205) { + player.getPlayerGrandExchange().abort((button - 18) >> 4); + return true; + } + player.getPlayerGrandExchange().view((button - 18) >> 4); + return true; + case 30: + case 46: + case 62: + case 81: + case 100: + case 119: + player.getPlayerGrandExchange().openBuy((button - 30) >> 4); + return true; + case 31: + case 47: + case 63: + case 82: + case 101: + case 120: + player.getPlayerGrandExchange().openSell((button - 31) >> 4); + return true; + case 157: // -1 + setOfferAmount(player, offer, amount - 1); + return true; + case 159: // +1 + setOfferAmount(player, offer, amount + 1); + return true; + case 162: // 1 + setOfferAmount(player, offer, offer != null && offer.getSell() ? 1 : amount + 1); + return true; + case 164: // 10 + setOfferAmount(player, offer, offer != null && offer.getSell() ? 10 : amount + 10); + return true; + case 166: // 100 + setOfferAmount(player, offer, offer != null && offer.getSell() ? 100 : amount + 100); + return true; + case 168: // 1000 / sell all + if (offer != null && offer.getSell()) { + setOfferAmount(player, offer, PlayerGrandExchange.getInventoryAmount(player, offer.getItemID())); + return true; + } + setOfferAmount(player, offer, amount + 1000); + return true; + case 170: // value x + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + if (player.getInterfaceManager().getChatbox().getId() == 389) { + player.getPlayerGrandExchange().openSearch(); + } + setOfferAmount(player, offer, (int) value); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount."); + return false; + case 180: + if (offer != null) { + setOfferValue(player, offer, GrandExchangeDatabase.getDatabase().get(offer.getItemID()).getValue()); + return true; + } + return false; + case 177: // mid - 5% value + case 183: // mid + 5% value + if (offer != null) { + setOfferValue(player, offer, (int) (GrandExchangeDatabase.getDatabase().get(offer.getItemID()).getValue() * (button == 177 ? 0.95 : 1.05))); + return true; + } + return false; + case 171: // Decrease value by 1 + case 173: // Increase value with 1 + if (offer != null) { + setOfferValue(player, offer, offer.getOfferedValue() + (button == 171 ? -1 : 1)); + return true; + } + return false; + case 185: // Set value x + if (offer == null) { + player.getPacketDispatch().sendMessage("Please select an offer first."); + return true; + } + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + if (player.getInterfaceManager().getChatbox().getId() == 389) { + player.getPlayerGrandExchange().openSearch(); + } + setOfferValue(player, offer, (int) value); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount."); + return false; + case 195: + player.getInterfaceManager().close(); + return true; + case 127: + player.getPlayerGrandExchange().setTemporaryOffer(null); + player.getInterfaceManager().closeSingleTab(); + player.getInterfaceManager().closeChatbox(); + return true; + } + return false; + } + + /*** + * Method used to handle the guide price opcode. + * @param player the player. + * @param opcode the opcode. + * @param buttonId the buttonId. + * @param slot the slot. + * @param itemId the itemId. + */ + private void handleGuidePrice(final Player player, final int opcode, final int buttonId, final int slot, final int itemId) { + switch (opcode) { + case 155: + GEGuidePrice.GuideType type = player.getAttribute("guide-price", null); + if (type == null) { + return; + } + int subtract = 0; + if (buttonId >= 15 && buttonId <= 23) { + subtract = 15; + } + if (buttonId >= 43 && buttonId <= 57) { + subtract = 43; + } + if (buttonId >= 89 && buttonId <= 103) { + subtract = 89; + } + if (buttonId >= 135 && buttonId <= 144) { + subtract = 135; + } + if (buttonId >= 167 && buttonId <= 182) { + subtract = 167; + } + player.getPacketDispatch().sendMessage(ItemDefinition.forId(type.getItems()[buttonId - subtract].getItem()).getExamine()); + break; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/GravePurchaseInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/GravePurchaseInterface.java new file mode 100644 index 000000000..7e9b88ed0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/GravePurchaseInterface.java @@ -0,0 +1,44 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.grave.GraveType; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the component plugin used for the grave purchasing interface. + * @author Vexia + */ +@Initializable +public final class GravePurchaseInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(652, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (slot == -1) { + return true; + } + final GraveType grave = GraveType.values()[slot]; + int cost = grave.getCost(); + if (!player.getInventory().containsItem(new Item(995, cost))) { + return true; + } + if (!player.getInventory().remove(new Item(995, cost)) && grave != GraveType.MEMORIAL_PLAQUE) { + player.getPacketDispatch().sendMessage("You don't have enough coins to buy this grave stone."); + return true; + } + player.getGraveManager().setType(grave); + player.getDialogueInterpreter().sendDialogue("Your gravestone has been changed as you requested."); + player.getInterfaceManager().close(); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/HairDresserInterface.kt b/Server/src/main/java/Server/core/game/interaction/inter/HairDresserInterface.kt new file mode 100644 index 000000000..9a6b15dcc --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/HairDresserInterface.kt @@ -0,0 +1,276 @@ +package core.game.interaction.inter + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.dialogue.FacialExpression + +/** + * Handles the reworked hairdresser interface with full functionality + * @author Ceikry + */ +private const val HAIRDRESSER_MALE_COMPONENT_ID = 596 +private const val HAIRDRESSER_FEMALE_COMPONENT_ID = 592 + +private val HAIR_COLORS = intArrayOf(20, 19, 10, 18, 4, 5, 15, 7, 0, 6, 21, 9, 22, 17, 8, 16, 11, 24, 23, 3, 2, 1, 14, 13, 12) +private val maleColorButtonRange = (229..253) +private val femaleColorButtonRange = (73..97) + +//Female Styles 45-54 +private const val F_BALD = 45 +private const val F_BUN = 46 +private const val F_DREAD = 47 +private const val F_LONG = 48 +private const val F_SHORT = 49 +private const val F_PIGTAILS = 50 +private const val F_CREW = 51 +private const val F_CLOSE_CROP = 52 +private const val F_WILD_SPIKE = 53 +private const val F_SPIKE = 54 +//Female Styles 135-146 +private const val F_SIDE_PONY = 135 +private const val F_CURLS = 136 +private const val F_WIND_BRAIDS = 137 +private const val F_PONYTAIL = 138 +private const val F_RING_BRAIDS = 139 +private const val F_FOUR_PONIES = 140 +private const val F_FLIP = 141 +private const val F_LAYERED_FLIP = 142 +private const val F_STRAIGHT = 143 +private const val F_LONG_BRAIDS = 144 +private const val F_CURTAINS = 145 +//Female Hair Styles 242 & 269-280 +private const val F_EARMUFFS = 242 +private const val F_FRINGE = 269 +private const val F_PINNED_UP = 270 +private const val F_LAYERED = 271 +private const val F_TOP_KNOT = 272 +private const val F_PINNED_BUN = 273 +private const val F_PONYTAIL_SPIKED = 274 +private const val F_PIXIE = 275 +private const val F_ODANGO = 276 +private const val F_BUN_WITH_FRINGE = 277 +private const val F_PIGTAILS_WITH_FRINGE = 278 +private const val F_FRENCH_TWIST = 279 +private const val F_PRINCESS = 280 + +//An array of female hairstyles in the same order as the interface +val FEMALE_HAIR_STYLES = intArrayOf(F_BALD, F_BUN, F_DREAD, F_LONG, F_SHORT, F_PIGTAILS, F_CREW, F_CLOSE_CROP, F_WILD_SPIKE, F_SPIKE, F_SIDE_PONY, F_CURLS, F_WIND_BRAIDS, F_PONYTAIL, F_RING_BRAIDS, F_FOUR_PONIES, F_FLIP, F_LAYERED_FLIP, F_STRAIGHT, F_LONG_BRAIDS, F_CURTAINS, F_EARMUFFS, F_FRINGE, F_PINNED_UP, F_LAYERED, F_TOP_KNOT, F_PINNED_BUN, F_PONYTAIL_SPIKED, F_PIXIE, F_ODANGO, F_BUN_WITH_FRINGE, F_PIGTAILS_WITH_FRINGE, F_FRENCH_TWIST, F_PRINCESS) + +//Male Styles +private const val M_BALD = 0 +private const val M_DREAD = 1 +private const val M_LONG = 2 +private const val M_MEDIUM = 3 +private const val M_MONK = 4 +private const val M_SHORT = 5 +private const val M_CLOSE_CROP = 6 +private const val M_WILD_SPIKE = 7 +private const val M_SPIKE = 8 +private const val M_MOHAWK = 91 +private const val M_WIND_BRAID = 92 +private const val M_QUIFF = 93 +private const val M_SAMURAI = 94 +private const val M_PRINCE = 95 +private const val M_CURTAINS = 96 +private const val M_LONG_CURTAINS = 97 +private const val M_SIDE_PART_SPIKE = 246 +private const val M_TOP_KNOT = 262 +private const val M_PONYTAIL_SPIKEY = 251 +private const val M_LONG_SWEPT_FRINGE = 265 +private const val M_EVANSTYLE = 252 +private const val M_DRAGON = 257 +private const val M_WARRIOR_CURTAINS = 247 +private const val M_COMB_OVER = 253 + + +//Array of male hairstyles in the same order as the interface +val MALE_HAIR_STYLES = intArrayOf(M_BALD,M_DREAD,M_LONG, M_MEDIUM, M_MONK, M_SHORT, M_CLOSE_CROP, M_WILD_SPIKE, M_SPIKE, M_MOHAWK, M_WIND_BRAID, M_QUIFF, M_SAMURAI, M_PRINCE, M_CURTAINS, M_LONG_CURTAINS, M_SIDE_PART_SPIKE, M_TOP_KNOT, M_PONYTAIL_SPIKEY, M_LONG_SWEPT_FRINGE, M_EVANSTYLE, M_DRAGON, M_WARRIOR_CURTAINS, M_COMB_OVER) + + +//Male Facial Hairs +private const val MF_GOATEE = 10 +private const val MF_LONG_BEARD = 11 +private const val MF_MEDIUM_BEARD = 12 +private const val MF_MOUSTACHE = 13 +private const val MF_CLEAN_SHAVEN = 14 +private const val MF_SHORT_BEARD = 15 +private const val MF_SHORT_FULL = 16 +private const val MF_SPLIT_BEARD = 17 +private const val MF_HANDLEBAR = 98 +private const val MF_MUTTON = 99 +private const val MF_FULL_MUTTON = 100 +private const val MF_FULL_MOUSTACHE = 101 +private const val MF_WAXED = 102 +private const val MF_DALI = 103 +private const val MF_VIZIER = 104 +private const val MF_HALF_GOATEE = 305 +private const val MF_SIDEBURNS = 306 +private const val MF_IMPERIAL = 307 +private const val MF_SENSEI = 308 + +//Array of male facial hairstyles in the same order as interface +val MALE_FACIAL_STYLES = intArrayOf(MF_GOATEE, MF_LONG_BEARD, MF_MEDIUM_BEARD, MF_MOUSTACHE, MF_CLEAN_SHAVEN, MF_SHORT_BEARD, MF_SHORT_FULL, MF_SPLIT_BEARD, MF_HANDLEBAR, MF_MUTTON, MF_FULL_MUTTON, MF_FULL_MOUSTACHE, MF_WAXED, MF_DALI, MF_VIZIER, MF_HALF_GOATEE, MF_SIDEBURNS, MF_IMPERIAL, MF_SENSEI) + +private val maleStyleButtonRange = (65..90) +private val femaleStyleButtonRange = (148..181) + +private val COINS = Item(995,2000) + +@Initializable +class HairDresserInterface : ComponentPlugin(){ + override fun open(player: Player?, component: Component?) { + player ?: return + super.open(player, component) + player.setAttribute("original-hair",player.appearance.hair.look) + player.setAttribute("original-beard",player.appearance.beard.look) + player.setAttribute("original-color",player.appearance.hair.color) + val usedInterface = if(player.isMale) HAIRDRESSER_MALE_COMPONENT_ID else HAIRDRESSER_FEMALE_COMPONENT_ID + //17 + val player_model_child = when(usedInterface){ + HAIRDRESSER_FEMALE_COMPONENT_ID -> 17 + HAIRDRESSER_MALE_COMPONENT_ID -> 62 + else -> 0 + } + val player_head_child = when(usedInterface){ + HAIRDRESSER_FEMALE_COMPONENT_ID -> 146 + HAIRDRESSER_MALE_COMPONENT_ID -> 61 + else -> 0 + } + player.packetDispatch.sendPlayerOnInterface(usedInterface,player_model_child) + player.packetDispatch.sendAnimationInterface(FacialExpression.HAPPY.animationId,usedInterface,player_head_child) + player.packetDispatch.sendPlayerOnInterface(usedInterface,player_head_child) + player.toggleWardrobe(true) + + component?.setCloseEvent{pl,_ -> + player.toggleWardrobe(false) + player.setAttribute("beard-setting",false) + if(!pl.getAttribute("hairdresser-paid",false)){ + val original_hair = player.getAttribute("original-hair",0) + val original_beard = player.getAttribute("original_beard",-1) + val original_color = player.getAttribute("original_color",0) + pl.appearance.hair.changeLook(original_hair) + pl.appearance.hair.changeColor(original_color) + if(original_beard != -1) { + pl.appearance.beard.changeLook(original_beard) + } + pl.appearance.sync() + } + pl.removeAttribute("hairdresser-paid") + true + } + syncAppearance(player) + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + val isBeard = player.getAttribute("beard-setting",false) + + when(button){ + 199 -> player.setAttribute("beard-setting",false) + 200 -> player.setAttribute("beard-setting",true) + 68,196 -> pay(player) + else -> when(component?.id){ + 592 -> { //Female + if(femaleColorButtonRange.contains(button)){ + updateColor(player,button) + } + if(femaleStyleButtonRange.contains(button)){ + updateHair(player,button) + } + } + 596 -> { //Male + //Handle beard options + if(isBeard && !maleColorButtonRange.contains(button)){ + updateBeard(player,button) + return true + } + if(maleColorButtonRange.contains(button)){ + updateColor(player,button) + return true + } + if(maleStyleButtonRange.contains(button)){ + updateHair(player,button) + } + } + } + } + return true + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(HAIRDRESSER_MALE_COMPONENT_ID,this) + ComponentDefinition.put(HAIRDRESSER_FEMALE_COMPONENT_ID, this) + return this + } + + fun pay(player: Player){ + if(player.inventory.containsItem(COINS)){ + player.inventory.remove(COINS) + player.setAttribute("hairdresser-paid",true) + player.interfaceManager.close() + } else { + player.dialogueInterpreter.sendDialogue("You can not afford that.") + } + } + + fun updateBeard(player: Player, button: Int){ + var subtractor = 105 + when(button){ //why the fuck jagex (they skipped button ids for no reason) + 123 -> subtractor += 2 + 126 -> subtractor += 4 + 129 -> subtractor += 6 + } + player.appearance.beard.changeLook(MALE_FACIAL_STYLES[button - subtractor]) + syncAppearance(player) + } + + fun updateHair(player: Player, button: Int){ + val usedInterface = if(player.isMale) HAIRDRESSER_MALE_COMPONENT_ID else HAIRDRESSER_FEMALE_COMPONENT_ID + + //Since hair styles are arranged in an array above, we can get the style for a specific + //button by subtracting the id of the first style's button in an interface from the + //current button. + var subtractor = when(usedInterface){ + HAIRDRESSER_MALE_COMPONENT_ID -> 65 //first color male buttonId = 229 + HAIRDRESSER_FEMALE_COMPONENT_ID -> 148 //first color female buttonId = 73 + else -> 0 + } + + val hairArray = when(usedInterface){ + HAIRDRESSER_MALE_COMPONENT_ID -> MALE_HAIR_STYLES + HAIRDRESSER_FEMALE_COMPONENT_ID -> FEMALE_HAIR_STYLES + else -> intArrayOf(0) + } + + when(button){ //why the fuck jagex (they skipped button ids for no reason) + 89,90 -> subtractor += 2 + } + + player.appearance.hair.changeLook(hairArray[button - subtractor]) + syncAppearance(player) + } + + fun updateColor(player: Player, button: Int){ + val usedInterface = if(player.isMale) HAIRDRESSER_MALE_COMPONENT_ID else HAIRDRESSER_FEMALE_COMPONENT_ID + + //Since hair colors are arranged in an array above, we can get the color for a specific + //button by subtracting the id of the first color's button in an interface from the + //current button. + var subtractor = when(usedInterface){ + HAIRDRESSER_MALE_COMPONENT_ID -> 229 //first color male buttonId = 229 + HAIRDRESSER_FEMALE_COMPONENT_ID -> 73 //first color female buttonId = 73 + else -> 0 + } + player.appearance.hair.changeColor(HAIR_COLORS[button - subtractor]) + syncAppearance(player) + } + + fun syncAppearance(player: Player){ + player.appearance.sync() + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/JewelleryInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/JewelleryInterface.java new file mode 100644 index 000000000..e879443d7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/JewelleryInterface.java @@ -0,0 +1,199 @@ +package core.game.interaction.inter; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting; +import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting.JewelleryItem; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.StringUtils; + +/** + * Represents the interface plugin used for jewellery crafting. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class JewelleryInterface extends ComponentPlugin { + + /** + * Represents constants of useful items. + */ + public static final int RING_MOULD = 1592, AMULET_MOULD = 1595, NECKLACE_MOULD = 1597, BRACELET_MOULD = 11065, GOLD_BAR = 2357, SAPPHIRE = 1607, EMERALD = 1605, RUBY = 1603, DIAMOND = 1601, DRAGONSTONE = 1615, ONYX = 6573; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(446, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + int amount = 0; + JewelleryItem data = null; + switch(button){ + case 20: + data = JewelleryItem.GOLD_RING; + break; + case 22: + data = JewelleryItem.SAPPIRE_RING; + break; + case 24: + data = JewelleryItem.EMERALD_RING; + break; + case 26: + data = JewelleryItem.RUBY_RING; + break; + case 28: + data = JewelleryItem.DIAMOND_RING; + break; + case 30: + data = JewelleryItem.DRAGONSTONE_RING; + break; + case 32: + data = JewelleryItem.ONYX_RING; + break; + case 35: + data = JewelleryItem.SLAYER_RING; + break; + } + switch (button - 3) { + case 39: + data = JewelleryItem.GOLD_NECKLACE; + break; + case 41: + data = JewelleryItem.SAPPHIRE_NECKLACE; + break; + case 43: + data = JewelleryItem.EMERALD_NECKLACE; + break; + case 45: + data = JewelleryItem.RUBY_NECKLACE; + break; + case 47: + data = JewelleryItem.DIAMOND_NECKLACE; + break; + case 49: + data = JewelleryItem.DRAGONSTONE_NECKLACE; + break; + case 51: + data = JewelleryItem.ONYX_NECKLACE; + break; + case 58: + data = JewelleryItem.GOLD_AMULET; + break; + case 60: + data = JewelleryItem.SAPPHIRE_AMULET; + break; + case 62: + data = JewelleryItem.EMERALD_AMULET; + break; + case 64: + data = JewelleryItem.RUBY_AMULET; + break; + case 66: + data = JewelleryItem.DIAMOND_AMULET; + break; + case 68: + data = JewelleryItem.DRAGONSTONE_AMULET; + break; + case 70: + data = JewelleryItem.ONYX_AMULET; + break; + case 77: + data = JewelleryItem.GOLD_BRACELET; + break; + case 79: + data = JewelleryItem.SAPPHIRE_BRACELET; + break; + case 81: + data = JewelleryItem.EMERALD_BRACELET; + break; + case 83: + data = JewelleryItem.RUBY_BRACELET; + break; + case 85: + data = JewelleryItem.DIAMOND_BRACELET; + break; + case 87: + data = JewelleryItem.DRAGONSTONE_BRACELET; + break; + case 89: + data = JewelleryItem.ONYX_BRACELET; + break; + } + if (data == null) { + return true; + } + if (player.getSkills().getLevel(Skills.CRAFTING) < data.getLevel()) { + String an = StringUtils.isPlusN(ItemDefinition.forId(data.getSendItem()).getName().toLowerCase()) ? "an" : "a"; + player.getPacketDispatch().sendMessage("You need a crafting level of " + data.getLevel() + " to craft " + an + " " + ItemDefinition.forId(data.getSendItem()).getName().toLowerCase() + "."); + return true; + } + String name = ItemDefinition.forId(data.getSendItem()).getName().toLowerCase(); + boolean flag = false; + if (name.contains("ring") && !player.getInventory().contains(RING_MOULD, 1)) { + flag = true; + } + if (name.contains("necklace") && !player.getInventory().contains(NECKLACE_MOULD, 1)) { + flag = true; + } + if (name.contains("amulet") && !player.getInventory().contains(AMULET_MOULD, 1)) { + flag = true; + } + if (name.contains("bracelet") && !player.getInventory().contains(BRACELET_MOULD, 1)) { + flag = true; + } + if (flag) { + player.getPacketDispatch().sendMessage("You don't have the required mould to make this."); + return flag; + } + switch (opcode) { + case 155: + amount = 1; + break; + case 196: + amount = 5; + break; + case 124: + if (data.name().contains("GOLD")) { + amount = player.getInventory().getAmount(new Item(GOLD_BAR)); + } else { + int first = player.getInventory().getAmount(new Item(data.getItems()[0])); + int second = player.getInventory().getAmount(new Item(data.getItems()[1])); + if (first == second) { + amount = first; + } else if (first > second) { + amount = second; + } else { + amount = first; + } + } + break; + case 199: + final JewelleryItem d = data; + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + JewelleryCrafting.make(player, d, (int) getValue()); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter amount:"); + return true; + } + if(!player.getSlayer().getLearned()[1] && data.equals(JewelleryItem.SLAYER_RING)){ + player.sendMessages("You don't know how to make this. Talk to any Slayer master in order to learn the", "ability that creates Slayer rings."); + return true; + } + JewelleryCrafting.make(player, data, amount); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/LeatherCraftInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/LeatherCraftInterface.java new file mode 100644 index 000000000..44ba8b6fb --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/LeatherCraftInterface.java @@ -0,0 +1,59 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.skill.crafting.armour.LeatherCrafting; +import core.game.node.entity.skill.crafting.armour.SoftCraftPulse; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the leather crafting interface. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LeatherCraftInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(154, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + int amount = 0; + final LeatherCrafting.SoftLeather soft = LeatherCrafting.SoftLeather.forButton(button); + if (soft == null) { + return true; + } + switch (opcode) { + case 155: + amount = 1; + break; + case 196: + amount = 5; + break; + case 124: + amount = player.getInventory().getAmount(new Item(LeatherCrafting.LEATHER)); + break; + case 199: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + player.getPulseManager().run(new SoftCraftPulse(player, new Item(LeatherCrafting.LEATHER), soft, (int) getValue())); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter amount:"); + return true; + } + player.getPulseManager().run(new SoftCraftPulse(player, null, soft, amount)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/LeatherCraftPlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/LeatherCraftPlugin.java new file mode 100644 index 000000000..ae1cd2e7c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/LeatherCraftPlugin.java @@ -0,0 +1,42 @@ +package core.game.interaction.inter; + +import core.plugin.Initializable; +import core.game.node.entity.skill.crafting.armour.LeatherCrafting; +import core.game.node.entity.skill.crafting.armour.LeatherCrafting.SoftLeather; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.plugin.Plugin; + +/** + * Represents the plugin used for crafting leather. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LeatherCraftPlugin extends UseWithHandler { + + /** + * Constructs a new {@code LeatherCraftPlugin} {@code Object}. + */ + public LeatherCraftPlugin() { + super(LeatherCrafting.LEATHER, LeatherCrafting.HARD_LEATHER, LeatherCrafting.GREEN_LEATHER, LeatherCrafting.BLUE_LEATHER, LeatherCrafting.RED_LEATHER, LeatherCrafting.BLACK_LEATHER); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(LeatherCrafting.NEEDLE, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (event.getBaseItem().getId() == LeatherCrafting.LEATHER || event.getUsedItem().getId() == LeatherCrafting.LEATHER) { + SoftLeather.open(event.getPlayer()); + } else if (event.getBaseItem().getId() == LeatherCrafting.HARD_LEATHER || event.getUsedItem().getId() == LeatherCrafting.HARD_LEATHER) { + event.getPlayer().getDialogueInterpreter().open(48923, "hard"); + } else { + event.getPlayer().getDialogueInterpreter().open(48923, "dragon", event.getUsedItem().getId()); + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/LoginInterfacePlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/LoginInterfacePlugin.java new file mode 100644 index 000000000..9149bb56c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/LoginInterfacePlugin.java @@ -0,0 +1,51 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.LoginConfiguration; +import core.game.system.task.Pulse; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the login interface. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LoginInterfacePlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(378, this); + return null; + } + + @Override + public boolean handle(final Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 140: + if (player.getLocks().isLocked("login")) { + return true; + } + player.getLocks().lock("login", 2); + player.getInterfaceManager().close(); + player.getPulseManager().run(new Pulse(1) { + @Override + public boolean pulse() { + LoginConfiguration.configureGameWorld(player); + return true; + } + }); + break; + case 145://credits + break; + case 204://message centre + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/LogoutInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/LogoutInterface.java new file mode 100644 index 000000000..2a916e1e2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/LogoutInterface.java @@ -0,0 +1,40 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the interface used to logout of the game. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LogoutInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(182, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (!player.getZoneMonitor().canLogout()) { + return true; + } + if (player.inCombat()) { + player.getPacketDispatch().sendMessage("You can't log out until 10 seconds after the end of combat."); + return true; + } + if (player.getAttribute("logoutDelay", 0) < GameWorld.getTicks()) { + player.getPacketDispatch().sendLogout(); + player.setAttribute("logoutDelay", GameWorld.getTicks() + 3); + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/MagicBookInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/MagicBookInterface.java new file mode 100644 index 000000000..71f98568d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/MagicBookInterface.java @@ -0,0 +1,36 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.GameWorld; +import core.plugin.Plugin; + +/** + * Represents the magic book interface handling of non-combat spells. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MagicBookInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(192, this); + ComponentDefinition.put(193, this); + ComponentDefinition.put(430, this); + return this; + } + + @Override + public boolean handle(final Player player, Component component, int opcode, int button, int slot, int itemId) { + if (GameWorld.getTicks() < player.getAttribute("magic:delay", -1)) { + return true; + } + return MagicSpell.castSpell(player, component.getId() == 192 ? SpellBook.MODERN : component.getId() == 193 ? SpellBook.ANCIENT : SpellBook.LUNAR, button, player); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/MakeOverInterface.kt b/Server/src/main/java/Server/core/game/interaction/inter/MakeOverInterface.kt new file mode 100644 index 000000000..29854dc14 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/MakeOverInterface.kt @@ -0,0 +1,126 @@ +package core.game.interaction.inter + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.tools.Items +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.appearance.Gender +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.dialogue.FacialExpression + +//child IDs for components of interest on the interface +private const val MALE_CHILD_ID = 90 +private const val FEMALE_CHILD_ID = 92 +private const val TEXT_CHILD = 88 + +//skin color buttons +private val skincolorButtons = (93..100) + +/** + * Fully authentic and functional makeover interface + * @author Ceikry + */ +@Initializable +class MakeOverInterface : ComponentPlugin(){ + override fun open(player: Player?, component: Component?) { + component ?: return + player ?: return + super.open(player, component) + //Send NPC chat heads to interface + player.packetDispatch.sendNpcOnInterface(1,component.id, MALE_CHILD_ID) + player.packetDispatch.sendNpcOnInterface(5,component.id, FEMALE_CHILD_ID) + //Send chathead animations to interface + player.packetDispatch.sendAnimationInterface(FacialExpression.SILENT.animationId,component.id, MALE_CHILD_ID) + player.packetDispatch.sendAnimationInterface(FacialExpression.SILENT.animationId,component.id, FEMALE_CHILD_ID) + + //Check for makeover voucher and then change interface text if it's there + if(player.inventory.containsAtLeastOneItem(Items.MAKEOVER_VOUCHER_5606)){ + player.packetDispatch.sendString("USE MAKEOVER VOUCHER",component.id, TEXT_CHILD) + } + + //Automatically hide the button representing the player's current skin color + val currentSkin = player.appearance.skin.color + player.setAttribute("mm-previous",currentSkin) + player.packetDispatch.sendInterfaceConfig(component.id, skincolorButtons.first + currentSkin, true) + + player.toggleWardrobe(true) + + component.setCloseEvent{pl,_ -> + pl.toggleWardrobe(false) + if(player.getAttribute("mm-paid",false)){ + val newColor = player.getAttribute("mm-previous",-1) + val newGender = player.getAttribute("mm-gender",-1) + if(newColor > -1){ + player.appearance.skin.changeColor(newColor) + } + if(newGender > -1){ + player.appearance.changeGender(Gender.values()[newGender]) + player.appearance.skin.changeColor(newColor) + } + player.appearance.sync() + player.removeAttribute("mm-paid") + } + pl.removeAttribute("mm-previous") + pl.removeAttribute("mm-gender") + true + } + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + if(skincolorButtons.contains(button)){ + updateInterfaceConfigs(player,button) + return true + } + when(button){ + 113,101 -> updateGender(player,true) + 114,103 -> updateGender(player,false) + 88 -> pay(player) + } + + return true + } + + fun updateGender(player: Player, male: Boolean){ + player.setAttribute("mm-gender",if(male) Gender.MALE.ordinal else Gender.FEMALE.ordinal) + } + + fun pay(player: Player){ + val newColor = player.getAttribute("mm-previous",player.appearance.skin.color) + val newGender = player.getAttribute("mm-gender",player.appearance.gender.ordinal) + + //Don't charge if they didn't change anything + if(newColor == player.appearance.skin.color && Gender.values()[newGender] == player.appearance.gender){ + player.interfaceManager.close() + } else { + val currency = if(player.inventory.containsAtLeastOneItem(Items.MAKEOVER_VOUCHER_5606)){ + Item(Items.MAKEOVER_VOUCHER_5606,1) + } else Item(995,3000) + + if(player.inventory.containsItem(currency)){ + player.setAttribute("mm-paid",true) + player.inventory.remove(currency) + player.interfaceManager.close() + } else { + player.dialogueInterpreter.sendDialogue("You can not afford that.") + } + } + } + + fun updateInterfaceConfigs(player: Player,button: Int){ + val old = player.getAttribute("mm-previous",0) + player.setAttribute("mm-previous",button - skincolorButtons.first) + player.packetDispatch.sendInterfaceConfig(205,old + skincolorButtons.first,false) + player.packetDispatch.sendInterfaceConfig(205,button,true) + + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(205,this) + return this + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/MusicTabInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/MusicTabInterface.java new file mode 100644 index 000000000..112092586 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/MusicTabInterface.java @@ -0,0 +1,57 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.link.music.MusicEntry; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the interface tab buttons. + * @author Emperor + */ +@Initializable +public final class MusicTabInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(187, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (opcode) { + case 155: + switch (button) { + case 11: + player.getMusicPlayer().toggleLooping(); + return true; + case 1: + MusicEntry entry = player.getMusicPlayer().getUnlocked().get(slot); + if (entry == null) { + if(player.getRights().equals(Rights.ADMINISTRATOR)){ + for(MusicEntry ent : MusicEntry.getSongs().values()){ + if(ent.getIndex() == slot){ + player.getMusicPlayer().unlock(ent.getId()); + break; + } + } + } else { + player.getPacketDispatch().sendMessage("You have not unlocked this piece of music yet!"); + } + return true; + } + player.getMusicPlayer().setPlaying(false); + player.getMusicPlayer().play(entry); + return true; + } + break; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/MysticStaffEnchantingPlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/MysticStaffEnchantingPlugin.java new file mode 100644 index 000000000..663aa3ef0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/MysticStaffEnchantingPlugin.java @@ -0,0 +1,95 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.tools.Items; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.StringUtils; + +import java.util.HashMap; + +/** + * Represents the plugin used to handle the agility ticket interface. + * @author afaroutdude + */ +@Initializable +public final class MysticStaffEnchantingPlugin extends ComponentPlugin { + + private final Component COMPONENT = new Component(332); + private final int cost = 40000; + + protected enum EnchantedStaff { + AIR(Items.MYSTIC_AIR_STAFF_1405, Items.AIR_BATTLESTAFF_1397, 21), + WATER(Items.MYSTIC_WATER_STAFF_1403, Items.WATER_BATTLESTAFF_1395, 22), + EARTH(Items.MYSTIC_EARTH_STAFF_1407, Items.EARTH_BATTLESTAFF_1399, 23), + FIRE(Items.MYSTIC_FIRE_STAFF_1401, Items.FIRE_BATTLESTAFF_1393, 24), + LAVA(Items.MYSTIC_LAVA_STAFF_3054, Items.LAVA_BATTLESTAFF_3053, 25), + MUD(Items.MYSTIC_MUD_STAFF_6563, Items.MUD_BATTLESTAFF_6562, 26); + + public final int enchanted; + public final int basic; + public final int child; + + private static final HashMap basicToEnchanted = new HashMap<>(); + private static final HashMap childToBasic = new HashMap<>(); + + static { + for (EnchantedStaff staff : EnchantedStaff.values()) { + basicToEnchanted.put(staff.basic, staff.enchanted); + childToBasic.put(staff.child, staff.basic); + } + } + + EnchantedStaff(int enchantedId, int basicId, int childId) { + this.enchanted = enchantedId; + this.basic = basicId; + this.child = childId; + } + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(332).setPlugin(this); + return this; + } + + @Override + public void open(Player player, Component component) { + super.open(player, component); + // zoom doesn't work, but based on https://youtu.be/qxxhhCdxBsQ?t=75 seems correct anyway + for (EnchantedStaff staff : EnchantedStaff.values()) { + player.getPacketDispatch().sendItemZoomOnInterface(staff.basic, 240, COMPONENT.getId(), staff.child); + } + } + + @Override + public boolean handle(Player player, Component component, int opcode, int buttonId, int slot, int itemId) { + player.getPacketDispatch().sendMessage("op: " + opcode + " button: " + buttonId + " slot: "+ slot + " item: " + itemId); + + if (EnchantedStaff.childToBasic.containsKey(buttonId)) { + Item basicStaff = new Item(EnchantedStaff.childToBasic.get(buttonId)); + Item enchantedStaff = new Item(EnchantedStaff.basicToEnchanted.get(basicStaff.getId())); + + if (!player.getInventory().containsItem(basicStaff)) { + player.getPacketDispatch().sendMessage("You don't have a" + (StringUtils.isPlusN(basicStaff.getName()) ? "n " : " ") + basicStaff.getName() + " to enchant."); + return true; + } + if (!player.getInventory().contains(995, cost)) { + player.getInterfaceManager().close(); + player.getDialogueInterpreter().sendDialogues(389, null, "I need 40,000 coins for materials. Come", "back when you have the money!"); + return true; + } + if (player.getInventory().remove(basicStaff, new Item(995, cost))) { + player.getInterfaceManager().close(); + player.getDialogueInterpreter().sendDialogues(389, null, "Just a moment... hang on... hocus pocus abra-", "cadabra... there you go! Enjoy your enchanted staff!"); + player.getInventory().add(enchantedStaff); + } + } + + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/OrbViewingInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/OrbViewingInterface.java new file mode 100644 index 000000000..d6b2be5f4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/OrbViewingInterface.java @@ -0,0 +1,181 @@ +package core.game.interaction.inter; + +import core.ServerConstants; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles an orb viewing interface. + * @author 'Vexia + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class OrbViewingInterface extends ComponentPlugin { + + /* + * Order: South-west, South-east, North-west, North-east, Centre + */ + + /** + * The fight pit locations. + */ + private static final Location[] FIGHT_PITS = { Location.create(2388, 5138, 0), Location.create(2411, 5137, 0), Location.create(2409, 5158, 0), Location.create(2384, 5157, 0), Location.create(2398, 5150, 0) }; + + /** + * The clan war locations. + */ + private static final Location[] CLAN_WARS = { Location.create(3277, 3725, 0), Location.create(3315, 3725, 0), Location.create(3316, 3829, 0), Location.create(3277, 3827, 0), Location.create(3296, 3776, 0) }; + + /** + * The bounty hunter viewing orb locations. + */ + private static final Location[][] BOUNTY_HUNTER = { { // Low level crater + Location.create(2752, 5695, 0), Location.create(2816, 5695, 0), Location.create(2783, 5783, 0), Location.create(2826, 5785, 0), Location.create(2784, 5727, 0) }, { // Mid + // level + // crater + Location.create(3008, 5695, 0), Location.create(3072, 5695, 0), Location.create(3039, 5783, 0), Location.create(3082, 5785, 0), Location.create(3040, 5727, 0) }, { // High + // level + // crater + Location.create(3264, 5695, 0), Location.create(3328, 5695, 0), Location.create(3295, 5783, 0), Location.create(3338, 5785, 0), Location.create(3296, 5727, 0) } }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(374, this); + ComponentDefinition.put(649, this); + PluginManager.definePlugin(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(9391).getHandlers().put("option:look-into", this); + ObjectDefinition.forId(28194).getHandlers().put("option:look-into", this); + ObjectDefinition.forId(28209).getHandlers().put("option:view", this); + ObjectDefinition.forId(28210).getHandlers().put("option:view", this); + ObjectDefinition.forId(28211).getHandlers().put("option:view", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int interfaceId = 649; + switch (node.getId()) { + case 9391: + interfaceId = 374; + player.setAttribute("viewing_orb", FIGHT_PITS); + break; + case 28194: + player.setAttribute("viewing_orb", CLAN_WARS); + break; + case 28209: + case 28210: + case 28211: + player.setAttribute("viewing_orb", BOUNTY_HUNTER[node.getId() - 28209]); + break; + } + viewOrb(player, interfaceId); + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + switch (n.getId()) { + case 28194: + return n.getLocation().transform(1, 0, 0); + } + return null; + } + }); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + Location[] locations = player.getAttribute("viewing_orb"); + if (locations == null) { + return false; + } + if (button != 5) { + move(player, locations[15 - button]); + } else { + stopViewing(player, true); + } + return true; + } + + /** + * Method used to move to a viewing location. + * @param location the location. + */ + private void move(final Player player, final Location location) { + player.getLocks().lockMovement(100000000); + player.getProperties().setTeleportLocation(location); + if (player.getAppearance().getNpcId() == -1) { + player.getAppearance().transformNPC(-2); + player.getAppearance().sync(); + } + } + + /** + * Views an orb. + * @param player the player. + * @param interfaceId the interface id. + */ + private void viewOrb(final Player player, final int interfaceId) { + final Component component = new Component(interfaceId).setCloseEvent(new ViewCloseEvent()); + player.setAttribute("view-location", player.getLocation()); + player.getInterfaceManager().openSingleTab(component); + player.getPulseManager().run(new Pulse(1, player) { + @Override + public boolean pulse() { + return false; + } + + @Override + public void stop() { + super.stop(); + stopViewing(player, true); + } + }); + } + + /** + * Ends the viewing session. + * @param player the player. + * @param close if we should close the interface. + */ + private static void stopViewing(final Player player, boolean close) { + if (close) { + player.getInterfaceManager().closeSingleTab(); + } + player.removeAttribute("viewing_orb"); + player.unlock(); + player.getAppearance().transformNPC(-1); + player.getAppearance().sync(); + player.getPulseManager().clear(); + player.getProperties().setTeleportLocation(player.getAttribute("view-location", ServerConstants.HOME_LOCATION)); + } + + /** + * Handles the close event of a viewing interface. + * @author 'Vexia + */ + public static final class ViewCloseEvent implements CloseEvent { + + @Override + public boolean close(Player player, Component c) { + stopViewing(player, false); + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/PlayerExamineInterfacePlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/PlayerExamineInterfacePlugin.java new file mode 100644 index 000000000..0009ec3c6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/PlayerExamineInterfacePlugin.java @@ -0,0 +1,73 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.StringUtils; + +/** + * Package -> core.game.interaction.inter + * Created on -> 9/6/2016 @8:12 PM for 530 + * + * @author Ethan Kyle Millard + */ +@Initializable +public class PlayerExamineInterfacePlugin extends ComponentPlugin { + + private Player node; + + public PlayerExamineInterfacePlugin() { + + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(31, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 2: + component.close(player); + break; + } + return true; + } + + public void prepareInterface(Player player, Player examined) { + Component component = new Component(31); + player.getPacketDispatch().sendInterfaceConfig(component.getId(), 7, true); + player.getPacketDispatch().sendInterfaceConfig(component.getId(), 8, true); + player.getPacketDispatch().sendInterfaceConfig(component.getId(), 15, true); + player.getPacketDispatch().sendInterfaceConfig(component.getId(), 18, true); + player.getPacketDispatch().sendInterfaceConfig(component.getId(), 2, true); + player.getPacketDispatch().sendInterfaceConfig(component.getId(), 14, true); + player.getPacketDispatch().sendInterfaceConfig(component.getId(), 13, true); + player.getInterfaceManager().open(component); + player.getPacketDispatch().sendString("" + examined.getSavedData().getSpawnData().getTitle().getName() + " " + StringUtils.formatDisplayName(examined.getName()) + " - Combat Level: " + player.getProperties().getCurrentCombatLevel(), 31, 3); + player.getPacketDispatch().sendString("Total Level -> ", 31, 9); + player.getPacketDispatch().sendString("Inventory items -> ", 31, 10); + player.getPacketDispatch().sendString("Inventory value -> ", 31, 16); + player.getPacketDispatch().sendString("Custom state-> ", 31, 19); + player.getPacketDispatch().sendString("" + examined.getSkills().getTotalLevel(), 31, 11); + player.getPacketDispatch().sendString("" + examined.getInventory().itemCount(), 31, 12); + player.getPacketDispatch().sendString("" + examined.getInventory().getWealth(), 31, 17); + player.getPacketDispatch().sendString("" + examined.getCustomState(), 31, 20); + player.getPacketDispatch().sendString("Close", 31, 5); + + for (int i = 0; i < 11; i++) { + Item item = examined.getEquipment().get(i); + if (item == null) { + continue; + } + System.out.println(item.getName()); + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/PrayerTabInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/PrayerTabInterface.java new file mode 100644 index 000000000..22c16313a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/PrayerTabInterface.java @@ -0,0 +1,33 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the prayer interface. + * @author 'Vexia + */ +@Initializable +public final class PrayerTabInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(271, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + final PrayerType type = PrayerType.get(button); + if (type == null) { + return true; + } + player.getPrayer().toggle(type); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/PuppyInterfacePlugin.kt b/Server/src/main/java/Server/core/game/interaction/inter/PuppyInterfacePlugin.kt new file mode 100644 index 000000000..152efeb1a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/PuppyInterfacePlugin.kt @@ -0,0 +1,54 @@ +package core.game.interaction.inter + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.RandomFunction + +/** + * Represents the puppy interface plugin. + * @author Ceikry + */ +@Initializable +class PuppyInterfacePlugin : ComponentPlugin() { + override fun newInstance(arg: Any?): Plugin? { + ComponentDefinition.put(668, this) + return this + } + + override fun handle(player: Player, component: Component, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + val index = when(button){ + 8 -> 0 + 3 -> 1 + 4 -> 2 + 5 -> 3 + 6 -> 4 + 7 -> 5 + else -> 0 + } + player.dialogueInterpreter.open(6893, NAMES[index], PUPPIES[index][RandomFunction.random(PUPPIES[index].size)]) + return true + } + + companion object { + /** + * Represents the names of the puppys. + */ + private val NAMES = arrayOf("labrador", "bulldog", "dalmatian", "greyhound", "terrier", "sheepdog") + + /** + * Represents the puppies. + */ + private val PUPPIES = arrayOf( + arrayOf(Item(12516), Item(12708), Item(12710)), //Labrador + arrayOf(Item(12522), Item(12720), Item(12722)), //Bulldog + arrayOf(Item(12518), Item(12712), Item(12714)), //Dalmatian + arrayOf(Item(12514), Item(12704), Item(12706)), //Greyhound + arrayOf(Item(12512), Item(12700), Item(12702)), //Terrier + arrayOf(Item(12520), Item(12716), Item(12718))) //Sheepdog + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/inter/QuestTabInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/QuestTabInterface.java new file mode 100644 index 000000000..37ce6302a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/QuestTabInterface.java @@ -0,0 +1,75 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the quest tab reward buttons. + * @author Emperor + * @author Vexia + */ +@Initializable +public class QuestTabInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(274, this); // Quests + ComponentDefinition.put(259, this); // Achievement diary + return this; + } + + @Override + public boolean handle(Player p, Component component, int opcode, int button, int slot, int itemId) { + if (TutorialSession.getExtension(p).getStage() < TutorialSession.MAX_STAGE) { + return true; + } + p.getPulseManager().clear(); + switch (component.getId()) { + case 274: +// if (!GameWorld.isEconomyWorld()) { +// p.getSavedData().getSpawnData().handleButton(p, button); +// } + switch (button) { + case 3: + p.getAchievementDiaryManager().openTab(); + return true; + case 10: + break; + default: +// if (GameWorld.isEconomyWorld()) { + //System.out.println("Quest button: " + button); + Quest quest = p.getQuestRepository().forButtonId(button); + if (quest != null) { + p.getInterfaceManager().open(new Component(275)); + quest.drawJournal(p, quest.getStage(p)); + return true; + } +// } + return false; + } + break; + case 259: + switch (button) { + case 8: + p.getInterfaceManager().openTab(2, new Component(274)); + return true; + default: + AchievementDiary diary = p.getAchievementDiaryManager().getDiary(DiaryType.forChild(button)); + if (diary != null) { + diary.open(p); + } + return true; + } + } + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/inter/RequestAssistInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/RequestAssistInterface.java new file mode 100644 index 000000000..53059f691 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/RequestAssistInterface.java @@ -0,0 +1,65 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.assist.AssistSession; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class RequestAssistInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(301, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + final AssistSession session = AssistSession.getExtension(player); + if (session == null) { + return true; + } + if (player != session.getPlayer()) { + return true; + } + switch (button) { + case 15: + session.toggleButton((byte) 0); + break; + case 20: + session.toggleButton((byte) 1); + break; + case 25: + session.toggleButton((byte) 2); + break; + case 30: + session.toggleButton((byte) 3); + break; + case 35: + session.toggleButton((byte) 4); + break; + case 40: + session.toggleButton((byte) 5); + break; + case 45: + session.toggleButton((byte) 6); + break; + case 50: + session.toggleButton((byte) 7); + break; + case 55: + session.toggleButton((byte) 8); + break; + } + session.refresh(); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/SawmillPlankInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/SawmillPlankInterface.java new file mode 100644 index 000000000..2f2f12df6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/SawmillPlankInterface.java @@ -0,0 +1,177 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the component handler for the interface 403. + * @author 'Vexia + * @date Oct 8, 2013 + */ +@Initializable +public class SawmillPlankInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(403, this); + return this; + } + + @Override + public boolean handle(final Player player, Component component, int opcode, int button, int slot, int itemId) { + Plank plank = null; + if (button > 101 && button < 108) { + plank = Plank.WOOD; + } else if (button > 108 && button < 114) { + plank = Plank.OAK; + } else if (button > 114 && button < 120) { + plank = Plank.TEAK; + } else if (button > 120 && button < 126) { + plank = Plank.MAHOGANY; + } + int amount = -1; + int fullIndex = plank == Plank.WOOD ? 107 : plank == Plank.OAK ? 113 : plank == Plank.TEAK ? 119 : 125; + // 107, 105, 104, 103, 102 + int difference = -1; + if (plank != Plank.WOOD) { + difference = fullIndex - button; + } else { + difference = fullIndex - button - (button != 107 ? 1 : 0); + } + switch (difference) { + case 0: + amount = 1; + break; + case 1: + amount = 5; + break; + case 2: + amount = 10; + break; + case 3: + amount = 69; + break; + case 4: + amount = player.getInventory().getAmount(plank.getLog()); + break; + } + if (amount == 69) { + final Plank plankk = plank; + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + create(player, plankk, (int) super.getValue()); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + return true; + } + if (plank != null) { + create(player, plank, amount); + } + return true; + } + + /** + * Method used to create a plank from a log. + * @param player the player. + * @param plank the plank. + * @param amount the amount. + */ + public final void create(final Player player, final Plank plank, int amount) { + player.getInterfaceManager().close(); + if (amount > player.getInventory().getAmount(plank.getLog())) { + amount = player.getInventory().getAmount(plank.getLog()); + } + if (!player.getInventory().containsItem(new Item(plank.getLog().getId()))) { + player.getDialogueInterpreter().sendDialogues(4250, null, "You'll need to bring me some more logs."); + return; + } + if (!player.getInventory().contains(995, plank.getPrice() * amount)) { + player.getDialogueInterpreter().sendDialogues(player, null, "Sorry, I don't have enough coins to pay for that."); + return; + } + if (player.getInventory().remove(new Item(995, plank.getPrice() * amount))) { + // Make a plank at the sawmill + if (plank == Plank.WOOD) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 3); + } + // Buy twenty mahogany planks from the Sawmill Operator in one

transaction + if (plank == Plank.MAHOGANY && amount >= 20) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 15); + } + Item remove = plank.getLog(); + remove.setAmount(amount); + if (player.getInventory().remove(remove)) { + Item planks = plank.getPlank(); + planks.setAmount(amount); + player.getInventory().add(planks); + } + } + } + + /** + * Represents an enum of planks to be boughten. + * @author 'Vexia + * @date Oct 8, 2013 + */ + public enum Plank { + WOOD(new Item(1511), new Item(960), 100), OAK(new Item(1521), new Item(8778), 250), TEAK(new Item(6333), new Item(8780), 500), MAHOGANY(new Item(6332), new Item(8782), 1500); + + /** + * Constructs a new {@code SawmillPlankInterface} {@code Object}. + * @param log the log. + * @param plank the plank. + * @param price the price. + */ + Plank(Item log, Item plank, int price) { + this.log = log; + this.plank = plank; + this.price = price; + } + + /** + * Represents the item needed. + */ + private final Item log; + + /** + * Represents the item given. + */ + private final Item plank; + + /** + * Represents the price of the plank. + */ + private final int price; + + /** + * @return the log. + */ + public Item getLog() { + return log; + } + + /** + * @return the plank. + */ + public Item getPlank() { + return plank; + } + + /** + * @return the price. + */ + public int getPrice() { + return price; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/SettingTabInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/SettingTabInterface.java new file mode 100644 index 000000000..4e4d76979 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/SettingTabInterface.java @@ -0,0 +1,95 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class SettingTabInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(261, this); + return this; + } + + @Override + public boolean handle(Player p, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 10:// brightness + int brightness = button - 7; + p.getSettings().setBrightness(brightness); + break; + case 11: + case 12: + case 13: + case 14: + case 15:// music + int volume = 15 - button; + p.getSettings().setMusicVolume(volume); + break; + case 16://530 settings + /* if (TutorialSession.getExtension(p).getStage() != TutorialSession.MAX_STAGE) { + p.sendMessage("You must finish the tutorial before opening the graphic settings."); + break; + }*/ + p.getInterfaceManager().open(new Component(742)); + break; + case 18://530 settings + p.getInterfaceManager().open(new Component(743)); + break; + case 17: + case 19: + case 20:// sonund + int volume1 = 20 - button; + p.getSettings().setSoundEffectVolume(volume1); + break; + case 29: + case 30: + case 31: + case 32: + case 33:// all sound + int volume11 = 33 - button; + p.getSettings().setAreaSoundVolume(volume11); + break; + case 6:// mouse + p.getSettings().toggleMouseButton(); + break; + case 4:// effects + p.getSettings().toggleChatEffects(); + break; + case 5:// private chat + p.getSettings().toggleSplitPrivateChat(); + break; + case 7:// aid + if (p.getIronmanManager().checkRestriction()) { + return true; + } + p.getSettings().toggleAcceptAid(); + break; + case 3:// run + if (TutorialSession.getExtension(p).getStage() == 25) { + TutorialStage.load(p, 26, false); + } + p.getSettings().toggleRun(); + break; + case 8:// house + if (!TutorialSession.getExtension(p).finished()) { + return true; + } + p.getInterfaceManager().close(); + p.getConfigManager().set(261, p.getConfigManager().get(261) & 0x1); + p.getInterfaceManager().openSingleTab(new Component(398)); + break; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/ShipCharterInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/ShipCharterInterface.java new file mode 100644 index 000000000..fd62d649b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/ShipCharterInterface.java @@ -0,0 +1,31 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.global.travel.ship.ShipCharter; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the chip chartering interface plugin. + * @author 'Vexia + * @date 28/11/2013 + */ +@Initializable +public class ShipCharterInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(95, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + ShipCharter.handle(player, button); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/ShoppingPlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/ShoppingPlugin.java new file mode 100644 index 000000000..10e38f27a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/ShoppingPlugin.java @@ -0,0 +1,141 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.Container; +import core.game.content.global.shop.ShopViewer; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.net.packet.in.ExaminePacket; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the shopping interface. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ShoppingPlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(620).setPlugin(this); + ComponentDefinition.forId(621).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + final ShopViewer viewer = player.getExtension(ShopViewer.class); + if (player.getAttributes().containsKey("spawning_items")) { + switch (opcode) { + case 155: + switch (button) { + case 23: + case 24: + case 0: + viewer.getShop().give(player, slot, 1, viewer.getTabIndex()); + break; + } + break; + } + return true; + } + if (viewer == null) { + System.out.println("shop is null"); + return true; + } + final Container container = button == 0 ? player.getInventory() : viewer.getShop().getContainer(viewer.getTabIndex()); + switch (opcode) { + case 155: + switch (button) { + case 23: + case 24: + case 0: + value(player, viewer, container.get(slot), component.getId() == 621); + break; + case 25: + case 26: + viewer.showStock(button == 26 ? 1 : 0); + break; + } + break; + case 9: + int id = container.getId(slot); + if (id == -1) { + return true; + } + player.getPacketDispatch().sendMessage(ExaminePacket.getItemExamine(id)); + break; + case 196: + case 199: + case 124: + case 234: + final int amount = getAmount(opcode); + if (player.getAttribute("shop-delay", 0L) > System.currentTimeMillis()) { + return true; + } + player.setAttribute("shop-delay", System.currentTimeMillis() + 500); + if (amount == -1) { + player.setAttribute("runscript", getRunScript(viewer, slot, component.getId())); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + break; + } + if (component.getId() == 620) { + viewer.getShop().buy(player, slot, amount, viewer.getTabIndex()); + } else { + viewer.getShop().sell(player, slot, amount, viewer.getTabIndex()); + } + break; + } + return true; + } + + /** + * Method used to value an item. + * @param player the player. + * @param viewer the viewer. + * @param item the item. + * @param sell the sell. + */ + private void value(final Player player, final ShopViewer viewer, final Item item, final boolean sell) { + if (item == null) { + return; + } + viewer.getShop().value(player, viewer, item, sell); + } + + /** + * Gets the run script for selling an item. + * @return the script. + * @param slot the slot. + */ + private RunScript getRunScript(final ShopViewer viewer, final int slot, final int componentId) { + return new RunScript() { + @Override + public boolean handle() { + switch (componentId){ + case 620: + viewer.getShop().buy(viewer.getPlayer(), slot, (int) getValue(), viewer.getTabIndex()); + break; + case 621: + viewer.getShop().sell(viewer.getPlayer(), slot, (int) getValue(), viewer.getTabIndex()); + break; + } + return true; + } + }; + } + + /** + * Gets the amount by the opcode. + * @param opcode the opcode. + * @return the amount. + */ + private int getAmount(int opcode) { + return opcode == 196 ? 1 : opcode == 124 ? 5 : opcode == 199 ? 10 : -1; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/SilverInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/SilverInterface.java new file mode 100644 index 000000000..ab9af3e80 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/SilverInterface.java @@ -0,0 +1,122 @@ +package core.game.interaction.inter; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.SilverProduct; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the silver crafting making interface. + * @author 'Vexia + */ +@Initializable +public final class SilverInterface extends ComponentPlugin { + + /** + * Represents the silver bar item. + */ + private static final Item SILVER_BAR = new Item(2355); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(438, this); + return this; + } + + @Override + public boolean handle(final Player p, Component component, int opcode, int button, int slot, int itemId) { + final SilverProduct silver = SilverProduct.forId(button); + if (silver == null) { + return true; + } + if (!p.getInventory().contains(silver.getNeeded(), 1)) { + p.getPacketDispatch().sendMessage("You need a " + ItemDefinition.forId(silver.getNeeded()).getName().toLowerCase() + " to make this item."); + return true; + } + if (silver == SilverProduct.SILVTHRIL_ROD) { + p.getPacketDispatch().sendMessage("You can't do that yet."); + return true; + } + if (p.getSkills().getLevel(Skills.CRAFTING) < silver.getLevel()) { + p.getPacketDispatch().sendMessage("You need a crafting level of " + silver.getLevel() + " to make this."); + } + int amt = -1; + switch (opcode) { + case 155: + amt = 1; + break; + case 196: + amt = 5; + break; + case 124: + amt = p.getInventory().getAmount(new Item(2355)); + break; + case 199: + p.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + make(p, silver, ammount); + return true; + } + }); + p.getDialogueInterpreter().sendInput(false, "Enter the amount."); + return true; + } + make(p, silver, amt); + return true; + } + + private void make(final Player player, final SilverProduct def, final int ammount) { + if (!player.getInventory().containsItem(SILVER_BAR)) { + return; + } + player.getInterfaceManager().close(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int amt = ammount; + + @Override + public boolean pulse() { + if (amt < 1) { + return true; + } + if (!player.getInventory().contains(def.getNeeded(), 1)) { + return true; + } + if (player.getInventory().containsItem(SILVER_BAR) && player.getInventory().contains(def.getNeeded(), 1)) { + player.animate(new Animation(899)); + if (player.getInventory().remove(SILVER_BAR)) { + player.getInventory().add(new Item(def.getProduct(), def == SilverProduct.SILVER_BOLTS ? 10 : 1)); + player.getSkills().addExperience(Skills.CRAFTING, def.getExp(), true); + } + + // Craft a holy symbol in the Lumbridge furnace + if (def == SilverProduct.UNBLESSED && player.getLocation().withinDistance(Location.create(3226, 3254, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 8); + } + } else { + return true; + } + amt--; + return false; + } + + @Override + public void stop() { + player.animate(new Animation(-1)); + } + }); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/SkillInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/SkillInterface.java new file mode 100644 index 000000000..adecfbc25 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/SkillInterface.java @@ -0,0 +1,31 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the skilling interface. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SkillInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(499, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + player.varpManager.get(965) + .setVarbit(0,player.getAttribute("skillMenu",-1)) + .setVarbit(10, button - 10).send(player); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/SkillTabInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/SkillTabInterface.java new file mode 100644 index 000000000..1bf7cd339 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/SkillTabInterface.java @@ -0,0 +1,175 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.skill.LevelUp; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the skilling tab. + * @author Vexia + * @author Splinter + * @version 1.1 + */ +@Initializable +public final class SkillTabInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(320, this); + return this; + } + + @Override + public boolean handle(Player p, Component component, int opcode, int button, int slot, int itemId) { + final SkillConfig config = SkillConfig.forId(button); + if (config == null) { + return true; + } + if (!GameWorld.getSettings().isPvp()) { + if (p.getAttribute("levelup:" + config.getSkillId(), false)) { + p.removeAttribute("levelup:" + config.getSkillId()); + LevelUp.sendFlashingIcons(p, -1); + p.getConfigManager().set(1230, ADVANCE_CONFIGS[config.getSkillId()]); + p.getInterfaceManager().open(new Component(741)); + } else { + p.getPulseManager().clear(); + p.getInterfaceManager().open(new Component(499)); + p.getConfigManager().set(965, config.getConfig()); + p.getAttributes().put("skillMenu", config.getConfig()); + } + } else { + if (config.getSkillId() > 6) { + p.getPacketDispatch().sendMessage("You cannot set a target level for this skill."); + return false; + } + if (p.canSpawn()) { + p.sendMessage("You must be inside Edgeville bank to set levels."); + return false; + } + p.getDialogueInterpreter().sendInput(true, "Enter the target level: "); + p.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + final int target_level = Integer.parseInt((String) getValue()); + if (target_level > 99 || target_level == -1) { + player.getPacketDispatch().sendMessage("Invalid target level."); + return true; + } + p.getSkills().setStaticLevel(config.getSkillId(), target_level); + p.getSkills().setLevel(config.getSkillId(), target_level); + return true; + } + }); + } + return true; + } + + /** + * Holds all the config values of the skill advances. + */ + public static final int[] ADVANCE_CONFIGS = { + 9, 40, 17, 49, + 25, 57, 33, 641, + 659, 664, 121, 649, + 89, 114, 107, 72, + 64, 80, 673, 680, + 99, 698, 689, 705, + }; + + public enum SkillConfig { + ATTACK(125, 1, Skills.ATTACK), + STRENGTH(126, 2, Skills.STRENGTH), + DEFENCE(127, 5, Skills.DEFENCE), + RANGE(128, 3, Skills.RANGE), + PRAYER(129, 7, Skills.PRAYER), + MAGIC(130, 4, Skills.MAGIC), + RUNECRAFTING(131, 12, Skills.RUNECRAFTING), + HITPOINTS(133, 6, Skills.HITPOINTS), + AGILITY(134, 8, Skills.AGILITY), + HERBLORE(135, 9, Skills.HERBLORE), + THIEVING(136, 10, Skills.THIEVING), + CRAFTING(137, 11, Skills.CRAFTING), + FLETCHING(138, 19, Skills.FLETCHING), + SLAYER(139, 20, Skills.SLAYER), + MINING(141, 13, Skills.MINING), + SMITHING(142, 14, Skills.SMITHING), + FISHING(143, 15, Skills.FISHING), + COOKING(144, 16, Skills.COOKING), + FIREMAKING(145, 17, Skills.FIREMAKING), + WOODCUTTING(146, 18, Skills.WOODCUTTING), + FARMING(147, 21, Skills.FARMING), + CONSTRUCTION(132, 22, Skills.CONSTRUCTION), + HUNTER(140, 23, Skills.HUNTER), + SUMMONING(148, 24, Skills.SUMMONING); + + /** + * Constructs a new {@code SkillConfig} {@code Object}. + * @param button the button. + * @param config the config. + */ + SkillConfig(int button, int config, int skillId) { + this.button = button; + this.config = config; + this.skillId = skillId; + } + + /** + * Represents the button. + */ + private int button; + + /** + * Represents the config. + */ + private int config; + + /** + * The skill id. + */ + private int skillId; + + /** + * Gets the skill config. + * @param id the id. + * @return the skill config. + */ + public static SkillConfig forId(int id) { + for (SkillConfig config : SkillConfig.values()) { + if (config.button == id) + return config; + } + return null; + } + + /** + * Gets the button. + * @return the button. + */ + public int getButton() { + return button; + } + + /** + * Gets the config. + * @return the config. + */ + public int getConfig() { + return config; + } + + /** + * Gets the skill id. + * @return The skill id. + */ + public int getSkillId() { + return skillId; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/SmeltingInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/SmeltingInterface.java new file mode 100644 index 000000000..f647dd65d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/SmeltingInterface.java @@ -0,0 +1,115 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.node.entity.skill.smithing.smelting.Bar; +import core.game.node.entity.skill.smithing.smelting.SmeltingPulse; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class SmeltingInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(311, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + final BarButton barType = BarButton.forId(button); + if (barType == null) { + return true; + } + if (barType.getAmount() == -1) { + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + player.getPulseManager().run(new SmeltingPulse(player, null, barType.getBar(), ammount)); + return false; + } + }); + player.getInterfaceManager().closeChatbox(); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + } else { + player.getPulseManager().run(new SmeltingPulse(player, null, barType.getBar(), barType.getAmount())); + } + return true; + } + + /** + * @author 'Vexia + */ + public enum BarButton { + BRONZE_1(16, Bar.BRONZE, 1), BRONZE_5(15, Bar.BRONZE, 5), BRONZE_10(14, Bar.BRONZE, 10), BRONZE_X(13, Bar.BRONZE, -1), BLURITE_1(20, Bar.BLURITE, 1), BLURITE_5(19, Bar.BLURITE, 5), BLURITE_10(18, Bar.BLURITE, 10), BLURITE_X(17, Bar.BLURITE, -1), IRON_1(24, Bar.IRON, 1), IRON_5(23, Bar.IRON, 5), IRON_10(22, Bar.IRON, 10), IRON_X(21, Bar.IRON, -1), SILVER_1(28, Bar.SILVER, 1), SILVER_5(27, Bar.SILVER, 5), SILVER_10(26, Bar.SILVER, 10), SILVER_X(25, Bar.SILVER, -1), STEEL_1(32, Bar.STEEL, 1), STEEL_5(31, Bar.STEEL, 5), STEEL_10(30, Bar.STEEL, 10), STEEL_X(29, Bar.STEEL, -1), GOLD_1(36, Bar.GOLD, 1), GOLD_5(35, Bar.GOLD, 5), GOLD_10(34, Bar.GOLD, 10), GOLD_X(33, Bar.GOLD, -1), MITHRIL_1(40, Bar.MITHRIL, 1), MITHRIL_5(39, Bar.MITHRIL, 5), MITHRIL_10(38, Bar.MITHRIL, 10), MITHRIL_X(37, Bar.MITHRIL, -1), ADAMANT_1(44, Bar.ADAMANT, 1), ADAMANT_5(43, Bar.ADAMANT, 5), ADAMANT_10(42, Bar.ADAMANT, 10), ADAMANT_X(41, Bar.ADAMANT, -1), RUNE_1(48, Bar.RUNITE, 1), RUNE_5(47, Bar.RUNITE, 5), RUNE_10(46, Bar.RUNITE, 10), RUNE_X(45, Bar.RUNITE, -1); + + /** + * Constructs a new {@code BarButton} {@code Object}. + * @param button the button. + * @param bar the bar. + * @param amount the amt. + */ + BarButton(int button, Bar bar, int amount) { + this.button = button; + this.bar = bar; + this.amount = amount; + } + + /** + * The button. + */ + private int button; + + /** + * The bar. + */ + private Bar bar; + + /** + * The ammount. + */ + private int amount; + + /** + * @param id + * @return + */ + public static BarButton forId(int id) { + for (BarButton button : BarButton.values()) { + if (button.getButton() == id) { + return button; + } + } + return null; + } + + /** + * @return the button. + */ + public int getButton() { + return button; + } + + /** + * @return the bar. + */ + public Bar getBar() { + return bar; + } + + /** + * @return the amount. + */ + public int getAmount() { + return amount; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/SmithingInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/SmithingInterface.java new file mode 100644 index 000000000..6e6740884 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/SmithingInterface.java @@ -0,0 +1,53 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.node.entity.skill.smithing.BarType; +import core.game.node.entity.skill.smithing.Bars; +import core.game.node.entity.skill.smithing.SmithingPulse; +import core.game.node.entity.skill.smithing.SmithingType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class SmithingInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(300, this); + return this; + } + + @Override + public boolean handle(final Player p, Component component, int opcode, int button, int slot, int itemId) { + final int item = Bars.getItemId(button, (BarType) p.getGameAttributes().getAttribute("smith-type")); + final Bars bar = Bars.forId(item); + if (bar == null) { + return true; + } + int amount = SmithingType.forButton(p, bar, button, bar.getBarType().getBarType()); + p.getGameAttributes().setAttribute("smith-bar", bar); + p.getGameAttributes().setAttribute("smith-item", item); + if (amount == -1) { + p.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + final int ammount = (int) value; + p.getPulseManager().run(new SmithingPulse(p, new Item((int) p.getGameAttributes().getAttribute("smith-item"), ammount), (Bars) p.getGameAttributes().getAttribute("smith-bar"), ammount)); + return false; + } + }); + p.getDialogueInterpreter().sendInput(false, "Enter the amount."); + return true; + } + p.getPulseManager().run(new SmithingPulse(p, new Item(item, amount), Bars.forId(item), amount)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/SpinningInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/SpinningInterface.java new file mode 100644 index 000000000..05227855e --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/SpinningInterface.java @@ -0,0 +1,63 @@ +package core.game.interaction.inter; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.skill.crafting.spinning.SpinningItem; +import core.game.node.entity.skill.crafting.spinning.SpinningPulse; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class SpinningInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(459, this); + return this; + } + + @Override + public boolean handle(final Player p, Component component, int opcode, int button, int slot, int itemId) { + final SpinningItem spin = SpinningItem.forId(button); + if (spin == null) { + return true; + } + if (!p.getInventory().contains(spin.getNeed(), 1)) { + p.getPacketDispatch().sendMessage("You need "+ ItemDefinition.forId(spin.getNeed()).getName().toLowerCase() + " to make this."); + return true; + } + int amt = -1; + switch (opcode) { + case 155: + amt = 1; + break; + case 196: + amt = 5; + break; + case 124: + amt = p.getInventory().getAmount(new Item(spin.getNeed())); + break; + case 199: + p.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + p.getPulseManager().run(new SpinningPulse(p, new Item(spin.getNeed(), 1), ammount, spin)); + return true; + } + }); + p.getDialogueInterpreter().sendInput(false, "Enter the amount."); + break; + } + if (opcode == 199) { + return true; + } + p.getPulseManager().run(new SpinningPulse(p, new Item(spin.getNeed(), 1), amt, spin)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/TanningInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/TanningInterface.java new file mode 100644 index 000000000..1fec9d4ac --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/TanningInterface.java @@ -0,0 +1,94 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.skill.crafting.TanningProduct; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * @author Vexia + * @version 1.2 + */ +@Initializable +public class TanningInterface extends ComponentPlugin { + + /** + * Method used to create a new instance. + * @param arg + * @return + * @throws Throwable + */ + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(324, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + TanningProduct def = null; + switch (button) { + case 1: + def = TanningProduct.SOFT_LEATHER; + break; + case 2: + def = TanningProduct.HARD_LEATHER; + break; + case 3: + def = TanningProduct.SNAKESKIN; + break; + case 4: + def = TanningProduct.SNAKESKIN2; + break; + case 5: + def = TanningProduct.GREEN_DHIDE; + break; + case 6: + def = TanningProduct.BLUEDHIDE; + break; + case 7: + def = TanningProduct.REDDHIDE; + break; + case 8: + def = TanningProduct.BLACKDHIDE; + break; + } + if (def == null) { + return true; + } + int amount = 0; + final TanningProduct deff = def; + switch (opcode){ + case 155: + amount = 1; + break; + case 196: + amount = 5; + break; + case 124: + amount = 10; + case 199: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int amt = (int) getValue(); + TanningProduct.tan(player, amt, deff); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter amount:"); + break; + case 234: + amount = player.getInventory().getAmount(new Item(def.getItem(), 1)); + break; + } + TanningProduct.tan(player, amount, def); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/ThessaliaInterface.kt b/Server/src/main/java/Server/core/game/interaction/inter/ThessaliaInterface.kt new file mode 100644 index 000000000..6311daf38 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/ThessaliaInterface.kt @@ -0,0 +1,249 @@ +package core.game.interaction.inter + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * Fully accurate and functional thessalia interface handling + * @author Ceikry + */ + +private const val THESSALIA_MALE_COMPONENT = 591 +private const val THESSALIA_FEMALE_COMPONENT = 594 +private const val PLAYER_MODEL_CHILD_ID = 59 + +private val legColors = intArrayOf(24, 23, 3, 22, 13, 12, 7, 19, 5, 1, 10, 14, 25, 9, 0, 26, 21, 8, 20, 15, 11, 28, 27, 4, 6, 18, 17, 2, 16) +private val torsoColors = intArrayOf(24, 23, 2, 22, 12, 11, 6, 19, 4, 0, 9, 13, 25, 8, 15, 26, 21, 7, 20, 14, 10, 28, 27, 3, 5, 18, 17, 1, 16) + +private val maleTorsoButtonRange = (185..198) +private val maleArmsButtonRange = (199..210) +private val maleLegsButtonRange = (211..221) +private val maleColorButtonRange = (252..280) + +private val femaleTorsoButtonRange = (186..196) +private val femaleArmsButtonRange = (197..207) +private val femaleLegsButtonRange = (208..222) +private val femaleColorButtonRange = (253..281) + +//Male Torso +private const val M_STRIPED_SWEATER = 111 +private const val M_WOOLLEN_VEST = 113 +private const val M_PRINCELY_VEST = 114 +private const val M_TATTERED_WAISTCOAT = 115 +private const val M_FINE_SHIRT = 21 +private const val M_WAISTCOAT = 116 +private const val M_PLAIN_TOP = 18 +private const val M_LIGHT_BUTTONS = 19 +private const val M_DARK_BUTTONS = 20 +private const val M_JACKET = 112 +private const val M_SHIRT = 24 +private const val M_STITCHING = 23 +private const val M_RAGGED_TOP = 24 +private const val M_TWO_TONED = 25 + +private val maleTorsoIDs = intArrayOf(M_STRIPED_SWEATER, M_WOOLLEN_VEST, M_PRINCELY_VEST, M_TATTERED_WAISTCOAT, M_FINE_SHIRT, M_WAISTCOAT, M_PLAIN_TOP, M_LIGHT_BUTTONS, M_DARK_BUTTONS, M_JACKET, M_SHIRT, M_STITCHING, M_RAGGED_TOP, M_TWO_TONED) + +//Male Sleeves +private const val M_STRIPED_ARMS = 107 +private const val M_PRINCELY_SLEEVES = 108 +private const val M_FINE_CUFFS = 29 +private const val M_WOOLLEN_SLEEVES = 106 +private const val M_RAGGED_ARMS = 110 +private const val M_TATTERED_SLEEVES = 109 +private const val M_LOOSE_SLEEVED = 28 +private const val M_REGULAR = 26 +private const val M_MUSCLEBOUND = 27 +private const val M_LARGE_CUFFED = 105 +private const val M_THIN_SLEEVED = 30 +private const val M_SHOULDER_PADS = 31 + +private val maleSleeveIDs = intArrayOf(M_STRIPED_ARMS, M_PRINCELY_SLEEVES, M_FINE_CUFFS, M_WOOLLEN_SLEEVES, M_RAGGED_ARMS, M_TATTERED_SLEEVES, M_LOOSE_SLEEVED, M_REGULAR, M_MUSCLEBOUND, M_LARGE_CUFFED, M_THIN_SLEEVED, M_SHOULDER_PADS) + +//Male Leg IDs +private const val M_PLAIN_TROUSERS = 36 +private const val M_PRINCELY_BREECHES = 85 +private const val M_SHORTS = 37 +private const val M_RAGGED_BREECHES = 40 +private const val M_TATTERED_BREECHES = 89 +private const val M_TORN_TROUSERS = 90 +private const val M_BREECHES = 86 +private const val M_STRIPED_TROUSERS = 88 +private const val M_TURN_UPS = 39 +private const val M_FLARES = 38 +private const val M_FINE_BREECHES = 87 + +private val maleLegIDs = intArrayOf(M_PLAIN_TROUSERS, M_PRINCELY_BREECHES, M_SHORTS, M_RAGGED_BREECHES, M_TATTERED_BREECHES, M_TORN_TROUSERS, M_BREECHES, M_STRIPED_TROUSERS, M_TURN_UPS, M_FLARES, M_FINE_BREECHES) + +//Female Torso +private const val F_STRIPED_SWEATER = 153 +private const val F_WOOLLEN_VEST = 155 +private const val F_FRILLED_BLOUSE = 156 +private const val F_BODICE = 157 +private const val F_FINE_SHIRT = 154 +private const val F_RAGGED_TOP = 158 +private const val F_PLAIN_TOP = 56 +private const val F_CROP_TOP = 57 +private const val F_SIMPLE = 58 +private const val F_POLO_NECK = 59 +private const val F_TORN = 60 + +private val femaleTopIDs = intArrayOf(F_STRIPED_SWEATER, F_WOOLLEN_VEST, F_FRILLED_BLOUSE, F_BODICE, F_FINE_SHIRT, F_RAGGED_TOP, F_PLAIN_TOP, F_CROP_TOP, F_SIMPLE, F_POLO_NECK, F_TORN) + +//Female Arms +private const val F_STRIPED_ARMS = 149 +private const val F_FRILLED_SLEEVES = 150 +private const val F_FINE_CUFFS = 65 +private const val F_WOOLLEN_ARMS = 148 +private const val F_RAGGED_SLEEVES = 151 +private const val F_TATTERED_SLEEVES = 152 +private const val F_LONG_SLEEVES = 64 +private const val F_SHORT_SLEEVES = 61 +private const val F_MUSCLY = 63 +private const val F_LARGE_CUFFS = 147 +private const val F_BARE_ARMS = 62 + +private val femaleArmIDs = intArrayOf(F_STRIPED_ARMS, F_FRILLED_SLEEVES, F_FINE_CUFFS, F_WOOLLEN_ARMS, F_RAGGED_SLEEVES, F_TATTERED_SLEEVES, F_LONG_SLEEVES, F_SHORT_SLEEVES, F_MUSCLY, F_LARGE_CUFFS, F_BARE_ARMS) + +//Female Legs +private const val F_FINE_SKIRT = 129 +private const val F_FRILLED_SKIRT = 130 +private const val F_LAYERED_SKIRT = 128 +private const val F_LONG_NARROW_SKIRT = 74 +private const val F_RAGGED_SKIRT = 133 +private const val F_TATTERED_SKIRT = 134 +private const val F_SHORT_SKIRT = 71 +private const val F_SASHED_SKIRT = 131 +private const val F_FITTED_SKIRT = 132 +private const val F_TORN_TROUSERS = 75 +private const val F_LONG_SKIRT = 73 +private const val F_TURN_UPS = 76 +private const val F_FLARES = 72 +private const val F_PLAIN_TROUSERS = 70 +private const val F_SHORTS = 77 + +private val femaleLegIDs = intArrayOf(F_FINE_SKIRT, F_FRILLED_SKIRT, F_LAYERED_SKIRT, F_LONG_NARROW_SKIRT, F_RAGGED_SKIRT, F_TATTERED_SKIRT, F_SHORT_SKIRT, F_SASHED_SKIRT, F_FITTED_SKIRT, F_TORN_TROUSERS, F_LONG_SKIRT, F_TURN_UPS, F_FLARES, F_FLARES, F_PLAIN_TROUSERS, F_SHORTS) + +private val COINS = Item(995,1000) + +@Initializable +class ThessaliaInterface : ComponentPlugin(){ + enum class colorType{ + TORSO, + ARMS, + LEGS + } + + override fun open(player: Player?, component: Component?) { + super.open(player, component) + component ?: return + player?.toggleWardrobe(true) + player?.setAttribute("orig-torso",player.appearance.torso.look) + player?.setAttribute("orig-torso-color",player.appearance.torso.color) + player?.setAttribute("orig-arms",player.appearance.arms.look) + player?.setAttribute("orig-arms-color",player.appearance.arms.color) + player?.setAttribute("orig-legs",player.appearance.legs.look) + player?.setAttribute("orig-legs-color",player.appearance.legs.color) + player?.packetDispatch?.sendPlayerOnInterface(component.id, PLAYER_MODEL_CHILD_ID) + + + component.setCloseEvent{pl,_ -> + pl?.toggleWardrobe(false) + pl.attributes.remove("thes-type") + if(!pl.getAttribute("thes-paid",false)){ + pl.appearance.torso.changeLook(pl.getAttribute("orig-torso",0)) + pl.appearance.torso.changeColor(pl.getAttribute("orig-torso-color",0)) + pl.appearance.arms.changeLook(pl.getAttribute("orig-arms",0)) + pl.appearance.arms.changeColor(pl.getAttribute("orig-arms-color",0)) + pl.appearance.legs.changeLook(pl.getAttribute("orig-legs",0)) + pl.appearance.legs.changeColor(pl.getAttribute("orig-legs-color",0)) + pl.appearance.sync() + } + pl.removeAttribute("thes-paid") + true + } + } + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + when(button){ + 181,180 -> pay(player) + else -> when(component?.id){ + THESSALIA_MALE_COMPONENT -> { + when(button){ + 182 -> player.setAttribute("thes-type",colorType.TORSO) + 183 -> player.setAttribute("thes-type",colorType.ARMS) + 184 -> player.setAttribute("thes-type",colorType.LEGS) + } + if(maleArmsButtonRange.contains(button)) updateArms(player,button,true) + if(maleTorsoButtonRange.contains(button)) updateTop(player,button,true) + if(maleLegsButtonRange.contains(button)) updateLegs(player,button,true) + if(maleColorButtonRange.contains(button)) updateColor(player,button,true,player.getAttribute("thes-type",colorType.TORSO)) + } + THESSALIA_FEMALE_COMPONENT -> { + when(button){ + 183 -> player.setAttribute("thes-type",colorType.TORSO) + 184 -> player.setAttribute("thes-type",colorType.ARMS) + 185 -> player.setAttribute("thes-type",colorType.LEGS) + } + if(femaleArmsButtonRange.contains(button)) updateArms(player,button,false) + if(femaleTorsoButtonRange.contains(button)) updateTop(player,button,false) + if(femaleLegsButtonRange.contains(button)) updateLegs(player,button,false) + if(femaleColorButtonRange.contains(button)) updateColor(player,button,false,player.getAttribute("thes-type",colorType.TORSO)) + } + } + } + return true + } + + fun pay(player: Player){ + if(player.inventory.containsItem(COINS)){ + player.inventory.remove(COINS) + player.setAttribute("thes-paid",true) + player.interfaceManager.close() + } else { + player.dialogueInterpreter.sendDialogue("You can not afford that.") + } + } + + fun updateTop(player: Player,button: Int,male: Boolean){ + val usedArray = if(male) maleTorsoIDs else femaleTopIDs + val subtractor = if(male) maleTorsoButtonRange.first else femaleTorsoButtonRange.first + player.appearance.torso.changeLook(usedArray[button - subtractor]) + player.appearance.sync() + } + + fun updateLegs(player: Player, button: Int, male: Boolean){ + val usedArray = if(male) maleLegIDs else femaleLegIDs + val subtractor = if(male) maleLegsButtonRange.first else femaleLegsButtonRange.first + player.appearance.legs.changeLook(usedArray[button - subtractor]) + player.appearance.sync() + } + + fun updateArms(player: Player, button: Int, male: Boolean){ + val usedArray = if(male) maleSleeveIDs else femaleArmIDs + val subtractor = if(male) maleArmsButtonRange.first else femaleArmsButtonRange.first + player.appearance.arms.changeLook(usedArray[button - subtractor]) + player.appearance.sync() + } + + fun updateColor(player: Player, button: Int, male: Boolean, type: colorType){ + val subtractor = if(male) maleColorButtonRange.first else femaleColorButtonRange.first + when(type){ + colorType.ARMS -> player.appearance.torso.changeColor(torsoColors[button - subtractor]) + colorType.LEGS -> player.appearance.legs.changeColor(legColors[button - subtractor]) + colorType.TORSO -> player.appearance.torso.changeColor(torsoColors[button - subtractor]) + } + player.appearance.sync() + } + + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(THESSALIA_MALE_COMPONENT,this) + ComponentDefinition.put(THESSALIA_FEMALE_COMPONENT,this) + return this + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/inter/TradeInterfacePlugin.java b/Server/src/main/java/Server/core/game/interaction/inter/TradeInterfacePlugin.java new file mode 100644 index 000000000..8d9a8d65d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/TradeInterfacePlugin.java @@ -0,0 +1,119 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.entity.player.link.request.trade.TradeModule; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the interface plugin used to handle all trade related functions. + * @author 'Vexia + */ +@Initializable +public final class TradeInterfacePlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(334, this); + ComponentDefinition.put(335, this); + ComponentDefinition.put(336, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, final int slot, int itemId) { + final TradeModule module = TradeModule.getExtension(player); + if (module == null) { + return true; + } + switch (component.getId()) { + case 334:// second accept screen + switch (button) { + case 20:// acept + module.setAccepted(true, true); + break; + case 21:// decline + module.decline(); + break; + } + break; + case 335:// main accept interface + switch (opcode) { + case 155: + switch (button) { + case 16:// accept + module.setAccepted(true, true); + break; + case 18:// decline + module.decline(); + break; + case 30:// withdraw one + module.getContainer().withdraw(slot, 1); + break; + } + break; + case 196: + module.getContainer().withdraw(slot, 5); + break; + case 124: + module.getContainer().withdraw(slot, 10); + break; + case 199: + module.getContainer().withdraw(slot, module.getContainer().getAmount(module.getContainer().get(slot))); + break; + case 234: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + module.getContainer().withdraw(slot, (int) getValue()); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + break; + case 9:// examine. + if (TradeModule.getExtension(button == 32 ? module.getTarget() : player) == null) { + return true; + } + player.getPacketDispatch().sendMessage(TradeModule.getExtension(button == 32 ? module.getTarget() : player).getContainer().get(slot).getDefinition().getExamine()); + break; + } + break; + case 336:// overlay interface + switch (opcode) { + case 155: + module.getContainer().offer(slot, 1); + break; + case 196: + module.getContainer().offer(slot, 5); + break; + case 124: + module.getContainer().offer(slot, 10); + break; + case 199: + module.getContainer().offer(slot, player.getInventory().getAmount(player.getInventory().get(slot))); + break; + case 234: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + module.getContainer().offer(slot, (int) getValue()); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + break; + case 9: + player.getPacketDispatch().sendMessage(player.getInventory().get(slot).getDefinition().getExamine()); + break; + } + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/inter/WorldMapInterface.java b/Server/src/main/java/Server/core/game/interaction/inter/WorldMapInterface.java new file mode 100644 index 000000000..eed52ad10 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/inter/WorldMapInterface.java @@ -0,0 +1,39 @@ +package core.game.interaction.inter; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the world map interface. + * @author Emperor + * + */ +@Initializable +public final class WorldMapInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(755).setPlugin(this); + return this; + } + + //Thanks snicker! + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 3: + player.getInterfaceManager().openWindowsPane(new Component(player.getInterfaceManager().isResizable() ? 746 : 548), 2); + player.getPacketDispatch().sendRunScript(1187, "ii", 0, 0); + player.updateSceneGraph(true); + return true; + default: + //SystemLogger.logErr("World map: buttonid: " + button + ", opcode: " + opcode + ", slot: " + slot); + return true; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/BirdNestPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/BirdNestPlugin.java new file mode 100644 index 000000000..19b2a3cf9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/BirdNestPlugin.java @@ -0,0 +1,37 @@ +package core.game.interaction.item; + +import core.game.content.global.BirdNest; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the searching of a bird nest item. + * @author Vexia + */ +@Initializable +public final class BirdNestPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (BirdNest nest : BirdNest.values()) { + nest.getNest().getDefinition().getHandlers().put("option:search", this); + } + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Item item = (Item) node; + BirdNest.forNest(item).search(player, item); + return true; + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/BookreadOption.java b/Server/src/main/java/Server/core/game/interaction/item/BookreadOption.java new file mode 100644 index 000000000..b0fc69cfb --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/BookreadOption.java @@ -0,0 +1,66 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the "read" option of a book. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class BookreadOption extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(292).getHandlers().put("option:read", this); + ItemDefinition.forId(757).getHandlers().put("option:read", this); + ItemDefinition.forId(1856).getHandlers().put("option:read", this); + ItemDefinition.forId(9003).getHandlers().put("option:read", this); + ItemDefinition.forId(9004).getHandlers().put("option:read", this); + ItemDefinition.forId(11710).getHandlers().put("option:read", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = getDialId(((Item) node).getId()); + player.getInterfaceManager().close(); + return player.getDialogueInterpreter().open(id, node); + } + + @Override + public boolean isWalk() { + return false; + } + + /** + * Gets the dialogue id from the item id. + * + * @param item the item. + * @return the dial id. + */ + public int getDialId(int item) { + switch (item) { + case 757: + return 49610758; + case 9003: + return 49610759; + /*case 9004: + return 423943;*/ + case 11710: + return 2739823; + case 292: + return 183764; + case 1856: + return 387454; + } + return -1; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/BraceletOfClayPlugin.kt b/Server/src/main/java/Server/core/game/interaction/item/BraceletOfClayPlugin.kt new file mode 100644 index 000000000..ff36ba8f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/BraceletOfClayPlugin.kt @@ -0,0 +1,32 @@ +package core.game.interaction.item + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * Handles the bracelet of clay operate option. + * @author Ceikry + */ +@Initializable +class BraceletOfClayPlugin : OptionHandler() { + + override fun newInstance(arg: Any?): Plugin? { + ItemDefinition.forId(11074).handlers["option:operate"] = this + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + var charge = node.asItem().charge + if (charge > 28) charge = 28 + player.sendMessage("You have $charge uses left.") + return true + } + + override fun isWalk(): Boolean { + return false + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/item/CasketPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/CasketPlugin.java new file mode 100644 index 000000000..1b6d077c5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/CasketPlugin.java @@ -0,0 +1,65 @@ +package core.game.interaction.item; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +/** + * Represents the casket handling plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CasketPlugin extends OptionHandler { + + /** + * Represents the casket rewards. + */ + private static final ChanceItem[] CASKET_REWARD = new ChanceItem[] { new ChanceItem(995, 8, 3000, 30), new ChanceItem(1623, 1, 30), new ChanceItem(1621, 1, 70), new ChanceItem(1619, 1, 70), new ChanceItem(1617, 1, 97), new ChanceItem(987, 1, 97), new ChanceItem(985, 1, 97), new ChanceItem(1454, 1, 30), new ChanceItem(1452, 1, 70), new ChanceItem(1462, 1, 97) }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(405).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final ChanceItem reward = getChanceItem(CASKET_REWARD); + player.getInventory().remove((Item) node); + player.getDialogueInterpreter().sendItemMessage(reward, "You open the casket. Inside you find " + (reward.getAmount() > 1 ? "some" : (StringUtils.isPlusN(reward.getName()) ? "an" : "a")) + " " + reward.getName().toLowerCase() + "."); + player.getInventory().add(reward.getAmount() == 1 ? reward : new Item(reward.getId(), RandomFunction.random(reward.getMinimumAmount(), reward.getMaximumAmount()))); + return true; + } + + /** + * Gets the chance item from the array. + * @param items the items. + * @return the chance item. + */ + private ChanceItem getChanceItem(ChanceItem[] items) { + final int chance = RandomFunction.random(100); + final List chances = new ArrayList<>(); + for (ChanceItem c : items) { + if (chance > c.getChanceRate()) { + chances.add(c); + } + } + return chances.size() == 0 ? items[0] : chances.get(RandomFunction.random(chances.size())); + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/ConsumableOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/ConsumableOptionPlugin.java new file mode 100644 index 000000000..577874124 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/ConsumableOptionPlugin.java @@ -0,0 +1,65 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.consumable.*; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to consume a consumable item. + * @author 'Vexia + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class ConsumableOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("eat", this); + ItemDefinition.setOptionHandler("drink", this); + return this; + } + + /** + * The last item that was recently eaten. + * Used for Karambwan "1-ticking" + */ + int lastEaten = -1; + + @Override + public boolean handle(final Player player, final Node node, final String option) { + if (player.getLocks().isLocked(option)) { + return true; + } + boolean food = option.equals("eat"); + if(node.asItem().getId() != 3144 || (node.asItem().getId() == 3144 && lastEaten == 3144)){ + player.getLocks().lock(option, 3); + } + if (!food) { + player.getLocks().lock("eat", 2); + } + Item item = (Item) node; + if (player.getInventory().get(item.getSlot()) != item) { + return false; + } + Consumable consumable = Consumables.getConsumableById(item.getId()); + if (consumable instanceof Potion) { + consumable.consume((Item) node, player); + return true; + } + if (consumable == null) { + return false; + } + consumable.consume(((Item) node), player); + if (food) { + player.getProperties().getCombatPulse().delayNextAttack(3); + } + lastEaten = node.asItem().getId(); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/DiangoItemPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/DiangoItemPlugin.java new file mode 100644 index 000000000..5a570c886 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/DiangoItemPlugin.java @@ -0,0 +1,69 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the diano item plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DiangoItemPlugin extends OptionHandler { + + /** + * Represents the animations. + */ + private static final Animation[] ANIMATIONS = new Animation[] { new Animation(8990), new Animation(1902), new Animation(1904) }; + + @Override + public boolean handle(final Player player, Node node, String option) { + switch (option) { + case "fly": + player.animate(ANIMATIONS[0]); + break; + case "spin": + player.animate(ANIMATIONS[1]); + player.getPulseManager().run(new Pulse(1) { + int count = 0; + + @Override + public boolean pulse() { + if (count++ >= 9) { + player.animate(ANIMATIONS[2]); + return true; + } + return false; + } + + @Override + public void stop() { + super.stop(); + player.animate(ANIMATIONS[2]); + } + + }); + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("fly", this); + ItemDefinition.setOptionHandler("spin", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/DragonfireShieldPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/DragonfireShieldPlugin.java new file mode 100644 index 000000000..1121ce5a4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/DragonfireShieldPlugin.java @@ -0,0 +1,138 @@ +package core.game.interaction.item; + +import java.util.concurrent.TimeUnit; + +import core.cache.def.impl.ItemDefinition; +import core.game.container.impl.EquipmentContainer; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatPulse; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.DragonfireSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.item.ItemPlugin; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the dragonfire shield options. + * @author Emperor + */ +@Initializable +public final class DragonfireShieldPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(11283).getHandlers().put("option:empty", this); + ItemDefinition.forId(11283).getHandlers().put("option:inspect", this); + ItemDefinition.forId(11283).getHandlers().put("option:operate", this); + ItemDefinition.forId(11284).getHandlers().put("option:inspect", this); + ItemDefinition.forId(11284).getHandlers().put("option:operate", this); + PluginManager.definePlugin(new DFSItemPlugin()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Item item = (Item) node; + switch (option) { + case "operate": + boolean usingAttack = !player.getAttribute("dfs_spec", false); + if (!usingAttack) { + if (!player.getSettings().isSpecialToggled()) { + player.getConfigManager().set(301, 0); + } + player.removeAttribute("dfs_spec"); + player.getProperties().getCombatPulse().setTemporaryHandler(null); + return true; + } + boolean notCharged = item.getId() == 11284 || item.getCharge() < 20; + if (player.getSavedData().getGlobalData().getOverChargeDelay() <= System.currentTimeMillis()) { + item.setCharge(1020); + player.sendMessage("You use the power from the overcharge lords & charge your shield."); + notCharged = false; + player.getSavedData().getGlobalData().setOverChargeDelay(System.currentTimeMillis() + (GameWorld.getSettings().isDevMode() ? TimeUnit.SECONDS.toMillis(10) : TimeUnit.MINUTES.toMicros(10))); + } + if (notCharged) { + player.getPacketDispatch().sendMessage("Your shield has no charges left."); + return true; + } + if (player.getLocks().isLocked("dfs_recharge")) { + player.getPacketDispatch().sendMessage("Your dragonfire shield is recharging."); + return true; + } + player.getConfigManager().set(301, 1); + player.setAttribute("dfs_spec", true); + SwitchAttack attack = new SwitchAttack(null, Animation.create(6696), Graphics.create(1165), new Graphics(1167, 96), Projectile.create(player, null, 1166, 36, 36, 80, 70, 0, 11)); + DragonfireSwingHandler handler = new DragonfireSwingHandler(false, 26, attack, true) { + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (entity instanceof Player) { + Player player = (Player) entity; + if (!player.getSettings().isSpecialToggled()) { + player.getConfigManager().set(301, 0); + } + player.removeAttribute("dfs_spec"); + Item shield = player.getEquipment().get(EquipmentContainer.SLOT_SHIELD); + if (shield == null || shield.getId() != 11283) { + return -1; + } + shield.setCharge(shield.getCharge() - 20); + if (shield.getCharge() < 1) { + player.getEquipment().replace(new Item(11284), EquipmentContainer.SLOT_SHIELD); + } + EquipmentContainer.updateBonuses(player); + player.getLocks().lock("dfs_recharge",50); + } + return super.swing(entity, victim, state); + } + }; + attack.setHandler(handler); + Entity victim = player.getProperties().getCombatPulse().getVictim(); + if (player.getProperties().getCombatPulse().isAttacking() && handler.canSwing(player, victim) == InteractionType.STILL_INTERACT) { + CombatPulse.Companion.swing(player, victim, handler); + return true; + } + player.getProperties().getCombatPulse().setTemporaryHandler(handler); + return true; + case "empty": + player.getInventory().replace(new Item(11284), item.getSlot()); + player.graphics(Graphics.create(1160)); + player.getPacketDispatch().sendMessage("You release the charges."); + return true; + case "inspect": + if (item.getId() == 11284) { + player.getPacketDispatch().sendMessage("The shield has no charges."); + return true; + } + player.getPacketDispatch().sendMessage("The shield has " + (item.getCharge() / 20) + " charges."); + return true; + } + return false; + } + + public class DFSItemPlugin extends ItemPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + register(11283); + return this; + } + + @Override + public Item getDeathItem(Item item) { + return new Item(11284); + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/DustHandPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/DustHandPlugin.java new file mode 100644 index 000000000..4c414cb61 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/DustHandPlugin.java @@ -0,0 +1,42 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to dust your hands. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DustHandPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(8865).getHandlers().put("option:dust-hands", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "dust-hands": + if (player.getInventory().remove((Item) node)) { + player.getPacketDispatch().sendMessage("You dust your hands with the finely ground ash."); + player.setAttribute("hand_dust", true); + } + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/EmptyOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/EmptyOptionPlugin.java new file mode 100644 index 000000000..a31bd7543 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/EmptyOptionPlugin.java @@ -0,0 +1,91 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.util.HashMap; + +/** + * Handles items with "empty" options + * @author ceik + */ +@Initializable +public final class EmptyOptionPlugin extends OptionHandler { + public static final int BUCKET = 1925; + public static final int VIAL = 229; + public static final String BUCKET_EMPTY_MSG = "You empty the contents of the bucket onto the floor."; + @Override + public boolean handle(Player player, Node node, String option) { + if (node.getName().contains("potion")) { + player.getInventory().remove(node.asItem()); + player.getInventory().add(EmptyItem.getEmpty(91)); + return true; + } + if(EmptyItem.emptyItemMap.get(node.getId()) != null){ + player.getInventory().remove(node.asItem()); + player.getInventory().add(EmptyItem.getEmpty(node.getId())); + player.getPacketDispatch().sendMessage(EmptyItem.getEmptyMessage(node.getId())); + } else { + player.debug("Unhandled empty option! ITEM ID: " + node.getId()); + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("empty", this); + ItemDefinition.setOptionHandler("empty dish", this); + return this; + } + public enum EmptyItem{ + POT_OF_FLOUR(1933, 1931, "You empty the contents of the pot onto the floor."), + BONE_MEAL(4255, 1931, "You empty the pot of crushed bones."), + BUCKET_OF_SAND(1783, BUCKET, BUCKET_EMPTY_MSG), + BUCKET_OF_MILK(1927, BUCKET, BUCKET_EMPTY_MSG), + BUCKET_OF_WATER(1929, BUCKET, BUCKET_EMPTY_MSG), + BUCKET_OF_COMPOST(6032, BUCKET, "You empty the bucket of compost."), + BUCKET_OF_SUPERCOMPOST(6034, BUCKET, "You empty the bucket of supercompost."), + BUCKET_OF_SLIME(4286, BUCKET, "You empty the contents of the bucket on the floor."), + VIAL_OF_WATER(227, VIAL, "You empty the vial."), + BOWL_OF_SAND(1921, 1923, "You empty the contents of the bowl onto the floor."), + JUG_OF_WATER(1937, 1935, "You empty the contents of the jug onto the floor."), + BURNT_PIE(2329, 2313, "You empty the pie dish."), + POTION(91, VIAL,null); + + int fullId, emptyId; + String emptyMessage; + EmptyItem(int fullId, int emptyId, String emptyMessage){ + this.fullId = fullId; + this.emptyId = emptyId; + this.emptyMessage = emptyMessage; + } + + public static HashMap emptyItemMap = new HashMap<>(); + public static HashMap emptyMessageMap = new HashMap<>(); + + static{ + for(EmptyItem item : EmptyItem.values()){ + emptyItemMap.putIfAbsent(item.fullId,item.emptyId); + emptyMessageMap.putIfAbsent(item.fullId,item.emptyMessage); + } + } + + public static Item getEmpty(int id){ + return new Item(emptyItemMap.get(id)); + } + + public static String getEmptyMessage(int id){ + return emptyMessageMap.get(id); + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/EnchantJewelleryTabOption.kt b/Server/src/main/java/Server/core/game/interaction/item/EnchantJewelleryTabOption.kt new file mode 100644 index 000000000..0b533e0e3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/EnchantJewelleryTabOption.kt @@ -0,0 +1,97 @@ +package core.game.interaction.item + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch + +private val LVL_1_ENCHANT = hashMapOf( + Items.SAPPHIRE_RING_1637 to Item(Items.RING_OF_RECOIL_2550), + Items.SAPPHIRE_NECKLACE_1656 to Item(Items.GAMES_NECKLACE8_3853), + Items.SAPPHIRE_AMULET_1694 to Item(Items.AMULET_OF_MAGIC_1727), + Items.SAPPHIRE_BRACELET_11072 to Item(Items.BRACELET_OF_CLAY_11074) +) +private val LVL_2_ENCHANT = hashMapOf( + Items.EMERALD_RING_1639 to Item(Items.RING_OF_DUELLING8_2552), + Items.EMERALD_NECKLACE_1658 to Item(Items.BINDING_NECKLACE_5521), + Items.EMERALD_AMULET_1696 to Item(Items.AMULET_OF_DEFENCE_1729), + Items.EMERALD_BRACELET_11076 to Item(Items.CASTLEWAR_BRACE3_11079) +) + +private val LVL_3_ENCHANT = hashMapOf( + Items.RUBY_RING_1641 to Item(Items.RING_OF_FORGING_2568), + Items.RUBY_NECKLACE_1660 to Item(Items.DIGSITE_PENDANT_5_11194), + Items.RUBY_AMULET_1698 to Item(Items.AMULET_OF_STRENGTH_1725), + Items.RUBY_BRACELET_11085 to Item(Items.INOCULATION_BRACE_11088) +) + +private val LVL_4_ENCHANT = hashMapOf( + Items.DIAMOND_RING_1643 to Item(Items.RING_OF_LIFE_2570), + Items.DIAMOND_NECKLACE_1662 to Item(Items.PHOENIX_NECKLACE_11090), + Items.DIAMOND_AMULET_1700 to Item(Items.AMULET_OF_POWER_1731), + Items.DIAMOND_BRACELET_11092 to Item(Items.FORINTHRY_BRACE5_11095) +) + +private val LVL_5_ENCHANT = hashMapOf( + Items.DRAGONSTONE_RING_1645 to Item(14646), + Items.DRAGON_NECKLACE_1664 to Item(Items.SKILLS_NECKLACE4_11105), + Items.DRAGONSTONE_AMMY_1702 to Item(Items.AMULET_OF_GLORY4_1712), + Items.DRAGON_BRACELET_11115 to Item(Items.COMBAT_BRACELET4_11118) +) + + +@Initializable +class EnchantJewelleryTabOption : OptionHandler(){ + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + + val items = when(node?.id){ + 8016 -> LVL_1_ENCHANT //Sapphire + 8017 -> LVL_2_ENCHANT + 8018 -> LVL_3_ENCHANT + 8019 -> LVL_4_ENCHANT + 8020 -> LVL_5_ENCHANT + else -> null + } + + if(items == null){ + SystemLogger.logWarn("UNHANDLED ENCHANT ITEM TABLET [ID: ${node?.id}") + return true + } + + player.audioManager.send(979) + player.animator.forceAnimation(Animation(4069)) + + GlobalScope.launch { + for(item in player.inventory.toArray()){ + item ?: continue + if(items.containsKey(item.id)){ + val product = items[item.id] + player.inventory.remove(item) + player.inventory.remove(node as Item) + player.inventory.add(product) + break; + } + } + } + return true + } + + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.forId(8016).handlers["option:break"] = this + ItemDefinition.forId(8017).handlers["option:break"] = this + ItemDefinition.forId(8018).handlers["option:break"] = this + ItemDefinition.forId(8019).handlers["option:break"] = this + ItemDefinition.forId(8020).handlers["option:break"] = this + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/item/EnchantedGemPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/EnchantedGemPlugin.java new file mode 100644 index 000000000..8f24cc0b5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/EnchantedGemPlugin.java @@ -0,0 +1,118 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.EnchantedJewellery; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle enchanted jewellery transportation. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EnchantedGemPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(4155).getHandlers().put("option:check", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.sendMessage("You're assigned to kill " + NPCDefinition.forId((player.getSlayer().getTask().getNpcs()[0])).getName().toLowerCase() + "s; only " + player.getSlayer().getAmount() + " more to go."); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + /** + * Represents the jewellery dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ + public final class JewelleryDialogue extends DialoguePlugin { + + /** + * Represents the id to use. + */ + public static final int ID = 329128389; + + /** + * Represents the enchanted jewellery. + */ + private EnchantedJewellery jewellery; + + /** + * If the operate option is used. + */ + private boolean operate; + + /** + * Represents the item instance. + */ + private Item item; + + /** + * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. + */ + public JewelleryDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. + * @param player the player. + */ + public JewelleryDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JewelleryDialogue(player); + } + + @Override + public boolean open(Object... args) { + item = (Item) args[0]; + jewellery = (EnchantedJewellery) args[1]; + operate = args.length > 2 && (Boolean) args[2]; + if (jewellery == EnchantedJewellery.DIGSITE_PENDANT) { + jewellery.use(player, item, 0, operate); + return true; + } + interpreter.sendOptions("Where would you like to go?", jewellery.getOptions()); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getInterfaceManager().isOpened()) { + end(); + return true; + } + end(); + jewellery.use(player, item, (buttonId - 1), operate); + return true; + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/EnchantedJewelleryPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/EnchantedJewelleryPlugin.java new file mode 100644 index 000000000..6fe589f23 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/EnchantedJewelleryPlugin.java @@ -0,0 +1,131 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.EnchantedJewellery; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle enchanted jewellery transportation. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EnchantedJewelleryPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + + new JewelleryDialogue().init(); + for (EnchantedJewellery jewellery : EnchantedJewellery.values()) { + for (int id : jewellery.getIds()) { + ItemDefinition.forId(id).getHandlers().put("option:rub", this); + ItemDefinition.forId(id).getHandlers().put("option:operate", this); + } + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final EnchantedJewellery jewellery = EnchantedJewellery.forItem((Item) node); + if (jewellery.isLast(jewellery.getItemIndex((Item) node))) { + player.getPacketDispatch().sendMessage("The " + jewellery.getNameType((Item) node) + " has lost its charge."); + player.getPacketDispatch().sendMessage("It will need to be recharged before you can use it again."); + return true; + } + player.getPacketDispatch().sendMessage("You rub the " + jewellery.getNameType((Item) node) + "..."); + player.getDialogueInterpreter().open(JewelleryDialogue.ID, node, jewellery, option.equals("operate")); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + /** + * Represents the jewellery dialogue plugin. + * @author 'Vexia + * @version 1.0 + */ + public final class JewelleryDialogue extends DialoguePlugin { + + /** + * Represents the id to use. + */ + public static final int ID = 329128389; + + /** + * Represents the enchanted jewellery. + */ + private EnchantedJewellery jewellery; + + /** + * If the operate option is used. + */ + private boolean operate; + + /** + * Represents the item instance. + */ + private Item item; + + /** + * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. + */ + public JewelleryDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EnchantedJewelleryPlugin} {@code Object}. + * @param player the player. + */ + public JewelleryDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new JewelleryDialogue(player); + } + + @Override + public boolean open(Object... args) { + item = (Item) args[0]; + jewellery = (EnchantedJewellery) args[1]; + operate = args.length > 2 && (Boolean) args[2]; + if (jewellery == EnchantedJewellery.DIGSITE_PENDANT) { + jewellery.use(player, item, 0, operate); + return true; + } + interpreter.sendOptions("Where would you like to go?", jewellery.getOptions()); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getInterfaceManager().isOpened()) { + end(); + return true; + } + end(); + jewellery.use(player, item, (buttonId - 1), operate); + return true; + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/ExplorersRingPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/ExplorersRingPlugin.java new file mode 100644 index 000000000..37aeed5b3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/ExplorersRingPlugin.java @@ -0,0 +1,106 @@ +package core.game.interaction.item; + +import core.Util; +import core.cache.def.impl.ItemDefinition; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Handles the explorers ring. + * + * @author Vexia + */ +@Initializable +public class ExplorersRingPlugin extends OptionHandler { + + /** + * The cabbage port location. + */ + private static final Location CABBAGE_PORT = Location.create(3051, 3291, 0); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(13560).getHandlers().put("option:run-replenish", this); + ItemDefinition.forId(13561).getHandlers().put("option:run-replenish", this); + ItemDefinition.forId(13562).getHandlers().put("option:run-replenish", this); + + ItemDefinition.forId(13561).getHandlers().put("option:low-alchemy", this); + ItemDefinition.forId(13562).getHandlers().put("option:low-alchemy", this); + + ItemDefinition.forId(13562).getHandlers().put("option:cabbage-port", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Item item = node.asItem(); + int level = getLevel(item.getId()); + + switch (option) { + case "run-replenish": + if (player.getSavedData().getGlobalData().getRunReplenishDelay() < System.currentTimeMillis()) { + player.getSavedData().getGlobalData().setRunReplenishCharges(0); + player.getSavedData().getGlobalData().setRunReplenishDelay(Util.nextMidnight(System.currentTimeMillis())); + } + int charges = player.getSavedData().getGlobalData().getRunReplenishCharges(); + if (charges >= level) { + player.sendMessage("You have used all the charges you can for one day."); + return true; + } + player.getSettings().updateRunEnergy(-50); + player.getSavedData().getGlobalData().setRunReplenishCharges(charges + 1); + player.sendMessage("You feel refreshed as the ring revitalises you and a charge is used up."); + player.visualize(new Animation(9988), new Graphics(1733)); + break; + case "low-alchemy": + if (player.getSkills().getStaticLevel(Skills.MAGIC) < 21) { + player.sendMessage("You need a Magic level of 21 in order to do that."); + break; + } + if (player.getSavedData().getGlobalData().getLowAlchemyDelay() < System.currentTimeMillis()) { + player.getSavedData().getGlobalData().setLowAlchemyCharges(0); + player.getSavedData().getGlobalData().setLowAlchemyDelay(Util.nextMidnight(System.currentTimeMillis())); + } + if (player.getSavedData().getGlobalData().getLowAlchemyCharges() <= 0 + && player.getSavedData().getGlobalData().getLowAlchemyDelay() > System.currentTimeMillis()) { + player.sendMessage("You have used all the charges you can for one day."); + return true; + } + player.sendMessage("You grant yourself with 30 free low alchemy charges."); // todo this implementation is not correct, see https://www.youtube.com/watch?v=UbUIF2Kw_Dw + player.getSavedData().getGlobalData().setLowAlchemyCharges(30); + break; + case "cabbage-port": + player.getTeleporter().send(CABBAGE_PORT, TeleportType.CABBAGE); + break; + } + return true; + } + + /** + * Gets the level of the ring. + * + * @param itemId The item id. + * @return The level. + */ + private int getLevel(int itemId) { + switch (itemId) { + case 13560: + return 1; + case 13561: + return 2; + case 13562: + return 3; + } + return -1; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/FaladorShieldPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/FaladorShieldPlugin.java new file mode 100644 index 000000000..11d47b7c8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/FaladorShieldPlugin.java @@ -0,0 +1,105 @@ +package core.game.interaction.item; + +import java.util.concurrent.TimeUnit; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.Entity; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.game.content.consumable.effects.PrayerEffect; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Falador Shields. + * @author afaroutdude + * + */ +@Initializable +public class FaladorShieldPlugin extends OptionHandler { + final static int ANIM_EMOTE = 11012; + final static int[] GFX_EMOTE = {1966,1965,1965}; + final static int[] GFX_PRAYER_RESTORE = {1962,1963,1964}; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(14577).getHandlers().put("option:operate",this); + ItemDefinition.forId(14578).getHandlers().put("option:operate",this); + ItemDefinition.forId(14579).getHandlers().put("option:operate",this); + + ItemDefinition.forId(14577).getHandlers().put("option:prayer-restore",this); + ItemDefinition.forId(14578).getHandlers().put("option:prayer-restore",this); + ItemDefinition.forId(14579).getHandlers().put("option:prayer-restore",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Item item = (Item) node; + int level = getLevel(item.getId()); + switch (option) { + case "prayer-restore": + Long attrTime = player.getAttribute("diary:falador:shield-restore-time"); + if (attrTime != null && attrTime > System.currentTimeMillis()) { + player.sendMessage("You have no charges left today."); + } else { + // TODO should ask if sure you with to recharge, see https://www.youtube.com/watch?v=ZW9k1922Ggk interpreter.sendOptions("Are you sure you wish to recharge?"); + final PrayerEffect effect = new PrayerEffect(0, level == 0 ? 0.25 : level == 1 ? 0.5 : 1.0); + effect.activate(player); + player.graphics(new Graphics(GFX_PRAYER_RESTORE[level])); + player.setAttribute("/save:diary:falador:shield-restore-time", System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)); + player.sendMessage("You restore " + (level < 2 ? "some" : "your") + " prayer points."); + } + return true; + case "operate": + GameWorld.getPulser().submit(getPulse(player, level)); + break; + } + return true; + } + + /** + * Gets the level of the falador shield. + * @param itemId The item id. + * @return The level. + */ + private int getLevel(int itemId) { + switch (itemId) { + case 14577: + return 0; + case 14578: + return 1; + case 14579: + return 2; + } + return -1; + } + + private Pulse getPulse(final Entity entity, final int level) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + entity.lock(); + entity.animate(new Animation(ANIM_EMOTE)); + entity.graphics(new Graphics(GFX_EMOTE[level])); + } else if (delay == 3) { + entity.getAnimator().forceAnimation(Animation.RESET); + entity.unlock(); + return true; + } + delay++; + return false; + } + }; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/FishbowlPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/FishbowlPlugin.java new file mode 100644 index 000000000..aaf5ec665 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/FishbowlPlugin.java @@ -0,0 +1,292 @@ +package core.game.interaction.item; + +import core.Util; +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.tools.Items; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.item.WeightedChanceItem; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; + +// Sources: +// https://www.youtube.com/watch?v=xu7Err9YUgw +// https://www.youtube.com/watch?v=7XSVFKnUM9Y&t=683s +// https://2007rshelp.com/misc.php?id=3#7 +// https://oldschool2009scape.fandom.com/wiki/Fishbowl_(pet) + +@Initializable +public class FishbowlPlugin extends OptionHandler { + private final static int FISHBOWL_EMPTY = Items.FISHBOWL_6667; + private final static int FISHBOWL_WATER = Items.FISHBOWL_6668; + private final static int FISHBOWL_SEAWEED = Items.FISHBOWL_6669; + + private final static int FISHBOWL_BLUE = Items.FISHBOWL_6670; + private final static int FISHBOWL_GREEN = Items.FISHBOWL_6671; + private final static int FISHBOWL_SPINE = Items.FISHBOWL_6672; + + private final static int TINY_NET = Items.TINY_NET_6674; + + private final static Animation ANIM_TALK = new Animation(2782); + private final static Animation ANIM_PLAY = new Animation(2780); + private final static Animation ANIM_FEED = new Animation(2781); + + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(FISHBOWL_WATER).getHandlers().put("option:empty", this); + ItemDefinition.forId(FISHBOWL_SEAWEED).getHandlers().put("option:empty", this); + for (int id : new int[] {FISHBOWL_BLUE, FISHBOWL_GREEN, FISHBOWL_SPINE}) { + ItemDefinition def = ItemDefinition.forId(id); + def.getHandlers().put("option:talk-at", this); + def.getHandlers().put("option:play-with", this); + def.getHandlers().put("option:feed", this); + def.getHandlers().put("option:drop", this); + } + PluginManager.definePlugin(new FishbowlDialogue()); + PluginManager.definePlugin(new FeedPetFishHandler()); + new AquariumPlugin().newInstance(arg); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (node instanceof Item) { + Item item = node.asItem(); + switch (item.getId()) { + case FISHBOWL_WATER: + case FISHBOWL_SEAWEED: + if (player.getInventory().remove(item)) { + player.lock(2); + player.getInventory().add(new Item(FISHBOWL_EMPTY)); + player.getPacketDispatch().sendMessage("You empty the contents of the fishbowl onto the ground."); + } + break; + case FISHBOWL_BLUE: + case FISHBOWL_GREEN: + case FISHBOWL_SPINE: + switch (option) { + case "talk-at": + player.lock(ANIM_TALK.getDuration()); + player.animate(ANIM_TALK); + return player.getDialogueInterpreter().open("fishbowl-options", option); + case "play-with": + player.lock(ANIM_PLAY.getDuration()); + player.animate(ANIM_PLAY); + return player.getDialogueInterpreter().open("fishbowl-options", option); + case "feed": + return player.getDialogueInterpreter().open("fishbowl-options", option); + case "drop": + return player.getDialogueInterpreter().open("fishbowl-options", option, item); + } + break; + } + } + + return true; + } + + private final class FeedPetFishHandler extends UseWithHandler { + public FeedPetFishHandler() { + super(Items.FISH_FOOD_272); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(FISHBOWL_BLUE, ITEM_TYPE, this); + addHandler(FISHBOWL_GREEN, ITEM_TYPE, this); + addHandler(FISHBOWL_SPINE, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + return event.getPlayer().getDialogueInterpreter().open("fishbowl-options", "feed"); + } + } + + public final class FishbowlDialogue extends DialoguePlugin { + private Item fishbowl; + private String option; + + public FishbowlDialogue() {} + + public FishbowlDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FishbowlDialogue(player); + } + + @Override + public boolean open(Object... args) { + for (Object arg : args) { + if (arg instanceof Item) { + this.fishbowl = (Item) arg; + } else if (arg instanceof String) { + this.option = (String) arg; + } + } + switch (option) { + case "talk-at": + player("Good fish. Just keep swimming... swimming... swimming..."); + stage = 1; + break; + case "play-with": + player("Jump! 'Cmon " + (player.isMale() ? "girl": "boy") + ", jump!"); + stage = 2; + break; + case "feed": + if (player.getInventory().containsAtLeastOneItem(Items.FISH_FOOD_272) && player.getInventory().remove(new Item(Items.FISH_FOOD_272))) { + player.getInventory().add(new Item(Items.AN_EMPTY_BOX_6675)); + player.lock(ANIM_FEED.getDuration()); + player.animate(ANIM_FEED); + player.getPacketDispatch().sendMessage("You feed your fish."); + } else if (player.getInventory().containsAtLeastOneItem(Items.POISONED_FISH_FOOD_274)) { + player.getPacketDispatch().sendMessage("You can't poison your own pet!"); + } else { + player.getPacketDispatch().sendMessage("You don't have any fish food."); + } + break; + case "drop": + sendDialogue("If you drop your fishbowl it will break!"); + stage = 4; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 999: + end(); + break; + case 1: + sendDialogue("The fish swims. It is clearly an obedient fish."); + stage = 999; + break; + case 2: + sendDialogue("The fish bumps into the side of the fishbowl. Then it swims some", "more."); + stage++; + break; + case 3: + player("Good fish..."); + stage = 999; + break; + case 4: + options("Drop it regardless", "Keep hold"); + stage++; + break; + case 5: + switch(buttonId) { + case 1: + sendDialogue("The fishbowl shatters on the ground."); + player.getInventory().remove(fishbowl); + stage = 999; + break; + case 2: + sendDialogue("You keep a hold of it for now."); + stage = 999; + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("fishbowl-options") }; + } + } + + + public static final class AquariumPlugin extends OptionHandler { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(10091).getHandlers().put("option:fish-in", this); + PluginManager.definePlugin(new TinyNetHandler()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + return getFish(player); + } + + public boolean getFish(final Player player) { + if (!player.getInventory().containsAtLeastOneItem(TINY_NET)) { + player.getPacketDispatch().sendMessage("You see some tiny fish swimming around... but how to catch them?"); + return true; + } + else if (player.getInventory().remove(new Item(FISHBOWL_SEAWEED))) { + player.getPacketDispatch().sendMessage("You wave the net around..."); + player.getSkills().addExperience(Skills.FISHING, 1., true); + int level = player.getSkills().getLevel(Skills.FISHING); + int blueChance = (int) Math.round(Util.clamp(-0.6667 * (double) level + 106., 40, 60)); + int greenChance = (int) Math.round(Util.clamp(0.2941 * (double) level + 19.7059, 20, 40)); + int spineChance = (int) Math.round(Util.clamp(0.6667 * (double) level - 46., 0, 20)); + + WeightedChanceItem[] fishChance = new WeightedChanceItem[] { + new WeightedChanceItem(FISHBOWL_BLUE, 1, blueChance), + new WeightedChanceItem(FISHBOWL_GREEN, 1, greenChance), + new WeightedChanceItem(FISHBOWL_SPINE, 1, spineChance) + }; + + Item fish = RandomFunction.rollWeightedChanceTable(fishChance); + player.getInventory().add(fish); + String msg = "[ REPORT BUG ON DISCORD ]"; + switch(fish.getId()) { + case FISHBOWL_BLUE: + msg = "Bluefish"; + break; + case FISHBOWL_GREEN: + msg = "Greenfish"; + break; + case FISHBOWL_SPINE: + msg = "Spinefish"; + break; + } + player.getPacketDispatch().sendMessage("...and you catch a Tiny " + msg + "!"); + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 10); + return true; + } + else { + player.getPacketDispatch().sendMessage("You need something to put your catch in!"); + return true; + } + } + + private final class TinyNetHandler extends UseWithHandler { + public TinyNetHandler() { + super(TINY_NET); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(10091, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + return getFish(event.getPlayer()); + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/GnomeCopterPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/GnomeCopterPlugin.java new file mode 100644 index 000000000..3f30cd574 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/GnomeCopterPlugin.java @@ -0,0 +1,40 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the gnome copter plugin. + * @author Vexia + */ +@Initializable +public final class GnomeCopterPlugin implements Plugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(12842).getHandlers().put("equipment", this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + final Player player = (Player) args[0]; + final Item item = (Item) args[1]; + switch (identifier) { + case "equip": + break; + case "unequip": + if (item.getId() == 12842) { + player.getEquipment().remove(item, EquipmentContainer.SLOT_WEAPON, true); + return false; + } + break; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/GnomecopterTicket.java b/Server/src/main/java/Server/core/game/interaction/item/GnomecopterTicket.java new file mode 100644 index 000000000..049b1989e --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/GnomecopterTicket.java @@ -0,0 +1,38 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * The gnomecopter ticket handling plugin. + * @author Emperor + */ +@Initializable +public final class GnomecopterTicket extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(12843).getHandlers().put("option:read", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getInterfaceManager().open(new Component(729)); + String info = "Gnomecopter ticket:"; + info += "
" + "Castle Wars"; // Destination + info += "
" + "Ref. #000"; + for (int i = 3; i < 8; i++) { + info += RandomFunction.randomize(10); + } + player.getPacketDispatch().sendString(info, 729, 2); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/GodBookPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/GodBookPlugin.java new file mode 100644 index 000000000..03e06d0c7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/GodBookPlugin.java @@ -0,0 +1,328 @@ +package core.game.interaction.item; + +import core.game.content.dialogue.DialogueAction; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.GodBook; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.Item; +import core.game.node.item.ItemPlugin; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the god books. + * @author Vexia + */ +@Initializable +public class GodBookPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (GodBook book : GodBook.values()) { + book.getDamagedBook().getDefinition().getHandlers().put("option:check", this); + book.getBook().getDefinition().getHandlers().put("option:preach", this); + } + PluginManager.definePlugins(new PageHandler(), new GodBookDialogue(), new GodBookItem(), new SymbolBlessHandler()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + GodBook book = GodBook.forItem(node.asItem(), option.equalsIgnoreCase("check")); + if (book != null) { + switch (option) { + case "check": + String[] messages = new String[4]; + for (int i = 0; i < messages.length; i++) { + messages[i] = book.hasPage(player, node.asItem(), i + 1) ? "The " + getNumberName(i + 1) + " page is in the book." : "The " + getNumberName(i + 1) + " page is missing."; + } + player.getDialogueInterpreter().sendDialogue(messages); + return true; + case "preach": + player.getDialogueInterpreter().open("god-book", book); + return true; + } + } + return true; + } + + /** + * Handles the blessing of a symbol with a god book. + * @author Vexia + */ + public class SymbolBlessHandler extends UseWithHandler { + + /** + * Constructs a new {@code SymbolBlessHandler} {@code Object} + */ + public SymbolBlessHandler() { + super(1716); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (GodBook book : GodBook.values()) { + addHandler(book.getBook().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + GodBook book = GodBook.forItem(event.getUsedItem(), false); + if (book == null) { + return false; + } + final Item symbol = event.getUsedWith().asItem(); + if (player.getSkills().getLevel(Skills.PRAYER) < 50) { + player.sendMessage("You need a Prayer level of at least 50 in order to do this."); + return true; + } + if (player.getSkills().getPrayerPoints() < 4) { + player.sendMessage("You need at least 4 prayer points in order to do this."); + return true; + } + if (book == GodBook.BOOK_OF_BALANCE) { + player.getDialogueInterpreter().sendOptions("Select an Option", "Unholy symbol", "Holy symbol"); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + bless(player, symbol, buttonId == 1 ? GodBook.UNHOLY_BOOK : GodBook.HOLY_BOOK); + } + + }); + return true; + } + bless(player, symbol, book); + return true; + } + + /** + * Blesses a symbol. + * @param player the player. + * @param book the book. + */ + private void bless(Player player, Item symbol, GodBook book) { + if (!player.getInventory().containsItem(symbol)) { + return; + } + if (player.getInventory().get(symbol.getSlot()) == null) { + return; + } + player.getInventory().replace(book.getBlessItem()[0], symbol.getSlot()); + player.getSkills().decrementPrayerPoints(4); + } + + } + + /** + * A god book item. + * @author Vexia + */ + public class GodBookItem extends ItemPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (GodBook book : GodBook.values()) { + register(book.getDamagedBook().getId()); + } + return this; + } + + @Override + public boolean canPickUp(Player player, GroundItem item, int type) { + if (player.hasItem(item.asItem())) { + player.sendMessage("You do not need more than one incomplete book."); + return false; + } + return true; + } + + } + + /** + * Handles the god book dialogue. + * @author Vexia + */ + public static class GodBookDialogue extends DialoguePlugin { + + /** + * The partnership messages. + */ + private static final String[][] PARTNERSHIPS = new String[][] { { "In the name of Saradomin,", "protector of us all,", " I now join you in the eyes of Saradomin." }, { "Light and dark,", "day and night,", "Balance arises from constrast.", "I unify thee in the name of Guthix." }, { "May your union not be harmonious,", "but may your conflicts make you stronger,", "in Zamorak's name,", "now two are one." } }; + + /** + * The last rite messages. + */ + private static final String[][] LAST_RITES = new String[][] { { "Thy cause was false,", "thy skills did lack;", "See you in Lumbridge when you get back." }, { "Thy death was not in vain,", "For it brought some balance to the world.", "May guthix bring thee rest." }, { "The weak deserve to die,", "so the strong may flourish.", "This is the creed of Zamorak." } }; + + /** + * The blessing messages. + */ + private static final String[][] BLESSINGS = new String[][] { { "Go in peace in the name of Saradomin;", "may his glory shine upon you like the sun." }, { "Mayest thou walk the path,", "and never fall,", "For Guthix walks beside thee on thy journey.", "May Guthix bring thee peace." }, { "May you reject all safe paths,", "and embrace all challenges.", "Zamorak bring you strength." } }; + + /** + * The preaching messages. + */ + private static final String[][] PREACH = new String[][] { { "Protect yourself,", "protect your friends.", "Mine is the glory that never ends.", "This is Saradomin's wisdom." }, { "Thee trees,", "the earth,", "the sky,", "the waters:", "All play their part upon this land.", "May Guthix bring thee balance." }, { "Battles are not lost and won;", "They simply remove the weak from the equation.", "Zamorak give me strength!" } }; + + private static final Animation[] ANIMATIONS = new Animation[] { new Animation(1335), new Animation(1337), new Animation(1336) }; + + /** + * The god book. + */ + private GodBook book; + + /** + * Constructs a new {@code GodBookDialogue} {@code Object} + */ + public GodBookDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code GodBookDialogue} {@code Object} + * @param player the player. + */ + public GodBookDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new GodBookDialogue(player); + } + + @Override + public boolean open(Object... args) { + book = (GodBook) args[0]; + options("Wedding Ceremony", "Last Rites", "Blessings", "Preach"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + String[][] data = null; + switch (buttonId) { + case 1: + data = PARTNERSHIPS; + break; + case 2: + data = LAST_RITES; + break; + case 3: + data = BLESSINGS; + break; + case 4: + data = PREACH; + break; + } + say(data); + end(); + break; + } + return true; + } + + /** + * Says the messages for the type. + * @param data the data. + */ + private void say(String[][] data) { + if (player.inCombat()) { + player.sendMessage("You can't do that while in combat."); + return; + } + final String[] messages = data[book.ordinal()]; + final Animation animation = ANIMATIONS[book.ordinal()]; + player.animate(animation); + player.lock(); + GameWorld.getPulser().submit(new Pulse(2, player) { + int index = 0; + + @Override + public boolean pulse() { + player.animate(animation); + player.sendChat(messages[index]); + return index++ >= messages.length - 1; + } + + @Override + public void stop() { + super.stop(); + player.unlock(); + } + + }); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("god-book") }; + } + + } + + /** + * The page handler. + * @author Vexia + */ + public class PageHandler extends UseWithHandler { + + /** + * Constructs a new {@code PageHandler} {@code Object} + */ + public PageHandler() { + super(3839, 3841, 3843); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (GodBook book : GodBook.values()) { + for (Item i : book.getPages()) { + addHandler(i.getId(), ITEM_TYPE, this); + } + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + GodBook book = GodBook.forItem(event.getUsedItem(), true); + Player player = event.getPlayer(); + if (book != null && book.isPage(event.getUsedWith().asItem())) { + book.insertPage(player, event.getUsedItem(), event.getUsedWith().asItem()); + return true; + } + return false; + } + + } + + /** + * Gets the number name. + * @param i the integer to check. + * @return the number name. + */ + private String getNumberName(int i) { + return i == 1 ? "first" : i == 2 ? "second" : i == 3 ? "third" : "fourth"; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/GodswordDismantlePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/GodswordDismantlePlugin.java new file mode 100644 index 000000000..2be306576 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/GodswordDismantlePlugin.java @@ -0,0 +1,55 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the godsword dismantle plugin. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class GodswordDismantlePlugin extends OptionHandler { + + /** + * Represents the godsword blade item. + */ + private static final Item BLADE = new Item(11690); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(11694).getHandlers().put("option:dismantle", this); + ItemDefinition.forId(11696).getHandlers().put("option:dismantle", this); + ItemDefinition.forId(11698).getHandlers().put("option:dismantle", this); + ItemDefinition.forId(11700).getHandlers().put("option:dismantle", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final Item item = (Item) node; + if (item.getSlot() < 0 || player.getInventory().getNew(item.getSlot()).getId() != item.getId()) { + return true; + } + final int freeSlot = player.getInventory().freeSlot(); + if (freeSlot == -1) { + player.getPacketDispatch().sendMessage("Not enough space in your inventory!"); + return true; + } + player.getPacketDispatch().sendMessage("You detach the hilt from the blade."); + player.getInventory().replace(null, item.getSlot(), false); + player.getInventory().add(BLADE, new Item(11702 + (item.getId() - 11694))); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/GrandSeedPodHandler.kt b/Server/src/main/java/Server/core/game/interaction/item/GrandSeedPodHandler.kt new file mode 100644 index 000000000..8062c63b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/GrandSeedPodHandler.kt @@ -0,0 +1,84 @@ +package core.game.interaction.item + +import core.cache.def.impl.ItemDefinition +import core.tools.Items +import core.game.content.global.travel.glider.GliderPulse +import core.game.content.global.travel.glider.Gliders +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +private const val SQUASH_GRAPHICS_BEGIN = 767 +private const val SQUASH_GRAPHICS_END = 769 +private const val SQUASH_ANIM_BEGIN = 4544 +private const val SQUASH_ANIM_END = 4546 +private const val LAUNCH_GRAPHICS = 768 +private const val LAUNCH_ANIMATION = 4547 + +/** + * Handles the grand tree pod options + * @author Ceikry + */ +@Initializable +class GrandSeedPodHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + val def = ItemDefinition.forId(Items.GRAND_SEED_POD_9469) + def.handlers["option:squash"] = this + def.handlers["option:launch"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + option ?: return false + when(option){ + "squash" -> { + GameWorld.Pulser.submit(SquashPulse(player)) + } + "launch" -> { + GameWorld.Pulser.submit(LaunchPulse(player)) + } + + } + player.inventory.remove(Item(node.id,1)) + player.lock() + return true + } + + class LaunchPulse(val player: Player): Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 1 -> player.visualize(Animation(LAUNCH_ANIMATION),Graphics(LAUNCH_GRAPHICS)) + 3 -> player.skills.addExperience(Skills.FARMING,100.0) + 4 -> GameWorld.Pulser.submit(GliderPulse(2,player,Gliders.TA_QUIR_PRIW)).also { return true } + } + return false + } + } + + class SquashPulse(val player: Player) : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 1 -> player.visualize(Animation(SQUASH_ANIM_BEGIN), Graphics(SQUASH_GRAPHICS_BEGIN)) + 4 -> player.animator.forceAnimation(Animation(1241)) + 5 -> player.properties.teleportLocation = Location.create(2464, 3494, 0) + 6 -> player.visualize(Animation(1241),Graphics(SQUASH_GRAPHICS_END)) + 8 -> player.animator.forceAnimation(Animation(SQUASH_ANIM_END)).also { player.skills.setLevel(Skills.FARMING,player.skills.getStaticLevel(Skills.FARMING) - 5) } + 9 -> player.unlock().also { return true } + } + return false + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/item/HerbBoxPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/HerbBoxPlugin.java new file mode 100644 index 000000000..e6d2ab39a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/HerbBoxPlugin.java @@ -0,0 +1,85 @@ +package core.game.interaction.item; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the herb box item. + * @author Vexia + * + */ +@Initializable +public class HerbBoxPlugin extends OptionHandler { + + /** + * The herbs to recieve. + */ + private static final ChanceItem[] HERBS = new ChanceItem[] {new ChanceItem(199, 1, 25), new ChanceItem(201, 1, 18), new ChanceItem(203, 1, 13), new ChanceItem(205, 1, 11), new ChanceItem(207, 1, 8), new ChanceItem(209, 1, 6), new ChanceItem(211, 1, 4), new ChanceItem(213, 1, 5), new ChanceItem(215, 1, 3), new ChanceItem(2485, 1, 3), new ChanceItem(217, 1, 3)}; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(14810).getHandlers().put("option:bank-all", this); + ItemDefinition.forId(14810).getHandlers().put("option:take-one", this); + ItemDefinition.forId(14810).getHandlers().put("option:check", this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Item box = node.asItem(); + int herbs = 10 - (1000 - box.getCharge()); + if (herbs < 0 || herbs > 10) { + player.getInventory().remove(box, box.getSlot(), true); + return true; + } + player.lock(1); + switch (option) { + case "bank-all": + if (player.getBank().freeSlots() < herbs) { + player.sendMessage("You don't have enough bank space to bank all those herbs."); + break; + } + List herbList = new ArrayList<>(); + for (int i = 0; i < herbs; i++) { + herbList.add(RandomFunction.getChanceItem(HERBS)); + } + if (player.getInventory().remove(box, box.getSlot(), true)) { + player.getBank().add(herbList.toArray(new ChanceItem[] {})); + player.sendMessage(herbs + " herbs have been deposited into your bank."); + } + break; + case "take-one": + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("You don't have enough space in your inventory."); + break; + } + ChanceItem herb = RandomFunction.getChanceItem(HERBS); + player.getInventory().add(herb.getRandomItem()); + box.setCharge(box.getCharge() - 1); + if (box.getCharge() <= 990) { + player.getInventory().remove(box, box.getSlot(), true); + } + player.sendMessage("You take a herb from the box."); + break; + case "check": + player.sendMessage("The herb box contains " + herbs + " herbs."); + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/HouseTeleTabOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/HouseTeleTabOptionPlugin.java new file mode 100644 index 000000000..b67a361e3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/HouseTeleTabOptionPlugin.java @@ -0,0 +1,41 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +@Initializable +public class HouseTeleTabOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(8013).getHandlers().put("option:break", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getHouseManager().getLocation().getExitLocation() == null) { + player.sendMessage("You must have a house to teleport to before attempting that."); + return false; + } + player.getInterfaceManager().close(); + player.lock(5); + Location location = player.getHouseManager().getLocation().getExitLocation(); + if (player.getInventory().contains(node.asItem().getId(), 1)) { + if (player.getTeleporter().send(location.transform(0, RandomFunction.random(3), 0), TeleportType.TELETABS, 1)) { + player.getInventory().remove(new Item(node.asItem().getId(),1)); + return true; + } + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/KeldagrimVotingBond.java b/Server/src/main/java/Server/core/game/interaction/item/KeldagrimVotingBond.java new file mode 100644 index 000000000..2b440ffa4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/KeldagrimVotingBond.java @@ -0,0 +1,188 @@ +//package core.game.interaction.item; +// +//import java.text.DecimalFormat; +//import java.util.concurrent.TimeUnit; +// +//import core.cache.def.impl.ItemDefinition; +//import core.game.content.dialogue.DialogueInterpreter; +//import core.game.content.dialogue.DialoguePlugin; +//import core.game.content.ttrail.ClueLevel; +//import core.game.content.ttrail.ClueScrollPlugin; +//import core.game.interaction.OptionHandler; +//import core.game.node.Node; +//import core.game.node.entity.player.Player; +//import core.game.node.entity.state.EntityState; +//import core.game.node.item.Item; +//import core.game.world.repository.Repository; +//import core.plugin.Plugin; +//import core.plugin.PluginManager; +//import core.plugin.InitializablePlugin; +//import core.tools.RandomFunction; +// +///** +// * Handles the keldagrim voting bond item. +// * @author Vexia +// * +// */ +//@InitializablePlugin +//public class KeldagrimVotingBond extends OptionHandler { +// +// /** +// * The keldagrim bond item. +// */ +// private static final Item BOND = new Item(14807); +// +// /** +// * The ultra lamp item. +// */ +// private static final Item ULTRA_LAMP = new Item(14820); +// +// @Override +// public Plugin newInstance(Object arg) throws Throwable { +// ItemDefinition.forId(14807).getConfigurations().put("option:redeem", this); +// ItemDefinition.forId(14807).getConfigurations().put("option:deposit", this); +// PluginManager.definePlugin(new keldagrimVotingBondDialogue()); +// return this; +// } +// +// @Override +// public boolean handle(Player player, Node node, String option) { +// Item item = node.asItem(); +// switch (option) { +// case "redeem": +// player.getDialogueInterpreter().open(DialogueInterpreter.getDialogueKey("keldagrim-bond")); +// break; +// case "deposit": +// if (!player.getBank().hasSpaceFor(item)) { +// player.sendMessage("You don't have enough space in your bank for that item."); +// return true; +// } +// if (player.getInventory().remove(item)) { +// player.getBank().add(item); +// player.sendMessage("You deposit your Reward bond into your bank."); +// } +// break; +// } +// return true; +// } +// +// @Override +// public boolean isWalk() { +// return false; +// } +// +// /** +// * Handles the keldagrim voting bond dialogue. +// * @author Vexia +// * +// */ +// public class keldagrimVotingBondDialogue extends DialoguePlugin { +// +// /** +// * Constructs the {@code keldagrimVotingBondDialogue} +// */ +// public keldagrimVotingBondDialogue() { +// /** +// * empty. +// */ +// } +// +// /** +// * Constructs the {@code keldagrimVotingBondDialogue} +// * @param player The player. +// */ +// public keldagrimVotingBondDialogue(Player player) { +// super(player); +// } +// +// @Override +// public DialoguePlugin newInstance(Player player) { +// return new keldagrimVotingBondDialogue(player); +// } +// +// @Override +// public boolean open(Object... args) { +// options("Double Experience (1 Hour)", "30K Experience Lamp", "10k-75k Coins", "Clue Scroll"); +// stage = 0; +// return true; +// } +// +// @Override +// public boolean handle(int interfaceId, int buttonId) { +// switch (stage) { +// case 0: +// stage = 1; +// switch (buttonId) { +// case 1: +// if (player.getSavedData().getGlobalData().hasDoubleExp()) { +// interpreter.sendItemMessage(14807, "You already have double EXP active!"); +// return true; +// } +// if (player.getInventory().remove(BOND)) { +// player.getSavedData().getGlobalData().setDoubleExp(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1)); +// player.getStateManager().set(EntityState.DOUBLE_EXPERIENCE, 6000, 0); +// interpreter.sendItemMessage(14807, "You redeemed an hour of double EXP!"); +// Repository.sendNews("" + player.getUsername() + " redeemed an hour of double EXP from a Reward bond!", 15, ""); +// } +// break; +// case 2: +// if (!player.getInventory().hasSpaceFor(ULTRA_LAMP)) { +// interpreter.sendItemMessage(14807, "Sorry, you don't have enough inventory space."); +// return true; +// } +// if (player.getInventory().remove(BOND)) { +// player.getInventory().add(ULTRA_LAMP); +// interpreter.sendItemMessage(14807, "You redeem an ultra lamp."); +// Repository.sendNews("" + player.getUsername() + " redeemed an ultra lamp from a Reward bond!", 15, ""); +// return true; +// } +// break; +// case 3: +// Item coins = new Item(995, RandomFunction.random(10000, 75000)); +// if (!player.getInventory().hasSpaceFor(coins)) { +// interpreter.sendItemMessage(14807, "Sorry, you don't have enough inventory space."); +// return true; +// } +// if (player.getInventory().remove(BOND)) { +// DecimalFormat formatter = new DecimalFormat("#,###"); +// player.getInventory().add(coins); +// interpreter.sendItemMessage(14807, "You redeem " + formatter.format(coins.getAmount()) + " gold coins."); +// Repository.sendNews("" + player.getUsername() + " redeemed " + formatter.format(coins.getAmount()) + " gold coins from a Reward bond!", 15, ""); +// } +// break; +// case 4: +// if (player.getInventory().freeSlots() < 1) { +// interpreter.sendItemMessage(14807, "Sorry, you don't have enough inventory space."); +// return true; +// } +// if (player.getTreasureTrailManager().hasClue()) { +// interpreter.sendItemMessage(14807, "Sorry, you already have a clue scroll."); +// break; +// } +// if (player.getTreasureTrailManager().hasTrail()) { +// player.getTreasureTrailManager().clearTrail(); +// } +// Item clue = ClueScrollPlugin.getClue(RandomFunction.getRandomElement(ClueLevel.values())); +// if (player.getInventory().remove(BOND)) { +// player.getInventory().add(clue); +// interpreter.sendItemMessage(14807, "You redeem a clue scroll."); +// Repository.sendNews("" + player.getUsername() + " redeemed a clue scroll from a Reward bond!", 15, ""); +// } +// break; +// } +// break; +// case 1: +// end(); +// break; +// } +// return true; +// } +// +// @Override +// public int[] getIds() { +// return new int[] {DialogueInterpreter.getDialogueKey("keldagrim-bond")}; +// } +// +// } +// +//} diff --git a/Server/src/main/java/Server/core/game/interaction/item/LampPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/LampPlugin.java new file mode 100644 index 000000000..eae8da606 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/LampPlugin.java @@ -0,0 +1,58 @@ +package core.game.interaction.item; + +import core.game.component.Component; +import core.game.content.global.Lamps; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.skill.Skills; + +/** + * Represents the plugin used for an experience lamp. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LampPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Lamps lamp : Lamps.values()) { + lamp.getItem().getDefinition().getHandlers().put("option:rub", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.setAttribute("lamp", node); + player.setAttribute("caller",this); + player.getInterfaceManager().open(new Component(134).setCloseEvent((player1, c) -> { + player.getInterfaceManager().openDefaultTabs(); + player.removeAttribute("lamp"); + player.unlock(); + return true; + })); + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13); + return true; + } + @Override + public void handleSelectionCallback(int skill, Player player){ + Lamps lamp = Lamps.forItem(player.getAttribute("lamp",new Item(2528))); + if(player.getSkills().getStaticLevel(skill) < lamp.getLevelRequirement()){ + player.sendMessage("Your need at least" + lamp.getLevelRequirement() + " " + Skills.SKILL_NAME[skill] + " to do this."); + return; + } + player.getSkills().addExperience(skill,lamp.getExp()); + player.getInventory().remove((Item) player.getAttribute("lamp")); + } + + @Override + public boolean isWalk() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/MorphItemPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/MorphItemPlugin.java new file mode 100644 index 000000000..353152aa4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/MorphItemPlugin.java @@ -0,0 +1,109 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles a morph item. + * @author Vexia + */ +@Initializable +public class MorphItemPlugin implements Plugin { + + /** + * The easter egg ids. + */ + protected static final int[] EASTER_EGG_IDS = new int[] { 3689, 3690, 3691, 3692, 3693, 3694 }; + + /** + * The morph component. + */ + private static final Component COMPONENT = new Component(375).setCloseEvent(new CloseEvent() { + + @Override + public boolean close(Player player, Component c) { + unmorph(player); + return true; + } + + }); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(7927).getHandlers().put("equipment", this); + ItemDefinition.forId(6583).getHandlers().put("equipment", this); + PluginManager.definePlugin(new MorphInterfacePlugin()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + final Player player = (Player) args[0]; + final Item item = (Item) args[1]; + switch (identifier) { + case "equip": + morph(player, item); + return false; + } + return true; + } + + /** + * Morphs the player. + * @param player the player. + * @param item the item. + */ + private void morph(Player player, Item item) { + int morphId = item.getId() == 6583 ? 2626 : EASTER_EGG_IDS[RandomFunction.random(EASTER_EGG_IDS.length)]; + player.getInterfaceManager().close(); + player.getAppearance().transformNPC(morphId); + player.getInterfaceManager().hideTabs(0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14); + player.getLocks().lockMovement(GameWorld.getTicks() + 900000000); + player.getLocks().lockInteractions(GameWorld.getTicks() + 90000000); + player.getLocks().lockTeleport(GameWorld.getTicks() + 900000000); + player.getInterfaceManager().openSingleTab(COMPONENT); + player.getAppearance().sync(); + player.getWalkingQueue().reset(); + } + + /** + * Unmorphs the player. + * @param player the player. + */ + private static void unmorph(Player player) { + player.getAppearance().transformNPC(-1); + player.unlock(); + player.getInterfaceManager().restoreTabs(); + } + + /** + * Handles the morph interface plugin. + * @author Vexia + */ + public class MorphInterfacePlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(375).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + player.getInterfaceManager().closeSingleTab(); + return true; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/NewComerMapPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/NewComerMapPlugin.java new file mode 100644 index 000000000..a0eb0a58d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/NewComerMapPlugin.java @@ -0,0 +1,35 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the new comper map. + * @author 'Vexia + */ +@Initializable +public class NewComerMapPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getInterfaceManager().open(new Component(270)); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(550).getHandlers().put("option:read", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/NewsPaperPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/NewsPaperPlugin.java new file mode 100644 index 000000000..164b4c92c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/NewsPaperPlugin.java @@ -0,0 +1,45 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the news paper. + * @author 'Vexia + */ +@Initializable +public class NewsPaperPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + int id = ((Item) node).getId(); + if (id == 11169) { + player.getInterfaceManager().open(new Component(530)); + final String page1 = "Varrock gets Makeover! The city of Varrock is the latest recipient of a complete makeover. When interviewed, King Roald said, 'In order to keep visitors coming to see the sights of our beautiful capital, we felt that tidying-up the city would be more effective than just issuing a decree - make sure you visit the new museum while you are here.'"; + final String page2 = "Obituaries Goblin-Died Giant Rat-Died Unicorn-Died Varrock Guard-Died Varrock Guard-Died Bear-Died. Classifieds."; + player.getPacketDispatch().sendString(page1, 530, 2); + player.getPacketDispatch().sendString(page2, 530, 4); + return true; + } else + player.getDialogueInterpreter().open(70099, "Come to the Al Kharid Market place! Highquality", "produce at low, low prices! Show this flyer to a", "merchant for money off your next purchase,", "courtesy of Ali Morrisane!"); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(7922).getHandlers().put("option:read", this); + ItemDefinition.forId(11169).getHandlers().put("option:read", this); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/OysterPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/OysterPlugin.java new file mode 100644 index 000000000..1abe26d14 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/OysterPlugin.java @@ -0,0 +1,41 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents an oyster plugin handler. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class OysterPlugin extends OptionHandler { + + /** + * Represents the oyster items. + */ + private static final Item[] OYSTERS = new Item[] { new Item(409), new Item(411), new Item(413) }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(407).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getInventory().replace(RandomFunction.random(5) < 3 ? OYSTERS[RandomFunction.random(OYSTERS.length - 1)] : OYSTERS[RandomFunction.random(OYSTERS.length)], ((Item) node).getSlot()); + return true; + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/PharoahSceptre.java b/Server/src/main/java/Server/core/game/interaction/item/PharoahSceptre.java new file mode 100644 index 000000000..13a49414f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/PharoahSceptre.java @@ -0,0 +1,138 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + + +/** + * Adds functionality to the pharoah's scepter + * @author ceik + */ +@Initializable +public final class PharoahSceptre extends OptionHandler { + private static final Graphics GRAPHICS = new Graphics(308, 100, 50); + private static final Animation ANIMATION = new Animation(714); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new SceptreDialog().init(); + ItemDefinition.forId(9044).getHandlers().put("option:teleport",this); + ItemDefinition.forId(9046).getHandlers().put("option:teleport",this); + ItemDefinition.forId(9048).getHandlers().put("option:teleport",this); + ItemDefinition.forId(9050).getHandlers().put("option:teleport",this); + return this; + } + @Override + public boolean handle(Player player, Node node, String string){ + Item item = node.asItem(); + if(string.equals("teleport")){ + switch(item.getId()) { + case 9044: + case 9046: + case 9048: + player.getDialogueInterpreter().open(325128389); + return true; + case 9050: + player.getPacketDispatch().sendMessage("You have used up all the charges on this sceptre."); + return true; + } + } + return true; + } + + public final class SceptreDialog extends DialoguePlugin { + public SceptreDialog() { + /** + * empty + */ + } + public SceptreDialog(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){ return new SceptreDialog(player);} + + @Override + public boolean open(Object... args){ + //Item item = (Item) args[0]; + player.getPacketDispatch().sendMessage("" + args[0]); + interpreter.sendOptions("Teleport to:","Jalsavrah","Jaleustrophos","Jaldraocht","Nowhere"); + return true; + } + public void teleport(Location location, Player player){ + player.lock(); + player.visualize(ANIMATION, GRAPHICS); + player.getImpactHandler().setDisabledTicks(4); + GameWorld.getPulser().submit(new Pulse(4, player) { + @Override + public boolean pulse() { + player.unlock(); + player.getProperties().setTeleportLocation(location); + player.getAnimator().reset(); + return true; + } + }); + } + @Override + public boolean handle(int interfaceId, int buttonId){ + if (player.isTeleBlocked()) { + player.sendMessage("A magical force has stopped you from teleporting."); + return false; + } + switch(buttonId){ + case 1: + teleport(Location.create(3289,2786,0), player); + stage = 10; + break; + case 2: + teleport(Location.create(3342,2827,0),player); + stage = 10; + break; + case 3: + teleport(Location.create(3233,2902,0),player); + stage = 10; + break; + case 4: + stage = 20; + break; + } + switch(stage){ + case 10: + if(player.getInventory().containsItem(new Item(9044))){ + player.getInventory().remove(new Item(9044)); + player.getInventory().add(new Item(9046)); + player.getPacketDispatch().sendMessage("Your Pharoah's Sceptre has 2 charges remaining."); + end(); + } else if (player.getInventory().containsItem(new Item(9046))){ + player.getInventory().remove(new Item(9046)); + player.getInventory().add(new Item(9048)); + player.getPacketDispatch().sendMessage("Your Pharoah's Sceptre has 1 charge remaining."); + end(); + } else if (player.getInventory().containsItem(new Item(9048))){ + player.getInventory().remove(new Item(9048)); + player.getInventory().add(new Item(9050)); + player.sendMessage("Your Pharoah's Sceptre has used its last charge."); + end(); + } + stage = 20; + break; + case 20: + end(); + break; + } + return true; + } + public int[] getIds() { return new int[] {325128389};} + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/PickupPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/PickupPlugin.java new file mode 100644 index 000000000..60224afab --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/PickupPlugin.java @@ -0,0 +1,42 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.global.action.PickupHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the option handler used for ground items. + * @author Vexia + * @author Emperor + */ +@Initializable +public final class PickupPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("take", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (player.getAttributes().containsKey("pickup")) + return false; + //player.setAttribute("pickup", "true"); + boolean handleResult = PickupHandler.take(player, (GroundItem) node); + player.removeAttribute("pickup"); + return handleResult; + } + + @Override + public Location getDestination(Node node, Node item) { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/QuestCapePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/QuestCapePlugin.java new file mode 100644 index 000000000..5a3c64f22 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/QuestCapePlugin.java @@ -0,0 +1,39 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.global.action.EquipHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the quest cape and hood item. + * @author 'Vexia + */ +@Initializable +public final class QuestCapePlugin extends OptionHandler { + final int MAX_QP = 72; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(9813).getHandlers().put("option:wear", this); + ItemDefinition.forId(9814).getHandlers().put("option:wear", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!(player.getQuestRepository().getPoints() >= MAX_QP)) { + player.getPacketDispatch().sendMessage("You cannot wear this " + node.getName().toLowerCase() + " yet."); + return true; + } + return EquipHandler.SINGLETON.handle(player, node, option); + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/RingUnchargePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/RingUnchargePlugin.java new file mode 100644 index 000000000..281069d8c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/RingUnchargePlugin.java @@ -0,0 +1,57 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the uncharging of the four imbued rings. + * @author Splinter + */ +@Initializable +public final class RingUnchargePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(14807).getHandlers().put("option:uncharge", this); + ItemDefinition.forId(14808).getHandlers().put("option:uncharge", this); + ItemDefinition.forId(14809).getHandlers().put("option:uncharge", this); + ItemDefinition.forId(14810).getHandlers().put("option:uncharge", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if(node == null || player == null){ + return true; + } + if(player.getInventory().remove(new Item(node.asItem().getId()))){ + player.getInventory().add(new Item(getReward(node.asItem().getId()), 1)); + } + return true; + } + + /** + * The reward to give. + * @param node + * @return an item ID + */ + private final int getReward(int node){ + switch(node){ + case 14810: + return 6737; + case 14808: + return 6733; + case 14809: + return 6735; + case 14807: + return 6731; + } + return -1; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/RunePackPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/RunePackPlugin.java new file mode 100644 index 000000000..166a1b0f9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/RunePackPlugin.java @@ -0,0 +1,64 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the new OSRS rune packs. + * @author Splinter + */ +@Initializable +public final class RunePackPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(14730).getHandlers().put("option:open", this); + ItemDefinition.forId(14732).getHandlers().put("option:open", this); + ItemDefinition.forId(14734).getHandlers().put("option:open", this); + ItemDefinition.forId(14736).getHandlers().put("option:open", this); + ItemDefinition.forId(14738).getHandlers().put("option:open", this); + ItemDefinition.forId(14740).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if(node == null || player == null){ + return true; + } + player.lock(1); + if(player.getInventory().remove(new Item(node.asItem().getId()))){ + player.getInventory().add(new Item(getReward(node.asItem().getId()), 100)); + } + return true; + } + + /** + * The reward to give. + * @param node + * @return an item ID + */ + private final int getReward(int node){ + switch(node){ + case 14730: + return 556; + case 14732: + return 555; + case 14734: + return 557; + case 14736: + return 554; + case 14738: + return 558; + case 14740: + return 562; + } + return 556; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/SilverSicklePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/SilverSicklePlugin.java new file mode 100644 index 000000000..6e52b72e3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/SilverSicklePlugin.java @@ -0,0 +1,72 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.Region; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the Silver Sickle (b) to collect Mort Myre Fungus. + * @author Splinter + */ +@Initializable +public final class SilverSicklePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(2963).getHandlers().put("option:operate", this); + ItemDefinition.forId(2963).getHandlers().put("option:cast bloom", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Region region = RegionManager.getRegionCache().get(player.getLocation().getRegionId()); + switch (option) { + case "operate": + case "cast bloom": + if (player.getSkills().getPrayerPoints() < 1) { + player.getPacketDispatch().sendMessage("You don't have enough prayer points to do this."); + } + for (GameObject[] o : region.getPlanes()[0].getObjects()) { + for (GameObject obj : o) { + if (obj != null) { + if (obj.getName().equalsIgnoreCase("Rotting log") && player.getSkills().getPrayerPoints() >= 1) { + if (player.getLocation().withinDistance(obj.getLocation(), 2)) { + handleVisuals(player, node); + ObjectBuilder.add(new GameObject(3509, obj.getLocation(), obj.getRotation())); + } + } + } + } + } + return true; + } + return false; + } + + /** + * Handles the draining of prayer points and physical graphics and + * animation. + */ + public void handleVisuals(Player player, Node node) { + player.getSkills().decrementPrayerPoints(RandomFunction.random(1, 3)); + player.getPacketDispatch().sendAnimation(9021); + final Location[] AROUND_YOU = new Location[] { Location.create(player.getLocation().getX() - 1, player.getLocation().getY(), 0), Location.create(player.getLocation().getX() + 1, player.getLocation().getY(), 0), Location.create(player.getLocation().getX(), player.getLocation().getY() - 1, 0), Location.create(player.getLocation().getX(), player.getLocation().getY() + 1, 0), Location.create(player.getLocation().getX() + 1, player.getLocation().getY() + 1, 0), Location.create(player.getLocation().getX() - 1, player.getLocation().getY() + 1, 0), Location.create(player.getLocation().getX() + 1, player.getLocation().getY() - 1, 0), Location.create(player.getLocation().getX() - 1, player.getLocation().getY() - 1, 0), Location.create(player.getLocation().getX() + 1, player.getLocation().getY() + 1, 0), }; + for (Location location : AROUND_YOU) { + // The graphic is meant to play on a 3x3 radius around you, but not + // including the tile you are on. + player.getPacketDispatch().sendGlobalPositionGraphic(263, location); + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/SkullSceptreOption.java b/Server/src/main/java/Server/core/game/interaction/item/SkullSceptreOption.java new file mode 100644 index 000000000..212f0b5e0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/SkullSceptreOption.java @@ -0,0 +1,57 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the skull sceptre options. + * @author 'Vexia + */ +@Initializable +public class SkullSceptreOption extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + Item item = (Item) node; + switch (option) { + case "invoke": + if (player.getTeleporter().send(Location.create(3081, 3421, 0), TeleportManager.TeleportType.NORMAL, 1)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 2, 12); + item.setCharge(item.getCharge() - 200); + if (item.getCharge() < 1) { + player.getInventory().remove(item); + player.getPacketDispatch().sendMessage("Your staff crumbles to dust as you use its last charge."); + } + } + break; + case "divine": + if (item.getCharge() < 1) { + player.getPacketDispatch().sendMessage("You don't have enough charges left."); + return true; + } + player.getPacketDispatch().sendMessage("Concentrating deeply, you divine that the sceptre has " + (item.getCharge() / 200) + " charges left."); + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(9013).getHandlers().put("option:invoke", this); + ItemDefinition.forId(9013).getHandlers().put("option:divine", this); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/SpadeDigOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/SpadeDigOptionPlugin.java new file mode 100644 index 000000000..45872e953 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/SpadeDigOptionPlugin.java @@ -0,0 +1,38 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.global.action.DigSpadeHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the dig option on a spade. + * @author 'Vexia + * @author Emperor + */ +@Initializable +public class SpadeDigOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(952).getHandlers().put("option:dig", this); + return null; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (!DigSpadeHandler.dig(player)) { + player.sendMessage("You dig but find nothing."); + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/StarterPackPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/StarterPackPlugin.java new file mode 100644 index 000000000..029d36eba --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/StarterPackPlugin.java @@ -0,0 +1,53 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * The plugin used for the free to play starter pack item + * @author Splinter + * + */ +@Initializable +public final class StarterPackPlugin extends OptionHandler { + + /** + * The item from the starter pack. + */ + private static final Item[] ITEMS = { new Item(558, 50), new Item(556, 50), new Item(1379, 1), new Item(740, 1), new Item(882, 100), new Item(1167, 1), new Item(1129, 1), new Item(1095, 1), new Item(1063, 1), new Item(1363, 1), new Item(1323, 1), new Item(1267, 1), new Item(1349, 1), new Item(1153, 1), new Item(1101, 1), new Item(1067, 1), new Item(1175, 1), new Item(841, 1)}; + + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(14775).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "open": + if(player.getInventory().freeSlots() >= ITEMS.length){ + if (player.getInventory().remove((Item) node)) { + player.getInventory().add(ITEMS); + return true; + } + } else { + player.sendMessage("You need "+(ITEMS.length - player.getInventory().freeSlots())+" more free inventory slot(s) to open the box."); + return true; + } + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/TeleTabsOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/TeleTabsOptionPlugin.java new file mode 100644 index 000000000..96e014141 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/TeleTabsOptionPlugin.java @@ -0,0 +1,160 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle teletabs. + * @author 'Vexia + */ +@Initializable +public class TeleTabsOptionPlugin extends OptionHandler { + + /** + * Represents the enum of tele tabs. + * @author 'Vexia + */ + public enum TeleTabs { + ADDOUGNE_TELEPORT(8011, Location.create(2662, 3307, 0), 61), + AIR_ALTAR_TELEPORT(13599, Location.create(2978, 3296, 0), 0), + ASTRAL_ALTAR_TELEPORT(13611, Location.create(2156, 3862, 0), 0), + BLOOD_ALTAR_TELEPORT(13610, Location.create(3559, 9778, 0), 0), + BODY_ALTAR_TELEPORT(13604, Location.create(3055, 3443, 0), 0), + CAMELOT_TELEPORT(8010, Location.create(2757, 3477, 0), 55.5), + CHAOS_ALTAR_TELEPORT(13606, Location.create(3058, 3593, 0), 0), + COSMIC_ALTAR_TELEPORT(13605, Location.create(2411, 4380, 0), 0), + DEATH_ALTAR_TELEPORT(13609, Location.create(1863, 4639, 0), 0), + EARTH_ALTAR_TELEPORT(13602, Location.create(3304, 3472, 0), 0), + FALADOR_TELEPORT(8009, Location.create(2966, 3380, 0), 47), + FIRE_ALTAR_TELEPORT(13603, Location.create(3311, 3252, 0), 0), + LAW_ALTAR_TELEPORT(13608, Location.create(2857, 3378, 0), 0), + LUMBRIDGE_TELEPORT(8008, Location.create(3222, 3218, 0), 41), + MIND_ALTAR_TELEPORT(13600, Location.create(2979, 3510, 0), 0), + NATURE_ALTAR_TELEPORT(13607, Location.create(2868, 3013, 0), 0), + VARROCK_TELEPORT(8007, Location.create(3212, 3423, 0), 35), + WATCH_TOWER_TELEPORT(8012, Location.create(2548, 3114, 0), 68), + WATER_ALTAR_TELEPORT(13601, Location.create(3182, 3162, 0), 0); + + /** + * Method used to get the teletab by the id. + * @param id the id. + * @return the teletab. + */ + public static TeleTabs forId(int id) { + for (TeleTabs tab : TeleTabs.values()) { + if (tab == null) + continue; + if (tab.getItem() == id) + return tab; + } + return null; + } + + /** + * The location. + */ + private Location location; + + /** + * The item id. + */ + private int item; + + /** + * The experience gained. + */ + private double exp; + + /** + * Constructs a new {@code TeleTabsOptionPlugin} {@code Object}. + * @param item the item. + * @param location the location. + * @param exp the exp. + */ + TeleTabs(int item, Location location, double exp) { + setItem(item); + setLocation(location); + this.exp = exp; + } + + /** + * @return the item + */ + public int getItem() { + return item; + } + + /** + * @return the location + */ + public Location getLocation() { + return location; + } + + /** + * @param item the item to set + */ + public void setItem(int item) { + this.item = item; + } + + /** + * @param location the location to set + */ + public void setLocation(Location location) { + this.location = location; + } + + /** + * @return the exp. + */ + public double getExp() { + return exp; + } + + /** + * @param exp the exp to set. + */ + public void setExp(double exp) { + this.exp = exp; + } + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final Item item = (Item) node; + if (item == null) { + return false; + } + final TeleTabs tab = TeleTabs.forId(item.getId()); + if (tab == null) { + return false; + } + player.getInterfaceManager().close(); + player.lock(5); + if (player.getInventory().contains(item.getId(), 1)) { + if (player.getTeleporter().send(tab.getLocation(), TeleportType.TELETABS, 1)) { + player.getInventory().remove(new Item(item.getId()), item.getSlot(), true); + } + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("break", this); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/TeleportCrystalPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/TeleportCrystalPlugin.java new file mode 100644 index 000000000..08e17a0cd --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/TeleportCrystalPlugin.java @@ -0,0 +1,201 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.zone.impl.WildernessZone; +import core.plugin.Plugin; + +/** + * Represents the rotten potato plugin. + * @author 'Vexia + */ +@Initializable +public final class TeleportCrystalPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(6099).getHandlers().put("option:activate", this); + ItemDefinition.forId(6100).getHandlers().put("option:activate", this); + ItemDefinition.forId(6101).getHandlers().put("option:activate", this); + ItemDefinition.forId(6102).getHandlers().put("option:activate", this); + new TeleportCrystalDialogue().init(); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!WildernessZone.checkTeleport(player, 20)) { + player.getPacketDispatch().sendMessage("The crystal is unresponsive."); + return true; + } + player.getDialogueInterpreter().open(TeleportCrystalDialogue.ID, 1, node.asItem().getId()); + //degrade(player, node.asItem()); + return true; + } + + + @Override + public boolean isWalk() { + return false; + } + + + + /** + * Represents the rotten potato dialogue. + * @author 'Vexia + * @version 1.0 + */ + public static final class TeleportCrystalDialogue extends DialoguePlugin { + + /** + * Represents the rotten potato dialogue id. + */ + public static final int ID = 3999111; + private Integer itemId; + + /** + * Constructs a new {@code RottenPotatoDialogue} {@code Object}. + */ + public TeleportCrystalDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code RottenPotatoDialogue} {@code Object}. + * @param player the player. + */ + public TeleportCrystalDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TeleportCrystalDialogue(player); + } + + @Override + public boolean open(Object... args) { + itemId = (Integer) args[1]; + switch ((Integer) args[0]) { + case 1: + interpreter.sendOptions("Select an Option", "Save your location", "Teleport to your location", "Contact Bill Teach", "Teleport to Lletya"); + stage = 100; + break; + } + + + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + NPC npc = new NPC(2376); + NPC billTeach = new NPC(3155); + switch (stage) { + case 100: + switch(buttonId) { + case 1: + interpreter.sendDialogues(npc, null, "That'll cost you 100,000 coins, is that okay?"); + stage = 1000; + break; + case 2: + player.getTeleporter().send(new Location(player.getGlobalData().getSavedX(), player.getGlobalData().getSavedY(), player.getGlobalData().getSavedH()), TeleportType.NORMAL); + end(); + degrade(player, new Item(itemId)); + break; + case 3: + interpreter.sendDialogues(npc, null, "This will use up a charge of your crystal,", "are you sure you wish to continue?"); + stage = 3000; + break; + case 4: + player.getTeleporter().send(new Location(2329, 3172), TeleportType.NORMAL); + break; + } + break; + case 1000: + interpreter.sendOptions("Select an Option", "Yes", "No"); + stage = 2000; + break; + case 2000: + switch(buttonId) { + case 1: + if(player.getInventory().getAmount(995) >= 100000) { + end(); + player.sendMessage("Your location has been saved succesfully!"); + player.getInventory().remove(new Item(995, 100000)); + player.getGlobalData().setSavedLocation(player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ()); + } else { + interpreter.sendDialogues(npc, null, "I'm sorry, but you don't have enough coins", "to cover this."); + stage = 7; + } + break; + case 2: + interpreter.sendOptions("Select an Option", "Save your location", "Teleport to your location", "Contact Bill Teach", "Teleport to Lletya"); + stage = 100; + break; + + } + break; + case 3000: + interpreter.sendOptions("Select an Option", "Yes", "No"); + stage = 4000; + break; + + case 4000: + switch(buttonId) { + case 1: + player.getDialogueInterpreter().open(billTeach.getId()); + degrade(player, new Item(itemId)); + break; + case 2: + interpreter.sendOptions("Select an Option", "Save your location", "Teleport to your location", "Contact Bill Teach", "Teleport to Lletya"); + stage = 100; + break; + } + break; + + case 7: + end(); + break; + } + return true; + } + + + /** + * Degrades the crystal from use. + * @param p the player + * @param item the crystal used + */ + private static void degrade(Player p, Item item) { + int id = item.getId(); + int newItem = item.getId() + 1; + if (id < 6102) { + p.getInventory().remove(new Item(id, 1)); + p.getInventory().add(new Item(newItem, 1)); + p.getPacketDispatch().sendMessage("Your teleportation crystal has degraded from use."); + } else { + p.getInventory().remove(new Item(id, 1)); + p.getPacketDispatch().sendMessages("Your teleportation crystal has turned into dust,", "you can purchase a new one from Mama."); + } + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/ToyHorsePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/ToyHorsePlugin.java new file mode 100644 index 000000000..d32d7c8bf --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/ToyHorsePlugin.java @@ -0,0 +1,48 @@ +package core.game.interaction.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the option for the toy horse. + * @author Vexia + */ +@Initializable +public class ToyHorsePlugin extends OptionHandler { + + /** + * The force chat's you can say. + */ + private static final String CHATS[] = { "Come-on Dobbin, we can win the race!", "Hi-ho Silver, and away!", "Neaahhhyyy!" }; + + @Override + public boolean handle(Player player, Node node, String option) { + player.lock(2); + int id = ((Item) node).getId(); + int anim = id == 2524 ? 920 : id == 2526 ? 921 : id == 2522 ? 919 : 918; + player.animate(new Animation(anim)); + player.sendChat(CHATS[RandomFunction.random(CHATS.length)]); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + int[] ids = new int[] { 2524, 2526, 2522 }; + for (int id : ids) { + ItemDefinition.forId(id).getHandlers().put("play-with", this); + } + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/brawling_gloves/BrawlingGloves.java b/Server/src/main/java/Server/core/game/interaction/item/brawling_gloves/BrawlingGloves.java new file mode 100644 index 000000000..385541b5c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/brawling_gloves/BrawlingGloves.java @@ -0,0 +1,72 @@ +package core.game.interaction.item.brawling_gloves; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.skill.Skills; + +import java.util.HashMap; + +/** + * Represents brawling gloves + * @author ceik + */ +public enum BrawlingGloves { + MELEE (13845, "melee", 500, 1, Skills.ATTACK), + RANGED (13846,"ranged", 500, 2, Skills.RANGE), + MAGIC (13847,"magic", 500, 3, Skills.MAGIC), + PRAYER (13848,"prayer", 450, 4, Skills.PRAYER), + AGILITY (13849,"agility", 450, 5, Skills.AGILITY), + WOODCUTTING(13850,"wc", 450, 6, Skills.WOODCUTTING), + FIREMAKING (13851,"fm", 450, 7, Skills.FIREMAKING), + MINING (13852,"mining", 450, 8, Skills.MINING), + HUNTER (13853,"hunter", 450, 9, Skills.HUNTER), + THIEVING (13854,"thieving",450, 10, Skills.THIEVING), + SMITHING (13855,"smithing",450, 11, Skills.SMITHING), + FISHING (13856,"fishing", 450, 12, Skills.FISHING), + COOKING (13857,"cooking", 450, 13, Skills.COOKING); + + private final int id; + private final String name; + private final int charges; + private final int indicator; + private int skillSlot; + + BrawlingGloves(int id, String name, int charges, int indicator, int skillSlot){ + this.id = id; + this.name = ItemDefinition.forId(id).getName(); + this.charges = charges; + this.indicator = indicator; + this.skillSlot = skillSlot; + } + + public static HashMap glovesMap = new HashMap<>(); + public static HashMap skillMap = new HashMap<>(); + public static HashMap indicatorMap = new HashMap<>(); + + static { + for(BrawlingGloves gloves : BrawlingGloves.values()){ + glovesMap.putIfAbsent(gloves.id, gloves); + skillMap.putIfAbsent(gloves.skillSlot,gloves); + indicatorMap.putIfAbsent(gloves.indicator,gloves); + } + } + + + + public static BrawlingGloves forId(int id){ + return glovesMap.get(id); + } + + public static BrawlingGloves forIndicator(int indicator){ + return indicatorMap.get(indicator); + } + + public static BrawlingGloves forSkill(int skillSlot){ + return skillMap.get(skillSlot); + } + + public int getId(){return id;} + public int getCharges(){return charges;} + public int getIndicator(){return indicator;} + public String getName(){return name;} + public int getSkillSlot() {return skillSlot;} +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.java b/Server/src/main/java/Server/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.java new file mode 100644 index 000000000..b63bd09a3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/brawling_gloves/BrawlingGlovesManager.java @@ -0,0 +1,80 @@ +package core.game.interaction.item.brawling_gloves; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.item.Item; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Objects; + +/** + * Manages brawling gloves for a player + * @author ceik + */ +public class BrawlingGlovesManager implements SavingModule { + + final Player player; + public HashMap GloveCharges = new HashMap(); + public void registerGlove(int id) { + try { + registerGlove(id, Objects.requireNonNull(BrawlingGloves.forId(id)).getCharges()); + } catch (Exception e){ + System.out.println(e); + } + } + public void registerGlove(int id, int charges) {GloveCharges.putIfAbsent(id,charges);} + + public BrawlingGlovesManager(Player player){this.player = player;} + + @Override + public void save(ByteBuffer buffer) { + if(!GloveCharges.isEmpty()){ + GloveCharges.forEach((key,value) -> { + buffer.putInt(BrawlingGloves.forId(key).getIndicator()); + buffer.putInt(value); + }); + } + buffer.put((byte) 0); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + int charges; + while ((opcode = buffer.get() & 0xFF) != 0){ + charges = buffer.getInt(); + registerGlove(BrawlingGloves.forIndicator((byte)opcode).getId(),charges); + } + } + + public boolean updateCharges(int glove, int charges){ + if(GloveCharges.get(glove) != null){ + if(GloveCharges.get(glove) - charges <= 0) { + GloveCharges.remove(glove); + player.getEquipment().remove(new Item(glove)); + player.getPacketDispatch().sendMessage("You use the last charge of your " + ItemDefinition.forId(glove).getName() + " and they vanish."); + return false; + } + int currentCharges = GloveCharges.get(glove); + GloveCharges.replace(glove,currentCharges - charges); + player.debug("Glove charges: " + (currentCharges - 1)); + if((currentCharges - 1) % 50 == 0) { + player.getPacketDispatch().sendMessage("Your " + ItemDefinition.forId(glove).getName() + " have " + GloveCharges.get(glove) + " charges left."); + } + } + return true; + } + + public double getExperienceBonus(){ + double bonus; + int level = player.getSkullManager().getLevel(); + if(level > 0){ + bonus = 3.0; + }else{ + bonus = 0.5; + } + return bonus; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/toys/ChocatriceCape.java b/Server/src/main/java/Server/core/game/interaction/item/toys/ChocatriceCape.java new file mode 100644 index 000000000..3a7fed3bc --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/toys/ChocatriceCape.java @@ -0,0 +1,26 @@ +package core.game.interaction.item.toys; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class ChocatriceCape extends OptionHandler { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(12634).getHandlers().put("option:operate",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getLocks().lockInteractions(2); + player.getAnimator().animate(new Animation(8903),new Graphics(1566)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/toys/DiangoOptionHandler.java b/Server/src/main/java/Server/core/game/interaction/item/toys/DiangoOptionHandler.java new file mode 100644 index 000000000..16ac99e47 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/toys/DiangoOptionHandler.java @@ -0,0 +1,23 @@ +package core.game.interaction.item.toys; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class DiangoOptionHandler extends OptionHandler { + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(970).getHandlers().put("option:holiday-items",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + DiangoReclaimInterface.open(player); + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/item/toys/DiangoReclaimInterface.java b/Server/src/main/java/Server/core/game/interaction/item/toys/DiangoReclaimInterface.java new file mode 100644 index 000000000..5165c7bb5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/toys/DiangoReclaimInterface.java @@ -0,0 +1,78 @@ +package core.game.interaction.item.toys; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.access.InterfaceContainer; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.holiday.easter.BasketofEggsEvent; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + + +/** + * Handles diango's item reclaiming interface + * @author ceik, for the interface, and for most of the holiday items/toys + */ +@Initializable +public class DiangoReclaimInterface extends ComponentPlugin { + private static final int COMPONENT_ID = 468; + public static final List ITEMS = new ArrayList<>(); + public static final Item[] HOLIDAY_ITEMS = {YoyoPlugin.YOYO, ReindeerHatPlugin.ReindeerHat, BasketofEggsEvent.RUBBER_CHICKEN,ZombieHeadPlugin.ZOMBIE_HEAD, new Item(6857), new Item(6856), new Item(6858), new Item(6859), new Item(6860), new Item(6861), new Item(6862), new Item(6863), new Item(9920), new Item(9921),new Item(9922), new Item(9923), new Item(9924), new Item(9925), new Item(11019), new Item(11020), new Item(11021), new Item(11022), new Item(11789), new Item(11949), new Item(12634), new Item(14076), new Item(14077), new Item(14081),new Item(14595), new Item(14602), new Item(14603), new Item(14605)}; + + //initialize the plugin, add lists of items to the ITEMS list... + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(COMPONENT_ID,this); + ITEMS.addAll(Arrays.asList(HOLIDAY_ITEMS)); + ITEMS.addAll(MarionettePlugin.MARIONETTES); + return this; + } + + public static void open(Player player){ + //close any currently open interfaces + Component curOpen = player.getInterfaceManager().getOpened(); + if(curOpen != null){ + curOpen.close(player); + } + + //filter out items the player already has in their bank, inventory, or equipped + Item[] reclaimables = ITEMS.stream().filter(Objects::nonNull).filter(item -> !player.getEquipment().containsItem(item) && !player.getInventory().containsItem(item) && !player.getBank().containsItem(item)).toArray(Item[]::new); + + //only send items if there are some to send + if(reclaimables.length > 0) { + InterfaceContainer.generateItems(player, reclaimables, new String[]{"Examine", "Take"}, 468, 2, 8, 8); + } + //open the interface + player.getInterfaceManager().open(new Component(468)); + } + + //refresh the interface + public static void refresh(Player player){ + player.getInterfaceManager().close(); + open(player); + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + Item[] reclaimables = ITEMS.stream().filter(Objects::nonNull).filter(item -> !player.getEquipment().containsItem(item) && !player.getInventory().containsItem(item) && !player.getBank().containsItem(item)).toArray(Item[]::new); + switch(opcode){ + case 155: //interface item option 1 == take + //add the clicked item to the player's inventory and refresh the interface + player.getInventory().add(reclaimables[slot]); + refresh(player); + break; + case 196: //interface item option 2 == examine + //send the examine text for the item to the player + player.getPacketDispatch().sendMessage(reclaimables[slot].getDefinition().getExamine()); + break; + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/toys/MarionettePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/toys/MarionettePlugin.java new file mode 100644 index 000000000..33dbe0917 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/toys/MarionettePlugin.java @@ -0,0 +1,71 @@ +package core.game.interaction.item.toys; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.util.Arrays; +import java.util.List; + +@Initializable +public class MarionettePlugin extends OptionHandler { + public final static List MARIONETTES = Arrays.asList(new Item(6865), new Item(6866), new Item(6867)); + private final Animation JUMP = new Animation(3003); + private final Animation WALK = new Animation(3004); + private final Animation BOW = new Animation(3005); + private final Animation DANCE = new Animation(3006); + private final int[][] GFX = new int[][] {{507,508,509,510}, {511,512,513,514}, {515,516,517,518}}; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for(Item item : MARIONETTES) { + ItemDefinition def = item.getDefinition(); + def.getHandlers().put("option:jump",this); + def.getHandlers().put("option:walk",this); + def.getHandlers().put("option:bow",this); + def.getHandlers().put("option:dance",this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int index = 0; + switch(node.getId()){ + case 6865: + index = 1; + break; + case 6866: + index = 2; + break; + case 6867: + index = 0; + break; + } + switch(option){ + case "jump": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(JUMP, new Graphics(GFX[index][0])); + break; + case "walk": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(WALK, new Graphics(GFX[index][1])); + break; + case "bow": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(BOW, new Graphics(GFX[index][2])); + break; + case "dance": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(DANCE, new Graphics(GFX[index][3])); + break; + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/toys/ReindeerHatPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/toys/ReindeerHatPlugin.java new file mode 100644 index 000000000..530a414e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/toys/ReindeerHatPlugin.java @@ -0,0 +1,27 @@ +package core.game.interaction.item.toys; + +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class ReindeerHatPlugin extends OptionHandler { + public final static Item ReindeerHat = new Item(10507); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ReindeerHat.getDefinition().getHandlers().put("option:operate",this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getLocks().lockInteractions(2); + player.getAnimator().animate(new Animation(5059)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/toys/SnowGlobePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/toys/SnowGlobePlugin.java new file mode 100644 index 000000000..b27eb8ac6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/toys/SnowGlobePlugin.java @@ -0,0 +1,83 @@ +package core.game.interaction.item.toys; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +@Initializable +public class SnowGlobePlugin extends OptionHandler { + + private final Animation SHAKE = new Animation(7535);//Initial Shake + private final Animation HOLDFACE = new Animation(7536);//Immediately after shake, player holds the snow globe to face + private static final Component INTERFACE = new Component(659);//After HOLDFACE this interface is displayed, player either clicks 'continue' for inv of snowballs, or 'close' for no snowballs + private final Animation DOWNFAST = new Animation(7537);//Used when player hit 'close' on the interface + private final Animation DOWNSLOW = new Animation(7538);//Used when the player hit 'continue' on the interface + private final Animation STOMP = new Animation(7528);//When player hits continue this animation plays + private final Graphics SNOW = new Graphics(1284);//When Animation STOMP is playing this gfx also plays + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new SnowGlobeInterface()); + ItemDefinition.forId(11949).getHandlers().put("option:shake",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getLocks().lockInteractions(2); + player.getAnimator().animate(SHAKE); + player.getPulseManager().run(new Pulse(3) { + @Override + public boolean pulse() { + player.getAnimator().animate(HOLDFACE); + player.getPulseManager().run(new Pulse(1){ + @Override + public boolean pulse(){ + player.getInterfaceManager().open(INTERFACE); + return true; + } + }); + return true; + } + }); + return true; + } + + public class SnowGlobeInterface extends ComponentPlugin{ + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(INTERFACE.getId(),this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if(button == 2){ + player.getInterfaceManager().close(); + player.getAnimator().animate(DOWNSLOW); + player.getPulseManager().run(new Pulse(1) { + @Override + public boolean pulse() { + player.getAnimator().animate(STOMP,SNOW); + player.getInventory().add(new Item(11951,player.getInventory().freeSlots())); + return true; + } + }); + return true; + } + player.getAnimator().animate(DOWNFAST); + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/toys/YoyoPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/toys/YoyoPlugin.java new file mode 100644 index 000000000..249ea9fc4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/toys/YoyoPlugin.java @@ -0,0 +1,53 @@ +package core.game.interaction.item.toys; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class YoyoPlugin extends OptionHandler { + final static Animation PLAY = new Animation(1457); + final static Animation LOOP = new Animation(1458); + final static Animation WALK = new Animation(1459); + final static Animation CRAZY = new Animation(1460); + final static Item YOYO = new Item(4079); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition def = ItemDefinition.forId(YOYO.getId()); + def.getHandlers().put("option:play",this); + def.getHandlers().put("option:loop",this); + def.getHandlers().put("option:walk",this); + def.getHandlers().put("option:crazy",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + + switch(option){ + case "play": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(PLAY); + break; + case "loop": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(LOOP); + break; + case "walk": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(WALK); + break; + case "crazy": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(CRAZY); + break; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/toys/ZombieHeadPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/toys/ZombieHeadPlugin.java new file mode 100644 index 000000000..d5176feb0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/toys/ZombieHeadPlugin.java @@ -0,0 +1,44 @@ +package core.game.interaction.item.toys; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class ZombieHeadPlugin extends OptionHandler { + static final Item ZOMBIE_HEAD = new Item(6722); + static final Animation TALK_AT = new Animation(2840); + static final Animation DISPLAY = new Animation(2844); + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition def = ItemDefinition.forId(ZOMBIE_HEAD.getId()); + def.getHandlers().put("option:talk-at",this); + def.getHandlers().put("option:display",this); + def.getHandlers().put("option:question",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch(option){ + case "talk-at": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(TALK_AT); + player.sendChat("Alas!"); + break; + case "display": + player.getLocks().lockInteractions(2); + player.getAnimator().animate(DISPLAY); + player.sendChat("MWAHHAHAHAHAHAHA"); + break; + case "question": + //player.getDialogueInterpreter().open() + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/CapeDyeingPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/CapeDyeingPlugin.java new file mode 100644 index 000000000..205668399 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/CapeDyeingPlugin.java @@ -0,0 +1,165 @@ +/* +package core.game.interaction.item.withitem; + +import core.tools.Items; +import core.game.content.global.Dyes; +import core.game.content.global.action.SpecialLadders; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.InitializablePlugin; +import core.plugin.Plugin; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.stream.Stream; + +*/ +/** + * Handles the dyeing of a cape. + * @author afaroutdude + *//* + +@InitializablePlugin +public final class CapeDyeingPlugin extends UseWithHandler { + + */ +/** + * Constructs a new {@code CapeDyeingPlugin} {@code Object}. + *//* + + public CapeDyeingPlugin() { + super(Cape.getIds()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Cape c : Cape.values()) { + addHandler(c.getDye().getItem().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final boolean testCape = Cape.isCape(event.getBaseItem()); + final Item cape = Cape.isCape(event.getBaseItem()) ? event.getBaseItem() : event.getUsedItem(); + final Item dye = Cape.isCape(event.getBaseItem()) ? event.getUsedItem() : event.getBaseItem(); + final Item dyedCape = MAP_DYE_TO_CAPE.get(dye); + if (dyedCape == null) { + return false; + } + if (!cape.equals(dyedCape) && player.getInventory().containsItems(dye, cape) && player.getInventory().remove(dye, cape)) { + player.getInventory().add(dyedCape); + if (dye.equals(Dyes.BLACK.getItem())) { + player.getInventory().add(new Item(Items.VIAL_229)); + } + if (dye.equals(Dyes.PINK.getItem()) && !player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(2,5)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player,2,5,true); + } + } + return true; + } + + */ +/** + * A cape to dye. + * @author Vexia + *//* + + public enum Cape { + BLACK(Dyes.BLACK, new Item(1019)), + RED(Dyes.RED, new Item(1007)), + BLUE(Dyes.BLUE, new Item(1021)), + YELLOW(Dyes.YELLOW, new Item(1023)), + GREEN(Dyes.GREEN, new Item(1027)), + PURPLE(Dyes.PURPLE, new Item(1029)), + ORANGE(Dyes.ORANGE, new Item(1031)), + PINK(Dyes.PINK, new Item(6959)); + + */ +/** + * The dye for the cape. + *//* + + private final Dyes dye; + + */ +/** + * The cape item. + *//* + + private final Item cape; + + */ +/** + * Constructs a new {@code Cape} {@code Object}. + * @param dye the dye. + * @param cape the cape. + *//* + + Cape(Dyes dye, Item cape) { + this.dye = dye; + this.cape = cape; + } + + */ +/** + * Gets the dye. + * @return The dye. + *//* + + public Dyes getDye() { + return dye; + } + + */ +/** + * Gets the cape. + * @return The cape. + *//* + + public Item getCape() { + return cape; + } + + */ +/** + * @return an int array of all cape IDs + *//* + + static public int[] getIds() { + return Stream.of(Cape.values()) + .map(Cape::getCape) + .map(Item::getId) + .mapToInt(Integer::intValue).toArray(); + } + + */ +/** + * @param potentiallyCape + * @return true if passed item is a cape that we can handle + *//* + + static public boolean isCape(Item potentiallyCape){ + for (Cape c : Cape.values()) { + if (c.getCape().getId() == potentiallyCape.getId()) { + return true; + } + } + return false; + } + } + + public static HashMap MAP_DYE_TO_CAPE = new HashMap<>(); + static { + for (Cape c : Cape.values()) { + MAP_DYE_TO_CAPE.putIfAbsent(c.getDye().getItem(), c.getCape()); + } + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/CapeDyer.kt b/Server/src/main/java/Server/core/game/interaction/item/withitem/CapeDyer.kt new file mode 100644 index 000000000..dbabc9ad3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/CapeDyer.kt @@ -0,0 +1,76 @@ +package core.game.interaction.item.withitem + +import core.game.content.global.Dyes +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +private val CAPES = arrayOf(1019,1007,1021,1023,1027,1029,1031,6959) +private val DYES = Dyes.values().map { it -> it.item.id }.toIntArray() + +@Initializable +//For the super constructor we have to use all but the very last cape because its ID is higher than the ID of all dyes +class CapeDyer : UseWithHandler(*CAPES.copyOfRange(0,CAPES.size - 2).toIntArray()) { + override fun newInstance(arg: Any?): Plugin { + for(dye in DYES){ + addHandler(dye, ITEM_TYPE,this) + } + addHandler(6959, ITEM_TYPE,this) //Pink cape has to be here because higher ID than others + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val used = event.used.id + val with = event.usedWith.id + var cape: Item + var dye: Item + + if(CAPES.contains(used) && DYES.contains(with)){ + cape = event.used.asItem() + dye = event.used.asItem() + } else if (DYES.contains(used) && CAPES.contains(with)){ + cape = event.usedWith.asItem() + dye = event.used.asItem() + } else { + return false + } + + val product = Cape.forDye(dye.id) ?: return false + + if(player.inventory.remove(dye) && player.inventory.remove(cape)){ + player.inventory.add(product.product) + player.inventory.add(Item(Items.VIAL_229)) + player.sendMessage("You dye the cape.") + } + return true + } + + internal enum class Cape(val dye : Dyes,val product : Item) { + BLACK(Dyes.BLACK, Item(1019)), + RED(Dyes.RED, Item(1007)), + BLUE(Dyes.BLUE, Item(1021)), + YELLOW(Dyes.YELLOW, Item(1023)), + GREEN(Dyes.GREEN, Item(1027)), + PURPLE(Dyes.PURPLE, Item(1029)), + ORANGE(Dyes.ORANGE, Item(1031)), + PINK(Dyes.PINK, Item(6959)); + + companion object { + fun forDye(dye: Int): Cape? { + for (cape in values()) { + if (cape.dye.item.id == dye) { + return cape + } + } + return null + } + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/ChestKeyPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/ChestKeyPlugin.java new file mode 100644 index 000000000..239cd1322 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/ChestKeyPlugin.java @@ -0,0 +1,56 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the usage of a chest key on the chest. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ChestKeyPlugin extends UseWithHandler { + + /** + * Represents the chest key item. + */ + private static final Item CHEST_KEY = new Item(432); + + /** + * Represents the pirate message item. + */ + private static final Item PIRATE_MESSAGE = new Item(433); + + /** + * Constructs a new {@code ChestKeyPlugin} {@code Object}. + */ + public ChestKeyPlugin() { + super(432); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2079, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(CHEST_KEY)) { + ObjectBuilder.replace((GameObject) event.getUsedWith(), ((GameObject) event.getUsedWith()).transform(2080), 3); + player.getInventory().add(PIRATE_MESSAGE); + player.getPacketDispatch().sendMessage("You unlock the chest."); + player.getPacketDispatch().sendMessage("All that's in the chest is a message..."); + player.getPacketDispatch().sendMessage("You take the message from the chest."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/CrystalKeyCreatePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/CrystalKeyCreatePlugin.java new file mode 100644 index 000000000..63e8275c0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/CrystalKeyCreatePlugin.java @@ -0,0 +1,46 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the creation of a crystal key. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CrystalKeyCreatePlugin extends UseWithHandler { + + /** + * Represents the crystal key item. + */ + private static final Item KEY = new Item(989, 1); + + /** + * Constructs a new {@code CrystalKeyCreatePlugin} {@code Object}. + */ + public CrystalKeyCreatePlugin() { + super(985); + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(event.getBaseItem(), event.getUsedItem())) { + player.getInventory().add(KEY); + player.getPacketDispatch().sendMessage("You join the loop half of a key and the tooth half of a key to make a crystal key."); + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(987, ITEM_TYPE, this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/DarkBowDyePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/DarkBowDyePlugin.java new file mode 100644 index 000000000..67ad1dab6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/DarkBowDyePlugin.java @@ -0,0 +1,121 @@ +package core.game.interaction.item.withitem; +import core.game.content.dialogue.DialogueAction; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * The plugin used to dye a dark bow into a more one. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class DarkBowDyePlugin extends UseWithHandler { + + + /** + * Constructs a new {@code DarkBowDyePlugin} {@code Object}. + */ + public DarkBowDyePlugin() { + super(11235); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(14795, ITEM_TYPE, this); + addHandler(14797, ITEM_TYPE, this); + addHandler(14799, ITEM_TYPE, this); + addHandler(14801, ITEM_TYPE, this); + PluginManager.definePlugin(new DarkBowCleanPlugin()); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.getDialogueInterpreter().sendOptions("Apply "+event.getUsedItem().getName().replace("dark bow paint", "paint?").toLowerCase(), "Yes", "No"); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 2: + if (player.getInventory().remove(event.getBaseItem()) && player.getInventory().remove(event.getUsedItem())) { + player.getInventory().add(getResult(event.getUsedItem().getId())); + player.sendMessage("You dye the bow into a more fashionable version."); + } + break; + } + } + + }); + return true; + } + + /** + * Gets the resulting colored dark bow. + * @return the item + */ + private Item getResult(int dyeId){ + switch(dyeId){ + case 14797: + return new Item(14803, 1); + case 14795: + return new Item(14804, 1); + case 14799: + return new Item(14805, 1); + case 14801: + return new Item(14806, 1); + } + return null; + } + + /** + * Cleans the dark bow and removes the paint. + * @author Andrew + */ + public final class DarkBowCleanPlugin extends UseWithHandler { + + /** + * Constructs a new {@code DarkBowCleanPlugin} {@code Object}. + */ + public DarkBowCleanPlugin() { + super(3188); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(14803, ITEM_TYPE, this); + addHandler(14804, ITEM_TYPE, this); + addHandler(14805, ITEM_TYPE, this); + addHandler(14806, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.getDialogueInterpreter().sendOptions("Wipe the paint off?", "Yes", "No"); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 2: + if (player.getInventory().remove(event.getBaseItem()) && player.getInventory().remove(event.getUsedItem())) { + player.getInventory().add(new Item(11235, 1)); + player.sendMessage("You wipe the paint off with the cleaning cloth, then toss it away."); + } + break; + } + } + + }); + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/FirelighterPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/FirelighterPlugin.java new file mode 100644 index 000000000..9042a0778 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/FirelighterPlugin.java @@ -0,0 +1,105 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to turn regular logs into a different colour. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class FirelighterPlugin extends UseWithHandler { + + /** + * Represents the logs item. + */ + private static final Item LOGS = new Item(1511); + + /** + * Constructs a new {@code FirelighterPlugin} {@code Object}. + */ + public FirelighterPlugin() { + super(1511); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (FireLighter lighter : FireLighter.values()) { + addHandler(lighter.getLighter().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final FireLighter lighter = FireLighter.forLighter(event.getUsedItem().getId() == 1511 ? event.getBaseItem() : event.getUsedItem()); + if (player.getInventory().remove(lighter.getLighter(), LOGS)) { + player.getInventory().add(lighter.getLog()); + } + return true; + } + + /** + * Represents a fire lighter. + * @author 'Vexia + * @date 28/12/2013 + */ + public enum FireLighter { + RED(new Item(7329), new Item(7404)), GREEN(new Item(7330), new Item(7405)), BLUE(new Item(7331), new Item(7406)), PURPLE(new Item(10326), new Item(10329)), WHITE(new Item(10327), new Item(10328)); + + /** + * Represents the fire lighter. + */ + private final Item lighter; + + /** + * Represents the log to turn into. + */ + private final Item log; + + /** + * Constructs a new {@code FirelighterPlugin.java} {@code Object}. + * @param lighter the lighter. + * @param log the log. + */ + FireLighter(Item lighter, Item log) { + this.lighter = lighter; + this.log = log; + } + + /** + * Gets the lighter. + * @return The lighter. + */ + public Item getLighter() { + return lighter; + } + + /** + * Gets the log. + * @return The log. + */ + public Item getLog() { + return log; + } + + /** + * Gets the fire lighter from the lighter used. + * @return the fire lighter data. + */ + public static FireLighter forLighter(final Item item) { + for (FireLighter lighter : values()) { + if (lighter.getLighter().getId() == item.getId()) { + return lighter; + } + } + return null; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/FishfoodPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/FishfoodPlugin.java new file mode 100644 index 000000000..33a02d078 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/FishfoodPlugin.java @@ -0,0 +1,117 @@ +package core.game.interaction.item.withitem; + +import core.tools.Items; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.util.Arrays; + +/** + * Represents the poison fish food making plugin. + * @author afaroutdude, fixed by Ceikry + */ +@Initializable +public final class FishfoodPlugin extends UseWithHandler { + + /** + * Represents the poisoned fish food item. + */ + private static final int FISH_FOOD = Items.FISH_FOOD_272; + private static final int POISON = Items.POISON_273; + private static final int POISONED_FISH_FOOD = Items.POISONED_FISH_FOOD_274; + + protected enum FishFoodUses{ + POISONED(POISON, FISH_FOOD, POISONED_FISH_FOOD, "You poison the fish food."), + GUAMBOX(Items.GROUND_GUAM_6681, Items.AN_EMPTY_BOX_6675, Items.GUAM_IN_A_BOX_6677, "You put the ground Guam into the box."), + SEAWEEDBOX(Items.GROUND_SEAWEED_6683, Items.AN_EMPTY_BOX_6675, Items.SEAWEED_IN_A_BOX_6679, "You put the ground Seaweed into the box."), + FOOD1(Items.GROUND_SEAWEED_6683, Items.GUAM_IN_A_BOX_6677, FISH_FOOD, "You put the ground Seaweed into the box and make Fish Food."), + FOOD2(Items.GROUND_GUAM_6681, Items.SEAWEED_IN_A_BOX_6679, FISH_FOOD, "You put the ground Guam into the box and make Fish Food."), + FISHBOWL(Items.FISHBOWL_6668, Items.SEAWEED_401, Items.FISHBOWL_6669, "You place the seaweed in the bowl."); + + + private final int used; + private final int with; + private final int product; + private final String msg; + + static protected int[] usables = Arrays.stream(FishFoodUses.values()) + .mapToInt(v -> v.used) + .toArray(); + + FishFoodUses(int used, int with, int product, String msg) { + this.used = used; + this.with = with; + this.product = product; + this.msg = msg; + } + + protected static Item productFor(int used, int with) { + for (FishFoodUses value : values()) { + if (value.used == used && value.with == with) { + return new Item(value.product); + } + } + return null; + } + + protected static String msgFor(int used, int with) { + for (FishFoodUses value : values()) { + if (value.used == used && value.with == with) { + return value.msg; + } + } + return null; + } + } + + + /** + * Constructs a new {@code FishfoodPlugin} {@code Object}. + */ + public FishfoodPlugin() { + super(FishFoodUses.usables); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (FishFoodUses value : FishFoodUses.values()) { + addHandler(value.with, ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + int used = event.getUsedItem().getId(); + int with = event.getBaseItem().getId(); + Item product = FishFoodUses.productFor(used, with); + + player.getPulseManager().run(new Pulse(1, player) { + @Override + public boolean pulse() { + if (player.getInventory().remove(new Item(with),new Item(used))) { + player.animate(new Animation(1309)); + player.getPacketDispatch().sendMessage(FishFoodUses.msgFor(used, with)); + player.getInventory().add(product); + player.lock(2); + } + return true; + } + + @Override + public void stop() { + super.stop(); + } + }); + + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/FruitCuttingPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/FruitCuttingPlugin.java new file mode 100644 index 000000000..be63c6eee --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/FruitCuttingPlugin.java @@ -0,0 +1,272 @@ +package core.game.interaction.item.withitem; + +import core.game.component.Component; +import core.plugin.Initializable; +import core.tools.Items; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the fruit cutting plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FruitCuttingPlugin extends UseWithHandler { + + /** + * Represents the cutting banana animation. + */ + private static final Animation ANIMATION = new Animation(1192); + + /** + * Constructs a new {@code FruitCuttingPlugin} {@code Object}. + */ + public FruitCuttingPlugin() { + super(946); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Fruit fruit : Fruit.values()) { + addHandler(fruit.getBase().getId(), ITEM_TYPE, this); + } + new FruitCuttingDialogue().init(); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Fruit fruit = Fruit.forBase(event.getUsedItem()); + if (fruit == Fruit.BANANA || fruit == Fruit.LEMON) { + if (player.getInventory().remove(fruit.getBase())) { + player.lock(2); + player.animate(ANIMATION); + player.getInventory().add(fruit.getSliced()); + player.getPacketDispatch().sendMessage("You deftly chop the "+ fruit.name().toLowerCase() + " into slices."); + } + return true; + } + player.getDialogueInterpreter().open(31237434, fruit); + return true; + } + + /** + * Represents the a fruit to cut. + * @author 'Vexia + * @date 30/11/2013 + */ + public enum Fruit { + PINEAPPLE(new Item(2114), new Item(2116), new Item(2118, 4)), + BANANA(new Item(1963), null, new Item(3162)), + LEMON(new Item(2102), new Item(Items.LEMON_CHUNKS_2104), new Item(2106)), + LIME(new Item(Items.LIME_2120),new Item(Items.LIME_CHUNKS_2122), new Item(Items.LIME_SLICES_2124)), + ORANGE(new Item(2108), new Item(2110), new Item(2112)); + + /** + * Constructs a new {@code FruitCuttingPlugin.java} {@code Object}. + * @param base the base item. + * @param diced the diced item. + * @param sliced the sliced item. + */ + Fruit(Item base, Item diced, Item sliced) { + this.base = base; + this.diced = diced; + this.sliced = sliced; + } + + /** + * Represents the base item. + */ + private final Item base; + + /** + * Represents the diced item. + */ + private final Item diced; + + /** + * Represents the sliced item. + */ + private final Item sliced; + + /** + * Gets the base. + * @return The base. + */ + public Item getBase() { + return base; + } + + /** + * Gets the diced. + * @return The diced. + */ + public Item getDiced() { + return diced; + } + + /** + * Gets the sliced. + * @return The sliced. + */ + public Item getSliced() { + return sliced; + } + + /** + * Method used to get the fruit for the base item. + * @param item the item. + * @return the fruit. + */ + public static Fruit forBase(final Item item) { + for (Fruit fruit : values()) { + if (fruit.getBase().getId() == item.getId()) { + return fruit; + } + } + return null; + } + } + + /** + * Represents the dialogue plugin used to cut fruit. + * @author 'Vexia + * @version 1.0 + */ + public static final class FruitCuttingDialogue extends DialoguePlugin { + + /** + * Represents the component interface. + */ + private static final Component COMPONENT = new Component(140); + + /** + * Represents the fruit. + */ + private Fruit fruit; + + /** + * Represents the fruit to cut. + */ + private Item item; + + /** + * Represents if its a sliced cut. + */ + private boolean slice; + + /** + * Constructs a new {@code FruitCuttingDialogue} {@code Object}. + */ + public FruitCuttingDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FruitCuttingDialogue} {@code Object}. + * @param player the player. + */ + public FruitCuttingDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FruitCuttingDialogue(player); + } + + @Override + public boolean open(Object... args) { + fruit = ((Fruit) args[0]); + player.getPacketDispatch().sendString("Would you like to...", 140, 4); + player.getPacketDispatch().sendItemOnInterface(fruit.getSliced().getId(), 1, 140, 5); + player.getPacketDispatch().sendItemOnInterface(fruit.getDiced().getId(), 1, 140, 6); + player.getPacketDispatch().sendString("Slice the " + fruit.getBase().getName().toLowerCase() + ".", 140, 2); + player.getPacketDispatch().sendString("Dice the " + fruit.getBase().getName().toLowerCase() + ".", 140, 3); + player.getInterfaceManager().openChatbox(COMPONENT); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player.getInterfaceManager().openChatbox(309); + player.getPacketDispatch().sendItemZoomOnInterface(1, 160, 309, 2); + slice = buttonId == 2 ? false : true; + item = buttonId == 2 ? fruit.getDiced() : fruit.getSliced(); + player.getPacketDispatch().sendString("



" + item.getName(), 309, 6); + player.getPacketDispatch().sendItemZoomOnInterface(item.getId(), 175, 309, 2); + stage = 1; + break; + case 1: + int amount = 0; + switch (buttonId) { + case 6: + amount = 1; + break; + case 5: + amount = 5; + break; + case 4: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + cut(player, ammount, slice); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount"); + return true; + case 3: + amount = player.getInventory().getAmount(fruit.getBase()); + break; + } + cut(player, amount, slice); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 31237434 }; + } + + /** + * Method used to cut a fruit. + * @param player the player. + * @param amount the amount. + * @param slice if its sliced. + */ + private final void cut(final Player player, int amount, boolean slice) { + if (amount > player.getInventory().getAmount(fruit.getBase())) { + amount = player.getInventory().getAmount(fruit.getBase()); + } + end(); + final Item remove = new Item(fruit.getBase().getId(), amount); + if (!player.getInventory().containsItem(remove)) { + return; + } + if (player.getInventory().remove(remove)) { + player.getPacketDispatch().sendMessage("You cut the " + fruit.name().toLowerCase() + " into " + (slice ? fruit == Fruit.PINEAPPLE ? "rings" : "slices" : "chunks") + "."); + for (int i = 0; i < amount; i++) { + player.getInventory().add(slice ? fruit.getSliced() : fruit.getDiced()); + } + } + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/GodswordHiltAttachPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/GodswordHiltAttachPlugin.java new file mode 100644 index 000000000..67804f9a1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/GodswordHiltAttachPlugin.java @@ -0,0 +1,57 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.StringUtils; + +/** + * Handles the attaching of a hilt on the godsword blade. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class GodswordHiltAttachPlugin extends UseWithHandler { + + /** + * Constructs a new {@code GodswordHiltAttachPlugin} {@code Object}. + */ + public GodswordHiltAttachPlugin() { + super(11702, 11704, 11706, 11708); + } + + @Override + public boolean handle(NodeUsageEvent event) { + Item item = event.getUsedItem(); + if (item == null) + return false; + Item baseItem = event.getBaseItem(); + Player player = event.getPlayer(); + if (!player.getInventory().containsItem(item) || !player.getInventory().containsItem(baseItem)) { + return false; + } + if (player.getInventory().replace(null, item.getSlot(), false) != item || player.getInventory().replace(null, baseItem.getSlot(), false) != baseItem) { + player.getInventory().update(); + return false; + } + item = new Item(item.getId() - 8); + player.getInventory().add(item); + String name = item.getDefinition().getName(); + player.getPacketDispatch().sendMessage("You attach the hilt to the blade and make a" + (StringUtils.isPlusN(name) ? "n " : " ") + name + "."); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + // In case of item-on-item: register the lowest item id - in this case + // godsword blade) + // (eg. if one item is 1521 and the other is 842 -> 842 should be + // registered) + addHandler(11690, ITEM_TYPE, this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/GraniteMaulPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/GraniteMaulPlugin.java new file mode 100644 index 000000000..8c6f3bb73 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/GraniteMaulPlugin.java @@ -0,0 +1,100 @@ +package core.game.interaction.item.withitem; + +import core.cache.def.impl.ItemDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueAction; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * The plugin used to make the granite maul into the ornamental version. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class GraniteMaulPlugin extends UseWithHandler { + + + /** + * Constructs a new {@code GraniteMaulPlugin} {@code Object}. + */ + public GraniteMaulPlugin() { + super(4153); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new GraniteMaulRevertHandler()); + addHandler(14793, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.getDialogueInterpreter().sendOptions("Attach the clamp?", "Yes", "No"); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 2: + if (player.getInventory().remove(event.getBaseItem()) && player.getInventory().remove(event.getUsedItem())) { + player.getInventory().add(new Item(14792, 1)); + player.sendMessage("You attach the clamp to the granite maul, making it slightly more fashionable."); + } + break; + } + } + + }); + return true; + } + + /** + * Handles the removal of the ornamental kit. + * @author Splinter + */ + public final class GraniteMaulRevertHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(14792).getHandlers().put("option:revert", this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Item item = (Item) node; + player.getDialogueInterpreter().sendOptions("Remove the clamp?", "Yes", "No"); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 2: + if(player.getInventory().remove(item)){ + player.getInventory().add(new Item(4153, 1)); + player.sendMessage("You remove the clamp from your maul, and in the process, it is destroyed."); + } + break; + } + } + + }); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/GraniteSplittingPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/GraniteSplittingPlugin.java new file mode 100644 index 000000000..46bccd928 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/GraniteSplittingPlugin.java @@ -0,0 +1,64 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Used to handle the reward of splitting granite with a chisel in to smaller + * pieces. + * @author Splinter + */ +@Initializable +public class GraniteSplittingPlugin extends UseWithHandler { + + public GraniteSplittingPlugin() { + super(1755); + } + + /** + * Represents the 5kg granite + */ + private static final Item FIVE_KG = new Item(6983, 1); + + /** + * Represents the 2kg granite + */ + private static final Item TWO_KG = new Item(6981, 1); + + @Override + public boolean handle(NodeUsageEvent event) { + if (event.getUsedItem().getId() == 6981) { + if (event.getPlayer().getInventory().freeSlots() < 4) { + event.getPlayer().getPacketDispatch().sendMessage("You need four inventory slots to split this."); + } else { + if (event.getPlayer().getInventory().remove(TWO_KG)) { + event.getPlayer().getInventory().add(new Item(6979, 4)); + event.getPlayer().getPacketDispatch().sendMessage("You chisel the 2kg granite into four smaller pieces."); + } + } + } + if (event.getUsedItem().getId() == 6983) { + if (event.getPlayer().getInventory().freeSlots() < 4) { + event.getPlayer().getPacketDispatch().sendMessage("You need four inventory slots to split this."); + } else { + if (event.getPlayer().getInventory().remove(FIVE_KG)) { + event.getPlayer().getInventory().add(new Item(6981, 2)); + event.getPlayer().getInventory().add(new Item(6979, 2)); + event.getPlayer().getPacketDispatch().sendMessage("You chisel the 5kg granite into four smaller pieces."); + } + } + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(6981, ITEM_TYPE, this); + addHandler(6983, ITEM_TYPE, this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/ImpJarCreatePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/ImpJarCreatePlugin.java new file mode 100644 index 000000000..408772099 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/ImpJarCreatePlugin.java @@ -0,0 +1,161 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the creating of an imp jar. + * @author Vexia + */ +@Initializable +public final class ImpJarCreatePlugin extends UseWithHandler { + + /** + * The flower ids. + */ + private static final int[] FLOWERS = new int[] { 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477 }; + + /** + * Constructs a new {@code ImpJarCreatePlugin} {@code Object}. + */ + public ImpJarCreatePlugin() { + super(6097, 11264, 1939, 4525, 4535, 4546, 4700, 11262, 10012); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(11266, ITEM_TYPE, this); + for (int i : FLOWERS) { + addHandler(i, ITEM_TYPE, this); + } + for (int i : getValidChildren(5908)) { + addHandler(i, OBJECT_TYPE, this); + } + addHandler(5909, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + if (event.getUsedWith() instanceof GameObject) { + if ((event.getUsedItem().getId() >= 4525 && event.getUsedItem().getId() <= 4700) || event.getUsedItem().getId() == 1939 || event.getUsedItem().getId() == 11262 || event.getUsedItem().getId() == 10012) { + fillOilStill(player, event.getUsedItem()); + } + return true; + } + if (((Item) event.getUsedWith()).getId() == 6097) { + makeOil(player); + } else if (event.getUsedItem().getId() == 11264) { + makeRepellent(player, event.getUsedItem(), (Item) event.getUsedWith()); + } + return true; + } + + /** + * Fills the oil still. + * @param player the player. + */ + private void fillOilStill(Player player, Item used) { + int configValue = player.getConfigManager().get(425); + if (used.getId() == 11262 || used.getId() == 10012) { + if (configValue == 0 && used.getId() == 11262) { + player.getInventory().replace(new Item(229), used.getSlot()); + player.sendMessage("You refine some imp repellent."); + player.getConfigManager().set(425, 64, true); + return; + } else if (configValue == 32) { + player.sendMessage("There is already lamp oil in the still."); + return; + } else if (configValue == 64) { + if (used.getId() == 11262) { + player.sendMessage("There is already imp repellent in the still."); + } else { + player.getInventory().replace(new Item(11260), used.getSlot()); + player.getConfigManager().set(425, 0, true); + player.sendMessage("You turn the butterfly jar into an impling jar."); + } + return; + } + player.sendMessage("There is no refined imp repellent in the still."); + return; + } + if (configValue == 64) { + player.sendMessage("There is already imp repellent in the still."); + return; + } + if (configValue == 32 && used.getId() == 1939) { + player.sendMessage("There is already lamp oil in the still."); + return; + } + if (used.getId() == 1939) { + if (player.getInventory().remove(new Item(1939))) { + player.getConfigManager().set(425, 32, true); + player.sendMessage("You refine some swamp tar into lamp oil."); + } + } else { + if (configValue == 0) { + player.sendMessage("There is no oil in the still."); + } else { + if (player.getInventory().contains(4525, 1) || player.getInventory().contains(4535, 1) || player.getInventory().contains(4546, 1) || player.getInventory().contains(4700, 1)) { + Item replace = new Item(used.getId() == 4525 ? 4522 : used.getId() == 4535 ? 4537 : used.getId() == 4546 ? 4548 : 4701); + player.getInventory().replace(replace, used.getSlot()); + player.getConfigManager().set(425, 0, true); + player.sendMessage("You fill the item with oil."); + } + } + } + } + + /** + * Makes imp repellent. + * @param player the player. + * @param usedWith the used item. + */ + private void makeRepellent(Player player, Item oil, Item usedWith) { + if (isFlower(usedWith.getId())) { + if (player.getInventory().remove(usedWith)) { + player.getInventory().replace(new Item(11262), oil.getSlot()); + player.sendMessage("You mix the flower petals with the anchovy oil to make a very strange-smelling concoction."); + ; + } + } + } + + /** + * Makes anchovy oil. + * @param player the player. + */ + private void makeOil(Player player) { + if (!player.getInventory().contains(229, 1)) { + player.sendMessage("You need an empty vial to put your anchovy oil into."); + return; + } + if (!player.getInventory().contains(11266, 8)) { + player.sendMessage("You need 8 anchovy paste's in order to make anchovy oil."); + return; + } + if (player.getInventory().remove(new Item(11266, 8), new Item(229))) { + player.getInventory().add(new Item(11264)); + } + } + + /** + * Checks if the id is a flower. + * @param id the id. + * @return {@code True} if so. + */ + private boolean isFlower(int id) { + for (int i : FLOWERS) { + if (i == id) { + return true; + } + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/KaramjanSilkPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/KaramjanSilkPlugin.java new file mode 100644 index 000000000..f0441e4c3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/KaramjanSilkPlugin.java @@ -0,0 +1,51 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the karamjan silk plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class KaramjanSilkPlugin extends UseWithHandler { + + /** + * Represents the cloth item. + */ + private static final Item CLOTH = new Item(3188); + + /** + * Represents the silk item. + */ + private static final Item SILK = new Item(950); + + /** + * Constructs a new {@code KaramjanSilkPlugin} {@code Object}. + */ + public KaramjanSilkPlugin() { + super(950); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(431, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(SILK)) { + player.getInventory().add(CLOTH); + player.getPacketDispatch().sendMessage("You pour some of the Karamjan rum over the silk."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/LavaScalePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/LavaScalePlugin.java new file mode 100644 index 000000000..426978a2a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/LavaScalePlugin.java @@ -0,0 +1,105 @@ +package core.game.interaction.item.withitem; + +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the grinding of Lava Scales. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class LavaScalePlugin extends UseWithHandler { + + /** + * Constructs a new {@code LavaScalePlugin} {@code Object}. + */ + public LavaScalePlugin() { + super(14695); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(233, ITEM_TYPE, this); + PluginManager.definePlugin(new AntifireMakePlugin()); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + if(player.getInventory().remove(new Item(14695))){ + player.getInventory().add(new Item(14768, RandomFunction.random(3, 6))); + player.animate(new Animation(364)); + player.sendMessage("You grind the scales into fine shards."); + } + return true; + } + + /** + * Handles the making of the Extended antifire potion. + * It's apparently not made like regular potions. + * @author Splinter + * @version 1.0 + */ + public final class AntifireMakePlugin extends UseWithHandler { + + /** + * Constructs a new {@code LavaScalePlugin} {@code Object}. + */ + public AntifireMakePlugin() { + super(2454, 2456, 2458, 2452); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(14768, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + int count = player.getInventory().getAmount(event.getUsedWith().asItem()); + int total = count * getReq(event.getUsedWith().asItem().getId()); + if(player.getInventory().contains(14768, total)){ + player.getInventory().remove(new Item(14768, total), new Item(event.getUsedWith().getId(), count)); + player.getInventory().add(new Item(event.getUsedWith().getId() + 12301, count)); + player.animate(new Animation(363)); + player.getSkills().addExperience(Skills.HERBLORE, 27.5 * total); + player.sendMessages("You drop a total of "+(total)+" lava scales in the potions and upgrade all of the", "potions of the same dose into extended antifire potions."); + } else { + player.sendMessage("You don't have enough shards to upgrade all your potions of that dose."); + } + return true; + } + + } + + /** + * Get the required amount of shards. + * @return + */ + public int getReq(int id){ + switch(id){ + case 2452: + return 4; + case 2454: + return 3; + case 2456: + return 2; + case 2458: + return 1; + } + return 4; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/MakeGlassInterfacePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/MakeGlassInterfacePlugin.java new file mode 100644 index 000000000..6411dafad --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/MakeGlassInterfacePlugin.java @@ -0,0 +1,71 @@ +package core.game.interaction.item.withitem; + +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.GlassProduct; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Represents the plugin used to make glass. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class MakeGlassInterfacePlugin extends UseWithHandler { + + /** + * Constructs a new {@code MakeGlassInterfacePlugin} {@code Object}. + */ + public MakeGlassInterfacePlugin() { + super(1775); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1785, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + event.getPlayer().getInterfaceManager().open(new Component(542)); + final Player player = event.getPlayer(); + switch (GlassProduct.BEER) { + case BEER: + break; + case CANDLE: + if (player.getSkills().getLevel(Skills.CRAFTING) < 4) + player.getPacketDispatch().sendString("Candle lantern", 542, 25); + break; + case FISHBOWL: + if (player.getSkills().getLevel(Skills.CRAFTING) < 42) + player.getPacketDispatch().sendString("Fish Bowl", 542, 28); + break; + case LANTERN_LENS: + if (player.getSkills().getLevel(Skills.CRAFTING) < 49) + player.getPacketDispatch().sendString("Lantern lens", 542, 27); + break; + case OIL_LAMP: + if (player.getSkills().getLevel(Skills.CRAFTING) < 12) + player.getPacketDispatch().sendString("Oil lamp", 542, 26); + break; + case ORB: + if (player.getSkills().getLevel(Skills.CRAFTING) < 46) + player.getPacketDispatch().sendString("Unpowered orb", 542, 23); + break; + case VIAL: + if (player.getSkills().getLevel(Skills.CRAFTING) < 33) + player.getPacketDispatch().sendString("Vial", 542, 22); + break; + default: + break; + + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/PoisonRemovePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/PoisonRemovePlugin.java new file mode 100644 index 000000000..bdcc200ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/PoisonRemovePlugin.java @@ -0,0 +1,332 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to remove poision from a weapon. + * @author 'Vexia + * @date 29/11/2013 + */ +@Initializable +public class PoisonRemovePlugin extends UseWithHandler { + + /** + * Constructs a new {@code PoisonRemovePlugin} {@code Object}. + */ + public PoisonRemovePlugin() { + super(883, 5616, 883, 885, 5617, 885, 887, 5618, 887, 889, 5619, 889, 891, 5620, 891, 893, 5621, 893, 871, 5655, 5662, 870, 5654, 5661, 872, 5656, 5663, 873, 5657, 5664, 875, 5659, 5666, 876, 5660, 5667, 874, 5658, 5665, 812, 5628, 5635, 813, 5629, 5636, 814, 5630, 5637, 3094, 5631, 5638, 815, 5632, 5639, 816, 5633, 5640, 817, 5634, 5641, 831, 5641, 5648, 832, 5642, 5649, 833, 5643, 5650, 834, 5644, 5651, 835, 5645, 5652, 836, 5646, 5653, 1219, 5668, 5686, 1221, 5670, 5688, 1223, 5672, 5690, 1225, 5674, 5692, 1227, 5676, 5694, 1229, 5678, 5696, 1231, 5680, 5698, 1233, 5682, 5700, 1251, 5704, 5618, 1253, 5706, 5620, 1255, 5708, 5622, 1257, 5710, 5624, 1259, 5712, 5626, 1261, 5714, 5628, 1263, 5716, 5630, 4582, 5734, 5636); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(3188, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final PoisonedWeapon weapon = PoisonedWeapon.forItem(event.getBaseItem().getName().contains("Cleaning") ? event.getUsedItem() : event.getBaseItem()); + if (weapon == null) { + return true; + } + if (player.getInventory().remove(event.getBaseItem().getName().contains("Cleaning") ? event.getUsedItem() : event.getBaseItem())) { + player.getInventory().add(new Item(weapon.getItem(), 1)); + } + return true; + } + + /** + * Represents the poisioning of a weapon. + * @author 'Vexia + */ + public enum PoisonedWeapon { + + /** + * Represents a poisioned weapon. + */ + BRONZE_ARROW(882, 883, 5616, 883), + /** + * Represents a poisioned weapon. + */ + IRON_ARROW(884, 885, 5617, 885), + /** + * Represents a poisioned weapon. + */ + STEEL_ARROW(886, 887, 5618, 887), + /** + * Represents a poisioned weapon. + */ + MITHRIL_ARROW(888, 889, 5619, 889), + /** + * Represents a poisioned weapon. + */ + ADAMANT_ARROW(890, 891, 5620, 891), + /** + * Represents a poisioned weapon. + */ + RUNE_ARROW(892, 893, 5621, 893), + /** + * Represents a poisioned weapon. + */ + IRON_KNIFE(863, 871, 5655, 5662), + /** + * Represents a poisioned weapon. + */ + RONZE_KNIFE(864, 870, 5654, 5661), + /** + * Represents a poisioned weapon. + */ + STEEL_KNIFE(865, 872, 5656, 5663), + /** + * Represents a poisioned weapon. + */ + MITHRIL_KNIFE(866, 873, 5657, 5664), + /** + * Represents a poisioned weapon. + */ + ADAMANT_KNIFE(867, 875, 5659, 5666), + /** + * Represents a poisioned weapon. + */ + RUNE_KNIFE(868, 876, 5660, 5667), + /** + * Represents a poisioned weapon. + */ + BLACK_KNIFE(869, 874, 5658, 5665), + /** + * Represents a poisioned weapon. + */ + BRONZE_DART(806, 812, 5628, 5635), + /** + * Represents a poisioned weapon. + */ + IRON_DART(807, 813, 5629, 5636), + /** + * Represents a poisioned weapon. + */ + STEEL_DART(808, 814, 5630, 5637), + /** + * Represents a poisioned weapon. + */ + BLACK_DART(3093, 3094, 5631, 5638), + /** + * Represents a poisioned weapon. + */ + MITHRIL_DART(809, 815, 5632, 5639), + /** + * Represents a poisioned weapon. + */ + ADAMANT_DART(810, 816, 5633, 5640), + /** + * Represents a poisioned weapon. + */ + RUNE_DART(811, 817, 5634, 5641), + /** + * Represents a poisioned weapon. + */ + IRON_JAVELIN(825, 831, 5641, 5648), + /** + * Represents a poisioned weapon. + */ + BRONZE_JAVELIN(826, 832, 5642, 5649), + /** + * Represents a poisioned weapon. + */ + STEEL_JAVELIN(827, 833, 5643, 5650), + /** + * Represents a poisioned weapon. + */ + MITHRIL_JAVELIN(828, 834, 5644, 5651), + /** + * Represents a poisioned weapon. + */ + ADAMANT_JAVELIN(829, 835, 5645, 5652), + /** + * Represents a poisioned weapon. + */ + RUNE_JAVELIN(830, 836, 5646, 5653), + /** + * Represents a poisioned weapon. + */ + IRON_DAGGER(1203, 1219, 5668, 5686), + /** + * Represents a poisioned weapon. + */ + BRONZE_DAGGER(1205, 1221, 5670, 5688), + /** + * Represents a poisioned weapon. + */ + STEEL_DAGGER(1207, 1223, 5672, 5690), + /** + * Represents a poisioned weapon. + */ + MITHRIL_DAGGER(1209, 1225, 5674, 5692), + /** + * Represents a poisioned weapon. + */ + ADAMANT_DAGGER(1211, 1227, 5676, 5694), + /** + * Represents a poisioned weapon. + */ + RUNE_DAGGER(1213, 1229, 5678, 5696), + /** + * Represents a poisioned weapon. + */ + DRAGON_DAGGER(1215, 1231, 5680, 5698), + /** + * Represents a poisioned weapon. + */ + BLACK_DAGGER(1217, 1233, 5682, 5700), + /** + * Represents a poisioned weapon. + */ + BRONZE_SPEAR(1237, 1251, 5704, 5618), + /** + * Represents a poisioned weapon. + */ + IRON_SPEAR(1239, 1253, 5706, 5620), + /** + * Represents a poisioned weapon. + */ + STEEL_SPEAR(1241, 1255, 5708, 5622), + /** + * Represents a poisioned weapon. + */ + MITHRIL_SPEAR(1243, 1257, 5710, 5624), + /** + * Represents a poisioned weapon. + */ + ADAMANT_SPEAR(1245, 1259, 5712, 5626), + /** + * Represents a poisioned weapon. + */ + RUNE_SPEAR(1247, 1261, 5714, 5628), + /** + * Represents a poisioned weapon. + */ + DRAGON_SPEAR(1249, 1263, 5716, 5630), + /** + * Represents a poisioned weapon. + */ + BLACK_SPEAR(4580, 4582, 5734, 5636); + + /** + * @param id the id. + * @return the value. + */ + public static PoisonedWeapon forId(int id) { + for (PoisonedWeapon weapon : PoisonedWeapon.values()) { + if (weapon.getItem() == id) { + return weapon; + } + } + return null; + } + + /** + * The item. + */ + private int item; + + /** + * The first stage. + */ + private int first; + + /** + * The second stage. + */ + private int second; + + /** + * The third stage. + */ + private int third; + + /** + * Constructs a new PoisionWeapon. + */ + PoisonedWeapon(int item, int first, int second, int third) { + this.item = item; + this.first = first; + this.second = second; + this.third = third; + } + + /** + * @return the first. + */ + public int getFirst() { + return first; + } + + /** + * @return the item. + */ + public int getItem() { + return item; + } + + /** + * @return the second. + */ + public int getSecond() { + return second; + } + + /** + * @return the third. + */ + public int getThird() { + return third; + } + + /** + * @param first the first to set. + */ + public void setFirst(int first) { + this.first = first; + } + + /** + * @param item the item to set. + */ + public void setItem(int item) { + this.item = item; + } + + /** + * @param second the second to set. + */ + public void setSecond(int second) { + this.second = second; + } + + /** + * @param third the third to set. + */ + public void setThird(int third) { + this.third = third; + } + + /** + * Method used to get the poisioned weapon for the id. + * @param i the id. + * @return the weapon. + */ + public static PoisonedWeapon forItem(final Item i) { + for (PoisonedWeapon weapon : values()) { + if (weapon.getFirst() == i.getId() || weapon.getSecond() == i.getId() || weapon.getThird() == i.getId()) { + return weapon; + } + } + return null; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/PoisonWeaponPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/PoisonWeaponPlugin.java new file mode 100644 index 000000000..c14a6dc77 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/PoisonWeaponPlugin.java @@ -0,0 +1,372 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles weapon poisiong. + * @author 'Vexia + */ +@Initializable +public class PoisonWeaponPlugin extends UseWithHandler { + + /** + * Represents the poisioning of a weapon. + * @author 'Vexia + */ + public enum PoisonedWeapon { + + /** + * Represents a poisioned weapon. + */ + BRONZE_ARROW(882, 883, 5616, 883), + /** + * Represents a poisioned weapon. + */ + IRON_ARROW(884, 885, 5617, 885), + /** + * Represents a poisioned weapon. + */ + STEEL_ARROW(886, 887, 5618, 887), + /** + * Represents a poisioned weapon. + */ + MITHRIL_ARROW(888, 889, 5619, 889), + /** + * Represents a poisioned weapon. + */ + ADAMANT_ARROW(890, 891, 5620, 891), + /** + * Represents a poisioned weapon. + */ + RUNE_ARROW(892, 893, 5621, 893), + /** + * Represents a poisioned weapon. + */ + IRON_KNIFE(863, 871, 5655, 5662), + /** + * Represents a poisioned weapon. + */ + RONZE_KNIFE(864, 870, 5654, 5661), + /** + * Represents a poisioned weapon. + */ + STEEL_KNIFE(865, 872, 5656, 5663), + /** + * Represents a poisioned weapon. + */ + MITHRIL_KNIFE(866, 873, 5657, 5664), + /** + * Represents a poisioned weapon. + */ + ADAMANT_KNIFE(867, 875, 5659, 5666), + /** + * Represents a poisioned weapon. + */ + RUNE_KNIFE(868, 876, 5660, 5667), + /** + * Represents a poisioned weapon. + */ + BLACK_KNIFE(869, 874, 5658, 5665), + /** + * Represents a poisioned weapon. + */ + BRONZE_DART(806, 812, 5628, 5635), + /** + * Represents a poisioned weapon. + */ + IRON_DART(807, 813, 5629, 5636), + /** + * Represents a poisioned weapon. + */ + STEEL_DART(808, 814, 5630, 5637), + /** + * Represents a poisioned weapon. + */ + BLACK_DART(3093, 3094, 5631, 5638), + /** + * Represents a poisioned weapon. + */ + MITHRIL_DART(809, 815, 5632, 5639), + /** + * Represents a poisioned weapon. + */ + ADAMANT_DART(810, 816, 5633, 5640), + /** + * Represents a poisioned weapon. + */ + RUNE_DART(811, 817, 5634, 5641), + /** + * Represents a poisioned weapon. + */ + IRON_JAVELIN(825, 831, 5641, 5648), + /** + * Represents a poisioned weapon. + */ + BRONZE_JAVELIN(826, 832, 5642, 5649), + /** + * Represents a poisioned weapon. + */ + STEEL_JAVELIN(827, 833, 5643, 5650), + /** + * Represents a poisioned weapon. + */ + MITHRIL_JAVELIN(828, 834, 5644, 5651), + /** + * Represents a poisioned weapon. + */ + ADAMANT_JAVELIN(829, 835, 5645, 5652), + /** + * Represents a poisioned weapon. + */ + RUNE_JAVELIN(830, 836, 5646, 5653), + /** + * Represents a poisioned weapon. + */ + IRON_DAGGER(1203, 1219, 5668, 5686), + /** + * Represents a poisioned weapon. + */ + BRONZE_DAGGER(1205, 1221, 5670, 5688), + /** + * Represents a poisioned weapon. + */ + STEEL_DAGGER(1207, 1223, 5672, 5690), + /** + * Represents a poisioned weapon. + */ + MITHRIL_DAGGER(1209, 1225, 5674, 5692), + /** + * Represents a poisioned weapon. + */ + ADAMANT_DAGGER(1211, 1227, 5676, 5694), + /** + * Represents a poisioned weapon. + */ + RUNE_DAGGER(1213, 1229, 5678, 5696), + /** + * Represents a poisioned weapon. + */ + DRAGON_DAGGER(1215, 1231, 5680, 5698), + /** + * Represents a poisioned weapon. + */ + BLACK_DAGGER(1217, 1233, 5682, 5700), + /** + * Represents a poisioned weapon. + */ + BRONZE_SPEAR(1237, 1251, 5704, 5618), + /** + * Represents a poisioned weapon. + */ + IRON_SPEAR(1239, 1253, 5706, 5620), + /** + * Represents a poisioned weapon. + */ + STEEL_SPEAR(1241, 1255, 5708, 5622), + /** + * Represents a poisioned weapon. + */ + MITHRIL_SPEAR(1243, 1257, 5710, 5624), + /** + * Represents a poisioned weapon. + */ + ADAMANT_SPEAR(1245, 1259, 5712, 5626), + /** + * Represents a poisioned weapon. + */ + RUNE_SPEAR(1247, 1261, 5714, 5628), + /** + * Represents a poisioned weapon. + */ + DRAGON_SPEAR(1249, 1263, 5716, 5730), + /** + * Represents a poisioned weapon. + */ + BLACK_SPEAR(4580, 4582, 5734, 5636); + + /** + * @param id the id. + * @return the value. + */ + public static PoisonedWeapon forId(int id) { + for (PoisonedWeapon weapon : PoisonedWeapon.values()) { + if (weapon.getItem() == id) { + return weapon; + } + } + return null; + } + + /** + * The item. + */ + private int item; + + /** + * The first stage. + */ + private int first; + + /** + * The second stage. + */ + private int second; + + /** + * The third stage. + */ + private int third; + + /** + * Constructs a new PoisionWeapon. + */ + PoisonedWeapon(int item, int first, int second, int third) { + this.item = item; + this.first = first; + this.second = second; + this.third = third; + } + + /** + * @return the first. + */ + public int getFirst() { + return first; + } + + /** + * @return the item. + */ + public int getItem() { + return item; + } + + /** + * @return the second. + */ + public int getSecond() { + return second; + } + + /** + * @return the third. + */ + public int getThird() { + return third; + } + + /** + * @param first the first to set. + */ + public void setFirst(int first) { + this.first = first; + } + + /** + * @param item the item to set. + */ + public void setItem(int item) { + this.item = item; + } + + /** + * @param second the second to set. + */ + public void setSecond(int second) { + this.second = second; + } + + /** + * @param third the third to set. + */ + public void setThird(int third) { + this.third = third; + } + + /** + * Method used to get the poisioned weapon for the id. + * @param i the id. + * @return the weapon. + */ + public static PoisonedWeapon forItem(final Item i) { + for (PoisonedWeapon weapon : values()) { + if (weapon.getFirst() == i.getId() || weapon.getSecond() == i.getId() || weapon.getThird() == i.getId()) { + return weapon; + } + } + return null; + } + } + + public static void poison(Player player, int type, int item, final Item weaponItem, PoisonedWeapon weapon) { + int product = -1; + player.animate(new Animation(1652)); + switch (item) { + case 187:// normal. + product = weapon.getFirst(); + player.getInventory().remove(new Item(187, 1)); + break; + case 5937:// second + product = weapon.getSecond(); + player.getInventory().remove(new Item(5937, 1)); + break; + case 5940:// third. + product = weapon.getThird(); + player.getInventory().remove(new Item(5940, 1)); + break; + } + int amt = weaponItem.getAmount() > 5 ? 5 : weaponItem.getAmount(); + player.getInventory().remove(new Item(weaponItem.getId(), amt)); + player.getInventory().add(new Item(229, 1)); + player.getInventory().add(new Item(product, amt)); + player.getPacketDispatch().sendMessage("You poison the " + weaponItem.getName().toLowerCase() + "."); + } + + public PoisonWeaponPlugin() { + super(882, 884, 886, 888, 890, 892, 863, 864, 865, 866, 867, 868, 869, 806, 807, 808, 3093, 809, 810, 811, 825, 826, 827, 828, 829, 830, 1203, 1205, 1207, 1209, 1211, 1213, 1215, 1217, 1237, 1239, 1241, 1243, 1245, 1247, 1249, 4580); + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Item second = (Item) event.getUsedWith(); + if (event.getUsedItem().getId() == 187 || second.getId() == 187) { + + if (event.getUsedItem().getId() != 187) { + poison(player, 1, second.getId(), event.getUsedItem(), PoisonedWeapon.forId(event.getUsedItem().getId())); + } else if (second.getId() != 187) { + poison(player, 1, event.getUsedItem().getId(), second, PoisonedWeapon.forId(second.getId())); + } + } + if (event.getUsedItem().getId() == 5937 || second.getId() == 5937) { + if (event.getUsedItem().getId() != 5937) { + poison(player, 2, second.getId(), event.getUsedItem(), PoisonedWeapon.forId(event.getUsedItem().getId())); + } else if (second.getId() != 5937) { + poison(player, 2, event.getUsedItem().getId(), second, PoisonedWeapon.forId(second.getId())); + } + } + if (event.getUsedItem().getId() == 5940 || second.getId() == 5940) { + if (event.getUsedItem().getId() != 5940) { + poison(player, 3, second.getId(), event.getUsedItem(), PoisonedWeapon.forId(event.getUsedItem().getId())); + } else if (second.getId() != 5940) { + poison(player, 3, event.getUsedItem().getId(), second, PoisonedWeapon.forId(second.getId())); + } + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(187, ITEM_TYPE, this); + addHandler(5937, ITEM_TYPE, this); + addHandler(5940, ITEM_TYPE, this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/SeasonedSardinePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/SeasonedSardinePlugin.java new file mode 100644 index 000000000..d27da8c40 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/SeasonedSardinePlugin.java @@ -0,0 +1,46 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin to make seasoned sardines. + * @author 'Vexia + * @date Oct 6, 2013 + */ +@Initializable +public class SeasonedSardinePlugin extends UseWithHandler { + + /** + * Represents the seasoned sardine. + */ + private final Item SEASONED_SARDINE = new Item(1552); + + /** + * Constructs a new {@code SeasonedSardinePlugina} {@code Object}. + */ + public SeasonedSardinePlugin() { + super(327); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1573, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(event.getUsedItem()) && player.getInventory().remove(event.getBaseItem())) { + player.getDialogueInterpreter().sendDialogue("You rub the doogle leaves over the sardine."); + player.getInventory().add(SEASONED_SARDINE); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/SkullSceptrePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/SkullSceptrePlugin.java new file mode 100644 index 000000000..450933140 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/SkullSceptrePlugin.java @@ -0,0 +1,53 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class SkullSceptrePlugin extends UseWithHandler { + + public SkullSceptrePlugin() { + super(9008, 9009, 9011); + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (event.getUsedItem().getId() == 9008 && ((Item) event.getUsedWith()).getId() == 9007) { + event.getPlayer().getInventory().remove(new Item(9008, 1)); + event.getPlayer().getInventory().remove(new Item(9007, 1)); + event.getPlayer().getInventory().add(new Item(9009, 1)); + event.getPlayer().getDialogueInterpreter().open(78489); + return true; + } + if (event.getUsedItem().getId() == 9011 && ((Item) event.getUsedWith()).getId() == 9010) { + event.getPlayer().getInventory().remove(new Item(9010, 1)); + event.getPlayer().getInventory().remove(new Item(9011, 1)); + event.getPlayer().getInventory().add(new Item(9012, 1)); + event.getPlayer().getDialogueInterpreter().open(78489, true); + return true; + } + if (event.getUsedItem().getId() == 9012 && ((Item) event.getUsedWith()).getId() == 9009) { + event.getPlayer().getInventory().remove(new Item(9009, 1)); + event.getPlayer().getInventory().remove(new Item(9012, 1)); + event.getPlayer().getInventory().add(new Item(9013, 1)); + event.getPlayer().getDialogueInterpreter().open(78489, true, true); + return true; + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(9007, ITEM_TYPE, this); + addHandler(9010, ITEM_TYPE, this); + addHandler(9012, ITEM_TYPE, this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/SoftclayPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/SoftclayPlugin.java new file mode 100644 index 000000000..312507dc1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/SoftclayPlugin.java @@ -0,0 +1,147 @@ +package core.game.interaction.item.withitem; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.tools.Items; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.plugin.Plugin; +import java.util.Objects; + +/** + * Represents the plugin used to make soft clay. + * @author 'Vexia + * @date 1/14/14 + */ +@Initializable +public final class SoftclayPlugin extends UseWithHandler { + + /** + * Represents the clay item. + */ + private static final Item CLAY = new Item(Items.CLAY_434); + + /** + * Represents the soft clay item. + */ + private static final Item SOFT_CLAY = new Item(Items.SOFT_CLAY_1761); + + /** + * Represents the bowl of water item. + */ + private static final Item BOWL_OF_WATER = new Item(Items.BOWL_OF_WATER_1921); + + /** + * Represents the empty bowl item. + */ + private static final Item BOWL = new Item(Items.BOWL_1923); + + /** + * Represents the empty bucket item. + */ + private static final Item BUCKET = new Item(Items.BUCKET_1925); + + /** + * Represents the bucket of water item. + */ + private static final Item BUCKET_OF_WATER = new Item(Items.BUCKET_OF_WATER_1929); + + /** + * Represents the jug item. + */ + private static final Item JUG = new Item(Items.JUG_1935); + + /** + * Represents the jug of water item. + */ + private static final Item JUG_OF_WATER = new Item(Items.JUG_OF_WATER_1937); + + /** + * Constructs a new {@code SoftclayPlugin} {@code Object}. + */ + public SoftclayPlugin() { + super(434); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1921, ITEM_TYPE, this); + addHandler(1929, ITEM_TYPE, this); + addHandler(1937, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, SOFT_CLAY) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new Pulse(2, player) { + int count; + + @Override + public boolean pulse() { + if (!SoftclayPlugin.this.create(player, event)) { + return true; + } + return ++count >= amount; + } + }); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(CLAY); + } + }; + if (player.getInventory().getAmount(CLAY) == 1) { + create(player, event); + } else { + handler.open(); + } + return true; + } + + /** + * Creates a soft clay. + * @param player the player. + * @param event the event. + * @return {@code True} if so. + */ + private boolean create(final Player player, NodeUsageEvent event) { + Item removeItem = null; + Item returnItem = null; + if (event.getUsedItem().getId() == Items.BUCKET_OF_WATER_1929 || event.getBaseItem().getId() == Items.BUCKET_OF_WATER_1929) { + removeItem = BUCKET_OF_WATER; + returnItem = BUCKET; + } + if (event.getUsedItem().getId() == Items.BOWL_OF_WATER_1921 || event.getBaseItem().getId() == Items.BOWL_OF_WATER_1921) { + removeItem = BOWL_OF_WATER; + returnItem = BOWL; + } + if (event.getUsedItem().getId() == Items.JUG_OF_WATER_1937 || event.getBaseItem().getId() == Items.JUG_OF_WATER_1937) { + removeItem = JUG_OF_WATER; + returnItem = JUG; + } + + if (player.getInventory().containsItem(CLAY) && player.getInventory().containsItem(Objects.requireNonNull(removeItem))) { + player.getInventory().remove(removeItem); + player.getInventory().remove(CLAY); + player.getPacketDispatch().sendMessage("You mix the clay and water. You now have some soft, workable clay."); + player.getInventory().add(SOFT_CLAY); + player.getInventory().add(returnItem); + if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.LUMBRIDGE, 0, 6) && player.getViewport().getRegion().getId() == 12341) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 6); + } + return true; + } else { + return false; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withitem/WaterSkinPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withitem/WaterSkinPlugin.java new file mode 100644 index 000000000..eabcda331 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withitem/WaterSkinPlugin.java @@ -0,0 +1,57 @@ +package core.game.interaction.item.withitem; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the water skin refilling plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WaterSkinPlugin extends UseWithHandler { + + /** + * Represents the full skill item. + */ + private final Item FULL_SKIN = new Item(1823); + + /** + * Represents data of water skin filling vessils. + */ + private final int[][] data = new int[][] { { 1937, 1935 }, { 1929, 1925 }, { 1921, 1923 }, { 227, 229 } }; + + /** + * Constructs a new {@code WaterSkinPlugin} {@code Object}. + */ + public WaterSkinPlugin() { + super(1825, 1827, 1829, 1831); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 0; i < data.length; i++) { + addHandler(data[i][0], ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Item waterSkin = event.getUsedItem().getName().contains("skin") ? event.getUsedItem() : event.getBaseItem(); + final Item vessil = !event.getUsedItem().getName().contains("skin") ? event.getUsedItem() : event.getBaseItem(); + if (event.getPlayer().getInventory().remove(waterSkin)) { + event.getPlayer().getInventory().add(vessil.getId() == 227 ? new Item(waterSkin.getId() - 2) : FULL_SKIN); + for (int i = 0; i < data.length; i++) { + if (data[i][0] == vessil.getId() && event.getPlayer().getInventory().remove(vessil)) { + event.getPlayer().getInventory().add(new Item(data[i][1])); + } + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withnpc/ForestersArmsCiderPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withnpc/ForestersArmsCiderPlugin.java new file mode 100644 index 000000000..5b6b518aa --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withnpc/ForestersArmsCiderPlugin.java @@ -0,0 +1,50 @@ +package core.game.interaction.item.withnpc; + +import core.tools.Items; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to "poison" King Arthur. + * @author afaroutdude + */ +@Initializable +public final class ForestersArmsCiderPlugin extends UseWithHandler { + private static final Item CIDER = new Item(Items.CIDER_5763); + + /** + * Constructs a new {@code LadyKeliRopePlugin} {@code Object}. + */ + public ForestersArmsCiderPlugin() { + super(Items.CIDER_5763); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + int[] ids = {1,2,3,4,5}; + for (int id : ids) { + addHandler(id, NPC_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (!new ZoneBorders(2689, 3488, 2700, 3498, 0).insideBorder(player)) { + return true; + } + final NPC npc = event.getUsedWith() instanceof NPC ? event.getUsedWith().asNpc() : null; + if (npc != null) { + player.getDialogueInterpreter().open(npc.getId(), npc, CIDER); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withnpc/GertrudeCatUsePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withnpc/GertrudeCatUsePlugin.java new file mode 100644 index 000000000..0443d6d99 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withnpc/GertrudeCatUsePlugin.java @@ -0,0 +1,106 @@ +package core.game.interaction.item.withnpc; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the use with interactions. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GertrudeCatUsePlugin extends UseWithHandler { + + /** + * Represents the animation of bending down. + */ + private static final Animation BEND_DOWN = Animation.create(827); + + /** + * Represents the empty bucket. + */ + private static final Item EMPTY_BUCKET = new Item(1925); + + /** + * Constructs a new {@code GertrudeCatUsePlugin} {@code Object}. + */ + public GertrudeCatUsePlugin() { + super(1927, 1552, 327, 13236); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2997, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final NPC npc = ((NPC) event.getUsedWith()); + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + if (event.getUsedItem().getId() == 1927 && quest.getStage(player) == 20) { + if (player.getInventory().remove(event.getUsedItem())) { + player.getInventory().add(EMPTY_BUCKET); + player.animate(BEND_DOWN); + npc.sendChat("Mew!"); + quest.setStage(player, 30); + } + } else if (event.getUsedItem().getId() == 1552 && quest.getStage(player) == 30) { + if (player.getInventory().remove(event.getUsedItem())) { + player.animate(BEND_DOWN); + npc.sendChat("Mew!"); + quest.setStage(player, 40); + } + } else if (event.getUsedItem().getId() == 327 && quest.getStage(player) == 50) { + player.getDialogueInterpreter().sendDialogue("The cat doesn't seem interested in that."); + } else if (event.getUsedItem().getId() == 13236) { + if (player.getInventory().remove(event.getUsedItem())) { + quest.setStage(player, 60); + player.lock(5); + GameWorld.getPulser().submit(new Pulse(1) { + int count = 0; + final NPC kitten = NPC.create(761, player.getLocation()); + + @Override + public boolean pulse() { + switch (count) { + case 0: + kitten.init(); + kitten.face(npc); + npc.face(kitten); + npc.sendChat("Pur..."); + kitten.sendChat("Pur..."); + final Path path = Pathfinder.find(npc, new Location(3310, 3510, 1)); + path.walk(npc); + final Path pathh = Pathfinder.find(kitten, new Location(3310, 3510, 1)); + pathh.walk(kitten); + break; + case 5: + kitten.clear(); + player.setAttribute("hidefluff", System.currentTimeMillis() + 60000); + break; + } + count++; + return count == 6; + } + + }); + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withnpc/KingArthurPoisonChalicePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withnpc/KingArthurPoisonChalicePlugin.java new file mode 100644 index 000000000..fe9ce9a1b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withnpc/KingArthurPoisonChalicePlugin.java @@ -0,0 +1,43 @@ +package core.game.interaction.item.withnpc; + +import core.tools.Items; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to "poison" King Arthur. + * @author afaroutdude + */ +@Initializable +public final class KingArthurPoisonChalicePlugin extends UseWithHandler { + private static final Item POISON_CHALICE = new Item(Items.POISON_CHALICE_197); + + /** + * Constructs a new {@code LadyKeliRopePlugin} {@code Object}. + */ + public KingArthurPoisonChalicePlugin() { + super(POISON_CHALICE.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(251, NPC_TYPE, this); + return new KingArthurPoisonChalicePlugin(); + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final NPC npc = event.getUsedWith() instanceof NPC ? event.getUsedWith().asNpc() : null; + if (npc != null) { + player.getDialogueInterpreter().open(npc.getId(), npc, POISON_CHALICE); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withnpc/LadyKeliRopePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withnpc/LadyKeliRopePlugin.java new file mode 100644 index 000000000..4ce189727 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withnpc/LadyKeliRopePlugin.java @@ -0,0 +1,57 @@ +package core.game.interaction.item.withnpc; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to tie up lady keli. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LadyKeliRopePlugin extends UseWithHandler { + + /** + * Represents the rope item. + */ + private static final Item ROPE = new Item(954); + + /** + * Constructs a new {@code LadyKeliRopePlugin} {@code Object}. + */ + public LadyKeliRopePlugin() { + super(954); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(919, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Quest quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + if (quest.getStage(player) >= 40 && player.getAttribute("guard-drunk", false) && quest.getStage(player) != 100) { + if (player.getInventory().remove(ROPE)) { + player.getDialogueInterpreter().sendDialogue("You overpower Keli, tie her up, and put her in a cupboard."); + quest.setStage(player, 50); + player.setAttribute("keli-gone", GameWorld.getTicks() + 350); + } + } else { + if (quest.getStage(player) == 40) { + player.getPacketDispatch().sendMessage("You need to do something about the guard first."); + } + return true; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withnpc/NeedleCowPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withnpc/NeedleCowPlugin.java new file mode 100644 index 000000000..a40478d67 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withnpc/NeedleCowPlugin.java @@ -0,0 +1,51 @@ +package core.game.interaction.item.withnpc; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the needle on a cow plugin. + * @author 'Vexia + * @date 18/11/2013 + */ +@Initializable +public class NeedleCowPlugin extends UseWithHandler { + + /** + * Constructs a new {@code NeedleCowPlugin} {@code Object}. + */ + public NeedleCowPlugin() { + super(1733); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(81, NPC_TYPE, this); + addHandler(397, NPC_TYPE, this); + addHandler(955, NPC_TYPE, this); + addHandler(1691, NPC_TYPE, this); + addHandler(1766, NPC_TYPE, this); + addHandler(1767, NPC_TYPE, this); + addHandler(1768, NPC_TYPE, this); + addHandler(1886, NPC_TYPE, this); + addHandler(1998, NPC_TYPE, this); + addHandler(1999, NPC_TYPE, this); + addHandler(2000, NPC_TYPE, this); + addHandler(2310, NPC_TYPE, this); + addHandler(3309, NPC_TYPE, this); + addHandler(5210, NPC_TYPE, this); + addHandler(5211, NPC_TYPE, this); + addHandler(5603, NPC_TYPE, this); + addHandler(7484, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + event.getPlayer().getPacketDispatch().sendMessage("The cow doesn't want that."); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withnpc/StrayDogBonesPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withnpc/StrayDogBonesPlugin.java new file mode 100644 index 000000000..cfcd314e3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withnpc/StrayDogBonesPlugin.java @@ -0,0 +1,52 @@ +package core.game.interaction.item.withnpc; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the bones on stray dogs plugin. + * @author Vexia + */ +@Initializable +public class StrayDogBonesPlugin extends UseWithHandler { + + /** + * The dog ids. + */ + private static final int[] DOGS = new int[] { 4766, 4767, 5917, 5918 }; + + /** + * Constructs a new {@code StrayDogBonesPlugin} {@code Object} + */ + public StrayDogBonesPlugin() { + super(526, 528, 530, 532, 534, 536, 2530, 2859, 3123, 3125, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3179, 3180, 3181, 3182, 3183, 3185, 3186, 3187, 4812, 4830, 4832, 4834, 6729, 6812, 11806); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : DOGS) { + addHandler(id, NPC_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Item item = event.getUsedItem(); + final Player player = event.getPlayer(); + final NPC npc = event.getUsedWith().asNpc(); + if (player.getInventory().remove(item)) { + player.sendMessage("You feed your dog bones."); + npc.sendChat("Woof"); + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 8); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/BankUnnotePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/BankUnnotePlugin.java new file mode 100644 index 000000000..53032b7ca --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/BankUnnotePlugin.java @@ -0,0 +1,114 @@ +package core.game.interaction.item.withobject; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.IronmanMode; +import core.game.node.item.Item; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the unnoting of noted items when used on a bank booth. + * @author Vexia + * @author Splinter + */ +@Initializable +public class BankUnnotePlugin extends UseWithHandler { + + /** + * The bank booth ids. + */ + private static final int[] BOOTHS = new int[] { 2213, 3194, 5276, 6084, 10517, 11338, 11402, 11758, 12309, 12798, 14367, 16700, 18491, 19230, 20325, 20391, 22819, 24914, 25808, 26972, 27663, 28514, 29085, 30016, 34752, 35647, 36786 }; + + /** + * The banker ids, + */ + private static final int[] BANKERS = new int[] { 44, 45, 494, 495, 496, 497, 498, 499, 953, 1036, 1360, 2163, 2164, 2354, 2355, 2568, 2569, 2570, 3198, 3199, 3824, 5258, 5260, 5776, 5777, 5912, 5913, 6200, 6532, 6533, 6534, 6535, 6538, 7445, 7446, 7605 }; + + /** + * Constructs a new {@Code BankUnnotePlugin} {@Code Object} + */ + public BankUnnotePlugin() { + super(); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : BOOTHS) { + addHandler(id, OBJECT_TYPE, this); + } + for (int id : BANKERS) { + addHandler(id, NPC_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Item item = event.getUsedItem(); + if (!player.isAdmin() && (player.getIronmanManager().getMode() == IronmanMode.NONE || item.getDefinition().isUnnoted())) { + return false; + } + if (item.getDefinition().isStackable() && item.getDefinition().isUnnoted()) { + player.getPacketDispatch().sendMessage("You can't note stackable items."); + return true; + } + int amount = item.getAmount(); + if (amount > player.getInventory().freeSlots()) { + amount = 28 - player.getInventory().freeSlots(); + } + if (amount < 1 || player.getInventory().freeSlots() <= 0) { + player.sendMessage("Not enough inventory space."); + return true; + } + if (player.getInventory().freeSlots() >= amount) { + if (player.getInventory().remove(new Item(item.getId(), amount))) { + Item newItem = new Item(item.getNoteChange(), amount); + player.getInventory().add(newItem); + player.getDialogueInterpreter().sendItemMessage(newItem, "You exchange your noted items."); + player.lock(1); + return true; + } + } else { + int toAdd = player.getInventory().freeSlots(); + if (player.getInventory().remove(new Item(item.getId(), toAdd))) { + Item newItem = new Item(item.getNoteChange(), toAdd); + player.getInventory().add(newItem); + player.getDialogueInterpreter().sendItemMessage(newItem, "You exchange your noted items."); + player.lock(1); + return true; + } + } + return false; + } + + @Override + public Location getDestination(Player player, Node with) { + if (with instanceof NPC) { + NPC npc = (NPC) with; + if (npc.getAttribute("facing_booth", false)) { + Direction dir = npc.getDirection(); + return npc.getLocation().transform(dir.getStepX() << 1, dir.getStepY() << 1, 0); + } + if (npc.getId() == 6533) { + return Location.create(3167, 3490, 0);// ge bankers. + } else if (npc.getId() == 6535) { + return Location.create(3162, 3489, 0); + } else if (npc.getId() == 4907) { + return npc.getLocation().transform(0, -2, 0); + } + } + return null; + } + + @Override + public boolean isDynamic() { + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/BurnMeatPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/BurnMeatPlugin.java new file mode 100644 index 000000000..db0364a10 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/BurnMeatPlugin.java @@ -0,0 +1,89 @@ +/* +package core.game.interaction.item.withobject; + +import org.crandor.game.content.global.consumable.Consumables; +import org.crandor.game.content.global.consumable.Food; +import org.crandor.game.interaction.NodeUsageEvent; +import org.crandor.game.interaction.UseWithHandler; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.item.Item; +import org.crandor.game.node.object.GameObject; +import org.crandor.game.world.update.flag.context.Animation; +import org.crandor.net.packet.PacketRepository; +import org.crandor.net.packet.context.GameMessageContext; +import org.crandor.net.packet.out.GameMessage; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.plugin.Plugin; + +*/ +/** + * Represents the plugin used to burn a fire. + * @author 'Vexia + * @version 1.0 + *//* + +@InitializablePlugin +public final class BurnMeatPlugin extends UseWithHandler { + + */ +/** + * Represents the objects allowed to cook {@code Food} on. + *//* + + private static final int[] OBJECTS = new int[] { 21302, 13528, 13529, 13533, 13531, 13536, 13539, 13542, 2728, 2729, 2730, 2731, 2732, 2859, 3038, 3039, 3769, 3775, 4265, 4266, 5249, 5499, 5631, 5632, 5981, 9682, 10433, 11404, 11405, 11406, 12102, 12796, 13337, 13881, 14169, 14919, 15156, 20000, 20001, 21620, 21792, 22713, 22714, 23046, 24283, 24284, 25155, 25156, 25465, 25730, 27297, 29139, 30017, 32099, 33500, 34495, 34546, 36973, 37597, 37629, 37726, 114, 4172, 5275, 8750, 16893, 22154, 34410, 34565, 114, 9085, 9086, 9087, 12269, 15398, 25440, 25441, 2724, 2725, 2726, 4618, 4650, 5165, 6093, 6094, 6095, 6096, 8712, 9439, 9440, 9441, 10824, 17640, 17641, 17642, 17643, 18039, 21795, 24285, 24329, 27251, 33498, 35449, 36815, 36816, 37426, 40110 }; + + */ +/** + * Represents the animation used when cooking over a range. + *//* + + private static final Animation RANGE_ANIMATION = new Animation(883); + + */ +/** + * Represents the animation used when cooking over a fire. + *//* + + private static final Animation FIRE_ANIMATION = new Animation(897); + + */ +/** + * Constructs a new {@code BurnMeatPlugin} {@code Object}. + *//* + + public BurnMeatPlugin() { + super(2140, 1861, 3228, 7521, 3151, 325, 319, 347, 355, 333, 339, 351, 329, 3381, 361, 10136, 5003, 379, 365, 373, 2149, 7946, 385, 397, 391, 3369, 3371, 3373, 1893, 1895, 1897, 1899, 1901, 1963, 2102, 2120, 2108, 5972, 5504, 1982, 1965, 1957, 5988, 1781, 6701, 6703, 6705, 7056, 7058, 7060, 1933, 1783, 1927, 1929, 6032, 6034, 2011, 227, 1921, 1937, 7934, 7086, 4239, 7068, 7086, 2003, 7078, 7072, 4239, 7062, 7064, 7084, 1871, 7082, 2309, 1891, 1967, 1971, 2142, 9436, 2142, 2142, 2325, 2333, 2327, 2331, 7170, 2323, 2335, 7178, 7180, 7188, 7190, 7198, 7200, 7208, 7210, 7218, 7220, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 315, 9988, 2878, 7568, 9980, 7223, 5982, 5984); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : OBJECTS) { + addHandler(id, OBJECT_TYPE, this); + } + System.out.println("Burned meat plugin successfully initialized"); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Food food = Consumables.forFood(event.getUsedItem()); + final GameObject object = (GameObject) event.getUsedWith(); + final Item usedItem = event.getUsedItem(); + if (food.getBurnt() == null) { + player.getPacketDispatch().sendMessage("You can't burn this piece of food."); + return true; + } + player.debug("Used Item: " + usedItem + " In inventory? " + player.getInventory().containsItem(usedItem)); + if (player.getInventory().containsItem(usedItem)) { + player.getInventory().remove(usedItem); + player.lock(3); + player.animate(!object.getName().toLowerCase().equals("fire") ? RANGE_ANIMATION : FIRE_ANIMATION); + player.getInventory().add(food.getBurnt()); + player.getPacketDispatch().sendMessage("You deliberately burn the perfectly good piece of meat."); + } + return true; + } + +} +*/ diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/CauldronOfThunder.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/CauldronOfThunder.java new file mode 100644 index 000000000..7bde4af2b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/CauldronOfThunder.java @@ -0,0 +1,58 @@ +package core.game.interaction.item.withobject; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin handler used for with the cauldron of thunder. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CauldronOfThunder extends UseWithHandler { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(833); + + /** + * Represents the enchanted items. + */ + private static final Item[] ITEMS = new Item[] { new Item(524, 1), new Item(522, 1), new Item(523, 1), new Item(525, 1) }; + + /** + * Constructs a new {@code CauldronOfThunder} {@code Object}. + */ + public CauldronOfThunder() { + super(2136, 2132, 2134, 2138); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2142, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + event.getPlayer().animate(ANIMATION); + event.getPlayer().getInventory().remove(event.getUsedItem()); + if (event.getUsedItem().getId() == 2136) { + event.getPlayer().getInventory().add(ITEMS[0]); + } else if (event.getUsedItem().getId() == 2132) { + event.getPlayer().getInventory().add(ITEMS[1]); + } else if (event.getUsedItem().getId() == 2134) { + event.getPlayer().getInventory().add(ITEMS[2]); + } else if (event.getUsedItem().getId() == 2138) { + event.getPlayer().getInventory().add(ITEMS[3]); + } + event.getPlayer().getPacketDispatch().sendMessage("You dip the " + event.getUsedItem().getName().toLowerCase() + " in the cauldron."); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/CoalTrucksHandler.kt b/Server/src/main/java/Server/core/game/interaction/item/withobject/CoalTrucksHandler.kt new file mode 100644 index 000000000..bce45c745 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/CoalTrucksHandler.kt @@ -0,0 +1,97 @@ +package core.game.interaction.item.withobject + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.NodeUsageEvent +import core.game.interaction.OptionHandler +import core.game.interaction.UseWithHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.Item +import core.game.world.map.zone.ZoneBorders +import core.plugin.Initializable +import core.plugin.Plugin +import core.plugin.PluginManager.definePlugin +import core.tools.Items +import java.util.* + +/** + * Handles coal truck interactions + * @author ceik + */ +@Initializable +class CoalTrucksHandler : OptionHandler() { + + val seersVillageTrucks = ZoneBorders(2690,3502,2699,3508) + + override fun newInstance(arg: Any?): Plugin? { + definePlugin(useCoalWithTruck()) + val def = ObjectDefinition.forId(2114) + def.handlers["option:remove-coal"] = this + def.handlers["option:investigate"] = this + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + var coalInTruck = player.getAttribute("coal-truck-inventory", 0) + var freeSpace = player.inventory.freeSlots() + val toAdd: MutableList = ArrayList() + when (option) { + "remove-coal" -> { + if (coalInTruck == 0) { + player.dialogueInterpreter.sendDialogue("The coal truck is empty.") + return true + } + var toRemove = player.inventory.freeSlots() + + if(toRemove > coalInTruck) toRemove = coalInTruck + + player.inventory.add(Item(Items.COAL_453,toRemove)) + + coalInTruck -= toRemove + player.setAttribute("/save:coal-truck-inventory", coalInTruck) + + + if (!player.achievementDiaryManager.hasCompletedTask(DiaryType.SEERS_VILLAGE, 1, 2) + && seersVillageTrucks.insideBorder(player) + && player.getAttribute("diary:seers:coal-truck-full", false)) { + player.removeAttribute("diary:seers:coal-truck-full") + player.achievementDiaryManager.finishTask(player, DiaryType.SEERS_VILLAGE, 1, 2) + } + } + "investigate" -> player.dialogueInterpreter.sendDialogue("There is currently $coalInTruck coal in the truck.", "The truck has space for " + (120 - coalInTruck) + " more coal.") + } + return true + } + + inner class useCoalWithTruck : UseWithHandler(Items.COAL_453) { + override fun newInstance(arg: Any?): Plugin? { + addHandler(2114, OBJECT_TYPE, this) + return this + } + + override fun handle(event: NodeUsageEvent): Boolean { + val player = event.player + var coalInTruck = player.getAttribute("coal-truck-inventory", 0) + + var coalInInventory = player.inventory.getAmount(Items.COAL_453) + + if(coalInInventory + coalInTruck >= 120){ + coalInInventory = 120 - coalInTruck + event.player.packetDispatch.sendMessage("You have filled up the coal truck.") + + //handle coal truck task for seer's village + if (!player.achievementDiaryManager.getDiary(DiaryType.SEERS_VILLAGE).isComplete(1, 2) + && player.viewport.region.id == 10294) { // region 10294 is at coal truck mine, region 10806 is in seers village + player.setAttribute("/save:diary:seers:coal-truck-full", true) + } + } + + player.inventory.remove(Item(Items.COAL_453,coalInInventory)) + coalInTruck += coalInInventory + + player.setAttribute("/save:coal-truck-inventory",coalInTruck) + return true + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/DragonPlatebody.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/DragonPlatebody.java new file mode 100644 index 000000000..8ce560193 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/DragonPlatebody.java @@ -0,0 +1,5 @@ +package core.game.interaction.item.withobject; + +public class DragonPlatebody { + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/EctophialFillPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/EctophialFillPlugin.java new file mode 100644 index 000000000..403f45a79 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/EctophialFillPlugin.java @@ -0,0 +1,51 @@ +package core.game.interaction.item.withobject; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Fills an ectophial. + * @author Vexia + */ +@Initializable +public class EctophialFillPlugin extends UseWithHandler { + + /** + * Constructs a new {@code EctophialFillPlugin} {@code Object} + */ + public EctophialFillPlugin() { + super(4252); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(5282, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.lock(3); + player.animate(Animation.create(1652)); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + if (player.getInventory().remove(new Item(4252))) { + player.getInventory().add(new Item(4251)); + } + player.sendMessage("You refill the ectophial."); + return true; + } + }); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/GWDEntranceRopeUsage.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/GWDEntranceRopeUsage.java new file mode 100644 index 000000000..8efae18f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/GWDEntranceRopeUsage.java @@ -0,0 +1,35 @@ +package core.game.interaction.item.withobject; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles using a rope on the God wars entrance. + * @author Emperor + */ +@Initializable +public final class GWDEntranceRopeUsage extends UseWithHandler { + + /** + * Constructs a new {@code GWDEntranceRopeUsage} {@code Object}. + */ + public GWDEntranceRopeUsage() { + super(954); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(26340, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + GameObject object = (GameObject) event.getUsedWith(); + return object.getInteraction().get(0).getHandler().handle(event.getPlayer(), object, "tie-rope"); + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/GildedAltarPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/GildedAltarPlugin.java new file mode 100644 index 000000000..1dc8fedf7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/GildedAltarPlugin.java @@ -0,0 +1,60 @@ +package core.game.interaction.item.withobject; + +import core.game.content.global.Bones; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the guilded altar. + * @author Vexia + * + */ +@Initializable +public class GildedAltarPlugin extends UseWithHandler { + + /** + * The animation for the player. + */ + private static final Animation ANIMATION = new Animation(713); + + /** + * The graphics for the player. + */ + private static final Graphics GRAPHICS = new Graphics(624); + + /** + * Constructs the {@code GuildedAltarPlugin} + */ + public GildedAltarPlugin() { + super(Bones.getArray()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(24343, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Bones bone = Bones.forId(event.getUsedItem().getId()); + if (bone == null) { + return true; + } + if (player.getInventory().remove(event.getUsedItem(), event.getUsedItem().getSlot(), true)) { + player.lock(ANIMATION.getDelay()); + player.visualize(ANIMATION, GRAPHICS); + player.getSkills().addExperience(Skills.PRAYER, bone.getExperience() * 2.5); + player.sendMessage("The gods are very pleased with your offering."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/HairdresserCheesePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/HairdresserCheesePlugin.java new file mode 100644 index 000000000..1da1bc9f4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/HairdresserCheesePlugin.java @@ -0,0 +1,52 @@ +package core.game.interaction.item.withobject; + +import core.plugin.Initializable; +import core.tools.Items; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Plugin; + +/** + * Fills an ectophial. + * @author afaroutdude + */ +@Initializable +public class HairdresserCheesePlugin extends UseWithHandler { + + /** + * Constructs a new {@code EctophialFillPlugin} {@code Object} + */ + public HairdresserCheesePlugin() { + super(Items.CHEESE_1985); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(11677, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.lock(3); + //player.animate(Animation.create(1652)); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + if (player.getInventory().remove(new Item(Items.CHEESE_1985))) { + player.sendMessage("You throw the cheese to Ridgeley, for which he appears grateful."); + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR,0, 6); + } + return true; + } + }); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/IncubatorPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/IncubatorPlugin.java new file mode 100644 index 000000000..950b7acd5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/IncubatorPlugin.java @@ -0,0 +1,120 @@ +package core.game.interaction.item.withobject; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.pet.IncubatorEgg; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.node.entity.state.newsys.StateRepository; +import core.game.node.entity.state.newsys.states.IncubatorState; +import core.game.node.item.GroundItemManager; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.StringUtils; + +/** + * Handles the incubator. + * @author Vexia + */ +@Initializable +public class IncubatorPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new IncubatorEggHandler()); + ObjectDefinition.forId(28359).getHandlers().put("option:take-egg", this); + ObjectDefinition.forId(28359).getHandlers().put("option:inspect", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int inc = player.getAttribute("inc", -1); + switch (option) { + case "take-egg": + if (inc == -1) { + player.sendMessage("The egg is still incubating."); + return true; + } + IncubatorEgg egg = IncubatorEgg.values()[inc]; + if (!player.getInventory().hasSpaceFor(egg.getProduct())) { + player.sendMessage("You don't have enough inventory space."); + return true; + } + if (egg != null) { + String name = egg.getProduct().getName().toLowerCase(); + player.varpManager.get(1160).setVarbit(4,0).send(player); + player.sendMessage("You take your " + name + " out of the incubator."); + if(!player.getInventory().add(egg.getProduct())){ + GroundItemManager.create(egg.getProduct(),player); + } + player.removeAttribute("inc"); + } + return true; + case "inspect": + if (player.states.get("incubator") != null || inc != -1) { + IncubatorState p = (IncubatorState) player.states.get("incubator"); + if(p.getPulse() == null){ + player.varpManager.get(1160).setVarbit(4,0).send(player); + return true; + } + String name = p == null ? IncubatorEgg.values()[inc].getProduct().getName().toLowerCase() : p.getEgg().getProduct().getName().toLowerCase(); + player.sendMessage("There is " + (StringUtils.isPlusN(name) ? "an" : "a") + " " + name + " incubating in there."); + } + return true; + } + return true; + } + + /** + * Handles the reward of using an egg on the incubator. + * @author Vexia + */ + public class IncubatorEggHandler extends UseWithHandler { + + /** + * Constructs a new {@Code IncubatorEggHandler} {@Code + * Object} + */ + public IncubatorEggHandler() { + super(12483, 11964, 5077, 5076, 5078, 12494, 12477, 12480, 12478, 12479); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(28336, OBJECT_TYPE, this); + addHandler(28352, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final IncubatorEgg egg = IncubatorEgg.forItem(event.getUsedItem()); + if (egg == null) { + return false; + } + if (player.hasActiveState("incubator")) { + player.sendMessage("You already have an egg in there."); + return true; + } + if (player.getSkills().getStaticLevel(Skills.SUMMONING) < egg.getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a Summoning level of at least " + egg.getLevel() + " in order to do this."); + return true; + } + if(player.getInventory().remove(egg.getEgg())) { + IncubatorState state = (IncubatorState) player.registerState("incubator"); + state.setEgg(egg); + state.setTicksLeft(egg.getInucbationTime() * 100); + state.init(); + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/KaramajaBananaCrate.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/KaramajaBananaCrate.java new file mode 100644 index 000000000..f568af267 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/KaramajaBananaCrate.java @@ -0,0 +1,76 @@ +package core.game.interaction.item.withobject; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the karamaja banna crate. + * @author 'Vexia + * @date 29/11/2013 + */ +@Initializable +public final class KaramajaBananaCrate extends UseWithHandler { + + /** + * Represents the banana item. + */ + private static final Item BANANA = new Item(1963); + + /** + * Represents the filling animation. + */ + private static final Animation ANIMATION = new Animation(832); + + /** + * Represents the cap of bannas to add. + */ + private static final int CAP = 10; + + /** + * Constructs a new {@code KaramajaBananaCrate} {@code Object}. + */ + public KaramajaBananaCrate() { + super(1963, 431); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2072, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getSavedData().getGlobalData().isLuthasTask() && event.getUsedItem().getId() == 431) { + if (player.getAttribute("stashed-rum", false)) { + player.getPacketDispatch().sendMessage("There's already some rum in here..."); + return true; + } + if (player.getInventory().remove(event.getUsedItem())) { + player.animate(ANIMATION); + player.getDialogueInterpreter().sendDialogue("You stash the rum in the crate."); + player.setAttribute("/save:stashed-rum", true); + } + return true; + } + final int current = player.getSavedData().getGlobalData().getKaramjaBananas(); + if (current == CAP) { + player.getPacketDispatch().sendMessage("The crate is already full."); + return true; + } + if (player.getInventory().remove(BANANA)) { + player.getDialogueInterpreter().sendDialogue("You pack a banana into the crate."); + player.getSavedData().getGlobalData().setKaramjaBannanas(current + 1); + player.animate(ANIMATION); + player.lock(2); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/PoisonFountainPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/PoisonFountainPlugin.java new file mode 100644 index 000000000..46fc43866 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/PoisonFountainPlugin.java @@ -0,0 +1,77 @@ +package core.game.interaction.item.withobject; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the poison fountain plugin. + * @author 'Vexia + * @date 24/12/2013 + */ +@Initializable +public class PoisonFountainPlugin extends UseWithHandler { + + /** + * Represents the searching animation. + */ + private static final Animation SEARCH_ANIM = new Animation(881); + + /** + * Represents the poisoned fish food. + */ + private static final Item POISONED_FOOD = new Item(274); + + /** + * Constructs a new {@code PoisonFountainPlugin} {@code Object}. + */ + public PoisonFountainPlugin() { + super(274); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(153, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getAttribute("piranhas-killed", false)) { + player.getPacketDispatch().sendMessage("The piranhas are dead already."); + return true; + } + if (player.getInventory().remove(POISONED_FOOD)) { + player.lock(); + player.setAttribute("/save:piranhas-killed", true); + player.animate(SEARCH_ANIM); + player.getPacketDispatch().sendMessage("You pour the poisoned fish food into the fountain."); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.getPacketDispatch().sendMessage("The piranhas start eating the food..."); + break; + case 2: + player.getPacketDispatch().sendMessage("... then die and float to the surface."); + player.unlock(); + return true; + } + return false; + } + }); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/PriestInPerilUsePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/PriestInPerilUsePlugin.java new file mode 100644 index 000000000..091082269 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/PriestInPerilUsePlugin.java @@ -0,0 +1,157 @@ +package core.game.interaction.item.withobject; + +import core.game.content.dialogue.FacialExpression; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class PriestInPerilUsePlugin extends UseWithHandler { + private int[] monumentIds = new int[] { 3499, 3493, 3494, 3497, 3495, 3498, 3496 }; + /** + * Constructs a new {@code PriestInPerilUsePlugin.java} {@code Object}. + */ + public PriestInPerilUsePlugin() { + super(2944, 1925, 2945, 2954, 2347, 1733, 1931, 314, 36, 590); + } + + /** + * (non-Javadoc) + * @see Plugin#newInstance(Object) + */ + @Override + public Plugin newInstance(Object arg) throws Throwable { + for(int i = 0; i < monumentIds.length; i++){ + addHandler(monumentIds[i], OBJECT_TYPE, this); + } + addHandler(3485, OBJECT_TYPE, this); + addHandler(3463, OBJECT_TYPE, this); + addHandler(30728, OBJECT_TYPE, this); + return this; + } + + /** + * (non-Javadoc) + * @see UseWithHandler#handle(NodeUsageEvent) + */ + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + int objUse = ((GameObject) event.getUsedWith()).getId(); + int itemUse = ((Item) event.getUsedItem()).getId(); + switch(objUse) { + case 3499: + if (!event.getPlayer().getGameAttributes().getAttributes().containsKey("priest_in_peril:key") && event.getPlayer().getInventory().remove(new Item(2944))) { + event.getPlayer().getInventory().add(new Item(2945)); + event.getPlayer().getPacketDispatch().sendMessage("You swap the Golden key for the Iron key."); + event.getPlayer().getGameAttributes().setAttribute("/save:priest_in_peril:key", true); + } else { + return true; + } + break; + case 3493: + if(!player.getGameAttributes().getAttributes().containsKey("priest_in_peril:tinderbox")){ + if (itemUse == 590) { + if (event.getPlayer().getInventory().remove(new Item(590))) { + event.getPlayer().getInventory().add(new Item(2946)); + event.getPlayer().getPacketDispatch().sendMessage("You swap the tinderbox for the golden tinderbox."); + event.getPlayer().getGameAttributes().setAttribute("/save:priest_in_peril:tinderbox", true); + } + } + } + break; + case 3494: + if(!player.getGameAttributes().getAttributes().containsKey("priest_in_peril:candle")){ + if (itemUse == 36) { + if (event.getPlayer().getInventory().remove(new Item(36))) { + event.getPlayer().getInventory().add(new Item(2947)); + event.getPlayer().getPacketDispatch().sendMessage("You swap the candle for the golden candle."); + event.getPlayer().getGameAttributes().setAttribute("/save:priest_in_peril:candle", true); + } + } + } + break; + case 3497: + if(!player.getGameAttributes().getAttributes().containsKey("priest_in_peril:feather")){ + if (itemUse == 314) { + if (event.getPlayer().getInventory().remove(new Item(314))) { + event.getPlayer().getInventory().add(new Item(2950)); + event.getPlayer().getPacketDispatch().sendMessage("You swap the feather for the golden feather."); + event.getPlayer().getGameAttributes().setAttribute("/save:priest_in_peril:feather", true); + } + } + } + break; + case 3495: + if(!player.getGameAttributes().getAttributes().containsKey("priest_in_peril:pot")){ + if (itemUse == 1931) { + if (event.getPlayer().getInventory().remove(new Item(1931))) { + event.getPlayer().getInventory().add(new Item(2948)); + event.getPlayer().getPacketDispatch().sendMessage("You swap the empty pot for the golden pot."); + event.getPlayer().getGameAttributes().setAttribute("/save:priest_in_peril:pot", true); + } + } + } + break; + case 3498: + if(!player.getGameAttributes().getAttributes().containsKey("priest_in_peril:needle")){ + if (itemUse == 1733) { + if (event.getPlayer().getInventory().remove(new Item(1733))) { + event.getPlayer().getInventory().add(new Item(2951)); + event.getPlayer().getPacketDispatch().sendMessage("You swap the needle for the golden needle."); + event.getPlayer().getGameAttributes().setAttribute("/save:priest_in_peril:needle", true); + } + } + } + break; + case 3496: + if(!player.getGameAttributes().getAttributes().containsKey("priest_in_peril:hammer")){ + if (itemUse == 2347) { + if (event.getPlayer().getInventory().remove(new Item(2347))) { + event.getPlayer().getInventory().add(new Item(2949)); + event.getPlayer().getPacketDispatch().sendMessage("You swap the hammer for the golden hammer."); + event.getPlayer().getGameAttributes().setAttribute("/save:priest_in_peril:hammer", true); + } + } + } + break; + case 3485: { + if (event.getPlayer().getInventory().remove(new Item(1925))) { + event.getPlayer().getInventory().add(new Item(2953)); + event.getPlayer().getPacketDispatch().sendMessage("You fill the bucket from the well."); + } + } + break; + case 3463: { + if (player.getInventory().remove(new Item(2945))) { + Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + quest.setStage(player, 15); + player.getPacketDispatch().sendMessage("You have unlocked the cell door."); + NPC npc = NPC.create(1047, player.getLocation()); + npc.setName("Dezel"); + player.getDialogueInterpreter().sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh! Thank you! You have found the key!"); + } + } + break; + case 30728: { + if (player.getInventory().remove(new Item(2954))) { + player.getInventory().add(new Item(1925)); + Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + quest.setStage(player, 16); + player.getPacketDispatch().sendMessage("You pour the blessed water over the coffin..."); + } + } + break; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/SandSourcePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/SandSourcePlugin.java new file mode 100644 index 000000000..a1e8fc329 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/SandSourcePlugin.java @@ -0,0 +1,83 @@ +package core.game.interaction.item.withobject; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the sand source plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SandSourcePlugin extends UseWithHandler { + + /** + * Represents the ids to use. + */ + private static final int[] IDS = new int[] { 2645, 10814 }; + + /** + * Represents the bucket to use. + */ + private static final Item BUCKET = new Item(1925); + + /** + * Represents the sand item. + */ + private static final Item SAND = new Item(1783); + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(832); + + /** + * Constructs a new {@code SandSourcePlugin} {@code Object}. + */ + public SandSourcePlugin() { + super(1925); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : IDS) { + addHandler(i, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + handle(event.getPlayer()); + return true; + } + + /** + * Method used to handle the interaction. + * @param player the player. + */ + public final void handle(final Player player) { + player.getPulseManager().run(new Pulse(2, player) { + @Override + public boolean pulse() { + if (player.getInventory().remove(BUCKET)) { + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You fill the bucket with sand."); + player.getInventory().add(SAND); + } + return !player.getInventory().containsItem(BUCKET); + } + + @Override + public void stop() { + super.stop(); + } + }); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/SapCollectPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/SapCollectPlugin.java new file mode 100644 index 000000000..b1d1afc02 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/SapCollectPlugin.java @@ -0,0 +1,102 @@ +package core.game.interaction.item.withobject; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to collect sap. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SapCollectPlugin extends UseWithHandler { + + /** + * Represents the bucket of sap item. + */ + private static final Item BUCKET_OF_SAP = new Item(4687); + + /** + * Represents the bucket item. + */ + private static final Item BUCKET = new Item(1925); + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(2009); + + /** + * Represents the tree ids. + */ + private static final int[] IDS = new int[] { 1276, 1277, 1278, 1279, 1280, 1315, 1316, 1318, 1319, 1330, 1331, 1332, 3033, 3034, 3035, 3036, 3879, 3881, 3882, 3883, 10041, 14308, 14309, 30132, 30133, 37477, 37478, 37652 }; + + /** + * Constructs a new {@code SapCollectPlugin} {@code Object}. + */ + public SapCollectPlugin() { + super(946); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : IDS) { + addHandler(i, OBJECT_TYPE, this); + } + new SapEmptyPlugin().newInstance(arg); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (!player.getInventory().remove(BUCKET)) { + player.getPacketDispatch().sendMessage("I need an empty bucket to collect the sap."); + return true; + } + player.animate(ANIMATION); + player.getInventory().remove(BUCKET); + player.getInventory().add(BUCKET_OF_SAP); + player.getPacketDispatch().sendMessage("You cut the tree and allow its sap to drip down into your bucket."); + return true; + } + + /** + * Represents the plugin used to empty a bucket of sap. + * @author 'Vexia + * @version 1.0 + */ + public static final class SapEmptyPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(4687).getHandlers().put("option:empty", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Item item = (Item) node; + if (item.getSlot() < 0) { + return false; + } + player.getInventory().replace(BUCKET, item.getSlot()); + player.getPacketDispatch().sendMessage("You empty the contents of the bucket on the floor."); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/SmithingPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/SmithingPlugin.java new file mode 100644 index 000000000..b7e7c602f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/SmithingPlugin.java @@ -0,0 +1,136 @@ +package core.game.interaction.item.withobject; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.smithing.SmithingBuilder; +import core.game.node.entity.skill.smithing.smelting.Bar; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the option handler used for smithing. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SmithingPlugin extends UseWithHandler { + + /** + * The hammer item. + */ + private static final Item HAMMER = new Item(2347); + + /** + * Constructs a new {@code SmithingPlugin} {@code Object}. + */ + public SmithingPlugin() { + super(2349, 2351, 2353, 2359, 2361, 2363, 2366, 2368, 9467, 11286, 1540, 11710, 11712, 11714, 11686, 11688, 11692); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2782, OBJECT_TYPE, this); + addHandler(2783, OBJECT_TYPE, this); + addHandler(4306, OBJECT_TYPE, this); + addHandler(6150, OBJECT_TYPE, this); + addHandler(22725, OBJECT_TYPE, this); + addHandler(26817, OBJECT_TYPE, this); + addHandler(37622, OBJECT_TYPE, this); + addHandler(42027, OBJECT_TYPE, this); + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(42027).getHandlers().put("option:smith", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + SmithingPlugin.this.handle(new NodeUsageEvent(player, 10, HAMMER, node)); + return true; + } + + }); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (((GameObject) event.getUsedWith()).getId() == 2782 && !player.getQuestRepository().isComplete("Doric's Quest")) { + player.getDialogueInterpreter().sendDialogue("Property of Doric the Dwarf."); + return true; + } + if (!player.getInventory().contains(2347, 1)) { + player.getDialogueInterpreter().sendDialogue("You need a hammer to work the metal with."); + return true; + } else { + if (event.getUsedItem().getId() == 2366 || event.getUsedItem().getId() == 2368) { + if (player.getSkills().getLevel(Skills.SMITHING) < 60) { + player.getDialogueInterpreter().sendDialogue("You need a smithing level of 60 to smith this."); + return true; + } + if (!player.getInventory().contains(2366, 1) && !player.getInventory().contains(2368, 1)) { + player.getDialogueInterpreter().sendDialogue("You need a shield left half and a shield right half."); + return true; + } + player.getDialogueInterpreter().open(82127843, 1, event.getUsedItem().getId()); + return true; + } + if (event.getUsedItem().getId() == 11286 || event.getUsedItem().getId() == 1540) { + if (player.getSkills().getLevel(Skills.SMITHING) < 90) { + player.getDialogueInterpreter().sendDialogue("You need a smithing level of 90 to smith this."); + return true; + } + if (!player.getInventory().contains(1540, 1) && !player.getInventory().contains(11286, 1)) { + player.getDialogueInterpreter().sendDialogue("You need a draconic visage and a anti-dragon shield."); + return true; + } + player.getDialogueInterpreter().open(82127843, 2, event.getUsedItem().getId()); + return true; + } + if (event.getUsedItem().getId() == 11710 || event.getUsedItem().getId() == 11712 || event.getUsedItem().getId() == 11714 || event.getUsedItem().getId() == 11686 || event.getUsedItem().getId() == 11688 || event.getUsedItem().getId() == 11692) { + if (player.getSkills().getLevel(Skills.SMITHING) < 80) { + player.getDialogueInterpreter().sendDialogue("You need a smithing level of 80 to smith this."); + return true; + } + player.getDialogueInterpreter().open(62362, event.getUsedItem().getId()); + return true; + } + Bar bar = Bar.forId(event.getUsedItem().getId()); + Item item = event.getUsedItem(); + if (event.getUsedItem().getId() == HAMMER.getId()) { + for (Item i : player.getInventory().toArray()) { + if (i == null) { + continue; + } + bar = Bar.forId(i.getId()); + if (bar != null) { + item = i; + break; + } + } + } + if (bar == null) { + return true; + } + if (player.getSkills().getLevel(Skills.SMITHING) < bar.getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a smithing level of at leat " + bar.getLevel() + " to work " + bar.getProduct().getName().toLowerCase() + "s."); + return true; + } + final SmithingBuilder builder = new SmithingBuilder(item); + builder.build(player); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.java new file mode 100644 index 000000000..92927d90a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/SpiritShieldBlessPlugin.java @@ -0,0 +1,116 @@ +package core.game.interaction.item.withobject; + +import core.game.content.dialogue.DialogueAction; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the blessing of Spirit shields. + * @author Splinter + */ +@Initializable +public class SpiritShieldBlessPlugin extends UseWithHandler { + + /** + * Constructs a new {@code SpiritShieldMakePlugin} {@code Object} + */ + public SpiritShieldBlessPlugin() { + super(13754, 13734); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(24343, OBJECT_TYPE, this); + PluginManager.definePlugin(new SpiritShieldMakePlugin()); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if(!player.getInventory().containItems(13754, 13734)){ + player.sendMessage("You need a holy elixir and an unblessed spirit shield in order to do this."); + return true; + } + if(player.getSkills().getLevel(Skills.PRAYER) < 85){ + player.sendMessage("You need a Prayer level of 85 in order to bless the shield."); + return true; + } + if(player.getInventory().remove(new Item(13754, 1), new Item(13734, 1))){ + player.getInventory().add(new Item(13736, 1)); + player.sendMessage("You successfully bless the shield using the holy elixir."); + } + return true; + } + + /** + * Handles the attaching of sigils to the blessed spirit shield. + * @author Splinter + */ + public class SpiritShieldMakePlugin extends UseWithHandler { + + /** + * Constructs a new {@code SpiritShieldMakePlugin} {@code Object} + */ + public SpiritShieldMakePlugin() { + super(13746, 13748, 13750, 13752); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2782, OBJECT_TYPE, this); + addHandler(2783, OBJECT_TYPE, this); + addHandler(4306, OBJECT_TYPE, this); + addHandler(6150, OBJECT_TYPE, this); + addHandler(22725, OBJECT_TYPE, this); + addHandler(26817, OBJECT_TYPE, this); + addHandler(37622, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Item used = event.getUsedItem(); + final Item result = new Item(used.getId() - 8, 1); + if(used.getId() > 13752 || used.getId() < 13746){ + return true; + } + if(!player.getInventory().containsItem(new Item(13736))){ + player.sendMessage("You need a blessed spirit shield in order to continue."); + return true; + } + if(player.getSkills().getLevel(Skills.PRAYER) < 90 || player.getSkills().getLevel(Skills.SMITHING) < 85){ + player.sendMessage("You need a Prayer level of 90 and a Smithing of 85 in order to attach the sigil."); + return true; + } + player.getDialogueInterpreter().sendOptions("Combine the two?", "Yes", "No"); + player.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 2: + if(player.getInventory().remove(used, new Item(13736, 1))){ + player.getInventory().add(result); + player.animate(new Animation(898)); + player.getDialogueInterpreter().sendItemMessage(result.getId(), "You successfully attach the "+used.getName().toLowerCase()+" to the blessed", "spirit shield."); + Repository.sendNews(player.getUsername()+" has just made the "+result.getName()+"."); + } + break; + } + } + + }); + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/SwampHoleRopePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/SwampHoleRopePlugin.java new file mode 100644 index 000000000..9496efc4c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/SwampHoleRopePlugin.java @@ -0,0 +1,48 @@ +package core.game.interaction.item.withobject; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the swamp hole rope plugin. + * @author 'Vexia + * @date 01/12/2013 + */ +@Initializable +public class SwampHoleRopePlugin extends UseWithHandler { + + /** + * Represents the rope item. + */ + private static final Item ROPE = new Item(954); + + /** + * Constructs a new {@code SwampHoleRopePlugin.java} {@code Object}. + */ + public SwampHoleRopePlugin() { + super(954); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(5947, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (!event.getPlayer().getSavedData().getGlobalData().hasTiedLumbridgeRope()) { + if (event.getPlayer().getInventory().remove(ROPE)) { + event.getPlayer().getDialogueInterpreter().sendItemMessage(954, "You tie the rope to the top of the entrance and throw it down."); + event.getPlayer().getSavedData().getGlobalData().setLumbridgeRope(true); + } + } else { + event.getPlayer().getDialogueInterpreter().sendDialogue("There is already a rope tied to the entrance."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/TutorialItemHandler.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/TutorialItemHandler.java new file mode 100644 index 000000000..62a10693d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/TutorialItemHandler.java @@ -0,0 +1,56 @@ +package core.game.interaction.item.withobject; + +import core.plugin.Initializable; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.smithing.smelting.Bar; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class TutorialItemHandler extends UseWithHandler { + public TutorialItemHandler() { + super(438, 436); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(3044, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().containItems(438, 436)) { + player.animate(new Animation(833)); + GameWorld.getPulser().submit(new Pulse(2) { + @Override + public boolean pulse() { + player.getInventory().remove(new Item(438, 1)); + player.getInventory().remove(new Item(436, 1)); + player.getInventory().add(Bar.BRONZE.getProduct()); + player.getSkills().addExperience(Skills.SMITHING, Bar.BRONZE.getExperience()); + if (TutorialSession.getExtension(player).getStage() == 39) { + TutorialStage.load(player, 40, false); + } + return true; + } + + }); + + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/WaterSkinHandler.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/WaterSkinHandler.java new file mode 100644 index 000000000..89aad7356 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/WaterSkinHandler.java @@ -0,0 +1,79 @@ +package core.game.interaction.item.withobject; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public final class WaterSkinHandler extends UseWithHandler { + + /** + * Represents objects with water in them. + */ + private static final int[] OBJECTS = new int[]{16302, 6827, 11661, 24160, 34577, 15936, 15937, 15938, 23920, 35469, 24265, 153, 879, 880, 2864, 6232, 10436, 10437, 10827, 11007, 11759, 21764, 22973, 24161, 24214, 24265, 28662, 30223, 30820, 34579, 36781, 873, 874, 4063, 6151, 8699, 9143, 9684, 10175, 12279, 12974, 13563, 13564, 14868, 14917, 15678, 16704, 16705, 20358, 22715, 24112, 24314, 25729, 25929, 26966, 29105, 33458, 34082, 34411, 34496, 34547, 34566, 35762, 36971, 37154, 37155, 878, 884, 3264, 3305, 3359, 4004, 4005, 6097, 6249, 6549, 8747, 8927, 11793, 12201, 12897, 24166, 26945, 31359, 32023, 32024, 34576, 35671, 13561, 13563, 13559}; + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(832); + + // Unfilled waterskin objects + private static final int[] WATERSKINS = new int[]{1831, 1829, 1827, 1825}; + + private static final int FILLED_WATERSKIN = 1823; + + // Waterskin fill diag + private static final String WATERSKIN_TEXT = "You fill the waterskin."; + + /** + * Constructs a new {@code FillBucketPlugin} {@code Object}. + */ + public WaterSkinHandler() { + super(WATERSKINS); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : OBJECTS) { + addHandler(i, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + player.getPulseManager().run(new Pulse(2, player) { + @Override + public boolean pulse() { + int curSkin = -1; + for (int i = 0; i < WATERSKINS.length; i++) { + if (player.getInventory().contains(WATERSKINS[i], 1)) { + curSkin = WATERSKINS[i]; + break; + } + } + if (curSkin == -1) { + return true; + } + if (player.getInventory().remove(new Item(curSkin))) { + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage(WATERSKIN_TEXT); + player.getInventory().add(new Item(FILLED_WATERSKIN)); + } + return false; + } + + @Override + public void stop() { + super.stop(); + } + }); + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/item/withobject/WaterSourcePlugin.java b/Server/src/main/java/Server/core/game/interaction/item/withobject/WaterSourcePlugin.java new file mode 100644 index 000000000..69314d73d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withobject/WaterSourcePlugin.java @@ -0,0 +1,205 @@ +package core.game.interaction.item.withobject; + +import core.plugin.Initializable; +import core.tools.Items; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the plugin used to fill a bucket. + * @author 'Vexia + * @version 1.5 + */ +@Initializable +public final class WaterSourcePlugin extends UseWithHandler { + + /** + * Represents the objects to use the buckets on. + */ + private static final int[] OBJECTS = new int[] { 16302, 6827, 11661, 24160, 34577, 15936, 15937, 15938, 23920, 35469, 24265, 153, 879, 880, 2864, 6232, 10436, 10437, 10827, 11007, 11759, 21764, 22973, 24161, 24214, 24265, 28662, 30223, 30820, 34579, 36781, 873, 874, 4063, 6151, 8699, 9143, 9684, 10175, 12279, 12974, 13563, 13564, 14868, 14917, 15678, 16704, 16705, 20358, 22715, 24112, 24314, 25729, 25929, 26966, 29105, 33458, 34082, 34411, 34496, 34547, 34566, 35762, 36971, 37154, 37155, 878, 884, 3264, 3305, 3359, 4004, 4005, 6097, 6249, 6549, 8747, 8927, 11793, 12201, 12897, 24166, 26945, 31359, 32023, 32024, 34576, 35671, 13561, 13563, 13559 }; + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(832); + + /** + * Constructs a new {@code FillBucketPlugin} {@code Object}. + */ + public WaterSourcePlugin() { + super(WaterRecipient.getIds()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : OBJECTS) { + addHandler(i, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final WaterRecipient recipient = WaterRecipient.forItem(event.getUsedItem()); + recipient.handle(event.getUsedWith().asObject(), event.getPlayer()); + return true; + } + + /** + * Represents a water recipient. + * @author 'Vexia + * @version 1.0 + */ + public enum WaterRecipient { + BUCKET(new Item(1925), new Item(1929)), + VIAL(new Item(229), new Item(227)), + JUG(new Item(1935), new Item(1937)), + BOWL(new Item(1923), new Item(1921)), + CLAY(new Item(434), new Item(1761), "You mix the clay and water. You now have some soft, workable clay."), + WATERING_CAN(new Item(5331), new Item(5340), "You fill the watering can."), + WATERING_CAN7(new Item(5339), new Item(5340), "You fill the watering can."), + WATERING_CAN6(new Item(5338), new Item(5340), "You fill the watering can."), + WATERING_CAN5(new Item(5337), new Item(5340), "You fill the watering can."), + WATERING_CAN4(new Item(5336), new Item(5340), "You fill the watering can."), + WATERING_CAN3(new Item(5335), new Item(5340), "You fill the watering can."), + WATERING_CAN2(new Item(5334), new Item(5340), "You fill the watering can."), + WATERING_CAN1(new Item(5333), new Item(5340), "You fill the watering can."), + WATER_SKIN0(new Item(1831), new Item(1823), "You fill the waterskin."), + WATER_SKIN1(new Item(1829),new Item(1823),"You fill the waterskin."), + WATER_SKIN2(new Item(1827), new Item(1823), "You fill the waterskin."), + FISHBOWL(new Item(Items.FISHBOWL_6667), new Item(Items.FISHBOWL_6668)); + + /** + * Represents the required item. + */ + private final Item required; + + /** + * Represents the product item. + */ + private final Item product; + + /** + * Represents the message to display. + */ + private final String message; + + /** + * Constructs a new {@code WaterSourcePlugin} {@code Object}. + * @param required the required item. + * @param product the product item. + * @param message the message item. + */ + WaterRecipient(final Item required, final Item product, final String message) { + this.required = required; + this.product = product; + this.message = message; + } + + /** + * Constructs a new {@code WaterSourcePlugin} {@code Object}. + * @param required the required item. + * @param product the product. + */ + WaterRecipient(final Item required, final Item product) { + this(required, product, "You fill the " + required.getName().toLowerCase() + " with water."); + } + + /** + * Method used to handle the interaction. + * @param player the player. + */ + public final void handle(final GameObject object, final Player player) { + if (object.getId() == 11661 + && required.getId() == Items.BUCKET_1925 + && !player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0,7)) { + player.getPulseManager().run(new Pulse(2, player) { + @Override + public boolean pulse() { + if (player.getInventory().remove(getRequired())) { + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage(getMessage()); + player.getInventory().add(getProduct()); + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player, 0, 7, true); + } + return !player.getInventory().containsItem(getRequired()); + } + }); + } else { + player.getPulseManager().run(new Pulse(1, player) { + @Override + public boolean pulse() { + if (player.getInventory().remove(getRequired())) { + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage(getMessage()); + player.getInventory().add(getProduct()); + } + return !player.getInventory().containsItem(getRequired()); + } + + @Override + public void stop() { + super.stop(); + } + }); + } + } + + /** + * Gets the required. + * @return The required. + */ + public Item getRequired() { + return required; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the message. + * @return The message. + */ + public String getMessage() { + return message; + } + + /** + * Gets the recipient ids. + * @return the ids. + */ + public static int[] getIds() { + int[] ids = new int[values().length]; + for (int i = 0; i < ids.length; i++) { + ids[i] = values()[i].getRequired().getId(); + } + return ids; + } + + /** + * Gets the water recipient for the item. + * @param item the item. + * @return the {@code WaterRecipient} {@code Object}. + */ + public static WaterRecipient forItem(final Item item) { + for (WaterRecipient recipient : values()) { + if (recipient.getRequired().getId() == item.getId()) { + return recipient; + } + } + return null; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withplayer/ChristmasCrackerUsage.java b/Server/src/main/java/Server/core/game/interaction/item/withplayer/ChristmasCrackerUsage.java new file mode 100644 index 000000000..76cc6d01d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withplayer/ChristmasCrackerUsage.java @@ -0,0 +1,66 @@ +package core.game.interaction.item.withplayer; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the breaking of a christmas cracker on a player. + * @author Vexia + */ +@Initializable +public final class ChristmasCrackerUsage extends UseWithHandler { + + /** + * The party hat items. + */ + private static final Item[] HATS = new Item[] { new Item(1038), new Item(1040), new Item(1042), new Item(1044), new Item(1046), new Item(1048) }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(962, PLAYER_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player target = (Player) event.getUsedWith(); + if (target == null || !target.isActive() || target.getLocks().isInteractionLocked() || target.getInterfaceManager().getOpened() != null) { + event.getPlayer().getPacketDispatch().sendMessage("The other player is currently busy."); + return true; + } + if (target.getInventory().freeSlots() == 0) { + event.getPlayer().sendMessage("The other player doesn't have enough inventory space."); + return true; + } + Player player = event.getPlayer(); + if (player.getInventory().remove(event.getUsedItem())) { + player.faceTemporary(target, 2); + player.lock(3); + player.animate(Animation.create(451)); + player.graphics(Graphics.create(176)); + player.sendMessage("You pull a Christmas cracker..."); + boolean winner = RandomFunction.random(2) == 1; + player.sendMessage(winner ? "You get the prize from the cracker." : "The person you pull the cracker with gets the prize."); + if (winner) { + player.sendChat("Hey! I got the cracker!"); + } else { + target.sendChat("Hey! I got the cracker!"); + } + Item hat = RandomFunction.getRandomElement(HATS); + if (winner) { + player.getInventory().add(hat, player); + } else { + target.getInventory().add(hat, target); + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/item/withplayer/FieldRationUsage.java b/Server/src/main/java/Server/core/game/interaction/item/withplayer/FieldRationUsage.java new file mode 100644 index 000000000..abe37b298 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/item/withplayer/FieldRationUsage.java @@ -0,0 +1,40 @@ +package core.game.interaction.item.withplayer; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles using a field ration on a player. + * @author Emperor + */ +@Initializable +public final class FieldRationUsage extends UseWithHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(7934, PLAYER_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Item item = (Item) event.getUsed(); + Player target = (Player) event.getUsedWith(); + if (target == null || !target.isActive() || target.getLocks().isInteractionLocked()) { + event.getPlayer().getPacketDispatch().sendMessage("The other player is currently busy."); + return true; + } + if (event.getPlayer().getInventory().remove(item)) { + target.getSkills().heal(12); + target.getPacketDispatch().sendMessage("You have been healed by a field ration."); + event.getPlayer().getPacketDispatch().sendMessage("You use the field ration to heal the other player."); + return true; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/AlKahridLeafletPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/AlKahridLeafletPlugin.java new file mode 100644 index 000000000..452d6ceee --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/AlKahridLeafletPlugin.java @@ -0,0 +1,30 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for ali the leaflet npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AlKahridLeafletPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(3680, node, true); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(3680).getHandlers().put("option:take-flyer", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/AlkharidHealPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/AlkharidHealPlugin.java new file mode 100644 index 000000000..27feab0ce --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/AlkharidHealPlugin.java @@ -0,0 +1,35 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the npcs in alkharid which can heal you. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AlkharidHealPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(962).getHandlers().put("option:heal", this); + NPCDefinition.forId(961).getHandlers().put("option:heal", this); + NPCDefinition.forId(960).getHandlers().put("option:heal", this); + NPCDefinition.forId(959).getHandlers().put("option:heal", this); + NPCDefinition.forId(958).getHandlers().put("option:heal", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(((NPC) node).getId(), ((NPC) node)); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/BogrogPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/BogrogPlugin.java new file mode 100644 index 000000000..92ce71e08 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/BogrogPlugin.java @@ -0,0 +1,137 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.component.Component; +import core.game.container.access.InterfaceContainer; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the bogrog npc. + * @author Vexia + */ +@Initializable +public final class BogrogPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(4472).getHandlers().put("option:swap", this); + PluginManager.definePlugin(new BogrogDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "swap": + openSwap(player); + break; + } + return true; + } + + /** + * Opens the swap interface. + * @param player the player. + */ + private void openSwap(Player player) { + if (player.getSkills().getStaticLevel(Skills.SUMMONING) < 21) { + player.sendMessage("You need a Summoning level of at least 21 in order to do that."); + return; + } else { + InterfaceContainer.generateItems(player,player.getInventory().toArray(),new String[] {"Swap X","Swap 10","Swap 5","Swap 1","Value"}, 644,0,7,4,200); + player.getInterfaceManager().openSingleTab(new Component(644)); + } + } + + /** + * Handles the bogrog dialogue. + * @author Vexia + */ + public final class BogrogDialogue extends DialoguePlugin { + + /** + * Constructs a new {@Code BogrogDialogue} {@Code Object} + */ + public BogrogDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code BogrogDialogue} {@Code Object} + * @param player the player. + */ + public BogrogDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BogrogDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hey, yooman, what you wanting?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Can I buy some summoning supplies?", "Are you interested in buying pouch pouches or scrolls?"); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("Can I buy some summoning supplies?"); + stage = 10; + break; + case 2: + player("Are you interested in buying pouch pouches or scrolls?"); + stage = 20; + break; + } + break; + case 10: + npc("Hur, hur, hur! Yooman's gotta buy lotsa stuff if yooman", "wants ta train good!"); + stage++; + break; + case 11: + npc.openShop(player); + end(); + break; + case 20: + npc("Des other ogre's stealin' Bogrog's stock. Gimmie pouches", "and scrolls and yooman gets da shardies."); + stage++; + break; + case 21: + player("Ok."); + stage++; + break; + case 22: + openSwap(player); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4472 }; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/BogrogPouchSwapper.kt b/Server/src/main/java/Server/core/game/interaction/npc/BogrogPouchSwapper.kt new file mode 100644 index 000000000..0dfee3a45 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/BogrogPouchSwapper.kt @@ -0,0 +1,85 @@ +package core.game.interaction.npc + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.RunScript +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.world.map.zone.ZoneBorders +import core.game.node.entity.skill.summoning.SummoningPouch +import core.game.node.entity.skill.summoning.SummoningScroll +import kotlin.math.ceil + +/** + * Handles swapping pouches/scrolls for shards. + * We decided to use the GE set exchange interface for this because it's the only one we could find + * that allowed us to do what we needed. Jagex did the same thing as far as we can tell. + * @author Ceikry + */ +object BogrogPouchSwapper { + //Opcodes for item options + private const val OP_VALUE = 155 + private const val OP_SWAP_1 = 196 + private const val OP_SWAP_5 = 124 + private const val OP_SWAP_10 = 199 + private const val OP_SWAP_X = 234 + + private const val SPIRIT_SHARD = 12183 + + //GE Zone borders because shitty hack lol + private val GEBorders = ZoneBorders(3151,3501,3175,3477) + + @JvmStatic + fun handle(player: Player, opcode: Int, slot: Int, itemID: Int): Boolean{ + if(GEBorders.insideBorder(player)) return false + return when(opcode){ + OP_VALUE -> sendValue(player.inventory.get(slot).id,player) + OP_SWAP_1 -> swap(player, 1, player.inventory.get(slot).id) + OP_SWAP_5 -> swap(player, 5, player.inventory.get(slot).id) + OP_SWAP_10 -> swap(player,10,player.inventory.get(slot).id) + OP_SWAP_X -> true.also{ + player.dialogueInterpreter.sendInput(false, "Enter the amount:") + player.setAttribute("runscript", object : RunScript() { + override fun handle(): Boolean { + swap(player,getValue() as Int, player.inventory.get(slot).id) + return true + } + }) + } + else -> false + } + } + + private fun swap(player: Player, amount: Int, itemID: Int): Boolean{ + var amt = amount + val value = getValue(itemID) + if(value == 0){ + return false + } + val inInventory = player.inventory.getAmount(itemID) + if(amount > inInventory) + amt = inInventory + player.inventory.remove(Item(itemID,amt)) + player.inventory.add(Item(SPIRIT_SHARD,value * amt)) + player.interfaceManager.close(Component(644)) + return true + } + + private fun sendValue(itemID: Int, player: Player): Boolean{ + val value = getValue(itemID) + if(value == 0){ + return false + } + + player.sendMessage("Bogrog will give you $value shards for that.") + return true + } + + private fun getValue(itemID: Int): Int{ + var item = SummoningPouch.get(itemID) + if(item == null) item = SummoningPouch.get(Item(itemID).noteChange) + if(item == null) item = SummoningPouch.get(SummoningScroll.forItemId(itemID)?.pouch ?: -1) + item ?: return 0 + return ceil(item.items[item.items.size - 1].amount * 0.7).toInt() + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/npc/BurthorpeOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/BurthorpeOptionPlugin.java new file mode 100644 index 000000000..d90c1a2a6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/BurthorpeOptionPlugin.java @@ -0,0 +1,121 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the optione plugin to handle interactions with 'nodes' in + * burthorpe. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BurthorpeOptionPlugin extends OptionHandler { + + /** + * Represents the thieving guide location. + */ + private static final Location GUIDE_LOCATION = new Location(3061, 4985, 1); + + /** + * Represents the bar location. + */ + private static final Location BAR_LOCATION = new Location(2906, 3537, 0); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(1063).getHandlers().put("option:talk-to", this);// soldier + NPCDefinition.forId(1061).getHandlers().put("option:talk-to", this);// sergant + NPCDefinition.forId(1066).getHandlers().put("option:talk-to", this);// seated + // soldier + NPCDefinition.forId(1067).getHandlers().put("option:talk-to", this);// seated + // soldier + NPCDefinition.forId(1068).getHandlers().put("option:talk-to", this);// seated + // soldier + NPCDefinition.forId(1064).getHandlers().put("option:talk-to", this);// other + // soldiers + NPCDefinition.forId(1062).getHandlers().put("option:talk-to", this);// other + // sergant + ObjectDefinition.forId(7257).getHandlers().put("option:enter", this);// thieving + // guide + // trapdoor. + ObjectDefinition.forId(7258).getHandlers().put("option:enter", this);// thieving + // guide + // passegeway. + NPCDefinition.forId(1073).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(1074).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(1076).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(1077).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(4624).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(4627).getHandlers().put("option:climb-down", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = node instanceof NPC ? ((NPC) node).getId() : ((GameObject) node).getId(); + switch (option) { + case "climb-down": + switch (id) { + case 4624: + ClimbActionHandler.climb(player, Animation.create(828), Location.create(2205, 4934, 1)); + break; + } + break; + case "climb-up": + switch (id) { + case 4627: + ClimbActionHandler.climb(player, Animation.create(828), Location.create(2899, 3565, 0)); + break; + } + break; + case "enter": + switch (id) { + case 7257: + player.getProperties().setTeleportLocation(GUIDE_LOCATION); + break; + case 7258: + player.getProperties().setTeleportLocation(BAR_LOCATION); + break; + } + break; + case "talk-to": + switch (id) { + case 1064: + case 1063:// training soldier. + player.getPacketDispatch().sendMessage("The soldier is busy training."); + break; + case 1062: + case 1061:// sergeant + player.getPacketDispatch().sendMessage("The Sergeant is busy training the soldiers."); + break; + case 1066:// eating soldier. + case 1067:// eating soldier. + case 1068:// eating soldier. + player.getPacketDispatch().sendMessage("The soldier is busy eating."); + break; + case 1073: + case 1074: + player.getPacketDispatch().sendMessage("The archer won't talk whilst on duty."); + break; + case 1076: + case 1077: + player.getPacketDispatch().sendMessage("The soldier won't talk whilst on duty."); + break; + } + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/BurthorpeTrainNPC.java b/Server/src/main/java/Server/core/game/interaction/npc/BurthorpeTrainNPC.java new file mode 100644 index 000000000..77231d2aa --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/BurthorpeTrainNPC.java @@ -0,0 +1,181 @@ +package core.game.interaction.npc; + +import java.util.List; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents a burthorpe training npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class BurthorpeTrainNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] IDS = { /** dummy soldier */ + 1063, /** sergant */ + 1061, /** seated soldier */ + 1066, 1067, 1068, /** other sergant */ + 1062, /** other soldiers */ + 1064, 1073, 1074, 1076, 1077 }; + + /** + * Represents the punching animation. + */ + private static final Animation PUNCH = new Animation(422); + + /** + * Represents the kicking animation. + */ + private static final Animation KICK = new Animation(423); + + /** + * Represents the defending animation. + */ + private static final Animation DEFEND = new Animation(424); + + /** + * Represents the eating animation. + */ + private static final Animation EAT = new Animation(1145); + + /** + * Represents the messages the sergant can say. + */ + private static final String[] MESSAGES = new String[] { "Good work soldier!", "Push it!", "Work it!", "The dummy is the enemy. Kill it!", "Put your back into it soldier!", "You're not out for a sunday stroll soldier!", "My daughter can hit harder than that!", "I want to see you sweat!", "Keep it up soldier!" }; + + /** + * Represents the delay. + */ + private long delay; + + /** + * Constructs a new {@code BurthorpeTrainNPC} {@code Object}. + */ + public BurthorpeTrainNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private BurthorpeTrainNPC(int id, Location location) { + super(id, location, id == 1061 ? true : false); + super.setDirection(Direction.EAST); + } + + @Override + public void init() { + super.init(); + if (getId() == 1063) { + faceLocation(getLocation().transform(2, 0, 0)); + } + if (getId() == 1066 || getId() == 1067 || getId() == 1068) { + faceLocation(Location.create(2893, 3532, 0)); + } + if (getId() == 1064) { + faceLocation(getLocation().transform(0, 1, 0)); + } + if (getId() == 1062) { + faceLocation(Location.create(2893, 3539, 0)); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BurthorpeTrainNPC(id, location); + } + + @Override + public void tick() { + if (delay < System.currentTimeMillis()) { + action(); + } + super.tick(); + } + + @Override + public int getWalkRadius() { + return getId() == 1061 ? 6 : 12; + } + + @Override + public int[] getIds() { + return IDS; + } + + /** + * Method used to do the reward of this npc. + */ + private final void action() { + switch (getId()) { + case 1061:// sergant + sendChat(MESSAGES[RandomFunction.random(MESSAGES.length)]); + delay = System.currentTimeMillis() + 9000 + RandomFunction.random(1000, 5000); + final List soldiers = RegionManager.getLocalNpcs(this); + NPC soldier = null; + while (soldier == null) { + soldier = soldiers.get(RandomFunction.random(soldiers.size())); + if (soldier.getId() != 1063) { + soldier = null; + } + } + final NPC sol = soldier; + GameWorld.getPulser().submit(new Pulse(1) { + final NPC sold = sol; + @Override + public boolean pulse() { + sold.sendChat("Yes, sir!"); + return true; + } + }); + break; + case 1063:// soldier. + faceLocation(getLocation().transform(2, 0, 0)); + animate(RandomFunction.random(2) == 1 ? PUNCH : KICK); + delay = System.currentTimeMillis() + 3000 + RandomFunction.random(1000, 3000); + break; + case 1066: + case 1067: + case 1068:// seated soldier. + animate(EAT); + delay = System.currentTimeMillis() + 3000 + RandomFunction.random(1000, 2000); + break; + case 1062: + final int rand = RandomFunction.random(5); + final Animation animation = rand == 1 ? PUNCH : rand == 2 ? KICK : DEFEND; + animate(animation); + delay = System.currentTimeMillis() + 3500; + faceLocation(getLocation().transform(0, -1, 0)); + GameWorld.getPulser().submit(new Pulse(2) { + @Override + public boolean pulse() { + final List soldiers = RegionManager.getLocalNpcs(BurthorpeTrainNPC.this, 12); + for (NPC n : soldiers) { + if (n.getId() != 1064) { + continue; + } + n.animate(animation); + } + return true; + } + }); + break; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/CanafisWereWolfPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/CanafisWereWolfPlugin.java new file mode 100644 index 000000000..b464579fe --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/CanafisWereWolfPlugin.java @@ -0,0 +1,67 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the attacking of a werwolf. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CanafisWereWolfPlugin extends OptionHandler { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(6543); + + /** + * Represents the id to transform into. + */ + private static final int TRANSFORM_ID = 6006; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 6026; i < 6046; i++) { + NPCDefinition.forId(i).getHandlers().put("option:attack", this); + } + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (!player.getEquipment().contains(2952, 1)) { + player.lock(2); + final NPC n = (NPC) node; + final NPC newN = NPC.create(TRANSFORM_ID, n.getLocation()); + newN.init(); + newN.animate(ANIMATION); + n.clear(); + newN.lock(2); + newN.setRespawn(false); + newN.setAttribute("original", n.getId()); + newN.setAttribute("loc", n.getProperties().getSpawnLocation()); + GameWorld.getPulser().submit(new Pulse(2) { + @Override + public boolean pulse() { + newN.getProperties().getCombatPulse().attack(player); + return true; + } + }); + } else { + player.getPulseManager().clear("interaction:attack:" + node.hashCode()); + player.getProperties().getCombatPulse().attack(node); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/CustomsOfficerPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/CustomsOfficerPlugin.java new file mode 100644 index 000000000..068de18ce --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/CustomsOfficerPlugin.java @@ -0,0 +1,37 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the customs officer plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CustomsOfficerPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(380).getHandlers().put("option:pay-fare", this); + NPCDefinition.forId(381).getHandlers().put("option:pay-fare", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getQuestRepository().isComplete("Pirate's Treasure")) { + player.getDialogueInterpreter().open(((NPC) node).getId(), ((NPC) node)); + player.getPacketDispatch().sendMessage("You may only use the Pay-fare option after completing Pirate's Treasure."); + return true; + } + player.getDialogueInterpreter().open(((NPC) node).getId(), ((NPC) node), true); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/DoomsayerTogglePlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/DoomsayerTogglePlugin.java new file mode 100644 index 000000000..ccc856fd3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/DoomsayerTogglePlugin.java @@ -0,0 +1,55 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the option plugin used to toggle the doomsayer interface. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class DoomsayerTogglePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(3777).getHandlers().put("option:toggle-warnings", this); + new WarningMessagePlugin().newInstance(arg); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getWarningMessages().open(player); + return true; + } + + /** + * Represents the plugin used to handle the warning message plugin. + * @author 'Vexia + */ + public final class WarningMessagePlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(583, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (button > 45 && button < 74) { + player.getWarningMessages().getMessage(button).toggle(player); + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/GabootyTrade.java b/Server/src/main/java/Server/core/game/interaction/npc/GabootyTrade.java new file mode 100644 index 000000000..07f762f95 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/GabootyTrade.java @@ -0,0 +1,54 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; + +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.config.ShopParser; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for trading with Gabooty + * + * @author 'qmqz + * @version 1.0 + */ +@Initializable +public final class GabootyTrade extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(2521).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(2521).getHandlers().put("option:trade-co-op", this); + NPCDefinition.forId(2521).getHandlers().put("option:trade-drinks", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final NPC npc = (NPC) node; + switch (npc.getId()) { + case 2519: + case 2520: + case 2521: + switch (option) { + case "talk-to": + player.getDialogueInterpreter().open(2521, node.asNpc()); + return true; + + case "trade-co-op": + ShopParser.Companion.openUid(player, 226); + return true; + + case "trade-drinks": + ShopParser.Companion.openUid(player, 227); + return true; + } + break; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/GameInstructorPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/GameInstructorPlugin.java new file mode 100644 index 000000000..7872c6d6d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/GameInstructorPlugin.java @@ -0,0 +1,36 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the 2009scape instructor plugin. + * @author 'Vexia + * @date 20.11.2013 + */ +@Initializable +public class GameInstructorPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(4707).getHandlers().put("option:claim", this); + NPCDefinition.forId(1861).getHandlers().put("option:claim", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "claim": + player.getDialogueInterpreter().open(((NPC) node).getId(), ((NPC) node), true); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/GliderPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/GliderPlugin.java new file mode 100644 index 000000000..867853fcd --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/GliderPlugin.java @@ -0,0 +1,37 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.component.Component; +import core.game.content.global.travel.glider.Gliders; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for gliders. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GliderPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(3809).getHandlers().put("option:glider", this); + NPCDefinition.forId(3810).getHandlers().put("option:glider", this); + NPCDefinition.forId(3811).getHandlers().put("option:glider", this); + NPCDefinition.forId(3812).getHandlers().put("option:glider", this); + NPCDefinition.forId(3813).getHandlers().put("option:glider", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getInterfaceManager().open(new Component(138)); + Gliders.sendConfig(node.asNpc(), player); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/HairCutPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/HairCutPlugin.java new file mode 100644 index 000000000..f3ed0eb83 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/HairCutPlugin.java @@ -0,0 +1,31 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the hairdresser. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HairCutPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(598).getHandlers().put("option:hair-cut", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(598, ((NPC) node), true); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/NPCDisturbPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/NPCDisturbPlugin.java new file mode 100644 index 000000000..56d23e6b6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/NPCDisturbPlugin.java @@ -0,0 +1,51 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.IdleAbstractNPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the disturb option. + * @author Emperor + * + */ +@Initializable +public final class NPCDisturbPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("disturb", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (node instanceof IdleAbstractNPC) { + IdleAbstractNPC npc = (IdleAbstractNPC) node; + if (npc.canDisturb(player)) { + npc.disturb(player); + } + return true; + } + return false; + } + + @Override + public boolean isWalk(final Player player, final Node node) { + if (node instanceof IdleAbstractNPC) { + IdleAbstractNPC npc = (IdleAbstractNPC) node; + return !npc.inDisturbingRange(player); + } + return false; + } + + @Override + public boolean isWalk() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/NPCTalkPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/NPCTalkPlugin.java new file mode 100644 index 000000000..54a3b2710 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/NPCTalkPlugin.java @@ -0,0 +1,78 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.activity.gnomecooking.GnomeCookingJob; +import core.game.content.activity.gnomecooking.GnomeTipper; +import core.game.content.dialogue.FacialExpression; + +import static core.game.content.activity.gnomecooking.GnomeCookingConstantsKt.*; +import static core.tools.stringtools.StringToolsKt.colorize; + +/** + * Handles the NPC talk-to option. + * @author Emperor + */ +@Initializable +public final class NPCTalkPlugin extends OptionHandler { + + @Override + public Location getDestination(Node n, Node node) { + NPC npc = (NPC) node; + if (npc.getAttribute("facing_booth", false)) { + int offsetX = npc.getDirection().getStepX() << 1; + int offsetY = npc.getDirection().getStepY() << 1; + return npc.getLocation().transform(offsetX, offsetY, 0); + } + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final NPC npc = (NPC) node; + if (!npc.getAttribute("facing_booth", false)) { + npc.faceLocation(player.getLocation()); + } + //I'm sorry for this but it was honestly the best way to do this + if(player.getAttribute(GC_BASE_ATTRIBUTE +":"+ GC_JOB_ORDINAL,-1) != -1){ + GnomeCookingJob job = GnomeCookingJob.values()[player.getAttribute(GC_BASE_ATTRIBUTE + ":" + GC_JOB_ORDINAL,-1)]; + if(node.getId() == job.getNpc_id() && !player.getAttribute(GC_BASE_ATTRIBUTE + ":" + GC_JOB_COMPLETE,false)){ + Item neededItem = player.getAttribute(GC_BASE_ATTRIBUTE + ":" + GC_NEEDED_ITEM,null); + if(neededItem != null && player.getInventory().containsItem(neededItem)) { + player.getDialogueInterpreter().sendDialogues(job.getNpc_id(), FacialExpression.OLD_HAPPY, "Thank you!"); + player.getInventory().remove(neededItem); + player.getInventory().add(GnomeTipper.getTip(job.getLevel())); + player.removeAttribute(GC_BASE_ATTRIBUTE + ":" + GC_JOB_ORDINAL); + player.removeAttribute(GC_BASE_ATTRIBUTE + ":" + GC_NEEDED_ITEM); + int curPoints = player.getAttribute(GC_BASE_ATTRIBUTE + ":" + GC_POINTS,0); + curPoints += 3; + if(curPoints == 12){ + player.getInventory().add(new Item(9474)); + player.sendMessage(colorize("%RYou have been granted a food delivery token. Use it to have food delivered.")); + } else if(curPoints % 12 == 0){ + int curRedeems = player.getAttribute(GC_BASE_ATTRIBUTE + ":" + GC_REDEEMABLE_FOOD,0); + player.setAttribute("/save:" + GC_BASE_ATTRIBUTE + ":" + GC_REDEEMABLE_FOOD,curRedeems != 10 ? ++curRedeems : curRedeems); + player.sendMessage(colorize("%RYou have been granted a single food delivery charge.")); + } + player.setAttribute("/save:" + GC_BASE_ATTRIBUTE + ":" + GC_POINTS,curPoints); + } + return true; + } + } + return player.getDialogueInterpreter().open(npc.getId(), npc); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("talk-to", this); + NPCDefinition.setOptionHandler("talk", this); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/NPCTradePlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/NPCTradePlugin.java new file mode 100644 index 000000000..ab37bc5fa --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/NPCTradePlugin.java @@ -0,0 +1,41 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.component.Component; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.skill.crafting.TanningProduct; + +/** + * Represents the plugin used for an npc with the trade option. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class NPCTradePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("trade", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final NPC npc = (NPC) node; + if (npc.getId() == 2824) { + TanningProduct.open(player, 2824); + return true; + } + if(npc.getId() == 7601){ + player.getInterfaceManager().open(new Component(732)); + return true; + } + return node.asNpc().openShop(player); + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/RechargeSceptre.java b/Server/src/main/java/Server/core/game/interaction/npc/RechargeSceptre.java new file mode 100644 index 000000000..1ca605cc0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/RechargeSceptre.java @@ -0,0 +1,219 @@ +package core.game.interaction.npc; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Allows the sceptre to be recharged by using it on the Guardian Mummy + * @author ceik + */ +@Initializable +public class RechargeSceptre extends UseWithHandler { + Item usedSceptre = new Item(4950); + int clayRecharge[] = new int[24]; + int stoneRecharge[] = new int[12]; + int goldRecharge[] = new int[6]; + public RechargeSceptre() { + super(9046, 9048, 9050); + } + @Override + public Plugin newInstance(Object arg) throws Throwable { + new RechargeDialogue().init(); + addHandler(4476, NPC_TYPE, this); + return this; + } + @Override + public boolean handle(NodeUsageEvent event){ + final Player player = event.getPlayer(); + player.getDialogueInterpreter().open(999876,event.getUsedItem()); + return true; + } + public class RechargeDialogue extends DialoguePlugin { + public RechargeDialogue() { + /** + * empty + */ + } + public RechargeDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){ return new RechargeDialogue(player);} + + @Override + public boolean open(Object... args){ + usedSceptre = (Item) args[0]; + player.getPacketDispatch().sendMessage("" + args[0]); + interpreter.sendDialogue("Mrrrh, how do you have this? You shouldn't.", "Nevertheless, I can recharge this for you."); + return true; + } + @Override + public boolean handle(int dialogId, int buttonId){ + switch(stage){ + case 0: + interpreter.sendOptions("Recharge sceptre?", "Yes, please.", "No, thanks."); + stage = 1; + break; + case 1: + switch(buttonId){ + case 1: + interpreter.sendOptions("Recharge with?","Clay/Ivory Artefacts(24)","Stone Artefacts(12)","Gold Artefacts(6)"); + stage = 20; + break; + case 2: + stage = 100; + break; + } + break; + case 20: + switch(buttonId){ + case 1: { + int totalCounter = 0; + for (int i = 0; i < 28; i++) { + if (totalCounter == 24) { + break; + } + int thisSlot = player.getInventory().getId(i); + if (thisSlot == 9026) { + clayRecharge[totalCounter] = i; + totalCounter += 1; + } + } + for (int i = 0; i < 28; i++) { + if (totalCounter == 24) { + break; + } + int thisSlot = player.getInventory().getId(i); + if (thisSlot == 9032) { + clayRecharge[totalCounter] = i; + totalCounter += 1; + } + } + for (int i = 0; i < 28; i++) { + if (totalCounter == 24) { + break; + } + int thisSlot = player.getInventory().getId(i); + if (thisSlot == 9036) { + clayRecharge[totalCounter] = i; + totalCounter += 1; + } + } + if (clayRecharge[23] == 0) { + player.getPacketDispatch().sendMessage("You do not have enough clay/ivory artifacts."); + end(); + break; + } + for (int i = 0; i < 24; i++) { + player.getInventory().remove(new Item(player.getInventory().getId(clayRecharge[i])), clayRecharge[i], true); + } + player.getInventory().remove(usedSceptre); + player.getInventory().add(new Item(9044)); + player.getPacketDispatch().sendMessage("Your Pharoah's Sceptre has been fully recharged!"); + clayRecharge[23] = 0; + end(); + break; + } + case 2: { + int totalCounter = 0; + for (int i = 0; i < 28; i++) { + if (totalCounter == 12) { + break; + } + int thisSlot = player.getInventory().getId(i); + if (thisSlot == 9042) { + stoneRecharge[totalCounter] = i; + totalCounter += 1; + } + } + for (int i = 0; i < 28; i++) { + if (totalCounter == 12) { + break; + } + int thisSlot = player.getInventory().getId(i); + if (thisSlot == 9030) { + stoneRecharge[totalCounter] = i; + totalCounter += 1; + } + } + for (int i = 0; i < 28; i++) { + if (totalCounter == 12) { + break; + } + int thisSlot = player.getInventory().getId(i); + if (thisSlot == 9038) { + stoneRecharge[totalCounter] = i; + totalCounter += 1; + } + } + if (stoneRecharge[11] == 0) { + player.getPacketDispatch().sendMessage("You do not have enough stone artifacts."); + end(); + break; + } + for (int i = 0; i < 12; i++) { + player.getInventory().remove(new Item(player.getInventory().getId(stoneRecharge[i])), stoneRecharge[i], true); + } + player.getInventory().remove(usedSceptre); + player.getInventory().add(new Item(9044)); + player.getPacketDispatch().sendMessage("Your Pharoah's Sceptre has been fully recharged!"); + stoneRecharge[11] = 0; + end(); + break; + } + case 3: { + int totalCounter = 0; + for(int i = 0; i < 28; i++){ + if(totalCounter == 6) {break;} + int thisSlot = player.getInventory().getId(i); + if(thisSlot == 9040){ + goldRecharge[totalCounter] = i; + totalCounter += 1; + } + } + for(int i = 0; i < 28; i++){ + if(totalCounter == 6) {break;} + int thisSlot = player.getInventory().getId(i); + if(thisSlot == 9028){ + goldRecharge[totalCounter] = i; + totalCounter += 1; + } + } + for(int i = 0; i < 28; i++){ + if(totalCounter == 6) {break;} + int thisSlot = player.getInventory().getId(i); + if(thisSlot == 9034){ + goldRecharge[totalCounter] = i; + totalCounter += 1; + } + } + if(goldRecharge[5] == 0){player.getPacketDispatch().sendMessage("You do not have enough gold artifacts."); end(); break;} + for(int i = 0; i < 6; i++){ + player.getInventory().remove( new Item (player.getInventory().getId(goldRecharge[i])), goldRecharge[i], true); + } + player.getInventory().remove(usedSceptre); + player.getInventory().add(new Item(9044)); + player.getPacketDispatch().sendMessage("Your Pharoah's Sceptre has been fully recharged!"); + goldRecharge[5] = 0; + end(); + break; + } + } + break; + case 100: + end(); + break; + } + return true; + } + @Override + public int[] getIds() { + return new int[] { 999876 }; + } + } +} + diff --git a/Server/src/main/java/Server/core/game/interaction/npc/RoavarDialogue.java b/Server/src/main/java/Server/core/game/interaction/npc/RoavarDialogue.java new file mode 100644 index 000000000..0af8a4669 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/RoavarDialogue.java @@ -0,0 +1,152 @@ +package core.game.interaction.npc; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Handles the RoavarDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class RoavarDialogue extends DialoguePlugin { + + public RoavarDialogue() { + + } + + public RoavarDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new RoavarDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello there!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Greeting traveller. Welcome to 'The Hair Of The Dog'", "Tavern. What can I do you for?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Can I buy a beer?", "Can I hear some gossipp?", "Do you have a spare silver sickle?", "Nothing thanks."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I buy a beer?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I hear some gossip?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Would you happen to have a spare silver sickle?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nothing thanks."); + stage = 40; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well that's my speciality! The local brew's named", "'Moonlight Mead' and will set you back 5 gold.", "Waddya say? Fancy a pint?"); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Yes please.", "Actually, no thanks."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please."); + stage = 15; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Actually, no thanks."); + stage = 14; + break; + + } + break; + case 14: + end(); + break; + case 15: + if (player.getInventory().contains(995, 5)) { + if (player.getInventory().remove(new Item(995, 5))) { + player.getInventory().add(new Item(2955, 1)); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Here ya go pal. Enjoy!"); + stage = 16; + } + } else { + end(); + player.getPacketDispatch().sendMessage("You need 5 gold coins to buy a pint of beer."); + } + break; + case 16: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I am not one to gossip!"); + stage = 21; + break; + case 21: + end(); + break; + case 30: + if (player.getInventory().contains(2963, 1)) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I don't have a spare lying around, sorry friend.", "Hopefully you'll find something else that can protect you", "against ghasts!"); + stage = 31; + } else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah, well I do have one lying around.", "I suppose you could have it."); + stage = 42; + } + break; + case 31: + end(); + break; + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "...I don't know why you talked to me if you don't want", "anything then..."); + stage = 41; + break; + case 41: + end(); + break; + case 42: + if (player.getInventory().freeSlots() < 1) { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, nevermind. It seems your backpack is full."); + } else { + interpreter.sendDialogue("The bartender hands you a silver sickle."); + player.getInventory().add(new Item(2963, 1)); + } + stage = 31; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1042 }; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/RoavarOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/RoavarOptionPlugin.java new file mode 100644 index 000000000..772f752dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/RoavarOptionPlugin.java @@ -0,0 +1,26 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class RoavarOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(1042).getHandlers().put("option:trade", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(((NPC) node).getId(), ((NPC) node)); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/SanibochPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/SanibochPlugin.java new file mode 100644 index 000000000..a012c9e25 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/SanibochPlugin.java @@ -0,0 +1,29 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles Saniboch's options. + * @author Emperor + */ +@Initializable +public final class SanibochPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(1595).getHandlers().put("option:pay", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(1595, null, 35); + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/SawmillOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/SawmillOptionPlugin.java new file mode 100644 index 000000000..776989ec6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/SawmillOptionPlugin.java @@ -0,0 +1,48 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.component.Component; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin to handle the options for saw mill man. + * @author 'Vexia + * @date Oct 8, 2013 + */ +@Initializable +public class SawmillOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(4250).getHandlers().put("option:buy-plank", this); + NPCDefinition.forId(4250).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(4250).getHandlers().put("option:trade", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "buy-plank": + player.getInterfaceManager().open(new Component(403)); + return true; + case "talk-to": + player.getDialogueInterpreter().open(4250, node); + return true; + case "trade": + node.asNpc().openShop(player); + return true; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + return Location.create(3302, 3491, 0); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/SeamanPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/SeamanPlugin.java new file mode 100644 index 000000000..5dd786ef2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/SeamanPlugin.java @@ -0,0 +1,31 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents a plugin used to handle the pay fare option. + * @author 'Vexia + */ +@Initializable +public class SeamanPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("pay-fare", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final NPC npc = ((NPC) node); + player.getDialogueInterpreter().open(npc.getId(), npc, true); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/SecurityGuardPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/SecurityGuardPlugin.java new file mode 100644 index 000000000..32cbf3384 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/SecurityGuardPlugin.java @@ -0,0 +1,66 @@ +package core.game.interaction.npc; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.Items; + +@Initializable +public final class SecurityGuardPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new SecurityGuardDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (option.equals("talk-to")) { + player.getDialogueInterpreter().open(4375); + } + return true; + } + + public final class SecurityGuardDialogue extends DialoguePlugin { + + public SecurityGuardDialogue() {} + + public SecurityGuardDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SecurityGuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getInventory().hasSpaceFor(new Item(Items.SECURITY_BOOK_9003))) { + npc("Here's a Security book for you.", "Have a nice day."); + player.getInventory().add(new Item(Items.SECURITY_BOOK_9003)); + } else { + npc("Have a nice day."); + } + return false; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 4375 }; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/npc/ShantayOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/ShantayOptionPlugin.java new file mode 100644 index 000000000..7287e50bf --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/ShantayOptionPlugin.java @@ -0,0 +1,37 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Represents the option plguin. + * @author 'Vexia + */ +@Initializable +public class ShantayOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(836).getHandlers().put("option:buy-pass", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + DialogueInterpreter interpreter = player.getDialogueInterpreter(); + if (player.getInventory().remove(new Item(995, 5))) { + player.getInventory().add(new Item(1854)); + interpreter.sendItemMessage(1854, "You purchase a Shantay Pass."); + } else { + interpreter.sendDialogues(player, null, "Sorry, I don't seem to have enough money."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/SheepShearPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/SheepShearPlugin.java new file mode 100644 index 000000000..3551b72e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/SheepShearPlugin.java @@ -0,0 +1,81 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the plugin used to shear a sheep. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SheepShearPlugin extends OptionHandler { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(893); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("shear", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final NPC sheep = (NPC) node; + if (sheep.getId() == 3579) { + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("The... whatever it is... manages to get away from you!"); + sheep.animate(Animation.create(3570)); + sheep.moveStep(); + return true; + } + if (!player.getInventory().contains(1735, 1)) { + player.getPacketDispatch().sendMessage("You need shears to shear a sheep."); + return true; + } + if (sheep.getDefinition().hasAction("attack")) { + player.getPacketDispatch().sendMessage("That one looks a little too violent to shear..."); + return true; + } + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough space in your inventory to carry any wool you would shear."); + return true; + } + sheep.lock(3); + sheep.getWalkingQueue().reset(); + player.animate(ANIMATION); + int random = RandomFunction.random(1, 5); + if (random != 4) { + sheep.getLocks().lockMovement(2); + sheep.transform(5153); + player.getPacketDispatch().sendMessage("You get some wool."); + player.getInventory().add(new Item(1737, 1));// 5160 + GameWorld.getPulser().submit(new Pulse(80, sheep) { + @Override + public boolean pulse() { + sheep.reTransform(); + return true; + } + + }); + } else { + player.getPacketDispatch().sendMessage("The sheep manages to get away from you!"); + sheep.moveStep(); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/ShipCharterNPCPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/ShipCharterNPCPlugin.java new file mode 100644 index 000000000..c71ef1831 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/ShipCharterNPCPlugin.java @@ -0,0 +1,38 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.global.travel.ship.ShipCharter; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the "charter" option. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ShipCharterNPCPlugin extends OptionHandler { + + /** + * Represents the ship charter npcs. + */ + private static final int[] IDS = new int[] { 4650, 4651, 4652, 4653, 4654, 4655, 4656 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : IDS) { + NPCDefinition.forId(id).getHandlers().put("option:charter", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + ShipCharter.open(player); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/ShooAwayStrayDogPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/ShooAwayStrayDogPlugin.java new file mode 100644 index 000000000..010c4be9f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/ShooAwayStrayDogPlugin.java @@ -0,0 +1,43 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the option plugin used to shoo away a dog. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ShooAwayStrayDogPlugin extends OptionHandler { + + /** + * Represents the animatio to use. + */ + private static final Animation ANIMATION = new Animation(2110); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(5917).getHandlers().put("option:shoo-away", this); + NPCDefinition.setOptionHandler("shoo-away", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.sendChat("Thbbbbt!"); + player.animate(ANIMATION); + NPC dog = (NPC) node; + dog.sendChat("Whine!"); + dog.moveStep(); + dog.getPulseManager().clear(); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/SimonScepterInteraction.java b/Server/src/main/java/Server/core/game/interaction/npc/SimonScepterInteraction.java new file mode 100644 index 000000000..3c5972b0b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/SimonScepterInteraction.java @@ -0,0 +1,32 @@ +package core.game.interaction.npc; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles when a player uses a pharaoh scepter on Simon (necessary to be accurate) + * @author ceik + */ +@Initializable +public final class SimonScepterInteraction extends UseWithHandler { + + public SimonScepterInteraction() { + super(9044, 9046, 9048, 9050); + } + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(3123, NPC_TYPE, this); + //PluginManager.definePlugin(new SimonScepterInteraction()); + return this; + } + @Override + public boolean handle(NodeUsageEvent event){ + final Player player = event.getPlayer(); + player.getDialogueInterpreter().open(3123, ((NPC)event.getUsedWith()), true, false, event.getUsedItem().getId()); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/SpiritGraahkOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/SpiritGraahkOptionPlugin.java new file mode 100644 index 000000000..43b4977f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/SpiritGraahkOptionPlugin.java @@ -0,0 +1,29 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the spirit graahk familiar + * @author Splinter + */ +@Initializable +public final class SpiritGraahkOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(7363).getHandlers().put("option:interact", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + player.getDialogueInterpreter().open(7353, node.asNpc()); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/SpiritKyattOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/SpiritKyattOptionPlugin.java new file mode 100644 index 000000000..6bbae4248 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/SpiritKyattOptionPlugin.java @@ -0,0 +1,69 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the spirit kyatt familiar and the summoning area. + * @author Splinter + */ +@Initializable +public final class SpiritKyattOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(7365).getHandlers().put("option:interact", this); + ObjectDefinition.forId(28741).getHandlers().put("option:open", this); + ObjectDefinition.forId(28743).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(28743).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(14910).getHandlers().put("option:take", this); + ObjectDefinition.forId(14912).getHandlers().put("option:take", this); + return this; + } + + private final Item BRONZE_AXE = new Item(1351, 1); + private final Item BRONZE_PICKAXE = new Item(1265, 1); + + @Override + public boolean handle(final Player player, Node node, String option) { + switch(node.getId()){ + case 7365: + player.getDialogueInterpreter().open(7365, node.asNpc()); + break; + case 28741: + player.animate(new Animation(827)); + player.teleport(new Location(2333, 10015)); + break; + case 28743: + player.animate(new Animation(828)); + player.teleport(new Location(2328, 3646)); + break; + case 14912: + if (!player.getInventory().add(BRONZE_AXE)) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return true; + } + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(14908), 500); + break; + case 14910: + if (!player.getInventory().add(BRONZE_PICKAXE)) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return true; + } + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(14908), 500); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/TanningNPC.java b/Server/src/main/java/Server/core/game/interaction/npc/TanningNPC.java new file mode 100644 index 000000000..36e7a1ce7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/TanningNPC.java @@ -0,0 +1,30 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.crafting.TanningProduct; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class TanningNPC extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(1041).getHandlers().put("option:trade", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + TanningProduct.open(player, ((NPC) node).getId()); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/ThessaliaPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/ThessaliaPlugin.java new file mode 100644 index 000000000..4b17a7799 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/ThessaliaPlugin.java @@ -0,0 +1,28 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * @author 'Vexia. + */ +@Initializable +public class ThessaliaPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(548, true, true, true); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(548).getHandlers().put("option:change-clothes", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/ZaffPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/ZaffPlugin.java new file mode 100644 index 000000000..356f5b1ea --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/ZaffPlugin.java @@ -0,0 +1,395 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Represents the plugin used for buying a battle staff from zeke. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ZaffPlugin extends OptionHandler { + + /** + * The bacon ring. + */ + public static final Item BEACON_RING = new Item(11014); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("buy-battlestaves", this); + new ZaffDialogue().init(); + new ZaffStaveDialogue().init(); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(9679); + return true; + } + + /** + * Represents the dialogue plugin used for the zaff npc. + * @author 'Vexia + * @version 1.0 + */ + public static final class ZaffDialogue extends DialoguePlugin { + + /** + * Represents the staff item. + */ + @SuppressWarnings("unused") + private static final Item STAFF = new Item(11014, 1); + + /** + * The quest. + */ + private Quest quest; + + /** + * Constructs a new {@code ZaffDialogue} {@code Object}. + */ + public ZaffDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ZaffDialogue} {@code Object}. + * @param player the player. + */ + public ZaffDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ZaffDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("What Lies Below"); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Would you like to buy or sell some staves or is there", "something else you need?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (quest.getStage(player) == 60) { + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you.", "Rat Burgiss sent me."); + stage = 1; + break; + } else if (quest.getStage(player) == 80) { + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you.", "We did it! We beat Surok!"); + stage = 1; + break; + } else if (quest.getStage(player) >= 70) { + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you.", "Can I have another ring?"); + stage = 1; + break; + } + interpreter.sendOptions("Select an Option", "Yes, please.", "No, thank you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, thank you."); + stage = 20; + break; + case 3: + if (quest.getStage(player) == 60) { + player("Rat Burgiss sent me!"); + stage = 70; + break; + } else if (quest.getStage(player) == 80) { + player("We did it! We beat Surok!"); + stage = 200; + break; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can I have another ring?"); + stage = 50; + break; + } + + break; + case 10: + end(); + npc.openShop(player); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, 'stick' your head in again if you change your mind."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Huh, terrible pun. You just can't get the 'staff' these", "days!"); + stage = 22; + break; + case 22: + end(); + break; + case 50: + if (player.getInventory().contains(11014, 1)) + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Go and get the one that's in your inventory " + player.getUsername() + "!"); + else if (player.getBank().contains(11014, 1)) + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Go and get the one that's in your bank" + player.getUsername() + "!"); + else if (player.getEquipment().contains(11014, 1)) + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Go and get the one that's on your finger " + player.getUsername() + "!"); + else { + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Of course you can! Here you go " + player.getUsername() + "!"); + player.getInventory().add(BEACON_RING); + } + stage = 51; + break; + case 51: + end(); + break; + case 70: + npc("Ah, yes; You must be " + player.getUsername() + "! Rat sent word that you", "would be coming. Everything is prepared. I have created", "a spell that will remove the mind control spell."); + stage++; + break; + case 71: + player("Okay, what's the plan?"); + stage++; + break; + case 72: + npc("Listen carefully. For the spell to succeed, the king must", "be made very weak, if his mind is controlled, you will", "need to fight him until he is all but dead."); + stage++; + break; + case 73: + npc("Then and ONLY then, use your ring to summon me.", "I will teleport to you and cast the spell that will", "cure the king."); + stage++; + break; + case 74: + player("Why must I summon you? Can't you come with me?"); + stage++; + break; + case 75: + npc("I cannot. I must look after my shop here and", "I have lots to do. Rest assured, I will come when you", "summon me."); + stage++; + break; + case 76: + player("Okay, so what do I do now?"); + stage++; + break; + case 77: + npc("Take this beacon ring and some instructions."); + stage++; + break; + case 78: + npc("Once you have read the instructions. It will be time for", "you to arrest Surok."); + stage++; + break; + case 79: + player("Won't he be disinclined to acquiesce to that request?"); + stage++; + break; + case 80: + npc("Won't he what?"); + stage++; + break; + case 81: + player("Won't he refuse?"); + stage++; + break; + case 82: + npc("I very much expect so. It may turn nasty, so be on your", "guard. I hope we can stop him before he can cast his", "spell!", "Make sure you have that ring I gave you."); + stage++; + break; + case 83: + player("Okay, thanks, Zaff!"); + stage++; + break; + case 84: + player.getInventory().add(BEACON_RING); + quest.setStage(player, 70); + end(); + break; + case 200: + npc("Yes. You have done well, " + player.getUsername() + ". You are to be", "commended for you actions!"); + stage++; + break; + case 201: + player("It was all in the call of duty!"); + stage++; + break; + case 202: + player("What will happen with Surok now?"); + stage++; + break; + case 203: + npc("Well, when I disrupted Surok's spell, he will have been", "sealed in the library, but we still need to keep an", "eye on him, just in case."); + stage++; + break; + case 204: + npc("When you are ready, report back to Rat and he will", "reward you."); + stage++; + break; + case 205: + player("Okay, I will."); + stage++; + break; + case 206: + quest.setStage(player, 90); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 546 }; + } + } + + /** + * Represents the dialogue used to buy staves from zaff. + * @author 'Vexia + * @version 1.0 + */ + public final class ZaffStaveDialogue extends DialoguePlugin { + + /** + * The ammount of battlestaves. + */ + private int ammount; + + /** + * Constructs a new {@code ZaffBuyStavesDialogue} {@code Object}. + */ + public ZaffStaveDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ZaffBuyStavesDialogue} {@code Object}. + * @param player the player. + */ + public ZaffStaveDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ZaffStaveDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you have any battlestaves?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + ammount = player.getSavedData().getGlobalData().getZaffAmount(); + if (player.getSavedData().getGlobalData().getZafTime() < System.currentTimeMillis()) { + ammount = getMaxStaffs(); + } + if (player.getSavedData().getGlobalData().getZafTime() > System.currentTimeMillis() && ammount <= 0) { + interpreter.sendDialogues(546, FacialExpression.HALF_GUILTY, "I'm very sorry! I seem to be out of battlestaves at the", "moment! I expect I'll get some more in by tomorrow,", "though."); + stage = 2; + break; + } + interpreter.sendDialogues(546, FacialExpression.HALF_GUILTY, "Battlestaves cost 8,000 gold pieces each. I have " + ammount + " left.", "How many would you like to buy?"); + stage = 1; + break; + case 1: + end(); + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int amt = (int) value; + if (amt > ammount) { + amt = ammount; + } + if (amt > player.getInventory().freeSlots()) { + amt = player.getInventory().freeSlots(); + } + if (amt == 0) { + return true; + } + if (7000 * amt > player.getInventory().getAmount(new Item(995))) { + player.getPacketDispatch().sendMessage("You don't have enough money to buy that many."); + return true; + } else { + Item remove = new Item(995, 7000 * amt); + if (!player.getInventory().containsItem(remove)) { + end(); + return true; + } + player.getInventory().remove(remove); + if (player.getInventory().add(new Item(1391, amt))) { + player.getSavedData().getGlobalData().setZafTime(System.currentTimeMillis() + (24 * 60 * 60 * 1000)); + player.getSavedData().getGlobalData().setZaffAmount(ammount - amt); + } + } + return true; + } + }); + interpreter.sendInput(false, "Zaff has " + ammount + " battlestaves..."); + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, okay then. I'll try again another time."); + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + /** + * Gets the max staffs to buy. + * @return the max staffs to buy. + */ + public int getMaxStaffs() { + int level = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK).getLevel(); + switch (level) { + case 2: + return 64; + case 1: + return 32; + case 0: + return 16; + default: + return 8; + } + } + + @Override + public int[] getIds() { + return new int[] { 9679 }; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/ZahurOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/ZahurOptionPlugin.java new file mode 100644 index 000000000..8725a377f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/ZahurOptionPlugin.java @@ -0,0 +1,101 @@ +package core.game.interaction.npc; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +import core.game.node.entity.skill.herblore.PotionDecantingPlugin; + +/** + * Handles the zahur options. + * @author Empathy + * + */ +@Initializable +public class ZahurOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(3037).getHandlers().put("option:combine", this); + PluginManager.definePlugin(new ZahurDialoguePlugin()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + PotionDecantingPlugin.decant(player); + player.getDialogueInterpreter().sendDialogues(node.asNpc(), FacialExpression.HALF_GUILTY, "There, all done."); + return true; + } + + + /** + * Handles the Zahur Dialogue. + * @author Empathy + * + */ + public class ZahurDialoguePlugin extends DialoguePlugin { + + /** + * Constructs a new {@code ZahurDialoguePlugin} {@code Object}. + */ + public ZahurDialoguePlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ZahurDialoguePlugin} {@code Object}. + * @param player the player. + */ + public ZahurDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ZahurDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + npc("I can combine your potion vials to try and make", "the potions fit into fewer vials. This service is free.", "Would you like to do this?"); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + options("Yes", "No"); + stage = 2; + break; + case 2: + if (buttonId == 1) { + PotionDecantingPlugin.decant(player); + npc("There, all done."); + } + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3037 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/bob/BobDialogue.java b/Server/src/main/java/Server/core/game/interaction/npc/bob/BobDialogue.java new file mode 100644 index 000000000..dabc11ebb --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/bob/BobDialogue.java @@ -0,0 +1,574 @@ +package core.game.interaction.npc.bob; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.RepairItem; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for the bob npc who repairs items. + * @author 'Vexia + * @version 1.0 + */ +public final class BobDialogue extends DialoguePlugin { + + /** + * Represents the item id being repaired. + */ + private int itemId = 0; + + /** + * Represents the item being repaired. + */ + private Item item; + + /** + * Represents the item repairing. + */ + private static RepairItem repairitem = null; + + /** + * The achievement diary. + */ + private AchievementDiary diary; + private final int level = 1; + + /** + * Constructs a new {@code BobDialogue} {@code Object}. + */ + public BobDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BobDialogue} {@code Object}. + * @param player the player. + */ + public BobDialogue(Player player) { + super(player); + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 754: + options("Yes, please.", "No, thank you."); + stage = 755; + break; + case 755: + switch (buttonId) { + case 1: + player("Yes, please."); + stage = 757; + break; + case 2: + player("No, thank you."); + stage = 756; + break; + } + break; + case 756: + end(); + break; + case 757: + end(); + if (repairitem != null) { + if (!player.getInventory().contains(995, repairitem.getCost())) { + end(); + player.getPacketDispatch().sendMessage("You don't have enough to pay him."); + break; + } + if (!player.getInventory().contains(itemId, 1)) { + end(); + return true; + } + player.getInventory().remove(new Item(995, repairitem.getCost())); + if (player.getInventory().remove(new Item(itemId, 1))) { + player.getInventory().add(repairitem.getProduct()); + } + String cost = "free"; + if (repairitem.getCost() != 0) { + cost = repairitem.getCost() + "gp"; + } + player.getPacketDispatch().sendMessage("Bob fixes your " + ItemDefinition.forId(itemId).getName().toLowerCase().replace("broken", "").trim() + " for " + cost + "."); + } + if (repairitem == null) { + String cost = "free"; + String type = BarrowsEquipment.formatedName(itemId); + String single = BarrowsEquipment.getSingleName(type); + String equipment = BarrowsEquipment.getEquipmentType(type); + String newString = type.toLowerCase().replace(single, "").trim().replace("'s", ""); + StringBuilder newewString = new StringBuilder(); + newewString.append(newString).append(" " + equipment); + final BarrowsEquipment.BarrowsFullEquipment fullequip = BarrowsEquipment.BarrowsFullEquipment.forName(newewString.toString()); + if (BarrowsEquipment.getFormatedCost(equipment, item) != 0) { + cost = String.valueOf(BarrowsEquipment.getFormatedCost(equipment, item) + "gp"); + } + if (!player.getInventory().contains(995, BarrowsEquipment.getFormatedCost(equipment, item))) { + end(); + player.getPacketDispatch().sendMessage("You don't have enough to pay him."); + break; + } + if (fullequip == null || fullequip.getFull() == null) { + player.getPacketDispatch().sendMessage("Report this to an administrator!"); + return true; + } + if (!player.getInventory().contains(itemId, 1)) { + end(); + return true; + } + player.getInventory().remove(new Item(995, BarrowsEquipment.getFormatedCost(equipment, item))); + if (player.getInventory().remove(new Item(itemId, 1))) { + player.getInventory().add(fullequip.getFull()); + } + player.getPacketDispatch().sendMessage("Bob fixes your " + equipment + " for " + cost + "."); + } + break; + case 678: + end(); + break; + case 0: + switch (buttonId) { + case 1: + player("Give me a quest!"); + stage = -5; + break; + case 2: + player("Have you anything to sell?"); + stage = 10; + break; + case 3: + player("Can you repair my items for me?"); + stage = 20; + break; + case 4: + player("I'd like to talk about Achievement Diaries."); + stage = 30; + break; + } + break; + case -5: + interpreter.sendDialogues(npc, FacialExpression.FURIOUS, "Get yer own!"); + stage = -4; + break; + case -4: + end(); + break; + case 10: + npc("Yes! I buy and sell axes! Take your pick (or axe)!"); + stage = 11; + break; + case 11: + end(); + npc.openShop(player); + break; + case 20: + npc("Of course I'll repair it, though the materials may cost", "you. Just hand me the item and I'll have a look."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE); + } + if (diary.isComplete(level, true) && !diary.isLevelRewarded(level)) { + player("I've done all the medium tasks in my Lumbridge", "Achievement Diary."); + stage = 150; + break; + } + if (diary.isLevelRewarded(1) && diary.isComplete(level, true) && !player.hasItem(diary.getType().getRewards(level)[0])) { + player("I've seemed to have lost my explorer's ring..."); + stage = 160; + break; + } + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 31; + break; + case 31: + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 110; + break; + case 2: + player("What are the rewards?"); + stage = 120; + break; + case 3: + player("How do I claim the rewards?"); + stage = 130; + break; + case 4: + player("See you later!"); + stage = 140; + break; + } + break; + case 110: + npc("Ah, well it's a diary that helps you keep track of", "particular achievements you've made in the world of", "Keldagrim. In Lumbridge and Draynor i can help you", "discover some very useful things indeed."); + stage++; + break; + case 111: + npc("Eventually with enough exploration you will be", "rewarded for your explorative efforts."); + stage++; + break; + case 112: + npc("You can access your Achievement Diary by going to", "the Quest Journal. When you've opened the Quest", "Journal click on the green star icon on the top right", "hand corner. This will open the diary."); + stage = 30; + break; + case 120: + npc("Ah, well there are different rewards for each", "Achievement Diary. For completing the Lumbridge and", "Draynor diary you are presented with an explorer's", "ring."); + stage++; + break; + case 121: + npc("This ring will become increasingly useful with each", "section of the diary that you complete."); + stage = 30; + break; + case 130: + npc("You need to complete the tasks so that they're all ticked", "off, then you can claim your reward. Most of them are", "straightforward although you might find some required", "quests to be started, if not finished."); + stage++; + break; + case 131: + npc("To claim the explorer's ring speak to Explorer Jack", " in Lumbridge, Ned in Draynor Village or myself."); + stage = 30; + break; + case 140: + end(); + break; + case 150: + npc("Yes I see that, you'll be wanting your", "reward then I assume?"); + stage++; + break; + case 151: + player("Yes please."); + stage++; + break; + case 152: + diary.setLevelRewarded(level); + for (Item i : diary.getType().getRewards(level)) { + player.getInventory().add(i, player); + } + npc("This ring is a representation of the adventures you", "went on to complete your tasks."); + stage ++; + break; + case 153: + player("Wow, thanks!"); + stage = 30; + break; + case 160: + player.getInventory().add(diary.getType().getRewards(level)[0], player); + npc("You better be more careful this time."); + stage = -1; + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BobDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + boolean repair = false; + boolean wrong = false; + if (npc.getId() == 3797 && args.length == 1) { + player("Can you repair my items for me?"); + stage = 20; + return true; + } + if (args.length == 1) { + options("Give me a quest!", "Have you anything to sell?", "Can you repair my items for me?", "Talk about Achievement Diaries"); + stage = 0; + return true; + } + if (args[1] != null) { + repair = (boolean) args[1]; + } + if (args[2] != null) { + wrong = (boolean) args[2]; + } + if (args[3] != null) { + repairitem = RepairItem.forId((int) args[3]); + itemId = (int) args[3]; + } + if (args[4] != null) { + item = (Item) args[4]; + } + if (repair && !wrong) { + String cost = "free"; + if (repairitem != null) { + if (repairitem.getCost() != 0) { + cost = String.valueOf(repairitem.getCost() + "gp"); + } + } else { + String type = BarrowsEquipment.formatedName(itemId); + String single = BarrowsEquipment.getSingleName(type); + String equipment = BarrowsEquipment.getEquipmentType(type); + String newString = type.toLowerCase().replace(single, "").trim().replace("'s", ""); + StringBuilder newewString = new StringBuilder(); + newewString.append(newString).append(" " + equipment); + if (BarrowsEquipment.getFormatedCost(equipment, item) != 0) { + cost = String.valueOf(BarrowsEquipment.getFormatedCost(equipment, item) + "gp"); + } + } + npc("Quite badly damaged, but easy to repair. Would you", "like me to repair it for " + cost + "?"); + stage = 754; + return true; + } + if (repair == true && wrong == true) { + npc("Sorry friend, but I can't do anything with that."); + stage = 678; + return true; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 519, 3797 }; + } + + /** + * Barrows equipment information. + * @author 'Vexia + */ + public static class BarrowsEquipment { + + /** + * Represents the base names. + */ + private String[] base = new String[] { "dharok", "verac", "ahrim", "torag", "guthan" }; + + /** + * The weapon names. + */ + private static final String[] weapon_names = new String[] { "flail", "greataxe", "spear", "x-bow", "hammer", "hammers", "staff" }; + + /** + * The weapon body names. + */ + private static final String[] body_names = new String[] { "top", "platebody", "body" }; + + /** + * The helm names. + */ + private static final String[] helm_names = new String[] { "hood", "helm", "coif" }; + + /** + * The leg names. + */ + private static final String[] leg_names = new String[] { "skirt", "legs", "plateskirt", "platelegs" }; + + /** + * The prices. + */ + private static final Object[][] prices = new Object[][] { { "weapon", 100 }, { "body", 90 }, { "legs", 80 }, { "helm", 60 } }; + + /** + * Represents the items. + */ + private static final Object[][] ITEMS = { { 4856, "Ahrim's hood" }, { 4857, "Ahrim's hood" }, { 4858, "Ahrim's hood" }, { 4859, "Ahrim's hood" }, { 4860, "Ahrim's hood" }, { 4862, "Ahrim's staff" }, { 4863, "Ahrim's staff" }, { 4864, "Ahrim's staff" }, { 4865, "Ahrim's staff" }, { 4866, "Ahrim's staff" }, { 4868, "Ahrim's top" }, { 4869, "Ahrim's top" }, { 4870, "Ahrim's top" }, { 4871, "Ahrim's top" }, { 4872, "Ahrim's top" }, { 4874, "Ahrim's skirt" }, { 4875, "Ahrim's skirt" }, { 4876, "Ahrim's skirt" }, { 4877, "Ahrim's skirt" }, { 4878, "Ahrim's skirt" }, { 4880, "Dharok's helm" }, { 4881, "Dharok's helm" }, { 4882, "Dharok's helm" }, { 4883, "Dharok's helm" }, { 4884, "Dharok's helm" }, { 4886, "Dharok's greataxe" }, { 4887, "Dharok's greataxe" }, { 4888, "Dharok's greataxe" }, { 4889, "Dharok's greataxe" }, { 4890, "Dharok's greataxe" }, { 4892, "Dharok's platebody" }, { 4893, "Dharok's platebody" }, { 4894, "Dharok's platebody" }, { 4895, "Dharok's platebody" }, { 4896, "Dharok's platebody" }, { 4898, "Dharok's platelegs" }, { 4899, "Dharok's platelegs" }, { 4900, "Dharok's platelegs" }, { 4901, "Dharok's platelegs" }, { 4902, "Dharok's platelegs" }, { 4904, "Guthan's helm" }, { 4905, "Guthan's helm" }, { 4906, "Guthan's helm" }, { 4907, "Guthan's helm" }, { 4908, "Guthan's helm" }, { 4910, "Guthan's spear" }, { 4911, "Guthan's spear" }, { 4912, "Guthan's spear" }, { 4913, "Guthan's spear" }, { 4914, "Guthan's spear" }, { 4916, "Guthan's body" }, { 4917, "Guthan's body" }, { 4918, "Guthan's body" }, { 4919, "Guthan's body" }, { 4920, "Guthan's body" }, { 4922, "Guthan's skirt" }, { 4923, "Guthan's skirt" }, { 4924, "Guthan's skirt" }, { 4925, "Guthan's skirt" }, { 4926, "Guthan's skirt" }, { 4928, "Karil's coif" }, { 4929, "Karil's coif" }, { 4930, "Karil's coif" }, { 4931, "Karil's coif" }, { 4932, "Karil's coif" }, { 4934, "Karil's x-bow" }, { 4935, "Karil's x-bow" }, { 4936, "Karil's x-bow" }, { 4937, "Karil's x-bow" }, { 4938, "Karil's x-bow" }, { 4940, "Karil's top" }, { 4941, "Karil's top" }, { 4942, "Karil's top" }, { 4943, "Karil's top" }, { 4944, "Karil's top" }, { 4946, "Karil's skirt" }, { 4947, "Karil's skirt" }, { 4948, "Karil's skirt" }, { 4949, "Karil's skirt" }, { 4950, "Karil's skirt" }, { 4952, "Torag's helm" }, { 4953, "Torag's helm" }, { 4954, "Torag's helm" }, { 4955, "Torag's helm" }, { 4956, "Torag's helm" }, { 4958, "Torag's hammers" }, { 4959, "Torag's hammers" }, { 4960, "Torag's hammers" }, { 4961, "Torag's hammers" }, { 4962, "Torag's hammers" }, { 4964, "Torag's body" }, { 4965, "Torag's body" }, { 4966, "Torag's body" }, { 4967, "Torag's body" }, { 4968, "Torag's body" }, { 4970, "Torag's legs" }, { 4971, "Torag's legs" }, { 4972, "Torag's legs" }, { 4973, "Torag's legs" }, { 4974, "Torag's legs" }, { 4976, "Verac's helm" }, { 4977, "Verac's helm" }, { 4978, "Verac's helm" }, { 4979, "Verac's helm" }, { 4980, "Verac's helm" }, { 4982, "Verac's flail" }, { 4983, "Verac's flail" }, { 4984, "Verac's flail" }, { 4985, "Verac's flail" }, { 4986, "Verac's flail" }, { 4988, "Verac's top" }, { 4989, "Verac's top" }, { 4990, "Verac's top" }, { 4991, "Verac's top" }, { 4992, "Verac's top" }, { 4994, "Verac's skirt" }, { 4995, "Verac's skirt" }, { 4996, "Verac's skirt" }, { 4997, "Verac's skirt" }, { 4998, "Verac's skirt" } }; + + /** + * Gets the cost. + * @param name the name. + * @return the price. + */ + public static int getFormatedCost(String name, Item item) { + int[] degrades = new int[] { 100, 75, 50, 25, 0 }; + for (int i = 0; i < prices.length; i++) { + String check = (String) prices[i][0]; + if (check.equals(name)) { + int degrade = 0; + for (int d : degrades) { + if (item.getName().contains(String.valueOf(d))) { + degrade = d; + break; + } + } + degrade -= 25 - (25 * (item.getCharge() * 0.001)); + int max = (int) prices[i][1] * 1000; + return (int) (max - (max * (degrade * 0.01))); + } + } + return 0; + } + + /** + * Gets the cost of the item type. + * @param name the name. + * @return the return type. + */ + public static int getCost(String name) { + for (int i = 0; i < prices.length; i++) { + String check = (String) prices[i][0]; + if (check.equals(name)) { + return (int) prices[i][1]; + } + } + return 0; + } + + /** + * Represents if an item is a barrows item. + * @param id the id. + * @return {@code True} if so. + */ + public static boolean isBarrowsItem(int id) { + for (int i = 0; i < ITEMS.length; i++) { + if ((int) ITEMS[i][0] == id) { + return true; + } + } + return false; + } + + /** + * Gets the formatted name. + * @param id the id. + * @return the name. + */ + public static String formatedName(int id) { + for (int i = 0; i < ITEMS.length; i++) { + if ((int) ITEMS[i][0] == id) { + return (String) ITEMS[i][1]; + } + } + return null; + } + + /** + * Gets the equipment type. + * @param name the name. + * @return the type. + */ + public static String getEquipmentType(String name) { + name = name.toLowerCase().replace("verac's", "").replace("karil's", "").replace("dharok's", "").replace("torag's", "").replace("guthan's", "").replace("ahrim's", "").trim(); + for (int i = 0; i < weapon_names.length; i++) { + if (weapon_names[i].contains(name)) { + return "weapon"; + } + } + for (int k = 0; k < body_names.length; k++) { + if (body_names[k].contains(name)) { + return "body"; + } + } + for (int z = 0; z < leg_names.length; z++) { + if (leg_names[z].contains(name)) { + return "legs"; + } + } + for (int q = 0; q < helm_names.length; q++) { + if (helm_names[q].contains(name)) { + return "helm"; + } + } + return null; + } + + /** + * Method used t get its single name. + * @param name the name. + * @return the name. + */ + public static String getSingleName(String name) { + name = name.toLowerCase().replace("verac's", "").replace("karil's", "").replace("dharok's", "").replace("torag's", "").replace("guthan's", "").replace("ahrim's", "").trim(); + for (int i = 0; i < weapon_names.length; i++) { + if (weapon_names[i].contains(name)) { + return weapon_names[i]; + } + } + for (int k = 0; k < body_names.length; k++) { + if (body_names[k].contains(name)) { + return body_names[k]; + } + } + for (int z = 0; z < leg_names.length; z++) { + if (leg_names[z].contains(name)) { + return leg_names[z]; + } + } + for (int q = 0; q < helm_names.length; q++) { + if (helm_names[q].contains(name)) { + return helm_names[q]; + } + } + return null; + } + + /** + * Gets the bases. + * @return the base. + */ + public String[] getBase() { + return base; + } + + /** + * Represents the multiple full barrows equipment items. + * @author 'Vexia + * @version 1.0 + */ + public enum BarrowsFullEquipment { + VERAC_LEGS(new Item(4759, 1)), VERAC_TOP(new Item(4757, 1)), VERAC_WEAPON(new Item(4755, 1)), VERAC_HELM(new Item(4753, 1)), TORAG_LEGS(new Item(4751, 1)), TORAG_BODY(new Item(4749, 1)), TORAG_HELM(new Item(4745, 1)), TORAG_WEAPON(new Item(4747, 1)), KARIL_HELM(new Item(4732, 1)), KARIL_WEAPON(new Item(4734, 1)), KARIL_BODY(new Item(4736, 1)), KARIL_LEGS(new Item(4738, 1)), GUTHAN_HELM(new Item(4724, 1)), GUTHAN_BODY(new Item(4728, 1)), GUTHAN_LEGS(new Item(4730, 1)), GUTHAN_WEAPON(new Item(4726, 1)), DHAROK_HELM(new Item(4716, 1)), DHAROK_BODY(new Item(4720, 1)), DHAROK_LEGS(new Item(4722, 1)), DHAROK_WEAPON(new Item(4718, 1)), AHRIM_HELM(new Item(4708, 1)), AHRIM_BODY(new Item(4712, 1)), AHRIM_LEGS(new Item(4714, 1)), AHRIM_WEAPON(new Item(4710, 1)); + + /** + * Constructs a new {@code BarrowsEquipment} {@code Object}. + * @param full the full item. + */ + BarrowsFullEquipment(Item full) { + this.full = full; + } + + /** + * Represents the full item. + */ + private final Item full; + + /** + * for name + * @param name thename. + * @return the equipment. + */ + public static BarrowsFullEquipment forName(String name) { + if (name.equals("guthan body body")) { + name = "guthan body"; + } else if (name.equals("torag body body")) { + name = "torag body"; + } else if (name.equals("verac body")) { + name = "verac top"; + } + for (BarrowsFullEquipment barrow : BarrowsFullEquipment.values()) { + if (barrow.name().toLowerCase().replace("_", " ").trim().equalsIgnoreCase(name)) { + return barrow; + } + } + return null; + } + + /** + * Gets the full. + * @return The full. + */ + public Item getFull() { + return full; + } + } + + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/npc/bob/BobRepairItem.java b/Server/src/main/java/Server/core/game/interaction/npc/bob/BobRepairItem.java new file mode 100644 index 000000000..5a6ea01a3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/bob/BobRepairItem.java @@ -0,0 +1,47 @@ +package core.game.interaction.npc.bob; + +import core.game.content.global.RepairItem; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the plugin used to handle an item being used on bob. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BobRepairItem extends UseWithHandler { + + /** + * Constructs a new {@code BobRepairItem} {@code Object}. + */ + public BobRepairItem() { + super(494, 468, 496, 470, 498, 472, 500, 502, 474, 504, 476, 506, 478, 6741, 4856, 4857, 4858, 4859, 4860, 4862, 4863, 4864, 4865, 4866, 4868, 4869, 4870, 4871, 4872, 4874, 4875, 4876, 4877, 4878, 4880, 4881, 4882, 4883, 4884, 4886, 4887, 4888, 4889, 4890, 4892, 4893, 4894, 4895, 4896, 4898, 4899, 4900, 4901, 4902, 4904, 4905, 4906, 4907, 4908, 4910, 4911, 4912, 4913, 4914, 4916, 4917, 4918, 4919, 4920, 4922, 4923, 4924, 4925, 4926, 4928, 4929, 4930, 4931, 4932, 4934, 4935, 4936, 4937, 4938, 4940, 4941, 4942, 4943, 4944, 4946, 4947, 4948, 4949, 4950, 4952, 4953, 4954, 4955, 4956, 4958, 4959, 4960, 4961, 4962, 4964, 4965, 4966, 4967, 4968, 4970, 4971, 4972, 4973, 4974, 4976, 4977, 4978, 4979, 4980, 4982, 4983, 4984, 4985, 4986, 4988, 4989, 4990, 4991, 4992, 4994, 4995, 4996, 4997, 4998); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(519, NPC_TYPE, this); + addHandler(3797, NPC_TYPE, this); + PluginManager.definePlugin(new BobDialogue()); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final RepairItem repair = RepairItem.forId(event.getUsedItem().getId()); + if (repair == null && !BobDialogue.BarrowsEquipment.isBarrowsItem(event.getUsedItem().getId())) { + player.getDialogueInterpreter().open(519, ((NPC) event.getUsedWith()), true, true, null); + return true; + } + player.getDialogueInterpreter().open(519, ((NPC) event.getUsedWith()), true, false, event.getUsedItem().getId(), event.getUsedItem()); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/sorceress_app/SorceressApprenticeDialogue.java b/Server/src/main/java/Server/core/game/interaction/npc/sorceress_app/SorceressApprenticeDialogue.java new file mode 100644 index 000000000..9f76157b4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/sorceress_app/SorceressApprenticeDialogue.java @@ -0,0 +1,263 @@ +package core.game.interaction.npc.sorceress_app; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Graphics; + +/** + * Dialogue for Sorceress Apprentice + * @author SonicForce41 + */ +public class SorceressApprenticeDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code SorceressApprenticeDialogue.java} {@code Object}. + */ + public SorceressApprenticeDialogue() { + + } + + /** + * Constructs a new {@code SorceressApprenticeDialogue.java} {@code Object}. + * @param player the Player + */ + public SorceressApprenticeDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 5532 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Okay, here goes - and remember, to", "return just drink from the fountain."); + stage = 1; + break; + case 1: + teleport(npc, player); + end(); + break; + case 10: + npc("Cleaning, cleaning, always cleaning. This apprenticeship", "isn't all that it was cracked up to be."); + stage = 11; + break; + case 11: + player("Whose apprentice are you?"); + stage = 12; + break; + case 12: + npc("Oh, Aadeela, the sorceress upstairs, said she'd teach me", "magic, she did. And here I am scrubbing floors without", "a spell to help me."); + stage = 13; + break; + case 13: + interpreter.sendOptions("Select an Option", "I could cast a Water Blast or a Wind Blast spell?", "Surely there must be upsides to the task?"); + stage = 14; + break; + case 14: + switch (buttonId) { + case 1: + player("I could cast a Water Blast or a Wind Blast spell to", "hurry things along if you'd like?"); + stage = 110; + break; + case 2: + player("Surely there must be upsides to the task?"); + stage = 120; + break; + } + break; + case 110: + npc("No, no, she'd kill me or worse if she knew I was using", "Magic to do chores. Her last apprentice - well I'd", "rather not say."); + stage = 111; + break; + case 111: + player("Oh go on, what happend to them?"); + stage = 112; + break; + case 112: + npc("They say she turned them into little spiders."); + stage = 113; + break; + case 113: + player("Oh, that's too bad. I had better leave you to it."); + stage = 114; + break; + case 114: + end(); + break; + case 120: + npc("Nope. Clean this, clean that. When I'm finished cleaning", "here I have to go help out in the garden."); + stage = 121; + break; + case 121: + player("What garden?"); + stage = 122; + break; + case 122: + npc("Oh, I shouldn't have told you."); + stage = 123; + break; + case 123: + interpreter.sendOptions("Select an Option", "You're right, you shouldn't have.", "Oh, you can talk to me. I can see you're having a bad day."); + stage = 124; + break; + case 124: + switch (buttonId) { + case 1: + player("You're right, you shouldn't have."); + stage = 125; + break; + case 2: + player("Oh, you can talk to me. I can see you're having a bad", "day."); + stage = 126; + break; + } + break; + case 125: + end(); + break; + case 126: + npc("You know you're right. Nobody listens to me."); + stage = 127; + break; + case 127: + player("A sympathetic ear can do wonders."); + stage = 128; + break; + case 128: + npc("Yes, if I just let my frustrations out, I'd feel a lot", "better. Now what was I saying?"); + stage = 129; + break; + case 129: + player("You mentioned something about the garden."); + stage = 130; + break; + case 130: + npc("Oh yeah, the dreadful garden of hers."); + stage = 131; + break; + case 131: + player("Where is it?"); + stage = 132; + break; + case 132: + npc("Oh, it's nowhere."); + stage = 133; + break; + case 133: + player("What do you mean?"); + stage = 134; + break; + case 134: + npc("Well it's here, but not really. You see the sorceress is", "trying out some new type of compression magic."); + stage = 135; + break; + case 135: + player("Oh, that sounds interesting - so how does it work?"); + stage = 136; + break; + case 136: + npc("It would take too long to explain and, to be honest, I", "don't really understand how it works."); + stage = 137; + break; + case 137: + player("Fair enough, but tell me, how do you get to the", "garden?"); + stage = 138; + break; + case 138: + npc("By magic! The sorceress did teach me one spell."); + stage = 139; + break; + case 139: + interpreter.sendOptions("Select an Option", "Wow, cast the spell on me. It will be good Magic training for you.", "Oh, that's nice. Well it's been great talking to you."); + stage = 140; + break; + case 140: + switch (buttonId) { + case 1: + player("Wow, cast the spell on me. It will be good Magic", "training for you."); + stage = 142; + break; + case 2: + player("Oh, that's nice. Well it's been great", "talking to you."); + stage = 141; + break; + } + break; + case 141: + end(); + break; + case 142: + npc("You wouldn't mind?"); + stage = 143; + break; + case 143: + player("Of course not. I'd be glad to help."); + stage = 144; + break; + case 144: + npc("Okay, here goes! Remember, to return, just drink from", "the fountain."); + stage = 145; + break; + case 145: + player.getSavedData().getGlobalData().setApprentice(true); + teleport(npc, player); + end(); + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SorceressApprenticeDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (player.getSavedData().getGlobalData().hasSpokenToApprentice()) { + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hey apprentice, do you want to try out", "your teleport skills again?"); + stage = 0; + } else { + player("Hello. What are you doing?"); + stage = 10; + } + return true; + } + + public static void teleport(final NPC npc, final Player player) { + npc.faceTemporary(player, 4); + npc.graphics(new Graphics(108)); + player.lock(); + Projectile.create(npc, player, 109).send(); + npc.sendChat("Senventior Disthinte Molesko!"); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 2: + player.getProperties().setTeleportLocation(Location.create(2912, 5474, 0)); + break; + case 3: + player.graphics(new Graphics(110)); + player.unlock(); + return true; + } + return false; + } + }); + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.java b/Server/src/main/java/Server/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.java new file mode 100644 index 000000000..8d205c27c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/npc/sorceress_app/SorceressApprenticePlugin.java @@ -0,0 +1,78 @@ +package core.game.interaction.npc.sorceress_app; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Teleport option for Sorceress Apprentice + * @author SonicForce41 + */ +@Initializable +public class SorceressApprenticePlugin extends OptionHandler { + + private static final Location TOP = Location.create(3322, 3138, 1); + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "teleport": + if (player.getSavedData().getGlobalData().hasSpokenToApprentice()) { + NPC npc = (NPC) node; + SorceressApprenticeDialogue.teleport(npc, player); + } else { + player.getDialogueInterpreter().sendDialogues(((NPC) node), null, "I can't do that now, I'm far too busy sweeping."); + } + break; + case "climb-up": + if (node.getLocation().getX() == 3322) { + ClimbActionHandler.climb(player, new Animation(828), TOP); + } else { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + } + break; + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(5532).getHandlers().put("option:teleport", this); + ObjectDefinition.forId(21781).getHandlers().put("option:climb-up", this); + new SorceressStairs().newInstance(arg); + PluginManager.definePlugin(new SorceressApprenticeDialogue()); + return this; + } + + /** + * Represents the option handler used for the sorcceress stairs. + * @author 'Vexia + * @version 1.0 + */ + public final static class SorceressStairs extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(35645).getHandlers().put("option:climb-down", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getProperties().setTeleportLocation(Location.create(3325, 3143, 0)); + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/BankingPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/BankingPlugin.java new file mode 100644 index 000000000..2c66040c9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/BankingPlugin.java @@ -0,0 +1,666 @@ +package core.game.interaction.object; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.access.InterfaceContainer; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.content.dialogue.DialogueAction; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.ge.GrandExchangeOffer; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.IronmanMode; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.text.NumberFormat; + +/** + * Represents the plugin used for anything related to banking. + * + * @author Vexia + * @author Emperor + */ +@Initializable +public final class BankingPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("use-quickly", this); + ObjectDefinition.setOptionHandler("use", this); + ObjectDefinition.setOptionHandler("bank", this); + ObjectDefinition.setOptionHandler("collect", this); + ObjectDefinition.setOptionHandler("deposit", this); + new BankingInterface().newInstance(arg); + new BankDepositInterface().newInstance(arg); + new BankNPCPlugin().newInstance(arg); + new BankNPC().newInstance(arg); + new BankerDialogue().init(); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final GameObject object = (GameObject) node; + if (player.getIronmanManager().checkRestriction(IronmanMode.ULTIMATE)) { + return true; + } + if (object.getName().contains("Bank") || object.getName().contains("Deposit")) { + switch (option) { + case "use": +// final Location l = object.getLocation(); +// final Location p = player.getLocation(); +// final NPC npc = Repository.findNPC(l.transform(l.getX() - p.getX(), l.getY() - p.getY(), 0)); +// if (node.getId() == 4483) { +// player.getBank().open(); +// return true; +// } +// if (npc != null && DialogueInterpreter.contains(npc.getId())) { +// npc.faceLocation(node.getLocation()); +// player.getDialogueInterpreter().open(npc.getId(), npc.getId()); +// } else { +// player.getDialogueInterpreter().open(494); +// } +// return true; + case "use-quickly": + case "bank": + player.getBankPinManager().openType(1); + checkAchievements(player); + return true; + case "collect": + player.getPlayerGrandExchange().openCollectionBox(); + return true; + case "deposit": + openDepositBox(player); + return true; + } + } + return true; + } + + /** + * Method used to open the deposit box. + * + * @param player the player. + */ + private void openDepositBox(final Player player) { + player.getInterfaceManager().open(new Component(11)).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + player.getInterfaceManager().openDefaultTabs(); + return true; + } + }); + //player.getInterfaceManager().closeDefaultTabs(); + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6); + InterfaceContainer.generateItems(player, player.getInventory().toArray(), new String[]{"Examine", "Deposit-X", "Deposit-All", "Deposit-10", "Deposit-5", "Deposit-1",}, 11, 15, 5, 7); + } + + /** + * Represents the dialogue plugin used for all bankers. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BankerDialogue extends DialoguePlugin { + + /** + * Represents the banker npc ids. + */ + private static final int[] NPC_IDS = {44, 45, 166, 494, 495, 496, 497, 498, 499, 902, 1036, 1360, 1702, 2163, 2164, 2354, 2355, 2568, 2569, 2570, 2619, 3046, 3198, 3199, 3824, 4296, 4519, 5257, 5258, 5259, 5260, 5383, 5488, 5776, 5777, 5898, 5912, 5913, 6200, 6362, 6532, 6533, 6534, 6535, 6538, 7049, 7050, 7445, 7446, 7605}; + + /** + * Represents the id to use. + */ + private int id; + + /** + * Constructs a new {@code BankerDialogue} {@code Object}. + */ + public BankerDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BankerDialoguePlugin} {@code Object}. + * + * @param player the player. + */ + public BankerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BankerDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args[0] instanceof NPC) { + setId(((NPC) args[0]).getId()); + } else { + setId((int) args[0]); + } + if (TutorialSession.getExtension(player).getStage() < TutorialSession.MAX_STAGE) { + Component.setUnclosable(player, interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "Good day, would you like to access your bank account?")); + stage = 999; + return true; + } + interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "Good day, How may I help you?"); + for (GrandExchangeOffer o : player.getPlayerGrandExchange().getOffers()) { + if (o != null && (o.getWithdraw()[0] != null || o.getWithdraw()[1] != null)) { + stage = -1; + break; + } + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case -1: + interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "Before we go any further, I should inform you that you", "have items ready for collection from the Grand Exchange."); + stage = 0; + break; + case 0: + interpreter.sendOptions("What would you like to say?", "I'd like to access my bank account, please.", "I'd like to check my PIN settings.", "I'd like to see my collection box.", "What is this place?"); + stage = 10; + break; + case 1: + interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "This is a branch of the Bank of " + GameWorld.getSettings().getName() + ". We have", "branches in many towns."); + stage = 2; + break; + case 2: + interpreter.sendOptions("What would you like to say?", "And what do you do?", "Didn't you used to be called the Bank of Varrock?"); + stage = 3; + break; + case 3: + if (buttonId == 1) { + player("And what do you do?"); + stage = 4; + } else if (buttonId == 2) { + player("Didnt you used to be called the Bank of Varrock?"); + stage = 5; + } + break; + case 4: + interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "We will look after your items and money for you.", "Leave your valuables with us if you want to keep them", "safe."); + stage = 100; + break; + case 5: + interpreter.sendDialogues(id, FacialExpression.HALF_GUILTY, "Yes we did, but people kept on coming into our", "signs were wrong. They acted as if we didn't know", "what town we were in or something."); + stage = 100; + break; + case 100: + end(); + break; + case 999: + options("Yes.", "No."); + stage = 1000; + break; + case 1000: + switch (buttonId) { + case 1: + end(); + if (TutorialSession.getExtension(player).getStage() == 56) { + player.getBank().add(new Item(995, 25)); + } + player.getBank().open(); + if (TutorialSession.getExtension(player).getStage() == 56) { + TutorialStage.load(player, 57, false); + } + break; + case 2: + end(); + TutorialStage.load(player, TutorialSession.getExtension(player).getStage(), false); + break; + } + break; + case 10: + switch (interfaceId) { + case 232: + switch (buttonId) { + case 1: + case 2: + case 3: + player.getBankPinManager().openType(buttonId); + checkAchievements(player); + end(); + break; + case 4: + player("What is this place?"); + stage = 1; + break; + } + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return NPC_IDS; + } + + /** + * Gets the id. + * + * @return The id. + */ + public int getId() { + return id; + } + + /** + * Sets the id. + * + * @param id The id to set. + */ + public void setId(int id) { + this.id = id; + } + + } + + /** + * Represents the component plugin used to handle banking interfaces. + * + * @author Emperor + * @author 'Vexia + * @version 1.0 + */ + public static final class BankingInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(763, this); + ComponentDefinition.put(762, this); + ComponentDefinition.put(767, this); + return this; + } + + @Override + public void open(Player player, Component component) { + super.open(player, component); + player.getBank().sendBankSpace(); + } + + @Override + public boolean handle(final Player p, Component component, int opcode, int button, final int slot, int itemId) { + final Item item = component.getId() == 762 ? p.getBank().get(slot) : p.getInventory().get(slot); + switch (component.getId()) { + case 767: + switch (button) { + case 10: + p.getBank().open(); + break; + } + break; + case 762: + switch (button) { + case 18: + p.getDialogueInterpreter().open(628371); + return true; + case 23: + p.getDialogueInterpreter().sendOptions("Select an Option", "Check bank value", "Banking assistance", "Close"); + p.getDialogueInterpreter().addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 2: + p.getDialogueInterpreter().sendItemMessage(new Item(995, 50000), "
Your bank is worth approximately " + NumberFormat.getInstance().format(p.getBank().getWealth()) + " coins."); + break; + case 3: + p.getBank().close(); + p.getInterfaceManager().open(new Component(767)); + break; + case 4: + p.getDialogueInterpreter().close(); + break; + } + } + + }); + break; + case 14: + p.getBank().setInsertItems(!p.getBank().isInsertItems()); + return true; + case 16: + p.getBank().setNoteItems(!p.getBank().isNoteItems()); + return true; + case 73: + int amount = 0; + switch (opcode) { + case 155: + amount = 1; + break; + case 196: + amount = 5; + break; + case 124: + amount = 10; + break; + case 199: + amount = p.getBank().getLastAmountX(); + break; + case 234: + p.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int amount = (int) value; + p.getBank().takeItem(slot, amount); + p.getBank().updateLastAmountX(amount); + return true; + } + }); + p.getDialogueInterpreter().sendInput(false, "Enter the amount."); + break; + case 9: + p.sendMessage(p.getBank().get(slot).getDefinition().getExamine()); + break; + case 168: + amount = p.getBank().getAmount(item); + break; + case 166: + amount = p.getBank().getAmount(item) - 1; + break; + default: + return false; + } + if (amount > 0) { + final int withdraw = amount; + GameWorld.getPulser().submit(new Pulse(1, p) { + @Override + public boolean pulse() { + if (item == null) { + return true; + } + p.getBank().takeItem(slot, withdraw); + return true; + } + }); + } + return true; + case 20://search + p.setAttribute("search", true); + break; + case 41: + case 39: + case 37: + case 35: + case 33: + case 31: + case 29: + case 27: + case 25: + if (p.getAttribute("search", false)) { + p.getBank().reopen(); + } + int tabIndex = -((button - 41) / 2); + switch (opcode) { + case 155: + p.getBank().setTabIndex(tabIndex); + return true; + case 196: + p.getBank().collapseTab(tabIndex); + return true; + } + return false; + } + break; + case 763:// overlay. + switch (opcode) { + case 155: + p.getBank().addItem(slot, 1); + break; + case 196: + p.getBank().addItem(slot, 5); + break; + case 124: + p.getBank().addItem(slot, 10); + break; + case 199: + p.getBank().addItem(slot, p.getBank().getLastAmountX()); + break; + case 234: + p.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int amount = (int) value; + p.getBank().addItem(slot, amount); + p.getBank().updateLastAmountX(amount); + return false; + } + }); + p.getDialogueInterpreter().sendInput(false, "Enter the amount."); + break; + case 168: + p.getBank().addItem(slot, p.getInventory().getAmount(item)); + break; + } + break; + } + return true; + } + + } + + /** + * Represents the bank deposit interface handler. + * + * @author 'Vexia + * @version 1.0 + */ + public static final class BankDepositInterface extends ComponentPlugin { + + /** + * Represents the deposit animation. + */ + private static final Animation DEPOSIT_ANIMATION = new Animation(834); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(11, this); + return this; + } + + @Override + public boolean handle(final Player p, Component component, int opcode, int button, final int slot, int itemId) { + final Item item = p.getInventory().get(slot); + if (item == null && button != 15 && button != 13) { + return true; + } + switch (component.getId()) { + case 11: + p.animate(DEPOSIT_ANIMATION); + switch (opcode) { + case 155: // Deposit items + p.getBank().addItem(slot, 1); + break; + case 196: + p.getBank().addItem(slot, 5); + break; + case 124: + p.getBank().addItem(slot, 10); + break; + case 199: + p.getPulseManager().run(new Pulse(1, p) { + @Override + public boolean pulse() { + p.getBank().addItem(slot, p.getInventory().getAmount(item)); + InterfaceContainer.generateItems(p, p.getInventory().toArray(), new String[]{"Examine", "Deposit-X", "Deposit-All", "Deposit-10", "Deposit-5", "Deposit-1",}, 11, 15, 5, 7); + return true; + } + }); + return true; + case 234: + p.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int ammount = (int) value; + p.getBank().addItem(slot, ammount); + InterfaceContainer.generateItems(p, p.getInventory().toArray(), new String[]{"Examine", "Deposit-X", "Deposit-All", "Deposit-10", "Deposit-5", "Deposit-1",}, 11, 15, 5, 7); + return false; + } + }); + p.getDialogueInterpreter().sendInput(false, "Enter the amount."); + break; + case 168: + p.sendMessage(item.getDefinition().getExamine()); + break; + } + switch (button) { + case 13: + p.getFamiliarManager().dumpBob(); + break; + } + break; + } + InterfaceContainer.generateItems(p, p.getInventory().toArray(), new String[]{"Examine", "Deposit-X", "Deposit-All", "Deposit-10", "Deposit-5", "Deposit-1",}, 11, 15, 5, 7); + return true; + } + + } + + /** + * Represents the plugin used to handle the banker npc. + * + * @author 'Vexia + * @author Emperor + * @version 1.01 + */ + public static final class BankNPCPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("bank", this); + NPCDefinition.setOptionHandler("collect", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final NPC npc = ((NPC) node); + npc.faceLocation(node.getLocation()); + if (option.equals("bank")) { + player.getBank().open(); + checkAchievements(player); + } else { + player.getPlayerGrandExchange().openCollectionBox(); + } + return true; + } + + @Override + public Location getDestination(Node n, Node node) { + NPC npc = (NPC) node; + if (npc.getAttribute("facing_booth", false)) { + Direction dir = npc.getDirection(); + return npc.getLocation().transform(dir.getStepX() << 1, dir.getStepY() << 1, 0); + } + if (npc.getId() == 6533) { + return Location.create(3167, 3489, 0);// ge bankers. + } else if (npc.getId() == 6534) { + return Location.create(3167, 3490, 0);// ge bankers. + } else if (npc.getId() == 6535) { + return Location.create(3162, 3489, 0); + } else if (npc.getId() == 6532) { + return Location.create(3162, 3489, 0); + } else if (npc.getId() == 4907) { + return npc.getLocation().transform(0, -2, 0); + } + return super.getDestination(npc, node); + } + } + + /** + * Represents the abstract npc of a banker. + * + * @author 'Vexia + * @author Emperor + * @version 1.2 + */ + public static final class BankNPC extends AbstractNPC { + + /** + * Represents the ids of this class. + */ + private final int[] IDS = new int[]{4907, 44, 45, 166, 494, 495, 496, 497, 498, 499, 902, 1036, 1360, 1702, 2163, 2164, 2354, 2355, 2568, 2569, 2570, 2619, 3046, 3198, 3199, 4296, 4519, 5257, 5258, 5259, 5260, 5383, 5488, 5776, 5777, 5898, 5912, 5913, 6200, 6362, 6532, 6533, 6534, 6535, 6538, 7049, 7050, 7445, 7446, 7605}; + + /** + * Constructs a new {@code BankNPC} {@code Object}. + */ + public BankNPC() { + super(0, null); + } + + @Override + public void init() { + super.init(); + for (int i = 0; i < 4; i++) { + Direction dir = Direction.get(i); + Location loc = getLocation().transform(dir.getStepX(), dir.getStepY(), 0); + GameObject bank = RegionManager.getObject(loc); + if (bank != null && bank.getName().equals("Bank booth")) { + setDirection(dir); + setAttribute("facing_booth", true); + super.setWalks(false); + break; + } + } + } + + /** + * Constructs a new {@code BankNPC} {@code Object}. + * + * @param id The NPC id. + * @param location The location. + */ + private BankNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BankNPC(id, location); + } + + @Override + public int[] getIds() { + return IDS; + } + } + + private static void checkAchievements(Player player) { + // Access the bank in Draynor Village + if (player.getLocation().withinDistance(Location.create(3092, 3243, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 15); + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/BarrowsBoatPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/BarrowsBoatPlugin.java new file mode 100644 index 000000000..542bcb95f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/BarrowsBoatPlugin.java @@ -0,0 +1,53 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the barrows boat plugin. + * @author Vexia + */ +@Initializable +public class BarrowsBoatPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(6970).getHandlers().put("option:board", this); + ObjectDefinition.forId(6969).getHandlers().put("option:board", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + switch (option) { + case "board": + final Location dest = node.getId() == 6970 ? new Location(3522, 3285, 0) : new Location(3500, 3380, 0); + final String name = node.getId() == 6970 ? "Mort'on." : "the swamp"; + player.lock(); + player.getInterfaceManager().open(new Component(321)); + GameWorld.getPulser().submit(new Pulse(7, player) { + + @Override + public boolean pulse() { + player.unlock(); + player.teleport(dest); + player.getInterfaceManager().close(); + player.getDialogueInterpreter().sendDialogue("You arrive at " + name + "."); + return true; + } + + }); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/BarrowsTunnelShortcut.java b/Server/src/main/java/Server/core/game/interaction/object/BarrowsTunnelShortcut.java new file mode 100644 index 000000000..2f69a67d0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/BarrowsTunnelShortcut.java @@ -0,0 +1,83 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the underground shortcut from the Canifis trapdoor to the swamp. + * @author Splinter - March 1st + */ +@Initializable +public class BarrowsTunnelShortcut extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(5055).getHandlers().put("option:open", this); + ObjectDefinition.forId(5054).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(5052).getHandlers().put("option:search", this); + ObjectDefinition.forId(30261).getHandlers().put("option:open", this); + ObjectDefinition.forId(30262).getHandlers().put("option:open", this); + ObjectDefinition.forId(30265).getHandlers().put("option:open", this); + ObjectDefinition.forId(5005).getHandlers().put("option:climb up", this); + ObjectDefinition.forId(5005).getHandlers().put("option:climb down", this); + ObjectDefinition.forId(5002).getHandlers().put("option:walk-here", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + switch (node.getId()) { + case 5055: + player.teleport(new Location(3477, 9845)); + break; + case 5054: + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, new Location(3496, 3465, 0)); + break; + case 5052: + player.getPacketDispatch().sendMessage("You search the wall and find a lever."); + DoorActionHandler.handleAutowalkDoor(player, ((GameObject) node)); + break; + case 30261: + case 30262: + player.teleport(new Location(3509, 3448), 1); + break; + case 30265: + player.teleport(new Location(3500, 9812), 1); + break; + case 5002: + + break; + case 5005:// First tree + if (node.getLocation().equals(new Location(3502, 3431))) { + switch (option) { + case "climb up": + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, new Location(3502, 3425, 0)); + break; + case "climb down": + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_DOWN, new Location(3503, 3431, 0)); + break; + } + break; + } else {// second tree + switch (option) { + case "climb up": + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_UP, new Location(3503, 3431, 0)); + break; + case "climb down": + ClimbActionHandler.climb(player, ClimbActionHandler.CLIMB_DOWN, new Location(3502, 3425, 0)); + break; + } + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/BeehivePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/BeehivePlugin.java new file mode 100644 index 000000000..578a9d0a7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/BeehivePlugin.java @@ -0,0 +1,77 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.tools.Items; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class BeehivePlugin extends OptionHandler { + private static final Item REPELLANT = new Item(Items.INSECT_REPELLENT_28); + private static final Item BUCKET = new Item(Items.BUCKET_1925); + private static final Item BUCKET_OF_WAX = new Item(Items.BUCKET_OF_WAX_30); + private static final Item HONEYCOMB = new Item(12156); + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getInventory().containsItem(REPELLANT)) { + player.getPacketDispatch().sendMessage("The bees fly out of the hive and sting you!"); + player.getImpactHandler().manualHit(player, 2, ImpactHandler.HitsplatType.NORMAL, 1); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("Maybe you can clear them out somehow."); + return true; + } + }); + } else { + switch (option) { + case "take-from": + if (!player.getInventory().containsItem(BUCKET)) { + player.getPacketDispatch().sendMessage("You need a bucket to do that."); + } else { + player.getInventory().remove(BUCKET); + player.getInventory().add(BUCKET_OF_WAX); + player.getPacketDispatch().sendMessage("You fill your bucket with wax from the hive."); + } + break; + case "take-honey": + if (!player.getInventory().hasSpaceFor(HONEYCOMB)) { + player.getPacketDispatch().sendMessage("You don't have enough space in your inventory."); + } else { + player.getInventory().add(HONEYCOMB); + player.getPacketDispatch().sendMessage("You take a chunk of honeycomb from the hive."); + } + break; + } + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(68).getHandlers().put("option:take-from", this); + ObjectDefinition.forId(68).getHandlers().put("option:take-honey", this); + return this; + } + + @Override + public Location getDestination(Node mover, Node node) { + Location west = node.getCenterLocation().transform(Direction.WEST, 1); + Location east = node.getCenterLocation().transform(Direction.EAST, 1); + if (mover.getLocation().getDistance(east) <= mover.getLocation().getDistance(west)) { + return east; + } else { + return west; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/BrassKeyDoorPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/BrassKeyDoorPlugin.java new file mode 100644 index 000000000..b5f72c231 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/BrassKeyDoorPlugin.java @@ -0,0 +1,43 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the brass key door plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BrassKeyDoorPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getInventory().contains(983, 1)) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } else { + player.getPacketDispatch().sendMessage("This door is locked."); + return true; + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(1804).getHandlers().put("option:open", this); + return this; + } + + @Override + public Location getDestination(Node node, Node n) { + return DoorActionHandler.getDestination(((Player) node), ((GameObject) n)); + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/BrokenCartBypass.java b/Server/src/main/java/Server/core/game/interaction/object/BrokenCartBypass.java new file mode 100644 index 000000000..77c1879dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/BrokenCartBypass.java @@ -0,0 +1,54 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + + +/** + * Temporarily fix to allow people into shilo village by foot until the Shilo Village quest is added + * addresses #92 + * @author ceik + */ +@Initializable +public class BrokenCartBypass extends OptionHandler { + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2216).getHandlers().put("option:look-at",this); + return this; + } + + public final void jumpOver(Player player, String options, final Location location){ + player.lock(); + player.animate(new Animation(839)); + player.getImpactHandler().setDisabledTicks(4); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.unlock(); + player.getProperties().setTeleportLocation(location); + player.getAnimator().reset(); + return true; + } + }); + } + public final boolean handle(Player player, Node node, String options){ + Location location = new Location(0,0); + Location playerloc = new Location(player.getLocation().getX(),player.getLocation().getY()); + if(options.equals("look-at")) { + if (playerloc.getX() > 2878) { + location = new Location(2876, 2952); + } else if (playerloc.getX() < 2879) { + location = new Location(2880, 2952); + } + } + jumpOver(player,options,location); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/BuyCrateOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/BuyCrateOptionPlugin.java new file mode 100644 index 000000000..e756e0fa2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/BuyCrateOptionPlugin.java @@ -0,0 +1,31 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.system.config.ShopParser; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the buy crate option plugin for the seers village city. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BuyCrateOptionPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + ShopParser.Companion.openUid(player, 93); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(6839).getHandlers().put("option:buy", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/CanoeOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/CanoeOptionPlugin.java new file mode 100644 index 000000000..6d257f416 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/CanoeOptionPlugin.java @@ -0,0 +1,102 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.travel.canoe.CanoeExtension; +import core.game.content.global.travel.canoe.CanoeStation; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the option handler plugin that will handle all node interactions + * related to canoes. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CanoeOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + final String[] options = new String[] { "chop-down", "shape-canoe", "float canoe", "paddle canoe", "float log", "float waka", "paddle log" }; + for (CanoeStation station : CanoeStation.values()) { + if (station == CanoeStation.WILDERNESS) { + continue; + } + int ids[] = new int[] { 12140, 12141, 12142, 12143, 12145, 12146, 12147, 12148, 12151, 12152, 12153, 12154, 12155, 12156, 12157, 12158, 12144, 12146, 12149, 12150, 12157 }; + for (String option : options) { + for (int i : ids) { + ObjectDefinition.forId(i).getHandlers().put("option:" + option, this); + } + } + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final GameObject object = ((GameObject) node); + final CanoeExtension extension = CanoeExtension.extension(player); + if (extension.getStage() != 0 && extension.getCurrentStation() != null && extension.getCurrentStation() != CanoeStation.getStationByObject(object)) { + extension.setStage(0); + } + if (extension.getStage() != 0) { + player.faceLocation(player.getLocation().transform(object.getId() == 12163 ? -4 : object.getId() == 12164 ? 0 : object.getId() == 12165 ? -1 : -1, object.getId() == 12163 ? 0 : object.getId() == 12164 ? -1 : object.getId() == 12165 ? 0 : 0, 0)); + } + if (extension.getStage() == 0) { + player.faceLocation(player.getLocation().transform(-1, 0, 0)); + } + switch (extension.getStage()) { + case 0: + extension.chopTree(object); + break; + case 1: + extension.shapeCanoe(); + break; + case 2: + extension.setAfloat(object); + break; + case 3: + extension.selectDestination(); + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + final Player p = ((Player) node); + final GameObject object = ((GameObject) n); + final CanoeExtension extension = CanoeExtension.extension(p); + if (object.getLocation().equals(new Location(3110, 3409, 0))) { + if (extension.getStage() == 0) { + return Location.create(3112, 3409, 0); + } else { + return Location.create(3112, 3411, 0); + } + } else if (object.getLocation().equals(new Location(3130, 3508, 0))) { + if (extension.getStage() == 0) { + return Location.create(3132, 3508, 0); + } else { + return Location.create(3132, 3510, 0); + } + } else if (object.getLocation().equals(new Location(3200, 3341, 0))) {// champions + // guild + if (extension.getStage() == 0) { + return Location.create(3204, 3343, 0); + } else { + return Location.create(3202, 3343, 0); + } + } else { + if (extension.getStage() == 0) { + return Location.create(3243, 3235, 0); + } else { + return Location.create(3243, 3237, 0); + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/CavadaBerriesPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/CavadaBerriesPlugin.java new file mode 100644 index 000000000..91220731f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/CavadaBerriesPlugin.java @@ -0,0 +1,40 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the cadava potion. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CavadaBerriesPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(756).getHandlers().put("option:look-at", this); + ItemDefinition.forId(756).getHandlers().put("option:drink", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (option.equals("drink")) { + player.getDialogueInterpreter().sendItemMessage(756, "You dare not drink."); + } + if (option.equals("look-at")) { + player.getDialogueInterpreter().sendItemMessage(756, "This looks very colourful."); + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/ChampionsArenaPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/ChampionsArenaPlugin.java new file mode 100644 index 000000000..72692f441 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/ChampionsArenaPlugin.java @@ -0,0 +1,37 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the champions arena plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ChampionsArenaPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(10556).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int id = node instanceof GameObject ? ((GameObject) node).getId() : ((NPC) node).getId(); + switch (id) { + case 10556: + player.getDialogueInterpreter().open(3050, true, true); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/ChampionsGuildDoor.java b/Server/src/main/java/Server/core/game/interaction/object/ChampionsGuildDoor.java new file mode 100644 index 000000000..930b16382 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/ChampionsGuildDoor.java @@ -0,0 +1,49 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the interaction with the champions guild + * door. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ChampionsGuildDoor extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getLocation().getY() > 3362 && player.getQuestRepository().getPoints() < 32) { + player.getDialogueInterpreter().open(70099, "You have not proved yourself worthy to enter here yet."); + player.getPacketDispatch().sendMessage("The door won't open - you need at least 32 Quest Points."); + } else { + if (player.getLocation().getX() == 3191 && player.getLocation().getY() == 3363) { + player.getDialogueInterpreter().sendDialogues(198, null, "Greetings bold adventurer. Welcome to the guild of", "Champions."); + } + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 1); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(1805).getHandlers().put("option:open", this); + return this; + } + + @Override + public Location getDestination(Node node, Node n) { + return DoorActionHandler.getDestination(((Player) node), ((GameObject) n)); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/ChefGuildDoorPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/ChefGuildDoorPlugin.java new file mode 100644 index 000000000..81d740ac2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/ChefGuildDoorPlugin.java @@ -0,0 +1,77 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.tools.Items; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.item.Item; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the chef guild door plugin. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ChefGuildDoorPlugin extends OptionHandler { + private static final Item CHEFS_HAT = new Item(Items.CHEFS_HAT_1949); + private static final Item COOKING_CAPE = new Item(Items.COOKING_CAPE_9801); + private static final Item COOKING_CAPE_T = new Item(Items.COOKING_CAPET_9802); + private static final Item VARROCK_ARMOUR_3 = new Item(11758); + private static final Item[] ENTRANCE_ITEMS = {CHEFS_HAT, COOKING_CAPE, COOKING_CAPE_T, VARROCK_ARMOUR_3}; + private static final int CHEF_NPC = 847; + + @Override + public boolean handle(Player player, Node node, String option) { + final GameObject object = (GameObject) node; + switch (object.getId()) { + case 2712: // cooking guild front door + if (player.getSkills().getLevel(Skills.COOKING) < 32) { + if (!player.getEquipment().containsAtLeastOneItem(ENTRANCE_ITEMS)) { + player.getDialogueInterpreter().sendDialogues(CHEF_NPC, null, "Sorry. Only the finest chefs are allowed in here.", "Get your cooking level up to 32 and come back", "wearing a chef's hat."); + } else { + player.getDialogueInterpreter().sendDialogues(CHEF_NPC, null, "Sorry. Only the finest chefs are allowed in here.", "Get your cooking level up to 32."); + } + return true; + } else if (!player.getEquipment().containsAtLeastOneItem(ENTRANCE_ITEMS) && player.getLocation().getY() <= 3443) { + player.getDialogueInterpreter().sendDialogues(CHEF_NPC, null, "You can't come in here unless you're wearing a chef's", "hat or something like that."); + return true; + } else { + if (player.getEquipment().containsAtLeastOneItem(VARROCK_ARMOUR_3)) { + player.getDialogueInterpreter().sendDialogues(847, null, "My word! A master explorer of Varrock! Come in, come in! You are more than welcome in here, my friend!"); + } + DoorActionHandler.handleAutowalkDoor(player, object); + } + break; + case 26810: // cooking guild bank door + if (!player.getEquipment().containsAtLeastOneItem(VARROCK_ARMOUR_3) // player not wearing Varrock Armour 3 + && player.getLocation().getX() <= 3143) { // outside bank area + player.getDialogueInterpreter().sendDialogues(CHEF_NPC, null, "The bank's closed. You just can't get the staff these days."); + } else { + DoorActionHandler.handleAutowalkDoor(player, object); + } + break; + } + return true; + } + + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2712).getHandlers().put("option:open", this); + ObjectDefinition.forId(26810).getHandlers().put("option:open", this); + return this; + } + + @Override + public Location getDestination(Node node, Node n) { + return DoorActionHandler.getDestination(((Player) node), ((GameObject) n)); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/CowMilkingPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/CowMilkingPlugin.java new file mode 100644 index 000000000..42d24fb44 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/CowMilkingPlugin.java @@ -0,0 +1,118 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Represents the plugin used to milk a cow. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CowMilkingPlugin extends OptionHandler { + + /** + * Represents the animation to use; + */ + private static final Animation ANIMATION = new Animation(2305); + + /** + * Represents the items related to cow milking plugin. + */ + private static final Item[] ITEMS = new Item[] { new Item(1925, 1), new Item(3727, 1), new Item(1927, 1) }; + + @Override + public boolean handle(final Player player, Node node, String option) { + if (option.equalsIgnoreCase("steal-cowbell")) { + player.getDialogueInterpreter().open(70099, "You need to have started the Cold War quest to attempt this."); + return true; + } + milk(player, (GameObject) node); + return true; + } + + /** + * Milks a cow. + * @param player the player. + * @param object the object. + * @return {@code True} if milked. + */ + public boolean milk(final Player player, final GameObject object) { + if (!player.getInventory().contains(1925, 1) && !player.getInventory().contains(3727, 1)) { + player.getDialogueInterpreter().open(3807, true, true); + return true; + } + + player.animate(ANIMATION); + player.getPulseManager().run(new Pulse(8, player) { + @Override + public boolean pulse() { + if (player.getInventory().remove(ITEMS[0]) || player.getInventory().remove(ITEMS[1])) { + player.getInventory().add(ITEMS[2]); + player.getPacketDispatch().sendMessage("You milk the cow."); + } + if (player.getInventory().contains(1925, 1) || player.getInventory().contains(3727, 1)) { + player.animate(ANIMATION); + return false; + } + return true; + } + + @Override + public void stop() { + super.stop(); + player.animate(new Animation(-1)); + } + }); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(8689).getHandlers().put("option:milk", this); + ObjectDefinition.forId(12111).getHandlers().put("option:milk", this); + ObjectDefinition.setOptionHandler("steal-cowbell", this); + PluginManager.definePlugin(new BucketHandler()); + return this; + } + + /** + * The use with handler for buckets. + * @author Vexia + */ + public class BucketHandler extends UseWithHandler { + + /** + * Constructs a new {@code BucketHandler} {@code Object} + */ + public BucketHandler() { + super(1925); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(8689, OBJECT_TYPE, this); + addHandler(12111, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + milk(event.getPlayer(), (GameObject) event.getUsedWith()); + return true; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/CrystalChestPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/CrystalChestPlugin.java new file mode 100644 index 000000000..e22de3988 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/CrystalChestPlugin.java @@ -0,0 +1,159 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the plugin used for the crystal chest. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CrystalChestPlugin extends UseWithHandler { + + /** + * Represents the cyrstal key. + */ + private static final Item KEY = new Item(989); + + /** + * Constructs a new {@code CrystalChestPlugin} {@code Object}. + */ + public CrystalChestPlugin() { + super(989); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(172, OBJECT_TYPE, this); + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(172).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + unlock(player); + return true; + } + + }); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + unlock(event.getPlayer()); + return true; + } + + /** + * Unlocks the chest. + * @param player the player, + * @return true if so. + */ + private boolean unlock(Player player) { + if (!player.getInventory().contains(989, 1)) { + player.getPacketDispatch().sendMessage("This chest is securely locked shut."); + return true; + } + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return true; + } + if (player.getInventory().remove(KEY)) { + Reward reward = Reward.getReward(player); + for (Item i : reward.getItems()) { + player.getInventory().add(i, player); + } + player.getPacketDispatch().sendMessage("You unlock the chest with your key."); + player.getPacketDispatch().sendMessage("You find some teasure in the chest!"); + } + return true; + } + + /** + * Represents a crystal ches reward. + * @author 'Vexia + */ + public enum Reward { + FIRST(39.69, new Item(1631, 1), new Item(1969, 1), new Item(995, 2000)), SECOND(16.72, new Item(1631, 1)), THIRD(10.57, new Item(1631, 1), new Item(371, 5), new Item(995, 1000)), FOURTH(7.73, new Item(1631, 1), new Item(556, 50), new Item(555, 50), new Item(557, 50), new Item(554, 50), new Item(559, 50), new Item(558, 50), new Item(565, 10), new Item(9075, 10), new Item(566, 10)), FIFTH(6.55, new Item(1631, 1), new Item(454, 100)), SIXTH(4.23, new Item(1631, 1), new Item(1603, 2), new Item(1601, 2)), SEVENTH(3.67, new Item(1631, 1), new Item(985, 1), new Item(995, 750)), EIGHT(3.51, new Item(1631, 1), new Item(2363, 3)), NINTH(3.26, new Item(1631, 1), new Item(987, 1), new Item(995, 750)), TENTH(2.75, new Item(1631, 1), new Item(441, 150)), ELEVENTH(1.06, new Item(1631, 1), new Item(1183, 1)), TWELFTH(0.26, new Item(1631, 1), new Item(1079, 1)), // FOR + // MALES! + TWELFTH_FEMALE(0.26, new Item(1631, 1), new Item(1093, 1)); // FOR + // SHEMALES(Female) + + /** + * Represents the item rewards. + */ + private final Item[] items; + + /** + * Represents the chance of getting the item. + */ + private final double chance; + + /** + * Constructs a new {@code CrystalChestPlugin} {@code Object}. + * @param chance the chance. + * @param items the item. + */ + Reward(double chance, Item... items) { + this.chance = chance; + this.items = items; + } + + /** + * Gets the reward. + * @param player the player. + * @return the reward. + */ + public static Reward getReward(final Player player) { + int totalChance = 0; + for (Reward r : values()) { + if (r == Reward.TWELFTH_FEMALE && !player.getAppearance().isMale()) { + continue; + } + totalChance += r.getChance(); + } + final int random = RandomFunction.random(totalChance); + int total = 0; + for (Reward r : values()) { + total += r.getChance(); + if (random < total) { + return r; + } + } + return null; + } + + /** + * Gets the items. + * @return The items. + */ + public Item[] getItems() { + return items; + } + + /** + * Gets the chance. + * @return The chance. + */ + public double getChance() { + return chance; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/CrystalKeyObjectPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/CrystalKeyObjectPlugin.java new file mode 100644 index 000000000..a6bb3b50f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/CrystalKeyObjectPlugin.java @@ -0,0 +1,22 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +public class CrystalKeyObjectPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/CulinomancerChestPliugin.java b/Server/src/main/java/Server/core/game/interaction/object/CulinomancerChestPliugin.java new file mode 100644 index 000000000..d52c44cf7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/CulinomancerChestPliugin.java @@ -0,0 +1,48 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.config.ShopParser; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the culinomancer chest. + * @author Vexia + */ +@Initializable +public final class CulinomancerChestPliugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(12309).getHandlers().put("option:bank", this); + ObjectDefinition.forId(12309).getHandlers().put("option:buy-items", this); + ObjectDefinition.forId(12309).getHandlers().put("option:buy-food", this); + GameObject object = RegionManager.getObject(new Location(3219, 9623, 0)); + ObjectBuilder.replace(object, object.transform(object.getId(), 3)); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "bank": + player.getBank().open(); + return true; + case "buy-items": + ShopParser.Companion.openUid(player, 178); + return true; + case "buy-food": + ShopParser.Companion.openUid(player, 177); + return true; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/DemonTauntHandler.kt b/Server/src/main/java/Server/core/game/interaction/object/DemonTauntHandler.kt new file mode 100644 index 000000000..0328a44e6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/DemonTauntHandler.kt @@ -0,0 +1,38 @@ +package core.game.interaction.`object` + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.entity.player.link.emote.Emotes +import core.game.world.map.RegionManager +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +/** + * Handles taunting of the demon in the wizard's tower + * @author afaroutdude / Ceikry + */ +class DemonTauntHandler : OptionHandler(){ + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(37668).handlers["option:taunt-through"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + player.packetDispatch.sendMessage("You taunt the demon, making it growl.") + val localNpcs = RegionManager.getLocalNpcs(player) + player.animator.animate(Emotes.RASPBERRY.animation) + for (npc in localNpcs) { + if (npc.id == 82) { + npc.sendChat("Graaaagh!", 1) + player.faceLocation(npc.location) + } + } + player.achievementDiaryManager.finishTask(player, DiaryType.LUMBRIDGE, 1, 13) + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/object/DoogleLeafPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/DoogleLeafPlugin.java new file mode 100644 index 000000000..b2e80b855 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/DoogleLeafPlugin.java @@ -0,0 +1,40 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the doogle leaf plugin for this object. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class DoogleLeafPlugin extends OptionHandler { + + /** + * Represents the leaf item. + */ + private static final Item LEAF = new Item(1573, 1); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(31155).getHandlers().put("option:pick-leaf", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getInventory().add(LEAF)) { + player.getPacketDispatch().sendMessage("You don't have have enough space in your inventory."); + } else { + player.getPacketDispatch().sendMessage("You pick some doogle leaves."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/DoorManagingPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/DoorManagingPlugin.java new file mode 100644 index 000000000..b7740c0cd --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/DoorManagingPlugin.java @@ -0,0 +1,80 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Plugin used for handling the opening/closing of (double) + * doors/gates/fences/... + * @author Emperor + */ +@Initializable +public final class DoorManagingPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("open", this); + ObjectDefinition.setOptionHandler("close", this); + ObjectDefinition.setOptionHandler("shut", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + GameObject object = (GameObject) node; + if (object.getType() != 9 && !player.getLocation().equals(node.getLocation()) && !player.getLocation().isNextTo(object) && object.getName().contains("cupboard")) { + return true; + } + String name = object.getName().toLowerCase(); + if (name.contains("drawers") || name.contains("wardrobe") || name.contains("cupboard")) { + switch(option) { + case "open": + if (object.isActive()) { + ObjectBuilder.replace(object, object.transform(object.getId() + 1), 80); + } + return true; + case "close": + case "shut": + ObjectBuilder.replace(object, object.transform(object.getId() - 1)); + return true; + } + return true; + } + if (name.contains("trapdoor") || name.contains("trap door")) { + Location destination = object.getLocation().transform(0, 6400, 0); + if (!RegionManager.isTeleportPermitted(destination)) { + player.getPacketDispatch().sendMessage("This doesn't seem to go anywhere."); + return true; + } + player.getProperties().setTeleportLocation(destination); + return true; + } + if (node.asObject().getId() == 25341) {// Mithril door + return false; + } + if (!name.contains("door") && !name.contains("gate") && !name.contains("fence") && !name.contains("wall") && !name.contains("exit") && !name.contains("entrance")) { + return false; + } + DoorActionHandler.handleDoor(player, object); + return true; + } + + @Override + public Location getDestination(Node n, Node node) { + GameObject o = (GameObject) node; + if (o.getType() < 4 || o.getType() == 9) { + return DoorActionHandler.getDestination((Player) n, o); + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/DropPartyLeverOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/DropPartyLeverOptionPlugin.java new file mode 100644 index 000000000..08419187b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/DropPartyLeverOptionPlugin.java @@ -0,0 +1,50 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the drop party lever. + * @author 'Vexia + * @version 1.0 + */ +public final class DropPartyLeverOptionPlugin extends OptionHandler { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(6933); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(26194).getHandlers().put("option:pull", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final GameObject object = (GameObject) node; + if (player.getAttribute("delay:lever", -1) > GameWorld.getTicks()) + return true; + player.setAttribute("delay:picking", GameWorld.getTicks() + 3); + player.lock(2); + player.faceLocation(object.getLocation()); + player.getDialogueInterpreter().open(1 << 16 | 2); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.animate(ANIMATION); + return true; + } + }); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/DummyAttackPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/DummyAttackPlugin.java new file mode 100644 index 000000000..4b30fdd0e --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/DummyAttackPlugin.java @@ -0,0 +1,69 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the dummy attack plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DummyAttackPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2038).getHandlers().put("option:attack", this); + ObjectDefinition.forId(15624).getHandlers().put("option:attack", this); + ObjectDefinition.forId(15625).getHandlers().put("option:attack", this); + ObjectDefinition.forId(15626).getHandlers().put("option:attack", this); + ObjectDefinition.forId(15627).getHandlers().put("option:attack", this); + ObjectDefinition.forId(15628).getHandlers().put("option:attack", this); + ObjectDefinition.forId(15629).getHandlers().put("option:attack", this); + ObjectDefinition.forId(15630).getHandlers().put("option:attack", this); + ObjectDefinition.forId(18238).getHandlers().put("option:attack", this); + ObjectDefinition.forId(25648).getHandlers().put("option:attack", this); + ObjectDefinition.forId(28912).getHandlers().put("option:attack", this); + ObjectDefinition.forId(823).getHandlers().put("option:attack", this); + ObjectDefinition.forId(23921).getHandlers().put("option:attack", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.lock(3); + player.animate(player.getProperties().getAttackAnimation()); + if (player.getProperties().getCurrentCombatLevel() < 8) { + final Player p = player; + double experience = 5; + switch (p.getProperties().getAttackStyle().getStyle()) { + case WeaponInterface.STYLE_ACCURATE: + p.getSkills().addExperience(Skills.ATTACK, experience); + break; + case WeaponInterface.STYLE_AGGRESSIVE:// strength. + p.getSkills().addExperience(Skills.STRENGTH, experience); + break; + case WeaponInterface.STYLE_DEFENSIVE:// defence. + p.getSkills().addExperience(Skills.DEFENCE, experience); + break; + case WeaponInterface.STYLE_CONTROLLED:// shared. + experience /= 3; + p.getSkills().addExperience(Skills.ATTACK, experience); + p.getSkills().addExperience(Skills.STRENGTH, experience); + p.getSkills().addExperience(Skills.DEFENCE, experience); + break; + } + } else { + player.getPacketDispatch().sendMessage("You swing at the dummy..."); + player.getPacketDispatch().sendMessage("There is nothing more you can learn from hitting a dummy."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/ErnestTheChickenPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/ErnestTheChickenPlugin.java new file mode 100644 index 000000000..b42748d4a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/ErnestTheChickenPlugin.java @@ -0,0 +1,586 @@ +package core.game.interaction.object; + +import java.awt.Point; +import java.util.Arrays; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the ernest the chicken plugin to handle node interactions. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ErnestTheChickenPlugin extends OptionHandler { + + /** + * Represents the pulling down animation. + */ + private static final Animation DOWN_ANIMATION = new Animation(2140); + + /** + * Represents the pulling up animation. + */ + private static final Animation UP_ANIMATION = new Animation(2139); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(11450).getHandlers().put("option:open", this); + for (Lever lever : Lever.values()) { + for (int i : lever.getObjectIds()) { + ObjectDefinition.forId(i).getHandlers().put("option:pull", this); + ObjectDefinition.forId(i).getHandlers().put("option:inspect", this); + } + } + /** doors */ + ZoneBuilder.configure(new LeverZone()); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final GameObject object = ((GameObject) node); + final LeverCacheExtension extension = LeverCacheExtension.extend(player); + Lever lever = Lever.forObject(object.getId()); + switch (option) { + case "pull": + lever = Lever.forObject(object.getId()); + extension.pull(lever, object); + break; + case "inspect": + extension.inspect(lever); + break; + case "open": + extension.walk(object); + return true; + } + return true; + } + + /** + * Represents an extension class of cached levers for the player. + * @author 'Vexia + * @date 24/12/2013 + */ + public static class LeverCacheExtension { + + /** + * Represents the config id for the lever. + */ + private static final int LEVER_CONFIG = 33; + + /** + * Represents the config id for the doors. + */ + private static final int DOOR_CONFIG = 668; + + /** + * Represents the player. + */ + private final Player player; + + /** + * Represents the cached levers. + */ + private boolean[] levers = new boolean[Lever.values().length]; + + /** + * Constructs a new {@code ErnestTheChickenPlugin} {@code Object}. + * @param player the player. + */ + public LeverCacheExtension(final Player player) { + this.player = player; + } + + /** + * Method used to extend a lever cache extension. + * @param player the player. + * @return the lever cache extension. + */ + public static LeverCacheExtension extend(final Player player) { + LeverCacheExtension extension = player.getExtension(LeverCacheExtension.class); + if (extension == null) { + extension = new LeverCacheExtension(player); + player.addExtension(LeverCacheExtension.class, extension); + } + return extension; + } + + /** + * Method used to pull a lever. + * @param lever the lever. + * @param object the object. + */ + public final void pull(final Lever lever, final GameObject object) { + final boolean up = isUp(lever); + levers[lever.ordinal()] = !up; + player.animate(!up ? UP_ANIMATION : DOWN_ANIMATION); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + updateConfigs(); + player.getPacketDispatch().sendMessage("You pull lever " + lever.name().replace("LEVER_", "").trim() + " " + (up ? "down" : "up") + "."); + player.getPacketDispatch().sendMessage("You hear a clunk."); + return true; + } + }); + } + + /** + * Method used to inspect a cached lever. + * @param lever the lever. + */ + public final void inspect(final Lever lever) { + player.getPacketDispatch().sendMessage("The lever is " + (isUp(lever) ? "up" : "down") + "."); + } + + /** + * Method used to walk through a door. + * @param object the object. + */ + public final void walk(final GameObject object) { + player.lock(4); + GameWorld.getPulser().submit(new Pulse(1, player, object) { + @Override + public boolean pulse() { + Point p = (Point) getWalkData()[0]; + int[] rotation = (int[]) getWalkData()[1]; + Location destination = (Location) getWalkData()[2]; + final GameObject opened = object.transform(object.getId(), rotation[0]); + opened.setCharge(88); + opened.setLocation(object.getLocation().transform((int) p.getX(), (int) p.getY(), 0)); + final GameObject second = DoorActionHandler.getSecondDoor(object, player); + ObjectBuilder.replace(object, opened, 2); + if (second != null) { + final GameObject secondOpened = second.transform(second.getId(), rotation[1]); + secondOpened.setCharge(88); + secondOpened.setLocation(second.getLocation().transform((int) p.getX(), (int) p.getY(), 0)); + ObjectBuilder.replace(second, secondOpened, 2); + } + AgilityHandler.walk(player, 0, player.getLocation(), destination, null, 0, null); + return true; + } + }); + } + + /** + * Method used to update the players config states. + */ + public final void updateConfigs() { + player.getConfigManager().set(LEVER_CONFIG, calculateLeverConfig()); + player.getConfigManager().set(DOOR_CONFIG, calculateDoorConfig()); + save(); + } + + /** + * Method used to save the lever states. + */ + public final void save() { + boolean value = false; + for (int index = 0; index < levers.length; index++) { + value = levers[index]; + if (!value) {// down. + player.getSavedData().getQuestData().getDraynorLevers()[index] = false; + } + } + } + + /** + * Method used to read the lever states. + */ + public final void read() { + boolean value = false; + for (int i = 0; i < Lever.values().length; i++) { + value = player.getSavedData().getQuestData().getDraynorLevers()[i]; + levers[i] = value; + } + updateConfigs(); + } + + /** + * Method used to calculate the lever config value. + * @return the value. + */ + public final int calculateLeverConfig() { + int value = 0; + for (int i = 0; i < levers.length; i++) { + if (!levers[i]) { + value += Math.pow(2, (i + 1)); + } + } + return value; + } + + /** + * Method used to calculate the door config value. + * @return the value. + */ + public final int calculateDoorConfig() { + final int downCount = getDownCount(); + int value = 0; + boolean up = false; + Lever lever = null; + for (int i = 0; i < levers.length; i++) { + up = levers[i];// if its up. + lever = Lever.values()[i]; + if (downCount == 0 || downCount == 1 && !isUp(Lever.LEVER_B) && lever == Lever.LEVER_B && levers[0]) {// translation: + // no + // down + // lever + // and + // lever + // b + // is + // on/off + // just + // send + // 0. + value = 0; + break; + } + if (downCount == 1 && !isUp(Lever.LEVER_A)) { + return 4; + } + if (downCount == 1 && !isUp(Lever.LEVER_D)) { + return 328; + } + if (downCount == 2 && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_E)) { + return 290; + } + if (downCount == 2 && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_F)) { + return 64; + } + if (downCount == 3 && !isUp(Lever.LEVER_F) && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_C) && isUp(Lever.LEVER_A)) { + return 306; + } + if (downCount == 3 && !isUp(Lever.LEVER_E) && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_C) && isUp(Lever.LEVER_F)) { + return 64; + } + if (downCount == 5 && !isUp(Lever.LEVER_F) && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_C) && !isUp(Lever.LEVER_A) && !isUp(Lever.LEVER_B)) { + return 304; + } + if (!isUp(Lever.LEVER_F) && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_C) && isUp(Lever.LEVER_E) && lever == Lever.LEVER_A) { + return 306; + } + if (!isUp(Lever.LEVER_F) && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_C) && isUp(Lever.LEVER_E) && isUp(Lever.LEVER_A) && !isUp(Lever.LEVER_B)) { + return 304; + } + if (!isUp(Lever.LEVER_F) && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_C) && isUp(Lever.LEVER_E) && !isUp(Lever.LEVER_A) && !isUp(Lever.LEVER_B)) { + return 304; + } + if (downCount == 4 && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_C) && !isUp(Lever.LEVER_A) && !isUp(Lever.LEVER_B)) { + return 264; + } + if (downCount == 3 && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_F) && !isUp(Lever.LEVER_E)) { + return 3; + } + if (downCount == 2 && !isUp(Lever.LEVER_E) && !isUp(Lever.LEVER_F) && isUp(Lever.LEVER_D)) { + return 1; + } + if (downCount == 4 && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_F) && !isUp(Lever.LEVER_E) && !isUp(Lever.LEVER_C)) { + return 19; + } + if (downCount == 3 && !isUp(Lever.LEVER_E) && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_C)) { + return 306; + } + if (downCount == 3 && isUp(Lever.LEVER_E) && !isUp(Lever.LEVER_D) && !isUp(Lever.LEVER_C) && !isUp(Lever.LEVER_F)) { + return 306; + } + if (downCount == 2 && !isUp(Lever.LEVER_B) && !isUp(Lever.LEVER_D)) { + return 64; + } + if (downCount == 2 && !isUp(Lever.LEVER_A) && !isUp(Lever.LEVER_D)) { + return 328; + } + if (lever == Lever.LEVER_A && up && !isUp(Lever.LEVER_B)) { + value -= 132; + continue; + } else if (lever == Lever.LEVER_B && up && !isUp(Lever.LEVER_A)) { + value -= 64; + continue; + } + if (!up) {// if toggled. + if (lever == Lever.LEVER_A) { + value += 4; + } else if (lever == Lever.LEVER_B) { + value += 128; + } else if (lever == Lever.LEVER_D) { + value += 264; + } else if (lever == Lever.LEVER_C) { + value -= 132; + } else if (lever == Lever.LEVER_F) { + value -= 38; + } else if (lever == Lever.LEVER_E) { + value -= 287; + } + } + } + return value; + } + + /** + * Method used to get the walking data. + * @return the data. + */ + public final Object[] getWalkData() { + Object[] data = null; + final int x = player.getLocation().getX(); + final int y = player.getLocation().getY(); + if (x == 3108 && y == 9757) { + data = new Object[] { new Point(-1, 0), new int[] { 2, 0 }, Location.create(3108, 9759, 0) }; + } else if (x == 3108 && y == 9759) { + data = new Object[] { new Point(-1, 0), new int[] { 2, 0 }, Location.create(3108, 9757, 0) }; + } else if (x == 3106 && y == 9760) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3104, 9760, 0) }; + } else if (x == 3104 && y == 9760) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3106, 9760, 0) }; + } else if (x == 3104 && y == 9765) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3106, 9765, 0) }; + } else if (x == 3106 && y == 9765) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3104, 9765, 0) }; + } else if (x == 3102 && y == 9764) { + data = new Object[] { new Point(-1, 0), new int[] { 2, 0 }, Location.create(3102, 9762, 0), }; + } else if (x == 3102 && y == 9762) { + data = new Object[] { new Point(-1, 0), new int[] { 2, 0 }, Location.create(3102, 9764, 0) }; + } else if (x == 3102 && y == 9759) { + data = new Object[] { new Point(-1, 0), new int[] { 2, 0 }, Location.create(3102, 9757, 0) }; + } else if (x == 3102 && y == 9757) { + data = new Object[] { new Point(-1, 0), new int[] { 2, 0 }, Location.create(3102, 9759, 0) }; + } else if (x == 3101 && y == 9760) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3099, 9760, 0) }; + } else if (x == 3099 && y == 9760) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3101, 9760, 0) }; + } else if (x == 3101 && y == 9765) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3099, 9765, 0) }; + } else if (x == 3099 && y == 9765) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3101, 9765, 0) }; + } else if (x == 3097 && y == 9762) { + data = new Object[] { new Point(-1, 0), new int[] { 2, 0 }, Location.create(3097, 9764, 0) }; + } else if (x == 3097 && y == 9764) { + data = new Object[] { new Point(-1, 0), new int[] { 2, 0 }, Location.create(3097, 9762, 0) }; + } else if (x == 3101 && y == 9755) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3099, 9755, 0) }; + } else if (x == 3099 && y == 9755) { + data = new Object[] { new Point(0, 1), new int[] { 3, 0 }, Location.create(3101, 9755, 0) }; + } + return data == null ? new Object[] { new Point(0, 0), new int[] { 0, 0 }, player.getLocation() } : data; + } + + /** + * Method ued to reset the levers. + */ + public void reset() { + Arrays.fill(levers, true); + Arrays.fill(player.getSavedData().getQuestData().getDraynorLevers(), true); + updateConfigs(); + } + + /** + * Gets the count of down levers. + * @return the count. + */ + public final int getDownCount() { + int count = 0; + for (int i = 0; i < levers.length; i++) { + count += !levers[i] ? 1 : 0; + } + return count; + } + + /** + * Method used to check if a lever is up. + * @param lever the lever. + * @return True if so. + */ + public final boolean isUp(final Lever lever) { + return levers[lever.ordinal()]; + } + + /** + * Gets the player. + * @return the player. + */ + public Player getPlayer() { + return player; + } + + } + + /** + * Represents the lever zone map area. + * @author 'Vexia + * @date 26/12/2013 + */ + public class LeverZone extends MapZone { + + /** + * Constructs a new {@code LeverZone} {@code Object}. + */ + public LeverZone() { + super("Draynor lever zone", true); + } + + @Override + public void configure() { + registerRegion(12440); + } + + @Override + public boolean enter(final Entity entity) { + if (!(entity instanceof Player)) { + return super.enter(entity); + } + final Player player = ((Player) entity); + final LeverCacheExtension extension = LeverCacheExtension.extend(player); + extension.read(); + return super.enter(entity); + } + + @Override + public boolean leave(final Entity entity, boolean logout) { + if (entity instanceof Player) { + final Player player = ((Player) entity); + final LeverCacheExtension extension = LeverCacheExtension.extend(player); + extension.save(); + } + return super.leave(entity, logout); + } + } + + /** + * Represents a lever. + * @author 'Vexia + * @date 24/12/2013 + */ + public enum Lever { + LEVER_A(11451, 11452), LEVER_B(11453, 11454), LEVER_C(11455, 11456), LEVER_D(11457, 11458), LEVER_E(11459, 11460), LEVER_F(11461, 11462); + + /** + * Represents the object id. + */ + private final int[] objectIds; + + /** + * Constructs a new {@code ErnestTheChickenPlugin.java} {@code Object}. + * @param objectId + */ + Lever(final int... objectId) { + this.objectIds = objectId; + } + + /** + * Gets the objectId. + * @return The objectId. + */ + public int[] getObjectIds() { + return objectIds; + } + + /** + * Gets the lever from the object id. + * @param objectId the objectId. + * @return the lever. + */ + public static Lever forObject(final int objectId) { + for (Lever lever : Lever.values()) { + for (int i : lever.getObjectIds()) { + if (i == objectId) { + return lever; + } + } + } + return null; + } + } + + @Override + public Location getDestination(final Node node, final Node n) { + if (n instanceof GameObject) { + final Player player = ((Player) node); + final int x = player.getLocation().getX(); + final int y = player.getLocation().getY(); + Location loc = ((GameObject) n).getLocation(); + if (loc.equals(new Location(3108, 9758, 0))) { + if (y <= 9757) { + return Location.create(3108, 9757, 0); + } else { + return Location.create(3108, 9759, 0); + } + } + if (loc.equals(new Location(3105, 9760, 0))) { + if (x >= 3105) { + return Location.create(3106, 9760, 0); + } else { + return Location.create(3104, 9760, 0); + } + } + if (loc.equals(new Location(3105, 9765, 0))) { + if (x >= 3106) { + return Location.create(3106, 9765, 0); + } else { + return Location.create(3104, 9765, 0); + } + } + if (loc.equals(new Location(3102, 9763, 0))) { + if (y >= 9764) { + return Location.create(3102, 9764, 0); + } else { + return Location.create(3102, 9762, 0); + } + } + if (loc.equals(new Location(3102, 9758, 0))) { + if (y >= 9759) { + return Location.create(3102, 9759, 0); + } else { + return Location.create(3102, 9757, 0); + } + } + if (loc.equals(new Location(3100, 9760, 0))) { + if (x >= 3100) { + return Location.create(3101, 9760, 0); + } else { + return Location.create(3099, 9760, 0); + } + } + if (loc.equals(new Location(3100, 9765, 0))) { + if (x >= 3100) { + return Location.create(3101, 9765, 0); + } else { + return Location.create(3099, 9765, 0); + } + } + if (loc.equals(new Location(3097, 9763, 0))) { + if (y <= 9763) { + return Location.create(3097, 9762, 0); + } else { + return Location.create(3097, 9764, 0); + } + } + if (loc.equals(new Location(3100, 9755, 0))) { + if (x >= 3100) { + return Location.create(3101, 9755, 0); + } else { + return Location.create(3099, 9755, 0); + } + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/FairyRingPlugin.kt b/Server/src/main/java/Server/core/game/interaction/object/FairyRingPlugin.kt new file mode 100644 index 000000000..58c491430 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/FairyRingPlugin.kt @@ -0,0 +1,61 @@ +package core.game.interaction.`object` + +import core.cache.def.impl.ObjectDefinition +import core.game.component.Component +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.TeleportManager.TeleportType +import core.game.world.map.Location +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * Handles interactions with fairy rings + * @author Ceikry + */ + +private val RINGS = intArrayOf(12003, 12094, 12095, 14058, 14061, 14064, 14067, 14070, 14073, 14076, 14079, 14082, 14085, 14088, 14091, 14094, 14097, 14100, 14103, 14106, 14109, 14112, 14115, 14118, 14121, 14124, 14127, 14130, 14133, 14136, 14139, 14142, 14145, 14148, 14151, 14154, 14157, 14160, 16181, 16184, 23047, 27325, 37727) +private const val MAIN_RING = 12128 + + +@Initializable +class FairyRingPlugin : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + for (i in RINGS) { + ObjectDefinition.forId(i).handlers["option:use"] = this + } + ObjectDefinition.forId(MAIN_RING).handlers["option:use"] = this + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + when (option) { + "use" -> { + if (!player.equipment.contains(772, 1) && !player.equipment.contains(9084, 1)) { + player.sendMessage("The fairy ring only works for those who wield fairy magic.") + return true + } + when (node.id) { + MAIN_RING -> openFairyRing(player) + else -> player.teleporter.send(Location.create(2412, 4434, 0), TeleportType.FAIRY_RING) + } + } + } + return true + } + + private fun reset(player: Player) { + player.removeAttribute("fairy-delay") + player.removeAttribute("fairy_location_combo") + for (i in 0..2) { + player.configManager[816 + i] = 0 + } + } + + private fun openFairyRing(player: Player) { + reset(player) + player.interfaceManager.openSingleTab(Component(735)) + player.interfaceManager.open(Component(734)) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/object/FieldPickingPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/FieldPickingPlugin.java new file mode 100644 index 000000000..5eca6ddcb --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/FieldPickingPlugin.java @@ -0,0 +1,252 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.container.impl.EquipmentContainer; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the pick option of interactive scenery (non-farming cabbages, + * potatoes, bananas, etc) + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class FieldPickingPlugin extends OptionHandler { + + /** + * The picking animation to use. + */ + private static final Animation ANIMATION = new Animation(827); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("pick", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (player.getAttribute("delay:picking", -1) > GameWorld.getTicks()) { + return true; + } + final GameObject object = (GameObject) node; + final PickingPlant plant = PickingPlant.forId(object.getId()); + if (plant == null) { + return false; + } + if (!object.isActive()) { + return true; + } + final Item reward = new Item(plant == PickingPlant.POTATO && RandomFunction.random(10) == 0 ? 5318 : plant.reward); + if (!player.getInventory().hasSpaceFor(reward)) { + player.getPacketDispatch().sendMessage("Not enough space in your inventory!"); + return true; + } + if (player.getInventory().freeSlot() == -1) { + return true; + } + player.lock(1); + player.setAttribute("delay:picking", GameWorld.getTicks() + (plant == PickingPlant.FLAX ? 2 : 3)); + player.animate(ANIMATION); + if (plant.name().startsWith("NETTLES") && (player.getEquipment().get(EquipmentContainer.SLOT_HANDS) == null || player.getEquipment().get(EquipmentContainer.SLOT_HANDS) != null && !player.getEquipment().get(EquipmentContainer.SLOT_HANDS).getName().contains("glove"))) { + player.getPacketDispatch().sendMessage("You have been stung by the nettles!"); + player.getImpactHandler().manualHit(player, 2, HitsplatType.POISON); + return true; + } + if (plant.respawn != -1 && plant != PickingPlant.FLAX) { + object.setActive(false); + } + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + if (!player.getInventory().add(reward)) { + player.getPacketDispatch().sendMessage("Not enough space in your inventory!"); + return true; + } + if (plant == PickingPlant.FLAX) { + handleFlaxPick(player, object, plant); + return true; + } + boolean banana = plant.name().startsWith("BANANA"); + GameObject full = null; + if (plant == PickingPlant.BANANA_TREE_4) { + full = object.transform(2073); + ObjectBuilder.replace(object, full); + } + if (plant == PickingPlant.FUNGI_ON_LOG) { + full = object.transform(3508); + ObjectBuilder.replace(object, full); + } + if (plant != PickingPlant.FUNGI_ON_LOG) { + ObjectBuilder.replace(plant == PickingPlant.BANANA_TREE_4 ? full : object, object.transform(banana ? plant.respawn : 0), banana ? 300 : plant.respawn); + } + if (!plant.name().startsWith("NETTLES")) { + player.getPacketDispatch().sendMessage("You pick a " + reward.getName().toLowerCase() + "."); + } else { + player.getPacketDispatch().sendMessage("You pick a handful of nettles."); + } + if (banana && !player.getAchievementDiaryManager().hasCompletedTask(DiaryType.KARAMJA, 0, 0)) { + int picked = player.getAttribute("b-picked", 0); + picked++; + player.setAttribute("b-picked", picked); + player.getAchievementDiaryManager().updateTask(player, DiaryType.KARAMJA, 0, 0, picked == 5); + } + return true; + } + }); + return true; + } + + /** + * Method used to handle the flax picking. + * @param player the player. + * @param object the object. + * @param plant the plank. + */ + private void handleFlaxPick(final Player player, final GameObject object, final PickingPlant plant) { + int charge = object.getCharge(); + player.getAudioManager().send(2581); + player.getPacketDispatch().sendMessage("You pick some flax."); + + // Seers achievement diary + if (player.getViewport().getRegion().getId() == 10805 + && !player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0,0)) { + if (player.getAttribute("diary:seers:flax-picked", 0) >= 4) { + player.setAttribute("/save:diary:seers:flax-picked", 5); + player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).updateTask(player,0,0,true); + } else { + player.setAttribute("/save:diary:seers:flax-picked", player.getAttribute("diary:seers:flax-picked", 0) + 1); + } + } + + if (charge > 1000 + RandomFunction.random(2, 8)) { + object.setActive(false); + object.setCharge(1000); + ObjectBuilder.replace(object, object.transform(0), plant.respawn); + return; + } + object.setCharge(charge + 1); + } + + /** + * Represents a plant to be picked. + * @author Emperor + */ + private static enum PickingPlant { + POTATO(312, 1942, 30), + WHEAT_0(313, 1947, 30), + WHEAT_1(5583, 1947, 30), + WHEAT_2(5584, 1947, 30), + WHEAT_3(5585, 1947, 30), + WHEAT_4(15506, 1947, 30), + WHEAT_5(15507, 1947, 30), + WHEAT_6(15508, 1947, 30), + WHEAT_7(22300, 1947, 30), + WHEAT_8(22473, 1947, 30), + WHEAT_9(22474, 1947, 30), + WHEAT_10(22475, 1947, 30), + WHEAT_11(22476, 1947, 30), + CABBAGE_0(1161, 1965, 30), + CABBAGE_1(11494, 1967, 30), + CABBAGE_2(22301, 1965, 30), + NETTLES_0(1181, 4241, 30), + NETTLES_1(5253, 4241, 30), + NETTLES_2(5254, 4241, 30), + NETTLES_3(5255, 4241, 30), + NETTLES_4(5256, 4241, 30), + NETTLES_5(5257, 4241, 30), + NETTLES_6(5258, 4241, 30), + PINEAPPLE_PLANT_0(1408, 2114, 30), + PINEAPPLE_PLANT_1(1409, 2114, 30), + PINEAPPLE_PLANT_2(1410, 2114, 30), + PINEAPPLE_PLANT_3(1411, 2114, 30), + PINEAPPLE_PLANT_4(1412, 2114, 30), + PINEAPPLE_PLANT_5(1413, 2114, 30), + PINEAPPLE_PLANT_6(4827, 2114, 30), + BANANA_TREE_0(2073, 1963, 2074), + BANANA_TREE_1(2074, 1963, 2075), + BANANA_TREE_2(2075, 1963, 2076), + BANANA_TREE_3(2076, 1963, 2077), + BANANA_TREE_4(2077, 1963, 2078), + BANANA_TREE_5(12606, 1963, 2079), + BANANA_TREE_6(12607, 1963, 2080), + FLAX(2646, 1779, 30), + ONION_0(3366, 1957, 30), + ONION_1(5538, 1957, 30), + FUNGI_ON_LOG(3509, 2970, -1), + GOLDEN_PEAR_BUSH(3513, 2974, 30), + GLOWING_FUNGUS_0(4932, 4075, 30), + GLOWING_FUNGUS_1(4933, 4075, 30), + RARE_FLOWERS(5006, 2460, 30), + BLACK_MUSHROOMS(6311, 4620, 30), + KELP(12478, 7516, 30), + RED_BANANA_TREE(12609, 7572, 30), + BUSH(12615, 7573, 30), + RED_FLOWERS(15846, 8938, 30), + BLUE_FLOWERS(15872, 8936, 30), + HARDY_GOUTWEED(18855, 3261, 30), + HERBS_0(21668, 199, 30), + HERBS_1(21669, 201, 30), + HERBS_2(21670, 203, 30), + HERBS_3(21671, 205, 30), + FEVER_GRASS(29113, 12574, 30), + LAVENDER(29114, 12572, 30), + TANSYMUM(29115, 12576, 30), + PRIMWEED(29116, 12588, 30), + STINKBLOOM(29117, 12590, 30), + TROLLWEISS_FLOWERS(37328, 4086, 30), + HOLLOW_LOG(37830, 10968, 30); + + /** + * The object id. + */ + final int objectId; + + /** + * The reward item id. + */ + final int reward; + + /** + * The respawn duration. + */ + final int respawn; + + /** + * Constructs a new {@code FieldPickingPlugin {@code Object}. + * @param objectId the object id. + * @param reward the reward. + * @param respawn the resapwn. + */ + private PickingPlant(int objectId, int reward, int respawn) { + this.objectId = objectId; + this.reward = reward; + this.respawn = respawn; + } + + /** + * Gets the picking plant by the id. + * @param objectId the id. + * @return the picking plant. + */ + static PickingPlant forId(int objectId) { + for (PickingPlant plant : values()) + if (plant.objectId == objectId) + return plant; + return null; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/FlourMakingPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/FlourMakingPlugin.java new file mode 100644 index 000000000..6bf10ce56 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/FlourMakingPlugin.java @@ -0,0 +1,330 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the flour making plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FlourMakingPlugin extends OptionHandler { + + /** + * Represents the animation of operating a hopper. + */ + private static final Animation ANIMATION = new Animation(3571); + + /** + * Represents the empty pot item. + */ + private static final Item EMPTY_POT = new Item(1931); + + /** + * Represents the pot of flour. + */ + private static final Item FLOUR = new Item(1933); + + /** + * Represents the config id. + */ + private static final int CONFIG = 695; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + int controls[] = new int[] { 2718, 2720, 2721, 24072, 24070 }; + for (int i : controls) { + ObjectDefinition.forId(i).getHandlers().put("option:operate", this); + } + ObjectDefinition.forId(36878).getHandlers().put("option:empty", this); + ObjectDefinition.forId(22420).getHandlers().put("option:empty", this); + ObjectDefinition.forId(5792).getHandlers().put("option:empty", this); + ObjectDefinition.forId(1782).getHandlers().put("option:empty", this); + ObjectDefinition.forId(1781).getHandlers().put("option:empty", this); + ObjectDefinition.forId(22421).getHandlers().put("option:empty", this); + ObjectDefinition.forId(24070).getHandlers().put("option:empty", this); + new GrainHopperPlugin().newInstance(arg); + new FillPotHandler().newInstance(arg); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + FlourExtension.extend(player);// doesn't set extension if already there. + final FlourExtension extension = player.getExtension(FlourExtension.class); + player.lock(3); + switch (option) { + case "operate": + player.animate(ANIMATION); + player.getAudioManager().send(3189); + if (extension.getSemiCharges() < 1) { + player.getPacketDispatch().sendMessage("You operate the empty hopper. Nothing interesting happens."); + } else { + extension.emptyChute(); + player.getPacketDispatch().sendMessage("You operate the hopper. The grain slides down the chute."); + player.getConfigManager().set(CONFIG, 1); + player.setAttribute("/save:milling:grain",player.getAttribute("milling:grain",0) + 1); + } + break; + case "empty": + return empty(player, extension); + } + return true; + } + + /** + * Method used to empty the bin. + * @param player the player. + * @param extension the extension. + * @return {@code True} if emptied. + */ + private boolean empty(final Player player, final FlourExtension extension) { + if (extension.getCharges() < 1) { + return true; + } + if (!player.getInventory().containsItem(EMPTY_POT)) { + player.getPacketDispatch().sendMessage("I need an empty pot to hold the flour in."); + return true; + } + if (player.getInventory().remove(EMPTY_POT)) { + player.getInventory().add(FLOUR); + extension.decrement(1); + player.getPacketDispatch().sendMessage(!extension.isEmpty() ? "You fill a pot with flour from the bin." : "You fill a pot with the last of the flour in the bin."); + + // Grind some flour in the windmill north of Lumbridge + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 20); + + if (extension.getCharges() < 1) { + player.getConfigManager().set(CONFIG, 0); + } + } + return true; + } + + /** + * Represents the flour extension class. + * @author 'Vexia + * @version 1.0 + */ + public static final class FlourExtension { + + /** + * Represents the player. + */ + private final Player player; + + /** + * Represents the amount of flour charges. + */ + private int charges; + + /** + * Represents the amount of semi charges. + */ + private int semiCharges; + + /** + * Constructs a new {@code FlourMakingPlugin} {@code Object}. + * @param player the player. + */ + FlourExtension(final Player player) { + this.player = player; + } + + /** + * Method used to extend a flour extension. + * @param player the player. + */ + public static void extend(final Player player) { + if (player.getExtension(FlourExtension.class) == null) { + player.addExtension(FlourExtension.class, new FlourExtension(player)); + } + } + + /** + * Method used to increment the charges. + * @param increment the increment. + */ + public final void increment(final int increment, boolean semi) { + if(player.getAttribute("milling:grain",0) < 30) { + if (semi) { + semiCharges += increment; + } else { + charges += increment; + } + player.setAttribute("/save:milling:grain",player.getAttribute("milling:grain",0) + 1); + } + } + + /** + * Method used to decrement charges. + * @param increment the incremend. + */ + public final void decrement(final int increment) { + charges -= increment; + if(!(player.getAttribute("milling:grain",0) <= 0)){ + player.setAttribute("/save:milling:grain",player.getAttribute("milling:grain",0) + 1); + } + } + + /** + * Method used to fill a chute. + */ + public final void fill() { + semiCharges += 1; + } + + /** + * Method used to swap charges. + */ + public final void emptyChute() { + charges += semiCharges; + semiCharges = 0; + } + + /** + * Method used to check if the chute is empty. + * @return True if so. + */ + public final boolean isEmpty() { + return charges < 1; + } + + /** + * Gets the charges. + * @return The charges. + */ + public int getCharges() { + return charges; + } + + /** + * Gets the semiCharges. + * @return The semiCharges. + */ + public int getSemiCharges() { + return semiCharges; + } + + /** + * Sets the semiCharges. + * @param semiCharges The semiCharges to set. + */ + public void setSemiCharges(int semiCharges) { + this.semiCharges = semiCharges; + } + + /** + * Sets the charges. + * @param charges The charges to set. + */ + public void setCharges(int charges) { + this.charges = charges; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + } + + /** + * Represents the grain hopper use with handler. + * @author 'Vexia + * @version 1.0 + */ + public static final class GrainHopperPlugin extends UseWithHandler { + + /** + * Represents the grain item. + */ + private static final Item GRAIN = new Item(1947); + + /** + * Represents the animation of opperating a hopper. + */ + private static final Animation ANIMATION = new Animation(3571); + + /** + * Constructs a new {@code GrainHopperPlugin} {@code Object}. + */ + public GrainHopperPlugin() { + super(1947); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + int[] hoppers = new int[] { 2713, 2714, 2716, 2717, 2718, 2720, 2721, 2722, 10170, 15847, 15848, 15849, 15850, 15851, 15852, 15853, 15854, 15873, 15874, 15875, 15876, 15877, 15878, 15879, 15880, 20260, 20261, 20262, 20264, 20265, 20266, 22422, 24071, 24072, 36881 }; + for (int i : hoppers) { + addHandler(i, OBJECT_TYPE, this); + } + addHandler(24075, OBJECT_TYPE, this);// don't think it was added. + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + FlourExtension.extend(player); + final FlourExtension extension = player.getExtension(FlourExtension.class); + if (extension.getSemiCharges() > 0) { + player.getPacketDispatch().sendMessage("There is already grain in the hopper."); + return true; + } + if (player.getInventory().remove(GRAIN)) { + player.animate(ANIMATION); + extension.fill(); + player.getPacketDispatch().sendMessage("You put the grain in the hopper."); + } + return true; + } + + } + + /** + * Represents the plugin used to fill a bucket by a use-with interaction. + * @author 'Vexia + * @version 1.0 + */ + public final class FillPotHandler extends UseWithHandler { + + /** + * Constructs a new {@code FillPotHandler} {@code Object}. + */ + public FillPotHandler() { + super(EMPTY_POT.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(36878, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + FlourExtension.extend(player);// doesn't set extension if already + // there. + final FlourExtension extension = player.getExtension(FlourExtension.class); + player.lock(3); + empty(player, extension); + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/GertrudeCatPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/GertrudeCatPlugin.java new file mode 100644 index 000000000..ba9408273 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/GertrudeCatPlugin.java @@ -0,0 +1,66 @@ +/* +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.InitializablePlugin; +import core.tools.RandomFunction; + +*/ +/** + * Represents the plugin to handle interactions with gertrudes cat. + * @author 'Vexia + * @version 1.0 + *//* + +@InitializablePlugin +public final class GertrudeCatPlugin extends OptionHandler { + + */ +/** + * Represents the kitten item. + *//* + + private static final Item KITTEN = new Item(13236); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2620).getConfigurations().put("option:search", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + switch (option) { + case "search": + if (quest.getStage(player) == 50 && !player.getInventory().containsItem(KITTEN) && !player.getBank().containsItem(KITTEN)) { + quest.setStage(player, 40); + } + if (quest.getStage(player) == 40) { + if (player.getAttribute("findkitten", false) && player.getInventory().freeSlots() > 0) { + quest.setStage(player, 50); + player.getDialogueInterpreter().sendDialogue("You find some kittens! You carefully place them into your backpack."); + player.getInventory().add(KITTEN); + return true; + } + } else { + player.getPacketDispatch().sendMessage("You search the crate."); + player.getPacketDispatch().sendMessage("You find nothing."); + if (RandomFunction.random(0, 3) == 1) { + player.getPacketDispatch().sendMessage("You can hear kittens mewing close by..."); + player.setAttribute("findkitten", true); + } + } + break; + } + return true; + } + +} +*/ diff --git a/Server/src/main/java/Server/core/game/interaction/object/GnomeSpiritTreePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/GnomeSpiritTreePlugin.java new file mode 100644 index 000000000..bc3579e17 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/GnomeSpiritTreePlugin.java @@ -0,0 +1,42 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin to handle gnome tree teleporting. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GnomeSpiritTreePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(1317).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(1317).getHandlers().put("option:teleport", this); + ObjectDefinition.forId(1293).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(1293).getHandlers().put("option:teleport", this); + ObjectDefinition.forId(1294).getHandlers().put("option:talk-to", this); + ObjectDefinition.forId(1294).getHandlers().put("option:teleport", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "talk-to": + player.getDialogueInterpreter().open(1317); + return true; + case "teleport": + player.getDialogueInterpreter().open(1317); + return true; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/GoblinVillagePopulationPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/GoblinVillagePopulationPlugin.java new file mode 100644 index 000000000..5e62493f0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/GoblinVillagePopulationPlugin.java @@ -0,0 +1,36 @@ +package core.game.interaction.object; + +import java.util.List; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class GoblinVillagePopulationPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(31301).getHandlers().put("option:read", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + int population = 2; + final List npcs = RegionManager.getLocalNpcs(player); + for (NPC n : npcs) { + if (n.getName().equals("Goblin")) { + population++; + player.getDialogueInterpreter().sendPlainMessage(false, "Welcome to Goblin Village.", "Current population: " + population); + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/GrandExchangePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/GrandExchangePlugin.java new file mode 100644 index 000000000..63c33839d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/GrandExchangePlugin.java @@ -0,0 +1,169 @@ +package core.game.interaction.object; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.ge.GEGuidePrice; +import core.game.ge.GrandExchangeDatabase; +import core.game.ge.GEGuidePrice.GuideType; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Represents the plugin used for grand exchange npc and object options. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GrandExchangePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(28089).getHandlers().put("option:use", this); + ObjectDefinition.forId(28089).getHandlers().put("option:exchange", this); + ObjectDefinition.forId(28089).getHandlers().put("option:collect", this); + ObjectDefinition.forId(28089).getHandlers().put("option:history", this); + ObjectDefinition.forId(28089).getHandlers().put("option:sets", this); + for (int i : new int[] { 6528, 6529, 6530, 6531 }) { + NPCDefinition.forId(i).getHandlers().put("option:exchange", this); + NPCDefinition.forId(i).getHandlers().put("option:history", this); + NPCDefinition.forId(i).getHandlers().put("option:sets", this); + } + NPCDefinition.forId(6527).getHandlers().put("option:info-combat", this); + NPCDefinition.forId(6526).getHandlers().put("option:info-logs", this); + NPCDefinition.forId(6525).getHandlers().put("option:info-runes", this); + NPCDefinition.forId(6524).getHandlers().put("option:info-herbs", this); + NPCDefinition.forId(6523).getHandlers().put("option:info-ores", this); + new GENPCPlugin().newInstance(arg); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getIronmanManager().checkRestriction() && !option.equals("sets")) { + return true; + } + switch (option) { + case "use": + player.getDialogueInterpreter().open(6528, NPC.create(6528, player.getLocation())); + break; + case "exchange": + if (!GrandExchangeDatabase.hasInitialized()) { + player.getDialogueInterpreter().sendDialogue("The Grand Exchange desk seems to be closed..."); + break; + } + player.getPlayerGrandExchange().open(); + break; + case "history": + player.getPlayerGrandExchange().openHistoryLog(player); + break; + case "collect": + if (!GrandExchangeDatabase.hasInitialized()) { + player.getDialogueInterpreter().sendDialogue("The Grand Exchange desk seems to be closed..."); + break; + } + player.getPlayerGrandExchange().openCollectionBox(); + break; + case "info-logs": + GEGuidePrice.open(player, GuideType.LOGS); + break; + case "info-ores": + GEGuidePrice.open(player, GuideType.ORES); + break; + case "info-herbs": + GEGuidePrice.open(player, GuideType.HERBS); + break; + case "info-runes": + GEGuidePrice.open(player, GuideType.RUNES); + break; + case "info-combat": + GEGuidePrice.open(player, GuideType.WEAPONS_AND_ARMOUR); + break; + case "sets": + player.getPlayerGrandExchange().openItemSets(); + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof NPC) { + switch (n.getDirection()) { + case EAST: + return n.getLocation().transform(-1, 0, 0); + case NORTH: + return n.getLocation().transform(0, 1, 0); + case SOUTH: + return n.getLocation().transform(0, -1, 0); + case WEST: + return n.getLocation().transform(1, 0, 0); + default: + break; + } + } + return node.getLocation().getDistance(n.getLocation()) < 2 ? node.getLocation() : null; + } + + /** + * Represents a g.e npc option handler. + * @author 'Vexia + * @version 1.0 + */ + public final class GENPCPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(6528).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(6529).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(6535).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(6533).getHandlers().put("option:talk-to", this); + NPCDefinition.forId(6535).getHandlers().put("option:bank", this); + NPCDefinition.forId(6533).getHandlers().put("option:collect", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "talk-to": + final NPC npc = (NPC) node; + return player.getDialogueInterpreter().open(npc.getId(), npc); + case "bank": + player.getBank().open(); + break; + case "collect": + player.getPlayerGrandExchange().openCollectionBox(); + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (node instanceof Player) { + Player player = (Player) node; + if (player.getZoneMonitor().isInZone("Donator Zone")) { + return null; + } + } + switch (n.getDirection()) { + case EAST: + return n.getLocation().transform(1, 0, 0); + case NORTH: + return n.getLocation().transform(0, 1, 0); + case SOUTH: + return n.getLocation().transform(0, -1, 0); + case WEST: + return n.getLocation().transform(-1, 0, 0); + default: + break; + } + return null; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/GrandExchangeShortcut.java b/Server/src/main/java/Server/core/game/interaction/object/GrandExchangeShortcut.java new file mode 100644 index 000000000..20c39e28a --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/GrandExchangeShortcut.java @@ -0,0 +1,110 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the grand exchange shortcut. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class GrandExchangeShortcut extends OptionHandler { + + /** + * The climbing down animation. + */ + private static final Animation CLIMB_DOWN = Animation.create(2589); + + /** + * The crawling through animation. + */ + private static final Animation CRAWL_THROUGH = Animation.create(2590); + + /** + * The climbing up animation. + */ + private static final Animation CLIMB_UP = Animation.create(2591); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(9311).getHandlers().put("option:climb-into", this); + ObjectDefinition.forId(9312).getHandlers().put("option:climb-into", this); + return null; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (player.getSkills().getLevel(Skills.AGILITY) < 21) { + player.getDialogueInterpreter().sendDialogue("You need an Agility level of at least 21 to do this."); + return true; + } + player.lock(4); + final GameObject o = (GameObject) node; + if (o.getId() == 9311) { + ForceMovement.run(player, Location.create(3138, 3516, 0), o.getLocation(), CLIMB_DOWN); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 2: + player.animate(CRAWL_THROUGH); + player.getProperties().setTeleportLocation(Location.create(3143, 3514, 0)); + break; + case 3: + ForceMovement.run(player, Location.create(3143, 3514, 0), Location.create(3144, 3514, 0), CLIMB_UP); + // Use the shortcut under the wall, north-west of the Grand

Exchange + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 8); + return true; + } + return false; + } + }); + } else { + ForceMovement.run(player, Location.create(3144, 3514, 0), o.getLocation(), CLIMB_DOWN); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 2: + player.animate(CRAWL_THROUGH); + player.getProperties().setTeleportLocation(Location.create(3139, 3516, 0)); + break; + case 3: + ForceMovement.run(player, Location.create(3139, 3516, 0), Location.create(3138, 3516, 0), CLIMB_UP); + // Use the shortcut under the wall, north-west of the Grand

Exchange + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 8); + return true; + } + return false; + } + }); + } + return true; + } + + @Override + public Location getDestination(Node n, Node node) { + if (((GameObject) node).getId() == 9311) { + return Location.create(3138, 3516, 0); + } + return Location.create(3144, 3514, 0); + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/GuidorDoorPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/GuidorDoorPlugin.java new file mode 100644 index 000000000..85eabde3b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/GuidorDoorPlugin.java @@ -0,0 +1,30 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the guidor door plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GuidorDoorPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(342, true, true); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2032).getHandlers().put("option:open", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/GutanothChestPlugin.kt b/Server/src/main/java/Server/core/game/interaction/object/GutanothChestPlugin.kt new file mode 100644 index 000000000..98aa4464b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/GutanothChestPlugin.kt @@ -0,0 +1,88 @@ +package core.game.interaction.`object` + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.`object`.ObjectBuilder +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import java.util.concurrent.TimeUnit + +@Initializable +class GutanothChestOptionHandler : OptionHandler(){ + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + val delay = player.getAttribute("gutanoth-chest-delay", 0L) + GameWorld.Pulser.submit(ChestPulse(player,System.currentTimeMillis() > delay, node as GameObject)) + return true + } + + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(2827).handlers["option:open"] = this + return this + } + + class ChestPulse(val player: Player, val isLoot: Boolean, val chest: GameObject): Pulse(){ + var ticks = 0 + override fun pulse(): Boolean { + when(ticks++){ + 0 -> { + player.lock() + player.animator.animate(Animation(536)) + ObjectBuilder.replace(chest, GameObject(2828,chest.location,chest.rotation), 5) + } + 2 -> {lootChest(player)} + 3 -> {player.unlock(); return true} + } + return false + } + + + fun lootChest(player: Player){ + if (isLoot) { + player.setAttribute("/save:gutanoth-chest-delay", System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(15)) + } else { + player.sendMessage("You open the chest and find nothing.") + return + } + val reward = Rewards.values().random() + player.sendChat(reward.message) + when(reward.type){ + Type.ITEM -> if(!player.inventory.add(Item(reward.id))) GroundItemManager.create(Item(reward.id),player.location) + Type.NPC -> { + val npc = NPC(reward.id) + npc.location = player.location + npc.isAggressive = true + npc.isRespawn = false + npc.properties.combatPulse.attack(player) + npc.init() + } + } + } + + enum class Rewards(val id: Int,val type: Type,val message: String){ + BONES(Items.BONES_2530, Type.ITEM, "Oh! Some bones. Delightful."), + EMERALD(Items.EMERALD_1605, Type.ITEM, "Ooh! A lovely emerald!"), + ROTTEN_APPLE(Items.ROTTEN_APPLE_1984, Type.ITEM, "Oh, joy, spoiled fruit! My favorite!"), + CHAOS_DWARF(119, Type.NPC, "You've gotta be kidding me, a dwarf?!"), + RAT(47, Type.NPC, "Eek!"), + SCORPION(1477, Type.NPC, "Zoinks!"), + SPIDER(1004, Type.NPC, "Awh, a cute lil spidey!") + } + + enum class Type { + ITEM, + NPC + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/object/HaystackPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/HaystackPlugin.java new file mode 100644 index 000000000..dc3834124 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/HaystackPlugin.java @@ -0,0 +1,66 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.FacialExpression; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the haystack plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HaystackPlugin extends OptionHandler { + + /** + * Represents the needle to give. + */ + private static final Item NEEDLE = new Item(1733); + + /** + * Represents the animation. + */ + private static final Animation ANIMATION = new Animation(827); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(298).getHandlers().put("option:search", this); + ObjectDefinition.forId(299).getHandlers().put("option:search", this); + ObjectDefinition.forId(300).getHandlers().put("option:search", this); + ObjectDefinition.forId(304).getHandlers().put("option:search", this); + ObjectDefinition.forId(36892).getHandlers().put("option:search", this); + ObjectDefinition.forId(36893).getHandlers().put("option:search", this); + ObjectDefinition.forId(36894).getHandlers().put("option:search", this); + ObjectDefinition.forId(36895).getHandlers().put("option:search", this); + ObjectDefinition.forId(36896).getHandlers().put("option:search", this); + ObjectDefinition.forId(36897).getHandlers().put("option:search", this); + ObjectDefinition.forId(36898).getHandlers().put("option:search", this); + ObjectDefinition.forId(36899).getHandlers().put("option:search", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final GameObject object = ((GameObject) node); + final int rand = RandomFunction.random(50); + player.lock(2); + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You search the " + object.getName().toLowerCase() + "..."); + if (rand == 1 && player.getInventory().freeSlots() > 0 || player.getInventory().containsItem(NEEDLE)) { + player.getInventory().add(NEEDLE); + player.getDialogueInterpreter().sendDialogues(player, FacialExpression.HALF_GUILTY, "Wow! A needle!", "Now what are the chances of finding that?"); + return true; + } + player.getPacketDispatch().sendMessage("You find nothing of interest."); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/JangerBerryPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/JangerBerryPlugin.java new file mode 100644 index 000000000..3edcc740d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/JangerBerryPlugin.java @@ -0,0 +1,63 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the janger berry plugin. + * @author Vexia + */ +@Initializable +public class JangerBerryPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + UseWithHandler.addHandler(2326, UseWithHandler.OBJECT_TYPE, new UseWithHandler(954) { + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + GameObject object = event.getUsedWith().asObject(); + if (object.isActive()) + ObjectBuilder.replace(object, object.transform(2325)); + event.getPlayer().getInventory().remove(event.getUsedItem()); + return true; + } + + }); + ObjectDefinition.forId(2325).getHandlers().put("option:swing-on", this); + ObjectDefinition.forId(2324).getHandlers().put("option:swing-on", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getLocation().withinDistance(node.getLocation(), 2)) { + player.sendMessage("I can't reach that."); + return true; + } + Location end = node.getId() == 2325 ? new Location(2505, 3087, 0) : new Location(2511, 3096, 0); + player.getPacketDispatch().sendObjectAnimation(node.asObject(), Animation.create(497), true); + AgilityHandler.forceWalk(player, 0, player.getLocation(), end, Animation.create(751), 50, 22, "You skillfully swing across.", 1); + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + return n.getId() == 2324 ? new Location(2511, 3092, 0) : new Location(2501, 3087, 0); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/JungleBushHandler.kt b/Server/src/main/java/Server/core/game/interaction/object/JungleBushHandler.kt new file mode 100644 index 000000000..27cc55e50 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/JungleBushHandler.kt @@ -0,0 +1,64 @@ +package core.game.interaction.`object` + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.`object`.ObjectBuilder +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +/** + * Handles the chopping down of dense jungle, mainly to grant access to the Kharazi Jungle. + * @author Ceikry + */ +@Initializable +class JungleBushHandler : OptionHandler(){ + val chopped_bush = 2895 + val chop_a = Animation(910) + val chop_b = Animation(2382) + + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(2892).handlers["option:chop-down"] = this + ObjectDefinition.forId(2893).handlers["option:chop-down"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + val toChop = node.asObject() + if(checkRequirement(player)){ + GameWorld.Pulser.submit(object : Pulse(0){ + var ticks = 0 + override fun pulse(): Boolean { + when(ticks++){ + 0 -> player.animator.animate(chop_a).also { player.lock() } + 1 -> player.animator.animate(chop_b) + 2 -> ObjectBuilder.replace(toChop, GameObject(chopped_bush, toChop.location, toChop.rotation),20) + 3 -> {player.walkingQueue.reset(); player.walkingQueue.addPath(toChop.location.x, toChop.location.y,true)} + 4 -> player.unlock().also { return true } + } + return false + } + }) + } else { + player.sendMessage("You need a machete to get through this dense jungle.") + } + return true + } + + fun checkRequirement(player: Player): Boolean{ + val machete = Item(Items.MACHETE_975) + val jade_machete = Item(Items.JADE_MACHETE_6315) + val opal_machete = Item(Items.OPAL_MACHETE_6313) + val red_topaz_machete = Item(Items.RED_TOPAZ_MACHETE_6317) + return player.inventory.containsItem(machete) || player.inventory.containsItem(jade_machete) || player.inventory.containsItem(opal_machete) || player.inventory.containsItem(red_topaz_machete) + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/KalphiteEntranceHandler.java b/Server/src/main/java/Server/core/game/interaction/object/KalphiteEntranceHandler.java new file mode 100644 index 000000000..520b0645c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/KalphiteEntranceHandler.java @@ -0,0 +1,85 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Kalphite hive entrance. + * @author Emperor + */ +@Initializable +public final class KalphiteEntranceHandler extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + UseWithHandler handler = new UseWithHandler(954) { + @Override + public boolean handle(NodeUsageEvent event) { + GameObject object = (GameObject) event.getUsedWith(); + if (object.getId() == 3827 || object.getId() == 23609) { + if (event.getPlayer().getInventory().remove(event.getUsedItem())) { + ObjectBuilder.replace(object, object.transform(object.getId() + 1), 500); + return true; + } + } + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + }; + UseWithHandler.addHandler(3827, UseWithHandler.OBJECT_TYPE, handler); + UseWithHandler.addHandler(23609, UseWithHandler.OBJECT_TYPE, handler); + ObjectDefinition.forId(3828).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(3829).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(23610).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(3832).getHandlers().put("option:climb-up", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + GameObject object = (GameObject) node; + Location destination = null; + switch (object.getId()) { + case 3828: + destination = Location.create(3483, 9509, 2); + break; + case 3829: + destination = Location.create(3229, 3109, 0); + break; + case 23610: + destination = Location.create(3508, 9493, 0); + break; + case 3832: + destination = Location.create(3509, 9496, 2); + break; + } + final Location dest = destination; + player.lock(2); + player.animate(Animation.create(828)); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.getProperties().setTeleportLocation(dest); + return true; + } + }); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/KhardianInteractionPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/KhardianInteractionPlugin.java new file mode 100644 index 000000000..213e0eea3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/KhardianInteractionPlugin.java @@ -0,0 +1,103 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the khardian node interaction plugin. + * @author 'Vexia + * @date 06/11/2013 + */ +@Initializable +public final class KhardianInteractionPlugin extends OptionHandler { + + /** + * Represents the hydrateable waterskin items. + */ + private static final Item[] WATER_SKINS = new Item[] { new Item(1825), new Item(1827), new Item(1829), new Item(1831) }; + + /** + * Represents the animation of cutting a cactus. + */ + private static final Animation ANIMATION = new Animation(911); + + /** + * Represents the dry cactus object id. + */ + private static final int DRY_CACTUS = 2671; + + /** + * Represents the item used to cut a cactus. + */ + private static final Item KNIFE = new Item(946); + + /** + * Represents the delay a cactus spawns at. + */ + private static final int SPAWN_DELAY = 45; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2670).getHandlers().put("option:cut", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "cut": + if (!player.getInventory().containsItem(KNIFE)) { + player.getPacketDispatch().sendMessage("You need a knife to cut this Cactus..."); + return true; + } + boolean failed = false; + if (RandomFunction.random(3) == 1) { + failed = true; + player.getPacketDispatch().sendMessage("You fail to cut the cactus correctly and it gives you no water this time."); + } + if (!failed) { + final Item remove = getWaterSkin(player); + if (remove != null && player.getInventory().remove(remove)) { + player.getInventory().add(new Item(remove.getId() - 2)); + player.getPacketDispatch().sendMessage("You top up your skin with water from the cactus."); + } else { + player.getPacketDispatch().sendMessage("You have no empty waterskins to put the water in."); + } + } + player.lock(3); + player.animate(ANIMATION); + if (!failed) { + player.getSkills().addExperience(Skills.WOODCUTTING, 10, true); + } + ObjectBuilder.replace(((GameObject) node), new GameObject(DRY_CACTUS, node.getLocation()), SPAWN_DELAY + RandomFunction.random(RegionManager.getLocalPlayers(player).size() / 2)); + break; + } + return true; + } + + /** + * Method used to get a waterskin Item. + * @param player the Player. + * @return the Item or Null. + */ + public final Item getWaterSkin(final Player player) { + for (Item item : WATER_SKINS) { + if (player.getInventory().containsItem(item)) { + return item; + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/LadderManagingPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/LadderManagingPlugin.java new file mode 100644 index 000000000..a7ecc5b05 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/LadderManagingPlugin.java @@ -0,0 +1,40 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for managing ladders. + * @author Emperor + * @version 2.0 + */ +@Initializable +public final class LadderManagingPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("climb-up", this); + ObjectDefinition.setOptionHandler("climb-down", this); + ObjectDefinition.setOptionHandler("climb", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, final String option) { + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + } + + @Override + public Location getDestination(Node n, Node object) { + return ClimbActionHandler.getDestination((GameObject) object); + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/LavaMazePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/LavaMazePlugin.java new file mode 100644 index 000000000..8bc50c7a6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/LavaMazePlugin.java @@ -0,0 +1,48 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the lava maze. + * @author Vexia + */ +@Initializable +public final class LavaMazePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(1767).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(1768).getHandlers().put("option:climb-up", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 1767: + if (node.getLocation().getX() == 3069) { + ClimbActionHandler.climb(player, null, Location.create(3017, 10248, 0)); + return true; + } + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + case 1768: + if (node.getLocation().getX() == 3017) { + ClimbActionHandler.climb(player, null, Location.create(3069, 3857, 0)); + return true; + } + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + return true; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/LookAtOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/LookAtOptionPlugin.java new file mode 100644 index 000000000..906a13fbf --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/LookAtOptionPlugin.java @@ -0,0 +1,27 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class LookAtOptionPlugin extends OptionHandler { + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 18877; i <= 18900; i++) + { + ObjectDefinition.forId(i).getHandlers().put("option:look at", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getPacketDispatch().sendMessage("The " + node.getName().toLowerCase() + " seem to be going south-west."); + return true; + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/LumberYardCratePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/LumberYardCratePlugin.java new file mode 100644 index 000000000..2e6d43709 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/LumberYardCratePlugin.java @@ -0,0 +1,84 @@ +package core.game.interaction.object; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the plugin used for handling a lumber yard crate. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumberYardCratePlugin extends OptionHandler { + + /** + * Represents the kittem item. + */ + private static final Item KITTEN = new Item(13236); + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + switch (option) { + case "squeeze-under": + Location dest = null; + Location start = node.getLocation(); + if (player.getLocation().getX() > node.getLocation().getX()) { + start = Location.create(3296, 3498, 0); + dest = Location.create(3295, 3498, 0); + } else { + dest = Location.create(3296, 3498, 0); + } + ForceMovement.run(player, start, dest, Animation.create(9221)); + break; + case "search": + if (quest.getStage(player) == 50 && !player.getInventory().containsItem(KITTEN) && !player.getBank().containsItem(KITTEN)) { + quest.setStage(player, 40); + } + if (node instanceof NPC) { + player.getPacketDispatch().sendMessage("You search the crate."); + player.getPacketDispatch().sendMessage("You find nothing."); + } + if (quest.getStage(player) == 40) { + if (player.getAttribute("findkitten", false) && player.getInventory().freeSlots() > 0) { + quest.setStage(player, 50); + player.getDialogueInterpreter().sendDialogue("You find a kitten! You carefully place it in your backpack."); + player.getInventory().add(KITTEN); + return true; + } + player.getPacketDispatch().sendMessage("You search the crate."); + player.getPacketDispatch().sendMessage("You find nothing."); + if (RandomFunction.random(0, 3) == 1) { + player.getPacketDispatch().sendMessage("You can hear kittens mewing close by..."); + player.setAttribute("findkitten", true); + } + } else { + player.getPacketDispatch().sendMessage("You search the crate."); + player.getPacketDispatch().sendMessage("You find nothing."); + } + break; + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(767).getHandlers().put("option:search", this); + ObjectDefinition.forId(2620).getHandlers().put("option:search", this); + ObjectDefinition.forId(31149).getHandlers().put("option:squeeze-under", this); + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/LumbridgeBasementPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/LumbridgeBasementPlugin.java new file mode 100644 index 000000000..3f80259b0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/LumbridgeBasementPlugin.java @@ -0,0 +1,324 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the lumbridge basement. + * @author Vexia + * + */ +@Initializable +public class LumbridgeBasementPlugin extends OptionHandler { + + /** + * The animation to use for the shortcut. + */ + private static final Animation ANIMATION = new Animation(2240); + + /** + * The jumping animation for stepping stones. + */ + private static final Animation JUMP_ANIMATION = new Animation(741); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(6899).getHandlers().put("option:squeeze-through", this); + ObjectDefinition.forId(6898).getHandlers().put("option:squeeze-through", this); + ObjectDefinition.forId(6905).getHandlers().put("option:squeeze-through", this); + ObjectDefinition.forId(6912).getHandlers().put("option:squeeze-through", this); + ObjectDefinition.forId(5949).getHandlers().put("option:jump-across", this); + ObjectDefinition.forId(6658).getHandlers().put("option:enter", this); + ObjectDefinition.forId(32944).getHandlers().put("option:enter", this); + ObjectDefinition.forId(40261).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(40262).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(40849).getHandlers().put("option:jump-down", this); + ObjectDefinition.forId(40260).getHandlers().put("option:climb-through", this); + ObjectDefinition.forId(41077).getHandlers().put("option:crawl-through", this); + PluginManager.definePlugins(new LightCreatureNPC(), new LightCreatureHandler(), new FishMongerDialogue()); + ObjectBuilder.add(new GameObject(40260, Location.create(2526, 5828, 2), 2)); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + switch (option) { + case "squeeze-through": + Direction dir = null; + Location to = null; + switch (node.getId()) { + case 6912: + to = node.getLocation().getY() == 9603 ? Location.create(3224, 9601, 0) : Location.create(3224, 9603, 0); + dir = node.getLocation().getY() == 9603 ? Direction.SOUTH : Direction.NORTH; + break; + default: + to = player.getLocation().getX() >= 3221 ? Location.create(3219, 9618, 0) : Location.create(3222, 9618, 0); + dir = player.getLocation().getX() >= 3221 ? Direction.WEST : Direction.EAST; + break; + } + player.sendMessage("You squeeze through the hole."); + ForceMovement.run(player, player.getLocation(), to, ANIMATION, ANIMATION, dir, 20).setEndAnimation(Animation.RESET); + return true; + case "jump-across": + Location f = null; + Location s = null; + switch (node.getId()) { + case 5949: + f = Location.create(3221, 9554, 0); + s = player.getLocation().getY() >= 9556 ? Location.create(3221, 9552, 0) : Location.create(3221, 9556, 0); + break; + } + final Location first = f; + final Location second = s; + player.lock(); + GameWorld.getPulser().submit(new Pulse(2, player) { + int counter = 1; + + @Override + public boolean pulse() { + if (counter == 3) { + player.unlock(); + ForceMovement.run(player, player.getLocation(), second, JUMP_ANIMATION, 20); + player.sendMessage("You leap across with a mighty leap!"); + return true; + } else if (counter == 1){ + ForceMovement.run(player, player.getLocation(), first, JUMP_ANIMATION, 20); + } + counter++; + return false; + } + }); + break; + case "enter": + switch (node.getId()) { + case 32944: + //Location.create(3353,3951,0) + player.teleport(Location.create(3219, 9532, 2)); + break; + case 6658: + //Location.create(3226, 9542, 0) + player.teleport(Location.create(3353, 3950, 0)); + break; + } + break; + case "climb-up": + switch (node.getId()) { + case 40261: + player.teleport(player.getLocation().transform(0, -1, 1)); + break; + case 40262: + player.teleport(player.getLocation().transform(0, -1, 1)); + break; + } + break; + case "jump-down": + switch (node.getId()) { + case 40849: + player.teleport(player.getLocation().transform(0, 1, -1)); + break; + } + break; + case "climb-through": + switch (node.getId()) { + case 40260: + player.teleport(Location.create(2525, 5810, 0)); + break; + } + break; + case "crawl-through": + switch (node.getId()) { + case 41077: + player.teleport(Location.create(2527, 5830, 2)); + break; + } + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + if (n.getId() == 5949) { + return node.getLocation().getY() >= 9555 ? Location.create(3221, 9556, 0) : Location.create(3221, 9552, 0); + } else if (n.getId() == 40262) { + return n.getLocation().transform(0, 1, 0); + } else if (n.getId() == 40261) { + return n.getLocation().transform(0, 1, 0); + } + } + return null; + } + + /** + * Handles the sapphire lantern on a light creature. + * @author Vexia + * + */ + public class LightCreatureHandler extends UseWithHandler { + + /** + * Constructs the {@code LightCreatureHandler} + */ + public LightCreatureHandler() { + super( 4700, 4701, 4702); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2021, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.lock(2); + player.teleport(Location.create(2538, 5881, 0)); + return true; + } + + @Override + public Location getDestination(Player player, Node with) { + if (player.getLocation().withinDistance(with.getLocation())) { + return player.getLocation(); + } + return null; + } + + } + + + /** + * Handles the light creature npc. + * @author Vexia + * + */ + public class LightCreatureNPC extends AbstractNPC { + + /** + * Constructs the {@code LightCreatureNPC} + */ + public LightCreatureNPC() { + super(0, null); + this.setWalks(true); + this.setWalkRadius(10); + } + + /** + * Constructs the {@code LightCreatureNPC} + */ + public LightCreatureNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new LightCreatureNPC(id, location); + } + + @Override + public void handleTickActions() { + if (!getLocks().isMovementLocked()) { + if (isWalks() && !getPulseManager().hasPulseRunning() && nextWalk < GameWorld.getTicks()) { + setNextWalk(); + Location l = getLocation().transform(-5 + RandomFunction.random(getWalkRadius()), -5 + RandomFunction.random(getWalkRadius()), 0); + if (canMove(l)) { + Pathfinder.find(this, l, true, Pathfinder.PROJECTILE).walk(this); + } + } + } + } + + @Override + public int[] getIds() { + return new int[] {2021}; + } + + } + + /** + * Handles the fish monger dialogue. + * @author Vexia + * + */ + public class FishMongerDialogue extends DialoguePlugin { + + /** + * Constructs the {@code FishMongerDialogue} + */ + public FishMongerDialogue() { + /* + * empty. + */ + } + + /** + * Constructs the {@code FishMongerDialogue} + */ + public FishMongerDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FishMongerDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hello, " + player.getUsername() + " would you like to look at", "my wares?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes, please.", "No, thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] {1369}; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/LumbridgeSwampHolePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/LumbridgeSwampHolePlugin.java new file mode 100644 index 000000000..4daa75c65 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/LumbridgeSwampHolePlugin.java @@ -0,0 +1,73 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the swamp hole. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumbridgeSwampHolePlugin extends OptionHandler { + + /** + * Represents the top location. + */ + private static final Location TOP = Location.create(3169, 3173, 0); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(10375).getHandlers().put("option:take", this); + ObjectDefinition.forId(5947).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(5946).getHandlers().put("option:climb", this); + ObjectDefinition.forId(15566).getHandlers().put("option:read", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "climb-down": + if (!player.getSavedData().getGlobalData().hasTiedLumbridgeRope()) { + player.getDialogueInterpreter().open(70099, "There is a sheer drop below the hole. You will need a rope."); + return true; + } else { + ClimbActionHandler.climb(player, new Animation(827), Location.create(3168, 9572, 0)); + } + case "climb": + player.getProperties().setTeleportLocation(TOP); + break; + case "take": + if (player.getInventory().freeSlots() < 2) { + player.getPacketDispatch().sendMessage("You do not have enough inventory space."); + return true; + } + if (player.getInventory().add(new Item(5341), new Item(952))) { + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(10373), 300); + } + break; + case "read": + player.getPacketDispatch().sendString("~-~-~ WARNING ~-~-~", 220, 5); + player.getPacketDispatch().sendString("Noxious gases vent into this cave.", 220, 7); + player.getPacketDispatch().sendString("Naked flames may cause an explosion!", 220, 8); + player.getPacketDispatch().sendString("Beware of vicious head-grabbing beasts!", 220, 10); + player.getPacketDispatch().sendString("Contact a Slayer master for protective headgear.", 220, 11); + player.getInterfaceManager().open(new Component(220)); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/ModeratorObject.java b/Server/src/main/java/Server/core/game/interaction/object/ModeratorObject.java new file mode 100644 index 000000000..aebada595 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/ModeratorObject.java @@ -0,0 +1,45 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the moderator objects in the p-mod room. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ModeratorObject extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(26806).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(26807).getHandlers().put("option:j-mod options", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "climb-up": + ClimbActionHandler.climb(player, new Animation(828), Location.create(3222, 3218, 0)); + break; + case "j-mod options": + if (player.getDetails().getRights() == Rights.REGULAR_PLAYER) { + return true; + } + player.sendMessage("Disabled..."); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/MossGiantRopePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/MossGiantRopePlugin.java new file mode 100644 index 000000000..3b4fba0cf --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/MossGiantRopePlugin.java @@ -0,0 +1,50 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the rope swing to the moss giants. + * @author Vexia + */ +@Initializable +public class MossGiantRopePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2322).getHandlers().put("option:swing-on", this); + ObjectDefinition.forId(2323).getHandlers().put("option:swing-on", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getLocation().withinDistance(node.getLocation(), 4)) { + player.sendMessage("I can't reach that."); + return true; + } + if (player.getSkills().getStaticLevel(Skills.AGILITY) < 10) { + player.getDialogueInterpreter().sendDialogue("You need an Agility level of at least 10 in order to do that."); + return true; + } + Location end = node.getId() == 2322 ? Location.create(2704, 3209, 0) : Location.create(2709, 3205, 0); + player.getPacketDispatch().sendObjectAnimation(node.asObject(), Animation.create(497), true); + AgilityHandler.forceWalk(player, 0, player.getLocation(), end, Animation.create(751), 50, 22, "You skillfully swing across.", 1); + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 0, 1); + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + return n.getId() == 2322 ? Location.create(2709, 3209, 0) : Location.create(2705, 3205, 0); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/MoyrtniaSwampPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/MoyrtniaSwampPlugin.java new file mode 100644 index 000000000..57c44d984 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/MoyrtniaSwampPlugin.java @@ -0,0 +1,30 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the mortynia swamp plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MoyrtniaSwampPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(3506).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().sendDialogue("There's a message attached to this gate, it reads:~", "~ Mort Myre is a dangerous Ghast infested swamp. ~", "~ Do not enter if you value your life. ~", "~ All persons wishing to enter must see Drezel. ~"); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/MuddyChestHandler.kt b/Server/src/main/java/Server/core/game/interaction/object/MuddyChestHandler.kt new file mode 100644 index 000000000..0a3abfcf2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/MuddyChestHandler.kt @@ -0,0 +1,54 @@ +package core.game.interaction.`object` + +import core.cache.def.impl.ObjectDefinition +import core.tools.Items +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.`object`.ObjectBuilder +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +/** + * Handles the muddy chest + * @author Ceikry + */ +class MuddyChestHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(170).handlers["option:open"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + val key = Item(Items.MUDDY_KEY_991) + if(player.inventory.containsItem(key)){ + player.inventory.remove(key) + player.animator.animate(Animation(536)) + ObjectBuilder.replace(node.asObject(),GameObject(171, node.location, node.asObject().rotation),3) + for(item in chestLoot){ + if(!player.inventory.add(item)) GroundItemManager.create(item,player) + } + } else { + player.sendMessage("This chest is locked and needs some sort of key.") + } + return true + } + + val chestLoot = arrayListOf( + Item(Items.UNCUT_RUBY_1619), + Item(Items.MITHRIL_BAR_2359), + Item(Items.MITHRIL_DAGGER_1209), + Item(Items.ANCHOVY_PIZZA_2297), + Item(Items.LAW_RUNE_563,2), + Item(Items.DEATH_RUNE_560,2), + Item(Items.CHAOS_RUNE_562,10), + Item(995,50) + ) +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/object/MuseumGatePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/MuseumGatePlugin.java new file mode 100644 index 000000000..93f356e41 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/MuseumGatePlugin.java @@ -0,0 +1,36 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the museum gate plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MuseumGatePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(24536).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getLocation().getY() >= 3447) { + player.getDialogueInterpreter().open(5941); + } else { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + return true; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/PortsObjectPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/PortsObjectPlugin.java new file mode 100644 index 000000000..eb1668b9c --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/PortsObjectPlugin.java @@ -0,0 +1,330 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the option handler for port sarim. + * @author 'Vexia + * @date 27/11/2013 + */ +@Initializable +public class PortsObjectPlugin extends OptionHandler { + + /** + * Represents the locations of crossing a gang plank at port sarim. + */ + private final Location PORT_SARIM[] = new Location[] {/* + * port sarim - entrana + * boat + */ + new Location(3048, 3231, 1), Location.create(3048, 3234, 0), new Location(3038, 3192, 0), new Location(3038, 3189, 1), new Location(3032, 3217, 1), new Location(3029, 3217, 0), new Location(3041, 3199, 1), new Location(3041, 3202, 0) }; + + /** + * Represents the entrana locations. + */ + private final Location ENTRANA[] = new Location[] { /* entrana boat */ + new Location(2834, 3331, 1), new Location(2834, 3335, 0) }; + + /** + * Represents the karamja locations. + */ + private final Location KARAMJA[] = new Location[] { new Location(2956, 3143, 1), new Location(2956, 3146, 0), new Location(2957, 3158, 1), new Location(2954, 3158, 0) }; + + /** + * Represents the catherby locations. + */ + private final Location CATHERBY[] = new Location[] { new Location(2792, 3417, 1), new Location(2792, 3414, 0) }; + + /** + * Represents the location teleport to in brimhaven. + */ + private final Location BRIMHAVEN[] = new Location[] { new Location(2763, 3238, 1), Location.create(2760, 3238, 0), new Location(2775, 3234, 1), new Location(2772, 3234, 0) }; + + /** + * Represents the ardougne location. + */ + private final Location ARDOUGNE[] = new Location[] { new Location(2683, 3268, 1), new Location(2683, 3271, 0) }; + + /** + * Represents the port khazard location. + */ + private final Location PORT_KHAZARD[] = new Location[] { new Location(2674, 3141, 1), new Location(2674, 3144, 0) }; + + /** + * represents the port phastmatys locations. + */ + private final Location PORT_PHASMATYS[] = new Location[] { new Location(3705, 3503, 1), new Location(3702, 3503, 0) }; + + /** + * Represents the pest control location. + */ + private final Location PEST_CONTROL[] = new Location[] { new Location(2662, 2676, 1), new Location(2659, 2676, 0) }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2412).getHandlers().put("option:cross", this);// port + // sarim + // - + // entrana + // boat. + ObjectDefinition.forId(2413).getHandlers().put("option:cross", this);// port + // sarim + // - + // entrana + // boat. + ObjectDefinition.forId(17404).getHandlers().put("option:cross", this);// port + // sarim + // - + // charter + // boat. + ObjectDefinition.forId(17405).getHandlers().put("option:cross", this);// port + // sarim + // - + // charter + // boat. + ObjectDefinition.forId(2083).getHandlers().put("option:cross", this);// port + // sarim + // - + // regular + // boat. + ObjectDefinition.forId(2084).getHandlers().put("option:cross", this);// port + // sarim + // - + // regular + // boat. + ObjectDefinition.forId(14304).getHandlers().put("option:cross", this);// port + // sarim + // - + // regular + // boat. + ObjectDefinition.forId(14305).getHandlers().put("option:cross", this);// port + // sarim + // - + // regular + // boat. + ObjectDefinition.forId(2593).getHandlers().put("option:cross", this);// port + // sarim + // - + // lady + // lumbridge. + ObjectDefinition.forId(2415).getHandlers().put("option:cross", this);// entrana + // off + // boat. + ObjectDefinition.forId(2414).getHandlers().put("option:cross", this);// entrana + // on + // boat. + ObjectDefinition.forId(2081).getHandlers().put("option:cross", this);// karamaja + // boat + // (on) + ObjectDefinition.forId(2082).getHandlers().put("option:cross", this);// karamaja + // boat + // (off) + ObjectDefinition.forId(17398).getHandlers().put("option:cross", this);// karamaja + // boat + // (on)(second) + ObjectDefinition.forId(17399).getHandlers().put("option:cross", this);// karamaja + // boat + // (off)(second) + ObjectDefinition.forId(17394).getHandlers().put("option:cross", this);// catherby + // boat + // (on) + ObjectDefinition.forId(17395).getHandlers().put("option:cross", this);// catherby + // boat + // (off) + ObjectDefinition.forId(69).getHandlers().put("option:cross", this);// catherby + // boat + // (on)(second) + ObjectDefinition.forId(17401).getHandlers().put("option:cross", this);// brimhaven + // (off) + ObjectDefinition.forId(17400).getHandlers().put("option:cross", this);// brimhaven + // (on) + ObjectDefinition.forId(2087).getHandlers().put("option:cross", this);// brimhaven + // (on)(second) + ObjectDefinition.forId(2088).getHandlers().put("option:cross", this);// brimhaven + // (off)(second) + ObjectDefinition.forId(2086).getHandlers().put("option:cross", this);// ardougne + // (off) + ObjectDefinition.forId(2085).getHandlers().put("option:cross", this);// ardougne + // (on) + ObjectDefinition.forId(17402).getHandlers().put("option:cross", this);// port + // khazard + // (on) + ObjectDefinition.forId(17403).getHandlers().put("option:cross", this);// port + // khazard + // (off) + ObjectDefinition.forId(17392).getHandlers().put("option:cross", this);// port + // phasmatys(on) + ObjectDefinition.forId(17393).getHandlers().put("option:cross", this);// port + // phasmatys(off) + ObjectDefinition.forId(11209).getHandlers().put("option:cross", this);// port + // phasmatys(other + // boat) + ObjectDefinition.forId(14307).getHandlers().put("option:cross", this);// pest + // control + // ship. + ObjectDefinition.forId(14306).getHandlers().put("option:cross", this);// pest + // control + // ship. + // lady lumby + ObjectDefinition.forId(2590).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(2592).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(2594).getHandlers().put("option:cross", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final int id = ((GameObject) node).getId(); + switch (option) { + case "climb-up": + ClimbActionHandler.climb(player, new Animation(828), new Location(3048, 3208, 1)); + break; + case "climb-down": + ClimbActionHandler.climb(player, new Animation(828), new Location(3048, 9640, 1)); + break; + case "cross": + switch (id) { + case 2594: + cross(player, Location.create(3047, 3204, 0)); + break; + case 14306: + cross(player, PEST_CONTROL[0]); + player.getPacketDispatch().sendMessage("You board the ship."); + break; + case 14307: + cross(player, PEST_CONTROL[1]); + player.getPacketDispatch().sendMessage("You disembark the ship."); + break; + case 2593: + if (player.getQuestRepository().getQuest("Dragon Slayer").getStage(player) == 100) { + player.getDialogueInterpreter().open(744, Repository.findNPC(744), true);// lady + // lumbridge. + return true; + } + if (!player.getSavedData().getQuestData().getDragonSlayerAttribute("ship")) { + player.getDialogueInterpreter().open(744, Repository.findNPC(744), true);// lady + // lumbridge. + } else { + player.getPacketDispatch().sendMessage("You board the ship."); + cross(player, new Location(3047, 3207, 1)); + } + break; + case 14304: + cross(player, PORT_SARIM[6]); + player.getPacketDispatch().sendMessage("You board the ship."); + break; + case 14305: + cross(player, PORT_SARIM[7]); + player.getPacketDispatch().sendMessage("You disembark the ship."); + break; + case 2083: + cross(player, PORT_SARIM[4]);// port - sarim random + // boat. + break; + case 2084: + cross(player, PORT_SARIM[5]);// port - sarim random + // boat. + break; + case 17404: + cross(player, PORT_SARIM[3]);// port sarim charter boat. + break; + case 17405: + cross(player, PORT_SARIM[2]);// port sarim charter boat. + break; + case 11209: + player.getDialogueInterpreter().sendDialogues(player, null, "I don't think that whoever owns this ship will be happy", "with me wandering all over it."); + break; + case 17392: + cross(player, PORT_PHASMATYS[0]);// port phasmatys on. + break; + case 17393: + cross(player, PORT_PHASMATYS[1]);// port phasmatys off. + break; + case 17402: + cross(player, PORT_KHAZARD[0]);// port khazard on. + break; + case 17403: + cross(player, PORT_KHAZARD[1]);// port khazard off. + break; + case 2086: + cross(player, ARDOUGNE[1]);// ardougne off + break; + case 2085: + cross(player, ARDOUGNE[0]);// ardougne on. + player.getPacketDispatch().sendMessage("You must speak to Captain Barnaby before it will set sail."); + break; + case 2087: + cross(player, BRIMHAVEN[2]);// brimhaven second ship(pay + // fare) + player.getPacketDispatch().sendMessage("You must speak to the Customs Officer before it will set sail."); + break; + case 2088: + cross(player, BRIMHAVEN[3]);// brimhaven second ship(pay + // fare) + break; + case 17401: + cross(player, BRIMHAVEN[1]);// entrana on boat. + break; + case 17400: + cross(player, BRIMHAVEN[0]);// entrana off boat. + break; + case 69:// arhein ship. + player.getDialogueInterpreter().open(563, Repository.findNPC(563), true); + break; + case 17394: + cross(player, CATHERBY[0]);// catherby on + break; + case 17395: + cross(player, CATHERBY[1]);// catherby off + break; + case 2412:// port-sarim to entrana(on boat) + cross(player, PORT_SARIM[0]); + break; + case 2413:// port-sarim to entrana(off boat) + cross(player, PORT_SARIM[1]); + break; + case 2414:// entrana on boat. + cross(player, ENTRANA[0]); + break; + case 2415:// entrana off boat. + cross(player, ENTRANA[1]); + break; + case 2081: + cross(player, KARAMJA[0]); + break; + case 2082: + cross(player, KARAMJA[1]); + break; + case 17398: + cross(player, KARAMJA[2]); + player.getPacketDispatch().sendMessage("You must speak to the Customs Officer before it will set sail."); + break; + case 17399: + cross(player, KARAMJA[3]); + player.getPacketDispatch().sendMessage("You must speak to the Customs Officer before it will set sail."); + break; + } + break; + } + return true; + } + + /** + * Method used to cross a gang plank. + * @param player the player. + * @param location + */ + public final void cross(final Player player, Location location) { + player.getProperties().setTeleportLocation(location); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/PriestInPerilOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/PriestInPerilOptionPlugin.java new file mode 100644 index 000000000..d0db4e8b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/PriestInPerilOptionPlugin.java @@ -0,0 +1,265 @@ +package core.game.interaction.object; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the quest node plugin handler. + * @author 'Vexia + */ +@Initializable +public class PriestInPerilOptionPlugin extends OptionHandler { + /** + * (non-Javadoc) + * @see Plugin#newInstance(Object) + */ + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(3444).getHandlers().put("option:open", this); + /** the gate in the chamber near the dog. */ + ObjectDefinition.forId(3445).getHandlers().put("option:open", this); + /** the gate in the temple to get to the other side. */ + ObjectDefinition.forId(30707).getHandlers().put("option:open", this); + /** the "knock-at" door. */ + ObjectDefinition.forId(30707).getHandlers().put("option:knock-at", this); + /** the "knock-at" door. */ + ObjectDefinition.forId(30708).getHandlers().put("option:open", this); + /** the "knock-at" door. */ + ObjectDefinition.forId(30708).getHandlers().put("option:knock-at", this); + /** the "knock-at" door. */ + ObjectDefinition.forId(30575).getHandlers().put("option:climb-up", this); + /** represents the ladder to climb back up. */ + ObjectDefinition.forId(30575).getHandlers().put("option:climb-up", this); + /** represents the ladder to climb back up. */ + ObjectDefinition.forId(30728).getHandlers().put("option:open", this); + /** the coffin. */ + ObjectDefinition.forId(3463).getHandlers().put("option:open", this); + /** the drezel door. */ + ObjectDefinition.forId(3463).getHandlers().put("option:talk-through", this); + /** talk-through. */ + ObjectDefinition.forId(3485).getHandlers().put("option:search", this); + /** teh well. */ + ObjectDefinition.forId(3496).getHandlers().put("option:study", this); + /** teh golden hammer */ + ObjectDefinition.forId(3496).getHandlers().put("option:take-from", this); + /** the golden hammer. */ + ObjectDefinition.forId(3498).getHandlers().put("option:study", this); + /** teh golden needle. */ + ObjectDefinition.forId(3498).getHandlers().put("option:take-from", this); + /** the golden needle. */ + ObjectDefinition.forId(3495).getHandlers().put("option:study", this); + /** teh golden pot. */ + ObjectDefinition.forId(3495).getHandlers().put("option:take-from", this); + /** the golden pot. */ + ObjectDefinition.forId(3497).getHandlers().put("option:study", this); + /** teh golden feather. */ + ObjectDefinition.forId(3497).getHandlers().put("option:take-from", this); + /** the golden feather. */ + ObjectDefinition.forId(3494).getHandlers().put("option:study", this); + /** teh golden candle. */ + ObjectDefinition.forId(3494).getHandlers().put("option:take-from", this); + /** the golden candle. */ + ObjectDefinition.forId(3499).getHandlers().put("option:study", this); + /** teh golden key/iron. */ + ObjectDefinition.forId(3499).getHandlers().put("option:take-from", this); + /** the golden key/iron */ + ObjectDefinition.forId(3493).getHandlers().put("option:study", this); + /** teh tinder box. */ + ObjectDefinition.forId(3493).getHandlers().put("option:take-from", this); + /** the golden tinder box. */ + ObjectDefinition.forId(3443).getHandlers().put("option:pass-through", this); + /** the barrier. */ + ObjectDefinition.forId(30573).getHandlers().put("option:open", this); + /** the door to get back. */ + NPCDefinition.forId(7711).getHandlers().put("option:attack", this); + /** represents the dog attack option. */ + ObjectDefinition.forId(30571).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Priest in Peril"); + int id = node instanceof GameObject ? ((GameObject) node).getId() : ((NPC) node).getId(); + switch (option) { + case "study": + player.getInterfaceManager().open(new Component(272)); + int item = 0; + String message = ""; + if (id == 3496) { + if (!player.getGameAttributes().getAttribute("priest_in_peril:hammer", false)) { + item = 2949; + } else { + item = 2347; + } + message = "Saradomin is the hammer that crushes evil everywhere."; + } + if (id == 3498) { + if (!player.getGameAttributes().getAttribute("priest_in_peril:needle", false)) { + item = 2951; + } else { + item = 1733; + } + message = "Saradomin is the needle that binds our lives together."; + } + if (id == 3495) { + if (!player.getGameAttributes().getAttribute("priest_in_peril:pot", false)) { + item = 2948; + } else { + item = 1931; + } + message = "Saradomin is the vessle that keeps our lives from harm."; + } + if (id == 3497) { + if (!player.getGameAttributes().getAttribute("priest_in_peril:feather", false)) { + item = 2950; + } else { + item = 314; + } + message = "Saradomin is the delicate touch that brushes us with love."; + } + if (id == 3494) { + if (!player.getGameAttributes().getAttribute("priest_in_peril:candle", false)) { + item = 2947; + } else { + item = 36; + } + message = "Saradomin is the light that shines throughout our lives."; + } + if (id == 3499) { + if (!player.getGameAttributes().getAttribute("priest_in_peril:key", false)) { + item = 2945; + } else { + item = 2944; + } + message = "Saradomin is the key that unlocks the mysteries of life."; + } + if (id == 3493) { + if (!player.getGameAttributes().getAttribute("priest_in_peril:tinderbox", false)) { + item = 2946; + } else { + item = 590; + } + message = "Saradomin is the spark that lights the fire in our hearts."; + } + player.getPacketDispatch().sendString(message, 272, 17); + player.getPacketDispatch().sendItemZoomOnInterface(item, 175, 272, 4); + break; + case "take-from": + player.getImpactHandler().handleImpact(player, 2, CombatStyle.MELEE); + player.getPacketDispatch().sendMessage("A holy power prevents you stealing from the monument!"); + break; + } + switch (id) { + case 3444: + /** the first gate we encounter. */ + if (quest.getStage(player) <= 13) { + player.getDialogueInterpreter().sendDialogues(player, null, "Hmmm... from the looks of things, it seems as though", "somebody has been trying to force this door open. It's", "still securely locked however."); + return true; + } + DoorActionHandler.handleDoor(player, (GameObject) node); + break; + case 30573: + player.getProperties().setTeleportLocation(Location.create(3440, 9887, 0)); + player.getPacketDispatch().sendMessage("You cilmb down through the trap door..."); + break; + case 3443: + /** the barrier. */ + if (!player.getQuestRepository().isComplete("Priest in Peril")) { + player.getPacketDispatch().sendMessage("A magic force prevents you from passing through."); + } else { + player.getProperties().setTeleportLocation(Location.create(3425, 3485, 0)); + player.getPacketDispatch().sendMessage("You pass through the holy barrier."); + } + break; + case 3485: + /** the well. */ + player.getDialogueInterpreter().sendDialogue("You look down the well and see the filthy polluted water of the river", "Salve moving slowly along."); + break; + case 3463: + /** the drezel door. */ + switch (option) { + case "open": + + if (quest.getStage(player) < 15) { + player.getPacketDispatch().sendMessage("The door is securely locked shut."); + } else { + DoorActionHandler.handleDoor(player, (GameObject) node); + } + break; + case "talk-through": + player.getDialogueInterpreter().open(1047, NPC.create(1047, player.getLocation())); + break; + } + break; + case 30728: + /** the coffin. */ + player.getDialogueInterpreter().sendDialogues(player, null, "It sounds like there's something alive inside it. I don't", "think it would be a very good idea to open it..."); + break; + case 3445:/* the other gate. */ + if (quest.getStage(player) < 17) { + player.getPacketDispatch().sendMessage("The door is locked shut."); + } else { + DoorActionHandler.handleDoor(player, (GameObject) node); + } + break; + case 30707:/** the door to the church. */ + case 30708: + switch (option) { + case "open": + if (quest.getStage(player) > 12) { + DoorActionHandler.handleDoor(player, (GameObject) node); + } else { + player.getPacketDispatch().sendMessage("This door is securely locked from inside."); + } + break; + case "knock-at": + if (quest.getStage(player) == 10 || quest.getStage(player) == 12 || quest.getStage(player) == 13) { + player.getDialogueInterpreter().open(54584, node); + } + break; + } + break; + case 30575: + /** represents the ladder to get back up. */ + player.getProperties().setTeleportLocation(Location.create(3405, 3506, 0)); + break; + case 7711: + /** the dog. */ + if (quest.getStage(player) == 10) { + player.getPacketDispatch().sendMessage("You have no reason to attack a helpess dog!"); + return true; + } + if (quest.getStage(player) > 10) { + player.getProperties().getCombatPulse().attack(node); + } + if (quest.getStage(player) == 12) { + player.getPacketDispatch().sendMessage("You've already killed that dog!"); + return true; + } + if (quest.getStage(player) >= 13) { + player.getProperties().getCombatPulse().stop(); + player.getPacketDispatch().sendMessage("I'd better not make the King mad at me again!"); + return true; + } + break; + case 30571: + player.getProperties().setTeleportLocation(Location.create(3405, 9906, 0)); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/ProspectOrePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/ProspectOrePlugin.java new file mode 100644 index 000000000..69cabd4cf --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/ProspectOrePlugin.java @@ -0,0 +1,82 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.gather.SkillingResource; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Plugin; + +/** + * Handles the prospecting of an ore. + * @author 'Vexia + */ +@Initializable +public class ProspectOrePlugin extends OptionHandler { + + @Override + public boolean handle(final Player player, Node node, String option) { + final GameObject object = (GameObject) node; + int tut_stage = TutorialSession.getExtension(player).getStage(); + if (tut_stage == 31 && object.getId() == 3043) { + GameWorld.getPulser().submit(new Pulse(1) { + int count = 0; + + @Override + public boolean pulse() { + if (count == 1) { + TutorialStage.load(player, 32, false); + } else if (count >= 2) { + TutorialStage.load(player, 33, false); + return true; + } + count++; + return false; + } + }); + } + if (tut_stage == 33 && object.getId() == 3042) { + GameWorld.getPulser().submit(new Pulse(1) { + int count = 0; + + @Override + public boolean pulse() { + if (count == 1) { + TutorialStage.load(player, 34, false); + return true; + } + count++; + return false; + } + }); + } + final SkillingResource rock = SkillingResource.forId(object.getId()); + if (rock == null) { + player.getPacketDispatch().sendMessage("There is no ore currently available in this rock."); + return true; + } + player.getPacketDispatch().sendMessage("You examine the rock for ores..."); + player.getPulseManager().run(new Pulse(3, player, object) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("This rock contains " + ItemDefinition.forId(rock.getReward()).getName().toLowerCase() + "."); + return true; + } + }); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("prospect", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/PyreSitePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/PyreSitePlugin.java new file mode 100644 index 000000000..16d202ab9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/PyreSitePlugin.java @@ -0,0 +1,420 @@ +package core.game.interaction.object; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.firemaking.Log; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.npc.drop.DropFrequency; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the pyre site plugin. + * @author Vexia + */ +@Initializable +public final class PyreSitePlugin extends OptionHandler { + + /** + * The chance reward items. + */ + private static final ChanceItem[] REWARDS = new ChanceItem[] { new ChanceItem(560, 8, 15, DropFrequency.COMMON), new ChanceItem(565, 4, 7, DropFrequency.COMMON), new ChanceItem(1601, 2, 2, DropFrequency.UNCOMMON), new ChanceItem(532, 10, 10, DropFrequency.RARE), new ChanceItem(100, 2, 2, DropFrequency.COMMON), new ChanceItem(9145, 5, 5, DropFrequency.COMMON), new ChanceItem(9144, 10, 10, DropFrequency.UNCOMMON), new ChanceItem(892, 10, 10, DropFrequency.COMMON), new ChanceItem(867, 20, 20, DropFrequency.UNCOMMON), new ChanceItem(816, 20, 20, DropFrequency.COMMON), new ChanceItem(9419, 1, 1, DropFrequency.COMMON) }; + + /** + * The chewed bones item. + */ + private static final Item CHEWED_BONES = new Item(11338); + + /** + * The mangled bones item. + */ + private static final Item MANGLED_BONES = new Item(11337); + + /** + * The dragon full helm item (1/250) chance. + */ + private static final Item DFH = new Item(11335); + + /** + * The list of used pyre ship locations. + */ + private static final List USED_LOCATIONS = new ArrayList<>(); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(25286).getHandlers().put("option:construct", this); + PluginManager.definePlugin(new FerociousBarbarianNPC()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + for (Location l : USED_LOCATIONS) { + if (l.withinDistance(node.getLocation(), 3)) { + player.sendMessage("This pyre site is in use currently."); + return true; + } + } + if (!player.getInventory().containsItem(CHEWED_BONES) && !player.getInventory().containsItem(MANGLED_BONES)) { + player.sendMessage("You need chewed bones or mangled bones in order to do this."); + return true; + } + if (!player.getInventory().contains(590, 1)) { + player.sendMessage("You need a tinderbox in order to do this."); + return true; + } + final SkillingTool tool = SkillingTool.getHatchet(player); + if (tool == null) { + player.sendMessage("You need an axe in order to do this."); + return true; + } + final LogType type = LogType.getType(player); + if (type == null) { + player.sendMessage("You don't have any logs."); + return true; + } + if (player.getAttribute("barb", null) != null && ((NPC) player.getAttribute("barb")).isActive()) { + player.sendMessage("You must defeat the barbarian spirit first."); + return true; + } + player.setAttribute("logType", type); + ritual(player, node.asObject()); + return true; + } + + /** + * Handles the pyre ritual. + * @param player the player. + * @param object the ship object. + */ + private void ritual(Player player, GameObject object) { + player.lock(); + USED_LOCATIONS.add(object.getLocation()); + player.faceLocation(object.getLocation()); + GameWorld.getPulser().submit(getPulse(player, object)); + } + + /** + * Gets the ritual pulse. + * @param player the player. + * @param object the object. + * @return the pulse. + */ + private Pulse getPulse(final Player player, final GameObject object) { + final LogType logType = player.getAttribute("logType", LogType.NORMAL); + final SkillingTool tool = SkillingTool.getHatchet(player); + final Item bones = player.getInventory().containsItem(CHEWED_BONES) ? player.getInventory().getItem(CHEWED_BONES) : player.getInventory().getItem(MANGLED_BONES); + return new Pulse(1, player) { + int count; + int objectId = 25288; + + @Override + public boolean pulse() { + if ((count % 6 == 0 || count == 0) && count <= 10 && objectId <= 25291) { + player.animate(getAnimation(tool)); + player.faceLocation(object.getLocation()); + } + if (count % 4 == 0) { + if (objectId == 25291) { + if (player.getInventory().remove(new Item(logType.getLog().getLogId()), bones)) { + player.getAnimator().reset(); + player.getSkills().addExperience(Skills.CRAFTING, logType.getExperiences()[0]); + player.getSkills().addExperience(Skills.FIREMAKING, logType.getExperiences()[1]); + if (bones.getId() == CHEWED_BONES.getId()) { + player.getInventory().add(getRandomItem(player), player); + player.sendMessages("The ancient barbarian is laid to rest. Your future prayer training is blessed,", "as his spirit ascends to a glorious afterlife. Spirits drop an object into your", "pack."); + } else { + final NPC barb = NPC.create(752, object.getLocation().transform(object.getDirection(), 1)); + ((FerociousBarbarianNPC) barb).target = player; + barb.init(); + barb.moveStep(); + player.setAttribute("barb", barb); + player.unlock(); + } + } + } + if (objectId == 25295) { + return true; + } + replace(objectId++, object, player); + } + count++; + return false; + } + + @Override + public void stop() { + super.stop(); + player.unlock(); + replace(25286, object, player); + USED_LOCATIONS.remove(object.getLocation()); + } + }; + } + + /** + * Replaces the pyre site with a new object. + * @param newId the new id. + * @param ship the ship. + */ + private void replace(int newId, GameObject ship, Player player) { + GameObject newShip = new GameObject(newId, getLocation(newId, ship), 10, ship.getLocation().getX() == 2503 ? 4 : 1); + ObjectBuilder.add(newShip); + } + + /** + * Gets the location of where the object should be. + * @param newId the new Id. + * @param ship the ship. + * @return the location. + */ + private Location getLocation(int newId, GameObject ship) { + Location location = ship.getLocation().transform(ship.getDirection(), -2); + if (ship.getLocation().getX() == 2507 || ship.getLocation().getX() == 2519) { + return location.transform(-1, 0, 0); + } else if (ship.getLocation().getX() == 2503) { + return location.transform(-2, -1, 0); + } + return location; + } + + /** + * Gets a random item. + * @param player the player. + * @return the random item. + */ + private Item getRandomItem(Player player) { + if (RandomFunction.random(2) == 1 && RandomFunction.random(250) == 10) { + Repository.sendNews(player.getUsername() + " has just received a Dragon Full Helm from the Pyre Ship."); + return DFH; + } + return RandomFunction.getChanceItem(REWARDS); + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + return n.getLocation().transform(n.getDirection(), 1); + } + return null; + } + + /** + * Gets the animation for the skilling tool. + * @param tool the tool. + * @return the animation. + */ + public Animation getAnimation(final SkillingTool tool) { + Animation animation = null; + switch (tool) { + case BRONZE_AXE: + animation = Animation.create(3291); + break; + case IRON_AXE: + animation = Animation.create(3290); + break; + case STEEL_AXE: + animation = Animation.create(3289); + break; + case BLACK_AXE: + animation = Animation.create(3288); + break; + case MITHRIL_AXE: + animation = Animation.create(3287); + break; + case ADAMANT_AXE: + animation = Animation.create(3286); + break; + case RUNE_AXE: + animation = Animation.create(3285); + break; + case DRAGON_AXE: + animation = Animation.create(3292); + break; + default: + break; + } + return animation; + } + + /** + * A log type for a pyre ship. + * @author Vexia + */ + public enum LogType { + NORMAL(Log.NORMAL, 11, new double[] { 10, 40 }, 1), ACHEY(Log.ACHEY, 11, new double[] { 10, 40 }, 1), OAK(Log.OAK, 25, new double[] { 15, 60 }, 2), WILLOW(Log.WILLOW, 40, new double[] { 22.5, 90 }, 2), TEAK(Log.TEAK, 45, new double[] { 26.2, 105 }, 3), ARCTIC_PINE(Log.ARCTIC_PINE, 52, new double[] { 31.2, 125 }, 3), MAPLE(Log.MAPLE, 55, new double[] { 33.7, 135 }, 3), MAHOGANY(Log.MAHOGANY, 60, new double[] { 39.3, 157.5 }, 3), YEW(Log.YEW, 70, new double[] { 50.6, 202.5 }, 4), MAGIC(Log.MAGIC, 85, new double[] { 75.9, 303.8 }, 5); + + /** + * The log. + */ + private final Log log; + + /** + * The level. + */ + private final int level; + + /** + * The experiences required. + */ + private final double[] experiences; + + /** + * The enhanced xp reward of bones. + */ + private final int enhancedExp; + + /** + * Constructs a new {@Code LogType} {@Code Object} + * @param log the log. + * @param level the level. + * @param experiences the experiences. + * @param enhancedExp the enhanced exp. + */ + private LogType(Log log, int level, double[] experiences, int enhancedExp) { + this.log = log; + this.level = level; + this.experiences = experiences; + this.enhancedExp = enhancedExp; + } + + /** + * Gets a log type. + * @param player the player. + * @return the type. + */ + public static LogType getType(Player player) { + for (LogType type : values()) { + if (player.getInventory().contains(type.getLog().getLogId(), 1)) { + return type; + } + } + return null; + } + + /** + * Gets the blog. + * @return the log + */ + public Log getLog() { + return log; + } + + /** + * Gets the blevel. + * @return the level + */ + public int getLevel() { + return level; + } + + /** + * Gets the bexperiences. + * @return the experiences + */ + public double[] getExperiences() { + return experiences; + } + + /** + * Gets the benhancedExp. + * @return the enhancedExp + */ + public int getEnhancedExp() { + return enhancedExp; + } + + } + + /** + * Handles the ferocious barbarian npc. + * @author Vexia + * + */ + public class FerociousBarbarianNPC extends AbstractNPC { + + /** + * The target npc. + */ + private Player target; + + /** + * Constructs a new {@Code FerociousBarbarianNPC} {@Code Object} + * @param id the npc id. + * @param location the location. + */ + public FerociousBarbarianNPC(int id, Location location) { + super(id, location); + this.setRespawn(false); + this.setAggressive(true); + } + + /** + * Constructs a new {@Code FerociousBarbarianNPC} {@Code Object} + */ + public FerociousBarbarianNPC() { + this(-1, null); + } + + @Override + public void handleTickActions() { + if (target == null) { + return; + } + if (!target.isActive() || !target.getLocation().withinDistance(getLocation())) { + clear(); + } + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(target); + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity instanceof Player && entity != target) { + ((Player) entity).getPacketDispatch().sendMessage("It's not after you."); + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player && killer == target) { + target.removeAttribute("barb"); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new FerociousBarbarianNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 752 }; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/ReadSignPostPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/ReadSignPostPlugin.java new file mode 100644 index 000000000..2c122c1a9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/ReadSignPostPlugin.java @@ -0,0 +1,121 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the reading of a sign post. + * @author 'Vexia + */ +@Initializable +public class ReadSignPostPlugin extends OptionHandler { + + /** + * Represents the areas on the sign. + * @author 'Vexia + */ + public enum Signs { + NEAR_LUMBRIDGE(18493, "North to farms and
Varrock.", "The River Lum lies to
the south.", "West to
Lumbridge.", "East to Al
Kharid - toll
gate; bring some
money."), NEAR_VARROCK(24263, "Sheep lay this way.", "South through farms
to Al Kharid and
Lumbridge", "West to Champion's Guild
and Varrock south
gate.", "East to Al Kharid mine and
follow the path north to
Varrock east gate."); + + public static Signs forId(int id) { + for (Signs sign : Signs.values()) { + if (sign == null) { + continue; + } + if (sign.object == id) { + return sign; + } + } + return null; + } + + /** + * The object id. + */ + private int object; + + /** + * The directions. + */ + private String directions[]; + + /** + * Constructs a new {@code ReadSignPostPlugin.java} {@code Object}. + * @param object the object. + * @param directions the directions. + */ + Signs(int object, String... directions) { + this.object = object; + this.directions = directions; + } + } + + @Override + public boolean handle(Player player, Node node, String option) { + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getInterfaceManager().open(new Component(135)).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + return true; + } + }); + player.getPacketDispatch(); + final GameObject object = (GameObject) node; + Signs sign = Signs.forId(object.getId()); + if (sign == null) { + return false; + } + String[] dirs = sign.directions; + if (object.getLocation().getX() == 3107 && object.getLocation().getY() == 3296) { + dirs[0] = "North to Draynor
Manor"; + dirs[1] = "South to Draynor
Village"; + dirs[2] = "West to Port
Sarim"; + dirs[3] = "East to
Lumbridge"; + } + player.getPacketDispatch().sendString(dirs[0], 135, 3); // North + player.getPacketDispatch().sendString(dirs[1], 135, 9); // South + player.getPacketDispatch().sendString(dirs[2], 135, 12); // West + player.getPacketDispatch().sendString(dirs[3], 135, 8); // East + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2366).getHandlers().put("option:read", this); + ObjectDefinition.forId(2367).getHandlers().put("option:read", this); + ObjectDefinition.forId(2368).getHandlers().put("option:read", this); + ObjectDefinition.forId(2369).getHandlers().put("option:read", this); + ObjectDefinition.forId(2370).getHandlers().put("option:read", this); + ObjectDefinition.forId(2371).getHandlers().put("option:read", this); + ObjectDefinition.forId(4132).getHandlers().put("option:read", this); + ObjectDefinition.forId(4133).getHandlers().put("option:read", this); + ObjectDefinition.forId(4134).getHandlers().put("option:read", this); + ObjectDefinition.forId(4135).getHandlers().put("option:read", this); + ObjectDefinition.forId(5164).getHandlers().put("option:read", this); + ObjectDefinition.forId(10090).getHandlers().put("option:read", this); + ObjectDefinition.forId(13873).getHandlers().put("option:read", this); + ObjectDefinition.forId(15522).getHandlers().put("option:read", this); + ObjectDefinition.forId(18493).getHandlers().put("option:read", this); + ObjectDefinition.forId(24263).getHandlers().put("option:read", this); + ObjectDefinition.forId(25397).getHandlers().put("option:read", this); + ObjectDefinition.forId(30039).getHandlers().put("option:read", this); + ObjectDefinition.forId(30040).getHandlers().put("option:read", this); + ObjectDefinition.forId(31296).getHandlers().put("option:read", this); + ObjectDefinition.forId(31298).getHandlers().put("option:read", this); + ObjectDefinition.forId(31299).getHandlers().put("option:read", this); + ObjectDefinition.forId(31300).getHandlers().put("option:read", this); +// ObjectDefinition.forId(31301).getConfigurations().put("option:read", this);//goblin village + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/RedberryBushPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/RedberryBushPlugin.java new file mode 100644 index 000000000..8122478f2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/RedberryBushPlugin.java @@ -0,0 +1,66 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle picking from a red berry bush. + * @author 'Vexia + */ +@Initializable +public class RedberryBushPlugin extends OptionHandler { + + /** + * Represents the red berries item. + */ + private final Item RED_BERRIES = new Item(1951); + + /** + * Represents the picking berries animation. + */ + private final Animation ANIMATION = new Animation(2282); + + /** + * Represents the counter. + */ + private int counter = 0; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(23628).getHandlers().put("option:pick-from", this); + ObjectDefinition.forId(23629).getHandlers().put("option:pick-from", this); + ObjectDefinition.forId(23630).getHandlers().put("option:pick-from", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (((GameObject) node).getId() == 23630) { + player.getPacketDispatch().sendMessage("There are no berries left on this bush."); + player.getPacketDispatch().sendMessage("More berries will grow soon."); + return true; + } + if (!player.getInventory().add(RED_BERRIES)) { + player.getPacketDispatch().sendMessage("Your inventory is too full to pick the berries from the bush."); + return true; + } + player.lock(4); + player.animate(ANIMATION); + if (counter == 2) { + ObjectBuilder.replace(((GameObject) node), new GameObject(23630, node.getLocation()), 30); + counter = 0; + return true; + } + counter++; + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/RomeoQuestPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/RomeoQuestPlugin.java new file mode 100644 index 000000000..3aa82c182 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/RomeoQuestPlugin.java @@ -0,0 +1,65 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plguin used to handle cadava berries. + * @author 'Vexia + */ +@Initializable +public class RomeoQuestPlugin extends OptionHandler { + + /** + * Represents the cadava berries. + */ + private final Item CADAVA_BERRIES = new Item(753); + + /** + * Represents the picking berries animation. + */ + private final Animation ANIMATION = new Animation(2282); + + /** + * Represents the counter. + */ + private int counter = 0; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(23625).getHandlers().put("option:pick-from", this); + ObjectDefinition.forId(23626).getHandlers().put("option:pick-from", this); + ObjectDefinition.forId(23627).getHandlers().put("option:pick-from", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (((GameObject) node).getId() == 23627) { + player.getPacketDispatch().sendMessage("There are no berries left on this bush."); + player.getPacketDispatch().sendMessage("More berries will grow soon."); + return true; + } + if (!player.getInventory().add(CADAVA_BERRIES)) { + player.getPacketDispatch().sendMessage("Your inventory is too full to pick the berries from the bush."); + return true; + } + player.animate(ANIMATION); + if (counter == 2) { + ObjectBuilder.replace(((GameObject) node), new GameObject(23627, node.getLocation()), 30); + counter = 0; + return true; + } + counter++; + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/RuneCraftingGuildObjects.java b/Server/src/main/java/Server/core/game/interaction/object/RuneCraftingGuildObjects.java new file mode 100644 index 000000000..d3978bee9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/RuneCraftingGuildObjects.java @@ -0,0 +1,44 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Created for 2009Scape + * User: Ethan Kyle Millard + * Date: March 25, 2020 + * Time: 7:19 PM + */ +@Initializable +public class RuneCraftingGuildObjects extends OptionHandler { + + + @Override + public boolean handle(Player player, Node node, String option) { + GameObject object = ((GameObject) node); + + switch(object.getId()) { + case 38279: + if (player.getViewport().getRegion().getRegionId() == 12337) { + player.teleport(Location.create(1696, 5460, 2)); + } else { + player.teleport(Location.create(3106, 3160, 1)); + } + break; + } + + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(38279).getHandlers().put("option:enter", this); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/SearchOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/SearchOptionPlugin.java new file mode 100644 index 000000000..a1f900179 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/SearchOptionPlugin.java @@ -0,0 +1,92 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the search option. + * @author 'Vexia + */ +@Initializable +public class SearchOptionPlugin extends OptionHandler { + + /** + * Represents an object to search. + * @author 'Vexia + */ + public enum Search { + /** + * Represents a search. + */ + DEFAULT(-1, new Item(1059, 1)); + + public static Search forId(int id) { + for (Search search : Search.values()) { + if (search.getObject() == id) { + return search; + } + } + return null; + } + + /** + * The object id. + */ + private int object; + + /** + * The item rewarded. + */ + private Item item; + + /** + * Constructs a new {@code SearchOptionPlugin.java} + */ + Search(int object, Item item) { + this.object = object; + this.item = item; + } + + /** + * @return the item. + */ + public Item getItem() { + return item; + } + + /** + * @return the object. + */ + public int getObject() { + return object; + } + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (node.getName().equals("Bookcase")) { + player.getPacketDispatch().sendMessage("You search the books..."); + player.getPacketDispatch().sendMessage("You find nothing of interest to you."); + return true; + } + if (node.getId() == 14743 && !player.getInventory().containItems(946) && !player.inCombat()) { + player.getPacketDispatch().sendMessage("You mindlessly reach into the sack labeled 'knives'..."); + player.getPacketDispatch().sendMessage("Against all odds you pull out a knife without hurting yourself.",2); + player.getInventory().add(new Item(946)); + return true; + } + player.getPacketDispatch().sendMessage("You search the " + node.getName().toLowerCase() + " but find nothing."); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("search", this); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/SeersCageUnlockPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/SeersCageUnlockPlugin.java new file mode 100644 index 000000000..677c372cd --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/SeersCageUnlockPlugin.java @@ -0,0 +1,30 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to unlock the sheers cage. + * @author 'Vexia + * @versio 1.0 + */ +@Initializable +public final class SeersCageUnlockPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getPacketDispatch().sendMessage("You can't unlock the pillory, you'll let all the prisoners out!"); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(6836).getHandlers().put("option:unlock", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/ShantayPassPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/ShantayPassPlugin.java new file mode 100644 index 000000000..d33137ce2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/ShantayPassPlugin.java @@ -0,0 +1,143 @@ +package core.game.interaction.object; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin to handle the shantay pass. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class ShantayPassPlugin extends OptionHandler { + + /** + * Represents a shantay pass item. + */ + private static final Item PASS = new Item(1854); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 35542; i < 35545; i++) { + ObjectDefinition.forId(i).getHandlers().put("option:look-at", this); + ObjectDefinition.forId(i).getHandlers().put("option:go-through", this); + ObjectDefinition.forId(i).getHandlers().put("option:quick-pass", this); + } + NPCDefinition.forId(838).getHandlers().put("option:bribe", this); + ObjectDefinition.forId(35401).getHandlers().put("option:open", this); + ObjectDefinition.forId(2693).getHandlers().put("option:open", this); + new ShantayComponentPlugin().newInstance(arg); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final int id = node instanceof GameObject ? ((GameObject) node).getId() : ((NPC) node).getId(); + switch (option) { + case "open": + if (id == 2693) { + player.getBank().open(); + return true; + } + if (player.getAttribute("shantay-jail", false) && player.getLocation().getX() > 3299) { + player.removeAttribute("shantay-jail");// if we tele + // out(witch is + // allowed) then we + // need to remove. + } + if (!player.getAttribute("shantay-jail", false)) { + DoorActionHandler.handleDoor(player, (GameObject) node); + return true; + } else { + player.getDialogueInterpreter().open(836, null, true); + } + break; + case "bribe": + player.getDialogueInterpreter().open(838, ((NPC) node)); + break; + case "look-at": + player.getDialogueInterpreter().sendDialogue("The Desert is a VERY Dangerous place. Do not enter if you are", "afraid of dying. Beware of high temperatures, and storms, robbers,", "and slavers. No responsibility is taken by Shantay if anything bad", "should happen to you in any circumstances whatsoever."); + break; + case "go-through": + if (player.getLocation().getY() < 3117) { + player.getPacketDispatch().sendMessage("You go through the gate."); + AgilityHandler.walk(player, 0, player.getLocation(), player.getLocation().transform(0, player.getLocation().getY() > 3116 ? -2 : 2, 0), null, 0, null); + return true; + } + player.getInterfaceManager().open(new Component(565)); + break; + case "quick-pass": + if (player.getLocation().getY() < 3117) { + AgilityHandler.walk(player, 0, player.getLocation(), player.getLocation().transform(0, player.getLocation().getY() > 3116 ? -2 : 2, 0), null, 0, null); + return true; + } + player.getDialogueInterpreter().open(838, 838, true); + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + final GameObject object = (GameObject) n; + if (object.getId() == 35543) { + return object.getLocation().transform(-1, node.getLocation().getY() > n.getLocation().getY() ? 1 : -1, 0); + } else if (object.getId() == 35544) { + return object.getLocation().transform(-1, node.getLocation().getY() > n.getLocation().getY() ? 1 : -1, 0); + } else if (object.getId() == 35542) { + return object.getLocation().transform(1, node.getLocation().getY() > n.getLocation().getY() ? 1 : -1, 0); + } + } + return null; + } + + /** + * Represents the shantay component plugin. + * @author 'Vexia + * @version 1.0 + */ + public final class ShantayComponentPlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(565).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 17:// proceed. + player.getInterfaceManager().close(); + if (!player.getInventory().containsItem(PASS)) { + player.getDialogueInterpreter().sendDialogues(838, null, "You need a Shantay pass to get through this gate. See", "Shantay, he will sell you one for a very reasonable", "price."); + return true; + } else { + player.getDialogueInterpreter().open(838, null, true); + } + break; + case 18:// stay out. + player.getInterfaceManager().close(); + player.getDialogueInterpreter().sendDialogue("You decide that your visit to the desert can be postponed.", "Perhaps indefinitely."); + break; + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/SilverCastingInterfacePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/SilverCastingInterfacePlugin.java new file mode 100644 index 000000000..7ee5373eb --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/SilverCastingInterfacePlugin.java @@ -0,0 +1,64 @@ +package core.game.interaction.object; + +import core.game.component.Component; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class SilverCastingInterfacePlugin extends UseWithHandler { + + public SilverCastingInterfacePlugin() { + super(2355); + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + event.getPlayer().getInterfaceManager().open(new Component(438)); + player.getPacketDispatch().sendItemOnInterface(1718, 1, 438, 17); + player.getPacketDispatch().sendItemOnInterface(1724, 1, 438, 24); + player.getPacketDispatch().sendItemOnInterface(2961, 1, 438, 31); + player.getPacketDispatch().sendItemOnInterface(4201, 1, 438, 38); + player.getPacketDispatch().sendItemOnInterface(5525, 1, 438, 45); + player.getPacketDispatch().sendItemOnInterface(7637, 1, 438, 53); + player.getPacketDispatch().sendItemOnInterface(6748, 1, 438, 60); + player.getPacketDispatch().sendItemOnInterface(9382, 10, 438, 67); + player.getPacketDispatch().sendItemOnInterface(13154, 10, 438, 74); + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2966, OBJECT_TYPE, this); + addHandler(3044, OBJECT_TYPE, this); + addHandler(3294, OBJECT_TYPE, this); + addHandler(4304, OBJECT_TYPE, this); + addHandler(6189, OBJECT_TYPE, this); + addHandler(11009, OBJECT_TYPE, this); + addHandler(11010, OBJECT_TYPE, this); + addHandler(11666, OBJECT_TYPE, this); + addHandler(12100, OBJECT_TYPE, this); + addHandler(12809, OBJECT_TYPE, this); + addHandler(18497, OBJECT_TYPE, this); + addHandler(18525, OBJECT_TYPE, this); + addHandler(18526, OBJECT_TYPE, this); + addHandler(21879, OBJECT_TYPE, this); + addHandler(22721, OBJECT_TYPE, this); + addHandler(26814, OBJECT_TYPE, this); + addHandler(28433, OBJECT_TYPE, this); + addHandler(28434, OBJECT_TYPE, this); + addHandler(30021, OBJECT_TYPE, this); + addHandler(30510, OBJECT_TYPE, this); + addHandler(36956, OBJECT_TYPE, this); + addHandler(37651, OBJECT_TYPE, this); + + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/SinclairFlourBarrelPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/SinclairFlourBarrelPlugin.java new file mode 100644 index 000000000..2c80a090b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/SinclairFlourBarrelPlugin.java @@ -0,0 +1,83 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.tools.Items; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + + +/** + * Plugin that enables getting flour from barrel in Sinclair mansion kitchen. + * @author afaroutdude + */ +@Initializable +public final class SinclairFlourBarrelPlugin extends OptionHandler { + private final static Item EMPTY_POT = new Item(Items.EMPTY_POT_1931); + private static final Item FLOUR = new Item(Items.POT_OF_FLOUR_1933); + + @Override + public boolean handle(Player player, Node node, String option) { + return getFlour(player, (GameObject) node); + } + + public boolean getFlour(final Player player, final GameObject object) { + if (!player.getInventory().containsItem(EMPTY_POT)) { + player.getPacketDispatch().sendMessage("I need an empty pot to hold the flour in."); + return true; + } + if (player.getInventory().remove(EMPTY_POT)) { + player.lock(3); + player.getInventory().add(FLOUR); + player.getPacketDispatch().sendMessage("You take some flour from the barrel."); + + // Seers achievement diary + if (!player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0,5)) { + if (player.getAttribute("diary:seers:sinclair-flour", 0) >= 4) { + player.setAttribute("/save:diary:seers:sinclair-flour", 5); + player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).updateTask(player,0,5,true); + } else { + player.setAttribute("/save:diary:seers:sinclair-flour", player.getAttribute("diary:seers:sinclair-flour", 0) + 1); + } + } + + player.getPacketDispatch().sendMessage("There's still plenty of flour left."); + + return true; + } + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(26122).getHandlers().put("option:take from", this); + PluginManager.definePlugin(new FlourHandler()); + return this; + } + + private class FlourHandler extends UseWithHandler { + + public FlourHandler() { + super(EMPTY_POT.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(26122, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + return getFlour(event.getPlayer(), event.getUsedWith().asObject()); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/object/SlashWebPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/SlashWebPlugin.java new file mode 100644 index 000000000..925570eb8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/SlashWebPlugin.java @@ -0,0 +1,147 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.container.Container; +import core.game.container.impl.EquipmentContainer; +import core.plugin.Initializable; +import core.tools.Items; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.combat.equipment.WeaponInterface.AttackStyle; +import core.game.node.entity.combat.equipment.WeaponInterface.WeaponInterfaces; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the slashing of a web object. + * @author Vexia + * @version 2.0 + */ +@Initializable +public final class SlashWebPlugin extends OptionHandler { + + /** + * Represents the object ids. + */ + private static final int[] IDS = new int[] { 733, 1810, 11400, 33237 }; + + /** + * Represents the animation of slashing a web. + */ + private static final Animation ANIMATION = new Animation(451); + + /** + * Represents the knife animation. + */ + private static final Animation KNIFE_ANIMATION = new Animation(911); + + /** + * Represents the knife item. + */ + private static final Item KNIFE = new Item(946); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int objectId : IDS) { + ObjectDefinition.forId(objectId).getHandlers().put("option:slash", this); + } + ObjectDefinition.forId(27266).getHandlers().put("option:pass", this); + ObjectDefinition.forId(29354).getHandlers().put("option:pass", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final GameObject object = (GameObject) node; + Item weapon = getWeapon(player, player.getEquipment()); + if (weapon == null) { + weapon = getWeapon(player, player.getInventory()); + if (weapon == null) { + if (!player.getInventory().containsItem(KNIFE)) { + player.getPacketDispatch().sendMessage("Only a sharp blade can cut through this sticky web."); + return true; + } + weapon = KNIFE; + } + } + final boolean success = RandomFunction.random(2) == 1; + player.lock(2); + player.animate(weapon == KNIFE ? KNIFE_ANIMATION : ANIMATION); + if (success) { + player.getPacketDispatch().sendMessage("You slash the web apart."); + ObjectBuilder.replace(object, object.getId() == 27266 || object.getId() == 29354 ? object.transform(734) : object.transform(object.getId() + 1), 100); + + // Venture through the cobwebbed corridor in Varrock Sewers + if (object.getId() == 29354) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 17); + } + // Escape from the spider lair in Varrock Sewers with some red

spiders eggs + if (object.getId() == 29354 && player.getInventory().containsAtLeastOneItem(Items.RED_SPIDERS_EGGS_223) && player.getLocation().getY() <= 9897) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 4); + } + } else { + player.getPacketDispatch().sendMessage("You fail to cut through it."); + } + return true; + } + + /** + * Gets the slashed weapon item. + * @param player the player. + * @param container the container. + * @return the item. + */ + private Item getWeapon(final Player player, final Container container) { + Item item = container instanceof EquipmentContainer ? container.get(EquipmentContainer.SLOT_WEAPON) : null; + if (container instanceof EquipmentContainer) { + return checkEquipmentWeapon(player, item); + } + for (Item i : container.toArray()) { + if (i == null) { + continue; + } + if (i.getDefinition().hasAction("wield") || i.getDefinition().hasAction("equip")) { + item = checkEquipmentWeapon(player, i); + if (item != null) { + return item; + } + } else { + continue; + } + } + return item; + } + + /** + * Checks an equipment weapon. + * @param player the player. + * @param item the item. + * @return {@code Item} the item. + */ + private Item checkEquipmentWeapon(final Player player, final Item item) { + if (item != null) { + WeaponInterfaces inter = WeaponInterface.getWeaponInterface(item); + if (inter == null) { + return null; + } + boolean success = false; + for (AttackStyle style : inter.getAttackStyles()) { + if (style.getBonusType() == WeaponInterface.BONUS_SLASH) { + return item; + } + } + if (!success) { + return null; + } + } + return item; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/SlayerDangerSignPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/SlayerDangerSignPlugin.java new file mode 100644 index 000000000..c8d6243a1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/SlayerDangerSignPlugin.java @@ -0,0 +1,28 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class SlayerDangerSignPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(5127).getHandlers().put("option:read", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().sendDialogue("WARNING!", "This area contains very dangerous creatures!", "Do not pass unless properly prepared!"); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/SpinSpinningWheelPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/SpinSpinningWheelPlugin.java new file mode 100644 index 000000000..d28d95ccb --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/SpinSpinningWheelPlugin.java @@ -0,0 +1,45 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the spining interface open. + * @author Adam + */ +@Initializable +public class SpinSpinningWheelPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getInterfaceManager().open(new Component(459)); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2644).getHandlers().put("option:spin", this); + ObjectDefinition.forId(4309).getHandlers().put("option:spin", this); + ObjectDefinition.forId(8748).getHandlers().put("option:spin", this); + ObjectDefinition.forId(20365).getHandlers().put("option:spin", this); + ObjectDefinition.forId(21304).getHandlers().put("option:spin", this); + ObjectDefinition.forId(25824).getHandlers().put("option:spin", this); + ObjectDefinition.forId(26143).getHandlers().put("option:spin", this); + ObjectDefinition.forId(34497).getHandlers().put("option:spin", this); + ObjectDefinition.forId(36970).getHandlers().put("option:spin", this); + ObjectDefinition.forId(37476).getHandlers().put("option:spin", this); + return this; + } + + @Override + public Location getDestination(Node node, Node n) { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/ThievingGuidePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/ThievingGuidePlugin.java new file mode 100644 index 000000000..046dfdc34 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/ThievingGuidePlugin.java @@ -0,0 +1,189 @@ +package core.game.interaction.object; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the thieving guide plugin. + * @author 'Vexia + * @date 16/11/2013 + */ +@Initializable +public class ThievingGuidePlugin extends OptionHandler { + + /** + * The coin looots. + */ + private static final ChanceItem[] COINS = new ChanceItem[] { new ChanceItem(995, 20, 20, 90), new ChanceItem(995, 40, 40, 80) }; + + /** + * The gem items. + */ + private static final ChanceItem[] GEMS = new ChanceItem[] { new ChanceItem(1623, 1, 1, 80), new ChanceItem(1621, 1, 1, 60), new ChanceItem(1619, 1, 1, 8), new ChanceItem(1617, 1, 1, 7) }; + + /** + * Represents the stethoscope item. + */ + private static final Item SETHOSCOPE = new Item(5560); + + /** + * Represents the required level to crack a safe. + */ + private static final int level = 50; + + /** + * Represents the experience gained. + */ + private static final double experience = 70; + + /** + * Represents the animations to use. + */ + private static final Animation[] animations = new Animation[] { new Animation(2247), new Animation(2248), new Animation(1113), new Animation(2244) }; + + /** + * Represents the cracked safe. + */ + private static final int CRACKED_SAFE = 7238; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(7236).getHandlers().put("option:crack", this);// wall + // safe. + ObjectDefinition.forId(7227).getHandlers().put("option:disarm", this);// trap + ObjectDefinition.forId(7256).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + switch (option) { + case "open": + player.getDialogueInterpreter().sendDialogues(2266, null, "And where do you think you're going? A little too eager", "I think. Come and talk to me before you go wandering", "around in there."); + break; + case "crack": + if (player.getSkills().getLevel(Skills.THIEVING) < 50) { + player.getPacketDispatch().sendMessage("You need to be level " + level + " thief to crack this safe."); + return true; + } + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return true; + } + final boolean success = success(player, Skills.THIEVING); + player.lock(4); + player.getPacketDispatch().sendMessage("You start cracking the safe."); + player.animate(animations[success ? 1 : 0]); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + if (success) { + handleSuccess(player, (GameObject) node); + return true; + } + final boolean trapped = RandomFunction.random(3) == 1; + if (trapped) { + player.getPacketDispatch().sendMessage("You slip and trigger a trap!"); + player.animate(animations[2]); + player.getImpactHandler().manualHit(player, RandomFunction.random(2, 6), HitsplatType.NORMAL); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + player.animate(new Animation(-1, Priority.HIGH)); + return true; + } + }); + } + return true; + } + }); + break; + case "search": + player.animate(animations[3]); + player.getPacketDispatch().sendMessage("You temporarily disarm the trap!"); + break; + } + return true; + } + + /** + * Handles the success. + * @param player the player. + * @param object the object. + */ + public void handleSuccess(final Player player, final GameObject object) { + ObjectBuilder.replace(object, object.transform(CRACKED_SAFE), 1); + player.getPacketDispatch().sendMessage("You get some loot."); + player.getSkills().addExperience(Skills.THIEVING, experience, true); + addItem(player); + } + + /** + * Adds an item. + * @param player the player. + */ + private void addItem(Player player) { + ChanceItem[] l = RandomFunction.random(2) == 1 ? GEMS : COINS; + List chances = new ArrayList<>(); + for (ChanceItem c : l) { + chances.add(c); + } + Collections.shuffle(chances); + int rand = RandomFunction.random(100); + Item item = null; + int tries = 0; + while (item == null) { + ChanceItem i = chances.get(0); + if (rand <= i.getChanceRate()) { + item = i; + break; + } + if (tries > chances.size()) { + if (i.getId() == 1617) { + item = COINS[0]; + break; + } + item = i; + break; + } + tries++; + } + player.getInventory().add(item); + } + + /** + * Method used to determine the success of a player when thieving. + * @param player the player. + * @return True if succesfull, False if not. + */ + public final boolean success(final Player player, final int skill) { + double level = player.getSkills().getLevel(skill); + double req = 50; + int mod = player.getInventory().containsItem(SETHOSCOPE) ? 8 : 17; + double successChance = Math.ceil((level * 50 - req * mod) / req / 3 * 4); + int roll = RandomFunction.random(99); + if (successChance >= roll) { + return true; + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/TollGateOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/TollGateOptionPlugin.java new file mode 100644 index 000000000..1f82e1c81 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/TollGateOptionPlugin.java @@ -0,0 +1,54 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.repository.Repository; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_BASE; +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_ALKHARID_GATE; + +@Initializable +public class TollGateOptionPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + if (option.equals("pay-toll(10gp)")) { + if (player.getQuestRepository().getQuest("Prince Ali Rescue").getStage(player) > 50) { + player.getPacketDispatch().sendMessage("The guards let you through for free."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } else { + if (player.getInventory().contains(995, 10)) { + player.getInventory().remove(new Item(995, 10)); + player.getPacketDispatch().sendMessage("You quickly pay the 10 gold toll and go through the gates."); + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + player.incrementAttribute("/save:" + STATS_BASE + ":" + STATS_ALKHARID_GATE, 10); + return true; + } else { + player.getPacketDispatch().sendMessage("You need 10 gold to pass through the gates."); + } + } + } else { + player.getDialogueInterpreter().open(925, Repository.findNPC(925), (GameObject) node); + return true; + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(35551).getHandlers().put("option:open", this); + ObjectDefinition.forId(35551).getHandlers().put("option:pay-toll(10gp)", this); + ObjectDefinition.forId(35549).getHandlers().put("option:open", this); + ObjectDefinition.forId(35549).getHandlers().put("option:pay-toll(10gp)", this); + ObjectDefinition.forId(2882).getHandlers().put("option:pay-toll(10gp)", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/VampireSlayerPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/VampireSlayerPlugin.java new file mode 100644 index 000000000..9a1497a22 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/VampireSlayerPlugin.java @@ -0,0 +1,96 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin to handle vampire slayer node handling. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class VampireSlayerPlugin extends OptionHandler { + + /** + * Represents the basement location. + */ + private static final Location BASEMENT = Location.create(3077, 9770, 0); + + /** + * Represents the ground floor location. + */ + private static final Location GROUND_FLOOR = Location.create(3115, 3356, 0); + + /** + * Represents the stake item + */ + private static final Item STAKE = new Item(1549); + + /** + * Represents the hammer item. + */ + private static final Item HAMMER = new Item(2347); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(33502).getHandlers().put("option:open", this); + ObjectDefinition.forId(2614).getHandlers().put("option:open", this); + ObjectDefinition.forId(32835).getHandlers().put("option:walk-down", this); + ObjectDefinition.forId(32836).getHandlers().put("option:walk-up", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Vampire Slayer"); + switch (option) { + case "open": + int id = ((GameObject) node).getId(); + switch (id) { + case 2614: + if (quest.getStage(player) == 100) { + player.getDialogueInterpreter().sendDialogue("There's only a pillow in here.."); + } else if (quest.getStage(player) == 30) { + if (!player.getInventory().containsItem(STAKE) && !player.getInventory().containsItem(HAMMER)) { + player.getPacketDispatch().sendMessage("You must have a stake and hammer with you to kill the vampire."); + return true; + } + final NPC o = player.getAttribute("count", null); + if (o == null || !o.isActive()) { + final NPC vampire = NPC.create(757, player.getLocation()); + vampire.setRespawn(false); + vampire.setAttribute("player", player); + vampire.init(); + vampire.getProperties().getCombatPulse().attack(player); + player.setAttribute("count", vampire); + } + } + break; + case 33502: + player.getPacketDispatch().sendMessage("The cupboard contains garlic. You take a clove."); + if (!player.getInventory().add(new Item(1550))) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + } + break; + } + break; + case "walk-down": + player.getProperties().setTeleportLocation(BASEMENT); + player.getPacketDispatch().sendMessage("You walk down the stairs..."); + break; + case "walk-up": + player.getProperties().setTeleportLocation(GROUND_FLOOR); + break; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/WantedPoster.java b/Server/src/main/java/Server/core/game/interaction/object/WantedPoster.java new file mode 100644 index 000000000..9d6fc7918 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/WantedPoster.java @@ -0,0 +1,26 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class WantedPoster extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(40992).getHandlers().put("option:look-at", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + //Can do fun stuff related to a player being wanted or something. + player.getDialogueInterpreter().sendPlainMessage(false, "Looks like a generic wanted poster."); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/WildernessLeverPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/WildernessLeverPlugin.java new file mode 100644 index 000000000..a59805085 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/WildernessLeverPlugin.java @@ -0,0 +1,353 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles wilderness levers. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WildernessLeverPlugin extends OptionHandler { + + /** + * The animation used when pulling a lever. + */ + private static final Animation PULL_ANIMATION = new Animation(2140); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (LeverSets set : LeverSets.values()) { + for (int id : set.getIds()) { + ObjectDefinition.forId(id).getHandlers().put("option:pull", this); + } + } + PluginManager.definePlugin(new LeverDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final GameObject object = (GameObject) node; + final LeverSets set = LeverSets.forId(object.getId()); + if (!set.canPull(player, object)) { + return true; + } + set.pull(player, set.getIndex(object.getId())); + if (set.getTransformId() != -1) { + ObjectBuilder.replace(object, object.transform(set.getTransformId()), 2); + } + return true; + } + + /** + * Method used to pull a lever. + * @param player the player. + * @param lever the lever. + */ + private static void pullLever(final Player player, final LeverSets lever, final int index) { + player.lock(2); + player.animate(lever.getAnimation()); + player.getAudioManager().send(new Audio(2400)); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + lever.message(player, index); + lever.teleport(player, lever.getLocation(index)); + return true; + } + }); + } + + /** + * Represents a set of levers. + * @author 'Vexia + */ + public enum LeverSets { + ARDY("wilderness", 1814, 1815, Location.create(2561, 3311, 0), Location.create(3154, 3923, 0)) { + @Override + public void pull(final Player player, final int index, boolean force) { + if (index == 0 && !force) { + player.getDialogueInterpreter().open("wilderness-lever", this, getId(index)); + } else { + pullLever(player, this, index); + } + } + }, + + MAGE_BANK("mage's cave", 5959, 5960, Location.create(3090, 3956, 0), Location.create(2539, 4712, 0)), ARENA("arena", 9706, 9707, Location.create(3105, 3956, 0), Location.create(3105, 3951, 0)) { + @Override + public boolean canPull(Player player, GameObject object) { + if (!player.getSavedData().getActivityData().hasKilledKolodion() && object.getId() == 9706) { + player.getDialogueInterpreter().sendDialogues(905, null, "You're not allowed in there. Come downstairs if you", "want to enter my arena."); + return false; + } + return super.canPull(player, object); + } + + @Override + public Animation getAnimation() { + return new Animation(2142); + } + + @Override + public int getTransformId() { + return -1; + } + }; + + /** + * The name. + */ + private final String name; + + /** + * The lever ids. + */ + private final int ids[]; + + /** + * The locations to teleport to. + */ + private final Location[] locations; + + /** + * Constructs a new {@code LeverSets} {@code Object}. + * @param ids the ids. + */ + private LeverSets(String name, int[] ids, Location... locations) { + this.name = name; + this.ids = ids; + this.locations = locations; + } + + /** + * Constructs a new {@code LeverSets} {@code Object}. + * @param first the first id. + * @param second the second id. + * @param locations the locations. + */ + private LeverSets(String name, int first, int second, Location... locations) { + this(name, new int[] { first, second }, locations); + } + + /** + * Called when a lever object is interacted with. + * @param player the player. + * @param index the index. + * @param force if a forced teleport. + */ + public void pull(final Player player, final int index, boolean force) { + pullLever(player, this, index); + } + + /** + * Used as a wrapper method for {@link #pull(Player, int)}. + * @param player the player. + * @param index the index. + */ + public void pull(final Player player, final int index) { + pull(player, index, false); + } + + /** + * Sends the lever messages on teleporting. + * @param player the player. + * @param index the index. + */ + public void message(final Player player, final int index) { + player.getPacketDispatch().sendMessages("You pull the lever...", "...And teleport " + (index == 0 ? "into" : "out of") + " the " + name + "."); + } + + /** + * Teleports a player to a location. + * @param player the player. + * @param location the location. + */ + public void teleport(final Player player, Location location) { + player.getTeleporter().send(location, TeleportManager.TeleportType.NORMAL, TeleportManager.WILDY_TELEPORT); + } + + /** + * Checks if the player can pull the lever. + * @param player the player. + * @return {@code True} if so. + */ + public boolean canPull(Player player, GameObject object) { + return true; + } + + /** + * Gets the animation. + * @return the animation. + */ + public Animation getAnimation() { + return PULL_ANIMATION; + } + + /** + * Gets the transform id. + * @return the id. + */ + public int getTransformId() { + return 1817; + } + + /** + * Gets the index by the id. + * @param id the id. + * @return the index. + */ + public int getIndex(int id) { + for (int i = 0; i < ids.length; i++) { + if (ids[i] == id) { + return i; + } + } + return -1; + } + + /** + * Gets a lever set by the id. + * @param id the id. + * @return the set. + */ + public static LeverSets forId(int id) { + for (LeverSets set : values()) { + for (int i : set.getIds()) { + if (i == id) { + return set; + } + } + } + return null; + } + + /** + * Gets the location. + * @param index the index. + * @return the location. + */ + public Location getLocation(int index) { + return locations[index == 0 ? 1 : 0]; + } + + /** + * Gets the id. + * @param index the index. + * @return the id. + */ + public int getId(int index) { + return ids[index]; + } + + /** + * Gets the ids. + * @return The ids. + */ + public int[] getIds() { + return ids; + } + + /** + * Gets the location. + * @return The location. + */ + public Location[] getLocations() { + return locations; + } + + } + + /** + * Handles the wilderness lever dialogues. + * @author 'Vexia + * @version 1.0 + */ + public static final class LeverDialogue extends DialoguePlugin { + + /** + * The lever set. + */ + private LeverSets lever; + + /** + * The object id. + */ + private int id; + + /** + * Constructs a new {@code LeverDialogue} {@code Object}. + */ + public LeverDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LeverDialogue} {@code Object}. + * @param player the player. + */ + public LeverDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LeverDialogue(player); + } + + @Override + public boolean open(Object... args) { + lever = (LeverSets) args[0]; + id = (int) args[1]; + interpreter.sendDialogue("Warning! Pulling the lever will teleport you deep into the wilderness."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Yes I'm brave.", "Eep! The wilderness... No thank you."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + lever.pull(player, lever.getIndex(id), true); + end(); + break; + case 2: + end(); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("wilderness-lever") }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/WildernessObeliskPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/WildernessObeliskPlugin.java new file mode 100644 index 000000000..4e12a8425 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/WildernessObeliskPlugin.java @@ -0,0 +1,151 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.chunk.GraphicUpdateFlag; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the wilderness obelisk plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WildernessObeliskPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(14829).getHandlers().put("option:activate", this); + ObjectDefinition.forId(14826).getHandlers().put("option:activate", this); + ObjectDefinition.forId(14827).getHandlers().put("option:activate", this); + ObjectDefinition.forId(14828).getHandlers().put("option:activate", this); + ObjectDefinition.forId(14830).getHandlers().put("option:activate", this); + ObjectDefinition.forId(14831).getHandlers().put("option:activate", this); + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + final GameObject nodeObject = (GameObject) node; + final Obelisk stationObelisk = Obelisk.forLocation(player.getLocation()); + if (stationObelisk == null) { + return false; + } + for (int i = 0; i < 4; i++) { + int x = stationObelisk.getLocation().getX(); + int y = stationObelisk.getLocation().getY(); + int z = stationObelisk.getLocation().getZ(); + switch (i) { + case 0: + x = x + 2; + y = y + 2; + ObjectBuilder.replace(new GameObject(nodeObject.getId(), Location.create(x, y, z)), new GameObject(14825, Location.create(x, y, 0)), 6); + break; + case 1: + x = x - 2; + y = y + 2; + ObjectBuilder.replace(new GameObject(nodeObject.getId(), Location.create(x, y, z)), new GameObject(14825, Location.create(x, y, 0)), 6); + break; + case 2: + x = x - 2; + y = y - 2; + ObjectBuilder.replace(new GameObject(nodeObject.getId(), Location.create(x, y, z)), new GameObject(14825, Location.create(x, y, 0)), 6); + break; + case 3: + x = x + 2; + y = y - 2; + ObjectBuilder.replace(new GameObject(nodeObject.getId(), Location.create(x, y, z)), new GameObject(14825, Location.create(x, y, 0)), 6); + break; + } + } + player.getAudioManager().send(204); + GameWorld.getPulser().submit(new Pulse(6, player) { + @Override + public boolean pulse() { + final Location center = stationObelisk.getLocation(); + if (getDelay() == 1) { + for (int x = center.getX() - 1; x <= center.getX() + 1; x++) { + for (int y = center.getY() - 1; y <= center.getY() + 1; y++) { + Location l = Location.create(x, y, 0); + RegionManager.getRegionChunk(l).flag(new GraphicUpdateFlag(Graphics.create(342), l)); + } + } + return true; + } + int index = RandomFunction.random(Obelisk.values().length); + Obelisk newObelisk = Obelisk.values()[index]; + if (newObelisk == stationObelisk) { + newObelisk = Obelisk.values()[index++ % Obelisk.values().length]; + } + for (Player player : RegionManager.getLocalPlayers(center, 1)) { + player.getPacketDispatch().sendMessage("Ancient magic teleports you somewhere in the wilderness."); + int xDif = stationObelisk.getLocation().getX() - player.getLocation().getX(); + int yDif = stationObelisk.getLocation().getY() - player.getLocation().getY(); + if (xDif > 0 || yDif > 0) { + player.getTeleporter().send(Location.create(newObelisk.getLocation().getX() - xDif, newObelisk.getLocation().getY() - yDif, 0), TeleportType.OBELISK, 2); + } else { + player.getTeleporter().send(Location.create(newObelisk.getLocation().getX() + xDif, newObelisk.getLocation().getY() + yDif, 0), TeleportType.OBELISK, 2); + } + } + super.setDelay(1); + return false; + } + + }); + return true; + } + + /** + * Represents an obelisk type. + * @author 'Vexia + * @version 1.0 + */ + public enum Obelisk { + LEVEL_13(new Location(3156, 3620, 0)), LEVEL_19(new Location(3219, 3656, 0)), LEVEL_27(new Location(3035, 3732, 0)), LEVEL_35(new Location(3106, 3794, 0)), LEVEL_44(new Location(2980, 3866, 0)), LEVEL_50(new Location(3307, 3916, 0)); + + /** + * Represents the location to teleport to. + */ + private Location location; + + /** + * Constructs a new {@code Obelisk} {@code Object}. + * @param location the location. + */ + Obelisk(Location location) { + this.location = location; + } + + /** + * Gets the location. + * @return the location + */ + public Location getLocation() { + return location; + } + + /** + * Gets the obelisk by location. + * @param location the location. + * @return the obelisk. + */ + public static Obelisk forLocation(Location location) { + for (Obelisk obelisk : Obelisk.values()) + if (obelisk.getLocation().getDistance(location) <= 20) + return obelisk; + return null; + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/WitchsPotionPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/WitchsPotionPlugin.java new file mode 100644 index 000000000..680492978 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/WitchsPotionPlugin.java @@ -0,0 +1,41 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the witchs potion plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WitchsPotionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2024).getHandlers().put("option:drink from", this); + ObjectDefinition.forId(2024).getHandlers().put("option:Drink From", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Quest quest = player.getQuestRepository().getQuest("Witch's Potion"); + switch (quest.getStage(player)) { + case 20: + case 100: + player.getDialogueInterpreter().sendDialogues(player, null, "As nice as that looks I think I'll give it a miss for now."); + break; + case 40: + player.getDialogueInterpreter().open(307, true, 1); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/WydinDoorPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/WydinDoorPlugin.java new file mode 100644 index 000000000..58c89c29d --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/WydinDoorPlugin.java @@ -0,0 +1,44 @@ +package core.game.interaction.object; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the door near wydin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WydinDoorPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2069).getHandlers().put("option:open", this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getEquipment().contains(1005, 1) && player.getLocation().getX() >= 3011 && player.getLocation().getX() <= 3018) { + player.getDialogueInterpreter().open(557, true, true); + return true; + } else { + final GameObject object = (GameObject) node; + DoorActionHandler.handleAutowalkDoor(player, object); + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + return DoorActionHandler.getDestination(((Entity) node), ((GameObject) n)); + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/dmc/DMCHandler.java b/Server/src/main/java/Server/core/game/interaction/object/dmc/DMCHandler.java new file mode 100644 index 000000000..7f2e4c164 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/dmc/DMCHandler.java @@ -0,0 +1,341 @@ +package core.game.interaction.object.dmc; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles a player's Dwarf Multi-cannon. + * @author Emperor + */ +public final class DMCHandler { + + /** + * The player. + */ + private final Player player; + + /** + * The cannon object. + */ + private GameObject cannon; + + /** + * The amount of cannonballs loaded. + */ + private int cannonballs; + + /** + * The logout plugin. + */ + private Plugin logoutPlugin; + + /** + * The firing pulse. + */ + private Pulse firingPulse; + + /** + * The current direction. + */ + private DMCRevolution direction = DMCRevolution.NORTH; + + /** + * The decaying pulse. + */ + private Pulse decayPulse; + + /** + * Constructs a new {@code DMCHandler} {@code Object} + * @param player The player owning the cannon. + */ + public DMCHandler(final Player player) { + this.player = player; + this.firingPulse = new Pulse(1, player) { + @Override + public boolean pulse() { + if (!cannon.isActive()) { + return true; + } + return rotate(); + } + + }; + firingPulse.stop(); + this.decayPulse = new Pulse(2000, player) { + @Override + public boolean pulse() { + if (!cannon.isActive()) { + return true; + } + if (getDelay() == 2000) { + setDelay(500); + player.sendMessage("Your cannon is about to decay!"); + return false; + } + explode(true); + return true; + } + + }; + decayPulse.stop(); + } + + /** + * Rotates the cannon. + * @return {@code True} if the cannon should stop rotating. + */ + private boolean rotate() { + if (cannonballs < 1) { + player.getPacketDispatch().sendMessage("Your cannon has run out of ammo!"); + return true; + } + player.getPacketDispatch().sendObjectAnimation(cannon, Animation.create(direction.getAnimationId())); + Location l = cannon.getLocation().transform(1, 1, 0); + direction = DMCRevolution.values()[(direction.ordinal() + 1) % DMCRevolution.values().length]; + for (NPC npc : RegionManager.getLocalNpcs(l, 10)) { + if (direction.isInSight(npc.getLocation().getX() - l.getX(), npc.getLocation().getY() - l.getY()) && npc.isAttackable(player, CombatStyle.RANGE) && CombatSwingHandler.isProjectileClipped(npc, l, false)) { + int speed = (int) (25 + (l.getDistance(npc.getLocation()) * 10)); + Projectile.create(l, npc.getLocation(), 53, 40, 36, 20, speed, 0, 128).send(); + cannonballs--; + int hit = 0; + if (player.getSwingHandler(false).isAccurateImpact(player, npc, CombatStyle.RANGE, 1.2, 1.0)) { + hit = RandomFunction.getRandom(30); + } + player.getSkills().addExperience(Skills.RANGE, hit * 2); + npc.getImpactHandler().manualHit(player, hit, HitsplatType.NORMAL, (int) Math.ceil(l.getDistance(npc.getLocation()) * 0.3)); + npc.attack(player); + break; + } + } + return false; + } + + /** + * Starts rotating the cannon. + */ + public void startFiring() { + if (cannon == null || !cannon.isActive()) { + player.getPacketDispatch().sendMessage("You don't have a cannon active."); + return; + } + if (firingPulse.isRunning()) { + firingPulse.stop(); + return; + } + if (cannonballs < 1) { + int amount = player.getInventory().getAmount(new Item(2)); + if (amount < 1) { + player.getPacketDispatch().sendMessage("Your cannon is out of cannonballs."); + return; + } + int toUse = 30 - cannonballs; + if(toUse > amount){ + toUse = amount; + } + if(toUse > 0){ + cannonballs = toUse; + player.getPacketDispatch().sendMessage("You load the cannon with " + toUse + " cannonballs."); + player.getInventory().remove(new Item(2, toUse)); + } else { + player.sendMessage("Your cannon is already fully loaded."); + } + } + firingPulse.restart(); + firingPulse.start(); + GameWorld.getPulser().submit(firingPulse); + } + + /** + * Makes the cannon explode. + */ + public void explode(boolean decay) { + if (!cannon.isActive()) { + return; + } + player.sendMessage("Your cannon has " + (decay ? "decayed" : "been destroyed") + "!"); + for (Player p : RegionManager.getLocalPlayers(player)) { + p.getPacketDispatch().sendPositionedGraphic(189, 0, 1, cannon.getLocation()); + } + clear(false); + } + + /** + * Constructs the cannon. + */ + public static void construct(final Player player) { + final Location spawn = RegionManager.getSpawnLocation(player, new GameObject(6, player.getLocation())); + if (spawn == null) { + player.getPacketDispatch().sendMessage("There's not enough room for your cannon."); + return; + } + if (player.getZoneMonitor().isRestricted(ZoneRestriction.CANNON)) { + player.getPacketDispatch().sendMessage("You can't set up a cannon here."); + return; + } + final DMCHandler handler = new DMCHandler(player); + if (handler.decayPulse.isRunning()) { + handler.decayPulse.stop(); + return; + } + player.setAttribute("dmc", handler); + player.getPulseManager().clear(); + player.getWalkingQueue().reset(); + player.lock(9); + player.faceLocation(spawn.transform(Direction.NORTH_EAST)); + GameWorld.getPulser().submit(new Pulse(2, player) { + int count = 0; + GameObject object = null; + + @Override + public boolean pulse() { + player.animate(Animation.create(827)); + if (!player.getInventory().remove(new Item(6 + (count * 2)))) { + for (int i = count - 1; i >= 0; i--) { + player.getInventory().add(new Item(6 + (i * 2))); + } + if (object != null) { + ObjectBuilder.remove(object); + } + return true; + } + player.addExtension(LogoutTask.class, new LogoutTask() { + int amount = count + 1; + + @Override + public void run(Player player) { + for (int i = 0; i < amount; i++) { + player.getInventory().add(new Item(6 + (i * 2))); + } + if (object != null) { + ObjectBuilder.remove(object); + } + } + }); + switch (count) { + case 0: + object = ObjectBuilder.add(new GameObject(7, spawn)); + player.getPacketDispatch().sendMessage("You place the cannon base on the ground."); + return count++ == 666; + case 1: + player.getPacketDispatch().sendMessage("You add the stand."); + break; + case 2: + player.getPacketDispatch().sendMessage("You add the barrels."); + break; + case 3: + player.getPacketDispatch().sendMessage("You add the furnace."); + ObjectBuilder.remove(object); + handler.configure(ObjectBuilder.add(object = object.transform(6))); + return true; + } + ObjectBuilder.remove(object); + ObjectBuilder.add(object = object.transform(object.getId() + 1)); + return ++count == 4; + } + }); + } + + /** + * Configures the cannon. + * @param cannon The cannon. + */ + public void configure(GameObject cannon) { + this.cannon = cannon; + player.removeExtension(LogoutTask.class); + player.getLogoutPlugins().add(logoutPlugin = new Plugin() { + @Override + public Plugin newInstance(Player arg) throws Throwable { + clear(false); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + }); + } + + /** + * Clears the cannon. + * @param pickup If the cannon is getting picked up. + */ + public void clear(boolean pickup) { + if (decayPulse.isRunning()) { + decayPulse.stop(); + } + ObjectBuilder.remove(cannon); + player.removeAttribute("dmc"); + player.getLogoutPlugins().remove(logoutPlugin); + if (!pickup) { + player.getSavedData().getActivityData().setLostCannon(true); + return; + } + for (int i = 0; i < 4; i++) { + player.getInventory().add(new Item(12 - (i * 2))); + } + if (cannonballs > 0) { + player.getInventory().add(new Item(2, cannonballs)); + cannonballs = 0; + } + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the cannon. + * @return the cannon + */ + public GameObject getCannon() { + return cannon; + } + + /** + * Sets the cannon. + * @param cannon the cannon to set. + */ + public void setCannon(GameObject cannon) { + this.cannon = cannon; + } + + /** + * Gets the cannonballs. + * @return the cannonballs + */ + public int getCannonballs() { + return cannonballs; + } + + /** + * Sets the bacannonballs. + * @param cannonballs the cannonballs to set. + */ + public void setCannonballs(int cannonballs) { + this.cannonballs = cannonballs; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/object/dmc/DMCRevolution.java b/Server/src/main/java/Server/core/game/interaction/object/dmc/DMCRevolution.java new file mode 100644 index 000000000..57af5b3de --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/dmc/DMCRevolution.java @@ -0,0 +1,88 @@ +package core.game.interaction.object.dmc; + +/** + * The DMC aiming directions. + * @author Emperor + */ +public enum DMCRevolution { + + NORTH(515) { + @Override + public boolean isInSight(int offsetX, int offsetY) { + return offsetY > 0 && Math.abs(offsetX) <= offsetY; + } + }, + NORTH_EAST(516) { + @Override + public boolean isInSight(int offsetX, int offsetY) { + return offsetY > 0 && offsetX > 0; + } + }, + EAST(517) { + @Override + public boolean isInSight(int offsetX, int offsetY) { + return offsetX > 0 && Math.abs(offsetY) <= offsetX; + } + }, + SOUTH_EAST(518) { + @Override + public boolean isInSight(int offsetX, int offsetY) { + return offsetY < 0 && offsetX > 0; + } + }, + SOUTH(519) { + @Override + public boolean isInSight(int offsetX, int offsetY) { + return offsetY < 0 && Math.abs(offsetX) <= -offsetY; + } + }, + SOUTH_WEST(520) { + @Override + public boolean isInSight(int offsetX, int offsetY) { + return offsetY < 0 && offsetX < 0; + } + }, + WEST(521) { + @Override + public boolean isInSight(int offsetX, int offsetY) { + return offsetX < 0 && Math.abs(offsetY) <= -offsetX; + } + }, + NORTH_WEST(514) { + @Override + public boolean isInSight(int offsetX, int offsetY) { + return offsetY > 0 && offsetX < 0; + } + }; + + /** + * The animation id. + */ + private final int animationId; + + /** + * Constructs a new {@Code DMCRevolution} {@Code Object} + * @param animationId The animation id. + */ + private DMCRevolution(int animationId) { + this.animationId = animationId; + } + + /** + * Gets the animationId. + * @return the animationId + */ + public int getAnimationId() { + return animationId; + } + + /** + * Checks if the offsets are in the line of sight for the current direction. + * @param offsetX The x-offset. + * @param offsetY The y-offset. + * @return {@code True} if so. + */ + public boolean isInSight(int offsetX, int offsetY) { + return false; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/object/dmc/DMCZone.java b/Server/src/main/java/Server/core/game/interaction/object/dmc/DMCZone.java new file mode 100644 index 000000000..193d31d84 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/dmc/DMCZone.java @@ -0,0 +1,55 @@ +package core.game.interaction.object.dmc; + +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.plugin.Plugin; + +/** + * A restricted DMC zone. + * @author Vexia + */ +public class DMCZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code DMCZone} {@code Object} + */ + public DMCZone() { + super("DMC Zone", true, ZoneRestriction.CANNON); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + // dwarven mine + registerRegion(11929); + registerRegion(12185); + registerRegion(12184); + // WG: + register(new ZoneBorders(2838, 3536, 2875, 3555)); + // KQ: + registerRegion(13972); + // ice mountain + register(new ZoneBorders(2995, 3465, 3022, 3509)); + // Fremmy dungeon + register(new ZoneBorders(2690, 9934, 2831, 10050)); + // entrana + registerRegion(11316); + // black knight fortrss + registerRegion(12086); + // KBD + registerRegion(9033); + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.java new file mode 100644 index 000000000..ff96d3f04 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/dmc/DwarfMultiCannonPlugin.java @@ -0,0 +1,125 @@ +package core.game.interaction.object.dmc; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the Dwarf multi-cannon. + * @author Emperor + */ +@Initializable +public final class DwarfMultiCannonPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(6).getHandlers().put("option:set-up", this); + ObjectDefinition.forId(6).getHandlers().put("option:fire", this); + ObjectDefinition.forId(6).getHandlers().put("option:pick-up", this); + ObjectDefinition.forId(7).getHandlers().put("option:pick-up", this); + ObjectDefinition.forId(8).getHandlers().put("option:pick-up", this); + ObjectDefinition.forId(9).getHandlers().put("option:pick-up", this); + UseWithHandler.addHandler(6, UseWithHandler.OBJECT_TYPE, new UseWithHandler(2) { + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + DMCHandler handler = event.getPlayer().getAttribute("dmc"); + if (handler != null && handler.getCannon() == event.getUsedWith()) { + int maxAmount = 30; + int amount = maxAmount - handler.getCannonballs(); + if(amount < 0 || amount > 30) { + handler.setCannonballs(0); + amount = maxAmount - handler.getCannonballs(); + } + if (amount > 0) { + if (amount > event.getUsedItem().getAmount()) { + amount = event.getUsedItem().getAmount(); + } + if (event.getPlayer().getInventory().remove(new Item(2, amount))) { + handler.setCannonballs(handler.getCannonballs() + amount); + event.getPlayer().getPacketDispatch().sendMessage("You load the cannon with " + amount + " cannonballs."); + return true; + } + } + event.getPlayer().getPacketDispatch().sendMessage("Your cannon is already full loaded."); + return true; + } + event.getPlayer().getPacketDispatch().sendMessage("This is not your cannon."); + return true; + } + + }); + PluginManager.definePlugin(new DMCZone()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (node instanceof Item) { + if (!player.getInventory().containItems(6, 8, 10, 12)) { + player.getPacketDispatch().sendMessage("You don't have all the cannon components!"); + return true; + } + if (!player.getQuestRepository().isComplete("Dwarf Cannon") && player.getDetails().getRights() != Rights.ADMINISTRATOR) { + player.getPacketDispatch().sendMessage("You have to complete the Dwarf Cannon to know how to use this."); + return true; + } + if (player.getAttribute("dmc") != null) { + player.getPacketDispatch().sendMessage("You cannot construct more than one cannon at a time."); + player.getPacketDispatch().sendMessage("If you have lost your cannon, go and see the dwarf cannon engineer."); + return true; + } + DMCHandler.construct(player); + return true; + } + switch (option) { + case "fire": + DMCHandler handler = player.getAttribute("dmc"); + if (handler != null && handler.getCannon() == node) { + handler.startFiring(); + return true; + } + player.getPacketDispatch().sendMessage("This is not your cannon."); + return true; + case "pick-up": + handler = player.getAttribute("dmc"); + if (handler != null && handler.getCannon() == node) { + int count = 4; + if (handler.getCannonballs() > 0 && !player.getInventory().contains(2, 1)) { + count++; + } + if (player.getInventory().freeSlots() < count) { + player.getPacketDispatch().sendMessage("You don't have enough space in your inventory."); + return true; + } + player.getPacketDispatch().sendMessage("You pick up the cannon."); + handler.clear(true); + return true; + } + /* + * if (player.getDetails().getRights() == Rights.ADMINISTRATOR) { + * ObjectBuilder.remove((GameObject) node); + * player.removeAttribute("dmc"); for (int i = 3; i >= 0; i--) { + * player.getInventory().add(new Item(6 + (i * 2))); } return true; + * } + */ + player.getPacketDispatch().sendMessage("This is not your cannon."); + return true; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/sorceress/GardenObjectsPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/sorceress/GardenObjectsPlugin.java new file mode 100644 index 000000000..1ef2c51e4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/sorceress/GardenObjectsPlugin.java @@ -0,0 +1,1343 @@ +package core.game.interaction.object.sorceress; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Represents the plugin used for the garden object plugin. + * @author SonicForce41 + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GardenObjectsPlugin extends OptionHandler { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(827); + + /** + * Represents the herbs items used for the elemental garden picking. + */ + private static final int[] HERBS = { 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 2485, 3049, 3051, 199, 201, 203, 205 }; + + /** + * Represents the drinking animation. + */ + private static final Animation DRINK_ANIM = new Animation(5796); + + /** + * Represents the teleport anim. + */ + private static final Animation TELE = new Animation(714); + + /** + * Represents the graphics to use. + */ + private static final Graphics GRAPHICS = new Graphics(111, 100, 1); + + /** + * Represents the picking fruit anim. + */ + private static final Animation PICK_FRUIT = new Animation(2280); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("pick-fruit", this); + ObjectDefinition.setOptionHandler("drink-from", this); + ObjectDefinition.forId(21794).getHandlers().put("option:search", this); + for (HerbDefinition h : HerbDefinition.values()) { + ObjectDefinition.forId(h.getId()).getHandlers().put("option:pick", this); + } + new SqirkJuicePlugin().newInstance(arg); + new OsmanDialogue().init(); + new SqirkMakingDialogue().init(); + PluginManager.definePlugin(new SorceressGardenObject()); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + GameObject object = (GameObject) node; + if (option.equals("pick")) { + final HerbDefinition herbDef = HerbDefinition.forId(object.getId()); + if (herbDef != null) { + handleElementalGarden(player, object, herbDef); + return true; + } + } else if (option.equals("search")) { + if (object.getId() == 21794) { + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("You don't have enough space in your inventory to take a beer glass."); + } else { + player.sendMessage("You take an empty beer glass off the shelves."); + player.getInventory().add(new Item(1919, 1)); + } + } + } else if (option.equals("pick-fruit")) { + final SeasonDefinitions def = SeasonDefinitions.forTreeId(object.getId()); + if (def != null) { + player.lock(); + player.addExtension(LogoutTask.class, new LocationLogoutTask(99, def.getRespawn())); + player.animate(PICK_FRUIT); + player.getSkills().addExperience(Skills.THIEVING, def.getExp(), true); + player.getSkills().addExperience(Skills.FARMING, def.getFarmExp(), true); + GameWorld.getPulser().submit(new Pulse(2, player) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 1) { + player.getInventory().add(new Item(def.getFruitId())); + player.getInterfaceManager().openOverlay(new Component(115)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + } else if (delay == 3) + player.getProperties().setTeleportLocation(def.getRespawn()); + else if (delay == 4) { + player.unlock(); + player.removeExtension(LogoutTask.class); + player.getPacketDispatch().sendMessage("An elemental force emanating from the garden teleports you away."); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeOverlay(); + player.unlock(); + return true; + } + delay++; + return false; + } + }); + } + } else if (option.equals("drink-from")) { + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.animate(DRINK_ANIM); + break; + case 4: + player.graphics(GRAPHICS); + break; + case 5: + player.animate(TELE); + break; + case 6: + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 7: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + break; + case 9: + player.getProperties().setTeleportLocation(new Location(3321, 3141, 0)); + break; + case 11: + player.unlock(); + player.animate(new Animation(-1)); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeOverlay(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + return true; + } + return false; + } + }); + } + return true; + } + + /** + * Method used to handle the elemental garden picking. + * @param player the player. + * @param object the object. + * @param herbDef the herbdef. + */ + private void handleElementalGarden(final Player player, GameObject object, final HerbDefinition herbDef) { + player.lock(); + player.addExtension(LogoutTask.class, new LocationLogoutTask(99, herbDef.getRespawn())); + player.animate(ANIMATION); + player.getSkills().addExperience(Skills.FARMING, herbDef.getExp(), true); + GameWorld.getPulser().submit(new Pulse(2, player) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 1) { + player.getInventory().add(new Item(HERBS[RandomFunction.random(0, HERBS.length - 1)], + (1))); + player.getInventory().add(new Item(HERBS[RandomFunction.random(0, HERBS.length - 1)], + (1))); + player.getPacketDispatch().sendMessage("You pick up a herb."); + player.getInterfaceManager().openOverlay(new Component(115)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + } else if (delay == 3) + player.getProperties().setTeleportLocation(Location.create(herbDef.getRespawn())); + else if (delay == 4) { + player.unlock(); + player.getPacketDispatch().sendMessage("An elemental force emanating from the garden teleports you away."); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeOverlay(); + player.removeExtension(LogoutTask.class); + player.unlock(); + return true; + } + delay++; + return false; + } + }); + } + + /** + * Represents the herb definitions. + * @author SonicForce41 + * @version 1.0 + */ + public enum HerbDefinition { + WINTER(21671, 30, new Location(2907, 5470, 0)), SPRING(21668, 40, new Location(2916, 5473, 0)), AUTUMN(21670, 50, new Location(2913, 5467, 0)), SUMMER(21669, 60, new Location(2910, 5476, 0)); + + /** + * Represents the id. + */ + private int id; + + /** + * Represents the experience. + */ + private double exp; + + /** + * Represents the respawn location. + */ + private Location respawn; + + /** + * Constructs a new {@code GardenObjectsPlugin} {@code Object}. + * @param id the id. + * @param exp the exp. + * @param respawn the respawn. + */ + HerbDefinition(int id, double exp, Location respawn) { + this.id = id; + this.exp = exp; + this.respawn = respawn; + } + + /** + * Gets the exp + * @return the Exp + */ + public double getExp() { + return exp; + } + + /** + * Gets the Id + * @return the Id + */ + public int getId() { + return id; + } + + /** + * Gets the respawn Location + * @return the Location. + */ + public Location getRespawn() { + return respawn; + } + + /** + * Gets the herb definition by the id. + * @param id the objectId + * @return the definition. + */ + public static HerbDefinition forId(int id) { + for (HerbDefinition def : HerbDefinition.values()) { + if (def.getId() == id) { + return def; + } + } + return null; + } + } + + /** + * Represents the season definitions. + * @author SonicForce41 + * @version 1.0 + */ + public enum SeasonDefinitions { + WINTER(21769, 1, 30, 70.0, 10847, 10851, 5, 0, 10, 350, 21709, new Location(2907, 5470, 0)), SPRING(21767, 25, 40, 337.5, 10844, 10848, 4, 1, 20, 1350, 21753, new Location(2916, 5473, 0)), AUTUMN(21768, 45, 50, 783.3, 10846, 10850, 3, 2, 30, 2350, 21731, new Location(2913, 5467, 0)), SUMMER(21766, 65, 60, 1500, 10845, 10849, 2, 3, 40, 3000, 21687, new Location(2910, 5476, 0)); + + /** + * The treeId + */ + private int treeId; + + /** + * The level + */ + private int level; + + /** + * The farming experience recieved from picking + */ + private double farmExp; + + /** + * The thieving experience recieved from picking + */ + private double treeExp; + + /** + * The fruitId id + */ + private int fruitId; + + /** + * The juice id + */ + private int juiceId; + + /** + * The fruit amt + */ + private int fruitAmt; + + /** + * The boost + */ + private int boost; + + /** + * The energy + */ + private int energy; + + /** + * The experience recieved from osman + */ + private double osmanExp; + + /** + * The gate id + */ + private int gateId; + + /** + * The respawn location + */ + private Location respawn; + + /** + * Constructs a new {@code GardenObjectsPlugin.java} {@code Object}. + * @param treeId the tree id. + * @param level the level. + * @param farmExp the farm exp. + * @param treeExp the tree exp. + * @param fruitId the fruit id. + * @param juiceId the juice id. + * @param fruitAmt the fruit amt. + * @param boost the boost. + * @param energy the energy. + * @param osmanExp the osman exp. + * @param gateId the gate id. + * @param respawn the respawn. + */ + SeasonDefinitions(int treeId, int level, double farmExp, double treeExp, int fruitId, int juiceId, int fruitAmt, int boost, int energy, double osmanExp, int gateId, Location respawn) { + this.treeId = treeId; + this.level = level; + this.farmExp = farmExp; + this.treeExp = treeExp; + this.fruitId = fruitId; + this.juiceId = juiceId; + this.fruitAmt = fruitAmt; + this.boost = boost; + this.energy = energy; + this.osmanExp = osmanExp; + this.gateId = gateId; + this.respawn = respawn; + } + + /** + * Gets the theiving boost + * @return the boost + */ + public int getBoost() { + return boost; + } + + /** + * Gets the run energy restoring + * @return the energy + */ + public int getEnergy() { + return energy; + } + + /** + * Gets the exp from tree + * @return the treeExp + */ + public double getExp() { + return treeExp; + } + + /** + * Gets the farmExp + * @return the farmExp + */ + public double getFarmExp() { + return farmExp; + } + + /** + * Gets the fruid amt + * @return the fruitAmt + */ + public int getFruitAmt() { + return fruitAmt; + } + + /** + * Gets the fruit Id + * @return the fruitId + */ + public int getFruitId() { + return fruitId; + } + + /** + * Gets the gate Id + * @return the gateId + */ + public int getGateId() { + return gateId; + } + + /** + * Gets the juice Id + * @return the juiceId + */ + public int getJuiceId() { + return juiceId; + } + + /** + * Gets the level + * @return the Level + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience recieved from osman + * @return the osmanExp + */ + public double getOsmanExp() { + return osmanExp; + } + + /** + * Gets the respawn location + * @return the respawn Location + */ + public Location getRespawn() { + return respawn; + } + + /** + * Gets the treeId + * @return the treeId + */ + public int getTreeId() { + return treeId; + } + + /** + * Gets the def by the fruit id. + * @param fruitId the fruit id. + * @return the definition. + */ + public static SeasonDefinitions forFruitId(int fruitId) { + for (SeasonDefinitions def : SeasonDefinitions.values()) { + if (def == null) + continue; + if (fruitId == def.getFruitId()) + return def; + } + return null; + } + + /** + * Gets the def by the gate Id. + * @param gateId the gateId + * @return the def. + */ + public static SeasonDefinitions forGateId(int gateId) { + for (SeasonDefinitions def : SeasonDefinitions.values()) { + if (gateId == def.getGateId()) + return def; + } + return null; + } + + /** + * Gets the def by the juice id. + * @param juiceId the juice id. + * @return the def. + */ + public static SeasonDefinitions forJuiceId(int juiceId) { + for (SeasonDefinitions def : SeasonDefinitions.values()) { + if (def == null) + continue; + if (juiceId == def.getJuiceId()) + return def; + } + return null; + } + + /** + * Gets the season def by the tree id. + * @param treeId the tree id. + * @return the def. + */ + public static SeasonDefinitions forTreeId(int treeId) { + for (SeasonDefinitions def : SeasonDefinitions.values()) { + if (def == null) + continue; + if (treeId == def.getTreeId()) + return def; + } + return null; + } + } + + /** + * Use with Plugin for Sq'irk Juice making + * @author SonicForce41 + */ + public static final class SqirkJuicePlugin extends UseWithHandler { + + /** + * The crushing an item with pestle and mortar animation. + */ + private static final Animation CRUSH_ITEM = new Animation(364); + + public SqirkJuicePlugin() { + super(10844, 10845, 10846, 10847); + } + + @Override + public boolean handle(NodeUsageEvent event) { + Item item = event.getUsedItem(); + Item with = event.getBaseItem(); + Player player = event.getPlayer(); + SeasonDefinitions def = SeasonDefinitions.forFruitId(item.getId()); + if (item == null || with == null || player == null || def == null) + return true; + int amt = player.getInventory().getAmount(item); + if (!player.getInventory().containItems(1919)) { + player.getDialogueInterpreter().open(43382, 0); + return true; + } + if (amt < def.getFruitAmt()) { + player.getDialogueInterpreter().open(43382, 1, item.getId()); + return true; + } + player.animate(CRUSH_ITEM); + player.getSkills().addExperience(Skills.COOKING, 5, true); + player.getInventory().remove(new Item(item.getId(), def.getFruitAmt())); + player.getInventory().remove(new Item(1919)); + player.getInventory().add(new Item(def.getJuiceId())); + player.getDialogueInterpreter().sendDialogue("You squeeze " + def.getFruitAmt() + " sq'irks into an empty glass."); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(233, ITEM_TYPE, this); + return this; + } + + } + + /** + * Represents the dialougue of the osman NPC. + * @author 'Vexia + * @author SonicForce41 + * @date 31/12/2013 + */ + public static final class OsmanDialogue extends DialoguePlugin { + + /** + * Represents the key print item. + */ + private static final Item KEY_PRINT = new Item(2423); + + /** + * Represents the bronze bar item. + */ + private static final Item BRONZE_BAR = new Item(2349); + + /** + * Represents the rope item. + */ + private static final Item ROPE = new Item(954); + + /** + * Represents the pink skirt item. + */ + private static final Item SKIRT = new Item(1013); + + /** + * Represents the yellow wig item. + */ + private static final Item YELLOW_WIG = new Item(2419); + + /** + * Represents the skin paste item. + */ + private static final Item PASTE = new Item(2424); + + /** + * Represents the juices. + */ + private static final int[] JUICES = new int[] { 10848, 10849, 10850, 10851 }; + + /** + * Represents the fruits. + */ + private static final int[] FRUITS = new int[] { 10844, 10845, 10846, 10847 }; + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Represents the count of materials you have gathered. + */ + private int itemCount; + + /** + * Constructs a new {@code OsmanDialogue} {@code Object}. + */ + public OsmanDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code OsmanDialogue} {@code Object}. + * @param player the Player + */ + public OsmanDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new OsmanDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + quest = player.getQuestRepository().getQuest("Prince Ali Rescue"); + switch (quest.getStage(player)) { + case 100: + interpreter.sendDialogues(player, null, "I'd like to talk about sq'irks."); + stage = 0; + return true; + case 60: + interpreter.sendDialogues(npc, null, "The prince is safe on his way home with Leela.", "You can pick up your payment from the chancellor."); + stage = 0; + return true; + case 40: + case 50: + interpreter.sendDialogues(npc, null, "Speak to Leela for any further instructions."); + stage = 0; + break; + case 30: + interpreter.sendDialogues(player, null, "Can you tell me what I still need to get?"); + stage = 0; + break; + case 20: + if (!player.getInventory().containsItem(KEY_PRINT)) { + interpreter.sendDialogues(player, null, "Can you tell me what I need to get?"); + } else if (!player.getInventory().containsItem(BRONZE_BAR) && player.getInventory().containsItem(KEY_PRINT)) { + interpreter.sendDialogues(npc, null, "Good, you have the print of the key. Get a bar of", "bronze, too, and I can get the key mad."); + stage = 70; + } else { + interpreter.sendDialogues(npc, null, "Well done; we can make the key now."); + stage = 80; + } + return true; + case 10: + interpreter.sendDialogues(player, null, "The chancellor trusts me. I have come for instructions."); + break; + case 0: + interpreter.sendDialogues(player, null, "I'd like to talk about sq'irks."); + break; + default: + break; + } + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (quest.getStage(player)) { + case 100: + switch (stage) { + default: + handleSqirks(buttonId); + break; + } + break; + case 60: + end(); + break; + case 40: + case 50: + end(); + break; + case 30: + switch (stage) { + case 82: + end(); + break; + case 0: + interpreter.sendDialogues(npc, null, "You can collect the key from Leela."); + stage = 11; + break; + case 11: + if (player.getInventory().containsItem(YELLOW_WIG)) { + interpreter.sendDialogues(npc, null, "The wig you have got, well done."); + itemCount++; + } else { + interpreter.sendDialogues(npc, null, "You need a wig, maybe made from wool. If you find", "someone who can work with wool ask them about it.", "There's a witch nearby may be able to help you dye it."); + } + stage = 12; + break; + case 12: + if (player.getInventory().containsItem(SKIRT)) { + interpreter.sendDialogues(npc, null, "You have got the skirt, good."); + itemCount++; + } else { + interpreter.sendDialogues(npc, null, "You will need to get a pink skirt, same as Keli's."); + } + stage = 13; + break; + case 13: + if (player.getInventory().containsItem(PASTE)) { + interpreter.sendDialogues(npc, null, "You have the skin paint, well done. I thought you would", "struggle to make that."); + itemCount++; + } else { + interpreter.sendDialogues(npc, null, "We still need something to colour the Prince's skin", "lighter. There's a witch close to here. She knows about", "many things. She may know some way to make the", "skin lighter."); + } + stage = itemCount == 3 ? 14 : 15; + break; + case 14: + interpreter.sendDialogues(npc, null, "You do have everything for the disguise."); + stage = 15; + break; + case 15: + if (player.getInventory().containsItem(ROPE)) { + interpreter.sendDialogues(npc, null, "You have the rope I see, to tie up Keli. That will be the", "most dangerous part of the plan."); + stage = 16; + } else { + interpreter.sendDialogues(npc, null, "You will still need some rope to tie up Keli, of course. I", "heard that there's a good rope maker around here."); + stage = 16; + } + break; + case 16: + end(); + break; + case 20: + interpreter.sendDialogues(npc, null, "Yes, that is most important. There is no way you can", "get the real key. It is on a chain around Keli's neck.", "Almost impossible to steal."); + stage = 21; + break; + case 21: + end(); + break; + } + break; + case 0: + switch (stage) { + default: + handleSqirks(buttonId); + break; + } + break; + case 20: + switch (stage) { + case 80: + interpreter.sendDialogue("Osman takes the key imprint and the bronze bar."); + stage = 81; + break; + case 81: + if (player.getInventory().remove(BRONZE_BAR) && player.getInventory().remove(KEY_PRINT)) { + interpreter.sendDialogues(npc, null, "Pick the key up from Leela."); + quest.setStage(player, 30); + stage = 82; + } + break; + case 82: + end(); + break; + case 70: + interpreter.sendDialogues(player, null, "I will get one and come back."); + stage = 71; + break; + case 71: + end(); + break; + case 0: + interpreter.sendDialogues(npc, null, "A print of the key in soft clay and a bronze bar.", "Then, collect the key from Leela."); + stage = 1; + break; + case 1: + interpreter.sendDialogues(npc, null, "When you have the full disguise talk to", "Leela and she will help you with the rest."); + stage = 2; + break; + case 2: + end(); + break; + case 10: + interpreter.sendDialogues(npc, null, "The prince is guarded by some stupid guards and a", "clever woman. The woman is our only way to get the", "prince out. Only she can walk freely about the area."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, null, "I think you will need to tie her up. One coil of rope", "should do for that. Then, disguise the prince as her to", "get him out without suspicion."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(player, null, "How good must the disguise be?"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, null, "Only enough to fool the guards at a distance. Get a", "skirt like hers. Same colour, same style. We will only", "have a short time."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, null, "Get a blonde wig, too. that is up to you to make or", "find. Something to colour the skin of the prince."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, null, "My daughter and top spy, Leela, can help you. She has", "sent word that she has discovered where they are", "keeping the prince."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, null, "It's near Draynor Village. She is lurking somewhere", "near there now."); + stage = 17; + break; + case 17: + quest.setStage(player, 20); + interpreter.sendOptions("Select an Option", "Explain the first thing again.", "What is the second thing you need?", "Okay, I better go find some things."); + stage = 50; + break; + case 20: + interpreter.sendDialogues(npc, null, "We need the key, or we need a copy made. If you can", "get some soft clay then you can copy the key..."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, null, "...If you can convince Lady Keli to show it to you", "for a moment. She is very boastful.", "It should not be too hard."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, null, "Bring the imprint to me, with a bar of bronze."); + stage = 23; + break; + case 23: + quest.setStage(player, 20); + interpreter.sendOptions("Select an Option", "What is the first thing I must do?", "What exactly is the second thing you need?", "Okay, I better go find some things."); + stage = 24; + break; + case 24: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "What is the first thing I must do?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, null, "What exactly is the second thing I must do?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, null, "Okay, I better go find some things."); + stage = 25; + break; + } + break; + case 25: + interpreter.sendDialogues(npc, null, "May good luck travel with you. Don't forget to find", "Leela. It can't be done without her help."); + stage = 26; + break; + case 26: + end(); + break; + case 50: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Explain the first thing again."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, null, "What is th second thing you need?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, null, "Okay, I better go find some things."); + stage = 25; + break; + } + break; + } + break; + case 10: + switch (stage) { + case 0: + interpreter.sendDialogues(npc, null, "Our prince is captive by the Lady Keli. We just need", "to make the rescue. There are two things we need", "you to do."); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "What is the first thing I must do?", "What is the second thing you need?"); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "What is the first thing I must do?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, null, "What is the second thing you need?"); + stage = 20; + break; + } + break; + case 10: + interpreter.sendDialogues(npc, null, "The prince is guarded by some stupid guards and a", "clever woman. The woman is our only way to get the", "prince out. Only she can walk freely about the area."); + stage = 11; + break; + case 11: + interpreter.sendDialogues(npc, null, "I think you will need to tie her up. One coil of rope", "should do for that. Then, disguise the prince as her to", "get him out without suspicion."); + stage = 12; + break; + case 12: + interpreter.sendDialogues(player, null, "How good must the disguise be?"); + stage = 13; + break; + case 13: + interpreter.sendDialogues(npc, null, "Only enough to fool the guards at a distance. Get a", "skirt like hers. Same colour, same style. We will only", "have a short time."); + stage = 14; + break; + case 14: + interpreter.sendDialogues(npc, null, "Get a blonde wig, too. that is up to you to make or", "find. Something to colour the skin of the prince."); + stage = 15; + break; + case 15: + interpreter.sendDialogues(npc, null, "My daughter and top spy, Leela, can help you. She has", "sent word that she has discovered where they are", "keeping the prince."); + stage = 16; + break; + case 16: + interpreter.sendDialogues(npc, null, "It's near Draynor Village. She is lurking somewhere", "near there now."); + stage = 17; + break; + case 17: + quest.setStage(player, 20); + interpreter.sendOptions("Select an Option", "Explain the first thing again.", "What is the second thing you need?", "Okay, I better go find some things."); + stage = 50; + break; + case 20: + interpreter.sendDialogues(npc, null, "We need the key, or we need a copy made. If you can", "get some soft clay then you can copy the key..."); + stage = 21; + break; + case 21: + interpreter.sendDialogues(npc, null, "...If you can convince Lady Keli to show it to you", "for a moment. She is very boastful.", "It should not be too hard."); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, null, "Bring the imprint to me, with a bar of bronze."); + stage = 23; + break; + case 23: + quest.setStage(player, 20); + interpreter.sendOptions("Select an Option", "What is the first thing I must do?", "What exactly is the second thing you need?", "Okay, I better go find some things."); + stage = 24; + break; + case 24: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "What is the first thing I must do?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, null, "What exactly is the second thing I must do?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, null, "Okay, I better go find some things."); + stage = 25; + break; + } + break; + case 25: + interpreter.sendDialogues(npc, null, "May good luck travel with you. Don't forget to find", "Leela. It can't be done without her help."); + stage = 26; + break; + case 26: + end(); + break; + } + default: + break; + } + return true; + } + + /** + * Method used to handle the sqirk juice dials. + * @param buttonId the buttonId. + */ + public void handleSqirks(int buttonId) { + switch (stage) { + case 0: + if (!hasSqirks()) { + interpreter.sendOptions("Select an Option", "Where do I get sq'irks?", "Why can't you get the sq'irks yourself?", "How should I squeeze the fruit?", "Is there a reward for getting these sq'irks?", "What's so good about sq'irk juice then?"); + stage = 200; + } else { + player(hasSqirkJuice() ? "I have some sq'riks juice for you." : "I have some sq'irks for you."); + stage = 300; + } + break; + case 300: + if (hasSqirkJuice()) { + double exp = getExperience(); + player.getSkills().addExperience(Skills.THIEVING, exp, true); + interpreter.sendDialogue("Osman imparts some Thieving advice to", "you ( " + (exp) + " Thieving experience points )", "as a reward for the sq'irk juice."); + stage = 304; + } else { + npc("Uh, thanks, but is there any chance that you", "could squeeze the fruit into a glass for me?"); + stage = 301; + } + break; + case 301: + interpreter.sendOptions("Select an Option", "How should I squeeze the fruit?", "Can't you do that yourself?"); + stage = 302; + break; + case 302: + switch (buttonId) { + case 1: + player("How should I squeeze the fruit?"); + stage = 130; + break; + case 2: + player("Can't you do that yourself?"); + stage = 303; + break; + } + break; + case 304: + end(); + break; + case 303: + player("I only carry knives or other such devices on me", "when I'm on the job."); + stage = 119; + break; + case 200: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, null, "Where do I get sq'irks?"); + stage = 110; + break; + case 2: + interpreter.sendDialogues(player, null, "Why can't you get the sq'irks yourself?"); + stage = 120; + break; + case 3: + interpreter.sendDialogues(player, null, "How should I squeeze the fruit?"); + stage = 130; + break; + case 4: + interpreter.sendDialogues(player, null, "Is there a reward for getting these sq'irks?"); + stage = 140; + break; + case 5: + interpreter.sendDialogues(player, null, "What's so good about sq'irk juice then?"); + stage = 150; + break; + } + break; + case 110: + npc("There is a sorceress near the south-eastern edge of Al", "Kharid who grows them. Once upon a time, we", "considered each other friends."); + stage = 111; + break; + case 111: + player("What happened?"); + stage = 112; + break; + case 112: + npc("We fell out, and now she won't give me any more", "fruit."); + stage = 113; + break; + case 113: + player("So all I have to do is ask her for some fruit for you?"); + stage = 114; + break; + case 114: + npc("I doubt it will be that easy. She is not renowned for", "her generosity and is very secretive about her garden's", "location."); + stage = 115; + break; + case 115: + player("Oh come on, it should be easy enough to find."); + stage = 116; + break; + case 116: + npc("Her garden has remained hidden even to me - the chief", "spy of Al Kharid. I believe her garden must be hidden", "by magical means."); + stage = 117; + break; + case 117: + player("This should be an interesting task. How many sq'irks do", "you want?"); + stage = 118; + break; + case 118: + npc("I'll reward you for as many as you can get your", "hands on, but could you please squeeze the fruit into a", "glass first?"); + stage = 119; + break; + case 119: + interpreter.sendOptions("Select an Option", "I've another question about sq'irks.", "Thanks for the information."); + stage = 98; + break; + case 98: + switch (buttonId) { + case 1: + interpreter.sendOptions("Select an Option", "Where do I get sq'irks?", "Why can't you get the sq'irks yourself?", "How should I squeeze the fruit?", "Is there a reward for getting these sq'irks?", "What's so good about sq'irk juice then?"); + stage = 200; + break; + case 2: + player("Thanks for the information."); + stage = 99; + break; + } + break; + case 99: + end(); + break; + case 120: + npc("I may have mentioned that I had a falling out with the", "Sorceress. Well, unsurprisingly, she refuses to give me", "any more of her garden's produce."); + stage = 119; + break; + case 130: + npc("Use a pestle and mortar to squeeze the sr'irks. Make", "sure you have an empty glass with you to collect the", "juice."); + stage = 119; + break; + case 140: + npc("Of course there is. I am a generous man. I'll teach", "you the art of Thieving for your troubles."); + stage = 141; + break; + case 141: + player("How much training will you give?"); + stage = 142; + break; + case 142: + npc("That depends on the quantity and ripeness of the", "sq'irks you put into the juice."); + stage = 143; + break; + case 143: + player("That sounds fair enough."); + stage = 119; + break; + case 150: + npc("Ah it's sweet, sweet nectar for a thief or spy; it makes", "light fingers lighter, fleet feet flightier and comes in four", "different colours for those who are easily amused."); + stage = 151; + break; + case 151: + interpreter.sendDialogue("Osman starts salivating at the thought of sq'irk juice."); + stage = 152; + break; + case 152: + player("It wouldn't have addictive properties, would it?"); + stage = 153; + break; + case 153: + npc("It only holds power over those with poor self-control,", "something which I have an abundance of."); + stage = 154; + break; + case 154: + player("I see."); + stage = 119; + break; + } + } + + /** + * Gets the experience the player can recieve. + * @return the experience. + */ + public double getExperience() { + double total = 0; + for (int juiceId : JUICES) { + SeasonDefinitions def = SeasonDefinitions.forJuiceId(juiceId); + if (def == null) { + continue; + } + int amount = player.getInventory().getAmount(new Item(juiceId)); + total += (amount * def.getOsmanExp()); + player.getInventory().remove(new Item(juiceId, amount)); + } + player.getInventory().refresh(); + return total; + } + + /** + * Checks wether the Player has sq'irk. + * @return {@code True}: Player has sq'irk. + */ + public boolean hasSqirkFruit() { + for (int i : FRUITS) { + if (player.getInventory().contains(i, 1)) { + return true; + } + } + return false; + } + + /** + * Checks wether the Player has sq'irk juice + * @return {@code True}: Player has sq'irk juice. + */ + public boolean hasSqirkJuice() { + for (int i : JUICES) { + if (player.getInventory().contains(i, 1)) { + return true; + } + } + return false; + } + + /** + * Checks wether the Player has sq'irks (fruit/juice). + * @return {@code True}: Player has either a fruit or squeezed juice. + */ + public boolean hasSqirks() { + return hasSqirkFruit() || hasSqirkJuice(); + } + + @Override + public int[] getIds() { + return new int[] { 924, 5282 }; + } + } + + /** + * Dialogue for Sqirk making + * @author SonicForce41 + */ + public class SqirkMakingDialogue extends DialoguePlugin { + + private int dialogueId; + + private SeasonDefinitions definition; + + /** + * Constructs a new {@code SqirkMakingDialogue.java} {@code Object}. + */ + public SqirkMakingDialogue() { + + } + + /** + * Constructs a new {@code SqirkMakingDialogue.java} {@code Object}. + * @param player the Player + */ + public SqirkMakingDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 43382 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (dialogueId) { + case 0: + end(); + break; + case 1: + switch (stage) { + case 0: + interpreter.sendDialogue("You need " + definition.getFruitAmt() + " sq'irks of this kind to fill a glass of juice."); + stage = 1; + break; + case 1: + end(); + break; + } + break; + } + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SqirkMakingDialogue(player); + } + + @Override + public boolean open(Object... args) { + dialogueId = (int) args[0]; + switch (dialogueId) { + case 0: + interpreter.sendDialogues(player, FacialExpression.THINKING, "I should get an empty beer glass to", "hold the juice before I squeeze the fruit."); + break; + case 1: + definition = SeasonDefinitions.forFruitId((int) args[1]); + if (definition == null) + end(); + interpreter.sendDialogues(player, FacialExpression.THINKING, "I think I should wait till I have", "enough fruits to make a full glass."); + break; + } + stage = 0; + return true; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/sorceress/SorceressGardenObject.java b/Server/src/main/java/Server/core/game/interaction/object/sorceress/SorceressGardenObject.java new file mode 100644 index 000000000..e5e45d58f --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/sorceress/SorceressGardenObject.java @@ -0,0 +1,40 @@ +package core.game.interaction.object.sorceress; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Plugin; + +/** + * Hanldes the sorceress garden gates. + * @author 'Vexia + */ +public class SorceressGardenObject extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + GardenObjectsPlugin.SeasonDefinitions def = GardenObjectsPlugin.SeasonDefinitions.forGateId(((GameObject) node).getId()); + if (def != null) { + if (player.getSkills().getStaticLevel(Skills.THIEVING) < def.getLevel()) { + player.getDialogueInterpreter().sendItemMessage(10692, "You need Thieving level of " + def.getLevel() + " to pick the lock of this gate."); + return true; + } + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + } + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(21709).getHandlers().put("option:open", this); + ObjectDefinition.forId(21753).getHandlers().put("option:open", this); + ObjectDefinition.forId(21731).getHandlers().put("option:open", this); + ObjectDefinition.forId(21687).getHandlers().put("option:open", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java b/Server/src/main/java/Server/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java new file mode 100644 index 000000000..216f006c2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/wildyditch/WildernessDitchPlugin.java @@ -0,0 +1,74 @@ +package core.game.interaction.object.wildyditch; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.interaction.MovementPulse; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the plugin to handle the crossing. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WildernessDitchPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(23271).getHandlers().put("option:cross", this); + PluginManager.definePlugin(new WildernessInterfacePlugin()); + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + if (player.getLocation().getDistance(node.getLocation()) < 3) { + handleDitch(player, node); + } else { + player.getPulseManager().run(new MovementPulse(player, node) { + @Override + public boolean pulse() { + handleDitch(player, node); + return true; + } + }, "movement"); + } + return true; + } + + /** + * Handles the wilderness ditch jumping. + * @param player The player. + * @param node The ditch object. + */ + public void handleDitch(final Player player, Node node) { + player.faceLocation(node.getLocation()); + GameObject ditch = (GameObject) node; + player.setAttribute("wildy_ditch", ditch); + if(!player.isArtificial()) { + if (ditch.getRotation() % 2 == 0) { + if (player.getLocation().getY() <= node.getLocation().getY()) { + player.getInterfaceManager().open(new Component(382)); + return; + } + } else { + if (player.getLocation().getX() > node.getLocation().getX()) { + player.getInterfaceManager().open(new Component(382)); + return; + } + } + } + WildernessInterfacePlugin.handleDitch(player); + } + + @Override + public boolean isWalk() { + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.java b/Server/src/main/java/Server/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.java new file mode 100644 index 000000000..718d3220b --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/object/wildyditch/WildernessInterfacePlugin.java @@ -0,0 +1,74 @@ +package core.game.interaction.object.wildyditch; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the wilderness interface plugin. + * @author Emperor + * @version 1.0 + */ +public final class WildernessInterfacePlugin extends ComponentPlugin { + + /** + * The animation. + */ + private static final Animation ANIMATION = Animation.create(6132); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(382, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + player.getInterfaceManager().close(); + if (button != 18) { + return true; + } + handleDitch(player); + return true; + } + + /** + * Method used to handle the ditch interface. + * @param player the player. + */ + public static void handleDitch(final Player player) { + GameObject ditch = player.getAttribute("wildy_ditch"); + if (ditch == null) { + return; + } + player.removeAttribute("wildy_ditch"); + Location l = ditch.getLocation(); + int x = player.getLocation().getX(); + int y = player.getLocation().getY(); + if (ditch.getRotation() % 2 == 0) { + if (y <= l.getY()) { + ForceMovement.run(player, Location.create(x, l.getY() - 1, 0), Location.create(x, l.getY() + 2, 0), ANIMATION, 20).setEndAnimation(null); + } else { + ForceMovement.run(player, Location.create(x, l.getY() + 2, 0), Location.create(x, l.getY() - 1, 0), ANIMATION, 20).setEndAnimation(null); + } + } else { + if (x > l.getX()) { + ForceMovement.run(player, Location.create(l.getX() + 2, y, 0), Location.create(l.getX() - 1, y, 0), ANIMATION, 20).setEndAnimation(null); + } else { + ForceMovement.run(player, Location.create(l.getX() - 1, y, 0), Location.create(l.getX() + 2, y, 0), ANIMATION, 20).setEndAnimation(null); + } + } + player.getAudioManager().send(new Audio(2462, 10, 30)); + /*if (GameWorld.getSettings().isPvp()) { + ActivityManager.register(new BountyHunterActivity(CraterType.MID_LEVEL)); + ActivityManager.register(new BountyHunterActivity(CraterType.HIGH_LEVEL)); + }*/ + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/player/AttackOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/player/AttackOptionPlugin.java new file mode 100644 index 000000000..624a231cd --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/player/AttackOptionPlugin.java @@ -0,0 +1,46 @@ +package core.game.interaction.player; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the attack option plugin handler. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class AttackOptionPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + //Makes sure player uses correct attack styles for lumbridge dummies + if (node.getId() == 4474 && !(player.getSwingHandler(false).getType() == CombatStyle.MAGIC)){ player.sendMessage("You can only attack this with magic."); return true; } + if (node.getId() == 7891 && !(player.getSwingHandler(false).getType() == CombatStyle.MELEE)){ player.sendMessage("You must use the training sword to attack this."); return true; } + player.attack(node); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + Option._P_ATTACK.setHandler(this); + NPCDefinition.setOptionHandler("attack", this); + return this; + } + + @Override + public boolean isDelayed(Player player) { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/player/ExamineOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/player/ExamineOptionPlugin.java new file mode 100644 index 000000000..6c31d18c3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/player/ExamineOptionPlugin.java @@ -0,0 +1,32 @@ +package core.game.interaction.player; + +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.interaction.inter.PlayerExamineInterfacePlugin; + +/** + * Package -> core.game.interaction.player + * Created on -> 9/13/2016 @7:53 AM for 530 + * + * @author Ethan Kyle Millard + */ +@Initializable +public class ExamineOptionPlugin extends OptionHandler { + @Override + public Plugin newInstance(Object arg) throws Throwable { + Option._P_EXAMINE.setHandler(this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + PlayerExamineInterfacePlugin component = new PlayerExamineInterfacePlugin(); + component.prepareInterface(player, (Player) node); + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/interaction/player/FollowOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/player/FollowOptionPlugin.java new file mode 100644 index 000000000..bf8de8f96 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/player/FollowOptionPlugin.java @@ -0,0 +1,44 @@ +package core.game.interaction.player; + +import core.game.interaction.DestinationFlag; +import core.game.interaction.MovementPulse; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to start following a node. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FollowOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + Option._P_FOLLOW.setHandler(this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + final Player target = ((Player) node); + player.getPulseManager().run(new MovementPulse(player, target, DestinationFlag.FOLLOW_ENTITY) { + @Override + public boolean pulse() { + player.face(target); + return false; + } + + @Override + public void stop() { + super.stop(); + mover.face(null); + } + }, "movement"); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/player/LoginValidationPlugin.java b/Server/src/main/java/Server/core/game/interaction/player/LoginValidationPlugin.java new file mode 100644 index 000000000..767f81a79 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/player/LoginValidationPlugin.java @@ -0,0 +1,93 @@ +package core.game.interaction.player; + +import java.util.concurrent.TimeUnit; + +import core.game.content.activity.ActivityManager; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.SystemManager; +import core.game.world.GameWorld; +import core.plugin.Plugin; +import core.plugin.PluginManifest; +import core.plugin.Initializable; +import core.plugin.PluginType; + +/** + * Validates a player login. + * @author Emperor + * @author Vexia + * + */ +@PluginManifest(type = PluginType.LOGIN) +@Initializable +public final class LoginValidationPlugin implements Plugin { + + /** + * Represents the quest point items to remove. + */ + private static final Item[] QUEST_ITEMS = new Item[] { new Item(9813), new Item(9814)}; + + /** + * Constructs a new {@Code LoginValidationPlugin} {@Code Object} + */ + public LoginValidationPlugin() { + /* + * empty. + */ + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(final Player player) throws Throwable { + player.unlock(); + if (player.isArtificial()) { + return this; + } + if (!SystemManager.getSystemConfig().validLogin(player)) { + return this; + } + if (GameWorld.getSettings().isDevMode()) { + player.toggleDebug(); + } + if (player.getAttribute("fc_wave", -1) > -1) { + ActivityManager.start(player, "fight caves", true); + } + if (player.getAttribute("falconry", false)) { + ActivityManager.start(player, "falconry", true); + } + player.getConfigManager().set(678, 5);// RFD + if (player.getSavedData().getQuestData().getDragonSlayerAttribute("repaired")) { + player.getConfigManager().set(177, 1967876); + } + if (player.getSavedData().getGlobalData().getLootShareDelay() < System.currentTimeMillis() && player.getSavedData().getGlobalData().getLootShareDelay() != 0L) { + player.getGlobalData().setLootSharePoints((int) (player.getGlobalData().getLootSharePoints() - player.getGlobalData().getLootSharePoints() * 0.10)); + } else { + player.getSavedData().getGlobalData().setLootShareDelay(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)); + } + checkQuestPointsItems(player); + return this; + } + + /** + * Method used to check for the quest point cape items. + * @param player the player. + */ + private static void checkQuestPointsItems(final Player player) { + if (!player.getQuestRepository().hasCompletedAll() && player.getEquipment().contains(9813, 1) || player.getEquipment().contains(9814, 1)) { + for (Item i : QUEST_ITEMS) { + if (player.getEquipment().remove(i)) { + player.getDialogueInterpreter().sendItemMessage(i, "As you no longer have completed all the quests, your " + i.getName() + " unequips itself to your " + (player.getInventory().freeSlots() < 1 ? "bank" : "inventory") + "!"); + if (player.getInventory().freeSlots() < 1) { + player.getBank().add(i); + } else { + player.getInventory().add(i); + } + } + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/interaction/player/PeltOptionPlugin.kt b/Server/src/main/java/Server/core/game/interaction/player/PeltOptionPlugin.kt new file mode 100644 index 000000000..a0e87b7fe --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/player/PeltOptionPlugin.kt @@ -0,0 +1,83 @@ +package core.game.interaction.player + +import core.game.interaction.Interaction +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.impl.Projectile +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.path.Pathfinder +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.tools.stringtools.colorize + +val snowball = Item(Items.SNOWBALL_11951) +val THROW_ANIMATION = Animation(7530) +val THROW_GRAPHICS = Graphics(860) + +@Initializable +class PeltOptionPlugin : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + val other = node?.asPlayer() + val delay = 41 + val speed = 60 + val distance = Location.getDistance(player.location, other?.getLocation()).toInt() + val projectileSpeed = delay + speed + distance * 5 + val hitDelay = (projectileSpeed * .02857).toInt() + + if(!Pathfinder.find(player,other,false, Pathfinder.PROJECTILE).isSuccessful){ + player.dialogueInterpreter.sendDialogue("You can't reach them!") + return true + } + + if(player.inventory.remove(snowball) || player.equipment.remove(snowball)){ + player.lock() + GameWorld.Pulser.submit(object : Pulse(hitDelay + 1){ + override fun pulse(): Boolean { + other?.animator?.graphics(Graphics(1282)) + return true + } + }) + GameWorld.Pulser.submit(object : Pulse() { + var counter = 0 + override fun pulse(): Boolean { + when (counter++) { + 0 -> { + player.lock() + player.face(other) + player.animator.forceAnimation(THROW_ANIMATION) + } + 1 -> { + Projectile.create(player, other, 861, 30, 10).send() + player.face(player) + player.unlock() + } + 5 -> other?.sendMessage(colorize("%R${player.username} has pelted you with a snowball.")) + 6 -> return true + } + return false + } + }) + } else { + player.sendMessage("You have no more snowballs.") + Interaction.sendOption(player, 0, "null") + } + return true + } + + override fun isWalk(): Boolean { + return false + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/interaction/player/RequestOptionPlugin.java b/Server/src/main/java/Server/core/game/interaction/player/RequestOptionPlugin.java new file mode 100644 index 000000000..6377344b1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/interaction/player/RequestOptionPlugin.java @@ -0,0 +1,30 @@ +package core.game.interaction.player; + +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.RequestType; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the player option interacting. + * @author 'Vexia + */ +@Initializable +public final class RequestOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + Option._P_ASSIST.setHandler(this); + Option._P_TRADE.setHandler(this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getRequestManager().request((Player) node, RequestType.forOption(option)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/Node.java b/Server/src/main/java/Server/core/game/node/Node.java new file mode 100644 index 000000000..5ca1577b4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/Node.java @@ -0,0 +1,269 @@ +package core.game.node; + +import core.game.interaction.DestinationFlag; +import core.game.interaction.Interaction; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.tools.StringUtils; + +/** + * Represents a node which is anything that is interactable in Keldagrim. + * @author Emperor + */ +public abstract class Node { + + /** + * The name of the node; + */ + protected String name; + + /** + * The location. + */ + protected Location location; + + /** + * The index of the node. + */ + protected int index; + + /** + * The node's direction. + */ + protected Direction direction; + + /** + * The node's size. + */ + protected int size = 1; + + /** + * If the node is active. + */ + protected boolean active = true; + + /** + * The interaction instance. + */ + protected Interaction interaction; + + /** + * The destination flag. + */ + protected DestinationFlag destinationFlag; + + /** + * If the node is renderable. + */ + protected boolean renderable = true; + + /** + * Constructs a new {@code Node} {@code Object}. + * @param name The name. + * @param location The location. + */ + public Node(String name, Location location) { + this.name = name; + this.location = location; + } + + /** + * Casts the npc to a player. + * @return the npc. + */ + public NPC asNpc() { + return (NPC) this; + } + + /** + * Casts the player. + * @return the player. + */ + public Player asPlayer() { + return (Player) this; + } + + /** + * Casts the game object. + * @return the object. + */ + public GameObject asObject() { + return (GameObject) this; + } + + /** + * Casts the item. + * @return the item. + */ + public Item asItem() { + return (Item) this; + } + + /** + * Gets the node id. + * @return the id. + */ + public int getId() { + return this instanceof NPC ? ((NPC) this).getId() : this instanceof GameObject ? ((GameObject) this).getId() : this instanceof Item ? ((Item) this).getId() : -1; + } + + /** + * Gets the center location. + * @return The center location. + */ + public Location getCenterLocation() { + int offset = size >> 1; + return location.transform(offset, offset, 0); + } + + /** + * Gets the name of this node. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Get a formated username. + * @return The username. + */ + public String getUsername() { + return StringUtils.formatDisplayName(name); + } + + /** + * Gets the index. + * @return The index. + */ + public int getIndex() { + return index; + } + + /** + * Sets the index. + * @param index The index to set. + */ + public void setIndex(int index) { + this.index = index; + } + + /** + * Gets the location. + * @return The location. + */ + public Location getLocation() { + return location; + } + + /** + * Sets the location. + * @param location The location to set. + */ + public void setLocation(Location location) { + this.location = location; + } + + /** + * Gets the direction. + * @return The direction. + */ + public Direction getDirection() { + return direction; + } + + /** + * Sets the direction. + * @param direction The direction to set. + */ + public void setDirection(Direction direction) { + this.direction = direction; + } + + /** + * Gets the size. + * @return The size. + */ + public int size() { + return size; + } + + /** + * Sets the size. + * @param size The size to set. + */ + public void setSize(int size) { + this.size = size; + } + + /** + * Gets the active. + * @return The active. + */ + public boolean isActive() { + return active; + } + + /** + * Sets the active. + * @param active The active to set. + */ + public void setActive(boolean active) { + this.active = active; + } + + /** + * Gets the interaction. + * @return The interaction. + */ + public Interaction getInteraction() { + if (interaction != null && !interaction.isInitialized()) { + interaction.setDefault(); + } + return interaction; + } + + /** + * Sets the interaction. + * @param interaction The interaction to set. + */ + public void setInteraction(Interaction interaction) { + this.interaction = interaction; + } + + /** + * Gets the destinationFlag. + * @return The destinationFlag. + */ + public DestinationFlag getDestinationFlag() { + return destinationFlag; + } + + /** + * Sets the destinationFlag. + * @param destinationFlag The destinationFlag to set. + */ + public void setDestinationFlag(DestinationFlag destinationFlag) { + this.destinationFlag = destinationFlag; + } + + /** + * Gets the renderable. + * @return The renderable. + */ + public boolean isRenderable() { + return renderable; + } + + /** + * Sets the renderable. + * @param renderable The renderable to set. + */ + public void setRenderable(boolean renderable) { + this.renderable = renderable; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/Entity.java b/Server/src/main/java/Server/core/game/node/entity/Entity.java new file mode 100644 index 000000000..b6f6348d5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/Entity.java @@ -0,0 +1,859 @@ +package core.game.node.entity; + +import core.game.content.holiday.HolidayEvent; +import core.game.node.entity.skill.Skills; +import core.game.interaction.DestinationFlag; +import core.game.node.Node; +import core.game.node.entity.combat.*; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.impl.*; +import core.game.node.entity.lock.ActionLocks; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.TeleportManager; +import core.game.node.entity.state.EntityState; +import core.game.node.entity.state.StateManager; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.Viewport; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.game.world.map.zone.ZoneMonitor; +import core.game.world.update.UpdateMasks; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +import java.util.HashMap; +import java.util.Map; + +/** + * An entity is a movable node, such as players and NPCs. + * @author Emperor + */ +public abstract class Entity extends Node { + + /** + * The entity's properties. + */ + private final Properties properties = new Properties(this); + + /** + * The entity's update masks. + */ + private final UpdateMasks updateMasks = new UpdateMasks(); + + /** + * The walking queue. + */ + private final WalkingQueue walkingQueue = new WalkingQueue(this); + + /** + * The entity's skills. + */ + private final Skills skills = new Skills(this); + + /** + * The entity's extension classes. + */ + private final Map, Object> extensions = new HashMap, Object>(); + + /** + * The entity's attributes. + */ + private final GameAttributes attributes = new GameAttributes(); + + /** + * The entity's viewport. + */ + private final Viewport viewport = new Viewport(); + + /** + * The pulse manager. + */ + private final PulseManager pulseManager = new PulseManager(); + + /** + * The impact handler. + */ + private final ImpactHandler impactHandler = new ImpactHandler(this); + + /** + * The animator. + */ + private final Animator animator = new Animator(this); + + /** + * The teleporter. + */ + private final TeleportManager teleporter = new TeleportManager(this); + + /** + * The zone monitor. + */ + private final ZoneMonitor zoneMonitor = new ZoneMonitor(this); + + /** + * The state manager. + */ + private final StateManager stateManager = new StateManager(this); + + /** + * The reward locks. + */ + private final ActionLocks locks = new ActionLocks(); + + /** + * If the entity is invisible. + */ + private boolean invisible; + + /** + * Constructs a new {@code Entity} {@code Object}. + * @param name The name of the entity. + * @param location The location. + */ + public Entity(String name, Location location) { + super(name, location); + super.destinationFlag = DestinationFlag.ENTITY; + } + + /** + * Attempts to make the entity move one step (priority order: west, south, + * east, north). + */ + public void moveStep() { + if (locks.isMovementLocked()) { + return; + } + Path path; + if (!(path = Pathfinder.find(this, getLocation().transform(-1, 0, 0), false, Pathfinder.DUMB)).isSuccessful()) { + if (!(path = Pathfinder.find(this, getLocation().transform(0, -1, 0), false, Pathfinder.DUMB)).isSuccessful()) { + if (!(path = Pathfinder.find(this, getLocation().transform(1, 0, 0), false, Pathfinder.DUMB)).isSuccessful()) { + if (!(path = Pathfinder.find(this, getLocation().transform(0, 1, 0), false, Pathfinder.DUMB)).isSuccessful()) { + path = null; + } + } + } + } + if (path != null) { + path.walk(this); + } + } + + /** + * Initializes the entity. + */ + public void init() { + active = true; + } + + /** + * This methods gets called before the {@link #update()} method. + */ + public void tick() { + skills.pulse(); + walkingQueue.update(); + updateMasks.prepare(this); + } + + /** + * Updates the entity, this gets called in a thread pool. + */ + public void update() { + } + + /** + * Resets the entity's update flags, ...
Gets called after + * {@link #update()}. + */ + public void reset() { + updateMasks.reset(); + properties.setTeleporting(false); + } + + /** + * Removes the entity from the world. + */ + public void clear() { + active = false; + viewport.remove(this); + pulseManager.clear(); + } + + /** + * Checks if the entity is in combat. + * @return {@code True} if so. + */ + public boolean inCombat() { + return getAttribute("combat-time", 0L) > System.currentTimeMillis(); + } + + /** + * Fully restores the entity. + */ + public void fullRestore() { + skills.restore(); + } + + /** + * Called when the death task gets submitted. + * @param killer The killer of this entity. + */ + public void commenceDeath(Entity killer) { + if (HolidayEvent.getCurrent() != null) { + HolidayEvent.getCurrent().commenceDeath(killer, this); + } + } + + /** + * Finalizes the death task. + * @param killer The killer of this entity. + */ + public void finalizeDeath(Entity killer) { + skills.restore(); + skills.rechargePrayerPoints(); + impactHandler.getImpactQueue().clear(); + impactHandler.setDisabledTicks(10); + stateManager.reset(); + removeAttribute("combat-time"); + face(null); + if (HolidayEvent.getCurrent() != null) { + HolidayEvent.getCurrent().finalizeDeath(killer, this); + } + //Check if it's a Loar shade and transform back into the shadow version. + if(this.getId() == 1240 || this.getId() == 1241){ + this.asNpc().transform(1240); + } + } + + /** + * Updates the location of an entity. + * @param last the last location. + */ + public void updateLocation(Location last) { + + } + + /** + * Checks if multiway combat zone rules should be ignored. + * @param victim The victim. + * @return {@code True} if this entity can attack regardless of multiway + * combat zone. + */ + public boolean isIgnoreMultiBoundaries(Entity victim) { + return false; + } + + /** + * Checks an impact before receiving it. + */ + public void checkImpact(BattleState state) { + getProperties().getCombatPulse().setLastReceivedAttack(GameWorld.getTicks()); + int ticks = GameWorld.getTicks() - getProperties().getCombatPulse().getLastSentAttack(); + if (ticks > 10 && this instanceof NPC && ((NPC) this).getDefinition().getConfiguration("safespot", false)) { + Pathfinder.find(state.getAttacker(), getLocation()).walk(state.getAttacker()); + Pathfinder.find(state.getVictim(), state.getAttacker().getLocation()).walk(state.getVictim()); + if (ticks > 40) { + state.getAttacker().moveStep(); + state.getAttacker().getProperties().getCombatPulse().stop(); + state.getVictim().moveStep(); + state.getVictim().getProperties().getCombatPulse().stop(); + } + } + } + + /** + * Handles an impact. + * @param entity The entity. + * @param state The battle state. + */ + public void onImpact(final Entity entity, BattleState state) { + if (properties.isRetaliating() && !properties.getCombatPulse().isAttacking() && !getLocks().isInteractionLocked() && properties.getCombatPulse().getNextAttack() < GameWorld.getTicks()) { + if (!getWalkingQueue().hasPath() && !getPulseManager().isMovingPulse() || (this instanceof NPC)) { + properties.getCombatPulse().attack(entity); + } + } + } + + /** + * Handles the first attack. + * @param target the target. + */ + public void onAttack(final Entity target) { + + } + + /** + * Method used to attack a node. + * @param node the node. + */ + public void attack(final Node node) { + getPulseManager().clear("interaction:attack:" + node.hashCode()); + getProperties().getCombatPulse().attack(node); + } + + /** + * Checks if the entity can move to the destination. + * @param destination the destination. + * @return {@code True} if so. + */ + public boolean canMove(Location destination) { + return true; + } + + /** + * Teleports the entity to a location. + * @param location the location. + */ + public void teleport(Location location) { + getProperties().setTeleportLocation(location); + } + + /** + * Teleports the entity. + * @param location the location. + * @param ticks the ticks. + */ + public void teleport(final Location location, int ticks) { + GameWorld.getPulser().submit(new Pulse(ticks, this) { + @Override + public boolean pulse() { + teleport(location); + return true; + } + }); + } + + /** + * Locks the entity. + */ + public void lock() { + locks.lock(); + } + + /** + * Locks the entity from using any actions. + * @param time The time (in game ticks) to lock. + */ + public void lock(int time) { + locks.lock(time); + } + + /** + * Unlocks the default reward locks. + */ + public void unlock() { + locks.unlock(); + } + + /** + * Checks if the entity is using the protection prayer for the given style. + * @param style The combat style. + * @return {@code True} if so. + */ + public abstract boolean hasProtectionPrayer(CombatStyle style); + + /** + * Gets the dragonfire protection value. + * @param fire if a fire attack. + * @return The value. + */ + public abstract int getDragonfireProtection(boolean fire); + + /** + * Checks if this entity is attackable by the attacking entity. + * @param entity The attacking entity. + * @param style The combat style used. + * @return {@code True} if the attacking entity can attack this entity. + */ + public boolean isAttackable(Entity entity, CombatStyle style) { + if (DeathTask.isDead(this)) { + return false; + } + if (!entity.getZoneMonitor().continueAttack(this, style)) { + return false; + } + return true; + } + + /** + * Registers a new graphics update flag to the update masks. + * @param graphics The graphics. + * @return {@code True} if succesful. + */ + public boolean graphics(Graphics graphics) { + return animator.graphics(graphics); + } + + /** + * Registers a new animation update flag to the update masks. + * @param animation The animation. + * @return {@code True} if succesful. + */ + public boolean animate(Animation animation) { + return animator.animate(animation); + } + + /** + * Registers a new graphics update flag. + * @param graphics the graphics. + * @param delay the delay. + * @return {@code True} if so. + */ + public boolean graphics(final Graphics graphics, int delay) { + GameWorld.getPulser().submit(new Pulse(delay, this) { + @Override + public boolean pulse() { + graphics(graphics); + return true; + } + }); + return true; + } + + /** + * Checks if an entity can continue it's attack. + * @param target the target. + * @param style the style. + * @return {@code True} if so. + */ + public boolean continueAttack(Entity target, CombatStyle style) { + return true; + } + + /** + * Registers a new animation update flag to the update masks. + * @param animation The animation. + * @param delay the delay + * @return {@code True} if succesful. + */ + public boolean animate(final Animation animation, int delay) { + GameWorld.getPulser().submit(new Pulse(delay, this) { + @Override + public boolean pulse() { + animate(animation); + return true; + } + }); + return true; + } + + /** + * Sends the impact. + * @param state the state. + */ + public void sendImpact(BattleState state) { + getProperties().getCombatPulse().setLastSentAttack(GameWorld.getTicks()); + } + + /** + * Checks if the target can be selected. + * @param target the target. + * @return {@code True} if so. + */ + public boolean canSelectTarget(Entity target) { + return true; + } + + /** + * Registers a new animation & graphic update flag to the update masks. + * @param animation The animation. + * @param graphics The graphics. + * @return {@code True} if successful. + */ + public boolean visualize(Animation animation, Graphics graphics) { + return animator.animate(animation, graphics); + } + + /** + * Temporarily faces an entity. + * @param entity The entity to face. + * @param ticks The ticks to face the entity. + * @return {@code True} if successful. + */ + public boolean faceTemporary(Entity entity, int ticks) { + return faceTemporary(entity, null, ticks); + } + + /** + * Temporarily faces an entity. + * @param entity The entity to face. + * @param reset The entity to face when the pulse has passed. + * @param ticks The ticks to face the entity. + * @return {@code True} if successful. + */ + public boolean faceTemporary(Entity entity, final Entity reset, int ticks) { + if (face(entity)) { + GameWorld.getPulser().submit(new Pulse(ticks + 1, this) { + @Override + public boolean pulse() { + face(reset); + return true; + } + }); + return true; + } + return false; + } + + /** + * Gets the formatted hit. + * @param state the state. + * @param hit the hit. + * @return {@code True} if so. + */ + public double getFormatedHit(BattleState state, int hit) { + if (state.getAttacker() == null || state.getVictim() == null || state.getStyle() == null) { + return hit; + } + Entity entity = state.getAttacker(); + Entity victim = state.getVictim(); + CombatStyle type = state.getStyle(); + if (state.getArmourEffect() != ArmourSet.VERAC && !entity.isIgnoreProtection(type) && victim.hasProtectionPrayer(type)) { + return hit *= entity instanceof Player ? 0.6 : 0; + } + return hit; + } + + /** + * Checks if this entity ignores protection prayers for the given combat style. + * @param style The combat style used. + * @return {@code True} if the entity can hit through protection prayers. + */ + public boolean isIgnoreProtection(CombatStyle style) { + return false; + } + + /** + * Starts the death for an npc. + * @param killer the killer. + */ + public void startDeath(Entity killer) { + if (zoneMonitor.startDeath(this, killer)) { + DeathTask.startDeath(this, killer); + } + } + + /** + * Casts the player type. + * @return the player. + */ + public Player asPlayer() { + return (Player) this; + } + + /** + * Checks if the entity is instance of a player. + * @return {@code True} if so. + */ + public boolean isPlayer() { + return this instanceof Player; + } + + /** + * Registers a new face entity update flag to the update masks. + * @param entity The entity to face. + * @return {@code True} if succesful. + */ + public abstract boolean face(Entity entity); + + /** + * Registers a new face location update flag to the update masks. + * @param location The location to face. + * @return {@code True} if succesful. + */ + public abstract boolean faceLocation(Location location); + + /** + * Registers a new force chat update flag to the update masks. + * @param string The string. + * @return {@code True} if succesful. + */ + public abstract boolean sendChat(String string); + + /** + * Gets the current combat swing handler. + * @param swing If this method is called when actually performing a combat + * swing. + * @return The current combat swing handler to use. + */ + public abstract CombatSwingHandler getSwingHandler(boolean swing); + + /** + * Checks if the entity is immune to poison. + * @return {@code True} if the entity is immune to poison. + */ + public abstract boolean isPoisonImmune(); + + /** + * Sends the chat on a tick. + * @param string the string. + * @param ticks the ticks. + */ + public void sendChat(final String string, int ticks) { + GameWorld.getPulser().submit(new Pulse(ticks, this) { + @Override + public boolean pulse() { + sendChat(string); + return true; + } + }); + } + + /** + * Gets the level mod. + * @param entity the entity. + * @param victim the victim. + * @return the levelMod. + */ + public double getLevelMod(Entity entity, Entity victim) { + return 0; + } + + /** + * Gets the reward locks. + * @return The reward locks. + */ + public ActionLocks getLocks() { + return locks; + } + + /** + * Gets the client index of the entity. + * @return The client index. + */ + public int getClientIndex() { + return index; + } + + /** + * Gets the properties. + * @return The properties. + */ + public Properties getProperties() { + return properties; + } + + /** + * Gets the updateMasks. + * @return The updateMasks. + */ + public UpdateMasks getUpdateMasks() { + return updateMasks; + } + + /** + * Adds an extension. + * @param clazz The class type. + * @param object The object. + */ + public void addExtension(Class clazz, Object object) { + extensions.put(clazz, object); + } + + /** + * Gets an extension. + * @param clazz The class type. + * @return The object. + */ + @SuppressWarnings("unchecked") + public T getExtension(Class clazz) { + return (T) extensions.get(clazz); + } + + /** + * Gets an extension. + * @param clazz The class type. + * @param fail The object to return if the extension wasn't added. + * @return The object. + */ + @SuppressWarnings("unchecked") + public T getExtension(Class clazz, T fail) { + T extension = (T) extensions.get(clazz); + if (extension == null) { + return fail; + } + return extension; + } + + /** + * Removes the extension. + * @param clazz The class type. + */ + public void removeExtension(Class clazz) { + extensions.remove(clazz); + } + + /** + * Gets the players attributes. + * @return the attributes. + */ + public Map getAttributes() { + return attributes.getAttributes(); + } + + /** + * Sets an attribute value. + * @param key The attribute name. + * @param value The attribute value. + */ + public void setAttribute(String key, Object value) { + attributes.setAttribute(key, value); + } + + /** + * Gets an attribute. + * @param key The attribute name. + * @return The attribute value. + */ + public T getAttribute(String key) { + return attributes.getAttribute(key); + } + + /** + * Increments an attribute + * @param key The attribute name. + */ + public void incrementAttribute(String key) { + incrementAttribute(key, 1); + } + + /** + * Increments an attribute + * @param key The attribute name. + */ + public void incrementAttribute(String key, int amount) { + attributes.setAttribute(key, attributes.getAttribute(key.replace("/save:",""), 0) + amount); + } + + /** + * Gets an attribute. + * @param string The attribute name. + * @param fail The value to return if the attribute is null. + * @return The attribute value, or the fail argument when null. + */ + public T getAttribute(String string, T fail) { + return attributes.getAttribute(string, fail); + } + + /** + * Removes an attribute. + * @param string The attribute name. + */ + public void removeAttribute(String string) { + attributes.removeAttribute(string); + } + + /** + * Gets the game attributes instance. + * @return The game attributes. + */ + public GameAttributes getGameAttributes() { + return attributes; + } + + /** + * Gets the walkingQueue. + * @return The walkingQueue. + */ + public WalkingQueue getWalkingQueue() { + return walkingQueue; + } + + /** + * Gets the viewport. + * @return The viewport. + */ + public Viewport getViewport() { + return viewport; + } + + /** + * Gets the skills. + * @return The skills. + */ + public Skills getSkills() { + return skills; + } + + /** + * Gets the pulseManager. + * @return The pulseManager. + */ + public PulseManager getPulseManager() { + return pulseManager; + } + + /** + * Gets the impactHandler. + * @return The impactHandler. + */ + public ImpactHandler getImpactHandler() { + return impactHandler; + } + + /** + * @return the animator. + */ + public Animator getAnimator() { + return animator; + } + + /** + * Gets the Teleporter + * @return the Teleporter + */ + public TeleportManager getTeleporter() { + return teleporter; + } + + /** + * Gets the zoneMonitor. + * @return The zoneMonitor. + */ + public ZoneMonitor getZoneMonitor() { + return zoneMonitor; + } + + /** + * Gets the stateManager. + * @return The stateManager. + */ + public StateManager getStateManager() { + return stateManager; + } + + /** + * Checks if we have fire resistance. + * @return {@code True} if so. + */ + public boolean hasFireResistance() { + return getAttribute("fire:immune",0) >= GameWorld.getTicks(); + } + + /** + * Checks if the entity is teleblocked. + * @return {@code True} if so. + */ + public boolean isTeleBlocked() { + return stateManager.hasState(EntityState.TELEBLOCK); + } + + /** + * Gets the invisible value. + * @return The invisible. + */ + public boolean isInvisible() { + return invisible; + } + + /** + * Sets the invisible value. + * @param invisible The invisible to set. + */ + public void setInvisible(boolean invisible) { + this.invisible = invisible; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/BattleState.java b/Server/src/main/java/Server/core/game/node/entity/combat/BattleState.java new file mode 100644 index 000000000..39c3d74f0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/BattleState.java @@ -0,0 +1,339 @@ +package core.game.node.entity.combat; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.Ammunition; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.combat.equipment.RangeWeapon; +import core.game.node.entity.combat.equipment.Weapon; + +/** + * Represents an entity's current battle state. + * @author Emperor + */ +public final class BattleState { + + /** + * The entity. + */ + private Entity entity; + + /** + * The victim entity. + */ + private Entity victim; + + /** + * The estimated hit. + */ + private int estimatedHit; + + /** + * The maximum hit. + */ + private int maximumHit; + + /** + * The second estimated hit. + */ + private int secondaryHit = -1; + + /** + * The amount of recoil damage. + */ + private int recoilDamage = -1; + + /** + * The amount of poison damage. + */ + private int poisonDamage = -1; + + /** + * If the victim is frozen. + */ + private boolean frozen; + + /** + * The other targets. + */ + private BattleState[] targets; + + /** + * The weapon used. + */ + private Weapon weapon; + + /** + * The range weapon used. + */ + private RangeWeapon rangeWeapon; + + /** + * The range ammunition used. + */ + private Ammunition ammunition; + + /** + * The magic spell used. + */ + private CombatSpell spell; + + /** + * The combat style used (used for style-switching NPCs). + */ + private CombatStyle style; + + /** + * The active armour set effect. + */ + private ArmourSet armourEffect; + + /** + * Constructs a new {@code BattleState} {@code Object}. + */ + public BattleState() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code BattleState} {@Code Object} + * @param victim The victim entity. + */ + public BattleState(Entity entity, Entity victim) { + this.victim = victim; + this.entity = entity; + } + + /** + * Neutralizes the hits. + */ + public void neutralizeHits() { + if (getEstimatedHit() > 0) { + setEstimatedHit(0); + } + if (getSecondaryHit() > 0) { + setSecondaryHit(0); + } + } + + /** + * @return the victim. + */ + public Entity getVictim() { + return victim; + } + + /** + * @param victim the victim to set. + */ + public void setVictim(Entity victim) { + this.victim = victim; + } + + /** + * Gets the estimatedHit. + * @return The estimatedHit. + */ + public int getEstimatedHit() { + return estimatedHit; + } + + /** + * Sets the estimated hit. + * @param estimatedHit The estimated hit to set. + */ + public void setEstimatedHit(int estimatedHit) { + this.estimatedHit = estimatedHit; + } + + /** + * @return the secondaryHit. + */ + public int getSecondaryHit() { + return secondaryHit; + } + + /** + * @param secondaryHit the secondaryHit to set. + */ + public void setSecondaryHit(int secondaryHit) { + this.secondaryHit = secondaryHit; + } + + /** + * Gets the recoilDamage. + * @return The recoilDamage. + */ + public int getRecoilDamage() { + return recoilDamage; + } + + /** + * Sets the recoilDamage. + * @param recoilDamage The recoilDamage to set. + */ + public void setRecoilDamage(int recoilDamage) { + this.recoilDamage = recoilDamage; + } + + /** + * @return the targets. + */ + public BattleState[] getTargets() { + return targets; + } + + /** + * @param targets the targets to set. + */ + public void setTargets(BattleState[] targets) { + this.targets = targets; + } + + /** + * @return the poisonDamage. + */ + public int getPoisonDamage() { + return poisonDamage; + } + + /** + * @param poisonDamage the poisonDamage to set. + */ + public void setPoisonDamage(int poisonDamage) { + this.poisonDamage = poisonDamage; + } + + /** + * @return the weapon. + */ + public Weapon getWeapon() { + return weapon; + } + + /** + * @param weapon the weapon to set. + */ + public void setWeapon(Weapon weapon) { + this.weapon = weapon; + } + + /** + * @return the spell. + */ + public CombatSpell getSpell() { + return spell; + } + + /** + * @param spell the spell to set. + */ + public void setSpell(CombatSpell spell) { + this.spell = spell; + } + + /** + * Gets the maximumHit. + * @return The maximumHit. + */ + public int getMaximumHit() { + return maximumHit; + } + + /** + * Sets the maximumHit. + * @param maximumHit The maximumHit to set. + */ + public void setMaximumHit(int maximumHit) { + this.maximumHit = maximumHit; + } + + /** + * Gets the rangeWeapon. + * @return The rangeWeapon. + */ + public RangeWeapon getRangeWeapon() { + return rangeWeapon; + } + + /** + * Sets the rangeWeapon. + * @param rangeWeapon The rangeWeapon to set. + */ + public void setRangeWeapon(RangeWeapon rangeWeapon) { + this.rangeWeapon = rangeWeapon; + } + + /** + * Gets the ammunition. + * @return The ammunition. + */ + public Ammunition getAmmunition() { + return ammunition; + } + + /** + * Sets the ammunition. + * @param ammunition The ammunition to set. + */ + public void setAmmunition(Ammunition ammunition) { + this.ammunition = ammunition; + } + + /** + * Gets the frozen. + * @return The frozen. + */ + public boolean isFrozen() { + return frozen; + } + + /** + * Sets the frozen. + * @param frozen The frozen to set. + */ + public void setFrozen(boolean frozen) { + this.frozen = frozen; + } + + /** + * Gets the style. + * @return The style. + */ + public CombatStyle getStyle() { + return style; + } + + /** + * Sets the style. + * @param style The style to set. + */ + public void setStyle(CombatStyle style) { + this.style = style; + } + + /** + * Gets the armourEffect. + * @return The armourEffect. + */ + public ArmourSet getArmourEffect() { + return armourEffect; + } + + /** + * Sets the armourEffect. + * @param armourEffect The armourEffect to set. + */ + public void setArmourEffect(ArmourSet armourEffect) { + this.armourEffect = armourEffect; + } + + /** + * Gets the attacking entity. + * @return The entity. + */ + public Entity getAttacker() { + return entity; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/CombatPulse.kt b/Server/src/main/java/Server/core/game/node/entity/combat/CombatPulse.kt new file mode 100644 index 000000000..9465b9346 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/CombatPulse.kt @@ -0,0 +1,460 @@ +package core.game.node.entity.combat + +import core.game.container.impl.EquipmentContainer +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.entity.Entity +import core.game.node.entity.combat.equipment.WeaponInterface +import core.game.node.entity.impl.Animator +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.audio.Audio +import core.game.node.entity.state.EntityState +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.tools.RandomFunction +import core.game.node.entity.skill.Skills + +/** + * The combat-handling pulse implementation. + * @author Emperor + */ +class CombatPulse( + /** + * The entity. + */ + private val entity: Entity?) : Pulse(1, entity, null) { + + /** + * The victim. + */ + private var victim: Entity? = null + + /** + * Gets the style. + * @return The style. + */ + /** + * Sets the style. + * @param style The style to set. + */ + /** + * The current combat style used. + */ + var style = CombatStyle.MELEE + + /** + * @return the temporaryHandler. + */ + /** + * @param temporaryHandler the temporaryHandler to set. + */ + /** + * The temporary combat swing handler. + */ + var temporaryHandler: CombatSwingHandler? = null + + /** + * Gets the handler. + * @return The handler. + */ + /** + * Sets the handler. + * @param handler The handler to set. + */ + /** + * The current combat swing handler. + */ + var handler = style.swingHandler + + /** + * @return the lastVictim. + */ + /** + * @param lastVictim the lastVictim to set. + */ + /** + * The last victim. + */ + var lastVictim: Entity? = null + + /** + * The tick value of when we can start another hit-cycle. + */ + private var nextAttack = -1 + + /** + * The combat time out counter. + */ + private var combatTimeOut = 0 + + /** + * The movement handling pulse. + */ + private val movement: MovementPulse + + /** + * The last attack sent. + */ + var lastSentAttack = 0 + + /** + * The last attack recieved. + */ + var lastReceivedAttack = 0 + override fun pulse(): Boolean { + if (victim == null || DeathTask.isDead(entity) || DeathTask.isDead(victim)) { + return true + } + if (!entity!!.viewport.region.isActive || !victim!!.viewport.region.isActive) { + return true + } + if (!interactable()) { + return if (entity.walkingQueue.isMoving) { + false + } else combatTimeOut++ > entity.properties.combatTimeOut + } + combatTimeOut = 0 + entity.face(victim) + if (nextAttack <= GameWorld.ticks) { + victim ?: return false + val v: Entity = victim!! + var handler = temporaryHandler + if (handler == null) { + handler = entity.getSwingHandler(true) + } + if (!swing(entity, victim, handler)) { + temporaryHandler = null + updateStyle() + return false + } + var speed = entity.properties.attackSpeed + val magic = handler!!.type == CombatStyle.MAGIC + if (entity is Player && magic) { + speed = 5 + } else if (entity.properties.attackStyle.style == WeaponInterface.STYLE_RAPID) { + speed-- + } + if (!magic && entity.stateManager.hasState(EntityState.MIASMIC)) { + speed = (speed * 1.5).toInt() + } + setNextAttack(speed) + temporaryHandler = null + setCombatFlags(v) + } + return victim != null && victim!!.skills.lifepoints < 1 || entity.skills.lifepoints < 1 + } + + /** + * Sets the "in combat" flag for the victim and handles closing. + * @param victim The victim. + */ + fun setCombatFlags(victim: Entity?) { + if (victim == null || entity == null) { + return + } + if (entity is Player) { + val p = entity + if (!p.attributes.containsKey("keepDialogueAlive")) { + p.interfaceManager.close() + p.interfaceManager.closeChatbox() + } + } + if (victim is Player) { + if (entity is Player && entity.skullManager.isWilderness) { + entity.skullManager.checkSkull(victim) + } + if (!victim.getAttributes().containsKey("keepDialogueAlive")) { + victim.interfaceManager.closeChatbox() + victim.interfaceManager.close() + } + } + if (!victim.pulseManager.isMovingPulse) { + victim.pulseManager.clear("combat") + } + victim.setAttribute("combat-time", System.currentTimeMillis() + 10000) + victim.setAttribute("combat-attacker", entity) + } + + /** + * Checks if the mover can interact with the victim. + * @return `True` if so. + */ + private fun interactable(): Boolean { + if (victim == null) { + return false + } + if (entity is NPC && victim is Player && entity.isHidden(victim as Player?)) { + stop() + return false + } + if (victim is NPC && entity is Player && (victim as NPC).isHidden(entity as Player?)) { + stop() + return false + } + if (entity is NPC && !entity.asNpc().canStartCombat(victim)) { + stop() + return false + } + val type = canInteract() + if (type == InteractionType.STILL_INTERACT) { + return true + } + if (entity == null || victim == null || entity.locks.isMovementLocked) { + return false + } + movement.findPath() + return type == InteractionType.MOVE_INTERACT + } + + /** + * Sets the combat style. + */ + fun updateStyle() { + if (entity == null) { + return + } + if (entity is Player) { + val p = entity + if (p.properties.spell != null) { + style = CombatStyle.MAGIC + return + } + if (p.properties.autocastSpell != null) { + style = CombatStyle.MAGIC + return + } + style = when (p.properties.attackStyle.bonusType) { + WeaponInterface.BONUS_MAGIC -> CombatStyle.MAGIC + WeaponInterface.BONUS_RANGE -> CombatStyle.RANGE + else -> CombatStyle.MELEE + } + } + } + + /** + * Attacks the node. + * @param victim The victim node. + */ + fun attack(victim: Node?) { + if (victim == null) { + return + } + if (entity!!.locks.isInteractionLocked) { + return + } + if (victim === this.victim && isAttacking) { + return + } + //makes sure lumbridge dummies can't attack back (lol) + if (victim is Player && (entity.id == 4474 || entity.id == 7891)) { + return + } + if(entity is Player) { + if ((victim.id == 4474 || victim.id == 7891) && entity.asPlayer().properties.combatLevel >= 30){ + entity.asPlayer().sendMessage("You are too experienced to gain anything from these.") + return + } + } + if (victim is NPC) { + if (entity is Player && victim !== this.victim && victim !== lastVictim) { + // Loar Shade Transformation Animation + val shade = Animation(1288, 0, Animator.Priority.VERY_HIGH) + val player = entity + val mask = player.equipment[EquipmentContainer.SLOT_HAT] + if (victim.getId() == 1240) { + victim.animate(shade) + victim.transform(1241) + } + if (mask != null && mask.id >= 8901 && mask.id < 8920 && RandomFunction.random(50) == 0) { + player.packetDispatch.sendMessage("Your black mask startles your enemy, you have " + + (if (mask.id == 8919) "no" else ((8920 - mask.id) / 2).toString()) + " charges left.") + player.equipment.replace(Item(mask.id + 2), EquipmentContainer.SLOT_HAT) + var drain = 3 + victim.skills.getLevel(Skills.DEFENCE) / 14 + if (drain > 10) { + drain = 10 + } + victim.skills.updateLevel(Skills.DEFENCE, -drain, victim.skills.getStaticLevel(Skills.DEFENCE) - drain) + } + } + victim.walkingQueue.reset() + } + setVictim(victim) + entity.onAttack(victim as Entity?) + entity.pulseManager.run(this) + } + + /** + * Sets the victim. + * @param victim The victim. + */ + fun setVictim(victim: Node?) { + super.addNodeCheck(1, victim) + movement.setLast(null) + movement.setDestination(victim) + this.victim = victim as Entity? + combatTimeOut = 0 + } + + /** + * Sets the next attack. + * @param ticks The amount of ticks. + */ + fun setNextAttack(ticks: Int) { + nextAttack = GameWorld.ticks + ticks + } + + /** + * Delays the next attack. + * @param ticks The amount of ticks to delay the next attack with. + */ + fun delayNextAttack(ticks: Int) { + nextAttack += ticks + } + + /** + * Gets the next attack tick. + * @return The next attack tick. + */ + fun getNextAttack(): Int { + return nextAttack + } + + /** + * Checks if we can fight with the victim. + * @return `True` if so. + */ + fun canInteract(): InteractionType? { + if (victim == null) { + return InteractionType.NO_INTERACT + } + return if (temporaryHandler != null) { + temporaryHandler!!.canSwing(entity!!, victim!!) + } else entity!!.getSwingHandler(false).canSwing(entity, victim!!) + } + + override fun start() { + super.start() + entity!!.face(victim) + } + + override fun stop() { + super.stop() + entity!!.setAttribute("combat-stop", GameWorld.ticks) + if (victim != null) { + lastVictim = victim + } + super.addNodeCheck(1, null.also { victim = it }) + entity.face(null) + entity.properties.spell = null + } + + override fun removeFor(pulseType: String): Boolean { + var pulse = pulseType + if (isAttacking) { + pulse = pulse.toLowerCase() + if (pulse.startsWith("interaction:attack")) { + if (victim.hashCode() == pulse.replace("interaction:attack:", "").toInt()) { + return false + } + } + } + return true + } + + /** + * Checks if this entity is attacking. + * @return `True` if so. + */ + val isAttacking: Boolean + get() = victim != null && victim!!.isActive && isRunning + + /** + * If the entity has an attacker. + * @return `True` if so. + */ + val isInCombat: Boolean + get() { + val entity = entity!!.getAttribute("combat-attacker") + return entity != null && entity.properties.combatPulse.isAttacking + } + + /** + * Gets the current victim. + * @return The victim. + */ + fun getVictim(): Entity? { + return victim + } + + companion object { + + /** + * Executes a combat swing. + * @param entity The entity. + * @param victim The victim. + * @param handler The combat swing handler. + * @return `True` if successfully started the swing. + */ + fun swing(entity: Entity?, victim: Entity?, handler: CombatSwingHandler?): Boolean { + val state = BattleState(entity, victim) + val set = handler!!.getArmourSet(entity) + entity!!.properties.armourSet = set + val delay = handler.swing(entity, victim, state) + if (delay < 0) { + return false + } + if (victim == null) { + entity.faceTemporary(victim, 1) // face back to entity. + } + handler.adjustBattleState(entity, victim!!, state) + handler.visualize(entity, victim, state) + if (delay - 1 < 1) { + handler.visualizeImpact(entity, victim, state) + } + handler.visualizeAudio(entity, victim, state) + if (set != null && set.effect(entity, victim, state)) { + set.visualize(entity, victim) + } + GameWorld.Pulser.submit(object : Pulse(delay - 1, entity, victim) { + var impact = false + override fun pulse(): Boolean { + if (DeathTask.isDead(victim)) { + return true + } + if (impact || getDelay() == 0) { + if (state.estimatedHit != 0 && victim is NPC && entity is Player) { + val n = victim.asNpc() + val audio = n.getAudio(1) + if (audio != null) { + entity.asPlayer().audioManager.send(audio, true) + } + } else if (state.estimatedHit != 0 && victim is Player) { + val sounds = intArrayOf(516, 517, 518) + val audio = Audio(sounds[RandomFunction.random(sounds.size)]) + audio.send(victim.asPlayer(), true) + } + handler.impact(entity, victim, state) + handler.onImpact(entity, victim, state) + return true + } + setDelay(1) + impact = true + handler.visualizeImpact(entity, victim, state) + return false + } + }) + return true + } + } + + init { + movement = object : MovementPulse(entity, null) { + override fun pulse(): Boolean { + return false + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/CombatSpell.java b/Server/src/main/java/Server/core/game/node/entity/combat/CombatSpell.java new file mode 100644 index 000000000..e146d9ec3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/CombatSpell.java @@ -0,0 +1,239 @@ +package core.game.node.entity.combat; + +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a combat magic spell. + * @author Emperor + */ +public abstract class CombatSpell extends MagicSpell { + + /** + * The autocast animation. + */ + public static final Animation AUTOCAST_ANIMATION = new Animation(1162, Priority.HIGH); + + /** + * The splash graphics. + */ + public static final Graphics SPLASH_GRAPHIC = new Graphics(85, 96); + + /** + * The current spell type. + */ + protected final SpellType type; + + /** + * The projectile. + */ + protected Projectile projectile; + + /** + * The end graphic. + */ + protected final Graphics endGraphic; + + /** + * The impact Audio. + */ + protected final int impactAudio; + + /** + * Constructs a new {@code CombatSpell} {@Code Object} + */ + public CombatSpell() { + this(SpellType.NULL, SpellBookManager.SpellBook.MODERN, 1, 0.0, -1, -1, null, null, null, null); + } + + /** + * Constructs a new {@code CombatSpell} {@Code Object} + * @param type The spell type. + * @param book The spell book. + * @param level The level required. + * @param baseExperience The base experience. + * @param castAudio The Audio id of the casting Audio. + * @param impactAudio The Audio id of the impact Audio. + * @param animation the cast animation. + * @param startGraphic The start graphic. + * @param projectile The projectile. + * @param endGraphic The end graphic. + * @param runes The runes required to cast this spell. + */ + public CombatSpell(SpellType type, SpellBookManager.SpellBook book, int level, double baseExperience, int castAudio, int impactAudio, Animation animation, Graphics startGraphic, Projectile projectile, Graphics endGraphic, Item... runes) { + super(book, level, baseExperience, animation, startGraphic, new Audio(castAudio, 1, 0), runes); + this.type = type; + this.impactAudio = impactAudio; + this.projectile = projectile; + this.endGraphic = endGraphic; + } + + /** + * Gets the maximum impact amount of this spell. + * @param entity The entity. + * @param victim The victim. + * @param state The battle state. + * @return The maximum impact amount. + */ + public abstract int getMaximumImpact(Entity entity, Entity victim, BattleState state); + + /** + * Starts the effect of this spell (if any). + * @param entity The entity. + * @param victim The victim. + * @param state The battle state. + */ + public void fireEffect(Entity entity, Entity victim, BattleState state) { + + } + + /** + * Gets a list of possible targets for a multihitting spell. + * @param entity The caster of the spell. + * @param target The victim. + * @param max The max amount of victims. + * @return The list of targets. + */ + public List getMultihitTargets(Entity entity, Entity target, int max) { + List list = new ArrayList<>(); + list.add(target); + boolean npc = target instanceof NPC; + for (Entity e : npc ? RegionManager.getLocalNpcs(target, 1) : RegionManager.getLocalPlayers(target, 1)) { + if (e != target && e != entity && CombatStyle.MAGIC.getSwingHandler().canSwing(entity, e) != InteractionType.NO_INTERACT) { + list.add(e); + } + if (--max < 1) { + break; + } + } + return list; + } + + /** + * Visualizes the impact. + * @param entity The entity. + * @param target The target. + * @param state The battle state. + */ + public void visualizeImpact(Entity entity, Entity target, BattleState state) { + boolean combatVictim = target == entity.getProperties().getCombatPulse().getVictim(); + if (state.getEstimatedHit() == -1) { + if (combatVictim) { + sendAudio(target, new Audio(227, 1, 20)); + } + target.graphics(SPLASH_GRAPHIC); + return; + } + target.graphics(endGraphic); + if (combatVictim) { + sendAudio(target, new Audio(impactAudio, 1, 20)); + } + } + + @Override + public void visualize(Entity entity, Node target) { + entity.graphics(graphic); + if (projectile != null) { + if (target instanceof Entity) { + projectile.transform(entity, (Entity) target, entity instanceof NPC, 58, 10).send(); + } else { + projectile.transform(entity, target.getLocation(), entity instanceof NPC, 58, 10).send(); + } + } + if (entity.getProperties().getAutocastSpell() == this && (entity instanceof Player || animation == null)) { + Player p = entity.asPlayer(); + if (p.getProperties().getAutocastSpell().getSpellId() == 31) { + entity.animate(new Animation(1576)); + } else { + entity.animate(AUTOCAST_ANIMATION); + } + } else { + if (entity instanceof NPC) { + NPC n = entity.asNpc(); + if (n.getProperties().getMagicAnimation() != null) { + entity.animate(n.getProperties().getMagicAnimation()); + } else { + entity.animate(animation); + } + } else { + entity.animate(animation); + } + } + sendAudio(entity); + } + + @Override + public boolean cast(Entity entity, Node target) { + if (!meetsRequirements(entity, true, false)) { + return false; + } + if (target instanceof Entity) { + entity.face((Entity) target); + } + entity.getProperties().setSpell(this); + if (entity.getProperties().getCombatPulse().isAttacking()) { + entity.getProperties().getCombatPulse().setVictim(target); + entity.getProperties().getCombatPulse().updateStyle(); + entity.getProperties().getCombatPulse().start(); + return true; + } + entity.getProperties().getCombatPulse().attack(target); + return true; + } + + /** + * Gets the targets list. + * @param entity The entity + * @param target The target. + * @return The targets array. + */ + public BattleState[] getTargets(Entity entity, Entity target) { + return new BattleState[] { new BattleState(entity, target) }; + } + + /** + * Gets the accuracy modifier. + * @return The accuracy modifier. + */ + public double getAccuracyMod() { + return type.getAccuracyMod(); + } + + /** + * @return the type. + */ + public SpellType getType() { + return type; + } + + /** + * @return the animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Gets the splash graphic. + * @return The splash graphic. + */ + public Graphics getSplashGraphic() { + return SPLASH_GRAPHIC; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/CombatStyle.java b/Server/src/main/java/Server/core/game/node/entity/combat/CombatStyle.java new file mode 100644 index 000000000..09689c458 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/CombatStyle.java @@ -0,0 +1,65 @@ +package core.game.node.entity.combat; + +import core.game.node.entity.combat.handlers.MagicSwingHandler; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.combat.handlers.RangeSwingHandler; +import core.game.node.entity.player.link.prayer.PrayerType; + +/** + * Represents the different styles of combat. + * @author Emperor + */ +public enum CombatStyle { + + /** + * The melee combat style. + */ + MELEE(new MeleeSwingHandler(), PrayerType.PROTECT_FROM_MELEE), + + /** + * The range combat style. + */ + RANGE(new RangeSwingHandler(), PrayerType.PROTECT_FROM_MISSILES), + + /** + * The magic combat style. + */ + MAGIC(new MagicSwingHandler(), PrayerType.PROTECT_FROM_MAGIC); + + /** + * The combat swing handler used by the combat style. + */ + private final CombatSwingHandler swingHandler; + + /** + * The protection prayer for this combat type. + */ + private final PrayerType protectionPrayer; + + /** + * Constructs a new {@code CombatStyle} {@code Object}. + * @param swingHandler The combat swing handler. + * @param protectionPrayer The protection prayer. + */ + private CombatStyle(CombatSwingHandler swingHandler, PrayerType protectionPrayer) { + this.swingHandler = swingHandler; + this.protectionPrayer = protectionPrayer; + swingHandler.setType(this); + } + + /** + * Gets the swingHandler. + * @return The swingHandler. + */ + public CombatSwingHandler getSwingHandler() { + return swingHandler; + } + + /** + * Gets the protectionPrayer. + * @return The protectionPrayer. + */ + public PrayerType getProtectionPrayer() { + return protectionPrayer; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/CombatSwingHandler.kt b/Server/src/main/java/Server/core/game/node/entity/combat/CombatSwingHandler.kt new file mode 100644 index 000000000..7bdbbb397 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/CombatSwingHandler.kt @@ -0,0 +1,512 @@ +package core.game.node.entity.combat + +import core.game.container.Container +import core.game.container.impl.EquipmentContainer +import core.game.node.Node +import core.game.node.entity.Entity +import core.game.node.entity.combat.equipment.ArmourSet +import core.game.node.entity.combat.equipment.DegradableEquipment +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.audio.Audio +import core.game.node.entity.player.link.prayer.PrayerType +import core.game.node.entity.state.EntityState +import core.game.system.config.ItemConfigParser +import core.game.world.map.path.Pathfinder +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.tools.RandomFunction +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.summoning.familiar.Familiar +import core.game.system.SystemLogger +import java.util.* +import kotlin.math.floor + +/** + * Handles a combat swing. + * @author Emperor + * @author Ceikry - Kotlin refactoring, general cleanup + */ +abstract class CombatSwingHandler(var type: CombatStyle?) { + /** + * The mapping of the special attack handlers. + */ + private var specialHandlers: MutableMap? = null + + /** + * Starts the combat swing. + * @param entity The attacking entity. + * @param victim The victim. + * @param state The battle state instance. + * @return The amount of ticks before impact of the attack. + */ + abstract fun swing(entity: Entity?, victim: Entity?, state: BattleState?): Int + + /** + * Handles the impact of the combat swing (victim getting hit). + * @param entity The attacking entity. + * @param victim The victim. + * @param state The battle state instance. + */ + abstract fun impact(entity: Entity?, victim: Entity?, state: BattleState?) + + /** + * Visualizes the impact itself (end animation, end GFX, ...) + * @param entity The attacking entity. + * @param victim The victim. + * @param state The battle state instance. + */ + abstract fun visualizeImpact(entity: Entity?, victim: Entity?, state: BattleState?) + + /** + * Calculates the maximum accuracy of the entity. + * @param entity The entity. + * @return The maximum accuracy value. + */ + abstract fun calculateAccuracy(entity: Entity?): Int + + /** + * Calculates the maximum strength of the entity. + * @param entity The entity. + * @param victim The victim. + * @param modifier The modifier. + * @return The maximum strength value. + */ + abstract fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int + + /** + * Calculates the maximum defence of the entity. + * @param entity The entity. + * @param attacker The entity to defend against. + * @return The maximum defence value. + */ + abstract fun calculateDefence(entity: Entity?, attacker: Entity?): Int + + /** + * Gets the void set multiplier. + * @param e The entity. + * @param skillId The skill id. + * @return The multiplier. + */ + abstract fun getSetMultiplier(e: Entity?, skillId: Int): Double + + /** + * Visualizes the combat swing (start animation, GFX, projectile, ...) + * @param entity The attacking entity. + * @param victim The victim. + * @param state The battle state instance. + */ + open fun visualize(entity: Entity, victim: Entity?, state: BattleState?) { + entity.animate(getAttackAnimation(entity, type)) + } + + /** + * Method called when the impact method got called. + * @param entity The attacking entity. + * @param victim The victim. + * @param state The battle state. + */ + fun onImpact(entity: Entity?, victim: Entity?, state: BattleState?) { + if (entity is Player && victim != null) { + DegradableEquipment.degrade(entity as Player?, victim, true) + } + if (state == null) { + return + } + if (state.targets != null && state.targets.isNotEmpty()) { + if (!(state.targets.size == 1 && state.targets[0] == state)) { + for (s in state.targets) { + if (s != null && s != state) { + onImpact(entity, s.victim, s) + } + } + return + } + } + victim!!.onImpact(entity, state) + } + + /** + * Gets the currently worn armour set, if any. + * @param e The entity. + * @return The armour set worn. + */ + open fun getArmourSet(e: Entity?): ArmourSet? { + return null + } + + /** + * Checks if the container contains a void knight set. + * @param c The container to check. + * @return `True` if so. + */ + fun containsVoidSet(c: Container): Boolean { + val top = c.getNew(EquipmentContainer.SLOT_CHEST) + return if (top.id != 8839 && top.id != 10611) { + false + } else c.getNew(EquipmentContainer.SLOT_LEGS).id == 8840 && c.getNew(EquipmentContainer.SLOT_HANDS).id == 8842 + } + + /** + * Checks if the hit will be accurate. + * @param entity The entity. + * @param victim The victim. + * @return `True` if the hit is accurate. + */ + fun isAccurateImpact(entity: Entity?, victim: Entity?): Boolean { + return isAccurateImpact(entity, victim, type, 1.0, 1.0) + } + + /** + * Checks if the hit will be accurate. + * @param entity The entity. + * @param victim The victim. + * @param style The combat style used. + * @return `True` if the hit is accurate. + */ + fun isAccurateImpact(entity: Entity?, victim: Entity?, style: CombatStyle?): Boolean { + return isAccurateImpact(entity, victim, style, 1.0, 1.0) + } + + /** + * Checks if the hit will be accurate. + * @param entity The entity. + * @param victim The victim. + * @param style The combat style (null to ignore prayers). + * @param accuracyMod The accuracy modifier. + * @param defenceMod The defence modifier. + * @return `True` if the hit is accurate. + */ + fun isAccurateImpact(entity: Entity?, victim: Entity?, style: CombatStyle?, accuracyMod: Double, defenceMod: Double): Boolean { + var mod = 1.33 + if (victim == null || style == null) { + return false + } + if (victim is Player && entity is Familiar && victim.prayer[PrayerType.PROTECT_FROM_SUMMONING]) { + mod = 0.0 + } + val attack = calculateAccuracy(entity) * accuracyMod * mod * getSetMultiplier(entity, Skills.ATTACK) + val defence = calculateDefence(victim, entity) * defenceMod * getSetMultiplier(victim, Skills.DEFENCE) + val chance: Double + chance = if (attack < defence) { + (attack - 1) / (defence * 2) + } else { + 1 - (defence + 1) / (attack * 2) + } + val ratio = chance * 100 + val accuracy = floor(ratio) + val block = floor(101 - ratio) + val acc = Math.random() * accuracy + val def = Math.random() * block + return acc > def + } + + /** + * Checks if the entity can execute a combat swing at the victim. + * @param entity The entity. + * @param victim The victim. + * @return `True` if so. + */ + open fun canSwing(entity: Entity, victim: Entity): InteractionType? { + return isAttackable(entity, victim) + } + + /** + * Checks if the victim can be attacked by the entity. + * @param entity The attacking entity. + * @param victim The entity being attacked. + * @return `True` if so. + */ + open fun isAttackable(entity: Entity, victim: Entity): InteractionType? { + if (entity.location == victim.location) { + return if (entity.index < victim.index && victim.properties.combatPulse.getVictim() === entity) { + InteractionType.STILL_INTERACT + } else InteractionType.NO_INTERACT + } + val el = entity.location + val vl = victim.location + val evl = vl.transform(victim.size(), victim.size(), 0) + if (el.x >= vl.x && el.x < evl.x && el.y >= vl.y && el.y < evl.y || el.z != vl.z) { + return InteractionType.NO_INTERACT + } + if (!victim.isAttackable(entity, type)) { + entity.properties.combatPulse.stop() + return InteractionType.NO_INTERACT + } + return InteractionType.STILL_INTERACT + } + + /** + * Gets the dragonfire message. + * @param protection The protection value. + * @param fireName The fire breath name. + * @return The message to send. + */ + fun getDragonfireMessage(protection: Int, fireName: String): String { + if (protection and 0x4 != 0) { + if (protection and 0x2 != 0) { + return "Your potion and shield fully protects you from the dragon's $fireName." + } + return if (protection and 0x8 != 0) { + "Your prayer and shield absorbs most of the dragon's $fireName." + } else "Your shield absorbs most of the dragon's $fireName." + } + if (protection and 0x2 != 0) { + return if (protection and 0x8 != 0) { + "Your prayer and potion absorbs most of the dragon's $fireName." + } else "Your antifire potion helps you defend the against the dragon's $fireName." + } + return if (protection and 0x8 != 0) { + "Your magic prayer absorbs some of the dragon's $fireName." + } else "You are horribly burnt by the dragon's $fireName." + } + + /** + * Visualizes the audio. + * @param entity the entity. + * @param victim the victim. + * @param state the state. + */ + fun visualizeAudio(entity: Entity, victim: Entity, state: BattleState) { + if (entity is Player) { + val styleIndex = entity.settings.attackStyleIndex + if (state.weapon != null && state.weapon.item != null) { + val weapon = state.weapon.item + val audios = weapon.definition.getConfiguration>(ItemConfigParser.ATTACK_AUDIO, null) + if (audios != null) { + var audio: Audio? = null + if (styleIndex < audios.size) { + audio = audios[styleIndex] + } + if (audio == null || audio.id == 0) { + audio = audios[0] + } + entity.asPlayer().audioManager.send(audio, true) + } + } else { + entity.asPlayer().audioManager.send(2564) + } + } else if (entity is NPC && victim is Player) { + val npc = entity.asNpc() + val audio = npc.getAudio(0) + audio?.send(victim.asPlayer(), true) + } + } + + /** + * Gets the combat distance. + * @param e The entity. + * @param v The victim. + * @param rawDistance The distance. + * @return The actual distance used for combat. + */ + open fun getCombatDistance(e: Entity, v: Entity, rawDistance: Int): Int { + var distance = rawDistance + if (e is NPC) { + if (e.definition.combatDistance > 0) { + distance = e.definition.combatDistance + } + } + return (e.size() shr 1) + (v.size() shr 1) + distance + } + + /** + * Formats the hit for the victim. (called as + * victim.getSwingHandler(false).formatHit(victim, hit)) + * @param victim The entity receiving the hit. + * @param rawHit The hit to format. + * @return The formatted hit. + */ + fun formatHit(victim: Entity, rawHit: Int): Int { + var hit = rawHit + if (hit < 1) { + return hit + } + if (hit > victim.skills.lifepoints) { + hit = victim.skills.lifepoints + } + return hit + } + + /** + * Adjusts the battle state object for this combat swing. + * @param entity The attacking entity. + * @param victim The victim. + * @param state The battle state. + */ + open fun adjustBattleState(entity: Entity, victim: Entity, state: BattleState) { + EXPERIENCE_MOD = 4.0 + var totalHit = 0 + if (entity is Player) { + entity.familiarManager.adjustBattleState(state) + } + entity.sendImpact(state) + victim.checkImpact(state) + //Prevents lumbridge dummies from dying (true to how rs3 / 2009scape in 2009 does it) + if (victim.id == 4474 && type == CombatStyle.MAGIC || victim.id == 7891 && type == CombatStyle.MELEE) { + EXPERIENCE_MOD = 0.1 + victim.fullRestore() + if (state.estimatedHit >= 15) { + state.estimatedHit = 14 + } + if (state.secondaryHit >= 15) { + state.secondaryHit = 14 + } + } + if (victim.id == 757) { + EXPERIENCE_MOD = 0.01 + } + if (state.estimatedHit > 0) { + state.estimatedHit = getFormattedHit(entity, victim, state, state.estimatedHit) + totalHit += state.estimatedHit + } + if (state.secondaryHit > 0) { + state.secondaryHit = getFormattedHit(entity, victim, state, state.secondaryHit) + totalHit += state.secondaryHit + } + if (entity is Player) { + entity.degrader.checkWeaponDegrades(entity) + if (totalHit > 0 && entity.prayer[PrayerType.SMITE] && victim.skills.prayerPoints > 0) { + victim.skills.decrementPrayerPoints(totalHit * 0.25) + } + if (entity.getAttribute("1hko", false)) { + state.estimatedHit = victim.skills.lifepoints + } + } + if (victim is NPC) { + if (victim.properties.protectStyle != null && state.style == victim.properties.protectStyle) { + state.neutralizeHits() + } + } + } + + /** + * Adds the experience for the current combat swing. + * @param entity The attacking entity. + * @param victim The victim. + * @param state The battle state. + */ + open fun addExperience(entity: Entity?, victim: Entity?, state: BattleState?) {} + + /** + * Gets the formated hit. + * @param attacker The attacking entity. + * @param victim The victim. + * @param state The battle state. + * @param rawHit The hit to format. + * @return The formated hit. + */ + protected open fun getFormattedHit(attacker: Entity, victim: Entity, state: BattleState, rawHit: Int): Int { + var hit = rawHit + hit = attacker.getFormatedHit(state, hit).toInt() + if (victim is Player) { + val player = victim.asPlayer() + val shield = player.equipment[EquipmentContainer.SLOT_SHIELD] + if (shield != null && shield.id == 13742) { + if (RandomFunction.random(100) < 71) { + hit -= (hit.toDouble() * 0.25).toInt() + if (hit < 1) { + hit = 0 + } + } + } + if (shield != null && shield.id == 13740) { + val reduce = hit.toDouble() * 0.30 + var drain = hit * 0.15 + if (player.skills.prayerPoints > drain && drain > 0) { + if (drain < 1) { + drain = 1.0 + } + hit -= reduce.toInt() + if (hit < 1) { + hit = 0 + } + player.skills.decrementPrayerPoints(drain) + } + } + } + if (attacker is Player) { + val player = attacker.asPlayer() + if (player.equipment[3] != null && player.equipment[3].id == 14726 && state.style == CombatStyle.MAGIC) { + hit += (hit.toDouble() * 0.15).toInt() + } + } + if (attacker is Familiar && victim is Player) { + if (victim.prayer[PrayerType.PROTECT_FROM_SUMMONING]) { + hit = 0 + } + } + return formatHit(victim, hit) + } + + /** + * Gets the default animation of the entity. + * @param e The entity. + * @param style The combat style. + * @return The attack animation. + */ + fun getAttackAnimation(e: Entity, style: CombatStyle?): Animation { + var anim: Animation? = null + if (type != null && e is NPC) { + anim = e.properties.getCombatAnimation(style!!.ordinal % 3) + } + return anim ?: e.properties.attackAnimation + } + + /** + * Registers a special attack handler. + * @param itemId The item id. + * @param handler The combat swing handler. + * @return `True` if succesful. + */ + fun register(itemId: Int, handler: CombatSwingHandler): Boolean { + if (specialHandlers == null) { + specialHandlers = HashMap() + } + if (specialHandlers!!.containsKey(itemId)) { + SystemLogger.logErr("Already contained special attack handler for item " + itemId + " - [old=" + specialHandlers!![itemId]!!::class.java.simpleName + ", new=" + handler.javaClass.simpleName + "].") + return false + } + return specialHandlers!!.put(itemId, handler) == null + } + + /** + * Gets the special attack handler for the given item id. + * @param itemId The item id. + * @return The special attack handler, or `null` if this item has no + * special attack handler. + */ + fun getSpecial(itemId: Int): CombatSwingHandler? { + if (specialHandlers == null) { + specialHandlers = HashMap() + } + return specialHandlers!![itemId] + } + + companion object { + /** + * The amount of experience to get per hit. + */ + @JvmField + var EXPERIENCE_MOD = 4.0 + + /** + * Checks if a projectile can be fired from the node location to the victim + * location. + * @param entity The node. + * @param victim The victim. + * @param checkClose If we are checking for a melee attack rather than a + * projectile. + * @return `True` if so. + */ + @JvmStatic + fun isProjectileClipped(entity: Node, victim: Node?, checkClose: Boolean): Boolean { + return if (checkClose) { + if (entity.id == 54) { // /temp until emp is back. + Pathfinder.find(entity as Entity, victim!!, false, Pathfinder.SMART).isSuccessful + } else Pathfinder.find(entity as Entity, victim!!, false, Pathfinder.DUMB).isSuccessful + } else Pathfinder.find(entity as Entity, victim!!, false, Pathfinder.PROJECTILE).isSuccessful + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/DeathTask.java b/Server/src/main/java/Server/core/game/node/entity/combat/DeathTask.java new file mode 100644 index 000000000..9a116b323 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/DeathTask.java @@ -0,0 +1,189 @@ +package core.game.node.entity.combat; + +import core.game.container.Container; +import core.game.container.ContainerType; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Animator; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.IronmanMode; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.Item; +import core.game.system.task.NodeTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; + +/** + * Handles an entity death task. + * @author Emperor + */ +public final class DeathTask extends NodeTask { + + /** + * The death task singleton. + */ + private static final DeathTask SINGLETON = new DeathTask(); + + /** + * Constructs a new {@code DeathTask} {@Code Object}. + */ + private DeathTask() { + super(1); + } + + @Override + public void start(Node node, Node... n) { + Entity e = (Entity) node; + e.getWalkingQueue().reset(); + e.setAttribute("state:death", true); + e.setAttribute("tick:death", GameWorld.getTicks()); + e.lock(50); + e.face(null); + Entity killer = n.length > 0 ? (Entity) n[0] : e; + if (e instanceof NPC) { + killer.removeAttribute("combat-time"); + if (killer instanceof Player) { + Player p = killer.asPlayer(); + Audio audio = e.asNpc().getAudio(2); + if (audio != null) { + audio.send(p, true); + } + } + } + e.getAnimator().forceAnimation(e.getProperties().getDeathAnimation()); + e.graphics(Animator.RESET_G); + e.commenceDeath(killer); + e.getImpactHandler().setDisabledTicks(50); + } + + @Override + public boolean exec(Node node, Node... n) { + Entity e = (Entity) node; + int ticks = e.getProperties().getDeathAnimation().getDuration(); + if (ticks < 1 || ticks > 30) { + ticks = 6; + } + if (node instanceof Player) { + if (TutorialSession.getExtension(((Player) node)).getStage() == 52) { + TutorialStage.load(((Player) node), 53, false); + } + if (TutorialSession.getExtension(((Player) node)).getStage() == 54) { + TutorialStage.load(((Player) node), 55, false); + } + } + return e.getAttribute("tick:death", -1) <= GameWorld.getTicks() - ticks; + } + + @Override + public void stop(Node node, Node... n) { + Entity e = (Entity) node; + Entity killer = n.length > 0 ? (Entity) n[0] : e; + e.removeAttribute("state:death"); + e.removeAttribute("tick:death"); + Location spawn = e.getProperties().getSpawnLocation(); + e.getAnimator().forceAnimation(Animator.RESET_A); + e.getProperties().setTeleportLocation(spawn); + e.unlock(); + e.finalizeDeath(killer); + e.getImpactHandler().getImpactLog().clear();// check if this needs to be + // before finalize + e.getImpactHandler().setDisabledTicks(4); + } + + @Override + public boolean removeFor(String s, Node node, Node... n) { + return false; + } + + /** + * Gets the player's death containers. + * @param player The player. + * @return The containers, index 0 = kept items, index 1 = lost items. + */ + public static Container[] getContainers(Player player) { + Container[] containers = new Container[2]; + Container wornItems = new Container(42, ContainerType.ALWAYS_STACK); + wornItems.addAll(player.getInventory()); + wornItems.addAll(player.getEquipment()); + int count = 3; + if (player.getSkullManager().isSkulled()) { + count -= 3; + } + if (player.getPrayer().get(PrayerType.PROTECT_ITEMS)) { + count += 1; + } + Container keptItems = new Container(count, ContainerType.NEVER_STACK); + containers[0] = keptItems; + if (player.getIronmanManager().getMode() != IronmanMode.ULTIMATE) { + for (int i = 0; i < count; i++) { + for (int j = 0; j < 42; j++) { + Item item = wornItems.get(j); + if (item != null) { + for (int x = 0; x < count; x++) { + Item kept = keptItems.get(x); + if (kept == null || kept != null && kept.getDefinition().getAlchemyValue(true) <= item.getDefinition().getAlchemyValue(true)) { + keptItems.replace(new Item(item.getId(), 1, item.getCharge()), x); + x++; + while (x < count) { + Item newKept = keptItems.get(x); + keptItems.replace(kept, x++); + kept = newKept; + } + if (kept != null) { + wornItems.add(kept, false); + } + item = wornItems.get(j); + wornItems.replace(new Item(item.getId(), item.getAmount() - 1, item.getCharge()), j); + break; + } + } + } + } + } + } + containers[1] = new Container(42, ContainerType.DEFAULT); + containers[1].addAll(wornItems); + return containers; + } + + /** + * Starts the death task for an entity. + * @param entity The entity. + * @param killer The entity's killer. + */ + @SuppressWarnings("deprecation") + public static void startDeath(Entity entity, Entity killer) { + if (!isDead(entity)) { + entity.getPulseManager().clear(); + if (killer == null) { + killer = entity; + } + Pulse pulse = SINGLETON.schedule(entity, killer); + pulse.start(); + entity.getPulseManager().set(pulse); + } + } + + /** + * Checks if the entity is dead. + * @param e The entity. + * @return {@code True} if so. + */ + public static boolean isDead(Entity e) { + return e.getAttribute("state:death", false); + } + + /** + * Gets the singleton. + * @return The singleton. + */ + public static DeathTask getSingleton() { + return SINGLETON; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/ImpactHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/ImpactHandler.java new file mode 100644 index 000000000..4cecc8c51 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/ImpactHandler.java @@ -0,0 +1,377 @@ +package core.game.node.entity.combat; + +import core.ServerConstants; +import core.game.container.impl.EquipmentContainer; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.pet.Pet; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.zone.ZoneType; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Queue; + +/** + * Class used for handling combat impacts. + * @author Emperor + */ +public final class ImpactHandler { + + /** + * The entity. + */ + private final Entity entity; + + /** + * The amount of ticks impacts have been disabled for. + */ + private int disabledTicks; + + /** + * The impact log. + */ + private final Map impactLog = new HashMap<>(); + + /** + * Gets the current hitsplats to show. + */ + private final Queue impactQueue = new LinkedList(); + + /** + * Constructs a new {@code ImpactHandler} {@code Object}. + * @param entity The entity. + */ + public ImpactHandler(Entity entity) { + this.entity = entity; + } + + /** + * Manually hits the entity. + * @param source The entity dealing the hit. + * @param hit The amount to hit. + * @param type The hitsplat type. + * @return The impact object. + */ + public Impact manualHit(Entity source, int hit, HitsplatType type) { + if (hit > entity.getSkills().getLifepoints()) { + hit = entity.getSkills().getLifepoints(); + } + return handleImpact(source, hit, null, null, type); + } + + /** + * Manually hits the entity. + * @param source The entity dealing the hit. + * @param hit The amount to hit. + * @param type The hitsplat type. + * @param ticks The delay before handling the hit. + * @return The impact object (or null if a pulse got submitted). + */ + public Impact manualHit(final Entity source, int hit, final HitsplatType type, int ticks) { + if (ticks > 0) { + final int damage = hit; + GameWorld.getPulser().submit(new Pulse(ticks, entity) { + @Override + public boolean pulse() { + manualHit(source, damage, type); + return true; + } + }); + return null; + } + return manualHit(source, hit, type); + } + + /** + * Handles an impact. + * @param source The impact-dealing entity. + * @param hit The hit amount. + * @param style The combat style used to deal the impact. + * @return The impact object created. + */ + public Impact handleImpact(Entity source, int hit, CombatStyle style) { + return handleImpact(source, hit, style, null, null, false); + } + + /** + * Handles an impact. + * @param source The impact-dealing entity. + * @param hit The hit amount. + * @param style The combat style used to deal the impact. + * @param state The battle state. + * @return The impact object created. + */ + public Impact handleImpact(Entity source, int hit, CombatStyle style, BattleState state) { + return handleImpact(source, hit, style, state, null, false); + } + + /** + * Handles an impact. + * @param source The impact-dealing entity. + * @param hit The hit amount. + * @param style The combat style used to deal the impact. + * @param state The battle state. + * @param type The hitsplat type. + * @return The impact object created. + */ + public Impact handleImpact(Entity source, int hit, CombatStyle style, BattleState state, HitsplatType type) { + return handleImpact(source, hit, style, state, type, false); + } + + /** + * Handles an impact. + * @param source The impact-dealing entity. + * @param hit The hit amount. + * @param style The combat style used to deal the impact. + * @param state The battle state. + * @param type The hitsplat type. + * @return The impact object created. + */ + public Impact handleImpact(Entity source, int hit, final CombatStyle style, final BattleState state, HitsplatType type, boolean secondary) { + boolean fam = source instanceof Familiar; + if (fam) { + source = ((Familiar) source).getOwner(); + } + if (disabledTicks > GameWorld.getTicks()) { + return null; + } + if (entity instanceof Player && TutorialSession.getExtension((Player) entity).getStage() < TutorialSession.MAX_STAGE) { + Impact impact = new Impact(source, 0, style, HitsplatType.MISS); + impactQueue.add(impact); + return impact; + } + hit -= entity.getSkills().hit(hit); + if (type == null || type == HitsplatType.NORMAL) { + if (hit == 0) { + type = HitsplatType.MISS; + } else { + type = HitsplatType.NORMAL; + } + } else if (hit == 0 && type == HitsplatType.POISON) { + return null; + } + if (hit > 0) { + Integer value = impactLog.get(source); + if (value == null) { + value = 0; + } + impactLog.put(source, hit + value); + } + if (style != null && style.getSwingHandler() != null && source instanceof Player) { + Player player = source.asPlayer(); + if (fam && player.getFamiliarManager().hasFamiliar() && !(player.getFamiliarManager().getFamiliar() instanceof Pet)) { + source.setAttribute("fam-exp", true); + } + style.getSwingHandler().addExperience(source, entity, state); + source.removeAttribute("fam-exp"); + } + boolean dead = false; + if (entity.getSkills().getLifepoints() < 1) { + entity.getProperties().getCombatPulse().stop(); + entity.face(source); + entity.startDeath(getMostDamageEntity(source)); + dead = true; + } else if (entity.getSkills().getLifepoints() < (entity.getSkills().getMaximumLifepoints() * 0.1)) { + if (entity instanceof Player && ((Player) entity).getPrayer().get(PrayerType.REDEMPTION)) { + ((Player) entity).getPrayer().startRedemption(); + } + } + if (entity instanceof Player) { + Player p = entity.asPlayer(); + if (p.getAttribute("godMode", false)) { + p.getSkills().heal(10000); + } + } + Impact impact = new Impact(source, hit, style, type); + impactQueue.add(impact); + if (entity instanceof Player && !dead) { + final Player p = entity.asPlayer(); + if (p.getZoneMonitor().getType() != ZoneType.SAFE.getId() && p.getSkullManager().getLevel() <= 30 && (p.getEquipment().contains(2570, 1))) { + int percentage = (int) (entity.getSkills().getStaticLevel(Skills.HITPOINTS) * 0.10); + if (p.getSkills().getLifepoints() <= percentage) { + p.getEquipment().remove(new Item(2570)); + p.sendMessage("Your ring of life saves you and in the process is destroyed."); + p.teleport(ServerConstants.HOME_LOCATION); + } + } + } + return impact; + } + + /** + * Handles the recoil effect. + * @param attacker The attacker. + * @param hit The hit to handle. + */ + public void handleRecoilEffect(Entity attacker, int hit) { + int damage = (int) Math.ceil(hit * 0.1); + if (entity instanceof Player) { + Player player = (Player) entity; + int current = player.getSavedData().getGlobalData().getRecoilDamage(); + if (damage >= current) { + damage = current; + player.getPacketDispatch().sendMessage("Your Ring of Recoil has shattered."); + player.getEquipment().replace(null, EquipmentContainer.SLOT_RING); + player.getSavedData().getGlobalData().setRecoilDamage(40); + } else { + player.getSavedData().getGlobalData().setRecoilDamage(current - damage); + } + } + if (damage > 0) { + attacker.getImpactHandler().manualHit(entity, damage, HitsplatType.NORMAL); + } + } + + /** + * Gets the player who's dealt the most damage. + * @param killer The killer. + * @return The player. + */ + public Entity getMostDamageEntity(Entity killer) { + Entity entity = this.entity; + if (entity instanceof Player) { + return killer; + } + int damage = -1; + for (Entity e : impactLog.keySet()) { + if (e == this.entity) { + continue; + } + int amount = impactLog.get(e); + if (amount > damage || (entity instanceof NPC && e instanceof Player)) { + damage = amount; + entity = e; + } + } + return entity; + } + + /** + * Gets the impact log. + * @return The impact log. + */ + public Map getImpactLog() { + return impactLog; + } + + /** + * Checks if the entity needs a hit update. + * @return {@code True} if so. + */ + public boolean isHitUpdate() { + return impactQueue.peek() != null; + } + + /** + * Gets the hitsplats. + * @return The hitsplats. + */ + public Queue getImpactQueue() { + return impactQueue; + } + + /** + * Gets the disabledTicks. + * @return The disabledTicks. + */ + public int getDisabledTicks() { + return disabledTicks; + } + + /** + * Sets the disabledTicks. + */ + public void setDisabledTicks(int ticks) { + this.disabledTicks = GameWorld.getTicks() + ticks; + } + + /** + * Represents an impact. + * @author Emperor + */ + public static class Impact { + + /** + * The impact-dealing entity. + */ + private final Entity source; + + /** + * The hit amount. + */ + private final int amount; + + /** + * The combat style used to deal the hit. + */ + private final CombatStyle style; + + /** + * The hitsplat type. + */ + private final HitsplatType type; + + /** + * Constructs a new {@code ImpactHandler} {@code Object}. + * @param source The impact-dealing entity. + * @param amount The hit amount. + * @param style The combat style used to deal the hit. + * @param type The hitsplat type. + */ + public Impact(Entity source, int amount, CombatStyle style, HitsplatType type) { + this.source = source; + this.amount = amount; + this.style = style; + this.type = type; + } + + /** + * Gets the source. + * @return The source. + */ + public Entity getSource() { + return source; + } + + /** + * Gets the amount. + * @return The amount. + */ + public int getAmount() { + return amount; + } + + /** + * Gets the style. + * @return The style. + */ + public CombatStyle getStyle() { + return style; + } + + /** + * Gets the type. + * @return The type. + */ + public HitsplatType getType() { + return type; + } + } + + /** + * Represents the hitsplat types. + * @author Emperor + */ + public static enum HitsplatType { + MISS, NORMAL, POISON, DISEASE, NORMAL_1, VENOM; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/InteractionType.java b/Server/src/main/java/Server/core/game/node/entity/combat/InteractionType.java new file mode 100644 index 000000000..38c6d352c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/InteractionType.java @@ -0,0 +1,24 @@ +package core.game.node.entity.combat; + +/** + * The interaction types for combat. + * @author Emperor + */ +public enum InteractionType { + + /** + * The entity can hit while standing still. + */ + STILL_INTERACT, + + /** + * The entity can hit while following the victim. + */ + MOVE_INTERACT, + + /** + * The entity can't hit its target. + */ + NO_INTERACT; + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/Ammunition.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/Ammunition.java new file mode 100644 index 000000000..33461f024 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/Ammunition.java @@ -0,0 +1,203 @@ +package core.game.node.entity.combat.equipment; + +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Projectile; +import core.game.world.update.flag.context.Graphics; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +/** + * Represents range ammunition types. + * @author Emperor + */ +public final class Ammunition { + + /** + * The ammunition mapping. + */ + private static final Map AMMUNITION = new HashMap(); + + /** + * The ammunition item id. + */ + private final int itemId; + + /** + * The start graphics. + */ + private final Graphics startGraphics; + + /** + * The start graphics when using Dark bow. + */ + private final Graphics darkBowGraphics; + + /** + * The projectile. + */ + private final Projectile projectile; + + /** + * The poison damage. + */ + private final int poisonDamage; + + /** + * The bolt effect. + */ + private BoltEffect effect; + + /** + * Constructs a new {@code Ammunition} object. + * @param itemId The item id. + * @param startGraphics The start graphics. + * @param darkBowGraphics The dark bow start graphics. + * @param projectile The projectile. + * @param poisonDamage The poison damage the ammunition can do. + */ + public Ammunition(int itemId, Graphics startGraphics, Graphics darkBowGraphics, Projectile projectile, int poisonDamage) { + this.itemId = itemId; + this.startGraphics = startGraphics; + this.darkBowGraphics = darkBowGraphics; + this.poisonDamage = poisonDamage; + this.projectile = projectile; + } + + /** + * Loads all the {@code Ammunition} info to the mapping. + * @return {@code True}. + */ + public static final boolean initialize() { + Document doc; + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + doc = builder.parse(new File("This file never existed. I have no idea how this code works, but it probably doesn't get called anywhere.")); + } catch (Throwable e) { + e.printStackTrace(); + return false; + } + NodeList nodeList = doc.getDocumentElement().getChildNodes(); + for (short i = 1; i < nodeList.getLength(); i += 2) { + Node n = nodeList.item(i); + if (n != null) { + if (n.getNodeName().equalsIgnoreCase("Ammunition")) { + NodeList list = n.getChildNodes(); + int itemId = 0; + int graphicsId = 0; + Graphics startGraphics = null; + Graphics darkBowGraphics = null; + Projectile projectile = null; + for (int a = 1; a < list.getLength(); a += 2) { + Node node = list.item(a); + if (node.getNodeName().equalsIgnoreCase("itemId")) { + itemId = Integer.parseInt(node.getTextContent()); + } else if (node.getNodeName().equalsIgnoreCase("startGraphicsId")) { + graphicsId = Integer.parseInt(node.getTextContent()); + } else if (node.getNodeName().equalsIgnoreCase("startGraphicsHeight")) { + startGraphics = new Graphics(graphicsId, Integer.parseInt(node.getTextContent()), 0); + } else if (node.getNodeName().equalsIgnoreCase("darkBowGraphicsId")) { + graphicsId = Integer.parseInt(node.getTextContent()); + } else if (node.getNodeName().equalsIgnoreCase("darkBowGraphicsHeight")) { + darkBowGraphics = new Graphics(graphicsId, Integer.parseInt(node.getTextContent()), 0); + } else if (node.getNodeName().equalsIgnoreCase("projectileId")) { + int startHeight = Integer.parseInt(node.getAttributes().getNamedItem("start_height").getTextContent()); + int type = Integer.parseInt(node.getAttributes().getNamedItem("type").getTextContent()); + int angle = Integer.parseInt(node.getAttributes().getNamedItem("angle").getTextContent()); + int baseSpeed = Integer.parseInt(node.getAttributes().getNamedItem("base_speed").getTextContent()); + int projectileId = Integer.parseInt(node.getTextContent()); + projectile = Projectile.create((Entity) null, null, projectileId, startHeight, 36, type, baseSpeed, angle, 0); + } else if (node.getNodeName().equalsIgnoreCase("poisonDamage")) { + AMMUNITION.put(itemId, new Ammunition(itemId, startGraphics, darkBowGraphics, projectile, Integer.parseInt(node.getTextContent()))); + } + } + } + } + } + return true; + } + + public static void main(String... args) { + initialize(); + } + + /** + * Gets the ammunition mapping. + * @return The mapping. + */ + public static Map getAmmunition() { + return AMMUNITION; + } + + /** + * Gets an ammunition object from the mapping. + * @param id The ammo id. + * @return The ammunition object. + */ + public static final Ammunition get(int id) { + return AMMUNITION.get(id); + } + + /** + * @return the itemId + */ + public int getItemId() { + return itemId; + } + + /** + * @return the startGraphics + */ + public Graphics getStartGraphics() { + return startGraphics; + } + + /** + * @return the darkBowGraphics + */ + public Graphics getDarkBowGraphics() { + return darkBowGraphics; + } + + /** + * @return the projectile + */ + public Projectile getProjectile() { + return projectile; + } + + /** + * @return the poisonDamage + */ + public int getPoisonDamage() { + return poisonDamage; + } + + /** + * Gets the effect. + * @return the effect + */ + public BoltEffect getEffect() { + return effect; + } + + /** + * Sets the baeffect. + * @param effect the effect to set. + */ + public void setEffect(BoltEffect effect) { + this.effect = effect; + } + + @Override + public String toString() { + return "Ammunition [itemId=" + itemId + ", startGraphics=" + startGraphics + ", darkBowGraphics=" + darkBowGraphics + ", projectile=" + projectile + ", poisonDamage=" + poisonDamage + ", effect=" + effect + "]"; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/ArmourSet.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/ArmourSet.java new file mode 100644 index 000000000..16097c032 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/ArmourSet.java @@ -0,0 +1,203 @@ +package core.game.node.entity.combat.equipment; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the types of armour sets. + * @author Emperor + */ +public enum ArmourSet { + + /** + * Ahrim the blighted barrows set. + */ + AHRIM(new Graphics(401, 96), new int[][] { { 4708, 4856, 4857, 4858, 4859 }, { 4710, 4862, 4863, 4864, 4865 }, { 4712, 4868, 4869, 4870, 4871 }, { 4714, 4874, 4875, 4876, 4877 } }) { + @Override + public boolean effect(Entity e, Entity victim, BattleState state) { + if (RandomFunction.random(100) < 20) { + victim.getSkills().updateLevel(Skills.STRENGTH, -5, 0); + return true; + } + return false; + } + + @Override + public boolean isUsing(Entity e) { + if (e instanceof NPC && ((NPC) e).getId() == 2025) { + return true; + } + return super.isUsing(e); + } + }, + + /** + * Dharok the wretched barrows set. + */ + DHAROK(null, new int[][] { { 4716, 4880, 4881, 4882, 4883 }, { 4718, 4886, 4887, 4888, 4889 }, { 4720, 4892, 4893, 4894, 4895 }, { 4722, 4898, 4899, 4900, 4901 } }) { + @Override + public boolean isUsing(Entity e) { + if (e instanceof NPC && ((NPC) e).getId() == 2026) { + return true; + } + return super.isUsing(e); + } + }, + + /** + * Guthan the infested barrows set. + */ + GUTHAN(new Graphics(398, 96), new int[][] { { 4724, 4904, 4905, 4906, 4907 }, { 4726, 4910, 4911, 4912, 4913 }, { 4728, 4916, 4917, 4918, 4919 }, { 4730, 4922, 4923, 4924, 4925 } }) { + @Override + public boolean effect(Entity e, Entity victim, BattleState state) { + if (RandomFunction.random(100) < 25) { + e.getSkills().heal(state.getEstimatedHit()); + return true; + } + return false; + } + + @Override + public boolean isUsing(Entity e) { + if (e instanceof NPC && ((NPC) e).getId() == 2027) { + return true; + } + return super.isUsing(e); + } + }, + + /** + * Karil the tainted barrows set. + */ + KARIL(new Graphics(400, 96), new int[][] { { 4732, 4928, 4929, 4930, 4931 }, { 4734, 4934, 4935, 4936, 4937 }, { 4736, 4940, 4941, 4942, 4943 }, { 4738, 4946, 4947, 4948, 4949 } }) { + @Override + public boolean effect(Entity e, Entity victim, BattleState state) { + if (state.getEstimatedHit() > 9 && RandomFunction.random(100) < 20) { + victim.getSkills().updateLevel(Skills.AGILITY, -(state.getEstimatedHit() / 10), 0); + return true; + } + return false; + } + + @Override + public boolean isUsing(Entity e) { + if (e instanceof NPC && ((NPC) e).getId() == 2028) { + return true; + } + return super.isUsing(e); + } + }, + + /** + * Torag the corrupted barrows set. + */ + TORAG(new Graphics(399, 96), new int[][] { { 4745, 4952, 4953, 4954, 4955 }, { 4747, 4958, 4959, 4960, 4961 }, { 4749, 4964, 4965, 4966, 4967 }, { 4751, 4970, 4971, 4972, 4973 } }) { + @Override + public boolean effect(Entity e, Entity victim, BattleState state) { + if (state.getEstimatedHit() > 0 && RandomFunction.random(100) < 20) { + if (victim instanceof Player) { + ((Player) victim).getSettings().updateRunEnergy(20); + } + return true; + } + return false; + } + + @Override + public boolean isUsing(Entity e) { + if (e instanceof NPC && ((NPC) e).getId() == 2029) { + return true; + } + return super.isUsing(e); + } + }, + + /** + * Verac the defiled barrows set. + */ + VERAC(null, new int[][] { { 4753, 4976, 4977, 4978, 4979 }, { 4755, 4982, 4983, 4984, 4985 }, { 4757, 4988, 4989, 4990, 4991 }, { 4759, 4994, 4995, 4996, 4997 } }) { + @Override + public boolean isUsing(Entity e) { + if (e instanceof NPC && ((NPC) e).getId() == 2030) { + return true; + } + return super.isUsing(e); + } + }; + + /** + * The end graphic. + */ + private final Graphics endGraphic; + + /** + * The items. + */ + private final Item[][] sets; + + /** + * Constructs a new {@code ArmourSet} {@code Object}. + * @param endGraphic the end. + * @param set the set. + */ + private ArmourSet(Graphics endGraphic, int[][] set) { + this.endGraphic = endGraphic; + this.sets = new Item[4][5]; + for (int i = 0; i < set.length; i++) { + for (int k = 0; k < sets[i].length; k++) { + sets[i][k] = new Item(set[i][k]); + } + } + } + + /** + * Visualizes the effect. + * @param e The entity using the effect. + * @param victim The victim. + */ + public void visualize(Entity e, Entity victim) { + if (endGraphic != null) { + victim.graphics(endGraphic); + } + } + + /** + * Handles the effect of the armour set. + * @param e The entity using the effect. + * @param victim The victim. + * @param state The battle state. + * @return {@code True} if an effect occured. + */ + public boolean effect(Entity e, Entity victim, BattleState state) { + return false; + } + + /** + * Checks if the entity is wearing this armour set. + * @param e The entity. + * @return {@code True} if so. + */ + public boolean isUsing(Entity e) { + if (!(e instanceof Player)) { + return false; + } + Player p = (Player) e; + int hits = 0; + for (int i = 0; i < sets.length; i++) { + for (Item item : sets[i]) { + if (p.getEquipment().containsAtLeastOneItem(item.getId())) { + hits++; + break; + } + } + } + return hits == 4; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/BoltEffect.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/BoltEffect.java new file mode 100644 index 000000000..f75c57112 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/BoltEffect.java @@ -0,0 +1,281 @@ +package core.game.node.entity.combat.equipment; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.entity.state.EntityState; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents a bolt effect. + * @author Vexia + * @author Aero + */ +public enum BoltEffect { + OPAL(9236, Graphics.create(749), new Audio(2918)) { + + @Override + public void impact(BattleState state) { + state.setEstimatedHit(state.getEstimatedHit() + RandomFunction.random(3, 20)); + if (state.getEstimatedHit() > 29) { + state.setEstimatedHit(21); + } + super.impact(state); + } + + }, + JADE(9237, new Graphics(755), new Audio(2916)) { + + @Override + public void impact(BattleState state) { + if (state.getVictim() instanceof Player) { + Player p = state.getVictim().asPlayer(); + p.lock(2); + } + super.impact(state); + } + + @Override + public boolean canFire(BattleState state) { + boolean success = false; + if (state.getVictim() instanceof Player) { + Player p = state.getVictim().asPlayer(); + double level = p.getSkills().getLevel(Skills.AGILITY); + double req = 80; + double successChance = Math.ceil((level * 50 - req * 15) / req / 3 * 4); + int roll = RandomFunction.random(99); + success = successChance >= roll; + } + return super.canFire(state) && !success; + } + + }, + PEARL(9238, Graphics.create(750), new Audio(2920)) { + + @Override + public void impact(BattleState state) { + state.setEstimatedHit(state.getEstimatedHit() + RandomFunction.random(3, 20)); + if (state.getEstimatedHit() > 29) { + state.setEstimatedHit(21); + } + super.impact(state); + } + + @Override + public boolean canFire(BattleState state) { + if (state.getVictim() instanceof Player) { + if (state.getVictim().asPlayer().getEquipment().contains(1383, 1) || state.getVictim().asPlayer().getEquipment().contains(1395, 1)) { + return false; + } + } + return super.canFire(state); + } + }, + TOPAZ(9239, Graphics.create(757), new Audio(2914)) { + @Override + public void impact(BattleState state) { + if (state.getVictim() instanceof Player) { + Player p = state.getVictim().asPlayer(); + int level = (int) ((int) p.getSkills().getLevel(Skills.MAGIC) * 0.03); + p.getSkills().updateLevel(Skills.MAGIC, -level, 0); + } + super.impact(state); + } + }, + SAPPHIRE(9240, new Graphics(759, 100), new Audio(2912)) { + @Override + public void impact(BattleState state) { + if (state.getVictim() instanceof Player && state.getAttacker() instanceof Player) { + Player p = state.getVictim().asPlayer(); + Player player = state.getAttacker().asPlayer(); + int give = (int) (p.getSkills().getPrayerPoints() * 0.05); + if (give > 0) { + p.getSkills().decrementPrayerPoints(give); + player.getSkills().incrementPrayerPoints(give); + } + } + super.impact(state); + } + }, + EMERALD(9241, new Graphics(752), new Audio(2919)) { + @Override + public void impact(BattleState state) { + state.getVictim().getStateManager().register(EntityState.POISONED, false, 68, state.getAttacker()); + super.impact(state); + } + }, + RUBY(9242, new Graphics(754), new Audio(2915)) { + + @Override + public void impact(BattleState state) { + int victimPoints = (int) (state.getVictim().getSkills().getLifepoints() * 0.20); + int playerPoints = (int) (state.getAttacker().getSkills().getLifepoints() * 0.10); + if (victimPoints >= 35) { + victimPoints = 35; + } + int total = state.getEstimatedHit() + victimPoints; + if (total >= 35) { + total = 35; + } + state.setEstimatedHit(total); + state.getAttacker().getImpactHandler().manualHit(state.getVictim(), playerPoints, HitsplatType.NORMAL); + super.impact(state); + } + + @Override + public boolean canFire(BattleState state) { + int playerPoints = (int) (state.getAttacker().getSkills().getLifepoints() * 0.10); + if (playerPoints < 1) { + return false; + } + return super.canFire(state) && state.getAttacker().getSkills().getLifepoints() - playerPoints >= 1; + } + }, + DIAMOND(9243, new Graphics(758), new Audio(2913)) { + @Override + public void impact(BattleState state) { + state.setEstimatedHit(state.getEstimatedHit() + RandomFunction.random(5, 14)); + super.impact(state); + } + }, + DRAGON(9244, new Graphics(756), new Audio(2915)) { + + @Override + public void impact(BattleState state) { + state.setEstimatedHit(state.getEstimatedHit() + RandomFunction.random(17, 29)); + super.impact(state); + } + + @Override + public boolean canFire(BattleState state) { + if (state.getVictim() instanceof NPC) { + NPC n = (NPC) state.getVictim(); + if (n.getName().toLowerCase().contains("fire") || n.getName().toLowerCase().contains("dragon")) { + return false; + } + } + if (state.getVictim() instanceof Player) { + if (state.getVictim().asPlayer().getEquipment().contains(1540, 1) || state.getVictim().asPlayer().getEquipment().contains(11283, 1) || state.getVictim().hasFireResistance()) { + return false; + } + } + return super.canFire(state); + } + + }, + ONYX(9245, new Graphics(753), new Audio(2917)) { + + @Override + public void impact(BattleState state) { + int newDamage = (int) (state.getEstimatedHit() * 0.25); + state.setEstimatedHit(state.getEstimatedHit() + newDamage); + state.getAttacker().getSkills().heal((int) (state.getEstimatedHit() * 0.25)); + state.getAttacker().setAttribute("onyx-effect", GameWorld.getTicks() + 12); + super.impact(state); + } + + @Override + public boolean canFire(BattleState state) { + if (state.getAttacker().getAttribute("onyx-effect", 0) > GameWorld.getTicks()) { + return false; + } + if (state.getVictim() instanceof NPC) { + NPC n = (NPC) state.getVictim(); + if (n.getTask() != null && n.getTask().undead) { + return false; + } + } + return super.canFire(state); + } + }; + + /** + * The item id of the bolt. + */ + private final int itemId; + + /** + * The graphics to send. + */ + private final Graphics graphics; + + /** + * The sound to send. + */ + private final Audio sound; + + /** + * Constructs a new {@Code BoltEffect} {@Code Object} + * @param itemId the item id. + * @param graphics the graphics. + * @param sound the sound. + */ + private BoltEffect(int itemId, Graphics graphics, Audio sound) { + this.itemId = itemId; + this.graphics = graphics; + this.sound = sound; + } + + /** + * Constructs a new {@Code BoltEffect} {@Code Object} + * @param itemId the id. + * @param graphics the graphics. + */ + private BoltEffect(int itemId, Graphics graphics) { + this(itemId, graphics, null); + } + + /** + * Handles the impact. + * @param state the battle state. + */ + @SuppressWarnings("unused") + public void impact(BattleState state) { + Entity entity = state.getAttacker(); + Entity victim = state.getVictim(); + if (sound != null && victim != null && victim instanceof Player) { + sound.send(victim.asPlayer(), true); + } + if (graphics != null) { + victim.graphics(graphics); + } + } + + /** + * Checks if the effect can fire. + * @param state the state. + * @return {@code True} if so. + */ + public boolean canFire(BattleState state) { + return RandomFunction.random(13) == 5; + } + + /** + * Gets an effect by the id. + * @param id the id. + * @return the effect. + */ + public static BoltEffect forId(int id) { + for (BoltEffect effect : values()) { + if (effect.getItemId() == id) { + return effect; + } + } + return null; + } + + /** + * Gets the itemId. + * @return the itemId + */ + public int getItemId() { + return itemId; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/DefaultCombatSpell.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/DefaultCombatSpell.java new file mode 100644 index 000000000..fcbfa6133 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/DefaultCombatSpell.java @@ -0,0 +1,64 @@ +package core.game.node.entity.combat.equipment; + +import core.game.node.entity.skill.Skills; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.link.SpellBookManager; +import core.plugin.Plugin; + +/** + * Handles the default combat spell for NPCs. + * @author Emperor + */ +public final class DefaultCombatSpell extends CombatSpell { + + /** + * The projectile id. + */ + private final int projectileId; + + /** + * The start height of the projectile. + */ + private final int startHeight; + + /** + * Constructs a new {@code DefaultCombatSpell} {@code Object}. + * @param npc The NPC. + */ + public DefaultCombatSpell(NPC npc) { + super(SpellType.BOLT, SpellBookManager.SpellBook.MODERN, 0, 0.0, -1, -1, npc.getProperties().getMagicAnimation(), npc.getDefinition().getCombatGraphics()[0], null, npc.getDefinition().getCombatGraphics()[2]); + if (npc.getDefinition().getCombatGraphics()[1] != null) { + this.projectileId = npc.getDefinition().getCombatGraphics()[1].getId(); + this.startHeight = npc.getDefinition().getCombatGraphics()[1].getHeight(); + } else { + this.projectileId = -1; + this.startHeight = 42; + } + } + + @Override + public void visualize(Entity entity, Node target) { + if (projectileId != -1) { + super.projectile = Projectile.magic(entity, (Entity) target, projectileId, startHeight, 36, 52, 15); + } + super.visualize(entity, target); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + int level = entity.getSkills().getLevel(Skills.MAGIC); + int bonus = entity.getProperties().getBonuses()[13]; + return (int) ((14 + level + (bonus / 8) + ((level * bonus) * 0.016865))) / 10 + 1; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + return null; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/DegradableEquipment.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/DegradableEquipment.java new file mode 100644 index 000000000..e082366e2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/DegradableEquipment.java @@ -0,0 +1,152 @@ +package core.game.node.entity.combat.equipment; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles equipment degrading. + * @author Emperor + */ +public abstract class DegradableEquipment implements Plugin { + + /** + * The equipment lists. + */ + private static final List[] EQUIPMENT = new ArrayList[14]; + + /** + * The equipment slot. + */ + private final int slot; + + /** + * The item ids. + */ + private final int[] itemIds; + + /** + * Constructs a new {@code DegradableEquipment} {@code Object}. + * @param slot The equipment slot. + * @param itemIds The item ids. + */ + public DegradableEquipment(int slot, int... itemIds) { + this.slot = slot; + this.itemIds = itemIds; + } + + + + /** + * Handles equipment degrading. + * @param player The player. + * @param entity The combat entity. + * @param attack If the player is attacking instead of defending. + */ + public static void degrade(Player player, Entity entity, boolean attack) { + /*if (attack) { + checkDegrade(player, entity, EquipmentContainer.SLOT_WEAPON); + return; + } + for (int i = 0; i < 14; i++) { + if (i != EquipmentContainer.SLOT_WEAPON && i != EquipmentContainer.SLOT_ARROWS) { + checkDegrade(player, entity, i); + } + }*/ + } + + /** + * Checks the degrading equipment on an equipment slot. + * @param player The player. + * @param entity The entity. + * @param slot The slot to check. + */ + public static void checkDegrade(Player player, Entity entity, int slot) { + /*Item item = player.getEquipment().get(slot); + if(item != null) { + roar: + { + for (DegradableEquipment e : EQUIPMENT[slot]) { + for (int itemId : e.itemIds) { + if (itemId == item.getId()) { + e.degrade(player, entity, item); + break roar; + } + } + } + } + }*/ + } + + /** + * Gets the item to drop. + * @param itemId The item id. + * @return The dropped item. + */ + public static int getDropReplacement(int itemId) { + for (int i = 0; i < EQUIPMENT.length; i++) { + if (EQUIPMENT[i] == null) { + continue; + } + for (DegradableEquipment e : EQUIPMENT[i]) { + for (int id : e.itemIds) { + if (id == itemId) { + return e.getDropItem(id); + } + } + } + } + return itemId; + } + + /** + * Called when the player receives a hit. + * @param player The player. + * @param entity The combat entity. + * @param item The degrading equipment item. + */ + public abstract void degrade(Player player, Entity entity, Item item); + + /** + * Gets the item to drop when this equipment is getting dropped. + * @param itemId The drop item. + * @return The item to drop. + */ + public abstract int getDropItem(int itemId); + + @Override + public DegradableEquipment newInstance(Object arg) { + List equipment = EQUIPMENT[slot]; + if (equipment == null) { + equipment = EQUIPMENT[slot] = new ArrayList<>(); + } + equipment.add(this); + return this; + } + + @Override + public Object fireEvent(String key, Object... args) { + return null; + } + + /** + * Gets the slot. + * @return The slot. + */ + public int getSlot() { + return slot; + } + + /** + * Gets the itemIds. + * @return The itemIds. + */ + public int[] getItemIds() { + return itemIds; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/EquipmentDegrader.kt b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/EquipmentDegrader.kt new file mode 100644 index 000000000..140e15f57 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/EquipmentDegrader.kt @@ -0,0 +1,97 @@ +package core.game.node.entity.combat.equipment + +import core.game.node.entity.player.Player +import core.game.node.item.Item +/** + * Handles equipment degrading + * @author ceik + */ +class EquipmentDegrader{ + + companion object StaticDegrader { //Use a static companion object for lists and registers so they persist across instances + val itemList = arrayListOf() + val setList = arrayListOf>() + fun register(item: Int){ + itemList.add(item) + } + + fun registerSet(items: Array){ + setList.add(ArrayList(items.map { item -> item.also { register(item) } })) + } + } + + + + var p: Player? = null + + fun Int.canDegrade(): Boolean { //extension function that checks if an item can degrade + return itemList.contains(this) + } + + fun checkArmourDegrades(player: Player?){ //loops the player slots and if the item in that slot is non-null, checks if it can degrade etc + p = player + for(slot in 0..12){ + if(slot == 3){ + continue + } + player?.equipment?.get(slot)?.let { if(it.id.canDegrade()) it.degrade(slot) } + } + } + + fun checkWeaponDegrades(player: Player?){ + p = player + player?.equipment?.get(3)?.let { if(it.id.canDegrade()) it.degrade(3) } + } + + fun Item.degrade(slot: Int){ //extension function that degrades items + val set = getDegradableSet(this.id) + this.charge-- + if(set?.indexOf(this.id) == 0 && !this.name.contains("100")){ + charge = 0 + } + if(this.charge <= 0) { + if (set?.size!! > 2) { + p?.equipment?.remove(this) + p?.sendMessage("Your $name has degraded.") + if (set.isNextLast(set.indexOf(this.id))) { + p?.inventory?.add(Item(set.getNext(this.id))) + p?.sendMessage("Your $name has broken.") + } else { + p?.equipment?.add(Item(set.getNext(this.id)), slot, false, false) + p?.equipment?.refresh() + } + } else if (set.size == 2) { + if(set.isLast(set.indexOf(this.id))){ + p?.equipment?.remove(this) + p?.sendMessage("Your $name degrades into dust.") + } else { + p?.equipment?.remove(this) + p?.sendMessage("Your $name has degraded.") + p?.equipment?.add(Item(set.getNext(this.id)), slot, false, false) + p?.equipment?.refresh() + } + } + } + } + + private fun getDegradableSet(item: Int): ArrayList?{ //gets the set of items this item belongs to + for(set in setList){ + if(set.contains(item)) + return set + } + return null + } + + private fun ArrayList.getNext(any: Any?): T{ //gets the next member from a list + val indexOfCurrent = this.indexOf(any) + return get(indexOfCurrent + 1) + } + + private fun ArrayList.isNextLast(current: Int): Boolean{ //checks if the next member in a list is last. + return current + 1 >= size - 1 + } + + private fun ArrayList.isLast(current: Int): Boolean{ + return current + 1 > size - 1 + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/FireType.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/FireType.java new file mode 100644 index 000000000..d4d18d910 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/FireType.java @@ -0,0 +1,115 @@ +package core.game.node.entity.combat.equipment; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.system.task.NodeTask; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +/** + * The fire types. + * @author Emperor + */ +public enum FireType { + + /** + * The normal dragonfire fire type. + */ + FIERY_BREATH(new Animation(81, Priority.HIGH), 393, new NodeTask(0) { + @Override + public boolean exec(Node node, Node... n) { + return true; + } + }), + + /** + * The shocking breath fire type. + */ + SHOCKING_BREATH(new Animation(84, Priority.HIGH), 396, new NodeTask(0) { + @Override + public boolean exec(Node node, Node... n) { + if (RandomFunction.random(10) < 3) { + ((Entity) node).getSkills().updateLevel(RandomFunction.random(3), -5, 0); + if (node instanceof Player) { + ((Player) node).getPacketDispatch().sendMessage("You have been shocked."); + } + } + return true; + } + }), + + /** + * The toxic breath fire type. + */ + TOXIC_BREATH(new Animation(82, Priority.HIGH), 394, new NodeTask(0) { + @Override + public boolean exec(Node node, Node... n) { + ((Entity) node).getStateManager().register(EntityState.POISONED, false, 80, (Entity) n[0]); + return true; + } + }), + + /** + * The freezing breath fire type. + */ + ICY_BREATH(new Animation(83, Priority.HIGH), 395, new NodeTask(0) { + @Override + public boolean exec(Node node, Node... n) { + ((Entity) node).getStateManager().set(EntityState.FROZEN, 7); + return true; + } + }); + + /** + * The attack animation. + */ + private final Animation animation; + + /** + * The projectile id. + */ + private final int projectileId; + + /** + * The breath effect. + */ + private final NodeTask task; + + /** + * Constructs a new {@code FireType} {@code Object}. + * @param animation The animation. + */ + private FireType(Animation animation, int projectileId, NodeTask breathEffect) { + this.animation = animation; + this.projectileId = projectileId; + task = breathEffect; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Gets the projectileId. + * @return The projectileId. + */ + public int getProjectileId() { + return projectileId; + } + + /** + * Gets the task. + * @return The task. + */ + public NodeTask getTask() { + return task; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/RangeWeapon.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/RangeWeapon.java new file mode 100644 index 000000000..e82601410 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/RangeWeapon.java @@ -0,0 +1,211 @@ +package core.game.node.entity.combat.equipment; + +import core.game.node.entity.impl.Animator.Priority; +import core.game.world.update.flag.context.Animation; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * A class holding all the range weapon definitions. + * @author Emperor + */ +public final class RangeWeapon { + + /** + * The range weapons mapping. + */ + private static final Map RANGE_WEAPONS = new HashMap(); + + /** + * The mapping containing all the possible ammunition types. + */ + private final List ammunition; + + /** + * The item id. + */ + private final int itemId; + + /** + * The attack animation id. + */ + private final Animation animation; + + /** + * The attack speed. + */ + private final int attackSpeed; + + /** + * The equipment slot the ammunition uses, if any. + */ + private final int ammunitionSlot; + + /** + * The weapon type. + */ + private final int type; + + /** + * If we should drop ammo. + */ + private final boolean dropAmmo; + + /** + * Constructs a new {@code RangeWeapon} {@code Object}. + * @param itemId The item id. + * @param animation The animation. + * @param attackSpeed The attack speed. + * @param ammunitionSlot The ammunition's equipment slot, or -1 if not worn. + * @param type The weapon type. + * @param dropAmmo If the ammunition should be dropped. + * @param ammunition The possible ammunition vector list. + */ + public RangeWeapon(int itemId, Animation animation, int attackSpeed, int ammunitionSlot, int type, boolean dropAmmo, List ammunition) { + this.itemId = itemId; + this.animation = animation; + this.attackSpeed = attackSpeed; + this.ammunitionSlot = ammunitionSlot; + this.type = type; + this.dropAmmo = dropAmmo; + this.ammunition = ammunition; + } + + /** + * Populates the range weapons mapping. + * @return {@code True}. + */ + public static boolean initialize() { + Document doc; + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + doc = builder.parse(new File("This file never existed. I have no idea how this code works, but it probably doesn't get called anywhere")); + } catch (Throwable e) { + e.printStackTrace(); + return false; + } + NodeList nodeList = doc.getDocumentElement().getChildNodes(); + System.out.println("Loading range weapon info..."); + for (short i = 1; i < nodeList.getLength(); i += 2) { + Node n = nodeList.item(i); + if (n != null) { + if (n.getNodeName().equalsIgnoreCase("Weapon")) { + NodeList list = n.getChildNodes(); + int itemId = 0; + int animationId = 426; + int attackSpeed = 4; + int slot = 13; + int type = 0; + boolean dropAmmo = true; + List ammo = new ArrayList(); + for (int a = 1; a < list.getLength(); a += 2) { + Node node = list.item(a); + if (node.getNodeName().equalsIgnoreCase("itemId")) { + itemId = Integer.parseInt(node.getTextContent()); + } else if (node.getNodeName().equalsIgnoreCase("animationId")) { + animationId = Integer.parseInt(node.getTextContent()); + } else if (node.getNodeName().equalsIgnoreCase("attackSpeed")) { + attackSpeed = Integer.parseInt(node.getTextContent()); + } else if (node.getNodeName().equalsIgnoreCase("ammunitionSlot")) { + slot = Integer.parseInt(node.getTextContent()); + } else if (node.getNodeName().equalsIgnoreCase("type")) { + type = Integer.parseInt(node.getTextContent()); + } else if (node.getNodeName().equalsIgnoreCase("drop_ammo")) { + dropAmmo = Boolean.parseBoolean(node.getTextContent()); + } else if (node.getNodeName().equalsIgnoreCase("ammunition")) { + int ammunitionId = Integer.parseInt(node.getTextContent()); + ammo.add(ammunitionId); + } + } + RANGE_WEAPONS.put(itemId, new RangeWeapon(itemId, new Animation(animationId, 0, Priority.HIGH), attackSpeed, slot, type, dropAmmo, ammo)); + } + } + } + System.out.println("Loaded " + RANGE_WEAPONS.size() + " range weapon definitions."); + return true; + } + + /** + * Gets the range weapons mapping. + * @return The range weapons. + */ + public static Map getRangeWeapons() { + return RANGE_WEAPONS; + } + + /** + * Gets a range weapon instance from the mapping. + * @param id The item id. + * @return The instance. + */ + public static RangeWeapon get(int id) { + return RANGE_WEAPONS.get(id); + } + + /** + * @return the itemId + */ + public int getItemId() { + return itemId; + } + + /** + * @return the animation + */ + public Animation getAnimation() { + return animation; + } + + /** + * @return the ammunitionSlot + */ + public int getAmmunitionSlot() { + return ammunitionSlot; + } + + /** + * @return the ammunition + */ + public List getAmmunition() { + return ammunition; + } + + /** + * @return the attackSpeed + */ + public int getAttackSpeed() { + return attackSpeed; + } + + /** + * @return the type + */ + public int getType() { + return type; + } + + /** + * Gets the weapon type. + * @return The weapon type. + */ + public Weapon.WeaponType getWeaponType() { + return Weapon.WeaponType.values()[type]; + } + + /** + * @return the dropAmmo + */ + public boolean isDropAmmo() { + return dropAmmo; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/SpellType.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/SpellType.java new file mode 100644 index 000000000..135dcf8c5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/SpellType.java @@ -0,0 +1,255 @@ +package core.game.node.entity.combat.equipment; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; + +/** + * Represents the spell types. + * @author Emperor + */ +public enum SpellType { + + /** + * The strike spell type. + */ + STRIKE(1.0) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + if (victim instanceof NPC && ((NPC) victim).getId() == 205) { + return 8 + base; + } + return 2 * base; + } + }, + + /** + * The bolt spell type. + */ + BOLT(1.1) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + if (e instanceof Player && ((Player) e).getEquipment().getNew(EquipmentContainer.SLOT_HANDS).getId() == 777) { + return 11 + base; + } + return 8 + base; + } + }, + + /** + * Crumble undead. + */ + CRUMBLE_UNDEAD(1.2) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + return 15; // Hits as high as Earth blast + } + }, + + /** + * The blast spell type. + */ + BLAST(1.2) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + return 12 + base; + } + }, + + /** + * The wave spell type. + */ + WAVE(1.3) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + return 16 + base; + } + }, + + /** + * The rush spell type. + */ + RUSH(1.1) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + return 14 + base; + } + }, + + /** + * The burst spell type. + */ + BURST(1.2) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + + return 18 + base; + } + }, + + /** + * The blitz spell type. + */ + BLITZ(1.3) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + return 22 + base; + } + }, + + /** + * The barrage spell type. + */ + BARRAGE(1.4) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + System.out.println("Attacker - >" + e.getName()); + System.out.println("Victim - >" + victim.getName()); + System.out.println("Accuracy Mod -> " + getAccuracyMod()); + System.out.println("Base Mod -> " + base); + return 26 + base; + } + }, + + /** + * The confuse spell type. + */ + CONFUSE(1.15), + + /** + * The weaken spell type. + */ + WEAKEN(1.15), + + /** + * The curse spell type. + */ + CURSE(1.15), + + /** + * The vulnerability spell type. + */ + VULNERABILITY(1.25), + + /** + * The enfeeble spell type. + */ + ENFEEBLE(1.25), + + /** + * The stun spell type. + */ + STUN(1.25), + + /** + * The god strike spell type. + */ + GOD_STRIKE(1.2) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + if(!(e instanceof Player)) return 20; + if (e.asPlayer().hasActiveState("godcharge")) { + Item cape = ((Player) e).getEquipment().getNew(EquipmentContainer.SLOT_CAPE); + if (cape.getId() == 2412 || cape.getId() == 2413 || cape.getId() == 2414) { + return 30; + } + } + return 20; + } + }, + + /** + * The bind spell type. + */ + BIND(1.1), + + /** + * The snare spell type. + */ + SNARE(1.2), + + /** + * The entangle spell type. + */ + ENTANGLE(1.3), + + /** + * The magic dart spell type. + */ + MAGIC_DART(1.15) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + return 10 + (e.getSkills().getLevel(Skills.MAGIC) / 10); + } + }, + + /** + * The iban blast spell type. + */ + IBANS_BLAST(1.4) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + return 25; + } + }, + + /** + * The trident of seas built in spell. + */ + TRIDENT_OF_SEAS(1.4) { + @Override + public int getImpactAmount(Entity e, Entity victim, int base) { + Player player = e.asPlayer(); + int level = player.getSkills().getLevel(Skills.MAGIC); + int offset = (level - 75) / 3; + return offset + base; + } + }, + + /** + * The teleporation block spell type. + */ + TELEBLOCK(1.3), + + /** + * The null spell type. + */ + NULL(0.0); + + /** + * The accuracy modifier. + */ + private final double accuracyMod; + + /** + * Constructs a new {@code SpellType} {@Code Object}. + * @param accuracyMod The accuracy modifier. + */ + private SpellType(double accuracyMod) { + this.accuracyMod = accuracyMod; + } + + /** + * Gets the base damage for this spell. + * @param e The entity casting this spell. + * @param victim The entity being hit. + * @param base The base damage for the spell element. + * @return The base damage for this spell. + */ + public int getImpactAmount(Entity e, Entity victim, int base) { + return 2; + } + + /** + * Gets the accuracy modifier. + * @return The accuracy modifier. + */ + public double getAccuracyMod() { + return accuracyMod; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/SwitchAttack.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/SwitchAttack.java new file mode 100644 index 000000000..7a11c7eb3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/SwitchAttack.java @@ -0,0 +1,216 @@ +package core.game.node.entity.combat.equipment; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents a possible attack the entity can switch to. + * @author Emperor + */ +public class SwitchAttack { + + /** + * The combat swing handler. + */ + private CombatSwingHandler handler; + + /** + * The start graphic. + */ + private final Graphics startGraphic; + + /** + * The animation. + */ + private final Animation animation; + + /** + * The end graphic. + */ + private final Graphics endGraphic; + + /** + * The projectile. + */ + private final Projectile projectile; + + /** + * If the handler should be used for visualizing/handling combat. + */ + private boolean useHandler; + + /** + * The maximum hit of this attack. + */ + private int maximumHit = -1; + + /** + * Constructs a new {@code SwitchAttack} {@code Object}. + * @param handler The combat handler. + * @param animation The animation. + */ + public SwitchAttack(CombatSwingHandler handler, Animation animation) { + this(handler, animation, null, null, null); + } + + /** + * Constructs a new {@code SwitchAttack} {@code Object}. + * @param handler The combat handler. + * @param animation The animation. + * @param startGraphic The start graphic. + */ + public SwitchAttack(CombatSwingHandler handler, Animation animation, Graphics startGraphic) { + this(handler, animation, startGraphic, null, null); + } + + /** + * Constructs a new {@code SwitchAttack} {@code Object}. + * @param handler The combat handler. + * @param animation The animation. + * @param startGraphic The start graphic. + * @param endGraphic The end graphic. + */ + public SwitchAttack(CombatSwingHandler handler, Animation animation, Graphics startGraphic, Graphics endGraphic) { + this(handler, animation, startGraphic, endGraphic, null); + } + + /** + * Constructs a new {@code SwitchAttack} {@code Object} + * @param handler the handler. + * @param projectile the projectile. + */ + public SwitchAttack(CombatSwingHandler handler, Animation animation, Projectile projectile) { + this(handler, animation, null, null, projectile); + } + + /** + * Constructs a new {@code SwitchAttack} {@code Object} + * @param style the style. + */ + public SwitchAttack(CombatStyle style) { + this(style.getSwingHandler(), null, null, null); + } + + /** + * Constructs a new {@code SwitchAttack} {@code Object}. + * @param handler The combat handler. + * @param animation The animation. + * @param startGraphic The start graphic. + * @param endGraphic The end graphic. + * @param projectile The projectile. + */ + public SwitchAttack(CombatSwingHandler handler, Animation animation, Graphics startGraphic, Graphics endGraphic, Projectile projectile) { + this.handler = handler; + this.animation = animation; + this.startGraphic = startGraphic; + this.endGraphic = endGraphic; + this.projectile = projectile; + } + + /** + * Checks if this attack can be selected. + * @param entity the entity. + * @param victim the victim. + * @param state the state. + * @return {@code True} if selected. + */ + public boolean canSelect(Entity entity, Entity victim, BattleState state) { + return true; + } + + /** + * Gets the combat swing handler. + * @return The swing handler. + */ + public CombatSwingHandler getHandler() { + return handler; + } + + /** + * Sets the combat swing handler. + * @param handler The swing handler. + */ + public void setHandler(CombatSwingHandler handler) { + this.handler = handler; + } + + /** + * Gets the style. + * @return The style. + */ + public CombatStyle getStyle() { + return handler.getType(); + } + + /** + * Gets the startGraphic. + * @return The startGraphic. + */ + public Graphics getStartGraphic() { + return startGraphic; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Gets the endGraphic. + * @return The endGraphic. + */ + public Graphics getEndGraphic() { + return endGraphic; + } + + /** + * Gets the projectile. + * @return The projectile. + */ + public Projectile getProjectile() { + return projectile; + } + + /** + * Gets the useHandler. + * @return The useHandler. + */ + public boolean isUseHandler() { + return useHandler; + } + + /** + * Sets the useHandler. + * @param useHandler The useHandler to set. + * @return This instance, for chaining. + */ + public SwitchAttack setUseHandler(boolean useHandler) { + this.useHandler = useHandler; + return this; + } + + /** + * Gets the maximumHit value. + * @return The maximumHit. + */ + public int getMaximumHit() { + return maximumHit; + } + + /** + * Sets the maximumHit value. + * @param maximumHit The maximumHit to set. + */ + public SwitchAttack setMaximumHit(int maximumHit) { + this.maximumHit = maximumHit; + return this; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/Weapon.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/Weapon.java new file mode 100644 index 000000000..c3c83a823 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/Weapon.java @@ -0,0 +1,130 @@ +package core.game.node.entity.combat.equipment; + +import core.game.node.item.Item; + +/** + * Represents the type of weapon used. + * @author Emperor + */ +public class Weapon { + + /** + * The item id. + */ + private final int id; + + /** + * The item. + */ + private final Item item; + + /** + * The weapon's name. + */ + private final String name; + + /** + * The ammunition equipment slot (if any). + */ + private final int ammunitionSlot; + + /** + * The ammunition item (if any). + */ + private final Item ammunition; + + /** + * The weapon type. + */ + private WeaponType type; + + /** + * Represents the weapon types. + * @author Emperor + */ + public static enum WeaponType { + DEFAULT, CROSSBOW, DOUBLE_SHOT, THROWN, DEGRADING, STAFF, CHINCHOMPA; + } + + /** + * Constructs a new {@code Weapon} {@Code Object}. + * @param item The item. + */ + public Weapon(Item item) { + this(item, -1, null, WeaponType.DEFAULT); + } + + /** + * Constructs a new {@code Weapon} {@Code Object} using ammunition. + * @param item The item. + * @param ammunitionSlot The ammunition equipment slot. + * @param ammunition The ammunition item. + */ + public Weapon(Item item, int ammunitionSlot, Item ammunition) { + this(item, ammunitionSlot, ammunition, WeaponType.DEFAULT); + } + + /** + * Constructs a new {@code Weapon} {@Code Object} using ammunition. + * @param item The item. + * @param ammunitionSlot The ammunition equipment slot. + * @param ammunition The ammunition item. + * @param type The weapon type. + */ + public Weapon(Item item, int ammunitionSlot, Item ammunition, WeaponType type) { + this.id = item == null ? -1 : item.getId(); + this.item = item; + this.name = item == null ? "null" : item.getName(); + this.ammunition = ammunition; + this.ammunitionSlot = ammunitionSlot; + } + + /** + * @return the item. + */ + public Item getItem() { + return item; + } + + /** + * @return the ammunitionSlot. + */ + public int getAmmunitionSlot() { + return ammunitionSlot; + } + + /** + * @return the ammunition. + */ + public Item getAmmunition() { + return ammunition; + } + + /** + * @return the id. + */ + public int getId() { + return id; + } + + /** + * @return the type. + */ + public WeaponType getType() { + return type; + } + + /** + * @param type the type to set. + */ + public void setType(WeaponType type) { + this.type = type; + } + + /** + * @return the name. + */ + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/equipment/WeaponInterface.java b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/WeaponInterface.java new file mode 100644 index 000000000..6e1b85b67 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/equipment/WeaponInterface.java @@ -0,0 +1,731 @@ +package core.game.node.entity.combat.equipment; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.InterfaceType; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.item.Item; +import core.game.system.config.ItemConfigParser; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.InterfaceConfigContext; +import core.net.packet.context.InterfaceContext; +import core.net.packet.context.StringContext; +import core.net.packet.out.Interface; +import core.net.packet.out.InterfaceConfig; +import core.net.packet.out.StringPacket; + +import static core.tools.Interfaces.*; + +/** + * Represents the weapon interface component. + * @author Emperor + */ +public final class WeaponInterface extends Component { + + /** + * The modern spell ids. + */ + private static final int[] MODERN_SPELL_IDS = { 1, 4, 6, 8, 10, 14, 17, 20, 24, 27, 33, 38, 45, 48, 52, 55 }; + + /** + * The ancient spell ids. + */ + private static final int[] ANCIENT_SPELL_IDS = { 8, 12, 4, 0, 10, 14, 6, 2, 9, 13, 5, 1, 11, 15, 7, 3, 16, 17, 18, 19 }; + + /** + * The slayer staff spell ids + */ + private static final int[] SLAYER_STAFF_SPELL_IDS = { 22, 31, 45, 48, 52, 55 }; + + /** + * The void staff spell ids + */ + private static final int[] VOID_STAFF_SPELL_IDS = { 22, 42, 45, 48, 52, 55 }; + + /** + * The default attack animations. + */ + public static final Animation[] DEFAULT_ANIMS = { new Animation(422, Priority.HIGH), new Animation(423, Priority.HIGH), new Animation(422, Priority.HIGH), new Animation(422, Priority.HIGH) }; + + /** + * The stab equipment bonus index. + */ + public static final int BONUS_STAB = 0; + + /** + * The slash equipment bonus index. + */ + public static final int BONUS_SLASH = 1; + + /** + * The crush equipment bonus index. + */ + public static final int BONUS_CRUSH = 2; + + /** + * The magic equipment bonus index. + */ + public static final int BONUS_MAGIC = 3; + + /** + * The range equipment bonus index. + */ + public static final int BONUS_RANGE = 4; + + /** + * The accurate melee attack style + */ + public static final int STYLE_ACCURATE = 0; + + /** + * The aggressive attack style + */ + public static final int STYLE_AGGRESSIVE = 1; + + /** + * The controlled attack style + */ + public static final int STYLE_CONTROLLED = 2; + + /** + * The defensive attack style + */ + public static final int STYLE_DEFENSIVE = 3; + + /** + * The accurate range attack style + */ + public static final int STYLE_RANGE_ACCURATE = 4; + + /** + * The rapid range attack style + */ + public static final int STYLE_RAPID = 5; + + /** + * The long range attack style + */ + public static final int STYLE_LONG_RANGE = 6; + + /** + * The defensive spell cast attack style + */ + public static final int STYLE_DEFENSIVE_CAST = 7; + + /** + * The spell cast attack style + */ + public static final int STYLE_CAST = 8; + + /** + * The player. + */ + private final Player player; + + /** + * The current weapon interface. + */ + private WeaponInterfaces current; + + /** + * If the player has the special attack bar shown. + */ + private boolean specialBar; + + /** + * The player's attack animations. + */ + private Animation[] attackAnimations; + + /** + * Constructs a new {@code WeaponInterface} {@code Object}. + * @param player The player. + */ + public WeaponInterface(Player player) { + super(92); + this.player = player; + player.addExtension(WeaponInterface.class, this); + } + + @Override + public void open(Player player) { + current = null; + updateInterface(); + } + + /** + * Opens the interface. + */ + private void open() { + ComponentDefinition definition = ComponentDefinition.forId(WEAPON_FISTS_SEL_92); + boolean resizable = player.getInterfaceManager().isResizable(); + PacketRepository.send(Interface.class, new InterfaceContext(player, definition.getWindowPaneId(resizable), definition.getChildId(resizable), id, definition.isWalkable())); + int slot = ensureStyleIndex(player, player.getSettings().getAttackStyleIndex()); + if (slot != player.getSettings().getAttackStyleIndex()) { + player.getSettings().toggleAttackStyleIndex(slot); + } + player.getProperties().setAttackStyle(current.getAttackStyles()[slot]); + checkStaffConfigs(slot); + } + + /** + * Ensures the style index. + * @param player The player. + * @param slot The attack style index. + * @return The index, ensured to be smaller than styles.length and larger + * than 0. + */ + private int ensureStyleIndex(Player player, int slot) { + AttackStyle style = player.getProperties().getAttackStyle(); + if (slot >= current.getAttackStyles().length) { + slot = current.getAttackStyles().length - 1; + if (style != null) { + for (int i = slot; i >= 0; i--) { + if (current.getAttackStyles()[i].style == style.style) { + return i; + } + } + } + return slot; + } + if (style != null && current.getAttackStyles()[slot].style != style.style) { + for (int i = current.getAttackStyles().length - 1; i >= 0; i--) { + if (current.getAttackStyles()[i].style == style.style) { + return i; + } + } + } + return slot; + } + + /** + * Get the proper config for the special bar. + * @return the config. + */ + private int getConfig(int buttons, int interfaceId){ + if(interfaceId == WEAPON_STAFF_SEL_90){ + return 87;//Return Config + } + if(interfaceId != WEAPON_WHIP_SEL_93 && + interfaceId != WEAPON_WARHAMMER_SEL_76 && + interfaceId != WEAPON_XBOW_SEL_79 && + interfaceId != WEAPON_HALBERD_SEL_84 && + interfaceId != WEAPON_THROWN_SEL_91) + { + switch(buttons){ + case 3: + return 13; + case 4: + return 12; + } + } else { + return 10; + } + return 10; + } + + /** + * Updates the interface. + */ + public void updateInterface() { + player.getInterfaceManager().getTabs()[0] = this; + Item weapon = player.getEquipment().get(EquipmentContainer.SLOT_WEAPON); + WeaponInterfaces inter = getWeaponInterface(weapon); + String name; + if (weapon != null) { + name = weapon.getDefinition().getName(); + specialBar = weapon.getDefinition().getConfiguration(ItemConfigParser.HAS_SPECIAL, false); + attackAnimations = weapon.getDefinition().getConfiguration(ItemConfigParser.ATTACK_ANIMS, DEFAULT_ANIMS); + } else { + name = "Unarmed"; + specialBar = false; + attackAnimations = DEFAULT_ANIMS; + } + if (inter != current) { + id = inter.interfaceId; + current = inter; + open(); + player.getProperties().getCombatPulse().updateStyle(); + } + if (player.getSettings().getAttackStyleIndex() < attackAnimations.length && !player.getAppearance().isNpc()) { + player.getProperties().setAttackAnimation(attackAnimations[player.getSettings().getAttackStyleIndex()]); + } + if (current != WeaponInterfaces.STAFF) { + selectAutoSpell(-1, false); + PacketRepository.send(InterfaceConfig.class, new InterfaceConfigContext(player, id, getConfig(current.getAttackStyles().length, current.getInterfaceId()), !specialBar)); + } else { //if staff + PacketRepository.send(InterfaceConfig.class, new InterfaceConfigContext(player, id, 87, !specialBar)); + } + if (!canAutocast(false)) { + if (current == WeaponInterfaces.STAFF && player.getAttribute("autocast_select", false)) { + open(); + } + selectAutoSpell(-1, true); + } + PacketRepository.send(StringPacket.class, new StringContext(player, name, id, 0)); + if (player.getSettings().isSpecialToggled()) { + player.getSettings().toggleSpecialBar(); + } + } + + /** + * Sets the current attack style. + * @param button The button the player has pressed. + * @return {@code True} if the attack style got set. + */ + public boolean setAttackStyle(int button) { + int slot = button - 1; + if (current != WeaponInterfaces.STAFF) { + slot--; + } + if (current == WeaponInterfaces.WARHAMMER_MAUL || (current.attackStyles.length > 2 && current.attackStyles[2].bonusType == BONUS_RANGE && current.getInterfaceId() != WEAPON_THROWN_SEL_91)) { + slot = button == 4 ? 1 : button == 3 ? 2 : 0; + } else if (current == WeaponInterfaces.CLAWS) { + slot = button == 5 ? 1 : button == 3 ? 3 : slot; + } + if (current == WeaponInterfaces.AXE) { + if (button == 5) { + slot = 1; + } else if (button == 3) { + slot = 3; + } + } + if (slot < 0 || slot >= current.getAttackStyles().length) { + return false; + } + AttackStyle style = current.getAttackStyles()[slot]; + player.getProperties().setAttackStyle(style); + player.getSettings().toggleAttackStyleIndex(slot); + if (slot < attackAnimations.length && !player.getAppearance().isNpc()) { + player.getProperties().setAttackAnimation(attackAnimations[slot]); + } + checkStaffConfigs(button - 1); + return true; + } + + /** + * Checks the staff configurations. + * @param slot The slot of the current attack style selected. + */ + private void checkStaffConfigs(int slot) { + if (current != WeaponInterfaces.STAFF) { + selectAutoSpell(-1, false); + return; + } + boolean defensive = slot == 3; + player.getConfigManager().set(439, defensive ? -5 : 0); + if (slot > 2) { + player.getConfigManager().set(43, defensive ? -1 : 3); + } + }; + + /** + * Gets the autocast tab component id. + * @param spellId The spell id. + * @return The component id for the autocast select tab. + */ + public int getAutospellId(int spellId) { + boolean modern = player.getSpellBookManager().getSpellBook() == MAGIC_192; + int[] data = modern ? MODERN_SPELL_IDS : ANCIENT_SPELL_IDS; + if (modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff")) { + data = SLAYER_STAFF_SPELL_IDS; + } + if (modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace")) { + data = VOID_STAFF_SPELL_IDS; + } + for (int i = 0; i < data.length; i++) { + if (data[i] == spellId) { + return i; + } + } + return -1; + } + + /** + * Selects the current autocast spell. + * @param buttonId The button id. + * @param adjustAttackStyle If the attack style should be adjusted. + */ + public void selectAutoSpell(int buttonId, boolean adjustAttackStyle) { + boolean modern = player.getSpellBookManager().getSpellBook() == MAGIC_192; + int[] data = modern ? MODERN_SPELL_IDS : ANCIENT_SPELL_IDS; + if (modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff")) { + data = SLAYER_STAFF_SPELL_IDS; + } + if (modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace")) { + data = VOID_STAFF_SPELL_IDS; + } + CombatSpell current = player.getProperties().getAutocastSpell(); + if (buttonId >= data.length) { + return; + } + int configStart = modern ? 45 : 13; + if (current != null) { + for (int index = 0; index < data.length; index++) { + if (data[index] == current.getSpellId()) { + player.getPacketDispatch().sendInterfaceConfig(WEAPON_STAFF_SEL_90, configStart + (2 * index), true); + player.getPacketDispatch().sendInterfaceConfig(WEAPON_STAFF_SEL_90, 100 + configStart + (2 * index), true); + } + } + } + if (buttonId < 0) { + player.getProperties().setAutocastSpell(null); + if (adjustAttackStyle && current != null) { + setAttackStyle(3); + player.getProperties().getCombatPulse().updateStyle(); + } + return; + } + boolean defensive = player.getSettings().getAttackStyleIndex() == 3; + player.getPacketDispatch().sendInterfaceConfig(WEAPON_STAFF_SEL_90, 183, defensive); + player.getPacketDispatch().sendInterfaceConfig(WEAPON_STAFF_SEL_90, 83, !defensive); + current = (CombatSpell) (modern ? SpellBookManager.SpellBook.MODERN.getSpell(data[buttonId]) : SpellBookManager.SpellBook.ANCIENT.getSpell(data[buttonId])); + player.getProperties().setAutocastSpell(current); + int configId = configStart + (2 * buttonId); + if (modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff") || modern && player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace")) { + boolean slayer = player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff"); + switch (buttonId) { + case 0: + configId = 77; + break; + case 1: + if (slayer) { + configId = 79; + } else { + configId = 81; + } + break; + case 2: + configId = 69; + break; + case 3: + configId = 71; + break; + case 4: + configId = 73; + break; + case 5: + configId = 75; + break; + + } + if (configId >= 85 || configId <= 65) { + return; + } else { + player.getPacketDispatch().sendInterfaceConfig(WEAPON_STAFF_SEL_90, (defensive ? 100 : 0) + configId, false); + } + } else { + configId += defensive ? 100 : 0; + switch (buttonId) { + case 16: + configId = defensive ? 265 : 253; + break; + case 17: + configId = defensive ? 268 : 256; + break; + case 18: + configId = defensive ? 271 : 259; + break; + case 19: + configId = defensive ? 274 : 262; + break; + } + player.getPacketDispatch().sendInterfaceConfig(WEAPON_STAFF_SEL_90, configId, false); + } + + } + + /** + * Opens the autocast select. + */ + public void openAutocastSelect() { + if (current != WeaponInterfaces.STAFF) { + return; + } + if (!canAutocast(true)) { + setAttackStyle(3); + return; + } + player.setAttribute("autocast_select", true); + int id = player.getSpellBookManager().getSpellBook() == 193 ? 797 : 319; + boolean slayer = player.getEquipment().getNew(3).getName().equalsIgnoreCase("Slayer's staff"); + boolean mace = player.getEquipment().getNew(3).getName().equalsIgnoreCase("Void knight mace"); + if (slayer) { + id = 310; + } + if (mace) { + id = 406; + } + Component component = new Component(id); + component.getDefinition().setTabIndex(0); + component.getDefinition().setType(InterfaceType.TAB); + player.getInterfaceManager().openTab(component); + } + + /** + * Checks if the player is currently able to autocast. + * @param message If we should notify the player if he's unable to autocast. + * @return {@code True} if so. + */ + public boolean canAutocast(boolean message) { + if (current != WeaponInterfaces.STAFF) { + return false; + } + if (player.getSpellBookManager().getSpellBook() == SpellBookManager.SpellBook.LUNAR.getInterfaceId()) { + if (message) { + player.getPacketDispatch().sendMessage("You can't autocast Lunar magic."); + } + return false; + } + boolean ancientStaff = player.getEquipment().getNew(3).getName().contains("ncient staff") || player.getEquipment().getNew(3).getName().contains("uriel's staff");; + if ((player.getSpellBookManager().getSpellBook() == MAGIC_192 && ancientStaff) || (player.getSpellBookManager().getSpellBook() == MAGIC_ZAROS_193 && !ancientStaff)) { + if (message) { + player.getPacketDispatch().sendMessage("You can only autocast ancient magicks with an Ancient or Zuriel's staff."); + } + return false; + } + return true; + } + + /** + * Gets the current weapon interface id. + * @return The component id. + */ + public static WeaponInterfaces getWeaponInterface(Item weapon) { + if (weapon == null) { + return WeaponInterfaces.values()[0]; + } + int slot = weapon.getDefinition().getConfiguration(ItemConfigParser.WEAPON_INTERFACE, 0); + return WeaponInterfaces.values()[slot]; + } + + /** + * Represents an attack style. + * @author Emperor + */ + public static class AttackStyle { + + /** + * The style type. + */ + private final int style; + + /** + * The bonus type. + */ + private final int bonusType; + + /** + * Constructs a new {@code AttackStyle} {@code Object}. + * @param style The style type. + * @param bonusType The bonus type. + */ + public AttackStyle(int style, int bonusType) { + this.style = style; + this.bonusType = bonusType; + } + + /** + * Gets the style. + * @return The style. + */ + public int getStyle() { + return style; + } + + /** + * Gets the bonusType. + * @return The bonusType. + */ + public int getBonusType() { + return bonusType; + } + } + + /** + * Represents the weapon interfaces. + * @author Emperor + */ + public static enum WeaponInterfaces { + + /** + * The unarmed weapon interface (ordinal=0) + */ + UNARMED(WEAPON_FISTS_SEL_92, new AttackStyle(STYLE_ACCURATE, BONUS_CRUSH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_CRUSH)), + + /** + * The staff weapon interface (ordinal=1) + */ + STAFF(WEAPON_STAFF_SEL_90, new AttackStyle(STYLE_ACCURATE, BONUS_CRUSH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE_CAST, BONUS_MAGIC), new AttackStyle(STYLE_CAST, BONUS_MAGIC)), + + /** + * The (battle) axe weapon interface (ordinal=2) + */ + AXE(WEAPON_BAXE_SEL_75, new AttackStyle(STYLE_ACCURATE, BONUS_SLASH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_SLASH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_SLASH)), + + /** + * The scepter weapon interface (ordinal=3) + */ + SCEPTER(WEAPON_SCEPTER_SEL_85, new AttackStyle(STYLE_ACCURATE, BONUS_CRUSH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_CRUSH)), + + /** + * The pickaxe weapon interface (ordinal=4) + */ + PICKAXE(WEAPON_PICKAXE_SEL_83, new AttackStyle(STYLE_ACCURATE, BONUS_STAB), new AttackStyle(STYLE_AGGRESSIVE, BONUS_STAB), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_STAB)), + + /** + * The sword/dagger weapon interface (ordinal=5) + */ + SWORD_DAGGER(WEAPON_DAGGER_SEL_89, new AttackStyle(STYLE_ACCURATE, BONUS_STAB), new AttackStyle(STYLE_AGGRESSIVE, BONUS_STAB), new AttackStyle(STYLE_AGGRESSIVE, BONUS_SLASH), new AttackStyle(STYLE_DEFENSIVE, BONUS_STAB)), + + /** + * The scimitar/silverlight/silver sickle/... weapon interface + * (ordinal=6) + */ + SCIMITAR(WEAPON_SCIMITAR_SEL_81, new AttackStyle(STYLE_ACCURATE, BONUS_SLASH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_SLASH), new AttackStyle(STYLE_CONTROLLED, BONUS_STAB), new AttackStyle(STYLE_DEFENSIVE, BONUS_SLASH)), + + /** + * The 2-h sword weapon interface (ordinal=7) + */ + TWO_H_SWORD(WEAPON_2H_SWORD_SEL_82, new AttackStyle(STYLE_ACCURATE, BONUS_SLASH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_SLASH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_SLASH)), + + /** + * The mace weapon interface (ordinal=8) + */ + MACE(WEAPON_MACE_SEL_88, new AttackStyle(STYLE_ACCURATE, BONUS_CRUSH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_CONTROLLED, BONUS_STAB), new AttackStyle(STYLE_DEFENSIVE, BONUS_CRUSH)), + + /** + * The claws weapon interface (ordinal=9) + */ + CLAWS(WEAPON_CLAWS_SEL_78, new AttackStyle(STYLE_ACCURATE, BONUS_SLASH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_SLASH), new AttackStyle(STYLE_CONTROLLED, BONUS_STAB), new AttackStyle(STYLE_DEFENSIVE, BONUS_SLASH)), + + /** + * The warhammer/maul weapon interface (ordinal=10) + */ + WARHAMMER_MAUL(WEAPON_WARHAMMER_SEL_76, new AttackStyle(STYLE_ACCURATE, BONUS_CRUSH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_CRUSH)), + + /** + * The abyssal whip weapon interface (ordinal=11) + */ + WHIP(WEAPON_WHIP_SEL_93, new AttackStyle(STYLE_ACCURATE, BONUS_SLASH), new AttackStyle(STYLE_CONTROLLED, BONUS_SLASH), new AttackStyle(STYLE_DEFENSIVE, BONUS_SLASH)), + + /** + * The flowers weapon interface (ordinal=12) + */ + FLOWERS(WEAPON_WARHAMMER_SEL_76, new AttackStyle(STYLE_ACCURATE, BONUS_CRUSH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_CRUSH)), + + /** + * The mud pie weapon interface (ordinal=13) + */ + MUD_PIE(WEAPON_THROWN_SEL_91, new AttackStyle(STYLE_RANGE_ACCURATE, BONUS_RANGE), new AttackStyle(STYLE_RAPID, BONUS_RANGE), new AttackStyle(STYLE_LONG_RANGE, BONUS_RANGE)), + + /** + * The spear weapon interface (ordinal=14) + */ + SPEAR(WEAPON_SPEAR_SEL_87, new AttackStyle(STYLE_CONTROLLED, BONUS_STAB), new AttackStyle(STYLE_CONTROLLED, BONUS_SLASH), new AttackStyle(STYLE_CONTROLLED, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_STAB)), + + /** + * The halberd weapon interface (ordinal=15) + */ + HALBERD(WEAPON_HALBERD_SEL_84, new AttackStyle(STYLE_CONTROLLED, BONUS_STAB), new AttackStyle(STYLE_AGGRESSIVE, BONUS_SLASH), new AttackStyle(STYLE_DEFENSIVE, BONUS_STAB)), + + /** + * The bow weapon interface (ordinal=16) + */ + BOW(WEAPON_BOW_SEL_77, new AttackStyle(STYLE_RANGE_ACCURATE, BONUS_RANGE), new AttackStyle(STYLE_RAPID, BONUS_RANGE), new AttackStyle(STYLE_LONG_RANGE, BONUS_RANGE)), + + /** + * The crossbow weapon interface (ordinal=17) + */ + CROSSBOW(WEAPON_XBOW_SEL_79, new AttackStyle(STYLE_RANGE_ACCURATE, BONUS_RANGE), new AttackStyle(STYLE_RAPID, BONUS_RANGE), new AttackStyle(STYLE_LONG_RANGE, BONUS_RANGE)), + + /** + * The thrown weapons weapon interface (ordinal=18) + */ + THROWN_WEAPONS(WEAPON_THROWN_SEL_91, new AttackStyle(STYLE_RANGE_ACCURATE, BONUS_RANGE), new AttackStyle(STYLE_RAPID, BONUS_RANGE), new AttackStyle(STYLE_LONG_RANGE, BONUS_RANGE)), + + /** + * The thrown weapons weapon interface (ordinal=19) + */ + CHINCHOMPA(WEAPON_CHINCHOMPA_SEL_473, new AttackStyle(STYLE_RANGE_ACCURATE, BONUS_RANGE), new AttackStyle(STYLE_RAPID, BONUS_RANGE), new AttackStyle(STYLE_LONG_RANGE, BONUS_RANGE)), + + /** + * The fixed device weapon interface (ordinal=20) + */ + FIXED_DEVICE(WEAPON_FIXED_DEVICE_SEL_80, new AttackStyle(STYLE_RANGE_ACCURATE, BONUS_RANGE), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH)), + + /** + * The salamander weapon interface (ordinal=21) + */ + SALAMANDER(WEAPON_SALAMANDER_SEL_474, new AttackStyle(STYLE_AGGRESSIVE, BONUS_SLASH), new AttackStyle(STYLE_RANGE_ACCURATE, BONUS_RANGE), new AttackStyle(STYLE_DEFENSIVE_CAST, BONUS_MAGIC)), + + /** + * The scythe weapon interface (ordinal=22) + */ + SCYTHE(WEAPON_SCYTHE_SEL_86, new AttackStyle(STYLE_ACCURATE, BONUS_SLASH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_STAB), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_SLASH)), + + /** + * The ivandis flail weapon interface (ordinal=23) TODO: Find correct + * interface id! + */ + IVANDIS_FLAIL(WEAPON_SCEPTER_SEL_85, new AttackStyle(STYLE_ACCURATE, BONUS_CRUSH), new AttackStyle(STYLE_AGGRESSIVE, BONUS_CRUSH), new AttackStyle(STYLE_DEFENSIVE, BONUS_CRUSH)); + + /** + * The interface id. + */ + private final int interfaceId; + + /** + * The attack styles. + */ + private final AttackStyle[] attackStyles; + + /** + * Constructs a new {@code WeaponInterface} {@code Object}. + * @param interfaceId The interface id. + * @param attackStyles The attack styles. + */ + private WeaponInterfaces(int interfaceId, AttackStyle... attackStyles) { + this.interfaceId = interfaceId; + this.attackStyles = attackStyles; + } + + /** + * Gets the interfaceId. + * @return The interfaceId. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Gets the attackStyles. + * @return The attackStyles. + */ + public AttackStyle[] getAttackStyles() { + return attackStyles; + } + } + + /** + * Gets the currently opened weapon interface. + * @return The current weapon interface. + */ + public WeaponInterfaces getWeaponInterface() { + return current; + } + + /** + * If the special bar is enabled. + * @return {@code True} if so. + */ + public boolean isSpecialBar() { + return specialBar; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/handlers/ChinchompaSwingHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/ChinchompaSwingHandler.java new file mode 100644 index 000000000..60f69f8ac --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/ChinchompaSwingHandler.java @@ -0,0 +1,157 @@ +package core.game.node.entity.combat.handlers; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.Ammunition; +import core.game.node.entity.combat.equipment.RangeWeapon; +import core.game.node.entity.combat.equipment.Weapon; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +import java.util.List; + +/** + * Handles a combat swing using red chinchompas. + * @author Emperor + */ +public final class ChinchompaSwingHandler extends RangeSwingHandler { + + /** + * The instance. + */ + private static final ChinchompaSwingHandler INSTANCE = new ChinchompaSwingHandler(); + + /** + * The impact graphic. + */ + private static final Graphics END_GRAPHIC = new Graphics(157, 96); + + /** + * Constructs a new {@code ChinchompaSwingHandler} {@code Object}. + */ + private ChinchompaSwingHandler() { + super(); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + boolean multi = entity.getProperties().isMultiZone() && victim.getProperties().isMultiZone(); + state.setStyle(CombatStyle.RANGE); + if (!multi) { + int ticks = super.swing(entity, victim, state); + state.setTargets(new BattleState[] { state }); + return ticks; + } + Player p = (Player) entity; + RangeWeapon rw = RangeWeapon.get(p.getEquipment().getNew(3).getId()); + if (rw == null) { + return -1; + } + Weapon w = new Weapon(p.getEquipment().get(3), rw.getAmmunitionSlot(), p.getEquipment().getNew(rw.getAmmunitionSlot())); + w.setType(rw.getWeaponType()); + state.setRangeWeapon(rw); + state.setAmmunition(Ammunition.get(w.getAmmunition().getId())); + state.setWeapon(w); + if (!Companion.hasAmmo(entity, state)) { + entity.getProperties().getCombatPulse().stop(); + return -1; + } + @SuppressWarnings("rawtypes") + List list = victim instanceof NPC ? RegionManager.getSurroundingNPCs(victim, 14, entity) : RegionManager.getSurroundingPlayers(victim, 14, entity); + BattleState[] targets = new BattleState[list.size()]; + int count = 0; + for (Object o : list) { + Entity e = (Entity) o; + if (canSwing(entity, e) != InteractionType.NO_INTERACT) { + BattleState s = targets[count++] = new BattleState(entity, e); + s.setStyle(CombatStyle.RANGE); + int hit = 0; + if (isAccurateImpact(entity, e, CombatStyle.RANGE)) { + hit = RandomFunction.random(calculateHit(entity, e, 1.0)); + } + s.setEstimatedHit(hit); + } + } + state.setTargets(targets); + Companion.useAmmo(entity, state, null); + return 2 + (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3); + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + for (BattleState s : state.getTargets()) { + if (s != null) { + super.adjustBattleState(entity, s.getVictim(), s); + } + } + } + + @Override + public void addExperience(Entity entity, Entity victim, BattleState state) { + int hit = 0; + for (BattleState s : state.getTargets()) { + if (s != null && s.getEstimatedHit() > 0) { + hit += s.getEstimatedHit(); + } + } + entity.getSkills().addExperience(Skills.HITPOINTS, hit * 1.33, true); + if (entity.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_DEFENSIVE) { + entity.getSkills().addExperience(Skills.RANGE, hit * 2, true); + entity.getSkills().addExperience(Skills.DEFENCE, hit * 2, true); + } else { + entity.getSkills().addExperience(Skills.RANGE, hit * 4, true); + } + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + Graphics start = null; + if (state.getAmmunition() != null && state.getAmmunition().getProjectile() != null) { + start = state.getAmmunition().getStartGraphics(); + if (victim != null) { + state.getAmmunition().getProjectile().copy(entity, victim, 5).send(); + } + } + RangeWeapon weapon; + int anim = entity.getProperties().getAttackAnimation().getId(); + if ((anim == 422 || anim == 423) && state.getWeapon().getId() > 0 && (weapon = RangeWeapon.get(state.getWeapon().getId())) != null) { + entity.visualize(weapon.getAnimation(), start); + return; + } + entity.visualize(entity.getProperties().getAttackAnimation(), start); + } + + @Override + public void impact(final Entity entity, final Entity victim, final BattleState state) { + for (BattleState s : state.getTargets()) { + if (s != null) { + super.impact(entity, s.getVictim(), s); + } + } + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + victim.graphics(END_GRAPHIC); + for (BattleState s : state.getTargets()) { + if (s != null) { + s.getVictim().animate(s.getVictim().getProperties().getDefenceAnimation()); + } + } + } + + /** + * Gets the ChinchompaSwingHandler instance. + * @return The instance. + */ + public static ChinchompaSwingHandler getInstance() { + return INSTANCE; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java new file mode 100644 index 000000000..0c9ff895d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java @@ -0,0 +1,220 @@ +package core.game.node.entity.combat.handlers; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Handles dragonfire combat. + * @author Emperor + */ +public class DragonfireSwingHandler extends CombatSwingHandler { + + /** + * If the NPC has to be in melee range. + */ + private boolean meleeRange; + + /** + * The maximum hit. + */ + private int maximumHit; + + /** + * The attack data. + */ + private SwitchAttack attack; + + /** + * IF the dragon attack is firey or icey. + */ + private boolean fire; + + /** + * Constructs a new {@code DragonfireSwingHandler} {@code Object}. + * @param meleeRange If the NPC has to be in melee range. + * @param maximumHit The maximum hit. + * @param fire if firey. + */ + public DragonfireSwingHandler(boolean meleeRange, int maximumHit, SwitchAttack attack, boolean fire) { + super(CombatStyle.MAGIC); + this.meleeRange = meleeRange; + this.maximumHit = maximumHit; + this.attack = attack; + this.fire = fire; + } + + /** + * Gets the switch attack instance for a dragonfire attack. + * @param meleeRange If the attack is melee range. + * @param maximumHit The maximum hit. + * @param animation The animation. + * @param startGraphic The start graphic. + * @param endGraphic The end graphic. + * @param projectile The projectile. + * @return The switch attack instance. + */ + public static SwitchAttack get(boolean meleeRange, int maximumHit, Animation animation, Graphics startGraphic, Graphics endGraphic, Projectile projectile) { + SwitchAttack attack = new SwitchAttack(null, animation, startGraphic, endGraphic, projectile).setUseHandler(true); + attack.setHandler(new DragonfireSwingHandler(meleeRange, maximumHit, attack, true)); + return attack; + } + + /** + * Gets the switch attack instance for a dragonfire attack. + * @param meleeRange If the attack is melee range. + * @param maximumHit The maximum hit. + * @param animation The animation. + * @param startGraphic The start graphic. + * @param endGraphic The end graphic. + * @param projectile The projectile. + * @return The switch attack instance. + */ + public static SwitchAttack get(boolean meleeRange, int maximumHit, Animation animation, Graphics startGraphic, Graphics endGraphic, Projectile projectile, boolean fire) { + SwitchAttack attack = new SwitchAttack(null, animation, startGraphic, endGraphic, projectile).setUseHandler(true); + attack.setHandler(new DragonfireSwingHandler(meleeRange, maximumHit, attack, fire)); + return attack; + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + if (meleeRange) { + return CombatStyle.MELEE.getSwingHandler().canSwing(entity, victim); + } + return CombatStyle.MAGIC.getSwingHandler().canSwing(entity, victim); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + int max = calculateHit(entity, victim, 1.0); + int hit = RandomFunction.random(max); + assert state != null; + state.setMaximumHit(max); + state.setStyle(CombatStyle.MAGIC); + state.setEstimatedHit(hit); + if (meleeRange) { + return 1; + } + int ticks = 2 + (int) Math.floor(entity.getLocation().getDistance(victim.getLocation()) * 0.5); + entity.setAttribute("fireBreath", GameWorld.getTicks() + (ticks + 2)); + return ticks; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(attack.getAnimation(), attack.getStartGraphic()); + if (attack.getProjectile() != null) { + attack.getProjectile().copy(entity, victim, 5).send(); + } + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (entity instanceof NPC && victim instanceof Player) { + Player p = (Player) victim; + p.getPacketDispatch().sendMessage(getDragonfireMessage(victim.getAttribute("fire_resistance", 0), !fire ? "icy breath" : "fiery breath")); + Item shield = p.getEquipment().get(EquipmentContainer.SLOT_SHIELD); + if (shield != null && (shield.getId() == 11283 || shield.getId() == 11284)) { + if (shield.getId() == 11284) { + p.getEquipment().replace(new Item(11283), EquipmentContainer.SLOT_SHIELD); + shield = p.getEquipment().get(EquipmentContainer.SLOT_SHIELD); + shield.setCharge(0); + } + if (shield.getCharge() < 1000) { + shield.setCharge(shield.getCharge() + 20); + EquipmentContainer.updateBonuses(p); + p.getPacketDispatch().sendMessage("Your dragonfire shield glows more brightly."); + } else { + p.getPacketDispatch().sendMessage("Your dragonfire shield is already fully charged."); + } + p.faceLocation(entity.getCenterLocation()); + victim.visualize(Animation.create(6695), Graphics.create(1163)); + return; + } + } + if (!fire && victim.getAttribute("freeze_immunity", -1) < GameWorld.getTicks() && RandomFunction.random(4) == 2) { + victim.getStateManager().set(EntityState.FROZEN, 16); + victim.graphics(Graphics.create(502)); + } + Graphics graphic = attack != null ? attack.getEndGraphic() : null; + victim.visualize(victim.getProperties().getDefenceAnimation(), graphic); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + assert state != null; + int hit = state.getEstimatedHit(); + if (hit > -1) { + victim.getImpactHandler().handleImpact(entity, hit, CombatStyle.MAGIC, state); + } + hit = state.getSecondaryHit(); + if (hit > -1) { + victim.getImpactHandler().handleImpact(entity, hit, CombatStyle.MAGIC, state); + } + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + if (victim.isPlayer() && !fire) { + Item item = victim.asPlayer().getEquipment().get(EquipmentContainer.SLOT_SHIELD); + if (item != null && (item.getId() == 2890 || item.getId() == 9731) && state.getEstimatedHit() > 10) { + state.setEstimatedHit(RandomFunction.random(10)); + } + } + CombatStyle style = state.getStyle(); + super.adjustBattleState(entity, victim, state); + state.setStyle(style); + } + + @Override + protected int getFormattedHit(Entity entity, Entity victim, BattleState state, int hit) { + return formatHit(victim, hit); + } + + @Override + public int calculateAccuracy(Entity entity) { + return 4000; + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + int damage = maximumHit; + if (victim instanceof Player) { + int val = victim.getDragonfireProtection(fire); + if ((val & 0x2) != 0) { + damage *= 0.1; + } + if ((val & 0x4) != 0) { + damage *= 0.1; + } + if ((val & 0x8) != 0) { + damage *= 0.6; + } + } + return damage; + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return CombatStyle.MAGIC.getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return 1.0; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MagicSwingHandler.kt b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MagicSwingHandler.kt new file mode 100644 index 000000000..5c432c1f4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MagicSwingHandler.kt @@ -0,0 +1,274 @@ +package core.game.node.entity.combat.handlers + +import core.game.container.Container +import core.game.container.impl.EquipmentContainer +import core.game.node.entity.Entity +import core.game.node.entity.combat.BattleState +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.combat.CombatSwingHandler +import core.game.node.entity.combat.InteractionType +import core.game.node.entity.combat.equipment.ArmourSet +import core.game.node.entity.combat.equipment.SpellType +import core.game.node.entity.combat.equipment.WeaponInterface +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.tools.RandomFunction +import core.game.node.entity.skill.Skills +import core.game.content.quest.tutorials.tutorialisland.TutorialSession +import core.game.content.quest.tutorials.tutorialisland.TutorialStage +import kotlin.math.floor + +/** + * Handles the magic combat swings. + * @author Emperor + * @author Ceikry, Kotlin conversion + cleanup + */ +open class MagicSwingHandler + : CombatSwingHandler(CombatStyle.MAGIC) { + + override fun canSwing(entity: Entity, victim: Entity): InteractionType? { + if (!isProjectileClipped(entity, victim, false)) { + return InteractionType.NO_INTERACT + } + var distance = 10 + var type = InteractionType.STILL_INTERACT + var goodRange = victim.centerLocation.withinDistance(entity.centerLocation, getCombatDistance(entity, victim, distance)) + if (victim.walkingQueue.isMoving && !goodRange) { + goodRange = victim.centerLocation.withinDistance(entity.centerLocation, getCombatDistance(entity, victim, ++distance)) + type = InteractionType.MOVE_INTERACT + } + if (goodRange && isAttackable(entity, victim) != InteractionType.NO_INTERACT) { + if (type == InteractionType.STILL_INTERACT) { + entity.walkingQueue.reset() + } + return type + } + return InteractionType.NO_INTERACT + } + + override fun swing(entity: Entity?, victim: Entity?, state: BattleState?): Int { + var spell = entity!!.properties.spell + if (spell == null) { + if (entity.properties.autocastSpell.also { spell = it } == null) { + return -1 + } + } + state!!.style = CombatStyle.MAGIC + if (!spell!!.meetsRequirements(entity, true, true)) { + entity.properties.spell = null + val inter = entity.getExtension(WeaponInterface::class.java) + if (inter != null) { + inter.selectAutoSpell(-1, true) + entity.properties.combatPulse.updateStyle() + } + return -1 + } + val max = calculateHit(entity, victim, spell!!.getMaximumImpact(entity, victim, state).toDouble()) + state.targets = spell!!.getTargets(entity, victim) + state.spell = spell + for (s in state.targets) { + var hit = -1 + s.spell = spell + if (isAccurateImpact(entity, s.victim, CombatStyle.MAGIC, 1.3, 1.0)) { + s.maximumHit = max + hit = RandomFunction.random(max) + } + s.style = CombatStyle.MAGIC + s.estimatedHit = hit + } + if (spell === entity.properties.spell) { + entity.properties.spell = null + if (entity.properties.autocastSpell == null) { + entity.properties.combatPulse.stop() + } + } + var ticks = 2 + floor(entity.location.getDistance(victim!!.location) * 0.5).toInt() + if (spell!!.type === SpellType.BLITZ) { + ticks++ + } + return ticks + } + + override fun adjustBattleState(entity: Entity, victim: Entity, state: BattleState) { + if (state.targets == null) { + super.adjustBattleState(entity, victim, state) + if (state.spell != null) { + state.spell.fireEffect(entity, victim, state) + } + return + } + for (s in state.targets) { + if (s != null) { + super.adjustBattleState(entity, s.victim, s) + if (s.spell != null) { + s.spell.fireEffect(entity, s.victim, s) + } + } + } + } + + override fun visualize(entity: Entity, victim: Entity?, state: BattleState?) { + state!!.spell.visualize(entity, victim) + } + + override fun impact(entity: Entity?, victim: Entity?, state: BattleState?) { + if (state!!.spell != null && entity is Player) { + entity.getSkills().addExperience(Skills.MAGIC, state.spell.experience) + } + if (state.targets == null) { + if (state.estimatedHit > -1) { + victim!!.impactHandler.handleImpact(entity, state.estimatedHit, CombatStyle.MAGIC, state) + } + return + } + for (s in state.targets) { + if (s == null || s.estimatedHit < 0) { + continue + } + val hit = s.estimatedHit + s.victim.impactHandler.handleImpact(entity, hit, CombatStyle.MAGIC, s) + } + } + + override fun visualizeImpact(entity: Entity?, victim: Entity?, state: BattleState?) { + if (entity is Player) { + if (TutorialSession.getExtension(entity as Player?).stage == 51) { + TutorialStage.load(entity as Player?, 52, false) + } + if (TutorialSession.getExtension(entity as Player?).stage == 52) { + TutorialStage.load(entity as Player?, 53, false) + } + if (TutorialSession.getExtension(entity as Player?).stage == 54) { + TutorialStage.load(entity as Player?, 55, false) + } + } + if (state!!.targets == null) { + if (state.spell != null) { + state.spell.visualizeImpact(entity, victim, state) + } + return + } + for (s in state.targets) { + if (s != null) { + state.spell.visualizeImpact(entity, s.victim, s) + } + } + } + + override fun calculateAccuracy(entity: Entity?): Int { + val baseLevel = entity!!.skills.getStaticLevel(Skills.MAGIC) + var spellRequirement = baseLevel + if (entity is Player) { + if (entity.getProperties().spell != null) { + spellRequirement = entity.getProperties().spell.level + } else if (entity.getProperties().autocastSpell != null) { + spellRequirement = entity.getProperties().autocastSpell.level + } + } + var spellBonus = 0.0 + if (baseLevel > spellRequirement) { + spellBonus = (baseLevel - spellRequirement) * .3 + } + val level = entity.skills.getLevel(Skills.MAGIC, true) + var prayer = 1.0 + if (entity is Player) { + prayer += entity.prayer.getSkillBonus(Skills.MAGIC) + } + val additional = 1.0 // Slayer helmet/salve/... + val effective = floor(level * prayer * additional + spellBonus) + val bonus = entity.properties.bonuses[WeaponInterface.BONUS_MAGIC] + return floor((effective + 8) * (bonus + 64) / 10).toInt() + } + + override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int { + var baseDamage = modifier + if (baseDamage < 2.0 || entity is NPC) { + if (baseDamage > 2.0) { + baseDamage = 1.0 + } + val level = entity!!.skills.getLevel(Skills.MAGIC, true) + val bonus = entity.properties.bonuses[if (entity is Player) 14 else 13] + val cumulativeStr = level.toDouble() + return 1 + ((14 + cumulativeStr + bonus / 8 + cumulativeStr * bonus * 0.016865) * baseDamage).toInt() / 10 + } + var levelMod = 1.0 + val entityMod = entity!!.getLevelMod(entity, victim) + if (entityMod != 0.0) { + levelMod += entityMod + } + return (baseDamage * levelMod).toInt() + 1 + } + + override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { + val level = entity!!.skills.getLevel(Skills.DEFENCE, true) + var prayer = 1.0 + if (entity is Player) { + prayer += entity.prayer.getSkillBonus(Skills.MAGIC) + } + val effective = floor(level * prayer * 0.3) + entity.skills.getLevel(Skills.MAGIC, true) * 0.7 + val equipment = entity.properties.bonuses[WeaponInterface.BONUS_MAGIC + 5] + return floor((effective + 8) * (equipment + 64) / 10).toInt() + } + + override fun getSetMultiplier(e: Entity?, skillId: Int): Double { + if (e is Player) { + val c: Container = e.equipment + if (containsVoidSet(c) && c.getNew(EquipmentContainer.SLOT_HAT).id == 11663) { + return 1.3 + } + } + return 1.0 + } + + override fun addExperience(entity: Entity?, victim: Entity?, state: BattleState?) { + if (entity is Player) { + if (victim is Player && entity.asPlayer().ironmanManager.isIronman) { + return + } + var hit = 0 + if (state!!.targets != null) { + for (s in state.targets) { + if (s != null && s.estimatedHit > 0) { + hit += s.estimatedHit + } + } + } else if (state.estimatedHit > 0) { + hit += state.estimatedHit + } + if (state.spell != null) { + state.spell.addExperience(entity, hit) + } else { + val famExp = entity.getAttribute("fam-exp", false) && entity.familiarManager.hasFamiliar() + if (!famExp) { + entity.getSkills().addExperience(Skills.HITPOINTS, hit * 1.33, true) + } else { + val fam = entity.familiarManager.familiar + var skill = Skills.MAGIC + when (fam.attackStyle) { + WeaponInterface.STYLE_DEFENSIVE -> skill = Skills.DEFENCE + WeaponInterface.STYLE_ACCURATE -> skill = Skills.ATTACK + WeaponInterface.STYLE_AGGRESSIVE -> skill = Skills.STRENGTH + WeaponInterface.STYLE_RANGE_ACCURATE -> skill = Skills.RANGE + WeaponInterface.STYLE_CONTROLLED -> { + var experience = hit * EXPERIENCE_MOD + experience /= 3.0 + entity.getSkills().addExperience(Skills.ATTACK, experience, true) + entity.getSkills().addExperience(Skills.STRENGTH, experience, true) + entity.getSkills().addExperience(Skills.DEFENCE, experience, true) + return + } + } + entity.getSkills().addExperience(skill, hit * EXPERIENCE_MOD, true) + return + } + entity.getSkills().addExperience(Skills.MAGIC, hit * EXPERIENCE_MOD, true) + } + } + } + + override fun getArmourSet(e: Entity?): ArmourSet? { + return if (ArmourSet.AHRIM.isUsing(e)) { + ArmourSet.AHRIM + } else super.getArmourSet(e) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MeleeSwingHandler.kt b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MeleeSwingHandler.kt new file mode 100644 index 000000000..81d8529b9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MeleeSwingHandler.kt @@ -0,0 +1,349 @@ +package core.game.node.entity.combat.handlers + +import core.game.container.Container +import core.game.container.impl.EquipmentContainer +import core.game.node.entity.Entity +import core.game.node.entity.combat.BattleState +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.combat.CombatSwingHandler +import core.game.node.entity.combat.InteractionType +import core.game.node.entity.combat.equipment.ArmourSet +import core.game.node.entity.combat.equipment.Weapon +import core.game.node.entity.combat.equipment.WeaponInterface +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.state.EntityState +import core.game.world.map.path.Pathfinder +import core.tools.RandomFunction +import core.game.node.entity.skill.Skills +import core.game.content.quest.tutorials.tutorialisland.TutorialSession +import core.game.content.quest.tutorials.tutorialisland.TutorialStage +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks +import kotlin.math.floor + +/** + * Handles a melee combat swing. + * @author Emperor + * @author Ceikry, Kotlin conversion + cleanup + */ +open class MeleeSwingHandler +/** + * Constructs a new `MeleeSwingHandler` {@Code Object}. + */ + : CombatSwingHandler(CombatStyle.MELEE) { + override fun canSwing(entity: Entity, victim: Entity): InteractionType? { + //Credits wolfenzi, https://www.rune-server.ee/2009scape-development/rs2-server/snippets/608720-arios-hybridding-improve.html + var distance = if (usingHalberd(entity)) 2 else 1 + var type = InteractionType.STILL_INTERACT + var goodRange = canMelee(entity, victim, distance) + if (!goodRange && victim.properties.combatPulse.getVictim() !== entity && victim.walkingQueue.isMoving && entity.size() == 1) { + type = InteractionType.MOVE_INTERACT + distance += if (entity.walkingQueue.isRunningBoth) 2 else 1 + goodRange = canMelee(entity, victim, distance) + } + if (!isProjectileClipped(entity, victim, true)) { + return InteractionType.NO_INTERACT + } + val isRunning = entity.walkingQueue.runDir != -1 + val enemyRunning = victim.walkingQueue.runDir != -1 + // THX 4 fix tom <333. + if (super.canSwing(entity, victim) != InteractionType.NO_INTERACT) { + val maxDistance = if (isRunning) if (enemyRunning) 3 else 4 else 2 + if (entity.walkingQueue.isMoving + && entity.location.getDistance(victim.location) <= maxDistance) { + return type + } else if (goodRange) { + if (type == InteractionType.STILL_INTERACT) entity.walkingQueue.reset() + return type + } + } + return InteractionType.NO_INTERACT + } + + override fun swing(entity: Entity?, victim: Entity?, state: BattleState?): Int { + var hit = 0 + state!!.style = CombatStyle.MELEE + if (entity is Player) { + state.weapon = Weapon(entity.equipment[3]) + } + if (entity!!.properties.armourSet === ArmourSet.VERAC && RandomFunction.random(100) < 21) { + state.armourEffect = ArmourSet.VERAC + } + if (state.armourEffect === ArmourSet.VERAC || isAccurateImpact(entity, victim, CombatStyle.MELEE)) { + val max = calculateHit(entity, victim, 1.0) + state.maximumHit = max + hit = RandomFunction.random(max) + } + state.estimatedHit = hit + return 1 + } + + override fun visualize(entity: Entity, victim: Entity?, state: BattleState?) { + entity.animate(entity.properties.attackAnimation) + } + + override fun impact(entity: Entity?, victim: Entity?, state: BattleState?) { + var targets = state!!.targets + if (targets == null) { + targets = arrayOf(state) + } + for (s in targets) { + var hit = s!!.estimatedHit + if (hit > -1) { + victim!!.impactHandler.handleImpact(entity, hit, CombatStyle.MELEE, s) + } + hit = s.secondaryHit + if (hit > -1) { + victim!!.impactHandler.handleImpact(entity, hit, CombatStyle.MELEE, s) + } + } + } + + override fun visualizeImpact(entity: Entity?, victim: Entity?, state: BattleState?) { + if (entity is Player) { + if (TutorialSession.getExtension(entity as Player?).stage == 51) { + TutorialStage.load(entity as Player?, 52, false) + } + if (TutorialSession.getExtension(entity as Player?).stage == 54) { + TutorialStage.load(entity as Player?, 55, false) + } + } + victim!!.animate(victim.properties.defenceAnimation) + } + + override fun adjustBattleState(entity: Entity, victim: Entity, state: BattleState) { + if (entity is Player) { + if (state.estimatedHit > 0) { + val name = entity.equipment.getNew(3).name + var damage = -1 + if (name.contains("(p++") || name.contains("(s)") || name.contains("(kp)")) { + damage = 68 + } else if (name.contains("(p+)")) { + damage = 58 + } else if (name.contains("(p)")) { + damage = 48 + } + if (damage > -1 && RandomFunction.random(10) < 4) { + victim.stateManager.register(EntityState.POISONED, false, damage, entity) + } + } + } + super.adjustBattleState(entity, victim, state) + } + + override fun calculateAccuracy(entity: Entity?): Int { + val baseLevel = entity!!.skills.getStaticLevel(Skills.ATTACK) + var weaponRequirement = baseLevel + if (entity is Player) { + val weapon = entity.equipment[3] + weaponRequirement = weapon?.definition?.getRequirement(Skills.ATTACK) ?: 1 + } + var weaponBonus = 0.0 + if (baseLevel > weaponRequirement) { + weaponBonus = (baseLevel - weaponRequirement) * .3 + } + val style = entity.properties.attackStyle + var level = entity.skills.getLevel(Skills.ATTACK) + if(entity is Player && SkillcapePerks.isActive(SkillcapePerks.PRECISION_STRIKES,entity.asPlayer())){ + level += 6 + } + var prayer = 1.0 + if (entity is Player) { + prayer += entity.prayer.getSkillBonus(Skills.ATTACK) + } + var additional = 1.0 // Black mask/slayer helmet/salve/... + if (entity.properties.combatPulse.getVictim() != null) { + if (!entity.properties.combatPulse.getVictim()!!.isPlayer && entity is Player) { + if (checkUndead(entity.getProperties().combatPulse.getVictim()!!.name) && entity.asPlayer().equipment[EquipmentContainer.SLOT_AMULET] != null) { + if (entity.asPlayer().equipment[EquipmentContainer.SLOT_AMULET].id == 10588) { + additional += 0.20 + } else if (entity.isPlayer() && entity.asPlayer().equipment[EquipmentContainer.SLOT_AMULET].id == 4081) { + additional += 0.15 + } + } + } + } + var styleBonus = 0 + if (style.style == WeaponInterface.STYLE_ACCURATE) { + styleBonus = 3 + } else if (style.style == WeaponInterface.STYLE_CONTROLLED) { + styleBonus = 1 + } + val effective = floor(level * prayer * additional + styleBonus + weaponBonus) + val bonus = entity.properties.bonuses[style.bonusType] + return floor((effective + 8) * (bonus + 64) / 10 * 1.10).toInt() + } + + override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int { + val level = entity!!.skills.getLevel(Skills.STRENGTH) + val bonus = entity.properties.bonuses[11] + var prayer = 1.0 + if (entity is Player) { + prayer += entity.prayer.getSkillBonus(Skills.STRENGTH) + } + var cumulativeStr = floor(level * prayer) + if (entity.properties.attackStyle.style == WeaponInterface.STYLE_AGGRESSIVE) { + cumulativeStr += 3.0 + } else if (entity.properties.attackStyle.style == WeaponInterface.STYLE_CONTROLLED) { + cumulativeStr += 1.0 + } + cumulativeStr *= getSetMultiplier(entity, Skills.STRENGTH) + val hit = (16 + cumulativeStr + bonus / 8 + cumulativeStr * bonus * 0.016865) * modifier + return (hit / 10).toInt() + 1 + } + + override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { + val style = entity!!.properties.attackStyle + var styleBonus = 0 + if (style.style == WeaponInterface.STYLE_DEFENSIVE || style.style == WeaponInterface.STYLE_LONG_RANGE) { + styleBonus = 3 + } else if (style.style == WeaponInterface.STYLE_CONTROLLED) { + styleBonus = 1 + } + val level = entity.skills.getLevel(Skills.DEFENCE) + var prayer = 1.0 + if (entity is Player) { + prayer += entity.prayer.getSkillBonus(Skills.DEFENCE) + } + val effective = floor(level * prayer + styleBonus) + val equipment = entity.properties.bonuses[attacker!!.properties.attackStyle.bonusType + 5] + return floor((effective + 8) * (equipment + 64) / 10).toInt() + } + + override fun getSetMultiplier(e: Entity?, skillId: Int): Double { + if (e!!.properties.armourSet === ArmourSet.DHAROK && skillId == Skills.STRENGTH) { +// System.out.println("Fiist number -> " + 1.0 + ((e.getSkills().getMaximumLifepoints() - e.getSkills().getLifepoints()) * 0.01)); + return 1.0 + (e!!.skills.maximumLifepoints - e.skills.lifepoints) * 0.01 + } + if (e is Player) { + val c: Container = e.equipment + val itemId = c.getNew(EquipmentContainer.SLOT_HAT).id + if ((skillId == Skills.ATTACK || skillId == Skills.STRENGTH) && (itemId in 8901..8921 || itemId == 13263)) { + val victim = e.getProperties().combatPulse.getVictim() + if (victim is NPC && victim.task == e.slayer.task) { + return 1.15 + } + } + if (containsVoidSet(c) && c.getNew(EquipmentContainer.SLOT_HAT).id == 11665) { + return 1.1 + } + } + return 1.0 + } + + override fun addExperience(entity: Entity?, victim: Entity?, state: BattleState?) { + if (entity is Player && state != null) { + if (victim is Player && entity.asPlayer().ironmanManager.isIronman) { + return + } + var hit = state.estimatedHit + if (hit < 0) { + hit = 0 + } + if (state.secondaryHit > 0) { + hit += state.secondaryHit + } + var experience = hit * EXPERIENCE_MOD + val famExp = entity.getAttribute("fam-exp", false) && entity.familiarManager.hasFamiliar() + if (!famExp) { + entity.getSkills().addExperience(Skills.HITPOINTS, hit * 1.33, true) + } + when (if (famExp) entity.familiarManager.familiar.attackStyle else entity.properties.attackStyle.style) { + WeaponInterface.STYLE_ACCURATE -> entity.skills.addExperience(Skills.ATTACK, experience, true) + WeaponInterface.STYLE_AGGRESSIVE -> entity.skills.addExperience(Skills.STRENGTH, experience, true) + WeaponInterface.STYLE_DEFENSIVE -> entity.skills.addExperience(Skills.DEFENCE, experience, true) + WeaponInterface.STYLE_CONTROLLED -> { + experience /= 3.0 + entity.skills.addExperience(Skills.ATTACK, experience, true) + entity.skills.addExperience(Skills.STRENGTH, experience, true) + entity.skills.addExperience(Skills.DEFENCE, experience, true) + } + WeaponInterface.STYLE_CAST -> entity.skills.addExperience(Skills.MAGIC, experience, true) + } + } + } + + override fun getArmourSet(e: Entity?): ArmourSet? { + if (ArmourSet.DHAROK.isUsing(e)) { + return ArmourSet.DHAROK + } + if (ArmourSet.GUTHAN.isUsing(e)) { + return ArmourSet.GUTHAN + } + if (ArmourSet.VERAC.isUsing(e)) { + return ArmourSet.VERAC + } + return if (ArmourSet.TORAG.isUsing(e)) { + ArmourSet.TORAG + } else super.getArmourSet(e) + } + + /** + * Check to see whether an NPC is classified as undead. + * @param name + * @return true if so + */ + private fun checkUndead(name: String): Boolean { + return (name == "Zombie" || name.contains("rmoured") || name == "Ankou" || name == "Crawling Hand" || name == "Banshee" || name == "Ghost" || name == "Ghast" || name == "Mummy" || name.contains("Revenant") + || name == "Skeleton" || name == "Zogre" || name == "Spiritual Mage") + } + + companion object { + /** + * Checks if the entity is using a halberd. + * @param entity The entity. + * @return `True` if so. + */ + private fun usingHalberd(entity: Entity): Boolean { + if (entity is Player) { + val weapon = entity.equipment[EquipmentContainer.SLOT_WEAPON] + if (weapon != null) { + return weapon.id in 3190..3204 || weapon.id == 6599 + } + } else if (entity is NPC) { + return entity.id == 8612 + } + return false + } + + /** + * Checks if the entity can execute a melee swing from its current location. + * @param entity The attacking entity. + * @param victim The victim. + * @return `True` if so. + */ + fun canMelee(entity: Entity, victim: Entity?, distance: Int): Boolean { + val e = entity.location + if (victim == null) { + return false + } + if (entity.id == 7135 && entity.location.withinDistance(victim.location, 2)) { + return true + } + val x = victim.location.x + val y = victim.location.y + val size = entity.size() + if (distance == 1) { + for (i in 0 until size) { + if (Pathfinder.isStandingIn(e.x - 1, e.y + i, 1, 1, x, y, victim.size(), victim.size())) { + return true + } + if (Pathfinder.isStandingIn(e.x + size, e.y + i, 1, 1, x, y, victim.size(), victim.size())) { + return true + } + if (Pathfinder.isStandingIn(e.x + i, e.y - 1, 1, 1, x, y, victim.size(), victim.size())) { + return true + } + if (Pathfinder.isStandingIn(e.x + i, e.y + size, 1, 1, x, y, victim.size(), victim.size())) { + return true + } + } + if (e == victim.location) { + return true + } + return victim.getSwingHandler(false).type == CombatStyle.MELEE && e.withinDistance(victim.location, 1) && victim.properties.combatPulse.getVictim() === entity && entity.index < victim.index + } + return entity.centerLocation.withinDistance(victim.centerLocation, distance + (size shr 1) + (victim.size() shr 1)) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MultiSwingHandler.kt b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MultiSwingHandler.kt new file mode 100644 index 000000000..aa1e05671 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/MultiSwingHandler.kt @@ -0,0 +1,189 @@ +package core.game.node.entity.combat.handlers + +import core.game.node.entity.Entity +import core.game.node.entity.combat.BattleState +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.combat.CombatSwingHandler +import core.game.node.entity.combat.InteractionType +import core.game.node.entity.combat.equipment.SwitchAttack +import core.game.node.entity.npc.NPC +import core.tools.RandomFunction + +/** + * Handles combat swings with switching combat styles. + * @author Emperor + * @author Ceirky, Kotlin conversion + */ +open class MultiSwingHandler(meleeDistance: Boolean, vararg attacks: SwitchAttack) : CombatSwingHandler(CombatStyle.RANGE) { + /** + * The attacks available. + */ + val attacks: Array + + /** + * If the entity has to be in melee distance to switch to melee. + */ + val isMeleeDistance: Boolean + + /** + * The current attack. + */ + protected var current: SwitchAttack + + /** + * The current attack. + */ + protected var next: SwitchAttack + + /** + * Constructs a new `MultiSwingHandler` `Object`. + * @param attacks The available attacks. + */ + constructor(vararg attacks: SwitchAttack) : this(true, *attacks) {} + + override fun canSwing(entity: Entity, victim: Entity): InteractionType? { + return if (isMeleeDistance) { + CombatStyle.RANGE.swingHandler.canSwing(entity, victim) + } else next.handler.canSwing(entity, victim) + } + + override fun swing(entity: Entity?, victim: Entity?, state: BattleState?): Int { + current = next + if (isMeleeDistance && current.style == CombatStyle.MELEE && CombatStyle.MELEE.swingHandler.canSwing(entity!!, victim!!) != InteractionType.STILL_INTERACT) { + for (attack in attacks) { + if (attack.style != CombatStyle.MELEE) { + current = attack + break + } + } + } + val style = current.style + type = style + val index = RandomFunction.randomize(attacks.size) + val pick = getNext(entity, victim, state, index) + next = pick + if (current.isUseHandler) { + return current.handler.swing(entity, victim, state) + } + var ticks = 1 + if (style != CombatStyle.MELEE) { + ticks += Math.ceil(entity!!.location.getDistance(victim!!.location) * if (type == CombatStyle.MAGIC) 0.5 else 0.3).toInt() + } + var hit = 0 + if (isAccurateImpact(entity, victim, style)) { + val max = calculateHit(entity, victim, 1.0) + state!!.maximumHit = max + hit = RandomFunction.random(max) + } + state!!.estimatedHit = hit + state.style = style + return ticks + } + + override fun visualize(entity: Entity, victim: Entity?, state: BattleState?) { + if (current.isUseHandler) { + current.handler.visualize(entity, victim, state) + return + } + entity.visualize(current.animation, current.startGraphic) + if (current.projectile != null) { + current.projectile.transform(entity, victim, entity is NPC, 46, if (current.style == CombatStyle.MAGIC) 10 else 5).send() + } + } + + override fun impact(entity: Entity?, victim: Entity?, state: BattleState?) { + if (current.isUseHandler) { + current.handler.impact(entity, victim, state) + return + } + var targets = state!!.targets + if (targets == null) { + targets = arrayOf(state) + } + for (s in targets) { + var hit = s!!.estimatedHit + if (hit > -1) { + victim!!.impactHandler.handleImpact(entity, hit, current.style, s) + } + hit = s.secondaryHit + if (hit > -1) { + victim!!.impactHandler.handleImpact(entity, hit, current.style, s) + } + } + } + + override fun adjustBattleState(entity: Entity, victim: Entity, state: BattleState) { + if (current.isUseHandler) { + current.handler.adjustBattleState(entity, victim, state) + return + } + super.adjustBattleState(entity, victim, state) + } + + override fun addExperience(entity: Entity?, victim: Entity?, state: BattleState?) {} + override fun visualizeImpact(entity: Entity?, victim: Entity?, state: BattleState?) { + if (current.isUseHandler) { + current.handler.visualizeImpact(entity, victim, state) + return + } + victim!!.visualize(victim.properties.defenceAnimation, current.endGraphic) + } + + override fun calculateAccuracy(entity: Entity?): Int { + return current.handler.calculateAccuracy(entity) + } + + override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int { + return if (current.maximumHit > -1) { + current.maximumHit + } else current.handler.calculateHit(entity, victim, modifier) + } + + override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { + return current.handler.calculateDefence(entity, attacker) + } + + override fun getSetMultiplier(e: Entity?, skillId: Int): Double { + return current.handler.getSetMultiplier(e, skillId) + } + + /** + * Checks if an attack switch can be selected. + * @param attack The attack to switch to. + * @return `True` if selectable. + */ + fun canSelect(attack: SwitchAttack?): Boolean { + return true + } + + /** + * Gets the next switch attack. + * @param entity the entity. + * @param victim the victim. + * @param state the state. + * @param index the index. + * @return the next attack. + */ + fun getNext(entity: Entity?, victim: Entity?, state: BattleState?, index: Int): SwitchAttack { + var index = index + var pick = attacks[index] + while (!pick.canSelect(entity, victim, state)) { + index = RandomFunction.randomize(attacks.size) + pick = attacks[index] + } + return pick + } + + /** + * Constructs a new `MultiSwingHandler` `Object`. + * @param meleeDistance If the entity has to be in melee distance to switch + * to melee. + * @param attacks The available attacks. + */ + init { + current = attacks[0] + next = current + isMeleeDistance = meleeDistance && !(attacks.size == 1 && attacks[0].style == CombatStyle.MELEE) + this.attacks = attacks as Array + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/handlers/RangeSwingHandler.kt b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/RangeSwingHandler.kt new file mode 100644 index 000000000..231674eb2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/RangeSwingHandler.kt @@ -0,0 +1,455 @@ +package core.game.node.entity.combat.handlers + +import core.game.container.Container +import core.game.container.impl.EquipmentContainer +import core.game.node.entity.Entity +import core.game.node.entity.combat.BattleState +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.combat.CombatSwingHandler +import core.game.node.entity.combat.InteractionType +import core.game.node.entity.combat.equipment.* +import core.game.node.entity.combat.equipment.Weapon.WeaponType +import core.game.node.entity.impl.Projectile +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.state.EntityState +import core.game.node.item.GroundItem +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.update.flag.context.Graphics +import core.tools.RandomFunction +import core.game.node.entity.skill.Skills +import core.game.content.quest.tutorials.tutorialisland.TutorialSession +import core.game.content.quest.tutorials.tutorialisland.TutorialStage +import core.game.system.SystemLogger +import java.util.* +import kotlin.math.ceil +import kotlin.math.floor + +/** + * Handles the range combat swings. + * @author Emperor + * @author Ceikry, conversion to Kotlin + cleanup + */ +open class RangeSwingHandler +/** + * Constructs a new `RangeSwingHandler` {@Code Object}. + */ + : CombatSwingHandler(CombatStyle.RANGE) { + override fun canSwing(entity: Entity, victim: Entity): InteractionType? { + if (!isProjectileClipped(entity, victim, false)) { + return InteractionType.NO_INTERACT + } + if (entity.getAttribute("tut-island", false)) { + if (TutorialSession.getExtension(entity as Player).stage == 70) { + return InteractionType.NO_INTERACT + } + } + var distance = 7 + if (entity is Player && (entity.getExtension(WeaponInterface::class.java) as WeaponInterface).weaponInterface.interfaceId == 91) { + distance -= 2 + } + if (entity.properties.attackStyle.style == WeaponInterface.STYLE_LONG_RANGE) { + distance += 2 + } + var goodRange = victim.centerLocation.withinDistance(entity.centerLocation, getCombatDistance(entity, victim, distance)) + var type = InteractionType.STILL_INTERACT + if (victim.walkingQueue.isMoving && !goodRange) { + goodRange = victim.centerLocation.withinDistance(entity.centerLocation, getCombatDistance(entity, victim, ++distance)) + type = InteractionType.MOVE_INTERACT + } + if (goodRange && super.canSwing(entity, victim) != InteractionType.NO_INTERACT) { + if (type == InteractionType.STILL_INTERACT) { + entity.walkingQueue.reset() + } + return type + } + return InteractionType.NO_INTERACT + } + + override fun swing(entity: Entity?, victim: Entity?, state: BattleState?): Int { + configureRangeData(entity, state) + if (state!!.weapon == null || !hasAmmo(entity, state)) { + entity!!.properties.combatPulse.stop() + return -1 + } + var hit = 0 + if (isAccurateImpact(entity, victim, CombatStyle.RANGE)) { + val max = calculateHit(entity, victim, 1.0) + state.maximumHit = max + hit = RandomFunction.random(max) + } + state.estimatedHit = hit + if (state.weapon.type == WeaponType.DOUBLE_SHOT) { + if (isAccurateImpact(entity, victim, CombatStyle.RANGE)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.0)) + } + state.secondaryHit = hit + } + if (entity == null || victim!!.location == null) { + return -1 + } + useAmmo(entity, state, victim.location) + return 1 + ceil(entity.location.getDistance(victim.location) * 0.3).toInt() + } + + /** + * Configures the range data. + * @param entity The entity. + * @param state The battle state. + */ + fun configureRangeData(entity: Entity?, state: BattleState?) { + state!!.style = CombatStyle.RANGE + val w: Weapon? + if (entity is Player) { + val rw = RangeWeapon.get(entity.equipment.getNew(3).id) + if (rw == null) { + SystemLogger.logErr("Unhandled range weapon used - [item id=" + entity.equipment.getNew(3).id + "].") + return + } + w = Weapon(entity.equipment[3], rw.ammunitionSlot, entity.equipment.getNew(rw.ammunitionSlot)) + w.type = rw.weaponType + state.rangeWeapon = rw + state.ammunition = Ammunition.get(w.ammunition.id) + } else { + w = Weapon(null) + } + state.weapon = w + } + + override fun adjustBattleState(entity: Entity, victim: Entity, state: BattleState) { + if (state.ammunition != null && entity is Player) { + val damage = state.ammunition.poisonDamage + if (state.estimatedHit > 0 && damage > 8 && RandomFunction.random(10) < 4) { + victim.stateManager.register(EntityState.POISONED, false, damage, entity) + } + } + super.adjustBattleState(entity, victim, state) + } + + override fun addExperience(entity: Entity?, victim: Entity?, state: BattleState?) { + if (entity is Player) { + if (victim is Player && entity.asPlayer().ironmanManager.isIronman) { + return + } + var hit = state!!.estimatedHit + if (hit < 0) { + hit = 0 + } + if (state.secondaryHit > 0) { + hit += state.secondaryHit + } + val p = entity.asPlayer() + val famExp = entity.getAttribute("fam-exp", false) && p.familiarManager.hasFamiliar() + if (famExp) { + val fam = p.familiarManager.familiar + var skill = Skills.RANGE + when (fam.attackStyle) { + WeaponInterface.STYLE_DEFENSIVE -> skill = Skills.DEFENCE + WeaponInterface.STYLE_ACCURATE -> skill = Skills.ATTACK + WeaponInterface.STYLE_AGGRESSIVE -> skill = Skills.STRENGTH + WeaponInterface.STYLE_RANGE_ACCURATE -> skill = Skills.RANGE + WeaponInterface.STYLE_CONTROLLED -> { + var experience = hit * EXPERIENCE_MOD + experience /= 3.0 + entity.getSkills().addExperience(Skills.ATTACK, experience, true) + entity.getSkills().addExperience(Skills.STRENGTH, experience, true) + entity.getSkills().addExperience(Skills.DEFENCE, experience, true) + return + } + WeaponInterface.STYLE_CAST -> skill = Skills.MAGIC + } + entity.getSkills().addExperience(skill, hit * EXPERIENCE_MOD, true) + return + } + entity.getSkills().addExperience(Skills.HITPOINTS, hit * 1.33, true) + if (entity.getProperties().attackStyle.style == WeaponInterface.STYLE_LONG_RANGE) { + entity.getSkills().addExperience(Skills.RANGE, hit * (EXPERIENCE_MOD / 2), true) + entity.getSkills().addExperience(Skills.DEFENCE, hit * (EXPERIENCE_MOD / 2), true) + } else { + entity.getSkills().addExperience(Skills.RANGE, hit * EXPERIENCE_MOD, true) + } + } + } + + override fun visualize(entity: Entity, victim: Entity?, state: BattleState?) { + var start: Graphics? = null + if (state!!.ammunition != null) { + start = state.ammunition.startGraphics + state.ammunition.projectile.copy(entity, victim, 5.0).send() + if (state.weapon.type == WeaponType.DOUBLE_SHOT && state.ammunition.darkBowGraphics != null) { + start = state.ammunition.darkBowGraphics + val speed = (55 + entity.location.getDistance(victim!!.location) * 10).toInt() + Projectile.create(entity, victim, state.ammunition.projectile.projectileId, 40, 36, 41, speed, 25).send() + } + } else if (entity is NPC) { + if (entity.definition.combatGraphics[0] != null) { + start = entity.definition.combatGraphics[0] + } + val g = entity.definition.combatGraphics[1] + if (g != null) { + Projectile.ranged(entity, victim, g.id, g.height, 36, 41, 5).send() + } + } + val weapon: RangeWeapon? = RangeWeapon.get(state.weapon.id) + val anim = entity.properties.attackAnimation.id + weapon?.let { + if ((anim == 422 || anim == 423)) { + entity.visualize(it.animation, start) + return + } + } + entity.visualize(entity.properties.attackAnimation, start) + } + + override fun impact(entity: Entity?, victim: Entity?, state: BattleState?) { + if (state!!.ammunition != null && state.ammunition.effect != null && state.ammunition.effect.canFire(state)) { + state.ammunition.effect.impact(state) + } + val hit = state.estimatedHit + if (entity is Player) { + if (TutorialSession.getExtension(entity as Player?).stage == 51) { + TutorialStage.load(entity as Player?, 52, false) + } + if (TutorialSession.getExtension(entity as Player?).stage == 52) { + TutorialStage.load(entity as Player?, 53, false) + } + } + victim!!.impactHandler.handleImpact(entity, hit, CombatStyle.RANGE, state) + if (state.secondaryHit > -1) { + val hitt = state.secondaryHit + GameWorld.Pulser.submit(object : Pulse(1, victim) { + override fun pulse(): Boolean { + victim.impactHandler.handleImpact(entity, hitt, CombatStyle.RANGE, state) + return true + } + }) + } + } + + override fun visualizeImpact(entity: Entity?, victim: Entity?, state: BattleState?) { + victim!!.animate(victim.properties.defenceAnimation) + } + + override fun calculateAccuracy(entity: Entity?): Int { + val baseLevel = entity!!.skills.getStaticLevel(Skills.RANGE) + var weaponRequirement = baseLevel + if (entity is Player) { + val weapon = entity.equipment[3] + weaponRequirement = weapon?.definition?.getRequirement(Skills.RANGE) ?: 1 + } + var weaponBonus = 0.0 + if (baseLevel > weaponRequirement) { + weaponBonus = (baseLevel - weaponRequirement) * .3 + } + val level = entity.skills.getLevel(Skills.RANGE) + var prayer = 1.0 + if (entity is Player) { + prayer += entity.prayer.getSkillBonus(Skills.RANGE) + } + var additional = 1.0 // Slayer helmet/salve/... + if(entity is Player && core.game.node.entity.skill.skillcapeperks.SkillcapePerks.isActive(core.game.node.entity.skill.skillcapeperks.SkillcapePerks.ACCURATE_MARKSMAN,entity.asPlayer())){ + additional += 0.5 + } + var styleBonus = 0 + if (entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) { + styleBonus = 3 + } + val effective = floor(level * prayer * additional + styleBonus + weaponBonus) + val bonus = entity.properties.bonuses[WeaponInterface.BONUS_RANGE] + return floor((effective + 8) * (bonus + 64) / 10).toInt() + } + + override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int { + val level = entity!!.skills.getLevel(Skills.RANGE) + val bonus = entity.properties.bonuses[14] + var prayer = 1.0 + if (entity is Player) { + prayer += entity.prayer.getSkillBonus(Skills.RANGE) + } + var cumulativeStr = floor(level * prayer) + if (entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) { + cumulativeStr += 3.0 + } else if (entity.properties.attackStyle.style == WeaponInterface.STYLE_LONG_RANGE) { + cumulativeStr += 1.0 + } + cumulativeStr *= getSetMultiplier(entity, Skills.RANGE) + return ((14 + cumulativeStr + bonus / 8 + cumulativeStr * bonus * 0.016865) * modifier).toInt() / 10 + 1 + } + + override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { + val style = entity!!.properties.attackStyle + var styleBonus = 0 + if (style.style == WeaponInterface.STYLE_DEFENSIVE || style.style == WeaponInterface.STYLE_LONG_RANGE) { + styleBonus = 3 + } else if (style.style == WeaponInterface.STYLE_CONTROLLED) { + styleBonus = 1 + } + val level = entity.skills.getLevel(Skills.DEFENCE) + var prayer = 1.0 + if (entity is Player) { + prayer += entity.prayer.getSkillBonus(Skills.DEFENCE) + } + val effective = floor(level * prayer + styleBonus) + val equipment = entity.properties.bonuses[WeaponInterface.BONUS_RANGE + 5] + return floor((effective + 8) * (equipment + 64) / 10).toInt() + } + + override fun getSetMultiplier(e: Entity?, skillId: Int): Double { + if (e is Player) { + val c: Container = e.equipment + if (containsVoidSet(c) && c.getNew(EquipmentContainer.SLOT_HAT).id == 11664) { + return 1.1 + } + } + return 1.0 + } + + override fun getArmourSet(e: Entity?): ArmourSet? { + return if (ArmourSet.KARIL.isUsing(e)) { + ArmourSet.KARIL + } else super.getArmourSet(e) + } + + companion object { + /** + * Checks if the entity has the ammunition needed to proceed. + * @param e The entity. + * @param state The battle state. + * @return `True` if so. + */ + fun hasAmmo(e: Entity?, state: BattleState?): Boolean { + if (e !is Player) { + return true + } + val type = state!!.weapon.type + val amount = if (type == WeaponType.DOUBLE_SHOT) 2 else 1 + if (type == WeaponType.DEGRADING) { + return true + } + val item = e.equipment[state.weapon.ammunitionSlot] + if (item != null && item.amount >= amount) { + if (!state.rangeWeapon.ammunition.contains(item.id)) { + e.packetDispatch.sendMessage("You can't use this type of ammunition with this bow.") + return false + } + return true + } + if (type == WeaponType.DOUBLE_SHOT) { + state.weapon.type = WeaponType.DEFAULT + return hasAmmo(e, state) + } + e.packetDispatch.sendMessage("You do not have enough ammo left.") + return false + } + + /** + * Uses the ammunition for the range weapon. + * @param e The entity. + * @param state The battle state. + * @param location The drop location. + */ + fun useAmmo(e: Entity, state: BattleState, location: Location?) { + var dropLocation = location + if (e !is Player) { + return + } + val type = state.weapon.type + val amount = if (type == WeaponType.DOUBLE_SHOT) 2 else 1 + if (type == WeaponType.DEGRADING) { + degrade(e, state, amount) + return + } + val ammo = state.weapon.ammunition + if (state.weapon.ammunitionSlot == -1 || ammo == null) { + return + } + val dropRate = getDropRate(e) + if (dropRate == -1.0) { + return + } + if (dropLocation == null) { + return + } + val flag = RegionManager.getClippingFlag(dropLocation) + if (flag and 0x200000 != 0) { //Water + dropLocation = null + } + e.equipment.replace(Item(ammo.id, ammo.amount - amount, ammo.charge), state.weapon.ammunitionSlot) + if (dropLocation != null && state.rangeWeapon.isDropAmmo) { + val rate = 5 * (1.0 + e.skills.getLevel(Skills.RANGE) * 0.01) * dropRate + if (RandomFunction.randomize(rate.toInt()) != 0) { + val drop = GroundItemManager.increase(Item(ammo.id, amount), dropLocation, e) + if (drop != null) { + if (e.getAttribute("duel:ammo", null) != null) { + (e.getAttribute("duel:ammo") as ArrayList).add(drop) + } + } + } + } + if (e.equipment[state.rangeWeapon.ammunitionSlot] == null) { + e.packetDispatch.sendMessage("You have no ammo left in your quiver!") + } + } + + /** + * Checks if ammunition should be saved. + * @param e The entity. + * @return `True` if so. + */ + private fun getDropRate(e: Entity?): Double { + if (e is Player) { + val cape = e.equipment[EquipmentContainer.SLOT_CAPE] + val weapon = e.equipment[EquipmentContainer.SLOT_WEAPON] + if (cape != null && (cape.id == 10498 || cape.id == 10499) && weapon != null && weapon.id != 10034 && weapon.id != 10033) { + val rate = 80 + if (RandomFunction.random(100) < rate) { + val torso = e.equipment[EquipmentContainer.SLOT_CHEST] + val modelId = torso?.definition?.maleWornModelId1 ?: -1 + if (modelId == 301 || modelId == 306 || modelId == 3379) { + e.packetDispatch.sendMessage("Your armour interferes with Ava's device.") + return 1.0 + } + return (-1).toDouble() + } + return 0.33 + } + } + return 1.0 + } + + /** + * Degrades the player's range weapon used. + * @param p The player. + * @param state The battle state. + * @param amount The amount of shots to degrade. + */ + private fun degrade(p: Player, state: BattleState, amount: Int) { + if (state.weapon.item.id == 4212) { // New crystal bow. + p.packetDispatch.sendMessage("Your crystal bow has degraded!") + p.equipment.replace(Item(4214, 1, 996), 3) + return + } + val charge = state.weapon.item.charge - amount * 4 + state.weapon.item.charge = charge + if (charge < 1) { + val id = state.weapon.id + 1 + if (id < 4224) { + p.packetDispatch.sendMessage("Your crystal bow has degraded!") + p.equipment.replace(Item(id, 1, 999), 3) + } else { + var replace: Item? = null + if (!p.inventory.add(Item(4207))) { + replace = Item(4207) + } + p.equipment.replace(replace, 3) + p.packetDispatch.sendMessage("Your crystal bow has degraded to a small crystal seed.") + } + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/handlers/SalamanderSwingHandler.kt b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/SalamanderSwingHandler.kt new file mode 100644 index 000000000..1217a67c5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/handlers/SalamanderSwingHandler.kt @@ -0,0 +1,80 @@ +package core.game.node.entity.combat.handlers + +import core.game.node.entity.Entity +import core.game.node.entity.combat.BattleState +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.combat.CombatSwingHandler +import core.game.node.entity.combat.InteractionType +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.game.node.entity.skill.Skills + +/** + * Handles a combat swing using a salamander. + * @author Vexia + */ +class SalamanderSwingHandler(private var style: CombatStyle) : CombatSwingHandler(style) { + override fun swing(entity: Entity?, victim: Entity?, state: BattleState?): Int { + val index = entity!!.properties.attackStyle.style + style = when(index) { + 7 -> CombatStyle.MAGIC + 4 -> CombatStyle.RANGE + else -> CombatStyle.MELEE + } + return style.swingHandler.swing(entity, victim, state) + } + + override fun impact(entity: Entity?, victim: Entity?, state: BattleState?) { + style.swingHandler.impact(entity, victim, state) + } + + override fun visualize(entity: Entity, victim: Entity?, state: BattleState?) { + style.swingHandler.visualize(entity, victim, state) + entity.visualize(Animation.create(5247), Graphics(952, 100)) + } + + override fun visualizeImpact(entity: Entity?, victim: Entity?, state: BattleState?) { + style.swingHandler.visualizeImpact(entity, victim, state) + } + + override fun calculateAccuracy(entity: Entity?): Int { + return style.swingHandler.calculateAccuracy(entity) + } + + override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int { + return style.swingHandler.calculateHit(entity, victim, modifier) + } + + override fun addExperience(entity: Entity?, victim: Entity?, state: BattleState?) { + entity!!.skills.addExperience(Skills.HITPOINTS, state!!.estimatedHit * 1.33, true) + if (state.style == CombatStyle.MAGIC) { + entity.skills.addExperience(Skills.MAGIC, state.estimatedHit * 2.toDouble(), true) + } + if (state.style == CombatStyle.RANGE) { + entity.skills.addExperience(Skills.RANGE, state.estimatedHit * 4.toDouble(), true) + } + if (state.style == CombatStyle.MELEE) { + entity.skills.addExperience(Skills.STRENGTH, state.estimatedHit * 4.toDouble(), true) + } + } + + override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { + return style.swingHandler.calculateDefence(entity, attacker) + } + + override fun getSetMultiplier(e: Entity?, skillId: Int): Double { + return style.swingHandler.getSetMultiplier(e, skillId) + } + + override fun canSwing(entity: Entity, victim: Entity): InteractionType? { + return style.swingHandler.canSwing(entity, victim) + } + + companion object { + /** + * The instance for the swing handler. + */ + val INSTANCE = SalamanderSwingHandler(CombatStyle.MELEE) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/AncientMaceSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/AncientMaceSpecialHandler.java new file mode 100644 index 000000000..2ad155abd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/AncientMaceSpecialHandler.java @@ -0,0 +1,76 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the ancient mace special attack "Favour of the War God". + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class AncientMaceSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 100; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(6147, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1052); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(11061, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.1, 0.98)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1)); + if (entity.getSkills().getPrayerPoints() < entity.getSkills().getStaticLevel(5)) { + entity.getSkills().setPrayerPoints(entity.getSkills().getPrayerPoints() + hit); + } + victim.getSkills().decrementPrayerPoints(hit); + } + state.setEstimatedHit(hit); + return 1; + } + + @Override + protected int getFormattedHit(Entity entity, Entity victim, BattleState state, int hit) { + // Disables protection prayers. + return formatHit(victim, hit); + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/BackstabSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/BackstabSpecialHandler.java new file mode 100644 index 000000000..b10ec0e9c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/BackstabSpecialHandler.java @@ -0,0 +1,74 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Bone dagger special attack "Backstab". + * @author Emperor + */ +@Initializable +public final class BackstabSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 75; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(4198, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(704); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(8872, this); + CombatStyle.MELEE.getSwingHandler().register(8874, this); + CombatStyle.MELEE.getSwingHandler().register(8876, this); + CombatStyle.MELEE.getSwingHandler().register(8878, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + double accuracy = 1.0; + if (!victim.getProperties().getCombatPulse().isAttacking()) { + accuracy = 1.75; + } + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, accuracy, 0.98)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.0)); + victim.getSkills().updateLevel(Skills.DEFENCE, -hit / 10, 0); + } + state.setEstimatedHit(hit); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/ChainhitSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/ChainhitSpecialHandler.java new file mode 100644 index 000000000..22377fe6f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/ChainhitSpecialHandler.java @@ -0,0 +1,190 @@ +package core.game.node.entity.combat.special; + +import java.util.Iterator; +import java.util.List; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.handlers.RangeSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.MapDistance; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the Rune throwing axe special attack "Chain-hit". + * @author Emperor + */ +@Initializable +public final class ChainhitSpecialHandler extends RangeSwingHandler implements Plugin { + + /** + * The sp::ecial energy required. + */ + private static final int SPECIAL_ENERGY = 10; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1068, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(257, 96); + + /** + * The door support locations. + */ + private static final Location[] DOOR_SUPPORTS = new Location[] { Location.create(2545, 10145, 0), Location.create(2545, 10141, 0) }; + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.RANGE.getSwingHandler().register(805, this); + return this; + } + + @Override + public int swing(Entity entity, final Entity victim, BattleState state) { + if (entity.getAttribute("chain-hit_v") != null) { + ((Player) entity).getPacketDispatch().sendMessage("You're already using the chain-hit special attack."); + ((Player) entity).getSettings().toggleSpecialBar(); + return -1; + } + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + if (victim instanceof NPC) { + NPC npc = victim.asNpc(); + if (npc.getId() == 2443) { + for (Location l : DOOR_SUPPORTS) { + final NPC n = Repository.findNPC(l); + if (n == null) { + continue; + } + if (DeathTask.isDead(n) || n.getId() != n.getOriginalId()) { + continue; + } + int speed = (int) (32 + (victim.getLocation().getDistance(n.getLocation()) * 5)); + Projectile.create(victim, n, 258, 40, 36, 32, speed, 5, 11).send(); + n.getSkills().heal(100); + GameWorld.getPulser().submit(new Pulse(3) { + + @Override + public boolean pulse() { + n.getImpactHandler().manualHit(victim, 1, HitsplatType.NORMAL); + return true; + } + + }); + } + } + } + return super.swing(entity, victim, state); + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + int speed = (int) (32 + (entity.getLocation().getDistance(victim.getLocation()) * 5)); + Projectile.create(entity, victim, 258, 40, 36, 32, speed, 5, 11).send(); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + handleHit(entity, victim, (Player) entity, state); + super.visualizeImpact(entity, victim, state); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + // Empty. + } + + /** + * Handles a hit. + * @param entity The entity. + * @param victim The victim. + * @param player The player. + * @param state The battle state. + */ + public void handleHit(final Entity entity, final Entity victim, final Player player, final BattleState state) { + GameWorld.getPulser().submit(new Pulse(1, player, victim) { + @Override + public boolean pulse() { + ChainhitSpecialHandler.super.onImpact(player, victim, state); + ChainhitSpecialHandler.super.impact(entity, victim, state); + return true; + } + }); + if (victim.getId() == 2440 || victim.getId() == 2446 || victim.getId() == 2443) { + return; + } + if (victim.getProperties().isMultiZone() && player.getSettings().getSpecialEnergy() >= SPECIAL_ENERGY) { + List list = getVictimsList(player, victim); + for (Iterator it = list.iterator(); it.hasNext();) { + final Entity e = it.next(); + it.remove(); + if (!e.isAttackable(player, CombatStyle.RANGE) || !e.getProperties().isMultiZone()) { + continue; + } + double distance = victim.getLocation().getDistance(e.getLocation()); + int speed = (int) (32 + (distance * 5)); + Projectile.create(victim, e, 258, 40, 36, 32, speed, 5, 11).send(); + GameWorld.getPulser().submit(new Pulse((int) (distance / 3), entity, victim, e) { + @Override + public boolean pulse() { + BattleState bs = new BattleState(entity, e); + bs.setMaximumHit(calculateHit(player, e, 1.0)); + bs.setEstimatedHit(RandomFunction.RANDOM.nextInt(bs.getMaximumHit())); + handleHit(victim, e, player, bs); + ChainhitSpecialHandler.super.visualizeImpact(player, e, bs); + return true; + } + }); + player.getSettings().setSpecialEnergy(player.getSettings().getSpecialEnergy() - SPECIAL_ENERGY); + return; + } + } + player.removeAttribute("chain-hit_v"); + } + + /** + * Gets the victims list. + * @param e The attacking entity. + * @return The victims list. + */ + private List getVictimsList(Entity e, Entity victim) { + List list = e.getAttribute("chain-hit_v"); + if (list == null) { + int distance = MapDistance.RENDERING.getDistance() / 3; + if (victim instanceof NPC) { + e.setAttribute("chain-hit_v", list = RegionManager.getLocalNpcs(e, distance)); + } else { + e.setAttribute("chain-hit_v", list = RegionManager.getLocalPlayers(e, distance)); + } + list.remove(e); + list.remove(victim); + } + return list; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/CleaveSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/CleaveSpecialHandler.java new file mode 100644 index 000000000..c1c9d17c2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/CleaveSpecialHandler.java @@ -0,0 +1,69 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the cleave special handler. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class CleaveSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 25; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1058, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(248, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (CombatStyle.MELEE.getSwingHandler().register(1305, this) && CombatStyle.MELEE.getSwingHandler().register(13475, this)) + ; + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.18, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.2203)); + } + state.setEstimatedHit(hit); + entity.asPlayer().getAudioManager().send(new Audio(2529), true); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/ClobberSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/ClobberSpecialHandler.java new file mode 100644 index 000000000..c5e43ad99 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/ClobberSpecialHandler.java @@ -0,0 +1,76 @@ +package core.game.node.entity.combat.special; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the dragon axe's clobbrer special handler. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class ClobberSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 100; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(2876, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(479, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(6739, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (entity instanceof Player) { + entity.asPlayer().sendChat("Chop chop!"); + } + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.05, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.0)); + if (hit > 9) { + int amount = hit / 10; + victim.getSkills().updateLevel(Skills.DEFENCE, -amount, 0); + victim.getSkills().updateLevel(Skills.MAGIC, -amount, 0); + } + } + entity.getSkills().updateLevel(Skills.WOODCUTTING, 3); + state.setEstimatedHit(hit); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/DescentOfDarknessSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/DescentOfDarknessSpecialHandler.java new file mode 100644 index 000000000..9009c6291 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/DescentOfDarknessSpecialHandler.java @@ -0,0 +1,149 @@ +package core.game.node.entity.combat.special; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.equipment.Ammunition; +import core.game.node.entity.combat.equipment.RangeWeapon; +import core.game.node.entity.combat.equipment.Weapon; +import core.game.node.entity.combat.equipment.Weapon.WeaponType; +import core.game.node.entity.combat.handlers.RangeSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the descent of darkness sepcial handler. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class DescentOfDarknessSpecialHandler extends RangeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 65; + + /** + * The descent of dragons projectile. + */ + private static final Projectile DRAGON_PROJECTILE = Projectile.create((Entity) null, null, 1099, 40, 36, 41, 46, 5, 11); + + /** + * The descent of dragons secondary projectile. + */ + private static final Projectile DRAGON_PROJECTILE_1 = Projectile.create((Entity) null, null, 1099, 40, 36, 41, 55, 25, 11); + + /** + * The descent of darkness projectile. + */ + private static final Projectile DARKNESS_PROJECTILE = Projectile.create((Entity) null, null, 1101, 40, 36, 41, 46, 5, 11); + + /** + * The descent of darkness secondary projectile. + */ + private static final Projectile DARKNESS_PROJECTILE_1 = Projectile.create((Entity) null, null, 1101, 40, 36, 41, 55, 25, 11); + + /** + * The descent of dragons impact graphic. + */ + private static final Graphics DRAGON_IMPACT = new Graphics(1100, 96); + + /** + * The descent of darkness impact graphic. + */ + private static final Graphics DARKNESS_IMPACT = new Graphics(1103, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (CombatStyle.RANGE.getSwingHandler().register(11235, this) && CombatStyle.RANGE.getSwingHandler().register(13405, this) && CombatStyle.RANGE.getSwingHandler().register(14803, this) && CombatStyle.RANGE.getSwingHandler().register(14804, this) && CombatStyle.RANGE.getSwingHandler().register(14805, this) && CombatStyle.RANGE.getSwingHandler().register(14806, this)) + ; + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + Player p = (Player) entity; + RangeWeapon rw = RangeWeapon.get(p.getEquipment().getNew(3).getId()); + if (rw == null) { + return -1; + } + Weapon w = new Weapon(p.getEquipment().get(3), rw.getAmmunitionSlot(), p.getEquipment().getNew(rw.getAmmunitionSlot())); + w.setType(rw.getWeaponType()); + state.setRangeWeapon(rw); + state.setAmmunition(Ammunition.get(w.getAmmunition().getId())); + state.setWeapon(w); + if (!Companion.hasAmmo(entity, state)) { + entity.getProperties().getCombatPulse().stop(); + p.getSettings().toggleSpecialBar(); + return -1; + } + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + state.setFrozen(ItemDefinition.forId(state.getAmmunition().getItemId()).getName().contains("ragon arrow")); + double mod = state.isFrozen() ? 1.5 : 1.3; + int minDamage = state.isFrozen() ? 8 : 5; + int max = calculateHit(entity, victim, mod); + state.setMaximumHit(max); + int hit = minDamage; + if (isAccurateImpact(entity, victim, CombatStyle.RANGE, 1.15, 1.0)) { + hit += RandomFunction.random(max - minDamage); + } + state.setEstimatedHit(hit); + if (w.getType() == WeaponType.DOUBLE_SHOT) { + hit = minDamage; + if (isAccurateImpact(entity, victim, CombatStyle.RANGE, 1.15, 1.0)) { + hit += RandomFunction.random(max - minDamage); + } + state.setSecondaryHit(hit); + } + Companion.useAmmo(entity, state, victim.getLocation()); + return 1 + (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3); + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + Graphics start = null; + if (state.getAmmunition() != null) { + start = state.getAmmunition().getStartGraphics(); + if (state.isFrozen()) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(new Audio(3736), true); + entity.asPlayer().getAudioManager().send(new Audio(3737), true); + } + DRAGON_PROJECTILE.copy(entity, victim, 5).send(); + } else { + state.getAmmunition().getProjectile().copy(entity, victim, 5).send(); + DARKNESS_PROJECTILE.copy(entity, victim, 5).send(); + } + if (state.getWeapon().getType() == WeaponType.DOUBLE_SHOT && state.getAmmunition().getDarkBowGraphics() != null) { + start = state.getAmmunition().getDarkBowGraphics(); + if (state.isFrozen()) { + DRAGON_PROJECTILE_1.copy(entity, victim, 10).send(); + } else { + int speed = (int) (55 + (entity.getLocation().getDistance(victim.getLocation()) * 10)); + Projectile.create(entity, victim, state.getAmmunition().getProjectile().getProjectileId(), 40, 36, 41, speed, 25).send(); + DARKNESS_PROJECTILE_1.copy(entity, victim, 10).send(); + } + } + } + entity.visualize(entity.getProperties().getAttackAnimation(), start); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + victim.visualize(victim.getProperties().getDefenceAnimation(), state.isFrozen() ? DRAGON_IMPACT : DARKNESS_IMPACT); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/EnergyDrainSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/EnergyDrainSpecialHandler.java new file mode 100644 index 000000000..228e347ed --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/EnergyDrainSpecialHandler.java @@ -0,0 +1,73 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the Abyssal whip's Energy drain special attack. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class EnergyDrainSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 50; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1658, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(341, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(4151, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.2, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1)); + } + if (victim instanceof Player) { + ((Player) victim).getSettings().updateRunEnergy(10); + ((Player) entity).getSettings().updateRunEnergy(-10); + } + state.setEstimatedHit(hit); + entity.asPlayer().getAudioManager().send(new Audio(2713), true); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.animate(ANIMATION); + victim.graphics(GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/ExcaliburSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/ExcaliburSpecialHandler.java new file mode 100644 index 000000000..d630cf763 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/ExcaliburSpecialHandler.java @@ -0,0 +1,77 @@ +package core.game.node.entity.combat.special; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the excalibur special attack. + * + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class ExcaliburSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 100; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1057, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(247); + + @Override + public Object fireEvent(String identifier, Object... args) { + switch (identifier) { + case "instant_spec": + case "ncspec": + return true; + } + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(35, this); + CombatStyle.MELEE.getSwingHandler().register(14632, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + Player p = (Player) entity; + if (!p.getSettings().drainSpecial(SPECIAL_ENERGY)) + return -1; + p.sendChat("For Camelot!"); + p.visualize(ANIMATION, GRAPHIC); + switch(p.getEquipment().get(EquipmentContainer.SLOT_WEAPON).getId()) { + case 35: // Regular ol' excalibur + p.getSkills().updateLevel(Skills.DEFENCE, 8, p.getSkills().getStaticLevel(Skills.DEFENCE) + 8); + break; + case 14632: // enhanced excalibur + p.getSkills().updateLevel(Skills.DEFENCE, + (int)(p.getSkills().getStaticLevel(Skills.DEFENCE)*0.15), + (int)(p.getSkills().getStaticLevel(Skills.DEFENCE)*1.15)); + } + + return -1; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/FeintSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/FeintSpecialHandler.java new file mode 100644 index 000000000..ea19e250c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/FeintSpecialHandler.java @@ -0,0 +1,62 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles Vesta's Longsword special attack, feint. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class FeintSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 25; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(10502, Priority.HIGH); + + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (CombatStyle.MELEE.getSwingHandler().register(13899, this) && CombatStyle.MELEE.getSwingHandler().register(13901, this)) + ; + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.0, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, RandomFunction.random(1.0, 2.50))); + } + state.setEstimatedHit(hit); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.animate(ANIMATION); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/HealingBladeSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/HealingBladeSpecialHandler.java new file mode 100644 index 000000000..dead91c19 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/HealingBladeSpecialHandler.java @@ -0,0 +1,80 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the healing blade special attack. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class HealingBladeSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 50; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(7071, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1220); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(11698, this); + CombatStyle.MELEE.getSwingHandler().register(13452, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.12, 0.98)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.005)); + } + state.setEstimatedHit(hit); + int healthRestore = hit / 2; + double prayerRestore = hit * 0.25; + if (healthRestore < 10) { + healthRestore = 10; + } + if (prayerRestore < 5) { + prayerRestore = 5; + } + entity.getSkills().heal(healthRestore); + entity.getSkills().incrementPrayerPoints(prayerRestore); + entity.asPlayer().getAudioManager().send(new Audio(3857), true); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/IceCleaveSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/IceCleaveSpecialHandler.java new file mode 100644 index 000000000..3b596897d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/IceCleaveSpecialHandler.java @@ -0,0 +1,78 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Ice cleave special attack. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class IceCleaveSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 60; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(7070, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1221); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(11700, this); + CombatStyle.MELEE.getSwingHandler().register(13453, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.075, 0.98)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.005)); + } + state.setEstimatedHit(hit); + entity.asPlayer().getAudioManager().send(3846); + return 1; + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + super.adjustBattleState(entity, victim, state); + if (state.getEstimatedHit() > 0) { + victim.getStateManager().set(EntityState.FROZEN, 33); + victim.graphics(Graphics.create(369)); + } + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/ImpaleSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/ImpaleSpecialHandler.java new file mode 100644 index 000000000..2c1dc39f1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/ImpaleSpecialHandler.java @@ -0,0 +1,72 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Rune claws special attack "Impale". + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class ImpaleSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 25; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(923, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(274, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(3101, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + Player player = (Player) entity; + if (!player.getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.1, 0.98)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.1)); + } + state.setEstimatedHit(hit); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + if (((Player) entity).getDetails().getRights() == Rights.ADMINISTRATOR) { + entity.animate(Animation.create(2068)); + return; + } + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/JudgementSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/JudgementSpecialHandler.java new file mode 100644 index 000000000..4e49f6b9e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/JudgementSpecialHandler.java @@ -0,0 +1,69 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the Judgement special attack. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class JudgementSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 50; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(7074, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1222); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (CombatStyle.MELEE.getSwingHandler().register(11694, this) && CombatStyle.MELEE.getSwingHandler().register(13450, this)) + ; + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.25, 0.98)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.25)); + } + state.setEstimatedHit(hit); + entity.asPlayer().getAudioManager().send(new Audio(3865), true); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/LiquefySpecialHandler.kt b/Server/src/main/java/Server/core/game/node/entity/combat/special/LiquefySpecialHandler.kt new file mode 100644 index 000000000..b72a5a8e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/LiquefySpecialHandler.kt @@ -0,0 +1,27 @@ +package core.game.node.entity.combat.special + +import core.game.node.entity.Entity +import core.game.node.entity.combat.BattleState +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.combat.handlers.MeleeSwingHandler +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class LiquefySpecialHandler : MeleeSwingHandler(), Plugin { + override fun newInstance(arg: Any?): Plugin { + CombatStyle.MELEE.swingHandler.register(11037,this) + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + override fun swing(entity: Entity?, victim: Entity?, state: BattleState?): Int { + entity?.asPlayer()?.sendMessage("You need to be underwater to use this special attack.") + entity?.asPlayer()?.settings?.isSpecialToggled = false + return super.swing(entity, victim, state) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/PowershotSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/PowershotSpecialHandler.java new file mode 100644 index 000000000..0c0edc511 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/PowershotSpecialHandler.java @@ -0,0 +1,71 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.RangeSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the Magic longbow special attack "Powershot". + * @author Emperor + */ +@Initializable +public final class PowershotSpecialHandler extends RangeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 35; + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(250, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.RANGE.getSwingHandler().register(859, this); + CombatStyle.RANGE.getSwingHandler().register(10284, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + Player p = (Player) entity; + configureRangeData(p, state); + if (state.getWeapon() == null || !Companion.hasAmmo(entity, state)) { + entity.getProperties().getCombatPulse().stop(); + p.getSettings().toggleSpecialBar(); + return -1; + } + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.RANGE, 1.98, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.0)); + } + entity.asPlayer().getAudioManager().send(2536); + state.setEstimatedHit(hit); + Companion.useAmmo(entity, state, victim.getLocation()); + return 1 + (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3); + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(state.getRangeWeapon().getAnimation(), GRAPHIC); + int speed = (int) (46 + (entity.getLocation().getDistance(victim.getLocation()) * 5)); + Projectile.create(entity, victim, 249, 40, 36, 45, speed, 5, 11).send(); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/PowerstabSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/PowerstabSpecialHandler.java new file mode 100644 index 000000000..dbdb678ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/PowerstabSpecialHandler.java @@ -0,0 +1,111 @@ +package core.game.node.entity.combat.special; + +import java.util.List; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Powerstab special attack. + * @author Emperor + */ +@Initializable +public final class PowerstabSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 60; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(3157, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1225); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (state.getTargets() != null) { + for (BattleState s : state.getTargets()) { + if (s != null) { + s.getVictim().getImpactHandler().handleImpact(entity, s.getEstimatedHit(), CombatStyle.MELEE, s); + } + } + return; + } + victim.getImpactHandler().handleImpact(entity, state.getEstimatedHit(), CombatStyle.MELEE, state); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(7158, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + boolean multi = entity.getProperties().isMultiZone(); + if (!multi) { + return super.swing(entity, victim, state); + } + @SuppressWarnings("rawtypes") + List list = victim instanceof NPC ? RegionManager.getSurroundingNPCs(entity, 9, entity) : RegionManager.getSurroundingPlayers(entity, 9, entity); + BattleState[] targets = new BattleState[list.size()]; + int count = 0; + for (Object o : list) { + Entity e = (Entity) o; + if (CombatStyle.RANGE.getSwingHandler().canSwing(entity, e) != InteractionType.NO_INTERACT) { + BattleState s = targets[count++] = new BattleState(entity, e); + int hit = 0; + if (isAccurateImpact(entity, e)) { + hit = RandomFunction.random(calculateHit(entity, e, 1.0)); + } + s.setEstimatedHit(hit); + } + } + state.setTargets(targets); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (state.getTargets() != null) { + for (BattleState s : state.getTargets()) { + if (s != null) { + s.getVictim().animate(victim.getProperties().getDefenceAnimation()); + } + } + return; + } + victim.animate(victim.getProperties().getDefenceAnimation()); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/PunctureSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/PunctureSpecialHandler.java new file mode 100644 index 000000000..a93469bad --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/PunctureSpecialHandler.java @@ -0,0 +1,84 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the puncture special attack combat swing. + * @author Emperor + */ +@Initializable +public final class PunctureSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 25; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1062, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(252, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + victim.getImpactHandler().handleImpact(entity, state.getEstimatedHit(), CombatStyle.MELEE, state); + victim.getImpactHandler().handleImpact(entity, state.getSecondaryHit(), CombatStyle.MELEE, state, null, true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (CombatStyle.MELEE.getSwingHandler().register(1215, this) && CombatStyle.MELEE.getSwingHandler().register(1231, this) && CombatStyle.MELEE.getSwingHandler().register(5680, this) && CombatStyle.MELEE.getSwingHandler().register(5698, this) && CombatStyle.MELEE.getSwingHandler().register(13465, this) && CombatStyle.MELEE.getSwingHandler().register(13466, this) && CombatStyle.MELEE.getSwingHandler().register(13467, this) && CombatStyle.MELEE.getSwingHandler().register(13468, this)) + ; + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + // First hit + //double accuracyMod, double defenceMod + int hit = 0; + // accuracyMod defenceMod + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.05, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.1306)); + } + state.setEstimatedHit(hit); + // Second hit + // accuracyMod defenceMod + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.05, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.1306)); + } else { + hit = 0; + } + entity.asPlayer().getAudioManager().send(2537); + state.setSecondaryHit(hit); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/QuickSmashSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/QuickSmashSpecialHandler.java new file mode 100644 index 000000000..8aa518b95 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/QuickSmashSpecialHandler.java @@ -0,0 +1,85 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the granite maul special attack. + * @author Emperor + */ +@Initializable +public final class QuickSmashSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 50; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1667, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(340, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + switch (identifier) { + case "instant_spec": + return true; + } + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(4153, this); + CombatStyle.MELEE.getSwingHandler().register(14792, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + Player p = (Player) entity; + if (victim == null) { + victim = p.getProperties().getCombatPulse().getLastVictim(); + if (victim == null || GameWorld.getTicks() - p.getAttribute("combat-stop", -1) > 2 || !MeleeSwingHandler.Companion.canMelee(p, victim, 1)) { + p.getPacketDispatch().sendMessage("Warning: Since the maul's special is an instant attack, it will be wasted when used "); + p.getPacketDispatch().sendMessage("on a first strike."); + return -1; + } + } + if (!p.getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + visualize(entity, victim, null); + int hit = 0; + if (isAccurateImpact(entity, victim)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.)); + } + victim.getImpactHandler().handleImpact(entity, hit, CombatStyle.MELEE); + entity.asPlayer().getAudioManager().send(new Audio(2715), true); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + victim.animate(victim.getProperties().getDefenceAnimation()); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/RampageSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/RampageSpecialHandler.java new file mode 100644 index 000000000..dfb2160d6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/RampageSpecialHandler.java @@ -0,0 +1,78 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Rampage special attack. + * @author Emperor + */ +@Initializable +public final class RampageSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 100; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1056, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(246); + + @Override + public Object fireEvent(String identifier, Object... args) { + switch (identifier) { + case "instant_spec": + case "ncspec": + return true; + } + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(1377, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + Player p = (Player) entity; + if (!p.getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + p.sendChat("Raarrrrrgggggghhhhhhh!"); + p.visualize(ANIMATION, GRAPHIC); + @SuppressWarnings("unused") + int boost = 0; + for (int i = 0; i < 6; i++) { + if (i == 2 || i == 3 || i == 5) { + continue; + } + double drain = p.getSkills().getLevel(i) * 0.1; + boost += drain; + p.getSkills().updateLevel(i, (int) -drain, (int) (p.getSkills().getStaticLevel(i) - drain)); + } + boost *= 0.25; + p.getSkills().updateLevel(Skills.STRENGTH, (int) (p.getSkills().getStaticLevel(Skills.STRENGTH) * 0.20)); + p.getAudioManager().send(new Audio(386), true); + return -1; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/SaradominsLightningHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/SaradominsLightningHandler.java new file mode 100644 index 000000000..a5dfff61c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/SaradominsLightningHandler.java @@ -0,0 +1,83 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Saradomin sword special attack. + * @author Emperor + */ +@Initializable +public final class SaradominsLightningHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 100; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(7072, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1224); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(11730, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + int secondary = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.10, 0.98)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.1)); + secondary = 5 + RandomFunction.RANDOM.nextInt(14); + } + state.setEstimatedHit(hit); + state.setSecondaryHit(secondary); + entity.asPlayer().getAudioManager().send(new Audio(3853), true); + return 1; + } + + @Override + public void impact(Entity entity, Entity victim, BattleState s) { + int hit = s.getEstimatedHit(); + if (hit > -1) { + victim.getImpactHandler().handleImpact(entity, hit, CombatStyle.MELEE, s); + } + hit = s.getSecondaryHit(); + if (hit > -1) { + victim.graphics(Graphics.create(1194)); + victim.getImpactHandler().handleImpact(entity, hit, CombatStyle.MAGIC, s); + } + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/SeverSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/SeverSpecialHandler.java new file mode 100644 index 000000000..734c90f15 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/SeverSpecialHandler.java @@ -0,0 +1,82 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Sever special attack. + * @author Emperor + */ +@Initializable +public final class SeverSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 55; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1872, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(347, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (CombatStyle.MELEE.getSwingHandler().register(4587, this) && CombatStyle.MELEE.getSwingHandler().register(13477, this)) + ; + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) + return -1; + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.124, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.0)); + if (victim instanceof Player) { + Player p = (Player) victim; + if (p.getPrayer().get(PrayerType.PROTECT_FROM_MAGIC)) { + p.getPrayer().toggle(PrayerType.PROTECT_FROM_MAGIC); + } + if (p.getPrayer().get(PrayerType.PROTECT_FROM_MELEE)) { + p.getPrayer().toggle(PrayerType.PROTECT_FROM_MELEE); + } + if (p.getPrayer().get(PrayerType.PROTECT_FROM_MISSILES)) { + p.getPrayer().toggle(PrayerType.PROTECT_FROM_MISSILES); + } + if (p.getPrayer().get(PrayerType.PROTECT_FROM_SUMMONING)) { + p.getPrayer().toggle(PrayerType.PROTECT_FROM_SUMMONING); + } + } + } + entity.asPlayer().getAudioManager().send(2540); + state.setEstimatedHit(hit); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/ShatterSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/ShatterSpecialHandler.java new file mode 100644 index 000000000..870e56c93 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/ShatterSpecialHandler.java @@ -0,0 +1,68 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the Shatter special attack. + * @author Emperor + */ +@Initializable +public final class ShatterSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 25; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1060, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(251, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(1434, this); + CombatStyle.MELEE.getSwingHandler().register(13479, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 0.87, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.3546)); + } + entity.asPlayer().getAudioManager().send(new Audio(2541), true); + state.setEstimatedHit(hit); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/ShoveSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/ShoveSpecialHandler.java new file mode 100644 index 000000000..3b5f92e5c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/ShoveSpecialHandler.java @@ -0,0 +1,124 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.Point; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the dragon spear special attack. + * @author Emperor + */ +@Initializable +public final class ShoveSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 25; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1064, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(253, 96); + + /** + * The stun animation. + */ + private static Animation STUN_ANIM = new Animation(424); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(1249, this); + CombatStyle.MELEE.getSwingHandler().register(1263, this); + CombatStyle.MELEE.getSwingHandler().register(3176, this); + CombatStyle.MELEE.getSwingHandler().register(5716, this); + CombatStyle.MELEE.getSwingHandler().register(5730, this); + CombatStyle.MELEE.getSwingHandler().register(11716, this); + CombatStyle.MELEE.getSwingHandler().register(14662, this); + return this; + } + + @Override + public int swing(Entity entity, final Entity victim, BattleState state) { + if (victim.size() > 1) { + ((Player) entity).getPacketDispatch().sendMessage("That creature is too large to knock back!"); + ((Player) entity).getSettings().toggleSpecialBar(); + return -1; + } + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + state.setEstimatedHit(-1); + Direction dir = null; + int vx = victim.getLocation().getX(); + int vy = victim.getLocation().getY(); + int sx = entity.getLocation().getX(); + int sy = entity.getLocation().getY(); + if (vx == sx && vy > sy) { + dir = Direction.NORTH; + } else if (vx == sx && vy < sy) { + dir = Direction.SOUTH; + } else if (vx > sx && vy == sy) { + dir = Direction.EAST; + } else if (vx < sx && vy == sy) { + dir = Direction.WEST; + } else if (vx > sx && vy > sy) { + dir = Direction.NORTH_EAST; + } else if (vx < sx && vy > sy) { + dir = Direction.NORTH_WEST; + } else if (vx > sx && vy < sy) { + dir = Direction.SOUTH_EAST; + } else if (vx < sx && vy < sy) { + dir = Direction.SOUTH_WEST; + } + victim.getWalkingQueue().reset(); + victim.getPulseManager().clear(); + victim.animate(STUN_ANIM); + victim.getStateManager().set(EntityState.STUNNED, 5); + if (dir != null) { + Point p = Direction.getWalkPoint(dir); + Location dest = victim.getLocation().transform(p.getX(), p.getY(), 0); + if (Pathfinder.find(victim, dest, false, Pathfinder.DUMB).isSuccessful()) { + victim.getWalkingQueue().addPath(dest.getX(), dest.getY()); + } + } + entity.asPlayer().getAudioManager().send(2533); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/SliceAndDiceSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/SliceAndDiceSpecialHandler.java new file mode 100644 index 000000000..ac402c0ac --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/SliceAndDiceSpecialHandler.java @@ -0,0 +1,107 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the Dragon claws special attack "Slice and Dice". + * @author Emperor + * + */ +@Initializable +public final class SliceAndDiceSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 50; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(10961, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1950); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(14484, this); + CombatStyle.MELEE.getSwingHandler().register(14486, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int maximum = calculateHit(entity, victim, 1.0); + int[] hits = new int[] {0, 1}; + int hit = getHit(entity, victim, maximum); + if (hit > 0) { + hits = new int[] {hit, hit / 2, (hit / 2) / 2, (hit / 2) - ((hit / 2) / 2)}; + } else { + hit = getHit(entity, victim, maximum); + if (hit > 0) { + hits = new int[] {0, hit, hit / 2, hit - (hit / 2)}; + } else { + hit = getHit(entity, victim, maximum); + if (hit > 0) { + hits = new int[] {0, 0, hit / 2, (hit / 2) + 10}; + } else { + hit = getHit(entity, victim, (int) (maximum * 1.5)); + if (hit > 0) { + maximum *= 1.5; + hits = new int[] {0, 0, 0, hit}; + } else { + hits = new int[] {0, RandomFunction.random(2)}; + } + } + } + } + BattleState[] states = new BattleState[hits.length]; + for (int i = 0; i < hits.length; i++) { + BattleState s = states[i] = new BattleState(entity, victim); + s.setStyle(CombatStyle.MELEE); + s.setEstimatedHit(hits[i]); + } + state.setTargets(states); + return 1; + } + + /** + * Gets the current hit. + * @param entity The attacking entity. + * @param victim The victim. + * @param maximum The maximum hit. + * @return The hit. + */ + private int getHit(Entity entity, Entity victim, int maximum) { + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.25, 0.98)) { + return RandomFunction.random(maximum); + } + return 0; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/SmashSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/SmashSpecialHandler.java new file mode 100644 index 000000000..dac0313a8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/SmashSpecialHandler.java @@ -0,0 +1,70 @@ +package core.game.node.entity.combat.special; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles Statius' Warhammer special attack - Smash. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class SmashSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 35; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(10501, Priority.HIGH); + + /** + * The gfx + */ + private static final Graphics GRAPHIC = new Graphics(1840, 0, 16); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + if (CombatStyle.MELEE.getSwingHandler().register(13902, this) && CombatStyle.MELEE.getSwingHandler().register(13904, this)) + ; + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.0, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, RandomFunction.random(1.0, 1.5))); + int lower = (int) (victim.getSkills().getLevel(Skills.DEFENCE) * 0.30); + victim.getSkills().updateLevel(Skills.DEFENCE, -lower, 0); + } + state.setEstimatedHit(hit); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/SnapshotSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/SnapshotSpecialHandler.java new file mode 100644 index 000000000..6ef4d6cb8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/SnapshotSpecialHandler.java @@ -0,0 +1,108 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.RangeSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the magic shortbow special attack "Snapshot". + * @author Emperor + */ +@Initializable +public final class SnapshotSpecialHandler extends RangeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 55; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1074, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(249, 96); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.RANGE.getSwingHandler().register(861, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + Player p = (Player) entity; + configureRangeData(p, state); + if (state.getWeapon() == null || !Companion.hasAmmo(entity, state)) { + entity.getProperties().getCombatPulse().stop(); + p.getSettings().toggleSpecialBar(); + return -1; + } + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int max = calculateHit(entity, victim, 1.0); + state.setMaximumHit(max); + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 0.9, 1.0)) { + hit = RandomFunction.random(max); + } + state.setEstimatedHit(hit); + hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 0.9, 1.0)) { + hit = RandomFunction.random(max); + } + entity.asPlayer().getAudioManager().send(2545); + state.setSecondaryHit(hit); + Companion.useAmmo(entity, state, victim.getLocation()); + return 1 + (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3); + } + + @Override + public void impact(final Entity entity, final Entity victim, final BattleState state) { + int hit = state.getEstimatedHit(); + victim.getImpactHandler().handleImpact(entity, hit, CombatStyle.RANGE, state); + if (state.getSecondaryHit() > -1) { + final int hitt = state.getSecondaryHit(); + if (victim.getLocation().withinDistance(entity.getLocation(), 2)) { + victim.getImpactHandler().handleImpact(entity, hitt, CombatStyle.RANGE, state); + return; + } + GameWorld.getPulser().submit(new Pulse(1, victim) { + @Override + public boolean pulse() { + victim.getImpactHandler().handleImpact(entity, hitt, CombatStyle.RANGE, state); + return true; + } + }); + } + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + int speed = (int) (27 + (entity.getLocation().getDistance(victim.getLocation()) * 5)); + Projectile.create(entity, victim, 249, 40, 36, 20, speed, 15, 11).send(); + speed = (int) (32 + (entity.getLocation().getDistance(victim.getLocation()) * 10)); + Projectile.create(entity, victim, 249, 40, 36, 50, speed, 15, 11).send(); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/SnipeSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/SnipeSpecialHandler.java new file mode 100644 index 000000000..f8eea1133 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/SnipeSpecialHandler.java @@ -0,0 +1,73 @@ +package core.game.node.entity.combat.special; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.RangeSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the Dorgeshuun crossbow's special attack - snipe. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class SnipeSpecialHandler extends RangeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 75; + + /** + * The attack animation. TODO: This is techically the wrong animation. The + * real one is incredibly similiar but I can't find it anywhere. + */ + private static final Animation ANIMATION = new Animation(4230, Priority.HIGH); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.RANGE.getSwingHandler().register(8880, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + Player p = (Player) entity; + configureRangeData(p, state); + if (state.getWeapon() == null || !Companion.hasAmmo(entity, state)) { + entity.getProperties().getCombatPulse().stop(); + p.getSettings().toggleSpecialBar(); + return -1; + } + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.RANGE, 1.05, 1.0)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.0)); + victim.getSkills().updateLevel(Skills.DEFENCE, -hit, 0); + } + Companion.useAmmo(entity, state, victim.getLocation()); + state.setEstimatedHit(hit); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.animate(ANIMATION); + Projectile.create(entity, victim, 698, 36, 25, 35, 72).send(); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/SpearWallSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/SpearWallSpecialHandler.java new file mode 100644 index 000000000..77a5c1183 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/SpearWallSpecialHandler.java @@ -0,0 +1,110 @@ +package core.game.node.entity.combat.special; + +import java.util.List; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles Vesta's Spear special attack - Spear Wall. + * @author Splinter + */ +@Initializable +public final class SpearWallSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 50; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(10499, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1835); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (state.getTargets() != null) { + for (BattleState s : state.getTargets()) { + if (s != null) { + s.getVictim().getImpactHandler().handleImpact(entity, s.getEstimatedHit(), CombatStyle.MELEE, s); + } + } + return; + } + victim.getImpactHandler().handleImpact(entity, state.getEstimatedHit(), CombatStyle.MELEE, state); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(13905, this); + CombatStyle.MELEE.getSwingHandler().register(13907, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + boolean multi = entity.getProperties().isMultiZone(); + if (!multi) { + return super.swing(entity, victim, state); + } + @SuppressWarnings("rawtypes") + List list = victim instanceof NPC ? RegionManager.getSurroundingNPCs(entity, 9, entity) : RegionManager.getSurroundingPlayers(entity, 9, entity); + BattleState[] targets = new BattleState[list.size()]; + int count = 0; + for (Object o : list) { + Entity e = (Entity) o; + if (CombatStyle.RANGE.getSwingHandler().canSwing(entity, e) != InteractionType.NO_INTERACT) { + BattleState s = targets[count++] = new BattleState(entity, e); + int hit = 0; + hit = RandomFunction.random(calculateHit(entity, e, 1.0)); + s.setEstimatedHit(hit); + } + } + state.setTargets(targets); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (state.getTargets() != null) { + for (BattleState s : state.getTargets()) { + if (s != null) { + s.getVictim().animate(victim.getProperties().getDefenceAnimation()); + } + } + return; + } + victim.animate(victim.getProperties().getDefenceAnimation()); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/SweepSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/SweepSpecialHandler.java new file mode 100644 index 000000000..b70f3b02a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/SweepSpecialHandler.java @@ -0,0 +1,161 @@ +package core.game.node.entity.combat.special; + +import java.util.ArrayList; +import java.util.List; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the Dragon halberd special attack. + * @author Emperor + */ +@Initializable +public final class SweepSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 30; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(1203, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(282, 96); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(3204, this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + BattleState[] targets = getTargets(entity, victim, state); + state.setTargets(targets); + for (BattleState s : targets) { + int hit = 0; + if (isAccurateImpact(entity, s.getVictim(), CombatStyle.MELEE, 1, 0.94)) { + hit = RandomFunction.random(calculateHit(entity, s.getVictim(), 1.1)); + } + s.setEstimatedHit(hit); + if (s.getVictim().size() > 1) { + hit = 0; + if (isAccurateImpact(entity, s.getVictim(), CombatStyle.MELEE, 1, 0.94)) { + hit = RandomFunction.random(calculateHit(entity, s.getVictim(), 1.1)); + } + s.setSecondaryHit(hit); + } + } + return 1; + } + + /** + * Gets the targets. + * @param entity The entity. + * @param victim The victim. + * @param state The battle state. + * @return The targets array. + */ + private BattleState[] getTargets(Entity entity, Entity victim, BattleState state) { + if (!entity.getProperties().isMultiZone() || !victim.getProperties().isMultiZone()) { + return new BattleState[] { state }; + } + Location vl = victim.getLocation(); + int x = vl.getX(); + int y = vl.getY(); + Direction dir = Direction.getDirection(x - entity.getLocation().getX(), y - entity.getLocation().getY()); + List l = new ArrayList<>(); + l.add(new BattleState(entity, victim)); + for (Entity n : victim instanceof NPC ? RegionManager.getSurroundingNPCs(victim, 9, entity, victim) : RegionManager.getSurroundingPlayers(victim, 9, entity, victim)) { + if (n instanceof Familiar) { + continue; + } + if (n.getLocation().equals(vl.transform(dir.getStepY(), dir.getStepX(), 0)) || n.getLocation().equals(vl.transform(-dir.getStepY(), -dir.getStepX(), 0))) { + l.add(new BattleState(entity, n)); + if (l.size() >= 3) { + break; + } + } + } + return l.toArray(new BattleState[l.size()]); + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + if (state.getTargets() != null) { + for (BattleState s : state.getTargets()) { + if (s != null) { + super.adjustBattleState(entity, s.getVictim(), s); + } + } + return; + } + super.adjustBattleState(entity, victim, state); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (state.getTargets() != null) { + for (BattleState s : state.getTargets()) { + if (s != null) { + s.getVictim().getImpactHandler().handleImpact(entity, s.getEstimatedHit(), CombatStyle.MELEE, s); + if (s.getSecondaryHit() > -1) { + s.getVictim().getImpactHandler().handleImpact(entity, s.getSecondaryHit(), CombatStyle.MELEE, s); + } + } + } + return; + } + victim.getImpactHandler().handleImpact(entity, state.getEstimatedHit(), CombatStyle.MELEE, state); + if (state.getSecondaryHit() > -1) { + victim.getImpactHandler().handleImpact(entity, state.getSecondaryHit(), CombatStyle.MELEE, state); + } + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (state.getTargets() != null) { + for (BattleState s : state.getTargets()) { + if (s != null) { + s.getVictim().animate(victim.getProperties().getDefenceAnimation()); + } + } + return; + } + victim.animate(victim.getProperties().getDefenceAnimation()); + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/special/WarstrikeSpecialHandler.java b/Server/src/main/java/Server/core/game/node/entity/combat/special/WarstrikeSpecialHandler.java new file mode 100644 index 000000000..88bc9bc66 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/special/WarstrikeSpecialHandler.java @@ -0,0 +1,88 @@ +package core.game.node.entity.combat.special; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Warstrike special attack. + * @author Emperor + */ +@Initializable +public final class WarstrikeSpecialHandler extends MeleeSwingHandler implements Plugin { + + /** + * The special energy required. + */ + private static final int SPECIAL_ENERGY = 100; + + /** + * The attack animation. + */ + private static final Animation ANIMATION = new Animation(7073, Priority.HIGH); + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1223); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + CombatStyle.MELEE.getSwingHandler().register(11696, this); + CombatStyle.MELEE.getSwingHandler().register(13451, this); + return this; + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) { + return -1; + } + int hit = 0; + if (isAccurateImpact(entity, victim, CombatStyle.MELEE, 1.049, 0.98)) { + hit = RandomFunction.random(calculateHit(entity, victim, 1.1)); + } + state.setEstimatedHit(hit); + if (victim instanceof Player) { + ((Player) victim).getPacketDispatch().sendMessage("You have been drained."); + } + int left = -victim.getSkills().updateLevel(Skills.DEFENCE, -hit, 0); + if (left > 0) { + left = -victim.getSkills().updateLevel(Skills.STRENGTH, -left, 0); + if (left > 0) { + left = -victim.getSkills().updateLevel(Skills.ATTACK, -left, 0); + if (left > 0) { + left = (int) -(victim.getSkills().getPrayerPoints() + left); + victim.getSkills().decrementPrayerPoints(left); + if (left > 0) { + left = -victim.getSkills().updateLevel(Skills.MAGIC, -left, 0); + if (left > 0) + victim.getSkills().updateLevel(Skills.RANGE, -left, 0); + } + } + } + } + entity.asPlayer().getAudioManager().send(new Audio(3834), true); + return 1; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + entity.visualize(ANIMATION, GRAPHIC); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/AirSpell.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/AirSpell.java new file mode 100644 index 000000000..b9fe9afe5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/AirSpell.java @@ -0,0 +1,126 @@ +package core.game.node.entity.combat.spell; + +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Represents the combat spell plugin used to handle air spells. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class AirSpell extends CombatSpell { + + /** + * The start graphic for Air strike. + */ + private static final Graphics STRIKE_START = new Graphics(90, 96); + + /** + * The projectile for Air strike. + */ + private static final Projectile STRIKE_PROJECTILE = Projectile.create((Entity) null, null, 91, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Air strike. + */ + private static final Graphics STRIKE_END = new Graphics(92, 96); + + /** + * The start graphic for Air bolt. + */ + private static final Graphics BOLT_START = new Graphics(117, 96); + + /** + * The projectile for Air bolt. + */ + private static final Projectile BOLT_PROJECTILE = Projectile.create((Entity) null, null, 118, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Air bolt. + */ + private static final Graphics BOLT_END = new Graphics(119, 96); + + /** + * The start graphic for Air blast. + */ + private static final Graphics BLAST_START = new Graphics(132, 96); // 129 + + /** + * The projectile for Air blast. + */ + private static final Projectile BLAST_PROJECTILE = Projectile.create((Entity) null, null, 133, 40, 36, 52, 75, 15, 11); // 130 + + /** + * The end graphic for Air blast. + */ + private static final Graphics BLAST_END = new Graphics(134, 96); // 131 + + /** + * The start graphic for Air wave. + */ + private static final Graphics WAVE_START = new Graphics(158, 96); + + /** + * The projectile for Air wave. + */ + private static final Projectile WAVE_PROJECTILE = Projectile.create((Entity) null, null, 159, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Air wave. + */ + private static final Graphics WAVE_END = new Graphics(160, 96); + + /** + * The cast animation. + */ + private static final Animation ANIMATION = new Animation(711, Priority.HIGH); + + /** + * Constructs a new {@code AirSpell} {@Code Object} + */ + public AirSpell() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code AirSpell} {@Code Object} + * @param type The spell type. + * @param level The level requirement. + * @param sound The cast sound. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + * @param runes The rune requirements. + */ + private AirSpell(SpellType type, int level, double baseExperience, int sound, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.MODERN, level, baseExperience, sound, sound + 1, ANIMATION, start, projectile, end, runes); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 1); + } + + @Override + public Plugin newInstance(SpellType type) throws Throwable { + SpellBook.MODERN.register(1, new AirSpell(SpellType.STRIKE, 1, 5.5, 220, STRIKE_START, STRIKE_PROJECTILE, STRIKE_END, Runes.MIND_RUNE.getItem(1), Runes.AIR_RUNE.getItem(1))); + SpellBook.MODERN.register(10, new AirSpell(SpellType.BOLT, 17, 13.5, 218, BOLT_START, BOLT_PROJECTILE, BOLT_END, Runes.CHAOS_RUNE.getItem(1), Runes.AIR_RUNE.getItem(2))); + SpellBook.MODERN.register(24, new AirSpell(SpellType.BLAST, 41, 25.5, 216, BLAST_START, BLAST_PROJECTILE, BLAST_END, Runes.DEATH_RUNE.getItem(1), Runes.AIR_RUNE.getItem(3))); + SpellBook.MODERN.register(45, new AirSpell(SpellType.WAVE, 62, 36.0, 222, WAVE_START, WAVE_PROJECTILE, WAVE_END, Runes.BLOOD_RUNE.getItem(1), Runes.AIR_RUNE.getItem(5))); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/BindSpell.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/BindSpell.java new file mode 100644 index 000000000..14bec353e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/BindSpell.java @@ -0,0 +1,145 @@ +package core.game.node.entity.combat.spell; + +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Represents the binding combat spell. + * @author 'Vexia + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class BindSpell extends CombatSpell { + + /** + * The start graphic for Earth strike. + */ + private static final Graphics BIND_START = new Graphics(177, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile BIND_PROJECTILE = Projectile.create((Entity) null, null, 178, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics BIND_END = new Graphics(181, 96); + + /** + * The start graphic for Earth strike. + */ + private static final Graphics SNARE_START = new Graphics(177, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile SNARE_PROJECTILE = Projectile.create((Entity) null, null, 178, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics SNARE_END = new Graphics(180, 96); + + /** + * The start graphic for Earth strike. + */ + private static final Graphics ENTANGLE_START = new Graphics(177, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile ENTANGLE_PROJECTILE = Projectile.create((Entity) null, null, 178, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics ENTANGLE_END = new Graphics(179, 96); + + /** + * The cast animation. + */ + private static final Animation ANIMATION = new Animation(710, Priority.HIGH); + + /** + * Constructs a new {@code BindSpell} {@Code Object} + */ + public BindSpell() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BindSpell} {@code Object}. + * @param type the type. + * @param level the level. + * @param sound the sound. + * @param start the start. + * @param projectile the projectile. + * @param end the end. + * @param runes the runes. + */ + private BindSpell(SpellType type, int level, double baseExperience, int sound, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.MODERN, level, baseExperience, sound, -1, ANIMATION, start, projectile, end, runes); + } + + @Override + public void fireEffect(Entity entity, Entity victim, BattleState state) { + if (victim instanceof NPC) { + NPC npc = (NPC) victim; + if (npc.getName().contains("impling")) { + state.setEstimatedHit(-2); + } + } + if (state.getEstimatedHit() == -1) { + return; + } + int tick = 0; + if (getType() == SpellType.BIND) { + state.setEstimatedHit(-2); + } + if (state.getSpell().getSpellId() == 12) { + tick = 8; + } else if (state.getSpell().getSpellId() == 30) { + tick = 16; + } else if (state.getSpell().getSpellId() == 56) { + tick = 25; + } + if (!victim.getLocks().isMovementLocked() && victim instanceof Player) { + ((Player) victim).getPacketDispatch().sendMessage("A magical force stops you from moving!"); + } + victim.getWalkingQueue().reset(); + victim.getLocks().lockMovement(tick); + entity.setAttribute("entangleDelay", GameWorld.getTicks() + tick + 2); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType() == SpellType.ENTANGLE ? 5 : 3; + } + + @Override + public Plugin newInstance(SpellType type) throws Throwable { + SpellBook.MODERN.register(12, new BindSpell(SpellType.BIND, 20, 30.0, 151, BIND_START, BIND_PROJECTILE, BIND_END, Runes.NATURE_RUNE.getItem(2), Runes.EARTH_RUNE.getItem(3), Runes.WATER_RUNE.getItem(3))); + SpellBook.MODERN.register(30, new BindSpell(SpellType.SNARE, 50, 60.0, 152, SNARE_START, SNARE_PROJECTILE, SNARE_END, Runes.NATURE_RUNE.getItem(3), Runes.EARTH_RUNE.getItem(4), Runes.WATER_RUNE.getItem(4))); + SpellBook.MODERN.register(56, new BindSpell(SpellType.ENTANGLE, 79, 89.0, 153, ENTANGLE_START, ENTANGLE_PROJECTILE, ENTANGLE_END, Runes.NATURE_RUNE.getItem(4), Runes.EARTH_RUNE.getItem(5), Runes.WATER_RUNE.getItem(5))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/BloodSpells.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/BloodSpells.java new file mode 100644 index 000000000..d60593f9d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/BloodSpells.java @@ -0,0 +1,132 @@ +package core.game.node.entity.combat.spell; + +import java.util.List; + +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Blood spells from the Ancient spellbook. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class BloodSpells extends CombatSpell { + + /** + * The projectile for Blood rush. + */ + private static final Projectile RUSH_PROJECTILE = Projectile.create((Entity) null, null, 372, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Blood rush. + */ + private static final Graphics RUSH_END = new Graphics(373, 96); + + /** + * The end graphic for Blood burst. + */ + private static final Graphics BURST_END = new Graphics(376, 0); + + /** + * The projectile for Blood blitz. + */ + private static final Projectile BLITZ_PROJECTILE = Projectile.create((Entity) null, null, 374, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Blood blitz. + */ + private static final Graphics BLITZ_END = new Graphics(375, 96); + + /** + * The end graphic for Blood barrage. + */ + private static final Graphics BARRAGE_END = new Graphics(377, 0); + + /** + * Constructs a new {@code BloodSpells} {@code Object}. + */ + public BloodSpells() { + /* + * ( empty. + */ + } + + /** + * Constructs a new {@code BloodSpells} {@Code Object} + * @param type The spell type. + * @param impactSound The impact sound id. + * @param anim The animation. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + */ + private BloodSpells(SpellType type, int level, double baseExperience, int sound, int impactSound, Animation anim, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.ANCIENT, level, baseExperience, sound, impactSound, anim, start, projectile, end, runes); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.ANCIENT.register(4, new BloodSpells(SpellType.RUSH, 56, 33.0, -1, -1, new Animation(1978, Priority.HIGH), null, RUSH_PROJECTILE, RUSH_END, Runes.BLOOD_RUNE.getItem(1), Runes.DEATH_RUNE.getItem(2), Runes.CHAOS_RUNE.getItem(2))); + SpellBook.ANCIENT.register(6, new BloodSpells(SpellType.BURST, 68, 39.0, -1, -1, new Animation(1979, Priority.HIGH), null, null, BURST_END, Runes.BLOOD_RUNE.getItem(2), Runes.DEATH_RUNE.getItem(2), Runes.CHAOS_RUNE.getItem(4))); + SpellBook.ANCIENT.register(5, new BloodSpells(SpellType.BLITZ, 80, 45.0, -1, -1, new Animation(1978, Priority.HIGH), null, BLITZ_PROJECTILE, BLITZ_END, Runes.BLOOD_RUNE.getItem(4), Runes.DEATH_RUNE.getItem(2))); + SpellBook.ANCIENT.register(7, new BloodSpells(SpellType.BARRAGE, 92, 51.0, -1, -1, new Animation(1979, Priority.HIGH), null, null, BARRAGE_END, Runes.SOUL_RUNE.getItem(1), Runes.BLOOD_RUNE.getItem(4), Runes.DEATH_RUNE.getItem(4))); + return this; + } + + @Override + public void visualize(Entity entity, Node target) { + entity.graphics(graphic); + if (projectile != null) { + projectile.transform(entity, (Entity) target, false, 58, 10).send(); + } + entity.animate(animation); + sendAudio(entity, getAudio()); + } + + @Override + public void fireEffect(Entity entity, Entity victim, BattleState state) { + if (state.getEstimatedHit() > -1) { + int heal = state.getEstimatedHit() / 4; + if (heal > 0) { + entity.getSkills().heal(heal); + if (entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage("You drain some of your opponent's health."); + } + } + } + } + + @Override + public BattleState[] getTargets(Entity entity, Entity target) { + if (animation.getId() == 1978 || !entity.getProperties().isMultiZone() || !target.getProperties().isMultiZone()) { + return super.getTargets(entity, target); + } + List list = getMultihitTargets(entity, target, 9); + BattleState[] targets = new BattleState[list.size()]; + int index = 0; + for (Entity e : list) { + targets[index++] = new BattleState(entity, e); + } + return targets; + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 3); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/CrumbleUndead.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/CrumbleUndead.java new file mode 100644 index 000000000..61baf8c34 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/CrumbleUndead.java @@ -0,0 +1,55 @@ +package core.game.node.entity.combat.spell; + +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the crumble undead spell. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class CrumbleUndead extends CombatSpell { + + /** + * Constructs a new {@code CrumbleUndead} {@code Object}. + */ + public CrumbleUndead() { + super(SpellType.CRUMBLE_UNDEAD, SpellBook.MODERN, 39, 24.5, 122, 123, new Animation(724, Priority.HIGH), new Graphics(145, 96), Projectile.create((Entity) null, null, 146, 40, 36, 52, 75, 15, 11), new Graphics(147, 96), Runes.EARTH_RUNE.getItem(2), Runes.AIR_RUNE.getItem(2), Runes.CHAOS_RUNE.getItem(1)); + } + + @Override + public boolean cast(Entity entity, Node target) { + NPC npc = target instanceof NPC ? (NPC) target : null; + if (npc == null || npc.getTask() == null || !npc.getTask().undead) { + ((Player) entity).getPacketDispatch().sendMessage("This spell only affects the undead."); + return false; + } + return super.cast(entity, target); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(22, this); + return this; + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return type.getImpactAmount(entity, victim, 0); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/CurseSpells.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/CurseSpells.java new file mode 100644 index 000000000..6167d4e46 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/CurseSpells.java @@ -0,0 +1,195 @@ +package core.game.node.entity.combat.spell; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the curse spells. + * @author Emperor + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CurseSpells extends CombatSpell { + + /** + * The start graphic for Earth strike. + */ + private static final Graphics CONFUSE_START = new Graphics(102, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile CONFUSE_PROJECTILE = Projectile.create((Entity) null, null, 103, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics CONFUSE_END = new Graphics(104, 96); + + /** + * The start graphic for Earth strike. + */ + private static final Graphics WEAKEN_START = new Graphics(105, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile WEAKEN_PROJECTILE = Projectile.create((Entity) null, null, 106, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics WEAKEN_END = new Graphics(107, 96); + + /** + * The start graphic for Earth strike. + */ + private static final Graphics CURSE_START = new Graphics(108, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile CURSE_PROJECTILE = Projectile.create((Entity) null, null, 109, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics CURSE_END = new Graphics(110, 96); + + /** + * The start graphic for Earth strike. + */ + private static final Graphics VULNER_START = new Graphics(167, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile VULNER_PROJECTILE = Projectile.create((Entity) null, null, 168, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics VULNER_END = new Graphics(169, 96); + + /** + * The start graphic for Earth strike. + */ + private static final Graphics ENFEEBLE_START = new Graphics(170, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile ENFEEBLE_PROJECTILE = Projectile.create((Entity) null, null, 171, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics ENFEEBLE_END = new Graphics(172, 96); + + /** + * The start graphic for Earth strike. + */ + private static final Graphics STUN_START = new Graphics(173, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile STUN_PROJECTILE = Projectile.create((Entity) null, null, 174, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics STUN_END = new Graphics(107, 96); + + /** + * The cast animation. + */ + private static final Animation LOW_ANIMATION = new Animation(716, Priority.HIGH); + + /** + * The cast animation. + */ + private static final Animation HIGH_ANIMATION = new Animation(729, Priority.HIGH); + + /** + * Constructs a new {@code EarthSpell} {@Code Object} + */ + public CurseSpells() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CurseSpells} {@code Object}. + * @param type the type. + * @param level the level. + * @param sound the sound. + * @param start the start. + * @param projectile the projectile. + * @param end the end. + * @param runes the runes. + */ + private CurseSpells(SpellType type, int level, double baseExperience, int sound, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.MODERN, level, baseExperience, sound, -1, type.ordinal() <= SpellType.CURSE.ordinal() ? LOW_ANIMATION : HIGH_ANIMATION, start, projectile, end, runes); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return 1; + } + + @Override + public void fireEffect(Entity entity, Entity victim, BattleState state) { + if (state.getEstimatedHit() == -1) { + return; + } + state.setEstimatedHit(-2); + switch (getType()) { + case CONFUSE: + victim.getSkills().drainLevel(Skills.ATTACK, 0.05, 0.05); + break; + case WEAKEN: + victim.getSkills().drainLevel(Skills.STRENGTH, 0.05, 0.05); + break; + case CURSE: + victim.getSkills().drainLevel(Skills.DEFENCE, 0.05, 0.05); + break; + case VULNERABILITY: + victim.getSkills().drainLevel(Skills.DEFENCE, 0.10, 0.10); + break; + case ENFEEBLE: + victim.getSkills().drainLevel(Skills.STRENGTH, 0.10, 0.10); + break; + case STUN: + victim.getSkills().drainLevel(Skills.ATTACK, 0.10, 0.10); + break; + default: + } + } + + @Override + public Plugin newInstance(SpellType type) throws Throwable { + SpellBook.MODERN.register(2, new CurseSpells(SpellType.CONFUSE, 3, 13.0, 99, CONFUSE_START, CONFUSE_PROJECTILE, CONFUSE_END, Runes.BODY_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(2), Runes.WATER_RUNE.getItem(3))); + SpellBook.MODERN.register(7, new CurseSpells(SpellType.WEAKEN, 11, 21.0, 100, WEAKEN_START, WEAKEN_PROJECTILE, WEAKEN_END, Runes.BODY_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(2), Runes.WATER_RUNE.getItem(3))); + SpellBook.MODERN.register(11, new CurseSpells(SpellType.CURSE, 19, 29.0, 101, CURSE_START, CURSE_PROJECTILE, CURSE_END, Runes.BODY_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(3), Runes.WATER_RUNE.getItem(2))); + SpellBook.MODERN.register(50, new CurseSpells(SpellType.VULNERABILITY, 66, 76.0, 119, VULNER_START, VULNER_PROJECTILE, VULNER_END, Runes.SOUL_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(5), Runes.WATER_RUNE.getItem(5))); + SpellBook.MODERN.register(53, new CurseSpells(SpellType.ENFEEBLE, 73, 83.0, 120, ENFEEBLE_START, ENFEEBLE_PROJECTILE, ENFEEBLE_END, Runes.SOUL_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(8), Runes.WATER_RUNE.getItem(8))); + SpellBook.MODERN.register(57, new CurseSpells(SpellType.STUN, 80, 90.0, 121, STUN_START, STUN_PROJECTILE, STUN_END, Runes.SOUL_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(12), Runes.WATER_RUNE.getItem(12))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/EarthSpell.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/EarthSpell.java new file mode 100644 index 000000000..0a47981a0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/EarthSpell.java @@ -0,0 +1,127 @@ +package core.game.node.entity.combat.spell; + +import core.game.node.entity.skill.magic.Runes; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the earth combat spells. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EarthSpell extends CombatSpell { + + /** + * The start graphic for Earth strike. + */ + private static final Graphics STRIKE_START = new Graphics(96, 96); + + /** + * The projectile for Earth strike. + */ + private static final Projectile STRIKE_PROJECTILE = Projectile.create((Entity) null, null, 97, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth strike. + */ + private static final Graphics STRIKE_END = new Graphics(98, 96); + + /** + * The start graphic for Earth bolt. + */ + private static final Graphics BOLT_START = new Graphics(123, 96); + + /** + * The projectile for Earth bolt. + */ + private static final Projectile BOLT_PROJECTILE = Projectile.create((Entity) null, null, 124, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth bolt. + */ + private static final Graphics BOLT_END = new Graphics(125, 96); + + /** + * The start graphic for Earth blast. + */ + private static final Graphics BLAST_START = new Graphics(138, 96); + + /** + * The projectile for Earth blast. + */ + private static final Projectile BLAST_PROJECTILE = Projectile.create((Entity) null, null, 139, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth blast. + */ + private static final Graphics BLAST_END = new Graphics(140, 96); + + /** + * The start graphic for Earth wave. + */ + private static final Graphics WAVE_START = new Graphics(164, 96); + + /** + * The projectile for Earth wave. + */ + private static final Projectile WAVE_PROJECTILE = Projectile.create((Entity) null, null, 165, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Earth wave. + */ + private static final Graphics WAVE_END = new Graphics(166, 96); + + /** + * The cast animation. + */ + private static final Animation ANIMATION = new Animation(711, Priority.HIGH); + + /** + * Constructs a new {@code EarthSpell} {@Code Object} + */ + public EarthSpell() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EarthSpell} {@Code Object}. + * @param type The spell type. + * @param level The level requirement. + * @param sound The cast sound. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + * @param runes The rune requirements. + */ + private EarthSpell(SpellType type, int level, double baseExperience, int sound, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.MODERN, level, baseExperience, sound, sound + 1, ANIMATION, start, projectile, end, runes); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 3); + } + + @Override + public Plugin newInstance(SpellType type) throws Throwable { + SpellBook.MODERN.register(6, new EarthSpell(SpellType.STRIKE, 9, 9.5, 132, STRIKE_START, STRIKE_PROJECTILE, STRIKE_END, Runes.MIND_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(2), Runes.AIR_RUNE.getItem(1))); + SpellBook.MODERN.register(17, new EarthSpell(SpellType.BOLT, 29, 19.5, 130, BOLT_START, BOLT_PROJECTILE, BOLT_END, Runes.CHAOS_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(3), Runes.AIR_RUNE.getItem(2))); + SpellBook.MODERN.register(33, new EarthSpell(SpellType.BLAST, 53, 31.5, 128, BLAST_START, BLAST_PROJECTILE, BLAST_END, Runes.DEATH_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(4), Runes.AIR_RUNE.getItem(3))); + SpellBook.MODERN.register(52, new EarthSpell(SpellType.WAVE, 70, 40.0, 134, WAVE_START, WAVE_PROJECTILE, WAVE_END, Runes.BLOOD_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(7), Runes.AIR_RUNE.getItem(5))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/FireSpell.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/FireSpell.java new file mode 100644 index 000000000..97b8138e7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/FireSpell.java @@ -0,0 +1,128 @@ +package core.game.node.entity.combat.spell; + +import core.game.node.entity.skill.magic.Runes; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the fire spells. + * @author Emperor + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FireSpell extends CombatSpell { + + /** + * The start graphic for Fire strike. + */ + private static final Graphics STRIKE_START = new Graphics(99, 96); + + /** + * The projectile for Fire strike. + */ + private static final Projectile STRIKE_PROJECTILE = Projectile.create((Entity) null, null, 100, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Fire strike. + */ + private static final Graphics STRIKE_END = new Graphics(101, 96); + + /** + * The start graphic for Fire bolt. + */ + private static final Graphics BOLT_START = new Graphics(126, 96); + + /** + * The projectile for Fire bolt. + */ + private static final Projectile BOLT_PROJECTILE = Projectile.create((Entity) null, null, 127, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Fire bolt. + */ + private static final Graphics BOLT_END = new Graphics(128, 96); + + /** + * The start graphic for Fire blast. + */ + private static final Graphics BLAST_START = new Graphics(129, 96); + + /** + * The projectile for Fire blast. + */ + private static final Projectile BLAST_PROJECTILE = Projectile.create((Entity) null, null, 130, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Fire blast. + */ + private static final Graphics BLAST_END = new Graphics(131, 96); + + /** + * The start graphic for Fire wave. + */ + private static final Graphics WAVE_START = new Graphics(155, 96); + + /** + * The projectile for Fire wave. + */ + private static final Projectile WAVE_PROJECTILE = Projectile.create((Entity) null, null, 156, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Fire wave. + */ + private static final Graphics WAVE_END = new Graphics(157, 96); + + /** + * The cast animation. + */ + private static final Animation ANIMATION = new Animation(711, Priority.HIGH); + + /** + * Constructs a new {@code FireSpell} {@Code Object} + */ + public FireSpell() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code FireSpell} {@code Object}. + * @param type The spell type. + * @param level The level requirement. + * @param sound The cast sound. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + * @param runes The rune requirements. + */ + private FireSpell(SpellType type, int level, double baseExperience, int sound, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.MODERN, level, baseExperience, sound, sound + 1, ANIMATION, start, projectile, end, runes); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 4); + } + + @Override + public Plugin newInstance(SpellType type) throws Throwable { + SpellBook.MODERN.register(8, new FireSpell(SpellType.STRIKE, 13, 11.5, 160, STRIKE_START, STRIKE_PROJECTILE, STRIKE_END, Runes.MIND_RUNE.getItem(1), Runes.FIRE_RUNE.getItem(3), Runes.AIR_RUNE.getItem(2))); + SpellBook.MODERN.register(20, new FireSpell(SpellType.BOLT, 35, 22.5, 157, BOLT_START, BOLT_PROJECTILE, BOLT_END, Runes.CHAOS_RUNE.getItem(1), Runes.FIRE_RUNE.getItem(4), Runes.AIR_RUNE.getItem(3))); + SpellBook.MODERN.register(38, new FireSpell(SpellType.BLAST, 59, 34.5, 155, BLAST_START, BLAST_PROJECTILE, BLAST_END, Runes.DEATH_RUNE.getItem(1), Runes.FIRE_RUNE.getItem(5), Runes.AIR_RUNE.getItem(4))); + SpellBook.MODERN.register(55, new FireSpell(SpellType.WAVE, 75, 42.5, 162, WAVE_START, WAVE_PROJECTILE, WAVE_END, Runes.BLOOD_RUNE.getItem(1), Runes.FIRE_RUNE.getItem(7), Runes.AIR_RUNE.getItem(5))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/GodSpells.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/GodSpells.java new file mode 100644 index 000000000..27f50ffa9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/GodSpells.java @@ -0,0 +1,194 @@ +package core.game.node.entity.combat.spell; + +import core.cache.def.impl.ItemDefinition; +import core.game.container.impl.EquipmentContainer; +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Handles the god spells. + * @author Emperor + * @author 'Vexia + */ +@Initializable +public final class GodSpells extends CombatSpell { + + /** + * The spell names. + */ + private static final String[] NAMES = new String[] { "Saradomin strike", "Guthix claws", "Flames of Zamorak" }; + + /** + * The start graphic for Air strike. + */ + private static final Graphics SARA_START = null; + + /** + * The projectile for Air strike. + */ + private static final Projectile SARA_PROJECTILE = null; + + /** + * The end graphic for Air strike. + */ + private static final Graphics SARA_END = new Graphics(76, 0); + + /** + * The start graphic for Air strike. + */ + private static final Graphics GUTHIX_START = null; + + /** + * The projectile for Air strike. + */ + private static final Projectile GUTHIX_PROJECTILE = null; + + /** + * The end graphic for Air strike. + */ + private static final Graphics GUTHIX_END = new Graphics(77, 0); + + /** + * The start graphic for Air strike. + */ + private static final Graphics ZAM_START = null; + + /** + * The projectile for Air strike. + */ + private static final Projectile ZAM_PROJECTILE = null; + + /** + * The end graphic for Air strike. + */ + private static final Graphics ZAM_END = new Graphics(78, 0); + + /** + * The cast animation. + */ + private static final Animation ANIMATION = new Animation(811, Priority.HIGH); + + /** + * Constructs a new {@code AirSpell} {@Code Object} + */ + public GodSpells() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code GodSpells} {@code Object}. + * @param type the type. + * @param sound the sound. + * @param start the start. + * @param projectile the projectile. + * @param end the end. + * @param runes the runes. + */ + private GodSpells(SpellType type, int sound, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.MODERN, 60, 35.0, -1, -1, ANIMATION, start, projectile, end, runes); + } + + @Override + public boolean meetsRequirements(Entity caster, boolean message, boolean remove) { + if (caster instanceof NPC) { + return true; + } + if (caster instanceof Player) { + int staffId = ((Player) caster).getEquipment().getNew(EquipmentContainer.SLOT_WEAPON).getId(); + int required = -1; + int index = 0; + switch (runes[1].getAmount()) { + case 2: // Saradomin strike + required = 2415; + break; + case 1: // Guthix claws + required = 2416; + index = 1; + break; + case 4: // Flames of Zamorak + required = 2417; + index = 2; + break; + } + Player p = (Player) caster; + if (p.getSavedData().getActivityData().getGodCasts()[index] < 100 && !p.getZoneMonitor().isInZone("mage arena")) { + p.sendMessage("You need to cast " + NAMES[index] + " " + (100 - p.getSavedData().getActivityData().getGodCasts()[index]) + " more times inside the Mage Arena."); + return false; + } + if (staffId == 8841 && index == 1) {// Void Knight Mace + return true; + } + if (staffId != required) { + if (message) { + ((Player) caster).getPacketDispatch().sendMessage("You need to wear a " + ItemDefinition.forId(required).getName() + " to cast this spell."); + } + return false; + } + } + return super.meetsRequirements(caster, message, remove); + } + + @Override + public void visualize(Entity entity, Node target) { + super.visualize(entity, target); + if (entity instanceof NPC) { + NPC n = (NPC) entity; + if (n.getId() > 911 && n.getId() < 915 || (n.getId() > 906 && n.getId() < 912)) { + n.getAnimator().forceAnimation(n.getProperties().getAttackAnimation()); + } + } + } + + @Override + public void visualizeImpact(Entity entity, Entity target, BattleState state) { + if (entity instanceof Player) { + int index = 0; // Saradomin strike + switch (runes[1].getAmount()) { + case 1: // Guthix claws + index = 1; + break; + case 4: // Flames of Zamorak + index = 2; + break; + } + Player p = (Player) entity; + if (p.getSavedData().getActivityData().getGodCasts()[index] < 100) { + p.getSavedData().getActivityData().getGodCasts()[index]++; + if (p.getSavedData().getActivityData().getGodCasts()[index] >= 100) { + p.sendMessage("You can now cast " + NAMES[index] + " outside the Arena."); + } + } + } + super.visualizeImpact(entity, target, state); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 0); + } + + @Override + public Plugin newInstance(SpellType type) throws Throwable { + SpellBook.MODERN.register(41, new GodSpells(SpellType.GOD_STRIKE, -1, SARA_START, SARA_PROJECTILE, SARA_END, Runes.BLOOD_RUNE.getItem(2), Runes.FIRE_RUNE.getItem(2), Runes.AIR_RUNE.getItem(4))); + SpellBook.MODERN.register(42, new GodSpells(SpellType.GOD_STRIKE, -1, GUTHIX_START, GUTHIX_PROJECTILE, GUTHIX_END, Runes.BLOOD_RUNE.getItem(2), Runes.FIRE_RUNE.getItem(1), Runes.AIR_RUNE.getItem(4))); + SpellBook.MODERN.register(43, new GodSpells(SpellType.GOD_STRIKE, -1, ZAM_START, ZAM_PROJECTILE, ZAM_END, Runes.BLOOD_RUNE.getItem(2), Runes.FIRE_RUNE.getItem(4), Runes.AIR_RUNE.getItem(1))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/IbanBlast.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/IbanBlast.java new file mode 100644 index 000000000..7665ff3d6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/IbanBlast.java @@ -0,0 +1,53 @@ +package core.game.node.entity.combat.spell; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the iban blast spell. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class IbanBlast extends CombatSpell { + + /** + * Constructs a new {@code IbanBlast} {@code Object}. + */ + public IbanBlast() { + super(SpellType.IBANS_BLAST, SpellBook.MODERN, 50, 60.5, -1, -1, new Animation(708, Priority.HIGH), new Graphics(87, 96), Projectile.create((Entity) null, null, 88, 40, 36, 52, 75, 15, 11), new Graphics(89, 96), Runes.FIRE_RUNE.getItem(5), Runes.DEATH_RUNE.getItem(1)); + } + + @Override + public boolean cast(Entity entity, Node target) { + if (((Player) entity).getEquipment().getNew(EquipmentContainer.SLOT_WEAPON).getId() != 1409) { + ((Player) entity).getPacketDispatch().sendMessage("You need to wear Iban's staff to cast this spell."); + return false; + } + return super.cast(entity, target); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(29, this); + return this; + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return type.getImpactAmount(entity, victim, 0); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/IceSpells.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/IceSpells.java new file mode 100644 index 000000000..227eda674 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/IceSpells.java @@ -0,0 +1,163 @@ +package core.game.node.entity.combat.spell; + +import java.util.List; + +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Ice spells from the Ancient spellbook. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class IceSpells extends CombatSpell { + + /** + * The barrage orb GFX. + */ + private static final Graphics BARRAGE_ORB = new Graphics(1677, 96); //119 + + /** + * The projectile for Ice rush. + */ + private static final Projectile RUSH_PROJECTILE = Projectile.create((Entity) null, null, 360, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Ice rush. + */ + private static final Graphics RUSH_END = new Graphics(361, 96); + + /** + * The projectile for Ice barrage. + */ + private static final Projectile BURST_PROJECTILE = Projectile.create((Entity) null, null, 362, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Ice barrage. + */ + private static final Graphics BURST_END = new Graphics(363, 0); + + /** + * The start graphic for Ice rush. + */ + private static final Graphics BLITZ_START = new Graphics(366, 96); + + /** + * The end graphic for Ice rush. + */ + private static final Graphics BLITZ_END = new Graphics(367, 96); + + /** + * The projectile for Ice barrage. + */ + private static final Projectile BARRAGE_PROJECTILE = Projectile.create((Entity) null, null, 368, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Ice barrage. + */ + private static final Graphics BARRAGE_END = new Graphics(369, 0); + + /** + * Constructs a new {@code IceSpells} {@code Object}. + */ + public IceSpells() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code IceSpells} {@Code Object} + * @param type The spell type. + * @param impactSound The impact sound id. + * @param anim The animation. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + */ + private IceSpells(SpellType type, int level, double baseExperience, int impactSound, Animation anim, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.ANCIENT, level, baseExperience, 171, impactSound, anim, start, projectile, end, runes); + } + + @Override + public void visualize(Entity entity, Node target) { + entity.graphics(graphic); + if (projectile != null) { + projectile.transform(entity, (Entity) target, false, 58, 10).send(); + } + entity.animate(animation); + sendAudio(entity, audio); + } + + @Override + public void visualizeImpact(Entity entity, Entity target, BattleState state) { + if (state.isFrozen()) { + if (target == entity.getProperties().getCombatPulse().getVictim()) { + sendAudio(target, new Audio(impactAudio, 1, 20)); + } + target.graphics(BARRAGE_ORB); + return; + } + super.visualizeImpact(entity, target, state); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.ANCIENT.register(0, new IceSpells(SpellType.RUSH, 58, 34.0, 173, new Animation(1978, Priority.HIGH), null, RUSH_PROJECTILE, RUSH_END, Runes.DEATH_RUNE.getItem(2), Runes.CHAOS_RUNE.getItem(2), Runes.WATER_RUNE.getItem(2))); + SpellBook.ANCIENT.register(2, new IceSpells(SpellType.BURST, 70, 40.0, 170, new Animation(1979, Priority.HIGH), null, BURST_PROJECTILE, BURST_END, Runes.DEATH_RUNE.getItem(2), Runes.CHAOS_RUNE.getItem(4), Runes.WATER_RUNE.getItem(4))); + SpellBook.ANCIENT.register(1, new IceSpells(SpellType.BLITZ, 82, 46.0, 169, new Animation(1978, Priority.HIGH), BLITZ_START, null, BLITZ_END, Runes.BLOOD_RUNE.getItem(2), Runes.DEATH_RUNE.getItem(2), Runes.WATER_RUNE.getItem(3))); + SpellBook.ANCIENT.register(3, new IceSpells(SpellType.BARRAGE, 94, 52.0, 168, new Animation(1979, Priority.HIGH), null, BARRAGE_PROJECTILE, BARRAGE_END, Runes.BLOOD_RUNE.getItem(2), Runes.DEATH_RUNE.getItem(4), Runes.WATER_RUNE.getItem(6))); + return this; + } + + @Override + public void fireEffect(Entity entity, Entity victim, BattleState state) { + if (state.getEstimatedHit() == -1) { + return; + } + int ticks = (1 + (type.ordinal() - SpellType.RUSH.ordinal())) * 8; + if (state.getEstimatedHit() > -1) { + if (victim.getAttribute("freeze_immunity", -1) < GameWorld.getTicks()) { + victim.getStateManager().set(EntityState.FROZEN, ticks); + } else if (type == SpellType.BARRAGE) { + state.setFrozen(true); + } + } + } + + @Override + public BattleState[] getTargets(Entity entity, Entity target) { + if (animation.getId() == 1978 || !entity.getProperties().isMultiZone() || !target.getProperties().isMultiZone()) { + return super.getTargets(entity, target); + } + List list = getMultihitTargets(entity, target, 9); + BattleState[] targets = new BattleState[list.size()]; + int index = 0; + for (Entity e : list) { + targets[index++] = new BattleState(entity, e); + } + return targets; + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 4); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/MagicDart.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/MagicDart.java new file mode 100644 index 000000000..ea6a75aa8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/MagicDart.java @@ -0,0 +1,57 @@ +package core.game.node.entity.combat.spell; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the magic dart spell. + * @author Emperor + */ +@Initializable +public class MagicDart extends CombatSpell { + + /** + * Constructs a new {@code MagicDart} {@code Object}. + */ + public MagicDart() { + super(SpellType.MAGIC_DART, SpellBook.MODERN, 50, 61.0, 218, 219, new Animation(1576, Priority.HIGH), null, Projectile.create((Entity) null, null, 330, 40, 36, 52, 75, 15, 11), new Graphics(331, 96), Runes.DEATH_RUNE.getItem(1), Runes.MIND_RUNE.getItem(4)); + } + + @Override + public boolean cast(Entity entity, Node target) { + if (entity.getSkills().getLevel(Skills.SLAYER) < 55) { + ((Player) entity).getPacketDispatch().sendMessage("You need a Slayer level of 55 to cast this spell."); + return false; + } + if (((Player) entity).getEquipment().getNew(EquipmentContainer.SLOT_WEAPON).getId() != 4170) { + ((Player) entity).getPacketDispatch().sendMessage("You need to wear a Slayer's staff to cast this spell."); + return false; + } + return super.cast(entity, target); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(31, this); + return this; + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return type.getImpactAmount(entity, victim, 0); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/MiasmicSpells.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/MiasmicSpells.java new file mode 100644 index 000000000..bc8407406 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/MiasmicSpells.java @@ -0,0 +1,180 @@ + package core.game.node.entity.combat.spell; + +import java.util.List; + +import core.game.container.impl.EquipmentContainer; +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Handles the Miasmic spells that are a part of the Ancient spellbook. + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class MiasmicSpells extends CombatSpell { + + /** + * The start graphic for Miasmic rush. + */ + private static final Graphics RUSH_START = new Graphics(1845, 0, 15); + + /** + * The end graphic for Miasmic rush. + */ + private static final Graphics RUSH_END = new Graphics(1847, 40); + + /** + * The start graphic for Miasmic rush. + */ + private static final Graphics BURST_START = new Graphics(1848, 0); + + /** + * The end graphic for Miasmic barrage. + */ + private static final Graphics BURST_END = new Graphics(1849, 20, 30); + + /** + * The start graphic for Miasmic rush. + */ + private static final Graphics BLITZ_START = new Graphics(1850, 15); + + /** + * The end graphic for Miasmic rush. + */ + private static final Graphics BLITZ_END = new Graphics(1851, 0); + + /** + * The start graphic for Miasmic rush. + */ + private static final Graphics BARRAGE_START = new Graphics(1853, 0); + + /** + * The end graphic for Miasmic barrage. + */ + private static final Graphics BARRAGE_END = new Graphics(1854, 0, 30); + + /** + * The item ids of the staves able to cast Miasmic spells. + */ + private static final int[] VALID_STAFF_IDS = { 13867, 13869, 13841, 13843 }; + + /** + * Constructs a new {@code MiasmicSpells} {@code Object}. + */ + public MiasmicSpells() { + } + + /** + * Constructs a new {@code MiasmicSpells} {@Code Object} + * @param type The spell type. + * @param impactSound The impact sound id. + * @param anim The animation. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + */ + private MiasmicSpells(SpellType type, int level, double baseExperience, int impactSound, Animation anim, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.ANCIENT, level, baseExperience, 171, impactSound, anim, start, projectile, end, runes); + } + + @Override + public void visualize(Entity entity, Node target) { + entity.graphics(graphic); + if (projectile != null) { + projectile.transform(entity, (Entity) target, false, 58, 10).send(); + } + entity.animate(animation); + sendAudio(entity, audio); + } + + @Override + public void visualizeImpact(Entity entity, Entity target, BattleState state) { + super.visualizeImpact(entity, target, state); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.ANCIENT.register(16, new MiasmicSpells(SpellType.RUSH, 61, 36.0, 173, new Animation(10513, Priority.HIGH), RUSH_START, null, RUSH_END, Runes.EARTH_RUNE.getItem(1), Runes.SOUL_RUNE.getItem(1), Runes.CHAOS_RUNE.getItem(2))); + SpellBook.ANCIENT.register(17, new MiasmicSpells(SpellType.BURST, 73, 42.0, 170, new Animation(10516, Priority.HIGH), BURST_START, null, BURST_END, Runes.EARTH_RUNE.getItem(3), Runes.SOUL_RUNE.getItem(3), Runes.CHAOS_RUNE.getItem(4))); + SpellBook.ANCIENT.register(18, new MiasmicSpells(SpellType.BLITZ, 85, 48.0, 169, new Animation(10524, Priority.HIGH), BLITZ_START, null, BLITZ_END, Runes.EARTH_RUNE.getItem(3), Runes.SOUL_RUNE.getItem(3), Runes.BLOOD_RUNE.getItem(2))); + SpellBook.ANCIENT.register(19, new MiasmicSpells(SpellType.BARRAGE, 97, 54.0, 168, new Animation(10518, Priority.HIGH), BARRAGE_START, null, BARRAGE_END, Runes.EARTH_RUNE.getItem(4), Runes.SOUL_RUNE.getItem(4), Runes.BLOOD_RUNE.getItem(4))); + return this; + } + + @Override + public void fireEffect(Entity entity, Entity victim, BattleState state) { + if (victim.getAttribute("miasmic_immunity", -1) < GameWorld.getTicks()) { + victim.getStateManager().register(EntityState.MIASMIC, true, (getSpellId() - 15) * 20); + } + } + + /** + * Checks if a valid staff is equipped. + * @param entity The attacking entity. + * @return {@code True} if so. + */ + public boolean validStaffEquipped(Entity entity){ + for(int i = 0; i < VALID_STAFF_IDS.length; i++){ + if(((Player) entity).getEquipment().getNew(EquipmentContainer.SLOT_WEAPON).getId() == VALID_STAFF_IDS[i]){ + return true; + } + } + return false; + } + + @Override + public boolean cast(Entity entity, Node target) { + if (!validStaffEquipped(entity) && !GameWorld.getSettings().isDevMode()) { + ((Player) entity).getPacketDispatch().sendMessage("You need to be wielding Zuriel's staff in order to cast this spell."); + return false; + } + if (!meetsRequirements(entity, true, false)) { + return false; + } + return super.cast(entity, target); + } + + @Override + public BattleState[] getTargets(Entity entity, Entity target) { + if (animation.getId() == 10513 || animation.getId() == 10524 + || !entity.getProperties().isMultiZone() || !target.getProperties().isMultiZone()) { + return super.getTargets(entity, target); + } + List list = getMultihitTargets(entity, target, 9); + BattleState[] targets = new BattleState[list.size()]; + int index = 0; + for (Entity e : list) { + targets[index++] = new BattleState(entity, e); + } + return targets; + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + int add = 9; + if(animation.getId() == 10524 || animation.getId() == 10516){ + add = 6; + } + if(animation.getId() == 10513){ + add = 4; + } + return getType().getImpactAmount(entity, victim, add); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/ShadowSpells.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/ShadowSpells.java new file mode 100644 index 000000000..325f949f1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/ShadowSpells.java @@ -0,0 +1,128 @@ +package core.game.node.entity.combat.spell; + +import java.util.List; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Shadow spells from the Ancient spellbook. + * @author Emperor + */ +@Initializable +public final class ShadowSpells extends CombatSpell { + + /** + * The projectile for Shadow rush. + */ + private static final Projectile RUSH_PROJECTILE = Projectile.create((Entity) null, null, 378, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Shadow rush. + */ + private static final Graphics RUSH_END = new Graphics(379, 96); + + /** + * The projectile for Shadow burst. + */ + private static final Projectile BURST_PROJECTILE = Projectile.create((Entity) null, null, 380, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Shadow burst. + */ + private static final Graphics BURST_END = new Graphics(381, 0); + + /** + * The end graphic for Shadow blitz. + */ + private static final Graphics BLITZ_END = new Graphics(382, 96); + + /** + * The end graphic for Shadow barrage. + */ + private static final Graphics BARRAGE_END = new Graphics(383, 0); + + /** + * Constructs a new {@code ShadowSpells} {@code Object}. + */ + public ShadowSpells() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code ShadowSpells} {@Code Object} + * @param type The spell type. + * @param level The level requirement. + * @param sound The casting sound. + * @param impactSound The impact sound id. + * @param anim The animation. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + */ + private ShadowSpells(SpellType type, int level, double baseExperience, int sound, int impactSound, Animation anim, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.ANCIENT, level, baseExperience, sound, impactSound, anim, start, projectile, end, runes); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.ANCIENT.register(12, new ShadowSpells(SpellType.RUSH, 52, 31.0, 175, 176, new Animation(1978, Priority.HIGH), null, RUSH_PROJECTILE, RUSH_END, Runes.SOUL_RUNE.getItem(1), Runes.DEATH_RUNE.getItem(2), Runes.CHAOS_RUNE.getItem(2), Runes.AIR_RUNE.getItem(1))); + SpellBook.ANCIENT.register(14, new ShadowSpells(SpellType.BURST, 64, 37.0, 177, 178, new Animation(1979, Priority.HIGH), null, BURST_PROJECTILE, BURST_END, Runes.SOUL_RUNE.getItem(2), Runes.DEATH_RUNE.getItem(2), Runes.CHAOS_RUNE.getItem(4), Runes.AIR_RUNE.getItem(1))); + SpellBook.ANCIENT.register(13, new ShadowSpells(SpellType.BLITZ, 76, 43.0, 181, 182, new Animation(1978, Priority.HIGH), null, null, BLITZ_END, Runes.SOUL_RUNE.getItem(2), Runes.BLOOD_RUNE.getItem(2), Runes.DEATH_RUNE.getItem(2), Runes.AIR_RUNE.getItem(2))); + SpellBook.ANCIENT.register(15, new ShadowSpells(SpellType.BARRAGE, 88, 48.0, 181, 185, new Animation(1979, Priority.HIGH), null, null, BARRAGE_END, Runes.SOUL_RUNE.getItem(3), Runes.BLOOD_RUNE.getItem(2), Runes.DEATH_RUNE.getItem(4), Runes.AIR_RUNE.getItem(4))); + return this; + } + + @Override + public void visualize(Entity entity, Node target) { + entity.graphics(graphic); + if (projectile != null) { + projectile.transform(entity, (Entity) target, false, 58, 10).send(); + } + entity.animate(animation); + sendAudio(entity, audio); + } + + @Override + public void fireEffect(Entity entity, Entity victim, BattleState state) { + if (state.getEstimatedHit() > -1) { + int level = victim.getSkills().getStaticLevel(Skills.ATTACK); + victim.getSkills().updateLevel(Skills.ATTACK, (int) -(level * 0.1), (int) (level - (level * 0.1))); + } + } + + @Override + public BattleState[] getTargets(Entity entity, Entity target) { + if (animation.getId() == 1978 || !entity.getProperties().isMultiZone() || !target.getProperties().isMultiZone()) { + return super.getTargets(entity, target); + } + List list = getMultihitTargets(entity, target, 9); + BattleState[] targets = new BattleState[list.size()]; + int index = 0; + for (Entity e : list) { + targets[index++] = new BattleState(entity, e); + } + return targets; + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 2); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/SmokeSpells.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/SmokeSpells.java new file mode 100644 index 000000000..b8929ead5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/SmokeSpells.java @@ -0,0 +1,137 @@ +package core.game.node.entity.combat.spell; + +import java.util.List; + +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Smoke spells from the Ancient spellbook. + * @author Emperor + */ +@Initializable +public final class SmokeSpells extends CombatSpell { + + /** + * The projectile for Smoke rush. + */ + private static final Projectile RUSH_PROJECTILE = Projectile.create((Entity) null, null, 384, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Smoke rush. + */ + private static final Graphics RUSH_END = new Graphics(385, 96); + + /** + * The projectile for Smoke burst. + */ + private static final Projectile BURST_PROJECTILE = Projectile.create((Entity) null, null, 386, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Smoke burst. + */ + private static final Graphics BURST_END = new Graphics(387, 0); + + /** + * The projectile for Smoke blitz. + */ + private static final Projectile BLITZ_PROJECTILE = Projectile.create((Entity) null, null, 389, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Smoke blitz. + */ + private static final Graphics BLITZ_END = new Graphics(388, 96); + + /** + * The projectile for Smoke barrage. + */ + private static final Projectile BARRAGE_PROJECTILE = Projectile.create((Entity) null, null, 391, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Smoke barrage. + */ + private static final Graphics BARRAGE_END = new Graphics(390, 0); + + /** + * Constructs a new {@code SmokeSpells} {@code Object}. + */ + public SmokeSpells() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code SmokeSpells} {@Code Object} + * @param type The spell type. + * @param level The level requirement. + * @param sound The casting sound. + * @param impactSound The impact sound id. + * @param anim The animation. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + */ + private SmokeSpells(SpellType type, int level, double baseExperience, int sound, int impactSound, Animation anim, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.ANCIENT, level, baseExperience, sound, impactSound, anim, start, projectile, end, runes); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.ANCIENT.register(8, new SmokeSpells(SpellType.RUSH, 50, 30.0, 176, 177, new Animation(1978, Priority.HIGH), null, RUSH_PROJECTILE, RUSH_END, Runes.DEATH_RUNE.getItem(2), Runes.CHAOS_RUNE.getItem(2), Runes.FIRE_RUNE.getItem(1), Runes.AIR_RUNE.getItem(1))); + SpellBook.ANCIENT.register(10, new SmokeSpells(SpellType.BURST, 62, 36.0, 179, 180, new Animation(1979, Priority.HIGH), null, BURST_PROJECTILE, BURST_END, Runes.DEATH_RUNE.getItem(2), Runes.CHAOS_RUNE.getItem(4), Runes.FIRE_RUNE.getItem(2), Runes.AIR_RUNE.getItem(2))); + SpellBook.ANCIENT.register(9, new SmokeSpells(SpellType.BLITZ, 74, 42.0, 183, 184, new Animation(1978, Priority.HIGH), null, BLITZ_PROJECTILE, BLITZ_END, Runes.BLOOD_RUNE.getItem(2), Runes.DEATH_RUNE.getItem(2), Runes.FIRE_RUNE.getItem(2), Runes.AIR_RUNE.getItem(2))); + SpellBook.ANCIENT.register(11, new SmokeSpells(SpellType.BARRAGE, 86, 48.0, 183, 185, new Animation(1979, Priority.HIGH), null, BARRAGE_PROJECTILE, BARRAGE_END, Runes.BLOOD_RUNE.getItem(2), Runes.DEATH_RUNE.getItem(4), Runes.FIRE_RUNE.getItem(4), Runes.AIR_RUNE.getItem(4))); + return this; + } + + @Override + public void visualize(Entity entity, Node target) { + entity.graphics(graphic); + if (projectile != null) { + projectile.transform(entity, (Entity) target, false, 58, 10).send(); + } + entity.animate(animation); + sendAudio(entity, audio); + } + + @Override + public void fireEffect(Entity entity, Entity victim, BattleState state) { + if (state.getEstimatedHit() > -1) { + victim.getStateManager().register(EntityState.POISONED, false, type.ordinal() >= SpellType.BLITZ.ordinal() ? 48 : 28, entity); + } + } + + @Override + public BattleState[] getTargets(Entity entity, Entity target) { + if (animation.getId() == 1978 || !entity.getProperties().isMultiZone() || !target.getProperties().isMultiZone()) { + return super.getTargets(entity, target); + } + List list = getMultihitTargets(entity, target, 9); + BattleState[] targets = new BattleState[list.size()]; + int index = 0; + for (Entity e : list) { + targets[index++] = new BattleState(entity, e); + } + return targets; + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 1); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/SonicWaveSpell.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/SonicWaveSpell.java new file mode 100644 index 000000000..889dd32ae --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/SonicWaveSpell.java @@ -0,0 +1,61 @@ +package core.game.node.entity.combat.spell; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the sonic wave spell of an evil chicken. + * @author 'Vexia + * @date 24/11/2013 + */ +@Initializable +public final class SonicWaveSpell extends CombatSpell { + + /** + * The projectile for Earth strike. + */ + private static final Projectile STRIKE_PROJECTILE = Projectile.create((Entity) null, null, 337, 8, 8, 52, 100, 15, 1); + + /** + * Constructs a new {@code EarthSpell} {@Code Object} + */ + public SonicWaveSpell() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code EarthSpell} {@Code Object}. + * @param type The spell type. + * @param level The level requirement. + * @param sound The cast sound. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + * @param runes The rune requirements. + */ + private SonicWaveSpell(SpellType type, int level, int sound, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.MODERN, level, 0.0, sound, sound + 1, null, start, projectile, end, runes); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 5); + } + + @Override + public Plugin newInstance(SpellType type) throws Throwable { + SpellBook.MODERN.register(63232, new SonicWaveSpell(SpellType.STRIKE, 1, -1, new Graphics(337), STRIKE_PROJECTILE, null)); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/SpellBlocks.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/SpellBlocks.java new file mode 100644 index 000000000..ec2e95b27 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/SpellBlocks.java @@ -0,0 +1,36 @@ +package core.game.node.entity.combat.spell; + +import core.game.node.Node; +import core.game.system.SystemLogger; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class SpellBlocks { + private static HashMap> blocks = new HashMap<>(); + + public static void register(int spellId, Node toBlock){ + if(blocks.get(spellId) != null){ + blocks.get(spellId).add(toBlock); + } else { + List blockslist = new ArrayList<>(); + blockslist.add(toBlock); + blocks.put(spellId,blockslist); + } + } + + public static boolean isBlocked(int spellId,Node node){ + AtomicBoolean blocked = new AtomicBoolean(false); + if(blocks.get(spellId) == null){ + return false; + } + blocks.get(spellId).forEach(n -> { + if(node.getName().equals(n.getName())){ + blocked.set(true); + } + }); + return blocked.get(); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/combat/spell/WaterSpell.java b/Server/src/main/java/Server/core/game/node/entity/combat/spell/WaterSpell.java new file mode 100644 index 000000000..09f2d213e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/combat/spell/WaterSpell.java @@ -0,0 +1,127 @@ +package core.game.node.entity.combat.spell; + +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Represents the water spells. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WaterSpell extends CombatSpell { + + /** + * The start graphic for Water strike. + */ + private static final Graphics STRIKE_START = new Graphics(93, 96); + + /** + * The projectile for Water strike. + */ + private static final Projectile STRIKE_PROJECTILE = Projectile.create((Entity) null, null, 94, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Water strike. + */ + private static final Graphics STRIKE_END = new Graphics(95, 96); + + /** + * The start graphic for Water bolt. + */ + private static final Graphics BOLT_START = new Graphics(120, 96); + + /** + * The projectile for Water bolt. + */ + private static final Projectile BOLT_PROJECTILE = Projectile.create((Entity) null, null, 121, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Water bolt. + */ + private static final Graphics BOLT_END = new Graphics(122, 96); + + /** + * The start graphic for Water blast. + */ + private static final Graphics BLAST_START = new Graphics(135, 96); // 129 + + /** + * The projectile for Water blast. + */ + private static final Projectile BLAST_PROJECTILE = Projectile.create((Entity) null, null, 136, 40, 36, 52, 75, 15, 11); // 130 + + /** + * The end graphic for Water blast. + */ + private static final Graphics BLAST_END = new Graphics(137, 96); // 131 + + /** + * The start graphic for Water wave. + */ + private static final Graphics WAVE_START = new Graphics(161, 96); + + /** + * The projectile for Water wave. + */ + private static final Projectile WAVE_PROJECTILE = Projectile.create((Entity) null, null, 162, 40, 36, 52, 75, 15, 11); + + /** + * The end graphic for Water wave. + */ + private static final Graphics WAVE_END = new Graphics(163, 96); + + /** + * The cast animation. + */ + private static final Animation ANIMATION = new Animation(711, Priority.HIGH); + + /** + * Constructs a new {@code WaterSpell} {@Code Object} + */ + public WaterSpell() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code WaterSpell} {@Code Object} + * @param type The spell type. + * @param level The level requirement. + * @param sound The cast sound. + * @param start The start graphics. + * @param projectile The projectile. + * @param end The end graphics. + * @param runes The rune requirements. + */ + private WaterSpell(SpellType type, int level, double baseExperience, int sound, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.MODERN, level, baseExperience, sound, sound + 1, ANIMATION, start, projectile, end, runes); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return getType().getImpactAmount(entity, victim, 2); + } + + @Override + public Plugin newInstance(SpellType type) throws Throwable { + SpellBook.MODERN.register(4, new WaterSpell(SpellType.STRIKE, 5, 7.5, 211, STRIKE_START, STRIKE_PROJECTILE, STRIKE_END, Runes.MIND_RUNE.getItem(1), Runes.WATER_RUNE.getItem(1), Runes.AIR_RUNE.getItem(1))); + SpellBook.MODERN.register(14, new WaterSpell(SpellType.BOLT, 23, 16.5, 209, BOLT_START, BOLT_PROJECTILE, BOLT_END, Runes.CHAOS_RUNE.getItem(1), Runes.WATER_RUNE.getItem(2), Runes.AIR_RUNE.getItem(2))); + SpellBook.MODERN.register(27, new WaterSpell(SpellType.BLAST, 47, 28.5, 207, BLAST_START, BLAST_PROJECTILE, BLAST_END, Runes.DEATH_RUNE.getItem(1), Runes.WATER_RUNE.getItem(3), Runes.AIR_RUNE.getItem(3))); + SpellBook.MODERN.register(48, new WaterSpell(SpellType.WAVE, 65, 37.5, 213, WAVE_START, WAVE_PROJECTILE, WAVE_END, Runes.BLOOD_RUNE.getItem(1), Runes.WATER_RUNE.getItem(7), Runes.AIR_RUNE.getItem(5))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/equipment/BarrowsEquipmentRegister.kt b/Server/src/main/java/Server/core/game/node/entity/equipment/BarrowsEquipmentRegister.kt new file mode 100644 index 000000000..41fc7049b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/equipment/BarrowsEquipmentRegister.kt @@ -0,0 +1,72 @@ +package core.game.node.entity.equipment + +import core.game.node.entity.combat.equipment.EquipmentDegrader +import core.game.system.SystemLogger +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class BarrowsEquipmentRegister : Plugin{ + val DHAROK_HELM = arrayOf(4716,4880,4881,4882,4883,4884) + val DHAROK_AXE = arrayOf(4718,4886,4887,4888,4889,4890) + val DHAROK_BODY = arrayOf(4720,4892,4893,4894,4895,4896) + val DHAROK_LEGS = arrayOf(4722,4898,4899,4900,4901,4902) + + val GUTHAN_HELM = arrayOf(4724,4904,4905,4906,4907,4908) + val GUTHAN_SPEAR = arrayOf(4726,4910,4911,4912,4913,4914) + val GUTHAN_BODY = arrayOf(4728,4916,4917,4918,4919,4920) + val GUTHAN_SKIRT = arrayOf(4730,4922,4923,4924,4925,4926) + + val TORAG_HELM = arrayOf(4745,4952,4953,4954,4955,4956) + val TORAG_HAMMER = arrayOf(4747,4958,4959,4960,4961,4962) + val TORAG_BODY = arrayOf(4749,4964,4965,4966,4967,4968) + val TORAG_LEGS = arrayOf(4751,4970,4971,4972,4973,4974) + + val VERAC_HELM = arrayOf(4753,4976,4977,4978,4979,4980) + val VERAC_FLAIL = arrayOf(4755,4982,4983,4984,4985,4986) + val VERAC_BRASS = arrayOf(4757,4988,4989,4990,4991,4992) + val VERAC_SKIRT = arrayOf(4759,4994,4995,4996,4997,4998) + + val AHRIM_HOOD = arrayOf(4708,4856,4857,4858,4859,4860) + val AHRIM_STAFF = arrayOf(4710,4862,4863,4864,4865,4866) + val AHRIM_TOP = arrayOf(4712,4868,4869,4870,4871,4872) + val AHRIM_SKIRT = arrayOf(4714,4874,4875,4876,4877,4878) + + val KARIL_COIF = arrayOf(4732,4928,4929,4930,4931,4932) + val KARIL_CBOW = arrayOf(4734,4934,4935,4936,4937,4938) + val KARIL_TOP = arrayOf(4736,4940,4941,4942,4943,4944) + val KARIL_SKIRT = arrayOf(4738,4946,4947,4948,4949,4950) + + override fun newInstance(arg: Any?): Plugin { + EquipmentDegrader.registerSet(AHRIM_HOOD) + EquipmentDegrader.registerSet(AHRIM_STAFF) + EquipmentDegrader.registerSet(AHRIM_TOP) + EquipmentDegrader.registerSet(AHRIM_SKIRT) + EquipmentDegrader.registerSet(KARIL_COIF) + EquipmentDegrader.registerSet(KARIL_CBOW) + EquipmentDegrader.registerSet(KARIL_TOP) + EquipmentDegrader.registerSet(KARIL_SKIRT) + EquipmentDegrader.registerSet(DHAROK_HELM) + EquipmentDegrader.registerSet(DHAROK_AXE) + EquipmentDegrader.registerSet(DHAROK_BODY) + EquipmentDegrader.registerSet(DHAROK_LEGS) + EquipmentDegrader.registerSet(GUTHAN_HELM) + EquipmentDegrader.registerSet(GUTHAN_SPEAR) + EquipmentDegrader.registerSet(GUTHAN_BODY) + EquipmentDegrader.registerSet(GUTHAN_SKIRT) + EquipmentDegrader.registerSet(TORAG_HELM) + EquipmentDegrader.registerSet(TORAG_HAMMER) + EquipmentDegrader.registerSet(TORAG_BODY) + EquipmentDegrader.registerSet(TORAG_LEGS) + EquipmentDegrader.registerSet(VERAC_HELM) + EquipmentDegrader.registerSet(VERAC_FLAIL) + EquipmentDegrader.registerSet(VERAC_BRASS) + EquipmentDegrader.registerSet(VERAC_SKIRT) + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/equipment/PVPEquipmentRegister.kt b/Server/src/main/java/Server/core/game/node/entity/equipment/PVPEquipmentRegister.kt new file mode 100644 index 000000000..d9e403054 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/equipment/PVPEquipmentRegister.kt @@ -0,0 +1,52 @@ +package core.game.node.entity.equipment + +import core.game.node.entity.combat.equipment.EquipmentDegrader +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class PVPEquipmentRegister : Plugin { + val VESTA_BODY = arrayOf(13887,13889) + val VESTA_SKIRT = arrayOf(13893,13895) + val VESTA_SWORD = arrayOf(13899,13901) + val VESTA_SPEAR = arrayOf(13905,13907) + + val STATIUS_BODY = arrayOf(13884,13886) + val STATIUS_LEGS = arrayOf(13890,13892) + val STATIUS_HELM = arrayOf(13896,13898) + val STATIUS_HAMMER = arrayOf(13902,13904) + + val ZURIEL_TOP = arrayOf(13858,13860) + val ZUREL_BOTTOM = arrayOf(13861,13863) + val ZURIEL_HOOD = arrayOf(13864,13866) + val ZURIEL_STAFF = arrayOf(13867, 13869) + + val MORRIGAN_BODY = arrayOf(13870,13872) + val MORRIGAN_CHAP = arrayOf(13873,13875) + val MORRIGAN_COIF = arrayOf(13876,13878) + + + override fun newInstance(arg: Any?): Plugin { + EquipmentDegrader.registerSet(VESTA_BODY) + EquipmentDegrader.registerSet(VESTA_SKIRT) + EquipmentDegrader.registerSet(VESTA_SWORD) + EquipmentDegrader.registerSet(VESTA_SPEAR) + EquipmentDegrader.registerSet(STATIUS_BODY) + EquipmentDegrader.registerSet(STATIUS_HAMMER) + EquipmentDegrader.registerSet(STATIUS_HELM) + EquipmentDegrader.registerSet(STATIUS_LEGS) + EquipmentDegrader.registerSet(ZUREL_BOTTOM) + EquipmentDegrader.registerSet(ZURIEL_HOOD) + EquipmentDegrader.registerSet(ZURIEL_STAFF) + EquipmentDegrader.registerSet(ZURIEL_TOP) + EquipmentDegrader.registerSet(MORRIGAN_BODY) + EquipmentDegrader.registerSet(MORRIGAN_CHAP) + EquipmentDegrader.registerSet(MORRIGAN_COIF) + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/equipment/SnowballEquipmentPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/equipment/SnowballEquipmentPlugin.kt new file mode 100644 index 000000000..c69412cf0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/equipment/SnowballEquipmentPlugin.kt @@ -0,0 +1,31 @@ +package core.game.node.entity.equipment + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.Interaction +import core.game.interaction.Option +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.interaction.player.PeltOptionPlugin + +@Initializable +class SnowballEquipmentPlugin : Plugin { + override fun newInstance(arg: Item?): Plugin { + ItemDefinition.forId(11951).handlers["equipment"] = this + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + val player = args[0] as Player + when(identifier){ + "equip" -> { + player.getInteraction().set(Option("Pelt", 0).setHandler(PeltOptionPlugin())) + } + "unequip" -> { + Interaction.sendOption(player, 0, "null") + } + } + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/impl/Animator.java b/Server/src/main/java/Server/core/game/node/entity/impl/Animator.java new file mode 100644 index 000000000..caece2816 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/impl/Animator.java @@ -0,0 +1,203 @@ +package core.game.node.entity.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.game.world.update.flag.npc.NPCAnimation; +import core.game.world.update.flag.npc.NPCGraphic; +import core.game.world.update.flag.player.AnimationFlag; +import core.game.world.update.flag.player.GraphicFlag; + +/** + * Handles the animating of an Entity. + * @author Emperor + */ +public final class Animator { + + /** + * The reset animation. + */ + public static final Animation RESET_A = new Animation(-1); + + /** + * The reset graphics. + */ + public static final Graphics RESET_G = new Graphics(-1); + + /** + * The entity. + */ + private Entity entity; + + /** + * The current animation. + */ + private Animation animation; + + /** + * The current graphics. + */ + private Graphics graphics; + + /** + * Current priority. + */ + private Priority priority = Priority.LOW; + + /** + * The current animation delay. + */ + private int ticks; + + /** + * Constructs a new {@code Animator} {@Code Object}. + * @param entity The entity. + */ + public Animator(Entity entity) { + this.entity = entity; + } + + /** + * Represents the priorities. + * @author Emperor + */ + public static enum Priority { + + /** + * Lowest priority. + */ + LOW, + + /** + * Medium priority (override low priority) + */ + MID, + + /** + * High priority (override all) + */ + HIGH, + + /** + * Extra priority only to be used when really needed. (overrides death + * animation etc). + */ + VERY_HIGH; + } + + /** + * Starts an animation. + * @param animation The animation. + * @return {@code True} if successful. + */ + public boolean animate(Animation animation) { + return animate(animation, null); + } + + /** + * Starts a graphic. + * @param graphic The graphic. + * @return {@code True} if successful. + */ + public boolean graphics(Graphics graphic) { + return animate(null, graphic); + } + + /** + * Starts an animation (and if animation is null or has successfully started + * > start graphic) + * @param animation The animation. + * @param graphic The graphic. + * @return {@code True} if successfully started. + */ + public boolean animate(Animation animation, Graphics graphic) { + if (animation != null) { + if (ticks > GameWorld.getTicks() && priority.ordinal() > animation.getPriority().ordinal()) { + return false; + } + if (animation.getId() == 0) { + animation.setId(-1); + } + this.animation = animation; + ticks = GameWorld.getTicks() + animation.getDuration(); + entity.getUpdateMasks().register(entity instanceof NPC ? new NPCAnimation(animation) : new AnimationFlag(animation)); + priority = animation.getPriority(); + } + if (graphic != null) { + this.graphics = graphic; + entity.getUpdateMasks().register(entity instanceof NPC ? new NPCGraphic(graphic) : new GraphicFlag(graphic)); + } + return true; + } + + /** + * Forces an animation. + * @param animation The animation to display. + */ + public void forceAnimation(Animation animation) { + ticks = -1; + animate(animation); + priority = Priority.HIGH; + } + + /** + * Method used to reset the animator. + */ + public void reset() { + animate(RESET_A); + } + + /** + * Checks if the entity is animating. + * @return {@code True} if so. + */ + public boolean isAnimating() { + return animation != null && ticks > GameWorld.getTicks(); + } + + /** + * @return the animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * @param animation the animation to set. + */ + public void setAnimation(Animation animation) { + this.animation = animation; + } + + /** + * @return the graphics. + */ + public Graphics getGraphics() { + return graphics; + } + + /** + * @param graphics the graphics to set. + */ + public void setGraphics(Graphics graphics) { + this.graphics = graphics; + } + + /** + * Gets the priority. + * @return The priority. + */ + public Priority getPriority() { + return priority; + } + + /** + * Sets the priority. + * @param priority The priority to set. + */ + public void setPriority(Priority priority) { + this.priority = priority; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/impl/ForceMovement.java b/Server/src/main/java/Server/core/game/node/entity/impl/ForceMovement.java new file mode 100644 index 000000000..38cacf0c6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/impl/ForceMovement.java @@ -0,0 +1,479 @@ +package core.game.node.entity.impl; + +import core.game.node.entity.Entity; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.player.ForceMovementFlag; + +/** + * The force movement handler. + * @author Emperor + */ +public class ForceMovement extends Pulse { + + /** + * The walking speed. + */ + public static final int WALKING_SPEED = 10; + + /** + * The running speed. + */ + public static final int RUNNING_SPEED = 20; + + /** + * The walking animation. + */ + public static final Animation WALK_ANIMATION = Animation.create(819); + + /** + * The entity. + */ + protected Entity entity; + + /** + * The location to start the force movement from. + */ + private Location start; + + /** + * The destination. + */ + private Location destination; + + /** + * The animation. + */ + private Animation startAnim; + + /** + * The animation. + */ + protected Animation animation; + + /** + * The ending animation. + */ + private Animation endAnimation = null; + + /** + * The direction. + */ + protected Direction direction; + + /** + * The commencing speed. + */ + private int commenceSpeed; + + /** + * The path speed. + */ + private int pathSpeed; + + /** + * Constructs a new {@code ForceMovement} {@code Object}. + * @param e The entity. + * @param start The start location. + * @param destination The destination. + * @param startAnim The start animation. + * @param animation The animation + * @param direction The direction. + */ + public ForceMovement(Entity e, Location start, Location destination, Animation startAnim, Animation animation, Direction direction, int commenceSpeed, int pathSpeed) { + super(1, e); + this.entity = e; + this.start = start; + this.destination = destination; + this.startAnim = startAnim; + this.animation = animation; + this.direction = direction; + this.commenceSpeed = commenceSpeed; + this.pathSpeed = pathSpeed; + } + + /** + * Constructs a new {@code ForceMovement} {@code Object}. + * @param e the entity. + * @param start the start location. + * @param end the destination. + * @param animation the animation. + * @param speed The path speed. + */ + public ForceMovement(Entity e, Location start, Location end, Animation animation, int speed) { + this(e, start, end, WALK_ANIMATION, animation, direction(start, end), WALKING_SPEED, speed); + } + + public ForceMovement(Entity e, Location destination, int startSpeed, int animSpeed){ + this(e,e.getLocation(),destination,WALK_ANIMATION,WALK_ANIMATION,direction(e.getLocation(),destination),startSpeed,animSpeed); + } + + /** + * Constructs a new {@code ForceMovement} {@code Object}. + * @param e the entity. + * @param start the start location. + * @param destination the destination. + * @param animation the animation. + */ + public ForceMovement(Entity e, Location start, Location destination, Animation animation) { + this(e, start, destination, WALK_ANIMATION, animation, direction(start, destination), WALKING_SPEED, WALKING_SPEED); + } + + /** + * Constructs a new {@code ForceMovement} {@code Object}. + * @param start the start loc. + * @param destination the destination. + * @param animation the animation. + */ + public ForceMovement(Location start, Location destination, Animation animation) { + this(null, start, destination, WALK_ANIMATION, animation, direction(start, destination), WALKING_SPEED, WALKING_SPEED); + } + + /** + * Creates and runs a new force movement pulse. + * @param e The entity. + * @param destination The destination location. + * @return The created ForceMovement object. + */ + public static ForceMovement run(Entity e, Location destination) { + return run(e, e.getLocation(), destination, WALK_ANIMATION, WALK_ANIMATION, direction(e.getLocation(), destination), WALKING_SPEED, WALKING_SPEED); + } + + /** + * Creates and runs a new force movement pulse. + * @param e The entity. + * @param start The start location. + * @param destination The destination location. + * @return The created ForceMovement object. + */ + public static ForceMovement run(Entity e, Location start, Location destination) { + return run(e, start, destination, WALK_ANIMATION, WALK_ANIMATION, direction(e.getLocation(), destination), WALKING_SPEED, WALKING_SPEED); + } + + /** + * Creates and runs a new force movement pulse. + * @param e The entity. + * @param start The start location. + * @param destination The destination location. + * @param animation The animation. + * @return The created ForceMovement object. + */ + public static ForceMovement run(Entity e, Location start, Location destination, Animation animation) { + return run(e, start, destination, WALK_ANIMATION, animation, direction(start, destination), WALKING_SPEED, WALKING_SPEED); + } + + /** + * Creates and runs a new force movement pulse. + * @param e The entity. + * @param start The start location. + * @param destination The destination location. + * @param animation The animation. + * @param speed The path speed. + * @return The created ForceMovement object. + */ + public static ForceMovement run(Entity e, Location start, Location destination, Animation animation, int speed) { + return run(e, start, destination, WALK_ANIMATION, animation, direction(start, destination), WALKING_SPEED, speed); + } + + /** + * Creates and runs a new force movement pulse. + * @param e The entity. + * @param start The start location. + * @param destination The destination location. + * @param animation The animation. + * @return The created ForceMovement object. + */ + public static ForceMovement run(Entity e, Location start, Location destination, Animation startAnim, Animation animation) { + return run(e, start, destination, startAnim, animation, direction(start, destination), WALKING_SPEED, WALKING_SPEED); + } + + /** + * Creates and runs a new force movement pulse. + * @param e The entity. + * @param start The start location. + * @param destination The destination location. + * @param animation The animation. + * @param direction The direction. + * @return The created ForceMovement object. + */ + public static ForceMovement run(Entity e, Location start, Location destination, Animation startAnim, Animation animation, Direction direction) { + return run(e, start, destination, startAnim, animation, direction, WALKING_SPEED, WALKING_SPEED); + } + + /** + * Creates and runs a new force movement pulse. + * @param e The entity. + * @param start The start location. + * @param destination The destination location. + * @param animation The animation. + * @param direction The direction. + * @param pathSpeed The speed (in ticks). + * @return The created ForceMovement object. + */ + public static ForceMovement run(Entity e, Location start, Location destination, Animation startAnim, Animation animation, Direction direction, int pathSpeed) { + return run(e, start, destination, startAnim, animation, direction, WALKING_SPEED, pathSpeed); + } + + /** + * Creates and runs a new force movement pulse. + * @param e The entity. + * @param start The start location. + * @param destination The destination location. + * @param animation The animation. + * @param direction The direction. + * @return The created ForceMovement object. + */ + public static ForceMovement run(Entity e, Location start, Location destination, Animation startAnim, Animation animation, Direction direction, int commenceSpeed, int pathSpeed) { + if (startAnim != null) { + startAnim.setPriority(Animator.Priority.VERY_HIGH); + } + if (animation != null) { + animation.setPriority(Animator.Priority.VERY_HIGH); + } + ForceMovement fm = new ForceMovement(e, start, destination, startAnim, animation, direction, commenceSpeed, pathSpeed); + fm.start(); + e.lock(); + GameWorld.getPulser().submit(fm); + return fm; + } + + public static ForceMovement run(Entity e, Location destination, int commenceSpeed, int pathSpeed){ + return run(e,e.getLocation(),destination,WALK_ANIMATION,WALK_ANIMATION,direction(e.getLocation(),destination),commenceSpeed,pathSpeed); + } + + /** + * Method used to run the force movement. + * @param e the entity. + */ + public void run(final Entity e, final int speed) { + this.entity = e; + int commence = (int) start.getDistance(e.getLocation()); + if (commence != 0 && commenceSpeed != 0) { + commence = (int) (1 + (commence / (commenceSpeed * 0.1))); + } + int path = 1 + (int) Math.ceil(start.getDistance(destination) / (pathSpeed * 0.1)); + this.pathSpeed = pathSpeed == 0 ? path : speed; + this.commenceSpeed = commence; + start(); + e.lock(); + GameWorld.getPulser().submit(this); + } + + /** + * Method used to run the movement. + * @param e the entity. + */ + public void run(final Entity e) { + run(e, 0); + } + + /** + * Method used to run the movement. + */ + public void run() { + run(entity); + } + + /** + * Gets the direction value. + * @param s The start location. + * @param d The destination. + * @return The direction object. + */ + public static Direction direction(Location s, Location d) { + Location delta = Location.getDelta(s, d); + int x = Math.abs(delta.getX()); + int y = Math.abs(delta.getY()); + if (x > y) { + return Direction.getDirection(delta.getX(), 0); + } + return Direction.getDirection(0, delta.getY()); + } + + @Override + public void start() { + commenceSpeed = (int) Math.ceil(start.getDistance(entity.getLocation()) / (commenceSpeed * 0.1)); + pathSpeed = (int) Math.ceil(start.getDistance(destination) / (pathSpeed * 0.1)); + if (commenceSpeed != 0) { + entity.animate(startAnim); + super.setDelay(commenceSpeed); + } else { + entity.animate(animation); + super.setDelay(pathSpeed); + } + int ticks = 1 + commenceSpeed + pathSpeed; + entity.getImpactHandler().setDisabledTicks(ticks); + entity.getUpdateMasks().register(new ForceMovementFlag(this)); + entity.getWalkingQueue().updateRegion(destination, false); + super.start(); + } + + @Override + public boolean pulse() { + if (commenceSpeed != 0) { + entity.animate(animation); + setDelay(pathSpeed); + commenceSpeed = 0; + entity.getProperties().setTeleportLocation(start); + return false; + } + return true; + } + + @Override + public void stop() { + super.stop(); + entity.getProperties().setTeleportLocation(destination); + if (endAnimation != null) { + entity.animate(endAnimation); + } + entity.unlock(); + } + + /** + * Gets the start. + * @return The start. + */ + public Location getStart() { + return start; + } + + /** + * Sets the start. + * @param start The start to set. + */ + public void setStart(Location start) { + this.start = start; + } + + /** + * Gets the destination. + * @return The destination. + */ + public Location getDestination() { + return destination; + } + + /** + * Sets the destination. + * @param destination The destination to set. + */ + public void setDestination(Location destination) { + this.destination = destination; + } + + /** + * Gets the direction. + * @return The direction. + */ + public Direction getDirection() { + return direction; + } + + /** + * Sets the direction. + * @param direction The direction to set. + */ + public void setDirection(Direction direction) { + this.direction = direction; + } + + /** + * Gets the commenceSpeed. + * @return The commenceSpeed. + */ + public int getCommenceSpeed() { + return commenceSpeed; + } + + /** + * Sets the commenceSpeed. + * @param commenceSpeed The commenceSpeed to set. + */ + public void setCommenceSpeed(int commenceSpeed) { + this.commenceSpeed = commenceSpeed; + } + + /** + * Sets the entity. + * @param entity the entity. + */ + public void setEntity(Entity entity) { + this.entity = entity; + } + + /** + * Gets the pathSpeed. + * @return The pathSpeed. + */ + public int getPathSpeed() { + return pathSpeed; + } + + /** + * Sets the pathSpeed. + * @param pathSpeed The pathSpeed to set. + */ + public void setPathSpeed(int pathSpeed) { + this.pathSpeed = pathSpeed; + } + + /** + * Gets the entity. + * @return The entity. + */ + public Entity getEntity() { + return entity; + } + + /** + * Gets the startAnim. + * @return The startAnim. + */ + public Animation getStartAnim() { + return startAnim; + } + + /** + * Sets the startAnim. + * @param startAnim The startAnim to set. + */ + public void setStartAnim(Animation startAnim) { + this.startAnim = startAnim; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Sets the animation. + * @param animation The animation to set. + */ + public void setAnimation(Animation animation) { + this.animation = animation; + } + + /** + * Gets the endAnimation. + * @return The endAnimation. + */ + public Animation getEndAnimation() { + return endAnimation; + } + + /** + * Sets the endAnimation. + * @param endAnimation The endAnimation to set. + */ + public void setEndAnimation(Animation endAnimation) { + this.endAnimation = endAnimation; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/impl/GameAttributes.java b/Server/src/main/java/Server/core/game/node/entity/impl/GameAttributes.java new file mode 100644 index 000000000..c2214f0ba --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/impl/GameAttributes.java @@ -0,0 +1,193 @@ +package core.game.node.entity.impl; + +import core.ServerConstants; +import org.w3c.dom.*; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Handles an entity's game attributes. + * @author Emperor + */ +public final class GameAttributes { + + /** + * The attributes mapping. + */ + private final Map attributes = new HashMap<>(); + + /** + * The list of attributes to save. + */ + private final List savedAttributes = new ArrayList<>(); + + /** + * Constructs a new {@code GameAttributes} {@code Object}. + */ + public GameAttributes() { + /* + * Empty. + */ + } + + /** + * Writes the attribute data to the player buffer. + * @param file The player's data buffer. + */ + @Deprecated + public void dump(String file) { + + } + + /** + * Parses the saved attributes from the buffer. + * @param file The buffer. + */ + @Deprecated + public void parse(String file) { + File saveFile = new File(ServerConstants.PLAYER_ATTRIBUTE_PATH + file); + if(!saveFile.exists()){ + return; + } + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(saveFile); + + NodeList attributesList = doc.getElementsByTagName("GameAttribute"); + for(int i = 0; i < attributesList.getLength(); i++){ + Node attrNode = attributesList.item(i); + if(attrNode.getNodeType() == Node.ELEMENT_NODE){ + Element attr = (Element) attrNode; + String key = attr.getAttribute("key"); + switch(attr.getAttribute("type")){ + case "bool": { + boolean value = Boolean.parseBoolean(attr.getAttribute("value")); + attributes.put(key, value); + if (!savedAttributes.contains(key)) { + savedAttributes.add(key); + } + break; + } + case "long": { + long value = Long.parseLong(attr.getAttribute("value")); + attributes.put(key, value); + if (!savedAttributes.contains(key)) { + savedAttributes.add(key); + } + break; + } + case "short":{ + short value = Short.parseShort(attr.getAttribute("value")); + attributes.put(key, value); + if (!savedAttributes.contains(key)) { + savedAttributes.add(key); + } + break; + } + case "int":{ + int value = Integer.parseInt(attr.getAttribute("value")); + attributes.put(key, value); + if (!savedAttributes.contains(key)) { + savedAttributes.add(key); + } + break; + } + case "byte":{ + byte value = Byte.parseByte(attr.getAttribute("value")); + attributes.put(key, value); + if (!savedAttributes.contains(key)) { + savedAttributes.add(key); + } + break; + } + case "string":{ + String value = attr.getAttribute("value"); + attributes.put(key, value); + if (!savedAttributes.contains(key)) { + savedAttributes.add(key); + } + break; + } + } + } + } + } catch (Exception e){ + e.printStackTrace(); + } + } + + /** + * Sets an attribute value. + * @param key The attribute name. + * @param value The attribute value. + */ + public void setAttribute(String key, Object value) { + if (key.startsWith("/save:")) { + key = key.substring(6, key.length()); + if (!savedAttributes.contains(key)) { + savedAttributes.add(key); + } + } + attributes.put(key, value); + } + + /** + * Gets an attribute. + * @param key The attribute name. + * @return The attribute value. + */ + @SuppressWarnings("unchecked") + public T getAttribute(String key) { + if (!attributes.containsKey(key)) { + return null; + } + return (T) attributes.get(key); + } + + /** + * Gets an attribute. + * @param string The attribute name. + * @param fail The value to return if the attribute is null. + * @return The attribute value, or the fail argument when null. + */ + @SuppressWarnings("unchecked") + public T getAttribute(String string, T fail) { + Object object = attributes.get(string); + if (object != null) { + return (T) object; + } + return fail; + } + + /** + * Removes an attribute. + * @param string The attribute name. + */ + public void removeAttribute(String string) { + savedAttributes.remove(string); + attributes.remove(string); + } + + /** + * Gets the attributes. + * @return The attributes. + */ + public Map getAttributes() { + return attributes; + } + + /** + * Gets the savedAttributes. + * @return The savedAttributes. + */ + public List getSavedAttributes() { + return savedAttributes; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/impl/Projectile.java b/Server/src/main/java/Server/core/game/node/entity/impl/Projectile.java new file mode 100644 index 000000000..bb54a252c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/impl/Projectile.java @@ -0,0 +1,562 @@ +package core.game.node.entity.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.chunk.ProjectileUpdateFlag; + +/** + * Represents a projectile to send. + * @author Emperor + */ +public class Projectile { + + /** + * The source node. + */ + private Entity source; + + /** + * The source's centered location. + */ + private Location sourceLocation; + + /** + * The victim. + */ + private Entity victim; + + /** + * The projectile's gfx id. + */ + private int projectileId; + + /** + * The start height. + */ + private int startHeight; + + /** + * The ending height. + */ + private int endHeight; + + /** + * The start delay. + */ + private int startDelay; + + /** + * The speed. + */ + private int speed; + + /** + * The angle. + */ + private int angle; + + /** + * The distance to start. + */ + private int distance; + + /** + * The end location (used for location based projectiles). + */ + private Location endLocation; + + /** + * Creates a new projectile. + * @param source The source entity. + * @param victim The victim. + * @param projectileId The projectile's gfx id; + * @return The created projectile. + */ + public static Projectile create(Entity source, Entity victim, int projectileId) { + int speed = (int) (46 + (getLocation(source).getDistance(victim.getLocation()) * 5)); + return new Projectile(source, victim, projectileId, 40, 36, 41, speed, 5, source == null ? 11 : source.size() << 5); + } + + /** + * Creates a new projectile. + * @param source The source node. + * @param victim The victim. + * @param projectileId The projectile's gfx id; + * @param startHeight The starting height. + * @param endHeight The ending height. + * @return The created projectile. + */ + public static Projectile create(Entity source, Entity victim, int projectileId, int startHeight, int endHeight) { + int speed = (int) (46 + (getLocation(source).getDistance(victim.getLocation()) * 5)); + return new Projectile(source, victim, projectileId, startHeight, endHeight, 41, speed, 5, source == null ? 11 : source.size() << 5); + } + + /** + * Creates a new projectile. + * @param source The source node. + * @param victim The victim. + * @param projectileId The projectile's gfx id; + * @param startHeight The starting height. + * @param endHeight The ending height. + * @param startDelay The start delay. + * @return The created projectile. + */ + public static Projectile create(Entity source, Entity victim, int projectileId, int startHeight, int endHeight, int startDelay) { + int speed = (int) (46 + (getLocation(source).getDistance(victim.getLocation()) * 5)); + return new Projectile(source, victim, projectileId, startHeight, endHeight, startDelay, speed, 5, source == null ? 11 : source.size() << 5); + } + + /** + * Creates a new projectile. + * @param source The source node. + * @param victim The victim. + * @param projectileId The projectile's gfx id; + * @param startHeight The starting height. + * @param endHeight The ending height. + * @param startDelay The start delay. + * @param speed The projectile speed. + * @return The created projectile. + */ + public static Projectile create(Entity source, Entity victim, int projectileId, int startHeight, int endHeight, int startDelay, int speed) { + return new Projectile(source, victim, projectileId, startHeight, endHeight, startDelay, speed, 5, source == null ? 11 : source.size() << 5); + } + + /** + * Creates a new projectile. + * @param source The source node. + * @param victim The victim. + * @param projectileId The projectile's gfx id; + * @param startHeight The starting height. + * @param endHeight The ending height. + * @param startDelay The start delay. + * @param speed The projectile speed. + * @param angle The angle. + * @return The created projectile. + */ + public static Projectile create(Entity source, Entity victim, int projectileId, int startHeight, int endHeight, int startDelay, int speed, int angle) { + return new Projectile(source, victim, projectileId, startHeight, endHeight, startDelay, speed, angle, source.size() << 5); + } + + /** + * Creates a new projectile. + * @param source The source node. + * @param victim The victim. + * @param projectileId The projectile's gfx id; + * @param startHeight The starting height. + * @param endHeight The ending height. + * @param startDelay The startDelay. + * @param speed The projectile speed. + * @param angle The angle. + * @param distance The distance to start from. + * @return The created projectile. + */ + public static Projectile create(Entity source, Entity victim, int projectileId, int startHeight, int endHeight, int startDelay, int speed, int angle, int distance) { + return new Projectile(source, victim, projectileId, startHeight, endHeight, startDelay, speed, angle, distance); + } + + /** + * Creates a new projectile. + * @param destination The victim. + * @param projectileId The projectile's gfx id; + * @param startHeight The starting height. + * @param endHeight The ending height. + * @param startDelay The startDelay. + * @param speed The projectile speed. + * @param angle The angle. + * @param distance The distance to start from. + * @return The created projectile. + */ + public static Projectile create(Location start, Location destination, int projectileId, int startHeight, int endHeight, int startDelay, int speed, int angle, int distance) { + return new Projectile(start, destination, projectileId, startHeight, endHeight, startDelay, speed, angle, distance); + } + + /** + * Creates a new magic-speed based projectile. + * @param source The source node. + * @param victim The victim. + * @param projectileId The projectile's gfx id; + * @param startHeight The starting height. + * @param endHeight The ending height. + * @param startDelay The start delay type. + * @param angle The angle. + * @return The created projectile. + */ + public static Projectile magic(Entity source, Entity victim, int projectileId, int startHeight, int endHeight, int startDelay, int angle) { + int speed = (int) (46 + (getLocation(source).getDistance(victim.getLocation()) * 10)); + return new Projectile(source, victim, projectileId, startHeight, endHeight, startDelay, speed, angle, source.size() << 5); + } + + /** + * Creates a new range-speed based projectile. + * @param source The source node. + * @param victim The victim. + * @param projectileId The projectile's gfx id; + * @param startHeight The starting height. + * @param endHeight The ending height. + * @param startDelay The start delay. + * @param angle The angle. + * @return The created projectile. + */ + public static Projectile ranged(Entity source, Entity victim, int projectileId, int startHeight, int endHeight, int startDelay, int angle) { + int speed = (int) (46 + (getLocation(source).getDistance(victim.getLocation()) * 5)); + return new Projectile(source, victim, projectileId, startHeight, endHeight, startDelay, speed, angle, source.size() << 5); + } + + /** + * Constructs a new {@code Projectile} {@code Object}. + */ + public Projectile() { + /* + * empty. + */ + } + + /** + * Constructs a new projectile. + * @param source The source node. + * @param victim The entity victim. + * @param projectileId The projectile gfx id. + * @param startHeight The start height. + * @param endHeight The end height. + * @param startDelay The start delay. + * @param speed The projectile speed. + * @param angle The projectile angle. + * @param distance The distance. + */ + private Projectile(Entity source, Entity victim, int projectileId, int startHeight, int endHeight, int startDelay, int speed, int angle, int distance) { + this.source = source; + this.sourceLocation = getLocation(source); + this.victim = victim; + this.projectileId = projectileId; + this.startHeight = startHeight; + this.endHeight = endHeight; + this.startDelay = startDelay; + this.speed = speed; + this.angle = angle; + this.distance = distance; + } + + /** + * Constructs a new {@code Projectile} {@code Object}. + * @param start The start location. + * @param projectileId The projectile id. + * @param startHeight The start height. + * @param endHeight The end height. + * @param startDelay The start delay. + * @param speed The speed. + * @param angle The angle. + * @param distance The distance. + */ + private Projectile(Location start, Location l, int projectileId, int startHeight, int endHeight, int startDelay, int speed, int angle, int distance) { + this.sourceLocation = start; + this.endLocation = l; + this.projectileId = projectileId; + this.startHeight = startHeight; + this.endHeight = endHeight; + this.startDelay = startDelay; + this.speed = speed; + this.angle = angle; + this.distance = distance; + } + + /** + * Gets the speed. + * @param source the source. + * @param targetLoc the target location. + * @return + */ + public static int getSpeed(Entity source, Location targetLoc) { + return (int) (46 + (getLocation(source).getDistance(targetLoc) * 5)); + } + + /** + * Gets the source location on construction. + * @param n The node. + * @return The centered location. + */ + public static Location getLocation(Entity n) { + if (n == null) { + return null; + } + return n.getCenterLocation(); + } + + /** + * Changes the projectile so it sends from the source mob to the victim mob + * given. + * @param source The source mob. + * @param victim The victim mob. + * @return The projectile instance. + */ + public Projectile transform(Entity source, Entity victim) { + return transform(source, victim, source instanceof NPC, 46, 5); + } + + /** + * Changes the projectile so it sends from the source mob to the victim mob + * given. + * @param source The source mob. + * @param victim The victim mob. + * @param npc If the source should be handled as an NPC. + * @param baseSpeed The base speed. + * @param modifiedSpeed The modified speed. + * @return The projectile instance. + */ + public Projectile transform(Entity source, Entity victim, boolean npc, int baseSpeed, int modifiedSpeed) { + this.source = source; + this.sourceLocation = getLocation(source); + this.victim = victim; + this.speed = (int) (baseSpeed + sourceLocation.getDistance(victim.getLocation()) * modifiedSpeed); + if (npc) { + this.distance = source.size() << 5; + } + return this; + } + + /** + * Gets a new {@code Projectile} {@code Object} based of this projectile + * object. + * @param source The source entity. + * @param victim The victim entity. + * @param speedMultiplier The speed multiplier. + * @return The created {@code Projectile} {@code Object}. + */ + public Projectile copy(Entity source, Entity victim, double speedMultiplier) { + // int distance = source instanceof NPC ? source.size() << 6 : 11; + int speed = (int) (this.speed + (source.getLocation().getDistance(victim.getLocation()) * speedMultiplier)); + return new Projectile(source, victim, projectileId, startHeight, endHeight, startDelay, speed, angle, distance); + } + + /** + * Transforms the projectile so it is location based and it sends to the + * location. + * @param source The source mob. + * @param l The location. + * @return The projectile instance. + */ + public Projectile transform(Entity source, Location l) { + return transform(source, l, source instanceof NPC, 46, 5); + } + + /** + * Transforms a projectile to be location based, with updated parameters. + * @param source The mob sending this projectile. + * @param l The end location. + * @param npc If the mob should be handled as an npc. + * @param baseSpeed The base speed. + * @param modifiedSpeed The modified speed. + * @return The projectile instance. + */ + public Projectile transform(Entity source, Location l, boolean npc, int baseSpeed, int modifiedSpeed) { + this.source = source; + this.sourceLocation = getLocation(source); + this.endLocation = l; + this.speed = (int) (baseSpeed + sourceLocation.getDistance(l) * modifiedSpeed); + if (npc) { + this.distance = source.size() << 5; + } + return this; + } + + /** + * Sends this projectile. + */ + public void send() { + send(this); + } + + /** + * Sends the projectile. + * @param p The projectile. + */ + public static void send(Projectile p) { + RegionManager.getRegionChunk(p.getSourceLocation()).flag(new ProjectileUpdateFlag(p)); + } + + /** + * Transforms the projectile (to start from the source & end at the victim) + * and sends it. + * @param source The source. + * @param victim The victim. + * @param p The projectile to send. + */ + public static void send(Entity source, Entity victim, Projectile p) { + send(p.transform(source, victim)); + } + + /** + * Transforms the projectile (to start from the source & end at the + * locations) and sends it. + * @param source The source. + * @param l The location. + * @param p The projectile to send. + */ + public static void send(Entity source, Location l, Projectile p) { + send(p.transform(source, l)); + } + + /** + * @param source The source node. + */ + public void setSource(Entity source) { + this.source = source; + } + + /** + * @return The source node. + */ + public Entity getSource() { + return source; + } + + /** + * @param sourceLocation the sourceLocation to set + */ + public void setSourceLocation(Location sourceLocation) { + this.sourceLocation = sourceLocation; + } + + /** + * @return the sourceLocation + */ + public Location getSourceLocation() { + return sourceLocation; + } + + /** + * @param victim The entity victim. + */ + public void setVictim(Entity victim) { + this.victim = victim; + } + + /** + * @return The entity victim. + */ + public Entity getVictim() { + return victim; + } + + /** + * @param projectileId the projectileId to set + */ + public void setProjectileId(int projectileId) { + this.projectileId = projectileId; + } + + /** + * @return the projectileId + */ + public int getProjectileId() { + return projectileId; + } + + /** + * @param startHeight the startHeight to set + */ + public void setStartHeight(int startHeight) { + this.startHeight = startHeight; + } + + /** + * @return the startHeight + */ + public int getStartHeight() { + return startHeight; + } + + /** + * @param endHeight the endHeight to set + */ + public void setEndHeight(int endHeight) { + this.endHeight = endHeight; + } + + /** + * @return the endHeight + */ + public int getEndHeight() { + return endHeight; + } + + /** + * @param delay the delay to set + */ + public void setStartDelay(int delay) { + this.startDelay = delay; + } + + /** + * @return the start delay. + */ + public int getStartDelay() { + return startDelay; + } + + /** + * @param speed the speed to set + */ + public void setSpeed(int speed) { + this.speed = speed; + } + + /** + * @return the speed + */ + public int getSpeed() { + return speed; + } + + /** + * @param angle the angle to set + */ + public void setAngle(int angle) { + this.angle = angle; + } + + /** + * @return the angle + */ + public int getAngle() { + return angle; + } + + /** + * @param distance the distance to set + */ + public void setDistance(int distance) { + this.distance = distance; + } + + /** + * @return the distance + */ + public int getDistance() { + return distance; + } + + /** + * Checks if the projectile is location based. + * @return {@code True} if so, {@code false} if not. + */ + public boolean isLocationBased() { + return endLocation != null; + } + + /** + * @return the endLocation + */ + public Location getEndLocation() { + return endLocation; + } + + /** + * @param endLocation the endLocation to set + */ + public void setEndLocation(Location endLocation) { + this.endLocation = endLocation; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/impl/Properties.java b/Server/src/main/java/Server/core/game/node/entity/impl/Properties.java new file mode 100644 index 000000000..6fcdd3ddd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/impl/Properties.java @@ -0,0 +1,560 @@ +package core.game.node.entity.impl; + +import core.game.container.Container; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatPulse; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.config.ItemConfigParser; +import core.game.system.config.NPCConfigParser; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Holds an entity's properties. + * @author Emperor + */ +public final class Properties { + + /** + * The entity. + */ + private final Entity entity; + + /** + * The entity's combat pulse. + */ + private final CombatPulse combatPulse; + + /** + * If the entity is retaliating. + */ + private boolean retaliating = true; + + /** + * If the entity is teleporting. + */ + private boolean teleporting; + + /** + * The entity's combat level. + */ + private int combatLevel; + + /** + * The entity's current attack style. + */ + private WeaponInterface.AttackStyle attackStyle; + + /** + * The current teleport destination location. + */ + private Location teleportLocation; + + /** + * The spawn location. + */ + private Location spawnLocation; + + /** + * The bonuses. + */ + private int[] bonuses = new int[15]; + + /** + * The current attack speed. + */ + private int attackSpeed = 4; + + /** + * The last animation end. + */ + private long lastAnimationEnd; + + /** + * The attack animation. + */ + private Animation attackAnimation = new Animation(422, Animator.Priority.HIGH); + + /** + * The defence animation. + */ + private Animation defenceAnimation = new Animation(404); + + /** + * The death animation. + */ + private Animation deathAnimation = new Animation(9055, Animator.Priority.HIGH); + + /** + * The range animation. + */ + private Animation rangeAnimation; + + /** + * The magic animation. + */ + private Animation magicAnimation; + + /** + * The current magic spell. + */ + private CombatSpell spell; + + /** + * The autocasted magic spell. + */ + private CombatSpell autocastSpell; + + /** + * The current armour set used. + */ + private ArmourSet armourSet; + + /** + * If the entity is standing in multizone. + */ + private boolean multiZone; + + /** + * If the entity is in a safe zone. + */ + private boolean safeZone; + + /** + * The combat time out ticks. + */ + private int combatTimeOut = 10; + + /** + * If the entity can walk over other NPCs in multiway combat zone. + */ + private boolean npcWalkable; + + /** + * The style the npc protects against. + */ + private CombatStyle protectStyle; + + /** + * Constructs a new {@code Properties} {@code Object}. + * @param entity + */ + public Properties(Entity entity) { + this.entity = entity; + this.combatPulse = new CombatPulse(entity); + } + + /** + * Updates the defence animation. + */ + public void updateDefenceAnimation() { + if (entity instanceof NPC) { + Animation animation = ((NPC) entity).getDefinition().getConfiguration(NPCConfigParser.DEFENCE_ANIMATION); + if (animation != null) { + defenceAnimation = animation; + } + return; + } + Container c = ((Player) entity).getEquipment(); + Item item = c.get(EquipmentContainer.SLOT_SHIELD); + if (item != null) { + defenceAnimation = item.getDefinition().getConfiguration(ItemConfigParser.DEFENCE_ANIMATION, Animation.create(1156)); + } else if ((item = c.get(EquipmentContainer.SLOT_WEAPON)) != null) { + defenceAnimation = item.getDefinition().getConfiguration(ItemConfigParser.DEFENCE_ANIMATION, Animation.create(424)); + } else { + defenceAnimation = Animation.create(397); + } + } + + /** + * Gets a combat animation by the index. + * @param index the index. + * @return the animation. + */ + public Animation getCombatAnimation(int index) { + return index == 0 ? attackAnimation : index == 1 ? magicAnimation : index == 2 ? rangeAnimation : index == 3 ? defenceAnimation : deathAnimation; + } + + /** + * Gets the entity. + * @return The entity. + */ + public Entity getEntity() { + return entity; + } + + /** + * Gets the teleporting. + * @return The teleporting. + */ + public boolean isTeleporting() { + return teleporting; + } + + /** + * Sets the teleporting. + * @param teleporting The teleporting to set. + */ + public void setTeleporting(boolean teleporting) { + this.teleporting = teleporting; + } + + /** + * Gets the combatLevel.
Deprecated Due to summoning-based combat level + * not being calculated in. + * @return The combatLevel. + */ + @Deprecated + public int getCombatLevel() { + return combatLevel; + } + + /** + * Gets the current combat level. + * @return The combat level. + */ + public int getCurrentCombatLevel() { + if (entity instanceof Player) { + Player player = (Player) entity; + if (player.getFamiliarManager().isUsingSummoning() || !player.getSkullManager().isWilderness()) { + return player.getFamiliarManager().getSummoningCombatLevel() + combatLevel; + } + } + return combatLevel; + } + + /** + * Sets the combatLevel. + * @param combatLevel The combatLevel to set. + */ + public void setCombatLevel(int combatLevel) { + this.combatLevel = combatLevel; + } + + /** + * Gets the attackStyle. + * @return The attackStyle. + */ + public WeaponInterface.AttackStyle getAttackStyle() { + return attackStyle; + } + + /** + * Sets the attackStyle. + * @param attackStyle The attackStyle to set. + */ + public void setAttackStyle(WeaponInterface.AttackStyle attackStyle) { + this.attackStyle = attackStyle; + } + + /** + * Gets the teleportLocation. + * @return The teleportLocation. + */ + public Location getTeleportLocation() { + return teleportLocation; + } + + /** + * Sets the teleportLocation. + * @param teleportLocation The teleportLocation to set. + */ + public void setTeleportLocation(Location teleportLocation) { + this.teleportLocation = teleportLocation; + } + + /** + * Gets the spawnLocation. + * @return The spawnLocation. + */ + public Location getSpawnLocation() { + return spawnLocation; + } + + /** + * Sets the spawnLocation. + * @param spawnLocation The spawnLocation to set. + */ + public void setSpawnLocation(Location spawnLocation) { + this.spawnLocation = spawnLocation; + } + + /** + * Gets the bonuses. + * @return The bonuses. + */ + public int[] getBonuses() { + return bonuses; + } + + /** + * Sets the bonuses. + * @param bonuses The bonuses to set. + */ + public void setBonuses(int[] bonuses) { + this.bonuses = bonuses; + } + + /** + * Gets the last animation end. + * @return The last animation end. + */ + public long getLastAnimationEnd() { + return lastAnimationEnd; + } + + /** + * Gets the combatPulse. + * @return The combatPulse. + */ + public CombatPulse getCombatPulse() { + return combatPulse; + } + + /** + * Gets the retaliating. + * @return The retaliating. + */ + public boolean isRetaliating() { + return retaliating; + } + + /** + * Sets the retaliating. + * @param retaliating The retaliating to set. + */ + public void setRetaliating(boolean retaliating) { + this.retaliating = retaliating; + } + + /** + * Gets the attackSpeed. + * @return The attackSpeed. + */ + public int getAttackSpeed() { + return attackSpeed; + } + + /** + * Sets the attackSpeed. + * @param attackSpeed The attackSpeed to set. + */ + public void setAttackSpeed(int attackSpeed) { + this.attackSpeed = attackSpeed; + } + + /** + * Gets the attackAnimation. + * @return The attackAnimation. + */ + public Animation getAttackAnimation() { + return attackAnimation; + } + + /** + * Sets the attackAnimation. + * @param attackAnimation The attackAnimation to set. + */ + public void setAttackAnimation(Animation attackAnimation) { + this.attackAnimation = attackAnimation; + } + + /** + * Gets the defenceAnimation. + * @return The defenceAnimation. + */ + public Animation getDefenceAnimation() { + return defenceAnimation; + } + + /** + * Sets the defenceAnimation. + * @param defenceAnimation The defenceAnimation to set. + */ + public void setDefenceAnimation(Animation defenceAnimation) { + this.defenceAnimation = defenceAnimation; + } + + /** + * Sets the spell. + * @param spell The spell to set. + */ + public void setSpell(CombatSpell spell) { + this.spell = spell; + if (spell != null) { + combatPulse.updateStyle(); + } + } + + /** + * Gets the spell. + * @return The spell. + */ + public CombatSpell getSpell() { + return spell; + } + + /** + * @return the autocastSpell. + */ + public CombatSpell getAutocastSpell() { + return autocastSpell; + } + + /** + * @param autocastSpell the autocastSpell to set. + */ + public void setAutocastSpell(CombatSpell autocastSpell) { + this.autocastSpell = autocastSpell; + } + + /** + * @return the armourSet. + */ + public ArmourSet getArmourSet() { + return armourSet; + } + + /** + * @param armourSet the armourSet to set. + */ + public void setArmourSet(ArmourSet armourSet) { + this.armourSet = armourSet; + } + + /** + * Gets the deathAnimation. + * @return The deathAnimation. + */ + public Animation getDeathAnimation() { + return deathAnimation; + } + + /** + * Sets the deathAnimation. + * @param deathAnimation The deathAnimation to set. + */ + public void setDeathAnimation(Animation deathAnimation) { + this.deathAnimation = deathAnimation; + } + + /** + * Gets the multiZone. + * @return The multiZone. + */ + public boolean isMultiZone() { + return multiZone; + } + + /** + * Sets the multiZone. + * @param multiZone The multiZone to set. + */ + public void setMultiZone(boolean multiZone) { + this.multiZone = multiZone; + } + + /** + * Gets the safeZone. + * @return The safeZone. + */ + public boolean isSafeZone() { + return safeZone; + } + + /** + * Sets the safeZone. + * @param safeZone The safeZone to set. + */ + public void setSafeZone(boolean safeZone) { + this.safeZone = safeZone; + } + + /** + * Gets the combatTimeOut. + * @return The combatTimeOut. + */ + public int getCombatTimeOut() { + return combatTimeOut; + } + + /** + * Sets the combatTimeOut. + * @param combatTimeOut The combatTimeOut to set. + */ + public void setCombatTimeOut(int combatTimeOut) { + this.combatTimeOut = combatTimeOut; + } + + /** + * Gets the npcWalkable. + * @return The npcWalkable. + */ + public boolean isNPCWalkable() { + return npcWalkable; + } + + /** + * Sets the npcWalkable. + * @param npcWalkable The npcWalkable to set. + */ + public void setNPCWalkable(boolean npcWalkable) { + this.npcWalkable = npcWalkable; + } + + /** + * Gets the rangeAnimation. + * @return the rangeAnimation + */ + public Animation getRangeAnimation() { + return rangeAnimation; + } + + /** + * Sets the rangeAnimation. + * @param rangeAnimation the rangeAnimation to set. + */ + public void setRangeAnimation(Animation rangeAnimation) { + this.rangeAnimation = rangeAnimation; + } + + /** + * Gets the magicAnimation. + * @return the magicAnimation + */ + public Animation getMagicAnimation() { + return magicAnimation; + } + + /** + * Sets the magicAnimation. + * @param magicAnimation the magicAnimation to set. + */ + public void setMagicAnimation(Animation magicAnimation) { + this.magicAnimation = magicAnimation; + } + + /** + * Gets the protectStyle. + * @return the protectStyle. + */ + public CombatStyle getProtectStyle() { + return protectStyle; + } + + /** + * Sets the protectStyle. + * @param protectStyle the protectStyle to set + */ + public void setProtectStyle(CombatStyle protectStyle) { + this.protectStyle = protectStyle; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/impl/PulseManager.java b/Server/src/main/java/Server/core/game/node/entity/impl/PulseManager.java new file mode 100644 index 000000000..c96270f41 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/impl/PulseManager.java @@ -0,0 +1,133 @@ +package core.game.node.entity.impl; + +import core.game.interaction.MovementPulse; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatPulse; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; + +/** + * Represents an entity's pulse manager. + * @author Emperor + */ +public final class PulseManager { + + /** + * The movement pulse. + */ + private Pulse current; + + /** + * Runs a pulse. + * @param pulse The pulse. + * @param pulseType The pulse type we're trying to run. + */ + public void run(Pulse pulse, String... pulseType) { + run(pulse, false, pulseType); + } + + public void run(Pulse pulse, boolean fast, String... pulseType) { + if (!clear(pulseType)) { + return; + } + pulse.start(); + if (pulse.isRunning()) { + if (fast) { + GameWorld.getPulser().submit(current = pulse); + } else { + GameWorld.getPulser().submit(current = pulse); + } + } + } + + /** + * Clears the pulses. + */ + public boolean clear(String... pulseType) { + if (current != null && current.isRunning()) { + if (pulseType.length > 0) { + int length = pulseType.length; + for (int i = 0; i < length; i++) { + if (!current.removeFor(pulseType[i])) { + return false; + } + } + } else if (!current.removeFor("unspecified")) { + return false; + } + current.stop(); + } + return true; + } + + /** + * Runs the unhandled reward pulse ("Nothing interesting happens.") + * @param player The player. + * @return The pulse. + * @param pulseType The pulse type. + */ + public Pulse runUnhandledAction(final Player player, String... pulseType) { + Pulse pulse = new Pulse(1, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("Nothing interesting happens."); + return true; + } + }; + run(pulse, pulseType); + return pulse; + } + + /** + * Checks if the current pulse moves the entity. + * @return {@code True} if so. + */ + public boolean isMovingPulse() { + if (current != null && !current.isRunning()) { + return false; + } + if (current instanceof CombatPulse) { + return true; + } + return current instanceof MovementPulse; + } + + /** + * Checks if a pulse is running. + * @return {@code True} if so. + */ + public boolean hasPulseRunning() { + return current != null && current.isRunning(); + } + + /** + * Cancels the death task, if any. + * @param e The entity. + */ + public static void cancelDeathTask(Entity e) { + if (!DeathTask.isDead(e) || e.getPulseManager().current == null) { + return; + } + e.getPulseManager().current.stop(); + } + + /** + * Sets the current pulse. + * @deprecated This should only be used by death pulse, use + * {@link #run(Pulse, String...)} instead. + */ + @Deprecated + public void set(Pulse schedule) { + this.current = schedule; + } + + /** + * Gets the current. + * @return The current. + */ + public Pulse getCurrent() { + return current; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/impl/WalkingQueue.java b/Server/src/main/java/Server/core/game/node/entity/impl/WalkingQueue.java new file mode 100644 index 000000000..159bb41b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/impl/WalkingQueue.java @@ -0,0 +1,449 @@ +package core.game.node.entity.impl; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.Point; +import core.game.world.map.RegionManager; +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks; + +import java.util.Deque; +import java.util.LinkedList; + +/** + * The walking queue. + * @author Emperor + */ +public final class WalkingQueue { + + /** + * The walking queue. + */ + private final Deque walkingQueue = new LinkedList(); + + /** + * The entity. + */ + private final Entity entity; + + /** + * The current walking direction. + */ + private int walkDir = -1; + + /** + * The current running direction. + */ + private int runDir = -1; + + /** + * If the entity is running (set to true when holding the ctrl button + + * click). + */ + private boolean running = false; + + /** + * If running is disabled. + */ + private boolean runDisabled; + + /** + * The last location this entity walked on. + */ + private Location footPrint; + + /** + * Constructs a new {@code WalkingQueue} {@code Object}. + * @param entity The entity. + */ + public WalkingQueue(Entity entity) { + this.entity = entity; + this.footPrint = entity.getLocation(); + } + + /** + * Updates the walking queue. + */ + public void update() { + boolean isPlayer = entity instanceof Player; + this.walkDir = -1; + this.runDir = -1; + if (updateTeleport()) { + return; + } + if (isPlayer && updateRegion(entity.getLocation(), true)) { + return; + } + Point point = walkingQueue.poll(); + if (point == null) { + updateRunEnergy(false); + return; + } + if (isPlayer && ((Player) entity).getSettings().getRunEnergy() < 1.0) { + running = false; + ((Player) entity).getSettings().setRunToggled(false); + } + Point runPoint = null; + if (point.getDirection() == null) { + point = walkingQueue.poll(); + } + int walkDirection = -1; + int runDirection = -1; + if (isRunningBoth() && (point == null || !point.isRunDisabled())) { + runPoint = walkingQueue.poll(); + } + if (point != null) { + if (point.getDirection() == null) { + return; + } + walkDirection = point.getDirection().ordinal(); + } + if (runPoint != null) { + runDirection = runPoint.getDirection().ordinal(); + } + int diffX = 0; + int diffY = 0; + if (walkDirection != -1) { + diffX = point.getDiffX(); + diffY = point.getDiffY(); + } + if (runDirection != -1) { + footPrint = entity.getLocation().transform(diffX, diffY, 0); + diffX += runPoint.getDiffX(); + diffY += runPoint.getDiffY(); + updateRunEnergy(true); + } else { + updateRunEnergy(false); + } + if (diffX != 0 || diffY != 0) { + Location walk = entity.getLocation(); + if (point != null) { + walk = walk.transform(point.getDiffX(), point.getDiffY(), 0); + if (!entity.getZoneMonitor().move(entity.getLocation(), walk)) { + reset(); + if (entity.getPulseManager().isMovingPulse()) { + entity.getPulseManager().clear(); // TODO: Check for + // bugs + } + return; + } + } + Location dest = entity.getLocation().transform(diffX, diffY, 0); + if (runPoint != null) { + if (!entity.getZoneMonitor().move(walk, dest)) { + dest = dest.transform(-runPoint.getDiffX(), -runPoint.getDiffY(), 0); + runPoint = null; + runDirection = -1; + reset(); + if (entity.getPulseManager().isMovingPulse()) { + entity.getPulseManager().clear(); // TODO: Check for + // bugs + } + } + } + if (runPoint != null) { + entity.setDirection(runPoint.getDirection()); + } else if (point != null) { + entity.setDirection(point.getDirection()); + } + footPrint = entity.getLocation(); + entity.setLocation(dest); + RegionManager.move(entity); + } + this.walkDir = walkDirection; + this.runDir = runDirection; + } + + /** + * Gets the energy drain rate for this player. + * @param player The player. + * @return The energy drain rate. + */ + private double getEnergyDrainRate(Player player) { + double rate = 0.55; + if (player.getSettings().getWeight() > 0.0) { + rate *= 1 + (player.getSettings().getWeight() / 100); + } + return rate; + } + + /** + * Gets the energy restore amount. + * @param player The player. + * @return The amount to restore. + */ + private double getEnergyRestore(Player player) { + double rate = 100 / ((175 - (player.getSkills().getLevel(Skills.AGILITY))) / 0.6); + return rate; + } + + /** + * Increases the current amount of run energy, and updates it. + * @param decrease If we should decrease the run energy. + */ + public void updateRunEnergy(boolean decrease) { + if (!(entity instanceof Player)) { + return; + } + Player p = (Player) entity; + if(decrease && SkillcapePerks.isActive(SkillcapePerks.MARATHON_RUNNER,p)){ + if(p.getAttribute("run-incrementer",0) == 3){ + p.setAttribute("run-incrementer",0); + return; + } + p.incrementAttribute("run-incrementer"); + } + if (!decrease && p.getSettings().getRunEnergy() >= 100.0) { + return; + } + double drain = decrease ? getEnergyDrainRate(p) : -getEnergyRestore(p); + p.getSettings().updateRunEnergy(drain); + } + + /** + * Checks if the player is teleporting, if so does the teleporting and + * returns true. + * @return {@code True} if the player is teleporting, {@code false} if not. + */ + public boolean updateTeleport() { + if (entity.getProperties().getTeleportLocation() != null) { + reset(false); + entity.setLocation(entity.getProperties().getTeleportLocation()); + entity.getProperties().setTeleportLocation(null); + if (entity instanceof Player) { + Player p = (Player) entity; + Location last = p.getPlayerFlags().getLastSceneGraph(); + if (last == null) { + last = p.getLocation(); + } + if ((last.getRegionX() - entity.getLocation().getRegionX()) >= 4 || (last.getRegionX() - entity.getLocation().getRegionX()) <= -4) { + p.getPlayerFlags().setUpdateSceneGraph(true); + } else if ((last.getRegionY() - entity.getLocation().getRegionY()) >= 4 || (last.getRegionY() - entity.getLocation().getRegionY()) <= -4) { + p.getPlayerFlags().setUpdateSceneGraph(true); + } + } + RegionManager.move(entity); + footPrint = entity.getLocation(); + entity.getProperties().setTeleporting(true); + return true; + } + return false; + } + + /** + * Checks if the region should be updated, if so we set the update flag and + * return true. + * @return {@code True} if the region updated, {@code false} if not. + */ + public boolean updateRegion(Location location, boolean move) { + Player p = (Player) entity; + Location lastRegion = p.getPlayerFlags().getLastSceneGraph(); + if (lastRegion == null) { + lastRegion = location; + } + int rx = lastRegion.getRegionX(); + int ry = lastRegion.getRegionY(); + int cx = location.getRegionX(); + int cy = location.getRegionY(); + if ((rx - cx) >= 4) { + p.getPlayerFlags().setUpdateSceneGraph(true); + } else if ((rx - cx) <= -4) { + p.getPlayerFlags().setUpdateSceneGraph(true); + } + if ((ry - cy) >= 4) { + p.getPlayerFlags().setUpdateSceneGraph(true); + } else if ((ry - cy) <= -4) { + p.getPlayerFlags().setUpdateSceneGraph(true); + } + if (move && p.getPlayerFlags().isUpdateSceneGraph()) { + RegionManager.move(entity); + return true; + } + return false; + } + + /** + * Walks back to the last location. + */ + public void walkBack() { + entity.getPulseManager().clear(); + reset(); + addPath(footPrint.getX(), footPrint.getY()); + } + + /** + * Adds a path to the walking queue. + * @param x The last x-coordinate of the path. + * @param y The last y-coordinate of the path. + */ + public void addPath(int x, int y) { + addPath(x, y, runDisabled); + } + + /** + * Adds a path to the walking queue. + * @param x The last x-coordinate of the path. + * @param y The last y-coordinate of the path. + * @param runDisabled If running is disabled for this walking path. + */ + public void addPath(int x, int y, boolean runDisabled) { + Point point = walkingQueue.peekLast(); + if (point == null) { + return; + } + int diffX = x - point.getX(), diffY = y - point.getY(); + int max = Math.max(Math.abs(diffX), Math.abs(diffY)); + for (int i = 0; i < max; i++) { + if (diffX < 0) { + diffX++; + } else if (diffX > 0) { + diffX--; + } + if (diffY < 0) { + diffY++; + } else if (diffY > 0) { + diffY--; + } + addPoint(x - diffX, y - diffY, runDisabled); + } + } + + /** + * Adds a point to the walking queue. + * @param x The x-coordinate of the point. + * @param y The y-coordinate of the point. + */ + public void addPoint(int x, int y, boolean runDisabled) { + Point point = walkingQueue.peekLast(); + if (point == null) { + return; + } + int diffX = x - point.getX(), diffY = y - point.getY(); + Direction direction = Direction.getDirection(diffX, diffY); + if (direction != null) { + walkingQueue.add(new Point(x, y, direction, diffX, diffY, runDisabled)); + } + } + + /** + * Checks if the entity is running. + * @return {@code True} if a ctrl + click reward was performed,
the + * player has the run option enabled or the NPC is a familiar,

+ * {@code false} if not. + */ + public boolean isRunningBoth() { + if (entity instanceof Player && ((Player) entity).getSettings().isRunToggled()) { + return true; + } + return running; + } + + /** + * Checks if the entity has a path to walk. + * @return {@code True} if so. + */ + public boolean hasPath() { + if (!walkingQueue.isEmpty()) { + Point p = walkingQueue.peek(); + return p.getDirection() != null; + } + return false; + } + + /** + * Checks if the entity is moving. + * @return {@code True} if so. + */ + public boolean isMoving() { + return walkDir != -1 || runDir != -1; + } + + /** + * Resets the walking queue. + */ + public void reset() { + reset(running); + } + + /** + * Resets the walking queue. + * @param running The running flag (ctrl + click reward). + */ + public void reset(boolean running) { + walkingQueue.clear(); + walkingQueue.add(new Point(entity.getLocation().getX(), entity.getLocation().getY())); + this.running = running; + } + + /** + * Gets the current walking direction. + * @return The walk direction. + */ + public int getWalkDir() { + return walkDir; + } + + /** + * Gets the current run direction. + * @return The run direction. + */ + public int getRunDir() { + return runDir; + } + + /** + * Sets the running flag. + * @param running The running flag. + */ + public void setRunning(boolean running) { + this.running = running; + } + + /** + * Checks if the player is running. + * @return {@code True} if so. + */ + public boolean isRunning() { + return running; + } + + /** + * @return the footPrint + */ + public Location getFootPrint() { + return footPrint; + } + + /** + * @param footPrint the footPrint to set + */ + public void setFootPrint(Location footPrint) { + this.footPrint = footPrint; + } + + /** + * Gets the walking queue. + * @return The queue. + */ + public Deque getQueue() { + return walkingQueue; + } + + /** + * Gets the runDisabled. + * @return The runDisabled. + */ + public boolean isRunDisabled() { + return runDisabled; + } + + /** + * Sets the runDisabled. + * @param runDisabled The runDisabled to set. + */ + public void setRunDisabled(boolean runDisabled) { + this.runDisabled = runDisabled; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/lock/ActionLocks.java b/Server/src/main/java/Server/core/game/node/entity/lock/ActionLocks.java new file mode 100644 index 000000000..af76575a1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/lock/ActionLocks.java @@ -0,0 +1,252 @@ +package core.game.node.entity.lock; + +import core.game.node.Node; +import core.game.world.GameWorld; + +import java.util.HashMap; +import java.util.Map; + +/** + * Holds the reward locks. + * @author Emperor + * @author Aero + */ +public final class ActionLocks { + + /** + * The movement lock. + */ + private Lock movementLock = new Lock(); + + /** + * The teleporting lock. + */ + private Lock teleportLock = new Lock(); + + /** + * The component lock. + */ + private Lock componentLock = new Lock(); + + /** + * The interaction lock. + */ + private Lock interactionLock = new Lock(); + + /** + * The equipment lock. + */ + private Lock equipmentLock = null; + + /** + * A mapping of custom locks (used for eg. food delay). + */ + private Map customLocks; + + /** + * Constructs a new {@code ActionLocks} {@code Object}. + */ + public ActionLocks() { + this.customLocks = new HashMap<>(); + } + + /** + * Locks all default actions (movement, teleport & interaction) for + * indefinite time. + */ + public void lock() { + lock(Integer.MAX_VALUE - GameWorld.getTicks()); + } + + /** + * Locks all the default actions (movement, teleport & interaction). + * @param ticks The amount of ticks to lock for. + */ + public void lock(int ticks) { + lockMovement(ticks); + lockTeleport(ticks); + lockInteractions(ticks); + } + + /** + * Unlocks the default actions. + */ + public void unlock() { + unlockMovement(); + unlockTeleport(); + unlockInteraction(); + } + + /** + * Locks the movement actions. + * @param ticks The amount of ticks to lock for. + */ + public void lockMovement(int ticks) { + movementLock.lock(ticks); + } + + /** + * Unlocks the movement lock. + */ + public void unlockMovement() { + movementLock.unlock(); + } + + /** + * Checks if movement actions are locked. + * @return {@code True} if so. + */ + public boolean isMovementLocked() { + return movementLock.isLocked(); + } + + /** + * Locks the teleport actions. + * @param ticks The amount of ticks to lock for. + */ + public void lockTeleport(int ticks) { + teleportLock.lock(ticks); + } + + /** + * Unlocks the teleport lock. + */ + public void unlockTeleport() { + teleportLock.unlock(); + } + + /** + * Checks if teleport actions are locked. + * @return {@code True} if so. + */ + public boolean isTeleportLocked() { + return teleportLock.isLocked(); + } + + /** + * Locks the component actions. + * @param ticks The amount of ticks to lock for. + */ + public void lockComponent(int ticks) { + componentLock.lock(ticks); + } + + /** + * Unlocks the component lock. + */ + public void unlockComponent() { + componentLock.unlock(); + } + + /** + * Checks if component actions are locked. + * @return {@code True} if so. + */ + public boolean isComponentLocked() { + return componentLock.isLocked(); + } + + /** + * Locks the interaction actions. + * @param ticks The amount of ticks to lock for. + */ + public void lockInteractions(int ticks) { + interactionLock.lock(ticks); + } + + /** + * Unlocks the interaction lock. + */ + public void unlockInteraction() { + interactionLock.unlock(); + } + + /** + * Checks if interaction actions are locked. + * @return {@code True} if so. + */ + public boolean isInteractionLocked() { + return interactionLock.isLocked(); + } + + /** + * Locks the lock for the given key. + * @param key The key. + * @param ticks The amount of ticks to lock for. + * @return The lock object. + */ + public Lock lock(String key, int ticks) { + return lock(key, ticks, null); + } + + /** + * Locks the lock for the given key. + * @param key The key. + * @param ticks The amount of ticks to lock for. + * @param elapse The elapse event. + * @return The lock object. + */ + public Lock lock(String key, int ticks, LockElapse elapse) { + Lock lock = customLocks.get(key); + if (lock == null) { + customLocks.put(key, lock = new Lock()); + } + lock.setElapse(elapse).lock(ticks); + return lock; + } + + /** + * Unlocks the lock for the given key and removes it from the cache. + * @param key The key. + * @param node The node. + */ + public void unlock(String key, Node node) { + unlock(key, true, node); + } + + /** + * Unlocks the lock for the given key. + * @param key The key. + * @param cacheRemove If the lock can be removed from the cache. + * @param node The node. + */ + public void unlock(String key, boolean cacheRemove, Node node) { + Lock lock = customLocks.get(key); + if (lock != null) { + lock.unlock(); + if (lock.getElapseEvent() != null) { + lock.getElapseEvent().elapse(node, lock); + } + if (cacheRemove) { + customLocks.remove(key); + } + } + } + + /** + * Checks if the lock for the given key is currently locked. + * @param key The key. + * @return {@code True} if so. + */ + public boolean isLocked(String key) { + Lock lock = customLocks.get(key); + return lock != null && lock.isLocked(); + } + + /** + * Gets the equipmentLock. + * @return The equipmentLock. + */ + public Lock getEquipmentLock() { + return equipmentLock; + } + + /** + * Sets the equipmentLock. + * @param equipmentLock The equipmentLock to set. + */ + public void setEquipmentLock(Lock equipmentLock) { + this.equipmentLock = equipmentLock; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/lock/Lock.java b/Server/src/main/java/Server/core/game/node/entity/lock/Lock.java new file mode 100644 index 000000000..efa739c03 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/lock/Lock.java @@ -0,0 +1,108 @@ +package core.game.node.entity.lock; + +import core.game.world.GameWorld; + +/** + * Represents a lock. + * @author Emperor + * @author Aero + */ +public class Lock { + + /** + * The expiration of the lock. + */ + private int expiration; + + /** + * The custom lock elapse. + */ + private LockElapse elapse; + + /** + * The message to be sent when the lock is called upon. + */ + private String message; + + /** + * Constructs a new {@code Lock} {@code Object}. + */ + public Lock() { + this(null); + } + + /** + * Constructs a new {@code Lock} {@code Object}. + * @param message The message. + */ + public Lock(String message) { + this.message = message; + } + + /** + * Locks for an indefinite time. + */ + public void lock() { + lock(Integer.MAX_VALUE - GameWorld.getTicks()); + } + + /** + * Locks this lock. + * @param ticks The amount of ticks to lock for. + */ + public void lock(int ticks) { + if (ticks > expiration - GameWorld.getTicks()) { + this.expiration = GameWorld.getTicks() + ticks; + } + } + + /** + * Unlocks the lock. + */ + public void unlock() { + this.expiration = 0; + } + + /** + * Checks if this lock is locked. + * @return {@code True} if so. + */ + public boolean isLocked() { + return expiration > GameWorld.getTicks(); + } + + /** + * Sets the custom lock elapse. + * @param elapse The elapse. + * @return The lock instance for chaining. + */ + public Lock setElapse(LockElapse elapse) { + this.elapse = elapse; + return this; + } + + /** + * Gets the custom lock elapse event. + * @return The custom lock elapse event. + */ + public LockElapse getElapseEvent() { + return elapse; + } + + /** + * Gets the message. + * @return The message. + */ + public String getMessage() { + return message; + } + + /** + * Sets the message. + * @param message The message to set. + */ + public void setMessage(String message) { + this.message = message; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/lock/LockElapse.java b/Server/src/main/java/Server/core/game/node/entity/lock/LockElapse.java new file mode 100644 index 000000000..5ca116dea --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/lock/LockElapse.java @@ -0,0 +1,18 @@ +package core.game.node.entity.lock; + +import core.game.node.Node; + +/** + * Called after the expiration of a custom reward lock. + * @author Aero + */ +public interface LockElapse { + + /** + * Called when a custom reward lock has elapsed. + * @param node The node. + * @param lock The custom reward lock. + */ + public void elapse(Node node, Lock lock); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/AbstractNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/AbstractNPC.java new file mode 100644 index 000000000..7d03735ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/AbstractNPC.java @@ -0,0 +1,104 @@ +package core.game.node.entity.npc; + +import core.game.system.SystemLogger; +import core.game.world.map.Location; +import core.plugin.Plugin; + +import java.util.HashMap; +import java.util.Map; + +/** + * Used as superclass for "special NPC" plugins. + * @author Emperor + */ +public abstract class AbstractNPC extends NPC implements Plugin { + + /** + * The abstract NPC mapping. + */ + protected static Map mapping = new HashMap<>(); + + /** + * Constructs a new {@code AbstractNPC} {@Code Object}. + * @param id The id. + * @param location The location. + */ + public AbstractNPC(int id, Location location) { + this(id, location, true); + } + + /** + * Constructs a new {@code AbstractNPC} {@Code Object}. + * @param id The id. + * @param location The location. + * @param autowalk If the NPC should move around. + */ + public AbstractNPC(int id, Location location, boolean autowalk) { + super(id, location); + super.setWalks(autowalk); + } + + /** + * Configures default boss data. + */ + public void configureBossData() { + getProperties().setNPCWalkable(true); + getProperties().setCombatTimeOut(2); + if (!isAggressive()) { + setAggressive(true); + setDefaultBehavior(); + } + if (getAggressiveHandler() != null) { + getAggressiveHandler().setChanceRatio(6); + getAggressiveHandler().setAllowTolerance(false); + getAggressiveHandler().setTargetSwitching(true); + getAggressiveHandler().setRadius(64); + } + walkRadius = 64; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : getIds()) { + if (mapping.containsKey(id)) { + String name = mapping.get(id).getClass().getSimpleName(); + if (name != getClass().getSimpleName()) { + SystemLogger.logErr("[" + getClass().getSimpleName() + "] - Warning: Mapping already contained NPC id " + id + "! (" + name + ")"); + continue; + } + } + mapping.put(id, this); + } + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Constructs a new instance of this abstract NPC. + * @param id The npc id. + * @param location The location. + * @param objects TODO + * @return The abstract npc instance. + */ + public abstract AbstractNPC construct(int id, Location location, Object... objects); + + /** + * Gets the NPC ids using this abstract NPC handler. + * @return The NPC ids. + */ + public abstract int[] getIds(); + + /** + * Gets the abstract NPC object for this NPC id. + * @param npcId The NPC id. + * @return The abstract NPC "loader" object for the given NPC id. + */ + public static AbstractNPC forId(int npcId) { + return mapping.get(npcId); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/IdleAbstractNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/IdleAbstractNPC.java new file mode 100644 index 000000000..6c96cda72 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/IdleAbstractNPC.java @@ -0,0 +1,139 @@ +package core.game.node.entity.npc; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Handles NPCs that are idle on default but can be disturbed (rock crabs, kraken, ...) + * @author Emperor + * + */ +public abstract class IdleAbstractNPC extends AbstractNPC { + + /** + * The active NPC id. + */ + private int activeId; + + /** + * If the NPC is currently idle. + */ + private boolean idle = true; + + /** + * The timeout ticks. + */ + protected int timeout = 30; //18 second time out to go idle again + + /** + * Constructs a new {@code IdleAbstractNPC} {@code Object}. + * @param idleId The NPC id. + * @param location The location. + */ + public IdleAbstractNPC(int idleId, int activeId, Location location) { + super(idleId, location); + this.activeId = activeId; + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!idle && !getProperties().getCombatPulse().isAttacking()) { + long time = getAttribute("combat-time", 0l); + if ((System.currentTimeMillis() - time) > (timeout * 600)) { + goIdle(); + } + } + } + + @Override + public void init() { + super.init(); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (isInvisible()) { + return false; + } + if (getTask() != null && entity instanceof Player && getTask().levelReq > entity.getSkills().getStaticLevel(Skills.SLAYER)) { + ((Player) entity).getPacketDispatch().sendMessage("You need a higher slayer level to know how to wound this monster."); + } + if (DeathTask.isDead(this)) { + return false; + } + if (!entity.getZoneMonitor().continueAttack(this, style)) { + return false; + } + return true; + } + + /** + * Checks if the entity is in range for disturbing this NPC. + * @param disturber The entity. + * @return {@code True} if so. + */ + public boolean inDisturbingRange(Entity disturber) { + if (idle && disturber.getSwingHandler(false).canSwing(disturber, this) != InteractionType.NO_INTERACT) { + return true; + } + return false; + } + + /** + * Checks if the entity can currently disturb this NPC (and returns {@code true}), or returns {@code false}. + * @param disturber The disturber. + * @return {@code True} if the entity could disturb this NPC. + */ + public boolean canDisturb(Entity disturber) { + return idle; + } + + /** + * Disturbs the NPC so it becomes active. + * @param disturber The entity disturbing this NPC. + */ + public void disturb(Entity disturber) { + if (disturber != null) { + disturber.getProperties().getCombatPulse().setCombatFlags(this); + } else { + setAttribute("combat-time", System.currentTimeMillis() + 10000); + } + getProperties().getCombatPulse().attack(disturber); + transform(activeId); + idle = false; + } + + /** + * Makes the NPC go idle again. + */ + public void goIdle() { + if (idle) { + return; + } + idle = true; + reTransform(); + } + + /** + * Gets the idle value. + * @return The idle. + */ + public boolean isIdle() { + return idle; + } + + /** + * Sets the idle value. + * @param idle The idle to set. + */ + public void setIdle(boolean idle) { + this.idle = idle; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/Metamorphosis.java b/Server/src/main/java/Server/core/game/node/entity/npc/Metamorphosis.java new file mode 100644 index 000000000..db5b42415 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/Metamorphosis.java @@ -0,0 +1,94 @@ +package core.game.node.entity.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.pet.Pets; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * A superclass plugin for any pets that have a metamorphosis option. + * @author Empathy + * + */ +public abstract class Metamorphosis extends OptionHandler { + + /** + * The ids of the possible npcs to metamorph into. + */ + protected int[] ids; + + + /** + * Constructs a new {@code Metamorphosis} {@code Object}. + * @param ids the id to transform. + */ + public Metamorphosis(int...ids) { + this.ids = ids; + } + + /** + * The dialogue plugin for the pet. + * @return the plugin. + */ + public abstract DialoguePlugin getDialoguePlugin(); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : getIds()) { + NPCDefinition.forId(id).getHandlers().put("option:metamorphosis", this); + } + if (getDialoguePlugin() != null) { + PluginManager.definePlugin(getDialoguePlugin()); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Familiar familiar = (Familiar) node; + switch (option) { + case "metamorphosis": + if (player.getFamiliarManager().isOwner(familiar)) { + int newNpc = player.getFamiliarManager().getFamiliar().getId(); + while (newNpc == player.getFamiliarManager().getFamiliar().getId()) { + newNpc = getRandomNpcId(); + } + for (Pets p : Pets.values()) { + if (p.getBabyNpcId() == newNpc) { + player.getFamiliarManager().morphPet(new Item(p.getBabyItemId()), false, player.getFamiliarManager().getFamiliar().getLocation()); + break; + } + } + player.getPacketDispatch().sendMessage("You transform your " + player.getFamiliarManager().getFamiliar().getName() + "!"); + } else { + player.getPacketDispatch().sendMessage("This is not your familiar."); + } + break; + } + return true; + } + + /** + * Gets a random npc id. + * @return + */ + public int getRandomNpcId() { + int i = RandomFunction.getRandom(getIds().length - 1); + return getIds()[i]; + } + + /** + * Gets the npc ids. + * @return the id. + */ + public int[] getIds() { + return ids; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/NPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/NPC.java new file mode 100644 index 000000000..3b6f786e6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/NPC.java @@ -0,0 +1,993 @@ +package core.game.node.entity.npc; + +import core.cache.def.impl.NPCDefinition; +import core.game.system.config.NPCConfigParser; +import core.game.system.config.ShopParser; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.shop.Shop; +import core.game.content.jobs.JobManager; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.slayer.Tasks; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.interaction.Interaction; +import core.game.interaction.MovementPulse; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.DefaultCombatSpell; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.npc.agg.AggressiveBehavior; +import core.game.node.entity.npc.agg.AggressiveHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.path.Pathfinder; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.npc.NPCFaceEntity; +import core.game.world.update.flag.npc.NPCFaceLocation; +import core.game.world.update.flag.npc.NPCForceChat; +import core.game.world.update.flag.npc.NPCSwitchId; +import core.tools.RandomFunction; + +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.*; + +/** + * Represents a non-player character. + * @author Emperor + */ +public class NPC extends Entity { + + /** + * The non-player character's id. + */ + private int id; + + /** + * The original NPC id. + */ + private final int originalId; + + /** + * The NPC definitions. + */ + private NPCDefinition definition; + + /** + * If the NPC walks; + */ + private boolean walks; + + /** + * If the NPC is aggressive. + */ + private boolean aggressive; + + /** + * Represents if the NPC will respawn. + */ + private boolean respawn = true; + + /** + * The movement path of the NPC. + */ + protected Location[] movementPath; + + /** + * The walking radius. + */ + protected int walkRadius = 11; + + /** + * The movement index. + */ + protected int movementIndex; + + /** + * The respawn tick. + */ + private int respawnTick = -1; + + /** + * If the NPC walks bound to a path. + */ + protected boolean pathBoundMovement; + + /** + * The current dialogue. + */ + protected Player dialoguePlayer; + + /** + * The aggressive handler of the NPC. + */ + protected AggressiveHandler aggressiveHandler; + + /** + * The walk back radius. + */ + protected int nextWalk; + + /** + * The children NPCs. + */ + private NPC[] children; + + /** + * The amount of slayer experience received when killing this NPC. + */ + private double slayerExperience; + + /** + * The slayer task. + */ + private Tasks task; + + /** + * If the npc can never walk. + */ + private boolean neverWalks; + + /** + * The shop of this npc. + */ + private Shop shop; + + /** + * The force talk string. + */ + private String forceTalk; + + /** + * Constructs a new {@code NPC} {@code Object}. + * @param id The NPC id. + */ + public NPC(int id) { + this(id, null); + } + + /** + * Constructs a new {@code NPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + protected NPC(int id, Location location, Direction direction) { + super(NPCDefinition.forId(id).getName(), location); + this.id = id; + this.originalId = id; + this.definition = NPCDefinition.forId(id); + super.size = definition.size; + super.direction = direction; + super.interaction = new Interaction(this); + } + + /** + * Constructs a new {@code NPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public NPC(int id, Location location) { + this(id, location, Direction.SOUTH); + } + + /** + * Creates a new NPC object. + * @param id The NPC id. + * @param location The location. + * @param direction the dir. + * @param objects the objects. + * @return The NPC object. + */ + public static NPC create(int id, Location location, Direction direction, Object... objects) { + NPC n = AbstractNPC.forId(id); + if (n != null) { + n = ((AbstractNPC) n).construct(id, location, objects); + } + if (n == null) { + n = new NPC(id, location, direction); + } + return n; + } + + /** + * Creates a new NPC object. + * @param id the id. + * @param location the location. + * @return the npc object. + */ + public static NPC create(int id, Location location, Object... objects) { + return create(id, location, Direction.SOUTH, objects); + } + + @Override + public void init() { + super.init(); + getProperties().setSpawnLocation(getLocation()); + initConfig(); + Repository.getNpcs().add(this); + RegionManager.move(this); + if (getViewport().getRegion().isActive()) { + Repository.addRenderableNPC(this); + } + interaction.setDefault(); + configure(); + setDefaultBehavior(); + if (definition.childNPCIds != null) { + children = new NPC[definition.childNPCIds.length]; + for (int i = 0; i < children.length; i++) { + NPC npc = children[i] = new NPC(definition.childNPCIds[i]); + npc.interaction.setDefault(); + npc.index = index; + npc.size = size; + } + } + if (definition.hasAction("trade")) { + shop = ShopParser.Companion.getSHOPS().get(getId()); + if (shop != null) { + shop = shop.copy(); + } + } + if (definition.hasAction("sew")) { + shop = ShopParser.Companion.getSHOPS().get(getId()); + if (shop != null) { + shop = shop.copy(); + } + } + } + + @Override + public void clear() { + super.clear(); + Repository.removeRenderableNPC(this); + Repository.getNpcs().remove(this); + getViewport().setCurrentPlane(null); + // getViewport().setRegion(null); + } + + /** + * Initializes the configurations. + */ + public void initConfig() { + int defaultLevel = definition.getCombatLevel() / 2; + getProperties().setCombatLevel(definition.getCombatLevel()); + getSkills().setStaticLevel(Skills.ATTACK, definition.getConfiguration(NPCConfigParser.ATTACK_LEVEL, defaultLevel)); + getSkills().setStaticLevel(Skills.STRENGTH, definition.getConfiguration(NPCConfigParser.STRENGTH_LEVEL, defaultLevel)); + getSkills().setStaticLevel(Skills.DEFENCE, definition.getConfiguration(NPCConfigParser.DEFENCE_LEVEL, defaultLevel)); + getSkills().setStaticLevel(Skills.RANGE, definition.getConfiguration(NPCConfigParser.RANGE_LEVEL, defaultLevel)); + getSkills().setStaticLevel(Skills.MAGIC, definition.getConfiguration(NPCConfigParser.MAGIC_LEVEL, defaultLevel)); + getSkills().setStaticLevel(Skills.HITPOINTS, definition.getConfiguration(NPCConfigParser.LIFEPOINTS, defaultLevel)); + int lp = getSkills().getMaximumLifepoints(); + if (this instanceof Familiar) { + lp = getAttribute("hp", lp); + } + getSkills().setLevel(Skills.HITPOINTS, lp); + aggressive = definition.getConfiguration(NPCConfigParser.AGGRESSIVE, aggressive); + Animation anim = null; + for (int i = 0; i < 3; i++) { + if (definition.getCombatAnimation(i) != null) { + getProperties().setAttackAnimation(anim = definition.getCombatAnimation(i)); + break; + } + } + if (definition.getCombatAnimation(3) != null) { + getProperties().setDefenceAnimation(definition.getCombatAnimation(3)); + } + if (definition.getCombatAnimation(4) != null) { + getProperties().setDeathAnimation(definition.getCombatAnimation(4)); + } + if (definition.getCombatAnimation(1) != null) { + getProperties().setMagicAnimation(definition.getCombatAnimation(1)); + } + if (definition.getCombatAnimation(2) != null) { + getProperties().setRangeAnimation(definition.getCombatAnimation(2)); + } + if (getProperties().getAttackAnimation() == null && anim != null) { + getProperties().setAttackAnimation(anim); + } + if (getProperties().getMagicAnimation() == null && anim != null) { + getProperties().setMagicAnimation(anim); + } + if (getProperties().getRangeAnimation() == null && anim != null) { + getProperties().setRangeAnimation(anim); + } + definition.initCombatGraphics(definition.getHandlers()); + getProperties().setBonuses(definition.getConfiguration(NPCConfigParser.BONUSES, new int[15])); + getProperties().setAttackSpeed(definition.getConfiguration(NPCConfigParser.ATTACK_SPEED, 5)); + forceTalk = definition.getConfiguration("force_talk", null); + if (definition.getConfiguration("movement_radius") != null) { + this.setWalkRadius(definition.getConfiguration("movement_radius")); + } + } + + /** + * Opens the shop for a player. + * @param player the player. + * @return {@code True} if so. + */ + public boolean openShop(Player player) { + shop = null; + if(shop != null){ + player.debug("testing new shop for: " + name); + } + if (shop == null) { + shop = ShopParser.Companion.getSHOPS().get(getId()); + if (shop == null) { + return false; + } + } + if (getName().contains("assistant")) { + NPC n = RegionManager.getNpc(this, getId() - 1); + if (n != null) { + return n.openShop(player); + } + } + shop.open(player); + + //Fix for issue #11 for shops keeping dialogue open. + DialoguePlugin dialogue = player.getDialogueInterpreter().getDialogue(); + if (dialogue != null) + dialogue.end(); + return true; + } + + @Override + public boolean isInvisible() { + if (!isActive() || getRespawnTick() > GameWorld.getTicks()) { + return true; + } + return super.isInvisible(); + } + + /** + * Checks if the NPC is hidden for the player. + * @param player The player. + * @return {@code True} if so. + */ + public boolean isHidden(Player player) { + return isInvisible(); + } + + /** + * Sets the default aggressive behavior of the NPC. + */ + public void setDefaultBehavior() { + if (aggressive && definition.getCombatLevel() > 0) { + aggressiveHandler = new AggressiveHandler(this, AggressiveBehavior.DEFAULT); + aggressiveHandler.setRadius(definition.getConfiguration(NPCConfigParser.AGGRESSIVE_RADIUS, 4)); + } + } + + /** + * Configures the movement path. + * @param movementPath The movement path. + */ + public void configureMovementPath(Location... movementPath) { + this.movementPath = movementPath; + this.movementIndex = 0; + this.pathBoundMovement = true; + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + Entity entity = state.getAttacker(); + if (task != null && entity instanceof Player && task.levelReq > entity.getSkills().getStaticLevel(Skills.SLAYER)) { + state.neutralizeHits(); + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if ((entity instanceof Player && !definition.hasAction("attack")) || isInvisible()) { + return false; + } + if (task != null && entity instanceof Player && task.levelReq > entity.getSkills().getStaticLevel(Skills.SLAYER)) { + ((Player) entity).getPacketDispatch().sendMessage("You need a higher slayer level to know how to wound this monster."); + } + return super.isAttackable(entity, style); + } + + @Override + public int getDragonfireProtection(boolean fire) { + return 0; + } + + @Override + public void tick() { + if (!getViewport().getRegion().isActive()) { + onRegionInactivity(); + return; + } + if (respawnTick > GameWorld.getTicks()) { + return; + } + if (respawnTick == GameWorld.getTicks()) { + onRespawn(); + } + handleTickActions(); + super.tick(); + } + + /** + * Called when the NPC respawns. + */ + protected void onRespawn() { + + } + + /** + * Handles the automatic actions of the NPC. + */ + public void handleTickActions() { + if (!getLocks().isInteractionLocked()) { + if (!pathBoundMovement && walkRadius > 0 && !getLocation().withinDistance(getProperties().getSpawnLocation(), walkRadius)) { + if(!isNeverWalks()){ + if(walkRadius == 0) + walkRadius = 3; + } + getPulseManager().run(new MovementPulse(this, getProperties().getSpawnLocation(), Pathfinder.SMART) { + @Override + public boolean pulse() { + return true; + } + }, "movement"); + if (aggressiveHandler != null) { + aggressiveHandler.setPauseTicks(walkRadius + 1); + } + nextWalk = GameWorld.getTicks() + walkRadius + 1; + return; + } + if (aggressive && aggressiveHandler != null && aggressiveHandler.selectTarget()) { + return; + } + if (getProperties().getCombatPulse().isAttacking()) { + return; + } + } + if (!getLocks().isMovementLocked()) { + if (dialoguePlayer == null || !dialoguePlayer.isActive() || !dialoguePlayer.getInterfaceManager().hasChatbox()) { + dialoguePlayer = null; + if (walks && !getPulseManager().hasPulseRunning() && !getProperties().getCombatPulse().isAttacking() && !getProperties().getCombatPulse().isInCombat() && nextWalk < GameWorld.getTicks()) { + setNextWalk(); + Location l = getMovementDestination(); + if (canMove(l)) { + if((Boolean) definition.getHandlers().getOrDefault("water_npc",false)){ + Pathfinder.findWater(this,l,true,Pathfinder.DUMB).walk(this); + } else { + Pathfinder.find(this, l, true, Pathfinder.DUMB).walk(this); + } + } + } + } + } + if (shop != null) { + if (shop.getLastRestock() < GameWorld.getTicks()) { + if (shop.isRestock()) { + shop.restock(); + shop.setLastRestock(GameWorld.getTicks() + 100); + } + } + } + if (forceTalk != null && getAttribute("lastForceTalk", 0) < GameWorld.getTicks()) { + sendChat(forceTalk); + setAttribute("lastForceTalk", GameWorld.getTicks() + RandomFunction.random(15, 30)); + } + } + + /** + * Sets the next walk. + */ + public void setNextWalk() { + nextWalk = GameWorld.getTicks() + 5 + RandomFunction.randomize(10); + } + + /** + * Called when the region goes inactive. + */ + public void onRegionInactivity() { + getWalkingQueue().reset(); + getPulseManager().clear(); + getUpdateMasks().reset(); + Repository.removeRenderableNPC(this); + if (getViewport().getRegion() instanceof DynamicRegion) { + clear(); + } + } + + @Override + public boolean isPoisonImmune() { + return definition.getConfiguration(NPCConfigParser.POISON_IMMUNE, false); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (getZoneMonitor().handleDeath(killer)) { + return; + } + if (task != null && killer instanceof Player && ((Player) killer).getSlayer().getTask() == task) { + ((Player) killer).getSlayer().finalizeDeath(killer.asPlayer(), this); + } + if (killer instanceof Player && killer.getAttribute("jobs:id",null) != null) { + JobManager.handleDeath(id,(Player) killer); + } + setRespawnTick(GameWorld.getTicks() + definition.getConfiguration(NPCConfigParser.RESPAWN_DELAY, 17)); + Player p = !(killer instanceof Player) ? null : (Player) killer; + if (p != null) { + p.incrementAttribute("/save:" + STATS_BASE + ":" + STATS_ENEMIES_KILLED); + } + handleDrops(p, killer); + if (!isRespawn()) { + clear(); + } + } + + /** + * Handles the drops of the npc. + * @param p the p. + * @param killer the killer. + */ + public void handleDrops(Player p, Entity killer) { + if (getAttribute("disable:drop", false)) { + return; + } + if (killer instanceof Player && p != null && p.getIronmanManager().isIronman() && getImpactHandler().getImpactLog().size() > 1) { + return; + } + if (definition == null || definition.getDropTables() == null) { + return; + } + definition.getDropTables().drop(this, killer); + } + + @Override + public void update() { + super.update(); + } + + @Override + public void reset() { + super.reset(); + } + + @Override + public boolean face(Entity entity) { + if (entity == null) { + if (getUpdateMasks().unregisterSynced(NPCFaceEntity.getOrdinal())) { + return getUpdateMasks().register(new NPCFaceEntity(null)); + } + return true; + } + return getUpdateMasks().register(new NPCFaceEntity(entity), true); + } + + @Override + public boolean faceLocation(Location location) { + if (location == null) { + getUpdateMasks().unregisterSynced(NPCFaceLocation.getOrdinal()); + return true; + } + return getUpdateMasks().register(new NPCFaceLocation(location), true); + } + + @Override + public boolean sendChat(String string) { + return getUpdateMasks().register(new NPCForceChat(string)); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return getProperties().getCombatPulse().getStyle().getSwingHandler(); + } + + /** + * Gets an audio piece. + * @param index the index. + * @return the audio. + */ + public Audio getAudio(int index) { + int[] audios = getDefinition().getConfiguration(NPCConfigParser.COMBAT_AUDIO, null); + if (audios != null) { + Audio audio = new Audio(audios[index]); + if (audio != null && audio.getId() != 0) { + return audio; + } + } + return null; + } + + /** + * Configures the NPC.
Override this instead of {@link #init()} when + * creating a sub class. + */ + public void configure() { + int[] bonus = definition.getConfiguration(NPCConfigParser.BONUSES, new int[3]); + int highest = 0; + int index = 0; + for (int i = 0; i < 3; i++) { + if (bonus[i] > highest) { + highest = bonus[i]; + index = i; + } + } + CombatStyle protectStyle = definition.getConfiguration(NPCConfigParser.PROTECT_STYLE, null); + if (protectStyle != null) { + getProperties().setProtectStyle(protectStyle); + } + getProperties().setAttackStyle(new WeaponInterface.AttackStyle(WeaponInterface.STYLE_CONTROLLED, index)); + CombatStyle style = getDefinition().getConfiguration(NPCConfigParser.COMBAT_STYLE); + if (style == CombatStyle.RANGE) { + getProperties().getCombatPulse().setStyle(style); + } else if (style == CombatStyle.MAGIC) { + getProperties().getCombatPulse().setStyle(style); + getProperties().setAutocastSpell(new DefaultCombatSpell(this)); + int spell = definition.getConfiguration("spell_id", -1); + if (spell != -1) { + getProperties().setSpell((CombatSpell) SpellBookManager.SpellBook.MODERN.getSpell(spell)); + getProperties().setAutocastSpell((CombatSpell) SpellBookManager.SpellBook.MODERN.getSpell(spell)); + } + } + task = Tasks.forId(getId()); + } + + /** + * Method used to check if the NPC can attack the victim. This method is + * used for aggressive behavior. + * @return True if so. + */ + public boolean canAttack(final Entity victim) { + return true; + } + + @Override + public boolean hasProtectionPrayer(CombatStyle style) { + return false; + } + + /** + * Checks if the npc should ignore victim attack restrictions(i.e You can't + * attack this npc.") + * @param victim the victim. + * @return {@code True} if ignore. + */ + public boolean isIgnoreAttackRestrictions(Entity victim) { + return false; + } + + @Override + public String toString() { + return "NPC " + id + ", " + getLocation() + ", " + getIndex(); + } + + /** + * Transforms this NPC. + * @param id The new NPC id. + */ + public void transform(int id) { + this.id = id; + this.definition = NPCDefinition.forId(id); + super.name = definition.getName(); + super.size = definition.size; + super.interaction = new Interaction(this); + initConfig(); + configure(); + interaction.setDefault(); + if (id == originalId) { + getUpdateMasks().unregisterSynced(NPCSwitchId.getOrdinal()); + } + getUpdateMasks().register(new NPCSwitchId(id), id != originalId); + } + + /** + * Transforms this NPC back to original. + */ + public void reTransform() { + if (originalId == this.id) { + return; + } + transform(originalId); + } + + /** + * Gets the movement destination of the NPC. + * @return The movement destination. + */ + protected Location getMovementDestination() { + if (!pathBoundMovement || movementPath == null || movementPath.length < 1) { + return getProperties().getSpawnLocation().transform(-5 + RandomFunction.random(getWalkRadius()), -5 + RandomFunction.random(getWalkRadius()), 0); + } + Location l = movementPath[movementIndex++]; + if (movementIndex == movementPath.length) { + movementIndex = 0; + } + return l; + } + + /** + * Gets the drop location. + * @return The drop location. + */ + public Location getDropLocation() { + return getLocation(); + } + + /** + * Checks if the npc can start combat. + * @param victim the victim. + * @return {@code True} if so. + */ + public boolean canStartCombat(Entity victim) { + return true; + } + + /** + * Gets the definition. + * @return The definition. + */ + public NPCDefinition getDefinition() { + return definition; + } + + /** + * Sets the definition. + * @param definition The definition to set. + */ + public void setDefinition(NPCDefinition definition) { + this.definition = definition; + } + + /** + * Get the id. + * @return The non-player character's id. + */ + public int getId() { + return id; + } + + /** + * Set the id. + * @param id The non-player character's id. + */ + public void setId(int id) { + this.id = id; + } + + /** + * Gets the walks. + * @return The walks. + */ + public boolean isWalks() { + return walks; + } + + /** + * Sets the walks. + * @param walks The walks to set. + */ + public void setWalks(boolean walks) { + this.walks = walks; + } + + /** + * Gets the aggressive. + * @return The aggressive. + */ + public boolean isAggressive() { + return aggressive; + } + + /** + * Sets the aggressive. + * @param aggressive The aggressive to set. + */ + public void setAggressive(boolean aggressive) { + this.aggressive = aggressive; + } + + /** + * Sets the name. + * @param @name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the movementPath. + * @return The movementPath. + */ + public Location[] getMovementPath() { + return movementPath; + } + + /** + * @return the respawn. + */ + public boolean isRespawn() { + return respawn; + } + + /** + * @param respawn the respawn to set. + */ + public void setRespawn(boolean respawn) { + this.respawn = respawn; + } + + /** + * Gets the pathBoundMovement. + * @return The pathBoundMovement. + */ + public boolean isPathBoundMovement() { + return pathBoundMovement; + } + + /** + * Sets the pathBoundMovement. + * @param pathBoundMovement The pathBoundMovement. + */ + public void setPathBoundMovement(boolean pathBoundMovement) { + this.pathBoundMovement = pathBoundMovement; + } + + /** + * Gets the dialoguePlayer. + * @return The dialoguePlayer. + */ + public Player getDialoguePlayer() { + return dialoguePlayer; + } + + /** + * Sets the dialoguePlayer. + */ + public void setDialoguePlayer(Player dialoguePlayer) { + this.dialoguePlayer = dialoguePlayer; + } + + /** + * Gets the aggressive handler. + * @return The aggressive handler. + */ + public AggressiveHandler getAggressiveHandler() { + return aggressiveHandler; + } + + /** + * Sets the aggressive handler. + * @param handler The handler. + */ + public void setAggressiveHandler(AggressiveHandler handler) { + this.aggressiveHandler = handler; + } + + /** + * Gets the respawnTick. + * @return The respawnTick. + */ + public int getRespawnTick() { + return respawnTick; + } + + /** + * Sets the walking radius. + * @param radius The walking radius. + */ + public void setWalkRadius(int radius) { + this.walkRadius = radius; + } + + /** + * Gets the walking radius. + * @return the walking radius. + */ + public int getWalkRadius() { + return walkRadius; + } + + /** + * Sets the respawnTick. + * @param respawnTick The respawnTick to set. + */ + public void setRespawnTick(int respawnTick) { + this.respawnTick = respawnTick; + } + + /** + * Gets the originalId. + * @return The originalId. + */ + public int getOriginalId() { + return originalId; + } + + /** + * Gets the currently shown NPC. + * @param player The player to check for. + * @return The shown NPC. + */ + public NPC getShownNPC(Player player) { + if (children == null) { + return this; + } + int npcId = definition.getChildNPC(player).getId(); + for (NPC npc : children) { + if (npc.getId() == npcId) { + return npc; + } + } + return this; + } + + /** + * Gets the shop. + * @return the shop + */ + public Shop getShop() { + return shop; + } + + /** + * Sets the bashop. + * @param shop the shop to set. + */ + public void setShop(Shop shop) { + this.shop = shop; + } + + /** + * Gets the slayerExperience. + * @return The slayerExperience. + */ + public double getSlayerExperience() { + return slayerExperience; + } + + /** + * Sets the slayerExperience. + * @param slayerExperience The slayerExperience to set. + */ + public void setSlayerExperience(double slayerExperience) { + this.slayerExperience = slayerExperience; + } + + /** + * Gets the task. + * @return The task. + */ + public Tasks getTask() { + return task; + } + + /** + * Sets the task. + * @param task The task to set. + */ + public void setTask(Tasks task) { + this.task = task; + } + + /** + * Gets the neverWalks. + * @return the neverWalks + */ + public boolean isNeverWalks() { + return neverWalks; + } + + /** + * Sets the baneverWalks. + * @param neverWalks the neverWalks to set. + */ + public void setNeverWalks(boolean neverWalks) { + this.neverWalks = neverWalks; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/agg/AggressiveBehavior.java b/Server/src/main/java/Server/core/game/node/entity/npc/agg/AggressiveBehavior.java new file mode 100644 index 000000000..fd266f86c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/agg/AggressiveBehavior.java @@ -0,0 +1,143 @@ +package core.game.node.entity.npc.agg; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles an NPC's aggressive behaviour. + * @author Emperor + */ +public class AggressiveBehavior { + + /** + * The default aggressive behavior. + */ + public static final AggressiveBehavior DEFAULT = new AggressiveBehavior(); + + /** + * The wilderness aggressive behavior. + */ + public static final AggressiveBehavior WILDERNESS = new AggressiveBehavior() { + + @Override + public boolean canSelectTarget(Entity entity, Entity target) { + if(target.isInvisible()){ + return false; + } + if (!target.isActive() || DeathTask.isDead(target)) { + return false; + } + if (!entity.canSelectTarget(target)) { + return false; + } + if (!target.getProperties().isMultiZone() && target.inCombat()) { + return false; + } + if (target instanceof Player) { + return ((Player) target).getSkullManager().isWilderness(); + } + return true; + } + }; + + /** + * Constructs a new {@code AggressiveBehaviour} {@code Object}. + */ + public AggressiveBehavior() { + /* + * empty. + */ + } + + /** + * Checks if the NPC is aggressive towards the entity. + * @param entity The timed entry. + * @return {@code True} if the NPC can select the entity as a target. + */ + public boolean canSelectTarget(Entity entity, Entity target) { + if (!target.isActive() || DeathTask.isDead(target)) { + return false; + } + if (!target.getProperties().isMultiZone() && target.inCombat()) { + return false; + } + if (entity instanceof NPC && target instanceof Player) { + NPC npc = (NPC) entity; + if (npc.getAggressiveHandler() != null && npc.getAggressiveHandler().isAllowTolerance()) { + int ticks = GameWorld.getTicks() - npc.getAggressiveHandler().getPlayerTolerance()[target.getIndex()]; + if (ticks > 3000) { + npc.getAggressiveHandler().getPlayerTolerance()[target.getIndex()] = GameWorld.getTicks(); + } else if (ticks > 1500) { + return false; + } + } + } + int level = target.getProperties().getCurrentCombatLevel(); + if (level > entity.getProperties().getCurrentCombatLevel() << 1) { + return false; + } + return true; + } + + /** + * Gets the priority flag. + * @param target The target. + * @return The priority flag. + */ + public int getPriorityFlag(Entity target) { + int flag = 0; + if (target.inCombat()) { + flag++; + } + if (target.getLocks().isInteractionLocked()) { + flag++; + } + Entity e = target.getAttribute("aggressor"); + if (e != null && e.getProperties().getCombatPulse().getVictim() == target) { + flag++; + } + return flag; + } + + /** + * Gets the list of possible targets. + * @param entity The entity. + * @param radius The aggressive radius. + * @return The list of possible targets. + */ + public List getPossibleTargets(Entity entity, int radius) { + List targets = new ArrayList<>(); + for (Player player : RegionManager.getLocalPlayers(entity, radius)) { + if (canSelectTarget(entity, player)) { + targets.add(player); + } + } + return targets; + } + + /** + * Gets the most logical target from the targets list. + * @param entity The entity. + * @param possibleTargets The possible targets list. + * @return The target. + */ + public Entity getLogicalTarget(Entity entity, List possibleTargets) { + Entity target = null; + int comparingFlag = Integer.MAX_VALUE; + for (Entity e : possibleTargets) { + int flag = getPriorityFlag(e); + if (flag <= comparingFlag) { + comparingFlag = flag; + target = e; + } + } + return target; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/agg/AggressiveHandler.java b/Server/src/main/java/Server/core/game/node/entity/npc/agg/AggressiveHandler.java new file mode 100644 index 000000000..152376091 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/agg/AggressiveHandler.java @@ -0,0 +1,200 @@ +package core.game.node.entity.npc.agg; + +import core.ServerConstants; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.world.GameWorld; +import core.tools.RandomFunction; + +/** + * Used to handle entity aggressiveness. + * @author Emperor + */ +public final class AggressiveHandler { + + /** + * The entity. + */ + private final Entity entity; + + /** + * The radius. + */ + private int radius = 4; + + /** + * The amount of ticks to pause aggressiveness with. + */ + private int pauseTicks = 0; + + /** + * If target switching is enabled. + */ + private boolean targetSwitching; + + /** + * The aggressiveness behavior. + */ + private final AggressiveBehavior behavior; + + /** + * The aggressive chance ratio (1/10). + */ + private int chanceRatio = 2; + + /** + * The tolerance data. + */ + private final int[] playerTolerance = new int[ServerConstants.MAX_PLAYERS]; + + /** + * If tolerance is allowed. + */ + private boolean allowTolerance = true; + + /** + * Constructs a new {@code AggressiveHandler} {@code Object}. + * @param entity The entity. + * @param behavior The aggressive behavior. + */ + public AggressiveHandler(Entity entity, AggressiveBehavior behavior) { + this.entity = entity; + this.behavior = behavior; + } + + /** + * Selects a target. + * @return {@code True} if the entity has selected a target. + */ + public boolean selectTarget() { + if (pauseTicks > GameWorld.getTicks() || entity.getLocks().isInteractionLocked()) { + return false; + } + if ((!targetSwitching && entity.getProperties().getCombatPulse().isAttacking()) || DeathTask.isDead(entity)) { + return false; + } + if (RandomFunction.randomize(10) > chanceRatio) { + return false; + } + Entity target = behavior.getLogicalTarget(entity, behavior.getPossibleTargets(entity, radius)); + if (target instanceof Player) { + if (target.getAttribute("ignore_aggression", false)) { + if (((Player) target).getRights().equals(Rights.ADMINISTRATOR)) { + return false; + } + } + } + if (target != null) { + target.setAttribute("aggressor", entity); + if (target != entity.getProperties().getCombatPulse().getVictim()) { + if (entity.getProperties().getCombatPulse().isAttacking()) { + entity.getProperties().getCombatPulse().setVictim(target); + entity.face(target); + } else { + entity.getProperties().getCombatPulse().attack(target); + } + return true; + } + } + return entity.getProperties().getCombatPulse().isAttacking(); + } + + /** + * Removes the tolerance of a player. + * @param index The player index. + */ + public synchronized void removeTolerance(int index) { + playerTolerance[index] = 0; + } + + /** + * Gets the radius. + * @return The radius. + */ + public int getRadius() { + return radius; + } + + /** + * Sets the radius. + * @param radius The radius to set. + */ + public void setRadius(int radius) { + this.radius = radius; + } + + /** + * Gets the pauseTicks. + * @return The pauseTicks. + */ + public int getPauseTicks() { + return pauseTicks; + } + + /** + * Sets the pauseTicks. + * @param pauseTicks The amount of ticks to pause for. + */ + public void setPauseTicks(int pauseTicks) { + this.pauseTicks = GameWorld.getTicks() + pauseTicks; + } + + /** + * Gets the playerTolerance. + * @return The playerTolerance. + */ + public int[] getPlayerTolerance() { + return playerTolerance; + } + + /** + * Gets the targetSwitching. + * @return The targetSwitching. + */ + public boolean isTargetSwitching() { + return targetSwitching; + } + + /** + * Sets the targetSwitching. + * @param targetSwitching The targetSwitching to set. + */ + public void setTargetSwitching(boolean targetSwitching) { + this.targetSwitching = targetSwitching; + } + + /** + * Gets the chanceRatio. + * @return The chanceRatio. + */ + public int getChanceRatio() { + return chanceRatio; + } + + /** + * Sets the chanceRatio (a ratio of 0-10). + * @param chanceRatio The chanceRatio to set. + */ + public void setChanceRatio(int chanceRatio) { + this.chanceRatio = chanceRatio; + } + + /** + * Gets the allowTolerance. + * @return The allowTolerance. + */ + public boolean isAllowTolerance() { + return allowTolerance; + } + + /** + * Sets the allowTolerance. + * @param allowTolerance The allowTolerance to set. + */ + public void setAllowTolerance(boolean allowTolerance) { + this.allowTolerance = allowTolerance; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/bosses/GiantMoleNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/GiantMoleNPC.java new file mode 100644 index 000000000..f921cab50 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/GiantMoleNPC.java @@ -0,0 +1,315 @@ +package core.game.node.entity.npc.bosses; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.content.global.BossKillCounter; +import core.game.content.global.LightSource; +import core.game.content.global.action.DigAction; +import core.game.content.global.action.DigSpadeHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.impl.DarkZone; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.InterfaceContext; +import core.net.packet.out.Interface; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Giant Mole NPC. + * @author Emperor + */ +@Initializable +public final class GiantMoleNPC extends AbstractNPC { + + /** + * The dig locations. + */ + private static final Location[] DIG_LOCATIONS = new Location[] { Location.create(1760, 5183, 0),// center + Location.create(1736, 5223, 0),// top left + Location.create(1777, 5235, 0),// top right + Location.create(1739, 5150, 0), Location.create(1769, 5148, 0), Location.create(1750, 5195, 0), Location.create(1778, 5207, 0), Location.create(1772, 5199, 0), Location.create(1774, 5173, 0), Location.create(1760, 5162, 0), Location.create(1753, 5151, 0), Location.create(1739, 5152, 0) }; + + /** + * The digging animation. + */ + private static final Animation DIG_ANIMATION = new Animation(3314, Priority.VERY_HIGH); + + /** + * The digging graphic. + */ + private static final Graphics DIG_GRAPHIC = new Graphics(572); + + /** + * The dig up animation. + */ + private static final Animation DIG_UP_ANIMATION = new Animation(3315, Priority.VERY_HIGH); + + /** + * The digging graphic. + */ + private static final Graphics DIG_UP_GRAPHIC = new Graphics(573); + + /** + * The dust graphics. + */ + private static final Graphics DUST_GRAPHIC = new Graphics(571); + + /** + * If the NPC is digging. + */ + private boolean digging; + + /** + * Constructs a new {@code GiantMoleNPC} {@code Object}. + */ + public GiantMoleNPC() { + super(3340, null); + } + + /** + * Constructs a new {@code GiantMoleNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public GiantMoleNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.init(); + super.setWalks(true); + super.walkRadius = 128; + } + + /** + * Starts digging. + */ + private void dig() { + digging = true; + lock(5); + getProperties().getCombatPulse().stop(); + getWalkingQueue().reset(); + getLocks().lockMovement(5); + final Direction dir = Direction.get(RandomFunction.randomize(4)); + faceLocation(getCenterLocation().transform(dir.getStepX() << 2, dir.getStepY() << 2, 0)); + setDirection(dir); + int index = RandomFunction.randomize(DIG_LOCATIONS.length); + Location dest = DIG_LOCATIONS[index]; + if (dest.withinDistance(getLocation())) { + dest = DIG_LOCATIONS[(index + 1) % DIG_LOCATIONS.length]; + } + final Location destination = dest; + GameWorld.getPulser().submit(new Pulse(1, this) { + int count = 0; + Location hole; + + @Override + public boolean pulse() { + if (count == 0) { + hole = visualizeDig(destination, true); + } else if (count == 1) { + if (RandomFunction.RANDOM.nextBoolean()) { + splatterMud(hole); + } + } else if (count == 3) { + getProperties().setTeleportLocation(destination); + } else if (count == 4) { + visualizeDig(destination, false); + digging = false; + return true; + } + count++; + return false; + } + }); + } + + /** + * Handles the mud splattering. + * @param hole The hole location. + */ + private void splatterMud(Location hole) { + for (Player p : RegionManager.getLocalPlayers(getCenterLocation(), (size() >> 1) + 2)) { + PacketRepository.send(Interface.class, new InterfaceContext(p, 548, 77, 226, true)); + LightSource s = LightSource.getActiveLightSource(p); + if (s == null || s.isOpen()) { + if (s != null) { + p.getPacketDispatch().sendMessage("Your " + s.getName() + " seems to have been extinguished by the mud."); + int slot = p.getInventory().getSlot(s.getProduct()); + if (slot > -1) { + p.getInventory().replace(new Item(s.getRaw().getId()), slot); + } + } + DarkZone.checkDarkArea(p); + } + } + for (int i = 0; i < 1 + RandomFunction.randomize(3); i++) { + Projectile.create(hole, hole.transform(-4 + RandomFunction.randomize(9), -4 + RandomFunction.randomize(9), 0), 570, 0, 5, 45, 70, 5, 11).send(); + } + } + + /** + * Visualizes the digging. + * @param destination The destination of the mole. + * @param underground If the mole is going underground. + * @return The hole location. + */ + private Location visualizeDig(Location destination, boolean underground) { + Location offset = getCenterLocation(); + if (underground) { + switch (getDirection()) { + case NORTH: + offset = getLocation().transform(1, size() - 1, 0); + break; + case EAST: + offset = getLocation().transform(size() - 1, 1, 0); + break; + case WEST: + offset = getLocation().transform(0, 1, 0); + break; + default: + offset = getLocation().transform(1, 0, 0); + break; + } + } + for (int x = -1; x < 2; x++) { + for (int y = -1; y < 2; y++) { + Graphics.send(DUST_GRAPHIC, offset.transform(x, y, 0)); + } + } + if (underground) { + animate(DIG_ANIMATION); + Graphics.send(DIG_GRAPHIC, offset); + } else { + animate(DIG_UP_ANIMATION); + Graphics.send(DIG_UP_GRAPHIC, offset); + } + return offset; + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + if (!getLocks().isInteractionLocked()) { + int chance = 15; + if (getSkills().getLifepoints() < getSkills().getMaximumLifepoints() >> 1) { + chance *= 3; + } + if (RandomFunction.randomize(100) < chance && inCombat()) { + dig(); + return; + } + } + super.onImpact(entity, state); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (digging) { + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(568, new ComponentPlugin() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (button == 17) { + player.getProperties().setTeleportLocation(Location.create(1752, 5237, 0)); + player.getPacketDispatch().sendMessage("You seem to have dropped down into a network of mole tunnels."); + + if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0, 5)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player,0,5,true); + } + } + player.getInterfaceManager().close(); + return false; + } + }); + + DigAction action = new DigAction() { + @Override + public void run(Player player) { + if (!LightSource.hasActiveLightSource(player)) { + player.getPacketDispatch().sendMessage("It's going to be dark down there, I should bring a light source."); + return; + } + player.getInterfaceManager().open(new Component(568)); + } + }; + DigSpadeHandler.register(Location.create(3005, 3376, 0), action); + DigSpadeHandler.register(Location.create(2999, 3375, 0), action); + DigSpadeHandler.register(Location.create(2996, 3377, 0), action); + DigSpadeHandler.register(Location.create(2989, 3378, 0), action); + DigSpadeHandler.register(Location.create(2984, 3387, 0), action); + DigSpadeHandler.register(Location.create(2987, 3387, 0), action); + ObjectDefinition.forId(12230).getHandlers().put("option:climb", new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + player.animate(Animation.create(828)); + player.lock(2); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.getProperties().setTeleportLocation(Location.create(2985, 3316, 0)); + return true; + } + }); + return true; + } + }); + return super.newInstance(arg); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + Player player = killer.asPlayer(); + BossKillCounter.addtoKillcount(player, this.getId()); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new GiantMoleNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 3340 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java new file mode 100644 index 000000000..a11ca1ce3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java @@ -0,0 +1,390 @@ +package core.game.node.entity.npc.bosses; + +import java.util.ArrayList; +import java.util.List; + +import core.game.content.global.BossKillCounter; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +import core.game.interaction.object.dmc.DMCHandler; + +/** + * Handles the Kalphite Queen. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class KalphiteQueenNPC extends AbstractNPC { + + /** + * The default spawn location. + */ + // 3474, 9495, 0 + private static final Location DEFAULT_SPAWN = Location.create(3222, 3217, 0); + + /** + * The transform animation. + */ + private static final Animation TRANSFORM_ANIM = new Animation(6270, Priority.HIGH); + + /** + * The combat swing handler. + */ + private CombatSwingHandler combatHandler = new KQCombatSwingHandler(); + + /** + * Constructs a new {@code KalphiteQueenNPC} {@code Object}. + */ + public KalphiteQueenNPC() { + this(1158, DEFAULT_SPAWN); + } + + /** + * Constructs a new {@code KalphiteQueenNPC} {@code Object}. + */ + public KalphiteQueenNPC(int id, Location spawn) { + super(id, spawn); + super.setAggressive(true); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatHandler; + } + + @Override + public boolean hasProtectionPrayer(CombatStyle style) { + if (getId() == 1158) { + return style == CombatStyle.MAGIC || style == CombatStyle.RANGE; + } + return style == CombatStyle.MELEE; + } + + @Override + public void tick() { + super.tick(); + } + + @Override + public void init() { + super.init(); + setRespawn(true); + configureBossData(); + } + + @Override + public void finalizeDeath(Entity killer) { + if (getId() == 1160) { + removeAttribute("disable:drop"); + reTransform(); + super.finalizeDeath(killer); + BossKillCounter.addtoKillcount((Player) killer, 1160); + return; + } + BossKillCounter.addtoKillcount((Player) killer, this.getId()); + setAttribute("disable:drop", true); + super.finalizeDeath(killer); + super.setRespawnTick(-1); + super.getWalkingQueue().reset(); + super.getLocks().lockMovement(10); + transform(1160); + getProperties().setTeleportLocation(null); + getAnimator().setPriority(Priority.LOW); + visualize(TRANSFORM_ANIM, Graphics.create(1055)); + lock(TRANSFORM_ANIM.getDuration() + 1); + } + + @Override + public void sendImpact(BattleState state) { + if (state.getEstimatedHit() > 31) { + state.setEstimatedHit(RandomFunction.random(1, 12)); + } + if (state.getVictim() instanceof Player) { + Player player = state.getVictim().asPlayer(); + DMCHandler handler = player.getAttribute("dmc"); + if (handler != null && handler.getCannon() != null && handler.getCannon().isActive()) { + + } + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new KalphiteQueenNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 1158, 1160 }; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : getIds()) { + mapping.put(id, this); + } + return this; + } + + /** + * Handles the Kalphite Queen combat swings. + * @author Emperor + */ + static class KQCombatSwingHandler extends CombatSwingHandler { + + /** + * The melee attack anim for the first form. + */ + private static final Animation MELEE_ATTACK_1 = new Animation(6241, Priority.HIGH); + + /** + * The range/magic attack anim for the first form. + */ + private static final Animation RANGE_ATTACK_1 = new Animation(6240, Priority.HIGH); + + /** + * The magic graphic for the first form. + */ + private static final Graphics MAGIC_GFX_1 = Graphics.create(278); + + /** + * The melee attack anim for the first form. + */ + private static final Animation MELEE_ATTACK_2 = new Animation(6235, Priority.HIGH); + + /** + * The range/magic attack anim for the first form. + */ + private static final Animation RANGE_ATTACK_2 = new Animation(6234, Priority.HIGH); + + /** + * The magic graphic for the first form. + */ + private static final Graphics MAGIC_GFX_2 = Graphics.create(279); + + /** + * The end graphic for magic. + */ + private static final Graphics MAGIC_END_GFX = Graphics.create(281); + + /** + * The style. + */ + private CombatStyle style = CombatStyle.RANGE; + + /** + * Constructs a new {@code KalphiteQueenNPC} {@code Object}. + */ + public KQCombatSwingHandler() { + super(CombatStyle.RANGE); + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + return getType().getSwingHandler().canSwing(entity, victim); + } + + /** + * Gets the range targets. + * @param e The entity. + * @param victim The victim. + * @return The targets array. + */ + private BattleState[] getRangeTargets(Entity e, Entity victim) { + List list = new ArrayList<>(); + for (Entity t : RegionManager.getLocalPlayers(victim, -1 + (int) e.getCenterLocation().getDistance(victim.getLocation()))) { + if (t.isAttackable(e, CombatStyle.RANGE)) { + list.add(new BattleState(e, t)); + } + } + return list.toArray(new BattleState[list.size()]); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + style = super.getType(); + super.setType(CombatStyle.values()[1 + RandomFunction.RANDOM.nextInt(2)]); + int ticks = 1; + if (CombatStyle.MELEE.getSwingHandler().canSwing(entity, victim) != InteractionType.NO_INTERACT && RandomFunction.random(10) < 4) { + style = CombatStyle.MELEE; + } else { + ticks += (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * (style == CombatStyle.MAGIC ? 0.5 : 0.3)); + } + BattleState[] targets = new BattleState[] { state }; + if (style == CombatStyle.RANGE) { + targets = getRangeTargets(entity, victim); + state.setTargets(targets); + } + state.setStyle(style); + int max = calculateHit(entity, victim, 1.0); + if (max > 31) { + max = RandomFunction.random(5, 28); + } + for (BattleState s : targets) { + int hit = 0; + s.setStyle(style); + if (isAccurateImpact(entity, s.getVictim())) { + s.setMaximumHit(max); + hit = RandomFunction.random(max); + } + if (victim.hasProtectionPrayer(CombatStyle.RANGE)) { + s.setEstimatedHit(0); + } else { + s.setEstimatedHit(hit); + } + } + return ticks; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + boolean secondForm = entity instanceof NPC && ((NPC) entity).getId() == 1160; + switch (state.getStyle()) { + case MELEE: + entity.animate(secondForm ? MELEE_ATTACK_2 : MELEE_ATTACK_1); + break; + case RANGE: + for (BattleState s : state.getTargets()) { + if (s != null) { + Projectile.ranged(entity, s.getVictim(), secondForm ? 289 : 288, 41, 36, 50, 15).send(); + } + } + entity.animate(secondForm ? RANGE_ATTACK_2 : RANGE_ATTACK_1); + break; + case MAGIC: + Projectile.magic(entity, victim, 280, 41, 36, 50, 15).send(); + entity.visualize(secondForm ? RANGE_ATTACK_2 : RANGE_ATTACK_1, secondForm ? MAGIC_GFX_2 : MAGIC_GFX_1); + break; + } + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (state.getStyle() == CombatStyle.MAGIC) { + victim.graphics(MAGIC_END_GFX); + } + state.getStyle().getSwingHandler().visualizeImpact(entity, victim, state); + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + state.getStyle().getSwingHandler().adjustBattleState(entity, victim, state); + } + + @Override + public int calculateAccuracy(Entity entity) { + return style.getSwingHandler().calculateAccuracy(entity); + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return style.getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + return style.getSwingHandler().calculateHit(entity, victim, modifier); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + CombatStyle style = state.getStyle(); + if (style == CombatStyle.RANGE && state.getTargets() != null) { + for (BattleState s : state.getTargets()) { + style.getSwingHandler().impact(entity, s.getVictim(), s); + } + return; + } + if (style == CombatStyle.MAGIC) { + BattleState[] states = new BattleState[entity.getViewport().getCurrentPlane().getPlayers().size()]; + int index = 1; + if (states.length == 0) { + return; + } + for (Player p : entity.getViewport().getCurrentPlane().getPlayers()) { + if (p != victim) { + states[index++] = new BattleState(entity, p); + } + } + states[0] = new BattleState(); + handleMagicImpact(entity, entity, victim, states, 0); + return; + } + style.getSwingHandler().impact(entity, victim, state); + } + + /** + * Handles a magic impact. + * @param e The entity. + * @param last The last entity to receive the impact. + * @param victim The victim. + * @param targets The list of targets. + * @param index The current target index. + */ + private void handleMagicImpact(final Entity e, final Entity last, final Entity victim, final BattleState[] targets, int index) { + if (targets == null || index >= targets.length) { + return; + } + BattleState s = targets[index]; + if (s == null) { + return; + } + int hit = 0; + if (CombatStyle.MAGIC.getSwingHandler().isAccurateImpact(e, victim)) { + hit = RandomFunction.RANDOM.nextInt(32); + } + if (victim.hasProtectionPrayer(CombatStyle.MAGIC)) { + hit = 0; + } + s.setEstimatedHit(hit); + CombatStyle.MAGIC.getSwingHandler().adjustBattleState(e, victim, s); + victim.getImpactHandler().handleImpact(e, s.getEstimatedHit(), CombatStyle.MAGIC, s); + CombatStyle.MAGIC.getSwingHandler().onImpact(e, victim, s); + while (++index < targets.length && (s = targets[index]) == null) + ; + if (s == null || index >= targets.length) { + return; + } + final BattleState t = s; + final int targetIndex = index; + t.getVictim().graphics(MAGIC_END_GFX); + Projectile.create(victim, t.getVictim(), 280, 41, 36, 0, 30, 15, 11).send(); + GameWorld.getPulser().submit(new Pulse(1, t.getVictim()) { + @Override + public boolean pulse() { + handleMagicImpact(e, victim, t.getVictim(), targets, targetIndex); + return true; + } + }); + } + + @Override + public ArmourSet getArmourSet(Entity e) { + return style.getSwingHandler().getArmourSet(e); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return style.getSwingHandler().getSetMultiplier(e, skillId); + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/bosses/TormentedDemonNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/TormentedDemonNPC.java new file mode 100644 index 000000000..c734654d1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/TormentedDemonNPC.java @@ -0,0 +1,328 @@ +package core.game.node.entity.npc.bosses; + +import java.util.concurrent.TimeUnit; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Tormented Demon NPC. + * @author Vexia + * + */ +@Initializable +public class TormentedDemonNPC extends AbstractNPC { + + /** + * The meele protect npc ids. + */ + private static final int[][] MELEE = new int[][] {{8349, 8352, 8355}, {8358, 8361, 8364}}; + + /** + * The mage protect npc ids. + */ + private static final int[][] MAGE = new int[][] {{8350, 8353, 8356}, {8359, 8362, 8365}}; + + /** + * The range protect npc ids. + */ + private static final int[][] RANGE = new int[][] {{8351, 8354, 8357}, {8360, 8363, 8366}}; + + /** + * The tormented demon swing handler. + */ + private final TormentedDemonSwingHandler TD_SWING_HANDLER = new TormentedDemonSwingHandler(); + + /** + * The last combat style switch. + */ + private long lastSwitch = System.currentTimeMillis() + 15000; + + /** + * If the fire shield is enabled. + */ + private boolean fireShield = true; + + /** + * The delay of the shield being non-active. + */ + private long shieldDelay; + + /** + * The damage log of what style is dealing the most damage. + */ + private final int[] damageLog = new int[3]; + + /** + * Constructs a new {@Code TormentedDemonNPC} {@Code Object} + */ + public TormentedDemonNPC() { + this(-1, null); + } + + /** + * Constructs a new {@Code TormentedDemonNPC} {@Code Object} + * @param id The npc id. + * @param location The start location. + */ + public TormentedDemonNPC(int id, Location location) { + super(id, location); + setWalks(true); + setAggressive(true); + this.setDefaultBehavior(); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!fireShield && shieldDelay < System.currentTimeMillis() && shieldDelay > 0) { + Player p = getAttribute("shield-player", null); + fireShield = true; + shieldDelay = 0; + if (p != null && p.isActive() && p.getLocation().withinDistance(getLocation()) && isActive() && !isHidden(p)) { + p.sendMessage("The Tormented demon regains its strength against your weapon."); + } + } + } + + @Override + public void sendImpact(BattleState state) { + int max = 0; + switch (state.getStyle()) { + case MAGIC: + case RANGE: + max = 26; + break; + case MELEE: + max = 18; + break; + } + + if (state.getEstimatedHit() > max) { + state.setEstimatedHit(RandomFunction.random(max - 5)); + } + } + + @Override + public void checkImpact(BattleState state) { + if (fireShield && state.getAttacker().isPlayer() && state.getEstimatedHit() > 0 && state.getWeapon() != null && (state.getWeapon().getId() == 6746 || state.getWeapon().getId() == 6746 || state.getWeapon().getId() == 732)) { + shieldDelay = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(60); + fireShield = false; + setAttribute("shield-player", state.getAttacker()); + state.getAttacker().asPlayer().sendMessage("The demon is temporarily weakened by your weapon."); + } + if (fireShield) { + state.setEstimatedHit((int) (state.getEstimatedHit() * 0.75)); + graphics(Graphics.create(1885)); + } + if (state.getStyle() == null) { + return; + } + int hit = state.getEstimatedHit() > 0 ? state.getEstimatedHit() : 1; + damageLog[state.getStyle().ordinal()] = damageLog[state.getStyle().ordinal()] + hit; + CombatStyle damaged = getMostDamagedStyle(); + if (damaged != null && damageLog[damaged.ordinal()] > 30 + hit && damaged != getProperties().getProtectStyle()) { + for (int i = 0; i < 3; i++) { + damageLog[i] = 0; + } + transformDemon(null, damaged); + return; + } else if (lastSwitch < System.currentTimeMillis()) { + transformDemon(RandomFunction.getRandomElement(getAlternateStyle(TD_SWING_HANDLER.style)), null); + lastSwitch = System.currentTimeMillis() + 15000; + } + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + reTransform(); + fireShield = true; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TormentedDemonNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean hit) { + return TD_SWING_HANDLER; + } + + /** + * Switches the Tormented Demons style (protection & combat) + * @param style The combat style to switch to. + * @param protection The protection style to switch to. + */ + public void transformDemon(CombatStyle style, CombatStyle protection) { + //System.out.println("Transforming demon, selected combat style = " + style + ", the selected protection style = " + protection); + int id = getId(); + if (protection != null) { + int[] ids = getDemonIds(protection); + id = ids[RandomFunction.random(ids.length)]; + } else { + id = getCombatStyleDemon(getProperties().getProtectStyle(), style); + } + int oldHp = getSkills().getLifepoints(); + transform(id); + getSkills().setLifepoints(oldHp); + //System.out.println("The outcome demon, id = " + id + " combat style = " + getProperties().getCombatPulse().getStyle() + ", the protection style = " + getProperties().getProtectStyle()); + TD_SWING_HANDLER.style = getProperties().getCombatPulse().getStyle(); + } + + /** + * Gets the most damaged style. + * @return The combat style. + */ + public CombatStyle getMostDamagedStyle() { + int highestDamage = 0; + CombatStyle style = null; + for (int i = 0; i < damageLog.length; i++) { + if (damageLog[i] > highestDamage) { + highestDamage = damageLog[i]; + style = CombatStyle.values()[i]; + } + } + return style; + } + + /** + * Gets a demon id for a combat style. + * @param protection The protections tyle. + * @param style The style. + * @return The id of a demon in a combat style. + */ + public int getCombatStyleDemon(CombatStyle protection, CombatStyle style) { + return getDemonIds(protection)[2 - style.ordinal()]; + } + + /** + * Gets a list of demon ids to chose from for a protection style. + * @param style The style of protection. + * @return The demon ids. + */ + public int[] getDemonIds(CombatStyle style) { + int[][] ids = style == CombatStyle.MELEE ? MELEE : style == CombatStyle.RANGE ? RANGE : MAGE; + return ids[getStartId() == getIds()[0] ? 0 : 1]; + } + + /** + * Gets the alternate styles. + * @param style The style to compare to. + * @return The combat styles to chose from. + */ + public CombatStyle[] getAlternateStyle(CombatStyle style) { + CombatStyle[] styles = new CombatStyle[2]; + int index = 0; + for (int i = 0; i < CombatStyle.values().length; i++) { + if (CombatStyle.values()[i] != style) { + styles[index] = CombatStyle.values()[i]; + index++; + } + } + return styles; + } + + /** + * Gets the start if of the demon. + * @return The start id. + */ + public int getStartId() { + return getId() <= 8357 ? getIds()[0] : getIds()[10]; + } + + @Override + public int[] getIds() { + return new int[] { 8349, 8350, 8351, 8352, 8353, 8354, 8355, 8356, 8357, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366 }; + } + + /** + * Handles the Tormented Demon's combat. + * @author Vexia + * + */ + public class TormentedDemonSwingHandler extends CombatSwingHandler { + + /** + * The current style. + */ + private CombatStyle style = CombatStyle.MELEE; + + /** + * Constructs a new {@Code TormentedDemonSwingHandler} {@Code Object} + */ + public TormentedDemonSwingHandler() { + super(CombatStyle.MELEE); + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + return style.getSwingHandler().canSwing(entity, victim); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + return style.getSwingHandler().swing(entity, victim, state); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + style.getSwingHandler().impact(entity, victim, state); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + style.getSwingHandler().visualizeImpact(entity, victim, state); + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + switch (style) { + case MELEE: + entity.animate(entity.getProperties().getAttackAnimation()); + entity.graphics(Graphics.create(1886)); + break; + case RANGE: + Projectile.ranged(entity, victim, 1887, 88, 36, 50, 15).send(); + entity.animate(entity.getProperties().getRangeAnimation()); + break; + case MAGIC: + Projectile.magic(entity, victim, 1884, 88, 36, 50, 15).send(); + entity.animate(entity.getProperties().getMagicAnimation()); + break; + } + } + + @Override + public int calculateAccuracy(Entity entity) { + return style.getSwingHandler().calculateAccuracy(entity); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + return style.getSwingHandler().calculateHit(entity, victim, modifier); + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + return style.getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return style.getSwingHandler().getSetMultiplier(e, skillId); + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/bosses/TzRekJadNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/TzRekJadNPC.java new file mode 100644 index 000000000..3a5e35a16 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/TzRekJadNPC.java @@ -0,0 +1,263 @@ +package core.game.node.entity.npc.bosses; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.repository.Repository; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles everything in regards to jad pet. + * @author Empathy + * + */ +@Initializable +public class TzRekJadNPC extends OptionHandler { + + /** + * The tzhaar mej id. + */ + private static final int TZHAAR_MEJ_ID = 2617; + + /** + * The firecape item. + */ + private static final Item FIRECAPE = new Item(6570); + + /** + * The tokkul item. + */ + private static final Item TOKKUL = new Item(6529); + + /** + * The jad item. + */ + private static final Item JAD_PET = new Item(14828); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(TZHAAR_MEJ_ID).getHandlers().put("option:exchange fire cape", this); + PluginManager.definePlugins(new TzhaarMejJalDialogue(), new TzRekJadDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "exchange fire cape": + player.getDialogueInterpreter().open(DialogueInterpreter.getDialogueKey(player.getInventory().containsItem(FIRECAPE) ? "firecape-exchange" : "tzhaar-mej"), node.asNpc()); + break; + } + return true; + } + + /** + * Handles the TzhaarMejJal Dialogue to gamble for jad pet. + * @author Empathy + * + */ + public final class TzhaarMejJalDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code TzhaarMejJalDialogue} {@code Object}. + */ + public TzhaarMejJalDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TzhaarMejJalDialogue} {@code Object}. + * + * @param player the player. + */ + public TzhaarMejJalDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TzhaarMejJalDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I have a fire cape here."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Sell your fire cape?", "Yes, sell it for 8,000 TokKul.", "No, keep it.", "Bargain for TzRek-Jad."); + stage = 1; + break; + case 1: + switch(buttonId) { + case 1: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, player.getInventory().containsItems(FIRECAPE) ? "Hand your cape here, young JalYte." : "You not have firecape, JalYt."); + stage = 10; + break; + case 2: + end(); + break; + case 3: + interpreter.sendOptions("Sacrifice your firecape?", "Yes, I know I won't get my cape back.", "No, I like my cape!"); + stage = 20; + break; + } + break; + case 10: + if (player.getInventory().containsItem(FIRECAPE)) { + if (player.getInventory().remove(FIRECAPE)) { + TOKKUL.setAmount(8000); + player.getInventory().add(TOKKUL); + TOKKUL.setAmount(1); + } + } + end(); + break; + case 20: + switch (buttonId) { + case 1: + if (player.hasItem(JAD_PET)) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Best you train one TzRek-Jad only."); + stage = 21; + break; + } + if (player.getFamiliarManager().hasFamiliar()) { + if (player.getFamiliarManager().getFamiliar().getId() == 8650) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Best you train one TzRek-Jad only."); + stage = 21; + break; + } + } + if (player.getInventory().remove(FIRECAPE)) { + int r = RandomFunction.getRandom(200); + if (r == 1) { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "You lucky. Better train him good else TzTok-Jad find", "you, JalYt."); + if (!player.getFamiliarManager().hasFamiliar()) { + player.getFamiliarManager().summon(JAD_PET, true); + player.sendNotificationMessage("You have a funny feeling like you're being followed."); + } else if (player.getInventory().freeSlots() > 0) { + player.getInventory().add(JAD_PET); + player.sendNotificationMessage("You feel something weird sneaking into your backpack."); + } + Repository.sendNews(player.getUsername() + " now commands a miniature TzTok-Jad!"); + } else { + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "You not lucky. Maybe next time, JalYt."); + } + } + stage = 21; + break; + case 2: + end(); + break; + } + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("firecape-exchange") }; + } + } + + /** + * Handles the TzRekJad dialogue. + * @author Empathy + * + */ + public final class TzRekJadDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code TzRekJadDialogue} {@code Object}. + */ + public TzRekJadDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code TzRekJadDialogue} {@code Object}. + * + * @param player the player. + */ + public TzRekJadDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TzRekJadDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int i = RandomFunction.getRandom(1); + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, i == 1 ? "Do you miss your people?" : "Are you hungry?"); + stage = (i == 1 ? 0 : 5); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Mej-TzTok-Jad Kot-Kl!"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No.. I don't think so."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Jal-Zek Kl?"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, no, I wouldn't hurt you."); + stage = 4; + break; + case 4: + end(); + break; + case 5: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Kl-Kra!"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ooookay..."); + stage = 4; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8650 }; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC.java new file mode 100644 index 000000000..0868409f4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/corp/CorporealBeastNPC.java @@ -0,0 +1,320 @@ +package core.game.node.entity.npc.bosses.corp; + +import java.util.ArrayList; +import java.util.List; + +import core.game.content.global.BossKillCounter; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Corporeal beast NPC. + * @author Emperor + * + */ +@Initializable +public final class CorporealBeastNPC extends AbstractNPC { + + /** + * The combat handler. + */ + private final MultiSwingHandler combatHandler = new CombatHandler(); + + /** + * The dark energy core NPC. + */ + private NPC darkEnergyCore; + + /** + * Constructs a new {@code CorporealBeastNPC} {@code Object}. + */ + public CorporealBeastNPC() { + this(8133, Location.create(2993, 4380, 2)); + } + + /** + * Constructs a new {@code CorporealBeastNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public CorporealBeastNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.init(); + configureBossData(); + } + + @Override + public void handleTickActions() { + for(Player player : getViewport().getCurrentPlane().getPlayers()){ + if(player.getFamiliarManager().hasFamiliar() && RandomFunction.random(100) < 10){ + int heal = player.getFamiliarManager().getFamiliar().getSkills().getLifepoints() / 4; + super.getSkills().heal(heal); + player.sendMessage("Your familiar was devoured by the Corporeal Beast, healing it by "+heal+" HP."); + player.getFamiliarManager().dismiss(); + } + } + if (getSkills().getLifepoints() < getSkills().getMaximumLifepoints()) { + if (getViewport().getCurrentPlane().getPlayers().isEmpty()) { + super.fullRestore(); + if (darkEnergyCore != null) { + darkEnergyCore.clear(); + darkEnergyCore = null; + } + } + } + super.handleTickActions(); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatHandler; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new CorporealBeastNPC(id, location); + } + + @Override + public double getFormatedHit(BattleState state, int hit) { + if (hit > 100) { + hit = 100; + } + return super.getFormatedHit(state, hit); + } + + @Override + public int[] getIds() { + return new int[] { 8133 }; + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + BossKillCounter.addtoKillcount((Player) killer, this.getId()); + if (darkEnergyCore != null) { + darkEnergyCore.clear(); + darkEnergyCore = null; + } + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + init(); + return super.newInstance(arg); + } + + /** + * Handles the Corporeal beast's combat. + * @author Emperor + * + */ + static class CombatHandler extends MultiSwingHandler { + + + /** + * Constructs a new {@code CombatHandler} {@code Object}. + */ + public CombatHandler() { + super( + //Melee (crush) + new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), Animation.create(10057)).setMaximumHit(52), + //Melee (slash) + new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), Animation.create(10058)).setMaximumHit(51), + //Magic (drain skill) + new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), Animation.create(10410), null, null, Projectile.create(null, null, 1823, 60, 36, 41, 46)).setMaximumHit(55), + //Magic (location based) + new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), Animation.create(10410), null, null, Projectile.create(null, null, 1824, 60, 36, 41, 46)).setMaximumHit(42), + //Magic (hit through prayer) + new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), Animation.create(10410), null, null, Projectile.create(null, null, 1825, 60, 36, 41, 46)).setMaximumHit(66) + ); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + spawnDarkCore((CorporealBeastNPC) entity, victim); + if (doStompAttack(entity)) { + entity.getProperties().getCombatPulse().setNextAttack(entity.getProperties().getAttackSpeed()); + return -1; + } + //Location based attack. + if (super.getNext().getProjectile() != null && super.getNext().getProjectile().getProjectileId() == 1824) { + setCurrent(getNext()); + CombatStyle style = getCurrent().getStyle(); + setType(style); + int index = RandomFunction.randomize(super.getAttacks().length); + SwitchAttack pick = getNext(entity, victim, state, index); + setNext(pick); + fireLocationBasedAttack(entity, victim.getLocation()); + entity.getProperties().getCombatPulse().setNextAttack(entity.getProperties().getAttackSpeed()); + return -1; + } + return super.swing(entity, victim, state); + } + + /** + * Spawns a dark core. + * @param npc The corporeal beast NPC. + * @param victim The victim. + */ + private void spawnDarkCore(final CorporealBeastNPC npc, Entity victim) { + if (npc.darkEnergyCore != null && npc.darkEnergyCore.isActive()) { + return; + } + double max = npc.getSkills().getMaximumLifepoints() * (0.3 + (npc.getViewport().getCurrentPlane().getPlayers().size() * 0.05)); + if (npc.getSkills().getLifepoints() > max) { + return; + } + Location l = RegionManager.getTeleportLocation(victim.getLocation(), 3); + npc.darkEnergyCore = NPC.create(8127, l, npc); + npc.darkEnergyCore.setActive(true); + Projectile.create(npc.getLocation().transform(2, 2, 0), l, 1828, 60, 0, 0, 60, 20, 0).send(); + GameWorld.getPulser().submit(new Pulse(2, npc) { + @Override + public boolean pulse() { + npc.darkEnergyCore.init(); + return true; + } + }); + } + + /** + * Fires the location based magic attack. + * @param entity The corporeal beast. + * @param location The location. + */ + private void fireLocationBasedAttack(final Entity entity, final Location location) { + entity.animate(getCurrent().getAnimation()); + Projectile.create(entity, null, 1824, 60, 0, 41, 0).transform(entity, location, true, 46, 10).send(); + int ticks = 1 + (int) Math.ceil(entity.getLocation().getDistance(location) * 0.5); + GameWorld.getPulser().submit(new Pulse(ticks) { + boolean secondStage = false; + List players = RegionManager.getLocalPlayers(entity); + Location[] locations = null; + @Override + public boolean pulse() { + if (!secondStage) { + for (Player p : players) { + if (p.getLocation().equals(location)) { + hit(p); + } + } + locations = new Location[4 + RandomFunction.random(3)]; + for (int i = 0; i < locations.length; i++) { + locations[i] = location.transform(-2 + RandomFunction.random(5), -2 + RandomFunction.random(5), 0); + Projectile.create(location, locations[i], 1824, 60, 0, 25, 56, 0, 0).send(); + } + setDelay(2); + secondStage = true; + return false; + } + for (int i = 0; i < locations.length; i++) { + Location l = locations[i]; + Graphics.send(Graphics.create(1806), l.transform(-1, -1, 0)); + for (Player p : players) { + if (p.getLocation().equals(l)) { + hit(p); + } + } + } + players.clear(); + players = null; + locations = null; + return true; + } + private void hit(Player p) { + int max = p.hasProtectionPrayer(CombatStyle.MAGIC) ? 13 : 42; + int hit = 0; + if (isAccurateImpact(entity, p)) { + hit = RandomFunction.random(max); + } + p.getImpactHandler().handleImpact(entity, hit, CombatStyle.MAGIC); + } + }); + } + + /** + * Attempts to do a stomp attack if needed. + * @param entity The corporeal beast. + * @return {@code True} if a stomp attack is being done. + */ + public boolean doStompAttack(Entity entity) { + Location l = entity.getLocation(); + List stompTargets = null; + for (Player player : RegionManager.getLocalPlayers(entity, 5)) { + Location p = player.getLocation(); + if (p.getX() >= l.getX() && p.getY() >= l.getY() && p.getX() < l.getX() + entity.size() && p.getY() < l.getY() + entity.size()) { + if (stompTargets == null) { + stompTargets = new ArrayList<>(); + } + stompTargets.add(player); + } + } + if (stompTargets != null) { + entity.visualize(Animation.create(10496), Graphics.create(1834)); + for (Player p : stompTargets) { + p.getImpactHandler().manualHit(entity, RandomFunction.random(52), HitsplatType.NORMAL, 1); + } + return true; + } + return false; + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + super.adjustBattleState(entity, victim, state); + if (getCurrent().getProjectile() != null && getCurrent().getProjectile().getProjectileId() == 1823) { + if (state.getEstimatedHit() > 0) { + int random = RandomFunction.random(3); + int skill = random == 0 ? Skills.PRAYER : random == 1 ? Skills.MAGIC : Skills.SUMMONING; + int drain = 1 + RandomFunction.random(6); + if ((skill == Skills.PRAYER ? victim.getSkills().getPrayerPoints() : victim.getSkills().getLevel(skill)) < 1) { + victim.getImpactHandler().manualHit(entity, drain, HitsplatType.NORMAL,2); + ((Player) victim).getPacketDispatch().sendMessage("Your Hitpoints have been slightly drained!"); + } + else { + if (skill == Skills.PRAYER) { + victim.getSkills().decrementPrayerPoints(drain); + } else { + victim.getSkills().updateLevel(skill, -drain, 0); + } + if (victim instanceof Player) { + ((Player) victim).getPacketDispatch().sendMessage("Your " + Skills.SKILL_NAME[skill] + " has been slightly drained!"); + } + } + } + } + } + + @Override + protected int getFormattedHit(Entity entity, Entity victim, BattleState state, int hit) { + if (getCurrent().getProjectile() == null || getCurrent().getProjectile().getProjectileId() != 1825) { + hit = (int) entity.getFormatedHit(state, hit); + } + return formatHit(victim, hit); + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/bosses/corp/DarkEnergyCoreNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/corp/DarkEnergyCoreNPC.java new file mode 100644 index 000000000..e26bf785b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/corp/DarkEnergyCoreNPC.java @@ -0,0 +1,124 @@ +package core.game.node.entity.npc.bosses.corp; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Dark Energy Core NPC. + * @author Emperor + * + */ +@Initializable +public final class DarkEnergyCoreNPC extends AbstractNPC { + + /** + * The corporeal beast. + */ + private NPC master; + + /** + * The amount of ticks. + */ + private int ticks = 0; + + /** + * The amount of failed attacks. + */ + private int fails = 0; + + /** + * Constructs a new {@code DarkEnergyCoreNPC} {@code Object}. + */ + public DarkEnergyCoreNPC() { + this(8127, null); + } + + /** + * Constructs a new {@code DarkEnergyCoreNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public DarkEnergyCoreNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + DarkEnergyCoreNPC core = new DarkEnergyCoreNPC(id, location); + if (objects.length > 0) { + core.master = (NPC) objects[0]; + } + return core; + } + + @Override + public boolean canStartCombat(Entity victim) { + return false; //No combat needed. + } + + @Override + public void handleTickActions() { + ticks++; + boolean poisoned = getStateManager().hasState(EntityState.POISONED); + if (getStateManager().hasState(EntityState.STUNNED) || isInvisible()) { + return; + } + if (fails == 0 && poisoned && (ticks % 100) != 0) { + return; + } + if (ticks % 2 == 0) { + boolean jump = true; + for (Player p : getViewport().getCurrentPlane().getPlayers()) { + if (p.getLocation().withinDistance(getLocation(), 1)) { + jump = false; + int hit = 5 + RandomFunction.random(6); + p.getImpactHandler().manualHit(master, hit, HitsplatType.NORMAL); + master.getSkills().heal(hit); + p.getPacketDispatch().sendMessage("The dark core creature steals some life from you for its master."); + } + } + if (jump) { + Entity victim = master.getProperties().getCombatPulse().getVictim(); + if (++fails >= 3 && victim != null && victim.getViewport().getCurrentPlane() == getViewport().getCurrentPlane()) { + jump(victim.getLocation()); + fails = 0; + } + } else { + fails = 0; + } + } + } + + /** + * Handles jumping towards a new location. + * @param location The location. + */ + private void jump(final Location location) { + setInvisible(true); + Projectile.create(getLocation(), location, 1828, 0, 0, 0, 60, 20, 0).send(); + GameWorld.getPulser().submit(new Pulse(2, this) { + @Override + public boolean pulse() { + getProperties().setTeleportLocation(location); + setInvisible(false); + return true; + } + }); + } + + @Override + public int[] getIds() { + return new int[] { 8127 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.java new file mode 100644 index 000000000..c4be2a619 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/wilderness/ChaosElementalNPC.java @@ -0,0 +1,187 @@ +package core.game.node.entity.npc.bosses.wilderness; + +import core.game.content.global.BossKillCounter; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the chaos elemental npc. + * @author Vexia + */ +@Initializable +public class ChaosElementalNPC extends AbstractNPC { + + /** + * The multi swing handler. + */ + private final MultiSwingHandler COMBAT_HANDLER = new ChaosCombatHandler(); + + /** + * Constructs a new {@Code ChaosElementalNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public ChaosElementalNPC(int id, Location location) { + super(id, location); + } + + @Override + public void tick() { + super.tick(); + if(!isActive()){ + getProperties().getCombatPulse().stop(); + } + } + + /** + * Constructs a new {@Code ChaosElementalNPC} {@Code Object} + */ + public ChaosElementalNPC() { + this(-1, null); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return COMBAT_HANDLER; + } + + @Override + public void sendImpact(BattleState state) { + if (state.getEstimatedHit() > 28) { + state.setEstimatedHit(RandomFunction.random(20, 28)); + } + super.sendImpact(state); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ChaosElementalNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 3200 }; + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + BossKillCounter.addtoKillcount((Player) killer, this.getId()); + } + + /** + * Handles the chaos combat handler. + * @author Vexia + */ + public static class ChaosCombatHandler extends MultiSwingHandler { + + /** + * The projectile animation. + */ + private static final Animation PROJECTILE_ANIM = new Animation(3148); + + /** + * The primary projectile. + */ + private static final Projectile PRIMARY_PROJECTILE = Projectile.create((Entity) null, null, 557, 60, 55, 41, 46, 20, 255); + + /** + * The switch attacks. + */ + private static final SwitchAttack[] ATTACKS = new SwitchAttack[] { new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), PROJECTILE_ANIM, new Graphics(556), null, PRIMARY_PROJECTILE), // primary + new SwitchAttack(CombatStyle.RANGE.getSwingHandler(), PROJECTILE_ANIM, new Graphics(556), null, PRIMARY_PROJECTILE),// primary + new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), PROJECTILE_ANIM, new Graphics(556), null, PRIMARY_PROJECTILE),// primary + new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), PROJECTILE_ANIM, new Graphics(553), null, Projectile.create((Entity) null, null, 554, 60, 55, 41, 46, 20, 255)) { + @Override + public boolean canSelect(Entity entity, Entity victim, BattleState state) { + return true; + } + },// tele + new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), PROJECTILE_ANIM, new Graphics(550), null, Projectile.create((Entity) null, null, 551, 60, 55, 41, 46, 20, 255)) { + @Override + public boolean canSelect(Entity entity, Entity victim, BattleState state) { + return true; + } + } }; + + /** + * Constructs a new {@Code ChaosCombatHandler} {@Code + * Object} + */ + public ChaosCombatHandler() { + super(ATTACKS); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + super.impact(entity, victim, state); + SwitchAttack attack = super.getCurrent(); + if (victim instanceof Player) { + Player player = victim.asPlayer(); + if (player == null) { + return; + } + if (attack.getProjectile().getProjectileId() == 554) { + Location loc = getRandomLoc(entity); + while (!RegionManager.isTeleportPermitted(loc) || RegionManager.getObject(loc) != null) { + loc = getRandomLoc(entity); + } + if (loc.equals(player.getLocation())) { + loc = entity.getLocation(); + } + player.teleport(loc); + } else if (attack.getProjectile().getProjectileId() == 551) { + if (player.getInventory().freeSlots() < 1 || player.getEquipment().itemCount() < 1) { + return; + } + Item e = null; + int tries = 0; + while (e == null && tries < 30) { + e = player.getEquipment().toArray()[RandomFunction.random(player.getEquipment().itemCount())]; + tries++; + if (e != null && player.getInventory().hasSpaceFor(e)) { + break; + } + e = null; + } + if (e == null) { + return; + } + player.lock(1); + if (!player.getEquipment().containsItem(e)) { + return; + } + if (player.getEquipment().remove(e)) { + player.getInventory().add(e); + } + } + } + } + + /** + * Gets the random loc. + * @param entity the entity. + * @return the loc. + */ + public Location getRandomLoc(Entity entity) { + Location l = entity.getLocation(); + boolean negative = RandomFunction.random(2) == 1; + return l.getLocation().transform((negative ? RandomFunction.random(-10, 10) : RandomFunction.random(0, 10)), (negative ? RandomFunction.random(-10, 10) : RandomFunction.random(0, 10)), 0); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java new file mode 100644 index 000000000..b737a984c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java @@ -0,0 +1,263 @@ +package core.game.node.entity.npc.bosses.wilderness; + +import core.game.content.global.BossKillCounter; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.ArmourSet; +import core.game.node.entity.combat.equipment.FireType; +import core.game.node.entity.combat.handlers.DragonfireSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the King Black Dragon NPC. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class KingBlackDragonNPC extends AbstractNPC { + + /** + * The default spawn location. + */ + private static final Location DEFAULT_SPAWN = Location.create(2273, 4698, 0); + + /** + * The combat swing handler. + */ + private CombatSwingHandler combatHandler = new KBDCombatSwingHandler(); + + + public KingBlackDragonNPC() { + super(-1,null); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + BossKillCounter.addtoKillcount((Player) killer, this.getId()); + } + + /** + * Constructs a new {@code KingBlackDragonNPC} {@code Object}. + * @param id the id. + * @param l the l. + */ + public KingBlackDragonNPC(int id, Location l) { + super(id, l); + } + + @Override + public void init() { + super.init(); + configureBossData(); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new KingBlackDragonNPC(id, location); + } + + @Override + public int getDragonfireProtection(boolean fire) { + return 0x2 | 0x4 | 0x8; + } + + @Override + public int[] getIds() { + return new int[] { 50 }; + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatHandler; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return super.newInstance(arg); + } + + /** + * Handles the King Black Dragon's combat swings. + * @author Emperor + */ + static class KBDCombatSwingHandler extends CombatSwingHandler { + + /** + * The style. + */ + private CombatStyle style = CombatStyle.RANGE; + + /** + * Dragonfire. + */ + private static final DragonfireSwingHandler DRAGONFIRE = new DragonfireSwingHandler(false, 56, null, true); + + /** + * The melee attack animation. + */ + private static final Animation MELEE_ATTACK = new Animation(80, Priority.HIGH); + + /** + * The fire type. + */ + private FireType fireType = FireType.FIERY_BREATH; + + /** + * Constructs a new {@code KBDCombatSwingHandler} {@Code Object}. + */ + public KBDCombatSwingHandler() { + super(CombatStyle.RANGE); + } + + @Override + public void adjustBattleState(Entity entity, Entity victim, BattleState state) { + if (style == CombatStyle.RANGE) { + fireType.getTask().exec(victim, entity); + state.setStyle(null); + DRAGONFIRE.adjustBattleState(entity, victim, state); + state.setStyle(CombatStyle.RANGE); + return; + } + style.getSwingHandler().adjustBattleState(entity, victim, state); + } + + @Override + public int calculateAccuracy(Entity entity) { + if (style == CombatStyle.MELEE) { + return style.getSwingHandler().calculateAccuracy(entity); + } + return CombatStyle.MAGIC.getSwingHandler().calculateAccuracy(entity); + } + + @Override + public int calculateDefence(Entity entity, Entity attacker) { + if (style == CombatStyle.MELEE) { + return style.getSwingHandler().calculateDefence(entity, attacker); + } + return CombatStyle.MAGIC.getSwingHandler().calculateDefence(entity, attacker); + } + + @Override + public int calculateHit(Entity entity, Entity victim, double modifier) { + if (style == CombatStyle.MELEE) { + return style.getSwingHandler().calculateHit(entity, victim, modifier); + } + int max = 56; + int damage = max; + if (victim instanceof Player) { + int val = victim.getDragonfireProtection(true); + if ((val & 0x2) != 0) { + damage *= 0.5; + } + if ((val & 0x4) != 0) { + damage -= (int) (damage * 0.85); + } + if ((val & 0x8) != 0) { + damage *= 0.6; + } + if (damage < 3) { + damage = 3; + } + } + if (fireType != FireType.FIERY_BREATH) { + damage += 11; + } + return damage; + } + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + if (!isProjectileClipped(entity, victim, false)) { + return InteractionType.NO_INTERACT; + } + if (victim.getCenterLocation().withinDistance(entity.getCenterLocation(), getCombatDistance(entity, victim, 9)) && super.canSwing(entity, victim) == InteractionType.STILL_INTERACT) { + entity.getWalkingQueue().reset(); + return InteractionType.STILL_INTERACT; + } + return InteractionType.NO_INTERACT; + } + + @Override + public ArmourSet getArmourSet(Entity e) { + return style.getSwingHandler().getArmourSet(e); + } + + @Override + public double getSetMultiplier(Entity e, int skillId) { + return style.getSwingHandler().getSetMultiplier(e, skillId); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + style.getSwingHandler().impact(entity, victim, state); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + style = CombatStyle.RANGE; + int hit = 0; + int ticks = 1; + if (victim.getCenterLocation().withinDistance(entity.getCenterLocation(), getCombatDistance(entity, victim, 1)) && RandomFunction.random(10) < 7) { + style = CombatStyle.MELEE; + } else { + ticks += (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3); + } + fireType = FireType.values()[RandomFunction.random(FireType.values().length)]; + state.setStyle(style); + if (isAccurateImpact(entity, victim)) { + int max = calculateHit(entity, victim, 1.0); + state.setMaximumHit(max); + hit = RandomFunction.random(max); + } + state.setEstimatedHit(hit); + ((NPC) entity).getAggressiveHandler().setPauseTicks(2); + return ticks; + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + switch (style) { + case MELEE: + entity.animate(MELEE_ATTACK); + break; + case RANGE: + Projectile.ranged(entity, victim, fireType.getProjectileId(), 20, 36, 50, 15).send(); + entity.animate(fireType.getAnimation()); + break; + default: + break; + } + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (style != CombatStyle.MELEE) { + DRAGONFIRE.visualizeImpact(entity, victim, state); + } else { + style.getSwingHandler().visualizeImpact(entity, victim, state); + } + } + + /** + * Gets the fire type. + * @return the type. + */ + public FireType getFireType() { + return fireType; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AlKharidShopKeeperDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AlKharidShopKeeperDialogue.java new file mode 100644 index 000000000..ef836af17 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AlKharidShopKeeperDialogue.java @@ -0,0 +1,82 @@ +package core.game.node.entity.npc.city.alkharid; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the dialogue plugin used for the al kharid shop keepers. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AlKharidShopKeeperDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code AlKahridShopKeeperDialogue} {@code Object}. + */ + public AlKharidShopKeeperDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AlKahridShopKeeperDialogue} {@code Object}. + * @param player the player. + */ + public AlKharidShopKeeperDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AlKharidShopKeeperDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can I help you at all?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please. What are you selling?", "How should I use your shop?", "No, thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + end(); + npc.openShop(player); + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I'm glad you ask! You can buy as many of the items", "stocked as you wish. You can also sell most items to the", "shop."); + stage = 20; + break; + case 3: + end(); + break; + + } + break; + case 20: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 525, 524 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AlTheCamelDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AlTheCamelDialogue.java new file mode 100644 index 000000000..5f50b90d9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AlTheCamelDialogue.java @@ -0,0 +1,76 @@ +package core.game.node.entity.npc.city.alkharid; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the dialogue plugin used for al the camel. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AlTheCamelDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code AlTheCamelDialogue} {@code Object}. + */ + public AlTheCamelDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AlTheCamelDialogue} {@code Object}. + * @param player the player. + */ + public AlTheCamelDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AlTheCamelDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + int rand = RandomFunction.random(1, 3); + switch (rand) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Mmm... Looks like that camel would make a nice kebab."); + stage = 0; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "If I go near that camel, it'll probably bite my hand off."); + stage = 0; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Mmm... Looks like that camel would make a nice kebab."); + stage = 0; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player.getPacketDispatch().sendMessage("The camel tries to stomp on your foot, but you pull it back quickly."); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2809 }; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliMorrisaneDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliMorrisaneDialogue.java new file mode 100644 index 000000000..dcfaf3266 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliMorrisaneDialogue.java @@ -0,0 +1,131 @@ +package core.game.node.entity.npc.city.alkharid; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the ali morrisane dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AliMorrisaneDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code AliMorrisaneDialogue} {@code Object}. + * @param player the player. + */ + public AliMorrisaneDialogue(final Player player) { + super(player); + } + + /** + * Constructs a new {@code AliMorrisaneDialogue} {@code Object}. + */ + public AliMorrisaneDialogue() { + /** + * empty. + */ + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AliMorrisaneDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Good day and welcome back to Al Kharid."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player("Hello to you too."); + stage = 1; + break; + case 1: + npc("My name is Ali Morrisane - the greatest salesman in", "the world."); + stage = 2; + break; + case 2: + options("If you are, then why are you still selling goods from a stall?", "So what are you selling then?"); + stage = 3; + break; + case 3: + switch (buttonId) { + case 1: + player("If you are, then why are you still selling goods from a", "stall?"); + stage = 10; + break; + case 2: + end(); + npc.openShop(player); + break; + } + break; + case 10: + npc("Well one can only do and sell so much. If I had more", "staff I'd be able to sell more, rather than wasting my", "time on menial things I could get on with selling sand", "to the Bedabin and useless tourist trinkets to everyone."); + stage = 11; + break; + case 11: + options("I'm far too busy - adventuring is a full time job you know.", "I'd like to help you but...."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("I'm far too busy - adventuring is a full time job you", "know."); + stage = 15; + break; + case 2: + player("I'd like to help you but....."); + stage = 13; + break; + } + break; + case 13: + npc("Yes I know, I know - the life of a shop keeper isn't", "slaying dragon and wooing damsels but it has its", "charms"); + stage = 14; + break; + case 14: + end(); + break; + case 15: + npc("No problem my friend, perhaps another time."); + stage = 16; + break; + case 16: + npc("Anyway, have a look at my wares."); + stage = 17; + break; + case 17: + options("No, I'm really too busy.", "Okay."); + stage = 18; + break; + case 18: + switch (buttonId) { + case 1: + end(); + break; + case 2: + end(); + npc.openShop(player); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 1862 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheFarmerDialogue.kt b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheFarmerDialogue.kt new file mode 100644 index 000000000..9e7477eea --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheFarmerDialogue.kt @@ -0,0 +1,73 @@ +package core.game.node.entity.npc.city.alkharid + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AliTheFarmerDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello there!") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FRIENDLY,"Oh, er, hello. What do you want?").also { stage++ } + 1 -> options ("What can you tell me about Al Kharid?", "So, what do you do here?", + "I hear you work for Ali Morrisane...", "I hear you've been threatening the other shopkeepers.").also { stage++ } + 2 -> when(buttonId){ + 1 -> player(FacialExpression.ASKING, "What can you tell me about Al Kharid?").also { stage = 10 } + 2 -> player(FacialExpression.ASKING, "So, what do you do here?").also { stage = 20 } + 3 -> player(FacialExpression.ASKING, "I hear you work for Ali Morrisane...").also { stage = 30 } + 4 -> player(FacialExpression.ASKING, "I hear you've been threatening the other shopkeepers.").also { stage = 40 } + + } + + 10 -> npc(FacialExpression.FRIENDLY,"There's not much farming land around here.", "Only that little patch outside.").also { stage++ } + 11 -> player(FacialExpression.ASKING,"Can you give me any advice on farming here in","the desert?").also { stage++ } + 12 -> npc(FacialExpression.FRIENDLY,"Like I said, I only know about cactuses...").also { stage++ } + 13 -> player(FacialExpression.FRIENDLY,"Just tell me about cactuses, then.").also { stage++ } + 14 -> npc(FacialExpression.FRIENDLY,"First you have to weed the patch using a rake.").also { stage++ } + 15 -> player(FacialExpression.ASKING,"Can you give me any other advice?").also { stage++ } + 16 -> npc(FacialExpression.FRIENDLY,"Not really. I've not done much farming recently.").also { stage++ } + 17 -> player(FacialExpression.ASKING,"Well, can you at least sell me any gardening", "tools or seeds?").also { stage++ } + 18 -> npc(FacialExpression.GUILTY,"Sorry. They haven't been delivered yet.").also { stage = 1 } + + 20 -> npc( + FacialExpression.FRIENDLY,"I'm going to set up a shop selling farming implements.", + "That patch out there may be small, ", "but it's all we've got.").also { stage = 11 } + + 30 -> npc( + FacialExpression.FRIENDLY,"Yes, he bought these tents and had them put up for us.", + "He says he'll also get our goods in,", "so we can start selling them soon.").also { stage++ } + 31 -> npc(FacialExpression.FRIENDLY,"I only know how to farm cactuses, so this spot", "is perfect.").also { stage++ } + 32 -> player(FacialExpression.THINKING,"Maybe I should talk to him...").also { stage++ } + 33 -> npc(FacialExpression.FRIENDLY,"Of course.", "He's always happy to talk to possible business", "partners.").also { stage = 1 } + + 40 -> npc(FacialExpression.FRIENDLY,"Now why would you think that?").also { stage++ } + 41 -> player(FacialExpression.FRIENDLY,"One of the shopkeepers told they were threatened", "by a man with a rake...").also { stage++ } + 42 -> npc(FacialExpression.FRIENDLY,"Those people just don't want us to succeed.", "Don't listen to them!").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AliTheFarmerDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(2821) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheGuard.kt b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheGuard.kt new file mode 100644 index 000000000..f75a8a3b5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheGuard.kt @@ -0,0 +1,70 @@ +package core.game.node.entity.npc.city.alkharid + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AliTheGuard(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello there!") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.ANNOYED,"I'm working. What do you have to say that's so urgent?").also { stage++ } + 1 -> options ("What can you tell me about Al Kharid?", "So, what do you do here?", + "I hear you work for Ali Morrisane...", "I hear you've been threatening the other shopkeepers.").also { stage++ } + 2 -> when(buttonId){ + 1 -> player(FacialExpression.ASKING, "What can you tell me about Al Kharid?").also { stage = 10 } + 2 -> player(FacialExpression.ASKING, "So, what do you do here?").also { stage = 20 } + 3 -> player(FacialExpression.ASKING, "I hear you work for Ali Morrisane...").also { stage = 30 } + 4 -> player(FacialExpression.ASKING, "I hear you've been threatening the other shopkeepers.").also { stage = 40 } + } + + 10 -> npc(FacialExpression.FRIENDLY,"There's a lot of space here. More open space than back home.").also { stage++ } + 11 -> player(FacialExpression.ASKING,"So where is back home?").also { stage++ } + 12 -> npc(FacialExpression.FRIENDLY,"Pollnivneach. It's a town to the south of the", "Shantay Pass.").also { stage = 1 } + + 20 -> npc( + FacialExpression.ANNOYED,"I'm on guard duty.", "Making sure nobody tries to steal anything from", + "the house and tents in the middle of town.").also { stage++ } + 21 -> player(FacialExpression.ASKING,"Why are you only guarding those buildings?").also { stage++ } + 22 -> npc(FacialExpression.SUSPICIOUS,"That's all I've been hired to guard.").also { stage = 1 } + + 30 -> npc(FacialExpression.FRIENDLY,"Yeah, he hired me.", "He owns this house and these two tents, too.").also { stage++ } + 31 -> player(FacialExpression.HALF_ASKING,"Is the work good?").also { stage++ } + 32 -> npc(FacialExpression.FRIENDLY,"It pays better than back home.").also { stage++ } + 33 -> player(FacialExpression.ASKING,"Why, what did you do back home?").also { stage++ } + 34 -> npc(FacialExpression.SUSPICIOUS,"Never you mind.").also { stage++ } + 35 -> npc(FacialExpression.FRIENDLY,"But Ali Morrisane pays us well, at least.").also { stage++ } + 36 -> player(FacialExpression.ASKING,"Maybe I should talk to him...").also { stage++ } + 37 -> npc(FacialExpression.FRIENDLY,"Why not?", "He always likes to meet potential business partners.").also { stage = 1 } + + 40 -> npc(FacialExpression.ANNOYED,"So? They talk too much.").also { stage++ } + 41 -> player(FacialExpression.HALF_ASKING,"You're not going to deny it?").also { stage++ } + 42 -> npc(FacialExpression.LOUDLY_LAUGHING,"Why bother?", "None of them can fight back, after all.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AliTheGuard(player) + } + + override fun getIds(): IntArray { + return intArrayOf(2823) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheLeafletDropper.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheLeafletDropper.java new file mode 100644 index 000000000..ad3c3da40 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheLeafletDropper.java @@ -0,0 +1,177 @@ +package core.game.node.entity.npc.city.alkharid; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the dialogue plugin used for ali the leaflet dropper npc. + * @author 'Vexia + * @version 1.9 + */ +@Initializable +public final class AliTheLeafletDropper extends DialoguePlugin { + + /** + * Represents the flyer item. + */ + private static final Item FLYER = new Item(7922); + + /** + * Constructs a new {@code AliTheLeafletDropper} {@code Object}. + */ + public AliTheLeafletDropper() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AliTheLeafletDropper} {@code Object}. + * @param player the player. + */ + public AliTheLeafletDropper(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AliTheLeafletDropper(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length == 2) { + if (player.getInventory().freeSlots() == 0) { + npc("Looks like your hands are full. come back when you", "have space for my flyer."); + stage = 0; + return true; + } + if (player.getInventory().contains(7922, 1) || player.getBank().contains(7922, 1)) { + npc("Are you trying to be funny or has age turned your", "brain to mush? You already have a flyer!"); + stage = 0; + return true; + } + } + npc("I don't have time to talk right now! Ali Morrisane is", "paying me to hand out these flyers."); + stage = 700; + if (args.length == 2) { + player.getInventory().add(FLYER); + npc("Here take one and let me get back to work!"); + stage = 600; + return true; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + case 600: + npc("I still have hundreds of these flyers to hand out, I", "wonder if Ali would notice if I quietly dumped them", "somewhere?"); + stage = 601; + break; + case 601: + end(); + break; + case 700: + interpreter.sendOptions("Select an Option", "Who is Ali Morrisane?", "What are the flyers for?", "What is there to do round here, boy?"); + stage = 701; + break; + case 701: + switch (buttonId) { + case 1: + player("Who is Ali Morrisane?"); + stage = 710; + break; + case 2: + player("What are the flyers for?"); + stage = 720; + break; + case 3: + player("What is there to do round here, boy?"); + stage = 300; + break; + } + break; + case 710: + npc("Ali Morrisane is the greatest merchant in the east!"); + stage = 711; + break; + case 711: + player("Were you paid to say that?"); + stage = 712; + break; + case 712: + npc("Of course I was! You can find him on the north edge", "of town"); + stage = 713; + break; + case 713: + end(); + break; + case 720: + npc("Well, ali Morrisane isn't too popular with the other", "traders in Al Kharid, mainly because he's from", "Pollnivneach and they feel he has no business trading in", "their town."); + stage = 721; + break; + case 721: + npc("I think they're just sour because he's better at making", "money than them."); + stage = 722; + break; + case 722: + npc("The flyers advertises the different shops you can find in", "Al Kharid."); + stage = 723; + break; + case 723: + npc("It also entitles you to money off your next purchase in", "any of the shops listed on it. It's Ali's way of getting on", "the good side of the traders."); + stage = 724; + break; + case 724: + player("Which shops?"); + stage = 725; + break; + case 725: + npc("The flyer will dicuss them all."); + stage = 0; + break; + case 300: + npc("I'm very busy, so listen carefully! I shall say this only", "once."); + stage = 301; + break; + case 301: + npc("Apart from a busy and wonderous market place in Al", "Kharid to the south, there is the Duel Arena to the", "south-east where you can challenge other players to a", "fight."); + stage = 302; + break; + case 302: + npc("If you're here to make money, there is a mine to the", "south."); + stage = 303; + break; + case 303: + npc("Watch out for scorpions though, they'll take a pop at", "you if you go too near them. To avoid them just follow", "the western fence as you travel south."); + stage = 304; + break; + case 304: + npc("If you're in the mood for a little rest and relaxation,", "there are a couple of nice fishing spots south of the", "town."); + stage = 305; + break; + case 305: + player("Thanks for the help!"); + stage = 306; + break; + case 306: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 3680 }; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheSmithDialogue.kt b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheSmithDialogue.kt new file mode 100644 index 000000000..7ec1109b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/alkharid/AliTheSmithDialogue.kt @@ -0,0 +1,68 @@ +package core.game.node.entity.npc.city.alkharid + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AliTheSmithDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello there!") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.FRIENDLY,"You seem rather cheerful. Is there anything you're after?").also { stage++ } + 1 -> options ("What can you tell me about Al Kharid?", "So, what do you do here?", + "I hear you work for Ali Morrisane...", "I hear you've been threatening the other shopkeepers.").also { stage++ } + 2 -> when(buttonId){ + 1 -> player(FacialExpression.ASKING, "What can you tell me about Al Kharid?").also { stage = 10 } + 2 -> player(FacialExpression.ASKING, "So, what do you do here?").also { stage = 20 } + 3 -> player(FacialExpression.ASKING, "I hear you work for Ali Morrisane...").also { stage = 30 } + 4 -> player(FacialExpression.HALF_ASKING, "I hear you've been threatening the other shopkeepers.").also { stage = 40 } + } + + 10 ->npc(FacialExpression.FRIENDLY,"Well, it's hot and full of sand.").also { stage++ } + 11 ->player(FacialExpression.ASKING,"Anything else?").also { stage++ } + 12 ->npc(FacialExpression.FRIENDLY,"Don't ask me, I'm not from around here.").also { stage++ } + 13 ->player(FacialExpression.HALF_ASKING,"So where are you from?").also { stage++ } + 14 ->npc(FacialExpression.HALF_GUILTY,"A town to the south of the Shantay Pass,","called Pollnivneach.").also { stage = 1 } + + 20 ->npc(FacialExpression.SAD,"Not very much, at the moment.", "I came from further south to set up a smithy here...").also { stage++ } + 21 ->npc(FacialExpression.SAD,"...but we still haven't set up the shops,", "so we have no customers yet.").also { stage = 1 } + + 30 -> npc(FacialExpression.FRIENDLY,"Yes, he's the one who persuaded us to come here.").also { stage++ } + 31 -> npc( + FacialExpression.HALF_GUILTY,"He said we'd have lots of customers once we set up", + "our shops, and all he asks for is a cut"," of the profits.").also { stage++ } + 32 -> player(FacialExpression.ASKING,"Maybe I should talk to him...").also { stage++ } + 33 -> npc(FacialExpression.FRIENDLY,"Of course.", "He's always happy to talk to possible business partners.").also { stage = 1 } + + 40 -> npc(FacialExpression.SUSPICIOUS,"What? Who's spreading that rumour?").also { stage++ } + 41 -> player(FacialExpression.THINKING,"Well, one of the shopkeepers told me a man with", "a large hammer came to threaten them.").also { stage++ } + 42 -> npc(FacialExpression.SUSPICIOUS,"Don't pay any attention to those people.").also { stage++ } + 43 -> npc(FacialExpression.LAUGH,"They're just worried that they'll lose money", "when we open our shops.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AliTheSmithDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(2820) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/falador/gardensupplier.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/falador/gardensupplier.java new file mode 100644 index 000000000..4162fe4ff --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/falador/gardensupplier.java @@ -0,0 +1,61 @@ +package core.game.node.entity.npc.city.falador; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Handles the garden supplier NPC + * @author ceik + */ +@Initializable +public class gardensupplier extends DialoguePlugin { + public gardensupplier(){ + /** + * Empty + */ + } + public gardensupplier(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){return new gardensupplier(player);} + + @Override + public boolean open(Object... args){ + npc("Hello, I sell many plants. Would you like","to see what I have?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int componentId, int buttonId){ + switch(stage){ + case 0: + player.getDialogueInterpreter().sendOptions("Select one","Yes, please!","No, thanks."); + stage++; + break; + case 1: + switch(buttonId){ + case 1: + player("Yes, please!"); + stage++; + break; + case 2: + player("No, thanks."); + stage = 10; + break; + } + break; + case 2: + end(); + new NPC(4251).openShop(player); + break; + case 10: + end(); + break; + } + return true; + } + public int[] getIds() { return new int[] {4251};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/AliTheCarter.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/AliTheCarter.java new file mode 100644 index 000000000..07f6898f1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/AliTheCarter.java @@ -0,0 +1,99 @@ +package core.game.node.entity.npc.city.nardah; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; + +/** + * Handles Ali the Carter, TODO: Add more dialogue after Spirits of the Elid is added + * @author ceik + */ + +@Initializable +public class AliTheCarter extends DialoguePlugin { + public AliTheCarter(){ + /** + * Empty + */ + } + public AliTheCarter(Player player){super(player);} + @Override + public DialoguePlugin newInstance(Player player){return new AliTheCarter(player);} + public boolean open(Object... args){ + NPC npc = (NPC)args[0]; + player("Hello"); + return true; + } + + public boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 0: + npc("Hello, friend! Welcome to Nardah.","Do you happen to be in need of water?"); + stage++; + break; + case 1: + interpreter.sendOptions("Select one","Yes I am!","No thank you I'm good."); + stage++; + break; + case 2: + switch(buttonId){ + case 1: + player("Yes I am!"); + stage = 3; + break; + case 2: + player("No thank you."); + stage = 10; + break; + } + break; + case 3: + npc("It'll be 1000 coins for a full waterskin."); + stage++; + break; + case 4: + interpreter.sendOptions("Select one","Oh, wow. Um, sure.","Oh my! No thank you."); + stage++; + break; + case 5: + switch(buttonId){ + case 1: + player("Oh, wow. Um, sure."); + stage++; + break; + case 2: + player("Oh my! No thank you."); + stage = 10; + break; + } + break; + case 6: + if(player.getInventory().contains(995,1000)){ + player.getInventory().remove(new Item(995,1000)); + if(player.getInventory().freeSlots() > 0) { + player.getInventory().add(new Item(1823)); + } else { + GroundItemManager.create(new Item(1823),player.getLocation()); + } + end(); + } else { + player("Err, I seem to not have enough gold."); + stage++; + } + break; + case 7: + npc("Too bad, friend."); + stage = 10; + break; + case 10: + end(); + break; + } + return true; + } + @Override + public int[] getIds() {return new int[] {3030};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/ArtimeusDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/ArtimeusDialogue.java new file mode 100644 index 000000000..9ec0867d7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/ArtimeusDialogue.java @@ -0,0 +1,68 @@ +package core.game.node.entity.npc.city.nardah; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Handles dialogue for Artimeus + * @author ceik + */ + +@Initializable +public class ArtimeusDialogue extends DialoguePlugin { + public ArtimeusDialogue(){ + /** + * Empty + */ + } + public ArtimeusDialogue(Player player){ + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player){return new ArtimeusDialogue(player);} + + @Override + public boolean open(Object... args){ + npc("Greetings, friend; my business here deals with Hunter","related items. Is there anything in which I can interest you?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 0: + interpreter.sendOptions("Select one","What kind of items do you stock?","I'm not in the market for Hunter equipment right now, thanks."); + stage++; + break; + case 1: + switch(buttonId){ + case 1: + player("What kind of items do you stock?"); + stage++; + break; + case 2: + player("I'm not in the market for Hunter equipment","right now, thanks."); + stage = 10; + break; + } + break; + case 2: + npc("Have a look for yourself."); + stage++; + break; + case 3: + end(); + NPC Artimeus = new NPC(5109); + Artimeus.openShop(player); + break; + case 10: + end(); + break; + } + return true; + } + public int[] getIds() {return new int[] {5109};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Awusah.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Awusah.java new file mode 100644 index 000000000..91611802d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Awusah.java @@ -0,0 +1,42 @@ +package core.game.node.entity.npc.city.nardah; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Handles Awusah pre-quest + * @author ceik + */ +@Initializable +public class Awusah extends DialoguePlugin { + //TODO: Add dialogue for after the quest Spirits of Elid + public Awusah(){ + /** + * Empty + */ + } + public Awusah(Player player){ + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player){return new Awusah(player);} + + @Override + public boolean open(Object... args){ + interpreter.sendDialogue("The mayor doesn't seem interested in talking to you right now."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 0: + end(); + break; + } + return true; + } + public int[] getIds() {return new int[] {3040};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Ghaslor.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Ghaslor.java new file mode 100644 index 000000000..4c6fec5d2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Ghaslor.java @@ -0,0 +1,44 @@ +package core.game.node.entity.npc.city.nardah; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles Ghaslor dialogue + * @author ceik + */ + +//TODO: Add post-quest dialogue +@Initializable +public class Ghaslor extends DialoguePlugin { + public Ghaslor(){ + /** + * empty + */ + } + public Ghaslor(Player player){ + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player){return new Ghaslor(player);} + + @Override + public boolean open(Object... args){ + String gender = player.isMale() ? "gentleman" : "lady"; + npc("Good day young " + gender); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + switch(stage) { + case 0: + end(); + break; + } + return true; + } + public int[] getIds() {return new int[] {3029};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Kazemde.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Kazemde.java new file mode 100644 index 000000000..0429925dd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Kazemde.java @@ -0,0 +1,85 @@ +package core.game.node.entity.npc.city.nardah; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles Kazemde, who runs the general store in Nardah. + * @author ceik + */ + +@Initializable +public class Kazemde extends OptionHandler { + public final int NPC_ID = 3039; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new KazemdeDialogue().init(); + NPCDefinition.forId(NPC_ID).getHandlers().put("option:trade",this); + NPCDefinition.forId(NPC_ID).getHandlers().put("option:talk-to",this); + return this; + } + + @Override + public final boolean handle(Player player, Node node, String string){ + NPC npc = node.asNpc(); + switch(string){ + case "trade": + npc.openShop(player); + break; + case "talk-to": + player.getDialogueInterpreter().open(NPC_ID); + break; + } + return true; + } + + final class KazemdeDialogue extends DialoguePlugin { + public KazemdeDialogue(){ + /** + * Empty + */ + } + public KazemdeDialogue(Player player){ + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player){return new KazemdeDialogue(player);} + + @Override + public boolean open(Object... args){ + npc("Hello, and welcome to my shop."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 0: + interpreter.sendOptions("Select one","Let me see what you have.","Goodbye."); + stage++; + break; + case 1: + switch(buttonId){ + case 1: + end(); + NPC Kazemde = new NPC(NPC_ID); + Kazemde.openShop(player); + break; + case 2: + end(); + break; + } + } + return true; + } + public int[] getIds() {return new int[] {NPC_ID};} + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Rokuh.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Rokuh.java new file mode 100644 index 000000000..b2eedb851 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Rokuh.java @@ -0,0 +1,103 @@ +package core.game.node.entity.npc.city.nardah; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles Rokuh, who runs the Nardah chocolate stall + * @author ceik + */ + +@Initializable +public class Rokuh extends OptionHandler { + public final int NPC_ID = 3045; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new RokuhDialogue().init(); + NPCDefinition.forId(NPC_ID).getHandlers().put("option:trade",this); + NPCDefinition.forId(NPC_ID).getHandlers().put("option:talk-to",this); + return this; + } + + @Override + public final boolean handle(Player player, Node node, String string){ + NPC npc = node.asNpc(); + switch(string){ + case "trade": + npc.openShop(player); + break; + case "talk-to": + player.getDialogueInterpreter().open(NPC_ID); + break; + } + return true; + } + + final class RokuhDialogue extends DialoguePlugin { + public RokuhDialogue(){ + /** + * Empty + */ + } + public RokuhDialogue(Player player){ + super(player); + } + @Override + public DialoguePlugin newInstance(Player player){return new RokuhDialogue(player);} + + @Override + public boolean open(Object... args){ + npc("Come one, come all, buy my amazing choc ice invention here!","Chocolate on the outside. Iced cream on the inside.","Oh I also have some chocolate left over from making","choc ices which I'm selling too."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + switch(stage) { + case 0: + //TODO: Add more options after Spirit of the Elid. + interpreter.sendOptions("Select one", "Cool I'd like to buy some", "No thanks, I'm not interested.", "How do you stop your icy snacks melting?"); + stage++; + break; + case 1: + switch(buttonId){ + case 1: + end(); + NPC Rokuh = new NPC(NPC_ID); + Rokuh.openShop(player); + break; + case 2: + player("No thanks, I'm not interested"); + stage = 10; + break; + case 3: + player("How do you stop your icy snacks melting?","The middle of the desert is the last place I'd expect to see ice."); + stage++; + break; + } + break; + case 2: + npc("It's quite a surprise, isn't it, my friend. I actually have this","special magic box of ice, which I bought for a princely sum","from a strange man while adventuring in lands far away","He said it is imbued with some sort of"); + stage++; + break; + case 3: + npc("powerful ice magic which keeps it cold all the time. I had","never seen any ice magic before, it's clearly very rare","and powerful, so I felt I had to buy it."); + stage = 10; + break; + case 10: + end(); + break; + } + return true; + } + @Override + public int[] getIds() {return new int[]{NPC_ID};} + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Seddu.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Seddu.java new file mode 100644 index 000000000..789027727 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/nardah/Seddu.java @@ -0,0 +1,60 @@ +package core.game.node.entity.npc.city.nardah; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Added some dialogue for Seddu + * @author ceik + */ + +@Initializable +public class Seddu extends DialoguePlugin { + public Seddu(){ + /** + * Empty + */ + } + public Seddu(Player player){ + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player){return new Seddu(player);} + + @Override + public boolean open(Object... args){ + npc("I buy and sell adventurer's equipment, do you want to trade?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 0: + interpreter.sendOptions("Select one","Yes, please","No, thanks"); + stage++; + break; + case 1: + switch(buttonId){ + case 1: + end(); + NPC seddu = new NPC(3038); + seddu.openShop(player); + break; + case 2: + player("No, thanks."); + stage++; + break; + case 3: + end(); + break; + } + break; + } + return true; + } + public int[] getIds(){return new int[] {3038};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliCamelMan.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliCamelMan.java new file mode 100644 index 000000000..a17a270cb --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliCamelMan.java @@ -0,0 +1,251 @@ +package core.game.node.entity.npc.city.pollnivneach; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; + + +/** + * Dialogue for Ali the Camel Man + * @author ceik + */ +@Initializable +public class AliCamelMan extends DialoguePlugin { + public AliCamelMan(){ + /** + * Empty + */ + } + public AliCamelMan(Player player){ super(player);} + + @Override + public DialoguePlugin newInstance(Player player){ return new AliCamelMan(player);} + + public boolean open(Object... args){ + npc("Welcome to my discount camel store.","Can I help you with anything?"); + return true; + } + + public boolean handle(int interaceId, int buttonId){ + switch(stage){ + case 0: + interpreter.sendOptions("Select one.","A discount camel store?","Tell me about this town.","Lovely day isn't it?","Are those camels around the side for sale?","I'm looking for Ali from Pollnivneach."); + stage = 10; + break; + case 10: + switch(buttonId){ + case 1: + player(FacialExpression.ASKING,"A discount camel store?"); + stage = 20; + break; + case 2: + player(FacialExpression.THINKING,"Tell me about this town."); + stage = 30; + break; + case 3: + player(FacialExpression.ASKING,"Lovely day isn't it?"); + stage = 40; + break; + case 4: + player(FacialExpression.ASKING,"Are those camels around the side for sale?"); + stage = 50; + break; + case 5: + player(FacialExpression.ASKING,"I'm looking for Ali from Pollnivneach."); + stage = 60; + } + break; + case 20: + npc(FacialExpression.JOLLY,"Yes- a great idea - selling camels at discounted","prices so that the common man can experience","the joys of owning a camel too. They're not just","a source of kebab meat you know!"); + stage = 21; + break; + case 21: + interpreter.sendOptions("Select one.","So can I buy a camel then? I'm hungry!","Yes camels are beautiful creatures.","Filthy animals all they do is spit and...","Actually I think I was a camel in a previous existence.","So is business good then?"); + stage = 22; + break; + case 22: + switch(buttonId){ + case 1: + player(FacialExpression.ASKING,"So can I buy a camel then? I'm hungry!"); + stage = 230; + break; + case 2: + player(FacialExpression.HAPPY,"Yes camels are beautiful creatures."); + stage = 240; + break; + case 3: + player(FacialExpression.DISGUSTED,"Filthy animals all they do is spit and..."); + stage = 250; + break; + case 4: + player(FacialExpression.THINKING,"Actually I think I was a camel in a previous existence."); + stage = 260; + break; + case 5: + player(FacialExpression.ASKING,"So is business good then?"); + stage = 270; + } + break; + case 230: + npc(FacialExpression.DISGUSTED,"I would never sell to the likes of you,","they are beautiful majestic creatures not sandwich","fillers! Get ouf my shop."); + stage = 100; + break; + case 240: + npc(FacialExpression.LAUGH,"Ah, wondrous creatures, ships of the desert, far","more useful than any horse or donkey.","A man's best friend."); + stage = 25; + break; + case 25: + npc(FacialExpression.FRIENDLY,"Is there anything else I can help you with?"); + stage = 26; + break; + case 26: + interpreter.sendOptions("Select one.","Well yes actually I'd like to ask about something else.","No but thanks for your time."); + stage = 27; + break; + case 27: + switch(buttonId){ + case 1: + player("Well yes actually I'd like to ask about something else."); + stage = 0; + break; + case 2: + player("No but thanks for your time."); + stage = 100; + break; + } + break; + case 250: + npc(FacialExpression.ANGRY,"Pah! You just do not know how to treat them.","If you abuse them and treat them badly of","course they are going to spit and bite."); + stage = 25; + break; + case 260: + npc(FacialExpression.LAUGH,"You're teasing me now! You rogue! Everyone has","a laugh at my expense, I'm just more","enlightened than you!"); + stage = 25; + break; + case 270: + npc(FacialExpression.HAPPY,"Business is booming, Pollnivneach has never seen this","number of visitors."); + stage = 271; + break; + case 271: + npc(FacialExpression.THINKING,"In fact I'm thinking of expanding and trying to break","into the camel hire market."); + stage = 25; + break; + case 30: + npc(FacialExpression.THINKING,"Well Polvnivneach is a funny little place. It's a","small town and you'd think it would be a","quiet place."); + stage = 300; + break; + case 300: + npc(FacialExpression.ANGRY,"But those menaphites and bandits are making this place","quit unbearable."); + stage = 310; + break; + case 310: + interpreter.sendOptions("Select one.","In what way?","Well the weak will always be trodden on. Why not stand up to them?","Perhaps I can help."); + stage = 311; + break; + case 311: + switch(buttonId){ + case 1: + player(FacialExpression.ASKING,"In what way?"); + stage = 320; + break; + case 2: + player(FacialExpression.ASKING,"Well the weak will always be trodden on. Why not stand up to them?"); + stage = 330; + break; + case 3: + player(FacialExpression.FRIENDLY,"Perhaps I can help."); + stage = 340; + break; + } + break; + case 320: + npc(FacialExpression.ANGRY,"Well one group is just as bad as the other, stealing from each other","and the locals, fighting, and just the last dayone of the","bandits came looking for protection money."); + stage = 321; + break; + case 321: + player(FacialExpression.ANGRY,"Why don't the authorities stop this?"); + stage = 322; + break; + case 322: + npc(FacialExpression.SAD,"If you haven't noticed this is a remote town, half way between","Menaphos and Al Kharid, a place where neither","exert any power."); + stage = 323; + break; + case 323: + npc(FacialExpression.SAD,"To tell the truth we live in hope that an objective","outsider could broker a deal to halt the hostilities","between them."); + stage = 324; + break; + case 324: + player("Perhaps I will."); + stage = 25; + break; + case 330: + npc("That's a little unfair my friend. We can't all be brave","adventurers. If we were, where would you go to get camels","at discounted prices?"); + stage = 331; + break; + case 331: + npc(FacialExpression.ASKING,"You might think about that. Anyways isn't it the job of the brave","adventurer to deliver the weak and innocent from","evil and harm?"); + stage = 25; + break; + case 340: + //TODO: Add the quest and fix dialogue starting here. + npc(FacialExpression.SAD,"No, I don't think you can just yet. Perhaps in the future."); + stage = 100; + break; + case 40: + npc(FacialExpression.SUSPICIOUS,"It's a beautiful day today but word has it","that it will rain tomorrow."); + stage = 400; + break; + case 400: + player(FacialExpression.SUSPICIOUS,"Really?"); + stage = 410; + break; + case 410: + npc(FacialExpression.LAUGH,"No don't worry I'm only joking!"); + stage = 420; + break; + case 420: + player(FacialExpression.ANNOYED,"Ok so...."); + stage = 25; + break; + case 50: + npc(FacialExpression.HALF_GUILTY,"Those two camels around the side are already sold."); + stage = 500; + break; + case 500: + npc(FacialExpression.FRIENDLY,"I've got new stock coming very soon though.","Come back later if you're still interested."); + stage = 25; + break; + case 60: + npc(FacialExpression.HAPPY,"Well you've found your man."); + stage = 600; + break; + case 600: + player(FacialExpression.SUSPICIOUS,"Really do you have an uncle called Ali?"); + stage = 610; + break; + case 610: + npc(FacialExpression.NEUTRAL,"Why yes - All my uncles are called Ali!"); + stage = 620; + break; + case 620: + player(FacialExpression.THINKING,"Oh dear! Do any of them own a stall in the","Al Kharid Bazaar?"); + stage = 630; + break; + case 630: + npc(FacialExpression.THINKING,"Well no, but one of them owns a camel hire franchise."); + stage = 640; + break; + case 640: + player(FacialExpression.ANNOYED,"Never mind."); + stage = 100; + break; + case 100: + end(); + break; + } + return true; + } + @Override + public int[] getIds(){return new int[] {1867};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler.java new file mode 100644 index 000000000..0b4fe9629 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheCamelHandler.java @@ -0,0 +1,93 @@ +package core.game.node.entity.npc.city.pollnivneach; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles Ali the Camel interaction + * @author ceik + */ +@Initializable +public class AliTheCamelHandler extends OptionHandler { + public Plugin newInstance(Object arg) throws Throwable { + new AliTheCamelDialogue().init(); + NPCDefinition.forId(1873).getHandlers().put("option:pet",this); + return this; + } + + public boolean handle(Player player, Node node, String options){ + NPC npc = (NPC) node; + if(npc.getId() == 1873){ + if (options.equals("pet")){ + player.getDialogueInterpreter().open(1873); + } + } + return true; + } + + public class AliTheCamelDialogue extends DialoguePlugin { + public AliTheCamelDialogue(){ + /** + * Empty + */ + } + public AliTheCamelDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){return new AliTheCamelDialogue(player);} + + @Override + public boolean open(Object... args){ + int phrase = RandomFunction.random(1,4); + switch(phrase){ + case 1: + player(FacialExpression.AFRAID,"That beast would probably bite my fingers off","if I tried to pet it"); + break; + case 2: + player(FacialExpression.DISGUSTED,"I'm not going to pet that! I might get fleas","or something else that nasty creature","might have."); + break; + case 3: + player(FacialExpression.THINKING,"Mmmm... Won't you make the nicest kebab?"); + break; + } + return true; + } + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player.lock(); + player.animate(new Animation(7299)); + player.getImpactHandler().setDisabledTicks(3); + GameWorld.getPulser().submit(new Pulse(4, player) { + @Override + public boolean pulse() { + player.unlock(); + player.getAnimator().reset(); + return true; + } + }); + player.getDialogueInterpreter().sendDialogue("The camel tries to kick you for insulting it."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + @Override + public int[] getIds(){return new int[] {1873};} + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheHagDialogue.kt b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheHagDialogue.kt new file mode 100644 index 000000000..7f24def14 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheHagDialogue.kt @@ -0,0 +1,49 @@ +package core.game.node.entity.npc.city.pollnivneach + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AliTheHagDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Good day, old hag.") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.LAUGH,"Old hag indeed! I have a name you know!").also { stage++ } + 1 -> player(FacialExpression.THINKING,"Let me guess it wouldn't be Ali would it?").also { stage++ } + 2 -> npc(FacialExpression.ANNOYED,"Well how else would you abbreviate Alice then?", "And no, you can't call me Al!").also { stage++ } + 3 -> npc( + FacialExpression.ASKING,"Now what do you want from the Old hag of Pollnivneach?", + "To hex someone? Power, beauty, eternal youth", "or something else drab like that?").also { stage++ } + 4 -> player(FacialExpression.HALF_GUILTY,"Actually none of those, I'm new in town and", "I just wanted to get to know the locals.").also { stage++ } + 5 -> npc( + FacialExpression.ANNOYED,"I'm busy brewing potions, so if you ", + "disturb me again without reason,","I will turn you into a frog!").also { stage++ } + 6 -> player(FacialExpression.SCARED,"Oh I'm sorry I won't let it happen again.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AliTheHagDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1871) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheKebabSeller.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheKebabSeller.java new file mode 100644 index 000000000..551bd1fb4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheKebabSeller.java @@ -0,0 +1,226 @@ +package core.game.node.entity.npc.city.pollnivneach; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; + +@Initializable +public class AliTheKebabSeller extends DialoguePlugin { + public AliTheKebabSeller(){ + /** + * Empty + */ + } + public AliTheKebabSeller(Player player){ super(player);} + + @Override + public DialoguePlugin newInstance(Player player){return new AliTheKebabSeller(player);} + @Override + public boolean open(Object... args){ + NPC npc = (NPC)args[0]; + player("Hello"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + boolean hasSauced = false; + switch(stage){ + case 0: + npc("Hello. What can I do for you?"); + stage = 1; + break; + case 1: + player("I don't know, what can you do for me?"); + stage = 2; + break; + case 2: + npc("Well, that depends."); + stage = 3; + break; + case 3: + player("Depends on what?"); + stage = 4; + break; + case 4: + npc("It depends on whether you like kebabs or not."); + stage = 5; + break; + case 5: + player("Why is that?"); + stage = 6; + break; + case 6: + npc("Seeing as I'm in the kebab construction industry.","I mainly help people who have want of a kebab."); + stage = 7; + break; + case 7: + player(FacialExpression.THINKING,"Well then, what kind of kebabs do you, erm, construct?"); + stage = 8; + break; + case 8: + npc("I offer two different types of kebabs: the standard","run-of-the-mill kebab seen throughout 2009scape and","enjoyed by many a intoxicated dwarf, and my specialty,","the extra-hot kebab. So which shall it be?"); + stage = 9; + break; + case 9: + npc("Or are my services even required?"); + stage = 10; + break; + case 10: + interpreter.sendOptions("Select one","Yes, thanks.","No thanks, I'm good"); + stage = 11; + break; + case 11: + switch(buttonId){ + case 1: + player("Yes, thanks."); + stage = 12; + break; + case 2: + player("No thanks, I'm good."); + stage = 100; + break; + } + break; + case 12: + interpreter.sendOptions("Select one.","I want a kebab, please.", "Could I have one of those crazy hot kebabs of yours?","Would you sell me that bottle of special kebab sauce?", "What is the difference between the standard and extra hot?","I need some information."); + stage = 13; + break; + case 13: + switch(buttonId){ + case 1: + player("I want a kebab, please."); + stage = 20; + break; + case 2: + player("Could I have one of those crazy hot kebabs of yours?"); + stage = 30; + break; + case 3: + player("Would you sell me that bottle of special kebab sauce?"); + stage = 40; + break; + case 4: + player("What is the difference between the standard and extra hot?"); + stage = 50; + break; + case 5: + player("I need some information."); + stage = 60; + break; + } + break; + case 20: + npc("That will be 3 coins please."); + if(player.getInventory().contains(995,3)) { + stage = 21; + } else { + stage = 25; + } + break; + case 21: + npc("Here you go."); + player.getInventory().remove(new Item(995,3)); + player.getInventory().add(new Item(1971)); + stage = 22; + break; + case 22: + npc("Is there anything else I can do for you?"); + stage = 10; + break; + case 25: + player("I seem to have not brought enough money with me. Sorry."); + stage = 22; + break; + case 30: + npc("A super kebab it is so. Be careful, they really are as hot as","they are made out to be."); + stage = 31; + break; + case 31: + player("Sure, sure."); + stage = 32; + break; + case 32: + npc("Here you go."); + player.getInventory().add(new Item(4608)); + stage = 33; + break; + case 33: + player("Thanks."); + stage = 22; + break; + case 40: + if(!player.getInventory().containsItem(new Item(4610))) { + npc("Well, that depends on what you have in mind."); + stage = 41; + break; + } else { + npc("I already gave it to you!"); + stage = 22; + break; + } + case 41: + player("Set yourself at east, I have no intention of setting up a","rival kebab shop."); + stage = 42; + break; + case 42: + npc("Well, then, what do you want it for?"); + stage = 43; + break; + case 43: + player("I don't know, but I think I could have a little fun with it."); + stage = 44; + break; + case 44: + npc("You're not going to put it in drunken Ali's drink"," now, are you? That's what happened last time","I gave someone the sauce."); + stage = 45; + break; + case 45: + player("No, that would be a bit cliche, I think I'll come up with","something more original."); + stage = 46; + break; + case 46: + npc("Just be careful with it, it's potent enough to give a camel","the runs."); + player.getInventory().add(new Item(4610)); + stage = 47; + break; + case 47: + player("Thank you very much."); + stage = 22; + break; + case 50: + npc("If I told you that I would have to kill you. Kebab sales is","a cut-throat industry. The extra-hot kebab gives","me the competitive edge on the rest and if I were to","divulge my secrets to every passing adventurer, well it"); + stage = 51; + break; + case 51: + npc("would soon disappear."); + stage = 52; + break; + case 52: + player("So there's no difference except the sauce you use then!"); + stage = 53; + break; + case 53: + npc("Shh! Keep your voice down. You should have told me you","were from the union."); + stage = 22; + break; + case 60: + npc("If information is what you need, there are many better"," people to ask than myself who could help you. One of the","town's street urchins or perhaps the local drunk.","I may be many things to many people, but a"); + stage = 61; + break; + case 61: + npc("gossip I am not."); + stage = 22; + break; + case 100: + end(); + break; + } + return true; + } + @Override + public int[] getIds() {return new int[] {1865};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheMayorDialogue.kt b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheMayorDialogue.kt new file mode 100644 index 000000000..a875fc75e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheMayorDialogue.kt @@ -0,0 +1,59 @@ +package core.game.node.entity.npc.city.pollnivneach + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AliTheMayorDialogue(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + npc( + FacialExpression.FRIENDLY,"Welcome adventurer to the town of Pollnivneach,", + "the gateway to Menaphos and Al-Kharid. My name is Ali", + "and I'm the mayor of this town.", + "I hope you enjoy your stay here.") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> player( + FacialExpression.FRIENDLY, "Thank you.", + "That is the warmest welcome I've had anywhere", + "for a while at least. People generally treat", + "travelling adventurers with suspicion.").also { stage++ } + 1 -> npc( + FacialExpression.FRIENDLY,"All are welcome here, such is the way", + "of things in border regions.", + "Now more than ever I suppose.").also { stage++ } + 2 -> player(FacialExpression.FRIENDLY,"What do you mean by that?").also { stage++ } + 3 -> npc(FacialExpression.FRIENDLY,"There's trouble in town, and a lot of ", "villagers have left as a result.").also { stage++ } + 4 -> player(FacialExpression.FRIENDLY,"I'm looking for someone called Ali.").also { stage++ } + 5 -> npc(FacialExpression.FRIENDLY,"I doubt that's easy in Pollnivneach.").also { stage++ } + 6 -> player(FacialExpression.FRIENDLY,"Well can you help me?").also { stage++ } + 7 -> npc( + FacialExpression.FRIENDLY,"I'm more than a little busy at the moment, ", + "I'm sure there are plenty of people ", "in town who could help you.").also { stage = 99 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AliTheMayorDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1870) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheOperator.kt b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheOperator.kt new file mode 100644 index 000000000..7f509c0be --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/AliTheOperator.kt @@ -0,0 +1,69 @@ +package core.game.node.entity.npc.city.pollnivneach + +import core.game.content.dialogue.DialoguePlugin +import core.game.content.dialogue.FacialExpression +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable + +/** + * @author qmqz + */ + +@Initializable +class AliTheOperator(player: Player? = null) : DialoguePlugin(player){ + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + player(FacialExpression.FRIENDLY,"Hello, good sir.") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> npc(FacialExpression.ANNOYED,"What do you want?").also { stage++ } + 1 -> player(FacialExpression.HALF_ASKING,"I'm just new in town and have a few questions.").also { stage++ } + 2 -> npc(FacialExpression.ASKING,"What do you want to know?").also { stage++ } + + 3 -> options ("Tell me about yourself.", "Tell me about the other people in the town.", "I'm looking for Ali.").also { stage++ } + 4 -> when(buttonId){ + 1 -> npc( + FacialExpression.ANNOYED, "That information is available on a need to know basis", + "and right now, you don't need to know.").also { stage = 10 } + 2 -> npc( + FacialExpression.SUSPICIOUS,"Sheep, ready for the slau... ", + "hang on I shouldn't be saying..., ", "listen I don't want to talk about them.").also { stage = 10 } + 3 -> npc( + FacialExpression.ANNOYED,"You will have to be a lot more specific if ", + "you want help finding him. ", "Everyone here is called Ali.").also { stage = 30 } + } + + 10 -> npc(FacialExpression.HALF_ASKING,"Can I help you with anything else?").also { stage++ } + + 11 -> options ("Yes I'd like to ask you about something else.", "No thanks.").also { stage++ } + 12 -> when(buttonId) { + 1 -> npc(FacialExpression.ASKING,"What do you want to know?").also { stage = 3 } + 2 -> end() + } + + 30 -> player( + FacialExpression.HALF_ASKING,"I've discovered that. Well he has an uncle called", + "Ali Morrisane, a market vendor in Al Kharid and","that's all I really know about him.").also { stage++ } + 31 -> npc( + FacialExpression.ANNOYED,"Say no more. I too am looking for him. ", + "The little tyke robbed me too. If we work together,", "perhaps we can catch him and teach him ","a lesson.").also { stage = 10 } + + 99 -> end() + } + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return AliTheOperator(player) + } + + override fun getIds(): IntArray { + return intArrayOf(1902) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/BlackJackSeller.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/BlackJackSeller.java new file mode 100644 index 000000000..fcb004294 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/BlackJackSeller.java @@ -0,0 +1,42 @@ +package core.game.node.entity.npc.city.pollnivneach; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Stand-in dialogue for Black Jack Seller til blackjacking/the quest is implemented + * @author ceik + */ +@Initializable +public class BlackJackSeller extends DialoguePlugin { + public BlackJackSeller(){ + /** + * empty. + */ + } + public BlackJackSeller(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){return new BlackJackSeller(player);} + + @Override + public boolean open(Object... args){ + npc("I'm not interested in selling to you. Not yet..."); + stage = 0; + return true; + } + + @Override + public boolean handle(int intefaceId, int objectId){ + switch(stage){ + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() {return new int[] {2548};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/DesertBandit.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/DesertBandit.java new file mode 100644 index 000000000..ebbe9fd35 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/DesertBandit.java @@ -0,0 +1,59 @@ +package core.game.node.entity.npc.city.pollnivneach; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Stand-in for bandit dialogue until blackjacking is implemented + * @author ceik + */ + +@Initializable +public class DesertBandit extends OptionHandler { + public Plugin newInstance(Object arg) throws Throwable { + new BanditDialogue().init(); + NPCDefinition.forId(6388).getHandlers().put("option:talk-to",this); + return this; + } + public boolean handle(Player player, Node node, String options){ + NPC npc = (NPC) node; + if(npc.getId() == 6388){ + if (options.equals("talk-to")){ + player.getDialogueInterpreter().open(6388); + } + } + return true; + } + + public class BanditDialogue extends DialoguePlugin { + public BanditDialogue() { + /** + * Empty. + */ + } + public BanditDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){return new BanditDialogue(player);} + + @Override + public boolean open(Object... args){ + npc("Go away."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + end(); + return true; + } + @Override + public int[] getIds() {return new int[] {6388};} + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/SnakeCharmerBasket.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/SnakeCharmerBasket.java new file mode 100644 index 000000000..9e9609e84 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/SnakeCharmerBasket.java @@ -0,0 +1,110 @@ +package core.game.node.entity.npc.city.pollnivneach; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles Ali the Snake Charmer + * @author ceik + */ +@Initializable +public class SnakeCharmerBasket extends UseWithHandler { + public SnakeCharmerBasket() { + super(995); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new AliTheSnakeCharmer().init(); + addHandler(6230, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().containsItem(new Item(995, 3))) { + player.getInventory().remove(new Item(995, 3)); + player.getDialogueInterpreter().open(1872, true); + } + return true; + } + + public class AliTheSnakeCharmer extends DialoguePlugin { + public AliTheSnakeCharmer() { + /** + * empty. + */ + } + + public AliTheSnakeCharmer(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AliTheSnakeCharmer(player); + } + + @Override + public boolean open(Object... args) { + if (args.length > 0) { + player("Wow a snake charmer. Can I have a go? Please?"); + stage = 5; + return true; + } + player("Wow a snake charmer. Can I have a go? Please?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + player.getDialogueInterpreter().sendDialogue("The snake charmer fails to acknowledge you,","he seems too deep into the music to notice you."); + stage = 4; + break; + case 4: + end(); + break; + case 5: + player.getDialogueInterpreter().sendDialogue("The snake charmer snaps out of his trance","and directs his full attention to you."); + stage = 6; + break; + case 6: + player(FacialExpression.JOLLY, "Wow a snake charmer. Can I have a go? Please?"); + stage = 7; + break; + case 7: + if(!player.getInventory().containsItems(new Item(4605),new Item(4606)) && !player.getBank().containItems(4605,4606)) { + if (player.getInventory().freeSlots() >= 2) { + player.getInventory().add(new Item(4605)); + player.getInventory().add(new Item(4606)); + } else { + GroundItemManager.create(new Item(4605), player.getLocation()); + GroundItemManager.create(new Item(4606), player.getLocation()); + } + npc(FacialExpression.ANNOYED, "If it means that you'll leave me alone, I would give you"," my snake charming super starter kit complete","with flute and basket."); + } else { + npc(FacialExpression.ANGRY,"I already gave you one!"); + } + stage = 4; + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[]{1872}; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/StreetUrchinDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/StreetUrchinDialogue.java new file mode 100644 index 000000000..d452edcdc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/pollnivneach/StreetUrchinDialogue.java @@ -0,0 +1,39 @@ +package core.game.node.entity.npc.city.pollnivneach; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the street urchin npc TODO: Add more dialogue after/during the quest when it is implemented. + * @author ceik + */ +@Initializable +public class StreetUrchinDialogue extends DialoguePlugin { + public StreetUrchinDialogue(){ + /** + * Empty + */ + } + + public StreetUrchinDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){return new StreetUrchinDialogue(player);} + + public boolean open(Object... args){ + player.getDialogueInterpreter().sendDialogue("This child doesn't seem interested in you."); + return true; + } + + public boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 0: + end(); + break; + } + return true; + } + @Override + public int[] getIds(){return new int[] {6357};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/KlenterNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/KlenterNPC.java new file mode 100644 index 000000000..c13299fe6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/KlenterNPC.java @@ -0,0 +1,35 @@ +package core.game.node.entity.npc.city.sophanem; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Handles the Klenter NPC, which should be invisible until a quest stage has been reached. Will do that when quest is added. + * @author ceik + */ +@Initializable +public class KlenterNPC extends DialoguePlugin { + public KlenterNPC(){ + /** + * Empty + */ + } + public KlenterNPC(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player){return new KlenterNPC(player);} + + @Override + public boolean open(Object... args){ + npc("OOOOoOOOoOO"); + return true; + } + + @Override + public boolean handle(int interfaceId,int buttonId){ + return true; + } + @Override + public int[] getIds(){return new int[] {2014};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/SphinxDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/SphinxDialogue.java new file mode 100644 index 000000000..75da6678b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/SphinxDialogue.java @@ -0,0 +1,112 @@ +package core.game.node.entity.npc.city.sophanem; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles Sphinx dialogue + * @author ceik + */ +@Initializable +public final class SphinxDialogue extends DialoguePlugin { + public SphinxDialogue() { + /** + * Empty + */ + } + public SphinxDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new SphinxDialogue(player); + } + + @Override + public boolean open(Object... args){ + npc = (NPC) args[0]; + if(player.getFamiliarManager().hasPet() && player.getFamiliarManager().getFamiliar().getId() >= 761 && player.getFamiliarManager().getFamiliar().getId() < 767){ + player("Good day."); + stage = 50; + } else { + player("Good day."); + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 0: + npc("You have the feel of a cat person","about you. Do you look after one?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select one.","Yes, but I don't bring it to harsh places like this.","No, you are mistaken.","Yes, but I have left mine in the bank."); + stage = 2; + break; + case 2: + switch(buttonId){ + case 1: + player("Yes, but I don't bring it to harsh places like this."); + stage = 3; + break; + case 2: + player("No, you are mistaken."); + stage = 5; + break; + case 3: + player("Yes, but I have left mine in the bank."); + stage = 7; + break; + } + break; + case 3: + npc(FacialExpression.SAD,"A pity, they can be of great help in","some adventures. I would like to talk to","your cat. Would you bring it to me?"); + stage = 4; + break; + case 4: + player("I might, but I have a few things to sort out first."); + stage = 10; + break; + case 5: + npc(FacialExpression.SUSPICIOUS,"Really? I'm generally quite good at knowing","these things."); + stage = 10; + break; + case 7: + npc(FacialExpression.AFRAID,"What? That's no place for a cat!"); + stage = 10; + break; + case 10: + end(); + break; + case 50: + player.getDialogueInterpreter().sendDialogue("The Sphinx ignores you."); + stage = 51; + break; + case 51: + npc("Ah, how interesting... a cat. Come here to","me, kitty."); + stage = 52; + break; + case 52: + player.getFamiliarManager().getFamiliar().sendChat("Meow"); + stage = 53; + case 53: + player.getDialogueInterpreter().sendDialogue("The Sphinx and the cat have a chat."); + stage = 54; + break; + case 54: + //TODO : Add dialogue for quest-related bits after the quests are added, ends here for now. + end(); + break; + } + return true; + } + @Override + public int[] getIds() { + return new int[] { 1990 }; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/TarikDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/TarikDialogue.java new file mode 100644 index 000000000..b8a1ede5b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/TarikDialogue.java @@ -0,0 +1,49 @@ +package core.game.node.entity.npc.city.sophanem; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; + +/** + * Stand-in until we get the real dialogue for Tarik + * @author ceik + */ + +@Initializable +public class TarikDialogue extends DialoguePlugin { + public TarikDialogue() { + /** + * Empty + */ + } + public TarikDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new TarikDialogue(player); + } + + @Override + public boolean open(Object... args){ + npc("I found this crazy looking pyramid here.","I can't seem to figure out what it's for.","Maybe you should head inside?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId){ + switch(stage){ + case 0: + player("Oh, alright..."); + stage = 1; + break; + case 1: + end(); + break; + } + return true; + } + @Override + public int[] getIds() { + return new int[] { 4478 }; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/WallShortcut.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/WallShortcut.java new file mode 100644 index 000000000..e501d1bc9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/sophanem/WallShortcut.java @@ -0,0 +1,66 @@ +package core.game.node.entity.npc.city.sophanem; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the Sophanem wall shortcut + * @author ceik + */ +@Initializable +public final class WallShortcut extends OptionHandler { + + private static final Animation CLIMB_DOWN = Animation.create(2589); + + private static final Animation CRAWL_THROUGH = Animation.create(2590); + + private static final Animation CLIMB_UP = Animation.create(2591); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(6620).getHandlers().put("option:climb-through", this); + return null; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (player.getSkills().getLevel(Skills.AGILITY) < 21) { + player.getDialogueInterpreter().sendDialogue("You need an Agility level of at least 21 to do this."); + return true; + } + player.lock(4); + final GameObject o = (GameObject) node; + if (o.getId() == 6620) { + ForceMovement.run(player, Location.create(3320, 2796, 0), o.getLocation(), CLIMB_DOWN); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 2: + player.animate(CRAWL_THROUGH); + player.getProperties().setTeleportLocation(Location.create(3324, 2796, 0)); + break; + case 3: + ForceMovement.run(player, Location.create(3324, 2796, 0), Location.create(3324, 2796, 0), CLIMB_UP); + return true; + } + return false; + } + }); + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/tzhaar/TzHaarMejJah.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/tzhaar/TzHaarMejJah.java new file mode 100644 index 000000000..497bd1bfe --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/tzhaar/TzHaarMejJah.java @@ -0,0 +1,187 @@ +package core.game.node.entity.npc.city.tzhaar; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TzHaarMejJal dialogue. + * @author 'Vexia + * @author Empathy + */ +@Initializable +public class TzHaarMejJah extends DialoguePlugin { + + public TzHaarMejJah() { + + } + + public TzHaarMejJah(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TzHaarMejJah(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You want help JalYt-Ket-" + player.getUsername() + "?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", player.getInventory().containItems(6570) ? "I have a fire cape here." : "What is this place?", "What did you call me?", "No I'm fine thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + if (player.getInventory().containItems(6570)) { + interpreter.open(DialogueInterpreter.getDialogueKey("firecape-exchange"), npc); + break; + } + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is this place?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What did you call me?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No I'm fine thanks."); + stage = 30; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is the fight caves, TzHaar-Xil made it for practice,", "but many JalYt come here to fight too.", "Just enter the cave and make sure you're prepared."); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Are there any rules?", "Ok thanks."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Are there any rules?"); + stage = 14; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok thanks."); + stage = 13; + break; + } + break; + case 13: + end(); + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Rules? Survival is the only rule in there."); + stage = 15; + break; + case 15: + interpreter.sendOptions("Select an Option", "Do I win anything?", "Sounds good."); + stage = 16; + break; + case 16: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do I win anything?"); + stage = 17; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sounds good."); + stage = 13; + break; + + } + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You ask a lot of questions.", "Might give you TokKul if you last long enough."); + stage = 18; + break; + case 18: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "..."); + stage = 19; + break; + case 19: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Before you ask, TokKul is like your Coins."); + stage = 500; + break; + case 500: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Gold is like you JalYt, soft and easily broken, we use", "hard rock forged in fire like TzHaar!"); + stage = 501; + break; + case 501: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Are you not JalYt-Ket?"); + stage = 21; + break; + case 21: + interpreter.sendOptions("Selec an Option", "What's a 'JalYt-Key'?", "I guess so...", "No I'm not!"); + stage = 22; + break; + case 22: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What's a 'JalYt-Ket'?"); + stage = 100; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I guess so..."); + stage = 200; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No I'm not!"); + stage = 300; + break; + } + break; + case 100: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "That what you are... you tough and strong no?"); + stage = 101; + break; + case 101: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Well yes I suppose I am..."); + stage = 102; + break; + case 102: + end(); + break; + case 200: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I guess so...."); + stage = 201; + break; + case 201: + end(); + break; + case 300: + end(); + break; + case 30: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("tzhaar-mej"), 2617 }; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/tzhaar/TzHaarMejKah.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/tzhaar/TzHaarMejKah.java new file mode 100644 index 000000000..cf221138c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/tzhaar/TzHaarMejKah.java @@ -0,0 +1,158 @@ +package core.game.node.entity.npc.city.tzhaar; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TzHaarMejKah dialogue. + * @author 'Vexia + */ +@Initializable +public class TzHaarMejKah extends DialoguePlugin { + + public TzHaarMejKah() { + + } + + public TzHaarMejKah(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TzHaarMejKah(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You want help JalYt-Ket-" + player.getUsername() + "?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "What is this place?", "Who's the current champion?", "What did you call me?", "No I'm fine thanks."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is this place?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who's the current champion?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What did you call me?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No I'm fine thanks."); + stage = 40; + break; + + } + break; + case 40: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Are you not JalYt-Ket?"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I guess so..."); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well then, no problems."); + stage = 13; + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This is the fight pit, TzHaar-Xil made it for their sport", "but many JalYt come here to fight too.", "If you are wanting to fight then enter the cage, you", "will be summoned when the next round is ready to begin."); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Are there any rules?", "Ok thanks."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Are there any rules?"); + stage = 14; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ok thanks."); + stage = 13; + break; + } + break; + case 13: + end(); + break; + case 14: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No rules, you use whatever you want. Last person", "standing wins and is declared champion, they stay in", "the pit for the next fight."); + stage = 15; + break; + case 15: + interpreter.sendOptions("Select an Option", "Do I win anything?", "Sounds good."); + stage = 16; + break; + case 16: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do I win anything?"); + stage = 17; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Sounds good."); + stage = 13; + break; + } + break; + case 17: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "You ask a lot of questions.", "Champion gets TokKul as reward, but more fights the more", "TokKul they get."); + stage = 18; + break; + case 18: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "..."); + stage = 19; + break; + case 19: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Before you ask, TokKul is like your coins."); + stage = 400; + break; + case 400: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Gold is like you JalYt, soft and easily broken, we use", "hard rock forged in fire like TzHaar!"); + stage = 401; + break; + case 401: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ah that would be " + npc.getAttribute("fp_champn", "JalYt-Ket-Emperor")); + stage = 21; + break; + case 21: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2618 }; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/MuseumGuardDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/MuseumGuardDialogue.java new file mode 100644 index 000000000..e324272c2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/MuseumGuardDialogue.java @@ -0,0 +1,88 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.world.map.RegionManager; + +/** + * Represents the museum guard dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MuseumGuardDialogue extends DialoguePlugin { + + /** + * Represents the gate location. + */ + private static final Location LOCATION = new Location(3261, 3446, 0); + + /** + * Constructs a new {@code MuseumGuardDialogue} {@code Object}. + */ + public MuseumGuardDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MuseumGuardDialogue} {@code Object}. + * @param player the player. + */ + public MuseumGuardDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MuseumGuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogues(5941, FacialExpression.HALF_GUILTY, "Welcome! Would you like to go into the Dig Site", "archaeology cleaning area?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, I'll go in!", "No thanks, I'll take a look around out there."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, I'll go in!"); + stage = 20; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I'll take a look around out there."); + stage = 3; + break; + } + break; + case 3: + end(); + break; + case 20: + end(); + DoorActionHandler.handleAutowalkDoor(player, RegionManager.getObject(LOCATION)); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5941 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/MuseumGuardVarrockDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/MuseumGuardVarrockDialogue.java new file mode 100644 index 000000000..e80a2caea --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/MuseumGuardVarrockDialogue.java @@ -0,0 +1,69 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the MuseumGuardVarrockDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class MuseumGuardVarrockDialogue extends DialoguePlugin { + + public MuseumGuardVarrockDialogue() { + + } + + public MuseumGuardVarrockDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 5943 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, how do I get in?"); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, the main entrance is 'round the front. Just head", "west then north slightly, you can't miss it!"); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What about these doors?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "They're primarily for the workmen bringing finds from the", "Dig Site, but you can go through if you want."); + stage = 5; + break; + case 5: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MuseumGuardVarrockDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello there. Come to see the new museum?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/MuseumHistorianDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/MuseumHistorianDialogue.java new file mode 100644 index 000000000..ef86afd12 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/MuseumHistorianDialogue.java @@ -0,0 +1,129 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Museum Natural Historian dialogue plugin. + * @author 'qmqz + * @version 1.0 + */ +@Initializable +public final class MuseumHistorianDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code MuseumHistorianDialogue {@code Object}. + */ + public MuseumHistorianDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MuseumHistorianDialogue} {@code Object}. + * @param player the player. + */ + public MuseumHistorianDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MuseumHistorianDialogue(player); + } + + @Override + public boolean open(Object... args) { + genderCheck(); + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.ASKING, "Hello again, " + gender + ", how can I help you on this fine day?"); + stage = 0; + return true; + } + + public String gender; + public void genderCheck() { + if (player.isMale()) { + gender = "sir"; + } else { + gender = "madam"; + } + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(player, FacialExpression.ASKING, "I was hoping you could tell me about something."); + stage = 1; + break; + + case 1: + interpreter.sendOptions("Select an Option", "Tell me about snails.", "Tell me about monkeys.", "Tell me about sea slugs.", "Tell me about snakes.", "That's enough education for one day."); + stage = 2; + break; + + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_ASKING, "Tell me about snails."); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_ASKING, "Tell me about monkeys."); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_ASKING, "Tell me about sea slugs."); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_ASKING, "Tell me about snakes."); + stage = 40; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_ASKING, "That's enough education for one day."); + stage = 99; + break; + + } + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh snails, the gelatinous gastropods.", "If you just follow me to the display case,"," I shall explain all about them."); + //transitions into a cutscene + stage = 99; + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh monkeys, the simian collective.", "If you just follow me to the display case,", " I shall explain all about them."); + //transitions into a cutscene + stage = 99; + break; + + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh sea slugs, the cute crustaceans.", "If you just follow me to the display case,", "I shall explain all about them."); + //transitions into a cutscene + stage = 99; + break; + + case 40: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ahh snakes, the slithering squamata.", "If you just follow me to the display case,", "I shall explain all about them."); + //transitions into a cutscene + stage = 99; + break; + + case 99: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 5966, 5967 }; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/SchoolchildMuseumDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/SchoolchildMuseumDialogue.java new file mode 100644 index 000000000..147d3fff0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/SchoolchildMuseumDialogue.java @@ -0,0 +1,60 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; + +/** + * Handles the SchoolchildMuseumDialogue dialogue. + * + * @author afaroutdude + */ +@Initializable +public class SchoolchildMuseumDialogue extends DialoguePlugin { + + private static final String[][] chats = { + {"Can you find my teacher? I need the toilet!"}, + {"I wonder what they're doing behind that", "rope."}, + {"Teacher! Can we go to the Natural History Exhibit", "now?"}, + {"*sniff* They won't let me take an arrowhead as a", "souvenir."}, + {"Yaaay! A day off school."}, + {"I wanna be an archaeologist when I grow up!"}, + {"Sada... Sram... Sa-ra-do-min is bestest!"}, + {"*cough* It's so dusty in here."}, + {"Maz... Zar... Za-mor-ak is bestest!"} + }; + + public SchoolchildMuseumDialogue() { + + } + + public SchoolchildMuseumDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[]{5984, 5945, 5946, 10}; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SchoolchildMuseumDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.CHILD_FRIENDLY, chats[RandomFunction.random(0, chats.length)]); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumDialogue.java new file mode 100644 index 000000000..bba65b3ae --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumDialogue.java @@ -0,0 +1,67 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TeacherandPupilMuseumDialogue dialogue. + * + * @author 'Vexia + */ +@Initializable +public class TeacherandPupilMuseumDialogue extends DialoguePlugin { + + public TeacherandPupilMuseumDialogue() { + + } + + public TeacherandPupilMuseumDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[]{5947}; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(5951, FacialExpression.CHILD_FRIENDLY, "Aww, but miss, it's sooo exciting."); + stage = 999; + break; + case 1: + interpreter.sendDialogues(5950, FacialExpression.HALF_GUILTY, "That's because he's an art critic, dear. They have", "some very funny ideas."); + stage = 999; + break; + case 999: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new TeacherandPupilMuseumDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (npc.getLocation().getZ() == 0) { + interpreter.sendDialogues(5950, FacialExpression.ANGRY, "Stop pulling, we've plenty of time to see everything."); + stage = 0; + } else { + interpreter.sendDialogues(5951, FacialExpression.HALF_GUILTY, "That man over there talks funny, miss."); + stage = 1; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumMaleDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumMaleDialogue.java new file mode 100644 index 000000000..9c5639322 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/TeacherandPupilMuseumMaleDialogue.java @@ -0,0 +1,66 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the TeacherandPupilMuseumMaleDialogue dialogue. + * + * @author 'qmqz + */ +@Initializable +public class TeacherandPupilMuseumMaleDialogue extends DialoguePlugin { + + public TeacherandPupilMuseumMaleDialogue() { + + } + + public TeacherandPupilMuseumMaleDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[]{5944}; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(5948, FacialExpression.HALF_GUILTY, "I told you to go before we got here."); + stage = 1; + break; + + case 1: + interpreter.sendDialogues(5949, FacialExpression.CHILD_GUILTY, "But sir, I didn't need to go then!"); + stage = 2; + break; + + case 2: + interpreter.sendDialogues(5948, FacialExpression.HALF_GUILTY, "Alright, come on then."); + stage = 99; + break; + + case 99: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new TeacherandPupilMuseumMaleDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogues(5949, FacialExpression.CHILD_GUILTY, "Teacher! Sir! I need the toilet!"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockBartenderDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockBartenderDialogue.java new file mode 100644 index 000000000..b67c7c2eb --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockBartenderDialogue.java @@ -0,0 +1,138 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * The plugin used to handle the dialogue for the varrock bartender. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class VarrockBartenderDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code VarrockBartenderDialogue} {@code Object}. + */ + public VarrockBartenderDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code VarrockBartenderDialogue} {@code Object}. + * @param player the player. + */ + public VarrockBartenderDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 732, 731 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Good day to you, brave adventurer. Can I get you a", "refreshing beer?"); + stage = 1; + break; + case 1: + interpreter.sendOptions("Select an Option", "Yes please!", "No thanks.", "How much?"); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please!"); + stage = 10; + break; + + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); + stage = 20; + break; + + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How much?"); + stage = 30; + break; + } + + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ok then, that's two gold coins please."); + stage = 11; + break; + case 11: + if (player.getInventory().contains(995, 2)) { + player.getInventory().remove(new Item(995, 2)); + player.getInventory().add(new Item(1917, 1)); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Cheers!"); + stage = 12; + } else { + end(); + player.getPacketDispatch().sendMessage("You need two gold coins to buy a beer."); + } + break; + case 12: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Cheers!"); + stage = 13; + break; + case 13: + end(); + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Let me know if you change your mind."); + stage = 21; + break; + case 21: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Two gold pieces a pint. So, what do you say?"); + stage = 31; + break; + case 31: + interpreter.sendOptions("Select an Option", "Yes please!", "No thanks."); + stage = 32; + break; + case 32: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes please!"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks."); + stage = 20; + break; + } + + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new VarrockBartenderDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Hello."); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockBrokenCart.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockBrokenCart.java new file mode 100644 index 000000000..b7ec7831b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockBrokenCart.java @@ -0,0 +1,28 @@ +package core.game.node.entity.npc.city.varrock; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * @author 'Vexia + */ +@Initializable +public class VarrockBrokenCart extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(70099, "You search the cart but are surprised to find very little there. It's a", "little odd for a travelling trader not to have anything to trade."); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(23055).getHandlers().put("option:search", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockCookDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockCookDialogue.java new file mode 100644 index 000000000..403df82d9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockCookDialogue.java @@ -0,0 +1,152 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Handles the VarrockCookDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class VarrockCookDialogue extends DialoguePlugin { + + public VarrockCookDialogue() { + + } + + public VarrockCookDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 5910 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendOptions("What would you like to say?", "Can you sell me any food?", "Can you give me any free food?", "I don't want anything from this horrible kitchen."); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you sell me any food?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Can you give me any free food?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I don't want anything from this horrible kitchen."); + stage = 30; + break; + } + + break; + + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "I suppose I could sell you some cabbage, if you're willing to", "pay for it. Cabbage is good for you."); + stage = 11; + break; + case 11: + interpreter.sendOptions("What would you like to say?", "Alright, I'll buy a cabbage.", "No thanks, I don't like cabbage."); + stage = 12; + break; + case 12: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Alright, I'll buy a cabbage."); + stage = 150; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No thanks, I don't like cabbage."); + stage = 160; + break; + } + + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Can you give me any free money?"); + stage = 21; + break; + case 21: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Why should I give you free money?"); + stage = 22; + break; + case 22: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Why should I give you free food?"); + stage = 23; + break; + case 23: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh, forget it."); + stage = 24; + break; + case 24: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "How dare you? I put a lot of effort into cleaning this", "kitchen. My daily sweat and elbow-grease keep this kitchen", "clean!"); + stage = 31; + break; + case 31: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Ewww!"); + stage = 32; + break; + case 32: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Oh, just leave me alone."); + stage = 33; + break; + case 33: + end(); + break; + case 150: + if (player.getInventory().contains(995, 1)) { + player.getInventory().remove(new Item(995, 1)); + player.getInventory().add(new Item(1965, 1)); + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's a deal. Now, make sure you eat it all up. Cabbage is", "good for you."); + stage = 151; + } else { + end(); + player.getPacketDispatch().sendMessage("You need one coin to buy a cabbage."); + } + break; + case 151: + end(); + break; + case 160: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Bah! People these days only appreciate junk food."); + stage = 161; + break; + case 161: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new VarrockCookDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What do you want? I'm busy!"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockEastBartenderDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockEastBartenderDialogue.java new file mode 100644 index 000000000..22d052e8d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockEastBartenderDialogue.java @@ -0,0 +1,154 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.GameWorld; + +/** + * Handles the VarrockEastBartenderDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class VarrockEastBartenderDialogue extends DialoguePlugin { + + public VarrockEastBartenderDialogue() { + + } + + public VarrockEastBartenderDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 733 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "A glass of your finest ale please.", "Can you recommend where an adventurer might make his fortune?", "Do you know where I can get some good equipment?"); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "A glass of your finest ale please."); + stage = 10; + break; + + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Cany ou recommend where an adventurer might make", "his fortune?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Do you know where I can get some good equipment?"); + stage = 30; + break; + } + + break; + + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "No problemo. That'll be 2 coins."); + stage = 11; + break; + case 11: + if (player.getInventory().contains(995, 2)) { + player.getInventory().remove(new Item(995, 2)); + player.getInventory().add(new Item(1917, 1)); + end(); + player.getPacketDispatch().sendMessage("You buy a pint of beer."); + } else { + end(); + player.getPacketDispatch().sendMessage("You need 2 coins to buy ale."); + } + break; + case 20: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Ooh I don't know if I should be giving away information,", "makes the computer game too easy."); + stage = 21; + break; + case 21: + interpreter.sendOptions("Select an Option", "Oh ah well...", "Computer game? What are you talking about?", "Just a small clue?"); + stage = 22; + break; + case 22: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Oh ah well..."); + stage = 150; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Computer game? What are you talking about?"); + stage = 160; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Just a small clue?"); + stage = 170; + break; + } + + break; + case 160: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "This world around us... is a computer game.... called", "" + GameWorld.getSettings().getName() + "."); + stage = 161; + break; + case 161: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nope, still don't understand what you are talking about.", "What's a computer?"); + stage = 162; + break; + case 162: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "It's a sort of magic box thing, wich can do all sorts of", "stuff."); + stage = 163; + break; + case 163: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I give up. You're obviously completely mad"); + stage = 164; + break; + case 164: + end(); + break; + case 150: + end(); + break; + case 30: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Well, there's the sword shop across the road, or there's", "also all sorts of shops up around the market."); + stage = 31; + break; + case 31: + end(); + break; + case 170: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Go and talk to the bartender at the Holly Boar Inn, he", "doesn't seem to mind giving away clues."); + stage = 171; + break; + case 171: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new VarrockEastBartenderDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "What can I do yer for?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockGateGuardDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockGateGuardDialogue.java new file mode 100644 index 000000000..296cf7443 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockGateGuardDialogue.java @@ -0,0 +1,54 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Handles the VarrockGateGuardDialogue dialogue. + * @author 'Vexia + */ +@Initializable +public class VarrockGateGuardDialogue extends DialoguePlugin { + + public VarrockGateGuardDialogue() { + + } + + public VarrockGateGuardDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 368 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new VarrockGateGuardDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Please don't disturb me, I've got to keep an eye out for", "suspicious indiduals."); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockSwordShopDialogue.java b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockSwordShopDialogue.java new file mode 100644 index 000000000..0892eb482 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/city/varrock/VarrockSwordShopDialogue.java @@ -0,0 +1,78 @@ +package core.game.node.entity.npc.city.varrock; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles the VarrockSwordShopDialogue dialogue. + * @author 'Vexia + */ +public class VarrockSwordShopDialogue extends DialoguePlugin { + + public VarrockSwordShopDialogue() { + + } + + public VarrockSwordShopDialogue(Player player) { + super(player); + } + + @Override + public int[] getIds() { + return new int[] { 551 }; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "Yes, please.", "No, I'm okay for swords right now."); + stage = 1; + break; + case 1: + + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yes, please."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "No, I'm okay for swords right now."); + stage = 10; + break; + } + + break; + case 2: + end(); + npc.openShop(player); + break; + case 10: + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Come back if you need any."); + stage = 11; + break; + case 11: + end(); + break; + } + + return true; + } + + @Override + public DialoguePlugin newInstance(Player player) { + + return new VarrockSwordShopDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.HALF_GUILTY, "Hello, adventurer. Can I interest you in some swords?"); + stage = 0; + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/drop/DropFrequency.java b/Server/src/main/java/Server/core/game/node/entity/npc/drop/DropFrequency.java new file mode 100644 index 000000000..fd3e6f948 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/drop/DropFrequency.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.drop; + +import java.util.Arrays; +import java.util.HashMap; + +/** + * Represents the different types of drop frequency. + * @author Emperor + */ +public enum DropFrequency { + + /** + * This gets dropped all the time. + */ + ALWAYS, + + /** + * This gets commonly dropped. + */ + COMMON, + + /** + * This drop is uncommon. + */ + UNCOMMON, + + /** + * This gets rarely dropped. + */ + RARE, + + /** + * This gets very rarely dropped. + */ + VERY_RARE; + + static int[] RATES = {1, 5, 15, 30, 60}; + final static HashMap rateMap = new HashMap<>(); + static{ + Arrays.stream(DropFrequency.values()).forEach(freq -> rateMap.putIfAbsent(freq,RATES[freq.ordinal()])); + } + + public static int rate(DropFrequency frequency){ + return rateMap.get(frequency); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/drop/NPCDropTables.java b/Server/src/main/java/Server/core/game/node/entity/npc/drop/NPCDropTables.java new file mode 100644 index 000000000..4eb2a9809 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/drop/NPCDropTables.java @@ -0,0 +1,306 @@ +package core.game.node.entity.npc.drop; + +import core.cache.def.impl.NPCDefinition; +import core.game.node.item.*; +import core.game.system.config.ItemConfigParser; +import plugin.ai.AIPlayer; +import plugin.ai.AIRepository; +import plugin.ai.general.GeneralBotCreator; +import core.game.ge.GrandExchangeDatabase; +import core.game.content.global.Bones; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * Holds and handles the NPC drop tables. + * @author Emperor + */ +public final class NPCDropTables { + + /** + * The drop rates (0=common, 1=uncommon, 2=rare, 3=very rare). + */ + public static final int[] DROP_RATES = { 750, 150, 15, 5 }; + + /** + * The npcs that will display drop messages + */ + public static final int[] MESSAGE_NPCS = { 50, 7133, 7134, 2881, 2882, 2883, 3200, 3340, 6247, 6203, 6260, 6222, 2745, 1160, 8133, 8610, 8611, 8612, 8613, 8614, 6204, 6206, 6208, 6261, 6263, 6265, 6223, 6225, 6227 }; + + /** + * The default drop table (holding the 100% drops). + */ + private final List defaultTable = new ArrayList<>(); + + /** + * The charms drop table (holding the charm drops). + */ + private final List charmTable = new ArrayList<>(); + + /** + * The main drop table (holding the main drops). + */ + private final List mainTable = new ArrayList<>(); + + /** + * The NPC definitions. + */ + private final NPCDefinition def; + + /** + * The main drop table size. + */ + private int mainTableSize; + + /** + * The mod rate used with this table. + */ + private double modRate; + + /** + * Constructs a new {@code NPCDropTables} {@code Object}. + * @param def The NPC definitions. + */ + public NPCDropTables(NPCDefinition def) { + this.def = def; + } + + /** + * Handles the dropping. + * @param npc The NPC dropping the loot. + * @param looter The entity gaining the loot. + */ + public void drop(NPC npc, Entity looter) { + Player p = looter instanceof Player ? (Player) looter : null; + if (!charmTable.isEmpty()) { + boolean rollCharms = RandomFunction.random(5) == 3; + if(rollCharms) { + createDrop(RandomFunction.rollWeightedChanceTable(charmTable),p,npc,npc.getDropLocation()); + } + } + defaultTable.forEach(drop -> { + createDrop(drop.getItem(),p,npc,npc.getDropLocation()); + }); + Item item = RandomFunction.rollWeightedChanceTable(mainTable); + //boolean hasWealthRing = p != null && p.getEquipment().getNew(EquipmentContainer.SLOT_RING).getId() == 2572; + if(item != null) { + boolean isRDTSlot = item.getId() == RareDropTable.SLOT_ITEM_ID; + if (isRDTSlot) { + item = RareDropTable.retrieve(); + } + if (item != null && p != null && npc != null) { + createDrop(item, p, npc, npc.getDropLocation()); + } + } + } + + /** + * Creates a dropped item. + * @param item The item to drop. + * @param player The player getting the loot (or null). + * @param npc the npc. + * @param l The location of the NPC dropping the loot. + */ + public void createDrop(Item item, Player player, NPC npc, Location l) { + if (item == null || item.getId() == 0 || l == null || item.getName().equals("null") || player == null) { + return; + } + if (handleBoneCrusher(player, item)) { + return; + } + if (item.getId() == RareDropTable.SLOT_ITEM_ID){ + item = RareDropTable.retrieve(); + } + if (item.getId() == 995 && player.getBank().hasSpaceFor(item) && ( player.getGlobalData().isEnableCoinMachine() )) { + item = new Item(995, (int) (item.getAmount() + (item.getAmount() * 0.25))); + player.getBank().add(item); + player.sendMessage(" " + item.getAmount() + " coins were sent to your bank."); + return; + } + if (item.hasItemPlugin() && player != null) { + if (!item.getPlugin().createDrop(item, player, npc, l)) { + return; + } + item = item.getPlugin().getItem(item, npc); + } + if (!item.getDefinition().isStackable() && item.getAmount() > 1) { + for (int i = 0; i < item.getAmount(); i++) { + GroundItemManager.create(new Item(item.getId()), l, player); + } + return; + } + if (item.getDefinition().getConfiguration(ItemConfigParser.RARE_ITEM, false)) { + Repository.sendNews(player.getUsername() + " has just received: " + item.getAmount() + " x " + item.getName() + "."); + } + if(item.getId() == 6199 && player instanceof Player){ + player.sendMessage("A mystery box has fallen on the ground."); + } + sendDropMessage(player, npc.getId(), item); + if (player == null) { + if (item != null) { + GroundItemManager.create(item, l); + } + } else { + GroundItem groundItem = GroundItemManager.create(item, l, getLooter(player, npc, item)); + if(player instanceof AIPlayer) { + AIRepository.addItem(groundItem); + } + GeneralBotCreator.BotScriptPulse pulse = player.getAttribute("botting:script",null); + if(pulse != null && pulse.isRunning()){ + List items = player.getAttribute("botting:drops",new ArrayList()); + items.add(groundItem); + player.setAttribute("botting:drops",items); + } + } + } + + /** + * Gets the looting player. + * @param player the player. + * @param item the item. + * @return the player. + */ + public Player getLooter(Player player, NPC npc, Item item) { + int itemId = item.getDefinition().isUnnoted() ? item.getId() : item.getNoteChange(); + if (player != null && npc.getProperties().isMultiZone() && (GrandExchangeDatabase.getDatabase().get(itemId) != null || item.getName().endsWith("charm")) && player.getCommunication().getClan() != null && player.getCommunication().isLootShare() && player.getCommunication().getLootRequirement().ordinal() >= player.getCommunication().getClan().getLootRequirement().ordinal() && !player.getIronmanManager().isIronman()) { + Player looter = player; + List players = RegionManager.getLocalPlayers(npc, 16); + List looters = new ArrayList<>(); + for (Player p : players) { + if (p != null && p.getCommunication().getClan() != null && p.getCommunication().getClan() == player.getCommunication().getClan() && p.getCommunication().isLootShare() && p.getCommunication().getLootRequirement().ordinal() >= p.getCommunication().getClan().getLootRequirement().ordinal() && npc.getImpactHandler().getImpactLog().containsKey(p)) { + looters.add(p); + } + } + if (looters.size() > 1) { + int highestLsp = 0; + for (Player p : looters) { + if (p.getGlobalData().getLootSharePoints() > highestLsp && RandomFunction.random(10) >= 2) { + highestLsp = p.getGlobalData().getLootSharePoints(); + looter = p; + } + } + player.sendMessage(player.getInterfaceManager().isResizable()+""); + int price = item.getName().endsWith("charm") ? 100 : GrandExchangeDatabase.getDatabase().get(itemId).getValue(); + looter.getGlobalData().setLootSharePoints(looter.getGlobalData().getLootSharePoints() - (price) + ((price / looters.size()))); + looter.sendMessage((player.getInterfaceManager().isResizable() ? "" : "") + "You received: " + item.getAmount() + " " + item.getName()); + for (Player p : looters) { + if (p != looter) { + p.sendMessage((player.getInterfaceManager().isResizable() ? "" : "") + looter.getUsername() + " received: " + item.getAmount() + " " + item.getName()); + p.getGlobalData().setLootSharePoints(p.getGlobalData().getLootSharePoints() + price / looters.size()); + } + } + } + return looter; + } + return player; + } + + /** + * Sends the drop to players within the area. + * @param killer the killer. + * @param npcId the npcId. + * @param item the item. + */ + private void sendDropMessage(Player killer, int npcId, Item item) { + if (!item.getName().toLowerCase().contains("bone") && !item.getName().toLowerCase().contains("ashes")) { + for (int id : MESSAGE_NPCS) { + if (npcId == id) { + for (Player player : Repository.getPlayers()) { + if (player.getLocation().getDistance(killer.getLocation()) <= 10) { + player.sendMessage((player.getInterfaceManager().isResizable() ? "" : "") + (player == killer ? "You received: " : killer.getUsername() + " received a drop: ") + (item.getAmount() > 1 ? StringUtils.getFormattedNumber(item.getAmount()) + " x " + item.getName() : item.getName()) + ""); + } + } + } + } + } + } + + /** + * Handles the bone crusher perk. + * @param player The player + * @param item The item + * @return true if successfully added experience. + */ + private boolean handleBoneCrusher(Player player, Item item) { + Bones bone = Bones.forId(item.getId()); + if (bone == null || item == null) { + return false; + } + if (!player.getGlobalData().isEnableBoneCrusher()) { + return false; + } + player.getSkills().addExperience(Skills.PRAYER, item.getAmount() * bone.getExperience()); + return true; + } + + /** + * Gets the ratio for stabilizing NPC combat difficulty & drop rates. + * @return The ratio. + */ + public double getStabilizerRatio() { + return (1 / (1 + def.getCombatLevel())) * 10; + } + + /** + * @return the defaultTable. + */ + public List getDefaultTable() { + return defaultTable; + } + + /** + * @return the charmTable. + */ + public List getCharmTable() { + return charmTable; + } + + /** + * @return the mainTable. + */ + public List getMainTable() { + return mainTable; + } + + /** + * @return the mainTableSize. + */ + public int getMainTableSize() { + return mainTableSize; + } + + /** + * @param mainTableSize the mainTableSize to set. + */ + public void setMainTableSize(int mainTableSize) { + this.mainTableSize = mainTableSize; + } + + /** + * Gets the modRate. + * @return The modRate. + */ + public double getModRate() { + return modRate; + } + + /** + * Sets the modRate. + * @param modRate The modRate to set. + */ + public void setModRate(double modRate) { + this.modRate = modRate; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/drop/RareDropTable.java b/Server/src/main/java/Server/core/game/node/entity/npc/drop/RareDropTable.java new file mode 100644 index 000000000..673493e8f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/drop/RareDropTable.java @@ -0,0 +1,94 @@ +package core.game.node.entity.npc.drop; + +import core.ServerConstants; +import core.game.node.item.Item; +import core.game.node.item.WeightedChanceItem; +import core.game.system.SystemLogger; +import core.tools.RandomFunction; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the rare drop table. + * @author Ceikry + */ +public final class RareDropTable { + + /** + * The item id of the item representing the rare drop table slot in a drop + * table. + */ + public static final int SLOT_ITEM_ID = 31; + + /** + * The rare drop table. + */ + private static final List TABLE = new ArrayList<>(); + + + /** + * Initialize needed objects for xml reading/writing + */ + static DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + static DocumentBuilder builder; + + static { + try { + builder = factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } + } + + public RareDropTable() throws ParserConfigurationException {} + + /** + * Initializes the rare drop table. + */ + public static void init(){ + if(!new File(ServerConstants.RDT_DATA_PATH).exists()){ + SystemLogger.logErr("Can't locate RDT file at " + ServerConstants.RDT_DATA_PATH); + return; + } + parse(ServerConstants.RDT_DATA_PATH); + } + + /** + * Parses the xml file for the RDT. + * @param file the .xml file containing the RDT. + */ + public static void parse(String file){ + try { + Document doc = builder.parse(file); + + NodeList itemNodes = doc.getElementsByTagName("item"); + for(int i = 0; i < itemNodes.getLength(); i++){ + Node itemNode = itemNodes.item(i); + if(itemNode.getNodeType() == Node.ELEMENT_NODE){ + Element item = (Element) itemNode; + int itemId = Integer.parseInt(item.getAttribute("id")); + int minAmt = Integer.parseInt(item.getAttribute("minAmt")); + int maxAmt = Integer.parseInt(item.getAttribute("maxAmt")); + int weight = Integer.parseInt(item.getAttribute("weight")); + + TABLE.add(new WeightedChanceItem(itemId,minAmt,maxAmt,weight)); + } + } + } catch (Exception e){ + e.printStackTrace(); + } + } + + public static Item retrieve(){ + return RandomFunction.rollWeightedChanceTable(TABLE); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/drop/SharedTables.java b/Server/src/main/java/Server/core/game/node/entity/npc/drop/SharedTables.java new file mode 100644 index 000000000..2a1d0a316 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/drop/SharedTables.java @@ -0,0 +1,121 @@ +package core.game.node.entity.npc.drop; + +import core.tools.Items; +import core.game.node.item.WeightedChanceItem; + +public enum SharedTables { + COMMON_SEEDS(new WeightedChanceItem[] { + new WeightedChanceItem(Items.LIMPWURT_SEED_5100,1,137), + new WeightedChanceItem(Items.STRAWBERRY_SEED_5323,1,131), + new WeightedChanceItem(Items.MARRENTILL_SEED_5292,1,125), + new WeightedChanceItem(Items.JANGERBERRY_SEED_5104,1,92), + new WeightedChanceItem(Items.TARROMIN_SEED_5293,1,85), + new WeightedChanceItem(Items.WILDBLOOD_SEED_5311,1,83), + new WeightedChanceItem(Items.WATERMELON_SEED_5321,1,63), + new WeightedChanceItem(Items.HARRALANDER_SEED_5294,1,56), + new WeightedChanceItem(Items.RANARR_SEED_5295,1,39), + new WeightedChanceItem(Items.WHITEBERRY_SEED_5105,1,34), + new WeightedChanceItem(Items.MUSHROOM_SPORE_5282,1,29), + new WeightedChanceItem(Items.TOADFLAX_SEED_5296,1,27), + new WeightedChanceItem(Items.BELLADONNA_SEED_5281,1,18), + new WeightedChanceItem(Items.IRIT_SEED_5297,1,18), + new WeightedChanceItem(Items.POISON_IVY_SEED_5106,1,13), + new WeightedChanceItem(Items.AVANTOE_SEED_5298,1,12), + new WeightedChanceItem(Items.CACTUS_SEED_5280,1,12), + new WeightedChanceItem(Items.KWUARM_SEED_5299,1,9), + new WeightedChanceItem(Items.SNAPDRAGON_SEED_5300,1,5), + new WeightedChanceItem(Items.CADANTINE_SEED_5301,1,4), + new WeightedChanceItem(Items.LANTADYME_SEED_5302,1,3), + new WeightedChanceItem(Items.DWARF_WEED_SEED_5303,1,2), + new WeightedChanceItem(Items.TORSTOL_SEED_5304,1,1) + }), + + FIXED_ALLOTMENT_SEEDS(new WeightedChanceItem[]{ + new WeightedChanceItem(Items.POTATO_SEED_5318, 4, 48), + new WeightedChanceItem(Items.ONION_SEED_5319,4,36), + new WeightedChanceItem(Items.CABBAGE_SEED_5324,4,24), + new WeightedChanceItem(Items.TOMATO_SEED_5322,3,12), + new WeightedChanceItem(Items.SWEETCORN_SEED_5320,3,6), + new WeightedChanceItem(Items.STRAWBERRY_SEED_5323,2,3), + new WeightedChanceItem(Items.WATERMELON_SEED_5321,2,2), + }), + + RARE_SEEDS(new WeightedChanceItem[]{ + new WeightedChanceItem(Items.TOADFLAX_SEED_5296,1,24), + new WeightedChanceItem(Items.IRIT_SEED_5297,1,16), + new WeightedChanceItem(Items.BELLADONNA_SEED_5281,1,16), + new WeightedChanceItem(Items.AVANTOE_SEED_5298,1,11), + new WeightedChanceItem(Items.POISON_IVY_SEED_5106,1,11), + new WeightedChanceItem(Items.CACTUS_SEED_5280,1,11), + new WeightedChanceItem(Items.KWUARM_SEED_5299,1,8), + new WeightedChanceItem(Items.SNAPDRAGON_SEED_5300,1,5), + new WeightedChanceItem(Items.CADANTINE_SEED_5301,1,4), + new WeightedChanceItem(Items.LANTADYME_SEED_5302,1,3), + new WeightedChanceItem(Items.DWARF_WEED_SEED_5303,1,2), + new WeightedChanceItem(Items.TORSTOL_SEED_5304,1,1) + }), + + TREE_HERB_SEEDS(new WeightedChanceItem[]{ + new WeightedChanceItem(Items.RANARR_SEED_5295,1,8), + new WeightedChanceItem(Items.SNAPDRAGON_SEED_5300,1,7), + new WeightedChanceItem(Items.TORSTOL_SEED_5304,1,6), + new WeightedChanceItem(Items.WATERMELON_SEED_5321,15,5), + new WeightedChanceItem(Items.WILLOW_SEED_5313,1,5), + new WeightedChanceItem(Items.MAPLE_SEED_5314,1,5), + new WeightedChanceItem(Items.YEW_SEED_5315,1,5), + new WeightedChanceItem(Items.PAPAYA_TREE_SEED_5288,1,4), + new WeightedChanceItem(Items.MAGIC_SEED_5316, 1, 3), + new WeightedChanceItem(Items.PALM_TREE_SEED_5289,1, 3), + new WeightedChanceItem(Items.SPIRIT_SEED_5317,1,2) + }), + + VARIABLE_ALLOTMENT_SEEDS(new WeightedChanceItem[]{ + new WeightedChanceItem(Items.POTATO_SEED_5318,1,4,64), + new WeightedChanceItem(Items.ONION_SEED_5319,1,3,32), + new WeightedChanceItem(Items.CABBAGE_SEED_5324,1,3,16), + new WeightedChanceItem(Items.TOMATO_SEED_5322,1,2,8), + new WeightedChanceItem(Items.SWEETCORN_SEED_5320,1,2,4), + new WeightedChanceItem(Items.STRAWBERRY_SEED_5323,1,2), + new WeightedChanceItem(Items.WATERMELON_SEED_5321,1,1) + }), + + HOPS_DROP_TABLE(new WeightedChanceItem[]{ + new WeightedChanceItem(Items.BARLEY_SEED_5305,4,35), + new WeightedChanceItem(Items.HAMMERSTONE_SEED_5307,4,28), + new WeightedChanceItem(Items.JUTE_SEED_5306,2,19), + new WeightedChanceItem(Items.ASGARNIAN_SEED_5308,3,17), + new WeightedChanceItem(Items.YANILLIAN_SEED_5309,2,12), + new WeightedChanceItem(Items.KRANDORIAN_SEED_5310,2,4), + new WeightedChanceItem(Items.WILDBLOOD_SEED_5311,1, 1) + }), + + HERBS(new WeightedChanceItem[]{ + new WeightedChanceItem(Items.GRIMY_GUAM_199, 1, 11), + new WeightedChanceItem(Items.GRIMY_MARRENTILL_201,1,8), + new WeightedChanceItem(Items.GRIMY_TARROMIN_203,1,6), + new WeightedChanceItem(Items.GRIMY_HARRALANDER_205,1,5), + new WeightedChanceItem(Items.GRIMY_RANARR_208,1,4), + new WeightedChanceItem(Items.GRIMY_IRIT_209,1,3), + new WeightedChanceItem(Items.GRIMY_AVANTOE_212,1,2), + new WeightedChanceItem(Items.GRIMY_KWUARM_213,1,2), + new WeightedChanceItem(Items.GRIMY_CADANTINE_215,1,2), + new WeightedChanceItem(Items.GRIMY_LANTADYME_2485,1,1), + new WeightedChanceItem(Items.GRIMY_DWARF_WEED_217,1,1) + }), + + USEFUL_HERBS(new WeightedChanceItem[]{ + new WeightedChanceItem(Items.GRIMY_AVANTOE_212,1,2), + new WeightedChanceItem(Items.GRIMY_SNAPDRAGON_3052,1,1), + new WeightedChanceItem(Items.GRIMY_RANARR_208,1,1), + new WeightedChanceItem(Items.GRIMY_TORSTOL_220,1,1) + }); + + + + WeightedChanceItem[] table; + SharedTables(WeightedChanceItem[] table){ + this.table = table; + } + + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AbyssalLurkerNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AbyssalLurkerNPC.java new file mode 100644 index 000000000..c93e9dafa --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AbyssalLurkerNPC.java @@ -0,0 +1,69 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Abyssal Lurker familiar. + * @author Aero + */ +@Initializable +public class AbyssalLurkerNPC extends BurdenBeast { + + /** + * Constructs a new {@code AbyssalLurkerNPC} {@code Object}. + */ + public AbyssalLurkerNPC() { + this(null, 6820); + } + + /** + * Constructs a new {@code AbyssalLurkerNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public AbyssalLurkerNPC(Player owner, int id) { + super(owner, id, 4100, 12037, 3, 7, WeaponInterface.STYLE_CAST); + } + + @Override + public Familiar construct(Player owner, int id) { + return new AbyssalLurkerNPC(owner, id); + } + + @Override + public boolean isAllowed(Player owner, Item item) { + if (item.getId() != 1436 && item.getId() != 7936) { + owner.getPacketDispatch().sendMessage("Your familiar can only hold unnoted essence."); + return false; + } + return super.isAllowed(owner, item); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + visualize(Animation.create(7682), Graphics.create(0)); + owner.getSkills().updateLevel(Skills.AGILITY, 4); + owner.getSkills().updateLevel(Skills.THIEVING, 4); + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(new Animation(7660), new Graphics(1296)); + } + + @Override + public int[] getIds() { + return new int[] { 6820, 6821 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AbyssalParasiteNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AbyssalParasiteNPC.java new file mode 100644 index 000000000..45e54497a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AbyssalParasiteNPC.java @@ -0,0 +1,78 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the Abyssal Parasite familiar. + * @author Aero + * @note do the shit for the abbys. + */ +@Initializable +public class AbyssalParasiteNPC extends BurdenBeast { + + /** + * The special move flag. + */ + @SuppressWarnings("unused") + private boolean specialMove = false; + + /** + * Constructs a new {@code AbyssalParasiteNPC} {@code Object}. + */ + public AbyssalParasiteNPC() { + this(null, 6818); + } + + /** + * Constructs a new {@code AbyssalParasiteNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public AbyssalParasiteNPC(Player owner, int id) { + super(owner, id, 3000, 12035, 1, 7); + } + + @Override + public Familiar construct(Player owner, int id) { + return new AbyssalParasiteNPC(owner, id); + } + + @Override + public boolean isAllowed(Player owner, Item item) { + if (item.getId() != 1436 && item.getId() != 7936) { + owner.getPacketDispatch().sendMessage("Your familiar can only hold unnoted essence."); + return false; + } + return super.isAllowed(owner, item); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = special.getTarget(); + if (!canCombatSpecial(target)) { + return false; + } + faceTemporary(target, 2); + sendFamiliarHit(target, 7); + visualize(Animation.create(7672), Graphics.create(1422)); + Projectile.magic(this, target, 1423, 40, 36, 51, 10).send(); + target.getSkills().decrementPrayerPoints(RandomFunction.random(1, 3)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6818, 6819 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AbyssalTitanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AbyssalTitanNPC.java new file mode 100644 index 000000000..25e0c3076 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AbyssalTitanNPC.java @@ -0,0 +1,67 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Abyssal Titan familiar. + * @author Aero + * @author Splinter + */ +@Initializable +public class AbyssalTitanNPC extends Familiar { + + /** + * Constructs a new {@code AbyssalTitanNPC} {@code Object}. + */ + public AbyssalTitanNPC() { + this(null, 7349); + } + + /** + * Constructs a new {@code AbyssalTitanNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public AbyssalTitanNPC(Player owner, int id) { + super(owner, id, 3200, 12796, 6, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new AbyssalTitanNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + Player player = owner; + if (!player.getInventory().containsItem(new Item(1436, 1)) && !player.getInventory().containsItem(new Item(7936, 1))) { + player.sendMessage("You have no essence to send to the bank."); + return false; + } + int RUNE_ESSENCE_AMOUNT = player.getInventory().getAmount(1436); + int PURE_ESSENCE_AMOUNT = player.getInventory().getAmount(7936); + player.getInventory().remove(new Item(1436, RUNE_ESSENCE_AMOUNT), new Item(7936, PURE_ESSENCE_AMOUNT)); + player.getBank().add(new Item(1436, RUNE_ESSENCE_AMOUNT), new Item(7936, PURE_ESSENCE_AMOUNT)); + player.sendMessage("The titan sends " + RUNE_ESSENCE_AMOUNT + " rune essence and " + PURE_ESSENCE_AMOUNT + " pure essence to your bank."); + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(Animation.create(7660), Graphics.create(1316)); + this.visualize(Animation.create(7694), Graphics.create(1457)); + } + + @Override + public int[] getIds() { + return new int[] { 7349, 7350 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AlbinoRatNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AlbinoRatNPC.java new file mode 100644 index 000000000..56ab6ef0c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/AlbinoRatNPC.java @@ -0,0 +1,62 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Albino Rat familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class AlbinoRatNPC extends Forager { + + /** + * The cheese item. + */ + private static final Item CHEESE = new Item(1985, 4); + + /** + * Constructs a new {@code AlbinoRatNPC} {@code Object}. + */ + public AlbinoRatNPC() { + this(null, 6847); + } + + /** + * Constructs a new {@code AlbinoRatNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public AlbinoRatNPC(Player owner, int id) { + super(owner, id, 2200, 12067, 6, WeaponInterface.STYLE_ACCURATE, CHEESE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new AlbinoRatNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (produceItem(CHEESE)) { + owner.lock(7); + visualize(Animation.create(4934), Graphics.create(1384)); + return true; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6847, 6848 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ArcticBearNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ArcticBearNPC.java new file mode 100644 index 000000000..92914caaf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ArcticBearNPC.java @@ -0,0 +1,61 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Arctic Bear familiar. + * @author Aero + */ +@Initializable +public class ArcticBearNPC extends Familiar { + + /** + * Constructs a new {@code ArcticBearNPC} {@code Object}. + */ + public ArcticBearNPC() { + this(null, 6839); + } + + /** + * Constructs a new {@code ArcticBearNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public ArcticBearNPC(Player owner, int id) { + super(owner, id, 2800, 12057, 6, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public Familiar construct(Player owner, int id) { + return new ArcticBearNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + Entity target = special.getTarget(); + if (!canCombatSpecial(target)) { + return false; + } + animate(Animation.create(4926)); + graphics(Graphics.create(1405)); + Projectile p = Projectile.magic(this, target, 1406, 40, 40, 1, 10); + p.setSpeed(25); + p.send(); + sendFamiliarHit(target, 15, Graphics.create(1407)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6839, 6840 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BabyChinchompaNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BabyChinchompaNPC.java new file mode 100644 index 000000000..e6841ff27 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BabyChinchompaNPC.java @@ -0,0 +1,103 @@ +package core.game.node.entity.npc.familiar; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.Metamorphosis; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the baby chinchompa pet. + * @author Empathy + * + */ +@Initializable +public class BabyChinchompaNPC extends Metamorphosis { + + /** + * The chinchompa ids. + */ + private static final int[] CHINCHOMPA_IDS = new int[] { 8643, 8644, 8657, 8658 }; + + /** + * Constructs a new {@code BabyChinchompaNPC} object. + */ + public BabyChinchompaNPC() { + super(CHINCHOMPA_IDS); + } + + @Override + public DialoguePlugin getDialoguePlugin() { + return new BabyChinchompaDialogue(); + } + + @Override + public int getRandomNpcId() { + int i = RandomFunction.getRandom(getIds().length - 1); + if (getIds()[i] == 8658) { + int x = RandomFunction.getRandom(30); + if (x == 1) { + return getIds()[i]; + } else { + return getIds()[i-1]; + } + } + return getIds()[i]; + } + + /** + * Handles the BabyChinchompa Dialogue. + * @author Empathy + * + */ + public final class BabyChinchompaDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code BabyChinchompaDialogue} {@code Object}. + */ + public BabyChinchompaDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BabyChinchompaDialogue} {@code Object}. + * + * @param player the player. + */ + public BabyChinchompaDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BabyChinchompaDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, npc.getId() != 8658 ? "Squeak! Squeak!" : "Squeaka! Squeaka!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8643, 8644, 8657, 8658 }; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BarkerToadNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BarkerToadNPC.java new file mode 100644 index 000000000..37b01f64c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BarkerToadNPC.java @@ -0,0 +1,56 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Barker Toad familiar. + * @author Aero + */ +@Initializable +public class BarkerToadNPC extends Familiar { + + /** + * Constructs a new {@code BarkerToadNPC} {@code Object}. + */ + public BarkerToadNPC() { + this(null, 6889); + } + + /** + * Constructs a new {@code BarkerToadNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public BarkerToadNPC(Player owner, int id) { + super(owner, id, 800, 12123, 6, WeaponInterface.STYLE_AGGRESSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new BarkerToadNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = special.getTarget(); + if (!canCombatSpecial(target)) { + return false; + } + animate(getProperties().getAttackAnimation()); + graphics(Graphics.create(1403)); + sendFamiliarHit(target, 8, Graphics.create(1404)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6889, 6890 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BeaverNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BeaverNPC.java new file mode 100644 index 000000000..b1850c362 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BeaverNPC.java @@ -0,0 +1,149 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the Beaver familiar. + * @author Vexia + * @author Aero + */ +@Initializable +public class BeaverNPC extends Forager { + + /** + * The items to foraged. + */ + private static final Item[] ITEMS = new Item[] { new Item(1511), new Item(2862), new Item(1521), new Item(1519), new Item(6333), new Item(10810), new Item(1517), new Item(6332), new Item(12581), new Item(960), new Item(8778) }; + + /** + * The tree names the scroll can be casted on. + */ + private static final String[] TREE_NAMES = new String[] { "Tree", "Oak", "Hollow", "Willow", "Arctic pine", "Eucalyptus", "Maple", "Yew", "Magic", "Cursed magic" }; + + /** + * If multi chopping. + */ + private boolean multiChop; + + /** + * Constructs a new {@code BeaverNPC} {@code Object}. + */ + public BeaverNPC() { + this(null, 6808); + } + + /** + * Constructs a new {@code BeaverNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public BeaverNPC(Player owner, int id) { + super(owner, id, 2700, 12021, 6, ITEMS); + boosts.add(new SkillBonus(Skills.WOODCUTTING, 2)); + } + + @Override + public Familiar construct(Player owner, int id) { + return new BeaverNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final GameObject object = (GameObject) special.getNode(); + if (!isTree(object.getName())) { + owner.getPacketDispatch().sendMessages("This scroll only works on naturally growing, oak, willow, arctic pine", "teak, mahogany, maple, yew, and magic trees."); + return false; + } + if (owner.getInventory().freeSlots() == 0) { + return false; + } + if (object.getLocation().getDistance(getLocation()) > 5) { + owner.getPacketDispatch().sendMessages("The beaver is a little too far from the tree for the scroll to work - stand", "closer."); + return false; + } + Direction dir = Direction.getLogicalDirection(getLocation(), object.getLocation()); + Pathfinder.find(getLocation(), object.getLocation().transform(dir)).walk(this); + final int ticks = 2 + (int) Math.floor(owner.getLocation().getDistance(object.getLocation().transform(dir)) * 0.5); + owner.lock(ticks); + multiChop = true; + getPulseManager().clear(); + GameWorld.getPulser().submit(new Pulse(ticks, owner, this) { + @Override + public boolean pulse() { + lock(11); + owner.lock(11); + faceLocation(object.getLocation()); + animate(Animation.create(7722)); + GameWorld.getPulser().submit(new Pulse(1, owner, BeaverNPC.this) { + int counter; + boolean recieved = false; + + @Override + public boolean pulse() { + switch (++counter) { + default: + if (counter > 3) { + if (RandomFunction.random(12) < 4) { + owner.getInventory().add(ITEMS[RandomFunction.random(ITEMS.length)], owner); + recieved = true; + } + } + break; + case 11: + if (!recieved) { + owner.getInventory().add(ITEMS[RandomFunction.random(ITEMS.length)], owner); + } + multiChop = false; + return true; + } + return false; + } + }); + return true; + } + }); + return true; + } + + @Override + public void startFollowing() { + if (multiChop) { + return; + } + super.startFollowing(); + } + + /** + * Checks if its a tree. + * @param name the name. + * @return {@code True} if so. + */ + private boolean isTree(final String name) { + for (String s : TREE_NAMES) { + if (s.equals(name)) { + return true; + } + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6808 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BloatedLeechNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BloatedLeechNPC.java new file mode 100644 index 000000000..c8503d3c9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BloatedLeechNPC.java @@ -0,0 +1,59 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.tools.RandomFunction; + +/** + * Represents the Bloated Leech familiar. + * @author Aero + */ +@Initializable +public class BloatedLeechNPC extends Familiar { + + /** + * Constructs a new {@code BloatedLeechNPC} {@code Object}. + */ + public BloatedLeechNPC() { + this(null, 6843); + } + + /** + * Constructs a new {@code BloatedLeechNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public BloatedLeechNPC(Player owner, int id) { + super(owner, id, 3400, 12061, 6, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new BloatedLeechNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + owner.getStateManager().remove(EntityState.POISONED); + for (int i = 0; i < Skills.SKILL_NAME.length; i++) { + if (owner.getSkills().getLevel(i) < owner.getSkills().getStaticLevel(i)) { + owner.getSkills().setLevel(i, owner.getSkills().getStaticLevel(i)); + } + } + owner.getSkills().rechargePrayerPoints(); + getImpactHandler().manualHit(owner, RandomFunction.random(2), HitsplatType.NORMAL); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6843, 6844 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BullAntNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BullAntNPC.java new file mode 100644 index 000000000..f2e081a96 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BullAntNPC.java @@ -0,0 +1,63 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Bull Ant familiar. + * @author Aero + */ +@Initializable +public class BullAntNPC extends BurdenBeast { + + /** + * Constructs a new {@code BullAntNPC} {@code Object}. + */ + public BullAntNPC() { + this(null, 6867); + } + + /** + * Constructs a new {@code BullAntNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public BullAntNPC(Player owner, int id) { + super(owner, id, 3000, 12087, 12, 9, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public Familiar construct(Player owner, int id) { + return new BullAntNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (owner.getSettings().getRunEnergy() >= 100) { + owner.getPacketDispatch().sendMessage("You already have full run energy."); + return false; + } + int amount = owner.getSkills().getStaticLevel(Skills.AGILITY) / 2; + visualize(Animation.create(7896), Graphics.create(1382)); + owner.getSettings().updateRunEnergy(-amount); + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(new Animation(7660), new Graphics(1296)); + } + + @Override + public int[] getIds() { + return new int[] { 6867, 6868 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BunyipNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BunyipNPC.java new file mode 100644 index 000000000..df61725be --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/BunyipNPC.java @@ -0,0 +1,160 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.combat.ImpactHandler; +import core.game.content.consumable.Consumable; +import core.game.content.consumable.Consumables; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.CookableItems; +import core.game.node.entity.skill.fishing.Fish; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the Bunyip familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class BunyipNPC extends Familiar { + + /** + * The fish. + */ + private static final int[] FISH = new int[] { 317, 327, 3150, 345, 321, 353, 335, 341, 349, 3379, 331, 5004, 359, 10138, 5001, 377, 363, 371, 2148, 7944, 3142, 383, 395, 389, 401, 405, 407 }; + + /** + * The time since the last heal. + */ + private int lastHeal; + + /** + * Constructs a new {@code BunyipNPC} {@code Object}. + */ + public BunyipNPC() { + this(null, 6813); + } + + /** + * Constructs a new {@code BunyipNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public BunyipNPC(Player owner, int id) { + super(owner, id, 4400, 12029, 3, WeaponInterface.STYLE_ACCURATE); + setLastHeal(); + } + + @Override + public Familiar construct(Player owner, int id) { + return new BunyipNPC(owner, id); + } + + @Override + public void tick() { + super.tick(); + if (lastHeal < GameWorld.getTicks()) { + setLastHeal(); + owner.graphics(Graphics.create(1507), 1); + owner.getSkills().heal((int) ((int) owner.getSkills().getMaximumLifepoints() * 0.02)); + } + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + /** + * Sets the last heal. + */ + public void setLastHeal() { + this.lastHeal = GameWorld.getTicks() + (int) (15 / 0.6); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + Fish fish = Fish.forItem(special.getItem()); + Player player = owner; + if (fish == null) { + player.sendMessage("You can't use this special on an object like that."); + return false; + } + Consumable consumable = Consumables.getConsumableById(special.getItem().getId() + 2); + if (consumable == null) { + player.sendMessage("Error: Report to admin."); + return false; + } + if (player.getSkills().getLevel(Skills.COOKING) < CookableItems.forId(special.getItem().getId() + 2).level) { + player.sendMessage("You need a Cooking level of at least " + CookableItems.forId(special.getItem().getId()).level + " in order to do that."); + return false; + } + if (player.getInventory().remove(special.getItem())) { + animate(Animation.create(7747)); + graphics(Graphics.create(1481)); + final int healthEffectValue = consumable.getHealthEffectValue(player); + if (healthEffectValue > 0) { + owner.getSkills().heal(consumable.getHealthEffectValue(player)); + } else { + owner.getImpactHandler().manualHit(player, healthEffectValue, ImpactHandler.HitsplatType.NORMAL); + } + } + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(Animation.create(7660), Graphics.create(1316)); + } + + @Override + protected void handleFamiliarTick() { + } + + @Override + protected void configureFamiliar() { + UseWithHandler.addHandler(6813, UseWithHandler.NPC_TYPE, new UseWithHandler(FISH) { + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(6814, UseWithHandler.NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + Fish fish = Fish.forItem(event.getUsedItem()); + Consumable consumable = Consumables.getConsumableById(fish.getItem().getId() + 2); + if (consumable == null) { + return true; + } + player.lock(1); + Item runes = new Item(555, RandomFunction.random(1, consumable.getHealthEffectValue(player))); + if (player.getInventory().remove(event.getUsedItem())) { + player.animate(Animation.create(2779)); + Projectile.create(player, event.getUsedWith().asNpc(), 1435).send(); + player.getInventory().add(runes); + player.sendMessage("The bunyip transmutes the fish into some water runes."); + } + return true; + } + }); + } + + @Override + public int[] getIds() { + return new int[] { 6813, 6184 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.java new file mode 100644 index 000000000..57119f4fd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/CockatriceFamiliarNPC.java @@ -0,0 +1,303 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles the loading of a cockatrice familiar. + * @author Vexia + */ +@Initializable +public final class CockatriceFamiliarNPC implements Plugin { + + /** + * The cockatrice egg. + */ + private static final Item COCKATRICE_EGG = new Item(12109); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new SpiritCockatrice()); + PluginManager.definePlugin(new SpiritGuthatrice()); + PluginManager.definePlugin(new SpiritZamatrice()); + PluginManager.definePlugin(new SpiritPengatrice()); + PluginManager.definePlugin(new SpiritCoraxatrice()); + PluginManager.definePlugin(new SpiritVulatrice()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Handles a petrified gaze. + * @param familiar the familiar. + * @param special the special. + * @return {@code True} if so. + */ + public boolean petrifyingGaze(final Familiar familiar, final FamiliarSpecial special, final int skill) { + final Entity target = special.getTarget(); + if (!familiar.canCombatSpecial(target)) { + return false; + } + familiar.faceTemporary(target, 2); + familiar.visualize(Animation.create(7762), Graphics.create(1467)); + GameWorld.getPulser().submit(new Pulse(1, familiar.getOwner(), familiar, target) { + @Override + public boolean pulse() { + target.getSkills().updateLevel(skill, -3, 0); + Projectile.magic(familiar, target, 1468, 40, 36, 71, 10).send(); + familiar.sendFamiliarHit(target, 10, Graphics.create(1469)); + return true; + } + }); + return true; + } + + /** + * Handles the spirit cockatrice. + * @author Vexia + */ + public final class SpiritCockatrice extends Forager { + + /** + * Constructs a new {@code SpiritCockatrice} {@code Object}. + */ + public SpiritCockatrice() { + this(null, 6875); + } + + /** + * Constructs a new {@code SpiritCockatrice} {@code Object}. + * @param owner the owner. + * @param id the id. + */ + public SpiritCockatrice(Player owner, int id) { + super(owner, id, 3600, 12095, 3, WeaponInterface.STYLE_CAST, COCKATRICE_EGG); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritCockatrice(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return petrifyingGaze(this, special, Skills.DEFENCE); + } + + @Override + public int[] getIds() { + return new int[] { 6875, 6876 }; + } + + } + + /** + * Handles the spirit guthatrice. + * @author Vexia + */ + public class SpiritGuthatrice extends Forager { + + /** + * Constructs a new {@code SpiritGuthatrice} {@code Object}. + */ + public SpiritGuthatrice() { + this(null, 6877); + } + + /** + * Constructs a new {@code SpiritGuthatrice} {@code Object}. + * @param owner the owner. + * @param id the id. + */ + public SpiritGuthatrice(Player owner, int id) { + super(owner, id, 3600, 12097, 3, WeaponInterface.STYLE_CAST, COCKATRICE_EGG); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritGuthatrice(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return petrifyingGaze(this, special, Skills.ATTACK); + } + + @Override + public int[] getIds() { + return new int[] { 6877, 6878 }; + } + } + + /** + * Handles the spirit zamatrice. + * @author Vexia + */ + public class SpiritZamatrice extends Forager { + + /** + * Constructs a new {@code SpiritZamatrice} {@code Object}. + */ + public SpiritZamatrice() { + this(null, 6881); + } + + /** + * Constructs a new {@code SpiritZamatrice} {@code Object}. + * @param owner the owner. + * @param id the id. + */ + public SpiritZamatrice(Player owner, int id) { + super(owner, id, 3600, 12101, 3, WeaponInterface.STYLE_CAST, COCKATRICE_EGG); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritZamatrice(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return petrifyingGaze(this, special, Skills.STRENGTH); + } + + @Override + public int[] getIds() { + return new int[] { 6881, 6882 }; + } + } + + /** + * Handles the spirit pengatrice. + * @author Vexia + */ + public class SpiritPengatrice extends Forager { + + /** + * Constructs a new {@code SpiritPengatrice} {@code Object}. + */ + public SpiritPengatrice() { + this(null, 6883); + } + + /** + * Constructs a new {@code SpiritPengatrice} {@code Object}. + * @param owner the owner. + * @param id the id. + */ + public SpiritPengatrice(Player owner, int id) { + super(owner, id, 3600, 12103, 3, WeaponInterface.STYLE_CAST, COCKATRICE_EGG); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritPengatrice(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return petrifyingGaze(this, special, Skills.MAGIC); + } + + @Override + public int[] getIds() { + return new int[] { 6883, 6884 }; + } + } + + /** + * Represents the Spirit Coraxatrice familiar. + * @author Aero + */ + public class SpiritCoraxatrice extends Forager { + + /** + * Constructs a new {@code SpiritCoraxatriceNPC} {@code Object}. + */ + public SpiritCoraxatrice() { + this(null, 6885); + } + + /** + * Constructs a new {@code SpiritCoraxatriceNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritCoraxatrice(Player owner, int id) { + super(owner, id, 3600, 12105, 3, WeaponInterface.STYLE_CAST, COCKATRICE_EGG); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritCoraxatrice(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return petrifyingGaze(this, special, Skills.SUMMONING); + } + + @Override + public int[] getIds() { + return new int[] { 6885, 6886 }; + } + + } + + /** + * Represents the Spirit Vulatrice familiar. + * @author Aero + */ + public class SpiritVulatrice extends Forager { + + /** + * Constructs a new {@code SpiritVulatriceNPC} {@code Object}. + */ + public SpiritVulatrice() { + this(null, 6887); + } + + /** + * Constructs a new {@code SpiritVulatriceNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritVulatrice(Player owner, int id) { + super(owner, id, 3600, 12107, 3, WeaponInterface.STYLE_CAST, COCKATRICE_EGG); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritVulatrice(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return petrifyingGaze(this, special, Skills.RANGE); + } + + @Override + public int[] getIds() { + return new int[] { 6887, 6888 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/CompostMoundNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/CompostMoundNPC.java new file mode 100644 index 000000000..9c37a7b96 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/CompostMoundNPC.java @@ -0,0 +1,223 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Represents the Compost Mound familiar. + * @author Vexia + * @author Aero + */ +@Initializable +public class CompostMoundNPC extends Forager { + + /** + * The product items. + */ + private static final Item[] ITEMS = new Item[] { new Item(6032), new Item(6034), new Item(5318), new Item(5319), new Item(5324), new Item(5322), new Item(5320), new Item(5323), new Item(5321), new Item(5305), new Item(5307), new Item(5308), new Item(5306), new Item(5309), new Item(5310), new Item(5311), new Item(5101), new Item(5102), new Item(5103), new Item(5104), new Item(5105), new Item(5106), new Item(5096), new Item(5097), new Item(5098), new Item(5099), new Item(5100), new Item(5291), new Item(5292), new Item(5293), new Item(5294), new Item(5295), new Item(12176), new Item(5296), new Item(5298), new Item(5299), new Item(5300), new Item(5301), new Item(5302), new Item(5303), new Item(5304) }; + + /** + * Constructs a new {@code CompostMoundNPC} {@code Object}. + */ + public CompostMoundNPC() { + this(null, 6871); + } + + /** + * Constructs a new {@code CompostMoundNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public CompostMoundNPC(Player owner, int id) { + super(owner, id, 2400, 12091, 12, WeaponInterface.STYLE_AGGRESSIVE, ITEMS); + } + + @Override + public Familiar construct(Player owner, int id) { + return new CompostMoundNPC(owner, id); + } + + @Override + public void configureFamiliar() { + PluginManager.definePlugin(new CompostBucketPlugin()); + if (!DialogueInterpreter.contains(getIds()[1])) { + PluginManager.definePlugin(new CompostMoundDialogue()); + } + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final GameObject object = (GameObject) special.getNode(); + if (!object.getName().equals("Compost Bin")) { + owner.getPacketDispatch().sendMessage("This scroll can only be used on an empty compost bin."); + return false; + } + /*final CompostBin bin = owner.getFarmingManager().getCompostManager().getBin(object); + if (bin.getState(owner) != 0) { + owner.getPacketDispatch().sendMessage("This scroll can only be used on an empty compost bin."); + return false; + }*/ + final boolean superCompost = RandomFunction.random(10) == 1; + faceLocation(object.getLocation()); + /*bin.getContainer().add(new Item(superCompost ? 6034 : 6032, 15)); + bin.addConfigValue(owner, 31 << bin.getBitShift());*/ + animate(Animation.create(7775)); + graphics(Graphics.create(1424)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6871, 6872 }; + } + + /** + * The compost bucket plugin. + * @author Vexia + * @version 1.0 + */ + public class CompostBucketPlugin extends UseWithHandler { + + /** + * Constructs a new {@code CompostBucketPlugin} {@code Object}. + */ + public CompostBucketPlugin() { + super(1925); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(6871, NPC_TYPE, this); + addHandler(6872, NPC_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Familiar familiar = (Familiar) event.getUsedWith(); + if (!player.getFamiliarManager().isOwner(familiar)) { + return true; + } + player.animate(Animation.create(895)); + familiar.animate(Animation.create(7775)); + player.getInventory().replace(ITEMS[0], event.getUsedItem().getSlot()); + familiar.getImpactHandler().manualHit(player, 2, HitsplatType.NORMAL); + return true; + } + + } + + /** + * The compost dialogue. + * @author Vexia + * @version 1.0 + */ + public class CompostMoundDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code CompostDialogue} {@code Object}. + */ + public CompostMoundDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code CompostDialogue} {@code Object}. + * @param player the player. + */ + public CompostMoundDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CompostMoundDialogue(player); + } + + @Override + public boolean open(Object... args) { + options("Chat", "Withdraw", "Farming boost"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + npc("Schlorp, splort, splort, splutter shclorp?", "(What we be doin' 'ere, zur?)"); + stage = 10; + break; + case 2: + end(); + Forager forager = (Forager) player.getFamiliarManager().getFamiliar(); + forager.openInterface(); + break; + case 3: + player("Can you boost my Farming stat, please?"); + stage = 30; + break; + } + break; + case 10: + player("Oh, I have a few things to take care of here, is all."); + stage++; + break; + case 11: + npc("Schorp, splutter, splutter. Schlup schorp.", "(Aye, right ye are, zur. Oi'll be roight there.)"); + stage++; + break; + case 12: + end(); + break; + case 30: + npc("Schlup glorp sputter!", "(Oi do believe oi can!)"); + stage++; + break; + case 31: + if (player.getSkills().getLevel(Skills.FARMING) > player.getSkills().getStaticLevel(Skills.FARMING)) { + end(); + player.getPacketDispatch().sendMessage("Your stat cannot be boosted this way right now."); + return true; + } + player.getSkills().updateLevel(Skills.FARMING, (int) (1 + (player.getSkills().getStaticLevel(Skills.FARMING) * 0.02))); + player.getPacketDispatch().sendMessage("The Compost mound has boosted your Farming stat."); + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return CompostMoundNPC.this.getIds(); + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/DesertWyrmNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/DesertWyrmNPC.java new file mode 100644 index 000000000..eaf51e327 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/DesertWyrmNPC.java @@ -0,0 +1,166 @@ +package core.game.node.entity.npc.familiar; + +import java.util.ArrayList; +import java.util.List; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.gather.SkillingResource; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the Desert Wyrm familiar. + * @author Vexia + * @author Aero + */ +@Initializable +public final class DesertWyrmNPC extends Forager { + + /** + * Constructs a new {@code DesertWyrmNPC} {@code Object}. + */ + public DesertWyrmNPC() { + this(null, 6831); + } + + /** + * Constructs a new {@code DesertWyrmNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public DesertWyrmNPC(Player owner, int id) { + super(owner, id, 1900, 12049, 6, WeaponInterface.STYLE_AGGRESSIVE); + boosts.add(new SkillBonus(Skills.MINING, 1)); + } + + @Override + public Familiar construct(Player owner, int id) { + return new DesertWyrmNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = (Entity) special.getNode(); + if (!canCombatSpecial(target)) { + return false; + } + faceTemporary((Entity) special.getNode(), 2); + visualize(new Animation(7795), new Graphics(1410)); + Projectile.magic(this, target, 1411, 40, 36, 51, 10).send(); + sendFamiliarHit(target, 5); + return true; + } + + @Override + public void configureFamiliar() { + PluginManager.definePlugin(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : getIds()) { + NPCDefinition.forId(i).getHandlers().put("option:burrow", this); + } + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + final GameObject rock = getClosestRock(player); + if (!player.getFamiliarManager().isOwner((Familiar) node)) { + return true; + } + if (((NPC) node).getLocks().isMovementLocked()) { + return true; + } + if (rock == null) { + player.getPacketDispatch().sendMessage("There are no rocks around here for the desert wyrm to mine from!"); + return true; + } + final SkillingResource resource = SkillingResource.forId(rock.getId()); + if (resource == null) { + player.getPacketDispatch().sendMessage("There are no rocks around here for the desert wyrm to mine from!"); + return true; + } + final Familiar familiar = (Familiar) node; + player.lock(9); + familiar.lock(8); + familiar.visualize(new Animation(7800), new Graphics(1412)); + GameWorld.getPulser().submit(new Pulse(1, player, familiar) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 4: + familiar.setInvisible(true); + break; + case 8: + familiar.call(); + GroundItemManager.create(new Item(resource.getReward()), familiar.getLocation(), player); + return true; + } + return false; + } + }); + return true; + } + + /** + * Gets the closest combat rock. + * @return the object. + */ + public GameObject getClosestRock(Player player) { + List rocks = new ArrayList<>(); + for (int k = 0; k < 7; k++) { + for (int i = 0; i < 4; i++) { + Direction dir = Direction.get(i); + Location loc = player.getLocation().transform(dir.getStepX() * k, dir.getStepY() * k, 0); + GameObject object = RegionManager.getObject(loc); + if (object != null && object.getName().equals("Rocks")) { + rocks.add(object); + } + } + } + int ordinal = 0; + GameObject o = null; + for (GameObject r : rocks) { + SkillingResource resource = SkillingResource.forId(r.getId()); + if (resource != null && resource.ordinal() > ordinal) { + ordinal = resource.ordinal(); + o = r; + } + } + return o; + } + + }); + } + + @Override + public int[] getIds() { + return new int[] { 6831, 6832 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/DreadfowlNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/DreadfowlNPC.java new file mode 100644 index 000000000..1ab2ccb69 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/DreadfowlNPC.java @@ -0,0 +1,126 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the dreadfowl familiar. + * @author Emperor + */ +@Initializable +public final class DreadfowlNPC extends Familiar { + + /** + * If the special move is toggled. + */ + private boolean specialMove; + + /** + * The combat handler. + */ + private static final CombatSwingHandler COMBAT_HANDLER = new MeleeSwingHandler() { + + @Override + public InteractionType canSwing(Entity entity, Entity victim) { + if (((DreadfowlNPC) entity).specialMove) { + return CombatStyle.MAGIC.getSwingHandler().canSwing(entity, victim); + } + return super.canSwing(entity, victim); + } + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + DreadfowlNPC npc = (DreadfowlNPC) entity; + if (npc.specialMove) { + npc.specialMove(new FamiliarSpecial(victim)); + npc.specialMove = false; + return -1; + } + npc.specialMove = RandomFunction.randomize(10) == 0; + return super.swing(entity, victim, state); + } + + }; + + /** + * Constructs a new {@code DreadfowlNPC} {@code Object}. + */ + public DreadfowlNPC() { + this(null, 6825); + } + + /** + * Constructs a new {@code DreadfowlNPC} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + */ + public DreadfowlNPC(Player owner, int id) { + super(owner, id, 400, 12043, 3, WeaponInterface.STYLE_CAST); + super.setCombatHandler(COMBAT_HANDLER); + boosts.add(new SkillBonus(Skills.FARMING, 1)); + } + + @Override + public Familiar construct(Player owner, int id) { + return new DreadfowlNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = (Entity) special.getNode(); + if (!canAttack(target)) { + return false; + } + if (!owner.getProperties().getCombatPulse().isAttacking() && !owner.inCombat()) { + owner.getPacketDispatch().sendMessage("Your familiar can only attack when you're in combat."); + return false; + } + if (getProperties().getCombatPulse().getNextAttack() > GameWorld.getTicks() || CombatStyle.MAGIC.getSwingHandler().canSwing(this, target) == InteractionType.NO_INTERACT) { + specialMove = true; + getProperties().getCombatPulse().attack(target); + return true; + } + visualize(new Animation(5387, Priority.HIGH), Graphics.create(1523)); + Projectile.magic(this, target, 1318, 40, 36, 51, 10).send(); + int ticks = 2 + (int) Math.floor(getLocation().getDistance(target.getLocation()) * 0.5); + getProperties().getCombatPulse().setNextAttack(4); + GameWorld.getPulser().submit(new Pulse(ticks, this, target) { + @Override + public boolean pulse() { + BattleState state = new BattleState(DreadfowlNPC.this, target); + int hit = 0; + if (CombatStyle.MAGIC.getSwingHandler().isAccurateImpact(DreadfowlNPC.this, target)) { + hit = RandomFunction.randomize(3); + } + state.setEstimatedHit(hit); + target.getImpactHandler().handleImpact(owner, hit, CombatStyle.MAGIC, state); + return true; + } + }); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6825, 6826 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/EvilTurnipNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/EvilTurnipNPC.java new file mode 100644 index 000000000..ae8a234eb --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/EvilTurnipNPC.java @@ -0,0 +1,77 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Evil Turnip familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class EvilTurnipNPC extends Forager { + + /** + * The evil turnip item. + */ + private static final Item EVIL_TURNIP = new Item(12136); + + /** + * Constructs a new {@code EvilTurnipNPC} {@code Object}. + */ + public EvilTurnipNPC() { + this(null, 6833); + } + + /** + * Constructs a new {@code EvilTurnipNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public EvilTurnipNPC(Player owner, int id) { + super(owner, id, 3000, 12051, 6, WeaponInterface.STYLE_RANGE_ACCURATE, EVIL_TURNIP); + } + + @Override + public Familiar construct(Player owner, int id) { + return new EvilTurnipNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = (Entity) special.getNode(); + if (!canCombatSpecial(target)) { + return false; + } + int ticks = 2 + (int) Math.floor(getLocation().getDistance(target.getLocation()) * 0.5); + getSkills().heal(2); + faceTemporary(target, 2); + sendFamiliarHit(target, 10); + animate(Animation.create(8251)); + target.graphics(Graphics.create(1329), ticks); + target.getSkills().updateLevel(Skills.MAGIC, -1, 0); + Projectile.magic(this, target, 1330, 40, 36, 51, 10).send(); + return true; + } + + @Override + public int getRandom() { + return 20; + } + + @Override + public int[] getIds() { + return new int[] { 6833, 6834 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/FireTitanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/FireTitanNPC.java new file mode 100644 index 000000000..cad29bd36 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/FireTitanNPC.java @@ -0,0 +1,46 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Fire Titan familiar. + * @author Aero + */ +@Initializable +public class FireTitanNPC extends Familiar { + + /** + * Constructs a new {@code FireTitanNPC} {@code Object}. + */ + public FireTitanNPC() { + this(null, 7355); + } + + /** + * Constructs a new {@code FireTitanNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public FireTitanNPC(Player owner, int id) { + super(owner, id, 6200, 12802, 20); + } + + @Override + public Familiar construct(Player owner, int id) { + return new FireTitanNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 7355, 7356 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ForgeRegentNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ForgeRegentNPC.java new file mode 100644 index 000000000..e1725817a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ForgeRegentNPC.java @@ -0,0 +1,170 @@ +package core.game.node.entity.npc.familiar; + +import core.game.container.impl.EquipmentContainer; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.player.FaceLocationFlag; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.firemaking.FireMakingPulse; +import core.game.node.entity.skill.firemaking.Log; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the Forge Regent familiar. + * @author Aero + */ +@Initializable +public class ForgeRegentNPC extends Familiar { + + /** + * The animation of the forge regent. + */ + private static final Animation FIREMAKE_ANIMATION = Animation.create(8085); // TODO FIX - this is from pyrelord + + /** + * Constructs a new {@code ForgeRegentNPC} {@code Object}. + */ + public ForgeRegentNPC() { + this(null, 7335); + } + + /** + * Constructs a new {@code ForgeRegentNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public ForgeRegentNPC(Player owner, int id) { + super(owner, id, 4500, 12782, 6, WeaponInterface.STYLE_RANGE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new ForgeRegentNPC(owner, id); + } + + @Override + public void configureFamiliar() { + PluginManager.definePlugin(new ForgeRegentFiremake()); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (!(special.getTarget() instanceof Player)) { + owner.sendMessage("You can't use this special on an npc."); + return false; + } + Player target = special.getTarget().asPlayer(); + if (!canCombatSpecial(target)) { + return false; + } + if (target.getInventory().freeSlots() < 1) { + owner.sendMessage("The target doesn't have enough inventory space."); + return false; + } + Item weapon = target.getEquipment().get(EquipmentContainer.SLOT_WEAPON); + Item shield = target.getEquipment().get(EquipmentContainer.SLOT_SHIELD); + if (weapon == null && shield == null) { + owner.sendMessage("The target doesn't have a weapon or shield."); + return false; + } + Item remove = null; + while (remove == null) { + if (RandomFunction.random(2) == 1) { + remove = weapon; + } else { + remove = shield; + } + } + graphics(Graphics.create(1394)); + target.graphics(Graphics.create(1393)); + if (target.getEquipment().remove(remove)) { + target.getInventory().add(remove); + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7335, 7336 }; + } + + /** + * Handles the use with event of a log on a forge regent. + */ + public final class ForgeRegentFiremake extends UseWithHandler { + + /** + * Constructs a new {@code ForgeRegentFiremake} {@code Object}. + */ + public ForgeRegentFiremake() { + super(1511, 2862, 1521, 1519, 6333, 10810, 1517, 6332, 12581, 1515, 1513, 13567, 10329, 10328, 7406, 7405, 7404); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : getIds()) { + addHandler(id, NPC_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Log log = Log.forId(event.getUsedItem().getId()); + final Familiar familiar = (Familiar) event.getUsedWith(); + final int ticks = FIREMAKE_ANIMATION.getDefinition().getDurationTicks(); + if (!player.getFamiliarManager().isOwner(familiar)) { + return true; + } + if (RegionManager.getObject(familiar.getLocation()) != null || familiar.getZoneMonitor().isInZone("bank")) { + player.getPacketDispatch().sendMessage("You can't light a fire here."); + return false; + } + familiar.lock(ticks); + familiar.animate(FIREMAKE_ANIMATION); + if (player.getInventory().remove(event.getUsedItem())) { + final GroundItem ground = GroundItemManager.create(event.getUsedItem(), familiar.getLocation(), player); + GameWorld.getPulser().submit(new Pulse(ticks, player, familiar) { + @Override + public boolean pulse() { + if (!ground.isActive()) { + return true; + } + final GameObject object = new GameObject(log.getFireId(), familiar.getLocation()); + familiar.moveStep(); + GroundItemManager.destroy(ground); + player.getSkills().addExperience(Skills.FIREMAKING, log.getXp() + 10); + familiar.faceLocation(FaceLocationFlag.getFaceLocation(familiar, object)); + ObjectBuilder.add(object, log.getLife(), FireMakingPulse.getAsh(player, log, object)); + if (player.getViewport().getRegion().getId() == 10806) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 9); + } + return true; + } + }); + } + return true; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/FruitBatNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/FruitBatNPC.java new file mode 100644 index 000000000..ebc9ac574 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/FruitBatNPC.java @@ -0,0 +1,153 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.item.WeightedChanceItem; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; +import core.tools.Items; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * Represents the Fruit Bat familiar. + * @author Aero + * @author afaroutdude + */ +@Initializable +public class FruitBatNPC extends Forager { + + /** + * The random fruit to forage. + */ + private static final Item[] FRUIT_FORAGE = new Item[] { + new Item(Items.PAPAYA_FRUIT_5972), + new Item(Items.ORANGE_2108), + new Item(Items.PINEAPPLE_2114), + new Item(Items.LEMON_2102), + new Item(Items.LIME_2120), + new Item(Items.STRAWBERRY_5504), + new Item(Items.WATERMELON_5982), + new Item(Items.COCONUT_5974) + }; + + /** + * The fruit for special move fruitfall EXCEPT the papaya + * Sourced rates from various youtube videos and the RS wiki. + * Note the RS wiki page does not go back to 2009 but there's no + * indication that the rates have changed over time. + * https://www.youtube.com/watch?v=sS8ch9HkGHY + * https://www.youtube.com/watch?v=cMTjDUOvHVM + * https://www.youtube.com/watch?v=WrVsge_MNp4 + * https://2009scape.wiki/w/Money_making_guide/Casting_fruitfall + */ + private static final WeightedChanceItem[] FRUIT_FALL = new WeightedChanceItem[] { + new WeightedChanceItem(Items.ORANGE_2108, 1, 4), + new WeightedChanceItem(Items.PINEAPPLE_2114, 1, 3), + new WeightedChanceItem(Items.LEMON_2102, 1, 2), + new WeightedChanceItem(Items.LIME_2120, 1, 2), + new WeightedChanceItem(Items.BANANA_1963, 1, 2), + new WeightedChanceItem(0, 1, 4) + }; + + /** + * Constructs a new {@code FruitBatNPC} {@code Object}. + */ + public FruitBatNPC() { + this(null, 6817); + } + + /** + * Constructs a new {@code FruitBatNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public FruitBatNPC(Player owner, int id) { + super(owner, id, 4500, 12033, 6, FRUIT_FORAGE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new FruitBatNPC(owner, id); + } + + @Override + public int[] getIds() { + return new int[] { 6817 }; + } + + /** + * Fruitfall works as follows: + * - 80% chance of getting anything at all, in which case a papaya is guaranteed, then + * - increasingly small chance of getting up to 7 more fruits from the table. + */ + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (owner.getAttribute("fruit-bat", 0) > GameWorld.getTicks()) { + return false; + } + + final boolean anyFruit = RandomFunction.random(10) <= 8; + final boolean goodFruit = RandomFunction.random(100) <= 2; + final int otherFruitAmount = (!goodFruit && RandomFunction.random(10) == 1) ? RandomFunction.random(0, 1) : RandomFunction.random(0, goodFruit ? 7 : 3); + + animate(new Animation(8320)); + graphics(new Graphics(1332, 200)); + animate(new Animation(8321), 3); // TODO - this animates the fruit bat with the splattering fruit animation, should do it for all falling fruits but Items are not Entities and therefore cannot animate + graphics(new Graphics(1331), 4); + owner.setAttribute("fruit-bat", GameWorld.getTicks() + 5); + lock(4); + GameWorld.getPulser().submit(new Pulse(4, this) { + @Override + public boolean pulse() { + if (anyFruit){ + class Pair { + public final int p1; + public final int p2; + Pair(int p1, int p2) { + this.p1 = p1; + this.p2 = p2; + } + } + List coords = new LinkedList<>(); + coords.add(new Pair(-1, -1)); + coords.add(new Pair(-1, 0)); + coords.add(new Pair(-1, 1)); + coords.add(new Pair(0, -1)); + coords.add(new Pair(0, 1)); + coords.add(new Pair(1, -1)); + coords.add(new Pair(1, 0)); + coords.add(new Pair(1, 1)); + Collections.shuffle(coords); + + Pair coord = coords.remove(0); + GroundItemManager.create(new Item(Items.PAPAYA_FRUIT_5972), + owner.getLocation().transform(coord.p1, coord.p2, 0), + owner); + + for (int i = 0; i < otherFruitAmount; i++) { + Item item = RandomFunction.rollWeightedChanceTable(FRUIT_FALL); + if (item.getId() != 0) { + coord = coords.remove(0); + GroundItemManager.create(item, + owner.getLocation().transform(coord.p1, coord.p2, 0), + owner); + } + } + } + return true; + } + }); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GeyserTitanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GeyserTitanNPC.java new file mode 100644 index 000000000..67683a0d9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GeyserTitanNPC.java @@ -0,0 +1,71 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the Geyser Titan familiar. + * @author Aero + */ +@Initializable +public class GeyserTitanNPC extends Familiar { + + /** + * Constructs a new {@code GeyserTitanNPC} {@code Object}. + */ + public GeyserTitanNPC() { + this(null, 7339); + } + + /** + * Constructs a new {@code GeyserTitanNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public GeyserTitanNPC(Player owner, int id) { + super(owner, id, 6900, 12786, 6, WeaponInterface.STYLE_RANGE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new GeyserTitanNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (!canCombatSpecial(special.getTarget())) { + return false; + } + Entity target = special.getTarget(); + visualize(new Animation(7883), new Graphics(1375, 315)); + int maxHit = 30; + int defBonus = 0; + for (int i = 5; i < 11; i++) { + defBonus += target.getProperties().getBonuses()[i]; + } + maxHit = defBonus / 40; + if (maxHit <= 1) { + maxHit = RandomFunction.random(0, 3); + } + if (maxHit > 30) { + maxHit = RandomFunction.random(20, 30); + } + Projectile.ranged(this, special.getTarget(), 1376, 300, 30, 0, 45).send(); + super.sendFamiliarHit(special.getTarget(), maxHit, Graphics.create(1377)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7339, 7340 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GiantChinchompaNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GiantChinchompaNPC.java new file mode 100644 index 000000000..2c0e527e2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GiantChinchompaNPC.java @@ -0,0 +1,87 @@ +package core.game.node.entity.npc.familiar; + +import java.util.List; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the Giant Chinchompa familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class GiantChinchompaNPC extends Familiar { + + /** + * Constructs a new {@code GiantChinchompaNPC} {@code Object}. + */ + public GiantChinchompaNPC() { + this(null, 7353); + } + + /** + * Constructs a new {@code GiantChinchompaNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public GiantChinchompaNPC(Player owner, int id) { + super(owner, id, 3100, 12800, 3, WeaponInterface.STYLE_RANGE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new GiantChinchompaNPC(owner, id); + } + + @Override + public void onAttack(Entity entity) { + super.onAttack(entity); + if (RandomFunction.random(20) == 10) { + executeSpecialMove(new FamiliarSpecial(null)); + } + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (!isOwnerAttackable()) { + return false; + } + final List entitys = RegionManager.getLocalEntitys(owner, 6); + entitys.remove(owner); + entitys.remove(this); + sendChat("Squeak!"); + animate(Animation.create(7758)); + graphics(Graphics.create(1364)); + GameWorld.getPulser().submit(new Pulse(3, owner, this) { + @Override + public boolean pulse() { + for (Entity entity : entitys) { + if (canCombatSpecial(entity, false)) { + entity.getImpactHandler().manualHit(GiantChinchompaNPC.this, RandomFunction.random(13), HitsplatType.NORMAL); + } + } + dismiss(); + return true; + } + }); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7353, 7354 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GiantEntNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GiantEntNPC.java new file mode 100644 index 000000000..3b7d6d376 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GiantEntNPC.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; + +/** + * Represents the Giant Ent familiar. + * @author Aero + */ +@Initializable +public class GiantEntNPC extends Familiar { + + /** + * Constructs a new {@code GiantEntNPC} {@code Object}. + */ + public GiantEntNPC() { + this(null, 6800); + } + + /** + * Constructs a new {@code GiantEntNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public GiantEntNPC(Player owner, int id) { + super(owner, id, 4900, 12013, 6, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public Familiar construct(Player owner, int id) { + return new GiantEntNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6800, 6801 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GraniteCrabNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GraniteCrabNPC.java new file mode 100644 index 000000000..d26a56499 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GraniteCrabNPC.java @@ -0,0 +1,81 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.fishing.Fish; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the Granite Crab familiar. + * @author Vexia + * @author Aero + */ +@Initializable +public class GraniteCrabNPC extends Forager { + + /** + * The fish item. + */ + private static final Item[] FISH = new Item[] { Fish.COD.getItem(), Fish.PIKE.getItem(), Fish.SEAWEED.getItem(), Fish.OYSTER.getItem() }; + + /** + * Constructs a new {@code GraniteCrabNPC} {@code Object}. + */ + public GraniteCrabNPC() { + this(null, 6796); + } + + /** + * Constructs a new {@code GraniteCrabNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public GraniteCrabNPC(Player owner, int id) { + super(owner, id, 1800, 12009, 12, WeaponInterface.STYLE_DEFENSIVE); + boosts.add(new SkillBonus(Skills.FISHING, 1)); + } + + @Override + public Familiar construct(Player owner, int id) { + return new GraniteCrabNPC(owner, id); + } + + @Override + public void handlePassiveAction() { + if (RandomFunction.random(4) == 1) { + final Item item = FISH[RandomFunction.random(FISH.length)]; + animate(Animation.create(8107)); + if (item.getId() == Fish.COD.getItem().getId() || item.getId() == Fish.PIKE.getItem().getId()) { + owner.getSkills().addExperience(Skills.FISHING, 5.5); + } + produceItem(item); + } + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + owner.getSkills().updateLevel(Skills.DEFENCE, 4); + visualize(Animation.create(8109), Graphics.create(1326)); + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(new Animation(7660), new Graphics(1296)); + } + + @Override + public int[] getIds() { + return new int[] { 6796, 6797 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GraniteLobsterNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GraniteLobsterNPC.java new file mode 100644 index 000000000..400cbf7c2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/GraniteLobsterNPC.java @@ -0,0 +1,81 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.fishing.Fish; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the Granite Lobster familiar. + * @author Aero + */ +@Initializable +public class GraniteLobsterNPC extends Forager { + + /** + * The fish. + */ + private static final Item[] FISH = new Item[] { new Item(383), new Item(377) }; + + /** + * Constructs a new {@code GraniteLobsterNPC} {@code Object}. + */ + public GraniteLobsterNPC() { + this(null, 6849); + } + + /** + * Constructs a new {@code GraniteLobsterNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public GraniteLobsterNPC(Player owner, int id) { + super(owner, id, 4700, 12069, 6); + boosts.add(new SkillBonus(Skills.FISHING, 4)); + } + + @Override + public Familiar construct(Player owner, int id) { + return new GraniteLobsterNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + Entity target = special.getTarget(); + if (!canCombatSpecial(target)) { + return false; + } + animate(new Animation(8118)); + graphics(Graphics.create(1351)); + Projectile.ranged(this, target, 1352, 60, 40, 1, 45).send(); + sendFamiliarHit(target, 14); + return true; + } + + @Override + public void handlePassiveAction() { + if (RandomFunction.random(4) == 1) { + final Item item = FISH[RandomFunction.random(FISH.length)]; + animate(Animation.create(8107)); + Fish fish = Fish.forItem(item); + owner.getSkills().addExperience(Skills.FISHING, fish.getExperience() * 0.10); + produceItem(item); + } + } + + @Override + public int[] getIds() { + return new int[] { 6849, 6850 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/HoneyBadgerNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/HoneyBadgerNPC.java new file mode 100644 index 000000000..061c45831 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/HoneyBadgerNPC.java @@ -0,0 +1,75 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Honey Badger familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class HoneyBadgerNPC extends Familiar { + + /** + * Constructs a new {@code HoneyBadgerNPC} {@code Object}. + */ + public HoneyBadgerNPC() { + this(null, 6845); + } + + /** + * Constructs a new {@code HoneyBadgerNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public HoneyBadgerNPC(Player owner, int id) { + super(owner, id, 2500, 12065, 4, WeaponInterface.STYLE_AGGRESSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new HoneyBadgerNPC(owner, id); + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(Animation.create(7660), Graphics.create(1399)); + } + + @Override + public String getText() { + return "Raaaar!"; + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (isCharged()) { + return false; + } + charge(); + visualize(new Animation(7928, Priority.HIGH), Graphics.create(1397)); + return true; + } + + @Override + public boolean isCharged() { + if (charged) { + owner.getPacketDispatch().sendMessage("Your honey badger is already enraged!"); + return true; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6845, 6846 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/HydraNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/HydraNPC.java new file mode 100644 index 000000000..347781dd5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/HydraNPC.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; + +/** + * Represents the Hydra familiar. + * @author Aero + */ +@Initializable +public class HydraNPC extends Familiar { + + /** + * Constructs a new {@code HydraNPC} {@code Object}. + */ + public HydraNPC() { + this(null, 6811); + } + + /** + * Constructs a new {@code HydraNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public HydraNPC(Player owner, int id) { + super(owner, id, 4900, 12025, 6, WeaponInterface.STYLE_RANGE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new HydraNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6811, 6812 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/IbisNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/IbisNPC.java new file mode 100644 index 000000000..b7f084ad3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/IbisNPC.java @@ -0,0 +1,98 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.fishing.Fish; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the Ibis familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class IbisNPC extends Forager { + + /** + * The randon fish during fish rain. + */ + private static final Fish[] FISH = new Fish[] { Fish.SHRIMP, Fish.BASS, Fish.COD, Fish.MACKEREL }; + + /** + * Constructs a new {@code IbisNPC} {@code Object}. + */ + public IbisNPC() { + this(null, 6991); + } + + /** + * Constructs a new {@code IbisNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public IbisNPC(Player owner, int id) { + super(owner, id, 3800, 12531, 12, new Item(361), new Item(373)); + boosts.add(new SkillBonus(Skills.FISHING, 3)); + } + + @Override + public void handlePassiveAction() { + if (RandomFunction.random(15) < 4) { + produceItem(); + } + } + + @Override + public boolean produceItem(Item item) { + if (super.produceItem(item)) { + if (item.getId() == 373) { + owner.getSkills().addExperience(Skills.FISHING, 10); + } + return true; + } + return false; + } + + @Override + public Familiar construct(Player owner, int id) { + return new IbisNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + animate(Animation.create(8201)); + GameWorld.getPulser().submit(new Pulse(3, owner, this) { + @Override + public boolean pulse() { + Location loc = null; + for (int i = 0; i < 2; i++) { + loc = owner.getLocation().transform(RandomFunction.random(2), RandomFunction.random(2), 0); + if (RegionManager.getObject(loc) != null) { + continue; + } + GroundItemManager.create(FISH[RandomFunction.random(FISH.length)].getItem(), loc, owner); + } + return true; + } + }); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6991 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/IceTitanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/IceTitanNPC.java new file mode 100644 index 000000000..72f1f9ece --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/IceTitanNPC.java @@ -0,0 +1,56 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Ice Titan familiar. + * @author Aero + */ +@Initializable +public class IceTitanNPC extends Familiar { + + /** + * Constructs a new {@code IceTitanNPC} {@code Object}. + */ + public IceTitanNPC() { + this(null, 7359); + } + + /** + * Constructs a new {@code IceTitanNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public IceTitanNPC(Player owner, int id) { + super(owner, id, 6400, 12806, 20, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new IceTitanNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + owner.getSkills().updateLevel(Skills.DEFENCE, (int) ((int) owner.getSkills().getStaticLevel(Skills.DEFENCE) * 0.12)); + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(new Animation(7660), new Graphics(1306)); + } + + @Override + public int[] getIds() { + return new int[] { 7359, 7360 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/IronTitanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/IronTitanNPC.java new file mode 100644 index 000000000..8c797fc2a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/IronTitanNPC.java @@ -0,0 +1,95 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the Iron Titan familiar. + * @author Aero + */ +@Initializable +public class IronTitanNPC extends Familiar { + + /** + * If the titan is using its special move. + */ + private boolean specialMove; + + /** + * The attacks. + */ + private static final SwitchAttack[] ATTACKS = { new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), Animation.create(8183)) }; + + /** + * Constructs a new {@code IronTitanNPC} {@code Object}. + */ + public IronTitanNPC() { + this(null, 7375); + } + /** + * Constructs a new {@code IronTitanNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public IronTitanNPC(Player owner, int id) { + super(owner, id, 6000, 12822, 12, WeaponInterface.STYLE_DEFENSIVE); + super.setCombatHandler(new MultiSwingHandler(true, ATTACKS) { + @Override + public int swing(Entity entity, Entity victim, BattleState s) { + int ticks = super.swing(entity, victim, s); + if (specialMove) { + BattleState[] states = new BattleState[3]; + for (int i = 1; i < 3; i++) { + BattleState state = states[i] = new BattleState(entity, victim); + int hit = 0; + if (isAccurateImpact(entity, victim)) { + int max = calculateHit(entity, victim, 1.0); + state.setMaximumHit(max); + hit = RandomFunction.random(max); + state.setEstimatedHit(hit); + } + state.setEstimatedHit(hit); + state.setStyle(getCurrent().getStyle()); + } + states[0] = s; + s.setTargets(states); + specialMove = false; + } + return ticks; + } + }); + } + + @Override + public Familiar construct(Player owner, int id) { + return new IronTitanNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (specialMove) { + owner.getPacketDispatch().sendMessage("Your familiar is already charging its attack."); + return false; + } + specialMove = true; + visualize(Animation.create(8183), Graphics.create(1450)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7375, 7376 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/KalphiteNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/KalphiteNPC.java new file mode 100644 index 000000000..a9c78c6d8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/KalphiteNPC.java @@ -0,0 +1,117 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.Metamorphosis; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles the kalphite princess pet. + * @author Empathy + * + */ +@Initializable +public class KalphiteNPC extends Metamorphosis { + + /** + * The kalphite ids. + */ + private static final int[] KALPHITE_IDS = new int[] { 8602, 8603 }; + + /** + * Constructs a new {@code KalphiteNPC} object. + */ + public KalphiteNPC() { + super(KALPHITE_IDS); + } + + + @Override + public DialoguePlugin getDialoguePlugin() { + return new KalphitePrincessDialogue(); + } + + /** + * Handles the KalphitePrincess dialogue. + * @author Empathy + * + */ + public final class KalphitePrincessDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code KalphitePrincessDialogue} {@code Object}. + */ + public KalphitePrincessDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code KalphitePrincessDialogue} {@code Object}. + * + * @param player the player. + */ + public KalphitePrincessDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new KalphitePrincessDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "What is it with your kind and potato cactus?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Truthfully?"); + stage = 1; + break; + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Yeah, please."); + stage = 2; + break; + case 2: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Soup. We make a fine soup with it."); + stage = 3; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Kalphites can cook?"); + stage = 4; + break; + case 4: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Nah, we just collect it and put it there because we", "know fools like yourself will come down looking for it", "then inevitably be killed by my mother."); + stage = 5; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Evidently not, that's how I got you!"); + stage = 6; + break; + case 6: + interpreter.sendDialogues(npc, FacialExpression.OLD_NORMAL, "Touch�."); + stage = 7; + break; + case 7: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 8602, 8603 }; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/KaramthulhuOverlordNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/KaramthulhuOverlordNPC.java new file mode 100644 index 000000000..c96f2eea4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/KaramthulhuOverlordNPC.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Karamthulhu Overlord familiar. + * @author Aero + */ +@Initializable +public class KaramthulhuOverlordNPC extends Familiar { + + /** + * Constructs a new {@code KaramthulhuOverlordNPC} {@code Object}. + */ + public KaramthulhuOverlordNPC() { + this(null, 6809); + } + + /** + * Constructs a new {@code KaramthulhuOverlordNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public KaramthulhuOverlordNPC(Player owner, int id) { + super(owner, id, 4400, 12023, 3, WeaponInterface.STYLE_RANGE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new KaramthulhuOverlordNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6809, 6810 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/LavaTitanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/LavaTitanNPC.java new file mode 100644 index 000000000..6faab4106 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/LavaTitanNPC.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Lava Titan familiar. + * @author Aero + */ +@Initializable +public class LavaTitanNPC extends Familiar { + + /** + * Constructs a new {@code LavaTitanNPC} {@code Object}. + */ + public LavaTitanNPC() { + this(null, 7341); + } + + /** + * Constructs a new {@code LavaTitanNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public LavaTitanNPC(Player owner, int id) { + super(owner, id, 6100, 12788, 4, WeaponInterface.STYLE_AGGRESSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new LavaTitanNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 7341, 7342 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MacawNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MacawNPC.java new file mode 100644 index 000000000..34650c008 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MacawNPC.java @@ -0,0 +1,178 @@ +package core.game.node.entity.npc.familiar; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.skill.summoning.familiar.RemoteViewer; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the Macaw familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class MacawNPC extends Forager { + + /** + * The herb items. + */ + private static final Item[] HERBS = new Item[] { new Item(249), new Item(251), new Item(253), new Item(255), new Item(257), new Item(2998), new Item(12172), new Item(259), new Item(261), new Item(263), new Item(3000), new Item(265), new Item(2481), new Item(267), new Item(269) }; + + /** + * The delay until the next special. + */ + private int specialDelay; + + /** + * Constructs a new {@code MacawNPC} {@code Object}. + */ + public MacawNPC() { + this(null, 6851); + } + + /** + * Constructs a new {@code MacawNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public MacawNPC(Player owner, int id) { + super(owner, id, 3100, 12071, 12, HERBS); + } + + @Override + public Familiar construct(Player owner, int id) { + return new MacawNPC(owner, id); + } + + @Override + public Plugin newInstance(Object object) throws Throwable { + PluginManager.definePlugin(new MacawDialogue()); + return super.newInstance(object); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (specialDelay > GameWorld.getTicks()) { + owner.getPacketDispatch().sendMessage("You must wait one minute until using the macaws special again."); + return false; + } + final Item herb = HERBS[RandomFunction.random(HERBS.length)]; + animate(Animation.create(8013)); + graphics(Graphics.create(1321), 2); + GameWorld.getPulser().submit(new Pulse(5, owner) { + @Override + public boolean pulse() { + GroundItemManager.create(herb, getLocation(), owner); + return true; + } + }); + specialDelay = GameWorld.getTicks() + 100; + return true; + } + + /** + * Handles the macaw dialogue. + * @author Vexia + */ + public final class MacawDialogue extends DialoguePlugin { + + /** + * The familiar. + */ + private Familiar familiar; + + /** + * Constructs a new {@code MacawDialogue} {@code Object}. + */ + public MacawDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MacawDialogue} {@code Object}. + * @param player the player. + */ + public MacawDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MacawDialogue(player); + } + + @Override + public boolean open(Object... args) { + familiar = (Familiar) args[0]; + options("Chat", "Remote view", "Withdraw"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + npc("Awh! Gimme the rum! Gimme the rum!"); + stage++; + break; + case 2: + end(); + RemoteViewer.openDialogue(player, familiar); + break; + case 3: + end(); + ((BurdenBeast) familiar).openInterface(); + break; + } + break; + case 1: + player(" I don't think you'll like the stuff. Besides, I think there", "is a law about feeding birds alcohol."); + stage++; + break; + case 2: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return MacawNPC.this.getIds(); + } + + } + + @Override + public Animation getViewAnimation() { + return Animation.create(8013); + } + + @Override + public int getRandom() { + return 40; + } + + @Override + public int[] getIds() { + return new int[] { 6851, 6852 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MagpieNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MagpieNPC.java new file mode 100644 index 000000000..4aed1733b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MagpieNPC.java @@ -0,0 +1,70 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.gem.Gems; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Magpie familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class MagpieNPC extends Forager { + + /** + * The items to forage. + */ + private static final Item[] ITEMS = new Item[] { Gems.SAPPHIRE.getUncut(), Gems.EMERALD.getUncut(), Gems.RUBY.getUncut(), Gems.DIAMOND.getUncut() }; + + /** + * Constructs a new {@code MagpieNPC} {@code Object}. + */ + public MagpieNPC() { + this(null, 6824); + } + + /** + * Constructs a new {@code MagpieNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public MagpieNPC(Player owner, int id) { + super(owner, id, 3400, 12041, 3, ITEMS); + } + + @Override + public Familiar construct(Player owner, int id) { + return new MagpieNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + visualize(Animation.create(8020), Graphics.create(1336)); + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.getSkills().updateLevel(Skills.THIEVING, 2); + owner.visualize(new Animation(7660), new Graphics(1296)); + } + + @Override + public int getRandom() { + return 14; + } + + @Override + public int[] getIds() { + return new int[] { 6824 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.java new file mode 100644 index 000000000..8fb9c1e10 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MinotaurFamiliarNPC.java @@ -0,0 +1,344 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * The plugin used to load the minotaur familiar npcs. + * @author Vexia + * @version 1.0 + */ +@Initializable +public final class MinotaurFamiliarNPC implements Plugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new BronzeMinotaurNPC()); + PluginManager.definePlugin(new IronMinotaurNPC()); + PluginManager.definePlugin(new SteelMinotaurNPC()); + PluginManager.definePlugin(new MithrilMinotaurNPC()); + PluginManager.definePlugin(new AdamantMinotaurNPC()); + PluginManager.definePlugin(new RuneMinotaurNPC()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Handles the bullrush special. + * @param familiar the familiar. + * @param special the special. + * @param maxHit the max hit. + */ + public boolean bullRush(final Familiar familiar, final FamiliarSpecial special, final int maxHit) { + final Entity target = (Entity) special.getNode(); + if (!familiar.canCombatSpecial(target)) { + return false; + } + familiar.sendFamiliarHit(target, RandomFunction.random(maxHit)); + Projectile.magic(familiar, target, 1497, 80, 36, 70, 10).send(); + familiar.visualize(Animation.create(8026), Graphics.create(1496)); + if (!(familiar instanceof BronzeMinotaurNPC && familiar instanceof RuneMinotaurNPC) && RandomFunction.random(10) < 6) { + final int ticks = 2 + (int) Math.floor(familiar.getLocation().getDistance(target.getLocation()) * 0.5); + GameWorld.getPulser().submit(new Pulse(ticks) { + @Override + public boolean pulse() { + target.getStateManager().set(EntityState.STUNNED, 4); + return true; + } + }); + } + return true; + } + + /** + * Represents the Bronze Minotaur familiar. + * @author Aero + */ + public class BronzeMinotaurNPC extends Familiar { + + /** + * Constructs a new {@code BronzeMinotaurNPC} {@code Object}. + */ + public BronzeMinotaurNPC() { + this(null, 6853); + } + + /** + * Constructs a new {@code BronzeMinotaurNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public BronzeMinotaurNPC(Player owner, int id) { + super(owner, id, 3000, 12073, 6, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new BronzeMinotaurNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return bullRush(this, special, 4); + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6853, 6854 }; + } + + } + + /** + * Represents the Iron Minotaur familiar. + * @author Aero + */ + public class IronMinotaurNPC extends Familiar { + + /** + * Constructs a new {@code IronMinotaurNPC} {@code Object}. + */ + public IronMinotaurNPC() { + this(null, 6855); + } + + /** + * Constructs a new {@code IronMinotaurNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public IronMinotaurNPC(Player owner, int id) { + super(owner, id, 3700, 12075, 6, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new IronMinotaurNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return bullRush(this, special, 6); + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6855, 6856 }; + } + + } + + /** + * Represents the Steel Minotaur familiar. + * @author Aero + */ + public class SteelMinotaurNPC extends Familiar { + + /** + * Constructs a new {@code SteelMinotaurNPC} {@code Object}. + */ + public SteelMinotaurNPC() { + this(null, 6857); + } + + /** + * Constructs a new {@code SteelMinotaurNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SteelMinotaurNPC(Player owner, int id) { + super(owner, id, 4600, 12077, 6, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SteelMinotaurNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return bullRush(this, special, 9); + } + + @Override + public CombatStyle getCombatStyle() { + return CombatStyle.MELEE; + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6857, 6858 }; + } + + } + + /** + * Represents the Mithril Minotaur familiar. + * @author Aero + */ + public class MithrilMinotaurNPC extends Familiar { + + /** + * Constructs a new {@code MithrilMinotaurNPC} {@code Object}. + */ + public MithrilMinotaurNPC() { + this(null, 6859); + } + + /** + * Constructs a new {@code MithrilMinotaurNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public MithrilMinotaurNPC(Player owner, int id) { + super(owner, id, 5500, 12079, 6, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new MithrilMinotaurNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return bullRush(this, special, 13); + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6859, 6860 }; + } + + } + + /** + * Represents the Adamant Minotaur familiar. + * @author Aero + */ + public class AdamantMinotaurNPC extends Familiar { + + /** + * Constructs a new {@code AdamantMinotaurNPC} {@code Object}. + */ + public AdamantMinotaurNPC() { + this(null, 6861); + } + + /** + * Constructs a new {@code AdamantMinotaurNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public AdamantMinotaurNPC(Player owner, int id) { + super(owner, id, 6600, 12081, 6, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new AdamantMinotaurNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return bullRush(this, special, 16); + } + + @Override + public CombatStyle getCombatStyle() { + return CombatStyle.MELEE; + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6861, 6862 }; + } + + } + + /** + * Represents the Rune Minotaur familiar. + * @author Aero + */ + public class RuneMinotaurNPC extends Familiar { + + /** + * Constructs a new {@code RuneMinotaurNPC} {@code Object}. + */ + public RuneMinotaurNPC() { + this(null, 6863); + } + + /** + * Constructs a new {@code RuneMinotaurNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public RuneMinotaurNPC(Player owner, int id) { + super(owner, id, 15100, 12083, 6, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new RuneMinotaurNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return bullRush(this, special, 20); + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6863, 6864 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MossTitanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MossTitanNPC.java new file mode 100644 index 000000000..cbab007e7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/MossTitanNPC.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Moss Titan familiar. + * @author Aero + */ +@Initializable +public class MossTitanNPC extends Familiar { + + /** + * Constructs a new {@code MossTitanNPC} {@code Object}. + */ + public MossTitanNPC() { + this(null, 7357); + } + + /** + * Constructs a new {@code MossTitanNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public MossTitanNPC(Player owner, int id) { + super(owner, id, 5800, 12804, 20, WeaponInterface.STYLE_AGGRESSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new MossTitanNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 7357, 7358 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ObsidianGolemNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ObsidianGolemNPC.java new file mode 100644 index 000000000..a5843e79f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ObsidianGolemNPC.java @@ -0,0 +1,58 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Obsidian Golem familiar. + * @author Aero + */ +@Initializable +public class ObsidianGolemNPC extends Familiar { + + /** + * Constructs a new {@code ObsidianGolemNPC} {@code Object}. + */ + public ObsidianGolemNPC() { + this(null, 7345); + } + + /** + * Constructs a new {@code ObsidianGolemNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public ObsidianGolemNPC(Player owner, int id) { + super(owner, id, 5500, 12792, 12, WeaponInterface.STYLE_AGGRESSIVE); + boosts.add(new SkillBonus(Skills.MINING, 7)); + } + + @Override + public Familiar construct(Player owner, int id) { + return new ObsidianGolemNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + graphics(Graphics.create(1465)); + owner.getSkills().updateLevel(Skills.STRENGTH, 9); + return true; + } + + @Override + public String getText() { + return "Onwards, to Glory!"; + } + + @Override + public int[] getIds() { + return new int[] { 7345, 7346 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/PackYakNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/PackYakNPC.java new file mode 100644 index 000000000..6f3014dd8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/PackYakNPC.java @@ -0,0 +1,84 @@ +package core.game.node.entity.npc.familiar; + +import core.game.system.config.ItemConfigParser; +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.SummoningScroll; +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Pack Yak familiar. + * @author Aero + */ +@Initializable +public class PackYakNPC extends BurdenBeast { + + /** + * Constructs a new {@code PackYakNPC} {@code Object}. + */ + public PackYakNPC() { + this(null, 6873); + } + + /** + * Constructs a new {@code PackYakNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public PackYakNPC(Player owner, int id) { + super(owner, id, 5800, 12093, 12, 30, WeaponInterface.STYLE_AGGRESSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new PackYakNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + Player player = owner; + Item item = new Item(special.getItem().getId(), 1); + if (item.getId() == SummoningScroll.WINTER_STORAGE_SCROLL.getItemId()) { + return false; + } + if (!item.getDefinition().getConfiguration(ItemConfigParser.BANKABLE, true)) { + player.sendMessage("A magical force prevents you from banking this item"); + return false; + } + Item remove = item; + if (!item.getDefinition().isUnnoted()) { + remove = new Item(item.getId(), 1); + item = new Item(item.getNoteChange(), 1); + } + if (player.getInventory().remove(remove) && player.getBank().add(item)) { + player.getDialogueInterpreter().close(); + graphics(Graphics.create(1358)); + player.getPacketDispatch().sendMessage("The pak yak has sent an item to your bank."); + } else { + player.getPacketDispatch().sendMessage("The pak yak can't send that item to your bank."); + } + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(Animation.create(7660), Graphics.create(1316)); + } + + @Override + public int[] getIds() { + return new int[] { 6873, 6874 }; + } + + @Override + protected String getText() { + return "Baroo!"; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/PrayingMantisNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/PrayingMantisNPC.java new file mode 100644 index 000000000..4b4b5d4ab --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/PrayingMantisNPC.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Praying Mantis familiar. + * @author Aero + */ +@Initializable +public class PrayingMantisNPC extends Familiar { + + /** + * Constructs a new {@code PrayingMantisNPC} {@code Object}. + */ + public PrayingMantisNPC() { + this(null, 6798); + } + + /** + * Constructs a new {@code PrayingMantisNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public PrayingMantisNPC(Player owner, int id) { + super(owner, id, 6900, 12011, 6, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new PrayingMantisNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6798, 6799 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/PyreLordNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/PyreLordNPC.java new file mode 100644 index 000000000..dab68306e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/PyreLordNPC.java @@ -0,0 +1,148 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting; +import core.game.node.entity.skill.firemaking.FireMakingPulse; +import core.game.node.entity.skill.firemaking.Log; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.game.world.update.flag.player.FaceLocationFlag; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the Pyrelord familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class PyreLordNPC extends Familiar { + + /** + * The animation of the pyre lord. + */ + private static final Animation FIREMAKE_ANIMATION = Animation.create(8085); + + /** + * Constructs a new {@code PyreLordNPC} {@code Object}. + */ + public PyreLordNPC() { + this(null, 7377); + } + + /** + * Constructs a new {@code PyreLordNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public PyreLordNPC(Player owner, int id) { + super(owner, id, 3200, 12816, 6, WeaponInterface.STYLE_AGGRESSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new PyreLordNPC(owner, id); + } + + @Override + public void configureFamiliar() { + PluginManager.definePlugin(new PyreLordFiremake()); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Item item = (Item) special.getNode(); + if (item.getId() != 2357) { + owner.getPacketDispatch().sendMessage("You can only use this special on gold bars."); + return false; + } + owner.lock(1); + animate(Animation.create(8081)); + owner.graphics(Graphics.create(1463)); + JewelleryCrafting.open(owner); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7377, 7378 }; + } + + /** + * Handles the use with event of a log on a pyrelord. + * @author Vexia + */ + public final class PyreLordFiremake extends UseWithHandler { + + /** + * Constructs a new {@code PyreLordFiremake} {@code Object}. + */ + public PyreLordFiremake() { + super(1511, 2862, 1521, 1519, 6333, 10810, 1517, 6332, 12581, 1515, 1513, 13567, 10329, 10328, 7406, 7405, 7404); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : getIds()) { + addHandler(id, NPC_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Log log = Log.forId(event.getUsedItem().getId()); + final Familiar familiar = (Familiar) event.getUsedWith(); + final int ticks = FIREMAKE_ANIMATION.getDefinition().getDurationTicks(); + if (!player.getFamiliarManager().isOwner(familiar)) { + return true; + } + if (RegionManager.getObject(familiar.getLocation()) != null || familiar.getZoneMonitor().isInZone("bank")) { + player.getPacketDispatch().sendMessage("You can't light a fire here."); + return false; + } + familiar.lock(ticks); + familiar.animate(FIREMAKE_ANIMATION); + if (player.getInventory().remove(event.getUsedItem())) { + final GroundItem ground = GroundItemManager.create(event.getUsedItem(), familiar.getLocation(), player); + GameWorld.getPulser().submit(new Pulse(ticks, player, familiar) { + @Override + public boolean pulse() { + if (!ground.isActive()) { + return true; + } + final GameObject object = new GameObject(log.getFireId(), familiar.getLocation()); + familiar.moveStep(); + GroundItemManager.destroy(ground); + player.getSkills().addExperience(Skills.FIREMAKING, log.getXp() + 10); + familiar.faceLocation(FaceLocationFlag.getFaceLocation(familiar, object)); + ObjectBuilder.add(object, log.getLife(), FireMakingPulse.getAsh(player, log, object)); + if (player.getViewport().getRegion().getId() == 10806) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 9); + } + return true; + } + }); + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/RavenousLocustNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/RavenousLocustNPC.java new file mode 100644 index 000000000..4446e06ec --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/RavenousLocustNPC.java @@ -0,0 +1,72 @@ +package core.game.node.entity.npc.familiar; + +import core.game.content.consumable.Consumable; +import core.game.content.consumable.Consumables; +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Ravenous Locust familiar. + * @author Aero + */ +@Initializable +public class RavenousLocustNPC extends Familiar { + + /** + * Constructs a new {@code RavenousLocustNPC} {@code Object}. + */ + public RavenousLocustNPC() { + this(null, 7372); + } + + /** + * Constructs a new {@code RavenousLocustNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public RavenousLocustNPC(Player owner, int id) { + super(owner, id, 2400, 12820, 12, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new RavenousLocustNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + Entity target = special.getTarget(); + if (!canCombatSpecial(target)) { + return false; + } + animate(getProperties().getAttackAnimation()); + graphics(Graphics.create(1346)); + target.graphics(Graphics.create(1347)); + if (target instanceof Player) { + Player p = target.asPlayer(); + for (Item item : p.getInventory().toArray()) { + if (item == null) { + continue; + } + Consumable consumable = Consumables.getConsumableById(item.getId()); + if (consumable != null) { + p.getInventory().remove(item); + break; + } + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7372, 7373 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SmokeDevilNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SmokeDevilNPC.java new file mode 100644 index 000000000..82fd4cc32 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SmokeDevilNPC.java @@ -0,0 +1,91 @@ +package core.game.node.entity.npc.familiar; + +import java.util.List; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the Smoke Devil familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class SmokeDevilNPC extends Familiar { + + /** + * Constructs a new {@code SmokeDevilNPC} {@code Object}. + */ + public SmokeDevilNPC() { + this(null, 6865); + } + + /** + * Constructs a new {@code SmokeDevilNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SmokeDevilNPC(Player owner, int id) { + super(owner, id, 4800, 12085, 6); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SmokeDevilNPC(owner, id); + } + + @Override + public void configureFamiliar() { + NPCDefinition.setOptionHandler("flames", new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Familiar familiar = (Familiar) node; + if (!player.getFamiliarManager().isOwner(familiar)) { + return true; + } + // TODO: + return true; + } + }); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (!isOwnerAttackable()) { + return false; + } + final List entitys = RegionManager.getLocalEntitys(this, 1); + entitys.remove(this); + entitys.remove(owner); + visualize(Animation.create(7820), Graphics.create(1375)); + for (Entity e : entitys) { + if (super.canCombatSpecial(e, false)) { + e.getImpactHandler().manualHit(this, RandomFunction.random(6), HitsplatType.NORMAL); + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6865, 6866 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SnakelingNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SnakelingNPC.java new file mode 100644 index 000000000..09650a274 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SnakelingNPC.java @@ -0,0 +1,114 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.Metamorphosis; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +/** + * Handles the metamorphosis of the zulrah pet. + * @author Empathy + * + */ +@Initializable +public class SnakelingNPC extends Metamorphosis { + + /** + * The snakeling ids. + */ + public static final int[] SNAKELING_IDS = new int[] { 8626, 8627, 8628 }; + + /** + * + * Constructs a new {@code SnakelingNPC} object. + */ + public SnakelingNPC() { + super(SNAKELING_IDS); + } + + @Override + public DialoguePlugin getDialoguePlugin() { + return new PetSnakelingDialogue(); + } + + /** + * Handles the pet snakeling dialogue. + * @author Empathy + * + */ + public final class PetSnakelingDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code PetSnakelingDialogue} {@code Object}. + */ + public PetSnakelingDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code PetSnakelingDialogue} {@code Object}. + * + * @param player the player. + */ + public PetSnakelingDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PetSnakelingDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + player("Hey little snake!"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc(FacialExpression.OLD_NORMAL, "Soon, Zulrah shall establish dominion over this plane."); + stage = 1; + break; + case 1: + player("Wanna play fetch?"); + stage = 2; + break; + case 2: + npc(FacialExpression.OLD_NORMAL, "Submit to the almighty Zulrah."); + stage = 3; + break; + case 3: + player("Walkies? Or slidies...?"); + stage = 4; + break; + case 4: + npc(FacialExpression.OLD_NORMAL, "Zulrah's wilderness as a God will soon be demonstrated."); + stage = 5; + break; + case 5: + player("I give up..."); + stage = 6; + break; + case 6: + end(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return SNAKELING_IDS; + } + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritCobraNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritCobraNPC.java new file mode 100644 index 000000000..f0e7bfb75 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritCobraNPC.java @@ -0,0 +1,114 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.node.item.Item; + +/** + * Represents the Spirit Cobra familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class SpiritCobraNPC extends Familiar { + + /** + * Constructs a new {@code SpiritCobraNPC} {@code Object}. + */ + public SpiritCobraNPC() { + this(null, 6802); + } + + /** + * Constructs a new {@code SpiritCobraNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritCobraNPC(Player owner, int id) { + super(owner, id, 5600, 12015, 3, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritCobraNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Item item = (Item) special.getNode(); + final Egg egg = Egg.forEgg(item); + if (egg == null) { + owner.getPacketDispatch().sendMessage("You can't use the special move on this item."); + return false; + } + owner.getInventory().replace(egg.getProduct(), item.getSlot()); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6802, 6803 }; + } + + /** + * Represents an incubated egg. + * @author Vexia + */ + public enum Egg { + COCKATRICE(new Item(1944), new Item(12109)), SARATRICE(new Item(10533), new Item(12113)), ZAMATRICE(new Item(10532), new Item(12115)), GUTHATRICE(new Item(10531), new Item(12111)), CORACATRICE(new Item(11964), new Item(12119)), PENGATRICE(new Item(12483), new Item(12117)), VULATRICE(new Item(11695), new Item(12121)); + + /** + * The egg item. + */ + private final Item egg; + + /** + * The product. + */ + private final Item product; + + /** + * Constructs a new {@code Egg} {@code Object}. + * @param egg the egg. + * @param product the product. + */ + private Egg(Item egg, Item product) { + this.egg = egg; + this.product = product; + } + + /** + * Gets the egg for the item. + * @param item the item. + * @return the egg. + */ + public static Egg forEgg(final Item item) { + for (Egg egg : values()) { + if (egg.getEgg().getId() == item.getId()) { + return egg; + } + } + return null; + } + + /** + * Gets the egg. + * @return The egg. + */ + public Item getEgg() { + return egg; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritDagannothNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritDagannothNPC.java new file mode 100644 index 000000000..13ff8d652 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritDagannothNPC.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Spirit Dagannoth familiar. + * @author Aero + */ +@Initializable +public class SpiritDagannothNPC extends Familiar { + + /** + * Constructs a new {@code SpiritDagannothNPC} {@code Object}. + */ + public SpiritDagannothNPC() { + this(null, 6804); + } + + /** + * Constructs a new {@code SpiritDagannothNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritDagannothNPC(Player owner, int id) { + super(owner, id, 5700, 12017, 6, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritDagannothNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6804, 6805 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritGraahkNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritGraahkNPC.java new file mode 100644 index 000000000..599996f1f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritGraahkNPC.java @@ -0,0 +1,51 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Spirit Graahk familiar. + * @author Aero + */ +@Initializable +public class SpiritGraahkNPC extends Familiar { + + /** + * Constructs a new {@code SpiritGraahkNPC} {@code Object}. + */ + public SpiritGraahkNPC() { + this(null, 7363); + } + + /** + * Constructs a new {@code SpiritGraahkNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritGraahkNPC(Player owner, int id) { + super(owner, id, 4900, 12810, 3, WeaponInterface.STYLE_AGGRESSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritGraahkNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (!super.isOwnerAttackable()) { + return false; + } + call(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7363, 7364 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritJellyNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritJellyNPC.java new file mode 100644 index 000000000..0ef6c9225 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritJellyNPC.java @@ -0,0 +1,60 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the Spirit Jelly familiar. + * @author Aero + */ +@Initializable +public class SpiritJellyNPC extends Familiar { + + /** + * Constructs a new {@code SpiritJellyNPC} {@code Object}. + */ + public SpiritJellyNPC() { + this(null, 6992); + } + + /** + * Constructs a new {@code SpiritJellyNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritJellyNPC(Player owner, int id) { + super(owner, id, 4300, 12027, 6, WeaponInterface.STYLE_AGGRESSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritJellyNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = (Entity) special.getNode(); + if (!canCombatSpecial(target)) { + return false; + } + faceTemporary(target, 2); + sendFamiliarHit(target, 13); + animate(Animation.create(8575)); + Projectile.magic(this, target, 1360, 40, 36, 51, 10).send(); + target.getSkills().updateLevel(Skills.ATTACK, -3, target.getSkills().getStaticLevel(Skills.ATTACK) - 3); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6992, 6993 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritKalphiteNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritKalphiteNPC.java new file mode 100644 index 000000000..dadf635f1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritKalphiteNPC.java @@ -0,0 +1,86 @@ +package core.game.node.entity.npc.familiar; + +import java.util.List; + +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Spirit Kalphite familiar. + * @author Vexia + * @author Aero + */ +@Initializable +public class SpiritKalphiteNPC extends BurdenBeast { + + /** + * Constructs a new {@code SpiritKalphiteNPC} {@code Object}. + */ + public SpiritKalphiteNPC() { + this(null, 6994); + } + + /** + * Constructs a new {@code SpiritKalphiteNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritKalphiteNPC(Player owner, int id) { + super(owner, id, 2200, 12063, 6, 6, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritKalphiteNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (!isOwnerAttackable()) { + return false; + } + final List entitys = RegionManager.getLocalEntitys(owner, 6); + visualize(Animation.create(8517), Graphics.create(1350)); + GameWorld.getPulser().submit(new Pulse(1, owner) { + @Override + public boolean pulse() { + int count = 0; + for (Entity entity : entitys) { + if (count > 5) { + return true; + } + if (!canCombatSpecial(entity)) { + continue; + } + Projectile.magic(SpiritKalphiteNPC.this, entity, 1349, 40, 36, 50, 5).send(); + sendFamiliarHit(entity, 20); + count++; + } + return true; + } + }); + return false; + } + + @Override + public String getText() { + return "Hsssss!"; + } + + @Override + public int[] getIds() { + return new int[] { 6994, 6995 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritKyattNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritKyattNPC.java new file mode 100644 index 000000000..897ea43ca --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritKyattNPC.java @@ -0,0 +1,51 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Spirit Kyatt familiar. + * @author Aero + */ +@Initializable +public class SpiritKyattNPC extends Familiar { + + /** + * Constructs a new {@code SpiritKyattNPC} {@code Object}. + */ + public SpiritKyattNPC() { + this(null, 7366); + } + + /** + * Constructs a new {@code SpiritKyattNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritKyattNPC(Player owner, int id) { + super(owner, id, 4900, 12812, 3, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritKyattNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (!super.isOwnerAttackable()) { + return false; + } + call(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7365, 7366 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.java new file mode 100644 index 000000000..acb630e72 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritLarupiaNPC.java @@ -0,0 +1,60 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Spirit Larupia familiar. + * @author Aero + */ +@Initializable +public class SpiritLarupiaNPC extends Familiar { + + /** + * Constructs a new {@code SpiritLarupiaNPC} {@code Object}. + */ + public SpiritLarupiaNPC() { + this(null, 7337); + } + + /** + * Constructs a new {@code SpiritLarupiaNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritLarupiaNPC(Player owner, int id) { + super(owner, id, 4900, 12784, 6, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritLarupiaNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = special.getTarget(); + if (!canCombatSpecial(target)) { + return false; + } + target.getSkills().updateLevel(Skills.STRENGTH, -1, target.getSkills().getStaticLevel(Skills.STRENGTH) - 1); + faceTemporary(target, 2); + projectile(target, 1371); + sendFamiliarHit(target, 10); + visualize(Animation.create(5229), Graphics.create(1370)); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7337, 7338 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritMosquitoNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritMosquitoNPC.java new file mode 100644 index 000000000..c343e137f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritMosquitoNPC.java @@ -0,0 +1,62 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Spirit Mosquito familiar. + * @author Vexia + * @author Aero + */ +@Initializable +public class SpiritMosquitoNPC extends Familiar { + + /** + * Constructs a new {@code SpiritMosquitoNPC} {@code Object}. + */ + public SpiritMosquitoNPC() { + this(null, 7331); + } + + /** + * Constructs a new {@code SpiritMosquitoNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritMosquitoNPC(Player owner, int id) { + super(owner, id, 1200, 12778, 3, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritMosquitoNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = (Entity) special.getNode(); + if (!canAttack(target)) { + return false; + } + visualize(Animation.create(8032), Graphics.create(1442)); + getProperties().getCombatPulse().attack(target); + return true; + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 7331, 7332 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritPengatriceNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritPengatriceNPC.java new file mode 100644 index 000000000..1f6a4694f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritPengatriceNPC.java @@ -0,0 +1,44 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.player.Player; + +/** + * Represents the Spirit Pengatrice familiar. + * @author Aero + */ +public class SpiritPengatriceNPC extends Familiar { + + /** + * Constructs a new {@code SpiritPengatriceNPC} {@code Object}. + */ + public SpiritPengatriceNPC() { + this(null, 6883); + } + + /** + * Constructs a new {@code SpiritPengatriceNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritPengatriceNPC(Player owner, int id) { + super(owner, id, 3600, 12103, 3); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritPengatriceNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6883, 6884 }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritScorpionNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritScorpionNPC.java new file mode 100644 index 000000000..7be64fac1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritScorpionNPC.java @@ -0,0 +1,76 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.equipment.Weapon; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Spirit Scorpion familiar. + * @author Vexia + * @author Aero + */ +@Initializable +public class SpiritScorpionNPC extends Familiar { + + /** + * Constructs a new {@code SpiritScorpionNPC} {@code Object}. + */ + public SpiritScorpionNPC() { + this(null, 6837); + } + + /** + * Constructs a new {@code SpiritScorpionNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritScorpionNPC(Player owner, int id) { + super(owner, id, 1700, 12055, 6, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritScorpionNPC(owner, id); + } + + @Override + public void adjustPlayerBattle(BattleState state) { + if (state.getStyle() == CombatStyle.RANGE) { + final Weapon weapon = state.getWeapon(); + if (isCharged() && new Item(weapon.getId() + 6).getName().startsWith(weapon.getName())) { + final Entity victim = state.getVictim(); + setCharged(false); + victim.getStateManager().register(EntityState.POISONED, false, 10, owner); + } + } + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (isCharged()) { + return false; + } + charge(); + owner.graphics(new Graphics(1355, 180), 2); + visualize(new Animation(6261), new Graphics(1354, 95)); + Projectile.create(this, owner, 1355, 95, 50, 50, 10).send(); + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6837, 6838 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritSpiderNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritSpiderNPC.java new file mode 100644 index 000000000..65b8f386b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritSpiderNPC.java @@ -0,0 +1,107 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +/** + * Represents the Spirit Spider familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class SpiritSpiderNPC extends Familiar { + + /** + * The red spider egg item. + */ + private static final Item EGG = new Item(223); + + /** + * The delay until the next chance of random eggs. + */ + private int eggDelay = GameWorld.getTicks() + 500; + + /** + * Constructs a new {@code SpiritSpiderNPC} {@code Object}. + */ + public SpiritSpiderNPC() { + this(null, 6841); + } + + /** + * Constructs a new {@code SpiritSpiderNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritSpiderNPC(Player owner, int id) { + super(owner, id, 1500, 12059, 6, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public void handleFamiliarTick() { + super.handleFamiliarTick(); + if (eggDelay < GameWorld.getTicks()) { + if (RandomFunction.random(25) == 5) { + createEggs(); + sendChat("Clicketyclack"); + eggDelay = GameWorld.getTicks() + 500; + } + } + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritSpiderNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + createEggs(); + return true; + } + + /** + * Creates red spider eggs. + */ + private void createEggs() { + final int amount = RandomFunction.random(8); + Location location = null; + for (int i = 0; i < amount; i++) { + location = getEggLocation(); + if (location == null) { + continue; + } + owner.getPacketDispatch().sendPositionedGraphic(1342, 0, 0, location); + GroundItemManager.create(EGG, location, owner); + } + animate(Animation.create(5328)); + } + + /** + * Gets the egg location. + * @return the location. + */ + private Location getEggLocation() { + Location loc = owner.getLocation().transform(RandomFunction.random(2) == 1 ? -RandomFunction.random(2) : RandomFunction.random(2), RandomFunction.random(2) == 1 ? -RandomFunction.random(2) : RandomFunction.random(2), 0); + if (loc.equals(owner.getLocation()) || !RegionManager.isTeleportPermitted(loc) || RegionManager.getObject(loc) != null) { + return null; + } + return loc; + } + + @Override + public int[] getIds() { + return new int[] { 6841, 6842 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritTerrorbirdNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritTerrorbirdNPC.java new file mode 100644 index 000000000..b02ccdedc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritTerrorbirdNPC.java @@ -0,0 +1,60 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Spirit Terrorbird familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class SpiritTerrorbirdNPC extends BurdenBeast { + + /** + * Constructs a new {@code SpiritTerrorbirdNPC} {@code Object}. + */ + public SpiritTerrorbirdNPC() { + this(null, 6794); + } + + /** + * Constructs a new {@code SpiritTerrorbirdNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritTerrorbirdNPC(Player owner, int id) { + super(owner, id, 3600, 12007, 8, 12, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritTerrorbirdNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + visualize(Animation.create(1009), Graphics.create(1521)); + owner.getSkills().updateLevel(Skills.AGILITY, 2); + owner.getSettings().updateRunEnergy(-owner.getSkills().getStaticLevel(Skills.AGILITY) / 2); + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(new Animation(7660), new Graphics(1295)); + } + + @Override + public int[] getIds() { + return new int[] { 6794, 6795 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritTzKihNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritTzKihNPC.java new file mode 100644 index 000000000..46cf83d2b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritTzKihNPC.java @@ -0,0 +1,77 @@ +package core.game.node.entity.npc.familiar; + +import java.util.List; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Spirit Tz-Kih familiar. + * @author Vexia + * @author Aero + */ +@Initializable +public class SpiritTzKihNPC extends Familiar { + + /** + * Constructs a new {@code SpiritTzKihNPC} {@code Object}. + */ + public SpiritTzKihNPC() { + this(null, 7361); + } + + /** + * Constructs a new {@code SpiritTzKihNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SpiritTzKihNPC(Player owner, int id) { + super(owner, id, 1800, 12808, 6, WeaponInterface.STYLE_CAST); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritTzKihNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final List entitys = RegionManager.getLocalEntitys(owner, 8); + if (entitys.size() == 0) { + return false; + } + boolean success = false; + Entity target = null; + for (int i = 0; i < 2; i++) { + if (entitys.size() >= i) { + target = entitys.get(i); + if (target == null || target == this || target == owner) { + continue; + } + if (!canCombatSpecial(target)) { + continue; + } + success = true; + sendFamiliarHit(target, 7, Graphics.create(1329)); + } + } + if (success) { + animate(Animation.create(8257)); + return true; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 7361, 7362 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritWolfNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritWolfNPC.java new file mode 100644 index 000000000..e5bf3c153 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SpiritWolfNPC.java @@ -0,0 +1,140 @@ +package core.game.node.entity.npc.familiar; + +import core.game.content.activity.CutscenePlugin; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles the Spirit wolf familiar. + * @author Emperor + */ +@Initializable +public final class SpiritWolfNPC extends Familiar { + + /** + * Represents the cutscene during wolf whistle. + */ + private CutscenePlugin cutscene; + + /** + * Constructs a new {@code SpiritWolfNPC} {@code Object}. + */ + public SpiritWolfNPC() { + this(null, 6829); + } + + /** + * Constructs a new {@code SpiritWolfNPC} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + */ + public SpiritWolfNPC(Player owner, int id) { + super(owner, id, 600, 12047, 3, WeaponInterface.STYLE_ACCURATE); + if (owner != null) { + cutscene = (CutscenePlugin) owner.getAttribute("in-cutscene", null); + } + } + + @Override + public Familiar construct(Player owner, int id) { + return new SpiritWolfNPC(owner, id); + } + + @Override + public void init() { + super.init(); + if (cutscene != null) { + getProperties().setTeleportLocation(cutscene.getBase().transform(44, 52, 1)); + faceLocation(cutscene.getBase().transform(42, 53, 1)); + } + } + + @Override + public void startFollowing() { + if (cutscene != null) { + return; + } + super.startFollowing(); + } + + @Override + public boolean call() { + if (cutscene != null) { + return true; + } + return super.call(); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (!(special.getNode() instanceof NPC)) { + owner.getPacketDispatch().sendMessage("You can only target monsters with this special move."); + return false; + } + final NPC npc = (NPC) special.getNode(); + if (npc.getWalkRadius() > 20) { // Usually indicates special NPC. + owner.getPacketDispatch().sendMessage("This monster won't get intimidated by your familiar."); + return false; + } + if (cutscene != null) { + if (npc.getId() != 6990) { + owner.getPacketDispatch().sendMessage("You can't do this right now."); + return false; + } + DialoguePlugin dial = owner.getAttribute("wolf-dial", null); + if (dial != null) { + dial.handle(0, 0); + } else { + cutscene.stop(true); + } + return false; + } + if (!canAttack(npc)) { + return false; + } + visualizeSpecialMove(); + owner.getAudioManager().send(4265); + faceTemporary(npc, owner, 2); + super.visualize(Animation.create(8293), new Graphics(1334, 96)); + Projectile.magic(this, npc, 1333, 40, 36, 50, 5).send(); + GameWorld.getPulser().submit(new Pulse(2, this, npc) { + @Override + public boolean pulse() { + npc.faceTemporary(SpiritWolfNPC.this, 2); + Location destination = npc.getLocation().transform(Direction.getLogicalDirection(location, npc.getLocation()), 3); + Path path = Pathfinder.find(npc, destination); + path.walk(npc); + return true; + } + }); + return true; + } + + @Override + public Location getSpawnLocation() { + if (cutscene != null) { + return cutscene.getBase().transform(44, 52, 1); + } + return super.getSpawnLocation(); + } + + @Override + public int[] getIds() { + return new int[] { 6829, 6830 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SteelTitanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SteelTitanNPC.java new file mode 100644 index 000000000..82b330b56 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SteelTitanNPC.java @@ -0,0 +1,96 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Steel titan familiar. + * @author Emperor + */ +@Initializable +public final class SteelTitanNPC extends Familiar { + + /** + * If the titan is using its special move. + */ + private boolean specialMove; + + /** + * The attacks. + */ + private static final SwitchAttack[] ATTACKS = { new SwitchAttack(CombatStyle.RANGE.getSwingHandler(), Animation.create(8190), null, null, Projectile.create(null, null, 1445, 60, 36, 41, 46)), new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), Animation.create(8190), null, null, Projectile.create(null, null, 1445, 60, 36, 41, 46)), new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), Animation.create(8183)) }; + + /** + * Constructs a new {@code SteelTitanNPC} {@code Object}. + */ + public SteelTitanNPC() { + this(null, 7343); + } + + /** + * Constructs a new {@code SteelTitanNPC} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + */ + public SteelTitanNPC(Player owner, int id) { + super(owner, id, 6400, 12790, 12, WeaponInterface.STYLE_RANGE_ACCURATE); + super.setCombatHandler(new MultiSwingHandler(true, ATTACKS) { + @Override + public int swing(Entity entity, Entity victim, BattleState s) { + int ticks = super.swing(entity, victim, s); + if (specialMove) { + BattleState[] states = new BattleState[4]; + for (int i = 1; i < 4; i++) { + BattleState state = states[i] = new BattleState(entity, victim); + int hit = 0; + if (isAccurateImpact(entity, victim)) { + int max = calculateHit(entity, victim, 1.0); + state.setMaximumHit(max); + hit = RandomFunction.random(max); + } + state.setEstimatedHit(hit); + state.setStyle(getCurrent().getStyle()); + } + states[0] = s; + s.setTargets(states); + specialMove = false; + } + return ticks; + } + }); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SteelTitanNPC(owner, id); + } + + @Override + public int[] getIds() { + return new int[] { 7343, 7344 }; + } + + @Override + public boolean specialMove(FamiliarSpecial special) { + if (specialMove) { + owner.getPacketDispatch().sendMessage("Your familiar is already charging its attack."); + return false; + } + specialMove = true; + visualize(Animation.create(8183), Graphics.create(1449)); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/StrangerPlantNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/StrangerPlantNPC.java new file mode 100644 index 000000000..2b42e809b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/StrangerPlantNPC.java @@ -0,0 +1,65 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the Stranger Plant familiar. + * @author Aero + */ +@Initializable +public class StrangerPlantNPC extends Forager { + + /** + * Constructs a new {@code StrangerPlantNPC} {@code Object}. + */ + public StrangerPlantNPC() { + this(null, 6827); + } + + /** + * Constructs a new {@code StrangerPlantNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public StrangerPlantNPC(Player owner, int id) { + super(owner, id, 4900, 12045, 6, new Item(464)); + } + + @Override + public Familiar construct(Player owner, int id) { + return new StrangerPlantNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + if (!canCombatSpecial(special.getTarget())) { + return false; + } + Entity target = special.getTarget(); + if (RandomFunction.random(2) == 1) { + target.getStateManager().register(EntityState.POISONED, false, 40, target); + } + animate(Animation.create(8211)); + Projectile.ranged(this, target, 1508, 50, 40, 1, 45).send(); + target.graphics(Graphics.create(1511)); + sendFamiliarHit(target, 2); + return false; + } + + @Override + public int[] getIds() { + return new int[] { 6827, 6828 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SwampTitanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SwampTitanNPC.java new file mode 100644 index 000000000..db07d71e2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/SwampTitanNPC.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; + +/** + * Represents the Swamp Titan familiar. + * @author Aero + */ +@Initializable +public class SwampTitanNPC extends Familiar { + + /** + * Constructs a new {@code SwampTitanNPC} {@code Object}. + */ + public SwampTitanNPC() { + this(null, 7329); + } + + /** + * Constructs a new {@code SwampTitanNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public SwampTitanNPC(Player owner, int id) { + super(owner, id, 5600, 12776, 6, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new SwampTitanNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 7329, 7330 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/TalonBeastNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/TalonBeastNPC.java new file mode 100644 index 000000000..5d1f8cd16 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/TalonBeastNPC.java @@ -0,0 +1,47 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.plugin.Initializable; +import core.game.node.entity.player.Player; + +/** + * Represents the Talon Beast familiar. + * @author Aero + */ +@Initializable +public class TalonBeastNPC extends Familiar { + + /** + * Constructs a new {@code TalonBeastNPC} {@code Object}. + */ + public TalonBeastNPC() { + this(null, 7347); + } + + /** + * Constructs a new {@code TalonBeastNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public TalonBeastNPC(Player owner, int id) { + super(owner, id, 4900, 12794, 6, WeaponInterface.STYLE_AGGRESSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new TalonBeastNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public int[] getIds() { + return new int[] { 7347, 7348 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ThornySnailNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ThornySnailNPC.java new file mode 100644 index 000000000..61311e2f2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/ThornySnailNPC.java @@ -0,0 +1,87 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Represents the Thorny Snail familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class ThornySnailNPC extends BurdenBeast { + + /** + * Constructs a new {@code ThornySnailNPC} {@code Object}. + */ + public ThornySnailNPC() { + this(null, 6806); + } + + /** + * Constructs a new {@code ThornySnailNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public ThornySnailNPC(Player owner, int id) { + super(owner, id, 1600, 12019, 3, 3); + } + + @Override + public Familiar construct(Player owner, int id) { + return new ThornySnailNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = (Entity) special.getNode(); + if (!canCombatSpecial(target)) { + return false; + } + visualizeSpecialMove(); + visualize(new Animation(8148, Priority.HIGH), Graphics.create(1385)); + Projectile.magic(this, target, 1386, 40, 36, 51, 10).send(); + int ticks = 2 + (int) Math.floor(getLocation().getDistance(target.getLocation()) * 0.5); + getProperties().getCombatPulse().setNextAttack(4); + faceTemporary(target, 2); + GameWorld.getPulser().submit(new Pulse(ticks, this, target) { + @Override + public boolean pulse() { + BattleState state = new BattleState(ThornySnailNPC.this, target); + int hit = 0; + if (CombatStyle.MAGIC.getSwingHandler().isAccurateImpact(ThornySnailNPC.this, target)) { + hit = RandomFunction.randomize(8); + } + state.setEstimatedHit(hit); + target.getImpactHandler().handleImpact(owner, hit, CombatStyle.MAGIC, state); + target.graphics(new Graphics(1387)); + return true; + } + }); + return true; + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { 6806, 6807 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/UnicornStallionNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/UnicornStallionNPC.java new file mode 100644 index 000000000..7243d8f36 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/UnicornStallionNPC.java @@ -0,0 +1,102 @@ +package core.game.node.entity.npc.familiar; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the Unicorn Stallion familiar. + * @author Aero + */ +@Initializable +public class UnicornStallionNPC extends Familiar { + + /** + * Constructs a new {@code UnicornStallion} {@code Object}. + */ + public UnicornStallionNPC() { + this(null, 6822); + } + + /** + * Constructs a new {@code UnicornStallion} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public UnicornStallionNPC(Player owner, int id) { + super(owner, id, 5400, 12039, 20, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public Familiar construct(Player owner, int id) { + return new UnicornStallionNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + Player player = (Player) special.getNode(); + player.getAudioManager().send(4372); + visualize(Animation.create(8267), Graphics.create(1356)); + player.getSettings().updateRunEnergy(player.getSettings().getRunEnergy() * 0.10); + player.getSkills().heal((int) (player.getSkills().getMaximumLifepoints() * 0.15)); + return true; + } + + @Override + protected void configureFamiliar() { + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(6822).getHandlers().put("option:cure", this); + NPCDefinition.forId(6823).getHandlers().put("option:cure", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Familiar familiar = (Familiar) node; + if (!player.getFamiliarManager().isOwner(familiar)) { + return true; + } + Player owner = player; + if (owner.getSkills().getLevel(Skills.MAGIC) < 2) { + player.sendMessage("You don't have enough summoning points left"); + return true; + } + if (!owner.getStateManager().hasState(EntityState.POISONED)) { + player.sendMessage("You are not poisoned."); + return true; + } + player.getAudioManager().send(4372); + familiar.visualize(Animation.create(8267), Graphics.create(1356)); + player.getStateManager().remove(EntityState.POISONED); + player.getSkills().updateLevel(Skills.SUMMONING, -2, 0); + return true; + } + + }); + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(Animation.create(7660), Graphics.create(1298)); + } + + @Override + public int[] getIds() { + return new int[] { 6822, 6823 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/VampireBatNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/VampireBatNPC.java new file mode 100644 index 000000000..e29eabcdc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/VampireBatNPC.java @@ -0,0 +1,63 @@ +package core.game.node.entity.npc.familiar; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the Vampire Bat familiar. + * @author Aero + * @author Vexia + */ +@Initializable +public class VampireBatNPC extends Familiar { + + /** + * Constructs a new {@code VampireBatNPC} {@code Object}. + */ + public VampireBatNPC() { + this(null, 6835); + } + + /** + * Constructs a new {@code VampireBatNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public VampireBatNPC(Player owner, int id) { + super(owner, id, 3300, 12053, 4, WeaponInterface.STYLE_CONTROLLED); + } + + @Override + public Familiar construct(Player owner, int id) { + return new VampireBatNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + final Entity target = (Entity) special.getNode(); + if (!canCombatSpecial(target)) { + return false; + } else { + if (RandomFunction.random(10) < 4) { + owner.getSkills().heal(2); + } + visualize(Animation.create(8275), Graphics.create(1323)); + target.getImpactHandler().manualHit(this, RandomFunction.random(12), HitsplatType.NORMAL); + return true; + } + } + + @Override + public int[] getIds() { + return new int[] { 6835, 6836 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/VetionNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/VetionNPC.java new file mode 100644 index 000000000..e02446283 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/VetionNPC.java @@ -0,0 +1,33 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.Metamorphosis; + +/** + * Handles the metamorphosis of Vet'ion Jr. + * @author Empathy + * + */ +@Initializable +public class VetionNPC extends Metamorphosis { + + /** + * The Vet'ion Ids. + */ + public static final int[] VETION_IDS = new int[] { 8600, 8654 }; + + /** + * + * Constructs a new{@code VetionNPC} object. + */ + public VetionNPC() { + super(VETION_IDS); + } + + @Override + public DialoguePlugin getDialoguePlugin() { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java new file mode 100644 index 000000000..abfd09a63 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/VoidFamiliarNPC.java @@ -0,0 +1,286 @@ +package core.game.node.entity.npc.familiar; + +import core.cache.def.impl.NPCDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * The plugin used to load void familiar npcs. + * @author Vexia + * @version 1.0 + */ +@Initializable +public final class VoidFamiliarNPC implements Plugin { + + /** + * The foraging items. + */ + private static final Item[] ITEMS = new Item[] { new Item(434), new Item(440), new Item(453), new Item(444), new Item(447) }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new VoidRavagerNPC()); + PluginManager.definePlugin(new VoidShifterNPC()); + PluginManager.definePlugin(new VoidSpinnerNPC()); + PluginManager.definePlugin(new VoidTorcherNPC()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Handles the call to arms scroll. + * @param special the special. + * @return {@code True} if so. + */ + public boolean callToArms(Familiar familiar, FamiliarSpecial special) { + final Player owner = familiar.getOwner(); + owner.lock(); + GameWorld.getPulser().submit(new Pulse(1, owner) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + owner.visualize(Animation.create(8136), Graphics.create(1503)); + break; + case 3: + owner.unlock(); + owner.getProperties().setTeleportLocation(Location.create(2659, 2658, 0)); + owner.visualize(Animation.create(8137), Graphics.create(1502)); + return true; + } + return false; + } + }); + return true; + } + + /** + * Represents the Void Ravager familiar. + * @author Vexia + * @author Aero + */ + public final class VoidRavagerNPC extends Forager { + + /** + * Constructs a new {@code VoidRavagerNPC} {@code Object}. + */ + public VoidRavagerNPC() { + this(null, 7370); + } + + /** + * Constructs a new {@code VoidRavagerNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public VoidRavagerNPC(Player owner, int id) { + super(owner, id, 2700, 12818, 3, WeaponInterface.STYLE_AGGRESSIVE, ITEMS); + } + + @Override + public Familiar construct(Player owner, int id) { + return new VoidRavagerNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return callToArms(this, special); + } + + @Override + public int[] getIds() { + return new int[] { 7370, 7371 }; + } + + } + + /** + * Represents the Void Shifter familiar. + * @author Aero + */ + public class VoidShifterNPC extends Familiar { + + /** + * Constructs a new {@code VoidShifterNPC} {@code Object}. + */ + public VoidShifterNPC() { + this(null, 7367); + } + + /** + * Constructs a new {@code VoidShifterNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public VoidShifterNPC(Player owner, int id) { + super(owner, id, 9400, 12814, 3, WeaponInterface.STYLE_ACCURATE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new VoidShifterNPC(owner, id); + } + + @Override + public void adjustPlayerBattle(BattleState state) { + super.adjustPlayerBattle(state); + int percentage = (int) (owner.getSkills().getStaticLevel(Skills.HITPOINTS) * 0.10); + if (owner.getSkills().getLifepoints() < percentage) { + owner.getProperties().setTeleportLocation(Location.create(2659, 2658, 0)); + } + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return callToArms(this, special); + } + + @Override + public int[] getIds() { + return new int[] { 7367, 7368 }; + } + + } + + /** + * Represents the Void Spinner familiar. + * @author Aero + * @author Vexia + */ + public class VoidSpinnerNPC extends Familiar { + + /** + * The delay till the next heal. + */ + private int healDelay; + + /** + * Constructs a new {@code VoidSpinnerNPC} {@code Object}. + */ + public VoidSpinnerNPC() { + this(null, 7333); + } + + /** + * Constructs a new {@code VoidSpinnerNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public VoidSpinnerNPC(Player owner, int id) { + super(owner, id, 2700, 12780, 3, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public void handleFamiliarTick() { + super.handleFamiliarTick(); + if (healDelay < GameWorld.getTicks()) { + getSkills().heal(1); + healDelay = GameWorld.getTicks() + 25; + } + } + + @Override + public Familiar construct(Player owner, int id) { + return new VoidSpinnerNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return callToArms(this, special); + } + + @Override + public int[] getIds() { + return new int[] { 7333, 7334 }; + } + + } + + /** + * Represents the Void Torcher familiar. + * @author Aero + * @author Vexia + * @note TODO: the "Strike" attack. + */ + public class VoidTorcherNPC extends Familiar { + + /** + * Constructs a new {@code VoidTorcherNPC} {@code Object}. + */ + public VoidTorcherNPC() { + this(null, 7351); + } + + /** + * Constructs a new {@code VoidTorcherNPC} {@code Object}. + * @param owner The owner. + * @param id The id. + */ + public VoidTorcherNPC(Player owner, int id) { + super(owner, id, 9400, 12798, 3, WeaponInterface.STYLE_CAST); + } + + @Override + public Familiar construct(Player owner, int id) { + return new VoidTorcherNPC(owner, id); + } + + @Override + public void configureFamiliar() { + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : getIds()) { + NPCDefinition.forId(i).getHandlers().put("option:strike", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Familiar familiar = (Familiar) node; + if (!player.getFamiliarManager().isOwner(familiar)) { + return true; + } + // TODO: + return true; + } + + }); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return callToArms(this, special); + } + + @Override + public int[] getIds() { + return new int[] { 7351, 7352 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/WarTortoiseNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/WarTortoiseNPC.java new file mode 100644 index 000000000..661dd8493 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/WarTortoiseNPC.java @@ -0,0 +1,58 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the War tortoise familiar. + * @author Emperor + */ +@Initializable +public final class WarTortoiseNPC extends BurdenBeast { + + /** + * Constructs a new {@code WarTortoiseNPC} {@code Object}. + */ + public WarTortoiseNPC() { + this(null, 6815); + } + + /** + * Constructs a new {@code WarTortoiseNPC} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + */ + public WarTortoiseNPC(Player owner, int id) { + super(owner, id, 4300, 12031, 20, 18, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public Familiar construct(Player owner, int id) { + return new WarTortoiseNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + owner.getSkills().updateLevel(Skills.DEFENCE, 9, owner.getSkills().getStaticLevel(Skills.DEFENCE) + 9); + visualize(Animation.create(8288), Graphics.create(1414)); + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(Animation.create(7660), Graphics.create(1310)); + } + + @Override + public int[] getIds() { + return new int[] { 6815, 6816 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/familiar/WolpertingerNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/WolpertingerNPC.java new file mode 100644 index 000000000..4bee97387 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/familiar/WolpertingerNPC.java @@ -0,0 +1,57 @@ +package core.game.node.entity.npc.familiar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents the Wolpertinger familiar. + * @author Aero + */ +@Initializable +public class WolpertingerNPC extends Familiar { + + /** + * Constructs a new {@code WolpertingerNPC} {@code Object}. + */ + public WolpertingerNPC() { + this(null, 6869); + } + + /** + * Constructs a new {@code WolpertingerNPC} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + */ + public WolpertingerNPC(Player owner, int id) { + super(owner, id, 6200, 12089, 1, WeaponInterface.STYLE_CAST); + } + + @Override + public Familiar construct(Player owner, int id) { + return new WolpertingerNPC(owner, id); + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + owner.getSkills().updateLevel(Skills.MAGIC, 7, (owner.getSkills().getStaticLevel(Skills.MAGIC) + 7)); + visualize(Animation.create(8267), Graphics.create(1464)); + return true; + } + + @Override + public void visualizeSpecialMove() { + owner.visualize(Animation.create(7660), Graphics.create(1306)); + } + + @Override + public int[] getIds() { + return new int[] { 6869, 6870 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/AlKharidWarriorPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/npc/other/AlKharidWarriorPlugin.kt new file mode 100644 index 000000000..af0a09fda --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/AlKharidWarriorPlugin.kt @@ -0,0 +1,84 @@ +package core.game.node.entity.npc.other + +import core.cache.def.impl.NPCDefinition +import core.plugin.Initializable +import core.game.node.entity.npc.AbstractNPC +import core.plugin.Plugin +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.Entity +import core.game.node.entity.player.Player +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.plugin.PluginManager + +/** + * Handles the Al-Kharid Warrior + * @author Ceikry + */ +@Initializable +class AlKharidWarriorNPC : AbstractNPC { + var target: Player? = null + + //Constructor spaghetti because Arios I guess + constructor() : super(18, null, true) {} + private constructor(id: Int, location: Location) : super(id, location) {} + override fun construct(id: Int, location: Location, vararg objects: Any): AbstractNPC { + return AlKharidWarriorNPC(id, location) + } + + override fun newInstance(arg: Any?): Plugin { + PluginManager.definePlugin(WarriorOptionPlugin()) + return super.newInstance(arg) + } + + //Maintains target combat (resolves issue where they would just give up/walk away) + override fun tick() { + if(target != null && !inCombat() && skills.lifepoints > 0){ + attack(target) + } + super.tick() + } + + //Clear target on death + override fun finalizeDeath(killer: Entity?) { + super.finalizeDeath(killer) + target = null + } + + override fun getIds(): IntArray { + return ID + } + + inner class WarriorOptionPlugin : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + for (id in ID) { + NPCDefinition.forId(id).handlers["option:attack"] = this + } + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + RegionManager.getLocalNpcs(player,6).forEach{ + if(it.id == 18 && it != node.asNpc() && !it.properties.combatPulse.isAttacking){ + it.sendChat("Brother, I shall help thee with this infidel!") + (it as AlKharidWarriorNPC).target = player + it.attack(player) + } + } + player.attack(node.asNpc()) + return true + } + + override fun isWalk(): Boolean { + return false + } + } + + companion object { + /** + * The NPC ids of NPCs using this plugin. + */ + private val ID = intArrayOf(18) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/AntonNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/AntonNPC.java new file mode 100644 index 000000000..761d9f2cd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/AntonNPC.java @@ -0,0 +1,54 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the anton NPC. + * @author 'Vexia + */ +@Initializable +public final class AntonNPC extends AbstractNPC { + + /** + * The messages to yell. + */ + private static final String[] FORCE_CHAT = { "Armour and axes to suit your needs.", "Imported weapons from the finest smithys around the lands!", "Ow, my toe! That armour is heavy." }; + + /** + * Constructs a new {@code AntonNPC} {@code Object}. + */ + public AntonNPC() { + this(4295, null); + } + + /** + * Constructs a new {@code AntonNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public AntonNPC(int id, Location location) { + super(id, location); + } + + @Override + public void tick() { + if (RandomFunction.random(45) == 5) { + sendChat(RandomFunction.getRandomElement(FORCE_CHAT)); + } + super.tick(); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new AntonNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 4295 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/ArmourSuitNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/ArmourSuitNPC.java new file mode 100644 index 000000000..b5583c9cc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/ArmourSuitNPC.java @@ -0,0 +1,67 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the Suit of armour NPC used in Taverly dungeon (entering Cauldron + * of thunder room). + * @author Emperor + */ +@Initializable +public final class ArmourSuitNPC extends AbstractNPC { + + /** + * Constructs a new {@code ArmourSuitNPC} {@code Object}. + */ + public ArmourSuitNPC() { + this(453, null); + } + + /** + * Constructs a new {@code ArmourSuitNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public ArmourSuitNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.init(); + super.setRespawn(false); + GameWorld.getPulser().submit(new Pulse(50, this) { + @Override + public boolean pulse() { + if (!getProperties().getCombatPulse().isAttacking() && !inCombat()) { + clear(); + return true; + } + return false; + } + }); + } + + @Override + public void clear() { + super.clear(); + ObjectBuilder.add(new GameObject(818, getProperties().getSpawnLocation(), 1)); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ArmourSuitNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 453 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/BarbarianNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/BarbarianNPC.java new file mode 100644 index 000000000..a2d17429e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/BarbarianNPC.java @@ -0,0 +1,56 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Rerepsents a barbarian npc. + * @author 'Vexia + */ +@Initializable +public final class BarbarianNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 12, 3246, 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 5909 }; + + /** + * Constructs a new {@code BarbarianNPC} {@code Object}. + */ + public BarbarianNPC() { + super(0, null, true); + } + + /** + * Constructs a new {@code BarbarianNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private BarbarianNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BarbarianNPC(id, location); + } + + @Override + public void onImpact(final Entity entity, final BattleState state) { + if (RandomFunction.random(8) == 1) { + sendChat("YEEEEEEEEAARRRGGGGHHHHHHHH"); + } + super.onImpact(entity, state); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/BennyNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/BennyNPC.java new file mode 100644 index 000000000..27b769ccf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/BennyNPC.java @@ -0,0 +1,64 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the representation of the benny npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BennyNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 5925 }; + + /** + * Represents the random messages for benny to display. + */ + private static final String[] MESSAGES = new String[] { "Read all about it!", "Varrock Herald, on sale here!", "Buy your Varrock Herald now!", "Extra! Extra! Read all about it!", "Varrock Herald, now only 50 gold!" }; + + /** + * Constructs a new {@code BennyNPC} {@code Object}. + */ + public BennyNPC() { + super(0, null); + } + + /** + * Constructs a new {@code BennyNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private BennyNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BennyNPC(id, location); + } + + @Override + public void tick() { + super.tick(); + if (RandomFunction.random(0, 12) == 5) { + sendChat(MESSAGES[RandomFunction.random(MESSAGES.length)]); + } + } + + @Override + public int[] getIds() { + return ID; + } + + @Override + public int getWalkRadius() { + return 6; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/BlackKnightNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/BlackKnightNPC.java new file mode 100644 index 000000000..3df7c8395 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/BlackKnightNPC.java @@ -0,0 +1,54 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Represents the a duck npc. + * @author afaroutdude + */ +@Initializable +public final class BlackKnightNPC extends AbstractNPC { + + /** + * Constructs a new {@code BlackKnightNPC} {@code Object}. + */ + public BlackKnightNPC() { + super(0, null); + } + + /** + * Constructs a new {@code BlackKnightNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public BlackKnightNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BlackKnightNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player player = killer.asPlayer(); + if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(1, 3)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player, 1, 3, true); + } + } + } + + @Override + public int[] getIds() { + return new int[] { 178, 179, 610, 2698, 6189 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/BorkNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/BorkNPC.java new file mode 100644 index 000000000..8d3e5d3e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/BorkNPC.java @@ -0,0 +1,603 @@ +package core.game.node.entity.npc.other; + +import core.game.component.Component; +import core.game.content.global.BossKillCounter; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.CameraViewPacket; +import core.net.packet.out.MinimapState; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.skill.Skills; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the bork npc. + * @author Vexia + */ +@Initializable +public class BorkNPC extends AbstractNPC { + + /** + * The chats the legion can say. + */ + private static final String[] LEGION_CHATS = new String[] { "For bork!", "Die human!", "Resistance is futile!", "We are the collective!", "From a triangle!!", "Hup! 2... 3... 4!!" }; + + /** + * The chance items. + */ + private static final ChanceItem[] DROPS = new ChanceItem[] { new ChanceItem(532, 1, 1, 0.0), new ChanceItem(12163, 5, 5, 0.0), new ChanceItem(12160, 7, 7, 0.0), new ChanceItem(12159, 2, 2, 0.0), new ChanceItem(995, 2000, 10000, 0.0), new ChanceItem(1619, 1, 0.0), new ChanceItem(1621, 1, 1, 0.0), new ChanceItem(1623, 1, 1, 0.0) }; + + /** + * The ring drops. + */ + private static final ChanceItem[] RING_DROPS = new ChanceItem[] { new ChanceItem(532, 1, 1, 0.0), new ChanceItem(12163, 5, 5, 0.0), new ChanceItem(12160, 10, 10, 0.0), new ChanceItem(12159, 3, 3, 0.0), new ChanceItem(1601, 1, 1, 0.0), new ChanceItem(995, 2000, 10000, 0.0), new ChanceItem(1619, 2, 2, 0.0), new ChanceItem(1621, 3, 3, 0.0) }; + + /** + * The list of the legion npc. + */ + private final List legions = new ArrayList<>(); + + /** + * If the legion is spawned. + */ + private boolean spawnedLegion; + + /** + * The player. + */ + private Player player; + + /** + * The bork cutscene. + */ + private BorkCutscene cutscene; + + /** + * Constructs a new {@Code BorkNPC} {@Code Object} + */ + public BorkNPC() { + super(-1, null); + } + + /** + * Constructs a new {@Code BorkNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public BorkNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BorkNPC(id, location); + } + + @Override + public void handleTickActions() { + if (player == null) { + return; + } + super.handleTickActions(); + if (!getLocks().isMovementLocked() && player != null) { + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + } + + @Override + public void finalizeDeath(Entity killer){ + super.finalizeDeath(killer); + BossKillCounter.addtoKillcount((Player) killer, this.getId()); + } + + @Override + public void commenceDeath(Entity killer) { + super.commenceDeath(killer); + for (NPC l : legions) { + l.clear(); + } + player.lock(); + cutscene.wizard.clear(); + cutscene.wizard.lock(); + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 11, 12); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getInterfaceManager().open(new Component(693)); + if (player.getDialogueInterpreter().getDialogue() != null) { + player.getDialogueInterpreter().getDialogue().end(); + } + GameWorld.getPulser().submit(new Pulse(10, player) { + + @Override + public boolean pulse() { + player.unlock(); + player.getDialogueInterpreter().sendDialogues(player, FacialExpression.FURIOUS, "That monk - he called to Zamorak for revenge!"); + player.sendMessage("Something is shaking the whole cavern! You should get out of here quick!"); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.SHAKE, 3, 2, 2, 2, 2)); + player.getInterfaceManager().restoreTabs(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().close(); + return true; + } + + }); + } + + @Override + public void handleDrops(Player p, Entity killer) { + if (player.getAttribute("first-bork", false)) { + player.removeAttribute("first-bork"); + player.getSkills().addExperience(Skills.SLAYER, 5000, true); + } else { + player.getSkills().addExperience(Skills.SLAYER, 1500, true); + } + ChanceItem[] drops = new Item(player.getEquipment().getId(12)).getName().toLowerCase().contains("ring of wealth") ? RING_DROPS : DROPS; + for (int i = 0; i < drops.length; i++) { + Item item = new Item(drops[i].getId(), RandomFunction.random(drops[i].getMinimumAmount(), drops[i].getMaximumAmount())); + GroundItemManager.create(item, getLocation(), player); + } + if (RandomFunction.random(5) == 1) { + super.handleDrops(p, killer); + } + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + if (!spawnedLegion && getSkills().getLifepoints() < (getSkills().getStaticLevel(Skills.HITPOINTS) / 2)) { + spawnLegion(); + } + } + + /** + * Spawns the legion. + */ + private void spawnLegion() { + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 11, 12); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + spawnedLegion = true; + player.lock(); + player.getImpactHandler().setDisabledTicks(14); + lock(); + cutscene.wizard.lock(); + getProperties().getCombatPulse().stop(); + player.getProperties().getCombatPulse().stop(); + getAnimator().forceAnimation(Animation.create(8757)); + GameWorld.getPulser().submit(new Pulse(1, player, this) { + + @Override + public boolean pulse() { + getAnimator().forceAnimation(Animation.create(8757)); + sendChat("Come to my aid, brothers!"); + player.sendMessage("Bork strikes the ground with his axe."); + GameWorld.getPulser().submit(new Pulse(4, player) { + + @Override + public boolean pulse() { + player.getInterfaceManager().open(new Component(691)); + return true; + } + + }); + GameWorld.getPulser().submit(new Pulse(13, player) { + + @Override + public boolean pulse() { + player.getInterfaceManager().close(); + for (int i = 0; i < 3; i++) { + NPC legion = NPC.create(7135, getLocation().transform(RandomFunction.random(1, 3), RandomFunction.random(1, 3), 0), player); + legion.init(); + legion.graphics(Graphics.create(1314)); + legion.setAggressive(true); + legion.setRespawn(false); + legion.attack(player); + legions.add(legion); + legion.sendChat(RandomFunction.getRandomElement(LEGION_CHATS)); + } + player.unlock(); + cutscene.wizard.unlock(); + unlock(); + if (player != null) { + attack(player); + } + player.getInterfaceManager().restoreTabs(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + for (NPC n : legions) { + n.getProperties().getCombatPulse().attack(player); + } + return true; + } + + }); + return true; + } + + }); + } + + /** + * Sets the player. + * @param player the player. + */ + public void setPlayer(Player player) { + this.player = player; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new BorkCutscene()); + PluginManager.definePlugin(new DagonDialogue()); + PluginManager.definePlugin(new OrkLegion()); + PluginManager.definePlugin(new DagonElite()); + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return new int[] { 7133 }; + } + + /** + * Handles the ork legion. + * @author Vexia + */ + public class OrkLegion extends AbstractNPC { + + private Player player; + + /** + * The last talk. + */ + private int lastTalk = GameWorld.getTicks() + 30; + + /** + * Constructs a new {@Code OrkLegion} {@Code Object} + * @param id the id. + * @param location the location. + */ + public OrkLegion(int id, Location location) { + super(id, location); + super.setAggressive(true); + } + + /** + * Constructs a new {@Code OrkLegion} {@Code Object} + */ + public OrkLegion() { + super(-1, null); + } + + @Override + public void handleTickActions() { + if (player == null) { + return; + } + + if (lastTalk < GameWorld.getTicks()) { + sendChat(LEGION_CHATS[RandomFunction.random(LEGION_CHATS.length)]); + lastTalk = GameWorld.getTicks() + 30; + } + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return true; + } + + @Override + public boolean canAttack(Entity e) { + return true; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + OrkLegion legion = new OrkLegion(id, location); + legion.player = (Player) objects[0]; + return legion; + } + + @Override + public int[] getIds() { + return new int[] { 7135 }; + } + + } + + /** + * Handles the dagone lite npc. + * @author Vexia + */ + public class DagonElite extends AbstractNPC { + + private Player player; + + /** + * Constructs a new {@Code DagonElite} {@Code Object} + * @param id the id. + * @param location the location. + */ + public DagonElite(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@Code DagonElite} {@Code Object} + */ + public DagonElite() { + super(-1, null); + } + + @Override + public void checkImpact(BattleState state) { + state.neutralizeHits(); + } + + @Override + public boolean isIgnoreMultiBoundaries(Entity victim) { + return true; + } + + @Override + public boolean canAttack(Entity e) { + return true; + } + + @Override + public boolean isAttackable(Entity e, CombatStyle style) { + return false; + } + + @Override + public void handleTickActions() { + if (player == null) { + return; + } + super.handleTickActions(); + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(player); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + DagonElite elite = new DagonElite(id, location); + elite.player = (Player) objects[0]; + return elite; + } + + @Override + public int[] getIds() { + return new int[] { 7137 }; + } + + } + + /** + * Handles the bork cutscene. + * @author Vexia + */ + public class BorkCutscene extends CutscenePlugin { + + /** + * The bork npc. + */ + private BorkNPC bork; + + /** + * The wizard npc. + */ + private NPC wizard; + + /** + * Constructs a new {@Code BorkCutscene} {@Code Object} + */ + public BorkCutscene() { + super("Bork cutscene"); + this.setMulticombat(true); + } + + /** + * Constructs a new {@Code BorkCutscene} {@Code Object} + * @param player the player. + */ + public BorkCutscene(Player player) { + this(); + this.player = player; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + switch (target.getId()) { + case 29537: + e.asPlayer().graphics(Graphics.create(110)); + e.asPlayer().teleport(Location.create(3143, 5545, 0)); + return true; + } + } + return super.interact(e, target, option); + } + + @Override + public boolean leave(Entity entity, boolean logout) { + if (entity instanceof Player) { + PacketRepository.send(CameraViewPacket.class, new CameraContext(entity.asPlayer(), CameraType.RESET, 3, 2, 2, 2, 2)); + } + return super.leave(entity, logout); + } + + @Override + public boolean start(Player player, boolean login, Object... args) { + player.lock(); + bork = new BorkNPC(7133, base.transform(26, 33, 0)); + bork.init(); + bork.setPlayer(player); + bork.setRespawn(false); + bork.lock(); + bork.cutscene = this; + wizard = NPC.create(7137, base.transform(38, 29, 0), player); + wizard.init(); + wizard.lock(); + wizard.faceTemporary(player, 2); + player.getImpactHandler().setDisabledTicks(5); + player.faceTemporary(wizard, 2); + return super.start(player, login, args); + } + + @Override + public void stop(boolean fade) { + end(); + } + + /** + * Commences the fight. + */ + public void commenceFight() { + bork.unlock(); + wizard.unlock(); + player.unlock(); + wizard.attack(player); + bork.attack(player); + wizard.setRespawn(false); + player.getInterfaceManager().restoreTabs(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + } + + @Override + public void open() { + super.open(); + bork.cutscene.player = player; + player.lock(); + player.getInterfaceManager().open(new Component(692)); + GameWorld.getPulser().submit(new Pulse(13, player) { + + @Override + public boolean pulse() { + commenceFight(); + player.getInterfaceManager().close(); + + player.getDialogueInterpreter().open("dagon-dialogue", wizard, BorkCutscene.this); + return true; + } + + }); + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new BorkCutscene(player); + } + + @Override + public Location getStartLocation() { + return base.transform(36, 33, 0); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + region = DynamicRegion.create(12374); + region.setMulticombat(true); + setRegionBase(); + registerRegion(region.getId()); + } + } + + /** + * Handles the dagon dialogue. + * @author Vexia + */ + public class DagonDialogue extends DialoguePlugin { + + /** + * The bork cutscene. + */ + private BorkCutscene cutscene; + + /** + * Constructs a new {@Code DagonDialogue} {@Code Object} + */ + public DagonDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@Code DagonDialogue} {@Code Object} + * @param player the player. + */ + public DagonDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DagonDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + cutscene = (BorkCutscene) args[1]; + npc("Our Lord Zamorak has power over life and death,", player.getUsername() + "! He has seen fit to resurrect Bork to", "continue his great work...and now you will fall before him"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + boolean played = player.getSavedData().getActivityData().hasKilledBork(); + player(played ? "Uh -oh! Here we go again." : "Oh boy..."); + stage++; + break; + case 1: + end(); + cutscene.commenceFight(); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("dagon-dialogue") }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/CatableponNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/CatableponNPC.java new file mode 100644 index 000000000..bea52f57f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/CatableponNPC.java @@ -0,0 +1,75 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the catablepon npc type. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CatableponNPC extends AbstractNPC { + + /** + * Represents the NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 4397, 4398, 4399 }; + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(4272); + + /** + * Represents the swing handler. + */ + private final MultiSwingHandler combatHandler = new MultiSwingHandler(new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), null).setUseHandler(true), new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), null).setUseHandler(true), new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), null).setUseHandler(true), new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), ANIMATION).setUseHandler(true)); + + /** + * Constructs a new {@code CatableponNPC} {@code Object}. + */ + public CatableponNPC() { + super(0, null); + } + + /** + * Constructs a new {@code CatableponNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private CatableponNPC(int id, Location location) { + super(id, location); + this.setAggressive(true); + } + + @Override + public void configure() { + super.configure(); + super.getProperties().setSpell((CombatSpell) SpellBook.MODERN.getSpell(7)); + super.getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(7)); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new CatableponNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatHandler; + } + + @Override + public int[] getIds() { + return ID; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/ChromaticDragonNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/ChromaticDragonNPC.java new file mode 100644 index 000000000..9ac7eb04d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/ChromaticDragonNPC.java @@ -0,0 +1,73 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.DragonfireSwingHandler; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles a chromatic dragon (green, blue, red, ..). + * @author Emperor + */ +@Initializable +public final class ChromaticDragonNPC extends AbstractNPC { + + /** + * The dragonfire attack. + */ + private static final SwitchAttack DRAGONFIRE = DragonfireSwingHandler.get(true, 52, new Animation(81, Priority.HIGH), new Graphics(1, 64), null, null); + + /** + * Handles the combat. + */ + private final CombatSwingHandler combatAction = new MultiSwingHandler(false, new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), new Animation(80, Priority.HIGH)), new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), new Animation(91, Priority.HIGH)), DRAGONFIRE); + + /** + * Constructs a new {@code ChromaticDragonNPC} {@code Object}. + */ + public ChromaticDragonNPC() { + super(941, null); + } + + /** + * Constructs a new {@code ChromaticDragonNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public ChromaticDragonNPC(int id, Location location) { + super(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatAction; + } + + @Override + public int getDragonfireProtection(boolean fire) { + return 0x2 | 0x4 | 0x8; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ChromaticDragonNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 941, 4677, 4678, 4679, 4680, // Green dragon + 55, 4681, 4682, 4683, 4684, // Blue dragon + 53, 4669, 4670, 4671, 4672, // Red dragon + 54, 4673, 4674, 4675, 4676, // Black dragon + 8629 //lava dragon + }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/CitizenNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/CitizenNPC.java new file mode 100644 index 000000000..430ec7f59 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/CitizenNPC.java @@ -0,0 +1,55 @@ +package core.game.node.entity.npc.other; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; + +/** + * Represents a generic citizen npc. + * @author 'Vexia + * @version 1.9 + */ +@Initializable +public final class CitizenNPC extends AbstractNPC { + + /** + * Represents the NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 1, 2, 3, 4, 5, 6, 16, 24, 25, 170, 351, 352, 353, 354, 359, 360, 361, 362, 363, 663, 726, 727, 728, 729, 730, 1086, 2675, 2776, 3224, 3225, 3227, 5923, 5924 }; + + /** + * Constructs a new {@code CitizenNPC} {@code Object}. + */ + public CitizenNPC() { + super(0, null, true); + } + + /** + * Constructs a new {@code CitizenNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private CitizenNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public void init() { + super.init(); + getSkills().setLevel(Skills.HITPOINTS, 7); + getSkills().setStaticLevel(Skills.HITPOINTS, 7); + getSkills().setLifepoints(7); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new CitizenNPC(id, location); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/CowNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/CowNPC.java new file mode 100644 index 000000000..aeb831611 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/CowNPC.java @@ -0,0 +1,70 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the a cow npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CowNPC extends AbstractNPC { + + /** + * Represents the force chat to use. + */ + private static final String FORCE_CHAT = "Moo"; + + /** + * Constructs a new {@code CowNPC} {@code Object}. + */ + public CowNPC() { + super(0, null, true); + } + + /** + * Constructs a new {@code CowNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public CowNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public void tick() { + if (RandomFunction.random(45) == 5 && this.getId() != 1766) { // calves don't moo + sendChat(FORCE_CHAT); + } + super.tick(); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new CowNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer != null) { + Player player = killer.asPlayer(); + // Obtain a cow-hide from a cow in the field north-east of

Lumbridge + if (player.getViewport().getRegion().getId() == 12850 || player.getViewport().getRegion().getId() == 12851) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 1); + } + } + } + + @Override + public int[] getIds() { + return new int[] { 81, 397, 955, 1766, 1767, 3309 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/DarkWizardNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/DarkWizardNPC.java new file mode 100644 index 000000000..a671e9136 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/DarkWizardNPC.java @@ -0,0 +1,109 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the abstract representation of a dark wizard. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DarkWizardNPC extends AbstractNPC { + + /** + * Represents the NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 172, 174 }; + + /** + * Represents the spells to set. + */ + private static final int[][] SPELLS = new int[][] { { 6, 7 }, { 4, 2 } }; + + /** + * Constructs a new {@code DarkWizardNPC} {@code Object}. + */ + public DarkWizardNPC() { + super(0, null); + setAggressive(true); + } + + /** + * Constructs a new {@code DarkWizardNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private DarkWizardNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DarkWizardNPC(id, location); + } + + @Override + public void init() { + super.init(); + getProperties().getCombatPulse().setStyle(CombatStyle.MAGIC); + setDefault(); + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + super.onImpact(entity, state); + if (getAttribute("switched", false)) { + removeAttribute("switched"); + setDefault(); + return; + } + if (RandomFunction.random(6) > 4) { + setSpells(getSpells()); + setAttribute("switched", true); + } + } + + /** + * Sets the default spell. + */ + private void setDefault() { + getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(getId() == 172 ? 6 : 4)); + } + + /** + * Sets random spells. + * @param ids the ids. + */ + private void setSpells(int[] ids) { + getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(ids[RandomFunction.random(ids.length)])); + } + + /** + * Gets the spells. + * @return the spells. + */ + private int[] getSpells() { + int index = 0; + for (int i = 0; i < ID.length; i++) { + if (ID[i] == getId()) { + index = i; + break; + } + } + return SPELLS[index]; + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/DraynorTreeNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/DraynorTreeNPC.java new file mode 100644 index 000000000..20ad91ee9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/DraynorTreeNPC.java @@ -0,0 +1,84 @@ +package core.game.node.entity.npc.other; + +import java.util.List; + +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the abstract draynor tree npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DraynorTreeNPC extends AbstractNPC { + + /** + * Represents the NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 5208, 152, 5207 }; + + /** + * Represents the animation of the tree. + */ + private static final Animation ANIMATION = new Animation(73, Priority.HIGH); + + /** + * Represents the attack delay. + */ + private int attackDelay; + + /** + * Constructs a new {@code DraynorTreeNPC} {@code Object}. + */ + public DraynorTreeNPC() { + super(0, null, false); + } + + /** + * Constructs a new {@code DraynorTreeNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private DraynorTreeNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DraynorTreeNPC(id, location); + } + + @Override + public void tick() { + final List players = RegionManager.getLocalPlayers(this, 1); + if (players.size() != 0) { + if (attackDelay < GameWorld.getTicks()) { + for (Player p : players) { + faceTemporary(p, 2); + getAnimator().forceAnimation(ANIMATION); + int hit = RandomFunction.random(2); + p.getImpactHandler().manualHit(this, hit, hit > 0 ? HitsplatType.NORMAL : HitsplatType.MISS); + attackDelay = GameWorld.getTicks() + 3; + p.animate(p.getProperties().getDefenceAnimation()); + return; + } + } + } + super.tick(); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/DuckNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/DuckNPC.java new file mode 100644 index 000000000..4c833c265 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/DuckNPC.java @@ -0,0 +1,69 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the a duck npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DuckNPC extends AbstractNPC { + + /** + * Represents the force chat to use. + */ + private static final String FORCE_CHAT = "Quack!"; + + /** + * Constructs a new {@code DuckNPC} {@code Object}. + */ + public DuckNPC() { + super(0, null); + } + + /** + * Constructs a new {@code DuckNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public DuckNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public void tick() { + if (RandomFunction.random(45) == 5) { + sendChat(FORCE_CHAT); + } + super.tick(); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DuckNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player player = killer.asPlayer(); + if (this.getLocation().withinDistance(new Location(2991,3383,0))) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR,0, 9); + } + } + } + + @Override + public int[] getIds() { + return new int[] { 46, 2693, 6113 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/ElementalMonsterNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/ElementalMonsterNPC.java new file mode 100644 index 000000000..58012f6de --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/ElementalMonsterNPC.java @@ -0,0 +1,74 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Represents the Earth, Fire, Air, and Water Elemental NPCs. + * @author afaroutdude + */ +@Initializable +public final class ElementalMonsterNPC extends AbstractNPC { + + /** + * Constructs a new {@code DuckNPC} {@code Object}. + */ + public ElementalMonsterNPC() { + super(0, null); + } + + /** + * Constructs a new {@code DuckNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public ElementalMonsterNPC(int id, Location location) { + super(id, location, true); + } + + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ElementalMonsterNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player player = killer.asPlayer(); + if (this.getLocation().withinDistance(new Location(2719, 9889, 0), 100)) { + switch (this.getId()) { + case 1019: + player.setAttribute("/save:diary:seers:elemental:fire", true); + break; + case 1020: + player.setAttribute("/save:diary:seers:elemental:earth", true); + break; + case 1021: + player.setAttribute("/save:diary:seers:elemental:air", true); + break; + case 1022: + player.setAttribute("/save:diary:seers:elemental:water", true); + break; + } + if (player.getAttribute("diary:seers:elemental:fire", false) + && player.getAttribute("diary:seers:elemental:earth", false) + && player.getAttribute("diary:seers:elemental:air", false) + && player.getAttribute("diary:seers:elemental:water", false)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 4); + } + } + } + } + + @Override + public int[] getIds() { + return new int[] { 1019, 1020, 1021, 1022 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/ElementalWizardNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/ElementalWizardNPC.java new file mode 100644 index 000000000..245186ffe --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/ElementalWizardNPC.java @@ -0,0 +1,328 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the elemental wizard npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ElementalWizardNPC extends AbstractNPC { + + /** + * Represents the spells to use. + */ + private static final int[][] SPELLS = new int[][] { { 8, 7 }, { 4, 7 }, { 6, 7 }, { 1, 7 } }; + + /** + * Constructs a new {@code ElementalWizardNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public ElementalWizardNPC(int id, Location location) { + super(id, location, true); + getProperties().getCombatPulse().setStyle(CombatStyle.MAGIC); + } + + /** + * Constructs a new {@code ElementalWizardNPC} {@code Object}. + */ + public ElementalWizardNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ElementalWizardNPC(id, location); + } + + @Override + public void onImpact(Entity entity, BattleState state) { + if (state.getSpell() != null && isSpellType(state.getSpell())) { + state.setEstimatedHit(0); + state.setMaximumHit(0); + sendChat("Gratias tibi ago"); + getSkills().heal(getSkills().getStaticLevel(Skills.HITPOINTS)); + Entity attacker = state.getAttacker(); + if (attacker instanceof Player && !attacker.asPlayer().getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0, 8)) { + attacker.asPlayer().getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(attacker.asPlayer(), 0, 8, true); + } + } + if (getAttribute("switch", false)) { + setBaseSpell(); + removeAttribute("switch"); + } + if (RandomFunction.random(6) > 4) { + setSpell(); + } + super.onImpact(entity, state); + } + + /** + * Sets the spell. + */ + private void setSpell() { + int[] spells = SPELLS[getSpellIndex()]; + getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(spells[RandomFunction.random(spells.length)])); + setAttribute("switch", true); + } + + /** + * Sets the base spell type. + */ + private void setBaseSpell() { + getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(SPELLS[getSpellIndex()][0])); + } + + /** + * Checks if it is the correct spell type. + * @param spell the spell. + * @return {@code True} if so. + */ + private boolean isSpellType(MagicSpell spell) { + switch (getSpellIndex()) { + case 0:// fire + return spell.getClass().getSimpleName().startsWith("Fire"); + case 1:// water + return spell.getClass().getSimpleName().startsWith("Water"); + case 2:// earth + return spell.getClass().getSimpleName().startsWith("Earth"); + case 3:// air + return spell.getClass().getSimpleName().startsWith("Air"); + } + return false; + } + + /** + * Gets the spell index. + * @return the index. + */ + private int getSpellIndex() { + for (int i = 0; i < getIds().length; i++) { + if (getIds()[i] == getId()) { + return i; + } + } + return 0; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new MaligniusMortifer().init(); + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return new int[] { 2709, 2710, 2711, 2712 }; + } + + /** + * Represents the malignius mortifer dialogue. + * @author 'Vexia + * @version 1.0 + */ + public final class MaligniusMortifer extends DialoguePlugin { + + /** + * Constructs a new {@code MaligniusMortifer} {@code Object}. + */ + public MaligniusMortifer() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MaligniusMortifer} {@code Object}. + * @param player the player. + */ + public MaligniusMortifer(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MaligniusMortifer(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("So, " + player.getUsername() + ", your curiosity leads you to speak to me?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + options("Who are you and what are you doing here?", "Can you teach me something about magic?", "Where can I get clothes like those?", "Actually, I don't want to talk to you."); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: + player("Who are you and what are you doing here?"); + stage = 10; + break; + case 2: + player("Can you teach me something about magic?"); + stage = 20; + break; + case 3: + player("Where can I get clothes like those?"); + stage = 30; + break; + case 4: + player("Actually, I don't want to talk to you."); + stage = 40; + break; + } + break; + case 10: + npc("I am the great Malignius Mortifer, wielder of strange", "and terrible powers. These lowly followers of mine are", "dedicated students of the magical arts. Their business is", "to follow me and learn all they can."); + stage = 11; + break; + case 11: + player("There don't look very tough."); + stage = 12; + break; + case 12: + npc("You may believe that, but even if you strike one down,", "another will rise up within minutes."); + stage = 13; + break; + case 13: + player("Yeah, right."); + stage = 14; + break; + case 14: + npc("Each of my followers is a master of his chosen element.", "His life becomes bound to that element in a way you", "could not hope to understand."); + stage = 15; + break; + case 15: + player("And what do you do?"); + stage = 16; + break; + case 16: + npc("I am mastering a branch of magic that few dare to", "attempt: Necromancy! THe fools in the Guild of", "Wizards shun anyone who practices this art, but there", "are a few across the lands who know the rudiments."); + stage = 17; + break; + case 17: + npc("Grayzag and Invrigar... Even Melzar studied the", "methods of necromancy, until an accident affected his", "mind. Now his spells tend to result in..."); + stage = 18; + break; + case 18: + npc("... well, let us simply say that he does NOT raise", "armies of undead minions."); + stage = 19; + break; + case 19: + end(); + break; + case 20: + npc("Ah, you are an inquisitive young fellow. I shall speak of", "the great Wizards' Tower, destroyed by fire many", "years ago..."); + stage = 21; + break; + case 21: + npc("Many say it was the greatest building in the history of", "2009scape, a magnificent monument to human ingenuity."); + stage = 22; + break; + case 22: + npc("Yet when humans are offered great power, they so", "often buy it at the cost of their principles."); + stage = 23; + break; + case 23: + npc("Wizards who claimed allegiance to Saradomin began to", "insist that magic be restriced to the few they deemed", "'worthy' of such powers."); + stage = 24; + break; + case 24: + npc("Before long, those who did not share their fatuous", "obsession with Saradomin were excluded from the", "Tower comletely. This state of affairs could not", "continue."); + stage = 25; + break; + case 25: + end(); + break; + case 30: + npc("Bah! Our garments are an outward sign of our", "dominance of the magical arts. You cannot simply buy", "them in a shop."); + stage = 31; + break; + case 31: + player("What happens if I kill you and take them?"); + stage = 32; + break; + case 32: + npc("Try it and see!"); + stage = 33; + break; + case 33: + player("How about if you teach me enough about magic so I", "can wear those clothes too?"); + stage = 34; + break; + case 34: + npc("How about if I turn you into a mushroom to make you", "stop bothering me?"); + stage = 35; + break; + case 35: + transform(); + break; + case 40: + npc("Bah! Then go away!"); + stage = 41; + break; + case 41: + end(); + break; + } + return true; + } + + /** + * Method used to transform the player into a mushroom. + */ + private void transform() { + interpreter.sendDialogues(player, null, true, "MMMmmph!"); + npc.animate(Animation.create(811)); + player.getAppearance().transformNPC(3345); + player.graphics(Graphics.create(453)); + player.lock(8); + player.getLocks().lockMovement(10000); + GameWorld.getPulser().submit(new Pulse(12) { + @Override + public boolean pulse() { + player.getWalkingQueue().reset(); + player.getLocks().unlockMovement(); + player.getAppearance().transformNPC(-1); + end(); + return true; + } + }); + } + + @Override + public int[] getIds() { + return new int[] { 2713 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/FishingNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/FishingNPC.java new file mode 100644 index 000000000..70deaef13 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/FishingNPC.java @@ -0,0 +1,104 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.skill.fishing.FishSpots; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the fishing npc. + * @author Vexia + * + */ +@Initializable +public final class FishingNPC extends AbstractNPC { + + /** + * Represents the fishing spot. + */ + private FishSpots spot; + + /** + * Represents the delay of switching. + */ + private int switchDelay; + + /** + * Constructs a new {@code FishingNPC} {@code Object}. + */ + public FishingNPC() { + super(0, null); + spot = null; + } + + /** + * Constructs a new {@code FishingNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public FishingNPC(int id, Location location) { + super(id, location, false); + switchDelay = getRandomDelay(); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new FishingNPC(id, location); + } + + @Override + public void handleTickActions() { + if (spot == null) { + return; + } + if (switchDelay < GameWorld.getTicks()) { + moveSpot(); + } + } + + @Override + public void init() { + super.init(); + spot = FishSpots.forLocation(getLocation()); + } + + /** + * Method used to move a spot. + */ + public void moveSpot() { + if (spot == null) { + if (isInvisible()) { + setInvisible(false); + } else { + setInvisible(true); + } + switchDelay = GameWorld.getTicks() + RandomFunction.random(200, 390); + return; + } + if (spot == FishSpots.TUTORIAL_ISLAND) { + return; + } + Location rand = spot.getLocations()[RandomFunction.random(spot.getLocations().length)]; + if (RegionManager.getLocalNpcs(rand, 0).size() == 0) { + getProperties().setTeleportLocation(rand); + } + switchDelay = GameWorld.getTicks() + getRandomDelay(); + } + + /** + * Gets the random delay. + * @return the delay. + */ + private int getRandomDelay() { + return RandomFunction.random(200, 390); + } + + @Override + public int[] getIds() { + return new int[] { 316, 319, 320, 323, 325, 326, 327, 330, 332, 404, 952, 1174, 1175, 1331, 2067, 2068, 2724, 4908, 5748, 5749, 7045, 313, 322, 334, 406, 1191, 1333, 1405, 1406, 3574, 3575, 3848, 3849, 5471, 7044, 233, 234, 235, 236, 309, 310, 311, 314, 315, 317, 318, 328, 329, 331, 403, 800, 927, 1189, 1190, 1236, 1237, 1238, 3019, 7636, 312, 321, 324, 333, 405, 1332, 1399, 3804, 5470, 7046 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/GoblinVillageNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/GoblinVillageNPC.java new file mode 100644 index 000000000..357f6aacf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/GoblinVillageNPC.java @@ -0,0 +1,162 @@ +package core.game.node.entity.npc.other; + +import java.util.List; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the goblin village npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GoblinVillageNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { /** r */ + 4483, /** g */ + 4488, /** g */ + 4489, /** r */ + 4484, /** g */ + 4491, /** r */ + 4485, /** g */ + 4486, /** g */ + 4492, /** g */ + 4487, /** r */ + 4481, /** r */ + 4479, /** r */ + 4482, /** r */ + 4480 }; + + /** + * Represents the red goblins. + */ + private static final int[] RED_GOBLINS = new int[] { 4483, 4484, 4485, 4481, 4479, 4482, 4480 }; + + /** + * Represents the green goblins. + */ + private static final int GREEN_GOBLINS[] = new int[] { 4488, 4489, 4491, 4486, 4492, 4487 }; + + /** + * Represents the red messages. + */ + private static final String[] RED_MESSAGES = new String[] { "Red armour best!", "Green armour stupid!", "Red!", "Red not green!", "Stupid greenie!" }; + + /** + * Represents the green messages. + */ + private static final String[] GREEN_MESSAGES = new String[] { "Green armour best!", "Green!", "Stupid reddie!" }; + + /** + * Represents the delay. + */ + private long delay = 0L; + + /** + * Represents if the goblin is green. + */ + private boolean green = true; + + /** + * Constructs a new {@code GoblinVillageNPC} {@code Object}. + */ + public GoblinVillageNPC() { + super(0, null); + } + + /** + * Constructs a new {@code GoblinVillageNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private GoblinVillageNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new GoblinVillageNPC(id, location); + } + + @Override + public void init() { + super.init(); + for (int i : RED_GOBLINS) { + if (getId() == i) { + green = false; + } + } + } + + @Override + public void tick() { + super.tick(); + if (delay < System.currentTimeMillis() && !getProperties().getCombatPulse().isAttacking()) { + final int rand = RandomFunction.random(1, 4); + if (rand == 2) { + final List surronding = RegionManager.getLocalNpcs(this, 10); + for (NPC n : surronding) { + if (n.getId() == getId()) { + continue; + } + if (n.getProperties().getCombatPulse().isAttacking()) { + continue; + } + for (int i : green ? RED_GOBLINS : GREEN_GOBLINS) { + if (n.getId() == i) { + n.lock(5); + getProperties().getCombatPulse().attack(n); + break; + } + } + } + } + delay = System.currentTimeMillis() + 5000;// 15000; + } else { + final int rand = RandomFunction.random(3); + if (rand != 1) { + return; + } + final Entity oponent = getProperties().getCombatPulse().getVictim(); + if (oponent == null) { + return; + } + if (!(oponent instanceof NPC)) { + return; + } + if (oponent.getLocation().getDistance(getLocation()) > 4) { + return; + } + boolean goblin = false; + for (int i : green ? RED_GOBLINS : GREEN_GOBLINS) { + if (i == ((NPC) oponent).getId()) { + goblin = true; + break; + } + } + if (goblin && RandomFunction.random(0, 3) == 2) { + sendChat(green ? GREEN_MESSAGES[RandomFunction.random(GREEN_MESSAGES.length)] : RED_MESSAGES[RandomFunction.random(RED_MESSAGES.length)]); + } + } + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/GraveStoneNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/GraveStoneNPC.java new file mode 100644 index 000000000..7fa7ccddf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/GraveStoneNPC.java @@ -0,0 +1,470 @@ +package core.game.node.entity.npc.other; + +import java.util.List; + +import core.cache.def.impl.NPCDefinition; +import core.game.component.Component; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.entity.player.link.grave.GraveManager; +import core.game.node.entity.player.link.grave.GraveType; +import core.game.node.item.GroundItem; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.Initializable; +import core.plugin.PluginManager; + +/** + * Handles a gravestone npc. + * @author Vexia + */ +@Initializable +public class GraveStoneNPC extends AbstractNPC { + + /** + * The owner of the gravestone. + */ + private String owner; + + /** + * The display name. + */ + private String display; + + /** + * The gravestone type. + */ + private GraveType type; + + /** + * The life decay time. + */ + private int life = -1; + + /** + * If the stone is blessed. + */ + private boolean blessed; + + /** + * The ground items list. + */ + private List items; + + /** + * Constructs a new {@Code GraveStoneNPC} {@Code Object} + */ + public GraveStoneNPC() { + super(-1, null); + } + + /** + * Constructs a new {@Code GraveStoneNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public GraveStoneNPC(int id, Location location) { + super(id, location); + super.setWalks(false); + super.setNeverWalks(true); + } + + @Override + public void init() { + super.init(); + Player player = Repository.getPlayerByName(owner); + if (player != null) { + HintIconManager.registerHintIcon(player, this); + } + lock(); + animate(Animation.create(7394)); + } + + @Override + public void handleTickActions() { + if (life == -1) { + return; + } + if (life < GameWorld.getTicks()) { + clear(); + message("Your gravestone has collapsed."); + return; + } + int minutes = getMinutes(); + if (minutes <= 1) { + int seconds = getSeconds(); + int transformId = -1; + if (seconds == 100) { + transformId = getOriginalId() + 1; + } else if (seconds == 30) { + transformId = getOriginalId() + 2; + } + if (transformId != -1) { + transform(transformId); + } + } + } + + @Override + public void clear() { + super.clear(); + Player player = Repository.getPlayerByName(owner); + if (player != null) { + player.getHintIconManager().clear(); + } + if (owner != null) { + GraveManager.getGraves().remove(owner); + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + return false; + } + + @Override + public boolean canAttack(final Entity victim) { + return false; + } + + @Override + public Object fireEvent(String identifier, Object... objects) { + switch (identifier) { + case "updateItems": + for (GroundItem item : items) { + if (item == null) { + continue; + } + item.setDropper((Player) objects[0]); + } + break; + } + return null; + } + + @SuppressWarnings("unchecked") + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + GraveStoneNPC npc = new GraveStoneNPC(id, location); + if (objects != null && objects.length > 1) { + npc.setOwner((String) objects[0]); + npc.setLife((int) objects[1]); + npc.setItems((List) objects[2]); + npc.setType((GraveType) objects[3]); + npc.setDisplay((String) objects[4]); + } + GraveManager.getGraves().put(npc.getOwner(), npc); + return npc; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new GraveStonePlugin()); + return super.newInstance(arg); + } + + @Override + public int[] getIds() { + return new int[] { 6565, 6568, 6571, 6574, 6577, 6580, 6583, 6586, 6589, 6592, 6595, 6598, 6601 }; + } + + /** + * Reads the grave message. + * @param player the player. + */ + public void read(Player player) { + player.getConfigManager().set(1146, 1); + player.getInterfaceManager().open(new Component(266)); + if (!isOwner(player.getName())) { + player.getPacketDispatch().sendString(getMessage(), 266, 23); + } else { + final int minutes = getMinutes(); + String message; + if (minutes < 1) { + int seconds = getSeconds(); + message = "It looks like it'll survive another " + (seconds > 1 ? seconds + " seconds." : "second."); + } else { + message = "It looks like it'll survive another " + (minutes > 1 ? minutes + " minutes" : "minute") + "."; + } + player.getPacketDispatch().sendMessage(message); + player.getPacketDispatch().sendString(getMessage(), 266, 23); + } + } + + /** + * Repairs the grave. + * @param player the player. + */ + public void repair(Player player) { + if (player.getSkills().getStaticLevel(Skills.PRAYER) < 2) { + player.getDialogueInterpreter().sendDialogue("You need a prayer level of 2 to repair a gravestone."); + return; + } + if (getId() == getOriginalId()) { + player.sendMessage("This grave does not need repairing."); + return; + } + int seconds = type.getDecay() * 60; + int ticks = (1000 * seconds) / 600; + reTransform(); + updateItems(ticks); + setLife(GameWorld.getTicks() + ticks); + } + + /** + * Blesses the grave. + * @param player the player. + */ + public void bless(Player player) { + if (isOwner(player.getName())) { + player.getPacketDispatch().sendMessage("The gods don't seem to approve of people attempting to bless their own"); + player.getPacketDispatch().sendMessage("gravestones."); + return; + } + if (player.getSkills().getStaticLevel(Skills.PRAYER) < 70) { + player.getDialogueInterpreter().sendDialogue("You need a prayer level of 70 to bless a gravestone."); + return; + } + if (player.getSkills().getPrayerPoints() == 0) { + player.getDialogueInterpreter().sendDialogue("You don't have enough prayer points to do that."); + return; + } + if (isBlessed()) { + player.getPacketDispatch().sendMessage("This gravestone has already been blessed."); + return; + } + reTransform(); + setBlessed(true); + updateItems(6100); + player.animate(Animation.create(645)); + graphics(Graphics.create(1274)); + setLife(GameWorld.getTicks() + 6000); + message(player.getUsername() + " has blessed your grave, it will remain for another 60 minutes."); + } + + /** + * Demolishes the grave. + * @param player the player. + */ + public void demolish(Player player) { + if (!isOwner(player.getName())) { + player.getPacketDispatch().sendMessage("This is not your grave!"); + return; + } + clear(); + player.sendMessage("You destroyed your grave!"); + } + + /** + * Updates the items with a new decay. + * @param ticks the ticks. + */ + private void updateItems(int ticks) { + if (getItems() != null) { + for (GroundItem item : getItems()) { + if (item == null) { + continue; + } + if (item.isActive()) { + item.setDecayTime(ticks); + } + } + } + } + + /** + * Messages the owner. + * @param message the message. + */ + private void message(String message) { + Player o = Repository.getPlayerByName(owner); + if (o != null && o.isActive()) { + o.sendMessage(message); + } + } + + /** + * Gets the minutes left. + * @return the minutes. + */ + public int getMinutes() { + return (life - GameWorld.getTicks()) / 100; + } + + /** + * Gets the seconds left. + * @return the seconds. + */ + public int getSeconds() { + return (life - GameWorld.getTicks()) * 600 / 1000; + } + + /** + * Gets the message. + * @return the message. + */ + public String getMessage() { + int mins = getMinutes(); + return type.getMessage().replace("@name", display).replace("@mins", (mins > 1 ? mins + " minutes" : mins + " minute")); + } + + /** + * Checks if this name is the owner. + * @param name the name. + * @return {@code True} if so. + */ + public boolean isOwner(String name) { + return owner.equals(name); + } + + /** + * Gets the owner. + * @return the owner + */ + public String getOwner() { + return owner; + } + + /** + * Gets the display. + * @return the display + */ + public String getDisplay() { + return display; + } + + /** + * Sets the badisplay. + * @param display the display to set. + */ + public void setDisplay(String display) { + this.display = display; + } + + /** + * Sets the baowner. + * @param owner the owner to set. + */ + public void setOwner(String owner) { + this.owner = owner; + } + + /** + * Gets the life. + * @return the life + */ + public int getLife() { + return life; + } + + /** + * Sets the balife. + * @param life the life to set. + */ + public void setLife(int life) { + this.life = life; + } + + /** + * Gets the type. + * @return the type + */ + public GraveType getType() { + return type; + } + + /** + * Sets the batype. + * @param type the type to set. + */ + public void setType(GraveType type) { + this.type = type; + } + + /** + * Gets the blessed. + * @return the blessed + */ + public boolean isBlessed() { + return blessed; + } + + /** + * Sets the bablessed. + * @param blessed the blessed to set. + */ + public void setBlessed(boolean blessed) { + this.blessed = blessed; + } + + /** + * Gets the items. + * @return the items + */ + public List getItems() { + return items; + } + + /** + * Sets the baitems. + * @param items the items to set. + */ + public void setItems(List items) { + this.items = items; + } + + /** + * Handles the interactions of a grave stone. + * @author Vexia + */ + public class GraveStonePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (GraveType g : GraveType.values()) { + for (int start = g.getNpcId(); start < g.getNpcId() + 3; start++) { + NPCDefinition.forId(start).getHandlers().put("option:read", this); + NPCDefinition.forId(start).getHandlers().put("option:bless", this); + NPCDefinition.forId(start).getHandlers().put("option:demolish", this); + NPCDefinition.forId(start).getHandlers().put("option:repair", this); + } + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!(node instanceof GraveStoneNPC)) { + player.sendMessage("Error! NPC is not instanceof a GraveStoneNPC."); + return true; + } + GraveStoneNPC grave = (GraveStoneNPC) node; + switch (option) { + case "read": + grave.read(player); + break; + case "bless": + grave.bless(player); + break; + case "demolish": + grave.demolish(player); + break; + case "repair": + grave.repair(player); + break; + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/GuardNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/GuardNPC.java new file mode 100644 index 000000000..b66145608 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/GuardNPC.java @@ -0,0 +1,48 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the abstract knight npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GuardNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 9, 32, 163, 164, 196, 197, 206, 253, 254, 255, 256, 274, 275, 296, 298, 299, 447, 448, 449, 489, 609, 678, 799, 837, 842, 862, 870, 877, 917, 1200, 1203, 1204, 1317, 1710, 1711, 1712, 2073, 2074, 2134, 2135, 2136, 2236, 2571, 2699, 2700, 2701, 2702, 2703, 3228, 3229, 3230, 3231, 3232, 3233, 3241, 3407, 3408, 3715, 4257, 4258, 4259, 4260, 4307, 4308, 4309, 4310, 4311, 4336, 4375, 4603, 4604, 4605, 4606, 5800, 5801, 5919, 5920 }; + + /** + * Constructs a new {@code GuardNPC} {@code Object}. + */ + public GuardNPC() { + super(0, null, true); + this.setAggressive(false); + } + + /** + * Constructs a new {@code GuardNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private GuardNPC(int id, Location location) { + super(id, location, true); + this.setAggressive(false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new GuardNPC(id, location); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/HansNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/HansNPC.java new file mode 100644 index 000000000..92c574ced --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/HansNPC.java @@ -0,0 +1,64 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Handles the Hans NPC. + * @author Emperor + */ +//@InitializablePlugin +public final class HansNPC extends AbstractNPC { + + /** + * The default spawn location. + */ + private static final Location DEFAULT_SPAWN = Location.create(3221, 3218, 0); + + /** + * The movement path. + */ + private static final Location[] MOVEMENT_PATH = { Location.create(3221, 3214, 0), Location.create(3218, 3211, 0), Location.create(3218, 3208, 0), Location.create(3214, 3205, 0), Location.create(3202, 3205, 0), Location.create(3202, 3232, 0), Location.create(3203, 3233, 0), Location.create(3207, 3233, 0), Location.create(3210, 3230, 0), Location.create(3219, 3230, 0), Location.create(3219, 3222, 0), Location.create(3221, 3222, 0) }; + + /** + * Constructs a new {@code HansNPC} {@Code Object}. + */ + public HansNPC() { + super(0, DEFAULT_SPAWN); + } + + /** + * Constructs a new {@code HansNPC} {@Code Object}. + * @param id The NPC id. + * @param location The location. + */ + public HansNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public void configure() { + super.configure(); + if (isWalks()) { + configureMovementPath(MOVEMENT_PATH); + } + setWalks(true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new HansNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 0 }; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + init(); + return super.newInstance(arg); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/HighwayManNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/HighwayManNPC.java new file mode 100644 index 000000000..5ed04ba9e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/HighwayManNPC.java @@ -0,0 +1,71 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the highway man npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HighwayManNPC extends AbstractNPC { + + /** + * Represents the cape item. + */ + private static final Item CAPE = new Item(1019); + + /** + * Constructs a new {@code HighwayManNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public HighwayManNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code HighwayManNPC} {@code Object}. + */ + public HighwayManNPC() { + super(0, null); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (getId() == 180) { + GroundItemManager.create(new Item(526), getLocation(), (Player) killer); + GroundItemManager.create(CAPE, getLocation(), (Player) killer); + } + if (killer instanceof Player) { + final Player player = killer.asPlayer(); + if (!player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0, 10)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player, 0, 10, true); + } + } + } + + @Override + public void onAttack(Entity target) { + sendChat("Stand and deliver!"); + } + + @Override + public int[] getIds() { + return new int[] { 180, 2677 }; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new HighwayManNPC(id, location); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/IceGiantNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/IceGiantNPC.java new file mode 100644 index 000000000..5226484b3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/IceGiantNPC.java @@ -0,0 +1,54 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Represents the a duck npc. + * @author afaroutdude + */ +@Initializable +public final class IceGiantNPC extends AbstractNPC { + + /** + * Constructs a new {@code IceGiantNPC} {@code Object}. + */ + public IceGiantNPC() { + super(0, null); + } + + /** + * Constructs a new {@code IceGiantNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public IceGiantNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new IceGiantNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player player = killer.asPlayer(); + if (this.getLocation().withinDistance(new Location(3052, 9573, 0), 100) && !player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(1, 4)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player, 1, 4, true); + } + } + } + + @Override + public int[] getIds() { + return new int[] { 111, 3072, 4685, 4686, 4687 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/JogreNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/JogreNPC.java new file mode 100644 index 000000000..37583de6a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/JogreNPC.java @@ -0,0 +1,63 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Represents a Jogre NPC. + * @author Vexia + */ +@Initializable +public class JogreNPC extends AbstractNPC { + + /** + * If the jogre is in the pothole zone. + */ + private boolean inPothole; + + /** + * Constructs a new {@code JogreNPC} {@code Object} + * @param id the id. + * @param location the location. + */ + public JogreNPC(int id, Location location) { + super(id, location); + } + + @Override + public void init() { + super.init(); + inPothole = this.getViewport().getRegion().getId() == 11412; + } + + /** + * Constructs a new {@code JogreNPC} {@code Object} + */ + public JogreNPC() { + this(-1, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new JogreNPC(id, location); + } + + @Override + public void finalizeDeath(Entity killer) { + if (inPothole && killer.isPlayer()) { + Player player = killer.asPlayer(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 0, 9); + } + super.finalizeDeath(killer); + } + + @Override + public int[] getIds() { + return new int[] { 113 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/KamfreenaNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/KamfreenaNPC.java new file mode 100644 index 000000000..b907e817e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/KamfreenaNPC.java @@ -0,0 +1,54 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the kamfreena NPC. + * @author 'Vexia + */ +@Initializable +public final class KamfreenaNPC extends AbstractNPC { + + /** + * The messages to yell. + */ + private static final String[] FORCE_CHAT = { "When you aim for perfection, you discover it's a moving target.", "Patience and persistence can bring down the tallest tree.", "Be master of mind rather than mastered by mind.", "A reflection on a pool of water does not reveal its depth.", "Life isn't fair, that doesn't mean you can't win." }; + + /** + * Constructs a new {@code KamfreenaNPC} {@code Object}. + */ + public KamfreenaNPC() { + this(4289, null); + } + + /** + * Constructs a new {@code KamfreenaNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public KamfreenaNPC(int id, Location location) { + super(id, location); + } + + @Override + public void tick() { + if (RandomFunction.random(45) == 5) { + sendChat(RandomFunction.getRandomElement(FORCE_CHAT)); + } + super.tick(); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new KamfreenaNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 4289 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/LumberKittenNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/LumberKittenNPC.java new file mode 100644 index 000000000..89b17e451 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/LumberKittenNPC.java @@ -0,0 +1,95 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the lumber kittens at the lumber yard. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumberKittenNPC extends AbstractNPC { + + /** + * Represents if the kitten is hidden. + */ + private boolean hidden = true; + + /** + * Represents the next time you can do a speak. + */ + private int nextSpeak; + + /** + * Represents the delay of hiding again. + */ + private int hideDelay; + + /** + * Constructs a new {@code LumberKittenNPC} {@code Object}. + */ + public LumberKittenNPC() { + super(0, null); + } + + /** + * Constructs a new {@code LumberKittenNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private LumberKittenNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new LumberKittenNPC(id, location); + } + + @Override + public void init() { + setWalks(false); + super.init(); + } + + @Override + public void tick() { + if (nextSpeak < GameWorld.getTicks()) { + hidden = false; + nextSpeak = GameWorld.getTicks() + RandomFunction.random(10, 40); + hideDelay = GameWorld.getTicks() + 4; + sendChat("Mew!"); + } + if (hideDelay < GameWorld.getTicks()) { + hidden = true; + int rand = RandomFunction.random(20, 40); + hideDelay = GameWorld.getTicks() + rand; + nextSpeak = GameWorld.getTicks() + rand; + } + super.tick(); + } + + @Override + public boolean isHidden(final Player player) { + Quest quest = player.getQuestRepository().getQuest("Gertrude's Cat"); + if (hidden) { + return true; + } + if (quest.getStage(player) < 20 || quest.getStage(player) > 50) { + return true; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { 767 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/LumbridgeInstructorNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/LumbridgeInstructorNPC.java new file mode 100644 index 000000000..385b55050 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/LumbridgeInstructorNPC.java @@ -0,0 +1,62 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Represents the lumbridge instructor npcs. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LumbridgeInstructorNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 4707, 4906, 705, 1861, 4903, 4899, 4900, 4904 }; + + /** + * Constructs a new {@code LumbridgeInstructorNPC} {@code Object}. + */ + public LumbridgeInstructorNPC() { + super(0, null); + } + + /** + * Constructs a new {@code LumbridgeInstructorNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private LumbridgeInstructorNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new LumbridgeInstructorNPC(id, location); + } + + @Override + public void tick() { + super.tick(); + } + + @Override + public int getWalkRadius() { + return 4; + } + + @Override + public Location getMovementDestination() { + return getProperties().getSpawnLocation().transform(-2 + RandomFunction.random(getWalkRadius()), -2 + RandomFunction.random(getWalkRadius()), 0); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/LumbridgeSwampGiantRatNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/LumbridgeSwampGiantRatNPC.java new file mode 100644 index 000000000..1d669f90d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/LumbridgeSwampGiantRatNPC.java @@ -0,0 +1,58 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents a rat npc. + * @author afaroutdude + */ +@Initializable +public class LumbridgeSwampGiantRatNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 86 }; + + /** + * Constructs a new {@code RatNPC} {@code Object}. + */ + public LumbridgeSwampGiantRatNPC() { + super(0, null); + } + + /** + * Constructs a new {@code RatNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private LumbridgeSwampGiantRatNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new LumbridgeSwampGiantRatNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + + // Kill a giant rat in Lumbridge Swamp + if (killer instanceof Player && (killer.getViewport().getRegion().getId() == 12593 || killer.getViewport().getRegion().getId() == 12849)) { + killer.asPlayer().getAchievementDiaryManager().finishTask(killer.asPlayer(), DiaryType.LUMBRIDGE, 1, 7); + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/MetalDragonNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/MetalDragonNPC.java new file mode 100644 index 000000000..ef4a54fdb --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/MetalDragonNPC.java @@ -0,0 +1,84 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.DragonfireSwingHandler; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.world.update.flag.context.Animation; + +/** + * Handles a metal dragon (bronze, iron, steel). + * @author Emperor + */ +@Initializable +public final class MetalDragonNPC extends AbstractNPC { + + /** + * The dragonfire attack. + */ + private static final SwitchAttack DRAGONFIRE = DragonfireSwingHandler.get(false, 52, new Animation(81, Priority.HIGH), null, null, Projectile.create((Entity) null, null, 54, 40, 36, 41, 46, 20, 255)); + + /** + * Handles the combat. + */ + private final CombatSwingHandler combatAction = new MultiSwingHandler(true, new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), new Animation(80, Priority.HIGH)), new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), new Animation(91, Priority.HIGH)), DRAGONFIRE); + + /** + * Constructs a new {@code MetalDragonNPC} {@code Object}. + */ + public MetalDragonNPC() { + super(1590, null); + } + + /** + * Constructs a new {@code MetalDragonNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public MetalDragonNPC(int id, Location location) { + super(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatAction; + } + + @Override + public void finalizeDeath(Entity killer) { + if (killer.isPlayer() && (killer.getViewport().getRegion().getId() == 10899 || killer.getViewport().getRegion().getId() == 10900)) { + Player player = killer.asPlayer(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 2, 9); + } + super.finalizeDeath(killer); + } + + @Override + public int getDragonfireProtection(boolean fire) { + return 0x2 | 0x4 | 0x8; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MetalDragonNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 1590, // Bronze dragon + 1591, // Iron dragon + 1592, // Steel dragon + 3590 // Steel dragon (POH) + }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/MonkNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/MonkNPC.java new file mode 100644 index 000000000..0a0bf4849 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/MonkNPC.java @@ -0,0 +1,74 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles a monk NPC. + * @author Emperor + */ +@Initializable +public final class MonkNPC extends AbstractNPC { + + /** + * The monk's combat reward. + */ + private static final CombatAction COMBAT = new CombatAction(); + + /** + * Constructs a new {@code MonkNPC} {@code Object}. + */ + public MonkNPC() { + this(7727, null); + } + + /** + * Constructs a new {@code MonkNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public MonkNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MonkNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return COMBAT; + } + + @Override + public int[] getIds() { + return new int[] { 7727 }; + } + + /** + * Handles the combat reward. + * @author Emperor + */ + private static class CombatAction extends MeleeSwingHandler { + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (entity.getSkills().getLifepoints() != entity.getSkills().getMaximumLifepoints() && RandomFunction.randomize(10) < 2) { + entity.animate(Animation.create(709)); + entity.getSkills().heal(2); + entity.getProperties().getCombatPulse().setNextAttack(4); + return -1; + } + return super.swing(entity, victim, state); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/RasoloNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/RasoloNPC.java new file mode 100644 index 000000000..8d38342ad --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/RasoloNPC.java @@ -0,0 +1,84 @@ +package core.game.node.entity.npc.other; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +@Initializable +public class RasoloNPC extends OptionHandler { + @Override + public Plugin newInstance(Object arg) throws Throwable { + new RosaloDialouge().init(); + NPCDefinition.forId(1972).getHandlers().put("option:talk-to",this); + NPCDefinition.forId(1972).getHandlers().put("option:trade",this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if(option.equals("trade")){ + new NPC(1972).openShop(player); + } else { + player.getDialogueInterpreter().open(1972); + } + return false; + } + + /** + * Rasolo npc + * @author ceik + */ + + public class RosaloDialouge extends DialoguePlugin{ + public RosaloDialouge(){ + /** + * + */ + } + public RosaloDialouge(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new RosaloDialouge(player); + } + + @Override + public boolean open(Object... args){ + npc("Hello, would you like to see my wares?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch(stage){ + case 0: + player.getDialogueInterpreter().sendOptions("Select one", "Yes, please", "No, thanks"); + stage++; + break; + case 1: + switch(buttonId){ + case 1: + end(); + new NPC(1972).openShop(player); + break; + case 2: + player("No, thanks"); + stage++; + break; + } + break; + case 2: + end(); + break; + } + return true; + } + @Override + public int[] getIds() {return new int[] {1972};} + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/RatNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/RatNPC.java new file mode 100644 index 000000000..faa01560c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/RatNPC.java @@ -0,0 +1,68 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents a rat npc. + * @author 'Vexia + */ +@Initializable +public class RatNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 47, 2682, 2980, 2981, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 4396, 4415, 7202, 7204, 7417, 7461 }; + + /** + * Represents the rat tail item. + */ + private static final Item RAT_TAIL = new Item(300); + + /** + * Constructs a new {@code RatNPC} {@code Object}. + */ + public RatNPC() { + super(0, null); + } + + /** + * Constructs a new {@code RatNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + private RatNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new RatNPC(id, location); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player p = ((Player) killer); + if (p.getQuestRepository().getQuest("Witch's Potion").isStarted(p)) { + GroundItemManager.create(RAT_TAIL, getLocation(), p); + } + if (!getName().equals("Giant rat")) { + GroundItemManager.create(new Item(526), getLocation(), (Player) killer); + } + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/RatTutorialNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/RatTutorialNPC.java new file mode 100644 index 000000000..f5decd4b3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/RatTutorialNPC.java @@ -0,0 +1,87 @@ +package core.game.node.entity.npc.other; + +import core.plugin.Initializable; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.map.Location; + +/** + * Handles the tutorial rat npc. + * @author 'Vexia + */ +@Initializable +public class RatTutorialNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 86 }; + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public RatTutorialNPC() { + super(0, null); + this.setAggressive(false); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private RatTutorialNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public void init() { + super.init(); + setAggressive(false); + getSkills().setLevel(Skills.HITPOINTS, 5); + getSkills().setStaticLevel(Skills.HITPOINTS, 5); + getSkills().setLifepoints(5); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new RatTutorialNPC(id, location); + } + + @Override + public void tick() { + super.tick(); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (!(killer instanceof Player)) { + return; + } + final Player p = ((Player) killer); + if (TutorialSession.getExtension(p).getStage() == 52) { + TutorialStage.load(p, 53, false); + } + if (TutorialSession.getExtension(p).getStage() == 54) { + TutorialStage.load(p, 55, false); + } + if (killer instanceof Player) { + if (p.getQuestRepository().getQuest("Witch's Potion").isStarted(p)) { + GroundItemManager.create(new Item(300), getLocation(), p); + } + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/RockCrabNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/RockCrabNPC.java new file mode 100644 index 000000000..c827b0051 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/RockCrabNPC.java @@ -0,0 +1,107 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.agg.AggressiveBehavior; +import core.game.node.entity.npc.agg.AggressiveHandler; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the rock crab npc. + * @author Vexia + */ +@Initializable +public final class RockCrabNPC extends AbstractNPC { + + /** + * The aggresive behavior. + */ + private static final AggressiveBehavior AGGRO_BEHAVIOR = new AggressiveBehavior() { + @Override + public boolean canSelectTarget(Entity entity, Entity target) { + RockCrabNPC npc = (RockCrabNPC) entity; + if (entity.getLocation().withinDistance(target.getLocation(), 3)) { + npc.aggresor = true; + npc.target = target; + npc.transform(npc.getTransformId()); + return true; + } + return super.canSelectTarget(entity, target); + } + }; + + /** + * If currently an aggresor. + */ + private boolean aggresor; + + /** + * The target. + */ + private Entity target; + + /** + * Constructs a new {@code RockCrabNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public RockCrabNPC(int id, Location location) { + super(id, location, false); + super.setAggressiveHandler(new AggressiveHandler(this, AGGRO_BEHAVIOR)); + this.setAggressive(true); + this.setWalks(false); + } + + /** + * Constructs a new {@code RockCrabNPC} {@code Object}. + */ + public RockCrabNPC() { + super(-1, null); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (aggresor && !inCombat() && target.getLocation().getDistance(this.getLocation()) > 12) { + reTransform(); + aggresor = false; + getWalkingQueue().reset(); + setWalks(false); + } + } + + @Override + public void sendImpact(BattleState state) { + if (state.getEstimatedHit() >= 3 && RandomFunction.random(30) != 5) { + state.setEstimatedHit(0); + } + if (state.getEstimatedHit() == 2 && RandomFunction.random(30) != 5) { + state.setEstimatedHit(0); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new RockCrabNPC(id, location); + } + + /** + * Gets the transform id. + * @return the id. + */ + private int getTransformId() { + if (getId() != super.getOriginalId()) { + return getOriginalId(); + } + return getId() - 1; + } + + @Override + public int[] getIds() { + return new int[] { 1266, 1268, 2453, 2890 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/ShanomiNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/ShanomiNPC.java new file mode 100644 index 000000000..e1e62df75 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/ShanomiNPC.java @@ -0,0 +1,54 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the shanomi NPC. + * @author Emperor + */ +@Initializable +public final class ShanomiNPC extends AbstractNPC { + + /** + * The messages to yell. + */ + private static final String[] FORCE_CHAT = { "Those things which cannot be seen, perceive them.", "Do nothing which is of no use.", "Think not dishonestly.", "The Way in training is.", "Gain and loss between you must distinguish.", "Trifles pay attention even to.", "Way of the warrior this is.", "Acquainted with every art become.", "Ways of all professions know you.", "Judgment and understanding for everything develop you must." }; + + /** + * Constructs a new {@code ShanomiNPC} {@code Object}. + */ + public ShanomiNPC() { + this(4290, null); + } + + /** + * Constructs a new {@code ShanomiNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public ShanomiNPC(int id, Location location) { + super(id, location); + } + + @Override + public void tick() { + if (RandomFunction.random(45) == 5) { + sendChat(RandomFunction.getRandomElement(FORCE_CHAT)); + } + super.tick(); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ShanomiNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 4290 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/SheepNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/SheepNPC.java new file mode 100644 index 000000000..b474a8ad5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/SheepNPC.java @@ -0,0 +1,59 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the sheep npc's. + * @author 'Vexia + */ +@Initializable +public class SheepNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 42, 43, 1271, 1272, 1529, 1762, 1763, 1764, 1765, 2311, 2377, 2378, 2379, 2380, 3310, 3311, 3579, 5148, 5149, 5150, 5151, 5152, 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, 5161, 5162, 5163, 5164, 5165, 5172, 5173 }; + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public SheepNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private SheepNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SheepNPC(id, location); + } + + @Override + public void tick() { + if (getProperties().getCombatPulse().isAttacking() || DeathTask.isDead(this)) { + super.tick(); + return; + } + if (RandomFunction.random(35) == 5) { + sendChat("Baa!"); + } + super.tick(); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/ShopNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/ShopNPC.java new file mode 100644 index 000000000..0698a184a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/ShopNPC.java @@ -0,0 +1,56 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the abstract npc of a generic owner of a shop. + * @author 'Vexia + */ +@Initializable +public class ShopNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 410, 528, 529, 525, 524, 1436, 590, 591, 971, 1917, 597, 1083, 3541, 7396, 1040, 563, 5798, 582, 526, 527, 873, 532, 533, 568, 2154, 1334, 2352, 4516, 520, 521, 4716, 3922, 1254, 2086, 3824, 1866, 530, 531, 836, 516, 560, 471, 522, 523, 4651, 4652, 4653, 4654, 4655, 4656, 4650, 534, 588, 2356, 1860, 550, 575, 683, 682, 4563, 4558, 4559, 519, 559, 562, 581, 554, 601, 1301, 1039, 2353, 3166, 2161, 2162, 600, 593, 545, 585, 5268, 2305, 2307, 2304, 1783, 557, 1038, 1433, 7053, 571, 5487, 536, 4294, 4293, 584, 570, 540, 2157, 69669, 569, 572, 573, 1303, 595, 297, 704, 587, 5110, 5109, 556, 1865, 543, 2198, 580, 1862, 583, 553, 461, 4513, 3097, 903, 1435, 606, 2623, 594, 579, 2160, 6750, 6898, 6893, 589, 5485, 542, 549, 3038, 544, 1434, 209, 1980, 546, 6988, 3671, 558, 576, 5266, 586, 602, 552, 551, 541, 692, 797, 564, 2152, 1208, 2233, 3205, 70, 1598, 1596, 1597, 1599, 2259, 3162, 1167, 2620, 2151, 5486, 4250, 1079, 970, 793, 2572 }; + + /** + * Constructs a new {@code ShopNPC} {@code Object}. + */ + public ShopNPC() { + super(0, null, true); + } + + /** + * Constructs a new {@code ShopNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private ShopNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public void init() { + super.init(); + setWalks(true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ShopNPC(id, location); + } + + @Override + public int getWalkRadius() { + return 3; + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/SkippyNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/SkippyNPC.java new file mode 100644 index 000000000..88bdfbc2c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/SkippyNPC.java @@ -0,0 +1,48 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the NPC skippy. + * @author Vexia + */ +@Initializable +public class SkippyNPC extends AbstractNPC { + + /** + * Constructs a new {@code SkippyNPC} {@code Object} + * @param id the id. + * @param location the location. + */ + public SkippyNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code SkippyNPC} {@code Object} + */ + public SkippyNPC() { + this(2796, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SkippyNPC(id, location); + } + + @Override + public void tick() { + if (RandomFunction.random(100) < 15) { + sendChat("You can skip the tutorial by talking to me!"); + } + } + + @Override + public int[] getIds() { + return new int[] { 2796 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/SorceressElementalNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/SorceressElementalNPC.java new file mode 100644 index 000000000..213f83244 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/SorceressElementalNPC.java @@ -0,0 +1,262 @@ +package core.game.node.entity.npc.other; + +import java.util.List; + +import core.game.component.Component; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the elementals npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SorceressElementalNPC extends AbstractNPC { + /** + * Represents the definitions of the elementals. + * @author Sonicforce41 + * @version 1.0 + */ + enum ElementalDefinition { + + /** + * The definition values + */ + ID5533(5533, new Location[] { new Location(2908, 5460, 0), new Location(2898, 5460, 0) }), + ID5534(5534, new Location[] { new Location(2900, 5448, 0), new Location(2900, 5455, 0) }), + ID5535(5535, new Location[] { new Location(2905, 5449, 0), new Location(2899, 5449, 0) }), + ID5536(5536, new Location[] { new Location(2903, 5451, 0), new Location(2903, 5455, 0), new Location(2905, 5455, 0), new Location(2905, 5451, 0) }), + ID5537(5537, new Location[] { new Location(2903, 5457, 0), new Location(2917, 5457, 0) }), + ID5538(5538, new Location[] { new Location(2908, 5455, 0), new Location(2917, 5455, 0) }), + ID5539(5539, new Location[] { new Location(2922, 5471, 0), new Location(2922, 5459, 0) }), + ID5540(5540, new Location[] { new Location(2924, 5463, 0), new Location(2928, 5463, 0), new Location(2928, 5461, 0), new Location(2924, 5461, 0) }), + ID5541(5541, new Location[] { new Location(2924, 5461, 0), new Location(2926, 5461, 0), new Location(2926, 5458, 0), new Location(2924, 5458, 0) }), + ID5542(5542, new Location[] { new Location(2928, 5458, 0), new Location(2928, 5460, 0), new Location(2934, 5460, 0), new Location(2934, 5458, 0) }), + ID5543(5543, new Location[] { new Location(2931, 5477, 0), new Location(2931, 5470, 0) }), + ID5544(5544, new Location[] { new Location(2935, 5469, 0), new Location(2928, 5469, 0) }), + ID5545(5545, new Location[] { new Location(2925, 5464, 0), new Location(2925, 5475, 0) }), + ID5546(5546, new Location[] { new Location(2931, 5477, 0), new Location(2931, 5470, 0) }), + ID5547(5547, new Location[] { new Location(2907, 5488, 0), new Location(2907, 5482, 0) }), + ID5548(5548, new Location[] { new Location(2907, 5490, 0), new Location(2907, 5495, 0) }), + ID5549(5549, new Location[] { new Location(2910, 5493, 0), new Location(2910, 5487, 0) }), + ID5550(5550, new Location[] { new Location(2918, 5483, 0), new Location(2918, 5485, 0), new Location(2915, 5485, 0), new Location(2915, 5483, 0), new Location(2912, 5483, 0), new Location(2912, 5485, 0), new Location(2915, 5485, 0), new Location(2915, 5483, 0) }), + ID5551(5551, new Location[] { new Location(2921, 5486, 0), new Location(2923, 5486, 0), new Location(2923, 5490, 0), new Location(2923, 5486, 0) }), + ID5552(5552, new Location[] { new Location(2921, 5491, 0), new Location(2923, 5491, 0), new Location(2923, 5495, 0), new Location(2921, 5495, 0) }), + ID5553(5553, new Location[] { new Location(2899, 5466, 0), new Location(2899, 5468, 0), new Location(2897, 5468, 0), new Location(2897, 5466, 0), new Location(2897, 5468, 0), new Location(2899, 5468, 0) }), + ID5554(5554, new Location[] { new Location(2897, 5470, 0), new Location(2891, 5470, 0) }), + ID5555(5555, new Location[] { new Location(2897, 5471, 0), new Location(2899, 5471, 0), new Location(2899, 5478, 0), new Location(2897, 5478, 0) }), + ID5556(5556, new Location[] { new Location(2896, 5483, 0), new Location(2900, 5483, 0), new Location(2900, 5480, 0), new Location(2897, 5480, 0), new Location(2897, 5481, 0), new Location(2896, 5481, 0), new Location(2896, 5482, 0) }), + ID5557(5557, new Location[] { new Location(2896, 5483, 0), new Location(2896, 5481, 0), new Location(2891, 5481, 0), new Location(2891, 5483, 0) }), + ID5558(5558, new Location[] { new Location(2889, 5485, 0), new Location(2900, 5485, 0) }); + /** + * The NPC id + */ + private int npcId; + + /** + * The Locations + */ + private Location[] locations; + + /** + * Constructs a new {@code Elementals} {@code Object}. + * @param id the id. + * @param locations the locations. + */ + ElementalDefinition(int id, Location[] locations) { + npcId = id; + this.locations = locations; + } + + /** + * Gets the npcId + * @return 'npcId' + */ + public int getId() { + return npcId; + } + + /** + * Gets the locations to walk + * @return the Locations + */ + public Location[] getLocation() { + return locations; + } + + /** + * Gets the elemental definition by the id. + * @param id the id. + * @return the elemental definition. + */ + static ElementalDefinition forId(int id) { + for (ElementalDefinition def : ElementalDefinition.values()) + if (def != null) + if (def.getId() == id) + return def; + return null; + } + + } + + /** + * The Definition + */ + private ElementalDefinition definition; + + /** + * Index of current steps + */ + private int tilesIndex = 0; + + /** + * Constructs a new Elementals object. + */ + public SorceressElementalNPC() { + super(5533, null); + } + + /** + * Constructs a new Elementals object. + * @param id the id. + * @param location the location. + */ + public SorceressElementalNPC(int id, Location location) { + super(id, location); + } + + /** + * Checks if the entity can teleport. + * @param t the entity. + * @return {@code True} if so. + */ + public boolean canTeleport(Entity t) { + if (getDirection() == Direction.EAST && (t.getLocation().getX() - getLocation().getX()) < 4 && (t.getLocation().getX() - getLocation().getX()) > -1 && (t.getLocation().getY() - getLocation().getY()) == 0) + return true; + if (getDirection() == Direction.WEST && (getLocation().getX() - t.getLocation().getX()) < 4 && (getLocation().getX() - t.getLocation().getX()) > -1 && (t.getLocation().getY() - getLocation().getY()) == 0) + return true; + if (getDirection() == Direction.NORTH && (t.getLocation().getY() - getLocation().getY()) < 4 && (t.getLocation().getY() - getLocation().getY()) > -1 && (t.getLocation().getX() - getLocation().getX()) == 0) + return true; + if (getDirection() == Direction.SOUTH && (getLocation().getY() - t.getLocation().getY()) < 4 && (getLocation().getY() - t.getLocation().getY()) > -1 && (t.getLocation().getX() - getLocation().getX()) == 0) + return true; + return false; + } + + @Override + public void configure() { + super.configure(); + definition = ElementalDefinition.forId(getId()); + if (definition != null) { + configureMovementPath(definition.getLocation()); + setWalks(true); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SorceressElementalNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 5533, 5534, 5535, 5536, 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, 5545, 5546, 5547, 5548, 5549, 5550, 5551, 5552, 5553, 5554, 5555, 5556, 5557, 5558 }; + } + + /** + * Gets the respawn loc. + * @return the loc. + */ + public Location getRespawnLocation() { + Location respawn = null; + if (getId() >= 5533 && getId() <= 5538) + respawn = Location.create(2913, 5467, 0); + else if (getId() >= 5539 && getId() <= 5546) + respawn = Location.create(2916, 5473, 0); + else if (getId() >= 5547 && getId() <= 5552) + respawn = Location.create(2910, 5476, 0); + else if (getId() >= 5553 && getId() <= 5558) + respawn = Location.create(2907, 5470, 0); + return respawn; + } + + /** + * Gets the tilesIndex. + * @return The tilesIndex. + */ + public int getTilesIndex() { + return tilesIndex; + } + + @Override + public void tick() { + super.tick(); + List players = getViewport().getCurrentPlane().getPlayers(); + for (Player player : players) { + if (player == null || !player.isActive() || player.getLocks().isInteractionLocked() || DeathTask.isDead(player) || !canTeleport(player) || !CombatSwingHandler.isProjectileClipped(this, player, false)) { + continue; + } + animate(new Animation(5803)); + sendTeleport(player); + } + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return super.newInstance(arg); + } + + /** + * Sends a teleport to the Player + * @param player the Player + */ + public void sendTeleport(final Player player) { + player.lock(); + GameWorld.getPulser().submit(new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + player.getPacketDispatch().sendMessage("You've been spotted by an elemental and teleported out of its garden."); + player.graphics(new Graphics(110, 100)); + player.getInterfaceManager().openOverlay(new Component(115)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + face(player); + } else if (delay == 6) { + player.getProperties().setTeleportLocation(Location.create(getRespawnLocation())); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().close(); + face(null); + player.unlock(); + return true; + } + delay++; + return false; + } + }); + } + + /** + * Sets the tilesIndex. + * @param tilesIndex The tilesIndex to set. + */ + public void setTilesIndex(int tilesIndex) { + this.tilesIndex = tilesIndex; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/StrayDogNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/StrayDogNPC.java new file mode 100644 index 000000000..8a1bfc658 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/StrayDogNPC.java @@ -0,0 +1,122 @@ +package core.game.node.entity.npc.other; + +import java.util.ArrayList; +import java.util.List; + +import core.game.interaction.DestinationFlag; +import core.game.interaction.MovementPulse; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Pathfinder; +import core.game.world.map.zone.impl.BankZone; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the temple guardian npc. + * @author 'Vexia + */ +@Initializable +public class StrayDogNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 5918, 5917 }; + + /** + * Represents the target player. + */ + private Player target; + + /** + * Represents the delay. + */ + private long delay; + + /** + * Represents the array list of players. + */ + private List players = new ArrayList<>(); + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public StrayDogNPC() { + super(0, null, true); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private StrayDogNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new StrayDogNPC(id, location); + } + + @Override + public void tick() { + super.tick(); + if (delay < System.currentTimeMillis() && RandomFunction.random(1, 16) == 2) { + getPulseManager().clear(); + target = null; + players = RegionManager.getLocalPlayers(this, 7); + if (players.size() != 0) { + target = players.get(RandomFunction.random(players.size())); + getPulseManager().run(getFollowPulse(target), "movement"); + delay = System.currentTimeMillis() + 150000; + } + } + if (target != null && target.getZoneMonitor().isInZone("bank")) { + Pathfinder.find(this, getProperties().getSpawnLocation()).walk(this); + getPulseManager().clear(); + target = null; + delay = System.currentTimeMillis() + 150000; + } + } + + @Override + public Location getMovementDestination() { + return super.getMovementDestination(); + } + + @Override + public boolean canMove(Location l) { + if (BankZone.VARROCK_EAST.insideBorder(l) || BankZone.VARROCK_WEST.insideBorder(l)) { + return false; + } + return true; + } + + @Override + public int[] getIds() { + return ID; + } + + /** + * Gets the following pulse. + * @param target the target. + * @return the movement pulse. + */ + public MovementPulse getFollowPulse(final Player target) { + return new MovementPulse(this, target, DestinationFlag.FOLLOW_ENTITY) { + @Override + public boolean pulse() { + return false; + } + }; + } + + @Override + public int getWalkRadius() { + return 17; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/Student.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/Student.java new file mode 100644 index 000000000..3b4fedb10 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/Student.java @@ -0,0 +1,30 @@ +package core.game.node.entity.npc.other; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles interactions with exam center students, to address #106 + * @author ceik + */ +@Initializable +public class Student extends OptionHandler { + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(7153).getHandlers().put("option:talk-to",this); + NPCDefinition.forId(7154).getHandlers().put("option:talk-to",this); + NPCDefinition.forId(7155).getHandlers().put("option:talk-to",this); + NPCDefinition.forId(7156).getHandlers().put("option:talk-to",this); + NPCDefinition.forId(7157).getHandlers().put("option:talk-to",this); + return this; + } + public final boolean handle(Player player, Node node, String options){ + if(options.equals("talk-to")){ + player.getPacketDispatch().sendMessage("This student is trying to focus on their work."); + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/ThrowerTrollNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/ThrowerTrollNPC.java new file mode 100644 index 000000000..1d852be82 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/ThrowerTrollNPC.java @@ -0,0 +1,74 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.agg.AggressiveBehavior; +import core.game.node.entity.npc.agg.AggressiveHandler; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Handles a Thrower troll NPC. + * @author Emperor + */ +@Initializable +public final class ThrowerTrollNPC extends AbstractNPC { + + /** + * Constructs a new {@code ThrowerTrollNPC} {@code Object}. + */ + public ThrowerTrollNPC() { + super(1130, null); + } + + /** + * Constructs a new {@code ThrowerTrollNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + public ThrowerTrollNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public void setDefaultBehavior() { + super.setAggressive(true); + super.setAggressiveHandler(new AggressiveHandler(this, new AggressiveBehavior() { + + @Override + public boolean canSelectTarget(Entity entity, Entity target) { + if (!target.isActive() || DeathTask.isDead(target)) { + return false; + } + if (!target.getProperties().isMultiZone() && target.inCombat()) { + return false; + } + return true; + } + })); + getAggressiveHandler().setChanceRatio(8); + getAggressiveHandler().setRadius(7); + getDefinition().setCombatDistance(7); + super.setWalks(false); + super.getLocks().lockMovement(1 << 25); + } + + @Override + public void init() { + super.init(); + getProperties().getCombatPulse().setStyle(CombatStyle.RANGE); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ThrowerTrollNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 1101, 1102, 1103, 1104, 1105, 1130, 1131, 1132, 1133, 1134 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/TribesmanNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/TribesmanNPC.java new file mode 100644 index 000000000..ab9d4b545 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/TribesmanNPC.java @@ -0,0 +1,48 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.system.config.NPCConfigParser; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the tribesamn npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class TribesmanNPC extends AbstractNPC { + + /** + * Represents the npc ids. + */ + private static final int[] IDS = new int[] { 191, 2496, 2497 }; + + /** + * Constructs a new {@code TribesmanNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public TribesmanNPC(int id, Location location) { + super(id, location, true); + getDefinition().getHandlers().put(NPCConfigParser.POISONOUS, true); + } + + /** + * Constructs a new {@code TribesmanNPC} {@code Object}. + */ + public TribesmanNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TribesmanNPC(id, location); + } + + @Override + public int[] getIds() { + return IDS; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/TutorialChickenNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/TutorialChickenNPC.java new file mode 100644 index 000000000..bf09c9a59 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/TutorialChickenNPC.java @@ -0,0 +1,63 @@ +package core.game.node.entity.npc.other; + +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the tutorial chicken npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class TutorialChickenNPC extends AbstractNPC { + + /** + * Constructs a new {@code TutorialChickenNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public TutorialChickenNPC(int id, Location location) { + super(id, location, true); + } + + /** + * Constructs a new {@code TutorialChickenNPC} {@code Object}. + */ + public TutorialChickenNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TutorialChickenNPC(id, location); + } + + @Override + public void onImpact(Entity entity, BattleState state) { + super.onImpact(entity, state); + if (state.getStyle() == CombatStyle.MAGIC) { + final Player player = (Player) entity; + if (TutorialSession.getExtension(player).getStage() == 70) { + TutorialStage.load(player, 71, false); + } + } + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + } + + @Override + public int[] getIds() { + return new int[] { 41 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/VampireSlayerNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/VampireSlayerNPC.java new file mode 100644 index 000000000..cc4f30b36 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/VampireSlayerNPC.java @@ -0,0 +1,169 @@ +package core.game.node.entity.npc.other; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Handles the Vampie Slayer npc. + * @author 'Vexia + */ +@Initializable +public class VampireSlayerNPC extends AbstractNPC { + + /** + * Represents the stake item + */ + private static final Item STAKE = new Item(1549); + + /** + * Represents the hammer item. + */ + private static final Item HAMMER = new Item(2347); + + /** + * Represents the garlic item. + */ + private static final Item GARLIC = new Item(1550); + + /** + * Represents the locations that a candle is at. + */ + private static final Location[] CANDLE_LOCATION = new Location[] { Location.create(3076, 9772, 0), Location.create(3079, 9772, 0), Location.create(3075, 9778, 0), Location.create(3080, 9778, 0) }; + + /** + * Represents the force chat that the player will say if on fire. + */ + private static final String[] FORCE_CHAT = new String[] { "Eeek!", "Oooch!", "Gah!", "Ow!" }; + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 757 }; + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public VampireSlayerNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private VampireSlayerNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new VampireSlayerNPC(id, location); + } + + @Override + public void init() { + super.init(); + getSkills().setLifepoints(40); + getSkills().setStaticLevel(Skills.HITPOINTS, 40); + getSkills().setLevel(Skills.HITPOINTS, 40); + } + + @Override + public void tick() { + final Player p = getAttribute("player", null); + if (p != null) { + if (p.getLocation().getDistance(getLocation()) >= 16) { + clear(); + return; + } + if (!getProperties().getCombatPulse().isAttacking()) { + getProperties().getCombatPulse().attack(p); + } + if (p.getProperties().getCombatPulse().isAttacking() && p.getProperties().getCombatPulse().getVictim() == this) { + for (Location l : CANDLE_LOCATION) { + if (p.getLocation().equals(l)) { + p.sendChat(FORCE_CHAT[RandomFunction.random(FORCE_CHAT.length)]); + p.getPacketDispatch().sendMessage("The candles burn your feet!"); + break; + } + } + if (!p.getInventory().containsItem(HAMMER) || !p.getInventory().containsItem(STAKE)) { + getSkills().heal(10); + } + if (RandomFunction.random(7) == 2) { + getSkills().heal(RandomFunction.random(1, !p.getInventory().containsItem(GARLIC) ? 12 : 2)); + } + } + } + super.tick(); + } + + @Override + public void onImpact(Entity entity, BattleState state) { + if (entity instanceof Player) { + final Player p = ((Player) entity); + if (!p.getInventory().containsItem(HAMMER) || !p.getInventory().containsItem(STAKE)) { + getSkills().heal(10); + } + } + super.onImpact(entity, state); + } + + @Override + public void finalizeDeath(final Entity killer) { + setRespawn(false); + super.finalizeDeath(killer); + if (!(killer instanceof Player)) { + return; + } + final Player p = ((Player) killer); + final Quest quest = p.getQuestRepository().getQuest("Vampire Slayer"); + if (p.getInventory().containsItem(HAMMER) && p.getInventory().remove(STAKE)) { + if (quest.getStage(p) == 30) { + quest.finish(p); + p.getPacketDispatch().sendMessage("You hammer the stake into the vampire's chest!"); + } + } else { + p.getPacketDispatch().sendMessage("The vampire returns to his coffin. Next time use a stake and hammer."); + } + setRespawn(false); + } + + @Override + public void checkImpact(BattleState state) { + if (state.getAttacker() instanceof Player) { + Player p = (Player) state.getAttacker(); + if (!p.getInventory().containsItem(HAMMER) || !p.getInventory().containsItem(STAKE)) { + if (state.getEstimatedHit() > -1) { + state.setEstimatedHit(0); + } + if (state.getSecondaryHit() > -1) { + state.setSecondaryHit(0); + } + } + } + } + + @Override + public boolean isAttackable(final Entity entity, final CombatStyle style) { + final Player player = ((Player) entity); + final Player pl = getAttribute("player", null); + return pl == null ? false : pl == player ? true : false; + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/WerewolfNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/WerewolfNPC.java new file mode 100644 index 000000000..42c4c9527 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/WerewolfNPC.java @@ -0,0 +1,50 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the tutorial chicken npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WerewolfNPC extends AbstractNPC { + + /** + * Constructs a new {@code WerewolfNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public WerewolfNPC(int id, Location location) { + super(id, location, true); + } + + /** + * Constructs a new {@code WerewolfNPC} {@code Object}. + */ + public WerewolfNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new WerewolfNPC(id, location); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + NPC nn = NPC.create(getAttribute("original", 6026), getAttribute("loc", getLocation())); + nn.init(); + } + + @Override + public int[] getIds() { + return new int[] { 6006 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/ZombieNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/ZombieNPC.java new file mode 100644 index 000000000..510186043 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/ZombieNPC.java @@ -0,0 +1,56 @@ +package core.game.node.entity.npc.other; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Handles the zombie npc. + * @author Vexia + * + */ +@Initializable +public class ZombieNPC extends AbstractNPC { + + /** + * Constructs the {@code ZombieNPC} + */ + public ZombieNPC() { + super(0, null); + } + + /** + * Constructs the {@code ZombieNPC} + * @param id The id. + * @param location The location. + */ + public ZombieNPC(int id, Location location) { + super(id, location); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + Player player = killer.asPlayer(); + // Defeat a zombie in the sewers under the jail + if (player.getViewport().getRegion().getId() == 12438 || player.getViewport().getRegion().getId() == 12439) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 18); + } + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ZombieNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] {73, 74}; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/other/akharanu.java b/Server/src/main/java/Server/core/game/node/entity/npc/other/akharanu.java new file mode 100644 index 000000000..b838f5ece --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/other/akharanu.java @@ -0,0 +1,70 @@ +package core.game.node.entity.npc.other; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +@Initializable +public class akharanu extends DialoguePlugin { + public akharanu() {}; + public akharanu(Player player){super(player);} + @Override + public DialoguePlugin newInstance(Player player){return new akharanu(player);} + public boolean open(Object... args){ + npc("Hello, there, friend!"); + stage = 0; + return true; + } + @Override + public boolean handle(int componentId, int buttonId){ + switch(stage){ + case 0: + player.getDialogueInterpreter().sendOptions("Select one","Why are you, errr, so stiff?","Do you sell anything?"); + stage++; + break; + case 1: + switch(buttonId){ + case 1: + player("Why are you, errr, so stiff?"); + stage++; + break; + case 2: + player("Do you sell anything?"); + stage = 8; + break; + } + break; + case 2: + npc(FacialExpression.HALF_GUILTY,"I have extremely severe arthritis. It really sucks."); + stage++; + break; + case 3: + player("Oh. Well I'm sorry to hear that."); + stage++; + break; + case 4: + npc("Yes, thank you for your concern."); + stage++; + break; + case 5: + end(); + break; + case 8: + player("Do you sell anything?"); + stage++; + break; + case 9: + npc("Why, yes I do!"); + stage++; + break; + case 10: + end(); + new NPC(1688).openShop(player); + break; + } + return true; + } + public int[] getIds() {return new int[] {1688};} +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/quest/gertrudes_cat/FluffNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/quest/gertrudes_cat/FluffNPC.java new file mode 100644 index 000000000..a5309ab90 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/quest/gertrudes_cat/FluffNPC.java @@ -0,0 +1,55 @@ +package core.game.node.entity.npc.quest.gertrudes_cat; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the plugin used for the fluff npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FluffNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 2997 }; + + /** + * Constructs a new {@code FluffNPC} {@code Object}. + */ + public FluffNPC() { + super(0, null); + } + + /** + * Constructs a new {@code FluffNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private FluffNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new FluffNPC(id, location); + } + + @Override + public boolean isHidden(final Player player) { + if (player.getQuestRepository().getQuest("Gertrude's Cat").getStage(player) < 20) { + return true; + } + return player.getAttribute("hidefluff", 0L) > System.currentTimeMillis(); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.java new file mode 100644 index 000000000..c233b0458 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/quest/pirates_treasure/GardenerNPC.java @@ -0,0 +1,90 @@ +package core.game.node.entity.npc.quest.pirates_treasure; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the abstract garden npc used for pirates treasure. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GardenerNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 1217 }; + + /** + * Constructs a new {@code GardenerNPC} {@code Object}. + */ + public GardenerNPC() { + super(0, null, true); + } + + /** + * Constructs a new {@code RomeoNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private GardenerNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new GardenerNPC(id, location); + } + + @Override + public void tick() { + super.tick(); + if (getAttribute("target", null) != null) { + final Player target = (Player) getAttribute("target", null); + if (getProperties().getCombatPulse().isRunning()) { + getProperties().getCombatPulse().attack(target); + } + if (!target.isActive() || target.getLocation().getDistance(getLocation()) > 16) { + GameWorld.getPulser().submit(new Pulse(2) { + @Override + public boolean pulse() { + clear(); + return true; + } + }); + } + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + final Player target = getAttribute("target", null); + if (target != entity) { + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public void finalizeDeath(final Entity killer) { + final Player target = getAttribute("target", null); + if (target != null && target == killer) { + target.getSavedData().getQuestData().setGardenerAttack(true); + } + ; + super.finalizeDeath(killer); + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/quest/priest_in_peril/MonkOfZamorakNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/quest/priest_in_peril/MonkOfZamorakNPC.java new file mode 100644 index 000000000..59faeea66 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/quest/priest_in_peril/MonkOfZamorakNPC.java @@ -0,0 +1,71 @@ +package core.game.node.entity.npc.quest.priest_in_peril; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the monk of zamorak npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MonkOfZamorakNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 1046 }; + + /** + * Represents the golden key. + */ + private static final Item GOLDEN_KEY = new Item(2944, 1); + + /** + * Constructs a new {@code MonkOfZamorakNPC} {@code Object}. + */ + public MonkOfZamorakNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private MonkOfZamorakNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MonkOfZamorakNPC(id, location); + } + + @Override + public void tick() { + super.tick(); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + final Player p = ((Player) killer); + final Quest quest = p.getQuestRepository().getQuest("Priest in Peril"); + if (quest.isStarted(p)) { + GroundItemManager.create(GOLDEN_KEY, getLocation(), p); + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/quest/priest_in_peril/TempleGuardianNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/quest/priest_in_peril/TempleGuardianNPC.java new file mode 100644 index 000000000..2a05f58fd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/quest/priest_in_peril/TempleGuardianNPC.java @@ -0,0 +1,63 @@ +package core.game.node.entity.npc.quest.priest_in_peril; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Handles the temple guardian npc. + * @author 'Vexia + */ +@Initializable +public class TempleGuardianNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 7711 }; + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public TempleGuardianNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private TempleGuardianNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TempleGuardianNPC(id, location); + } + + @Override + public void tick() { + super.tick(); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + final Player p = ((Player) killer); + final Quest quest = p.getQuestRepository().getQuest("Priest in Peril"); + if (quest.getStage(p) == 11) { + quest.setStage(p, 12); + } + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/quest/romeo__juliet/JulietNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/quest/romeo__juliet/JulietNPC.java new file mode 100644 index 000000000..55d9d1867 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/quest/romeo__juliet/JulietNPC.java @@ -0,0 +1,52 @@ +package core.game.node.entity.npc.quest.romeo__juliet; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.game.world.map.Location; + +/** + * Represents the juliet npc. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class JulietNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 637 }; + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + */ + public JulietNPC() { + super(0, null); + } + + /** + * Constructs a new {@code AlKharidWarriorPlugin} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private JulietNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new JulietNPC(id, location); + } + + @Override + public boolean isHidden(final Player player) { + return player.getQuestRepository().getQuest("Romeo & Juliet").getStage(player) > 60 && player.getQuestRepository().getQuest("Romeo & Juliet").getStage(player) < 100; + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/quest/romeo__juliet/RomeoNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/quest/romeo__juliet/RomeoNPC.java new file mode 100644 index 000000000..bcf29ec6d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/quest/romeo__juliet/RomeoNPC.java @@ -0,0 +1,74 @@ +package core.game.node.entity.npc.quest.romeo__juliet; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Represents the abstract romeo npc. + * @author 'Vexia + */ +@Initializable +public class RomeoNPC extends AbstractNPC { + + /** + * The NPC ids of NPCs using this plugin. + */ + private static final int[] ID = { 639 }; + + /** + * Represents the delay of speaking to a random player. + */ + private static int speakDelay; + + /** + * Constructs a new {@code RomeoNPC} {@code Object}. + */ + public RomeoNPC() { + super(0, null, true); + } + + /** + * Constructs a new {@code RomeoNPC} {@code Object}. + * @param id The NPC id. + * @param location The location. + */ + private RomeoNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new RomeoNPC(id, location); + } + + @Override + public void init() { + setWalks(true); + super.init(); + setWalks(true); + } + + @Override + public void tick() { + super.tick(); + /*if (speakDelay < GameWorld.getTicks()) { + speakDelay = GameWorld.getTicks() + 30; + for (Player p : RegionManager.getLocalPlayers(this, 2)) { + if (!p.getInterfaceManager().isOpened() && RandomFunction.random(0, 8) == 2 && p.getQuestRepository().getQuest("Romeo & Juliet").getStage(p) == 0) { + if (p.getDialogueInterpreter().getDialogue() != null || p.getDialogueInterpreter().getDialogueStage() != null) { + continue; + } + p.getDialogueInterpreter().open(this.getId(), this); + return; + } + } + }*/ + } + + @Override + public int[] getIds() { + return ID; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/revenant/CorruptEquipment.java b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/CorruptEquipment.java new file mode 100644 index 000000000..59a7641f1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/CorruptEquipment.java @@ -0,0 +1,43 @@ +package core.game.node.entity.npc.revenant; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.DegradableEquipment; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.PluginManager; + +/** + * Handles the degrading of corrupt equipment. + * @author Vexia + * + */ +public class CorruptEquipment extends DegradableEquipment { + + /** + * Constructs a new @{Code CorruptEquipment} object. + * @param slot The slot. + * @param itemIds The item ids. + */ + public CorruptEquipment(int slot, int[] itemIds) { + super(slot, itemIds); + } + + /** + * Initializes the corrupt equipment degarding. + */ + public static void init() { + PluginManager.definePlugin(new CorruptEquipment(EquipmentContainer.SLOT_CHEST, new int[] {13958, 13960})); + } + + @Override + public void degrade(Player player, Entity entity, Item item) { + + } + + @Override + public int getDropItem(int itemId) { + return 0; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/revenant/PVPEquipment.java b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/PVPEquipment.java new file mode 100644 index 000000000..1d691864b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/PVPEquipment.java @@ -0,0 +1,42 @@ +package core.game.node.entity.npc.revenant; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.DegradableEquipment; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.PluginManager; + +/** + * Handles the degrading of PVP armour. + * @author Vexia + * + */ +public class PVPEquipment extends DegradableEquipment { + + /** + * Constructs a new @{Code PVPEquipment} object. + * @param slot The slot. + * @param itemIds The item ids. + */ + public PVPEquipment(int slot, int[] itemIds) { + super(slot, itemIds); + } + + /** + * Initializes the PVP equipment degrading. + */ + public static void init() { + PluginManager.definePlugin(new PVPEquipment(1, null)); + } + + @Override + public void degrade(Player player, Entity entity, Item item) { + + } + + @Override + public int getDropItem(int itemId) { + return 0; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantCombatHandler.java b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantCombatHandler.java new file mode 100644 index 000000000..5ff3e0dc5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantCombatHandler.java @@ -0,0 +1,103 @@ +package core.game.node.entity.npc.revenant; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.entity.state.EntityState; +import core.game.world.GameWorld; +import core.game.world.map.zone.impl.WildernessZone; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles the multi swing combat handler for revenants. + * @author Vexia + */ +public class RevenantCombatHandler extends MultiSwingHandler { + + /** + * The magic graphics. + */ + private static final Graphics MAGIC_GRAPHIC = Graphics.create(1276); + + /** + * The range graphics. + */ + private static final Graphics RANGE_GRAPHIC = Graphics.create(1278); + + /** + * Constructs a new {@code RevenantCombatHandler} {@code Object} + */ + public RevenantCombatHandler(Animation meleeAnimation, Animation magicAnimation, Animation rangeAnimation) { + super(true, new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), meleeAnimation), new SwitchAttack(CombatStyle.RANGE.getSwingHandler(), rangeAnimation, createProjectile(RANGE_GRAPHIC)), new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), magicAnimation, createProjectile(MAGIC_GRAPHIC))); + } + + @Override + public void visualizeImpact(Entity entity, Entity victim, BattleState state) { + if (victim instanceof Player) { + SwitchAttack attack = getCurrent(); + if (attack != null) { + if (attack.getStyle() == CombatStyle.RANGE) { + victim.asPlayer().getAudioManager().send(4061, true); + } + } + } + super.visualizeImpact(entity, victim, state); + } + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (victim instanceof Player) { + SwitchAttack attack = getCurrent(); + if (attack != null) { + if (attack.getStyle() == CombatStyle.RANGE && victim.getAttribute("freeze_immunity", -1) < GameWorld.getTicks()) { + victim.getStateManager().set(EntityState.FROZEN, 16, "The icy darts freeze your muscles!"); + victim.asPlayer().getAudioManager().send(4059, true); + } else if (attack.getStyle() == CombatStyle.MAGIC) { + int ticks = 500; + if (victim.asPlayer().getPrayer().get(PrayerType.PROTECT_FROM_MAGIC)) { + ticks /= 2; + } + if (victim.getStateManager().hasState(EntityState.TELEBLOCK)) { + victim.asPlayer().getAudioManager().send(4064, true); + } else { + victim.getStateManager().set(EntityState.TELEBLOCK, ticks); + } + } + } + } + if (!victim.getStateManager().hasState(EntityState.POISONED) && (WildernessZone.getWilderness(entity) >= 50 || entity.getId() == 6998)) { + victim.getStateManager().register(EntityState.POISONED, false, 68, entity); + } + super.impact(entity, victim, state); + } + + @Override + public void visualize(Entity entity, Entity victim, BattleState state) { + super.visualize(entity, victim, state); + if (victim.isPlayer()) { + SwitchAttack attack = getCurrent(); + if (attack != null) { + if (attack.getStyle() == CombatStyle.MAGIC) { + victim.asPlayer().getAudioManager().send(202, true); + } else if (attack.getStyle() == CombatStyle.RANGE) { + victim.asPlayer().getAudioManager().send(4062, true); + } + } + } + } + + /** + * Creates a projectile with a graphic id. + * @param graphic the graphic. + * @return the projectile. + */ + public static Projectile createProjectile(Graphics graphic) { + return Projectile.create(null, null, graphic.getId(), 48, 36, 34, 20); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantNPC.java b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantNPC.java new file mode 100644 index 000000000..8783ab170 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantNPC.java @@ -0,0 +1,289 @@ +package core.game.node.entity.npc.revenant; + +import core.game.system.config.NPCConfigParser; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Pathfinder; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.impl.WildernessZone; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +/** + * Handles a revenant NPC. + * @author Vexia + */ +public class RevenantNPC extends AbstractNPC { + + /** + * The safe zone borders. + */ + private static final ZoneBorders[] SAFE_ZONES = new ZoneBorders[] { new ZoneBorders(3074, 3651, 3193, 3774), new ZoneBorders(3264, 3672, 3279, 3695), new ZoneBorders(3081, 3909, 3129, 3954), new ZoneBorders(3350, 3869, 3391, 3900) }; + + /** + * The possible PVP item drops. + */ + private static final int[] PVP_DROPS = new int[] { 13896, 13884, 13890, 13902, 13887, 13899, 13893, 13905, 13864, 13858, 13861, 13867, 13876, 13879, 13870, 13873, 13883, 13908, 13911, 13914, 13917, 13920, 13923, 13926, 13929, 13932, 13935, 13938, 13941, 13944, 13947, 13950, 13953, 13958, 13961, 13964, 13967, 13970, 13973, 13976, 13979, 13982, 13985, 13988 }; + + /** + * The swing handler. + */ + private CombatSwingHandler swingHandler; + + /** + * The revenant type. + */ + private final RevenantType type; + + /** + * The routes this revenant can travel. + */ + private final Location[][] routes; + + /** + * Constructs a new {@code RevenantNPC} {@code Object} + * @param id the id. + * @param location the location. + */ + public RevenantNPC(int id, Location location, Location[][] routes) { + super(id, location); + this.routes = routes; + this.type = RevenantType.forId(id); + } + + /** + * Constructs a new {@code RevenantNPC} {@code Object} + */ + public RevenantNPC() { + this(-1, null, null); + } + + @Override + public void configure() { + setWalks(true); + setRespawn(false); + setAggressive(true); + setDefaultBehavior(); + getAggressiveHandler().setRadius(64 * 2); + getAggressiveHandler().setChanceRatio(9); + getAggressiveHandler().setAllowTolerance(false); + getProperties().setCombatTimeOut(120); + configureRoute(); + super.configure(); + configureBonuses(); + this.swingHandler = new RevenantCombatHandler(getProperties().getAttackAnimation(), getProperties().getMagicAnimation(), getProperties().getRangeAnimation()); + } + + @Override + public void init() { + super.init(); + RevenantPlugin.getRevenants().add(this); + int spawnAnim = getDefinition().getConfiguration(NPCConfigParser.SPAWN_ANIMATION, -1); + if (spawnAnim != -1) { + animate(new Animation(spawnAnim)); + } + } + + @Override + public void clear() { + super.clear(); + RevenantPlugin.getRevenants().remove(this); + RevenantPlugin.spawn(); + } + + @Override + public void finalizeDeath(Entity killer) { + Location itemLoc = getLocation(); + super.finalizeDeath(killer); + if (killer instanceof Player) { + killer.asPlayer().getAudioManager().send(4063, true); + } + } + + @Override + public void handleTickActions() { + if (!DeathTask.isDead(this) && getSkills().getLifepoints() <= (getSkills().getStaticLevel(Skills.HITPOINTS) / 2) && getAttribute("eat-delay", 0) < GameWorld.getTicks()) { + lock(3); + getProperties().getCombatPulse().delayNextAttack(3); + getSkills().heal(10); + for (Player p : RegionManager.getLocalPlayers(this)) { + p.getAudioManager().send(2393); + } + setAttribute("eat-delay", GameWorld.getTicks() + 6); + } + if (!getLocks().isMovementLocked()) { + if (!getPulseManager().hasPulseRunning() && !getProperties().getCombatPulse().isAttacking() && !getProperties().getCombatPulse().isInCombat() && nextWalk < GameWorld.getTicks()) { + setNextWalk(); + Location l = getMovementDestination(); + if (canMove(l)) { + Pathfinder.find(this, l, true, Pathfinder.SMART).walk(this); + } + } + } + if (aggressiveHandler != null && aggressiveHandler.selectTarget()) { + return; + } + } + + @Override + public void sendImpact(BattleState state) { + if (state.getEstimatedHit() > type.getMaxHit()) { + state.setEstimatedHit(RandomFunction.random(type.getMaxHit() - 5, type.getMaxHit())); + } + } + + @Override + public Audio getAudio(int index) { + return null; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new RevenantNPC(id, location, null); + } + + @Override + public void setNextWalk() { + nextWalk = GameWorld.getTicks() + RandomFunction.random(7, 15); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return swingHandler; + } + + @Override + public boolean canMove(Location location) { + for (ZoneBorders zone : SAFE_ZONES) { + if (zone.insideBorder(location)) { + return false; + } + } + return true; + } + + @Override + protected Location getMovementDestination() { + if (!pathBoundMovement || movementPath == null || movementPath.length < 1) { + return getLocation().transform(-5 + RandomFunction.random(getWalkRadius()), -5 + RandomFunction.random(getWalkRadius()), 0); + } + Location l = movementPath[movementIndex++]; + if (movementIndex == movementPath.length) { + movementIndex = 0; + } + return l; + } + + @Override + public int getWalkRadius() { + return 20; + } + + @Override + public boolean continueAttack(Entity target, CombatStyle style) { + return target instanceof Player ? checkCombatLevel(target.asPlayer()) : true; + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity.asPlayer().isArtificial()) { + return false; + } + if (entity instanceof Player) { + if (!checkCombatLevel(entity.asPlayer()) && !entity.asPlayer().isAdmin()) { + entity.asPlayer().sendMessage("The level difference between you and your opponent is too great."); + return false; + } + } + if (entity instanceof Familiar) { + Player owner = ((Familiar) entity).getOwner(); + if (owner == null) { + return false; + } + if (!checkCombatLevel(owner)) { + return false; + } + } + return super.isAttackable(entity, style); + } + + @Override + public boolean canSelectTarget(Entity target) { + if (!(target instanceof Player)) { + return false; + } + return checkCombatLevel(target.asPlayer()); + } + + @Override + public int[] getIds() { + return new int[] { 6604, 6635, 6655, 6666, 6677, 6697, 6703, 6715, 6605, 6612, 6616, 6620, 6636, 6637, 6638, 6639, 6651, 6656, 6657, 6658, 6667, 6678, 6679, 6680, 6681, 6693, 6698, 6699, 6704, 6705, 6706, 6707, 6716, 6717, 6718, 6719, 6606, 6621, 6628, 6640, 6659, 6682, 6694, 6708, 6720, 6622, 6631, 6641, 6660, 6668, 6683, 6709, 6721, 6608, 6642, 6661, 6684, 6710, 6722, 6727, 6613, 6623, 6643, 6652, 6662, 6669, 6671, 6674, 6685, 6695, 6700, 6711, 6723, 6607, 6609, 6614, 6617, 6625, 6632, 6644, 6663, 6675, 6686, 6701, 6712, 6724, 6728, 6645, 6687, 6646, 6688, 6647, 6689, 6610, 6615, 6618, 6624, 6626, 6629, 6633, 6648, 6653, 6664, 6670, 6672, 6690, 6696, 6702, 6713, 6725, 6729, 6649, 6691, 6611, 6619, 6627, 6630, 6634, 6650, 6654, 6665, 6673, 6676, 6692, 6714, 6726, 6730, 6998, 6999 }; + } + + /** + * Configures the bonuses, + */ + @SuppressWarnings("deprecation") + private void configureBonuses() { + for (int i = 0; i < getProperties().getBonuses().length; i++) { + getProperties().getBonuses()[i] = 40 + (4 * (getProperties().getCombatLevel() / 2)); + } + } + + /** + * Configures a route for the revenant. + */ + private void configureRoute() { + if (routes == null || routes.length == 0) { + return; + } + configureMovementPath(RandomFunction.getRandomElement(routes)); + } + + /** + * Checks if the combat level of a revenant is acceptable to attack the + * player. + * @param player the player. + * @return {@code True} if so. + */ + private boolean checkCombatLevel(Player player) { + int level = WildernessZone.getWilderness(this); + if (player.getSkullManager().getLevel() < level) { + level = player.getSkullManager().getLevel(); + } + int combat = getProperties().getCurrentCombatLevel(); + int targetCombat = player.getProperties().getCurrentCombatLevel(); + if (combat - level > targetCombat || combat + level < targetCombat) { + return false; + } + return true; + } + + /** + * Gets the routes. + * @return the routes + */ + public Location[][] getRoutes() { + return routes; + } + + /** + * Gets the type. + * @return the type + */ + public RevenantType getType() { + return type; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantPlugin.java b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantPlugin.java new file mode 100644 index 000000000..26a2ced48 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantPlugin.java @@ -0,0 +1,90 @@ +package core.game.node.entity.npc.revenant; + +import java.util.ArrayList; +import java.util.List; + +import core.game.node.entity.npc.NPC; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the revenants. + * @author Vexia + */ +@Initializable +public class RevenantPlugin implements Plugin { + + /** + * The revenants npc. + */ + private static final List REVENANTS = new ArrayList<>(); + + /** + * The spawning locations. + */ + private static final Location[] SPAWN_LOCATIONS = new Location[] { new Location(2968, 3695), new Location(2956, 3716), new Location(2969, 3753), new Location(2967, 3817), new Location(2976, 3849), new Location(2976, 3725), new Location(2973, 3576), new Location(2982, 3850), new Location(3348, 3822), new Location(3362, 3808), new Location(3026, 3734), new Location(2961, 3792), new Location(2984, 3801), new Location(2974, 3744), new Location(2984, 3718), new Location(2990, 3695), new Location(2960, 3590), new Location(3020, 3674), new Location(3019, 3723), new Location(3019, 3822), Location.create(3123, 3567, 0), Location.create(3123, 3567, 0), Location.create(3201, 3678, 0), Location.create(3220, 3755, 0), Location.create(3249, 3882, 0), Location.create(3283, 3893, 0), Location.create(3034, 3938, 0), Location.create(2964, 3617, 0), Location.create(3253, 3922, 0), Location.create(3205, 3907, 0), Location.create(3194, 3895, 0), Location.create(3168, 3788, 0), Location.create(3287, 3557, 0), Location.create(3327, 3558, 0), Location.create(3364, 3536, 0), Location.create(3262, 3595, 0), Location.create(3099, 3957, 0), Location.create(3028, 3915, 0), Location.create(3285, 3922, 0), Location.create(2980, 3855, 0), Location.create(3243, 3917, 0), Location.create(3190, 3630, 0), Location.create(3188, 3585, 0), Location.create(3117, 3590, 0), Location.create(3136, 3624, 0), Location.create(3356, 3701, 0) }; + + /** + * The maximum amount of revenants spawned. + */ + private static final int MAX = 20; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new RevenantNPC()); + //CorruptEquipment.init(); + //PVPEquipment.init(); + spawn(); + return this; + } + + /** + * Spawns the revenants. + */ + public static void spawn() { + int size = REVENANTS.size(); + int left = MAX - size; + List taken = new ArrayList<>(); + for (NPC n : REVENANTS) { + taken.add(n.getProperties().getSpawnLocation()); + } + if (left > 0) { + int spawnAmount = RandomFunction.random(1, left); + if (size == 0) { + spawnAmount = MAX; + } + for (int i = 0; i < spawnAmount; i++) { + Location loc = null; + while (loc == null) { + Location l = RandomFunction.getRandomElement(SPAWN_LOCATIONS); + if (taken.contains(l)) { + continue; + } + loc = l; + } + taken.add(loc); + RevenantType type = RandomFunction.getRandomElement(RevenantType.values()); + int id = type.getIds()[0]; + NPC revenant = NPC.create(id, loc); + revenant.init(); + } + } + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Gets the revenants. + * @return the revenants + */ + public static List getRevenants() { + return REVENANTS; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantType.java b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantType.java new file mode 100644 index 000000000..2b3322560 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/npc/revenant/RevenantType.java @@ -0,0 +1,61 @@ +package core.game.node.entity.npc.revenant; + +/** + * A revenant type. + * @author Vexia + */ +public enum RevenantType { + IMP(8, 6604, 6635, 6655, 6666, 6677, 6697, 6703, 6715), GOBLIN(12, 6605, 6612, 6616, 6620, 6636, 6637, 6638, 6639, 6651, 6656, 6657, 6658, 6667, 6678, 6679, 6680, 6681, 6693, 6698, 6699, 6704, 6705, 6706, 6707, 6716, 6717, 6718, 6719), ICEFIEND(20, 6606, 6621, 6628, 6640, 6659, 6682, 6694, 6708, 6720), PYREFIEND(20, 6622, 6631, 6641, 6660, 6668, 6683, 6709, 6721), HOGOBLIN(20, 6608, 6642, 6661, 6684, 6710, 6722, 6727), VAMPYRE(22, 6613, 6623, 6643, 6652, 6662, 6669, 6671, 6674, 6685, 6695, 6700, 6711, 6723), WEREWOLF(23, 6607, 6609, 6614, 6617, 6625, 6632, 6644, 6663, 6675, 6686, 6701, 6712, 6724, 6728), CYCLOPS(24, 6645, 6687), HELLHOUND(25, 6646, 6688), DEMON(25, 6647, 6689), ORK(31, 6610, 6615, 6618, 6624, 6626, 6629, 6633, 6648, 6653, 6664, 6670, 6672, 6690, 6696, 6702, 6713, 6725, 6729), DARK_BEAST(36, 6649, 6691), KNIGHT(42, 6611, 6619, 6627, 6630, 6634, 6650, 6654, 6665, 6673, 6676, 6692, 6714, 6726, 6730), DRAGON(60, 6998, 6999); + + /** + * The max hit. + */ + private final int maxHit; + + /** + * The ids of the revenant. + */ + private final int[] ids; + + /** + * Constructs a new {@code RevenantType} {@code Object} + * @param maxHit the max hit. + * @param ids the ids. + */ + private RevenantType(int maxHit, int... ids) { + this.maxHit = maxHit; + this.ids = ids; + } + + /** + * Gets the revenant type by the id. + * @param id the id. + * @return the type. + */ + public static RevenantType forId(int id) { + for (RevenantType type : values()) { + for (int i : type.getIds()) { + if (i == id) { + return type; + } + } + } + return null; + } + + /** + * Gets the ids. + * @return the ids. + */ + public int[] getIds() { + return ids; + } + + /** + * Gets the maxHit. + * @return the maxHit + */ + public int getMaxHit() { + return maxHit; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/Player.java b/Server/src/main/java/Server/core/game/node/entity/player/Player.java new file mode 100644 index 000000000..7ce0fcd9d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/Player.java @@ -0,0 +1,1387 @@ +package core.game.node.entity.player; + +import java.util.*; + +import core.ServerConstants; +import core.game.VarpManager; +import core.game.component.Component; +import core.game.container.Container; +import core.game.container.impl.BankContainer; +import core.game.container.impl.EquipmentContainer; +import core.game.container.impl.InventoryListener; +import core.game.node.entity.combat.equipment.EquipmentDegrader; +import core.game.node.entity.state.newsys.State; +import core.game.node.entity.state.newsys.StateRepository; +import core.game.system.task.Pulse; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; +import core.tools.TickUtilsKt; +import core.game.content.ame.AntiMacroHandler; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.ge.PlayerGrandExchange; +import core.game.node.entity.skill.runecrafting.PouchManager; +import core.game.content.ttrail.TreasureTrailManager; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.construction.HouseManager; +import core.game.node.entity.skill.hunter.HunterManager; +import core.game.node.entity.skill.slayer.SlayerManager; +import core.game.node.entity.skill.summoning.familiar.FamiliarManager; +import core.game.interaction.Interaction; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.handlers.ChinchompaSwingHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.info.PlayerDetails; +import core.game.node.entity.player.info.RenderInfo; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.info.UIDInfo; +import core.game.node.entity.player.info.login.LoginConfiguration; +import core.game.node.entity.player.link.BankPinManager; +import core.game.content.quest.miniquest.barcrawl.BarcrawlManager; +import core.game.node.entity.player.link.ConfigurationManager; +import core.game.node.entity.player.link.GlobalData; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.entity.player.link.InterfaceManager; +import core.game.node.entity.player.link.IronmanManager; +import core.game.node.entity.player.link.IronmanMode; +import core.game.node.entity.player.link.PacketDispatch; +import core.game.node.entity.player.link.SavedData; +import core.game.node.entity.player.link.Settings; +import core.game.node.entity.player.link.SkullManager; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.entity.player.link.WarningMessages; +import core.game.node.entity.player.link.appearance.Appearance; +import core.game.node.entity.player.link.audio.AudioManager; +import core.game.node.entity.player.link.diary.AchievementDiaryManager; +import core.game.node.entity.player.link.emote.EmoteManager; +import core.game.node.entity.player.link.grave.GraveManager; +import core.game.node.entity.player.link.music.MusicPlayer; +import core.game.node.entity.player.link.prayer.Prayer; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.entity.player.link.quest.QuestRepository; +import core.game.node.entity.player.link.request.RequestManager; +import core.game.node.entity.player.link.skillertasks.SkillerTasks; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.communication.CommunicationInfo; +import core.game.system.monitor.PlayerMonitor; +import core.game.system.task.LogoutTask; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.Region; +import core.game.world.map.RegionChunk; +import core.game.world.map.RegionManager; +import core.game.world.map.Viewport; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.zone.ZoneType; +import core.game.world.repository.Repository; +import core.game.world.update.MapChunkRenderer; +import core.game.world.update.NPCRenderer; +import core.game.world.update.PlayerRenderer; +import core.game.world.update.UpdateSequence; +import core.game.world.update.flag.PlayerFlags; +import core.game.world.update.flag.player.FaceEntityFlag; +import core.game.world.update.flag.player.FaceLocationFlag; +import core.game.world.update.flag.player.ForceChatFlag; +import core.net.IoSession; +import core.net.packet.PacketRepository; +import core.net.packet.context.DynamicSceneContext; +import core.net.packet.context.SceneGraphContext; +import core.net.packet.context.SkillContext; +import core.net.packet.out.BuildDynamicScene; +import core.net.packet.out.SkillLevel; +import core.net.packet.out.UpdateSceneGraph; +import core.plugin.Plugin; +import core.tools.StringUtils; + +import core.game.content.activity.pyramidplunder.PlunderObjectManager; +import core.game.interaction.item.brawling_gloves.BrawlingGlovesManager; + +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_BASE; +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_DEATHS; +import static core.tools.stringtools.StringToolsKt.colorize; + +/** + * Represents a player entity. + * @author Emperor + * @author Vexia + */ +public class Player extends Entity { + + /** + * The details of the player. + */ + private PlayerDetails details; + + public boolean inWardrobe = false; + + public Location startLocation = null; + + private Graphics wardrobe_hold_graphics = new Graphics(1182,0,0); + + public boolean newPlayer = getSkills().getTotalLevel() < 50; + + public BankContainer dropLog = new BankContainer(this); + + public EquipmentDegrader degrader = new EquipmentDegrader(); + + public PouchManager pouchManager = new PouchManager(this); + + public VarpManager varpManager = new VarpManager(this); + + public HashMap states = new HashMap<>(); + + /** + * The inventory. + */ + private final Container inventory = new Container(28).register(new InventoryListener(this)); + + /** + * The equipment. + */ + private final EquipmentContainer equipment = new EquipmentContainer(this); + + /** + * The bank container. + */ + private final BankContainer bank = new BankContainer(this); + + /** + * The packet dispatcher. + */ + private final PacketDispatch packetDispatch = new PacketDispatch(this); + + /** + * The spell book manager. + */ + private final SpellBookManager spellBookManager = new SpellBookManager(); + + /** + * The rendering info. + */ + private final RenderInfo renderInfo = new RenderInfo(this); + + /** + * The interface manager. + */ + private final InterfaceManager interfaceManager = new InterfaceManager(this); + + /** + * The emote manager. + */ + private final EmoteManager emoteManager = new EmoteManager(this); + + /** + * The player flags. + */ + private final PlayerFlags playerFlags = new PlayerFlags(); + + /** + * The appearance. + */ + private final Appearance appearance = new Appearance(this); + + /** + * The settings of the player. + */ + private final Settings settings = new Settings(this); + + /** + * The dialogue interpreter. + */ + private final DialogueInterpreter dialogueInterpreter = new DialogueInterpreter(this); + + /** + * The hint icon manager. + */ + private final HintIconManager hintIconManager = new HintIconManager(); + + /** + * The slayer manager. + */ + private final SlayerManager slayer = new SlayerManager(this); + + /** + * The quest repository. + */ + private final QuestRepository questRepository = new QuestRepository(this); + + /** + * The prayer manager. + */ + private final Prayer prayer = new Prayer(this); + + /** + * The skull manager. + */ + private final SkullManager skullManager = new SkullManager(this); + + /** + * The grave stone manager. + */ + private final GraveManager graveManager = new GraveManager(this); + + /** + * The new grand exchange interface manager. + */ + private final PlayerGrandExchange playerGrandExchange = new PlayerGrandExchange(this); + + /** + * The familiar manager. + */ + private final FamiliarManager familiarManager = new FamiliarManager(this); + + /** + * Pyramid Plunder Object Manager + */ + private final PlunderObjectManager plunderObjectManager = new PlunderObjectManager(); + + /** + * The config manager. + */ + private final ConfigurationManager configManager = new ConfigurationManager(this); + + /** + * The saved data. + */ + private final SavedData savedData = new SavedData(this); + + /** + * The request manager. + */ + private final RequestManager requestManager = new RequestManager(this); + + /** + * The farming manager. + */ + + /** + * The monitor which monitors player actions. + */ + private final PlayerMonitor monitor = new PlayerMonitor(); + + /** + * Represents the players warning messages. + */ + private final WarningMessages warningMessages = new WarningMessages(); + + /** + * The music player instance. + */ + private final MusicPlayer musicPlayer = new MusicPlayer(this); + + /** + * The house manager. + */ + private final HouseManager houseManager = new HouseManager(); + + /** + * The barcrawl miniquest manager. + */ + private final BarcrawlManager barcrawlManager = new BarcrawlManager(this); + + /** + * The anti macro handler. + */ + private final AntiMacroHandler antiMacroHandler = new AntiMacroHandler(this); + + /** + * The hunter manager. + */ + private final HunterManager hunterManager = new HunterManager(this); + + /** + * The treasure trail manager. + */ + private final TreasureTrailManager treasureTrailManager = new TreasureTrailManager(this); + + /** + * The audio manager. + */ + private final AudioManager audioManager = new AudioManager(this); + + /** + * The bank pin manager. + */ + private final BankPinManager bankPinManager = new BankPinManager(this); + + /** + * The achievement diary manager. + */ + private final AchievementDiaryManager achievementDiaryManager = new AchievementDiaryManager(this); + + /** + * The Ironman manager. + */ + private final IronmanManager ironmanManager = new IronmanManager(this); + + + /** + * Brawling Gloves manager + */ + private final BrawlingGlovesManager brawlingGlovesManager = new BrawlingGlovesManager(this); + /** + * The logout plugins. + */ + private List> logoutPlugins; + + /** + * The boolean for the player playing. + */ + private boolean playing; + + /** + * If the player is invisible. + */ + private boolean invisible; + + /** + * If the player is artificial. + */ + protected boolean artificial; + + /** + * The skiller tasks. + */ + protected SkillerTasks skillTasks = new SkillerTasks(); + + /** + * A custom state for bot debugging + */ + private String customState = ""; + + /** + * The amount of targets that the player can shoot left for the archery minigame. + */ + private int archeryTargets = 0; + + private int archeryTotal = 0; + + /** + * Constructs a new {@code Player} {@code Object}. + * @param details The player's details. + */ + public Player(PlayerDetails details) { + super(details.getUsername(), ServerConstants.START_LOCATION); + super.active = false; + super.interaction = new Interaction(this); + this.details = details; + this.direction = Direction.SOUTH; + } + + @Override + public void init() { + antiMacroHandler.isDisabled = getAttribute("randoms:disabled",false); + if (!artificial) { + getProperties().setSpawnLocation(ServerConstants.HOME_LOCATION); + getDetails().getSession().setObject(this); + getDetails().getSession().setLastPing(System.currentTimeMillis() + 10_000L); + antiMacroHandler.init(); + } + super.init(); + LoginConfiguration.configureLobby(this); + } + + @Override + public void clear() { + clear(false); + } + + /** + * Clears the player from the game. + * @param force If we should force removal, a player engaged in combat will otherwise remain active until out of combat. + */ + public void clear(boolean force) { + if (!force && allowRemoval()) { + Repository.getDisconnectionQueue().add(this, true); + return; + } + if (force) { + Repository.getDisconnectionQueue().remove(getName()); + } + setPlaying(false); + getWalkingQueue().reset(); + LogoutTask task = getExtension(LogoutTask.class); + if (task != null) { + task.fire(this); + } + if (logoutPlugins != null && !logoutPlugins.isEmpty()) { + logoutPlugins.stream().filter(Objects::nonNull).forEach(plugin -> { + try { + plugin.newInstance(this); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + }); + } + if (familiarManager.hasFamiliar()) { + familiarManager.getFamiliar().clear(); + } + interfaceManager.close(); + interfaceManager.closeSingleTab(); + super.clear(); + getZoneMonitor().clear(); + CommunicationInfo.notifyPlayers(this, false, false); + hunterManager.logout(); + HouseManager.leave(this); + UpdateSequence.getRenderablePlayers().remove(this); + Repository.getDisconnectionQueue().add(this); + } + + public void toggleWardrobe(boolean intoWardrobe){ + class wardrobePulse extends Pulse{ + final Player player; + boolean first = true; + wardrobePulse(Player player){ + this.player = player; + } + @Override + public boolean pulse() { + if(first){ + player.visualize(new Animation(1241), new Graphics(1181,0,0)); + first = false; + return !player.inWardrobe; + } + if(player.inWardrobe) { + player.visualize(new Animation(1241),wardrobe_hold_graphics); + } else { + player.visualize(new Animation(1241), new Graphics(1183,0,0)); + player.getPulseManager().run(new Pulse(1){ + @Override + public boolean pulse() { + player.getAnimator().reset(); + player.packetDispatch.sendInterfaceConfig(548,69,false); + return true; + } + }); + } + return !player.inWardrobe; + } + } + if(intoWardrobe){ + packetDispatch.sendInterfaceConfig(548,69,true); + GameWorld.getPulser().submit(new wardrobePulse(this)); + inWardrobe = true; + } else { + inWardrobe = false; + } + } + + @Override + public void tick() { + super.tick(); + antiMacroHandler.pulse(); + hunterManager.pulse(); + musicPlayer.tick(); + if(getAttribute("fire:immune",0) > 0){ + int time = getAttribute("fire:immune",0) - GameWorld.getTicks(); + if(time == TickUtilsKt.secondsToTicks(30)){ + sendMessage(colorize("%RYou have 30 seconds remaining on your antifire potion.")); + } + if(time == 0){ + sendMessage(colorize("%RYour antifire potion has expired.")); + removeAttribute("fire:immune"); + } + } + if(getAttribute("poison:immunity",0) > 0){ + int time = getAttribute("poison:immunity",0) - GameWorld.getTicks(); + debug(time + ""); + if(time == TickUtilsKt.secondsToTicks(30)){ + sendMessage(colorize("%RYou have 30 seconds remaining on your antipoison potion.")); + } + if(time == 0){ + sendMessage(colorize("%RYour antipoison potion has expired.")); + removeAttribute("poison:immunity"); + } + } + if (!artificial && (System.currentTimeMillis() - getSession().getLastPing()) > 20_000L) { + details.getSession().disconnect(); + getSession().setLastPing(Long.MAX_VALUE); + } + } + + @Override + public void update() { + super.update(); + if (playerFlags.isUpdateSceneGraph()) { + updateSceneGraph(false); + } + PlayerRenderer.render(this); + NPCRenderer.render(this); + MapChunkRenderer.render(this); + } + + @Override + public void reset() { + super.reset(); + playerFlags.setUpdateSceneGraph(false); + renderInfo.updateInformation(); + if (getSkills().isLifepointsUpdate()) { + PacketRepository.send(SkillLevel.class, new SkillContext(this, Skills.HITPOINTS)); + getSkills().setLifepointsUpdate(false); + } + } + + @Override + public boolean face(Entity entity) { + if (entity == null) { + if (getUpdateMasks().unregisterSynced(FaceEntityFlag.getOrdinal())) { + return getUpdateMasks().register(new FaceEntityFlag(entity)); + } + return true; + } + return getUpdateMasks().register(new FaceEntityFlag(entity), true); + } + + @Override + public boolean faceLocation(Location location) { + if (location == null) { + getUpdateMasks().unregisterSynced(FaceLocationFlag.getOrdinal()); + return true; + } + return getUpdateMasks().register(new FaceLocationFlag(location), true); + } + + @Override + public boolean sendChat(String string) { + return getUpdateMasks().register(new ForceChatFlag(string)); + } + + @Override + public int getClientIndex() { + return this.getIndex() | 0x8000; + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + CombatStyle style = getProperties().getCombatPulse().getStyle(); + if (swing) { + int weaponId = equipment.getNew(3).getId(); + if (getProperties().getSpell() != null || getProperties().getAutocastSpell() != null) { + return CombatStyle.MAGIC.getSwingHandler(); + } + if (settings.isSpecialToggled()) { + CombatSwingHandler handler; + if ((handler = style.getSwingHandler().getSpecial(weaponId)) != null) { + return handler; + } + packetDispatch.sendMessage("Unhandled special attack for item " + weaponId + "!"); + } + } + if (style == CombatStyle.RANGE && equipment.getNew(3).getId() == 10034) { + return ChinchompaSwingHandler.getInstance(); + } + return style.getSwingHandler(); + } + + @Override + public void commenceDeath(Entity killer) { + super.commenceDeath(killer); + if (prayer.get(PrayerType.RETRIBUTION)) { + prayer.startRetribution(killer); + } + } + + @Override + public void finalizeDeath(Entity killer) { + settings.setSpecialEnergy(100); + settings.updateRunEnergy(settings.getRunEnergy() - 100); + Player k = killer instanceof Player ? (Player) killer : this; + if (!k.isActive()) { + k = this; + } + if (this.isArtificial() && killer instanceof Player){ + setAttribute("dead", true); + } + if (this.isArtificial() && killer instanceof NPC) { + return; + } + getPacketDispatch().sendMessage("Oh dear, you are dead!"); + incrementAttribute("/save:"+STATS_BASE+":"+STATS_DEATHS); + + //If player was a Hardcore Ironman, announce that they died + if (this.getIronmanManager().getMode().equals(IronmanMode.HARDCORE)){ //if this was checkRestriction, ultimate irons would be moved to HARDCORE_DEAD as well + String gender = this.isMale() ? "Man " : "Woman "; + Repository.sendNews("Hardcore Iron " + gender + " " + this.getUsername() +" has fallen. Total Level: " + this.getSkills().getTotalLevel()); // Not enough room for XP + this.getIronmanManager().setMode(IronmanMode.STANDARD); + asPlayer().getSavedData().getActivityData().setHardcoreDeath(true); + this.sendMessage("You have fallen as a Hardcore Iron Man, your Hardcore status has been revoked."); + } + + packetDispatch.sendTempMusic(90); + if (!getZoneMonitor().handleDeath(killer) && (!getProperties().isSafeZone() && getZoneMonitor().getType() != ZoneType.SAFE.getId()) && getDetails().getRights() != Rights.ADMINISTRATOR) { + GroundItemManager.create(new Item(526), getLocation(), k); + final Container[] c = DeathTask.getContainers(this); + boolean gravestone = graveManager.generateable() && getIronmanManager().getMode() != IronmanMode.ULTIMATE; + int seconds = graveManager.getType().getDecay() * 60; + int ticks = (1000 * seconds) / 600; + List items = new ArrayList<>(); + for (Item item : c[1].toArray()) { + if (item != null) { + GroundItem ground; + if (item.hasItemPlugin()) { + item = item.getPlugin().getDeathItem(item); + } + if (gravestone || !item.getDefinition().isTradeable()) { + ground = new GroundItem(item, getLocation(), gravestone ? ticks + 100 : 200, this); + } else { + ground = new GroundItem(item.getDropItem(), getLocation(), k); + } + items.add(ground); + ground.setDropper(this); //Checking for ironman mode in any circumstance for death items is inaccurate to how it works in both 2009scapes. + GroundItemManager.create(ground); + } + } + equipment.clear(); + inventory.clear(); + inventory.addAll(c[0]); + if (gravestone) { + graveManager.create(ticks, items); + sendMessages("Because of your current gravestone, you have "+graveManager.getType().getDecay()+" minutes to get your items and", "equipment back after dying in combat."); + } + familiarManager.dismiss(); + + } + skullManager.setSkulled(false); + removeAttribute("combat-time"); + getPrayer().reset(); + super.finalizeDeath(killer); + appearance.sync(); + if (killer instanceof Player && !GameWorld.isEconomyWorld() && getSkullManager().isWilderness() && killer.asPlayer().getSkullManager().isWilderness()) { + killer.asPlayer().getSavedData().getSpawnData().onDeath(killer.asPlayer(), this); + } + if (GameWorld.isEconomyWorld() && !getSavedData().getGlobalData().isDeathScreenDisabled()) { + getInterfaceManager().open(new Component(153)); + } + if (!getSavedData().getGlobalData().isDeathScreenDisabled()) { + getInterfaceManager().open(new Component(153)); + } + } + + @Override + public boolean hasProtectionPrayer(CombatStyle style) { + if (style == null) { + return false; + } + return prayer.get(style.getProtectionPrayer()); + } + + @Override + public int getDragonfireProtection(boolean fire) { + int value = 0; + if (fire) { + if (hasFireResistance()) { + value |= 0x2; + } + } + Item item = equipment.get(EquipmentContainer.SLOT_SHIELD); + if (item != null && (fire && (item.getId() == 11283 || item.getId() == 11284 || item.getId() == 1540) || (!fire && (item.getId() == 2890 || item.getId() == 9731)))) { + value |= 0x4; + } + if (prayer.get(PrayerType.PROTECT_FROM_MAGIC)) { + value |= 0x8; + } + setAttribute("fire_resistance", value); + return value; + } + + @Deprecated + @Override + public void setLocation(Location location) { + super.setLocation(location); + } + + @Override + public void fullRestore() { + prayer.reset(); + settings.setSpecialEnergy(100); + settings.updateRunEnergy(-100); + super.fullRestore(); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity instanceof NPC && !((NPC) entity).getDefinition().hasAction("attack") && !((NPC) entity).isIgnoreAttackRestrictions(this)) { + return false; + } + return super.isAttackable(entity, style); + } + + @Override + public boolean isPoisonImmune() { + return getAttribute("poison:immunity", -1) > GameWorld.getTicks(); + } + + @Override + public void onImpact(final Entity entity, BattleState state) { + super.onImpact(entity, state); + boolean recoil = getEquipment().getNew(EquipmentContainer.SLOT_RING).getId() == 2550; + if (state.getEstimatedHit() > 0) { + if (getAttribute("vengeance", false)) { + removeAttribute("vengeance"); + final int hit = (int) (state.getEstimatedHit() * 0.75); + sendChat("Taste vengeance!"); + if (hit > -1) { + entity.getImpactHandler().manualHit(Player.this, hit, HitsplatType.NORMAL); + } + } + if (recoil) { + getImpactHandler().handleRecoilEffect(entity, state.getEstimatedHit()); + } + } + if (state.getSecondaryHit() > 0) { + if (recoil) { + getImpactHandler().handleRecoilEffect(entity, state.getSecondaryHit()); + } + } + degrader.checkArmourDegrades(this); + } + + public void randomWalk(int radiusX, int radiusY) { + Pathfinder.find(this, this.getLocation().transform(RandomFunction.random(radiusX, (radiusX * -1)), RandomFunction.random(radiusY, (radiusY * -1)), 0), false, Pathfinder.SMART).walk(this); + } + + /** + * Initializes the player for reconnection. + */ + public void initReconnect() { + getInterfaceManager().setChatbox(null); + getPulseManager().clear(); + getZoneMonitor().getZones().clear(); + getViewport().setCurrentPlane(RegionManager.forId(66666).getPlanes()[3]); + configManager.reset(); + playerFlags.setLastSceneGraph(null); + playerFlags.setUpdateSceneGraph(false); + playerFlags.setLastViewport(new RegionChunk[Viewport.CHUNK_SIZE][Viewport.CHUNK_SIZE]); + renderInfo.getLocalNpcs().clear(); + renderInfo.getLocalPlayers().clear(); + renderInfo.setLastLocation(null); + renderInfo.setOnFirstCycle(true); + Arrays.fill(renderInfo.getAppearanceStamps(),0); + } + + /** + * Updates the player's scene graph. + * @param login If the player is logging in. + */ + public void updateSceneGraph(boolean login) { + Region region = getViewport().getRegion(); + if (region instanceof DynamicRegion || (region == null && (region = RegionManager.getRegionCache().get(location.getRegionId())) instanceof DynamicRegion || region == null)) { + PacketRepository.send(BuildDynamicScene.class, new DynamicSceneContext(this, login)); + } else { + PacketRepository.send(UpdateSceneGraph.class, new SceneGraphContext(this, login)); + } + } + + /** + * Toggles the debug mode. + */ + public void toggleDebug() { + boolean debug = getAttribute("debug", false); + setAttribute("debug", !debug); + getPacketDispatch().sendMessage("Your debug mode is toggled to " + !debug + "."); + } + + /** + * Wrapper method for sending a message. + * @param messages the messages. + */ + public void sendMessages(String... messages) { + packetDispatch.sendMessages(messages); + } + + /** + * Wrapper method for sending a message. + * @param message the message. + */ + public void sendMessage(String message) { + sendMessages(message); + } + + /** + * Sends a notification message. + * @param message The message. + */ + public void sendNotificationMessage(String message) { + sendMessages("" + message + ""); + } + + /** + * Checks if the player can spawn. & Location + * @return {@code True} if so. + */ + public boolean spawnZone() { + return (getLocation().getX() > 3090 && getLocation().getY() < 3500 + && getLocation().getX() < 3099 && getLocation().getY() > 3487); + } + + public boolean canSpawn() { + if (!spawnZone()) { + sendMessage("You can only spawn items inside the edgeville bank."); + return true; + } + if (inCombat() || getLocks().isInteractionLocked() || getSkullManager().isWilderness() || getAttribute("activity", null) != null) { + sendMessage("You can't spawn items at the moment."); + return true; + } + return false; + } + + /** + * Sends a message on a tick. + * @param message the message. + * @param ticks the ticks. + */ + public void sendMessage(String message, int ticks) { + packetDispatch.sendMessage(message, ticks); + } + + /** + * Sends a message to the player if it's an administrator. + * @param string The message. + */ + public void debug(String string) { + if (getAttribute("debug",false)) { + packetDispatch.sendMessage(string); + } + } + + /** + * Grabs a players gender, using shorter amount of code + */ + + public boolean isMale() { + return this.getAppearance().getGender().ordinal() == 0; + } + + /** + * Sets the player details. + * @param details The player details. + */ + @SuppressWarnings("deprecation") + public void updateDetails(PlayerDetails details) { + if (this.details != null) { + details.setBanTime(this.details.getBanTime()); + details.setMuteTime(this.details.getMuteTime()); + details.setIcon(this.details.getIcon()); + } + details.getSession().setObject(this); + this.details = details; + } + + /** + * Checks if the player is allowed to be removed from the game. + * @return {@code True} if so. + */ + public boolean allowRemoval() { + return inCombat() || getSkills().getLifepoints() < 1 || DeathTask.isDead(this); + } + + /** + * Checks if the containers have this item. + * @param item the item. + * @return {@code True} if so. + */ + public boolean hasItem(Item item) { + return getInventory().containsItem(item) || getBank().containsItem(item) || getEquipment().containsItem(item); + } + + /** + * Gets the player extra experience mod. + * @return the mod. + */ + public double getExperienceMod() { + return getSavedData().getGlobalData().hasDoubleExp() ? 2 : 1; + } + + /** + * Checks if the player is a staff member. + * @return {@code True} if so. + */ + public boolean isStaff() { + return getDetails().getRights() != Rights.REGULAR_PLAYER; + } + + /** + * Checks if the player is an admin. + * @return true if so. + */ + public boolean isAdmin() { + return getDetails().getRights() == Rights.ADMINISTRATOR; + } + + /** + * Checks if the player is debugging. + * @return {@code True} if so. + */ + public boolean isDebug() { + return details.getRights() == Rights.ADMINISTRATOR && getAttribute("debug", false); + } + + /** + * Gets the uid info. + * @return the info. + */ + public UIDInfo getUidInfo() { + return details.getInfo(); + } + + /** + * Gets the {@code PlayerDetails}. + * @return the details. + */ + public PlayerDetails getDetails() { + return details; + } + + /** + * Gets the name. + * @return the name. + */ + public String getName() { +// return display ? details.getDisplayName() : super.getName(); + return super.getName(); + } + + /** + * Gets the players {@code Session}. + * @return the {@code PlayerDetails} {@code Object} session. + */ + public IoSession getSession() { + return details.getSession(); + } + + /** + * Gets the {@code Equipment} + * @return {@code Equipment}. + */ + public EquipmentContainer getEquipment() { + return equipment; + } + + /** + * Gets the bank. + * @return The bank. + */ + public BankContainer getBank() { + return bank; + } + + public BankContainer getDropLog() {return dropLog;} + + /** + * @return the inventory + */ + public Container getInventory() { + return inventory; + } + + /** + * Sets the playing flag. + * @param playing the flag to set. + */ + public void setPlaying(boolean playing) { + this.playing = playing; + } + + /** + * Checks if the player is playing. + * @return {@code True} if so. + */ + public boolean isPlaying() { + return playing; + } + + /** + * Gets the rights of the player. + * @return the rights. + */ + public Rights getRights() { + return details.getRights(); + } + + /** + * Gets the renderInfo. + * @return The renderInfo. + */ + public RenderInfo getRenderInfo() { + return renderInfo; + } + + /** + * Gets the appearance. + * @return The appearance. + */ + public Appearance getAppearance() { + return appearance; + } + + /** + * Gets the playerFlags. + * @return The playerFlags. + */ + public PlayerFlags getPlayerFlags() { + return playerFlags; + } + + /** + * Gets the {@code PacketDispatch}. + * @return the packet dispatch. + */ + public PacketDispatch getPacketDispatch() { + return packetDispatch; + } + + + /** + * @return the spellBookManager + */ + public SpellBookManager getSpellBookManager() { + return spellBookManager; + } + + /** + * Gets the settings. + * @return The settings. + */ + public Settings getSettings() { + return settings; + } + + /** + * @return the interface manager. + */ + public InterfaceManager getInterfaceManager() { + return interfaceManager; + } + + /** + * Gets the dialogue interpreter. + * @return The dialogue interpreter. + */ + public DialogueInterpreter getDialogueInterpreter() { + return dialogueInterpreter; + } + + /** + * @return the hintIconManager + */ + public HintIconManager getHintIconManager() { + return hintIconManager; + } + + /** + * Gets the slayer. + * @return The slayer. + */ + public SlayerManager getSlayer() { + return slayer; + } + + /** + * Checks if the player is artifical (AIPlayer). + * @return {@code True} if so. + */ + public boolean isArtificial() { + return artificial; + } + + /** + * @return the questRepository. + */ + public QuestRepository getQuestRepository() { + return questRepository; + } + + /** + * @return the prayer. + */ + public Prayer getPrayer() { + return prayer; + } + + /** + * @return the skullManager. + */ + public SkullManager getSkullManager() { + return skullManager; + } + + /** + * @return the familiarManager. + */ + public FamiliarManager getFamiliarManager() { + return familiarManager; + } + + /** + * Gets the configManager. + * @return The configManager. + */ + public ConfigurationManager getConfigManager() { + return configManager; + } + + /** + * Gets the communication. + * @return The communication. + */ + public CommunicationInfo getCommunication() { + return details.getCommunication(); + } + + /** + * Gets the requestManager. + * @return The requestManager. + */ + public RequestManager getRequestManager() { + return requestManager; + } + + /** + * Gets the savedData. + * @return The savedData. + */ + public SavedData getSavedData() { + return savedData; + } + + /** + * Gets the global data. + * @return the global data. + */ + public GlobalData getGlobalData() { + return savedData.getGlobalData(); + } + + /** + * Gets the farmingManager. + * @return The farmingManager. + */ + + /** + * Gets the monitor. + * @return The monitor. + */ + public PlayerMonitor getMonitor() { + return monitor; + } + + /** + * Gets the warningMessages. + * @return The warningMessages. + */ + public WarningMessages getWarningMessages() { + return warningMessages; + } + + /** + * Gets the musicPlayer. + * @return The musicPlayer. + */ + public MusicPlayer getMusicPlayer() { + return musicPlayer; + } + + /** + * Gets the houseManager. + * @return The houseManager. + */ + public HouseManager getHouseManager() { + return houseManager; + } + + /** + * Gets the barcrawlManager. + * @return The barcrawlManager. + */ + public BarcrawlManager getBarcrawlManager() { + return barcrawlManager; + } + + /** + * Gets the antiMacroHandler. + * @return The antiMacroHandler. + */ + public AntiMacroHandler getAntiMacroHandler() { + return antiMacroHandler; + } + + /** + * Gets the hunterManager. + * @return The hunterManager. + */ + public HunterManager getHunterManager() { + return hunterManager; + } + + /** + * Gets the btreasureTrailManager. + * @return the treasureTrailManager + */ + public TreasureTrailManager getTreasureTrailManager() { + return treasureTrailManager; + } + + /** + * Gets the graveManager. + * @return the graveManager + */ + public GraveManager getGraveManager() { + return graveManager; + } + + /** + * Gets the audioManager. + * @return the audioManager + */ + public AudioManager getAudioManager() { + return audioManager; + } + + /** + * Gets the logoutPlugins. + * @return the logoutPlugins + */ + public List> getLogoutPlugins() { + if (logoutPlugins == null) { + logoutPlugins = new ArrayList<>(); + } + return logoutPlugins; + } + + /** + * Sets the balogoutPlugins. + * @param logoutPlugins the logoutPlugins to set. + */ + public void setLogoutPlugins(List> logoutPlugins) { + this.logoutPlugins = logoutPlugins; + } + + /** + * Gets the bankPinManager. + * @return the bankPinManager + */ + public BankPinManager getBankPinManager() { + return bankPinManager; + } + + /** + * Gets the achievementDiaryManager. + * @return the achievementDiaryManager + */ + public AchievementDiaryManager getAchievementDiaryManager() { + return achievementDiaryManager; + } + + /** + * Gets the ironmanManager. + * @return the ironmanManager + */ + public IronmanManager getIronmanManager() { + return ironmanManager; + } + + public PlunderObjectManager getPlunderObjectManager() {return plunderObjectManager;} + + /** + * Gets the emoteManager. + * @return the emoteManager. + */ + public EmoteManager getEmoteManager() { + return emoteManager; + } + + /** + * Gets the invisible. + * @return the invisible + */ + public boolean isInvisible() { + return invisible; + } + + /** + * Sets the invisible. + * @param invisible the invisible to set. + */ + public void setInvisible(boolean invisible) { + this.invisible = invisible; + } + + @Override + public String getUsername() { + return StringUtils.formatDisplayName(getName()); + } + + public SkillerTasks getSkillTasks() { + return skillTasks; + } + + public void setSkillTasks(SkillerTasks skillTasks) { + this.skillTasks = skillTasks; + } + + @Override + public String toString() { + return "Player [name=" + name + ", getRights()=" + getRights() + "]"; + } + + + public String getCustomState() { + return customState; + } + + public void setCustomState(String state) + { + this.customState = state; + } + + public int getArcheryTargets() { + return archeryTargets; + } + + public void setArcheryTargets(int archeryTargets) { + this.archeryTargets = archeryTargets; + } + + public int getArcheryTotal() { + return archeryTotal; + } + + public void setArcheryTotal(int archeryTotal) { + this.archeryTotal = archeryTotal; + } + + public BrawlingGlovesManager getBrawlingGlovesManager() { return brawlingGlovesManager;} + + public PlayerGrandExchange getPlayerGrandExchange() { return playerGrandExchange; } + + public boolean hasActiveState(String key){ + State state = states.get(key); + if(state != null && state.getPulse() != null){ + return true; + } + return false; + } + + public State registerState(String key){ + State state = StateRepository.forKey(key,this); + if(state != null) return state; + return null; + } + + public void clearState(String key){ + State state = states.get(key); + if(state == null) return; + state.getPulse().stop(); + states.remove(key); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/ClientInfo.java b/Server/src/main/java/Server/core/game/node/entity/player/info/ClientInfo.java new file mode 100644 index 000000000..a848cd9da --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/ClientInfo.java @@ -0,0 +1,123 @@ +package core.game.node.entity.player.info; + +/** + * Holds a player's client info. + * @author Emperor + * + */ +public final class ClientInfo { + + /** + * The current display mode. + */ + private int displayMode; + + /** + * The current window mode. + */ + private int windowMode; + + /** + * The screen width. + */ + private int screenWidth; + + /** + * The screen height. + */ + private int screenHeight; + + /** + * Constructs a new {@Code ClientInfo} {@Code Object} + * @param displayMode The display mode. + * @param windowMode The window mode. + * @param screenWidth The screen width. + * @param screenHeight The screen height. + */ + public ClientInfo(int displayMode, int windowMode, int screenWidth, int screenHeight) { + this.displayMode = displayMode; + this.windowMode = windowMode; + this.screenWidth = screenWidth; + this.screenHeight = screenHeight; + } + + /** + * Checks if the client is running HD. + * @return {@code True} if so. + */ + public boolean isHighDetail() { + return displayMode > 0; // ? + } + + /** + * Checks if the client screen is resizable. + * @return {@code True} if so. + */ + public boolean isResizable() { + return windowMode > 1; + } + + /** + * Gets the displayMode. + * @return the displayMode + */ + public int getDisplayMode() { + return displayMode; + } + + /** + * Sets the displayMode. + * @param displayMode the displayMode to set. + */ + public void setDisplayMode(int displayMode) { + this.displayMode = displayMode; + } + + /** + * Gets the windowMode. + * @return the windowMode + */ + public int getWindowMode() { + return windowMode; + } + + /** + * Sets the windowMode. + * @param windowMode the windowMode to set. + */ + public void setWindowMode(int windowMode) { + this.windowMode = windowMode; + } + + /** + * Gets the screenWidth. + * @return the screenWidth + */ + public int getScreenWidth() { + return screenWidth; + } + + /** + * Sets the screenWidth. + * @param screenWidth the screenWidth to set. + */ + public void setScreenWidth(int screenWidth) { + this.screenWidth = screenWidth; + } + + /** + * Gets the screenHeight. + * @return the screenHeight + */ + public int getScreenHeight() { + return screenHeight; + } + + /** + * Sets the screenHeight. + * @param screenHeight the screenHeight to set. + */ + public void setScreenHeight(int screenHeight) { + this.screenHeight = screenHeight; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/PlayerDetails.java b/Server/src/main/java/Server/core/game/node/entity/player/info/PlayerDetails.java new file mode 100644 index 000000000..2ec604452 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/PlayerDetails.java @@ -0,0 +1,399 @@ +package core.game.node.entity.player.info; + +import core.game.node.entity.player.info.portal.Icon; +import core.game.node.entity.player.info.portal.PlayerSQLManager; +import core.game.system.communication.CommunicationInfo; +import core.net.IoSession; + +import java.util.concurrent.TimeUnit; + +/** + * Stores the details of a player's account. + * @author Vexia + * + */ +public class PlayerDetails { + + /** + * The sql manager for this account. + */ + private final PlayerSQLManager sqlManager = new PlayerSQLManager(this); + + /** + * The communication info. + */ + private final CommunicationInfo communicationInfo = new CommunicationInfo(); + + + /** + * The unique id info. + */ + private final UIDInfo info = new UIDInfo(); + + /** + * The username of the account. + */ + private final String username; + + /** + * The password of the account. + */ + private String password; + + /** + * The unique id of the account. + */ + private int uid; + + /** + * The account's last game login. + */ + private long lastLogin = -1; + + /** + * The account's last game login. + */ + private long timePlayed = 0; + + /** + * The time the player is muted for. + */ + private long muteTime; + + /** + * The time the player is banned for. + */ + private long banTime; + + /** + * If the sql data has been parsed. + */ + private boolean parsed; + + /** + * The rights of the player. + */ + private Rights rights = Rights.REGULAR_PLAYER; + + /** + * The chat icon value. + */ + private Icon icon; + + public int credits; + + /** + * Represents the session. + */ + private IoSession session; + + /** + * Constructs a new {@code PlayerDetails}. + * @param username the username to set. + * @param password the password to set. + */ + public PlayerDetails(String username, String password) { + this.username = username; + this.password = password; + this.uid = username.hashCode(); + } + + /** + * Constructs a new {@Code PlayerDetails} {@Code Object} + * @param username the username to set. + */ + public PlayerDetails(String username) { + this(username, null); + } + + /** + * Parses the details from the database for this object. + * @return {@code True} if parsed. + */ + public boolean parse() { + if (sqlManager.parse()) { + return parsed = true; + } + return parsed = false; + } + + /** + * Saves the player's details. + * @return {@code True} if saved. + */ + public boolean save() { + sqlManager.save(); + return true; + } + + /** + * Gets the player details for an account name. + * @param username the username. + * @return the player details. + */ + public static PlayerDetails getDetails(String username) { + PlayerDetails details = new PlayerDetails(username); + if (!details.parse()) { + return details = null; + } + return details; + } + + /** + * Checks if the ban is permanent. + * @return {@code True} if so. + */ + public boolean isPermBan() { + return TimeUnit.MILLISECONDS.toDays(banTime - System.currentTimeMillis()) > 1000; + } + + /** + * Checks if the player is muted. + * @return {@code True} if so. + */ + public boolean isBanned() { + return banTime > System.currentTimeMillis(); + } + + /** + * Checks if the mute is permanent. + * @return {@code True} if so. + */ + public boolean isPermMute() { + return TimeUnit.MILLISECONDS.toDays(muteTime - System.currentTimeMillis()) > 1000; + } + + /** + * Checks if the player is muted. + * @return {@code True} if so. + */ + public boolean isMuted() { + return muteTime > System.currentTimeMillis(); + } + + /** + * Gets the sql manager. + * @return the sql manager. + */ + public PlayerSQLManager getSqlManager() { + return sqlManager; + } + + /** + * Gets the rights. + * @return The rights. + */ + public Rights getRights() { + return rights; + } + + /** + * Sets the credentials. + * @param rights The credentials to set. + */ + public void setRights(Rights rights) { + this.rights = rights; + } + + /** + * Gets the session. + * @return The session. + */ + public IoSession getSession() { + return session; + } + + /** + * Sets the session. + * @param session The session to set. + */ + public void setSession(IoSession session) { + this.session = session; + } + + /** + * Sets the password. + * @param password the password. + */ + public void setPassword(final String password) { + this.password = password; + } + + /** + * Gets the username. + * @return The username. + */ + + public String getUsername() { + return username; + } + + /** + * Gets the uid. + * @return the uid. + */ + public int getUid() { + return uid; + } + + /** + * Sets the uid. + * @param uid the uid. + */ + public void setUid(int uid) { + this.uid = uid; + } + + /** + * Gets the password. + * @return The password. + */ + public String getPassword() { + return password; + } + + /** + * Checks if the details have been parsed. + * @return {@code True} if parsed. + */ + public boolean isParsed() { + return parsed; + } + + /** + * Gets the mac address. + * @return the address. + */ + public String getMacAddress() { + return info.getMac(); + } + + /** + * Gets the computer name. + * @return the name. + */ + public String getCompName() { + return info.getCompName(); + } + + /** + * Gets the ip address. + * @return the ip. + */ + public String getIpAddress() { + if (session == null) { + return info.getIp(); + } + return session.getAddress(); + } + + /** + * Gets the serial. + * @return the serial. + */ + public String getSerial() { + return info.getSerial(); + } + + /** + * Gets the info. + * @return the info + */ + public UIDInfo getInfo() { + return info; + } + + /** + * Gets the communicationInfo. + * @return the communicationInfo + */ + public CommunicationInfo getCommunication() { + return communicationInfo; + } + + /** + * Gets the icon. + * @return the icon. + */ + public Icon getIcon() { + return icon; + } + + /** + * Sets the icon. + * @param icon the icon to set + */ + public void setIcon(Icon icon) { + this.icon = icon; + } + + /** + * Gets the lastLogin. + * @return the lastLogin. + */ + public long getLastLogin() { + return lastLogin; + } + + /** + * Sets the lastLogin. + * @param lastLogin the lastLogin to set + */ + public void setLastLogin(long lastLogin) { + this.lastLogin = lastLogin; + } + + /** + * Gets the timePlayed. + * @return the timePlayed. + */ + public long getTimePlayed() { + return timePlayed; + } + + /** + * Sets the timePlayed. + * @param timePlayed the timePlayed to set + */ + public void setTimePlayed(long timePlayed) { + this.timePlayed = timePlayed; + } + + /** + * Sets the mute time. + * @param muteTime the mute time. + */ + public void setMuteTime(long muteTime) { + this.muteTime = muteTime; + } + + /** + * Gets the mute time. + * @return The mute time. + */ + public long getMuteTime() { + return muteTime; + } + + /** + * Gets the banTime. + * @return the banTime. + */ + public long getBanTime() { + return banTime; + } + + /** + * Sets the banTime. + * @param banTime the banTime to set + */ + public void setBanTime(long banTime) { + this.banTime = banTime; + } + + @Override + public String toString() { + return "PlayerDetails [sqlManager=" + sqlManager + ", communicationInfo=" + communicationInfo + ", info=" + info + ", username=" + username + ", password=" + password + ", uid=" + uid + ", lastLogin=" + lastLogin + ", muteTime=" + muteTime + ", parsed=" + parsed + ", rights=" + rights + ", icon=" + icon + ", session=" + session + "]"; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/RenderInfo.java b/Server/src/main/java/Server/core/game/node/entity/player/info/RenderInfo.java new file mode 100644 index 000000000..3aa6a7a07 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/RenderInfo.java @@ -0,0 +1,207 @@ +package core.game.node.entity.player.info; + +import core.ServerConstants; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +import java.util.LinkedList; +import java.util.List; + +/** + * Holds a player's render information. + * @author Emperor + */ +public final class RenderInfo { + + /** + * The player. + */ + private final Player player; + + /** + * The list of local players. + */ + private List localPlayers = new LinkedList(); + + /** + * The list of local NPCs. + */ + private List localNpcs = new LinkedList(); + + /** + * The appearance time stamps (in millisecond). + */ + private final long[] appearanceStamps = new long[ServerConstants.MAX_PLAYERS]; + + /** + * The entities requiring a mask update. + */ + private Entity[] maskUpdates = new Entity[256]; + + /** + * The mask update count. + */ + private int maskUpdateCount; + + /** + * The last location of this player. + */ + private Location lastLocation; + + /** + * If the player has just logged in. + */ + private boolean onFirstCycle = true; + + /** + * If the player has prepared appearance data this cycle. + */ + private boolean preparedAppearance; + + /** + * Constructs a new {@code RenderInfo} {@code Object}. + * @param player The player. + */ + public RenderInfo(Player player) { + this.player = player; + } + + /** + * Updates the player rendering information. + */ + public void updateInformation() { + onFirstCycle = false; + lastLocation = player.getLocation(); + preparedAppearance = false; + } + + /** + * Registers an entity requiring a mask update. + * @param entity The entity. + */ + public void registerMaskUpdate(Entity entity) { + maskUpdates[maskUpdateCount++] = entity; + } + + /** + * Gets the localNpcs. + * @return The localNpcs. + */ + public List getLocalNpcs() { + return localNpcs; + } + + /** + * Sets the localNpcs. + * @param localNpcs The localNpcs to set. + */ + public void setLocalNpcs(List localNpcs) { + this.localNpcs = localNpcs; + } + + /** + * Gets the onFirstCycle. + * @return The onFirstCycle. + */ + public boolean isOnFirstCycle() { + return onFirstCycle; + } + + /** + * Sets the onFirstCycle. + * @param onFirstCycle The onFirstCycle to set. + */ + public void setOnFirstCycle(boolean onFirstCycle) { + this.onFirstCycle = onFirstCycle; + } + + /** + * Gets the lastLocation. + * @return The lastLocation. + */ + public Location getLastLocation() { + return lastLocation; + } + + /** + * Sets the lastLocation. + * @param lastLocation The lastLocation to set. + */ + public void setLastLocation(Location lastLocation) { + this.lastLocation = lastLocation; + } + + /** + * Gets the localPlayers. + * @return The localPlayers. + */ + public List getLocalPlayers() { + return localPlayers; + } + + /** + * Sets the localPlayers. + * @param localPlayers The localPlayers to set. + */ + public void setLocalPlayers(List localPlayers) { + this.localPlayers = localPlayers; + } + + /** + * Gets the appearanceStamps. + * @return The appearanceStamps. + */ + public long[] getAppearanceStamps() { + return appearanceStamps; + } + + /** + * Gets the maskUpdateCount. + * @return The maskUpdateCount. + */ + public int getMaskUpdateCount() { + return maskUpdateCount; + } + + /** + * Sets the maskUpdateCount. + * @param maskUpdateCount The maskUpdateCount to set. + */ + public void setMaskUpdateCount(int maskUpdateCount) { + this.maskUpdateCount = maskUpdateCount; + } + + /** + * Gets the maskUpdates. + * @return The maskUpdates. + */ + public Entity[] getMaskUpdates() { + return maskUpdates; + } + + /** + * Sets the maskUpdates. + * @param maskUpdates The maskUpdates to set. + */ + public void setMaskUpdates(Entity[] maskUpdates) { + this.maskUpdates = maskUpdates; + } + + /** + * Sets the prepared appearance flag. + * @param prepared If the player has prepared appearance setting this cycle. + */ + public void setPreparedAppearance(boolean prepared) { + this.preparedAppearance = prepared; + } + + /** + * Checks if the player has prepared appearance data this cycle. + * @return {@code True} if so. + */ + public boolean preparedAppearance() { + return preparedAppearance; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/Rights.java b/Server/src/main/java/Server/core/game/node/entity/player/info/Rights.java new file mode 100644 index 000000000..f464a98b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/Rights.java @@ -0,0 +1,69 @@ +package core.game.node.entity.player.info; + +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; + +/** + * Represent the rights of a player. + * @author 'Vexia + */ +public enum Rights { + REGULAR_PLAYER, PLAYER_MODERATOR, ADMINISTRATOR() { + @Override + public boolean isVisible(Player player) { + return player.getAttribute("visible_rank", ADMINISTRATOR) == ADMINISTRATOR; + } + }; + + /** + * Gets the chat icon. + * @param player The player to get the chat icon for. + * @return The chat icon. + */ + public static int getChatIcon(Player player) { + Rights c = player.getAttribute("visible_rank", player.getDetails().getRights()); + if (c != Rights.REGULAR_PLAYER && c != null) { + return c.toInteger(); + } + if (player.getIronmanManager().isIronman()) { + return player.getIronmanManager().getMode().getIcon(); + } + return 0; + } + + /** + * Checks if the player has a hidden rank. + * @param player the player. + * @return {@code True} if hidden. + */ + public static boolean isHidden(final Player player) { + return player.getAttribute("visible_rank", player.getDetails().getRights()) != player.getDetails().getRights(); + } + + /** + * Gets the ordinal of the rights. + * @return the integer format of a rank. + */ + public final int toInteger() { + return ordinal(); + } + + /** + * Method used to get the credentials based off the id. + * @param id the id. + * @return the credential. + */ + public static Rights forId(int id) { + if (id < 0) { + id = 0; + } + return values()[id]; + } + + /** + * Checks if the player's rank is visible. + */ + public boolean isVisible(Player username) { + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/UIDInfo.java b/Server/src/main/java/Server/core/game/node/entity/player/info/UIDInfo.java new file mode 100644 index 000000000..706ddf937 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/UIDInfo.java @@ -0,0 +1,123 @@ +package core.game.node.entity.player.info; + +import core.game.node.entity.player.Player; +import core.tools.StringUtils; + +/** + * The unique machine information of an account. + * @author Vexia + * + */ +public class UIDInfo { + + /** + * The ip address. + */ + private String ip; + + /** + * The computer name. + */ + private String compName; + + /** + * The mac-address. + */ + private String mac; + + /** + * The motherboard serial of the user. + */ + private String serial; + + /** + * Constructs a new {@code UIDInfo} {@code Object} + */ + public UIDInfo() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code UIDInfo} {@code Object} + * @param ip the ip. + * @param compName the computer name. + * @param mac the mac. + * @param serial the serial. + */ + public UIDInfo(String ip, String compName, String mac, String serial) { + this.ip = ip; + this.compName = compName; + this.mac = mac.replace(":", "-"); + this.serial = serial; + } + + /** + * Translates the unique info from another object. + * @param other the other information. + */ + public void translate(UIDInfo other) { + ip = other.ip; + compName = other.compName; + mac = other.mac.replace(":", "-"); + serial = other.serial; + } + + /** + * Converts a to string in format mode for an admin or mod. + * @return the string. + */ + public String toString(Player player, Player target) { + boolean admin = player.isAdmin(); + String format = toString(); + if (!admin) {// formats for non-admins + String[] tokens = format.split("serial="); + format = format.replace("serial=", "uid=").replace(tokens[tokens.length - 1], "*****"); + } + player.sendMessage("[----------Info Debug----------]"); + String[] lines = StringUtils.splitIntoLine(format, 60); + player.sendMessages(lines); + player.sendMessage("[-------------------------------]"); + return format; + } + + /** + * Gets the compName. + * @return the compName + */ + public String getCompName() { + return compName; + } + + /** + * Gets the ip. + * @return the ip + */ + public String getIp() { + return ip; + } + + /** + * Gets the mac. + * @return the mac + */ + public String getMac() { + return mac; + } + + /** + * Gets the serial. + * @return the serial + */ + public String getSerial() { + return serial; + } + + @Override + public String toString() { + // make sure serials always at end + return "[ip=" + ip + ", compName=" + compName + ", mac=" + mac + ", serial=" + serial + "]"; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginConfiguration.java b/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginConfiguration.java new file mode 100644 index 000000000..b559b099f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginConfiguration.java @@ -0,0 +1,295 @@ +package core.game.node.entity.player.info.login; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; +import core.game.world.update.UpdateSequence; +import core.game.world.update.flag.player.AppearanceFlag; +import core.net.amsc.MSPacketRepository; +import core.net.amsc.WorldCommunicator; +import core.net.packet.PacketRepository; +import core.net.packet.context.InterfaceContext; +import core.net.packet.out.Interface; +import core.plugin.Plugin; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + + +/** + * Sends the login configuration packets. + * + * @author Emperor + */ +public final class LoginConfiguration { + + /** + * The login plugins. + */ + private static final List> LOGIN_PLUGINS = new ArrayList<>(); + + /** + * The lobby pane component. + */ + private static final Component LOBBY_PANE = new Component(549); + + /** + * The lobby message of the week models & constant to be set for auto selecting the models + */ + private static final int[] MESSAGE_MODEL = {15, 16, 17, 18, 19, 20, 21, 22, 23, 405, 447, 622, 623, 679, 715, 800}; + private static int messModel; + + /** + * The lobby interface close event. + */ + private static final Component LOBBY_INTERFACE = new Component(378).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + return player.getLocks().isLocked("login"); + } + }); + + /** + * Constructs a new {@Code LoginConfiguration} {@Code Object} + */ + public LoginConfiguration() { + /* + * empty. + */ + } + + /** + * Configures the lobby login. + * + * @param player The player. + */ + public static void configureLobby(Player player) { + player.updateSceneGraph(true); + if (!player.isArtificial() && TutorialSession.getExtension(player).getStage() >= TutorialSession.MAX_STAGE && player.getAttribute("login_type", LoginType.NORMAL_LOGIN) != LoginType.RECONNECT_TYPE) { + sendLobbyScreen(player); + } else { + configureGameWorld(player); + } + } + + /** + * Sends the lobby interface-related packets. + * + * @param player The player. + */ + public static void sendLobbyScreen(Player player) { + messModel = autoSelect(); + for(Player p : Repository.getLobbyPlayers()){ + if(p.getName().equals(player.getName())){ + p.clear(); + Repository.getLobbyPlayers().remove(p); + break; + } + } + Repository.getLobbyPlayers().add(player); + player.getPacketDispatch().sendString(getLastLogin(player), 378, 116); + player.getPacketDispatch().sendString("Welcome to " + GameWorld.getSettings().getName(), 378, 115); + player.getPacketDispatch().sendString(" ", 378, 37); + player.getPacketDispatch().sendString("Want to stay up to date with the latest news and updates? Join our
discord by using the link below!", 378, 38); + player.getPacketDispatch().sendString(" ", 378, 39); + player.getPacketDispatch().sendString("Discord Invite", 378, 14); + player.getPacketDispatch().sendString("Discord Invite", 378, 129); + player.getPacketDispatch().sendString("Credits", 378, 94); + player.getPacketDispatch().sendString(player.getDetails().credits + "", 378, 96); + player.getPacketDispatch().sendString(" ", 378, 229); + player.getPacketDispatch().sendString("Want to contribute to 2009scape?
Visit the github using the link below!", 378, 230); + player.getPacketDispatch().sendString(" ", 378, 231); + player.getPacketDispatch().sendString("Github", 378, 240); + player.getPacketDispatch().sendString(GameWorld.getSettings().getMessage_string(), messModel, getMessageChild(messModel)); + player.getPacketDispatch().sendString("You can gain more credits by voting, reporting bugs and various other methods of contribution.", 378, 93); + player.getInterfaceManager().openWindowsPane(LOBBY_PANE); + player.getInterfaceManager().setOpened(LOBBY_INTERFACE); + PacketRepository.send(Interface.class, new InterfaceContext(player, 549, 2, 378, true)); + PacketRepository.send(Interface.class, new InterfaceContext(player, 549, 3, messModel, true));//UPDATE `configs` SET `value`=FLOOR(RAND()*(25-10)+10) WHERE key_="messageInterface" + } + + /** + * Configures the game world. + * + * @param player The player. + */ + public static void configureGameWorld(final Player player) { + player.getConfigManager().reset(); + sendGameConfiguration(player); + Repository.getLobbyPlayers().remove(player); + Repository.getPlayerNames().putIfAbsent(player.getName().toLowerCase(),player); + player.setPlaying(true); + UpdateSequence.getRenderablePlayers().add(player); + RegionManager.move(player); + player.getMusicPlayer().init(); + player.getUpdateMasks().register(new AppearanceFlag(player)); + player.getPlayerFlags().setUpdateSceneGraph(true); + player.getStateManager().init(); + player.getPacketDispatch().sendInterfaceConfig(226, 1, true); + if(player.getGlobalData().getTestStage() == 3 && !player.getEmoteManager().isUnlocked(Emotes.SAFETY_FIRST)){ + player.getEmoteManager().unlock(Emotes.SAFETY_FIRST); + } + player.varpManager.sendAllVarps(); + /*if (GameWorld.getSettings().isPvp()) { + player.getPacketDispatch().sendString("", 226, 1); + }*/ + TutorialSession.extend(player); + TutorialSession.getExtension(player).init(); + /*if (TutorialSession.getExtension(player).getStage() != 73) { + TutorialStage.load(player, TutorialSession.getExtension(player).getStage(), true); + }*/ + } + + /** + * Sends the game configuration packets. + * + * @param player The player to send to. + */ + public static void sendGameConfiguration(final Player player) { + player.getInterfaceManager().openWindowsPane(new Component(player.getInterfaceManager().isResizable() ? 746 : 548)); + player.getInterfaceManager().openChatbox(137); + player.getInterfaceManager().openDefaultTabs(); + welcome(player); + config(player); + for (Plugin plugin : LOGIN_PLUGINS) { + try { + plugin.newInstance(player); + } catch (Throwable e) { + e.printStackTrace(); + } + } + player.getCommunication().sync(player); + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendInfoUpdate(player); + } + } + + /** + * Method used to welcome the player. + * + * @param player the player. Fullscreen mode Object id: + */ + public static final void welcome(final Player player) { + if (GameWorld.getSettings().isPvp()) { + player.getPacketDispatch().sendString("", 226, 0); + } + if (player.isArtificial()) { + + return; + } + player.getPacketDispatch().sendMessage("Welcome to " + GameWorld.getSettings().getName() + "."); + //player.getPacketDispatch().sendMessage("You are currently playing in beta version 1.2"); + if (player.getDetails().isMuted()) { + player.getPacketDispatch().sendMessage("You are muted."); + player.getPacketDispatch().sendMessage("To prevent further mutes please read the rules."); + } +// ResourceAIPManager.get().load(player); +// ResourceAIPManager.get().save(player); + } + + /** + * Method used to configure all possible settings for the player. + * + * @param player the player. + */ + public static final void config(final Player player) { + player.getInventory().refresh(); + player.getEquipment().refresh(); + player.getSkills().refresh(); + player.getSkills().configure(); + player.getSettings().update(); + player.getInteraction().setDefault(); + player.getPacketDispatch().sendRunEnergy(); + player.getFamiliarManager().login(); + player.getInterfaceManager().openDefaultTabs(); + player.getPlayerGrandExchange().init(); + player.getPacketDispatch().sendString("Friends List - World " + GameWorld.getSettings().getWorldId(), 550, 3); + player.getConfigManager().init(); + player.getAntiMacroHandler().init(); + player.getQuestRepository().syncronizeTab(player); + player.getGraveManager().update(); + player.getInterfaceManager().close(); + player.getEmoteManager().refresh(); + player.getInterfaceManager().openInfoBars(); + } + + /** + * Gets the message child for the inter id. + * @notice GameSettings.kt contains the list of what these are + * @param interfaceId The interface id. + * @return The child id. + */ + public static int getMessageChild(int interfaceId) { + if (interfaceId == 622) { + return 8; + } else if (interfaceId == 16) { + return 6; + } else if (interfaceId == 17 || interfaceId == 15 || interfaceId == 18 || interfaceId == 19 || interfaceId == 21 || interfaceId == 22 || interfaceId == 447 || interfaceId == 405) { + return 4; + } else if (interfaceId == 20 || interfaceId == 623) { + return 5; + } else if (interfaceId == 23 || interfaceId == 800) { + return 3; + } else if (interfaceId == 715) { + return 2; + } else if (interfaceId == 679) { + return 1; + } + return 0; + } + + /** + * Sets a random interface id for the "message of the week" models + */ + private final static int autoSelect() { + boolean contains = IntStream.of(MESSAGE_MODEL).anyMatch(x -> x == GameWorld.getSettings().getMessage_model()); + return contains ? GameWorld.getSettings().getMessage_model():MESSAGE_MODEL[new Random().nextInt(MESSAGE_MODEL.length)]; + } + + /** + * Gets the last login string for the lobby. + * + * @param player the player. + * @return the last login. + */ + public static String getLastLogin(Player player) { + String lastIp = (String) player.getDetails().getSqlManager().getTable().getColumn("lastGameIp").getValue(); + if (lastIp == null || lastIp == "") { + lastIp = player.getDetails().getIpAddress(); + } + String string = "You last logged in @timeAgo from: " + lastIp; + long time = player.getDetails().getLastLogin(); + Date lastLogin = new Date(time); + Date current = new Date(); + long diff = current.getTime() - lastLogin.getTime(); + int days = (int) TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); + if (days < 1) { + string = string.replace("@timeAgo", "earlier today"); + } else if (days == 1) { + string = string.replace("@timeAgo", "yesterday"); + } else { + string = string.replace("@timeAgo", days + " days ago"); + } + return string; + } + + + /** + * Gets the loginPlugins. + * + * @return The loginPlugins. + */ + public static List> getLoginPlugins() { + return LOGIN_PLUGINS; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginParser.kt b/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginParser.kt new file mode 100644 index 000000000..e3ef8b65c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginParser.kt @@ -0,0 +1,236 @@ +package core.game.node.entity.player.info.login + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.PlayerDetails +import core.game.system.SystemLogger +import core.game.system.SystemManager +import core.game.system.monitor.PlayerMonitor +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.repository.Repository +import core.net.amsc.MSPacketRepository +import core.net.amsc.ManagementServerState +import core.net.amsc.WorldCommunicator +import java.util.concurrent.TimeUnit +import java.util.concurrent.locks.Lock +import java.util.concurrent.locks.ReentrantLock + +/** + * Parses the login of a player. + * @author Emperor + * @author Vexia + */ +class LoginParser( + /** + * The player details file. + */ + val details: PlayerDetails, + /** + * The login type. + */ + private val type: LoginType) : Runnable { + /** + * Gets the player details. + * @return The player details. + */ + + /** + * The player in the game, used for reconnect login type. + */ + private var gamePlayer: Player? = null + + /** + * Gets the timeStamp. + * @return the timeStamp + */ + /** + * The time stamp. + */ + val timeStamp: Int + override fun run() { + try { + LOCK.tryLock(1000L, TimeUnit.MILLISECONDS) + } catch (e: Exception) { + println(e) + LOCK.unlock() + return + } + try { + if (validateRequest()) { + handleLogin() + } + } catch (t: Throwable) { + t.printStackTrace() + try { + flag(Response.ERROR_LOADING_PROFILE) + Repository.LOGGED_IN_PLAYERS.remove(details.username) + } catch (e: Throwable) { + e.printStackTrace() + } + } + LOCK.unlock() + } + + /** + * Handles the actual login. + */ + private fun handleLogin() { + val p = worldInstance + if (!details.parse()) { + flag(Response.INVALID_LOGIN_SERVER) + return + } + val player = p ?: Player(details) + player.setAttribute("login_type", type) + if (p != null) { // Reconnecting + p.updateDetails(details) + reconnect(p, type) + return + } + initialize(player, false) + } + + /** + * Initializes the player. + * @param player The player. + * @param reconnect If the player data should be parsed. + */ + fun initialize(player: Player, reconnect: Boolean) { + if (reconnect) { + reconnect(player, type) + return + } + if(!PlayerParser.parse(player)){ + Repository.players.remove(player) + Repository.LOGGED_IN_PLAYERS.remove(player.username) + Repository.lobbyPlayers.remove(player) + Repository.playerNames.remove(player.name) + MSPacketRepository.sendPlayerRemoval(player.name) + flag(Response.ERROR_LOADING_PROFILE) + return + } + //Repository.getPlayerNames().put(player.getName(), player); + GameWorld.Pulser.submit(object : Pulse(1) { + override fun pulse(): Boolean { + try { + if (details.session.isActive) { + val p = Repository.getPlayerByName(player.name) + if (p != null) { + p.clear() + Repository.playerNames.remove(p.name) + Repository.lobbyPlayers.remove(p) + Repository.players.remove(p) + } + if (!Repository.players.contains(player)) { + Repository.players.add(player) + } + player.details.session.setObject(player) + flag(Response.SUCCESSFUL) + player.init() + player.monitor.log(player.details.ipAddress, PlayerMonitor.ADDRESS_LOG) + player.monitor.log(player.details.serial, PlayerMonitor.ADDRESS_LOG) + player.monitor.log(player.details.macAddress, PlayerMonitor.ADDRESS_LOG) + } else { + Repository.playerNames.remove(player.name) + MSPacketRepository.sendPlayerRemoval(player.name) + } + } catch (t: Throwable) { + t.printStackTrace() + Repository.playerNames.remove(player.name) + MSPacketRepository.sendPlayerRemoval(player.name) + } + return true + } + }) + } + + /** + * Gets the player instance in the current world. + * @return The player instance, if found. + */ + private val worldInstance: Player? + private get() { + var player = Repository.disconnectionQueue[details.username] + if (player == null) { + player = gamePlayer + } + return player + } + + /** + * Initializes a reconnecting player. + * @param player The player. + * @param type The login type. + */ + private fun reconnect(player: Player, type: LoginType) { + Repository.disconnectionQueue.remove(details.username) + player.initReconnect() + player.isActive = true + flag(Response.SUCCESSFUL) + player.updateSceneGraph(true) + player.configManager.init() + LoginConfiguration.configureGameWorld(player) + Repository.playerNames[player.name] = player + GameWorld.Pulser.submit(object : Pulse(1) { + override fun pulse(): Boolean { + if (!Repository.players.contains(player)) { + Repository.players.add(player) + } + return true + } + }) + } + + /** + * Checks if the login request is valid. + * @return `True` if the request is valid. + */ + private fun validateRequest(): Boolean { + //This is supposed to prevent the double-logging issue. Will it work? Who knows. + if (Repository.LOGGED_IN_PLAYERS.contains(details.username)) { + SystemLogger.logWarn("LOGGED_IN_PLAYERS contains ${details.username}") + return flag(Response.ALREADY_ONLINE) + } + if (WorldCommunicator.getState() == ManagementServerState.CONNECTING) { + return flag(Response.LOGIN_SERVER_OFFLINE) + } + if (!details.session.isActive) { + return false + } + if (SystemManager.isUpdating()) { + return flag(Response.UPDATING) + } + if (Repository.getPlayerByName(details.username).also { gamePlayer = it } != null && gamePlayer!!.session.isActive) { + return flag(Response.ALREADY_ONLINE) + } + return if (details.isBanned) { + flag(Response.ACCOUNT_DISABLED) + } else true + } + + /** + * Flags a response. + * @param response the [Response]. + * @return `True` if successfully logged in. + */ + fun flag(response: Response): Boolean { + details.session.write(response, true) + return response == Response.SUCCESSFUL + } + + companion object { + /** + * The lock used to disable 2 of the same player being logged in. + */ + private val LOCK: Lock = ReentrantLock() + } + + /** + * Constructs a new `LoginParser` `Object`. + * @param details the player details. + * @param type The login type. + */ + init { + timeStamp = GameWorld.ticks + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginType.java b/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginType.java new file mode 100644 index 000000000..63f17f8d2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/login/LoginType.java @@ -0,0 +1,60 @@ +package core.game.node.entity.player.info.login; + +/** + * Represents a type of {@link LoginParser} + * @author 'Vexia + * @date July-16-13 + */ +public enum LoginType { + + /** + * Represents the Login type of a default connection. + */ + NORMAL_LOGIN(16), + + /** + * Represents the Login type of a reconnection. + */ + RECONNECT_TYPE(18); + + /** + * The type of {@link LoginParser}. + */ + private int type; + + /** + * Constructs a new {@code LoginType} {@code Object}. + * @param type the type of login. + */ + LoginType(int type) { + this.setType(type); + } + + /** + * Method used to return the login type from the id sent from the client. + * @param type the type. + * @return {@link #LoginType(int)} + */ + public static LoginType fromType(int type) { + for (LoginType login : LoginType.values()) { + if (login.getType() == type) { + return login; + } + } + return null; + } + + /** + * @return the type. + */ + public int getType() { + return type; + } + + /** + * @param type the type to set. + */ + public void setType(int type) { + this.type = type; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerParser.java b/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerParser.java new file mode 100644 index 000000000..574bebeaa --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerParser.java @@ -0,0 +1,76 @@ +package core.game.node.entity.player.info.login; + +import core.ServerConstants; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.system.SystemLogger; +import core.game.world.map.Location; + +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileChannel.MapMode; +import java.util.Arrays; + +/** + * Class used to abstract the process of loading a player save. + * @author Ceikry + */ +public final class PlayerParser { + /** + * Parses or creates the player's save file depending on whether or not it exists. + * @param player The player. + */ + public static boolean parse(Player player) { + File JSON = new File(ServerConstants.PLAYER_SAVE_PATH + player.getName() + ".json"); + + try { + if (JSON.exists()) { //parse the new JSON type. + new PlayerSaveParser(player).parse(); + } else { //Create new save + makeFromTemplate(player); + new PlayerSaveParser(player).parse(); + } + return true; + } catch (Exception e){ + return false; + } + } + /** + * Saves the player's details to the character file at data/players/player_name.json + * @param player The player. + */ + public static void save(Player player) { + new PlayerSaver(player).save(); + } + + /** + * Copies the template at data/players/template/template.json to data/players/player_name.json + * @param player the player to copy the template for. + */ + public static void makeFromTemplate(Player player){ + InputStream is = null; + OutputStream os = null; + try { + is = new FileInputStream(ServerConstants.PLAYER_SAVE_PATH + "template/template.json"); + os = new FileOutputStream(ServerConstants.PLAYER_SAVE_PATH + player.getName() + ".json"); + byte[] buffer = new byte[1024]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + } catch (Exception ignored){ + } finally { + try { + assert is != null; + is.close(); + assert os != null; + os.close(); + } catch (Exception f){ + SystemLogger.logWarn("Unable to close file copiers in PlayerParser.java line 216."); + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaveParser.kt b/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaveParser.kt new file mode 100644 index 000000000..39b6e8042 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaveParser.kt @@ -0,0 +1,383 @@ +package core.game.node.entity.player.info.login + +import core.JSONUtils +import core.ServerConstants +import core.game.node.entity.combat.CombatSpell +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.IronmanMode +import core.game.node.entity.player.link.SpellBookManager +import core.game.node.entity.player.link.emote.Emotes +import core.game.node.entity.player.link.grave.GraveType +import core.game.node.entity.player.link.music.MusicEntry +import core.game.node.entity.state.EntityState +import core.game.system.SystemLogger +import core.game.world.GameWorld +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import core.game.content.ame.AntiMacroHandler +import core.game.interaction.item.brawling_gloves.BrawlingGloves +import core.game.node.entity.state.newsys.StateRepository +import java.io.FileReader +import java.util.* + +/** + * Class used for parsing JSON player saves. + * @author Ceikry + * @param player: The player we are parsing. + */ +class PlayerSaveParser(val player: Player) { + var parser = JSONParser() + var reader: FileReader? = FileReader(ServerConstants.PLAYER_SAVE_PATH + player.name + ".json") + var saveFile: JSONObject? = null + var read = true + + init { + reader + ?: SystemLogger.logWarn("Couldn't find save file for ${player.name}, or save is corrupted.").also { read = false } + if (read) { + saveFile = parser.parse(reader) as JSONObject + } + } + + fun parse() = GlobalScope.launch { + if (read) { + launch { + parseCore() + parseSkills() + parseSettings() + parseSlayer() + parseQuests() + parseAppearance() + parseGrave() + parseVarps() + parseStates() + } + launch { + parseSpellbook() + parseGrandExchange() + parseSavedData() + parseAutocastSpell() + parseFarming() + parseConfigs() + parseMonitor() + } + launch { + parseMusic() + parseFamiliars() + parseBarCrawl() + parseAntiMacro() + parseTT() + parseBankPin() + } + launch { + parseHouse() + parseIronman() + parseEmoteManager() + parseStatistics() + parseBrawlingGloves() + parseAttributes() + parseAchievements() + parsePouches() + } + parsePouches() + } + } + + fun parseVarps(){ + if(saveFile!!.containsKey("varps")) + player.varpManager.parse(saveFile!!["varps"] as JSONArray) + } + + fun parsePouches() { + if (saveFile!!.containsKey("pouches")) + player.pouchManager.parse(saveFile!!["pouches"] as JSONArray) + } + + fun parseAttributes() { + if (saveFile!!.containsKey("attributes")) { + val attrData = saveFile!!["attributes"] as JSONArray + for (a in attrData) { + val attr = a as JSONObject + val key = attr["key"].toString() + val type = attr["type"].toString() + player.gameAttributes.savedAttributes.add(key) + player.gameAttributes.attributes.put(key, when (type) { + "int" -> attr["value"].toString().toInt() + "str" -> attr["value"].toString() + "short" -> attr["value"].toString().toShort() + "long" -> attr["value"].toString().toLong() + "bool" -> attr["value"] as Boolean + "byte" -> Base64.getDecoder().decode(attr["value"].toString())[0] + else -> null.also { SystemLogger.logWarn("Invalid data type for key: $key in PlayerSaveParser.kt Line 115") } + }) + } + } else { + player.gameAttributes.parse(player.name + ".xml") + } + } + + fun parseBrawlingGloves() { + if (saveFile!!.containsKey("brawlingGloves")) { + val bgData: JSONArray = saveFile!!["brawlingGloves"] as JSONArray + for (bg in bgData) { + val glove = bg as JSONObject + player.brawlingGlovesManager.registerGlove(BrawlingGloves.forIndicator(glove.get("gloveId").toString().toInt()).id, glove.get("charges").toString().toInt()) + } + } + } + + fun parseStatistics() { + if (saveFile!!.containsKey("statistics")) { + val stats: JSONArray = saveFile!!["statistics"] as JSONArray + for (stat in stats) { + val s = stat as JSONObject + val index = (s.get("index") as String).toInt() + val value = (s.get("value") as String).toInt() + } + } + } + + fun parseEmoteManager() { + if (saveFile!!.containsKey("emoteData")) { + val emoteData: JSONArray = saveFile!!["emoteData"] as JSONArray + for (emote in emoteData) { + val e = Emotes.values()[(emote as String).toInt()] + if (!player.emoteManager.emotes.contains(e)) { + player.emoteManager.emotes.add(e) + } + } + } + } + + fun parseIronman() { + if (saveFile!!.containsKey("ironManMode")) { + val ironmanMode = (saveFile!!["ironManMode"] as String).toInt() + player.ironmanManager.mode = IronmanMode.values()[ironmanMode] + } + } + + fun parseAchievements() { + if (saveFile!!.containsKey("achievementDiaries")) { + val achvData = saveFile!!["achievementDiaries"] as JSONArray + player.achievementDiaryManager.parse(achvData) + } else { + player.achievementDiaryManager.resetRewards() + } + } + + fun parseHouse() { + val houseData = saveFile!!["houseData"] as JSONObject + player.houseManager.parse(houseData) + } + + fun parseBankPin() { + val bpData = saveFile!!["bankPinManager"] as JSONObject + player.bankPinManager.parse(bpData) + } + + fun parseTT() { + val ttData = saveFile!!["treasureTrails"] as JSONObject + player.treasureTrailManager.parse(ttData) + } + + fun parseAntiMacro() { + if (saveFile!!.containsKey("antiMacroEvent")) { + val event: JSONObject = saveFile!!["antiMacroEvent"] as JSONObject + val ame = AntiMacroHandler.EVENTS.get(event.get("eventName") as String) + ame?.create(player) + } + } + + fun parseStates() { + player.states.clear() + SystemLogger.logErr("Parsing states") + if (saveFile!!.containsKey("states")) { + val states: JSONArray = saveFile!!["states"] as JSONArray + for (state in states) { + val s = state as JSONObject + val stateId = s["stateKey"].toString() + if(player.states[stateId] != null) continue + val stateClass = player.registerState(stateId) + stateClass?.parse(s) + stateClass?.init() + player.states.put(stateId,stateClass) + } + } + } + + fun parseBarCrawl() { + val barCrawlData = saveFile!!["barCrawl"] as JSONObject + player.barcrawlManager.parse(barCrawlData) + } + + fun parseFamiliars() { + val familiarData = saveFile!!["familiarManager"] as JSONObject + player.familiarManager.parse(familiarData) + } + + fun parseMusic() { + val unlockedSongs = saveFile!!["unlockedMusic"] as JSONArray + for (song in unlockedSongs) { + val s = (song as String).toInt() + val entry = MusicEntry.forId(s) + player.musicPlayer.unlocked.put(entry.index, entry) + } + } + + fun parseMonitor() { + val monitorData = saveFile!!["playerMonitor"] as JSONObject + if (monitorData.containsKey("duplicationFlag")) { + val duplicationFlag: Int = (monitorData.get("duplicationFlag") as String).toInt() + player.monitor.duplicationLog.flag(duplicationFlag) + } + if (monitorData.containsKey("macroFlag")) { + val macroFlag: Int = (monitorData.get("macroFlag") as String).toInt() + player.monitor.macroFlag = macroFlag + } + if (monitorData.containsKey("lastIncreaseFlag")) { + val lastIncreaseFlag: Long = (monitorData.get("lastIncreaseFlag") as String).toLong() + player.monitor.duplicationLog.lastIncreaseFlag = lastIncreaseFlag + } + } + + fun parseConfigs() { + val configs = saveFile!!["configs"] as JSONArray + for (config in configs) { + val c = config as JSONObject + val index = (c.get("index") as String).toInt() + if(index == 1048) continue + val value = (c.get("value") as String).toInt() + player.configManager.savedConfigurations[index] = value + } + } + + fun parseFarming() { + /*val farmingData = saveFile!!["farming"] as JSONObject + + if (farmingData.containsKey("equipment")) { + val equipmentData: JSONArray? = farmingData.get("equipment") as JSONArray + player.farmingManager.equipment.container.parse(equipmentData) + } + if (farmingData.containsKey("bins")) { + val compostData: JSONArray? = farmingData.get("bins") as JSONArray + player.farmingManager.compostManager.parse(compostData) + } + if (farmingData.containsKey("wrappers")) { + val wrapperData: JSONArray? = farmingData.get("wrappers") as JSONArray + player.farmingManager.parseWrappers(wrapperData) + } + if(farmingData.containsKey("seedlings")){ + val seedlingData = farmingData.get("seedlings") as JSONArray + player.farmingManager.seedlingManager.parse(seedlingData) + } + if(farmingData.containsKey("farmingAmuletWrapperID")){ + player.farmingManager.amuletBoundWrapper = player.farmingManager.getPatchWrapper(farmingData.get("farmingAmuletWrapperID").toString().toInt()) + }*/ + } + + fun parseAutocastSpell() { + val autocastRaw = saveFile!!["autocastSpell"] + autocastRaw ?: return + val autocast = autocastRaw as JSONObject + val book = (autocast.get("book") as String).toInt() + val spellId = (autocast.get("spellId") as String).toInt() + player.properties.autocastSpell = SpellBookManager.SpellBook.values()[book].getSpell(spellId) as CombatSpell + } + + fun parseSavedData() { + val activityData = saveFile!!["activityData"] as JSONObject + val questData = saveFile!!["questData"] as JSONObject + val globalData = saveFile!!["globalData"] as JSONObject + player.savedData.activityData.parse(activityData) + player.savedData.questData.parse(questData) + player.savedData.globalData.parse(globalData) + } + + fun parseGrandExchange() { + val geData: Any? = saveFile!!["grand_exchange"] + if (geData != null) { + player.playerGrandExchange.parse(geData as JSONObject) + } + + } + + fun parseSpellbook() { + val spellbookData = (saveFile!!["spellbook"] as String).toInt() + player.spellBookManager.setSpellBook(SpellBookManager.SpellBook.forInterface(spellbookData)) + } + + fun parseGrave() { + saveFile ?: return + val graveData = (saveFile!!["grave_type"] as String).toInt() + player.graveManager.type = GraveType.values()[graveData] + } + + fun parseAppearance() { + saveFile ?: return + val appearanceData = saveFile!!["appearance"] as JSONObject + player.appearance.parse(appearanceData) + } + + fun parseQuests() { + saveFile ?: return + val questData = saveFile!!["quests"] as JSONObject + player.questRepository.parse(questData) + } + + fun parseSlayer() { + saveFile ?: return + val slayerData = saveFile!!["slayer"] as JSONObject + player.slayer.parse(slayerData) + } + + fun parseCore() { + saveFile ?: return + val coreData = saveFile!!["core_data"] as JSONObject + val inventory = coreData["inventory"] as JSONArray + val bank = coreData["bank"] as JSONArray + val equipment = coreData["equipment"] as JSONArray + val location = coreData["location"] as String + val bankTabData = coreData["bankTabs"] + if (bankTabData != null) { + val tabData = bankTabData as JSONArray + for (i in tabData) { + i ?: continue + val tab = i as JSONObject + val index = tab["index"].toString().toInt() + val startSlot = tab["startSlot"].toString().toInt() + player.bank.tabStartSlot[index] = startSlot + } + } + player.inventory.parse(inventory) + player.bank.parse(bank) + player.equipment.parse(equipment) + player.location = JSONUtils.parseLocation(location) + } + + fun parseSkills() { + saveFile ?: return + val skillData = saveFile!!["skills"] as JSONArray + player.skills.parse(skillData) + player.skills.experienceGained = saveFile!!["totalEXP"].toString().toDouble() + player.skills.experienceMutiplier = saveFile!!["exp_multiplier"].toString().toDouble() + if (GameWorld.settings?.default_xp_rate != 5.0) { + player.skills.experienceMutiplier = GameWorld.settings?.default_xp_rate!! + } + if (saveFile!!.containsKey("milestone")) { + val milestone: JSONObject = saveFile!!["milestone"] as JSONObject + player.skills.combatMilestone = (milestone.get("combatMilestone")).toString().toInt() + player.skills.skillMilestone = (milestone.get("skillMilestone")).toString().toInt() + } + } + + fun parseSettings() { + saveFile ?: return + val settingsData = saveFile!!["settings"] as JSONObject + player.settings.parse(settingsData) + } + + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaver.kt b/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaver.kt new file mode 100644 index 000000000..299a812c8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/login/PlayerSaver.kt @@ -0,0 +1,810 @@ +package core.game.node.entity.player.info.login + +import core.ServerConstants +import core.game.container.Container +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.IronmanMode +import core.game.system.SystemLogger +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import core.game.interaction.item.brawling_gloves.BrawlingGloves +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.summoning.familiar.BurdenBeast +import core.game.node.entity.skill.summoning.pet.Pet +import java.io.FileWriter +import java.io.IOException +import java.lang.Math.ceil +import java.util.* +import javax.script.ScriptEngineManager + + +/** + * Class used for saving the player's data in JSON format. + * Files are saved in the directory defined in ServerConstants.PLAYER_SAVE_PATH + * @param player: the player to save for. + * @author Ceikry + */ +class PlayerSaver (val player: Player){ + private fun populate(): JSONObject = runBlocking{ + val saveFile = JSONObject() + val a = launch { + saveCoreData(saveFile) + saveSkills(saveFile) + saveSettings(saveFile) + saveSlayer(saveFile) + saveQuests(saveFile) + saveAppearance(saveFile) + saveSpellbook(saveFile) + saveVarps(saveFile) + } + val b = launch { + saveGraveType(saveFile) + saveGrandExchangeData(saveFile) + saveSavedData(saveFile) + saveAutocast(saveFile) + saveFarming(saveFile) + saveConfigs(saveFile) + savePlayerMonitor(saveFile) + } + val c = launch { + saveMusicPlayer(saveFile) + saveFamiliarManager(saveFile) + saveBarCrawl(saveFile) + saveStateManager(saveFile) + saveAntiMacroHandler(saveFile) + saveTreasureTrails(saveFile) + saveBankPinData(saveFile) + } + val d = launch { + saveHouseData(saveFile) + saveAchievementData(saveFile) + saveIronManData(saveFile) + saveEmoteData(saveFile) + saveStatManager(saveFile) + saveBrawlingGloves(saveFile) + saveAttributes(saveFile) + } + a.join() + b.join() + c.join() + d.join() + savePouches(saveFile) + saveFile + } + fun save() = runBlocking { + val manager = ScriptEngineManager() + val scriptEngine = manager.getEngineByName("JavaScript") + scriptEngine.put("jsonString", populate().toJSONString()) + scriptEngine.eval("result = JSON.stringify(JSON.parse(jsonString), null, 2)") + val prettyPrintedJson = scriptEngine["result"] as String + + try { + FileWriter("${ServerConstants.PLAYER_SAVE_PATH}${player.name}.json").use { file -> + file.write(prettyPrintedJson) + file.flush() + } + } catch (e: IOException) { + e.printStackTrace() + } + } + + fun saveVarps(root: JSONObject){ + player.varpManager.save(root) + } + + fun savePouches(root: JSONObject){ + player.pouchManager.save(root) + } + + fun saveAttributes(root: JSONObject){ + if(player.gameAttributes.savedAttributes.isNotEmpty()){ + val attrs = JSONArray() + for(key in player.gameAttributes.savedAttributes){ + val value = player.gameAttributes.attributes[key] + value ?: continue + val attr = JSONObject() + val type = when(value){ + is Int -> "int" + is Boolean -> "bool" + is Long -> "long" + is Short -> "short" + is String -> "str" + is Byte -> "byte" + else -> "null".also { SystemLogger.logWarn("Invalid attribute type for key: $key in PlayerSaver.kt Line 115") } + } + attr.put("type",type) + attr.put("key",key) + if(value is Byte){ + val asString = Base64.getEncoder().encodeToString(byteArrayOf(value)) + attr.put("value",asString) + } else { + attr.put("value", if (value is Boolean) value else value.toString()) + } + attrs.add(attr) + } + root.put("attributes",attrs) + } + } + + fun saveBrawlingGloves(root: JSONObject){ + if(player.brawlingGlovesManager.GloveCharges.isNotEmpty()){ + val brawlingGloves = JSONArray() + player.brawlingGlovesManager.GloveCharges.map { + val brawlingGlove = JSONObject() + brawlingGlove.put("gloveId",BrawlingGloves.forId(it.key).indicator.toString()) + brawlingGlove.put("charges",it.value.toString()) + brawlingGloves.add(brawlingGlove) + } + root.put("brawlingGloves",brawlingGloves) + } + } + + fun saveStatManager(root: JSONObject){ + val statistics = JSONArray() + var index = 0 + root.put("statistics",statistics) + } + + fun saveEmoteData(root: JSONObject){ + if(player.emoteManager.isSaveRequired) { + val emoteData = JSONArray() + player.emoteManager.emotes.map { + emoteData.add(it.ordinal.toString()) + } + root.put("emoteData",emoteData) + } + } + + fun saveIronManData(root: JSONObject){ + if(player.ironmanManager.mode != IronmanMode.NONE){ + root.put("ironManMode",player.ironmanManager.mode.ordinal.toString()) + } + } + + fun saveAchievementData(root: JSONObject){ + val achievementData = JSONArray() + player.achievementDiaryManager.diarys.map { + val diary = JSONObject() + val startedLevels = JSONArray() + it.levelStarted.map { + startedLevels.add(it) + } + diary.put("startedLevels",startedLevels) + val completedLevels = JSONArray() + it.taskCompleted.map { + val level = JSONArray() + it.map { + level.add(it) + } + completedLevels.add(level) + } + diary.put("completedLevels",completedLevels) + val rewardedLevels = JSONArray() + it.levelRewarded.map { + rewardedLevels.add(it) + } + diary.put("rewardedLevels",rewardedLevels) + val diaryCollector = JSONObject() + diaryCollector.put(it.type.name, diary) + achievementData.add(diaryCollector) + } + root.put("achievementDiaries",achievementData) + } + + fun saveHouseData(root: JSONObject){ + val manager = player.houseManager + val houseData = JSONObject() + houseData.put("location",manager.location.ordinal.toString()) + houseData.put("style",manager.style.ordinal.toString()) + if(manager.hasServant()){ + val servant = JSONObject() + servant.put("type",manager.servant.type.ordinal.toString()) + servant.put("uses",manager.servant.uses.toString()) + if(manager.servant.item != null){ + val item = JSONObject() + item.put("id",manager.servant.item.id.toString()) + item.put("amount",manager.servant.item.amount.toString()) + servant.put("item",item) + } + servant.put("greet",manager.servant.isGreet) + houseData.put("servant",servant) + } + val rooms = JSONArray() + var z = 0 + for(room in player.houseManager.rooms){ + var x = 0 + for(xr in room){ + var y = 0 + for(yr in xr){ + if(yr != null) { + val r = JSONObject() + r.put("z", z.toString()) + r.put("x", x.toString()) + r.put("y", y.toString()) + r.put("properties", yr.properties.ordinal.toString()) + r.put("rotation", yr.rotation.toInteger().toString()) + val hotspots = JSONArray() + var hotspotIndex = 0 + yr.hotspots.map { + if (it.decorationIndex > -1) { + val hotspot = JSONObject() + hotspot.put("hotspotIndex", hotspotIndex.toString()) + hotspot.put("decorationIndex", it.decorationIndex.toString()) + hotspots.add(hotspot) + } + hotspotIndex++ + } + r.put("hotspots", hotspots) + rooms.add(r) + } + y++ + } + x++ + } + z++ + } + houseData.put("rooms",rooms) + root.put("houseData",houseData) + } + + fun saveBankPinData(root: JSONObject){ + val bankPinManager = JSONObject() + if(player.bankPinManager.hasPin()){ + bankPinManager.put("pin",player.bankPinManager.pin.toString()) + } + bankPinManager.put("longRecovery",player.bankPinManager.isLongRecovery) + if(player.bankPinManager.status.ordinal != 0){ + bankPinManager.put("status",player.bankPinManager.status.ordinal.toString()) + } + if(player.bankPinManager.pendingDelay != -1L && player.bankPinManager.pendingDelay > System.currentTimeMillis()){ + bankPinManager.put("pendingDelay",player.bankPinManager.pendingDelay.toString()) + } + if(player.bankPinManager.tryDelay > System.currentTimeMillis()){ + bankPinManager.put("tryDelay",player.bankPinManager.tryDelay.toString()) + } + root.put("bankPinManager",bankPinManager) + } + + fun saveTreasureTrails(root: JSONObject){ + val treasureTrailManager = JSONObject() + if(player.treasureTrailManager.hasTrail()){ + val trail = JSONObject() + trail.put("clueId",player.treasureTrailManager.clueId.toString()) + trail.put("length",player.treasureTrailManager.trailLength.toString()) + trail.put("stage",player.treasureTrailManager.trailStage.toString()) + treasureTrailManager.put("trail",trail) + } + val completedClues = JSONArray() + player.treasureTrailManager.completedClues.map { + completedClues.add(it.toString()) + } + treasureTrailManager.put("completedClues",completedClues) + root.put("treasureTrails",treasureTrailManager) + } + + fun saveAntiMacroHandler(root: JSONObject){ + if(player.antiMacroHandler.isSaveRequired){ + val antiMacroEvent = JSONObject() + if(player.antiMacroHandler.hasEvent()){ + antiMacroEvent.put("eventName",player.antiMacroHandler.event.name) + root.put("antiMacroEvent",antiMacroEvent) + } + } + } + + fun saveStateManager(root: JSONObject){ + val states = JSONArray() + player.states.forEach{key,clazz -> + if(clazz != null && clazz.pulse != null) { + val stateObj = JSONObject() + stateObj.put("stateKey", key) + clazz.save(stateObj) + states.add(stateObj) + } + } + root.put("states",states) + } + + fun saveBarCrawl(root: JSONObject){ + val barCrawl = JSONObject() + barCrawl.put("started",player.barcrawlManager.isStarted) + val barsVisited = JSONArray() + player.barcrawlManager.bars.map { + barsVisited.add(it) + } + barCrawl.put("bars",barsVisited) + root.put("barCrawl",barCrawl) + } + + fun saveFamiliarManager(root: JSONObject){ + val familiarManager = JSONObject() + val petDetails = JSONArray() + player.familiarManager.petDetails.map { + val detail = JSONObject() + detail.put("petId",it.key.toString()) + detail.put("hunger",it.value.hunger.toString()) + detail.put("growth",it.value.growth.toString()) + detail.put("stage",it.value.stage.toString()) + petDetails.add(detail) + } + familiarManager.put("petDetails",petDetails) + if(player.familiarManager.hasPet()){ + familiarManager.put("currentPet",(player.familiarManager.familiar as Pet).pet.babyItemId.toString()) + } else if (player.familiarManager.hasFamiliar()){ + val familiar = JSONObject() + familiar.put("originalId",player.familiarManager.familiar.originalId.toString()) + familiar.put("ticks",player.familiarManager.familiar.ticks.toString()) + familiar.put("specialPoints",player.familiarManager.familiar.specialPoints.toString()) + if(player.familiarManager.familiar.isBurdenBeast && !(player.familiarManager.familiar as BurdenBeast).container.isEmpty){ + val familiarInventory = saveContainer((player.familiarManager.familiar as BurdenBeast).container) + familiar.put("inventory",familiarInventory) + } + familiar.put("lifepoints",player.familiarManager.familiar.skills.lifepoints) + familiarManager.put("familiar",familiar) + + } + root.put("familiarManager",familiarManager) + } + + fun saveMusicPlayer(root: JSONObject){ + val unlockedMusic = JSONArray() + player.musicPlayer.unlocked.values.map { + unlockedMusic.add(it.id.toString()) + } + root.put("unlockedMusic",unlockedMusic) + } + + fun savePlayerMonitor(root: JSONObject){ + val playerMonitor = JSONObject() + if(player.monitor.duplicationLog != null && player.monitor.duplicationLog.flag != 0){ + playerMonitor.put("duplicationFlag",player.monitor.duplicationLog.flag.toString()) + } + if(player.monitor.macroFlag != 0){ + playerMonitor.put("macroFlag",player.monitor.macroFlag.toString()) + } + if(player.monitor.duplicationLog != null && player.monitor.duplicationLog.isLoggingFlagged){ + playerMonitor.put("lastIncreaseFlag",player.monitor.duplicationLog.lastIncreaseFlag.toString()) + } + root.put("playerMonitor",playerMonitor) + } + + fun saveConfigs(root: JSONObject){ + val configs = JSONArray() + var idx = 0 + player.configManager.savedConfigurations.map { + if(it != 0){ + val config = JSONObject() + config.put("index",idx.toString()) + config.put("value",it.toString()) + configs.add(config) + } + idx++ + } + root.put("configs",configs) + } + + fun saveFarming(root: JSONObject){ + /*val farming = JSONObject() + if(player.farmingManager.equipment.container.itemCount() != 0) { + val equipment = saveContainer(player.farmingManager.equipment.container) + farming.put("equipment",equipment) + } + if(player.farmingManager.compostManager.bins.size != 0){ + val bins = JSONArray() + player.farmingManager.compostManager.bins.map { compostBin -> + val bin = JSONObject() + bin.put("wrapperId",compostBin.wrapperId.toString()) + if(compostBin.timeStamp != 0L){ + bin.put("timeStamp",compostBin.timeStamp.toString()) + } + if(compostBin.compostLevel > 0) { + bin.put("compostLevel",compostBin.compostLevel.toString()) + } + if(compostBin.container.itemCount() > 0) { + val compostContainer = saveContainer(compostBin.container) + bin.put("compostContainer", compostContainer) + } + bins.add(bin) + } + farming.put("bins",bins) + player.farmingManager.seedlingManager.save(farming) + } + + if(player.farmingManager.patches.size != 0){ + val wrappers = JSONArray() + player.farmingManager.patches.map { + val wrapper = JSONObject() + wrapper.put("wrapperId",it.wrapperId.toString()) + if(player.farmingManager.amuletBoundWrapper == player.farmingManager.getPatchWrapper(it.wrapperId)) + farming.put("farmingAmuletWrapperID",it.wrapperId) + val cycle = JSONObject() + cycle.put("compostThreshold",it.cycle.compostThreshold.toString()) + cycle.put("growthTime",it.cycle.growthTime.toString()) + cycle.put("harvestAmount",it.cycle.harvestAmount.toString()) + cycle.put("protection",it.cycle.isProtected) + wrapper.put("cycle",cycle) + if(it.node != null){ + wrapper.put("nodeId",it.patch.getNodePosition(it.node).toString()) + } + wrappers.add(wrapper) + } + farming.put("wrappers",wrappers) + } + root.put("farming",farming)*/ + } + + fun saveAutocast(root: JSONObject){ + player.properties.autocastSpell ?: return + val spell = JSONObject() + spell.put("book",player.properties.autocastSpell.book.ordinal.toString()) + spell.put("spellId",player.properties.autocastSpell.spellId.toString()) + root.put("autocastSpell",spell) + } + + fun saveSavedData(root: JSONObject) { + saveActivityData(root) + saveQuestData(root) + saveGlobalData(root) + } + + fun saveGlobalData(root: JSONObject){ + val globalData = JSONObject() + globalData.put("tutorialStage",player.savedData.globalData.tutorialStage.toString()) + globalData.put("homeTeleportDelay",player.savedData.globalData.homeTeleportDelay.toString()) + globalData.put("lumbridgeRope",player.savedData.globalData.hasTiedLumbridgeRope()) + globalData.put("apprentice",player.savedData.globalData.hasSpokenToApprentice()) + globalData.put("assistTime",player.savedData.globalData.assistTime.toString()) + val assistExperience = JSONArray() + player.savedData.globalData.assistExperience.map { + assistExperience.add(it.toString()) + } + globalData.put("assistExperience",assistExperience) + val strongholdRewards = JSONArray() + player.savedData.globalData.strongHoldRewards.map { + strongholdRewards.add(it) + } + globalData.put("strongHoldRewards",strongholdRewards) + globalData.put("chatPing",player.savedData.globalData.chatPing.toString()) + globalData.put("tutorClaim",player.savedData.globalData.tutorClaim.toString()) + globalData.put("luthasTask",player.savedData.globalData.isLuthasTask) + globalData.put("karamjaBananas",player.savedData.globalData.karamjaBananas.toString()) + globalData.put("silkSteal",player.savedData.globalData.silkSteal.toString()) + globalData.put("zafAmount",player.savedData.globalData.zaffAmount.toString()) + globalData.put("zafTime",player.savedData.globalData.zafTime.toString()) + globalData.put("fritzGlass",player.savedData.globalData.isFritzGlass) + globalData.put("wydinEmployee",player.savedData.globalData.isWydinEmployee) + globalData.put("draynorRecording",player.savedData.globalData.isDraynorRecording) + globalData.put("geTutorial",player.savedData.globalData.isGeTutorial) + globalData.put("essenceTeleporter",player.savedData.globalData.essenceTeleporter.toString()) + globalData.put("recoilDamage",player.savedData.globalData.recoilDamage.toString()) + globalData.put("doubleExpDelay",player.savedData.globalData.doubleExpDelay.toString()) + globalData.put("joinedMonastery",player.savedData.globalData.isJoinedMonastery) + val readPlaques = JSONArray() + player.savedData.globalData.readPlaques.map { + readPlaques.add(it) + } + globalData.put("readPlaques",readPlaques) + globalData.put("forgingUses",player.savedData.globalData.forgingUses.toString()) + globalData.put("ectoCharges",player.savedData.globalData.ectoCharges.toString()) + globalData.put("braceletClayUses",player.savedData.globalData.braceletClayUses.toString()) + globalData.put("dropDelay",player.savedData.globalData.dropDelay.toString()) + val abyssData = JSONArray() + player.savedData.globalData.abyssData.map { + abyssData.add(it) + } + globalData.put("abyssData",abyssData) + val rcDecays = JSONArray() + player.savedData.globalData.rcDecays.map { + rcDecays.add(it.toString()) + } + globalData.put("rcDecays",rcDecays) + globalData.put("disableDeathScreen",player.savedData.globalData.isDeathScreenDisabled) + globalData.put("playerTestStage",player.savedData.globalData.playerTestStage.toString()) + globalData.put("charmingDelay",player.savedData.globalData.charmingDelay.toString()) + val travelLogs = JSONArray() + player.savedData.globalData.travelLogs.map { + travelLogs.add(it) + } + globalData.put("travelLogs",travelLogs) + val godBooks = JSONArray() + player.savedData.globalData.godBooks.map { + godBooks.add(it) + } + globalData.put("godBooks",godBooks) + globalData.put("disableNews",player.savedData.globalData.isDisableNews) + val godPages = JSONArray() + player.savedData.globalData.godPages.map { + godPages.add(it) + } + globalData.put("godPages",godPages) + globalData.put("overChargeDelay",player.savedData.globalData.overChargeDelay.toString()) + val bossCounters = JSONArray() + player.savedData.globalData.bossCounters.map { + bossCounters.add(it.toString()) + } + globalData.put("bossCounters",bossCounters) + globalData.put("barrowsLoots",player.savedData.globalData.barrowsLoots.toString()) + globalData.put("lootSharePoints",player.savedData.globalData.lootSharePoints.toString()) + globalData.put("lootShareDelay",player.savedData.globalData.lootShareDelay.toString()) + globalData.put("doubleExp",player.savedData.globalData.doubleExp.toString()) + globalData.put("avasDevice",player.savedData.globalData.isAvasDisabled) + globalData.put("globalTeleporterDelay",player.savedData.globalData.globalTeleporterDelay.toString()) + globalData.put("starSpriteDelay",player.savedData.globalData.starSpriteDelay.toString()) + globalData.put("runReplenishDelay",player.savedData.globalData.runReplenishDelay.toString()) + globalData.put("runReplenishCharges",player.savedData.globalData.runReplenishCharges.toString()) + globalData.put("lowAlchemyCharges",player.savedData.globalData.lowAlchemyCharges.toString()) + globalData.put("lowAlchemyDelay",player.savedData.globalData.lowAlchemyDelay.toString()) + globalData.put("magicSkillCapeDelay",player.savedData.globalData.magicSkillCapeDelay.toString()) + globalData.put("hunterCapeDelay",player.savedData.globalData.hunterCapeDelay.toString()) + globalData.put("hunterCapeCharges",player.savedData.globalData.hunterCapeCharges.toString()) + globalData.put("taskAmount",player.savedData.globalData.taskAmount.toString()) + globalData.put("taskPoints",player.savedData.globalData.taskPoints.toString()) + globalData.put("macroDisabled",player.savedData.globalData.macroDisabled) + root.put("globalData",globalData) + } + + fun saveQuestData(root: JSONObject){ + val questData = JSONObject() + val draynorLever = JSONArray() + player.savedData.questData.draynorLever.map { + draynorLever.add(it) + } + questData.put("draynorLever",draynorLever) + val dslayer = JSONArray() + player.savedData.questData.dragonSlayer.map { + dslayer.add(it) + } + questData.put("dragonSlayer",dslayer) + questData.put("dragonSlayerPlanks",player.savedData.questData.dragonSlayerPlanks.toString()) + val demonSlayer = JSONArray() + player.savedData.questData.demonSlayer.map { + demonSlayer.add(it) + } + questData.put("demonSlayer",demonSlayer) + val cooksAssistant = JSONArray() + player.savedData.questData.cooksAssistant.map { + cooksAssistant.add(it) + } + questData.put("cooksAssistant",cooksAssistant) + questData.put("gardenerAttack",player.savedData.questData.isGardenerAttack) + questData.put("talkedDrezel",player.savedData.questData.isTalkedDrezel) + val desertTreasureNode = JSONArray() + player.savedData.questData.desertTreasure.map { + val item = JSONObject() + item.put("id",it.id.toString()) + item.put("amount",it.amount.toString()) + desertTreasureNode.add(item) + } + questData.put("desertTreasureNode",desertTreasureNode) + questData.put("witchsExperimentStage",player.savedData.questData.witchsExperimentStage.toString()) + questData.put("witchsExperimentKilled",player.savedData.questData.isWitchsExperimentKilled) + root.put("questData",questData) + } + + fun saveActivityData(root: JSONObject){ + val activityData = JSONObject() + activityData.put("pestPoints",player.savedData.activityData.pestPoints.toString()) + activityData.put("warriorGuildTokens",player.savedData.activityData.warriorGuildTokens.toString()) + activityData.put("bountyHunterRate",player.savedData.activityData.bountyHunterRate.toString()) + activityData.put("bountyRogueRate",player.savedData.activityData.bountyRogueRate.toString()) + activityData.put("barrowKills",player.savedData.activityData.barrowKills.toString()) + val barrowBrothers = JSONArray() + player.savedData.activityData.barrowBrothers.map { + barrowBrothers.add(it) + } + activityData.put("barrowBrothers",barrowBrothers) + activityData.put("barrowTunnelIndex",player.savedData.activityData.barrowTunnelIndex.toString()) + activityData.put("kolodionStage",player.savedData.activityData.kolodionStage.toString()) + val godCasts = JSONArray() + player.savedData.activityData.godCasts.map { + godCasts.add(it.toString()) + } + activityData.put("godCasts",godCasts) + activityData.put("kolodionBoss",player.savedData.activityData.kolodionBoss.toString()) + activityData.put("elnockSupplies",player.savedData.activityData.isElnockSupplies) + activityData.put("lastBorkBattle",player.savedData.activityData.lastBorkBattle.toString()) + activityData.put("startedMta",player.savedData.activityData.isStartedMta) + activityData.put("lostCannon",player.savedData.activityData.isLostCannon) + val pizazzPoints = JSONArray() + player.savedData.activityData.pizazzPoints.map { + pizazzPoints.add(it.toString()) + } + activityData.put("pizazzPoints",pizazzPoints) + activityData.put("bonesToPeaches",player.savedData.activityData.isBonesToPeaches) + activityData.put("solvedMazes",player.savedData.activityData.solvedMazes.toString()) + activityData.put("fogRating",player.savedData.activityData.fogRating.toString()) + activityData.put("borkKills",player.savedData.activityData.borkKills.toString()) + activityData.put("hardcoreDeath",player.savedData.activityData.hardcoreDeath) + activityData.put("topGrabbed",player.savedData.activityData.isTopGrabbed) + root.put("activityData",activityData) + } + + + fun saveGrandExchangeData(root: JSONObject){ + val grandExchange = JSONObject() + if(player.playerGrandExchange.hasActiveOffer()){ + val offers = JSONArray() + player.playerGrandExchange.offers.map { + if(it != null){ + val offer = JSONObject() + offer["offerIndex"] = it.index.toString() + offer["offerUID"] = it.uid.toString() + offers.add(offer) + } + } + grandExchange["offers"] = offers + } + val history = JSONArray() + player.playerGrandExchange.history.map { + if(it != null){ + val historyEntry = JSONObject() + historyEntry["isSell"] = it.sell + historyEntry["itemId"] = it.itemID.toString() + historyEntry["totalCoinExchange"] = it.totalCoinExchange.toString() + historyEntry["completedAmount"] = it.completedAmount.toString() + history.add(historyEntry) + } + } + grandExchange["history"] = history + root["grand_exchange"] = grandExchange + } + + fun saveGraveType(root: JSONObject){ + root.put("grave_type",player.graveManager.type.ordinal.toString()) + } + + fun saveSpellbook(root: JSONObject){ + root.put("spellbook",player.spellBookManager.spellBook.toString()) + } + + fun saveAppearance(root: JSONObject){ + val appearance = JSONObject() + appearance.put("gender",player.appearance.gender.toByte().toString()) + val appearanceCache = JSONArray() + player.appearance.appearanceCache.map { + val bodyPart = JSONObject() + bodyPart.put("look",it.look.toString()) + bodyPart.put("color",it.color.toString()) + appearanceCache.add(bodyPart) + } + appearance.put("appearance_cache", appearanceCache) + root.put("appearance",appearance) + } + + fun saveQuests(root: JSONObject){ + val quests = JSONObject() + quests.put("points",player.questRepository.points.toString()) + val questStages = JSONArray() + player.questRepository.questList.map { + val quest = JSONObject() + quest.put("questId",it.key.toString()) + quest.put("questStage",it.value.toString()) + questStages.add(quest) + } + quests.put("questStages",questStages) + root.put("quests",quests) + } + + fun saveSlayer(root: JSONObject){ + val slayer = JSONObject() + val slayerManager = player.slayer + if(slayerManager.hasStarted()){ + slayer.put("master",slayerManager.master.npc.toString()) + } + if(slayerManager.hasTask()){ + slayer.put("taskId",slayerManager.task.ordinal.toString()) + slayer.put("taskAmount",slayerManager.amount.toString()) + } + slayer.put("points",slayerManager.slayerPoints.toString()) + slayer.put("taskStreak",slayerManager.taskCount.toString()) + val learnedRewards = JSONArray() + slayerManager.learned.map { + learnedRewards.add(it) + } + slayer.put("learned_rewards",learnedRewards) + if(slayerManager.removed.isNotEmpty()) { + val removedTasks = JSONArray() + slayerManager.removed.map { + removedTasks.add(it.ordinal.toString()) + } + slayer.put("removedTasks",removedTasks) + } + slayer.put("totalTasks",slayerManager.totalTasks.toString()) + slayer.put("canEarnPoints",slayerManager.isCanEarnPoints) + root.put("slayer",slayer) + } + + fun saveSettings(root: JSONObject){ + val settings = JSONObject() + settings.put("brightness",player.settings.brightness.toString()) + settings.put("musicVolume",player.settings.musicVolume.toString()) + settings.put("soundEffectVolume",player.settings.soundEffectVolume.toString()) + settings.put("areaSoundVolume",player.settings.areaSoundVolume.toString()) + settings.put("publicChatSetting",player.settings.publicChatSetting.toString()) + settings.put("privateChatSetting",player.settings.privateChatSetting.toString()) + settings.put("clanChatSetting",player.settings.clanChatSetting.toString()) + settings.put("tradeSetting",player.settings.tradeSetting.toString()) + settings.put("assistSetting",player.settings.assistSetting.toString()) + settings.put("runEnergy",player.settings.runEnergy.toString()) + settings.put("specialEnergy",player.settings.specialEnergy.toString()) + settings.put("attackStyle",player.settings.attackStyleIndex.toString()) + settings.put("singleMouse",player.settings.isSingleMouseButton) + settings.put("disableChatEffects",player.settings.isDisableChatEffects) + settings.put("splitPrivate",player.settings.isSplitPrivateChat) + settings.put("acceptAid",player.settings.isAcceptAid) + settings.put("runToggled",player.settings.isRunToggled) + settings.put("retaliation",player.properties.isRetaliating) + root.put("settings",settings) + } + + fun saveSkills(root: JSONObject){ + val skills = JSONArray() + for(i in 0 until 24){ + val skill = JSONObject() + skill.put("id",i.toString()) + skill.put("static",player.skills.staticLevels[i].toString()) + if(i == Skills.HITPOINTS){ + skill.put("dynamic",player.skills.lifepoints.toString()) + } else if (i == Skills.PRAYER){ + skill.put("dynamic",ceil(player.skills.prayerPoints).toInt().toString()) + } else { + skill.put("dynamic",player.skills.dynamicLevels[i].toString()) + } + skill.put("experience",player.skills.getExperience(i).toString()) + skills.add(skill) + } + root.put("skills",skills) + root.put("totalEXP",player.skills.experienceGained.toString()) + root.put("exp_multiplier",player.skills.experienceMutiplier.toString()) + if(player.skills.combatMilestone > 0 || player.skills.skillMilestone > 0){ + val milestone = JSONObject() + milestone.put("combatMilestone",player.skills.combatMilestone.toString()) + milestone.put("skillMilestone",player.skills.skillMilestone.toString()) + root.put("milestone",milestone) + } + } + + fun saveContainer(container: Container): JSONArray { + val json = JSONArray() + container.toArray().map{ + if (it != null) { + val item = JSONObject() + item.put("slot", it.slot.toString()) + item.put("id", it.id.toString()) + item.put("amount", it.amount.toString()) + item.put("charge", it.charge.toString()) + json.add(item) + } + } + return json + } + + fun saveCoreData(root: JSONObject){ + val coreData = JSONObject() + val inventory = saveContainer(player.inventory) + coreData.put("inventory",inventory) + + val bank = saveContainer(player.bank) + coreData.put("bank",bank) + + val bankTabs = JSONArray() + for(i in player.bank.tabStartSlot.indices){ + val tab = JSONObject() + tab.put("index",i.toString()) + tab.put("startSlot",player.bank.tabStartSlot[i].toString()) + bankTabs.add(tab) + } + coreData.put("bankTabs",bankTabs) + + val equipment = saveContainer(player.equipment) + coreData.put("equipment",equipment) + + val loctemp = player.location + val locStr = "${loctemp.x},${loctemp.y},${loctemp.z}" + coreData.put("location",locStr) + + root.put("core_data",coreData) + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/login/Response.java b/Server/src/main/java/Server/core/game/node/entity/player/info/login/Response.java new file mode 100644 index 000000000..60e6985e6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/login/Response.java @@ -0,0 +1,158 @@ +package core.game.node.entity.player.info.login; + +/** + * Holds the response codes during the attempt to login. + * @author Emperor + */ +public enum Response { + + /** + * An unexpected server response occurred. + */ + UNEXPECTED_RESPONSE(0), + + /** + * Could not display advertisement video, logging in in x seconds. + */ + COULD_NOT_DISPLAY_AD(1), + + /** + * A successful login. + */ + SUCCESSFUL(2), + + /** + * Invalid username or password has been entered. + */ + INVALID_CREDENTIALS(3), + + /** + * This account is banned. + */ + ACCOUNT_DISABLED(4), + + /** + * This account is already logged in. + */ + ALREADY_ONLINE(5), + + /** + * We have updated and client needs to be reloaded. + */ + UPDATED(6), + + /** + * The world is full. + */ + FULL_WORLD(7), + + /** + * Login server is offline. + */ + LOGIN_SERVER_OFFLINE(8), + + /** + * The login limit has been exceeded. + */ + LOGIN_LIMIT_EXCEEDED(9), + + /** + * The session key was invalid. + */ + BAD_SESSION_ID(10), + + /** + * The password is too weak, and should be improved. + */ + WEAK_PASSWORD(11), + + /** + * When trying to connect to a members world while being f2p. + */ + MEMBERS_WORLD(12), + + /** + * Could not login. + */ + COULD_NOT_LOGIN(13), + + /** + * The server is currently updating. + */ + UPDATING(14), + + /** + * Too many incorrect login attempts from your address. + */ + TOO_MANY_INCORRECT_LOGINS(16), + + /** + * When logging on a free world while standing in members area. + */ + STANDING_IN_MEMBER(17), + + /** + * This account is locked as it might have been stolen. + */ + LOCKED(18), + + /** + * Closed beta going on. + */ + CLOSED_BETA(19), + + /** + * The login server connected to is invalid. + */ + INVALID_LOGIN_SERVER(20), + + /** + * Moving from another world... + */ + MOVING_WORLD(21), + + /** + * When the player's saved file exists, but is unable to be loaded. + */ + ERROR_LOADING_PROFILE(24), + + /** + * This computer address is disabled as it was used to break our rules. + */ + BANNED(26); + + /** + * The buffer. + */ + private final int opcode; + + /** + * Constructs a new {@code Response} {@code Object}. + * @param opcode The login response opcode. + */ + Response(int opcode) { + this.opcode = opcode; + } + + /** + * Gets the response object for the given opcode. + * @param opcode The opcode. + * @return The response object, or null. + */ + public static Response get(int opcode) { + for (Response r : values()) { + if (r.opcode == opcode) { + return r; + } + } + return null; + } + + /** + * Gets the opcode. + * @return The opcode. + */ + public int opcode() { + return opcode; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/login/SavingModule.java b/Server/src/main/java/Server/core/game/node/entity/player/info/login/SavingModule.java new file mode 100644 index 000000000..dcc4147af --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/login/SavingModule.java @@ -0,0 +1,22 @@ +package core.game.node.entity.player.info.login; + +import java.nio.ByteBuffer; + +/** + * Represents a saving module. + * @author Emperor + */ +public interface SavingModule { + + /** + * Writes data on the byte buffer. + * @param buffer The byte buffer. + */ + void save(ByteBuffer buffer); + + /** + * Parses data from the byte buffer. + * @param buffer The byte buffer. + */ + void parse(ByteBuffer buffer); +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/portal/Icon.java b/Server/src/main/java/Server/core/game/node/entity/player/info/portal/Icon.java new file mode 100644 index 000000000..3974af06c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/portal/Icon.java @@ -0,0 +1,68 @@ +package core.game.node.entity.player.info.portal; + +/** + * Represents a chat icon. + * @author Vexia + */ +public enum Icon { + NOTHING(0, 0), + GREEN(1, 5), + RED(2, 6), + YELLOW(3, 7), + BLUE(4, 8), + ORANGE(5, 9), + PINK(6, 10), + PURPLE(7, 11), + BROWN(8, 12); + + /** + * The id. + */ + private final int id; + + /** + * The index id. + */ + private final int indexId; + + /** + * Constructs a new {@Code Icons} {@Code Object} + * @param id the id. + * @param indexId the indexid. + */ + private Icon(int id, int indexId) { + this.id = id; + this.indexId = indexId; + } + + /** + * Gets an icon for the id. + * @param id the id. + * @return the id.S + */ + public static Icon forId(int id) { + for (Icon icon : values()) { + if (icon.getId() == id) { + return icon; + } + } + return GREEN; + } + + /** + * Gets the id. + * @return the id + */ + public int getId() { + return id; + } + + /** + * Gets the indexId. + * @return the indexId + */ + public int getIndexId() { + return indexId; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/portal/PlayerSQLManager.java b/Server/src/main/java/Server/core/game/node/entity/player/info/portal/PlayerSQLManager.java new file mode 100644 index 000000000..6e7256331 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/portal/PlayerSQLManager.java @@ -0,0 +1,235 @@ +package core.game.node.entity.player.info.portal; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.PlayerDetails; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.info.login.Response; +import core.game.system.SystemManager; +import core.game.system.mysql.SQLColumn; +import core.game.system.mysql.SQLEntryHandler; +import core.game.system.mysql.SQLManager; +import core.game.system.mysql.SQLTable; +import core.game.system.mysql.impl.PlayerSQLHandler; +import core.net.amsc.WorldCommunicator; + +import java.math.BigInteger; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Manages the SQL aspect for an account. + * @author Vexia + * + */ +public final class PlayerSQLManager { + + /** + * The representation of an account sql table. + */ + private final SQLTable table = new SQLTable( + new SQLColumn("UID", Integer.class), + new SQLColumn("rights", Integer.class), + new SQLColumn("donatorType", Integer.class), + new SQLColumn("credits", Integer.class), + new SQLColumn("icon", Integer.class), + new SQLColumn("perks", String.class), + new SQLColumn("ip", String.class, false), + new SQLColumn("mac", String.class, false), + new SQLColumn("serial", String.class, false), + new SQLColumn("computerName", String.class, false), + new SQLColumn("netWorth", BigInteger.class, false), + new SQLColumn("ironManMode", String.class, false), + new SQLColumn("bank", String.class, false), + new SQLColumn("inventory", String.class, false), + new SQLColumn("equipment", String.class, false), + new SQLColumn("ge", String.class, false), + new SQLColumn("muteTime", Long.class), + new SQLColumn("banTime", Long.class), + new SQLColumn("contacts", String.class), + new SQLColumn("blocked", String.class), + new SQLColumn("clanName", String.class), + new SQLColumn("currentClan", String.class), + new SQLColumn("clanReqs", String.class), + new SQLColumn("timePlayed", Long.class), + new SQLColumn("lastLogin", Long.class), + new SQLColumn("online", Integer.class), + new SQLColumn("lastGameIp", String.class)); + + /** + * The details the SQL manager is managing. + */ + private final PlayerDetails details; + + /** + * Constructs a new {@Code PlayerSQLManager} {@Code Object} + * @param details the details. + */ + public PlayerSQLManager(PlayerDetails details) { + this.details = details; + } + + /** + * Parses the SQL table. + * @return {@code True} if parsed. + */ + @SuppressWarnings("deprecation") + public boolean parse() { + if(!SQLEntryHandler.read(new PlayerSQLHandler(details))) { + return false; + } + details.getCommunication().parse(table); + details.credits = (int) table.getColumn("credits").getValue(); + details.setBanTime((long) table.getColumn("banTime").getValue()); + details.setMuteTime((long) table.getColumn("muteTime").getValue()); + details.setIcon(Icon.forId((int) table.getColumn("icon").getValue())); + details.setRights(Rights.forId((int) table.getColumn("rights").getValue())); + details.setLastLogin(System.currentTimeMillis()); + details.setTimePlayed((long) table.getColumn("timePlayed").getValue()); + return true; + } + + /** + * Saves the changed SQL columns to the database. + */ + public void save() { + SQLEntryHandler.write(new PlayerSQLHandler(details)); + } + + /** + * Updates column values with the player instance. + * @param player The player instance. + */ + public void update(Player player) { + if (!WorldCommunicator.isEnabled()) { + details.getCommunication().save(table); + } + table.getColumn("credits").updateValue(player.getDetails().credits); + table.getColumn("bank").updateValue(player.getBank().format()); + table.getColumn("lastLogin").updateValue(player.getDetails().getLastLogin()); + table.getColumn("ge").updateValue(player.getPlayerGrandExchange().format()); + table.getColumn("inventory").updateValue(player.getInventory().format()); + table.getColumn("equipment").updateValue(player.getEquipment().format()); + table.getColumn("netWorth").updateValue(player.getMonitor().getNetworth()); + table.getColumn("lastGameIp").updateValue(player.getDetails().getIpAddress()); + table.getColumn("ironManMode").updateValue(player.getIronmanManager().getMode().name()); + table.getColumn("timePlayed").updateValue(player.getDetails().getTimePlayed() + (System.currentTimeMillis() - player.getDetails().getLastLogin())); + table.getColumn("ip").updateValue(getAddressLog((String) table.getColumn("ip").getValue(), details.getInfo().getIp())); + table.getColumn("mac").updateValue(getAddressLog((String) table.getColumn("mac").getValue(), details.getInfo().getMac())); + table.getColumn("serial").updateValue(getAddressLog((String) table.getColumn("serial").getValue(), details.getInfo().getSerial())); + table.getColumn("computerName").updateValue(getAddressLog((String) table.getColumn("computerName").getValue(), details.getInfo().getCompName())); + } + + /** + * Checks if an account was created under a name. + * @param name the name. + * @param field the field + * @return {@code True} if so. + */ + public static boolean hasSqlAccount(String name, String field) throws SQLException { + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return true; + } + ResultSet result = null; + PreparedStatement statement; + statement = connection.prepareStatement("SELECT * FROM " + "members" + " WHERE " + "" + field + "='" + name.toLowerCase() + "' LIMIT 1"); + result = statement.executeQuery(); + if (result == null || !result.next()) { + SQLManager.close(connection); + return false; + } + SQLManager.close(connection); + return true; + } + + public static Response updatePassword(String name, String pass) throws SQLException{ + if (!SQLManager.isInitialized()) { + return Response.INVALID_CREDENTIALS; + } + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return Response.INVALID_LOGIN_SERVER; + } + PreparedStatement statement; + statement = connection.prepareStatement("UPDATE " + "members" + " SET password='" + pass + "' WHERE " + "username" + "='" + name.toLowerCase() + "' LIMIT 1"); + boolean Success = statement.execute(); + if(Success) return Response.SUCCESSFUL; + return null; + } + + /** + * Checks if a username & password are correct. + * @param name the name. + * @param pass the pass. + * @return the response. + * @throws SQLException the exception if thrown. + */ + public static Response getCredentialResponse(String name, String pass) throws SQLException { + if (!SQLManager.isInitialized()) { + return Response.INVALID_CREDENTIALS; + } + Connection connection = SQLManager.getConnection(); + if (connection == null) { + return Response.INVALID_LOGIN_SERVER; + } + ResultSet result = null; + PreparedStatement statement; + statement = connection.prepareStatement("SELECT * FROM " + "members" + " WHERE " + "" + "username" + "='" + name.toLowerCase() + "' LIMIT 1"); + result = statement.executeQuery(); + if (result == null || !result.next()) { + SQLManager.close(connection); + return Response.INVALID_CREDENTIALS; + } + String realPass = result.getString("password"); + if (SystemManager.getEncryption().checkPassword(pass, realPass)) { + SQLManager.close(connection); + return Response.SUCCESSFUL; + } + SQLManager.close(connection); + return Response.INVALID_CREDENTIALS; + } + + /** + * Gets the address log. + * @param original the original log. + * @param address the address. + * @return the address. + */ + private String getAddressLog(String original, String address) { + String log = ""; + if (original != null && original.length() > 0) { + log += original; + if (log.charAt(log.length() - 1) != '|') { + log += "|"; + } + } + if (address != null && address.length() > 0 && (original == null || !original.contains(address))) { + log += address + "|"; + } + if (log.length() > 0 && log.charAt(log.length() - 1) == '|') { + log = log.substring(0, log.length() - 1); + } + if (log == null) { + log = ""; + } + return log; + } + + /** + * Gets the details. + * @return the details. + */ + public PlayerDetails getDetails() { + return details; + } + + /** + * Gets the table. + * @return the table. + */ + public SQLTable getTable() { + return table; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatAttributeKeys.kt b/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatAttributeKeys.kt new file mode 100644 index 000000000..05c99a308 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatAttributeKeys.kt @@ -0,0 +1,12 @@ +package core.game.node.entity.player.info.stats + +const val STATS_BASE = "stats_manager" +const val STATS_ENEMIES_KILLED = "enemies_killed" +const val STATS_DEATHS = "deaths" +const val STATS_LOGS = "logs_chopped" +const val STATS_FISH = "fish_caught" +const val STATS_ROCKS = "rocks_mined" +const val STATS_ALKHARID_GATE = "alkharid_gate" +const val FISHING_TRAWLER_GAMES_WON = "fishing-trawler-games" +const val FISHING_TRAWLER_LEAKS_PATCHED = "fishing-trawler-leaks-patched" +const val FISHING_TRAWLER_SHIPS_SANK = "fishing-trawler-sank" diff --git a/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatsCommandSet.kt b/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatsCommandSet.kt new file mode 100644 index 000000000..a438da8f9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/info/stats/StatsCommandSet.kt @@ -0,0 +1,91 @@ +package core.game.node.entity.player.info.stats + +import core.game.component.Component +import core.game.content.global.BossKillCounter +import core.game.node.entity.player.Player +import core.game.world.repository.Repository +import core.plugin.Initializable +import core.game.system.command.Command +import core.game.system.command.sets.CommandSet + +@Initializable +class StatsCommandSet : CommandSet(Command.Privilege.STANDARD) { + override fun defineCommands() { + define("stats"){player,args -> + if(args.size == 1){ + sendStats(player) + return@define + } + + if(args.size > 2){ + reject(player,"Usage: ::stats playername") + return@define + } + + val other = Repository.getPlayerByName(args[1]) + if(other == null){ + reject(player,"Invalid player or player not online.") + return@define + } + + sendStats(player,other) + } + } + + fun sendStats(player: Player){ + sendStats(player,player) + } + + fun sendStats(player: Player, other: Player){ + prepareInterface(player,other) + val globalData = other.savedData.globalData + for(i in (67..96)){ + when(i){ + //Various stats + 67 -> sendLine(player,"Easy Clues: ${other.treasureTrailManager.completedClues[0]}",97) + 68 -> sendLine(player,"Medium Clues: ${other.treasureTrailManager.completedClues[1]}",i) + 69 -> sendLine(player,"Hard Clues: ${other.treasureTrailManager.completedClues[2]}",i) + 70 -> sendLine(player," ",i) + 71 -> sendLine(player,"Slayer Tasks: ${other.slayer.totalTasks}",i) + 72 -> sendLine(player,"Quest Points: ${other.questRepository.points}",i) + 73 -> sendLine(player,"Ironman Mode: ${other.ironmanManager.mode.name.toLowerCase()}",i) + 74 -> sendLine(player,"Deaths: ${other.getAttribute("$STATS_BASE:$STATS_DEATHS",0)}",i) + 75 -> sendLine(player," ",i) + 76 -> sendLine(player,"Logs Chopped: ${other.getAttribute("$STATS_BASE:$STATS_LOGS",0)}",i) + 77 -> sendLine(player,"Rocks Mined: ${other.getAttribute("$STATS_BASE:$STATS_ROCKS",0)}",i) + 78 -> sendLine(player,"Fish Caught: ${other.getAttribute("$STATS_BASE:$STATS_FISH",0)}",i) + + //Boss KC + 82 -> sendLine(player, "KBD KC: ${globalData.bossCounters.get(BossKillCounter.KING_BLACK_DRAGON.ordinal)}",i) + 83 -> sendLine(player, "Bork KC: ${globalData.bossCounters.get(BossKillCounter.BORK.ordinal)}",i) + 84 -> sendLine(player, "Supreme KC: ${globalData.bossCounters.get(BossKillCounter.DAGANNOTH_SUPREME.ordinal)}",i) + 85 -> sendLine(player, "Rex KC: ${globalData.bossCounters.get(BossKillCounter.DAGANNOTH_REX.ordinal)}",i) + 86 -> sendLine(player, "Prime KC: ${globalData.bossCounters.get(BossKillCounter.DAGANNOTH_PRIME.ordinal)}",i) + 87 -> sendLine(player, "Barrows KC: ${globalData.barrowsLoots}",i) + 88 -> sendLine(player, "Chaos Ele: ${globalData.bossCounters.get(BossKillCounter.CHAOS_ELEMENTAL.ordinal)}",i) + 89 -> sendLine(player, "Mole KC: ${globalData.bossCounters.get(BossKillCounter.GIANT_MOLE.ordinal)}",i) + 90 -> sendLine(player, "Sara KC: ${globalData.bossCounters.get(BossKillCounter.SARADOMIN.ordinal)}",i) + 91 -> sendLine(player, "Zammy KC: ${globalData.bossCounters.get(BossKillCounter.ZAMORAK.ordinal)}",i) + 92 -> sendLine(player, "Bandos KC: ${globalData.bossCounters.get(BossKillCounter.BANDOS.ordinal)}",i) + 93 -> sendLine(player, "Arma KC: ${globalData.bossCounters.get(BossKillCounter.ARMADYL.ordinal)}",i) + 94 -> sendLine(player, "Jad KC: ${globalData.bossCounters.get(BossKillCounter.JAD.ordinal)}",i) + 95 -> sendLine(player, "KQ KC: ${globalData.bossCounters.get(BossKillCounter.KALPHITE_QUEEN.ordinal)}",i) + 96 -> sendLine(player, "Corp KC: ${globalData.bossCounters.get(BossKillCounter.CORPOREAL_BEAST.ordinal)}",i) + else -> sendLine(player,"",i) + } + } + player.interfaceManager.open(Component(26)) + } + + fun sendLine(player: Player, line: String, child: Int){ + player.packetDispatch.sendString(line,26,child) + } + + fun prepareInterface(player: Player,other: Player){ + player.packetDispatch.sendInterfaceConfig(26,64,true) + player.packetDispatch.sendInterfaceConfig(26,62,true) + player.packetDispatch.sendInterfaceConfig(26,65,true) + player.packetDispatch.sendInterfaceConfig(26,66,true) + player.packetDispatch.sendString(other.username + "'s Stats",26,101) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/ActivityData.java b/Server/src/main/java/Server/core/game/node/entity/player/link/ActivityData.java new file mode 100644 index 000000000..c1d391e6c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/ActivityData.java @@ -0,0 +1,704 @@ +package core.game.node.entity.player.link; + +import core.game.node.entity.player.info.login.SavingModule; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; + +/** + * Represents a managing class of activity related information. + * @author 'Vexia + */ +public final class ActivityData implements SavingModule { + + /** + * Represents the pest points gained from pest control. + */ + private int pestPoints; + + /** + * The amount of warrior's guild tokens. + */ + private int warriorGuildTokens; + + /** + * The bounty hunter rating. + */ + private int bountyHunterRate; + + /** + * The bounty rogue rating. + */ + private int bountyRogueRate; + + /** + * The barrow brothers currently killed. + */ + private boolean[] barrowBrothers = new boolean[6]; + + /** + * The barrow kill count. + */ + private int barrowKills; + + /** + * The barrow tunnel crypt index. + */ + private int barrowTunnelIndex; + + /** + * The kolodion stage. + */ + private int kolodionStage; + + /** + * The god casts. + */ + private int[] godCasts = new int[3]; + + /** + * The kolodion boss. + */ + private int kolodionBoss; + + /** + * If received the elnock supplies. + */ + private boolean elnockSupplies; + + /** + * The time stamp of the last battle with Bork. + */ + private long lastBorkBattle; + + /** + * The amount of temp bork kills. + */ + private byte borkKills; + + /** + * If the player has lost his DMC. + */ + private boolean lostCannon; + + /** + * If we started the mta. + */ + private boolean startedMta; + + /** + * The pizazz points. + */ + private int[] pizazzPoints = new int[4]; + + /** + * If the player has unlocked bones to peaches. + */ + private boolean bonesToPeaches; + + /** + * The amount of solved telekinetic mazes. + */ + private int solvedMazes; + + /** + * The fog rating. + */ + private int fogRating; + + /** + * The death status of a Hardcore Iron Man + */ + private boolean hardcoreDeath; + + /** + * Pyramid plunder top (is it grabbed?) + */ + boolean topGrabbed; + + /** + * Constructs a new {@code ActivityInfo} {@code Object}. + */ + public ActivityData() { + /* + * empty. + */ + } + + @Override + public void save(ByteBuffer buffer) { + if (pestPoints > 0) { + SavedData.save(buffer, pestPoints, 1); + } + if (warriorGuildTokens > 0) { + SavedData.save(buffer, warriorGuildTokens, 2); + } + if (bountyHunterRate > 0) { + SavedData.save(buffer, bountyHunterRate, 3); + } + if (bountyRogueRate > 0) { + SavedData.save(buffer, bountyRogueRate, 4); + } + if (barrowKills > 0) { + SavedData.save(buffer, (short) barrowKills, 5); + } + SavedData.save(buffer, barrowBrothers, 6); + if (barrowTunnelIndex > 0) { + SavedData.save(buffer, (byte) barrowTunnelIndex, 7); + } + SavedData.save(buffer, kolodionStage, 9); + buffer.put((byte) 10); + for (int i = 0; i < godCasts.length; i++) { + buffer.putInt(godCasts[i]); + } + SavedData.save(buffer, kolodionBoss, 11); + SavedData.save(buffer, elnockSupplies, 12); + SavedData.save(buffer, getLastBorkBattle(), 13); + SavedData.save(buffer, startedMta, 14); + SavedData.save(buffer, lostCannon, 15); + buffer.put((byte) 16); + buffer.put((byte) pizazzPoints.length); + for (int i = 0; i < pizazzPoints.length; i++) { + buffer.putInt(pizazzPoints[i]); + } + SavedData.save(buffer, bonesToPeaches, 17); + SavedData.save(buffer, solvedMazes, 18); + SavedData.save(buffer, fogRating, 19); + SavedData.save(buffer, borkKills, 20); + SavedData.save(buffer, hardcoreDeath, 21); + SavedData.save(buffer, topGrabbed, 22); + buffer.put((byte) 0); + + } + + public void parse(JSONObject data){ + pestPoints = Integer.parseInt( data.get("pestPoints").toString()); + warriorGuildTokens = Integer.parseInt( data.get("warriorGuildTokens").toString()); + bountyHunterRate = Integer.parseInt( data.get("bountyHunterRate").toString()); + bountyRogueRate = Integer.parseInt( data.get("bountyRogueRate").toString()); + barrowKills = Integer.parseInt( data.get("barrowKills").toString()); + JSONArray bb = (JSONArray) data.get("barrowBrothers"); + for(int i = 0; i < bb.size(); i++){ + barrowBrothers[i] = (boolean) bb.get(i); + } + barrowTunnelIndex = Integer.parseInt( data.get("barrowTunnelIndex").toString()); + kolodionStage = Integer.parseInt( data.get("kolodionStage").toString()); + JSONArray gc = (JSONArray) data.get("godCasts"); + for(int i = 0; i < gc.size(); i++){ + godCasts[i] = Integer.parseInt(gc.get(i).toString()); + } + kolodionBoss = Integer.parseInt( data.get("kolodionBoss").toString()); + elnockSupplies = (boolean) data.get("elnockSupplies"); + lastBorkBattle = Long.parseLong(data.get("lastBorkBattle").toString()); + startedMta = (boolean) data.get("startedMta"); + lostCannon = (boolean) data.get("lostCannon"); + JSONArray pp = (JSONArray) data.get("pizazzPoints"); + for(int i = 0 ; i < pp.size(); i++){ + pizazzPoints[i] = Integer.parseInt(pp.get(i).toString()); + } + bonesToPeaches = (boolean) data.get("bonesToPeaches"); + solvedMazes = Integer.parseInt( data.get("solvedMazes").toString()); + fogRating = Integer.parseInt( data.get("fogRating").toString()); + borkKills = Byte.parseByte(data.get("borkKills").toString()); + hardcoreDeath = (boolean) data.get("hardcoreDeath"); + topGrabbed = (boolean) data.get("topGrabbed"); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + pestPoints = buffer.getInt(); + break; + case 2: + warriorGuildTokens = buffer.getInt(); + break; + case 3: + bountyHunterRate = buffer.getInt(); + break; + case 4: + bountyRogueRate = buffer.getInt(); + break; + case 5: + barrowKills = buffer.getShort() & 0xFFFF; + break; + case 6: + for (int i = 0; i < barrowBrothers.length; i++) { + barrowBrothers[i] = SavedData.getBoolean(buffer.get()); + } + break; + case 7: + barrowTunnelIndex = buffer.get() & 0xFF; + break; + case 8: + buffer.get(); // Barrow config index. + break; + case 9: + kolodionStage = buffer.getInt(); + break; + case 10: + for (int i = 0; i < godCasts.length; i++) { + godCasts[i] = buffer.getInt(); + } + break; + case 11: + kolodionBoss = buffer.getInt(); + break; + case 12: + elnockSupplies = SavedData.getBoolean(buffer); + break; + case 13: + setLastBorkBattle(buffer.getLong()); + break; + case 14: + startedMta = SavedData.getBoolean(buffer); + break; + case 15: + lostCannon = SavedData.getBoolean(buffer); + break; + case 16: + int size = buffer.get(); + for (int i = 0; i < size; i++) { + pizazzPoints[i] = buffer.getInt(); + } + break; + case 17: + bonesToPeaches = SavedData.getBoolean(buffer); + break; + case 18: + solvedMazes = buffer.getInt(); + break; + case 19: + fogRating = buffer.getInt(); + break; + case 20: + borkKills = buffer.get(); + break; + case 21: + hardcoreDeath = SavedData.getBoolean(buffer); + break; + case 22: + topGrabbed = SavedData.getBoolean(buffer); + break; + } + } + } + + /** + * Gets the elnockSupplies. + * @return The elnockSupplies. + */ + public boolean isElnockSupplies() { + return elnockSupplies; + } + + /** + * Sets the elnockSupplies. + * @param elnockSupplies The elnockSupplies to set. + */ + public void setElnockSupplies(boolean elnockSupplies) { + this.elnockSupplies = elnockSupplies; + } + + /** + * Increases the pest points. + * @param pestPoints the pest points to increase with. + */ + public void increasePestPoints(int pestPoints) { + if (pestPoints + this.pestPoints > 500) { + this.pestPoints = 500; + } else { + this.pestPoints += pestPoints; + } + } + + /** + * Decreases the pest points. + * @param pestPoints the pest points to increase with. + */ + public void decreasePestPoints(int pestPoints) { + this.pestPoints -= pestPoints; + } + + /** + * Gets the pest points. + * @return the pest points. + */ + public int getPestPoints() { + return pestPoints; + } + + /** + * Sets the pest points. + * @param pestPoints the pest points. + */ + public void setPestPoints(int pestPoints) { + this.pestPoints = pestPoints; + } + + /** + * Gets the warriorGuildTokens. + * @return The warriorGuildTokens. + */ + public int getWarriorGuildTokens() { + return warriorGuildTokens; + } + + /** + * Sets the warriorGuildTokens. + * @param warriorGuildTokens The warriorGuildTokens to set. + */ + public void setWarriorGuildTokens(int warriorGuildTokens) { + this.warriorGuildTokens = warriorGuildTokens; + } + + /** + * Updates the warrior guild tokens. + * @param amount The amount to increase with. + */ + public void updateWarriorTokens(int amount) { + this.warriorGuildTokens += amount; + } + + /** + * Gets the bountyHunterRate. + * @return The bountyHunterRate. + */ + public int getBountyHunterRate() { + return bountyHunterRate; + } + + /** + * Increments the bountyHunterRate. + * @param rate The rate to set. + */ + public void updateBountyHunterRate(int rate) { + this.bountyHunterRate += rate; + } + + /** + * Gets the bountyRogueRate. + * @return The bountyRogueRate. + */ + public int getBountyRogueRate() { + return bountyRogueRate; + } + + /** + * Increments the bountyRogueRate. + * @param rate The rate to set. + */ + public void updateBountyRogueRate(int rate) { + this.bountyRogueRate += rate; + } + + /** + * Gets the barrowBrothers. + * @return The barrowBrothers. + */ + public boolean[] getBarrowBrothers() { + return barrowBrothers; + } + + /** + * Sets the barrowBrothers. + * @param barrowBrothers The barrowBrothers to set. + */ + public void setBarrowBrothers(boolean[] barrowBrothers) { + this.barrowBrothers = barrowBrothers; + } + + /** + * Gets the barrowKills. + * @return The barrowKills. + */ + public int getBarrowKills() { + return barrowKills; + } + + /** + * Sets the barrowKills. + * @param barrowKills The barrowKills to set. + */ + public void setBarrowKills(int barrowKills) { + if (barrowKills > 10000) { + barrowKills = 10000; + } + this.barrowKills = barrowKills; + } + + /** + * Gets the barrowTunnelIndex. + * @return The barrowTunnelIndex. + */ + public int getBarrowTunnelIndex() { + return barrowTunnelIndex; + } + + /** + * Sets the barrowTunnelIndex. + * @param barrowTunnelIndex The barrowTunnelIndex to set. + */ + public void setBarrowTunnelIndex(int barrowTunnelIndex) { + this.barrowTunnelIndex = barrowTunnelIndex; + } + + /** + * Sets the kolodion stage. + * @param stage the stage. + */ + public void setKolodionStage(int stage) { + this.kolodionStage = stage; + } + + /** + * Checks if they have started kolodion. + * @return {@code True} if so. + */ + public boolean hasStartedKolodion() { + return kolodionStage == 1; + } + + /** + * Checks if the stage is killed. + * @return {@code True} if so. + */ + public boolean hasKilledKolodion() { + return kolodionStage >= 2; + } + + /** + * Checks if they have recieved the reward. + * @return {@code True if so.} + */ + public boolean hasRecievedKolodionReward() { + return kolodionStage == 3; + } + + /** + * Gets the godCasts. + * @return The godCasts. + */ + public int[] getGodCasts() { + return godCasts; + } + + /** + * Gets the kolodionBoss. + * @return The kolodionBoss. + */ + public int getKolodionBoss() { + return kolodionBoss; + } + + /** + * Sets the kolodionBoss. + * @param kolodionBoss The kolodionBoss to set. + */ + public void setKolodionBoss(int kolodionBoss) { + this.kolodionBoss = kolodionBoss; + } + + /** + * Gets the lastBorkBattle. + * @return the lastBorkBattle + */ + public long getLastBorkBattle() { + return lastBorkBattle; + } + + /** + * Sets the balastBorkBattle. + * @param lastBorkBattle the lastBorkBattle to set. + */ + public void setLastBorkBattle(long lastBorkBattle) { + this.lastBorkBattle = lastBorkBattle; + } + + /** + * Checks if the player has killed bork. + * @return {@code True if so.} + */ + public boolean hasKilledBork() { + return lastBorkBattle > 0; + } + + /** + * Gets the lostCannon. + * @return the lostCannon + */ + public boolean isLostCannon() { + return lostCannon; + } + + /** + * Sets the balostCannon. + * @param lostCannon the lostCannon to set. + */ + public void setLostCannon(boolean lostCannon) { + this.lostCannon = lostCannon; + } + + /** + * Gets the startedMta. + * @return the startedMta + */ + public boolean isStartedMta() { + return startedMta; + } + + /** + * Sets the bastartedMta. + * @param startedMta the startedMta to set. + */ + public void setStartedMta(boolean startedMta) { + this.startedMta = startedMta; + } + + /** + * Increments the pizazz points. + * @param index the index. + */ + public void incrementPizazz(int index) { + pizazzPoints[index] += 1; + } + + /** + * Increments the pizzaz points. + * @param index the index. + * @param amount the amount. + */ + public void incrementPizazz(int index, int amount) { + pizazzPoints[index] += amount; + } + + /** + * Decrements the pizzaz points. + * @param index the index. + * @param amount the amount. + */ + public void decrementPizazz(int index, int amount) { + pizazzPoints[index] -= amount; + } + + /** + * Increments the pizazz points. + * @param index the index. + */ + public void decrementPizazz(int index) { + pizazzPoints[index] -= 1; + } + + /** + * Gets the pizzaz points in the index. tele=0, alchemist=1, 2=enchant, + * 3=grave + * @param index the index. + * @return the value. + */ + public int getPizazzPoints(int index) { + return pizazzPoints[index]; + } + + /** + * Gets the pizazzPoints. + * @return the pizazzPoints + */ + public int[] getPizazzPoints() { + return pizazzPoints; + } + + /** + * Sets the bapizazzPoints. + * @param pizazzPoints the pizazzPoints to set. + */ + public void setPizazzPoints(int[] pizazzPoints) { + this.pizazzPoints = pizazzPoints; + } + + /** + * Gets the bonesToPeaches. + * @return the bonesToPeaches + */ + public boolean isBonesToPeaches() { + return bonesToPeaches; + } + + /** + * Sets the babonesToPeaches. + * @param bonesToPeaches the bonesToPeaches to set. + */ + public void setBonesToPeaches(boolean bonesToPeaches) { + this.bonesToPeaches = bonesToPeaches; + } + + /** + * Gets the solvedMazes. + * @return the solvedMazes + */ + public int getSolvedMazes() { + return solvedMazes; + } + + /** + * Sets the solvedMazes. + * @param solvedMazes the solvedMazes to set. + */ + public void setSolvedMazes(int solvedMazes) { + this.solvedMazes = solvedMazes; + } + + /** + * Gets the fogRating. + * @return the fogRating + */ + public int getFogRating() { + return fogRating; + } + + /** + * Sets the fogRating. + * @param fogRating the fogRating to set. + */ + public void setFogRating(int fogRating) { + this.fogRating = fogRating; + } + + /** + * Gets the borkKills. + * @return the borkKills. + */ + public byte getBorkKills() { + return borkKills; + } + + /** + * Sets the borkKills. + * @param borkKills the borkKills to set + */ + public void setBorkKills(byte borkKills) { + this.borkKills = borkKills; + } + + /** + * gets the current value of an Hardcore Iron Man's death status + * @return the value of a Hardcore Iron Man's death status + */ + public boolean getHardcoreDeath() { + return hardcoreDeath; + } + + public void setHardcoreDeath(boolean hardcoreDeath) { + this.hardcoreDeath = hardcoreDeath; + } + public void setTopGrabbed(boolean topGrabbed){ + this.topGrabbed = topGrabbed; + } + public boolean isTopGrabbed(){return topGrabbed;} + + public int getKolodionStage() { + return kolodionStage; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/BankPinManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/BankPinManager.java new file mode 100644 index 000000000..254d269d6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/BankPinManager.java @@ -0,0 +1,861 @@ +package core.game.node.entity.player.link; + +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.world.GameWorld; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.context.StringContext; +import core.net.packet.out.RepositionChild; +import core.net.packet.out.StringPacket; +import core.tools.RandomFunction; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Manages the players bank pin. + * @author Vexia + * @author Emperor + */ +public class BankPinManager implements SavingModule { + + /** + * THe setting messages to display on default. + */ + private static final String[] SETTINGS_MESSAGES = { "Customers are reminded that", "they should NEVER tell", "anyone their Bank PINs or", "passwords, nor should they", "ever enter their PINs on any", "website form.", null, "Have you read the PIN guide", "on the website?", null, null, null, null }; + + /** + * The pin child constants. + */ + public static final int SET_PIN = 60, CHANGE_RECOVERY = 61, CHANGE_PIN = 62, DELETE_PIN = 63, CANCEL_PENDING = 65; + + /** + * The player. + */ + private final Player player; + + /** + * The digits. + */ + private final List digits = new ArrayList<>(); + + /** + * The bank pin. + */ + private String pin; + + /** + * If the manager has been unlocked. + */ + private boolean unlocked; + + /** + * If we're using the short or long recovery. + */ + private boolean longRecovery; + + /** + * The pin status. + */ + private PinStatus status = PinStatus.NO_PIN; + + /** + * The temporary pin. + */ + private String tempPin; + + /** + * The pending delay. + */ + private long pendingDelay = -1; + + /** + * The open id after confirmation interface. + */ + private int openId; + + /** + * The amount of attempts on opening the bank pin. + */ + private int tries; + + /** + * The pin changing state. + */ + private int changeState; + + /** + * If we're deleting the pin. + */ + private boolean deleting; + + /** + * The delay between + */ + private long tryDelay; + + /** + * Constructs a new {@Code BankPinManager} {@Code Object} + */ + public BankPinManager(final Player player) { + this.player = player; + for (int i = 0; i < 10; i++) { + digits.add(i); + } + } + + @Override + public void save(ByteBuffer buffer) { + if (hasPin()) { + ByteBufferUtils.putString(pin, buffer.put((byte) 1)); + } + buffer.put((byte) 2).put((byte) (longRecovery ? 1 : 0)); + if (status.ordinal() != 0) { + buffer.put((byte) 3).put(((byte) status.ordinal())); + } + if (pendingDelay != -1 && pendingDelay > System.currentTimeMillis()) { + buffer.put((byte) 4).putLong(pendingDelay); + } + if (tryDelay > System.currentTimeMillis()) { + buffer.put((byte) 5).putLong(tryDelay); + } + buffer.put((byte) 0); + } + + public void parse(JSONObject data){ + if(data.containsKey("pin")) { + pin = data.get("pin").toString(); + } + if(data.containsKey("status")){ + int st = Integer.parseInt( data.get("status").toString()); + status = PinStatus.values()[st]; + } + if(data.containsKey("pendingDelay")){ + this.pendingDelay = Long.parseLong(data.get("pendingDelay").toString()); + } + if(data.containsKey("tryDelay")){ + this.tryDelay = Long.parseLong(data.get("tryDelay").toString()); + } + longRecovery = (boolean) data.get("longRecovery"); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + pin = ByteBufferUtils.getString(buffer); + break; + case 2: + longRecovery = buffer.get() == 1; + break; + case 3: + status = PinStatus.values()[buffer.get()]; + break; + case 4: + pendingDelay = buffer.getLong(); + break; + case 5: + tryDelay = buffer.getLong(); + break; + } + } + } + + /** + * Opens the settings. + */ + public void openSettings() { + checkPendingActivity(); + openSettings(status.getMessages(this)); + } + + /** + * Opens the bank pin settings. + */ + public void openSettings(String... messages) { + player.getInterfaceManager().close(); + tempPin = null; + sendMessages(messages); + player.getAudioManager().send(1040); + player.getInterfaceManager().open(new Component(14)); + } + + /** + * Sends the messages. + * @param messages the messages. + */ + private void sendMessages(String... messages) { + for (int i = 0; i < messages.length; i++) { + String message = messages[i]; + if (message == null) { + continue; + } + PacketRepository.send(StringPacket.class, new StringContext(player, message, 14, 42 + i)); + } + status.draw(this, player); + PinStatus.drawString(player, "Messages", 41); + PinStatus.drawString(player, getRecoveryDelay() + " days", 71); + PinStatus.drawString(player, "Use the buttons below to change your PIN settings", 86); + } + + /** + * Used to open a component type that requires pin unlocking. + * @param buttonId the buttonId. + */ + public void openType(int buttonId) { + checkPendingActivity(); + if (buttonId == 2) { + openSettings(); + return; + } + openId = buttonId; + if (hasPin() && !unlocked) { + if (hasPendingPin()) { + openSettings(); + toggleConfirmInterface(true); + PinStatus.drawString(player, "A PIN will be set on your bank account in another " + getPendingDays() + " day" + (getPendingDays() > 1 ? "s" : "") + ".", 73); + PinStatus.drawString(player, "Yes, I asked for this. I want this PIN.", 89); + PinStatus.drawString(player, "No, I didn't ask for this. Cancel it.", 91); + return; + } + openPin(); + return; + } + openForId(buttonId); + } + + /** + * Opens the interface for the id. + * @param buttonId the button id. + */ + private void openForId(int buttonId) { + if (buttonId == 1) { + { + player.getBank().open(); + } + } else if (buttonId == 3) { + player.getPlayerGrandExchange().openCollectionBox(); + } else if (buttonId == 4) { + player.getPlayerGrandExchange().open(); + } + } + + /** + * Handles the confirmation interface. + * @param button the button. + */ + public void handleConfirmInterface(int button) { + boolean confirm = button != 91; + switch (status) { + case NO_PIN: + if (!confirm) { + toggleConfirmInterface(false); + player.getInterfaceManager().close(); + openSettings("No changes made."); + break; + } + openPin(); + break; + case PENDING: + if (confirm) { + unlock(); + } else { + cancelPin("The PIN has been cancelled", "and will NOT be set.", "", "You still do not have a Bank", "PIN."); + } + break; + case ACTIVE: + if (confirm) { + if (unlocked) { + cancelPin("Your Bank PIN has now been", "deleted.", "", "This means that there is no", "PIN protection on your bank", "account."); + } else { + deleting = true; + openPin(); + } + } else { + openSettings("No changes made."); + } + break; + default: + break; + } + } + + /** + * Unlocks the pin manager. + */ + private void unlock() { + unlocked = true; + openForId(openId); + } + + /** + * Opens the set bank PIN confirmation screen. + * @param show If we should show the confirm screen. + */ + public void toggleConfirmInterface(boolean show) { + for (int i = 60; i < 66; i++) { + player.getPacketDispatch().sendInterfaceConfig(14, i, show); + } + player.getAudioManager().send(1040); + player.getPacketDispatch().sendInterfaceConfig(14, 89, !show); + player.getPacketDispatch().sendInterfaceConfig(14, 91, !show); + player.getPacketDispatch().sendInterfaceConfig(14, 87, !show); + if (show && status == PinStatus.NO_PIN) { + PinStatus.drawString(player, "Do you really wish to set a PIN on your bank account?", 73); + PinStatus.drawString(player, "Yes, I really want a Bank PIN. I will never forget it!", 89); + PinStatus.drawString(player, "No, I might forget it!", 91); + } else if (show && status == PinStatus.ACTIVE) { + PinStatus.drawString(player, "Do you really wish to delete your Bank PIN?", 73); + PinStatus.drawString(player, "Yes, I don't need a PIN anymore.", 89); + PinStatus.drawString(player, "No thanks, I'd rather keep the extra security.", 91); + } + } + + /** + * Updates the temporary pin. + * @param button the button. + */ + public void updateTempPin(int button) { + tempPin += digits.get(button); + handlePinStage(getStage()); + } + + /** + * Checks the pending activity. + */ + private void checkPendingActivity() { + if (status == PinStatus.PENDING && pendingDelay < System.currentTimeMillis()) { + pendingDelay = -1; + status = PinStatus.ACTIVE; + return; + } + } + + /** + * Opens the set pin interface. + */ + public void openPin() { + if (isPinBlocked()) { + sendTryDialogue(); + return; + } + tempPin = ""; + player.getPacketDispatch().sendString("Bank of " + GameWorld.getSettings().getName(), 13, 31); + if (!hasPin()) { + player.getPacketDispatch().sendInterfaceConfig(13, 29, true); + player.getPacketDispatch().sendString("Please choose a new FOUR DIGIT PIN using the buttons below.", 13, 28); + } else { + player.getPacketDispatch().sendString("Please enter your PIN using the buttons below.", 13, 28); + } + player.getInterfaceManager().open(new Component(13).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + if (changeState != 0) { + changeState = 0; + } + if (deleting) { + deleting = false; + } + return true; + } + })); + handlePinStage(getStage()); + } + + /** + * Handles a pin stage. + * @param stage the stage. + */ + public void handlePinStage(int stage) { + if (stage == 4) { + if (!hasPin() || changeState == 2) { + player.getAudioManager().send(1040); + player.getPacketDispatch().sendString("Now please enter that number again!", 13, 28); + shuffleDigits(); + return; + } else { + if (!tempPin.equals(pin)) { + player.getAudioManager().send(1042); + player.getInterfaceManager().close(); + player.sendMessage("The PIN you entered is incorrect."); + if (setTries(getTries() + 1) >= 2) { + setTryLock(); + } + return; + } + if (changeState == 1) { + tempPin = ""; + player.getPacketDispatch().sendString("Please choose a new FOUR DIGIT PIN using the buttons below.", 13, 28); + changeState = 2; + shuffleDigits(); + return; + } + if (deleting) { + cancelPin("Your Bank PIN has now been", "deleted.", "", "This means that there is no", "PIN protection on your bank", "account."); + return; + } + unlock(); + player.sendMessage("You have correctly entered your PIN."); + } + return; + } else if (stage == 8) { + boolean success = checkTempPin(); + if (isEasyGuess()) { + openSettings("That number wouldn't be very", "hard to guess. Please try", "something different!"); + return; + } + if (changeState == 2 && success) { + if (pin.equals(tempPin.substring(0, 4))) { + player.getPacketDispatch().sendMessage("Your current PIN matches your new one."); + } else { + pin = new String(Arrays.copyOf(tempPin.toCharArray(), 4)); + player.getPacketDispatch().sendMessage("You have changed your PIN."); + } + openSettings(); + return; + } + if (success) { + setPin(); + } + openSettings(success ? new String[] { "You have requested that a", "PIN be set on your bank", "account. This will take effect", "in another " + getRecoveryDelay() + " days.", "", "If you wish to cancel this PIN,", "please use the button", "on the left." } : new String[] { "Those numbers did not", "match.", "", "Your PIN has not been set;", "please try again if you wish", "to set a new PIN." }); + return; + } + shuffleDigits(); + if (stage != 0) { + player.getAudioManager().send(1041); + } + } + + /** + * Sets the try locks. + */ + private void setTryLock() { + setTryDelay(System.currentTimeMillis() + getPinSeconds() * 1000); + sendTryDialogue(); + } + + /** + * Sends the try dialogue. + */ + private void sendTryDialogue() { + long ticks = (tryDelay - System.currentTimeMillis()) / 1000; + int original = getPinSeconds(); + String suffix = (original > 15 ? "minutes" : "seconds"); + player.getInterfaceManager().close(); + if (suffix.equals("minutes") || ticks > 15) { + ticks /= 100; + suffix = "minutes"; + } + if (suffix.equals("minutes") && ticks <= 1) { + player.getDialogueInterpreter().sendDialogue("You will be able to access your bank in less than 1 minute."); + return; + } + player.getDialogueInterpreter().sendDialogue("You will be able to access your bank pin in " + ticks + " " + suffix + "."); + } + + /** + * Shuffles the digits. + */ + private void shuffleDigits() { + Collections.shuffle(digits); + int bitShift = 0, bitValue = 0; + for (int i = 0; i < 8; i++) { + bitValue |= digits.get(i) << bitShift; + bitShift += 4; + } + int stage = getStage(); + if (stage >= 4) { + stage = stage - 4; + } + player.getConfigManager().set(562, bitValue); + player.getConfigManager().set(563, digits.get(8) | digits.get(9) << 4 | stage << 26); + for (int i = 0; i < 9; i++) { + int child = (i > 2 ? i + 1 : i) + 11; + int positionX = 37 + ((i % 3) * 95) + RandomFunction.random(2, 45); + int positionY = 157 + ((i / 3) * 70) - RandomFunction.random(3, 48); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 13, child, positionX, positionY)); + } + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 13, 14, 308 + RandomFunction.random(2, 45), 155 - RandomFunction.random(3, 45))); + } + + /** + * Sets the pin. + */ + private void setPin() { + status = PinStatus.PENDING; + pendingDelay = System.currentTimeMillis() + (GameWorld.getSettings().isDevMode() ? TimeUnit.SECONDS.toMillis(30) : TimeUnit.DAYS.toMillis(this.getRecoveryDelay())); + pin = new String(Arrays.copyOf(tempPin.toCharArray(), 4)); + } + + /** + * Sets the pin. + * @param pin the pin. + */ + public void setPin(String pin) { + this.pin = pin; + } + + /** + * Cancels the pin. + */ + public void cancelPin(String... messages) { + status = PinStatus.NO_PIN; + pendingDelay = -1; + pin = null; + unlocked = false; + player.getAudioManager().send(1042); + openSettings(messages); + } + + /** + * Checks if the pin is an easy guess. + * @return {@code True} if so. + */ + private boolean isEasyGuess() { + boolean badCombo = true; + String currentPin = tempPin; + for (int i = 0; i < 4; i++) { + if (currentPin.charAt(0) != currentPin.charAt(i)) { + badCombo = false; + break; + } + } + if (!badCombo) { + badCombo = true; + for (int i = 0; i < 3; i++) { + int value = Byte.valueOf((byte) currentPin.charAt(i)); + int next = Byte.valueOf((byte) currentPin.charAt(i + 1)); + if (!(Character.valueOf((char) (value + 1)) == next || Character.valueOf((char) (value - 1)) == next)) { + badCombo = false; + break; + } + } + } + return badCombo; + } + + /** + * Checks the temporary pin match. + * @return {@code True} if matched. + */ + private boolean checkTempPin() { + for (int i = 0; i < 4; i++) { + if (tempPin.charAt(i) != tempPin.charAt(4 + i)) { + return false; + } + } + return true; + } + + /** + * Gets the pending + * @return the pending days. + */ + public int getPendingDays() { + if (pendingDelay < System.currentTimeMillis()) { + return 0; + } + return (int) (pendingDelay - System.currentTimeMillis()) / (GameWorld.getSettings().isDevMode() ? 1000 : 86400000); + } + + /** + * Gets the stage of the pin setting. + * @return the stage. + */ + public int getStage() { + if (tempPin == null) { + return 0; + } + return tempPin.length(); + } + + /** + * Draws the login message. + */ + public void drawLoginMessage() { + player.getPacketDispatch().sendString(status.getLoginMessage(this), 378, 62); + checkPendingActivity(); + } + + /** + * Sets the chaning pin. + * @param state the changing state. + */ + public void setChangingState(int state) { + this.changeState = state; + } + + /** + * Gets the long recovery delay. + * @return the delay. + */ + public int getRecoveryDelay() { + return longRecovery ? 7 : 3; + } + + /** + * Checks if the manager has a pin. + * @return the pin. + */ + public boolean hasPin() { + return pin != null; + } + + /** + * Checks if there is a pending pin. + * @return {@code True} if so. + */ + public boolean hasPendingPin() { + return getPendingDays() > 0; + } + + /** + * Gets the pin. + * @return the pin. + */ + public String getPin() { + return pin; + } + + /** + * Gets the unlocked. + * @return the unlocked + */ + public boolean isUnlocked() { + if (!hasPin()) { + return true; + } + return unlocked; + } + + /** + * Sets the baunlocked. + * @param unlocked the unlocked to set. + */ + public void setUnlocked(boolean unlocked) { + this.unlocked = unlocked; + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the longRecovery. + * @return the longRecovery + */ + public boolean isLongRecovery() { + return longRecovery; + } + + /** + * Sets the status. + * @param status the status. + */ + public void setStatus(PinStatus status) { + this.status = status; + } + + /** + * Sets the balongRecovery. + * @param longRecovery the longRecovery to set. + */ + public void setLongRecovery(boolean longRecovery) { + this.longRecovery = longRecovery; + } + + /** + * Switches the recovery delay. + */ + public void switchRecovery() { + + setLongRecovery(!longRecovery); + PinStatus.drawString(player, getRecoveryDelay() + " days", 71); + PinStatus.drawString(player, "Your recovery delay has", 42); + PinStatus.drawString(player, "now been set to " + getRecoveryDelay() + " days.", 43); + PinStatus.drawString(player, "", 44); + PinStatus.drawString(player, "You would have to wait this", 45); + PinStatus.drawString(player, "long to delete your PIN if", 46); + PinStatus.drawString(player, "you forgot it. But you", 47); + PinStatus.drawString(player, "haven't got one...", 48); + } + + /** + * Checks if the pin is blocked. + * @return {@code True} if so. + */ + public boolean isPinBlocked() { + return tryDelay > System.currentTimeMillis(); + } + + /** + * Gets the PIN lock ticks. + * @return The PIN lock ticks. + */ + public int getPinSeconds() { + if (tries == 2) { + return 10; + } else if (tries == 3) { + return 15; + } else if (tries > 3) { + return 1000; + } + return 0; + } + + /** + * Gets the tries. + * @return the tries + */ + public int getTries() { + return tries; + } + + /** + * Sets the batries. + * @param tries the tries to set. + */ + public int setTries(int tries) { + this.tries = tries; + return tries; + } + + /** + * Gets the tryDelay. + * @return the tryDelay + */ + public long getTryDelay() { + return tryDelay; + } + + /** + * Sets the batryDelay. + * @param tryDelay the tryDelay to set. + */ + public void setTryDelay(long tryDelay) { + this.tryDelay = tryDelay; + } + + /** + * A pin status. + * @author Vexia/k + */ + public enum PinStatus { + NO_PIN() { + + @Override + public void draw(BankPinManager manager, Player player) { + drawString(player, "NO PIN set", 69); + removeLines(player, 89, 55, 56, 57, 91, 64, 65, 63, 62); + } + + }, + PENDING() { + @Override + public void draw(BankPinManager manager, Player player) { + drawString(player, "PIN coming soon", 69); + removeLines(player, 89, 55, 56, 57, 91, 64, 63, 62, 60, 61); + } + + @Override + public String getLoginMessage(BankPinManager manager) { + int days = manager.getPendingDays(); + String message = "Your Bank PIN will become active in another " + days + " day" + (days > 1 ? "s" : "") + "."; + if (days < 1) { + return "Your Bank PIN has just become active."; + } + return message; + } + + @Override + public String[] getMessages(BankPinManager manager) { + int days = manager.getPendingDays(); + return new String[] { "You have requested that a", "PIN be set on your bank", "account. This will take effect", "in another " + days + " day" + (days > 1 ? "s" : "") + ".", "", "If you wish to cancel this", "PIN, please use the button", "on the left." }; + } + }, + ACTIVE() { + + @Override + public void draw(BankPinManager manager, Player player) { + drawString(player, "You have a PIN", 69); + removeLines(player, 89, 55, 56, 57, 91, CANCEL_PENDING, CHANGE_RECOVERY, SET_PIN); + } + + @Override + public String getLoginMessage(BankPinManager manager) { + return "You you currently have a Bank PIN."; + } + + }; + + /** + * Draws the status on the interface. + * @param player the player. + */ + public void draw(BankPinManager manager, Player player) { + + } + + /** + * Gets the login message. + * @param manager the manager. + * @return the message. + */ + public String getLoginMessage(BankPinManager manager) { + return "You do not have a Bank PIN. Please visit a bank if you would like one."; + } + + /** + * Draws a string. + * @param player the player. + * @param string the string. + * @param line the line. + */ + public static void drawString(Player player, String string, int line) { + player.getPacketDispatch().sendString(string, 14, line); + } + + /** + * Removes the lines. + * @param player the player. + * @param lines the lines. + */ + public static void removeLines(Player player, int... lines) { + for (int line : lines) { + player.getPacketDispatch().sendInterfaceConfig(14, line, true); + } + } + + /** + * Gets the messages to display. + * @return the messages. + */ + public String[] getMessages(BankPinManager manager) { + return SETTINGS_MESSAGES; + } + + } + + public PinStatus getStatus() { + return status; + } + + public long getPendingDelay() { + return pendingDelay; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/ConfigurationManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/ConfigurationManager.java new file mode 100644 index 000000000..5dd3e8c23 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/ConfigurationManager.java @@ -0,0 +1,229 @@ +package core.game.node.entity.player.link; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.packet.PacketRepository; +import core.net.packet.context.ConfigContext; +import core.net.packet.out.Config; + +import java.nio.ByteBuffer; + +/** + * Manages a player's configurations. + * @author Emperor + */ +@Deprecated +public final class ConfigurationManager implements SavingModule { + + /** + * The amount of configurations. + */ + public static final int SIZE = 3500; + + /** + * The player. + */ + private final Player player; + + /** + * The configurations. + */ + private final int[] configurations = new int[SIZE]; + + /** + * The configurations. + */ + private final int[] savedConfigurations = new int[SIZE]; + + /** + * Constructs a new {@code ConfigurationManager} {@code Object}. + * @param player The player. + */ + public ConfigurationManager(Player player) { + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + for (int index = 0; index < savedConfigurations.length; index++) { + int value = savedConfigurations[index]; + if (value != 0) { + buffer.putShort((short) index); + buffer.putInt(value); + } + } + buffer.putShort((short) -1); + } + + @Override + public void parse(ByteBuffer buffer) { + int index = 0; + while ((index = buffer.getShort()) != -1) { + savedConfigurations[index] = buffer.getInt(); + } + } + + /** + * Initializes the configurations. + */ + public void init() { + for (int i = 0; i < savedConfigurations.length; i++) { + int value = savedConfigurations[i]; + if (value != 0) { + set(i, value, false); + } + } + } + + /** + * Resets the configurations. + */ + public void reset() { + for (int i = 0; i < configurations.length; i++) { + configurations[i] = 0; + } + } + + /** + * Sets a configuration. + * @param config The configuration. + * @param value The value. + */ + public void set(Configuration config, boolean value) { + set(config.id, value); + } + + /** + * Sets a configuration. + * @param id The configuration id. + * @param value The value. + */ + @Deprecated + public void set(int id, boolean value) { + + player.varpManager.get(id).setVarbit(0, value ? 1 : 0).send(player); + } + + /** + * Sets a configuration. + * @param config The configuration. + * @param value The value. + */ + @Deprecated + public void set(Configuration config, int value) { + player.varpManager.get(config.id).setVarbit(0,value).send(player); + } + + /** + * Sets the configuration. + * @param config The configuration id. + * @param value The value. + * @param saved If the configuration should be saved. + */ + public void set(Configuration config, int value, boolean saved) { + set(config.id, value, saved); + } + + /** + * Sets a configuration. + * @param id The configuration id. + * @param value The value. + */ + public void set(int id, int value) { + set(id, value, false); + } + + /** + * Sets a configuration for a set amount of time. + * @param id the id. + * @param value the value. + * @param delay the delay. + */ + @Deprecated + public void set(final int id, final int value, int delay) { + set(id, value); + player.varpManager.get(id).setVarbit(0,value).send(player); + GameWorld.getPulser().submit(new Pulse(delay, player) { + @Override + public boolean pulse() { + player.varpManager.get(id).setVarbit(0,0).send(player); + return true; + } + }); + } + + /** + * Sets a configuration. + * @param id The configuration id. + * @param value The value. + */ + @Deprecated + public void set(int id, int value, boolean saved) { + player.varpManager.get(id).setVarbit(0,value).send(player); + if (saved) { + player.varpManager.flagSave(id); + } + } + + public void forceSet(int id, int value, boolean saved){ + PacketRepository.send(Config.class, new ConfigContext(player,id,value)); + } + + /** + * Sends the configuration without caching. + */ + @Deprecated + public void send(int id, int value) { + PacketRepository.send(Config.class, new ConfigContext(player, id, value)); + } + + /** + * Gets the configuration value. + * @param id The config id. + * @return The value. + */ + @Deprecated + public int get(int id) { + if(player.varpManager.get(id).getValue() != 0){ + return player.varpManager.get(id).getValue(); + } + return configurations[id]; + } + + /** + * Holds the configurations. + * @author Emperor + */ + public enum Configuration { + + BRIGHTNESS(166), MUSIC_VOLUME(168), EFFECT_VOLUME(169), MOUSE_BUTTON(170), CHAT_EFFECT(171), RETALIATE(172), RUNNING(173), SPLIT_PRIVATE(287), ACCEPT_AID(427), PC_PORTALS(719), SURROUNDING_VOLUME(872), CLAN_WAR_DATA(1147), ; + + /** + * The config id. + */ + private final int id; + + /** + * Constructs a new {@code Configuration} {@code Object}. + * @param id The config id. + */ + private Configuration(int id) { + this.id = id; + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } + + } + + public int[] getSavedConfigurations() { + return savedConfigurations; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/GlobalData.java b/Server/src/main/java/Server/core/game/node/entity/player/link/GlobalData.java new file mode 100644 index 000000000..4876d38a7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/GlobalData.java @@ -0,0 +1,1738 @@ +package core.game.node.entity.player.link; + +import core.game.content.global.GodBook; +import core.game.node.entity.player.info.login.SavingModule; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; + +/** + * Represents the quest data to save. + * @author 'Vexia + */ +public final class GlobalData implements SavingModule { + + /** + * Represents the tutorial stage. + */ + private int tutorialStage; + + /** + * Represents the home teleport delay. + */ + private long homeTeleportDelay; + + /** + * Represents the assist time. + */ + private long assistTime; + + /** + * Represents the last chat ping. + */ + private long chatPing; + + /** + * Represents the time between tutor claims. + */ + private long tutorClaim; + + /** + * Represents if luthas has given us a task. + */ + private boolean luthasTask; + + /** + * Represents the stahsed karamja bnnanas. + */ + private int karamjaBananas; + + private int savedX; + + private int savedY; + + private int savedH; + + private int taskAmount; + + private int taskPoints; + /** + * Represents the silk steal time. + */ + private long silkSteal; + + /** + * Represents the assist experience. + */ + private double[] assistExperience = new double[9]; + + /** + * Represents the strong hold rewards. + */ + private boolean[] strongHoldRewards = new boolean[4]; + + /** + * Represents if the lumbridge rope has been tied; + */ + private boolean lumbridgeRope; + + /** + * Represents if the player has spoken to the apprentice. + */ + private boolean apprentice; + + /** + * Represents if the player has spoken to the friz glass blower. + */ + private boolean fritzGlass; + + /** + * Represents the zaff npc staff amount. + */ + private int zafAmount = 8; + + /** + * Represents the time until you can buy from zaff. + */ + private long zafTime; + + /** + * Represents if you're a wydin employee. + */ + private boolean wydinEmployee; + + /** + * Represents if the draynor recording has been seen. + */ + private boolean draynorRecording; + + /** + * Represents if the ge tutorial has been done. + */ + private boolean geTutorial; + + /** + * Represents the npc id of the essence teleporter. + */ + private int essenceTeleporter; + + /** + * The amount of recoil damage left (ring of recoil). + */ + private int recoilDamage = 40; + + /** + * The delay between the next use of double exp. + */ + private long doubleExpDelay; + + /** + * The delay between the next use of increased drops. + */ + private long dropDelay; + + /** + * If joined the monastery. + */ + private boolean joinedMonastery; + + /** + * If the player has read each plague + */ + private boolean[] readPlaques = new boolean[7]; + + /** + * The ring of forging uses. + */ + private int forgingUses; + + /** + * The ectofuntus charges. + */ + private int ectoCharges; + + /** + * The bracelet of clay uses. + */ + private int braceletClayUses; + + /** + * The abbyss data. + */ + private boolean[] abyssData = new boolean[4]; + + /** + * The amount of decays for the rc type. + */ + private final int[] rcDecays = new int[3]; + + /** + * If the death screen is disabled. + */ + private boolean disableDeathScreen; + + /** + * The stage of the player safety test. + */ + private int playerTestStage; + + /** + * The delay between charming usage. + */ + private long charmingDelay; + + /** + * The fairy ring travel log. + */ + private boolean[] travelLogs = new boolean[45]; + + /** + * The completed god books. + */ + private boolean[] godBooks = new boolean[3]; + + /** + * The god book you are currently filling. + */ + private int godBook = -1; + + /** + * If the player see's news or not. + */ + private boolean disableNews; + + /** + * The completed god pages. + */ + private boolean[] godPages = new boolean[4]; + + /** + * The time until the overcharge delay can be used. + */ + private long overChargeDelay; + + /** + * The boss kill counter. + */ + private int[] bossCounters = new int[25]; + + /** + * The barrows loot counter. + */ + private int barrowsLoots; + + /** + * The amount of lootshare points. + */ + private int lootSharePoints; + + /** + * The delay between the next decrease of lootshare. + */ + private long lootShareDelay; + + /** + * The double exp time. + */ + private long doubleExp; + + /** + * If Ava's device should randomly collect loot. + */ + private boolean avasDevice; + + /** + * The delay of the global teleporter system. + */ + private long globalTeleporterDelay; + + /** + * The delay until you can exchange the star sprite again. + */ + private long starSpriteDelay; + + /** + * The run replenish delay. + */ + private long runReplenishDelay; + + /** + * The run replenish charges. + */ + private int runReplenishCharges; + + /** + * The amount of low alchemy charges. + */ + private int lowAlchemyCharges; + + /** + * The low alchemy delay. + */ + private long lowAlchemyDelay; + + /** + * Is the bone crusher perk enabled. + */ + private boolean enableBoneCrusher = false; + + /** + * Is the coin machine perk enabled. + */ + private boolean enableCoinMachine = false; + + /** + * Is the charm collector perk enabled. + */ + private boolean enableCharmCollector = false; + + /** + * The magic skill cape delay. + */ + private long magicSkillCapeDelay; + + /** + * The hunter cape delay. + */ + private long hunterCapeDelay; + + /** + * The hunter cape charges. + */ + private int hunterCapeCharges; + + private long minigameTeleportDelay; + + /** + * Whether or not randoms are enabled + */ + private boolean macroDisabled = false; + + @Override + public void save(ByteBuffer buffer) { + SavedData.save(buffer, tutorialStage, 1); + SavedData.save(buffer, homeTeleportDelay, 2); + SavedData.save(buffer, lumbridgeRope, 3); + SavedData.save(buffer, apprentice, 4); + SavedData.save(buffer, assistTime, 6); + SavedData.save(buffer, assistExperience, 7); + SavedData.save(buffer, strongHoldRewards, 8); + SavedData.save(buffer, chatPing, 9); + SavedData.save(buffer, tutorClaim, 10); + SavedData.save(buffer, luthasTask, 11); + SavedData.save(buffer, (byte) karamjaBananas, 12); + SavedData.save(buffer, silkSteal, 13); + SavedData.save(buffer, (byte) zafAmount, 14); + SavedData.save(buffer, zafTime, 15); + SavedData.save(buffer, fritzGlass, 16); + SavedData.save(buffer, wydinEmployee, 17); + SavedData.save(buffer, draynorRecording, 18); + SavedData.save(buffer, geTutorial, 19); + SavedData.save(buffer, essenceTeleporter, 20); + if (recoilDamage != 40) { + SavedData.save(buffer, (byte) recoilDamage, 21); + } + SavedData.save(buffer, doubleExpDelay, 22); + SavedData.save(buffer, joinedMonastery, 23); + SavedData.save(buffer, readPlaques, 25); + SavedData.save(buffer, forgingUses, 26); + SavedData.save(buffer, getEctoCharges(), 27); + // SavedData.save(buffer, xpLock, 28); + SavedData.save(buffer, braceletClayUses, 29); + SavedData.save(buffer, dropDelay, 30); + buffer.put((byte) 31); + buffer.put((byte) abyssData.length); + for (int i = 0; i < abyssData.length; i++) { + buffer.put((byte) (abyssData[i] ? 1 : 0)); + } + buffer.put((byte) 32); + for (int i = 0; i < rcDecays.length; i++) { + buffer.put((byte) rcDecays[i]); + } + SavedData.save(buffer, disableDeathScreen, 33); + SavedData.save(buffer, playerTestStage, 34); + SavedData.save(buffer, charmingDelay, 35); + buffer.put((byte) 36); + buffer.put(((byte) travelLogs.length)); + for (int i = 0; i < travelLogs.length; i++) { + buffer.put((byte) (travelLogs[i] ? 1 : 0)); + } + buffer.put((byte) 37); + buffer.put((byte) godBooks.length); + for (int i = 0; i < godBooks.length; i++) { + buffer.put(((byte) (godBooks[i] ? 1 : 0))); + } + if (godBook != -1) { + buffer.put((byte) 38).putInt(godBook); + } + SavedData.save(buffer, disableNews, 39); + if (!godPages.equals(new boolean[4])) { + buffer.put((byte) 40); + for (int i = 0; i < 4; i++) { + buffer.put((byte) (godPages[i] ? 1 : 0)); + } + } + SavedData.save(buffer, overChargeDelay, 41); + SavedData.save(buffer, bossCounters, 42); + SavedData.save(buffer, barrowsLoots, 43); + SavedData.save(buffer, lootSharePoints, 44); + SavedData.save(buffer, lootShareDelay, 45); + SavedData.save(buffer, doubleExp, 46); + SavedData.save(buffer, avasDevice, 47); + SavedData.save(buffer, globalTeleporterDelay, 48); + SavedData.save(buffer, starSpriteDelay, 49); + SavedData.save(buffer, runReplenishDelay, 50); + SavedData.save(buffer, runReplenishCharges, 51); + SavedData.save(buffer, lowAlchemyCharges, 52); + SavedData.save(buffer, lowAlchemyDelay, 53); + SavedData.save(buffer, enableBoneCrusher, 54); + SavedData.save(buffer, enableCoinMachine, 55); + SavedData.save(buffer, magicSkillCapeDelay, 56); + SavedData.save(buffer, hunterCapeDelay, 57); + SavedData.save(buffer, hunterCapeCharges, 58); + SavedData.save(buffer, enableCharmCollector, 59); + SavedData.save(buffer, minigameTeleportDelay, 60); + SavedData.save(buffer, getSavedX(), 61); + SavedData.save(buffer, getSavedY(), 62); + SavedData.save(buffer, getSavedH(), 63); + SavedData.save(buffer, getTaskAmount(), 64); + SavedData.save(buffer, getTaskPoints(), 65); + SavedData.save(buffer, macroDisabled,66); + buffer.put((byte) 0); + } + + public void parse(JSONObject data){ + tutorialStage = Integer.parseInt( data.get("tutorialStage").toString()); + homeTeleportDelay = Long.parseLong(data.get("homeTeleportDelay").toString()); + lumbridgeRope = (boolean) data.get("lumbridgeRope"); + apprentice = (boolean) data.get("apprentice"); + assistTime = Long.parseLong(data.get("assistTime").toString()); + JSONArray ae = (JSONArray) data.get("assistExperience"); + for(int i = 0; i < ae.size(); i++){ + assistExperience[i] = Double.parseDouble(ae.get(i).toString()); + } + JSONArray sr = (JSONArray) data.get("strongHoldRewards"); + for(int i = 0; i < sr.size(); i++){ + strongHoldRewards[i] = (boolean) sr.get(i); + } + chatPing = Long.parseLong(data.get("chatPing").toString()); + tutorClaim = Long.parseLong(data.get("tutorClaim").toString()); + luthasTask = (boolean) data.get("luthasTask"); + karamjaBananas = Integer.parseInt( data.get("karamjaBananas").toString()); + silkSteal = Long.parseLong(data.get("silkSteal").toString()); + zafAmount = Integer.parseInt( data.get("zafAmount").toString()); + zafTime = Long.parseLong(data.get("zafTime").toString()); + fritzGlass = (boolean) data.get("fritzGlass"); + wydinEmployee = (boolean) data.get("wydinEmployee"); + draynorRecording = (boolean) data.get("draynorRecording"); + geTutorial = (boolean) data.get("geTutorial"); + essenceTeleporter = Integer.parseInt( data.get("essenceTeleporter").toString()); + recoilDamage = Integer.parseInt( data.get("recoilDamage").toString()); + doubleExpDelay = Long.parseLong(data.get("doubleExpDelay").toString()); + joinedMonastery = (boolean) data.get("joinedMonastery"); + JSONArray rp = (JSONArray) data.get("readPlaques"); + for(int i = 0; i < rp.size(); i++){ + readPlaques[i] = (boolean) rp.get(i); + } + forgingUses = Integer.parseInt( data.get("forgingUses").toString()); + ectoCharges = Integer.parseInt( data.get("ectoCharges").toString()); + braceletClayUses = Integer.parseInt( data.get("braceletClayUses").toString()); + dropDelay = Long.parseLong(data.get("dropDelay").toString()); + JSONArray ad = (JSONArray) data.get("abyssData"); + for(int i = 0; i < ad.size(); i++){ + abyssData[i] = (boolean) ad.get(i); + } + JSONArray rd = (JSONArray) data.get("rcDecays"); + for(int i = 0; i < rd.size(); i++){ + rcDecays[i] = Integer.parseInt(rd.get(i).toString()); + } + disableDeathScreen = (boolean) data.get("disableDeathScreen"); + playerTestStage = Integer.parseInt( data.get("playerTestStage").toString()); + charmingDelay = Long.parseLong(data.get("charmingDelay").toString()); + JSONArray tl = (JSONArray) data.get("travelLogs"); + for(int i = 0; i < tl.size(); i++){ + travelLogs[i] = (boolean) tl.get(i); + } + JSONArray gb = (JSONArray) data.get("godBooks"); + for(int i = 0 ; i < gb.size(); i++){ + godBooks[i] = (boolean) gb.get(i); + } + disableNews = (boolean) data.get("disableNews"); + JSONArray gp = (JSONArray) data.get("godPages"); + for(int i = 0 ; i < gp.size(); i++){ + godPages[i] = (boolean) gp.get(i); + } + overChargeDelay = Long.parseLong(data.get("overChargeDelay").toString()); + JSONArray bc = (JSONArray) data.get("bossCounters"); + for(int i = 0 ; i < bc.size(); i++){ + bossCounters[i] = Integer.parseInt(bc.get(i).toString()); + } + barrowsLoots = Integer.parseInt( data.get("barrowsLoots").toString()); + lootShareDelay = Long.parseLong(data.get("lootShareDelay").toString()); + lootSharePoints = Integer.parseInt( data.get("lootSharePoints").toString()); + doubleExp = Long.parseLong(data.get("doubleExp").toString()); + avasDevice = (boolean) data.get("avasDevice"); + globalTeleporterDelay = Long.parseLong(data.get("globalTeleporterDelay").toString()); + starSpriteDelay = Long.parseLong(data.get("starSpriteDelay").toString()); + runReplenishDelay = Long.parseLong(data.get("runReplenishDelay").toString()); + runReplenishCharges = Integer.parseInt( data.get("runReplenishCharges").toString()); + lowAlchemyCharges = Integer.parseInt( data.get("lowAlchemyCharges").toString()); + lowAlchemyDelay = Long.parseLong(data.get("lowAlchemyDelay").toString()); + magicSkillCapeDelay = Long.parseLong(data.get("magicSkillCapeDelay").toString()); + hunterCapeDelay = Long.parseLong(data.get("hunterCapeDelay").toString()); + hunterCapeCharges = Integer.parseInt( data.get("hunterCapeCharges").toString()); + taskAmount = Integer.parseInt( data.get("taskAmount").toString()); + taskPoints = Integer.parseInt( data.get("taskPoints").toString()); + macroDisabled = (boolean) data.get("macroDisabled"); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + int size; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + tutorialStage = buffer.getInt(); + break; + case 2: + homeTeleportDelay = buffer.getLong(); + break; + case 3: + lumbridgeRope = SavedData.getBoolean(buffer.get()); + break; + case 4: + apprentice = SavedData.getBoolean(buffer.get()); + break; + case 5: + buffer.getLong(); // Used to be skull time. + break; + case 6: + assistTime = buffer.getLong(); + break; + case 7: + for (int i = 0; i < assistExperience.length; i++) { + assistExperience[i] = buffer.getDouble(); + } + break; + case 8: + for (byte i = 0; i < strongHoldRewards.length; i++) { + strongHoldRewards[i] = SavedData.getBoolean(buffer.get()); + } + break; + case 9: + chatPing = buffer.getLong(); + break; + case 10: + tutorClaim = buffer.getLong(); + break; + case 11: + luthasTask = SavedData.getBoolean(buffer.get()); + break; + case 12: + karamjaBananas = buffer.get(); + break; + case 13: + silkSteal = buffer.getLong(); + break; + case 14: + zafAmount = buffer.get(); + ; + break; + case 15: + zafTime = buffer.getLong(); + break; + case 16: + fritzGlass = SavedData.getBoolean(buffer.get()); + break; + case 17: + wydinEmployee = SavedData.getBoolean(buffer.get()); + break; + case 18: + draynorRecording = SavedData.getBoolean(buffer.get()); + break; + case 19: + geTutorial = SavedData.getBoolean(buffer.get()); + break; + case 20: + essenceTeleporter = buffer.getInt(); + break; + case 21: + recoilDamage = buffer.get(); + break; + case 22: + doubleExpDelay = buffer.getLong(); + break; + case 23: + SavedData.getBoolean(buffer.get()); + break; + case 24:// tyler fuckup. + for (int i = 0; i < 7; i++) { + buffer.get(); + } + break; + case 25: + for (int i = 0; i < readPlaques.length; i++) { + readPlaques[i] = buffer.get() == 1; + } + break; + case 26: + forgingUses = buffer.getInt(); + break; + case 27: + setEctoCharges(buffer.getInt()); + break; + case 28: + // xpLock = SavedData.getBoolean(buffer); + SavedData.getBoolean(buffer); + break; + case 29: + braceletClayUses = buffer.getInt(); + break; + case 30: + dropDelay = buffer.getLong(); + break; + case 31: + size = buffer.get(); + for (int i = 0; i < size; i++) { + abyssData[i] = buffer.get() == 1; + } + break; + case 32: + for (int i = 0; i < rcDecays.length; i++) { + rcDecays[i] = buffer.get(); + } + break; + case 33: + disableDeathScreen = SavedData.getBoolean(buffer); + break; + case 34: + playerTestStage = buffer.getInt(); + break; + case 35: + charmingDelay = buffer.getLong(); + break; + case 36: + byte size1 = buffer.get(); + for (int i = 0; i < size1; i++) { + travelLogs[i] = buffer.get() == 1; + } + break; + case 37: + size = buffer.get(); + for (int i = 0; i < size; i++) { + godBooks[i] = buffer.get() == 1; + } + break; + case 38: + godBook = buffer.getInt(); + break; + case 39: + disableNews = SavedData.getBoolean(buffer); + break; + case 40: + for (int i = 0; i < 4; i++) { + godPages[i] = buffer.get() == 1; + } + break; + case 41: + overChargeDelay = buffer.getLong(); + break; + case 42: + for (int i = 0; i < bossCounters.length; i++) { + bossCounters[i] = buffer.getInt(); + if (bossCounters[i] < 0) { + bossCounters[i] = 127 + (bossCounters[i] * -1); + } + } + break; + case 43: + barrowsLoots = buffer.getInt(); + break; + case 44: + lootSharePoints = buffer.getInt(); + break; + case 45: + lootShareDelay = buffer.getLong(); + break; + case 46: + doubleExp = buffer.getLong(); + break; + case 47: + avasDevice = SavedData.getBoolean(buffer); + break; + case 48: + globalTeleporterDelay = buffer.getLong(); + break; + case 49: + starSpriteDelay = buffer.getLong(); + break; + case 50: + runReplenishDelay = buffer.getLong(); + break; + case 51: + runReplenishCharges = buffer.getInt(); + break; + case 52: + lowAlchemyCharges = buffer.getInt(); + break; + case 53: + lowAlchemyDelay = buffer.getLong(); + break; + case 54: + enableBoneCrusher = SavedData.getBoolean(buffer); + break; + case 55: + enableCoinMachine = SavedData.getBoolean(buffer); + break; + case 56: + magicSkillCapeDelay = buffer.getLong(); + break; + case 57: + hunterCapeDelay = buffer.getLong(); + break; + case 58: + hunterCapeCharges = buffer.getInt(); + break; + case 59: + enableCharmCollector = SavedData.getBoolean(buffer); + break; + case 60: + minigameTeleportDelay = buffer.getLong(); + break; + case 61: + setSavedX(buffer.getInt()); + break; + case 62: + setSavedY(buffer.getInt()); + break; + case 63: + setSavedH(buffer.getInt()); + break; + case 64: + setTaskAmount(buffer.getInt()); + break; + case 65: + setTaskPoints(buffer.getInt()); + break; + case 66: + macroDisabled = SavedData.getBoolean(buffer); + break; + } + } + } + + public void setSavedLocation(int x, int y, int z) { + setSavedX(x); + setSavedY(y); + setSavedH(z); + } + + /** + * Sets the star sprite delay. + * @param value The value. + */ + public void setStarSpriteDelay(long value) { + starSpriteDelay = value; + } + + /** + * Gets the star sprite delay. + * @return The star sprite delay. + */ + public long getStarSpriteDelay() { + return starSpriteDelay; + } + + /** + * Gets the travel logs. + * @return the logs. + */ + public boolean[] getTravelLogs() { + return travelLogs; + } + + /** + * Removes a travel log. + * @param index the index. + */ + public void removeTravelLog(int index) { + travelLogs[index] = false; + } + + /** + * Checks if they have the travel log. + * @param index the index. + * @return {@code True} if so. + */ + public boolean hasTravelLog(int index) { + return travelLogs[index]; + } + + /** + * Sets a travel log. + * @param index the index. + */ + public void setTravelLog(int index) { + travelLogs[index] = true; + } + + /** + * Sets the charming delay. + * @param delay the delay. + */ + public void setCharmingDelay(long delay) { + this.charmingDelay = delay; + } + + /** + * Gets the charming delay. + * @return the delay. + */ + public long getCharmingDelay() { + return charmingDelay; + } + + /** + * Gets the stage. + * @return the stage. + */ + public int getTestStage() { + return playerTestStage; + } + + /** + * Sets the test stage. + * @param stage the stage. + */ + public void setTestStage(int stage) { + playerTestStage = stage; + } + + /** + * Gets the tutorialStage. + * @return The tutorialStage. + */ + public int getTutorialStage() { + return tutorialStage; + } + + /** + * Sets the tutorialStage. + * @param tutorialStage The tutorialStage to set. + */ + public void setTutorialStage(int tutorialStage) { + this.tutorialStage = tutorialStage; + } + + /** + * Gets the homeTeleportDelay. + * @return The homeTeleportDelay. + */ + public long getHomeTeleportDelay() { + return homeTeleportDelay; + } + + /** + * Sets the homeTeleportDelay. + * @param homeTeleportDelay The homeTeleportDelay to set. + */ + public void setHomeTeleportDelay(long homeTeleportDelay) { + this.homeTeleportDelay = homeTeleportDelay; + } + + /** + * Gets the lumbridgeRope. + * @return The lumbridgeRope. + */ + public boolean hasTiedLumbridgeRope() { + return lumbridgeRope; + } + + /** + * Sets the lumbridgeRope. + * @param lumbridgeRope The lumbridgeRope to set. + */ + public void setLumbridgeRope(boolean lumbridgeRope) { + this.lumbridgeRope = lumbridgeRope; + } + + /** + * Gets the apprentice. + * @return The apprentice. + */ + public boolean hasSpokenToApprentice() { + return apprentice; + } + + /** + * Sets the apprentice. + * @param apprentice The apprentice to set. + */ + public void setApprentice(boolean apprentice) { + this.apprentice = apprentice; + } + + /** + * Gets the assistTime. + * @return The assistTime. + */ + public long getAssistTime() { + return assistTime; + } + + /** + * Sets the assistTime. + * @param assistTime The assistTime to set. + */ + public void setAssistTime(long assistTime) { + this.assistTime = assistTime; + } + + /** + * Gets the assistExperience. + * @return The assistExperience. + */ + public double[] getAssistExperience() { + return assistExperience; + } + + /** + * Sets the assistExperience. + * @param assistExperience The assistExperience to set. + */ + public void setAssistExperience(double[] assistExperience) { + this.assistExperience = assistExperience; + } + + /** + * Gets the strongHoldRewards. + * @return The strongHoldRewards. + */ + public boolean[] getStrongHoldRewards() { + return strongHoldRewards; + } + + /** + * Gets the strong hold reward value. + * @param reward the reward. + * @return {@code True} if so. + */ + public boolean hasStrongholdReward(int reward) { + return strongHoldRewards[reward - 1]; + } + + /** + * Gets the chatPing. + * @return The chatPing. + */ + public long getChatPing() { + return chatPing; + } + + /** + * Sets the chatPing. + * @param chatPing The chatPing to set. + */ + public void setChatPing(long chatPing) { + this.chatPing = chatPing; + } + + /** + * Gets the tutorClaim. + * @return The tutorClaim. + */ + public long getTutorClaim() { + return tutorClaim; + } + + /** + * Sets the tutorClaim. + * @param tutorClaim The tutorClaim to set. + */ + public void setTutorClaim(long tutorClaim) { + this.tutorClaim = tutorClaim; + } + + /** + * Gets the luthasTask. + * @return The luthasTask. + */ + public boolean isLuthasTask() { + return luthasTask; + } + + /** + * Sets the luthasTask. + * @param luthasTask The luthasTask to set. + */ + public void setLuthasTask(boolean luthasTask) { + this.luthasTask = luthasTask; + } + + /** + * Gets the karamjaBannanas. + * @return The karamjaBannanas. + */ + public int getKaramjaBananas() { + return karamjaBananas; + } + + /** + * Sets the karamjaBannanas. + * @param karamjaBannanas The karamjaBannanas to set. + */ + public void setKaramjaBannanas(int karamjaBannanas) { + this.karamjaBananas = karamjaBannanas; + } + + /** + * Gets the silkSteal. + * @return The silkSteal. + */ + public long getSilkSteal() { + return silkSteal; + } + + /** + * Sets the silkSteal. + * @param silkSteal The silkSteal to set. + */ + public void setSilkSteal(long silkSteal) { + this.silkSteal = silkSteal; + } + + /** + * Gets the zaffAmount. + * @return The zaffAmount. + */ + public int getZaffAmount() { + return zafAmount; + } + + /** + * Sets the zaffAmount. + * @param zaffAmount The zaffAmount to set. + */ + public void setZaffAmount(int zaffAmount) { + this.zafAmount = zaffAmount; + } + + /** + * Gets the zaffTime. + * @return The zaffTime. + */ + public long getZafTime() { + return zafTime; + } + + /** + * Gets the draynorRecording. + * @return The draynorRecording. + */ + public boolean isDraynorRecording() { + return draynorRecording; + } + + /** + * Sets the draynorRecording. + * @param draynorRecording The draynorRecording to set. + */ + public void setDraynorRecording(boolean draynorRecording) { + this.draynorRecording = draynorRecording; + } + + /** + * Gets the wydinEmployee. + * @return The wydinEmployee. + */ + public boolean isWydinEmployee() { + return wydinEmployee; + } + + /** + * Sets the wydinEmployee. + * @param wydinEmployee The wydinEmployee to set. + */ + public void setWydinEmployee(boolean wydinEmployee) { + this.wydinEmployee = wydinEmployee; + } + + /** + * Sets the zaffTime. + * @param zaffTime The zaffTime to set. + */ + public void setZafTime(long zaffTime) { + this.zafTime = zaffTime; + } + + /** + * Gets the frizGlass. + * @return The frizGlass. + */ + public boolean isFritzGlass() { + return fritzGlass; + } + + /** + * Sets the frizGlass. + * @param frizGlass The frizGlass to set. + */ + public void setFritzGlass(boolean frizGlass) { + this.fritzGlass = frizGlass; + } + + /** + * Gets the geTutorial. + * @return The geTutorial. + */ + public boolean isGeTutorial() { + return geTutorial; + } + + /** + * Sets the geTutorial. + * @param geTutorial The geTutorial to set. + */ + public void setGeTutorial(boolean geTutorial) { + this.geTutorial = geTutorial; + } + + /** + * Gets the essenceTeleporter. + * @return The essenceTeleporter. + */ + public int getEssenceTeleporter() { + return essenceTeleporter; + } + + /** + * Sets the essenceTeleporter. + * @param essenceTeleporter The essenceTeleporter to set. + */ + public void setEssenceTeleporter(int essenceTeleporter) { + this.essenceTeleporter = essenceTeleporter; + } + + /** + * Gets the recoilDamage. + * @return The recoilDamage. + */ + public int getRecoilDamage() { + return recoilDamage; + } + + /** + * Sets the recoilDamage. + * @param recoilDamage The recoilDamage to set. + */ + public void setRecoilDamage(int recoilDamage) { + this.recoilDamage = recoilDamage; + } + + /** + * Gets the doubleExpDelay. + * @return The doubleExpDelay. + */ + public long getDoubleExpDelay() { + return doubleExpDelay; + } + + /** + * Sets the doubleExpDelay. + * @param doubleExpDelay The doubleExpDelay to set. + */ + public void setDoubleExpDelay(long doubleExpDelay) { + this.doubleExpDelay = doubleExpDelay; + } + + /** + * Gets the joinedMonastery. + * @return The joinedMonastery. + */ + public boolean isJoinedMonastery() { + return joinedMonastery; + } + + /** + * Sets the joinedMonastery. + * @param joinedMonastery The joinedMonastery to set. + */ + public void setJoinedMonastery(boolean joinedMonastery) { + this.joinedMonastery = joinedMonastery; + } + + /** + * Gets the read plagues. + * @return The plague + */ + public boolean[] getReadPlaques() { + return readPlaques; + } + + /** + * If the player has read all of the jail-plaques in the jail. + * @return If the player has read them all. + */ + public boolean hasReadPlaques() { + for (int i = 0; i < getReadPlaques().length; i++) { + if (!getReadPlaques()[i]) { + return false; + } + } + return true; + } + + /** + * Sets a god book to being completed. + * @param book the book. + */ + public void setGodBook(GodBook book) { + godBooks[book.ordinal()] = true; + } + + /** + * Checks if a god book has been completed. + * @param book the book. + * @return {@code True} if so. + */ + public boolean hasCompletedGodBook(GodBook book) { + return godBooks[book.ordinal()]; + } + + /** + * Gets the forgingUses. + * @return The forgingUses. + */ + public int getForgingUses() { + return forgingUses; + } + + /** + * Sets the forgingUses. + * @param forgingUses The forgingUses to set. + */ + public void setForgingUses(int forgingUses) { + this.forgingUses = forgingUses; + } + + /** + * Gets the ectoCharges. + * @return The ectoCharges. + */ + public int getEctoCharges() { + return ectoCharges; + } + + /** + * Sets the ectoCharges. + * @param ectoCharges The ectoCharges to set. + */ + public void setEctoCharges(int ectoCharges) { + this.ectoCharges = ectoCharges; + } + + /** + * Gets the braceletClayUses. + * @return The braceletClayUses. + */ + public int getBraceletClayUses() { + return braceletClayUses; + } + + /** + * Increments the bracelet of clay uses. + */ + public void incrementBraceletOfClay() { + this.braceletClayUses += 1; + } + + /** + * Resets the abyss data. + */ + public void resetAbyss() { + for (int i = 0; i < abyssData.length; i++) { + abyssData[i] = false; + } + } + + /** + * Sets the charge. + * @param ordinal the ordinal. + */ + public void setAbyssCharge(int ordinal) { + abyssData[ordinal] = true; + } + + /** + * Has an anyss charge. + * @param ordinal the ordinal. + * @return {@code True} if so. + */ + public boolean hasAbyssCharge(int ordinal) { + return abyssData[ordinal]; + } + + /** + * Sets the braceletClayUses. + * @param braceletClayUses The braceletClayUses to set. + */ + public void setBraceletClayUses(int braceletClayUses) { + this.braceletClayUses = braceletClayUses; + } + + /** + * Gets the dropDelay. + * @return The dropDelay. + */ + public long getDropDelay() { + return dropDelay; + } + + /** + * Sets the dropDelay. + * @param dropDelay The dropDelay to set. + */ + public void setDropDelay(long dropDelay) { + this.dropDelay = dropDelay; + } + + /** + * Gets the rc decay. + * @param ordinal the ordinal. + * @return the decay. + */ + public int getRcDecay(int ordinal) { + if (ordinal < 0) { + return 0; + } + return rcDecays[ordinal]; + } + + /** + * Gets the rc decays. + * @return the decays. + */ + public int[] getRcDecays() { + return rcDecays; + } + + /** + * Checks if the death screen is disabled. + * @return {@code True} if so. + */ + public boolean isDeathScreenDisabled() { + return disableDeathScreen; + } + + /** + * Sets if the death screen is disabled. + * @param b the boolean. + */ + public void setDisableDeathScreen(boolean b) { + this.disableDeathScreen = b; + } + + /** + * Gets the godBooks. + * @return the godBooks + */ + public boolean[] getGodBooks() { + return godBooks; + } + + /** + * Sets the godBooks. + * @param godBooks the godBooks to set. + */ + public void setGodBooks(boolean[] godBooks) { + this.godBooks = godBooks; + } + + /** + * Gets the godBook. + * @return the godBook + */ + public int getGodBook() { + return godBook; + } + + /** + * Sets the godBook. + * @param godBook the godBook to set. + */ + public void setGodBook(int godBook) { + this.godBook = godBook; + } + + /** + * Gets the disableNews. + * @return the disableNews + */ + public boolean isDisableNews() { + return disableNews; + } + + /** + * Sets the disableNews. + * @param disableNews the disableNews to set. + */ + public void setDisableNews(boolean disableNews) { + this.disableNews = disableNews; + } + + /** + * Gets the godPages. + * @return the godPages + */ + public boolean[] getGodPages() { + return godPages; + } + + /** + * Sets the godPages. + * @param godPages the godPages to set. + */ + public void setGodPages(boolean[] godPages) { + this.godPages = godPages; + } + + /** + * Gets the overChargeDelay. + * @return the overChargeDelay. + */ + public long getOverChargeDelay() { + return overChargeDelay; + } + + /** + * Sets the overChargeDelay. + * @param overChargeDelay the overChargeDelay to set + */ + public void setOverChargeDelay(long overChargeDelay) { + this.overChargeDelay = overChargeDelay; + } + + /** + * Gets the bossCounters. + * @return the bossCounters. + */ + public int[] getBossCounters() { + return bossCounters; + } + + /** + * Sets the bossCounters. + * @param bossCounters the bossCounters to set + */ + public void setBossCounters(int[] bossCounters) { + this.bossCounters = bossCounters; + } + + /** + * Gets the barrowsLoots. + * @return the barrowsLoots. + */ + public int getBarrowsLoots() { + return barrowsLoots; + } + + /** + * Sets the barrowsLoots. + * @param barrowsLoots the barrowsLoots to set + */ + public void setBarrowsLoots(int barrowsLoots) { + this.barrowsLoots = barrowsLoots; + } + + /** + * Gets the lootSharePoints. + * @return the lootSharePoints. + */ + public int getLootSharePoints() { + return lootSharePoints; + } + + /** + * Sets the lootSharePoints. + * @param lootSharePoints the lootSharePoints to set + */ + public void setLootSharePoints(int lootSharePoints) { + this.lootSharePoints = lootSharePoints; + } + + /** + * Gets the lootShareDelay. + * @return the lootShareDelay. + */ + public long getLootShareDelay() { + return lootShareDelay; + } + + /** + * Sets the lootShareDelay. + * @param lootShareDelay the lootShareDelay to set + */ + public void setLootShareDelay(long lootShareDelay) { + this.lootShareDelay = lootShareDelay; + } + + /** + * Gets the doubleExp. + * @return the doubleExp. + */ + public long getDoubleExp() { + return doubleExp; + } + + /** + * Sets the doubleExp. + * @param doubleExp the doubleExp to set + */ + public void setDoubleExp(long doubleExp) { + this.doubleExp = doubleExp; + } + + /** + * Checks if double exp is active. + * @return {@code True} if so. + */ + public boolean hasDoubleExp() { + return doubleExp > System.currentTimeMillis(); + } + + /** + * Gets the avasDevice + * @return the avasDevice + */ + public boolean isAvasDisabled() { + return avasDevice; + } + + /** + * Sets the avasDevice + * @param avasDevice + */ + public void setAvasDisabled(boolean avasDevice) { + this.avasDevice = avasDevice; + } + + /** + * Gets the globalTeleporterDelay. + * @return the globalTeleporterDelay. + */ + public long getGlobalTeleporterDelay() { + return globalTeleporterDelay; + } + + /** + * Sets the globalTeleporterDelay. + * @param globalTeleporterDelay the globalTeleporterDelay to set + */ + public void setGlobalTeleporterDelay(long globalTeleporterDelay) { + this.globalTeleporterDelay = globalTeleporterDelay; + } + + /** + * @return the runReplenishDelay + */ + public long getRunReplenishDelay() { + return runReplenishDelay; + } + + /** + * @param runReplenishDelay the runReplenishDelay to set + */ + public void setRunReplenishDelay(long runReplenishDelay) { + this.runReplenishDelay = runReplenishDelay; + } + + /** + * @return the runReplenishCharges + */ + public int getRunReplenishCharges() { + return runReplenishCharges; + } + + /** + * @param runReplenishCharges the runReplenishCharges to set + */ + public void setRunReplenishCharges(int runReplenishCharges) { + this.runReplenishCharges = runReplenishCharges; + } + + /** + * @return the lowAlchemyCharges + */ + public int getLowAlchemyCharges() { + return lowAlchemyCharges; + } + + /** + * @param lowAlchemyCharges the lowAlchemyCharges to set + */ + public void setLowAlchemyCharges(int lowAlchemyCharges) { + this.lowAlchemyCharges = lowAlchemyCharges; + } + + /** + * @return the lowAlchemyDelay + */ + public long getLowAlchemyDelay() { + return lowAlchemyDelay; + } + + /** + * @param lowAlchemyDelay the lowAlchemyDelay to set + */ + public void setLowAlchemyDelay(long lowAlchemyDelay) { + this.lowAlchemyDelay = lowAlchemyDelay; + } + + /** + * @return the enableBoneCrusher + */ + public boolean isEnableBoneCrusher() { + return enableBoneCrusher; + } + + /** + * @param enableBoneCrusher the enableBoneCrusher to set + */ + public void setEnableBoneCrusher(boolean enableBoneCrusher) { + this.enableBoneCrusher = enableBoneCrusher; + } + + public boolean isEnableCoinMachine() { + return enableCoinMachine; + } + + public void setEnableCoinMachine(boolean enableCoinMachine) { + this.enableCoinMachine = enableCoinMachine; + } + + /** + * @return the magicSkillCapeDelay + */ + public long getMagicSkillCapeDelay() { + return magicSkillCapeDelay; + } + + /** + * @param magicSkillCapeDelay the magicSkillCapeDelay to set + */ + public void setMagicSkillCapeDelay(long magicSkillCapeDelay) { + this.magicSkillCapeDelay = magicSkillCapeDelay; + } + + /** + * @return the hunterCapeDelay + */ + public long getHunterCapeDelay() { + return hunterCapeDelay; + } + + /** + * @param hunterCapeDelay the hunterCapeDelay to set + */ + public void setHunterCapeDelay(long hunterCapeDelay) { + this.hunterCapeDelay = hunterCapeDelay; + } + + /** + * @return the hunterCapeCharges + */ + public int getHunterCapeCharges() { + return hunterCapeCharges; + } + + /** + * @param hunterCapeCharges the hunterCapeCharges to set + */ + public void setHunterCapeCharges(int hunterCapeCharges) { + this.hunterCapeCharges = hunterCapeCharges; + } + + /** + * @return the enableCharmCollector + */ + public boolean isEnableCharmCollector() { + return enableCharmCollector; + } + + /** + * @param enableCharmCollector the enableCharmCollector to set + */ + public void setEnableCharmCollector(boolean enableCharmCollector) { + this.enableCharmCollector = enableCharmCollector; + } + + /** + * Gets the Minigame Group Finder teleport delay. + * @return + */ + public long getMinigameTeleportDelay() { + return minigameTeleportDelay; + } + + /** + * Sets the Minigame Group Finder teleport delay. + * @param delay The delay to set. + */ + public void setMinigameTeleportDelay(long delay) { + this.minigameTeleportDelay = delay; + } + + public int getSavedH() { + return savedH; + } + + public void setSavedH(int savedH) { + this.savedH = savedH; + } + + public int getSavedY() { + return savedY; + } + + public void setSavedY(int savedY) { + this.savedY = savedY; + } + + public int getSavedX() { + return savedX; + } + + public void setSavedX(int savedX) { + this.savedX = savedX; + } + + public int getTaskAmount() { + return taskAmount; + } + + public void setTaskAmount(int taskAmount) { + this.taskAmount = taskAmount; + } + + public int getTaskPoints() { + return taskPoints; + } + + public void setTaskPoints(int taskPoints) { + this.taskPoints = taskPoints; + } + + public void setMacroDisabled(boolean disabled){this.macroDisabled = disabled;} + + public boolean getMacroDisabled() {return this.macroDisabled;} + + public boolean[] getAbyssData() { + return abyssData; + } + + public int getPlayerTestStage() { + return playerTestStage; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/HintIconManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/HintIconManager.java new file mode 100644 index 000000000..e92f5403e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/HintIconManager.java @@ -0,0 +1,207 @@ +package core.game.node.entity.player.link; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.net.packet.PacketRepository; +import core.net.packet.context.HintIconContext; +import core.net.packet.out.HintIcon; + +/** + * The player's hint icon manager. + * @author Emperor + */ +public final class HintIconManager { + + /** + * The maximum size of hint icons. + */ + public static final int MAXIMUM_SIZE = 8; + + /** + * The default arrow id. + */ + public static final int DEFAULT_ARROW = 1; + + /** + * The default model id. + */ + public static final int DEFAULT_MODEL = -1; + + /** + * The arrow in a circle model id. + */ + public static final int ARROW_CIRCLE_MODEL = 40497; + + /** + * The hint icons. + */ + private HintIconContext[] hintIcons = new HintIconContext[MAXIMUM_SIZE]; + + /** + * Constructs a new {@code HintIconManager} {@code Object}. + */ + public HintIconManager() { + /* + * empty. + */ + } + + /** + * Registers a new hint icon. + * @param player The player. + * @param target The entity target. + * @return The slot of the hint icon. + */ + public static int registerHintIcon(Player player, Node target) { + return registerHintIcon(player, target, DEFAULT_ARROW, DEFAULT_MODEL, player.getHintIconManager().freeSlot()); + } + + /** + * Registers a new hint icon. + * @param player The player. + * @param target The entity target. + * @return The slot of the hint icon. + */ + public static int registerHeightHintIcon(Player player, Node target, int height) { + return registerHintIcon(player, target, DEFAULT_ARROW, DEFAULT_MODEL, player.getHintIconManager().freeSlot(), height); + } + + /** + * Registers a new hint icon. + * @param player The player. + * @param target The entity target. + * @param arrowId The arrow id to use. + * @return The slot of the hint icon. + */ + public static int registerHintIcon(Player player, Node target, int arrowId) { + return registerHintIcon(player, target, arrowId, DEFAULT_MODEL, player.getHintIconManager().freeSlot()); + } + + /** + * Registers a new hint icon. + * @param player The player. + * @param target The entity target. + * @param arrowId The arrow id to use. + * @param modelId The model id. + * @return The slot of the hint icon. + */ + public static int registerHintIcon(Player player, Node target, int arrowId, int modelId) { + return registerHintIcon(player, target, arrowId, modelId, player.getHintIconManager().freeSlot()); + } + + /** + * Registers a new hint icon. + * @param player The player. + * @param target The entity target. + * @param arrowId The arrow id to use. + * @param modelId The model id. + * @param slot The slot. + * @return The slot of the hint icon. + */ + public static int registerHintIcon(Player player, Node target, int arrowId, int modelId, int slot) { + if (slot < 0) { + return -1; + } + if (target == null) { + return 0; + } + HintIconManager mng = player.getHintIconManager(); + HintIconContext icon = new HintIconContext(player, slot, arrowId, target, modelId); + PacketRepository.send(HintIcon.class, icon); + mng.hintIcons[slot] = icon; + return slot; + } + + /** + * Registers a new hint icon. + * @param player The player. + * @param target The entity target. + * @param arrowId The arrow id to use. + * @param modelId The model id. + * @param slot The slot. + * @param height The height of the hint icon. + * @return The slot of the hint icon. + */ + public static int registerHintIcon(Player player, Node target, int arrowId, int modelId, int slot, int height) { + int type = 2; + if (target instanceof Entity) { + type = target instanceof Player ? 10 : 1; + } + return registerHintIcon(player, target, arrowId, modelId, slot, height, type); + } + + /** + * Registers a new hint icon. + * @param player The player. + * @param target The entity target. + * @param arrowId The arrow id to use. + * @param modelId The model id. + * @param slot The slot. + * @param height The height of the hint icon. + * @param targetType The target type. + * @return The slot of the hint icon. + */ + public static int registerHintIcon(Player player, Node target, int arrowId, int modelId, int slot, int height, int targetType) { + if (slot < 0) { + return -1; + } + HintIconManager mng = player.getHintIconManager(); + HintIconContext icon = new HintIconContext(player, slot, arrowId, targetType, target, modelId, height); + PacketRepository.send(HintIcon.class, icon); + mng.hintIcons[slot] = icon; + return slot; + } + + /** + * Removes a hint icon. + * @param player The player. + * @param slot The hint icon slot. + */ + public static void removeHintIcon(Player player, int slot) { + if (slot < 0) { + return; + } + HintIconManager mng = player.getHintIconManager(); + HintIconContext icon = mng.hintIcons[slot]; + if (icon != null) { + icon.setTargetType(0); + PacketRepository.send(HintIcon.class, icon); + mng.hintIcons[slot] = null; + } + } + + /** + * Clears the hint icons. + */ + public void clear() { + for (int i = 0; i < hintIcons.length; i++) { + HintIconContext icon = hintIcons[i]; + if (icon != null) { + removeHintIcon(icon.getPlayer(), i); + } + } + } + + /** + * Gets a free hint icon slot. + * @return The free slot. + */ + public int freeSlot() { + for (int i = 0; i < hintIcons.length; i++) { + if (hintIcons[i] == null) { + return i; + } + } + return -1; + } + + /** + * Gets the hint icon for the given slot. + * @param slot The slot. + * @return The hint icon context. + */ + public HintIconContext getIcon(int slot) { + return hintIcons[slot]; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/InterfaceManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/InterfaceManager.java new file mode 100644 index 000000000..9cc2f3998 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/InterfaceManager.java @@ -0,0 +1,809 @@ +package core.game.node.entity.player.link; + +import core.game.component.Component; +import core.game.component.InterfaceType; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.net.packet.PacketRepository; +import core.net.packet.context.InterfaceContext; +import core.net.packet.context.WindowsPaneContext; +import core.net.packet.out.CloseInterface; +import core.net.packet.out.Interface; +import core.net.packet.out.WindowsPane; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; + +import static core.tools.Interfaces.*; + +/** + * Manages a player's interfaces. + * @author Emperor + * + */ +public final class InterfaceManager { + + /** + * The default windows pane. + */ + public static final int WINDOWS_PANE = TOPLEVEL_548; + + /** + * The default chat box interface. + */ + public static final int DEFAULT_CHATBOX = CHATDEFAULT_137; + + /** + * The default tabs. + */ + public static final int[] DEFAULT_TABS = { WEAPON_FISTS_SEL_92, STATS_320, QUESTJOURNAL_V2_274, + INVENTORY_149, WORNITEMS_387, PRAYER_271, MAGIC_192, LORE_STATS_SIDE_662, + FRIENDS2_550, IGNORE2_551, CLANJOIN_589, OPTIONS_261, EMOTES_464, + MUSIC_V3_187, LOGOUT_182 }; + + /** + * The player. + */ + private final Player player; + + /** + * The amount of interface packets sent. + */ + private int packetCount; + + /** + * The windows pane. + */ + private Component windowsPane; + + /** + * The currently opened component. + */ + private Component opened; + + /** + * The tabs. + */ + private Component[] tabs = new Component[15]; + + /** + * The chatbox component. + */ + private Component chatbox; + + /** + * The single tab. + */ + private Component singleTab; + + /** + * The overlay component. + */ + private Component overlay; + + /** + * The wilderness overlay component + */ + private Component wildyOverlay; + + /** + * The currently opened tab's index. + */ + private int currentTabIndex = 3; + + /** + * Constructs a new {@code InterfaceManager} {@code Object}. + * + * @param player + * The player. + */ + public InterfaceManager(Player player) { + this.player = player; + } + + /** + * Opens the windows pane. + * + * @param windowsPane + * The windows pane. + * @return The component instance. + */ + public Component openWindowsPane(Component windowsPane) { + return openWindowsPane(windowsPane, false); + } + + /** + * Opens the windows pane. + * + * @param windowsPane + * The windows pane. + * @return The component instance. + */ + public Component openWindowsPane(Component windowsPane, boolean overlap) { + this.windowsPane = windowsPane; + if (windowsPane.getDefinition().getType() != InterfaceType.WINDOW_PANE) { + SystemLogger.logErr("Set interface type to WINDOW_PANE for component " + windowsPane.getId() + ", definition requires updating!"); + windowsPane.getDefinition().setType(InterfaceType.WINDOW_PANE); + } + PacketRepository.send(WindowsPane.class, new WindowsPaneContext(player, windowsPane.getId(), overlap ? 1 : 0)); + windowsPane.open(player); + return windowsPane; + } + + public void openWindowsPane(Component windowsPane, int type) { + this.windowsPane = windowsPane; + if (windowsPane.getDefinition().getType() != InterfaceType.WINDOW_PANE) { + SystemLogger.logErr("Set interface type to WINDOW_PANE for component " + windowsPane.getId() + ", definition requires updating!"); + windowsPane.getDefinition().setType(InterfaceType.SINGLE_TAB); + } + PacketRepository.send(WindowsPane.class, new WindowsPaneContext(player, windowsPane.getId(), type)); + windowsPane.open(player); + } + + /** + * Opens a component. + * + * @param componentId + * The component id. + * @return The opened component. + */ + public Component openComponent(int componentId) { + return open(new Component(componentId)); + } + + /** + * Opens a component. + * @param component The component to open. + * @return The opened component. + */ + public Component open(Component component) { + if (!close()) { + return null; + } + component.open(player); + return opened = component; + } + + /** + * Checks if a main interface. + * @return {@code True} if so. + */ + public boolean isOpened() { + return opened != null; + } + + /** + * Checks if the player has a chat box interface opened (disregarding default chat box). + * @return {@code True} if so. + */ + public boolean hasChatbox() { + return chatbox != null && chatbox.getId() != DEFAULT_CHATBOX; + } + + /** + * Safely closes the currently opened interface. + */ + public boolean close() { + if (player.getAttribute("runscript", null) != null) { + player.removeAttribute("runscript"); + player.getPacketDispatch().sendRunScript(101, ""); + } + if (opened != null && opened.close(player)) { + if (opened != null && (!opened.getDefinition().isWalkable() || opened.getId() == 14)) { + PacketRepository.send(CloseInterface.class, new InterfaceContext(player, opened.getDefinition().getWindowPaneId(isResizable()), opened.getDefinition().getChildId(isResizable()), opened.getId(), opened.getDefinition().isWalkable())); + } + opened = null; + } + return opened == null; + } + + /** + * Checks if the current interface is walkable. + * @return True if so. + */ + public boolean isWalkable() { + if (opened != null) { + if (opened.getId() == OBJDIALOG_389) { + return false; + } + if (opened.getDefinition().isWalkable()) { + return true; + } + } + return true; + } + + /** + * Safely closes the component. + * @param component The component. + * @return {@code True} if the component successfully closed. + */ + public boolean close(Component component) { + if (component.close(player)) { + if (component.getId() == DEFAULT_CHATBOX) { + return true; + } + if (component.getDefinition().getType() == InterfaceType.TAB) { + PacketRepository.send(CloseInterface.class, new InterfaceContext(player, component.getDefinition().getWindowPaneId(isResizable()), component.getDefinition().getChildId(isResizable()) + component.getDefinition().getTabIndex(), component.getId(), component.getDefinition().isWalkable())); + return true; + } + PacketRepository.send(CloseInterface.class, new InterfaceContext(player, component.getDefinition().getWindowPaneId(isResizable()), component.getDefinition().getChildId(isResizable()), component.getId(), component.getDefinition().isWalkable())); + return true; + } + return false; + } + + /** + * Closes the chatbox interface. + */ + public void closeChatbox() { + if (chatbox != null && chatbox.getId() != DEFAULT_CHATBOX) { + if (close(chatbox)) { + openChatbox(DEFAULT_CHATBOX); + player.getPacketDispatch().sendRunScript(101, ""); + } + } + } + + /** + * Opens a tab and removes the other tabs. + * @param component The component to open. + * @return The component. + */ + public Component openSingleTab(Component component) { + if (component.getDefinition().getType() != InterfaceType.SINGLE_TAB) { + SystemLogger.logErr("Set interface type to SINGLE_TAB for component " + component.getId() + ", definition requires updating!"); + component.getDefinition().setType(InterfaceType.SINGLE_TAB); + } + component.open(player); + if (component.getCloseEvent() == null) { + component.setCloseEvent((player, c) -> { +// openDefaultTabs(); + return true; + }); + } + return singleTab = component; + } + + /** + * Closes the current single tab opened. + */ + public boolean closeSingleTab() { + if (singleTab != null && close(singleTab)) { + singleTab = null; + } + return true; + } + + /** + * Gets the currently opened single tab. + * @return The tab opened. + */ + public Component getSingleTab() { + return singleTab; + } + + /** + * Hides the tabs. + * @param tabs The tab indexes. + */ + public void hideTabs(int... tabs) { + if (true) { + removeTabs(tabs); + return; + } + @SuppressWarnings("unused") + boolean changeViewedTab = false; + for (int slot : tabs) { + if (slot == currentTabIndex) { + changeViewedTab = true; + } + Component tab = this.tabs[slot]; + if (tab != null && !tab.isHidden()) { + int child = (slot < 7 ? 38 : 13) + slot; + boolean resize = isResizable(); + player.getPacketDispatch().sendInterfaceConfig(getWindowPaneId(), child, true); + player.getPacketDispatch().sendInterfaceConfig(getWindowPaneId(), child + 7, true); + tab.setHidden(true); + } + } + if (changeViewedTab) { + int currentIndex = -1; + if (this.tabs[3] == null) { + for (int i = 0; i < this.tabs.length; i++) { + if (this.tabs[i] != null) { + currentIndex = i; + break; + } + } + } else { + currentIndex = 3; + } + if (currentIndex > -1) { + setViewedTab(currentIndex); + } + } + } + + /** + * Removes the tabs. + * @param tabs The tab indexes. + */ + @Deprecated + public void removeTabs(int... tabs) { + boolean changeViewedTab = false; + for (int slot : tabs) { + if (slot == currentTabIndex) { + changeViewedTab = true; + } + Component tab = this.tabs[slot]; + if (tab != null) { + close(tab); + this.tabs[slot] = null; + } + } + if (changeViewedTab) { + int currentIndex = -1; + if (this.tabs[3] == null) { + for (int i = 0; i < this.tabs.length; i++) { + if (this.tabs[i] != null) { + currentIndex = i; + break; + } + } + } else { + currentIndex = 3; + } + if (currentIndex > -1) { + setViewedTab(currentIndex); + } + } + } + + /** + * Restores the tabs. + */ + public void restoreTabs() { + for (int i = 0; i < tabs.length; i++) { + Component tab = tabs[i]; + if (tab == null) { + switch (i) { + case 0: + WeaponInterface inter = player.getExtension(WeaponInterface.class); + if (inter == null) { + player.addExtension(WeaponInterface.class, inter = new WeaponInterface(player)); + } + openTab(0, inter); + break; + case 6: + openTab(6, new Component(player.getSpellBookManager().getSpellBook())); // Magic + break; + case 7: + if (player.getFamiliarManager().hasFamiliar()) { + openTab(7, new Component(662)); + } + break; + default: + openTab(i, new Component(DEFAULT_TABS[i])); + } + } + else if (tab.isHidden()) { + int child = (i < 7 ? 38 : 13) + i; +// boolean resize = isResizable(); //TODO: + player.getPacketDispatch().sendInterfaceConfig(getWindowPaneId(), child, false); + player.getPacketDispatch().sendInterfaceConfig(getWindowPaneId(), child + 7, false); + tabs[i].setHidden(false); + } + } + } + + /** + * Opens the default tabs. + */ + public void openDefaultTabs() { + // player.getPacketDispatch().sendInterfaceConfig(548, 51, false); + WeaponInterface inter = player.getExtension(WeaponInterface.class); + if (inter == null) { + player.addExtension(WeaponInterface.class, inter = new WeaponInterface(player)); + } + //sendTab(16, 747); // Summoning bar + openTab(0, inter); // Attack + openTab(1, new Component(STATS_320)); // Skills + openTab(2, new Component(QUESTJOURNAL_V2_274)); // Quest + openTab(3, new Component(INVENTORY_149)); // inventory + openTab(4, new Component(WORNITEMS_387)); // Equipment + openTab(5, new Component(PRAYER_271)); // Prayer + openTab(6, new Component(player.getSpellBookManager().getSpellBook())); // Magic + if (player.getFamiliarManager().hasFamiliar()) { + openTab(7, new Component(LORE_STATS_SIDE_662)); // summoning. + } + openTab(8, new Component(FRIENDS2_550)); // Friends + openTab(9, new Component(IGNORE2_551)); // Ignores + openTab(10, new Component(CLANJOIN_589)); // Clan chat + openTab(11, new Component(OPTIONS_261)); // Settings + openTab(12, new Component(EMOTES_464)); // Emotes + openTab(13, new Component(MUSIC_V3_187)); // Music + openTab(14, new Component(LOGOUT_182)); // Logout + if (player.getProperties().getAutocastSpell() != null) { + inter.selectAutoSpell(inter.getAutospellId(player.getProperties().getAutocastSpell().getSpellId()), true); + } + } + + /** + * Opens the information bars (orbs). + */ + public void openInfoBars() { + //Hp orb + PacketRepository.send(Interface.class, new InterfaceContext(player, getWindowPaneId(), isResizable() ? 13 : 70, TOPSTAT_HITPOINTS_748, true)); + //Prayer orb + PacketRepository.send(Interface.class, new InterfaceContext(player, getWindowPaneId(), isResizable() ? 14 : 71, TOPSTAT_PRAYER_749, true)); + //Energy orb + PacketRepository.send(Interface.class, new InterfaceContext(player, getWindowPaneId(), isResizable() ? 15 : 72, TOPSTAT_RUN_750, true)); + //Summoning bar + PacketRepository.send(Interface.class, new InterfaceContext(player, getWindowPaneId(), isResizable() ? 16 : 73, TOPSTAT_LORE_747, true)); + //Split PM + PacketRepository.send(Interface.class, new InterfaceContext(player, getWindowPaneId(), isResizable() ? 71 : 10, PMCHAT_754, true)); + } + + /** + * Closes the default tabs. + */ + public void closeDefaultTabs() { + WeaponInterface inter = player.getExtension(WeaponInterface.class); + if (inter != null) { + close(inter); // Attack + } + close(new Component(STATS_320)); // Skills + close(new Component(QUESTJOURNAL_V2_274)); // Quest + close(new Component(AREA_TASK_259)); // Diary + close(new Component(INVENTORY_149)); // inventory + close(new Component(WORNITEMS_387)); // Equipment + close(new Component(PRAYER_271)); // Prayer + close(new Component(player.getSpellBookManager().getSpellBook())); + close(new Component(LORE_STATS_SIDE_662)); // summoning. + close(new Component(FRIENDS2_550)); // Friends + close(new Component(IGNORE2_551)); // Ignores + close(new Component(CLANJOIN_589)); // Clan chat + close(new Component(OPTIONS_261)); // Settings + close(new Component(EMOTES_464)); // Emotes + close(new Component(MUSIC_V3_187)); // Music + close(new Component(LOGOUT_182)); // Logout + } + + /** + * Opens a tab. + * @param slot The tab slot; + * @param component The component. + */ + public void openTab(int slot, Component component) { + if (component.getId() == WEAPON_FISTS_SEL_92 && !(component instanceof WeaponInterface)) { + throw new IllegalStateException("Attack tab can only be instanced as " + WeaponInterface.class.getCanonicalName() + "!"); + } + if (component.getDefinition().getTabIndex() != slot) { + SystemLogger.logErr("Set tab index to " + slot + " for component " + component.getId() + ", definition requires updating!"); + component.getDefinition().setTabIndex(slot); + } + if (component.getDefinition().getType() != InterfaceType.TAB) { + SystemLogger.logErr("Set interface type to TAB for component " + component.getId() + ", definition requires updating!"); + component.getDefinition().setType(InterfaceType.TAB); + } + component.open(player); + tabs[slot] = component; + } + + /** + * Opens a tab. + * @param component The component to open. + */ + public void openTab(Component component) { + if (component.getDefinition().getTabIndex() < 0) { + SystemLogger.logErr("No component definitions found for tab " + component.getId() + "!"); + return; + } + openTab(component.getDefinition().getTabIndex(), component); + } + + /** + * Opens a chat box interface. + * @param componentId The component id. + */ + public void openChatbox(int componentId) { + openChatbox(new Component(componentId)); + } + + /** + * Opens a chat box interface. + * @param component The component to open. + */ + public void openChatbox(Component component) { + if (component.getId() == DEFAULT_CHATBOX) { + if (chatbox == null || (chatbox.getId() != DEFAULT_CHATBOX && chatbox.getDefinition().getType() == InterfaceType.CHATBOX)) { + PacketRepository.send(Interface.class, new InterfaceContext(player, getWindowPaneId(), isResizable() ? 23 : 14, FILTERBUTTONS_751, true)); + PacketRepository.send(Interface.class, new InterfaceContext(player, getWindowPaneId(), isResizable() ? 70 : 75, CHATTOP_752, true)); + PacketRepository.send(Interface.class, new InterfaceContext(player, InterfaceType.CHATBOX.getFixedPaneId(), InterfaceType.CHATBOX.getFixedChildId(), CHATDEFAULT_137, true)); + } + chatbox = component; + player.getConfigManager().set(334, 1); + } else { + chatbox = component; + if (chatbox.getDefinition().getType() != InterfaceType.DIALOGUE && chatbox.getDefinition().getType() != InterfaceType.CHATBOX && chatbox.getDefinition().getType() != InterfaceType.CS_CHATBOX) { + SystemLogger.logErr("Set interface type to CHATBOX for component " + component.getId() + ", definition requires updating!"); + chatbox.getDefinition().setType(InterfaceType.DIALOGUE); + } + chatbox.open(player); + } + if (TutorialSession.getExtension(player).getStage() < TutorialSession.MAX_STAGE) { + Component.setUnclosable(player, getChatbox()); + } + } + + /** + * Switches the player's window mode (fixed, resizable, fullscreen). + * @param windowMode The window mode. + */ + public void switchWindowMode(int windowMode) { + if (windowMode != player.getSession().getClientInfo().getWindowMode()) { + player.getSession().getClientInfo().setWindowMode(windowMode); + openWindowsPane(new Component(isResizable() ? TOPLEVEL_FULLSCREEN_746 : TOPLEVEL_548)); + openDefaultTabs(); + openInfoBars(); + PacketRepository.send(Interface.class, new InterfaceContext(player, getWindowPaneId(), isResizable() ? 23 : 14, FILTERBUTTONS_751, true)); + PacketRepository.send(Interface.class, new InterfaceContext(player, getWindowPaneId(), isResizable() ? 70 : 75, CHATTOP_752, true)); + } + } + + /** + * Gets the component for the given component id. + * @param componentId The component id. + * @return The component. + */ + public Component getComponent(int componentId) { + if (opened != null && opened.getId() == componentId) { + return opened; + } + if (chatbox != null && chatbox.getId() == componentId) { + return chatbox; + } + if (singleTab != null && singleTab.getId() == componentId) { + return singleTab; + } + if (overlay != null && overlay.getId() == componentId) { + return overlay; + } + if (windowsPane.getId() == componentId) { + return windowsPane; + } + for (Component c : tabs) { + if (c != null && c.getId() == componentId) { + return c; + } + } + if (componentId == FILTERBUTTONS_751 || componentId == TOPSTAT_RUN_750 || componentId == TOPSTAT_LORE_747) { + //Chatbox settings, run orb & summoning orb. + return new Component(componentId); + } + return null; + } + + /** + * Sets the currently viewed tab. + * @param tabIndex The tab index. + */ + public void setViewedTab(int tabIndex) { + if (tabs[tabIndex] == null) { + throw new IllegalStateException("Tab at index " + tabIndex + " is null!"); + } + currentTabIndex = tabIndex; + switch (tabIndex) { + case 0: + tabIndex = 1; + break; + case 1: + tabIndex = 2; + break; + case 2: + tabIndex = 3; + break; + } + if (tabIndex > 9) { + tabIndex--; + } + player.getPacketDispatch().sendRunScript(115, "i", tabIndex); + } + + /** + * Checks if the main component opened matches the given component id. + * @param id The component id. + * @return {@code True} if so. + */ + public boolean hasMainComponent(int id) { + return opened != null && opened.getId() == id; + } + + /** + * Opens an overlay. + * @param component The component. + */ + public void openOverlay(Component component) { + if (overlay != null && !overlay.close(player)) { + return; + } + overlay = component; + if (overlay.getDefinition().getType() != InterfaceType.OVERLAY) { + SystemLogger.logErr("Set interface type to OVERLAY for component " + component.getId() + ", definition requires updating!"); + overlay.getDefinition().setType(InterfaceType.OVERLAY); + overlay.getDefinition().setWalkable(true); + } + overlay.open(player); + } + + /** + * Opens the wilderness overlay. + * @param component The component. + */ + public void openWildernessOverlay(Component component) { + if (wildyOverlay != null && !wildyOverlay.close(player)) { + return; + } + wildyOverlay = component; + if (wildyOverlay.getDefinition().getType() != InterfaceType.WILDERNESS_OVERLAY) { + SystemLogger.logErr("Set interface type to WILDERNESS_OVERLAY for component " + component.getId() + ", definition requires updating!"); + wildyOverlay.getDefinition().setType(InterfaceType.WILDERNESS_OVERLAY); + wildyOverlay.getDefinition().setWalkable(true); + } + wildyOverlay.open(player); + } + + /** + * Closes the current overlay. + */ + public void closeOverlay() { + if (overlay != null && close(overlay)) { + overlay = null; + } + } + + /** + * Gets the weapon tab interface. + * @return The weapon interface. + */ + public WeaponInterface getWeaponTab() { + return player.getExtension(WeaponInterface.class); + } + + /** + * Gets the opened. + * @return The opened. + */ + public Component getOpened() { + return opened; + } + + /** + * Sets the opened. + * @param opened The opened to set. + */ + public void setOpened(Component opened) { + this.opened = opened; + } + + /** + * Gets the tabs. + * @return The tabs. + */ + public Component[] getTabs() { + return tabs; + } + + /** + * Sets the tabs. + * @param tabs The tabs to set. + */ + public void setTabs(Component[] tabs) { + this.tabs = tabs; + } + + /** + * Gets the chatbox. + * @return The chatbox. + */ + public Component getChatbox() { + return chatbox; + } + + /** + * Sets the chatbox. + * @param chatbox The chatbox to set. + */ + public void setChatbox(Component chatbox) { + this.chatbox = chatbox; + } + + /** + * Gets the overlay. + * @return The overlay. + */ + public Component getOverlay() { + return overlay; + } + + /** + * Sets the overlay. + * @param overlay The overlay to set. + */ + public void setOverlay(Component overlay) { + this.overlay = overlay; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the currentTabIndex. + * @return The currentTabIndex. + */ + public int getCurrentTabIndex() { + return currentTabIndex; + } + + /** + * Sets the currentTabIndex. + * @param currentTabIndex The currentTabIndex to set. + */ + public void setCurrentTabIndex(int currentTabIndex) { + this.currentTabIndex = currentTabIndex; + } + + /** + * Gets the windowsPane. + * @return The windowsPane. + */ + public Component getWindowsPane() { + return windowsPane; + } + + /** + * Gets the windows pane id. + * @return The window pane id. + */ + public int getWindowPaneId() { + if (windowsPane == null) { + return TOPLEVEL_548; + } + return windowsPane.getId(); + } + + /** + * Gets the default child id. + * @return The default child id. + */ + public int getDefaultChildId() { + return isResizable() ? 6 : 11; + } + + /** + * Checks if the player's client is resizable. + * @return {@code True} if so. + */ + public boolean isResizable() { + if (player.getSession().getClientInfo() == null) { + return false; + } + return player.getSession().getClientInfo().isResizable(); + } + + /** + * Gets the amount of times an interface related packet was sent, then increments it. + * @param increment The amount to increment the counter with. + * @return The amount of times an interface packet was sent. + */ + public int getPacketCount(int increment) { + int count = packetCount; + packetCount += increment; + return count; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/IronmanManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/IronmanManager.java new file mode 100644 index 000000000..084ab2400 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/IronmanManager.java @@ -0,0 +1,108 @@ +package core.game.node.entity.player.link; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; + +import java.nio.ByteBuffer; + +/** + * Manages the iron man mode of an account. + * @author Vexia + * + */ +public class IronmanManager implements SavingModule { + + /** + * The player instance. + */ + private final Player player; + + /** + * The iron man mode. + */ + private IronmanMode mode = IronmanMode.NONE; + + /** + * Constructs a new {@code IronmanManager} {@code Object} + * @param player the player. + */ + public IronmanManager(Player player) { + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + if (mode != IronmanMode.NONE) { + buffer.put((byte) 1); + buffer.put((byte) mode.ordinal()); + } + buffer.put((byte) 0); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + mode = IronmanMode.values()[buffer.get()]; + break; + case 2: //Indicates permanent. + break; + } + } + } + + /** + * Checks the restriction. + * @return {@code True} if so. + */ + public boolean checkRestriction() { + return checkRestriction(IronmanMode.STANDARD); + } + + /** + * Checks the restriction. + * @return {@code True} if so. + */ + public boolean checkRestriction(IronmanMode mode) { + if (isIronman() && this.mode.ordinal() >= mode.ordinal()) { + player.sendMessage("You can't do that as an Ironman."); + return true; + } + return false; + } + + /** + * Checks if the player is an ironman. + * @return {@code True} if one. + */ + public boolean isIronman() { + return mode != IronmanMode.NONE; + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the mode. + * @return the mode + */ + public IronmanMode getMode() { + return mode; + } + + /** + * Sets the mode. + * @param mode the mode to set. + */ + public void setMode(IronmanMode mode) { + this.mode = mode; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/IronmanMode.java b/Server/src/main/java/Server/core/game/node/entity/player/link/IronmanMode.java new file mode 100644 index 000000000..2573b3fe4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/IronmanMode.java @@ -0,0 +1,32 @@ +package core.game.node.entity.player.link; + +/** + * A type of iron man mode. + * @author Vexia + */ +public enum IronmanMode { + // HARDCORE_DEAD has to be before Ultimate so that it does not adopt it's restrictions (on the basis of >= in IronmanManager.java?) + NONE(-1), STANDARD(5), HARDCORE(6), ULTIMATE(7); + + /** + * The icon id. + */ + private final int icon; + + /** + * Constructs a new {@code IronmanMode} {@code Object} + * @param icon the icon. + */ + private IronmanMode(int icon) { + this.icon = icon; + } + + /** + * Gets the icon. + * @return the icon + */ + public int getIcon() { + return icon; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/PacketDispatch.java b/Server/src/main/java/Server/core/game/node/entity/player/link/PacketDispatch.java new file mode 100644 index 000000000..647abaca4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/PacketDispatch.java @@ -0,0 +1,415 @@ +package core.game.node.entity.player.link; + +import core.game.Varp; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.chunk.AnimateObjectUpdateFlag; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.game.world.update.flag.player.AnimationFlag; +import core.game.world.update.flag.player.GraphicFlag; +import core.net.packet.PacketRepository; +import core.net.packet.context.*; +import core.net.packet.context.DisplayModelContext.ModelType; +import core.net.packet.out.*; + +/** + * Represents the class used to dispatching packets. + * @author Emperor + * @author Vexia + */ +public final class PacketDispatch { + + /** + * The instance of the {@code Player}. + */ + private final Player player; + + /** + * The player context. + */ + private final PlayerContext context; + + /** + * Constructs a new {@code PacketDispatch} {@code Object}. + * @param player the player. + */ + public PacketDispatch(Player player) { + this.player = player; + this.context = new PlayerContext(player); + } + + public void sendVarp(Varp varp){ + PacketRepository.send(Config.class, new ConfigContext(player, varp.getIndex(), varp.getValue())); + } + + /** + * Send a game message. + * @param message The game message. + */ + public void sendMessage(String message) { + if (message == null || TutorialSession.getExtension(player).getStage() < TutorialSession.MAX_STAGE) { + return; + } + if (player.getAttribute("chat_filter") != null && !message.contains("") && !message.contains("")) { + return; + } + if (message.length() > 255) { + SystemLogger.logErr("Message length out of bounds (" + message + ")!"); + message = message.substring(0, 255); + } + PacketRepository.send(GameMessage.class, new GameMessageContext(player, message)); + } + + /** + * Sends game messages. + * @param messages the messages. + */ + public void sendMessages(final String... messages) { + for (String message : messages) { + sendMessage(message); + } + } + + /** + * Method used to send a game message on a tick. + * @param message the message. + * @param ticks the ticks. + */ + public void sendMessage(final String message, int ticks) { + GameWorld.getPulser().submit(new Pulse(ticks, player) { + @Override + public boolean pulse() { + sendMessage(message); + return true; + } + }); + } + + /** + * Send a access mask. + * @param id The access mask id. + * @param childId The access mask child id. + * @param interfaceId The access mask interface Id. + * @param offset The access mask off set. + * @param length The access mask length. + */ + public void sendAccessMask(int id, int childId, int interfaceId, int offset, int length) { + PacketRepository.send(AccessMask.class, new AccessMaskContext(player, id, childId, interfaceId, offset, length)); + } + + /** + * Send a windowns pane. + * @param windowId The windows pane id. + * @param type The windowns pane type. + */ + public void sendWindowsPane(int windowId, int type) { + PacketRepository.send(WindowsPane.class, new WindowsPaneContext(player, windowId, type)); + } + + /** + * sends the system update packet. + * @param time the amount of time. + */ + public void sendSystemUpdate(int time) { + PacketRepository.send(SystemUpdatePacket.class, new SystemUpdateContext(player, time)); + } + + /** + * Sends music packet. + * @param musicId The music id. + */ + public void sendMusic(int musicId) { + PacketRepository.send(MusicPacket.class, new MusicContext(player, musicId)); + } + + /** + * Sends the temporary music packet. + * @param musicId The music id. + */ + public void sendTempMusic(int musicId) { + PacketRepository.send(MusicPacket.class, new MusicContext(player, musicId, true)); + } + + /** + * Sends a client script config to the player. + * @param id The id to set. + * @param value The value of the config. + */ + public void sendScriptConfig(int id, int value, String types, Object... parameters) { + PacketRepository.send(CSConfigPacket.class, new CSConfigContext(player, id, value, types, parameters)); + } + + /** + * Send a run script. + * @param id The run script id. + * @param string The run script string. + * @param objects The run scripts objects. + */ + public void sendRunScript(int id, String string, Object... objects) { + PacketRepository.send(RunScriptPacket.class, new RunScriptContext(player, id, string, objects)); + } + + /** + * Send a StringPacket. + * @param string The string. + * @param interfaceId The interface id. + * @param lineId The line id. + */ + public void sendString(String string, int interfaceId, int lineId) { + PacketRepository.send(StringPacket.class, new StringContext(player, string, interfaceId, lineId)); + } + + /** + * Send a update packet for the amount of run energy. + */ + public void sendRunEnergy() { + PacketRepository.send(RunEnergy.class, getContext()); + } + + /** + * Send the logout packet. + */ + public void sendLogout() { + PacketRepository.send(Logout.class, getContext()); + } + + /** + * Send the interface animation packet. + * @param animationId The animation id. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public void sendAnimationInterface(int animationId, int interfaceId, int childId) { + PacketRepository.send(AnimateInterface.class, new AnimateInterfaceContext(player, animationId, interfaceId, childId)); + } + + /** + * Send the player on interface packet. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public void sendPlayerOnInterface(int interfaceId, int childId) { + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, interfaceId, childId)); + } + + /** + * Send the non-player character on interface packet. + * @param npcId The non-player character's id. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public void sendNpcOnInterface(int npcId, int interfaceId, int childId) { + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, npcId, interfaceId, childId)); + } + + public void sendModelOnInterface(int modelID, int interfaceId, int childId, int zoom){ + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.MODEL, modelID,zoom,interfaceId,childId,new Object())); + } + + /** + * Send the item on interface packet. + * @param itemId The item id. + * @param amount The item amount. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public void sendItemOnInterface(int itemId, int amount, int interfaceId, int childId) { + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.ITEM, itemId, amount, interfaceId, childId)); + } + + /** + * Send the item on interface packet. + * @param itemId The item id. + * @param zoom the zoom. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public void sendItemZoomOnInterface(int itemId, int zoom, int interfaceId, int childId) { + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.ITEM, itemId, zoom, interfaceId, childId, zoom)); + } + + public void sendInterSetItemsOptionsScript(int interfaceId, int componentId, int key, int width, int height, String... options) { + sendInterSetItemsOptionsScript(interfaceId, componentId, key, false, width, height, options); + } + + public void sendInterSetItemsOptionsScript(int interfaceId, int componentId, int key, boolean negativeKey, int width, int height, String... options) { + Object[] parameters = new Object[6 + options.length]; + int index = 0; + for (int count = options.length - 1; count >= 0; count--) + parameters[index++] = options[count]; + parameters[index++] = -1; // dunno but always this + parameters[index++] = 0;// dunno but always this, maybe startslot? + parameters[index++] = height; + parameters[index++] = width; + parameters[index++] = key; + parameters[index++] = interfaceId << 16 | componentId; + sendRunScript(negativeKey ? 695 : 150, parameters); + // name says*/ + } + public void sendRunScript(int scriptId, Object... params) { + String parameterTypes = ""; + if (params != null) { + for (int count = params.length - 1; count >= 0; count--) { + if (params[count] instanceof String) + parameterTypes += "s"; // string + else + parameterTypes += "i"; // integer + } + } + sendRunScript(scriptId, parameterTypes, params); + } + + + /** + * Send the item on interface packet. + * @param itemId The item id. + * @param amount The amount. + * @param zoom the zoom. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public void sendItemZoomOnInterface(int itemId, int amount, int zoom, int interfaceId, int childId) { + PacketRepository.send(DisplayModel.class, new DisplayModelContext(player, ModelType.ITEM, itemId, amount, interfaceId, childId, zoom)); + } + + /** + * Send the interface config packet. + * @param interfaceId The interface id. + * @param childId The child id. + * @param hide If the component should be hidden. + */ + public void sendInterfaceConfig(int interfaceId, int childId, boolean hide) { + PacketRepository.send(InterfaceConfig.class, new InterfaceConfigContext(player, interfaceId, childId, hide)); + } + + /** + * Send a animation update flag mask. + * @param id The animation id. + */ + public void sendAnimation(int id) { + player.getUpdateMasks().register(new AnimationFlag(new Animation(id))); + } + + /** + * Send a animation update flag mask. + * @param id The animation id. + * @param delay The animation delay. + */ + public void sendAnimation(int id, int delay) { + player.getUpdateMasks().register(new AnimationFlag(new Animation(id, delay))); + } + + /** + * Send a graphic update flag mask. + * @param id The graphic id. + */ + public void sendGraphic(int id) { + player.getUpdateMasks().register(new GraphicFlag(new Graphics(id))); + } + + /** + * Sends the positioned graphic. + * @param id the id. + * @param height the height. + * @param delay the delay. + * @param location the location. + */ + public void sendPositionedGraphic(int id, int height, int delay, Location location) { + PacketRepository.send(PositionedGraphic.class, new PositionedGraphicContext(player, new Graphics(id, height, delay), location)); + } + + /** + * Sends a global graphic. + * @param id the id. + * @param location the location. + */ + public void sendGlobalPositionGraphic(int id, Location location) { + for (Player player : RegionManager.getLocalPlayers(location)) { + player.getPacketDispatch().sendPositionedGraphic(id, 0, 0, location); + } + } + + /** + * Sends the positioned graphic. + * @param graphics the graphics. + * @param location the location. + */ + public void sendPositionedGraphics(Graphics graphics, Location location) { + PacketRepository.send(PositionedGraphic.class, new PositionedGraphicContext(player, graphics, location)); + + } + + /** + * Method used to send an object animation. + * @param object the object. + * @param animation the animation. + */ + public void sendObjectAnimation(GameObject object, Animation animation) { + animation = new Animation(animation.getId(), animation.getDelay(), animation.getPriority()); + animation.setObject(object); + RegionManager.getRegionChunk(object.getLocation()).flag(new AnimateObjectUpdateFlag(animation)); + } + + /** + * Method used to send an object animation. + * @param object the object. + * @param animation the animation. + * @param global if the animation is global or not. + */ + public void sendObjectAnimation(GameObject object, Animation animation, boolean global) { + if (global) { + sendObjectAnimation(object, animation); + return; + } + animation.setObject(object); + PacketRepository.send(AnimateObjectPacket.class, new AnimateObjectContext(player, animation)); + } + + /** + * Send a graphic update flag mask. + * @param id The graphic id. + * @param height The graphic height. + */ + public void sendGraphic(int id, int height) { + player.getUpdateMasks().register(new GraphicFlag(new Graphics(id, height))); + } + public void sendVarClient(int id, int value, boolean cs2) { + PacketRepository.send(Config.class, new ConfigContext(player, id, value, cs2)); + } + + public void sendLeftShiftedVarbit(int varpIndex, int offset, int value){ + player.getConfigManager().set(varpIndex, (value << offset)); + } + + public void sendRightShiftedVarbit(int varpIndex, int offset, int value){ + player.getConfigManager().set(varpIndex, (value >> offset)); + } + + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the context. + * @return The context. + */ + public PlayerContext getContext() { + return context; + } + + public void sendScriptConfigs(int id, int value, String type, Object... params) { + PacketRepository.send(CSConfigPacket.class, new CSConfigContext(player, id, value, type, params)); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/QuestData.java b/Server/src/main/java/Server/core/game/node/entity/player/link/QuestData.java new file mode 100644 index 000000000..27ed665a1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/QuestData.java @@ -0,0 +1,365 @@ +package core.game.node.entity.player.link; + +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.item.Item; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +/** + * Represents the quest data to save. + * @author 'Vexia + */ +public final class QuestData implements SavingModule { + + /** + * Represents the cooks assist attribute array. + */ + private final boolean[] cooksAssistant = new boolean[4]; + + /** + * Represents the demon slayer boolean array. + */ + private final boolean[] demonSlayer = new boolean[2]; + + /** + * Represents the draynor levers for ernest the chicken. + */ + private final boolean[] draynorLever = new boolean[6]; + + /** + * Represents the dragon slayer attribute array. + */ + private final boolean[] dragonSlayer = new boolean[9]; + + /** + * The desert treasure items. + */ + private final Item[] desertTreasure = new Item[7]; + + /** + * Represents the dragon slayer planks. + */ + private int dragonSlayerPlanks; + + /** + * Represents if the gardener has attacked. + */ + private boolean gardenerAttack; + + /** + * Represents if they talked to drezel. + */ + private boolean talkedDrezel; + + private int witchsExperimentStage; + + + private boolean witchsExperimentKilled; + + + /** + * Constructs a new {@code QuestData} {@code Object}. + */ + public QuestData() { + Arrays.fill(draynorLever, true); + populateDesertTreasureNode(); + } + + @Override + public void save(ByteBuffer buffer) { + SavedData.save(buffer, draynorLever, 1); + SavedData.save(buffer, dragonSlayer, 2); + SavedData.save(buffer, (byte) dragonSlayerPlanks, 3); + SavedData.save(buffer, demonSlayer, 4); + SavedData.save(buffer, cooksAssistant, 5); + SavedData.save(buffer, gardenerAttack, 6); + SavedData.save(buffer, talkedDrezel, 7); + saveDesertTreasureNode(buffer); + SavedData.save(buffer, witchsExperimentStage, 9); + SavedData.save(buffer, witchsExperimentKilled, 10); + buffer.put((byte) 0); + } + + public void parse(JSONObject data){ + JSONArray dl = (JSONArray) data.get("draynorLever"); + for(int i = 0; i < dl.size(); i++){ + draynorLever[i] = (boolean) dl.get(i); + } + JSONArray drs = (JSONArray) data.get("dragonSlayer"); + for(int i = 0; i < drs.size(); i++){ + dragonSlayer[i] = (boolean) drs.get(i); + } + dragonSlayerPlanks = Integer.parseInt( data.get("dragonSlayerPlanks").toString()); + JSONArray des = (JSONArray) data.get("demonSlayer"); + for(int i = 0; i < des.size(); i++){ + demonSlayer[i] = (boolean) des.get(i); + } + JSONArray ca = (JSONArray) data.get("cooksAssistant"); + for(int i = 0; i < ca.size(); i++){ + cooksAssistant[i] = (boolean) ca.get(i); + } + gardenerAttack = (boolean) data.get("gardenerAttack"); + talkedDrezel = (boolean) data.get("talkedDrezel"); + JSONArray dtn = (JSONArray) data.get("desertTreasureNode"); + for (int i = 0; i < dtn.size(); i++){ + JSONObject item = (JSONObject) dtn.get(i); + desertTreasure[i] = new Item(Integer.parseInt(item.get("id").toString()), Integer.parseInt(item.get("amount").toString())); + } + witchsExperimentKilled = (boolean) data.get("witchsExperimentKilled"); + witchsExperimentStage = Integer.parseInt( data.get("witchsExperimentStage").toString()); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + for (int i = 0; i < draynorLever.length; i++) { + draynorLever[i] = SavedData.getBoolean(buffer.get()); + } + break; + case 2: + for (int i = 0; i < dragonSlayer.length; i++) { + dragonSlayer[i] = SavedData.getBoolean(buffer.get()); + } + break; + case 3: + dragonSlayerPlanks = buffer.get(); + break; + case 4: + for (int i = 0; i < demonSlayer.length; i++) { + demonSlayer[i] = SavedData.getBoolean(buffer.get()); + } + break; + case 5: + for (int i = 0; i < cooksAssistant.length; i++) { + cooksAssistant[i] = SavedData.getBoolean(buffer.get()); + } + break; + case 6: + gardenerAttack = SavedData.getBoolean(buffer.get()); + break; + case 7: + talkedDrezel = SavedData.getBoolean(buffer.get()); + break; + case 8: + for (int i = 0; i < desertTreasure.length; i++) { + desertTreasure[i] = new Item(buffer.getShort(), buffer.get()); + } + break; + case 9: + witchsExperimentStage = buffer.getInt(); + break; + case 10: + witchsExperimentKilled = SavedData.getBoolean(buffer.get()); + break; + } + } + } + + /** + * Saves the desert treasure node. + * @param buffer The buffer. + */ + private final void saveDesertTreasureNode(ByteBuffer buffer) { + buffer.put((byte) 8); + for (int i = 0; i < desertTreasure.length; i++) { + Item item = desertTreasure[i]; + buffer.putShort((short) item.getId()); + buffer.put((byte) item.getAmount()); + } + } + + /** + * Gets the draynorLever. + * @return The draynorLever. + */ + public boolean[] getDraynorLevers() { + return draynorLever; + } + + /** + * Gets the dragon slayer items. + * @return the dragon slayer. + */ + public boolean[] getDragonSlayerItems() { + return dragonSlayer; + } + + /** + * Gets the value of a inserted dragon slayer item. + * @param name the name. + * @return the value of the item being inserted. + */ + public boolean getDragonSlayerItem(String name) { + return name == "lobster" ? dragonSlayer[0] : name == "wizard" ? dragonSlayer[3] : name == "silk" ? dragonSlayer[2] : name == "bowl" ? dragonSlayer[1] : dragonSlayer[0]; + } + + /** + * Gets the dragon slayer attribute. + * @param name the name. + * @return the value of the attribute. + */ + public boolean getDragonSlayerAttribute(String name) { + return name == "ship" ? dragonSlayer[4] : name == "memorized" ? dragonSlayer[5] : name == "repaired" ? dragonSlayer[6] : name == "ned" ? dragonSlayer[7] : name == "poured" ? dragonSlayer[8] : dragonSlayer[8]; + } + + /** + * Method used to set a dragon slayer attribute. + * @param name the name. + * @param value the value. + */ + public void setDragonSlayerAttribute(String name, boolean value) { + dragonSlayer[(name == "ship" ? 4 : name == "memorized" ? 5 : name == "repaired" ? 6 : name == "ned" ? 7 : name == "poured" ? 8 : 8)] = value; + } + + /** + * Gets the cooks assistant attribute value. + * @param name the name. + * @return the value. + */ + public boolean getCookAssist(String name) { + return name == "milk" ? cooksAssistant[0] : name == "egg" ? cooksAssistant[1] : name == "flour" ? cooksAssistant[2] : name == "gave" ? cooksAssistant[3] : cooksAssistant[3]; + } + + /** + * Method used to set a cooks assistant attribute. + * @param name the name. + * @param value the value. + */ + public void setCooksAssistant(String name, boolean value) { + cooksAssistant[(name == "milk" ? 0 : name == "egg" ? 1 : name == "flour" ? 2 : name == "gave" ? 3 : 3)] = value; + } + + /** + * Gets the dragonSlayerPlanks. + * @return The dragonSlayerPlanks. + */ + public int getDragonSlayerPlanks() { + return dragonSlayerPlanks; + } + + /** + * Sets the dragonSlayerPlanks. + * @param i The dragonSlayerPlanks to set. + */ + public void setDragonSlayerPlanks(int i) { + this.dragonSlayerPlanks = i; + } + + /** + * Gets the demonSlayer. + * @return The demonSlayer. + */ + public boolean[] getDemonSlayer() { + return demonSlayer; + } + + /** + * Gets the cooksAssistant. + * @return The cooksAssistant. + */ + public boolean[] getCooksAssistant() { + return cooksAssistant; + } + + /** + * Gets the gardenerAttack. + * @return The gardenerAttack. + */ + public boolean isGardenerAttack() { + return gardenerAttack; + } + + /** + * Sets the gardenerAttack. + * @param gardenerAttack The gardenerAttack to set. + */ + public void setGardenerAttack(boolean gardenerAttack) { + this.gardenerAttack = gardenerAttack; + } + + /** + * Gets the talkedDrezel. + * @return The talkedDrezel. + */ + public boolean isTalkedDrezel() { + return talkedDrezel; + } + + /** + * Sets the talkedDrezel. + * @param talkedDrezel The talkedDrezel to set. + */ + public void setTalkedDrezel(boolean talkedDrezel) { + this.talkedDrezel = talkedDrezel; + } + + /** + * Populates the desert treasure node. + */ + private final void populateDesertTreasureNode() { + desertTreasure[0] = new Item(1513, 12); + desertTreasure[1] = new Item(592, 10); + desertTreasure[2] = new Item(1775, 6); + desertTreasure[3] = new Item(2353, 6); + desertTreasure[4] = new Item(526, 2); + desertTreasure[5] = new Item(973, 2); + desertTreasure[6] = new Item(565, 1); + } + + /** + * Gets the desert treasure item. + * @param index The index. + * @return The item. + */ + public Item getDesertTreasureItem(int index) { + if (index < 0 || index > desertTreasure.length) { + throw new IndexOutOfBoundsException("Index out of bounds, index can only span from 0 - 6."); + } + return desertTreasure[index]; + } + + /** + * Sets the desert treasure item. + * @param index The index. + * @param item The item to set. + */ + public void setDesertTreasureItem(int index, Item item) { + if (index < 0 || index > desertTreasure.length) { + throw new IndexOutOfBoundsException("Index out of bounds, index can only span from 0 - 6."); + } + desertTreasure[index] = item; + } + + public int getWitchsExperimentStage() { + return witchsExperimentStage; + } + + public void setWitchsExperimentStage(int witchsExperimentStage) { + this.witchsExperimentStage = witchsExperimentStage; + } + public boolean isWitchsExperimentKilled() { + return witchsExperimentKilled; + } + + public void setWitchsExperimentKilled(boolean witchsExperimentKilled) { + this.witchsExperimentKilled = witchsExperimentKilled; + } + + public boolean[] getDraynorLever() { + return draynorLever; + } + + public boolean[] getDragonSlayer() { + return dragonSlayer; + } + + public Item[] getDesertTreasure() { + return desertTreasure; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/RunScript.java b/Server/src/main/java/Server/core/game/node/entity/player/link/RunScript.java new file mode 100644 index 000000000..994e6e94f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/RunScript.java @@ -0,0 +1,57 @@ +package core.game.node.entity.player.link; + +import core.game.node.entity.player.Player; + +/** + * Represents a run script. + * @author Vexia + */ +public abstract class RunScript { + + /** + * The player instance. + */ + protected Player player; + + /** + * The value entered. + */ + protected Object value; + + /** + * Constructs a new {@code RunScript} {@code Object}. + */ + public RunScript() { + /** + * empty. + */ + } + + /** + * Handles the run script. + * @return the return. + */ + public abstract boolean handle(); + + /** + * @return the value. + */ + public Object getValue() { + return value; + } + + /** + * @param value the value to set;. + */ + public void setValue(Object value) { + this.value = value; + } + + /** + * Sets the player. + * @param player the player. + */ + public void setPlayer(Player player) { + this.player = player; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/SavedData.java b/Server/src/main/java/Server/core/game/node/entity/player/link/SavedData.java new file mode 100644 index 000000000..8aa6d0be6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/SavedData.java @@ -0,0 +1,208 @@ +package core.game.node.entity.player.link; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.entity.player.link.spawn.SpawnData; +import core.game.system.SystemLogger; + +import java.nio.ByteBuffer; + +/** + * Represents a managing class of saved data related to ingame interactions, + * such as questing data, npc talking data, etc. + * @author 'Vexia + */ +public class SavedData implements SavingModule { + + /** + * Represents the global data to save. + */ + private final GlobalData globalData = new GlobalData(); + + /** + * Represents the activity data to save. + */ + private final ActivityData activityData = new ActivityData(); + + /** + * Represents the quest data to save. + */ + private final QuestData questData = new QuestData(); + + /** + * The spawn data to save. + */ + private final SpawnData spawnData = new SpawnData(); + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@Code SavedData} {@Code Object} + * @param player the player. + */ + public SavedData(Player player) { + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + buffer.put((byte) 1); + activityData.save(buffer); + buffer.put((byte) 2); + questData.save(buffer); + buffer.put((byte) 3); + globalData.save(buffer); + buffer.put((byte) 5); + spawnData.save(buffer); + buffer.put((byte) 0); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + activityData.parse(buffer); + break; + case 2: + questData.parse(buffer); + break; + case 3: + globalData.parse(buffer); + break; + case 4: + int opcode1; + while ((opcode1 = buffer.get()) != 0) { + switch (opcode1) { + case 1: + buffer.getInt(); + break; + case 2: + buffer.getInt(); + break; + case 3: + buffer.getInt(); + break; + case 4: + buffer.getInt(); + break; + case 5: + buffer.getInt(); + break; + case 6: + buffer.getInt(); + break; + } + } + break; + case 5: + spawnData.parse(buffer); + break; + default: + break; + } + } + } + + /** + * Method used to save an activity var that isn't valued at default. + * @param buffer the buffer. + * @param var the variable to save. + */ + public static final void save(final ByteBuffer buffer, final Object var, final int index) { + if (var instanceof Integer ? (int) var != 0 : var instanceof Double ? (double) var != 0.0 : var instanceof Byte ? (byte) var != 0 : var instanceof Short ? (short) var != 0 : var instanceof Long ? (long) var != 0L : var instanceof Boolean ? (boolean) var != false : var != null) { + buffer.put((byte) index); + if (var instanceof Integer) { + buffer.putInt((int) var); + } else if (var instanceof Byte) { + buffer.put((byte) var); + } else if (var instanceof Short) { + buffer.putShort((short) var); + } else if (var instanceof Long) { + buffer.putLong((long) var); + } else if (var instanceof Boolean) { + buffer.put((byte) 1); + } else if (var instanceof Double) { + buffer.putDouble((double) var); + } else if (var instanceof double[]) { + double[] doubleArray = ((double[]) var); + for (int i = 0; i < doubleArray.length; i++) { + buffer.putDouble(doubleArray[i]); + } + } else if (var instanceof boolean[]) { + boolean[] booleanArray = ((boolean[]) var); + for (int i = 0; i < booleanArray.length; i++) { + buffer.put((byte) (booleanArray[i] ? 1 : 0)); + } + } else if (var instanceof int[]) { + int[] intArray = ((int[]) var); + for (int i = 0; i < intArray.length; i++) { + buffer.putInt(intArray[i]); + } + } + } + } + + /** + * Gets the boolean value. + * @param value the value. + * @return the value. + */ + public static boolean getBoolean(byte value) { + return value == 1; + } + + /** + * Gets the boolean value. + * @param buffer the buffer. + * @return the value. + */ + public static boolean getBoolean(ByteBuffer buffer) { + return getBoolean(buffer.get()); + } + + /** + * Gets the activityData. + * @return The activityData. + */ + public ActivityData getActivityData() { + return activityData; + } + + /** + * Gets the questData. + * @return The questData. + */ + public QuestData getQuestData() { + return questData; + } + + /** + * Gets the globalData. + * @return The globalData. + */ + public GlobalData getGlobalData() { + return globalData; + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the spawnData. + * @return the spawnData + */ + public SpawnData getSpawnData() { + return spawnData; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/Settings.java b/Server/src/main/java/Server/core/game/node/entity/player/link/Settings.java new file mode 100644 index 000000000..0c3640111 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/Settings.java @@ -0,0 +1,686 @@ +package core.game.node.entity.player.link; + +import core.game.system.config.ItemConfigParser; +import org.json.simple.JSONObject; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.communication.CommunicationInfo; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.packet.IoBuffer; + +import java.nio.ByteBuffer; + +/** + * Holds a player's settings. + * @author Emperor + */ +public final class Settings { + + /** + * The player. + */ + private final Player player; + + /** + * The run energy. + */ + private double runEnergy = 100.0; + + /** + * The player's weight. + */ + private double weight; + + /** + * The brightness setting. + */ + private int brightness = 2; + + /** + * The music volume. + */ + private int musicVolume; + + /** + * The sound effects volume. + */ + private int soundEffectVolume; + + /** + * The area sounds volume. + */ + private int areaSoundVolume; + + /** + * If the player has the single mouse button setting enabled. + */ + private boolean singleMouseButton; + + /** + * If the chat effects should be disabled. + */ + private boolean disableChatEffects; + + /** + * If the private chat should be split from public chat. + */ + private boolean splitPrivateChat; + + /** + * If the player has the accept aid setting enabled. + */ + private boolean acceptAid; + + /** + * If the player's run button is toggled. + */ + private boolean runToggled; + + /** + * The public chat setting. + */ + private int publicChatSetting = 0; + + /** + * The private chat setting. + */ + private int privateChatSetting = 0; + + /** + * The clan chat setting. + */ + private int clanChatSetting = 0; + + /** + * The trade setting. + */ + private int tradeSetting = 0; + + /** + * The assist setting. + */ + private int assistSetting = 0; + + /** + * If the special attack is toggled. + */ + private boolean specialToggled; + + /** + * The current special energy the player has left. + */ + private int specialEnergy = 100; + + /** + * The current attack style index. + */ + private int attackStyleIndex = 0; + + /** + * Constructs a new {@code Settings} {@code Object}. + * @param player The player. + */ + public Settings(Player player) { + this.player = player; + } + + /** + * Updates the settings. + */ + public void update() { + player.getConfigManager().set(ConfigurationManager.Configuration.BRIGHTNESS, brightness + 1); + player.getConfigManager().set(ConfigurationManager.Configuration.MUSIC_VOLUME, musicVolume); + player.getConfigManager().set(ConfigurationManager.Configuration.EFFECT_VOLUME, soundEffectVolume); + player.getConfigManager().set(ConfigurationManager.Configuration.SURROUNDING_VOLUME, areaSoundVolume); + player.getConfigManager().set(ConfigurationManager.Configuration.MOUSE_BUTTON, singleMouseButton); + player.getConfigManager().set(ConfigurationManager.Configuration.CHAT_EFFECT, disableChatEffects); + player.getConfigManager().set(ConfigurationManager.Configuration.SPLIT_PRIVATE, splitPrivateChat); + player.getConfigManager().set(ConfigurationManager.Configuration.ACCEPT_AID, acceptAid); + player.getConfigManager().set(ConfigurationManager.Configuration.RETALIATE, !player.getProperties().isRetaliating()); + player.getConfigManager().set(ConfigurationManager.Configuration.RUNNING, runToggled); + player.getConfigManager().set(1054, clanChatSetting); + player.getConfigManager().set(1055, assistSetting); + player.getConfigManager().set(300, specialEnergy * 10); + player.getConfigManager().set(43, attackStyleIndex); + player.getPacketDispatch().sendRunEnergy(); + updateChatSettings(); + Pulse pulse = player.getAttribute("energy-restore", null); + if (pulse == null || !pulse.isRunning()) { + pulse = new Pulse(50, player) { + @Override + public boolean pulse() { + if (specialEnergy < 100) { + int heal = 100 - specialEnergy; + setSpecialEnergy(specialEnergy + (heal > 10 ? 10 : heal)); + } + return false; + } + }; + pulse.setTicksPassed(1); + GameWorld.getPulser().submit(pulse); + player.setAttribute("energy-restore", pulse); + } + } + + /** + * Toggles the attack style index. + * @param index The index. + */ + public void toggleAttackStyleIndex(int index) { + this.attackStyleIndex = index; + player.getConfigManager().set(43, attackStyleIndex); + } + + /** + * Updates the chat settings. + */ + public void updateChatSettings() { + player.getSession().write(new IoBuffer(232).put(publicChatSetting).put(privateChatSetting).put(tradeSetting)); + } + + /** + * Sets the chat settings. + * @param pub The public chat setting. + * @param priv The private chat setting. + * @param trade The trade setting. + */ + public void updateChatSettings(int pub, int priv, int trade) { + boolean update = false; + if (publicChatSetting != pub) { + publicChatSetting = pub; + update = true; + } + if (privateChatSetting != priv) { + privateChatSetting = priv; + update = true; + CommunicationInfo.notifyPlayers(player, privateChatSetting != 2, true); + } + if (tradeSetting != trade) { + tradeSetting = trade; + update = true; + } + if (update) { + updateChatSettings(); + } + } + + /** + * Sets the chat settings. + * @param pub The public chat setting. + * @param priv The private chat setting. + * @param trade The trade setting. + */ + public void setChatSettings(int pub, int priv, int trade) { + publicChatSetting = pub; + privateChatSetting = priv; + tradeSetting = trade; + } + + /** + * Writes the settings on the byte buffer. + * @param buffer The byte buffer. + */ + public void save(ByteBuffer buffer) { + buffer.put((byte) 1).put((byte) brightness).put((byte) musicVolume).put((byte) soundEffectVolume).put((byte) areaSoundVolume).put((byte) (singleMouseButton ? 1 : 0)).put((byte) (disableChatEffects ? 1 : 0)).put((byte) (splitPrivateChat ? 1 : 0)).put((byte) (acceptAid ? 1 : 0)).put((byte) (runToggled ? 1 : 0)).put((byte) publicChatSetting).put((byte) privateChatSetting).put((byte) clanChatSetting).put((byte) tradeSetting).put((byte) assistSetting).put(((byte) runEnergy)); + if (!player.getProperties().isRetaliating()) { + buffer.put((byte) 2); + } + if (specialEnergy != 100) { + buffer.put((byte) 3).put((byte) specialEnergy); + } + if (attackStyleIndex != 0) { + buffer.put((byte) 4).put((byte) attackStyleIndex); + } + buffer.put((byte) 0); + } + + /** + * Parses the settings from the byte buffer. + * @param buffer The byte buffer. + */ + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get() & 0xFF) != 0) { + switch (opcode) { + case 1: + brightness = buffer.get(); + musicVolume = buffer.get(); + soundEffectVolume = buffer.get(); + areaSoundVolume = buffer.get(); + singleMouseButton = buffer.get() == 1; + disableChatEffects = buffer.get() == 1; + splitPrivateChat = buffer.get() == 1; + acceptAid = buffer.get() == 1; + runToggled = buffer.get() == 1; + publicChatSetting = buffer.get(); + privateChatSetting = buffer.get(); + clanChatSetting = buffer.get(); + tradeSetting = buffer.get(); + assistSetting = buffer.get(); + runEnergy = buffer.get(); + break; + case 2: + player.getProperties().setRetaliating(false); + break; + case 3: + specialEnergy = buffer.get() & 0xFF; + break; + case 4: + attackStyleIndex = buffer.get(); + break; + } + } + } + + public void parse(JSONObject settingsData){ + brightness = Integer.parseInt( settingsData.get("brightness").toString()); + musicVolume = Integer.parseInt( settingsData.get("musicVolume").toString()); + soundEffectVolume = Integer.parseInt( settingsData.get("soundEffectVolume").toString()); + areaSoundVolume = Integer.parseInt( settingsData.get("areaSoundVolume").toString()); + singleMouseButton = (boolean) settingsData.get("singleMouse"); + disableChatEffects = (boolean) settingsData.get("disableChatEffects"); + splitPrivateChat = (boolean) settingsData.get("splitPrivate"); + acceptAid = (boolean) settingsData.get("acceptAid"); + runToggled = (boolean) settingsData.get("runToggled"); + publicChatSetting = Integer.parseInt( settingsData.get("publicChatSetting").toString()); + privateChatSetting = Integer.parseInt( settingsData.get("privateChatSetting").toString()); + clanChatSetting = Integer.parseInt( settingsData.get("clanChatSetting").toString()); + tradeSetting = Integer.parseInt( settingsData.get("tradeSetting").toString()); + assistSetting = Integer.parseInt( settingsData.get("assistSetting").toString()); + runEnergy = Double.parseDouble( settingsData.get("runEnergy").toString()); + specialEnergy = Integer.parseInt( settingsData.get("specialEnergy").toString()); + attackStyleIndex = Integer.parseInt( settingsData.get("attackStyle").toString()); + player.getProperties().setRetaliating((boolean) settingsData.get("retaliation")); + } + + /** + * Toggles the special attack bar. + */ + public void toggleSpecialBar() { + setSpecialToggled(!specialToggled); + } + + /** + * Toggles the special attack bar. + * @param enable If the special attack should be enabled. + */ + public void setSpecialToggled(boolean enable) { + specialToggled = !specialToggled; + player.getConfigManager().set(301, specialToggled ? 1 : 0); + } + + /** + * Checks if the special attack bar is toggled. + * @return {@code True} if so. + */ + public boolean isSpecialToggled() { + return specialToggled; + } + + /** + * Drains an amount of special attack energy. + * @param amount The amount to drain. + * @return {@code True} if succesful, {@code false} if the special attack + * energy amount hasn't changed after calling this method. + */ + public boolean drainSpecial(int amount) { + if (!specialToggled) { + return false; + } + setSpecialToggled(false); + if (amount > specialEnergy) { + player.getPacketDispatch().sendMessage("You do not have enough special attack energy left."); + return false; + } + setSpecialEnergy(specialEnergy - amount); + return true; + } + + /** + * Sets the special energy amount. + * @param value The amount to set. + */ + public void setSpecialEnergy(int value) { + specialEnergy = value; + player.getConfigManager().set(300, specialEnergy * 10); + } + + /** + * Gets the amount of special energy left. + * @return The amount of energy. + */ + public int getSpecialEnergy() { + return specialEnergy; + } + + /** + * Toggles the retaliating button. + */ + public void toggleRetaliating() { + player.getProperties().setRetaliating(!player.getProperties().isRetaliating()); + player.getConfigManager().set(172, !player.getProperties().isRetaliating() ? 1 : 0); + } + + /** + * Toggles the singleMouseButton. + */ + public void toggleMouseButton() { + singleMouseButton = !singleMouseButton; + player.getConfigManager().set(170, singleMouseButton ? 1 : 0); + } + + /** + * Toggles the disableChatEffects. + */ + public void toggleChatEffects() { + disableChatEffects = !disableChatEffects; + player.getConfigManager().set(171, disableChatEffects ? 1 : 0); + } + + /** + * Toggles the splitPrivateChat. + */ + public void toggleSplitPrivateChat() { + splitPrivateChat = !splitPrivateChat; + player.getConfigManager().set(287, splitPrivateChat ? 1 : 0); + } + + /** + * Toggles the acceptAid. + */ + public void toggleAcceptAid() { + acceptAid = !acceptAid; + player.getConfigManager().set(427, acceptAid ? 1 : 0); + } + + /** + * Toggles the run button. + */ + public void toggleRun() { + setRunToggled(!runToggled); + } + + /** + * Toggles the run button. + * If the run button should be enabled. + */ + public void setRunToggled(boolean enabled) { + runToggled = enabled; + player.getConfigManager().set(173, runToggled ? 1 : 0); + } + + /** + * Decreases the run energy with the given amount (drain parameter).
To + * increase, use a negative drain value. + * @param drain The drain amount. + */ + public void updateRunEnergy(double drain) { + runEnergy -= drain; + if (runEnergy < 0) { + runEnergy = 0.0; + } else if (runEnergy > 100) { + runEnergy = 100.0; + } + player.getPacketDispatch().sendRunEnergy(); + } + + /** + * Updates the weight. + */ + public void updateWeight() { + weight = 0.0; + for (int i = 0; i < 28; i++) { + Item item = player.getInventory().get(i); + if (item == null) { + continue; + } + double value = item.getDefinition().getConfiguration(ItemConfigParser.WEIGHT, 0.0); + if (value > 0) { + weight += value; + } + } + for (int i = 0; i < 11; i++) { + Item item = player.getEquipment().get(i); + if (item == null) { + continue; + } + weight += item.getDefinition().getConfiguration(ItemConfigParser.WEIGHT, 0.0); + } + } + + /** + * Gets the weight. + * @return The weight. + */ + public double getWeight() { + return weight; + } + + /** + * Gets the brightness. + * @return The brightness. + */ + public int getBrightness() { + return brightness; + } + + /** + * Sets the brightness. + * @param brightness The brightness to set. + */ + public void setBrightness(int brightness) { + this.brightness = brightness; + player.getConfigManager().set(166, brightness + 1); + } + + /** + * Gets the musicVolume. + * @return The musicVolume. + */ + public int getMusicVolume() { + return musicVolume; + } + + /** + * Sets the musicVolume. + * @param musicVolume The musicVolume to set. + */ + public void setMusicVolume(int musicVolume) { + this.musicVolume = musicVolume; + player.getConfigManager().set(168, musicVolume); + } + + /** + * Gets the soundEffectVolume. + * @return The soundEffectVolume. + */ + public int getSoundEffectVolume() { + return soundEffectVolume; + } + + /** + * Sets the soundEffectVolume. + * @param soundEffectVolume The soundEffectVolume to set. + */ + public void setSoundEffectVolume(int soundEffectVolume) { + this.soundEffectVolume = soundEffectVolume; + player.getConfigManager().set(169, soundEffectVolume); + } + + /** + * Gets the areaSoundVolume. + * @return The areaSoundVolume. + */ + public int getAreaSoundVolume() { + return areaSoundVolume; + } + + /** + * Sets the areaSoundVolume. + * @param areaSoundVolume The areaSoundVolume to set. + */ + public void setAreaSoundVolume(int areaSoundVolume) { + this.areaSoundVolume = areaSoundVolume; + player.getConfigManager().set(872, areaSoundVolume); + } + + /** + * Gets the singleMouseButton. + * @return The singleMouseButton. + */ + public boolean isSingleMouseButton() { + return singleMouseButton; + } + + /** + * Gets the disableChatEffects. + * @return The disableChatEffects. + */ + public boolean isDisableChatEffects() { + return disableChatEffects; + } + + /** + * Gets the splitPrivateChat. + * @return The splitPrivateChat. + */ + public boolean isSplitPrivateChat() { + return splitPrivateChat; + } + + /** + * Gets the acceptAid. + * @return The acceptAid. + */ + public boolean isAcceptAid() { + if (player.getIronmanManager().isIronman()) { + return false; + } + return acceptAid; + } + + /** + * Gets the runToggled. + * @return The runToggled. + */ + public boolean isRunToggled() { + return runToggled; + } + + /** + * Gets the publicChatSetting. + * @return The publicChatSetting. + */ + public int getPublicChatSetting() { + return publicChatSetting; + } + + /** + * Sets the publicChatSetting. + * @param publicChatSetting The publicChatSetting to set. + */ + public void setPublicChatSetting(int publicChatSetting) { + this.publicChatSetting = publicChatSetting; + updateChatSettings(); + } + + /** + * Gets the privateChatSetting. + * @return The privateChatSetting. + */ + public int getPrivateChatSetting() { + return privateChatSetting; + } + + /** + * Sets the privateChatSetting. + * @param privateChatSetting The privateChatSetting to set. + */ + public void setPrivateChatSetting(int privateChatSetting) { + this.privateChatSetting = privateChatSetting; + updateChatSettings(); + } + + /** + * Gets the clanChatSetting. + * @return The clanChatSetting. + */ + public int getClanChatSetting() { + return clanChatSetting; + } + + /** + * Sets the clanChatSetting. + * @param clanChatSetting The clanChatSetting to set. + */ + public void setClanChatSetting(int clanChatSetting) { + this.clanChatSetting = clanChatSetting; + player.getConfigManager().set(1054, clanChatSetting); + } + + /** + * Gets the tradeSetting. + * @return The tradeSetting. + */ + public int getTradeSetting() { + return tradeSetting; + } + + /** + * Sets the tradeSetting. + * @param tradeSetting The tradeSetting to set. + */ + public void setTradeSetting(int tradeSetting) { + this.tradeSetting = tradeSetting; + updateChatSettings(); + } + + /** + * Gets the assistSetting. + * @return The assistSetting. + */ + public int getAssistSetting() { + return assistSetting; + } + + /** + * Sets the assistSetting. + * @param assistSetting The assistSetting to set. + */ + public void setAssistSetting(int assistSetting) { + this.assistSetting = assistSetting; + player.getConfigManager().set(1055, assistSetting); + } + + /** + * @return the runEnergy + */ + public double getRunEnergy() { + return runEnergy; + } + + /** + * @param runEnergy the runEnergy to set + */ + public void setRunEnergy(double runEnergy) { + this.runEnergy = runEnergy; + } + + /** + * Gets the attackStyleIndex. + * @return The attackStyleIndex. + */ + public int getAttackStyleIndex() { + return attackStyleIndex; + } + + /** + * Sets the attackStyleIndex. + * @param attackStyleIndex The attackStyleIndex to set. + */ + public void setAttackStyleIndex(int attackStyleIndex) { + this.attackStyleIndex = attackStyleIndex; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/SkullManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/SkullManager.java new file mode 100644 index 000000000..60d0f3756 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/SkullManager.java @@ -0,0 +1,187 @@ +package core.game.node.entity.player.link; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.EntityState; +import core.game.world.update.flag.player.AppearanceFlag; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a managing class of the active player skulls. + * @author Vexia + * @author Emperor + */ +public final class SkullManager { + + /** + * The player instance. + */ + private final Player player; + + /** + * Represents if the player is in the wilderness. + */ + private boolean wilderness = false; + + /** + * If the wilderness zone is currently disabled. + */ + private boolean wildernessDisabled = false; + + /** + * Represents the current wilderness level. + */ + private int level; + + /** + * The players this player has skulled on. + */ + private final List skullCauses = new ArrayList(); + + /** + * If the player is skulled. + */ + private boolean skulled; + + /** + * If the skull check is disabled. + */ + private boolean skullCheckDisabled; + + /** + * Constructs a new {@code SkullManager} {@code Object}. + * @param player the player. + */ + public SkullManager(Player player) { + this.player = player; + } + + /** + * Checks if we should skull on this entity. + * @param other The entity to check. + */ + public void checkSkull(Entity other) { + if (!(other instanceof Player) || !wilderness || skullCheckDisabled) { + return; + } + Player o = (Player) other; + for (Player p : o.getSkullManager().skullCauses) { + if (p == player) { + return; + } + } + if (skullCauses.contains(o)) { + return; + } + skullCauses.add(o); + player.registerState("skull").init(); + } + + /** + * Sets the skull icon. + * @param skullIcon The skull icon. + */ + public void setSkullIcon(int skullIcon) { + player.getAppearance().setSkullIcon(skullIcon); + player.getUpdateMasks().register(new AppearanceFlag(player)); + } + + /** + * Resets the skull causes cache. + */ + public void reset() { + skullCauses.clear(); + setSkullIcon(-1); + setSkulled(false); + } + + /** + * Gets the player. + * @return the player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the level. + * @return the level. + */ + public int getLevel() { + return level; + } + + /** + * Sets the level. + * @param level the level to set. + */ + public void setLevel(int level) { + this.level = level; + } + + /** + * Gets the value. + * @return the wilderness. + */ + public boolean isWilderness() { + return wilderness; + } + + /** + * Sets the value of this boolean. + * @param wilderness the wilderness to set. + */ + public void setWilderness(boolean wilderness) { + this.wilderness = wilderness; + } + + /** + * Gets the skullCheckDisabled. + * @return The skullCheckDisabled. + */ + public boolean isSkullCheckDisabled() { + return skullCheckDisabled; + } + + /** + * Sets the skullCheckDisabled. + * @param skullCheckDisabled The skullCheckDisabled to set. + */ + public void setSkullCheckDisabled(boolean skullCheckDisabled) { + this.skullCheckDisabled = skullCheckDisabled; + } + + /** + * Gets the wildernessDisabled. + * @return The wildernessDisabled. + */ + public boolean isWildernessDisabled() { + return wildernessDisabled; + } + + /** + * Sets the wildernessDisabled. + * @param wildernessDisabled The wildernessDisabled to set. + */ + public void setWildernessDisabled(boolean wildernessDisabled) { + this.wildernessDisabled = wildernessDisabled; + } + + /** + * Gets the skulled. + * @return The skulled. + */ + public boolean isSkulled() { + return skulled; + } + + /** + * Sets the skulled. + * @param skulled The skulled to set. + */ + public void setSkulled(boolean skulled) { + this.skulled = skulled; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/SpellBookManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/SpellBookManager.java new file mode 100644 index 000000000..05a998700 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/SpellBookManager.java @@ -0,0 +1,148 @@ +package core.game.node.entity.player.link; + +import core.game.component.Component; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +/** + * Represents a managing class of a players spell book. + * @author Vexia + */ +public final class SpellBookManager implements SavingModule { + + /** + * Represents the current interface if of the spellbook. + */ + private int spellBook = SpellBook.MODERN.getInterfaceId(); + + /** + * Constructs a new {@code SpellBookManager} {@code Object}. + */ + public SpellBookManager() { + /** + * empty. + */ + } + + @Override + public void save(ByteBuffer buffer) { + buffer.putInt(spellBook); + } + + @Override + public void parse(ByteBuffer buffer) { + if (buffer.hasRemaining()) { + setSpellBook(SpellBook.forInterface(buffer.getInt())); + } + } + + /** + * Sets the spell book. + * @param book + */ + public void setSpellBook(SpellBook book) { + this.spellBook = book.getInterfaceId(); + } + + /** + * Updates the + * @param player + */ + public void update(Player player) { + player.getInterfaceManager().openTab(new Component(SpellBook.forInterface(this.spellBook).getInterfaceId())); + } + + /** + * Gets the spell book. + * @return the spellBook + */ + public int getSpellBook() { + return spellBook; + } + + /** + * Represents a characters spellbook. + * @author 'Vexia + * @author Emperor + */ + public enum SpellBook { + + /** + * The modern magic spell book. + */ + MODERN(192), + + /** + * The ancient magicks spell book. + */ + ANCIENT(193), + + /** + * The lunar magic spell book. + */ + LUNAR(430); + + /** + * The interface id of this spell book. + */ + private final int interfaceId; + + /** + * The spells mapping. + */ + private final Map spells = new HashMap<>(); + + /** + * Creates the spell book. + * @param interfaceId The spellbook interface id. + */ + SpellBook(int interfaceId) { + this.interfaceId = interfaceId; + } + + /** + * @return The interfaceId. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Method used to get the book. + * @param id the id. + */ + public static SpellBook forInterface(final int id) { + for (SpellBook book : SpellBook.values()) { + if (book.interfaceId == id) { + return book; + } + } + return null; + } + + /** + * Registers a new spell. + * @param buttonId The button id. + * @param spell The spell. + */ + public void register(int buttonId, MagicSpell spell) { + spell.setSpellId(buttonId); + spells.put(buttonId, spell); + } + + /** + * Gets a spell from the spellbook. + * @param buttonId The button id. + * @return The spell. + */ + public MagicSpell getSpell(int buttonId) { + return spells.get(buttonId); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/TeleportManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/TeleportManager.java new file mode 100644 index 000000000..97398bd21 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/TeleportManager.java @@ -0,0 +1,852 @@ +package core.game.node.entity.player.link; + +import core.ServerConstants; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles the entity teleport. + * @author SonicForce41 + * @author Woah + */ +public class TeleportManager { + + /** + * The wildy teleport type. + */ + public static final int WILDY_TELEPORT = 1 << 16 | 8; + + /** + * The animations used in the home teleport. + */ + private final static int[] HOME_ANIMATIONS = {1722, 1723, 1724, 1725, 2798, 2799, 2800, 3195, 4643, 4645, 4646, 4847, 4848, 4849, 4850, 4851, 4852, 65535}; + + /** + * The graphics used in the home teleport. + */ + private final static int[] HOME_GRAPHICS = {775, 800, 801, 802, 803, 804, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 65535}; + + /** + * The entity being handled. + */ + private final Entity entity; + + /** + * The last teleport of this Entity + */ + private Pulse lastTeleport; + + /** + * The current teleport of this Entity + */ + private Pulse currentTeleport; + + /** + * The current teleport type. + */ + private int teleportType; + + /** + * Constructs a new {@code Teleporter.java} {@Code Object}. + * @param entity the Entity + */ + public TeleportManager(Entity entity) { + this.entity = entity; + lastTeleport = TeleportType.HOME.getPulse(entity, ServerConstants.HOME_LOCATION); + } + + /** + * Sends the teleport. + * @param location the Location. + * @return {@code True} if the player successfully started teleporting. + */ + public boolean send(Location location) { + return send(location, entity instanceof Player ? getType((Player) entity) : TeleportType.NORMAL, 0); + } + + /** + * Sends the teleport. + * @param location the Location. + * @param type the NodeType. + * @return {@code True} if the player successfully started teleporting. + */ + public boolean send(Location location, TeleportType type) { + return send(location, type, 0); + } + + /** + * Sends the teleport. + * @param location the Location. + * @param type the NodeType. + * @param teleportType The teleporting type. (0=spell, 1=item, 2=object, + * 3=npc -1= force) + * @return {@code True} if the player successfully started teleporting. + */ + public boolean send(Location location, TeleportType type, int teleportType) { + if (teleportType != -1 && entity.isTeleBlocked()) { + if (entity.isPlayer()) { + entity.asPlayer().sendMessage("A magical force has stopped you from teleporting."); + } + return false; + } + if ((teleportType != WILDY_TELEPORT && type != TeleportType.OBELISK) && !entity.getZoneMonitor().teleport(teleportType, null)) { + return false; + } + if (teleportType != -1) { + if (entity instanceof Player) { + Player p = (Player) entity; + p.getDialogueInterpreter().close(); + } + } + this.teleportType = teleportType; + entity.getWalkingQueue().reset(); + lastTeleport = currentTeleport; + currentTeleport = type.getPulse(entity, location); + entity.getPulseManager().clear(); + if (type == TeleportType.HOME) { + entity.getPulseManager().run(type.getPulse(entity, location)); + } else { + entity.lock(12); + entity.getImpactHandler().setDisabledTicks(teleportType == -1 ? 5 : 12); + GameWorld.getPulser().submit(currentTeleport); + } + if (entity instanceof Player) { + ((Player) entity).getInterfaceManager().close(); + } + return true; + } + + /** + * Fires a random event. + * @param entity The entity teleporting. + * @param location The destination lcoation. + */ + public static void fireRandom(Entity entity, Location location) { + if (entity instanceof Player && entity.getTeleporter().getTeleportType() == 0) { + Player p = (Player) entity; + } + } + + /** + * Get the home teleport audio based on tick count. + * @param count + */ + private static int getAudio(int count){ + switch(count){ + case 0: + return 193; + case 4: + return 194; + case 11: + return 195; + } + return -1; + } + + /** + * Gets the entity. + * @return the Entity + */ + public final Entity getEntity() { + return entity; + } + + /** + * Gets the last teleport pulse. + * @return the Pulse + */ + public final Pulse getLastTeleport() { + return lastTeleport; + } + + /** + * Gets the current teleport pulse. + * @return the Pulse + */ + public final Pulse getCurrentTeleport() { + return currentTeleport; + } + + /** + * Represents a NodeType for Teleporter + * @author SonicForce41 + */ + public enum TeleportType { + + /** + * The value types + */ + NORMAL(new TeleportSettings(8939, 8941, 1576, 1577)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(200); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + entity.graphics(new Graphics(getSettings().getStartGfx())); + } else if (delay == 3) { + entity.getProperties().setTeleportLocation(Location.create(location)); + fireRandom(entity, location); + } else if (delay == 4) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(201); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getEndEmote(), Priority.HIGH)); + entity.graphics(new Graphics(getSettings().getEndGfx())); + return true; + } + delay++; + return false; + } + + @Override + public void stop() { + super.stop(); + entity.unlock(); + entity.lock(4); + } + }; + } + }, + ANCIENT(new TeleportSettings(1979, -1, 392, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + entity.graphics(new Graphics(getSettings().getStartGfx())); + } else if (delay == 4) { + entity.getProperties().setTeleportLocation(Location.create(location)); + fireRandom(entity, location); + } else if (delay == 5) { + entity.getAnimator().forceAnimation(new Animation(getSettings().getEndEmote(), Priority.HIGH)); + entity.graphics(new Graphics(getSettings().getEndGfx())); + return true; + } + delay++; + return false; + } + + @Override + public void stop() { + super.stop(); + entity.getAnimator().forceAnimation(new Animation(-1)); + entity.graphics(new Graphics(-1)); + entity.unlock(); + } + }; + } + }, + LUNAR(new TeleportSettings(1816, -1, 747, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + entity.graphics(new Graphics(getSettings().getStartGfx(), 120)); + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + } else if (delay == 3) { + entity.getProperties().setTeleportLocation(Location.create(location)); + fireRandom(entity, location); + } else if (delay == 4) { + entity.getAnimator().forceAnimation(new Animation(getSettings().getEndEmote(), Priority.HIGH)); + entity.graphics(new Graphics(getSettings().getEndGfx())); + return true; + } + delay++; + return false; + } + + @Override + public void stop() { + super.stop(); + entity.getAnimator().forceAnimation(new Animation(-1)); + entity.graphics(new Graphics(-1)); + entity.unlock(); + } + }; + } + }, + TELETABS(new TeleportSettings(4731, -1, 678, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(979); + } + entity.getAnimator().forceAnimation(new Animation(4069)); + } else if (delay == 2) { + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote(), Priority.HIGH)); + entity.graphics(new Graphics(getSettings().getStartGfx())); + } else if (delay == 3) { + entity.getProperties().setTeleportLocation(Location.create(location)); + } else if (delay == 4) { + entity.getAnimator().forceAnimation(new Animation(getSettings().getEndEmote())); + entity.graphics(new Graphics(getSettings().getEndGfx())); + return true; + } + delay++; + return false; + } + + @Override + public void stop() { + super.stop(); + entity.getAnimator().forceAnimation(new Animation(-1)); + entity.graphics(new Graphics(-1)); + entity.unlock(); + entity.lock(2); + } + }; + } + }, + HOME(new TeleportSettings(4847, 4857, 800, 804)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int count; + Player player; + + @Override + public boolean pulse() { + switch (count) { + case 18: + player.getProperties().setTeleportLocation(location); + return true; + default: + entity.asPlayer().getAudioManager().send(getAudio(count)); + player.getPacketDispatch().sendGraphic(HOME_GRAPHICS[count]); + player.getPacketDispatch().sendAnimation(HOME_ANIMATIONS[count]); + break; + } + count++; + return false; + } + @Override + public void start() { + player = ((Player) entity); + if (TutorialSession.getExtension(player).getStage() < TutorialSession.MAX_STAGE) { + stop(); + return; + } + /*if (player.getSavedData().getGlobalData().getHomeTeleportDelay() > System.currentTimeMillis() && !player.isDonator()) { + long milliseconds = player.getSavedData().getGlobalData().getHomeTeleportDelay() - System.currentTimeMillis(); + int minutes = (int) Math.round(milliseconds / 120000); + if (minutes > 15) { + player.getSavedData().getGlobalData().setHomeTeleportDelay(System.currentTimeMillis() + 1200000); + milliseconds = player.getSavedData().getGlobalData().getHomeTeleportDelay() - System.currentTimeMillis(); + minutes = (int) Math.round(milliseconds / 120000); + } + if (minutes != 0) { + player.getPacketDispatch().sendMessage("You need to wait another " + minutes + " " + (minutes == 1 ? "minute" : "minutes") + " to cast this spell."); + stop(); + return; + } + }*/ + super.start(); + } + + @Override + public void stop() { + super.stop(); + entity.getAnimator().forceAnimation(new Animation(-1)); + player.graphics(new Graphics(-1)); + } + }; + } + }, + OBELISK(new TeleportSettings(8939, 8941, 661, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + entity.lock(); + entity.getAnimator().forceAnimation(new Animation(1816)); + } else if (delay == 3) { + entity.getProperties().setTeleportLocation(Location.create(location)); + } else if (delay == 4) { + entity.getAnimator().forceAnimation(Animation.RESET); + entity.unlock(); + return true; + } + delay++; + return false; + } + }; + } + }, + TELE_OTHER(new TeleportSettings(1816, -1, 342, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(199); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + entity.graphics(new Graphics(getSettings().getStartGfx())); + } else if (delay == 3) { + entity.getProperties().setTeleportLocation(Location.create(location)); + } else if (delay == 4) { + entity.getAnimator().forceAnimation(new Animation(-1)); + entity.unlock(); + return true; + } + delay++; + return false; + } + }; + } + }, + FAIRY_RING(new TeleportSettings(-1, -1, -1, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + entity.graphics(Graphics.create(569)); + return new Pulse(1, entity) { + int delay; + + @Override + public boolean pulse() { + switch (++delay) { + case 2: + entity.animate(Animation.create(3265)); + break; + case 4: + Quest quest = null; + if (entity instanceof Player) { + quest = ((Player) entity).getQuestRepository().getQuest("Lost City"); + } + if (quest != null) { + if (quest.getStage(entity.asPlayer()) == 21) { + quest.finish(entity.asPlayer()); + } + } + entity.animate(Animation.create(3266)); + entity.getProperties().setTeleportLocation(location); + entity.unlock(); + entity.lock(2); + return true; + } + return false; + } + + }; + } + }, + PURO_PURO(new TeleportSettings(6601, 1118, -1, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + entity.graphics(new Graphics(1118)); + } else if (delay == 9) { + entity.getProperties().setTeleportLocation(Location.create(location)); + entity.getAnimator().forceAnimation(new Animation(-1)); + entity.unlock(); + return true; + } + delay++; + return false; + } + }; + } + }, + ECTOPHIAL(new TeleportSettings(8939, 8941, 1587, 1588)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(200); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + entity.graphics(new Graphics(getSettings().getStartGfx())); + } else if (delay == 3) { + entity.getProperties().setTeleportLocation(Location.create(location)); + fireRandom(entity, location); + } else if (delay == 4) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(201); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getEndEmote(), Priority.HIGH)); + entity.graphics(new Graphics(getSettings().getEndGfx())); + return true; + } + delay++; + return false; + } + + @Override + public void stop() { + super.stop(); + entity.unlock(); + entity.lock(4); + } + }; + } + }, + CHRISTMAS(new TeleportSettings(7534, -1, 1292, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(200); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + entity.graphics(new Graphics(getSettings().getStartGfx())); + } else if (delay == 3) { + entity.getProperties().setTeleportLocation(Location.create(location)); + fireRandom(entity, location); + } else if (delay == 4) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(201); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getEndEmote(), Priority.HIGH)); + entity.graphics(new Graphics(getSettings().getEndGfx())); + return true; + } + delay++; + return false; + } + + @Override + public void stop() { + super.stop(); + entity.unlock(); + entity.lock(4); + } + }; + } + }, + CABBAGE(new TeleportSettings(9984, 9986, 1731, 1732)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(200); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + entity.graphics(new Graphics(getSettings().getStartGfx())); + } else if (delay == 5) { + entity.getProperties().setTeleportLocation(Location.create(location)); + fireRandom(entity, location); + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(201); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getEndEmote(), Priority.HIGH)); + entity.graphics(new Graphics(getSettings().getEndGfx())); + return true; + } + delay++; + return false; + } + + @Override + public void stop() { + super.stop(); + entity.unlock(); + entity.lock(4); + } + }; + } + }, + ENTRANA_MAGIC_DOOR(new TeleportSettings(10100, 9013, 1745, 1747)) { // + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(200); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + entity.graphics(new Graphics(getSettings().getStartGfx())); + } else if (delay == 3) { + entity.getProperties().setTeleportLocation(Location.create(location)); + fireRandom(entity, location); + } else if (delay == 4) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(201); + } + entity.getAnimator().forceAnimation(new Animation(getSettings().getEndEmote(), Priority.HIGH)); + entity.graphics(new Graphics(getSettings().getEndGfx())); + return true; + } + delay++; + return false; + } + + @Override + public void stop() { + super.stop(); + entity.unlock(); + entity.lock(4); + } + }; + } + }, + MINIGAME(new TeleportSettings(6601, 1118, -1, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + Player player; + + @Override + public boolean pulse() { + if (delay == 0) { + entity.getAnimator().forceAnimation(new Animation(getSettings().getStartEmote())); + entity.graphics(new Graphics(1118)); + } else if (delay == 9) { + entity.getProperties().setTeleportLocation(Location.create(location)); + entity.getAnimator().forceAnimation(new Animation(-1)); + entity.unlock(); + return true; + } + delay++; + return false; + } + + @Override + public void start() { + player = ((Player) entity); + if (TutorialSession.getExtension(player).getStage() < TutorialSession.MAX_STAGE) { + stop(); + return; + } + if (player.getSavedData().getGlobalData().getMinigameTeleportDelay() > System.currentTimeMillis()) { + long milliseconds = player.getSavedData().getGlobalData().getMinigameTeleportDelay() - System.currentTimeMillis(); + int minutes = (int) Math.round(milliseconds / 60000); + if (minutes > 30) { + player.getSavedData().getGlobalData().setMinigameTeleportDelay(System.currentTimeMillis() + 600000); + milliseconds = player.getSavedData().getGlobalData().getMinigameTeleportDelay() - System.currentTimeMillis(); + minutes = (int) Math.round(milliseconds / 60000); + } + if (minutes != 0) { + player.getPacketDispatch().sendMessage("You need to wait another " + minutes + " " + (minutes == 1 ? "minute" : "minutes") + " to use the finder again."); + stop(); + return; + } + } + super.start(); + } + + @Override + public void stop() { + super.stop(); + entity.getAnimator().forceAnimation(new Animation(-1)); + player.graphics(new Graphics(-1)); + } + }; + } + }, + INSTANT(new TeleportSettings(-1, -1, -1, -1)) { + @Override + public Pulse getPulse(final Entity entity, final Location location) { + return new Pulse(1) { + int delay = 0; + + @Override + public boolean pulse() { + if (delay == 0) { + entity.lock(); + } else if (delay == 3) { + entity.getProperties().setTeleportLocation(Location.create(location)); + } else if (delay == 4) { + entity.getAnimator().forceAnimation(Animation.RESET); + entity.unlock(); + return true; + } + delay++; + return false; + } + }; + } + }; + + /** + * The NodeSettings + */ + private TeleportSettings settings; + + /** + * @param entity + * @param location + * @return the Pulse + */ + public abstract Pulse getPulse(final Entity entity, final Location location); + + /** + * Constructs a new {@code Teleporter.java} {@Code Object}. + * @param settings the NodeSettings + */ + TeleportType(TeleportSettings settings) { + this.settings = settings; + } + + /** + * Gets the NodeSettings + * @return the NodeSettings + */ + public final TeleportSettings getSettings() { + return settings; + } + } + + /** + * Represents teleport node settings + * @author SonicForce41 + */ + static class TeleportSettings { + + /** + * The start animation. + */ + private int startAnim; + + /** + * The end animation. + */ + private int endAnim; + + /** + * The start graphics. + */ + private int startGFX; + + /** + * The end gfx. + */ + private int endGFX; + + /** + * Constructs a new {@code Teleporter.java} {@code Object}. + * @param startAnim the start animation. + * @param endAnim the end animation. + * @param startGfx the start graphics. + * @param endGfx the end graphiics. + */ + public TeleportSettings(int startAnim, int endAnim, int startGfx, int endGfx) { + this.startAnim = startAnim; + this.endAnim = endAnim; + this.startGFX = startGfx; + this.endGFX = endGfx; + } + + /** + * @return the anim. + */ + public final int getStartEmote() { + return startAnim; + } + + /** + * @return the anim. + */ + public final int getEndEmote() { + return endAnim; + } + + /** + * @return the start graphics. + */ + public final int getStartGfx() { + return startGFX; + } + + /** + * @return the end gfx. + */ + public final int getEndGfx() { + return endGFX; + } + } + + /** + * Gets the teleporting type for the player depending on his/her current + * spellbook. + * @param player The player. + * @return The teleport type. + */ + public static TeleportType getType(Player player) { + switch (player.getSpellBookManager().getSpellBook()) { + case 193: + return TeleportType.ANCIENT; + case 430: + return TeleportType.LUNAR; + } + return TeleportType.NORMAL; + } + + /** + * Gets the teleportType. + * @return The teleportType. + */ + public int getTeleportType() { + return teleportType; + } + + /** + * Sets the teleportType. + * @param teleportType The teleportType to set. + */ + public void setTeleportType(int teleportType) { + this.teleportType = teleportType; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/WarningMessages.java b/Server/src/main/java/Server/core/game/node/entity/player/link/WarningMessages.java new file mode 100644 index 000000000..e84249173 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/WarningMessages.java @@ -0,0 +1,148 @@ +package core.game.node.entity.player.link; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the warning messages of a player. + * @author Vexia + */ +public final class WarningMessages implements SavingModule { + + /** + * Represents the config id. + */ + private static final int CONFIG = 1045; + + /** + * Represents the warning messages. + */ + private final List messages = new ArrayList<>(); + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + /** + * Method used to open the warning messages. + * @param player the player. + */ + public void open(final Player player) { + player.getInterfaceManager().open(new Component(583)); + refresh(player); + } + + /** + * Method used to refresh the config. + * @param player the player. + */ + private void refresh(final Player player) { + player.getConfigManager().set(CONFIG, getConfigValue(), true); + } + + /** + * Gets a warning message by its index. + * @param index the index. + * @return the warning message. + */ + public WarningMessage getMessage(int index) { + for (WarningMessage m : messages) { + if (m.getIndex() == index) { + return m; + } + } + WarningMessage message = new WarningMessage(index); + messages.add(message); + return message; + } + + /** + * Gets the config value. + * @return the value. + */ + private int getConfigValue() { + return 0; + } + + /** + * Represents a warning message. + * @author 'Vexia + */ + public final class WarningMessage implements SavingModule { + + /** + * Represents the button index. + */ + private final int index; + + /** + * Constructs a new {@code WarningMessage} {@code Object}. + * @param index the index. + */ + public WarningMessage(final int index) { + this.index = index; + } + + @Override + public void save(ByteBuffer buffer) { + + } + + @Override + public void parse(ByteBuffer buffer) { + + } + + /** + * Method used to toggle this warning message. + * @param player the player. + */ + public void toggle(final Player player) { + if (!isActive()) { + player.getPacketDispatch().sendMessage("You cannot toggle the warning screen on or off. You need to go to the area it"); + player.getPacketDispatch().sendMessage("is linked to enough times to have the option to do so."); + return; + } + final boolean on = !isToggled(); + refresh(player); + player.getPacketDispatch().sendMessage("You have toggled this warning screen " + (on ? "on" : "off") + ". You will " + (on ? "see this interface again." : "no longer see this warning screen.")); + } + + /** + * Checks if the message is toggled. + * @return {@code True} if so. + */ + private boolean isToggled() { + return false; + } + + /** + * Checks if the message is toggled. + * @return {@code True} if so. + */ + private boolean isActive() { + return false; + } + + /** + * Gets the index. + * @return The index. + */ + public int getIndex() { + return index; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/Appearance.java b/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/Appearance.java new file mode 100644 index 000000000..f0205a6d8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/Appearance.java @@ -0,0 +1,802 @@ +package core.game.node.entity.player.link.appearance; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.item.Item; +import core.game.system.config.ItemConfigParser; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.player.AppearanceFlag; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; + +/** + * Represents an appearance managing class of a player. + * @author Emperor + * @author Vexia + */ +public final class Appearance implements SavingModule { + + /** + * Represents the player instance. + */ + private final Player player; + + /** + * Represents the cached animations. + */ + private final int[] animationCache = new int[] { AppearanceCache.STAND_ANIM, AppearanceCache.STAND_TURN_ANIM, AppearanceCache.WALK_ANIM, AppearanceCache.TURN_180_AIM, AppearanceCache.TURN_90_CW, AppearanceCache.TUNR_90_CWW, AppearanceCache.RUN_ANIM }; + + /** + * Represents the cached icons. + */ + private final int[] iconCache = new int[] { -1, -1 }; + + /** + * Represents the shown body parts. + */ + private final int[] bodyParts = new int[14]; + + /** + * Represents the cached body parts (default male). + */ + private BodyPart[] appearanceCache = Gender.MALE.generateCache(); + + /** + * Represents the gender of a player. + */ + private Gender gender = Gender.MALE; + + /** + * Represents the npc id to represent if not -1. + */ + private int npcId = -1; + + /** + * The render animation id. + */ + private int renderAnimationId = 1426; + + /** + * If the player is riding a mining cart. + */ + private boolean ridingMinecart; + + /** + * Constructs a new {@code Appearance} {@code Object}. + * @param player the player of this appearance. + */ + public Appearance(final Player player) { + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + buffer.put(gender.toByte()); + for (int i = 0; i < appearanceCache.length; i++) { + appearanceCache[i].save(buffer); + } + } + + public void parse(JSONObject appearance){ + gender = gender.asByte(Byte.parseByte(appearance.get("gender").toString())); + JSONArray appCache = (JSONArray) appearance.get("appearance_cache"); + for(int i = 0; i < appearanceCache.length; i++){ + (appearanceCache[i]).parse((JSONObject) appCache.get(i)); + } + } + + @Override + public void parse(ByteBuffer buffer) { + gender = gender.asByte(buffer.get()); + for (int i = 0; i < appearanceCache.length; i++) { + appearanceCache[i].parse(buffer); + } + } + + /** + * Transforms the player into an NPC. + * @param id The NPC id. + */ + public void transformNPC(int id) { + this.npcId = id; + setAnimations(); + if (id == -1) { + player.setSize(1); + Animation[] anims = WeaponInterface.DEFAULT_ANIMS; + if (player.getEquipment().get(3) != null) { + anims = player.getEquipment().get(3).getDefinition().getConfiguration(ItemConfigParser.ATTACK_ANIMS, anims); + } + int index = player.getSettings().getAttackStyleIndex(); + if (index < 0 || index >= anims.length) { + index = 0; + } + player.getProperties().setAttackAnimation(anims[index]); + player.getProperties().setDefenceAnimation(new Animation(404)); + player.getProperties().setDeathAnimation(new Animation(9055, Priority.HIGH)); + } else { + NPCDefinition def = NPCDefinition.forId(id); + player.setSize(def.getSize()); + if (def.getCombatAnimation(0) != null) { + player.getProperties().setAttackAnimation(def.getCombatAnimation(0)); + } + if (def.getCombatAnimation(3) != null) { + player.getProperties().setDefenceAnimation(def.getCombatAnimation(3)); + } + if (def.getCombatAnimation(4) != null) { + player.getProperties().setDeathAnimation(def.getCombatAnimation(4)); + } + } + sync(); + } + + /** + * Sets the rendering animations. + */ + public void setAnimations() { + if (npcId == -1) { + Item weapon = player.getEquipment().get(3); + if (isRidingMinecart()) { + this.setRidingMinecart(false); + } + if (weapon == null || weapon.getDefinition().getConfiguration(ItemConfigParser.WALK_ANIM, null) == null) { + setDefaultAnimations(); + } else { + ItemDefinition def = weapon.getDefinition(); + setStandAnimation(def.getConfiguration(ItemConfigParser.STAND_ANIM, 0x328)); + setStandTurnAnimation(def.getConfiguration(ItemConfigParser.STAND_TURN_ANIM, 0x337)); + setWalkAnimation(def.getConfiguration(ItemConfigParser.WALK_ANIM, 0x333)); + setRunAnimation(def.getConfiguration(ItemConfigParser.RUN_ANIM, 0x338)); + setTurn180(def.getConfiguration(ItemConfigParser.TURN180_ANIM, 0x334)); + setTurn90cw(def.getConfiguration(ItemConfigParser.TURN90CW_ANIM, 0x335)); + setTurn90ccw(def.getConfiguration(ItemConfigParser.TURN90CCW_ANIM, 0x336)); + renderAnimationId = def.getRenderAnimationId(); + } + if (weapon != null && weapon.getId() == 12842) { + setStandAnimation(8964); + setWalkAnimation(8961); + setRunAnimation(8963); + setTurn180(8963); + setTurn90ccw(8963); + setTurn90cw(8963); + setStandTurnAnimation(8963); + } + } else { + NPCDefinition def = NPCDefinition.forId(npcId); + renderAnimationId = def.getRenderAnimationId(); + setStandAnimation(def.getStandAnimation()); + int turn = def.getTurnAnimation(); + if (turn < 1) { + turn = def.getWalkAnimation(); + } + setStandTurnAnimation(turn); + setWalkAnimation(def.getWalkAnimation()); + setRunAnimation(def.getWalkAnimation()); + if (def.getTurn180Animation() > 0) { + setTurn180(def.getTurn180Animation()); + } else { + setTurn180(turn); + } + if (def.getTurnCWAnimation() > 0) { + setTurn90cw(def.getTurnCWAnimation()); + } else { + setTurn90cw(turn); + } + if (def.getTurnCCWAnimation() > 0) { + setTurn90ccw(def.getTurnCCWAnimation()); + } else { + setTurn90ccw(turn); + } + } + } + + /** + * Sets the animations. + * @param anim the animation. + */ + public void setAnimations(Animation anim) { + renderAnimationId = anim.getId(); + sync(); + } + + /** + * Method used to sync this appearance with the client. + */ + public void sync() { + player.getUpdateMasks().register(new AppearanceFlag(player)); + } + + /** + * Copies the appearance. + * @param appearance The appearance to copy from. + */ + public void copy(Appearance appearance) { + gender = appearance.gender; + for (int i = 0; i < appearanceCache.length; i++) { + appearanceCache[i] = appearance.appearanceCache[i]; + } + for (int i = 0; i < animationCache.length; i++) { + animationCache[i] = appearance.animationCache[i]; + } + renderAnimationId = appearance.renderAnimationId; + } + + /** + * Draws an item on a body part. + * @param part The body part. + * @param item The item to draw. + */ + public void drawItem(int part, Item item) { + this.bodyParts[part] = item.getDefinition().getEquipId() + 0x8000; + } + + /** + * Draws clothing on a body part. + * @param part The body part. + * @param clothesId The clothes id. + */ + public void drawClothes(int part, int clothesId) { + this.bodyParts[part] = clothesId + 0x100; + } + + /** + * Clears a body part. + * @param part The part to clear. + */ + public void clearBodyPart(int part) { + this.bodyParts[part] = 0; + } + + /** + * Prepares the data used for the appearance update mask. + * @param player The player. + */ + public void prepareBodyData(Player player) { + if (player.getRenderInfo().preparedAppearance()) { + return; + } + player.getRenderInfo().setPreparedAppearance(true); + Item chest = player.getEquipment().get(EquipmentContainer.SLOT_CHEST); + Item shield = player.getEquipment().get(EquipmentContainer.SLOT_SHIELD); + Item legs = player.getEquipment().get(EquipmentContainer.SLOT_LEGS); + Item hat = player.getEquipment().get(EquipmentContainer.SLOT_HAT); + Item hands = player.getEquipment().get(EquipmentContainer.SLOT_HANDS); + Item feet = player.getEquipment().get(EquipmentContainer.SLOT_FEET); + Item cape = player.getEquipment().get(EquipmentContainer.SLOT_CAPE); + Item amulet = player.getEquipment().get(EquipmentContainer.SLOT_AMULET); + Item weapon = player.getEquipment().get(EquipmentContainer.SLOT_WEAPON); + boolean castleWarsHood = cape != null && (cape.getId() == 4041 || cape.getId() == 4042); // Item + if (hat != null) { + drawItem(0, hat); + } else { + clearBodyPart(0); + } + if (cape != null) { + drawItem(1, cape); + } else { + clearBodyPart(1); + } + if (amulet != null) { + drawItem(2, amulet); + } else { + clearBodyPart(2); + } + if (!ridingMinecart) { + if (weapon != null) { + drawItem(3, weapon); + } else { + clearBodyPart(3); + } + if (shield != null) { + drawItem(5, shield); + } else { + clearBodyPart(5); + } + } else { + clearBodyPart(5); + drawClothes(3, 82); + } + if (chest != null) { + drawItem(4, chest); + } else { + drawClothes(4, getTorso().getLook()); + } + if (chest != null && chest.getDefinition().getConfiguration(ItemConfigParser.REMOVE_SLEEVES, false)) { + clearBodyPart(6); + } else { + drawClothes(6, getArms().getLook()); + } + if (legs != null) { + drawItem(7, legs); + } else { + drawClothes(7, getLegs().getLook()); + } + if ((hat != null && hat.getDefinition().getConfiguration(ItemConfigParser.REMOVE_HEAD, false)) || castleWarsHood) { + clearBodyPart(8); + } else { + drawClothes(8, getHair().getLook()); + } + if (hands != null) { + drawItem(9, hands); + } else { + drawClothes(9, getWrists().getLook()); + } + if (feet != null) { + drawItem(10, feet); + } else { + drawClothes(10, getFeet().getLook()); + } + if (hat != null && hat.getDefinition().getConfiguration(ItemConfigParser.REMOVE_BEARD, false)) { + clearBodyPart(11); + } else { + drawClothes(11, getBeard().getLook()); + } + + } + + /** + * Rides a mine cart. + */ + public void rideCart(boolean ride) { + if (!ride) { + setAnimations(); + } else { + player.getAppearance().setAnimations(Animation.create(211)); + } + player.getAppearance().setRidingMinecart(ride); + player.getAppearance().sync(); + } + + /** + * Flys a gnome copter. + */ + public void flyCopter() { + player.animate(Animation.create(8956)); + player.getEquipment().replace(new Item(12842), 3); + player.getAppearance().setStandAnimation(8964); + player.getAppearance().setWalkAnimation(8961); + player.getAppearance().setRunAnimation(8963); + player.getAppearance().setTurn180(8963); + player.getAppearance().setTurn90ccw(8963); + player.getAppearance().setTurn90cw(8963); + player.getAppearance().setStandTurnAnimation(8963); + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the hair body part. + * @return the hair. + */ + public BodyPart getHair() { + return appearanceCache[AppearanceCache.HAIR]; + } + + /** + * Gets the beard body part. + * @return the beard. + */ + public BodyPart getBeard() { + return appearanceCache[AppearanceCache.FACIAL_HAIR]; + } + + /** + * Gets the torso body part. + * @return the torso. + */ + public BodyPart getTorso() { + return appearanceCache[AppearanceCache.TORSO]; + } + + /** + * Gets the arms body part. + * @return the body part. + */ + public BodyPart getArms() { + return appearanceCache[AppearanceCache.ARMS]; + } + + /** + * Gets the wrist part part. + * @return the body part. + */ + public BodyPart getWrists() { + return appearanceCache[AppearanceCache.WRISTS]; + } + + /** + * Gets the skin part. + * @return the part. + */ + public BodyPart getSkin() { + return appearanceCache[AppearanceCache.WRISTS]; + } + + /** + * Getsthe leg body parts. + * @return the legs. + */ + public BodyPart getLegs() { + return appearanceCache[AppearanceCache.LEGS]; + } + + /** + * Gets the feet body parts. + * @return the feet. + */ + public BodyPart getFeet() { + return appearanceCache[AppearanceCache.FEET]; + } + + /** + * Gets the stand animation. + * @return the animation. + */ + public int getStandAnimation() { + return animationCache[0]; + } + + /** + * Method used to set the stand animation. + * @param animation + */ + public void setStandAnimation(int animation) { + animationCache[0] = animation; + } + + /** + * Gets the standing turn animation. + * @return the animation. + */ + public int getStandTurnAnimation() { + return animationCache[1]; + } + + /** + * Sets the standing turn animation. + */ + public void setStandTurnAnimation(int animation) { + animationCache[1] = animation; + } + + /** + * Gets the walk animation. + * @return the animation. + */ + public int getWalkAnimation() { + return animationCache[2]; + } + + /** + * Sets the walk animation. + * @param animation the animation. + */ + public void setWalkAnimation(int animation) { + animationCache[2] = animation; + } + + /** + * Gets the turning 180 animation. + * @return the animation. + */ + public int getTurn180() { + return animationCache[3]; + } + + /** + * Sets the tunring 180 animation. + * @param animation the animation. + */ + public void setTurn180(int animation) { + animationCache[3] = animation; + } + + /** + * Gets the turn90cw animation. + * @return the animation. + */ + public int getTurn90cw() { + return animationCache[4]; + } + + /** + * Sets the turn90cw animation. + * @param animation the animation. + */ + public void setTurn90cw(int animation) { + animationCache[4] = animation; + } + + /** + * Gets the turn90ccw animation. + * @return the animation. + */ + public int getTurn90ccw() { + return animationCache[5]; + } + + /** + * Sets thr turn90cww animation. + * @param animation + */ + public void setTurn90ccw(int animation) { + animationCache[5] = animation; + } + + /** + * Gets the run animation. + * @return the animation. + */ + public int getRunAnimation() { + return animationCache[6]; + } + + /** + * Sets the running animation. + * @param animation the animation. + */ + public void setRunAnimation(int animation) { + animationCache[6] = animation; + } + + /** + * Gets the render animation id. + * @return The render animation id. + */ + public int getRenderAnimation() { + return renderAnimationId; + } + + /** + * Method used to set the default animations. + */ + public void setDefaultAnimations() { + for (int i = 0; i < animationCache.length; i++) { + animationCache[i] = AppearanceCache.ANIMATIONS[i]; + } + renderAnimationId = 1426; + } + + /** + * Gets the skull icon. + * @return the icon. + */ + public int getSkullIcon() { + return iconCache[0]; + } + + /** + * Sets the skull icon. + * @param icon the icon. + */ + public void setSkullIcon(int icon) { + iconCache[0] = icon; + } + + /** + * Gets the head icon. + * @return the icon. + */ + public int getHeadIcon() { + return iconCache[1]; + } + + /** + * Sets the head icon. + * @param icon the icon. + */ + public void setHeadIcon(int icon) { + this.iconCache[1] = icon; + } + + /** + * Gets the gender. + * @return The gender. + */ + public Gender getGender() { + return gender; + } + + /** + * Method used to change the gender of a player. + * @param gender the gender. + */ + public void changeGender(Gender gender) { + setGender(gender); + sync(); + } + + /** + * Method used to set the gender. + * @param gender the gender. + */ + public void setGender(final Gender gender) { + this.gender = gender; + this.appearanceCache = gender.generateCache(); + } + + /** + * Gets the value {@code True} if male. + * @return {@code True} if so. + */ + public boolean isMale() { + return gender == Gender.MALE; + } + + /** + * Gets the npc id. + * @return the npc id. + */ + public int getNpcId() { + return npcId; + } + + /** + * If the player's appearance is a NPC. + * @return If the player's appearance is a NPC {@code true}. + */ + public boolean isNpc() { + return npcId != -1; + } + + /** + * Gets the appearanceCache. + * @return The appearanceCache. + */ + public BodyPart[] getAppearanceCache() { + return appearanceCache; + } + + /** + * Gets the animationCache. + * @return The animationCache. + */ + public int[] getAnimationCache() { + return animationCache; + } + + /** + * Gets the bodyParts. + * @return The bodyParts. + */ + public int[] getBodyParts() { + return bodyParts; + } + + /** + * Gets the ridingMinecart. + * @return The ridingMinecart. + */ + public boolean isRidingMinecart() { + return ridingMinecart; + } + + /** + * Sets the ridingMinecart. + * @param ridingMinecart The ridingMinecart to set. + */ + public void setRidingMinecart(boolean ridingMinecart) { + this.ridingMinecart = ridingMinecart; + } + + /** + * Represents a class of cached appearance related information. + * @author 'Vexia + */ + public static class AppearanceCache { + + /** + * Represents the appearance animations. + */ + public static final int[] ANIMATIONS = new int[] { 0x328, 0x337, 0x333, 0x334, 0x335, 0x336, 0x338 }; + + /** + * Represents the index hair apperance is cached at. + */ + public static final int HAIR = 0; + + /** + * Represents the index facial hair appearance is cached at. + */ + public static final int FACIAL_HAIR = 1; + + /** + * Represents the index torso appearance is cached at. + */ + public static final int TORSO = 2; + + /** + * Represents the index arm appearance is cached at. + */ + public static final int ARMS = 3; + + /** + * Represents the index wrist appearance is cached at. + */ + public static final int WRISTS = 4; + + /** + * Represents the index leg appearance is cached at. + */ + public static final int LEGS = 5; + + /** + * Represents the index feet appearance is cached at. + */ + public static final int FEET = 6; + + /** + * Represents the index hair color is cached at. + */ + public static final int HAIR_COLOR = 0; + + /** + * Represents the index torso color is cached at. + */ + public static final int TORSO_COLOR = 1; + + /** + * Represents the index leg color is cached at. + */ + public static final int LEG_COLOR = 2; + + /** + * Represents the index feet color is cached at. + */ + public static final int FEET_COLOR = 3; + + /** + * Represents the index skin color is cached at. + */ + public static final int SKIN_COLOR = 4; + + /** + * The player's stand animation. + */ + private static final int STAND_ANIM = 0x328; + + /** + * The player's turn animation for standing. + */ + private static final int STAND_TURN_ANIM = 0x337; + + /** + * The player's walk animation. + */ + public static final int WALK_ANIM = 0x333; + + /** + * The player's turn 180 degrees animation. + */ + private static final int TURN_180_AIM = 0x334; + + /** + * The player's turn 90 degrees animation. + */ + private static final int TURN_90_CW = 0x335; + + /** + * The player's turn 90 degrees animation. + */ + private static final int TUNR_90_CWW = 0x336; + + /** + * The player's run animation. + */ + private static final int RUN_ANIM = 0x338; + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/BodyPart.java b/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/BodyPart.java new file mode 100644 index 000000000..f5bf1588d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/BodyPart.java @@ -0,0 +1,100 @@ +package core.game.node.entity.player.link.appearance; + +import core.game.node.entity.player.info.login.SavingModule; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; + +/** + * Represents a body part of a player encapsulating the type and color. + * @author 'Vexia + */ +public final class BodyPart implements SavingModule { + + /** + * Represents the look value of the part. + */ + private int look; + + /** + * Represents the color of this part. + */ + private int color; + + /** + * Constructs a new {@code BodyPart} {@code Object}. + */ + public BodyPart() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BodyPart} {@code Object}. + * @param look the look. + * @param color the color. + */ + public BodyPart(final int look, final int color) { + this.look = look; + this.color = color; + } + + /** + * Constructs a new {@code BodyPart} {@code Object}. + * @param look the look. + */ + public BodyPart(final int look) { + this(look, 0); + } + + @Override + public void save(ByteBuffer buffer) { + buffer.putInt(look); + buffer.putInt(color); + } + + public void parse(JSONObject part){ + changeLook(Integer.parseInt( part.get("look").toString())); + changeColor(Integer.parseInt( part.get("color").toString())); + } + + @Override + public void parse(ByteBuffer buffer) { + changeLook(buffer.getInt()); + changeColor(buffer.getInt()); + } + + /** + * Method used to change the look value. + * @param look the look value. + */ + public void changeLook(final int look) { + this.look = look; + } + + /** + * Method used to change the color value. + * @param color the color value. + */ + public void changeColor(final int color) { + this.color = color; + } + + /** + * Gets the look. + * @return The look. + */ + public int getLook() { + return look; + } + + /** + * Gets the color. + * @return The color. + */ + public int getColor() { + return color; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/Gender.java b/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/Gender.java new file mode 100644 index 000000000..869e3ee69 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/appearance/Gender.java @@ -0,0 +1,60 @@ +package core.game.node.entity.player.link.appearance; + +/** + * Rerpresents a type of gender and it's relate base settings. + * @author 'Vexia + */ +public enum Gender { + MALE(new BodyPart[] { new BodyPart(0), new BodyPart(10), new BodyPart(18), new BodyPart(26), new BodyPart(33), new BodyPart(36), new BodyPart(42) }), + FEMALE(new BodyPart[] { new BodyPart(45), new BodyPart(1000), new BodyPart(56), new BodyPart(61), new BodyPart(68), new BodyPart(70), new BodyPart(79) }); + + /** + * Represents the default appearance of this gender. + */ + private final BodyPart[] appearanceCache; + + /** + * Constructs a new {@code Gender} {@code Object}. + */ + Gender(final BodyPart[] appearanceCache) { + this.appearanceCache = appearanceCache; + } + + /** + * Method used to generate a default appearance cache. + * @return the cache. + */ + public BodyPart[] generateCache() { + final BodyPart[] cache = new BodyPart[appearanceCache.length]; + for (int i = 0; i < cache.length; i++) { + cache[i] = new BodyPart(appearanceCache[i].getLook()); + } + return cache; + } + + /** + * Gets the appearance cache. + * @return The appearance cache. + */ + public BodyPart[] getAppearanceCache() { + return appearanceCache; + } + + /** + * Gets the representation as a byte. + * @return the byte. + */ + public byte toByte() { + return (byte) (this == MALE ? 0 : 1); + } + + /** + * Gets the gender from a byte. + * @param value the value. + * @return the gender. + */ + public Gender asByte(byte value) { + return value == 0 ? MALE : FEMALE; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/audio/Audio.java b/Server/src/main/java/Server/core/game/node/entity/player/link/audio/Audio.java new file mode 100644 index 000000000..4e4f9cd05 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/audio/Audio.java @@ -0,0 +1,116 @@ +package core.game.node.entity.player.link.audio; + +import core.game.node.entity.player.Player; + +import java.util.List; + +/** + * An audio piece to play. + * @author Vexia + */ +public class Audio { + + /** + * The default volume. + */ + public static final int VOLUME = 10; + + /** + * The id of the audio piece. + */ + private final int id; + + /** + * The volume. + */ + private final int volume; + + /** + * The delay. + */ + private final int delay; + + /** + * Constructs a new {@Code Audio} {@Code Object} + * @param id the id. + * @param volume the volume. + * @param delay the delay. + */ + public Audio(int id, int volume, int delay) { + this.id = id; + this.volume = volume; + this.delay = delay; + } + + /** + * Constructs a new {@Code Audio} {@Code Object} + * @param id the id. + * @param volume the volume. + */ + public Audio(int id, int volume) { + this(id, volume, 0); + } + + /** + * Constructs a new {@Code Audio} {@Code Object} + * @param id the id. + */ + public Audio(int id) { + this(id, VOLUME, 0); + } + + /** + * Sends an audio through the manager. + * @param player the player. + * @param global the global. + */ + public void send(Player player, boolean global) { + player.getAudioManager().send(this, global); + } + + /** + * Sends this audio. + * @param player the player. + */ + public void send(Player player) { + send(player, false); + } + + /** + * Sends the sound to a list of players. + * @param players the players. + */ + public void send(List players) { + for (Player p : players) { + if (p == null) { + continue; + } + send(p, false); + } + } + + /** + * Gets the id. + * @return the id + */ + public int getId() { + return id; + } + + /** + * Gets the volume. + * @return the volume + */ + public int getVolume() { + return volume; + } + + /** + * Gets the delay. + * @return the delay + */ + public int getDelay() { + return delay; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/audio/AudioManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/audio/AudioManager.java new file mode 100644 index 000000000..5cf516f4e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/audio/AudioManager.java @@ -0,0 +1,110 @@ +package core.game.node.entity.player.link.audio; + +import core.game.node.entity.player.Player; +import core.game.world.map.MapDistance; +import core.game.world.map.RegionManager; +import core.net.packet.PacketRepository; +import core.net.packet.context.DefaultContext; +import core.net.packet.out.AudioPacket; + +import java.util.List; + +/** + * Manages audio for a player. + * @author Vexia + */ +public class AudioManager { + + /** + * The player instance. + */ + private final Player player; + + /** + * Constructs a new {@Code AudioManager} {@Code Object} + * @param player the player. + */ + public AudioManager(Player player) { + this.player = player; + } + + /** + * Sends an audio packet. + * @param audioId the audio id. + */ + public void send(int audioId) { + send(audioId, false); + } + + /** + * Sends an audio. + * @param audioId the audio id. + * @param global the global. + */ + public void send(int audioId, boolean global) { + send(new Audio(audioId), global); + } + + /** + * Sends an audio packet. + * @param audioId the audio id. + * @param volume the volume. + */ + public void send(int audioId, int volume) { + send(new Audio(audioId, volume), false); + } + + /** + * Sends an audio packet. + * @param audioId the audio id. + * @param volume the volume. + * @param delay the delay. + */ + public void send(int audioId, int volume, int delay) { + send(new Audio(audioId, volume, delay), false); + } + + /** + * Sends an audio packet. + * @param audio the audio. + */ + public void send(Audio audio) { + send(audio, false); + } + + /** + * Sends an audio packet. + * @param audio the audio. + * @param global if globally heard. + */ + public void send(Audio audio, boolean global) { + if (global) { + send(audio, RegionManager.getLocalPlayers(player, MapDistance.SOUND.getDistance())); + return; + } + PacketRepository.send(AudioPacket.class, new DefaultContext(player, audio)); + } + + /** + * Sends an audio packet for a bunch of players. + * @param audio the audio. + * @param players the players. + */ + public void send(Audio audio, List players) { + for (Player p : players) { + if (p == null) { + continue; + } + p.getAudioManager().send(audio); + } + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/diary/AchievementDiary.java b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/AchievementDiary.java new file mode 100644 index 000000000..985cbc146 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/AchievementDiary.java @@ -0,0 +1,467 @@ +package core.game.node.entity.player.link.diary; + +import core.cache.def.impl.NPCDefinition; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; +import java.util.ArrayList; + +/** + * Represents an achievement diary. + * @author Vexia + */ +public class AchievementDiary implements SavingModule { + + /** + * The component id of the diary. + */ + public static final int DIARY_COMPONENT = 275; + + /** + * Completed levels for this diary + */ + public static final ArrayList completedLevels = new ArrayList(); + + /** + * Represents the red color code string. + */ + private static final String RED = ""; + + /** + * Represents the blue color code string. + */ + private static final String BLUE = ""; + + /** + * Represents the yellow color code string. + */ + private static final String YELLOW = ""; + + /** + * Represets the green color code string. + */ + private static final String GREEN = ""; + + /** + * The diary type. + */ + private final DiaryType type; + + /** + * The task types started. + */ + private final boolean[] levelStarted = new boolean[3]; + + /** + * If the rewards have been given. + */ + private final boolean[] levelRewarded = new boolean[3]; + + /** + * The completed achievements. + */ + private final boolean[][] taskCompleted; + + /** + * Constructs a new {@code AchievementDiary} {@code Object} + * @param type the diary type. + */ + public AchievementDiary(DiaryType type) { + this.type = type; + this.taskCompleted = new boolean[type.getAchievements().length][25]; + } + + /** + * Open the achievement diary. + * @param player the player. + */ + public void open(Player player) { + clear(player); + sendString(player, "Achievement Diary - " + type.getName(), 2); + int child = 12; + + sendString(player, (isComplete() ? GREEN : isStarted() ? YELLOW : "") + type.getName() + " Area Tasks", child++); + //child++; + + if (!type.getInfo().isEmpty() && !this.isStarted()) { + sendString(player, type.getInfo(), child++); + child += type.getInfo().split("

").length; + } + child++; + + boolean complete; + String line; + for (int level = 0; level < type.getAchievements().length; level++) { + sendString(player, getStatus(level) + getLevel(level) + "", child++); + child++; + for (int i = 0; i < type.getAchievements(level).length; i++) { + complete = isComplete(level, i); + line = type.getAchievements(level)[i]; + if (line.contains("

")) { + String[] lines = line.split("

"); + for (String l : lines) { + sendString(player, complete ? "" + l : l, child++); + } + } else { + sendString(player, complete ? "" + line : line, child++); + } + sendString(player, "*", child++); + } + child++; + } + // sendString(player, builder.toString(), 11); + //Changes the size of the scroll bar + //player.getPacketDispatch().sendRunScript(1207, "i", new Object[] { 330 }); + //sendString(player, builder.toString(), 11); + if (!player.getInterfaceManager().isOpened()) { + player.getInterfaceManager().open(new Component(DIARY_COMPONENT)); + } + } + + /** + * Clears the diary screen. + * @param player the player. + */ + private void clear(Player player) { + for (int i = 0; i < 311; i++) { + player.getPacketDispatch().sendString("", DIARY_COMPONENT, i); + } + } + + @Override + public void save(ByteBuffer buffer) { + buffer.put((byte) 1); + for (int i = 0; i < 3; i++) { + buffer.put((byte) (levelStarted[i] ? 1 : 0)); + } + buffer.put((byte) 2).put((byte) taskCompleted.length); + for (int i = 0; i < taskCompleted.length; i++) { + buffer.put((byte) type.getAchievements(i).length); + for (int x = 0; x < type.getAchievements(i).length; x++) { + buffer.put((byte) (taskCompleted[i][x] ? 1 : 0)); + } + } + buffer.put((byte) 3).put((byte) levelRewarded.length); + for (int i = 0; i < levelRewarded.length; i++) { + buffer.put((byte) (levelRewarded[i] ? 1 : 0)); + } + buffer.put((byte) 0); + } + + public void parse(JSONObject data){ + JSONArray startedArray = (JSONArray) data.get("startedLevels"); + for(int i = 0; i < startedArray.size(); i++){ + levelStarted[i] = (boolean) startedArray.get(i); + } + JSONArray completedArray = (JSONArray) data.get("completedLevels"); + for(int i = 0; i < completedArray.size(); i++){ + JSONArray level = (JSONArray) completedArray.get(i); + boolean completed = true; + for(int j = 0; j < level.size(); j++){ + taskCompleted[i][j] = (boolean) level.get(j); + if(!taskCompleted[i][j]){completed = !completed;} + completedLevels.add(i); + } + } + JSONArray rewardedArray = (JSONArray) data.get("rewardedLevels"); + for(int i = 0; i < rewardedArray.size(); i++){ + levelRewarded[i] = (boolean) rewardedArray.get(i); + } + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode, size; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + for (int i = 0; i < 3; i++) { + levelStarted[i] = buffer.get() == 1; + } + break; + case 2: + size = buffer.get() & 0xFF; + for (int i = 0; i < size; i++) { + int size_ = buffer.get() & 0xFF; + for (int x = 0; x < size_; x++) { + taskCompleted[i][x] = buffer.get() == 1; + } + } + break; + case 3: + size = buffer.get() & 0xFF; + for (int i = 0; i < size; i++) { + levelRewarded[i] = buffer.get() == 1; + } + break; + } + } + } + + /** + * Draws the status of the diary. + * @param player the player. + */ + public void drawStatus(Player player) { + if (isStarted()) { + player.getPacketDispatch().sendString((isComplete() ? GREEN : YELLOW) + type.getName(), 259, type.getChild()); + for (int i = 0; i < 3; i++) { + player.getPacketDispatch().sendString((isComplete(i) ? GREEN : isStarted(i) ? YELLOW : "") + getLevel(i), 259, type.getChild() + (i + 1)); + } + } + } + + /** + * Induces a task update. + * @param player the player. + * @param level the level. + * @param index the index of the task. + * @param complete if it's completed. + */ + public void updateTask(Player player, int level, int index, boolean complete) { + if (!levelStarted[level]) { + levelStarted[level] = true; + } + if (!complete) { + player.sendMessage("Well done! A " + type.getName() + " task has been updated."); + } else { + taskCompleted[level][index] = true; + int tempLevel = this.type == DiaryType.LUMBRIDGE ? level - 1 : level; + player.sendMessages("Well done! You have completed " + + (tempLevel == -1 ? "a beginner" : tempLevel == 0 ? "an easy" : tempLevel == 1 ? "a medium" : "a hard") + + " task in the " + type.getName() + " area. Your", "Achievement Diary has been updated."); + } + if (isComplete(level)) { + player.sendMessages("Congratulations! You have completed all of the " + getLevel(level).toLowerCase() + + " tasks in the " + type.getName() + " area.", "Speak to " + + NPCDefinition.forId(type.getNpc(level)).getName() + " to claim your reward."); + } + drawStatus(player); + } + + public void finishTask(Player player, int level, int index) { + if (!this.isComplete(level, index)) { + this.updateTask(player, level, index, true); + boolean complete = true; + for(int i = 0; i < taskCompleted[level].length; i++){ + if(!taskCompleted[level][i]) { + complete = false; + break; + } + } + if(complete){ + completedLevels.add(level); + } else if(completedLevels.contains(level)) completedLevels.remove(level); + } + } + + /** + * Resets a task to un-start + */ + public void resetTask(Player player, int level, int index) { + taskCompleted[level][index] = false; + if (!isStarted(level)) { + this.levelStarted[level] = false; + } + if (!isComplete(level)) { + this.levelRewarded[level] = false; + } + drawStatus(player); + } + + public boolean checkComplete(DiaryLevel level){ + if(type != DiaryType.LUMBRIDGE && level == DiaryLevel.BEGINNER){ + return false; + } + + if(level == DiaryLevel.BEGINNER){ + return completedLevels.contains(level.ordinal()); + } + + return completedLevels.contains(level.ordinal() - 1); + } + + /** + * Sends a string on the diary interface. + * @param player the player. + * @param string the string. + * @param child the child. + */ + private void sendString(Player player, String string, int child) { + player.getPacketDispatch().sendString(string.replace("", BLUE).replace("", RED), DIARY_COMPONENT, child); + } + + /** + * Sets the diary for the level as started. + * @param level the level. + */ + public void setLevelStarted(int level) { + this.levelStarted[level] = true; + } + + /** + * Sets an achievement as completed. + * @param level the level. + * @param index the index. + */ + public void setCompleted(int level, int index) { + this.taskCompleted[level][index] = true; + } + + /** + * Checks if the achievement level is started. + * @param level the level. + * @return {@code True} if so. + */ + public boolean isStarted(int level) { + return this.levelStarted[level]; + } + + /** + * Checks if the diary is started. + * @return {@code True} if so. + */ + public boolean isStarted() { + for (int j = 0; j < type.getLevelNames().length; j++) { + if (isStarted(j)) { + return true; + } + } + return false; + } + + /** + * Checks if an achievement task is completed. + * @param level the level. + * @param index the index. + * @return {@code True} if an achievement is completed. + */ + public boolean isComplete(int level, int index) { + return taskCompleted[level][index]; + } + + /** + * Checks if the achievement level is completed. + * @param level the level. + * @return {@code True} if so. + */ + public boolean isComplete(int level) { + for (int i = 0; i < type.getAchievements(level).length; i++) { + if (!taskCompleted[level][i]) { + return false; + } + } + return true; + } + + public boolean isComplete(int level, boolean cumulative) { + if (isComplete(level)) { + return !cumulative || level <= 0 || isComplete(level - 1, true); + } else { + return false; + } + } + + /** + * Checks if an achievement diary is complete. + * @return {@code True} if completed. + */ + public boolean isComplete() { + for (int i = 0; i < taskCompleted.length; i++) { + for (int x = 0; x < type.getAchievements(i).length; x++) { + if (!taskCompleted[i][x]) { + return false; + } + } + } + return true; + } + + /** + * Gets the level of completion. + * @return the level. + */ + public int getLevel() { + return isComplete(2) ? 2 : isComplete(1) ? 1 : isComplete(0) ? 0 : -1; + } + + /** + * Gets the level of reward. + * @return the level. + */ + public int getReward() { + return isLevelRewarded(2) ? 2 : isLevelRewarded(1) ? 1 : isLevelRewarded(0) ? 0 : -1; + } + + /** + * Gets the level string. + * @param level the level. + * @return the string format. + */ + public String getLevel(int level) { + return type.getLevelNames()[level]; + } + + /** + * Gets the status for a level of completion of the achievement. + * @param level the level. + * @return the string color status. + */ + public String getStatus(int level) { + return !isStarted(level) ? RED : isComplete(level) ? GREEN : YELLOW; + } + + /** + * Sets the level as rewarded. + * @param level the level. + */ + public void setLevelRewarded(int level) { + this.levelRewarded[level] = true; + } + + /** + * Checks if the reward has been given. + * @param level the level. + * @return {@code True} if so. + */ + public boolean isLevelRewarded(int level) { + return levelRewarded[level]; + } + + /** + * Gets the completed. + * @return the completed + */ + public boolean[][] getTaskCompleted() { + return taskCompleted; + } + + /** + * Gets the type. + * @return the type + */ + public DiaryType getType() { + return type; + } + + /** + * Gets the started. + * @return the started + */ + public boolean[] getLevelStarted() { + return levelStarted; + } + + /** + * Gets the rewarded. + * @return the rewarded + */ + public boolean[] getLevelRewarded() { + return levelRewarded; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/diary/AchievementDiaryManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/AchievementDiaryManager.java new file mode 100644 index 000000000..6374019e5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/AchievementDiaryManager.java @@ -0,0 +1,283 @@ +package core.game.node.entity.player.link.diary; + +import core.game.component.Component; +import core.game.container.impl.EquipmentContainer; +import core.game.system.SystemLogger; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import core.game.node.entity.skill.smithing.smelting.Bar; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.item.Item; + +import java.nio.ByteBuffer; + +/** + * Manages the achievement diary of a player. + * @author Vexia + */ +public class AchievementDiaryManager implements SavingModule { + + /** + * The achievement diarys. + */ + private final AchievementDiary[] diarys = new AchievementDiary[] { + new AchievementDiary(DiaryType.KARAMJA), + new AchievementDiary(DiaryType.VARROCK), + new AchievementDiary(DiaryType.LUMBRIDGE), + new AchievementDiary(DiaryType.FALADOR), + new AchievementDiary(DiaryType.FREMENNIK), + new AchievementDiary(DiaryType.SEERS_VILLAGE) + }; + + /** + * The player instance. + */ + private final Player player; + + /** + * Constructs a new + * @param player the player. + */ + public AchievementDiaryManager(Player player) { + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + buffer.put((byte) 1).put(((byte) diarys.length)); + for (AchievementDiary diary : diarys) { + diary.save(buffer); + } + buffer.put((byte) 0); + } + + public void parse(JSONArray data){ + for(int i = 0; i < data.size(); i++){ + JSONObject diary = (JSONObject) data.get(i); + String name = (String) diary.keySet().toArray()[0]; + name = name.replace("_","' "); + for (int ii = 0; ii < diarys.length; ii++) { + if (diarys[ii].getType().getName().equalsIgnoreCase(name)) { + diarys[ii].parse((JSONObject) diary.get(name.replace("' ","_"))); + } + } + } + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + int length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + diarys[i].parse(buffer); + } + break; + } + } + } + + /** + * Opens the achievement diary tab. + */ + public void openTab() { + player.getInterfaceManager().openTab(2, new Component(259)); + for (AchievementDiary diary : diarys) { + diary.drawStatus(player); + } + } + + /** + * Induces a task update. + * @param player the player. + * @param type the diary type. + * @param level the level. + * @param index the index of the task. + * @param complete if it's completed. + */ + public void updateTask(Player player, DiaryType type, int level, int index, boolean complete) { + getDiary(type).updateTask(player, level, index, complete); + } + + public void finishTask(Player player, DiaryType type, int level, int index) { + if(!player.isArtificial()) { + getDiary(type).finishTask(player, level, index); + } + } + + /** + * Checks if a task has been completed. + * @param type the diary type. + * @param level the level. + * @param index the index. + * @return {@code True} if completed. + */ + public boolean hasCompletedTask(DiaryType type, int level, int index) { + return getDiary(type).isComplete(level, index); + } + + /** + * Sets the diary at a level as started. + * @param type the type of diary. + * @param level the level. + */ + public void setStarted(DiaryType type, int level) { + getDiary(type).setLevelStarted(level); + } + + /** + * Sets the diarys achievement as completed. + * @param type the type. + * @param level the level. + * @param index the index. + */ + public void setCompleted(DiaryType type, int level, int index) { + getDiary(type).setCompleted(level, index); + } + + /** + * Gets the achievement diary for the type. + * @param type the type. + * @return the diary object. + */ + public AchievementDiary getDiary(DiaryType type) { + if (type == null) { + return null; + } + for (AchievementDiary diary : diarys) { + if (diary.getType() == type) { + return diary; + } + } + return null; + } + + /** + * Gets the karamaja glove level. + * @return the level of the glove. + */ + public int getKaramjaGlove() { + if (!hasGlove()) { + return -1; + } + for (int i = 0; i < 3; i++) { + if (player.getEquipment().containsItem(DiaryType.KARAMJA.getRewards()[i][0])) { + return i; + } + } + return -1; + } + + /** + * Gets the varrock armour level. + * @return the level of the armour. + */ + public int getArmour() { + if (!hasArmour()) { + return -1; + } + for (int i = 0; i < 3; i++) { + if (player.getEquipment().containsItem(DiaryType.VARROCK.getRewards()[i][0])) { + return i; + } + } + return -1; + } + + /** + * Checks the if the reward is valid for double. + * @param reward the reward. + * @return {@code True} if validated. + */ + public boolean checkMiningReward(int reward) { + int level = player.getAchievementDiaryManager().getArmour(); + if (level == -1) { + return false; + } + if (reward == 453) { + return true; + } + return level == 0 && reward <= 442 || level == 1 && reward <= 447 || level == 2 && reward <= 449; + } + + /** + * Checks the if the reward is valid for double. + * @param type the bar type. + * @return {@code True} if validated. + */ + public boolean checkSmithReward(Bar type) { + int level = player.getAchievementDiaryManager().getArmour(); + if (level == -1) { + return false; + } + return level == 0 && type.ordinal() <= Bar.STEEL.ordinal() || level == 1 && type.ordinal() <= Bar.MITHRIL.ordinal() || level == 2 && type.ordinal() <= Bar.ADAMANT.ordinal(); + } + + /** + * Checks if the player has karamaja gloves. + * @return the gloves. + */ + public boolean hasGlove() { + Item glove = player.getEquipment().get(EquipmentContainer.SLOT_HANDS); + return glove != null && (glove.getId() == DiaryType.KARAMJA.getRewards()[0][0].getId() || glove.getId() == DiaryType.KARAMJA.getRewards()[1][0].getId() || glove.getId() == DiaryType.KARAMJA.getRewards()[2][0].getId()); + } + + /** + * Checks if the player has varrock armour. + * @return {@code True} if so. + */ + public boolean hasArmour() { + Item plate = player.getEquipment().get(EquipmentContainer.SLOT_CHEST); + return plate != null && (plate.getId() == DiaryType.VARROCK.getRewards()[0][0].getId() || plate.getId() == DiaryType.VARROCK.getRewards()[1][0].getId() || plate.getId() == DiaryType.VARROCK.getRewards()[2][0].getId()); + } + + /** + * Checks if a diary is complete. + * @param type the diary type. + * @return {@code True} if so. + */ + public boolean isComplete(DiaryType type) { + return diarys[type.ordinal()].isComplete(); + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the diarys. + * @return the diarys + */ + public AchievementDiary[] getDiarys() { + return diarys; + } + + /** + * Removes rewards from player + * obtained via old incomplete diaries + */ + public void resetRewards() { + for (AchievementDiary diary: diarys) { + for (Item[] axis : diary.getType().getRewards()) { + for (Item item : axis) { + if (player.getInventory().containsItem(item)) { + player.getInventory().remove(item); + } + if (player.getBank().containsItem(item)) { + player.getBank().remove(item); + } + if (player.getEquipment().containsItem(item)) { + player.getEquipment().remove(item); + } + } + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryLevel.kt b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryLevel.kt new file mode 100644 index 000000000..7c4127199 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryLevel.kt @@ -0,0 +1,8 @@ +package core.game.node.entity.player.link.diary + +enum class DiaryLevel { + BEGINNER, + EASY, + MEDIUM, + HARD +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryType.java b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryType.java new file mode 100644 index 000000000..ce80fe232 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/DiaryType.java @@ -0,0 +1,629 @@ +package core.game.node.entity.player.link.diary; + +import core.tools.Items; +import core.game.node.item.Item; + +/** + * An achievement diary type. + * + * @author afaroutdude + */ +// TODO reset all players tasks upon commit to master +// TODO figure out secondary rewards for karamja, and fremennik +public enum DiaryType { + KARAMJA("Karamja", 11, + new String[]{"Easy", "Medium", "Hard"}, + new String[][]{ + { + "Pick 5 bananas from the plantation located east of the

volcano", + "Use the rope swing to travel to the small island north-west

of Karamja, where the moss giants are", + "Mine some gold from the rocks on the north-west

peninsula of Karamja", + "Travel to Port Sarim via the dock, east of Musa Point", + "Travel to Ardougne via the port near Brimhaven", + "Explore Cairn Island to the west of Karamja", + "Use the Fishing spots north of the banana plantation", + "Collect 5 seaweed from anywhere on Karamja", + "Attempt the TzHaar Fight Pits or Fight Cave", + "Kill a Jogre in the Pothole dungeon" + }, + { + "Claim a ticket from the Agility arena in Brimhaven", + "Discover hidden wall in the dungeon below the volcano", + "Visit the Isle of Crandor via the dungeon below the volcano", + "Use Vigroy and Hajedy's cart service", + "Earn 100% favour in the village of Tai Bwo Wannai Cleanup", // todo tai bwo wannai cleanup + "Cook a spider on stick", // todo tai bwo wannai cleanup + "Charter the Lady of the Waves from Cairn Isle to Port Khazard", // todo verify + "Cut a log from a teak tree", + "Cut a log from a mahogany tree", + "Catch a karambwan", // todo need Tai Bwo Wannai Trio + "Exchange gems, a gout tuber, trading sticks for a machete", // todo + "Use the gnome glider to travel to Karamja", + "Grow a healthy fruit tree in the patch near Brimhaven", // todo verify + "Trap a Horned Graahk", // todo need to implement pitfall trapping + "Chop the vines to gain deeper access to Brimhaven Dungeon", + "Cross the lava using the stepping stones within Brimhaven

Dungeon", + "Climb the stairs within Brimhaven Dungeon", + "Charter a ship from the shipyard in the far east of Karamja", + "Mine a red topaz from a gem rock" + }, + { + "Become the Champion of the Fight Pits", + "Successfully kill a Ket-Zek in the Fight Caves", + "Eat an oomlie wrap", + "Craft some nature runes", + "Cook a karambwan thoroughly", // todo need Tai Bwo Wannai Trio + "Kill a deathwing in the dungeon under the Kharazi Jungle", // todo need legends quest + "Use the crossbow shortcut south of the volcano", + "Collect five palm leaves", + "Be assigned a Slayer task by Duradel or Lapalok in Shilo

Village.", + "Kill a metal dragon in Brimhaven Dungeon." + } + }, + // Karamja gloves 1-3 + // 1k xp 30+, 5k xp any?, 10k xp any? + new Item[][]{ + {new Item(Items.KARAMJA_GLOVES_1_11136), new Item(Items.ANTIQUE_LAMP_11137)}, + {new Item(Items.KARAMJA_GLOVES_2_11138), new Item(Items.ANTIQUE_LAMP_11139)}, + {new Item(Items.KARAMJA_GLOVES_3_11140), new Item(Items.ANTIQUE_LAMP_11141)} + }, + "To start marking off tasks in your journal, speak to Pirate

Jackie the Fruit in Brimhaven, Kaleb Paramay in Shilo

Village or one of the Jungle Foresters north of the

Kharazi Jungle.", + new int[]{1055, 512, 401} + /** + * Secondary rewards + * Easy + * - cheaper prices on karamja and cheaper ship rides + * Medium + * - 10% extra agility xp in arena + * - 10% extra xp redeeming tickets + * Hard + * - Gem mine ladder access // todo + * - Teleport to underground gem mine // todo + */ + ), + // https://2009scape.wiki/w/Varrock_achievements?oldid=891055 + VARROCK("Varrock", 15, + new String[]{"Easy", "Medium", "Hard"}, + new String[][]{ // TODO verify implementation ingame + { + "Have Thessalia show you what outfits you can wear", + "Have Aubury teleport you to the essence mine", + "Mine some Iron in the south east mining patch near Varrock", + "Make a plank at the sawmill", + "Enter the second level of the Stronghold of Security", + "Jump over the fence south of Varrock", + "Chop down a dying tree in the Lumber Yard", + "Buy a copy of the Varrock Herald", + "Give a stray dog a bone", + "Spin a bowl on the pottery wheel and fire it in the oven in

Barbarian Village", + "Enter Edgeville Dungeon using the entrance to the south of

Edgeville", + "Move our player-owned house portal to a different location

using the Varrock estate agent", + "Speak to Haig Halen after obtaining at least 50 kudos", //TODO need to implement kudos + "Enter the Earth Altar using an earth tiara or talisman", + "Have Elsie tell you a story", + "Mine some limestone near Paterdomus, the temple to the east

of Varrock", + "Catch a trout in the river to the east of Barbarian Village.", + "Venture through the cobwebbed corridor in Varrock Sewers", + "Find the highest point in Varrock" + }, + { + "Have the Apothecary in Varrock make you a strength potion.", + "Enter the Champions Guild.", + "Take the Dagon'Hai shortcut to the chaos portal", + "Get a full complement of rats on your rat pole", // TODO need rat catchers to start + "Escape from the spider lair in Varrock Sewers with some red

spiders eggs", + "Use the spirit tree north of Varrock", + "Perform the 4 emotes from the Stronghold of Security.", + "Select a colour for a new kitten", // TODO need ring of charos(a) and garden of tranquility to start + "Use the shortcut under the wall, north-west of the Grand

Exchange", + "Enter the A Soul's Bane rift", + "Teleport to the Digsite using a Digsite pendant", // TODO need Digsite and museum + "Craft an earth tiara on the Earth Altar", + "Pickpocket a guard in the Varrock Palace courtyard", + "Use the teleport to Varrock spell", + "Get a Slayer task from Vannaka", + "Buy twenty mahogany planks from the Sawmill Operator in one

transaction", + "Pick a fruit from the White Tree", // TODO Garden of Tranquility + "Use the hot air balloon to travel from Varrock to somewhere

else", // TODO Enlightened Journey + "Get a cat training medal from Gertrude", // TODO need rat catchers and cats fixed + "Dial to the fairy ring west of Varrock", + "Browse through Oziach's Armour Shop" + }, + { + "Pick poison ivy from your bush Farming patch in Varrock

(west of Champions' Guild)", + "Use the pipe shortcut in Varrock Sewers, near the moss

giants", + "Trade furs with the Fancy Dress Seller for a spottier cape", + "Smith an adamantite medium helm on the south-east anvil in

Varrock, next to Aubury's Rune Shop", + "Speak to Orlando Smith when you have achieved 153 kudos", // TODO need to implement kudos + "Talk to Romily Weaklax and give him a wild pie", + "Craft an air battlestaff", + "Give your player-owned house a fancy stone or tropical wood

finish at the Varrock estate agent's", + "Make a Varrock teleport tablet on a mahogany lectern", + "Obtain a new set of Family Crest gauntlets from Dimintheis", // TODO need family crest + "Make a Waka Canoe near Edgeville", + "Use the Home Teleport spell in the Ancient Magicks spellbook

to teleport to Edgeville", + "Use the skull sceptre to teleport to Barbarian Village" + } + }, + new Item[][]{ + {new Item(11756), new Item(11753)}, + {new Item(11757), new Item(11754)}, + {new Item(11758), new Item(11755)} + }, + "To start marking off tasks in your journal, speak to

Rat Burgiss south of the city, Reldo in the palace

library, or Vannaka in the sewers.", // todo made up, can't find source + // Varrock Armour 1-3 + // 1k xp 30 or higher, 5k xp 40 or higher, 10k 50 or higher + // Rat Burgiss, Reldo (has an NPC config...), Vannaka + new int[]{5833, 2660, 1597} + /** + * Secondary rewards + * Easy + * - chance of smelting two bars at once up to and including steel in edgeville furnace + * - chance of mining two ores at once when mining ores up to and including coal + * - better prices when buying and selling in Varrock Area // todo + * - 16 battlestaffs may be bought from Zaff's staffs store daily (8 + 8) + * - Option to change Varrock tele location to the GE by talking to Rat Burgiss // todo + * Medium + * - chance of smelting two bars at once up to and including Mithril in edgeville furnace + * - chance of mining two ores at once when mining ores up to and including mithril + * - chance of smithing at a slightly faster rate // todo + * - 32 battlestaffs may be bought from Zaff's staffs store daily (8 + 24) + * - Option to change Varrock tele location to the GE by talking to Reldo // todo + * Hard + * - chance of smelting two bars at once up to and including Adamantite in edgeville furnace + * - chance of mining two ores at once when mining ores up to and including adamantite + * - access to cook's guild 1st floor bank area + * - use varrock armour to get into cook's guild rather than chef's hat + * - 64 battlestaffs may be bought from Zaff's staffs store daily (8 + 56) + * - Option to change Varrock tele location to the GE by talking to Vannaka // todo + */ + ), + // https://2009scape.wiki/w/Lumbridge_achievements?oldid=866361 + LUMBRIDGE("Lumbridge", 2, + new String[]{"Beginner", "Easy", "Medium"}, + new String[][]{ + { + "Climb to the highest point in Lumbridge", + "Raise the flag on the roof of the Lumbridge Bank", + "Speak to the Duke of Lumbridge", + "Speak with the Doomsayer about the Warning System", + "Pass through the Al Kharid gate", + "Mine some clay in the Mining patch north of the Champions'

Guild", + "Make some soft clay in the Barbarian Village", + "Fire a pot in the kiln in the Barbarian Village potter's

house", + "Enter the courtyard of the spooky mansion in Draynor Village", + "Visit the Draynor Village market", + "Find out about the Rules of Conduct from the Draynor

Town Crier", + "Climb to the top of the Wizards' Tower", + "Mine some copper in the Mining spot to the south-east of

Lumbridge Swamp", + "Catch some shrimp in the Fishing spot to the east of

Lumbridge Swamp", + "Have the Fishing Tutor send you on an errand", + "Look through Father Aereck's selection of gravestones", + "Play the organ in the Lumbridge Church", + "Find out about the Stronghold of Security from the Lumbridge

Guide", + "Browse the Lumbridge General Store", + "Visit Fred the Farmer's chicken and sheep farm", + "Grind some flour in the windmill north of Lumbridge" + }, + { + "Mine some iron ore from the Al Kharid Mining spot", + "Obtain a cow-hide from a cow in the field north-east of

Lumbridge", + "Have Ellis tan your cow-hide to make soft leather at his

shop in Al Kharid", + "Craft a pair of soft leather gloves", + "Catch a pike in the river to the east of Lumbridge Castle", + "Smelt a steel bar in the Lumbridge furnace", + "Search the shed in Lumbridge Swamp", + "Kill a giant rat in Lumbridge Swamp", + "Cut down a dead tree in Lumbridge Swamp", + "Light a campfire from normal logs in Lumbridge Swamp", + "Cook some rat meat on a campfire in Lumbridge Swamp", + "Craft a water rune at the Water Altar", + "Get a replacement Ghostspeak Amulet from Father Urhney", + "Taunt the demon at the top of the Wizard's Tower", + "Have Sedridor teleport you to the Essence Mine", + "Access the bank in Draynor Village", + "Have the Wise Old man check your bank for unnecessary

quest-related items", + "Discover what the Wise Old man is watching through his

telescope", + "Defeat a zombie in the sewers under the jail" + }, + { + "Smith a steel longsword on the anvil in the jailhouse

sewers", + "Take a ride on Gnomecopter", + "Use the teleport Lumbridge spell", + "Light a willow log fire in Lumbridge Castle courtyard", + "Cook a lobster on the range in Lumbridge Castle kitchen", + "Obtain an Anti-dragonbreath shield from Duke Horacio", + "Cut a willow tree, east of Lumbridge Castle", + "Smelt a silver bar in the Lumbridge furnace", + "Craft a holy symbol in the Lumbridge furnace", + "Catch a salmon in the river to the east of Lumbridge Castle", + "Mine some silver from the mining spot north of Al Kharid", + "Mine some coal in the Mining spot south-west of Lumbridge

Swamp" + } + }, + // Explorer's Rings 1-3 + // 500 any, 1k xp 30 or higher, 1.5k xp 35 or higher + new Item[][]{ + {new Item(13560), new Item(11185)}, + {new Item(13561), new Item(11186)}, + {new Item(13562), new Item(11187)}}, + "To start marking off tasks in your journal, speak to

Explorer Jack near the Lumbridge General Store, Bob

in his axe store or Ned in his house in Draynor Village.", // todo made up, can't find source + // Explorer Jack, Bob, Ned // todo more accurate dialogues for these guys + new int[]{7969, 519, 743} + /** + * Secondary Rewards + * Beginner + * - Explorer's ring 1 when worn replenishes 50% run energy per charge once a day + * - Explore emote unlocked + * Easy + * - 50% run energy twice a day + * - Low Level Alchemy 30 times per day without runes + * - 10% Chance of extra rune (per essence) - air,earth,fire,water + * Medium + * - 50% run energy thrice a day + * - 30 low alch per day + * - 10% Chance of extra rune (per essence) - air,earth,fire,water + * - cabbage port + */ + + ), + // https://2009scape.wiki/w/Falador_achievements?oldid=900390 + FALADOR("Falador", 23, + new String[]{"Easy", "Medium", "Hard"}, + new String[][]{ + { + "Buy a Farming amulet from Sarah on the farm north of Port

Sarim", + "Buy a stat-boosting beer from a waitress in the Rising Sun

Tavern", + "Buy a black chainbody from Wayne's Chains, and try it on in

the shop", + "Climb to the top of the White Knights' Castle", + "Discover your family crest from Sir Renitee", + "Enter the mole's lair under Falador Park", + "Feed Ridgeley, the hairdresser's pet", + "Fill a bucket from the pump north of the west Falador bank", + "Heal an elemental wizard by casting an appropriate elemental

spell on him (Air, Water, Earth, Fire)", + "Kill a duck in Falador Park", + "Kill a highwayman on the road south of Falador", + "Make an air tiara", + "Pop a party balloon", + "Recharge your Prayer points at the altar south-west of Port

Sarim", + "Take the boat to Entrana" + }, + { + "Craft a Fruit basket using the loom at the farm north of

Port Sarim", + "Crawl under Falador's south wall", + "Grapple up, and then jump off the north Falador wall", + "Increase your reputation with the White Knights by killing

a black knight", + "Kill an ice giant in the Asgarnian Ice Dungeon", + "Light a bullseye lantern in the chemist's", + "Pickpocket a Falador guard", + "Place a scarecrow to protect your sweetcorn as it grows in

the patch north of Port Sarim", + "Salute Sir Tiffy Cashien while wearing full initiate armour", + "Smith blurite crossbow limbs on Thurgo's anvil", + "Travel from Port Sarim to Musa Point for free (with a little

help from Charos)", // TODO need Creature of Fenkenstrain to actually obtain Charos ring + "Visit the Port Sarim rat pits" + }, + { + "Ascend the Dark Wizards' Tower while wearing full proselyte

armour", + "Change your family crest to the Saradomin symbol", + "Craft 196 or more air runes simultaneously", + "Cut down a Yew tree or Magic tree that you grew in Falador

Park", + "Dial to the fairy ring on Mudskipper Point", + "Dye a cape pink with Pink dye from Betty in Port Sarim", + "Enter the Mining Guild", + "Kill a mogre at Mudskipper Point", + "Kill a skeletal wyvern in the Asgarnian Ice Dungeon", + "Summon an Ibis in the Port Sarim fish store" + } + }, + // Falador Shields 1-3 + // 1k XP, 5k XP, 10k XP + new Item[][]{ + {new Item(14577), new Item(14580)}, + {new Item(14578), new Item(14581)}, + {new Item(14579), new Item(14582)} + }, + "To start marking off tasks in your journal, speak to

Redbeard Frank outside the bar in Port Sarim, The

Chemist west of Rimmington, or Sir Vyvin's Squire in the

Falador Castle courtyard.", // todo made up, can't find source + // Redbeard Frank, Chemist, Squire + new int[]{375, 367, 606} + /** + * Secondary Rewards + * Easy + * - shield 1 restores 25% prayer daily, +3 prayer bonus + * - shields have emotes when you wield and hit operate + * Medium + * - shield 2 restores 50% prayer daily, +5 prayer bonus + * - 10% extra farming xp north of port sarim + * Hard + * - shield 3 restores 100% prayer daily, +7 prayer bonus + * - can trade Mole Skins in to Wyson in exchange for white lily seeds and birds nest + */ + ), + // https://2009scape.wiki/w/Fremennik_achievements?oldid=877418 + FREMENNIK("Fremennik", 19, + new String[]{"Easy", "Medium", "Hard"}, + new String[][]{ + { + "Kill a cave crawler in the Fremennik Slayer Dungeon", // TODO + "Kill five rock crabs on the shore near Rellekka or on

Waterbirth Island", // TODO + "Find the highest tree on the Fremennik mainland", // TODO + "View the rewards in the Barbarian Assault tutorial", // TODO + "Speak to Otto Godblessed about barbarian training", // TODO + "Collect three seaweed from the shore north-east of Rellekka", // TODO + "Find the Hunting Expert on the northern ice plains", // TODO + "Catch a fish off one of Rellekka's piers", // TODO + "Recharge your Summoning points near Rellekka's gate", // TODO + "Kill an adult black unicorn" // TODO + }, + { + "Learn of the history of the Fremennik and the Outerlanders

from Chieftain Brundt", // TODO + "Watch a shouting match between Fremennik Isles tower guards

(the guards can be found between Jatizso and Neitiznot in

one of the towers)", // TODO + "Interact with a Pet rock", // TODO + "Make three vials in the furnace building at Rellekka", // TODO + "Charm the Fossegrimen into accepting a raw bass", // TODO + "Wear yak-hide armour and kill an ice troll", // TODO + "Make cheese in the dairy churn in Rellekka", // TODO + "Use a fairy ring to appear on a mountaintop, near the

windswept tree", // TODO + "Look at Yrsa's options for recolouring your boots in her

clothes shop in Rellekka", // TODO + "Successfully hunt a sabre-toothed kyatt", // TODO + "Steal a fish from the fishing stall in the Rellekka

marketplace" // TODO + }, + { + "Kill three dagannoths in the first layer of the Waterbirth

Island Dungeon", // TODO + "Wear rockshell, spined or skeletal armour and have the

locals use an honorific with your Fremennik name", // TODO + "Complete the Barbarian Outpost Agility Course", // TODO + "Mine pure essence on Lunar Isle", // TODO + "Make a barbarian pyre ship from arctic pine", // TODO + "Catch a tuna without a harpoon", // TODO + "Bake a pie using Magic", // TODO + "Kill a Mithril dragon", // TODO + "Get mahogany from your Etceterian subjects" // TODO + } + }, + // Fremennik sea boots 1-3 + // 5k, 10k, 15k xp + new Item[][]{ + {new Item(14571), new Item(14574)}, + {new Item(14572), new Item(14575)}, + {new Item(14573), new Item(14576)} + }, + "", // todo + // Council Workman, Yrsa, Advisor Ghrim // TODO dialogues for all these + new int[]{1287, 1301, 1375} + ), + // https://2009scape.wiki/w/Seers%27_Village_achievements?oldid=900527 + // https://www.youtube.com/watch?v=chYdp5HKJAg easy + SEERS_VILLAGE("Seers' Village", 27, + new String[]{"Easy", "Medium", "Hard"}, + new String[][]{ + { + "Pick five flax from the flax field", + "Walk clockwise around the big mysterious statue", + "Have Sir Galahad make you a cup of tea", + "Take the poison chalice to King Arthur", + "Spin five bow strings", + "Fill five pots with flour from the Sinclair Mansion", + "Give five locals a glass of cider in the Forester's Arms", + "Plant some jute", + "Use the churn in the Sinclair Mansion garden", + "Buy a candle from the candle-maker", + "Pray at the Seers' Village altar", + "Catch a mackerel" + }, + { + "Use the Sinclair Mansion to Fremennik agility shortcut", + "Talk to Thormac the Sorcerer about making mystic staves", + "Transport a full load of coal to Seers' Village", + "Find the highest point in Seers' Village", + "Defeat each type of elemental in the Elemental Workshop", + "Teleport to Camelot", + "Kill one guard on each tower of the Ranging Guild using a longbow", + "Have the Ranging Guild competition judge congratulate you

for acquiring over 1,000 Archery tickets", + "Buy something from the ticket exchange in the Ranging Guild", + "Use a familiar to make a fire from maple logs within Seers'

Village", + "Get a pet fish from Harry", + "Catch and cook a bass in Catherby" + }, + { + "Teleport to the Ranging Guild", + "Cut five sets of yew logs", + "Fletch a magic shortbow in the Seers' Village Bank", + "Enter the Seers' Village courthouse with your Piety prayer

turned on", + "Use the fairy ring in McGrubor's Wood", + "Burn a magic log in Seers' Village", + "High Alch a magic shortbow in the Seers' Village bank", + "Catch five sharks in Catherby", + "Cook 5 sharks in Catherby using the Cooking gauntlets", + "Charge five water orbs in one go", + "Use the grapple shortcut to get from the water obelisk

island to Catherby shore" + } + }, + // Seers Headbad 1-3 + // 1k 30 and up, 5k, 10k xp lamps + new Item[][]{ + {new Item(14631), new Item(14633)}, + {new Item(14631), new Item(14634)}, + {new Item(14631), new Item(14635)} + }, + "To start marking off tasks in your journal, speak to

any seer in Seers' Village, Stankers by the coal

trucks or Sir Kay in Camelot.", // todo made up, can't find source + // Seer, Stankers, Sir Kay + new int[]{388, 383, 241} + /** + * Secondary Rewards + * Easy + * - 30 flax a day from Flax (Geoffrey) + * Medium + * - 60 flax a day from Geoffrey + * - 10% more experience cutting maples while wearing Seer's Headband + * - Extra log given when cutting normal trees in Seer's Village + * Hard ( see https://www.youtube.com/watch?v=64tRpc6oASM ) + * - 120 flax a day from Geoffrey + * - Significant increase in speed spinning wheel in Seer's village + * - Enhanced Excalibur - lady of the lake + */ + ); + + /** + * The name of the diary. + */ + private final String name; + + /** + * The child id. + */ + private final int child; + + /** + * Level names + */ + private final String[] levelNames; + + /** + * The achievement descriptions. + */ + private final String[][] achievements; + + /** + * The item rewards. + */ + private final Item[][] rewards; + + /** + * The info to start the diary. + */ + private final String info; + + /** + * The npcs for the task levels. + */ + private final int[] npcs; + + /** + * Constructs a new {@code DiaryType} {@code Object} + * + * @param name the name of the diary. + * @param child the child id. + * @param achievements the achievements. + * @param rewards the rewards. + * @param info the info about the diary. + * @param npcs the npcs for the task levels. + */ + DiaryType(String name, int child, String[] levelNames, String[][] achievements, Item[][] rewards, String info, int[] npcs) { + this.name = name; + this.child = child; + this.levelNames = levelNames; + this.achievements = achievements; + this.rewards = rewards; + this.info = info; + this.npcs = npcs; + } + + /** + * Gets the diary type for the child id. + * + * @param child the child. + * @return the diary type. + */ + public static DiaryType forChild(int child) { + for (DiaryType type : values()) { + for (int i = 0; i < 4; i++) { + if (child == type.getChild() + i) { + return type; + } + } + } + return null; + } + + /** + * Gets the npc for the level. + * + * @param level the level. + * @return the npc id. + */ + public int getNpc(int level) { + return npcs[level]; + } + + /** + * Gets the rewards for the task level. + * + * @param level the level. + * @return the rewards. + */ + public Item[] getRewards(int level) { + return rewards[level]; + } + + /** + * Gets the achievements for the task level. + * + * @param level the level. + * @return the achievements. + */ + public String[] getAchievements(int level) { + return achievements[level]; + } + + /** + * Gets the achievements. + * + * @return the achievements + */ + public String[][] getAchievements() { + return achievements; + } + + /** + * Gets the rewards. + * + * @return the rewards + */ + public Item[][] getRewards() { + return rewards; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Get the level names + * + * @return the level names + */ + public String[] getLevelNames() { + return levelNames; + } + + /** + * Gets the info. + * + * @return the info + */ + public String getInfo() { + return info; + } + + /** + * Gets the child. + * + * @return the child + */ + public int getChild() { + return child; + } + + /** + * Gets the npcs. + * + * @return the npcs + */ + public int[] getNpcs() { + return npcs; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/diary/MysteriousStatueZone.java b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/MysteriousStatueZone.java new file mode 100644 index 000000000..f6aa1ba26 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/diary/MysteriousStatueZone.java @@ -0,0 +1,96 @@ +package core.game.node.entity.player.link.diary; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.Vector3d; + +@Initializable +public class MysteriousStatueZone extends MapZone implements Plugin { + private final static Vector3d origin = new Vector3d(2740.5, 3490.5, 0); + private final static Vector3d n = new Vector3d(0, 0, 1); + + public MysteriousStatueZone() { + super("mysterious-statue", true); + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + //System.out.println("enter"); + } + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + //System.out.println("leave"); + e.asPlayer().removeAttribute("diary:seers:statue-walk-start"); + } + return true; + } + + @Override + public void locationUpdate(Entity e, Location last) { + if (e instanceof Player) { + Player player = e.asPlayer(); + //System.out.println("update - " + player.getLocation().toString()); + if (!player.getWalkingQueue().isRunning() && !player.getSettings().isRunToggled()) { + if (player.getAttribute("diary:seers:statue-walk-start") != null) { + Vector3d start = player.getAttribute("diary:seers:statue-walk-start"); + Vector3d a = player.getAttribute("diary:seers:statue-walk-a"); + Vector3d b = new Vector3d(player.getLocation()).sub(origin); + + double angle_a_b = Vector3d.signedAngle(a, b, n) * 360. / 2 / 3.14159265355; + + /* player.getWalkingQueue().isMoving() doesn't work right, or at least does not do what name implies it should + if (!player.getWalkingQueue().isMoving()) { + System.out.println("removing, not moving"); + player.removeAttribute("diary:seers:statue-walk-start"); + }*/ + if (angle_a_b >= 0) { + //System.out.println("removing, not going clockwise"); + player.removeAttribute("diary:seers:statue-walk-start"); + } + if (b.epsilonEquals(start, .001)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 0, 1); + //System.out.println("removing, finished task"); + player.removeAttribute("diary:seers:statue-walk-start"); + } + + player.setAttribute("diary:seers:statue-walk-a", b); + } else { + //System.out.println("started"); + Vector3d start = new Vector3d(player.getLocation()).sub(origin); + player.setAttribute("diary:seers:statue-walk-start", start); + player.setAttribute("diary:seers:statue-walk-a", start); + } + } else { + //System.out.println("removing, running or outside"); + player.removeAttribute("diary:seers:statue-walk-start"); + } + } + } + + @Override + public void configure() { + register(new ZoneBorders(2739, 3489, 2742, 3492, 0)); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/emote/EmoteManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/emote/EmoteManager.java new file mode 100644 index 000000000..7e1cc117f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/emote/EmoteManager.java @@ -0,0 +1,200 @@ +package core.game.node.entity.player.link.emote; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +/** + * Manages the players unlocked/locked emotes. + * @author Vexia + * + */ +public class EmoteManager implements SavingModule { + + /** + * The list of unlocked emotes. + */ + private final List emotes = new ArrayList<>(); + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@Code EmoteManager} {@Code Object} + * @param player the player. + */ + public EmoteManager(Player player) { + this.player = player; + for (int i = 0; i < 22; i++) { + emotes.add(Emotes.values()[i]); + } + } + + @Override + public void save(ByteBuffer buffer) { + buffer.put((byte) emotes.size()); + for (int i = 0; i < emotes.size(); i++) { + buffer.put((byte) emotes.get(i).ordinal()); + } + } + + @Override + public void parse(ByteBuffer buffer) { + int size = buffer.get(); + Emotes emote = null; + for (int i = 0; i < size; i++) { + emote = Emotes.values()[buffer.get()]; + if (!emotes.contains(emote)) { + emotes.add(emote); + } + } + } + + /** + * Refreshes the emote tab. + */ + public void refresh() { + int value1 = 0; + if (isUnlocked(Emotes.IDEA)) { + value1 += 4; + } + if (isUnlocked(Emotes.FLAP)) { + value1 += 1; + } + if (isUnlocked(Emotes.STOMP)) { + value1 += 8; + } + if (isUnlocked(Emotes.SLAP_HEAD)) { + value1 += 2; + } + player.getConfigManager().set(802, value1); // stronghold of // security + int value2 = 0; + if (isUnlocked(Emotes.GLASS_BOX)) { + value2 += 2; + } + if (isUnlocked(Emotes.CLIMB_ROPE)) { + value2 += 4; + } + if (isUnlocked(Emotes.LEAN)) { + value2 += 8; + } + if (isUnlocked(Emotes.GLASS_WALL)) { + value2 += 1; + } + if (isUnlocked(Emotes.SCARED)) { + value2 += 16; + } + if (isUnlocked(Emotes.ZOMBIE_DANCE)) { + value2 += 32; + } + if (isUnlocked(Emotes.ZOMBIE_WALK)) { + value2 += 64; + } + if (isUnlocked(Emotes.BUNNY_HOP)) { + value2 += 128; + } + if (!isUnlocked(Emotes.SKILLCAPE)) { + unlock(Emotes.SKILLCAPE); + } + value2 += 256; + if (isUnlocked(Emotes.SNOWMAN_DANCE)) { + value2 += 512; + } + if (isUnlocked(Emotes.AIR_GUITAR)) { + value2 += 1024; + } + if (isUnlocked(Emotes.SAFETY_FIRST)) { + value2 += 2048; + } + if (isUnlocked(Emotes.TRICK)) { + value2 += 8192; + } + if (isUnlocked(Emotes.EXPLORE)) { + value2 += 4096; + } + if (isUnlocked(Emotes.FREEZE)) { + value2 += 32768; + } + if (isUnlocked(Emotes.GIVE_THANKS)) { + value2 += 16384; + } + player.getConfigManager().set(313, value2); // events emotes + int value3 = 0; + if (isUnlocked(Emotes.ZOMBIE_HAND)) { + value3 = 12; + } + player.getConfigManager().set(1085, value3);//zombie hand. + } + + /** + * Locks an emote. + * @param emote the emote. + * @return {@code True} if locked. + */ + public boolean lock(Emotes emote) { + if (emote.ordinal() <= 22) { + return false; + } + boolean locked = emotes.remove(emote); + refresh(); + return locked; + } + + /** + * Unlocks an emote. + * @param emote the emote. + * @return {@code True} if unlocked. + */ + public boolean unlock(Emotes emote) { + if (emotes.contains(emote)) { + return true; + } + boolean unlocked = emotes.add(emote); + refresh(); + return unlocked; + } + + /** + * Checks if an emote is unlocked. + * @param emote the emote. + * @return {@code True} if so. + */ + public boolean isUnlocked(Emotes emote) { + return emotes.contains(emote); + } + + /** + * Checks if a save is required. + * @return {@code True} if so. + */ + public boolean isSaveRequired() { + for (Emotes emote : emotes) { + if (emote.ordinal() > 21) { + return true; + } + } + return false; + } + + /** + * Gets the emotes. + * @return the emotes. + */ + public List getEmotes() { + return emotes; + } + + /** + * Gets the player. + * @return the player. + */ + public Player getPlayer() { + return player; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/emote/Emotes.java b/Server/src/main/java/Server/core/game/node/entity/player/link/emote/Emotes.java new file mode 100644 index 000000000..91def0a92 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/emote/Emotes.java @@ -0,0 +1,423 @@ +package core.game.node.entity.player.link.emote; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.player.info.Rights; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.tools.Items; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Represents an emote. + * + * @author Vexia + + */ +public enum Emotes { + YES(2, Animation.create(855)), + NO(3, Animation.create(856)), + BOW(4, Animation.create(858)) { + @Override + public void play(Player player) { + Item legs = player.getEquipment().get(EquipmentContainer.SLOT_LEGS); + if (legs != null && legs.getId() == 10396) { + forceEmote(player, Animation.create(5312), null); + return; + } + super.play(player); + } + }, + ANGRY(5, Animation.create(859)) { + @Override + public void play(Player player) { + Item hat = player.getEquipment().get(EquipmentContainer.SLOT_HAT); + if (hat != null && hat.getId() == 10392) { + forceEmote(player, Animation.create(5315), null); + return; + } + super.play(player); + } + }, + THINK(6, Animation.create(857)), + WAVE(7, Animation.create(863)), + SHRUG(8, Animation.create(2113)), + CHEER(9, Animation.create(862)), + BECKON(10, Animation.create(864)), + //Switch laugh id 11, to 12, and switch Jump id 12 to 11. Id's were mismatched. + //This caused the LAUGH to proc JUMP_FOR_JOY and JUMP_FOR_JOY to proc LAUGH! :) + JUMP_FOR_JOY(11, Animation.create(2109)), + LAUGH(12, Animation.create(861)), + YAWN(13, Animation.create(2111)) { + @Override + public void play(Player player) { + Item hat = player.getEquipment().get(EquipmentContainer.SLOT_HAT); + if (hat != null && hat.getId() == 10398) { + forceEmote(player, Animation.create(5313), null); + return; + } + super.play(player); + } + }, + DANCE(14, Animation.create(866)) { + @Override + public void play(Player player) { + Item legs = player.getEquipment().get(EquipmentContainer.SLOT_LEGS); + if (legs != null && legs.getId() == 10394) { + forceEmote(player, Animation.create(5316), null); + return; + } + super.play(player); + } + }, + JIG(15, Animation.create(2106)), + SPIN(16, Animation.create(2107)), + HEADBANG(17, Animation.create(2108)), + CRY(18, Animation.create(860)), + BLOW_KISS(19, Animation.create(1368), Graphics.create(574)), + PANIC(20, Animation.create(2105)), + RASPBERRY(21, Animation.create(2110)), + CLAP(22, Animation.create(865)), + SALUTE(23, Animation.create(2112)) { + @Override + public void play(Player player) { + if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.FALADOR, 1, 8) && + player.getLocation().equals(new Location(2997, 3374, 0)) && + player.getDirection() == Direction.SOUTH && + player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == Items.INITIATE_SALLET_5574 && + player.getEquipment().get(EquipmentContainer.SLOT_CHEST).getId() == Items.INITIATE_HAUBERK_5575 && + player.getEquipment().get(EquipmentContainer.SLOT_LEGS).getId() == Items.INITIATE_CUISSE_5576) { + forceEmote(player, Animation.create(2112), null); + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 1, 8); + return; + } + super.play(player); + } + }, + GOBLIN_BOW(24, Animation.create(2127), "This emote can be unlocked during the Lost Tribe quest.") { + @Override + public void play(Player player) { + if(player.getLocation().getRegionId() == 13206 && !player.getAttribute("mistag-greeted", false)) { + RegionManager.getLocalNpcs(player).forEach(npc -> { + if (npc.getId() == 2084 && npc.getLocation().withinDistance(player.getLocation(), 3) && player.getQuestRepository().getQuest("Lost Tribe").getStage(player) == 45) { + player.getDialogueInterpreter().open(2084,"greeting"); + player.setAttribute("/save:mistag-greeted",true); + } + }); + } + super.play(player); + } + }, + GOBLIN_SALUTE(25, Animation.create(2128), "This emote can be unlocked during the Lost Tribe quest."), + GLASS_BOX(26, Animation.create(1131), "This emote can be unlocked during the Mime random event."), + CLIMB_ROPE(27, Animation.create(1130), "This emote can be unlocked during the Mime random event."), + LEAN(28, Animation.create(1129), "This emote can be unlocked during the Mime random event."), + GLASS_WALL(29, Animation.create(1128), "This emote can be unlocked during the Mime random event."), + IDEA(33, Animation.create(4276), Graphics.create(712), "You can't use this emote yet.
Visit the Stronghold of Security to unlock it."), + STOMP(31, Animation.create(4278), "You can't use this emote yet.
Visit the Stronghold of Security to unlock it."), + FLAP(32, Animation.create(4280), "You can't use this emote yet.
Visit the Strongshold of Security to unlock it.") { + @Override + public void play(Player player) { + Item head = player.getEquipment().get(EquipmentContainer.SLOT_HAT); + Item wings = player.getEquipment().get(EquipmentContainer.SLOT_CHEST); + Item legs = player.getEquipment().get(EquipmentContainer.SLOT_LEGS); + Item feet = player.getEquipment().get(EquipmentContainer.SLOT_FEET); + if (head != null && wings != null && legs != null && feet != null) { + if (head.getId() == 11021 && wings.getId() == 11020 && legs.getId() == 11022 && feet.getId() == 11019) { + forceEmote(player, Animation.create(3859), null); + return; + } + } + super.play(player); + } + }, + SLAP_HEAD(30, Animation.create(4275), "You can't use this emote yet.
Visit the Stronghold of Security to unlock it."), + ZOMBIE_WALK(34, Animation.create(3544), "This emote can be unlocked during the Gravedigger random event."), + ZOMBIE_DANCE(35, Animation.create(3543), "This emote can be unlocked during the Gravedigger random event."), + ZOMBIE_HAND(36, Animation.create(7272), Graphics.create(1244), "This emote can be unlocked during the Gravedigger random event."), + SCARED(37, Animation.create(2836), "This emote can be unlocked by playing a Halloween holiday event."), + BUNNY_HOP(38, Animation.create(6111), "This emote can be unlocked by playing an Easter holiday event."), + SKILLCAPE(39) { + @Override + public void play(Player player) { + Item cape = player.getEquipment().get(EquipmentContainer.SLOT_CAPE); + if (cape == null) { + player.getPacketDispatch().sendMessage("You need to be wearing a skillcape in order to perform this emote."); + return; + } + int capeId = cape.getId(); + for (int i = 0; i < SKILLCAPE_INFO.length; i++) { + if (capeId == SKILLCAPE_INFO[i][0] || capeId == SKILLCAPE_INFO[i][1]) { + player.getPacketDispatch().sendGraphic(SKILLCAPE_INFO[i][2]); + player.getPacketDispatch().sendAnimation(SKILLCAPE_INFO[i][3]); + int duration = Animation.create(SKILLCAPE_INFO[i][3]).getDuration(); + player.getLocks().lock("emote", duration); + player.getLocks().lock(duration); + return; + } + } + player.getPacketDispatch().sendMessage("You need to be wearing a skillcape in order to perform this emote."); + } + }, + SNOWMAN_DANCE(40, Animation.create(7531), "This emote can be unlocked by playing a Christmas holiday event."), + AIR_GUITAR(41, Animation.create(2414), Graphics.create(1537), "This emote can be accessed by unlocking 200 pieces of music."), + SAFETY_FIRST(42, Animation.create(8770), Graphics.create(1553), "You can't use this emote yet. Visit the Stronghold of Player safety to
unlock it."), + EXPLORE(43, Animation.create(9990), Graphics.create(1734), "You can't use this emote yet. You must complete all the Lumbridge
and Draynor beginner tasks to unlock it."), + TRICK(44, Animation.create(10530), Graphics.create(1863), "This emote can be unlocked by playing a Halloween holiday event."), + FREEZE(45, Animation.create(11044), Graphics.create(1973), "This emote can be unlocked by playing a Christmas holiday event."), + GIVE_THANKS(46, "This emote can be unlocked by playing a Thanksgiving holiday event.") { + @Override + public void play(final Player player) { + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.lock(17); + forceEmote(player, Animation.create(10994), Graphics.create(86)); + break; + case 3: + player.getAppearance().transformNPC(8499); + forceEmote(player, Animation.create(10996), null); + break; + case 16: + player.getAppearance().transformNPC(-1); + forceEmote(player, Animation.create(10995), Graphics.create(86)); + break; + } + return false; + } + }); + } + }; + + /** + * Represents the skillcape info. + */ + private static final int[][] SKILLCAPE_INFO = {{9747, 9748, 823, 4959}, {9750, 9751, 828, 4981}, {9753, 9754, 824, 4961}, {9756, 9757, 832, 4973}, {9759, 9760, 829, 4979}, {9762, 9763, 813, 4939}, {9765, 9766, 817, 4947}, {9768, 9769, 833, 4971}, {9771, 9772, 830, 4977}, {9774, 9775, 835, 4969}, {9777, 9778, 826, 4965}, {9780, 9781, 818, 4949}, {9783, 9784, 812, 4937}, {9786, 9787, 1656, 4967}, {9789, 9790, 820, 4953}, {9792, 9793, 814, 4941}, {9795, 9796, 815, 4943}, {9798, 9799, 819, 4951}, {9801, 9802, 821, 4955}, {9804, 9805, 831, 4975}, {9807, 9808, 822, 4957}, {9810, 9811, 825, 4963}, {12169, 12170, 1515, 8525}, {9813, -1, 816, 4945}, {9948, 9949, 907, 5158}}; + + /** + * The button id. + */ + private final int buttonId; + + /** + * The animation. + */ + private final Animation animation; + + /** + * The graphics to play. + */ + private final Graphics graphics; + + /** + * The message to show when the emote is locked. + */ + private final String lockedMessage; + + /** + * Constructs a new {@Code Emotes} {@Code Object} + * + * @param buttonId the button id. + * @param animation the animation. + * @param graphics the graphics. + * @param lockedMessage the locked message. + */ + Emotes(int buttonId, Animation animation, Graphics graphics, String lockedMessage) { + this.buttonId = buttonId; + this.animation = animation; + this.graphics = graphics; + this.lockedMessage = lockedMessage; + } + + /** + * Constructs a new {@Code Emotes} {@Code Object} + * + * @param buttonId the button id. + */ + Emotes(int buttonId) { + this(buttonId, null, null, null); + } + + /** + * Constructs a new {@Code Emotes} {@Code Object} + * + * @param buttonId the button id. + * @param animation the animation. + */ + Emotes(int buttonId, Animation animation) { + this(buttonId, animation, null, null); + } + + /** + * Constructs a new {@Code Emotes} {@Code Object} + * + * @param buttonId the button id. + * @param animation the animation. + * @param graphics the graphics. + */ + Emotes(int buttonId, Animation animation, Graphics graphics) { + this(buttonId, animation, graphics, null); + } + + /** + * Constructs a new {@Code Emotes} {@Code Object} + * + * @param buttonId the button id. + * @param animation the animation. + * @param lockedMessage the locked message. + */ + Emotes(int buttonId, Animation animation, String lockedMessage) { + this(buttonId, animation, null, lockedMessage); + } + + /** + * Constructs a new {@Code Emotes} {@Code Object} + * + * @param buttonId the button id. + * @param lockedMessage the locked message. + */ + Emotes(int buttonId, String lockedMessage) { + this(buttonId, null, null, lockedMessage); + } + + /** + * Handles the reward button for an emote. + * + * @param player the player. + * @param buttonId the button id. + */ + public static void handle(Player player, int buttonId) { + if (player.getLocks().isLocked("emote")) { + player.getPacketDispatch().sendMessage("You're already doing an emote!"); + return; + } + if (player.getProperties().getCombatPulse().isAttacking() || player.inCombat()) { + player.getPacketDispatch().sendMessage("You can't perform an emote while being in combat."); + return; + } + Emotes emote = Emotes.forId(buttonId); + if (emote == null) { + player.debug("Unhandled emote for button id - " + buttonId); + return; + } + if (!player.getEmoteManager().isUnlocked(emote)) { + if(player.getRights().equals(Rights.ADMINISTRATOR)){ + player.getEmoteManager().unlock(emote); + player.getPulseManager().clear(); + emote.play(player); + return; + } + String message = emote.getLockedMessage(); + if (message == null) { + message = "You can't use this emote."; + } + player.getDialogueInterpreter().sendDialogue(message); + return; + } + if (!player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK).isComplete(1, 6) && (buttonId >= 30 && buttonId <= 33)) { + if (!player.getAttribute("emote-" + buttonId, false)) { + player.setAttribute("emote-" + buttonId, true); + } + boolean good = true; + for (int i = 30; i <= 33; i++) { + if (!player.getAttribute("emote-" + i, false)) { + good = false; + break; + } + } + player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK).updateTask(player, 1, 6, good); + } + if (TutorialSession.getExtension(player).getStage() == 24) { + TutorialStage.load(player, 25, false); + } + player.getPulseManager().clear(); + emote.play(player); + } + + /** + * Plays the emote. + * + * @param player the player. + */ + public void play(Player player) { + forceEmote(player, animation, graphics); + } + + /** + * Forces the animation to be played. + * + * @param player the player. + * @param animation the animation. + * @param graphic the graphic. + */ + private static void forceEmote(Player player, Animation animation, Graphics graphic) { + if (animation != null) { + player.getAnimator().animate(animation, graphic); + player.getLocks().lock("emote", animation.getDuration()); + } + } + + /** + * Gets the emote for the button id. + * + * @param buttonId the button id. + * @return the emote type. + */ + public static Emotes forId(int buttonId) { + for (Emotes emote : values()) { + if (emote.getButtonId() == buttonId) { + return emote; + } + } + return null; + } + + /** + * Gets the buttonId. + * + * @return the buttonId. + */ + public int getButtonId() { + return buttonId; + } + + /** + * Gets the animation. + * + * @return the animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Gets the graphics. + * + * @return the graphics. + */ + public Graphics getGraphics() { + return graphics; + } + + /** + * Gets the lockedMessage. + * + * @return the lockedMessage. + */ + public String getLockedMessage() { + return lockedMessage; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/grave/GraveManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/grave/GraveManager.java new file mode 100644 index 000000000..8a7cefba8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/grave/GraveManager.java @@ -0,0 +1,163 @@ +package core.game.node.entity.player.link.grave; + +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.GroundItem; +import core.game.world.GameWorld; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Manages the players grave stone. + * @author Vexia + */ +public class GraveManager implements SavingModule { + + /** + * The current grave stones in the world. + */ + private static final Map graves = new HashMap<>(); + + /** + * The player instance. + */ + private final Player player; + + /** + * The grave type. + */ + private GraveType type = GraveType.MEMORIAL_PLAQUE; + + /** + * The current gravestone. + */ + private NPC grave; + + /** + * Constructs a new {@Code GraveManager} {@Code Object} + * @param player the player. + */ + public GraveManager(Player player) { + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + buffer.putInt(type.ordinal()); + } + + @Override + public void parse(ByteBuffer buffer) { + if (buffer.hasRemaining()) { + type = GraveType.values()[buffer.getInt()]; + } + } + + /** + * Creates a grave. + * @param ticks the ticks. + * @param items the items. + */ + public void create(int ticks, List items) { + if (hasGrave()) { + grave.clear(); + player.sendMessage("Your previous gravestone has collapsed."); + } + NPC npc = NPC.create(type.getNpcId(), player.getLocation(), player.getName(), GameWorld.getTicks() + ticks, items, type, player.getUsername()); + npc.init(); + setGrave(npc); + } + + /** + * Updates the players grave items. + */ + public void update() { + NPC npc = graves.get(player.getName()); + if (npc != null && npc.isActive()) { + AbstractNPC n = (AbstractNPC) npc; + n.fireEvent("updateItems", player); + HintIconManager.registerHintIcon(player, n); + } + } + + /** + * Checks if a gravestone is generateable at this time. + * @return {@code True} if so. + */ + public boolean generateable() { + if (player.getDetails().getRights() == Rights.ADMINISTRATOR && GameWorld.getSettings().isHosted()) { + return false; + } + if (player.getSkullManager().isWilderness()) { + return false; + } + if (player.getInventory().itemCount() + player.getEquipment().itemCount() <= (player.getPrayer().get(PrayerType.PROTECT_ITEMS) ? 4 : 3)) { + return false; + } + return true; + } + + /** + * Checks if the player has an active grave. + * @return {@code True} if so. + */ + public boolean hasGrave() { + return grave != null && grave.isActive(); + } + + /** + * Gets the type. + * @return the type + */ + public GraveType getType() { + return type; + } + + /** + * Sets the grave type. + * @param type the type to set. + */ + public void setType(GraveType type) { + this.type = type; + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the grave. + * @return the grave + */ + public NPC getGrave() { + return grave; + } + + /** + * Sets the bagrave. + * @param grave the grave to set. + */ + public void setGrave(NPC grave) { + this.grave = grave; + } + + /** + * Gets the graves. + * @return the graves + */ + public static Map getGraves() { + return graves; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/grave/GraveType.java b/Server/src/main/java/Server/core/game/node/entity/player/link/grave/GraveType.java new file mode 100644 index 000000000..b4fdc9a4c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/grave/GraveType.java @@ -0,0 +1,74 @@ +package core.game.node.entity.player.link.grave; + +/** + * A grave stone type. + * @author Vexia + */ +public enum GraveType { + MEMORIAL_PLAQUE(0, 5, 6565, "In memory of @name, who died here."), FLAG(50, 6, 6568, "In memory of @name, who died here."), SMALL(500, 6, 6571, "In loving memory of our dear friend @name, who died in this place @mins ago."), ORNATE(5000, 8, 6574, "In loving memory of our dear friend @name, who died in this place @mins ago."), FRONT_OF_LIFE(50000, 10, 6577, "In your travels, pause awhile to remember @name, who passed away in this spot."), STELE(50000, 10, 6580, "In your travels, pause awhile to remember @name, who passed away in this spot."), SARADOMIN(50000, 10, 6583, "@name, an enlightened severant of Saradomin, perished in this place."), ZAMRAOK(50000, 10, 6586, "@name a most bloodthirsty follower of Zamorak, perished in this place."), GUTHIX(50000, 10, 6589, "@name walked with the Balance of Guthix, perished in this place."), BANDOS(50000, 10, 6592, "@name, a vicious warrior dedicated to Bandos, perished in this place."), ARMADYL(50000, 10, 6595, "@name a follower of the Law of Aramdyl, perished in this place."), MEMORIAL_STONE(50000, 10, 6598, "@name, servant of the Unknown Power, perished in this place."), ANGEL_OF_DEATH(500000, 12, 6601, "Ye frails who gaze upon this sight, forget not the date of @name, once mighty, now surrendered to the inescapable grasp of destiny, Requiescat in pace."); + + /** + * The cost of the grave stone. + */ + private final int cost; + + /** + * The decay time of this gravestone. + */ + private final int decay; + + /** + * The npc id of this gravestone. + */ + private final int npcId; + + /** + * The message to display on the grave. + */ + private final String message; + + /** + * Constructs a new {@code GraveType} {@code Object}. + * @param cost the cost. + * @param decay the decay. + */ + GraveType(final int cost, final int decay, final int npc, final String message) { + this.cost = cost; + this.decay = decay; + this.npcId = npc; + this.message = message; + } + + /** + * Gets the decay. + * @return the decay + */ + public int getDecay() { + return decay; + } + + /** + * Gets the cost. + * @return the cost + */ + public int getCost() { + return cost; + } + + /** + * Gets the npcId. + * @return the npcId + */ + public int getNpcId() { + return npcId; + } + + /** + * Gets the message. + * @return the message + */ + public String getMessage() { + return message; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicEntry.java b/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicEntry.java new file mode 100644 index 000000000..2088f2b8f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicEntry.java @@ -0,0 +1,84 @@ +package core.game.node.entity.player.link.music; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents a song. + * @author Emperor + */ +public final class MusicEntry { + + /** + * The songs mapping. + */ + private static final Map SONGS = new HashMap<>(); + + /** + * The music id. + */ + private final int id; + + /** + * The song name. + */ + private final String name; + + /** + * The index in the list. + */ + private final int index; + + /** + * Constructs a new {@code MusicEntry} {@code Object}. + * @param id the music id. + * @param name The name. + * @param index The list index. + */ + public MusicEntry(int id, String name, int index) { + this.id = id; + this.name = name; + this.index = index; + } + + /** + * Gets the song for the given music id. + * @param id The music id. + * @return The song. + */ + public static MusicEntry forId(int id) { + return SONGS.get(id); + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Gets the index. + * @return The index. + */ + public int getIndex() { + return index; + } + + /** + * Gets the songs. + * @return The songs. + */ + public static Map getSongs() { + return SONGS; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicPlayer.java b/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicPlayer.java new file mode 100644 index 000000000..e0dd0782e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicPlayer.java @@ -0,0 +1,326 @@ +package core.game.node.entity.player.link.music; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.world.GameWorld; +import core.net.packet.PacketRepository; +import core.net.packet.context.MusicContext; +import core.net.packet.context.StringContext; +import core.net.packet.out.MusicPacket; +import core.net.packet.out.StringPacket; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +/** + * Handles a music playing for a player. + * @author Emperor + */ +public final class MusicPlayer implements SavingModule { + + /** + * The tutorial island music. + */ + public static final int TUTORIAL_MUSIC = 62; + + /** + * The default music id. + */ + public static final int DEFAULT_MUSIC_ID = 76; + + /** + * The configuration ids. + */ + private static final int[] CONFIG_IDS = { 20, 21, 22, 23, 24, 25, 298, 311, 346, 414, 464, 598, 662, 721, 906, 1009, 1104, 1136, 180, 1202, 1381, 1394, }; + + /** + * The player. + */ + private final Player player; + + /** + * The currently unlocked songs. + */ + private final Map unlocked; + + /** + * The music id of the currently played song. + */ + private int currentMusicId; + + /** + * If a song is currently playing. + */ + private boolean playing; + + /** + * If the song is looping. + */ + private boolean looping; + + /** + * Constructs a new {@code MusicPlayer} {@code Object}. + * @param player The player. + */ + public MusicPlayer(Player player) { + this.player = player; + this.unlocked = new HashMap<>(); + } + + @Override + public void save(ByteBuffer buffer) { + if (!unlocked.isEmpty()) { + buffer.put((byte) 1); + buffer.putShort((short) unlocked.size()); + for (MusicEntry entry : unlocked.values()) { + buffer.putShort((short) entry.getId()); + } + } + buffer.put((byte) 0); // EOF + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch (opcode) { + case 1: + int size = buffer.getShort() & 0xFFFF; + for (int i = 0; i < size; i++) { + int musicId = buffer.getShort() & 0xFFFF; + MusicEntry entry = MusicEntry.forId(musicId); + if (entry != null) { + unlocked.put(entry.getIndex(), entry); + } + } + break; + } + } + } + + /** + * Initializes the music player. + */ + public void init() { + refreshList(); + player.getConfigManager().set(19, looping ? 1 : 0); + int value = 0; + for (int i = 0; i < CONFIG_IDS.length; i++) { + value |= 2 << i; + } + player.getPacketDispatch().sendAccessMask(value, 1, 187, 0, CONFIG_IDS.length * 64); + if (!unlocked.containsKey(TUTORIAL_MUSIC)) { + unlock(TUTORIAL_MUSIC, false); + } + if (!isMusicPlaying()) { + playDefault(); + } + if (!hasAirGuitar() && player.getEmoteManager().isUnlocked(Emotes.AIR_GUITAR)) { + player.getPacketDispatch().sendMessage("As you no longer have all music unlocked, the Air Guitar emote is locked again."); + player.getEmoteManager().lock(Emotes.AIR_GUITAR); + } + } + + /** + * Checks if the player has enough songs unlocked for the Air guitar emote. + * @return {@code True} if so. + */ + public boolean hasAirGuitar() { + return unlocked.size() >= 200 || unlocked.size() == MusicEntry.getSongs().size(); + } + + /** + * Checks if the player has unlocked the song. + * @param musicId The music id. + * @return {@code True} if so. + */ + public boolean hasUnlocked(int musicId) { + MusicEntry entry = MusicEntry.forId(musicId); + if (entry == null) { + return false; + } + return hasUnlockedIndex(entry.getIndex()); + } + + /** + * Checks if the player has unlocked the song for the given list index. + * @param index The list index. + * @return {@code True} if so. + */ + public boolean hasUnlockedIndex(int index) { + return unlocked.containsKey(index); + } + + /** + * Refreshes the music list. + */ + public void refreshList() { + int[] values = new int[CONFIG_IDS.length]; + for (MusicEntry entry : unlocked.values()) { + int listIndex = entry.getIndex(); + int index = (listIndex + 1) / 32; + if (index >= CONFIG_IDS.length) { + System.out.println("Index out of range [index=" + index + ", list=" + listIndex + ", id=" + entry.getId() + ", name=" + entry.getName() + "]."); + continue; + } + values[index] |= 1 << (listIndex - (index * 32)); + } + for (int i = 0; i < CONFIG_IDS.length; i++) { + player.getConfigManager().set(CONFIG_IDS[i], values[i]); + } + } + + /** + * Called when a player leaves a music zone without entering a new one. + */ + public void playDefault() { + MusicEntry entry = MusicEntry.forId(DEFAULT_MUSIC_ID); + if (entry != null) { + play(entry); + } + } + + /** + * Replays the song. + */ + public void replay() { + MusicEntry entry = MusicEntry.forId(currentMusicId); + if (entry != null) { + play(entry); + } + } + + /** + * Plays the song. + * @param entry The song. + */ + public void play(MusicEntry entry) { + PacketRepository.send(MusicPacket.class, new MusicContext(player, entry.getId())); + PacketRepository.send(StringPacket.class, new StringContext(player, entry.getName(), 187, 14)); + currentMusicId = entry.getId(); + playing = true; + } + + /** + * Unlocks and plays the music id. + * @param id The music id to unlock. + */ + public void unlock(int id) { + unlock(id, true); + } + + /** + * Unlocks the music id. + * @param id The music id to unlock. + * @param play If the song should be played. + */ + public void unlock(int id, boolean play) { + MusicEntry entry = MusicEntry.forId(id); + if (entry == null) { +// System.out.println("Could not find music entry for id " + id + "!"); + return; + } + if (!unlocked.containsKey(entry.getIndex())) { + unlocked.put(entry.getIndex(), entry); + player.getPacketDispatch().sendMessage("You have unlocked a new music track: " + entry.getName() + "."); + refreshList(); + if (!player.getEmoteManager().isUnlocked(Emotes.AIR_GUITAR) && hasAirGuitar()) { + player.getEmoteManager().unlock(Emotes.AIR_GUITAR); + if (unlocked.size() >= 200) { + player.getPacketDispatch().sendMessage("You've unlocked 200 music tracks and can use a new emote!"); + } else { + player.getPacketDispatch().sendMessage("You've unlocked all music tracks and can use a new emote!"); + } + } + } + if (play) { + play(entry); + } + } + + public void tick(){ + if(GameWorld.getTicks() % 20 == 0){ + if(!isPlaying()){ + try { + play((MusicEntry) unlocked.values().toArray()[new Random().nextInt(unlocked.values().size())]); + } catch (Exception e){} + } + } + } + + /** + * Toggles the looping option. + */ + public void toggleLooping() { + looping = !looping; + player.getConfigManager().set(19, looping ? 1 : 0); + } + + /** + * If music is currently playing. + * @return {@code True} if so. + */ + private boolean isMusicPlaying() { + return currentMusicId > 0 && playing; + } + + /** + * Gets the unlocked songs list. + * @return The unlocked. + */ + public Map getUnlocked() { + return unlocked; + } + + /** + * Gets the currentMusicId. + * @return The currentMusicId. + */ + public int getCurrentMusicId() { + return currentMusicId; + } + + /** + * Sets the currentMusicId. + * @param currentMusicId The currentMusicId to set. + */ + public void setCurrentMusicId(int currentMusicId) { + this.currentMusicId = currentMusicId; + } + + /** + * Gets the playing. + * @return The playing. + */ + public boolean isPlaying() { + return playing; + } + + /** + * Sets the playing. + * @param playing The playing to set. + */ + public void setPlaying(boolean playing) { + this.playing = playing; + } + + /** + * Gets the looping. + * @return The looping. + */ + public boolean isLooping() { + return looping; + } + + /** + * Sets the looping. + * @param looping The looping to set. + */ + public void setLooping(boolean looping) { + this.looping = looping; + player.getConfigManager().set(19, looping ? 1 : 0); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicZone.java b/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicZone.java new file mode 100644 index 000000000..1bf82afdc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/music/MusicZone.java @@ -0,0 +1,64 @@ +package core.game.node.entity.player.link.music; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.zone.Zone; +import core.game.world.map.zone.ZoneBorders; + +/** + * Represents a music zone. + * @author Emperor + */ +public final class MusicZone implements Zone { + + /** + * The music id. + */ + private final int musicId; + + /** + * The zone borders. + */ + private final ZoneBorders borders; + + /** + * Constructs a new {@code MusicZone} {@code Object}. + * @param musicId The music id. + */ + public MusicZone(int musicId, ZoneBorders borders) { + this.musicId = musicId; + this.borders = borders; + } + + @Override + public boolean enter(Entity e) { + if (!(e instanceof Player)) { + throw new IllegalStateException("Music is for players only!"); + } + Player player = (Player) e; + player.getMusicPlayer().unlock(musicId); + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + return true; + } + + /** + * Gets the musicId. + * @return The musicId. + */ + public int getMusicId() { + return musicId; + } + + /** + * Gets the borders. + * @return The borders. + */ + public ZoneBorders getBorders() { + return borders; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/DrainTask.java b/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/DrainTask.java new file mode 100644 index 000000000..5aec89809 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/DrainTask.java @@ -0,0 +1,92 @@ +package core.game.node.entity.player.link.prayer; + +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.system.task.NodeTask; +import core.game.world.map.zone.ZoneBorders; +import core.tools.RandomFunction; +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks; + +/** + * Represents an event used to drain prayer points. + * @author 'Vexia + */ +public final class DrainTask extends NodeTask { + + /** + * Constructs a new {@code DrainTask} {@code Object}. + */ + public DrainTask() { + super(2); + } + + @Override + public boolean exec(Node node, Node... n) { + Player player = node.asPlayer(); + if (player.getPrayer().getActive().isEmpty()) { + getPulse().stop(); + return true; + } + player.getSkills().decrementPrayerPoints(getDrain(player.getPrayer())); + + if (player.getPrayer().getActive().contains(PrayerType.PIETY) + && new ZoneBorders(2732, 3467, 2739, 3471, 0).insideBorder(player)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 3); + } + + return player.getSkills().getPrayerPoints() <= 0; + } + + @Override + public void stop(Node node, Node... n) { + final Player player = node.asPlayer(); + if (player.getSkills().getPrayerPoints() <= 0) { + player.getPrayer().reset(); + player.getAudioManager().send(2672); + player.getPacketDispatch().sendMessage("You have run out of prayer points, you must recharge at an altar."); + } + super.stop(node, n); + } + + @Override + public void start(Node node, Node... n) { + node.asPlayer().removeAttribute("prayer-message"); + super.start(node, n); + } + + @Override + public boolean removeFor(String s, Node node, Node... n) { + return true; + } + + /** + * Method used to initialize this pulse. + * @param player the player. + */ + public void init(final Player player) { + if (getPulse() == null || !getPulse().isRunning()) { + schedule(player); + } + } + + /** + * Method used to return that drain tick. + * @param prayer the prayer manager. + * @return the drain tick, converted to an integer. + */ + public double getDrain(final Prayer prayer) { + double amountDrain = 0; + for (PrayerType type : prayer.getActive()) { + double drain = type.getDrain(); + double bonus = (1/30f) * prayer.getPlayer().getProperties().getBonuses()[12]; + drain = drain * (1 + bonus); + drain = 0.6 / drain; + amountDrain += drain; + } + if(SkillcapePerks.isActive(SkillcapePerks.DIVINE_FAVOR,prayer.getPlayer()) && RandomFunction.random(100) <= 10){ + amountDrain = 0; + } + return amountDrain; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/Prayer.java b/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/Prayer.java new file mode 100644 index 000000000..16911d946 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/Prayer.java @@ -0,0 +1,178 @@ +package core.game.node.entity.player.link.prayer; + +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a managing class of a players prayers. + * @author Vexia + * @author Emperor + */ +public final class Prayer { + + /** + * Represents the list of active prayers. + */ + private final List active = new ArrayList<>(); + + /** + * Represents the current draining task. + */ + private final DrainTask task = new DrainTask(); + + /** + * Represents the player instance. + */ + private final Player player; + + /** + * Constructs a new {@code Prayer} {@code Object}. + */ + public Prayer(Player player) { + this.player = player; + } + + /** + * Method used to toggle a prayer. + * @param type the type of prayer. + */ + public final boolean toggle(final PrayerType type) { + if (!permitted(type)) { + return false; + } + return type.toggle(player, !active.contains(type)); + } + + /** + * Method used to reset this prayer managers cached prayers. + */ + public void reset() { + for (PrayerType type : getActive()) { + player.getConfigManager().set(type.getConfig(), 0); + } + getActive().clear(); + player.getAppearance().setHeadIcon(-1); + player.getAppearance().sync(); + } + + /** + * Starts the redemption effect. + */ + public void startRedemption() { + player.getAudioManager().send(2681); + player.graphics(Graphics.create(436)); + player.getSkills().heal((int) (player.getSkills().getStaticLevel(Skills.PRAYER) * 0.25)); + player.getSkills().setPrayerPoints(0.0); + reset(); + } + + /** + * Starts the retribution effect. + * @param killer The entity who killed this player. + */ + public void startRetribution(Entity killer) { + Location l = player.getLocation(); + for (int x = -1; x < 2; x++) { + for (int y = -1; y < 2; y++) { + if (x != 0 || y != 0) { + Projectile.create(l, l.transform(x, y, 0), 438, 0, 0, 10, 20, 0, 11).send(); + } + } + } + player.getAudioManager().send(159); + player.graphics(Graphics.create(437)); + int maximum = (int) (player.getSkills().getStaticLevel(Skills.PRAYER) * 0.25) - 1; + if (killer != player && killer.getLocation().withinDistance(player.getLocation(), 1)) { + killer.getImpactHandler().manualHit(player, 1 + RandomFunction.randomize(maximum), HitsplatType.NORMAL); + } + if (player.getProperties().isMultiZone()) { + @SuppressWarnings("rawtypes") + List targets = null; + if (killer instanceof NPC) { + targets = RegionManager.getSurroundingNPCs(player, player, killer); + } else { + targets = RegionManager.getSurroundingPlayers(player, player, killer); + } + for (Object o : targets) { + Entity entity = (Entity) o; + if (entity.isAttackable(player, CombatStyle.MAGIC)) { + entity.getImpactHandler().manualHit(player, 1 + RandomFunction.randomize(maximum), HitsplatType.NORMAL); + } + } + } + } + + /** + * Gets the skill bonus for the given skill id. + * @param skillId The skill id. + * @return The bonus for the given skill. + */ + public double getSkillBonus(int skillId) { + double bonus = 0.0; + for (PrayerType type : active) { + for (SkillBonus b : type.getBonuses()) { + if (b.getSkillId() == skillId) { + bonus += b.getBonus(); + } + } + } + return bonus; + } + + /** + * Method used to check if we're permitted to toggle this prayer. + * @param type the type. + * @return True if permitted to be toggled. + */ + private boolean permitted(final PrayerType type) { + return player.getSkills().getPrayerPoints() > 0 && type.permitted(player); + } + + /** + * Method used to return value of {@code True} if the {@link #active} + * prayers contains the prayer type. + * @param type the type of prayer. + * @return {@code True} if so. + */ + public boolean get(PrayerType type) { + return active.contains(type); + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the task. + * @return The task. + */ + public DrainTask getTask() { + return task; + } + + /** + * Gets the active prayers. + * @return The active. + */ + public List getActive() { + return active; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/PrayerCategory.java b/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/PrayerCategory.java new file mode 100644 index 000000000..9e45cfb26 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/PrayerCategory.java @@ -0,0 +1,15 @@ +package core.game.node.entity.player.link.prayer; + +/** + * Players can also use some Prayers at the same time with others, though doing + * so will compound the drain rate of these Prayers. Some Prayers cannot be used + * simultaneously and are marked in the table with the same background colour. + * For example, activating the "Smite" Prayer while the Protect From + * Melee" Prayer is active will automatically deactivate "Protect from Melee" as + * they are incompatible Prayers. + * @author 'Vexia + * @date 06/11/2013 + */ +public enum PrayerCategory { + BABY_BLUE, GREEN, PINK, LIME_GREEN, ORANGE, PURPLE, DARK_GREEN, DARK_BROWN, LIGHT_BROWN, RED, MAGENTA; +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/PrayerType.java b/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/PrayerType.java new file mode 100644 index 000000000..d4d523813 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/prayer/PrayerType.java @@ -0,0 +1,452 @@ +package core.game.node.entity.player.link.prayer; + +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.SkillRestoration; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.tools.StringUtils; + +import java.util.List; + +/** + * Represents a prayer type. + * @author Vexia + * @author Emperor + * @author jamix77 + */ +public enum PrayerType { + THICK_SKIN(1, 12, 83, 5, PrayerCategory.BABY_BLUE, 10000, new SkillBonus(Skills.DEFENCE, 0.05)), + BURST_OF_STRENGTH(4, 12, 84, 7, PrayerCategory.GREEN, 2689, new SkillBonus(Skills.STRENGTH, 0.05)), + CLARITY_OF_THOUGHT(7, 12, 85, 9, PrayerCategory.PINK, 2664, new SkillBonus(Skills.ATTACK, 0.05)), + SHARP_EYE(8, 12, 862, 11, PrayerCategory.LIME_GREEN, 2685, new SkillBonus(Skills.RANGE, 0.05)), + MYSTIC_WILL(9, 12, 863, 13, PrayerCategory.LIME_GREEN, 2670, new SkillBonus(Skills.MAGIC, 0.05)), + ROCK_SKIN(10, 6, 86, 15, PrayerCategory.BABY_BLUE, 2684, new SkillBonus(Skills.DEFENCE, 0.1)), + SUPERHUMAN_STRENGTH(13, 6, 87, 17, PrayerCategory.GREEN, 2689, new SkillBonus(Skills.STRENGTH, 0.1)), + IMPROVED_REFLEXES(16, 6, 88, 19, PrayerCategory.PINK, 2662, new SkillBonus(Skills.ATTACK, 0.1)), + RAPID_RESTORE(19, 26, 89, 21, PrayerCategory.PURPLE, 2679){ + @Override + public boolean toggle(Player player, boolean on) { + for(SkillRestoration restore : player.getSkills().getRestoration()){ + if(restore == null) continue; + restore.restartStat(on); + } + return super.toggle(player, on); + } + }, + RAPID_HEAL(22, 18, 90, 23, PrayerCategory.PURPLE, 2678){ + @Override + public boolean toggle(Player player, boolean on) { + for(SkillRestoration restore : player.getSkills().getRestoration()){ + if(restore == null) continue; + restore.restartHpSummPray(on); + } + return super.toggle(player, on); + } + }, + PROTECT_ITEMS(25, 18, 91, 25, PrayerCategory.DARK_GREEN, 1982), + HAWK_EYE(26, 6, 864, 27, PrayerCategory.LIME_GREEN, 2666, new SkillBonus(Skills.RANGE, 0.1)), + MYSTIC_LORE(27, 6, 865, 29, PrayerCategory.LIME_GREEN, 2668, new SkillBonus(Skills.MAGIC, 0.1)), + STEEL_SKIN(28, 3, 92, 31, PrayerCategory.BABY_BLUE, 2687, new SkillBonus(Skills.DEFENCE, 0.15)), + ULTIMATE_STRENGTH(31, 3, 93, 33, PrayerCategory.GREEN, 2691, new SkillBonus(Skills.STRENGTH, 0.15)), + INCREDIBLE_REFLEXES(34, 3, 94, 35, PrayerCategory.PINK, 2667, new SkillBonus(Skills.ATTACK, 0.15)), + PROTECT_FROM_SUMMONING(35, 2, 1168, 53, PrayerCategory.DARK_BROWN, PrayerCategory.MAGENTA, new Audio(-1)), + PROTECT_FROM_MAGIC(37, 3, 95, 37, PrayerCategory.LIGHT_BROWN, 2675), + PROTECT_FROM_MISSILES(40, 3, 96, 39, PrayerCategory.LIGHT_BROWN, 2677), + PROTECT_FROM_MELEE(43, 4, 97, 41, PrayerCategory.LIGHT_BROWN, 2676), + EAGLE_EYE(44, 3, 866, 43, PrayerCategory.LIME_GREEN, 2666, new SkillBonus(Skills.RANGE, 0.15)), + MYSTIC_MIGHT(45, 3, 867, 45, PrayerCategory.LIME_GREEN, 2669, new SkillBonus(Skills.MAGIC, 0.15)), + RETRIBUTION(46, 12, 98, 47, PrayerCategory.LIGHT_BROWN, PrayerCategory.MAGENTA, new Audio(10000)), + REDEMPTION(49, 6, 99, 49, PrayerCategory.LIGHT_BROWN, PrayerCategory.MAGENTA, new Audio(2678)), + SMITE(52, 2, 100, 51, PrayerCategory.LIGHT_BROWN, PrayerCategory.MAGENTA, new Audio(2685)), + CHIVALRY(60, 2, 1052, 55, PrayerCategory.PINK, 1000,65, new SkillBonus(Skills.DEFENCE, 0.2), new SkillBonus(Skills.STRENGTH, 0.18), new SkillBonus(Skills.ATTACK, 0.15)), + PIETY(70, 2, 1053, 57, PrayerCategory.PINK, 1000, 70 , new SkillBonus(Skills.DEFENCE, 0.25), new SkillBonus(Skills.STRENGTH, 0.23), new SkillBonus(Skills.ATTACK, 0.2)); + + /** + * Represents the a cache of objects related to prayers in order to decide + * what head icon to display. + */ + private final static Object[][] ICON_CACHE = new Object[][] { { REDEMPTION, 5 }, { RETRIBUTION, 3 }, { SMITE, 4 }, { PROTECT_FROM_MAGIC, 2, 10 }, { PROTECT_FROM_MELEE, 0, 8 }, { PROTECT_FROM_MISSILES, 1, 9 }, { PROTECT_FROM_SUMMONING, 7, PROTECT_FROM_MELEE, 8, PROTECT_FROM_MISSILES, 9, PROTECT_FROM_MAGIC, 10 } }; + + /** + * The level required. + */ + private final int level; + + /** + * The drain rate. + */ + private final int drain; + + /** + * The configuration id of the prayer. + */ + private final int config; + + /** + * The button id. + */ + private final int button; + + /** + * The restriction. + */ + private final PrayerCategory restriction; + + /** + * Represents the second restriction. + */ + private final PrayerCategory secondRestriction; + + /** + * The sound. + */ + private Audio sound; + + /** + * The required level of defence to use this prayer. + */ + private int defenceReq; + + /** + * The skill bonuses for this type. + */ + private final SkillBonus[] bonuses; + + /** + * Constructs a new {@code PrayerType} {@code Object}. + * @param level the level. + * @param drain the drain, represents the seconds until a drain. + * @param config the config value to represent on and off. + * @param button the button value to turn the prayer off and on. + * @param bonuses the skill bonuses for this type. + */ + PrayerType(int level, int drain, int config, int button, PrayerCategory restriction, int soundId, SkillBonus... bonuses) { + this(level, drain, config, button, restriction, null, new Audio(soundId), bonuses); + } + + /** + * + * Constructs a new @{Code PrayerType} object. + * @param level + * @param drain + * @param config + * @param button + * @param restriction + * @param soundId + * @param defenceReq + * @param bonuses + */ + PrayerType(int level, int drain, int config, int button, PrayerCategory restriction, int soundId, int defenceReq, SkillBonus... bonuses) { + this(level, drain, config, button, restriction, null, new Audio(soundId), defenceReq,bonuses); + } + + /** + * Constructs a new {@code PrayerType} {@code Object}. + * @param level the level. + * @param drain the drain, represents the seconds until a drain. + * @param config the config value to represent on and off. + * @param button the button value to turn the prayer off and on. + * @param bonuses the skill bonuses for this type. + */ + PrayerType(int level, int drain, int config, int button, PrayerCategory restriction, PrayerCategory secondRestriction, Audio sound, SkillBonus... bonuses) { + this(level,drain,config,button,restriction,secondRestriction,sound,1,bonuses); + } + + /** + * + * Constructs a new @{Code PrayerType} object. + * @param level + * @param drain + * @param config + * @param button + * @param restriction + * @param secondRestriction + * @param sound + * @param defenceReq + * @param bonuses + */ + PrayerType(int level, int drain, int config, int button, PrayerCategory restriction, PrayerCategory secondRestriction, Audio sound, int defenceReq, SkillBonus... bonuses) { + this.level = level; + this.drain = drain; + this.config = config; + this.button = button; + this.restriction = restriction; + this.secondRestriction = secondRestriction; + this.sound = sound; + this.bonuses = bonuses; + this.defenceReq = defenceReq; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the drain. + * @return The drain. + */ + public int getDrain() { + return drain; + } + + /** + * Gets the config. + * @return The config. + */ + public int getConfig() { + return config; + } + + /** + * Gets the button. + * @return The button. + */ + public int getButton() { + return button; + } + + /** + * Gets the restriction. + * @return The restriction. + */ + public PrayerCategory getRestriction() { + return restriction; + } + + /** + * Gets the bonuses. + * @return The bonuses. + */ + public SkillBonus[] getBonuses() { + return bonuses; + } + + /** + * Method used to check if the player has the required level to toggle this + * type. + * @param player the player. + * @return True if it is permitted. + */ + public boolean permitted(final Player player) { + if (player.getSkills().getStaticLevel(Skills.PRAYER) < getLevel() || player.getSkills().getStaticLevel(Skills.DEFENCE) < defenceReq) { + player.getAudioManager().send(2673); + player.getDialogueInterpreter().sendDialogue("You need a Prayer level of " + getLevel() + (player.getSkills().getStaticLevel(Skills.DEFENCE) < defenceReq ? (" and a Defence level of " + defenceReq) : "") + " to use " + StringUtils.formatDisplayName(name().toLowerCase().replace("_", " ")) + "."); + return false; + } + return true; + } + + /** + * Method used to check if we need to toggle a prayer on or off. + * @param player the player. + * @return True if toggled. + */ + public boolean toggle(final Player player, final boolean on) { + player.getConfigManager().set(getConfig(), on ? 1 : 0); + if (on) { + flag(player, this); + player.getPrayer().getActive().add(this); + player.getPrayer().getTask().init(player); + iconify(player, getIcon(player, this)); + player.getAudioManager().send(getSound()); + } else { + player.getPrayer().getActive().remove(this); + findNextIcon(player); + if (player.getPrayer().getActive().isEmpty()) { + player.getPrayer().getTask().stop(player); + return true; + } + } + return true; + } + + /** + * Method used to flag others prayers that cannot be toggled together. + * @param player the player. + */ + public void flag(final Player player, final PrayerType type) { + final List active = player.getPrayer().getActive(); + final PrayerType[] remove = new PrayerType[active.size() + 10]; + int index = 0; + for (int i = 0; i < active.size(); i++) { + if (active.get(i).getRestriction() == type.getRestriction() || active.get(i).getSecondRestriction() != null && type.getSecondRestriction() != null && active.get(i).getSecondRestriction() == type.getSecondRestriction()) { + remove[index++] = active.get(i); + continue; + } + for (SkillBonus b : active.get(i).getBonuses()) { + for (SkillBonus bb : type.getBonuses()) { + if ((bb.getSkillId() == b.getSkillId()) || (b.getSkillId() == Skills.STRENGTH || b.getSkillId() == Skills.ATTACK) && (bb.getSkillId() == Skills.MAGIC || bb.getSkillId() == Skills.RANGE) || (b.getSkillId() == Skills.RANGE || b.getSkillId() == Skills.MAGIC) && (bb.getSkillId() == Skills.ATTACK || bb.getSkillId() == Skills.STRENGTH) || (b.getSkillId() == Skills.DEFENCE && bb.getSkillId() == Skills.DEFENCE)) { + remove[index++] = active.get(i); + } + } + } + } + for (int i = 0; i < index; i++) { + remove[i].toggle(player, false); + } + } + + /** + * Method used to iconify the player. + */ + public boolean iconify(final Player player, final int icon) { + if (icon == -1) { + return false; + } + player.getAppearance().setHeadIcon(icon); + player.getAppearance().sync(); + return false; + } + + /** + * Method used to find the next icon in place. + * @param player the player. + */ + public void findNextIcon(final Player player) { + if (!hasIcon(player)) { + player.getAppearance().setHeadIcon(-1); + player.getAppearance().sync(); + } + if ((this == PROTECT_FROM_MELEE || this == PROTECT_FROM_MISSILES || this == PROTECT_FROM_MAGIC) && player.getPrayer().get(PROTECT_FROM_SUMMONING)) { + iconify(player, 7); + } else if (this == PROTECT_FROM_SUMMONING) { + for (PrayerType t : player.getPrayer().getActive()) { + iconify(player, getIcon(player, t)); + } + if (player.getAppearance().getHeadIcon() == 7) { + player.getAppearance().setHeadIcon(-1); + player.getAppearance().sync(); + } + } + } + + /** + * Method used to get the icon value. + * @return the icon. + */ + public int getIcon(final Player player, final PrayerType type) { + List active = player.getPrayer().getActive(); + for (int i = 0; i < ICON_CACHE.length; i++) { + if (ICON_CACHE[i].length == 2 && type == ((PrayerType) ICON_CACHE[i][0])) { + return (int) ICON_CACHE[i][1]; + } else if (ICON_CACHE[i].length == 3 && type == ((PrayerType) ICON_CACHE[i][0])) { + if (active.contains(PROTECT_FROM_SUMMONING)) { + return (int) ICON_CACHE[i][2]; + } + return (int) ICON_CACHE[i][1]; + } else if (ICON_CACHE[i].length == 8 && type == ((PrayerType) ICON_CACHE[i][0])) { + for (int k = 2; k < ICON_CACHE[i].length; k++) { + if (active.contains(ICON_CACHE[i][k])) { + return (int) ICON_CACHE[i][k + 1]; + } + } + return (int) ICON_CACHE[i][1]; + } + } + return -1; + } + + /** + * Method used to check if theres an icon present. + * @param player the player. + * @return True if theres an icon present. + */ + public boolean hasIcon(final Player player) { + int count = 0; + for (PrayerType type : player.getPrayer().getActive()) { + if (getIcon(player, type) != -1) { + count++; + } + } + return count != 0; + } + + /** + * Method used to return the type by the button. + * @param button the button. + * @return the type. + */ + public static PrayerType get(int button) { + for (PrayerType type : PrayerType.values()) { + if (type.getButton() == button) { + return type; + } + } + return null; + } + + /** + * Method used to get the melee types. + * @return the types. + */ + public static PrayerType[] getMeleeTypes() { + return getByBonus(Skills.ATTACK, Skills.STRENGTH); + } + + /** + * Method used to get the rage types. + * @return the types. + */ + public static PrayerType[] getRangeTypes() { + return getByBonus(Skills.RANGE); + } + + /** + * Method used to get the magic types. + * @return the types. + */ + public static PrayerType[] getMagicTypes() { + return getByBonus(Skills.MAGIC); + } + + /** + * Method used to get the prayer types by the bonuses. + * @param ids the ids. + * @return the type. + */ + public static PrayerType[] getByBonus(int... ids) { + PrayerType[] types = new PrayerType[values().length]; + int count = 0; + for (PrayerType type : values()) { + for (SkillBonus b : type.getBonuses()) { + for (int i : ids) { + if (i == b.getSkillId()) { + types[count] = type; + count++; + } + } + } + } + return types; + } + + /** + * Gets the secondRestriction. + * @return The secondRestriction. + */ + public PrayerCategory getSecondRestriction() { + return secondRestriction; + } + + /** + * Gets the sound. + * @return The sound. + */ + public Audio getSound() { + return sound; + } + + public int getDefenceReq() { + return defenceReq; + } + + public void setDefenceReq(int defenceReq) { + this.defenceReq = defenceReq; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/quest/Quest.java b/Server/src/main/java/Server/core/game/node/entity/player/link/quest/Quest.java new file mode 100644 index 000000000..b56fae868 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/quest/Quest.java @@ -0,0 +1,288 @@ +package core.game.node.entity.player.link.quest; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; +import core.plugin.PluginManifest; +import core.plugin.PluginType; + +import java.util.Arrays; + +/** + * A skeleton plugin for a quest. + * @author Vexia + * + */ +@PluginManifest(type = PluginType.QUEST) +public abstract class Quest implements Plugin { + + /** + * Represents the red string. + */ + public static final String RED = ""; + + /** + * Represents the blue string. + */ + public static final String BLUE = ""; + + /** + * Represents the black string. + */ + public static final String BLACK = ""; + + /** + * The constant representing the journal component. + */ + public static final int JOURNAL_COMPONENT = 275; + + /** + * The constant representing the quest reward component. + */ + public static final int REWARD_COMPONENT = 277; + + /** + * The name of the quest. + */ + private final String name; + + /** + * The index id of the quest. + */ + private final int index; + + /** + * The button id of the quest. + */ + private final int buttonId; + + /** + * The rewarded quest points. + */ + private final int questPoints; + + /** + * The config values based on stage. + */ + private final int[] configs; + + /** + * Constructs a new {@Code Quest} {@Code Object} + * @param name The name. + * @param index The index. + * @param buttonId The button Id. + * @param questPoints The rewarded quest points. + * @param configs The configs. + */ + public Quest(String name, int index, int buttonId, int questPoints, int...configs) { + this.name = name; + this.index = index; + this.buttonId = buttonId; + this.questPoints = questPoints; + this.configs = configs; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public abstract Quest newInstance(Object object); + + /** + * Starts this quest. + * @param player The player. + */ + public void start(Player player) { + player.getQuestRepository().setStage(this, 10); + player.getQuestRepository().syncronizeTab(player); + } + + /** + * Draws the text on the quest journal. + * @param player The player. + * @param stage The stage to draw. + */ + public void drawJournal(Player player, int stage) { + for (int i = 0; i < 311; i++) { + player.getPacketDispatch().sendString("" , JOURNAL_COMPONENT, i); + } + player.getPacketDispatch().sendString("" + getName() + "", JOURNAL_COMPONENT, 2); + + } + + /** + * Finishes the quest. + * @param player The player. + */ + public void finish(Player player) { + for (int i = 0; i < 18; i++) { + if (i == 9 || i == 3 || i == 6) { + continue; + } + player.getPacketDispatch().sendString("", 277, i); + } + player.getQuestRepository().setStage(this, 100); + player.getQuestRepository().incrementPoints(getQuestPoints()); + player.getQuestRepository().syncronizeTab(player); + player.getConfigManager().set(101, player.getQuestRepository().getPoints()); + player.getInterfaceManager().open(new Component(277)); + player.getPacketDispatch().sendString("" + player.getQuestRepository().getPoints() + "", 277, 7); + player.getPacketDispatch().sendString("You have completed the " + getName() + " Quest!", 277, 4); + player.getPacketDispatch().sendMessage("Congratulations! Quest complete!"); + player.getPacketDispatch().sendTempMusic(152); + } + + /** + * Draws a line on the journal component. + * @param player The player. + * @param message The message. + * @param line The line. + */ + public void line(Player player, String message, int line) { + String send = BLUE + "" + message.replace("", "

").replace("", BLUE).replace("", RED); + if (send.contains("

") || send.contains("")) { + String[] lines = send.split(send.contains("

") ? "

" : ""); + for (int i = 0; i < lines.length; i++) { + line(player, lines[i].replace("

", "").replace("", ""), line, false); + line++; + } + } else { + send = send.replace("!!",RED).replace("??",BLUE).replace("---",BLACK + "").replace("/--", BLUE); + line(player, send, line, false); + } + } + + /** + * Draws a line on the quest journal component. + * @param player The player. + * @param message The message. + * @param line The line number. + * @param crossed True if the message should be crossed out. + */ + public void line(Player player, String message, int line, final boolean crossed) { + String send = message; + if(!crossed){ + send = BLUE + "" + message.replace("", "

").replace("", BLUE).replace("", RED); + send = send.replace("!!",RED).replace("??",BLUE); + } else { + send = BLUE + "" + message.replace("??","").replace("!!",""); + } + player.getPacketDispatch().sendString(crossed ? "" + send + "" : send, JOURNAL_COMPONENT, line); + } + + /** + * Draws text on the quest reward component. + * @param player The player. + * @param string The string to draw. + * @param line The line number to draw on. + */ + public void drawReward(Player player, final String string, final int line) { + player.getPacketDispatch().sendString(string, REWARD_COMPONENT, line); + } + + /** + * Sets the player instanced stage. + * @param player The player. + * @param stage The stage to set. + */ + public void setStage(Player player, int stage) { + player.getQuestRepository().setStage(this, stage); + } + + /** + * Gets the config id based on the stage. + * @param player The player. + * @param stage The stage. + * @return The config data. + */ + public int[] getConfig(Player player, int stage) { + if (configs.length < 4) { + throw new IndexOutOfBoundsException("Quest -> " + name + " configs array length was not valid. config length = " + configs.length + "!"); + } + return new int[] {configs[0], stage == 0 ? configs[1] : stage >= 100 ? configs[3] : configs[2]}; + } + + /** + * Checks if the quest is in progress. + * @param player The player. + * @return {@code True} if so. + */ + public boolean isStarted(Player player) { + return getStage(player) > 0 && getStage(player) < 100; + } + + /** + * Checks if the quest is completed. + * @param player The player. + * @return {@code True} if so. + */ + public boolean isCompleted(Player player) { + return getStage(player) >= 100; + } + + /** + * Gets the player instanced stage of this quest. + * @param player The player. + * @return The stage. + */ + public int getStage(Player player) { + return player.getQuestRepository().getStage(this); + } + + /** + * Checks the requirements for the quest. + * @param player The player + * @return {@code True} if so. + */ + public boolean hasRequirements(Player player) { + return true; + } + + /** + * Gets the name. + * @return the name. + */ + public String getName() { + return name; + } + + /** + * Gets the index. + * @return the index. + */ + public int getIndex() { + return index; + } + + /** + * Gets the buttonId. + * @return the buttonId. + */ + public int getButtonId() { + return buttonId; + } + + /** + * Gets the questPoints. + * @return the questPoints. + */ + public int getQuestPoints() { + return questPoints; + } + + /** + * Gets the configs. + * @return the configs. + */ + public int[] getConfigs() { + return configs; + } + + @Override + public String toString() { + return "Quest [name=" + name + ", index=" + index + ", buttonId=" + buttonId + ", questPoints=" + questPoints + ", configs=" + Arrays.toString(configs) + "]"; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/quest/QuestRepository.java b/Server/src/main/java/Server/core/game/node/entity/player/link/quest/QuestRepository.java new file mode 100644 index 000000000..3e944a001 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/quest/QuestRepository.java @@ -0,0 +1,337 @@ +package core.game.node.entity.player.link.quest; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.system.SystemLogger; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Manages the systems/players quest repository. + * + * @author Vexia + */ +public final class QuestRepository implements SavingModule { + + /** + * The static mapping of instanced quests. + */ + private static final Map QUESTS = new HashMap<>(); + + /** + * The mapping of quest indexes with related stages. + */ + private final Map quests = new HashMap<>(); + + /** + * The player instance for this manager. + */ + private final Player player; + + /** + * The current syncronized accumulated quest points. + */ + private int points; + + /** + * Constructs a new {@code QuestRepository} {@code Object}. + * + * @param player the player. + */ + public QuestRepository(final Player player) { + this.player = player; + for (Quest quest : QUESTS.values()) { + quests.put(quest.getIndex(), 0); + } + } + + @Override + public void save(ByteBuffer buffer) { + if (points != 0) { + buffer.put((byte) 1).putInt(points); + } + for (Entry entry : quests.entrySet()) { + buffer.put((byte) 4).putInt(entry.getKey()).put((byte) ((int) entry.getValue())); + } + Map backup = player.getAttribute("quest-backup", null); + if (backup != null) { + for (Entry entry : backup.entrySet()) { + buffer.put((byte) 4).putInt(entry.getKey()).put((byte) ((int) entry.getValue())); + } + } + buffer.put((byte) 0); + } + + public void parse(JSONObject questData){ + points = Integer.parseInt( questData.get("points").toString()); + JSONArray questArray = (JSONArray) questData.get("questStages"); + questArray.forEach(quest -> { + JSONObject q = (JSONObject) quest; + quests.put(Integer.parseInt( q.get("questId").toString()),Integer.parseInt(q.get("questStage").toString())); + }); + syncPoints(); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + int stage = 0; + int index = 0; + while ((opcode = buffer.get() & 0xFF) != 0) { + switch (opcode) { + case 1: + points = buffer.getInt(); + break; + case 3: + index = buffer.getInt(); + stage = buffer.getInt(); + buffer.getInt();//state + if (forIndex(index) == null) { + //SystemLogger.error("[Quest Repository] parsed quest index -> " + index + " no quest found!"); + break; + } + quests.put(index, stage); + break; + case 4://new parsing. + index = buffer.getInt(); + stage = buffer.get(); + if (forIndex(index) == null) { + Map backup = player.getAttribute("quest-backup", new HashMap()); + backup.put(index, stage); + player.setAttribute("quest-backup", backup); + // SystemLogger.error("[Quest Repository] parsed quest index -> " + index + " no quest found! Stored in quest data backup for reparse."); + break; + } + if (!quests.containsKey(index)) {//YOU FORGOT YOUR ! DAMMIT + break; + } + quests.put(index, stage); + break; + } + } + syncPoints(); + } + + /** + * Synchronizes the quest tab. + * + * @param player The player. + */ + public void syncronizeTab(Player player) { + player.getConfigManager().set(101, points); + int[] config = null; + if(!player.getAttribute("quest-varps-converted",false)) { + for (Quest quest : QUESTS.values()) { + config = quest.getConfig(player, getStage(quest)); + player.varpManager.get(config[0]).setVarbit(0,config[1]).send(player); + player.varpManager.flagSave(config[0]); + player.setAttribute("/save:quest-varps-converted",true); +// System.out.println(quest.getName() + " - > stage = " + getStage(quest) + " - configs = { " + config[0] + " " + config[1] + " }"); + } + } else { + for(Quest quest : QUESTS.values()){ + if(quest.getIndex() == 81 && quest.isCompleted(player)){ + player.varpManager.get(534).setVarbit(15,2).setVarbit(18,2).setVarbit(21,2).setVarbit(24,2).setVarbit(12,2).send(player); + } + config = quest.getConfig(player,getStage(quest)); + player.varpManager.get(config[0]).setVarbit(0,config[1]).send(player); + } + } + } + + /** + * Sets the stage of a quest. + * + * @param quest The quest. + * @param stage The stage. + */ + public void setStage(Quest quest, int stage) { + quests.put(quest.getIndex(), stage); + } + + /** + * Increments the obtained points by the value. + * + * @param value the value. + */ + public void incrementPoints(int value) { + points += value; + } + + /** + * Decrease the points by the value. + * + * @param value the value. + */ + public void dockPoints(int value) { points -= value; } + + /** + * Syncronizes the quest points. + */ + public void syncPoints() { + int points = 0; + for (Quest quest : QUESTS.values()) { + if (getStage(quest) >= 100) { + points += quest.getQuestPoints(); + } + } + this.points = points; + } + + /** + * Gets the available quest points. + * + * @return The availble quest points. + */ + public int getAvailablePoints() { + int points = 0; + for (Quest quest : QUESTS.values()) { + points += quest.getQuestPoints(); + } + return points; + } + + /** + * Gets the quest for the button id. + * + * @param buttonId The button id. + * @return The quest. + */ + public Quest forButtonId(int buttonId) { + for (Quest q : QUESTS.values()) { + if (q.getButtonId() == buttonId) { + return q; + } + } + return null; + } + + /** + * Gets the quest for the index. + * + * @param index The index. + * @return The quest. + */ + public Quest forIndex(int index) { + for (Quest q : QUESTS.values()) { + if (q.getIndex() == index) { + return q; + } + } + return null; + } + + /** + * Checks if all quests are completed. + * + * @return {@code True} if so. + */ + public boolean hasCompletedAll() { + return getPoints() >= getAvailablePoints(); + } + + /** + * Checks if the quest is complete. + * + * @param name The name of the quest. + * @return {@code True} if so. + */ + public boolean isComplete(String name) { + Quest quest = getQuest(name); + if (quest == null) { + SystemLogger.logErr("Error can't check if quest is complete for " + name); + return false; + } + return quest.getStage(player) >= 100; + } + + /** + * Checks if the quest has at least started. + * + * @param name The name of the quest. + * @return {@code True} if so. + */ + public boolean hasStarted(String name) { + Quest quest = getQuest(name); + if (quest == null) { + SystemLogger.logErr("Error can't check if quest is complete for " + name); + return false; + } + return quest.getStage(player) > 0; + } + + + /** + * Gets the stage of quest by name. + * + * @param name The name of the quest. + * @return The stage. + */ + public int getStage(String name) { + return getStage(QUESTS.get(name)); + } + + /** + * Gets the stage of a quest. + * + * @param quest The quest. + * @return The stage. + */ + public int getStage(Quest quest) { + return quests.get(quest.getIndex()); + } + + /** + * Gets the quest by name. + * + * @param name The name. + * @return The quest. + */ + public Quest getQuest(String name) { + return QUESTS.get(name); + } + + /** + * Gets the points. + * + * @return the points. + */ + public int getPoints() { + return points; + } + + /** + * Gets the player. + * + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Registers the quest to the repository. + * + * @param quest The quest. + */ + public static void register(Quest quest) { + QUESTS.put(quest.getName(), quest); + } + + /** + * Gets the quest repository. + * + * @return the quests. + */ + public static Map getQuests() { + return QUESTS; + } + + public Map getQuestList() {return quests;} + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/request/RequestManager.java b/Server/src/main/java/Server/core/game/node/entity/player/link/request/RequestManager.java new file mode 100644 index 000000000..a4dd0534f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/request/RequestManager.java @@ -0,0 +1,136 @@ +package core.game.node.entity.player.link.request; + +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; + +/** + * Represents a managing class for requests of a player. + * @author Vexia + */ +public final class RequestManager { + + /** + * Represents the player instance. + */ + private final Player player; + + /** + * Represents the target being requested. + */ + private Player target; + + /** + * Constructs a new {@code RequestManager} {@code Object}. + * @param player the player. + */ + public RequestManager(final Player player) { + this.player = player; + } + + /** + * Method used to send a request type to a target. + * @param target the target. + * @param type the type of request. + * @return {@code True} if successful in requesting. + */ + public boolean request(final Player target, final RequestType type) { + if (!canRequest(type, target)) { + return false; + } + if (acceptExisting(target, type)) { + return true; + } + player.getPacketDispatch().sendMessage(type.getMessage()); + target.getPacketDispatch().sendMessage(type.getRequestMessage(player)); + player.setAttribute("lastRequest", type); + this.target = target; + return true; + } + + /** + * Method used to check if a player can continue with a request. + * @param type the type. + * @param target the target. + * @return {@code True} if they can request. + */ + private boolean canRequest(RequestType type, Player target) { + if (target == player) { + return false; + } + if (!TutorialSession.getExtension(player).finished() || !TutorialSession.getExtension(target).finished()) { + return false; + } + if (!target.getLocation().withinDistance(player.getLocation(), 15)) { + player.getPacketDispatch().sendMessage("Unable to find " + target.getUsername() + "."); + return false; + } + if (!target.isActive() || target.getInterfaceManager().isOpened()) { + player.getPacketDispatch().sendMessage("Other player is busy at the moment."); + return false; + } + if (target.getAttribute("busy", 0) > GameWorld.getTicks() || player.getAttribute("busy", 0) > GameWorld.getTicks()) { + player.getPacketDispatch().sendMessage("Other player is busy at the moment."); + return false; + } + if (!player.getZoneMonitor().canRequest(type, target)) { + return false; + } + return type.canRequest(player, target); + } + + /** + * Method used to check if we can accept an existing request. + * @param target the target. + * @param type the type. + * @return {@code True} if so. + */ + public boolean acceptExisting(final Player target, final RequestType type) { + final RequestType lastType = target.getAttribute("lastRequest", null); + if (lastType == type && player == target.getRequestManager().getTarget()) { + close(player); + clear(); + target.getRequestManager().clear(); + player.setAttribute("busy", GameWorld.getTicks() + 2); + target.setAttribute("busy", GameWorld.getTicks() + 2); + type.getModule().open(player, target); + return true; + } + close(player); + return false; + } + + /** + * Closes the components for the player. + * @param player the player. + */ + private void close(Player player) { + player.getDialogueInterpreter().close(); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeChatbox(); + } + + /** + * Method used to clear the cached target. + */ + public void clear() { + this.target = null; + } + + /** + * Gets the player. + * @return the player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the target. + * @return the target. + */ + public Player getTarget() { + return target; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/request/RequestModule.java b/Server/src/main/java/Server/core/game/node/entity/player/link/request/RequestModule.java new file mode 100644 index 000000000..6bf96e385 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/request/RequestModule.java @@ -0,0 +1,18 @@ +package core.game.node.entity.player.link.request; + +import core.game.node.entity.player.Player; + +/** + * Represents the module used for all request types. + * @author 'Vexia + */ +public interface RequestModule { + + /** + * Method invoked when the targeting player accepts a request. + * @param player the player. + * @param target the target. + */ + public void open(final Player player, final Player target); + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/request/RequestType.java b/Server/src/main/java/Server/core/game/node/entity/player/link/request/RequestType.java new file mode 100644 index 000000000..24856d956 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/request/RequestType.java @@ -0,0 +1,101 @@ +package core.game.node.entity.player.link.request; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.assist.AssistSession; +import core.game.node.entity.player.link.request.trade.TradeModule; + +/** + * Represents a request type. + * @author 'Vexia + * @author Emperor + */ +public class RequestType { + + /** + * The trade request type. + */ + public static final RequestType TRADE = new RequestType("Sending a trade offer...", ":tradereq:", new TradeModule()); + + /** + * The assist request type. + */ + public static final RequestType ASSIST = new RequestType("Sending assistance request...", ":assistreq:", new AssistSession()); + + /** + * Represents the message to send for the player when requesting. + */ + private final String message; + + /** + * Represents the requesting message type. + */ + private final String requestMessage; + + /** + * Represents the module used for this type of requesting. + */ + private final RequestModule module; + + /** + * Constructs a new {@code RequestManager {@code Object}. + * @param message the message. + * @param requestMessage the requesting message. + */ + public RequestType(String message, String requestMessage, RequestModule module) { + this.message = message; + this.requestMessage = requestMessage; + this.module = module; + } + + /** + * Checks if the request can be made. + * @param player The player. + * @param target The target. + * @return {@code True} if so. + */ + public boolean canRequest(Player player, Player target) { + return true; + } + + /** + * Gets the requesting message formated with the targets name. + * @param target the target. + * @return the message to send. + */ + public String getRequestMessage(Player target) { + return target.getUsername() + getRequestMessage(); + } + + /** + * Method used to get the request type by the option being handled. + * @param option the option being handled. + * @return the request type in correlation. + */ + public static RequestType forOption(String option) { + return option.equals("trade with") ? TRADE : ASSIST; + } + + /** + * Gets the message. + * @return The message. + */ + public String getMessage() { + return message; + } + + /** + * Gets the requestMessage. + * @return The requestMessage. + */ + public String getRequestMessage() { + return requestMessage; + } + + /** + * Gets the request module. + * @return the module. + */ + public RequestModule getModule() { + return module; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/request/assist/AssistSession.java b/Server/src/main/java/Server/core/game/node/entity/player/link/request/assist/AssistSession.java new file mode 100644 index 000000000..0d3253099 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/request/assist/AssistSession.java @@ -0,0 +1,469 @@ +package core.game.node.entity.player.link.request.assist; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.RequestModule; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +import java.util.Calendar; +import java.util.Date; + +/** + * Represents the class used to handle the assist requesting of a {@link Player} + * . + * @author 'Vexia + * @date Oct 3, 2013 + */ +public final class AssistSession extends Pulse implements RequestModule { + + /** + * Represents the player of this request assist class. + */ + private Player player; + + /** + * Represents the partener of this class. + */ + private Player partener; + + /** + * Represents the {@link Component} to display. + */ + private final Component component = new Component(301).setCloseEvent(getCloseEvent()); + + /** + * Represents the {@link Animation} of assisting a player. + */ + private static final Animation ANIMATION = Animation.create(7299); + + /** + * Represents the {@link Graphics} of assisting a player. + */ + private static final Graphics GRAPHIC = Graphics.create(1247); + + /** + * The time out until the exp is reset. + */ + private static final long TIME_OUT = 86400000;// 60000; //86400000; + + /** + * Represents the config values of toggling a button. + */ + private static final byte[] CONFIG_VALUES = { 3, 4, 6, 8, 9, 11, 13, 14, 15 }; + + /** + * Represents used child values of the experience to show. + */ + private static final int[] CHILD_VALUES = { 46, 48, 50, 52, 54, 56, 58, 60, 62 }; + + /** + * Represents the current skills being used. + */ + private boolean[] skills = new boolean[9]; + + /** + * Represents if the session is restricted from gaining experience. + */ + private boolean restricted = false; + + /** + * Represents the gained exp for the skill(index-experience). + */ + private double exp[] = new double[9]; + + /** + * Represents a kill switch for the session. + */ + private boolean kill = false; + + /** + * Represents the start time. + */ + private long time; + + /** + * Constructs a new {@code RequestAssist} {@code Object}. + * @param player the player. + * @param partener the partener. + */ + public AssistSession(final Player player, final Player partener) { + this.player = player; + this.partener = partener; + } + + /** + * Constructs a new {@code AssistSession} {@code Object}. + */ + public AssistSession() { + /** + * empty. + */ + } + + /** + * Method used to add the extension of this class to the {@literal Player}. + * @param player the player. + * @param partener the partener. + */ + public static final void extend(final Player player, final Player partener) { + player.addExtension(AssistSession.class, new AssistSession(player, partener)); + } + + /** + * Method used to get the extension of this class from the {@link Player}. + * @param player the player. + * @return the {@link AssistSession} (this). + */ + public final static AssistSession getExtension(final Player player) { + return player.getExtension(AssistSession.class); + } + + @Override + public void open(Player player, Player target) { + if (player.getIronmanManager().checkRestriction() || target.getIronmanManager().checkRestriction()) { + return; + } + player.face(target); + target.face(player); + AssistSession.extend(player, target); + AssistSession.getExtension(player).open(); + } + + /** + * Method used to be called only for the {@link #player} of this class which + * then extends this class to the partener. + */ + public final void open() { + partener.addExtension(AssistSession.class, this); + player.lock(); + player.getInterfaceManager().open(component); + load(); + player.getPacketDispatch().sendMessage("Sending assistance response."); + player.getPacketDispatch().sendMessage("You are assisting " + partener.getUsername() + "."); + partener.getPacketDispatch().sendMessage("You are being assisted by " + player.getUsername() + "."); + player.getPacketDispatch().sendString("Assist System XP Display - You are assisting " + partener.getUsername() + "", 301, 101); + player.getPacketDispatch().sendString("", 301, 10); + player.animate(ANIMATION); + player.graphics(GRAPHIC); + partener.animate(ANIMATION); + partener.getAudioManager().send(4010); + player.getAudioManager().send(4010); + toggleIcon(player, false); + toggleIcon(partener, false); + GameWorld.getPulser().submit(this); + refresh(); + } + + /** + * Method used to get the {@link CloseEvent} of the {@link Component}. + * @return the close event of the {@link #component}. + */ + public final CloseEvent getCloseEvent() { + return new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + save(); + player.removeExtension(AssistSession.class); + partener.removeExtension(AssistSession.class); + player.unlock(); + toggleIcon(player, true); + toggleIcon(partener, true); + player.getInterfaceManager().restoreTabs(); + player.getPacketDispatch().sendMessage("You have stopped assisting " + partener.getUsername() + "."); + partener.getPacketDispatch().sendMessage(getPlayer().getUsername() + " has stopped assisting you."); + kill = true; + return true; + } + }; + } + + /** + * Method used to toggle the assisting icons. + * @param player the player. + * @param hide the icon or not. + */ + public final void toggleIcon(final Player player, final boolean hide) { + for (int i = 79; i < 81; i++) { + player.getPacketDispatch().sendInterfaceConfig(548, i, hide); + } + } + + /** + * Method used to override the adding of experience when the player is the + * assister. + * @param skill the skill. + * @param experience the experience. + */ + public final void addExperience(final int skill, final double experience) { + if (restricted || getTotalExperience() >= 30000) { + restricted = true; + return; + } + final int skillIndex = getSkillIndex(skill); + if (exp[skillIndex] + experience >= 30000) { + exp[skillIndex] = 30000; + restricted = true; + return; + } + exp[skillIndex] += experience; + if (exp[skillIndex] >= 30000) { + exp[skillIndex] = 30000; + } + refresh(); + } + + /** + * Method used to refresh the interface. + */ + public final void refresh() { + int value = 0; + double totalXp = 0; + for (byte i = 0; i < 9; i++) { + if (exp[i] >= 30000) { + exp[i] = 30000; + } + player.getPacketDispatch().sendString("" + (int) exp[i], 301, CHILD_VALUES[i]); + if (skills[i]) { + value |= 1 << CONFIG_VALUES[i]; + } + totalXp += exp[i]; + } + if (getTotalExperience() >= 30000) { + restricted = true; + } else { + restricted = false; + } + String message = ""; + if (isRestricted()) { + message = "You've earned the maximum XP from the Assist System within a 24-hour period. You can assist again in " + getTimeLeft() + "."; + } + player.getPacketDispatch().sendString(message, 301, 10); + player.getConfigManager().set(1087, value); + player.getConfigManager().set(1088, (int) totalXp * 10); + } + + /** + * Method used to toggle the skill button. + * @param id the id. + */ + public final void toggleButton(final byte id) { + skills[id] = skills[id] ? false : true; + } + + /** + * Method used to check if a specified skill is currently toggled. + * @param skill the skill. + * @return True if toggled. + */ + public final boolean isToggled(final int skill) { + return skills[getSkillIndex(skill)]; + } + + /** + * Method used to get the skill index by the skill id. + * @param skill the skill id. + * @return the index. + */ + public final int getSkillIndex(int skill) { + switch (skill) { + case Skills.RUNECRAFTING: + return 0; + case Skills.CRAFTING: + return 1; + case Skills.FLETCHING: + return 2; + case Skills.CONSTRUCTION: + return 3; + case Skills.FARMING: + return 4; + case Skills.MAGIC: + return 5; + case Skills.SMITHING: + return 6; + case Skills.COOKING: + return 7; + case Skills.HERBLORE: + return 8; + } + return -1; + } + + /** + * Method used to get the skill array. + * @return the array of skill's turned on. + */ + public boolean[] getSkills() { + return skills; + } + + /** + * Method used to get the amount of time left. + * @return the formated time. + */ + public String getTimeLeft() { + Date date2 = new Date(time); + Date date1 = new Date(System.currentTimeMillis()); + Calendar calendar1 = Calendar.getInstance(); + Calendar calendar2 = Calendar.getInstance(); + calendar1.setTime(date1); + calendar2.setTime(date2); + long milliseconds1 = calendar1.getTimeInMillis(); + long milliseconds2 = calendar2.getTimeInMillis(); + long diff = milliseconds2 - milliseconds1; + long diffSeconds = diff / 1000; + long diffMinutes = diff / (60 * 1000); + long diffHours = diff / (60 * 60 * 1000); + if (diffHours > 1) { + return "" + diffHours + " hours"; + } + if (diffMinutes > 1) { + return "" + diffMinutes + " minutes"; + } + return "" + diffSeconds + " seconds"; + } + + /** + * Method used to return the total experience gained. + * @return the experience gained. + */ + public double getTotalExperience() { + double xp = 0; + for (int i = 0; i < 9; i++) { + xp += exp[i]; + } + return xp; + } + + /** + * Method used to return the {@link Player}. + * @return the Player. + */ + public final Player getPlayer() { + return player; + } + + /** + * Method used to load the information. + */ + public final void load() { + time = player.getSavedData().getGlobalData().getAssistTime(); + if (time == 0) { + player.getSavedData().getGlobalData().setAssistTime(System.currentTimeMillis() + TIME_OUT); + } + for (int i = 0; i < 9; i++) { + exp[i] = player.getSavedData().getGlobalData().getAssistExperience()[i]; + } + } + + /** + * Method used to save the assist data. + */ + public final void save() { + player.getSkills().refresh(); + player.getSavedData().getGlobalData().setAssistTime(time); + player.getSavedData().getGlobalData().setAssistExperience(exp); + } + + /** + * Method used to reset the assist data. + */ + public final void reset() { + player.getSavedData().getGlobalData().setAssistTime(0L); + player.getSavedData().getGlobalData().setAssistExperience(new double[9]); + load(); + } + + @Override + public boolean pulse() { + if (!player.getLocation().withinDistance(partener.getLocation(), 20) || !partener.isActive() || !player.isActive()) { + player.getInterfaceManager().close(); + return true; + } + if (time < System.currentTimeMillis()) { + time = System.currentTimeMillis() + TIME_OUT; + for (int i = 0; i < 9; i++) { + exp[i] = 0; + } + } + refresh(); + return kill; + } + + /** + * Translates experience to another player. + * @param p the p. + * @param slot the slot. + * @param experience the exp. + * @param mod the mod. + * @return {@code True} if translated. + */ + public boolean translateExperience(Player p, int slot, double experience, double mod) { + if (getPlayer() != p) { + int index = getSkillIndex(slot); + if (index != -1) { + if (index != -1 && !isRestricted()) { + int level = p.getSkills().getLevel(slot); + int pLevel = player.getSkills().getLevel(slot); + if (pLevel < level) { + return false; + } + if (getSkills()[getSkillIndex(slot)]) { + if (getExp()[index] + experience >= 30000) { + experience = experience - (getExp()[index] + experience - 30000); + } + getPlayer().getSkills().addExperience(slot, experience); + addExperience(slot, experience * mod); + return true; + } + } + } + } + return false; + } + + /** + * Method used to return if the assist session is restricted. + * @return True if so. + */ + public boolean isRestricted() { + return restricted; + } + + /** + * Gets the exp. + * @return the exp. + */ + public double[] getExp() { + return exp; + } + + /** + * Sets th exp. + * @param exp the exp. + */ + public void setExp(double[] exp) { + this.exp = exp; + } + + /** + * Gets the partener. + * @return the partener + */ + public Player getPartener() { + return partener; + } + + /** + * Sets the bapartener. + * @param partener the partener to set. + */ + public void setPartener(Player partener) { + this.partener = partener; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/request/trade/TradeCloseEvent.java b/Server/src/main/java/Server/core/game/node/entity/player/link/request/trade/TradeCloseEvent.java new file mode 100644 index 000000000..78b1aa8b0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/request/trade/TradeCloseEvent.java @@ -0,0 +1,79 @@ +package core.game.node.entity.player.link.request.trade; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +/** + * Represents the close event invoked at the closing of a trade interface. + * @author Vexia + */ +public final class TradeCloseEvent implements CloseEvent { + + @Override + public boolean close(Player player, Component c) { + final TradeModule module = TradeModule.getExtension(player); + player.getPacketDispatch().sendRunScript(101, ""); + if (module == null) { + return true; + } + TradeModule otherModule = TradeModule.getExtension(module.getTarget()); + if (otherModule == null) { + return true; + } + if (module.isAccepted() && otherModule.isAccepted()) { + return true; + } + if (module.getStage() != 2) { + retainContainer(player); + retainContainer(module.getTarget()); + } + closeInterfaces(player); + closeInterfaces(module.getTarget()); + module.getTarget().getInterfaceManager().close(); + end(player); + player.getInterfaceManager().openDefaultTabs(); + end(module.getTarget()); + module.getTarget().getInterfaceManager().openDefaultTabs(); + return true; + } + + /** + * Method used to close the trade interface. + * @param player the player. + */ + private void closeInterfaces(final Player player) { + player.removeExtension(TradeModule.class); + player.getInterfaceManager().closeSingleTab(); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, 2, 24, new Item[] {}, 27, false)); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, 2, 23, new Item[] {}, 27, false)); + player.getPacketDispatch().sendRunScript(101, ""); + } + + /** + * Method used to end the trade session. + * @param player the player. + */ + private void end(final Player player) { + player.getConfigManager().set(1043, 0); + player.getConfigManager().set(1042, 0); + } + + /** + * Method used to retain the trade container. + * @param player the player. + */ + private void retainContainer(final Player player) { + final TradeModule module = TradeModule.getExtension(player); + if (module == null || module.isRetained()) { + return; + } + module.setRetained(true); + player.getInventory().addAll(module.getContainer()); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/request/trade/TradeContainer.java b/Server/src/main/java/Server/core/game/node/entity/player/link/request/trade/TradeContainer.java new file mode 100644 index 000000000..7925be588 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/request/trade/TradeContainer.java @@ -0,0 +1,241 @@ +package core.game.node.entity.player.link.request.trade; + +import core.cache.def.impl.ItemDefinition; +import core.game.container.*; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +/** + * Represents the container during a trade session. + * @author 'Vexia + */ +public final class TradeContainer extends Container { + + /** + * Represents the player of this container. + */ + private final Player player; + + /** + * Constructs a new {@code TradeContainer} {@code Object}. + * @param player the player. + */ + public TradeContainer(final Player player) { + super(28, ContainerType.DEFAULT, SortType.ID); + this.player = player; + this.getListeners().add(new TradeListener()); + } + + /** + * Method used to offer an item to the container. + * @param slot the slot of the item. + * @param amount the amount of the item. + */ + public void offer(final int slot, int amount) { + final Item item = getItem(slot, player.getInventory()); + if (!canUse()) { + return; + } + if (!validatedItem(item, slot, amount, player.getInventory())) { + return; + } + if (!tradeable(item) && !GameWorld.getSettings().isDevMode()) { + player.getPacketDispatch().sendMessage("You can't trade this item."); + return; + } + Item remove = new Item(item.getId(), amount); + remove.setAmount(stabalizeAmount(remove, amount, player.getInventory())); + if (!checkCapacity(remove, this)) { + player.getPacketDispatch().sendMessage("You must accept the current items before adding any more."); + return; + } + if (player.getInventory().remove(remove, slot, true) && super.add(remove)) { + if (TradeModule.getExtension(player).isAccepted() || TradeModule.getExtension(TradeModule.getExtension(player).getTarget()).isAccepted()) { + TradeModule.getExtension(player).setAccepted(false, true); + TradeModule.getExtension(TradeModule.getExtension(player).getTarget()).setAccepted(false, true); + } + TradeModule.getExtension(player).update(); + checkAlert(); + } + } + + /** + * Method used to withdraw an item from the container. + * @param slot the slot of the item. + * @param amount the amount of the item. + */ + public void withdraw(final int slot, int amount) { + Item item = getItem(slot, this); + if (!canUse()) { + return; + } + if (!validatedItem(item, slot, amount, this)) { + return; + } + Item remove = new Item(item.getId(), amount); + remove.setAmount(stabalizeAmount(remove, amount, this)); + if (!checkCapacity(remove, player.getInventory())) { + player.getPacketDispatch().sendMessage("You don't have enough space in your inventory."); + return; + } + if (super.remove(remove, slot, true) && player.getInventory().add(remove)) { + shift(); + TradeModule.getExtension(player).setModified(true); + if (TradeModule.getExtension(player).isAccepted() || TradeModule.getExtension(TradeModule.getExtension(player).getTarget()).isAccepted()) { + TradeModule.getExtension(player).setAccepted(false, true); + TradeModule.getExtension(TradeModule.getExtension(player).getTarget()).setAccepted(false, true); + TradeModule.getExtension(player).update(); + } else { + TradeModule.getExtension(player).update(); + } + } + if (TradeModule.getExtension(player).isModified()) { + alert(slot, true); + } + } + + @Override + public void shift() { + super.shift(); + } + + /** + * Method used to get the item from the slot based on container. + * @param slot the slot to get the item from. + * @param container the container to use. + * @return the item from the container at the slot. + */ + private Item getItem(int slot, final Container container) { + return container.get(slot); + } + + /** + * Method used to check if an item is validated. + * @param item the item. + * @param slot the slot. + * @param amount the amount. + * @param container the container. + * @return {@code True} if validated. + */ + private boolean validatedItem(final Item item, final int slot, final int amount, final Container container) { + if (item == null) { + return false; + } + return !(slot < 0 || slot > player.getInventory().capacity() || amount < 1); + } + + /** + * Method used to stabalize the amount attempting to be withdrawn/offered. + * @param item the item. + * @param amount the amount. + * @param container the container. + * @return the stabalized amount if over. + */ + private int stabalizeAmount(final Item item, int amount, final Container container) { + int maximum = container.getAmount(item); + return (amount > maximum ? maximum : amount); + } + + /** + * Method used to check if an item is tradeable. + * @param item the item. + * @return {@code True} if tradeable. + */ + private boolean tradeable(final Item item) { + final ItemDefinition definition = ItemDefinition.forId(item.getId()); + if (item.getId() == 11174 || item.getId() == 11173 || item.getId() == 759) { + return true; + } + if (player.getIronmanManager().isIronman() || TradeModule.getExtension(player).getTarget() != null && TradeModule.getExtension(player).getTarget().getIronmanManager().isIronman()) { + return false; + } + if (item.getName().equals("Coins") && item.getId() != 995) { + return false; + } + return definition.isTradeable(); + } + + /** + * Method used to check if the player can use the container. + * @return {@code True} if so. + */ + private boolean canUse() { + if (!player.getInterfaceManager().isOpened() || TradeModule.getExtension(player) == null || TradeModule.getExtension(TradeModule.getExtension(player).getTarget()) == null || TradeModule.getExtension(player).getStage() != 0) { + return false; + } + return true; + } + + /** + * Method used to check if the container has capacity for more items. + * @param item the item to remove or add. + * @param container the container to check capacity for. + * @return {@code True} if there is enough room. + */ + private boolean checkCapacity(final Item item, final Container container) { + if (item.getAmount() > container.getMaximumAdd(item)) { + item.setAmount(container.getMaximumAdd(item)); + if (item.getAmount() < 1) { + return false; + } + } + return true; + } + + /** + * Method used to send an alert icon. + * @param slot the slot. + * @param save if we should cache the icon. + */ + private void alert(final int slot, final boolean save) { + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + if (TradeModule.getExtension(player) != null) { + TradeModule.getExtension(player).alert(slot); + } + return true; + } + }); + if (save) { + player.setAttribute("alert", GameWorld.getTicks() + 8); + player.setAttribute("alertSlot", slot); + } + } + + /** + * Method used to check the alert. + */ + private void checkAlert() { + if (player.getAttribute("alert", 0) > GameWorld.getTicks()) { + alert(player.getAttribute("alertSlot", 0), false); + } + } + + /** + * Represents the container listener for a players trade session. + * @author 'Vexia + */ + public final class TradeListener implements ContainerListener { + + @Override + public void update(Container c, ContainerEvent event) {//type 541 - loaning + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, 64212, 90, c.toArray(), c.capacity(), false)); + if (TradeModule.getExtension(player) != null && TradeModule.getExtension(TradeModule.getExtension(player).getTarget()) != null) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 60981, -2, 91, TradeModule.getExtension(TradeModule.getExtension(player).getTarget()).getContainer().toArray(), 27, false)); + } + checkAlert(); + } + + @Override + public void refresh(Container c) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, 64209, 93, player.getInventory(), false)); + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/request/trade/TradeModule.java b/Server/src/main/java/Server/core/game/node/entity/player/link/request/trade/TradeModule.java new file mode 100644 index 000000000..06b0fee22 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/request/trade/TradeModule.java @@ -0,0 +1,542 @@ +package core.game.node.entity.player.link.request.trade; + +import core.game.component.Component; +import core.game.container.Container; +import core.game.container.ContainerType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.RequestModule; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.system.monitor.PlayerMonitor; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +/** + * Represents the module use to handle a request between trading of two players. + * @author Vexia + * + */ +public final class TradeModule implements RequestModule { + + /** + * Represents the overlay interface component. + */ + public static final Component OVERLAY_INTERFACE = new Component(336); + + /** + * Represents the main interface component. + */ + public static final Component MAIN_INTERFACE = new Component(335).setCloseEvent(new TradeCloseEvent()); + + /** + * Represents the accept interface component. + */ + public static final Component ACCEPT_INTERFACE = new Component(334).setCloseEvent(new TradeCloseEvent()); + + /** + * The inventory params for the runscript. + */ + public static final Object[] INVENTORY_PARAMS = new Object[] { "", "", "", "Lend", "Offer-X", "Offer-All", "Offer-10", "Offer-5", "Offer", -1, 0, 7, 4, 93, (336 << 16) }; + + /** + * The trade params for the run script. + */ + public static final Object[] TRADE_PARAMS = new Object[] { "", "", "", "", "Remove-X", "Remove-All", "Remove-10", "Remove-5", "Remove", -1, 0, 7, 4, 90, (335 << 16) | 30 }; + + /** + * The partener params for the run script. + */ + public static final Object[] PARTENER_PARAMS = new Object[] { "", "", "", "", "", "", "", "", "", -1, 0, 7, 4, 91, (335 << 16) | 32 }; + + /** + * Represents the childs that should be hidden. + */ + public static final int[] HIDDEN_CHILDS = new int[] { 42, 43, 44, 42, 44, 40, 41 }; + + /** + * If the container has been retained. + */ + private boolean retained; + + /** + * Represents the player instance. + */ + private Player player; + + /** + * Represents the target instance. + */ + private Player target; + + /** + * Represents the container of this session. + */ + private TradeContainer container; + + /** + * Represents if this session has accepted. + */ + private boolean accepted; + + /** + * Represents if the trade is modified. + */ + private boolean modified = false; + + /** + * Represents the stage of the trade(0=started, 1=second accept) + */ + private int stage; + + /** + * Constructs a new {@code TradeModule} {@code Object}. + * @param player the player. + * @param target the target. + */ + public TradeModule(final Player player, final Player target) { + this.player = player; + this.target = target; + this.container = new TradeContainer(player); + } + + /** + * Constructs a new {@code TradeModule} {@code Object}. + */ + public TradeModule() { + /** + * empty. + */ + } + + @Override + public void open(Player player, Player target) { + extend(player, target); + if (getExtension(target) == null || getExtension(player) == null) { + return; + } + getExtension(player).openInterface(getInterface(stage)).display(stage); + if (getExtension(target) == null || getExtension(player) == null) { + return; + } + getExtension(target).openInterface(getInterface(stage)).display(stage); + player.getDialogueInterpreter().close(); + target.getDialogueInterpreter().close(); + } + + /** + * Method used to update the trade interfaces. + */ + public void update() { + display(stage); + getExtension(target).display(stage); + } + + /** + * Method used to extend the module for each participant. + * @param player the player. + * @param target the target. + */ + public static void extend(final Player player, final Player target) { + player.addExtension(TradeModule.class, new TradeModule(player, target)); + target.addExtension(TradeModule.class, new TradeModule(target, player)); + } + + /** + * Method used to get the extension from the player. + * @param player the player. + * @return the module instance. + */ + public static TradeModule getExtension(final Player player) { + return player.getExtension(TradeModule.class); + } + + /** + * Method used to open an interface at a stage. + * @param component the component. + * @return the module instance for chaining. + */ + private TradeModule openInterface(final Component component) { + return component == MAIN_INTERFACE ? openMain() : openSecond(); + } + + /** + * Gets the accepting message to display. + * @return the message. + */ + private String getAcceptMessage() { + boolean otherAccept = TradeModule.getExtension(target).isAccepted(); + return !otherAccept && !accepted ? "" : otherAccept ? "Other player has accepted." : "Waiting for other player..."; + } + + /** + * Method used to display the interface display depending on stage. + * @param stage the stage. + * @return module the module instance for chaining. + */ + private TradeModule display(int stage) { + switch (stage) { + case 0: + for (int i : HIDDEN_CHILDS) { + player.getPacketDispatch().sendString("", MAIN_INTERFACE.getId(), i); + } + player.getPacketDispatch().sendString("Trading With: " + target.getUsername(), 335, 15); + player.getPacketDispatch().sendString(target.getUsername() + " has " + (target.getInventory().freeSlots() == 0 ? "no" : (target.getInventory().freeSlots())) + " free inventory slots.", 335, 21); + player.getPacketDispatch().sendString(getAcceptMessage(), 335, 36); + break; + case 1: + player.getPacketDispatch().sendString("Trading with:
" + "" + target.getUsername().substring(0, 1).toUpperCase() + target.getUsername().substring(1), 334, 2); + final String acceptMessage = getAcceptMessage(); + if (acceptMessage != "") { + player.getPacketDispatch().sendString(acceptMessage, 334, 33); + } + player.getInterfaceManager().restoreTabs(); + break; + } + displayModified(stage); + container.update(true); + return this; + } + + /** + * Gets the interface for the current stage. + * @param stage the stage. + * @return the component. + */ + private Component getInterface(int stage) { + return stage == 0 ? MAIN_INTERFACE : ACCEPT_INTERFACE; + } + + /** + * Method used to display if the trade is modified. + * @param stage the sytage. + */ + private void displayModified(int stage) { + final boolean otherModified = TradeModule.getExtension(target).isModified(); + if (stage == 1) { + player.getPacketDispatch().sendInterfaceConfig(334, 45, !modified); + player.getPacketDispatch().sendInterfaceConfig(334, 46, !otherModified); + } else { + if (otherModified) { + player.getConfigManager().set(1043, 1); + } + if (modified) { + player.getConfigManager().set(1042, 1); + } + } + } + + /** + * Method used to decline this offer. + */ + public void decline() { + player.getInterfaceManager().close(); + target.getPacketDispatch().sendMessage("Other player has declined trade!"); + } + + /** + * Method used to check if the next stage can proceed. + */ + private void nextStage() { + if (accepted && TradeModule.getExtension(target).isAccepted()) { + if (stage == 0) { + if (!hasSpace()) { + return; + } + incrementStage(); + openInterface(getInterface(stage)); + TradeModule.getExtension(target).incrementStage(); + TradeModule.getExtension(target).openInterface(getInterface(stage)); + TradeModule.getExtension(target).setAccepted(false, false); + setAccepted(false, false); + } else { + giveContainers(this); + incrementStage(); + TradeModule.getExtension(target).incrementStage(); + TradeModule.getExtension(target).setAccepted(false, false); + setAccepted(false, false); + player.getInterfaceManager().close(); + return; + } + } + update(); + } + + /** + * Method used to open the main interface. + * @return the module instance for chaining. + */ + private TradeModule openMain() { + player.getInterfaceManager().closeDefaultTabs(); + player.getInterfaceManager().open(MAIN_INTERFACE); + player.getInterfaceManager().openSingleTab(OVERLAY_INTERFACE); + player.getInventory().refresh(); + player.getPacketDispatch().sendAccessMask(1278, 30, 335, 0, 27); + player.getPacketDispatch().sendAccessMask(1026, 32, 335, 0, 27); + player.getPacketDispatch().sendAccessMask(1278, 0, 336, 0, 27); + player.getPacketDispatch().sendAccessMask(2360446, 0, 335, 0, 27); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", INVENTORY_PARAMS); + player.getPacketDispatch().sendRunScript(150, "IviiiIsssssssss", TRADE_PARAMS); + player.getPacketDispatch().sendRunScript(695, "IviiiIsssssssss", PARTENER_PARAMS); + return this; + } + + /** + * Method used to open the second interface. + * @return the module instance for chaining. + */ + private TradeModule openSecond() { + player.getInterfaceManager().open(ACCEPT_INTERFACE); + player.getInterfaceManager().closeSingleTab(); + displayOffer(container, 37); + displayOffer(TradeModule.getExtension(target).getContainer(), 41); + return this; + } + + /** + * Method used to set the value of accepted. + * @param accept the accept. + */ + public void setAccepted(final boolean accept, boolean update) { + this.accepted = accept; + if (update) { + nextStage(); + } + } + + /** + * Method used to alert the player the trade has been modified. + * @param slot the slot. + */ + public void alert(final int slot) { + player.getPacketDispatch().sendRunScript(143, "Iiii", new Object[] { slot, 7, 4, 21954593 }); + target.getPacketDispatch().sendRunScript(143, "Iiii", new Object[] { slot, 7, 4, 21954594 }); + } + + /** + * Method used to display an offer. + * @param container the container. + */ + private void displayOffer(final Container container, int child) { + boolean split = container.itemCount() > 14; + if (split) { + player.getPacketDispatch().sendInterfaceConfig(334, child + 1, false); + player.getPacketDispatch().sendInterfaceConfig(334, child + 2, false); + String[] messages = new String[] { getDisplayMessage(splitList(container.toArray(), 0, 14)), getDisplayMessage(splitList(container.toArray(), 14, container.toArray().length)) }; + player.getPacketDispatch().sendString(messages[0], 334, child + 1); + player.getPacketDispatch().sendString(messages[1], 334, child + 2); + } else { + player.getPacketDispatch().sendInterfaceConfig(334, child, false); + player.getPacketDispatch().sendString(getDisplayMessage(container.toArray()), 334, child); + } + } + + /** + * Method used to get the display message. + * @param items the items. + * @return the message. + */ + private String getDisplayMessage(Item[] items) { + String message = "Absolutely nothing!"; + if (items.length > 0) { + message = ""; + for (int i = 0; i < items.length; i++) { + if (items[i] == null) { + continue; + } + message = message + "" + items[i].getName(); + if (items[i].getAmount() > 1) { + message = message + " x "; + message = message + "" + getFormattedNumber(items[i].getAmount()) + "
"; + } else { + message = message + "
"; + } + } + } + return message; + } + + /** + * Method used to check if the players & targets have enough space. + * @return {@code True} if so. + */ + private boolean hasSpace() { + boolean hasSpace = true; + if (!player.getInventory().hasSpaceFor(TradeModule.getExtension(target).getContainer())) { + target.getPacketDispatch().sendMessage("Other player doesn't have enough space in their inventory for this trade."); + player.getPacketDispatch().sendMessage("You don't have enough inventory space for this."); + hasSpace = false; + } else if (!target.getInventory().hasSpaceFor(container)) { + player.getPacketDispatch().sendMessage("Other player doesn't have enough space in their inventory for this trade."); + target.getPacketDispatch().sendMessage("You don't have enough inventory space for this."); + hasSpace = false; + } + if (!hasSpace) { + setAccepted(false, true); + TradeModule.getExtension(target).setAccepted(false, true); + } + return hasSpace; + } + + /** + * Gets the formatted number. + * @param amount the amount. + * @return the formatted number. + */ + private String getFormattedNumber(int amount) { + return new DecimalFormat("#,###,##0").format(amount).toString(); + } + + /** + * Method used to give the containers to each participants. + * @param module the module. + */ + private void giveContainers(final TradeModule module) { + final Container pContainer = module.getContainer(); + final Container oContainer = TradeModule.getExtension(module.getTarget()).getContainer(); + addContainer(module.getPlayer(), module.getTarget(), oContainer); + addContainer(module.getTarget(), module.getPlayer(), pContainer); + module.getTarget().getPacketDispatch().sendMessage("Accepted trade."); + module.getPlayer().getPacketDispatch().sendMessage("Accepted trade."); + } + + /** + * Method used to add a container for a player. + * @param player the player. + * @param target the target. + * @param container the container. + */ + private void addContainer(final Player player, Player target, final Container container) { + Container c = new Container(container.itemCount(), ContainerType.ALWAYS_STACK); + c.addAll(container); + String log = "traded => " + target.getName() + " received => {"; + for (Item i : container.toArray()) { + if (i == null) { + continue; + } + if (i.getAmount() > player.getInventory().getMaximumAdd(i)) { + i.setAmount(player.getInventory().getMaximumAdd(i)); + } + if (!player.getInventory().add(i)) { + GroundItemManager.create(i, player); + } + } + for (Item i : c.toArray()) { + if (i == null) { + continue; + } + log += i.getName() + " x " + i.getAmount() + ","; + } + if (log.charAt(log.length() - 1) == ',') { + log = log.substring(0, log.length() - 1); + } + log += "}"; + player.getMonitor().log(log, PlayerMonitor.TRADE_LOG); + } + + /** + * Gets the split list as an array. + * @param items the items. + * @param min the min. + * @param max the max. + * @return the split item array. + */ + private Item[] splitList(Item[] items, int min, int max) { + List list = new ArrayList<>(); + for (int i = min; i < max; i++) { + if (items[i] == null) { + continue; + } + list.add(items[i]); + } + Item[] array = new Item[list.size()]; + for (int i = 0; i < list.size(); i++) { + if (list.get(i) == null) { + continue; + } + array[i] = list.get(i); + } + return array; + } + + /** + * Method used to increment the stage. + */ + public void incrementStage() { + stage++; + } + + /** + * Gets the stage. + * @return the stage. + */ + public int getStage() { + return stage; + } + + /** + * Gets the accepted. + * @return The accepted. + */ + public boolean isAccepted() { + return accepted; + } + + /** + * Gets the trade container. + * @return the container. + */ + public TradeContainer getContainer() { + return container; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the target. + * @return The target. + */ + public Player getTarget() { + return target; + } + + /** + * Gets the modified. + * @return The modified. + */ + public boolean isModified() { + return modified; + } + + /** + * Sets the modified. + * @param modified The modified to set. + */ + public void setModified(boolean modified) { + this.modified = modified; + } + + /** + * Gets the retained. + * @return The retained. + */ + public boolean isRetained() { + return retained; + } + + /** + * Sets the retained. + * @param retained The retained to set. + */ + public void setRetained(boolean retained) { + this.retained = retained; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/skillertasks/Difficulty.java b/Server/src/main/java/Server/core/game/node/entity/player/link/skillertasks/Difficulty.java new file mode 100644 index 000000000..009e9f313 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/skillertasks/Difficulty.java @@ -0,0 +1,5 @@ +package core.game.node.entity.player.link.skillertasks; + +public enum Difficulty { + NOVICE, INTERMEDIATE, ADVANCED, ELITE +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/skillertasks/SkillTasks.java b/Server/src/main/java/Server/core/game/node/entity/player/link/skillertasks/SkillTasks.java new file mode 100644 index 000000000..4b6f0e548 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/skillertasks/SkillTasks.java @@ -0,0 +1,68 @@ +package core.game.node.entity.player.link.skillertasks; + +import core.game.node.entity.skill.Skills; + +public enum SkillTasks { + + // Fishing + FANCHOVIES1("Fish Anchovies Novice", "You must successfully catch 230 Raw Anchovies.", Difficulty.NOVICE, 230, Skills.FISHING, 15), + FANCHOVIES2("Fish Anchovies Intermediate", "You must successfully catch 480 Raw Anchovies.", Difficulty.INTERMEDIATE, 480, Skills.FISHING, 15), + FHERRING1("Fish Herring Novice", "You must successfully catch 280 Raw Herring.", Difficulty.NOVICE, 280, Skills.FISHING, 10), + FHERRING2("Fish Herring Intermediate", "You must successfully catch 450 Raw Herring.", Difficulty.INTERMEDIATE, 450, Skills.FISHING, 10), + FLOBSTER1("Fish Lobster Intermediate", "You must successfully catch 300 Raw Lobster.", Difficulty.INTERMEDIATE, 300, Skills.FISHING, 40), + FLOBSTER2("Fish Lobster Advanced", "You must successfully catch 650 Raw Lobster.", Difficulty.ADVANCED, 650, Skills.FISHING, 40), + FSALMON1("Fish Salmon Novice", "You must successfully catch 220 Raw Salmon.", Difficulty.NOVICE, 220, Skills.FISHING, 30), + FSALMON2("Fish Salmon Intermediate", "You must successfully catch 400 Raw Salmon.", Difficulty.INTERMEDIATE, 400, Skills.FISHING, 30), + FSHARK1("Fish Shark Intermediate", "You must successfully catch 220 Raw Shark.", Difficulty.INTERMEDIATE, 220, Skills.FISHING, 76), + FSHARK2("Fish Shark Advanced", "You must successfully catch 380 Raw Shark.", Difficulty.ADVANCED, 380, Skills.FISHING, 76), + FSHARK3("Fish Shark Elite", "You must successfully catch 500 Raw Shark.", Difficulty.ELITE, 500, Skills.FISHING, 76), + FSHRIMP1("Fish Shrimp Novice", "You must successfully catch 300 Raw Shrimp.", Difficulty.NOVICE, 300, Skills.FISHING, 1), + FSHRIMP2("Fish Shrimp Intermediate", "You must successfully catch 500 Raw Shrimp.", Difficulty.INTERMEDIATE, 500, Skills.FISHING, 1), + FSWORD1("Fish Swordfish Intermediate", "You must successfully catch 320 Raw Swordfish.", Difficulty.INTERMEDIATE, 320, Skills.FISHING, 50), + FSWORD2("Fish Swordfish Advanced", "You must successfully catch 510 Raw Swordfish.", Difficulty.ADVANCED, 510, Skills.FISHING, 50), + FTROUT1("Fish Trout Novice", "You must successfully catch 250 Raw Trout.", Difficulty.NOVICE, 250, Skills.FISHING, 20), + FTROUT2("Fish Trout Intermediate", "You must successfully catch 420 Raw Trout.", Difficulty.INTERMEDIATE, 420, Skills.FISHING, 20), + FTUNA1("Fish Tuna Novice", "You must successfully catch 150 Raw Tuna.", Difficulty.NOVICE, 150, Skills.FISHING, 35), + FTUNA2("Fish Tuna Intermediate", "You must successfully catch 340 Raw Tuna.", Difficulty.INTERMEDIATE, 340, Skills.FISHING, 35); + + private String assignment; + private String description; + private Difficulty difficulty; + private int amount; + private int skill; + private int level; + + SkillTasks(String assignment, String description, Difficulty difficulty, int amount, int skill, int level) { + this.assignment = assignment; + this.description = description; + this.difficulty = difficulty; + this.amount = amount; + this.skill = skill; + this.level = level; + } + + public int getAmount() { + return amount; + } + + public String getAssignment() { + return assignment; + } + + public String getDescription() { + return description; + } + + public Difficulty getDifficulty() { + return difficulty; + } + + public int getLevel() { + return level; + } + + public int getSkill() { + return skill; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/skillertasks/SkillerTasks.java b/Server/src/main/java/Server/core/game/node/entity/player/link/skillertasks/SkillerTasks.java new file mode 100644 index 000000000..3fef1404f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/skillertasks/SkillerTasks.java @@ -0,0 +1,79 @@ +package core.game.node.entity.player.link.skillertasks; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.tools.RandomFunction; + +import java.util.ArrayList; + +public class SkillerTasks { + + public SkillTasks task; + public int taskAmount; + + public void decreaseTask(Player player, SkillTasks stask) { + player.getGlobalData().setTaskAmount(taskAmount); + if (!hasTask() || taskAmount == 0 || !task.getAssignment().equalsIgnoreCase(stask.getAssignment())) { + return; + } + taskAmount--; + if (taskAmount == 0) { + if (player.getSkillTasks().getCurrentTask().getDifficulty() == Difficulty.NOVICE) { + player.getGlobalData().setTaskPoints(player.getGlobalData().getTaskPoints() + 1); + player.getInventory().add(new Item(995, 10000)); + } else if (player.getSkillTasks().getCurrentTask().getDifficulty() == Difficulty.INTERMEDIATE) { + player.getGlobalData().setTaskPoints(player.getGlobalData().getTaskPoints() + 3); + player.getInventory().add(new Item(995, 30000)); + } else if (player.getSkillTasks().getCurrentTask().getDifficulty() ==Difficulty.ADVANCED) { + player.getGlobalData().setTaskPoints(player.getGlobalData().getTaskPoints() + 7); + player.getInventory().add(new Item(995, 70000)); + } else if (player.getSkillTasks().getCurrentTask().getDifficulty() ==Difficulty.ELITE) { + player.getGlobalData().setTaskPoints(player.getGlobalData().getTaskPoints() + 10); + player.getInventory().add(new Item(995, 100000)); + } + player.getSkillTasks().setCurrentTask(null); + player.sendMessage("Your task has been completed! Return to Jack for another assignment!"); + return; + } + } + + public SkillTasks getNewTask(Player player, Difficulty tier) { + final ArrayList tasks = new ArrayList(); + for (final SkillTasks t : SkillTasks.values()) { + if (player.getSkills().getExperienceByLevel(t.getSkill()) < t.getLevel()) { + continue; + } + if (t.getDifficulty() == tier) + tasks.add(t); + } + setCurrentTask(tasks.get(RandomFunction.random(tasks.size() - 1))); + setTaskAmount(task.getAmount()); + return task; + } + + public SkillTasks getCurrentTask() { + return task; + } + + public int getTaskAmount() { + return taskAmount; + } + + public boolean hasTask() { + return task != null; + } + + public boolean isCompleted() { + return hasTask() && taskAmount == 0; + } + + public void setCurrentTask(SkillTasks task) { + this.task = task; + } + + public void setTaskAmount(int amount) { + this.taskAmount = amount; + } + + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/PKPackage.java b/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/PKPackage.java new file mode 100644 index 000000000..2ffb2df43 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/PKPackage.java @@ -0,0 +1,93 @@ +package core.game.node.entity.player.link.spawn; + +import core.game.node.item.Item; + +/** + * A pk package. + * + * @author Vexia + */ +public enum PKPackage { + + MELEE("Melee Set", 0, 2, new Item(4587), new Item(8850), new Item(10828), new Item(5698), new Item(7462), new Item(1712), new Item(4367), new Item(3105), new Item(1079), new Item(1127), new Item(995, 7000000), new Item(386, 220), new Item(2441, 20), new Item(2437, 20), new Item(2443, 20), new Item(2445, 20), new Item(6686, 10), new Item(3025, 10), new Item(2435, 15), new Item(9075, 320), new Item(560, 600), new Item(555, 3000), new Item(565, 450), new Item(557, 5000)), + RANGE_TANK("Range Tank Set", 0, 2, new Item(1712), new Item(2503), new Item(1079), new Item(7462), new Item(3105), new Item(9185), new Item(1201), new Item(10499), new Item(1163), new Item(9243, 30), new Item(9244, 14), new Item(9144, 100), new Item(892, 30), new Item(861), new Item(995, 7000000), new Item(386, 220), new Item(9075, 320), new Item(560, 600), new Item(555, 3000), new Item(565, 450), new Item(557, 5000), new Item(386, 220), new Item(2441, 20), new Item(2437, 20), new Item(2443, 20), new Item(2445, 20), new Item(6686, 10), new Item(3025, 10), new Item(2435, 15)), + MED_LEVEL("Med Level Set", 0, 1, new Item(1712), new Item(10828), new Item(7462), new Item(3105), new Item(4587), new Item(8850), new Item(1079), new Item(1127), new Item(5698), new Item(4675), new Item(3842), new Item(4111), new Item(4113), new Item(4409), new Item(995, 7000000), new Item(386, 220), new Item(2441, 20), new Item(2437, 20), new Item(2443, 20), new Item(2445, 20), new Item(6686, 10), new Item(3025, 10), new Item(2435, 15), new Item(9075, 320), new Item(9075, 320), new Item(560, 600), new Item(555, 3000), new Item(565, 450), new Item(557, 5000)), + PURE("Pure Set", 0, 1, new Item(6107), new Item(6108), new Item(7458), new Item(1712), new Item(4587), new Item(2413), new Item(3842), new Item(6109), new Item(9144, 130), new Item(3105), new Item(10499), new Item(4675), new Item(9185), new Item(5698), new Item(995, 7000000), new Item(386, 220), new Item(2441, 20), new Item(2437, 20), new Item(2443, 20), new Item(2445, 20), new Item(6686, 10), new Item(3025, 10), new Item(2435, 15), new Item(740, 1), new Item(560, 600), new Item(555, 3000), new Item(565, 450), new Item(2497, 1)), + ZERKER("Zerker Set", 0, 2, new Item(4587), new Item(8850), new Item(3751), new Item(5698), new Item(7462), new Item(1712), new Item(4385), new Item(3105), new Item(1079), new Item(1127), new Item(995, 7000000), new Item(386, 220), new Item(2441, 20), new Item(2437, 20), new Item(2443, 20), new Item(2445, 20), new Item(6686, 10), new Item(3025, 10), new Item(2435, 15), new Item(9075, 320), new Item(560, 600), new Item(555, 3000), new Item(565, 450), new Item(557, 5000)), + SHARKS("Sharks", 1, -1, new Item(385, 28)), + SUPER_POT("Super Potions", 1, -1, new Item(2436), new Item(2440), new Item(6685, 2)), + SUPER_RESTORE("Super Restores", 1, -1, new Item(3024, 3), new Item(6685, 3)), + RANGING_POTS("Ranging Potions", 1, -1, new Item(2444, 2)), + BARRAGE_RUNE("Barrage Runes", 1, -1, new Item(560, 5000), new Item(565, 5000), new Item(555, 5000)), + VENGEANCE_RUNE("Vengeance Runes", 1, -1, new Item(557, 10000), new Item(9075, 5000), new Item(560, 5000)), + ENTANGE_RUNE("Entangle Runes", 1, -1, new Item(557, 10000), new Item(555, 5000), new Item(561, 5000)); + + /** + * The name. + */ + private final String name; + + /** + * The package type. + */ + private int type; + + /** + * The spell book. + */ + private int spellBook; + + /** + * The items in the package. + */ + private final Item[] items; + + /** + * Constructs a new {@Code PKPackage} {@Code Object} + * + * @param name the name. + * @param items the items. + */ + PKPackage(String name, int type, int spellBook, Item... items) { + this.name = name; + this.type = type; + this.spellBook = spellBook; + this.items = items; + } + + /** + * Gets the spell book. + * + * @return the spell book. + */ + public int getSpellBook() { + return spellBook; + } + + /** + * Gets the type. + * + * @return the type. + */ + public int getType() { + return type; + } + + /** + * Gets the name. + * + * @return the name. + */ + public String getName() { + return name; + } + + /** + * Gets the items. + * + * @return the items. + */ + public Item[] getItems() { + return items; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/PKScoreBoard.java b/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/PKScoreBoard.java new file mode 100644 index 000000000..804eb5c71 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/PKScoreBoard.java @@ -0,0 +1,171 @@ +package core.game.node.entity.player.link.spawn; + +import core.cache.ServerStore; +import core.cache.StoreFile; +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.tools.StringUtils; + +import java.nio.ByteBuffer; + +/** + * The score board. + * @author Emperor + * @author Vexia + * + */ +public final class PKScoreBoard { + + /** + * If it's been initialized. + */ + private static boolean initialized; + + /** + * The score board size. + */ + private static final int SIZE = 49; + + /** + * The names. + */ + private static String[] names = new String[SIZE]; + + /** + * The scores. + */ + private static int[] scores = new int[SIZE]; + + /** + * static block + */ + static { + for (int i = 0; i < SIZE; i++) { + names[i] = "Nobody yet"; + } + init(); + initialized = true; + } + + /** + * Initializes the score boards data. + */ + public static void init() { + StoreFile file = ServerStore.get("pk_scores"); + if (file == null) { //Indicates no cache exists yet. + return; + } + ByteBuffer buffer = file.data(); + for (int i = 0; i < SIZE; i++) { + scores[i] = buffer.getInt(); + names[i] = ByteBufferUtils.getString(buffer); + } + } + + /** + * Updates the store file for the scores. + */ + public static void update() { + ByteBuffer buffer = ByteBuffer.allocate(5000); + for (int i = 0; i < SIZE; i++) { + buffer.putInt(scores[i]); + ByteBufferUtils.putString(names[i], buffer); + } + buffer.flip(); + ServerStore.setArchive("pk_scores", buffer); + } + + /** + * Opens the score board. + * @param player The player. + */ + public static void open(Player player) { + if (!initialized) { + initialized = true; + init(); + } + int component = 632; + player.getPacketDispatch().sendString("PK Scoreboard", 632, 14); + player.getPacketDispatch().sendString("Top 50 (name - kills):", 632, 13); + player.getInterfaceManager().open(new Component(component)); + String msg = ""; + for (int i = 0; i < SIZE; i++) { + msg = names[i]; + if (!msg.equals("Nobody yet")) { + msg = StringUtils.formatDisplayName(msg) + " - " + scores[i]; + } + player.getPacketDispatch().sendString(msg, component, 16 + i); + } + } + + /** + * Checks if the ratings of the player is good enough for the score board. + * @param player The player. + */ + public static void check(Player player) { + if(player.isAdmin()) { + return; + } + if (!initialized) { + initialized = true; + init(); + } + int score = player.getSavedData().getSpawnData().getKills(); + int myScore = 0; + for (int i = 0; i < names.length; i++) { + if (names[i].equals(player.getName()) || names[i].equals(player.getName())) { + myScore = scores[i]; + break; + } + } + if (score == myScore) { + return; + } + for (int i = 0; i < SIZE; i++) { + if (score > scores[i]) { + insert(player, score, i); + update(); + break; + } + } + } + + /** + * Resets the board. + */ + public static void reset() { + scores = new int[SIZE]; + names = new String[SIZE]; + for (int i = 0; i < names.length; i++) { + names[i] = "Nobody yet"; + } + } + + /** + * Inserts the player in the score board. + * @param player The player. + * @param score The score. + * @param index The board index. + */ + private static void insert(Player player, int score, int index) { + if (scores[index] == score) { + return; + } + if (names[index].equals(player.getName()) || names[index].equals(player.getName())) { + scores[index] = score; + return; + } + for (int i = SIZE - 2; i >= index; i--) { + String name = names[i]; + if (name.equals(player.getName()) || name.equals(player.getName())) { + name = names[--i]; + } + scores[i + 1] = scores[i]; + names[i + 1] = name; + } + names[index] = player.getName(); + scores[index] = score; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/PKTitle.java b/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/PKTitle.java new file mode 100644 index 000000000..95176507a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/PKTitle.java @@ -0,0 +1,120 @@ +package core.game.node.entity.player.link.spawn; + +import core.game.node.entity.player.Player; +import core.game.world.repository.Repository; +import core.tools.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * A PK title received from a certain amount of kills. + * @author Vexia + * + */ +public enum PKTitle { + NOOB(0), + PEASANT(5), + SKIRMISHER(20), + KNIGHT(50), + WARRIOR(80), + BOUNTY_HUNTER(100), + HERO(150), + SKULLCRACKER(250), + DESTROYER(400), + DOMINATOR(600), + REAPER(800, "DF7401"), + ASSASSIN(1000, "21610B"), + MASTER(1500, "0431B4"), + GODLY(2000, "FF0000"); + + /** + * The kills needed for the title. + */ + private final int kills; + + /** + * The color for this title. + */ + private final String titleColor; + + /** + * Constructs a new {@Code PKTitle} {@Code Object} + * @param kills the points. + * @param titleColor the title color. + */ + private PKTitle(int kills, String titleColor) { + this.kills = kills; + this.titleColor = titleColor; + } + + /** + * Constructs a new {@Code PKTitle} {@Code Object} + * @param points the points. + */ + private PKTitle(int points) { + this(points, "874b93"); + } + + /** + * Checks the title for a player. + */ + public static void checkTitle(Player player) { + PKTitle title = null; + int kills = player.getSavedData().getSpawnData().getKills(); + for (PKTitle t : values()) { + if (kills >= t.getKills()) { + title = t; + } + } + if (title.ordinal() > player.getSavedData().getSpawnData().getTitle().ordinal() && player.getSavedData().getSpawnData().getKills() <= title.getKills()) { + player.getSavedData().getSpawnData().setTitle(title); + if (!title.getTitleColor().equals("874b93")) { + Repository.sendNews("News: " + player.getUsername() + " has just unlocked the title: " + title.getName() + "!"); + } + player.getAppearance().sync(); + } + } + + /** + * Gets the titles. + * @param player the player. + * @return the titles. + */ + public static PKTitle[] getTitles(Player player) { + int kills = player.getSavedData().getSpawnData().getKills(); + List titles = new ArrayList<>(); + for (PKTitle t : values()) { + if (kills >= t.getKills()) { + titles.add(t); + } + } + return titles.toArray(new PKTitle[] {}); + } + + /** + * Gets the name of the title. + * @return the name. + */ + public String getName() { + return StringUtils.formatDisplayName(name().toLowerCase().replace("_", "")); + } + + /** + * Gets the points. + * @return the points + */ + public int getKills() { + return kills; + } + + /** + * Gets the titleColor. + * @return the titleColor + */ + public String getTitleColor() { + return titleColor; + } + + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/SpawnData.java b/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/SpawnData.java new file mode 100644 index 000000000..7a2d77ca9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/player/link/spawn/SpawnData.java @@ -0,0 +1,687 @@ +package core.game.node.entity.player.link.spawn; + +import core.game.component.Component; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.entity.player.link.SavedData; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.world.GameWorld; +import core.game.world.repository.Repository; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; + +import java.nio.ByteBuffer; +import java.text.DecimalFormat; + +/** + * Handles the spawn data for the spawn world. + * @author Vexia + * + */ +public class SpawnData implements SavingModule { + + /** + * The kill streak messages. + */ + private static final String[] KILLSTREAKS = new String[] {"rampage", "massacre", "frenzy", "annihilation", "decimation", "butchery", "extermination", "genocide", "carnage", "slaughter", "bloodshed", "assassination", "obliteration"}; + + /** + * The current title. + */ + private PKTitle title = PKTitle.NOOB; + + /** + * The tutorial stage for the spawn server. + */ + private int tutorialStage; + + /** + * The pk points. + */ + private int pkPoints; + + /** + * The amount of kills. + */ + private int kills; + + /** + * The ammount of deaths. + */ + private int deaths; + + /** + * The skill streak. + */ + private int killStreak; + + private int purchased; + + /** + * Constructs a new {@Code SpawnData} {@Code Object} + */ + public SpawnData() { + /** + * empty. + */ + } + + @Override + public void save(ByteBuffer buffer) { + SavedData.save(buffer, tutorialStage, 1); + SavedData.save(buffer, pkPoints, 2); + SavedData.save(buffer, kills, 3); + SavedData.save(buffer, deaths, 4); + SavedData.save(buffer, killStreak, 5); + SavedData.save(buffer, title.ordinal(), 6); + SavedData.save(buffer, purchased, 7); + buffer.put((byte) 0); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get()) != 0) { + switch(opcode) { + case 1: + tutorialStage = buffer.getInt(); + break; + case 2: + pkPoints = buffer.getInt(); + break; + case 3: + kills = buffer.getInt(); + break; + case 4: + deaths = buffer.getInt(); + break; + case 5: + killStreak = buffer.getInt(); + break; + case 6: + title = PKTitle.values()[buffer.getInt()]; + break; + case 7: + for (int i = 0; i < PKPackage.values().length; i++) { + purchased = PKPackage.values()[i].ordinal(); + System.out.println("SpawnData: " + PKPackage.values()[i].ordinal()); + } + break; + } + } + } + + /** + * Draws the stats tab. + * @param player the player. + */ + public void drawStatsTab(Player player) { + if (GameWorld.isEconomyWorld()) { + return; + } + player.getPacketDispatch().sendInterfaceConfig(274, 3, true); + player.getPacketDispatch().sendInterfaceConfig(274, 8, true); + sendString(player, "Players online: " + Repository.getPlayers().size(), 5); + sendString(player, "Starter Packages Below...", 23); + sendString(player, "Information:", 12, null, -1); + sendString(player, "PK Points: " + player.getSavedData().getSpawnData().getPkPoints(), 13); + sendString(player, "Kills: " + getKills(), 14); + sendString(player, "Deaths: " + getDeaths(), 15); + sendString(player, "KDR: " + getKdr(), 16); + sendString(player, "Title: " + "" + getTitle().getName(), 17); + sendString(player, " ", 20); + sendString(player, "Starter Packages:", 31); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 274, 60, 10, 298));/* + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 274, 33, 10, 300)); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 274, 34, 11, 314));*/ + //Sets & consumables + + sendString(player, PKPackage.values()[0].getName(), 156); + sendString(player, PKPackage.values()[1].getName(), 32); + sendString(player, PKPackage.values()[2].getName(), 137); + sendString(player, PKPackage.values()[3].getName(), 146); + sendString(player, PKPackage.values()[4].getName(), 142); +// sendString(player, PKPackage.values()[5].getName(), 33); + /*sendString(player, PKPackage.values()[6].getName(), 34); + sendString(player, PKPackage.values()[7].getName(), 35); + sendString(player, PKPackage.values()[8].getName(), 36); + sendString(player, PKPackage.values()[9].getName(), 147); + sendString(player, PKPackage.values()[10].getName(), 37); + sendString(player, PKPackage.values()[11].getName(), 131); + sendString(player, PKPackage.values()[12].getName(), 38);*/ + + } + + /** + * Sends the string. + * @param player the player. + * @param string the string. + * @param child the child. + * @param color the color. + */ + private void sendString(Player player, String string, int child, String color, int purchased) { + player.getPacketDispatch().sendInterfaceConfig(274, child, false); + player.getPacketDispatch().sendString((color != null && purchased == -1 ? color : "") + string, 274, child); + } + + /** + * Sends the string. + * @param player the player. + * @param string the string. + * @param child the child. + */ + private void sendString(Player player, String string, int child, int purchased) { + sendString(player, string, child, "", purchased); + } + + /** + * Sends the string. + * @param player the player. + * @param string the string. + * @param child the child. + */ + private void sendString(Player player, String string, int child) { + sendString(player, string, child, "", -1); + } + + /** + * Shouts spawn info of the player. + * @param p the player. + * @param button the button. + */ + public void handleButton(Player p, int button) { + if (GameWorld.isEconomyWorld()) { + return; + } + drawStatsTab(p); + switch(button) { + case -1: + break; + case 16: + p.sendChat("My KDR is: " + p.getSavedData().getSpawnData().getKdr() + "!"); + break; + case 14: + p.sendChat("I have killed " + p.getSavedData().getSpawnData().getKills() + " player" + (p.getSavedData().getSpawnData().getKills() != 1 ? "s" : "") + "!"); + break; + case 15: + p.sendChat("I have been killed " + p.getSavedData().getSpawnData().getDeaths() + " time" + (p.getSavedData().getSpawnData().getDeaths() != 1 ? "s" : "") + "!"); + break; + case 13: + p.sendChat("PK Points: " + p.getSavedData().getSpawnData().getPkPoints() + "!"); + break; + case 17: + PKTitle[] titles = PKTitle.getTitles(p); + PKTitle t; + if (title.ordinal() >= titles.length-1) { + t = titles[0]; + } else { + t = titles[title.ordinal() + 1]; + } + this.title = t; + p.getAppearance().sync(); + drawStatsTab(p); + break; + /*sendString(player, PKPackage.values()[0].getName(), 156); + sendString(player, PKPackage.values()[1].getName(), 32); + sendString(player, PKPackage.values()[2].getName(), 137); + sendString(player, PKPackage.values()[3].getName(), 146); + sendString(player, PKPackage.values()[4].getName(), 142); + sendString(player, PKPackage.values()[5].getName(), 33); + sendString(player, PKPackage.values()[6].getName(), 34); + sendString(player, PKPackage.values()[7].getName(), 35); + sendString(player, PKPackage.values()[8].getName(), 36); + sendString(player, PKPackage.values()[9].getName(), 147); + sendString(player, PKPackage.values()[10].getName(), 37); + sendString(player, PKPackage.values()[11].getName(), 131); + sendString(player, PKPackage.values()[12].getName(), 38);*/ + case 156: + Player player = p; + if (player.canSpawn()) { + return; + } + p.getSkills().setLevel(Skills.ATTACK, 99); + p.getSkills().setStaticLevel(Skills.ATTACK, 99); + p.getSkills().setLevel(Skills.STRENGTH, 99); + p.getSkills().setStaticLevel(Skills.STRENGTH, 99); + p.getSkills().setLevel(Skills.DEFENCE, 99); + p.getSkills().setStaticLevel(Skills.DEFENCE, 99); + p.getSkills().setLevel(Skills.HITPOINTS, 99); + p.getSkills().setStaticLevel(Skills.HITPOINTS, 99); + p.getSkills().setLevel(Skills.RANGE, 99); + p.getSkills().setStaticLevel(Skills.RANGE, 99); + p.getSkills().setLevel(Skills.MAGIC, 99); + p.getSkills().setStaticLevel(Skills.MAGIC, 99); + p.getSkills().setLevel(Skills.PRAYER, 99); + p.getSkills().setStaticLevel(Skills.PRAYER, 99); + loadGear(p, 0); + break; + case 32: + player = p; + if (player.canSpawn()) { + return; + } + p.getSkills().setLevel(Skills.ATTACK, 50); + p.getSkills().setStaticLevel(Skills.ATTACK, 50); + p.getSkills().setLevel(Skills.STRENGTH, 99); + p.getSkills().setStaticLevel(Skills.STRENGTH, 99); + p.getSkills().setLevel(Skills.DEFENCE, 45); + p.getSkills().setStaticLevel(Skills.DEFENCE, 45); + p.getSkills().setLevel(Skills.HITPOINTS, 99); + p.getSkills().setStaticLevel(Skills.HITPOINTS, 99); + p.getSkills().setLevel(Skills.RANGE, 99); + p.getSkills().setStaticLevel(Skills.RANGE, 99); + p.getSkills().setLevel(Skills.MAGIC, 94); + p.getSkills().setStaticLevel(Skills.MAGIC, 94); + p.getSkills().setLevel(Skills.PRAYER, 52); + p.getSkills().setStaticLevel(Skills.PRAYER, 52); + loadGear(p, 1); + break; + case 137: + player = p; + if (player.canSpawn()) { + return; + } + p.getSkills().setLevel(Skills.ATTACK, 90); + p.getSkills().setStaticLevel(Skills.ATTACK, 90); + p.getSkills().setLevel(Skills.STRENGTH, 99); + p.getSkills().setStaticLevel(Skills.STRENGTH, 99); + p.getSkills().setLevel(Skills.DEFENCE, 80); + p.getSkills().setStaticLevel(Skills.DEFENCE, 80); + p.getSkills().setLevel(Skills.HITPOINTS, 99); + p.getSkills().setStaticLevel(Skills.HITPOINTS, 99); + p.getSkills().setLevel(Skills.RANGE, 99); + p.getSkills().setStaticLevel(Skills.RANGE, 99); + p.getSkills().setLevel(Skills.MAGIC, 99); + p.getSkills().setStaticLevel(Skills.MAGIC, 99); + p.getSkills().setLevel(Skills.PRAYER, 80); + p.getSkills().setStaticLevel(Skills.PRAYER, 80); + loadGear(p, 2); + break; + case 146: + player = p; + if (player.canSpawn()) { + return; + } + p.getSkills().setLevel(Skills.ATTACK, 80); + p.getSkills().setStaticLevel(Skills.ATTACK, 80); + p.getSkills().setLevel(Skills.STRENGTH, 99); + p.getSkills().setStaticLevel(Skills.STRENGTH, 99); + p.getSkills().setLevel(Skills.DEFENCE, 1); + p.getSkills().setStaticLevel(Skills.DEFENCE, 1); + p.getSkills().setLevel(Skills.HITPOINTS, 99); + p.getSkills().setStaticLevel(Skills.HITPOINTS, 99); + p.getSkills().setLevel(Skills.RANGE, 99); + p.getSkills().setStaticLevel(Skills.RANGE, 99); + p.getSkills().setLevel(Skills.MAGIC, 99); + p.getSkills().setStaticLevel(Skills.MAGIC, 99); + p.getSkills().setLevel(Skills.PRAYER, 52); + p.getSkills().setStaticLevel(Skills.PRAYER, 52); + loadGear(p, 3); + break; + case 142: + player = p; + if (player.canSpawn()) { + return; + } + p.getSkills().setLevel(Skills.ATTACK, 60); + p.getSkills().setStaticLevel(Skills.ATTACK, 60); + p.getSkills().setLevel(Skills.STRENGTH, 92); + p.getSkills().setStaticLevel(Skills.STRENGTH, 92); + p.getSkills().setLevel(Skills.DEFENCE, 45); + p.getSkills().setStaticLevel(Skills.DEFENCE, 45); + p.getSkills().setLevel(Skills.HITPOINTS, 91); + p.getSkills().setStaticLevel(Skills.HITPOINTS, 91); + p.getSkills().setLevel(Skills.RANGE, 99); + p.getSkills().setStaticLevel(Skills.RANGE, 99); + p.getSkills().setLevel(Skills.MAGIC, 99); + p.getSkills().setStaticLevel(Skills.MAGIC, 99); + p.getSkills().setLevel(Skills.PRAYER, 52); + p.getSkills().setStaticLevel(Skills.PRAYER, 52); + loadGear(p, 4); + break; + case 33: + player = p; + if (player.canSpawn()) { + return; + } + loadGear(p, 5); + break; + case 34: + player = p; + if (player.canSpawn()) { + return; + } + loadGear(p, 6); + break; + case 35: + player = p; + if (player.canSpawn()) { + return; + } + loadGear(p, 7); + break; + case 36: + player = p; + if (player.canSpawn()) { + return; + } + loadGear(p, 8); + break; + case 147: + player = p; + if (player.canSpawn()) { + return; + } + loadGear(p, 9); + break; + case 37: + player = p; + if (player.canSpawn()) { + return; + } + loadGear(p, 10); + break; + case 131: + player = p; + if (player.canSpawn()) { + return; + } + loadGear(p, 11); + break; + case 38: + player = p; + if (player.canSpawn()) { + return; + } + loadGear(p, 12); + break; + + } + } + + public void loadGear(Player p, int index) { + PKPackage pkPackage = PKPackage.values()[index]; + if (pkPackage != null) { + if (pkPackage.getType() == 0 && (!p.getBank().hasSpaceFor(p.getEquipment()) || !p.getBank().hasSpaceFor(p.getInventory()))) { + p.sendMessage("You don't have enough bank space to do that."); + return; + } + if (pkPackage == pkPackage.PURE) { + p.getSkills().setLevel(Skills.DEFENCE, 1); + p.getSkills().setStaticLevel(Skills.DEFENCE, 1); + p.getSkills().setLevel(Skills.PRAYER, 52); + p.getSkills().setStaticLevel(Skills.PRAYER, 52); + } /*else if (pkPackage.getType() == 0) { + for (int i = 0; i < Skills.SKILL_NAME.length; i++) { + p.getSkills().setLevel(i, 99); + p.getSkills().setStaticLevel(i, 99); + } + }*/ + if (pkPackage.getType() == 0/* && purchased == -1*/) { + p.getBank().addAll(p.getEquipment()); + p.getBank().addAll(p.getInventory()); + p.getEquipment().clear(); + p.getInventory().clear(); + /*for (Item item : pkPackage.getItems()) { + if ((item.getDefinition().hasAction("wear") || item.getDefinition().hasAction("wield")) && p.getEquipment().get(item.getDefinition().getConfiguration(ItemConfigParser.EQUIP_SLOT, -1)) == null) { + p.getEquipment().add(item, true, false); + } else { + p.getInventory().add(item); + } + } + } else {*/ + p.getInventory().add(pkPackage.getItems()); + purchased = PKPackage.values()[index].ordinal(); + } + if (pkPackage.getSpellBook() != -1 && purchased == -1) { + p.getSpellBookManager().setSpellBook(SpellBookManager.SpellBook.values()[pkPackage.getSpellBook()]); + p.getSpellBookManager().update(p); + } + if (pkPackage == pkPackage.VENGEANCE_RUNE || pkPackage == pkPackage.BARRAGE_RUNE || pkPackage == pkPackage.ENTANGE_RUNE) { + p.getSpellBookManager().setSpellBook(SpellBookManager.SpellBook.LUNAR); + p.getSpellBookManager().update(p); + } + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + if (purchased != -1) { + p.sendMessage("You have already purchased your one set, please use the shops"); + p.sendMessage("for any gear needed."); + } else { + p.sendMessage("You load the " + pkPackage.getName() + " package, your items have been banked!"); + } + p.getInterfaceManager().openTab(3, new Component(149)); // inventory + } + } + + /** + * Called when the player killer has killed another player. + * @param killer + * @param killed + */ + public void onDeath(Player killer, Player killed) { + if (GameWorld.isEconomyWorld()) { + return; + } + if (killer.isArtificial() || killed.isArtificial() || killer.getDetails().getInfo().getIp().equals(killed.getDetails().getInfo().getIp()) || killed.getDetails().getInfo().getMac().equals(killer.getDetails().getInfo().getMac())) { + killer.sendMessage("You can't kill someone from your own computer address."); + return; + } + SpawnData killedInfo = killed.getSavedData().getSpawnData(); + int increment = getStreakPoints(killer); + if (killedInfo.getKillStreak() > 4) { + increment += getStreakPoints(killed); + Repository.sendNews("News: " + killer.getUsername() + " has ended " + killed.getUsername() + "'s killstreak of " + killedInfo.getKillStreak() + "!"); + } + incrementKills(); + incrementStreak(); + killedInfo.setKillStreak(0); + killedInfo.incrementDeaths(); + incrementPkPoints(increment); + PKTitle.checkTitle(killer); + drawStatsTab(killer); + killedInfo.drawStatsTab(killed); + killer.sendMessage("You have killed " + killed.getUsername() + "! Your PK Points have increased by " + increment + "."); + killer.sendMessage("You are now on a " + killStreak + " killstreak!"); + if (killStreak > 4) { + Repository.sendNews("News: " + getStreakMessage(killer, killed)); + } + PKScoreBoard.check(killer); + } + + /** + * Gets the streak points. + * @param killed the killed player. + * @return the points. + */ + private int getStreakPoints(Player killed) { + int streak = killed.getSavedData().getSpawnData().getKillStreak(); + int points = 1; + if (streak > 3) { + return streak; + } + return points; + } + + /** + * Gets a kill streak message. + * @param killer the killer. + * @param killed the killed. + * @return the kill streak message.no1 readd him + */ + private String getStreakMessage(Player killer, Player killed) { + int streak = getKillStreak(); + String message = "killstreak"; + if (streak > 5) { + int index = streak - 6; + if (index > KILLSTREAKS.length-1) { + return killer.getUsername() + " is unstoppable! " + (killer.getAppearance().isMale() ? "He" : "She") + " is on a killstreak of " + streak + "!"; + } else { + message = "kill " + KILLSTREAKS[index]; + } + } + return killer.getUsername() + " is on a " + streak + " " + message + "! Kill " + (killer.getAppearance().isMale() ? "him" : "her") + " to gain " + streak + " PKP!"; + } + + /** + * Increments the kill streak. + */ + public void incrementStreak() { + killStreak++; + } + + /** + * Increments the deaths. + */ + public void incrementDeaths() { + deaths++; + } + + /** + * Increments the kills. + */ + public void incrementKills() { + kills++; + } + + /** + * Increments the pk points. + * @param increment the increment. + */ + public void incrementPkPoints(int increment) { + setPkPoints(getPkPoints() + increment); + } + + /** + * Checks if the tutorial is completed. + * @return {@code True} if so. + */ + public boolean hasCompletedTutorial() { + return getTutorialStage() > 2; + } + + /** + * Increments the tutorial stage. + */ + public void incrementTutorialStage() { + setTutorialStage(getTutorialStage() + 1); + } + + /** + * Gets the kdr. + * @return the kdr. + */ + public String getKdr() { + return new DecimalFormat().format(deaths == 0 ? kills : (double) ((double) kills / (double) deaths)); + } + + /** + * Gets the tutorialStage. + * @return the tutorialStage + */ + public int getTutorialStage() { + return tutorialStage; + } + + /** + * Sets the batutorialStage. + * @param tutorialStage the tutorialStage to set. + */ + public void setTutorialStage(int tutorialStage) { + this.tutorialStage = tutorialStage; + } + + /** + * Gets the pkPoints. + * @return the pkPoints + */ + public int getPkPoints() { + return pkPoints; + } + + /** + * Sets the bapkPoints. + * @param pkPoints the pkPoints to set. + */ + public void setPkPoints(int pkPoints) { + this.pkPoints = pkPoints; + } + + /** + * Gets the title. + * @return the title + */ + public PKTitle getTitle() { + return title; + } + + /** + * Sets the batitle. + * @param title the title to set. + */ + public void setTitle(PKTitle title) { + this.title = title; + } + + /** + * Gets the kills. + * @return the kills + */ + public int getKills() { + return kills; + } + + /** + * Sets the bakills. + * @param kills the kills to set. + */ + public void setKills(int kills) { + this.kills = kills; + } + + /** + * Gets the deaths. + * @return the deaths + */ + public int getDeaths() { + return deaths; + } + + /** + * Decrements the points. + */ + public void decrementPoints(int decrement) { + pkPoints-= decrement; + } + + /** + * Sets the badeaths. + * @param deaths the deaths to set. + */ + public void setDeaths(int deaths) { + this.deaths = deaths; + } + + /** + * Gets the killStreak. + * @return the killStreak + */ + public int getKillStreak() { + return killStreak; + } + + /** + * Sets the bakillStreak. + * @param killStreak the killStreak to set. + */ + public void setKillStreak(int killStreak) { + this.killStreak = killStreak; + } + + public void setPurchased(int purchased) { + this.purchased = purchased; + } + + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/LevelUp.java b/Server/src/main/java/Server/core/game/node/entity/skill/LevelUp.java new file mode 100644 index 000000000..679896a48 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/LevelUp.java @@ -0,0 +1,200 @@ +package core.game.node.entity.skill; + +import core.game.component.Component; +import core.game.content.global.Skillcape; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.emote.Emotes; +import core.game.world.repository.Repository; +import core.net.packet.PacketRepository; +import core.net.packet.context.MusicContext; +import core.net.packet.out.MusicPacket; + +/** + * Represents a leveling up reward. + * @author Emperor + */ +public final class LevelUp { + + /** + * Level up sound ids. + */ + private static final int[] SOUND_EFFECTS = { 29, 37, 65, 48, 57, 55, 52, 33, 69, 44, 41, 39, 35, 43, 53, 45, 28, 34, 62, 11, 60, 49, 31, 300 }; + + /** + * The skillcapes data. + */ + private static final int[] SKILLCAPES = { 9747, // Attack + 9753, // Defence + 9750, // Strength + 9768, // Hitpoints + 9756, // Range + 9759, // Prayer + 9762, // Magic + 9801, // Cooking + 9807, // Woodcutting + 9783, // Fletching + 9798, // Fishing + 9804, // Firemaking + 9780, // Crafting + 9795, // Smithing + 9792, // Mining + 9774, // Herblore + 9771, // Agility + 9777, // Thieving + 9786, // Slayer + 9810, // Farming + 9765, // Runecrafting + 9948, // Hunter + 9789, // Construction + 12169 // Summoning + }; + + /** + * The skill icon config values send on the level up chat box interface. + */ + public static final int[] SKILL_ICON = { 67108864, 335544320, 134217728, + 402653184, 201326592, 469762048, 268435456, 1073741824, 1207959552, + 1275068416, 1006632960, 1140850688, 738197504, 939524096, + 872415232, 603979776, 536870912, 671088640, 1342177280, 1409286144, + 805306368, 1543503872, 1476395008, 1610612736, 1677721600 }; + + /** + * The flashing icon config values on level up. + */ + public static final int[] FLASH_ICONS = { 1, 4, 2, 64, 8, 16, 32, 32768, + 131072, 2048, 16384, 65536, 1024, 8192, 4096, 256, 128, 512, + 524288, 1048576, 262144, 4194304, 2097152, 8388608, 16777216 }; + + + /** + * Holds all the config values of the skill advances. + */ + public static final int[] ADVANCE_CONFIGS = { + 9, 40, 17, 49, + 25, 57, 33, 641, + 659, 664, 121, 649, + 89, 114, 107, 72, + 64, 80, 673, 680, + 99, 698, 689, 705, + }; + + /** + * The client skill ids. + */ + public static final int[] CLIENT_ID = { + 1, 5, 2, 6, + 3, 7, 4, 16, + 18, 19, 15, 17, + 11, 14, 13, 9, + 8, 10, 20, 21, + 12, 23, 22, 24, + 24 + }; + + /** + * The skilling milestones. + */ + public static final int[] SKILL_MILESTONES = { + 1, 50, 75, 100 + }; + + /** + * The combat milestones. + */ + public static final int[] COMBAT_MILESTONES = { + 3, 5, 10, 15, 25, 75, 90, 100, 110, 120, 126, 130, 138 + }; + + /** + * Sends the level up interface etc. + * @param player The player. + * @param slot The skill slot. + * @param amount The amount of levels gained. + */ + public static void levelup(Player player, int slot, int amount) { + if (player.getAttribute("tut-island") != null) { + return; + } + if (TutorialSession.getExtension(player).getStage() < TutorialSession.MAX_STAGE) { + return; + } + int soundId = SOUND_EFFECTS[slot]; + if (soundId > -1) { + PacketRepository.send(MusicPacket.class, new MusicContext(player, soundId, true)); + } + handleMilestones(player, slot, amount); + player.getPacketDispatch().sendGraphic(199); + player.getPacketDispatch().sendString("Congratulations, you've just advanced a " + Skills.SKILL_NAME[slot] + " level!", 740, 0); + player.getPacketDispatch().sendString("Your " + Skills.SKILL_NAME[slot] + " level is now " + player.getSkills().getStaticLevel(slot) + ".", 740, 1); + player.getPacketDispatch().sendMessage("You've just advanced a " + Skills.SKILL_NAME[slot] + " level! You have reached level " + player.getSkills().getStaticLevel(slot) + "."); + if (slot == Skills.PRAYER) { + player.getSkills().incrementPrayerPoints(1); + } + if (player.getSkills().getStaticLevel(slot) == 99 && !player.isArtificial()) { + Repository.sendNews(player.getUsername() + " has just achieved 99 " + Skills.SKILL_NAME[slot]); + Skillcape.trim(player); + player.getEmoteManager().unlock(Emotes.SKILLCAPE); + } + player.setAttribute("/save:levelup:" + slot, true); + sendFlashingIcons(player, slot); + } + + /** + * Handles the milestones. + * @param player The player. + * @param slot The id of the leveled skill. + * @param amount The amount of levels gained. + */ + public static void handleMilestones(Player player, int slot, int amount) { + int value = ADVANCE_CONFIGS[slot]; + for (int i = 0; i < COMBAT_MILESTONES.length; i++) { + if (player.getProperties().getCurrentCombatLevel() < COMBAT_MILESTONES[i]) { + if (i > player.getSkills().getCombatMilestone()) { + value |= 0x2; + player.getSkills().setCombatMilestone(i); + } + break; + } + } + int totalLevel = player.getSkills().getTotalLevel(); + for (int i = 0; i < SKILL_MILESTONES.length; i++) { + if (totalLevel < SKILL_MILESTONES[i]) { + if (i > player.getSkills().getSkillMilestone()) { + value |= 0x4; + player.getSkills().setSkillMilestone(i); + } + break; + } + } + value |= player.getSkills().getCombatMilestone() << 23; //Combat level milestone index. + value |= player.getSkills().getSkillMilestone() << 27; //Total level milestone index + player.getConfigManager().set(1230, value); + } + + /** + * Sends the flashing icons and level up interface (if slot is larger than -1). + * @param player The player. + * @param slot The currently level skill id (-1 for just sending flashing icons). + */ + public static void sendFlashingIcons(Player player, int slot) { + int value = 0; + for (int i = 0; i < Skills.SKILL_NAME.length; i++) { + if (player.getAttribute("levelup:" + i, false)) { + value |= FLASH_ICONS[i]; + } + } + if (slot > -1) { + value |= SKILL_ICON[slot]; + player.getInterfaceManager().openChatbox(new Component(740)); + } + player.getConfigManager().set(1179, value); + } + + /** + * @return the skillcapes + */ + public static int[] getSkillcapes() { + return SKILLCAPES; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/SkillBonus.java b/Server/src/main/java/Server/core/game/node/entity/skill/SkillBonus.java new file mode 100644 index 000000000..3111eaaaf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/SkillBonus.java @@ -0,0 +1,66 @@ +package core.game.node.entity.skill; + +/** + * Represents a skill bonus. + * @author Emperor + */ +public final class SkillBonus { + + /** + * The skill id. + */ + private final int skillId; + + /** + * The bonus. + */ + private final double bonus; + + /** + * The base bonus (in levels). + */ + private final int baseBonus; + + /** + * Constructs a new {@code SkillBonus} {@code Object}. + * @param skillId The skill id. + * @param bonus The bonus. + */ + public SkillBonus(int skillId, double bonus) { + this(skillId, bonus, 0); + } + + /** + * Constructs a new {@code SkillBonus} {@code Object}. + * @param skillId The skill id. + * @param bonus The bonus. + * @param baseBonus The base bonus in levels. + */ + public SkillBonus(int skillId, double bonus, int baseBonus) { + this.skillId = skillId; + this.bonus = bonus; + this.baseBonus = baseBonus; + } + + /** + * @return the skillId. + */ + public int getSkillId() { + return skillId; + } + + /** + * @return the bonus. + */ + public double getBonus() { + return bonus; + } + + /** + * @return the baseBonus. + */ + public int getBaseBonus() { + return baseBonus; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/SkillPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/SkillPulse.java new file mode 100644 index 000000000..2d3dc2922 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/SkillPulse.java @@ -0,0 +1,105 @@ +package core.game.node.entity.skill; + +import core.game.node.entity.skill.gather.SkillingResource; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.node.Node; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; + +/** + * Pulse class specifically used for Skills. + * @author Emperor + */ +public abstract class SkillPulse extends Pulse { + + /** + * The player. + */ + protected final Player player; + + /** + * The node. + */ + protected T node; + + /** + * The tool used. + */ + protected SkillingTool tool; + + /** + * The resource. + */ + protected SkillingResource resource; + + /** + * If we should reset the anim at the end. + */ + protected boolean resetAnimation = true; + + /** + * Constructs a new {@code SkillPulse} {@code Object}. + * @param player The player. + * @param node The node. + */ + public SkillPulse(Player player, T node) { + super(1, player, node); + this.player = player; + this.node = node; + super.stop(); + } + + @Override + public void start() { + if (checkRequirements()) { + super.start(); + message(0); + } + } + + @Override + public boolean pulse() { + if (!checkRequirements()) { + return true; + } + animate(); + return reward(); + } + + @Override + public void stop() { + if (resetAnimation) { + player.animate(new Animation(-1, Priority.HIGH)); + } + super.stop(); + message(1); + } + + /** + * Checks if the player meets all the requirements. + * @return {@code True} if the player can continue, {@code false} if not. + */ + public abstract boolean checkRequirements(); + + /** + * Sends the animations related to the actions the player is doing. + */ + public abstract void animate(); + + /** + * Rewards the player. + * @return {@code True} if the player should stop this skilling pulse. + */ + public abstract boolean reward(); + + /** + * Sends a message to the player. + * @param type The message type (0: start message, 1: stop message). + */ + public void message(int type) { + + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/SkillRestoration.java b/Server/src/main/java/Server/core/game/node/entity/skill/SkillRestoration.java new file mode 100644 index 000000000..e66c86059 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/SkillRestoration.java @@ -0,0 +1,113 @@ +package core.game.node.entity.skill; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.world.GameWorld; +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks; + +/** + * Handles the skill restoration data. + * @author Emperor + */ +public final class SkillRestoration { + + /** + * The skill index. + */ + private final int skillId; + + /** + * The current tick. + */ + private int statTick; + + private int hpSummPrayTick; + + /** + * Constructs a new {@code SkillRestoration} {@code Object}. + * @param skillId The skill id. + */ + public SkillRestoration(int skillId) { + this.skillId = skillId; + restartHpSummPray(false); + restartStat(false); + } + + /** + * Restores the skill. + * @param entity The entity. + */ + public void restore(Entity entity) { + Skills skills = entity.getSkills(); + int max = skills.getStaticLevel(skillId); + if(skillId == Skills.HITPOINTS && entity instanceof Player && SkillcapePerks.isActive(SkillcapePerks.DAMAGE_SPONG,entity.asPlayer())){ + max = 110; + } + if(hpSummPrayTick < GameWorld.getTicks()){ + if(skillId == Skills.HITPOINTS || skillId == Skills.SUMMONING || skillId == Skills.PRAYER){ + if(skillId == Skills.HITPOINTS){ + if(skills.getLifepoints() >= max){ + return; + } + skills.heal(1); + } else { + int current = skills.getLevel(skillId); + skills.updateLevel(skillId,current < max ? 1 : -1,max); + } + restartHpSummPray(entity.asPlayer().getPrayer().getActive().contains(PrayerType.RAPID_HEAL)); + } + } + if(statTick < GameWorld.getTicks()) { + if (skillId != Skills.HITPOINTS && skillId != Skills.SUMMONING && skillId != Skills.PRAYER) { + int current = skills.getLevel(skillId); + skills.updateLevel(skillId,current < max ? 1 : -1,max); + restartStat(entity.asPlayer().getPrayer().getActive().contains(PrayerType.RAPID_RESTORE)); + } + } + } + + /** + * Gets the tick. + * @return The tick. + */ + public int getTick() { + return hpSummPrayTick; + } + + /** + * Sets the tick. + * @param tick The tick to set. + */ + public void setTick(int tick) { + this.hpSummPrayTick = tick; + this.statTick = tick; + } + + /** + * Gets the skillId. + * @return The skillId. + */ + public int getSkillId() { + return skillId; + } + + /** + * Restarts the restoration. + */ + public void restartHpSummPray(boolean half) { + int ticks = 100; + if(half){ + ticks /= 2; + } + this.hpSummPrayTick = GameWorld.getTicks() + ticks; + } + + public void restartStat(boolean half) { + int ticks = 100; + if(half){ + ticks /= 2; + } + this.statTick = GameWorld.getTicks() + ticks; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/Skills.java b/Server/src/main/java/Server/core/game/node/entity/skill/Skills.java new file mode 100644 index 000000000..caa4e1cc3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/Skills.java @@ -0,0 +1,989 @@ +package core.game.node.entity.skill; + +import core.game.world.GameWorld; +import core.tools.Items; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import core.plugin.CorePluginTypes.XPGainPlugins; +import core.game.content.ame.ExperienceMonitor; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.assist.AssistSession; +import core.game.node.item.Item; +import core.game.world.repository.Repository; +import core.game.world.update.flag.player.AppearanceFlag; +import core.net.packet.PacketRepository; +import core.net.packet.context.SkillContext; +import core.net.packet.out.SkillLevel; +import core.game.interaction.item.brawling_gloves.BrawlingGloves; +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks; + +import java.nio.ByteBuffer; + +/** + * Represents an entity's skills. + * @author Emperor + */ +public final class Skills { + + /** + * Represents the constant modifier of experience. + */ + public double experienceMutiplier = 5.0; + + /** + * The maximum experience multiplier. + */ + public static final double MAX_EXPERIENCE_MOD = 60.0; + + /** + * Represents an array of skill names. + */ + public static final String[] SKILL_NAME = { "Attack", "Defence", "Strength", "Hitpoints", "Ranged", "Prayer", "Magic", "Cooking", "Woodcutting", "Fletching", "Fishing", "Firemaking", "Crafting", "Smithing", "Mining", "Herblore", "Agility", "Thieving", "Slayer", "Farming", "Runecrafting", "Hunter", "Construction", "Summoning" }; + + /** + * Constants for the skill ids. + */ + public static final int ATTACK = 0, DEFENCE = 1, STRENGTH = 2, HITPOINTS = 3, RANGE = 4, PRAYER = 5, MAGIC = 6, COOKING = 7, WOODCUTTING = 8, FLETCHING = 9, FISHING = 10, FIREMAKING = 11, CRAFTING = 12, SMITHING = 13, MINING = 14, HERBLORE = 15, AGILITY = 16, THIEVING = 17, SLAYER = 18, FARMING = 19, RUNECRAFTING = 20, HUNTER = 21, CONSTRUCTION = 22, SUMMONING = 23; + + /** + * Number of skills in game + */ + public static final int NUM_SKILLS = 24; + + /** + * Represents the entity instance. + */ + private final Entity entity; + + /** + * An array containing all the player's experience. + */ + private final double[] experience; + + /** + * An array containing all the maximum levels. + */ + private final int[] staticLevels; + + /** + * An array containing all the current levels. + */ + private final int[] dynamicLevels; + + /** + * Represents the amount of prayer points left. + */ + private double prayerPoints = 1.; + + /** + * The player's life-points. + */ + private int lifepoints = 10; + + /** + * The amount of increased maximum lifepoints. + */ + private int lifepointsIncrease = 0; + + /** + * The total experience gained. + */ + private double experienceGained = 0; + + /** + * The restoration pulses. + */ + private final SkillRestoration[] restoration; + + /** + * If a lifepoints update should occur. + */ + private boolean lifepointsUpdate; + + /** + * The combat milestones. + */ + private int combatMilestone; + + /** + * The skilling milestones. + */ + private int skillMilestone; + + /** + * Constructs a new {@code Skills} {@code Object}. + * @param entity The entity. + */ + public Skills(Entity entity) { + this.entity = entity; + this.experience = new double[24]; + this.staticLevels = new int[24]; + this.dynamicLevels = new int[24]; + this.restoration = new SkillRestoration[24]; + for (int i = 0; i < 24; i++) { + this.staticLevels[i] = 1; + this.dynamicLevels[i] = 1; + } + this.experience[HITPOINTS] = 1154; + this.dynamicLevels[HITPOINTS] = 10; + this.staticLevels[HITPOINTS] = 10; + entity.getProperties().setCombatLevel(3); + } + + + /** + * Determine whether the specified skill is a combat skill. + * Prayer and Summoning are included and counted as combat skills. + * @param skill + * @return true if so. + */ + public boolean isCombat(int skill){ + if((skill >= ATTACK && skill <= MAGIC) || (skill == SUMMONING)){ + return true; + } + return false; + } + + /** + * Configures the skills. + */ + public void configure() { + updateCombatLevel(); + int max = 24; + if (entity instanceof NPC) { + max = 7; + } + for (int i = 0; i < max; i++) { + if (i != PRAYER && i != SUMMONING && restoration[i] == null) { + configureRestorationPulse(i); + } + } + } + + /** + * Called every pulse (600ms). + */ + public void pulse() { + if (lifepoints < 1) { + return; + } + for (int i = 0; i < restoration.length; i++) { + if (restoration[i] != null) { + restoration[i].restore(entity); + } + } + } + + /** + * Configures a restoration pulse for the given skill id. + * @param skillId The skill id. + */ + private void configureRestorationPulse(final int skillId) { + restoration[skillId] = new SkillRestoration(skillId); + } + + /** + * Copies the skills data. + * @param skills The skills. + */ + public void copy(Skills skills) { + for (int i = 0; i < 24; i++) { + this.staticLevels[i] = skills.staticLevels[i]; + this.dynamicLevels[i] = skills.dynamicLevels[i]; + this.experience[i] = skills.experience[i]; + } + prayerPoints = skills.prayerPoints; + lifepoints = skills.lifepoints; + lifepointsIncrease = skills.lifepointsIncrease; + experienceGained = skills.experienceGained; + } + + /** + * Adds experience to a skill. + * @param slot The skill slot. + * @param experience The experience. + */ + public void addExperience(int slot, double experience, boolean playerMod) { + double mod = getExperienceMod(slot, experience, playerMod, true); + final Player player = entity instanceof Player ? ((Player) entity) : null; + final AssistSession assist = entity.getExtension(AssistSession.class); + if (assist != null && assist.translateExperience(player, slot, experience, mod)) { + return; + } + boolean already200m = this.experience[slot] == 200000000; + double experienceAdd = (experience * mod); + //check if a player has brawling gloves and, if equipped, modify xp + if(!player.getBrawlingGlovesManager().GloveCharges.isEmpty()){ + Item gloves = BrawlingGloves.forSkill(slot) == null ? null : new Item(BrawlingGloves.forSkill(slot).getId()); + if(gloves == null && (slot == Skills.STRENGTH || slot == Skills.DEFENCE)){ + gloves = new Item (BrawlingGloves.forSkill(Skills.ATTACK).getId()); + } + if(gloves != null && player.getEquipment().containsItem(gloves)){ + experienceAdd += experienceAdd * player.getBrawlingGlovesManager().getExperienceBonus(); + player.getBrawlingGlovesManager().updateCharges(gloves.getId(),1); + } + } + //Check for Flame Gloves and Ring of Fire + if(player.getEquipment().containsItem(new Item(Items.FLAME_GLOVES_13660)) || player.getEquipment().containsItem(new Item(Items.RING_OF_FIRE_13659))){ + if(slot == Skills.FIREMAKING){ + int count = 0; + if(player.getEquipment().containsItem(new Item(Items.FLAME_GLOVES_13660))) count += 1; + if(player.getEquipment().containsItem(new Item(Items.RING_OF_FIRE_13659))) count += 1; + if(count == 2) experienceAdd += (0.05 * experienceAdd); + else experienceAdd += (0.02 * experienceAdd); + } + } + this.experience[slot] += experienceAdd; + try { + player.getAntiMacroHandler().monitors[slot].setExperienceAmount((int) experienceAdd); + } catch (Exception e){ + player.getAntiMacroHandler().monitors[slot] = new ExperienceMonitor(slot); + player.getAntiMacroHandler().monitors[slot].setExperienceAmount((int) experienceAdd); + } + if (this.experience[slot] >= 200000000) { + if(!already200m && !player.isArtificial()){ + Repository.sendNews(entity.asPlayer().getUsername()+" has just reached 200m experience in " + SKILL_NAME[slot] + "!"); + } + this.experience[slot] = 200000000; + } + if (entity instanceof Player && this.experience[slot] > 175) { + if (player.getSavedData().getGlobalData().getTutorialStage() < TutorialSession.MAX_STAGE && slot != HITPOINTS) { + this.experience[slot] = 175; + } + } + experienceGained += experienceAdd; + XPGainPlugins.run(player,slot,experienceAdd); + int newLevel = getStaticLevelByExperience(slot); + if (newLevel > staticLevels[slot]) { + int amount = newLevel - staticLevels[slot]; + if (dynamicLevels[slot] < newLevel) { + dynamicLevels[slot] += amount; + } + if (slot == HITPOINTS) { + lifepoints += amount; + } + staticLevels[slot] = newLevel; + if(newLevel == 99 && !player.isArtificial()){ + Repository.sendNews(entity.asPlayer().getUsername() + " has just achieved level 99 " + SKILL_NAME[slot]); + } + if (entity instanceof Player) { + if (updateCombatLevel()) { + player.getUpdateMasks().register(new AppearanceFlag(player)); + } + LevelUp.levelup(player, slot, amount); + } + } + if (entity instanceof Player) { + PacketRepository.send(SkillLevel.class, new SkillContext((Player) entity, slot)); + } + } + + /** + * Gets the current experience mod. + * @param slot The skill slot. + * @param experience The experience gained. + * @param playerMod If player mods should be applied. + * @return The experience mod. + */ + private double getExperienceMod(int slot, double experience, boolean playerMod, boolean multiplyer) { + //Keywords for people ctrl + Fing the project + //xprate xp rate xp multiplier skilling rate + return experienceMutiplier; + /*if (!(entity instanceof Player)) { + return 1.0; + } + double mod = multiplyer ? (EXPERIENCE_MULTIPLIER) : 1; + Player p = (Player) entity; + if (p.getIronmanManager().getMode() == IronmanMode.ULTIMATE) { + mod /= 4; + } else if (p.getIronmanManager().getMode() == IronmanMode.STANDARD) { + mod /= 2; + } + //A boost for combat skills that are under level 65. + if(entity instanceof Player && !this.hasLevel(slot, 65) && isCombat(slot)){ + mod *= 1.5; + } + //Grand Exchange region XP boost. + if(entity.getViewport().getRegion().getRegionId() == 12598){ + mod += 1.5; + } + // Pest control, XP halved during the game + if (entity.getViewport().getRegion().getRegionId() == 10536) { + mod *= .5; + } + if (SystemManager.getSystemConfig().isDoubleExp()) { + mod *= 2; + } + if (HolidayEvent.getCurrent() != null) { + HolidayEvent.getCurrent().addExperience(p, slot, experience); + } + p.getAntiMacroHandler().registerExperience(slot, experience); + if (TutorialSession.getExtension(p).getStage() < TutorialSession.MAX_STAGE) { + mod = 1.0; + } else { + if (playerMod && p.getExperienceMod() != 0.0) { + mod *= p.getExperienceMod(); + } + } + if (mod > MAX_EXPERIENCE_MOD ) { + return MAX_EXPERIENCE_MOD; + } + return mod;*/ + } + + /** + * Adds experience to the skills. + */ + public void addExperience(final int slot, double experience) { + addExperience(slot, experience, false); + } + + /** + * Gets the highest combat skill id. + * @return The id of the highest combat skill. + */ + public int getHighestCombatSkill() { + int id = 0; + int last = 0; + for (int i = 0; i < 5; i++) { + if (staticLevels[i] > last) { + last = staticLevels[i]; + id = i; + } + } + return id; + } + + /** + * Returns the dynamic levels to the static levels + */ + public void restore() { + for (int i = 0; i < 24; i++) { + int staticLevel = getStaticLevel(i); + setLevel(i, staticLevel); + } + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(2674); + } + rechargePrayerPoints(); + } + + /** + * Parses the skill data from the buffer. + * @param buffer The byte buffer. + */ + public void parse(ByteBuffer buffer) { + for (int i = 0; i < 24; i++) { + experience[i] = ((double) buffer.getInt() / 10D); + dynamicLevels[i] = buffer.get() & 0xFF; + if (i == HITPOINTS) { + lifepoints = dynamicLevels[i]; + } else if (i == PRAYER) { + prayerPoints = dynamicLevels[i]; + } + staticLevels[i] = buffer.get() & 0xFF; + } + experienceGained = buffer.getInt(); + } + + public void parse(JSONArray skillData){ + for(int i = 0; i < skillData.size(); i++){ + JSONObject skill = (JSONObject) skillData.get(i); + int id = Integer.parseInt( skill.get("id").toString()); + dynamicLevels[id] = Integer.parseInt( skill.get("dynamic").toString()); + if (id == HITPOINTS) { + lifepoints = dynamicLevels[i]; + } else if (id == PRAYER) { + prayerPoints = dynamicLevels[i]; + } + staticLevels[id] = Integer.parseInt( skill.get("static").toString()); + experience[id] = Double.parseDouble(skill.get("experience").toString()); + } + } + + public void parseExpRate(ByteBuffer buffer) { + experienceMutiplier = buffer.getDouble(); + if(GameWorld.getSettings().getDefault_xp_rate() != experienceMutiplier){ + experienceMutiplier = GameWorld.getSettings().getDefault_xp_rate(); + } + } + + /** + * Saves the skill data on the buffer. + * @param buffer The byte buffer. + */ + public void save(ByteBuffer buffer) { + for (int i = 0; i < 24; i++) { + buffer.putInt((int) (experience[i] * 10)); + if (i == HITPOINTS) { + buffer.put((byte) lifepoints); + } else if (i == PRAYER) { + buffer.put((byte) Math.ceil(prayerPoints)); + } else { + buffer.put((byte) dynamicLevels[i]); + } + buffer.put((byte) staticLevels[i]); + } + buffer.putInt((int) experienceGained); + } + + public void saveExpRate(ByteBuffer buffer) { + buffer.putDouble(experienceMutiplier); + } + + /** + * Refreshes all the skill levels. + */ + public void refresh() { + if (!(entity instanceof Player)) { + return; + } + Player player = (Player) entity; + for (int i = 0; i < 24; i++) { + PacketRepository.send(SkillLevel.class, new SkillContext(player, i)); + } + LevelUp.sendFlashingIcons(player, -1); + } + + /** + * Gets the static level. + * @param slot The skill's slot. + * @return The level. + */ + public int getStaticLevelByExperience(int slot) { + double exp = experience[slot]; + + int points = 0; + int output = 0; + for (byte lvl = 1; lvl < 100; lvl++) { + points += Math.floor(lvl + 300.0 * Math.pow(2.0, lvl / 7.0)); + output = (int) Math.floor(points / 4); + if ((output - 1) >= exp) { + return lvl; + } + } + return 99; + } + + public int levelFromXP(double exp) { + + int points = 0; + int output = 0; + for (byte lvl = 1; lvl < 100; lvl++) { + points += Math.floor(lvl + 300.0 * Math.pow(2.0, lvl / 7.0)); + output = (int) Math.floor(points / 4); + if ((output - 1) >= exp) { + return lvl; + } + } + return 99; + } + + /** + * Gets the experience for a certain level. + * @param level The level. + * @return The experience needed. + */ + public int getExperienceByLevel(int level) { + int points = 0; + int output = 0; + for (int lvl = 1; lvl <= level; lvl++) { + points += Math.floor(lvl + 300.0 * Math.pow(2.0, lvl / 7.0)); + if (lvl >= level) { + return output; + } + output = (int) Math.floor(points / 4); + } + return 0; + } + + /** + * Updates the combat level. + * @return {@code True} if the combat level changed. + */ + @SuppressWarnings("deprecation") + public boolean updateCombatLevel() { + boolean update = false; + int level = calculateCombatLevel(); + update = level != entity.getProperties().getCombatLevel(); + if (entity instanceof Player) { + Player player = (Player) entity; + int summon = staticLevels[SUMMONING] / 8; + if (summon != player.getFamiliarManager().getSummoningCombatLevel()) { + player.getFamiliarManager().setSummoningCombatLevel(summon); + update = true; + } + } + entity.getProperties().setCombatLevel(level); + return update; + } + + /** + * Gets the combat level (ignoring summoning). + * @return The combat level. + */ + private int calculateCombatLevel() { + if (entity instanceof NPC) { + return ((NPC) entity).getDefinition().getCombatLevel(); + } + int combatLevel = 0; + int melee = staticLevels[ATTACK] + staticLevels[STRENGTH]; + int range = (int) (1.5 * staticLevels[RANGE]); + int mage = (int) (1.5 * staticLevels[MAGIC]); + if (melee > range && melee > mage) { + combatLevel = melee; + } else if (range > melee && range > mage) { + combatLevel = range; + } else { + combatLevel = mage; + } + combatLevel = staticLevels[DEFENCE] + staticLevels[HITPOINTS] + (staticLevels[PRAYER] / 2) + (int) (1.3 * combatLevel); + return combatLevel / 4; + } + + /** + * @return the player + */ + public Entity getEntity() { + return entity; + } + + /** + * Gets the experience. + * @param slot The slot. + * @return The experience. + */ + public double getExperience(int slot) { + return experience[slot]; + } + + /** + * Gets the static skill level. + * @param slot The slot. + * @return The static level. + */ + public int getStaticLevel(int slot) { + return staticLevels[slot]; + } + + /** + * Sets the experience gained. + * @param experienceGained The experience gained. + */ + public void setExperienceGained(double experienceGained) { + this.experienceGained = experienceGained; + } + + /** + * Gets the experience gained. + * @return The experience gained. + */ + public double getExperienceGained() { + return experienceGained; + } + + /** + * Sets a dynamic level. + * @param slot The skill id. + * @param level The level. + */ + public void setLevel(int slot, int level) { + if (slot == HITPOINTS) { + lifepoints = level; + } else if (slot == PRAYER) { + prayerPoints = level; + } + dynamicLevels[slot] = level; + if (restoration[slot] != null) { + restoration[slot].restartHpSummPray(false); + restoration[slot].restartStat(false); + } + if (entity instanceof Player) { + PacketRepository.send(SkillLevel.class, new SkillContext((Player) entity, slot)); + } + } + + /** + * Gets a dynamic level. + * @param slot The skill id. + * @return The dynamic level. + */ + public int getLevel(int slot, boolean discardAssist) { + if (!discardAssist) { + if (entity instanceof Player) { + final Player p = (Player) entity; + final AssistSession assist = p.getExtension(AssistSession.class); + if (assist != null && assist.getPlayer() != p) { + Player assister = assist.getPlayer(); + int index = assist.getSkillIndex(slot); + if (index != -1 && !assist.isRestricted()) { + // System.out.println(index + ", " + + // assist.getSkills()[index] + ", " + SKILL_NAME[slot]); + if (assist.getSkills()[index]) { + int assistLevel = assister.getSkills().getLevel(slot); + int playerLevel = dynamicLevels[slot]; + if (assistLevel > playerLevel) { + return assistLevel; + } + } + } + } + } + } + return dynamicLevels[slot]; + } + + /** + * Gets the level. + * @param slot the slot. + * @return the level. + */ + public int getLevel(int slot) { + return getLevel(slot, false); + } + + /** + * Sets the current amount of lifepoints. + * @param lifepoints The lifepoints. + */ + public void setLifepoints(int lifepoints) { + this.lifepoints = lifepoints; + if (this.lifepoints < 0) { + this.lifepoints = 0; + } + lifepointsUpdate = true; + } + + /** + * Gets the lifepoints. + * @return The lifepoints. + */ + public int getLifepoints() { + return lifepoints; + } + + /** + * Gets the maximum amount of lifepoints. + * @return The maximum amount. + */ + public int getMaximumLifepoints() { + if(this.entity instanceof Player && SkillcapePerks.isActive(SkillcapePerks.DAMAGE_SPONG,this.getEntity().asPlayer())){ + lifepointsIncrease = 11; + } else { + lifepointsIncrease = 0; + } + return staticLevels[HITPOINTS] + lifepointsIncrease; + } + + /** + * Sets the amount of lifepoints increase. + * @param amount The amount. + */ + public void setLifepointsIncrease(int amount) { + this.lifepointsIncrease = amount; + } + + /** + * Adds lifepoints to the entity. + * @param health The amount to add. + * @return The amount of overflow. + */ + public int heal(int health) { + lifepoints += health; + int left = 0; + if (lifepoints > getMaximumLifepoints()) { + left = lifepoints - getMaximumLifepoints(); + lifepoints = getMaximumLifepoints(); + } + lifepointsUpdate = true; + return left; + } + + public void healNoRestrictions(int amount){ + lifepoints += amount; + lifepointsUpdate = true; + } + + /** + * @Deprecated Use + * {@link ImpactHandler#manualHit(Entity, int, ImpactHandler.HitsplatType)} + * or
the hitsplat WILL NOT show and combat will be + * desynchronized! + * @param damage The amount to remove. + * @return The amount of overflow. + */ + public int hit(int damage) { + lifepoints -= damage; + int left = 0; + if (lifepoints < 0) { + left = -lifepoints; + lifepoints = 0; + } + lifepointsUpdate = true; + return left; + } + + /** + * Gets the prayer points. + * @return The prayer points. + */ + public double getPrayerPoints() { + return prayerPoints; + } + + /** + * Recharges the prayer points. + */ + public void rechargePrayerPoints() { + prayerPoints = staticLevels[PRAYER]; + if (entity instanceof Player) { + PacketRepository.send(SkillLevel.class, new SkillContext((Player) entity, PRAYER)); + } + } + + /** + * Updates the current amount of prayer points (by decrementing). + * @param amount The amount to decrement with. + */ + public void decrementPrayerPoints(double amount) { + prayerPoints -= amount; + if (prayerPoints < 0) { + prayerPoints = 0; + } + // if (prayerPoints > staticLevels[PRAYER]) { + // prayerPoints = staticLevels[PRAYER]; + // } + if (entity instanceof Player) { + PacketRepository.send(SkillLevel.class, new SkillContext((Player) entity, PRAYER)); + } + } + + /** + * Updates the current amount of prayer points (by incrementing) + * @param amount The amount to decrement with. + */ + public void incrementPrayerPoints(double amount) { + prayerPoints += amount; + if (prayerPoints < 0) { + prayerPoints = 0; + } + if (prayerPoints > staticLevels[PRAYER]) { + prayerPoints = staticLevels[PRAYER]; + } + if (entity instanceof Player) { + PacketRepository.send(SkillLevel.class, new SkillContext((Player) entity, PRAYER)); + } + } + + /** + * Sets the current prayer points (without checking for being higher than + * max) + * @param amount The amount. + */ + public void setPrayerPoints(double amount) { + prayerPoints = amount; + if (entity instanceof Player) { + PacketRepository.send(SkillLevel.class, new SkillContext((Player) entity, PRAYER)); + } + } + + /** + * Updates the current skill level (by incrementing the current amount with + * the given amount, up to the given maximum). + * @param skill The skill id. + * @param amount The amount to increment. + * @param maximum The maximum amount the skill can be. + * @return The amount of "overflow". + */ + public int updateLevel(int skill, int amount, int maximum) { + if (amount > 0 && dynamicLevels[skill] > maximum) { + return -amount; + } + int left = (dynamicLevels[skill] + amount) - maximum; + int level = dynamicLevels[skill] += amount; + if (level < 0) { + dynamicLevels[skill] = 0; + } else if (amount < 0 && level < maximum) { + dynamicLevels[skill] = maximum; + } else if (amount > 0 && level > maximum) { + dynamicLevels[skill] = maximum; + } + if (restoration[skill] != null) { + restoration[skill].restartHpSummPray(false); + restoration[skill].restartStat(false); + } + if (entity instanceof Player) { + PacketRepository.send(SkillLevel.class, new SkillContext((Player) entity, skill)); + } + return left; + } + + /** + * Updates a level. + * @param skill the skill. + * @param amount the amount. + * @return the left. + */ + public int updateLevel(int skill, int amount) { + return updateLevel(skill, amount, amount >= 0 ? getStaticLevel(skill) + amount : getStaticLevel(skill) - amount); + } + + /** + * Drains a certain percentage of a level. + * @param skill The skill. + * @param drainPercentage The drain percentage (0.05 indicates 5% drain). + * @param maximumDrainPercentage The maximum drain percentage (0.05 + * indicates 5%). + */ + public void drainLevel(int skill, double drainPercentage, double maximumDrainPercentage) { + int drain = (int) (dynamicLevels[skill] * drainPercentage); + int minimum = (int) (staticLevels[skill] * (1.0 - maximumDrainPercentage)); + updateLevel(skill, -drain, minimum); + } + + /** + * Sets the static level. + * @param skill The skill id. + * @param level The level to set. + */ + public void setStaticLevel(int skill, int level) { + experience[skill] = getExperienceByLevel(staticLevels[skill] = dynamicLevels[skill] = level); + if (entity instanceof Player) { + PacketRepository.send(SkillLevel.class, new SkillContext((Player) entity, skill)); + } + } + + /** + * Gets the restoration pulses. + * @return The restoration pulse array. + */ + public SkillRestoration[] getRestoration() { + return restoration; + } + + /** + * Gets the amount of mastered skills. + * @return The amount of mastered skills. + */ + public int getMasteredSkills() { + int count = 0; + for (int i = 0; i < 23; i++) { + if (getStaticLevel(i) >= 99) { + count++; + } + } + return count; + } + + /** + * Method used to get the skill by the name. + * @param name the name. + * @return the skill. + */ + public static int getSkillByName(final String name) { + for (int i = 0; i < SKILL_NAME.length; i++) { + if (SKILL_NAME[i].equalsIgnoreCase(name)) { + return i; + } + } + return -1; + } + + /** + * Gets the total level. + * @return the total level. + */ + public int getTotalLevel() { + int level = 0; + for (int i = 0; i < 24; i++) { + level += getStaticLevel(i); + } + return level; + } + + /** + * Gets the total exp. + * @return the exp. + */ + public int getTotalXp() { + int total = 0; + for (int skill = 0; skill < Skills.SKILL_NAME.length; skill++) { + total += this.getExperience(skill); + } + return total; + } + + /** + * Gets the lifepointsUpdate. + * @return The lifepointsUpdate. + */ + public boolean isLifepointsUpdate() { + return lifepointsUpdate; + } + + /** + * Sets the lifepointsUpdate. + * @param lifepointsUpdate The lifepointsUpdate to set. + */ + public void setLifepointsUpdate(boolean lifepointsUpdate) { + this.lifepointsUpdate = lifepointsUpdate; + } + + /** + * Gets the statis levels. + * @return the level. + */ + public int[] getStaticLevels() { + return staticLevels; + } + + /** + * Checks if the player has the required level. + * @param skillId the skill id. + * @param i the level. + * @return {@code True} if so. + */ + public boolean hasLevel(int skillId, int i) { + return getStaticLevel(skillId) >= i; + } + + /** + * Gets the combatMilestone value. + * @return The combatMilestone. + */ + public int getCombatMilestone() { + return combatMilestone; + } + + /** + * Sets the combatMilestones value. + * @param combatMilestone The combatMilestones to set. + */ + public void setCombatMilestone(int combatMilestone) { + this.combatMilestone = combatMilestone; + } + + /** + * Gets the skillMilestone value. + * @return The skillMilestone. + */ + public int getSkillMilestone() { + return skillMilestone; + } + + /** + * Sets the skillMilestone value. + * @param skillMilestone The skillMilestone to set. + */ + public void setSkillMilestone(int skillMilestone) { + this.skillMilestone = skillMilestone; + } + + public int[] getDynamicLevels() { + return dynamicLevels; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityCourse.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityCourse.java new file mode 100644 index 000000000..bff5d69dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityCourse.java @@ -0,0 +1,158 @@ +package core.game.node.entity.skill.agility; + +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Represents an agility course. + * @author Emperor + */ +public abstract class AgilityCourse extends OptionHandler { + + /** + * The player doing the agility course. + */ + private final Player player; + + /** + * The obstacles the player has already passed. + */ + private final boolean[] obstaclesPassed; + + /** + * The completion experience. + */ + private double completionExperience; + + /** + * Constructs a new {@code AgilityCourse} {@code Object}. + * @param player The player. + * @param size The amount of obstacles in the course. + * @param completionExperience The amount of experience to gain upon + * completing the course. + */ + public AgilityCourse(Player player, int size, double completionExperience) { + this.player = player; + this.obstaclesPassed = new boolean[size]; + this.completionExperience = completionExperience; + } + + @Override + public final Plugin newInstance(Object arg) throws Throwable { + if (arg == null) { + configure(); + return this; + } + return createInstance((Player) arg); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Configures the course. + */ + public abstract void configure(); + + /** + * Creates a new instance for the player. + * @param player The player. + * @return The agility course instance. + */ + public abstract AgilityCourse createInstance(Player player); + + /** + * Gets the agility course for the given player. If the player didn't have + * the course as an extension, an extension will be added. + * @param player The player. + * @return The agility course instance. + */ + public AgilityCourse getCourse(Player player) { + AgilityCourse course = player.getExtension(AgilityCourse.class); + if (course == null || course.getClass() != getClass()) { + try { + player.addExtension(AgilityCourse.class, course = createInstance(player)); + } catch (Throwable e) { + e.printStackTrace(); + } + } + return course; + } + + /** + * Finishes the lap by checking for completion and resetting. + */ + public void finish() { + if (isCompleted()) { + player.getSkills().addExperience(Skills.AGILITY, completionExperience, true); + } + reset(); + } + + /** + * Checks if the course has been completed. + * @return {@code True} if so. + */ + public boolean isCompleted() { + for (int i = 0; i < obstaclesPassed.length; i++) { + if (!obstaclesPassed[i]) { + return false; + } + } + return true; + } + + /** + * Resets the currently passed obstacles in the course. + */ + public void reset() { + for (int i = 0; i < obstaclesPassed.length; i++) { + obstaclesPassed[i] = false; + } + } + + /** + * Flags an obstacles as passed. + * @param index The obstacle index. + */ + public void flag(int index) { + obstaclesPassed[index] = true; + if (index == obstaclesPassed.length - 1) { + finish(); + } + } + + /** + * Gets the amount of damage to deal. + * @param player The player. + * @return The amount of damage. + */ + protected static int getHitAmount(Player player) { + int hit = player.getSkills().getLifepoints() / 12; + if (hit < 2) { + hit = 2; + } + return hit; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the passed obstacles flags. + * @return The passed obstacles flags. + */ + public boolean[] getPassedObstacles() { + return obstaclesPassed; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityHandler.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityHandler.java new file mode 100644 index 000000000..dab3c73f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityHandler.java @@ -0,0 +1,296 @@ +package core.game.node.entity.skill.agility; + +import core.game.node.entity.skill.Skills; +import core.game.interaction.MovementPulse; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Holds agility-related utility methods. + * @author Emperor + */ +public final class AgilityHandler { + + /** + * Checks if the player has failed crossing an obstacle. + * @param player The player. + * @param level The level requirement for the obstacle. + * @param failChance The chance of failing (0.0 - 0.99). + * @return {@code True} if the player has failed. + */ + public static boolean hasFailed(Player player, int level, double failChance) { + int levelDiff = player.getSkills().getLevel(Skills.AGILITY) - level; + if (levelDiff > 69) { + return false; + } + double chance = (1 + levelDiff) * 0.01; + chance *= Math.random(); + return chance <= (Math.random() * failChance); + } + + /** + * Handles failing an obstacle (by using force movement). + * @param player The player. + * @param delay The amount of ticks before teleporting to the destination + * and hitting. + * @param start The start location. + * @param end The end location. + * @param dest The destination. + * @param anim The animation. + * @param hit The amount of damage to hit. + * @param message The message to send. + */ + public static ForceMovement failWalk(final Player player, int delay, Location start, Location end, final Location dest, Animation anim, int speed, final int hit, final String message, Direction direction) { + ForceMovement movement = new ForceMovement(player, start, end, anim, speed) { + @Override + public void stop() { + super.stop(); + player.getProperties().setTeleportLocation(dest); + if (hit > 0) { + player.getImpactHandler().setDisabledTicks(0); + player.getImpactHandler().manualHit(player, hit, HitsplatType.NORMAL); + } + if (message != null) { + player.getPacketDispatch().sendMessage(message); + } + } + }; + if (direction != null) { + movement.setDirection(direction); + } + movement.start(); + movement.setDelay(delay); + GameWorld.getPulser().submit(movement); + return movement; + } + + /** + * Handles failing an obstacle (by using force movement). + * @param player The player. + * @param delay The amount of ticks before teleporting to the destination + * and hitting. + * @param start The start location. + * @param end The end location. + * @param dest The destination. + * @param anim The animation. + * @param hit The amount of damage to hit. + * @param message The message to send. + */ + public static ForceMovement failWalk(final Player player, int delay, Location start, Location end, final Location dest, Animation anim, int speed, final int hit, final String message) { + return failWalk(player, delay, start, end, dest, anim, speed, hit, message, null); + } + + /** + * Handles failing an obstacle. + * @param player The player. + * @param delay The amount of ticks before teleporting to the destination + * and hitting. + * @param dest The destination. + * @param anim The animation. + * @param hit The amount of damage to hit. + * @param message The message to send. + */ + public static void fail(final Player player, int delay, final Location dest, Animation anim, final int hit, final String message) { + if (anim != null) { + player.animate(anim); + } + GameWorld.getPulser().submit(new Pulse(anim.getDefinition().getDurationTicks(), player) { + @Override + public boolean pulse() { + player.getProperties().setTeleportLocation(dest); + player.animate(Animation.RESET); + if (hit > 0) { + player.getImpactHandler().setDisabledTicks(0); + player.getImpactHandler().manualHit(player, hit, HitsplatType.NORMAL); + } + if (message != null) { + player.getPacketDispatch().sendMessage(message); + } + return true; + } + }); + } + + /** + * Walks across an obstacle using the force movement update mask. + * @param start The start location. + * @param end The end location. + * @param animation The animation. + * @param speed The force movement speed. + * @param experience The amount of agility experience to give as reward. + * @param message The message to send upon completion. + * @return The force movement instance, if force movement is used. + */ + public static ForceMovement forceWalk(final Player player, final int courseIndex, Location start, Location end, Animation animation, int speed, final double experience, final String message) { + ForceMovement movement = new ForceMovement(player, start, end, animation, speed) { + @Override + public void stop() { + super.stop(); + if (message != null) { + player.getPacketDispatch().sendMessage(message); + } + if (experience > 0.0) { + player.getSkills().addExperience(Skills.AGILITY, experience, true); + } + setObstacleFlag(player, courseIndex); + } + }; + movement.start(); + GameWorld.getPulser().submit(movement); + return movement; + } + + /** + * Walks across an obstacle using the force movement update mask. + * @param start The start location. + * @param end The end location. + * @param animation The animation. + * @param speed The force movement speed. + * @param experience The amount of agility experience to give as reward. + * @param message The message to send upon completion. + * @return The force movement instance, if force movement is used. + */ + public static ForceMovement forceWalk(final Player player, final int courseIndex, Location start, Location end, Animation animation, int speed, final double experience, final String message, int delay) { + if (delay < 1) { + return forceWalk(player, courseIndex, start, end, animation, speed, experience, message); + } + final ForceMovement movement = new ForceMovement(player, start, end, animation, speed) { + @Override + public void stop() { + super.stop(); + if (message != null) { + player.getPacketDispatch().sendMessage(message); + } + if (experience > 0.0) { + player.getSkills().addExperience(Skills.AGILITY, experience, true); + } + setObstacleFlag(player, courseIndex); + } + }; + GameWorld.getPulser().submit(new Pulse(delay, player) { + @Override + public boolean pulse() { + movement.start(); + GameWorld.getPulser().submit(movement); + return true; + } + }); + return movement; + } + + /** + * Executes the climbing reward. + * @param player The player. + * @param animation The climbing animation. + * @param destination The destination. + * @param experience The amount of agility experience to give as reward. + * @param message The message to send upon completion. + */ + public static void climb(final Player player, final int courseIndex, Animation animation, final Location destination, final double experience, final String message) { + climb(player, courseIndex, animation, destination, experience, message, 2); + } + + /** + * Executes the climbing reward. + * @param player The player. + * @param animation The climbing animation. + * @param destination The destination. + * @param experience The amount of agility experience to give as reward. + * @param message The message to send upon completion. + */ + public static void climb(final Player player, final int courseIndex, Animation animation, final Location destination, final double experience, final String message, int delay) { + player.lock(delay + 1); + player.animate(animation); + GameWorld.getPulser().submit(new Pulse(delay) { + @Override + public boolean pulse() { + if (message != null) { + player.getPacketDispatch().sendMessage(message); + } + if (experience > 0.0) { + player.getSkills().addExperience(Skills.AGILITY, experience, true); + } + player.getProperties().setTeleportLocation(destination); + setObstacleFlag(player, courseIndex); + return true; + } + }); + } + + /** + * Uses the walking queue to walk across an obstacle. + * @param player The player. + * @param courseIndex The obstacle index for the course, {@code -1} if no + * course. + * @param start The start location. + * @param end The end location. + * @param animation The animation. + * @param experience The agility experience. + * @param message The message to send upon completion. + */ + public static void walk(final Player player, final int courseIndex, final Location start, final Location end, final Animation animation, final double experience, final String message) { + if (!player.getLocation().equals(start)) { + player.getPulseManager().run(new MovementPulse(player, start) { + @Override + public boolean pulse() { + walk(player, courseIndex, start, end, animation, experience, message); + return true; + } + }, "movement"); + return; + } + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(end.getX(), end.getY(), true); + int ticks = player.getWalkingQueue().getQueue().size(); + player.getImpactHandler().setDisabledTicks(ticks); + player.lock(1 + ticks); + LogoutTask task = player.getExtension(LogoutTask.class); + if (task == null || !(task instanceof LocationLogoutTask) || !((LocationLogoutTask) task).isValid()) { + player.addExtension(LogoutTask.class, new LocationLogoutTask(1 + ticks, start)); + } + if (animation != null) { + player.getAppearance().setAnimations(animation); + } + GameWorld.getPulser().submit(new Pulse(ticks, player) { + @Override + public boolean pulse() { + if (animation != null) { + player.getAppearance().setAnimations(); + player.getAppearance().sync(); + } + if (message != null) { + player.getPacketDispatch().sendMessage(message); + } + if (experience > 0.0) { + player.getSkills().addExperience(Skills.AGILITY, experience, true); + } + setObstacleFlag(player, courseIndex); + return true; + } + }); + } + + /** + * Sets the obstacle flag for the agility course. + * @param player The player. + * @param courseIndex The course index. + */ + public static void setObstacleFlag(Player player, int courseIndex) { + if (courseIndex < 0) { + return; + } + AgilityCourse course = player.getExtension(AgilityCourse.class); + if (course != null && courseIndex < course.getPassedObstacles().length) { + course.flag(courseIndex); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityShortcut.java new file mode 100644 index 000000000..5cde0f776 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/AgilityShortcut.java @@ -0,0 +1,228 @@ +package core.game.node.entity.skill.agility; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.game.node.entity.skill.Skills; + +/** + * Handles an agility shortcut. + * @author Woah + */ +public abstract class AgilityShortcut extends OptionHandler { + + /** + * The ids used for this shortcut. + */ + private final int[] ids; + + /** + * The level required. + */ + private final int level; + + /** + * The experience required. + */ + private final double experience; + + /** + * If the player can fail this shortcut. + */ + private final boolean canFail; + + /** + * The chance to fail. + */ + private double failChance; + + /** + * The options for the shortcut. + */ + private final String[] options; + + /** + * Constructs a new {@Code AgilityShortcut} {@Code Object} + * @param ids the ids. + * @param level the level. + * @param experience the experience. + * @param canFail if this shortcut can be failed. + * @param failChance the chance to fail + * @param options the options. + */ + public AgilityShortcut(int[] ids, int level, double experience, boolean canFail, double failChance, String... options) { + this.ids = ids; + this.level = level; + this.experience = experience; + this.canFail = canFail; + this.failChance = failChance; + this.options = options; + } + + /** + * Constructs a new {@Code AgilityShortcut} {@Code Object} + * @param ids the ids. + * @param level the level. + * @param experience the experience. + * @param options the options. + */ + public AgilityShortcut(int[] ids, int level, double experience, String... options) { + this(ids, level, experience, false, 0.0, options); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + configure(this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!checkRequirements(player)) { + return true; + } + run(player, node.asObject(), option, checkFail(player, node.asObject(), option)); + return true; + } + + /** + * Runs the agility reward for the short cut. + * @param player the player. + * @param object the object. + * @param option the option. + * @param failed the shortcut failed. + */ + public abstract void run(Player player, GameObject object, String option, boolean failed); + + /** + * Checks the requirements for a player. + * @param player the player. + * @return {@code True} if so. + */ + public boolean checkRequirements(Player player) { + if (player.getSkills().getLevel(Skills.AGILITY) < level) { + player.getDialogueInterpreter().sendDialogue("You need an Agility level of at least " + level + " to negotiate this obstacle."); + return false; + } + return true; + } + + /** + * Checks if the player failed the shortcut. + * @param player the player. + * @param object the object. + * @param option2 the option. + * @return {@code True} if failed. + */ + private boolean checkFail(Player player, GameObject object, String option2) { + if (!canFail) { + return false; + } + return AgilityHandler.hasFailed(player, level, failChance); + } + + /** + * Configures this shortcut. + */ + public void configure(AgilityShortcut shortcut) { + for (int objectId : shortcut.ids) { + ObjectDefinition def = ObjectDefinition.forId(objectId); + for (String option : shortcut.options) { + def.getHandlers().put("option:" + option, shortcut); + } + } + } + + /** + * Gets the proper object direction. + * @param direction the direction. + * @return the direction. + */ + protected Direction getObjectDirection(Direction direction) { + return direction == Direction.NORTH ? Direction.EAST : direction == Direction.SOUTH ? Direction.WEST : direction == Direction.EAST ? Direction.NORTH : Direction.SOUTH; + } + + + public Location pipeDestination(Player player, GameObject object, int steps) { + player.faceLocation(object.getLocation()); + int diffX = object.getLocation().getX() - player.getLocation().getX(); + if (diffX < -1) { diffX = -1; } + if (diffX > 1) { diffX = 1; } + int diffY = object.getLocation().getY() - player.getLocation().getY(); + if (diffY < -1) { diffY = -1; } + if (diffY > 1) { diffX = 1; } + Location dest = player.getLocation().transform((diffX) * steps, (diffY) * steps, 0); + return dest; + } + + public Location agilityDestination(Player player, GameObject object, int steps) { + player.faceLocation(object.getLocation()); + int diffX = object.getLocation().getX() - player.getLocation().getX(); + int diffY = object.getLocation().getY() - player.getLocation().getY(); + Location dest = player.getLocation().transform((diffX) * steps, (diffY) * steps, 0); + return dest; + } + + + /** + * Gets the level. + * @return the level + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return the experience + */ + public double getExperience() { + return experience; + } + + /** + * Gets the canFail. + * @return the canFail + */ + public boolean isCanFail() { + return canFail; + } + + /** + * Gets the failChance. + * @return the failChance + */ + public double getFailChance() { + return failChance; + } + + /** + * Sets the bafailChance. + * @param failChance the failChance to set. + */ + public void setFailChance(double failChance) { + this.failChance = failChance; + } + + /** + * Gets the ids. + * @return the ids + */ + public int[] getIds() { + return ids; + } + + /** + * Gets the option. + * @return the option + */ + public String[] getOption() { + return options; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/BarbarianOutpostCourse.kt b/Server/src/main/java/Server/core/game/node/entity/skill/agility/BarbarianOutpostCourse.kt new file mode 100644 index 000000000..31814f419 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/BarbarianOutpostCourse.kt @@ -0,0 +1,334 @@ +package core.game.node.entity.skill.agility + +import core.cache.def.impl.ItemDefinition +import core.cache.def.impl.NPCDefinition +import core.cache.def.impl.ObjectDefinition +import core.game.content.global.action.ClimbActionHandler +import core.game.content.global.action.DoorActionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.combat.ImpactHandler.HitsplatType +import core.game.node.entity.player.Player +import core.game.content.quest.miniquest.barcrawl.BarcrawlManager +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.plugin.Initializable +import core.plugin.PluginManager +import core.game.content.dialogue.DialoguePlugin + +/** + * Handles the barbarian outpost course. + * @author Woah + * + */ +@Initializable +class BarbarianOutpostCourse + +/** + * Constructs a new `BarbarianOutpostCourse` `Object`. + * @param player the player. + */ +@JvmOverloads constructor(player: Player? = null) : AgilityCourse(player, 6, 46.2) { + override fun createInstance(player: Player): AgilityCourse { + return BarbarianOutpostCourse(player) + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + val id = node.id + getCourse(player) + when (id) { + 2115, 2116 -> if (!player.barcrawlManager.isFinished || player.barcrawlManager.isStarted) { + player.dialogueInterpreter.open(384) + } else { + DoorActionHandler.handleAutowalkDoor(player, node as GameObject) + } + 2282 -> handleRopeSwing(player, node as GameObject) + 2294 -> handleLogBalance(player, node as GameObject) + 2302 -> handleLedgeBalance(player, node as GameObject) + 20211 -> { + if (player.location.x < node.location.x) { + return true + } + AgilityHandler.climb(player, 2, ClimbActionHandler.CLIMB_UP, player.location.transform(-1, 0, 1), 8.0, "You climb the netting...") + } + 1948 -> { + if (player.location.x > node.location.x) { + player.packetDispatch.sendMessage("You cannot climb from this side.") + } + val flag = if (node.location == Location(2536, 3553, 0)) 4 else if (node.location == Location(2539, 3553, 0)) 5 else 6 + player.packetDispatch.sendMessage("You climb the low wall...") + AgilityHandler.forceWalk(player, flag, node.location.transform(-1, 0, 0), node.location.transform(1, 0, 0), Animation.create(839), 10, 13.5, null) + } + 455 -> player.barcrawlManager.read() + 385 -> { + player.packetDispatch.sendMessage("The scorpion stings you!") + player.impactHandler.manualHit(player, 3, HitsplatType.NORMAL) + } + } + return true + } + + /** + * Handles the rope swing obstacle. + * @param player the player. + * @param object the object. + */ + private fun handleRopeSwing(player: Player, `object`: GameObject) { + if (player.location.y < 3554) { + player.packetDispatch.sendMessage("You cannot do that from here.") + return + } + if (ropeDelay > GameWorld.ticks) { + player.packetDispatch.sendMessage("The rope is being used.") + return + } + if (AgilityHandler.hasFailed(player, 1, 0.1)) { + AgilityHandler.fail(player, 0, Location.create(2549, 9951, 0), null, getHitAmount(player), "You slip and fall to the pit bellow.") + return + } + ropeDelay = GameWorld.ticks + 2 + player.packetDispatch.sendObjectAnimation(`object`, Animation.create(497), true) + AgilityHandler.forceWalk(player, 0, player.location, Location.create(2551, 3549, 0), Animation.create(751), 50, 22.0, "You skillfully swing across.", 1) + } + + /** + * Handles the log balance obstacle. + * @param player the player. + * @param object the object. + */ + private fun handleLogBalance(player: Player, `object`: GameObject) { + val failed = AgilityHandler.hasFailed(player, 1, 0.5) + val end = if (failed) Location.create(2545, 3546, 0) else Location.create(2541, 3546, 0) + player.packetDispatch.sendMessage("You walk carefully across the slippery log...") + AgilityHandler.walk(player, if (failed) -1 else 1, Location.create(2551, 3546, 0), end, Animation.create(155), if (failed) 0.0 else 13.5, if (failed) null else "...You make it safely to the other side.") + if (failed) { + AgilityHandler.walk(player, -1, player.location, Location.create(2545, 3546, 0), Animation.create(155), 0.0, null) + GameWorld.Pulser.submit(getSwimPulse(player)) + return + } + } + + /** + * Gets the pulse used to swim when failing the log balance. + * @param player the player. + * @return `Pulse` the pulse. + */ + private fun getSwimPulse(player: Player): Pulse { + return object : Pulse(1, player) { + var counter = 0 + override fun pulse(): Boolean { + when (++counter) { + 6 -> { + player.animate(Animation.create(771)) + player.packetDispatch.sendMessages("...You loose your footing and fall into the water.", "Something in the water bites you.") + } + 7 -> { + player.graphics(Graphics.create(68)) + player.properties.teleportLocation = Location.create(2545, 3545, 0) + player.impactHandler.manualHit(player, getHitAmount(player), HitsplatType.NORMAL) + AgilityHandler.walk(player, -1, Location.create(2545, 3545, 0), Location.create(2545, 3543, 0), Animation.create(152), 0.0, null) + } + 11 -> { + player.properties.teleportLocation = Location.create(2545, 3542, 0) + return true + } + } + return false + } + } + } + + /** + * Handles the ledge balance obstacle. + * @param player the player. + * @param object the object. + */ + private fun handleLedgeBalance(player: Player, `object`: GameObject) { + val failed = AgilityHandler.hasFailed(player, 1, 0.3) + val end = if (failed) Location.create(2534, 3547, 1) else Location.create(2532, 3547, 1) + AgilityHandler.walk(player, if (failed) -1 else 3, Location.create(2536, 3547, 1), end, Animation.create(157), if (failed) 0.0 else 22.0, if (failed) null else "You skillfully edge across the gap.") + player.packetDispatch.sendMessage("You put your foot on the ledge and try to edge across..") + if (failed) { + AgilityHandler.fail(player, 3, Location.create(2534, 3545, 0), Animation(760), getHitAmount(player), "You slip and fall to the pit bellow.") + return + } + } + + override fun configure() { + ObjectDefinition.forId(2115).handlers["option:open"] = this + ObjectDefinition.forId(2116).handlers["option:open"] = this + ObjectDefinition.forId(2282).handlers["option:swing-on"] = this + ObjectDefinition.forId(2294).handlers["option:walk-across"] = this + ObjectDefinition.forId(20211).handlers["option:climb-over"] = this + ObjectDefinition.forId(2302).handlers["option:walk-across"] = this + ObjectDefinition.forId(1948).handlers["option:climb-over"] = this + ItemDefinition.forId(455).handlers["option:read"] = this + NPCDefinition.forId(385).handlers["option:pick-up"] = this + PluginManager.definePlugin(BarbarianGuardDialogue()) + } + + override fun getDestination(node: Node, n: Node): Location? { + if (n is GameObject) { + when (n.getId()) { + 2282 -> return Location.create(2551, 3554, 0) + } + } + return null + } + + /** + * The barbarian guard dialogue plugin. + * @author Woah + */ + class BarbarianGuardDialogue : DialoguePlugin { + /** + * Constructs a new `BarbarianGuardDialogue` `Object`. + */ + constructor() { + /** + * empty. + */ + } + + /** + * Constructs a new `BarbarianGuardDialogue` `Object`. + * @param player the player. + */ + constructor(player: Player?) : super(player) {} + + override fun newInstance(player: Player): DialoguePlugin { + return BarbarianGuardDialogue(player) + } + + override fun open(vararg args: Any): Boolean { + if (!player.barcrawlManager.isStarted) { + npc("O, waddya want?") + } else if (player.barcrawlManager.isFinished && !player.barcrawlManager.isStarted) { + npc("'Ello friend.") + stage = 50 + } else { + npc("So, how's the Barcrawl coming along?") + stage = 20 + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when (stage) { + 0 -> { + options("I want to come through this gate.", "I want some money.") + stage++ + } + 1 -> when (buttonId) { + 1 -> { + player("I want to come throught his gate.") + stage = 5 + } + 2 -> { + player("I want some money.") + stage = 3 + } + } + 3 -> { + npc("Do I look like a bank to you?") + stage++ + } + 4 -> end() + 5 -> if (player.barcrawlManager.isFinished) { + npc("You may pass if you like. You are a true", "barbarian now.") + stage = 4 + } else { + npc("Barbarians only. Are you a barbarian? You don't look", "like one.") + stage++ + } + 6 -> { + options("Hmm, yep you've got me there.", "Looks can be deceiving, I am in fact a barbarian.") + stage++ + } + 7 -> when (buttonId) { + 1 -> { + player("Hmm, yep you've got me there.") + stage = 4 + } + 2 -> { + player("Looks can be deceiving, I am in fact a barbarian.") + stage++ + } + } + 8 -> { + npc("If you're a barbarian you need to be able to drink like", "one. We barbarians like a good drink.") + stage++ + } + 9 -> { + npc("I have the perfect challenge for you... the Alfred", "Grimhand Barcrawl! First completed by Alfred", "Grimhand.") + stage++ + } + 10 -> { + player.barcrawlManager.reset() + player.barcrawlManager.isStarted = true + player.inventory.add(BarcrawlManager.BARCRAWL_CARD, player) + interpreter.sendDialogue("The guard hands you a Barcrawl card.") + stage++ + } + 11 -> { + npc("Take that card to each of the bards named on it. The", "bartenders will know what it means. We're kinda well", "known.") + stage++ + } + 12 -> { + npc("They'll give you their strongest drink and sign your", "card. When you've done all that, we'll be happy to let", "you in.") + stage++ + } + 13 -> end() + 20 -> if (!player.barcrawlManager.hasCard()) { + player("I've lost my barcrawl card...") + stage = 23 + } else if (player.barcrawlManager.isFinished) { + player("I tink I jusht 'bout done dem all... but I losht count...") + stage = 24 + } else { + player("I haven't finished it yet.") + stage++ + } + 21 -> { + npc("Well come back when you have, you lightweight.") + stage++ + } + 22 -> end() + 23 -> { + npc("What are you like? You're gonna have to start all over", "now.") + stage = 10 + } + 24 -> { + if (!player.inventory.containsItem(BarcrawlManager.BARCRAWL_CARD)) { + end() + } + player.barcrawlManager.isStarted = false + player.bank.remove(BarcrawlManager.BARCRAWL_CARD) + player.inventory.remove(BarcrawlManager.BARCRAWL_CARD) + interpreter.sendDialogue("You give the card to the barbarian.") + stage++ + } + 25 -> { + npc("Yep that seems fine, you can come in now. I never", "learned to read, but you look like you've drunk plenty.") + stage = 22 + } + 50 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(384) + } + } + + companion object { + /** + * The rope delay. + */ + private var ropeDelay = 0 + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/GnomeStrongholdCourse.kt b/Server/src/main/java/Server/core/game/node/entity/skill/agility/GnomeStrongholdCourse.kt new file mode 100644 index 000000000..f36d8a72f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/GnomeStrongholdCourse.kt @@ -0,0 +1,158 @@ +package core.game.node.entity.skill.agility + +import core.cache.def.impl.ObjectDefinition +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.system.task.LocationLogoutTask +import core.game.system.task.LogoutTask +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable + +/** + * Handles the gnome stronghold agility course. + * @author Woah + */ +@Initializable +class GnomeStrongholdCourse +/** + * Constructs a new `GnomeStrongholdCourse` `Object`. + * @param player The player. + */ +/** + * Constructs a new `GnomeStrongholdCourse` `Object`. + */ +@JvmOverloads constructor(player: Player? = null) : AgilityCourse(player, 7, 39.0) { + override fun handle(player: Player, node: Node, option: String): Boolean { + getCourse(player) // Sets the extension. + val `object` = node as GameObject + when (`object`.id) { + 2295 -> { + TRAINERS[0]!!.sendChat("Okay get over that log, quick quick!") + player.packetDispatch.sendMessage("You walk carefully across the slippery log...") + AgilityHandler.walk(player, 0, Location.create(2474, 3436, 0), Location.create(2474, 3429, 0), Animation.create(155), 7.5, "...You make it safely to the other side.") + return true + } + 2285 -> { + TRAINERS[1]!!.sendChat("Move it, move it, move it!") + player.packetDispatch.sendMessage("You climb the netting...") + AgilityHandler.climb(player, 1, Animation.create(828), `object`.location.transform(0, -1, 1), 7.5, null) + return true + } + 35970 -> { + TRAINERS[2]!!.sendChat("That's it - straight up.") + player.packetDispatch.sendMessage("You climb the tree..") + AgilityHandler.climb(player, 2, Animation.create(828), Location.create(2473, 3420, 2), 5.0, "...To the platform above.") + return true + } + 2312 -> { + TRAINERS[3]!!.sendChat("Come on scaredy cat, get across that rope!") + player.packetDispatch.sendMessage("You carefully cross the tightrope.") + AgilityHandler.walk(player, 3, Location.create(2477, 3420, 2), Location.create(2483, 3420, 2), Animation.create(155), 7.5, null) + return true + } + 4059 -> { + player.packetDispatch.sendMessage("You can't do that from here.") + return true + } + 2314, 2315 -> { + player.packetDispatch.sendMessage("You climb down the tree..") + AgilityHandler.climb(player, 4, Animation.create(828), Location.create(2487, 3420, 0), 5.0, "You land on the ground.") + return true + } + 2286 -> { + TRAINERS[4]!!.sendChat("My Granny can move faster than you.") + player.faceLocation(player.location.transform(0, 2, 0)) + player.packetDispatch.sendMessage("You climb the netting...") + AgilityHandler.climb(player, 5, Animation.create(828), player.location.transform(0, 2, 0), 7.5, null) + return true + } + 4058, 154 -> { + val index = if (`object`.id == 154) 0 else 1 //If the player clicks on the left pipe, set index to 0, otherwise 1 + val x = 2484 + index * 3 //change the x coordinates for walking/animations depending on index multiplier + if (`object`.location.y == 3435) { + player.packetDispatch.sendMessage("You can't do that from here.") + return true + } + if (USED_PIPES[index] > GameWorld.ticks) { + player.packetDispatch.sendMessage("The pipe is being used.") + return true + } + USED_PIPES[index] = GameWorld.ticks + 10 + + player.lock() + //Animations and force walking + //X variable is determined by both index and x variables before + AgilityHandler.forceWalk(player, -1, Location.create(x, 3430, 0), Location.create(x, 3433, 0), Animation.create(10580), 10, 0.0, null) + player.lock() + AgilityHandler.forceWalk(player, -1, Location.create(x, 3433, 0), Location.create(x, 3435, 0), Animation.create(844), 10, 0.0, null, 5) + player.lock() + AgilityHandler.forceWalk(player, 6, Location.create(x, 3435, 0), Location.create(x, 3437, 0), Animation.create(10579), 20, 7.5, null, 8) + player.addExtension(LogoutTask::class.java, LocationLogoutTask(12, Location.create(x, 3430, 0))) + return true + } + } + return false + } + + override fun getDestination(node: Node, n: Node): Location? { + val `object` = n as GameObject + when (`object`.id) { + 2295 -> return Location.create(2474, 3436, 0) + 2286 -> { + var x = node.location.x + if (x < n.getLocation().x) { + x = n.getLocation().x + } else if (x > n.getLocation().x + 1) { + x = n.getLocation().x + 1 + } + return Location.create(x, n.getLocation().y - 1, 0) + } + 4058, 154 -> if (n.getLocation().y == 3431) { + return n.getLocation().transform(0, -1, 0) + } + } + return null + } + + override fun configure() { + TRAINERS[0] = NPC.create(162, Location.create(2473, 3438, 0)) + TRAINERS[1] = NPC.create(162, Location.create(2478, 3426, 0)) + TRAINERS[2] = NPC.create(162, Location.create(2474, 3422, 1)) + TRAINERS[3] = NPC.create(162, Location.create(2472, 3419, 2)) + TRAINERS[4] = NPC.create(162, Location.create(2489, 3425, 0)) + for (npc in TRAINERS) { + npc!!.init() + npc.walkRadius = 3 + } + ObjectDefinition.forId(2295).handlers["option:walk-across"] = this + ObjectDefinition.forId(2285).handlers["option:climb-over"] = this + ObjectDefinition.forId(35970).handlers["option:climb"] = this + ObjectDefinition.forId(2312).handlers["option:walk-on"] = this + ObjectDefinition.forId(4059).handlers["option:walk-on"] = this + ObjectDefinition.forId(2314).handlers["option:climb-down"] = this + ObjectDefinition.forId(2315).handlers["option:climb-down"] = this + ObjectDefinition.forId(2286).handlers["option:climb-over"] = this + ObjectDefinition.forId(4058).handlers["option:squeeze-through"] = this + ObjectDefinition.forId(154).handlers["option:squeeze-through"] = this + } + + override fun createInstance(player: Player): AgilityCourse { + return GnomeStrongholdCourse(player) + } + + companion object { + /** + * The pipes currently in usage. + */ + private val USED_PIPES = IntArray(2) + + /** + * The trainer NPCs. + */ + private val TRAINERS = arrayOfNulls(5) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/WildernessCourse.kt b/Server/src/main/java/Server/core/game/node/entity/skill/agility/WildernessCourse.kt new file mode 100644 index 000000000..b6b8e961f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/WildernessCourse.kt @@ -0,0 +1,268 @@ +package core.game.node.entity.skill.agility + +import core.cache.def.impl.ObjectDefinition +import core.game.content.global.action.DoorActionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.TeleportManager +import core.game.system.task.LocationLogoutTask +import core.game.system.task.LogoutTask +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.game.node.entity.skill.Skills + +/** + * Handles the wilderness agility course. + * @author Woah + */ +@Initializable +class WildernessCourse + +/** + * Constructs a new `WildernessCourse` `Object`. + */ +@JvmOverloads constructor(player: Player? = null) : AgilityCourse(player, 5, 499.0) { + override fun handle(player: Player, node: Node, option: String): Boolean { + getCourse(player) // Sets the extension. + val `object` = node as GameObject + when (`object`.id) { + 2309 -> handleEntrance(player, `object`) + 2307, 2308 -> { + DoorActionHandler.handleAutowalkDoor(player, `object`) + handleEntranceObstacle(player, `object`) + } + 2288 -> handlePipe(player, `object`) + 2283 -> handleRopeSwing(player, `object`) + 37704 -> handleSteppingStones(player, `object`) + 2297 -> handleLogBalance(player, `object`) + 2328 -> handleRockClimb(player, `object`) + } + return true + } + + /** + * Handles the door entrance. + * @param player the player. + * @param object the object. + */ + private fun handleEntrance(player: Player, `object`: GameObject) { + if (player.location.y > 3916 || player.skills.getLevel(Skills.AGILITY) >= 52) { + DoorActionHandler.handleAutowalkDoor(player, `object`) + if (player.location.y <= 3916) { + handleEntranceObstacle(player, `object`) + } + } else { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least 52 to enter.") + } + } + + /** + * Handles the entrance obstacle. + * @param player the player. + * @param object the object. + */ + private fun handleEntranceObstacle(player: Player, `object`: GameObject) { + GameWorld.Pulser.submit(object : Pulse(1, player) { + var counter = 0 + val fail = AgilityHandler.hasFailed(player, 1, 0.3) + override fun pulse(): Boolean { + when (++counter) { + 2 -> { + val end = if (fail) Location.create(2998, 3924, 0) else if (`object`.id < 2309) Location.create(2998, 3917, 0) else Location.create(2998, 3930, 0) + val start = if (`object`.id < 2309) player.location else Location.create(2998, 3917, 0) + player.packetDispatch.sendMessage("You go through the gate and try to edge over the ridge...") + AgilityHandler.walk(player, -1, start, end, Animation.create(155), if (fail) 0.0 else 15.00, if (fail) "You loose your footing and fail into the wolf pit." else "You skillfully balance across the ridge...") + } + 9 -> { + if (fail) { + AgilityHandler.fail(player, 0, player.location.transform(if (`object`.id < 2309) -2 else 2, 0, 0), Animation.create(if (`object`.id < 2309) 771 else 771), getHitAmount(player), null) + } + return fail + } + 15 -> player.lock(3) + 16 -> { + val doorLoc = if (`object`.id < 2309) Location(2998, 3917, 0) else Location(2998, 3931, 0) + DoorActionHandler.handleAutowalkDoor(player, RegionManager.getObject(doorLoc)) + return true + } + } + return false + } + }) + } + + /** + * Handles the pipe obstacle. + * @param player the pipe. + * @param object the object. + */ + private fun handlePipe(player: Player, `object`: GameObject) { + if (`object`.location.y == 3948) { + player.packetDispatch.sendMessage("You can't do that from here.") + return + } + if (player.skills.getLevel(Skills.AGILITY) < 49) { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least 49 to do this.") + return + } + player.lock(10) + GameWorld.Pulser.submit(object : Pulse(1, player) { + var counter = 0 + override fun pulse(): Boolean { + val x = 3004 + when (counter++) { + 0 -> { + AgilityHandler.forceWalk(player, -1, Location.create(x, 3937, 0), Location.create(x, 3940, 0), Animation.create(10580), 15, 0.0, null, 1) //10 + println("1") + player.teleporter.send(Location.create(3004, 3947, 0), TeleportManager.TeleportType.INSTANT, TeleportManager.WILDY_TELEPORT) + println("tele") + counter++ + AgilityHandler.forceWalk(player, 0, Location.create(x, 3948, 0), Location.create(x, 3950, 0), Animation.create(10579), 20, 12.5, null, 5) //20 + println("3") + return true + } + 2 -> { + player.teleporter.send(Location.create(3004, 3947, 0), TeleportManager.TeleportType.INSTANT, TeleportManager.WILDY_TELEPORT) + println("tele") + counter++ + AgilityHandler.forceWalk(player, 0, Location.create(x, 3948, 0), Location.create(x, 3950, 0), Animation.create(10579), 20, 12.5, null, 5) + println("3") + return true + } + 3 -> { + AgilityHandler.forceWalk(player, 0, Location.create(x, 3948, 0), Location.create(x, 3950, 0), Animation.create(10579), 20, 12.5, null, 5) + println("3") + return true + } + } + return true + } + }) + } + + /** + * Handles the rope swing obstacle. + * @param player the player. + * @param object the object. + */ + private fun handleRopeSwing(player: Player, `object`: GameObject) { + if (player.location.y < 3554) { + player.packetDispatch.sendMessage("You cannot do that from here.") + return + } + if (ropeDelay > GameWorld.ticks) { + player.packetDispatch.sendMessage("The rope is being used.") + return + } + if (AgilityHandler.hasFailed(player, 1, 0.1)) { + AgilityHandler.fail(player, 0, Location.create(3005, 10357, 0), null, getHitAmount(player), "You slip and fall to the pit bellow.") + return + } + ropeDelay = GameWorld.ticks + 2 + player.packetDispatch.sendObjectAnimation(`object`, Animation.create(497), true) + AgilityHandler.forceWalk(player, 1, player.location, Location.create(3005, 3958, 0), Animation.create(751), 50, 20.0, "You skillfully swing across.", 1) + } + + /** + * Handles the stepping stone obstacle. + * @param player the player. + * @param object the object. + */ + private fun handleSteppingStones(player: Player, `object`: GameObject) { + player.locks.lock() + val fail = AgilityHandler.hasFailed(player, 1, 0.3) + player.addExtension(LogoutTask::class.java, LocationLogoutTask(12, player.location)) + GameWorld.Pulser.submit(object : Pulse(2, player) { + var counter = 0 + override fun pulse(): Boolean { + if (counter == 3 && fail) { + AgilityHandler.fail(player, -1, Location.create(3001, 3963, 0), Animation.create(771), (player.skills.lifepoints * 0.26).toInt(), "...You lose your footing and fall into the lava.") + return true + } + AgilityHandler.forceWalk(player, if (counter == 5) 2 else -1, player.location, player.location.transform(-1, 0, 0), Animation.create(741), 10, if (counter == 5) 20.0 else 0.toDouble(), if (counter != 0) null else "You carefully start crossing the stepping stones...") + if(++counter == 6){ + player.unlock() + } + return counter == 6 + } + + override fun stop() { + super.stop() + } + }) + } + + /** + * Handles the log balance obstacle. + * @param player the player. + * @param object the object. + */ + private fun handleLogBalance(player: Player, `object`: GameObject) { + val failed = AgilityHandler.hasFailed(player, 1, 0.5) + val end = if (failed) Location.create(2998, 3945, 0) else Location.create(2994, 3945, 0) + player.packetDispatch.sendMessage("You walk carefully across the slippery log...") + AgilityHandler.walk(player, if (failed) -1 else 3, player.location, end, Animation.create(155), if (failed) 0.0 else 20.0, if (failed) null else "You skillfully edge across the gap.") + if (failed) { + GameWorld.Pulser.submit(object : Pulse(5, player) { + override fun pulse(): Boolean { + player.faceLocation(Location.create(2998, 3944, 0)) + AgilityHandler.fail(player, 3, Location.create(2998, 10345, 0), Animation.create(770), getHitAmount(player), "You slip and fall onto the spikes below.") + return true + } + }) + return + } + } + + /** + * Handles the rock climbing obstacle. + * @param player the player. + * @param object the object. + */ + private fun handleRockClimb(player: Player, `object`: GameObject) { + AgilityHandler.forceWalk(player, 4, Location.create(2994, 3937, 0), Location.create(2994, 3933, 0), Animation.create(740), 8, 0.0, "You reach the top.") + GameWorld.Pulser.submit(object : Pulse(4, player) { + override fun pulse(): Boolean { + player.animator.reset() + return true + } + }) + } + + override fun getDestination(node: Node, n: Node): Location? { + when (n.id) { + 2283 -> return Location.create(3005, 3953, 0) + 37704 -> return Location.create(3002, 3960, 0) + 2297 -> return Location.create(3002, 3945, 0) + 2328 -> return n.location.transform(0, 1, 0) + } + return null + } + + override fun configure() { + ObjectDefinition.forId(2309).handlers["option:open"] = this + ObjectDefinition.forId(2308).handlers["option:open"] = this + ObjectDefinition.forId(2307).handlers["option:open"] = this + ObjectDefinition.forId(2288).handlers["option:squeeze-through"] = this + ObjectDefinition.forId(2283).handlers["option:swing-on"] = this + ObjectDefinition.forId(37704).handlers["option:cross"] = this + ObjectDefinition.forId(2297).handlers["option:walk-across"] = this + ObjectDefinition.forId(2328).handlers["option:climb"] = this + } + + override fun createInstance(player: Player): AgilityCourse { + return WildernessCourse(player) + } + + companion object { + /** + * The rope delay. + */ + private var ropeDelay = 0 + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/BladeTrap.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/BladeTrap.java new file mode 100644 index 000000000..45ad3a2dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/BladeTrap.java @@ -0,0 +1,50 @@ +package core.game.node.entity.skill.agility.brimhaven; + +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.MovementHook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the blade trap. + * @author Emperor + */ +public final class BladeTrap implements MovementHook { + + @Override + public boolean handle(Entity e, final Location l) { + if (BrimhavenArena.sawBladeActive) { + final Direction dir = e.getDirection(); + final Player player = (Player) e; + final Location start = l.transform(-dir.getStepX(), -dir.getStepY(), 0); + e.lock(5); + e.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + GameWorld.getPulser().submit(new Pulse(2, e) { + @Override + public boolean pulse() { + Direction direction = dir; + Direction d = Direction.get(direction.toInteger() + 2 & 3); + if (RegionManager.getObject(player.getLocation().transform(dir)) != null) { + Direction s = d; + d = direction; + direction = s; + } + Location loc = player.getLocation(); + AgilityHandler.failWalk(player, 1, loc, loc.transform(direction), loc.transform(direction), Animation.create(846), 10, 3, "You were hit by the saw blade!").setDirection(d); + return true; + } + }); + return false; + } + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena.java new file mode 100644 index 000000000..753692520 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/BrimhavenArena.java @@ -0,0 +1,333 @@ +package core.game.node.entity.skill.agility.brimhaven; + +import core.game.component.Component; +import core.game.content.global.action.ClimbActionHandler; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.MovementHook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.*; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +import java.util.HashMap; +import java.util.Map; + +/** + * Handles the Brimhaven agility arena zone. + * + * @author Emperor + */ +@Initializable +public final class BrimhavenArena extends MapZone implements Plugin { + + /** + * The location based traps. + */ + private static final Map LOCATION_TRAPS = new HashMap<>(); + + /** + * The overlay component. + */ + private static final Component OVERLAY = new Component(5); + + /** + * The ticket dispenser locations. + */ + private static final Location[] DISPENSERS = new Location[24]; + + /** + * The agility ticket reward item. + */ + private static final Item TICKET = new Item(2996); + + /** + * If the saw blade is currently active. + */ + public static boolean sawBladeActive; + + /** + * Constructs a new {@code BrimhavenArena} {@code Object}. + */ + public BrimhavenArena() { + super("Brimhaven agility arena", true); + } + + /** + * Sets the current ticket dispenser target. + * + * @param player The player. + */ + private void setDispenser(Player player) { + if (!player.getAttribute("brim-tagged", false)) { + player.setAttribute("brim-tagcount", 0); + } + player.setAttribute("brim-tagged", false); + player.getConfigManager().set(309, 0); + int index = RandomFunction.randomize(DISPENSERS.length); + if (index == player.getAttribute("brim-tag", -1)) { + index = (index + 1) % DISPENSERS.length; + } + int iconSlot = player.getAttribute("brim-icon", -1); + if (iconSlot > -1) { + HintIconManager.removeHintIcon(player, iconSlot); + } + player.setAttribute("brim-tag", index); + player.setAttribute("brim-icon", HintIconManager.registerHeightHintIcon(player, DISPENSERS[index], 50)); + } + + @Override + public boolean enter(Entity entity) { + if (entity instanceof Player) { + Player player = (Player) entity; + player.getInterfaceManager().openOverlay(OVERLAY); + setDispenser(player); + } + return super.enter(entity); + } + + @Override + public boolean leave(Entity entity, boolean logout) { + if (entity instanceof Player && !logout) { + Player player = (Player) entity; + player.getInterfaceManager().closeOverlay(); + player.removeAttribute("brim-tag"); + player.removeAttribute("brim-tagcount"); + int iconSlot = player.getAttribute("brim-icon", -1); + if (iconSlot > -1) { + HintIconManager.removeHintIcon(player, iconSlot); + player.removeAttribute("brim-icon"); + } + } + return super.enter(entity); + } + + @Override + public boolean interact(Entity entity, Node node, Option option) { + if (node instanceof GameObject) { + GameObject object = (GameObject) node; + if (object.getId() == 3610) { + ClimbActionHandler.climb((Player) entity, Animation.create(828), object.getLocation().transform(0, 0, 3)); + return true; + } + if (object.getId() == 3608 || object.getId() == 3581) { + Player player = (Player) entity; + if (!object.getLocation().equals(DISPENSERS[player.getAttribute("brim-tag", 0)])) { + player.getPacketDispatch().sendMessage("Tag the pillar indicated by the yellow arrow to get an Agility ticket."); + return true; + } + if (player.getAttribute("brim-tagged", false)) { + player.getPacketDispatch().sendMessage("You have already tagged this pillar."); + return true; + } + player.setAttribute("brim-tagged", true); + int tags = player.getAttribute("brim-tagcount", 0) + 1; + player.setAttribute("brim-tagcount", tags); + player.getConfigManager().set(309, 4); + if (tags > 1) { + int amount = 1; + if (!player.getInventory().add(new Item(TICKET.getId(), amount))) { + GroundItemManager.create(new GroundItem(new Item(TICKET.getId(), amount), player.getLocation(), player)); + } + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 0); + player.getDialogueInterpreter().sendItemMessage(TICKET.getId(), "You have received an Agility Arena Ticket!"); + player.getPacketDispatch().sendMessage("You have received an Agility Arena Ticket!"); + return true; + } + player.getPacketDispatch().sendMessage("You get tickets by tagging more than one pillar in a row, tag the next pillar!"); + player.getDialogueInterpreter().sendDialogue("You get tickets by tagging more than one pillar in a row. Tag the", "next pillar for a ticket!"); + return true; + } + } + return false; + } + + @Override + public boolean move(Entity e, Location loc, Location dest) { + if (!e.getLocks().isMovementLocked() && e instanceof Player) { + MovementHook hook = LOCATION_TRAPS.get(loc); + if (hook != null) { + e.setDirection(Direction.getLogicalDirection(loc, dest)); + return hook.handle(e, loc); + } + } + return super.move(e, loc, dest); + } + + @Override + public void locationUpdate(Entity e, Location last) { + if (!e.getLocks().isMovementLocked() && e instanceof Player) { + MovementHook hook = LOCATION_TRAPS.get(e.getLocation()); + if (hook != null) { + if (!hook.handle(e, e.getLocation())) { + if (e.getPulseManager().isMovingPulse()) { + e.getPulseManager().clear(); + } + e.getWalkingQueue().reset(); + } + } + } + } + + @Override + public void configure() { + registerRegion(11157); + PressurePad pad = new PressurePad(); + LOCATION_TRAPS.put(Location.create(2800, 9579, 3), pad); + LOCATION_TRAPS.put(Location.create(2799, 9579, 3), pad); + LOCATION_TRAPS.put(Location.create(2800, 9557, 3), pad); + LOCATION_TRAPS.put(Location.create(2799, 9557, 3), pad); + LOCATION_TRAPS.put(Location.create(2772, 9585, 3), pad); + LOCATION_TRAPS.put(Location.create(2772, 9584, 3), pad); + FloorSpikes spikes = new FloorSpikes(); + LOCATION_TRAPS.put(Location.create(2800, 9568, 3), spikes); + LOCATION_TRAPS.put(Location.create(2799, 9568, 3), spikes); + LOCATION_TRAPS.put(Location.create(2772, 9552, 3), spikes); + LOCATION_TRAPS.put(Location.create(2772, 9551, 3), spikes); + LOCATION_TRAPS.put(Location.create(2761, 9573, 3), spikes); + LOCATION_TRAPS.put(Location.create(2761, 9574, 3), spikes); + DartTrap dart = new DartTrap(); + LOCATION_TRAPS.put(Location.create(2788, 9557, 3), dart); + LOCATION_TRAPS.put(Location.create(2789, 9557, 3), dart); + LOCATION_TRAPS.put(Location.create(2794, 9573, 3), dart); + LOCATION_TRAPS.put(Location.create(2794, 9574, 3), dart); + LOCATION_TRAPS.put(Location.create(2777, 9568, 3), dart); + LOCATION_TRAPS.put(Location.create(2778, 9568, 3), dart); + SpinningBlades blade = new SpinningBlades(); + LOCATION_TRAPS.put(Location.create(2778, 9579, 3), blade); + LOCATION_TRAPS.put(Location.create(2783, 9574, 3), blade); + LOCATION_TRAPS.put(Location.create(2778, 9557, 3), blade); + BladeTrap trap = new BladeTrap(); + LOCATION_TRAPS.put(Location.create(2788, 9579, 3), trap); + LOCATION_TRAPS.put(Location.create(2789, 9579, 3), trap); + LOCATION_TRAPS.put(Location.create(2783, 9551, 3), trap); + LOCATION_TRAPS.put(Location.create(2783, 9552, 3), trap); + LOCATION_TRAPS.put(Location.create(2761, 9584, 3), trap); + LOCATION_TRAPS.put(Location.create(2761, 9585, 3), trap); + int index = 0; + for (int x = 2761; x < 2815; x += 11) { + for (int y = 9546; y < 9600; y += 11) { + if (x == 2805 && y == 9590) { + continue; + } + DISPENSERS[index++] = Location.create(x, y, 3); + } + } + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + Region r = RegionManager.forId(11157); + if (!r.isActive()) { + return false; + } + if (GameWorld.getTicks() % 100 == 0) { + for (RegionPlane plane : r.getPlanes()) { + for (Player player : plane.getPlayers()) { + setDispenser(player); + } + } + handlePlankSwitching(); + } + int ticks = 3; + if (GameWorld.getTicks() % ticks == 0) { + sawBladeActive = !sawBladeActive; + if (sawBladeActive) { + GameObject object = RegionManager.getObject(3, 2788, 9579); + ObjectBuilder.replace(object, object.transform(3567, object.getRotation(), 10), ticks); + object = RegionManager.getObject(3, 2789, 9579); + ObjectBuilder.replace(object, object.transform(0), ticks); + + object = RegionManager.getObject(3, 2783, 9551); + ObjectBuilder.replace(object, object.transform(3567, object.getRotation(), 10), ticks); + object = RegionManager.getObject(3, 2783, 9552); + ObjectBuilder.replace(object, object.transform(0), ticks); + + object = RegionManager.getObject(3, 2761, 9584); + ObjectBuilder.replace(object, object.transform(3567, object.getRotation(), 10), ticks); + object = RegionManager.getObject(3, 2761, 9585); + ObjectBuilder.replace(object, object.transform(0), ticks); + } + } + return false; + } + }); + } + + /** + * Switches the plank states. + */ + private static void handlePlankSwitching() { + boolean[] available = new boolean[3]; + for (int i = 0; i < 1 + RandomFunction.randomize(2); i++) { + available[RandomFunction.randomize(3)] = true; + } + for (int i = 0; i < 3; i++) { + boolean avail = available[i]; + for (PlankSet set : PlankSet.values()) { + Location l = set.entrance[i]; + for (int x = 1; x < set.exit[i].getX() - l.getX(); x++) { + GameObject object = RegionManager.getObject(l.transform(x, 0, 0)); + ObjectBuilder.replace(object, object.transform(avail ? 3573 : 3576)); + } + RegionManager.getObject(set.entrance[i]).setCharge(avail ? 1000 : 500); + RegionManager.getObject(set.exit[i]).setCharge(avail ? 1000 : 500); + } + } + } + + /** + * The plank obstacles. + * + * @author Emperor + */ + private static enum PlankSet { + FIRST(new Location[]{Location.create(2797, 9591, 3), Location.create(2797, 9590, 3), Location.create(2797, 9589, 3)}, new Location[]{Location.create(2802, 9591, 3), Location.create(2802, 9590, 3), Location.create(2802, 9589, 3)}), SECOND(new Location[]{Location.create(2764, 9558, 3), Location.create(2764, 9557, 3), Location.create(2764, 9556, 3)}, new Location[]{Location.create(2769, 9558, 3), Location.create(2769, 9557, 3), Location.create(2769, 9556, 3)}); + + /** + * Constructs a new {@code PlankSet} {@code Object}. + * + * @param entrance The entrance locations for each plank. + * @param exit The exit locations for each plank. + */ + private PlankSet(Location[] entrance, Location[] exit) { + this.entrance = entrance; + this.exit = exit; + } + + /** + * The entrance location of the plank. + */ + Location[] entrance; + + /** + * The exit location of the plank. + */ + Location[] exit; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.java new file mode 100644 index 000000000..be0a0a9f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/BrimhavenCourse.java @@ -0,0 +1,408 @@ +package core.game.node.entity.skill.agility.brimhaven; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * The brimhaven course handling plugin. + * @author Emperor + */ +@Initializable +public final class BrimhavenCourse extends OptionHandler { + + @Override + public boolean handle(final Player player, Node node, String option) { + final GameObject object = (GameObject) node; + Direction dir = object.getDirection(); + Location start = player.getLocation(); + switch (object.getId()) { + case 3566: + // Rope swing + start = object.getLocation().transform(dir.getStepX() << 1, dir.getStepY() << 1, 0); + Location end = object.getLocation().transform(-dir.getStepX() * 3, -dir.getStepY() * 3, 0); + if (AgilityHandler.hasFailed(player, 1, 0.1)) { + AgilityHandler.failWalk(player, 2, start, start.transform(-dir.getStepX(), -dir.getStepY(), 0), player.getLocation().transform(0, 0, -3), Animation.create(1105), 26, getHitAmount(player), "You missed the rope!").setEndAnimation(Animation.RESET); + return true; + } + AgilityHandler.forceWalk(player, -1, start, end, Animation.create(751), 25, getExp(player, 20.0), null); + GameWorld.getPulser().submit(new Pulse(1, player) { + boolean finish; + + @Override + public boolean pulse() { + if (!finish) { + player.getPacketDispatch().sendObjectAnimation(object, Animation.create(1052)); + finish = true; + return false; + } + player.getPacketDispatch().sendObjectAnimation(object, Animation.create(-1)); + return true; + } + }); + return true; + case 3578: + // Pillars + handlePillarObstacle(player, object); + return true; + case 3565: + // Low wall + dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + start = player.getLocation(); + if (AgilityHandler.hasFailed(player, 1, 0.05)) { + end = start.transform(dir); + AgilityHandler.failWalk(player, 2, start, end, end, Animation.create(1106), 15, getHitAmount(player), "You lost your balance!"); + AgilityHandler.forceWalk(player, -1, end, player.getLocation(), ForceMovement.WALK_ANIMATION, 10, 0.0, null, 4); + return true; + } + AgilityHandler.forceWalk(player, -1, start, start.transform(dir.getStepX() * 3, dir.getStepY() * 3, 0), Animation.create(1252), 6, getExp(player, 8.0), null); + return true; + case 3553: + case 3557: + handleLogBalance(player, object); + return true; + case 3570: + case 3571: + case 3572: + handlePlankObstacle(player, object); + return true; + case 3559: + case 3561: + handleBalancingLedge(player, object); + return true; + case 3564: + handleMonkeyBars(player, object); + return true; + case 3551: + handleBalancingRope(player, object); + return true; + case 3583: + handleHandHolds(player, object); + return true; + } + return false; + } + + /** + * Handles the hand holds obstacle. + * @param player The player. + * @param object The object. + */ + private static void handleHandHolds(final Player player, final GameObject object) { + if (player.getSkills().getLevel(Skills.AGILITY) < 20) { + player.getPacketDispatch().sendMessage("You need an agility of at least 20 to get past this obstacle!"); + return; + } + int mod = 0; + Direction direction = object.getDirection(); + int x = object.getLocation().getX(); + int y = object.getLocation().getY(); + if ((x == 2785 && y == 9544) || (x == 2759 && y == 9566) || (x == 2792 && y == 9592)) { + mod = 4; + direction = Direction.get(direction.toInteger() + 2 & 3); + } + final int m = mod; + player.lock(5); + final Direction dir = direction; + final Direction faceDirection = Direction.get(object.getDirection().toInteger() - 1 & 3); + final Location start = player.getLocation(); + player.getAppearance().setAnimations(Animation.create(1118 + m)); + player.getAppearance().sync(); + AgilityHandler.climb(player, -1, new Animation(1117 + m), start.transform(dir), 0.0, null); + player.addExtension(LogoutTask.class, new LocationLogoutTask(22, start)); + GameWorld.getPulser().submit(new Pulse(3, player) { + Location last = start.transform(dir); + int count; + + @Override + public boolean pulse() { + if (++count == 1) { + if (AgilityHandler.hasFailed(player, 1, 0.15)) { + player.getAppearance().setAnimations(); + player.getAppearance().sync(); + LogoutTask task = player.getExtension(LogoutTask.class); + task.setDelay(2); + AgilityHandler.fail(player, 2, last.transform(0, 0, -3), Animation.create(1119 + m), getHitAmount(player), "You missed a hand hold!"); + return true; + } + } else if (count == 6) { + player.getAppearance().setAnimations(); + player.getAppearance().sync(); + AgilityHandler.forceWalk(player, -1, last, last.transform(dir), Animation.create(1120 + m), 5, getExp(player, 22.0), null).setDirection(faceDirection); + return true; + } + AgilityHandler.forceWalk(player, -1, last, last = last.transform(dir), Animation.create(1118 + m), 5, 0.0, null).setDirection(faceDirection); + return false; + } + }); + } + + /** + * Handles the balancing rope obstacle. + * @param player The player. + * @param object The balancing rope object. + */ + private static void handleBalancingRope(final Player player, GameObject object) { + final Direction dir = object.getDirection(); + boolean failed = AgilityHandler.hasFailed(player, 1, 0.1); + if (failed) { + Location end = player.getLocation().transform(dir); + AgilityHandler.forceWalk(player, -1, player.getLocation(), end, Animation.create(762), 10, 0.0, null); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + Direction d = Direction.get((dir.toInteger() + 3) % 4); + AgilityHandler.fail(player, 2, player.getLocation().transform(d.getStepX() << 1, d.getStepY() << 1, -3), Animation.create(764), getHitAmount(player), "You lost your balance!"); + return true; + } + }); + return; + } + AgilityHandler.walk(player, -1, player.getLocation(), player.getLocation().transform(dir.getStepX() * 7, dir.getStepY() * 7, 0), Animation.create(155), getExp(player, 10.0), null); + } + + /** + * Handles the monkey bars obstacle. + * @param player The player. + * @param object The object. + */ + private static void handleMonkeyBars(final Player player, GameObject object) { + player.lock(5); + final Direction dir = Direction.get((object.getDirection().toInteger() + 2) % 4); + player.getAppearance().setAnimations(Animation.create(745)); + final Location start = player.getLocation(); + ForceMovement.run(player, start.transform(dir), start.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(742), Animation.create(744)); + player.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + GameWorld.getPulser().submit(new Pulse(2, player) { + boolean failed; + int count; + + @Override + public boolean pulse() { + if (++count == 1) { + if (failed = AgilityHandler.hasFailed(player, 1, 0.15)) { + setDelay(1); + player.animate(Animation.create(743)); + return false; + } + setDelay(7); + AgilityHandler.walk(player, -1, player.getLocation().transform(dir), player.getLocation().transform(dir.getStepX() * 7, dir.getStepY() * 7, 0), Animation.create(662), 0.0, null); + player.addExtension(LogoutTask.class, new LocationLogoutTask(9, start)); + } else if (count == 2) { + if (failed) { + player.getAppearance().setAnimations(); + player.getAppearance().sync(); + AgilityHandler.fail(player, 2, player.getLocation().transform(0, 0, -3), Animation.create(768), getHitAmount(player), "You missed a hand hold!"); + return true; + } + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(dir), Animation.create(743), 10, getExp(player, 14.0), null); + return true; + } + return false; + } + }); + } + + /** + * Handles the balancing ledge obstacle. + * @param player The player. + * @param object The object. + */ + private static void handleBalancingLedge(final Player player, GameObject object) { + final int diff = object.getId() == 3561 ? 0 : 1; + Location start = player.getLocation(); + final Direction dir = Direction.getLogicalDirection(start, object.getLocation()); + Location end = object.getLocation(); + double xp = 0.0; + if (AgilityHandler.hasFailed(player, 1, 0.15)) { + player.lock(3); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + Direction d = Direction.get((dir.toInteger() + 1) % 4); + AgilityHandler.fail(player, 1, player.getLocation().transform(d.getStepX(), d.getStepY(), -3), Animation.create(761 - diff), getHitAmount(player), "You lost your balance!"); + return true; + } + }); + } else { + xp = 16.0; + end = object.getLocation().transform(dir.getStepX() * 6, dir.getStepY() * 6, 0); + } + AgilityHandler.walk(player, -1, player.getLocation(), end, Animation.create(157 - diff), getExp(player, xp), null); + } + + /** + * Handles the plank obstacle. + * @param player The player. + * @param object The object. + */ + private static void handlePlankObstacle(final Player player, GameObject object) { + final Direction dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + final Location start = player.getLocation(); + Location end = start.transform(dir.getStepX() * 7, dir.getStepY() * 7, 0); + player.faceLocation(end); + if (object.getCharge() == 500) { // Plank is broken + player.lock(7); + AgilityHandler.walk(player, -1, start, start.transform(dir.getStepX() * 2, dir.getStepY() * 2, 0), new Animation(1426), 0.0, null); + GameWorld.getPulser().submit(new Pulse(3) { + boolean finish; + + @Override + public boolean pulse() { + if (!finish) { + setDelay(2); + AgilityHandler.fail(player, 1, player.getLocation().transform(0, 0, -3), Animation.create(189), getHitAmount(player), "You stepped on a broken piece of plank!"); + finish = true; + return false; + } + AgilityHandler.walk(player, -1, player.getLocation(), start.transform(dir), null, 0.0, null); + return true; + } + }); + player.addExtension(LogoutTask.class, new LocationLogoutTask(8, start)); + return; + } + AgilityHandler.walk(player, -1, start, end, ForceMovement.WALK_ANIMATION, getExp(player, 6.0), null); + } + + /** + * Handles the pillars obstacle. + * @param player The player. + * @param object The object. + */ + private static void handlePillarObstacle(final Player player, GameObject object) { + final Direction dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + AgilityHandler.forceWalk(player, -1, player.getLocation(), object.getLocation(), Animation.create(741), 10, 0, null); + final Location start = player.getLocation(); + player.addExtension(LogoutTask.class, new LocationLogoutTask(12, start)); + player.lock(12); + GameWorld.getPulser().submit(new Pulse(2, player) { + int count = 0; + + @Override + public boolean pulse() { + if (count == 0 && AgilityHandler.hasFailed(player, 1, 0.15)) { + Direction d = Direction.get((dir.toInteger() + 3) % 4); + player.unlock(); + player.lock(2); + AgilityHandler.fail(player, 2, player.getLocation().transform(d.getStepX() << 1, d.getStepY() << 1, -3), Animation.create(764), getHitAmount(player), "You lost your balance!"); + return true; + } + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(dir), Animation.create(741), 10, count == 5 ? getExp(player, 18.0) : 0, null); + return ++count == 6; + } + }); + } + + /** + * Handles the log balance obstacle. + * @param player The player. + * @param object The log balance object. + */ + private static void handleLogBalance(final Player player, GameObject object) { + final Direction dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + boolean failed = AgilityHandler.hasFailed(player, 1, 0.1); + if (failed) { + Location end = player.getLocation().transform(dir); + AgilityHandler.forceWalk(player, -1, player.getLocation(), end, Animation.create(762), 10, 0.0, null); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + Direction d = Direction.get((dir.toInteger() + 3) % 4); + AgilityHandler.fail(player, 2, player.getLocation().transform(d.getStepX() << 1, d.getStepY() << 1, -3), Animation.create(764), getHitAmount(player), "You lost your balance!"); + return true; + } + }); + return; + } + AgilityHandler.walk(player, -1, player.getLocation(), player.getLocation().transform(dir.getStepX() * 7, dir.getStepY() * 7, 0), Animation.create(155), getExp(player, 12.0), null); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(3566).getHandlers().put("option:swing-on", this); + ObjectDefinition.forId(3578).getHandlers().put("option:jump-on", this); + ObjectDefinition.forId(3565).getHandlers().put("option:climb-over", this); + ObjectDefinition.forId(3553).getHandlers().put("option:walk-on", this); + ObjectDefinition.forId(3557).getHandlers().put("option:walk-on", this); + ObjectDefinition.forId(3570).getHandlers().put("option:walk-on", this); + ObjectDefinition.forId(3571).getHandlers().put("option:walk-on", this); + ObjectDefinition.forId(3572).getHandlers().put("option:walk-on", this); + ObjectDefinition.forId(3559).getHandlers().put("option:walk-across", this); + ObjectDefinition.forId(3561).getHandlers().put("option:walk-across", this); + ObjectDefinition.forId(3564).getHandlers().put("option:swing-across", this); + ObjectDefinition.forId(3551).getHandlers().put("option:walk-on", this); + ObjectDefinition.forId(3583).getHandlers().put("option:climb-across", this); + return this; + } + + @Override + public Location getDestination(Node node, Node n) { + GameObject object = (GameObject) n; + Direction dir = object.getDirection(); + switch (object.getId()) { + case 3566: + return n.getLocation().transform(dir.getStepX() << 1, dir.getStepY() << 1, 0); + case 3564: + if (n.getLocation().getX() == 2771 && n.getLocation().getY() == 9570) { + return Location.create(2772, 9569, 3); + } + if (n.getLocation().getX() == 2771 && n.getLocation().getY() == 9577) { + return Location.create(2772, 9578, 3); + } + if (n.getLocation().getX() == 2793 && n.getLocation().getY() == 9566) { + return Location.create(2794, 9567, 3); + } + if (n.getLocation().getX() == 2793 && n.getLocation().getY() == 9559) { + return Location.create(2794, 9558, 3); + } + if (n.getLocation().getX() == 2781 && n.getLocation().getY() == 9545) { + return Location.create(2782, 9546, 3); + } + if (n.getLocation().getX() == 2774 && n.getLocation().getY() == 9545) { + return Location.create(2773, 9546, 3); + } + break; + case 3551: + return n.getLocation(); + } + return null; + } + + /** + * Gets the exp. + * @param player the player. + * @param exp the exp. + * @return the exp. + */ + private static double getExp(Player player, double exp) { + return player.getAchievementDiaryManager().getKaramjaGlove() > 1 ? exp + (exp * 0.10) : exp; + } + + /** + * Gets the amount of damage to deal. + * @param player The player. + * @return The amount of damage. + */ + private static int getHitAmount(Player player) { + int hit = player.getSkills().getLifepoints() / 12; + if (hit < 2) { + hit = 2; + } + return hit; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/DartTrap.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/DartTrap.java new file mode 100644 index 000000000..65266a689 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/DartTrap.java @@ -0,0 +1,94 @@ +package core.game.node.entity.skill.agility.brimhaven; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.MovementHook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; +import core.tools.RandomFunction; + +/** + * Handles the darts trap. + * @author Emperor + */ +public final class DartTrap implements MovementHook { + + @Override + public boolean handle(Entity e, final Location l) { + final Direction dir = e.getDirection(); + final Player player = (Player) e; + final Location start = l.transform(-dir.getStepX(), -dir.getStepY(), 0); + e.lock(6); + e.addExtension(LogoutTask.class, new LocationLogoutTask(13, start)); + final Location startProj = l.transform(dir.getStepX() * 5, dir.getStepY() * 5, 0); + GameWorld.getPulser().submit(new Pulse(2, e) { + boolean failed; + int count; + + @Override + public boolean pulse() { + if (++count == 1) { + if (failed = AgilityHandler.hasFailed(player, 40, 0.15)) { + if (player.getSkills().getLevel(Skills.AGILITY) < 40) { + player.getPacketDispatch().sendMessage("You need an agility of at least 40 to get past this trap!"); + } + Projectile.create(startProj, l, 270, 0, 10, 46, 85, 5, 11).send(); + setDelay(3); + } else { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, startProj.getX() + (dir.getStepX() * 4), startProj.getY() + (dir.getStepY() * 4), 350, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, l.getX(), l.getY(), 350, 1, 100)); + Projectile.create(startProj, l.transform(-dir.getStepX() * 4, -dir.getStepY() * 4, 0), 270, 0, 0, 46, 200, 5, 11).send(); + } + } else if (count == 2) { + if (failed) { + int hit = player.getSkills().getLifepoints() / 12; + if (hit < 2) { + hit = 2; + } + setDelay(1); + AgilityHandler.failWalk(player, 1, l, start, start, Animation.create(1114), 10, hit, null).setDirection(dir); + } else { + if (dir.toInteger() % 2 != 0) { + int mod = dir == Direction.WEST ? -1 : 1; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, l.getX() - (5 * mod), l.getY() - (5 * mod), 400, 8, 6)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, l.getX() + (2 * mod), l.getY(), 350, 8, 1)); + } else { + int mod = dir == Direction.SOUTH ? -1 : 1; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, l.getX() + (5 * mod), l.getY() - (5 * mod), 400, 8, 6)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, l.getX(), l.getY() + (2 * mod), 350, 8, 1)); + } + player.lock(7); + player.animate(new Animation(1110, 20)); + setDelay(5); + } + } else if (count == 3) { + if (failed) { + player.getPacketDispatch().sendMessage("You were hit by some darts, something on them makes you feel dizzy!"); + player.getSkills().updateLevel(Skills.AGILITY, -(2 + RandomFunction.randomize(2)), 0); + return true; + } + setDelay(2); + AgilityHandler.walk(player, -1, l, l.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), null, 30.0, null); + } else if (count == 4) { + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, 0, 0, 0)); + return true; + } + return false; + } + }); + return false; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.java new file mode 100644 index 000000000..da4be55f3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/FloorSpikes.java @@ -0,0 +1,53 @@ +package core.game.node.entity.skill.agility.brimhaven; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.MovementHook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; + +/** + * Handles floor spikes trap. + * @author Emperor + */ +public final class FloorSpikes implements MovementHook { + + @Override + public boolean handle(Entity e, final Location l) { + final Direction dir = e.getDirection(); + final Player player = (Player) e; + final Location start = l.transform(-dir.getStepX(), -dir.getStepY(), 0); + e.lock(5); + e.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + GameWorld.getPulser().submit(new Pulse(3, e) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendObjectAnimation(RegionManager.getObject(l), Animation.create(1111)); + if (AgilityHandler.hasFailed(player, 20, 0.25)) { + if (player.getSkills().getLevel(Skills.AGILITY) < 20) { + player.getPacketDispatch().sendMessage("You need an agility of at least 20 to get past this trap!"); + } + int hit = player.getSkills().getLifepoints() / 12; + if (hit < 2) { + hit = 2; + } + AgilityHandler.failWalk(player, 1, player.getLocation(), start, start, Animation.create(1114), 10, hit, "You were hit by some floor spikes!").setDirection(dir); + ; + } else { + AgilityHandler.forceWalk(player, -1, l, l.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(1115), 20, 26, null); + } + return true; + } + }); + return false; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/PressurePad.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/PressurePad.java new file mode 100644 index 000000000..22fdbef4d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/PressurePad.java @@ -0,0 +1,53 @@ +package core.game.node.entity.skill.agility.brimhaven; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.MovementHook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +/** + * Handles the pressure pad trap. + * @author Emperor + */ +public final class PressurePad implements MovementHook { + + @Override + public boolean handle(Entity e, final Location dest) { + final Direction dir = e.getDirection(); + final Player player = (Player) e; + final Location start = dest.transform(-dir.getStepX(), -dir.getStepY(), 0); + e.lock(5); + e.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + GameWorld.getPulser().submit(new Pulse(3, e) { + @Override + public boolean pulse() { + Graphics.send(Graphics.create(271), dest); + if (AgilityHandler.hasFailed(player, 20, 0.25)) { + if (player.getSkills().getLevel(Skills.AGILITY) < 20) { + player.getPacketDispatch().sendMessage("You need an agility of at least 20 to get past this trap!"); + } + int hit = player.getSkills().getLifepoints() / 12; + if (hit < 2) { + hit = 2; + } + AgilityHandler.failWalk(player, 1, player.getLocation(), start, start, Animation.create(1114), 10, hit, "You were hit by some falling rocks!").setDirection(dir); + ; + } else { + AgilityHandler.forceWalk(player, -1, dest, dest.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(1115), 20, 26, null); + } + return true; + } + }); + return false; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.java new file mode 100644 index 000000000..d084670cd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/brimhaven/SpinningBlades.java @@ -0,0 +1,67 @@ +package core.game.node.entity.skill.agility.brimhaven; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.MovementHook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the spinning blades trap. + * @author Emperor + */ +public final class SpinningBlades implements MovementHook { + + @Override + public boolean handle(Entity e, final Location l) { + final Direction dir = e.getDirection(); + final Player player = (Player) e; + final Location start = l.transform(-dir.getStepX(), -dir.getStepY(), 0); + e.lock(5); + e.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + GameWorld.getPulser().submit(new Pulse(3, e) { + @Override + public boolean pulse() { + sendObjectAnimation(player, l); + if (AgilityHandler.hasFailed(player, 40, 0.15)) { + if (player.getSkills().getLevel(Skills.AGILITY) < 40) { + player.getPacketDispatch().sendMessage("You need an agility of at least 40 to get past this trap!"); + } + int hit = player.getSkills().getLifepoints() / 12; + if (hit < 2) { + hit = 2; + } + AgilityHandler.failWalk(player, 1, player.getLocation(), start, start, Animation.create(1114), 10, hit, "You were hit by the spinning blades.").setDirection(dir); + } else { + AgilityHandler.forceWalk(player, -1, l, l.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(1115), 20, 26, null); + } + return true; + } + }); + return false; + } + + /** + * Sends the object animation for the spinning blades. + * @param player The player. + * @param l The location. + */ + private static void sendObjectAnimation(Player player, Location l) { + if (l.equals(Location.create(2778, 9579, 3))) { + l = Location.create(2777, 9580, 3); + } else if (l.equals(Location.create(2783, 9574, 3))) { + l = Location.create(2782, 9573, 3); + } else if (l.equals(Location.create(2778, 9557, 3))) { + l = Location.create(2777, 9556, 3); + } + player.getPacketDispatch().sendObjectAnimation(RegionManager.getObject(l), Animation.create(1107)); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.java new file mode 100644 index 000000000..a880e4665 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/AgilityPyramidCourse.java @@ -0,0 +1,561 @@ +package core.game.node.entity.skill.agility.pyramid; + +import core.cache.def.impl.VarbitDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityCourse; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.PluginManager; + +/** + * Handles the agility pryamid course. + * @author Vexia + */ +@Initializable +public final class AgilityPyramidCourse extends AgilityCourse { + + /** + * The pyramid top item. + */ + private static final Item PYRAMID_TOP = new Item(6970); + + /** + * The config id to use. + */ + private static final int CONFIG_ID = 640; + + /** + * The jump gap location data. + */ + private static final Location[][] GAP_LOCATIONS = new Location[][] { { new Location(3356, 2847, 2), Location.create(3357, 2847, 2), Location.create(3356, 2846, 2), Location.create(3357, 2846, 2), Location.create(3356, 2849, 2), Location.create(3357, 2849, 2) }, { new Location(3364, 2833, 2), Location.create(3364, 2834, 2), Location.create(3366, 2834, 2), Location.create(3366, 2833, 2), Location.create(3363, 2834, 2), Location.create(3363, 2833, 2) }, { new Location(3370, 2841, 3), new Location(3371, 2841, 3), Location.create(3370, 2840, 3), Location.create(3371, 2840, 3), Location.create(3370, 2843, 3), Location.create(3371, 2843, 3) }, { new Location(3040, 4697, 2), Location.create(3041, 4697, 2), Location.create(3041, 4696, 2), Location.create(3040, 4696, 2), Location.create(3041, 4699, 2), Location.create(3040, 4699, 2) }, { new Location(3048, 4695, 2), Location.create(3049, 4695, 2), Location.create(3048, 4694, 2), Location.create(3049, 4694, 2), Location.create(3048, 4697, 2), Location.create(3049, 4697, 2) }, { Location.create(3046, 4697, 3), Location.create(3047, 4697, 3), Location.create(3046, 4696, 3), Location.create(3047, 4696, 3), Location.create(3046, 4699, 3), Location.create(3047, 4699, 3) } }; + + /** + * The ledge crossing location data. + */ + private static final Location[][] LEDGE_LOCATIONS = new Location[][] { { new Location(3366, 2851, 1), new Location(3364, 2851, 1), Location.create(3368, 2851, 1), Location.create(3363, 2851, 1), Location.create(3367, 2851, 1), Location.create(3364, 2851, 1) }, { new Location(3362, 2831, 1), new Location(3360, 2831, 1), Location.create(3364, 2832, 1), Location.create(3359, 2832, 1), Location.create(3360, 2832, 1), Location.create(3363, 2832, 1) }, { new Location(3372, 2837, 2), new Location(3372, 2839, 2), Location.create(3372, 2841, 2), Location.create(3372, 2836, 2), Location.create(3372, 2837, 2), Location.create(3372, 2840, 2) }, { new Location(3358, 2843, 3), new Location(3358, 2845, 3), Location.create(3359, 2842, 3), Location.create(3359, 2847, 3), Location.create(3359, 2846, 3), Location.create(3359, 2843, 3) } }; + + /** + * The gap crossing location data. + */ + private static final Location[][] GAP_CROSS_LOCATIONS = new Location[][] { { new Location(3368, 2831, 1), new Location(3370, 2831, 1), Location.create(3372, 2832, 1), Location.create(3367, 2832, 1), Location.create(3371, 2832, 1), Location.create(3368, 2832, 1) }, { new Location(3356, 2837, 2), new Location(3356, 2839, 2), Location.create(3357, 2841, 2), Location.create(3357, 2836, 2), Location.create(3357, 2840, 2), Location.create(3357, 2837, 2) }, { new Location(3360, 2849, 2), new Location(3362, 2849, 2), Location.create(3359, 2849, 2), Location.create(3364, 2849, 2), Location.create(3363, 2849, 2), Location.create(3360, 2849, 2) } }; + + /** + * Constructs a new {@code AgilityPyramidCourse} {@code Object}. + */ + public AgilityPyramidCourse() { + this(null); + } + + /** + * Constructs a new {@code AgilityPyramidCourse} {@code Object}. + * @param player the player. + */ + public AgilityPyramidCourse(Player player) { + super(player, 5, 0); + } + + @Override + public void configure() { + ObjectDefinition.forId(16535).getHandlers().put("option:climb", this); + ObjectDefinition.forId(16536).getHandlers().put("option:climb", this); + ObjectDefinition.forId(10851).getHandlers().put("option:climb", this); + ObjectDefinition.forId(10855).getHandlers().put("option:enter", this); + ObjectDefinition.forId(10856).getHandlers().put("option:enter", this); + ObjectDefinition.forId(10860).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10861).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10862).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10863).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10864).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10868).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10867).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10882).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10883).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10884).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10885).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10886).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10887).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10888).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10889).getHandlers().put("option:cross", this); + ObjectDefinition.forId(10859).getHandlers().put("option:jump", this); + ObjectDefinition.forId(10857).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(10858).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(10865).getHandlers().put("option:climb-over", this); + RollingBlock.BlockSets.values(); + PluginManager.definePlugin(new MovingBlockNPC()); + PluginManager.definePlugin(new AgilityPyramidZone()); + } + + @Override + public boolean handle(final Player player, Node node, String option) { + getCourse(player); // Sets the extension. + final GameObject object = (GameObject) node; + if (object.getLocation().getDistance(player.getLocation()) >= 3) { + player.getPacketDispatch().sendMessage("I can't reach that!"); + return true; + } + switch (object.getId()) { + case 16535: + case 16536: + handleRockClimb(player, object); + break; + case 10865: + handleLowWall(player, object); + break; + case 10888: + case 10889: + case 10860: + case 10886: + case 10887: + handleLedge(player, object); + break; + case 10868: + case 10867: + handlePlank(player, object); + break; + case 10882: + case 10883: + case 10884: + case 10885: + case 10861: + case 10862: + case 10863: + case 10864: + handleGapCross(player, object); + break; + case 10857: + case 10858: + handleStairs(player, object); + break; + case 10851: + handlePyramidTop(player, object); + break; + case 10859: + handleJumpGap(player, object); + break; + case 10855: + case 10856: + addConfig(player, 10869, 0, true); + if (player.getConfigManager().get(640) == 505 || player.getConfigManager().get(640) == 515) { + player.getSkills().addExperience(Skills.AGILITY, 300, true); + } + player.getDialogueInterpreter().sendDialogue("You climb down the steep passage. It leads to the base of the", "pyramid."); + player.getProperties().setTeleportLocation(Location.create(3364, 2830, 0)); + player.getSavedData().getActivityData().setTopGrabbed(false); + break; + } + return true; + } + + /** + * Handles the stairs. + * @param player the player. + * @param object the object. + */ + private void handleStairs(final Player player, final GameObject object) { + Direction dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + Location dest = null; + if (dir == Direction.NORTH) { + dest = object.getLocation().transform(0, 2, 1); + } else if (dir == Direction.SOUTH) { + dest = object.getLocation().transform(0, -1, -1); + } + if (object.getLocation().equals(Location.create(3360, 2837, 3))) { + dest = Location.create(3040, 4695, 2); + } else if (object.getLocation().equals(Location.create(3040, 4693, 2))) { + dest = Location.create(3360, 2836, 3); + } else if (object.getLocation().equals(new Location(3354, 2831, 0))) { + addConfig(player, 10869, 0, true); + } + ClimbActionHandler.climb(player, null, dest); + } + + /** + * Handles the rock climbing obstacle. + * @param player the player. + * @param object the object. + */ + private void handleRockClimb(final Player player, final GameObject object) { + final boolean scale = player.getLocation().getX() < object.getLocation().getX(); + final Location end = object.getLocation().transform(scale ? 2 : -2, 0, 0); + if (object.getId() == 16536 && player.getSkills().getStaticLevel(Skills.AGILITY) < 30) { + player.getPacketDispatch().sendMessage("You must be level 30 agility or higher to climb down the rocks."); + return; + } + if (!scale) { + ForceMovement.run(player, player.getLocation(), end, Animation.create(740), Animation.create(740), Direction.WEST, 13).setEndAnimation(Animation.RESET); + } else { + ForceMovement.run(player, player.getLocation(), end, Animation.create(1148), Animation.create(1148), Direction.WEST, 13).setEndAnimation(Animation.RESET); + } + } + + /** + * Handles the low wall obstacle. + * @param player the player. + * @param object the object. + */ + private void handleLowWall(final Player player, final GameObject object) { + Direction d = Direction.getDirection(player.getLocation(), object.getLocation()); + final boolean fail = player.getSkills().getLevel(Skills.AGILITY) >= 75 ? false : hasFailed(player) ; + if (player.getLocation().equals(Location.create(3355, 2848, 1)) || player.getLocation().equals(Location.create(3359, 2838, 3))) { + d = Direction.NORTH; + } else if (player.getLocation().equals(Location.create(3355, 2850, 1)) || player.getLocation().equals(Location.create(3359, 2840, 3))) { + d = Direction.SOUTH; + } else if (player.getLocation().equals(Location.create(3046, 4694, 2)) || player.getLocation().equals(Location.create(3355, 2850, 1)) || player.getLocation().equals(Location.create(3041, 4702, 2)) || player.getLocation().equals(new Location(3369, 2834, 2))) { + d = Direction.EAST; + } else if (player.getLocation().equals(Location.create(3048, 4694, 2)) || player.getLocation().equals(Location.create(3371, 2834, 2)) || player.getLocation().equals(Location.create(3043, 4702, 2))) { + d = Direction.WEST; + } + player.lock(4); + player.getPacketDispatch().sendMessage("You climb the low wall..."); + if (fail) { + Location end = player.getLocation().transform(d, 1); + player.lock(3); + AgilityHandler.failWalk(player, 2, player.getLocation(), end, end, Animation.create(1106), 15, getHitAmount(player), "You lost your balance!"); + AgilityHandler.forceWalk(player, -1, end, player.getLocation(), ForceMovement.WALK_ANIMATION, 10, 0.0, null, 4); + return; + } + AgilityHandler.forceWalk(player, 0, player.getLocation(), player.getLocation().transform(d, 2), Animation.create(1252), 6, 8, "... and make it over."); + player.animate(Animation.RESET, 4); + } + + /** + * Handles the ledge crossing obstacle. + * @param player the player. + * @param object the object. + */ + private void handleLedge(final Player player, final GameObject object) { + Direction d = Direction.getLogicalDirection(player.getLocation(), getLedgeLocation(player, object)); + final Direction dir = d; + final int diff = object.getRotation() == 3 && dir == Direction.EAST ? 1 : object.getRotation() == 3 && dir == Direction.WEST ? 0 : d == Direction.EAST || (d == Direction.SOUTH && object.getRotation() != 0) || d == Direction.NORTH ? 0 : 1; + final boolean fail = player.getSkills().getLevel(Skills.AGILITY) >= 75 ? false : hasFailed(player) ; + player.getSkills().getLevel(Skills.AGILITY); + final Location end = player.getLocation().transform(dir.getStepX() * (fail ? 3 : 5), dir.getStepY() * (fail ? 3 : 5), 0); + player.getPacketDispatch().sendMessage("You put your foot on the ledge and try to edge across..."); + if (fail) { + player.lock(4); + AgilityHandler.walk(player, -1, player.getLocation(), end, Animation.create(157 - diff), 0.0, "You slip and fall to the level below."); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + Location dest = end; + int x = 0, y = 0; + switch (dir) { + case NORTH: + case SOUTH: + if (object.getRotation() == 2) { + x = 2; + } else { + x = -2; + } + break; + case WEST: + case EAST: + if (object.getRotation() == 3) { + y = -2; + } else if (object.getRotation() == 1) { + y = 2; + } + break; + default: + break; + } + AgilityHandler.fail(player, 1, transformLevel(dest.transform(x, y, 0)), Animation.create(761 - diff), 10, null); + return true; + } + }); + return; + } + AgilityHandler.walk(player, 3, player.getLocation(), end, Animation.create(157 - diff), 52, "You skillfully edge across the gap."); + } + + /** + * Handles the plank crossin obstacle. + * @param player the player. + * @param object the object. + */ + private void handlePlank(final Player player, final GameObject object) { + final boolean custom = object.getLocation().equals(new Location(3365, 2835, 3)) || object.getLocation().equals(new Location(3370, 2835, 3)); + final Direction dir = custom ? Direction.EAST : Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + final boolean fail = player.getSkills().getLevel(Skills.AGILITY) >= 75 ? false : hasFailed(player) ; + final Location end = object.getLocation().transform(object.getId() != 10868 ? dir : dir.getOpposite(), fail ? 2 : 5); + AgilityHandler.walk(player, fail ? -1 : 1, player.getLocation(), end, Animation.create(155), fail ? 0.0 : 56.4, fail ? null : "You walk carefully across the slippery plank..."); + if (fail) { + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + final Location dest = transformLevel(end.transform(!custom ? 2 : 0, custom ? -2 : 0, 0)); + AgilityHandler.failWalk(player, 2, end, dest, dest, Animation.create(764), 10, 10, null); + return true; + } + }); + } + } + + /** + * Handles the gab crossing obstacle. + * @param player the player. + * @param object the object. + */ + private void handleJumpGap(Player player, GameObject object) { + final Direction dir = Direction.getDirection(player.getLocation(), getGapLocation(player, object)); + final boolean fail = player.getSkills().getLevel(Skills.AGILITY) >= 75 ? false : hasFailed(player) ; + player.getPacketDispatch().sendMessage("You jump the gap..."); + if (fail) { + final boolean regular = object.getRotation() == 0 || object.getRotation() == 3; + Location end = player.getLocation().transform(dir, 1); + Location dest = object.getLocation().transform(dir, 1); + if (!regular) { + dest = dest.transform(dir == Direction.NORTH || dir == Direction.SOUTH ? 2 : 0, dir == Direction.SOUTH ? 1 : 0, 0); + } else { + dest = dest.transform(dir == Direction.NORTH || dir == Direction.SOUTH ? -1 : dir == Direction.WEST ? 1 : 0, dir == Direction.SOUTH ? 1 : dir == Direction.WEST || dir == Direction.EAST ? -1 : 0, 0); + } + dest = transformLevel(dest); + player.lock(8); + AgilityHandler.forceWalk(player, -1, player.getLocation(), end, Animation.create(3068), 10, 0.0, "... and miss your footing."); + AgilityHandler.fail(player, 8, dest, null, 8, null); + return; + } + player.lock(4); + AgilityHandler.forceWalk(player, 2, player.getLocation(), player.getLocation().transform(dir, 3), Animation.create(3067), 20, 22, null); + } + + /** + * Handles the gap cross obstacle. + * @param player the player. + * @param object the object. + */ + private void handleGapCross(final Player player, final GameObject object) { + final Direction dir = Direction.getLogicalDirection(player.getLocation(), getGapCrossLocation(player, object)); + final boolean fail = player.getSkills().getLevel(Skills.AGILITY) >= 75 ? false : hasFailed(player) ; + final Location end = player.getLocation().transform(dir, fail ? 4 : 5); + final int rot = object.getRotation(); + int mod = player.getLocation().equals(new Location(3359, 2849, 2)) ? 0 : player.getLocation().equals(new Location(3357, 2841, 2)) ? 1 : player.getLocation().equals(new Location(3367, 2832, 1)) ? 1 : player.getLocation().equals(new Location(3372, 2832, 1)) ? 0 : object.getLocation().equals(new Location(3370, 2831, 1)) ? 0 : rot == 1 && dir == Direction.EAST ? 0 : rot == 3 && (dir == Direction.WEST || dir == Direction.EAST) ? 1 : rot == 0 && dir == Direction.SOUTH ? 1 : dir == Direction.WEST && rot != 3 || dir == Direction.EAST ? 1 : 0; + final Animation animation = Animation.create(387 - mod); + if (fail) { + Location dest = object.getLocation().transform(dir, 1); + dest = rot == 1 && dir == Direction.EAST ? dest.transform(1, 2, 0) : rot == 1 && dir == Direction.WEST ? dest.transform(0, -2, 0) : dest.transform(dir == Direction.NORTH || dir == Direction.SOUTH ? -1 : dir == Direction.WEST ? 1 : 0, dir == Direction.SOUTH ? 1 : dir == Direction.WEST || dir == Direction.EAST ? -1 : 0, 0); + AgilityHandler.walk(player, -1, player.getLocation(), end, animation, 10, null); + AgilityHandler.fail(player, 3, transformLevel(dest), null, 8, null); + // player.animate(Animation.create(3056 - mod), 2); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getAppearance().setDefaultAnimations(); + player.getAppearance().sync(); + return true; + } + }); + return; + } + AgilityHandler.walk(player, 4, player.getLocation(), end, animation, 22, null); + } + + /** + * Handles the pyramid top obstacle. + * @param player the player. + * @param object the object. + */ + private void handlePyramidTop(final Player player, final GameObject object) { + if(player.getSavedData().getActivityData().isTopGrabbed() == true){ + player.getPacketDispatch().sendMessage("You've already claimed this!"); + return; + } else { + player.animate(Animation.create(3063)); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getSkills().addExperience(Skills.AGILITY, 1000); + if (player.getConfigManager().get(640) == 505 || player.getConfigManager().get(640) == 515) { + player.getPacketDispatch().sendMessage("You find nothing on top of the pyramid."); + return true; + } + addConfig(player, 10869, 1, true); + player.getSavedData().getActivityData().setTopGrabbed(true); + player.getInventory().add(PYRAMID_TOP, player); + player.getDialogueInterpreter().sendItemMessage(PYRAMID_TOP, "You find a golden pyramid!"); + return true; + } + }); + } + } + + /** + * Transforms a pyramid level. + * @param location the location. + * @return the location. + */ + public static Location transformLevel(Location location) { + int xDiff = 320; + int yDiff = 1856; + if (location.getRegionId() == 12105 && location.getZ() == 2) { + return new Location(location.getX() + xDiff, location.getY() - yDiff, 3); + } + return location.transform(0, 0, -1); + } + + /** + * Gets the gap location. + * @param player the player. + * @param object the obejct. + * @return the location. + */ + private Location getGapLocation(Player player, GameObject object) { + final Location[] data = getLocationData(GAP_LOCATIONS, object.getLocation()); + return getClosest(new Location[] { data[0], data[1] }, player.getLocation()); + } + + /** + * Gets the gap cross location. + * @param player the player. + * @param object the obejct. + * @return the location. + */ + private Location getGapCrossLocation(Player player, GameObject object) { + final Location[] data = getLocationData(GAP_CROSS_LOCATIONS, object.getLocation()); + return getClosest(new Location[] { data[4], data[5] }, player.getLocation()); + } + + /** + * Gets the ledge location. + * @param player the player. + * @param object the object. + * @return the location. + */ + private Location getLedgeLocation(final Player player, final GameObject object) { + final Location[] data = getLocationData(LEDGE_LOCATIONS, object.getLocation()); + return getClosest(new Location[] { data[4], data[5] }, player.getLocation()); + } + + /** + * Gets the closest location. + * @param data the data. + * @param location the location. + * @return the closest location. + */ + private Location getClosest(Location[] data, Location location) { + Location closest = null; + for (Location l : data) { + if (closest == null || l.getDistance(location) < closest.getDistance(location)) { + closest = l; + } + } + return closest; + } + + /** + * Gets the location data. + * @param data the data. + * @param location the location. + * @return the data. + */ + private Location[] getLocationData(Location[][] data, Location location) { + for (int i = 0; i < data.length; i++) { + for (Location l : data[i]) { + if (l.equals(location)) { + return data[i]; + } + } + } + return null; + } + + /** + * Checks if the player has failed. + * @param player the player. + * @return {@code True} if so. + */ + private boolean hasFailed(final Player player) { + return hasFailed(player, 0.009000); + } + + /** + * Checks if the player has failed. + * @param player the player. + * @param mod the mod. + * @return {@code True} if so. + */ + private boolean hasFailed(final Player player, double mod) { + return AgilityHandler.hasFailed(player, 10, mod); + } + + /** + * Sets the config id. + * @param player the player. + * @param objectId the object. + * @param value the value. + */ + public static void addConfig(final Player player, final int objectId, final int value, boolean save) { + final VarbitDefinition definition = VarbitDefinition.forObjectID(ObjectDefinition.forId(objectId).getVarbitID()); + final int oldVal = (definition.getValue(player) << definition.getBitShift()); + final int newVal = (value << definition.getBitShift()); + player.getConfigManager().set(CONFIG_ID, (player.getConfigManager().get(CONFIG_ID) - oldVal) + newVal, save); + } + + /** + * Sets the config id. + * @param player the player. + * @param object the object. + * @param value the value. + * @param save if we save. + */ + public static void addConfig(final Player player, final GameObject object, final int value, boolean save) { + addConfig(player, object.getId(), value, save); + } + + @Override + public Location getDestination(Node node, Node n) { + switch (n.getId()) { + case 16535: + case 16536: + return n.getLocation().transform(node.getLocation().getX() < n.getLocation().getX() ? -1 : 1, 0, 0); + case 10865: + return null; + case 10857: + return n.getLocation().transform(0, -1, 0); + case 10858: + return n.getLocation().transform(0, 2, 0); + case 10859: + return getClosest(getLocationData(GAP_LOCATIONS, n.getLocation()), node.getLocation()); + case 10860: + case 10886: + case 10887: + case 10888: + case 10889: + return getClosest(getLocationData(LEDGE_LOCATIONS, n.getLocation()), node.getLocation()); + case 10868: + case 10867: + return n.getLocation(); + case 10882: + case 10883: + case 10884: + case 10885: + case 10861: + case 10862: + case 10863: + case 10864: + if (n.getId() == 10863 && n.getLocation().equals(new Location(3372, 2832, 1))) { + return Location.create(3372, 2832, 1); + } + return getClosest(getLocationData(GAP_CROSS_LOCATIONS, n.getLocation()), node.getLocation()); + } + return null; + } + + @Override + public AgilityCourse createInstance(Player player) { + return new AgilityPyramidCourse(player); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/AgilityPyramidZone.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/AgilityPyramidZone.java new file mode 100644 index 000000000..a47bc0d98 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/AgilityPyramidZone.java @@ -0,0 +1,73 @@ +package core.game.node.entity.skill.agility.pyramid; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.system.task.MovementHook; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Plugin; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents the agility pyramid area. + * @author 'Vexia + * @version 1.0 + */ +public final class AgilityPyramidZone extends MapZone implements Plugin { + + /** + * The location based traps. + */ + public static final Map LOCATION_TRAPS = new HashMap<>(); + + /** + * Constructs a new {@code AgilityPyramid} {@code Object}. + */ + public AgilityPyramidZone() { + super("agility pyramid", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + final Player player = (Player) e; + AgilityPyramidCourse.addConfig(player, 10872, 1, true); + AgilityPyramidCourse.addConfig(player, 10873, 3, true); + } + return super.enter(e); + } + + @Override + public boolean move(Entity e, Location loc, Location dest) { + if (!e.getLocks().isMovementLocked() && e instanceof Player) { + MovementHook hook = LOCATION_TRAPS.get(loc); + if (hook != null) { + e.setDirection(Direction.getLogicalDirection(loc, dest)); + return hook.handle(e, loc); + } + } + return super.move(e, loc, dest); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(3352, 2826, 3378, 2854)); + register(new ZoneBorders(3007, 4672, 3071, 4735)); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC.java new file mode 100644 index 000000000..c1d0acfdd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/MovingBlockNPC.java @@ -0,0 +1,175 @@ +package core.game.node.entity.skill.agility.pyramid; + +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.system.task.MovementHook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; + +/** + * The moving block npc. + * @author 'Vexia + * @version 1.0 + */ +public final class MovingBlockNPC extends AbstractNPC { + + /** + * The tile locations. + */ + private static final Location[][] LOCATIONS = new Location[][] { { Location.create(3366, 2847, 3), Location.create(3367, 2847, 3), Location.create(3367, 2848, 3), Location.create(3366, 2848, 3), Location.create(3365, 2847, 3), Location.create(3365, 2848, 3), Location.create(3368, 2847, 3), Location.create(3368, 2848, 3) }, { Location.create(3374, 2847, 1), Location.create(3374, 2848, 1), Location.create(3375, 2848, 1), Location.create(3375, 2847, 1), Location.create(3374, 2849, 1), Location.create(3375, 2849, 1), Location.create(3374, 2846, 1), Location.create(3375, 2846, 1) } }; + + /** + * The next move delay. + */ + private int nextMove; + + /** + * If its moving. + */ + private boolean moving; + + /** + * Constructs a new {@code MovingBlockNPC} {@code Object}. + */ + public MovingBlockNPC() { + super(-1, null); + } + + /** + * Constructs a new {@code MovingBlockNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public MovingBlockNPC(int id, Location location) { + super(id, location, false); + } + + @Override + public void tick() { + super.tick(); + if (nextMove < GameWorld.getTicks() && nextMove != -1) { + Direction dir = getId() == 3124 ? Direction.EAST : Direction.NORTH; + Location loc = getLocation().transform(dir, 2); + getWalkingQueue().reset(); + getWalkingQueue().addPath(loc.getX(), loc.getY()); + for (Player p : RegionManager.getLocalPlayers(getTileLocations()[0], 2)) { + checkBlock(p); + } + moving = true; + GameWorld.getPulser().submit(new Pulse(1, this) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + for (Player p : RegionManager.getLocalPlayers(getTileLocations()[0], 2)) { + checkBlock(p); + } + break; + case 3: + getWalkingQueue().reset(); + getWalkingQueue().addPath(getProperties().getSpawnLocation().getX(), getProperties().getSpawnLocation().getY()); + nextMove = GameWorld.getTicks() + 13; + break; + case 5: + moving = false; + return true; + } + return false; + } + }); + nextMove = -1; + } + } + + @Override + public void init() { + super.init(); + final MovingBlockTrap trap = new MovingBlockTrap(); + for (Location l : getTileLocations()) { + AgilityPyramidZone.LOCATION_TRAPS.put(l, trap); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MovingBlockNPC(id, location); + } + + /** + * Checks if a player is going to get hit by a block. + * @param player the player. + */ + public void checkBlock(final Player player) { + if (player.getAttribute("block-move", -1) > GameWorld.getTicks()) { + return; + } + Location[] locs = getTileLocations(); + for (int i = 0; i < 4; i++) { + if (locs[i].equals(player.getLocation())) { + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + boolean close = getProperties().getSpawnLocation().getDistance(player.getLocation()) > (getId() == 3124 ? 2 : 2.3); + Location dest = null; + if (getId() == 3124) { + if (player.getLocation().getY() == 2847) { + dest = Location.create(3376, 2847, 1); + } else if (player.getLocation().getY() == 2848) { + dest = Location.create(3376, 2848, 1); + } + } else { + if (player.getLocation().getX() == 3366) { + dest = Location.create(3366, 2849, 3); + } else if (player.getLocation().getX() == 3367) { + dest = Location.create(3367, 2849, 3); + } + } + player.lock(4); + player.setAttribute("block-move", GameWorld.getTicks() + 4); + AgilityHandler.failWalk(player, close ? 1 : 3, player.getLocation(), dest, AgilityPyramidCourse.transformLevel(dest), Animation.create(3066), 10, 8, null, getId() == 3124 ? Direction.WEST : Direction.SOUTH); + return true; + } + }); + return; + } + } + } + + /** + * Gets the tile locations. + * @return the locations. + */ + public Location[] getTileLocations() { + return LOCATIONS[3125 - getId()]; + } + + @Override + public int[] getIds() { + return new int[] { 3124, 3125 }; + } + + /** + * The movement hook to handle a moving block. + * @author 'Vexia + * @version 1.0 + */ + public final class MovingBlockTrap implements MovementHook { + + @Override + public boolean handle(Entity e, Location l) { + if (moving) { + return false; + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/RollingBlock.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/RollingBlock.java new file mode 100644 index 000000000..86a048779 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/pyramid/RollingBlock.java @@ -0,0 +1,163 @@ +package core.game.node.entity.skill.agility.pyramid; + +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.MovementHook; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the rolling block obstacle. + * @author 'Vexia + * @version 1.0 + */ +public final class RollingBlock implements MovementHook { + + @Override + public boolean handle(final Entity e, final Location dest) { + final Player player = (Player) e; + final BlockSets set = BlockSets.forLocation(dest); + final GameObject stone = RegionManager.getObject(set.getBlockLocation()); + final boolean backwards = isBackwards(stone.getDirection(), player.getDirection(), stone.getRotation()); + final boolean fail = backwards || AgilityHandler.hasFailed(player, 2, 0.3); + player.lock(5); + AgilityPyramidCourse.addConfig(player, stone, 1, false); + e.addExtension(LogoutTask.class, new LocationLogoutTask(5, player.getLocation())); + if (fail) { + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + final Location end = player.getLocation().transform(stone.getDirection(), -2); + final int hit = backwards ? 1 : 6; + if (set == BlockSets.FOUR) { + AgilityHandler.failWalk(player, 3, dest, end, AgilityPyramidCourse.transformLevel(end), Animation.create(1116), 10, hit, null); + } else { + AgilityHandler.failWalk(player, -1, dest, AgilityPyramidCourse.transformLevel(end), AgilityPyramidCourse.transformLevel(end), Animation.create(1116), 10, hit, null); + } + break; + case 3: + AgilityPyramidCourse.addConfig(player, stone, 0, true); + return true; + } + return false; + } + }); + return false; + } + AgilityHandler.forceWalk(player, -1, dest, dest.transform(player.getDirection(), 2), Animation.create(1115), 20, 12, null); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + AgilityPyramidCourse.addConfig(player, stone, 0, true); + return true; + } + }); + return false; + } + + /** + * Checks if the player is going backwards. + * @param direction the object dir. + * @param dir the player dir. + * @return {@code True} if so. + */ + public boolean isBackwards(Direction direction, Direction dir, int rot) { + switch (direction) { + case NORTH: + break; + case SOUTH: + return rot == 2 & dir == Direction.WEST; + case EAST: + return rot == 1 && dir == Direction.SOUTH; + case WEST: + return rot == 3 && dir == Direction.NORTH; + default: + break; + } + return false; + } + + /** + * A block set. + * @author 'Vexia + */ + public enum BlockSets { + ONE(Location.create(3354, 2841, 0), Location.create(3354, 2842, 1), Location.create(3355, 2842, 1), Location.create(3355, 2841, 1), Location.create(3354, 2841, 1)), TWO(Location.create(3374, 2835, 0), Location.create(3374, 2835, 1), Location.create(3374, 2836, 1), Location.create(3375, 2836, 1), Location.create(3375, 2835, 1)), THREE(Location.create(3368, 2849, 1), Location.create(3368, 2849, 2), Location.create(3369, 2849, 2), Location.create(3369, 2850, 2), Location.create(3368, 2850, 2)), FOUR(Location.create(3048, 4699, 1), Location.create(3048, 4700, 2), Location.create(3049, 4700, 2), Location.create(3049, 4699, 2), Location.create(3048, 4699, 2)), FIVE(Location.create(3044, 4699, 2), Location.create(3044, 4700, 3), Location.create(3045, 4700, 3), Location.create(3045, 4699, 3), Location.create(3044, 4699, 3)); + + /** + * The block location. + */ + private final Location blockLocation; + + /** + * The tile locations. + */ + private final Location[] tiles; + + /** + * Constructs a new {@code BlockSets} {@code Object}. + * @param blockLocation the block location. + * @param tiles the tiles. + */ + private BlockSets(Location blockLocation, Location... tiles) { + this.blockLocation = blockLocation; + this.tiles = tiles; + } + + /** + * Gets the set for the location. + * @param location the location. + * @return the block sets. + */ + public static BlockSets forLocation(Location location) { + for (BlockSets set : values()) { + for (Location loc : set.getTiles()) { + if (loc.equals(location)) { + return set; + } + } + } + return null; + } + + /** + * Gets the blockLocation. + * @return The blockLocation. + */ + public Location getBlockLocation() { + return blockLocation; + } + + /** + * Gets the tiles. + * @return The tiles. + */ + public Location[] getTiles() { + return tiles; + } + + /** + * static-block to load block traps. + */ + static { + final RollingBlock block = new RollingBlock(); + for (BlockSets set : values()) { + for (Location l : set.getTiles()) { + AgilityPyramidZone.LOCATION_TRAPS.put(l, block); + } + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/AlKharidPitShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/AlKharidPitShortcut.java new file mode 100644 index 000000000..3e6457b5d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/AlKharidPitShortcut.java @@ -0,0 +1,57 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the al kharid pit shortcut. + * @author adam + */ +@Initializable +public class AlKharidPitShortcut extends AgilityShortcut { + + /** + * Represents the scaling down anmation. + */ + private static final Animation ANIMATION = new Animation(1148); + + /** + * Represents the scaling animation. + */ + private static final Animation SCALE = new Animation(740); + + /** + * Constructs a new {@Code AlKharidPitShortcut} {@Code Object} + */ + public AlKharidPitShortcut() { + super(new int[] { 9331, 9332 }, 38, 0.0, "climb"); + } + + @Override + public void run(Player player, GameObject object, String option, boolean failed) { + switch (object.getId()) { + case 9331: + ForceMovement.run(player, player.getLocation(), Location.create(3303, 3315, 0), ANIMATION, ANIMATION, Direction.EAST, 13).setEndAnimation(Animation.RESET); + break; + case 9332: + ForceMovement.run(player, player.getLocation(), Location.create(3307, 3315, 0), SCALE, SCALE, Direction.EAST, 13).setEndAnimation(Animation.RESET); + break; + } + } + + @Override + public Location getDestination(Node node, Node n) { + final GameObject object = (GameObject) n; + if (object.getId() == 9331) { + return object.getLocation().transform(1, 0, 0); + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/BarSqueezeShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/BarSqueezeShortcut.java new file mode 100644 index 000000000..5fc66549e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/BarSqueezeShortcut.java @@ -0,0 +1,70 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the bar squeezing shortcut. + * @author Vexia + */ +@Initializable +public class BarSqueezeShortcut extends AgilityShortcut { + + /** + * Constructs a new {@Code BarSqueezeShortcut} {@Code Object} + */ + public BarSqueezeShortcut() { + super(new int[] { 9334, 9337 }, 66, 1, "squeeze-through"); + } + + /** + * Constructs a new {@Code BarSqueezeShortcut} {@Code Object} + * @param ids the ids. + * @param level the level. + * @param exp the exp. + * @param option the option. + */ + public BarSqueezeShortcut(int[] ids, int level, double exp, String option) { + super(ids, level, exp, option); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + configure(new BarSqueezeShortcut(new int[] { 2186 }, 1, 0.0, "squeeze-through")); + return super.newInstance(arg); + } + + @Override + public void run(Player player, GameObject object, String option, boolean failed) { + Direction dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + Location start = player.getLocation(); + if (object.getId() == 9334 && dir == Direction.NORTH) { + dir = Direction.WEST; + start = Location.create(3424, 3476, 0); + } else if (object.getId() == 9337 && dir == Direction.NORTH) { + dir = Direction.SOUTH; + if (player.getLocation().getY() < object.getLocation().getY()) { + dir = Direction.NORTH; + } + } else if (object.getId() == 2186 && player.getLocation().getY() >= 3161) { + dir = Direction.SOUTH; + } + AgilityHandler.forceWalk(player, -1, start, player.getLocation().transform(dir, 1), Animation.create(2240), 10, 0.0, null); + } + + @Override + public boolean checkRequirements(Player player) { + if (!player.getQuestRepository().isComplete("Priest in Peril") && !(player.getLocation().getY() >= 3159 && player.getLocation().getY() <= 3161)) { + player.getDialogueInterpreter().sendDialogue("You need to have completed Priest in Peril in order to do this."); + return false; + } + return super.checkRequirements(player); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut.kt b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut.kt new file mode 100644 index 000000000..b0bcf0ebd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/BasaltRockShortcut.kt @@ -0,0 +1,202 @@ +package core.game.node.entity.skill.agility.shortcuts + +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.player.FaceLocationFlag +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.agility.AgilityHandler +import core.game.node.entity.skill.agility.AgilityShortcut + +/** + * Handles the Basalt Rock shortcut. + * @author Woah + */ +@Initializable +class BasaltRockShortcut : AgilityShortcut { + + /** + * Constructs a new {@Code BasaltRockShortcut} {@Code Object} + */ + constructor() : super(intArrayOf(), 0, 0.0, "") + + val noJump = "I can't jump from here." + + /** + * Constructs a new {@Code BasaltRockShortcut} {@Code Object} + * + * @param ids the ids. + * @param level the level. + * @param experience the experience. + * @param options the options. + */ + constructor(ids: IntArray?, level: Int, experience: Double, vararg options: String?) : super(ids, level, experience, *options) + + /** + * Basalt Rock Index : Direction South (Barbarian Outpost) to North (Lighthouse) + * Beach -> Rock 1 -> Rock etc... -> Rocky Shore + * 2522, 3600 R1, 3601, 3602 R2 + */ + override fun newInstance(arg: Any?): Plugin { + configure(BasaltRockShortcut(intArrayOf(4550), 1, 0.0, "jump-to")) //Beach South* + configure(BasaltRockShortcut(intArrayOf(4551), 1, 0.0, "jump-across")) //Beach South Rock 1* + configure(BasaltRockShortcut(intArrayOf(4552), 1, 0.0, "jump-across")) //South Rock 2 + configure(BasaltRockShortcut(intArrayOf(4553), 1, 0.0, "jump-across")) //South Rock 2 (other side) + configure(BasaltRockShortcut(intArrayOf(4554), 1, 0.0, "jump-across")) //Middle Rock 3 + configure(BasaltRockShortcut(intArrayOf(4555), 1, 0.0, "jump-across")) //Middle Rock 3 (other side) + configure(BasaltRockShortcut(intArrayOf(4556), 1, 0.0, "jump-across")) //North Rock 4 + configure(BasaltRockShortcut(intArrayOf(4557), 1, 0.0, "jump-across")) //North Rock 4 (other side) + configure(BasaltRockShortcut(intArrayOf(4558), 1, 0.0, "jump-across")) //Rocky Shore North Rock 5* + configure(BasaltRockShortcut(intArrayOf(4559), 1, 0.0, "jump-to")) //Rocky Shore North* + return this + } + + /** + * This method enables users to jump across rocks by clicking on the one that they want to jump to + * instead of the rock below them + */ + override fun getDestination(n: Node?, node: Node): Location? { + val obj = node as GameObject + if (obj.id == 4550) { + return Location.create(2522, 3597, 0) //Beach South* + } else if (obj.id == 4551) { + return Location.create(2522, 3595, 0) //Beach South Rock 1* + } else if (obj.id == 4552) { + return Location.create(2522, 3602, 0) //South Rock 2 + } else if (obj.id == 4553) { + return Location.create(2522, 3600, 0) //South Rock 2 (other side) + } else if (obj.id == 4554) { + return Location.create(2516, 3611, 0) //Middle Rock 3 + } else if (obj.id == 4555) { + return Location.create(2518, 3611, 0) //Middle Rock 3 (other side) + } else if (obj.id == 4556) { + return Location.create(2514, 3615, 0) //North Rock 4 + } else if (obj.id == 4557) { + return Location.create(2514, 3613, 0) //North Rock 4 (other side) + } else if (obj.id == 4558) { + return Location.create(2514, 3619, 0) //Rocky Shore North Rock 5* + } else if (obj.id == 4559) { + return Location.create(2514, 3617, 0) //Rocky Shore North* + } + return super.getDestination(obj, node) + } + + override fun run(player: Player, obj: GameObject, option: String, failed: Boolean) { + GameWorld.Pulser.submit(object : Pulse(1, player) { + override fun pulse(): Boolean { + when (obj.id) { + + 4550 -> { + if (player.location.y <= 3596) { + player.sendMessage(noJump) + } else { + player.lock(3) + AgilityHandler.forceWalk(player, -1, Location.create(2522, 3597, 0), Location.create(2522, 3595, 0), Animation.create(769), 20, 0.0, null, 1) + } + return true + } + + 4551 -> { + if (player.location == Location.create(2522, 3597, 0)) { + player.sendMessage(noJump) + } else { + player.lock(3) + AgilityHandler.forceWalk(player, -1, Location.create(2522, 3595, 0), Location.create(2522, 3597, 0), Animation.create(769), 20, 0.0, null, 1) + } + return true + } + + 4552 -> { + if (player.location == Location.create(2522, 3600, 0)) { + player.sendMessage(noJump) + } else { + player.lock(3) + AgilityHandler.forceWalk(player, -1, Location.create(2522, 3602, 0), Location.create(2522, 3600, 0), Animation.create(769), 20, 0.0, null) + } + return true + } + + 4553 -> { + if (player.location == Location.create(2522, 3602, 0)) { + player.sendMessage(noJump) + } else { + player.lock(3) + AgilityHandler.forceWalk(player, -1, Location.create(2522, 3600, 0), Location.create(2522, 3602, 0), Animation.create(769), 20, 0.0, null) + } + return true + } + + 4554 -> { + if (player.location == Location.create(2518, 3611, 0)) { + player.sendMessage(noJump) + } else { + player.lock(3) + player.faceLocation(FaceLocationFlag.getFaceLocation(player, Location.create(2518, 3611, 0))) + AgilityHandler.forceWalk(player, -1, Location.create(2516, 3611, 0), Location.create(2518, 3611, 0), Animation.create(769), 20, 0.0, null, 1) + } + return true + } + + 4555 -> { + if (player.location == Location.create(2516, 3611, 0)) { + player.sendMessage(noJump) + } else { + player.lock(3) + player.faceLocation(FaceLocationFlag.getFaceLocation(player, Location.create(2516, 3611, 0))) + AgilityHandler.forceWalk(player, -1, Location.create(2518, 3611, 0), Location.create(2516, 3611, 0), Animation.create(769), 20, 0.0, null, 1) + } + return true + } + + 4556 -> { + if (player.location == Location.create(2514, 3613, 0)) { + player.sendMessage(noJump) + } else { + player.lock(3) + AgilityHandler.forceWalk(player, -1, Location.create(2514, 3615, 0), Location.create(2514, 3613, 0), Animation.create(769), 20, 0.0, null) + } + return true + } + + 4557 -> { + if (player.location == Location.create(2514, 3615, 0)) { + player.sendMessage(noJump) + } else { + player.lock(3) + AgilityHandler.forceWalk(player, -1, Location.create(2514, 3613, 0), Location.create(2514, 3615, 0), Animation.create(769), 20, 0.0, null) + } + return true + } + + 4558 -> { + if (player.location == Location.create(2514, 3617, 0)) { + player.sendMessage(noJump) + } else { + player.lock(3) + AgilityHandler.forceWalk(player, -1, Location.create(2514, 3619, 0), Location.create(2514, 3617, 0), Animation.create(769), 20, 0.0, null) + } + return true + } + + 4559 -> { + if (player.location.y >= 3618) { + player.sendMessage(noJump) + } else { + player.lock(3) + AgilityHandler.forceWalk(player, -1, Location.create(2514, 3617, 0), Location.create(2514, 3619, 0), Animation.create(769), 20, 0.0, null, 1) + } + return true + } + + + } + return false + } + }) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/CrumblingWallShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/CrumblingWallShortcut.java new file mode 100644 index 000000000..a83adaa31 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/CrumblingWallShortcut.java @@ -0,0 +1,36 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; + +/** + * Handles a crumbling wall. + * @author Vexia + */ +@Initializable +public class CrumblingWallShortcut extends AgilityShortcut { + + /** + * Represents the locations used in this force movement. + */ + private static final Location[] LOCATIONS = new Location[] { new Location(2936, 3355, 0), new Location(2934, 3355, 0) }; + + /** + * Constructs a new {@Code CrumblingWallShortcut} {@Code + * Object} + */ + public CrumblingWallShortcut() { + super(new int[] { 11844 }, 5, 0.0, "climb-over"); + } + + @Override + public void run(Player player, GameObject object, String option, boolean failed) { + ForceMovement.run(player, player.getLocation().getX() >= 2936 ? LOCATIONS[0] : LOCATIONS[1], player.getLocation().getX() >= 2936 ? LOCATIONS[1] : LOCATIONS[0], Animation.create(839), 10); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/FaladorGrapplePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/FaladorGrapplePlugin.java new file mode 100644 index 000000000..41c00321d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/FaladorGrapplePlugin.java @@ -0,0 +1,145 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.tools.Items; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.skill.Skills; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents the plugin used to handle the grappling of the falador wall. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FaladorGrapplePlugin extends OptionHandler { + private static final HashMap REQUIREMENTS = new HashMap<>(); + private static String requirementsString; + + static { + REQUIREMENTS.putIfAbsent(Skills.AGILITY, 11); + REQUIREMENTS.putIfAbsent(Skills.RANGE, 19); + REQUIREMENTS.putIfAbsent(Skills.STRENGTH, 37); + + requirementsString = "You need at least " + + REQUIREMENTS.get(Skills.AGILITY) + " " + Skills.SKILL_NAME[Skills.AGILITY] + ", " + + REQUIREMENTS.get(Skills.RANGE) + " " + Skills.SKILL_NAME[Skills.RANGE] + ", and " + + REQUIREMENTS.get(Skills.STRENGTH) + " " + Skills.SKILL_NAME[Skills.STRENGTH] + + " to use this shortcut."; + } + + private static final int[] CBOWS = new int[]{ + Items.MITH_CROSSBOW_9181, + Items.ADAMANT_CROSSBOW_9183, + Items.RUNE_CROSSBOW_9185, + Items.DORGESHUUN_CBOW_8880 + }; + private static final Item MITH_GRAPPLE = new Item(9419); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(17049).getHandlers().put("option:grapple", this); + ObjectDefinition.forId(17050).getHandlers().put("option:grapple", this); + ObjectDefinition.forId(17051).getHandlers().put("option:jump", this); + ObjectDefinition.forId(17052).getHandlers().put("option:jump", this); + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + Location destination; + Location current = player.getLocation(); + + switch (option) { + case "jump": + ForceMovement.run(player, + current, + node.asObject().getId() == 17051 + ? Location.create(3033, 3390, 0) + : Location.create(3032, 3388, 0), + new Animation(7268), + 10); + break; + case "grapple": + destination = node.asObject().getId() == 17049 + ? Location.create(3033, 3389, 1) + : Location.create(3032, 3391, 1); + + for (Map.Entry e : REQUIREMENTS.entrySet()) { + if (player.getSkills().getLevel(e.getKey()) < e.getValue()) { + player.getDialogueInterpreter().sendDialogue(requirementsString); + return true; + } + } + + if (!player.getEquipment().containsAtLeastOneItem(CBOWS) || !player.getEquipment().containsItem(MITH_GRAPPLE)) { + player.getDialogueInterpreter().sendDialogue("You need a Mithril crossbow and a Mithril grapple in order to do this."); + return true; + } + + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 1; + Component tab; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.faceLocation(destination); + player.visualize(new Animation(4455), new Graphics(760, 100)); + break; + case 8: + tab = player.getInterfaceManager().getSingleTab(); + player.getInterfaceManager().openOverlay(new Component(115)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 11, 12); + break; + case 13: + player.getProperties().setTeleportLocation(destination); + break; + case 14: + player.getInterfaceManager().restoreTabs(); + if (tab != null) { + player.getInterfaceManager().openTab(tab); + } + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().close(); + player.unlock(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 1, 2); + return true; + } + return false; + } + }); + break; + } + return true; + } + + @Override + public Location getDestination(final Node moving, final Node destination) { + return destination.asObject().getId() == 17050 ? Location.create(3032, 3388, 0) : null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/FenceJumpShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/FenceJumpShortcut.java new file mode 100644 index 000000000..d842e0878 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/FenceJumpShortcut.java @@ -0,0 +1,65 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; + +/** + * Handles the fence jump shortcut. + * @author Vexia + */ +@Initializable +public class FenceJumpShortcut extends AgilityShortcut { + + /** + * Represents the running animation. + */ + private static final Animation RUNNING_ANIM = new Animation(1995); + + /** + * Represents the jumping animation. + */ + private static final Animation JUMP_ANIM = new Animation(1603); + + /** + * Represents the related locations used in this shortcut. format: (start, + * start, end, end + */ + private static final Location[] LOCATIONS = new Location[] { new Location(3240, 3331, 0), new Location(3240, 3338, 0), Location.create(3240, 3334, 0), Location.create(3240, 3335, 0) }; + + /** + * Constructs a new {@Code FenceJumpShortcut} {@Code Object} + */ + public FenceJumpShortcut() { + super(new int[] { 9300 }, 13, 0.0, "jump-over"); + } + + @Override + public void run(final Player player, GameObject object, String option, boolean failed) { + player.faceLocation(object.getLocation()); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.animate(JUMP_ANIM); + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 5); + return true; + } + }); + ForceMovement.run(player, player.getLocation().getY() >= 3335 ? LOCATIONS[1] : LOCATIONS[0], player.getLocation().getY() >= 3335 ? LOCATIONS[2] : LOCATIONS[3], RUNNING_ANIM, 18); + } + + @Override + public Location getDestination(Node node, Node n) { + Player player = node.asPlayer(); + return player.getLocation().getY() >= 3335 ? LOCATIONS[1] : LOCATIONS[0]; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/KaramjaGrapple.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/KaramjaGrapple.java new file mode 100644 index 000000000..5b4f8d31c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/KaramjaGrapple.java @@ -0,0 +1,145 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.tools.Items; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.skill.Skills; + +import java.util.HashMap; +import java.util.Map; + +@Initializable +public class KaramjaGrapple extends OptionHandler { + private static final HashMap REQUIREMENTS = new HashMap<>(); + private static final String requirementsString; + + static { + REQUIREMENTS.putIfAbsent(Skills.AGILITY, 53); + REQUIREMENTS.putIfAbsent(Skills.RANGE, 42); + REQUIREMENTS.putIfAbsent(Skills.STRENGTH, 21); + + requirementsString = "You need at least " + + REQUIREMENTS.get(Skills.AGILITY) + " " + Skills.SKILL_NAME[Skills.AGILITY] + ", " + + REQUIREMENTS.get(Skills.RANGE) + " " + Skills.SKILL_NAME[Skills.RANGE] + ", and " + + REQUIREMENTS.get(Skills.STRENGTH) + " " + Skills.SKILL_NAME[Skills.STRENGTH] + + " to use this shortcut."; + } + + private static final int[] CBOWS = new int[]{ + Items.MITH_CROSSBOW_9181, + Items.ADAMANT_CROSSBOW_9183, + Items.RUNE_CROSSBOW_9185, + Items.DORGESHUUN_CBOW_8880 + }; + private static final Item MITH_GRAPPLE = new Item(9419); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(17074).getHandlers().put("option:grapple", this); + // island tree 17074 +1 rope loop, +2 grappled one way, +3 grappled other way + // north tree 17056 +1 rope loop, +2 grappled + // south tree 17059 +1 rope loop, +2 grappled + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Location destination; + Location current = player.getLocation(); + GameObject startTree, endTree; + Direction direction; + if (current.getY() > 3134) { // starting at north side + startTree = RegionManager.getObject(Location.create(2874, 3144, 0)); + endTree = RegionManager.getObject(Location.create(2873, 3125, 0)); + destination = Location.create(2874, 3127, 0); + direction = Direction.SOUTH; + } else { + startTree = RegionManager.getObject(Location.create(2873, 3125, 0)); + endTree = RegionManager.getObject(Location.create(2874, 3144, 0)); + destination = Location.create(2874, 3142, 0); + direction = Direction.NORTH; + } + GameObject islandTree = RegionManager.getObject(Location.create(2873, 3134, 0)); + + + switch (option) { + case "grapple": + + for (Map.Entry e : REQUIREMENTS.entrySet()) { + if (player.getSkills().getLevel(e.getKey()) < e.getValue()) { + player.getDialogueInterpreter().sendDialogue(requirementsString); + return true; + } + } + + if (!player.getEquipment().containsAtLeastOneItem(CBOWS) || !player.getEquipment().containsItem(MITH_GRAPPLE)) { + player.getDialogueInterpreter().sendDialogue("You need a Mithril crossbow and a Mithril grapple in order to do this."); + return true; + } + + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 1; + Component tab; + + @Override + public boolean pulse() { + switch (counter++) { + // TODO animations not implemented. + // See ~11min in https://www.youtube.com/watch?v=qpB53rzYqrA + // don't know how to get ropes to show up. The tree objects have grapples and stuff but don't look like the video and aren't the right directions + // splash gfx are 68 and 69, not sure why there are two + // not sure what swimming animation is, could be 4464 thru 4468 + case 1: + player.faceLocation(player.getLocation().transform(direction)); + player.animate(new Animation(4230)); + break; + case 3: + //player.getPacketDispatch().sendPositionedGraphic(67, 10, 0, player.getLocation().transform(direction, 5)); // + break; + case 4: + //ObjectBuilder.replace(startTree, startTree.transform(startTree.getId() + 1), 10); + //ObjectBuilder.replace(islandTree, islandTree.transform(islandTree.getId() + 1), 10); + break; + case 5: + break; + case 13: + player.getProperties().setTeleportLocation(destination); + break; + case 14: + player.unlock(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 2, 6); + return true; + } + return false; + } + }); + break; + } + return true; + } + + @Override + public Location getDestination(final Node moving, final Node destination) { + // Run between tree and water before firing grapple + if (moving.getLocation().getY() > 3134) { // starting at north side + return Location.create(2874, 3142, 0); + } else { + return Location.create(2874, 3127, 0); + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/LogBalanceShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/LogBalanceShortcut.java new file mode 100644 index 000000000..0412e46f0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/LogBalanceShortcut.java @@ -0,0 +1,87 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the log balance shortcut. + * @author Vexia + */ +@Initializable +public class LogBalanceShortcut extends AgilityShortcut { + + /** + * The start and ending location. + */ + private Location start; + + /** + * The ending and start location. + */ + private Location end; + + /** + * Constructs a new {@Code LogBalanceShortcut} {@Code Object} + * @param ids the ids. + * @param level the level. + * @param experience the experience. + * @param options the options. + */ + public LogBalanceShortcut(int[] ids, int level, double experience, Location start, Location end, String... options) { + super(ids, level, experience, options); + this.start = start; + this.end = end; + } + + /** + * Constructs a new {@Code LogBalanceShortcut} {@Code Object} + */ + public LogBalanceShortcut() { + super(new int[] {}, 0, 0.0); + } + + @Override + public Plugin newInstance(Object arg) { + configure(new LogBalanceShortcut(new int[] { 2296 }, 20, 5, new Location(2598, 3477, 0), Location.create(2603, 3477, 0), "walk-across")); + // Sinclair mansion to Rellekka. 9324 is on the south side of the stream going north. + configure(new LogBalanceShortcut(new int[] { 9322, 9324 }, 48, 1, Location.create(2722, 3592, 0), Location.create(2722, 3596, 0), "walk-across")); + configure(new LogBalanceShortcut(new int[] { 35997, 35999 }, 33, 1, Location.create(2602, 3336, 0), Location.create(2598, 3336, 0), "walk-across")); + configure(new LogBalanceShortcut(new int[] { 2332 }, 1, 1, Location.create(2910, 3049, 0), Location.create(2906, 3049, 0), "cross")); + configure(new LogBalanceShortcut(new int[] { 3933 }, 45, 1, Location.create(2290, 3232, 0), Location.create(2290, 3239, 0), "cross")); + configure(new LogBalanceShortcut(new int[] { 3932 }, 45, 1, Location.create(2258, 3250, 0), Location.create(2264, 3250, 0), "cross")); + configure(new LogBalanceShortcut(new int[] { 3931 }, 45, 1, Location.create(2202, 3237, 0), Location.create(2196, 3237, 0), "cross")); + return this; + } + + @Override + public void run(Player player, GameObject object, String option, boolean failed) { + Location destination = start; + if (player.getLocation().getDistance(start) < player.getLocation().getDistance(end)) { + destination = end; + } + AgilityHandler.walk(player, -1, player.getLocation(), destination, Animation.create(155), getExperience(), null); + + // Seers Achievement Diary + if (destination.equals(new Location(2722,3596,0)) + && !player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(1,0)) { + player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).updateTask(player,1,0,true); + } + } + + @Override + public Location getDestination(Node node, Node n) { + if (node.getLocation().getDistance(start) < node.getLocation().getDistance(end)) { + return start; + } + return end; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.java new file mode 100644 index 000000000..d54501239 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/MonkeyBarShortcut.java @@ -0,0 +1,127 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.LocationLogoutTask; +import core.game.system.task.LogoutTask; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the monkey bar shortcut. + * @author Vexia + */ +@Initializable +public class MonkeyBarShortcut extends AgilityShortcut { + + /** + * Represents the location cache data for the monkey bars. + */ + private static final Location[][] MBAR_LOCATIONS = new Location[][] { { new Location(3120, 9969, 0), Location.create(3121, 9969, 0) }, { new Location(3119, 9969, 0), Location.create(3120, 9969, 0) }, { new Location(3120, 9964, 0), Location.create(3121, 9964, 0) }, { Location.create(3120, 9963, 0), Location.create(3120, 9964, 0) }, { new Location(2598, 9489, 0), new Location(2597, 9488, 0) }, { new Location(2598, 9489, 0), new Location(2600, 9488, 0) }, { new Location(2598, 9494, 0), new Location(2597, 9495, 0) }, { new Location(2599, 9494, 0), new Location(2600, 9495, 0) } }; + + /** + * Constructs a new {@Code MonkeyBarShortcut} {@Code Object} + */ + public MonkeyBarShortcut() { + super(new int[] { 29375 }, 1, 14.0, "swing across"); + } + + /** + * Constructs a new {@Code MonkeyBarShortcut} {@Code Object} + * @param ids the ids. + * @param level the level. + * @param experience the exp. + * @param option the option. + */ + public MonkeyBarShortcut(int[] ids, int level, double experience, String option) { + super(ids, level, experience, option); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + configure(new MonkeyBarShortcut(new int[] { 2321 }, 57, 20, "swing across")); + return super.newInstance(arg); + } + + @Override + public void run(final Player player, final GameObject object, String option, boolean failed) { + player.lock(5); + Direction direct = Direction.get((object.getDirection().toInteger() + 2) % 4); + if (object.getId() == 29375) { + if (direct == Direction.SOUTH && player.getLocation().getY() < 9969) { + direct = Direction.NORTH; + } else if (direct == Direction.NORTH && player.getLocation().getY() >= 9969) { + direct = Direction.SOUTH; + } + } else if (object.getId() == 2321) { + if (player.getLocation().getY() >= 9494) { + direct = Direction.SOUTH; + } else { + direct = Direction.NORTH; + } + } + player.getAppearance().setAnimations(Animation.create(745)); + final Location start = player.getLocation(); + final Direction dir = direct; + ForceMovement.run(player, start.transform(dir), start.transform(dir.getStepX() << 1, dir.getStepY() << 1, 0), Animation.create(742), Animation.create(744)); + player.addExtension(LogoutTask.class, new LocationLogoutTask(5, start)); + GameWorld.getPulser().submit(new Pulse(2, player) { + int count; + boolean failed; + + @Override + public boolean pulse() { + if (++count == 1) { + if (object.getId() == 2321 && (failed = AgilityHandler.hasFailed(player, 57, 0.01))) { + setDelay(1); + player.animate(Animation.create(743)); + return false; + } + setDelay(4); + AgilityHandler.walk(player, -1, player.getLocation().transform(dir), player.getLocation().transform(dir.getStepX() * 4, dir.getStepY() * 4, 0), Animation.create(662), 0.0, null); + player.addExtension(LogoutTask.class, new LocationLogoutTask(7, start)); + } else if (count == 2) { + if (failed) { + player.getAppearance().setAnimations(); + player.getAppearance().sync(); + AgilityHandler.fail(player, 2, new Location(2599, 9564, 0), Animation.create(768), RandomFunction.random(1, 3), null); + return true; + } + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(dir), Animation.create(743), 10, getExperience(), null); + return true; + } + return false; + } + }); + } + + @Override + public Location getDestination(Node n, Node node) { + if (node.getLocation().equals(new Location(2598, 9489, 0))) { + return new Location(2597, 9488, 0); + } else if (node.getLocation().equals(new Location(2598, 9494, 0))) { + return new Location(2597, 9495, 0); + } else if (node.getLocation().equals(new Location(2599, 9489, 0))) { + return new Location(2600, 9488, 0); + } + for (Location[] locations : MBAR_LOCATIONS) { + if (n.getLocation().equals(locations[0])) { + return locations[1]; + } + } + if (node.getLocation().equals(new Location(2598, 9489, 0)) || node.getLocation().equals(new Location(2599, 9489, 0))) { + return new Location(2600, 9495, 0); + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/PipeShortcut.kt b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/PipeShortcut.kt new file mode 100644 index 000000000..ea8a299e4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/PipeShortcut.kt @@ -0,0 +1,161 @@ +package core.game.node.entity.skill.agility.shortcuts + +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.agility.AgilityHandler +import core.game.node.entity.skill.agility.AgilityShortcut + +/** + * Handles a pipe shortcut. + * Quick overview of what's included: + * Pipe interactions, locations, animations + * Quick OBJ lookup for pipe shortcut (ps): + * ps2290, ps5099, ps5100, ps9293, ps20210, ps29370 + * Animations used: + * 10578: pipe enter(Due to tweening this one may cause issues, player standing up/it showing through the pipe, use 10580 instead) + * 10579: pipe exit, 10580: pipe enter + exit + * @author Woah + */ +@Initializable +class PipeShortcut : AgilityShortcut { + + /** + * Constructs a new {@Code PipeShortcut} {@Code Object} + */ + constructor() : super(intArrayOf(), 0, 0.0, "") + + /** + * Constructs a new {@Code PipeShortcut} {@Code Object} + * + * @param ids the ids. + * @param level the level. + * @param experience the experience. + * @param options the options. + */ + constructor(ids: IntArray?, level: Int, experience: Double, vararg options: String?) : super(ids, level, experience, *options) + + /** + * These are all the pipes that are deemed "Shortcuts" + * Note: Barbarian Outpost is included in this list because it is not apart of the + * Barbarian Outpost Agility Course. + */ + override fun newInstance(arg: Any?): Plugin { + configure(PipeShortcut(intArrayOf(2290), 49, 0.0, "squeeze-through")) //Yanille Dungeon + configure(PipeShortcut(intArrayOf(5099), 22, 8.5, "squeeze-through")) //Brimhaven Dungeon Pipe Red Dragons -> Black Demons + configure(PipeShortcut(intArrayOf(5100), 34, 10.0, "squeeze-through")) //Brimhaven Dungeon Pipe Moss Giants -> Moss Giants + configure(PipeShortcut(intArrayOf(9293), 70, 10.0, "squeeze-through")) //Taverley Dungeon + configure(PipeShortcut(intArrayOf(20210), 35, 10.0, "squeeze-through")) //Barbarian Outpost + configure(PipeShortcut(intArrayOf(29370), 51, 10.0, "squeeze-through")) //Edgeville Dungeon + return this + } + + /** + * Run for the main fire event + * Use this for unlocking achievement diaries + any other unlocks + */ + override fun run(player: Player, obj: GameObject, option: String, failed: Boolean) { + if (obj.id == 29370) + player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 2, 1) + + /** + * Pulse that starts the object interaction when clicked on one of these shortcuts + */ + GameWorld.Pulser.submit(object : Pulse(1, player) { + override fun pulse(): Boolean { + when (obj.id) { + + /** + * Quick breakdown of how Agility.forcewalk is used for pipe shortcuts: + * AgilityHandler.forceWalk(player, -1, player.location, pipeDestination(player, obj, 6), Animation.create(10580), 10, 0.0, null) + * + * player = player, the player that is being force-walked + * -1 = course index, should this be counted as an agility course +1? + * player.location, gets the player location (start of pipe) + * pipeDestination(player, obj, 6) = custom made for pipes, player = player, obj is getting the game object location, 6 is the amount to move forward. || More info found in AgilityShortcut.java + * Animation.create(10580) = what animation we should play when the user is interacting with that object + * 10 = speed at which the player moves through the object + * 0.0 = experience that we should award the player on successful completion* SET EXPERIENCE IN METHOD newInstance + * null = message that should be displayed when entering the object + */ + + /** + * Yanille Dungeon pipe (Obj id: 2290) LOC: (2577, 9506, 0) + * Taverley Dungeon pipe (Obj id: 9293) LOC: (2887, 9799, 0) + * Diagram: + * This one is pretty standard, does not to have X/Y checks because the pipe is built into the wall + * Player lock (standard 5 ticks for a 7 long pipe) + * Plays the get into + crawl + jump out of pipe animation + */ + 2290, 9293 -> { + player.lock(7) + AgilityHandler.forceWalk(player, -1, player.location, pipeDestination(player, obj, 6), Animation.create(10580), 10, 0.0, null) + player.animate(Animation(844), 4) + player.animate(Animation(10579), 5) + return true + } + + /** + * //Brimhaven Dungeon Pipe Red Dragons -> Black Demons (Obj id: 5099) LOC: (2698, 9498, 0) + * //Brimhaven Dungeon Pipe Moss Giants -> Moss Giants (Obj id: 5100) LOC: (2655, 9567, 0) + * Diagram: + * This one is pretty standard, does not to have X/Y checks because the pipe is built into the wall + * Player lock (standard 5 ticks for a 7 long pipe) + * Plays the get into + crawl + jump out of pipe animation + */ + 5099, 5100 -> { + player.lock(5) + AgilityHandler.forceWalk(player, -1, player.location, pipeDestination(player, obj, 7), Animation.create(10580), 10, 0.0, null) + player.animate(Animation(844), 5) + player.animate(Animation(10579), 6) + return true + } + + /** + * Barbarian Outpost Pipe (Obj id: 20210) LOC: (2552, 3560, 0) + * Diagram: + * If statement checks to see if the player is on the same X Axis as the pipe, by not having this here a player could enter + * the pipe at an angle and would be shot through the walls (kinda funny to watch) + * Player lock (standard 3 ticks for a 3 long pipe) + * plays the all-in-one animation for getting into + out of pipe + */ + 20210 -> { + if (player.location.x != 2552) { + player.packetDispatch.sendMessage("I can't get into this pipe at that angle.") + return true + } + player.lock(3) + AgilityHandler.forceWalk(player, -1, player.location, pipeDestination(player, obj, 3), Animation.create(10580), 15, 0.0, null) + return true + } + + /** + * Edgeville Dungeon Pipe (Obj id: 29370) LOC: (3150, 9906, 0) + * Diagram: + * If statement checks to see if the player is on the same Y Axis as the pipe, by not having this here a player could enter + * the pipe at an angle and would be shot through the walls + * Player lock (standard 7 ticks for a 6 long pipe) + * Plays the get into + crawl + jump out of pipe animation + */ + 29370 -> { + if (player.location.y != 9906) { + player.packetDispatch.sendMessage("I can't get into this pipe at that angle.") + return true + } + player.lock(7) + AgilityHandler.forceWalk(player, -1, player.location, pipeDestination(player, obj, 6), Animation.create(10580), 10, 0.0, null) + player.animate(Animation(844), 4) + player.animate(Animation(10579), 5) + return true + } + } + return false + } + }) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/RockClimbShortcut.kt b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/RockClimbShortcut.kt new file mode 100644 index 000000000..6a8a9eb07 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/RockClimbShortcut.kt @@ -0,0 +1,126 @@ +package core.game.node.entity.skill.agility.shortcuts + +import core.game.node.`object`.GameObject +import core.game.node.entity.impl.ForceMovement +import core.game.node.entity.player.Player +import core.game.world.map.Direction +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.agility.AgilityShortcut + +/** + * Handles the rock climbing shortcut. + * @author Sir Kermit + */ +@Initializable +class RockClimbShortcut +/** + * Constructs a new {@Code RockClimbShortcut} {@Code Object} + */ + : AgilityShortcut(intArrayOf( + 9335, + 9336, + 2231, + 26327, + 26328, + 26324, + 26323, + 19849, + 9296, + 9297 + ), 1, 0.0, "climb") + +{ + override fun run(player: Player, `object`: GameObject, option: String, failed: Boolean) { + //Scaling down + val ANIMATION = Animation(1148) + //Scaling Up + val SCALE = Animation(740) + //Gets level for Arandar climbs + val req = if (player.location.equals(2346, 3300, 0) || player.location.equals(2344, 3294, 0)){ + 59 + }else if (player.location.equals(2338, 3281, 0) || player.location.equals(2338, 3286, 0)){ + 85 + }else if (player.location.equals(2332, 3252, 0) || player.location.equals(2338, 3253, 0)){ + 68 + }else{0} + + when (`object`.id) { + 2231 -> if (player.location.x <= 2791) { + ForceMovement.run(player, `object`.location, `object`.location.transform(3, 0, 0), SCALE, SCALE, Direction.WEST, 13).endAnimation = Animation.RESET + } else { + ForceMovement.run(player, `object`.location, `object`.location.transform(-3, 0, 0), ANIMATION, ANIMATION, Direction.WEST, 13).endAnimation = Animation.RESET + } + + //Eagles Peak + 19849 -> if (player.location.x <= 2322) { + if (player.skills.hasLevel(Skills.AGILITY, 25)) { + ForceMovement.run(player, player.location, Location.create(2324, 3497, 0), SCALE, SCALE, Direction.SOUTH, 13).endAnimation = Animation.RESET + } else { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least 25 to do this.") + } + } else { + if (player.skills.hasLevel(Skills.AGILITY, 25)) { + ForceMovement.run(player, player.location, Location.create(2322, 3502, 0), ANIMATION, ANIMATION, Direction.SOUTH, 13).endAnimation = Animation.RESET + } else { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least 25 to do this.") + } + } + + 9335 -> ForceMovement.run(player, player.location, Location.create(3427, 3478, 0), SCALE, SCALE, Direction.WEST, 13).endAnimation = Animation.RESET + + 9336 -> ForceMovement.run(player, player.location, Location.create(3424, 3476, 0), ANIMATION, ANIMATION, Direction.WEST, 13).endAnimation = Animation.RESET + + //GodWars Shortcut + 26327 -> if (player.skills.hasLevel(Skills.AGILITY, 60)) { + ForceMovement.run(player, player.location, Location.create(2942, 3768, 0), SCALE, SCALE, Direction.WEST, 13).endAnimation = Animation.RESET + } else { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least 60 to do this.") + } + + //GodWars Shortcut + 26328 -> if (player.skills.hasLevel(Skills.AGILITY, 60)) { + ForceMovement.run(player, player.location, Location.create(2950, 3767, 0), ANIMATION, ANIMATION, Direction.WEST, 13).endAnimation = Animation.RESET + } else { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least 60 to do this.") + } + + //GodWars Shortcut + 26324 -> if (player.skills.hasLevel(Skills.AGILITY, 60)) { + ForceMovement.run(player, player.location, Location.create(2928, 3757, 0), SCALE, SCALE, Direction.NORTH, 13).endAnimation = Animation.RESET + } else { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least 60 to do this.") + } + + //GodWars Shortcut + 26323 -> if (player.skills.hasLevel(Skills.AGILITY, 60)) { + ForceMovement.run(player, player.location, Location.create(2927, 3761, 0), ANIMATION, ANIMATION, Direction.NORTH, 13).endAnimation = Animation.RESET + } else { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least 60 to do this.") + } + + //Arandar + 9297 -> if (player.skills.hasLevel(Skills.AGILITY, 59) && req == 59) { + ForceMovement.run(player, player.location, Location.create(2346, 3300, 0), SCALE, SCALE, Direction.NORTH, 13).endAnimation = Animation.RESET + } else if (player.skills.hasLevel(Skills.AGILITY, 85) && req == 85) { + ForceMovement.run(player, player.location, Location.create(2338, 3281, 0), SCALE, SCALE, Direction.SOUTH, 13).endAnimation = Animation.RESET + } else if (player.skills.hasLevel(Skills.AGILITY, 68) && req == 68) { + ForceMovement.run(player, player.location, Location.create(2332, 3252, 0), SCALE, SCALE, Direction.WEST, 13).endAnimation = Animation.RESET + } else { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least $req to do this.") + } + //Arandar + 9296 -> if (player.skills.hasLevel(Skills.AGILITY, 59) && req == 59) { + ForceMovement.run(player, player.location, Location.create(2344, 3294, 0), ANIMATION, ANIMATION, Direction.NORTH, 13).endAnimation = Animation.RESET + } else if (player.skills.hasLevel(Skills.AGILITY, 85) && req == 85) { + ForceMovement.run(player, player.location, Location.create(2338, 3286, 0), ANIMATION, ANIMATION, Direction.SOUTH, 13).endAnimation = Animation.RESET + } else if (player.skills.hasLevel(Skills.AGILITY, 68) && req == 68) { + ForceMovement.run(player, player.location, Location.create(2338, 3253, 0), ANIMATION, ANIMATION, Direction.WEST, 13).endAnimation = Animation.RESET + } else { + player.dialogueInterpreter.sendDialogue("You need an Agility level of at least $req to do this.") + } + } + } + } \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/RopeSwing.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/RopeSwing.java new file mode 100644 index 000000000..8c93864c5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/RopeSwing.java @@ -0,0 +1,45 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.skill.agility.AgilityHandler; + +@Initializable +public class RopeSwing extends UseWithHandler { + @Override + public boolean handle(NodeUsageEvent event) { + System.out.println("Trying to handle."); + if(event.getUsedWith() instanceof GameObject){ + GameObject object = event.getUsedWith().asObject(); + int objId = object.getId(); + + assert event.getUsedItem() != null; + int usedId = event.getUsedItem().getId(); + + Player player = event.getPlayer(); + + if(objId == 2327 && usedId == 954){ + if (!player.getLocation().withinDistance(object.getLocation(), 2)) { + player.sendMessage("I can't reach that."); + return true; + } + player.getPacketDispatch().sendObjectAnimation(object, Animation.create(497), true); + AgilityHandler.forceWalk(player, 0, player.getLocation(), Location.create(2505, 3087, 0), Animation.create(751), 50, 22, "You skillfully swing across.", 1); + return true; + } + } + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2327,OBJECT_TYPE,this); + return this; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut.kt b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut.kt new file mode 100644 index 000000000..78c835e45 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/SteppingStoneShortcut.kt @@ -0,0 +1,85 @@ +package core.game.node.entity.skill.agility.shortcuts + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.impl.ForceMovement +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +/** + * Handles the stepping stone shortcut. + * @author Ceikry + */ +@Initializable +class SteppingStoneShortcut : OptionHandler() { + private val stones = HashMap() + internal class SteppingStoneInstance(val pointA: Location, val pointB: Location, val option: String, val levelReq: Int) + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + val stone = stones[player.location] + stone ?: return false + + if(player.skills.getLevel(Skills.AGILITY) < stone.levelReq){ + player.sendMessage("You need an agility level of ${stone.levelReq} for this shortcut.") + return true + } + + val finalDest = when(player.location){ + stone.pointA -> stone.pointB + stone.pointB -> stone.pointA + else -> player.location + } + val offset = getOffset(player,finalDest) + player.debug("Offset: ${offset.first},${offset.second}") + player.pulseManager.run(object : Pulse(2){ + override fun pulse(): Boolean { + val there = player.location == finalDest + if(!there){ + ForceMovement.run(player,player.location,player.location.transform(offset.first,offset.second,0), ANIMATION,10) + } + return there + } + }) + return true + } + + fun getOffset(player: Player, location: Location): Pair{ + var diffX = location.x - player.location.x + var diffY = location.y - player.location.y + if(diffX > 1) diffX = 1 + if(diffX < -1) diffX = -1 + if(diffY > 1) diffY = 1 + if(diffY < -1) diffY = -1 + return Pair(diffX,diffY) + } + + fun configure(objects: IntArray, pointA: Location, pointB: Location, option: String, levelReq: Int){ + val instance = SteppingStoneInstance(pointA,pointB, option, levelReq) + objects.forEach { + ObjectDefinition.forId(it).handlers["option:$option"] = this + } + stones.put(pointA,instance) + stones.put(pointB, instance) + } + + override fun newInstance(arg: Any?): Plugin { + configure(intArrayOf(2335,2333),Location.create(2925,2947,0),Location.create(2925,2951,0),"cross",30) + configure(intArrayOf(9315),Location.create(3149, 3363, 0),Location.create(3154, 3363, 0),"jump-onto",31) + + return this + } + + companion object { + /** + * Represents the animation to use. + */ + private val ANIMATION = Animation(741) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/StileShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/StileShortcut.java new file mode 100644 index 000000000..97799431d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/StileShortcut.java @@ -0,0 +1,107 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.game.content.activity.ActivityManager; +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.interaction.MovementPulse; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Handles a stile shortcut. + * @author Vexia + */ +@Initializable +public class StileShortcut extends AgilityShortcut { + + /** + * Constructs a new {@Code StileShortcut} {@Code Object} + */ + public StileShortcut() { + super(new int[] { 993, 3730, 7527, 12982, 19222, 22302, 29460, 33842, 34776 }, 1, 0.0, false, 0.0, new String[] { "climb-over" }); + + } + + @Override + public void run(final Player player, final GameObject object, String option, boolean failed) { + player.getWalkingQueue().reset(); + Location loc = getLocation(player, object, true); + player.getWalkingQueue().addPath(loc.getX(), loc.getY()); + player.getPulseManager().run(new MovementPulse(player, loc) { + @Override + public boolean pulse() { + climb(player, object); + return true; + } + }, "movement"); + } + + /** + * Method used to climb the stile. + * @param player the player. + * @param object the object. + */ + public static void climb(final Player player, final GameObject object) { + player.lock(1); + int delay = 0; + GameWorld.getPulser().submit(new Pulse(delay, player) { + @Override + public boolean pulse() { + ForceMovement movement = new ForceMovement(player, getLocation(player, object, true), getLocation(player, object, false), Animation.create(839)) { + @Override + public void stop() { + super.stop(); + if (object.getId() == 19222) {// falconry. + handleFalconry(player, object); + } + } + }; + movement.run(player, 5); + return true; + } + }); + } + + /** + * Method used to get the end location. + * @param player the player. + * @param object the object. + * @param start if getting the start loc. + * @return the location. + */ + public static Location getLocation(final Player player, final GameObject object, boolean start) { + if ((object.getDirection() == Direction.NORTH || object.getDirection() == Direction.SOUTH)) { + if (player.getLocation().getY() <= object.getLocation().getY()) { + return start ? object.getLocation() : object.getLocation().transform(0, 1, 0); + } else { + return start ? object.getLocation().transform(0, 1, 0) : object.getLocation(); + } + } else { + if (player.getLocation().getX() <= object.getLocation().getX()) { + return start ? object.getLocation() : object.getLocation().transform(1, 0, 0); + } else { + return start ? object.getLocation().transform(1, 0, 0) : object.getLocation(); + } + } + } + + /** + * Method used to handle the falconry stile. + * @param player the player. + * @param object the object. + */ + private static void handleFalconry(final Player player, GameObject object) { + if (player.getLocation().equals(Location.create(2371, 3621, 0))) { + ActivityManager.start(player, "falconry", false); + } else { + ActivityManager.getActivity("falconry").leave(player, false); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut.java new file mode 100644 index 000000000..8629eed22 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/StrangeFloorShortcut.java @@ -0,0 +1,78 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the strange floor shortcut. + * @author Vexia + */ +@Initializable +public class StrangeFloorShortcut extends AgilityShortcut { + + /** + * Represents the running animation. + */ + private static final Animation RUNNING_ANIM = new Animation(1995); + + /** + * Represents the jumping animation. + */ + private static final Animation JUMP_ANIM = new Animation(1603); + + /** + * Constructs a new {@Code StrangeFloorShortcut} {@Code + * Object} + */ + public StrangeFloorShortcut() { + super(new int[] { 9294 }, 80, 0.0, "jump-over"); + } + + @Override + public void run(final Player player, GameObject object, String option, boolean failed) { + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.getAnimator().forceAnimation(JUMP_ANIM); + return true; + } + }); + GameWorld.getPulser().submit(new Pulse(2, player) { + + @Override + public boolean pulse() { + player.getAnimator().forceAnimation(RUNNING_ANIM); + return true; + } + + }); + ForceMovement.run(player, player.getLocation().getX() >= 2880 ? Location.create(2881, 9813, 0) : Location.create(2877, 9813, 0), player.getLocation().getX() >= 2880 ? Location.create(2877, 9813, 0) : Location.create(2881, 9813, 0), RUNNING_ANIM, 13); + + } + + @Override + public Location getDestination(Node node, Node n) { + return node.getLocation().getX() >= 2880 ? Location.create(2881, 9813, 0) : Location.create(2877, 9813, 0); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + configure(this); + return this; + } + + @Override + public void configure(AgilityShortcut shortcut) { + ObjectDefinition.forId(getIds()[0]).getHandlers().put("option:jump-over",this); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut.java new file mode 100644 index 000000000..5421ba01b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/TunnelShortcut.java @@ -0,0 +1,135 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles a tunnel shortcut. + * @author Vexia + */ +@Initializable +public class TunnelShortcut extends AgilityShortcut { + + /** + * The climbing down animation. + */ + private static final Animation CLIMB_DOWN = Animation.create(2589); + + /** + * The crawling through animation. + */ + private static final Animation CRAWL_THROUGH = Animation.create(2590); + + /** + * The climbing up animation. + */ + private static final Animation CLIMB_UP = Animation.create(2591); + + /** + * The increment offset. + */ + private int offset; + + /** + * Constructs a new {@Code TunnelShortcut} {@Code Object} + */ + public TunnelShortcut() { + super(new int[] {}, 0, 0.0); + } + + /** + * Constructs a new {@Code TunnelShortcut} {@Code Object} + * @param ids the ids. + * @param level the level. + * @param experience the experience. + * @param options the options. + */ + public TunnelShortcut(int[] ids, int level, double experience, int offset, String... options) { + super(ids, level, experience, options); + this.offset = offset; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + configure(new TunnelShortcut(new int[] { 9309, 9310 }, 26, 0.0, 0, "climb-into")); + configure(new TunnelShortcut(new int[] { 9302, 9301 }, 16, 0.0, 1, "climb-into", "climb-under")); + configure(new TunnelShortcut(new int[] { 14922 }, 1, 0.0, 1, "enter")); + return this; + } + + @Override + public void run(final Player player, GameObject object, String option, boolean failed) { + player.lock(6); + final GameObject o = object; + final Location start = player.getLocation(); + final Direction dir = Direction.getDirection(start, o.getLocation()); + if (object.getLocation().getX() == 2575) { + offset = 1; + } + ForceMovement.run(player, start, o.getLocation(), CLIMB_DOWN, 8); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 2: + player.animate(CRAWL_THROUGH); + player.getProperties().setTeleportLocation(start.transform(dir, 2 + offset)); + break; + case 5: + ForceMovement.run(player, player.getLocation(), start.transform(dir, 4 + offset), CLIMB_UP, 19); + break; + case 6: + player.animate(ForceMovement.WALK_ANIMATION); + if ((object.getId() == 9309 || object.getId() == 9310) && !player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(1,1)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player, 1, 1, true); + } + return true; + } + return false; + } + }); + } + + @Override + public Location getDestination(Node node, Node n) { + if (n.getId() == 14922) { + return n.getLocation().transform(getObjectDirection(n.asObject().getDirection()), 1); + } + return getStart(n.getLocation(), n.getDirection()); + } + + /** + * Gets the start location. + * @param location the location. + * @param dir the dir. + * @return the location. + */ + public Location getStart(Location location, Direction dir) { + switch (dir) { + case NORTH: + break; + case SOUTH: + break; + case EAST: + return location.transform(0, location.getY() == 3111 ? 1 : -1, 0); + case WEST: + return location.transform(0, 1, 0); + default: + return location; + } + return location; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/WaterOrbGrapple.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/WaterOrbGrapple.java new file mode 100644 index 000000000..8dccdb6aa --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/WaterOrbGrapple.java @@ -0,0 +1,128 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.tools.Items; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.skill.Skills; + +import java.util.HashMap; +import java.util.Map; + +@Initializable +public class WaterOrbGrapple extends OptionHandler { + private static final HashMap REQUIREMENTS = new HashMap<>(); + private static final String requirementsString; + + static { + REQUIREMENTS.putIfAbsent(Skills.AGILITY, 36); + REQUIREMENTS.putIfAbsent(Skills.RANGE, 39); + REQUIREMENTS.putIfAbsent(Skills.STRENGTH, 22); + + requirementsString = "You need at least " + + REQUIREMENTS.get(Skills.AGILITY) + " " + Skills.SKILL_NAME[Skills.AGILITY] + ", " + + REQUIREMENTS.get(Skills.RANGE) + " " + Skills.SKILL_NAME[Skills.RANGE] + ", and " + + REQUIREMENTS.get(Skills.STRENGTH) + " " + Skills.SKILL_NAME[Skills.STRENGTH] + + " to use this shortcut."; + } + + private static final int[] CBOWS = new int[]{ + Items.MITH_CROSSBOW_9181, + Items.ADAMANT_CROSSBOW_9183, + Items.RUNE_CROSSBOW_9185, + Items.DORGESHUUN_CBOW_8880 + }; + private static final Item MITH_GRAPPLE = new Item(9419); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(17062).getHandlers().put("option:grapple", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Location destination; + Location current = player.getLocation(); + GameObject rock = RegionManager.getObject(Location.create(2841, 3426, 0)); + GameObject tree = RegionManager.getObject(Location.create(2841, 3434, 0)); + System.out.println(rock); + System.out.println(tree); + + switch (option) { + case "grapple": + destination = Location.create(2841, 3433, 0); + + for (Map.Entry e : REQUIREMENTS.entrySet()) { + if (player.getSkills().getLevel(e.getKey()) < e.getValue()) { + player.getDialogueInterpreter().sendDialogue(requirementsString); + return true; + } + } + + if (!player.getEquipment().containsAtLeastOneItem(CBOWS) || !player.getEquipment().containsItem(MITH_GRAPPLE)) { + player.getDialogueInterpreter().sendDialogue("You need a Mithril crossbow and a Mithril grapple in order to do this."); + return true; + } + + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 1; + Component tab; + + @Override + public boolean pulse() { + switch (counter++) { + // TODO this animation sequence is wrong. sendPositionedGraphic doesn't work correctly, and rest of water crossing not well implemented + // See 4:24 in https://www.youtube.com/watch?v=O90y-N_vwTc + // rope gfx is 67 + // splash gfx are 68 and 69, not sure why there are two + // not sure what swimming animation is, could be 4464 thru 4468 + case 1: + player.faceLocation(destination); + player.animate(new Animation(4230)); + break; + case 3: + player.getPacketDispatch().sendPositionedGraphic(67, 10, 0, Location.create(2840,3427,0)); // + break; + case 4: + ObjectBuilder.replace(rock, rock.transform(rock.getId() + 1), 10); + ObjectBuilder.replace(tree, tree.transform(tree.getId() + 1), 10); + break; + case 5: + break; + case 13: + player.getProperties().setTeleportLocation(destination); + break; + case 14: + player.unlock(); + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 10); + return true; + } + return false; + } + }); + break; + } + return true; + } + + @Override + public Location getDestination(final Node moving, final Node destination) { + // Run between rock and stream before firing grapple + return Location.create(2841, 3427, 0); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/YanilleGrapple.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/YanilleGrapple.java new file mode 100644 index 000000000..504df9eaf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/YanilleGrapple.java @@ -0,0 +1,121 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.skill.Skills; + +import java.util.HashMap; +import java.util.Map; + +@Initializable +public class YanilleGrapple extends OptionHandler { + private static final HashMap REQUIREMENTS = new HashMap<>(); + private static String requirementsString; + + static { + REQUIREMENTS.putIfAbsent(Skills.AGILITY, 39); + REQUIREMENTS.putIfAbsent(Skills.RANGE, 21); + REQUIREMENTS.putIfAbsent(Skills.STRENGTH, 38); + + requirementsString = "You need at least " + + REQUIREMENTS.get(Skills.AGILITY) + " " + Skills.SKILL_NAME[Skills.AGILITY] + ", " + + REQUIREMENTS.get(Skills.RANGE) + " " + Skills.SKILL_NAME[Skills.RANGE] + ", and " + + REQUIREMENTS.get(Skills.STRENGTH) + " " + Skills.SKILL_NAME[Skills.STRENGTH] + + " to use this shortcut."; + } + + private static final Item MITH_CBOW = new Item(9181); + private static final Item MITH_GRAPPLE = new Item(9419); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(17047).getHandlers().put("option:grapple", this); + ObjectDefinition.forId(17048).getHandlers().put("option:jump", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Location destination; + Location current = player.getLocation(); + + switch (option) { + case "jump": + ForceMovement.run(player, + current, + current.getY() < 3074 ? Location.create(2556,3072,0) : Location.create(2556,3075,0), + new Animation(7268), + 10); + break; + case "grapple": + destination = current.getY() < 3073 + ? Location.create(2556, 3073, 1) + : Location.create(2556, 3074, 1); + + for (Map.Entry e : REQUIREMENTS.entrySet()) { + if (player.getSkills().getLevel(e.getKey()) < e.getValue()) { + player.getDialogueInterpreter().sendDialogue(requirementsString); + return true; + } + } + + if (!player.getEquipment().containsItem(MITH_CBOW) || !player.getEquipment().containsItem(MITH_GRAPPLE)) { + player.getDialogueInterpreter().sendDialogue("You need a Mithril crossbow and a Mithril grapple in order to do this."); + return true; + } + + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter = 1; + Component tab; + + @Override + public boolean pulse() { + switch (counter++) { + case 1: + player.faceLocation(destination); + player.visualize(new Animation(4455), new Graphics(760, 100)); + break; + case 8: + tab = player.getInterfaceManager().getSingleTab(); + player.getInterfaceManager().openOverlay(new Component(115)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 11, 12); + break; + case 13: + player.getProperties().setTeleportLocation(destination); + break; + case 14: + player.getInterfaceManager().restoreTabs(); + if (tab != null) { + player.getInterfaceManager().openTab(tab); + } + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().close(); + player.unlock(); + return true; + } + return false; + } + }); + break; + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/ZanarisSqueezeShortcut.java b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/ZanarisSqueezeShortcut.java new file mode 100644 index 000000000..dc11c0818 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/agility/shortcuts/ZanarisSqueezeShortcut.java @@ -0,0 +1,42 @@ +package core.game.node.entity.skill.agility.shortcuts; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityShortcut; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the zanaris cosmic altar shortcuts for runecrafters. + * @author Splinter + */ +@Initializable +public class ZanarisSqueezeShortcut extends AgilityShortcut { + + /** + * Represents the squeeze animation. + */ + private static final Animation ANIMATION = new Animation(2240); + + /** + * Constructs a new {@Code ZanarisSqueezeShortcut} {@Code Object} + */ + public ZanarisSqueezeShortcut() { + super(new int[] { 12127 }, 46, 0.0, "squeeze-past"); + } + + @Override + public void run(Player player, GameObject object, String option, boolean failed) { + if (player.getSkills().getLevel(Skills.AGILITY) < 66 && (object.getLocation().equals(new Location(2408, 4395)) || object.getLocation().equals(new Location(2415, 4402)))) { + player.getDialogueInterpreter().sendDialogue("You need an Agility level of at least 66 to negotiate this obstacle."); + return; + } + Location to = player.getLocation().getY() < object.getLocation().getY() ? object.getLocation().transform(0, 1, 0) : object.getLocation().transform(0, -1, 0); + Direction dir = player.getLocation().getY() < object.getLocation().getY() ? Direction.NORTH : Direction.SOUTH; + ForceMovement.run(player, player.getLocation(), to, ANIMATION, ANIMATION, dir, 13).setEndAnimation(Animation.RESET); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildHotspot.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildHotspot.java new file mode 100644 index 000000000..5c8577c43 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildHotspot.java @@ -0,0 +1,526 @@ +package core.game.node.entity.skill.construction; + +import core.game.world.update.flag.context.Animation; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Represents a building hotspot. + * @author Emperor + * + */ +public enum BuildHotspot { + + /** + * Low level garden hotspots. + */ + CENTREPIECE_1(15361, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.PORTAL, Decoration.ROCK, Decoration.POND, Decoration.IMP_STATUE, Decoration.DUNGEON_ENTRANCE), + BIG_TREE_1(15362, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.BIG_DEAD_TREE, Decoration.BIG_TREE, Decoration.BIG_OAK_TREE, Decoration.BIG_WILLOW_TREE, Decoration.BIG_MAPLE_TREE, Decoration.BIG_YEW_TREE, Decoration.BIG_MAGIC_TREE), + TREE_1(15363, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.DEAD_TREE, Decoration.TREE, Decoration.OAK_TREE, Decoration.WILLOW_TREE, Decoration.MAPLE_TREE, Decoration.YEW_TREE, Decoration.MAGIC_TREE), + BIG_PLANT_1(15364, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.FERN, Decoration.BUSH, Decoration.TALL_PLANT), + BIG_PLANT_2(15365, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.SHORT_PLANT, Decoration.LARGE_LEAF_PLANT, Decoration.HUGE_PLANT), + SMALL_PLANT_1(15366, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.PLANT, Decoration.SMALL_FERN, Decoration.FERN_SP), + SMALL_PLANT_2(15367, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.DOCK_LEAF, Decoration.THISTLE, Decoration.REEDS), + + /** + * Low level Parlor hotspots. + */ + CHAIRS_1(15410, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CRUDE_CHAIR,Decoration.WOODEN_CHAIR, Decoration.ROCKING_CHAIR, Decoration.OAK_CHAIR, Decoration.OAK_ARMCHAIR, Decoration.TEAK_ARMCHAIR, Decoration.MAHOGANY_ARMCHAIR), + CHAIRS_2(15411, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CRUDE_CHAIR, Decoration.WOODEN_CHAIR,Decoration.ROCKING_CHAIR, Decoration.OAK_CHAIR, Decoration.OAK_ARMCHAIR, Decoration.TEAK_ARMCHAIR, Decoration.MAHOGANY_ARMCHAIR), + CHAIRS_3(15412, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CRUDE_CHAIR, Decoration.WOODEN_CHAIR,Decoration.ROCKING_CHAIR, Decoration.OAK_CHAIR, Decoration.OAK_ARMCHAIR, Decoration.TEAK_ARMCHAIR, Decoration.MAHOGANY_ARMCHAIR), + FIREPLACE(15418, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CLAY_FIREPLACE, Decoration.STONE_FIREPLACE,Decoration.MARBLE_FIREPLACE), + FIREPLACE2(15267, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CLAY_FIREPLACE, Decoration.STONE_FIREPLACE,Decoration.MARBLE_FIREPLACE), + CURTAINS(15419, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_MID_ANIM, Decoration.TORN_CURTAINS, Decoration.CURTAINS, Decoration.OPULENT_CURTAINS), + BOOKCASE(15416, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.WOODEN_BOOKCASE, Decoration.OAK_BOOKCASE, Decoration.MAHOGANY_BOOKCASE), + RUG(15415, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_CORNER, Decoration.RED_RUG_CORNER, Decoration.OPULENT_RUG_CORNER), + RUG2(15414, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_END, Decoration.RED_RUG_END, Decoration.OPULENT_RUG_END), + RUG3(15413, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_CENTER, Decoration.RED_RUG_CENTER, Decoration.OPULENT_RUG_CENTER), + + /** + * Low level Kitchen hotspots. + */ + LARDER(15403, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.WOODEN_LARDER, Decoration.OAK_LARDER,Decoration.TEAK_LARDER), + SINK(15404, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.PUMP_AND_DRAIN, Decoration.PUMP_AND_TUB, Decoration.SINK), + KITCHEN_TABLE(15405, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.KITCHEN_WOODEN_TABLE,Decoration.KITCHEN_OAK_TABLE, Decoration.KITCHEN_TEAK_TABLE), + CAT_BLANKET(15402, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CAT_BLANKET, Decoration.CAT_BASKET,Decoration.CAST_BASKET_CUSHIONED), + STOVE(15398, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.BASIC_FIREPIT, Decoration.FIREPIT_WITH_HOOK, Decoration.FIREPIT_WITH_POT, Decoration.SMALL_OVEN, Decoration.LARGE_OVEN, Decoration.BASIC_RANGE, Decoration.FANCY_RANGE), + SHELVES(15400, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.WOODEN_SHELVES_1,Decoration.WOODEN_SHELVES_2, Decoration.WOODEN_SHELVES_3,Decoration.OAK_SHELVES_1, Decoration.OAK_SHELVES_2, Decoration.TEAK_SHELVES_1, Decoration.TEAK_SHELVES_2), + SHELVES_2(15399, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.WOODEN_SHELVES_1,Decoration.WOODEN_SHELVES_2, Decoration.WOODEN_SHELVES_3,Decoration.OAK_SHELVES_1, Decoration.OAK_SHELVES_2,Decoration.TEAK_SHELVES_1, Decoration.TEAK_SHELVES_2), + BARRELS(15401, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.BASIC_BEER_BARREL, Decoration.CIDER_BARREL,Decoration.ASGARNIAN_ALE_BARREL, Decoration.GREENMANS_ALE_BARREL,Decoration.DRAGON_BITTER_BARREL, Decoration.CHEFS_DELIGHT_BARREL), + + /** + * Low-level Dining hotspots. + */ + FIREPLACE_DINING(15301, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CLAY_FIREPLACE, Decoration.STONE_FIREPLACE, Decoration.MARBLE_FIREPLACE), + DINING_TABLE(15298, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.DINING_TABLE_WOOD, Decoration.DINING_TABLE_OAK, Decoration.DINING_TABLE_CARVED_OAK, Decoration.DINING_TABLE_TEAK,Decoration.DINING_TABLE_CARVED_TEAK, Decoration.DINING_TABLE_MAHOGANY,Decoration.DINING_TABLE_OPULENT), + DINING_CURTAINS(15302, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_MID_ANIM, Decoration.TORN_CURTAINS, Decoration.CURTAINS, Decoration.OPULENT_CURTAINS), + DINING_BENCH_1(15300, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_MID_ANIM, Decoration.BENCH_WOODEN, Decoration.BENCH_OAK, Decoration.BENCH_CARVED_OAK, Decoration.BENCH_TEAK, Decoration.BENCH_CARVED_TEAK, Decoration.BENCH_MAHOGANY, Decoration.BENCH_GILDED), + DINING_BENCH_2(15299, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_MID_ANIM, Decoration.BENCH_WOODEN, Decoration.BENCH_OAK, Decoration.BENCH_CARVED_OAK, Decoration.BENCH_TEAK, Decoration.BENCH_CARVED_TEAK, Decoration.BENCH_MAHOGANY,Decoration.BENCH_GILDED), + ROPE_BELL_PULL(15304, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.ROPE_PULL, Decoration.BELL_PULL, Decoration.FANCY_BELL_PULL), + WALL_DECORATION(15303, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_DECORATION, Decoration.TEAK_DECORATION, Decoration.GILDED_DECORATION), + + /** + * Low-level Work shop hotspots. + */ + REPAIR(15448, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.REPAIR_BENCH, Decoration.WHETSTONE, Decoration.ARMOUR_STAND), + WORKBENCH(15439, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.WORKBENCH_WOODEN, Decoration.WORKBENCH_OAK,Decoration.WORKBENCH_STEEL_FRAME, Decoration.WORKBENCH_WITH_VICE,Decoration.WORKBENCH_WITH_LATHE), + CRAFTING(15441, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CRAFTING_TABLE_1, Decoration.CRAFTING_TABLE_2,Decoration.CRAFTING_TABLE_3, Decoration.CRAFTING_TABLE_4), + TOOL1(15443, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.TOOL_STORE_1, Decoration.TOOL_STORE_2, Decoration.TOOL_STORE_3, Decoration.TOOL_STORE_4, Decoration.TOOL_STORE_5), + TOOL2(15444, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.TOOL_STORE_1, Decoration.TOOL_STORE_2,Decoration.TOOL_STORE_3, Decoration.TOOL_STORE_4,Decoration.TOOL_STORE_5), + TOOL3(15445, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.TOOL_STORE_1, Decoration.TOOL_STORE_2,Decoration.TOOL_STORE_3, Decoration.TOOL_STORE_4,Decoration.TOOL_STORE_5), + TOOL4(15446, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.TOOL_STORE_1, Decoration.TOOL_STORE_2,Decoration.TOOL_STORE_3, Decoration.TOOL_STORE_4,Decoration.TOOL_STORE_5), + TOOL5(15447, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.TOOL_STORE_1, Decoration.TOOL_STORE_2,Decoration.TOOL_STORE_3, Decoration.TOOL_STORE_4,Decoration.TOOL_STORE_5), + HERALDRY(15450, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.PLUMING_STAND, Decoration.SHIELD_EASEL,Decoration.BANNER_EASEL), + + /** + * Bedroom hotspots. + */ + BED(15260, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.WOODEN_BED, Decoration.OAK_BED, Decoration.LARGE_OAK_BED, Decoration.TEAK_BED, Decoration.LARGE_TEAK_BED, Decoration.FOUR_POSTER, Decoration.GILDED_FOUR_POSTER), + CLOCK(15268, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_CLOCK, Decoration.TEAK_CLOCK, Decoration.GILDED_CLOCK), + DRESSER(15262, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.SHAVING_STAND, Decoration.OAK_SHAVING_STAND, Decoration.OAK_DRESSER, Decoration.TEAK_DRESSER, Decoration.FANCY_TEAK_DRESSER, Decoration.MAHOGANY_DRESSER, Decoration.GILDED_DRESSER), + DRAWERS(15261, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.SHOE_BOX, Decoration.OAK_DRAWERS, Decoration.OAK_WARDROBE, Decoration.TEAK_DRAWERS, Decoration.TEAK_WARDROBE, Decoration.MAHOGANY_WARDROBE, Decoration.GILDED_WARDROBE), + BEDROOM_CURTAINS(15263, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_MID_ANIM, Decoration.TORN_CURTAINS, Decoration.CURTAINS, Decoration.OPULENT_CURTAINS), + BEDROOM_RUG(15264, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_CENTER, Decoration.RED_RUG_CENTER, Decoration.OPULENT_RUG_CENTER), + BEDROOM_RUG2(15265, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_END, Decoration.RED_RUG_END, Decoration.OPULENT_RUG_END), + BEDROOM_RUG3(15266, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_CORNER, Decoration.RED_RUG_CORNER, Decoration.OPULENT_RUG_CORNER), + + /** + * Skill hall hotspots. + */ + ARMOUR_SPACE(15385, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.MITHRIL_ARMOUR, Decoration.ADAMANT_ARMOUR, Decoration.RUNE_ARMOUR), + ARMOUR_SPACE2(15384, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.MITHRIL_ARMOUR, Decoration.ADAMANT_ARMOUR, Decoration.RUNE_ARMOUR), + HEAD_TROPHY(15382, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.CRAWLING_HAND, Decoration.COCKATRICE_HEAD, Decoration.BASILISK_HEAD, Decoration.KURASK_HEAD, Decoration.ABYSSAL_DEMON_HEAD, Decoration.KBD_HEAD, Decoration.KQ_HEAD), + RUNE_CASE(15386, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.RUNE_CASE1, Decoration.RUNE_CASE2), + FISHING_TROPHY(15383, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.MOUNTED_BASS, Decoration.MOUNTED_SWORDFISH, Decoration.MOUNTED_SHARK), + HALL_RUG(15377, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_CENTER, Decoration.RED_RUG_CENTER, Decoration.OPULENT_RUG_CENTER), + HALL_RUG2(15378, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_END, Decoration.RED_RUG_END, Decoration.OPULENT_RUG_END), + HALL_RUG3(15379, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_CORNER, Decoration.RED_RUG_CORNER, Decoration.OPULENT_RUG_CORNER), + + /** + * Games room hotspots. + */ + RANGING_GAME(15346, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.HOOP_AND_STICK, Decoration.DARTBOARD, Decoration.ARCHERY_TARGET), + ATTACK_STONE(15344, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CLAY_STONE, Decoration.LIMESTONE_STONE, Decoration.MARBLE_STONE), + PRIZE_CHEST(15343, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_CHEST, Decoration.TEAK_CHEST, Decoration.MAHOGANY_CHEST), + ELEMENTAL_BALANCE(15345, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.BALANCE_1, Decoration.BALANCE_2, Decoration.BALANCE_3), + GAME_SPACE(15342, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.JESTER, Decoration.TREASURE_HUNT, Decoration.HANGMAN), + + /** + * Portal room hotspots. + */ + TELEPORT_FOCUS(15409, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.TELEPORT_FOCUS, Decoration.GREATER_TELEPORT_FOCUS, Decoration.SCRYING_POOL), + PORTAL1(15406, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.TEAK_PORTAL, Decoration.MAHOGANY_PORTAL, Decoration.MARBLE_PORTAL, + Decoration.TEAK_VARROCK_PORTAL, + Decoration.MAHOGANY_VARROCK_PORTAL, + Decoration.MARBLE_VARROCK_PORTAL, + Decoration.TEAK_LUMBRIDGE_PORTAL, + Decoration.MAHOGANY_LUMBRIDGE_PORTAL, + Decoration.MARBLE_LUMBRIDGE_PORTAL, + Decoration.TEAK_FALADOR_PORTAL, + Decoration.MAHOGANY_FALADOR_PORTAL, + Decoration.MARBLE_FALADOR_PORTAL, + Decoration.TEAK_CAMELOT_PORTAL, + Decoration.MAHOGANY_CAMELOT_PORTAL, + Decoration.MARBLE_CAMELOT_PORTAL, + Decoration.TEAK_ARDOUGNE_PORTAL, + Decoration.MAHOGANY_ARDOUGNE_PORTAL, + Decoration.MARBLE_ARDOUGNE_PORTAL, + Decoration.TEAK_YANILLE_PORTAL, + Decoration.MAHOGANY_YANILLE_PORTAL, + Decoration.MARBLE_YANILLE_PORTAL, + Decoration.TEAK_KHARYRLL_PORTAL, + Decoration.MAHOGANY_KHARYRLL_PORTAL, + Decoration.MARBLE_KHARYRLL_PORTAL), + PORTAL2(15407, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.TEAK_PORTAL, Decoration.MAHOGANY_PORTAL, Decoration.MARBLE_PORTAL, + Decoration.TEAK_VARROCK_PORTAL, + Decoration.MAHOGANY_VARROCK_PORTAL, + Decoration.MARBLE_VARROCK_PORTAL, + Decoration.TEAK_LUMBRIDGE_PORTAL, + Decoration.MAHOGANY_LUMBRIDGE_PORTAL, + Decoration.MARBLE_LUMBRIDGE_PORTAL, + Decoration.TEAK_FALADOR_PORTAL, + Decoration.MAHOGANY_FALADOR_PORTAL, + Decoration.MARBLE_FALADOR_PORTAL, + Decoration.TEAK_CAMELOT_PORTAL, + Decoration.MAHOGANY_CAMELOT_PORTAL, + Decoration.MARBLE_CAMELOT_PORTAL, + Decoration.TEAK_ARDOUGNE_PORTAL, + Decoration.MAHOGANY_ARDOUGNE_PORTAL, + Decoration.MARBLE_ARDOUGNE_PORTAL, + Decoration.TEAK_YANILLE_PORTAL, + Decoration.MAHOGANY_YANILLE_PORTAL, + Decoration.MARBLE_YANILLE_PORTAL, + Decoration.TEAK_KHARYRLL_PORTAL, + Decoration.MAHOGANY_KHARYRLL_PORTAL, + Decoration.MARBLE_KHARYRLL_PORTAL), + PORTAL3(15408, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.TEAK_PORTAL, Decoration.MAHOGANY_PORTAL, Decoration.MARBLE_PORTAL, + Decoration.TEAK_VARROCK_PORTAL, + Decoration.MAHOGANY_VARROCK_PORTAL, + Decoration.MARBLE_VARROCK_PORTAL, + Decoration.TEAK_LUMBRIDGE_PORTAL, + Decoration.MAHOGANY_LUMBRIDGE_PORTAL, + Decoration.MARBLE_LUMBRIDGE_PORTAL, + Decoration.TEAK_FALADOR_PORTAL, + Decoration.MAHOGANY_FALADOR_PORTAL, + Decoration.MARBLE_FALADOR_PORTAL, + Decoration.TEAK_CAMELOT_PORTAL, + Decoration.MAHOGANY_CAMELOT_PORTAL, + Decoration.MARBLE_CAMELOT_PORTAL, + Decoration.TEAK_ARDOUGNE_PORTAL, + Decoration.MAHOGANY_ARDOUGNE_PORTAL, + Decoration.MARBLE_ARDOUGNE_PORTAL, + Decoration.TEAK_YANILLE_PORTAL, + Decoration.MAHOGANY_YANILLE_PORTAL, + Decoration.MARBLE_YANILLE_PORTAL, + Decoration.TEAK_KHARYRLL_PORTAL, + Decoration.MAHOGANY_KHARYRLL_PORTAL, + Decoration.MARBLE_KHARYRLL_PORTAL), + + /** + * Quest Hall hotspots. + */ + GUILD_TROPHY(15394, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.ANTIDRAGON_SHIELD, Decoration.AMULET_OF_GLORY, Decoration.CAPE_OF_LEGENDS), + PORTRAIT(15392, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.KING_ARTHUR, Decoration.ELENA, Decoration.GIANT_DWARF, Decoration.MISCELLANIANS), + LANDSCAPE(15393, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.LUMBRIDGE, Decoration.THE_DESERT, Decoration.MORYTANIA, Decoration.KARAMJA, Decoration.ISAFDAR), + SWORD(15395, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.SILVERLIGHT, Decoration.EXCALIBUR, Decoration.DARKLIGHT), + MAP(15396, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.SMALL_MAP, Decoration.MEDIUM_MAP, Decoration.LARGE_MAP), + BOOKCASE2(15397, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.WOODEN_BOOKCASE, Decoration.OAK_BOOKCASE, Decoration.MAHOGANY_BOOKCASE), + + /** + * Manegerie Hotspots + */ + OBELISK(44911, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.MINI_OBELISK), + PET_FEEDER(44910, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_PET_FEEDER, Decoration.TEAK_PET_FEEDER, Decoration.MAHOGANY_PET_FEEDER), + PET_HOUSE(44909, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_PET_HOUSE, Decoration.TEAK_PET_HOUSE, Decoration.MAHOGANY_PET_HOUSE, Decoration.CONSECRATED_PET_HOUSE, Decoration.DESECRATED_PET_HOUSE, Decoration.NATURAL_PET_HOUSE), + HABITAT_1(44907, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.GARDEN_HABITAT, Decoration.JUNGLE_HABITAT, Decoration.DESERT_HABITAT, Decoration.POLAR_HABITAT, Decoration.VOLCANIC_HABITAT), + HABITAT_2(44908, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.GARDEN_HABITAT, Decoration.JUNGLE_HABITAT, Decoration.DESERT_HABITAT, Decoration.POLAR_HABITAT, Decoration.VOLCANIC_HABITAT), + + + /** + * Combat room hotspots. + */ + WALL_DECORATION2(15297, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_DECORATION, Decoration.TEAK_DECORATION, Decoration.GILDED_DECORATION), + STORAGE_SPACE(15296, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.GLOVE_RACK, Decoration.WEAPONS_RACK, Decoration.EXTRA_WEAPONS_RACK), + CR_RING(15277, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_RING, Decoration.FENCING_RING, Decoration.COMBAT_RING, Decoration.NOTHING, Decoration.NOTHING2), + CR_CORNER(15278, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_RING, Decoration.FENCING_RING, Decoration.COMBAT_RING, Decoration.NOTHING, Decoration.NOTHING2), + CR_CORNER2(15279, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_RING, Decoration.FENCING_RING, Decoration.COMBAT_RING, Decoration.NOTHING, Decoration.NOTHING2), + CR_RING3(15280, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_RING, Decoration.FENCING_RING, Decoration.COMBAT_RING, Decoration.NOTHING, Decoration.MAGIC_BARRIER), + CR_CORNER3(15281, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_RING, Decoration.FENCING_RING, Decoration.COMBAT_RING, Decoration.NOTHING, Decoration.NOTHING2), + CR_CORNER4(15282, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_RING, Decoration.FENCING_RING, Decoration.COMBAT_RING, Decoration.NOTHING, Decoration.NOTHING2), + CR_INVISIBLE_WALL(15283, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.INVISIBLE_WALL, Decoration.INVISIBLE_WALL, Decoration.INVISIBLE_WALL, Decoration.INVISIBLE_WALL, Decoration.MAGIC_BARRIER), + CR_INVISIBLE_WALL2(15284, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.INVISIBLE_WALL2, Decoration.INVISIBLE_WALL2, Decoration.INVISIBLE_WALL2, Decoration.INVISIBLE_WALL2, Decoration.MAGIC_BARRIER), + CR_INVISIBLE_WALL3(15285, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.INVISIBLE_WALL3, Decoration.INVISIBLE_WALL3, Decoration.INVISIBLE_WALL3, Decoration.INVISIBLE_WALL3, Decoration.MAGIC_BARRIER), + CR_RING4(15286, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_RING, Decoration.FENCING_RING, Decoration.COMBAT_RING, Decoration.NOTHING, Decoration.NOTHING2), + CR_RING2(15287, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_RING, Decoration.FENCING_RING, Decoration.COMBAT_RING, Decoration.NOTHING, Decoration.MAGIC_BARRIER), + CR_FLOOR(15288, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_MAT_SIDE, Decoration.FENCING_MAT_SIDE, Decoration.COMBAT_MAT_SIDE, Decoration.BALANCE_BEAM_CENTER, Decoration.NOTHING2), + CR_FLOOR2(15289, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_MAT_CORNER, Decoration.FENCING_MAT_CORNER, Decoration.COMBAT_MAT_CORNER, Decoration.BALANCE_BEAM_RIGHT, Decoration.NOTHING2), + CR_FLOOR3(15290, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_MAT_CORNER, Decoration.FENCING_MAT_CORNER, Decoration.COMBAT_MAT_CORNER, Decoration.BALANCE_BEAM_LEFT, Decoration.RANGING_PEDESTALS), + CR_FLOOR4(15291, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_MAT_SIDE, Decoration.FENCING_MAT_SIDE, Decoration.COMBAT_MAT_SIDE, Decoration.NOTHING, Decoration.NOTHING2), + CR_FLOOR5(15292, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_MAT, Decoration.FENCING_MAT, Decoration.COMBAT_MAT, Decoration.NOTHING, Decoration.NOTHING2), + CR_FLOOR6(15293, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_MAT_SIDE, Decoration.FENCING_MAT_SIDE, Decoration.COMBAT_MAT_SIDE, Decoration.NOTHING, Decoration.NOTHING2), + CR_FLOOR7(15294, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_MAT_CORNER, Decoration.FENCING_MAT_CORNER, Decoration.COMBAT_MAT_CORNER, Decoration.NOTHING, Decoration.NOTHING2), + CR_FLOOR8(15295, BuildHotspotType.LINKED, BuildingUtils.BUILD_MID_ANIM, Decoration.BOXING_MAT_CORNER, Decoration.FENCING_MAT_CORNER, Decoration.COMBAT_MAT_CORNER, Decoration.NOTHING, Decoration.RANGING_PEDESTALS), + + /** + * Quest hall hotspots. + */ + Q_HALL_RUG(15387, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_CENTER, Decoration.RED_RUG_CENTER, Decoration.OPULENT_RUG_CENTER), + Q_HALL_RUG2(15388, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_END, Decoration.RED_RUG_END, Decoration.OPULENT_RUG_END), + Q_HALL_RUG3(15389, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_CORNER, Decoration.RED_RUG_CORNER, Decoration.OPULENT_RUG_CORNER), + + + /** + * Study hotspots. + */ + GLOBE(15421, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.GLOBE, Decoration.ORNAMENTAL_GLOBE, Decoration.LUNAR_GLOBE, Decoration.CELESTIAL_GLOBE, Decoration.ARMILLARY_SPHERE, Decoration.SMALL_ORREY, Decoration.LARGE_ORREY), + LECTERN(15420, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_LECTERN, Decoration.EAGLE_LECTERN, Decoration.DEMON_LECTERN, Decoration.TEAK_EAGLE_LECTERN, Decoration.TEAK_DEMON_LECTERN, Decoration.MAHOGANY_EAGLE_LECTERN, Decoration.MAHOGANY_DEMON_LECTERN), + CRYSTAL_BALL(15422, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.CRYSTAL_BALL, Decoration.ELEMENTAL_SPHERE, Decoration.CRYSTAL_OF_POWER), + BOOKCASE3(15425, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.WOODEN_BOOKCASE, Decoration.OAK_BOOKCASE, Decoration.MAHOGANY_BOOKCASE), + WALL_CHART(15423, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.ALCHEMICAL_CHART, Decoration.ASTRONOMICAL_CHART, Decoration.INFERNAL_CHART), + TELESCOPE(15424, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.TELESCOPE1, Decoration.TELESCOPE2, Decoration.TELESCOPE3), + + /** + * Costume room hotspots. + */ + TREASURE_CHEST(18813, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_TREASURE_CHEST, Decoration.TEAK_TREASURE_CHEST, Decoration.MAHOGANY_TREASURE_CHEST), + ARMOUR_CASE(18815, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_ARMOUR_CASE, Decoration.TEAK_ARMOUR_CASE, Decoration.MGANY_ARMOUR_CASE), + MAGIC_WARDROBE(18811, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_MAGIC_WARDROBE, Decoration.C_OAK_MAGIC_WARDROBE, Decoration.TEAK_MAGIC_WARDROBE, Decoration.C_TEAK_MAGIC_WARDROBE, Decoration.MGANY_MAGIC_WARDROBE, Decoration.GILDED_MAGIC_WARDROBE, Decoration.MARBLE_MAGIC_WARDROBE), + CAPE_RACK(18810, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_CAPE_RACK, Decoration.TEAK_CAPE_RACK, Decoration.MGANY_CAPE_RACK, Decoration.GILDED_CAPE_RACK, Decoration.MARBLE_CAPE_RACK, Decoration.MAGIC_CAPE_RACK), + TOY_BOX(18812, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_TOY_BOX, Decoration.TEAK_TOY_BOX, Decoration.MAHOGANY_TOY_BOX), + COSTUME_BOX(18814, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_COSTUME_BOX, Decoration.TEAK_COSTUME_BOX, Decoration.MAHOGANY_COSTUME_BOX), + + /** + * Chapel hotspots. + */ + ALTAR(15270, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_ALTAR, Decoration.TEAK_ALTAR, Decoration.CLOTH_ALTAR, Decoration.MAHOGANY_ALTAR, Decoration.LIMESTONE_ALTAR, Decoration.MARBLE_ALTAR, Decoration.GILDED_ALTAR), + STATUE(15275, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.SMALL_STATUE, Decoration.MEDIUM_STATUE, Decoration.LARGE_STATUE), + MUSICAL(15276, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.WINDCHIMES, Decoration.BELLS, Decoration.ORGAN), + ICON(15269, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.SARADOMIN_SYMBOL, Decoration.ZAMORAK_SYMBOL, Decoration.GUTHIX_SYMBOL, Decoration.SARADOMIN_ICON, Decoration.ZAMORAK_ICON, Decoration.GUTHIX_ICON, Decoration.ICON_OF_BOB), + BURNERS(15271, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_MID_ANIM, Decoration.STEEL_TORCHES, Decoration.WOODEN_TORCHES, Decoration.STEEL_CANDLESTICKS, Decoration.GOLD_CANDLESTICKS, Decoration.INCENSE_BURNERS, Decoration.MAHOGANY_BURNERS, Decoration.MARBLE_BURNERS), + CHAPEL_WINDOW(new int[] { 13730, 13728, 13732, 13729, 13733, 13731}, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_HIGH_ANIM, Decoration.SHUTTERED_WINDOW, Decoration.DECORATIVE_WINDOW, Decoration.STAINED_GLASS), + CHAPEL_RUG(15273, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_END, Decoration.RED_RUG_END, Decoration.OPULENT_RUG_END), + CHAPEL_RUG2(15274, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.BROWN_RUG_CORNER, Decoration.RED_RUG_CORNER, Decoration.OPULENT_RUG_CORNER), + + /** + * Formal garden hotspots. + */ + CENTREPIECE_2(15368, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.PORTAL, Decoration.GAZEBO, Decoration.DUNGEON_ENTRANCE, Decoration.SMALL_FOUNTAIN, Decoration.LARGE_FOUNTAIN, Decoration.POSH_FOUNTAIN), + FENCING(15369, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_HIGH_ANIM, Decoration.BOUNDARY_STONES, Decoration.WOODEN_FENCE, Decoration.STONE_WALL, Decoration.IRON_RAILINGS, Decoration.PICKET_FENCE, Decoration.GARDEN_FENCE, Decoration.MARBLE_WALL), + SMALL_PLANT1(15375, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.SUNFLOWER, Decoration.MARIGOLDS, Decoration.ROSES), + BIG_PLANT1(15373, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.SUNFLOWER_BIG, Decoration.MARIGOLDS_BIG, Decoration.ROSES_BIG), + SMALL_PLANT2(15376, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.ROSEMARY, Decoration.DAFFODILS, Decoration.BLUEBELLS), + BIG_PLANT2(15374, BuildHotspotType.INDIVIDUAL, BuildingUtils.PLANT_ANIM, Decoration.ROSEMARY_BIG, Decoration.DAFFODILS_BIG, Decoration.BLUEBELLS_BIG), + HEDGE1(15370, BuildHotspotType.LINKED, BuildingUtils.PLANT_ANIM, Decoration.THORNY_HEDGE1, Decoration.NICE_HEDGE1, Decoration.SMALL_BOX_HEDGE1, Decoration.TOPIARY_HEDGE1, Decoration.FANCY_HEDGE1, Decoration.TALL_FANCY_HEDGE1, Decoration.TALL_BOX_HEDGE1), + HEDGE2(15371, BuildHotspotType.LINKED, BuildingUtils.PLANT_ANIM, Decoration.THORNY_HEDGE2, Decoration.NICE_HEDGE2, Decoration.SMALL_BOX_HEDGE2, Decoration.TOPIARY_HEDGE2, Decoration.FANCY_HEDGE2, Decoration.TALL_FANCY_HEDGE2, Decoration.TALL_BOX_HEDGE2), + HEDGE3(15372, BuildHotspotType.LINKED, BuildingUtils.PLANT_ANIM, Decoration.THORNY_HEDGE3, Decoration.NICE_HEDGE3, Decoration.SMALL_BOX_HEDGE3, Decoration.TOPIARY_HEDGE3, Decoration.FANCY_HEDGE3, Decoration.TALL_FANCY_HEDGE3, Decoration.TALL_BOX_HEDGE3), + + /** + * Throne room hotspots. + */ + THRONE(15426, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_THRONE, Decoration.TEAK_THRONE, Decoration.MAHOGANY_THRONE, Decoration.GILDED_THRONE, Decoration.SKELETON_THRONE, Decoration.CRYSTAL_THRONE, Decoration.DEMONIC_THRONE), + LEVER(15435, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.OAK_LEVER, Decoration.TEAK_LEVER, Decoration.MAHOGANY_LEVER), + FLOOR(new int[] { 15427, 15428, 15429, 15430, 15431, 15432 }, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_LOW_ANIM, Decoration.FLOOR_DECORATION, Decoration.STEEL_CAGE, Decoration.FLOOR_TRAP, Decoration.MAGIC_CIRCLE, Decoration.MAGIC_CAGE), + SEATING1(15436, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_MID_ANIM, Decoration.CARVED_TEAK_BENCH, Decoration.MAHOGANY_BENCH, Decoration.GILDED_BENCH), + SEATING2(15437, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_MID_ANIM, Decoration.CARVED_TEAK_BENCH, Decoration.MAHOGANY_BENCH, Decoration.GILDED_BENCH), + TRAPDOOR(15438, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_LOW_ANIM, Decoration.OAK_TRAPDOOR, Decoration.TEAK_TRAPDOOR, Decoration.MAHOGANY_TRAPDOOR), + DECORATION(15434, BuildHotspotType.CREST, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_DECO, Decoration.TEAK_DECO, Decoration.GILDED_DECO, Decoration.ROUND_SHIELD, Decoration.SQUARE_SHIELD, Decoration.KITE_SHIELD), + + /** + * Oubliette hotspots. + */ + FLOOR_MID(15347, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.SPIKES_MID, Decoration.TENTACLE_MID, Decoration.FP_FLOOR_MID, Decoration.ROCNAR_FLOOR_MID), + FLOOR_SIDE(15348, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.SPIKES_SIDE, Decoration.TENTACLE_SIDE, Decoration.FP_FLOOR_SIDE, Decoration.ROCNAR_FLOOR_SIDE), + FLOOR_CORNER(15349, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.SPIKES_CORNER, Decoration.TENTACLE_CORNER, Decoration.FP_FLOOR_CORNER, Decoration.ROCNAR_FLOOR_CORNER), + OUBLIETTE_FLOOR(15350, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.SPIKES_FL, Decoration.TENTACLE_FL, Decoration.FLAME_PIT, Decoration.ROCNAR_FL), + OUBLIETTE_FLOOR_1(15351, BuildHotspotType.LINKED, BuildingUtils.BUILD_LOW_ANIM, Decoration.SPIKES_FL, Decoration.TENTACLE_FL, Decoration.FLAME_PIT, Decoration.ROCNAR), + PRISON(15352, BuildHotspotType.LINKED, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_CAGE, Decoration.OAK_STEEL_CAGE, Decoration.STEEL_CAGE_OU, Decoration.SPIKED_CAGE, Decoration.BONE_CAGE), + PRISON_DOOR(15353, BuildHotspotType.LINKED, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_CAGE_DOOR, Decoration.OAK_STEEL_CAGE_DOOR, Decoration.STEEL_CAGE_DOOR, Decoration.SPIKED_CAGE_DOOR, Decoration.BONE_CAGE_DOOR), + GUARD(15354, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.SKELETON_GUARD, Decoration.GUARD_DOG, Decoration.HOBGOBLIN, Decoration.BABY_RED_DRAGON, Decoration.HUGE_SPIDER, Decoration.TROLL, Decoration.HELLHOUND), + LADDER(15356, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_LADDER, Decoration.TEAK_LADDER, Decoration.MAHOGANY_LADDER), + OUBLIETTE_LIGHT(15355, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_HIGH_ANIM, Decoration.CANDLE, Decoration.TORCH, Decoration.SKULL_TORCH), + + /** + * Corridor, junction, stairs, TODO: pit trap + */ + DUNGEON_DOOR_LEFT(15328, BuildHotspotType.LINKED, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_DOOR_LEFT, Decoration.STEEL_DOOR_LEFT, Decoration.MARBLE_DOOR_LEFT), + DUNGEON_DOOR_RIGHT(15329, BuildHotspotType.LINKED, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_DOOR_RIGHT, Decoration.STEEL_DOOR_RIGHT, Decoration.MARBLE_DOOR_RIGHT), + DUNGEON_DOOR_LEFT2(15326, BuildHotspotType.LINKED, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_DOOR_LEFT, Decoration.STEEL_DOOR_LEFT, Decoration.MARBLE_DOOR_LEFT), + DUNGEON_DOOR_RIGHT2(15327, BuildHotspotType.LINKED, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_DOOR_RIGHT, Decoration.STEEL_DOOR_RIGHT, Decoration.MARBLE_DOOR_RIGHT), + DUNGEON_DOOR_LEFT3(36672, BuildHotspotType.LINKED, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_DOOR_LEFT, Decoration.STEEL_DOOR_LEFT, Decoration.MARBLE_DOOR_LEFT), + DUNGEON_DOOR_RIGHT3(36675, BuildHotspotType.LINKED, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_DOOR_RIGHT, Decoration.STEEL_DOOR_RIGHT, Decoration.MARBLE_DOOR_RIGHT), + DUNGEON_TRAP(15324, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_LOW_ANIM, Decoration.SPIKE_TRAP, Decoration.MAN_TRAP, Decoration.TANGLE_TRAP, Decoration.MARBLE_TRAP, Decoration.TELEPORT_TRAP), + DUNGEON_TRAP2(15325, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_LOW_ANIM, Decoration.SPIKE_TRAP, Decoration.MAN_TRAP, Decoration.TANGLE_TRAP, Decoration.MARBLE_TRAP, Decoration.TELEPORT_TRAP), + DUNGEON_LIGHT(15330, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_HIGH_ANIM, Decoration.CANDLE, Decoration.TORCH, Decoration.SKULL_TORCH), + DUNGEON_DECO(15331, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_HIGH_ANIM, Decoration.DECORATIVE_BLOOD, Decoration.DECORATIVE_PIPE, Decoration.HANGING_SKELETON), + DUNGEON_GUARD(15323, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.SKELETON_GUARD, Decoration.GUARD_DOG, Decoration.HOBGOBLIN, Decoration.BABY_RED_DRAGON, Decoration.HUGE_SPIDER, Decoration.TROLL, Decoration.HELLHOUND), + DUNGEON_GUARD2(15336, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.SKELETON_GUARD, Decoration.GUARD_DOG, Decoration.HOBGOBLIN, Decoration.BABY_RED_DRAGON, Decoration.HUGE_SPIDER, Decoration.TROLL, Decoration.HELLHOUND), + DUNGEON_GUARD3(15337, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.SKELETON_GUARD, Decoration.GUARD_DOG, Decoration.HOBGOBLIN, Decoration.BABY_RED_DRAGON, Decoration.HUGE_SPIDER, Decoration.TROLL, Decoration.HELLHOUND), + DUNGEON_LIGHT2(34138, BuildHotspotType.RECURSIVE, BuildingUtils.BUILD_HIGH_ANIM, Decoration.CANDLE, Decoration.TORCH, Decoration.SKULL_TORCH), + DUNGEON_PIT_GUARD(36676, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.PIT_DOG, Decoration.PIT_OGRE, Decoration.PIT_ROCK_PROTECTOR, Decoration.PIT_SCABARITE, Decoration.PIT_BLACK_DEMON, Decoration.PIT_IRON_DRAGON), + + /** + * Treasure room + */ + MONSTER(15257, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.DEMON, Decoration.KALPHITE_SOLDIER, Decoration.TOK_XIL, Decoration.DAGANNOTH, Decoration.STEEL_DRAGON), + TREASURE_CHEST1(15256, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_MID_ANIM, Decoration.WOODEN_CRATE, Decoration.OAK_T_CHEST, Decoration.TEAK_T_CHEST, Decoration.MGANY_T_CHEST, Decoration.MAGIC_CHEST), + WALL_DECORATION1(15259, BuildHotspotType.CREST, BuildingUtils.BUILD_HIGH_ANIM, Decoration.ROUND_SHIELD, Decoration.SQUARE_SHIELD, Decoration.KITE_SHIELD), + + /** + * Stairways. + */ + STAIRWAYS(15380, BuildHotspotType.STAIRCASE, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_STAIRCASE, Decoration.TEAK_STAIRCASE, Decoration.SPIRAL_STAIRCASE, Decoration.MARBLE_STAIRCASE, Decoration.MARBLE_SPIRAL), + QUEST_STAIRWAYS(15390, BuildHotspotType.STAIRCASE, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_STAIRCASE, Decoration.TEAK_STAIRCASE, Decoration.SPIRAL_STAIRCASE, Decoration.MARBLE_STAIRCASE, Decoration.MARBLE_SPIRAL), + STAIRWAYS_DUNGEON(new int[] { 15380, 15380, 15380, 15380, 15390, 15390}, BuildHotspotType.STAIRCASE, BuildingUtils.BUILD_HIGH_ANIM, Decoration.OAK_STAIRCASE, Decoration.TEAK_STAIRCASE, Decoration.SPIRAL_STAIRCASE, Decoration.MARBLE_STAIRCASE, Decoration.MARBLE_SPIRAL), + + /** + * Stairways. + */ + STAIRS_DOWN(15381, BuildHotspotType.STAIRCASE, BuildingUtils.BUILD_LOW_ANIM, Decoration.OAK_STAIRS_DOWN, Decoration.TEAK_STAIRS_DOWN, Decoration.SPIRAL_STAIRS_DOWN, Decoration.MARBLE_STAIRS_DOWN, Decoration.MARBLE_SPIRAL_DOWN), + STAIRS_DOWN2(15391, BuildHotspotType.STAIRCASE, BuildingUtils.BUILD_LOW_ANIM, Decoration.OAK_STAIRS_DOWN, Decoration.TEAK_STAIRS_DOWN, Decoration.SPIRAL_STAIRS_DOWN, Decoration.MARBLE_STAIRS_DOWN, Decoration.MARBLE_SPIRAL_DOWN), + + + /** + * Window hotspots. + */ + WINDOW(13830, BuildHotspotType.INDIVIDUAL, BuildingUtils.BUILD_HIGH_ANIM, Decoration.BASIC_WOOD_WINDOW, Decoration.BASIC_STONE_WINDOW, Decoration.WHITEWASHED_STONE_WINDOW, Decoration.FREMENNIK_WINDOW, Decoration.TROPICAL_WOOD_WINDOW, Decoration.FANCY_STONE_WINDOW), + ; + + /** + * The object id. + */ + private final int objectId; + + /** + * The object ids. + */ + private final int[] objectIds; + + /** + * The decorations to build on this hotspot. + */ + private final Decoration[] decorations; + + /** + * The hotspot type. + */ + private final BuildHotspotType type; + + /** + * The building animation. + */ + private final Animation buildingAnimation; + + /** + * The linked hotspots + */ + private static List linkedHotspots = new ArrayList(); + + /** + * Configures hotspots. + */ + static { + linkedHotspots.add(new BuildHotspot[] { RUG, RUG2, RUG3 }); + linkedHotspots.add(new BuildHotspot[] { BEDROOM_RUG, BEDROOM_RUG2, BEDROOM_RUG3 }); + linkedHotspots.add(new BuildHotspot[] { HALL_RUG, HALL_RUG2, HALL_RUG3 }); + linkedHotspots.add(new BuildHotspot[] { CR_CORNER, CR_CORNER2, CR_CORNER3, CR_CORNER4, CR_RING, + CR_RING2, CR_RING3, CR_RING4, CR_FLOOR, CR_FLOOR2, CR_FLOOR3, CR_FLOOR4, CR_FLOOR5, + CR_FLOOR6, CR_FLOOR7, CR_FLOOR8, CR_INVISIBLE_WALL, CR_INVISIBLE_WALL2, CR_INVISIBLE_WALL3}); + linkedHotspots.add(new BuildHotspot[] { Q_HALL_RUG, Q_HALL_RUG2, Q_HALL_RUG3 }); + linkedHotspots.add(new BuildHotspot[] { CHAPEL_RUG, CHAPEL_RUG2 }); + linkedHotspots.add(new BuildHotspot[] { HEDGE1, HEDGE2, HEDGE3 }); + linkedHotspots.add(new BuildHotspot[] { FLOOR_MID, FLOOR_SIDE, FLOOR_CORNER, OUBLIETTE_FLOOR, OUBLIETTE_FLOOR_1 }); + linkedHotspots.add(new BuildHotspot[] { PRISON, PRISON_DOOR }); + linkedHotspots.add(new BuildHotspot[] { DUNGEON_DOOR_LEFT, DUNGEON_DOOR_RIGHT }); + linkedHotspots.add(new BuildHotspot[] { DUNGEON_DOOR_LEFT2, DUNGEON_DOOR_RIGHT2 }); + linkedHotspots.add(new BuildHotspot[] { HABITAT_1, HABITAT_2 }); + linkedHotspots.add(new BuildHotspot[] { SMALL_PLANT_1, SMALL_PLANT1 }); + } + + /** + * Constructs a new {@code BuildHotspot} {@code Object}. + * @param objectId The object id. + * @param buildingAnimation The building animation. + * @param decorations The decoration. + */ + private BuildHotspot(int objectId, BuildHotspotType type, Animation buildingAnimation, Decoration... decorations) { + this.objectId = objectId; + this.objectIds = null; + this.type = type; + this.buildingAnimation = buildingAnimation; + this.decorations = decorations; + } + + /** + * Constructs a new {@code BuildHotspot} {@code Object}. + * @param objectIds The objects ids. + * @param buildingAnimation The building animation. + * @param decorations The decoration. + */ + private BuildHotspot(int[] objectIds, BuildHotspotType type, Animation buildingAnimation, Decoration... decorations) { + this.objectId = objectIds[0]; + this.objectIds = objectIds; + this.type = type; + this.buildingAnimation = buildingAnimation; + this.decorations = decorations; + } + + /** + * Gets the building hotspot for the given object id. + * @param id The object id. + * @param style The housing style. + * @return The building hotspot. + */ + public static BuildHotspot forId(int id, HousingStyle style) { + for (BuildHotspot spot : values()) { + if (spot.getObjectId(style) == id) { + return spot; + } + } + return null; + } + + /** + * Gets the linked hotspots (if any) + * @param b - the buildhotspot to find linked hotspots + * @return BuildHotspot[] or null + */ + public static BuildHotspot[] getLinkedHotspots(BuildHotspot b) { + for (BuildHotspot[] list : linkedHotspots) { + for (BuildHotspot bh : list) { + if (bh == b) { + return list; + } + } + } + return null; + } + + /** + * Gets the decoration index. + * @param deco The decoration. + * @return The index. + */ + public int getDecorationIndex(Decoration deco) { + for (int i = 0; i < decorations.length; i++) { + if (decorations[i] == deco) { + return i; + } + } + return -1; + } + + /** + * Gets the objectId. + * @param style The current housing style. + * @return The objectId. + */ + public int getObjectId(HousingStyle style) { + if (objectIds != null) { + return objectIds[style.ordinal()]; + } + return objectId; + } + + /** + * Gets the objectId. + * @return The objectId. + */ + public int getObjectId() { + return objectId; + } + + /** + * Gets the type + * @return type + */ + public BuildHotspotType getType() { + return type; + } + + /** + * Gets the decorations. + * @return The decorations. + */ + public Decoration[] getDecorations() { + return decorations; + } + + /** + * Gets the objectIds value. + * @return The objectIds. + */ + public int[] getObjectIds() { + return objectIds; + } + + /** + * Gets the buildingAnimation value. + * @return The buildingAnimation. + */ + public Animation getBuildingAnimation() { + return buildingAnimation; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildHotspotType.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildHotspotType.java new file mode 100644 index 000000000..d2dbe1b4d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildHotspotType.java @@ -0,0 +1,20 @@ +package core.game.node.entity.skill.construction; + +/** + * BuiltHotspotType + * @author Clayton Williams + * @date Jul 26, 2015 + */ +public enum BuildHotspotType { + + INDIVIDUAL, + RECURSIVE, + LINKED, + CREST, + STAIRCASE; + + BuildHotspotType() { + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildOptionPlugin.java new file mode 100644 index 000000000..60aa757fc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildOptionPlugin.java @@ -0,0 +1,182 @@ +package core.game.node.entity.skill.construction; + + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * The build option handling plugin. + * @author Emperor + * + */ +@Initializable +public final class BuildOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("build", this); + ObjectDefinition.setOptionHandler("remove", this); + PluginManager.definePlugin(new RemoveDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getHouseManager().isBuildingMode()) { + player.getPacketDispatch().sendMessage("You have to be in building mode to do this."); + return true; + } + GameObject object = ((GameObject) node); + if (option.equals("remove")) { + Decoration decoration = Decoration.getDecoration(player, object); + if (decoration == null || !object.isActive()) { + return false; + } + player.getDialogueInterpreter().open("con:removedec", object); + return true; + } + player.setAttribute("con:hsobject", node); + if (BuildingUtils.isDoorHotspot(object)) { + int[] pos = BuildingUtils.roomExists(player, object); + if (pos != null) { + player.getDialogueInterpreter().open("con:remove", "room", pos); + return true; + } + if (player.getHouseManager().getRoomAmount() < player.getHouseManager().getMaximumRooms(player)) { + player.getInterfaceManager().open(new Component(402)); + + + } else { + player.getPacketDispatch().sendMessage("You currently have the maximum amount of rooms available."); + } + return true; + } + Hotspot hotspot = player.getHouseManager().getHotspot(object); + if (hotspot == null || !isBuildable(player, object, hotspot)) { + System.out.println(hotspot == null); + SystemLogger.logErr("Construction (building): " + hotspot + " : " + object + " chunkX = " + object.getLocation().getChunkX() + ", chunkY = " + object.getLocation().getChunkY()); + return true; + } + System.out.println(object + " chunkX = " + object.getCenterLocation().getChunkX() + ", chunkY = " + object.getCenterLocation().getChunkY()); + + player.setAttribute("con:hotspot", hotspot); + BuildingUtils.openBuildInterface(player, hotspot.getHotspot()); + return true; + } + + /** + * Checks if the hotspot can be used. + * @param player The player. + * @param hotspot The hotspot. + * @return {@code True} if so. + */ + private static boolean isBuildable(Player player, GameObject object, Hotspot hotspot) { + Room room = player.getHouseManager().getRoom(object.getLocation()); + if (room == null) { + return false; + } + switch (hotspot.getHotspot()) { + case STAIRWAYS: + case STAIRS_DOWN: + case STAIRWAYS_DUNGEON: + if (room.isBuilt(BuildHotspot.HALL_RUG)) { + player.getPacketDispatch().sendMessage("You can't build a staircase on a rug."); + return false; + } + return true; + case HALL_RUG: + case HALL_RUG2: + case HALL_RUG3: + if (room.isBuilt(BuildHotspot.STAIRWAYS) || room.isBuilt(BuildHotspot.STAIRS_DOWN) || room.isBuilt(BuildHotspot.STAIRWAYS_DUNGEON)) { + player.getPacketDispatch().sendMessage("You can't build a rug under a staircase."); + return false; + } + return true; + case QUEST_STAIRWAYS: + case STAIRS_DOWN2: + if (room.isBuilt(BuildHotspot.Q_HALL_RUG)) { + player.getPacketDispatch().sendMessage("You can't build a staircase on a rug."); + return false; + } + return true; + case Q_HALL_RUG: + case Q_HALL_RUG2: + case Q_HALL_RUG3: + if (room.isBuilt(BuildHotspot.QUEST_STAIRWAYS) || room.isBuilt(BuildHotspot.STAIRS_DOWN2)) { + player.getPacketDispatch().sendMessage("You can't build a rug under a staircase."); + return false; + } + return true; + default: + return true; + } + } + + /** + * Handles the removing a decoration dialogue. + * @author Emperor + * + */ + private static class RemoveDialogue extends DialoguePlugin { + + /** + * The object. + */ + private GameObject object; + + /** + * Constructs a new {@code RemoveDialogue} {@code Object}. + */ + public RemoveDialogue() { + super(); + } + + /** + * Constructs a new {@code RemoveDialogue} {@code Object}. + * @param player The player. + */ + public RemoveDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RemoveDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendOptions("Really remove it?", "Yes", "No"); + object = (GameObject) args[0]; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (buttonId) { + case 1: + BuildingUtils.removeDecoration(player, object); + break; + } + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("con:removedec") }; + } + + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildRoomDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildRoomDialogue.java new file mode 100644 index 000000000..84e307361 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildRoomDialogue.java @@ -0,0 +1,263 @@ +package core.game.node.entity.skill.construction; + + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionChunk; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the building a room dialogue. + * @author Emperor + * + */ +@Initializable +public final class BuildRoomDialogue extends DialoguePlugin { + + /** + * The door hotspot. + */ + private GameObject door; + + /** + * The direction. + */ + private Direction[] directions; + + /** + * The room exits. + */ + private boolean[] exits; + + /** + * The rotation index. + */ + private int index; + + /** + * The boundaries of the room to build. + */ + private List boundaries = new ArrayList<>(); + + /** + * The room we're building. + */ + private Room room; + + /** + * The room x-coordinate. + */ + private int roomX; + + /** + * The room y-coordinate. + */ + private int roomY; + + /** + * The room z-coordinate (3 for dungeon). + */ + private int roomZ; + + /** + * Constructs a new {@code BuildRoomDialogue} {@code Object} + */ + public BuildRoomDialogue() { + super(); + } + + /** + * Constructs a new {@code BuildRoomDialogue} {@code Object} + * @param player The player. + */ + public BuildRoomDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BuildRoomDialogue(player); + } + + @Override + public boolean open(Object... args) { + player.getInterfaceManager().close(); + RoomProperties props = (RoomProperties) args[0]; + if (player.getSkills().getStaticLevel(Skills.CONSTRUCTION) < props.getLevel()) { + interpreter.sendPlainMessage(false, "You need a Construction level of " + props.getLevel() + " to buy this room."); + stage = 2; + return true; + } + if (!player.getInventory().contains(995, props.getCost())) { + interpreter.sendPlainMessage(false, "You need " + props.getCost() + " coins to buy this room."); + stage = 2; + return true; + } + this.door = (GameObject) player.getAttribute("con:hsobject"); + int[] pos = BuildingUtils.getRoomPosition(player, door); + roomX = pos[0]; + roomY = pos[1]; + if (!inBounds()) { + interpreter.sendPlainMessage(false, "Your house is too large. TODO: correct message"); + stage = 2; + return true; + } + roomZ = player.getLocation().getZ(); + if (roomZ != 0) { + Room r = player.getHouseManager().getRooms()[roomZ - 1][roomX][roomY]; + if (r == null || r.getProperties().isLand()) { + interpreter.sendPlainMessage(false, "You can't build a room here, you need a room to build on."); + stage = 2; + return true; + } + } + if (HouseManager.isInDungeon(player)) { + if (props.isLand()) { + interpreter.sendPlainMessage(false, "You can't build this room inside your dungeon."); + stage = 2; + return true; + } + roomZ = 3; + } + else if (props.isDungeon()) { + interpreter.sendPlainMessage(false, "You can only build this room in your dungeon."); + stage = 2; + return true; + } + if (props.isLand() && roomZ != 0) { + interpreter.sendPlainMessage(false, "A garden can only be on ground floor."); + stage = 2; + return true; + } + this.room = Room.create(player, props); + this.exits = room.getExits(Direction.NORTH); + this.index = 0; + this.directions = BuildingUtils.getAvailableRotations(player, exits, roomZ, roomX, roomY); + while (directions[index] == null) { + if (++index == directions.length) { + interpreter.sendPlainMessage(false, "There's no space to build this room."); + stage = 2; + return true; + } + } + options("Rotate clockwise", "Rotate anticlockwise", "Build", "Cancel"); + stage = 1; + drawGhostRoom(); + return true; + } + + /** + * Checks if the room to be built is in the available boundaries of the house. + * @return The boundaries. + */ + private boolean inBounds() { + Rectangle bounds = player.getHouseManager().getBoundaries(); + int max = player.getHouseManager().getMaximumDimension(player); + if ((roomX < bounds.x || roomX >= bounds.x + bounds.width) && bounds.width >= max) { + return false; + } + if ((roomY < bounds.y || roomY >= bounds.y + bounds.height) && bounds.height >= max) { + return false; + } + return true; + } + + @Override + public boolean close() { + for (GameObject object : boundaries) { + ObjectBuilder.remove(object); + } + boundaries.clear(); + return super.close(); + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + switch (buttonId) { + case 1: + case 2: + rotate(buttonId == 2); + options("Rotate clockwise", "Rotate anticlockwise", "Build", "Cancel"); + return true; + case 3: + if (player.getInventory().remove(new Item(995, room.getProperties().getCost()))) { + room.setRotation(directions[index]); + boolean[] exit = new boolean[exits.length]; + for (int i = 0; i < exit.length; i++) { + exit[(i + index) % exit.length] = exits[i]; + } + BuildingUtils.buildRoom(player, room, roomZ, roomX, roomY, exit, true); + end(); + return true; + } + interpreter.sendPlainMessage(false, "You need " + room.getProperties().getCost() + " coins to buy this room."); + stage = 2; + return true; + case 4: + end(); + return true; + } + break; + case 2: + end(); + return true; + } + return false; + } + + /** + * Rotates the room. + * @param counter If we're rotating counter clockwise. + */ + private void rotate(boolean counter) { + Direction direction = null; + while ((direction = directions[index = (index + (counter ? 3 : 1)) % 4]) == null) { + + } + room.setRotation(direction); + drawGhostRoom(); + } + + /** + * Draws the current boundaries of the room to build. + */ + private void drawGhostRoom() { + for (GameObject object : boundaries) { + ObjectBuilder.remove(object); + } + int rotation = directions[index].toInteger(); + boundaries.clear(); + Location base = player.getViewport().getRegion().getBaseLocation().transform(roomX << 3, roomY << 3, player.getLocation().getZ()); + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + GameObject[] objects = room.getChunk().getObjects(x, y); + for (GameObject object : objects) { + if (object != null && object.getDefinition().hasAction("build")) { + int[] pos = RegionChunk.getRotatedPosition(x, y, object.getDefinition().getSizeX(), object.getDefinition().getSizeY(), object.getRotation(), rotation); + GameObject obj = object.transform(object.getId(), (object.getRotation() + rotation) % 4, base.transform(pos[0], pos[1], 0)); + boundaries.add(ObjectBuilder.add(obj)); + } + } + } + } + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("con:room") }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildingUtils.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildingUtils.java new file mode 100644 index 000000000..787a7dbd5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/BuildingUtils.java @@ -0,0 +1,698 @@ +package core.game.node.entity.skill.construction; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.skill.Skills; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.map.BuildRegionChunk; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.Region; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Utility class for building. + * @author Emperor + * + */ +public final class BuildingUtils { + + /** + * The directions array. + */ + public static final Direction[] DIRECTIONS = { + Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST + }; + + /** + * The building a decoration animation. + */ + public static final Animation BUILD_LOW_ANIM = Animation.create(3683); + + /** + * The building a decoration animation. + */ + public static final Animation BUILD_MID_ANIM = Animation.create(3676); + + /** + * The building a decoration animation. + */ + public static final Animation BUILD_HIGH_ANIM = Animation.create(3684); + + /** + * The planting animation. + */ + public static final Animation PLANT_ANIM = Animation.create(3691); + + /** + * The removing a decoration animation. + */ + private static final Animation REMOVE_ANIMATION = Animation.create(3685); + + /** + * The plank item. + */ + public static final Item PLANK = new Item(960); + + /** + * The watering can(8) item id. + */ + public static final int WATERING_CAN = 5340; + + private static final int[] BUILD_INDEXES = { 0, 2, 4, 6, 1, 3, 5 }; + + /** + * Opens the building furniture interface. + * @param player The player. + * @param hotspot The hotspot. + */ + public static void openBuildInterface(Player player, BuildHotspot hotspot) { + player.getInterfaceManager().open(new Component(396)); + Item[] items = new Item[7]; + + int c261Value = 0; + + for (int i = 0; i < 7; i++) { + int itemsStringOffset = 97 + (i * 5); + + //97 + + if (i >= hotspot.getDecorations().length || (hotspot.getDecorations()[i] != null && hotspot.getDecorations()[i].isInvisibleNode())) { + for (int j = 0; j < 5; j++) { + player.getPacketDispatch().sendString("", 396, itemsStringOffset + j); + } + player.getPacketDispatch().sendString("", 396, 140 + i); + c261Value += (1 << (i + 1)); + continue; + } + + Decoration decoration = hotspot.getDecorations()[i]; + items[BUILD_INDEXES[i]] = new Item(decoration.getInterfaceItem()); + player.getPacketDispatch().sendString(ItemDefinition.forId(decoration.getInterfaceItem()).getName(), 396, itemsStringOffset); + boolean hasRequirements = player.getSkills().getLevel(Skills.CONSTRUCTION) >= decoration.getLevel(); + for (int j = 0; j < 4; j++) { + if (j >= decoration.getItems().length) { + if (j == decoration.getItems().length && decoration.getNailAmount() > 0) { + player.getPacketDispatch().sendString("Nails: " + decoration.getNailAmount(), 396, (itemsStringOffset + 1) + j); + } else { + player.getPacketDispatch().sendString("", 396, (itemsStringOffset + 1) + j); + } + } else { + Item item = decoration.getItems()[j]; + if (!player.getInventory().containsItem(item)) { + hasRequirements = false; + } + String s = item.getName() + ": " + item.getAmount(); + /*if (j > 1 && (decoration == Decoration.RUNE_CASE1 || decoration == Decoration.RUNE_CASE2)) { + if (j == 3) { + offset--; + item = decoration.getItems()[++j]; + s = item.getName() + ": " + item.getAmount(); + } + item = decoration.getItems()[j + 1]; + s += ", " + item.getName() + ": " + item.getAmount(); + player.getPacketDispatch().sendString(s, 396, 15 + offset + j); + continue; + }*/ + player.getPacketDispatch().sendString(s, 396, (itemsStringOffset + 1) + j); + if (hasRequirements) + c261Value += (1 << (i + 1)); + } + } + player.getConfigManager().set(1485 + i, hasRequirements || player.isStaff() ? 1 : 0); + player.getPacketDispatch().sendString("Lvl " + decoration.getLevel(), 396, 140 + i); + //player.getPacketDispatch().sendItemZoomOnInterface(items[i].protocol(), 50000, 396, 49 + i); + } + player.getConfigManager().set(261, c261Value); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 396, 132, 8, items, false)); + } + + /** + * Checks if the object is a door hotspot. + * @param object The object. + * @return {@code True} if so. + */ + public static boolean isDoorHotspot(GameObject object) { + return object.getId() >= 15305 && object.getId() <= 15322; + } + + /** + * Builds a decoration object. + * @param player The player. + * @param deco The decoration. + * @param object The object. + */ + public static void buildDecoration(final Player player, final Hotspot hotspot, final Decoration deco, final GameObject object) { + final int nailAmount = deco.getNailAmount(); + final NailType type = nailAmount > 0 ? NailType.get(player, nailAmount) : null; + if (nailAmount > 0 && type == null) { + player.getPacketDispatch().sendMessage("You don't have the right materials."); + return; + } + int roomX = object.getLocation().getChunkX(); + int roomY = object.getLocation().getChunkY(); + int z = object.getLocation().getZ(); + Region region = player.getHouseManager().getRegion(); + if (HouseManager.isInDungeon(player)) { + region = player.getHouseManager().getDungeonRegion(); + z = 3; + } + final Room room = player.getHouseManager().getRooms()[z][roomX][roomY]; + if (!canBuildDecoration(player, room, deco, object)) { + return; + } + player.lock(3); + player.animate(hotspot.getHotspot().getBuildingAnimation()); + final Region r = region; + player.getPulseManager().run(new Pulse(3, player, object) { + int nails = nailAmount; + NailType nail = type; + @Override + public boolean pulse() { + if (nails > 0) { + if (!type.isBend()) { + player.getPacketDispatch().sendMessage("You use a nail."); + nails--; + } else { + player.getPacketDispatch().sendMessage("You accidently bend a nail."); + } + player.animate(hotspot.getHotspot().getBuildingAnimation()); + if (!player.getInventory().remove(new Item(nail.getItemId(), 1))) { + return true; + } + if (nails > 0) { + player.lock(4); + return false; + } + } else if (deco.getTools()[0] == WATERING_CAN) { + for (int i = 7; i >= 0; i--) { + Item can = player.getInventory().getItem(new Item(WATERING_CAN - i, 1)); + if (can != null && can.getSlot() > -1) { + System.out.println("Can index " + (i == 7 ? i + 2 : i + 1) + "."); + player.getInventory().replace(new Item(WATERING_CAN - (i == 7 ? i + 2 : i + 1), 1), can.getSlot()); + break; + } + } + } + if (player.getInventory().remove(deco.getItems()) || player.isAdmin()) { + setDecoration(player, r, room, hotspot, object, deco); + player.getSkills().addExperience(Skills.CONSTRUCTION, deco.getExperience(), true); + + if (getObjectIdsThatGiveFarmingExperience().contains(deco.getObjectId())) { + player.getSkills().addExperience(Skills.FARMING, deco.getExperience(), true); + } + player.unlock(); + } + return true; + } + + @NotNull + private ArrayList getObjectIdsThatGiveFarmingExperience() { + return new ArrayList<>( + // Garden big tree decorations. + Arrays.asList(13411, 13412, 13413, 13414, 13415, 13416, 13417, + // Garden tree decorations. + 13418, 13419, 13420, 13421, 13422, 13423, 13424, + // Garden big plant 1 decorations. + 13425, 13426, 13427, + // Garden big plant 2 decorations. + 13428, 13429, 13430, + // Garden small plant 1 decorations. + 13431, 13432, 13433, + // Garden small plant 2 decorations. + 13434, 13435, 13436)); + } + }); + } + + /** + * Sets a decoration for the given hotspot. + * @param player The player. + * @param region The region. + * @param room The room. + * @param hotspot The hotspot to set the decoration for. + * @param object The object representing the hotspot. + * @param deco The decoration to set. + */ + private static void setDecoration(Player player, Region region, Room room, Hotspot hotspot, GameObject object, Decoration deco) { + Location l = object.getLocation(); + HousingStyle style = player.getHouseManager().getStyle(); + int decIndex = hotspot.getHotspot().getDecorationIndex(deco); + switch(hotspot.getHotspot().getType()) { + case STAIRCASE: + int z = l.getZ(); + if (region == player.getHouseManager().getDungeonRegion()) { + z = 3; + } + for (int i = -1; i <= 1; i++) { + int plane = (z + (i == -1 ? 3 : i)) % 4; + Room r = player.getHouseManager().getRooms()[plane][l.getChunkX()][l.getChunkY()]; + if (r != null && r.getRotation() == room.getRotation() && !r.getProperties().isLand()) { + Hotspot h = r.getStairs(); + if (h != null) { + h.setDecorationIndex(decIndex); + Region reg = plane == 3 ? player.getHouseManager().getDungeonRegion() : player.getHouseManager().getRegion(); + if (reg == null) { + continue; + } + BuildRegionChunk chunk = (BuildRegionChunk) reg.getPlanes()[plane % 3].getChunks()[l.getChunkX()][l.getChunkY()]; + GameObject[] objects = chunk.getObjects(h.getCurrentX(), h.getCurrentY()); + for (GameObject o : objects) { + if (o != null && o.getType() == object.getType()) { + ObjectBuilder.replace(o, o.transform(h.getHotspot().getDecorations()[decIndex].getObjectId(style))); + if (plane == 1) { + if (r.getProperties() == RoomProperties.SKILL_HALL) { + r.updateProperties(player, RoomProperties.SKILL_HALL_2); + } else if (r.getProperties() == RoomProperties.QUEST_HALL) { + r.updateProperties(player, RoomProperties.QUEST_HALL_2); + } + else { + break; + } + player.getHouseManager().reload(player, true); + } + break; + } + } + } else { + SystemLogger.logErr("Couldn't find stairs! " + plane); + } + } + } + break; + case CREST: + ObjectBuilder.replace(object, object.transform(deco.getObjectId(style) + player.getHouseManager().getCrest().ordinal())); + hotspot.setDecorationIndex(decIndex); + break; + case INDIVIDUAL: + ObjectBuilder.replace(object, object.transform(deco.getObjectId(style))); + hotspot.setDecorationIndex(decIndex); + break; + case RECURSIVE: + BuildRegionChunk chunk = (BuildRegionChunk) region.getPlanes()[l.getZ()].getChunks()[l.getChunkX()][l.getChunkY()]; + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + Hotspot h = room.getHotspot(hotspot.getHotspot(), x, y); + if (h != null) { + h.setDecorationIndex(decIndex); + int objectId = hotspot.getHotspot().getObjectId(style); + GameObject o = chunk.get(x, y, chunk.getIndex(x, y, objectId)); + if (o != null && objectId == o.getId()) { + ObjectBuilder.replace(o, o.transform(hotspot.getHotspot().getDecorations()[decIndex].getObjectId(style))); + } + } + } + } + break; + case LINKED: + BuildHotspot[] linkedHotspots = BuildHotspot.getLinkedHotspots(hotspot.getHotspot()); + chunk = (BuildRegionChunk) region.getPlanes()[l.getZ()].getChunks()[l.getChunkX()][l.getChunkY()]; + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + for (BuildHotspot bh : linkedHotspots) { + Hotspot h = room.getHotspot(bh, x, y); + if (h != null) { + h.setDecorationIndex(decIndex); + int objectId = bh.getObjectId(style); + GameObject o = chunk.get(x, y, chunk.getIndex(x, y, objectId)); + if (o != null && objectId == o.getId()) { + ObjectBuilder.replace(o, o.transform(bh.getDecorations()[decIndex].getObjectId(style))); + } + } + } + } + } + break; + } + } + + /** + * Remove the decoration + * @param player the player + * @param object the object to remove + */ + public static void removeDecoration(Player player, GameObject object) { + if (object.getId() == Decoration.PORTAL.getObjectId() && player.getHouseManager().getPortalAmount() <= 1) { + player.getPacketDispatch().sendMessage("You need atleast one portal, how else would you leave your house?"); + return; + } + Location l = object.getLocation(); + Room room = player.getHouseManager().getRooms()[l.getZ()][l.getChunkX()][l.getChunkY()]; + Region region = player.getHouseManager().getRegion(); + if (HouseManager.isInDungeon(player)) { + region = player.getHouseManager().getDungeonRegion(); + room = player.getHouseManager().getRooms()[3][l.getChunkX()][l.getChunkY()]; + } + HousingStyle style = player.getHouseManager().getStyle(); + for (int i = 0; i < room.getHotspots().length; i++) { + Hotspot hotspot = room.getHotspots()[i]; + int objectId = hotspot.getDecorationIndex() < 0 ? -1 : hotspot.getHotspot().getDecorations()[hotspot.getDecorationIndex()].getObjectId(style); + if (hotspot.getHotspot().getType() == BuildHotspotType.CREST) { + objectId += player.getHouseManager().getCrest().ordinal(); + } + if (objectId == object.getId() && hotspot.getCurrentX() == l.getChunkOffsetX() && hotspot.getCurrentY() == l.getChunkOffsetY()) { + player.animate(REMOVE_ANIMATION); + removeDecoration(player, region, room, hotspot, object, style); + break; + } + } + } + + /** + * Removes the decoration. + * @param player The player. + * @param region The region. + * @param room The room. + * @param hotspot The hotspot to remove the decoration from. + * @param object The object. + * @param style The housing style. + */ + private static void removeDecoration(Player player, Region region, Room room, Hotspot hotspot, GameObject object, HousingStyle style) { + Location l = object.getLocation(); + switch (hotspot.getHotspot().getType()) { + case STAIRCASE: + int z = l.getZ(); + if (region == player.getHouseManager().getDungeonRegion()) { + z = 3; + } + for (int i = -1; i <= 1; i++) { + int plane = (z + (i == -1 ? 3 : i)) % 4; + Room r = player.getHouseManager().getRooms()[plane][l.getChunkX()][l.getChunkY()]; + if (r != null && r.getRotation() == room.getRotation()) { + Hotspot h = r.getStairs(); + if (h != null) { + h.setDecorationIndex(-1); + Region reg = plane == 3 ? player.getHouseManager().getDungeonRegion() : player.getHouseManager().getRegion(); + if (reg == null) { + continue; + } + BuildRegionChunk chunk = (BuildRegionChunk) reg.getPlanes()[plane % 3].getChunks()[l.getChunkX()][l.getChunkY()]; + GameObject[] objects = chunk.getObjects(h.getCurrentX(), h.getCurrentY()); + for (GameObject o : objects) { + if (o != null && o.getType() == object.getType()) { + ObjectBuilder.replace(o, o.transform(h.getHotspot().getObjectId(style))); + break; + } + } + } else { + SystemLogger.logErr("Couldn't find stairs! " + plane); + } + } + } + if (l.getZ() == 1) { + if (room.getProperties() == RoomProperties.SKILL_HALL_2) { + room.updateProperties(player, RoomProperties.SKILL_HALL); + } + else if (room.getProperties() == RoomProperties.QUEST_HALL_2) { + room.updateProperties(player, RoomProperties.QUEST_HALL); + } + else { + break; + } + player.getHouseManager().reload(player, true); + } + break; + case INDIVIDUAL: + case CREST: + ObjectBuilder.replace(object, object.transform(hotspot.getHotspot().getObjectId(style))); + hotspot.setDecorationIndex(-1); + break; + case RECURSIVE: + BuildRegionChunk chunk = (BuildRegionChunk) region.getPlanes()[l.getZ()].getChunks()[l.getChunkX()][l.getChunkY()]; + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + Hotspot h = room.getHotspot(hotspot.getHotspot(), x, y); + if (h != null) { + int objectId = hotspot.getHotspot().getDecorations()[h.getDecorationIndex()].getObjectId(style); + GameObject o = chunk.get(x, y, chunk.getIndex(x, y, objectId)); + h.setDecorationIndex(-1); + if (o != null && objectId == o.getId()) { + ObjectBuilder.replace(o, o.transform(hotspot.getHotspot().getObjectId(style))); + } + } + } + } + break; + case LINKED: + BuildHotspot[] linkedHotspots = BuildHotspot.getLinkedHotspots(hotspot.getHotspot()); + chunk = (BuildRegionChunk) region.getPlanes()[l.getZ()].getChunks()[l.getChunkX()][l.getChunkY()]; + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + for (BuildHotspot bh : linkedHotspots) { + Hotspot h = room.getHotspot(bh, x, y); + if (h != null) { + int objectId = bh.getDecorations()[h.getDecorationIndex()].getObjectId(style); + GameObject o = chunk.get(x, y, chunk.getIndex(x, y, objectId)); + h.setDecorationIndex(-1); + if (o != null && objectId == o.getId()) { + ObjectBuilder.replace(o, o.transform(bh.getObjectId(style))); + } + } + } + } + } + break; + } + } + + /** + * Checks if the decoration can be built. + * @param player The player. + * @param deco The decoration. + * @param object The object. + * @return {@code True} if so. + */ + private static boolean canBuildDecoration(Player player, Room room, Decoration deco, GameObject object) { + switch (deco) { + case TENTACLE_MID: + case TENTACLE_SIDE: + case TENTACLE_CORNER: + case TENTACLE_FL: + if (!room.isBuilt(BuildHotspot.PRISON)) { + player.getPacketDispatch().sendMessage("You can't build a tentacle pool without a cage."); + return false; + } + return true; + default: + return true; + } + } + + /** + * Checks if the decoration can be built. + * @param player The player. + * @param hotspot The hotspot. + * @param object The object. + * @return {@code True} if so. + */ + @SuppressWarnings("unused") + private static boolean setLinkedHotspot(Player player, Room room, Hotspot hotspot, int decorationIndex, GameObject object) { + Location l = object.getLocation(); + int z = l.getZ(); + switch (hotspot.getHotspot()) { + case STAIRWAYS: + case QUEST_STAIRWAYS: + case STAIRWAYS_DUNGEON: + BuildHotspot[] stairs = { BuildHotspot.STAIRS_DOWN, BuildHotspot.STAIRS_DOWN2, BuildHotspot.STAIRWAYS, BuildHotspot.QUEST_STAIRWAYS, BuildHotspot.STAIRWAYS_DUNGEON }; + for (int i = 0; i < 2; i++) { + int plane = (z + 1 + (i * 2)) % 4; + Room r = player.getHouseManager().getRooms()[plane][l.getChunkX()][l.getChunkY()]; + if (r != null) { + for (BuildHotspot h : stairs) { + Hotspot hs = r.getHotspot(h, hotspot.getCurrentX(), hotspot.getCurrentY()); + if (hs != null) { + hs.setDecorationIndex(decorationIndex); + ObjectBuilder.replace(object, object.transform(h.getDecorations()[decorationIndex].getObjectId(player.getHouseManager().getStyle()))); + break; + } + } + } + } + return true; + default: + return true; + } + } + + /** + * Builds a room. + * @param player The player. + * @param room The room to build. + * @param reload + */ + public static void buildRoom(Player player, Room room, int z, int x, int y, boolean[] exits, boolean reload) { + player.getHouseManager().getRooms()[z][x][y] = room; + player.getPacketDispatch().sendMessage("Building room " + room.getProperties() + "."); + if (z == 3) { + player.getHouseManager().setHasDungeon(true); + } + if (room.getProperties().isChamber() && z < 2) { + int count = 0; + int index = 0; + for (int i = 0; i < exits.length; i++) { + if (exits[i]) { + count++; + } else { + index = i; + } + } + //(0=east, 1=south, 2=west, 3=north). + // System.out.println("Roof information: index=" + index + ", exit count=" + count + "; array=" + Arrays.toString(exits)); + if (count == 4) { + room = Room.create(player, RoomProperties.ROOF_4_EXIT); + } + else if (count == 3) { + room = Room.create(player, RoomProperties.ROOF_3_EXIT); + room.setRotation(DIRECTIONS[(index + 2) % 4]); + } + else if ((exits[0] != exits[2]) || (exits[1] != exits[3])) { + room = Room.create(player, RoomProperties.ROOF_3_EXIT); + if (exits[2]) { + room.setRotation(DIRECTIONS[exits[3] ? 3 : 1]); + } + } else { + room = Room.create(player, RoomProperties.ROOF_2_EXIT); + if (exits[0] || exits[2]) { + room.setRotation(DIRECTIONS[1]); + } + } + player.getHouseManager().getRooms()[z + 1][x][y] = room; + } + if (reload) { + player.getHouseManager().reload(player, true); + } + } + + /** + * Checks of a room exists. + * @param player the player + * @param door the door hotspot the player is trying to build at + * @return true if the room is built already + */ + public static int[] roomExists(Player player, GameObject door) { + int[] location = getRoomPosition(player, door); + int z = player.getLocation().getZ(); + if (HouseManager.isInDungeon(player)) { + z = 3; + } + if (player.getHouseManager().hasRoom(z, location[0], location[1])) { + return location; + } + return null; + } + + /** + * Gets the room offset. + * @param door The door. + * @return The room offset [x, y]. + */ + public static int[] getRoomPosition(Player player, GameObject door) { + Location l = door.getLocation(); + int rotation = door.getRotation(); + if (player.getLocation().getChunkX() != l.getLocation().getChunkX() + || player.getLocation().getChunkY() != l.getLocation().getChunkY()) { + return new int[] { l.getChunkX(), l.getChunkY() }; + } + switch (rotation) { + case 0: //West + return new int[] { l.getChunkX() - 1, l.getChunkY() }; + case 1: //North + return new int[] { l.getChunkX(), l.getChunkY() + 1}; + case 2: //East + return new int[] { l.getChunkX() + 1, l.getChunkY() }; + case 3: //South + return new int[] { l.getChunkX(), l.getChunkY() - 1}; + } + return null; + } + + /** + * Gets the available rotations of the room to build. + * @param exits The exits of the room. + * @param z The plane + * @param roomX The room x-coordinate. + * @param roomY The room y-coordinate. + * @return The available rotations for the room [NORTH, EAST, SOUTH, WEST]. + */ + public static Direction[] getAvailableRotations(Player player, boolean[] exits, int z, int roomX, int roomY) { + Direction[] directions = new Direction[4]; + boolean[] exit = Arrays.copyOf(exits, exits.length); //(0=east, 1=south, 2=west, 3=north) + int[] info = getExitRequirements(player, z, roomX, roomY);//(0=west, 1=north, 2=east, 3=south) + // SystemLogger.logErr("Available exits - [east=" + exit[0] + ", south=" + exit[1] + ", west=" + exit[2] + ", north=" + exit[3] + "]!"); + // SystemLogger.logErr("Required exits - [east=" + info[0] + ", south=" + info[1] + ", west=" + info[2] + ", north=" + info[3] + "]!"); + for (int i = 0; i < 4; i++) { + boolean success = true; + for (int j = 0; j < 4; j++) { + if ((info[j] == 1 && !exit[j]) || (info[j] == -1 && exit[j])) { + success = false; + break; + } + } + if (success) { + directions[i] = DIRECTIONS[i]; + } + for (int j = 0; j < exit.length; j++) { + exit[(j + i + 1) % exit.length] = exits[j]; + } + } + return directions; + } + + /** + * Gets the exit requirements for the given room. + * @param roomX The room x-coordinate. + * @param roomY The room y-coordinate. + * @return The disabled exit indexes. + */ + private static int[] getExitRequirements(Player player, int z, int roomX, int roomY) { + int[] exits = new int[4]; + if (roomX == 0) { + exits[2] = -1; + } + else if (player.getHouseManager().hasExit(z, roomX - 1, roomY, Direction.EAST)) { + exits[2] = 1; + } + else if (player.getHouseManager().hasRoom(z, roomX - 1, roomY)) { + exits[2] = -1; + } + if (roomY == 7) { + exits[3] = -1; + } + else if (player.getHouseManager().hasExit(z, roomX, roomY + 1, Direction.SOUTH)) { + exits[3] = 1; + } + else if (player.getHouseManager().hasRoom(z, roomX, roomY + 1)) { + exits[3] = -1; + } + if (roomX == 7) { + exits[0] = -1; + } + else if (player.getHouseManager().hasExit(z, roomX + 1, roomY, Direction.WEST)) { + exits[0] = 1; + } + else if (player.getHouseManager().hasRoom(z, roomX + 1, roomY)) { + exits[0] = -1; + } + if (roomY == 0) { + exits[1] = -1; + } + else if (player.getHouseManager().hasExit(z, roomX, roomY - 1, Direction.NORTH)) { + exits[1] = 1; + } + else if (player.getHouseManager().hasRoom(z, roomX, roomY - 1)) { + exits[1] = -1; + } + return exits; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/ConstructionGuideBook.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/ConstructionGuideBook.java new file mode 100644 index 000000000..fa33fed8a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/ConstructionGuideBook.java @@ -0,0 +1,104 @@ +package core.game.node.entity.skill.construction; + + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.book.Book; +import core.game.content.dialogue.book.Page; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.plugin.Initializable; + +/** + * Handles the construction guide book. + * @author Emperor + * + */ +@Initializable +public class ConstructionGuideBook extends Book { + + /** + * The resources used in beta. + */ + private static final Item[] RESOURCES = { + new Item(8794), + new Item(2347), + new Item(4819, 500000), + new Item(4820, 500000), + new Item(1539, 500000), + new Item(4821, 500000), + new Item(4822, 500000), + new Item(4823, 500000), + new Item(4824, 500000), + new Item(961, 500000), + new Item(8779, 500000), + new Item(8781, 500000), + new Item(8783, 500000), + new Item(8791, 500000), + new Item(8785, 500000), + new Item(8787, 500000), + new Item(8789, 500000), //16 + new Item(8418, 500000), + new Item(8420, 500000), + new Item(8422, 500000), + new Item(8424, 500000), + new Item(8426, 500000), + new Item(8428, 500000), + new Item(8430, 500000), + new Item(8432, 500000), + new Item(8434, 500000), + new Item(8436, 500000), + }; + + /** + * Constructs a new {@code ConstructionGuideBook} {@code Object}. + */ + public ConstructionGuideBook() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code ConstructionGuideBook} {@code Object}. + * @param player + */ + public ConstructionGuideBook(Player player) { + super(player, "Construction guide book", DialogueInterpreter.getDialogueKey("book:conguide")); + } + + @Override + public boolean open(final Player player) { + if (GameWorld.getSettings().isDevMode() && GameWorld.getSettings().isBeta()) { + for (Item item : RESOURCES) { + if (!player.getInventory().contains(item.getId(), item.getAmount())) { + player.getInventory().add(item, player); + } + } + } + interpreter.sendPlainMessage(false, "Upon reading the book you discover you're supposed to", "use these resources to test out construction.", "Report all bugs on the forums."); + return true; + } + + @Override + public void finish() { + + } + + @Override + public void display(Page[] set) { + + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ConstructionGuideBook(player); + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("book:conguide") }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/ConstructionInterface.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/ConstructionInterface.java new file mode 100644 index 000000000..e8eec0ec3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/ConstructionInterface.java @@ -0,0 +1,117 @@ +package core.game.node.entity.skill.construction; + + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.system.SystemLogger; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Plugin; + +/** + * Handles the creating of a decoration object. + * @author Emperor + * + */ +@Initializable +public final class ConstructionInterface extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) { + ComponentDefinition.put(396, this); + ComponentDefinition.put(398, this); + ComponentDefinition.put(402, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (component.getId()) { + case 396: + switch (button) { + case 132: + player.getInterfaceManager().close(); + Hotspot hotspot = player.getAttribute("con:hotspot"); + GameObject object = player.getAttribute("con:hsobject"); + if (hotspot == null || object == null) { + SystemLogger.logErr("Failed building decoration " + hotspot + " : " + object); + break; + } + slot = ((slot % 2 != 0) ? 4 : 0) + (slot >> 1); + if (slot >= hotspot.getHotspot().getDecorations().length) { + SystemLogger.logErr("Failed building decoration " + slot + "/" + hotspot.getHotspot().getDecorations().length); + break; + } + boolean debug = player.isStaff(); + Decoration deco = hotspot.getHotspot().getDecorations()[slot]; + if (!debug) { + if (player.getSkills().getLevel(Skills.CONSTRUCTION) < deco.getLevel()) { + player.sendMessage("You need to have a Construction level of " + deco.getLevel() + " to build that."); + return true; + } + if (!player.getInventory().containsItems(deco.getItems())) { + player.sendMessage("You don't have the right materials."); + return true; + } + for (int tool : deco.getTools()) { + if (tool == BuildingUtils.WATERING_CAN) { + boolean hasWateringCan = false; + for (int i = 0; i < 8; i++) { + if (player.getInventory().contains(tool - i, 1)) { + hasWateringCan = true; + break; + } + } + if (!hasWateringCan) { + player.sendMessage("You need a watering can to plant this."); + return true; + } + continue; + } + if (!player.getInventory().contains(tool, 1)) { + player.sendMessage("You need a " + ItemDefinition.forId(tool).getName() + " to build this."); + return true; + } + } + } + BuildingUtils.buildDecoration(player, hotspot, deco, object); + return true; + } + break; + case 398: + switch (button) { + case 14: + player.getHouseManager().toggleBuildingMode(player, true); + return true; + case 1: + player.getHouseManager().toggleBuildingMode(player, false); + return true; + case 15: + player.getHouseManager().expelGuests(player); + return true; + case 13: + if (!player.getHouseManager().isInHouse(player)) { + player.sendMessage("You can't do this outside of your house."); + return true; + } + HouseManager.leave(player); + return true; + } + break; + case 402: + int index = button - 160; + SystemLogger.logErr("BuildRoom Interface Index: " + index); + if (index > -1 && index < RoomProperties.values().length) { + player.getDialogueInterpreter().open("con:room", RoomProperties.values()[index]); + return true; + } + break; + } + return false; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/CrestType.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/CrestType.java new file mode 100644 index 000000000..4ba5a665f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/CrestType.java @@ -0,0 +1,116 @@ +package core.game.node.entity.skill.construction; + +import core.game.node.entity.player.Player; +import core.tools.Items; +import core.game.node.entity.skill.Skills; + +/** + * Family crest types. + * + * @author Emperor + * >ORDINAL BOUND< + */ +public enum CrestType implements CrestRequirement { + + ARRAV("the Shield of Arrav symbol") { // requires Shield of Arrav + + @Override + public boolean eligible(Player player) { + return player.getQuestRepository().isComplete("Shield of Arrav"); + } + }, + ASGARNIA("the symbol of Asgarnia"), // no requirements + DORGESHUUN("the Dorgeshuun brooch") { // requires The Lost Tribe + + @Override + public boolean eligible(Player player) { + return player.getQuestRepository().isComplete("The Lost Tribe"); + } + }, + DRAGON("a dragon") { // requires Dragon Slayer + + @Override + public boolean eligible(Player player) { + return player.getQuestRepository().isComplete("Dragon Slayer"); + } + }, + FAIRY("a fairy") { // requries Lost City + + @Override + public boolean eligible(Player player) { + return player.getQuestRepository().isComplete("Lost City"); + } + }, + GUTHIX("the symbol of Guthix") { // Requires 70+ Prayer + + @Override + public boolean eligible(Player player) { + return player.getSkills().hasLevel(Skills.PRAYER, 70); + } + }, + HAM("the symbol of the HAM cult."), // no requirements + HORSE("a horse") { // requires Toy Horsey in inventory + + @Override + public boolean eligible(Player player) { + return player.getInventory().containsAtLeastOneItem(new int[]{ + Items.TOY_HORSEY_2524, + Items.TOY_HORSEY_2520, + Items.TOY_HORSEY_2526, + Items.TOY_HORSEY_2522 + }); + } + }, + JOGRE("Jiggig"), // no requirements + KANDARIN("the symbol of Kandarin"), // no requirements + MISTHALIN("the symbol of Misthalin"), // no requirements + MONEY("a bag of money", 500000), // Costs 500k + SARADOMIN("the symbol of Saradomin") { // Requires 70+ Prayer + + @Override + public boolean eligible(Player player) { + return player.getSkills().hasLevel(Skills.PRAYER, 70); + } + }, + SKULL("a skull") { // requires Skulled while talking to Herald + + @Override + public boolean eligible(Player player) { + return player.getSkullManager().isSkulled(); + } + }, + VARROCK("the symbol of Varrock"), // no requirements + ZAMORAK("the symbol of Zamorak") { // Requires 70+ Prayer + + @Override + public boolean eligible(Player player) { + return player.getSkills().hasLevel(Skills.PRAYER, 70); + } + }; + + private String name; + private int cost; + + CrestType(String name, int cost) { + this.name = name; + this.cost = cost; + } + + CrestType(String name) { + this(name, 5000); + } + + public String getName() { + return this.name; + } + + public int getCost() { + return this.cost; + } +} + +interface CrestRequirement { + default boolean eligible(Player player) { + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/Decoration.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/Decoration.java new file mode 100644 index 000000000..c51424a45 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/Decoration.java @@ -0,0 +1,1315 @@ +package core.game.node.entity.skill.construction; + + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; + +/** + * Represents the decorations. + * @author Emperor + * + */ +public enum Decoration { + + /** + * Garden centrepiece decorations. + */ + PORTAL(13405, 8168, 1, 100.0, new Item(2351, 10)), + ROCK(13406, 8169, 5, 100.0, new Item(3420, 5)), + POND(13407, 8170, 10, 100.0, new Item(1761, 10)), + IMP_STATUE(13408, 8171, 15, 150.0, new Item(3420, 5), new Item(1761, 5)), + DUNGEON_ENTRANCE(13409, 8172, 70, 500.0, new Item(8786)), + + + /** + * Garden big tree decorations. + */ + BIG_DEAD_TREE(13411, 8173, 5, 31.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8417)), + BIG_TREE(13412, 8174, 10, 44.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8419)), + BIG_OAK_TREE(13413, 8175, 15, 70.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8421)), + BIG_WILLOW_TREE(13414, 8176, 30, 100.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8423)), + BIG_MAPLE_TREE(13415, 8177, 45, 122.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8425)), + BIG_YEW_TREE(13416, 8178, 60, 141.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8427)), + BIG_MAGIC_TREE(13417, 8179, 75, 223.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8429)), + + /** + * Garden tree decorations. + */ + DEAD_TREE(13418, 8173, 5, 31.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8417)), + TREE(13419, 8174, 10, 44.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8419)), + OAK_TREE(13420, 8175, 15, 70.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8421)), + WILLOW_TREE(13421, 8176, 30, 100.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8423)), + MAPLE_TREE(13423, 8177, 45, 122.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8425)), + YEW_TREE(13422, 8178, 60, 141.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8427)), + MAGIC_TREE(13424, 8179, 75, 223.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8429)), + + /** + * Garden big plant 1 decorations. + */ + FERN(13425, 8186, 1, 31.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8431)), + BUSH(13426, 8187, 6, 70.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8433)), + TALL_PLANT(13427, 8188, 12, 100.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8435)), + + /** + * Garden big plant 2 decorations. + */ + SHORT_PLANT(13428, 8189, 1, 31.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8431)), + LARGE_LEAF_PLANT(13429, 8190, 6, 70.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8433)), + HUGE_PLANT(13430, 8191, 12, 100.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8435)), + + /** + * Garden small plant 1 decorations. + */ + PLANT(13431, 8180, 1, 31.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8431)), + SMALL_FERN(13432, 8181, 6, 70.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8433)), + FERN_SP(13433, 8182, 12, 100.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8435)), + + /** + * Garden small plant 2 decorations. + */ + DOCK_LEAF(13434, 8183, 1, 31.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8431)), + THISTLE(13435, 8184, 6, 70.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8433)), + REEDS(13436, 8185, 12, 100.0, new int[] {BuildingUtils.WATERING_CAN}, new Item(8435)), + + /** + * Parlour chair spot + */ + CRUDE_CHAIR(13581, 8309, 1, 66.0, new Item(960, 2)), + WOODEN_CHAIR(13582, 8310, 8, 96.0, new Item(960, 3)), + ROCKING_CHAIR(13583, 8311, 14, 96.0, new Item(960, 3)), + OAK_CHAIR(13584, 8312, 19, 120.0, new Item(8778, 2)), + OAK_ARMCHAIR(13585, 8313, 26, 180.0, new Item(8778, 3)), + TEAK_ARMCHAIR(13586, 8314, 35, 180.0, new Item(8780, 2)), + MAHOGANY_ARMCHAIR(13587, 8315, 50, 280.0, new Item(8782, 2)), + + /** + * Rugs rugs rugs + */ + BROWN_RUG_CORNER(13588, 8316, 2, 30.0, new Item(8790, 2)), + RED_RUG_CORNER(13591, 8317, 13, 60.0, new Item(8790, 4)), + OPULENT_RUG_CORNER(13594, 8318, 65, 360.0, new Item(8790, 4), new Item(8784, 1)), + + BROWN_RUG_END(13589, 8316, 2, 30.0, new Item(8790, 2)), + RED_RUG_END(13592, 8317, 13, 60.0, new Item(8790, 4)), + OPULENT_RUG_END(13595, 8318, 65, 360.0, new Item(8790, 4), new Item(8784, 1)), + + BROWN_RUG_CENTER(13590, 8316, 2, 30.0, new Item(8790, 2)), + RED_RUG_CENTER(13593, 8317, 13, 60.0, new Item(8790, 4)), + OPULENT_RUG_CENTER(13596, 8318, 65, 360.0, new Item(8790, 4), new Item(8784, 1)), + + /** + * Parlour fireplaces + */ + CLAY_FIREPLACE(13609, 8325, 3, 30.0, new Item(1761, 3)), + STONE_FIREPLACE(13611, 8326, 33, 40.0, new Item(3420, 2)), + MARBLE_FIREPLACE(13613, 8327, 63, 500.0, new Item(8786, 1)), + + /** + * Parlour curtain spot + */ + TORN_CURTAINS(13603, 8322, 2, 132.0, new Item(960, 3), new Item(8790, 3)), + CURTAINS(13604, 8323, 18, 225.0, new Item(8778, 3), new Item(8790, 3)), + OPULENT_CURTAINS(13605, 8324, 40, 315.0, new Item(8780, 3), new Item(8790, 3)), + + /** + * Parlour bookcases + */ + WOODEN_BOOKCASE(13597, 8319, 4, 132.0, new Item(960, 4)), + OAK_BOOKCASE(13598, 8320, 29, 225.0, new Item(8778, 3)), + MAHOGANY_BOOKCASE(13599, 8321, 40, 315.0, new Item(8782, 3)), + + + /** + * Kitchen Beer Barrels + * TODO: These also require cooking levels! + * Basic: 1, Cider: 14, Asgarnian: 24, Greenman's: 29, D.Bitter: 39, Chef's: 54 + * + */ + BASIC_BEER_BARREL(13568, 8239, 7, 87.0, new Item(960, 3)), + CIDER_BARREL(13569, 8240, 12, 91.0, new Item(960, 3), new Item(5763, 8)), + ASGARNIAN_ALE_BARREL(13570, 8241, 18, 184.0, new Item(8778, 3), new Item(1905, 8)), + GREENMANS_ALE_BARREL(13571, 8242, 26, 184.0, new Item(8778, 3), new Item(1909, 8)), + DRAGON_BITTER_BARREL(13572, 8243, 36, 224.0, new Item(8778, 3), new Item(1911, 8), new Item(2353, 2)), + CHEFS_DELIGHT_BARREL(13573, 8244, 48, 224.0, new Item(8778, 3), new Item(5755, 8), new Item(2353, 2)), + + + /** + * Kitchen Tables! + */ + KITCHEN_WOODEN_TABLE(13577, 8246, 12, 87.0, new Item(960, 3)), + KITCHEN_OAK_TABLE(13578, 8247, 32, 180.0, new Item(8778, 3)), + KITCHEN_TEAK_TABLE(13579, 8248, 52, 270.0, new Item(8780, 3)), + + + /** + * Kitchen Stoves + */ + BASIC_FIREPIT(13528, 8216, 5, 40.0, new Item(1761, 2), new Item(2353, 1)), + FIREPIT_WITH_HOOK(13529, 8217, 11, 60.0, new Item(1761, 2), new Item(2353, 2)), + FIREPIT_WITH_POT(13531, 8218, 17, 80.0, new Item(1761, 2), new Item(2353, 3)), + SMALL_OVEN(13533, 8219, 24, 80.0, new Item(2353, 4)), + LARGE_OVEN(13536, 8220, 29, 100.0, new Item(2353, 5)), + BASIC_RANGE(13539, 8221, 34, 120.0, new Item(2353, 6)), + FANCY_RANGE(13542, 8222, 42, 160.0, new Item(2353, 8)), + + /** + * Kitchen larders + */ + WOODEN_LARDER(13565, 8233, 9, 228.0, new Item(960, 8)), + OAK_LARDER(13566, 8234, 33, 480.0, new Item(8778, 8)), + TEAK_LARDER(13567, 8235, 43, 750.0, new Item(8780, 8), new Item(8790, 2)), + + + /** + * Kitchen shelves + */ + WOODEN_SHELVES_1(13545, 8223, 6, 87.0, new Item(960, 3)), + WOODEN_SHELVES_2(13546, 8224, 12, 147.0, new Item(960, 3), new Item(1761, 6)), + WOODEN_SHELVES_3(13547, 8225, 23, 147.0, new Item(960, 3), new Item(1761, 6)), + OAK_SHELVES_1(13548, 8226, 34, 240.0, new Item(8778, 3), new Item(1761, 6)), + OAK_SHELVES_2(13549, 8227, 45, 240.0, new Item(8778, 3), new Item(1761, 6)), + TEAK_SHELVES_1(13550, 8228, 56, 330.0, new Item(8780, 3), new Item(1761, 6)), + TEAK_SHELVES_2(13551, 8229, 67, 930.0, new Item(8780, 3), new Item(1761, 6), new Item(8784, 2)), + + /** + * Kitchen sinks + */ + PUMP_AND_DRAIN(13559, 8230, 7, 100.0, new Item(2353, 5)), + PUMP_AND_TUB(13561, 8231, 27, 200.0, new Item(2353, 10)), + SINK(13563, 8232, 47, 300.0, new Item(2353, 15)), + + + /** + * Kitchen cat baskets/blankets + */ + CAT_BLANKET(13574, 8236, 5, 15.0, new Item(8790, 1)), + CAT_BASKET(13575, 8237, 19, 58.0, new Item(960, 2)), + CAST_BASKET_CUSHIONED(13576, 8238, 33, 58.0, new Item(960, 2), new Item(1737, 2)), + + + /** + * Dining room tables + */ + DINING_TABLE_WOOD(13293, 8246, 10, 115.0, new Item(960, 4)), + DINING_TABLE_OAK(13294, 8247, 22, 240.0, new Item(8778, 4)), + DINING_TABLE_CARVED_OAK(13295, 8247, 31, 360.0, new Item(8778, 6)), + DINING_TABLE_TEAK(13296, 8248, 38, 360.0, new Item(8780, 4)), + DINING_TABLE_CARVED_TEAK(13297, 8248, 45, 600.0, new Item(8780, 6), new Item(8790, 4)), + DINING_TABLE_MAHOGANY(13298, 8120, 52, 840.0, new Item(8782, 6)), + DINING_TABLE_OPULENT(13299, 8121, 72, 3100.0, new Item(8782, 6), new Item(8790, 4), + new Item(8784, 4), new Item(8786, 2)), + + + /** + * Dining room benches + */ + BENCH_WOODEN(13300, 8108, 10, 115.0, new Item(960, 4)), + BENCH_OAK(13301, 8109, 22, 240.0, new Item(8778, 4)), + BENCH_CARVED_OAK(13302, 8110, 31, 240.0, new Item(8778, 4)), + BENCH_TEAK(13303, 8111, 38, 360.0, new Item(8780, 4)), + BENCH_CARVED_TEAK(13304, 8112, 44, 360.0, new Item(8780, 4)), + BENCH_MAHOGANY(13305, 8113, 52, 560.0, new Item(8782, 6)), + BENCH_GILDED(13306, 8114, 61, 1760.0, new Item(8782, 4), new Item(8784, 4)), + + /** + * Dining room bell-pulls + */ + ROPE_PULL(13307, 8099, 5, 15.0, new Item(954, 1), new Item(8778, 1)), + BELL_PULL(13308, 8100, 19, 58.0, new Item(8780, 1), new Item(8790, 2)), + FANCY_BELL_PULL(13309, 8101, 33, 58.0, new Item(8780, 1), new Item(8790, 2), new Item(8784, 1)), + + /** + * Workshop workbench + */ + WORKBENCH_WOODEN(13704, 8375, 17, 145.0, new Item(960, 1)), + WORKBENCH_OAK(13705, 8376, 32, 300.0, new Item(8778, 5)), + WORKBENCH_STEEL_FRAME(13706, 8377, 46, 440.0, new Item(8778, 6), new Item(2353, 4)), + WORKBENCH_WITH_VICE(13707, 8378, 62, 750.0, new Item(8377, 1), new Item(8778, 2), new Item(2353, 1)), + WORKBENCH_WITH_LATHE(13708, 8379, 77, 1000.0, new Item(8376, 1), new Item(8778, 2), new Item(2353, 1)), + + /** + * Workshop repair benches/stands + */ + REPAIR_BENCH(13713, 8389, 15, 120.0, new Item(8778, 2)), + WHETSTONE(13714, 8390, 35, 260.0, new Item(8778, 4), new Item(3420, 1)), + ARMOUR_STAND(13715, 8391, 55, 500.0, new Item(8778, 8), new Item(3420, 1)), + + /** + * Workshop easels + */ + PLUMING_STAND(13716, 8392, 16, 120.0, new Item(8778, 2)), + SHIELD_EASEL(13717, 8393, 41, 240.0, new Item(8778, 4)), + BANNER_EASEL(13718, 8394, 66, 510.0, new Item(8778, 8), new Item(8790, 2)), + + /** + * Workshop crafting tables + * TODO: These are upgradable hotspots, therefore crafting table 3 would require + * crafting table 2 to be already built in that spot. + */ + CRAFTING_TABLE_1(13709, 8380, 16, 50.0, new Item(8778, 4)), + CRAFTING_TABLE_2(13710, 8381, 25, 100.0, new Item(1775, 1)), + CRAFTING_TABLE_3(13711, 8382, 34, 175.0, new Item(1775, 2)), + CRAFTING_TABLE_4(13712, 8383, 42, 240.0, new Item(8778, 2)), + + /** + * Workshop tool stores + * These are also upgradable just like the tables above. + */ + TOOL_STORE_1(13699, 8384, 15, 120.0, new Item(8778, 2)), + TOOL_STORE_2(13700, 8385, 25, 120.0, new Item(8778, 2)), + TOOL_STORE_3(13701, 8386, 35, 120.0, new Item(8778, 2)), + TOOL_STORE_4(13702, 8387, 44, 120.0, new Item(8778, 2)), + TOOL_STORE_5(13703, 8388, 55, 120.0, new Item(8778, 2)), + + + /** + * Wall-mounted decorations + */ + OAK_DECORATION(13606, 8102, 16, 120.0, new Item(8778, 2)), + TEAK_DECORATION(13606, 8103, 36, 180.0, new Item(8780, 2)), + GILDED_DECORATION(13607, 8104, 56, 1020.0, new Item(8782, 3), new Item(8784, 2)), + + /** + * Staircases. + */ + OAK_STAIRCASE(13497, 8249, 27, 680.0, new Item(8778, 10), new Item(2353, 4)), + TEAK_STAIRCASE(13499, 8252, 48, 980.0, new Item(8780, 10), new Item(2353, 4)), + SPIRAL_STAIRCASE(13503, 8258, 67, 1040.0, new Item(8780, 10), new Item(3420, 7)), + MARBLE_STAIRCASE(13501, 8257, 82, 3200.0, new Item(8782, 5), new Item(8786, 5)), + MARBLE_SPIRAL(13505, 8259, 97, 4400.0, new Item(8780, 10), new Item(8786, 7)), + + /** + * Staircases going down. + */ + OAK_STAIRS_DOWN(13498, 8249, 27, 680.0, new Item(8778, 10), new Item(2353, 4)), + TEAK_STAIRS_DOWN(13500, 8252, 48, 980.0, new Item(8780, 10), new Item(2353, 4)), + SPIRAL_STAIRS_DOWN(13504, 8258, 67, 1040.0, new Item(8780, 10), new Item(3420, 7)), + MARBLE_STAIRS_DOWN(13502, 8257, 82, 3200.0, new Item(8782, 5), new Item(8786, 5)), + MARBLE_SPIRAL_DOWN(13506, 8259, 97, 4400.0, new Item(8780, 10), new Item(8786, 7)), + + /** + * Portal room decorations. + */ + TEAK_PORTAL(13636, 8328, 50, 270.0, new Item(8780, 3)), + MAHOGANY_PORTAL(13637, 8329, 65, 420.0, new Item(8782, 3)), + MARBLE_PORTAL(13638, 8330, 80, 1500.0, new Item(8786, 3)), + TELEPORT_FOCUS(13640, 8331, 50, 40, new Item(3420, 2)), + GREATER_TELEPORT_FOCUS(13641, 8332, 65, 500.0, new Item(8786, 1)), + SCRYING_POOL(13639, 8333, 80, 2000.0, new Item(8786, 4)), + TEAK_VARROCK_PORTAL(13615, true), + MAHOGANY_VARROCK_PORTAL(13622, true), + MARBLE_VARROCK_PORTAL(13629, true), + TEAK_LUMBRIDGE_PORTAL(13616, true), + MAHOGANY_LUMBRIDGE_PORTAL(13623, true), + MARBLE_LUMBRIDGE_PORTAL(13630, true), + TEAK_FALADOR_PORTAL(13617, true), + MAHOGANY_FALADOR_PORTAL(13624, true), + MARBLE_FALADOR_PORTAL(13631, true), + TEAK_CAMELOT_PORTAL(13618, true), + MAHOGANY_CAMELOT_PORTAL(13625, true), + MARBLE_CAMELOT_PORTAL(13632, true), + TEAK_ARDOUGNE_PORTAL(13619, true), + MAHOGANY_ARDOUGNE_PORTAL(13626, true), + MARBLE_ARDOUGNE_PORTAL(13633, true), + TEAK_YANILLE_PORTAL(13620, true), + MAHOGANY_YANILLE_PORTAL(13627, true), + MARBLE_YANILLE_PORTAL(13634, true), + TEAK_KHARYRLL_PORTAL(13621, true), + MAHOGANY_KHARYRLL_PORTAL(13628, true), + MARBLE_KHARYRLL_PORTAL(13635, true), + + /** + * Skill hall decorations. + */ + MITHRIL_ARMOUR(13491, 8270, 28, 135.0, new Item(8778, 2), new Item(1159, 1), new Item(1121, 1), new Item(1085, 1)), + ADAMANT_ARMOUR(13492, 8271, 28, 150.0, new Item(8778, 2), new Item(1161, 1), new Item(1123, 1), new Item(1091, 1)), + RUNE_ARMOUR(13493, 8272, 28, 165.0, new Item(8778, 2),new Item(1163, 1), new Item(1127, 1), new Item(1093, 1)), + CRAWLING_HAND(13481, 8260, 38, 211.0, new Item(8780, 2), new Item(7982, 1)), + COCKATRICE_HEAD(13482, 8261, 38, 224.0, new Item(8780, 2), new Item(7983, 1)), + BASILISK_HEAD(13483, 8262, 38, 243.0, new Item(8780, 2), new Item(7984, 1)), + KURASK_HEAD(13484, 8263, 58, 357.0, new Item(8782, 2), new Item(7985, 1)), + ABYSSAL_DEMON_HEAD(13485, 8264, 58, 389.0, new Item(8782, 2), new Item(7986, 1)), + KBD_HEAD(13486, 8265, 78, 1103.0, new Item(8782, 2), new Item(7987, 1)), + KQ_HEAD(13487, 8266, 78, 1103.0, new Item(8782, 2), new Item(7988, 1)), + MOUNTED_BASS(13488, 8267, 36, 151.0, new Item(8778, 2), new Item(7990, 1)), + MOUNTED_SWORDFISH(13489, 8268, 56, 230.0, new Item(8780, 2), new Item(7992, 1)), + MOUNTED_SHARK(13490, 8269, 76, 350.0, new Item(8782, 2), new Item(7994, 1)), + RUNE_CASE1(13507, 8095, 41, 190.0, new Item(8780, 2), new Item(1775, 2), new Item(554, 1), new Item(556, 1), new Item(557, 1), new Item(555, 1)), + RUNE_CASE2(13508, 8095, 41, 212.0, new Item(8780, 2), new Item(1775, 2), new Item(559, 1), new Item(564, 1), new Item(562, 1), new Item(561, 1)), + + + /** + * Games room decorations. + */ + CLAY_STONE(13392, 8153, 39, 100.0, new Item(1761, 10)), + LIMESTONE_STONE(13393, 8154, 59, 200.0, new Item(3420, 10)), + MARBLE_STONE(13394, 8155, 79, 2000.0, new Item(8786, 4)), + HOOP_AND_STICK(13398, 8162, 30, 120.0, new Item(8778, 2)), + DARTBOARD(13400, 8163, 54, 290.0, new Item(8780, 3), new Item(2353, 1)), + ARCHERY_TARGET(13402, 8164, 81, 600.0, new Item(8780, 6), new Item(2353, 3)), + BALANCE_1(13395, 8156, 37, 176.0, new Item(554, 500), new Item(556, 500), new Item(557, 500), new Item(555, 500)), + BALANCE_2(13396, 8157, 57, 252.0, new Item(554, 1000), new Item(556, 1000), new Item(557, 1000), new Item(555, 1000)), + BALANCE_3(13397, 8158, 77, 356.0, new Item(554, 2000), new Item(556, 2000), new Item(557, 2000), new Item(555, 2000)), + OAK_CHEST(13385, 8165, 34, 240.0, new Item(8778, 4)), + TEAK_CHEST(13387, 8166, 44, 660.0, new Item(8780, 4), new Item(8784, 1)), + MAHOGANY_CHEST(13389, 8167, 54, 860.0, new Item(8782, 4), new Item(8784, 1)), + JESTER(13390, 8159, 39, 360.0, new Item(8780, 4)), + TREASURE_HUNT(13379, 8160, 49, 800.0, new Item(8780, 8), new Item(2353, 4)), + HANGMAN(13404, 8161, 59, 1200.0, new Item(8780, 12), new Item(2353, 6)), + + + /** + * Combat room decorations. + */ + BOXING_RING(13129, 8023, 32, 570.0, new Item(8778, 6), new Item(8790, 4)), + FENCING_RING(13133, 8024, 41, 570.0, new Item(8770, 8), new Item(8790, 6)), + COMBAT_RING(13137, 8025, 51, 630.0, new Item(8780, 6), new Item(8790, 6)), + BALANCE_BEAM_LEFT(13143, 8027, 81, 1000.0, new Item(8780, 10), new Item(2353, 5)), + BALANCE_BEAM_CENTER(13142, 8027, 81, 1000.0, new Item(8780, 10), new Item(2353, 5)), + BALANCE_BEAM_RIGHT(13144, 8027, 81, 1000.0, new Item(8780, 10), new Item(2353, 5)), + RANGING_PEDESTALS(13147, 8026, 71, 720.0, new Item(8780, 8)), + MAGIC_BARRIER(13145, 8026, 71, 720.0, new Item(8780, 8)), + NOTHING(13721, 8027, 81, 1000.0, new Item(8780, 10), new Item(2353, 5)), + NOTHING2(13721, 8026, 71, 720.0, new Item(8780, 8)), + INVISIBLE_WALL(15283, 8023, 32, 570.0, new Item(8778, 6), new Item(8790, 4)), + INVISIBLE_WALL2(15284, 8023, 32, 570.0, new Item(8778, 6), new Item(8790, 4)), + INVISIBLE_WALL3(15285, 8023, 32, 570.0, new Item(8778, 6), new Item(8790, 4)), + GLOVE_RACK(13381, 8028, 34, 120.0, new Item(8778, 2)), + WEAPONS_RACK(13382, 8029, 44, 180.0, new Item(8780, 2)), + EXTRA_WEAPONS_RACK(13383, 8030, 54, 440.0, new Item(8780, 4), new Item(2353, 4)), + BOXING_MAT_CORNER(13126, 8023, 32, 570.0, new Item(8778, 6), new Item(8790, 4)), + FENCING_MAT_CORNER(13135, 8024, 41, 570.0, new Item(8770, 8), new Item(7991, 6)), + COMBAT_MAT_CORNER(13138, 8025, 51, 630.0, new Item(8780, 6), new Item(7991, 6)), + BOXING_MAT_SIDE(13128, 8023, 32, 570.0, new Item(8778, 6), new Item(8790, 4)), + FENCING_MAT_SIDE(13134, 8024, 41, 570.0, new Item(8770, 8), new Item(7991, 6)), + COMBAT_MAT_SIDE(13139, 8025, 51, 630.0, new Item(8780, 6), new Item(7991, 6)), + BOXING_MAT(13127, 8023, 32, 570.0, new Item(8778, 6), new Item(8790, 4)), + FENCING_MAT(13136, 8024, 41, 570.0, new Item(8770, 8), new Item(7991, 6)), + COMBAT_MAT(13140, 8025, 51, 630.0, new Item(8780, 6), new Item(7991, 6)), + + + /** + * Formal garden decorations + */ + GAZEBO(13477, 8192, 65, 1200, new Item(8782, 8), new Item(2353, 4)), + SMALL_FOUNTAIN(13478, 8193, 71, 500, new Item(8786, 1)), + LARGE_FOUNTAIN(13479, 8194, 75, 1000, new Item(8786, 2)), + POSH_FOUNTAIN(13480, 8195, 81, 1500, new Item(8786, 3)), + SUNFLOWER(13446, 8213, 66, 70, new int[] {BuildingUtils.WATERING_CAN}, new Item(8457, 1)), + MARIGOLDS(13447, 8214, 71, 100, new int[] {BuildingUtils.WATERING_CAN}, new Item(8459, 1)), + ROSES(13448, 8215, 76, 122, new int[] {BuildingUtils.WATERING_CAN}, new Item(8461, 1)), + SUNFLOWER_BIG(13443, 8213, 66, 70, new int[] {BuildingUtils.WATERING_CAN}, new Item(8457, 1)), + MARIGOLDS_BIG(13444, 8214, 71, 100, new int[] {BuildingUtils.WATERING_CAN}, new Item(8459, 1)), + ROSES_BIG(13445, 8215, 76, 122, new int[] {BuildingUtils.WATERING_CAN}, new Item(8461, 1)), + ROSEMARY(13440, 8210, 66, 70, new int[] {BuildingUtils.WATERING_CAN}, new Item(8451, 1)), + DAFFODILS(13441, 8211, 71, 100, new int[] {BuildingUtils.WATERING_CAN}, new Item(8453, 1)), + BLUEBELLS(13442, 8212, 76, 122, new int[] {BuildingUtils.WATERING_CAN}, new Item(8455, 1)), + ROSEMARY_BIG(13437, 8210, 66, 70, new int[] {BuildingUtils.WATERING_CAN}, new Item(8451, 1)), + DAFFODILS_BIG(13438, 8211, 71, 100, new int[] {BuildingUtils.WATERING_CAN}, new Item(8453, 1)), + BLUEBELLS_BIG(13439, 8212, 76, 122, new int[] {BuildingUtils.WATERING_CAN}, new Item(8455, 1)), + THORNY_HEDGE1(13456, 8203, 56, 70, new int[] {BuildingUtils.WATERING_CAN}, new Item(8437, 1)), + THORNY_HEDGE2(13457, 8203, 56, 70, new int[] {BuildingUtils.WATERING_CAN}, new Item(8437, 1)), + THORNY_HEDGE3(13458, 8203, 56, 70, new int[] {BuildingUtils.WATERING_CAN}, new Item(8437, 1)), + NICE_HEDGE1(13459, 8204, 60, 100, new int[] {BuildingUtils.WATERING_CAN}, new Item(8439, 1)), + NICE_HEDGE2(13461, 8204, 60, 100, new int[] {BuildingUtils.WATERING_CAN}, new Item(8439, 1)), + NICE_HEDGE3(13460, 8204, 60, 100, new int[] {BuildingUtils.WATERING_CAN}, new Item(8439, 1)), + SMALL_BOX_HEDGE1(13462, 8205, 64, 122, new int[] {BuildingUtils.WATERING_CAN}, new Item(8441, 1)), + SMALL_BOX_HEDGE2(13464, 8205, 64, 122, new int[] {BuildingUtils.WATERING_CAN}, new Item(8441, 1)), + SMALL_BOX_HEDGE3(13463, 8205, 64, 122, new int[] {BuildingUtils.WATERING_CAN}, new Item(8441, 1)), + TOPIARY_HEDGE1(13465, 8206, 68, 141, new int[] {BuildingUtils.WATERING_CAN}, new Item(8443, 1)), + TOPIARY_HEDGE2(13467, 8206, 68, 141, new int[] {BuildingUtils.WATERING_CAN}, new Item(8443, 1)), + TOPIARY_HEDGE3(13466, 8206, 68, 141, new int[] {BuildingUtils.WATERING_CAN}, new Item(8443, 1)), + FANCY_HEDGE1(13468, 8207, 72, 158, new int[] {BuildingUtils.WATERING_CAN}, new Item(8445, 1)), + FANCY_HEDGE2(13470, 8207, 72, 158, new int[] {BuildingUtils.WATERING_CAN}, new Item(8445, 1)), + FANCY_HEDGE3(13469, 8207, 72, 158, new int[] {BuildingUtils.WATERING_CAN}, new Item(8445, 1)), + TALL_FANCY_HEDGE1(13471, 8208, 76, 223, new int[] {BuildingUtils.WATERING_CAN}, new Item(8447, 1)), + TALL_FANCY_HEDGE2(13473, 8208, 76, 223, new int[] {BuildingUtils.WATERING_CAN}, new Item(8447, 1)), + TALL_FANCY_HEDGE3(13472, 8208, 76, 223, new int[] {BuildingUtils.WATERING_CAN}, new Item(8447, 1)), + TALL_BOX_HEDGE1(13474, 8209, 80, 316, new int[] {BuildingUtils.WATERING_CAN}, new Item(8449, 1)), + TALL_BOX_HEDGE2(13476, 8209, 80, 316, new int[] {BuildingUtils.WATERING_CAN}, new Item(8449, 1)), + TALL_BOX_HEDGE3(13475, 8209, 80, 316, new int[] {BuildingUtils.WATERING_CAN}, new Item(8449, 1)), + BOUNDARY_STONES(13449, 8196, 55, 100, new Item(1761, 10)), + WOODEN_FENCE(13450, 8197, 59, 280, new Item(960, 10)), + STONE_WALL(13451, 8198, 63, 200, new Item(3420, 10)), + IRON_RAILINGS(13452, 8199, 67, 220, new Item(2351, 10), new Item(3420, 6)), + PICKET_FENCE(13453, 8200, 71, 640, new Item(8778, 10), new Item(2353, 2)), + GARDEN_FENCE(13454, 8201, 75, 940, new Item(8780, 10), new Item(2353, 2)), + MARBLE_WALL(13455, 8202, 79, 4000, new Item(8786, 10)), + + + /** + * Bedroom decorations. + */ + WOODEN_BED(13148, 8031, 20, 117, new Item(960, 3), new Item(8790, 2)), + OAK_BED(13149, 8032, 30, 210, new Item(8778, 3), new Item(8790, 2)), + LARGE_OAK_BED(13150, 8033, 34, 330, new Item(8778, 5), new Item(8790, 2)), + TEAK_BED(13151, 8034, 40, 300, new Item(8780, 3), new Item(8790, 2)), + LARGE_TEAK_BED(13152, 8035, 45, 480, new Item(8780, 5), new Item(8790, 2)), + FOUR_POSTER(13153, 8036, 53, 450, new Item(8782, 3), new Item(8790, 2)), + GILDED_FOUR_POSTER(13154, 8037, 60, 1330, new Item(8782, 5), new Item(8790, 2), new Item(8784, 2)), + OAK_CLOCK(13169, 8052, 25, 142, new Item(8778, 2), new Item(8792, 1)), + TEAK_CLOCK(13170, 8053, 55, 202, new Item(8780, 2), new Item(8792, 1)), + GILDED_CLOCK(13171, 8054, 85, 602, new Item(8782, 2), new Item(8792, 1), new Item(8784, 1)), + SHAVING_STAND(13162, 8045, 21, 30, new Item(960, 1), new Item(1775, 1)), + OAK_SHAVING_STAND(13163, 8046, 29, 61, new Item(8778, 1), new Item(1775, 1)), + OAK_DRESSER(13164, 8047, 37, 121, new Item(8778, 2), new Item(1775, 1)), + TEAK_DRESSER(13165, 8048, 46, 181, new Item(8780, 2), new Item(1775, 1)), + FANCY_TEAK_DRESSER(13166, 8049, 56, 182, new Item(8780, 2), new Item(1775, 2)), + MAHOGANY_DRESSER(13167, 8050, 64, 281, new Item(8782, 2), new Item(1775, 1)), + GILDED_DRESSER(13168, 8051, 74, 582, new Item(8782, 2), new Item(1775, 2), new Item(8784, 1)), + SHOE_BOX(13155, 8038, 20, 58, new Item(960, 2)), + OAK_DRAWERS(13156, 8039, 27, 120, new Item(8778, 2)), + OAK_WARDROBE(13157, 8040, 39, 180, new Item(8778, 3)), + TEAK_DRAWERS(13158, 8041, 51, 180, new Item(8780, 2)), + TEAK_WARDROBE(13159, 8042, 63, 270, new Item(8780, 3)), + MAHOGANY_WARDROBE(13160, 8043, 75, 420, new Item(8782, 2)), + GILDED_WARDROBE(13161, 8044, 87, 720, new Item(8782, 2), new Item(8784, 1)), + + + /** + * Quest hall decorations. + */ + ANTIDRAGON_SHIELD(13522, 8282, 47, 280, new Item(8780, 3), new Item(1540, 1)), + AMULET_OF_GLORY(13523, 8283, 47, 290, new Item(8780, 3), new Item(1704, 1)), + CAPE_OF_LEGENDS(13524, 8284, 47, 300, new Item(8780, 3), new Item(1052, 1)), + KING_ARTHUR(13510, 8285, 35, 211, new Item(8780, 3), new Item(7995, 1)), + ELENA(13511, 8286, 35, 211, new Item(8780, 3), new Item(7996, 1)), + GIANT_DWARF(13512, 8287, 35, 211, new Item(8780, 3), new Item(7997, 1)), + MISCELLANIANS(13513, 8288, 35, 311, new Item(8780, 3), new Item(7998, 1)), + LUMBRIDGE(13517, 8289, 44, 314, new Item(8780, 3), new Item(8002, 1)), + THE_DESERT(13514, 8290, 44, 314, new Item(8780, 3), new Item(7999, 1)), + MORYTANIA(13518, 8291, 44, 314, new Item(8780, 3), new Item(8003, 1)), + KARAMJA(13516, 8292, 65, 464, new Item(8782, 3), new Item(8001, 1)), + ISAFDAR(13515, 8293, 65, 464, new Item(8782, 3), new Item(8000, 1)), + SILVERLIGHT(13519, 8279, 42, 187, new Item(8780, 3), new Item(2402, 1)), + EXCALIBUR(13521, 8280, 42, 194, new Item(8780, 3), new Item(35, 1)), + DARKLIGHT(13520, 8281, 42, 202, new Item(8780, 3), new Item(6746, 1)), + SMALL_MAP(13525, 8294, 38, 211, new Item(8780, 3), new Item(8004, 1)), + MEDIUM_MAP(13526, 8295, 58, 451, new Item(8782, 3), new Item(8005, 1)), + LARGE_MAP(13527, 8296, 78, 591, new Item(8782, 4), new Item(8006, 1)), + + /** + * Menagerie Decorations + */ + //OBELISK + MINI_OBELISK(44837, 15236, 41, 676, new Item(8786, 1), new Item(12183, 1000), new Item(12158, 10), new Item(12159, 10), new Item(12160, 10), new Item(12163, 10)) + //PET_FEEDER + , + OAK_PET_FEEDER(44834, 15233, 37, 240, new Item(8778, 4)), + TEAK_PET_FEEDER(44835, 15234, 52, 380, new Item(8780, 4)), + MAHOGANY_PET_FEEDER(44836, 15235, 67, 880, new Item(8782, 4), new Item(8784, 1)) + //PET_HOUSE + , + OAK_PET_HOUSE(44828, 15227, 37, 240, new Item(8778, 4)), + TEAK_PET_HOUSE(44829, 15228, 52, 380, new Item(8780, 4)), + MAHOGANY_PET_HOUSE(44830, 15229, 67, 580, new Item(8782, 4)), + CONSECRATED_PET_HOUSE(44831, 15230, 92, 1580, new Item(8782, 4), new Item(8788, 1)), + DESECRATED_PET_HOUSE(44832, 15231, 92, 1580, new Item(8782, 4), new Item(8788, 1)), + NATURAL_PET_HOUSE(44833, 15232, 92, 1580, new Item(8782, 4), new Item(8788, 1)) + //HABITAT_SPACE + , + GARDEN_HABITAT(new int[]{ + 4497, + 4498, + 44500, + 44501, + 44502, + 44503, + 44504, + 44505, + 44506, + 44507, + 44508, + 44509, + 44510, + 44511, + 44512, + 44513, + 44514, + 44515, + 44516, + 44517, + 44518, + 44519, + 44520, + 44521, + 44522, + 44523, + 44524, + 44525, + 44526, + 44527, + 44528, + 44529, + 44530, + 44531, + 44532, + 44533, + 44534, + 44535, + 44536, + 44537, + 44538, + 44539, + 44540, + 44541, + 44542, + 44543, + 44544, + 44545, + 44546, + 44547, + 44548, + 44549, + 44550, + 44551, + 44552, + 44553, + 44554, + 44555, + 44556, + 44557, + 44558, + 44559, + 44560, + 44561, + 44562, + 44563 }, 15222, 37, 201, new Item(8431, 1), new Item(8433, 1), new Item(8435, 1)), + JUNGLE_HABITAT(new int[] + { + 44564, + 44565, + 44566, + 44567, + 44568, + 44569, + 44570, + 44571, + 44572, + 44573, + 44574, + 44575, + 44576, + 44577, + 44578, + 44579, + 44580, + 44581, + 44582, + 44583, + 44584, + 44585, + 44586, + 44587, + 44588, + 44589, + 44590, + 44591, + 44592, + 44593, + 44594, + 44595, + 44596, + 44597, + 44598, + 44599, + 44600, + 44601, + 44602, + 44603, + 44604, + 44605, + 44606, + 44607, + 44608, + 44609, + 44610, + 44611, + 44612, + 44613, + 44614, + 44615, + 44616, + 44617, + 44618, + 44619, + 44620, + 44621, + 44622, + 44623, + 44624, + 44625, + 44626, + 44627, + 44628, + 44629 }, 15223, 47, 278, new Item(8435, 3), new Item(8423, 1), new Item(1929, 5)), + DESERT_HABITAT(new int[] + { + 44630, + 44631, + 44632, + 44633, + 44634, + 44635, + 44636, + 44637, + 44638, + 44639, + 44640, + 44641, + 44642, + 44643, + 44644, + 44645, + 44646, + 44647, + 44648, + 44649, + 44650, + 44651, + 44652, + 44653, + 44654, + 44655, + 44656, + 44657, + 44658, + 44659, + 44660, + 44661, + 44662, + 44663, + 44664, + 44665, + 44666, + 44667, + 44668, + 44669, + 44670, + 44671, + 44672, + 44673, + 44674, + 44675, + 44676, + 44677, + 44678, + 44679, + 44680, + 44681, + 44682, + 44683, + 44684, + 44685, + 44686, + 44687, + 44688, + 44689, + 44690, + 44691, + 44692, + 44693, + 44694, + 44695 }, 15224, 57, 238, new Item(1783, 10), new Item(3420, 5), new Item(15237, 1)), + POLAR_HABITAT(new int[] + { + 44696, + 44697, + 44698, + 44699, + 44700, + 44701, + 44702, + 44703, + 44704, + 44705, + 44706, + 44707, + 44708, + 44709, + 44710, + 44711, + 44712, + 44713, + 44714, + 44715, + 44716, + 44717, + 44718, + 44719, + 44720, + 44721, + 44722, + 44723, + 44724, + 44725, + 44726, + 44727, + 44728, + 44729, + 44730, + 44731, + 44732, + 44733, + 44734, + 44735, + 44736, + 44737, + 44738, + 44739, + 44740, + 44741, + 44742, + 44743, + 44744, + 44745, + 44746, + 44747, + 44748, + 44749, + 44750, + 44751, + 44752, + 44753, + 44754, + 44755, + 44756, + 44757, + 44758, + 44759, + 44760, + 44761 }, 15225, 67, 373, new Item(556, 1000), new Item(555, 1000), new Item(15239, 1)), + VOLCANIC_HABITAT(new int[] + { + 44762, + 44763, + 44764, + 44765, + 44766, + 44767, + 44768, + 44769, + 44770, + 44771, + 44772, + 44773, + 44774, + 44775, + 44776, + 44777, + 44778, + 44779, + 44780, + 44781, + 44782, + 44783, + 44784, + 44785, + 44786, + 44787, + 44788, + 44789, + 44790, + 44791, + 44792, + 44793, + 44794, + 44795, + 44796, + 44797, + 44798, + 44799, + 44800, + 44801, + 44802, + 44803, + 44804, + 44805, + 44806, + 44807, + 44808, + 44809, + 44810, + 44811, + 44812, + 44813, + 44814, + 44815, + 44816, + 44817, + 44818, + 44819, + 44820, + 44821, + 44822, + 44823, + 44824, + 44825, + 44826, + 44827 }, 15226, 77, 77, new Item(554, 1000), new Item(557, 1000), new Item(8417, 1), new Item(13245, 5)), + + + /** + * Study decorations. + */ + GLOBE(13649, 8341, 41, 180, new Item(8778, 3)), + ORNAMENTAL_GLOBE(13650, 8342, 50, 270, new Item(8780, 3)), + LUNAR_GLOBE(13651, 8343, 59, 570, new Item(8780, 3), new Item(8784, 1)), + CELESTIAL_GLOBE(13652, 8344, 68, 570, new Item(8780, 3), new Item(8784, 1)), + ARMILLARY_SPHERE(13653, 8345, 77, 960, new Item(8782, 2), new Item(8784, 2), new Item(2353, 4)), + SMALL_ORREY(13654, 8346, 86, 1320, new Item(8782, 3), new Item(8784, 3)), + LARGE_ORREY(13655, 8347, 95, 1420, new Item(8782, 3), new Item(8784, 5)), + OAK_LECTERN(13642, 8334, 40, 60, new Item(8778, 1)), + EAGLE_LECTERN(13643, 8335, 47, 120, new Item(8778, 2)), + DEMON_LECTERN(13644, 8336, 47, 120, new Item(8778, 2)), + TEAK_EAGLE_LECTERN(13645, 8337, 57, 180, new Item(8780, 2)), + TEAK_DEMON_LECTERN(13646, 8338, 57, 180, new Item(8780, 2)), + MAHOGANY_EAGLE_LECTERN(13647, 8339, 67, 580, new Item(8782, 2), new Item(8784, 1)), + MAHOGANY_DEMON_LECTERN(13648, 8340, 67, 580, new Item(8782, 2), new Item(8784, 1)), + CRYSTAL_BALL(13659, 8351, 42, 280, new Item(8780, 3), new Item(567, 1)), + ELEMENTAL_SPHERE(13660, 8352, 54, 580, new Item(8780, 3), new Item(567, 1), new Item(8784, 1)), + CRYSTAL_OF_POWER(13661, 8353, 66, 890, new Item(8782, 2), new Item(567, 1), new Item(8784, 2)), + ALCHEMICAL_CHART(13662, 8354, 43, 30, new Item(8790, 2)), + ASTRONOMICAL_CHART(13663, 8355, 63, 45, new Item(8790, 3)), + INFERNAL_CHART(13664, 8356, 83, 60, new Item(8790, 4)), + TELESCOPE1(13656, 8348, 44, 121, new Item(8778, 2), new Item(1775, 1)), + TELESCOPE2(13657, 8349, 64, 181, new Item(8780, 2), new Item(1775, 1)), + TELESCOPE3(13658, 8350, 84, 580, new Item(8782, 2), new Item(1775, 1)), + + /** + * Costume room decorations. + */ + OAK_TREASURE_CHEST(18804, 9839, 48, 120, new Item(8778, 2)), + TEAK_TREASURE_CHEST(18806, 9840, 66, 180, new Item(8780, 2)), + MAHOGANY_TREASURE_CHEST(18808, 9841, 84, 280, new Item(8782, 2)), + OAK_ARMOUR_CASE(18778, 9826, 46, 180, new Item(8778, 3)), + TEAK_ARMOUR_CASE(18780, 9827, 64, 270, new Item(8780, 3)), + MGANY_ARMOUR_CASE(18782, 9828, 82, 420, new Item(8782, 3)), + OAK_MAGIC_WARDROBE(18784, 9829, 42, 240, new Item(8778, 4)), + C_OAK_MAGIC_WARDROBE(18786, 9830, 51, 360, new Item(8778, 6)), + TEAK_MAGIC_WARDROBE(18788, 9831, 60, 360, new Item(8780, 4)), + C_TEAK_MAGIC_WARDROBE(18790, 9832, 69, 540, new Item(8780, 6)), + MGANY_MAGIC_WARDROBE(18792, 9833, 78, 560, new Item(8782, 4)), + GILDED_MAGIC_WARDROBE(18794, 9834, 87, 860, new Item(8782, 4), new Item(8784, 1)), + MARBLE_MAGIC_WARDROBE(18796, 9835, 96, 500, new Item(8786, 1)), + OAK_CAPE_RACK(18766, 9817, 54, 240, new Item(8778, 4)), + TEAK_CAPE_RACK(18767, 9818, 63, 360, new Item(8780, 4)), + MGANY_CAPE_RACK(18768, 9819, 72, 560, new Item(8782, 4)), + GILDED_CAPE_RACK(18769, 9820, 81, 860, new Item(8782, 4), new Item(8784, 1)), + MARBLE_CAPE_RACK(18770, 9821, 90, 500, new Item(8786, 1)), + MAGIC_CAPE_RACK(18771, 9822, 99, 1000, new Item(8788, 1)), + OAK_TOY_BOX(18798, 9836, 50, 120, new Item(8778, 2)), + TEAK_TOY_BOX(18800, 9837, 68, 180, new Item(8780, 2)), + MAHOGANY_TOY_BOX(18802, 9838, 86, 280, new Item(8782, 2)), + OAK_COSTUME_BOX(18772, 9823, 44, 120, new Item(8778, 2)), + TEAK_COSTUME_BOX(18774, 9824, 62, 180, new Item(8780, 2)), + MAHOGANY_COSTUME_BOX(18776, 9825, 80, 280, new Item(8782, 2)), + + /** + * Chapel decorations. + */ + OAK_ALTAR(13179, 8062, 45, 240, new Item(8778, 4)), + TEAK_ALTAR(13182, 8063, 50, 360, new Item(8780, 4)), + CLOTH_ALTAR(13185, 8064, 56, 390, new Item(8780, 4), new Item(8790, 2)), + MAHOGANY_ALTAR(13188, 8065, 60, 590, new Item(8782, 4), new Item(8790, 2)), + LIMESTONE_ALTAR(13191, 8066, 64, 910, new Item(8782, 6), new Item(8790, 2), new Item(3420, 2)), + MARBLE_ALTAR(13194, 8067, 70, 1030, new Item(8786, 2), new Item(8790, 2)), + GILDED_ALTAR(13197, 8068, 75, 2230, new Item(8786, 2), new Item(8790, 2), new Item(8784, 4)), + SMALL_STATUE(13271, 8082, 49, 40, new Item(3420, 2)), + MEDIUM_STATUE(13272, 8083, 69, 500, new Item(8786, 1)), + LARGE_STATUE(13282, 8084, 89, 1500, new Item(8786, 3)), + WINDCHIMES(13214, 8079, 49, 323, new Item(8778, 4), new Item(2353, 4)), + BELLS(13215, 8080, 58, 480, new Item(8780, 4), new Item(2353, 6)), + ORGAN(13216, 8081, 69, 680, new Item(8782, 4), new Item(2353, 6)), + SARADOMIN_SYMBOL(13172, 8055, 48, 120, new Item(8778, 2)), + ZAMORAK_SYMBOL(13173, 8056, 48, 120, new Item(8778, 2)), + GUTHIX_SYMBOL(13174, 8057, 48, 120, new Item(8778, 2)), + SARADOMIN_ICON(13175, 8058, 59, 960, new Item(8780, 4), new Item(8784, 2)), + ZAMORAK_ICON(13176, 8059, 59, 960, new Item(8780, 4), new Item(8784, 2)), + GUTHIX_ICON(13177, 8060, 59, 960, new Item(8780, 4), new Item(8784, 2)), + ICON_OF_BOB(13178, 8061, 71, 1160, new Item(8782, 4), new Item(8784, 2)), + STEEL_TORCHES(13202, 8070, 45, 80, new Item(2353, 2)), + WOODEN_TORCHES(13200, 8069, 49, 58, new Item(960, 2)), + STEEL_CANDLESTICKS(13204, 8071, 53, 124, new Item(2353, 6), new Item(36, 6)), + GOLD_CANDLESTICKS(13206, 8072, 57, 46, new Item(2357, 6), new Item(36, 6)), + INCENSE_BURNERS(13208, 8073, 61, 280, new Item(8778, 4), new Item(2353, 2)), + MAHOGANY_BURNERS(13210, 8074, 65, 600, new Item(8782, 4), new Item(2353, 2)), + MARBLE_BURNERS(13212, 8075, 69, 1600, new Item(8786, 2), new Item(2353, 2)), + SHUTTERED_WINDOW(new int[] { 13253, 13226, 13235, 13244, 13217, 13262 }, 8076, 49, 228, new Item(960, 8)), + DECORATIVE_WINDOW(new int[] { 13254, 13227, 13236, 13245, 13218, 13263 }, 8077, 69, 200, new Item(1775, 8)), + STAINED_GLASS(new int[] { 13255, 13228, 13237, 13246, 13219, 13264 }, 8078, 89, 400, new Item(1775, 16)), + + /** + * Throne room + */ + OAK_THRONE(13665, 8357, 60, 800, new Item(8778, 5), new Item(8786, 1)), + TEAK_THRONE(13666, 8358, 67, 1450, new Item(8780, 5), new Item(8786, 2)), + MAHOGANY_THRONE(13667, 8359, 74, 2200, new Item(8782, 5), new Item(8786, 3)), + GILDED_THRONE(13668, 8360, 81, 1700, new Item(8782, 5), new Item(8786, 2), new Item(8784, 3)), + SKELETON_THRONE(13669, 8361, 88, 7003, new Item(8788, 5), new Item(8786, 4), new Item(526, 5), new Item(964, 2)), + CRYSTAL_THRONE(13670, 8362, 95, 15000, new Item(8788, 15)), + DEMONIC_THRONE(13671, 8363, 99, 25000, new Item(8788, 25)), + OAK_LEVER(13672, 8364, 68, 300, new Item(8778, 5)), + TEAK_LEVER(13673, 8365, 78, 450, new Item(8780, 5)), + MAHOGANY_LEVER(13674, 8366, 88, 700, new Item(8782, 5)), + FLOOR_DECORATION(new int[] { 13689, 13686, 13687, 13688, 13684, 13685 }, 8370, 61, 700, new Item(8782, 5)), + STEEL_CAGE(new int[] { 13689, 13686, 13687, 13688, 13684, 13685 }, 8371, 68, 1100, new Item(8782, 5), new Item(2353, 20)), + FLOOR_TRAP(new int[] { 13689, 13686, 13687, 13688, 13684, 13685 }, 8372, 74, 770, new Item(8782, 5), new Item(8792, 10)), + MAGIC_CIRCLE(new int[] { 13689, 13686, 13687, 13688, 13684, 13685 }, 8373, 82, 2700, new Item(8782, 5), new Item(8788, 2)), + MAGIC_CAGE(new int[] { 13689, 13686, 13687, 13688, 13684, 13685 }, 8374, 89, 4700, new Item(8782, 5), new Item(8788, 4)), + OAK_TRAPDOOR(13675, 8367, 68, 300, new Item(8778, 5)), + TEAK_TRAPDOOR(13676, 8368, 78, 450, new Item(8780, 5)), + MAHOGANY_TRAPDOOR(13677, 8369, 88, 700, new Item(8782, 5)), + CARVED_TEAK_BENCH(13694, 8112, 44, 360, new Item(8780, 4)), + MAHOGANY_BENCH(13695, 8113, 52, 560, new Item(8782, 4)), + GILDED_BENCH(13696, 8114, 61, 1760, new Item(8782, 4), new Item(8784, 4)), + OAK_DECO(13798, 8102, 16, 120.0, new Item(8778, 2)), + TEAK_DECO(13814, 8103, 36, 180.0, new Item(8780, 2)), + GILDED_DECO(13782, 8104, 56, 1020.0, new Item(8782, 3), new Item(8784, 2)), + ROUND_SHIELD(13734, 8105, 66, 120, new Item(8778, 2)), + SQUARE_SHIELD(13766, 8106, 76, 360, new Item(8780, 4)), + KITE_SHIELD(13750, 8107, 86, 420, new Item(8782, 3)), + + /** + * Oubliette + */ + SPIKES_MID(13334, 8302, 65, 623, new Item(2353, 20), new Item(995, 50000)), + SPIKES_SIDE(13335, 8302, 65, 623, new Item(2353, 20), new Item(995, 50000)), + SPIKES_CORNER(13336, 8302, 65, 623, new Item(2353, 20), new Item(995, 50000)), + SPIKES_FL(13338, 8302, 65, 623, new Item(2353, 20), new Item(995, 50000)), + TENTACLE_MID(13331, 8303, 71, 326, new Item(1929, 20), new Item(995, 100000)), + TENTACLE_SIDE(13332, 8303, 71, 326, new Item(1929, 20), new Item(995, 100000)), + TENTACLE_CORNER(13333, 8303, 71, 326, new Item(1929, 20), new Item(995, 100000)), + TENTACLE_FL(13338, 8303, 71, 326, new Item(1929, 20), new Item(995, 100000)), + FP_FLOOR_MID(13371, 8304, 77, 357, new Item(590, 20), new Item(995, 125000)), + FP_FLOOR_SIDE(13371, 8304, 77, 357, new Item(590, 20), new Item(995, 125000)), + FP_FLOOR_CORNER(13371, 8304, 77, 357, new Item(590, 20), new Item(995, 125000)), + FLAME_PIT(13337, 8304, 77, 357, new Item(590, 20), new Item(995, 125000)), + ROCNAR_FLOOR_MID(13371, 8305, 83, 387, new Item(995, 150000)), + ROCNAR_FLOOR_SIDE(13371, 8305, 83, 387, new Item(995, 150000)), + ROCNAR_FLOOR_CORNER(13371, 8305, 83, 387, new Item(995, 150000)), + ROCNAR(13373, 8305, 83, 387, new Item(995, 150000)), + ROCNAR_FL(13338, 8305, 83, 387, new Item(995, 150000)), + OAK_CAGE(13313, 8297, 65, 640, new Item(8778, 10), new Item(2353, 2)), + OAK_CAGE_DOOR(13314, 8297, 65, 640, new Item(8778, 10), new Item(2353, 2)), + OAK_STEEL_CAGE(13316, 8298, 70, 800, new Item(8778, 10), new Item(2353, 10)), + OAK_STEEL_CAGE_DOOR(13317, 8298, 70, 800, new Item(8778, 10), new Item(2353, 10)), + STEEL_CAGE_OU(13319, 8299, 75, 400, new Item(2353, 20)), + STEEL_CAGE_DOOR(13320, 8299, 75, 400, new Item(2353, 20)), + SPIKED_CAGE(13322, 8300, 80, 500, new Item(2353, 25)), + SPIKED_CAGE_DOOR(13323, 8300, 80, 500, new Item(2353, 25)), + BONE_CAGE(13325, 8301, 85, 603, new Item(8778, 10), new Item(526, 10)), + BONE_CAGE_DOOR(13326, 8301, 85, 603, new Item(8778, 10), new Item(526, 10)), + SKELETON_GUARD(13366, 8131, 70, 223, new Item(995, 50000)), + GUARD_DOG(13367, 8132, 74, 273, new Item(995, 75000)), + HOBGOBLIN(13368, 8133, 78, 316, new Item(995, 100000)), + BABY_RED_DRAGON(13372, 8134, 82, 387, new Item(995, 150000)), + HUGE_SPIDER(13370, 8135, 86, 447, new Item(995, 200000)), + TROLL(13369, 8136, 90, 1000, new Item(995, 1000000)), + HELLHOUND(2715, 8137, 94, 2236, new Item(995, 5000000)), + OAK_LADDER(13328, 8306, 68, 300, new Item(8778, 5)), + TEAK_LADDER(13329, 8307, 78, 450, new Item(8780, 5)), + MAHOGANY_LADDER(13330, 8308, 88, 700, new Item(8782, 5)), + DECORATIVE_BLOOD(13312, 8125, 72, 4, new Item(1763, 4)), + DECORATIVE_PIPE(13311, 8126, 83, 120, new Item(2353, 6)), + HANGING_SKELETON(13310, 8127, 94, 3, new Item(964, 2), new Item(526, 6)), + CANDLE(13342, 8128, 72, 243, new Item(8778, 4), new Item(33, 4)), + TORCH(13341, 8129, 84, 244, new Item(8778, 4), new Item(594, 4)), + SKULL_TORCH(13343, 8130, 94, 246, new Item(8778, 4), new Item(594, 4), new Item(964, 4)), + + /** + * Dungeon corridor, junction, stairs & pit + */ + OAK_DOOR_LEFT(13344, 8122, 74, 600, new Item(8778, 10)), + OAK_DOOR_RIGHT(13345, 8122, 74, 600, new Item(8778, 10)), + STEEL_DOOR_LEFT(13346, 8123, 84, 800, new Item(8778, 10), new Item(2353, 10)), + STEEL_DOOR_RIGHT(13347, 8123, 84, 800, new Item(8778, 10), new Item(2353, 10)), + MARBLE_DOOR_LEFT(13348, 8124, 94, 2000, new Item(8786, 4)), + MARBLE_DOOR_RIGHT(13349, 8124, 94, 2000, new Item(8786, 4)), + SPIKE_TRAP(13356, 8143, 72, 223, new Item(995, 50000)), + MAN_TRAP(13357, 8144, 76, 273, new Item(995, 75000)), + TANGLE_TRAP(13358, 8145, 80, 316, new Item(995, 100000)), + MARBLE_TRAP(13359, 8146, 84, 387, new Item(995, 150000)), + TELEPORT_TRAP(13360, 8147, 88, 447, new Item(995, 200000)), + + /* objID, int, lvl, exp, materials */ + PIT_DOG(39260, 18791, 70, 200, new Item(995, 40000)), + PIT_OGRE(39261, 18792, 73, 234, new Item(995, 55000)), + PIT_ROCK_PROTECTOR(39262, 18793, 79, 300, new Item(995, 90000)), + PIT_SCABARITE(39263, 18794, 84, 387, new Item(995, 150000)), + PIT_BLACK_DEMON(39264, 18795, 89, 547, new Item(995, 300000)), + PIT_IRON_DRAGON(39265, 18796, 97, 2738, new Item(995, 7500000)), + + /** + * Treasure room + */ + DEMON(13378, 8138, 75, 707, new Item(995, 500000)), + KALPHITE_SOLDIER(13374, 8139, 80, 866, new Item(995, 750000)), + TOK_XIL(13377, 8140, 85, 2236, new Item(995, 5000000)), + DAGANNOTH(13376, 8141, 90, 2738, new Item(995, 7500000)), + STEEL_DRAGON(13375, 8142, 95, 3162, new Item(995, 1000000)), + WOODEN_CRATE(13283, 8148, 75, 143, new Item(960, 5)), + OAK_T_CHEST(13285, 8149, 79, 340, new Item(8778, 5), new Item(2353, 2)), + TEAK_T_CHEST(13287, 8150, 83, 530, new Item(8780, 5), new Item(2353, 4)), + MGANY_T_CHEST(13289, 8151, 87, 1000, new Item(8782, 5), new Item(8784, 1)), + MAGIC_CHEST(13291, 8152, 91, 1000, new Item(8788, 1)), + + /** + * Style related decoration. + */ + BASIC_WOOD_WINDOW(13099, -1, 1, 0.0), + BASIC_STONE_WINDOW(13091, -1, 1, 0.0), + WHITEWASHED_STONE_WINDOW(13005, -1, 1, 0.0), + FREMENNIK_WINDOW(13112, -1, 1, 0.0), + TROPICAL_WOOD_WINDOW(10816, -1, 1, 0.0), + FANCY_STONE_WINDOW(13117, -1, 1, 0.0), + + ; + /** + * The object id. + */ + private final int objectId; + + /** + * The item id for the interface. + */ + private final int interfaceItem; + + /** + * The level requirement. + */ + private final int level; + + /** + * The experience gained for building this decoration. + */ + private final double experience; + + /** + * The item required. + */ + private final Item[] items; + + /** + * The tools required. + */ + private final int[] tools; + + /** + * The object ids depending on styling. + */ + private final int[] objectIds; + + /** + * If this node should be invisible to user build options + */ + private boolean invisibleNode; + + /** + * Constructs a new {@code Portal} {@code Object}. + * @param objectId The object id. + * @param interfaceItem The item id for the building interface. + * @param level The level required. + * @param experience The experience gained. + * @param items The items required. + */ + private Decoration(int objectId, int interfaceItem, int level, double experience, Item... items) { + this(objectId, interfaceItem, level, experience, new int[] { 2347, 8794 }, items); + } + + /** + * Constructs a new {@code Portal} {@code Object}. + * @param objectId The object id. + * @param interfaceItem The item id for the building interface. + * @param level The level required. + * @param experience The experience gained. + * @param items The items required. + */ + private Decoration(int objectId, int interfaceItem, int level, double experience, int[] tools, Item... items) { + this.objectId = objectId; + this.objectIds = null; + this.interfaceItem = interfaceItem; + this.level = level; + this.experience = experience; + this.tools = tools; + this.items = items; + } + + /** + * Decoration + * @param objectId + * @param invisibleNode + */ + private Decoration(int objectId, boolean invisibleNode) { + this(objectId, -1, -1, -1); + this.invisibleNode = true; + } + + /** + * Constructs a new {@code Portal} {@code Object}. + * @param objectIds The object id. + * @param interfaceItem The item id for the building interface. + * @param level The level required. + * @param experience The experience gained. + * @param items The items required. + */ + private Decoration(int[] objectIds, int interfaceItem, int level, double experience, Item... items) { + this(objectIds, interfaceItem, level, experience, new int[] { 2347, 8794 }, items); + } + + /** + * Constructs a new {@code Portal} {@code Object}. + * @param objectIds The object id. + * @param interfaceItem The item id for the building interface. + * @param level The level required. + * @param experience The experience gained. + * @param items The items required. + */ + private Decoration(int[] objectIds, int interfaceItem, int level, double experience, int[] tools, Item... items) { + this.objectId = objectIds[0]; + this.objectIds = objectIds; + this.interfaceItem = interfaceItem; + this.level = level; + this.experience = experience; + this.tools = tools; + this.items = items; + } + + /** + * Gets the decoration on the given location. + * @param player The player. + * @return The decoration. + */ + public static Decoration getDecoration(Player player, GameObject object) { + Location l = object.getLocation(); + int z = l.getZ(); + if (HouseManager.isInDungeon(player)) { + z = 3; + } + Room room = player.getHouseManager().getRooms()[z][l.getChunkX()][l.getChunkY()]; + for (Hotspot h : room.getHotspots()) { + if (h.getCurrentX() == l.getChunkOffsetX() && h.getCurrentY() == l.getChunkOffsetY()) { + if (h.getDecorationIndex() != -1) { + Decoration deco = h.getHotspot().getDecorations()[h.getDecorationIndex()]; + if (deco.getObjectId(player.getHouseManager().getStyle()) == object.getId()) { + return deco; + } + } + } + } + return null; + } + + /** + * Gets a decoration for the given object id + * @param objectId - the object id of the built object + * @return the decoration or null + */ + public static Decoration forObjectId(int objectId) { + for (Decoration d : Decoration.values()) { + if (d.getObjectId() == objectId) { + return d; + } + } + return null; + } + + public static Decoration forName(String name) { + for (Decoration d : Decoration.values()) { + if (d.name().equals(name)) { + return d; + } + } + return null; + } + + /** + * Gets the amount of nails required for this hotspot. + * @return The amount of nails. + */ + public int getNailAmount() { + for (Item item : items) { + if (item.getId() == 960) { //1 nail per normal plank required. + return item.getAmount(); + } + } + return 0; + } + + /** + * Gets the objectId. + * @param style The current housing style. + * @return The objectId. + */ + public int getObjectId(HousingStyle style) { + if (objectIds != null) { + return objectIds[style.ordinal()]; + } + return objectId; + } + + /** + * Gets the objectId. + * @return The objectId. + */ + public int getObjectId() { + return objectId; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the items. + * @return The items. + */ + public Item[] getItems() { + return items; + } + + /** + * Gets the tools. + * @return The tools. + */ + public int[] getTools() { + return tools; + } + + /** + * Gets the interfaceItem. + * @return the interfaceItem + */ + public int getInterfaceItem() { + return interfaceItem; + } + + /** + * Gets the objectIds value. + * @return The objectIds. + */ + public int[] getObjectIds() { + return objectIds; + } + + public boolean isInvisibleNode() { + return invisibleNode; + } + + + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/EstateAgentDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/EstateAgentDialogue.java new file mode 100644 index 000000000..c322aa6d5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/EstateAgentDialogue.java @@ -0,0 +1,442 @@ +package core.game.node.entity.skill.construction; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.Skillcape; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Represents the estate agent dialogue. + * + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EstateAgentDialogue extends DialoguePlugin { + + /** + * Represents the book item. + */ + private static final Item BOOK = new Item(8463, 1); + private static HouseLocation moveLoc; + + /** + * Constructs a new {@code EstateAgentDialogue} {@code Object}. + */ + public EstateAgentDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EstateAgentDialogue} {@code Object}. + * + * @param player the player. + */ + public EstateAgentDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EstateAgentDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + npc("Hello. Welcome to the " + GameWorld.getSettings().getName() + " Housing Agency! What", "can I do for you?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + if (player.getHouseManager().hasHouse()) { + options("Can you move my house please?", "Can you redecorate my house please?", "Could I have a Construction guidebook?", "Tell me about houses.", "Tell me about that skillcape you're wearing."); + stage = 1; + } else { + options("How can I get a house?", "Tell me about houses."); + stage = 2; + } + break; + + //Options for when a player has a house + case 1: + switch (buttonId) { + case 1: + player("Can you move my house please?"); + stage = 10; + break; + case 2: + player("Can you redecorate my house please?"); + stage = 30; + break; + case 3: + player("Could I have a Construction guidebook?"); + stage = 50; + break; + case 4: + player("Tell me about houses!"); + stage = 90; + break; + case 5: + player("Tell me about that skillcape you're wearing!"); + stage = Skillcape.isMaster(player, Skills.CONSTRUCTION) ? 102 : 100; + break; + } + break; + + //Option for when a player does not have a house + case 2: + switch (buttonId) { + case 1: + player("How can I get a house?"); + stage = 3; + break; + case 2: + player("Tell me about houses."); + stage = 90; + break; + } + break; + + //Real Estate Agent offering a house + case 3: + npc("I can sell you a starting house in Rimmington for", "1000 coins. As you increase your construction skill you", "will be able to have your house moved to other areas", "and redecorated in other styles."); + stage++; + break; + case 4: + npc("Do you want to buy a starter house?"); + stage++; + break; + case 5: + options("Yes please!", "No thanks."); + stage++; + break; + case 6: + switch (buttonId) { + case 1: + player("Yes please!"); + stage = 7; + break; + case 2: + player("No thanks."); + stage = 150; + break; + } + break; + + //Estate Agent Dialogue after house purchase + case 7: + if (player.getInventory().contains(995, 1000)) { + player.getInventory().remove(new Item(995, 1000)); + player.getHouseManager().create(HouseLocation.RIMMINGTON); + npc("Thank you. Go through the Rimmington house portal", "and you will find your house ready for you to start", "building in it."); + stage = 150; + } else { + npc("You don't have enough money to buy a house,", "come back when you can afford one."); + stage = 150; + } + break; + + //Move House Dialogue + case 10: + npc("Certainly. Where would you like it moved to?"); + stage++; + break; + case 11: + options("Rimmington (5,000)", "Taverley (5,000)", "Pollnivneach (7,500)", "Rellekka (10,000)", "More..."); + stage++; + break; + case 12: + switch (buttonId) { + case 1: + player("To Rimmington please!"); + stage = 15; + break; + case 2: + player("To Taverly please!"); + stage = 16; + break; + case 3: + player("To Pollnivneach please!"); + stage = 17; + break; + case 4: + player("To Rellekka please!"); + stage = 18; + break; + case 5: + options("Brimhaven (15,000)", "Yanille (25,000)", "...Previous"); + stage = 13; + break; + } + break; + case 13: + switch (buttonId) { + case 1: + player("To Brimhaven please!"); + stage = 19; + break; + case 2: + player("To Yanille please!"); + stage = 20; + break; + case 3: + options("Rimmington (5,000)", "Taverley (5,000)", "Pollnivneach (7,500)", "Rellekka (10,000)", "More..."); + stage = 12; + break; + } + break; + case 15: + configureMove(HouseLocation.RIMMINGTON); + break; + case 16: + configureMove(HouseLocation.TAVERLY); + break; + case 17: + configureMove(HouseLocation.POLLNIVNEACH); + break; + case 18: + configureMove(HouseLocation.RELLEKKA); + break; + case 19: + configureMove(HouseLocation.BRIMHAVEN); + break; + case 20: + configureMove(HouseLocation.YANILLE); + break; + + + //Redecorate House + case 30: + npc("Certainly. My magic can rebuild the house in a", "completely new style! What style would you like?"); + stage++; + break; + case 31: + options("Basic wood (5,000)", "Basic stone (5,000)", "Whitewashed stone (7,500)", "Fremennik-style wood (10,000)", "More..."); + stage++; + break; + case 32: + switch (buttonId) { + case 1: + player("Basic wood please!"); + stage = 35; + break; + case 2: + player("Basic stone please!"); + stage = 36; + break; + case 3: + player("Whitewashed stone please!"); + stage = 37; + break; + case 4: + player("Fremennik-style wood please!"); + stage = 38; + break; + case 5: + options("Tropical wood (15,000)", "Fancy stone (25,000)", "Previous..."); + stage = 33; + break; + } + break; + case 33: + switch (buttonId) { + case 1: + player("Tropical wood please!"); + stage = 39; + break; + case 2: + player("Fancy stone please!"); + stage = 40; + break; + case 3: + options("Basic wood (5,000)", "Basic stone (5,000)", "Whitewashed stone (7,500)", "Fremennik-style wood (10,000)", "More..."); + stage = 32; + break; + } + break; + case 35: + redecorate(HousingStyle.BASIC_WOOD); + break; + case 36: + redecorate(HousingStyle.BASIC_STONE); + break; + case 37: + redecorate(HousingStyle.WHITEWASHED_STONE); + break; + case 38: + redecorate(HousingStyle.FREMENNIK_STYLE_WOOD); + break; + case 39: + redecorate(HousingStyle.TROPICAL_WOOD); + // Give your player-owned house a fancy stone or tropical wood

finish at the Varrock estate agent's + if (player.getLocation().withinDistance(Location.create(3239, 3474, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 2, 7); + } + break; + case 40: + redecorate(HousingStyle.FANCY_STONE); + // Give your player-owned house a fancy stone or tropical wood

finish at the Varrock estate agent's + if (player.getLocation().withinDistance(Location.create(3239, 3474, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 2, 7); + } + break; + + //Asking for a Construction Book + case 50: + if (!player.hasItem(BOOK)) { + npc("Certainly."); + player.getInventory().add(BOOK); + stage = 150; + break; + } else { + npc("You've already got one!"); + stage = 150; + break; + } + + //More Information on houses + case 60: + npc("It all came out of the wizards' experiments. They found", "a way to fold space, so that they could pack many", "acres of land into an area only a foot across."); + stage++; + break; + case 61: + npc("They created several folded-space regions across", "" + GameWorld.getSettings().getName() + ". Each one contains hundreds of small plots", "where people can build houses."); + stage++; + break; + case 62: + player("Ah, so that's how everyone can have a house without", "them cluttering up the world!"); + stage++; + break; + case 63: + npc("Quite. The wizards didn't want to get bogged down", "in the business side of things so they ", "hired me to sell the houses."); + stage++; + break; + case 64: + npc("There are various other people across " + GameWorld.getSettings().getName() + " who can", "help you furnish your house. You should start buying", "planks from the sawmill operator in Varrock."); + stage = 150; + break; + + //Skillcape Dialogue for players without Level 99 Construction + case 100: + npc("As you may know, skillcapes are only available to masters", "in a skill. I have spent my entire life building houses and", "now I spend my time selling them! As a sign of my abilites", "I wear this Skillcape of Construction. If you ever have"); + stage = 101; + break; + case 101: + npc("enough skill to build a demonic throne, come and talk to", "me and I'll sell you a skillcape like mine."); + stage = 150; + break; + + //Skillcape Dialogue for players with Level 99 Construction + case 102: + interpreter.sendDialogues(npc, FacialExpression.JOLLY, "I see you have recently achieved 99 construction.", "Would you like to buy a cape for 99,0000 gp?"); + stage++; + break; + case 103: + options("Yes, I'll pay the 99k", "No thanks, maybe later."); + stage++; + break; + case 104: + switch (buttonId) { + case 1: + if (Skillcape.purchase(player, Skills.CONSTRUCTION)) { + npc("Here you go lad, enjoy!"); + } + stage = 150; + break; + case 2: + player("No thanks, maybe later."); + stage = 150; + break; + } + break; + + //End + case 150: + end(); + break; + } + return true; + } + + /** + * Configures the move. + * + * @param location The house location. + */ + private void configureMove(HouseLocation location) { + if (location == player.getHouseManager().getLocation()) { + npc("Your house is already there!"); + stage = 11; + return; + } + if (location.getLevelRequirement() > player.getSkills().getStaticLevel(Skills.CONSTRUCTION)) { + npc("I'm afraid you don't have a high enough construction", "level to move there. You need to have level " + location.getLevelRequirement() + "."); + stage = 11; + return; + } + if (!player.getInventory().contains(995, location.getCost())) { + npc("Hmph. Come back when you have " + location.getCost() + " coins."); + stage = 150; + return; + } + player.getInventory().remove(new Item(995, location.getCost())); + player.getHouseManager().setLocation(location); + npc("Your house has been moved to " + location.getName() + "."); + stage = 150; + if (player.getLocation().withinDistance(Location.create(3239, 3474, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 11); + } + } + + /** + * Redecorates the player's house. + * + * @param style The house style. + */ + private void redecorate(HousingStyle style) { + boolean diary = false;//player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(0); + if (style == player.getHouseManager().getStyle()) { + npc("Your house is already in that style!"); + stage = 31; + return; + } + if (style.getLevel() > player.getSkills().getStaticLevel(Skills.CONSTRUCTION)) { + npc("You need a Construction level of " + style.getLevel() + " to buy this style."); + stage = 31; + return; + } + if (!player.getInventory().contains(995, style.getCost()) && !diary) { + npc("Hmph. Come back when you have " + style.getCost() + " coins."); + stage = 150; + return; + } + if (!diary) { + player.getInventory().remove(new Item(995, style.getCost())); + } + player.getHouseManager().redecorate(style); + npc("Your house has been redecorated."); + if (player.getLocation().withinDistance(new Location(2982, 3370))) { + //player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player, 1, 5, true); + } + stage = 150; + } + + @Override + public int[] getIds() { + return new int[]{4247}; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/Hotspot.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/Hotspot.kt new file mode 100644 index 000000000..67c338549 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/Hotspot.kt @@ -0,0 +1,58 @@ +package core.game.node.entity.skill.construction + +/** + * Represents a hotspot. + * @author Emperor + */ +class Hotspot (val hotspot: BuildHotspot,val chunkX: Int,val chunkY: Int,var chunkX2: Int,var chunkY2: Int) { + + constructor(hotspot: BuildHotspot, chunkX: Int, chunkY: Int) : this(hotspot,chunkX,chunkY,-1,-1) + + /** + * The current chunk x coordinate. + */ + var currentX: Int + /** + * Gets the currentY value. + * @return The currentY. + */ + /** + * Sets the currentY value. + * @param currentY The currentY to set. + */ + /** + * The chunk y coordinate. + */ + var currentY: Int + /** + * Gets the decorationIndex. + * @return The decorationIndex. + */ + /** + * Sets the decorationIndex. + * @param decorationIndex The decorationIndex to set. + */ + /** + * The current decoration index. + */ + var decorationIndex = -1 + + /** + * Copies the hotspot. + * @return The hotspot. + */ + fun copy(): Hotspot { + return Hotspot(hotspot, chunkX, chunkY, chunkX2, chunkY2) + } + + /** + * Constructs a new `Hotspot` `Object`. + * @param hotspot The hotspot. + * @param chunkX The chunk x-coordinate. + * @param chunkY The chunk y-coordinate. + */ + init { + currentX = chunkX + currentY = chunkY + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseLocation.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseLocation.java new file mode 100644 index 000000000..4f1302015 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseLocation.java @@ -0,0 +1,164 @@ +package core.game.node.entity.skill.construction; + + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.tools.StringUtils; + +/** + * The house locations. + * @author Emperor + */ +@SuppressWarnings("all") +public enum HouseLocation { + + //Nowhere is used for players who do not have a house + NOWHERE(-1, null, 0, 0), + + RIMMINGTON(15478, Location.create(2953, 3224, 0), 5000, 1), + + TAVERLY(15477, Location.create(2893, 3465, 0), 5000, 10), + + POLLNIVNEACH(15479, Location.create(3340, 3003, 0), 7500, 20), + + RELLEKKA(15480, Location.create(2670, 3631, 0), 10000, 30), + + BRIMHAVEN(15481, Location.create(2757, 3178, 0), 15000, 40), + + YANILLE(15482, Location.create(2544, 3096, 0), 25000, 50); + + //custom island thing that previous source users had. + //WHITERIDGE(43832, Location.create(3965, 3546, 0), 100_000, 60); + + /** + * The portal object id for this location. + */ + private final int portalId; + + /** + * The exit location. + */ + private final Location exitLocation; + + /** + * The cost to move + */ + private final int cost; + + /** + * Level requirement + */ + private final int levelRequirement; + + /** + * The house options + */ + //public static TabbedOption HOUSE_OPTIONS = new TabbedOption("House Locations", "Select an Option"); + + /** + * Sets up a page action tabbed option + */ + static { + /*int index = 0; + PageAction[] pageActions = new PageAction[5]; + for (HouseLocation hl : values()) { + if (hl == HouseLocation.NOWHERE || (hl == HouseLocation.WHITERIDGE && GameWorld.getSettings().isDeadmanMode())) + continue; + if (index > 4) { + index = 0; + HOUSE_OPTIONS.addPage(new Page(pageActions)); + pageActions = new PageAction[5]; + } + pageActions[index++] = new PageAction(hl.name() + " - " + hl.cost + "gp") { + @Override + public boolean run(Player player) { + if (player.getHouseManager().getLocation() == hl) { + player.sendMessage("Your house already resides in " + hl.name() + "!"); + return true; + } + if (player.getSkills().hasLevel(Skills.CONSTRUCTION, hl.levelRequirement)) { + if (player.getInventory().contains(995, hl.cost)) { + player.getInventory().remove(new Item(995, hl.cost)); + player.getHouseManager().setLocation(hl); + player.sendMessage("You have changed your house location to " + hl.name() + "!"); + } else { + player.sendMessage("You need " + hl.cost + "gp in order to move there!"); + } + } else { + player.sendMessage("You need a construction level of " + hl.levelRequirement + " to move there!"); + } + return true; + } + }; + } + if (pageActions[0] != null) { + HOUSE_OPTIONS.addPage(new Page(pageActions)); + }*/ + } + + /** + * Checks if the player has the level. + * + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasLevel(Player player) { + return player.getSkills().getStaticLevel(Skills.CONSTRUCTION) >= levelRequirement; + } + + /** + * Constructs a new {@code HouseLocation} {@code Object} + * @param portalId The portal id. + * @param exitLocation The exit location. + */ + private HouseLocation(int portalId, Location exitLocation, int cost, int levelRequirement) { + this.portalId = portalId; + this.exitLocation = exitLocation; + this.cost = cost; + this.levelRequirement = levelRequirement; + } + /** + * Gets the name formatted. + * + * @return the formatted name. + */ + public String getName() { + return StringUtils.formatDisplayName(name().toLowerCase()); + } + + + /** + * Gets the portalId. + * @return the portalId + */ + public int getPortalId() { + return portalId; + } + + /** + * Gets the exitLocation. + * @return the exitLocation + */ + public Location getExitLocation() { + return exitLocation; + } + + /** + * Gets the cost to move to here + * @return the cost + */ + public int getCost() { + return cost; + } + + /** + * Gets the level requirement to move to here + * @return the level requirement + */ + public int getLevelRequirement() { + return levelRequirement; + } + + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseManager.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseManager.java new file mode 100644 index 000000000..1a4557341 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseManager.java @@ -0,0 +1,825 @@ +package core.game.node.entity.skill.construction; + + +//import org.arios.game.content.global.DeadmanTimedAction; +//import org.arios.game.node.entity.player.info.login.SavingModule; + +import core.game.system.SystemLogger; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.*; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; + +import java.awt.*; +import java.nio.ByteBuffer; + +/** + * Manages the player's house. + * @author Emperor + * + */ +public final class HouseManager implements SavingModule { + + /** + * The current region. + */ + private DynamicRegion region; + + /** + * The current region. + */ + private DynamicRegion dungeon; + + /** + * The house location. + */ + private HouseLocation location = HouseLocation.NOWHERE; + + /** + * The house style. + */ + private HousingStyle style = HousingStyle.BASIC_WOOD; + + /** + * The house zone. + */ + private final HouseZone zone = new HouseZone(this); + + /** + * The player's house rooms. + */ + private final Room[][][] rooms = new Room[4][8][8]; + + /** + * If building mode is enabled. + */ + private boolean buildingMode; + + /** + * If the player has used the portal to lock their house. + */ + private boolean locked; + + /** + * The player's servant. + */ + private Servant servant; + + /** + * If the house has a dungeon. + */ + private boolean hasDungeon; + + /** + * The player's crest. + */ + private CrestType crest = CrestType.ASGARNIA; + + /** + * Constructs a new {@code HouseManager} {@code Object}. + */ + public HouseManager() { + /* + * empty. + */ + } + + + public void save(ByteBuffer buffer) { + buffer.put((byte) location.ordinal()); + buffer.put((byte) style.ordinal()); + if (hasServant()) { + servant.save(buffer); + } else { + buffer.put((byte) -1); + } + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + Room room = rooms[z][x][y]; + if (room != null) { + buffer.put((byte) z).put((byte) x).put((byte) y); + buffer.put((byte) room.getProperties().ordinal()); + buffer.put((byte) room.getRotation().toInteger()); + for (int i = 0; i < room.getHotspots().length; i++) { + if (room.getHotspots()[i].getDecorationIndex() > -1) { + buffer.put((byte) i); + buffer.put((byte) room.getHotspots()[i].getDecorationIndex()); + } + } + buffer.put((byte) -1); + } + } + } + } + buffer.put((byte) -1);//Eof + } + + public void parse(JSONObject data){ + location = HouseLocation.values()[Integer.parseInt( data.get("location").toString())]; + style = HousingStyle.values()[Integer.parseInt( data.get("style").toString())]; + Object servRaw = data.get("servant"); + if(servRaw != null){ + servant = Servant.parse((JSONObject) servRaw); + } + JSONArray rArray = (JSONArray) data.get("rooms"); + for(int i = 0; i < rArray.size(); i++){ + JSONObject rm = (JSONObject) rArray.get(i); + int z = Integer.parseInt(rm.get("z").toString()); + int x = Integer.parseInt(rm.get("x").toString()); + int y = Integer.parseInt(rm.get("y").toString()); + if(z == 3) + hasDungeon = true; + Room room = rooms[z][x][y] = new Room(RoomProperties.values()[Integer.parseInt(rm.get("properties").toString())]); + room.configure(style); + room.setRotation(Direction.get(Integer.parseInt(rm.get("rotation").toString()))); + JSONArray hotspots = (JSONArray) rm.get("hotspots"); + for(int j = 0; j < hotspots.size(); j++){ + JSONObject spot = (JSONObject) hotspots.get(j); + room.getHotspots()[Integer.parseInt(spot.get("hotspotIndex").toString())].setDecorationIndex(Integer.parseInt(spot.get("decorationIndex").toString())); + } + } + } + + + public void parse(ByteBuffer buffer) { + location = HouseLocation.values()[buffer.get() & 0xFF]; + style = HousingStyle.values()[buffer.get() & 0xFF]; + servant = Servant.parse(buffer); + int z = 0; + while ((z = buffer.get()) != -1) { + if (z == 3) { + hasDungeon = true; + } + int x = buffer.get(); + int y = buffer.get(); + Room room = rooms[z][x][y] = new Room(RoomProperties.values()[buffer.get() & 0xFF]); + room.configure(style); + room.setRotation(Direction.get(buffer.get() & 0xFF)); + int spot = 0; + while ((spot = buffer.get()) != -1) { + room.getHotspots()[spot].setDecorationIndex(buffer.get() & 0xFF); + } + } + } + + /** + * Enters the player's house. + * @param player The player entering. + * @param buildingMode If building mode is enabled. + * @param teleport if the entry was a teleport. + */ + public void enter(final Player player, boolean buildingMode, boolean teleport) { + enter(player, buildingMode); + } + + /** + * Enter's the player's house. + * @param player + * @param buildingMode + */ + public void enter(final Player player, boolean buildingMode) { + if (HouseManager.this.buildingMode != buildingMode || !isLoaded()) { + HouseManager.this.buildingMode = buildingMode; + construct(); + } + player.setAttribute("poh_entry", HouseManager.this); + player.lock(1); + player.sendMessage("House location: " + region.getBaseLocation() + ", entry: " + getEnterLocation()); + player.getProperties().setTeleportLocation(getEnterLocation()); + player.getInterfaceManager().openComponent(399); + player.getConfigManager().set(261, buildingMode); + player.getConfigManager().set(262, getRoomAmount()); + player.getAudioManager().send(new Audio(984)); +// player.getMusicPlayer().unlock(454, true); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + if (hasServant()){ + spawnServant(); + if (servant.isGreet()){ + player.getDialogueInterpreter().sendDialogues(servant.getType().getId(), servant.getType().getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Welcome."); + } + } +// player.getInterfaceManager().switchWindowMode(1); + player.getInterfaceManager().close(); + return true; + } + }); + } + + /** + * Leaves this house. + * @param player The player leaving. + */ + public static void leave(Player player) { + HouseManager house = player.getAttribute("poh_entry", player.getHouseManager()); + if (house.getRegion() == null){ + return; + } + if (house.isInHouse(player)) { + player.animate(Animation.RESET); + player.setLocation(house.location.getExitLocation()); + } + } + + /** + * Toggles the building mode. + * @param player The house owner. + * @param enable If the building mode should be enabled. + */ + public void toggleBuildingMode(Player player, boolean enable) { + if (!isInHouse(player)) { + player.getPacketDispatch().sendMessage("Building mode really only helps if you're in a house."); + return; + } + if (buildingMode != enable) { + if (enable) { + expelGuests(player); + } + buildingMode = enable; + reload(player, enable); + player.getPacketDispatch().sendMessage("Building mode is now " + (buildingMode ? "on." : "off.")); + } + } + + /** + * Reloads the house. + * @param player The player. + * @param buildingMode If building mode should be enabled. + */ + public void reload(Player player, boolean buildingMode) { + DynamicRegion r = region; + if ((player.getViewport().getRegion() == dungeon)) { + r = dungeon; + } + int diffX = player.getLocation().getX() - r.getBaseLocation().getX(); + int diffY = player.getLocation().getY() - r.getBaseLocation().getY(); + int diffZ = player.getLocation().getZ() - r.getBaseLocation().getZ(); + region = null; + dungeon = null; + enter(player, buildingMode, false); + player.getProperties().setTeleportLocation((player.getViewport().getRegion() == dungeon ? dungeon : region).getBaseLocation().transform(diffX, diffY, diffZ)); + } + + /** + * Expels the guests from the house. + * @param player The house owner. + */ + public void expelGuests(Player player) { + if (isLoaded()) { + for (RegionPlane plane : region.getPlanes()) { + for (Player p : plane.getPlayers()) { + if (p != player) { + leave(p); + } + } + } + if (dungeon != null) { + for (RegionPlane plane : dungeon.getPlanes()) { + for (Player p : plane.getPlayers()) { + if (p != player) { + leave(p); + } + } + } + } + } + } + + /** + * Gets the entering location. + * @return The entering location. + */ + public Location getEnterLocation() { + if (region == null) { + SystemLogger.logErr("House wasn't constructed yet!"); + return null; + } + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + Room room = rooms[0][x][y]; + if (room != null && (room.getProperties() == RoomProperties.GARDEN || room.getProperties() == RoomProperties.FORMAL_GARDEN)) { + for (Hotspot h : room.getHotspots()) { + if (h.getDecorationIndex() > -1) { + Decoration d = h.getHotspot().getDecorations()[h.getDecorationIndex()]; + if (d == Decoration.PORTAL) { + return region.getBaseLocation().transform(x * 8 + h.getChunkX(), y * 8 + h.getChunkY() + 2, 0); + } + } + } + } + } + } + return null; + } + + /** + * Redecorates the house. + * @param style The new style. + */ + public void redecorate(HousingStyle style) { + this.style = style; + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + Room room = rooms[z][x][y]; + if (room != null) { + room.decorate(style); + } + } + } + } + } + + /** + * Clears all the rooms (Including portal room!). + */ + @Deprecated + public void clearRooms() { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + rooms[z][x][y] = null; + } + } + } + } + + /** + * Creates the default house. + * @param location The house location. + */ + public void create(HouseLocation location) { + clearRooms(); + Room room = rooms[0][4][3] = new Room(RoomProperties.GARDEN); + room.configure(style); + room.getHotspots()[0].setDecorationIndex(0); + this.location = location; + } + + /** + * Constructs the dynamic region for the house. + * @return The region. + */ + public DynamicRegion construct() { + Region from = RegionManager.forId(style.getRegionId()); + Region.load(from, true); + RegionChunk defaultChunk = from.getPlanes()[style.getPlane()].getRegionChunk(1, 0); + ZoneBorders borders = DynamicRegion.reserveArea(8, 8); + region = new DynamicRegion(-1, borders.getSouthWestX() >> 6, borders.getSouthWestY() >> 6); + region.setBorders(borders); + region.setUpdateAllPlanes(true); + RegionManager.getRegionCache().put(region.getId(), region); + configureRoofs(); + for (int z = 0; z < 3; z++) { + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + Room room = rooms[z][x][y]; + if (room != null) { + if (room.getProperties().isRoof() && buildingMode) { + continue; + } + BuildRegionChunk copy = room.getChunk().copy(region.getPlanes()[z]); + region.replaceChunk(z, x, y, copy, from); + room.loadDecorations(z, copy, this); + } else { + region.replaceChunk(z, x, y, z != 0 ? null : defaultChunk.copy(region.getPlanes()[0]), from); + } + } + } + } + if (hasDungeon()) { + defaultChunk = from.getPlanes()[style.getPlane()].getRegionChunk(3, 0); + borders = DynamicRegion.reserveArea(8, 8); + dungeon = new DynamicRegion(-1, borders.getSouthWestX() >> 6, borders.getSouthWestY() >> 6); + dungeon.setBorders(borders); + dungeon.setUpdateAllPlanes(true); + RegionManager.getRegionCache().put(dungeon.getId(), dungeon); + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + Room room = rooms[3][x][y]; + if (hasRoom(3, x, y)) { + BuildRegionChunk copy = room.getChunk().copy(dungeon.getPlanes()[0]); + dungeon.replaceChunk(0, x, y, copy, from); + room.loadDecorations(3, copy, this); + } else { + dungeon.replaceChunk(0, x, y, buildingMode ? null : defaultChunk.copy(dungeon.getPlanes()[0]), from); + } + } + } + region.link(dungeon); + } + ZoneBuilder.configure(zone); + return region; + } + + /** + * Configures the rooftops. + */ + public void configureRoofs() { +// boolean[][][] roofs = new boolean[2][8][8]; +// for (int x = 0; x < 8; x++) { +// for (int y = 0; y < 8; y++) { +// Room room = rooms[0][x][y]; +// if (room != null && room.getProperties().isChamber()) { +// room = rooms[1][x][y]; +// int z = 1; +// if (room != null && room.getProperties().isChamber()) { +// z = 2; +// } +// if (x > 0 ) +// } +// } +// } + } + + /** + * Gets the current room plane. + * @param l The location. + * @return The plane of the room. + */ + public Room getRoom(Location l) { + int z = l.getZ(); + if (dungeon != null && l.getRegionId() == dungeon.getId()) { + z = 3; + } + return rooms[z][l.getChunkX()][l.getChunkY()]; + } + + /** + * Gets the hotspot for the given object. + * @param object The object. + * @return The hotspot. + */ + public Hotspot getHotspot(GameObject object) { + Room room = getRoom(object.getLocation()); + if (room == null) { + return null; + } + int chunkX = object.getLocation().getChunkOffsetX(); + int chunkY = object.getLocation().getChunkOffsetY(); + switch(room.getRotation()){ + case WEST: { + int tempChunk = chunkY; + chunkY = 7 - chunkX; + chunkX = tempChunk; + break; + } + case EAST: { + //x = y, y = x, x = 7 - y + int tempChunk = chunkX; + chunkX = 7 - chunkY; + chunkY = tempChunk; + break; + } + case SOUTH: { + chunkY = 7 - chunkY; + break; + } + } + for (Hotspot h : room.getHotspots()) { + if ((h.getChunkX() == chunkX || h.getChunkX2() == chunkX) && (h.getChunkY() == chunkY || h.getChunkY2() == chunkY) && h.getHotspot().getObjectId(style) == object.getId()) { + return h; + } + } + return null; + } + + /** + * Checks if a room exists on the given location. + * @param z The plane. + * @param roomX The room x-coordinate. + * @param roomY The room y-coordinate. + * @return {@code True} if so. + */ + public boolean hasRoom(int z, int roomX, int roomY) { + Room room = rooms[z][roomX][roomY]; + return room != null && !room.getProperties().isRoof(); + } + + /** + * Enters the dungeon. + * @param player The player. + */ + public void enterDungeon(Player player) { + if (!hasDungeon()) { + return; + } + int diffX = player.getLocation().getLocalX(); + int diffY = player.getLocation().getLocalY(); + player.getProperties().setTeleportLocation(dungeon.getBaseLocation().transform(diffX, diffY, 0)); + } + + /** + * Checks if an exit exists on the given room. + * @param roomX The x-coordinate of the room. + * @param roomY The y-coordinate of the room. + * @param direction The exit direction. + * @return {@code True} if so. + */ + public boolean hasExit(int z, int roomX, int roomY, Direction direction) { + Room room = rooms[z][roomX][roomY]; + int index = (direction.toInteger() + 3) % 4; + return room != null && room.getExits()[index]; + } + + /** + * Gets the amount of rooms. + * @return The amount of rooms. + */ + public int getRoomAmount() { + int count = 0; + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + Room r = rooms[z][x][y]; + if (r != null && !r.getProperties().isRoof()) { + count++; + } + } + } + } + return count; + } + + /** + * Gets the amount of portals available. + * @return The amount of portals. + */ + public int getPortalAmount() { + int count = 0; + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + Room room = rooms[0][x][y]; + if (room != null && (room.getProperties() == RoomProperties.GARDEN + || room.getProperties() == RoomProperties.FORMAL_GARDEN) && room.getHotspots()[0].getDecorationIndex() == 0) { + count++; + } + } + } + return count; + } + + /** + * Gets the current house boundaries. + * @return The boundaries. + */ + public Rectangle getBoundaries() { + int startX = 99; + int startY = 99; + int endX = 0; + int endY = 0; + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + if (rooms[0][x][y] != null) { + if (x < startX) startX = x; + if (y < startY) startY = y; + if (x > endX) endX = x; + if (y > endY) endY = y; + } + } + } + return new Rectangle(startX, startY, (endX - startX) + 1, (endY - startY) + 1); + } + + /** + * Gets the maximum dimension for the house boundaries. + * @param player The player. + * @return The dimension value (value X value = dimension) + */ + public int getMaximumDimension(Player player) { + int level = player.getSkills().getStaticLevel(Skills.CONSTRUCTION); + if (level >= 60) { + return 7; + } + if (level >= 45) { + return 6; + } + if (level >= 30) { + return 5; + } + if (level >= 15) { + return 4; + } + return 3; + } + + /** + * Gets the maximum amount of rooms available for the player. + * @param player The player. + * @return The maximum amount of rooms. + */ + public int getMaximumRooms(Player player) { + int level = player.getSkills().getStaticLevel(Skills.CONSTRUCTION); + if (level >= 99) return 30; + if (level >= 96) return 29; + if (level >= 92) return 28; + if (level >= 86) return 27; + if (level >= 80) return 26; + if (level >= 74) return 25; + if (level >= 68) return 24; + if (level >= 62) return 23; + if (level >= 56) return 22; + if (level >= 50) return 21; + return 20; + } + + /** + * Spawns the servant inside the player's home. + */ + private void spawnServant(){ + servant.setLocation(getEnterLocation()); + servant.setWalkRadius(getRoomAmount() * 2); + servant.setWalks(true); + servant.init(); + } + + /** + * Checks if the player has a servant. + * @return {@code True} if so. + */ + public boolean hasServant() { + return servant != null; + } + + /** + * Checks if the player is in his own house (or dungeon). + * @param player The player. + * @return {@code True} if so. + */ + public boolean isInHouse(Player player) { + return isLoaded() && (player.getViewport().getRegion() == region || player.getViewport().getRegion() == dungeon); + } + + /** + * Checks if the player is in his dungeon. + * @param player The player. + * @return {@code True} if so. + */ + public static boolean isInDungeon(Player player) { + return player.getViewport().getRegion() == player.getHouseManager().dungeon; + } + + /** + * Checks if the house region was constructed and active. + * @return {@code True} if an active region for the house exists. + */ + public boolean isLoaded() { + return region != null && region.isActive() || dungeon != null && dungeon.isActive(); + } + + /** + * Gets the hasHouse. + * @return The hasHouse. + */ + public boolean hasHouse() { + return location != HouseLocation.NOWHERE; + } + + /** + * Checks if the house has a dungeon. + * @return {@code True} if so. + */ + public boolean hasDungeon() { + return hasDungeon; + } + + /** + * Sets the has dungeon value. + * @param hasDungeon If the house has a dungeon. + */ + public void setHasDungeon(boolean hasDungeon) { + this.hasDungeon = hasDungeon; + } + + /** + * Gets the rooms. + * @return The rooms. + */ + public Room[][][] getRooms() { + return rooms; + } + + /** + * Gets the location. + * @return The location. + */ + public HouseLocation getLocation() { + return location; + } + + /** + * Sets the location. + * @param location The location to set. + */ + public void setLocation(HouseLocation location) { + this.location = location; + } + + /** + * Checks if the building mode is enabled. + * @return {@code True} if so. + */ + public boolean isBuildingMode() { + return buildingMode; + } + + /** + * Checks if the player has locked their house. + * @return {@code True} if so. + */ + public boolean isLocked() { + return locked; + } + + /** + * Sets the house to locked. + * @param locked true or false + */ + public void setLocked(boolean locked) { + this.locked = locked; + } + + /** + * Gets the region. + * @return The region. + */ + public Region getRegion() { + return region; + } + + /** + * Gets the dungeon region. + * @return The dungeon region. + */ + public Region getDungeonRegion() { + return dungeon; + } + + /** + * Gets the style. + * @return the style + */ + public HousingStyle getStyle() { + return style; + } + + /** + * Sets the style. + * @param style the style to set. + */ + public void setStyle(HousingStyle style) { + this.style = style; + } + + /** + * Gets the player's servant + * @return the servant. + */ + public Servant getServant(){ + return servant; + } + + /** + * Sets the player's servant + * @param servant The servant to set. + */ + public void setServant(Servant servant){ + this.servant = servant; + } + + /** + * Gets the crest value. + * @return The crest. + */ + public CrestType getCrest() { + return crest; + } + + /** + * Sets the crest value. + * @param crest The crest to set. + */ + public void setCrest(CrestType crest) { + this.crest = crest; + } + + /** + * @return the zone + */ + public HouseZone getZone() { + return zone; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseZone.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseZone.java new file mode 100644 index 000000000..9d578623d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/HouseZone.java @@ -0,0 +1,78 @@ +package core.game.node.entity.skill.construction; + + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneRestriction; + +/** + * Handles the player owned house zone. + * + * @author Emperor + */ +public final class HouseZone extends MapZone { + + /** + * The house manager. + */ + private HouseManager house; + + /** + * The previous house region id. + */ + private int previousRegion = -1; + + /** + * The previous dungeon region id. + */ + private int previousDungeon = -1; + + /** + * Constructs the house zone object. + */ + public HouseZone(HouseManager house) { + super("poh-zone" + house, true, ZoneRestriction.RANDOM_EVENTS, ZoneRestriction.FOLLOWERS); + this.house = house; + } + + @Override + public void configure() { + if (previousRegion != -1) { + unregisterRegion(previousRegion); + } + if (previousDungeon != -1) { + unregisterRegion(previousDungeon); + } + registerRegion(house.getRegion().getId()); + if (house.getDungeonRegion() != null) { + registerRegion(house.getRegion().getId()); + } + } + + @Override + public boolean enter(Entity e) { + return super.enter(e); + } + + @Override + public boolean death(Entity e, Entity killer) { + if (e instanceof Player) { + Player p = (Player) e; + HouseManager.leave(p); + } + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (logout) { + if (e instanceof Player) { + Player p = (Player) e; + HouseManager.leave(p); + return true; + } + } + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/HousingStyle.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/HousingStyle.java new file mode 100644 index 000000000..d228cc79a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/HousingStyle.java @@ -0,0 +1,139 @@ +package core.game.node.entity.skill.construction; + +/** + * The styles of houses. + * @author Emperor + * + */ +public enum HousingStyle { + + BASIC_WOOD (1, 5000, 7503, 0, 13100, 13101, 13098, Decoration.BASIC_WOOD_WINDOW), + BASIC_STONE (10, 5000, 7503, 1, 13094, 13096, 1902, Decoration.BASIC_STONE_WINDOW), + WHITEWASHED_STONE (20, 7500, 7503, 2, 13006, 13007, 1415, Decoration.WHITEWASHED_STONE_WINDOW), + FREMENNIK_STYLE_WOOD(30, 10000, 7503, 3, 13109, 13107, 13111, Decoration.FREMENNIK_WINDOW), + TROPICAL_WOOD (40, 15000, 7759, 0, 13016, 13015, 13011, Decoration.TROPICAL_WOOD_WINDOW), + FANCY_STONE (50, 25000, 7759, 1, 13119, 13118, 13116, Decoration.FANCY_STONE_WINDOW); + + /** + * The level required. + */ + private final int level; + + /** + * The cost. + */ + private final int cost; + + /** + * The region id. + */ + private final int regionId; + + /** + * The plane. + */ + private final int plane; + + /** + * The door id. + */ + private final int doorId; + + /** + * The second door id. + */ + private final int secondDoorId; + + /** + * The wall id. + */ + private final int wallId; + + /** + * The window style + */ + private final Decoration window; + + /** + * Constructs a new {@code HousingStyle} {@code Object} + * @param level The level required. + * @param cost The cost of the style. + * @param regionId The region id for this style. + * @param plane The plane for this style. + * @param doorId The door object id used in this style. + */ + private HousingStyle(int level, int cost, int regionId, int plane, int doorId, int secondDoorId, int wallId, Decoration window) { + this.level = level; + this.cost = cost; + this.regionId = regionId; + this.plane = plane; + this.doorId = doorId; + this.secondDoorId = secondDoorId; + this.wallId = wallId; + this.window = window; + } + + /** + * Gets the level. + * @return the level + */ + public int getLevel() { + return level; + } + + /** + * Gets the cost. + * @return the cost + */ + public int getCost() { + return cost; + } + + /** + * Gets the regionId. + * @return the regionId + */ + public int getRegionId() { + return regionId; + } + + /** + * Gets the plane. + * @return the plane + */ + public int getPlane() { + return plane; + } + + /** + * Gets the door used in this style. + * @return The door object id. + */ + public int getDoorId() { + return doorId; + } + + /** + * Gets the wall used in this style. + * @return The wall object id. + */ + public int getWallId() { + return wallId; + } + + /** + * Gets the window id for this style of house + * @return The windows object id + */ + public Decoration getWindowStyle() { + return window; + } + + /** + * Gets the secondDoorId value. + * @return The secondDoorId. + */ + public int getSecondDoorId() { + return secondDoorId; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/NailType.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/NailType.java new file mode 100644 index 000000000..c2dd0e661 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/NailType.java @@ -0,0 +1,81 @@ +package core.game.node.entity.skill.construction; + + +import core.game.node.entity.player.Player; +import core.tools.RandomFunction; + +/** + * Holds information of all nail types. + * @author Emperor + * + */ +public enum NailType { + + BRONZE(4819, 5), + IRON(4820, 7), + STEEL(1539, 10), + MITHRIL(4822, 13), + ADAMANT(4823, 15), + RUNE(4824, 20) + ; + + /** + * The nail item id. + */ + private final int itemId; + + /** + * The bend rate. + */ + private final int bendRate; + + /** + * Constructs a new {@code NailType} {@code Object}. + * @param itemId The item id. + * @param bendRate The bending rate. + */ + private NailType(int itemId, int bendRate) { + this.itemId = itemId; + this.bendRate = bendRate; + } + + /** + * Checks if the nail will bend. + * @return {@code True} if Random.nextInt(bendRate) equals 0. + */ + public boolean isBend() { + return RandomFunction.getRandom(bendRate) == 0; + } + + /** + * Gets the nail type used by the player. + * @param player The player. + * @param amount The nails required. + * @return The nail type used, or null if the player didn't have the nails. + */ + public static NailType get(Player player, int amount) { + for (int i = values().length - 1; i >= 0; i--) { + NailType type = values()[i]; + if (player.getInventory().contains(type.itemId, amount)) { + return type; + } + } + return null; + } + + /** + * Gets the itemId value. + * @return The itemId. + */ + public int getItemId() { + return itemId; + } + + /** + * Gets the bendRate value. + * @return The bendRate. + */ + public int getBendRate() { + return bendRate; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/PortalOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/PortalOptionPlugin.java new file mode 100644 index 000000000..ac8602ed1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/PortalOptionPlugin.java @@ -0,0 +1,159 @@ +package core.game.node.entity.skill.construction; + + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.object.GameObject; +import core.game.world.repository.Repository; +import core.plugin.*; + +/** + * Handles the house portal options. + * @author Emperor + * + */ +@Initializable +public final class PortalOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (HouseLocation hl : HouseLocation.values()) { + ObjectDefinition.forId(hl.getPortalId()).getHandlers().put("option:enter", this); + } + ObjectDefinition.forId(13405).getHandlers().put("option:lock", this); + ObjectDefinition.forId(13405).getHandlers().put("option:enter", this); + PluginManager.definePlugin(new PortalDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + GameObject object = node.asObject(); + if (object.getId() == 13405 && option.equals("enter")) { + HouseManager.leave(player); + return true; + } + if (option.equals("lock")) { + if (player.getHouseManager().isInHouse(player)) { + player.getHouseManager().setLocked(player.getHouseManager().isLocked() ? false : true); + player.sendMessage("Your house is now "+(player.getHouseManager().isLocked() ? "locked." : "unlocked." )); + return true; + } + player.sendMessage("This is not your house."); + return true; + } + player.setAttribute("con:portal", object.getId()); + player.getDialogueInterpreter().open("con:portal"); + return true; + } + + /** + * Handles the portal dialogue. + * @author Emperor + */ + @PluginManifest(type= PluginType.DIALOGUE) + private class PortalDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code PortalDialogue} {@code Object} + */ + public PortalDialogue() { + + } + + /** + * Constructs a new {@code PortalDialogue} {@code Object} + * @param player The player. + */ + public PortalDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new PortalDialogue(player); + } + + @Override + public boolean open(Object... args) { + + + + + options("Go to your house", "Go to your house (building mode)", "Go to a friend's house", "Never mind"); + stage = 1; + + + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + switch (stage) { + case 1: + switch (buttonId) { + case 1: + case 2: + //If the player does not have a house + if (!player.getHouseManager().hasHouse()) { + player.getPacketDispatch().sendMessage("You don't have a house, talk to an estate agent to purchase a house."); + break; + } + //If the Player has a house, but does not have their house moved to the portal they are interacting with + if (player.getHouseManager().getLocation().getPortalId() != player.getAttribute("con:portal", -1)) { + player.getPacketDispatch().sendMessage("Your house is in " + player.getHouseManager().getLocation().getName() + "."); + player.sendMessage("Speak with an estate agent to change your house location."); + break; + } + player.getHouseManager().enter(player, buttonId == 2, true); + break; + case 3: + player.getDialogueInterpreter().sendInput(true, "Enter friend's name:"); + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + Player p = Repository.getPlayerByName((String) getValue()); + if (p == null || !p.isActive()) { + player.getPacketDispatch().sendMessage("This player is not online."); + return true; + } + if (p.getUsername().equals(player.getUsername())) { + player.getPacketDispatch().sendMessage("You aren't a friend of yourself!"); + return true; + } + if (!p.getHouseManager().isLoaded()) { + player.getPacketDispatch().sendMessage("This player is not at home right now."); + return true; + } + if (p.getHouseManager().isBuildingMode()) { + player.getPacketDispatch().sendMessage("This player is in building mode."); + return true; + } + if (p.getHouseManager().isLocked()) { + player.getPacketDispatch().sendMessage("The other player has locked their house."); + return true; + } + p.setAttribute("poh_owner", getValue()); + p.getHouseManager().enter(player, false, false); + return true; + } + }); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("con:portal") }; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/RemovalDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/RemovalDialogue.java new file mode 100644 index 000000000..eff725641 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/RemovalDialogue.java @@ -0,0 +1,102 @@ +package core.game.node.entity.skill.construction; + + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; + +/** + * Removal dialogue for room & decorations in construction + * @author Clayton Williams + * @author Emperor + * @date Jun-30-2015 + */ +@Initializable +public final class RemovalDialogue extends DialoguePlugin { + + /** + * The room position. + */ + private int[] pos; + + /** + * The plane. + */ + private int plane; + + /** + * The room to remove. + */ + private Room room; + + /** + * Removal Dialogue + */ + public RemovalDialogue() { + super(); + } + + /** + * Removal Dialogue + * @param player + */ + public RemovalDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RemovalDialogue(player); + } + + @Override + public boolean open(Object... args) { + pos = (int[]) args[1]; + plane = player.getLocation().getZ(); + if (HouseManager.isInDungeon(player)) { + plane = 3; + } + room = player.getHouseManager().getRooms()[plane][pos[0]][pos[1]]; + player.getDialogueInterpreter().sendOptions("Remove the " + (room != null ? room.getProperties().getName() : "room") + "?", "Yes", "No"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (stage == 0) { + if (buttonId == 1) { + if (plane == 0 && player.getHouseManager().hasRoom(1, pos[0], pos[1])) { + interpreter.sendPlainMessage(false, "You can't remove a room supporting another room."); + stage = 1; + return true; + } + if (room != null && room.getProperties().isLand()) { + Hotspot h = room.getHotspots()[0]; + if (h != null && h.getDecorationIndex() == 0 && player.getHouseManager().getPortalAmount() <= 1) { + interpreter.sendPlainMessage(false, "You can't remove the garden with your portal in it."); + stage = 1; + return true; + } + } + player.getHouseManager().getRooms()[plane][pos[0]][pos[1]] = null; + for (int i = plane; i < 3; i++) { + Room r = player.getHouseManager().getRooms()[i][pos[0]][pos[1]]; + if (r != null && r.getProperties().isRoof()) { + player.getHouseManager().getRooms()[i][pos[0]][pos[1]] = null; + } + } + player.getHouseManager().reload(player, true); + } + } + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[]{ DialogueInterpreter.getDialogueKey("con:remove") }; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/Room.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/Room.java new file mode 100644 index 000000000..5560a3fa3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/Room.java @@ -0,0 +1,400 @@ +package core.game.node.entity.skill.construction; + + +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.*; + +/** + * Represents a room. + * @author Emperor + * + */ +public final class Room { + + /** + * The default room type. + */ + public static final int CHAMBER = 0x0; + + /** + * The rooftop room type. + */ + public static final int ROOF = 0x1; + + /** + * The dungeon room type. + */ + public static final int DUNGEON = 0x2; + + /** + * The dungeon room type. + */ + public static final int LAND = 0x4; + + /** + * The room properties. + */ + private RoomProperties properties; + + /** + * The region chunk. + */ + private RegionChunk chunk; + + /** + * The hotspots. + */ + private Hotspot[] hotspots; + + /** + * The current rotation of the room. + */ + private Direction rotation = Direction.NORTH; + + /** + * Constructs a new {@code Room} {@code Object}. + * @param properties The room properties. + */ + public Room(RoomProperties properties) { + this.properties = properties; + } + + /** + * Creates a new room. + * @param player The player. + * @param properties The room properties. + * @return The room. + */ + public static Room create(Player player, RoomProperties properties) { + Room room = new Room(properties); + room.configure(player.getHouseManager().getStyle()); + return room; + } + + /** + * Configures the room. + */ + public void configure(HousingStyle style) { + this.hotspots = new Hotspot[properties.getHotspots().length]; + for (int i = 0; i < hotspots.length; i++) { + hotspots[i] = properties.getHotspots()[i].copy(); + } + decorate(style); + } + + /** + * Redecorates the room. + * @param style The house style. + */ + public void decorate(HousingStyle style) { + Region region = RegionManager.forId(style.getRegionId()); + Region.load(region, true); + chunk = region.getPlanes()[style.getPlane()].getRegionChunk(properties.getChunkX(), properties.getChunkY()); + } + + /** + * Gets the hotspot object for the given hotspot type. + * @param hotspot The hotspot type. + * @return The hotspot. + */ + public Hotspot getHotspot(BuildHotspot hotspot) { + for (Hotspot h : hotspots) { + if (h.getHotspot() == hotspot) { + return h; + } + } + return null; + } + + /** + * Checks if the building hotspot has been built. + * @param hotspot The building hotspot. + * @return {@code True} if so. + */ + public boolean isBuilt(BuildHotspot hotspot) { + Hotspot h = getHotspot(hotspot); + return h != null && h.getDecorationIndex() > -1; + } + + /** + * Loads all the decorations. + * @param housePlane The plane. + * @param chunk The chunk used in the dynamic region. + */ + public void loadDecorations(int housePlane, BuildRegionChunk chunk, HouseManager house) { + for (int i = 0; i < hotspots.length; i++) { + Hotspot spot = hotspots[i]; + int x = spot.getChunkX(); + int y = spot.getChunkY(); + if (spot.getHotspot() == null) { + continue; + } + int index = chunk.getIndex(x, y, spot.getHotspot().getObjectId(house.getStyle())); + GameObject[][] objects = chunk.getObjects(index); + GameObject object = objects[x][y]; + if (object != null && object.getId() == spot.getHotspot().getObjectId(house.getStyle())) { + if (spot.getDecorationIndex() > -1 && spot.getDecorationIndex() < spot.getHotspot().getDecorations().length) { + int id = spot.getHotspot().getDecorations()[spot.getDecorationIndex()].getObjectId(house.getStyle()); + if (spot.getHotspot().getType() == BuildHotspotType.CREST) { + id += house.getCrest().ordinal(); + } + ObjectBuilder.replace(object, object.transform(id, object.getRotation(), chunk.getCurrentBase().transform(x, y, 0))); + } + else if (object.getId() == BuildHotspot.WINDOW.getObjectId(house.getStyle()) || (!house.isBuildingMode() && object.getId() == BuildHotspot.CHAPEL_WINDOW.getObjectId(house.getStyle()))) { + chunk.add(object.transform(house.getStyle().getWindowStyle().getObjectId(house.getStyle()), object.getRotation(), object.getType())); + } + int[] pos = RegionChunk.getRotatedPosition(x, y, object.getSizeX(), object.getSizeY(), 0, rotation.toInteger()); + spot.setCurrentX(pos[0]); + spot.setCurrentY(pos[1]); + } + } + if (!house.isBuildingMode()) { + removeHotspots(housePlane, house, chunk); + } + if (rotation != Direction.NORTH && chunk.getRotation() == 0) { + chunk.rotate(rotation); + } + } + + /** + * Removes the building hotspots from the room. + * @param housePlane The room's plane in house. + * @param house The house manager. + * @param chunk The region chunk used. + */ + private void removeHotspots(int housePlane, HouseManager house, BuildRegionChunk chunk) { + for (int i = 0; i < BuildRegionChunk.ARRAY_SIZE; i++) { + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + GameObject object = chunk.get(x, y, i); + if (object != null && object.getDefinition().hasAction("Build")) { + if (properties.isChamber() && BuildingUtils.isDoorHotspot(object)) { + if (!placeDoors(house, chunk, object, housePlane, x, y, rotation)) { + chunk.remove(object); + } + } else { +// BuildHotspot hs = BuildHotspot.forId(object.protocol(), house.getStyle()); +// for (Hotspot h : hotspots) { +// if (h != null && h.getHotspot() == hs && h.getHotspot().getObjectIds() == null) { +// chunk.remove(object); +// break; +// } +// } + chunk.remove(object); + } + } + } + } + } + } + + /** + * Places the doors when needed. + * @param chunk The chunk. + * @param object The object. + * @param x The x-coordinate of the object. + * @param y The y-coordinate of the object. + */ + private boolean placeDoors(HouseManager house, BuildRegionChunk chunk, GameObject object, int z, int x, int y, Direction rotation) { + int doorX; + int doorY; + switch (rotation) { + case EAST: + doorX = y; + doorY = 7 - x; + break; + case SOUTH: + doorX = 7 - x; + doorY = 7 - y; + break; + case WEST: + doorX = 7 - y; + doorY = x; + break; + default: + doorX = x; + doorY = y; + break; + } + int chunkX = chunk.getCurrentBase().getChunkX(); + int chunkY = chunk.getCurrentBase().getChunkY(); + boolean houseExit = true; + Room r; + if (doorX == 0 && chunkX > 0 && (r = house.getRooms()[z][chunkX - 1][chunkY]) != null && r.getProperties().isChamber()) { + houseExit = false; + } + else if (doorX == 7 && chunkX < 7 && (r = house.getRooms()[z][chunkX + 1][chunkY]) != null && r.getProperties().isChamber()) { + houseExit = false; + } + else if (doorY == 0 && chunkY > 0 && (r = house.getRooms()[z][chunkX][chunkY - 1]) != null && r.getProperties().isChamber()) { + houseExit = false; + } + else if (doorY == 7 && chunkY < 7 && (r = house.getRooms()[z][chunkX][chunkY + 1]) != null && r.getProperties().isChamber()) { + houseExit = false; + } + int replaceId = object.getId() % 2 != 0 ? house.getStyle().getDoorId() : house.getStyle().getSecondDoorId(); + houseExit = false; + if (z != 0 && houseExit) { + r = house.getRooms()[z][chunkX][chunkY]; + if (r.getProperties().isDungeon()) { + replaceId = 13065; + } else { + replaceId = house.getStyle().getWallId(); + } + } + else if (!houseExit) { + return false; + } + return ObjectBuilder.replace(object, object.transform(replaceId, object.getRotation(), chunk.getCurrentBase().transform(x, y, 0)), true, true); + } + + /** + * Sets the decoration index for a group of object ids + * @param index The index. + * @param hs The building hotspot. + */ + public void setAllDecorationIndex(int index, BuildHotspot hs) { + for (int i = 0; i < hotspots.length; i++) { + Hotspot h = hotspots[i]; + if (h.getHotspot() == hs) { + h.setDecorationIndex(index); + } + } + } + + /** + * Gets the stairs hotspot for this room (or null if no stairs are available). + * @return The stairs. + */ + public Hotspot getStairs() { + for (Hotspot h : hotspots) { + if (h.getHotspot().getType() == BuildHotspotType.STAIRCASE + || h.getHotspot() == BuildHotspot.LADDER || h.getHotspot() == BuildHotspot.TRAPDOOR + || (h.getHotspot() == BuildHotspot.CENTREPIECE_1 && h.getDecorationIndex() == 4) + || (h.getHotspot() == BuildHotspot.CENTREPIECE_2 && h.getDecorationIndex() == 2)) { + return h; + } + } + return null; + } + + /** + * Gets the exit directions + * @return The exits information. + */ + public boolean[] getExits() { + return getExits(rotation); + } + + /** + * Gets the exit directions. + * @return The directions at which you can exit the room (0=east, 1=south, 2=west, 3=north). + */ + public boolean[] getExits(Direction rotation) { + boolean[] exits = properties.getExits(); + if (chunk.getRotation() != rotation.toInteger()) { + boolean[] exit = new boolean[exits.length]; + int offset = rotation.toInteger() - chunk.getRotation(); + for (int i = 0; i < 4; i++) { + exit[(i + offset) % 4] = exits[i]; + } + return exit; + } + return exits; + } + + /** + * Gets the hotspot for the given coordinates. + * @param build The build hotspot. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @return The hotspot. + */ + public Hotspot getHotspot(BuildHotspot build, int x, int y) { + for (int i = 0; i < getHotspots().length; i++) { + Hotspot h = getHotspots()[i]; + if (h.getCurrentX() == x && h.getCurrentY() == y && h.getHotspot() == build) { + return h; + } + } + return null; + } + + /** + * Sets the properties. + * @param properties The properties. + */ + public void updateProperties(Player player, RoomProperties properties) { + this.properties = properties; + decorate(player.getHouseManager().getStyle()); + if (hotspots.length != properties.getHotspots().length) { + return; + } + for (int i = 0; i < hotspots.length; i++) { + Hotspot h = hotspots[i]; + Hotspot hs = hotspots[i] = properties.getHotspots()[i].copy(); + hs.setCurrentX(h.getCurrentX()); + hs.setCurrentY(h.getCurrentY()); + hs.setDecorationIndex(h.getDecorationIndex()); + } + } + + /** + * Gets the chunk. + * @return The chunk. + */ + public RegionChunk getChunk() { + return chunk; + } + + /** + * Sets the chunk. + * @param chunk The chunk to set. + */ + public void setChunk(RegionChunk chunk) { + this.chunk = chunk; + } + + /** + * Gets the hotspots. + * @return The hotspots. + */ + public Hotspot[] getHotspots() { + return hotspots; + } + + /** + * Sets the hotspots. + * @param hotspots The hotspots to set. + */ + public void setHotspots(Hotspot[] hotspots) { + this.hotspots = hotspots; + } + + /** + * Gets the properties. + * @return The properties. + */ + public RoomProperties getProperties() { + return properties; + } + + /** + * Sets the room rotation. + * @param rotation The rotation. + */ + public void setRotation(Direction rotation) { + this.rotation = rotation; + } + + /** + * Gets the rotation. + * @return The rotation. + */ + public Direction getRotation() { + return rotation; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/RoomBuilder.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/RoomBuilder.java new file mode 100644 index 000000000..4968be95e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/RoomBuilder.java @@ -0,0 +1,311 @@ +package core.game.node.entity.skill.construction; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.SystemLogger; +import core.game.world.map.BuildRegionChunk; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +import java.util.Arrays; + +/** + * Used for building a room. + * @author Emperor + * + */ +public final class RoomBuilder { + + /** + * The directions array. + */ + public static final Direction[] DIRECTIONS = { + Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST + }; + + /** + * Opens the building furniture interface. + * @param player The player. + * @param hotspot The hotspot. + */ + public static void openBuildInterface(Player player, BuildHotspot hotspot) { + player.getInterfaceManager().open(new Component(396)); + Item[] items = new Item[7]; + int value = 1; + for (int i = 0; i < 7; i++) { + int offset = i * 5; + if (i >= hotspot.getDecorations().length) { + for (int j = 97; j < 102; j++) { + player.getPacketDispatch().sendString("", 396, j + offset); + } + player.getPacketDispatch().sendString("", 396, 140 + i); + value |= 1 << (i + 1); + continue; + } + Decoration decoration = hotspot.getDecorations()[i]; + if (i < 4) { + items[i * 2] = new Item(decoration.getInterfaceItem()); + } else { + items[1 + ((i - 4) * 2)] = new Item(decoration.getInterfaceItem()); + } + player.getPacketDispatch().sendString(ObjectDefinition.forId(decoration.getObjectId()).getName(), 396, 97 + offset); + boolean hasRequirements = true; + for (int j = 0; j < 4; j++) { + if (j >= decoration.getItems().length) { + player.getPacketDispatch().sendString("", 396, 98 + offset + j); + } else { + Item item = decoration.getItems()[j]; + if (!player.getInventory().containsItem(item)) { + hasRequirements = false; + } + player.getPacketDispatch().sendString(item.getName() + ": " + item.getAmount(), 396, 98 + offset + j); + } + } + player.getPacketDispatch().sendString("Lvl " + decoration.getLevel(), 396, 140 + i); + if (hasRequirements) { + value |= 1 << (i + 1); + } + } + player.getConfigManager().set(261, value); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 396, 132, 91, items, false)); + } + + /** + * Builds a decoration object. + * @param player The player. + * @param deco The decoration. + * @param object The object. + */ + public static void buildDecoration(Player player, BuildHotspot hotspot, Decoration deco, GameObject object) { + if(!player.isAdmin()){ + if (!player.getInventory().containsItems(deco.getItems())) { + player.getPacketDispatch().sendMessage("You don't have the required items to build this."); + return; + } + player.getInventory().remove(deco.getItems()); + } + Location l = object.getLocation(); + Room room = player.getHouseManager().getRooms()[l.getZ()][l.getLocalX() >> 3][l.getLocalY() >> 3]; + Hotspot h = room.getHotspot(hotspot, l.getX(), l.getY()); + if (h != null) { + switch(h.getHotspot().getType()) { + case INDIVIDUAL: + ObjectBuilder.replace(object, object.transform(deco.getObjectId())); + h.setDecorationIndex(hotspot.getDecorationIndex(deco)); + break; + case RECURSIVE: + room.setAllDecorationIndex(hotspot.getDecorationIndex(deco), h.getHotspot()); + GameObject[][] objects = player.getHouseManager().getRegion().getPlanes()[l.getZ()].getChunks()[l.getLocalX() >> 3][l.getLocalY() >> 3].getObjects(); + for (int j = 0; j < objects.length; j++) { + for (int k = 0; k < objects[j].length; k++) { + GameObject go = objects[j][k]; + if (go != null && go.getId() == object.getId()) { + ObjectBuilder.replace(go, go.transform(deco.getObjectId())); + } + } + } + break; + case LINKED: + BuildHotspot[] linkedHotspots = BuildHotspot.getLinkedHotspots(h.getHotspot()); + BuildRegionChunk chunk = (BuildRegionChunk) player.getHouseManager().getRegion().getPlanes()[l.getZ()].getChunks()[l.getLocalX() >> 3][l.getLocalY() >> 3]; + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + for(BuildHotspot bh : linkedHotspots) { + int index = chunk.getIndex(x, y, bh.getObjectId()); + GameObject o = chunk.get(x, y, index); + if (o != null && bh.getObjectId() == o.getId()) { + ObjectBuilder.replace(o, o.transform(bh.getDecorations()[0].getObjectId())); + room.setAllDecorationIndex(0, bh); + } + } + } + } + break; + } + } + } + + /** + * Remove the decoration + * @param player the player + * @param object the object to remove + */ + public static void removeDecoration(Player player, GameObject object) { + Location l = object.getLocation(); + Room room = player.getHouseManager().getRooms()[l.getZ()][l.getLocalX() >> 3][l.getLocalY() >> 3]; + for (int i = 0; i < room.getHotspots().length; i++) { + Hotspot hotspot = room.getHotspots()[i]; + if (hotspot.getChunkX() == l.getChunkOffsetX() && hotspot.getChunkY() == l.getChunkOffsetY()) { + switch (hotspot.getHotspot().getType()) { + case INDIVIDUAL: + ObjectBuilder.replace(object, object.transform(hotspot.getHotspot().getObjectId())); + hotspot.setDecorationIndex(-1); + return; + case RECURSIVE: + room.setAllDecorationIndex(-1, hotspot.getHotspot()); + GameObject[][] objects = player.getHouseManager().getRegion().getPlanes()[l.getZ()].getChunks()[l.getLocalX() >> 3][l.getLocalY() >> 3].getObjects(); + for (int j = 0; j < objects.length; j++) { + for (int k = 0; k < objects[j].length; k++) { + GameObject go = objects[j][k]; + if (go != null && go.getId() == object.getId()) { + ObjectBuilder.replace(go, go.transform(hotspot.getHotspot().getObjectId())); + } + } + } + return; + case LINKED: + //TODO + return; + } + } + } + } + + /** + * Builds a room. + * @param player The player. + * @param room The room to build. + */ + public static void buildRoom(Player player, Room room, int z, int x, int y) { + SystemLogger.logErr("Building direction = " + room.getRotation().name()); + if(room.getRotation() != Direction.NORTH){ + room.setRotation(Direction.NORTH); + player.getDialogueInterpreter().sendDialogue("Room rotation is currently disabled."); + } + player.getHouseManager().getRooms()[z][x][y] = room; + player.getPacketDispatch().sendMessage("Building room " + room.getProperties() + "."); + player.getHouseManager().reload(player, true); + } + + /** + * Checks of a room exists + * @param player the player + * @param door the door hotspot the player is trying to build at + * @return true if the room is built already + */ + public static boolean roomExists(Player player, GameObject door) { + int[] location = getRoomPosition(door); + return player.getHouseManager().getRooms()[player.getLocation().getZ()][location[0]][location[1]] != null; + } + + /** + * Gets the room offset. + * @param door The door. + * @return The room offset [x, y]. + */ + public static int[] getRoomPosition(GameObject door) { + Location l = door.getLocation(); + switch (door.getRotation()) { + case 0: //West + return new int[] { (l.getLocalX() >> 3) - 1, l.getLocalY() >> 3 }; + case 1: //North + return new int[] { l.getLocalX() >> 3, (l.getLocalY() >> 3) + 1}; + case 2: //East + return new int[] { (l.getLocalX() >> 3) + 1, l.getLocalY() >> 3 }; + case 3: //South + return new int[] { l.getLocalX() >> 3, (l.getLocalY() >> 3) - 1}; + } + return null; + } + + /** + * Gets the available rotations of the room to build. + * @param exits The exits of the room. + * @param door The door hotspot used. + * @param roomX The room x-coordinate. + * @param roomY The room y-coordinate. + * @return The available rotations for the room [NORTH, EAST, SOUTH, WEST]. + */ + public static Direction[] getAvailableRotations(Player player, boolean[] exits, GameObject door, int roomX, int roomY) { + Direction[] directions = new Direction[4]; + //Exits go to: (0=east, 1=south, 2=west, 3=north) + boolean[] exit = Arrays.copyOf(exits, exits.length); + //Door goes to: (0=west, 1=north, 2=east, 3=south) + int[] info = getExitRequirements(player, door.getLocation().getZ(), roomX, roomY); + for (int i = 0; i < 4; i++) { + boolean success = true; + for (int j = 0; j < 4; j++) { + if (info[j] == 1 && !exit[j]) { + success = false; + break; + } + if (info[j] == -1 && exit[j]) { + success = false; + break; + } + } + if (success) { + directions[i] = Direction.NORTH; + } + System.out.println(i + ": " + Arrays.toString(exit) + " - " + Arrays.toString(info)); + boolean b = exit[0]; + for (int j = 0; j < exit.length - 1; j++) { + exit[j] = exit[j + 1]; + } + exit[exit.length - 1] = b; + } + Direction dir = directions[0]; + directions[0] = directions[2]; + directions[2] = dir; + dir = directions[1]; + directions[1] = directions[3]; + directions[3] = dir; + return directions; + } + + /** + * Gets the exit requirements for the given room. + * @param roomX The room x-coordinate. + * @param roomY The room y-coordinate. + * @return The disabled exit indexes. + */ + private static int[] getExitRequirements(Player player, int z, int roomX, int roomY) { + //1 2 3 0 + //0=east, 1=south, 2=west, 3=north). + int[] exits = new int[4]; + if (roomX == 0) { + exits[2] = -1; + } + else if (player.getHouseManager().hasExit(z, roomX - 1, roomY, Direction.EAST)) { + exits[2] = 1; + } + else if (player.getHouseManager().getRooms()[z][roomX - 1][roomY] != null) { + exits[2] = -1; + } + if (roomY == 7) { + exits[1] = -1; + } + else if (player.getHouseManager().hasExit(z, roomX, roomY + 1, Direction.SOUTH)) { + exits[1] = 1; + } + else if (player.getHouseManager().getRooms()[z][roomX][roomY + 1] != null) { + exits[1] = -1; + } + if (roomX == 7) { + exits[0] = -1; + } + else if (player.getHouseManager().hasExit(z, roomX + 1, roomY, Direction.WEST)) { + exits[0] = 1; + } + else if (player.getHouseManager().getRooms()[z][roomX + 1][roomY] != null) { + exits[0] = -1; + } + if (roomY == 0) { + exits[3] = -1; + } + else if (player.getHouseManager().hasExit(z, roomX, roomY - 1, Direction.NORTH)) { + exits[3] = 1; + } + else if (player.getHouseManager().getRooms()[z][roomX][roomY - 1] != null) { + exits[3] = -1; + } + return exits; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/RoomProperties.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/RoomProperties.java new file mode 100644 index 000000000..cd6541992 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/RoomProperties.java @@ -0,0 +1,1027 @@ +package core.game.node.entity.skill.construction; + + +import core.game.node.object.GameObject; +import core.game.world.map.Region; +import core.game.world.map.RegionChunk; +import core.game.world.map.RegionManager; + +/** + * Represents the room properties. + * @author Emperor + * >ORDINAL BOUND< + */ +public enum RoomProperties { + + /** + * The parlour. + */ + PARLOUR(1000, 1, 0, 0, 7, Room.CHAMBER, new Hotspot(BuildHotspot.BOOKCASE, 0, 1), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.CURTAINS, 2, 0), + new Hotspot(BuildHotspot.CURTAINS, 0, 2), + new Hotspot(BuildHotspot.CURTAINS, 0, 5), + new Hotspot(BuildHotspot.CURTAINS, 2, 7), + new Hotspot(BuildHotspot.CURTAINS, 5, 0), + new Hotspot(BuildHotspot.CURTAINS, 5, 7), + new Hotspot(BuildHotspot.CURTAINS, 7, 2), + new Hotspot(BuildHotspot.CURTAINS, 7, 5), + new Hotspot(BuildHotspot.RUG, 2, 2), + new Hotspot(BuildHotspot.RUG2, 2, 3), + new Hotspot(BuildHotspot.RUG2, 2, 4), + new Hotspot(BuildHotspot.RUG, 2, 5), + new Hotspot(BuildHotspot.RUG2, 3, 2), + new Hotspot(BuildHotspot.RUG3, 3, 3), + new Hotspot(BuildHotspot.RUG3, 3, 4), + new Hotspot(BuildHotspot.RUG2, 3, 5), + new Hotspot(BuildHotspot.RUG2, 4, 2), + new Hotspot(BuildHotspot.RUG3, 4, 3), + new Hotspot(BuildHotspot.RUG3, 4, 4), + new Hotspot(BuildHotspot.RUG2, 4, 5), + new Hotspot(BuildHotspot.RUG, 5, 2), + new Hotspot(BuildHotspot.RUG2, 5, 3), + new Hotspot(BuildHotspot.RUG2, 5, 4), + new Hotspot(BuildHotspot.RUG, 5, 5), + new Hotspot(BuildHotspot.CHAIRS_1, 2, 4), + new Hotspot(BuildHotspot.FIREPLACE, 3, 7,4,7), + new Hotspot(BuildHotspot.CHAIRS_3, 4, 3), + new Hotspot(BuildHotspot.CHAIRS_2, 5, 4), + new Hotspot(BuildHotspot.BOOKCASE, 7, 1)), + + + /** + * The garden. (centrepiece has to be first!) + */ + GARDEN(1000, 1, 0, 0, 1, Room.LAND, new Hotspot(BuildHotspot.CENTREPIECE_1, 3, 3,4,4), + new Hotspot(BuildHotspot.BIG_PLANT_2, 0, 0,1,1), + new Hotspot(BuildHotspot.BIG_TREE_1, 1, 5,2,6), + new Hotspot(BuildHotspot.SMALL_PLANT_1, 3, 1), + new Hotspot(BuildHotspot.SMALL_PLANT_2, 4, 5), + new Hotspot(BuildHotspot.BIG_PLANT_1, 6, 1,7,0), + new Hotspot(BuildHotspot.TREE_1, 6, 6,7,7)), + + /** + * Woman's place. + */ + KITCHEN(5000, 5, 0, 2, 7, Room.CHAMBER, new Hotspot(BuildHotspot.CAT_BLANKET, 0, 0), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.BARRELS, 0, 6), + new Hotspot(BuildHotspot.KITCHEN_TABLE, 3, 3,4,4), + new Hotspot(BuildHotspot.STOVE, 3, 7), + new Hotspot(BuildHotspot.LARDER, 6, 0,7,1), + new Hotspot(BuildHotspot.SINK, 7, 3,7,4), + new Hotspot(BuildHotspot.SHELVES, 1, 7), + new Hotspot(BuildHotspot.SHELVES, 6, 7), + new Hotspot(BuildHotspot.SHELVES_2, 7, 6)), + + /** + * Dining room. + */ + DINING_ROOM(5000, 10, 0, 4, 7, Room.CHAMBER, new Hotspot(BuildHotspot.FIREPLACE_DINING, 3, 7,4,7), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.DINING_CURTAINS, 0, 2), + new Hotspot(BuildHotspot.DINING_CURTAINS, 0, 5), + new Hotspot(BuildHotspot.DINING_CURTAINS, 2, 0), + new Hotspot(BuildHotspot.DINING_CURTAINS, 5, 0), + new Hotspot(BuildHotspot.DINING_CURTAINS, 7, 2), + new Hotspot(BuildHotspot.DINING_CURTAINS, 7, 5), + new Hotspot(BuildHotspot.WALL_DECORATION, 2, 7), + new Hotspot(BuildHotspot.WALL_DECORATION, 5, 7), + new Hotspot(BuildHotspot.DINING_BENCH_2, 2, 5), + new Hotspot(BuildHotspot.DINING_BENCH_2, 3, 5), + new Hotspot(BuildHotspot.DINING_BENCH_2, 4, 5), + new Hotspot(BuildHotspot.DINING_BENCH_2, 5, 5), + new Hotspot(BuildHotspot.DINING_BENCH_1, 2, 2), + new Hotspot(BuildHotspot.DINING_BENCH_1, 3, 2), + new Hotspot(BuildHotspot.DINING_BENCH_1, 4, 2), + new Hotspot(BuildHotspot.DINING_BENCH_1, 5, 2), + new Hotspot(BuildHotspot.ROPE_BELL_PULL, 0, 0), + new Hotspot(BuildHotspot.DINING_TABLE, 2, 3,5,4)), + + /** + * Workshop. + */ + WORKSHOP(10000, 15, 0, 0, 5, Room.CHAMBER, new Hotspot(BuildHotspot.WORKBENCH, 3, 4,4,4), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.REPAIR, 7, 3,7,4), + new Hotspot(BuildHotspot.HERALDRY, 7, 6,7,7), + new Hotspot(BuildHotspot.CRAFTING, 0, 3,0,4), + new Hotspot(BuildHotspot.WORKBENCH, 3, 4), + new Hotspot(BuildHotspot.TOOL4, 7, 1), + new Hotspot(BuildHotspot.TOOL2, 6, 0), + new Hotspot(BuildHotspot.TOOL1, 1, 0), + new Hotspot(BuildHotspot.TOOL3, 0, 1), + new Hotspot(BuildHotspot.TOOL5, 0, 6)), + + /** + * Bedroom. + */ + BEDROOM(10000, 20, 0, 6, 7, Room.CHAMBER, new Hotspot(BuildHotspot.BED, 3, 7,4,6), + new Hotspot(BuildHotspot.FIREPLACE2, 7,4,7, 3), + new Hotspot(BuildHotspot.CLOCK, 7, 0), + new Hotspot(BuildHotspot.DRESSER, 0, 7,1,7), + new Hotspot(BuildHotspot.DRAWERS, 6, 7), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.BEDROOM_CURTAINS, 0, 2), + new Hotspot(BuildHotspot.BEDROOM_CURTAINS, 0, 5), + new Hotspot(BuildHotspot.BEDROOM_CURTAINS, 2, 0), + new Hotspot(BuildHotspot.BEDROOM_CURTAINS, 5, 0), + new Hotspot(BuildHotspot.BEDROOM_CURTAINS, 7, 2), + new Hotspot(BuildHotspot.BEDROOM_CURTAINS, 7, 5), + new Hotspot(BuildHotspot.BEDROOM_CURTAINS, 2, 7), + new Hotspot(BuildHotspot.BEDROOM_CURTAINS, 5, 7), + new Hotspot(BuildHotspot.BEDROOM_RUG, 2, 2), + new Hotspot(BuildHotspot.BEDROOM_RUG, 2, 3), + new Hotspot(BuildHotspot.BEDROOM_RUG, 3, 2), + new Hotspot(BuildHotspot.BEDROOM_RUG, 3, 3), + new Hotspot(BuildHotspot.BEDROOM_RUG, 4, 2), + new Hotspot(BuildHotspot.BEDROOM_RUG, 4, 3), + new Hotspot(BuildHotspot.BEDROOM_RUG, 5, 2), + new Hotspot(BuildHotspot.BEDROOM_RUG, 5, 3), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 2, 1), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 3, 1), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 4, 1), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 5, 1), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 2, 4), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 3, 4), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 4, 4), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 5, 4), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 6, 2), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 6, 3), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 1, 2), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 1, 3), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 3, 2), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 3, 5), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 4, 5), + new Hotspot(BuildHotspot.BEDROOM_RUG2, 4, 2), + new Hotspot(BuildHotspot.BEDROOM_RUG3, 1, 1), + new Hotspot(BuildHotspot.BEDROOM_RUG3, 1, 4), + new Hotspot(BuildHotspot.BEDROOM_RUG3, 6, 1), + new Hotspot(BuildHotspot.BEDROOM_RUG3, 6, 4)), + + /** + * Skill hall room. + */ + SKILL_HALL(15000, 25, 0, 1, 6, Room.CHAMBER, new Hotspot(BuildHotspot.STAIRWAYS, 3, 3,4,4), + new Hotspot(BuildHotspot.ARMOUR_SPACE, 2, 3), + new Hotspot(BuildHotspot.ARMOUR_SPACE2, 5, 3), + new Hotspot(BuildHotspot.HEAD_TROPHY, 6, 7), + new Hotspot(BuildHotspot.RUNE_CASE, 0, 6), + new Hotspot(BuildHotspot.FISHING_TROPHY, 1, 7), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.HALL_RUG, 2, 2), + new Hotspot(BuildHotspot.HALL_RUG, 3, 2), + new Hotspot(BuildHotspot.HALL_RUG, 4, 2), + new Hotspot(BuildHotspot.HALL_RUG, 5, 2), + new Hotspot(BuildHotspot.HALL_RUG, 2, 3), + new Hotspot(BuildHotspot.HALL_RUG, 3, 3), + new Hotspot(BuildHotspot.HALL_RUG, 4, 3), + new Hotspot(BuildHotspot.HALL_RUG, 5, 3), + new Hotspot(BuildHotspot.HALL_RUG, 2, 4), + new Hotspot(BuildHotspot.HALL_RUG, 3, 4), + new Hotspot(BuildHotspot.HALL_RUG, 4, 4), + new Hotspot(BuildHotspot.HALL_RUG, 5, 4), + new Hotspot(BuildHotspot.HALL_RUG, 2, 5), + new Hotspot(BuildHotspot.HALL_RUG, 3, 5), + new Hotspot(BuildHotspot.HALL_RUG, 4, 5), + new Hotspot(BuildHotspot.HALL_RUG, 5, 5), + new Hotspot(BuildHotspot.HALL_RUG2, 1, 2), + new Hotspot(BuildHotspot.HALL_RUG2, 1, 3), + new Hotspot(BuildHotspot.HALL_RUG2, 1, 4), + new Hotspot(BuildHotspot.HALL_RUG2, 1, 5), + new Hotspot(BuildHotspot.HALL_RUG2, 6, 2), + new Hotspot(BuildHotspot.HALL_RUG2, 6, 3), + new Hotspot(BuildHotspot.HALL_RUG2, 6, 4), + new Hotspot(BuildHotspot.HALL_RUG2, 6, 5), + new Hotspot(BuildHotspot.HALL_RUG2, 2, 1), + new Hotspot(BuildHotspot.HALL_RUG2, 3, 1), + new Hotspot(BuildHotspot.HALL_RUG2, 4, 1), + new Hotspot(BuildHotspot.HALL_RUG2, 5, 1), + new Hotspot(BuildHotspot.HALL_RUG2, 2, 6), + new Hotspot(BuildHotspot.HALL_RUG2, 3, 6), + new Hotspot(BuildHotspot.HALL_RUG2, 4, 6), + new Hotspot(BuildHotspot.HALL_RUG2, 5, 6), + new Hotspot(BuildHotspot.HALL_RUG3, 1, 1), + new Hotspot(BuildHotspot.HALL_RUG3, 1, 6), + new Hotspot(BuildHotspot.HALL_RUG3, 6, 1), + new Hotspot(BuildHotspot.HALL_RUG3, 6, 6)), + + /** + * Games room. + */ + GAMES_ROOM(25000, 30, 0, 5, 4, Room.CHAMBER, + new Hotspot(BuildHotspot.RANGING_GAME, 1, 0), + new Hotspot(BuildHotspot.ATTACK_STONE, 2, 4), + new Hotspot(BuildHotspot.PRIZE_CHEST, 3, 7), + new Hotspot(BuildHotspot.ELEMENTAL_BALANCE, 5, 4), + new Hotspot(BuildHotspot.GAME_SPACE, 6, 0,7,1), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7)), + + /** + * Combat room. + */ + COMBAT_ROOM(25000, 32, 0, 3, 4, Room.CHAMBER, new Hotspot(BuildHotspot.STORAGE_SPACE, 3, 7), + new Hotspot(BuildHotspot.WALL_DECORATION2, 1, 7), + new Hotspot(BuildHotspot.WALL_DECORATION2, 6, 7), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.CR_CORNER, 6, 1), + new Hotspot(BuildHotspot.CR_CORNER2, 1, 1), + new Hotspot(BuildHotspot.CR_CORNER3, 1, 6), + new Hotspot(BuildHotspot.CR_CORNER4, 6, 6), + new Hotspot(BuildHotspot.CR_RING, 2, 1), + new Hotspot(BuildHotspot.CR_RING, 3, 1), + new Hotspot(BuildHotspot.CR_RING, 4, 1), + new Hotspot(BuildHotspot.CR_RING2, 5, 1), + new Hotspot(BuildHotspot.CR_RING, 1, 2), + new Hotspot(BuildHotspot.CR_RING, 1, 3), + new Hotspot(BuildHotspot.CR_RING, 1, 4), + new Hotspot(BuildHotspot.CR_RING3, 1, 5), + new Hotspot(BuildHotspot.CR_RING3, 2, 6), + new Hotspot(BuildHotspot.CR_RING4, 3, 6), + new Hotspot(BuildHotspot.CR_RING4, 4, 6), + new Hotspot(BuildHotspot.CR_RING4, 5, 6), + new Hotspot(BuildHotspot.CR_RING4, 6, 5), + new Hotspot(BuildHotspot.CR_RING, 6, 4), + new Hotspot(BuildHotspot.CR_RING, 6, 3), + new Hotspot(BuildHotspot.CR_RING2, 6, 2), + new Hotspot(BuildHotspot.CR_FLOOR7, 2, 2), + new Hotspot(BuildHotspot.CR_FLOOR4, 2, 3), + new Hotspot(BuildHotspot.CR_FLOOR4, 2, 4), + new Hotspot(BuildHotspot.CR_FLOOR3, 2, 5), + new Hotspot(BuildHotspot.CR_FLOOR6, 3, 2), + new Hotspot(BuildHotspot.CR_FLOOR5, 3, 3), + new Hotspot(BuildHotspot.CR_FLOOR5, 3, 4), + new Hotspot(BuildHotspot.CR_FLOOR, 3, 5), + new Hotspot(BuildHotspot.CR_FLOOR6, 4, 2), + new Hotspot(BuildHotspot.CR_FLOOR5, 4, 3), + new Hotspot(BuildHotspot.CR_FLOOR5, 4, 4), + new Hotspot(BuildHotspot.CR_FLOOR, 4, 5), + new Hotspot(BuildHotspot.CR_FLOOR8, 5, 2), + new Hotspot(BuildHotspot.CR_FLOOR4, 5, 3), + new Hotspot(BuildHotspot.CR_FLOOR4, 5, 4), + new Hotspot(BuildHotspot.CR_FLOOR2, 5, 5), + new Hotspot(BuildHotspot.CR_INVISIBLE_WALL2, 2, 4), + new Hotspot(BuildHotspot.CR_INVISIBLE_WALL, 3, 5), + new Hotspot(BuildHotspot.CR_INVISIBLE_WALL, 5, 3), + new Hotspot(BuildHotspot.CR_INVISIBLE_WALL, 4, 2)), + /** + * Quest trophy hall. + */ + QUEST_HALL(25000, 35, 0, 5, 6, Room.CHAMBER, new Hotspot(BuildHotspot.QUEST_STAIRWAYS, 3, 3,4,4), + new Hotspot(BuildHotspot.MAP, 7, 1), + new Hotspot(BuildHotspot.SWORD, 7, 6), + new Hotspot(BuildHotspot.LANDSCAPE, 6, 7), + new Hotspot(BuildHotspot.PORTRAIT, 1, 7), + new Hotspot(BuildHotspot.GUILD_TROPHY, 0, 6), + new Hotspot(BuildHotspot.BOOKCASE2, 0, 1), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.Q_HALL_RUG, 2, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG, 3, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG, 4, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG, 5, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG, 2, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG, 3, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG, 4, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG, 5, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG, 2, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG, 3, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG, 4, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG, 5, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG, 2, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG, 3, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG, 4, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG, 5, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 1, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 1, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 1, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 1, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 6, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 6, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 6, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 6, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 2, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 3, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 4, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 5, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 2, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 3, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 4, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 5, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG3, 1, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG3, 1, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG3, 6, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG3, 6, 6)), + + /** + * Study. + */ +/* Menagerie(30000, 37, 0, 7, 2, Room.LAND, + new Hotspot(BuildHotspot.PET_HOUSE, 1, 1), + new Hotspot(BuildHotspot.PET_FEEDER, 5, 1), + new Hotspot(BuildHotspot.OBELISK, 5, 5), + new Hotspot(BuildHotspot.HABITAT_2, 1, 5), + new Hotspot(BuildHotspot.HABITAT_1, 6, 6)),*/ + + /** + * Study. + */ + STUDY_ROOM(50000, 40, 0, 4, 5, Room.CHAMBER, new Hotspot(BuildHotspot.GLOBE, 1, 4,3,6), + new Hotspot(BuildHotspot.LECTERN, 2, 2), + new Hotspot(BuildHotspot.CRYSTAL_BALL, 5, 4), + new Hotspot(BuildHotspot.BOOKCASE3, 4, 7,3,7), + new Hotspot(BuildHotspot.BOOKCASE3, 3, 7,4,7), + new Hotspot(BuildHotspot.WALL_CHART, 1, 7), + new Hotspot(BuildHotspot.WALL_CHART, 6, 7), + new Hotspot(BuildHotspot.WALL_CHART, 7, 1), + new Hotspot(BuildHotspot.WALL_CHART, 0, 1), + new Hotspot(BuildHotspot.TELESCOPE, 5, 7), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7)), + + /** + * Costume room. + */ + COSTUME_ROOM(50000, 42, 0, 6, 1, Room.CHAMBER, new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.TREASURE_CHEST, 0, 3,0,4), + new Hotspot(BuildHotspot.ARMOUR_CASE, 2, 7), + new Hotspot(BuildHotspot.MAGIC_WARDROBE, 3, 7,5,7), + new Hotspot(BuildHotspot.CAPE_RACK, 6, 6), + new Hotspot(BuildHotspot.TOY_BOX, 7, 3,7,4), + new Hotspot(BuildHotspot.COSTUME_BOX, 3, 4,4,3)), + + /** + * Chapel room. + */ + CHAPEL(50000, 45, 0, 2, 5, Room.CHAMBER, + new Hotspot(BuildHotspot.ALTAR, 3, 5,4,5), + new Hotspot(BuildHotspot.STATUE, 7, 0), + new Hotspot(BuildHotspot.STATUE, 0, 0), + new Hotspot(BuildHotspot.ICON, 3,7,4, 7), + new Hotspot(BuildHotspot.MUSICAL, 7,4,7,3), + new Hotspot(BuildHotspot.BURNERS, 1, 5), + new Hotspot(BuildHotspot.BURNERS, 6, 5), + new Hotspot(BuildHotspot.CHAPEL_RUG, 3, 1), + new Hotspot(BuildHotspot.CHAPEL_RUG, 4, 1), + new Hotspot(BuildHotspot.CHAPEL_RUG, 3, 2), + new Hotspot(BuildHotspot.CHAPEL_RUG, 4, 2), + new Hotspot(BuildHotspot.CHAPEL_RUG, 3, 3), + new Hotspot(BuildHotspot.CHAPEL_RUG, 4, 3), + new Hotspot(BuildHotspot.CHAPEL_RUG2, 3, 0), + new Hotspot(BuildHotspot.CHAPEL_RUG2, 4, 0), + new Hotspot(BuildHotspot.CHAPEL_RUG2, 3, 4), + new Hotspot(BuildHotspot.CHAPEL_RUG2, 4, 4), + new Hotspot(BuildHotspot.CHAPEL_WINDOW, 0, 2), + new Hotspot(BuildHotspot.CHAPEL_WINDOW, 0, 5), + new Hotspot(BuildHotspot.CHAPEL_WINDOW, 2, 7), + new Hotspot(BuildHotspot.CHAPEL_WINDOW, 5, 7), + new Hotspot(BuildHotspot.CHAPEL_WINDOW, 7, 5), + new Hotspot(BuildHotspot.CHAPEL_WINDOW, 7, 2)), + + /** + * Portal chamber. + */ + PORTAL_CHAMBER(100000, 50, 0, 1, 4, Room.CHAMBER, new Hotspot(BuildHotspot.TELEPORT_FOCUS, 3, 3,4,4), + new Hotspot(BuildHotspot.PORTAL1, 0, 3,0,4), + new Hotspot(BuildHotspot.PORTAL2, 3, 7,4,7), + new Hotspot(BuildHotspot.PORTAL3, 7, 3,7,4), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7)), + + /** + * The formal garden. + * Centrepiece should be first! + */ + FORMAL_GARDEN(75000, 55, 0, 2, 1, Room.LAND, new Hotspot(BuildHotspot.CENTREPIECE_2, 3, 3,4,4), + new Hotspot(BuildHotspot.FENCING, 0, 0), + new Hotspot(BuildHotspot.FENCING, 1, 0), + new Hotspot(BuildHotspot.FENCING, 2, 0), + new Hotspot(BuildHotspot.FENCING, 5, 0), + new Hotspot(BuildHotspot.FENCING, 6, 0), + new Hotspot(BuildHotspot.FENCING, 7, 0), + new Hotspot(BuildHotspot.FENCING, 7, 1), + new Hotspot(BuildHotspot.FENCING, 7, 2), + new Hotspot(BuildHotspot.FENCING, 7, 5), + new Hotspot(BuildHotspot.FENCING, 7, 6), + new Hotspot(BuildHotspot.FENCING, 7, 7), + new Hotspot(BuildHotspot.FENCING, 6, 7), + new Hotspot(BuildHotspot.FENCING, 5, 7), + new Hotspot(BuildHotspot.FENCING, 2, 7), + new Hotspot(BuildHotspot.FENCING, 1, 7), + new Hotspot(BuildHotspot.FENCING, 0, 7), + new Hotspot(BuildHotspot.FENCING, 0, 6), + new Hotspot(BuildHotspot.FENCING, 0, 5), + new Hotspot(BuildHotspot.FENCING, 0, 2), + new Hotspot(BuildHotspot.FENCING, 0, 1), + new Hotspot(BuildHotspot.HEDGE3, 0, 0), + new Hotspot(BuildHotspot.HEDGE2, 1, 0), + new Hotspot(BuildHotspot.HEDGE1, 2, 0), + new Hotspot(BuildHotspot.HEDGE1, 5, 0), + new Hotspot(BuildHotspot.HEDGE2, 6, 0), + new Hotspot(BuildHotspot.HEDGE3, 7, 0), + new Hotspot(BuildHotspot.HEDGE2, 7, 1), + new Hotspot(BuildHotspot.HEDGE1, 7, 2), + new Hotspot(BuildHotspot.HEDGE1, 7, 5), + new Hotspot(BuildHotspot.HEDGE2, 7, 6), + new Hotspot(BuildHotspot.HEDGE3, 7, 7), + new Hotspot(BuildHotspot.HEDGE2, 6, 7), + new Hotspot(BuildHotspot.HEDGE1, 5, 7), + new Hotspot(BuildHotspot.HEDGE1, 2, 7), + new Hotspot(BuildHotspot.HEDGE2, 1, 7), + new Hotspot(BuildHotspot.HEDGE3, 0, 7), + new Hotspot(BuildHotspot.HEDGE2, 0, 6), + new Hotspot(BuildHotspot.HEDGE1, 0, 5), + new Hotspot(BuildHotspot.HEDGE1, 0, 2), + new Hotspot(BuildHotspot.HEDGE2, 0, 1), + new Hotspot(BuildHotspot.SMALL_PLANT2, 2, 1), + new Hotspot(BuildHotspot.SMALL_PLANT2, 1, 2), + new Hotspot(BuildHotspot.SMALL_PLANT2, 5, 6), + new Hotspot(BuildHotspot.SMALL_PLANT2, 6, 5), + new Hotspot(BuildHotspot.SMALL_PLANT2, 2, 6), + new Hotspot(BuildHotspot.SMALL_PLANT2, 1, 5), + new Hotspot(BuildHotspot.BIG_PLANT2, 1, 1), + new Hotspot(BuildHotspot.BIG_PLANT2, 6, 6), + new Hotspot(BuildHotspot.BIG_PLANT2, 1, 6), + new Hotspot(BuildHotspot.SMALL_PLANT1, 5, 1), + new Hotspot(BuildHotspot.SMALL_PLANT1, 6, 2), + new Hotspot(BuildHotspot.SMALL_PLANT1, 1, 5), + new Hotspot(BuildHotspot.SMALL_PLANT1, 2, 1), + new Hotspot(BuildHotspot.SMALL_PLANT1, 2, 6), + new Hotspot(BuildHotspot.BIG_PLANT1, 1, 6), + new Hotspot(BuildHotspot.BIG_PLANT1, 1, 1), + new Hotspot(BuildHotspot.BIG_PLANT1, 6, 1)), + + /** + * Throne room. + */ + THRONE_ROOM(150000, 60, 0, 6, 5, Room.CHAMBER, + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.THRONE, 3, 6), + new Hotspot(BuildHotspot.THRONE, 4, 6), + new Hotspot(BuildHotspot.LEVER, 6, 6), + new Hotspot(BuildHotspot.FLOOR, 3, 3), + new Hotspot(BuildHotspot.FLOOR, 3, 4), + new Hotspot(BuildHotspot.FLOOR, 4, 4), + new Hotspot(BuildHotspot.FLOOR, 4, 3), + new Hotspot(BuildHotspot.TRAPDOOR, 1, 6), + new Hotspot(BuildHotspot.SEATING1, 0, 0), + new Hotspot(BuildHotspot.SEATING1, 0, 1), + new Hotspot(BuildHotspot.SEATING1, 0, 2), + new Hotspot(BuildHotspot.SEATING1, 0, 3), + new Hotspot(BuildHotspot.SEATING1, 0, 4), + new Hotspot(BuildHotspot.SEATING1, 0, 5), + new Hotspot(BuildHotspot.SEATING2, 7, 0), + new Hotspot(BuildHotspot.SEATING2, 7, 1), + new Hotspot(BuildHotspot.SEATING2, 7, 2), + new Hotspot(BuildHotspot.SEATING2, 7, 3), + new Hotspot(BuildHotspot.SEATING2, 7, 4), + new Hotspot(BuildHotspot.SEATING2, 7, 5), + new Hotspot(BuildHotspot.DECORATION, 3, 7), + new Hotspot(BuildHotspot.DECORATION, 4, 7)), + + /** + * Oubliette (dungeon). + */ + OUBILETTE(150000, 65, 0, 6, 3, Room.DUNGEON, + new Hotspot(BuildHotspot.FLOOR_CORNER, 2, 2), + new Hotspot(BuildHotspot.FLOOR_CORNER, 5, 2), + new Hotspot(BuildHotspot.FLOOR_CORNER, 5, 5), + new Hotspot(BuildHotspot.FLOOR_CORNER, 2, 5), + new Hotspot(BuildHotspot.FLOOR_SIDE, 3, 2), + new Hotspot(BuildHotspot.FLOOR_SIDE, 4, 2), + new Hotspot(BuildHotspot.FLOOR_SIDE, 2, 3), + new Hotspot(BuildHotspot.FLOOR_SIDE, 2, 4), + new Hotspot(BuildHotspot.FLOOR_SIDE, 5, 3), + new Hotspot(BuildHotspot.FLOOR_SIDE, 5, 4), + new Hotspot(BuildHotspot.FLOOR_SIDE, 3, 5), + new Hotspot(BuildHotspot.FLOOR_SIDE, 4, 5), + new Hotspot(BuildHotspot.FLOOR_MID, 3, 3), + new Hotspot(BuildHotspot.FLOOR_MID, 3, 4), + new Hotspot(BuildHotspot.FLOOR_MID, 4, 3), + new Hotspot(BuildHotspot.FLOOR_MID, 4, 4), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 2, 2), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 5, 2), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 5, 5), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 2, 5), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 3, 2), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 4, 2), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 2, 3), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 2, 4), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 5, 3), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 5, 4), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 3, 5), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 4, 5), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 3, 3), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 3, 4), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR_1, 4, 3), + new Hotspot(BuildHotspot.OUBLIETTE_FLOOR, 4, 4), + new Hotspot(BuildHotspot.GUARD, 0, 0), + new Hotspot(BuildHotspot.DUNGEON_DECO, 0, 2), + new Hotspot(BuildHotspot.DUNGEON_DECO, 2, 7), + new Hotspot(BuildHotspot.DUNGEON_DECO, 7, 5), + new Hotspot(BuildHotspot.DUNGEON_DECO, 5, 0), + new Hotspot(BuildHotspot.OUBLIETTE_LIGHT, 2, 0), + new Hotspot(BuildHotspot.OUBLIETTE_LIGHT, 7, 2), + new Hotspot(BuildHotspot.OUBLIETTE_LIGHT, 5, 7), + new Hotspot(BuildHotspot.OUBLIETTE_LIGHT, 0, 5), + new Hotspot(BuildHotspot.LADDER, 1, 6), + new Hotspot(BuildHotspot.PRISON, 2, 2), + new Hotspot(BuildHotspot.PRISON, 2, 5), + new Hotspot(BuildHotspot.PRISON, 2, 3), + new Hotspot(BuildHotspot.PRISON, 2, 4), + new Hotspot(BuildHotspot.PRISON, 5, 2), + new Hotspot(BuildHotspot.PRISON, 5, 5), + new Hotspot(BuildHotspot.PRISON, 3, 2), + new Hotspot(BuildHotspot.PRISON, 4, 2), + new Hotspot(BuildHotspot.PRISON, 5, 3), + new Hotspot(BuildHotspot.PRISON, 5, 4), + new Hotspot(BuildHotspot.PRISON, 4, 5), + new Hotspot(BuildHotspot.PRISON_DOOR, 3, 5)), + /** + * Dungeon corridor. + */ + DUNGEON_CORRIDOR(7500, 70, 0, 4, 3, Room.DUNGEON, + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT, 3, 1), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT, 4, 1), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT2, 3, 6), + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT2, 4, 6), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 3, 1), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 4, 1), + new Hotspot(BuildHotspot.DUNGEON_TRAP2, 3, 2), + new Hotspot(BuildHotspot.DUNGEON_TRAP2, 4, 2), + new Hotspot(BuildHotspot.DUNGEON_GUARD, 3, 3), + new Hotspot(BuildHotspot.DUNGEON_DECO, 4, 3), + new Hotspot(BuildHotspot.DUNGEON_DECO, 3, 4), + new Hotspot(BuildHotspot.DUNGEON_TRAP, 3, 5), + new Hotspot(BuildHotspot.DUNGEON_TRAP, 4, 5), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 3, 6), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 4, 6)), + + /** + * Dungeon junction. + */ + DUNGEON_JUNCTION(7500, 70, 0, 0, 3, Room.DUNGEON, + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT, 3, 1), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT, 4, 1), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT2, 3, 6), + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT2, 4, 6), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 3, 1), + new Hotspot(BuildHotspot.DUNGEON_TRAP2, 3, 2), + new Hotspot(BuildHotspot.DUNGEON_TRAP2, 4, 2), + new Hotspot(BuildHotspot.DUNGEON_GUARD, 3, 3), + new Hotspot(BuildHotspot.DUNGEON_TRAP, 3, 5), + new Hotspot(BuildHotspot.DUNGEON_TRAP, 4, 5), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 4, 6), + new Hotspot(BuildHotspot.DUNGEON_DECO, 1, 3), + new Hotspot(BuildHotspot.DUNGEON_DECO, 6, 4), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 1, 4), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 6, 3)), + + /** + * Dungeon stairs. + */ + DUNGEON_STAIRS(7500, 70, 0, 2, 3, Room.DUNGEON, + new Hotspot(BuildHotspot.STAIRWAYS_DUNGEON, 3, 3), + new Hotspot(BuildHotspot.HALL_RUG, 3, 3), + new Hotspot(BuildHotspot.HALL_RUG, 4, 3), + new Hotspot(BuildHotspot.HALL_RUG, 3, 4), + new Hotspot(BuildHotspot.HALL_RUG, 4, 4), + new Hotspot(BuildHotspot.HALL_RUG2, 2, 3), + new Hotspot(BuildHotspot.HALL_RUG2, 2, 4), + new Hotspot(BuildHotspot.HALL_RUG2, 5, 3), + new Hotspot(BuildHotspot.HALL_RUG2, 5, 4), + new Hotspot(BuildHotspot.HALL_RUG2, 3, 2), + new Hotspot(BuildHotspot.HALL_RUG2, 4, 2), + new Hotspot(BuildHotspot.HALL_RUG2, 3, 5), + new Hotspot(BuildHotspot.HALL_RUG2, 4, 5), + new Hotspot(BuildHotspot.HALL_RUG3, 2, 2), + new Hotspot(BuildHotspot.HALL_RUG3, 2, 5), + new Hotspot(BuildHotspot.HALL_RUG3, 5, 2), + new Hotspot(BuildHotspot.HALL_RUG3, 5, 5), + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT, 3, 1), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT, 4, 1), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT2, 3, 6), + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT2, 4, 6), + new Hotspot(BuildHotspot.DUNGEON_LIGHT2, 2, 1), + new Hotspot(BuildHotspot.DUNGEON_LIGHT2, 5, 1), + new Hotspot(BuildHotspot.DUNGEON_LIGHT2, 2, 6), + new Hotspot(BuildHotspot.DUNGEON_LIGHT2, 5, 6), + new Hotspot(BuildHotspot.DUNGEON_GUARD3, 1, 1), + new Hotspot(BuildHotspot.DUNGEON_GUARD2, 5, 5), + new Hotspot(BuildHotspot.DUNGEON_DECO, 6, 1), + new Hotspot(BuildHotspot.DUNGEON_DECO, 1, 6)), + + DUNGEON_PIT(10000, 70, 0, 5, 2, Room.DUNGEON, + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT3, 3, 1), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT3, 4, 1), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT3, 3, 6), + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT3, 4, 6), + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT3, 1, 4), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT3, 1, 3), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT3, 6, 4), + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT3, 6, 3), + new Hotspot(BuildHotspot.DUNGEON_DECO, 5, 1), + new Hotspot(BuildHotspot.DUNGEON_DECO, 1, 6), + new Hotspot(BuildHotspot.DUNGEON_LIGHT2, 2, 1), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 2, 6), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 5, 1), + new Hotspot(BuildHotspot.DUNGEON_LIGHT2, 5, 6), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 1, 2), + new Hotspot(BuildHotspot.DUNGEON_LIGHT2, 1, 5), + new Hotspot(BuildHotspot.DUNGEON_LIGHT2, 6, 2), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 6, 5), + new Hotspot(BuildHotspot.DUNGEON_PIT_GUARD, 3, 3)), + + /** + * Treasure room. + */ + TREASURE_ROOM(250000, 75, 0, 7, 4, Room.DUNGEON, + new Hotspot(BuildHotspot.DUNGEON_DOOR_RIGHT2, 3, 1), + new Hotspot(BuildHotspot.DUNGEON_DOOR_LEFT2, 4, 1), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 2, 1), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 5, 1), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 1, 5), + new Hotspot(BuildHotspot.DUNGEON_LIGHT, 6, 5), + new Hotspot(BuildHotspot.DUNGEON_DECO, 1, 2), + new Hotspot(BuildHotspot.DUNGEON_DECO, 6, 2), + new Hotspot(BuildHotspot.MONSTER, 3, 3), + new Hotspot(BuildHotspot.TREASURE_CHEST1, 2, 6), + new Hotspot(BuildHotspot.WALL_DECORATION1, 3, 6), + new Hotspot(BuildHotspot.WALL_DECORATION1, 4, 6)), + + /** + * The roof top with 2 exits. + */ + ROOF_2_EXIT(0, 0, 0, 1, 2, Room.ROOF), + + /** + * The roof top with 3 exits. + */ + ROOF_3_EXIT(0, 0, 0, 3, 2, Room.ROOF), + + /** + * The roof top with 4 exits. + */ + ROOF_4_EXIT(0, 0, 0, 5, 2, Room.ROOF), + + /** + * Skill hall (upstairs) room. + */ + SKILL_HALL_2(0, 25, 0, 3, 6, Room.CHAMBER, new Hotspot(BuildHotspot.STAIRS_DOWN, 3, 3), + new Hotspot(BuildHotspot.ARMOUR_SPACE, 2, 3), + new Hotspot(BuildHotspot.ARMOUR_SPACE2, 5, 3), + new Hotspot(BuildHotspot.HEAD_TROPHY, 6, 7), + new Hotspot(BuildHotspot.RUNE_CASE, 0, 6), + new Hotspot(BuildHotspot.FISHING_TROPHY, 1, 7), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.HALL_RUG, 2, 2), + new Hotspot(BuildHotspot.HALL_RUG, 3, 2), + new Hotspot(BuildHotspot.HALL_RUG, 4, 2), + new Hotspot(BuildHotspot.HALL_RUG, 5, 2), + new Hotspot(BuildHotspot.HALL_RUG, 2, 3), + new Hotspot(BuildHotspot.HALL_RUG, 3, 3), + new Hotspot(BuildHotspot.HALL_RUG, 4, 3), + new Hotspot(BuildHotspot.HALL_RUG, 5, 3), + new Hotspot(BuildHotspot.HALL_RUG, 2, 4), + new Hotspot(BuildHotspot.HALL_RUG, 3, 4), + new Hotspot(BuildHotspot.HALL_RUG, 4, 4), + new Hotspot(BuildHotspot.HALL_RUG, 5, 4), + new Hotspot(BuildHotspot.HALL_RUG, 2, 5), + new Hotspot(BuildHotspot.HALL_RUG, 3, 5), + new Hotspot(BuildHotspot.HALL_RUG, 4, 5), + new Hotspot(BuildHotspot.HALL_RUG, 5, 5), + new Hotspot(BuildHotspot.HALL_RUG2, 1, 2), + new Hotspot(BuildHotspot.HALL_RUG2, 1, 3), + new Hotspot(BuildHotspot.HALL_RUG2, 1, 4), + new Hotspot(BuildHotspot.HALL_RUG2, 1, 5), + new Hotspot(BuildHotspot.HALL_RUG2, 6, 2), + new Hotspot(BuildHotspot.HALL_RUG2, 6, 3), + new Hotspot(BuildHotspot.HALL_RUG2, 6, 4), + new Hotspot(BuildHotspot.HALL_RUG2, 6, 5), + new Hotspot(BuildHotspot.HALL_RUG2, 2, 1), + new Hotspot(BuildHotspot.HALL_RUG2, 3, 1), + new Hotspot(BuildHotspot.HALL_RUG2, 4, 1), + new Hotspot(BuildHotspot.HALL_RUG2, 5, 1), + new Hotspot(BuildHotspot.HALL_RUG2, 2, 6), + new Hotspot(BuildHotspot.HALL_RUG2, 3, 6), + new Hotspot(BuildHotspot.HALL_RUG2, 4, 6), + new Hotspot(BuildHotspot.HALL_RUG2, 5, 6), + new Hotspot(BuildHotspot.HALL_RUG3, 1, 1), + new Hotspot(BuildHotspot.HALL_RUG3, 1, 6), + new Hotspot(BuildHotspot.HALL_RUG3, 6, 1), + new Hotspot(BuildHotspot.HALL_RUG3, 6, 6)), + + /** + * Quest trophy hall (upstairs). + */ + QUEST_HALL_2(25000, 35, 0, 7, 6, Room.CHAMBER, new Hotspot(BuildHotspot.STAIRS_DOWN2, 3, 3), + new Hotspot(BuildHotspot.MAP, 7, 1), + new Hotspot(BuildHotspot.SWORD, 7, 6), + new Hotspot(BuildHotspot.LANDSCAPE, 6, 7), + new Hotspot(BuildHotspot.PORTRAIT, 1, 7), + new Hotspot(BuildHotspot.GUILD_TROPHY, 0, 6), + new Hotspot(BuildHotspot.BOOKCASE2, 0, 1), + new Hotspot(BuildHotspot.WINDOW, 0, 2), + new Hotspot(BuildHotspot.WINDOW, 0, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 0), + new Hotspot(BuildHotspot.WINDOW, 5, 0), + new Hotspot(BuildHotspot.WINDOW, 7, 2), + new Hotspot(BuildHotspot.WINDOW, 7, 5), + new Hotspot(BuildHotspot.WINDOW, 2, 7), + new Hotspot(BuildHotspot.WINDOW, 5, 7), + new Hotspot(BuildHotspot.Q_HALL_RUG, 2, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG, 3, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG, 4, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG, 5, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG, 2, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG, 3, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG, 4, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG, 5, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG, 2, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG, 3, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG, 4, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG, 5, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG, 2, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG, 3, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG, 4, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG, 5, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 1, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 1, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 1, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 1, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 6, 2), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 6, 3), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 6, 4), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 6, 5), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 2, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 3, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 4, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 5, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 2, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 3, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 4, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG2, 5, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG3, 1, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG3, 1, 6), + new Hotspot(BuildHotspot.Q_HALL_RUG3, 6, 1), + new Hotspot(BuildHotspot.Q_HALL_RUG3, 6, 6)), + ; + + /** + * The amount this room costs. + */ + private final int cost; + + /** + * The level required. + */ + private final int level; + + /** + * The chunk plane. + */ + private final int z; + + /** + * The chunk x-offset. + */ + private final int chunkX; + + /** + * The chunk y-offset. + */ + private final int chunkY; + + /** + * If doors should be placed. + */ + private final int configuration; + + /** + * The hotspots in this room. + */ + private final Hotspot[] hotspots; + + /** + * Constructs a new {@code RoomProperties} {@code Object}. + * @param cost The cost of building this room. + * @param level The construction level required. + * @param z The chunk plane. + * @param chunkX The chunk x-offset. + * @param chunkY The chunk y-offset. + * @param hotspots The hotspots. + */ + private RoomProperties(int cost, int level, int z, int chunkX, int chunkY, int configuration, Hotspot...hotspots) { + this.cost = cost; + this.level = level; + this.z = z; + this.chunkX = chunkX; + this.chunkY = chunkY; + this.configuration = configuration; + this.hotspots = hotspots; + } + + /** + * Gets the name of the room. + * @return The name. + */ + public String getName() { + return name().toLowerCase().replaceAll("_", " ").replaceAll("\\d",""); + } + + /** + * Gets the available exits for the room. + * @return The exits. + */ + public boolean[] getExits() { + Region region = RegionManager.forId(7503); + Region.load(region, true); + RegionChunk chunk = region.getPlanes()[0].getRegionChunk(chunkX, chunkY); + return new boolean[] { isExit(chunk, 7, 3), isExit(chunk, 3, 0), isExit(chunk, 0, 3), isExit(chunk, 3, 7) }; + } + + /** + * Checks if the object on the given chunk coordinates is a door. + * @return {@code True} if so. + */ + private boolean isExit(RegionChunk chunk, int x, int y) { + for (GameObject object : chunk.getObjects(x, y)) { + if (object != null && (object.getId() == 15313 || object.getId() == 15314 || object.getId() == 15317)) { + return true; + } + } + return false; + } + + /** + * Checks if the room is a chamber inside the house (not a garden or roof). + * @return {@code True} if so. + */ + public boolean isChamber() { + return !isLand() && !isRoof(); //&& !isDungeon(); + } + + /** + * Checks if this room is used for landscape (garden). + * @return {@code True} if so. + */ + public boolean isLand() { + return (configuration & Room.LAND) != 0; + } + + /** + * Checks if the room is used for roofs. + * @return {@code True} if so. + */ + public boolean isRoof() { + return (configuration & Room.ROOF) != 0; + } + + /** + * Checks if the room is used for dungeons. + * @return {@code True} if so. + */ + public boolean isDungeon() { + return (configuration & Room.DUNGEON) != 0; + } + + /** + * Gets the z. + * @return The z. + */ + public int getZ() { + return z; + } + + /** + * Gets the chunkX. + * @return The chunkX. + */ + public int getChunkX() { + return chunkX; + } + + /** + * Gets the chunkY. + * @return The chunkY. + */ + public int getChunkY() { + return chunkY; + } + + /** + * Gets the hotspots. + * @return The hotspots. + */ + public Hotspot[] getHotspots() { + return hotspots; + } + + /** + * Gets the cost. + * @return the cost + */ + public int getCost() { + return cost; + } + + /** + * Gets the level. + * @return the level + */ + public int getLevel() { + return level; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/Servant.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/Servant.java new file mode 100644 index 000000000..422765ce1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/Servant.java @@ -0,0 +1,150 @@ +package core.game.node.entity.skill.construction; + + +import core.game.node.entity.npc.NPC; +import core.game.node.item.Item; +import org.json.simple.JSONObject; + +import java.nio.ByteBuffer; + +/** + * Represents a player's servant. + * @author Emperor + * + */ +public final class Servant extends NPC { + + /** + * The servant type. + */ + private final ServantType type; + + /** + * The item the servant is carrying. + */ + private Item item; + + /** + * The amount this servant has been used. + */ + private int uses; + + /** + * If the servant is greeting players entering the house. + */ + private boolean greet; + + /** + * Constructs a new {@code Servant} {@code Object}. + * @param type The servant type. + */ + public Servant(ServantType type) { + super(type.getId()); + this.type = type; + } + + /** + * Saves the servant details. + * @param buffer The buffer to write on. + */ + public void save(ByteBuffer buffer) { + buffer.put((byte) type.ordinal()); + buffer.putShort((byte) uses); + if (item == null) { + buffer.putShort((short) -1); + } else { + buffer.putShort((short) item.getId()); + buffer.putInt(item.getAmount()); + } + buffer.put((byte) (greet ? 1 : 0)); + } + + /** + * Parses the servant from the buffer. + * @return The servant. + */ + + public static Servant parse(JSONObject data){ + int type = Integer.parseInt( data.get("type").toString()); + Servant servant = new Servant(ServantType.values()[type]); + servant.uses = Integer.parseInt( data.get("uses").toString()); + Object itemRaw = data.get("item"); + if(itemRaw != null){ + JSONObject item = (JSONObject) itemRaw; + servant.item = new Item(Integer.parseInt(item.get("id").toString()),Integer.parseInt(item.get("amount").toString())); + } + servant.greet = (boolean) data.get("greet"); + return servant; + } + + public static Servant parse(ByteBuffer buffer) { + int type = buffer.get(); + if (type == -1) { + return null; + } + Servant servant = new Servant(ServantType.values()[type]); + servant.uses = buffer.getShort() & 0xFFFF; + int itemId = buffer.getShort() & 0xFFFF; + if ((short) itemId != -1) { + servant.item = new Item(itemId, buffer.getInt()); + } + servant.greet = buffer.get() == 1; + return servant; + } + + /** + * Gets the item value. + * @return The item. + */ + public Item getItem() { + return item; + } + + /** + * Sets the item value. + * @param item The item to set. + */ + public void setItem(Item item) { + this.item = item; + } + + /** + * Gets the uses value. + * @return The uses. + */ + public int getUses() { + return uses; + } + + /** + * Sets the uses value. + * @param uses The uses to set. + */ + public void setUses(int uses) { + this.uses = uses; + } + + /** + * Gets the greet value. + * @return The greet. + */ + public boolean isGreet() { + return greet; + } + + /** + * Sets the greet value. + * @param greet The greet to set. + */ + public void setGreet(boolean greet) { + this.greet = greet; + } + + /** + * Gets the type value. + * @return The type. + */ + public ServantType getType() { + return type; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/ServantType.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/ServantType.java new file mode 100644 index 000000000..e709d2692 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/ServantType.java @@ -0,0 +1,123 @@ +package core.game.node.entity.skill.construction; + + +import core.game.node.item.Item; + +/** + * Represents a type of servant + * @author Splinter + * @version 1.1 + */ +public enum ServantType { + NONE(-1, -1, -1, -1, -1), + RICK(4235, 500, 6, 20, 60), + MAID(4237, 1000, 10, 25, 50, new Item(2003)), + COOK(4239, 3000, 16, 30, 17, new Item(2301), new Item(712)), + BUTLER(4241, 5000, 20, 40, 12, new Item(1897), new Item(712)), + DEMON_BUTLER(4243, 10000, 26, 50, 7, new Item(2011)) + ; + + /** + * The ID of the npc. + */ + private int npcId; + + /** + * How much this servant costs. + */ + private int cost; + + /** + * How much this servant is able to bring back. + */ + private int capacity; + + /** + * The level the player must have before recruiting this servant. + */ + private int level; + + /** + * How long it takes this servant to return from their duties. + */ + private int timer; + + /** + * The food items the servant can cook. + */ + private Item[] food; + + /** + * Constructor + */ + private ServantType(int npcId, int cost, int capacity, int level, int timer, Item... food) { + this.npcId = npcId; + this.cost = cost; + this.capacity = capacity; + this.level = level; + this.timer = timer; + this.food = food; + } + + /** + * Gets a servant for the NPC id + * @param id The NPC id. + * @return The servant type. + */ + public static ServantType forId(int id){ + for (ServantType s : ServantType.values()){ + if (s.getId() == id){ + return s; + } + } + return null; + } + + /** + * Gets the NPC's id + * @return + */ + public int getId(){ + return npcId; + } + + /** + * Gets the initial cost + * @return + */ + public int getCost(){ + return cost; + } + + /** + * Gets the NPC's capacity + * @return + */ + public int getCapacity(){ + return capacity; + } + + /** + * Gets the level + * @return + */ + public int getLevel(){ + return level; + } + + /** + * Gets the timer + * @return + */ + public int getTimer(){ + return timer; + } + + /** + * Gets the food the servant can cook + * @return + */ + public Item[] getFood(){ + return food; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/BeerBarrelPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/BeerBarrelPlugin.java new file mode 100644 index 000000000..72a462920 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/BeerBarrelPlugin.java @@ -0,0 +1,75 @@ +package core.game.node.entity.skill.construction.decoration; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Construction beer barrels. + * @author Splinter + */ +@Initializable +public class BeerBarrelPlugin extends UseWithHandler { + + /** + * The object ids + */ + private static final int[] OBJECTS = new int[] { + 13568, 13569, 13570, 13571, 13572, 13573 + }; + + /** + * Constructs a new {@Code BeerBarrelPlugin} {@Code Object} + */ + public BeerBarrelPlugin() { + super(1919); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : OBJECTS) { + addHandler(id, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + final GameObject object = (GameObject) event.getUsedWith(); + + if (player.getInventory().remove(new Item(1919))) { + player.animate(Animation.create(833)); + player.sendMessage("You fill up your glass."); + player.getInventory().add(new Item(getReward(object.getId()), 1)); + } + return true; + } + + /** + * Get the beer reward based on the interaced barrel. + * @return the item to give. + */ + public int getReward(int barrelId) { + switch (barrelId) { + case 13568: + return 1917; + case 13569: + return 5763; + case 13570: + return 1905; + case 13571: + return 1909; + case 13572: + return 1911; + case 13573: + return 5755; + } + return 1917; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/ChairBenchPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/ChairBenchPlugin.java new file mode 100644 index 000000000..fbf4656ae --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/ChairBenchPlugin.java @@ -0,0 +1,97 @@ +package core.game.node.entity.skill.construction.decoration; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.construction.Decoration; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles chair and bench options. + * @author Emperor + * + */ +@Initializable +public final class ChairBenchPlugin extends OptionHandler { + + /** + * The decorations that can be seated on. + */ + private static final Object[][] CHAIRS = { + {Decoration.CRUDE_CHAIR, 4073, 4103}, + {Decoration.WOODEN_CHAIR, 4075, 4103}, + {Decoration.ROCKING_CHAIR, 4079, 4103}, + {Decoration.OAK_CHAIR, 4081, 4103}, + {Decoration.OAK_ARMCHAIR, 4083, 4103}, + {Decoration.TEAK_ARMCHAIR, 4085, 4103}, + {Decoration.MAHOGANY_ARMCHAIR, 4087, 4103}, + {Decoration.BENCH_WOODEN, 4089, 4104}, + {Decoration.BENCH_OAK, 4091, 4104}, + {Decoration.BENCH_CARVED_OAK, 4093, 4104}, + {Decoration.BENCH_TEAK, 4095, 4104}, + {Decoration.BENCH_CARVED_TEAK, 4097, 4104}, + {Decoration.BENCH_MAHOGANY, 4099, 4104}, + {Decoration.BENCH_GILDED, 4101, 4104}, + {Decoration.CARVED_TEAK_BENCH, 4097, 4104}, + {Decoration.MAHOGANY_BENCH, 4099, 4104}, + {Decoration.GILDED_BENCH, 4101, 4104}, + {Decoration.OAK_THRONE, 4111, 4103}, + {Decoration.TEAK_THRONE, 4112, 4103}, + {Decoration.MAHOGANY_THRONE, 4113, 4103}, + {Decoration.GILDED_THRONE, 4114, 4103}, + {Decoration.SKELETON_THRONE, 4115, 4103}, + {Decoration.CRYSTAL_THRONE, 4116, 4103}, + {Decoration.DEMONIC_THRONE, 4117, 4103}, + }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Object[] data : CHAIRS) { + ObjectDefinition.forId(((Decoration) data[0]).getObjectId()).getHandlers().put("option:sit-on", this); + } + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + GameObject object = (GameObject) node; + int animId = -1; + int sitAnimId = -1; + for (Object[] data : CHAIRS) { + if (((Decoration) data[0]).getObjectId() == object.getId()) { + animId = (Integer) data[1]; + sitAnimId = (Integer) data[2]; + break; + } + } + if (object.getType() == 11) { + animId++; + } + final int animation = animId; + final int sitAnimation = sitAnimId; + ForceMovement.run(player, player.getLocation(), node.getLocation(), ForceMovement.WALK_ANIMATION, Animation.create(sitAnimation), object.getDirection().getOpposite(), ForceMovement.WALKING_SPEED, ForceMovement.WALKING_SPEED); + player.getLocks().lockInteractions(600000); + player.getPulseManager().run(new Pulse(2) { + @Override + public boolean pulse() { + player.animate(Animation.create(animation)); + return false; + } + + @Override + public void stop() { + super.stop(); + player.getLocks().unlockInteraction(); + player.animate(Animation.create(sitAnimation + 2)); + } + }); + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin.kt new file mode 100644 index 000000000..3f3b435da --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/ConstructionDoorPlugin.kt @@ -0,0 +1,83 @@ +package core.game.node.entity.skill.construction.decoration + +import core.cache.def.impl.ObjectDefinition +import core.game.content.global.action.DoorActionHandler +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.construction.BuildHotspot +import core.game.node.entity.skill.construction.HousingStyle + +/** + * Handles Construction related doors. + * @author Emperor + */ +@Initializable +class ConstructionDoorPlugin : OptionHandler() { + + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin { + for (style in HousingStyle.values()) { + ObjectDefinition.forId(style.doorId).handlers["option:open"] = this + ObjectDefinition.forId(style.secondDoorId).handlers["option:open"] = this + } + for (deco in BuildHotspot.DUNGEON_DOOR_LEFT.decorations) { + ObjectDefinition.forId(deco.objectId).handlers["option:open"] = this + ObjectDefinition.forId(deco.objectId).handlers["option:pick-lock"] = this + ObjectDefinition.forId(deco.objectId).handlers["option:force"] = this + } + for (deco in BuildHotspot.DUNGEON_DOOR_RIGHT.decorations) { + ObjectDefinition.forId(deco.objectId).handlers["option:open"] = this + ObjectDefinition.forId(deco.objectId).handlers["option:pick-lock"] = this + ObjectDefinition.forId(deco.objectId).handlers["option:force"] = this + } + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + val `object` = node as GameObject + val second = DoorActionHandler.getSecondDoor(`object`, player) + when (option) { + "pick-lock", "force" -> return false //TODO + } + DoorActionHandler.open(`object`, second, getReplaceId(`object`), getReplaceId(second), true, 500, false) + return true + } + + /** + * Gets the replace id for the door. + * @param object The door. + * @return The replace object id. + */ + private fun getReplaceId(`object`: GameObject): Int { + for (data in REPLACEMENT) { + if (`object`.id == data[0]) { + return data[1] + } + } + return `object`.id + 6 + } + + companion object { + /** + * The replacement ids. + */ + val REPLACEMENT = arrayOf( + intArrayOf(13100, 13102), + intArrayOf(13101, 13103), + intArrayOf(13006, 13008), + intArrayOf(13007, 13008), + intArrayOf(13015, 13017), + intArrayOf(13016, 13018), + intArrayOf(13094, 13095), + intArrayOf(13096, 13097), + intArrayOf(13109, 13110), + intArrayOf(13107, 13108), + intArrayOf(13118, 13120), + intArrayOf(13119, 13121) + ) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/FireplacePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/FireplacePlugin.java new file mode 100644 index 000000000..d38f6bae6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/FireplacePlugin.java @@ -0,0 +1,63 @@ +package core.game.node.entity.skill.construction.decoration; + + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the various fireplaces that you may light in Construction. + * @author Splinter + * @author Emperor + */ +@Initializable +public final class FireplacePlugin extends OptionHandler { + + /** + * The animation. + */ + private static final Animation ANIMATION = Animation.create(3658); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(13609).getHandlers().put("option:light", this); + ObjectDefinition.forId(13611).getHandlers().put("option:light", this); + ObjectDefinition.forId(13613).getHandlers().put("option:light", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (!player.getInventory().contains(1511, 1) || !player.getInventory().contains(590, 1)) { + player.sendMessage("You need some logs and a tinderbox in order to light the fireplace."); + return true; + } + final GameObject obj = (GameObject) node.asObject(); + player.lock(2); + player.animate(ANIMATION); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + if (!obj.isActive()) { + return true; + } + player.getInventory().remove(new Item(1511)); + player.getSkills().addExperience(Skills.FIREMAKING, 80); + ObjectBuilder.replace(new GameObject(obj.getId(), obj.getLocation()), new GameObject(obj.getId() + 1, obj.getLocation(), obj.getRotation()), 1000); + player.sendMessage("You light the fireplace."); + return true; + } + }); + return true; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/StaircasePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/StaircasePlugin.java new file mode 100644 index 000000000..c037af161 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/StaircasePlugin.java @@ -0,0 +1,439 @@ +package core.game.node.entity.skill.construction.decoration; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.construction.*; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles construction staircases. + * @author Emperor + * + */ +@Initializable +public final class StaircasePlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new BuildDialogue()); + PluginManager.definePlugin(new ClimbPohLadder()); + for (int i = 13497; i < 13507; i++) { + ObjectDefinition.forId(i).getHandlers().put("option:climb", this); + ObjectDefinition.forId(i).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(i).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(i).getHandlers().put("option:remove-room", this); + } + ObjectDefinition.forId(13409).getHandlers().put("option:enter", this); + ObjectDefinition.forId(13409).getHandlers().put("option:remove-room", this); + for (int id = 13328; id < 13331; id++) { + ObjectDefinition.forId(id).getHandlers().put("option:climb", this); + ObjectDefinition.forId(id).getHandlers().put("option:remove-room", this); + } + for (int id = 13675; id <= 13680; id++) { + if (id < 13678) { + ObjectDefinition.forId(id).getHandlers().put("option:open", this); + } else { + ObjectDefinition.forId(id).getHandlers().put("option:go-down", this); + ObjectDefinition.forId(id).getHandlers().put("option:close", this); + } + ObjectDefinition.forId(id).getHandlers().put("option:remove-room", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + HouseManager house = player.getAttribute("poh_entry", null); + if (house == null) { + player.getPacketDispatch().sendMessage("You're not in your house right now (REPORT)."); + return true; + } + GameObject object = (GameObject) node; + switch (option) { + case "open": + ObjectBuilder.replace(object, object.transform(object.getId() + 3), 200); + return true; + case "close": + ObjectBuilder.replace(object, object.transform(object.getId() - 3)); + return true; + case "remove-room": + if (player.getLocation().getZ() != 0) { + player.getPacketDispatch().sendMessage("The room below is supporting this room!"); + return true; + } + return false; + case "climb": + if (house.getDungeonRegion() == player.getViewport().getRegion()) { + climb(player, 1, house, object); + return true; + } + if (object.getLocation().getZ() > 0) { + climb(player, -1, house, object); + return true; + } + player.getDialogueInterpreter().open("con:climbdial", house, object); + return true; + case "climb-up": + climb(player, 1, house, object); + return true; + case "enter": + case "climb-down": + case "go-down": + climb(player, -1, house, object); + return true; + } + return false; + } + + /** + * Climbs the staircase. + * @param player The player. + * @param z The plane difference. + * @param house The house the player is currently in. + * @param object The object. + */ + private static void climb(Player player, int z, HouseManager house, GameObject object) { + Location l = player.getLocation(); + int plane = l.getZ() + z; + int roomX = l.getChunkX(); + int roomY = l.getChunkY(); + Room current = house.getRooms()[l.getZ()][roomX][roomY]; + if (plane < 0) { //Dungeon + plane = 3; + } + else if (player.getViewport().getRegion() == house.getDungeonRegion() && plane == 1) {//going up + plane = 0; + } + Room room = house.getRooms()[plane][roomX][roomY]; +// boolean stairs = room != null && room.getStairs() != null || room.get; + if (room == null || room.getProperties().isRoof()) { + if (player.getHouseManager().isInHouse(player) && player.getHouseManager().isBuildingMode()) { + player.getDialogueInterpreter().open("con:nfroom", plane, roomX, roomY, current, object); + } + else { + player.getPacketDispatch().sendMessage("This doesn't seem to lead anywhere."); + } + } else { + Location destination = l.transform(0, 0, z); + if (player.getViewport().getRegion() == house.getDungeonRegion()) { + destination = house.getRegion().getBaseLocation().transform(l.getLocalX(), l.getLocalY(), 0); + } + else if (plane == 3) { + destination = house.getDungeonRegion().getBaseLocation().transform(l.getLocalX(), l.getLocalY(), 0); + } + Room r = house.getRoom(destination); + Hotspot h = r.getStairs(); + if (h != null && h.getDecorationIndex() > -1) { + player.getProperties().setTeleportLocation(destination); + } else { + player.getPacketDispatch().sendMessage("This doesn't seem to lead anywhere."); + } + } + } + + /** + * Handles the climbing dialogue. + * @author Emperor + */ + static final class ClimbPohLadder extends DialoguePlugin { + + /** + * Represents the object to use. + */ + private HouseManager house; + + /** + * The ladder. + */ + private GameObject ladder; + + /** + * Constructs a new {@code ClimbPohLadder} {@code Object}. + */ + public ClimbPohLadder() { + super(); + } + + /** + * Constructs a new {@code ClimbPohLadder} {@code Object}. + * @param player the player. + */ + public ClimbPohLadder(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ClimbPohLadder(player); + } + + @Override + public boolean open(Object... args) { + house = (HouseManager) args[0]; + ladder = (GameObject) args[1]; + interpreter.sendOptions("What would you like to do?", "Climb Up.", "Climb Down."); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player.lock(1); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + climb(player, 1, house, ladder); + return true; + } + }); + end(); + break; + case 2: + player.lock(1); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + climb(player, -1, house, ladder); + return true; + } + }); + end(); + break; + + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("con:climbdial") }; + } + + } + + /** + * Handles the creating a room on different floor dialogue. + * @author Emperor + */ + static final class BuildDialogue extends DialoguePlugin { + + /** + * The plane of the room to build. + */ + private int plane; + + /** + * The room x-coordinate. + */ + private int roomX; + + /** + * The room y-coordinate. + */ + private int roomY; + + /** + * The room we're building on. + */ + private Room room; + + /** + * The stairs object. + */ + private GameObject stairs; + + /** + * Constructs a new {@code BuildDialogue} {@code Object}. + */ + public BuildDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code BuildDialogue} {@code Object}. + * @param player the player. + */ + public BuildDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new BuildDialogue(player); + } + + @Override + public boolean open(Object... args) { + plane = (Integer) args[0]; + roomX = (Integer) args[1]; + roomY = (Integer) args[2]; + room = (Room) args[3]; + stairs = (GameObject) args[4]; + stage = 0; + if (stairs.getId() >= 13328 && stairs.getId() <= 13330) { + interpreter.sendPlainMessage(false, "These stairs don't seem to lead anywhere. Do you", "want to build a throne room upstairs?"); + stage = 5; + return true; + } + if (plane == 3) { + if (room.getProperties() == RoomProperties.THRONE_ROOM) { + interpreter.sendPlainMessage(false, "These stairs don't seem to lead anywhere. Do you", "want to build an Oubilette?"); + } else { + interpreter.sendPlainMessage(false, "These stairs don't seem to lead anywhere. Do you", "want to build a dungeon room?"); + } + return true; + } + interpreter.sendPlainMessage(false, "These stairs don't seem to lead anywhere. Do you", "want to build a room at the top?"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + boolean dungeon = plane == 3; + switch (stage) { + case 0: + interpreter.sendOptions("Select an option", "Yes", "No"); + stage = 1; + break; + case 1: + switch (buttonId) { + case 1: //yes + if (room.getProperties() == RoomProperties.THRONE_ROOM) { + Room r = Room.create(player, RoomProperties.OUBILETTE); + Direction[] dirs = BuildingUtils.getAvailableRotations(player, r.getExits(), plane, roomX, roomY); + for (Direction d : dirs) { + if (d == room.getRotation()) { + r.setRotation(d); + Hotspot stairs = room.getStairs(); + int index = stairs != null ? stairs.getDecorationIndex() : -1; + BuildingUtils.buildRoom(player, r, plane, roomX, roomY, r.getExits(), true); + r.getStairs().setDecorationIndex(index); + end(); + return true; + } + } + interpreter.sendPlainMessage(false, "The room you're trying to build doesn't fit."); + stage = 4; + return true; + } + if (dungeon) { + interpreter.sendOptions("Select an option", "Skill Hall", "Quest Hall", "Dungeon Stairs"); + } else { + interpreter.sendOptions("Select an option", "Skill Hall", "Quest Hall"); + } + stage = 2; + return true; + } + end(); + return true; + case 2: + if (dungeon && buttonId == 3) { + stage = 3; + return handle(interfaceId, 1); + } + RoomProperties props = buttonId == 2 ? RoomProperties.QUEST_HALL_2 : RoomProperties.SKILL_HALL_2; + if (plane == 3) { + props = buttonId == 2 ? RoomProperties.QUEST_HALL : RoomProperties.SKILL_HALL; + } + Room r = Room.create(player, props); + Direction[] dirs = BuildingUtils.getAvailableRotations(player, r.getExits(), plane, roomX, roomY); + for (Direction d : dirs) { + if (d == room.getRotation()) { + r.setRotation(d); + Hotspot stairs = room.getStairs(); + int index = stairs != null ? stairs.getDecorationIndex() : -1; + r.getStairs().setDecorationIndex(index); + BuildingUtils.buildRoom(player, r, plane, roomX, roomY, r.getExits(), true); + end(); + return true; + } + } + interpreter.sendPlainMessage(false, "The room you're trying to build doesn't seem to fit."); + stage = 4; + return true; + case 3: + switch (buttonId) { + case 1: //yes + r = Room.create(player, RoomProperties.DUNGEON_STAIRS); + dirs = BuildingUtils.getAvailableRotations(player, r.getExits(), plane, roomX, roomY); + for (Direction d : dirs) { + if (d == room.getRotation()) { + r.setRotation(d); + Hotspot stairs = room.getStairs(); + int index = stairs != null ? stairs.getDecorationIndex() : -1; + BuildingUtils.buildRoom(player, r, plane, roomX, roomY, r.getExits(), true); + r.getStairs().setDecorationIndex(index); + end(); + return true; + } + } + interpreter.sendPlainMessage(false, "The room you're trying to build doesn't fit."); + stage = 4; + return true; + case 2: + end(); + return true; + } + return true; + case 4: + end(); + return true; + case 5: + interpreter.sendOptions("Select an option", "Yes", "No"); + stage = 6; + return true; + case 6: + switch (buttonId) { + case 1: //yes + r = Room.create(player, RoomProperties.THRONE_ROOM); + dirs = BuildingUtils.getAvailableRotations(player, r.getExits(), plane, roomX, roomY); + for (Direction d : dirs) { + if (d == room.getRotation()) { + r.setRotation(d); + Hotspot stairs = room.getStairs(); + int index = stairs != null ? stairs.getDecorationIndex() : -1; + BuildingUtils.buildRoom(player, r, plane, roomX, roomY, r.getExits(), true); + r.getStairs().setDecorationIndex(index); + end(); + return true; + } + } + interpreter.sendPlainMessage(false, "The room you're trying to build doesn't fit."); + stage = 4; + return true; + case 2: + end(); + return true; + } + return true; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("con:nfroom") }; + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/ClockPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/ClockPlugin.java new file mode 100644 index 000000000..3f868f367 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/ClockPlugin.java @@ -0,0 +1,52 @@ +package core.game.node.entity.skill.construction.decoration.bedroom; + + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +/** + * ClockPlugin.java + * @author Clayton Williams (hope) + * @date Oct 26, 2015 + */ +@Initializable +public class ClockPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(13169).getHandlers().put("option:read", this); + ObjectDefinition.forId(13170).getHandlers().put("option:read", this); + ObjectDefinition.forId(13171).getHandlers().put("option:read", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + GameObject object = node.asObject(); + SimpleDateFormat format = new SimpleDateFormat("mm"); + int minuteDisplay = Integer.parseInt(format.format(Calendar.getInstance().getTime())); + StringBuilder sb = new StringBuilder("It's "); + if (minuteDisplay == 0) { + sb.append("Rune o'clock."); + } else if (minuteDisplay == 15) { + sb.append("a quarter past Rune."); + } else if (minuteDisplay > 0 && minuteDisplay < 30) { + sb.append(minuteDisplay + " past Rune."); + } else if (minuteDisplay == 45) { + sb.append("a quarter till Rune."); + } else { + sb.append((60 - minuteDisplay) + " till Rune."); + } + player.getDialogueInterpreter().sendItemMessage(object.getId() - 5117, sb.toString()); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/ShavingStandHandler.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/ShavingStandHandler.kt new file mode 100644 index 000000000..2f4f141c0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/ShavingStandHandler.kt @@ -0,0 +1,31 @@ +package core.game.node.entity.skill.construction.decoration.bedroom + +import core.cache.def.impl.ObjectDefinition +import core.game.component.Component +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class ShavingStandHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(13162).handlers["option:preen"] = this + ObjectDefinition.forId(13163).handlers["option:preen"] = this + ObjectDefinition.forId(13168).handlers["option:preen"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + if(player.appearance.isMale){ + player.interfaceManager.open(Component(596)) + } else { + player.interfaceManager.open(Component(592)) + } + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/WardrobeHandler.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/WardrobeHandler.kt new file mode 100644 index 000000000..06d31a4ff --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/bedroom/WardrobeHandler.kt @@ -0,0 +1,31 @@ +package core.game.node.entity.skill.construction.decoration.bedroom + +import core.cache.def.impl.ObjectDefinition +import core.game.component.Component +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class WardrobeHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(13155).handlers["option:change-clothes"] = this + ObjectDefinition.forId(13156).handlers["option:change-clothes"] = this + ObjectDefinition.forId(13161).handlers["option:change-clothes"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + if(player.appearance.isMale){ + player.interfaceManager.open(Component(591)) + } else { + player.interfaceManager.open(Component(594)) + } + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/BoneOfferPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/BoneOfferPlugin.java new file mode 100644 index 000000000..b77fa214a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/BoneOfferPlugin.java @@ -0,0 +1,178 @@ +package core.game.node.entity.skill.construction.decoration.chapel; + + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.Bones; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the offering of bones on an altar. + * @author Splinter + */ +@Initializable +public class BoneOfferPlugin extends UseWithHandler { + + /** + * The offer GFX. + */ + private final Graphics GFX = new Graphics(624); + + /** + * The offer Animation. + */ + private final Animation ANIM = new Animation(896); + + /** + * Constructor. + */ + public BoneOfferPlugin() { + super(526, 2859, 528, 3183, 3179, 530, 532, 3125, 4812, 3123, 534, 6812, 536, 4830, 4832, 6729, 4834, 14693); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(13185, OBJECT_TYPE, this); + addHandler(13188, OBJECT_TYPE, this); + addHandler(13191, OBJECT_TYPE, this); + addHandler(13194, OBJECT_TYPE, this); + addHandler(13197, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + GameObject left = null; + GameObject right = null; + if (event.getUsedWith().asObject().getRotation() % 2 == 0) { + left = RegionManager.getObject(event.getUsedWith().getLocation().getZ(), event.getUsedWith().getLocation().getX() + 3, event.getUsedWith().getLocation().getY()); + right = RegionManager.getObject(event.getUsedWith().getLocation().getZ(), event.getUsedWith().getLocation().getX() - 2, event.getUsedWith().getLocation().getY()); + } else { + left = RegionManager.getObject(event.getUsedWith().getLocation().getZ(), event.getUsedWith().getLocation().getX(), event.getUsedWith().getLocation().getY() + 3); + right = RegionManager.getObject(event.getUsedWith().getLocation().getZ(), event.getUsedWith().getLocation().getX(), event.getUsedWith().getLocation().getY() - 2); + } + Bones b = Bones.forId(event.getUsedItem().getId()); + if (b != null) { + worship(player, event.getUsedWith().asObject(), left, right, b); + } + return true; + } + + /** + * Worships the altar. + * @param player the player + * @param altar the altar object + * @param left the left brazier + * @param right the right brazier + * @param b the bone used + */ + private void worship(final Player player, final GameObject altar, final GameObject left, final GameObject right, final Bones b) { + if (player.getIronmanManager().isIronman() && !player.getHouseManager().isInHouse(player)) { + player.sendMessage("You cannot do this on someone else's altar."); + return; + } + final Location start = player.getLocation(); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + counter++; + if (counter == 1 || counter % 5 == 0) { + if (player.getInventory().remove(new Item(b.getItemId()))) { + player.animate(ANIM); + player.getAudioManager().send(new Audio(958)); + player.getPacketDispatch().sendPositionedGraphics(GFX, altar.getLocation()); + player.sendMessage(getMessage(isLit(left), isLit(right))); + player.getSkills().addExperience(Skills.PRAYER, b.getExperience() * getMod(altar, isLit(left), isLit(right))); + } + } + return !player.getLocation().equals(start) || !player.getInventory().containsItem(new Item(b.getItemId())); + + } + + }); + + } + + /** + * Checks if the burner is lit. + * @param obj the object. + */ + private boolean isLit(GameObject obj) { + return obj != null && obj.getId() != 15271 && ObjectDefinition.forId(obj.getId()).getOptions() != null && !ObjectDefinition.forId(obj.getId()).hasAction("Light"); + } + + /** + * Gets the base modifier of the altar. + * @param altar the altar object + * @return the base bonus. + */ + private double getBase(GameObject altar) { + double base = 150.0; + if (altar == null) { + return base; + } + switch (altar.getId()) { + case 13182: + base = 110.0; + break; + case 13185: + base = 125.0; + break; + case 13188: + base = 150.0; + break; + case 13191: + base = 175.0; + break; + case 13194: + base = 200.0; + break; + case 13197: + base = 250.0; + break; + } + return base; + } + + /** + * Gets the total experience modifier. + * @param isLeft if the left is lit. + * @param isRight if the right is lit. + * @return the mod. + */ + private double getMod(GameObject altar, boolean isLeft, boolean isRight) { + double total = getBase(altar); + if (isLeft) { + total += 50.0; + } + if (isRight) { + total += 50.0; + } + return (total / 100); + } + + /** + * Gets the proper message. + * @return the message. + */ + private String getMessage(boolean isLeft, boolean isRight) { + return isLeft && isRight ? "The gods are very pleased with your offering." : isLeft || isRight ? "The gods are pleased with your offering." : "The gods accept your offering."; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPlugin.kt new file mode 100644 index 000000000..df069e8bc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/ShieldBlessingPlugin.kt @@ -0,0 +1,47 @@ +package core.game.node.entity.skill.construction.decoration.chapel + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.entity.player.link.audio.Audio +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.game.node.entity.skill.Skills + +const val HOLY_ELIXER = 13754 +const val SPIRIT_SHIELD = 13734 +@Initializable +/** + * Blesses shields + * @author Ceikry + */ +class ShieldBlessingPlugin : UseWithHandler(HOLY_ELIXER, SPIRIT_SHIELD) { + override fun newInstance(arg: Any?): Plugin { + for(i in arrayOf(13185, 13188, 13191, 13194, 13197)){ + addHandler(i, OBJECT_TYPE,this) + } + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + val player = event?.player + player ?: return false + if (player.ironmanManager.isIronman && !player.houseManager.isInHouse(player)) { + player.sendMessage("You cannot do this on someone else's altar.") + return true + } + if(player.skills.getLevel(Skills.PRAYER) < 85){ + player.sendMessage("You need 85 prayer to do this.") + return true + } + + player.animator.animate(Animation(896)) + player.audioManager.send(Audio(958)) + + if(player.inventory.remove(Item(HOLY_ELIXER)) && player.inventory.remove(Item(SPIRIT_SHIELD))) + player.inventory.add(Item(Items.BLESSED_SPIRIT_SHIELD_13736)) + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/TorchLightPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/TorchLightPlugin.java new file mode 100644 index 000000000..d96b44ffa --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/chapel/TorchLightPlugin.java @@ -0,0 +1,49 @@ +package core.game.node.entity.skill.construction.decoration.chapel; + + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Handles the lighting of the torches of the Chapel. + * @author Splinter + */ +@Initializable +public class TorchLightPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 13202; i < 13214; i++) { + ObjectDefinition.forId(i).getHandlers().put("option:light", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getIronmanManager().checkRestriction() && !player.getHouseManager().isInHouse(player)) { + return true; + } + if (!player.getInventory().containsItem(new Item(590)) || !player.getInventory().containsItem(new Item(251))) { + player.getDialogueInterpreter().sendDialogue("You'll need a tinderbox and a clean marrentill herb in order to", "light the burner."); + return true; + } + if (player.getInventory().remove(new Item(251))) { + player.lock(1); + player.animate(Animation.create(3687)); + player.sendMessage("You burn some marrentill in the incense burner."); + ObjectBuilder.replace(node.asObject(), new GameObject(node.asObject().getId() + 1, node.getLocation()), RandomFunction.random(100, 175)); + } + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/combatroom/CombatRing.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/combatroom/CombatRing.java new file mode 100644 index 000000000..ae557447c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/combatroom/CombatRing.java @@ -0,0 +1,32 @@ +package core.game.node.entity.skill.construction.decoration.combatroom; + + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the combat ring. + * @author Emperor + * + */ +@Initializable +public final class CombatRing extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(13129).getHandlers().put("option:climb-over", this); //Boxing ring + ObjectDefinition.forId(13133).getHandlers().put("option:climb-over", this); //Fencing ring + ObjectDefinition.forId(13137).getHandlers().put("option:climb-over", this); //Combat ring + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + return false; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/costume/ToyBoxPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/costume/ToyBoxPlugin.kt new file mode 100644 index 000000000..38bbe3589 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/costume/ToyBoxPlugin.kt @@ -0,0 +1,29 @@ +package core.game.node.entity.skill.construction.decoration.costume + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.interaction.item.toys.DiangoReclaimInterface + +/** + * Handles the Toy Box POH + * ToyBoxPlugin.java + * @author Lee + * @date 10/2/2017 + */ +@Initializable +class ToyBoxPlugin : OptionHandler() { + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(18802).handlers["option:open"] = this + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + DiangoReclaimInterface.open(player) + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/costume/package-info.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/costume/package-info.java new file mode 100644 index 000000000..7236c5772 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/costume/package-info.java @@ -0,0 +1,5 @@ +/** + * @author Leewo + * + */ +package core.game.node.entity.skill.construction.decoration.costume; \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/kitchen/BeerBarrelPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/kitchen/BeerBarrelPlugin.java new file mode 100644 index 000000000..0c8b8d908 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/kitchen/BeerBarrelPlugin.java @@ -0,0 +1,76 @@ +package core.game.node.entity.skill.construction.decoration.kitchen; + + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Construction beer barrels. + * @author Splinter + */ +@Initializable +public class BeerBarrelPlugin extends UseWithHandler { + + /** + * The object ids + */ + private static final int[] OBJECTS = new int[] { + 13568, 13569, 13570, 13571, 13572, 13573 + }; + + /** + * Constructs a new {@Code BeerBarrelPlugin} {@Code Object} + */ + public BeerBarrelPlugin() { + super(1919); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : OBJECTS) { + addHandler(id, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + final GameObject object = (GameObject) event.getUsedWith(); + + if (player.getInventory().remove(new Item(1919))) { + player.animate(Animation.create(3661 + (object.getId() - 13569))); + player.sendMessage("You fill up your glass with " + object.getName().toLowerCase().replace("barrel", "").trim() + "."); + player.getInventory().add(new Item(getReward(object.getId()), 1)); + } + return true; + } + + /** + * Get the beer reward based on the interacted barrel. + * @return the item to give. + */ + public int getReward(int barrelId) { + switch (barrelId) { + case 13568: + return 1917; + case 13569: + return 5763; + case 13570: + return 1905; + case 13571: + return 1909; + case 13572: + return 1911; + case 13573: + return 5755; + } + return 1917; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.java new file mode 100644 index 000000000..2a6aa02e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/kitchen/LarderPlugin.java @@ -0,0 +1,148 @@ +package core.game.node.entity.skill.construction.decoration.kitchen; + + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the interactions for the three Larders. + * @author Splinter + */ +@Initializable +public final class LarderPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new LarderDialogue()); + ObjectDefinition.forId(13565).getHandlers().put("option:search", this); + ObjectDefinition.forId(13566).getHandlers().put("option:search", this); + ObjectDefinition.forId(13567).getHandlers().put("option:search", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(42048, node.getId()); + return true; + } + + /** + * Dialogue options for the Larders. + * @author Splinter + * @version 1.0 + */ + public final class LarderDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code LarderDialogue} {@code Object}. + */ + public LarderDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LarderDialogue} {@code Object}. + * + * @param player + * the player. + */ + public LarderDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new LarderDialogue(player); + } + + @Override + public boolean open(Object... args) { + int id = (int) args[0]; + switch (id) { + case 13565: + interpreter.sendOptions("Select an Option", "Tea Leaves", "Bucket of Milk"); + stage = 1; + break; + case 13566: + interpreter.sendOptions("Select an Option", "Tea Leaves", "Bucket of Milk", "Eggs", "Pot of Flour"); + stage = 1; + break; + case 13567: + interpreter.sendOptions("Select an Option", "Tea Leaves", "Bucket of Milk", "Eggs", "Pot of Flour", "More Options"); + stage = 1; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("You need at least one free inventory space to take from the larder."); + end(); + return true; + } + switch (stage) { + case 1: + switch (buttonId) { + case 1: + player.getInventory().add(new Item(7738, 1)); + end(); + break; + case 2: + player.getInventory().add(new Item(1927, 1)); + end(); + break; + case 3: + player.getInventory().add(new Item(1944, 1)); + end(); + break; + case 4: + player.getInventory().add(new Item(1933, 1)); + end(); + break; + case 5: + player.getDialogueInterpreter().sendOptions( + "Select an Option", "Potatoes", "Garlic", "Onions", "Cheese"); + stage = 2; + break; + } + break; + case 2: + switch (buttonId) { + case 1: + player.getInventory().add(new Item(1942, 1)); + end(); + break; + case 2: + player.getInventory().add(new Item(1550, 1)); + end(); + break; + case 3: + player.getInventory().add(new Item(1957, 1)); + end(); + break; + case 4: + player.getInventory().add(new Item(1985, 1)); + end(); + break; + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 42048 }; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.java new file mode 100644 index 000000000..7804524b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/kitchen/ShelfPlugin.java @@ -0,0 +1,238 @@ +package core.game.node.entity.skill.construction.decoration.kitchen; + + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the shelves in the kitchen room. + * @author Splinter + */ +@Initializable +public final class ShelfPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new ShelfDialogue()); + for (int i = 13545; i < 13552; i++) { + ObjectDefinition.forId(i).getHandlers().put("option:search", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(778341, node.getId()); + return true; + } + + /** + * Dialogue options for the shelves, what a mess! + * @author Splinter + * @version 1.0 + */ + public final class ShelfDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code ShelfDialogue} {@code Object}. + */ + public ShelfDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ShelfDialogue} {@code Object}. + * @param player the player. + */ + public ShelfDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ShelfDialogue(player); + } + + @Override + public boolean open(Object... args) { + int id = (int) args[0]; + switch (id) { + case 13545:// wood 1 + interpreter.sendOptions("Select an Option", "Kettle", "Teapot", "Clay cup"); + stage = 1; + break; + case 13546:// wood 2 + interpreter.sendOptions("Select an Option", "Kettle", "Teapot", "Clay cup", "Empty beer glass"); + stage = 1; + break; + case 13547:// wood 3 + interpreter.sendOptions("Select an Option", "Kettle", "Teapot", "Clay cup", "Empty beer glass", "Cake tin"); + stage = 1; + break; + case 13548:// oak 1 + interpreter.sendOptions("Select an Option", "Kettle", "Teapot", "Clay cup", "Empty beer glass", "Bowl"); + stage = 2; + break; + case 13549:// oak 2 + interpreter.sendOptions("Select an Option", "Kettle", "Teapot", "Porcelain cup", "Empty beer glass", "More Options"); + stage = 3; + break; + case 13550:// teak 1 + case 13551: + interpreter.sendOptions("Select an Option", "Kettle", "Teapot", "Porcelain cup", "Empty beer glass", "More Options"); + stage = 5; + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (player.getInventory().freeSlots() < 1) { + player.sendMessage("You need at least one free inventory space to take from the shelves."); + end(); + return true; + } + switch (stage) { + case 1:// all wood shelves + switch (buttonId) { + case 1: + end(); + player.getInventory().add(new Item(7688, 1)); + break; + case 2: + end(); + player.getInventory().add(new Item(7702, 1)); + break; + case 3: + end(); + player.getInventory().add(new Item(7728, 1)); + break; + case 4: + end(); + player.getInventory().add(new Item(1919, 1)); + break; + case 5: + end(); + player.getInventory().add(new Item(1887, 1)); + break; + } + break; + case 2:// Oak shelf #1 + switch (buttonId) { + case 1: + end(); + player.getInventory().add(new Item(7688, 1)); + break; + case 2: + end(); + player.getInventory().add(new Item(7702, 1)); + break; + case 3: + end(); + player.getInventory().add(new Item(7728, 1)); + break; + case 4: + end(); + player.getInventory().add(new Item(1919, 1)); + break; + case 5: + end(); + player.getInventory().add(new Item(1923, 1)); + break; + } + break; + case 3:// Oak shelves #2 only + switch (buttonId) { + case 1: + end(); + player.getInventory().add(new Item(7688, 1)); + break; + case 2: + end(); + player.getInventory().add(new Item(7702, 1)); + break; + case 3: + end(); + player.getInventory().add(new Item(4244, 1)); + break; + case 4: + end(); + player.getInventory().add(new Item(1919, 1)); + break; + case 5: + interpreter.sendOptions("Select an Option", "Bowl", "Cake tin"); + stage = 4; + break; + } + break; + case 4:// Oak shelves #2 only + switch (buttonId) { + case 1: + end(); + player.getInventory().add(new Item(1923, 1)); + break; + case 2: + end(); + player.getInventory().add(new Item(1887, 1)); + break; + } + case 5:// teak shelves + switch (buttonId) { + case 1: + end(); + player.getInventory().add(new Item(7688, 1)); + break; + case 2: + end(); + player.getInventory().add(new Item(7702, 1)); + break; + case 3: + end(); + player.getInventory().add(new Item(7735, 1)); + break; + case 4: + end(); + player.getInventory().add(new Item(1919, 1)); + break; + case 5: + interpreter.sendOptions("Select an Option", "Bowl", "Pie dish", "Empty pot"); + stage = 6; + break; + } + break; + case 6:// teak shelves + switch (buttonId) { + case 1: + end(); + player.getInventory().add(new Item(1923, 1)); + break; + case 2: + end(); + player.getInventory().add(new Item(2313, 1)); + break; + case 3: + end(); + player.getInventory().add(new Item(1931, 1)); + break; + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 778341 }; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.kt new file mode 100644 index 000000000..c42d9e06b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberDialogue.kt @@ -0,0 +1,50 @@ +package core.game.node.entity.skill.construction.decoration.portalchamber + +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin + +/** + * Portal Chamber Dialogue go brrrrrr + * @author Ceikry + */ +@Initializable +class PortalChamberDialogue(player: Player? = null) : DialoguePlugin(player) { + var portal = "none" + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> when(buttonId){ + 1 -> directPortal("varrock") + 2 -> directPortal("lumbridge") + 3 -> directPortal("falador") + 4 -> options("Camelot Portal","Ardougne Portal","Yanille Portal","Kharyll Portal").also { stage++ } + } + 1 -> when(buttonId){ + 1 -> directPortal("camelot") + 2 -> directPortal("ardougne") + 3 -> directPortal("yanille") + 4 -> directPortal("kharyrll") + } + } + return true + } + + fun directPortal(portal: String){ + PortalChamberPlugin.direct(player,portal.toUpperCase()) + end() + } + + override fun open(vararg args: Any?): Boolean { + player.dialogueInterpreter.sendOptions("Select one.","Varrock Portal","Lumbridge Portal","Falador Portal","More...") + stage = 0 + return true + } + + override fun newInstance(player: Player?): DialoguePlugin { + return PortalChamberDialogue(player) + } + + override fun getIds(): IntArray { + return intArrayOf(394857) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.java new file mode 100644 index 000000000..cf36b7fe7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/portalchamber/PortalChamberPlugin.java @@ -0,0 +1,258 @@ +package core.game.node.entity.skill.construction.decoration.portalchamber; + + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.runecrafting.Rune; +import core.game.node.entity.skill.construction.Decoration; +import core.game.node.entity.skill.construction.Hotspot; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * PortalChamberPlugin + * @author Clayton Williams + * @date Jan 2, 2016 + */ +@Initializable +public class PortalChamberPlugin extends OptionHandler { + + /** + * Locations + * @author Clayton Williams + * @date Jan 3, 2016 + */ + private static enum Locations { + + VARROCK(Location.create(3213, 3428, 0), new Item(Rune.FIRE.getRune().getId(), 100), new Item(Rune.AIR.getRune().getId(), 300), new Item(Rune.LAW.getRune().getId(), 100)), + LUMBRIDGE(Location.create(3222, 3217, 0), new Item(Rune.EARTH.getRune().getId(), 100), new Item(Rune.AIR.getRune().getId(), 300), new Item(Rune.LAW.getRune().getId(), 100)), + FALADOR(Location.create(2965, 3380, 0), new Item(Rune.WATER.getRune().getId(), 100), new Item(Rune.AIR.getRune().getId(), 300), new Item(Rune.LAW.getRune().getId(), 100)), + CAMELOT(Location.create(2730, 3485, 0), new Item(Rune.AIR.getRune().getId(), 500), new Item(Rune.LAW.getRune().getId(), 100)), + ARDOUGNE(Location.create(2663, 3305, 0), new Item(Rune.WATER.getRune().getId(), 200), new Item(Rune.LAW.getRune().getId(), 200)), + YANILLE(Location.create(2554, 3114, 0), new Item(Rune.EARTH.getRune().getId(), 200), new Item(Rune.LAW.getRune().getId(), 200)), + KHARYRLL(Location.create(3493, 3474, 0), new Item(Rune.BLOOD.getRune().getId(), 100), new Item(Rune.LAW.getRune().getId(), 200)); + + /** + * The location to teleport to + */ + private Location location; + + /** + * The rune requirements + */ + private Item[] runes; + + /** + * Locations + * @param location + * @param runes + */ + Locations(Location location, Item... runes) { + this.location = location; + this.runes = runes; + } + } + + /** + * Directs a portal + * @param player + * @param identifier + */ + public static void direct(Player player, String identifier) { + player.getInterfaceManager().closeSingleTab(); + int dpId = player.getAttribute("con:dp-id", 1); + Hotspot[] hotspots = player.getHouseManager().getRoom(player.getLocation()).getHotspots(); + for (int i = 0; i < hotspots.length; i++) { + Hotspot h = hotspots[i]; + if (h.getHotspot().name().equalsIgnoreCase("PORTAL" + dpId)) { + if (h.getDecorationIndex() == -1) { + player.sendMessage("You must build a portal frame first!"); + return; + } + Decoration previous = h.getHotspot().getDecorations()[h.getDecorationIndex()]; + String name = previous.name(); + String prefix = "TEAK"; + if (name.toLowerCase().contains("mahogany")) { + prefix = "MAHOGANY"; + } else if (name.toLowerCase().contains("marble")) { + prefix = "MARBLE"; + } + for (Locations l : Locations.values()) { + if (l.name().contains(identifier)) { + Item[] runes = l.runes; + if (!player.getInventory().containsItems(runes)) { + player.sendMessage("You do not have the required runes to build this portal"); + return; + } + player.getInventory().remove(runes); + break; + } + } + h.setDecorationIndex(h.getHotspot().getDecorationIndex(Decoration.forName(prefix + "_" + identifier + "_" + "PORTAL"))); + player.getHouseManager().reload(player, player.getHouseManager().isBuildingMode()); //TODO replace object live instead? + } + } + } + + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(13639).getHandlers().put("option:direct-portal", this); + ObjectDefinition.forId(13639).getHandlers().put("option:scry", this); + ObjectDefinition.forId(13640).getHandlers().put("option:direct-portal", this); + ObjectDefinition.forId(13641).getHandlers().put("option:direct-portal", this); + for (int i = 13615; i <= 13635; i++) { + ObjectDefinition.forId(i).getHandlers().put("option:enter", this); + } + PluginManager.definePlugin(new DirectPortalDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + GameObject object = node.asObject(); + switch (option) { + case "direct-portal": + if (!player.getHouseManager().isBuildingMode()) { + player.sendMessage("You can currently only do this in building mode."); + return true; + } + player.getDialogueInterpreter().open(DialogueInterpreter.getDialogueKey("con:directportal")); + return true; + case "enter": + String objectName = object.getName(); + for (Locations l : Locations.values()) { + if (objectName.toLowerCase().contains(l.name().toLowerCase())) { + player.teleport(l.location); + if (player.getHouseManager().isInHouse(player) && node.getId() == 13635) { + //player.getAchievementDiaryManager().getDiary(DiaryType.MORYTANIA).updateTask(player, 2, 0, true); + } + break; + } + } + return true; + case "scry": + //wtf + return true; + } + return false; + } + + /** + * DirectPortalDialogue.java + * @author Clayton Williams + * @date Jan 2, 2016 + */ + private static final class DirectPortalDialogue extends DialoguePlugin { + + /** + * DirectPortalDialogue + */ + public DirectPortalDialogue() { + /** + * Empty + */ + } + + /** + * DirectPortalDialogue + * @param player + */ + public DirectPortalDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DirectPortalDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendOptions("Select a portal", "Portal 1", "Portal 2", "Portal 3"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + player.setAttribute("con:dp-id", buttonId); + end(); + player.getDialogueInterpreter().open(394857); + return true; + } + + @Override + public int[] getIds() { + return new int[]{DialogueInterpreter.getDialogueKey("con:directportal")}; + } + + } + + /** + * The direct options build + */ + /*private final static TabbedOption DIRECT_OPTIONS = new TabbedOption("Direct Portal", "Select an option", + new Page( + new PageAction("Varrock Portal") { + @Override + public boolean run(Player player) { + PortalChamberPlugin.direct(player, "VARROCK"); + return true; + } + }, + new PageAction("Lumbridge Portal") { + @Override + public boolean run(Player player) { + PortalChamberPlugin.direct(player, "LUMBRIDGE"); + return true; + } + }, + new PageAction("Falador Portal") { + @Override + public boolean run(Player player) { + PortalChamberPlugin.direct(player, "FALADOR"); + return true; + } + }, + new PageAction("Camelot Portal") { + @Override + public boolean run(Player player) { + PortalChamberPlugin.direct(player, "CAMELOT"); + return true; + } + }, + new PageAction("Ardougne Portal") { + @Override + public boolean run(Player player) { + PortalChamberPlugin.direct(player, "ARDOUGNE"); + return true; + } + } + ), new Page( + new PageAction("Yanille Portal") { + @Override + public boolean run(Player player) { + PortalChamberPlugin.direct(player, "YANILLE"); + return true; + } + }, + new PageAction("Kharyrll Portal") { + @Override + public boolean run(Player player) { + PortalChamberPlugin.direct(player, "KHARYRLL"); + return true; + } + } + ) + );*/ + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin.java new file mode 100644 index 000000000..3359e0950 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/questhall/MountedGloryPlugin.java @@ -0,0 +1,94 @@ +package core.game.node.entity.skill.construction.decoration.questhall; + + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialogueAction; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the POH Mounted Glory. + * @author Splinter + */ +@Initializable +public class MountedGloryPlugin extends OptionHandler { + + /** + * Represents the teleport animation. + */ + private static final Animation ANIMATION = new Animation(714); + + /** + * Represents the graphics to use. + */ + private static final Graphics GRAPHICS = new Graphics(308, 100, 50); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(13523).getHandlers().put("option:rub", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + DialogueInterpreter interpreter = player.getDialogueInterpreter(); + interpreter.sendOptions("Select a location.", "Edgeville", "Karamja", "Draynor Village", "Al-Kharid", "Nowhere."); + interpreter.addAction(new DialogueAction() { + + @Override + public void handle(Player player, int buttonId) { + switch (buttonId) { + case 2: + teleport(player, Location.create(3087, 3495, 0)); + break; + case 3: + teleport(player, Location.create(2919, 3175, 0)); + break; + case 4: + teleport(player, Location.create(3081, 3250, 0)); + break; + case 5: + teleport(player, Location.create(3304, 3124, 0)); + break; + } + } + + }); + return true; + } + + /** + * Method used to teleport to a location. + * @param player the player. + * @param location the location. + */ + private boolean teleport(final Player player, final Location location) { + if (player.isTeleBlocked()) { + player.sendMessage("A magical force has stopped you from teleporting."); + return false; + } + player.lock(); + player.visualize(ANIMATION, GRAPHICS); + player.getImpactHandler().setDisabledTicks(4); + GameWorld.getPulser().submit(new Pulse(4, player) { + @Override + public boolean pulse() { + player.unlock(); + player.getProperties().setTeleportLocation(location); + player.getAnimator().reset(); + return true; + } + }); + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/LecternPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/LecternPlugin.kt new file mode 100644 index 000000000..3c32d6eb2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/LecternPlugin.kt @@ -0,0 +1,200 @@ +package core.game.node.entity.skill.construction.decoration.study + +import core.cache.def.impl.ObjectDefinition +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.plugin.PluginManager.definePlugin +import core.game.interaction.item.TeleTabsOptionPlugin +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.construction.Decoration + +/** + * Handles the lectern + * LecternPlugin + * @author Ceikry + */ +@Initializable +class LecternPlugin : OptionHandler() { + /** + * TeleTabButton + */ + private enum class TeleTabButton( + /** + * The button id + */ + val buttonId: Int, + /** + * The level and xp + */ + val level: Int, + val xp: Int, + /** + * The item + */ + val tabItem: Item, + /** + * The required decoration (lectern) + */ + private val requiredDecorations: Array, vararg requiredItems: Item) { + ARDOUGNE(2, 51, 66, Item(TeleTabsOptionPlugin.TeleTabs.ADDOUGNE_TELEPORT.item), arrayOf(Decoration.TEAK_EAGLE_LECTERN, Decoration.MAHOGANY_EAGLE_LECTERN), SOFT_CLAY, Item(563, 2), Item(555, 2)), + BONES_TO_BANANNAS(3, 15, 32, Item(8014), arrayOf(Decoration.DEMON_LECTERN, Decoration.TEAK_DEMON_LECTERN, Decoration.MAHOGANY_DEMON_LECTERN), SOFT_CLAY, Item(561, 1), Item(557, 2), Item(555, 2)), + BONES_TO_PEACHES(4, 60, 36, Item(8015), arrayOf(Decoration.MAHOGANY_DEMON_LECTERN), SOFT_CLAY, Item(561, 2), Item(557, 4), Item(555, 4)), + CAMELOT(5, 45, 56, Item(TeleTabsOptionPlugin.TeleTabs.CAMELOT_TELEPORT.item), arrayOf(Decoration.TEAK_EAGLE_LECTERN, Decoration.MAHOGANY_EAGLE_LECTERN), SOFT_CLAY, Item(563), Item(556, 5)), + ENCHANT_DIAMOND(6, 57, 62, Item(8019), arrayOf(Decoration.TEAK_DEMON_LECTERN, Decoration.MAHOGANY_DEMON_LECTERN), SOFT_CLAY, Item(564), Item(557, 10)), + ENCHANT_DRAGONSTONE(7, 68, 60, Item(8020), arrayOf(Decoration.MAHOGANY_DEMON_LECTERN), SOFT_CLAY, Item(564), Item(557, 15), Item(555, 15)), + ENCHANT_EMERALD(8, 27, 34, Item(8017), arrayOf(Decoration.DEMON_LECTERN, Decoration.TEAK_DEMON_LECTERN, Decoration.MAHOGANY_DEMON_LECTERN), SOFT_CLAY, Item(564), Item(556, 3)), + ENCHANT_ONYX(9, 87, 84, Item(8021), arrayOf(Decoration.MAHOGANY_DEMON_LECTERN), SOFT_CLAY, Item(564), Item(557, 20), Item(554, 20)), + ENCHANT_RUBY(10, 49, 52, Item(8018), arrayOf(Decoration.TEAK_DEMON_LECTERN, Decoration.MAHOGANY_DEMON_LECTERN), SOFT_CLAY, Item(564), Item(554, 5)), + ENCHANT_SAPPHIRE(11, 7, 12, Item(8016), arrayOf(Decoration.OAK_LECTERN, Decoration.EAGLE_LECTERN, Decoration.TEAK_EAGLE_LECTERN, Decoration.MAHOGANY_EAGLE_LECTERN, Decoration.DEMON_LECTERN, Decoration.TEAK_DEMON_LECTERN, Decoration.MAHOGANY_DEMON_LECTERN), SOFT_CLAY, Item(564), Item(555)), + FALADOR(12, 37, 48, Item(TeleTabsOptionPlugin.TeleTabs.FALADOR_TELEPORT.item), arrayOf(Decoration.EAGLE_LECTERN, Decoration.TEAK_EAGLE_LECTERN, Decoration.MAHOGANY_EAGLE_LECTERN), SOFT_CLAY, Item(563), Item(555), Item(556, 3)), + LUMBRIDGE(13, 31, 40, Item(TeleTabsOptionPlugin.TeleTabs.LUMBRIDGE_TELEPORT.item), arrayOf(Decoration.EAGLE_LECTERN, Decoration.TEAK_EAGLE_LECTERN, Decoration.MAHOGANY_EAGLE_LECTERN), SOFT_CLAY, Item(563), Item(557), Item(556, 3)), + HOUSE(14, 40, 30, Item(8013), arrayOf(Decoration.MAHOGANY_EAGLE_LECTERN), SOFT_CLAY, Item(563), Item(557), Item(556)), + VARROCK(15, 25, 35, Item(TeleTabsOptionPlugin.TeleTabs.VARROCK_TELEPORT.item), arrayOf(Decoration.OAK_LECTERN, Decoration.EAGLE_LECTERN, Decoration.TEAK_EAGLE_LECTERN, Decoration.MAHOGANY_EAGLE_LECTERN, Decoration.DEMON_LECTERN, Decoration.TEAK_DEMON_LECTERN, Decoration.MAHOGANY_DEMON_LECTERN), SOFT_CLAY, Item(563), Item(554), Item(556, 3)), + WATCHTOWER(16, 58, 74, Item(TeleTabsOptionPlugin.TeleTabs.WATCH_TOWER_TELEPORT.item), arrayOf(Decoration.MAHOGANY_EAGLE_LECTERN), SOFT_CLAY, Item(563, 2), Item(557, 2)); + + /** + * The required items + */ + val requiredItems: ArrayList = arrayListOf(*requiredItems) + + /** + * Checks if the player can make this tab + * @param player + * @return + */ + fun canMake(player: Player): Boolean { + val objectId = player.getAttribute("ttb:objectid") + if (player.skills.getLevel(Skills.MAGIC) < level && player.spellBookManager.spellBook == 192) { + player.sendMessage("You need a magic level of $level to make that!") + return false + } + if (this == BONES_TO_PEACHES && !player.savedData.activityData.isBonesToPeaches) { + player.sendMessages("You need the Bones to Peaches ability purchased from MTA before making these.", "This requirement doesn't apply to actually using the tabs.") + return false + } + var found = false + for (d in requiredDecorations) if (d.objectId == objectId) found = true + if (!found) { + player.sendMessage("You're unable to make this tab on this specific lectern.") + return false + } + for (item in requiredItems) { + if (!player.inventory.containsItem(item)) { + //TODO staffs + player.sendMessage("You don't have enough materials.") + return false + } + } + return true + } + + companion object { + /** + * Gets the button for the id + * @param id + * @return + */ + fun forId(id: Int): TeleTabButton? { + for (ttb in values()) { + if (ttb.buttonId == id) return ttb + } + return null + } + } + + } + + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin? { + for (i in 13642..13648) { + ObjectDefinition.forId(i).handlers["option:study"] = this + } + definePlugin(TeleTabInterface()) + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + val id = node.asObject().id + player.setAttribute("ttb:objectid", id) + GameWorld.Pulser.submit(object : Pulse(){ + var counter = 0 + override fun pulse(): Boolean { + when(counter++){ + 0 -> player.animator.animate(Animation(3649)).also { player.lock() } + 8 -> player.interfaceManager.open(Component(400)).also { player.unlock(); return true } + } + return false + } + }) + /*var bits = 0 We dumb so we comment it out haha code go brrrrr + for (t in TeleTabButton.values()) { + if (t.canMake(player)) bits = bits or (1 shl t.buttonId) + } + player.configManager[2005] = bits*/ + return true + } + + /** + * TeleTabInterface + * @author Ceikry + */ + private class TeleTabInterface : ComponentPlugin() { + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin? { + ComponentDefinition.put(400, this) + return this + } + + override fun handle(player: Player, component: Component, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + val ttb = TeleTabButton.forId(button) + if (ttb != null && ttb.canMake(player)) { + player.interfaceManager.close() + player.pulseManager.run(object : Pulse(1) { + override fun pulse(): Boolean { + if (!ttb.canMake(player)) { + return true + } + if (player.inventory.freeSlots() == 0) { + player.sendMessage("You don't have enough space in your inventory to make this.") + return true + } + if (player.inventory.remove(*ttb.requiredItems.toTypedArray())) { + player.inventory.add(ttb.tabItem) + player.skills.addExperience(Skills.MAGIC, ttb.xp / 2.toDouble(), true) + //TODO Add correct lectern animation. + player.animate(Animation(4460)) + ////////////////////////////// + super.setDelay(9) + if (ttb == TeleTabButton.VARROCK + && (player.getAttribute("ttb:objectid", 0) == Decoration.MAHOGANY_EAGLE_LECTERN.objectId + || player.getAttribute("ttb:objectid", 0) == Decoration.MAHOGANY_DEMON_LECTERN.objectId)) { + player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 2, 8) + } + } + return false + } + }) + } + player.animate(Animation(-1)) + return true + } + } + + companion object { + /** + * Soft clay + */ + private val SOFT_CLAY = Item(1761, 1) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin.kt new file mode 100644 index 000000000..196e9e3db --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/study/TelescopePlugin.kt @@ -0,0 +1,54 @@ +package core.game.node.entity.skill.construction.decoration.study + +import core.cache.def.impl.ObjectDefinition +import core.game.component.Component +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld.Pulser +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.RandomFunction +import core.game.content.global.worldevents.WorldEvents +import core.game.content.global.worldevents.shootingstar.ShootingStarEvent +import java.util.concurrent.TimeUnit + +@Initializable +class TelescopePlugin : OptionHandler() { + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin? { + ObjectDefinition.forId(13656).handlers["option:observe"] = this + ObjectDefinition.forId(13657).handlers["option:observe"] = this + ObjectDefinition.forId(13658).handlers["option:observe"] = this + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + val star = (WorldEvents.get("shooting-stars") as ShootingStarEvent).star + val delay: Int = 25000 + (25000 / 3) + val timeLeft = delay - star.ticks + val fakeTimeLeftBecauseFuckPlayers = TimeUnit.MILLISECONDS.toMinutes(timeLeft * 600L) + if(RandomFunction.random(0,100) % 2 == 0) 2 else -2 + val obj = node?.asObject() as GameObject + player?.lock() + player?.animate(ANIMATION) + player?.interfaceManager?.open(Component(782)).also { player?.unlock() + Pulser.submit(object : Pulse(2, player) { + override fun pulse(): Boolean { + if (obj.isActive) { + player?.dialogueInterpreter?.sendDialogue("You see a shooting star! The star looks like it will land","in about $fakeTimeLeftBecauseFuckPlayers minutes!") + return true + } + return true + } + }) + return true + } + } + + companion object { + private val ANIMATION = Animation.create(3649) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand.kt b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand.kt new file mode 100644 index 000000000..92fff3d44 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ArmourStand.kt @@ -0,0 +1,105 @@ +package core.game.node.entity.skill.construction.decoration.workshop + +import core.game.content.global.RepairItem +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.dialogue.DialoguePlugin +import core.game.interaction.npc.bob.BobDialogue.BarrowsEquipment +import core.game.interaction.npc.bob.BobDialogue.BarrowsEquipment.BarrowsFullEquipment +import core.game.node.entity.skill.Skills +import kotlin.math.ceil + +@Initializable +class ArmourStand : UseWithHandler(494, 468, 496, 470, 498, 472, 500, 502, 474, 504, 476, 506, 478, 6741, 4856, 4857, 4858, 4859, 4860, 4862, 4863, 4864, 4865, 4866, 4868, 4869, 4870, 4871, 4872, 4874, 4875, 4876, 4877, 4878, 4880, 4881, 4882, 4883, 4884, 4886, 4887, 4888, 4889, 4890, 4892, 4893, 4894, 4895, 4896, 4898, 4899, 4900, 4901, 4902, 4904, 4905, 4906, 4907, 4908, 4910, 4911, 4912, 4913, 4914, 4916, 4917, 4918, 4919, 4920, 4922, 4923, 4924, 4925, 4926, 4928, 4929, 4930, 4931, 4932, 4934, 4935, 4936, 4937, 4938, 4940, 4941, 4942, 4943, 4944, 4946, 4947, 4948, 4949, 4950, 4952, 4953, 4954, 4955, 4956, 4958, 4959, 4960, 4961, 4962, 4964, 4965, 4966, 4967, 4968, 4970, 4971, 4972, 4973, 4974, 4976, 4977, 4978, 4979, 4980, 4982, 4983, 4984, 4985, 4986, 4988, 4989, 4990, 4991, 4992, 4994, 4995, 4996, 4997, 4998){ + override fun newInstance(arg: Any?): Plugin { + addHandler(13715, OBJECT_TYPE, this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val repairItem = RepairItem.forId(event.used.id) + + var baseCost = 0.0 + var product: Item? = null + + if(repairItem != null){ + baseCost = repairItem.cost * 1.0 + product = repairItem.product + } else if(BarrowsEquipment.isBarrowsItem(event.used.id)){ + //Begin terrible code thanks to Vexia + val type = BarrowsEquipment.formatedName(event.used.id) + val single = BarrowsEquipment.getSingleName(type) + val equipment = BarrowsEquipment.getEquipmentType(type) + val newString = type.toLowerCase().replace(single, "").trim { it <= ' ' }.replace("'s", "") + val newewString = StringBuilder() + newewString.append(newString).append(" $equipment") + val fullequip = BarrowsFullEquipment.forName(newewString.toString()) + baseCost = BarrowsEquipment.getFormatedCost(equipment,event.used.asItem()) * 1.0 + product = fullequip.full + //End terrible code thanks to Vexia + } + + if((repairItem == null && baseCost == 0.0)){ + player.sendMessage("That item can't be repaired.") + return true + } + + val cost: Int = ceil(((100.0 - (player.skills.getLevel(Skills.SMITHING) / 2.0) ) / 100.0) * baseCost).toInt() + + player.dialogueInterpreter.open(58824213,event.used,cost,product) + + return true + } + @Initializable + class RepairDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun newInstance(player: Player?): DialoguePlugin { + return RepairDialogue(player) + } + var item: Item? = null + var cost: Int = 0 + var product: Item? = null + + override fun open(vararg args: Any?): Boolean { + item = args[0] as Item + cost = args[1] as Int + product = args[2] as Item + player.dialogueInterpreter.sendDialogue("Would you like to repair your ${(item as Item).name.toLowerCase()}","for $cost gp?") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + item ?: return false + product ?: return false + when(stage){ + 0 -> options("Yes, please","No, thanks").also{stage++} + 1 -> when(buttonId){ + 1 -> exchangeItems(item as Item,cost,product as Item).also { end() } + 2 -> end() + } + } + return true + } + + fun exchangeItems(item: Item, cost: Int, product: Item) { + val coins = Item(995, cost) + if (player.inventory.containsItem(coins) && player.inventory.containsItem(item)) { + player.inventory.remove(item, coins) + player.inventory.add(product) + player.sendMessage("You repair your ${product.name.toLowerCase()} for $cost.") + } else { + player.sendMessage("You can't afford that.") + } + } + + override fun getIds(): IntArray { + return intArrayOf(58824213) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.java new file mode 100644 index 000000000..3c94645c7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ClockmakersBenchPlugin.java @@ -0,0 +1,235 @@ +package core.game.node.entity.skill.construction.decoration.workshop; + + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.construction.BuildingUtils; +import core.game.node.entity.skill.construction.Decoration; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the clockmakers bench in the workshop + * ClockmakersBenchPlugin.java + * @author Clayton Williams (hope) + * @date Oct 29, 2015 + */ +@Initializable +public class ClockmakersBenchPlugin extends OptionHandler { + + /** + * Stores data for things created by the clockmakers bench + * ClockmakersBenchPlugin.java + * @author Clayton Williams + * @date Oct 30, 2015 + */ + private enum Craftable { + + TOY_HORSEY(2520, 10, BuildingUtils.PLANK), + CLOCKWORK(8792, 8, new Item(2353)), + TOY_SOLDIER(7759, 13, BuildingUtils.PLANK, new Item(8792)), + TOY_DOLL(7763, 18, BuildingUtils.PLANK, new Item(8792)), + TOY_MOUSE(7767, 33, BuildingUtils.PLANK, new Item(8792)), + TOY_CAT(7771, 85, BuildingUtils.PLANK, new Item(8792)), + WATCH(2575, 28, new Item(8792), new Item(2353)), + SEXTANT(2574, 23, new Item(2353)); + + /** + * The itemId to give after making this + */ + private int itemId; + + /** + * The materials needed to make this + */ + private Item[] materials; + + /** + * The crafting level required to make this + */ + private int craftingLevel; + + /** + * Craftable + * @param itemId + * @param craftingLevel + * @param materials + */ + Craftable(int itemId, int craftingLevel, Item... materials) { + this.itemId = itemId; + this.craftingLevel = craftingLevel; + this.materials = materials; + } + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(13709).getHandlers().put("option:craft", this); + ObjectDefinition.forId(13710).getHandlers().put("option:craft", this); + ObjectDefinition.forId(13711).getHandlers().put("option:craft", this); + ObjectDefinition.forId(13712).getHandlers().put("option:craft", this); + PluginManager.definePlugin(new ClockmakerBenchDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getDialogueInterpreter().open(DialogueInterpreter.getDialogueKey("con:clockbench"), node.asObject()); + return true; + } + + /** + * Handles the dialogue for clock bench + * @author Clayton Williams + * @date Oct 29, 2015 + */ + private final class ClockmakerBenchDialogue extends DialoguePlugin { + + /** + * The crafting table decoration + */ + Decoration decoration; + + /** + * ClockmakerBenchDialogue + */ + public ClockmakerBenchDialogue() { + /** + * Empty + */ + } + + /** + * ClockmakerBenchDialogue + * @param player + */ + public ClockmakerBenchDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ClockmakerBenchDialogue(player); + } + + @Override + public boolean open(Object... args) { + GameObject object = (GameObject) args[0]; + decoration = Decoration.forObjectId(object.getId()); + if (decoration != null) { + switch (decoration) { + case CRAFTING_TABLE_1: + interpreter.sendOptions("Select an Option", "Toy Horsey", "Nevermind"); + break; + case CRAFTING_TABLE_2: + interpreter.sendOptions("Select an Option", "Toy Horsey", "Clockwork Mechanism"); + break; + case CRAFTING_TABLE_3: + interpreter.sendOptions("Select an Option", "Toy Horsey", "Clockwork Mechanism", "Clockwork Devices"); + break; + case CRAFTING_TABLE_4: + interpreter.sendOptions("Select an Option", "Toy Horsey", "Clockwork Mechanism", "Clockwork Devices", "Watch", "Sextant"); + break; + default: + break; + } + } + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + switch (buttonId) { + case 1: + case 2: + if (decoration == Decoration.CRAFTING_TABLE_1 && buttonId == 2) { + end(); + return true; + } + craftItem(buttonId == 1 ? Craftable.TOY_HORSEY : Craftable.CLOCKWORK); + stage = 3; + break; + case 3: + if (decoration == Decoration.CRAFTING_TABLE_3) { + interpreter.sendOptions("Select an Option", "Clockwork Soldier", "Clockwork Doll"); + } else if (decoration == Decoration.CRAFTING_TABLE_4) { + interpreter.sendOptions("Select an Option", "Clockwork Soldier", "Clockwork Doll", "Clockwork Mouse", "Clockwork Cat"); + } + stage = 2; + break; + case 4: + case 5: + craftItem(buttonId == 4 ? Craftable.WATCH : Craftable.SEXTANT); + stage = 3; + break; + } + break; + case 2: + switch (buttonId) { + case 1: + craftItem(Craftable.TOY_SOLDIER); + break; + case 2: + craftItem(Craftable.TOY_DOLL); + break; + case 3: + craftItem(Craftable.TOY_MOUSE); + break; + case 4: + craftItem(Craftable.TOY_CAT); + break; + } + stage = 3; + break; + case 3: + end(); + break; + } + return true; + } + + /** + * Attempts to craft an item + * @param c - the craftable to make + */ + private void craftItem(Craftable c) { + if (c != null) { + if (player.getSkills().getLevel(Skills.CRAFTING) < c.craftingLevel) { + interpreter.sendDialogue("You need level " + c.craftingLevel + " crafting to make that."); + return; + } + for (Item n : c.materials) { + if (!player.getInventory().containsItem(n)) { + interpreter.sendDialogue("You need a " + ItemDefinition.forId(n.getId()).getName() + " to make that!"); + return; + } + } + for (Item n : c.materials) { + n.setAmount(1); + player.getInventory().remove(n); + } + player.getSkills().addExperience(Skills.CRAFTING, 15); + player.getInventory().add(new Item(c.itemId, 1)); + player.animate(BuildingUtils.BUILD_MID_ANIM); + interpreter.sendDialogue("You made a " + ItemDefinition.forId(c.itemId).getName() + "!"); + } + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("con:clockbench") }; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.java new file mode 100644 index 000000000..bb91f05c3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/decoration/workshop/ToolsPlugin.java @@ -0,0 +1,171 @@ +package core.game.node.entity.skill.construction.decoration.workshop; + + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the 5 types of tool stores + * ToolsPlugin.java + * @author Clayton Williams + * @date Oct 29, 2015 + * + */ +@Initializable +public class ToolsPlugin extends OptionHandler { + + /** + * The different tool stores + * @author Clayton Williams + * @date Oct 29, 2015 + */ + private enum ToolStore { + + TOOLSTORE_1(13699, 8794, 1755, 2347, 1735), + TOOLSTORE_2(13700, 1925, 952, 590), + TOOLSTORE_3(13701, 1757, 1785, 1733), + TOOLSTORE_4(13702, 1595, 1597, 1592, 1599, 5523), + TOOLSTORE_5(13703, 5341, 952, 676, 5343, 5331); + + /** + * The object id of the tool store + */ + private int objectId; + + /** + * The tools included + */ + private int[] tools; + + /** + * ToolStore + * @param objectId + * @param tools + */ + ToolStore(int objectId, int... tools) { + this.objectId = objectId; + this.tools = tools; + } + + /** + * Gets the toolstore from an object id + * @param objectId - the object id + * @return + */ + private static ToolStore forId(int objectId) { + for (ToolStore t : ToolStore.values()) { + if (t.objectId == objectId) { + return t; + } + } + return null; + } + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (ToolStore t : ToolStore.values()) { + ObjectDefinition.forId(t.objectId).getHandlers().put("option:search", this); + } + PluginManager.definePlugin(new ToolDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + GameObject object = node.asObject(); + ToolStore ts = ToolStore.forId(object.getId()); + if (ts != null) { + player.getDialogueInterpreter().open(DialogueInterpreter.getDialogueKey("con:tools"), ts); + } + return true; + } + + /** + * Handles the tool dialogue + * @author Clayton Williams + * @date Oct 29, 2015 + */ + private final class ToolDialogue extends DialoguePlugin { + + /** + * The tool store being used + */ + private ToolStore toolStore; + + /** + * ToolDialogue + */ + private ToolDialogue() { + /** + * Empty + */ + } + + /** + * ToolDialogue + * @param player + */ + public ToolDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ToolDialogue(player); + } + + @Override + public boolean open(Object... args) { + toolStore = (ToolStore) args[0]; + List itemNames = new ArrayList(); + for(int itemId : toolStore.tools) { + ItemDefinition n = ItemDefinition.forId(itemId); + itemNames.add(n.getName()); + } + interpreter.sendOptions("Select a Tool", itemNames.toArray(new String[itemNames.size()])); + stage = 1; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 1: + Item item = new Item(toolStore.tools[buttonId - 1], 1); + if (player.getInventory().freeSlots() <= 0) { + interpreter.sendDialogue("You have no space in your inventory."); + stage = 2; + return true; + } + player.getInventory().add(item); + end(); + return true; + case 2: + end(); + return true; + } + return false; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("con:tools") }; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/npc/HouseServantDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/npc/HouseServantDialogue.java new file mode 100644 index 000000000..e883aa687 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/npc/HouseServantDialogue.java @@ -0,0 +1,567 @@ +package core.game.node.entity.skill.construction.npc; + + +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.construction.HouseManager; +import core.game.node.entity.skill.construction.Servant; +import core.game.node.entity.skill.construction.ServantType; +import core.game.interaction.MovementPulse; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.IronmanMode; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.path.Pathfinder; +import core.game.interaction.inter.SawmillPlankInterface.Plank; + +/** + * Handles the Servant's dialogues. + * @author Splinter + * @date 9/23/2015 + * @version 0.98 (TODO: Missing a few dialogues) + */ +public class HouseServantDialogue extends DialoguePlugin { + + /** + * If using the sawmill. + */ + private boolean sawmill; + + /** + * The logs + */ + private Item logs; + + /** + * Constructs a new {@code ServantDialogue} {@code Object}. + */ + public HouseServantDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ServantDialogue} {@code Object}. + * @param player the player. + */ + public HouseServantDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new HouseServantDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + HouseManager manager = player.getHouseManager(); + boolean inHouse = manager.isInHouse(player); + if (args.length > 1) { //Parse options from our "use-with" handler + sawmill = (boolean) args[1]; + logs = (Item) args[2]; + } + if (player.getIronmanManager().checkRestriction(IronmanMode.ULTIMATE)) { + player.sendMessage("Ultimate Ironmen cannot hire butlers."); + return true; + } + if (!manager.hasHouse() && inHouse) { + interpreter.sendDialogues(npc, npc.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You don't have a house that I can work in.", "I'll be waiting here if you decide to buy a house."); + stage = 100; + return true; + } + if (!manager.hasServant()) { + ServantType type = ServantType.forId(npc.getId()); + if(player.getSkills().getLevel(Skills.CONSTRUCTION) >= type.getLevel()){ + interpreter.sendDialogues(npc, npc.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You're not aristocracy, but I suppose you'd do. Do you", "want a good cook for " + type.getCost() + " coins?"); + stage = 0; + return true; + } + interpreter.sendDialogues(npc, npc.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You need a Construction level of " + type.getLevel() + " and you must not", "currently have another person working for you", "in order to hire me."); + stage = 100; + return true; + } else { + Servant servant = manager.getServant(); + if(servant.getItem() == null){ + servant.setItem(new Item(0, 0)); + } + if (inHouse) { + follow(player, servant); + if (sawmill) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Very well, I will take these logs to the mill and", "have them converted into planks."); + stage = 110; + return true; + } + if (servant.getItem().getAmount() > 0) { + if(player.getInventory().freeSlots() < 1){ + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I have returned with what you asked me to", "retrieve. As I see your inventory is full, I shall wait", "with these " + servant.getItem().getAmount()+" items until you are ready."); + stage = 100; + return true; + } + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I have returned with what you asked me to", "retrieve."); + stage = 150; + return true; + } + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Yes, " + (player.getAppearance().isMale() ? "sir" : "ma'am") + "?", "You have " + (8 - servant.getUses()) + " uses of my services remaining."); + stage = 50; + } else if(npc.getId() != servant.getId()){ + interpreter.sendDialogues(npc, npc.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You already have someone working for you.", "Fire them first before hiring me."); + stage = 100; + } + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + HouseManager manager = player.getHouseManager(); + Servant servant = manager.getServant(); + ServantType type = ServantType.forId(npc.getId()); + switch(stage) { + case 0: + options("What can you do?", "Tell me about your previous jobs.", "You're hired!"); + stage++; + break; + case 1: + switch(buttonId) { + case 1: //TODO: + break; + case 2: //TODO: + break; + case 3: + player("You're hired!"); + stage = 2; + break; + } + break; + case 2: + interpreter.sendDialogues(npc, npc.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Alright, " + (player.getAppearance().isMale() ? "sir" : "ma'am") + ". I can start work immediately."); + stage++; + break; + case 3: + if (type != null && player.getInventory().getAmount(995) >= type.getCost() && player.getInventory().remove(new Item(995, type.getCost()))) { + manager.setServant(new Servant(type)); + interpreter.sendDialogue("The servant heads to your house."); + stage = 100; + break; + } + interpreter.sendDialogue("You don't have enough money to pay the servant's hiring fee."); + stage = 100; + break; + case 50: + options("Go to the bank/sawmill...", "Misc...", "Stop following me.", "You're fired!"); + stage++; + break; + case 51: + type = servant.getType(); + switch(buttonId) { + case 1: + options(!servant.getAttributes().containsKey("con:lastfetch") ? "Repeat last fetch task" : "Fetch another " + (type.getCapacity() + " x " + ((Item) servant.getAttribute("con:lastfetch")).getName().toLowerCase()) + " (" + (servant.getAttribute("con:lastfetchtype")) + ")", "Go to the bank", "Go to the sawmill", "Pay wages (" + servant.getUses()+"/8 uses)"); + stage++; + break; + case 2: + options("Greet guests", "Cook me something"); + stage = 56; + break; + case 3: + player("Stop following me."); + if (servant.getPulseManager().isMovingPulse()) { + servant.getPulseManager().clear("movement"); + } + stage = 100; + break; + case 4: + player("You're fired!"); + stage = 75; + break; + } + break; + case 52: + switch(buttonId){ + case 1: + if (!servant.getAttributes().containsKey("con:lastfetch")) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I haven't recently fetched anything from the bank or", "sawmill for you."); + stage = 50; + break; + } else { + if (servant.getAttribute("con:lastfetchtype") == "bank") { + bankFetch(player, (Item) servant.getAttribute("con:lastfetch")); + return true; + } + end(); + sawmillRun(player, (Item) servant.getAttribute("con:lastfetch")); + } + break; + case 2: + options("Planks", "Oak planks", "Teak planks", "Mahogany planks", "More options"); + stage = 60; + break; + case 3: + if (type == ServantType.MAID || type == ServantType.RICK) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I am unable to travel to the sawmill for you."); + stage = 100; + break; + } + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Hand the logs to me and I will take them to the", "sawmill for you."); + stage = 100; + break; + case 4: + stage = 100; + if (servant.getUses() < 1) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You have no need to pay me yet, I haven't performed", "any of my services for you."); + break; + } + if (!player.getInventory().containsItem(new Item(995, type.getCost()))) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Thanks for the kind gesture, but you don't have enough", "money to pay me. I require " + type.getCost() + " coins every eight uses", "of my services."); + break; + } + if (player.getInventory().remove(new Item(995, type.getCost()))) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Thank you very much."); + servant.setUses(0); + } + break; + } + break; + case 56: + switch(buttonId) { + case 1: + servant.setGreet(!servant.isGreet()); + player("Please " + (servant.isGreet() ? "greet" : "do not greet") + " all new guests upon arrival."); + stage++; + break; + case 2: + if (type.getFood() == null) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I don't know any recipes."); + stage = 100; + break; + } + if (type.getFood().length > 1) { + options(type.getFood()[0].getName(), type.getFood()[1].getName(), "Nevermind."); + stage = 58; + } else { + options(type.getFood()[0].getName(), "Nevermind."); + stage = 59; + } + break; + } + break; + case 57: + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Whatever you command."); + stage = 50; + break; + case 58: + if (player.getInventory().freeSlots() < 1) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I would love to share my fine cooking with you,", "but your hands are currently full."); + stage = 100; + break; + } + if (!prereqs(player, null, false)) { + end(); + return true; + } + switch(buttonId) { + case 1: + player.getInventory().add(type.getFood()[0]); + stage = 50; + break; + case 2: + player.getInventory().add(type.getFood()[1]); + stage = 50; + break; + case 3: + player("Nevermind."); + stage = 100; + return true; + } + servant.setUses(servant.getUses() + 1); + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Luckily for you, I already have some made. Here you", "go."); + stage = 50; + break; + case 59: + if (player.getInventory().freeSlots() < 1) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I would love to share my fine cooking with", "you, but you have no space to take anything."); + stage = 50; + break; + } + if (!prereqs(player, null, false)) { + end(); + return true; + } + switch(buttonId) { + case 1: + player.getInventory().add(type.getFood()[0]); + stage = 100; + break; + case 2: + player("Nevermind."); + stage = 100; + return true; + } + servant.setUses(servant.getUses() + 1); + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Luckily for you, I already have some made. Here you", "go."); + stage = 100; + break; + case 60: + switch(buttonId) { + case 1: //planks + bankFetch(player, new Item(960)); + stage = 100; + break; + case 2: //oak + bankFetch(player, new Item(8778)); + stage = 100; + break; + case 3: //teak + bankFetch(player, new Item(8780)); + break; + case 4: //mahog + bankFetch(player, new Item(8782)); + break; + case 5: + options("Soft clay", "Limestone bricks", "Steel bars", "Cloth", "More options"); + stage++; + break; + } + break; + case 61: + switch(buttonId) { + case 1: //clay + bankFetch(player, new Item(1761)); + break; + case 2: //lime + bankFetch(player, new Item(3420)); + break; + case 3: //steel bars + bankFetch(player, new Item(2353)); + break; + case 4: //cloth + bankFetch(player, new Item(8790)); + break; + case 5: + options("Gold leaves", "Marble blocks", "Magic stones"); + stage++; + break; + } + break; + case 62: + switch(buttonId) { + case 1: //leaves + bankFetch(player, new Item(4692)); + break; + case 2: //marble + bankFetch(player, new Item(8786)); + break; + case 3: //magic stones + bankFetch(player, new Item(4703)); + break; + } + break; + case 75: + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "Very well. I will return to the Guild of the Servants", "in Ardougne if you wish to re-hire me."); + stage++; + break; + case 76: + end(); + servant.getItem().setAmount(0); + servant.setUses(0); + servant.clear(); + servant.setLocation(new Location(0, 0)); + manager.setServant(null); + break; + case 100: + end(); + break; + case 110: + end(); + sawmillRun(player, logs); + break; + case 150: + if (servant.getItem()== null) { + end(); + return true; + } + int amtLeft = servant.getItem().getAmount(); + boolean flag = false; + if (amtLeft < 1 || servant.getItem() == null) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I don't have any items left."); + stage = 100; + break; + } + if (amtLeft > player.getInventory().freeSlots()) { + amtLeft = player.getInventory().freeSlots(); + flag = true; + } + servant.getItem().setAmount(servant.getItem().getAmount() - amtLeft); + player.getInventory().add(new Item(servant.getItem().getId(), amtLeft)); + if (flag) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I still have " + servant.getItem().getAmount() + " left for you to take from me."); + stage = 100; + } else{ + end(); + } + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 4235, 4237, 4239, 4241, 4243 }; + } + + /** + * Checks the pre-reqs for a sawmill run or a bank run. + * @param player + * @param item + * @return true or false if they have the requirements to use the servant. + */ + private boolean prereqs(final Player player, final Item item, boolean sawmill) { + HouseManager manager = player.getHouseManager(); + Servant servant = manager.getServant(); + if (!sawmill && player.getInventory().freeSlots() < 1) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You don't have any space in your inventory."); + stage = 100; + return false; + } + if (servant.getUses() >= 8) { + player.sendMessage("The servant has left your service due to a lack of payment."); + servant.getItem().setAmount(0); + servant.setUses(0); + servant.clear(); + servant.setLocation(new Location(0, 0)); + manager.setServant(null); + end(); + return false; + } + if (servant.getItem().getAmount() > 0) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You can't send me off again, I'm still holding some of", "your previous items."); + return false; + } + return true; + } + + /** + * Goes to the sawmill. + * @param player + * @param item + */ + private void sawmillRun(final Player player, final Item item) { + HouseManager manager = player.getHouseManager(); + final Servant servant = manager.getServant(); + final ServantType type = manager.getServant().getType(); + if (servant == null || item == null || !prereqs(player, item, true)) { + return; + } + if (type == ServantType.MAID || type == ServantType.RICK) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "I am unable to take planks to the sawmill."); + return; + } + int amt = player.getInventory().getAmount(item); + if (amt < 1) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You don't have any more of that type of log."); + return; + } + for (Plank plank : Plank.values()) { + if (plank.getLog().getId() == item.getId()) { + if (amt > type.getCapacity()) { + amt = type.getCapacity(); + } + if (!player.getInventory().contains(995, plank.getPrice() * amt)) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You don't have enough coins for me to do that.", "I can hold " + type.getCapacity() + " logs and each of this type of log", "costs " + plank.getPrice() + " coins each to convert into plank form."); + return; + } + end(); + if (player.getInventory().remove(new Item(item.getId(), amt)) && player.getInventory().remove(new Item(995, amt * plank.getPrice()))) { + manager.getServant().setItem(new Item(plank.getPlank().getId(), amt)); + servant.setInvisible(true); + servant.getLocks().lockMovement(100); + GameWorld.getPulser().submit(new Pulse((int) (type.getTimer() / 0.6)){ + + @Override + public boolean pulse() { + servant.setInvisible(false); + servant.getLocks().unlockMovement(); + servant.setAttribute("con:lastfetch", new Item(item.getId(), 1)); + servant.setAttribute("con:lastfetchtype", "sawmill"); + interpreter.open(servant.getId(), servant); + return true; + } + }); + } + break; + } + } + } + + /** + * Gets items from the player's bank. + * @param player + * @param item + */ + private void bankFetch(final Player player, final Item item) { + final HouseManager manager = player.getHouseManager(); + final Servant servant = manager.getServant(); + final ServantType type = manager.getServant().getType(); + if (servant == null || item == null || !prereqs(player, item, false)) { + return; + } + if (!player.getBank().containsItem(item)) { + interpreter.sendDialogues(servant, servant.getId() == 4243 ? FacialExpression.HALF_GUILTY : null, "You don't seem to have any of those in the bank."); + stage = 100; + return; + } + end(); + servant.setInvisible(true); + servant.getLocks().lockMovement(100); + GameWorld.getPulser().submit(new Pulse((int) (type.getTimer() / 0.6)) { + + @Override + public boolean pulse() { + if (player == null || player.getHouseManager().getRegion() != player.getViewport().getRegion()) { //TODO: Check if in dungeon? + return true; + } + int amt = player.getBank().getAmount(item.getId()); + if (amt < 1) { + return true; + } + if (amt > type.getCapacity()) { + amt = type.getCapacity(); + } + servant.setInvisible(false); + servant.getLocks().unlockMovement(); + Item fetch = new Item(item.getId(), amt); + if (player.getBank().remove(fetch)) { + manager.getServant().setItem(fetch); + interpreter.open(servant.getId(), servant); + } + servant.setAttribute("con:lastfetch", new Item(fetch.getId(), 1)); + servant.setAttribute("con:lastfetchtype", "bank"); + manager.getServant().setUses(manager.getServant().getUses() + 1); + follow(player, servant); + return true; + } + + }); + } + + /** + * Follows the person who is talking to them. + * @param player + * @param npc + */ + private void follow(Player player, NPC npc) { + npc.getPulseManager().run(new MovementPulse(npc, player, Pathfinder.SMART) { + + @Override + public boolean pulse() { + return false; + } + }, "movement"); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/npc/HouseServantPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/npc/HouseServantPlugin.java new file mode 100644 index 000000000..09385ff3f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/npc/HouseServantPlugin.java @@ -0,0 +1,55 @@ +package core.game.node.entity.skill.construction.npc; + + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles interaction with the house servant. + * @author Splinter + * @date 9/24/2015 + * @version 0.1 + * + * @see {@link HouseServantDialogue} + * For the other associated classes that deal with house servants. + * + */ +@Initializable +public class HouseServantPlugin extends UseWithHandler { + + /** + * The item IDS to use. + */ + final static int[] IDS = { 1511, 1521, 6333, 6332 }; + + /** + * Constructs a new {@code HouseServantPlugin} {@code Object}. + */ + public HouseServantPlugin() { + super(IDS); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(4235, NPC_TYPE, this); + addHandler(4237, NPC_TYPE, this); + addHandler(4239, NPC_TYPE, this); + addHandler(4241, NPC_TYPE, this); + addHandler(4243, NPC_TYPE, this); + PluginManager.definePlugin(new HouseServantDialogue()); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (event.getUsedItem() == null || event.getUsedWith() == null) { + return true; + } + event.getPlayer().getDialogueInterpreter().open(event.getUsedWith().asNpc().getId(), event.getUsedWith().asNpc(), true, event.getUsedItem()); + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/construction/npc/StonemasonPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/construction/npc/StonemasonPlugin.java new file mode 100644 index 000000000..9b306ad71 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/construction/npc/StonemasonPlugin.java @@ -0,0 +1,78 @@ +package core.game.node.entity.skill.construction.npc; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.game.content.global.shop.Shop; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the Keldagrim Stonemason. + * @author Splinter + */ +@Initializable +public class StonemasonPlugin extends OptionHandler { + + /** + * The store that sells supplies. + */ + private static final SupplyStore STORE = new SupplyStore(); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(4248).getHandlers().put("option:trade", this); + NPCDefinition.forId(4248).getHandlers().put("option:talk-to", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "trade": + case "talk-to": + STORE.open(player); + break; + } + return true; + } + + /** + * Stonemason's store. + * @author Splinter + */ + public static class SupplyStore extends Shop { + + /** + * Constructs a new {@Code SupplyStore} {@Code Object} + */ + public SupplyStore() { + super("Keldagrim Stonemason", new Item[] { new Item(3420, 1000), new Item(8786, 20), new Item(8784, 20), new Item(8788, 10) }, false); + } + + @Override + public boolean canSell(Player player, Item item, ItemDefinition def) { + player.sendMessage("You cannot sell items to this store."); + return false; + } + + @Override + public int getBuyPrice(Item item, Player player) { + switch (item.getId()) { + case 3420: + return 26; + case 8786: + return 325_000; + case 8784: + return 130_000; + case 8788: + return 975_000; + } + return -1; + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CakeMakingPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CakeMakingPlugin.java new file mode 100644 index 000000000..c82006d2c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CakeMakingPlugin.java @@ -0,0 +1,69 @@ +package core.game.node.entity.skill.cooking; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to make a cake. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CakeMakingPlugin extends UseWithHandler { + + /** + * Represents the bucket of milk item. + */ + private static final Item BUCKET_OF_MILK = new Item(1927); + + /** + * Represents the egg item. + */ + private static final Item EGG = new Item(1944); + + /** + * Represents the cake tin item. + */ + private static final Item CAKE_TIN = new Item(1887); + + /** + * Represents the pot of flour item. + */ + private static final Item POT_OF_FLOUR = new Item(1933); + + /** + * Represents the uncooked cake item. + */ + private static final Item UNCOOKED_CAKE = new Item(1889); + + /** + * Constructs a new {@code CakeMakingPlugin} {@code Object}. + */ + public CakeMakingPlugin() { + super(1933); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1887, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (event.getUsedItem().getId() == 1887 && ((Item) event.getUsedWith()).getId() == 1933 || event.getUsedWith().getName().equalsIgnoreCase("cake tin") && ((Item) event.getUsedItem()).getName().equalsIgnoreCase("pot of flour")) { + if (event.getPlayer().getInventory().contains(1933, 1) && event.getPlayer().getInventory().contains(1927, 1) && event.getPlayer().getInventory().contains(1944, 1)) { + if (event.getPlayer().getInventory().remove(BUCKET_OF_MILK, EGG, CAKE_TIN, POT_OF_FLOUR)) { + event.getPlayer().getInventory().add(UNCOOKED_CAKE); + event.getPlayer().getPacketDispatch().sendMessage("You mix the milk, flour and egg together to make a raw cake mix."); + return true; + } + } + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/ChocolateBarCutter.kt b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/ChocolateBarCutter.kt new file mode 100644 index 000000000..69dc50e60 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/ChocolateBarCutter.kt @@ -0,0 +1,34 @@ +package core.game.node.entity.skill.cooking + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +@Initializable +class ChocolateBarCutter : UseWithHandler(946){ + override fun newInstance(arg: Any?): Plugin { + addHandler(1973, ITEM_TYPE, this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + player.pulseManager.run(object : Pulse(1){ + val cut_animation = Animation(1989) + override fun pulse(): Boolean { + super.setDelay(4) + val amount = player.inventory.getAmount(Items.CHOCOLATE_BAR_1973) + if(amount > 0) player.inventory.remove(Item(1973)).also { player.animator.animate(cut_animation); player.inventory.add(Item(1975)) } + return amount <= 0 + } + }) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CoconutMakePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CoconutMakePlugin.java new file mode 100644 index 000000000..d4d54e83c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CoconutMakePlugin.java @@ -0,0 +1,56 @@ +package core.game.node.entity.skill.cooking; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to make a coconut. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CoconutMakePlugin extends UseWithHandler { + + /** + * Represents the items related to coconut making plugin. + */ + private static final Item[] ITEMS = new Item[] { new Item(5974, 1), new Item(5976, 1), new Item(229), new Item(5935, 1), new Item(5978) }; + + /** + * Constructs a new {@code CoconutMakePlugin} {@code Object}. + */ + public CoconutMakePlugin() { + super(5974, 5976); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2347, ITEM_TYPE, this); + addHandler(229, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Item usedWith = (Item) event.getUsedWith(); + if (usedWith.getId() == 5974 && event.getUsedItem().getId() == 2347 || usedWith.getId() == 2347 && event.getUsedItem().getId() == 5974) { + player.getInventory().remove(ITEMS[0]); + player.getInventory().add(ITEMS[1]); + player.getPacketDispatch().sendMessage("You crush the coconut with a hammer."); + } + if (usedWith.getId() == 5976 && event.getUsedItem().getId() == 229 || usedWith.getId() == 229 && event.getUsedItem().getId() == 5976) { + player.getInventory().remove(ITEMS[1]); + player.getInventory().remove(ITEMS[2]); + player.getInventory().add(ITEMS[3]); + player.getInventory().add(ITEMS[4]); + player.getPacketDispatch().sendMessage("You overturn the coconut into a vial."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookableItems.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookableItems.java new file mode 100644 index 000000000..a85c2c555 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookableItems.java @@ -0,0 +1,141 @@ +package core.game.node.entity.skill.cooking; + +import core.tools.Items; +import core.game.node.item.Item; + +import java.util.HashMap; + +public enum CookableItems { + /** meats */ + CHICKEN(2140,2138,2144,1,30,30), + UGTHANKI(2140,2138,2144,1,40,40), + RABBIT(3228,3226,7222,1,30,30), + DARK_CRAB(14939, 14937, 14941, 90, 215, 100), + CRAB(7521, 7518, 7520,21, 100, 100), + + /** fish */ + SHRIMP(315, 317, 7954,1, 45, 35), + KARAMBWANJI(3151, 3150, 592,1, 10, 30), + SARDINE(325, 327, 369,1, 40, 38), + ANCHOVIES(319, 321, 323,1, 30, 34), + HERRING(347, 345, 357,5, 50, 41), + MACKEREL(355, 353, 357,10, 60, 45), + TROUT(333, 335, 343,15, 70, 50), + COD(339, 341, 343,18, 75, 52), + PIKE(351, 349, 343,20, 80, 53), + SALMON(329, 331, 343,25, 58, 90), + SLIMY_EEL(3381, 3379, 3383,28, 95, 58), + TUNA(361, 359, 367,30, 100, 64), + RAINBOW_FISH(10136, 10138, 10140,35, 110, 60), + CAVE_EEL(5003, 5001, 5002,38, 115, 40), + LOBSTER(379, 377, 381,40, 120, 74), + BASS(365, 363, 367,43, 130, 80), + SWORDFISH(373, 371, 375,45, 140, 86), + LAVA_EEL(2149, 2148, 3383,53, 30, 53), + MONKFISH(7946, 7944, 7948,62, 150, 92), + SHARK(385, 383, 387,80, 210, 100), + SEA_TURTLE(397, 395, 399,82, 212, 100), + MANTA_RAY(391, 389, 393,91, 216, 100), + KARAMBWAN(3144, 3142, 3146,1, 80, 30), + + /** snails */ + THIN_SNAIL(3369, 3363, 3375,12, 70, 70), + LEAN_SNAIL(3371, 3365, 3375,17, 80, 80), + FAT_SNAIL(3373, 3367, 3375,22, 95, 95), + + //Bread + BREAD(2309, 2307, 2311,1,40,40), + + //Cake + CAKE(1891, 1889, 1903, 40, 180, 95), + + //Beef(s) (Rat, Bear, Cow, Yak) + BEEF(2142,2132,2146,1,30,30), + RAT_MEAT(2142,2134,2146,1,30,30), + BEAR_MEAT(2142,2136,2146,1,30,30), + YAK_MEAT(2142,10816,2146,1,30,30), + + //Skewered foods + SKEWER_1(9988, 9986, 9990,21, 82, 82), + SKEWER_2(2878, 2876, 7226,30, 140, 140), + SKEWER_3(7568, 7566, 7570,41, 160, 140), + SKEWER_4(9980, 9984, 9982,11, 62, 62), + SKEWER_5(7223, 7224, 7222,16, 70, 62), + + //Pies + PIE_1(2325, 2321, 2329, 10, 78, 60), + PIE_2(2327, 2319, 2329, 20, 110, 80), + PIE_3(7170, 7169, 2329, 29,128,85), + PIE_4(2323,2317,2329,30,130,85), + GARDEN_PIE(7178,7176,2329,34,138, 89), + FISH_PIE(7188,7186,2329,47,164,110), + ADMIRAL_PIE(7198,7196,2329,70,210,140), + WILD_PIE(7208,7206,2329,85,240,140), + SUMMER_PIE(7218,7216,2329,95,260,160), + + //Pizzas + PIZZA_1(2289, 2287,2305, 35, 143, 86), + + //Bowl foods + BOWL_1(2003, 2001, 2005,25, 117, 58), + BOWL_2(4239, 4237, 4239,20, 52, 1), + BOWL_3(7078, 7076, 7090,13, 50, 60), + BOWL_4(7084, 1871, 7092,43, 60, 70), + BOWL_5(7082, 7080, 7094,57, 120, 80), + + //Miscellaneous + RAW_OOMLIE(Items.RAW_OOMLIE_2337, 0, Items.BURNT_OOMLIE_2426, 50, 0, 999), // always burns + OOMLIE_WRAP(Items.COOKED_OOMLIE_WRAP_2343, Items.WRAPPED_OOMLIE_2341, Items.BURNT_OOMLIE_WRAP_2345, 50, 110, 999); + + public static HashMapcookingMap = new HashMap<>(); + public static HashMapintentionalBurnMap = new HashMap<>(); + public int raw,cooked,level,burnLevel,burnt; + double experience; + CookableItems(int cooked, int raw, int burnt, int level, double experience, int burnLevel){ + this.raw = raw; + this.cooked = cooked; + this.burnt = burnt; + this.level = level; + this.experience = experience; + this.burnLevel = burnLevel; + + } + + static{ + CookableItems[] cookableItems = values(); + int cookableItemsLength = cookableItems.length; + for(int x = 0; x < cookableItemsLength; x++){ + CookableItems item = cookableItems[x]; + cookingMap.putIfAbsent(item.raw,item); + intentionalBurnMap.putIfAbsent(item.cooked,item); + } + } + + public static CookableItems forId(int id){ + return cookingMap.get(id); + } + + public static Item getCooked(int id){ + return new Item(cookingMap.get(id).cooked); + } + + public static Item getBurnt(int id){ + return new Item(cookingMap.get(id).burnt); + } + + public static Item getRaw(int id){ + return new Item(cookingMap.get(id).raw); + } + + public static boolean intentionalBurn(int id){ + return (intentionalBurnMap.get(id) != null); + } + + public static Item getIntentionalBurn(int id){ + return new Item(intentionalBurnMap.get(id).burnt); + } + + public static int getBurnLevel(int id){ + return cookingMap.get(id).burnLevel; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingDialoguePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingDialoguePlugin.java new file mode 100644 index 000000000..e9f23d2da --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingDialoguePlugin.java @@ -0,0 +1,199 @@ +/* +package core.game.node.entity.skill.cooking; + +import core.game.content.dialogue.DialoguePlugin; +import org.crandor.game.content.global.consumable.Consumables; +import org.crandor.game.content.global.consumable.Food; +import core.game.node.entity.skill.cooking.CookableItems; +import core.game.node.entity.skill.cooking.CookingPulse; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.entity.player.link.RunScript; +import org.crandor.game.node.item.Item; +import org.crandor.game.node.object.GameObject; +import org.crandor.net.packet.PacketRepository; +import org.crandor.net.packet.context.ChildPositionContext; +import org.crandor.net.packet.out.RepositionChild; +import org.crandor.plugin.InitializablePlugin; + +*/ +/** + * Represents the dialogue used to handle the amount to make of a cookable item. + * @author 'Vexia + * @version 1.0 + *//* + +@InitializablePlugin +public final class CookingDialoguePlugin extends DialoguePlugin { + + */ +/** + * Represents the cooking dialogue id. + *//* + + public static final int DIALOGUE_ID = 43989; + + */ +/** + * Represents the sinew item. + *//* + + private static final Item SINEW = new Item(9436); + + */ +/** + * Represents the meat item. + *//* + + private static final Item MEAT = new Item(2142); + + */ +/** + * Represents the food we're cooking. + *//* + + private int food; + + */ +/** + * Represents the obejct we're cooking on. + *//* + + private GameObject object; + + */ +/** + * Constructs a new {@code CookingDialoguePlugin} {@code Object}. + *//* + + public CookingDialoguePlugin() { + */ +/** + * empty. + *//* + + } + + */ +/** + * Constructs a new {@code CookingDialoguePlugin} {@code Object}. + * @param player the player. + *//* + + public CookingDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CookingDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + food = ((int) args[0]); + object = ((GameObject) args[1]); + if (args.length == 3) { + interpreter.sendOptions("Select an Option", "Dry the meat into sinew.", "Cook the meat."); + stage = 100; + return true; + } + if (player.getInventory().getAmount(CookableItems.forId(food).raw) == 1) { + end(); + cook(player,object,food,1); + return true; + } + display(); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + int amount = getAmount(buttonId); + if (amount == -1) { + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int amount = (int) value; + cook(player, object, food, amount); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + } else if (amount == 28) { + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + cook(player, object, food, amount); + return false; + } + }); + } + cook(player, object, food, amount); + break; + */ +/*case 100: + switch (buttonId) { + case 1: + food = Consumables.forFood(SINEW); + display(); + break; + case 2: + food = Consumables.forFood(MEAT); + display(); + break; + } + break;*//* + + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DIALOGUE_ID }; + } + + */ +/** + * Method used to display the content food. + *//* + + public void display() { + player.getInterfaceManager().openChatbox(307); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 307, 3, 60, 79)); + player.getPacketDispatch().sendItemZoomOnInterface(CookableItems.getRaw(food).getId(), 160, 307, 2); + player.getPacketDispatch().sendString(CookableItems.getRaw(food).getName(), 307, 3); + stage = 0; + } + + public void cook(Player player, GameObject object, int food, int amount){ + player.getPulseManager().run(new CookingPulse(player,object,food,amount)); + } + + */ +/** + * Method used to get the amount to make based off the button id. + * @param buttonId the button id. + * @return the amount to make. + *//* + + private final int getAmount(final int buttonId) { + switch (buttonId) { + case 5: + return 1; + case 4: + return 5; + case 3: + return -1; + case 2: + return 28; + } + return -1; + } + +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingPlugin.java new file mode 100644 index 000000000..c20c569ba --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingPlugin.java @@ -0,0 +1,263 @@ +/* +package core.game.node.entity.skill.cooking; + +import org.crandor.cache.def.impl.ItemDefinition; +import core.game.content.dialogue.DialoguePlugin; +import org.crandor.game.content.global.consumable.Consumables; +import org.crandor.game.content.global.consumable.Food; +import core.game.node.entity.skill.cooking.CookableItems; +import core.game.node.entity.skill.cooking.CookingPulse; +import org.crandor.game.interaction.NodeUsageEvent; +import org.crandor.game.interaction.UseWithHandler; +import org.crandor.game.node.Node; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.entity.player.link.RunScript; +import org.crandor.game.node.item.Item; +import org.crandor.game.node.object.GameObject; +import org.crandor.game.world.map.Direction; +import org.crandor.game.world.map.Location; +import org.crandor.net.packet.PacketRepository; +import org.crandor.net.packet.context.ChildPositionContext; +import org.crandor.net.packet.out.RepositionChild; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.plugin.Plugin; + +*/ +/** + * Handles the interaction of a raw food (or if intentionally burning cooked food) + * with a range/fire. + * @author ceik + *//* + +@InitializablePlugin +public class CookingPlugin extends UseWithHandler { + + public static int DIALOGUE_ID = 43989; + + */ +/** + * Represents the objects allowed to cook {@code Food} on. + *//* + + public static final int[] OBJECTS = new int[] { 21302, 13528, 13529, 13533, 13531, 13536, 13539, 13542, 2728, 2729, 2730, 2731, 2732, 2859, 3038, 3039, 3769, 3775, 4265, 4266, 5249, 5499, 5631, 5632, 5981, 9682, 10433, 11404, 11405, 11406, 12102, 12796, 13337, 13881, 14169, 14919, 15156, 20000, 20001, 21620, 21792, 22713, 22714, 23046, 24283, 24284, 25155, 25156, 25465, 25730, 27297, 29139, 30017, 32099, 33500, 34495, 34546, 36973, 37597, 37629, 37726, 114, 4172, 5275, 8750, 16893, 22154, 34410, 34565, 114, 9085, 9086, 9087, 12269, 15398, 25440, 25441, 2724, 2725, 2726, 4618, 4650, 5165, 6093, 6094, 6095, 6096, 8712, 9439, 9440, 9441, 10824, 17640, 17641, 17642, 17643, 18039, 21795, 24285, 24329, 27251, 33498, 35449, 36815, 36816, 37426, 40110 }; + + */ +/** + * Constructs a new {@code CookingPlugin} {@code Object}. + *//* + + public CookingPlugin() { + super(2140, 1861, 3228, 7521, 3151, 325, 319, 347, 355, 333, 339, 351, 329, 3381, 361, 10136, 5003, 379, 365, 373, 2149, 7946, 385, 397, 391, 3369, 3371, 3373, 1893, 1895, 1897, 1899, 1901, 1963, 2102, 2120, 2108, 5972, 5504, 1982, 1965, 1957, 5988, 1781, 6701, 6703, 6705, 7056, 7058, 7060, 1933, 1783, 1927, 1929, 6032, 6034, 2011, 227, 1921, 1937, 7934, 7086, 4239, 7068, 7086, 2003, 7078, 7072, 4239, 7062, 7064, 7084, 1871, 7082, 2309, 1891, 1967, 1971, 2142, 9436, 2142, 2142, 2325, 2333, 2327, 2331, 7170, 2323, 2335, 7178, 7180, 7188, 7190, 7198, 7200, 7208, 7210, 7218, 7220, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 315, 9988, 2878, 7568, 9980, 7223, 5982, 598, 4293, 10816, 2138, 2134, 3142, 2136, 1859, 3226, 7518, 3150, 327, 321, 345, 353, 335, 341, 349, 331, 3379, 359, 10138, 5001, 377, 363, 371, 2148, 7944, 383, 395, 389, 3363, 3365, 3367, 5986, 401, 1942, 4237, 2001, 7076, 1871, 7080, 2307, 1889, 2132, 2132, 2132, 2132, 2321, 2319, 7168, 2317, 7176, 7186, 7196, 7206, 7216, 2287, 317, 9986, 2876, 7566, 9984, 7224); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new CookingDialoguePlugin().init(); + for (int object : OBJECTS) { + addHandler(object, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final GameObject object = (GameObject) event.getUsedWith(); + final int food = event.getUsedItem().getId(); + //handles intentional burning (deprecates BurnMeatPlugin) + if(CookableItems.intentionalBurn(food)){ + event.getPlayer().getPulseManager().run(new CookingPulse(event.getPlayer(),object,event.getUsedItem().getId(),true)); + return true; + } + event.getPlayer().getDialogueInterpreter().open(DIALOGUE_ID, food, event.getUsedWith()); + return true; + } + + @Override + public Location getDestination(final Player player, final Node node) { + if (node.getName().toLowerCase().equals("fire")) { + return player.getLocation().getY() > node.getLocation().getY() ? node.getLocation().transform(0, 1, 0) : player.getLocation().getX() < node.getLocation().getX() ? node.getLocation().transform(-1, 0, 0) : player.getLocation().getX() > node.getLocation().getX() ? node.getLocation().transform(1, 0, 0) : node.getLocation().transform(0, -1, 0); + } else { + Direction direction = node.getDirection(); + if (direction == Direction.NORTH) { + return node.getLocation().transform(1, 1, 0); + } else if (direction == Direction.SOUTH) { + return node.getLocation().transform(-1, 0, 0); + } + return null; + } + } + + public final class CookingDialoguePlugin extends DialoguePlugin { + + */ +/** + * Represents the sinew item. + *//* + + private final Item SINEW = new Item(9436); + + */ +/** + * Represents the meat item. + *//* + + private final Item MEAT = new Item(2142); + + */ +/** + * Represents the food we're cooking. + *//* + + private int food; + + private int product; + + private boolean nonFood = false; + + */ +/** + * Represents the obejct we're cooking on. + *//* + + private GameObject object; + + */ +/** + * Constructs a new {@code CookingDialoguePlugin} {@code Object}. + *//* + + public CookingDialoguePlugin() { + */ +/** + * empty. + *//* + + } + + */ +/** + * Constructs a new {@code CookingDialoguePlugin} {@code Object}. + * @param player the player. + *//* + + public CookingDialoguePlugin(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new CookingDialoguePlugin(player); + } + + @Override + public boolean open(Object... args) { + food = ((int) args[0]); + if (args.length == 3){ + nonFood = true; + stage = 0; + product = (int)args[1]; + display(); + return true; + } + if (player.getInventory().getAmount(CookableItems.forId(food).raw) == 1) { + end(); + cook(player,object,food,1); + return true; + } + display(); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + end(); + int amount = getAmount(buttonId); + if (amount == -1) { + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int amount = (int) value; + if(nonFood){ + cookNonFood(player,food,product,amount); + return false; + } + cook(player, object, food, amount); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + } else if (amount == 28) { + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + if(nonFood){ + cookNonFood(player,food,product,amount); + } + cook(player, object, food, amount); + return false; + } + }); + } + if(nonFood){ + cookNonFood(player,food,product,amount); + break; + } + cook(player, object, food, amount); + break; + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { DIALOGUE_ID }; + } + + */ +/** + * Method used to display the content food. + *//* + + public void display() { + player.getInterfaceManager().openChatbox(307); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 307, 3, 60, 79)); + player.getPacketDispatch().sendItemZoomOnInterface(nonFood ? product : CookableItems.getCooked(food).getId(), 160, 307, 2); + player.getPacketDispatch().sendString(nonFood ? ItemDefinition.forId(product).getName() : CookableItems.getCooked(food).getName(), 307, 3); + stage = 0; + } + + public void cookNonFood(Player player, int food, int product, int amount){ + player.getPulseManager().run(new CookingPulse(player,food,amount,product,false)); + } + + public void cook(Player player, GameObject object, int food, int amount){ + player.getPulseManager().run(new CookingPulse(player,object,food,amount)); + } + + */ +/** + * Method used to get the amount to make based off the button id. + * @param buttonId the button id. + * @return the amount to make. + *//* + + private final int getAmount(final int buttonId) { + switch (buttonId) { + case 5: + return 1; + case 4: + return 5; + case 3: + return -1; + case 2: + return 28; + } + return -1; + } + + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingPulse.java new file mode 100644 index 000000000..f31c02aec --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingPulse.java @@ -0,0 +1,244 @@ +/* +package core.game.node.entity.skill.cooking; + +import org.crandor.game.content.global.SkillcapePerks; +import plugin.tutorial.TutorialSession; +import plugin.tutorial.TutorialStage; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import org.crandor.game.node.entity.impl.Animator; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.entity.player.link.audio.Audio; +import org.crandor.game.node.entity.player.link.diary.DiaryType; +import org.crandor.game.node.item.Item; +import org.crandor.game.node.object.GameObject; +import org.crandor.game.system.task.Pulse; +import org.crandor.game.world.update.flag.context.Animation; + +import static org.crandor.tools.RandomFunction.RANDOM; + +*/ +/** + * Pulse for cooking + * @author ceik + *//* + +public final class CookingPulse extends Pulse { + private static Player player; + + private static GameObject node; + + private static boolean intentionalBurn = false; + + //range animation + private static final Animation RANGE_ANIMATION = new Animation(883, Animator.Priority.HIGH); + + //fire animation + private static final Animation FIRE_ANIMATION = new Animation(897, Animator.Priority.HIGH); + + //Cooking sound + public static final Audio SOUND = new Audio(2393, 1, 1); + + //food's ID + private final int food; + + //amount to cook + private int amount; + + //whether or not we are cooking food + private boolean isFood = true; + + */ +/** + * Constructs a new {@code CookingPulse} {@code Object}. + * @param player the player. + * @param node the object node (fire/range) + * @param food the food to cook. + * @param amount the amount to cook + *//* + + public CookingPulse(Player player, GameObject node, final int food, final int amount) { + this.player = player; + this.node = node; + this.food = food; + this.amount = amount; + } + + */ +/** + * Another constructor for the Cooking Pulse, this time flags it as an intentional burn + * @param player the player cooking + * @param node the object being used to cook (range/fire) + * @param food the item being cooked + * @param intentionalBurn whether or not it's an intentional burn + *//* + + public CookingPulse(Player player, GameObject node, final int food, final boolean intentionalBurn) { + this.player = player; + this.food = food; + this.amount = 1; + this.intentionalBurn = intentionalBurn; + } + + */ +/** + * handler for cooking non-food items + * @param player the player cooking + * @param item the item being cooked + * @param amount the amount the player has + * @param isFood whether we are cooking food + *//* + + public CookingPulse(Player player, final int item, int amount, int product, final boolean isFood){ + this.player = player; + this.food = item; + this.amount = amount; + this.isFood = isFood; + } + + @Override + public void start() { + if (intentionalBurn || checkRequirements()) { + super.start(); + } + } + + @Override + public boolean pulse() { + if(intentionallyBurn(food) || !checkRequirements()){ + return true; + } + return reward(); + } + + public boolean checkRequirements() { //check if the player has the requirements + if (!node.isActive()) { + return true; + } + //handle cook's assistant range + if(node.getId() == 114 && !player.getQuestRepository().isComplete("Cook's Assistant")){ + player.getPacketDispatch().sendMessage("You need to have completed the Cook's Assistant quest in order to use that range."); + return false; + } + if (player.getSkills().getLevel(Skills.COOKING) < CookableItems.forId(food).level) { + player.getDialogueInterpreter().sendDialogue("You need a cooking level of " + CookableItems.forId(food).level + " to cook this."); + return false; + } + int inventoryAmount = player.getInventory().getAmount(CookableItems.forId(food).raw); + if (amount > inventoryAmount) { + amount = inventoryAmount; + } + if (amount < 1) { + return false; + } + return true; + } + + public void animate() { + player.animate(getAnimation(node)); + } + + public boolean reward() { + if (getDelay() == 1) { + setDelay(node.getName().toLowerCase().equals("range") ? 5 : 4); + return false; + } + //handle tutorial stuff + if(!TutorialSession.getExtension(player).finished()){ + updateTutorial(player); + amount --; + return true; + } + + if (cook(player,node,isBurned(player,node,food),food)) { + amount--; + } else { + return true; + } + return amount < 1; + } + + public boolean cook(final Player player, final GameObject object, final boolean burned, final int food) { + Item item = CookableItems.getRaw(food); + if(intentionalBurn){ //stops the cook function from being ran if we burning on purpose + return false; + } + //lumbridge diary + if (CookableItems.forId(food) != null && player.getInventory().remove(item)) { + if (!burned) { + player.getInventory().add(CookableItems.getCooked(food)); + } else { + player.getInventory().add(CookableItems.getBurnt(food)); + } + player.getSkills().addExperience(Skills.COOKING, burned ? 0 : CookableItems.forId(food).experience, true); + player.getPacketDispatch().sendMessage(getMessage(item, burned)); + player.getAudioManager().send(SOUND); + return true; + } + return false; + } + + public boolean intentionallyBurn(int food){ + if(intentionalBurn && player.getInventory().remove(new Item(food))){ //only runs if it's flagged as intentional burning + player.getInventory().add(CookableItems.getIntentionalBurn(food)); + player.getPacketDispatch().sendMessage("You deliberately burn the perfectly good piece of meat."); + return true; + } else { + return false; + } + } + + public String getMessage(Item food, boolean burned){ + if(!burned) { + return "You manage to cook some " + food.getName().replace("Raw ", ""); + } else { + return "You accidentally burn some " + food.getName().replace("Raw ",""); + } + } + + public boolean isBurned(final Player player, final GameObject object, int food) { + double burn_stop = (double)CookableItems.getBurnLevel(food); + if (SkillcapePerks.hasSkillcapePerk(player, SkillcapePerks.COOKING)) { + return false; + } + if (player.getSkills().getLevel(Skills.COOKING) > burn_stop) { + return false; + } + double burn_chance = 60.0 + (object.getName().equals("fire") ? 1.00 : 0) - (object.getId() == 114 ? 1.00 : 0); + double cook_level = (double) player.getSkills().getLevel(Skills.COOKING); + double lev_needed = (double) CookableItems.forId(food).level; + double multi_a = (burn_stop - lev_needed); + double burn_dec = (burn_chance / multi_a); + double multi_b = (cook_level - lev_needed); + burn_chance -= (multi_b * burn_dec); + double randNum = RANDOM.nextDouble() * 100.0; + return !(burn_chance <= randNum); + } + + public boolean updateTutorial(Player player){ + if (TutorialSession.getExtension(player).getStage() == 14) { + TutorialStage.load(player, 15, false); + return cook(player, node,true, food); + } else if (TutorialSession.getExtension(player).getStage() == 15) { + TutorialStage.load(player, 16, false); + return cook(player, node, false, food); + } + if (TutorialSession.getExtension(player).getStage() == 20) { + TutorialStage.load(player, 21, false); + return cook(player, node, false, food); + } + return cook(player, node, isBurned(player,node,food),food); + } + + */ +/** + * Gets the animation to use based on the interacting object. + * @param object the object. + * @return the animation. + *//* + + private final Animation getAnimation(final GameObject object) { + return !object.getName().toLowerCase().equals("fire") ? RANGE_ANIMATION : FIRE_ANIMATION; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingRecipePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingRecipePlugin.java new file mode 100644 index 000000000..bde7a9264 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingRecipePlugin.java @@ -0,0 +1,103 @@ +package core.game.node.entity.skill.cooking; + +import core.plugin.Initializable; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.item.Item; +import core.plugin.Plugin; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a cooking recipe plugin. This is used to handle the multiple + * recipes used in cooking these recipes can range from making a pizza or making + * a pie. + * @author 'Vexia + * @version 1.9 + */ +@Initializable +public final class CookingRecipePlugin extends UseWithHandler { + + /** + * Constructs a new {@code CookingRecipePlugin} {@code Object}. + */ + public CookingRecipePlugin() { + super(getAllowedNodes()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Recipe recipe : Recipe.RECIPES) { + for (Item ingredient : recipe.getIngredients()) { + addHandler(ingredient.getId(), ITEM_TYPE, this); + } + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Recipe recipe = null; + for (Recipe temp : Recipe.RECIPES) { + if (temp.isSingular()) { + if (temp.getBase().getId() == event.getUsedItem().getId() || temp.getBase().getId() == event.getBaseItem().getId()) { + for (Item ingredient : temp.getIngredients()) { + if (ingredient.getId() == event.getBaseItem().getId() || ingredient.getId() == event.getUsedItem().getId()) { + recipe = temp; + break; + } + } + } + } else { + Item part = null; + Item ingredient = null; + for (int k = 0; k < temp.getParts().length; k++) { + for (int i = 0; i < temp.getIngredients().length; i++) { + part = temp.getParts()[k]; + ingredient = temp.getIngredients()[i]; + if (part.getId() == event.getUsedItem().getId() && ingredient.getId() == event.getBaseItem().getId() || part.getId() == event.getBaseItem().getId() && ingredient.getId() == event.getUsedItem().getId()) { + if (k == i) {// represents that this ingredient can + // mix with the other. + recipe = temp; + break; + } + } + } + } + } + } + if (recipe != null) { + recipe.mix(event.getPlayer(), event); + return true; + } + return false; + } + + /** + * Method used to get the allowed nodes for this plugin. + * @return the allowed nodes. + */ + private final static int[] getAllowedNodes() { + List bases = new ArrayList<>(); + for (Recipe recipe : Recipe.RECIPES) { + for (Item base : recipe.getParts()) { + if (bases.contains(base.getId())) { + continue; + } + bases.add(base.getId()); + } + if (bases.contains(recipe.getBase().getId())) { + continue; + } + bases.add(recipe.getBase().getId()); + } + int[] baseArray = new int[bases.size()]; + for (int i = 0; i < bases.size(); i++) { + baseArray[i] = bases.get(i); + } + return baseArray; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingRewrite.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingRewrite.java new file mode 100644 index 000000000..4d53c780d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/CookingRewrite.java @@ -0,0 +1,79 @@ +package core.game.node.entity.skill.cooking; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.Items; + +//author: Ceik +@Initializable +public class CookingRewrite extends UseWithHandler { + // fires/ranges + public static final int[] OBJECTS = new int[] { 24313,21302, 13528, 13529, 13533, 13531, 13536, 13539, 13542, 2728, 2729, 2730, 2731, 2732, 2859, 3038, 3039, 3769, 3775, 4265, 4266, 5249, 5499, 5631, 5632, 5981, 9682, 10433, 11404, 11405, 11406, 12102, 12796, 13337, 13881, 14169, 14919, 15156, 20000, 20001, 21620, 21792, 22713, 22714, 23046, 24283, 24284, 25155, 25156, 25465, 25730, 27297, 29139, 30017, 32099, 33500, 34495, 34546, 36973, 37597, 37629, 37726, 114, 4172, 5275, 8750, 16893, 22154, 34410, 34565, 114, 9085, 9086, 9087, 12269, 15398, 25440, 25441, 2724, 2725, 2726, 4618, 4650, 5165, 6093, 6094, 6095, 6096, 8712, 9439, 9440, 9441, 10824, 17640, 17641, 17642, 17643, 18039, 21795, 24285, 24329, 27251, 33498, 35449, 36815, 36816, 37426, 40110 }; + + // raw foods + public CookingRewrite() { + super(2140, 1861, 3228, 7521, 3151, 325, 319, 347, 355, 333, 339, 351, 329, 3381, 361, 10136, 5003, 379, 365, 373, 2149, 7946, 385, 397, 391, 3369, 3371, 3373, 1893, 1895, 1897, 1899, 1901, 1963, 2102, 2120, 2108, 5972, 5504, 1982, 1965, 1957, 5988, 1781, 6701, 6703, 6705, 7056, 7058, 7060, 1933, 1783, 1927, 1929, 6032, 6034, 2011, 227, 1921, 1937, 7934, 7086, 4239, 7068, 7086, 2003, 7078, 7072, 4239, 7062, 7064, 7084, 1871, 7082, 2309, 1891, 1967, 1971, 2142, 9436, 2142, 2142, 2325, 2333, 2327, 2331, 7170, 2323, 2335, 7178, 7180, 7188, 7190, 7198, 7200, 7208, 7210, 7218, 7220, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 315, 9988, 2878, 7568, 9980, 7223, 5982, 598, 4293, 10816, 2138, 2134, 3142, 2136, 1859, 3226, 7518, 3150, 327, 321, 345, 353, 335, 341, 349, 331, 3379, 359, 10138, 5001, 377, 363, 371, 2148, 7944, 383, 395, 389, 3363, 3365, 3367, 5986, 401, 1942, 4237, 2001, 7076, 1871, 7080, 2307, 1889, 2132, 2132, 2132, 2132, 2321, 2319, 7168, 2317, 7176, 7186, 7196, 7206, 7216, 2287, 317, 9986, 2876, 7566, 9984, 7224, Items.RAW_OOMLIE_2337, Items.WRAPPED_OOMLIE_2341, Items.COOKED_OOMLIE_WRAP_2343); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new FoodCookingDialogue().init(); + for (int object : OBJECTS) { + addHandler(object, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + int item = event.getUsedItem().getId(); + Player player = event.getPlayer(); + GameObject object = (GameObject) event.getUsedWith(); + boolean range = object.getName().toLowerCase().contains("range"); + + //range checks when necessary + switch(item){ + case Items.RAW_BEEF_2132: //sinew + if(range) { + player.getDialogueInterpreter().open(FoodCookingDialogue.DialogueID, item, 9436, true, object); + return true; + } + break; + case Items.SEAWEED_401: //soda ash + if(range) { + player.getDialogueInterpreter().open(FoodCookingDialogue.DialogueID, item, 1781, false, object); + return true; + } + break; + case Items.BREAD_DOUGH_2307: + case Items.UNCOOKED_CAKE_1889: //cake, bread + if(!range){ + player.getPacketDispatch().sendMessage("You need to cook this on a range."); + return false; + } + break; + } + + //cook a standard item + player.getDialogueInterpreter().open(FoodCookingDialogue.DialogueID,item,event.getUsedWith()); + return true; + } + + public static void cook(Player player, GameObject object, int initial, int product, int amount){ + Item food = new Item(initial); + if(food.getName().toLowerCase().contains("pizza")){ + player.getPulseManager().run(new PizzaCookingPulse(player,object,initial,product,amount)); + } else if (food.getName().toLowerCase().contains("pie")){ + player.getPulseManager().run(new PieCookingPulse(player,object,initial,product,amount)); + } else if(CookableItems.intentionalBurn(initial)) { + player.getPulseManager().run(new IntentionalBurnPulse(player, object, initial, product, amount)); + } else { + player.getPulseManager().run(new StandardCookingPulse(player, object, initial, product, amount)); + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/FireOptionPotteryPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/FireOptionPotteryPlugin.java new file mode 100644 index 000000000..ccab1e4df --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/FireOptionPotteryPlugin.java @@ -0,0 +1,34 @@ +package core.game.node.entity.skill.cooking; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used for the fire pottery object. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FireOptionPotteryPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(2643).getHandlers().put("option:fire", this); + ObjectDefinition.forId(4308).getHandlers().put("option:fire", this); + ObjectDefinition.forId(11601).getHandlers().put("option:fire", this); + ObjectDefinition.forId(34802).getHandlers().put("option:fire", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.faceLocation(node.getLocation()); + player.getDialogueInterpreter().open(99843, true, true); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/FoodCookingDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/FoodCookingDialogue.java new file mode 100644 index 000000000..2d644e655 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/FoodCookingDialogue.java @@ -0,0 +1,125 @@ +package core.game.node.entity.skill.cooking; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.object.GameObject; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; + +public class FoodCookingDialogue extends DialoguePlugin { + public static final int DialogueID = 1238503; + private int initial,product; + private boolean sinew = false; + private GameObject object; + + public FoodCookingDialogue(){ + /** + * Empty + */ + } + public FoodCookingDialogue(Player player){super(player);} + + @Override + public DialoguePlugin newInstance(Player player) { + return new FoodCookingDialogue(player); + } + + @Override + public boolean open(Object... args) { + stage = 0; + switch(args.length){ + case 2: + initial = (int) args[0]; + if(CookableItems.intentionalBurn(initial)){ // checks intentional burning + product = CookableItems.getIntentionalBurn(initial).getId(); + } else { + product = CookableItems.forId(initial).cooked; + + } + object = (GameObject) args[1]; + break; + case 4: + initial = (int) args[0]; + product = (int) args[1]; + sinew = (boolean) args[2]; + object = (GameObject) args[3]; + if(sinew){ + player.getDialogueInterpreter().sendOptions("Select one","Dry the meat into sinew","Cook the meat"); + stage = 100; + return true; + } + break; + } + display(); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch(stage){ + case 0: + end(); + int amount = getAmount(buttonId); + switch(amount){ + case -1: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + int amount = (int) value; + CookingRewrite.cook(player, object, initial, product, amount); + return false; + } + }); + player.getDialogueInterpreter().sendInput(false,"Enter an amount:"); + break; + default: + end(); + CookingRewrite.cook(player,object,initial,product,amount); + break; + } + break; + case 100: + switch(buttonId){ + case 1: + CookingRewrite.cook(player,object,initial,product,1); + break; + case 2: + product = CookableItems.forId(initial).cooked; + display(); + break; + } + } + return true; + } + + private final int getAmount(final int buttonId) { + switch (buttonId) { + case 5: + return 1; + case 4: + return 5; + case 3: + return -1; + case 2: + return player.getInventory().getAmount(initial); + } + return -1; + } + + public void display() { + player.getInterfaceManager().openChatbox(307); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 307, 3, 60, 90)); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player,307,2,208,20)); + player.getPacketDispatch().sendItemZoomOnInterface(product, 160, 307, 2); + player.getPacketDispatch().sendString(ItemDefinition.forId(product).getName(), 307, 3); + stage = 0; + } + + @Override + public int[] getIds() { + return new int[] {DialogueID}; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/IntentionalBurnPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/IntentionalBurnPulse.java new file mode 100644 index 000000000..3a0493f5b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/IntentionalBurnPulse.java @@ -0,0 +1,51 @@ +package core.game.node.entity.skill.cooking; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; + +public class IntentionalBurnPulse extends StandardCookingPulse { + int initial,product,amount; + Player player; + GameObject object; + IntentionalBurnPulse(Player player, GameObject object, int initial, int product, int amount){ + super(player,object,initial,product,amount); + this.initial = initial; + this.product = product; + this.amount = amount; + this.player = player; + this.object = object; + } + + @Override + public boolean checkRequirements() { + return true; + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + setDelay(object.getName().toLowerCase().equals("range") ? 5 : 4); + return false; + } + if(cook(player,null,false,initial,product)) { + amount--; + } + return amount < 1; + } + + @Override + public boolean cook(Player player, GameObject object, boolean burned, int initial, int product) { + super.animate(); + Item initialItem = new Item(initial); + Item productItem = new Item(product); + + if (player.getInventory().remove(initialItem)) { + player.getInventory().add(productItem); + player.getPacketDispatch().sendMessage(getMessage(initialItem, productItem, burned)); + player.getAudioManager().send(SOUND); + return true; + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/MakeDoughPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/MakeDoughPlugin.java new file mode 100644 index 000000000..6a01b0652 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/MakeDoughPlugin.java @@ -0,0 +1,160 @@ +package core.game.node.entity.skill.cooking; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Represents the plugin used to make dough. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MakeDoughPlugin extends UseWithHandler { + + /** + * Represents the water sources. + */ + private static final Item[][] SOURCES = new Item[][] { { new Item(1929), new Item(1925) }, { new Item(1921), new Item(1923) }, { new Item(1937), new Item(1935) } }; + + /** + * Constructs a new {@code MakeDoughPlugin} {@code Object}. + */ + public MakeDoughPlugin() { + super(1933); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 0; i < SOURCES.length; i++) { + addHandler(SOURCES[i][0].getId(), ITEM_TYPE, this); + } + new MakeDoughDialogue().init(); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getAttributes().containsKey("tut-island")) { + return handleTutorialIsland(player, event); + } + Item[] data = null; + for (int i = 0; i < SOURCES.length; i++) { + if (SOURCES[i][0].getId() == event.getUsedItem().getId() || SOURCES[i][0].getId() == event.getBaseItem().getId()) { + data = SOURCES[i]; + break; + } + } + player.getDialogueInterpreter().open(59 << 16 | 1, (Object) data); + return false; + } + + /** + * Method used to handle the tutorial isalnd making dough. + * @param player the player. + * @param event the event. + */ + private boolean handleTutorialIsland(final Player player, final NodeUsageEvent event) { + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return true; + } + player.lock(3); + player.getInventory().remove(event.getBaseItem(), new Item(1933, 1)); + player.getInventory().add(new Item(3727, 1), new Item(1931, 1), new Item(2307, 1)); + if (TutorialSession.getExtension(player).getStage() == 19) { + TutorialStage.load(player, 20, false); + } + return true; + } + + /** + * Represents the plugin used to make dough.. + * @author 'Vexia + * @version 1.0 + */ + public static final class MakeDoughDialogue extends DialoguePlugin { + + /** + * Represents the dough items to make. + */ + private static final Item[] DOUGHS = new Item[] { new Item(2307), new Item(1953), new Item(2283), new Item(1863) }; + + /** + * Represents the pot of flour item. + */ + private static final Item FLOUR = new Item(1933); + + /** + * Represents the water source data. + */ + private Item[] waterData; + + /** + * Constructs a new {@code MakeDoughDialogue} {@code Object}. + */ + public MakeDoughDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code MakeDoughDialogue} {@code Object}. + * @param player the player. + */ + public MakeDoughDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new MakeDoughDialogue(player); + } + + @Override + public boolean open(Object... args) { + waterData = (Item[]) args[0]; + interpreter.sendOptions("What do you wish to make?", "Bread dough.", "Pastry dough.", "Pizza dough.", "Pitta dough."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + makeDough(DOUGHS[buttonId - 1]); + end(); + break; + } + return true; + } + + /** + * Method used to make a dough item. + * @param dough the dough. + */ + private void makeDough(final Item dough) { + if (player.getInventory().remove(waterData[0]) && player.getInventory().remove(FLOUR)) { + player.getInventory().add(waterData[1]); + player.getInventory().add(dough); + player.getInventory().add(new Item(1931), player); + player.getPacketDispatch().sendMessage("You mix the flower and water to make some " + dough.getName().toLowerCase() + "."); + } + } + + @Override + public int[] getIds() { + return new int[] { 59 << 16 | 1 }; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/MakeStewPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/MakeStewPlugin.java new file mode 100644 index 000000000..4a5102f4b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/MakeStewPlugin.java @@ -0,0 +1,62 @@ +package core.game.node.entity.skill.cooking; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the stew plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class MakeStewPlugin extends UseWithHandler { + + /** + * Constructs a new {@code MakeStewPlugin} {@code Object}. + */ + public MakeStewPlugin() { + super(2001); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(114, OBJECT_TYPE, this); + addHandler(2728, OBJECT_TYPE, this); + addHandler(2729, OBJECT_TYPE, this); + addHandler(2730, OBJECT_TYPE, this); + addHandler(2731, OBJECT_TYPE, this); + addHandler(2859, OBJECT_TYPE, this); + addHandler(3039, OBJECT_TYPE, this); + addHandler(4172, OBJECT_TYPE, this); + addHandler(5275, OBJECT_TYPE, this); + addHandler(8750, OBJECT_TYPE, this); + addHandler(9682, OBJECT_TYPE, this); + addHandler(12102, OBJECT_TYPE, this); + addHandler(14919, OBJECT_TYPE, this); + addHandler(16893, OBJECT_TYPE, this); + addHandler(21792, OBJECT_TYPE, this); + addHandler(22154, OBJECT_TYPE, this); + addHandler(22713, OBJECT_TYPE, this); + addHandler(22714, OBJECT_TYPE, this); + addHandler(24283, OBJECT_TYPE, this); + addHandler(24284, OBJECT_TYPE, this); + addHandler(25730, OBJECT_TYPE, this); + addHandler(33500, OBJECT_TYPE, this); + addHandler(34410, OBJECT_TYPE, this); + addHandler(34495, OBJECT_TYPE, this); + addHandler(34546, OBJECT_TYPE, this); + addHandler(34565, OBJECT_TYPE, this); + addHandler(36973, OBJECT_TYPE, this); + addHandler(37629, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + event.getPlayer().getDialogueInterpreter().open(43989, event.getUsedItem().getId(), "stew"); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/NettleTeaPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/NettleTeaPlugin.java new file mode 100644 index 000000000..40464a6b6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/NettleTeaPlugin.java @@ -0,0 +1,61 @@ +package core.game.node.entity.skill.cooking; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to create nettle tea in a cup. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class NettleTeaPlugin extends UseWithHandler { + + /** + * Represents the empty cup item. + */ + private static final Item EMPTY_CUP = new Item(1980, 1); + + /** + * Represents the nettle tea item. + */ + private static final Item NETTLE_TEA = new Item(4239, 1); + + /** + * Represents the bowl item. + */ + private static final Item BOWL = new Item(1923); + + /** + * Represents the cup of tea item. + */ + private static final Item CUP_OF_TEA = new Item(4242, 1); + + /** + * Constructs a new {@code NettleTeaPlugin} {@code Object}. + */ + public NettleTeaPlugin() { + super(1980); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(4239, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(EMPTY_CUP) && player.getInventory().remove(NETTLE_TEA)) { + player.getInventory().add(BOWL); + player.getInventory().add(CUP_OF_TEA); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/NettleWaterPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/NettleWaterPlugin.java new file mode 100644 index 000000000..2b851ddd9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/NettleWaterPlugin.java @@ -0,0 +1,35 @@ +package core.game.node.entity.skill.cooking; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * @author Adam + */ +@Initializable +public class NettleWaterPlugin extends UseWithHandler { + + public NettleWaterPlugin() { + super(1921); + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.getInventory().remove(new Item(1921, 1)); + player.getInventory().remove(new Item(4241, 1)); + player.getInventory().add(new Item(4237, 1)); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(4241, ITEM_TYPE, this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/PieCookingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/PieCookingPulse.java new file mode 100644 index 000000000..1cced5c8c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/PieCookingPulse.java @@ -0,0 +1,34 @@ +package core.game.node.entity.skill.cooking; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; + +public class PieCookingPulse extends StandardCookingPulse { + private GameObject object; + private Player player; + public PieCookingPulse(Player player, GameObject object, int initial, int product, int amount){ + super(player,object,initial,product,amount); + this.object = object; + this.player = player; + } + + @Override + public boolean checkRequirements() { + if(!object.getName().toLowerCase().contains("range")){ + player.getPacketDispatch().sendMessage("This can only be cooked on a range."); + return false; + } + return super.checkRequirements(); + } + + @Override + public String getMessage(Item food, Item product, boolean burned) { + if(burned){ + return "You accidentally burn the pie."; + } else { + return "You successfully bake a delicious " + ItemDefinition.forId(product.getId()).getName().toLowerCase() + "."; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/PieShellPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/PieShellPlugin.java new file mode 100644 index 000000000..57baf4c4f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/PieShellPlugin.java @@ -0,0 +1,56 @@ +package core.game.node.entity.skill.cooking; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the pie shell making plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class PieShellPlugin extends UseWithHandler { + + /** + * Represents the pie sell item. + */ + private static final Item PIE_SHELL = new Item(2315, 1); + + /** + * Represents the pie dish item. + */ + private static final Item PIE_DISH = new Item(2313, 1); + + /** + * Represents the pastry dough item. + */ + private static final Item PASTRY_DOUGH = new Item(1953, 1); + + /** + * Constructs a new {@code PieMakingPlugin} {@code Object}. + */ + public PieShellPlugin() { + super(1953); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2313, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getInventory().remove(PASTRY_DOUGH, PIE_DISH)) { + player.getInventory().add(PIE_SHELL); + player.getPacketDispatch().sendMessage("You put the pastry dough into the pie dish to make a pie shell."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/PizzaCookingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/PizzaCookingPulse.java new file mode 100644 index 000000000..bde151b12 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/PizzaCookingPulse.java @@ -0,0 +1,34 @@ +package core.game.node.entity.skill.cooking; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; + +public class PizzaCookingPulse extends StandardCookingPulse { + GameObject object; + Player player; + + PizzaCookingPulse(Player player, GameObject object,int initial, int product, int amount){ + super(player,object,initial,product,amount); + this.object = object; + this.player = player; + } + + @Override + public boolean checkRequirements() { + if(!object.getName().toLowerCase().contains("range")){ + player.getPacketDispatch().sendMessage("This can only be cooked on a range."); + return false; + } + return super.checkRequirements(); + } + + @Override + public String getMessage(Item food, Item product, boolean burned) { + if(burned){ + return "You accidentally burn the pizza."; + } else { + return "You cook a delicious looking pizza."; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/SkeweredFoodPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/SkeweredFoodPlugin.java new file mode 100644 index 000000000..21b08357c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/SkeweredFoodPlugin.java @@ -0,0 +1,111 @@ +package core.game.node.entity.skill.cooking; + +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to make skwered items. + * @author 'Vexia + * @date 22/12/2013 + */ +@Initializable +public class SkeweredFoodPlugin extends UseWithHandler { + + /** + * Represents the level required. + */ + private final int LEVEL = 20; + + /** + * Constructs a new {@code SkeweredFoodPlugin} {@code Object}. + */ + public SkeweredFoodPlugin() { + super(7225); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (SkeweredSet set : SkeweredSet.values()) { + addHandler(set.getRaw().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getSkills().getLevel(Skills.FIREMAKING) < LEVEL) { + player.getPacketDispatch().sendMessage("You meed a Firemaking level of at least " + LEVEL + " in order to do this."); + return true; + } + final SkeweredSet set = SkeweredSet.forItem(event.getBaseItem().getId() == 7225 ? event.getUsedItem() : event.getBaseItem()); + if (player.getInventory().remove(event.getBaseItem()) && player.getInventory().remove(event.getUsedItem())) { + player.getInventory().add(set.getProduct()); + } + return true; + } + + /** + * Represents a set of skwered items. + * @author 'Vexia + * @date 22/12/2013 + */ + public enum SkeweredSet { + RABBIT(new Item(3226), new Item(7224)), CHOMPY(new Item(2876), new Item(7230)), BIRD(new Item(9978), new Item(9984)), BEAST(new Item(9986), new Item(9992)); + + /** + * Represents the raw item. + */ + private final Item raw; + + /** + * Represents the product item. + */ + private final Item product; + + /** + * Constructs a new {@code SkeweredFoodPlugin} {@code Object}. + * @param raw the raw item. + * @param product the product. + */ + private SkeweredSet(Item raw, Item product) { + this.raw = raw; + this.product = product; + } + + /** + * Gets the raw. + * @return The raw. + */ + public Item getRaw() { + return raw; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the skwered set. + * @param item the item. + * @return the set. + */ + public static SkeweredSet forItem(final Item item) { + for (SkeweredSet set : values()) { + if (set.getRaw().getId() == item.getId()) { + return set; + } + } + return null; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/StandardCookingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/StandardCookingPulse.java new file mode 100644 index 000000000..a71fdbb2b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/StandardCookingPulse.java @@ -0,0 +1,253 @@ +package core.game.node.entity.skill.cooking; + +import core.game.container.impl.EquipmentContainer; +import core.tools.Items; +import core.game.world.map.Location; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.impl.Animator; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +import static core.tools.RandomFunction.RANDOM; + +public class StandardCookingPulse extends Pulse { + //range animation + private static final Animation RANGE_ANIMATION = new Animation(883, Animator.Priority.HIGH); + + //fire animation + private static final Animation FIRE_ANIMATION = new Animation(897, Animator.Priority.HIGH); + + //Cooking sound + public static final Audio SOUND = new Audio(2577, 1, 1); + + private int initial, product, amount, level; + private GameObject object; + private Player player; + private double experience; + private boolean burned = false; + + public StandardCookingPulse(Player player, GameObject object, int initial, int product, int amount) { + this.player = player; + this.object = object; + this.initial = initial; + this.product = product; + this.amount = amount; + } + + @Override + public void start() { + if (checkRequirements()) { + super.start(); + cook(player, object, CookableItems.cookingMap.get(initial) != null && isBurned(player, object, initial), initial, product); + amount--; + } + } + + @Override + public boolean pulse() { + if (!checkRequirements()) { + return true; + } + return reward(); + } + + public void animate() { + player.animate(getAnimation(object)); + } + + public boolean checkRequirements() { + CookableItems properties = CookableItems.forId(initial); + this.level = 1; + this.experience = 0; + if (properties != null) { + // Handle Cook's Assistant range + if (object.getId() == 114 && !player.getQuestRepository().isComplete("Cook's Assistant")) { + player.getPacketDispatch().sendMessage("You need to have completed the Cook's Assistant quest in order to use that range."); + return false; + } + + //check level + if (player.getSkills().getLevel(Skills.COOKING) < properties.level) { + player.getDialogueInterpreter().sendDialogue("You need a cooking level of " + properties.level + " to cook this."); + return false; + } + + this.level = properties.level; + this.experience = properties.experience; + this.burned = isBurned(player, object, initial); + } + if (amount < 1) { + return false; + } + + if(!object.isActive()){ + return false; + } + return true; + } + + public boolean reward() { + if (getDelay() == 1) { + setDelay(object.getName().toLowerCase().equals("range") ? 5 : 4); + return false; + } + //handle tutorial stuff + if (!TutorialSession.getExtension(player).finished()) { + updateTutorial(player); + amount--; + return true; + } + + if (cook(player, object, burned, initial, product)) { + amount--; + } else { + return true; + } + return amount < 1; + } + + public boolean isBurned(final Player player, final GameObject object, int food) { + boolean hasGauntlets = player.getEquipment().containsItem(new Item(Items.COOKING_GAUNTLETS_775)); + double burn_stop = (double) CookableItems.getBurnLevel(food); + if (hasGauntlets && (food == Items.RAW_SWORDFISH_371 || food == Items.RAW_LOBSTER_377 || food == Items.RAW_SHARK_383)) { + burn_stop -= 6; + } + if (player.getSkills().getLevel(Skills.COOKING) > burn_stop) { + return false; + } + double burn_chance = 60.0 + (object.getName().equals("fire") ? 1.00 : 0) - (object.getId() == 114 ? 1.00 : 0); + double cook_level = (double) player.getSkills().getLevel(Skills.COOKING); + double lev_needed = (double) CookableItems.forId(food).level; + double multi_a = (burn_stop - lev_needed); + double burn_dec = (burn_chance / multi_a); + double multi_b = (cook_level - lev_needed); + burn_chance -= (multi_b * burn_dec); + double randNum = RANDOM.nextDouble() * 100.0; + return !(burn_chance <= randNum); + } + + public boolean cook(final Player player, final GameObject object, final boolean burned, final int initial, final int product) { + Item initialItem = new Item(initial); + Item productItem = new Item(product); + player.lock(getDelay()); + animate(); + + //lumbridge diary + if (object.getId() == 114 && player.getViewport().getRegion().getId() == 12850 && !player.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE).isComplete(0, 7)) { + player.getAchievementDiaryManager().updateTask(player, DiaryType.LUMBRIDGE, 0, 7, true); + } + //handle special cooking results (spits, cake, etc) that don't justify separate plugin + switch (initial) { + case Items.RAW_BEAST_MEAT_9986: + case Items.RAW_CHOMPY_2876: + case Items.RAW_JUBBLY_7566: + case Items.SKEWERED_BIRD_MEAT_9984: + case Items.RAW_RABBIT_3226: // Iron spits + case Items.IRON_SPIT_7225: + if (RandomFunction.random(15) == 5) { + player.getPacketDispatch().sendMessage("Your iron spit seems to have broken in the proccess."); + } else { + if (!player.getInventory().add(new Item(Items.IRON_SPIT_7225))) { + GroundItemManager.create(new Item(Items.IRON_SPIT_7225), player.getLocation(), player); + } + } + break; + case Items.UNCOOKED_CAKE_1889: //cake + if (!player.getInventory().add(new Item(Items.CAKE_TIN_1887))) { + GroundItemManager.create(new Item(Items.CAKE_TIN_1887), player); + } + break; + } + if (player.getInventory().remove(initialItem)) { + if (!burned) { + player.getInventory().add(productItem); + player.getSkills().addExperience(Skills.COOKING, experience, true); + + int playerRegion = player.getViewport().getRegion().getId(); + + // Achievement Diary Handling + if (productItem.getId() == Items.BASS_365 + && playerRegion == 11317 + && player.getAttribute("diary:seers:bass-caught", false)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 1, 11); + } + + if (productItem.getId() == Items.SHARK_385 + && playerRegion == 11317 + && player.getEquipment().get(EquipmentContainer.SLOT_HANDS) != null && player.getEquipment().get(EquipmentContainer.SLOT_HANDS).getId() == Items.COOKING_GAUNTLETS_775 + && !player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 2, 8)) { + player.setAttribute("/save:diary:seers:cooked-shark", 1 + player.getAttribute("diary:seers:cooked-shark", 0)); + if (player.getAttribute("diary:seers:cooked-shark", 0) >= 5) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 8); + } + } + + // Cook some rat meat on a campfire in Lumbridge Swamp + System.out.println(object.getName()); + if (initialItem.getId() == Items.RAW_RAT_MEAT_2134 && object.getName().toLowerCase().contains("fire") && (playerRegion == 12593 || playerRegion == 12849)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 10); + } + + // Cook a lobster on the range in Lumbridge Castle kitchen + if (productItem.getId() == Items.LOBSTER_379 && object.getId() == 114 && player.getLocation().withinDistance(Location.create(3211, 3215, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 4); + } + + } else { + player.getInventory().add(CookableItems.getBurnt(initial)); + } + player.getPacketDispatch().sendMessage(getMessage(initialItem, productItem, burned)); + player.getAudioManager().send(SOUND); + return true; + } + return false; + } + + public String getMessage(Item food, Item product, boolean burned) { + if (food.getId() == Items.RAW_OOMLIE_2337) { + return "The meat is far too delicate to cook like this. Perhaps you should wrap something around it to protect it from the heat."; + } + if (CookableItems.intentionalBurn(food.getId())) { + return "You deliberately burn the perfectly good piece of meat."; + } + switch (product.getId()) { + case Items.SINEW_9436: + return "You dry the meat into sinew."; + case Items.SODA_ASH_1781: + return "You burn the seaweed into soda ash."; + } + if (!burned) { + return "You manage to cook some " + food.getName().replace("Raw ", ""); + } else { + return "You accidentally burn some " + food.getName().replace("Raw ", ""); + } + } + + public boolean updateTutorial(Player player) { + if (TutorialSession.getExtension(player).getStage() == 14) { + TutorialStage.load(player, 15, false); + return cook(player, object, true, initial, product); + } else if (TutorialSession.getExtension(player).getStage() == 15) { + TutorialStage.load(player, 16, false); + return cook(player, object, false, initial, product); + } + if (TutorialSession.getExtension(player).getStage() == 20) { + TutorialStage.load(player, 21, false); + return cook(player, object, false, initial, product); + } + return cook(player, object, burned, initial, product); + } + + private Animation getAnimation(final GameObject object) { + return !object.getName().toLowerCase().equals("fire") ? RANGE_ANIMATION : FIRE_ANIMATION; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/WatermelonSlicePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/WatermelonSlicePlugin.java new file mode 100644 index 000000000..1fd4040a1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/WatermelonSlicePlugin.java @@ -0,0 +1,59 @@ +package core.game.node.entity.skill.cooking; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to slice a watermelon. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WatermelonSlicePlugin extends UseWithHandler { + + /** + * Represents the knife item. + */ + private static final Item KNIFE = new Item(946); + + /** + * Represents the watermelon item. + */ + private static final Item WATERMELON = new Item(5982); + + /** + * Represents the watermelon slice item. + */ + private static final Item WATERMELON_SLICE = new Item(5984); + + /** + * Constructs a new {@code WatermelonSlicePlugin.java} {@code Object}. + */ + public WatermelonSlicePlugin() { + super(KNIFE.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(5982, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (event.getPlayer().getInventory().remove(WATERMELON)) { + for (int i = 0; i < 3; i++) { + if (!event.getPlayer().getInventory().add(WATERMELON_SLICE)) { + GroundItemManager.create(WATERMELON_SLICE, event.getPlayer()); + } + } + event.getPlayer().getPacketDispatch().sendMessage("You slice the watermelon into three slices."); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/WineFermentPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/WineFermentPlugin.java new file mode 100644 index 000000000..bc9e3ef8e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/WineFermentPlugin.java @@ -0,0 +1,63 @@ +package core.game.node.entity.skill.cooking; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.fermenting.WineFermentingPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.plugin.Plugin; + +/** + * Represents the plugin used to ferment wine. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WineFermentPlugin extends UseWithHandler { + + /** + * Represents the grapes item. + */ + private static final Item GRAPES = new Item(1987, 1); + + /** + * Represents the jug of water item. + */ + private static final Item JUG_OF_WATER = new Item(1937, 1); + + /** + * Represents the unfermented wine item. + */ + private static final Item UNFERMENTED_WINE = new Item(1995, 1); + + /** + * Constructs a new {@code WineFermentPlugin} {@code Object}. + */ + public WineFermentPlugin() { + super(1937); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1987, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getSkills().getLevel(Skills.COOKING) < 35) { + player.getPacketDispatch().sendMessage("You need a cooking level of 35 to do this."); + return true; + } + if (player.getInventory().remove(GRAPES, JUG_OF_WATER)) { + player.getInventory().add(UNFERMENTED_WINE); + GameWorld.getPulser().submit(new WineFermentingPulse(1, player)); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.java new file mode 100644 index 000000000..eadc328b8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/dairy/DairyChurnPulse.java @@ -0,0 +1,116 @@ +package core.game.node.entity.skill.cooking.dairy; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.tools.StringUtils; + +/** + * Represents the skill pulse used to make a dairy product. + * @author 'Vexia + */ +public final class DairyChurnPulse extends SkillPulse { + + /** + * Represents the animation. + */ + private static final Animation ANIMATION = new Animation(2793); + + /** + * Represents the bucket of milk item. + */ + private static final Item BUCKET_OF_MILK = new Item(1927, 1); + + /** + * Represents the bucket item. + */ + private static final Item BUCKET = new Item(1925, 1); + + /** + * Represents the dairy product we're making. + */ + private final DairyProduct dairy; + + /** + * Represent the amount to make. + */ + private int amount; + + /** + * Constructs a new {@code DairyChurnPulse} {@code Object}. + * @param player the player. + * @param item the item. + * @param product the product. + * @param amount the amount. + */ + public DairyChurnPulse(Player player, Item item, DairyProduct product, int amount) { + super(player, item); + super.setDelay(8); + this.amount = amount; + this.dairy = product; + } + + @Override + public boolean checkRequirements() { + player.getInterfaceManager().closeChatbox(); + if (!player.getInventory().contains(1927, 1)) { + player.getPacketDispatch().sendMessage("You need a bucket of milk."); + return false; + } + if (player.getInventory().freeSlots() < 1) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return false; + } + if (player.getSkills().getLevel(Skills.COOKING) < dairy.getLevel()) { + player.getPacketDispatch().sendMessage("You need a cooking level of " + dairy.getLevel() + " to cook this."); + return false; + } + if (amount > player.getInventory().getAmount(node)) { + amount = player.getInventory().getAmount(node); + } + if (amount < 1) { + return false; + } + animate(); + return true; + } + + @Override + public void animate() { + player.animate(ANIMATION); + } + + @Override + public boolean reward() { + amount--; + if (player.getInventory().containsItem(BUCKET_OF_MILK)) { + if (player.getInventory().remove(BUCKET_OF_MILK)) { + if (player.getInventory().freeSlots() > 1) { + player.getInventory().add(dairy.getProduct()); + player.getInventory().add(BUCKET); + } + player.getPacketDispatch().sendMessage("You make " + (StringUtils.isPlusN(dairy.getProduct().getName().toLowerCase()) ? "an" : "a") + " " + dairy.getProduct().getName().toLowerCase() + "."); + player.getSkills().addExperience(Skills.COOKING, dairy.getExperience(), true); + + // Seers village diary + if (player.getLocation().withinDistance(new Location(2730, 3578, 0)) + && !player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0,8)) { + player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).updateTask(player,0,8,true); + } + + } + } + + + if (player.getInventory().freeSlots() < 1) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return true; + } + return amount < 1 || player.getInventory().freeSlots() < 1; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/dairy/DairyProduct.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/dairy/DairyProduct.java new file mode 100644 index 000000000..17f6bdba6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/dairy/DairyProduct.java @@ -0,0 +1,59 @@ +package core.game.node.entity.skill.cooking.dairy; + +import core.game.node.item.Item; + +/** + * Represents an enumeration of dairy products. + * @author 'Vexia + */ +public enum DairyProduct { + POT_OF_CREAM(21, 18, new Item(2130, 1)), PAT_OF_BUTTER(38, 40.5, new Item(6697, 1)), CHEESE(48, 64, new Item(1985, 1)); + + /** + * The prodct Item. + */ + private Item product; + + /** + * The level required. + */ + private int level; + + /** + * /** The experience gained. + */ + private double experience; + + /** + * Constructs a new {@code DairyProduct.java} {@code Object}. + * @param level + * @param experience + * @param product + */ + DairyProduct(int level, double experience, Item product) { + this.level = level; + this.experience = experience; + this.product = product; + } + + /** + * @return the product. + */ + public Item getProduct() { + return product; + } + + /** + * @return the level. + */ + public int getLevel() { + return level; + } + + /** + * @return the experience. + */ + public double getExperience() { + return experience; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/fermenting/WineFermentingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/fermenting/WineFermentingPulse.java new file mode 100644 index 000000000..d6efa5003 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/fermenting/WineFermentingPulse.java @@ -0,0 +1,80 @@ +package core.game.node.entity.skill.cooking.fermenting; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.tools.RandomFunction; + +/** + * Represents a pulse used to ferment wine. + * @author 'Vexia + * @date 22/12/2013 + */ +public final class WineFermentingPulse extends Pulse { + + /** + * Represents the player instance. + */ + private final Player player; + + /** + * Represents a counter used to time when to ferment. + */ + private int count; + + /** + * Constructs a new {@code WineFermentingPulse} {@Code Object} + * @param delay the delay. + */ + public WineFermentingPulse(int delay, final Player player) { + super(delay); + this.player = player; + } + + @Override + public boolean pulse() { + if (count++ >= 16) { + int rand = RandomFunction.random(1, 3); + switch (rand) { + case 1: + if (player.getInventory().contains(1995, 1)) { + player.getInventory().replace(new Item(1991, 1), player.getInventory().getSlot(new Item(1995, 1))); + } else if (player.getBank().contains(1995, 1)) { + player.getBank().replace(new Item(1991, 1), player.getBank().getSlot(new Item(1995, 1))); + } + return true; + case 2: + if (player.getInventory().contains(1995, 1)) { + player.getInventory().replace(new Item(1993, 1), player.getInventory().getSlot(new Item(1995, 1))); + player.getSkills().addExperience(Skills.COOKING, 200, true); + } else if (player.getBank().contains(1995, 1)) { + player.getBank().replace(new Item(1993, 1), player.getBank().getSlot(new Item(1995, 1))); + player.getSkills().addExperience(Skills.COOKING, 200); + } + return true; + case 3: + if (player.getInventory().contains(1995, 1)) { + player.getInventory().replace(new Item(1993, 1), player.getInventory().getSlot(new Item(1995, 1))); + player.getSkills().addExperience(Skills.COOKING, 200); + } else if (player.getBank().contains(1995, 1)) { + player.getBank().replace(new Item(1993, 1), player.getBank().getSlot(new Item(1995, 1))); + player.getSkills().addExperience(Skills.COOKING, 200); + } + return true; + } + return true; + } + count++; + return false; + } + + /** + * Gets the player. + * @return the player. + */ + public Player getPlayer() { + return player; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/OomlieWrap.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/OomlieWrap.java new file mode 100644 index 000000000..dd7181263 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/OomlieWrap.java @@ -0,0 +1,57 @@ +package core.game.node.entity.skill.cooking.recipe; + +import core.tools.Items; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * @author afaroutdude + */ +public class OomlieWrap extends Recipe { + + private static final Item OOMLIE_WRAP = new Item(Items.WRAPPED_OOMLIE_2341); + private static final Item RAW_OOMLIE = new Item(Items.RAW_OOMLIE_2337); + private static final Item PALM_LEAF = new Item(Items.PALM_LEAF_2339); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < 50) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of 50 in order to do that."); + return; + } + super.mix(player, event); + } + + @Override + public Item getBase() { + return RAW_OOMLIE; + } + + @Override + public Item getProduct() { + return OOMLIE_WRAP; + } + + @Override + public Item[] getIngredients() { + return new Item[] { PALM_LEAF }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return "You wrap the raw oomlie in the palm leaf."; + } + + @Override + public boolean isSingular() { + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/Recipe.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/Recipe.java new file mode 100644 index 000000000..c6478be14 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/Recipe.java @@ -0,0 +1,127 @@ +package core.game.node.entity.skill.cooking.recipe; + +import core.game.node.entity.skill.cooking.recipe.cake.ChocolateCake; +import core.game.node.entity.skill.cooking.recipe.pie.impl.*; +import core.game.node.entity.skill.cooking.recipe.pizza.impl.AnchovyPizza; +import core.game.node.entity.skill.cooking.recipe.pizza.impl.MeatPizza; +import core.game.node.entity.skill.cooking.recipe.pizza.impl.PineapplePizza; +import core.game.node.entity.skill.cooking.recipe.pizza.impl.PlainPizza; +import core.game.node.entity.skill.cooking.recipe.potato.impl.*; +import core.game.node.entity.skill.cooking.recipe.stew.CurryRecipe; +import core.game.node.entity.skill.cooking.recipe.stew.StewRecipe; +import core.game.node.entity.skill.cooking.recipe.topping.impl.*; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a cooking recipe, this is dynamic that can range from a pie to a + * pizza. + * @author 'Vexia + * @date 21/12/2013 + */ +public abstract class Recipe { + + /** + * Represents the array of active recipes in Keldagrim.. + */ + public static final Recipe[] RECIPES = new Recipe[] { + new RedberryPie(), new MeatPie(), new ApplePie(), new MudPie(), new GardenPie(), new FishPie(), new AdmiralPie(), new WildPie(), new SummerPie(), + new StewRecipe(), new CurryRecipe(), + new PlainPizza(), new MeatPizza(), new AnchovyPizza(), new PineapplePizza(), + new ChocolateCake(), + new ButterPotato(), new ChilliPotato(), new CheesePotato(), new EggPotato(), new MushroomPotato(), new TunaPotato(), + new SpicySauce(), new ChilliConCarne(), new UncookedEgg(), new EggAndTomato(), new MushroomAndOnion(), new ChoppedOnion(), new SlicedMushroom(), new ChoppedTuna(), new TunaAndCorn(), new OomlieWrap() + }; + + /** + * Method used to get the base item. + * @return the item. + */ + public abstract Item getBase(); + + /** + * Method used to get the product item. + * @return the product item. + */ + public abstract Item getProduct(); + + /** + * Method used to get the ingredients in this recipe. + * @return the ingredients. + */ + public abstract Item[] getIngredients(); + + /** + * Method used to get the part items made from ingredients. + * @return the part items. + */ + public abstract Item[] getParts(); + + /** + * Method used to get the mixing message. + * @param event the node usage event. + * @return the message used to mix. + */ + public abstract String getMixMessage(final NodeUsageEvent event); + + /** + * Method used to check if this is a singular one step recipe. + * @return True if so. + */ + public abstract boolean isSingular(); + + /** + * Method used to mix this recipes ingredients. + * @param player the player. + * @param event the event. + */ + public void mix(final Player player, final NodeUsageEvent event) { + if (getIngredients().length == 1) { + singleMix(player, event); + } else { + multipleMix(player, event); + } + } + + /** + * Method used to handle a single mixing. + * @param player the player. + * @param event the event. + */ + public void singleMix(final Player player, final NodeUsageEvent event) { + if (player.getInventory().remove(event.getBaseItem()) && player.getInventory().remove(event.getUsedItem())) { + player.getInventory().add(getProduct()); + String message = getMixMessage(event); + if (message != null) { + player.getPacketDispatch().sendMessage(message); + } + } + } + + /** + * Method used to handle mixing multiple item recipes. + * @param player the player. + * @param event the event. + */ + public void multipleMix(final Player player, final NodeUsageEvent event) { + Item item = null; + int index = -1; + for (int counter = 0; counter < getIngredients().length; counter++) { + item = getIngredients()[counter]; + if (item.getId() == event.getUsedItem().getId() || item.getId() == event.getBaseItem().getId()) { + index = counter; + break; + } + } + if (index != -1) { + if (player.getInventory().remove(event.getBaseItem()) && player.getInventory().remove(event.getUsedItem())) { + player.getInventory().add(getParts()[index + 1]); + String message = getMixMessage(event); + if (message != null) { + player.getPacketDispatch().sendMessage(message); + } + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/cake/ChocolateCake.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/cake/ChocolateCake.java new file mode 100644 index 000000000..72280ce18 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/cake/ChocolateCake.java @@ -0,0 +1,72 @@ +package core.game.node.entity.skill.cooking.recipe.cake; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the chocolate cake recipe. This recipe consists of adding a + * chocolate bar to a cake. + * @author 'Vexia + * @date 22/12/2013 + */ +public class ChocolateCake extends Recipe { + + /** + * Represents the cake item. + */ + private static final Item CAKE = new Item(1891); + + /** + * Represents the chocolate cake item. + */ + private static final Item CHOCOLATE_CAKE = new Item(1897); + + /** + * Represents the chocolate bar item. + */ + private static final Item CHOCOLATE_BAR = new Item(1973); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < 50) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of 50 in order to do that."); + return; + } + super.mix(player, event); + player.getSkills().addExperience(Skills.COOKING, 30, true); + } + + @Override + public Item getBase() { + return CAKE; + } + + @Override + public Item getProduct() { + return CHOCOLATE_CAKE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { CHOCOLATE_BAR }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return "You add chocolate to the cake."; + } + + @Override + public boolean isSingular() { + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/PieRecipe.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/PieRecipe.java new file mode 100644 index 000000000..00fb85af5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/PieRecipe.java @@ -0,0 +1,38 @@ +package core.game.node.entity.skill.cooking.recipe.pie; + +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.item.Item; + +/** + * Represents the generic recipe for a pie. + * @author 'Vexia + * @date 21/12/2013 + */ +public abstract class PieRecipe extends Recipe { + + /** + * Represents the pie shell item. + */ + protected static final Item PIE_SHELL = new Item(2315); + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public Item getBase() { + return PIE_SHELL; + } + + @Override + public String getMixMessage(final NodeUsageEvent event) { + return "You fill the pie with " + (event.getBaseItem().getId() == 2315 ? event.getUsedItem().getName().toLowerCase() : event.getBaseItem().getName().toLowerCase()) + "."; + } + + @Override + public boolean isSingular() { + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/AdmiralPie.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/AdmiralPie.java new file mode 100644 index 000000000..652bc3549 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/AdmiralPie.java @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.cooking.recipe.pie.impl; + +import core.game.node.entity.skill.cooking.recipe.pie.PieRecipe; +import core.game.node.item.Item; + +/** + * Represents the admiral pie recipe. This recipe conists of pixing a salmon, + * tuna and potato together. + * @author 'Vexia + * @date 21/12/2013 + */ +public class AdmiralPie extends PieRecipe { + + /** + * Represents the uncooked redberry pie. + */ + private static final Item UNCOOKED_PIE = new Item(7196); + + /** + * Represents the salmon ingredient item. + */ + private static final Item SALMON = new Item(329); + + /** + * Represents the tuna ingredient item. + */ + private static final Item TUNA = new Item(361); + + /** + * Represents the potato item. + */ + private static final Item POTATO = new Item(1942); + + /** + * Represents the part one pie item. + */ + private static final Item PART_ONE = new Item(7192); + + /** + * Represents the part two pie item. + */ + private static final Item PART_TWO = new Item(7194); + + @Override + public Item getProduct() { + return UNCOOKED_PIE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { SALMON, TUNA, POTATO }; + } + + @Override + public Item[] getParts() { + return new Item[] { PIE_SHELL, PART_ONE, PART_TWO, UNCOOKED_PIE }; + } + + @Override + public boolean isSingular() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/ApplePie.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/ApplePie.java new file mode 100644 index 000000000..2956dd38b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/ApplePie.java @@ -0,0 +1,34 @@ +package core.game.node.entity.skill.cooking.recipe.pie.impl; + +import core.game.node.entity.skill.cooking.recipe.pie.PieRecipe; +import core.game.node.item.Item; + +/** + * Represents the apple pie recipe. This recipe consists of cooking apples and a + * pie shell. + * @author 'Vexia + * @date 21/12/2013 + */ +public class ApplePie extends PieRecipe { + + /** + * Represents the uncooked redberry pie. + */ + private static final Item UNCOOKED_PIE = new Item(2317); + + /** + * Represents the cooking apple item. + */ + private static final Item COOKING_APPLE = new Item(1955); + + @Override + public Item getProduct() { + return UNCOOKED_PIE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { COOKING_APPLE }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/FishPie.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/FishPie.java new file mode 100644 index 000000000..7a2286891 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/FishPie.java @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.cooking.recipe.pie.impl; + +import core.game.node.entity.skill.cooking.recipe.pie.PieRecipe; +import core.game.node.item.Item; + +/** + * Represents the garden pie recipe. This pie consists of mixing, tomato, onion, + * and cabbage together. + * @author 'Vexia + * @date 21/12/2013 + */ +public class FishPie extends PieRecipe { + + /** + * Represents the uncooked redberry pie. + */ + private static final Item UNCOOKED_PIE = new Item(7186); + + /** + * Represents the trout item ingredient. + */ + private static final Item TROUT = new Item(333); + + /** + * Represents the cod item ingredient. + */ + private static final Item COD = new Item(339); + + /** + * Represents the potato item. + */ + private static final Item POTATO = new Item(1942); + + /** + * Represents the part one pie item. + */ + private static final Item PART_ONE = new Item(7182); + + /** + * Represents the part two pie item. + */ + private static final Item PART_TWO = new Item(7184); + + @Override + public Item getProduct() { + return UNCOOKED_PIE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { TROUT, COD, POTATO }; + } + + @Override + public Item[] getParts() { + return new Item[] { PIE_SHELL, PART_ONE, PART_TWO, UNCOOKED_PIE }; + } + + @Override + public boolean isSingular() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/GardenPie.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/GardenPie.java new file mode 100644 index 000000000..04bd3066f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/GardenPie.java @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.cooking.recipe.pie.impl; + +import core.game.node.entity.skill.cooking.recipe.pie.PieRecipe; +import core.game.node.item.Item; + +/** + * Represents the garden pie recipe. This pie consists of mixing, tomato, onion, + * and cabbage together. + * @author 'Vexia + * @date 21/12/2013 + */ +public class GardenPie extends PieRecipe { + + /** + * Represents the uncooked redberry pie. + */ + private static final Item UNCOOKED_PIE = new Item(7176); + + /** + * Represents the tomato ingredient item. + */ + private static final Item TOMATO = new Item(1982); + + /** + * Represents the onion ingredient item. + */ + private static final Item ONION = new Item(1957); + + /** + * Represents the cabbage ingredient item. + */ + private static final Item CABBAGE = new Item(1965); + + /** + * Represents the part one pie item. + */ + private static final Item PART_ONE = new Item(7172); + + /** + * Represents the part two pie item. + */ + private static final Item PART_TWO = new Item(7174); + + @Override + public Item getProduct() { + return UNCOOKED_PIE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { TOMATO, ONION, CABBAGE }; + } + + @Override + public Item[] getParts() { + return new Item[] { PIE_SHELL, PART_ONE, PART_TWO, UNCOOKED_PIE }; + } + + @Override + public boolean isSingular() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/MeatPie.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/MeatPie.java new file mode 100644 index 000000000..76add066f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/MeatPie.java @@ -0,0 +1,58 @@ +package core.game.node.entity.skill.cooking.recipe.pie.impl; + +import core.game.node.entity.skill.cooking.recipe.pie.PieRecipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the meat pie recipe. + * @author 'Vexia + * @date 21/12/2013 + */ +public class MeatPie extends PieRecipe { + + /** + * Represents the uncooked redberry pie. + */ + private static final Item UNCOOKED_PIE = new Item(2319); + + /** + * Represents the cooked meat item. + */ + private static final Item COOKED_MEAT = new Item(2142); + + /** + * Represents the cooked chicken item. + */ + private static final Item COOKED_CHICKEN = new Item(2140); + + /** + * Represents the cooked rabbit. + */ + private static final Item COOKED_RABBIT = new Item(3228); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getInventory().remove(event.getUsedItem()) && player.getInventory().remove(event.getBaseItem())) { + player.getInventory().add(getProduct()); + player.getPacketDispatch().sendMessage(getMixMessage(event)); + return; + } + } + + @Override + public Item getProduct() { + return UNCOOKED_PIE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { COOKED_MEAT, COOKED_CHICKEN, COOKED_RABBIT }; + } + + @Override + public String getMixMessage(final NodeUsageEvent event) { + return "You fill the pie with meat."; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/MudPie.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/MudPie.java new file mode 100644 index 000000000..64ef1750f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/MudPie.java @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.cooking.recipe.pie.impl; + +import core.game.node.entity.skill.cooking.recipe.pie.PieRecipe; +import core.game.node.item.Item; + +/** + * Represents the mud pie recipe. A mud pie consists of mixing compost, water + * and clay together. + * @author 'Vexia + * @date 21/12/2013 + */ +public class MudPie extends PieRecipe { + + /** + * Represents the uncooked redberry pie. + */ + private static final Item UNCOOKED_PIE = new Item(7168); + + /** + * Represents the compost item. + */ + private static final Item COMPOST = new Item(6032); + + /** + * Represents the bucket of water item. + */ + private static final Item BUCKET_OF_WATER = new Item(1929); + + /** + * Represents the clay item. + */ + private static final Item CLAY = new Item(434); + + /** + * Represents the part one pie item. + */ + private static final Item PART_ONE = new Item(7164); + + /** + * Represents the part two pie item. + */ + private static final Item PART_TWO = new Item(7166); + + @Override + public Item getProduct() { + return UNCOOKED_PIE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { COMPOST, BUCKET_OF_WATER, CLAY }; + } + + @Override + public Item[] getParts() { + return new Item[] { PIE_SHELL, PART_ONE, PART_TWO, UNCOOKED_PIE }; + } + + @Override + public boolean isSingular() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/RedberryPie.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/RedberryPie.java new file mode 100644 index 000000000..8c7920785 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/RedberryPie.java @@ -0,0 +1,33 @@ +package core.game.node.entity.skill.cooking.recipe.pie.impl; + +import core.game.node.entity.skill.cooking.recipe.pie.PieRecipe; +import core.game.node.item.Item; + +/** + * Represents a redberry pie recipe. + * @author 'Vexia + * @date 21/12/2013 + */ +public class RedberryPie extends PieRecipe { + + /** + * Represents the uncooked redberry pie. + */ + private static final Item UNCOOKED_PIE = new Item(2321); + + /** + * Represents the redberries pie. + */ + private static final Item REDBERRIES = new Item(1951); + + @Override + public Item getProduct() { + return UNCOOKED_PIE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { REDBERRIES }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/SummerPie.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/SummerPie.java new file mode 100644 index 000000000..689548cb5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/SummerPie.java @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.cooking.recipe.pie.impl; + +import core.game.node.entity.skill.cooking.recipe.pie.PieRecipe; +import core.game.node.item.Item; + +/** + * Represents the summer pie recipe. This recipe consists of mixing stawberry, + * watermelon, and an apple. + * @author 'Vexia + * @date 21/12/2013 + */ +public class SummerPie extends PieRecipe { + + /** + * Represents the uncooked redberry pie. + */ + private static final Item UNCOOKED_PIE = new Item(7216); + + /** + * Represents the strawberry item. + */ + private static final Item STRAWBERRY = new Item(5504); + + /** + * Represents the watermelon item. + */ + private static final Item WATERMELON = new Item(5982); + + /** + * Represents the cooking apple item. + */ + private static final Item COOKING_APPLE = new Item(1955); + + /** + * Represents the part one pie item. + */ + private static final Item PART_ONE = new Item(7212); + + /** + * Represents the part two pie item. + */ + private static final Item PART_TWO = new Item(7214); + + @Override + public Item getProduct() { + return UNCOOKED_PIE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { STRAWBERRY, WATERMELON, COOKING_APPLE }; + } + + @Override + public Item[] getParts() { + return new Item[] { PIE_SHELL, PART_ONE, PART_TWO, UNCOOKED_PIE }; + } + + @Override + public boolean isSingular() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/WildPie.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/WildPie.java new file mode 100644 index 000000000..0e9c8f0fb --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pie/impl/WildPie.java @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.cooking.recipe.pie.impl; + +import core.game.node.entity.skill.cooking.recipe.pie.PieRecipe; +import core.game.node.item.Item; + +/** + * Represents the wild pie recipe. This recipe consists of mixing raw beat meat, + * raw chomp, and raw rabbit into a pie shell. + * @author 'Vexia + * @date 21/12/2013 + */ +public class WildPie extends PieRecipe { + + /** + * Represents the uncooked redberry pie. + */ + private static final Item UNCOOKED_PIE = new Item(7206); + + /** + * Represents the raw bear meat item. + */ + private static final Item BEAR_MEAT = new Item(2136); + + /** + * Represents the raw chompy meat item. + */ + private static final Item CHOMPY_MEAT = new Item(2876); + + /** + * Represents the raw rabbit meat item. + */ + private static final Item RABBIT_MEAT = new Item(3226); + + /** + * Represents the part one pie item. + */ + private static final Item PART_ONE = new Item(7202); + + /** + * Represents the part two pie item. + */ + private static final Item PART_TWO = new Item(7204); + + @Override + public Item getProduct() { + return UNCOOKED_PIE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { BEAR_MEAT, CHOMPY_MEAT, RABBIT_MEAT }; + } + + @Override + public Item[] getParts() { + return new Item[] { PIE_SHELL, PART_ONE, PART_TWO, UNCOOKED_PIE }; + } + + @Override + public boolean isSingular() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/PizzaRecipe.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/PizzaRecipe.java new file mode 100644 index 000000000..0471e4a11 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/PizzaRecipe.java @@ -0,0 +1,63 @@ +package core.game.node.entity.skill.cooking.recipe.pizza; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the generic recipe for a pizza. + * @author ceikry + */ +public abstract class PizzaRecipe extends Recipe { + + /** + * Represents the plain pizza. + */ + protected static final Item PLAIN_PIZZA = new Item(2289); + + /** + * Method used to get the experience gained from adding the final + * ingredient. + * @return the experience. + */ + public abstract double getExperience(); + + /** + * Method used to get the level required. + * @return the level required. + */ + public abstract int getLevel(); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + getLevel() + " in order to do this."); + return; + } + super.singleMix(player, event); + player.getSkills().addExperience(Skills.COOKING, getExperience(), true); + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public Item getBase() { + return PLAIN_PIZZA; + } + + @Override + public String getMixMessage(final NodeUsageEvent event) { + return "You add " + event.getBaseItem().getName().toLowerCase() + " to the pizza."; + } + + @Override + public boolean isSingular() { + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/AnchovyPizza.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/AnchovyPizza.java new file mode 100644 index 000000000..4fc09e82a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/AnchovyPizza.java @@ -0,0 +1,44 @@ +package core.game.node.entity.skill.cooking.recipe.pizza.impl; + +import core.game.node.entity.skill.cooking.recipe.pizza.PizzaRecipe; +import core.game.node.item.Item; + +/** + * Represents the anchovy pizza. This recipe consists of adding anchovies to a + * plain pizza. + * @author 'Vexia + * @date 22/12/2013 + */ +public class AnchovyPizza extends PizzaRecipe { + + /** + * Represents the anchovy pizza item. + */ + private static final Item ANCHOVY_PIZZA = new Item(2297); + + /** + * Represents the anchovies item. + */ + private static final Item ANCHOVIES = new Item(319); + + @Override + public double getExperience() { + return 39; + } + + @Override + public Item getProduct() { + return ANCHOVY_PIZZA; + } + + @Override + public Item[] getIngredients() { + return new Item[] { ANCHOVIES }; + } + + @Override + public int getLevel() { + return 55; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/MeatPizza.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/MeatPizza.java new file mode 100644 index 000000000..9b9d8f903 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/MeatPizza.java @@ -0,0 +1,49 @@ +package core.game.node.entity.skill.cooking.recipe.pizza.impl; + +import core.game.node.entity.skill.cooking.recipe.pizza.PizzaRecipe; +import core.game.node.item.Item; + +/** + * Represents the meat pizza recipe. This recipe consists of adding cooked meat + * to a plain pizza. + * @author 'Vexia + * @date 22/12/2013 + */ +public class MeatPizza extends PizzaRecipe { + + /** + * Represents the meat pizza item. + */ + private static final Item MEAT_PIZZA = new Item(2293); + + /** + * Represents the cooked meat item. + */ + private static final Item COOKED_MEAT = new Item(2142); + + /** + * Represents the cooked chicken item. + */ + private static final Item COOKED_CHICKEN = new Item(2140); + + @Override + public double getExperience() { + return 26; + } + + @Override + public int getLevel() { + return 45; + } + + @Override + public Item getProduct() { + return MEAT_PIZZA; + } + + @Override + public Item[] getIngredients() { + return new Item[] { COOKED_MEAT, COOKED_CHICKEN }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/PineapplePizza.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/PineapplePizza.java new file mode 100644 index 000000000..e93097a0a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/PineapplePizza.java @@ -0,0 +1,55 @@ +package core.game.node.entity.skill.cooking.recipe.pizza.impl; + +import core.game.node.entity.skill.cooking.recipe.pizza.PizzaRecipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.item.Item; + +/** + * Represents the pineapple pizza recipe. This recipe consists of mixing either + * pineapple chunks or pineapple rings. + * @author 'Vexia + * @date 22/12/2013 + */ +public class PineapplePizza extends PizzaRecipe { + + /** + * Represents the pineapple pizza item. + */ + private static final Item PINEAPPLE_PIZZA = new Item(2301); + + /** + * Represents the pineapple ring item. + */ + private static final Item PINEAPPLE_RING = new Item(2118); + + /** + * Represents the pineapple chunk item. + */ + private static final Item PINEAPPLE_CHUNKS = new Item(2116); + + @Override + public double getExperience() { + return 52; + } + + @Override + public int getLevel() { + return 65; + } + + @Override + public Item getProduct() { + return PINEAPPLE_PIZZA; + } + + @Override + public Item[] getIngredients() { + return new Item[] { PINEAPPLE_CHUNKS, PINEAPPLE_RING }; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return "You add the " + event.getBaseItem().getName().toLowerCase() + " to the pizza."; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/PlainPizza.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/PlainPizza.java new file mode 100644 index 000000000..01c85e937 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/pizza/impl/PlainPizza.java @@ -0,0 +1,81 @@ +package core.game.node.entity.skill.cooking.recipe.pizza.impl; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the plain pizza recipe. This recipe consists of mixing tomato, and + * cheese to a pizza base. + * @author 'Vexia + * @date 22/12/2013 + */ +public class PlainPizza extends Recipe { + + /** + * Represents the pizza base. + */ + private static final Item PIZZA_BASE = new Item(2283); + + /** + * Represents the uncooked pizza. + */ + private static final Item UNCOOKED_PIZZA = new Item(2287); + + /** + * Represents the incomplete pizza. + */ + private static final Item INCOMPLETE_PIZZA = new Item(2285); + + /** + * Represents the tomato ingredient item. + */ + private static final Item TOMATO = new Item(1982); + + /** + * Represents the cheese item. + */ + private static final Item CHEESE = new Item(1985); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < 35) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + 35 + " in order to do this."); + return; + } + super.mix(player, event); + } + + @Override + public Item getBase() { + return PIZZA_BASE; + } + + @Override + public Item getProduct() { + return UNCOOKED_PIZZA; + } + + @Override + public Item[] getIngredients() { + return new Item[] { TOMATO, CHEESE }; + } + + @Override + public Item[] getParts() { + return new Item[] { PIZZA_BASE, INCOMPLETE_PIZZA, UNCOOKED_PIZZA }; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return "You add the " + event.getBaseItem().getName().toLowerCase() + " to the pizza."; + } + + @Override + public boolean isSingular() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/PotatoRecipe.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/PotatoRecipe.java new file mode 100644 index 000000000..6eee0e3f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/PotatoRecipe.java @@ -0,0 +1,76 @@ +package core.game.node.entity.skill.cooking.recipe.potato; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a generic potato topping recipe. + * @author 'Vexia + * @date 22/12/2013 + */ +public abstract class PotatoRecipe extends Recipe { + + /** + * Represents the potato with butter. + */ + private static final Item POTATO_WITH_BUTTER = new Item(6703); + + /** + * Represents the bowl item. + */ + protected static final Item BOWL = new Item(1923); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + getLevel() + " in order to do this."); + return; + } + super.singleMix(player, event); + if (isTopping()) { + player.getInventory().add(BOWL); + } + player.getSkills().addExperience(Skills.COOKING, getExperience(), true); + } + + @Override + public Item getBase() { + return POTATO_WITH_BUTTER; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return null; + } + + @Override + public boolean isSingular() { + return true; + } + + /** + * Method used to check if it is a topping recipe. + * @return True if it is a topping. + */ + public abstract boolean isTopping(); + + /** + * Method used to get the level required. + * @return the level. + */ + public abstract int getLevel(); + + /** + * Method used to get the experience gained. + * @return the experience. + */ + public abstract double getExperience(); +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/ButterPotato.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/ButterPotato.java new file mode 100644 index 000000000..c3b445a60 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/ButterPotato.java @@ -0,0 +1,72 @@ +package core.game.node.entity.skill.cooking.recipe.potato.impl; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the butter potato recipe. This recipe consists of adding a pat of + * butter to a potato. + * @author 'Vexia + * @date 22/12/2013 + */ +public class ButterPotato extends Recipe { + + /** + * Represents the baked potato. + */ + private static final Item BAKED_POTATO = new Item(6701); + + /** + * Represents the potato with butter. + */ + private static final Item POTATO_WITH_BUTTER = new Item(6703); + + /** + * Represents the pat of butter. + */ + private static final Item PAT_OF_BUTTER = new Item(6697); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < 39) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + 39 + " in order to do this."); + return; + } + super.singleMix(player, event); + player.getSkills().addExperience(Skills.COOKING, 40.5, true); + } + + @Override + public Item getBase() { + return BAKED_POTATO; + } + + @Override + public Item getProduct() { + return POTATO_WITH_BUTTER; + } + + @Override + public Item[] getIngredients() { + return new Item[] { PAT_OF_BUTTER }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return "You add a pat of butter to the potato."; + } + + @Override + public boolean isSingular() { + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/CheesePotato.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/CheesePotato.java new file mode 100644 index 000000000..fe1a1ea5d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/CheesePotato.java @@ -0,0 +1,49 @@ +package core.game.node.entity.skill.cooking.recipe.potato.impl; + +import core.game.node.entity.skill.cooking.recipe.potato.PotatoRecipe; +import core.game.node.item.Item; + +/** + * Represents the cheese potato. This recipe consists of mixing cheese witha + * baked potato. + * @author 'Vexia + * @date 22/12/2013 + */ +public class CheesePotato extends PotatoRecipe { + + /** + * Represents the cheese potato. + */ + private static final Item CHEESE_POTATO = new Item(6705); + + /** + * Represents the cheese item. + */ + private static final Item CHEESE = new Item(1985); + + @Override + public Item getProduct() { + return CHEESE_POTATO; + } + + @Override + public Item[] getIngredients() { + return new Item[] { CHEESE }; + } + + @Override + public boolean isTopping() { + return false; + } + + @Override + public int getLevel() { + return 47; + } + + @Override + public double getExperience() { + return 10; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/ChilliPotato.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/ChilliPotato.java new file mode 100644 index 000000000..40683e915 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/ChilliPotato.java @@ -0,0 +1,49 @@ +package core.game.node.entity.skill.cooking.recipe.potato.impl; + +import core.game.node.entity.skill.cooking.recipe.potato.PotatoRecipe; +import core.game.node.item.Item; + +/** + * Represents the chilli potato recipe. This recipe consists of adding chilli + * con carne to a baked butter potato. + * @author 'Vexia + * @date 22/12/2013 + */ +public class ChilliPotato extends PotatoRecipe { + + /** + * Represents the chilli potato item. + */ + private static final Item CHILLI_POTATO = new Item(7054); + + /** + * Represents the chilli con carne item/ + */ + private static final Item CHILLI_CON_CARNE = new Item(7062); + + @Override + public Item getProduct() { + return CHILLI_POTATO; + } + + @Override + public Item[] getIngredients() { + return new Item[] { CHILLI_CON_CARNE }; + } + + @Override + public boolean isTopping() { + return true; + } + + @Override + public int getLevel() { + return 41; + } + + @Override + public double getExperience() { + return 10; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/EggPotato.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/EggPotato.java new file mode 100644 index 000000000..6dd5f7d2f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/EggPotato.java @@ -0,0 +1,49 @@ +package core.game.node.entity.skill.cooking.recipe.potato.impl; + +import core.game.node.entity.skill.cooking.recipe.potato.PotatoRecipe; +import core.game.node.item.Item; + +/** + * Represents the egg potato recipe. This recipe consists of mixing a egg and a + * tomato. + * @author 'Vexia + * @date 22/12/2013 + */ +public class EggPotato extends PotatoRecipe { + + /** + * Represents the egg potato. + */ + private static final Item EGG_POTATO = new Item(7056); + + /** + * Represents the topping item. + */ + private static final Item TOPPING = new Item(7064); + + @Override + public Item getProduct() { + return EGG_POTATO; + } + + @Override + public Item[] getIngredients() { + return new Item[] { TOPPING }; + } + + @Override + public boolean isTopping() { + return true; + } + + @Override + public int getLevel() { + return 51; + } + + @Override + public double getExperience() { + return 10; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/MushroomPotato.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/MushroomPotato.java new file mode 100644 index 000000000..56fa4d669 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/MushroomPotato.java @@ -0,0 +1,49 @@ +package core.game.node.entity.skill.cooking.recipe.potato.impl; + +import core.game.node.entity.skill.cooking.recipe.potato.PotatoRecipe; +import core.game.node.item.Item; + +/** + * Represents the mushrrom potato. This recipe consists of mixing a baked potato + * with mushroom and onion toppings. + * @author 'Vexia + * @date 22/12/2013 + */ +public class MushroomPotato extends PotatoRecipe { + + /** + * Represents the egg potato. + */ + private static final Item MUSHROOM_POTATO = new Item(7058); + + /** + * Represents the topping item. + */ + private static final Item TOPPING = new Item(7066); + + @Override + public Item getProduct() { + return MUSHROOM_POTATO; + } + + @Override + public Item[] getIngredients() { + return new Item[] { TOPPING }; + } + + @Override + public boolean isTopping() { + return true; + } + + @Override + public int getLevel() { + return 64; + } + + @Override + public double getExperience() { + return 10; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/TunaPotato.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/TunaPotato.java new file mode 100644 index 000000000..e9466ac45 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/potato/impl/TunaPotato.java @@ -0,0 +1,49 @@ +package core.game.node.entity.skill.cooking.recipe.potato.impl; + +import core.game.node.entity.skill.cooking.recipe.potato.PotatoRecipe; +import core.game.node.item.Item; + +/** + * Represents the tuna potato recipe. This recipe consists of mixing tuna and + * corn toppings. + * @author 'Vexia + * @date 22/12/2013 + */ +public class TunaPotato extends PotatoRecipe { + + /** + * Represents the tuna potato. + */ + private static final Item TUNA_POTATO = new Item(7060); + + /** + * Represents the topping item. + */ + private static final Item TOPPING = new Item(7068); + + @Override + public Item getProduct() { + return TUNA_POTATO; + } + + @Override + public Item[] getIngredients() { + return new Item[] { TOPPING }; + } + + @Override + public boolean isTopping() { + return true; + } + + @Override + public int getLevel() { + return 68; + } + + @Override + public double getExperience() { + return 10; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/stew/CurryRecipe.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/stew/CurryRecipe.java new file mode 100644 index 000000000..781ba4725 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/stew/CurryRecipe.java @@ -0,0 +1,89 @@ +package core.game.node.entity.skill.cooking.recipe.stew; + +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the curry recipe. This recipe consists of mixing 3 curry leaves or + * a spice into a stew. + * @author 'Vexia + * @date 22/12/2013 + */ +public class CurryRecipe extends Recipe { + + /** + * Represents the uncooked curry item. + */ + private static final Item UNCOOKED_CURRY = new Item(2009); + + /** + * Represents the uncooked stew item. + */ + private static final Item UNCOOKED_STEW = new Item(2001); + + /** + * Represents the spice item. + */ + private static final Item SPICE = new Item(2007); + + /** + * Represents the curry leaf. + */ + private static final Item CURRY_LEAF = new Item(5970); + + @Override + public void mix(Player player, NodeUsageEvent event) { + if (event.getBaseItem().getId() == CURRY_LEAF.getId() || event.getUsedItem().getId() == CURRY_LEAF.getId()) { + Item stew = event.getBaseItem().getId() == UNCOOKED_STEW.getId() ? event.getBaseItem() : event.getUsedItem(); + if (stew.getCharge() == 1000) { + stew.setCharge(1); + } + int charge = stew.getCharge(); + if (charge < 3) { + player.getInventory().remove(CURRY_LEAF); + stew.setCharge(charge + 1); + } else { + if (player.getInventory().remove(stew) && player.getInventory().remove(CURRY_LEAF)) { + player.getInventory().add(UNCOOKED_CURRY); + } + } + return; + } + if (player.getInventory().remove(event.getBaseItem()) && player.getInventory().remove(event.getUsedItem())) { + player.getInventory().add(getProduct()); + } + } + + @Override + public Item getBase() { + return UNCOOKED_STEW; + } + + @Override + public Item getProduct() { + return UNCOOKED_CURRY; + } + + @Override + public Item[] getIngredients() { + return new Item[] { SPICE, CURRY_LEAF }; + } + + @Override + public Item[] getParts() { + return new Item[] { UNCOOKED_STEW }; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return "You mix the spice with the stew."; + } + + @Override + public boolean isSingular() { + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/stew/StewRecipe.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/stew/StewRecipe.java new file mode 100644 index 000000000..e53e8da1d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/stew/StewRecipe.java @@ -0,0 +1,90 @@ +package core.game.node.entity.skill.cooking.recipe.stew; + +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the stew recipe. This recipe consists of mixing meat and a raw + * potato in a bowl of water. + * @author 'Vexia + * @date 22/12/2013 + */ +public class StewRecipe extends Recipe { + + /** + * Represents the uncooked stew item. + */ + private static final Item UNCOOKED_STEW = new Item(2001); + + /** + * Represents the bowl of water item. + */ + private static final Item BOWL_OF_WATER = new Item(1921); + + /** + * Represents the meat item. + */ + private static final Item MEAT = new Item(2142); + + /** + * Represents the potato item. + */ + private static final Item POTATO = new Item(1942); + + /** + * Represents the incomplete stew. + */ + private static final Item INCOMPLETE_STEW = new Item(1997); + + /** + * Represents the second incomplete stew. + */ + private static final Item INCOMPLETE_STEW2 = new Item(1999); + + @Override + public void mix(Player player, NodeUsageEvent event) { + Item first = event.getUsedItem(); + Item second = event.getBaseItem(); + if (player.getInventory().remove(first) && player.getInventory().remove(second)) { + if (first.getId() == BOWL_OF_WATER.getId() || second.getId() == BOWL_OF_WATER.getId()) { + player.getInventory().add(first.getId() == POTATO.getId() ? INCOMPLETE_STEW : first.getId() == MEAT.getId() ? INCOMPLETE_STEW2 : second.getId() == POTATO.getId() ? INCOMPLETE_STEW : second.getId() == MEAT.getId() ? INCOMPLETE_STEW2 : null); + } else { + player.getInventory().add(UNCOOKED_STEW); + } + player.getPacketDispatch().sendMessage(getMixMessage(event)); + } + } + + @Override + public Item getBase() { + return BOWL_OF_WATER; + } + + @Override + public Item getProduct() { + return UNCOOKED_STEW; + } + + @Override + public Item[] getIngredients() { + return new Item[] { MEAT, POTATO, MEAT, POTATO }; + } + + @Override + public Item[] getParts() { + return new Item[] { BOWL_OF_WATER, BOWL_OF_WATER, INCOMPLETE_STEW, INCOMPLETE_STEW2 }; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return "You cut up the " + (event.getUsedItem().getName().toLowerCase().contains("incomplete") ? event.getBaseItem().getName().toLowerCase() : event.getUsedItem().getName().toLowerCase().replace("cooked", "").trim()) + " and put it into the stew."; + } + + @Override + public boolean isSingular() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/ToppingRecipe.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/ToppingRecipe.java new file mode 100644 index 000000000..4285360f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/ToppingRecipe.java @@ -0,0 +1,58 @@ +package core.game.node.entity.skill.cooking.recipe.topping; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a generic topping recipe. + * @author 'Vexia + * @date 22/12/2013 + */ +public abstract class ToppingRecipe extends Recipe { + + /** + * Represents the bowl item. + */ + protected static final Item BOWL = new Item(1923); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + getLevel() + " in order to do this."); + return; + } + super.mix(player, event); + player.getSkills().addExperience(Skills.COOKING, getExperience(), true); + } + + @Override + public Item getBase() { + return BOWL; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return null; + } + + @Override + public boolean isSingular() { + return true; + } + + /** + * Method used to get the level required. + * @return the level. + */ + public abstract int getLevel(); + + /** + * Method used to get the experience gained. + * @return the experience. + */ + public abstract double getExperience(); + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/ChilliConCarne.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/ChilliConCarne.java new file mode 100644 index 000000000..ad64d0baf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/ChilliConCarne.java @@ -0,0 +1,81 @@ +package core.game.node.entity.skill.cooking.recipe.topping.impl; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the chilli con carne recipe. This recipe consists of using spicy + * sauce with cooked meat. + * @author 'Vexia + * @date 22/12/2013 + */ +public class ChilliConCarne extends Recipe { + + /** + * Represents the bowl item. + */ + private static final Item SPICY_SAUCE = new Item(7072); + + /** + * Represents the chilli con carne item. + */ + private static final Item CHILLI_CON_CARNE = new Item(7062); + + /** + * Represents the cooked meat item. + */ + private static final Item COOKED_MEAT = new Item(2142); + + /** + * Represents the knife item. + */ + private static final Item KNIFE = new Item(946); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < 9) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + 9 + " in order to do this."); + return; + } + if (!player.getInventory().containsItem(KNIFE)) { + player.getDialogueInterpreter().sendDialogue("You need a knife in order to cut up the meat."); + return; + } + super.mix(player, event); + player.getSkills().addExperience(Skills.COOKING, 25, true); + } + + @Override + public Item getBase() { + return SPICY_SAUCE; + } + + @Override + public Item getProduct() { + return CHILLI_CON_CARNE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { COOKED_MEAT }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return "You put the cut up meat into the bowl."; + } + + @Override + public boolean isSingular() { + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedOnion.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedOnion.java new file mode 100644 index 000000000..a3d560f1c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedOnion.java @@ -0,0 +1,69 @@ +package core.game.node.entity.skill.cooking.recipe.topping.impl; + +import core.game.node.entity.skill.cooking.recipe.topping.ToppingRecipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the chopped onion recipe. This recipe consists of using an onion + * on a bowl with a knife. + * @author 'Vexia + * @date 22/12/2013 + */ +public class ChoppedOnion extends ToppingRecipe { + + /** + * Represents the chopped onion product item. + */ + private static final Item CHOPPED_ONION = new Item(1871); + + /** + * Represents the knife used to cut the onion. + */ + private static final Item KNIFE = new Item(946); + + /** + * Represents the onion item. + */ + private static final Item ONION = new Item(1957); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (!player.getInventory().containsItem(KNIFE)) { + player.getDialogueInterpreter().sendDialogue("You need a knife in order to slice up the onion."); + return; + } + super.mix(player, event); + } + + @Override + public int getLevel() { + return 1; + } + + @Override + public double getExperience() { + return 0; + } + + @Override + public Item getProduct() { + return CHOPPED_ONION; + } + + @Override + public Item[] getIngredients() { + return new Item[] { ONION }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public boolean isSingular() { + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedTuna.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedTuna.java new file mode 100644 index 000000000..f0f3c6428 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/ChoppedTuna.java @@ -0,0 +1,69 @@ +package core.game.node.entity.skill.cooking.recipe.topping.impl; + +import core.game.node.entity.skill.cooking.recipe.topping.ToppingRecipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the chopped tuna recipe. This recipe consists of adding tuna to a + * bowl with a knife. + * @author 'Vexia + * @date 22/12/2013 + */ +public class ChoppedTuna extends ToppingRecipe { + + /** + * Represents the chopped tuna item. + */ + private static final Item CHOPPED_TUNA = new Item(7086); + + /** + * Represents the tuna item. + */ + private static final Item TUNA = new Item(361); + + /** + * Represents the knife item. + */ + private static final Item KNIFE = new Item(946); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (!player.getInventory().containsItem(KNIFE)) { + player.getDialogueInterpreter().sendDialogue("You need a knife in order to slice up the tuna."); + return; + } + super.mix(player, event); + } + + @Override + public int getLevel() { + return 1; + } + + @Override + public double getExperience() { + return 1; + } + + @Override + public Item getProduct() { + return CHOPPED_TUNA; + } + + @Override + public Item[] getIngredients() { + return new Item[] { TUNA }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public boolean isSingular() { + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/EggAndTomato.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/EggAndTomato.java new file mode 100644 index 000000000..cebfaf538 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/EggAndTomato.java @@ -0,0 +1,72 @@ +package core.game.node.entity.skill.cooking.recipe.topping.impl; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the egg and tomato recipe. This recipe consists of mixing a tomato + * with a scrambled egg. + * @author 'Vexia + * @date 22/12/2013 + */ +public class EggAndTomato extends Recipe { + + /** + * Represents the egg and tomato. + */ + private static final Item EGG_AND_TOMATO = new Item(7064); + + /** + * Represents the scrambled egg item. + */ + private static final Item SCRAMBLED_EGG = new Item(7078); + + /** + * epresents the tomato item. + */ + private static final Item TOMATO = new Item(1982); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < 23) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + 23 + " in order to do this."); + return; + } + super.mix(player, event); + player.getSkills().addExperience(Skills.COOKING, 50, true); + } + + @Override + public Item getBase() { + return SCRAMBLED_EGG; + } + + @Override + public Item getProduct() { + return EGG_AND_TOMATO; + } + + @Override + public Item[] getIngredients() { + return new Item[] { TOMATO }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return null; + } + + @Override + public boolean isSingular() { + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/MushroomAndOnion.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/MushroomAndOnion.java new file mode 100644 index 000000000..27a3b8f55 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/MushroomAndOnion.java @@ -0,0 +1,72 @@ +package core.game.node.entity.skill.cooking.recipe.topping.impl; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the mushroom and onion recipe. This recipe consists of using a + * fried mushroom with a friend onion. + * @author 'Vexia + * @date 22/12/2013 + */ +public class MushroomAndOnion extends Recipe { + + /** + * Represents the mushroom and onion item. + */ + private static final Item MUSHROOM_AND_ONION = new Item(7066); + + /** + * Represents the fried onions item. + */ + private static final Item FRIED_ONIONS = new Item(7084); + + /** + * Represents the fried mushrooms item. + */ + private static final Item FRIED_MUSHROOMS = new Item(7082); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < 57) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + 57 + " in order to do this."); + return; + } + super.mix(player, event); + player.getSkills().addExperience(Skills.COOKING, 120, true); + } + + @Override + public Item getBase() { + return FRIED_MUSHROOMS; + } + + @Override + public Item getProduct() { + return MUSHROOM_AND_ONION; + } + + @Override + public Item[] getIngredients() { + return new Item[] { FRIED_ONIONS }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return null; + } + + @Override + public boolean isSingular() { + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/SlicedMushroom.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/SlicedMushroom.java new file mode 100644 index 000000000..6ec41c7fc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/SlicedMushroom.java @@ -0,0 +1,69 @@ +package core.game.node.entity.skill.cooking.recipe.topping.impl; + +import core.game.node.entity.skill.cooking.recipe.topping.ToppingRecipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the fried mushroom recipe. This recipe consists of using a + * mushroom on a bowl. + * @author 'Vexia + * @date 22/12/2013 + */ +public final class SlicedMushroom extends ToppingRecipe { + + /** + * Represents the sliced mushrooms item. + */ + private static final Item SLICED_MUSHROOMS = new Item(7080); + + /** + * Represents the mushroom item. + */ + private static final Item MUSHROOM = new Item(6004); + + /** + * Represents the knife item. + */ + private static final Item KNIFE = new Item(946); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (!player.getInventory().containsItem(KNIFE)) { + player.getDialogueInterpreter().sendDialogue("You need a knife in order to slice up the mushrooms."); + return; + } + super.mix(player, event); + } + + @Override + public int getLevel() { + return 1; + } + + @Override + public double getExperience() { + return 0; + } + + @Override + public Item getProduct() { + return SLICED_MUSHROOMS; + } + + @Override + public Item[] getIngredients() { + return new Item[] { MUSHROOM }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public boolean isSingular() { + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/SpicySauce.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/SpicySauce.java new file mode 100644 index 000000000..d4a8d6f1f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/SpicySauce.java @@ -0,0 +1,84 @@ +package core.game.node.entity.skill.cooking.recipe.topping.impl; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the spicy sauce recipe. This recipe consists of mixing gnome spice + * and garlic together. + * @author 'Vexia + * @date 22/12/2013 + */ +public class SpicySauce extends Recipe { + + /** + * Represents the spicy sauce item. + */ + private static final Item SPICY_SAUCE = new Item(7072); + + /** + * Represents the bowl item. + */ + private static final Item BOWL = new Item(1923); + + /** + * Represents the garlic item. + */ + private static final Item GARLIC = new Item(1550); + + /** + * Represents the chopped garlic item. + */ + private static final Item CHOPPED_GARLIC = new Item(7074); + + /** + * Represents the gnome spice item. + */ + private static final Item GNOME_SPICE = new Item(2169); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < 9) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + 9 + " in order to do this."); + return; + } + super.mix(player, event); + if (event.getBaseItem().getId() == GNOME_SPICE.getId() || event.getUsedItem().getId() == GNOME_SPICE.getId()) { + player.getSkills().addExperience(Skills.COOKING, 25, true); + } + } + + @Override + public Item getBase() { + return BOWL; + } + + @Override + public Item getProduct() { + return SPICY_SAUCE; + } + + @Override + public Item[] getIngredients() { + return new Item[] { GARLIC, GNOME_SPICE }; + } + + @Override + public Item[] getParts() { + return new Item[] { BOWL, CHOPPED_GARLIC, SPICY_SAUCE }; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return null; + } + + @Override + public boolean isSingular() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/TunaAndCorn.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/TunaAndCorn.java new file mode 100644 index 000000000..dbebeeb49 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/TunaAndCorn.java @@ -0,0 +1,72 @@ +package core.game.node.entity.skill.cooking.recipe.topping.impl; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.recipe.Recipe; +import core.game.interaction.NodeUsageEvent; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the tuna and corn recipe. This recipe consists of adding cooked + * sweetcorn to a bowl of chopped tuna. + * @author 'Vexia + * @date 22/12/2013 + */ +public final class TunaAndCorn extends Recipe { + + /** + * Represents the chopped tuna item. + */ + private static final Item CHOPPED_TUNA = new Item(7086); + + /** + * Represents the cooked corn item. + */ + private static final Item COOKED_CORN = new Item(5988); + + /** + * Represents the tuna and corn item. + */ + private static final Item TUNA_AND_CORN = new Item(7068); + + @Override + public void mix(final Player player, final NodeUsageEvent event) { + if (player.getSkills().getLevel(Skills.COOKING) < 67) { + player.getDialogueInterpreter().sendDialogue("You need a Cooking level of at least " + 57 + " in order to do this."); + return; + } + super.mix(player, event); + player.getSkills().addExperience(Skills.COOKING, 204, true); + } + + @Override + public Item getBase() { + return CHOPPED_TUNA; + } + + @Override + public Item getProduct() { + return TUNA_AND_CORN; + } + + @Override + public Item[] getIngredients() { + return new Item[] { COOKED_CORN }; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + + @Override + public String getMixMessage(NodeUsageEvent event) { + return null; + } + + @Override + public boolean isSingular() { + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/UncookedEgg.java b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/UncookedEgg.java new file mode 100644 index 000000000..c77d33c69 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/cooking/recipe/topping/impl/UncookedEgg.java @@ -0,0 +1,54 @@ +package core.game.node.entity.skill.cooking.recipe.topping.impl; + +import core.game.node.entity.skill.cooking.recipe.topping.ToppingRecipe; +import core.game.node.item.Item; + +/** + * Represents the uncooked egg recipe. This recipe consists of adding an + * uncooked egg into a bowl. + * @author 'Vexia + * @date 22/12/2013 + */ +public final class UncookedEgg extends ToppingRecipe { + + /** + * Represents the egg item. + */ + private static final Item EGG = new Item(1944); + + /** + * Represents the uncooked egg product. + */ + private static final Item UNCOOKED_EGG = new Item(7076); + + @Override + public int getLevel() { + return 1; + } + + @Override + public double getExperience() { + return 1; + } + + @Override + public Item getProduct() { + return UNCOOKED_EGG; + } + + @Override + public Item[] getIngredients() { + return new Item[] { EGG }; + } + + @Override + public boolean isSingular() { + return true; + } + + @Override + public Item[] getParts() { + return new Item[] {}; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/AmuletStringingPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/AmuletStringingPlugin.java new file mode 100644 index 000000000..ff7fd9d1e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/AmuletStringingPlugin.java @@ -0,0 +1,50 @@ +package core.game.node.entity.skill.crafting; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Represents the plugin used to string an amulet. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AmuletStringingPlugin extends UseWithHandler { + + /** + * Constructs a new {@code AmuletStringingPlugin} {@code Object}. + */ + public AmuletStringingPlugin() { + super(1673, 1675, 1677, 1679, 1681, 1683, 6579); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1759, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final JewelleryCrafting.JewelleryItem data = JewelleryCrafting.JewelleryItem.forProduct(event.getUsedItem().getId() == 6579 ? 6579 : ((Item) event.getUsedWith()).getId()); + if (data == null) { + return true; + } + if (player.getSkills().getLevel(Skills.CRAFTING) < data.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Crafting level of at least " + data.getLevel() + " to do that."); + return true; + } + if (player.getInventory().remove(event.getUsedItem(), event.getBaseItem())) { + player.getInventory().add(new Item(data == JewelleryCrafting.JewelleryItem.ONYX_AMULET ? 6581 : data.getSendItem() + 19)); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/BattleStaves.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/BattleStaves.java new file mode 100644 index 000000000..7a88f3d32 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/BattleStaves.java @@ -0,0 +1,122 @@ +package core.game.node.entity.skill.crafting; + +/** + * Represents a battlestave. + * @author 'Vexia + */ +public enum BattleStaves { + WATER(571, 1395, 54, 100, 215, 149), + EARTH(575, 1399, 58, 112.5, 29415, 151), + FIRE(569, 1393, 62, 125, 2153, 152), + AIR(573, 1397, 66, 137.5, 2152, 150); + + /** + * The obelisk used. + */ + private final int obelisk; + + /** + * The product made. + */ + private final int product; + + /** + * The level needed to make the staff. + */ + private final int level; + + /** + * The exp gained. + */ + private final double exp; + + /** + * The object id. + */ + private final int objectId; + + /** + * The graphic id. + */ + private final int graphicId; + + /** + * Constructs a new {@code BattleStaves} {@Code Object} + * @param obelisk the obelisk. + * @param product the product. + * @param level the lever. + * @param exp the experience. + * @param objectId the id. + * @param graphicId the id. + */ + BattleStaves(int obelisk, int product, int level, double exp, final int objectId, final int graphicId) { + this.obelisk = obelisk; + this.product = product; + this.level = level; + this.exp = exp; + this.objectId = objectId; + this.graphicId = graphicId; + } + + /** + * Gets a battle stave by the id. + * @param id the id. + * @return the object. + */ + public static BattleStaves forId(int id) { + for (BattleStaves staff : BattleStaves.values()) { + if (staff.getObelisk() == id) { + return staff; + } + } + return null; + } + + /** + * Gets the obelisk. + * @return The obelisk. + */ + public int getObelisk() { + return obelisk; + } + + /** + * Gets the product. + * @return The product. + */ + public int getProduct() { + return product; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the objectId. + * @return The objectId. + */ + public int getObjectId() { + return objectId; + } + + /** + * Gets the graphicId. + * @return The graphicId. + */ + public int getGraphicId() { + return graphicId; + } + + /** + * Gets the exp. + * @return The exp. + */ + public double getExp() { + return exp; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/BattlestaveMakePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/BattlestaveMakePlugin.java new file mode 100644 index 000000000..ef4386e63 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/BattlestaveMakePlugin.java @@ -0,0 +1,66 @@ +package core.game.node.entity.skill.crafting; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the battle stave making plugin used for zaff. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BattlestaveMakePlugin extends UseWithHandler { + + /** + * Represents the original staff item. + */ + private static final Item STAFF = new Item(1391, 1); + + /** + * Constructs a new {@code BattlestaveMakePlugin} {@code Object}. + */ + public BattlestaveMakePlugin() { + super(STAFF.getId(), 573, 571, 575, 569); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(573, ITEM_TYPE, this); + addHandler(571, ITEM_TYPE, this); + addHandler(575, ITEM_TYPE, this); + addHandler(569, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (event.getUsedItem().getId() != STAFF.getId()) { + return false; + } + int id = event.getUsedItem().getId() == STAFF.getId() ? event.getUsedWith().getId() : event.getUsedItem().getId(); + final BattleStaves staff = BattleStaves.forId(id); + if (staff == null) + return true; + if (player.getSkills().getLevel(Skills.CRAFTING) < staff.getLevel()) { + player.getPacketDispatch().sendMessage("You need a crafting level of " + staff.getLevel() + " to make this."); + return true; + } + player.getInventory().remove(STAFF); + player.getInventory().remove(new Item(staff.getObelisk(), 1)); + player.getInventory().add(new Item(staff.getProduct(), 1)); + player.getSkills().addExperience(Skills.CRAFTING, staff.getExp(), true); + // Craft an air battlestaff + if (staff == BattleStaves.AIR) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 2, 6); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/ChiselLimestonePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/ChiselLimestonePlugin.java new file mode 100644 index 000000000..0f1724b0a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/ChiselLimestonePlugin.java @@ -0,0 +1,38 @@ +package core.game.node.entity.skill.crafting; + +import core.game.node.entity.skill.crafting.limestone.ChiselLimestonePulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * The plugin that starts the chisel limestone cutting pulse. + * @author Jamix77 + */ +@Initializable +public final class ChiselLimestonePlugin extends UseWithHandler { + + /** + * Constructs a new {@code GemCutPlugin} {@Code Object} + */ + public ChiselLimestonePlugin() { + super(3211); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1755, ITEM_TYPE, this); + return null; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + player.getPulseManager().run(new ChiselLimestonePulse(player, new Item(3211))); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/GemCutPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/GemCutPlugin.java new file mode 100644 index 000000000..0fdf09f55 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/GemCutPlugin.java @@ -0,0 +1,58 @@ +package core.game.node.entity.skill.crafting; + +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.crafting.gem.GemCutPulse; +import core.game.node.entity.skill.crafting.gem.Gems; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to cut a gem. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class GemCutPlugin extends UseWithHandler { + + /** + * Constructs a new {@code GemCutPlugin} {@Code Object} + */ + public GemCutPlugin() { + super(1623, 1621, 1619, 1617, 1631, 6571, 1625, 1627, 1629, 6571); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1755, ITEM_TYPE, this); + return null; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Gems gem = Gems.forId(event.getUsedItem().getId() == 1755 ? event.getBaseItem() : event.getUsedItem()); + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, gem.getGem()) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new GemCutPulse(player, gem.getUncut(), amount, gem)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(gem.getUncut()); + } + + }; + if (player.getInventory().getAmount(gem.getUncut()) == 1) { + handler.create(0, 1); + } else { + handler.open(); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/GlassProduct.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/GlassProduct.java new file mode 100644 index 000000000..fd9dd21da --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/GlassProduct.java @@ -0,0 +1,105 @@ +package core.game.node.entity.skill.crafting; + +/** + * Represents the glass product. + * @author 'Vexia + */ +public enum GlassProduct { + + VIAL(38, 229, 1, 33, 35), ORB(39, 567, 1, 46, 52.5), BEER(40, 1919, 1, 1, 17.5), CANDLE(41, 4527, 1, 4, 19), OIL_LAMP(42, 4525, 1, 12, 25), FISHBOWL(44, 6667, 1, 42, 42.5), LANTERN_LENS(43, 4542, 1, 49, 55), LIGHT_ORB(45, 10973, 1, 87, 70); + + /** + * Represents the button pressed. + */ + private final int buttonId; + + /** + * Represents the product. + */ + private final int product; + + /** + * Represents the amount. + */ + private final int amount; + + /** + * Represents the level needed. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Constructs a new {@code GlassDefinitions.java} {@Code Object} + * @param buttonId the button id. + * @param result the product. + * @param amount the amount. + * @param level the level. + * @param experience the exp. + */ + private GlassProduct(int buttonId, int result, int amount, int level, double experience) { + this.buttonId = buttonId; + this.product = result; + this.amount = amount; + this.level = level; + this.experience = experience; + } + + /** + * Gets the buttonId. + * @return The buttonId. + */ + public int getButtonId() { + return buttonId; + } + + /** + * Gets the product. + * @return The product. + */ + public int getProduct() { + return product; + } + + /** + * Gets the amount. + * @return The amount. + */ + public int getAmount() { + return amount; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the glass product by the id. + * @param id the id. + * @return the product. + */ + public static GlassProduct forId(int id) { + for (GlassProduct def : GlassProduct.values()) { + if (def.getButtonId() == id) { + return def; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/JewelleryCraftPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/JewelleryCraftPlugin.java new file mode 100644 index 000000000..5ea7d4714 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/JewelleryCraftPlugin.java @@ -0,0 +1,43 @@ +package core.game.node.entity.skill.crafting; + +import core.plugin.Initializable; +import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.plugin.Plugin; + +/** + * Represents the plugin used to craft jewellery. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class JewelleryCraftPlugin extends UseWithHandler { + + /** + * Represents the ids to use for this plugin. + */ + private static final int[] IDS = new int[] { 4304, 6189, 11010, 11666, 12100, 12809, 18497, 26814, 30021, 30510, 36956, 37651 }; + + /** + * Constructs a new {@code JewelleryCraftPlugin} {@code Object}. + */ + public JewelleryCraftPlugin() { + super(2357); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : IDS) { + addHandler(i, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + JewelleryCrafting.open(event.getPlayer()); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/MoltenGlassMakePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/MoltenGlassMakePlugin.java new file mode 100644 index 000000000..0714862d1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/MoltenGlassMakePlugin.java @@ -0,0 +1,121 @@ +package core.game.node.entity.skill.crafting; + +import core.plugin.Initializable; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the plugin used to make molten glass. + * @author Vexia + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class MoltenGlassMakePlugin extends UseWithHandler { + + /** + * Constructs a new {@code MoltenGlassMakePlugin} {@code Object}. + */ + public MoltenGlassMakePlugin() { + super(1783, 1781); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(4304, OBJECT_TYPE, this); + addHandler(6189, OBJECT_TYPE, this); + addHandler(9390, OBJECT_TYPE, this); + addHandler(11010, OBJECT_TYPE, this); + addHandler(11666, OBJECT_TYPE, this); + addHandler(12100, OBJECT_TYPE, this); + addHandler(12809, OBJECT_TYPE, this); + addHandler(18497, OBJECT_TYPE, this); + addHandler(26814, OBJECT_TYPE, this); + addHandler(30021, OBJECT_TYPE, this); + addHandler(30510, OBJECT_TYPE, this); + addHandler(36956, OBJECT_TYPE, this); + addHandler(37651, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + event.getPlayer().getPulseManager().run(new MoltenGlassPulse(event.getPlayer(), event.getUsedItem())); + return true; + } + + /** + * Represents the pulse for molten glass making via a furnace + * @author Splinter + */ + public static class MoltenGlassPulse extends SkillPulse { + + /** + * Represents the bucket of sand item. + */ + private static final Item BUCKET_OF_SAND = new Item(1783); + + /** + * Represents the soda ash item. + */ + private static final Item SODA_ASH = new Item(1781); + + /** + * Represents the molten glass item. + */ + private static final Item MOLTEN_GLASS = new Item(1775); + + /** + * Represents the bucket item. + */ + private static final Item BUCKET = new Item(1925); + + /** + * Constructs a new {@code MoltenGlassPulse} {@code Object}. + * @param player the player. + * @param node the node. + */ + public MoltenGlassPulse(Player player, Item node) { + super(player, node); + } + + @Override + public boolean checkRequirements() { + if (player.getInventory().contains(1783, 1) && player.getInventory().contains(1781, 1)) { + return true; + } + player.sendMessage("You need at least one heap of soda ash and one bucket of sand to do this."); + return false; + } + + @Override + public void animate() { + player.animate(Animation.create(899)); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + super.setDelay(3); + return false; + } + if (player.getInventory().remove(BUCKET_OF_SAND, SODA_ASH)) { + player.lock(3); + player.getInventory().add(MOLTEN_GLASS, BUCKET); + player.getSkills().addExperience(Skills.CRAFTING, 20, true); + player.sendMessage("You heat the sand and soda ash in the furnace to make glass."); + } else { + return true; + } + return false; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/PotteryPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/PotteryPlugin.java new file mode 100644 index 000000000..e16600211 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/PotteryPlugin.java @@ -0,0 +1,164 @@ +package core.game.node.entity.skill.crafting; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.crafting.pottery.FirePotteryPulse; +import core.game.node.entity.skill.crafting.pottery.PotteryItem; +import core.game.node.entity.skill.crafting.pottery.PotteryPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle pottery actions. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class PotteryPlugin extends UseWithHandler { + + /** + * Represents the soft clay item. + */ + private static final Item SOFT_CLAY = new Item(1761); + + /** + * Represents the oven ids. + */ + private static final int[] OVENS = new int[] { 2643, 4308, 11601, 34802 }; + + /** + * Constructs a new {@code PotteryPlugin} {@code Object}. + */ + public PotteryPlugin() { + super(1761); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new FireOvenPlugin().newInstance(arg); + addHandler(2642, OBJECT_TYPE, this); + addHandler(2643, OBJECT_TYPE, this); + addHandler(4308, OBJECT_TYPE, this); + addHandler(4310, OBJECT_TYPE, this); + addHandler(20375, OBJECT_TYPE, this); + addHandler(34801, OBJECT_TYPE, this); + addHandler(34802, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + new SkillDialogueHandler(player, SkillDialogue.FIVE_OPTION, (Object[]) getPottery(false)) { + + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new PotteryPulse(player, event.getUsedItem(), amount, PotteryItem.values()[index])); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(SOFT_CLAY); + } + + }.open(); + return true; + } + + /** + * Gets the pottery items. + * @param finished if not. + * @return the items. + */ + private Item[] getPottery(boolean finished) { + final Item[] items = new Item[PotteryItem.values().length]; + for (int i = 0; i < items.length; i++) { + items[i] = finished ? PotteryItem.values()[i].getProduct() : PotteryItem.values()[i].getUnfinished(); + } + return items; + } + + /** + * Represents the fire oven plugin. + * @author 'Vexia + * @version 1.0 + */ + public class FireOvenPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : OVENS) { + ObjectDefinition.forId(id).getHandlers().put("option:fire", this); + } + new FireUseHandler().newInstance(arg); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + getSkillHandler(player).open(); + return true; + } + + /** + * Represents the fire use with handler. + * @author 'Vexia + * @version 1.0 + */ + public final class FireUseHandler extends UseWithHandler { + + /** + * Constructs a new {@code FireUseHandler} {@code Object}. + */ + public FireUseHandler() { + super(1787, 1789, 1791, 5352, 4438); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(2643, OBJECT_TYPE, this); + addHandler(4308, OBJECT_TYPE, this); + addHandler(11601, OBJECT_TYPE, this); + addHandler(34802, OBJECT_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + getSkillHandler(player).open(); + return true; + } + + } + + /** + * Gets the skill handler dialogue. + * @param player the player. + * @return the dialogue handler. + */ + public SkillDialogueHandler getSkillHandler(final Player player) { + return new SkillDialogueHandler(player, SkillDialogue.FIVE_OPTION, (Object[]) getPottery(true)) { + + @Override + public void create(final int amount, final int index) { + player.getPulseManager().run(new FirePotteryPulse(player, PotteryItem.values()[index].getUnfinished(), PotteryItem.values()[index], amount)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(PotteryItem.values()[index].getUnfinished()); + } + }; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SilverProduct.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SilverProduct.java new file mode 100644 index 000000000..6743a4a63 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SilverProduct.java @@ -0,0 +1,138 @@ +package core.game.node.entity.skill.crafting; + +/** + * Represents a silver product. + * @author 'Vexia + */ +public enum SilverProduct { + UNBLESSED(16, 1599, 1714, 16, 50, 1716), + UNHOLY(23, 1594, 1720, 17, 50, 1724), + SICKLE(30, 2976, 2961, 18, 50, -1), + TIARA(44, 5523, 5525, 23, 52.5, -1), + DEMONIC_SIGIL(59, 6747, 6748, 20, 50, -1), + SILVTHRIL_CHAIN(73, 13153, 13154, 1, 100, -1), + LIGHTNING_ROD(37, 4200, 4201, 20, 50, -1), + SILVTHRIL_ROD(52, 7649, 7637, 99, 1, -1), + SILVER_BOLTS(66, 9434, 9382, 21, 50, -1); + /** + * The button id. + */ + private final int button; + + /** + * The product item. + */ + private final int product; + + /** + * The item needed. + */ + private final int needed; + + /** + * The level needed. + */ + private final int level; + + /** + * The exp gained. + */ + private final double exp; + + /** + * The strung id. + */ + private final int strung; + + /** + * Constructs a new {@code SilverDefinitions.java} {@Code Object} + * @param button + * @param product + * @param level + * @param exp + */ + SilverProduct(int button, int needed, int product, int level, double exp, int strung) { + this.button = button; + this.needed = needed; + this.product = product; + this.level = level; + this.exp = exp; + this.strung = strung; + } + + /** + * returns the value. + * @param id + * @return + */ + public static SilverProduct forId(int id) { + for (SilverProduct silver : SilverProduct.values()) { + if (silver.button == id) { + return silver; + } + } + return null; + } + + /** + * Gets the button. + * @return The button. + */ + public int getButton() { + return button; + } + + /** + * Gets the product. + * @return The product. + */ + public int getProduct() { + return product; + } + + /** + * Gets the needed. + * @return The needed. + */ + public int getNeeded() { + return needed; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the exp. + * @return The exp. + */ + public double getExp() { + return exp; + } + + /** + * Gets the strung. + * @return The strung. + */ + public int getStrung() { + return strung; + } + + /** + * returns the value. + * @param id + * @return + */ + public static SilverProduct forProductId(int id) { + for (SilverProduct silver : SilverProduct.values()) { + if (silver.getProduct() == id) { + return silver; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SilverStringingPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SilverStringingPlugin.java new file mode 100644 index 000000000..aff1fca3c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SilverStringingPlugin.java @@ -0,0 +1,49 @@ +package core.game.node.entity.skill.crafting; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to string jewelry. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SilverStringingPlugin extends UseWithHandler { + + /** + * Constructs a new {@code SilverStringingPlugin} {@code Object}. + */ + public SilverStringingPlugin() { + super(1714, 1720); + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + SilverProduct silver = null; + if (event.getUsedItem().getId() != 1759) { + silver = SilverProduct.forProductId(event.getUsedItem().getId()); + } else if (((Item) event.getUsedWith()).getId() != 1759) { + silver = SilverProduct.forProductId((((Item) event.getUsedWith()).getId())); + } + if (silver == null) { + return true; + } + player.getInventory().remove(new Item(silver.getProduct(), 1)); + player.getInventory().remove(new Item(1759, 1)); + player.getInventory().add(new Item(silver.getStrung(), 1)); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1759, ITEM_TYPE, this); + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SnakeSkinPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SnakeSkinPlugin.java new file mode 100644 index 000000000..243195cb0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SnakeSkinPlugin.java @@ -0,0 +1,70 @@ +package core.game.node.entity.skill.crafting; + +import core.plugin.Initializable; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.crafting.armour.SnakeSkin; +import core.game.node.entity.skill.crafting.armour.SnakeSkinPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Handles snake skin plugin. + * @author Vexia + */ +@Initializable +public class SnakeSkinPlugin extends UseWithHandler { + + /** + * Constructs a new {@Code SnakeSkinPlugin} {@Code Object} + */ + public SnakeSkinPlugin() { + super(1733); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(6289, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + new SkillDialogueHandler(player, SkillDialogue.FIVE_OPTION, (Object[]) getSkins()) { + + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new SnakeSkinPulse(player, event.getUsedItem(), amount, SnakeSkin.values()[index])); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(new Item(6289)); + } + + @Override + public String getName(Item item) { + return item.getId() == 6328 ? "Boots" : item.getId() == 6330 ? "Vambs" : item.getId() == 6326 ? "Bandana" : item.getId() == 6324 ? "Chaps" : "Body"; + } + + }.open(); + return true; + } + + /** + * Gets the skins. + * @return the item. + */ + public Item[] getSkins() { + Item[] items = new Item[SnakeSkin.values().length]; + for (int i = 0; i < items.length; i++) { + items[i] = SnakeSkin.values()[i].getProduct(); + } + return items; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SnelmCraftPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SnelmCraftPlugin.java new file mode 100644 index 000000000..3ea63cca4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/SnelmCraftPlugin.java @@ -0,0 +1,111 @@ +package core.game.node.entity.skill.crafting; + +import core.plugin.Initializable; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Handles the crafting of a snelm helmet. + * @author Vexia + */ +@Initializable +public class SnelmCraftPlugin extends UseWithHandler { + + /** + * The snelm data. + */ + private static final int[][] DATA = new int[][] { { 3345, 3327 }, { 3355, 3337 },// blamish + { 3349, 3341 }, { 3341, 3359 },// ochre + { 3347, 3329 }, { 3357, 3339 },// blood + { 3351, 3333 }, { 3361, 3343 },// blue + { 3353, 3335 },// bark + }; + + /** + * Constructs a new {@Code SnelmCraftPlugin} {@Code Object} + */ + public SnelmCraftPlugin() { + super(1755); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i = 0; i < DATA.length; i++) { + for (int k = 0; k < DATA[i].length; k++) { + addHandler(DATA[i][0], ITEM_TYPE, this); + } + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + int[] snelm = null; + for (int i = 0; i < DATA.length; i++) { + for (int k = 0; k < DATA[i].length; k++) { + if (DATA[i][0] == event.getUsedItem().getId()) { + snelm = DATA[i]; + break; + } + } + } + if (snelm == null) { + return false; + } + player.lock(1); + player.getPulseManager().run(new SnelmCraftPulse(player, event.getUsedItem(), snelm)); + return true; + } + + /** + * Handles the crafting of a snelm helmet. + * @author Vexia + */ + public static final class SnelmCraftPulse extends SkillPulse { + + /** + * The snelm data. + */ + private final int[] data; + + /** + * Constructs a new {@Code SnelmCraftPulse} {@Code Object} + * @param player the player. + * @param node the node. + */ + public SnelmCraftPulse(Player player, Item node, int[] data) { + super(player, node); + this.setDelay(1); + this.data = data; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getStaticLevel(Skills.CRAFTING) < 15) { + player.sendMessage("You need a Crafting level of at least 15 in order to do this."); + return false; + } + return true; + } + + @Override + public void animate() { + + } + + @Override + public boolean reward() { + player.sendMessage("You craft the shell into a helmet."); + player.getInventory().replace(new Item(data[1]), node.getSlot()); + player.getSkills().addExperience(Skills.CRAFTING, 32.5, true); + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/StitchCraftPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/StitchCraftPlugin.java new file mode 100644 index 000000000..0c5ccc05d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/StitchCraftPlugin.java @@ -0,0 +1,45 @@ +package core.game.node.entity.skill.crafting; + +import core.game.component.Component; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * The Stitch Crafting Plugin + * @author SonicForce41 + */ +@Initializable +public class StitchCraftPlugin extends UseWithHandler { + + /** + * Constructs a new {@code StitchCraftPlugin.java} {@Code Object} + */ + public StitchCraftPlugin() { + super(1741); + } + + /** + * Method handles the actions for this Plugin + */ + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + int itemId = event.getUsedItem().getId(); + player.getAttributes().put("leatherId", itemId); + player.getInterfaceManager().open(new Component(154)); + return true; + } + + /** + * Method returns the instance for plugin + */ + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(1733, ITEM_TYPE, this); + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/StuddedArmourPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/StuddedArmourPlugin.java new file mode 100644 index 000000000..a2669691c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/StuddedArmourPlugin.java @@ -0,0 +1,244 @@ +package core.game.node.entity.skill.crafting; + +import core.plugin.Initializable; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the studded body plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class StuddedArmourPlugin extends UseWithHandler { + + /** + * Represents the steel studs item. + */ + private static final Item STEEL_STUDS = new Item(2370); + + /** + * Constructs a new {@code StuddedBodyPlugin} {@code Object}. + */ + public StuddedArmourPlugin() { + super(2370); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (StuddedArmour armour : StuddedArmour.values()) { + addHandler(armour.getItem().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + final StuddedArmour armour = StuddedArmour.forItem(event.getBaseItem()); + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, armour.getStudded()) { + + @Override + public void create(int amount, int index) { + player.getPulseManager().run(new StudArmourPulse(player, event.getBaseItem(), armour, amount)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(STEEL_STUDS); + } + + }; + if (player.getInventory().getAmount(armour.getItem()) == 1) { + handler.create(1, 0); + } else { + handler.open(); + } + return true; + } + + /** + * Represents a studded armour. + * @author 'Vexia + * @version 1.0 + */ + public enum StuddedArmour { + CHAPS(new Item(1095), new Item(1097), 18, 27), BODY(new Item(1129), new Item(1133), 14, 25); + + /** + * Represents the unstudded item. + */ + private final Item item; + + /** + * Represents the studded item. + */ + private final Item studded; + + /** + * Represents the level needed. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Constructs a new {@code StuddedArmour} {@code Object}. + * @param item the item. + * @param studded the studded item. + * @param level the level. + * @param experience the experience. + */ + private StuddedArmour(Item item, Item studded, int level, double experience) { + this.item = item; + this.studded = studded; + this.level = level; + this.experience = experience; + } + + /** + * Gets the studded armour for the item. + * @param item the item. + * @return the studden armour. + */ + public static StuddedArmour forItem(final Item item) { + for (StuddedArmour armour : values()) { + if (armour.getItem().getId() == item.getId()) { + return armour; + } + } + return null; + } + + /** + * Gets the item. + * @return The item. + */ + public Item getItem() { + return item; + } + + /** + * Gets the studded. + * @return The studded. + */ + public Item getStudded() { + return studded; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + } + + /** + * Represents the skill pulse used to stud armour. + * @author 'Vexia + * @version 1.0 + */ + public static final class StudArmourPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = Animation.create(1249); + + /** + * Represents the armour being studded. + */ + private final StuddedArmour armour; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code StudArmourPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param armour the armour. + * @param amount the amount. + */ + public StudArmourPulse(Player player, Item node, final StuddedArmour armour, final int amount) { + super(player, node); + this.armour = armour; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.CRAFTING) < armour.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Crafting level of at least " + armour.getLevel() + " to do this."); + return false; + } + if (!player.getInventory().containsItem(STEEL_STUDS)) { + player.getPacketDispatch().sendMessage("You need studs in order to make studded armour."); + return false; + } + if (!player.getInventory().containsItem(armour.getItem())) { + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + if (player.getInventory().remove(armour.getItem(), STEEL_STUDS)) { + player.getInventory().add(armour.getStudded()); + player.getSkills().addExperience(Skills.CRAFTING, armour.getExperience(), true); + player.getPacketDispatch().sendMessage("You make a " + armour.getStudded().getName().toLowerCase() + "."); + } + amount--; + return amount < 1; + } + + @Override + public void message(int type) { + switch (type) { + case 0: + player.getPacketDispatch().sendMessage("You use the studs with the " + node.getName().toLowerCase() + "."); + break; + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/TanningProduct.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/TanningProduct.java new file mode 100644 index 000000000..7f611672d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/TanningProduct.java @@ -0,0 +1,155 @@ +package core.game.node.entity.skill.crafting; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; + +/** + * Represents a tanning product. + * @author Vexia + * @version 1.1 + */ +public enum TanningProduct { + SOFT_LEATHER(1, 1739, 1741), + HARD_LEATHER(2, 1739, 1743), + SNAKESKIN(3, 6287, 6289), + SNAKESKIN2(4, 6287, 6289), + GREEN_DHIDE(5, 1753, 1745), + BLUEDHIDE(6, 1751, 2505), + REDDHIDE(7, 1749, 2507), + BLACKDHIDE(8, 1747, 2509); + + /** + * The button. + */ + private final int button; + + /** + * The item needed. + */ + private final int item; + + /** + * The product. + */ + private final int product; + + /** + * Constructs a new {@code TanningProduct} {@Code Object} + * @param button the button. + * @param item the item. + * @param product the product. + */ + TanningProduct(int button, int item, int product) { + this.button = button; + this.item = item; + this.product = product; + } + + /** + * @return the button. + */ + public int getButton() { + return button; + } + + /** + * @return the item. + */ + public int getItem() { + return item; + } + + /** + * @return the product. + */ + public int getProduct() { + return product; + } + + /** + * Gets the product by the id. + * @param id the id. + * @return the product. + */ + public static TanningProduct forId(int id) { + for (TanningProduct def : TanningProduct.values()) { + if (def.getButton() == id) { + return def; + } + } + return null; + } + + /** + * Gets the product by the id. + * @param id the id. + * @return te product. + */ + public static TanningProduct forItemId(int id) { + for (TanningProduct def : TanningProduct.values()) { + if (def.getItem() == id) { + return def; + } + } + return null; + } + + /** + * Method used to open the tanning interface. + */ + public static void open(final Player player, final int npc) { + player.getInterfaceManager().open(new Component(324)); + //Removed all the string modification that was here earlier -- it seems the client automatically does it now. + } + + /** + * Method used to tan the hide. + * @param player the player. + * @param amount the amount. + */ + public static void tan(final Player player, int amount, TanningProduct def) { + if (amount > player.getInventory().getAmount(new Item(def.getItem()))) { + amount = player.getInventory().getAmount(new Item(def.getItem())); + } + int coins = 0; + if (def == SOFT_LEATHER) { + coins = 1; + } else if (def == HARD_LEATHER) { + coins = 3; + } else if (def == SNAKESKIN) { + coins = 20; + } else if (def == SNAKESKIN2) { + coins = 15; + } else { + coins = 20; + } + if (amount == 0) { + return; + } + if (!player.getInventory().contains(def.getItem(), amount)) { + player.getPacketDispatch().sendMessage("You don't have any " + ItemDefinition.forId(def.getItem()).getName().toLowerCase() + " to tan."); + return; + } + player.getInterfaceManager().close(); + if (!player.getInventory().contains(995, coins * amount)) { + player.getPacketDispatch().sendMessage("You don't have enough coins to tan that many."); + return; + } + if (player.getInventory().remove(new Item(995, coins * amount)) && player.getInventory().remove(new Item(def.getItem(), amount))) { + player.getInventory().add(new Item(def.getProduct(), amount)); + if (amount > 1) { + player.getPacketDispatch().sendMessage("The tanner tans " + amount + " " + ItemDefinition.forId(def.getItem()).getName().toLowerCase() + "s for you."); + } else { + player.getPacketDispatch().sendMessage("The tanner tans your " + ItemDefinition.forId(def.getItem()).getName().toLowerCase() + "."); + } + if (def == SOFT_LEATHER) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 2); + } + } else { + player.getPacketDispatch().sendMessage("You don't have enough coins to tan that many."); + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/WeaveOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/WeaveOptionPlugin.java new file mode 100644 index 000000000..ab65e24de --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/WeaveOptionPlugin.java @@ -0,0 +1,204 @@ +package core.game.node.entity.skill.crafting; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.StringUtils; + +/** + * Represents the plugin used for weaving. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class WeaveOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("weave", this); + return this; + } + + @Override + public boolean handle(final Player player, final Node node, String option) { + new SkillDialogueHandler(player, SkillDialogue.THREE_OPTION, WeavingItem.SACK.getProduct(), WeavingItem.BASKET.getProduct(), WeavingItem.CLOTH.getProduct()) { + @Override + public void create(int amount, int index) { + player.getPulseManager().run(new WeavePulse(player, (GameObject) node, WeavingItem.values()[index], amount)); + } + }.open(); + return true; + } + + /** + * Represents the weaving pulse. + * @author 'Vexia + * @version 1.0 + */ + public static final class WeavePulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(2270); + + /** + * Represents the weaving item. + */ + private final WeavingItem type; + + /** + * Represents the amount. + */ + private int amount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code WeavePulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param amount the amount. + */ + public WeavePulse(Player player, GameObject node, final WeavingItem type, final int amount) { + super(player, node); + this.type = type; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.CRAFTING) < type.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Crafting level of at least " + type.getLevel() + " in order to do this."); + return false; + } + if (!player.getInventory().containsItem(type.getRequired())) { + player.getPacketDispatch().sendMessage("You need " + type.getRequired().getAmount() + " " + type.getRequired().getName().toLowerCase().replace("ball", "balls") + "" + (type == WeavingItem.SACK ? "s" : type == WeavingItem.CLOTH ? "" : "es") + " to weave " + (StringUtils.isPlusN(type.getProduct().getName().toLowerCase()) ? "an" : "a") + " " + type.getProduct().getName().toLowerCase() + "."); + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + if (player.getInventory().remove(type.getRequired())) { + player.getInventory().add(type.getProduct()); + player.getSkills().addExperience(Skills.CRAFTING, type.getExperience(), true); + player.getPacketDispatch().sendMessage("You weave the " + + type.getRequired().getName().toLowerCase().replace("ball", "balls") + + "" + (type == WeavingItem.SACK ? "s" : type == WeavingItem.CLOTH ? "" : "es") + + " into " + (StringUtils.isPlusN(type.getProduct().getName().toLowerCase()) ? "an" : "a") + + " " + type.getProduct().getName().toLowerCase() + "."); + if (type == WeavingItem.BASKET && node.getId() == 8717 && player.getLocation().withinDistance(new Location(3039,3287,0)) + && !player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).isComplete(1,0)) { + player.getAchievementDiaryManager().getDiary(DiaryType.FALADOR).updateTask(player,1,0, true); + } + } + amount--; + return amount < 1; + } + + } + + /** + * Represents a weaving item. + * @author 'Vexia + * @version 1.0 + */ + public enum WeavingItem { + SACK(new Item(5418), new Item(5931, 4), 21, 38), + BASKET(new Item(5376), new Item(5933, 6), 36, 56), + CLOTH(new Item(3224), new Item(1759, 4), 10, 12); + + /** + * Represents the product. + */ + private final Item product; + + /** + * Represents the required required. + */ + private final Item required; + + /** + * Represents the level needed. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Constructs a new {@code WeavingItem} {@code Object}. + * @param product the product. + * @param level the level. + * @param required the required. + * @param experience the experience. + */ + private WeavingItem(Item product, final Item required, int level, double experience) { + this.product = product; + this.required = required; + this.level = level; + this.experience = experience; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the required. + * @return The required + */ + public Item getRequired() { + return required; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/DragonCraftPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/DragonCraftPulse.java new file mode 100644 index 000000000..87ea0a5f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/DragonCraftPulse.java @@ -0,0 +1,110 @@ +package core.game.node.entity.skill.crafting.armour; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.armour.LeatherCrafting.DragonHide; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.tools.StringUtils; + +/** + * Represents a pulse used to craft dragon armour. + * @author 'Vexia + */ +public final class DragonCraftPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = Animation.create(1249); + + /** + * Represents the dragon hide type. + */ + private DragonHide hide; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code DragonCraftPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param amount the amount. + */ + public DragonCraftPulse(Player player, Item node, DragonHide hide, int amount) { + super(player, node); + this.hide = hide; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.CRAFTING) < hide.getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a crafting level of " + hide.getLevel() + " to make " + ItemDefinition.forId(hide.getProduct()).getName() + "."); + amount = 0; + return false; + } + if (!player.getInventory().contains(LeatherCrafting.NEEDLE, 1)) { + player.getDialogueInterpreter().sendDialogue("You need a needle to make this."); + amount = 0; + return false; + } + if (!player.getInventory().containsItem(LeatherCrafting.THREAD)) { + player.getDialogueInterpreter().sendDialogue("You need thread to make this."); + amount = 0; + return false; + } + if (!player.getInventory().contains(hide.getLeather(), hide.getAmount())) { + player.getDialogueInterpreter().sendDialogue("You need " + hide.getAmount() + " " + ItemDefinition.forId(hide.getLeather()).getName().toLowerCase() + " to make this."); + amount = 0; + return false; + } + player.getInterfaceManager().close(); + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + if (player.getInventory().remove(new Item(hide.getLeather(), hide.getAmount()))) { + if (hide.name().contains("VAMBS")) { + player.getPacketDispatch().sendMessage("You make a pair of " + ItemDefinition.forId(hide.getProduct()).getName().toLowerCase() + "'s."); + } else { + player.getPacketDispatch().sendMessage("You make " + (StringUtils.isPlusN(ItemDefinition.forId(hide.getProduct()).getName().toLowerCase()) ? "an" : "a") + " " + ItemDefinition.forId(hide.getProduct()).getName().toLowerCase() + "."); + } + Item item = new Item(hide.getProduct()); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, hide.getExperience(), true); + LeatherCrafting.decayThread(player); + if (LeatherCrafting.isLastThread(player)) { + LeatherCrafting.removeThread(player); + } + amount--; + } + return amount < 1; + } + + @Override + public void message(int type) { + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/HardCraftPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/HardCraftPulse.java new file mode 100644 index 000000000..403007da0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/HardCraftPulse.java @@ -0,0 +1,86 @@ +package core.game.node.entity.skill.crafting.armour; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the pulse used to craft hard leather. + * @author 'Vexia + */ +public final class HardCraftPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = Animation.create(1249); + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code HardCraftPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param amount the amount. + */ + public HardCraftPulse(Player player, Item node, int amount) { + super(player, node); + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.CRAFTING) < 28) { + player.getDialogueInterpreter().sendDialogue("You need a crafting level of " + 28 + " to make a hardleather body."); + return false; + } + if (!player.getInventory().contains(LeatherCrafting.NEEDLE, 1)) { + return false; + } + if (!player.getInventory().contains(LeatherCrafting.HARD_LEATHER, 1)) { + return false; + } + if (!player.getInventory().containsItem(LeatherCrafting.THREAD)) { + player.getDialogueInterpreter().sendDialogue("You need thread to make this."); + return false; + } + player.getInterfaceManager().close(); + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + if (player.getInventory().remove(new Item(LeatherCrafting.HARD_LEATHER))) { + Item item = new Item(1131); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, 35, true); + LeatherCrafting.decayThread(player); + if (LeatherCrafting.isLastThread(player)) { + LeatherCrafting.removeThread(player); + } + } + amount--; + return amount < 1; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/LeatherCrafting.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/LeatherCrafting.java new file mode 100644 index 000000000..a6aa2f6e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/LeatherCrafting.java @@ -0,0 +1,294 @@ +package core.game.node.entity.skill.crafting.armour; + +import core.game.component.Component; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a useful class for leather crafting related information. + * @author 'Vexia + */ +public final class LeatherCrafting { + + /** + * Constant of a needle id. + */ + public static final int NEEDLE = 1733; + + /** + * Constant of a thread id. + */ + public static final Item THREAD = new Item(1734, 1); + + /** + * Constant of a needle id. + */ + public static final int LEATHER = 1741; + + /** + * Constant of a thread id. + */ + public static final int HARD_LEATHER = 1743; + + /** + * The constants of leather id's related to dragon hides. + */ + public static final int GREEN_LEATHER = 1745, BLUE_LEATHER = 2505, RED_LEATHER = 2507, BLACK_LEATHER = 2509; + + /** + * The leather interface component. + */ + private static final Component COMPONENT = new Component(154); + + /** + * Checks if its the last thrad. + * @return {@code True} if so. + */ + public static boolean isLastThread(final Player player) { + final Item thread = getThread(player); + if (thread == null) { + return false; + } + int charge = thread.getCharge(); + return charge >= 1004; + } + + /** + * Method used to decay thread. + */ + public static void decayThread(final Player player) { + final Item thread = getThread(player); + if (thread == null) { + return; + } + int charge = thread.getCharge(); + thread.setCharge(charge + 1); + } + + /** + * Method used to remove thread. + * @param player the player. + */ + public static void removeThread(final Player player) { + if (player.getInventory().remove(THREAD)) { + player.getPacketDispatch().sendMessage("You use a reel of your thread."); + Item thread = getThread(player); + if (thread != null) { + thread.setCharge(1000); + } + } + } + + /** + * Gets the thread. + * @param player the player. + * @return the item. + */ + public static Item getThread(final Player player) { + return player.getInventory().get(player.getInventory().getSlot(THREAD)); + } + + /** + * Represents the dragon hide crafting data. + * @author 'Vexia + */ + public enum DragonHide { + GREEN_D_HIDE_VAMBS(1745, 1, 1065, 57, 62), + GREEN_D_HIDE_CHAPS(1745, 2, 1099, 60, 124), + GREEN_D_HIDE_BODY(1745, 3, 1135, 63, 186), + BLUE_D_HIDE_VAMBS(2505, 1, 2487, 66, 70), + BLUE_D_HIDE_CHAPS(2505, 2, 2493, 68, 140), + BLUE_D_HIDE_BODY(2505, 3, 2499, 71, 210), + RED_D_HIDE_VAMBS(2507, 1, 2489, 73, 78), + RED_D_HIDE_CHAPS(2507, 2, 2495, 75, 156), + RED_D_HIDE_BODY(2507, 3, 2501, 77, 234), + BLACK_D_HIDE_VAMBS(2509, 1, 2491, 79, 86), + BLACK_D_HIDE_CHAPS(2509, 2, 2497, 82, 172), + BLACK_D_HIDE_BODY(2509, 3, 2503, 84, 258); + + /** + * Constructs a new {@code LeatherCrafting.java} {@code Object}. + * @param leather the leather required. + * @param amount the amount of leather needed. + * @param product the product item. + * @param level the level required. + * @param experience the experience. + */ + DragonHide(int leather, int amount, int product, int level, double experience) { + this.leather = leather; + this.amount = amount; + this.product = product; + this.level = level; + this.experience = experience; + } + + /** + * The leather id. + */ + private final int leather; + + /** + * The leather amount required. + */ + private final int amount; + + /** + * The product. + */ + private final int product; + + /** + * The required level. + */ + private final int level; + + /** + * The experiences gained. + */ + private final double experience; + + /** + * @return the leather. + */ + public int getLeather() { + return leather; + } + + /** + * @return the amount. + */ + public int getAmount() { + return amount; + } + + /** + * @return the product. + */ + public int getProduct() { + return product; + } + + /** + * @return the level. + */ + public int getLevel() { + return level; + } + + /** + * @return the experience. + */ + public double getExperience() { + return experience; + } + + /** + * Method used to return the type for the leather. + * @param leather the leather. + * @return the hide. + */ + public static DragonHide forLeather(int leather) { + for (DragonHide hide : DragonHide.values()) { + if (hide.getLeather() == leather) { + return hide; + } + } + return null; + } + } + + /** + * Represents an enumeration of soft leather crafting values. + * @author 'Vexia + */ + public enum SoftLeather { + ARMOUR(28, 14, 25, new Item(1129)), + GLOVES(29, 1, 13.8, new Item(1059)), + BOOTS(30, 7, 16.3, new Item(1061)), + VAMBRACES(31, 11, 22, new Item(1063)), + CHAPS(32, 18, 27, new Item(1095)), + COIF(33, 38, 37, new Item(1169)), + COWL(34, 9, 18.5, new Item(1167)); + + /** + * Constructs a new {@code Soft} {@code Object}. + * @param level the level. + * @param experience the experience. + * @param product the product. + */ + SoftLeather(int button, int level, double experience, Item product) { + this.button = button; + this.level = level; + this.experience = experience; + this.product = product; + } + + /** + * The button. + */ + private final int button; + + /** + * The level required. + */ + private final int level; + + /** + * The experience gained. + */ + private final double experience; + + /** + * The product. + */ + private final Item product; + + /** + * Method used to open the crafting interface. + * @param player the player. + */ + public static void open(final Player player) { + player.getInterfaceManager().open(COMPONENT); + } + + /** + * @return the level. + */ + public int getLevel() { + return level; + } + + /** + * @return the experience. + */ + public double getExperience() { + return experience; + } + + /** + * @return the product. + */ + public Item getProduct() { + return product; + } + + /** + * @return the button. + */ + public int getButton() { + return button; + } + + /** + * Method used to get the value by the id. + */ + public static SoftLeather forButton(int button) { + for (SoftLeather soft : SoftLeather.values()) { + if (soft.getButton() == button) { + return soft; + } + } + return null; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/SnakeSkin.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/SnakeSkin.java new file mode 100644 index 000000000..6cdb26e7f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/SnakeSkin.java @@ -0,0 +1,78 @@ +package core.game.node.entity.skill.crafting.armour; + +import core.game.node.item.Item; + +/** + * A snake skin. + * @author Vexia + */ +public enum SnakeSkin { + SNAKESKIN_BOOT(new Item(6328), 45, 30, 6), SNAKESKIN_VAMBRACES(new Item(6330), 47, 35, 8), SNAKESKIN_BANDANA(new Item(6326), 48, 45, 5), SNAKESKIN_CHAPS(new Item(6324), 51, 50, 12), SNAKESKIN_BODY(new Item(6322), 53, 55, 15); + + /** + * The item product. + */ + private final Item product; + + /** + * The level. + */ + private final int level; + + /** + * The experience. + */ + private final double experience; + + /** + * The required amount of snakeskins. + */ + private final int requiredAmount; + + /** + * Constructs a new {@Code SnakeSkin} {@Code Object} + * @param product the product. + * @param level the level. + * @param experience the exp. + * @param requiredAmount the required amount. + */ + private SnakeSkin(Item product, int level, double experience, int requiredAmount) { + this.product = product; + this.level = level; + this.experience = experience; + this.requiredAmount = requiredAmount; + } + + /** + * Gets the product. + * @return the product + */ + public Item getProduct() { + return product; + } + + /** + * Gets the level. + * @return the level + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return the experience + */ + public double getExperience() { + return experience; + } + + /** + * Gets the requiredAmount. + * @return the requiredAmount + */ + public int getRequiredAmount() { + return requiredAmount; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/SnakeSkinPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/SnakeSkinPulse.java new file mode 100644 index 000000000..77ccc2d5e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/SnakeSkinPulse.java @@ -0,0 +1,93 @@ +package core.game.node.entity.skill.crafting.armour; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the pulse used to craft snake skin. + * @author 'Vexia + */ +public final class SnakeSkinPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = Animation.create(1249); + + /** + * The snake skin. + */ + private final SnakeSkin skin; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code HardCraftPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param amount the amount. + */ + public SnakeSkinPulse(Player player, Item node, int amount, SnakeSkin skin) { + super(player, node); + this.amount = amount; + this.skin = skin; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.CRAFTING) < skin.getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a crafting level of " + skin.getLevel() + " to make this."); + return false; + } + if (!player.getInventory().contains(LeatherCrafting.NEEDLE, 1)) { + return false; + } + if (!player.getInventory().containsItem(LeatherCrafting.THREAD)) { + player.getDialogueInterpreter().sendDialogue("You need thread to make this."); + return false; + } + if (!player.getInventory().contains(6289, skin.getRequiredAmount())) { + player.getDialogueInterpreter().sendDialogue("You need " + skin.getRequiredAmount() + " snakeskins in order to do this."); + return false; + } + player.getInterfaceManager().close(); + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + if (player.getInventory().remove(new Item(6289, skin.getRequiredAmount()))) { + Item item = skin.getProduct(); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, skin.getExperience(), true); + LeatherCrafting.decayThread(player); + if (LeatherCrafting.isLastThread(player)) { + LeatherCrafting.removeThread(player); + } + } + amount--; + return amount < 1; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/SoftCraftPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/SoftCraftPulse.java new file mode 100644 index 000000000..ef26db15b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/armour/SoftCraftPulse.java @@ -0,0 +1,106 @@ +package core.game.node.entity.skill.crafting.armour; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.armour.LeatherCrafting.SoftLeather; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.tools.StringUtils; + +/** + * Represents a pulse used to craft soft leather. + * @author 'Vexia + */ +public final class SoftCraftPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = Animation.create(1249); + + /** + * Represents the leather to use. + */ + private SoftLeather soft; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code SoftCraftPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param leather the soft. + * @param amount the amount. + */ + public SoftCraftPulse(Player player, Item node, SoftLeather leather, int amount) { + super(player, node); + this.soft = leather; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.CRAFTING) < soft.getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a crafting level of " + soft.getLevel() + " to make " + (StringUtils.isPlusN(soft.getProduct().getName()) ? "an" : "a" + " " + soft.getProduct().getName()).toLowerCase() + "."); + return false; + } + if (!player.getInventory().contains(LeatherCrafting.NEEDLE, 1)) { + return false; + } + if (!player.getInventory().contains(LeatherCrafting.LEATHER, 1)) { + return false; + } + if (!player.getInventory().containsItem(LeatherCrafting.THREAD)) { + player.getDialogueInterpreter().sendDialogue("You need thread to make this."); + amount = 0; + return false; + } + player.getInterfaceManager().close(); + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + if (player.getInventory().remove(new Item(LeatherCrafting.LEATHER))) { + if (soft == SoftLeather.GLOVES || soft == SoftLeather.BOOTS || soft == SoftLeather.VAMBRACES) { + player.getPacketDispatch().sendMessage("You make a pair of " + soft.getProduct().getName().toLowerCase() + "."); + } else { + player.getPacketDispatch().sendMessage("You make " + (StringUtils.isPlusN(soft.getProduct().getName()) ? "an " : "a ") + soft.getProduct().getName().toLowerCase() + "."); + } + Item item = soft.getProduct(); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, soft.getExperience(), true); + LeatherCrafting.decayThread(player); + if (LeatherCrafting.isLastThread(player)) { + LeatherCrafting.removeThread(player); + } + + if (soft == SoftLeather.GLOVES) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 3); + } + } + amount--; + return amount < 1; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/gem/GemCutPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/gem/GemCutPulse.java new file mode 100644 index 000000000..c023e0c3c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/gem/GemCutPulse.java @@ -0,0 +1,82 @@ +package core.game.node.entity.skill.crafting.gem; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the pulse used to cut a gem. + * @author 'Vexia + */ +public final class GemCutPulse extends SkillPulse { + + /** + * Represents the chisel item. + */ + private static final Item CHISEL = new Item(1755); + + /** + * Represents the gem to cut. + */ + private final Gems gem; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code GemCuttingPulse} {@Code Object} + * @param player the player. + * @param item the item cut. + */ + public GemCutPulse(Player player, Item item, int ammount, final Gems gem) { + super(player, item); + this.amount = ammount; + this.gem = gem; + this.resetAnimation = false; + } + + @Override + public boolean checkRequirements() { + if (!player.getInventory().containsItem(CHISEL)) { + return false; + } + if (!player.getInventory().containsItem(gem.getUncut())) { + return false; + } + if (player.getSkills().getLevel(Skills.CRAFTING) < gem.getLevel()) { + player.getPacketDispatch().sendMessage("You need a crafting level of " + gem.getLevel() + " to craft this gem."); + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0 || ticks < 1) { + player.getAudioManager().send(2586); + player.animate(gem.getAnimation()); + } + } + + @Override + public boolean reward() { + if (++ticks % 1 != 0) { + return false; + } + if (player.getInventory().remove(gem.getUncut())) { + final Item item = gem.getGem(); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, gem.getExp(), true); + } + amount--; + return amount < 1; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/gem/Gems.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/gem/Gems.java new file mode 100644 index 000000000..005f5d578 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/gem/Gems.java @@ -0,0 +1,114 @@ +package core.game.node.entity.skill.crafting.gem; + +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Represents a gem enumeration. + * @author 'Vexia + */ +public enum Gems { + SAPPHIRE(new Item(1623), new Item(1607), 20, new Animation(888), 50), + EMERALD(new Item(1621), new Item(1605), 27, new Animation(889), 67), + RUBY(new Item(1619), new Item(1603), 34, new Animation(887), 85), + DIAMOND(new Item(1617), new Item(1601), 43, new Animation(886), 107.5), + DRAGONSTONE(new Item(1631), new Item(1615), 55, new Animation(885), 137.5), + ONYX(new Item(6571), new Item(6573), 67, new Animation(2717), 168), + OPAL(new Item(1625), new Item(1609), 1, new Animation(890), 10), + JADE(new Item(1627), new Item(1611), 13, new Animation(891), 20), + RED_TOPAZ(new Item(1629), new Item(1613), 16, new Animation(892), 25); + + /** + * Represents the raw gem. + */ + private final Item uncut; + + /** + * Represents the gem cut. + */ + private final Item gem; + + /** + * Represents the level needed. + */ + private final int level; + + /** + * Represents the animation used. + */ + private final Animation animation; + + /** + * Represents the experience gained. + */ + private final double exp; + + /** + * Constructs a new {@code Gems} {@code Object}. + * @param uncut the uncut. + * @param gem the gem. + * @param level the level. + * @param animation the animation. + * @param exp the exp. + */ + private Gems(Item uncut, Item gem, int level, Animation animation, double exp) { + this.uncut = uncut; + this.gem = gem; + this.level = level; + this.animation = animation; + this.exp = exp; + } + + /** + * Gets the gem by the id. + * @return the gem. + */ + public static Gems forId(final Item item) { + for (Gems gem : Gems.values()) { + if (gem.getUncut().getId() == item.getId()) { + return gem; + } + } + return null; + } + + /** + * Gets the uncut. + * @return The uncut. + */ + public Item getUncut() { + return uncut; + } + + /** + * Gets the gem. + * @return The gem. + */ + public Item getGem() { + return gem; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Gets the exp. + * @return The exp. + */ + public double getExp() { + return exp; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/jewellery/JewelleryCrafting.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/jewellery/JewelleryCrafting.java new file mode 100644 index 000000000..3a087d50f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/jewellery/JewelleryCrafting.java @@ -0,0 +1,294 @@ +package core.game.node.entity.skill.crafting.jewellery; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +import java.util.HashMap; + +/** + * Represents a useful class for jewellery crafting information. + * @author Ceikry + */ +public class JewelleryCrafting { + + /** + * Represents constants of useful items. + */ + public static final int RING_MOULD = 1592, AMULET_MOULD = 1595, NECKLACE_MOULD = 1597, BRACELET_MOULD = 11065, GOLD_BAR = 2357, SAPPHIRE = 1607, EMERALD = 1605, RUBY = 1603, DIAMOND = 1601, DRAGONSTONE = 1615, ONYX = 6573; + + /** + * Represents the anum of jewellery data. + * @author 'Vexia + */ + public enum JewelleryItem { + //Ring + GOLD_RING(5, 15, 19, 1635, GOLD_BAR), + SAPPIRE_RING(20, 40, 21, 1637, SAPPHIRE, GOLD_BAR), + EMERALD_RING(27, 55, 23, 1639, EMERALD, GOLD_BAR), + RUBY_RING(34, 70, 25, 1641, RUBY, GOLD_BAR), + DIAMOND_RING(43, 85, 27, 1643, DIAMOND, GOLD_BAR), + DRAGONSTONE_RING(55, 100, 29, 1645, DRAGONSTONE, GOLD_BAR), + ONYX_RING(67, 115, 31, 6575, 6573, GOLD_BAR), + + //Necklaces + GOLD_NECKLACE(6, 20, 41, 1654, 2357), + SAPPHIRE_NECKLACE(22, 55, 43, 1656, 1607, 2357), + EMERALD_NECKLACE(29, 60, 45, 1658, 1605, 2357), + RUBY_NECKLACE(40, 75, 47, 1660, 1603, 2357), + DIAMOND_NECKLACE(56, 90, 49, 1662, 1601, 2357), + DRAGONSTONE_NECKLACE(72, 105, 51, 1664, 1615, 2357), + ONYX_NECKLACE(82, 120, 53, 6577, 6573, 2357), + SLAYER_RING(75, 15, 34, 13281, 4155, GOLD_BAR), + + + //Amulet + GOLD_AMULET(8, 30, 60, 1673, 2357), + SAPPHIRE_AMULET(24, 63, 62, 1675, 1607, 2357), + EMERALD_AMULET(31, 70, 64, 1677, 1605, 2357), + RUBY_AMULET(50, 85, 66, 1679, 1603, 2357), + DIAMOND_AMULET(70, 100, 68, 1681, 1601, 2357), + DRAGONSTONE_AMULET(80, 150, 70, 1683, 1615, 2357), + ONYX_AMULET(90, 165, 72, 6579, 6573, 2357), + + //Bracelet + GOLD_BRACELET(7, 25, 79, 11069, 2357), + SAPPHIRE_BRACELET(23, 60, 81, 11072, 1607, 2357), + EMERALD_BRACELET(30, 65, 83, 11076, 1605, 2357), + RUBY_BRACELET(42, 80, 85, 11085, 1603, 2357), + DIAMOND_BRACELET(58, 95, 87, 11092, 1601, 2357), + DRAGONSTONE_BRACELET(74, 110, 89, 11115, 1615, 2357), + ONYX_BRACELET(84, 125, 91, 11130, 6573, 2357); + + public static HashMap productMap = new HashMap<>(); + static{ + JewelleryItem[] jewelleryArray = JewelleryItem.values(); + for (JewelleryItem jewelleryItem : jewelleryArray) { + productMap.putIfAbsent(jewelleryItem.sendItem, jewelleryItem); + } + } + + /** + * Represents the item ids. + */ + private final int[] items; + + /** + * Represents the send item. + */ + private final int sendItem; + + /** + * Represents the component id. + */ + private final int componentId; + + /** + * Represents the level. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Constructs a new {@code Jewellery.java} {@code Object}. + * @param level the level. + * @param experience the experience. + */ + JewelleryItem(int level, int experience, int componentId, int sendItem, int... items) { + this.level = level; + this.experience = experience; + this.componentId = componentId; + this.sendItem = sendItem; + this.items = items; + } + + /** + * Gets the jewellery by the product. + * @param id the id. + * @return the jewellery. + */ + public static JewelleryItem forProduct(int id) { + return productMap.get(id); + } + + /** + * Gets the items. + * @return The items. + */ + public int[] getItems() { + return items; + } + + /** + * Gets the sendItem. + * @return The sendItem. + */ + public int getSendItem() { + return sendItem; + } + + /** + * Gets the componentId. + * @return The componentId. + */ + public int getComponentId() { + return componentId; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + } + + /** + * Method used to open the jewellery crafting interface. + * @param player the player. + */ + public static void open(final Player player) { + player.getInterfaceManager().open(new Component(446)); + if (player.getInventory().contains(RING_MOULD, 1)) { + player.getPacketDispatch().sendInterfaceConfig(446, 14, true); + /** hides the mould and text. */ + } + if (player.getInventory().contains(NECKLACE_MOULD, 1)) { + player.getPacketDispatch().sendInterfaceConfig(446, 36, true); + /** hides the mould and text. */ + } + if (player.getInventory().contains(AMULET_MOULD, 1)) { + player.getPacketDispatch().sendInterfaceConfig(446, 55, true); + /** hides the mould and text. */ + } + if (player.getInventory().contains(BRACELET_MOULD, 1)) { + player.getPacketDispatch().sendInterfaceConfig(446, 74, true); + /** hides the mould and text. */ + } + for (JewelleryItem data : JewelleryItem.values()) { + int length = 0; + for (int i = 0; i < data.items.length; i++) { + if (player.getInventory().contains(data.getItems()[i], 1)) { + length++; + } + } + if (!player.getInventory().contains(mouldFor(data.name()), 1)) { + length--; + } + if (length == data.getItems().length && player.getSkills().getLevel(Skills.CRAFTING) >= data.getLevel()) { + player.getPacketDispatch().sendItemZoomOnInterface(data.getSendItem(), 170, 446, data.getComponentId()); + } else { + String name = ItemDefinition.forId(data.getSendItem()).getName().toLowerCase(); + if (name.contains("amulet") && player.getInventory().contains(mouldFor(data.name()), 1)) { + for (int i = 0; i < data.items.length; i++) { + if (!player.getInventory().contains(data.getItems()[i], 1)) { + player.getPacketDispatch().sendItemZoomOnInterface(1685, 220, 446, data.getComponentId()); + break; + } + } + } + if (name.contains("ring") && !player.getInventory().contains(RING_MOULD, 1)) { + continue; + } + if (name.contains("necklace") && !player.getInventory().contains(NECKLACE_MOULD, 1)) { + continue; + } + if (data == JewelleryItem.DRAGONSTONE_AMULET && !player.getInventory().contains(AMULET_MOULD, 1)) { + continue; + } + if (name.contains("amulet") && !player.getInventory().contains(AMULET_MOULD, 1)) { + continue; + } + if (name.contains("bracelet") && !player.getInventory().contains(BRACELET_MOULD, 1)) { + continue; + } + player.getPacketDispatch().sendItemZoomOnInterface(name.contains("ring") ? 1647 : name.contains("necklace") ? 1666 : name.contains("amulet") || name.contains("ammy") ? 1685 : name.contains("bracelet") ? 11067 : -1, 1, 446, data.getComponentId()); + } + } + } + + /** + * Represents the making of a jewellery. + * @param player the player. + * @param data the data. + * @param amount the amount. + */ + public static final void make(final Player player, JewelleryItem data, int amount) { + int length = 0; + int amt = 0; + if (data.name().contains("GOLD")) { + amt = player.getInventory().getAmount(new Item(GOLD_BAR)); + } else { + int first = player.getInventory().getAmount(new Item(data.getItems()[0])); + int second = player.getInventory().getAmount(new Item(data.getItems()[1])); + if (first == second) { + amt = first; + } else if (first > second) { + amt = second; + } else { + amt = first; + } + } + if (amount > amt) { + amount = amt; + } + for (int i = 0; i < data.items.length; i++) { + if (player.getInventory().contains(data.getItems()[i], amount)) { + length++; + } + } + if (length != data.getItems().length) { + player.getPacketDispatch().sendMessage("You don't have the required items to make this item."); + return; + } + if (player.getSkills().getLevel(Skills.CRAFTING) < data.getLevel()) { + player.getPacketDispatch().sendMessage("You need a crafting level of " + data.getLevel() + " to craft this."); + return; + } + Item items[] = new Item[data.items.length]; + int index = 0; + for (int i = 0; i < data.items.length; i++) { + items[index] = new Item(data.items[i], 1 * amount); + index++; + } + player.getInterfaceManager().close(); + player.getPulseManager().run(new JewelleryPulse(player, null, data, amount)); + } + + /** + * Gets the mould id for the name. + * @param name the name. + * @return the mould id. + */ + public static int mouldFor(String name) { + name = name.toLowerCase(); + if (name.contains("ring")) { + return RING_MOULD; + } + if (name.contains("necklace")) { + return NECKLACE_MOULD; + } + if (name.contains("amulet")) { + return AMULET_MOULD; + } + if (name.contains("bracelet")) { + return BRACELET_MOULD; + } + return -1; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/jewellery/JewelleryPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/jewellery/JewelleryPulse.java new file mode 100644 index 000000000..12689fb8d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/jewellery/JewelleryPulse.java @@ -0,0 +1,90 @@ +package core.game.node.entity.skill.crafting.jewellery; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting.JewelleryItem; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the pulse used to craft jewllery. + * @author 'Vexia + */ +public final class JewelleryPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(3243); + + /** + * Represents the data of jewellery. + */ + private JewelleryItem type; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the ticks. + */ + private int ticks; + + /** + * Constructs a new {@code CraftJewellery.java} {@code Object}. + * @param player the player. + * @param node the node. + */ + public JewelleryPulse(Player player, Item node, JewelleryItem data, int amount) { + super(player, node); + this.type = data; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.CRAFTING) < type.getLevel()) { + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + if (player.getInventory().remove(getItems())) { + final Item item = new Item(type.getSendItem()); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, type.getExperience(), true); + } + amount--; + return amount < 1; + } + + /** + * Gets the items to remove. + * @return the items. + */ + private Item[] getItems() { + Item items[] = new Item[type.getItems().length]; + int index = 0; + for (int i = 0; i < type.getItems().length; i++) { + items[index] = new Item(type.getItems()[i], 1); + index++; + } + return items; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LanternCrafting.kt b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LanternCrafting.kt new file mode 100644 index 000000000..e0587b8fb --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LanternCrafting.kt @@ -0,0 +1,97 @@ +package core.game.node.entity.skill.crafting.lightsources + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +/** + * Handles the combining of items to craft lanterns + * @author Ceikry + */ +@Initializable +class LanternCrafting : UseWithHandler(36,38,4525,4542,1607){ + /** + * For candle lanterns -> Glassblowing produces 4527 + * 4527 + white candle = 4529 + * 4527 + black candle = 4532 + * + * For oil lanterns -> Glassblowing produces 4525 + * 4525 + 4540 (oil lantern frame) = 4535 (empty oil lantern) + * + * For Bullseye lanterns -> Smithing produces 4544 (bullseye lantern (unf)) + * 4544 + Lens(4542) -> 4546 + * 4544 + Sapphire(1607) -> 4700 (Sapphire lantern) + */ + override fun newInstance(arg: Any?): Plugin { + addHandler(4527, ITEM_TYPE, this) //Empty candle lantern + addHandler(4540, ITEM_TYPE,this) //oil lantern frame + addHandler(4544, ITEM_TYPE,this) //Bullseye lantern(unf) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false //if event is null don't execute + val used = event.used + return when(used.id){ + 4527 -> craftCandleLantern(event.player,event) + 4540 -> craftOilLantern(event.player,event) + 4544 -> craftBullseyeLantern(event.player,event) + else -> false + } + } + + private fun craftCandleLantern(player: Player, event: NodeUsageEvent): Boolean{ + return when(event.usedWith.id){ + 36,38 -> { + removeEventItems(player,event) + player.inventory.add( if(event.usedWith.id == 36) Item(4529) else Item(4532)) + player.sendMessage("You place the unlit candle inside the lantern.") + true + } + else -> false + } + } + + private fun craftOilLantern(player: Player, event: NodeUsageEvent): Boolean { + return when(event.usedWith.id){ + 4525 -> { + removeEventItems(player,event) + player.inventory.add(Item(4535)) + player.sendMessage("You place the oil lamp inside its metal frame.") + true + } + else -> false + } + } + + private fun craftBullseyeLantern(player: Player,event: NodeUsageEvent): Boolean{ + return when(event.usedWith.id){ + 4542 -> { + removeEventItems(player,event) + player.inventory.add( Item(4546) ) + player.sendMessage("You fashion the lens onto the lantern.") + true + } + 1607 -> { + if(player.skills.getLevel(Skills.CRAFTING) >= 20){ + removeEventItems(player,event) + player.inventory.add(Item(4700)) + player.sendMessage("You fashion the gem into a lens and fit it onto the lantern") + } else { + player.sendMessage("You require a crafting level of 20 to use a gem as a lens.") + } + true + } + else -> false + } + } + + private fun removeEventItems(player: Player, event: NodeUsageEvent){ + player.inventory.remove(event.used.asItem()) + player.inventory.remove(event.usedWith.asItem()) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisher.kt b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisher.kt new file mode 100644 index 000000000..e9523bc3b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceExtinguisher.kt @@ -0,0 +1,41 @@ +package core.game.node.entity.skill.crafting.lightsources + +import core.cache.def.impl.ItemDefinition +import core.game.container.Container +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.plugin.Initializable +import core.plugin.Plugin + + +/** + * Extinguishes light sources + * @author Ceikry + */ +@Initializable +class LightSourceExtinguisher : OptionHandler(){ + override fun newInstance(arg: Any?): Plugin { + ItemDefinition.setOptionHandler("extinguish",this) + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + node ?: return false + player ?: return false + + val lightSource = LightSources.forId(node.id) + + lightSource ?: return false.also { SystemLogger.logWarn("UNHANDLED EXTINGUISH OPTION: ID = ${node.id}") } + + player.inventory.replace(node.asItem(), Item(lightSource.fullID)) + return true + } + + fun Container.replace(item: Item, with: Item){ + remove(item) + add(with) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceLighter.kt b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceLighter.kt new file mode 100644 index 000000000..18c40d73e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSourceLighter.kt @@ -0,0 +1,89 @@ +package core.game.node.entity.skill.crafting.lightsources + +import core.game.container.Container +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.node.entity.skill.Skills + +/** + * Method used to light various light sources + * @author Ceikry + */ +@Initializable +class LightSourceLighter : UseWithHandler(590,36,38){ + /** + * For Candles: + * 36 + tinderbox = 33 + * 38 + tinderbox = 32 + * + * For torches: + * 596 + tinderbox = 594 + * + * For Candle lanterns: + * 4529 + tinderbox = 4531 + * 4532 + tinderbox = 4534 + * Required Level: 4 Firemaking + * + * For oil lamps: + * 4522 + tinderbox = 4524 + * Required Level: 12 Firemaking + * + * For oil lanterns: + * 4537 + tinderbox = 4539 + * Required Level: 26 Firemaking + * + * For bullseye lanterns: + * 4548 + tinderbox = 4550 + * 4700 + tinderbox = 4702 + * 9064 + tinderbox = 9065 + * Required Level: 49 Firemaking + */ + + override fun newInstance(arg: Any?): Plugin { + addHandler(590, ITEM_TYPE, this) + addHandler(596, ITEM_TYPE, this) + addHandler(4529, ITEM_TYPE, this) + addHandler(4532, ITEM_TYPE, this) + addHandler(4522, ITEM_TYPE, this) + addHandler(4537, ITEM_TYPE, this) + addHandler(4548, ITEM_TYPE, this) + addHandler(4700, ITEM_TYPE, this) + addHandler(9064, ITEM_TYPE, this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val inventory = event.player.inventory + val used = if(event.used.id == 590) event.usedWith.asItem() else event.used.asItem() //compensation for bad two-way use with handler shit + + val lightSource = LightSources.forId(used.id) + + lightSource ?: return false + + if(!light(event.player,used,lightSource)){ + event.player.sendMessage("You need a Firemaking level of at least ${lightSource.levelRequired} to light this.") + } + + return true + } + + fun Container.replace(item: Item, with: Item){ + remove(item) + add(with) + } + + fun light(player: Player, item: Item, lightSource: LightSources): Boolean{ + val requiredLevel = lightSource.levelRequired + val playerLevel = player.skills.getLevel(Skills.FIREMAKING) + + if(playerLevel < requiredLevel) return false + + player.inventory.replace(item,Item(lightSource.litID)) + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSources.kt b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSources.kt new file mode 100644 index 000000000..6740be38a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/lightsources/LightSources.kt @@ -0,0 +1,32 @@ +package core.game.node.entity.skill.crafting.lightsources + +enum class LightSources(val emptyID: Int, val fullID: Int, val litID: Int, val levelRequired: Int, val openFlame: Boolean) { + WHITE_CANDLE(0,36,33,0,true), + BLACK_CANDLE(0,38,32,0,true), + TORCH(0,596,594,0,true), + WHITE_CANDLE_LANTERN(4527,4529,4531,4,true), + BLACK_CANDLE_LANTERN(4527,4532,4534,4,true), + OIL_LAMP(4525,4522,4524,12,true), + OIL_LANTERN(4535,4537,4539,29,false), + BULLSEYE_LANTERN(4546,4548,4550,49,false), + SAPPHIRE_LANTERN(0,4700,4702,49,false), + EMERALD_LANTERN(0,9064,9065,49,false); + + companion object { + fun forId(id: Int): LightSources? { + return when (id) { + 36, 33 -> WHITE_CANDLE + 38, 32 -> BLACK_CANDLE + 596, 594 -> TORCH + 4529, 4531 -> WHITE_CANDLE_LANTERN + 4532, 4534 -> BLACK_CANDLE_LANTERN + 4522, 4524 -> OIL_LAMP + 4537, 4539 -> OIL_LANTERN + 4548, 4550 -> BULLSEYE_LANTERN + 4700, 4702 -> SAPPHIRE_LANTERN + 9064, 9065 -> EMERALD_LANTERN + else -> null + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/limestone/ChiselLimestonePulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/limestone/ChiselLimestonePulse.java new file mode 100644 index 000000000..d711115da --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/limestone/ChiselLimestonePulse.java @@ -0,0 +1,70 @@ +package core.game.node.entity.skill.crafting.limestone; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * + * The skill pulse for chiseling a limestone into a limestone brick. + * + * @author Jamix77 + * + */ +public class ChiselLimestonePulse extends SkillPulse { + + /** + * Represents the chisel item. + */ + private static final Item CHISEL = new Item(1755); + + /** + * Represents the ticks passed. + */ + private int ticks; + + public ChiselLimestonePulse(Player player, Item node) { + super(player, node); + this.resetAnimation= false; + } + + @Override + public boolean checkRequirements() { + if (!player.getInventory().containsItem(CHISEL)) { + return false; + } + if (!player.getInventory().containsItem(new Item(3211))) { + return false; + } + if (player.getSkills().getLevel(Skills.CRAFTING) < 12) { + player.getPacketDispatch().sendMessage("You need a crafting level of 12 to make limestone bricks."); + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0 || ticks < 1) { + player.getAudioManager().send(2586); + player.animate(Animation.create(4470)); + } + } + + @Override + public boolean reward() { + if (++ticks % 2 != 0) { + return false; + } + if (player.getInventory().remove(new Item(3211))) { + + player.getInventory().add(new Item(3420)); + + player.getSkills().addExperience(Skills.CRAFTING, 6, true); + } + return !player.getInventory().containsItem(new Item(3211)); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/pottery/FirePotteryPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/pottery/FirePotteryPulse.java new file mode 100644 index 000000000..38c8f424f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/pottery/FirePotteryPulse.java @@ -0,0 +1,100 @@ +package core.game.node.entity.skill.crafting.pottery; + +import core.game.world.map.Location; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the pulse used to fire pottery. + * + * @author 'Vexia + */ +public final class FirePotteryPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(899); + + /** + * Represents the pottery item. + */ + private final PotteryItem pottery; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code FirePotteryPulse} {@code Object}. + * + * @param player the player. + * @param node the node. + * @param pottery the pottery. + * @param amount the amount. + */ + public FirePotteryPulse(Player player, Item node, final PotteryItem pottery, final int amount) { + super(player, node); + this.pottery = pottery; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.CRAFTING) < pottery.getLevel()) { + player.getPacketDispatch().sendMessage("You need a crafting level of " + pottery.getLevel() + " in order to do this."); + return false; + } + if (!player.getInventory().containsItem(pottery.getUnfinished())) { + player.getPacketDispatch().sendMessage("You need a " + pottery.name().toLowerCase() + "in order to do this."); + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + if (player.getInventory().remove(pottery.getUnfinished())) { + final Item item = pottery.getProduct(); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, pottery.getFireExp(), true); + player.getPacketDispatch().sendMessage("You put the " + pottery.getUnfinished().getName().toLowerCase() + " in the oven."); + player.getPacketDispatch().sendMessage("You remove a " + pottery.getProduct().getName().toLowerCase() + " from the oven."); + + // Spin a bowl on the pottery wheel and fire it in the oven in

Barbarian Village + if (pottery == PotteryItem.BOWL + && player.getLocation().withinDistance(Location.create(3085,3408,0)) + && player.getAttribute("diary:varrock:spun-bowl", false)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 9); + } + + // Fire a pot in the kiln in the Barbarian Village potter's

house + if (pottery == PotteryItem.POT && player.getLocation().withinDistance(Location.create(3085,3408,0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 7); + } + } + amount--; + return amount < 1; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/pottery/PotteryItem.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/pottery/PotteryItem.java new file mode 100644 index 000000000..649bea561 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/pottery/PotteryItem.java @@ -0,0 +1,107 @@ +package core.game.node.entity.skill.crafting.pottery; + +import core.game.node.item.Item; + +/** + * Represents a pottery item definition. + * @author 'Vexia + */ +public enum PotteryItem { + POT(new Item(1787), new Item(1931), 1, 6.3, 6.3), DISH(new Item(1789), new Item(2313), 7, 15, 10), BOWL(new Item(1791), new Item(1923), 8, 18, 15), PLANT(new Item(5352), new Item(5350), 19, 20, 17.5), LID(new Item(4438), new Item(4440), 25, 20, 20); + + /** + * Represents the unfinished product. + */ + private final Item unfinished; + + /** + * Represents the product. + */ + private final Item product; + + /** + * Represents the level required. + */ + private final int level; + + /** + * Represents the exp given. + */ + private final double exp; + + /** + * Represents the fire exp. + */ + private final double fireExp; + + /** + * Constructs a new {@code PotteryItem} {@code Object}. + * @param unfinished the unfinished. + * @param product the product. + * @param level the level. + * @param exp the exp. + * @param fireExp the fire experience. + */ + private PotteryItem(Item unfinished, Item product, int level, double exp, double fireExp) { + this.unfinished = unfinished; + this.product = product; + this.level = level; + this.exp = exp; + this.fireExp = fireExp; + } + + /** + * Gets the pottery item by the id. + * @param id the id. + * @return the item. + */ + public static PotteryItem forId(int id) { + for (PotteryItem def : PotteryItem.values()) { + if (def.getUnfinished().getId() == id) { + return def; + } + } + return null; + } + + /** + * Gets the unfinished. + * @return The unfinished. + */ + public Item getUnfinished() { + return unfinished; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the exp. + * @return The exp. + */ + public double getExp() { + return exp; + } + + /** + * Gets the fireExp. + * @return The fireExp. + */ + public double getFireExp() { + return fireExp; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/pottery/PotteryPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/pottery/PotteryPulse.java new file mode 100644 index 000000000..f448caa33 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/pottery/PotteryPulse.java @@ -0,0 +1,93 @@ +package core.game.node.entity.skill.crafting.pottery; + +import core.game.world.map.Location; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.tools.StringUtils; + +/** + * Represents the skill pulse of the pottery unfired items. + * @author 'Vexia + */ +public final class PotteryPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = Animation.create(896); + + /** + * Represnets the soft clay item. + */ + private static final Item SOFT_CLAY = new Item(1761); + + /** + * Represents the pottery item to make. + */ + private final PotteryItem pottery; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code PotteryPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param amount the amount. + * @param pottery the pottery. + */ + public PotteryPulse(Player player, Item node, int amount, final PotteryItem pottery) { + super(player, node); + this.pottery = pottery; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (!player.getInventory().contains(1761, 1)) { + player.getPacketDispatch().sendMessage("You need soft clay in order to do this."); + return false; + } + if (player.getSkills().getLevel(Skills.CRAFTING) < pottery.getLevel()) { + player.getPacketDispatch().sendMessage("You need a crafting level of " + pottery.getLevel() + " to make this."); + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (++ticks % 5 != 0) { + return false; + } + if (player.getInventory().remove(SOFT_CLAY)) { + if (pottery == PotteryItem.BOWL && player.getLocation().withinDistance(Location.create(3086,3410,0))) { + player.setAttribute("/save:diary:varrock:spun-bowl", true); + } + final Item item = pottery.getUnfinished(); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, pottery.getExp(), true); + player.getPacketDispatch().sendMessage("You make the soft clay into " + (StringUtils.isPlusN(pottery.getUnfinished().getName()) ? "an" : "a") + " " + pottery.getUnfinished().getName().toLowerCase() + "."); + } + amount--; + return amount < 1; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/spinning/SpinningItem.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/spinning/SpinningItem.java new file mode 100644 index 000000000..c1af625ad --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/spinning/SpinningItem.java @@ -0,0 +1,105 @@ +package core.game.node.entity.skill.crafting.spinning; + +/** + * Represents an item to be spinned. + * @author 'Vexia + */ +public enum SpinningItem { + WOOL(19, 1737, 1759, 1, 2.5), FLAX(17, 1779, 1777, 10, 15), ROOT(23, 6051, 6038, 19, 30), ROOT1(23, 6043, 6038, 19, 30), ROOT2(23, 6045, 6038, 19, 30), ROOT3(23, 6047, 6038, 19, 30), ROOT4(23, 6049, 6038, 19, 30), ROOT5(23, 6053, 6038, 19, 30), SINEW(27, 9436, 9438, 10, 15), TREE_ROOTS(31, 6043, 9438, 10, 15), YACK(35, 10814, 954, 30, 25); + + /** + * The button id. + */ + private final int button; + + /** + * The needed item. + */ + private final int need; + + /** + * The product. + */ + private final int product; + + /** + * The level required. + */ + private final int level; + + /** + * The exp gained. + */ + private final double exp; + + /** + * Constructs a new {@code SpinningItem} {@code Object}. + * @param button the button. + * @param need the needed item id. + * @param product the product. + * @param level the level. + * @param exp the exp. + */ + SpinningItem(int button, int need, int product, int level, double exp) { + this.button = button; + this.need = need; + this.product = product; + this.level = level; + this.exp = exp; + } + + /** + * Gets the spinning item. + * @param id the id. + * @return the item. + */ + public static SpinningItem forId(int id) { + for (SpinningItem spin : SpinningItem.values()) { + if (spin.button == id) { + return spin; + } + } + return null; + } + + /** + * Gets the button. + * @return The button. + */ + public int getButton() { + return button; + } + + /** + * Gets the need. + * @return The need. + */ + public int getNeed() { + return need; + } + + /** + * Gets the product. + * @return The product. + */ + public int getProduct() { + return product; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the exp. + * @return The exp. + */ + public double getExp() { + return exp; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/crafting/spinning/SpinningPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/spinning/SpinningPulse.java new file mode 100644 index 000000000..e1265f537 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/crafting/spinning/SpinningPulse.java @@ -0,0 +1,109 @@ +package core.game.node.entity.skill.crafting.spinning; + +import core.cache.def.impl.ItemDefinition; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.Location; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the pulse used to spin an item. + * + * @author 'Vexia + */ +public final class SpinningPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(896); + + /** + * Represents the type of spinning item. + */ + private final SpinningItem type; + + /** + * Represents the amount to spin. + */ + private int ammount; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code SpinningPulse.java} {@Code Object} + * + * @param player + * @param node + */ + public SpinningPulse(Player player, Item node, int ammount, SpinningItem def) { + super(player, node); + this.type = def; + this.ammount = ammount; + } + + @Override + public boolean checkRequirements() { + player.getInterfaceManager().close(); + if (player.getSkills().getLevel(Skills.CRAFTING) < type.getLevel()) { + player.getPacketDispatch().sendMessage("You need a crafting level of " + type.getLevel() + " to make this."); + return false; + } + if (!player.getInventory().contains(type.getNeed(), 1)) { + player.getPacketDispatch().sendMessage("You need " + ItemDefinition.forId(type.getNeed()).getName() + " to do this."); + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks % 5 == 0) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + int tickThreshhold = 4; + if (player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(2) + && player.getLocation().withinDistance(Location.create(2711,3471,1)) + && player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null + && player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == 14631) { + tickThreshhold = 2; + } + if (++ticks % tickThreshhold != 0) { + return false; + } + if (player.getInventory().remove(new Item(type.getNeed(), 1))) { + final Item item = new Item(type.getProduct(), 1); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.CRAFTING, type.getExp(), true); + + // Seers achievement diary + if (player.getViewport().getRegion().getId() == 10806 + && !player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(0, 4)) { + if (player.getAttribute("diary:seers:bowstrings-spun", 0) >= 4) { + player.setAttribute("/save:diary:seers:bowstrings-spun", 5); + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 0, 4); + } else { + player.setAttribute("/save:diary:seers:bowstrings-spun", player.getAttribute("diary:seers:bowstrings-spun", 0) + 1); + } + } + } + ammount--; + return ammount < 1; + } + + @Override + public void message(int type) { + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBin.kt new file mode 100644 index 000000000..66452ff3e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBin.kt @@ -0,0 +1,151 @@ +package core.game.node.entity.skill.farming + +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.Items +import core.tools.RandomFunction +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import java.util.concurrent.TimeUnit + +class CompostBin(val player: Player, val bin: CompostBins) { + private var items = ArrayList() + var isSuperCompost = true + var isTomatoes = true + var isClosed = false + var finishedTime = 0L + var isFinished = false + + fun isFull() : Boolean { + return items.size == 15 + } + + fun close() { + isClosed = true + finishedTime = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(RandomFunction.random(35,50).toLong()) + updateBit() + } + + fun open(){ + isClosed = false + updateBit() + } + + fun takeItem(): Item?{ + if(items.isEmpty()) return null + val item = items[0] + items.remove(item) + if(items.isEmpty()){ + isFinished = false + finishedTime = 0L + isTomatoes = true + isSuperCompost = true + isClosed = false + } + updateBit() + return Item(item) + } + + fun isReady(): Boolean { + return System.currentTimeMillis() > finishedTime && finishedTime != 0L + } + + fun checkSuperCompostItem(id: Int): Boolean{ + return when (id){ + Items.WATERMELON_5982, + Items.PINEAPPLE_2114, + Items.CALQUAT_FRUIT_5980, + Items.OAK_ROOTS_6043, + Items.WILLOW_ROOTS_6045, + Items.MAPLE_ROOTS_6047, + Items.YEW_ROOTS_6049, + Items.MAGIC_ROOTS_6051, + Items.COCONUT_5974, + Items.COCONUT_SHELL_5978, + Items.PAPAYA_FRUIT_5972, + Items.JANGERBERRIES_247, + Items.WHITE_BERRIES_239, + Items.POISON_IVY_BERRIES_6018, + Items.GRIMY_TORSTOL_219, + Items.GRIMY_DWARF_WEED_217, + Items.GRIMY_LANTADYME_2485, + Items.GRIMY_CADANTINE_215 -> true + else -> false + } + } + + fun addItem(item: Int){ + if(!isFull()) { + items.add(item) + if (!checkSuperCompostItem(item)) { + isSuperCompost = false + } + if(item != Items.TOMATO_1982) isTomatoes = false + } + updateBit() + } + + fun addItem(item: Item){ + addItem(item.id) + } + + fun updateBit(){ + player.varpManager.get(bin.varpIndex).clearBitRange(bin.varpOffest,bin.varpOffest + 7) + if(items.isNotEmpty()) { + if (isFinished) { + player.varpManager.get(bin.varpIndex).setVarbit(bin.varpOffest + 1, if(items.size == 15) 15 else 14) + if (isTomatoes) player.varpManager.get(bin.varpIndex).setVarbit(bin.varpOffest + 7, 1) + else if (isSuperCompost) player.varpManager.get(bin.varpIndex).setVarbit(bin.varpOffest + 5, 1) + } else { + player.varpManager.get(bin.varpIndex).setVarbit(bin.varpOffest, items.size) + if (isTomatoes) player.varpManager.get(bin.varpIndex).setVarbit(bin.varpOffest + 7, 1) + } + if (isClosed) player.varpManager.get(bin.varpIndex).setVarbit(bin.varpOffest + 6, 1) + } + player.varpManager.get(bin.varpIndex).send(player) + } + + fun save(root: JSONObject){ + val binObject = JSONObject() + binObject.put("isSuper",this.isSuperCompost) + val items = JSONArray() + for(id in this.items){ + items.add(id) + } + binObject.put("items",items) + binObject.put("finishTime",finishedTime) + binObject.put("isTomato",isTomatoes) + binObject.put("isClosed",isClosed) + binObject.put("isFinished",isFinished) + root.put("binData",binObject) + } + + fun parse(_data: JSONObject){ + val isSuper = if(_data.containsKey("isSuper")) (_data["isSuper"] as Boolean) else true + if(_data.containsKey("items")){ + (_data["items"] as JSONArray).forEach { + addItem(it.toString().toInt()) + } + } + if(_data.containsKey("finishTime")) finishedTime = _data["finishTime"].toString().toLong() + if(_data.containsKey("isTomato")) isTomatoes = _data["isTomato"] as Boolean + if(_data.containsKey("isClosed")) isClosed = _data["isClosed"] as Boolean + if(_data.containsKey("isFinished")) isFinished = _data["isFinished"] as Boolean + updateBit() + } + + fun finish(){ + if(isTomatoes) items = items.map { Items.ROTTEN_TOMATO_2518 } as ArrayList + else if(isSuperCompost) items = items.map { Items.SUPERCOMPOST_6034 } as ArrayList + else items = items.map { Items.COMPOST_6032 } as ArrayList + isFinished = true + } + + fun convert(){ + if(!isSuperCompost){ + items = items.map { Items.SUPERCOMPOST_6034 } as ArrayList + isSuperCompost = true + updateBit() + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBinOptionHandler.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBinOptionHandler.kt new file mode 100644 index 000000000..1787f3ef1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBinOptionHandler.kt @@ -0,0 +1,49 @@ +package core.game.node.entity.skill.farming + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class CompostBinOptionHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + for(i in 7836..7839) + ObjectDefinition.forId(i).childrenIds.forEach { + val def = ObjectDefinition.forId(it) + def.handlers["option:open"] = this + def.handlers["option:close"] = this + def.handlers["option:take-tomato"] = this + } + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + val cBin = CompostBins.forObject(node.asObject()) ?: return false + val bin = cBin.getBinForPlayer(player) + + when(option){ + "close" -> if(!bin.isFull()) player.sendMessage("This shouldn't be happening. Report this.") else bin.close() + "open" -> if(!bin.isFinished) player.sendMessage("I should probably wait until it is done to open it.") else bin.open() + "take-tomato" -> { + if (!bin.isTomatoes || !bin.isFinished) { + player.sendMessage("This shouldn't be happening. Report this.") + } else { + if(player.inventory.isFull){ + player.sendMessage("You don't have enough inventory space to do this.") + } else { + val reward = bin.takeItem() + if (reward != null) + player.inventory.add(reward) + } + } + } + } + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBins.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBins.kt new file mode 100644 index 000000000..0a69ccca4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostBins.kt @@ -0,0 +1,40 @@ +package core.game.node.entity.skill.farming + +import core.cache.def.impl.ObjectDefinition +import core.cache.def.impl.VarbitDefinition +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.node.entity.state.newsys.states.FarmingState + +enum class CompostBins(val varpIndex: Int, val varpOffest: Int) { + FALADOR_COMPOST(511,0), + CATHERBY_COMPOST(511,8), + PORT_PHAS_COMPOST(511,16), + ARDOUGNE_COMPOST(511,24); + + companion object { + @JvmField + val bins = values().map { (it.varpIndex shl it.varpOffest) to it }.toMap() + + @JvmStatic + fun forObject(obj: GameObject): CompostBins?{ + return forObjectID(obj.id) + } + + @JvmStatic + fun forObjectID(id: Int): CompostBins?{ + val objDef = ObjectDefinition.forId(id) + val def = VarbitDefinition.forObjectID(objDef.varbitID) + return bins[def.configId shl def.bitShift] + } + } + + fun getBinForPlayer(player: Player) : CompostBin { + var state: FarmingState? = player.states.get("farming") as FarmingState? + return if(state == null){ + state = player.registerState("farming") as FarmingState + state.getBin(this).also { state.init() } + } else + state.getBin(this) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostType.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostType.kt new file mode 100644 index 000000000..60b206027 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CompostType.kt @@ -0,0 +1,7 @@ +package core.game.node.entity.skill.farming + +enum class CompostType { + NONE, + NORMAL, + SUPER +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/CropHarvester.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CropHarvester.kt new file mode 100644 index 000000000..3af28389c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/CropHarvester.kt @@ -0,0 +1,59 @@ +package core.game.node.entity.skill.farming + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class CropHarvester : OptionHandler() { + + val spadeAnim = Animation(830) + + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.setOptionHandler("harvest",this) + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + val fPatch = FarmingPatch.forObject(node.asObject()) + fPatch ?: return false + val patch = fPatch.getPatchFor(player) + val plantable = patch.plantable + plantable ?: return false + + if(patch.isWeedy()){ + player.sendMessage("Something seems to have gone wrong here. Report this.") + return true + } + + player.pulseManager.run(object : Pulse(0){ + override fun pulse(): Boolean { + if(!player.inventory.hasSpaceFor(Item(plantable.harvestItem,1))){ + return true + } + player.animator.animate(spadeAnim) + delay = 2 + player.inventory.add(Item(plantable.harvestItem,1)) + player.skills.addExperience(Skills.FARMING,plantable.harvestXP) + patch.harvestAmt-- + + if(patch.harvestAmt <= 0){ + patch.clear() + } + return patch.harvestAmt <= 0 + } + }) + + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/DigUpPatchDialogue.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/DigUpPatchDialogue.kt new file mode 100644 index 000000000..1851a744b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/DigUpPatchDialogue.kt @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.farming + +import core.game.content.dialogue.DialoguePlugin +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable + +@Initializable +class DigUpPatchDialogue(player: Player? = null) : DialoguePlugin(player) { + var patch: Patch? = null + + override fun newInstance(player: Player?): DialoguePlugin { + return DigUpPatchDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + patch = args[0] as Patch + if(patch?.isWeedy() == true){ + player.dialogueInterpreter.sendDialogue("Use a rake to get rid of weeds.") + stage = 1000 + return true + } + player.dialogueInterpreter.sendOptions("Dig up this patch?","Yes","No") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> when(buttonId){ + 1 -> { + end() + player.animator.animate(Animation(830)) + player.pulseManager.run(object : Pulse(){ + override fun pulse(): Boolean { + if(patch?.patch?.type == PatchType.TREE){ + if(patch?.getCurrentState() == (patch?.plantable?.value ?: 0) + (patch?.plantable?.stages ?: 0) + 2 && patch?.isWeedy() != true){ + if(!player.inventory.add(Item(patch?.plantable?.harvestItem ?: 0))){ + GroundItemManager.create(Item(patch?.plantable?.harvestItem ?: 0),player) + } + } + } + player.sendMessage("${patch?.getCurrentState()}") + patch?.clear() + return true + } + }) + } + else -> end() + } + + 1000 -> end() + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(67984003) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/FarmingPatch.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/FarmingPatch.kt new file mode 100644 index 000000000..6036ab27e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/FarmingPatch.kt @@ -0,0 +1,90 @@ +package core.game.node.entity.skill.farming + +import core.cache.def.impl.ObjectDefinition +import core.cache.def.impl.VarbitDefinition +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.node.entity.state.newsys.states.FarmingState + +enum class FarmingPatch(val varpIndex: Int, val varpOffset: Int, val type: PatchType) { + //Allotments + S_FALADOR_ALLOTMENT_NW(504,0,PatchType.ALLOTMENT), + S_FALADOR_ALLOTMENT_SE(504,8,PatchType.ALLOTMENT), + CATHERBY_ALLOTMENT_N(504,16,PatchType.ALLOTMENT), + CATHERBY_ALLOTMENT_S(504,24,PatchType.ALLOTMENT), + ARDOUGNE_ALLOTMENT_S(505,8,PatchType.ALLOTMENT), + ARDOUGNE_ALLOTMENT_N(505,0,PatchType.ALLOTMENT), + PORT_PHAS_ALLOTMENT_NW(505,16,PatchType.ALLOTMENT), + PORT_PHAS_ALLOTMENT_SE(505,24,PatchType.ALLOTMENT), + HARMONY_ISLAND_ALLOTMENT(982,8,PatchType.ALLOTMENT), + + //Herb + CATHERBY_HERB_CE(515,8,PatchType.HERB), + S_FALADOR_HERB_NE(515,0,PatchType.HERB), + ARDOUGNE_HERB_CE(515,16,PatchType.HERB), + PORT_PHAS_HERB_NE(515,24,PatchType.HERB), + TROLL_STRONGHOLD_HERB(830,0,PatchType.HERB), + + //Flower + S_FALADOR_FLOWER_C(508,0,PatchType.FLOWER), + CATHERBY_FLOWER_C(508,8,PatchType.FLOWER), + ARDOUGNE_FLOWER_C(508,16,PatchType.FLOWER), + PORT_PHAS_FLOWER_C(508,24,PatchType.FLOWER), + + //Tree + N_FALADOR_TREE(502,8,PatchType.TREE), + TAVERLY_TREE(502,0,PatchType.TREE), + GNOME_STRONGHOLD_TREE(830,11,PatchType.TREE), + LUMBRIDGE_TREE(502,24,PatchType.TREE), + VARROCK_TREE(502,16,PatchType.TREE), + + //Fruit Tree + GNOME_STRONGHOLD_FRUIT_TREE(503,0,PatchType.FRUIT_TREE), + CATHERBY_FRUIT_TREE(503,24,PatchType.FRUIT_TREE), + TREE_GNOME_VILLAGE_FRUIT_TREE(503,8,PatchType.FRUIT_TREE), + BRIMHAVEN_FRUIT_TREE(503,16,PatchType.FRUIT_TREE), + LLETYA_FRUIT_TREE(830,23,PatchType.FRUIT_TREE), + + //Hops + ENTRANA_HOPS(506,8,PatchType.HOPS), + LUMBRIDGE_HOPS(506,16,PatchType.HOPS), + MCGRUBOR_HOPS(506,24,PatchType.HOPS), + YANILLE_HOPS(506,0,PatchType.HOPS), + + //Bushes + CHAMPIONS_GUILD_BUSH(509,0,PatchType.BUSH), + RIMMINGTON_BUSH(509,8,PatchType.BUSH), + ARDOUGNE_BUSH(509,24,PatchType.BUSH), + ETCETERIA_BUSH(509,16,PatchType.BUSH), + + //Spirit Tree + ETCETERIA_SPIRIT_TREE(507,8,PatchType.SPIRIT_TREE), + PORT_SARIM_SPIRIT_TREE(507,0,PatchType.SPIRIT_TREE), + KARAMJA_SPIRIT_TREE(507,16,PatchType.SPIRIT_TREE); + + companion object { + @JvmField + val patches = FarmingPatch.values().map { (it.varpIndex shl it.varpOffset) to it }.toMap() + + @JvmStatic + fun forObject(obj: GameObject): FarmingPatch?{ + return forObjectID(obj.id) + } + + @JvmStatic + fun forObjectID(id: Int): FarmingPatch?{ + val objDef = ObjectDefinition.forId(id) + val def = VarbitDefinition.forObjectID(objDef.varbitID) + return patches[def.configId shl def.bitShift] + } + } + + fun getPatchFor(player: Player): Patch{ + var state: FarmingState? = player.states.get("farming") as FarmingState? + return if(state == null){ + state = player.registerState("farming") as FarmingState + state.getPatch(this).also { state.init() } + } else + state.getPatch(this) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/FruitAndBerryPicker.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/FruitAndBerryPicker.kt new file mode 100644 index 000000000..dd0150f14 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/FruitAndBerryPicker.kt @@ -0,0 +1,72 @@ +package core.game.node.entity.skill.farming + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import java.util.concurrent.TimeUnit + +@Initializable +class FruitAndBerryPicker : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.setOptionHandler("pick-coconut",this) + ObjectDefinition.setOptionHandler("pick-banana",this) + ObjectDefinition.setOptionHandler("pick-apple",this) + ObjectDefinition.setOptionHandler("pick-orange",this) + ObjectDefinition.setOptionHandler("pick-pineapple",this) + ObjectDefinition.setOptionHandler("pick-papaya",this) + ObjectDefinition.setOptionHandler("pick-leaf",this) + ObjectDefinition.setOptionHandler("pick-from",this) + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + + val fPatch = FarmingPatch.forObject(node.asObject()) + fPatch ?: return false + + val patch = fPatch.getPatchFor(player) + + val plantable = patch.plantable + plantable ?: return false + + val animation = Animation(2281) + val reward = Item(plantable.harvestItem) + + if(patch.getFruitOrBerryCount() <= 0){ + player.sendMessage("This shouldn't be happening. Please report this.") + return true + } + + if(!player.inventory.hasSpaceFor(Item(plantable.harvestItem))){ + player.sendMessage("You do not have enough inventory space for this.") + return true + } + + if(System.currentTimeMillis() - patch.nextGrowth > TimeUnit.MINUTES.toMillis(45)){ + patch.nextGrowth = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(45) + } + + player.pulseManager.run(object : Pulse(animation.duration){ + override fun pulse(): Boolean { + player.animator.animate(animation) + player.inventory.add(reward) + player.skills.addExperience(Skills.FARMING,plantable.harvestXP) + patch.setCurrentState(patch.getCurrentState() - 1) + + return patch.getFruitOrBerryCount() == 0 + } + }) + + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/HealthChecker.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/HealthChecker.kt new file mode 100644 index 000000000..09f5bfbec --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/HealthChecker.kt @@ -0,0 +1,50 @@ +package core.game.node.entity.skill.farming + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.entity.skill.Skills +import core.game.system.SystemLogger +import core.plugin.Initializable +import core.plugin.Plugin +import java.util.concurrent.TimeUnit + +@Initializable +class HealthChecker : OptionHandler(){ + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.setOptionHandler("check-health",this) + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + val fPatch = FarmingPatch.forObject(node.asObject()) + fPatch ?: return false + val patch = fPatch.getPatchFor(player) + val type = patch.patch.type + + if(type != PatchType.BUSH && type != PatchType.FRUIT_TREE && type != PatchType.TREE){ + player.sendMessage("This shouldn't be happening. Please report this.") + return true + } + + player.skills.addExperience(Skills.FARMING,patch.plantable?.checkHealthXP ?: 0.0) + when(type){ + PatchType.TREE -> patch.setCurrentState(patch.getCurrentState() + 1) + PatchType.FRUIT_TREE -> patch.setCurrentState(patch.getCurrentState() - 14) + PatchType.BUSH -> patch.setCurrentState(patch.plantable!!.value + patch.plantable!!.stages + 4) + else -> SystemLogger.logErr("Unreachable patch type from when(type) switch in HealthChecker.kt line 36") + } + + if(type == PatchType.FRUIT_TREE){ + patch.nextGrowth = TimeUnit.MINUTES.toMillis(45) + } + + patch.isCheckHealth = false + + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/InspectionHandler.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/InspectionHandler.kt new file mode 100644 index 000000000..eb2474274 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/InspectionHandler.kt @@ -0,0 +1,43 @@ +package core.game.node.entity.skill.farming + +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class InspectionHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.setOptionHandler("inspect",this) + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + node ?: return false + player ?: return false + val patch = FarmingPatch.forObject(node.asObject()) + if(patch == null){ + player.sendMessage("This is an improperly handled inspect option. Report this please.") + } else { + val p = patch.getPatchFor(player) + val status1 = if(p.getCurrentState() <= 2) "This patch needs weeding." else if(p.getCurrentState() == 3) "This patch is weed-free." else { + if(p.isDiseased && !p.isDead) "This patch has become diseased." + else if(p.isDead) "The crops in this patch are dead." + else if(p.plantable == Plantable.SCARECROW) "There is a scarecrow in this patch." + else "This patch has something growing in it." + } + val status2 = if(patch.type == PatchType.ALLOTMENT || patch.type == PatchType.FLOWER || patch.type == PatchType.HOPS){ + if(p.isWatered) "This patch has been watered." else "This patch could use some water." + } else "" + val status3 = if(p.compost == CompostType.NONE) "This patch has not been treated." else "This patch has been treated with ${p.compost.name.toLowerCase()} compost." + player.sendMessage("$status1 $status2") + player.sendMessage(status3) + val varpValue = player.varpManager.get(patch.varpIndex).getBitRangeValue(patch.varpOffset,patch.varpOffset + 7) + player.sendMessage("E" + varpValue) + } + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/Patch.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/Patch.kt new file mode 100644 index 000000000..9d4455113 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/Patch.kt @@ -0,0 +1,183 @@ +package core.game.node.entity.skill.farming + +import core.game.node.entity.player.Player +import core.game.system.SystemLogger +import core.tools.RandomFunction +import java.util.concurrent.TimeUnit + +class Patch(val player: Player, val patch: FarmingPatch, var plantable: Plantable?, var currentGrowthStage: Int, var isDiseased: Boolean, var isDead: Boolean, var isWatered: Boolean, var nextGrowth: Long, var harvestAmt: Int, var isCheckHealth: Boolean) { + constructor(player: Player, patch: FarmingPatch) : this(player,patch,null,0,false,false,false,0L,0,false) + + var diseaseMod = 0 + var compost = CompostType.NONE + + fun setNewHarvestAmount() { + if(patch.type == PatchType.ALLOTMENT){ + harvestAmt = RandomFunction.random(4,17) + } else { + harvestAmt = RandomFunction.random(1,4) + } + } + + fun isWeedy(): Boolean { + return getCurrentState() in 0..3 + } + + fun getCurrentState(): Int{ + return player.varpManager.get(patch.varpIndex).getVarbitValue(patch.varpOffset) + } + + fun setCurrentState(state: Int){ + player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,state) + updateBit() + } + + fun isGrown(): Boolean{ + return currentGrowthStage == (plantable?.stages ?: 0) + } + + private fun updateBit(){ + if(isCheckHealth){ + when(patch.type){ + PatchType.FRUIT_TREE -> player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,plantable!!.value + plantable!!.stages + 20) + PatchType.BUSH -> player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,250 + (plantable!!.ordinal - Plantable.REDBERRY_SEED.ordinal)) + else -> SystemLogger.logWarn("Invalid setting of isCheckHealth for patch type: " + patch.type.name) + } + isCheckHealth = false + } else { + when(patch.type){ + PatchType.ALLOTMENT,PatchType.FLOWER,PatchType.HOPS -> { + player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset + 6, if (isWatered || isDead) 1 else 0) + player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset + 7, if (isDiseased) 1 else 0) + } + PatchType.BUSH -> { + if(isDead) player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,getBushDeathValue()) + else if(isDiseased && !isDead) player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,getBushDiseaseValue()) + } + PatchType.TREE -> { + if(isDead) player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset + 7,1) + else if(isDiseased && !isDead) player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset + 6, 1) + } + PatchType.FRUIT_TREE -> { + if(isDead) player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,getFruitTreeDeathValue()) + else if(isDiseased && !isDead) player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset, getFruitTreeDiseaseValue()) + } + else -> {} + } + } + player.varpManager.get(patch.varpIndex).send(player) + } + + fun cureDisease() { + isDiseased = false + when(patch.type){ + PatchType.BUSH,PatchType.FRUIT_TREE -> player.varpManager.get(patch.varpIndex).setVarbit(patch.varpOffset,(plantable?.value ?: 0) + currentGrowthStage) + PatchType.TREE -> player.varpManager.get(patch.varpIndex).clearBitRange(patch.varpOffset + 6, patch.varpOffset + 7) + else -> {} + } + updateBit() + } + + fun water() { + isWatered = true + updateBit() + } + + private fun getBushDiseaseValue(): Int{ + if(plantable == Plantable.POISON_IVY_SEED){ + return (plantable?.value ?: 0) + currentGrowthStage + 13 + } else { + return (plantable?.value ?: 0) + currentGrowthStage + 65 + } + } + + private fun getBushDeathValue(): Int{ + if(plantable == Plantable.POISON_IVY_SEED){ + return (plantable?.value ?: 0) + currentGrowthStage + 22 + } else { + return (plantable?.value ?: 0) + currentGrowthStage + 126 + } + } + + private fun getFruitTreeDiseaseValue(): Int { + return (plantable?.value ?: 0) + currentGrowthStage + 13 + } + + private fun getFruitTreeDeathValue(): Int { + return (plantable?.value ?: 0) + currentGrowthStage + 19 + } + + private fun grow(){ + if(isWeedy() && getCurrentState() > 0) { + nextGrowth = System.currentTimeMillis() + 60000 + setCurrentState(getCurrentState() - 1) + currentGrowthStage-- + return + } + + if(isDiseased){ + isDead = true + return + } + + diseaseMod = when(compost){ + CompostType.NONE -> 0 + CompostType.NORMAL -> 8 + CompostType.SUPER -> 13 + } + + if(RandomFunction.random(128) <= (17 - diseaseMod) && !isWatered && !isGrown()){ + //bush, tree, fruit tree can not disease on stage 1(0) of growth. + if(!((patch.type == PatchType.BUSH || patch.type == PatchType.TREE || patch.type == PatchType.FRUIT_TREE) && currentGrowthStage == 0)) { + isDiseased = true + return + } + } + + if((patch.type == PatchType.FRUIT_TREE || patch.type == PatchType.TREE || patch.type == PatchType.BUSH) && plantable != null && plantable?.stages == currentGrowthStage + 1){ + isCheckHealth = true + } + + if((patch.type == PatchType.FRUIT_TREE || patch.type == PatchType.BUSH) && plantable?.stages == currentGrowthStage){ + if((patch.type == PatchType.BUSH && getFruitOrBerryCount() < 4) || (patch.type == PatchType.FRUIT_TREE && getFruitOrBerryCount() < 6)){ + setCurrentState(getCurrentState() + 1) + } + } + + if(plantable?.stages ?: 0 > currentGrowthStage){ + currentGrowthStage++ + setCurrentState(getCurrentState() + 1) + isWatered = false + } + } + + fun update(){ + grow() + updateBit() + } + + fun plant(plantable: Plantable){ + nextGrowth = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(plantable.applicablePatch.stageGrowthTime.toLong()) + this.plantable = plantable + isDead = false + isDiseased = false + currentGrowthStage = 0 + setCurrentState(plantable.value) + } + + fun clear(){ + isCheckHealth = false + isDiseased = false + isDead = false + plantable = null + player.varpManager.get(patch.varpIndex).clearBitRange(patch.varpOffset,patch.varpOffset + 7) + currentGrowthStage = 3 + setCurrentState(3) + compost = CompostType.NONE + } + + fun getFruitOrBerryCount() : Int { + plantable ?: return 0 + return getCurrentState() - plantable!!.value - plantable!!.stages + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchRaker.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchRaker.kt new file mode 100644 index 000000000..239a21969 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchRaker.kt @@ -0,0 +1,35 @@ +package core.game.node.entity.skill.farming + +import core.game.node.entity.player.Player +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import core.tools.Items + +object PatchRaker { + val RAKE_ANIM = Animation(2273) + + @JvmStatic + fun rake(player: Player, patch: FarmingPatch){ + player.pulseManager.run(object : Pulse(){ + override fun pulse(): Boolean { + var patchStage = patch.getPatchFor(player).getCurrentState() + if(patchStage < 2){ + player.animator.animate(RAKE_ANIM) + } + if(delay < 5) { + delay = 5 + } else { + patch.getPatchFor(player).currentGrowthStage++ + patch.getPatchFor(player).setCurrentState(++patchStage) + SystemLogger.logErr("UHHHHH " + patch.getPatchFor(player).getCurrentState()) + player.inventory.add(Item(Items.WEEDS_6055)) + player.skills.addExperience(Skills.FARMING,4.0) + } + return patchStage >= 3 + } + }) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchType.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchType.kt new file mode 100644 index 000000000..96fabe485 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/PatchType.kt @@ -0,0 +1,12 @@ +package core.game.node.entity.skill.farming + +enum class PatchType(val stageGrowthTime: Int) { + ALLOTMENT(10), + HOPS(10), + TREE(40), + FRUIT_TREE(160), + BUSH(20), + FLOWER(5), + HERB(20), + SPIRIT_TREE(293) +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/Plantable.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/Plantable.kt new file mode 100644 index 000000000..7c50c049d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/Plantable.kt @@ -0,0 +1,92 @@ +package core.game.node.entity.skill.farming + +import core.game.node.item.Item +import core.tools.Items + +enum class Plantable(val itemID: Int, val value: Int, val stages: Int, val plantingXP: Double, val harvestXP: Double, val checkHealthXP: Double, val requiredLevel: Int, val applicablePatch: PatchType, val harvestItem: Int) { + //Allotments + POTATO_SEED(5318, 6, 4, 8.0, 9.0, 0.0, 1, PatchType.ALLOTMENT, Items.POTATO_1942), + ONION_SEED(5319, 13, 4, 9.5, 10.5,0.0, 5, PatchType.ALLOTMENT,Items.ONION_1957), + CABBAGE_SEED(5324, 20, 4, 10.0, 11.5, 0.0,7, PatchType.ALLOTMENT,Items.CABBAGE_1965), + TOMATO_SEED(5322,27,4,12.5,14.0,0.0,12,PatchType.ALLOTMENT,Items.TOMATO_1982), + SWEETCORN_SEED(5320,34,6,17.0,19.0,0.0,20,PatchType.ALLOTMENT,Items.SWEETCORN_5986), + STRAWBERRY_SEED(5323,43,6,26.0,29.0,0.0,31,PatchType.ALLOTMENT,Items.STRAWBERRY_5504), + WATERMELON_SEED(5321,52,8,48.5,54.5,0.0,47,PatchType.ALLOTMENT,Items.WATERMELON_5982), + + //Hops + BARLEY_SEED(5305,49,4,8.5,9.5,0.0,3,PatchType.HOPS,Items.BARLEY_6006), + HAMMERSTONE_SEED(5307,4,4,9.0,10.0,0.0,4,PatchType.HOPS,Items.HAMMERSTONE_HOPS_5994), + ASGARNIAN_SEED(5308,11,5,10.9,12.0,0.0,8,PatchType.HOPS,Items.ASGARNIAN_HOPS_5996), + JUTE_SEED(5306,56,5,13.0,14.5,0.0,13,PatchType.HOPS,Items.JUTE_FIBRE_5931), + YANILLIAN_SEED(5309,19,6,14.5,16.0,0.0,16,PatchType.HOPS,Items.YANILLIAN_HOPS_5998), + KRANDORIAN_SEED(5310,28,7,17.5,19.5,0.0,21,PatchType.HOPS,Items.KRANDORIAN_HOPS_6000), + WILDBLOOD_SEED(5311,38,8,23.0,26.0,0.0,28,PatchType.HOPS,Items.WILDBLOOD_HOPS_6002), + + //Trees + OAK_SAPLING(5370,8,4,14.0,0.0,467.3,15,PatchType.TREE,Items.OAK_ROOTS_6043), + WILLOW_SAPLING(5371,15,6,25.0,0.0,1456.5,30,PatchType.TREE,Items.WILLOW_ROOTS_6045), + MAPLE_SAPLING(5372,24,8,45.0,0.0,3403.4,45,PatchType.TREE,Items.MAPLE_ROOTS_6047), + YEW_SAPLING(5373,35,10,81.0,0.0,7069.9,60,PatchType.TREE,Items.YEW_ROOTS_6049), + MAGIC_SAPLING(5374,48,12,145.5,0.0,13768.3,75,PatchType.TREE,Items.MAGIC_ROOTS_6051), + + //Fruit Trees + APPLE_SAPLING(5496,8,6,22.0,8.5,1199.5,27,PatchType.FRUIT_TREE,Items.COOKING_APPLE_1955), + BANANA_SAPLING(5497,35,6,28.0,10.5,1750.5,33,PatchType.FRUIT_TREE,Items.BANANA_1963), + ORANGE_SAPLING(5498,72,6,35.5,13.5,2470.2,39,PatchType.FRUIT_TREE,Items.ORANGE_2108), + CURRY_SAPLING(5499,99,6,40.0,15.0,2906.9,42,PatchType.FRUIT_TREE,Items.CURRY_LEAF_5970), + PINEAPPLE_SAPLING(5500,136,6,57.0,21.5,4605.7,51,PatchType.FRUIT_TREE,Items.PINEAPPLE_2114), + PAPAYA_SAPLING(5501,163,6,72.0,27.0,6146.4,57,PatchType.FRUIT_TREE,Items.PAPAYA_FRUIT_5972), + PALM_SAPLING(5502,200,6,110.5,41.5,10150.1,68,PatchType.FRUIT_TREE,Items.COCONUT_5974), + + //Bushes + REDBERRY_SEED(5101,5,5,11.5,4.5,64.0,10,PatchType.BUSH,Items.REDBERRIES_1951), + CADAVABERRY_SEED(5102,15,6,18.0,7.0,102.5,22,PatchType.BUSH,Items.CADAVA_BERRIES_753), + DWELLBERRY_SEED(5103,26,27,31.5,12.0,177.5,36,PatchType.BUSH,Items.DWELLBERRIES_2126), + JANGERBERRY_SEED(5104,38,8,50.5,19.0,284.5,48,PatchType.BUSH,Items.JANGERBERRIES_247), + WHITEBERRY_SEED(5105,51,8,78.0,29.0,437.5,59,PatchType.BUSH,Items.WHITE_BERRIES_239), + POISON_IVY_SEED(5106,197,8,120.0,45.0,675.0,70,PatchType.BUSH,Items.POISON_IVY_BERRIES_6018), + + //Flowers + MARIGOLD_SEED(5096,8,4,8.5,47.0,0.0,2,PatchType.FLOWER,Items.MARIGOLDS_6010), + ROSEMARY_SEED(5097,13,4,12.0,66.5,0.0,11,PatchType.FLOWER,Items.ROSEMARY_6014), + NASTURTIUM_SEED(5098,18,4,19.5,111.0,0.0,24,PatchType.FLOWER,Items.NASTURTIUMS_6012), + WOAD_SEED(5099,23,4,20.5,115.5,0.0,25,PatchType.FLOWER,Items.WOAD_LEAF_1793), + LIMPWURT_SEED(5100,28,4,21.5,120.0,0.0,26,PatchType.FLOWER,Items.LIMPWURT_ROOT_225), + WHITE_LILY_SEED(14589,37,4,42.0,250.0,0.0,58,PatchType.FLOWER,Items.WHITE_LILY_14583), + + //Flower(Technically) + SCARECROW(6059,33,3,0.0,0.0,0.0,23,PatchType.FLOWER,Items.SCARECROW_6059), + + //Herbs + GUAM_SEED(5291,4,4,11.0,12.5,0.0,9,PatchType.HERB,Items.GRIMY_GUAM_199), + MARRENTILL_SEED(5292,11,4,13.5,15.0,0.0,14,PatchType.HERB,Items.GRIMY_MARRENTILL_201), + TARROMIN_SEED(5293,18,4,16.0,18.0,0.0,19,PatchType.HERB,Items.GRIMY_TARROMIN_203), + HARRALANDER_SEED(5294,25,4,21.5,24.0,0.0,26,PatchType.HERB,Items.GRIMY_HARRALANDER_205), + GOUT_TUBER(5311,32,4,105.0,45.0,0.0,29,PatchType.HERB,Items.GOUTWEED_3261), + RANARR_SEED(5295,39,4,27.0,30.5,0.0,32,PatchType.HERB,Items.GRIMY_RANARR_207), + TOADFLAX_SEED(5296,47,4,34.0,38.5,0.0,38,PatchType.HERB,Items.GRIMY_TOADFLAX_3049), + IRIT_SEED(5297,54,4,43.0,48.5,0.0,44,PatchType.HERB,Items.GRIMY_IRIT_209), + AVANTOE_SEED(5298,61,4,54.5,61.5,0.0,50,PatchType.HERB,Items.GRIMY_AVANTOE_211), + KWUARM_SEED(5299,68,4,69.0,78.0,0.0,56,PatchType.HERB,Items.GRIMY_KWUARM_213), + SNAPDRAGON_SEED(5300,75,4,87.5,98.5,0.0,62,PatchType.HERB,Items.GRIMY_SNAPDRAGON_3051), + CADANTINE_SEED(5301,82,4,106.5,120.0,0.0,67,PatchType.HERB,Items.GRIMY_CADANTINE_215), + LANTADYME_SEED(5302,89,4,134.5,151.5,0.0,73,PatchType.HERB,Items.GRIMY_LANTADYME_2485), + DWARF_WEED_SEED(5303,96,4,170.5,192.0,0.0,79,PatchType.HERB,Items.GRIMY_DWARF_WEED_217), + TORSTOL_SEED(5304,103,4,199.5,224.5,0.0,85,PatchType.HERB,Items.GRIMY_TORSTOL_219) + ; + + companion object { + @JvmField + val plantables = values().map { it.itemID to it }.toMap() + + @JvmStatic + fun forItemID(id: Int): Plantable?{ + return plantables[id] + } + + @JvmStatic + fun forItem(item: Item): Plantable?{ + return forItemID(item.id) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/ToolLeprechaunInterface.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/ToolLeprechaunInterface.kt new file mode 100644 index 000000000..6e0018507 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/ToolLeprechaunInterface.kt @@ -0,0 +1,402 @@ +package core.game.node.entity.skill.farming + +import core.game.component.Component +import core.game.component.ComponentDefinition +import core.game.component.ComponentPlugin +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.RunScript +import core.game.node.entity.skill.crafting.jewellery.JewelleryCrafting +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +private const val varp = 615 +@Initializable +class ToolLeprechaunInterface : ComponentPlugin() { + override fun newInstance(arg: Any?): Plugin { + ComponentDefinition.put(125,this) + ComponentDefinition.put(126,this) + return this + } + + override fun open(player: Player?, component: Component?) { + component ?: return + super.open(player, component) + player?.varpManager?.flagSave(varp) + if(component.id == 125) { + player?.interfaceManager?.openSingleTab(Component(126)) + component.setCloseEvent { pl, _ -> + pl?.interfaceManager?.closeSingleTab() + true + } + } + } + + override fun handle(player: Player?, component: Component?, opcode: Int, button: Int, slot: Int, itemId: Int): Boolean { + player ?: return false + component ?: return false + + when(component.id){ + + 125 -> { + when(button){ + + 33 -> { + if(!hasRake(player)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + player.inventory.add(Item(Items.RAKE_5341)) + setHasRake(player,false) + } + } + + 34 -> { + if(!hasDibber(player)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + player.inventory.add(Item(Items.SEED_DIBBER_5343)) + setHasDibber(player,false) + } + } + + 35 -> { + if(!hasSpade(player)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + player.inventory.add(Item(Items.SPADE_952)) + setHasSpade(player,false) + } + } + + 36 -> { + if(!hasSecateurs(player)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + if(hasMagicSecateurs(player)){ + player.inventory.add(Item(Items.MAGIC_SECATEURS_7409)) + } else { + player.inventory.add(Item(Items.SECATEURS_5329)) + } + setHasSecateurs(player,false) + } + } + + 37 -> { + if(!hasWateringCan(player)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + player.inventory.add(Item(getWateringCan(player))) + setNoWateringCan(player) + } + } + + 38 -> { + if(!hasGardeningTrowel(player)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + player.inventory.add(Item(Items.GARDENING_TROWEL_5325)) + setHasGardeningTrowel(player,false) + } + } + + 39 -> { + if(getNumBuckets(player) == 0){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + player.inventory.add(Item(Items.BUCKET_1925)) + updateBuckets(player,-1) + } + } + + 40 -> { + if(getNumCompost(player) == 0){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + player.inventory.add(Item(Items.COMPOST_6032)) + updateCompost(player,-1) + } + } + + 41 -> { + if(getNumSuperCompost(player) == 0){ + player.dialogueInterpreter.sendDialogue("You don't have any of those stored.") + } else { + player.inventory.add(Item(Items.SUPERCOMPOST_6034)) + updateSuperCompost(player,-1) + } + } + } + } + + 126 -> { + + when(button){ + + 18 -> { + if(!player.inventory.containsItem(Item(Items.RAKE_5341))){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if(!hasRake(player)) { + player.inventory.remove(Item(Items.RAKE_5341)) + setHasRake(player,true) + } else { + player.dialogueInterpreter.sendDialogue("You already have one of those stored.") + } + } + + 19 -> { + if(!player.inventory.containsItem(Item(Items.SEED_DIBBER_5343))){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if(!hasDibber(player)){ + player.inventory.remove(Item(Items.SEED_DIBBER_5343)) + setHasDibber(player,true) + } else { + player.dialogueInterpreter.sendDialogue("You already have one of those stored.") + } + } + + 20 -> { + if(!player.inventory.containsItem(Item(Items.SPADE_952))){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if(!hasSpade(player)){ + player.inventory.remove(Item(Items.SPADE_952)) + setHasSpade(player,true) + } + } + + 21 -> { + if(!player.inventory.contains(Items.SECATEURS_5329,1) && !player.inventory.contains(Items.MAGIC_SECATEURS_7409,1)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if (!hasSecateurs(player)){ + if(player.inventory.contains(Items.MAGIC_SECATEURS_7409,1)){ + player.inventory.remove(Item(Items.MAGIC_SECATEURS_7409)) + setHasSecateurs(player,true) + setHasMagicSecateurs(player,true) + } else { + player.inventory.remove(Item(Items.SECATEURS_5329)) + setHasDibber(player,true) + setHasMagicSecateurs(player,false) + } + } else { + player.dialogueInterpreter.sendDialogue("You already have one of those stored.") + } + } + + 22 -> { + val can = getHighestCan(player) + if(can == null){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if(!hasWateringCan(player)){ + player.inventory.remove(can) + setWateringCan(player,can) + } else { + player.dialogueInterpreter.sendDialogue("You already have one of those stored.") + } + } + + 23 -> { + if(!player.inventory.contains(Items.GARDENING_TROWEL_5325,1)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if (!hasGardeningTrowel(player)){ + player.inventory.remove(Item(Items.GARDENING_TROWEL_5325)) + setHasGardeningTrowel(player,true) + } else { + player.dialogueInterpreter.sendDialogue("You already have one of those stored.") + } + } + + 24 -> { + if(!player.inventory.contains(Items.BUCKET_1925,1)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if(getNumBuckets(player) < 31){ + player.inventory.remove(Item(Items.BUCKET_1925)) + updateBuckets(player,1) + } else { + player.dialogueInterpreter.sendDialogue("You already have enough of those stored.") + } + } + + 25 -> { + if(!player.inventory.contains(Items.COMPOST_6032,1)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if(getNumCompost(player) < 255){ + player.inventory.remove(Item(Items.COMPOST_6032)) + updateCompost(player,1) + } else { + player.dialogueInterpreter.sendDialogue("You already have enough of those stored.") + } + } + + 26 -> { + if(!player.inventory.contains(Items.SUPERCOMPOST_6034,1)){ + player.dialogueInterpreter.sendDialogue("You don't have any of those to store.") + } else if(getNumSuperCompost(player) < 255){ + var amount = when(opcode) { + 155 -> 1 + 196 -> 5 + 124 -> -1 + 199 -> -2 + else -> 0 + } + if(amount == -2) { + player.setAttribute("runscript", object : RunScript() { + override fun handle(): Boolean { + var amt = getValue().toString().toInt() + if(amt > player.inventory.getAmount(Items.SUPERCOMPOST_6034)){ + amt = player.inventory.getAmount(Items.SUPERCOMPOST_6034) + } + if(amt > (255 - getNumSuperCompost(player))){ + amt = 255 - getNumSuperCompost(player) + } + player.inventory.remove(Item(Items.SUPERCOMPOST_6034,amt)) + updateSuperCompost(player,amt) + return true + } + }) + player.dialogueInterpreter.sendInput(false, "Enter amount:") + return true + } else if(amount == -1) { + amount = player.inventory.getAmount(Item(Items.SUPERCOMPOST_6034)) + if (amount > (255 - getNumSuperCompost(player))) amount = 255 - getNumSuperCompost(player) + } + player.inventory.remove(Item(Items.SUPERCOMPOST_6034)) + updateSuperCompost(player, 1) + } else { + player.dialogueInterpreter.sendDialogue("You already have enough of those stored.") + } + } + + } + + } + + } + + player.varpManager.get(varp).send(player) + return true + } + + private fun hasRake(player: Player?): Boolean{ + return checkBit(player,0) + } + + private fun setHasRake(player: Player?,hasRake: Boolean){ + player?.varpManager?.get(varp)?.setVarbit(0,if(hasRake) 1 else 0) + } + + private fun hasDibber(player: Player?): Boolean{ + return checkBit(player,1) + } + + private fun setHasDibber(player: Player?,hasDibber: Boolean){ + player?.varpManager?.get(varp)?.setVarbit(1,if(hasDibber) 1 else 0) + } + + private fun hasSpade(player: Player?): Boolean{ + return checkBit(player,2) + } + + private fun setHasSpade(player: Player?,hasSpade: Boolean){ + player?.varpManager?.get(varp)?.setVarbit(2,if(hasSpade) 1 else 0) + } + + private fun hasSecateurs(player: Player?): Boolean{ + return checkBit(player,3) + } + + private fun setHasSecateurs(player: Player?,hasSecateurs: Boolean){ + player?.varpManager?.get(varp)?.setVarbit(3,if(hasSecateurs) 1 else 0) + } + + private fun hasWateringCan(player: Player?): Boolean{ + return checkBitRange(player,4,7) > 0 + } + + private fun getWateringCan(player: Player?): Int{ + var can = checkBitRange(player,4,7) //Watering cans are stored in the Varp as a number between 1 and 9. Watering Can(0) is 1 and Watering Can(8) is 9 + if(can == 1) can = 0 + return Items.WATERING_CAN_5331 + can + } + + private fun setWateringCan(player: Player?, item: Item){ + val can = when(item.id){ + Items.WATERING_CAN_5331 -> 1 + Items.WATERING_CAN1_5333 -> 2 + Items.WATERING_CAN2_5334 -> 3 + Items.WATERING_CAN3_5335 -> 4 + Items.WATERING_CAN4_5336 -> 5 + Items.WATERING_CAN5_5337 -> 6 + Items.WATERING_CAN6_5338 -> 7 + Items.WATERING_CAN7_5339 -> 8 + Items.WATERING_CAN8_5340 -> 9 + else -> 0 + } + player?.varpManager?.get(varp)?.setVarbit(4,can) + } + + private fun setNoWateringCan(player: Player?){ + player?.varpManager?.get(varp)?.setVarbit(4,0) + } + + private fun hasGardeningTrowel(player: Player?): Boolean { + return checkBit(player,8) + } + + private fun setHasGardeningTrowel(player: Player?,hasTrowel: Boolean){ + player?.varpManager?.get(varp)?.setVarbit(8,if(hasTrowel) 1 else 0) + } + + private fun getNumBuckets(player: Player?): Int { + return checkBitRange(player,9,13) + } + + private fun updateBuckets(player: Player?,amount: Int){ + player?.varpManager?.get(varp)?.setVarbit(9,getNumBuckets(player) + amount) + } + + private fun getNumCompost(player: Player?): Int { + return checkBitRange(player,14,21) + } + + private fun updateCompost(player: Player?,amount: Int){ + player?.varpManager?.get(varp)?.setVarbit(14,getNumCompost(player) + amount) + } + + private fun getNumSuperCompost(player: Player?): Int { + return checkBitRange(player,22,29) + } + + private fun updateSuperCompost(player: Player?,amount: Int){ + player?.varpManager?.get(varp)?.setVarbit(22,getNumSuperCompost(player) + amount) + } + + private fun hasMagicSecateurs(player: Player?): Boolean { + return checkBit(player,30) + } + + private fun setHasMagicSecateurs(player: Player?,hasMagic: Boolean){ + player?.varpManager?.get(varp)?.setVarbit(30,if(hasMagic) 1 else 0) + } + + private fun checkBitRange(player: Player?,start: Int, end: Int): Int{ + return (player?.varpManager?.get(varp)?.getBitRangeValue(start,end) ?: 0) ushr start + } + + private fun checkBit(player: Player?,offset: Int): Boolean{ + return player?.varpManager?.get(varp)?.getVarbitValue(offset) == 1 + } + + private fun getHighestCan(player: Player?): Item?{ + player ?: return null + var highestCan = Item(0) + for(item in player.inventory.toArray()){ + if(item == null) continue + if(item.name.contains("Watering")){ + if(item.id > highestCan.id) highestCan = item + } + } + return if(highestCan.id == 0) null else highestCan + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithBinHandler.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithBinHandler.kt new file mode 100644 index 000000000..6cf295388 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithBinHandler.kt @@ -0,0 +1,103 @@ +package core.game.node.entity.skill.farming + +import core.game.interaction.NodeUsageEvent +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import core.tools.Items + +object UseWithBinHandler { + @JvmField + val allowedNodes = ArrayList() + val fillAnim = Animation(832) + val compostPotionAnimation = Animation(2259) + val scoopAnimation = Animation(8905) + + init { + loadNodes() + } + + fun loadNodes() { + for(p in Plantable.values()){ + if(p.harvestItem != Items.SCARECROW_6059) { + allowedNodes.add(p.harvestItem) + } + } + allowedNodes.add(Items.COCONUT_SHELL_5978) + allowedNodes.add(Items.WEEDS_6055) + allowedNodes.add(Items.COMPOST_POTION4_6470) + allowedNodes.add(Items.COMPOST_POTION3_6472) + allowedNodes.add(Items.COMPOST_POTION2_6474) + allowedNodes.add(Items.COMPOST_POTION1_6476) + allowedNodes.add(Items.BUCKET_1925) + } + + @JvmStatic + fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val used = event.used.id + val cBin = CompostBins.forObject(event.usedWith.asObject()) ?: return false + val bin = cBin.getBinForPlayer(player) + + when(used){ + Items.COMPOST_POTION1_6476,Items.COMPOST_POTION2_6474,Items.COMPOST_POTION3_6472,Items.COMPOST_POTION4_6470 -> { + if(!bin.isSuperCompost && bin.isFinished && !bin.isClosed){ + player.animator.animate(compostPotionAnimation) + player.pulseManager.run(object : Pulse(compostPotionAnimation.duration){ + override fun pulse(): Boolean { + if(player.inventory.remove(event.usedItem)) { + bin.convert() + player.inventory.add(Item(used.getNext())) + } + return true + } + }) + } else { + player.dialogueInterpreter.sendDialogue("You can only do this with an open bin of","finished regular compost.") + } + } + + Items.BUCKET_1925 -> { + if(bin.isFinished && !bin.isClosed){ + player.pulseManager.run(object : Pulse(scoopAnimation.duration){ + override fun pulse(): Boolean { + if(!player.inventory.containsItem(event.usedItem)) return true + player.animator.animate(scoopAnimation) + val item = bin.takeItem() + if(item != null && player.inventory.remove(event.usedItem)){ + player.inventory.add(item) + } + return item == null || !player.inventory.containsItem(event.usedItem) + } + }) + } else { + player.dialogueInterpreter.sendDialogue("You can only scoop an opened bin of finished compost.") + } + } + + else -> + if(bin.isFull()){ + player.sendMessage("This compost bin is already full.") + return true + } else { + player.pulseManager.run(object : Pulse(fillAnim.duration){ + override fun pulse(): Boolean { + player.animator.animate(fillAnim) + if(player.inventory.remove(event.usedItem)){ + bin.addItem(event.usedItem) + } + return bin.isFull() || player.inventory.getAmount(event.usedItem) == 0 + } + }) + } + } + + return true + } + + private fun Int.getNext(): Int{ + if(this != 6476) return this + 2 + else return Items.VIAL_229 + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithPatchHandler.kt b/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithPatchHandler.kt new file mode 100644 index 000000000..684ca2506 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/farming/UseWithPatchHandler.kt @@ -0,0 +1,152 @@ +package core.game.node.entity.skill.farming + +import core.game.interaction.NodeUsageEvent +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import core.tools.Items + +object UseWithPatchHandler{ + val RAKE = Items.RAKE_5341 + val SEED_DIBBER = Items.SEED_DIBBER_5343 + val SPADE = Items.SPADE_952 + val SECATEURS = Items.SECATEURS_5329 + val TROWEL = Items.GARDENING_TROWEL_5325 + val pourBucketAnim = Animation(2283) + val wateringCanAnim = Animation(2293) + val plantCureAnim = Animation(2288) + + @JvmField + val allowedNodes = ArrayList() + + init { + loadNodes() + } + + @JvmStatic + fun loadNodes(){ + for(p in Plantable.values()){ + allowedNodes.add(p.itemID) + } + allowedNodes.addAll(arrayListOf(RAKE,SEED_DIBBER,SPADE,SECATEURS,TROWEL,Items.SUPERCOMPOST_6034,Items.COMPOST_6032,Items.PLANT_CURE_6036,Items.WATERING_CAN1_5333,Items.WATERING_CAN2_5334,Items.WATERING_CAN3_5335,Items.WATERING_CAN4_5336,Items.WATERING_CAN5_5337,Items.WATERING_CAN6_5338,Items.WATERING_CAN7_5339,Items.WATERING_CAN8_5340)) + } + + @JvmStatic + fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val player = event.player + val usedItem = event.usedItem + val patch = FarmingPatch.forObject(event.usedWith.asObject()) + patch ?: return false + + player.faceLocation(event.usedWith.location) + when(usedItem.id){ + RAKE -> PatchRaker.rake(player,patch) + SEED_DIBBER -> player.sendMessage("I should plant a seed, not the seed dibber.") + SPADE -> player.dialogueInterpreter.open(67984003,patch.getPatchFor(player)) //DigUpPatchDialogue.kt + SECATEURS -> TODO() + TROWEL -> TODO() + Items.PLANT_CURE_6036 -> { + val p = patch.getPatchFor(player) + if(p.isDiseased && !p.isDead){ + player.pulseManager.run(object: Pulse(){ + override fun pulse(): Boolean { + player.animator.animate(plantCureAnim) + if(player.inventory.remove(event.usedItem)){ + player.inventory.add(Item(Items.VIAL_229)) + p.cureDisease() + } + return true + } + }) + } else { + player.sendMessage("I have no reason to do this right now.") + } + } + Items.WATERING_CAN1_5333,Items.WATERING_CAN2_5334,Items.WATERING_CAN3_5335,Items.WATERING_CAN4_5336,Items.WATERING_CAN5_5337,Items.WATERING_CAN6_5338,Items.WATERING_CAN7_5339,Items.WATERING_CAN8_5340 -> { + val p = patch.getPatchFor(player) + if(!p.isWatered){ + player.pulseManager.run(object : Pulse(){ + override fun pulse(): Boolean { + player.animator.animate(wateringCanAnim) + if(player.inventory.remove(event.usedItem)){ + player.inventory.add(Item(usedItem.id.getNext())) + p.water() + } + return true + } + }) + } + } + Items.SUPERCOMPOST_6034, Items.COMPOST_6032 -> { + val p = patch.getPatchFor(player) + if(p.compost == CompostType.NONE) { + player.animator.animate(pourBucketAnim) + player.pulseManager.run(object : Pulse(){ + override fun pulse(): Boolean { + if(player.inventory.remove(event.usedItem)){ + p.compost = if(usedItem.id == Items.SUPERCOMPOST_6034) CompostType.SUPER else CompostType.NORMAL + player.inventory.add(Item(Items.BUCKET_1925)) + } + return true + } + }) + } else { + player.sendMessage("This patch has already been treated with compost.") + } + } + else -> { + val plantable = Plantable.forItemID(usedItem.id) + if(plantable == null) return false + + if(plantable.applicablePatch != patch.type){ + player.sendMessage("You can't plant that seed in this patch.") + return true + } + + if(plantable.requiredLevel > player.skills.getLevel(Skills.FARMING)){ + player.sendMessage("You need a Farming level of ${plantable.requiredLevel} to plant this.") + return true + } + + val p = patch.getPatchFor(player) + if(p.getCurrentState() < 3 && p.isWeedy()){ + player.sendMessage("You must weed your patch before you can plant a seed in it.") + return true + } else if(p.getCurrentState() > 3){ + player.sendMessage("There is already something growing in this patch.") + return true + } + + val plantItem = if(patch.type == PatchType.ALLOTMENT) Item(plantable.itemID,3) else Item(plantable.itemID,1) + + if(patch.type == PatchType.ALLOTMENT){ + if(!player.inventory.containsItem(plantItem)){ + player.sendMessage("You need 3 seeds to plant an allotment patch.") + return true + } + } + + if(player.inventory.remove(plantItem)) { + player.animator.animate(Animation(2291)) + player.pulseManager.run(object : Pulse(3) { + override fun pulse(): Boolean { + p.plant(plantable) + player.skills.addExperience(Skills.FARMING, plantable.plantingXP) + p.setNewHarvestAmount() + return true + } + }) + } + } + } + + return true + } + + private fun Int.getNext(): Int { + if(this == Items.WATERING_CAN1_5333) return Items.WATERING_CAN_5331 + else return this - 1 + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/FireMakingOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/FireMakingOptionPlugin.java new file mode 100644 index 000000000..7c5ab6f4c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/FireMakingOptionPlugin.java @@ -0,0 +1,47 @@ +package core.game.node.entity.skill.firemaking; + +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the lighting of a fire. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FireMakingOptionPlugin extends UseWithHandler { + + /** + * Constructs a new {@code FireMakingOptionPlugin} {@code Object}. + */ + public FireMakingOptionPlugin() { + super(1511, 1521, 1513, 1515, 1517, 1519, 1521, 2862, 3438, 3440, 3442, 3444, 3446, 3448, 6211, 6213, 6332, 6333, 7404, 7405, 7406, 8934, 9067, 10328, 10329, 10808, 10810, 10812, 11035, 12581, 12583, 3125); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(590, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Item item = event.getUsedItem(); + if (item == null) { + return false; + } + Player player = event.getPlayer(); + if (TutorialSession.getExtension(player).getStage() == 8) { + TutorialStage.load(player, 9, false); + } + player.getPulseManager().run(new FireMakingPulse(player, item, null)); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/FireMakingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/FireMakingPulse.java new file mode 100644 index 000000000..9c742318e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/FireMakingPulse.java @@ -0,0 +1,212 @@ +package core.game.node.entity.skill.firemaking; + +import core.game.world.map.zone.ZoneBorders; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.player.FaceLocationFlag; +import core.tools.RandomFunction; + +/** + * Represents the pulse used to light a log. + * @author 'Vexia + */ +public final class FireMakingPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(733); + + /** + * Represents the tinderbox item. + */ + private static final Item TINDERBOX = new Item(590); + + /** + * Represents the log being burned. + */ + private final Log fire; + + /** + * Represents the ground item. + */ + private GroundItem groundItem; + + /** + * Represents the ticks. + */ + private int ticks; + + /** + * Constructs a new {@code FireMaking}. + * @param player the player. + * @param node the node. + * @param groundItem the ground item if not null. + */ + public FireMakingPulse(Player player, Item node, GroundItem groundItem) { + super(player, node); + this.fire = Log.forId(node.getId()); + if (groundItem == null) { + this.groundItem = new GroundItem(node, player.getLocation(), player); + player.setAttribute("remove-log", true); + } else { + this.groundItem = groundItem; + player.removeAttribute("remove-log"); + } + } + + @Override + public boolean checkRequirements() { + if (fire == null) { + return false; + } + if (RegionManager.getObject(player.getLocation()) != null || player.getZoneMonitor().isInZone("bank")) { + player.getPacketDispatch().sendMessage("You can't light a fire here."); + return false; + } + if (!player.getInventory().containsItem(TINDERBOX)) { + player.getPacketDispatch().sendMessage("You do not have the required items to light this."); + return false; + } + if (player.getSkills().getLevel(Skills.FIREMAKING) < fire.getLevel()) { + player.getPacketDispatch().sendMessage("You need a firemaking level of " + fire.getLevel() + " to light this log."); + return false; + } + if (player.getAttribute("remove-log", false)) { + player.removeAttribute("remove-log"); + if (player.getInventory().remove(node)) { + GroundItemManager.create(groundItem); + } + } + return true; + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + if (getLastFire() >= GameWorld.getTicks()) { + createFire(); + return true; + } + if (ticks == 0) { + player.animate(ANIMATION); + } + if (++ticks % 3 != 0) { + return false; + } + if (ticks % 12 == 0) { + player.animate(ANIMATION); + } + if (!success()) { + return false; + } + createFire(); + return true; + } + + /** + * Creates the fire. + */ + public void createFire() { + if (!groundItem.isActive()) { + return; + } + // GameObject originalOnSpot = + // RegionManager.getObject(player.getLocation()); + final GameObject object = new GameObject(fire.getFireId(), player.getLocation()); + ObjectBuilder.add(object, fire.getLife(), getAsh(player, fire, object)); + GroundItemManager.destroy(groundItem); + player.moveStep(); + player.faceLocation(FaceLocationFlag.getFaceLocation(player, object)); + if (TutorialSession.getExtension(player).getStage() == 9) { + TutorialStage.load(player, 10, false); + } + player.getSkills().addExperience(Skills.FIREMAKING,fire.getXp()); + + int playerRegion = player.getViewport().getRegion().getId(); + + if (fire == Log.MAGIC && playerRegion == 10806) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.SEERS_VILLAGE,2, 5); + } + // Light a campfire from normal logs in Lumbridge Swamp + if (fire == Log.NORMAL && (playerRegion == 12593 || playerRegion == 12849)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 9); + } + // Light a willow log fire in Lumbridge Castle courtyard + if (fire == Log.WILLOW + && new ZoneBorders(3216, 3207, 3225, 3233, 0).insideBorder(player)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 3); + } + + setLastFire(); + } + + @Override + public void message(int type) { + String name = node.getId() == 3125 ? "bones" : "logs"; + switch (type) { + case 0: + player.getPacketDispatch().sendMessage("You attempt to light the " + name + ".."); + break; + case 1: + player.getPacketDispatch().sendMessage("The fire catches and the " + name + " begin to burn."); + break; + } + } + + /** + * Gets the last firemake. + * @return the tick. + */ + public int getLastFire() { + return player.getAttribute("last-firemake", 0); + } + + /** + * Sets the last fire. + */ + public void setLastFire() { + player.setAttribute("last-firemake", GameWorld.getTicks() + 2); + } + + /** + * Gets the ground item ash. + * @param object the object. + * @return {@code GroundItem} the itemm. + */ + public static GroundItem getAsh(final Player player, Log fire, final GameObject object) { + final GroundItem ash = new GroundItem(new Item(592), object.getLocation(), player); + ash.setDecayTime(fire.getLife() + 200); + return ash; + } + + /** + * Checks if the player gets rewarded. + * @return {@code True} if so. + */ + private boolean success() { + int level = 1 + player.getSkills().getLevel(Skills.FIREMAKING); + double req = fire.getLevel(); + double successChance = Math.ceil((level * 50 - req * 15) / req / 3 * 4); + int roll = RandomFunction.random(99); + if (successChance >= roll) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/LightLogPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/LightLogPlugin.java new file mode 100644 index 000000000..11f9a0e95 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/LightLogPlugin.java @@ -0,0 +1,32 @@ +package core.game.node.entity.skill.firemaking; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to light a log. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LightLogPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + player.getPulseManager().run(new FireMakingPulse(player, ((Item) node), ((GroundItem) node))); + return true; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("light", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/Log.java b/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/Log.java new file mode 100644 index 000000000..920ca0c5b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/firemaking/Log.java @@ -0,0 +1,128 @@ +package core.game.node.entity.skill.firemaking; + +import java.util.HashMap; + +/** + * Represents an enumeration of burnable logs. + * @author 'Vexia + */ +public enum Log { + NORMAL(1511, 1, 180, 2732, 40), + ACHEY(2862, 1, 180, 2732, 40), + OAK(1521, 15, 200, 2732, 60), + WILLOW(1519, 30, 250, 2732, 90), + TEAK(6333, 35, 300, 2732, 105), + ARCTIC_PINE(10810, 42, 500, 2732, 125), + MAPLE(1517, 45, 300, 2732, 135), + MAHOGANY(6332, 50, 300, 2732, 157.5), + EUCALYPTUS(12581, 58, 300, 2732, 193.5), + YEW(1515, 60, 400, 2732, 202.5), + MAGIC(1513, 75, 450, 2732, 303.8), + CURSED_MAGIC(13567, 82, 650, 2732, 303.8), + PURPLE(10329, 1, 200, 20001, 50), + WHITE(10328, 1, 200, 20000, 50), + BLUE(7406, 1, 200, 11406, 50), + GREEN(7405, 1, 200, 11405, 50), + RED(7404, 1, 200, 11404, 50), + JOGRE(3125, 1, 200, 3862, 50); + + public static HashMap logMap = new HashMap<>(); + static{ + Log[] logArray = Log.values(); + int logLength = logArray.length; + for(int i = 0; i < logLength; i++){ + Log log = logArray[i]; + logMap.putIfAbsent(log.logId,log); + } + } + + /** + * The log id. + */ + private final int logId; + + /** + * The level. + */ + private final int level; + + /** + * The life. + */ + private final int life; + + /** + * The fire id. + */ + private final int fireId; + + /** + * The exp gained. + */ + private final double xp; + + /** + * Constructs a new {@code FireMakingDefinitions.java} {@code Object}. + * @param logId the log id. + * @param level the level. + * @param life the life. + * @param fireId the fire id. + * @param xp the experience. + */ + Log(int logId, int level, int life, int fireId, double xp) { + this.logId = logId; + this.level = level; + this.life = life; + this.fireId = fireId; + this.xp = xp; + } + + /** + * Gets the logId. + * @return The logId. + */ + public int getLogId() { + return logId; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the life. + * @return The life. + */ + public int getLife() { + return life; + } + + /** + * Gets the fireId. + * @return The fireId. + */ + public int getFireId() { + return fireId; + } + + /** + * Gets the xp. + * @return The xp. + */ + public double getXp() { + return xp; + } + + /** + * Gets the log by the id. + * @param id the id. + * @return the log. + */ + public static Log forId(int id) { + return logMap.get(id); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fishing/Fish.java b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/Fish.java new file mode 100644 index 000000000..9afad3b80 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/Fish.java @@ -0,0 +1,115 @@ +package core.game.node.entity.skill.fishing; + +import core.game.node.item.Item; + +import java.util.HashMap; + +/** + * Represents a type of fish to catch. + * @author ceikry + */ +public enum Fish { + CRAYFISH(new Item(13435),1,10), + SHRIMP(new Item(317), 1, 10), + SARDINE(new Item(327), 5, 20), + KARAMBWANJI(new Item(3150), 5, 5), + HERRING(new Item(345), 10, 30), + ANCHOVIE(new Item(321), 15, 40), + MACKEREL(new Item(353), 16, 20), + TROUT(new Item(335), 20, 50), + COD(new Item(341), 23, 45), + PIKE(new Item(349), 25, 60), + SLIMY_EEL(new Item(3379), 28, 65), + SALMON(new Item(331), 30, 70), + FROG_SPAWN(new Item(5004), 33, 75), + TUNA(new Item(359), 35, 80), + RAINBOW_FISH(new Item(10138), 38, 80), + CAVE_EEL(new Item(5001), 38, 80), + LOBSTER(new Item(377), 40, 90), + BASS(new Item(363), 46, 100), + SWORDFISH(new Item(371), 50, 100), + LAVA_EEL(new Item(2148), 53, 100), + MONKFISH(new Item(7944), 62, 120), + KARAMBWAN(new Item(3142), 65, 105), + SHARK(new Item(383), 76, 110), + SEA_TURTLE(new Item(395), 79, 38), + MANTA_RAY(new Item(389), 81, 46), + SEAWEED(new Item(401), 16, 1), + CASKET(new Item(405), 16, 10), + OYSTER(new Item(407), 16, 10), + DARK_CRAB(new Item(14937), 85, 130); + + /** + * Constructs a new {@code Fish} {@code Object}. + * @param item the Item + * @param level the level. + * @param experience the experience. + */ + Fish(final Item item, final int level, final double experience, final int... npcs) { + this.item = item; + this.level = level; + this.experience = experience; + this.npcs = npcs; + } + + public static HashMap fishMap = new HashMap<>(); + static{ + for(Fish fish : Fish.values()){ + fishMap.putIfAbsent(fish.item.getId(),fish); + } + } + private final Item item; + + /** + * Represents the required level to catch the {@link Fish}. + */ + private final int level; + + /** + * Represents the experience gained from this fish. + */ + private final double experience; + + /** + * The npc ids that give this fish. + */ + private final int[] npcs; + + /** + * Gets the fish. + * @param item the item. + * @return the fash. + */ + public static Fish forItem(Item item) { + return fishMap.get(item.getId()); + } + + /** + * @return the item. + */ + public Item getItem() { + return item; + } + + /** + * @return the level. + */ + public int getLevel() { + return level; + } + + /** + * @return the experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the npcs. + * @return the npcs + */ + public int[] getNpcs() { + return npcs; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishSpots.java b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishSpots.java new file mode 100644 index 000000000..a4df9529c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishSpots.java @@ -0,0 +1,56 @@ +package core.game.node.entity.skill.fishing; + +import core.game.world.map.Location; + +import java.util.HashMap; + +/** + * Fishing spot locations + * @author Ceikry + */ +public enum FishSpots { + CATHERBY(Location.create(2844, 3429, 0), Location.create(2839, 3431, 0), new Location(2836, 3431, 0), new Location(2837, 3431, 0), new Location(2838, 3431, 0), new Location(2839, 3431, 0), new Location(2840, 3431, 0), new Location(2844, 3429, 0), new Location(2845, 3429, 0), new Location(2846, 3429, 0), new Location(2853, 3423, 0), new Location(2854, 3423, 0), new Location(2855, 3423, 0), new Location(2859, 3426, 0), new Location(2860, 3426, 0)), + ENTRANA(new Location(2842, 3359, 0), new Location(2843, 3359, 0), new Location(2844, 3359, 0), new Location(2847, 3361, 0), new Location(2848, 3361, 0), new Location(2849, 3361, 0), new Location(2850, 3361, 0)), + ENTRANA_PLATFORM(new Location(2879, 3334, 0), new Location(2879, 3335, 0), new Location(2879, 3338, 0), new Location(2879, 3339, 0), new Location(2877, 3342, 0), new Location(2876, 3342, 0), new Location(2875, 3342, 0), new Location(2875, 3331, 0), new Location(2876, 3331, 0), new Location(2877, 3331, 0)), + SEERS(new Location(2714, 3533, 0), new Location(2714, 3532, 0), new Location(2726, 3524, 0), new Location(2727, 3524, 0), new Location(2728, 3524, 0)), + DRAYNOR(new Location(3085, 3230, 0), new Location(3086, 3227, 0)), + BARBARIAN(new Location(3110, 3432, 0), new Location(3110, 3433, 0), new Location(3110, 3434, 0), Location.create(3104, 3425, 0), Location.create(3104, 3424, 0)), + LUMBRIDGE(new Location(3239, 3243, 0), new Location(3239, 3241, 0), new Location(3239, 3242, 0), Location.create(3238, 3251, 0), Location.create(3238, 3252, 0), Location.create(3238, 3253, 0)), + LUMBRIDGE_SWAMP(Location.create(3242, 3143, 0), Location.create(3242, 3148, 0), Location.create(3241, 3148, 0), Location.create(3240, 3147, 0), Location.create(3240, 3146, 0), Location.create(3244, 3150, 0), Location.create(3245, 3152, 0), Location.create(3246, 3155, 0), Location.create(3246, 3156, 0), new Location(3239, 3241, 0)), + LUMBRIDGE_MARSH(Location.create(3169, 3266, 0), Location.create(3168, 3266, 0), Location.create(3174, 3274, 0), Location.create(3173, 3274, 0)), + ALKHARID(new Location(3267, 3148, 0), new Location(3268, 3147, 0), new Location(3276, 3140, 0), new Location(3275, 3140, 0)), + FISHING_GUILD(new Location(2612, 3411, 0), new Location(2602, 3423, 0), new Location(2602, 3411, 0), new Location(2602, 3412, 0), new Location(2602, 3414, 0), new Location(2602, 3415, 0), new Location(2603, 3417, 0), new Location(2604, 3417, 0), new Location(2605, 3416, 0), new Location(2606, 3416, 0), new Location(2607, 3416, 0), new Location(2608, 3416, 0), new Location(2609, 3416, 0), new Location(2610, 3416, 0), new Location(2611, 3416, 0), new Location(2612, 3415, 0), new Location(2612, 3414, 0), new Location(2607, 3410, 0), new Location(2606, 3410, 0), new Location(2605, 3410, 0), new Location(2599, 3419, 0), new Location(2600, 3419, 0), new Location(2602, 3419, 0), new Location(2603, 3419, 0), new Location(2604, 3419, 0), new Location(2605, 3420, 0), new Location(2605, 3421, 0), new Location(2604, 3422, 0), new Location(2603, 3422, 0), new Location(2602, 3422, 0), new Location(2601, 3422, 0), new Location(2605, 3424, 0), new Location(2605, 3425, 0), new Location(2602, 3426, 0), new Location(2603, 3426, 0), new Location(2604, 3426, 0)), + GNOME(new Location(2388, 3424, 0), new Location(2390, 3422, 0), new Location(2391, 3421, 0), new Location(2382, 3413, 0), new Location(2382, 3414, 0), new Location(2382, 3415, 0)), CASTLEWAR(new Location(2465, 3156, 0), new Location(2464, 3155, 0), new Location(2468, 3157, 0), new Location(2469, 3157, 0), new Location(2471, 3158, 0), new Location(2472, 3156, 0), new Location(2462, 3145, 0), new Location(2461, 3150, 0), new Location(2461, 3151, 0)), SHILO(new Location(2460, 3144, 0), new Location(2461, 3150, 0), new Location(2461, 3151, 0), new Location(2853, 2977, 0), new Location(2854, 2977, 0), new Location(2855, 2977, 0), new Location(2856, 2977, 0), new Location(2858, 2976, 0), new Location(2859, 2976, 0), new Location(2860, 2976, 0), new Location(2863, 2975, 0), new Location(2863, 2975, 0), new Location(2864, 2975, 0), new Location(2865, 2972, 0), new Location(2860, 2972, 0), new Location(2855, 2974, 0), new Location(2852, 2973, 0)), KARAMJA(new Location(2923, 3178, 0), new Location(2923, 3179, 0), new Location(2923, 3180, 0), new Location(2924, 3181, 0), new Location(2925, 3181, 0), new Location(2926, 3180, 0), new Location(2926, 3179, 0), new Location(2926, 3178, 0), new Location(2926, 3177, 0), new Location(2926, 3176, 0)), DONATOR_ISLAND(Location.create(159, 41, 0), Location.create(160, 41, 0), Location.create(161, 41, 0), Location.create(162, 41, 0), Location.create(162, 30, 0)), + PISCATORIS(Location.create(2341, 3702, 0), Location.create(2342, 3702, 0), Location.create(2343, 3702, 0), Location.create(2344, 3702, 0), Location.create(2345, 3702, 0), Location.create(2346, 3702, 0), Location.create(2347, 3702, 0), Location.create(2349, 3702, 0), Location.create(2352, 3703, 0)), + TUTORIAL_ISLAND(Location.create(3101,3092, 0)), + WILDERNESS_ARENA(Location.create(3187, 3927, 0),Location.create(3185, 3926, 0),Location.create(3183, 3926, 0), Location.create(3181, 3926, 0)); + + FishSpots(final Location... locations) { + this.locations = locations; + } + + private final Location[] locations; + + public Location[] getLocations() { + return locations; + } + + public static HashMap locationMap = new HashMap<>(); + + static{ + FishSpots[] spots = values(); + int spotsLength = spots.length; + for(int x = 0; x < spotsLength; x++){ + Location[] locations = spots[x].locations; + int locationsLength = locations.length; + for(int y = 0; y < locationsLength; y++){ + locationMap.putIfAbsent(locations[y],spots[x]); + } + } + } + + //statically gets the fishing spot (loops suck btw) + public static FishSpots forLocation(Location loc) { + return locationMap.get(loc); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingOption.java b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingOption.java new file mode 100644 index 000000000..9ba15f22f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingOption.java @@ -0,0 +1,170 @@ +package core.game.node.entity.skill.fishing; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +import java.util.HashMap; + +/** + * Represents a fishing option. + * @author Emperor + */ +public enum FishingOption { + + CRAYFISH_CAGE(new Item(13431), 1, Animation.create(619), null, "cage", Fish.CRAYFISH), + SMALL_NET(new Item(303), 1, Animation.create(621), null, "net", Fish.SHRIMP, Fish.ANCHOVIE), + BAIT(new Item(307), 5, Animation.create(622), new Item(313), "bait", Fish.SARDINE, Fish.HERRING), + LURE(new Item(309), 20, new Animation(622), new Item(314), "lure", Fish.TROUT, Fish.SALMON, Fish.RAINBOW_FISH), + L_BAIT(new Item(307), 25, Animation.create(622), new Item(313), "bait", Fish.PIKE), + CAGE(new Item(301), 40, Animation.create(619), null, "cage", Fish.LOBSTER), + HARPOON(new Item(311), 35, Animation.create(618), null, "harpoon", Fish.TUNA, Fish.SWORDFISH), + BARB_HARPOON(new Item(10129), 35, Animation.create(618), null, "harpoon", Fish.TUNA, Fish.SWORDFISH), + BIG_NET(new Item(305), 16, Animation.create(620), null, "net", Fish.MACKEREL, Fish.COD, Fish.BASS, Fish.SEAWEED), + N_HARPOON(new Item(311), 76, Animation.create(618), null, "harpoon", Fish.SHARK), + H_NET(new Item(303), 1, Animation.create(621), null, "net", Fish.MONKFISH), + C_CAGE(new Item(301), 85, Animation.create(619), new Item(14943), "cage", Fish.DARK_CRAB); + + public static HashMap nameMap = new HashMap<>(); + static{ + for(FishingOption option : FishingOption.values()){ + nameMap.putIfAbsent(option.name,option); + } + } + + public static FishingOption forName(String name){ + return nameMap.get(name); + } + /** + * The tool required. + */ + private final Item tool; + + /** + * The fishing level required. + */ + private final int level; + + /** + * The fishing animation. + */ + private final Animation animation; + + /** + * The bait. + */ + private final Item bait; + + /** + * The option name. + */ + private final String name; + + /** + * The fish to catch. + */ + private final Fish[] fish; + + /** + * Constructs a new {@code FishingOption} {@code Object}. + * @param tool The tool needed. + * @param level The fishing level required. + * @param animation The animation. + * @param fish The fish to catch. + */ + private FishingOption(Item tool, int level, Animation animation, Item bait, String name, Fish... fish) { + this.tool = tool; + this.level = level; + this.animation = animation; + this.bait = bait; + this.name = name; + this.fish = fish; + } + + /** + * Method used to get a random {@link Fish}. + * @return the {@link Fish}. + */ + public Fish getRandomFish(final Player player) { + if (this == BIG_NET) { + switch (RandomFunction.randomize(100)) { + case 0: + return Fish.OYSTER; + case 50: + return Fish.CASKET; + case 90: + return Fish.SEAWEED; + } + } + if (this == LURE && player.getInventory().contains(10087, 1)) { + return Fish.RAINBOW_FISH; + } + Fish reward = fish[RandomFunction.randomize(fish.length)]; + if (reward.getLevel() > player.getSkills().getLevel(Skills.FISHING) || (reward == Fish.RAINBOW_FISH && !player.getInventory().contains(100887, 1))) { + reward = fish[0]; + } + return reward; + } + + /** + * Gets the start message. + * @return The start message. + */ + public String getStartMessage() { + if (name.equals("net")) { + return "You cast out your net..."; + } + return "You attempt to catch a fish."; + } + + /** + * Gets the tool. + * @return The tool. + */ + public Item getTool() { + return tool; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Gets the bait. + * @return The bait. + */ + public Item getBait() { + return bait; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Gets the fish. + * @return The fish. + */ + public Fish[] getFish() { + return fish; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingOptionPlugin.java new file mode 100644 index 000000000..d2d66762a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingOptionPlugin.java @@ -0,0 +1,50 @@ +package core.game.node.entity.skill.fishing; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to start fishing. + * @author Ceikry + * @version 1.2 + */ +@Initializable +public final class FishingOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("net", this); + NPCDefinition.setOptionHandler("bait", this); + NPCDefinition.setOptionHandler("lure", this); + NPCDefinition.setOptionHandler("cage", this); + NPCDefinition.setOptionHandler("harpoon", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + NPC npc = (NPC) node; + FishingSpot spot = FishingSpot.forId(npc.getId()); + if (spot == null) { + return false; + } + FishingOption opt = spot.getOptionByName(option); + + if (opt == null) { + return false; + } + player.getPulseManager().run(new FishingPulse(player, npc, opt)); + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingPulse.java new file mode 100644 index 000000000..08a3bce20 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingPulse.java @@ -0,0 +1,367 @@ +package core.game.node.entity.skill.fishing; + +import core.game.content.global.SkillingPets; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.familiar.Forager; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.skillertasks.SkillTasks; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks; + +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_BASE; +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_FISH; +import static core.tools.stringtools.StringToolsKt.colorize; + +/** + * Handles a fishing pulse. + * + * @author Ceikry + */ +public final class FishingPulse extends SkillPulse { + + /** + * Represents the fishing option. + */ + private final FishingOption option; + + /** + * Represents the fish type. + */ + private Fish fish; + + /** + * Represents the base location the npc was at. + */ + private final Location location; + + /** + * Constructs a new {@code FishingPulse} {@code Object}. + * + * @param player the player. + * @param npc the fishing spot NPC. + * @param option The fishing option. + */ + public FishingPulse(final Player player, final NPC npc, final FishingOption option) { + super(player, npc); + this.option = option; + this.location = npc.getLocation(); + if (option != null) { + this.fish = option.getRandomFish(player); + } + } + + @Override + public void start() { + if (TutorialSession.getExtension(player).getStage() == 12) { + TutorialStage.load(player, 13, false); + } + if (player.getFamiliarManager().hasFamiliar() && player.getFamiliarManager().getFamiliar() instanceof Forager) { + final Forager forager = (Forager) player.getFamiliarManager().getFamiliar(); + Location dest = player.getLocation().transform(player.getDirection()); + Pathfinder.find(forager.getLocation(), dest).walk(forager); + } + super.start(); + } + + @Override + public boolean checkRequirements() { + if (option == null) { + return false; + } + player.debug(String.valueOf(player.getInventory().containsItem(option.getTool()))); + if (!player.getInventory().containsItem(option.getTool()) && !hasBarbTail()) { + //System.out.println(isBareHanded(player)); + player.getDialogueInterpreter().sendDialogue("You need a " + option.getTool().getName().toLowerCase() + " to catch these fish."); + stop(); + return false; + } + if (option.getBait() != null && !player.getInventory().containsItem(option.getBait())) { + player.getDialogueInterpreter().sendDialogue("You don't have any " + option.getBait().getName().toLowerCase() + "s left."); + stop(); + return false; + } + if (player.getSkills().getLevel(Skills.FISHING) < fish.getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a fishing level of " + fish.getLevel() + " to catch " + (fish == Fish.SHRIMP || fish == Fish.ANCHOVIE ? "" : "a") + " " + fish.getItem().getName().toLowerCase() + ".".trim()); + stop(); + return false; + } + if (player.getInventory().freeSlots() == 0) { + player.getDialogueInterpreter().sendDialogue("You don't have enough space in your inventory."); + stop(); + return false; + } + if (location != node.getLocation() || !node.isActive() || node.isInvisible()) { + stop(); + return false; + } + return true; + } + + @Override + public void animate() { + if (isBareHanded(player)) { + player.animate(new Animation(6709)); + GameWorld.getPulser().submit(new Pulse(1) { + int counter = 0; + + @Override + public boolean pulse() { + switch (counter++) { + case 5: + getCatchAnimationAndLoot(player); + break; + } + return false; + } + }); + } else { + player.animate(option.getAnimation()); + } + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + super.setDelay(5); + return false; + } + if (player.getFamiliarManager().hasFamiliar() && player.getFamiliarManager().getFamiliar() instanceof Forager) { + final Forager forager = (Forager) player.getFamiliarManager().getFamiliar(); + forager.handlePassiveAction(); + } + if (success()) { + if ((player.getInventory().hasSpaceFor(fish.getItem()) && option.getBait() != null) ? player.getInventory().remove(option.getBait()) : true) { + + if (player.getSkillTasks().hasTask()) { + updateSkillTask(); + } + updateDiary(); + + SkillingPets.checkPetDrop(player, SkillingPets.HERON); + final Item item = fish.getItem(); + if(SkillcapePerks.isActive(SkillcapePerks.GREAT_AIM,player) && RandomFunction.random(100) <= 5){ + player.getInventory().add(item); + player.sendMessage(colorize("%RYour expert aim catches you a second fish.")); + } + player.getInventory().add(item); + int fishCaught = player.getAttribute(STATS_BASE + ":" + STATS_FISH,0); + player.setAttribute("/save:" + STATS_BASE + ":" + STATS_FISH,++fishCaught); + player.getSkills().addExperience(Skills.FISHING, fish.getExperience(), true); + message(2); + if (TutorialSession.getExtension(player).getStage() == 13) { + TutorialStage.load(player, 14, false); + stop(); + return true; + } + fish = option.getRandomFish(player); + } + } + return player.getInventory().freeSlots() == 0; + } + + public void updateDiary() { + switch (fish) { + case MACKEREL: + if (player.getViewport().getRegion().getId() == 11317) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 0, 11); + } + case BASS: + if (player.getViewport().getRegion().getId() == 11317 + && !player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 1, 11)) { + player.setAttribute("/save:diary:seers:bass-caught", true); + } + case SHARK: + if (player.getViewport().getRegion().getId() == 11317 + && !player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 2, 7)) { + player.setAttribute("/save:diary:seers:caught-shark", 1 + player.getAttribute("diary:seers:caught-shark", 0)); + if (player.getAttribute("diary:seers:caught-shark", 0) >= 5) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 7); + } + } + case SHRIMP: + // Catch some shrimp in the Fishing spot to the east of

Lumbridge Swamp + if (player.getLocation().withinDistance(Location.create(3241, 3149, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 0, 13); + } + case PIKE: + // Catch a pike in the river to the east of Lumbridge Castle + if (player.getLocation().withinDistance(Location.create(3240, 3247, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 4); + } + case SALMON: + // Catch a salmon in the river to the east of Lumbridge Castle + if (player.getLocation().withinDistance(Location.create(3240, 3247, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 9); + } + case TROUT: + // Catch a trout in the river to the east of Barbarian Village + if (player.getLocation().withinDistance(Location.create(3105, 3431, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 16); + } + } + // Use the Fishing spots north of the banana plantation + if (node.getId() == 333 && player.getZoneMonitor().isInZone("karamja") + && player.getLocation().withinDistance(new Location(2924, 3178, 0), 10)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 0, 6); + } + } + + public void updateSkillTask() { + switch (fish) { + case ANCHOVIE: + player.getSkillTasks().decreaseTask(player, SkillTasks.FANCHOVIES1); + player.getSkillTasks().decreaseTask(player, SkillTasks.FANCHOVIES2); + break; + case HERRING: + player.getSkillTasks().decreaseTask(player, SkillTasks.FHERRING1); + player.getSkillTasks().decreaseTask(player, SkillTasks.FHERRING2); + break; + case LOBSTER: + player.getSkillTasks().decreaseTask(player, SkillTasks.FLOBSTER1); + player.getSkillTasks().decreaseTask(player, SkillTasks.FLOBSTER2); + break; + case SALMON: + player.getSkillTasks().decreaseTask(player, SkillTasks.FSALMON1); + player.getSkillTasks().decreaseTask(player, SkillTasks.FSALMON2); + break; + case SHARK: + player.getSkillTasks().decreaseTask(player, SkillTasks.FSHARK1); + player.getSkillTasks().decreaseTask(player, SkillTasks.FSHARK2); + player.getSkillTasks().decreaseTask(player, SkillTasks.FSHARK3); + break; + case SHRIMP: + player.getSkillTasks().decreaseTask(player, SkillTasks.FSHRIMP1); + player.getSkillTasks().decreaseTask(player, SkillTasks.FSHRIMP2); + break; + case SWORDFISH: + player.getSkillTasks().decreaseTask(player, SkillTasks.FSWORD1); + player.getSkillTasks().decreaseTask(player, SkillTasks.FSWORD2); + break; + case TROUT: + player.getSkillTasks().decreaseTask(player, SkillTasks.FTROUT1); + player.getSkillTasks().decreaseTask(player, SkillTasks.FTROUT2); + break; + case TUNA: + player.getSkillTasks().decreaseTask(player, SkillTasks.FTUNA1); + player.getSkillTasks().decreaseTask(player, SkillTasks.FTUNA2); + break; + } + } + + private boolean isBareHanded(Player p) { + if (option == FishingOption.HARPOON) { + if (checkFish(p) > 0 && !(player.getInventory().containsItem(option.getTool()) || player.getEquipment().containsItem(option.getTool()))) { + return true; + } + if (checkFish(p) > 2 && !(player.getInventory().containsItem(option.getTool()) || player.getEquipment().containsItem(option.getTool()))) { + return true; + } + } + return false; + } + + private int getCatchAnimationAndLoot(Player p) { + int fishingFor = checkFish(p); + switch (node.getId()) { + case 324: + switch (fishingFor) { + case 1: + p.animate(new Animation(6710)); + p.getSkills().addExperience(Skills.FISHING, 80); + p.getSkills().addExperience(Skills.STRENGTH, 8); + p.getInventory().add(new Item(359)); + break; + case 2: + case 3: + if (RandomFunction.random(1) == 1) { + p.animate(new Animation(6710)); + p.getSkills().addExperience(Skills.FISHING, 80); + p.getSkills().addExperience(Skills.STRENGTH, 8); + p.getInventory().add(new Item(359)); + } else { + p.animate(new Animation(6707)); + p.getSkills().addExperience(Skills.FISHING, 100); + p.getSkills().addExperience(Skills.STRENGTH, 10); + p.getInventory().add(new Item(371)); + } + } + break; + case 313: + p.animate(new Animation(6705)); + p.getSkills().addExperience(Skills.FISHING, 110); + p.getSkills().addExperience(Skills.STRENGTH, 11); + p.getInventory().add(new Item(383)); + break; + } + return 0; + } + + public static int checkFish(Player p) { + if (p.getSkills().getLevel(Skills.FISHING) >= 55 && p.getSkills().getLevel(Skills.STRENGTH) >= 35) { + if (p.getSkills().getLevel(Skills.FISHING) >= 70 && p.getSkills().getLevel(Skills.STRENGTH) >= 50) { + if (p.getSkills().getLevel(Skills.FISHING) >= 96 && p.getSkills().getLevel(Skills.STRENGTH) >= 76) { + return 3; + } + return 2; + } + return 1; + } + return 0; + } + + /** + * Checks if they have the barb tail harpoon. + * + * @return {@code True} if so. + */ + private boolean hasBarbTail() { + if (option == FishingOption.HARPOON) { + if (player.getInventory().containsItem(FishingOption.BARB_HARPOON.getTool()) || player.getEquipment().containsItem(FishingOption.BARB_HARPOON.getTool())) { + return true; + } + } + return false; + } + + @Override + public void message(int type) { + switch (type) { + case 0: + player.getPacketDispatch().sendMessage(option.getStartMessage()); + break; + case 2: + player.getPacketDispatch().sendMessage(fish == Fish.ANCHOVIE || fish == Fish.SHRIMP ? "You catch some " + fish.getItem().getName().toLowerCase().replace("raw", "").trim() + "." : "You catch a " + fish.getItem().getName().toLowerCase().replace("raw", "").trim() + "."); + if (player.getInventory().freeSlots() == 0) { + player.getDialogueInterpreter().sendDialogue("You don't have enough space in your inventory."); + stop(); + } + break; + } + } + + /** + * Method used to check if the catch was a success. + * + * @return True if so. + */ + private boolean success() { + if (getDelay() == 1) { + return false; + } + int level = 1 + player.getSkills().getLevel(Skills.FISHING) + player.getFamiliarManager().getBoost(Skills.FISHING); + double hostRatio = Math.random() * fish.getLevel(); + double clientRatio = Math.random() * ((level * 1.25 - fish.getLevel())); + return hostRatio < clientRatio; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingSpot.java b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingSpot.java new file mode 100644 index 000000000..045fa780e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fishing/FishingSpot.java @@ -0,0 +1,81 @@ +package core.game.node.entity.skill.fishing; + +import java.util.HashMap; + +/** + * Represents a fishing spot. + * @author ceikry + */ +public enum FishingSpot { + + NET_BAIT(new int[] { 952, 316, 319, 320, 323, 325, 326, 327, 330, 332, 404, 1331, 2067, 2068, 2724, 4908, 5748, 5749, 7045 }, FishingOption.SMALL_NET, FishingOption.BAIT), + LURE_BAIT(new int[] { 309, 310, 311, 314, 315, 317, 318, 328, 329, 331, 403, 927, 1189, 1190, 3019 }, FishingOption.LURE, FishingOption.L_BAIT), + CAGE_HARPOON(new int[] { 312, 321, 324, 333, 405, 1332, 1399, 3804, 5470, 7046}, FishingOption.CAGE, FishingOption.HARPOON), + NET_HARPOON(new int[] { 313, 322, 334, 406, 1191, 1333, 1405, 1406, 3574, 3575, 5471, 7044 }, FishingOption.BIG_NET, FishingOption.N_HARPOON), + HARPOON_NET(new int[] { 3848, 3849 }, FishingOption.HARPOON, FishingOption.H_NET, FishingOption.BARB_HARPOON), + CRAB_CAGE(new int[] {8665}, FishingOption.C_CAGE); + + public static HashMap spotMap = new HashMap<>(); + + static{ + FishingSpot[] spots = values(); + int spotsLength = spots.length; + for (int x = 0; x < spotsLength; x++) { + FishingSpot spot = spots[x]; + int[] spotIds = spot.ids; + int spotIdsLength = spotIds.length; + for (int y = 0; y < spotIdsLength; y++) { + spotMap.putIfAbsent(spotIds[y],spot); + } + } + } + + public static FishingSpot forId(int npcId) { + return spotMap.get(npcId); + } + + + /** + * The NPC ids. + */ + private final int[] ids; + + /** + * The fishing options. + */ + private FishingOption options[]; + + /** + * Constructs a new {@code FishingSpot} {@code Object}. + * @param ids The NPC ids. + */ + private FishingSpot(int[] ids, FishingOption... options) { + this.ids = ids; + this.options = options; + } + + public FishingOption getOptionByName(String name){ + for(FishingOption o : this.options){ + if(o.getName().equals(name)){return o;} + } + System.out.println("Unhandled fishing spot option, spot id: " + this.ids[0] + " desired fishing option: " + name); + return FishingOption.SMALL_NET; //safe, default return. + } + + /** + * Gets the ids. + * @return The ids. + */ + public int[] getIds() { + return ids; + } + + /** + * Gets the options. + * @return The options. + */ + public FishingOption[] getOptions() { + return options; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/ArrowCreatePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/ArrowCreatePlugin.java new file mode 100644 index 000000000..567240357 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/ArrowCreatePlugin.java @@ -0,0 +1,114 @@ +package core.game.node.entity.skill.fletching; + +import core.plugin.Initializable; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.fletching.items.arrow.ArrowHeadPulse; +import core.game.node.entity.skill.fletching.items.arrow.HeadlessArrowPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; +import core.plugin.Plugin; + +/** + * Represents the plugin used to create arrows. + * @author Angle + */ +@Initializable +public class ArrowCreatePlugin extends UseWithHandler { + + /** + * Represents the headless arrow item. + */ + private static final Item HEADLESS_ARROW = new Item(53); + + /** + * Constructs a new {@code ArrowCreatePlugin} {@code Object}. + */ + public ArrowCreatePlugin() { + super(314, 53, 52); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + // Feathers plus colored feathers + addHandler(314, ITEM_TYPE, this); + addHandler(10087, ITEM_TYPE, this); + addHandler(10088, ITEM_TYPE, this); + addHandler(10089, ITEM_TYPE, this); + addHandler(10090, ITEM_TYPE, this); + addHandler(10091, ITEM_TYPE, this); + + // Headless Arrows + addHandler(53, ITEM_TYPE, this); + // Arrow heads + for (Fletching.ArrowHeads head : Fletching.ArrowHeads.values()) { + addHandler(head.unfinished, ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + event.getPlayer().debug("Trying to handle: " + event.getUsedItem() + " with " + event.getUsedWith()); + final Player player = event.getPlayer(); + + // If the player uses a feather on headless arrows, do headless arrow crafting + final int itemId = event.getUsedItem().getId(); + final int otherId = event.getUsedWith().getId(); + + final boolean hasFeather = (itemId == 314 || (itemId >= 10087 && itemId <= 10091)) || (otherId == 314 || (otherId >= 10087 && otherId <= 10091)); + final boolean hasShaft = (itemId == 52 || otherId == 52); + + // If the item used was feathers and the target was arrow shafts + if (hasFeather && hasShaft) { + // Creating headless arrows + final int featherId = itemId == 52 ? otherId : itemId; + + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, HEADLESS_ARROW) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new HeadlessArrowPulse(player, event.getUsedItem(), new Item(featherId), amount)); + } + @Override + public int getAll(int index) { + return player.getInventory().getAmount(HEADLESS_ARROW); + } + }; + handler.open(); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 210, 10)); + return true; + } + + // Otherwise, fletch normally + boolean firstIsHead = Fletching.isArrowHead(itemId); + if (!firstIsHead && !Fletching.isArrowHead(otherId)) { + return false; + } else if (hasFeather || hasShaft) { + // Disallow crafting feathers with arrowheads or shafts with arrowheads. + // It will fail anyway but this makes sure + // that the gui doesn't pop up on the client. + return true; + } + final Fletching.ArrowHeads head = Fletching.arrowHeadMap.get(firstIsHead ? itemId : otherId); + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, head.getFinished()) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new ArrowHeadPulse(player, event.getUsedItem(), head, amount)); + } + @Override + public int getAll(int index) { + return player.getInventory().getAmount(head.getUnfinished()); + } + }; + handler.open(); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 210, 10)); + + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/BoltCreatePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/BoltCreatePlugin.java new file mode 100644 index 000000000..a7c7d2db1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/BoltCreatePlugin.java @@ -0,0 +1,51 @@ +/* +package core.game.node.entity.skill.fletching; + +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.fletching.items.bolts.Bolt; +import core.game.node.entity.skill.fletching.items.bolts.BoltPulse; +import org.crandor.game.interaction.NodeUsageEvent; +import org.crandor.game.interaction.UseWithHandler; +import org.crandor.game.node.entity.player.Player; +import org.crandor.net.packet.PacketRepository; +import org.crandor.net.packet.context.ChildPositionContext; +import org.crandor.net.packet.out.RepositionChild; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.plugin.Plugin; + +*/ +/** + * Represents the bolt creating plugin. + * @author 'Vexia + * @version 1.0 + *//* + +@InitializablePlugin +public final class BoltCreatePlugin extends UseWithHandler { + + */ +/** + * Constructs a new {@code BoltCreatePlugin} {@code Object}. + *//* + + public BoltCreatePlugin() { + super(314); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Bolt bolt : Bolt.values()) { + addHandler(bolt.getItem().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + + } + +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/BoltGemPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/BoltGemPlugin.java new file mode 100644 index 000000000..3c4aaee72 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/BoltGemPlugin.java @@ -0,0 +1,45 @@ +//package core.game.node.entity.skill.fletching; +// +//import core.game.content.dialogue.SkillDialogueHandler; +//import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +//import core.game.node.entity.skill.fletching.items.gem.GemBolt; +//import core.game.node.entity.skill.fletching.items.gem.GemBoltPulse; +//import org.crandor.game.interaction.NodeUsageEvent; +//import org.crandor.game.interaction.UseWithHandler; +//import org.crandor.game.node.entity.player.Player; +//import org.crandor.net.packet.PacketRepository; +//import org.crandor.net.packet.context.ChildPositionContext; +//import org.crandor.net.packet.out.RepositionChild; +//import org.crandor.plugin.InitializablePlugin; +//import org.crandor.plugin.Plugin; +// +///** +// * Represents the plugin used to handle gem bolt making. +// * @author 'Vexia +// * @version 1.0 +// */ +//@InitializablePlugin +//public class BoltGemPlugin extends UseWithHandler { +// +// /** +// * Constructs a new {@code BoltGemPlugin} {@code Object}. +// */ +// public BoltGemPlugin() { +// super(45, 46, 9187, 9188, 9189, 9190, 9191, 9192, 9193, 9194); +// } +// +// @Override +// public Plugin newInstance(Object arg) throws Throwable { +// for (GemBolt bolt : GemBolt.values()) { +// addHandler(bolt.getBase().getId(), ITEM_TYPE, this); +// } +// return this; +// } +// +// @Override +// public boolean handle(final NodeUsageEvent event) { +// final Player player = event.getPlayer(); +// +// } +// +//} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/DartCreatePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/DartCreatePlugin.java new file mode 100644 index 000000000..c43104095 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/DartCreatePlugin.java @@ -0,0 +1,49 @@ +/* +package core.game.node.entity.skill.fletching; + +import core.game.node.entity.skill.fletching.items.darts.Dart; +import org.crandor.game.interaction.NodeUsageEvent; +import org.crandor.game.interaction.UseWithHandler; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.plugin.Plugin; +import core.game.content.quest.touristrap.TouristTrap; + +*/ +/** + * Represents the plugin used to create a dart. + * @author 'Vexia + * @version 1.0 + *//* + +@InitializablePlugin +public final class DartCreatePlugin extends UseWithHandler { + + */ +/** + * Constructs a new {@code DartCreatePlugin} {@code Object}. + *//* + + public DartCreatePlugin() { + super(314); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Dart dart : Dart.values()) { + addHandler(dart.getItem().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (event.getPlayer().getQuestRepository().getQuest(TouristTrap.NAME).getStage(event.getPlayer()) < 60) { + event.getPlayer().getPacketDispatch().sendMessage("You need to start Tourist Trap in order to do this."); + return true; + } + event.getPlayer().getDialogueInterpreter().open(328933, event.getUsedItem(), event.getBaseItem()); + return true; + } + +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchItem.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchItem.java new file mode 100644 index 000000000..fee42d6c1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchItem.java @@ -0,0 +1,137 @@ +/* +package core.game.node.entity.skill.fletching; + +import org.crandor.game.node.item.Item; + +*/ +/** + * Represents a fletching item to make. + * @author 'Vexia + *//* + +public enum FletchItem { + ARROW_SHAFT(FletchType.LOG, new Item(52, 15), 1, 5), SHORTBOW(FletchType.LOG, new Item(50), 5, 5), + LONGBOW(FletchType.LOG, new Item(48), 10, 10), + OAK_SHORTBOW(FletchType.OAK, new Item(54), 20, 16.5), + OAK_LONGBOW(FletchType.OAK, new Item(56), 25, 25), + WILLOW_SHORTBOW(FletchType.WILLOW, new Item(60), 35, 33.3), + WILLOW_LONGBOW(FletchType.WILLOW, new Item(58), 40, 41.5), + MAPLE_SHORTBOW(FletchType.MAPLE, new Item(64), 50, 50), + MAPLE_LONGBOW(FletchType.MAPLE, new Item(62), 55, 58.3), + YEW_SHORTBOW(FletchType.YEW, new Item(68), 65, 55), + YEW_LONGBOW(FletchType.YEW, new Item(66), 70, 75), + MAGIC_SHORTBOW(FletchType.MAGIC, new Item(72), 80, 83.3), + MAGIC_LONGBOW(FletchType.MAGIC, new Item(70), 85, 91.5), + WOODEN_STOCK(FletchType.LOG, new Item(9440), 9, 6), + OAK_STOCK(FletchType.OAK, new Item(9442), 24, 16), + WILLOW_STOCK(FletchType.WILLOW, new Item(9444), 39, 22), + TEAK_STOCK(FletchType.TEAK, new Item(9446), 46, 27), + MAPLE_STOCK(FletchType.MAPLE, new Item(9448), 54, 32), + MAHOGANY_STOCK(FletchType.MAHOGANY, new Item(9450), 61, 41), + YEW_STOCK(FletchType.YEW, new Item(9452), 69, 50); + + */ +/** + * Constructs a new {@code FletchItem.java} {@code Object}. + * @param type the type. + * @param product the product. + * @param level the level. + * @param experience the experience. + *//* + + FletchItem(final FletchType type, final Item product, final int level, final double experience) { + this.type = type; + this.product = product; + this.level = level; + this.experience = experience; + } + + */ +/** + * Represents the type this item pertaint o. + *//* + + private FletchType type; + + */ +/** + * Represents the product of this item. + *//* + + private Item product; + + */ +/** + * Represents the level. + *//* + + private final int level; + + */ +/** + * Represents the experience. + *//* + + private final double experience; + + */ +/** + * Gets the type. + * @return The type. + *//* + + public FletchType getType() { + return type; + } + + */ +/** + * Sets the type. + * @param type The type to set. + *//* + + public void setType(FletchType type) { + this.type = type; + } + + */ +/** + * Gets the product. + * @return The product. + *//* + + public Item getProduct() { + return product; + } + + */ +/** + * Sets the product. + * @param product The product to set. + *//* + + public void setProduct(Item product) { + this.product = product; + } + + */ +/** + * Gets the level. + * @return The level. + *//* + + public int getLevel() { + return level; + } + + */ +/** + * Gets the experience. + * @return The experience. + *//* + + public double getExperience() { + return experience; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchType.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchType.java new file mode 100644 index 000000000..33509c1ab --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchType.java @@ -0,0 +1,88 @@ +/* +package core.game.node.entity.skill.fletching; + +import org.crandor.game.component.Component; +import org.crandor.game.node.item.Item; + +*/ +/** + * Represents the multiple fletching types(log types) + * @author 'Vexia + *//* + +public enum FletchType { + LOG(new Item(1511), FletchItem.ARROW_SHAFT, FletchItem.SHORTBOW, FletchItem.LONGBOW, FletchItem.WOODEN_STOCK), OAK(new Item(1521), FletchItem.OAK_SHORTBOW, FletchItem.OAK_LONGBOW, FletchItem.OAK_STOCK), WILLOW(new Item(1519), FletchItem.WILLOW_SHORTBOW, FletchItem.WILLOW_LONGBOW, FletchItem.WILLOW_STOCK), MAPLE(new Item(1517), FletchItem.MAPLE_SHORTBOW, FletchItem.MAPLE_LONGBOW, FletchItem.MAPLE_STOCK), TEAK(new Item(6333), FletchItem.TEAK_STOCK), MAHOGANY(new Item(6332), FletchItem.MAHOGANY_STOCK), YEW(new Item(1515), FletchItem.YEW_SHORTBOW, FletchItem.YEW_LONGBOW, FletchItem.YEW_STOCK), MAGIC(new Item(1513), FletchItem.MAGIC_SHORTBOW, FletchItem.MAGIC_LONGBOW); + + */ +/** + * Constructs a new {@code FletchType} {@code Object}. + * @param log the log. + * @param items the item.s + *//* + + FletchType(final Item log, final FletchItem... items) { + this.log = log; + this.items = items; + } + + */ +/** + * Represents the log of this type. + *//* + + private final Item log; + + */ +/** + * Represents the fletching items of this type. + *//* + + private FletchItem[] items; + + */ +/** + * Gets the items. + * @return The items. + *//* + + public FletchItem[] getItems() { + return items; + } + + */ +/** + * Gets the log. + * @return The log. + *//* + + public Item getLog() { + return log; + } + + */ +/** + * Method used to get the component based on type. + * @return the component. + *//* + + public Component getComponent() { + return items.length > 1 ? new Component(301 + items.length) : new Component(309); + } + + */ +/** + * Method used to get the FletchType based on the log item. + * @param item the item. + * @return the fletch type. + *//* + + public static FletchType forItem(final Item item) { + for (FletchType type : FletchType.values()) { + if (type.getLog().getId() == item.getId()) { + return type; + } + } + return null; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/Fletching.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/Fletching.java new file mode 100644 index 000000000..e86cf67a0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/Fletching.java @@ -0,0 +1,343 @@ +package core.game.node.entity.skill.fletching; + +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +import java.util.HashMap; +public class Fletching { + public static HashMaplogMap = new HashMap<>(); + public static HashMap boltMap = new HashMap<>(); + public static HashMap dartMap = new HashMap<>(); + public static HashMap arrowHeadMap = new HashMap<>(); + public static HashMap gemMap = new HashMap<>(); + public static HashMap tipMap = new HashMap<>(); + public static HashMap stringMap = new HashMap<>(); + public static HashMap limbMap = new HashMap<>(); + static{ + Items[] itemsArray = Items.values(); + int thisLength = itemsArray.length; + for(int x = 0; x < thisLength; x++){ + Items item = itemsArray[x]; + logMap.putIfAbsent(item.id, item.items); + } + Bolts[] boltArray = Bolts.values(); + thisLength = boltArray.length; + for(int x = 0; x < thisLength; x++){ + Bolts bolt = boltArray[x]; + boltMap.putIfAbsent(bolt.unfinished,bolt); + } + Darts[] dartArray = Darts.values(); + thisLength = dartArray.length; + for(int x = 0; x < thisLength; x++){ + Darts dart = dartArray[x]; + dartMap.putIfAbsent(dart.unfinished,dart); + } + ArrowHeads[] ahArray = ArrowHeads.values(); + thisLength = ahArray.length; + for(int x = 0; x < thisLength; x++){ + ArrowHeads arrowhead = ahArray[x]; + arrowHeadMap.putIfAbsent(arrowhead.unfinished,arrowhead); + } + GemBolts[] gbArray = GemBolts.values(); + thisLength = gbArray.length; + for(int x = 0; x < thisLength; x++){ + GemBolts gem = gbArray[x]; + gemMap.putIfAbsent(gem.gem,gem); + tipMap.putIfAbsent(gem.tip,gem); + } + String[] stringArray = String.values(); + thisLength = stringArray.length; + for(int x = 0; x < thisLength; x++){ + String bow = stringArray[x]; + stringMap.putIfAbsent(bow.unfinished,bow); + } + Limb[] limbsArray = Limb.values(); + thisLength = limbsArray.length; + for(int x = 0; x < thisLength; x++){ + Limb limb = limbsArray[x]; + limbMap.putIfAbsent(limb.stock, limb); + } + } + public static FletchingItems[] getEntries(int id){ + return logMap.get(id); + } + public static boolean isLog(int id){ + return logMap.get(id) != null; + } + public static boolean isBolt(int id){ + return boltMap.get(id) != null; + } + public static boolean isDart(int id){ + return dartMap.get(id) != null; + } + public static boolean isArrowHead(int id){ + return arrowHeadMap.get(id) != null; + } + public static boolean isGemTip(int id){ + return tipMap.get(id) != null; + } + public static Item[] getItems(int id){ + FletchingItems[] entry = getEntries(id); + Item items[] = {}; + switch(entry.length){ + case 1: + items = new Item[] {new Item(entry[0].id)}; + break; + case 2: + items = new Item[] {new Item(entry[0].id), new Item(entry[1].id)}; + break; + case 3: + items = new Item[] {new Item(entry[0].id), new Item(entry[1].id), new Item(entry[2].id)}; + break; + case 4: + items = new Item[] {new Item(entry[0].id), new Item(entry[1].id), new Item(entry[2].id), new Item(entry[3].id)}; + break; + } + return items; + } + public enum Limb { + WOODEN_STOCK(9440,9420,9454,9, 12, new Animation(4436)), + OAK_STOCK(9442,9422,9176,24, 32, new Animation(4437)), + WILLOW_STOCK(9444,9423,9457,39, 44, new Animation(4438)), + TEAK_STOCK(9446,9425,9459,46, 54, new Animation(4439)), + MAPLE_STOCK(9448,9427,9461,54, 64, new Animation(4440)), + MAHOGANY_STOCK(9450,9429,9463,61, 82, new Animation(4441)), + YEW_STOCK(9452,9431,9465,69, 100, new Animation(4442)); + + + public int stock, limb, product,level; + public double experience; + public Animation animation; + + Limb(int stock, int limb, int product, int level, double experience, Animation animation) { + this.stock = stock; + this.limb = limb; + this.product = product; + this.level = level; + this.experience = experience; + this.animation = animation; + } + } + public enum String{ + //Bows + SHORT_BOW((byte) 1,50,841,5, 5, new Animation(6678)), + LONG_BOW((byte) 1,48,839,10, 10, new Animation(6684)), + OAK_SHORTBOW((byte) 1,54,843,20, 16.5, new Animation(6679)), + OAK_LONGBOW((byte) 1,56,845,25, 25, new Animation(6685)), + WILLOW_SHORTBOW((byte) 1,60,849,35, 33.3, new Animation(6680)), + WILLOW_LONGBOW((byte) 1,58,847,40, 41.5, new Animation(6686)), + MAPLE_SHORTBOW((byte) 1,64,853,50, 50, new Animation(6681)), + MAPLE_LONGBOW((byte) 1,62,851,55, 58.3, new Animation(6687)), + YEW_SHORTBOW((byte) 1,68,857,65, 66, new Animation(6682)), + YEW_LONGBOW((byte) 1,66,855,70, 75, new Animation(6688)), + MAGIC_SHORTBOW((byte) 1,72,861,80, 83.3, new Animation(6683)), + MAGIC_LONGBOW((byte) 1,70,859,85, 91.5, new Animation(6689)), + + //crossbows + BRONZE_CBOW((byte) 2,9454,9174,9, 6, new Animation(6671)), + BLURITE_CBOW((byte) 2,9456,9176,24, 16, new Animation(6672)), + IRON_CBOW((byte) 2,9457,9177,39, 22, new Animation(6673)), + STEEL_CBOW((byte) 2,9459,9179,46, 27, new Animation(6674)), + MITHIRIL_CBOW((byte) 2,9461,9181,54, 32, new Animation(6675)), + ADAMANT_CBOW((byte) 2,9463,9183,61, 41, new Animation(6676)), + RUNITE_CBOW((byte) 2,9465,9185,69, 50, new Animation(6677)); + + + public int unfinished,product,string,level; + public double experience; + public Animation animation; + String(byte indicator, final int unfinished, final int product, final int level, final double experience, final Animation animation) { + this.unfinished = unfinished; + this.product = product; + this.level = level; + this.experience = experience; + this.animation = animation; + switch(indicator & 0xFF){ + case 1: + this.string = 1777; + break; + case 2: + this.string = 9438; + break; + } + } + } + public enum GemBolts { + OPAL(877, core.tools.Items.OPAL_1609, 45, 879, 11, 1.5), + PEARL(9140, core.tools.Items.OYSTER_PEARL_411, 46, 880, 41, 3.2), + PEARLS(9140, core.tools.Items.OYSTER_PEARLS_413, 46, 880, 41, 3.2), + JADE(9139, core.tools.Items.JADE_1611, 9187, 9335, 26, 2.4), + RED_TOPAZ(9141, core.tools.Items.RED_TOPAZ_1613, 9188, 9336, 48, 3.9), + SAPPHIRE(9142, core.tools.Items.SAPPHIRE_1607, 9189, 9337, 56, 4), + EMERALD(9142, core.tools.Items.EMERALD_1605, 9190, 9338, 58, 5.5), + RUBY(9143, core.tools.Items.RUBY_1603, 9191, 9339, 63, 6.3), + DIAMOND(9143, core.tools.Items.DIAMOND_1601, 9192, 9340, 65, 7), + DRAGONSTONE(9144, core.tools.Items.DRAGONSTONE_1615, 9193, 9341, 71, 8.2), + ONYX(9144, core.tools.Items.ONYX_6573, 9194, 9342, 73, 9.4); + + public int gem,tip,base,product,level; + public double experience; + GemBolts(int base, int gem, int tip, int product, int level, double experience){ + this.gem = gem; + this.tip = tip; + this.base = base; + this.product = product; + this.level = level; + this.experience = experience; + } + + } + public enum ArrowHeads { + BRONZE_ARROW(39, 882, 1, 2.6), + IRON_ARROW(40, 884, 15, 3.8), + STEEL_ARROW(41, 886, 30, 6.3), + MITHRIL_ARROW(42, 888, 45, 8.8), + ADAMANT_ARROW(43, 890, 60, 10), + RUNE_ARROW(44, 892, 75, 13.8), + DRAGON_ARROW(11237, 11212, 90, 16.3), + BROAD_ARROW(13278, 4160, 52, 10); + + public int unfinished,finished,level; + public double experience; + ArrowHeads(int unfinished, int finished, int level, double experience){ + this.unfinished = unfinished; + this.finished = finished; + this.level = level; + this.experience = experience; + } + public Item getFinished(){ + return new Item(finished); + } + public Item getUnfinished(){ + return new Item(unfinished); + } + } + public enum Darts{ + BRONZE_DART(819, 806, 1, 1.8), + IRON_DART(820, 807, 22, 3.8), + STEEL_DART(821, 808, 37, 7.5), + MITHRIL_DART(822, 809, 52, 11.2), + ADAMANT_DART(823, 810, 67, 15), + RUNE_DART(824, 811, 81, 18.8), + DRAGON_DART(11232, 11230, 95, 25); + + public int unfinished, finished, level; + public double experience; + Darts(int unfinished, int finished, int level, double experience){ + this.unfinished = unfinished; + this.finished = finished; + this.level = level; + this.experience = experience; + } + public Item getFinished(){ + return new Item(finished); + } + public Item getUnfinished(){ + return new Item(unfinished); + } + } + public enum Bolts{ + BRONZE_BOLT(9375, 877, 9, 0.5), + BLURITE_BOLT(9376, 9139, 24, 1), + IRON_BOLT(9377, 9140, 39, 1.5), + SILVER_BOLT(9382, 9145, 43, 2.5), + STEEL_BOLT(9378, 9141, 46, 3.5), + MITHRIL_BOLT(9379, 9142, 54, 5), + ADAMANTITE_BOLT(9380, 9143, 61, 7), + RUNITE_BOLT(9381, 9144, 69, 10), + BROAD_BOLT(13279, 13280, 55, 3); + + public int unfinished, finished, level; + public double experience; + Bolts(int unfinished, int finished, int level, double experience){ + this.unfinished = unfinished; + this.finished = finished; + this.level = level; + this.experience = experience; + } + public Item getFinished(){ + return new Item(finished); + } + public Item getUnfinished(){ + return new Item(unfinished); + } + } + private enum Items{ + STANDARD(1511,FletchingItems.ARROW_SHAFT, FletchingItems.SHORT_BOW, FletchingItems.LONG_BOW, FletchingItems.WOODEN_STOCK), + OAK(1521, FletchingItems.OAK_SHORTBOW, FletchingItems.OAK_LONGBOW, FletchingItems.OAK_STOCK), + WILLOW(1519, FletchingItems.WILLOW_SHORTBOW, FletchingItems.WILLOW_LONGBOW, FletchingItems.WILLOW_STOCK), + MAPLE(1517, FletchingItems.MAPLE_SHORTOW, FletchingItems.MAPLE_LONGBOW, FletchingItems.MAPLE_STOCK), + YEW(1515, FletchingItems.YEW_SHORTBOW, FletchingItems.YEW_LONGBOW, FletchingItems.YEW_STOCK), + MAGIC(1513, FletchingItems.MAGIC_SHORTBOW, FletchingItems.MAGIC_LONGBOW), + TEAK(6333, FletchingItems.TEAK_STOCK); + + + FletchingItems[] items; + int id; + Items(int id, FletchingItems item_1, FletchingItems item_2, FletchingItems item_3, FletchingItems item_4){ + items = new FletchingItems[] {item_1, item_2, item_3, item_4}; + this.id = id; + } + Items(int id, FletchingItems item_1, FletchingItems item_2, FletchingItems item_3){ + items = new FletchingItems[] {item_1, item_2, item_3}; + this.id = id; + } + Items(int id, FletchingItems item_1, FletchingItems item_2){ + items = new FletchingItems[] {item_1, item_2}; + this.id = id; + } + Items(int id, FletchingItems item_1){ + items = new FletchingItems[] {item_1}; + this.id = id; + } + } + public enum FletchingItems { + //Standard logs + ARROW_SHAFT(52, 15, 1, 15), + SHORT_BOW(50, 5, 5, 1), + LONG_BOW(48, 10, 10, 1), + WOODEN_STOCK(9440, 6, 9, 1), + + //Oak logs + OAK_SHORTBOW(54, 16.5, 20, 1), + OAK_LONGBOW(56,25,25,1), + OAK_STOCK(9442, 16, 24, 1), + + //Willow logs + WILLOW_SHORTBOW(60, 33.3, 35, 1), + WILLOW_LONGBOW(58, 41.5, 40, 1), + WILLOW_STOCK(9444, 22, 39, 1), + + //Maple logs + MAPLE_SHORTOW(64, 50, 50, 1), + MAPLE_LONGBOW(62, 58.3, 55, 1), + MAPLE_STOCK(9448, 32, 54, 1), + + //Yew logs + YEW_SHORTBOW(68, 55, 65, 1), + YEW_LONGBOW(66, 75, 70, 1), + YEW_STOCK(9452, 50, 69, 1), + + //Magic logs + MAGIC_SHORTBOW(72, 83.3, 80,1), + MAGIC_LONGBOW(70, 91.5, 85, 1), + + //Teak + TEAK_STOCK(9446, 27, 46,1); + + + int id,level,amount,logId; + double experience; + FletchingItems(int id, double experience, int level, int amount){ + this.id = id; + this.level = level; + this.amount = amount; + this.experience = experience; + } + + public Item getItem(){ + return new Item(id); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchingPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchingPlugin.java new file mode 100644 index 000000000..928022b1f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchingPlugin.java @@ -0,0 +1,132 @@ +package core.game.node.entity.skill.fletching; + +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.fletching.items.bolts.BoltPulse; +import core.game.node.entity.skill.fletching.items.darts.DartPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to open the fletching dialogue. + * @author Ceikry + */ +@Initializable +public class FletchingPlugin extends UseWithHandler { + + public FletchingPlugin() { + super(819,820,821,822,823,824,11232,9375,9376,9377,9382,9378,9379,9380,9381,13279,1511,1521,1519,1517,1515,1513,6332,6333); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + // Knife + addHandler(946, ITEM_TYPE, this); + + // Feathers plus colored feathers + addHandler(314, ITEM_TYPE,this); + addHandler(10087, ITEM_TYPE, this); + addHandler(10088, ITEM_TYPE, this); + addHandler(10089, ITEM_TYPE, this); + addHandler(10090, ITEM_TYPE, this); + addHandler(10091, ITEM_TYPE, this); + + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + + //handle darts + if(Fletching.isDart(event.getUsedItem().getId())){ + final Fletching.Darts dart = Fletching.dartMap.get(event.getUsedItem().getId()); + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, dart.getFinished()) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new DartPulse(player, event.getUsedItem(), dart, amount)); + } + @Override + public int getAll(int index) { + return player.getInventory().getAmount(event.getUsedItem()); + } + }; + handler.open(); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 230, 10)); + return true; + } + + //handle bolts + if(Fletching.isBolt(event.getUsedItem().getId()) || Fletching.isBolt(event.getUsedWith().getId())){ + // figure out which of the used items is a bolt, and which is potentially a feather + final Fletching.Bolts bolt + = Fletching.isBolt(event.getUsedItem().getId()) + ? Fletching.boltMap.get(event.getUsedItem().getId()) + : Fletching.boltMap.get(event.getUsedWith().getId()); + final int featherId + = Fletching.isBolt(event.getUsedItem().getId()) + ? event.getUsedWith().getId() + : event.getUsedItem().getId(); + final boolean hasFeather = (featherId == 314 || (featherId >= 10087 && featherId <= 10091)); + + if (hasFeather) { + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, bolt.getFinished()) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new BoltPulse(player, event.getUsedItem(), bolt, new Item(featherId), amount)); + } + @Override + public int getAll(int index) { + return player.getInventory().getAmount(event.getUsedItem()); + } + }; + handler.open(); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 210, 10)); + return true; + } + return false; + } + + //handle logs + if(Fletching.isLog(event.getUsedItem().getId())) { + final Item log = event.getUsedItem(); + Item[] items = Fletching.getItems(log.getId()); + SkillDialogue dialLength = SkillDialogue.ONE_OPTION; + switch (items.length) { + case 2: + dialLength = SkillDialogue.TWO_OPTION; + break; + case 3: + dialLength = SkillDialogue.THREE_OPTION; + break; + case 4: + dialLength = SkillDialogue.FOUR_OPTION; + break; + } + SkillDialogueHandler handler = new SkillDialogueHandler(player, dialLength, items) { + + @Override + public void create(final int amount, int index) { + final Fletching.FletchingItems item = Fletching.getEntries(log.getId())[index]; + player.getPulseManager().run(new FletchingPulse(player, log, amount, item)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(log); + } + + }; + handler.open(); + return true; + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchingPulse.java new file mode 100644 index 000000000..2a4f38f70 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/FletchingPulse.java @@ -0,0 +1,107 @@ +package core.game.node.entity.skill.fletching; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.zone.ZoneBorders; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.tools.StringUtils; + +/** + * fletching skill pulse + * @author ceik + */ +public final class FletchingPulse extends SkillPulse { + + /** + * Seers bank zone borders for the diary task + */ + private static final ZoneBorders bankZone = new ZoneBorders(2721,3493,2730,3487); + + /** + * Represents the animation used in this generic pulse. + */ + private static final Animation ANIMATION = new Animation(1248); + + /** + * Represents the item we are fletching. + */ + private Fletching.FletchingItems fletch; + + /** + * Represents the amount to fletch. + */ + private int amount = 0; + + /** + * Constructs a new {@code FletchingPulse.java} {@code Object}. + * @param player + * @param node + */ + public FletchingPulse(final Player player, final Item node, final int amount, final Fletching.FletchingItems fletch) { + super(player, node); + this.amount = amount; + this.fletch = fletch; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.FLETCHING) < fletch.level) { + player.getDialogueInterpreter().sendDialogue("You need a Fletching skill of " + fletch.level + " or above to make " + (StringUtils.isPlusN(fletch.getItem().getName().replace("(u)", "").trim()) ? "an" : "a") + " " + fletch.getItem().getName().replace("(u)", "").trim()); + return false; + } + if (amount > player.getInventory().getAmount(node)) { + amount = player.getInventory().getAmount(node); + } + return true; + } + + @Override + public void animate() { + player.animate(ANIMATION); + } + + @Override + public boolean reward() { + if(bankZone.insideBorder(player) && fletch == Fletching.FletchingItems.MAGIC_SHORTBOW) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 2); + } + if (getDelay() == 1) { + super.setDelay(4); + return false; + } + if (player.getInventory().remove(node)) { + final Item item = new Item(fletch.id,fletch.amount); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.FLETCHING, fletch.experience, true); + String message = getMessage(); + player.getPacketDispatch().sendMessage(message); + + if (fletch.id == Fletching.FletchingItems.MAGIC_SHORTBOW.id + && (new ZoneBorders(2721, 3489, 2724, 3493, 0).insideBorder(player) + || new ZoneBorders(2727, 3487, 2730, 3490, 0).insideBorder(player)) + && !player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 2, 2)) { + player.setAttribute("/save:diary:seers:fletch-magic-short-bow", true); + } + } else { + return true; + } + amount--; + return amount == 0; + } + + /** + * Method used to get the message of the fletch. + * @return the message. + */ + public String getMessage() { + switch (fletch) { + case ARROW_SHAFT: + return "You carefully cut the wood into 15 arrow shafts."; + default: + return "You carefully cut the wood into " + (StringUtils.isPlusN(fletch.getItem().getName()) ? "an" : "a") + " " + fletch.getItem().getName().replace("(u)", "").trim() + "."; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/GemBoltPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/GemBoltPlugin.java new file mode 100644 index 000000000..a23aeb9f7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/GemBoltPlugin.java @@ -0,0 +1,103 @@ +package core.game.node.entity.skill.fletching; + +import core.plugin.Initializable; +import core.tools.Items; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.node.entity.skill.fletching.items.gem.GemBoltCutPulse; +import core.game.node.entity.skill.fletching.items.gem.GemBoltPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; +import core.plugin.Plugin; + +/** + * Represents the gem bolt creating plugin. + * @author Ceikry + * @version 2.0 + */ +@Initializable +public final class GemBoltPlugin extends UseWithHandler { + Fletching.GemBolts bolt; + + /** + * Constructs a new {@code GemBoltPlugin} {@code Object}. + */ + public GemBoltPlugin() { + super(Items.OPAL_BOLT_TIPS_45, + Items.PEARL_BOLT_TIPS_46, + Items.JADE_BOLT_TIPS_9187, + Items.TOPAZ_BOLT_TIPS_9188, + Items.SAPPHIRE_BOLT_TIPS_9189, + Items.EMERALD_BOLT_TIPS_9190, + Items.RUBY_BOLT_TIPS_9191, + Items.DIAMOND_BOLT_TIPS_9192, + Items.DRAGON_BOLT_TIPS_9193, + Items.ONYX_BOLT_TIPS_9194, + Items.OYSTER_PEARL_411, + Items.OYSTER_PEARLS_413, + Items.OPAL_1609, + Items.JADE_1611, + Items.RED_TOPAZ_1613, + Items.SAPPHIRE_1607, + Items.EMERALD_1605, + Items.RUBY_1603, + Items.DIAMOND_1601, + Items.DRAGONSTONE_1615, + Items.ONYX_6573); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(Items.CHISEL_1755, ITEM_TYPE, this); + for(Fletching.GemBolts gem : Fletching.GemBolts.values()){ + addHandler(gem.base, ITEM_TYPE,this); + } + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + bolt = Fletching.tipMap.get(event.getUsedItem().getId()); + if(bolt == null){ + bolt = Fletching.tipMap.get(event.getUsedWith().getId()); + } + if(bolt != null){ + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, new Item(bolt.product)) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new GemBoltPulse(player, event.getUsedItem(), bolt, amount)); + } + @Override + public int getAll(int index) { + return player.getInventory().getAmount(event.getUsedItem()); + } + }; + handler.open(); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 210, 10)); + } else { + final Fletching.GemBolts gem = Fletching.gemMap.get(event.getUsedItem().getId() == Items.CHISEL_1755 ? event.getBaseItem().getId() : event.getUsedItem().getId()); + if(gem == null){ + return false; + } + new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, new Item(gem.gem)) { + @Override + public void create(final int amount, final int index) { + player.getPulseManager().run(new GemBoltCutPulse(player, event.getUsedItem(), gem, amount)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(gem.gem); + } + + }.open(); + } + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/MakeCrossbowPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/MakeCrossbowPlugin.java new file mode 100644 index 000000000..3439e0700 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/MakeCrossbowPlugin.java @@ -0,0 +1,62 @@ +package core.game.node.entity.skill.fletching; + +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.node.entity.skill.fletching.items.crossbow.LimbPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to make a crossbow. + * @author Ceikry + */ +@Initializable +public class MakeCrossbowPlugin extends UseWithHandler { + Fletching.Limb limb; + Item whichItem; + + /** + * Constructs a new {@code StringcrossbowPlugin} {@code Object}. + */ + public MakeCrossbowPlugin() { + super(9420, 9423, 9422, 9425, 9427, 9429, 9431); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Fletching.Limb l : Fletching.Limb.values()) { + addHandler(new Item(l.stock).getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + limb = Fletching.limbMap.get(event.getBaseItem().getId()); + whichItem = (Item)event.getUsedWith(); + if(limb == null){ + limb = Fletching.limbMap.get(event.getUsed().getId()); + whichItem = (Item)event.getUsed(); + } + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogueHandler.SkillDialogue.ONE_OPTION, new Item(limb.product)) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new LimbPulse(player, whichItem, limb, amount)); + } + @Override + public int getAll(int index) { + return player.getInventory().getAmount(whichItem); + } + }; + handler.open(); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 210, 10)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/MithGrapplePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/MithGrapplePlugin.java new file mode 100644 index 000000000..8c69ee0af --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/MithGrapplePlugin.java @@ -0,0 +1,69 @@ +package core.game.node.entity.skill.fletching; + +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to make a mithril grapple. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MithGrapplePlugin extends UseWithHandler { + + /** + * Represents the rope grapple. + */ + private static final Item ROPE_GRAPPLE = new Item(9419); + + /** + * Represents the mith grapple. + */ + private static final Item MITH_GRAPPLE = new Item(9418); + + /** + * Represents the rope item. + */ + private static final Item ROPE = new Item(954); + + /** + * Constructs a new {@code MithGrapplePlugin} {@code Object}. + */ + public MithGrapplePlugin() { + super(9416, 954); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(9142, ITEM_TYPE, this); + addHandler(9418, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Item first = event.getUsedItem(); + final Item second = event.getBaseItem(); + if (first.getId() == 9418 && second.getId() != 954) { + return false; + } else if (first.getId() == 9418 && second.getId() == 954) { + if (player.getInventory().remove(ROPE) && player.getInventory().remove(MITH_GRAPPLE)) { + player.getInventory().add(ROPE_GRAPPLE); + } + return true; + } + if (player.getSkills().getLevel(Skills.FLETCHING) < 59) { + player.getDialogueInterpreter().sendDialogue("You need a fletching level of 59 in order to do that."); + return true; + } + player.getDialogueInterpreter().open(903213, first, second); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/StringbowPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/StringbowPlugin.java new file mode 100644 index 000000000..2bf001813 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/StringbowPlugin.java @@ -0,0 +1,65 @@ +package core.game.node.entity.skill.fletching; + +import core.plugin.Initializable; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.node.entity.skill.fletching.items.bow.StringPulse; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; +import core.plugin.Plugin; + +/** + * Represents the plugin used to string a bow. + * @author Ceikry + * @version 2.0 + */ +@Initializable +public final class StringbowPlugin extends UseWithHandler { + Fletching.String string; + + /** + * Constructs a new {@code StringbowPlugin} {@code Object}. + */ + public StringbowPlugin() { + super(1777, 9438); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Fletching.String bw : Fletching.String.values()) { + addHandler(bw.unfinished, ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + Fletching.String string = Fletching.stringMap.get(event.getUsedItem().getId()); + if(string == null){ + string = Fletching.stringMap.get(event.getUsedWith().getId()); + } + final Fletching.String bow = string; + if(!(player.getInventory().containsItem(new Item(bow.string)))){ + player.getDialogueInterpreter().sendDialogue("That's not the correct type of string."); + return true; + } + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogueHandler.SkillDialogue.ONE_OPTION, new Item(bow.product)) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new StringPulse(player, event.getUsedItem(), bow, amount)); + } + @Override + public int getAll(int index) { + return player.getInventory().getAmount(event.getUsedItem()); + } + }; + handler.open(); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(player, 309, 2, 215, 10)); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/arrow/ArrowHead.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/arrow/ArrowHead.java new file mode 100644 index 000000000..c7ab5ec7c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/arrow/ArrowHead.java @@ -0,0 +1,123 @@ +/* +package core.game.node.entity.skill.fletching.items.arrow; + +import org.crandor.game.node.item.Item; + +*/ +/** + * Represents the enum storing the arrow head information. + * @author 'Vexia + * @note brutal arrows after quest. + *//* + +public enum ArrowHead { + BRONZE_ARROW(new Item(39), new Item(882), 1, 2.6), + IRON_ARROW(new Item(40), new Item(884), 15, 3.8), + STEEL_ARROW(new Item(41), new Item(886), 30, 6.3), + MITHRIL_ARROW(new Item(42), new Item(888), 45, 8.8), + ADAMANT_ARROW(new Item(43), new Item(890), 60, 10), + RUNE_ARROW(new Item(44), new Item(892), 75, 13.8), + DRAGON_ARROW(new Item(11237), new Item(11212), 90, 16.3), + BROAD_ARROW(new Item(13278), new Item(4160), 52, 10); + + */ +/** + * Constructs a new {@code ArrowHead.java} {@code Object}. + * @param item the item. + * @param product the product. + * @param level the level. + * @param experience the experience. + *//* + + ArrowHead(Item item, Item product, int level, double experience) { + this.item = item; + this.product = product; + this.level = level; + this.experience = experience; + } + + */ +/** + * Represents the arrow tip. + *//* + + private final Item item; + + */ +/** + * Represents the product item. + *//* + + private final Item product; + + */ +/** + * Represents the level required. + *//* + + private final int level; + + */ +/** + * Represents the experience gained. + *//* + + private final double experience; + + */ +/** + * Gets the item. + * @return The item. + *//* + + public Item getTips() { + return item; + } + + */ +/** + * Gets the product. + * @return The product. + *//* + + public Item getProduct() { + return product; + } + + */ +/** + * Gets the level. + * @return The level. + *//* + + public int getLevel() { + return level; + } + + */ +/** + * Gets the experience. + * @return The experience. + *//* + + public double getExperience() { + return experience; + } + + */ +/** + * Gets the arrow head. + * @param item the item. + * @return the arrow head. + *//* + + public static ArrowHead forItem(final Item item) { + for (ArrowHead arrow : ArrowHead.values()) { + if (arrow.getTips().getId() == item.getId()) { + return arrow; + } + } + return null; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java new file mode 100644 index 000000000..17bfe101e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/arrow/ArrowHeadPulse.java @@ -0,0 +1,103 @@ +package core.game.node.entity.skill.fletching.items.arrow; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.fletching.Fletching; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the arrow head pulse to complete the headless arrow. + * @author 'Vexia + */ +public class ArrowHeadPulse extends SkillPulse { + + /** + * Represents the headless arrow item. + */ + private static final Item HEADLESS_ARROW = new Item(53); + + /** + * Represents the arrow head. + */ + private final Fletching.ArrowHeads arrow; + + /** + * Represents the sets to do. + */ + private int sets; + + /** + * Constructs a new {@code ArrowHeadPulse.java} {@code Object}. + * @param player the player. + * @param node the node. + * @param arrow the arrow. + * @param sets the sets. + */ + public ArrowHeadPulse(final Player player, final Item node, final Fletching.ArrowHeads arrow, final int sets) { + super(player, node); + this.arrow = arrow; + this.sets = sets; + } + + @Override + public boolean checkRequirements() { + if (arrow.unfinished == 4160) { + if (!player.getSlayer().getLearned()[0]) { + player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad arrows."); + return false; + } + } + if (player.getSkills().getLevel(Skills.FLETCHING) < arrow.level) { + player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + arrow.level + " to do this."); + return false; + } + return true; + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + super.setDelay(3); + } + Item tip = arrow.getUnfinished(); + int tipAmount = player.getInventory().getAmount(arrow.unfinished); + int shaftAmount = player.getInventory().getAmount(HEADLESS_ARROW); + if (tipAmount >= 15 && shaftAmount >= 15) { + HEADLESS_ARROW.setAmount(15); + tip.setAmount(15); + player.getPacketDispatch().sendMessage("You attach arrow heads to 15 arrow shafts."); + } else { + int amount = tipAmount > shaftAmount ? shaftAmount : tipAmount; + HEADLESS_ARROW.setAmount(amount); + tip.setAmount(amount); + player.getPacketDispatch().sendMessage(amount == 1 ? "You attach an arrow head to an arrow shaft." : "You attach arrow heads to " + amount + " arrow shafts."); + } + if (player.getInventory().remove(HEADLESS_ARROW, tip)) { + player.getSkills().addExperience(Skills.FLETCHING, arrow.experience * tip.getAmount(), true); + Item product = arrow.getFinished(); + product.setAmount(tip.getAmount()); + player.getInventory().add(product); + } + HEADLESS_ARROW.setAmount(1); + tip.setAmount(1); + if (!player.getInventory().containsItem(HEADLESS_ARROW)) { + return true; + } + if (!player.getInventory().containsItem(tip)) { + return true; + } + sets--; + return sets == 0; + } + + @Override + public void message(int type) { + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/arrow/HeadlessArrowPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/arrow/HeadlessArrowPulse.java new file mode 100644 index 000000000..cbb1bf67b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/arrow/HeadlessArrowPulse.java @@ -0,0 +1,139 @@ +package core.game.node.entity.skill.fletching.items.arrow; + +import core.tools.Items; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the arrow pulse for creating unfinished arrows. + * @author 'Vexia + */ +public final class HeadlessArrowPulse extends SkillPulse { + + /** + * Represents the headless arrow item. + */ + private final Item HEADLESS_ARROW = new Item(Items.HEADLESS_ARROW_53); + + /** + * Represents the arrow shaft item. + */ + private final Item ARROW_SHAFT = new Item(Items.ARROW_SHAFT_52); + + /** + * Represents the feather items. + */ + private static final Item[] FEATHER = new Item[] { + new Item(Items.FEATHER_314), + new Item(Items.STRIPY_FEATHER_10087), + new Item(Items.RED_FEATHER_10088), + new Item(Items.BLUE_FEATHER_10089), + new Item(Items.YELLOW_FEATHER_10090), + new Item(Items.ORANGE_FEATHER_10091) + }; + + /** + * The feather being used. + */ + private Item feather; + + /** + * Represents the amount to make. + */ + private int sets; + + /** + * Represents if we should use sets, meaning we have 15 & 15 arrow shafts and feathers. + */ + private boolean useSets = false; + + /** + * Constructs a new {@code ArrowPulse.java} {@code Object}. + * @param player the player. + * @param node the node. + */ + public HeadlessArrowPulse(Player player, Item node, Item feather, int sets) { + super(player, node); + this.sets = sets; + this.feather = feather; + } + + @Override + public boolean checkRequirements() { + if (!player.getInventory().containsItem(ARROW_SHAFT)) { + player.getDialogueInterpreter().sendDialogue("You don't have any arrow shafts."); + return false; + } + if (feather == null || !player.getInventory().containsItem(feather)) { + player.getDialogueInterpreter().sendDialogue("You don't have any feathers."); + return false; + } + if (player.getInventory().contains(ARROW_SHAFT.getId(), 15) && player.getInventory().contains(feather.getId(), 15)) { + useSets = true; + } else { + useSets = false; + } + return true; + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + int featherAmount = player.getInventory().getAmount(feather); + int shaftAmount = player.getInventory().getAmount(ARROW_SHAFT); + if (getDelay() == 1) { + super.setDelay(3); + } + if (featherAmount >= 15 && shaftAmount >= 15) { + feather.setAmount(15); + ARROW_SHAFT.setAmount(15); + player.getPacketDispatch().sendMessage("You attach feathers to 15 arrow shafts."); + } else { + int amount = featherAmount > shaftAmount ? shaftAmount : featherAmount; + feather.setAmount(amount); + ARROW_SHAFT.setAmount(amount); + player.getPacketDispatch().sendMessage(amount == 1 + ? "You attach a feathers to a shaft." : "You attach feathers to " + amount + " arrow shafts."); + } + if (player.getInventory().remove(feather, ARROW_SHAFT)) { + HEADLESS_ARROW.setAmount(feather.getAmount()); + player.getSkills().addExperience(Skills.FLETCHING, HEADLESS_ARROW.getAmount(), true); + player.getInventory().add(HEADLESS_ARROW); + } + HEADLESS_ARROW.setAmount(1); + feather.setAmount(1); + ARROW_SHAFT.setAmount(1); + if (!player.getInventory().containsItem(ARROW_SHAFT)) { + return true; + } + if (!player.getInventory().containsItem(feather)) { + return true; + } + sets--; + return sets <= 0; + } + + @Override + public void message(int type) { + } + + /** + * Gets the feather item. + * @return the item. + */ + private Item getFeather() { + int length = FEATHER.length; + for (int i = 0; i < length; i++) { + Item f = FEATHER[i]; + if (player.getInventory().containsItem(f)) { + return f; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bolts/Bolt.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bolts/Bolt.java new file mode 100644 index 000000000..f877050db --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bolts/Bolt.java @@ -0,0 +1,123 @@ +/* +package core.game.node.entity.skill.fletching.items.bolts; + +import org.crandor.game.node.item.Item; + +*/ +/** + * Represents an enum of bolts. + * @author 'Vexia + *//* + +public enum Bolt { + BRONZE_BOLT(new Item(9375), new Item(877), 9, 0.5), + BLURITE_BOLT(new Item(9376), new Item(9139), 24, 1), + IRON_BOLT(new Item(9377), new Item(9140), 39, 1.5), + SILVER_BOLT(new Item(9382), new Item(9145), 43, 2.5), + STEEL_BOLT(new Item(9378), new Item(9141), 46, 3.5), + MITHRIL_BOLT(new Item(9379), new Item(9142), 54, 5), + ADAMANTITE_BOLT(new Item(9380), new Item(9143), 61, 7), + RUNITE_BOLT(new Item(9381), new Item(9144), 69, 10), + BROAD_BOLT(new Item(13279), new Item(13280), 55, 3); + + */ +/** + * The item required. + *//* + + private final Item item; + + */ +/** + * The product recieved. + *//* + + private final Item product; + + */ +/** + * The level required. + *//* + + private final int level; + + */ +/** + * The experience gained. + *//* + + private final double experience; + + */ +/** + * Constructs a new {@code Bolt} {@code Object}. + * @param item the item. + * @param product the product. + * @param level the level. + * @param experience the experienece. + *//* + + Bolt(Item item, Item product, int level, double experience) { + this.item = item; + this.product = product; + this.level = level; + this.experience = experience; + } + + */ +/** + * Gets the item. + * @return The item. + *//* + + public Item getItem() { + return item; + } + + */ +/** + * Gets the product. + * @return The product. + *//* + + public Item getProduct() { + return product; + } + + */ +/** + * Gets the level. + * @return The level. + *//* + + public int getLevel() { + return level; + } + + */ +/** + * Gets the experience. + * @return The experience. + *//* + + public double getExperience() { + return experience; + } + + */ +/** + * Method used to get the bolt for the item. + * @param item the item. + * @return the bolt. + *//* + + public static Bolt forItem(final Item item) { + for (Bolt bolt : Bolt.values()) { + if (bolt.getItem().getId() == item.getId()) { + return bolt; + } + } + return null; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java new file mode 100644 index 000000000..48f78adb6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bolts/BoltPulse.java @@ -0,0 +1,124 @@ +package core.game.node.entity.skill.fletching.items.bolts; + +import core.tools.Items; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.fletching.Fletching; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the bolt pulse class to make bolts. + * @author ceik + */ +public final class BoltPulse extends SkillPulse { + + /** + * Represents the feather item. + */ + private Item feather; + + /** + * Represents possible feather Items + */ + private static final Item[] FEATHER = new Item[] { + new Item(Items.FEATHER_314), + new Item(Items.STRIPY_FEATHER_10087), + new Item(Items.RED_FEATHER_10088), + new Item(Items.BLUE_FEATHER_10089), + new Item(Items.YELLOW_FEATHER_10090), + new Item(Items.ORANGE_FEATHER_10091) + }; + + /** + * Represents the bolt. + */ + private final Fletching.Bolts bolt; + + /** + * Represents the sets to do. + */ + private int sets; + + /** + * Represents if we're using sets. + */ + private boolean useSets = false; + + /** + * Constructs a new {@code BoltPulse.java} {@code Object}. + * @param player the player. + * @param node the node. + */ + public BoltPulse(Player player, Item node, final Fletching.Bolts bolt, final Item feather, final int sets) { + super(player, node); + this.bolt = bolt; + this.sets = sets; + this.feather = feather; + } + + @Override + public boolean checkRequirements() { + if (bolt.getUnfinished().getId() == 13279) { + if (!player.getSlayer().getLearned()[0]) { + player.getDialogueInterpreter().sendDialogue("You need to unlock the ability to create broad bolts."); + return false; + } + } + if (player.getSkills().getLevel(Skills.FLETCHING) < bolt.level) { + player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + bolt.level + " in order to do this."); + return false; + } + if (!player.getInventory().containsItem(feather)) { + return false; + } + if (!player.getInventory().containsItem(bolt.getUnfinished())) { + return false; + } + return true; + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + int featherAmount = player.getInventory().getAmount(feather); + int boltAmount = player.getInventory().getAmount(bolt.unfinished); + if (getDelay() == 1) { + super.setDelay(3); + } + final Item unfinished = bolt.getUnfinished(); + if (featherAmount >= 10 && boltAmount >= 10) { + feather.setAmount(10); + unfinished.setAmount(10); + player.getPacketDispatch().sendMessage("You fletch 10 bolts."); + } else { + int amount = featherAmount > boltAmount ? boltAmount : featherAmount; + feather.setAmount(amount); + unfinished.setAmount(amount); + player.getPacketDispatch().sendMessage(amount == 1 ? "You attach a feather to a bolt." : "You fletch " + amount + " bolts"); + } + if (player.getInventory().remove(feather, unfinished)) { + Item product = bolt.getFinished(); + product.setAmount(feather.getAmount()); + player.getSkills().addExperience(Skills.FLETCHING, product.getAmount() * bolt.experience, true); + player.getInventory().add(product); + } + feather.setAmount(1); + if (!player.getInventory().containsItem(feather)) { + return true; + } + if (!player.getInventory().containsItem(bolt.getUnfinished())) { + return true; + } + sets--; + return sets <= 0; + } + + @Override + public void message(int type) { + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bow/StringBow.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bow/StringBow.java new file mode 100644 index 000000000..0187f17bb --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bow/StringBow.java @@ -0,0 +1,136 @@ +/* +package core.game.node.entity.skill.fletching.items.bow; + +import org.crandor.game.node.item.Item; +import org.crandor.game.world.update.flag.context.Animation; + +*/ +/** + * Represents the enum of stringing bows. + * @author 'Vexia + *//* + +public enum StringBow { + SHORT_BOW(new Item(50), new Item(841), 5, 5, new Animation(6678)), + LONG_BOW(new Item(48), new Item(839), 10, 10, new Animation(6684)), + OAK_SHORTBOW(new Item(54), new Item(843), 20, 16.5, new Animation(6679)), + OAK_LONGBOW(new Item(56), new Item(845), 25, 25, new Animation(6685)), + WILLOW_SHORTBOW(new Item(60), new Item(849), 35, 33.3, new Animation(6680)), + WILLOW_LONGBOW(new Item(58), new Item(847), 40, 41.5, new Animation(6686)), + MAPLE_SHORTBOW(new Item(64), new Item(853), 50, 50, new Animation(6681)), + MAPLE_LONGBOW(new Item(62), new Item(851), 55, 58.3, new Animation(6687)), + YEW_SHORTBOW(new Item(68), new Item(857), 65, 66, new Animation(6682)), + YEW_LONGBOW(new Item(66), new Item(855), 70, 75, new Animation(6688)), + MAGIC_SHORTBOW(new Item(72), new Item(861), 80, 83.3, new Animation(6683)), + MAGIC_LONGBOW(new Item(70), new Item(859), 85, 91.5, new Animation(6689)); + + + StringBow(final Item item, final Item product, final int level, final double experience, final Animation animation) { + this.item = item; + this.product = product; + this.level = level; + this.experience = experience; + this.animation = animation; + } + + */ +/** + * The item required. + *//* + + private final Item item; + + */ +/** + * The item product. + *//* + + private final Item product; + + */ +/** + * The level required. + *//* + + private final int level; + + */ +/** + * The experience required. + *//* + + private final double experience; + + */ +/** + * The animation of stringing. + *//* + + private final Animation animation; + + */ +/** + * Gets the item. + * @return The item. + *//* + + public Item getItem() { + return item; + } + + */ +/** + * Gets the product. + * @return The product. + *//* + + public Item getProduct() { + return product; + } + + */ +/** + * Gets the level. + * @return The level. + *//* + + public int getLevel() { + return level; + } + + */ +/** + * Gets the experience. + * @return The experience. + *//* + + public double getExperience() { + return experience; + } + + */ +/** + * Method used to get the animation. + * @return the animation. + *//* + + public Animation getAnimation() { + return animation; + } + + */ +/** + * Method used to get the string bow for the item. + * @param item the item. + * @return the string bow. + *//* + + public static StringBow forItem(final int id) { + for (StringBow bw : StringBow.values()) { + if (bw.getItem().getId() == id) { + return bw; + } + } + return null; + } +}*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bow/StringPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bow/StringPulse.java new file mode 100644 index 000000000..1381e09ff --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/bow/StringPulse.java @@ -0,0 +1,88 @@ +package core.game.node.entity.skill.fletching.items.bow; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.map.zone.ZoneBorders; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.fletching.Fletching; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the skill pulse of stringing. + * + * @author Ceikry + */ +public class StringPulse extends SkillPulse { + + /** + * Represents the string bow. + */ + private final Fletching.String bow; + + /** + * The amount. + */ + private int amount; + + /** + * Constructs a new {@code StringbowPlugin.java} {@code Object}. + * + * @param player the player. + * @param node the node. + */ + public StringPulse(Player player, Item node, final Fletching.String bow, int amount) { + super(player, node); + setDelay(bow.string == 1777 ? 9 : 7); + this.bow = bow; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (getDelay() == 1) { + setDelay(bow.string == 1777 ? 9 : 7); + } + if (player.getSkills().getLevel(Skills.FLETCHING) < bow.level) { + player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + bow.level + " to string this bow."); + return false; + } + if (!player.getInventory().containsItem(new Item(bow.string))) { + player.getDialogueInterpreter().sendDialogue("You seem to have run out of bow strings."); + return false; + } + animate(); + return true; + } + + @Override + public void animate() { + player.animate(bow.animation); + } + + @Override + public boolean reward() { + if (player.getInventory().remove(new Item(bow.unfinished), new Item(bow.string))) { + player.getInventory().add(new Item(bow.product)); + player.getSkills().addExperience(Skills.FLETCHING, bow.experience, true); + player.getPacketDispatch().sendMessage("You add a string to the bow."); + + if (bow == Fletching.String.MAGIC_SHORTBOW + && (new ZoneBorders(2721, 3489, 2724, 3493, 0).insideBorder(player) + || new ZoneBorders(2727, 3487, 2730, 3490, 0).insideBorder(player)) + && player.getAttribute("diary:seers:fletch-magic-short-bow", false)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 2); + } + } + if (!player.getInventory().containsItem(new Item(bow.string)) || !player.getInventory().containsItem(new Item(bow.unfinished))) { + return true; + } + amount--; + return amount == 0; + } + + @Override + public void message(int type) { + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/CrossbowPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/CrossbowPulse.java new file mode 100644 index 000000000..cfe0cf53b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/CrossbowPulse.java @@ -0,0 +1,97 @@ +/* +package core.game.node.entity.skill.fletching.items.crossbow; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.item.Item; + +*/ +/** + * Represents the skill pulse of stringing. + * @author 'Vexia + *//* + +public class CrossbowPulse extends SkillPulse { + + */ +/** + * Represents the bow string item. + *//* + + private final Item BOW_STRING = new Item(9438); + + */ +/** + * Represents the string bow. + *//* + + private final StringCross bow; + + */ +/** + * Represents the amount. + *//* + + private int amount; + + */ +/** + * Constructs a new {@code StringcrossbowPlugin.java} {@code Object}. + * @param player the player. + * @param node the node. + *//* + + public CrossbowPulse(Player player, Item node, final StringCross bow, int amount) { + super(player, node); + this.bow = bow; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.FLETCHING) < bow.getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + bow.getLevel() + " to string this crossbow."); + return false; + } + if (!player.getInventory().containsItem(BOW_STRING)) { + player.getDialogueInterpreter().sendDialogue("You seem to have run out of bow strings."); + return false; + } + return true; + } + + @Override + public void animate() { + player.animate(bow.getAnimation()); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + super.setDelay(5); + return false; + } + if (player.getInventory().remove(bow.getItem(), BOW_STRING)) { + player.getInventory().add(bow.getProduct()); + player.getSkills().addExperience(Skills.FLETCHING, bow.getExperience(), true); + player.getPacketDispatch().sendMessage("You add a string to the crossbow."); + } + if (!player.getInventory().containsItem(BOW_STRING) || !player.getInventory().containsItem(bow.getItem())) { + return true; + } + amount--; + return amount == 0; + } + + @Override + public void message(int type) { + switch (type) { + case 0: + break; + case 1: + break; + } + } + +}*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/Limb.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/Limb.java new file mode 100644 index 000000000..4672d165e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/Limb.java @@ -0,0 +1,128 @@ +package core.game.node.entity.skill.fletching.items.crossbow; + +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the enum for limbs. + * @author 'Vexia + */ +public enum Limb { + WOODEN_STOCK(new Item(9440), new Item(9420), new Item(9454), 9, 12, new Animation(4436)), + OAK_STOCK(new Item(9442), new Item(9422), new Item(9176), 24, 32, new Animation(4437)), + WILLOW_STOCK(new Item(9444), new Item(9423), new Item(9457), 39, 44, new Animation(4438)), + TEAK_STOCK(new Item(9446), new Item(9425), new Item(9459), 46, 54, new Animation(4439)), + MAPLE_STOCK(new Item(9448), new Item(9427), new Item(9461), 54, 64, new Animation(4440)), + MAHOGANY_STOCK(new Item(9450), new Item(9429), new Item(9463), 61, 82, new Animation(4441)), + YEW_STOCK(new Item(9452), new Item(9431), new Item(9465), 69, 100, new Animation(4442)); + + /** + * Constructs a new {@code StringcrosbowPlugin.java} {@code Object}. + * @param stock the stock. + * @param limb the limb. + * @param product the product. + * @param level the level. + * @param experience the experience. + * @param animation the animation. + */ + Limb(Item stock, Item limb, Item product, int level, double experience, Animation animation) { + this.stock = stock; + this.limb = limb; + this.product = product; + this.level = level; + this.experience = experience; + this.animation = animation; + } + + /** + * The stock. + */ + private final Item stock; + + /** + * The limb. + */ + private final Item limb; + + /** + * The product. + */ + private final Item product; + + /** + * The level. + */ + private final int level; + + /** + * The experience. + */ + private final double experience; + + /** + * The animation. + */ + private final Animation animation; + + /** + * Gets the stock. + * @return The stock. + */ + public Item getStock() { + return stock; + } + + /** + * Gets the limb. + * @return The limb. + */ + public Item getLimb() { + return limb; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Method used to get the {@link Limb} for the item. + * @param item the item. + * @return the limb. + */ + public static Limb forItems(final Item item, final Item second) { + for (Limb l : Limb.values()) { + if (l.getLimb().getId() == item.getId() && l.getStock().getId() == second.getId() || l.getLimb().getId() == second.getId() && l.getStock().getId() == item.getId()) { + return l; + } + } + return null; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/LimbPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/LimbPulse.java new file mode 100644 index 000000000..7444b265c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/LimbPulse.java @@ -0,0 +1,79 @@ +package core.game.node.entity.skill.fletching.items.crossbow; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.fletching.Fletching; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the skill pulse of attaching limbs. + * @author Ceikry + */ +public class LimbPulse extends SkillPulse { + + /** + * Represents the limbs. + */ + private final Fletching.Limb limb; + + /** + * Represents the amount. + */ + private int amount; + + /** + * Constructs a new {@code StringcrossbowPlugin.java} {@code Object}. + * @param player the player. + * @param node the node. + */ + public LimbPulse(Player player, Item node, final Fletching.Limb limb, int amount) { + super(player, node); + this.limb = limb; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.FLETCHING) < limb.level) { + player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + limb.level + " to attach these limbs."); + return false; + } + if (!player.getInventory().containsItem(new Item(limb.limb))) { + player.getDialogueInterpreter().sendDialogue("That's not the correct limb to attach."); + return false; + } + if (!player.getInventory().containsItem(new Item(limb.stock))) { + return false; + } + return true; + } + + @Override + public void animate() { + player.animate(limb.animation); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + super.setDelay(6); + return false; + } + if (player.getInventory().remove(new Item(limb.stock), new Item(limb.limb))) { + player.getInventory().add(new Item(limb.product)); + player.getSkills().addExperience(Skills.FLETCHING, limb.experience, true); + player.getPacketDispatch().sendMessage("You attach the metal limbs to the stock."); + } + if (!player.getInventory().containsItem(new Item(limb.limb))) { + return true; + } + amount--; + return amount == 0; + } + + @Override + public void message(int type) { + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/StringCross.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/StringCross.java new file mode 100644 index 000000000..32671c480 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/crossbow/StringCross.java @@ -0,0 +1,139 @@ +/* +package core.game.node.entity.skill.fletching.items.crossbow; + +import org.crandor.game.node.item.Item; +import org.crandor.game.world.update.flag.context.Animation; + +*/ +/** + * Represents the enum of stringing crossbows. + * @author 'Vexia + *//* + +public enum StringCross { + BRONZE_CBOW(new Item(9454), new Item(9174), 9, 6, new Animation(6671)), + BLURITE_CBOW(new Item(9456), new Item(9176), 24, 16, new Animation(6672)), + IRON_CBOW(new Item(9457), new Item(9177), 39, 22, new Animation(6673)), + STEEL_CBOW(new Item(9459), new Item(9179), 46, 27, new Animation(6674)), + MITHIRIL_CBOW(new Item(9461), new Item(9181), 54, 32, new Animation(6675)), + ADAMANT_CBOW(new Item(9463), new Item(9183), 61, 41, new Animation(6676)), + RUNITE_CBOW(new Item(9465), new Item(9185), 69, 50, new Animation(6677)); + */ +/** + * Constructs a new {@code StringcrossbowPlugin.java} {@code Object}. + * @param item the item. + * @param product the product. + * @param level the level. + * @param experience the experience. + *//* + + StringCross(final Item item, final Item product, final int level, final double experience, final Animation animation) { + this.item = item; + this.product = product; + this.level = level; + this.experience = experience; + this.animation = animation; + } + + */ +/** + * The item required. + *//* + + private final Item item; + + */ +/** + * The item product. + *//* + + private final Item product; + + */ +/** + * The level required. + *//* + + private final int level; + + */ +/** + * The experience required. + *//* + + private final double experience; + + */ +/** + * The animation of stringing. + *//* + + private final Animation animation; + + */ +/** + * Gets the item. + * @return The item. + *//* + + public Item getItem() { + return item; + } + + */ +/** + * Gets the product. + * @return The product. + *//* + + public Item getProduct() { + return product; + } + + */ +/** + * Gets the level. + * @return The level. + *//* + + public int getLevel() { + return level; + } + + */ +/** + * Gets the experience. + * @return The experience. + *//* + + public double getExperience() { + return experience; + } + + */ +/** + * Method used to get the animation. + * @return the animation. + *//* + + public Animation getAnimation() { + return animation; + } + + */ +/** + * Method used to get the string bow for the item. + * @param item the item. + * @return the string bow. + *//* + + public static StringCross forItem(final Item item) { + for (StringCross bw : StringCross.values()) { + if (bw.getItem().getId() == item.getId()) { + return bw; + } + } + return null; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/darts/Dart.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/darts/Dart.java new file mode 100644 index 000000000..ac19b5a75 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/darts/Dart.java @@ -0,0 +1,96 @@ +package core.game.node.entity.skill.fletching.items.darts; + +import core.game.node.item.Item; + +/** + * Represents the enum to hold dart info. + * @author 'Vexia + */ +public enum Dart { + BRONZE_DART(new Item(819), new Item(806), 1, 1.8), + IRON_DART(new Item(820), new Item(807), 22, 3.8), + STEEL_DART(new Item(821), new Item(808), 37, 7.5), + MITHRIL_DART(new Item(822), new Item(809), 52, 11.2), + ADAMANT_DART(new Item(823), new Item(810), 67, 15), + RUNE_DART(new Item(824), new Item(811), 81, 18.8), + DRAGON_DART(new Item(11232), new Item(11230), 95, 25); + /** + * Constructs a new {@code Dart} {@code Object}. + * @param item the item. + * @param product the product. + * @param level the level. + * @param experience the experience. + */ + Dart(final Item item, final Item product, final int level, final double experience) { + this.item = item; + this.product = product; + this.level = level; + this.experience = experience; + } + + /** + * Represents the item required. + */ + private final Item item; + + /** + * Represents the product gained. + */ + private final Item product; + + /** + * Represents the level required. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Gets the item. + * @return The item. + */ + public Item getItem() { + return item; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Method used to get the dart for the item. + * @param item the item. + * @return the dart. + */ + public static Dart forItem(final Item item) { + for (Dart dart : Dart.values()) { + if (dart.getItem().getId() == item.getId()) { + return dart; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/darts/DartPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/darts/DartPulse.java new file mode 100644 index 000000000..e1d66b501 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/darts/DartPulse.java @@ -0,0 +1,98 @@ +package core.game.node.entity.skill.fletching.items.darts; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.fletching.Fletching; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the dart pulse. + * @author ceikry + */ +public final class DartPulse extends SkillPulse { + + /** + * Represents the feather item. + */ + private static final Item FEATHER = new Item(314); + + /** + * Represents the dart. + */ + private final Fletching.Darts dart; + + /** + * Represents the sets to make. + */ + private int sets; + + /** + * Constructs a new {@code DartPulse.java} {@code Object}. + * @param player the player. + * @param node the node. + */ + public DartPulse(Player player, Item node, Fletching.Darts dart, int sets) { + super(player, node); + this.dart = dart; + this.sets = sets; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.FLETCHING) < dart.level) { + player.getDialogueInterpreter().sendDialogue("You need a fletching level of " + dart.level + " to do this."); + return false; + } + if (!player.getQuestRepository().isComplete("The Tourist Trap")){ + player.getDialogueInterpreter().sendDialogue("You need to have completed Tourist Trap to fletch darts."); + return false; + } + return true; + } + + @Override + public void animate() { + + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + super.setDelay(3); + } + final Item unfinished = dart.getUnfinished(); + final int dartAmount = player.getInventory().getAmount(unfinished); + final int featherAmount = player.getInventory().getAmount(FEATHER); + if (dartAmount >= 10 && featherAmount >= 10) { + FEATHER.setAmount(10); + unfinished.setAmount(10); + player.getPacketDispatch().sendMessage("You attach feathers to 10 darts."); + } else { + int amount = featherAmount > dartAmount ? dartAmount : featherAmount; + FEATHER.setAmount(amount); + unfinished.setAmount(amount); + player.getPacketDispatch().sendMessage(amount == 1 ? "You attach a feather to a dart." : "You attach feathers to " + amount + " darts."); + } + if (player.getInventory().remove(FEATHER, unfinished)) { + Item product = dart.getFinished(); + product.setAmount(FEATHER.getAmount()); + player.getSkills().addExperience(Skills.FLETCHING, dart.experience * product.getAmount(), true); + player.getInventory().add(product); + } + FEATHER.setAmount(1); + if (!player.getInventory().containsItem(FEATHER)) { + return true; + } + if (!player.getInventory().containsItem(dart.getUnfinished())) { + return true; + } + sets--; + return sets == 0; + } + + @Override + public void message(int type) { + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/Gem.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/Gem.java new file mode 100644 index 000000000..feeb7c5e4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/Gem.java @@ -0,0 +1,101 @@ +package core.game.node.entity.skill.fletching.items.gem; + +import core.game.node.item.Item; + +/** + * Represents gems to cut into bolt tips. + * @author 'Vexia + * @date 01/12/2013 + */ +public enum Gem { + OPAL(new Item(1609), new Item(45, 12), 11, 1.5), + JADE(new Item(1611), new Item(9187, 12), 26, 2.4), + RED_TOPAZ(new Item(1613), new Item(9188, 12), 48, 3.9), + SAPPHIRE(new Item(1607), new Item(9189, 12), 56, 4), + EMERALD(new Item(1605), new Item(9190, 12), 58, 5.5), + RUBY(new Item(1603), new Item(9191, 12), 63, 6.3), + DIAMOND(new Item(1601), new Item(9192, 12), 65, 7), + DRAGONSTONE(new Item(1615), new Item(9193, 12), 71, 8.2), + ONYX(new Item(6573), new Item(9194, 24), 73, 9.4); + + /** + * Constructs a new {@code Gem.java} {@code Object}. + * @param gem the gem. + * @param bolt the bolt. + * @param level the level. + * @param experience the experience. + */ + Gem(Item gem, Item bolt, int level, double experience) { + this.gem = gem; + this.bolt = bolt; + this.level = level; + this.experience = experience; + } + + /** + * Represents the gem. + */ + private final Item gem; + + /** + * Represents the bolt. + */ + private final Item bolt; + + /** + * Represents the level required. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Gets the gem. + * @return The gem. + */ + public Item getGem() { + return gem; + } + + /** + * Gets the bolt. + * @return The bolt. + */ + public Item getBolt() { + return bolt; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Method used to get a gem for the item. + * @param item the item. + * @return the gem. + */ + public static Gem forItem(final Item item) { + for (Gem gem : values()) { + if (gem.getGem().getId() == item.getId()) { + return gem; + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBolt.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBolt.java new file mode 100644 index 000000000..b21e6a164 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBolt.java @@ -0,0 +1,144 @@ +/* +package core.game.node.entity.skill.fletching.items.gem; + +import org.crandor.game.node.item.Item; + +*/ +/** + * Represents a gem bolt. + * @author 'Vexia + * @date 01/12/2013 + *//* + +public enum GemBolt { + OPAL(new Item(877, 10), new Item(45, 10), new Item(879, 10), 11, 1.5), + PEARL(new Item(9140, 10), new Item(46, 10), new Item(880, 10), 41, 3.2), + JADE(new Item(9139, 10), new Item(9187, 10), new Item(9335, 10), 26, 2.4), + RED_TOPAZ(new Item(9141, 10), new Item(9188, 10), new Item(9336, 10), 48, 3.9), + SAPPHIRE(new Item(9142, 10), new Item(9189, 10), new Item(9337, 10), 56, 4), + EMERALD(new Item(9142, 10), new Item(9190, 10), new Item(9338, 10), 58, 5.5), + RUBY(new Item(9143, 10), new Item(9191, 10), new Item(9339, 10), 63, 6.3), + DIAMOND(new Item(9143, 10), new Item(9192, 10), new Item(9340, 10), 65, 7), + DRAGONSTONE(new Item(9144, 10), new Item(9193, 10), new Item(9341, 10), 71, 8.2), + ONYX(new Item(9144, 10), new Item(9194, 10), new Item(9342, 10), 73, 9.4); + + */ +/** + * Constructs a new {@code GemBolt} {@code Object}. + * @param base the base. + * @param tip the tip. + * @param level the level. + * @param experience the experience. + *//* + + GemBolt(Item base, Item tip, Item product, int level, double experience) { + this.base = base; + this.tip = tip; + this.product = product; + this.level = level; + this.experience = experience; + } + + */ +/** + * Represents the base item. + *//* + + private final Item base; + + */ +/** + * Represents the tip to attach. + *//* + + private final Item tip; + + */ +/** + * Represents the product. + *//* + + private final Item product; + + */ +/** + * Represents the level. + *//* + + private final int level; + + */ +/** + * Represents the experience. + *//* + + private final double experience; + + */ +/** + * Gets the base. + * @return The base. + *//* + + public Item getBase() { + return base; + } + + */ +/** + * Gets the tip. + * @return The tip. + *//* + + public Item getTip() { + return tip; + } + + */ +/** + * Gets the product. + * @return The product. + *//* + + public Item getProduct() { + return product; + } + + */ +/** + * Gets the level. + * @return The level. + *//* + + public int getLevel() { + return level; + } + + */ +/** + * Gets the experience. + * @return The experience. + *//* + + public double getExperience() { + return experience; + } + + */ +/** + * Method used to get the gem bolt from the id. + * @param boltt the boltt. + * @param tip the tip. + * @return the bolt. + *//* + + public static GemBolt forItems(final Item boltt, final Item tip) { + for (GemBolt bolt : values()) { + if (bolt.getBase().getId() == boltt.getId() && bolt.getTip().getId() == tip.getId() || bolt.getBase().getId() == tip.getId() && bolt.getTip().getId() == boltt.getId()) { + return bolt; + } + } + return null; + } +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse.kt b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse.kt new file mode 100644 index 000000000..69265af8d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBoltCutPulse.kt @@ -0,0 +1,68 @@ +package core.game.node.entity.skill.fletching.items.gem + +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.tools.Items +import core.game.node.entity.skill.fletching.Fletching.GemBolts +import core.game.node.entity.skill.SkillPulse +import core.game.node.entity.skill.Skills + +/** + * Represents the gem cutting pulse(gem to bolt). + * @author Ceikry + */ +class GemBoltCutPulse +/** + * Constructs a new `GemCutPulse.java` `Object`. + * @param player the player. + * @param node the node. + * @param amount the amount. + */(player: Player?, node: Item?, + /** + * Represents the gem we're cutting. + */ + private val gem: GemBolts, + /** + * Represents the amount to make. + */ + private var amount: Int) : SkillPulse(player, node) { + /** + * Represents the ticks passed. + */ + private var ticks = 0 + + override fun checkRequirements(): Boolean { + if (player.skills.getLevel(Skills.FLETCHING) < gem.level) { + player.dialogueInterpreter.sendDialogue("You need a Fletching level of " + gem.level + " or above to do that.") + return false + } + return player.inventory.containsItem(Item(gem.gem)) + } + + override fun animate() { + if (ticks % 6 == 0) { + player.animate(ANIMATION) + } + } + + override fun reward(): Boolean { + if (++ticks % 5 != 0) { + return false + } + val reward = if (gem.gem == Items.OYSTER_PEARLS_413) Item(gem.tip, 24) else Item(gem.tip, 12) + if (player.inventory.remove(Item(gem.gem))) { + player.inventory.add(reward) + player.skills.addExperience(Skills.FLETCHING, gem.experience, true) + } + amount-- + return amount <= 0 + } + + companion object { + /** + * Represents the cutting animation. + */ + private val ANIMATION = Animation(6702) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBoltPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBoltPulse.java new file mode 100644 index 000000000..fa9713361 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/gem/GemBoltPulse.java @@ -0,0 +1,87 @@ +package core.game.node.entity.skill.fletching.items.gem; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.fletching.Fletching; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the attaching of a gem bolt to a premade bolt. + * @author Ceikry + */ +public final class GemBoltPulse extends SkillPulse { + + /** + * Represents the gem bolt being made. + */ + private Fletching.GemBolts bolt; + + /** + * Represents the sets to make. + */ + private int sets = 0; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code GemBoltPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param sets the sets. + */ + public GemBoltPulse(Player player, Item node, Fletching.GemBolts bolt, int sets) { + super(player, node); + this.bolt = bolt; + this.sets = sets; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.FLETCHING) < bolt.level) { + player.getDialogueInterpreter().sendDialogue("You need a Fletching level of " + bolt.level + " or above to do that."); + return false; + } + if (!player.getInventory().containsItem(new Item(bolt.base)) || !player.getInventory().containsItem(new Item(bolt.tip))) { + return false; + } + return true; + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + if (++ticks % 3 != 0) { + return false; + } + int baseAmount = player.getInventory().getAmount(bolt.base); + int tipAmount = player.getInventory().getAmount(bolt.tip); + Item base = new Item(bolt.base); + Item tip = new Item(bolt.tip); + Item product = new Item(bolt.product); + if(baseAmount >= 10 && tipAmount >= 10){ + base.setAmount(10); + tip.setAmount(10); + product.setAmount(10); + } else { + int amount = baseAmount > tipAmount ? tipAmount : baseAmount; + base.setAmount(amount); + tip.setAmount(amount); + product.setAmount(amount); + } + if (player.getInventory().remove(base,tip)) { + player.getInventory().add(product); + player.getSkills().addExperience(Skills.FLETCHING, bolt.experience * product.getAmount(), true); + player.getPacketDispatch().sendMessage(product.getAmount() == 1 ? "You attach the tip to the bolt." : "You fletch " + product.getAmount() + " bolts."); + } + sets--; + return sets <= 0; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/grapple/GrapplePulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/grapple/GrapplePulse.java new file mode 100644 index 000000000..03969803b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/grapple/GrapplePulse.java @@ -0,0 +1,85 @@ +package core.game.node.entity.skill.fletching.items.grapple; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the skill pulse used to create a mith grapple. + * @author 'Vexia + * @date 21/12/2013 + */ +public final class GrapplePulse extends SkillPulse { + + /** + * Represents the mith grapple tip. + */ + private static final Item MITH_GRAPPLE = new Item(9418); + + /** + * Represents the mithril grapple tio. + */ + private static final Item GRAPPLE_TIP = new Item(9416); + + /** + * Represents the mithril bolt. + */ + private static final Item MITHRIL_BOLT = new Item(9142); + + /** + * Represents the amount of the grapple to make. + */ + private int amount; + + /** + * Constructs a new {@code GrapplePulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param amount the amount. + */ + public GrapplePulse(Player player, Item node, int amount) { + super(player, node); + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + int inventoryAmount = player.getInventory().getAmount(GRAPPLE_TIP); + if (amount > inventoryAmount) { + amount = inventoryAmount; + } + if (!player.getInventory().containsItem(GRAPPLE_TIP) || !player.getInventory().containsItem(MITHRIL_BOLT)) { + return false; + } + if (player.getSkills().getLevel(Skills.FLETCHING) < 59) { + player.getDialogueInterpreter().sendDialogue("You need a fletching level of at least 59 in order to do this."); + return false; + } + return true; + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + setDelay(3); + return false; + } + if (player.getInventory().remove(GRAPPLE_TIP) && player.getInventory().remove(MITHRIL_BOLT)) { + player.getInventory().add(MITH_GRAPPLE); + player.getSkills().addExperience(Skills.FLETCHING, 5, true); + } + amount--; + return amount < 1; + } + + @Override + public void message(int type) { + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/package-info.java b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/package-info.java new file mode 100644 index 000000000..17b72ab37 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/fletching/items/package-info.java @@ -0,0 +1,5 @@ +/** + * @author Adam + * + */ +package core.game.node.entity.skill.fletching.items; \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/gather/GatheringSkillOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/gather/GatheringSkillOptionPlugin.java new file mode 100644 index 000000000..27e93429b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/gather/GatheringSkillOptionPlugin.java @@ -0,0 +1,39 @@ +package core.game.node.entity.skill.gather; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.gather.mining.MiningSkillPulse; +import core.game.node.entity.skill.gather.woodcutting.WoodcuttingSkillPulse; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the gathering skill option handler plugin. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class GatheringSkillOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("chop-down", this); + ObjectDefinition.setOptionHandler("chop down", this); + ObjectDefinition.setOptionHandler("cut down", this); + ObjectDefinition.setOptionHandler("mine", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if(option.equals("mine")){ + player.getPulseManager().run(new MiningSkillPulse(player, node.asObject())); + } else { + player.getPulseManager().run(new WoodcuttingSkillPulse(player, node.asObject())); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/gather/GatheringSkillPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/gather/GatheringSkillPulse.java new file mode 100644 index 000000000..5d1e76cbe --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/gather/GatheringSkillPulse.java @@ -0,0 +1,368 @@ +package core.game.node.entity.skill.gather; + +import core.cache.def.impl.ItemDefinition; +import core.game.container.impl.EquipmentContainer; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.BirdNest; +import core.game.content.global.SkillingPets; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Handles a gathering skill, such as woodcutting, mining, ... + * @author Emperor + */ +public final class GatheringSkillPulse extends SkillPulse { + + /** + * The gem rewards. + */ + private static final Item[] GEM_REWARDS = { new Item(1623), new Item(1621), new Item(1619), new Item(1617) }; + + /** + * Is the player is mining. + */ + private boolean isMining; + + /** + * Is the player is mining essence. + */ + private boolean isMiningEssence; + + /** + * Is the player is mining gems. + */ + private boolean isMiningGems; + + /** + * Is the player is woodcutting. + */ + private boolean isWoodcutting; + + /** + * The amount of ticks it takes to get a log. + */ + private int ticks; + + /** + * Constructs a new {@code GatheringSkillPulse} {@code Object}. + * @param player The player. + * @param node The gathering resource. + */ + public GatheringSkillPulse(Player player, GameObject node) { + super(player, node); + } + + @Override + public void start() { + resource = SkillingResource.forId( + node.getId()); + if (SkillingResource.isEmpty(node.getId())) { + player.getPacketDispatch().sendMessage("This rock contains no ore."); + return; + } + if (resource == null) { + return; + } + if (TutorialSession.getExtension(player).getStage() == 35) { + TutorialStage.load(player, 36, false); + } + isMining = resource.getSkillId() == Skills.MINING; + isMiningEssence = resource == SkillingResource.RUNE_ESSENCE; + isMiningGems = resource.getReward() == SkillingResource.GEM_ROCK_0.getReward(); + isWoodcutting = resource.getSkillId() == Skills.WOODCUTTING; + super.start(); + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(resource.getSkillId()) < resource.getLevel()) { + player.getPacketDispatch().sendMessage("You need a " + Skills.SKILL_NAME[resource.getSkillId()] + " level of " + resource.getLevel() + " to " + (isMining ? "mine this rock." : "cut this tree.")); + return false; + } + if (setTool() == null) { + player.getPacketDispatch().sendMessage("You do not have a" + (isMining ? " pickaxe" : "n axe") + " to use."); + return false; + } + if (player.getInventory().freeSlots() < 1) { + player.getDialogueInterpreter().sendDialogue("Your inventory is too full to hold any more " + ItemDefinition.forId(resource.getReward()).getName().toLowerCase() + "."); + return false; + } + return true; + } + + @Override + public void animate() { + if (resource.getAnimation() != null) { + player.animate(resource.getAnimation()); + } else if (tool.getAnimation() != null) { + player.animate(tool.getAnimation()); + } + } + + @Override + public boolean reward() { + if (++ticks % (isMiningEssence ? 3 : 4) != 0) { + return false; + } + if (node.getId() == 10041) { + player.getDialogueInterpreter().sendDialogues(2574, FacialExpression.FURIOUS, RandomFunction.random(2) == 1 ? "You'll blow my cover! I'm meant to be hidden!" : "Will you stop that?"); + return true; + } + if (!checkReward()) { + return false; + } + int tutorialStage = TutorialSession.getExtension(player).getStage(); + if (tutorialStage == 36 && node.getId() == 3042) { + TutorialStage.load(player, 38, false); + } else if (tutorialStage == 36 && node.getId() == 3043) { + TutorialStage.load(player, 37, false); + } + if (tutorialStage == 38 && node.getId() == 3043) { + TutorialStage.load(player, 39, false); + } else if (tutorialStage == 37 && node.getId() == 3042) { + TutorialStage.load(player, 39, false); + } + // If player is in donator zone + if (isWoodcutting && player.getLocation().getRegionId() == 12102) { + player.getAntiMacroHandler().fireEvent("tree spirit"); + return true; + } + // 20% chance to auto burn logs when using "inferno adze" item + if (isWoodcutting && tool.getId() == 13661 && RandomFunction.random(100) < 20){ + player.sendMessage("Your chop some logs. The heat of the inferno adze incinerates them."); + Projectile.create(player, null, 1776, 35, 30, 20, 25).transform(player, new Location(player.getLocation().getX() + 2, player.getLocation().getY()), true, 25, 25).send(); + player.getSkills().addExperience(Skills.WOODCUTTING, resource.getExperience()); + player.getSkills().addExperience(Skills.FIREMAKING, resource.getExperience()); + return false; + } + int reward = resource.getReward(); + if (reward > 0) { + reward = calculateReward(reward); + applyAchievementTask(reward); + // Give the player the items + int rewardAmount = calculateRewardAmount(reward); + Item item = new Item(reward, rewardAmount); + player.getInventory().add(item); + // Apply the experience points + double experience = calculateExperience(reward, rewardAmount); + player.getSkills().addExperience(resource.getSkillId(), experience, true); + // Send a message to the player + if (isMiningGems) { + String gemName = ItemDefinition.forId(reward).getName().toLowerCase(); + player.sendMessage("You get " + (StringUtils.isPlusN(gemName) ? "an" : "a") + " " + gemName + "."); + } else if (resource == SkillingResource.DRAMEN_TREE) { + player.getPacketDispatch().sendMessage("You cut a branch from the Dramen tree."); + } else { + player.getPacketDispatch().sendMessage("You get some " + ItemDefinition.forId(reward).getName().toLowerCase() + "."); + } + // Calculate if the player should receive a bonus gem or bonus ore or both + if (!isMiningEssence && isMining) { + //check for bonus ore from shooting star buff + if(isMining && (player.getAttribute("SS Mining Bonus", GameWorld.getTicks()) > GameWorld.getTicks())){ + if(RandomFunction.getRandom(7) == 5) { + player.getPacketDispatch().sendMessage("...you manage to mine a second ore thanks to the Star Sprite."); + player.getInventory().add(item); + } + } + int chance = 282; + boolean altered = false; + if (new Item(player.getEquipment().getId(12)).getName().toLowerCase().contains("ring of wealth")) { + chance /= 1.5; + altered = true; + } + Item necklace = player.getEquipment().get(EquipmentContainer.SLOT_AMULET); + if (necklace != null && (necklace.getId() > 1705 && necklace.getId() < 1713)) { + chance /= 1.5; + altered = true; + } + if (RandomFunction.random(chance) == 0) { + Item gem = RandomFunction.getRandomElement(GEM_REWARDS); + player.getPacketDispatch().sendMessage("You find a " + gem.getName() + "!"); + if (!player.getInventory().add(gem, player)) { + player.getPacketDispatch().sendMessage("You do not have enough space in your inventory, so you drop the gem on the floor."); + } + } + } + // Calculate if the player should receive a bonus birds nest + if (isWoodcutting) { + int chance = 282; + if (RandomFunction.random(chance) == 0) { + BirdNest.drop(player); + } + } + } + // Tutorial stuff, maybe? + if (tutorialStage == 7) { + TutorialStage.load(player, 8, false); + } + // not sure what this is exactly + if (resource.getRespawnRate() != 0) { + int charge = 1000 / resource.getRewardAmount(); + node.setCharge(node.getCharge() - RandomFunction.random(charge, charge << 2)); + if (node.getCharge() < 1) { + node.setCharge(1000); +// if (resource.isFarming()) { +// PatchWrapper tree = player.getFarmingManager().getPatchWrapper(node.getWrapper().getId()); +// tree.addConfigValue(tree.getNode().getStumpBase()); +// tree.getCycle().setGrowthTime(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(resource.getRespawnDuration() + 10)); +// return true; +// } + if (resource.getEmptyId() > -1) { + ObjectBuilder.replace(node, node.transform(resource.getEmptyId()), resource.getRespawnDuration()); + } else { + ObjectBuilder.replace(node, node.transform(0), resource.getRespawnDuration()); + } + node.setActive(false); + return true; + } + } + return false; + } + + /** + * Checks if the has completed any achievements from their diary + */ + private void applyAchievementTask(int reward) { + } + + /** + * Checks if the player gets rewarded. + * @return {@code True} if so. + */ + private boolean checkReward() { + int skill = isMining ? Skills.MINING : Skills.WOODCUTTING; + int level = 1 + player.getSkills().getLevel(skill) + player.getFamiliarManager().getBoost(skill); + double hostRatio = Math.random() * (100.0 * resource.getRate()); + double clientRatio = Math.random() * ((level - resource.getLevel()) * (1.0 + tool.getRatio())); + return hostRatio < clientRatio; + } + + private int calculateReward(int reward) { + // If the player is mining sandstone or granite, then i'm not sure what this does? + if (resource == SkillingResource.SANDSTONE || resource == SkillingResource.GRANITE) { + int value = RandomFunction.randomize(resource == SkillingResource.GRANITE ? 3 : 4); + reward += value << 1; + player.getSkills().addExperience(resource.getSkillId(), value * 10, true); + } + + // If the player is mining clay + else if (reward == SkillingResource.CLAY_0.getReward()) { + // Check if they have a bracelet of clay equiped + if (player.getEquipment().contains(11074, 1)) { + player.getSavedData().getGlobalData().incrementBraceletOfClay(); + if (player.getSavedData().getGlobalData().getBraceletClayUses() >= 28) { + player.getSavedData().getGlobalData().setBraceletClayUses(0); + player.getEquipment().remove(new Item(11074)); + player.sendMessage("Your bracelet of clay has disinegrated."); + } + // Give soft clay + reward = 1761; + } + } + + // Convert rune essence to pure essence if the player is above level 30 mining + else if (isMiningEssence && player.getSkills().getLevel(Skills.MINING) >= 30) { + reward = 7936; + } + + // Calculate a random gem for the player + else if (isMiningGems) { + int random = RandomFunction.random(100); + List gems = new ArrayList<>(); + if (random < 2) { + gems.add(1617); + } else if (random < 25) { + gems.add(1619); + gems.add(1623); + gems.add(1621); + } else if (random < 40) { + gems.add(1629); + } else { + gems.add(1627); + gems.add(1625); + } + reward = gems.get(RandomFunction.random(gems.size())); + } + + return reward; + } + + /** + * Calculate the total amount of items the player should receive + * @return amount of items + */ + private int calculateRewardAmount(int reward) { + int amount = 1; + + // 3239: Hollow tree (bark) 10% chance of obtaining + if (reward == 3239 && RandomFunction.random(100) >= 10) { + amount = 0; + } + + SkillingPets.checkPetDrop(player, isMining ? SkillingPets.GOLEM : SkillingPets.BEAVER); + + return amount; + } + + /** + * Calculate the total experience the player should receive + * @return amount of experience + */ + private double calculateExperience(int reward, int amount) { + double experience = resource.getExperience(); + + // Bark + if (reward == 3239) { + // If we receive the item, give the full experience points otherwise give the base amount + if (amount >= 1) { + experience = 275.2; + } else { + amount = 1; + } + } + + return experience * amount; + } + + + @Override + public void message(int type) { + switch (type) { + case 0: + player.getPacketDispatch().sendMessage("You swing your " + (isMining ? "pickaxe at the rock..." : "axe at the tree...")); + if (TutorialSession.getExtension(player).getStage() == 6) { + player.lock(7); + TutorialStage.load(player, 7, false); + } + break; + } + } + + /** + * Sets the tool used. + */ + private SkillingTool setTool() { + if (!isMining) { + tool = SkillingTool.getHatchet(player); + } else { + tool = SkillingTool.getPickaxe(player); + } + return tool; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/gather/PickaxeRepairPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/gather/PickaxeRepairPlugin.kt new file mode 100644 index 000000000..9f4398944 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/gather/PickaxeRepairPlugin.kt @@ -0,0 +1,42 @@ +package core.game.node.entity.skill.gather + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin + +/** + * Repairs pickaxes after being broken + * @author Ceikry + */ +@Initializable +class PickaxeRepairPlugin : UseWithHandler(480,482,484,486,488,490){ + override fun newInstance(arg: Any?): Plugin { + addHandler(466, ITEM_TYPE,this) + return this + } + + override fun handle(event: NodeUsageEvent?): Boolean { + event ?: return false + val used = event.used + + val product = + when(used.id){ + 480 -> 1265 + 482 -> 1267 + 484 -> 1269 + 488 -> 1271 + 486 -> 1273 + 490 -> 1275 + else -> 0 + } + event.player.inventory.remove(Item(466)) + event.player.inventory.remove(used.asItem()) + event.player.inventory.add(Item(product)) + event.player.sendMessage("You carefully reattach the head to the handle.") + event.player.audioManager.send(10) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/gather/SkillingResource.java b/Server/src/main/java/Server/core/game/node/entity/skill/gather/SkillingResource.java new file mode 100644 index 000000000..36d3554d9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/gather/SkillingResource.java @@ -0,0 +1,917 @@ +package core.game.node.entity.skill.gather; + +import core.ServerConstants; +import core.game.node.entity.skill.Skills; +import core.game.system.SystemLogger; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents a skill resource. + * @author Emperor + */ +public enum SkillingResource { + + /** + * Standard tree (Woodcutting). + */ + STANDARD_TREE_1(1276, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_2(1277, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1343, Skills.WOODCUTTING), + STANDARD_TREE_3(1278, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_4(1279, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1345, Skills.WOODCUTTING), + STANDARD_TREE_5(1280, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1343, Skills.WOODCUTTING), + STANDARD_TREE_6(1330, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1341, Skills.WOODCUTTING), + STANDARD_TREE_7(1331, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1341, Skills.WOODCUTTING), + STANDARD_TREE_8(1332, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1341, Skills.WOODCUTTING), + STANDARD_TREE_9(2409, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_10(3033, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1345, Skills.WOODCUTTING), + STANDARD_TREE_11(3034, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1345, Skills.WOODCUTTING), + STANDARD_TREE_12(3035, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1347, Skills.WOODCUTTING), + STANDARD_TREE_13(3036, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1351, Skills.WOODCUTTING), + STANDARD_TREE_14(3879, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 3880, Skills.WOODCUTTING), + STANDARD_TREE_15(3881, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 3880, Skills.WOODCUTTING), + STANDARD_TREE_16(3882, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 3880, Skills.WOODCUTTING), + STANDARD_TREE_17(3883, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 3884, Skills.WOODCUTTING), + STANDARD_TREE_18(10041, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_19(14308, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_20(14309, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_21(16264, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_22(16265, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_23(30132, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_24(30133, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_25(37477, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 1342, Skills.WOODCUTTING), + STANDARD_TREE_26(37478, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 37653, Skills.WOODCUTTING), + STANDARD_TREE_27(37652, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "tree", null, 37653, Skills.WOODCUTTING), + + /** + * Fruit trees. + */ + APPLE_TREE(7941, 1, 0.05, 50 | 100 << 16, 25.0, -1, 1, "tree", null, 37653, Skills.WOODCUTTING, true), + BANANA_TREE(8000, 1, 0.05, 50 | 100 << 16, 25.0, -1, 1, "tree", null, 37653, Skills.WOODCUTTING, true), + ORANGE_TREE(8057, 1, 0.05, 50 | 100 << 16, 25.0, -1, 1, "tree", null, 37653, Skills.WOODCUTTING, true), + CURRY_TREE(8026, 1, 0.05, 50 | 100 << 16, 25.0, -1, 1, "tree", null, 37653, Skills.WOODCUTTING, true), + PINEAPPLE_TREE(7972, 1, 0.05, 50 | 100 << 16, 25.0, -1, 1, "tree", null, 37653, Skills.WOODCUTTING, true), + PAPAYA_TREE(8111, 1, 0.05, 50 | 100 << 16, 25.0, -1, 1, "tree", null, 37653, Skills.WOODCUTTING, true), + PALM_TREE(8084, 1, 0.05, 50 | 100 << 16, 25.0, -1, 1, "tree", null, 37653, Skills.WOODCUTTING, true), + + /** + * Dead tree (Woodcutting). + */ + DEAD_TREE_1(1282, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1347, Skills.WOODCUTTING), + DEAD_TREE_2(1283, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1347, Skills.WOODCUTTING), + DEAD_TREE_3(1284, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1348, Skills.WOODCUTTING), + DEAD_TREE_4(1285, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1349, Skills.WOODCUTTING), + DEAD_TREE_5(1286, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1351, Skills.WOODCUTTING), + DEAD_TREE_6(1289, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1353, Skills.WOODCUTTING), + DEAD_TREE_7(1290, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1354, Skills.WOODCUTTING), + DEAD_TREE_8(1291, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 23054, Skills.WOODCUTTING), + DEAD_TREE_9(1365, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1352, Skills.WOODCUTTING), + DEAD_TREE_10(1383, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1358, Skills.WOODCUTTING), + DEAD_TREE_11(1384, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1359, Skills.WOODCUTTING), + DEAD_TREE_12(5902, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1347, Skills.WOODCUTTING), + DEAD_TREE_13(5903, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1353, Skills.WOODCUTTING), + DEAD_TREE_14(5904, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1353, Skills.WOODCUTTING), + DEAD_TREE_15(32294, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1353, Skills.WOODCUTTING), + DEAD_TREE_16(37481, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1347, Skills.WOODCUTTING), + DEAD_TREE_17(37482, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1351, Skills.WOODCUTTING), + DEAD_TREE_18(37483, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dead tree", null, 1358, Skills.WOODCUTTING), + DEAD_TREE_19(24168, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "dying tree", null, 24169, Skills.WOODCUTTING), + + /** + * Dramen tree (Woodcutting/Lost city quest). + */ + DRAMEN_TREE(1292, 1, 0.05, -1, 25.0, 771, Integer.MAX_VALUE, "dramen tree", null, -1, Skills.WOODCUTTING), + + /** + * Evergreen (Woodcutting). + */ + EVERGREEN_1(1315, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "evergreen", null, 1342, Skills.WOODCUTTING), + EVERGREEN_2(1316, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "evergreen", null, 1355, Skills.WOODCUTTING), + EVERGREEN_3(1318, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "evergreen", null, 1355, Skills.WOODCUTTING), + EVERGREEN_4(1319, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 1, "evergreen", null, 1355, Skills.WOODCUTTING), + + /** + * Jungle tree (Woodcutting). + */ + JUNGLE_TREE_1(2887, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 2, "jungle tree", null, 0, Skills.WOODCUTTING), + JUNGLE_TREE_2(2889, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 2, "jungle tree", null, 0, Skills.WOODCUTTING), + JUNGLE_TREE_3(2890, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 2, "jungle tree", null, 0, Skills.WOODCUTTING), + JUNGLE_TREE_4(4818, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 2, "jungle tree", null, 0, Skills.WOODCUTTING), + JUNGLE_TREE_5(4820, 1, 0.05, 50 | 100 << 16, 25.0, 1511, 2, "jungle tree", null, 0, Skills.WOODCUTTING), + + JUNGLE_BUSH_1(2892, 1, 0.15, 50 | 100 << 16, 100.0, 1511, 1, "jungle bush", null, 2894, Skills.WOODCUTTING), + JUNGLE_BUSH_2(2893, 1, 0.15, 50 | 100 << 16, 100.0, 1511, 1, "jungle bush", null, 2895, Skills.WOODCUTTING), + + /** + * Achey tree (Woodcutting). + */ + ACHEY_TREE(2023, 1, 0.05, 50 | 100 << 16, 25.0, 2862, 1, "achey tree", null, 3371, Skills.WOODCUTTING), + + /** + * Oak tree (Woodcutting). + */ + OAK_TREE_1(1281, 15, 0.15, 14 | 22 << 16, 37.5, 1521, 10, "oak tree", null, 1356, Skills.WOODCUTTING), + OAK_TREE_2(3037, 15, 0.15, 14 | 22 << 16, 37.5, 1521, 10, "oak tree", null, 1357, Skills.WOODCUTTING), + OAK_TREE_3(37479, 15, 0.15, 14 | 22 << 16, 37.5, 1521, 10, "oak tree", null, 1356, Skills.WOODCUTTING), + OAK_TREE_4(8467, 15, 0.15, 14 | 22 << 16, 37.5, 1521, 10, "oak tree", null, 1356, Skills.WOODCUTTING, true), + + /** + * Willow tree (Woodcutting). + */ + WILLOW_TREE_1(1308, 30, 0.3, 14 | 22 << 16, 67.8, 1519, 20, "willow tree", null, 7399, Skills.WOODCUTTING), + WILLOW_TREE_2(5551, 30, 0.3, 14 | 22 << 16, 67.8, 1519, 20, "willow tree", null, 5554, Skills.WOODCUTTING), + WILLOW_TREE_3(5552, 30, 0.3, 14 | 22 << 16, 67.8, 1519, 20, "willow tree", null, 5554, Skills.WOODCUTTING), + WILLOW_TREE_4(5553, 30, 0.3, 14 | 22 << 16, 67.8, 1519, 20, "willow tree", null, 5554, Skills.WOODCUTTING), + WILLOW_TREE_5(37480, 30, 0.3, 14 | 22 << 16, 67.8, 1519, 20, "willow tree", null, 7399, Skills.WOODCUTTING), + WILLOW_TREE_6(8488, 30, 0.3, 14 | 22 << 16, 67.8, 1519, 20, "willow tree", null, 7399, Skills.WOODCUTTING, true), + + /** + * Teak (Woodcutting). + */ + TEAK_1(9036, 35, 0.7, 35 | 60 << 16, 85.0, 6333, 25, "teak", null, 9037, Skills.WOODCUTTING), + TEAK_2(15062, 35, 0.7, 35 | 60 << 16, 85.0, 6333, 25, "teak", null, 9037, Skills.WOODCUTTING), + + /** + * Maple tree (Woodcutting). + */ + MAPLE_TREE_1(1307, 45, 0.65, 58 | 100 << 16, 100.0, 1517, 30, "maple tree", null, 7400, Skills.WOODCUTTING), + MAPLE_TREE_2(4674, 45, 0.65, 58 | 100 << 16, 100.0, 1517, 30, "maple tree", null, 7400, Skills.WOODCUTTING), + MAPLE_TREE_3(8444, 45, 0.65, 58 | 100 << 16, 100.0, 1517, 30, "maple tree", null, 7400, Skills.WOODCUTTING, true), + + /** + * Hollow tree (Woodcutting). + */ + HOLLOW_TREE_1(2289, 45, 0.6, 58 | 100 << 16, 82.5, 3239, 30, "hollow tree", null, 2310, Skills.WOODCUTTING), + HOLLOW_TREE_2(4060, 45, 0.6, 58 | 100 << 16, 82.5, 3239, 30, "hollow tree", null, 4061, Skills.WOODCUTTING), + + /** + * Mahogany (Woodcutting). + */ + MAHOGANY(9034, 50, 0.7, 62 | 115 << 16, 125.0, 6332, 35, "mahogany", null, 9035, Skills.WOODCUTTING), + + /** + * Arctic pine (Woodcutting). + */ + ARCTIC_PINE(21273, 54, 0.73, 75 | 130 << 16, 140.2, 10810, 35, "arctic pine", null, 21274, Skills.WOODCUTTING), + + /** + * Eucalyptus tree (Woodcutting). + */ + EUCALYPTUS_1(28951, 58, 0.77, 80 | 140 << 16, 165.0, 12581, 35, "eucalyptus tree", null, 28954, Skills.WOODCUTTING), + EUCALYPTUS_2(28952, 58, 0.77, 80 | 140 << 16, 165.0, 12581, 35, "eucalyptus tree", null, 28955, Skills.WOODCUTTING), + EUCALYPTUS_3(28953, 58, 0.77, 80 | 140 << 16, 165.0, 12581, 35, "eucalyptus tree", null, 28956, Skills.WOODCUTTING), + + /** + * Yew tree (Woodcutting). + */ + YEW(1309, 60, 0.8, 100 | 162 << 16, 175.0, 1515, 40, "yew", null, 7402, Skills.WOODCUTTING), + YEW_1(8513, 60, 0.8, 100 | 162 << 16, 175.0, 1515, 40, "yew", null, 7402, Skills.WOODCUTTING, true), + + /** + * Magic tree (Woodcutting). + */ + MAGIC_TREE_1(1306, 75, 0.9, 200 | 317 << 16, 250.0, 1513, 50, "magic tree", null, 7401, Skills.WOODCUTTING), + MAGIC_TREE_2(37823, 75, 0.9, 200 | 317 << 16, 250.0, 1513, 50, "magic tree", null, 37824, Skills.WOODCUTTING), + MAGIC_TREE_3(8409, 75, 0.9, 200 | 317 << 16, 250.0, 1513, 50, "magic tree", null, 37824, Skills.WOODCUTTING, true), + + CURSED_MAGIC_TREE(37821, 82, 0.95, 200 | 317 << 16, 275.0, 1513, 50, "magic tree", null, 37822, Skills.WOODCUTTING), + + /** + * Copper ore (Mining). + */ + COPPER_ORE_0(2090, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 450, Skills.MINING), + COPPER_ORE_1(2091, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 452, Skills.MINING), + COPPER_ORE_2(4976, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 4994, Skills.MINING), + COPPER_ORE_3(4977, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 4995, Skills.MINING), + COPPER_ORE_4(4978, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 4996, Skills.MINING), + COPPER_ORE_5(9710, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 18954, Skills.MINING), + COPPER_ORE_6(9709, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 32448, Skills.MINING), + COPPER_ORE_7(9708, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 32447, Skills.MINING), + COPPER_ORE_8(11960, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 11555, Skills.MINING), + COPPER_ORE_9(11961, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 11556, Skills.MINING), + COPPER_ORE_10(11962, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 11557, Skills.MINING), + COPPER_ORE_11(11937, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 11553, Skills.MINING), + COPPER_ORE_12(11936, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 11552, Skills.MINING), + COPPER_ORE_13(11938, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 11554, Skills.MINING), + COPPER_ORE_14(12746, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 450, Skills.MINING), + COPPER_ORE_15(14906, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 14894, Skills.MINING), + COPPER_ORE_16(14907, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 14895, Skills.MINING), + COPPER_ORE_17(20448, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 20445, Skills.MINING), + COPPER_ORE_18(20451, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 20445, Skills.MINING), + COPPER_ORE_19(20446, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 20443, Skills.MINING), + COPPER_ORE_20(20447, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 20444, Skills.MINING), + COPPER_ORE_21(20408, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 20407, Skills.MINING), + COPPER_ORE_22(18993, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 19005, Skills.MINING), + COPPER_ORE_23(18992, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 19004, Skills.MINING), + COPPER_ORE_24(19007, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 19016, Skills.MINING), + COPPER_ORE_25(19006, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 19021, Skills.MINING), + COPPER_ORE_26(18991, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 19003, Skills.MINING), + COPPER_ORE_27(19008, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 19017, Skills.MINING), + COPPER_ORE_28(21285, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 21297, Skills.MINING), + COPPER_ORE_29(21284, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 21296, Skills.MINING), + COPPER_ORE_30(21286, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 21298, Skills.MINING), + COPPER_ORE_31(29231, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 29219, Skills.MINING), + COPPER_ORE_32(29230, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 29218, Skills.MINING), + COPPER_ORE_33(29232, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 29220, Skills.MINING), + COPPER_ORE_34(31082, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 37650, Skills.MINING), + COPPER_ORE_35(31081, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 37649, Skills.MINING), + COPPER_ORE_36(31080, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 37639, Skills.MINING), + COPPER_ORE_37(37647, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 37650, Skills.MINING), + COPPER_ORE_38(37646, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 37649, Skills.MINING), + COPPER_ORE_39(37645, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 37639, Skills.MINING), + COPPER_ORE_40(37637, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 37639, Skills.MINING), + COPPER_ORE_41(37688, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 21298, Skills.MINING), + COPPER_ORE_42(37686, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 21296, Skills.MINING), + COPPER_ORE_43(37687, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 21297, Skills.MINING), + COPPER_ORE_44(3042, 1, 0.05, 4 | 8 << 16, 17.5, 436, 1, "copper rocks", null, 450, Skills.MINING), + + /** + * Tin ore (Mining). + */ + TIN_ORE_0(2094, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 450, Skills.MINING), + TIN_ORE_1(2095, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 452, Skills.MINING), + TIN_ORE_2(3043, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 450, Skills.MINING), + TIN_ORE_3(4979, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 4994, Skills.MINING), + TIN_ORE_4(4980, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 4995, Skills.MINING), + TIN_ORE_5(4981, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 4996, Skills.MINING), + TIN_ORE_6(11957, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 11555, Skills.MINING), + TIN_ORE_7(11958, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 11556, Skills.MINING), + TIN_ORE_8(11959, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 11557, Skills.MINING), + TIN_ORE_9(11934, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 11553, Skills.MINING), + TIN_ORE_10(11935, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 11554, Skills.MINING), + TIN_ORE_11(11933, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 11552, Skills.MINING), + TIN_ORE_12(14902, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 14894, Skills.MINING), + TIN_ORE_13(14903, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 14895, Skills.MINING), + TIN_ORE_14(18995, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 19004, Skills.MINING), + TIN_ORE_15(18994, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 19003, Skills.MINING), + TIN_ORE_16(18996, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 19005, Skills.MINING), + TIN_ORE_17(19025, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 19016, Skills.MINING), + TIN_ORE_18(19024, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 19021, Skills.MINING), + TIN_ORE_19(19026, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 19017, Skills.MINING), + TIN_ORE_20(21293, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 21296, Skills.MINING), + TIN_ORE_21(21295, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 21298, Skills.MINING), + TIN_ORE_22(21294, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 21297, Skills.MINING), + TIN_ORE_23(29227, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 29218, Skills.MINING), + TIN_ORE_24(29229, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 29220, Skills.MINING), + TIN_ORE_25(29228, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 29219, Skills.MINING), + TIN_ORE_26(31079, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 37650, Skills.MINING), + TIN_ORE_27(31078, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 37649, Skills.MINING), + TIN_ORE_28(31077, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 37639, Skills.MINING), + TIN_ORE_29(37644, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 37650, Skills.MINING), + TIN_ORE_30(37643, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 37649, Skills.MINING), + TIN_ORE_31(37642, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 37639, Skills.MINING), + TIN_ORE_32(37638, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 37639, Skills.MINING), + TIN_ORE_33(37685, 1, 0.05, 4 | 8 << 16, 17.5, 438, 1, "tin rocks", null, 21298, Skills.MINING), + + /** + * Rune/Pure essence (Mining). + */ + RUNE_ESSENCE(2491, 1, 0.1, 1 | 1 << 16, 5.0, 1436, Integer.MAX_VALUE, "rune essence", null, -1, Skills.MINING), + + /** + * Clay (Mining). + */ + CLAY_0(2109, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 452, Skills.MINING), + CLAY_1(2108, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 450, Skills.MINING), + CLAY_2(9712, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 32448, Skills.MINING), + CLAY_3(9713, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 18954, Skills.MINING), + CLAY_4(9711, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 32447, Skills.MINING), + CLAY_5(10949, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 10945, Skills.MINING), + CLAY_6(11190, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 21297, Skills.MINING), + CLAY_7(11191, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 21298, Skills.MINING), + CLAY_8(11189, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 21296, Skills.MINING), + CLAY_9(12942, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 4995, Skills.MINING), + CLAY_10(12943, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 4996, Skills.MINING), + CLAY_11(12941, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 4994, Skills.MINING), + CLAY_12(14904, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 14894, Skills.MINING), + CLAY_13(14905, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 14895, Skills.MINING), + CLAY_14(15505, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 11557, Skills.MINING), + CLAY_15(15504, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 11556, Skills.MINING), + CLAY_16(15503, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 11555, Skills.MINING), + CLAY_17(20449, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 20443, Skills.MINING), + CLAY_18(20450, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 20444, Skills.MINING), + CLAY_19(20409, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 20407, Skills.MINING), + CLAY_20(32429, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 33400, Skills.MINING), + CLAY_21(32430, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 33401, Skills.MINING), + CLAY_22(32431, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 33402, Skills.MINING), + CLAY_23(31062, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 37639, Skills.MINING), + CLAY_24(31063, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 37649, Skills.MINING), + CLAY_25(31064, 1, 0.1, 1 | 1 << 16, 5.0, 434, 1, "clay", null, 37650, Skills.MINING), + + /** + * Limestone. + */ + LIMESTONE_0(4027, 10, 0.2, 10 | 20 << 16, 26.5, 3211, 1, "limestone", null, 12564, Skills.MINING), + LIMESTONE_1(4028, 10, 0.2, 10 | 20 << 16, 26.5, 3211, 1, "limestone", null, 12565, Skills.MINING), + LIMESTONE_2(4029, 10, 0.2, 10 | 20 << 16, 26.5, 3211, 1, "limestone", null, 12566, Skills.MINING), + LIMESTONE_3(4030, 10, 0.2, 10 | 20 << 16, 26.5, 3211, 1, "limestone", null, 12567, Skills.MINING), + + /** + * Blurite ore. + */ + BLURITE_ORE_0(33220, 10, 0.2, 10 | 20 << 16, 17.5, 668, 1, "blurite rocks", null, 33222, Skills.MINING), + BLURITE_ORE_1(33221, 10, 0.2, 10 | 20 << 16, 17.5, 668, 1, "blurite rocks", null, 33223, Skills.MINING), + + /** + * Iron ore. + */ + IRON_ORE_0(2092, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 450, Skills.MINING), + IRON_ORE_1(2093, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 452, Skills.MINING), + IRON_ORE_2(4982, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 4994, Skills.MINING), + IRON_ORE_3(4983, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 4995, Skills.MINING), + IRON_ORE_4(4984, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 4996, Skills.MINING), + IRON_ORE_5(6943, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 21296, Skills.MINING), + IRON_ORE_6(6944, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 21297, Skills.MINING), + IRON_ORE_7(9718, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 32448, Skills.MINING), + IRON_ORE_8(9719, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 18954, Skills.MINING), + IRON_ORE_9(9717, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 32447, Skills.MINING), + IRON_ORE_10(11956, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 11557, Skills.MINING), + IRON_ORE_11(11954, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 11555, Skills.MINING), + IRON_ORE_12(11955, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 11556, Skills.MINING), + IRON_ORE_13(14914, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 14895, Skills.MINING), + IRON_ORE_14(14913, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 14894, Skills.MINING), + IRON_ORE_15(14858, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 25373, Skills.MINING), + IRON_ORE_16(14857, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 25372, Skills.MINING), + IRON_ORE_17(14856, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 25371, Skills.MINING), + IRON_ORE_18(14900, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 14894, Skills.MINING), + IRON_ORE_19(14901, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 14895, Skills.MINING), + IRON_ORE_20(20423, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 20444, Skills.MINING), + IRON_ORE_21(20422, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 20443, Skills.MINING), + IRON_ORE_22(20425, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 20407, Skills.MINING), + IRON_ORE_23(20424, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 20445, Skills.MINING), + IRON_ORE_24(19002, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 19005, Skills.MINING), + IRON_ORE_25(19001, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 19004, Skills.MINING), + IRON_ORE_26(19000, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 19003, Skills.MINING), + IRON_ORE_27(21281, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 21296, Skills.MINING), + IRON_ORE_28(21283, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 21298, Skills.MINING), + IRON_ORE_29(21282, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 21297, Skills.MINING), + IRON_ORE_30(29221, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 29218, Skills.MINING), + IRON_ORE_31(29223, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 29220, Skills.MINING), + IRON_ORE_32(29222, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 29219, Skills.MINING), + IRON_ORE_33(32441, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 33400, Skills.MINING), + IRON_ORE_34(32443, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 33402, Skills.MINING), + IRON_ORE_35(32442, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 33401, Skills.MINING), + IRON_ORE_36(32452, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 32448, Skills.MINING), + IRON_ORE_37(32451, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 32447, Skills.MINING), + IRON_ORE_38(31073, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 37650, Skills.MINING), + IRON_ORE_39(31072, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 37649, Skills.MINING), + IRON_ORE_40(31071, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 37639, Skills.MINING), + IRON_ORE_41(37307, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 11552, Skills.MINING), + IRON_ORE_42(37309, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 11554, Skills.MINING), + IRON_ORE_43(37308, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 11553, Skills.MINING), + IRON_ORE_49(42034, 15, 0.2, 15 | 25 << 16, 35.0, 440, 1, "iron rocks", null, 450, Skills.MINING), + + /** + * Silver ore. + */ + SILVER_ORE_0(2101, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 452, Skills.MINING), + SILVER_ORE_1(2100, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 450, Skills.MINING), + SILVER_ORE_2(6945, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 21296, Skills.MINING), + SILVER_ORE_3(6946, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 21297, Skills.MINING), + SILVER_ORE_4(9716, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 18954, Skills.MINING), + SILVER_ORE_5(9714, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 32447, Skills.MINING), + SILVER_ORE_6(9715, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 32448, Skills.MINING), + SILVER_ORE_7(11188, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 21298, Skills.MINING), + SILVER_ORE_8(11186, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 21296, Skills.MINING), + SILVER_ORE_9(11187, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 21297, Skills.MINING), + SILVER_ORE_10(15581, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 14834, Skills.MINING), + SILVER_ORE_11(15580, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 14833, Skills.MINING), + SILVER_ORE_12(15579, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 14832, Skills.MINING), + SILVER_ORE_13(16998, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 14915, Skills.MINING), + SILVER_ORE_14(16999, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 14916, Skills.MINING), + SILVER_ORE_15(17007, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 14915, Skills.MINING), + SILVER_ORE_16(17000, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 31061, Skills.MINING), + SILVER_ORE_17(17009, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 31061, Skills.MINING), + SILVER_ORE_18(17008, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 14916, Skills.MINING), + SILVER_ORE_19(17385, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 32447, Skills.MINING), + SILVER_ORE_20(17387, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 18954, Skills.MINING), + SILVER_ORE_21(17386, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 32448, Skills.MINING), + SILVER_ORE_22(29225, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 29219, Skills.MINING), + SILVER_ORE_23(29224, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 29218, Skills.MINING), + SILVER_ORE_24(29226, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 29220, Skills.MINING), + SILVER_ORE_25(32445, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 33401, Skills.MINING), + SILVER_ORE_26(32444, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 33400, Skills.MINING), + SILVER_ORE_27(32446, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 33402, Skills.MINING), + SILVER_ORE_28(31075, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 37649, Skills.MINING), + SILVER_ORE_29(31074, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 37639, Skills.MINING), + SILVER_ORE_30(31076, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 37650, Skills.MINING), + SILVER_ORE_31(37305, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 11553, Skills.MINING), + SILVER_ORE_32(37304, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 11552, Skills.MINING), + SILVER_ORE_33(37306, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 11554, Skills.MINING), + SILVER_ORE_34(37670, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 11552, Skills.MINING), + SILVER_ORE_35(11948, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 11555, Skills.MINING), + SILVER_ORE_36(11949, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 11556, Skills.MINING), + SILVER_ORE_37(11950, 20, 0.3, 100 | 200 << 16, 40.0, 442, 1, "silver rocks", null, 11557, Skills.MINING), + + /** + * Coal. + */ + COAL_0(2097, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 452, Skills.MINING), + COAL_1(2096, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 450, Skills.MINING), + COAL_2(4985, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 4994, Skills.MINING), + COAL_3(4986, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 4995, Skills.MINING), + COAL_4(4987, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 4996, Skills.MINING), + COAL_5(4676, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 450, Skills.MINING), + COAL_6(10948, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 10944, Skills.MINING), + COAL_7(11964, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 11556, Skills.MINING), + COAL_8(11965, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 11557, Skills.MINING), + COAL_9(11963, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 11555, Skills.MINING), + COAL_10(11932, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 11554, Skills.MINING), + COAL_11(11930, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 11552, Skills.MINING), + COAL_12(11931, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 11553, Skills.MINING), + COAL_13(15246, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 15249, Skills.MINING), + COAL_14(15247, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 15250, Skills.MINING), + COAL_15(15248, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 15251, Skills.MINING), + COAL_16(14852, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 25373, Skills.MINING), + COAL_17(14851, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 25372, Skills.MINING), + COAL_18(14850, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 25371, Skills.MINING), + COAL_19(20410, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 20443, Skills.MINING), + COAL_20(20411, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 20444, Skills.MINING), + COAL_21(20412, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 20445, Skills.MINING), + COAL_22(20413, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 20407, Skills.MINING), + COAL_23(18999, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 19005, Skills.MINING), + COAL_24(18998, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 19004, Skills.MINING), + COAL_25(18997, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 19003, Skills.MINING), + COAL_26(21287, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 21296, Skills.MINING), + COAL_27(21289, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 21298, Skills.MINING), + COAL_28(21288, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 21297, Skills.MINING), + COAL_29(23565, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 21298, Skills.MINING), + COAL_30(23564, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 21297, Skills.MINING), + COAL_31(23563, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 21296, Skills.MINING), + COAL_32(29215, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 29218, Skills.MINING), + COAL_33(29217, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 29220, Skills.MINING), + COAL_34(29216, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 29219, Skills.MINING), + COAL_35(32426, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 33400, Skills.MINING), + COAL_36(32427, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 33401, Skills.MINING), + COAL_37(32428, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 33402, Skills.MINING), + COAL_38(32450, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 32448, Skills.MINING), + COAL_39(32449, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 32447, Skills.MINING), + COAL_40(31068, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 37639, Skills.MINING), + COAL_41(31069, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 37649, Skills.MINING), + COAL_42(31070, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 37650, Skills.MINING), + COAL_43(31168, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 14833, Skills.MINING), + COAL_44(31169, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 14834, Skills.MINING), + COAL_45(31167, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 14832, Skills.MINING), + COAL_46(37699, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 21298, Skills.MINING), + COAL_47(37698, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 21297, Skills.MINING), + COAL_48(37697, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 21296, Skills.MINING), + COAL_49(42035, 30, 0.4, 50 | 100 << 16, 50.0, 453, 1, "coal", null, 452, Skills.MINING), + + /** + * Sandstone. + */ + SANDSTONE(10946, 35, 0.2, 30 | 60 << 16, 30.0, 6971, 1, "sandstone", null, 10944, Skills.MINING), + + /** + * Gold ore. + */ + GOLD_ORE_0(2099, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 452, Skills.MINING), + GOLD_ORE_1(2098, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 450, Skills.MINING), + GOLD_ORE_2(2611, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 21298, Skills.MINING), + GOLD_ORE_3(2610, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 21297, Skills.MINING), + GOLD_ORE_4(2609, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 21296, Skills.MINING), + GOLD_ORE_5(9722, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 18954, Skills.MINING), + GOLD_ORE_6(9720, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 32447, Skills.MINING), + GOLD_ORE_7(9721, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 32448, Skills.MINING), + GOLD_ORE_8(11183, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 21296, Skills.MINING), + GOLD_ORE_9(11184, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 21297, Skills.MINING), + GOLD_ORE_10(11185, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 21298, Skills.MINING), + GOLD_ORE_11(11952, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 11556, Skills.MINING), + GOLD_ORE_12(11953, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 11557, Skills.MINING), + GOLD_ORE_13(11951, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 11555, Skills.MINING), + GOLD_ORE_14(15578, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 14834, Skills.MINING), + GOLD_ORE_15(15577, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 14833, Skills.MINING), + GOLD_ORE_16(15576, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 14832, Skills.MINING), + GOLD_ORE_17(17002, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 14916, Skills.MINING), + GOLD_ORE_18(17003, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 31061, Skills.MINING), + GOLD_ORE_19(17001, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 14915, Skills.MINING), + GOLD_ORE_20(21291, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 21297, Skills.MINING), + GOLD_ORE_21(21290, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 21296, Skills.MINING), + GOLD_ORE_22(21292, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 21298, Skills.MINING), + GOLD_ORE_23(32433, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 33401, Skills.MINING), + GOLD_ORE_24(32432, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 33400, Skills.MINING), + GOLD_ORE_25(32434, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 33402, Skills.MINING), + GOLD_ORE_26(31065, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 37639, Skills.MINING), + GOLD_ORE_27(31066, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 37649, Skills.MINING), + GOLD_ORE_28(31067, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 37650, Skills.MINING), + GOLD_ORE_29(37311, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 11553, Skills.MINING), + GOLD_ORE_30(37310, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 11552, Skills.MINING), + GOLD_ORE_31(37312, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 11554, Skills.MINING), + GOLD_ORE_32(37471, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 15249, Skills.MINING), + GOLD_ORE_33(37473, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 15251, Skills.MINING), + GOLD_ORE_34(37472, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 15250, Skills.MINING), + GOLD_ORE_49(42033, 40, 0.6, 100 | 200 << 16, 65.0, 444, 1, "gold rocks", null, 452, Skills.MINING), + + /** + * Granite. + */ + GRANITE(10947, 45, 0.2, 10 | 20 << 16, 50.0, 6979, 1, "granite", null, 10945, Skills.MINING), + + /** + * Rubium. + */ + RUBIUM(29746, 46, 0.6, 50 | 100 << 16, 17.5, 12630, 1, "rubium", null, 29747, Skills.MINING), + + /** + * Mithril ore. + */ + MITHRIL_ORE_0(2103, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 452, Skills.MINING), + MITHRIL_ORE_1(2102, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 450, Skills.MINING), + MITHRIL_ORE_2(4988, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 4994, Skills.MINING), + MITHRIL_ORE_3(4989, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 4995, Skills.MINING), + MITHRIL_ORE_4(4990, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 4996, Skills.MINING), + MITHRIL_ORE_5(11943, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 11553, Skills.MINING), + MITHRIL_ORE_6(11942, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 11552, Skills.MINING), + MITHRIL_ORE_7(11945, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 11555, Skills.MINING), + MITHRIL_ORE_8(11944, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 11554, Skills.MINING), + MITHRIL_ORE_9(11947, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 11557, Skills.MINING), + MITHRIL_ORE_10(11946, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 11556, Skills.MINING), + MITHRIL_ORE_11(14855, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 25373, Skills.MINING), + MITHRIL_ORE_12(14854, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 25372, Skills.MINING), + MITHRIL_ORE_13(14853, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 25371, Skills.MINING), + MITHRIL_ORE_14(16687, 50, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 450, Skills.MINING), + MITHRIL_ORE_15(20421, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 20407, Skills.MINING), + MITHRIL_ORE_16(20420, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 20445, Skills.MINING), + MITHRIL_ORE_17(20419, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 20444, Skills.MINING), + MITHRIL_ORE_18(20418, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 20443, Skills.MINING), + MITHRIL_ORE_19(19012, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 19021, Skills.MINING), + MITHRIL_ORE_20(19013, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 19016, Skills.MINING), + MITHRIL_ORE_21(19014, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 19017, Skills.MINING), + MITHRIL_ORE_22(21278, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 21296, Skills.MINING), + MITHRIL_ORE_23(21279, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 21297, Skills.MINING), + MITHRIL_ORE_24(21280, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 21298, Skills.MINING), + MITHRIL_ORE_25(25369, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 10586, Skills.MINING), + MITHRIL_ORE_26(25368, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 10585, Skills.MINING), + MITHRIL_ORE_27(25370, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 10587, Skills.MINING), + MITHRIL_ORE_28(29236, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 29218, Skills.MINING), + MITHRIL_ORE_29(29237, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 29219, Skills.MINING), + MITHRIL_ORE_30(29238, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 29220, Skills.MINING), + MITHRIL_ORE_31(32439, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 33401, Skills.MINING), + MITHRIL_ORE_32(32438, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 33400, Skills.MINING), + MITHRIL_ORE_33(32440, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 33402, Skills.MINING), + MITHRIL_ORE_34(31087, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 37649, Skills.MINING), + MITHRIL_ORE_35(31086, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 37639, Skills.MINING), + MITHRIL_ORE_36(31088, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 37650, Skills.MINING), + MITHRIL_ORE_37(31170, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 14832, Skills.MINING), + MITHRIL_ORE_38(31171, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 14833, Skills.MINING), + MITHRIL_ORE_39(31172, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 14834, Skills.MINING), + MITHRIL_ORE_40(37692, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 21296, Skills.MINING), + MITHRIL_ORE_41(37693, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 21297, Skills.MINING), + MITHRIL_ORE_42(37694, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 21298, Skills.MINING), + MITHRIL_ORE_49(42036, 55, 0.70, 200 | 400 << 16, 80.0, 447, 1, "mithril rocks", null, 452, Skills.MINING), + + /** + * Adamantite ore. + */ + ADAMANTITE_ORE_0(2105, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 452, Skills.MINING), + ADAMANTITE_ORE_1(2104, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 450, Skills.MINING), + ADAMANTITE_ORE_2(4991, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 4994, Skills.MINING), + ADAMANTITE_ORE_3(4992, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 4995, Skills.MINING), + ADAMANTITE_ORE_4(4993, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 4996, Skills.MINING), + ADAMANTITE_ORE_5(11941, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 11554, Skills.MINING), + ADAMANTITE_ORE_6(11940, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 11553, Skills.MINING), + ADAMANTITE_ORE_7(11939, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 11552, Skills.MINING), + ADAMANTITE_ORE_8(14864, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 25373, Skills.MINING), + ADAMANTITE_ORE_9(14863, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 25372, Skills.MINING), + ADAMANTITE_ORE_10(14862, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 25371, Skills.MINING), + ADAMANTITE_ORE_11(20417, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 20407, Skills.MINING), + ADAMANTITE_ORE_12(20416, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 20445, Skills.MINING), + ADAMANTITE_ORE_13(20414, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 20443, Skills.MINING), + ADAMANTITE_ORE_14(20415, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 20444, Skills.MINING), + ADAMANTITE_ORE_15(19020, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 19017, Skills.MINING), + ADAMANTITE_ORE_16(19018, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 19021, Skills.MINING), + ADAMANTITE_ORE_17(19019, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 19016, Skills.MINING), + ADAMANTITE_ORE_18(21275, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 21296, Skills.MINING), + ADAMANTITE_ORE_19(21276, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 21297, Skills.MINING), + ADAMANTITE_ORE_20(21277, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 21298, Skills.MINING), + ADAMANTITE_ORE_21(29233, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 29218, Skills.MINING), + ADAMANTITE_ORE_22(29234, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 29219, Skills.MINING), + ADAMANTITE_ORE_23(29235, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 29220, Skills.MINING), + ADAMANTITE_ORE_24(32435, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 33400, Skills.MINING), + ADAMANTITE_ORE_25(32437, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 33402, Skills.MINING), + ADAMANTITE_ORE_26(32436, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 33401, Skills.MINING), + ADAMANTITE_ORE_27(31083, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 37639, Skills.MINING), + ADAMANTITE_ORE_28(31085, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 37650, Skills.MINING), + ADAMANTITE_ORE_29(31084, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 37649, Skills.MINING), + ADAMANTITE_ORE_30(31173, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 14832, Skills.MINING), + ADAMANTITE_ORE_31(31174, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 14833, Skills.MINING), + ADAMANTITE_ORE_32(31175, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 14834, Skills.MINING), + ADAMANTITE_ORE_33(37468, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 15249, Skills.MINING), + ADAMANTITE_ORE_34(37469, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 15250, Skills.MINING), + ADAMANTITE_ORE_35(37470, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 15251, Skills.MINING), + ADAMANTITE_ORE_36(37689, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 21296, Skills.MINING), + ADAMANTITE_ORE_37(37690, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 21297, Skills.MINING), + ADAMANTITE_ORE_38(37691, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 21298, Skills.MINING), + ADAMANTITE_ORE_39(42037, 70, 0.85, 400 | 800 << 16, 95.0, 449, 1, "adamant rocks", null, 452, Skills.MINING), + + /** + * Runite ore. + */ + RUNITE_ORE_0(2107, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 452, Skills.MINING), + RUNITE_ORE_1(2106, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 450, Skills.MINING), + RUNITE_ORE_2(6669, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 21296, Skills.MINING), + RUNITE_ORE_3(6671, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 21298, Skills.MINING), + RUNITE_ORE_4(6670, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 21297, Skills.MINING), + RUNITE_ORE_5(14861, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 25373, Skills.MINING), + RUNITE_ORE_6(14860, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 25372, Skills.MINING), + RUNITE_ORE_7(14859, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 25371, Skills.MINING), + RUNITE_ORE_8(33079, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 33401, Skills.MINING), + RUNITE_ORE_9(33078, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 33400, Skills.MINING), + RUNITE_ORE_10(37208, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 21296, Skills.MINING), + RUNITE_ORE_11(37465, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 15249, Skills.MINING), + RUNITE_ORE_12(37466, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 15250, Skills.MINING), + RUNITE_ORE_13(37467, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 15251, Skills.MINING), + RUNITE_ORE_14(37695, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 21297, Skills.MINING), + RUNITE_ORE_15(37696, 85, 0.95, 1250 | 2500 << 16, 125.0, 451, 1, "runite rocks", null, 21298, Skills.MINING), + + /** + * Gem rocks. + */ + GEM_ROCK_0(23567, 40, 0.95, 166 | 175 << 16, 65, 1625, 1, "gem rocks", null, 21297, Skills.MINING), + GEM_ROCK_1(23566, 40, 0.95, 166 | 175 << 16, 65, 1625, 1, "gem rocks", null, 21296, Skills.MINING), + GEM_ROCK_2(23568, 40, 0.95, 166 | 175 << 16, 65, 1625, 1, "gem rocks", null, 21298, Skills.MINING); + + /** + * The resources mapping. + */ + private static final Map RESOURCES = new HashMap<>(); + + /** + * Populate the mapping. + */ + static { + for (SkillingResource resource : SkillingResource.values()) { + if (RESOURCES.containsKey(resource.id)) { + SystemLogger.logErr("Already contained resource " + resource.getId() + " - " + resource.name()); + } + RESOURCES.put(resource.id, resource); + } + } + + /** + * The resource id. + */ + private final int id; + + /** + * The level required. + */ + private final int level; + + /** + * The rate. + */ + private final double rate; + + /** + * The respawn rate. + */ + private final int respawnRate; + + /** + * The experience to be rewarded. + */ + private final double experience; + + /** + * The reward item id. + */ + private final int reward; + + /** + * The amount to reward. + */ + private final int rewardAmount; + + /** + * The name. + */ + private final String name; + + /** + * The animation. + */ + private final Animation animation; + + /** + * The id to replace this id with when the resource runs out. + */ + private final int emptyId; + + /** + * The skill id. + */ + private final int skillId; + + /** + * Represents if its a farming resource. + */ + private final boolean farming; + + /** + * Constructs a new {@code SkillingResource} {@code Object}. + * @param id The id. + * @param level The level required. + * @param rate The rate. + * @param respawnRate The respawn rate (lowest ticks | highest ticks << 16). + * @param experience The experience. + * @param reward The reward item id. + * @param rewardAmount The reward amount. + * @param name The name. + * @param animation The animation. + * @param emptyId The id to replace this id with when the resource runs out. + * @param skillId The skill id. + */ + private SkillingResource(int id, int level, double rate, int respawnRate, double experience, int reward, int rewardAmount, String name, Animation animation, int emptyId, int skillId) { + this.id = id; + this.level = level; + this.rate = rate; + this.respawnRate = respawnRate; + this.experience = experience; + this.reward = reward; + this.rewardAmount = rewardAmount; + this.name = name; + this.animation = animation; + this.emptyId = emptyId; + this.skillId = skillId; + this.farming = false; + } + + /** + * Constructs a new {@code SkillingResource} {@code Object}. + * @param id The id. + * @param level The level required. + * @param rate The rate. + * @param respawnRate The respawn rate (lowest ticks | highest ticks << 16). + * @param experience The experience. + * @param reward The reward item id. + * @param rewardAmount The reward amount. + * @param name The name. + * @param animation The animation. + * @param emptyId The id to replace this id with when the resource runs out. + * @param skillId The skill id. + */ + private SkillingResource(int id, int level, double rate, int respawnRate, double experience, int reward, int rewardAmount, String name, Animation animation, int emptyId, int skillId, boolean farming) { + this.id = id; + this.level = level; + this.rate = rate; + this.respawnRate = respawnRate; + this.experience = experience; + this.reward = reward; + this.rewardAmount = rewardAmount; + this.name = name; + this.animation = animation; + this.emptyId = emptyId; + this.skillId = skillId; + this.farming = farming; + } + + /** + * Gets the skilling resource for the given id. + * @param id The id. + * @return The resource. + */ + public static SkillingResource forId(int id) { + return RESOURCES.get(id); + } + + /** + * Checks if the object id is an empty resource. + * @param id The object id. + * @return {@code True} if so. + */ + public static boolean isEmpty(int id) { + for (SkillingResource r : SkillingResource.values()) { + if (r.getEmptyId() == id) { + return true; + } + } + return false; + } + + /** + * Gets the current respawn duration (in ticks). + * @return The respawn duration. + */ + public int getRespawnDuration() { + int minimum = respawnRate & 0xFFFF; + int maximum = (respawnRate >> 16) & 0xFFFF; + double playerRatio = ServerConstants.MAX_PLAYERS / Repository.getPlayers().size(); + return (int) (minimum + ((maximum - minimum) / playerRatio)); + } + + /** + * Gets the maximum respawn time (in ticks). + * @return The maximum respawn time. + */ + public int getMaximumRespawn() { + return (respawnRate >> 16) & 0xFFFF; + } + + /** + * Gets the minimum respawn time (in ticks). + * @return The minimum respawn time. + */ + public int getMinimumRespawn() { + return respawnRate & 0xFFFF; + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the rate. + * @return The rate. + */ + public double getRate() { + return rate; + } + + /** + * Gets the respawnRate. + * @return The respawnRate. + */ + public int getRespawnRate() { + return respawnRate; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the reward. + * @return The reward. + */ + public int getReward() { + return reward; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Gets the emptyId. + * @return The emptyId. + */ + public int getEmptyId() { + return emptyId; + } + + /** + * Gets the skillId. + * @return The skillId. + */ + public int getSkillId() { + return skillId; + } + + /** + * Gets the rewardAmount. + * @return The rewardAmount. + */ + public int getRewardAmount() { + return rewardAmount; + } + + /** + * Gets the farming. + * @return The farming. + */ + public boolean isFarming() { + return farming; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/gather/SkillingTool.java b/Server/src/main/java/Server/core/game/node/entity/skill/gather/SkillingTool.java new file mode 100644 index 000000000..3230be1ec --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/gather/SkillingTool.java @@ -0,0 +1,252 @@ +package core.game.node.entity.skill.gather; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; + +/** + * Represents a skilling tool (such as knife, axe, needle, ...) + * @author Emperor + */ +public enum SkillingTool { + + /** + * Represents a bronze axe (woodcutting). + */ + BRONZE_AXE(1351, 1, 0.05D, new Animation(879)), + + /** + * Represents an iron axe (woodcutting). + */ + IRON_AXE(1349, 1, 0.1D, new Animation(877)), + + /** + * Represents a steel axe (woodcutting). + */ + STEEL_AXE(1353, 6, 0.2D, new Animation(875)), + + /** + * Represents a black axe (woodcutting). + */ + BLACK_AXE(1361, 6, 0.25D, new Animation(873)), + + /** + * Represents a mithril axe (woodcutting). + */ + MITHRIL_AXE(1355, 21, 0.30D, new Animation(871)), + + /** + * Represents an adamant axe (woodcutting). + */ + ADAMANT_AXE(1357, 31, 0.45D, new Animation(869)), + + /** + * Represents a rune axe (woodcutting). + */ + RUNE_AXE(1359, 41, 0.65D, new Animation(867)), + + /** + * Represents a dragon axe (woodcutting). + */ + DRAGON_AXE(6739, 61, 0.85D, new Animation(2846)), + + /** + * Represents a bronze pickaxe (mining). + */ + BRONZE_PICKAXE(1265, 1, 0.05D, new Animation(625)), + + /** + * Represents an iron pickaxe (mining). + */ + IRON_PICKAXE(1267, 1, 0.1D, new Animation(626)), + + /** + * Represents a steel pickaxe (mining). + */ + STEEL_PICKAXE(1269, 6, 0.2D, new Animation(627)), + + /** + * Represents a mithril pickaxe (mining). + */ + MITHRIL_PICKAXE(1273, 21, 0.30D, new Animation(629)), + + /** + * Represents an adamant pickaxe (mining). + */ + ADAMANT_PICKAXE(1271, 31, 0.45D, new Animation(628)), + + /** + * Represents a rune pickaxe (mining). + */ + RUNE_PICKAXE(1275, 41, 0.65D, new Animation(624)), + + /** + * Represents a dragon pickaxe (mining). + */ + DRAGON_PICKAXE(14669, 61, 1.0D, new Animation(11171)), + + /** + * Represents the Inferno Adze (woodcutting) + */ + INFERNO_ADZE(13661, 61, 0.85D, new Animation(10251)), + + /** + * Represents the Inferno Adze (mining) + */ + INFERNO_ADZE2(13661, 61, 1.0D, new Animation(10222)); + + /** + * The tool id. + */ + private final int id; + + /** + * The level required. + */ + private final int level; + + /** + * The ratio. + */ + private final double ratio; + + /** + * The animation. + */ + private final Animation animation; + + /** + * Constructs a new {@code SkillingTool} {@code Object}. + * @param id The tool item id. + * @param level The level required to use this. + * @param ratio The ratio. + * @param animation The animation. + */ + private SkillingTool(int id, int level, double ratio, Animation animation) { + this.id = id; + this.level = level; + this.ratio = ratio; + this.animation = animation; + } + + /** + * Gets the tool by the item id. + * @param itemId The item id. + * @return The skilling tool, or {@code null} if the tool wasn't found. + */ + public static SkillingTool forId(int itemId) { + for (SkillingTool tool : SkillingTool.values()) { + if (tool.id == itemId) { + return tool; + } + } + return null; + } + + /** + * Gets the hatchet used by the player. + * @param player The player. + * @return The hatchet. + */ + public static SkillingTool getHatchet(Player player) { + SkillingTool tool = null; + if (checkTool(player, Skills.WOODCUTTING, SkillingTool.DRAGON_AXE)) { + tool = SkillingTool.DRAGON_AXE; + } else if (checkTool(player, Skills.WOODCUTTING, SkillingTool.RUNE_AXE)) { + tool = SkillingTool.RUNE_AXE; + } else if (checkTool(player, Skills.WOODCUTTING, SkillingTool.ADAMANT_AXE)) { + tool = SkillingTool.ADAMANT_AXE; + } else if (checkTool(player, Skills.WOODCUTTING, SkillingTool.MITHRIL_AXE)) { + tool = SkillingTool.MITHRIL_AXE; + } else if (checkTool(player, Skills.WOODCUTTING, SkillingTool.BLACK_AXE)) { + tool = SkillingTool.BLACK_AXE; + } else if (checkTool(player, Skills.WOODCUTTING, SkillingTool.STEEL_AXE)) { + tool = SkillingTool.STEEL_AXE; + } else if (checkTool(player, Skills.WOODCUTTING, SkillingTool.IRON_AXE)) { + tool = SkillingTool.IRON_AXE; + } else if (checkTool(player, Skills.WOODCUTTING, SkillingTool.BRONZE_AXE)) { + tool = SkillingTool.BRONZE_AXE; + } else if (checkTool(player, Skills.WOODCUTTING, SkillingTool.INFERNO_ADZE)) { + if(player.getSkills().getLevel(Skills.FIREMAKING) >= 92) { + tool = SkillingTool.INFERNO_ADZE; + } + } + return tool; + } + + /** + * Gets the pickaxe used by the player. + * @param player The player. + * @return The hatchet. + */ + public static SkillingTool getPickaxe(Player player) { + SkillingTool tool = null; + if (checkTool(player, Skills.MINING, SkillingTool.INFERNO_ADZE2)) { + if(player.getSkills().getLevel(Skills.FIREMAKING) >= 92) { + tool = SkillingTool.INFERNO_ADZE2; + } + } else if (checkTool(player, Skills.MINING, SkillingTool.DRAGON_PICKAXE)) { + tool = SkillingTool.DRAGON_PICKAXE; + } else if (checkTool(player, Skills.MINING, SkillingTool.RUNE_PICKAXE)) { + tool = SkillingTool.RUNE_PICKAXE; + } else if (checkTool(player, Skills.MINING, SkillingTool.ADAMANT_PICKAXE)) { + tool = SkillingTool.ADAMANT_PICKAXE; + } else if (checkTool(player, Skills.MINING, SkillingTool.MITHRIL_PICKAXE)) { + tool = SkillingTool.MITHRIL_PICKAXE; + } else if (checkTool(player, Skills.MINING, SkillingTool.STEEL_PICKAXE)) { + tool = SkillingTool.STEEL_PICKAXE; + } else if (checkTool(player, Skills.MINING, SkillingTool.IRON_PICKAXE)) { + tool = SkillingTool.IRON_PICKAXE; + } else if (checkTool(player, Skills.MINING, SkillingTool.BRONZE_PICKAXE)) { + tool = SkillingTool.BRONZE_PICKAXE; + } + return tool; + } + + /** + * Checks if the player has a tool and if he can use it. + * @param tool The tool. + * @return {@code True} if the tool is usable. + */ + public static boolean checkTool(Player player, int skillId, SkillingTool tool) { + if (player.getSkills().getStaticLevel(skillId) < tool.getLevel()) { + return false; + } + if (player.getEquipment().getNew(3).getId() == tool.getId()) { + return true; + } + return player.getInventory().contains(tool.getId(), 1); + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the ratio. + * @return The ratio. + */ + public double getRatio() { + return ratio; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningNode.java b/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningNode.java new file mode 100644 index 000000000..ba7e1dff2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningNode.java @@ -0,0 +1,638 @@ +package core.game.node.entity.skill.gather.mining; + +import core.ServerConstants; +import core.game.node.item.WeightedChanceItem; +import core.game.world.repository.Repository; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Mining nodes + * @author ceik + */ +public enum MiningNode{ + //Copper + COPPER_ORE_0( 2090, 450, (byte) 1), + COPPER_ORE_1( 2091, 452, (byte) 1), + COPPER_ORE_2( 4976, 4994, (byte) 1), + COPPER_ORE_3( 4977, 4995, (byte) 1), + COPPER_ORE_4( 4978, 4996, (byte) 1), + COPPER_ORE_5( 9710, 18954, (byte) 1), + COPPER_ORE_6( 9709, 32448, (byte) 1), + COPPER_ORE_7( 9708, 32447, (byte) 1), + COPPER_ORE_8( 11960,11555, (byte) 1), + COPPER_ORE_9( 11961,11556, (byte) 1), + COPPER_ORE_10(11962,11557, (byte) 1), + COPPER_ORE_11(11937,11553, (byte) 1), + COPPER_ORE_12(11936,11552, (byte) 1), + COPPER_ORE_13(11938,11554, (byte) 1), + COPPER_ORE_14(12746,450, (byte) 1), + COPPER_ORE_15(14906,14894, (byte) 1), + COPPER_ORE_16(14907,14895, (byte) 1), + COPPER_ORE_17(20448,20445, (byte) 1), + COPPER_ORE_18(20451,20445, (byte) 1), + COPPER_ORE_19(20446,20443, (byte) 1), + COPPER_ORE_20(20447,20444, (byte) 1), + COPPER_ORE_21(20408,20407, (byte) 1), + COPPER_ORE_22(18993,19005, (byte) 1), + COPPER_ORE_23(18992,19004, (byte) 1), + COPPER_ORE_24(19007,19016, (byte) 1), + COPPER_ORE_25(19006,19021, (byte) 1), + COPPER_ORE_26(18991,19003, (byte) 1), + COPPER_ORE_27(19008,19017, (byte) 1), + COPPER_ORE_28(21285,21297, (byte) 1), + COPPER_ORE_29(21284,21296, (byte) 1), + COPPER_ORE_30(21286,21298, (byte) 1), + COPPER_ORE_31(29231,29219, (byte) 1), + COPPER_ORE_32(29230,29218, (byte) 1), + COPPER_ORE_33(29232,29220, (byte) 1), + COPPER_ORE_34(31082,37650, (byte) 1), + COPPER_ORE_35(31081,37649, (byte) 1), + COPPER_ORE_36(31080,37639, (byte) 1), + COPPER_ORE_37(37647,37650, (byte) 1), + COPPER_ORE_38(37646,37649, (byte) 1), + COPPER_ORE_39(37645,37639, (byte) 1), + COPPER_ORE_40(37637,37639, (byte) 1), + COPPER_ORE_41(37688,21298, (byte) 1), + COPPER_ORE_42(37686,21296, (byte) 1), + COPPER_ORE_43(37687,21297, (byte) 1), + COPPER_ORE_44(3042, 450, (byte) 1), + + //Tin + TIN_ORE_0( 2094, 450, (byte) 2), + TIN_ORE_1( 2095, 452, (byte) 2), + TIN_ORE_2( 3043, 450, (byte) 2), + TIN_ORE_3( 4979, 4994, (byte) 2), + TIN_ORE_4( 4980, 4995, (byte) 2), + TIN_ORE_5( 4981, 4996, (byte) 2), + TIN_ORE_6( 11957,11555, (byte) 2), + TIN_ORE_7( 11958,11556, (byte) 2), + TIN_ORE_8( 11959,11557, (byte) 2), + TIN_ORE_9( 11934,11553, (byte) 2), + TIN_ORE_10(11935,11554, (byte) 2), + TIN_ORE_11(11933,11552, (byte) 2), + TIN_ORE_12(14902,14894, (byte) 2), + TIN_ORE_13(14903,14895, (byte) 2), + TIN_ORE_14(18995,19004, (byte) 2), + TIN_ORE_15(18994,19003, (byte) 2), + TIN_ORE_16(18996,19005, (byte) 2), + TIN_ORE_17(19025,19016, (byte) 2), + TIN_ORE_18(19024,19021, (byte) 2), + TIN_ORE_19(19026,19017, (byte) 2), + TIN_ORE_20(21293,21296, (byte) 2), + TIN_ORE_21(21295,21298, (byte) 2), + TIN_ORE_22(21294,21297, (byte) 2), + TIN_ORE_23(29227,29218, (byte) 2), + TIN_ORE_24(29229,29220, (byte) 2), + TIN_ORE_25(29228,29219, (byte) 2), + TIN_ORE_26(31079,37650, (byte) 2), + TIN_ORE_27(31078,37649, (byte) 2), + TIN_ORE_28(31077,37639, (byte) 2), + TIN_ORE_29(37644,37650, (byte) 2), + TIN_ORE_30(37643,37649, (byte) 2), + TIN_ORE_31(37642,37639, (byte) 2), + TIN_ORE_32(37638,37639, (byte) 2), + TIN_ORE_33(37685,21298, (byte) 2), + + //Clay + CLAY_0( 2109, 452, (byte) 3), + CLAY_1( 2108, 450, (byte) 3), + CLAY_2( 9712, 32448, (byte) 3), + CLAY_3( 9713, 18954, (byte) 3), + CLAY_4( 9711, 32447, (byte) 3), + CLAY_5( 10949,10945, (byte) 3), + CLAY_6( 11190,21297, (byte) 3), + CLAY_7( 11191,21298, (byte) 3), + CLAY_8( 11189,21296, (byte) 3), + CLAY_9( 12942,4995, (byte) 3), + CLAY_10(12943,4996, (byte) 3), + CLAY_11(12941,4994, (byte) 3), + CLAY_12(14904,14894, (byte) 3), + CLAY_13(14905,14895, (byte) 3), + CLAY_14(15505,11557, (byte) 3), + CLAY_15(15504,11556, (byte) 3), + CLAY_16(15503,11555, (byte) 3), + CLAY_17(20449,20443, (byte) 3), + CLAY_18(20450,20444, (byte) 3), + CLAY_19(20409,20407, (byte) 3), + CLAY_20(32429,33400, (byte) 3), + CLAY_21(32430,33401, (byte) 3), + CLAY_22(32431,33402, (byte) 3), + CLAY_23(31062,37639, (byte) 3), + CLAY_24(31063,37649, (byte) 3), + CLAY_25(31064,37650, (byte) 3), + + //Limestone + LIMESTONE_0(4027,12564, (byte) 4), + LIMESTONE_1(4028,12565, (byte) 4), + LIMESTONE_2(4029,12566, (byte) 4), + LIMESTONE_3(4030,12567, (byte) 4), + + //Blurite + BLURITE_ORE_0(33220,33222, (byte) 5), + BLURITE_ORE_1(33221,33223, (byte) 5), + + //Iron + IRON_ORE_0( 2092, 450, (byte) 6), + IRON_ORE_1( 2093, 452, (byte) 6), + IRON_ORE_2( 4982, 4994, (byte) 6), + IRON_ORE_3( 4983, 4995, (byte) 6), + IRON_ORE_4( 4984, 4996, (byte) 6), + IRON_ORE_5( 6943, 21296, (byte) 6), + IRON_ORE_6( 6944, 21297, (byte) 6), + IRON_ORE_7( 9718, 32448, (byte) 6), + IRON_ORE_8( 9719, 18954, (byte) 6), + IRON_ORE_9( 9717, 32447, (byte) 6), + IRON_ORE_10(11956,11557, (byte) 6), + IRON_ORE_11(11954,11555, (byte) 6), + IRON_ORE_12(11955,11556, (byte) 6), + IRON_ORE_13(14914,14895, (byte) 6), + IRON_ORE_14(14913,14894, (byte) 6), + IRON_ORE_15(14858,25373, (byte) 6), + IRON_ORE_16(14857,25372, (byte) 6), + IRON_ORE_17(14856,25371, (byte) 6), + IRON_ORE_18(14900,14894, (byte) 6), + IRON_ORE_19(14901,14895, (byte) 6), + IRON_ORE_20(20423,20444, (byte) 6), + IRON_ORE_21(20422,20443, (byte) 6), + IRON_ORE_22(20425,20407, (byte) 6), + IRON_ORE_23(20424,20445, (byte) 6), + IRON_ORE_24(19002,19005, (byte) 6), + IRON_ORE_25(19001,19004, (byte) 6), + IRON_ORE_26(19000,19003, (byte) 6), + IRON_ORE_27(21281,21296, (byte) 6), + IRON_ORE_28(21283,21298, (byte) 6), + IRON_ORE_29(21282,21297, (byte) 6), + IRON_ORE_30(29221,29218, (byte) 6), + IRON_ORE_31(29223,29220, (byte) 6), + IRON_ORE_32(29222,29219, (byte) 6), + IRON_ORE_33(32441,33400, (byte) 6), + IRON_ORE_34(32443,33402, (byte) 6), + IRON_ORE_35(32442,33401, (byte) 6), + IRON_ORE_36(32452,32448, (byte) 6), + IRON_ORE_37(32451,32447, (byte) 6), + IRON_ORE_38(31073,37650, (byte) 6), + IRON_ORE_39(31072,37649, (byte) 6), + IRON_ORE_40(31071,37639, (byte) 6), + IRON_ORE_41(37307,11552, (byte) 6), + IRON_ORE_42(37309,11554, (byte) 6), + IRON_ORE_43(37308,11553, (byte) 6), + IRON_ORE_49(42034,450, (byte) 6), + + //Silver + SILVER_ORE_0( 2101, 452, (byte) 7), + SILVER_ORE_1( 2100, 450, (byte) 7), + SILVER_ORE_2( 6945, 21296, (byte) 7), + SILVER_ORE_3( 6946, 21297, (byte) 7), + SILVER_ORE_4( 9716, 18954, (byte) 7), + SILVER_ORE_5( 9714, 32447, (byte) 7), + SILVER_ORE_6( 9715, 32448, (byte) 7), + SILVER_ORE_7( 11188,21298, (byte) 7), + SILVER_ORE_8( 11186,21296, (byte) 7), + SILVER_ORE_9( 11187,21297, (byte) 7), + SILVER_ORE_10(15581,14834, (byte) 7), + SILVER_ORE_11(15580,14833, (byte) 7), + SILVER_ORE_12(15579,14832, (byte) 7), + SILVER_ORE_13(16998,14915, (byte) 7), + SILVER_ORE_14(16999,14916, (byte) 7), + SILVER_ORE_15(17007,14915, (byte) 7), + SILVER_ORE_16(17000,31061, (byte) 7), + SILVER_ORE_17(17009,31061, (byte) 7), + SILVER_ORE_18(17008,14916, (byte) 7), + SILVER_ORE_19(17385,32447, (byte) 7), + SILVER_ORE_20(17387,18954, (byte) 7), + SILVER_ORE_21(17386,32448, (byte) 7), + SILVER_ORE_22(29225,29219, (byte) 7), + SILVER_ORE_23(29224,29218, (byte) 7), + SILVER_ORE_24(29226,29220, (byte) 7), + SILVER_ORE_25(32445,33401, (byte) 7), + SILVER_ORE_26(32444,33400, (byte) 7), + SILVER_ORE_27(32446,33402, (byte) 7), + SILVER_ORE_28(31075,37649, (byte) 7), + SILVER_ORE_29(31074,37639, (byte) 7), + SILVER_ORE_30(31076,37650, (byte) 7), + SILVER_ORE_31(37305,11553, (byte) 7), + SILVER_ORE_32(37304,11552, (byte) 7), + SILVER_ORE_33(37306,11554, (byte) 7), + SILVER_ORE_34(37670,11552, (byte) 7), + SILVER_ORE_35(11948,11555, (byte) 7), + SILVER_ORE_36(11949,11556, (byte) 7), + SILVER_ORE_37(11950,11557, (byte) 7), + SILVER_ORE_38(2311, 11552, (byte) 7), + + //Coal + COAL_0( 2097, 452, (byte) 8), + COAL_1( 2096, 450, (byte) 8), + COAL_2( 4985, 4994, (byte) 8), + COAL_3( 4986, 4995, (byte) 8), + COAL_4( 4987, 4996, (byte) 8), + COAL_5( 4676, 450, (byte) 8), + COAL_6( 10948,10944, (byte) 8), + COAL_7( 11964,11556, (byte) 8), + COAL_8( 11965,11557, (byte) 8), + COAL_9( 11963,11555, (byte) 8), + COAL_10(11932,11554, (byte) 8), + COAL_11(11930,11552, (byte) 8), + COAL_12(11931,11553, (byte) 8), + COAL_13(15246,15249, (byte) 8), + COAL_14(15247,15250, (byte) 8), + COAL_15(15248,15251, (byte) 8), + COAL_16(14852,25373, (byte) 8), + COAL_17(14851,25372, (byte) 8), + COAL_18(14850,25371, (byte) 8), + COAL_19(20410,20443, (byte) 8), + COAL_20(20411,20444, (byte) 8), + COAL_21(20412,20445, (byte) 8), + COAL_22(20413,20407, (byte) 8), + COAL_23(18999,19005, (byte) 8), + COAL_24(18998,19004, (byte) 8), + COAL_25(18997,19003, (byte) 8), + COAL_26(21287,21296, (byte) 8), + COAL_27(21289,21298, (byte) 8), + COAL_28(21288,21297, (byte) 8), + COAL_29(23565,21298, (byte) 8), + COAL_30(23564,21297, (byte) 8), + COAL_31(23563,21296, (byte) 8), + COAL_32(29215,29218, (byte) 8), + COAL_33(29217,29220, (byte) 8), + COAL_34(29216,29219, (byte) 8), + COAL_35(32426,33400, (byte) 8), + COAL_36(32427,33401, (byte) 8), + COAL_37(32428,33402, (byte) 8), + COAL_38(32450,32448, (byte) 8), + COAL_39(32449,32447, (byte) 8), + COAL_40(31068,37639, (byte) 8), + COAL_41(31069,37649, (byte) 8), + COAL_42(31070,37650, (byte) 8), + COAL_43(31168,14833, (byte) 8), + COAL_44(31169,14834, (byte) 8), + COAL_45(31167,14832, (byte) 8), + COAL_46(37699,21298, (byte) 8), + COAL_47(37698,21297, (byte) 8), + COAL_48(37697,21296, (byte) 8), + COAL_49(42035,452, (byte) 8), + + //Gold + GOLD_ORE_0( 2099, 452, (byte) 9), + GOLD_ORE_1( 2098, 450, (byte) 9), + GOLD_ORE_2( 2611, 21298, (byte) 9), + GOLD_ORE_3( 2610, 21297, (byte) 9), + GOLD_ORE_4( 2609, 21296, (byte) 9), + GOLD_ORE_5( 9722, 18954, (byte) 9), + GOLD_ORE_6( 9720, 32447, (byte) 9), + GOLD_ORE_7( 9721, 32448, (byte) 9), + GOLD_ORE_8( 11183,21296, (byte) 9), + GOLD_ORE_9( 11184,21297, (byte) 9), + GOLD_ORE_10(11185,21298, (byte) 9), + GOLD_ORE_11(11952,11556, (byte) 9), + GOLD_ORE_12(11953,11557, (byte) 9), + GOLD_ORE_13(11951,11555, (byte) 9), + GOLD_ORE_14(15578,14834, (byte) 9), + GOLD_ORE_15(15577,14833, (byte) 9), + GOLD_ORE_16(15576,14832, (byte) 9), + GOLD_ORE_17(17002,14916, (byte) 9), + GOLD_ORE_18(17003,31061, (byte) 9), + GOLD_ORE_19(17001,14915, (byte) 9), + GOLD_ORE_20(21291,21297, (byte) 9), + GOLD_ORE_21(21290,21296, (byte) 9), + GOLD_ORE_22(21292,21298, (byte) 9), + GOLD_ORE_23(32433,33401, (byte) 9), + GOLD_ORE_24(32432,33400, (byte) 9), + GOLD_ORE_25(32434,33402, (byte) 9), + GOLD_ORE_26(31065,37639, (byte) 9), + GOLD_ORE_27(31066,37649, (byte) 9), + GOLD_ORE_28(31067,37650, (byte) 9), + GOLD_ORE_29(37311,11553, (byte) 9), + GOLD_ORE_30(37310,11552, (byte) 9), + GOLD_ORE_31(37312,11554, (byte) 9), + GOLD_ORE_32(37471,15249, (byte) 9), + GOLD_ORE_33(37473,15251, (byte) 9), + GOLD_ORE_34(37472,15250, (byte) 9), + GOLD_ORE_49(42033,452, (byte) 9), + + //Mithril + MITHRIL_ORE_0( 2103, 452, (byte) 10), + MITHRIL_ORE_1( 2102, 450, (byte) 10), + MITHRIL_ORE_2( 4988, 4994, (byte) 10), + MITHRIL_ORE_3( 4989, 4995, (byte) 10), + MITHRIL_ORE_4( 4990, 4996, (byte) 10), + MITHRIL_ORE_5( 11943,11553, (byte) 10), + MITHRIL_ORE_6( 11942,11552, (byte) 10), + MITHRIL_ORE_7( 11945,11555, (byte) 10), + MITHRIL_ORE_8( 11944,11554, (byte) 10), + MITHRIL_ORE_9( 11947,11557, (byte) 10), + MITHRIL_ORE_10(11946,11556, (byte) 10), + MITHRIL_ORE_11(14855,25373, (byte) 10), + MITHRIL_ORE_12(14854,25372, (byte) 10), + MITHRIL_ORE_13(14853,25371, (byte) 10), + MITHRIL_ORE_14(16687,450, (byte) 10), + MITHRIL_ORE_15(20421,20407, (byte) 10), + MITHRIL_ORE_16(20420,20445, (byte) 10), + MITHRIL_ORE_17(20419,20444, (byte) 10), + MITHRIL_ORE_18(20418,20443, (byte) 10), + MITHRIL_ORE_19(19012,19021, (byte) 10), + MITHRIL_ORE_20(19013,19016, (byte) 10), + MITHRIL_ORE_21(19014,19017, (byte) 10), + MITHRIL_ORE_22(21278,21296, (byte) 10), + MITHRIL_ORE_23(21279,21297, (byte) 10), + MITHRIL_ORE_24(21280,21298, (byte) 10), + MITHRIL_ORE_25(25369,10586, (byte) 10), + MITHRIL_ORE_26(25368,10585, (byte) 10), + MITHRIL_ORE_27(25370,10587, (byte) 10), + MITHRIL_ORE_28(29236,29218, (byte) 10), + MITHRIL_ORE_29(29237,29219, (byte) 10), + MITHRIL_ORE_30(29238,29220, (byte) 10), + MITHRIL_ORE_31(32439,33401, (byte) 10), + MITHRIL_ORE_32(32438,33400, (byte) 10), + MITHRIL_ORE_33(32440,33402, (byte) 10), + MITHRIL_ORE_34(31087,37649, (byte) 10), + MITHRIL_ORE_35(31086,37639, (byte) 10), + MITHRIL_ORE_36(31088,37650, (byte) 10), + MITHRIL_ORE_37(31170,14832, (byte) 10), + MITHRIL_ORE_38(31171,14833, (byte) 10), + MITHRIL_ORE_39(31172,14834, (byte) 10), + MITHRIL_ORE_40(37692,21296, (byte) 10), + MITHRIL_ORE_41(37693,21297, (byte) 10), + MITHRIL_ORE_42(37694,21298, (byte) 10), + MITHRIL_ORE_49(42036,452, (byte) 10), + + //Adamant + ADAMANTITE_ORE_0( 2105, 452, (byte) 11), + ADAMANTITE_ORE_1( 2104, 450, (byte) 11), + ADAMANTITE_ORE_2( 4991, 4994, (byte) 11), + ADAMANTITE_ORE_3( 4992, 4995, (byte) 11), + ADAMANTITE_ORE_4( 4993, 4996, (byte) 11), + ADAMANTITE_ORE_5( 11941,11554, (byte) 11), + ADAMANTITE_ORE_6( 11940,11553, (byte) 11), + ADAMANTITE_ORE_7( 11939,11552, (byte) 11), + ADAMANTITE_ORE_8( 14864,25373, (byte) 11), + ADAMANTITE_ORE_9( 14863,25372, (byte) 11), + ADAMANTITE_ORE_10(14862,25371, (byte) 11), + ADAMANTITE_ORE_11(20417,20407, (byte) 11), + ADAMANTITE_ORE_12(20416,20445, (byte) 11), + ADAMANTITE_ORE_13(20414,20443, (byte) 11), + ADAMANTITE_ORE_14(20415,20444, (byte) 11), + ADAMANTITE_ORE_15(19020,19017, (byte) 11), + ADAMANTITE_ORE_16(19018,19021, (byte) 11), + ADAMANTITE_ORE_17(19019,19016, (byte) 11), + ADAMANTITE_ORE_18(21275,21296, (byte) 11), + ADAMANTITE_ORE_19(21276,21297, (byte) 11), + ADAMANTITE_ORE_20(21277,21298, (byte) 11), + ADAMANTITE_ORE_21(29233,29218, (byte) 11), + ADAMANTITE_ORE_22(29234,29219, (byte) 11), + ADAMANTITE_ORE_23(29235,29220, (byte) 11), + ADAMANTITE_ORE_24(32435,33400, (byte) 11), + ADAMANTITE_ORE_25(32437,33402, (byte) 11), + ADAMANTITE_ORE_26(32436,33401, (byte) 11), + ADAMANTITE_ORE_27(31083,37639, (byte) 11), + ADAMANTITE_ORE_28(31085,37650, (byte) 11), + ADAMANTITE_ORE_29(31084,37649, (byte) 11), + ADAMANTITE_ORE_30(31173,14832, (byte) 11), + ADAMANTITE_ORE_31(31174,14833, (byte) 11), + ADAMANTITE_ORE_32(31175,14834, (byte) 11), + ADAMANTITE_ORE_33(37468,15249, (byte) 11), + ADAMANTITE_ORE_34(37469,15250, (byte) 11), + ADAMANTITE_ORE_35(37470,15251, (byte) 11), + ADAMANTITE_ORE_36(37689,21296, (byte) 11), + ADAMANTITE_ORE_37(37690,21297, (byte) 11), + ADAMANTITE_ORE_38(37691,21298, (byte) 11), + ADAMANTITE_ORE_39(42037,452, (byte) 11), + + //Runite + RUNITE_ORE_0( 2107, 452, (byte) 12), + RUNITE_ORE_1( 2106, 450, (byte) 12), + RUNITE_ORE_2( 6669, 21296, (byte) 12), + RUNITE_ORE_3( 6671, 21298, (byte) 12), + RUNITE_ORE_4( 6670, 21297, (byte) 12), + RUNITE_ORE_5( 14861,25373, (byte) 12), + RUNITE_ORE_6( 14860,25372, (byte) 12), + RUNITE_ORE_7( 14859,25371, (byte) 12), + RUNITE_ORE_8( 33079,33401, (byte) 12), + RUNITE_ORE_9( 33078,33400, (byte) 12), + RUNITE_ORE_10(37208,21296, (byte) 12), + RUNITE_ORE_11(37465,15249, (byte) 12), + RUNITE_ORE_12(37466,15250, (byte) 12), + RUNITE_ORE_13(37467,15251, (byte) 12), + RUNITE_ORE_14(37695,21297, (byte) 12), + RUNITE_ORE_15(37696,21298, (byte) 12), + + //Gem rocks + GEM_ROCK_0(23567,21297, (byte) 13), + GEM_ROCK_1(23566,21296, (byte) 13), + GEM_ROCK_2(23568,21298, (byte) 13), + + //Rune essence + RUNE_ESSENCE(2491, -1, (byte) 14), + + //Sandstone + SANDSTONE(10946,10944, (byte) 15), + + //Granite + GRANITE(10947,10945, (byte) 16), + + //Rubium? + RUBIUM(29746,29747, (byte) 17); + + + + public static List gemRockGems = new ArrayList<>(); + static { + gemRockGems.add(new WeightedChanceItem(1625, 1, 60)); //uncut Opal + gemRockGems.add(new WeightedChanceItem(1627, 1, 30)); //uncut Jade + gemRockGems.add(new WeightedChanceItem(1629, 1, 15)); //uncut Red Topaz + gemRockGems.add(new WeightedChanceItem(1623, 1, 9)); //uncut Sapphire + gemRockGems.add(new WeightedChanceItem(1621, 1, 5)); //uncut Emerald + gemRockGems.add(new WeightedChanceItem(1619, 1, 5)); //uncut Ruby + gemRockGems.add(new WeightedChanceItem(1617, 1, 4)); //uncut Diamond + } + int full,empty,respawnRate,reward,level; + double rate,experience; + byte identifier; + + MiningNode(int full, int empty, byte identifier){ + this.full = full; + this.empty = empty; + this.identifier = identifier; + switch(identifier & 0xFF) { + case 1: + case 2: + respawnRate = 4 | 8 << 16; + experience = 17.5; + rate = 0.05; + reward = identifier == 1 ? 436 : 438; + level = 1; + break; + case 3: + respawnRate = 1 | 1 << 16; + experience = 5.0; + rate = 0.1; + reward = 434; + level = 1; + break; + case 4: + respawnRate = 10 | 20 << 16; + experience = 26.5; + rate = 0.2; + reward = 3211; + level = 10; + break; + case 5: + respawnRate = 10 | 20 << 16; + experience = 17.5; + rate = 0.2; + reward = 668; + level = 10; + break; + case 6: + respawnRate = 15 | 25 << 16; + experience = 35.0; + rate = 0.2; + reward = 440; + level = 15; + break; + case 7: + respawnRate = 100 | 200 << 16; + experience = 40.0; + rate = 0.3; + reward = 442; + level = 20; + break; + case 8: + respawnRate = 50 | 100 << 16; + experience = 50.0; + rate = 0.4; + reward = 453; + level = 30; + break; + case 9: + respawnRate = 100 | 200 << 16; + experience = 65.0; + rate = 0.6; + reward = 444; + level = 40; + break; + case 10: + respawnRate = 200 | 400 << 16; + experience = 80.0; + rate = 0.70; + reward = 447; + level = 55; + break; + case 11: + respawnRate = 400 | 800 << 16; + experience = 95.0; + rate = 0.85; + reward = 449; + level = 70; + break; + case 12: + respawnRate = 1250 | 2500 << 16; + experience = 125.0; + rate = 0.95; + reward = 451; + level = 85; + break; + case 13: + respawnRate = 166 | 175 << 16; + experience = 65; + rate = 0.95; + reward = 1625; + level = 40; + break; + case 14: + respawnRate = 1 | 1 << 16; + experience = 5.0; + rate = 0.1; + reward = 1436; + level = 1; + break; + case 15: + respawnRate = 30 | 60 << 16; + experience = 30.0; + rate = 0.2; + reward = 6971; + level = 35; + break; + case 16: + respawnRate = 10 | 20 << 16; + experience = 50.0; + rate = 0.2; + reward = 6979; + level = 45; + break; + case 17: + respawnRate = 50 | 100 << 16; + experience = 17.5; + rate = 0.6; + reward = 12630; + level = 46; + } + } + private static HashMap NODE_MAP = new HashMap<>(); + private static HashMap EMPTY_MAP = new HashMap<>(); + static{ + for(MiningNode node : MiningNode.values()){ + NODE_MAP.putIfAbsent(node.full,node); + } + for(MiningNode node : MiningNode.values()){ + EMPTY_MAP.putIfAbsent(node.empty,node.full); + } + } + + public static MiningNode forId(int id){ + return NODE_MAP.get(id); + } + + public static boolean isEmpty(int id){ + return EMPTY_MAP.get(id) != null; + } + + public int getRewardAmount() { + return 1; + } + + public int getEmptyId() { + return empty; + } + + public int getReward() { + return reward; + } + + public double getExperience() { + return experience; + } + + public int getRespawnRate() { + return respawnRate; + } + + public double getRate() { + return rate; + } + + public int getLevel() { + return level; + } + + public int getId() { + return full; + } + + public int getMinimumRespawn() { + return respawnRate & 0xFFFF; + } + + public int getMaximumRespawn() { + return (respawnRate >> 16) & 0xFFFF; + } + + public int getRespawnDuration() { + int minimum = respawnRate & 0xFFFF; + int maximum = (respawnRate >> 16) & 0xFFFF; + double playerRatio = ServerConstants.MAX_PLAYERS / Repository.getPlayers().size(); + return (int) (minimum + ((maximum - minimum) / playerRatio)); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningSkillPulse.kt b/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningSkillPulse.kt new file mode 100644 index 000000000..1a6657ba4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/gather/mining/MiningSkillPulse.kt @@ -0,0 +1,366 @@ +package core.game.node.entity.skill.gather.mining + +import core.cache.def.impl.ItemDefinition +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import core.game.content.quest.tutorials.tutorialisland.TutorialSession +import core.game.content.quest.tutorials.tutorialisland.TutorialStage +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.gather.SkillingTool +import core.game.content.dialogue.FacialExpression +import core.tools.RandomFunction +import core.game.content.global.SkillingPets +import core.game.container.impl.EquipmentContainer +import core.tools.Items +import core.game.world.map.path.Pathfinder +import core.game.node.entity.player.link.diary.DiaryType +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.`object`.ObjectBuilder +import core.game.node.entity.impl.Animator +import core.game.world.GameWorld +import core.game.node.item.ChanceItem +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.stats.STATS_BASE +import core.game.node.entity.player.info.stats.STATS_ROCKS +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.world.map.Location +import core.tools.StringUtils +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks +import core.tools.stringtools.colorize + +/** + * Mining skill pulse + * @author ceik + */ +class MiningSkillPulse(private val player: Player, private val node: Node) : Pulse(1, player, node) { + private var resource: MiningNode? = null + private var isMiningEssence = false + private var isMiningGems = false + private var ticks = 0 + protected var resetAnimation = true + fun message(type: Int) { + if (type == 0) { + player.packetDispatch.sendMessage("You swing your pickaxe at the rock...") + } + } + + override fun pulse(): Boolean { + if (!checkRequirements()) { + return true + } + animate() + return reward() + } + + override fun stop() { + if (resetAnimation) { + player.animate(Animation(-1, Animator.Priority.HIGH)) + } + super.stop() + message(1) + } + + override fun start() { + resource = MiningNode.forId(node.id) + if (MiningNode.isEmpty(node.id)) { + player.packetDispatch.sendMessage("This rock contains no ore.") + } + if (resource == null) { + return + } + if (resource!!.id == 2491) { + isMiningEssence = true + } + if (resource!!.identifier == MiningNode.GEM_ROCK_0.identifier) { + isMiningGems = true + } + if (TutorialSession.getExtension(player).stage == 35) { + TutorialStage.load(player, 36, false) + } + if (checkRequirements()) { + super.start() + message(0) + } + } + + fun checkRequirements(): Boolean { + if (player.skills.getLevel(Skills.MINING) < resource!!.getLevel()) { + player.packetDispatch.sendMessage("You need a mining level of " + resource!!.getLevel() + " to mine this rock.") + return false + } + if (SkillingTool.getPickaxe(player) == null) { + player.packetDispatch.sendMessage("You do not have a pickaxe to use.") + return false + } + if (player.inventory.freeSlots() < 1) { + player.dialogueInterpreter.sendDialogue("Your inventory is too full to hold any more " + ItemDefinition.forId(resource!!.getReward()).name.toLowerCase() + ".") + return false + } + return true + } + + fun animate() { + player.animate(SkillingTool.getPickaxe(player).animation) + } + + fun reward(): Boolean { + if (++ticks % (if (isMiningEssence) 3 else 4) != 0) { + return false + } + if (node.id == 10041) { + player.dialogueInterpreter.sendDialogues(2574, FacialExpression.FURIOUS, if (RandomFunction.random(2) == 1) "You'll blow my cover! I'm meant to be hidden!" else "Will you stop that?") + return true + } + if (!checkReward()) { + return false + } + + //Handle tutorial stuff + val tutorialStage = TutorialSession.getExtension(player).stage + if (tutorialStage == 36 && node.id == 3042) { + TutorialStage.load(player, 38, false) + } else if (tutorialStage == 36 && node.id == 3043) { + TutorialStage.load(player, 37, false) + } + if (tutorialStage == 38 && node.id == 3043) { + TutorialStage.load(player, 39, false) + } else if (tutorialStage == 37 && node.id == 3042) { + TutorialStage.load(player, 39, false) + } + + //actual reward calculations + var reward = resource!!.getReward() + var rewardAmount = 0 + if (reward > 0) { + reward = calculateReward(reward) // calculate rewards + rewardAmount = calculateRewardAmount(reward) // calculate amount + /** + * Code for randomly detaching the pickaxe handle from the pickaxe head and sending the head flying + */ + if (RandomFunction.random(1,750) == 390) { + destroyPickaxe(player, SkillingTool.getPickaxe(player)) + return true + } else { + applyAchievementTask(reward) // apply achievements + SkillingPets.checkPetDrop(player, SkillingPets.GOLEM) // roll for pet + + //add experience + val experience = resource!!.getExperience() * rewardAmount + player.skills.addExperience(Skills.MINING, experience, true) + + //Handle bracelet of clay + if(reward == Items.CLAY_434){ + val bracelet = player.equipment.get(EquipmentContainer.SLOT_HANDS) + if(bracelet != null && bracelet.id == Items.BRACELET_OF_CLAY_11074){ + if(bracelet.charge > 28) bracelet.charge = 28 + bracelet.charge-- + reward = Items.SOFT_CLAY_1761 + player.sendMessage("Your bracelet of clay softens the clay for you.") + if(bracelet.charge <= 0){ + player.sendMessage("Your bracelet of clay crumbles to dust.") + player.equipment.remove(bracelet) + } + } + } + + //send the message for the resource reward + if (isMiningGems) { + val gemName = ItemDefinition.forId(reward).name.toLowerCase() + player.sendMessage("You get " + (if (StringUtils.isPlusN(gemName)) "an" else "a") + " " + gemName + ".") + } else { + player.packetDispatch.sendMessage("You get some " + ItemDefinition.forId(reward).name.toLowerCase() + ".") + } + //give the reward + player.inventory.add(Item(reward, rewardAmount)) + var rocksMined = player.getAttribute("$STATS_BASE:$STATS_ROCKS",0) + player.setAttribute("/save:$STATS_BASE:$STATS_ROCKS",++rocksMined) + + //calculate bonus gem for mining + if (!isMiningEssence) { + var chance = 282 + var altered = false + if (Item(player.equipment.getId(12)).name.toLowerCase().contains("ring of wealth")) { + chance = (chance / 1.5).toInt() + altered = true + } + val necklace = player.equipment[EquipmentContainer.SLOT_AMULET] + if (necklace != null && necklace.id > 1705 && necklace.id < 1713) { + chance = (chance / 1.5).toInt() + altered = true + } + if (RandomFunction.random(chance) == chance / 2) { + val gem = RandomFunction.rollChanceTable(true, *GEM_REWARDS)[0] + player.packetDispatch.sendMessage("You find a " + gem.name + "!") + if (!player.inventory.add(gem, player)) { + player.packetDispatch.sendMessage("You do not have enough space in your inventory, so you drop the gem on the floor.") + } + } + } + } + + //transform to depleted version + if (!isMiningEssence && resource!!.getRespawnRate() != 0) { + ObjectBuilder.replace(node as GameObject, GameObject(resource!!.emptyId, node.getLocation(), node.rotation), resource!!.respawnDuration) + node.setActive(false) + return true + } + } + return false + } + + private fun destroyPickaxe(player: Player, pickaxe: SkillingTool) { + if(pickaxe.name.contains("adze")){ + return + } + val radius = 2 + val l = player.location.transform(RandomFunction.random(-radius, radius), RandomFunction.random(-radius, radius), 0) + val p = Pathfinder.find(player.location, l).points.last + val headSpawn = Location(p.x, p.y, player.location.z) + val headID = + when (pickaxe.id) { + 1265 -> 480 + 1267 -> 482 + 1269 -> 484 + 1271 -> 488 + 1273 -> 486 + 1275 -> 490 + else -> 0 + } + val pickItem = Item(pickaxe.id) + if(player.equipment.containsItem(pickItem)){ + val realItem = player.equipment.getItem(pickItem) + player.equipment.remove(pickItem) + player.equipment.add(Item(466),realItem.slot,false,false) + player.equipment.refresh() + } else if(player.inventory.containsItem(pickItem)) { + player.inventory.remove(pickItem) + player.inventory.add(Item(466)) + } + player.audioManager.send(17) + player.sendMessage(colorize("%RThe head of your pickaxe snaps off and goes flying!")) + GroundItemManager.create(Item(headID),headSpawn,player) + } + + private fun calculateRewardAmount(reward: Int): Int { + var amount = 1 + + //checks for varrock armor from varrock diary and rolls chance at extra ore + if (!isMiningEssence && player.achievementDiaryManager.getDiary(DiaryType.VARROCK).level != -1) { + when (reward) { + Items.CLAY_434, Items.COPPER_ORE_436, Items.TIN_ORE_438, Items.LIMESTONE_3211, Items.BLURITE_ORE_668, Items.IRON_ORE_440, Items.ELEMENTAL_ORE_2892, Items.SILVER_ORE_442, Items.COAL_453 -> if (player.achievementDiaryManager.armour >= 0 && RandomFunction.random(100) <= 10) { + amount += 1 + player.sendMessage("The Varrock armour allows you to mine an additional ore.") + } + Items.GOLD_ORE_444, Items.GRANITE_500G_6979, Items.GRANITE_2KG_6981, Items.GRANITE_5KG_6983, Items.MITHRIL_ORE_447 -> if (player.achievementDiaryManager.armour >= 1 && RandomFunction.random(100) <= 10) { + amount += 1 + player.sendMessage("The Varrock armour allows you to mine an additional ore.") + } + Items.ADAMANTITE_ORE_449 -> if (player.achievementDiaryManager.armour >= 2 && RandomFunction.random(100) <= 10) { + amount += 1 + player.sendMessage("The Varrock armour allows you to mine an additional ore.") + } + } + } + + //check for bonus ore from shooting star buff + if (player.hasActiveState("shooting-star")) { + if (RandomFunction.getRandom(5) == 3) { + player.packetDispatch.sendMessage("...you manage to mine a second ore thanks to the Star Sprite.") + amount += 1 + } + } + return amount + } + + private fun calculateReward(reward: Int): Int { + // If the player is mining sandstone or granite, then get size of sandstone/granite and xp reward for that size + var reward = reward + if (resource == MiningNode.SANDSTONE || resource == MiningNode.GRANITE) { + val value = RandomFunction.randomize(if (resource == MiningNode.GRANITE) 3 else 4) + reward += value shl 1 + player.skills.addExperience(Skills.MINING, value * 10.toDouble(), true) + } else if (isMiningEssence && player.skills.getLevel(Skills.MINING) >= 30) { + reward = 7936 + } else if (isMiningGems) { + reward = RandomFunction.rollWeightedChanceTable(MiningNode.gemRockGems).id + } + return reward + } + + /** + * Checks if the has completed any achievements from their diary + */ + private fun applyAchievementTask(reward: Int) { + // Mine some Iron in the south east mining patch near Varrock + if (reward == Items.IRON_ORE_440 && player.location.withinDistance(Location.create(3285, 3363, 0))) { + player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 0, 2) + } + + // Mine some limestone near Paterdomus, the temple to the east

of Varrock + if (reward == Items.LIMESTONE_3211 && player.location.withinDistance(Location.create(3372, 3500, 0))) { + player.achievementDiaryManager.finishTask(player, DiaryType.VARROCK, 0, 15) + } + + // Mine some gold from the rocks on the north-west

peninsula of Karamja + if (reward == Items.GOLD_ORE_444 && player.location.withinDistance(Location.create(2733, 3225, 0))) { + player.achievementDiaryManager.finishTask(player, DiaryType.KARAMJA, 0, 2) + } + + // Mine a red topaz from a gem rock + if (reward == Items.UNCUT_RED_TOPAZ_1629 && (player.viewport.region.id == 11310 || player.viewport.region.id == 11410)) { + player.achievementDiaryManager.finishTask(player, DiaryType.KARAMJA, 1, 18) + } + + // Mine some clay in the Mining patch north of the Champions'

Guild + if (reward == Items.CLAY_434 && player.viewport.region.id == 12596) { + player.achievementDiaryManager.finishTask(player, DiaryType.LUMBRIDGE, 0, 5) + } + + // Mine some copper in the Mining spot to the south-east of

Lumbridge Swamp + if (reward == Items.COPPER_ORE_436 && player.viewport.region.id == 12849) { + player.achievementDiaryManager.finishTask(player, DiaryType.LUMBRIDGE, 0, 12) + } + + // Mine some iron ore from the Al Kharid Mining spot + if (reward == Items.IRON_ORE_440 && player.viewport.region.id == 13107) { + player.achievementDiaryManager.finishTask(player, DiaryType.LUMBRIDGE, 1, 0) + } + + // Mine some silver from the mining spot north of Al Kharid + if (reward == Items.SILVER_ORE_442 && player.viewport.region.id == 13107) { + player.achievementDiaryManager.finishTask(player, DiaryType.LUMBRIDGE, 2, 10) + } + + // Mine some coal in the Mining spot south-west of Lumbridge

Swamp + if (reward == Items.COAL_453 && player.viewport.region.id == 12593) { + player.achievementDiaryManager.finishTask(player, DiaryType.LUMBRIDGE, 2, 11) + } + } + + /** + * Checks if the player gets rewarded. + * @return `True` if so. + */ + private fun checkReward(): Boolean { + val skill = Skills.MINING + val level = 1 + player.skills.getLevel(skill) + player.familiarManager.getBoost(skill) + val hostRatio = Math.random() * (100.0 * resource!!.getRate()) + var toolRatio = SkillingTool.getPickaxe(player).ratio + if(SkillcapePerks.isActive(SkillcapePerks.PRECISION_MINER,player)){ + toolRatio += 0.075 + } + val clientRatio = Math.random() * ((level - resource!!.getLevel()) * (1.0 + toolRatio)) + return hostRatio < clientRatio + } + + companion object { + private val GEM_REWARDS = arrayOf(ChanceItem(1623, 1, DropFrequency.COMMON), ChanceItem(1621, 1, DropFrequency.COMMON), ChanceItem(1619, 1, DropFrequency.UNCOMMON), ChanceItem(1617, 1, DropFrequency.RARE)) + } + + init { + super.stop() + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/gather/woodcutting/WoodcuttingNode.java b/Server/src/main/java/Server/core/game/node/entity/skill/gather/woodcutting/WoodcuttingNode.java new file mode 100644 index 000000000..7bdbdb0b0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/gather/woodcutting/WoodcuttingNode.java @@ -0,0 +1,384 @@ +package core.game.node.entity.skill.gather.woodcutting; + +import core.ServerConstants; +import core.game.world.repository.Repository; + +import java.util.HashMap; + +/** + * Woodcutting nodes + * @author ceik + */ +public enum WoodcuttingNode { + //standard trees + STANDARD_TREE_1( 1276, 1342, (byte) 1), + STANDARD_TREE_2( 1277, 1343, (byte) 1), + STANDARD_TREE_3( 1278, 1342, (byte) 1), + STANDARD_TREE_4( 1279, 1345, (byte) 1), + STANDARD_TREE_5( 1280, 1343, (byte) 1), + STANDARD_TREE_6( 1330, 1341, (byte) 1), + STANDARD_TREE_7( 1331, 1341, (byte) 1), + STANDARD_TREE_8( 1332, 1341, (byte) 1), + STANDARD_TREE_9( 2409, 1342, (byte) 1), + STANDARD_TREE_10(3033, 1345, (byte) 1), + STANDARD_TREE_11(3034, 1345, (byte) 1), + STANDARD_TREE_12(3035, 1347, (byte) 1), + STANDARD_TREE_13(3036, 1351, (byte) 1), + STANDARD_TREE_14(3879, 3880, (byte) 1), + STANDARD_TREE_15(3881, 3880, (byte) 1), + STANDARD_TREE_16(3882, 3880, (byte) 1), + STANDARD_TREE_17(3883, 3884, (byte) 1), + STANDARD_TREE_18(10041,1342, (byte) 1), + STANDARD_TREE_19(14308,1342, (byte) 1), + STANDARD_TREE_20(14309,1342, (byte) 1), + STANDARD_TREE_21(16264,1342, (byte) 1), + STANDARD_TREE_22(16265,1342, (byte) 1), + STANDARD_TREE_23(30132,1342, (byte) 1), + STANDARD_TREE_24(30133,1342, (byte) 1), + STANDARD_TREE_25(37477,1342, (byte) 1), + STANDARD_TREE_26(37478,37653, (byte) 1), + STANDARD_TREE_27(37652,37653, (byte) 1), + + //Dead trees + DEAD_TREE_1( 1282, 1347, (byte) 2), + DEAD_TREE_2( 1283, 1347, (byte) 2), + DEAD_TREE_3( 1284, 1348, (byte) 2), + DEAD_TREE_4( 1285, 1349, (byte) 2), + DEAD_TREE_5( 1286, 1351, (byte) 2), + DEAD_TREE_6( 1289, 1353, (byte) 2), + DEAD_TREE_7( 1290, 1354, (byte) 2), + DEAD_TREE_8( 1291, 23054, (byte) 2), + DEAD_TREE_9( 1365, 1352, (byte) 2), + DEAD_TREE_10(1383, 1358, (byte) 2), + DEAD_TREE_11(1384, 1359, (byte) 2), + DEAD_TREE_12(5902, 1347, (byte) 2), + DEAD_TREE_13(5903, 1353, (byte) 2), + DEAD_TREE_14(5904, 1353, (byte) 2), + DEAD_TREE_15(32294,1353, (byte) 2), + DEAD_TREE_16(37481,1347, (byte) 2), + DEAD_TREE_17(37482,1351, (byte) 2), + DEAD_TREE_18(37483,1358, (byte) 2), + DEAD_TREE_19(24168,24169, (byte) 2), + + //Evergreen + EVERGREEN_1(1315,1342,(byte) 3), + EVERGREEN_2(1316,1355,(byte) 3), + EVERGREEN_3(1318,1355,(byte) 3), + EVERGREEN_4(1319,1355,(byte) 3), + + //Jungle stuff + JUNGLE_TREE_1(2887,0, (byte) 4), + JUNGLE_TREE_2(2889,0, (byte) 4), + JUNGLE_TREE_3(2890,0, (byte) 4), + JUNGLE_TREE_4(4818,0, (byte) 4), + JUNGLE_TREE_5(4820,0, (byte) 4), + + JUNGLE_BUSH_1(2892,2894, (byte) 5), + JUNGLE_BUSH_2(2893,2895, (byte) 5), + + //Achey + ACHEY_TREE(2023,3371, (byte) 6), + + //Oak + OAK_TREE_1(1281, 1356, (byte) 7), + OAK_TREE_2(3037, 1357, (byte) 7), + OAK_TREE_3(37479,1356, (byte) 7), + OAK_TREE_4(8467, 1356, (byte) 19, true), + + //Willow + WILLOW_TREE_1(1308, 7399, (byte) 8), + WILLOW_TREE_2(5551, 5554, (byte) 8), + WILLOW_TREE_3(5552, 5554, (byte) 8), + WILLOW_TREE_4(5553, 5554, (byte) 8), + WILLOW_TREE_5(37480,7399, (byte) 8), + WILLOW_TREE_6(8488,7399, (byte) 20, true), + + //Teak + TEAK_1(9036, 9037, (byte) 9), + TEAK_2(15062,9037, (byte) 9), + + //Maple + MAPLE_TREE_1(1307,7400, (byte) 10), + MAPLE_TREE_2(4674,7400, (byte) 10), + MAPLE_TREE_3(8444,7400, (byte) 21, true), + + //Hollow + HOLLOW_TREE_1(2289,2310, (byte) 11), + HOLLOW_TREE_2(4060,4061, (byte) 11), + + //Mahogany + MAHOGANY(9034,9035, (byte) 12), + + //Arctic pine + ARCTIC_PINE(21273,21274, (byte) 13), + + //Eucalyptus + EUCALYPTUS_1(28951,28954, (byte) 14), + EUCALYPTUS_2(28952,28955, (byte) 14), + EUCALYPTUS_3(28953,28956, (byte) 14), + + //Yew + YEW(1309,7402, (byte) 15), + YEW_1(8513,7402,(byte) 22, true), + + //Magic + MAGIC_TREE_1(1306, 7401, (byte) 16), + MAGIC_TREE_2(37823,37824, (byte) 16), + MAGIC_TREE_3(8409, 37824, (byte) 23, true), + + //Cursed Magic + CURSED_MAGIC_TREE(37821,37822, (byte) 17), + + //Dramen + DRAMEN_TREE(1292, -1, (byte) 18); + + + + int full,empty,reward,respawnRate,level, rewardAmount; + double experience,rate; + byte identifier; + boolean farming; + WoodcuttingNode(int full, int empty,byte identifier){ + this.full = full; + this.empty = empty; + this.identifier = identifier; + this.farming = false; + this.rewardAmount = 1; + switch(identifier & 0xFF){ + case 1: + case 2: + case 3: + case 4: + reward = 1511; + respawnRate = 50 | 100 << 16; + rate = 0.05; + experience = 25.0; + level = 1; + break; + case 5: + reward = 1511; + respawnRate = 50 | 100 << 16; + rate = 0.15; + experience = 100; + level = 1; + this.rewardAmount = 2; + break; + case 6: + reward = 2862; + respawnRate = 50 | 100 << 16; + rate = 0.05; + experience = 25.0; + level = 1; + break; + case 7: + reward = 1521; + respawnRate = 14 | 22 << 16; + rate = 0.15; + experience = 37.5; + level = 15; + rewardAmount = 10; + break; + case 8: + reward = 1519; + respawnRate = 14 | 22 << 16; + rate = 0.3; + experience = 67.8; + level = 30; + rewardAmount = 20; + break; + case 9: + reward = 6333; + respawnRate = 35 | 60 << 16; + rate = 0.7; + experience = 85.0; + level = 35; + rewardAmount = 25; + break; + case 10: + reward = 1517; + respawnRate = 58 | 100 << 16; + rate = 0.65; + experience = 100.0; + level = 45; + rewardAmount = 30; + break; + case 11: + reward = 3239; + respawnRate = 58 | 100 << 16; + rate = 0.6; + experience = 82.5; + level = 45; + rewardAmount = 30; + break; + case 12: + reward = 6332; + respawnRate = 62 | 115 << 16; + rate = 0.7; + experience = 125.0; + level = 50; + rewardAmount = 35; + break; + case 13: + reward = 10810; + respawnRate = 75 | 130 << 16; + rate = 0.73; + experience = 140.2; + level = 54; + rewardAmount = 35; + break; + case 14: + reward = 12581; + respawnRate = 80 | 140 << 16; + rate = 0.77; + experience = 165.0; + level = 58; + rewardAmount = 35; + break; + case 15: + reward = 1515; + respawnRate = 100 | 162 << 16; + rate = 0.8; + experience = 175.0; + level = 60; + rewardAmount = 40; + break; + case 16: + reward = 1513; + respawnRate = 200 | 317 << 16; + rate = 0.9; + experience = 250.0; + level = 75; + rewardAmount = 50; + break; + case 17: + reward = 1513; + respawnRate = 200 | 317 << 16; + rate = 0.95; + experience = 275.0; + level = 82; + rewardAmount = 50; + break; + case 18: + reward = 771; + respawnRate = -1; + rate = 0.05; + experience = 25.0; + level = 1; + rewardAmount = Integer.MAX_VALUE; + break; + } + } + WoodcuttingNode(int full, int empty, byte identifier, boolean farming){ + this.full = full; + this.empty = empty; + this.identifier = identifier; + this.farming = farming; + switch(identifier & 0xFF){ + case 19: + reward = 1521; + respawnRate = 14 | 22 << 16; + rate = 0.15; + experience = 37.5; + level = 15; + rewardAmount = 10; + break; + case 20: + reward = 1519; + respawnRate = 14 | 22 << 16; + rate = 0.3; + experience = 67.8; + level = 30; + rewardAmount = 20; + break; + case 21: + reward = 1517; + respawnRate = 58 | 100 << 16; + rate = 0.65; + experience = 100.0; + level = 45; + rewardAmount = 30; + break; + case 22: + reward = 1515; + respawnRate = 100 | 162 << 16; + rate = 0.8; + experience = 175.0; + level = 60; + rewardAmount = 40; + break; + case 23: + reward = 1513; + respawnRate = 200 | 317 << 16; + rate = 0.9; + experience = 250.0; + level = 75; + rewardAmount = 50; + break; + } + } + private static HashMap NODE_MAP = new HashMap<>(); + private static HashMap EMPTY_MAP = new HashMap<>(); + static{ + for(WoodcuttingNode node : WoodcuttingNode.values()){ + NODE_MAP.putIfAbsent(node.full,node); + EMPTY_MAP.putIfAbsent(node.empty,node.full); + } + } + + public static WoodcuttingNode forId(int id){ + return NODE_MAP.get(id); + } + + public static boolean isEmpty(int id){ + return EMPTY_MAP.get(id) != null; + } + + public int getRewardAmount() { + return rewardAmount; + } + + public int getEmptyId() { + return empty; + } + + public int getReward() { + return reward; + } + + public double getExperience() { + return experience; + } + + public int getRespawnRate() { + return respawnRate; + } + + public double getRate() { + return rate; + } + + public int getLevel() { + return level; + } + + public int getId() { + return full; + } + + public int getMinimumRespawn() { + return respawnRate & 0xFFFF; + } + + public int getMaximumRespawn() { + return (respawnRate >> 16) & 0xFFFF; + } + + public boolean isFarming(){ return farming;} + + public int getRespawnDuration() { + int minimum = respawnRate & 0xFFFF; + int maximum = (respawnRate >> 16) & 0xFFFF; + double playerRatio = ServerConstants.MAX_PLAYERS / Repository.getPlayers().size(); + return (int) (minimum + ((maximum - minimum) / playerRatio)); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/gather/woodcutting/WoodcuttingSkillPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/gather/woodcutting/WoodcuttingSkillPulse.java new file mode 100644 index 000000000..85d6b84cf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/gather/woodcutting/WoodcuttingSkillPulse.java @@ -0,0 +1,328 @@ +package core.game.node.entity.skill.gather.woodcutting; + +import core.cache.def.impl.ItemDefinition; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.farming.FarmingPatch; +import core.game.node.entity.skill.farming.Patch; +import core.tools.Items; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.BirdNest; +import core.game.content.global.SkillingPets; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.node.entity.impl.Animator; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks; + +import java.util.concurrent.TimeUnit; + +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_BASE; +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_LOGS; + +/** + * Woodcutting skill pulse + * + * @author ceik + */ +public class WoodcuttingSkillPulse extends Pulse { + private WoodcuttingNode resource; + private int ticks; + private Player player; + private GameObject node; + protected boolean resetAnimation = true; + + + public WoodcuttingSkillPulse(Player player, GameObject node) { + super(1, player, node); + this.player = player; + this.node = node; + super.stop(); + } + + public void message(int type) { + if (type == 0) { + player.getPacketDispatch().sendMessage("You swing your axe at the tree..."); + if (TutorialSession.getExtension(player).getStage() == 6) { + player.lock(7); + TutorialStage.load(player, 7, false); + } + } + } + + @Override + public boolean pulse() { + if (!checkRequirements()) { + return true; + } + animate(); + return reward(); + } + + @Override + public void stop() { + if (resetAnimation) { + player.animate(new Animation(-1, Animator.Priority.HIGH)); + } + super.stop(); + message(1); + } + + @Override + public void start() { + resource = WoodcuttingNode.forId(node.getId()); + if (resource == null) { + return; + } + if (checkRequirements()) { + super.start(); + message(0); + } + } + + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.WOODCUTTING) < resource.getLevel()) { + player.getPacketDispatch().sendMessage("You need a woodcutting level of " + resource.getLevel() + " to chop this tree."); + return false; + } + if (SkillingTool.getHatchet(player) == null) { + player.getPacketDispatch().sendMessage("You do not have a hatchet to use."); + return false; + } + if (player.getInventory().freeSlots() < 1) { + player.getDialogueInterpreter().sendDialogue("Your inventory is too full to hold any more " + ItemDefinition.forId(resource.getReward()).getName().toLowerCase() + "."); + return false; + } + return true; + } + + public void animate() { + player.animate(SkillingTool.getHatchet(player).getAnimation()); + } + + public boolean reward() { + if (++ticks % 4 != 0) { + return false; + } + if (node.getId() == 10041) { + player.getDialogueInterpreter().sendDialogues(2574, FacialExpression.FURIOUS, RandomFunction.random(2) == 1 ? "You'll blow my cover! I'm meant to be hidden!" : "Will you stop that?"); + return true; + } + if (!checkReward()) { + return false; + } + + int tutorialStage = TutorialSession.getExtension(player).getStage(); + + + // If player is in donator zone + if (player.getLocation().getRegionId() == 12102) { + player.getAntiMacroHandler().fireEvent("tree spirit"); + return true; + } + + // 20% chance to auto burn logs when using "inferno adze" item + if (SkillingTool.getHatchet(player).getId() == 13661 && RandomFunction.random(100) < 25) { + player.sendMessage("You chop some logs. The heat of the inferno adze incinerates them."); + Projectile.create(player, null, 1776, 35, 30, 20, 25).transform(player, new Location(player.getLocation().getX() + 2, player.getLocation().getY()), true, 25, 25).send(); + player.getSkills().addExperience(Skills.WOODCUTTING, resource.getExperience()); + player.getSkills().addExperience(Skills.FIREMAKING, resource.getExperience()); + return false; + } + + //actual reward calculations + int reward = resource.getReward(); + int rewardAmount = 0; + if (reward > 0) { + reward = calculateReward(reward); // calculate rewards + rewardAmount = calculateRewardAmount(reward); // calculate amount + SkillingPets.checkPetDrop(player, SkillingPets.BEAVER); // roll for pet + + //add experience + double experience = calculateExperience(resource.reward, rewardAmount); + + player.getSkills().addExperience(Skills.WOODCUTTING, experience, true); + + //send the message for the resource reward + if (resource == WoodcuttingNode.DRAMEN_TREE) { + player.getPacketDispatch().sendMessage("You cut a branch from the Dramen tree."); + } else { + player.getPacketDispatch().sendMessage("You get some " + ItemDefinition.forId(reward).getName().toLowerCase() + "."); + } + //give the reward + player.getInventory().add(new Item(reward, rewardAmount)); + int cutLogs = player.getAttribute(STATS_BASE + ":" + STATS_LOGS,0); + player.setAttribute("/save:" + STATS_BASE + ":" + STATS_LOGS,++cutLogs); + + //calculate bonus bird nest for mining + int chance = 282; + if (RandomFunction.random(chance) == chance / 2) { + if(SkillcapePerks.isActive(SkillcapePerks.NEST_HUNTER,player)){ + if(!player.getInventory().add(BirdNest.getRandomNest(false).getNest())){ + BirdNest.drop(player); + } + } else { + BirdNest.drop(player); + } + } + + applyAchievementTask(reward); // apply achievements + } + // Tutorial stuff, maybe? + if (tutorialStage == 7) { + TutorialStage.load(player, 8, false); + } + + //transform to depleted version + if (resource.getRespawnRate() != 0) { + int charge = 1000 / resource.getRewardAmount(); + node.setCharge(node.getCharge() - RandomFunction.random(charge, charge << 2)); + if (node.getCharge() < 1) { + node.setCharge(1000); + if (resource.isFarming()) { + FarmingPatch fPatch = FarmingPatch.forObject(node.asObject()); + if(fPatch != null) { + Patch patch = fPatch.getPatchFor(player); + patch.setCurrentState(patch.getCurrentState() + 1); + } + if(resource.getId() == 8513 && player.getLocation().getRegionId() == 11828){ + //Chop down a yew tree you grew in falador park + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR,2,3); + } + return true; + } + if (resource.getEmptyId() > -1) { + ObjectBuilder.replace(node, node.transform(resource.getEmptyId()), resource.getRespawnDuration()); + } else { + ObjectBuilder.replace(node, node.transform(0), resource.getRespawnDuration()); + } + node.setActive(false); + return true; + } + } + return false; + } + + private int calculateRewardAmount(int reward) { + int amount = 1; + + // 3239: Hollow tree (bark) 10% chance of obtaining + if (reward == 3239 && RandomFunction.random(100) >= 10) { + amount = 0; + } + + // Seers village medium reward - extra normal log while in seer's village + if (reward == 1511 + && player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(1) + && player.getViewport().getRegion().getId() == 10806) { + amount = 2; + } + + return amount; + } + + private double calculateExperience(int reward, int amount) { + double experience = resource.getExperience(); + + if(player.getLocation().getRegionId() == 10300){ + return 1.0; + } + + // Bark + if (reward == 3239) { + // If we receive the item, give the full experience points otherwise give the base amount + if (amount >= 1) { + experience = 275.2; + } else { + amount = 1; + } + } + + // Seers village medium reward - extra 10% xp from maples while wearing headband + if (reward == 1517 + && player.getAchievementDiaryManager().getDiary(DiaryType.SEERS_VILLAGE).isComplete(1) + && player.getEquipment().get(EquipmentContainer.SLOT_HAT) != null + && player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId() == 14631) { + experience *= 1.10; + } + + return experience * amount; + } + + private int calculateReward(int reward) { + return reward; + } + + /** + * Checks if the has completed any achievements from their diary + */ + private void applyAchievementTask(int reward) { + // Cut a log from a teak tree + if (reward == Items.TEAK_LOGS_6333) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 7); + } + // Cut a log from a mahogany tree + if (reward == Items.MAHOGANY_LOGS_6332) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 1, 8); + } + + int playerRegion = player.getViewport().getRegion().getId(); + + // Chop down a dying tree in the Lumber Yard + if (node.getId() == 24168 && playerRegion == 13110) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 6); + } + if (resource == WoodcuttingNode.YEW && playerRegion == 10806) { + if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 2, 1)) { + player.setAttribute("/save:diary:seers:cut-yew", player.getAttribute("diary:seers:cut-yew", 0) + 1); + } + System.out.println(player.getAttribute("diary:seers:cut-yew", 0)); + if (player.getAttribute("diary:seers:cut-yew", 0) >= 5) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 1); + } + } + + /* if (resource.isFarming()) { + PatchWrapper tree = player.getFarmingManager().getPatchWrapper(node.getWrapper().getId()); + if (node.getId() == 8389 + && node.getLocation().equals(3003, 3372, 0) + && Trees.forNode(tree.getNode()) != null + && (Trees.forNode(tree.getNode()) == Trees.YEW || Trees.forNode(tree.getNode()) == Trees.MAGIC)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 2, 3); + } + } +*/ + // Cut down a dead tree in Lumbridge Swamp + if (resource.name().toLowerCase().startsWith("dead") && (playerRegion == 12593 || playerRegion == 12849)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 8); + } + + // Cut a willow tree, east of Lumbridge Castle + if (resource.name().toLowerCase().startsWith("willow") && playerRegion == 12850) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 6); + } + } + + /** + * Checks if the player gets rewarded. + * + * @return {@code True} if so. + */ + private boolean checkReward() { + int skill = Skills.WOODCUTTING; + int level = 1 + player.getSkills().getLevel(skill) + player.getFamiliarManager().getBoost(skill); + double hostRatio = Math.random() * (100.0 * resource.getRate()); + double clientRatio = Math.random() * ((level - resource.getLevel()) * (1.0 + SkillingTool.getHatchet(player).getRatio())); + return hostRatio < clientRatio; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/BarbarianMixPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/BarbarianMixPlugin.java new file mode 100644 index 000000000..fcfd3e554 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/BarbarianMixPlugin.java @@ -0,0 +1,62 @@ +package core.game.node.entity.skill.herblore; + +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the barbarian mixing plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BarbarianMixPlugin extends UseWithHandler { + + /** + * Constructs a new {@code BarbarianMixPlugin} {@Code Object}. + */ + public BarbarianMixPlugin() { + super(123, 177, 4846, 117, 129, 3012, 135, 3036, 9743, 141, 147, 183, 143, 3020, 10002, 159, 3028, 165, 2456, 171, 3044, 191); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(11324, ITEM_TYPE, this); + addHandler(11326, ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player == null) { + return true; + } + final BarbarianPotion potion = BarbarianPotion.forId(((Item) event.getUsedWith()).getId()); + if (potion == null) { + return true; + } + if (!potion.isBoth() && event.getUsedItem().getId() == 11324 || ((Item) event.getUsedWith()).getId() == 11324) { + return true; + } + if (player.getSkills().getLevel(Skills.HERBLORE) < potion.getLevel()) { + player.getPacketDispatch().sendMessage("You need a herblore level of " + potion.getLevel() + " to make this mix."); + return true; + } + if (potion.getItem() == event.getUsedItem().getId() || potion.getItem() == ((Item) event.getUsedWith()).getId()) { + player.getInventory().remove(new Item(potion.getItem(), 1)); + player.getInventory().add(new Item(potion.getProduct(), 1)); + player.getSkills().addExperience(Skills.HERBLORE, potion.getExp(), true); + if (potion.isBoth()) { + player.getInventory().remove(new Item(11324, 1)); + } + player.getInventory().remove(new Item(11326, 1)); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/BarbarianPotion.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/BarbarianPotion.java new file mode 100644 index 000000000..cba509270 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/BarbarianPotion.java @@ -0,0 +1,103 @@ +package core.game.node.entity.skill.herblore; + +/** + * Represents the barbarian potion. + * @author 'Vexia + */ +public enum BarbarianPotion { + ATTACK_POTION(123, 4, 11429, 8, true), ANTI_POISION_POTION(177, 6, 11433, 12, true), RELIC(4846, 9, 11437, 14, true), STRENGTH_POTION(117, 14, 11443, 17, true), RESTORE_POTION(129, 24, 11449, 21, true), ENERGY_POTION(3012, 29, 11453, 23, false), DEFENCE_POTION(135, 33, 11457, 25, false), AGILITY_POTION(3036, 37, 11461, 27, false), COMBAT_POTION(9743, 40, 11445, 28, false), PRAYER_POTION(141, 42, 11465, 29, false), SUPER_ATTACK_POTION(147, 47, 11469, 33, false), SUPER_ANTIPOISION_POTION(183, 51, 11473, 35, false), FISHING_POTION(143, 53, 11477, 38, false), SUPER_ENERGY_POTION(3020, 59, 11481, 42, false), HUNTER_POTION(10002, 11517, 58, 40, false), SUPER_STRENGTH_POTION(159, 59, 11485, 42, false), SUPER_RESTORE(3028, 67, 11493, 48, false), SUPER_DEFENCE_POTION(165, 71, 11497, 50, false), ANTIFIRE_POTION(2456, 11505, 75, 53, false), RANGING_POTION(171, 80, 11509, 54, false), MAGIC_POTION(3044, 83, 11513, 57, false), ZAMORAK_BREW(191, 85, 11521, 58, false); + + /** + * Constructs a new {@code BarbarianPotion} {@Code Object}. + * @param item the item. + * @param product the product. + * @param exp the exp. + * @param both if both can be added(roe, cavier). + */ + BarbarianPotion(int item, int level, int product, double exp, boolean both) { + this.item = item; + this.level = level; + this.product = product; + this.exp = exp; + this.both = both; + } + + /** + * The item id. + */ + private int item; + + /** + * The product item id. + */ + private int product; + + /** + * The level required. + */ + private int level; + + /** + * the exp gained. + */ + private double exp; + + /** + * Represents if both Roe & Cavier can be added. + */ + private boolean both; + + /** + * Gets the item. + * @return The item. + */ + public int getItem() { + return item; + } + + /** + * Gets the product. + * @return The product. + */ + public int getProduct() { + return product; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the exp. + * @return The exp. + */ + public double getExp() { + return exp; + } + + /** + * Gets the both. + * @return The both. + */ + public boolean isBoth() { + return both; + } + + /** + * Gets the value from the id. + * @param id the id. + * @return the value. + */ + public static BarbarianPotion forId(int id) { + for (BarbarianPotion pot : BarbarianPotion.values()) { + if (pot.getItem() == id) { + return pot; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/FinishedPotion.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/FinishedPotion.java new file mode 100644 index 000000000..573623d39 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/FinishedPotion.java @@ -0,0 +1,134 @@ +package core.game.node.entity.skill.herblore; + +import core.game.node.item.Item; + +/** + * Represents a finished potion. + * @author 'Vexia + */ +public enum FinishedPotion { + ATTACK_POTION(UnfinishedPotion.GUAM, new Item(221), 3, 25, new Item(121)), + ANTIPOISON_POTION(UnfinishedPotion.MARRENTILL, new Item(235), 5, 37.5, new Item(175)), + STRENGTH_POTION(UnfinishedPotion.TARROMIN, new Item(225), 12, 50, new Item(115)), + RESTORE_POTION(UnfinishedPotion.HARRALANDER, new Item(223), 22, 62.5, new Item(127)), + ENERGY_POTION(UnfinishedPotion.HARRALANDER, new Item(1975), 26, 67.5, new Item(3010)), + DEFENCE_POTION(UnfinishedPotion.MARRENTILL, new Item(6814), 30, 45, new Item(133)), + AGILITY_POTION(UnfinishedPotion.TOADFLAX, new Item(2152), 34, 80, new Item(3034)), + COMBAT_POTION(UnfinishedPotion.HARRALANDER, new Item(9736), 36, 84, new Item(9741)), + PRAYER_POTION(UnfinishedPotion.RANARR, new Item(231), 38, 87.5, new Item(139)), + SUMMONING_POTION(UnfinishedPotion.SPIRIT_WEED, new Item(12109), 40, 92, new Item(12142)), + SUPER_ATTACK(UnfinishedPotion.IRIT, new Item(221), 45, 100, new Item(145)), + SUPER_ANTIPOISON(UnfinishedPotion.IRIT, new Item(235), 48, 106.3, new Item(181)), + FISHING_POTION(UnfinishedPotion.AVANTOE, new Item(231), 50, 112.5, new Item(151)), + SUPER_ENERGY(UnfinishedPotion.AVANTOE, new Item(2970), 52, 117.5, new Item(3018)), + HUNTING_POTION(UnfinishedPotion.AVANTOE, new Item(10109), 53, 120, new Item(10000)), + SUPER_STRENGTH(UnfinishedPotion.KWUARM, new Item(225), 55, 125, new Item(157)), + WEAPON_POISON(UnfinishedPotion.KWUARM, new Item(241), 60, 137.5, new Item(187)), + SUPER_RESTORE(UnfinishedPotion.SNAPDRAGON, new Item(223), 63, 142.5, new Item(3026)), + SUPER_DEFENCE(UnfinishedPotion.CADANTINE, new Item(239), 66, 160, new Item(163)), + ANTIFIRE(UnfinishedPotion.LANTADYME, new Item(241), 69, 157.5, new Item(2454)), + SUPER_RANGING_POTION(UnfinishedPotion.DWARF_WEED, new Item(245), 72, 162.5, new Item(169)), + SUPER_MAGIC(UnfinishedPotion.LANTADYME, new Item(3138), 76, 172.5, new Item(3042)), + ZAMORAK_BREW(UnfinishedPotion.TORSTOL, new Item(247), 78, 175, new Item(189)), + SARADOMIN_BREW(UnfinishedPotion.TOADFLAX, GrindingItem.BIRDS_NEST.getProduct(), 81, 180, new Item(6687)), + STRONG_WEAPON_POISON(UnfinishedPotion.STRONG_WEAPON_POISON, new Item(223), 73, 165, new Item(5937)), + SUPER_STRONG_WEAPON_POISON(UnfinishedPotion.SUPER_STRONG_WEAPON_POISON, new Item(6018), 82, 190, new Item(5940)), + STRONG_ANTIPOISON(UnfinishedPotion.STRONG_ANTIPOISON, new Item(6049), 68, 155, new Item(5945)), + SUPER_STRONG_ANTIPOISON(UnfinishedPotion.SUPER_STRONG_ANTIPOISON, new Item(6051), 79, 177.5, new Item(5954)); + + /** + * Represents the unfinished potion. + */ + private final UnfinishedPotion unfinished; + + /** + * Represents the ingredient required. + */ + private final Item ingredient; + + /** + * Represents the level required. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Represents the potion item. + */ + private final Item potion; + + /** + * Constructs a new {@code FinishedPotion} {@code Object}. + * @param unfinished the unfinished potion base. + * @param ingredient the ingredient. + * @param level the level. + * @param experience the experience. + * @param potion the potion. + */ + FinishedPotion(final UnfinishedPotion unfinished, final Item ingredient, final int level, final double experience, final Item potion) { + this.unfinished = unfinished; + this.ingredient = ingredient; + this.level = level; + this.experience = experience; + this.potion = potion; + } + + /** + * Gets the unfinished. + * @return The unfinished. + */ + public UnfinishedPotion getUnfinished() { + return unfinished; + } + + /** + * Gets the ingredient. + * @return The ingredient. + */ + public Item getIngredient() { + return ingredient; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the potion. + * @return The potion. + */ + public Item getPotion() { + return potion; + } + + /** + * Gets the finished potion by the unfinished potion and the ingredient. + * @param unf the unf-potion. + * @param ingredient the ingredient. + * @return the finished potion. + */ + public static FinishedPotion getPotion(final Item unf, final Item ingredient) { + for (FinishedPotion pot : values()) { + if (pot.getUnfinished().getPotion().getId() == unf.getId() && pot.getIngredient().getId() == ingredient.getId()) { + return pot; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/FinishedPotionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/FinishedPotionPlugin.java new file mode 100644 index 000000000..625302262 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/FinishedPotionPlugin.java @@ -0,0 +1,75 @@ +package core.game.node.entity.skill.herblore; + +import core.plugin.Initializable; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Represents the finished potion plugin creating. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FinishedPotionPlugin extends UseWithHandler { + + /** + * Constructs a new {@code FinishedPotionPlugin} {@code Object} + */ + public FinishedPotionPlugin() { + super(getUnfinishedItems()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (FinishedPotion potion : FinishedPotion.values()) { + addHandler(potion.getIngredient().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final FinishedPotion finished = FinishedPotion.getPotion(event.getUsedItem().getName().contains("(unf)") ? event.getUsedItem() : event.getBaseItem(), event.getUsedItem().getName().contains("(unf)") ? event.getBaseItem() : event.getUsedItem()); + if (finished == null) { + return false; + } + final GenericPotion potion = GenericPotion.transform(finished); + final Player player = event.getPlayer(); + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, potion.getProduct()) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new HerblorePulse(player, potion.getBase(), amount, potion)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(potion.getBase()); + } + + }; + if (player.getInventory().getAmount(potion.getBase()) == 1) { + handler.create(0, 1); + } else { + handler.open(); + } + return true; + } + + /** + * Method used to gather the unfinished item bases. + * @return the ids. + */ + public static int[] getUnfinishedItems() { + int[] ids = new int[UnfinishedPotion.values().length]; + int counter = 0; + for (UnfinishedPotion potion : UnfinishedPotion.values()) { + ids[counter] = potion.getPotion().getId(); + counter++; + } + return ids; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GenericPotion.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GenericPotion.java new file mode 100644 index 000000000..c3d193e42 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GenericPotion.java @@ -0,0 +1,110 @@ +package core.game.node.entity.skill.herblore; + +import core.game.node.item.Item; + +/** + * Represents a generic potion which is used to transform incoming data to + * represent a potion(finished or unfinished). + * @author 'Vexia + */ +public final class GenericPotion { + + /** + * Represents the base of the potion. + */ + private final Item base; + + /** + * Represents the ingredient. + */ + private final Item ingredient; + + /** + * Represents the level required. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Represents the product item. + */ + private final Item product; + + /** + * Constructs a new {@code GenericPotion} {@code Object}. + * @param base the base. + * @param ingredient the ingredient. + * @param level the level. + * @param experience the experience. + * @param product the product. + */ + public GenericPotion(final Item base, final Item ingredient, final int level, final double experience, final Item product) { + this.base = base; + this.ingredient = ingredient; + this.level = level; + this.experience = experience; + this.product = product; + } + + /** + * Method used to transform an unfinished potion into a generic potion. + * @param potion the potion to transform. + * @return the transformed potion. + */ + public static GenericPotion transform(final UnfinishedPotion potion) { + return new GenericPotion(potion.getBase(), potion.getIngredient(), potion.getLevel(), 0, potion.getPotion()); + } + + /** + * Method used to transform a finished potion into a generic potion. + * @param potion the potion to transform. + * @return the transformed potion. + */ + public static GenericPotion transform(final FinishedPotion potion) { + return new GenericPotion(potion.getUnfinished().getPotion(), potion.getIngredient(), potion.getLevel(), potion.getExperience(), potion.getPotion()); + } + + /** + * Gets the base. + * @return The base. + */ + public Item getBase() { + return base; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the ingredient. + * @return The ingredient. + */ + public Item getIngredient() { + return ingredient; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindItemPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindItemPlugin.kt new file mode 100644 index 000000000..a88d74173 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindItemPlugin.kt @@ -0,0 +1,72 @@ +package core.game.node.entity.skill.herblore + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.net.packet.PacketRepository +import core.net.packet.context.ChildPositionContext +import core.net.packet.out.RepositionChild +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.dialogue.SkillDialogueHandler +import core.game.node.entity.skill.SkillPulse + +/** + * plugin used to handle the grinding of an item. + * @author 'Ceikry + */ +@Initializable +class GrindItemPlugin : UseWithHandler(233) { + override fun newInstance(arg: Any?): Plugin? { + for (grind in GrindingItem.values()) { + for (i in grind.items) { + addHandler(i.id, ITEM_TYPE, this) + } + } + return this + } + + override fun handle(event: NodeUsageEvent): Boolean { + val grind = GrindingItem.forItem(if (event.usedItem.id == 233) event.baseItem else event.usedItem) + val handler = object : SkillDialogueHandler(event.player,SkillDialogue.ONE_OPTION,grind.product){ + override fun create(amount: Int, index: Int) { + player.pulseManager.run(object : SkillPulse(player,event.usedItem){ + var amt = 0 + init { + amt = amount + if(amt > player.inventory.getAmount(node)){ + amt = player.inventory.getAmount(node) + } + super.setDelay(2) + } + override fun checkRequirements(): Boolean { + return true + } + + override fun animate() { + player.animator.animate(ANIMATION) + } + + override fun reward(): Boolean { + if(player.inventory.remove(node)){ + player.inventory.add(GrindingItem.forItem(node).product) + } + amt-- + return amt <= 0 + } + }) + } + } + handler.open() + PacketRepository.send(RepositionChild::class.java, ChildPositionContext(event.player, 309, 2, 210, 15)) + return true + } + + companion object { + /** + * Represents the animation to use. + */ + private val ANIMATION = Animation(364) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindingItem.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindingItem.java new file mode 100644 index 000000000..11d39b40e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/GrindingItem.java @@ -0,0 +1,79 @@ +package core.game.node.entity.skill.herblore; + +import core.tools.Items; +import core.game.node.item.Item; + +/** + * Represents an item that will can be ground by pestle and mortar. + * @author Vexia + */ +public enum GrindingItem { + UNICORN_HORN(new Item[] { new Item(237) },new Item(235)), + KEBBIT_TEETH(new Item[] { new Item(10109) }, new Item(10111)), + BIRDS_NEST(new Item[] { new Item(5070), new Item(5071), new Item(5072), new Item(5073), new Item(5074), new Item(5075) }, new Item(6693)), + GOAT_HORN(new Item[] { new Item(9735) }, new Item(9736)), + MUD_RUNE(new Item[] { new Item(4698) }, new Item(9594)), + ASHES(new Item[] { new Item(592) }, new Item(8865)), + POISON_KARAMBWAN(new Item[] { new Item(3146) }, new Item(3152)), + FISHING_BAIT(new Item[] { new Item(313) }, new Item(12129)), + SEAWEED(new Item[] { new Item(401) }, new Item(6683)), + BAT_BONES(new Item[] { new Item(530) }, new Item(2391)), + CHARCOAL(new Item[] { new Item(973) }, new Item(704)), + ASTRAL_RUNE_SHARDS(new Item[] { new Item(11156) }, new Item(11155)), + GARLIC(new Item[] { new Item(1550) }, new Item(4668)), + DRAGON_SCALE(new Item[] { new Item(243) }, new Item(241)), + ANCHOVIES(new Item[] { new Item(319) }, new Item(11266)), + GUAM_LEAF(new Item[] { new Item(Items.CLEAN_GUAM_249) }, new Item(Items.GROUND_GUAM_6681)); + + /** + * Represents the item to grind. + */ + private final Item[] items; + + /** + * Represents the product item. + */ + private final Item product; + + /** + * Constructs a new {@code GrindingItem} {@code Object}. + * @param items the items. + * @param product the product. + */ + GrindingItem(final Item[] items, final Item product) { + this.items = items; + this.product = product; + } + + /** + * Gets the item. + * @return The item. + */ + public Item[] getItems() { + return items; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the grinding item. + * @param item the item. + * @return the item. + */ + public static GrindingItem forItem(final Item item) { + for (GrindingItem g : values()) { + for (Item i : g.getItems()) { + if (i.getId() == item.getId()) { + return g; + } + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerbCleanPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerbCleanPlugin.java new file mode 100644 index 000000000..b70a8a13e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerbCleanPlugin.java @@ -0,0 +1,51 @@ +package core.game.node.entity.skill.herblore; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the cleaning of a dirty herb. + * @author Vexia + * @version 1.0 + */ +@Initializable +public final class HerbCleanPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("clean", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (!player.getQuestRepository().isComplete("Druidic Ritual")) { + player.getPacketDispatch().sendMessage("You must complete the Druidic Ritual quest before you can use Herblore."); + return true; + } + final Herbs herb = Herbs.forItem((Item) node); + if (player.getSkills().getLevel(Skills.HERBLORE) < herb.getLevel()) { + player.getPacketDispatch().sendMessage("You need a herblore level " + herb.getLevel() + " to clean this herb."); + return true; + } + double exp = herb.getExperience(); + if (player.getInventory().replace(herb.getProduct(), ((Item) node).getSlot()) != null) { + player.getSkills().addExperience(Skills.HERBLORE, exp, true); + player.getPacketDispatch().sendMessage("You clean the dirt from the " + herb.getProduct().getName().toLowerCase().replace("clean", "").trim() + " leaf."); + } + player.lock(1); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerbTarPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerbTarPlugin.java new file mode 100644 index 000000000..069729866 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerbTarPlugin.java @@ -0,0 +1,53 @@ +package core.game.node.entity.skill.herblore; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.net.packet.PacketRepository; +import core.net.packet.context.ChildPositionContext; +import core.net.packet.out.RepositionChild; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.dialogue.SkillDialogueHandler; + +/** + * Represents the plugin used to create a herb tar. + * @author Ceikry, fawk Vexia and his bad design. + * @version 1.0 + */ +@Initializable +public final class HerbTarPlugin extends UseWithHandler { + + /** + * Constructs a new {@code HerbTarPlugin} {@code Object}. + */ + public HerbTarPlugin() { + super(1939); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Tars tar : Tars.values()) { + addHandler(tar.getIngredient().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + //Tars.forItem(event.getUsedItem().getId() == 1939 ? event.getBaseItem() : event.getUsedItem()) + SkillDialogueHandler handler = new SkillDialogueHandler(event.getPlayer(), SkillDialogueHandler.SkillDialogue.ONE_OPTION,Tars.forItem(event.getUsedItem().getId() == 1939 ? event.getBaseItem() : event.getUsedItem()).getTar()){ + @Override + public void create(int amount, int index) { + event.getPlayer().getPulseManager().run(new HerbTarPulse(event.getPlayer(), null, Tars.forItem(event.getUsedItem().getId() == 1939 ? event.getBaseItem() : event.getUsedItem()), amount)); + } + @Override + public int getAll(int index) { + return event.getPlayer().getInventory().getAmount(event.getUsedItem()); + } + }; + handler.open(); + PacketRepository.send(RepositionChild.class, new ChildPositionContext(event.getPlayer(), 309, 2, 210, 15)); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerbTarPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerbTarPulse.java new file mode 100644 index 000000000..87c81cecd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerbTarPulse.java @@ -0,0 +1,109 @@ +package core.game.node.entity.skill.herblore; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Represents the pulse used to create herb tars. + * @author 'Vexia + */ +public final class HerbTarPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(364); + + /** + * Represents the pestle and mortar item. + */ + private static final Item PESTLE_AND_MORTAR = new Item(233); + + /** + * Represents the swamp tar item. + */ + private static final Item SWAMP_TAR = new Item(1939, 15); + + /** + * Represents the tar to make. + */ + private final Tars tar; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Constructs a new {@code HerbTarPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param tar the tar. + * @param amount the amount. + */ + public HerbTarPulse(Player player, Item node, Tars tar, int amount) { + super(player, node); + this.tar = tar; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (!player.getQuestRepository().isComplete("Druidic Ritual")) { + player.getPacketDispatch().sendMessage("You must complete the Druidic Ritual quest before you can use Herblore."); + return false; + } + if (player.getSkills().getLevel(Skills.HERBLORE) < tar.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Herblore level of at least " + tar.getLevel() + " in order to do this."); + return false; + } + if (!player.getInventory().containsItem(PESTLE_AND_MORTAR)) { + player.getPacketDispatch().sendMessage("You need Pestle and Mortar in order to crush the herb."); + return false; + } + if (!player.getInventory().containsItem(SWAMP_TAR)) { + player.getPacketDispatch().sendMessage("You need at least 15 swamp tar in order to do this."); + return false; + } + return true; + } + + @Override + public void animate() { + player.animate(ANIMATION); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + setDelay(4); + return false; + } + if (player.getInventory().containsItem(SWAMP_TAR) && player.getInventory().containsItem(tar.getIngredient()) && player.getInventory().remove(SWAMP_TAR) && player.getInventory().remove(tar.getIngredient())) { + final Item item = new Item(tar.getTar().getId(), 15); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.HERBLORE, tar.getExperience(), true); + player.getPacketDispatch().sendMessage("You add the " + tar.getIngredient().getName().toLowerCase().replace("clean", "").trim() + " to the swamp tar."); + } else { + return true; + } + amount--; + return amount == 0; + } + + @Override + public void message(int type) { + } + + /** + * Gets the tar. + * @return The tar. + */ + public Tars getTar() { + return tar; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerblorePulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerblorePulse.java new file mode 100644 index 000000000..3d528f949 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/HerblorePulse.java @@ -0,0 +1,139 @@ +package core.game.node.entity.skill.herblore; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.tools.StringUtils; + +/** + * Represents the skill pulse used to handle the creating of potions. + * @author 'Vexia + */ +public final class HerblorePulse extends SkillPulse { + + /** + * Represents the vial of water item. + */ + public static final Item VIAL_OF_WATER = new Item(227); + + /** + * Represents the coonut milk item. + */ + public static final Item COCONUT_MILK = new Item(5935); + + /** + * Represents the animation to use when making a potion. + */ + private static final Animation ANIMATION = new Animation(363); + + /** + * Represents the generic potion. + */ + private final GenericPotion potion; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Represents the initial amount to make. + */ + private int initialAmount; + + /** + * Represents the cycles. + */ + private int cycles; + + /** + * Constructs a new {@code HerblorePulse} {@code Object}. + * @param player the player. + * @param node the node. + */ + public HerblorePulse(final Player player, final Item node, final int amount, final GenericPotion potion) { + super(player, node); + this.amount = amount; + this.initialAmount = amount; + this.potion = potion; + } + + @Override + public boolean checkRequirements() { + if (!player.getQuestRepository().isComplete("Druidic Ritual")) { + player.getPacketDispatch().sendMessage("You must complete the Druidic Ritual quest before you can use Herblore."); + return false; + } + if (player.getSkills().getLevel(Skills.HERBLORE) < potion.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Herblore level of at least " + potion.getLevel() + " in order to do this."); + return false; + } + if (!player.getInventory().containsItem(potion.getBase()) || !player.getInventory().containsItem(potion.getIngredient())) { + return false; + } + return true; + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + if (potion.getBase().getId() == VIAL_OF_WATER.getId()) { + if (initialAmount == 1 && getDelay() == 1) { + player.animate(ANIMATION); + setDelay(3); + return false; + } + handleUnfinished(); + } else { + if (initialAmount == 1 && getDelay() == 1) { + player.animate(ANIMATION); + setDelay(3); + return false; + } + if (getDelay() == 1) { + setDelay(3); + player.animate(ANIMATION); + return false; + } + handleFinished(); + } + amount--; + return amount == 0; + } + + /** + * Method used to handle the potion making of an unf-potion. + */ + public void handleUnfinished() { + if (cycles == 0) { + player.animate(ANIMATION); + } + if ((player.getInventory().containsItem(potion.getBase()) && player.getInventory().containsItem(potion.getIngredient())) && player.getInventory().remove(potion.getBase(), potion.getIngredient())) { + final Item item = potion.getProduct(); + player.getInventory().add(item); + player.getPacketDispatch().sendMessage("You put the" + StringUtils.formatDisplayName(potion.getIngredient().getName().replace("Clean", "")) + " Leaf into the vial of water."); + if (cycles++ == 3) { + player.animate(ANIMATION); + cycles = 0; + } + } + } + + /** + * Method used to handle the finished potion making. + */ + public void handleFinished() { + if ((player.getInventory().containsItem(potion.getBase()) && player.getInventory().containsItem(potion.getIngredient())) && player.getInventory().remove(potion.getBase(), potion.getIngredient())) { + final Item item = potion.getProduct(); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.HERBLORE, potion.getExperience(), true); + player.getPacketDispatch().sendMessage("You mix the " + potion.getIngredient().getName().toLowerCase() + " into your potion."); + player.animate(ANIMATION); + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/Herbs.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/Herbs.java new file mode 100644 index 000000000..ff7a00c83 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/Herbs.java @@ -0,0 +1,91 @@ +package core.game.node.entity.skill.herblore; + +import core.game.node.item.Item; + +/** + * Represents the enumeration of herbs to clean. + * @author 'Vexia + */ +public enum Herbs { + GUAM(new Item(199), 2.5, 3, new Item(249)), MARRENTILL(new Item(201), 3.8, 5, new Item(251)), TARROMIN(new Item(203), 5, 11, new Item(253)), HARRALANDER(new Item(205), 6.3, 20, new Item(255)), RANARR(new Item(207), 7.5, 25, new Item(257)), TOADFLAX(new Item(3049), 8, 30, new Item(2998)), SPIRIT_WEED(new Item(12174), 7.8, 35, new Item(12172)), IRIT(new Item(209), 8.8, 40, new Item(259)), AVANTOE(new Item(211), 10, 48, new Item(261)), KWUARM(new Item(213), 11.3, 54, new Item(263)), SNAPDRAGON(new Item(3051), 11.8, 59, new Item(3000)), CADANTINE(new Item(215), 12.5, 65, new Item(265)), LANTADYME(new Item(2485), 13.1, 67, new Item(2481)), DWARF_WEED(new Item(217), 13.8, 70, new Item(267)), TORSTOL(new Item(219), 15, 75, new Item(269)), SNAKE_WEED(new Item(1525), 2.5, 3, new Item(1526)), ARDRIGAL(new Item(1527), 2.5, 3, new Item(1528)), SITO_FOIL(new Item(1529), 2.5, 3, new Item(1530)), VOLENCIA_MOSS(new Item(1531), 2.5, 3, new Item(1532)), ROGUES_PUSE(new Item(1533), 2.5, 3, new Item(1534)); + + /** + * Represents the herb item. + */ + private final Item herb; + + /** + * Represents the level required to clean this herb. + */ + private final int level; + + /** + * Represents the experience. + */ + private final double experience; + + /** + * Represents the product recieved from cleaning the herb. + */ + private final Item product; + + /** + * Constructs a new {@code Herbs} {@code Object}. + * @param herb the herb. + * @param level the level. + * @param experience the experience. + * @param product the product. + */ + Herbs(final Item herb, final double experience, final int level, final Item product) { + this.herb = herb; + this.experience = experience; + this.level = level; + this.product = product; + } + + /** + * Gets the herb. + * @return The herb. + */ + public Item getHerb() { + return herb; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the herb from the item id. + * @param item the item. + * @return the herb. + */ + public static Herbs forItem(final Item item) { + for (Herbs herb : Herbs.values()) { + if (herb.getHerb().getId() == item.getId()) { + return herb; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/MakeSuperCombatPotionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/MakeSuperCombatPotionPlugin.java new file mode 100644 index 000000000..d1a3fa28e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/MakeSuperCombatPotionPlugin.java @@ -0,0 +1,73 @@ +package core.game.node.entity.skill.herblore; + +import core.plugin.Initializable; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * The plugin that creates the Super Combat potion. + * @author Empathy + * + */ +@Initializable +public class MakeSuperCombatPotionPlugin extends UseWithHandler { + + /** + * The ingredients. + */ + private static final int[] INGREDIENTS = new int[] { 2436, 2442, 2440 }; + + /** + * The base. + */ + private static final Item BASE = new Item(2436); + + /** + * The product. + */ + private static final Item PRODUCT = new Item(14871); + + /** + * Constructs a new @{Code MakeSuperCombatPotionPlugin} object. + */ + public MakeSuperCombatPotionPlugin() { + super(269, 2436, 2442, 2440); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : INGREDIENTS) { + addHandler(i, ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, PRODUCT) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new SuperCombatPulse(player, BASE, amount)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(BASE); + } + + }; + if (player.getInventory().getAmount(BASE) == 1) { + handler.create(0, 1); + } else { + handler.open(); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/MassDecantingPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/MassDecantingPlugin.java new file mode 100644 index 000000000..4a5060a6c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/MassDecantingPlugin.java @@ -0,0 +1,56 @@ + +package core.game.node.entity.skill.herblore; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.content.consumable.Consumables; +import core.game.content.consumable.Potion; + +import java.util.HashMap; +import java.util.List; + +@Initializable +public class MassDecantingPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("decant",this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + decant(player); + return true; + } + + public void decant(Player p){ + HashMap potcounts = new HashMap<>(); + final List results; + for(int i = 0; i < 28; i++){ + Potion pot = (Potion) Consumables.getConsumableById(p.getInventory().getId(i)); + if(pot != null){ + int dosage = Integer.parseInt(p.getInventory().get(i).getName().replaceAll("[^\\d.]","")); + if(potcounts.get(pot) != null){ + potcounts.replace(pot,potcounts.get(pot) + dosage); + } else { + potcounts.putIfAbsent(pot,dosage); + } + p.getInventory().remove(new Item(p.getInventory().getId(i))); + } + } + potcounts.keySet().forEach(pot -> { + int full_count = (potcounts.get(pot) / pot.getIds().length); + int partial_dose_amt = (potcounts.get(pot) % pot.getIds().length); + p.getInventory().add(new Item(pot.getIds()[0],full_count)); + if(partial_dose_amt > 0) p.getInventory().add(new Item(pot.getIds()[pot.getIds().length - partial_dose_amt])); + }); + } +} + diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/PotionDecantingPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/PotionDecantingPlugin.java new file mode 100644 index 000000000..26b1ee742 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/PotionDecantingPlugin.java @@ -0,0 +1,327 @@ +package core.game.node.entity.skill.herblore; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents the plugin used to handle the decanting of potions. + * @author 'Vexia + */ +@Initializable +public final class PotionDecantingPlugin extends UseWithHandler { + + /** + * Represents the empty item vial. + */ + private static final Item EMPTY_VIAL = new Item(229, 1); + + /** + * Represents the array of potions to utilitize. + */ + public static final int[] POTIONS = new int[] { + /* empty vial */229, + /* Strength potion(4) */113, + /* Strength potion(3) */115, + /* Strength potion(2) */117, + /* Strength potion(1) */119, + /* Attack potion(3) */121, + /* Attack potion(2) */123, + /* Attack potion(1) */125, + /* Restore potion(3) */127, + /* Restore potion(2) */129, + /* Restore potion(1) */131, + /* Defence potion(3) */133, + /* Defence potion(2) */135, + /* Defence potion(1) */137, + /* Prayer potion(3) */139, + /* Prayer potion(2) */141, + /* Prayer potion(1) */143, + /* Super attack(3) */145, + /* Super attack(2) */147, + /* Super attack(1) */149, + /* Fishing potion(3) */151, + /* Fishing potion(2) */153, + /* Fishing potion(1) */155, + /* Super strength(3) */157, + /* Super strength(2) */159, + /* Super strength(1) */161, + /* Super defence(3) */163, + /* Super defence(2) */165, + /* Super defence(1) */167, + /* Ranging potion(3) */169, + /* Ranging potion(2) */171, + /* Ranging potion(1) */173, + /* Antipoison(3) */175, + /* Antipoison(2) */177, + /* Antipoison(1) */179, + /* Super antipoison(3) */181, + /* Super antipoison(2) */183, + /* Super antipoison(1) */185, + /* Bravery potion */739, + /* Cadava potion */756, + /* Magic ogre potion */2395, + /* Attack potion(4) */2428, + /* Restore potion(4) */2430, + /* Defence potion(4) */2432, + /* Prayer potion(4) */2434, + /* Super attack(4) */2436, + /* Fishing potion(4) */2438, + /* Super strength(4) */2440, + /* Super defence(4) */2442, + /* Ranging potion(4) */2444, + /* Antipoison(4) */2446, + /* Super antipoison(4) */2448, + /* Antifire potion(4) */2452, + /* Antifire potion(3) */2454, + /* Antifire potion(2) */2456, + /* Antifire potion(1) */2458, + /* Energy potion(4) */3008, + /* Energy potion(3) */3010, + /* Energy potion(2) */3012, + /* Energy potion(1) */3014, + /* Super energy(4) */3016, + /* Super energy(3) */3018, + /* Super energy(2) */3020, + /* Super energy(1) */3022, + /* Super restore(4) */3024, + /* Super restore(3) */3026, + /* Super restore(2) */3028, + /* Super restore(1) */3030, + /* Agility potion(4) */3032, + /* Agility potion(3) */3034, + /* Agility potion(2) */3036, + /* Agility potion(1) */3038, + /* Magic potion(4) */3040, + /* Magic potion(3) */3042, + /* Magic potion(2) */3044, + /* Magic potion(1) */3046, + /* Troll potion */3265, + /* Explosive potion */4045, + /* Super kebab */4608, + /* Strange potion */4836, + /* Antipoison+(4) */5943, + /* Antipoison+(3) */5945, + /* Antipoison+(2) */5947, + /* Antipoison+(1) */5949, + /* Antipoison++(4) */5952, + /* Antipoison++(3) */5954, + /* Antipoison++(2) */5956, + /* Antipoison++(1) */5958, + /* Supercompost */6034, + /* Compost potion(4) */6470, + /* Compost potion(3) */6472, + /* Compost potion(2) */6474, + /* Compost potion(1) */6476, + /* Combat potion(4) */9739, + /* Combat potion(3) */9741, + /* Combat potion(2) */9743, + /* Combat potion(1) */9745, + /* Hunter potion(4) */9998, + /* Hunter potion(3) */10000, + /* Hunter potion(2) */10002, + /* Hunter potion(1) */10004, + /* Antipoison mix(2) */11433, + /* Antipoison mix(1) */11435, + /* Superattack mix(2) */11469, + /* Superattack mix(1) */11471, + /* Antifire mix(2) */11505, + /* Antifire mix(1) */11507, + /* Goblin potion (4) */11809, + /* Goblin potion (3) */11810, + /* Goblin potion (2) */11811, + /* Goblin potion (1) */11812, + /* Summoning potion(4) */12140, + /* Summoning potion(3) */12142, + /* Summoning potion(2) */12144, + /* Summoning potion(1) */12146, + /* Saradomin brews */ 6685, 6687, 6689, 6691, + /* Zamorak brews*/ 2450, 189, 191, 193, + /* Extended antifire potions*/ 14753, 14755, 14757, 14759, + /* Super ranging */ 14776, 14777, 14778, 14779, + /* Super magic */ 14780, 14781, 14782, 14783, + /* Overloads */ 14784, 14785, 14786, 14787, + /*Super Combat Pots */ 14871, 14869, 14867, 14865}; + + /** + * Constructs a new {@code PotionDecantingPlugin} {@code Object}. + */ + public PotionDecantingPlugin() { + super(POTIONS); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : POTIONS) { + addHandler(i, ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Item item = event.getUsedItem(); + final Item other = event.getBaseItem(); + final String itemName = formatName(item); + final String otherName = formatName(other); + if (!itemName.equals(otherName) && (item.getId() != 229 && other.getId() != 229)) { + return false; + } + final int itemDose = getPotionDose(item); + final int otherDose = getPotionDose(other); + if (flagged(itemDose, otherDose)) { + return false; + } + final int[] newDoses = getDoses(itemDose, otherDose); + if (itemDose == 4 && otherDose == 0 || otherDose == 4 && itemDose == 0) { + player.getInventory().replace(getItem(item.getName().contains("Vial") ? otherName : itemName, newDoses[1]), item.getSlot()); + player.getInventory().replace(getItem(item.getName().contains("Vial") ? otherName : itemName, newDoses[1]), other.getSlot()); + player.getPacketDispatch().sendMessage("You decant the potion into two equal parts."); + } else { + player.getInventory().replace(getItem(item.getName().contains("Vial") ? otherName : itemName, newDoses[0]), other.getSlot()); + player.getInventory().replace(getItem(item.getName().contains("Vial") ? otherName : itemName, newDoses[1]), item.getSlot()); + player.getPacketDispatch().sendMessage("You have combined the liquid into " + (newDoses[0] == 0 ? newDoses[1] : newDoses[0]) + " doses."); + } + return true; + } + + /** + * Decants all the potions in a players inventory. + * @param player The player + */ + public static void decant(Player player) { + Map potions = new HashMap<>(); + + int totalVials = 0; + int newVials = 0; + int vialsToGive; + + for (Item item : player.getInventory().toArray()) { + if (item != null) { + if (getPotionDose(item) > 0 && isPot(item.getId())) { + String itemName = formatName(item); + item.setAmount(item.getAmount()); + totalVials += item.getAmount(); + if (player.getInventory().remove(item)) { + if (potions.get(itemName) != null) { + potions.put(itemName, potions.get(itemName) + (item.getAmount() * getPotionDose(item))); + } else { + potions.put(itemName, item.getAmount() * getPotionDose(item)); + } + } + } + } + } + + for (Map.Entry entry : potions.entrySet()) { + int amount = entry.getValue() / 4; + int excess = entry.getValue() % 4; + newVials += amount + (excess > 0 ? 1 : 0); + Item fourDose = getItem(entry.getKey(), 4); + player.getInventory().add(new Item(fourDose.getId() + 1, amount), player); + if (excess > 0) { + player.getInventory().add(new Item(getItem(entry.getKey(), excess).getId() + 1), player); + } + } + + vialsToGive = totalVials - newVials; + + if (vialsToGive > 0) { + player.getInventory().add(new Item(EMPTY_VIAL.getId() + 1, vialsToGive), player); + } + } + + /** + * Method used to format a name of a potion. + * @param item the item. + * @return the name. + */ + public static String formatName(final Item item) { + return item.getName().replace("(1)", "").replace("(2)", "").replace("(3)", "").replace("(4)", "").trim(); + } + + /** + * Method used to get the potion does between two potions. + * @param item the item. + * @return the doses. + */ + public static int getPotionDose(final Item item) { + return item.getName().contains("(1)") ? 1 : item.getName().contains("(2)") ? 2 : item.getName().contains("(3)") ? 3 : item.getName().contains("(4)") ? 4 : 0; + } + + /** + * Method used to check if a new potion ca be created based on the doses. + * @param itemDose the item dose. + * @param otherDose the other dose. + * @return True if flagged. + */ + public boolean flagged(final int itemDose, final int otherDose) { + return (itemDose == 4 && otherDose != 0 || itemDose != 4 && otherDose == 0 || itemDose == 4 && otherDose == 3 || itemDose == 0 && otherDose != 4) || (otherDose == 4 && itemDose != 0 || otherDose != 4 && itemDose == 0 || otherDose == 4 && itemDose == 3 || otherDose == 0 && itemDose != 4); + } + + /** + * Method used to return the doses of the new items. + * @param itemDose the item dose. + * @param otherDose the other dose. + * @return the new doses. + */ + public int[] getDoses(final int itemDose, final int otherDose) { + return itemDose == 1 && otherDose == 1 ? new int[] { 2, 0 } : itemDose == 3 && otherDose == 3 ? new int[] { 4, 2 } : itemDose == 2 && otherDose == 2 ? new int[] { 4, 0 } : itemDose == 2 && otherDose == 3 ? new int[] { 4, 1 } : itemDose == 1 && otherDose == 2 ? new int[] { 0, 3 } : itemDose == 4 && otherDose == 0 ? new int[] { 2, 2 } : itemDose == 1 && otherDose == 3 ? new int[] { 0, 4 } : otherDose == 2 && itemDose == 3 ? new int[] { 1, 4 } : otherDose == 1 && itemDose == 2 ? new int[] { 0, 3 } : otherDose == 4 && itemDose == 0 ? new int[] { 2, 2 } : otherDose == 1 && itemDose == 3 ? new int[] { 0, 4 } : itemDose == 0 && otherDose == 4 ? new int[] { 2, 2 } : otherDose == 4 && itemDose == 0 ? new int[] { 2, 2 } : new int[] { 0, 0 }; + } + + /** + * Method used to get the new item. + * @param name the name. + * @param dose the dose of the new item. + * @return the new item. + */ + public static Item getItem(String name, int dose) { + ItemDefinition def = null; + name += (oldSchool(name) ? " " : "")+"(" + dose + ")"; + if (dose == 0) { + return EMPTY_VIAL; + } + for (int id : POTIONS) { + def = ItemDefinition.forId(id); + if (def.getName().equals(name)) { + return new Item(id); + } + } + return null; + } + + /** + * Checks if an item is a pot. + * @param itemId The item id. + * @return true if so. + */ + public static boolean isPot(int itemId) { + for (int i : POTIONS) { + if (itemId == i || itemId == (i + 1)) { + return true; + } + } + return false; + } + + /** + * If an item is oldschool... add an extra space. + * @param name + * @return + * @author Jagex + */ + private static boolean oldSchool(String name){ + if(name.contains("xtended") || name.contains("uper rangin") || name.contains("uper magic") || name.contains("verload")){ + return true; + } + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/SuperCombatPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/SuperCombatPulse.java new file mode 100644 index 000000000..305fdc942 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/SuperCombatPulse.java @@ -0,0 +1,88 @@ +package core.game.node.entity.skill.herblore; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the creation of a super combat potion. + * @author Empathy + * + */ +public class SuperCombatPulse extends SkillPulse { + + /** + * The ingredients. + */ + private static final int[] INGREDIENTS = new int[] { 2436, 2442, 2440, 269 }; + + /** + * The product item. + */ + private static final Item PRODUCT = new Item(14871); + + /** + * The vial id. + */ + private static final Item VIAL = new Item(229); + + /** + * Represents the animation to use when making a potion. + */ + private static final Animation ANIMATION = new Animation(363); + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Constructs a new {@code SuperCombatPulse} object. + * @param player the player. + * @param node the node. + * @param amount the amount. + */ + public SuperCombatPulse(final Player player, final Item node, int amount) { + super(player, node); + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getStaticLevel(Skills.HERBLORE) < 90) { + player.sendMessage("You need a Herblore level of at least 90 in order to do this"); + return false; + } + if (!player.getInventory().containsAll(INGREDIENTS)) { + return false; + } + return true; + } + + @Override + public void animate() { + + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + setDelay(2); + } + if (player.getInventory().containsAll(INGREDIENTS)) { + if (player.getInventory().remove(new Item(INGREDIENTS[0]), new Item(INGREDIENTS[1]), new Item(INGREDIENTS[2]), new Item(INGREDIENTS[3]))) { + VIAL.setAmount(2); + player.getSkills().addExperience(Skills.HERBLORE, 150); + player.animate(ANIMATION); + player.getInventory().add(PRODUCT); + player.getInventory().add(VIAL); + VIAL.setAmount(1); + amount--; + } + } + return amount == 0; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/SwampToadPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/SwampToadPlugin.java new file mode 100644 index 000000000..cba7e80a4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/SwampToadPlugin.java @@ -0,0 +1,36 @@ +package core.game.node.entity.skill.herblore; + + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the swamp toad plugin. + * @author Zombiemode + * @version 1.0 + */ +@Initializable +public final class SwampToadPlugin extends OptionHandler { + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("remove-legs", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getInventory().replace(new Item(2152), ((Item) node).getSlot()) != null) { + player.getPacketDispatch().sendMessage("You pull the legs off the toad. Poor toad. At least they'll grow back."); + } + return true; + } + + @Override + public boolean isWalk() { return false; } +} + diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/Tars.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/Tars.java new file mode 100644 index 000000000..1ac6e49cf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/Tars.java @@ -0,0 +1,91 @@ +package core.game.node.entity.skill.herblore; + +import core.game.node.item.Item; + +/** + * Represents a tar to create. + * @author 'Vexia + */ +public enum Tars { + GUAM_TAR(Herbs.GUAM.getProduct(), 19, 30, new Item(10142)), MARRENTILL_TAR(Herbs.MARRENTILL.getProduct(), 31, 42.5, new Item(10143)), TARROMIN_TAR(Herbs.TARROMIN.getProduct(), 39, 55, new Item(10144)), HARRALANDER_TAR(Herbs.HARRALANDER.getProduct(), 44, 72.5, new Item(10145)); + + /** + * Represents the ingredient. + */ + private final Item ingredient; + + /** + * Represents the level required. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Represents the tar item. + */ + private final Item tar; + + /** + * Constructs a new {@code Tars} {@code Object}. + * @param ingredient the ingredient. + * @param level the level. + * @param experience the experience. + * @param tar the tar. + */ + Tars(Item ingredient, int level, double experience, Item tar) { + this.ingredient = ingredient; + this.level = level; + this.experience = experience; + this.tar = tar; + } + + /** + * Gets the ingredient. + * @return The ingredient. + */ + public Item getIngredient() { + return ingredient; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the tar. + * @return The tar. + */ + public Item getTar() { + return tar; + } + + /** + * Gets the tar. + * @param item the item. + * @return the tar. + */ + public static Tars forItem(final Item item) { + for (Tars tar : Tars.values()) { + if (tar.getIngredient().getId() == item.getId()) { + return tar; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/UnfinishedPotion.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/UnfinishedPotion.java new file mode 100644 index 000000000..7336a05aa --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/UnfinishedPotion.java @@ -0,0 +1,102 @@ +package core.game.node.entity.skill.herblore; + +import core.game.node.item.Item; + +/** + * Represents an unfinished potion to make. + * @author 'Vexia + */ +public enum UnfinishedPotion { + GUAM(Herbs.GUAM.getProduct(), 3, new Item(91)), MARRENTILL(Herbs.MARRENTILL.getProduct(), 5, new Item(93)), TARROMIN(Herbs.TARROMIN.getProduct(), 12, new Item(95)), HARRALANDER(Herbs.HARRALANDER.getProduct(), 22, new Item(97)), RANARR(Herbs.RANARR.getProduct(), 30, new Item(99)), TOADFLAX(Herbs.TOADFLAX.getProduct(), 34, new Item(3002)), SPIRIT_WEED(Herbs.SPIRIT_WEED.getProduct(), 40, new Item(12181)), IRIT(Herbs.IRIT.getProduct(), 45, new Item(101)), AVANTOE(Herbs.AVANTOE.getProduct(), 50, new Item(103)), KWUARM(Herbs.KWUARM.getProduct(), 55, new Item(105)), SNAPDRAGON(Herbs.SNAPDRAGON.getProduct(), 63, new Item(3004)), CADANTINE(Herbs.CADANTINE.getProduct(), 66, new Item(107)), LANTADYME(Herbs.LANTADYME.getProduct(), 69, new Item(2483)), DWARF_WEED(Herbs.DWARF_WEED.getProduct(), 72, new Item(109)), TORSTOL(Herbs.TORSTOL.getProduct(), 75, new Item(111)), STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(6016), 73, new Item(5936)), SUPER_STRONG_WEAPON_POISON(HerblorePulse.COCONUT_MILK, new Item(2398), 82, new Item(5939)), STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.TOADFLAX.getProduct(), 68, new Item(5942)), SUPER_STRONG_ANTIPOISON(HerblorePulse.COCONUT_MILK, Herbs.IRIT.getProduct(), 79, new Item(5951)); + + /** + * Represents the base item. + */ + private final Item base; + + /** + * Represents the ingredient needed to make this unf-potion. + */ + private final Item ingredient; + + /** + * Represents the level required to make this unf-potion. + */ + private final int level; + + /** + * Represents the potion product. + */ + private final Item potion; + + /** + * Constructs a new {@code UnfinishedPotion} {@code Object}. + * @param ingredient the ingredient. + * @param level the level. + * @param potion the potion. + */ + UnfinishedPotion(final Item base, final Item ingredient, final int level, final Item potion) { + this.base = base; + this.ingredient = ingredient; + this.level = level; + this.potion = potion; + } + + /** + * Constructs a new {@code UnfinishedPotion} {@code Object}. + * @param ingredient the ingredient. + * @param level the level. + * @param potion the potion. + */ + UnfinishedPotion(final Item ingredient, final int level, final Item potion) { + this(HerblorePulse.VIAL_OF_WATER, ingredient, level, potion); + } + + /** + * Gets the ingredient. + * @return The ingredient. + */ + public Item getIngredient() { + return ingredient; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the potion. + * @return The potion. + */ + public Item getPotion() { + return potion; + } + + /** + * Gets the base. + * @return The base. + */ + public Item getBase() { + return base; + } + + /** + * Gets the unf-potion. + * @param item the item. + * @paramt the base item. + * @return the unf-potion. + */ + public static UnfinishedPotion forItem(final Item item, final Item base) { + for (UnfinishedPotion potion : values()) { + if ((potion.getIngredient().getId() == item.getId() || potion.getIngredient().getId() == base.getId()) && (item.getId() == potion.getBase().getId() || base.getId() == potion.getBase().getId())) { + return potion; + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/herblore/UnfinishedPotionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/UnfinishedPotionPlugin.java new file mode 100644 index 000000000..a89fda25f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/herblore/UnfinishedPotionPlugin.java @@ -0,0 +1,61 @@ +package core.game.node.entity.skill.herblore; + +import core.plugin.Initializable; +import core.game.content.dialogue.SkillDialogueHandler; +import core.game.content.dialogue.SkillDialogueHandler.SkillDialogue; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle the creation of creation an unf-potion. + * @author 'Vexia + */ +@Initializable +public final class UnfinishedPotionPlugin extends UseWithHandler { + + /** + * Constructs a new {@code UnfinishedPotionPlugin} {@code Object}. + */ + public UnfinishedPotionPlugin() { + super(227, 5935); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (UnfinishedPotion potion : UnfinishedPotion.values()) { + addHandler(potion.getIngredient().getId(), ITEM_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final UnfinishedPotion unf = UnfinishedPotion.forItem(event.getUsedItem(), event.getBaseItem()); + if (unf == null) { + return false; + } + final GenericPotion potion = GenericPotion.transform(unf); + final Player player = event.getPlayer(); + SkillDialogueHandler handler = new SkillDialogueHandler(player, SkillDialogue.ONE_OPTION, potion.getProduct()) { + @Override + public void create(final int amount, int index) { + player.getPulseManager().run(new HerblorePulse(player, potion.getBase(), amount, potion)); + } + + @Override + public int getAll(int index) { + return player.getInventory().getAmount(potion.getBase()); + } + + }; + if (player.getInventory().getAmount(potion.getBase()) == 1) { + handler.create(0, 1); + } else { + handler.open(); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/BoxTrapNode.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/BoxTrapNode.java new file mode 100644 index 000000000..e6acb0e32 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/BoxTrapNode.java @@ -0,0 +1,37 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.item.Item; + +/** + * Handles the box trap node. + * @author Vexia + */ +public final class BoxTrapNode extends TrapNode { + + /** + * The summoning level required. + */ + private final int summoningLevel; + + /** + * Constructs a new {@code BoxTrapNode} {@code Object}. + * @param npcIds the npc ids. + * @param level the level. + * @param experience the experience. + * @param rewards the rewards. + */ + public BoxTrapNode(int[] npcIds, int level, double experience, Item[] rewards, final int summoningLevel) { + super(npcIds, level, experience, new int[] { 19188, 19189 }, rewards); + this.summoningLevel = summoningLevel; + } + + @Override + public boolean canCatch(TrapWrapper wrapper, final NPC npc) { + if (wrapper.getPlayer().getSkills().getStaticLevel(Skills.SUMMONING) < summoningLevel) { + return false; + } + return super.canCatch(wrapper, npc); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/DeadfallSetting.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/DeadfallSetting.java new file mode 100644 index 000000000..e038a9111 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/DeadfallSetting.java @@ -0,0 +1,170 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.entity.skill.firemaking.Log; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles a deadfall trap. + * @author Vexia + */ +public final class DeadfallSetting extends TrapSetting { + + /** + * Constructs a new {@code DeadfallSetting} {@code Object}. + */ + public DeadfallSetting() { + super(new int[] { 28935, 19205 }, + new Item[] { new Item(946) }, + new int[] { 28937, 19206 }, + new int[] { 10138, 6006, 12574, 341, 2132 }, + "set-trap", 23, -1, new Animation(5208), new Animation(9726), true); + } + + @Override + public boolean hasItems(Player player) { + if (!super.hasItems(player)) { + player.getPacketDispatch().sendMessage("You need a knife in order to set a deadfall trap."); + return false; + } + for (Log log : Log.values()) { + if (player.getInventory().contains(log.getLogId(), 1)) { + return true; + } + } + player.getPacketDispatch().sendMessage("You need logs in order to set a deadfall trap."); + return false; + } + + @Override + public TrapHook createHook(TrapWrapper wrapper) { + return new TrapHook(wrapper, getLocations(wrapper.getObject()).toArray(new Location[] {})); + } + + @Override + public void reward(Player player, Node node, TrapWrapper wrapper) { + player.getInventory().remove(new Item(getLog(player).getLogId())); + } + + @Override + public boolean clear(TrapWrapper wrapper, int type) { + if (super.clear(wrapper, type)) { + ObjectBuilder.add(wrapper.getObject().transform(getNodeForObjectId(wrapper.isCaught() ? wrapper.getOriginalId() : wrapper.getObject().getId()))); + return true; + } + return false; + } + + @Override + public boolean canCatch(TrapWrapper wrapper, NPC npc) { + int x = wrapper.getObject().getLocation().getX(), y = wrapper.getObject().getLocation().getY(); + Direction direction = wrapper.getObject().getDirection(); + int dir = 0; + if (direction == Direction.NORTH) { + if (npc.getLocation().getY() < y) { + dir = 1; + } else { + dir = 0; + } + } else if (direction == Direction.SOUTH) { + if (npc.getLocation().getY() < y) { + dir = 0; + } else { + dir = 1; + } + } else if (direction == Direction.WEST) { + if (npc.getLocation().getX() > x) { + dir = 1; + } else { + dir = 0; + } + } else { + if (npc.getLocation().getX() > x) { + dir = 0; + } else { + dir = 1; + } + } + npc.faceLocation(wrapper.getObject().getLocation()); + wrapper.getObject().getAttributes().setAttribute("kebbit-dir", dir); + return true; + } + + @Override + public boolean isSuccess(Player player, final TrapNode node) { + return true; + } + + @Override + public int getTransformId(TrapWrapper wrapper, TrapNode node) { + int dir = wrapper.getObject().getAttributes().getAttribute("kebbit-dir", 0); + int id = dir == 0 ? node.getObjectIds()[0] : node.getObjectIds()[1]; + return id; + } + + @Override + public int getFinalId(TrapWrapper wrapper, TrapNode node) { + return node.getObjectIds()[2]; + } + + @Override + public GameObject buildObject(Player player, Node node) { + return node.asObject().transform(getObjectForNode(node)); + } + + @Override + public String getLimitMessage(Player player) { + return "You can only have one deadfall trap at a time."; + } + + @Override + public boolean exceedsLimit(Player player) { + return player.getHunterManager().getTrapAmount() > 0 ? true : false; + } + + /** + * Gets the list of locations. + * @return the locations. + */ + private List getLocations(GameObject object) { + List locs = new ArrayList<>(); + if (object.getDirection() == Direction.NORTH) { + locs.add(object.getLocation().transform(1, -1, 0)); + locs.add(object.getLocation().transform(1, 1, 0)); + } else if (object.getDirection() == Direction.SOUTH) { + locs.add(object.getLocation().transform(0, 1, 0)); + locs.add(object.getLocation().transform(0, -1, 0)); + } else if (object.getDirection() == Direction.WEST) { + locs.add(object.getLocation().transform(1, 1, 0)); + locs.add(object.getLocation().transform(-1, 1, 0)); + } else { + locs.add(object.getLocation().transform(-1, 0, 0)); + locs.add(object.getLocation().transform(1, 0, 0)); + } + return locs; + } + + /** + * Gets the log the player has. + * @param player the player. + * @return the log. + */ + private Log getLog(Player player) { + for (Log log : Log.values()) { + if (player.getInventory().contains(log.getLogId(), 1)) { + return log; + } + } + return null; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/FalconryActivityPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/FalconryActivityPlugin.java new file mode 100644 index 000000000..6151205bd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/FalconryActivityPlugin.java @@ -0,0 +1,216 @@ +package core.game.node.entity.skill.hunter; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.game.content.activity.ActivityPlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.hunter.falconry.FalconCatch; +import core.game.node.entity.skill.hunter.falconry.FalconryCatchPulse; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents the activity used during falconry practice. + * @author Vexia + */ +public final class FalconryActivityPlugin extends ActivityPlugin { + + /** + * Constructs a new {@code FalconryActivityPlugin} {@code Object}. + */ + public FalconryActivityPlugin() { + this(null); + } + + /** + * Constructs a new {@code FalconryActivityPlugin} {@code Object}. + * @param player the player. + */ + public FalconryActivityPlugin(final Player player) { + super("falconry", true, false, false); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new FalconryActivityPlugin(p); + } + + @Override + public boolean start(final Player player, boolean login, Object... args) { + player.setAttribute("/save:falconry", true); + return super.start(player, login, args); + } + + @Override + public boolean leave(final Entity entity, boolean logout) { + if (!(entity instanceof Player)) { + return super.leave(entity, logout); + } + if (entity instanceof Player) { + if (!logout) { + ((Player) entity).removeAttribute("falconry"); + removeItems((Player) entity); + } + } + return super.leave(entity, logout); + } + + /** + * Method used to remove the items. + */ + public static void removeItems(final Player player) { + player.getInventory().remove(new Item(10023, player.getInventory().getAmount(new Item(10023)))); + player.getInventory().remove(new Item(10024, player.getInventory().getAmount(new Item(10024)))); + player.getEquipment().remove(new Item(10023)); + player.getEquipment().remove(new Item(10024)); + } + + @Override + public boolean teleport(final Entity entity, int type, Node node) { + removeItems((Player) entity); + return true; + } + + @Override + public boolean interact(final Entity e, Node target, Option option) { + return false; + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(2360, 3571, 2396, 3637)); + } + + @Override + public void register() { + PluginManager.definePlugin(new FalconryPlugin()); + } + + /** + * Represents the falconry plugin. + * @author Vexia + */ + public static final class FalconryPlugin extends OptionHandler { + + /** + * Represents the bones. + */ + private static final Item BONES = new Item(526); + + /** + * Represents the falcon item. + */ + private static final Item FALCON = new Item(10024); + + /** + * Represents the falcon glove. + */ + private static final Item GLOVE = new Item(10023); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.forId(5093).getHandlers().put("option:quick-falconry", this); + NPCDefinition.forId(5094).getHandlers().put("option:retrieve", this); + for (FalconCatch falconCatch : FalconCatch.values()) { + NPCDefinition.forId(falconCatch.getNpc()).getHandlers().put("option:catch", this); + } + PluginManager.definePlugin(new Plugin() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(10024).getHandlers().put("equipment", this); + ItemDefinition.forId(10023).getHandlers().put("equipment", this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + final Player player = (Player) args[0]; + switch (identifier) { + case "unequip": + if (player.getZoneMonitor().isInZone("falconry")) { + player.getDialogueInterpreter().sendDialogue("Leave the area in order to remove your falcon."); + return false; + } + break; + } + return true; + } + + }); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "quick-falconry": + player.getDialogueInterpreter().open(5093, null, true); + break; + case "catch": + player.face(((NPC) node)); + player.getPulseManager().run(new FalconryCatchPulse(player, ((NPC) node), FalconCatch.forNPC(((NPC) node)))); + break; + case "retrieve": + final NPC npc = ((NPC) node); + if (!npc.getAttribute("falcon:owner", "").equals(player.getUsername())) { + player.getPacketDispatch().sendMessage("This isn't your falcon."); + return true; + } + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return true; + } + npc.clear(); + HintIconManager.removeHintIcon(player, 1); + final FalconCatch falconCatch = npc.getAttribute("falcon:catch"); + player.getSkills().addExperience(Skills.HUNTER, falconCatch.getExperience(), true); + player.getPacketDispatch().sendMessage("You retrieve the falcon as well as the fur of the dead kebbit."); + player.getInventory().add(falconCatch.getItem()); + player.getInventory().add(BONES); + if (player.getEquipment().remove(GLOVE)) { + player.getEquipment().add(FALCON, true, false); + } else { + player.getInventory().remove(GLOVE); + player.getInventory().add(FALCON); + } + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public boolean isWalk(final Player player, Node node) { + if (node instanceof NPC) { + final NPC n = ((NPC) node); + if (n.getId() == 5093 || n.getId() == 5094) { + return true; + } + } + return false; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterGear.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterGear.java new file mode 100644 index 000000000..361e1d1b9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterGear.java @@ -0,0 +1,81 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a set of hunter gear. + * @author Vexia + */ +public enum HunterGear { + GLOVE_OF_SILENCE(3.0, new Item(10075)), SPOTIER_CAPE(5.0, new Item(10071)), SPOTTED_CAPE(5.0, new Item(10069)), LARUPIA(10.00, new Item(10045), new Item(10043), new Item(10041)), DESERT_GEAR(10.00, new Item(12568), new Item(10063), new Item(10061)), GRAAHK_GEAR(10.00, new Item(10051), new Item(10047), new Item(10049)), KYATT_GEAR(10.00, new Item(10039), new Item(10035), new Item(10037)), JUNGLE_GEAR(8.00, new Item(10059), new Item(10057)), POLAR_GEAR(8.00, new Item(10065), new Item(10067)); + + /** + * Constructs a new {@code Trap} {@code Object}. + * @param equipment the equipment. + * @param chanceRate the rate. + */ + HunterGear(double chanceRate, Item... equipment) { + this.equipment = equipment; + this.chanceRate = chanceRate; + } + + /** + * Represents the equipment. + */ + private final Item[] equipment; + + /** + * Represents the chance it increased. + */ + private final double chanceRate; + + /** + * Method used to check if the player in the gear. + * @param player the player. + * @return the gear. + */ + public static HunterGear inGear(final Player player) { + int contained = 0; + for (HunterGear type : values()) { + for (Item i : type.getEquipment()) { + if (player.getEquipment().containsItem(i)) { + contained += 1; + } + if (contained == type.getEquipment().length) { + return type; + } + } + } + return null; + } + + /** + * Gets the chance rate the player has. + * @param player the player. + * @return the rate. + */ + public static double getChanceRate(Player player) { + final HunterGear gear = inGear(player); + if (gear == null) { + return 0.0; + } + return gear.getChanceRate(); + } + + /** + * Gets the equipment. + * @return The equipment. + */ + public Item[] getEquipment() { + return equipment; + } + + /** + * Gets the increase. + * @return The increase. + */ + public double getChanceRate() { + return chanceRate; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterManager.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterManager.java new file mode 100644 index 000000000..fc0d49554 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterManager.java @@ -0,0 +1,182 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.entity.skill.Skills; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Manages the players hunter state. + * @author Vexia + */ +public final class HunterManager { + + /** + * The list of active traps. + */ + private final List traps = new ArrayList<>(); + + /** + * The player instance. + */ + private final Player player; + + /** + * Constructs a new {@code HunterManager} {@code Object}. + * @param player the player. + */ + public HunterManager(final Player player) { + this.player = player; + } + + /** + * Calles every game pulse. + */ + public void pulse() { + if (traps.size() == 0) { + return; + } + Iterator iterator = traps.iterator(); + TrapWrapper wrapper = null; + while (iterator.hasNext()) { + wrapper = iterator.next(); + if (wrapper.cycle()) { + iterator.remove(); + } + } + } + + /** + * Called when the player logs out. + */ + public void logout() { + Iterator iterator = traps.iterator(); + TrapWrapper wrapper = null; + while (iterator.hasNext()) { + wrapper = iterator.next(); + if (wrapper.getType().getSettings().clear(wrapper, 0)) { + iterator.remove(); + } + } + } + + /** + * Register a hunting trap. + * @param trap the trap. + * @param node the node. + * @param object the object. + * @return {@code True} if registered. + */ + public boolean register(Traps trap, Node node, final GameObject object) { + final TrapWrapper wrapper = new TrapWrapper(player, trap, object); + trap.getSettings().reward(player, node, wrapper); + wrapper.setHook(trap.addHook(wrapper)); + return traps.add(wrapper); + } + + /** + * Removes the wrapper from the registar. + * @param wrapper the wrapper. + * @return {@code True} if so. + */ + public boolean deregister(final TrapWrapper wrapper) { + return traps.remove(wrapper); + } + + /** + * Checks if they're the owner of the trap. + * @param object the object. + * @return {@code True} if they're the owner. + */ + public boolean isOwner(GameObject object) { + return getUid(object) == getUid(); + } + + /** + * Gets the wrapper. + * @param object the object. + * @return the wrapper. + */ + public TrapWrapper getWrapper(GameObject object) { + for (TrapWrapper wrapper : traps) { + if (wrapper.getObject() == object || (wrapper.getSecondary() != null && wrapper.getSecondary() == object)) { + return wrapper; + } + } + return null; + } + + /** + * Checks if the player exceeds the trap limit. + * @return {@code True} if so. + */ + public boolean exceedsTrapLimit(Traps trap) { + if (trap.getSettings().exceedsLimit(player)) { + return true; + } + return traps.size() + 1 > getMaximumTraps(); + } + + /** + * Gets the trap amount. + * @return the trap amount. + */ + public int getTrapAmount() { + return traps.size(); + } + + /** + * Gets the maximum amount of traps. + * @return the traps. + */ + public int getMaximumTraps() { + final int level = getStaticLevel(); + return level >= 80 ? 5 : level >= 60 ? 4 : level >= 40 ? 3 : level >= 20 ? 2 : 1; + } + + /** + * Gets the uid of a trap. + * @param object the object. + * @return the uid. + */ + public int getUid(GameObject object) { + return object.getAttributes().getAttribute("trap-uid", 0); + } + + /** + * Gets the uid of this manager. + * @return the manager. + */ + public int getUid() { + return player.getName().hashCode(); + } + + /** + * Gets the static level. + * @return the level. + */ + public int getStaticLevel() { + return player.getSkills().getStaticLevel(Skills.HUNTER); + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the traps. + * @return The traps. + */ + public List getTraps() { + return traps; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterNPC.java new file mode 100644 index 000000000..4ff92a069 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterNPC.java @@ -0,0 +1,118 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles a hunter npc. + * @author Vexia + */ +public final class HunterNPC extends AbstractNPC { + + /** + * The trap type. + */ + private final Traps trap; + + /** + * The trap type node. + */ + private final TrapNode type; + + /** + * Constructs a new {@code HunterNPC} {@code Object}. + */ + public HunterNPC() { + this(0, null, null, null); + this.setWalks(true); + } + + /** + * Constructs a new {@code HunterNPC} {@code Object}. + * @param id the id. + * @param location the location. + * @param trap the trap. + * @param type the type. + */ + public HunterNPC(int id, Location location, Traps trap, TrapNode type) { + super(id, location); + this.trap = trap; + this.type = type; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + Object[] data = Traps.getNode(id); + return new HunterNPC(id, location, (Traps) data[0], (TrapNode) data[1]); + } + + @Override + public void updateLocation(Location last) { + final TrapWrapper wrapper = trap.getByHook(getLocation()); + if (wrapper != null) { + wrapper.getType().catchNpc(wrapper, this); + } + } + + @Override + protected Location getMovementDestination() { + if (trap.getHooks().size() == 0 || RandomFunction.random(170) > 5) { + return super.getMovementDestination(); + } + TrapHook hook = trap.getHooks().get(RandomFunction.random(trap.getHooks().size())); + if (hook == null || !type.canCatch(hook.getWrapper(), this)) { + return super.getMovementDestination(); + } + Location destination = hook.getChanceLocation(); + return destination != null && destination.getDistance(getLocation()) <= 24 ? destination : super.getMovementDestination(); + } + + @Override + public void handleDrops(Player p, Entity killer) { + int ticks = getAttribute("hunter", 0); + if (ticks < GameWorld.getTicks()) { + super.handleDrops(p, killer); + } + } + + @Override + public int[] getIds() { + List ids = new ArrayList<>(); + for (Traps t : Traps.values()) { + for (TrapNode node : t.getNodes()) { + for (int id : node.getNpcIds()) { + ids.add(id); + } + } + } + int[] array = new int[ids.size()]; + for (int i = 0; i < array.length; i++) { + array[i] = ids.get(i); + } + return array; + } + + /** + * Gets the type. + * @return The type. + */ + public TrapNode getType() { + return type; + } + + /** + * Gets the trap. + * @return The trap. + */ + public Traps getTrap() { + return trap; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterPlugin.java new file mode 100644 index 000000000..6e8594127 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/HunterPlugin.java @@ -0,0 +1,311 @@ +package core.game.node.entity.skill.hunter; + +import core.cache.def.Definition; +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.hunter.NetTrapSetting.NetTrap; +import core.game.node.entity.skill.hunter.bnet.BNetNode; +import core.game.node.entity.skill.hunter.bnet.BNetTypes; +import core.game.node.entity.skill.hunter.bnet.ImplingNode; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the hunter skill. + * @author Vexia + */ +@Initializable +public final class HunterPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + Definition definition = null; + for (Traps trap : Traps.values()) { + for (int nodeId : trap.getSettings().getNodeIds()) { + definition = trap.getSettings().isObjectTrap() ? ObjectDefinition.forId(nodeId) : ItemDefinition.forId(nodeId); + definition.getHandlers().put("option:" + trap.getSettings().getOption(), this); + } + if (trap.getSettings().getFailId() != -1) { + definition = ObjectDefinition.forId(trap.getSettings().getFailId()); + definition.getHandlers().put("option:dismantle", this); + definition.getHandlers().put("option:deactivate", this); + } + for (int objectId : trap.getSettings().getObjectIds()) { + definition = ObjectDefinition.forId(objectId); + definition.getHandlers().put("option:deactivate", this); + definition.getHandlers().put("option:dismantle", this); + definition.getHandlers().put("option:investigate", this); + } + for (TrapNode node : trap.getNodes()) { + for (int objectId : node.getObjectIds()) { + definition = ObjectDefinition.forId(objectId); + definition.getHandlers().put("option:check", this); + definition.getHandlers().put("option:retrieve", this); + } + } + } + for (NetTrap trap : NetTrap.values()) { + ObjectDefinition.forId(trap.getBent()).getHandlers().put("option:dismantle", this); + ObjectDefinition.forId(trap.getFailed()).getHandlers().put("option:dismantle", this); + ObjectDefinition.forId(trap.getNet()).getHandlers().put("option:dismantle", this); + ObjectDefinition.forId(trap.getCaught()).getHandlers().put("option:check", this); + ObjectDefinition.forId(trap.getBent()).getHandlers().put("option:investigate", this); + ObjectDefinition.forId(trap.getFailed()).getHandlers().put("option:investigate", this); + ObjectDefinition.forId(trap.getNet()).getHandlers().put("option:investigate", this); + } + PluginManager.definePlugin(new HunterNPC()); + PluginManager.definePlugin(new HunterNetPlugin()); + PluginManager.definePlugin(new HunterItemPlugin()); + PluginManager.definePlugin(new FalconryActivityPlugin()); + PluginManager.definePlugin(new HuntingItemUseWithHandler()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Traps trap = Traps.forNode(node); + switch (option) { + case "lay": + case "activate": + case "set-trap": + case "trap": + trap.create(player, node); + return true; + case "dismantle": + case "deactivate": + case "retrieve": + case "check": + trap.dismantle(player, (GameObject) node); + return true; + case "investigate": + trap.investigate(player, (GameObject) node); + return true; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n.getName().startsWith("Bird")) { + if (node.getLocation().equals(n.getLocation())) { + return n.getLocation().transform(node.getDirection(), 1); + } + } + return null; + } + + @Override + public boolean isWalk(Player player, Node node) { + return node instanceof GroundItem || !(node instanceof Item); + } + + @Override + public boolean isWalk() { + return false; + } + + /** + * Handles the usage of an item on a trap. + * @author Vexia + */ + public final static class HuntingItemUseWithHandler extends UseWithHandler { + + /** + * Constructs a new {@code HuntingItemUseWithHandler} {@code Object}. + */ + public HuntingItemUseWithHandler() { + super(getIds()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Traps trap : Traps.values()) { + for (int objectId : trap.getSettings().getObjectIds()) { + addHandler(objectId, OBJECT_TYPE, this); + } + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final GameObject object = event.getUsedWith() instanceof GameObject ? (GameObject) event.getUsedWith() : (GameObject) event.getUsed(); + final Item item = event.getUsedItem(); + if (!player.getHunterManager().isOwner(object)) { + player.sendMessage("This isn't your trap!"); + return true; + } + final TrapWrapper wrapper = player.getHunterManager().getWrapper(object); + if (item.getId() == 594) { + wrapper.smoke(); + } else { + wrapper.bait(item); + } + return true; + } + + /** + * Gets the ids to be used. + * @return the ids. + */ + public static int[] getIds() { + List list = new ArrayList<>(); + for (Traps trap : Traps.values()) { + for (int id : trap.getSettings().getBaitIds()) { + list.add(id); + } + } + list.add(594); + int[] array = new int[list.size()]; + for (int i = 0; i < array.length; i++) { + array[i] = list.get(i); + } + return array; + } + + } + + /** + * Handles a hunter item plugin. + * @author Vexia + */ + public static final class HunterItemPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("release", this); + for (int i = BNetTypes.BABY_IMPLING.ordinal() - 1; i < BNetTypes.values().length; i++) { + BNetTypes.values()[i].getNode().getReward().getDefinition().getHandlers().put("option:loot", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "release": + ReleaseType type = ReleaseType.forId(node.getId()); + if (type != null) { + type.release(player, (Item) node); + } + break; + case "loot": + ((ImplingNode) BNetTypes.forItem((Item) node)).loot(player, (Item) node); + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + /** + * A release type. + * @author Vexia + */ + public enum ReleaseType { + TRAPS(10033, 10034, 10092, 10146, 10147, 10148, 10149), BUTTERFLY(10020, 10018, 10016, 10014) { + @Override + public void release(final Player player, final Item item) { + BNetNode node = BNetTypes.forItem(item); + if (player.getInventory().remove(item)) { + player.animate(Animation.create(5213)); + player.getInventory().add(new Item(10012)); + player.graphics(node.getGraphics()[1]); + } + } + }; + + /** + * The ids of the item. + */ + private final int[] ids; + + /** + * Constructs a new {@code ReleaseType} {@code Object}. + * @param ids the ids. + */ + private ReleaseType(int... ids) { + this.ids = ids; + } + + /** + * Releases an item. + * @param player the player. + * @param item the item. + */ + public void release(final Player player, final Item item) { + boolean multiple = item.getAmount() > 1; + player.getInventory().remove(item); + player.sendMessage("You release the " + item.getName().toLowerCase() + (multiple ? "s" : "") + " and " + (multiple ? "they" : "it") + " bound" + (!multiple ? "s" : "") + " away."); + } + + /** + * Handles a release type. + * @param id the id. + * @return the type. + */ + public static ReleaseType forId(int id) { + for (ReleaseType type : values()) { + for (int i : type.getIds()) { + if (i == id) { + return type; + } + } + } + return null; + } + + /** + * Gets the ids. + * @return The ids. + */ + public int[] getIds() { + return ids; + } + } + } + + /** + * Handles the catching of a hunter npc with a net. + * @author Vexia + */ + public static final class HunterNetPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (BNetTypes type : BNetTypes.values()) { + for (int id : type.getNode().getNpcs()) { + NPCDefinition.forId(id).getHandlers().put("option:catch", this); + } + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + BNetTypes.forNpc((NPC) node).handle(player, (NPC) node); + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/ImpBoxPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/ImpBoxPlugin.java new file mode 100644 index 000000000..4c680ef9a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/ImpBoxPlugin.java @@ -0,0 +1,174 @@ +package core.game.node.entity.skill.hunter; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the imp box. + * @author Taylor + */ +@Initializable +public class ImpBoxPlugin extends OptionHandler { + + /** + * The item ids. + */ + private static final int[] IDS = new int[] { 10028, 10027 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new ImpInterfaceHandler(null)); + for (int id : IDS) { + ItemDefinition.forId(id).getHandlers().put("option:bank", this); + ItemDefinition.forId(id).getHandlers().put("option:talk-to", this); + } + PluginManager.definePlugin(new ImpBoxDialogue()); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "bank": + Component component = new Component(478); + component.setPlugin(new ImpInterfaceHandler((Item) node)); + player.getInterfaceManager().open(component); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 478, 61, 91, player.getInventory(), true)); + break; + case "talk-to": + player.getDialogueInterpreter().open("imp-box"); + break; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + /** + * Handles talk-to dialogue on the imp box. + * @author Taylor + */ + public static class ImpBoxDialogue extends DialoguePlugin { + + /** + * The messages to send. + */ + private static final String[] MESSAGES = { "Let me outa here!", "Errgghh..", "Well look who it is.", "What are you looking at?" }; + + /** + * Constructs a new {@code ImpBoxDialogue} {@code Object}. + */ + public ImpBoxDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ImpBoxDialogue} {@code Object}. + * @param player The player. + */ + public ImpBoxDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ImpBoxDialogue(player); + } + + @Override + public boolean open(Object... args) { + interpreter.sendDialogues(708, FacialExpression.FURIOUS, MESSAGES[RandomFunction.getRandom(MESSAGES.length - 1)]); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey("imp-box") }; + } + + } + + /** + * Handles the imp interface. + * @author Taylor + */ + public class ImpInterfaceHandler extends ComponentPlugin { + + /** + * The message to show when the imp is gone. + */ + private static final String FINISHING_MESSAGE = "The imp teleports away, taking the item to your bank account."; + + /** + * The box the player is using. + */ + private Item box; + + /** + * Constructs a new {@code ImpInterfaceHandler} {@code Object}. + * @param box The box the player is using. + */ + public ImpInterfaceHandler(Item box) { + this.box = box; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(478).setPlugin(this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + Item item = player.getInventory().get(slot); + if (item != null) { + if (player.getBank().canAdd(item) && item.getId() != box.getId()) { + player.getDialogueInterpreter().close(); + player.getInventory().remove(item); + player.getBank().add(item); + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, 478, 61, 91, player.getInventory(), true)); + if (box.getId() == IDS[1]) { + int boxSlot = player.getInventory().getSlot(box); + player.getInventory().replace((box = new Item(IDS[0])), boxSlot); + } else if (box.getId() == IDS[0]) { + int boxSlot = player.getInventory().getSlot(box); + player.getInventory().replace(new Item(10025), boxSlot); + player.getInterfaceManager().close(component); + player.sendMessage(FINISHING_MESSAGE); + } + } + } else { + player.sendMessage("You cannot add this item to your bank."); + return false; + } + return true; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/ImpetuousImpulses.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/ImpetuousImpulses.java new file mode 100644 index 000000000..013612050 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/ImpetuousImpulses.java @@ -0,0 +1,153 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.entity.skill.hunter.bnet.BNetTypes; +import core.game.node.entity.skill.hunter.bnet.ImplingNode; +import core.game.world.GameWorld; +import core.game.world.callback.CallBack; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +import java.util.Random; + +/** + * Handles the impetuous impulse minigame. + * @author Vexia + * @author Emperor + */ +public final class ImpetuousImpulses implements CallBack { + + /** + * The random instance used. + */ + private static final Random RANDOM = new Random(); + + /** + * The puro puro locations. + */ + private static final Location[] PURO_LOCATIONS = new Location[] { new Location(2575, 4314, 0), new Location(2572, 4302, 0), new Location(2575, 4297, 0), new Location(2589, 4297, 0), new Location(2603, 4297, 0), new Location(2612, 4301, 0), new Location(2619, 4296, 0), new Location(2616, 4297, 0), new Location(2620, 4308, 0), new Location(2617, 4313, 0), new Location(2620, 4317, 0), new Location(2611, 4312, 0), new Location(2607, 4305, 0), new Location(2593, 4303, 0), new Location(2578, 4318, 0), new Location(2578, 4330, 0), new Location(2581, 4338, 0), new Location(2586, 4342, 0), Location.create(2585, 4344, 0), Location.create(2573, 4335, 0), Location.create(2570, 4325, 0), Location.create(2567, 4313, 0), Location.create(2566, 4299, 0), Location.create(2573, 4292, 0), Location.create(2603, 4342, 0), Location.create(2616, 4318, 0), Location.create(2616, 4337, 0), Location.create(2584, 4297, 0), Location.create(2596, 4310, 0), Location.create(2596, 4310, 0), Location.create(2588, 4303, 0) }; + + /** + * The possible locations. + */ + public static final Location[] LOCATIONS = new Location[] { + /* + * Camelot + */ + Location.create(2718 + RANDOM.nextInt(50), 3441 + RANDOM.nextInt(20), 0), + /* + * Duel arena entrance + */ + Location.create(3300 + RANDOM.nextInt(10), 3250 + RANDOM.nextInt(10), 0), + /* + * Castle wars entrance + */ + Location.create(2478 + RANDOM.nextInt(20), 3068 + RANDOM.nextInt(20), 0), + /* + * Lumbridge + */ + Location.create(3175 + RANDOM.nextInt(10), 3261 + RANDOM.nextInt(10), 0), + /* + * Draynor + */ + Location.create(3092 + RANDOM.nextInt(5), 3227 + RANDOM.nextInt(5), 0), + /* + * Falador (east) + */ + Location.create(3071 + RANDOM.nextInt(10), 3355 + RANDOM.nextInt(10), 0), + /* + * Varrock (west) + */ + Location.create(3131 + RANDOM.nextInt(5), 3401 + RANDOM.nextInt(5), 0), + /* + * Ardougne (south) + */ + Location.create(2630 + RANDOM.nextInt(10), 3217 + RANDOM.nextInt(10), 0), + /* + * Yanille (north) + */ + Location.create(2594 + RANDOM.nextInt(20), 3121 + RANDOM.nextInt(20), 0), + /* + * Red salamander hunting place (ZMI altar) + */ + Location.create(2436 + RANDOM.nextInt(15), 3206 + RANDOM.nextInt(15), 0), + /* + * Shilo hunting area (graahk/larupia/..) + */ + Location.create(2763 + RANDOM.nextInt(20), 3003 + RANDOM.nextInt(20), 0), + /* + * Rimmington + */ + Location.create(2947 + RANDOM.nextInt(20), 3219 + RANDOM.nextInt(20), 0), + /* + * Karamja volcano + */ + Location.create(2856 + RANDOM.nextInt(15), 3150 + RANDOM.nextInt(15), 0), + /* + * Brimhaven dungeon entrance + */ + Location.create(2733 + RANDOM.nextInt(10), 3146 + RANDOM.nextInt(10), 0), + /* + * Sophanem + */ + Location.create(3299 + RANDOM.nextInt(5), 2784 + RANDOM.nextInt(5), 0), + /* + * Tree gnome stronghold + */ + Location.create(2438 + RANDOM.nextInt(20), 3420 + RANDOM.nextInt(20), 0), + /* + * Zanaris (center, just north of grain field) + */ + Location.create(2416 + RANDOM.nextInt(3), 4456 + RANDOM.nextInt(3), 0), }; + + /** + * Spawns the imps. + */ + private void spawnImps() { + int amount = BNetTypes.getImplings().size() + 2; + for (ImplingNode impling : BNetTypes.getImplings()) { + if (impling.getLevel() == 83) { + int rand = RandomFunction.random(1, 2); + for (int i = 0; i < rand; i++) { + createImp(impling, true); + } + int randAmt = RandomFunction.random(2, 5); + for (int i = 0; i < randAmt; i++) { + createImp(impling, false); + } + continue; + } + for (int i = 0; i < amount; i++) { + if (RANDOM.nextInt(10) < 4) { + createImp(impling, false); + continue; + } + createImp(impling, true); + } + amount--; + } + } + + /** + * Creates the impling. + * @param impling the impling. + * @param puro the puro. + */ + private void createImp(ImplingNode impling, boolean puro) { + ImplingNPC npc = null; + if (puro) { + npc = new ImplingNPC(impling.getNpcs()[1], PURO_LOCATIONS[RANDOM.nextInt(PURO_LOCATIONS.length)], impling); + npc.setAttribute("puroPuro", true); + } else { + npc = new ImplingNPC(impling.getNpcs()[0], LOCATIONS[RANDOM.nextInt(LOCATIONS.length)], impling); + npc.setAttribute("nextTeleport", GameWorld.getTicks() + 600); + } + npc.init(); + } + + @Override + public boolean call() { + spawnImps(); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/ImplingNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/ImplingNPC.java new file mode 100644 index 000000000..ba7444c29 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/ImplingNPC.java @@ -0,0 +1,118 @@ +package core.game.node.entity.skill.hunter; + +import core.game.system.config.NPCConfigParser; +import core.game.node.entity.skill.hunter.bnet.ImplingNode; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +/** + * Handles an impling npc. + * @author Vexia + */ +public final class ImplingNPC extends AbstractNPC { + + /** + * The impling node. + */ + private final ImplingNode impling; + + /** + * Constructs a new {@code ImplingNPC} {@code Object}. + */ + public ImplingNPC() { + super(0, null); + this.impling = null; + this.setWalks(true); + this.setWalkRadius(20); + } + + /** + * Constructs a new {@code ImplingNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public ImplingNPC(int id, Location location, ImplingNode impling) { + super(id, location); + this.impling = impling; + if (impling != null) { + this.getDefinition().getHandlers().put(NPCConfigParser.RESPAWN_DELAY, impling.getRespawnTime()); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new ImplingNPC(id, location, null); + } + + @Override + public void handleTickActions() { + if (!getLocks().isMovementLocked()) { + if (isWalks() && !getPulseManager().hasPulseRunning() && nextWalk < GameWorld.getTicks()) { + setNextWalk(); + Location l = getLocation().transform(-5 + RandomFunction.random(getWalkRadius()), -5 + RandomFunction.random(getWalkRadius()), 0); + if (canMove(l)) { + Pathfinder.find(this, l, true, Pathfinder.PROJECTILE).walk(this); + } + } + } + if (RandomFunction.random(100) < 4) { + sendChat("Tee hee!"); + } + int nextTeleport = getAttribute("nextTeleport", -1); + if (nextTeleport > -1 && GameWorld.getTicks() > nextTeleport) { + setAttribute("nextTeleport", GameWorld.getTicks() + 600); + graphics(new Graphics(590)); + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + teleport(ImpetuousImpulses.LOCATIONS[RandomFunction.random(ImpetuousImpulses.LOCATIONS.length)]); + return true; + } + }); + return; + } + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (style != CombatStyle.MAGIC) { + return false; + } + if (entity.getProperties().getSpell().getSpellId() == 12 || entity.getProperties().getSpell().getSpellId() == 30 || entity.getProperties().getSpell().getSpellId() == 56) { + return true; + } + return super.isAttackable(entity, style); + } + + @Override + public void handleDrops(Player p, Entity killer) { + getProperties().setTeleportLocation(getProperties().getSpawnLocation()); + } + + @Override + public void checkImpact(BattleState state) { + } + + @Override + public int[] getIds() { + return new int[] {}; + } + + /** + * Gets the impling. + * @return The impling. + */ + public ImplingNode getImpling() { + return impling; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/MagicBoxSetting.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/MagicBoxSetting.java new file mode 100644 index 000000000..d721700dc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/MagicBoxSetting.java @@ -0,0 +1,40 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; + +/** + * Handles the magic box. + * @author Vexia + */ +public final class MagicBoxSetting extends TrapSetting { + + /** + * Constructs a new {@code MagicBoxSetting} {@code Object}. + */ + public MagicBoxSetting() { + super(10025, new int[] { 19223 }, new int[] { 1470, 1472, 1476, 1474 }, "activate", 19224, Animation.create(5208), Animation.create(9726), 27); + } + + @Override + public void handleCatch(int counter, TrapWrapper wrapper, TrapNode node, NPC npc, boolean success) { + switch (counter) { + case 2: + if (success) { + wrapper.getPlayer().getPacketDispatch().sendPositionedGraphic(932, 0, 0, npc.getLocation()); + } + break; + case 3: + npc.moveStep(); + break; + } + } + + @Override + public void addTool(Player player, TrapWrapper wrapper, int type) { + if (!wrapper.isCaught()) { + super.addTool(player, wrapper, type); + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/NetTrapSetting.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/NetTrapSetting.java new file mode 100644 index 000000000..31892abeb --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/NetTrapSetting.java @@ -0,0 +1,301 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the net trap. + * @author Vexia + */ +public final class NetTrapSetting extends TrapSetting { + + /** + * Constructs a new {@code NetTrapSetting} {@code Object}. + */ + public NetTrapSetting() { + super(new int[] { 19652, 19663, 19671, 19679, 28564 }, new Item[] { new Item(303), new Item(954) }, NetTrap.getIds(), new int[] { 10142, 10143, 10144, 10145 }, "set-trap", 29, -1, new Animation(5215), Animation.create(5207), true); + } + + @Override + public boolean hasItems(Player player) { + if (!super.hasItems(player)) { + player.sendMessage("You need a net and a rope to set a net trap."); + return false; + } + return true; + } + + @Override + public boolean clear(TrapWrapper wrapper, int type) { + if (super.clear(wrapper, type)) { + if (wrapper.getSecondary() != null && wrapper.getSecondary().isActive()) { + ObjectBuilder.remove(wrapper.getSecondary()); + } + ObjectBuilder.add(wrapper.getObject().transform(wrapper.getNetType().getOriginal())); + return true; + } + return false; + } + + @Override + public void returnItems(GameObject object, TrapWrapper wrapper, int type) { + super.returnItems(object, wrapper, type); + if (type == 0) { + for (Item i : super.getItems()) { + createGroundItem(i, object.getLocation(), wrapper.getPlayer()); + } + } + } + + @Override + public void reward(Player player, Node node, TrapWrapper wrapper) { + GameObject object = wrapper.getObject(); + wrapper.setNetType(NetTrap.forId(node.getId())); + int rotation = 0; + int increment = 0; + boolean x = false; + Object[] netInfo = getNetInfo(player, node); + rotation = (int) netInfo[0]; + increment = (int) netInfo[1]; + x = (boolean) netInfo[2]; + GameObject secondary = new GameObject(wrapper.getNetType().getNet(), object.getLocation().transform(x ? increment : 0, !x ? increment : 0, 0), rotation); + secondary = ObjectBuilder.add(secondary); + wrapper.setSecondary(secondary); + player.moveStep(); + wrapper.addItem(getItems()); + player.getInventory().remove(wrapper.getType().getSettings().getItems()); + } + + @Override + public void handleCatch(int counter, TrapWrapper wrapper, TrapNode node, NPC npc, boolean success) { + switch (counter) { + case 2: + ObjectBuilder.remove(wrapper.getSecondary()); + break; + case 3: + npc.moveStep(); + wrapper.setObject(wrapper.getNetType().getFailed()); + break; + } + } + + @Override + public GameObject buildObject(Player player, Node node) { + return ((GameObject) node).transform(NetTrap.forId(node.getId()).getBent()); + } + + @Override + public TrapHook createHook(TrapWrapper wrapper) { + return new TrapHook(wrapper, new Location[] { wrapper.getSecondary().getLocation() }); + } + + @Override + public int getTransformId(TrapWrapper wrapper, TrapNode node) { + return wrapper.getNetType().getCatching(); + } + + @Override + public int getFinalId(TrapWrapper wrapper, TrapNode node) { + return wrapper.getNetType().getCaught(); + } + + @Override + public int getFailId(TrapWrapper wrapper, TrapNode node) { + return wrapper.getNetType().getFailing(); + } + + @Override + public String getTimeUpMessage() { + return "The net trap that you constructed has collapsed."; + } + + /** + * Gets the net info. + * @param player the player. + * @param node the node. + * @return the data. + */ + private Object[] getNetInfo(Player player, Node node) { + int rotation; + int increment; + boolean x = false; + if (player.getLocation().getX() < node.getLocation().getX()) { + rotation = 3; + increment = -1; + x = true; + } else if (player.getLocation().getX() > node.getLocation().getX()) { + rotation = 1; + increment = 1; + x = true; + } else if (player.getLocation().getY() < node.getLocation().getY()) { + rotation = 2; + increment = -1; + } else { + rotation = 0; + increment = 1; + } + return new Object[] { rotation, increment, x }; + } + + /** + * Represents a net trap. + * @author Vexia + */ + public enum NetTrap { + GREEN(19679, 19678, 19676, 19677, 19674, 19675, 19651), SQUIREL(28564, 28563, 28752, 28753, 28750, 28751, 28566), ORANGE(19652, 19650, 19657, 19656, 19655, 19654, 19665), RED(19663, 19662, 19660, 19661, 19658, 19659, 19673), BLACK(19671, 19670, 19668, 19669, 19666, 19667, 19681); + + /** + * Represents the original object id. + */ + private final int original; + + /** + * Represents the bend object id. + */ + private final int bent; + + /** + * Represents the failing object id. + */ + private final int failing; + + /** + * Represents the failed object id. + */ + private final int failed; + + /** + * Represents the catching object id. + */ + private final int catching; + + /** + * Represents the caught object id. + */ + private final int caught; + + /** + * Represents the net. + */ + private final int net; + + /** + * Constructs a new {@code StationaryCatch.java} {@code Object}. + * @param original the original. + * @param bent the bent. + * @param failing the failing. + * @param failed the failed. + * @param catching the catching. + * @param caught the caught. + * @param net the net. + */ + NetTrap(int original, int bent, int failing, int failed, int catching, int caught, int net) { + this.original = original; + this.bent = bent; + this.failing = failing; + this.failed = failed; + this.catching = catching; + this.caught = caught; + this.net = net; + } + + /** + * Gets the net trap for the id. + * @param id the id. + * @return the trap. + */ + public static NetTrap forId(int id) { + for (NetTrap trap : values()) { + if (trap.getOriginal() == id) { + return trap; + } + } + return null; + } + + /** + * Gets the id. + * @return the array. + */ + public static int[] getIds() { + List ids = new ArrayList<>(); + for (NetTrap trap : NetTrap.values()) { + ids.add(trap.getBent()); + ids.add(trap.getCaught()); + ids.add(trap.getNet()); + ids.add(trap.getOriginal()); + } + int[] array = new int[ids.size()]; + for (int i = 0; i < array.length; i++) { + array[i] = ids.get(i); + } + return array; + } + + /** + * Gets the original. + * @return The original. + */ + public int getOriginal() { + return original; + } + + /** + * Gets the bent. + * @return The bent. + */ + public int getBent() { + return bent; + } + + /** + * Gets the failed. + * @return The failed. + */ + public int getFailed() { + return failed; + } + + /** + * Gets the catching. + * @return The catching. + */ + public int getCatching() { + return catching; + } + + /** + * Gets the caught. + * @return The caught. + */ + public int getCaught() { + return caught; + } + + /** + * Gets the failing. + * @return The failing. + */ + public int getFailing() { + return failing; + } + + /** + * Gets the net. + * @return The net. + */ + public int getNet() { + return net; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/PolarKebbitHunting.kt b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/PolarKebbitHunting.kt new file mode 100644 index 000000000..ce13cd52e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/PolarKebbitHunting.kt @@ -0,0 +1,10 @@ +/* +package core.game.node.entity.skill.hunter + +private const val VARP = 926 +class PolarKebbitHunting { + private enum class TrailType{ + va + } + private enum class Trail(val offset: Int, var ) +}*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapCreatePulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapCreatePulse.java new file mode 100644 index 000000000..ffbdf7104 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapCreatePulse.java @@ -0,0 +1,146 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; + +/** + * Handles the trap creating pulse. + * @author Vexia + */ +public final class TrapCreatePulse extends SkillPulse { + + /** + * The starting location of the trap. + */ + private final Location startLocation; + + /** + * The ground item of the trap. + */ + private GroundItem groundItem; + + /** + * The trap type. + */ + private final Traps trap; + + /** + * The amounts of ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code TrapCreatePulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param trap the trap. + */ + public TrapCreatePulse(Player player, Node node, Traps trap) { + super(player, node); + this.trap = trap; + this.startLocation = node instanceof GroundItem ? node.getLocation() : player.getLocation(); + } + + @Override + public boolean checkRequirements() { + if (player.getHunterManager().getStaticLevel() < trap.getSettings().getLevel()) { + player.sendMessage("You need a Hunter level of at least " + trap.getSettings().getLevel() + " in order to setup a " + node.getName().toLowerCase() + "."); + return false; + } + if (player.getHunterManager().exceedsTrapLimit(trap)) { + player.sendMessage(trap.getSettings().getLimitMessage(player)); + return false; + } + if (RegionManager.getObject(player.getLocation()) != null) { + player.sendMessage("You can't lay a trap here."); + return false; + } + if (!player.getLocation().equals(startLocation)) { + return false; + } + if (trap.getSettings().isObjectTrap() && !trap.getSettings().hasItems(player)) { + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks < 1) { + player.getAnimator().forceAnimation(trap.getSettings().getSetupAnimation()); + } + } + + @Override + public boolean reward() { + if (++ticks % (trap.getSettings().getSetupAnimation().getDefinition().getDurationTicks()) != 0) { + return false; + } + GameObject object = trap.getSettings().buildObject(player, node); + if (isGroundSetup() || groundItem != null) { + GroundItemManager.destroy(groundItem); + } + if (!trap.getSettings().isObjectTrap()) { + player.moveStep(); + } else { + ObjectBuilder.remove(node.asObject()); + } + object = ObjectBuilder.add(object); + player.getHunterManager().register(trap, node, object); + return true; + } + + @Override + public void message(int type) { + switch (type) { + case 0: + setUp(); + player.getPacketDispatch().sendMessage("You begin setting up the trap."); + break; + } + } + + /** + * Sets up the trap. + */ + private void setUp() { + player.lock(1); + player.getWalkingQueue().reset(); + if (trap.getSettings().isObjectTrap()) { + + } else { + if (!isGroundSetup()) { + if (player.getInventory().remove((Item) node)) { + groundItem = new GroundItem((Item) node, player.getLocation(), player); + GroundItemManager.create(groundItem); + } + return; + } + groundItem = (GroundItem) node; + } + } + + /** + * If we're setting it up from the ground. + * @return {@code True} if so. + */ + public boolean isGroundSetup() { + return node instanceof GroundItem; + } + + /** + * Gets the trap. + * @return The trap. + */ + public Traps getTrap() { + return trap; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapDismantlePulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapDismantlePulse.java new file mode 100644 index 000000000..91d81342b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapDismantlePulse.java @@ -0,0 +1,112 @@ +package core.game.node.entity.skill.hunter; + +import core.game.content.global.SkillingPets; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; + +/** + * Handles the dismantling of a trap. + * @author Vexia + */ +public final class TrapDismantlePulse extends SkillPulse { + + /** + * The trap wrapper. + */ + private final TrapWrapper wrapper; + + /** + * The trap type. + */ + private final Traps trap; + + /** + * The ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code TrapDismantlePulse} {@code Object}. + * @param player the player. + * @param node the node. + */ + public TrapDismantlePulse(Player player, GameObject node, final TrapWrapper wrapper) { + super(player, node); + this.trap = wrapper.getType(); + this.wrapper = wrapper; + } + + @Override + public boolean checkRequirements() { + if (wrapper == null || !player.getHunterManager().isOwner(node)) { + player.sendMessage("This isn't your trap!"); + return false; + } + final int itemCount = wrapper.getItems().size() + (wrapper.getType().getSettings().isObjectTrap() ? 0 : 1); + final int difference = itemCount - player.getInventory().freeSlots(); + if (player.getInventory().freeSlots() < itemCount) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space. You need " + difference + " more free slot" + (difference > 1 ? "s" : "") + "."); + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks < 1) { + player.getAnimator().forceAnimation(trap.getSettings().getDismantleAnimation()); + } + } + + @Override + public boolean reward() { + if (++ticks % (trap.getSettings().getDismantleAnimation().getDefinition().getDurationTicks() + 1) != 0) { + return false; + } + if (wrapper.getType().getSettings().clear(wrapper, 1)) { + player.getHunterManager().deregister(wrapper); + if (wrapper.isCaught()) { + if (wrapper.getType().equals(Traps.BOX_TRAP)) { + for (int i : wrapper.getReward().getNpcIds()) { + if (i == 5080 || i == 5079) { + SkillingPets.checkPetDrop(player, i == 5080 ? SkillingPets.BABY_RED_CHINCHOMPA : SkillingPets.BABY_GREY_CHINCHOMPA); + } + } + } + player.getSkills().addExperience(Skills.HUNTER, wrapper.getReward().getExperience(), true); + } + player.getPacketDispatch().sendMessage("You dismantle the trap."); + } + return true; + } + + @Override + public void message(int type) { + switch (type) { + case 0: + int ticks = wrapper.getTicks() + (wrapper.getType().getSettings().getDismantleAnimation().getDefinition().getDurationTicks()) + 1; + wrapper.setTicks(ticks); + wrapper.setBusyTicks(ticks); + break; + } + } + + /** + * Gets the trap. + * @return The trap. + */ + public Traps getTrap() { + return trap; + } + + /** + * Gets the wrapper. + * @return The wrapper. + */ + public TrapWrapper getWrapper() { + return wrapper; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapHook.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapHook.java new file mode 100644 index 000000000..6c58899f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapHook.java @@ -0,0 +1,77 @@ +package core.game.node.entity.skill.hunter; + +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * A trap location hook. + * @author Vexia + */ +public class TrapHook { + + /** + * The wrapper of the hook. + */ + private final TrapWrapper wrapper; + + /** + * The locations for the trap to trigger. + */ + private final Location[] locations; + + /** + * Constructs a new {@code TrapHook} {@code Object}. + * @param wrapper the wrapper. + * @param locations the locations. + */ + public TrapHook(TrapWrapper wrapper, Location[] locations) { + this.wrapper = wrapper; + this.locations = locations; + } + + /** + * Gets a location by chance for the npc to go to. + * @return the location. + */ + public Location getChanceLocation() { + final double chance = wrapper.getChanceRate(); + final int roll = RandomFunction.random(99); + final double successChance = (GameWorld.getSettings().isDevMode() ? 100 : 55.0) + chance; + if (successChance > roll) { + return RandomFunction.getRandomElement(locations); + } + return null; + } + + /** + * Checks if the trap is hooked. + * @param location the location. + * @return {@code True} if hooked. + */ + public boolean isHooked(Location location) { + for (Location l : locations) { + if (l.equals(location)) { + return true; + } + } + return false; + } + + /** + * Gets the wrapper. + * @return The wrapper. + */ + public TrapWrapper getWrapper() { + return wrapper; + } + + /** + * Gets the locations. + * @return The locations. + */ + public Location[] getLocations() { + return locations; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapNode.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapNode.java new file mode 100644 index 000000000..2ed3e6fb9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapNode.java @@ -0,0 +1,129 @@ +package core.game.node.entity.skill.hunter; + +import core.game.content.global.SkillingPets; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a node for a trap. + * @author Vexia + */ +public class TrapNode { + + /** + * The npc ids related to the node. + */ + private final int[] npcIds; + + /** + * The level required. + */ + private final int level; + + /** + * The experience received. + */ + private final double experience; + + /** + * The object ids for this node. + */ + private final int[] objectIds; + + /** + * The rewards received. + */ + private final Item[] rewards; + + /** + * Constructs a new {@code TrapNode} {@code Object}. + * @param npcIds the npc ids. + * @param level the level. + * @param experience the experience. + * @param rewards the rewards. + */ + public TrapNode(int[] npcIds, int level, double experience, int[] objectIds, Item[] rewards) { + this.npcIds = npcIds; + this.level = level; + this.experience = experience; + this.objectIds = objectIds; + this.rewards = rewards; + } + + /** + * Has the requirements to catch the node. + * @param wrapper the wrapper. + * @param npc the npc. + * @return {@code True} if so. + * @note Override for quests. + */ + public boolean canCatch(TrapWrapper wrapper, final NPC npc) { + final Player player = wrapper.getPlayer(); + if (wrapper.isCaught() || wrapper.isBusy() || wrapper.isFailed()) { + return false; + } + return player.getHunterManager().getStaticLevel() >= level && !npc.isInvisible(); + } + + /** + * Gets the transform id. + * @return the id. + */ + public int getTransformId() { + return objectIds[0]; + } + + /** + * Gets the final id. + * @return the id. + */ + public int getFinalId() { + return objectIds[1]; + } + + /** + * Gets the npcIds. + * @return The npcIds. + */ + public int[] getNpcIds() { + return npcIds; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the rewards. + * @return The rewards. + */ + public Item[] getRewards() { + return rewards; + } + + /** + * Gets the objectIds. + * @return The objectIds. + */ + public int[] getObjectIds() { + return objectIds; + } + + public SkillingPets getPet() { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapSetting.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapSetting.java new file mode 100644 index 000000000..524b346a2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapSetting.java @@ -0,0 +1,588 @@ +package core.game.node.entity.skill.hunter; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +/** + * A setting for a trap type. + * @author Vexia + */ +public class TrapSetting { + + /** + * The node ids to create the trap. + */ + private final int[] nodeIds; + + /** + * The items required. + */ + private final Item[] items; + + /** + * The create option. + */ + private final String option; + + /** + * The level required to set the trap. + */ + private final int level; + + /** + * The setup animation of the trap. + */ + private final Animation setupAnimation; + + /** + * The animation + */ + private final Animation dismantleAnimation; + + /** + * The fail object id. + */ + private final int failId; + + /** + * The corresponding object ids. + */ + private final int[] objectIds; + + /** + * The bait ids. + */ + private final int[] baitIds; + + /** + * If it's an object trap. + */ + private final boolean objectTrap; + + /** + * Constructs a new {@code TrapSetting} {@code Object}. + * @param nodeIds the node ids. + * @param items the items. + * @param level the level. + * @param option the option. + * @param setupAnimation the animation. + * @param objectTrap if an object trap. + */ + public TrapSetting(int[] nodeIds, Item[] items, int[] objectIds, final int[] baitIds, final String option, int level, final int failId, final Animation setupAnimation, final Animation dismantleAnimation, boolean objectTrap) { + this.nodeIds = nodeIds; + this.items = items; + this.objectIds = objectIds; + this.baitIds = baitIds; + this.level = level; + this.option = option; + this.objectTrap = objectTrap; + this.failId = failId; + this.setupAnimation = setupAnimation; + this.dismantleAnimation = dismantleAnimation; + } + + /*** + * Constructs a new {@code TrapSetting} {@code Object}. + * @param nodeId the node id. + * @param items the items. + * @param option the option. + * @param level the level. + * @param objectTrap if an object trap. + */ + public TrapSetting(int nodeId, Item[] items, int[] objectIds, final int[] baitIds, final String option, int level, final int failId, final Animation setupAnimation, final Animation dismantleAnimation, boolean objectTrap) { + this(new int[] { nodeId }, items, objectIds, baitIds, option, level, failId, setupAnimation, dismantleAnimation, objectTrap); + } + + /** + * Constructs a new {@code TrapSetting} {@code Object}. + * @param nodeId the node id. + * @param option the option. + * @param objectIds the ids. + * @param level the level. + */ + public TrapSetting(int nodeId, int[] objectIds, final int[] baitIds, String option, final int failId, final Animation setupAnimation, final Animation dismantleAnimation, int level) { + this(new int[] { nodeId }, objectIds, baitIds, option, level, failId, setupAnimation, dismantleAnimation, false); + } + + /** + * Constructs a new {@code TrapSetting} {@code Object}. + * @param nodeIds the node ids. + * @param option the option. + * @param level the level. + * @param objectTrap the object trap. + */ + public TrapSetting(int[] nodeIds, int[] objectIds, final int[] baitIds, String option, int level, final int failId, final Animation setupAnimation, final Animation dismantleAnimation, boolean objectTrap) { + this(nodeIds, new Item[] { new Item(nodeIds[0]) }, objectIds, baitIds, option, level, failId, setupAnimation, dismantleAnimation, objectTrap); + } + + /** + * Clears the trap. + * @param wrapper the wrapper. + * @param type the clear type (0=groundItems, 1=inventory) + * @return {@code True} if cleared. + */ + public boolean clear(TrapWrapper wrapper, int type) { + GameObject object = wrapper.getObject(); + returnItems(object, wrapper, type); + wrapper.getType().getHooks().remove(wrapper.getHook()); + removeObject(wrapper); + return true; + } + + /** + * Returns the items to the ground or player. + * @param object the object. + * @param wrapper the wrapper. + * @param type the type. + */ + public void returnItems(GameObject object, TrapWrapper wrapper, int type) { + boolean ground = type == 0; + Player player = wrapper.getPlayer(); + if (!isObjectTrap()) { + if (ground) { + createGroundItem(items[0], object.getLocation(), wrapper.getPlayer()); + return; + } + addTool(player, wrapper, type); + player.getInventory().add(wrapper.getItems().toArray(new Item[] {})); + } else { + if (isObjectTrap() && !ground) { + player.getInventory().add(wrapper.getItems().toArray(new Item[] {})); + return; + } + } + } + + /** + * Adds the tool back to the inventory. + * @param player the player. + * @param wrapper the wrapper. + * @param type the type. + */ + public void addTool(Player player, TrapWrapper wrapper, int type) { + player.getInventory().add(items[0]); + } + + /** + * Checks if the player has the required items. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasItems(Player player) { + for (Item item : items) { + if (!player.getInventory().containsItem(item)) { + return false; + } + } + return true; + } + + /** + * Creates a ground item. + * @param item the item. + * @param location the location. + * @param player the player. + */ + public void createGroundItem(Item item, Location location, Player player) { + GroundItemManager.create(new GroundItem(item, location, player)); + } + + /** + * Removes the object from a wrapper. + * @param wrapper the object. + */ + public boolean removeObject(TrapWrapper wrapper) { + return removeObject(wrapper.getObject()); + } + + /** + * Removes the object from the region. + * @param object the object. + * @return {@code True} if so. + */ + public boolean removeObject(GameObject object) { + return ObjectBuilder.remove(object); + } + + /** + * Builds a game object. + * @param node the node. + * @return the object. + */ + public GameObject buildObject(Player player, Node node) { + return new GameObject(objectIds[0], player.getLocation()); + } + + /** + * Investigates a trap. + * @param player the player. + * @param object the object. + */ + public void investigate(Player player, GameObject object) { + if (!player.getHunterManager().isOwner(object)) { + player.sendMessage("This isn't your trap."); + return; + } + TrapWrapper wrapper = player.getHunterManager().getWrapper(object); + player.sendMessage("This trap " + (wrapper.isSmoked() ? "has" : "hasn't") + " been smoked."); + } + + /** + * Catches an npc. + * @param wrapper the wrapper. + * @param npc the npc. + */ + public void catchNpc(final TrapWrapper wrapper, final TrapNode node, final NPC npc) { + final boolean success = isSuccess(wrapper.getPlayer(), node); + int ticks = success ? 3 : 2; + npc.lock(ticks); + wrapper.setBusyTicks(ticks); + npc.getWalkingQueue().reset(); + npc.getPulseManager().clear(); + wrapper.setTicks(wrapper.getTicks() + 4); + GameWorld.getPulser().submit(getCatchPulse(wrapper, node, npc, success)); + } + + /** + * Handles the catch on a pulse. + * @param counter the counter. + * @param wrapper the wrapper. + * @param node the node. + * @param npc the npc. + * @param success the success. + */ + public void handleCatch(int counter, TrapWrapper wrapper, TrapNode node, NPC npc, boolean success) { + } + + /** + * Gets the catch pulse. + * @param wrapper the wrapper. + * @param node the node. + * @param npc the npc. + * @return the pulse. + */ + public Pulse getCatchPulse(final TrapWrapper wrapper, final TrapNode node, final NPC npc, final boolean success) { + final Player player = wrapper.getPlayer(); + wrapper.setFailed(!success); + return new Pulse(1) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 2: + handleCatch(counter, wrapper, node, npc, success); + if (success) { + int transformId = getTransformId(wrapper, node); + npc.setAttribute("hunter", GameWorld.getTicks() + 6); + npc.finalizeDeath(player); + if (transformId != -1) { + wrapper.setObject(getTransformId(wrapper, node)); + } + npc.getProperties().setTeleportLocation(npc.getProperties().getSpawnLocation()); + break; + } + npc.moveStep(); + wrapper.setObject(getFailId(wrapper, node)); + break; + case 3: + handleCatch(counter, wrapper, node, npc, success); + if (success) { + wrapper.setTicks(GameWorld.getTicks() + 100); + wrapper.setReward(node); + wrapper.setObject(getFinalId(wrapper, node)); + return true; + } + npc.moveStep(); + return true; + } + return false; + } + + }; + } + + /** + * Checks if the catch was successfull. + * @param player the player. + * @param node the node. + * @return {@code True} if so. + */ + public boolean isSuccess(Player player, final TrapNode node) { + double level = player.getHunterManager().getStaticLevel(); + double req = node.getLevel(); + double successChance = Math.ceil((level * 50 - req * 17) / req / 3 * 4); + int roll = RandomFunction.random(99); + if (successChance >= roll) { + return true; + } + return false; + } + + /** + * Creates a trap hook. + * @param wrapper the wrapper. + * @return the hook. + */ + public TrapHook createHook(TrapWrapper wrapper) { + return new TrapHook(wrapper, new Location[] { wrapper.getObject().getLocation() }); + } + + /** + * Calles when an object is setup. + * @param player the player. + * @param node the node. + * @param wrapper the wrapper. + */ + public void reward(Player player, Node node, TrapWrapper wrapper) { + + } + + /** + * A global method to check if a catch can be made. + * @param wrapper the wrapper. + * @param npc the npc. + * @return {@code True} if so. + */ + public boolean canCatch(TrapWrapper wrapper, NPC npc) { + return true; + } + + /** + * Checks if the bait corresponds. + * @param bait the bait. + * @return {@code True} if so. + */ + public boolean hasBait(Item bait) { + for (int id : getBaitIds()) { + if (id == bait.getId()) { + return true; + } + } + return false; + } + + /** + * Gets the node for the object. + * @param objectId the object. + * @return the node id. + */ + public int getNodeForObjectId(int objectId) { + return getNodeForObject(getObjectIndex(objectId)); + } + + /** + * Gets the node for the object. + * @param index the index. + * @return the id. + */ + public int getNodeForObject(int index) { + return nodeIds[index]; + } + + /** + * Gets the object id for the node. + * @param node the node. the id. + */ + public int getObjectForNode(Node node) { + return getObjectForNode(getNodeIndex(node)); + } + + /** + * Gets the object id for the node. + * @param index the index. + * @return the id. + */ + public int getObjectForNode(int index) { + return objectIds[index]; + } + + /** + * Gets the node index. + * @param node the node. + * @return the index. + */ + public int getNodeIndex(Node node) { + for (int i = 0; i < nodeIds.length; i++) { + if (node.getId() == nodeIds[i]) { + return i; + } + } + return -1; + } + + /** + * Gets the object index. + * @param objectId the object. + * @return the index. + */ + public int getObjectIndex(int objectId) { + for (int i = 0; i < objectIds.length; i++) { + if (objectId == objectIds[i]) { + return i; + } + } + return -1; + } + + /** + * Gets the transform id. + * @param node the node. + * @param wrapper the object. + * @return the id. + */ + public int getTransformId(TrapWrapper wrapper, TrapNode node) { + return node.getTransformId(); + } + + /** + * Gets the final id. + * @param wrapper the wrapper. + * @param node the node. + * @return the id. + */ + public int getFinalId(TrapWrapper wrapper, TrapNode node) { + return node.getFinalId(); + } + + /** + * Gets the failId. + * @param wrapper the wrapper. + * @param node the node. + * @return The failId. + */ + public int getFailId(TrapWrapper wrapper, TrapNode node) { + return failId; + } + + /** + * Gets the limit message. + * @param player the player. + * @return the message. + */ + public String getLimitMessage(Player player) { + return "You don't have a high enough Hunter level to set up more than " + player.getHunterManager().getMaximumTraps() + " trap" + (player.getHunterManager().getMaximumTraps() == 1 ? "." : "s."); + } + + /** + * Gets the name of the trap. + * @return the name. + */ + public String getName() { + if (isObjectTrap()) { + return ObjectDefinition.forId(nodeIds[0]).getName().toLowerCase(); + } + return ItemDefinition.forId(nodeIds[0]).getName().toLowerCase(); + } + + /** + * Gets the time up message. + * @return the message. + */ + public String getTimeUpMessage() { + return "The " + getName() + " " + (isObjectTrap() ? "trap that you constructed has collapsed." : "that you laid has fallen over."); + } + + /** + * Checks if adding this trap will exceed the limit. + * @param player the player. + * @return {@code True} if so. + */ + public boolean exceedsLimit(Player player) { + return false; + } + + /** + * Gets the objectTrap. + * @return The objectTrap. + */ + public boolean isObjectTrap() { + return objectTrap; + } + + /** + * Gets the nodeIds. + * @return The nodeIds. + */ + public int[] getNodeIds() { + return nodeIds; + } + + /** + * Gets the items. + * @return The items. + */ + public Item[] getItems() { + return items; + } + + /** + * Gets the option. + * @return The option. + */ + public String getOption() { + return option; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the setupAnimation. + * @return The setupAnimation. + */ + public Animation getSetupAnimation() { + return setupAnimation; + } + + /** + * Gets the objectIds. + * @return The objectIds. + */ + public int[] getObjectIds() { + return objectIds; + } + + /** + * Gets the dismantleAnimation. + * @return The dismantleAnimation. + */ + public Animation getDismantleAnimation() { + return dismantleAnimation; + } + + /** + * The fail id. + * @return the id. + */ + public int getFailId() { + return failId; + } + + /** + * Gets the baitIds. + * @return The baitIds. + */ + public int[] getBaitIds() { + return baitIds; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapWrapper.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapWrapper.java new file mode 100644 index 000000000..8bbe35882 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/TrapWrapper.java @@ -0,0 +1,418 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.entity.skill.hunter.NetTrapSetting.NetTrap; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; + +import java.util.ArrayList; +import java.util.List; + +/** + * A wrapper class for a trap object. + * @author Vexia + */ +public final class TrapWrapper { + + /** + * The items to be recieved on trap clearing. + */ + private final List items = new ArrayList<>(); + + /** + * The player instance. + */ + private final Player player; + + /** + * The type of trap. + */ + private final Traps type; + + /** + * The net type if net trapping. + */ + private NetTrap netType; + + /** + * The original object id. + */ + private final int originalId; + + /** + * The object of the trap. + */ + private GameObject object; + + /** + * The secondary game object. + */ + private GameObject secondary; + + /** + * The trap hook. + */ + private TrapHook hook; + + /** + * The reward of the trap. + */ + private TrapNode reward; + + /** + * If the trap has been smoked. + */ + private boolean smoked; + + /** + * If the trap has been baited. + */ + private boolean baited; + + /** + * If the trap has failed. + */ + private boolean failed; + + /** + * If the trap is currently in an reward. + */ + private int busyTicks; + + /** + * The tick when the life is up. + */ + private int ticks; + + /** + * Constructs a new {@code TrapWrapper} {@code Object}. + * @param player the player. + * @param type the type. + * @param object the object. + */ + public TrapWrapper(final Player player, Traps type, GameObject object) { + this.player = player; + this.type = type; + this.object = object; + this.originalId = object.getId(); + this.ticks = GameWorld.getTicks() + (100); + this.object.getAttributes().setAttribute("trap-uid", player.getHunterManager().getUid()); + } + + /** + * Cycles this trap wrapper. + * @return {@code True} to deregister the trap. + */ + public boolean cycle() { + if (isTimeUp() && type.getSettings().clear(this, 0)) { + if (!isCaught()) { + player.sendMessage(type.getSettings().getTimeUpMessage()); + } + return true; + } + return false; + } + + /** + * Sets the new object of the wrapper. + * @param id the id. + */ + public void setObject(final int id) { + GameObject newObject = object.transform(id); + ObjectBuilder.remove(object); + this.object = ObjectBuilder.add(newObject); + this.object.getAttributes().setAttribute("trap-uid", player.getHunterManager().getUid()); + } + + /** + * Smokes the trap. + */ + public void smoke() { + if (smoked) { + player.sendMessage("This trap has already been smoked."); + return; + } + if (player.getHunterManager().getStaticLevel() < 39) { + player.sendMessage("You need a Hunter level of at least 39 to be able to smoke traps."); + return; + } + smoked = true; + player.lock(4); + player.visualize(new Animation(5208), new Graphics(931)); + player.sendMessage("You use the smoke from the torch to remove your scent from the trap."); + } + + /** + * Baits the trap. + */ + public void bait(Item bait) { + if (baited) { + player.sendMessage("This trap has already been baited."); + return; + } + if (!type.getSettings().hasBait(bait)) { + player.sendMessage("You can't use that on this trap."); + return; + } + baited = true; + bait = new Item(bait.getId(), 1); + player.getInventory().remove(new Item(bait.getId(), 1)); + } + + /** + * Gets the chance ratio of luring. + * @return the chance rate. + */ + public double getChanceRate() { + double chance = 0.0; + if (baited) { + chance += 1.0; + } + if (smoked) { + chance += 1.0; + } + chance += HunterGear.getChanceRate(player); + return chance; + } + + /** + * Adds items to the recieved list. + * @param items the items. + */ + public void addItem(Item... items) { + for (Item item : items) { + addItem(item); + } + } + + /** + * Adds an item to the recieved list. + * @param item the item. + */ + public void addItem(Item item) { + items.add(item); + } + + /** + * Checks if the time is up. + * @return {@code True} if o. + */ + private boolean isTimeUp() { + return ticks < GameWorld.getTicks(); + } + + /** + * Gets the type. + * @return The type. + */ + public Traps getType() { + return type; + } + + /** + * Gets the object. + * @return The object. + */ + public GameObject getObject() { + return object; + } + + /** + * The original id. + * @return the id. + */ + public int getOriginalId() { + return originalId; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the ticks. + * @return The ticks. + */ + public int getTicks() { + return ticks; + } + + /** + * Sets the ticks. + * @param ticks The ticks to set. + */ + public void setTicks(int ticks) { + this.ticks = ticks; + } + + /** + * Gets the smoked. + * @return The smoked. + */ + public boolean isSmoked() { + return smoked; + } + + /** + * Sets the smoked. + * @param smoked The smoked to set. + */ + public void setSmoked(boolean smoked) { + this.smoked = smoked; + } + + /** + * Gets the hook. + * @return The hook. + */ + public TrapHook getHook() { + return hook; + } + + /** + * Sets the hook. + * @param hook The hook to set. + */ + public void setHook(TrapHook hook) { + this.hook = hook; + } + + /** + * Gets the baited. + * @return The baited. + */ + public boolean isBaited() { + return baited; + } + + /** + * Sets the baited. + * @param baited The baited to set. + */ + public void setBaited(boolean baited) { + this.baited = baited; + } + + /** + * Checks if the trap has been caught. + * @return {@code True} if so. + */ + public boolean isCaught() { + return getReward() != null; + } + + /** + * Gets the reward. + * @return The reward. + */ + public TrapNode getReward() { + return reward; + } + + /** + * Sets the reward. + * @param reward The reward to set. + */ + public void setReward(TrapNode reward) { + this.reward = reward; + this.addItem(reward.getRewards()); + } + + /** + * Checks if the trap is busy. + * @return {@code True} if so. + */ + public boolean isBusy() { + return getBusyTicks() > GameWorld.getTicks(); + } + + /** + * Gets the busyTicks. + * @return The busyTicks. + */ + public int getBusyTicks() { + return busyTicks; + } + + /** + * Sets the busyTicks. + * @param busyTicks The busyTicks to set. + */ + public void setBusyTicks(int busyTicks) { + this.busyTicks = GameWorld.getTicks() + busyTicks; + } + + /** + * Gets the items. + * @return The items. + */ + public List getItems() { + return items; + } + + /** + * Gets the secondary. + * @return The secondary. + */ + public GameObject getSecondary() { + return secondary; + } + + /** + * Sets the secondary. + * @param secondary The secondary to set. + */ + public void setSecondary(GameObject secondary) { + this.secondary = secondary; + this.secondary.getAttributes().setAttribute("trap-uid", player.getName().hashCode()); + } + + /** + * Gets the netType. + * @return The netType. + */ + public NetTrap getNetType() { + return netType; + } + + /** + * Sets the netType. + * @param netType The netType to set. + */ + public void setNetType(NetTrap netType) { + this.netType = netType; + } + + /** + * Sets the object. + * @param object The object to set. + */ + public void setObject(GameObject object) { + this.object = object; + } + + /** + * Gets the failed. + * @return The failed. + */ + public boolean isFailed() { + return failed; + } + + /** + * Sets the failed. + * @param failed The failed to set. + */ + public void setFailed(boolean failed) { + this.failed = failed; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/Traps.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/Traps.java new file mode 100644 index 000000000..d33e17f32 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/Traps.java @@ -0,0 +1,251 @@ +package core.game.node.entity.skill.hunter; + +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a trap type. + * @author Vexia + */ +public enum Traps { + BIRD_SNARE(new TrapSetting(10006, new int[] { 19175 }, new int[] {}, "lay", 19174, Animation.create(5208), Animation.create(5207), 1), + new TrapNode(new int[] { 5073 }, 1, 34, new int[] { 19179, 19180 }, new Item[] { new Item(10088, 8), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 5075 }, 5, 48, new int[] { 19183, 19184 }, new Item[] { new Item(10090, 8), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 5076 }, 9, 61, new int[] { 19185, 19186 }, new Item[] { new Item(10091, 8), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 5074 }, 11, 64.7, new int[] { 19181, 19182 }, new Item[] { new Item(10089, 8), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 5072 }, 19, 95.2, new int[] { 19177, 19178 }, new Item[] { new Item(10087, 8), new Item(9978), new Item(526) }), + new TrapNode(new int[] { 7031 }, 39, 167, new int[] { 28931, 28930 }, new Item[] { new Item(11525, 8), new Item(9978), new Item(526) }) { + @Override + public boolean canCatch(TrapWrapper wrapper, final NPC npc) { + return false; + } + }), + BOX_TRAP(new TrapSetting(10008, new int[] { 19187 }, new int[] { 1963, 12579, 1869, 9996, 5972, 12535 }, "lay", 19192, Animation.create(5208), new Animation(9726), 27), + new BoxTrapNode(new int[] { 5081 }, 27, 100, new Item[] { new Item(10092) }, 1), + new BoxTrapNode(new int[] { 6918, 7289, 7290, 7291, 7292 }, 27, 100, new Item[] { new Item(12184) }, 10), + new BoxTrapNode(new int[] { 1487 }, 27, 100, new Item[] { new Item(4033, 1) }, 95), + new BoxTrapNode(new int[] { 7021, 7022, 7023 }, 48, 150, new Item[] { new Item(12551, 1) }, 1), + new BoxTrapNode(new int[] { 5079 }, 53, 198, new Item[] { new Item(10033, 1) }, 1), + new BoxTrapNode(new int[] { 5428, 5430, 5449, 5450, 5451 }, 56, 150, new Item[] { new Item(12188) }, 1), + new BoxTrapNode(new int[] { 5080 }, 63, 265, new Item[] { new Item(10034, 1) }, 1), + new BoxTrapNode(new int[] { 7012, 7014 }, 66, 400, new Item[] { new Item(12535) }, 1), + new BoxTrapNode(new int[] { 8654 }, 73, 315, new Item[] { new Item(14861) }, 1), + new BoxTrapNode(new int[] { 7010, 7011 }, 77, 726, new Item[] { new Item(12539, 1) }, 1)), + RABBIT_SNARE(new TrapSetting(10031, new int[] { 19333 }, new int[] {}, "lay", -1, Animation.create(5208), Animation.create(9726), 27)), + IMP_BOX(new MagicBoxSetting(), + new TrapNode(new int[] { 708, 709, 1531 }, 71, 450, new int[] { -1, 19226 }, new Item[] { new Item(10027) })), + DEAD_FALL(new DeadfallSetting(), + new TrapNode(new int[] { 5089 }, 23, 128, new int[] { 19213, 19214, 19218 }, new Item[] { new Item(10113), new Item(526) }), + new TrapNode(new int[] { 5088 }, 33, 168, new int[] { 19211, 19212, 19217 }, new Item[] { new Item(10129), new Item(526) }), + new TrapNode(new int[] { 5086 }, 37, 204, new int[] { 19208, 19208, 19217 }, new Item[] { new Item(10105), new Item(526) }), + new TrapNode(new int[] { 7039 }, 44, 200, new int[] { 28939, 28940, 28941 }, new Item[] { new Item(12567), new Item(526) }), + new TrapNode(new int[] { 5087 }, 51, 200, new int[] { 19209, 19210, 19216 }, new Item[] { new Item(10109), new Item(526) })), + NET_TRAP(new NetTrapSetting(), new TrapNode(new int[] { 5117 }, 29, 152, new int[] {}, new Item[] { new Item(10149) }), + new TrapNode(new int[] { 5114 }, 47, 224, new int[] {}, new Item[] { new Item(10146) }), + new TrapNode(new int[] { 6921 }, 29, 152, new int[] {}, new Item[] { new Item(12130) }), + new TrapNode(new int[] { 5115 }, 59, 272, new int[] {}, new Item[] { new Item(10147) }), + new TrapNode(new int[] { 5116 }, 67, 304, new int[] {}, new Item[] { new Item(10148) })); + + /** + * The location hooks for this node. + */ + private final List hooks = new ArrayList<>(); + + /** + * The trap settings. + */ + private final TrapSetting settings; + + /** + * The nodes related to the trap. + */ + private final TrapNode[] nodes; + + /** + * Constructs a new {@code TrapType} {@code Object}. + * @param settings the settings. + * @param nodes the nodes. + */ + Traps(TrapSetting settings, TrapNode... nodes) { + this.settings = settings; + this.nodes = nodes; + } + + /** + * Creates a trap instance. + * @param player the player. + */ + public void create(Player player, Node node) { + player.getPulseManager().run(new TrapCreatePulse(player, node, this)); + } + + /** + * Dismantles a trap. + * @param player the player. + * @param object the object. + */ + public void dismantle(Player player, GameObject object) { + if (!player.getHunterManager().isOwner(object)) { + player.sendMessage("This isn't your trap!"); + return; + } + if (player.getHunterManager().getWrapper(object) == null) { + SystemLogger.logErr("NO WRAPPER (HUNTER DISMANTLE)"); + return; + } + player.faceLocation(object.getLocation()); + player.getPulseManager().run(new TrapDismantlePulse(player, object, player.getHunterManager().getWrapper(object))); + } + + /** + * Investigates the trap. + * @param player the player. + * @param object the object. + */ + public void investigate(Player player, GameObject object) { + getSettings().investigate(player, object); + } + + /** + * Called when an npc is hooked. + * @param wrapper the wrapper. + * @param npc the npc. + */ + public void catchNpc(TrapWrapper wrapper, NPC npc) { + final TrapNode trapNode = forNpc(npc); + if (trapNode == null || !trapNode.canCatch(wrapper, npc) || !settings.canCatch(wrapper, npc)) { + return; + } + settings.catchNpc(wrapper, trapNode, npc); + } + + /** + * Adds a hook. + * @param wrapper the wrapper. + */ + public TrapHook addHook(TrapWrapper wrapper) { + TrapHook hook = settings.createHook(wrapper); + hooks.add(hook); + return hook; + } + + /** + * Gets a node by the npc. + * @param npc the npc. + * @return the node. + */ + public TrapNode forNpc(NPC npc) { + for (TrapNode node : nodes) { + for (int npcId : node.getNpcIds()) { + if (npcId == npc.getId()) { + return node; + } + } + } + return null; + } + + /** + * Gets a trap by the node id. + * @param node the node. + * @return the {@code Traps}. + */ + public static Traps forNode(Node node) { + for (Traps trap : Traps.values()) { + for (int nodeId : trap.getSettings().getNodeIds()) { + if (node.getId() == nodeId) { + return trap; + } + } + for (int objectId : trap.getSettings().getObjectIds()) { + if (objectId == node.getId()) { + return trap; + } + } + for (TrapNode n : trap.getNodes()) { + for (int id : n.getObjectIds()) { + if (id == node.getId()) { + return trap; + } + } + } + if (trap.getSettings().getFailId() == node.getId()) { + return trap; + } + if (trap == NET_TRAP) { + for (NetTrapSetting.NetTrap net : NetTrapSetting.NetTrap.values()) { + if (net.getOriginal() == node.getId() || net.getFailed() == node.getId() || net.getNet() == node.getId() || net.getBent() == node.getId() || net.getCaught() == node.getId()) { + return trap; + } + } + } + } + return null; + } + + /** + * Gets a trap node by the id. + * @param id the id. + * @return the node. + */ + public static Object[] getNode(int id) { + for (Traps trap : values()) { + for (TrapNode t : trap.getNodes()) { + for (int i : t.getNpcIds()) { + if (i == id) { + return new Object[] { trap, t }; + } + } + } + } + return null; + } + + /** + * Gets the wrapper by the hook. + * @param location the location. + * @return the wrapper. + */ + public TrapWrapper getByHook(Location location) { + for (TrapHook hook : hooks) { + if (hook.isHooked(location)) { + return hook.getWrapper(); + } + } + return null; + } + + /** + * Gets the settings. + * @return The settings. + */ + public TrapSetting getSettings() { + return settings; + } + + /** + * Gets the nodes. + * @return The nodes. + */ + public TrapNode[] getNodes() { + return nodes; + } + + /** + * Gets the hooks. + * @return The hooks. + */ + public List getHooks() { + return hooks; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/BNetNode.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/BNetNode.java new file mode 100644 index 000000000..275588046 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/BNetNode.java @@ -0,0 +1,222 @@ +package core.game.node.entity.skill.hunter.bnet; + +import core.cache.def.impl.NPCDefinition; +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Graphics; + +/** + * A butterfly net node. + * @author Vexia + */ +public class BNetNode { + + /** + * The butterfly jar item. + */ + private static final Item BUTTERFLY_JAR = new Item(10012); + + /** + * The impling jar item. + */ + protected static final Item IMPLING_JAR = new Item(11260); + + /** + * The npcs related to this node. + */ + private final int[] npcs; + + /** + * The levels needed. + */ + private final int[] levels; + + /** + * The experience gained. + */ + private final double[] experience; + + /** + * The graphics related to the node. + */ + private final Graphics[] graphics; + + /** + * The reward item. + */ + private final Item reward; + + /** + * Constructs a new {@code ButterflyNetNode} {@code Object}. + * @param npcs the npcs. + * @param levels the levels. + * @param experience the experience. + * @param graphics the graphics. + */ + public BNetNode(int[] npcs, int[] levels, double[] experience, Graphics[] graphics, Item reward) { + this.npcs = npcs; + this.levels = levels; + this.experience = experience; + this.graphics = graphics; + this.reward = reward; + } + + /** + * Rewards the player. + * @param player the player. + * @param npc the npc. + */ + public void reward(Player player, NPC npc) { + if (!isBareHand(player)) { + if (player.getInventory().remove(getJar())) { + final Item item = getReward(); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.HUNTER, getExperience(player), true); + } + } else { + player.graphics(graphics[0]); + player.getSkills().addExperience(Skills.HUNTER, getExperiences()[1], true); + player.getSkills().addExperience(Skills.AGILITY, getExperiences()[2], true); + } + } + + /** + * Handles a message event. + * @param type the type. + * @param success the success. + */ + public void message(Player player, int type, boolean success) { + if (!success) { + return; + } + switch (type) { + case 1: + player.getPacketDispatch().sendMessage("You manage to catch the butterfly."); + if (isBareHand(player)) { + player.getPacketDispatch().sendMessage("You release the " + NPCDefinition.forId(npcs[0]).getName().toLowerCase() + " butterfly."); + } + break; + } + } + + /** + * Checks if the player has a jar. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasJar(Player player) { + return player.getInventory().containsItem(getJar()); + } + + /** + * Checks if the player has a weapon. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasWeapon(Player player) { + Item item = player.getEquipment().get(EquipmentContainer.SLOT_WEAPON); + return item != null && (item.getId() != 10010 && item.getId() != 11259); + } + + /** + * Checks if the player has a net. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasNet(Player player) { + return player.getEquipment().contains(10010, 1) || player.getEquipment().contains(11259, 1); + } + + /** + * Checks if the player is bare handed. + * @param player the player. + * @return {@code} True if so. + */ + public boolean isBareHand(Player player) { + return !hasNet(player) && player.getSkills().getStaticLevel(Skills.HUNTER) >= getBareHandLevel() && player.getSkills().getStaticLevel(Skills.AGILITY) >= getAgilityLevel(); + } + + /** + * Gets the experience in hunter. + * @return the exp. + */ + public double getExperience(Player player) { + return experience[0]; + } + + /** + * Gets the hunter level. + * @return the level. + */ + public int getLevel() { + return levels[0]; + } + + /** + * Gets the agility level. + * @return the level. + */ + public int getAgilityLevel() { + return levels[2]; + } + + /** + * Gets the bare hand level. + * @return the level. + */ + public int getBareHandLevel() { + return levels[1]; + } + + /** + * Gets the npcs. + * @return The npcs. + */ + public int[] getNpcs() { + return npcs; + } + + /** + * Gets the levels. + * @return The levels. + */ + public int[] getLevels() { + return levels; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double[] getExperiences() { + return experience; + } + + /** + * Gets the graphics. + * @return The graphics. + */ + public Graphics[] getGraphics() { + return graphics; + } + + /** + * Gets the reward. + * @return The reward. + */ + public Item getReward() { + return reward; + } + + /** + * Gets the jar. + * @return the jar. + */ + public Item getJar() { + return BUTTERFLY_JAR; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/BNetPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/BNetPulse.java new file mode 100644 index 000000000..510fda729 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/BNetPulse.java @@ -0,0 +1,155 @@ +package core.game.node.entity.skill.hunter.bnet; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +import java.util.Random; + +/** + * Handles the butterfly net catch pulse. + * @author Vexia + */ +public final class BNetPulse extends SkillPulse { + + /** + * The swinging animation. + */ + private static final Animation ANIMATION = new Animation(6999); + + /** + * The net node. + */ + private final BNetNode type; + + /** + * If we are successfull. + */ + private boolean success; + + /** + * The ticks passed. + */ + private int ticks; + + /** + * Update lumbridge impling task, makes sure we're in puro puro and checks diary entry completion + * @returns false if not in puro puro, true and updates diary if in puro puro + */ + public boolean updateLumbridgeImplingTask(Player player) { + if(!player.getZoneMonitor().isInZone("puro puro")){ + return false; + } else { +/* if(!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.LUMBRIDGE,1,8)){ + player.getAchievementDiaryManager().updateTask(player,DiaryType.LUMBRIDGE,1,8,true); + }*/ + return true; + } + } + + /** + * Constructs a new {@code BNetPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param type the type. + */ + public BNetPulse(Player player, NPC node, BNetNode type) { + super(player, node); + this.type = type; + this.resetAnimation = false; + } + + @Override + public boolean checkRequirements() { + if (player.getHunterManager().getStaticLevel() < type.getLevel()) { + player.sendMessage("You need a Hunter level of at least " + type.getLevel() + " in order to do that."); + return false; + } + if (!type.isBareHand(player)) { + if (type.hasWeapon(player)) { + player.getPacketDispatch().sendMessage("Your hands need to be free."); + return false; + } else if (!type.hasNet(player)) { + player.sendMessage("You need to be wielding a butterfly net to catch " + (type instanceof ImplingNode ? "implings" : "butterflies") + "."); + return false; + } else if (!type.hasJar(player)) { + player.getPacketDispatch().sendMessage("You need to have a" + (StringUtils.isPlusN(type.getJar().getName()) ? "n" : "") + " " + type.getJar().getName().toLowerCase() + "."); + return false; + } + } + if (node.isInvisible() || DeathTask.isDead(node)) { + return false; + } + return true; + } + + @Override + public void animate() { + if (ticks < 1) { + player.animate(ANIMATION); + } + } + + @Override + public boolean reward() { + if (node.isInvisible() || DeathTask.isDead(node)) { + return true; + } + if (++ticks % 2 != 0) { + return false; + } + if (node.getAttribute("dead", 0) > GameWorld.getTicks()) { + player.sendMessage("Ooops! It's gone."); + return true; + } + if ((success = isSuccessful())) { + node.finalizeDeath(player); + type.reward(player, node); + node.setAttribute("dead", GameWorld.getTicks() + 10); + if (type == BNetTypes.ECLECTIC_IMPLING.getNode() || type == BNetTypes.ESSENCE_IMPLING.getNode() ) { + updateLumbridgeImplingTask(player); + } + } else { + node.moveStep(); + } + return true; + } + + @Override + public void message(int type) { + if (type == 0) { + node.setAttribute("looting", GameWorld.getTicks() + (ANIMATION.getDuration() + 1)); + player.lock(ANIMATION.getDuration()); + } + this.type.message(player, type, success); + } + + /** + * Checks if the player has succesfully caught the impling. + * @return {@code True} if succesful, {@code false} if not. + */ + private boolean isSuccessful() { + int huntingLevel = player.getSkills().getLevel(Skills.HUNTER); + int level = type.getLevel(); + if (type.hasNet(player)) { + Item net = player.getEquipment().get(EquipmentContainer.SLOT_WEAPON); + if (net != null && net.getId() == 11259) { + huntingLevel += 5; + } + } else { + huntingLevel *= 0.5; + } + int currentLevel = RandomFunction.random(huntingLevel) + 1; + double ratio = currentLevel / (new Random().nextInt(level + 5) + 1); + return Math.round(ratio * huntingLevel) >= level; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/BNetTypes.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/BNetTypes.java new file mode 100644 index 000000000..410c4bfc3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/BNetTypes.java @@ -0,0 +1,136 @@ +package core.game.node.entity.skill.hunter.bnet; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.npc.drop.DropFrequency; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Graphics; + +import java.util.ArrayList; +import java.util.List; + +/** + * A butterfly net type catch. + * @author Vexia + */ +public enum BNetTypes { + // Butterflies + RUBY_HARVEST(new BNetNode(new int[] { 5085 }, new int[] { 15, 80, 75 }, new double[] { 24, 300, 50 }, new Graphics[] { new Graphics(913), new Graphics(917) }, new ChanceItem(10020))), + SAPPHIRE_GLACIALIS(new BNetNode(new int[] { 5084, 7499 }, new int[] { 25, 85, 80 }, new double[] { 34, 400, 70 }, new Graphics[] { new Graphics(912), new Graphics(916) }, new ChanceItem(10018))), + SNOWRY_KNIGHT(new BNetNode(new int[] { 5083, 7498 }, new int[] { 35, 90, 85 }, new double[] { 44, 500, 100 }, new Graphics[] { new Graphics(911), new Graphics(915) }, new ChanceItem(10016))), + BLACK_WARLOCK(new BNetNode(new int[] { 5082 }, new int[] { 45, 95, 90 }, new double[] { 54, 650, 125 }, new Graphics[] { new Graphics(910), new Graphics(914) }, new ChanceItem(10014))), + // Implings ( Clearly these morons typed way too fast - wasn't sure if these names were anywhere else in the code) + BABY_IMPLING(new ImplingNode(new int[] { 1028, 6055 }, 17, 20, 18, new Item(11238), new ChanceItem(1755, 1, 1, DropFrequency.COMMON), new ChanceItem(1734, 1, 1, DropFrequency.COMMON), new ChanceItem(1733, 1, 1, DropFrequency.COMMON), new ChanceItem(946, 1, 1, DropFrequency.COMMON), new ChanceItem(1985, 1, 1, DropFrequency.COMMON), new ChanceItem(2347, 1, 1, DropFrequency.COMMON), new ChanceItem(1759, 1, 1, DropFrequency.COMMON), new ChanceItem(1927, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(319, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(2007, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(2007, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(1779, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(7170, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(401, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(1438, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(2355, 1, 1, DropFrequency.RARE), new ChanceItem(1607, 1, 1, DropFrequency.RARE), new ChanceItem(1743, 1, 1, DropFrequency.RARE), new ChanceItem(379, 1, 1, DropFrequency.RARE), new ChanceItem(1761, 1, 1, DropFrequency.RARE))), + YOUNG_IMPLING(new ImplingNode(new int[] { 1029, 6056 }, 22, 22, 25, new Item(11240), new ChanceItem(1539, 5, 5, DropFrequency.COMMON), new ChanceItem(1901, 1, 1, DropFrequency.COMMON), new ChanceItem(7936, 1, 1, DropFrequency.COMMON), new ChanceItem(361, 1, 1, DropFrequency.COMMON), new ChanceItem(1523, 1, 1, DropFrequency.COMMON), new ChanceItem(453, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(1777, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(2293, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(1353, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(2359, 1, 1, DropFrequency.RARE))), + GOURMET_IMPLING(new ImplingNode(new int[] { 1030, 6057 }, 28, 24, 22, new Item(11242), new ChanceItem(365, 1, 1, DropFrequency.COMMON), new ChanceItem(361, 1, 1, DropFrequency.COMMON), new ChanceItem(2011, 1, 1, DropFrequency.COMMON), new ChanceItem(1897, 1, 1, DropFrequency.COMMON), new ChanceItem(2327, 1, 1, DropFrequency.COMMON), new ChanceItem(5004, 1, 1, DropFrequency.COMMON), new ChanceItem(2007, 1, 1, DropFrequency.COMMON), new ChanceItem(5970, 1, 1, DropFrequency.COMMON), new ChanceItem(365, 4, 4, DropFrequency.UNCOMMON), new ChanceItem(3145, 2, 2, DropFrequency.RARE), new ChanceItem(7178, 1, 5, DropFrequency.UNCOMMON), new ChanceItem(5755, 1, 1, DropFrequency.RARE), new ChanceItem(386, 3, 3, DropFrequency.UNCOMMON), new ChanceItem(5406, 1, 1, DropFrequency.RARE), new ChanceItem(10136, 1, 1, DropFrequency.RARE), new ChanceItem(1883, 1, 1, DropFrequency.UNCOMMON))), + EARTH_IMPLING(new ImplingNode(new int[] { 1031, 6058 }, 36, 27, 25, new Item(11244), new ChanceItem(6033, 6, 6, DropFrequency.COMMON), new ChanceItem(1440, 1, 1, DropFrequency.COMMON), new ChanceItem(5535, 1, 1, DropFrequency.COMMON), new ChanceItem(557, 32, 32, DropFrequency.COMMON), new ChanceItem(1442, 1, 1, DropFrequency.COMMON), new ChanceItem(1784, 4, 4, DropFrequency.UNCOMMON), new ChanceItem(447, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(447, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(1606, 2, 2, DropFrequency.RARE))), + ESSENCE_IMPLING(new ImplingNode(new int[] { 1032, 6059 }, 42, 29, 27, new Item(11246), new ChanceItem(7937, 20, 20, DropFrequency.COMMON), new ChanceItem(555, 30, 30, DropFrequency.COMMON), new ChanceItem(556, 30, 30, DropFrequency.COMMON), new ChanceItem(558, 25, 25, DropFrequency.COMMON), new ChanceItem(559, 28, 28, DropFrequency.COMMON), new ChanceItem(562, 4, 4, DropFrequency.COMMON), new ChanceItem(1448, 1, 1, DropFrequency.COMMON), new ChanceItem(564, 4, 4, DropFrequency.UNCOMMON), new ChanceItem(565, 7, 7, DropFrequency.RARE), new ChanceItem(563, 13, 13, DropFrequency.RARE), new ChanceItem(566, 11, 11, DropFrequency.RARE))), + ECLECTIC_IMPLING(new ImplingNode(new int[] { 1033, 6060 }, 50, 32, 30, new Item(11248), new ChanceItem(1273, 1, 1, DropFrequency.COMMON), new ChanceItem(1199, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(2493, 1, 1, DropFrequency.RARE), new ChanceItem(10083, 1, 1, DropFrequency.RARE), new ChanceItem(1213, 1, 1, DropFrequency.RARE), new ChanceItem(1391, 1, 1, DropFrequency.VERY_RARE), new ChanceItem(5970, 1, 1, DropFrequency.COMMON), new ChanceItem(231, 1, 1, DropFrequency.COMMON), new ChanceItem(556, 30, 57, DropFrequency.COMMON), new ChanceItem(8779, 4, 4, DropFrequency.COMMON), new ChanceItem(4527, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(444, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(2358, 5, 5, DropFrequency.UNCOMMON), new ChanceItem(7937, 20, 35, DropFrequency.UNCOMMON), new ChanceItem(237, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(450, 10, 10, DropFrequency.RARE), new ChanceItem(5760, 2, 2, DropFrequency.RARE), new ChanceItem(7208, 1, 1, DropFrequency.RARE), new ChanceItem(5321, 3, 3, DropFrequency.RARE), new ChanceItem(1601, 1, 1, DropFrequency.VERY_RARE))), + NATURE_IMPLING(new ImplingNode(new int[] { 1034, 6061 }, 58, 36, 34, new Item(11250), new ChanceItem(5303, 1, 1, DropFrequency.VERY_RARE), new ChanceItem(270, 2, 2, DropFrequency.VERY_RARE), new ChanceItem(5295, 1, 1, DropFrequency.RARE), new ChanceItem(5304, 1, 1, DropFrequency.RARE), new ChanceItem(5298, 5, 5, DropFrequency.UNCOMMON), new ChanceItem(5299, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(5297, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(5974, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(3000, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(5285, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(5286, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(5100, 1, 1, DropFrequency.COMMON), new ChanceItem(5104, 1, 1, DropFrequency.COMMON), new ChanceItem(5281, 1, 1, DropFrequency.COMMON), new ChanceItem(5294, 1, 1, DropFrequency.COMMON), new ChanceItem(6016, 1, 1, DropFrequency.COMMON), new ChanceItem(1513, 1, 1, DropFrequency.COMMON), new ChanceItem(254, 4, 4, DropFrequency.COMMON), new ChanceItem(5313, 1, 1, DropFrequency.UNCOMMON))), + MAGPIE_IMPLING(new ImplingNode(new int[] { 1035, 6062 }, 65, 46, 44, new Item(11252), 500, new ChanceItem(1682, 3, 3, DropFrequency.COMMON), new ChanceItem(1732, 3, 3, DropFrequency.COMMON), new ChanceItem(2569, 3, 3, DropFrequency.COMMON), new ChanceItem(3391, 1, 1, DropFrequency.COMMON), new ChanceItem(1347, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(2571, 4, 4, DropFrequency.UNCOMMON), new ChanceItem(4097, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(4095, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(1215, 1, 1, DropFrequency.RARE), new ChanceItem(1185, 1, 1, DropFrequency.RARE), new ChanceItem(5541, 1, 1, DropFrequency.COMMON), new ChanceItem(1748, 6, 6, DropFrequency.COMMON), new ChanceItem(2364, 2, 2, DropFrequency.UNCOMMON), new ChanceItem(1602, 4, 4, DropFrequency.RARE), new ChanceItem(5287, 1, 1, DropFrequency.RARE), new ChanceItem(985, 1, 1, DropFrequency.RARE), new ChanceItem(987, 1, 1, DropFrequency.RARE), new ChanceItem(993, 1, 1, DropFrequency.VERY_RARE), new ChanceItem(5300, 1, 1, DropFrequency.VERY_RARE))), + NINJA_IMPLING(new ImplingNode(new int[] { 6053, 6063 }, 74, 52, 50, new Item(11254), 2000, new ChanceItem(4097, 1, 1, DropFrequency.COMMON), new ChanceItem(1113, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(3385, 1, 1, DropFrequency.COMMON), new ChanceItem(1215, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(811, 70, 70, DropFrequency.UNCOMMON), new ChanceItem(1333, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(1347, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(9342, 2, 2, DropFrequency.UNCOMMON), new ChanceItem(9194, 4, 4, DropFrequency.RARE), new ChanceItem(140, 4, 4, DropFrequency.COMMON), new ChanceItem(6155, 3, 3, DropFrequency.UNCOMMON), new ChanceItem(1748, 10, 16, DropFrequency.COMMON))), + // Pirate should be here + DRAGON_IMPLING(new ImplingNode(new int[] { 6054, 6064 }, 83, 300, 65, new Item(11256), 3000, new ChanceItem(1705, 2, 3, DropFrequency.RARE), new ChanceItem(4093, 1, 1, DropFrequency.VERY_RARE), new ChanceItem(1684, 2, 3, DropFrequency.VERY_RARE), new ChanceItem(11212, 100, 500, DropFrequency.COMMON), new ChanceItem(9341, 3, 40, DropFrequency.COMMON), new ChanceItem(1305, 1, 1, DropFrequency.COMMON), new ChanceItem(5699, 3, 3, DropFrequency.UNCOMMON), new ChanceItem(11230, 105, 350, DropFrequency.UNCOMMON), new ChanceItem(11232, 105, 350, DropFrequency.COMMON), new ChanceItem(11237, 100, 500, DropFrequency.COMMON), new ChanceItem(9193, 10, 49, DropFrequency.COMMON), new ChanceItem(535, 111, 297, DropFrequency.COMMON), new ChanceItem(5316, 1, 1, DropFrequency.UNCOMMON), new ChanceItem(537, 52, 99, DropFrequency.UNCOMMON), new ChanceItem(1616, 3, 6, DropFrequency.UNCOMMON), new ChanceItem(5300, 6, 6, DropFrequency.RARE), new ChanceItem(7219, 5, 15, DropFrequency.RARE))); + + + /** + * The implings. + */ + private static final List IMPLINGS = new ArrayList<>(); + + /** + * The node. + */ + private final BNetNode node; + + /** + * Constructs a new {@code BNetTypes} {@code Object}. + * @param node the node. + */ + private BNetTypes(BNetNode node) { + this.node = node; + } + + /** + * Catches a net npc. + * @param player the player. + * @param npc the npc. + */ + public void handle(Player player, NPC npc) { + player.getPulseManager().run(new BNetPulse(player, npc, node)); + } + + /** + * Gets an impling. + * @param player the player. + * @return the imp. + */ + public static ImplingNode getImpling(Player player) { + for (ImplingNode imp : IMPLINGS) { + if (player.getInventory().containsItem(imp.getReward())) { + return imp; + } + } + return null; + } + + /** + * Gets a net type for the npc. + * @param npc the npc. + * @return {@code BNetTypes} type. + */ + public static BNetTypes forNpc(NPC npc) { + for (BNetTypes type : BNetTypes.values()) { + for (int id : type.getNode().getNpcs()) { + if (id == npc.getId()) { + return type; + } + } + } + return null; + } + + /** + * Gets the BNetNode by the item. + * @param item the item. + * @return the instance. + */ + public static BNetNode forItem(Item item) { + for (BNetTypes type : values()) { + if (type.getNode().getReward().getId() == item.getId()) { + return type.getNode(); + } + } + return null; + } + + /** + * Gets the node. + * @return The node. + */ + public BNetNode getNode() { + return node; + } + + /** + * Gets the implings. + * @return The implings. + */ + public static List getImplings() { + return IMPLINGS; + } + + /** + * static-modifier. + */ + static { + for (BNetTypes type : values()) { + BNetNode node = type.getNode(); + if (node instanceof ImplingNode) { + IMPLINGS.add((ImplingNode) node); + } + } + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/ImplingNode.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/ImplingNode.java new file mode 100644 index 000000000..0a0799a5e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/bnet/ImplingNode.java @@ -0,0 +1,133 @@ +package core.game.node.entity.skill.hunter.bnet; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.tools.RandomFunction; + +import java.util.Random; + +/** + * Handles the impling node. + * @author Vexia + */ +public final class ImplingNode extends BNetNode { + + /** + * The loot from an imp. + */ + private final ChanceItem[] loot; + + /** + * The respawn time. + */ + private final int respawnTime; + + /** + * Constructs a new {@code ImplingNode} {@code Object}. + * @param npcs the npcs. + * @param level the level. + * @param exp the exp. + * @param puroExp the puro exp. + * @param reward the reward. + * @param loot the loot. + */ + public ImplingNode(int[] npcs, int level, double exp, double puroExp, Item reward, final int respawnTime, final ChanceItem... loot) { + super(npcs, new int[] { level }, new double[] { exp, puroExp }, null, reward); + this.loot = loot; + this.respawnTime = respawnTime; + } + + /** + * Constructs a new {@code ImplingNode} {@code Object}. + * @param npcs the npcs. + * @param level the level. + * @param exp the exp. + * @param puroExp the puro exp. + * @param reward the reward. + * @param loot the loot. + */ + public ImplingNode(int[] npcs, int level, double exp, double puroExp, Item reward, final ChanceItem... loot) { + this(npcs, level, exp, puroExp, reward, 16, loot); + } + + /** + * Loots an imp jar. + * @param player the player. + * @param item the item. + */ + public void loot(final Player player, final Item item) { + player.lock(1); + if (player.getInventory().freeSlots() < 1) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return; + } + final Item reward = RandomFunction.getChanceItem(getLoot()).getRandomItem(); + if (player.getInventory().remove(item)) { + if (isBroken(player)) { + player.sendMessage("You break the jar as you try and open it. You throw the shattered remains away."); + } else { + player.getInventory().add(IMPLING_JAR); + } + player.getInventory().add(reward, player); + } + } + + /** + * Checks if the item will break. + * @param player the player. + * @return {@code True} if so. + */ + private boolean isBroken(Player player) { + int strengthLevel = player.getSkills().getLevel(Skills.STRENGTH); + strengthLevel /= 0.5; + int level = getLevel(); + int currentLevel = RandomFunction.random(strengthLevel) + 1; + double ratio = currentLevel / (new Random().nextInt(level + 5) + 1); + return Math.round(ratio * strengthLevel) < level; + } + + @Override + public void message(Player player, int type, boolean success) { + if (!success) { + return; + } + switch (type) { + case 1: + player.sendMessage("You manage to catch the impling and squeeze it into a jar."); + break; + } + } + + @Override + public double getExperience(Player player) { + return player.getZoneMonitor().isInZone("puro puro") ? getExperiences()[1] : super.getExperience(player); + } + + @Override + public boolean isBareHand(Player player) { + return false; + } + + @Override + public Item getJar() { + return IMPLING_JAR; + } + + /** + * Gets the loot. + * @return The loot. + */ + public ChanceItem[] getLoot() { + return loot; + } + + /** + * Gets the respawnTime. + * @return The respawnTime. + */ + public int getRespawnTime() { + return respawnTime; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/falconry/FalconCatch.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/falconry/FalconCatch.java new file mode 100644 index 000000000..9c7d2f231 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/falconry/FalconCatch.java @@ -0,0 +1,107 @@ +package core.game.node.entity.skill.hunter.falconry; + +import core.game.node.entity.npc.NPC; +import core.game.node.item.Item; + +/** + * Represents a falcon catch. + * @author Vexia + */ +public enum FalconCatch { + SPOTTED_KEBBIT(5098, 43, 104, new Item(10125)), DARK_KEBBIT(5099, 57, 132, new Item(10115)), DASHING_KEBBIT(5100, 69, 156, new Item(10127)); + + /** + * Represents the npc. + */ + private final int npc; + + /** + * Represents the level. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Represents the item reward. + */ + private final Item item; + + /** + * Constructs a new {@code FalconCatch} {@code Object}. + * @param npc the npc. + * @param level the level. + * @param experience the experience. + * @param item the item. + */ + FalconCatch(int npc, int level, double experience, Item item) { + this.npc = npc; + this.level = level; + this.experience = experience; + this.item = item; + } + + /** + * Gets the falcon catch. + * @param item the item. + * @return the falcon catch. + */ + public static FalconCatch forItem(final Item item) { + for (FalconCatch falconCatch : FalconCatch.values()) { + if (item.getId() == falconCatch.getItem().getId()) { + return falconCatch; + } + } + return null; + } + + /** + * Gets the falcon catch. + * @param npc the npc. + * @return the falcon catch. + */ + public static FalconCatch forNPC(final NPC npc) { + for (FalconCatch falconCatch : FalconCatch.values()) { + if (npc.getId() == falconCatch.getNpc()) { + return falconCatch; + } + } + return null; + } + + /** + * Gets the npc. + * @return The npc. + */ + public int getNpc() { + return npc; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the item. + * @return The item. + */ + public Item getItem() { + return item; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/falconry/FalconryCatchPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/falconry/FalconryCatchPulse.java new file mode 100644 index 000000000..5953efe2f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/falconry/FalconryCatchPulse.java @@ -0,0 +1,180 @@ +package core.game.node.entity.skill.hunter.falconry; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.repository.Repository; +import core.tools.RandomFunction; + +/** + * Represents the skill pulse used to catch a kebbit. + * @author Vexia + */ +public final class FalconryCatchPulse extends SkillPulse { + + /** + * Represents the falcon catch. + */ + private final FalconCatch falconCatch; + + /** + * Represents the falcon item. + */ + private static final Item FALCON = new Item(10024); + + /** + * Represents the falcon glove. + */ + private static final Item GLOVE = new Item(10023); + + /** + * Represents the original location. + */ + private final Location originalLocation; + + /** + * If the falcon has been checked. + */ + private boolean checked; + + /** + * The ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code FalconryCatchPulse.java} {@code Object}. + * @param player + * @param node + */ + public FalconryCatchPulse(final Player player, final NPC node, final FalconCatch falconCatch) { + super(player, node); + this.falconCatch = falconCatch; + this.originalLocation = node.getLocation(); + } + + @Override + public void start() { + player.faceTemporary(node, 1); + node.getWalkingQueue().reset(); + player.getWalkingQueue().reset(); + super.start(); + } + + @Override + public boolean checkRequirements() { + if (!checked) { + checked = true; + if (node.getLocation().getDistance(player.getLocation()) > 15) { + player.getPacketDispatch().sendMessage("You can't catch a kebbit that far away."); + return false; + } + if (player.getSkills().getLevel(Skills.HUNTER) < falconCatch.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Hunter level of at least " + falconCatch.getLevel() + " to catch this kebbit."); + return false; + } + if (player.getEquipment().get(EquipmentContainer.SLOT_HANDS) != null || player.getEquipment().get(EquipmentContainer.SLOT_SHIELD) != null) { + player.getDialogueInterpreter().sendDialogue("Sorry, free your hands, weapon, and shield slot first."); + return false; + } + if (player.getEquipment().get(EquipmentContainer.SLOT_WEAPON) == null || !player.getEquipment().containsItem(FALCON)) { + player.getPacketDispatch().sendMessage("You need a falcon to catch a kebbit."); + return false; + } + if (player.getEquipment().remove(FALCON)) { + player.getEquipment().add(GLOVE, true, false); + sendProjectile(); + } + player.lock(getDistance()); + } + return true; + } + + @Override + public void stop() { + super.stop(); + player.unlock(); + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + if (++ticks % getDistance() != 0) { + return false; + } + final boolean success = success(); + player.lock(); + player.getPacketDispatch().sendMessage(success ? "The falcon successfully swoops down and captures the kebbit." : "The falcon swoops down on the kebbit, but just misses catching it."); + if (success) { + node.finalizeDeath(player); + final NPC falcon = NPC.create(5094, node.getLocation()); + falcon.setAttribute("falcon:owner", player.getUsername()); + falcon.setAttribute("falcon:catch", falconCatch); + falcon.init(); + HintIconManager.registerHintIcon(player, falcon); + GameWorld.getPulser().submit(new Pulse(100, falcon) { + @Override + public boolean pulse() { + if (!falcon.isActive()) { + return true; + } + Projectile projectile = Projectile.create(node, Repository.findNPC(5093), 918); + projectile.setSpeed(80); + projectile.send(); + player.getPacketDispatch().sendMessage("Your falcon has left its prey. You see it heading back toward the falconer."); + falcon.clear(); + return true; + } + }); + } else { + if (player.getEquipment().remove(GLOVE)) { + player.getEquipment().add(FALCON, true, false); + } + } + player.unlock(); + player.face(null); + return true; + } + + /** + * Sends the projectile. + */ + private void sendProjectile() { + Projectile projectile = Projectile.create(player, node, 918); + projectile.setSpeed(80); + projectile.setStartHeight(26); + projectile.setEndHeight(1); + projectile.send(); + } + + /** + * Gets the distance of the npc. + * @return the distance. + */ + public int getDistance() { + return (int) (2 + (player.getLocation().getDistance(node.getLocation())) * 0.5); + } + + /** + * Checks if the catch was successful. + * @return {@code True} if so. + */ + public boolean success() { + if (originalLocation != node.getLocation()) { + return RandomFunction.random(1, 3) == 2; + } + return ((RandomFunction.getRandom(3) * player.getSkills().getLevel(Skills.HUNTER)) / 3) > (falconCatch.getLevel() / 2); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitEast.kt b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitEast.kt new file mode 100644 index 000000000..4cd0faf25 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitEast.kt @@ -0,0 +1,74 @@ +package core.game.node.entity.skill.hunter.tracking + +import core.cache.def.impl.ObjectDefinition +import core.game.node.item.Item +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +@Initializable +class CommonKebbitEast : HunterTracking() { + + init { + initialMap = hashMapOf( + 19439 to arrayListOf( + TrailDefinition(0,TrailType.LINKING, false,Location.create(2354, 3595, 0),Location.create(2360, 3602, 0)), + TrailDefinition(3,TrailType.LINKING,false,Location.create(2354, 3595, 0),Location.create(2355, 3601, 0)), + TrailDefinition(6,TrailType.LINKING,false,Location.create(2354, 3594, 0),Location.create(2349, 3604, 0)) + ), + 19440 to arrayListOf( + TrailDefinition(18,TrailType.LINKING,true,Location.create(2361, 3611, 0),Location.create(2360, 3602, 0)), + TrailDefinition(21,TrailType.LINKING,true,Location.create(2360, 3612, 0),Location.create(2357, 3607, 0)) + ) + ) + + linkingTrails = arrayListOf( + TrailDefinition(24,TrailType.LINKING,false,Location.create(2357, 3607, 0),Location.create(2354, 3609, 0),Location.create(2355, 3608, 0)), + TrailDefinition(27,TrailType.LINKING,false,Location.create(2354, 3609, 0),Location.create(2349, 3604, 0),Location.create(2351, 3608, 0)), + TrailDefinition(9,TrailType.LINKING,false ,Location.create(2360, 3602, 0),Location.create(2355, 3601, 0),Location.create(2358, 3599, 0)), + TrailDefinition(12,TrailType.LINKING,false,Location.create(2355, 3601, 0),Location.create(2349, 3604, 0),Location.create(2352, 3603, 0)), + TrailDefinition(15,TrailType.LINKING,false,Location.create(2360, 3602, 0),Location.create(2357, 3607, 0),Location.create(2358, 3603, 0)) + ) + experience = 36.0 + varp = 919 + trailLimit = 3 + attribute = "hunter:tracking:commontrail" + indexAttribute = "hunter:tracking:commonIndex" + rewards = arrayOf(Item(Items.COMMON_KEBBIT_FUR_10121), Item(Items.BONES_526),Item(Items.RAW_BEAST_MEAT_9986)) + KEBBIT_ANIM = Animation(5259) + } + + + override fun newInstance(arg: Any?): Plugin { + if(!linkingTrails.contains(initialMap.values.random()[0])){ + addExtraTrails() + } + ObjectDefinition.forId(19439).handlers["option:inspect"] = this + ObjectDefinition.forId(19440).handlers["option:inspect"] = this + ObjectDefinition.forId(19360).handlers["option:inspect"] = this + ObjectDefinition.forId(19361).handlers["option:inspect"] = this + ObjectDefinition.forId(19362).handlers["option:inspect"] = this + ObjectDefinition.forId(19363).handlers["option:inspect"] = this + ObjectDefinition.forId(19364).handlers["option:inspect"] = this + ObjectDefinition.forId(19365).handlers["option:inspect"] = this + ObjectDefinition.forId(19356).handlers["option:inspect"] = this + ObjectDefinition.forId(19357).handlers["option:inspect"] = this + ObjectDefinition.forId(19358).handlers["option:inspect"] = this + ObjectDefinition.forId(19359).handlers["option:inspect"] = this + ObjectDefinition.forId(19375).handlers["option:inspect"] = this + ObjectDefinition.forId(19376).handlers["option:inspect"] = this + ObjectDefinition.forId(19377).handlers["option:inspect"] = this + ObjectDefinition.forId(19378).handlers["option:inspect"] = this + ObjectDefinition.forId(19379).handlers["option:inspect"] = this + ObjectDefinition.forId(19372).handlers["option:inspect"] = this + ObjectDefinition.forId(19380).handlers["option:inspect"] = this + ObjectDefinition.forId(19374).handlers["option:inspect"] = this + ObjectDefinition.forId(19373).handlers["option:inspect"] = this + ObjectDefinition.forId(19428).handlers["option:search"] = this + ObjectDefinition.forId(19428).handlers["option:attack"] = this + + return this + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitWest.kt b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitWest.kt new file mode 100644 index 000000000..2b4386cf9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/CommonKebbitWest.kt @@ -0,0 +1,4 @@ +package core.game.node.entity.skill.hunter.tracking + +class CommonKebbitWest { +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/HunterTracking.kt b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/HunterTracking.kt new file mode 100644 index 000000000..6f20fc2af --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/HunterTracking.kt @@ -0,0 +1,265 @@ +package core.game.node.entity.skill.hunter.tracking + +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.player.Player +import core.game.node.entity.skill.Skills +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.tools.Items +import core.tools.RandomFunction +import java.util.* + +/** + * Main class for hunter tracking. All the other subclasses just define values that the methods in this class use. + * @author Ceikry + */ +abstract class HunterTracking : OptionHandler(){ + var KEBBIT_ANIM = Animation(0) + val MISS_ANIM = Animation(5255) + var trailLimit = 0 + var attribute = "" + var indexAttribute = "" + var rewards = Array(0){Item(0)} + var tunnelEntrances = Array(0){ Location(0,0,0) } + var initialMap = HashMap>() + var linkingTrails = ArrayList() + var experience = 0.0 + var varp = 0 + var requiredLevel = 1 + + /** + * Gets the initial trail based on the ID of the hole object the player clicked on + * @author Ceikry + */ + fun getInitialTrail(obj: GameObject): TrailDefinition? { + return initialMap[obj.id]?.random() + } + + /** + * Generates the entire trail all at once. + * @author Ceikry + */ + fun generateTrail(startobj: GameObject, player: Player) { + val trail = player.getAttribute(attribute, ArrayList()) + val initialTrail = getInitialTrail(startobj) + if(initialTrail == null) { + SystemLogger.logWarn("UNHANDLED STARTING OBJECT FOR HUNTER TRACKING $startobj") + return + } + trail.add(initialTrail) + player.setAttribute(attribute,trail) + + var numSpots = RandomFunction.random(2,trailLimit) + var triesRemaining = numSpots * 3 + + while(numSpots > 0){ + if(triesRemaining-- <= 0) { + clearTrail(player) + return + } + val nextTrail = getLinkingTrail(player) + nextTrail ?: continue + var offsetUsed = false + for(i in trail){ + if(i.offset == nextTrail.offset){ offsetUsed = true; break } + } + if(offsetUsed) continue + if(nextTrail.type == TrailType.TUNNEL){ + trail.add(nextTrail) + continue + } + trail.add(nextTrail) + player.setAttribute(attribute,trail) + numSpots-- + } + } + + /** + * Gets a linking trail point, used to build entire trails + * @author Ceikry + */ + fun getLinkingTrail(player: Player): TrailDefinition? { + val trail = player.getAttribute(attribute,ArrayList()) + val previousTrail = trail.get(trail.lastIndex) + if(previousTrail.type == TrailType.TUNNEL){ + val possibleTrails = ArrayList() + for(trail in linkingTrails){ + val invTrail = getTrailInverse(trail,false) + if(invTrail.type == TrailType.TUNNEL && previousTrail.endLocation.withinDistanceProper(invTrail.startLocation,5) && !previousTrail.endLocation.equals(invTrail.startLocation) && previousTrail.offset != trail.offset){ + possibleTrails.add(trail) + } + } + return possibleTrails.random() + } + val possibleTrails = ArrayList() + for(trail in linkingTrails){ + if(trail.startLocation.equals(previousTrail.endLocation) && previousTrail.offset != trail.offset){ + possibleTrails.add(trail) + } + } + return possibleTrails.random() + } + + + /** + * Inverts a trail so trails only have to be defined manually in one direction + * @author Ceikry + */ + fun getTrailInverse(trail: TrailDefinition, swapLocations: Boolean): TrailDefinition{ + if(swapLocations) + return TrailDefinition(trail.offset,if(tunnelEntrances.contains(trail.startLocation)) TrailType.TUNNEL else TrailType.LINKING,!trail.inverted,trail.endLocation,trail.startLocation, trail.triggerObjectLocation) + return TrailDefinition(trail.offset, if(tunnelEntrances.contains(trail.startLocation)) TrailType.TUNNEL else TrailType.LINKING, !trail.inverted, trail.startLocation, trail.endLocation) + } + + /** + * Populates the linked trail list with inverses of the manually defined trails + * @author Ceikry + */ + fun addExtraTrails(){ + linkingTrails.toTypedArray().forEach { trail -> + linkingTrails.add(getTrailInverse(trail,true)) + } + if(this is PolarKebbitHunting){ + initialMap.values.forEach { + linkingTrails.addAll(it) + it.forEach { trail -> + linkingTrails.add(getTrailInverse(trail, true)) + } + } + } + } + + /** + * Resets a player's trail + * @author Ceikry + */ + fun clearTrail(player: Player){ + player.removeAttribute(attribute) + player.removeAttribute(indexAttribute) + player.varpManager.get(varp).clear() + player.varpManager.get(varp).send(player) + } + + /** + * Check if a player has an active trail + * @author Ceikry + */ + fun hasTrail(player: Player): Boolean{ + return player.getAttribute(attribute,null) != null + } + + /** + * Rewards the player with items from the rewards array and awards experience. + * Pass false to success to just play the kebbit animation without rewarding anything. + * @author Ceikry + */ + fun reward(player: Player, success: Boolean) { + player.lock() + player.animator.animate(if(success) KEBBIT_ANIM else MISS_ANIM) + GameWorld.Pulser.submit(object : Pulse(KEBBIT_ANIM.duration){ + override fun pulse(): Boolean { + if(hasTrail(player) && success){ + for(item in rewards){ + if(!player.inventory.add(item)) + GroundItemManager.create(item,player) + } + player.skills.addExperience(Skills.HUNTER,experience) + clearTrail(player) + } + player.unlock() + return true + } + }) + } + + /** + * Updates the trail varp based on the current trail index + * @author Ceikry + */ + fun updateTrail(player: Player){ + player ?: return + val trail = player.getAttribute(attribute,ArrayList()) + val trailIndex = player.getAttribute(indexAttribute,0) + for(index in 0..trailIndex){ + val trl = trail[index] + player.varpManager.get(varp).setVarbit(trl.offset + 2,1) + player.varpManager.get(varp).setVarbit(trl.offset,if(trl.inverted) 1 else 0) + } + player.varpManager.get(varp).send(player) + } + + /** + * Handles all trail interactions + * @author Ceikry + */ + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + node ?: return true + player ?: return true + val trail = player.getAttribute(attribute,ArrayList()) + val currentIndex = player.getAttribute(indexAttribute,0) + if(!hasTrail(player) && !initialMap.containsKey(node.id)){ + player.dialogueInterpreter.sendDialogue("You search but find nothing.") + return true + } + val currentTrail = if(hasTrail(player)) { + if (currentIndex < trail.lastIndex) { + trail.get(currentIndex + 1) + } else { + trail.get(currentIndex) + } + } else { + TrailDefinition(0,TrailType.LINKING,false,Location(0,0,0),Location(0,0,0),Location(0,0,0)) + } + when(option){ + + "attack" -> { + if(!hasNooseWand(player)){ + player.dialogueInterpreter.sendDialogue("You need a noose wand to catch the kebbit.") + return true + } + if(currentIndex == trail.lastIndex && currentTrail.endLocation.equals(node.location)){ + reward(player,true) + } else { + reward(player,false) + } + } + + "inspect","search" -> { + if(!hasTrail(player)){ + if(player.skills.getLevel(Skills.HUNTER) < requiredLevel){ + player.dialogueInterpreter.sendDialogue("You need a hunter level of $requiredLevel to track these.") + return true + } + generateTrail(node.asObject(),player) + updateTrail(player) + } else { + if(currentTrail.triggerObjectLocation.equals(node.location) || (currentIndex == trail.lastIndex && currentTrail.endLocation.equals(node.location))){ + if(currentIndex == trail.lastIndex){ + player.dialogueInterpreter.sendDialogue("It looks like something is moving around in there.") + } else { + player.dialogueInterpreter.sendDialogue("You discover some tracks nearby.") + player.incrementAttribute(indexAttribute) + updateTrail(player) + } + } else { + player.dialogueInterpreter.sendDialogue("You search but find nothing of interest.") + } + } + } + + + } + return true + } + + fun hasNooseWand(player: Player) : Boolean{ + return player.equipment.contains(Items.NOOSE_WAND_10150,1) || player.inventory.contains(Items.NOOSE_WAND_10150,1) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/PolarKebbitHunting.kt b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/PolarKebbitHunting.kt new file mode 100644 index 000000000..54b08ef41 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/PolarKebbitHunting.kt @@ -0,0 +1,68 @@ +package core.game.node.entity.skill.hunter.tracking + +import core.cache.def.impl.ObjectDefinition +import core.game.node.item.Item +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +@Initializable +class PolarKebbitHunting : HunterTracking() { + + init { + KEBBIT_ANIM = Animation(5256) + trailLimit = 3 + attribute = "hunter:tracking:polartrail" + indexAttribute = "hunter:tracking:polarindex" + rewards = arrayOf(Item(Items.RAW_BEAST_MEAT_9986),Item(Items.POLAR_KEBBIT_FUR_10117),Item(Items.BONES_526)) + tunnelEntrances = arrayOf( + Location.create(2711, 3819, 1), + Location.create(2714, 3821, 1), + Location.create(2718, 3829, 1), + Location.create(2721, 3827, 1), + Location.create(2718, 3832, 1), + Location.create(2715, 3820, 1) + ) + initialMap = hashMapOf( + 19640 to arrayListOf( + TrailDefinition(24,TrailType.TUNNEL,false,Location.create(2712, 3831, 1),Location.create(2718, 3832, 1)), + TrailDefinition(21,TrailType.LINKING,true,Location.create(2712, 3831, 1),Location.create(2716, 3827, 1),Location.create(2713,3827,1)), + TrailDefinition(12,TrailType.LINKING,false,Location.create(2712, 3831, 1),Location.create(2708, 3819, 1),Location.create(2708,3825,1)) + ), + 19641 to arrayListOf( + TrailDefinition(0,TrailType.LINKING,true,Location.create(2718, 3820, 1),Location.create(2708, 3819, 1),Location.create(2712,3815,1)), + TrailDefinition(6,TrailType.TUNNEL,false, Location.create(2718, 3820, 1),Location.create(2715, 3820, 1)), + TrailDefinition(9,TrailType.TUNNEL,false,Location.create(2718, 3820, 1),Location.create(2721, 3827, 1)) + ) + ) + linkingTrails = arrayListOf( + TrailDefinition(15,TrailType.LINKING,true,Location.create(2714,3821,1),Location.create(2716, 3827, 1)), + TrailDefinition(18,TrailType.TUNNEL,true,Location.create(2716, 3827, 1),Location.create(2718,3829,1)), + TrailDefinition(3,TrailType.TUNNEL,false,Location.create(2708, 3819, 1),Location.create(2711, 3819, 1)) + ) + experience = 30.0 + varp = 926 + requiredLevel = 1 + } + + override fun newInstance(arg: Any?): Plugin { + addExtraTrails() + ObjectDefinition.forId(19640).handlers["option:inspect"] = this + ObjectDefinition.forId(19641).handlers["option:inspect"] = this + ObjectDefinition.forId(19435).handlers["option:inspect"] = this + ObjectDefinition.forId(36689).handlers["option:inspect"] = this + ObjectDefinition.forId(36690).handlers["option:inspect"] = this + ObjectDefinition.forId(19421).handlers["option:inspect"] = this + ObjectDefinition.forId(19424).handlers["option:inspect"] = this + ObjectDefinition.forId(19426).handlers["option:inspect"] = this + ObjectDefinition.forId(19419).handlers["option:inspect"] = this + ObjectDefinition.forId(19420).handlers["option:inspect"] = this + ObjectDefinition.forId(19423).handlers["option:inspect"] = this + ObjectDefinition.forId(36688).handlers["option:inspect"] = this + ObjectDefinition.forId(19435).handlers["option:search"] = this + ObjectDefinition.forId(19435).handlers["option:attack"] = this + return this + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/TrailDefinition.kt b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/TrailDefinition.kt new file mode 100644 index 000000000..9b5df1256 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/hunter/tracking/TrailDefinition.kt @@ -0,0 +1,14 @@ +package core.game.node.entity.skill.hunter.tracking + +import core.game.world.map.Location + +class TrailDefinition(val offset: Int, val type: TrailType, var inverted: Boolean, val startLocation: Location, val endLocation: Location, val triggerObjectLocation: Location = endLocation){ + override fun toString(): String { + return "$startLocation $endLocation [offset: $offset] [${type.name}] [inverted: $inverted]" + } +} +enum class TrailType{ + LINKING, + INITIAL, + TUNNEL +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/ChargeOrbSpells.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/ChargeOrbSpells.java new file mode 100644 index 000000000..173f3d6a5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/ChargeOrbSpells.java @@ -0,0 +1,202 @@ +package core.game.node.entity.skill.magic; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the the charging orb magic spell. + * + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class ChargeOrbSpells extends MagicSpell { + + /** + * The animation. + */ + private static final Animation ANIMATION = Animation.create(791); + + /** + * The unpowered orb item. + */ + private static final Item UNPOWERED_ORB = new Item(567); + + /** + * The object id. + */ + private int objectId; + + /** + * The item id. + */ + private int itemId; + + /** + * The button that was clicked. + */ + private int buttonId; + + /** + * Constructs a new {@code ChargeOrbSpells} {@code Object} + */ + public ChargeOrbSpells() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code ChargeOrbSpells} {@code Object}. + * + * @param level The level required. + * @param objectId The object id. + * @param itemId The item to add. + * @param buttonId the button clicked + * @param g The graphics. + * @param runes The runes required. + */ + public ChargeOrbSpells(int level, int objectId, int itemId, int buttonId, Graphics g, Item... runes) { + super(SpellBook.MODERN, level, level + 10, ANIMATION, g, null, runes); + this.objectId = objectId; + this.itemId = itemId; + this.buttonId = buttonId; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(35, new ChargeOrbSpells(56, 2151, 571, 35, new Graphics(149, 96), Runes.WATER_RUNE.getItem(30), Runes.COSMIC_RUNE.getItem(3), UNPOWERED_ORB)); + SpellBook.MODERN.register(39, new ChargeOrbSpells(60, 29415, 575, 39, new Graphics(151, 96), Runes.EARTH_RUNE.getItem(30), Runes.COSMIC_RUNE.getItem(3), UNPOWERED_ORB)); + SpellBook.MODERN.register(46, new ChargeOrbSpells(63, 42322, 569, 46, new Graphics(152, 96), Runes.FIRE_RUNE.getItem(30), Runes.COSMIC_RUNE.getItem(3), UNPOWERED_ORB)); + SpellBook.MODERN.register(49, new ChargeOrbSpells(66, 2152, 573, 49, new Graphics(150, 96), Runes.AIR_RUNE.getItem(30), Runes.COSMIC_RUNE.getItem(3), UNPOWERED_ORB)); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + if (!(target instanceof GameObject)) { + return false; + } + Player p = (Player) entity; + GameObject obj = (GameObject) target; + if (obj == null || obj.getId() != objectId) { + p.getPacketDispatch().sendMessage("You can't cast this spell on this object!"); + return false; + } + if (obj.getLocation().getDistance(p.getLocation()) > 3) { + p.getPacketDispatch().sendMessage("You're standing too far from the obelisk's reach."); + return false; + } + if (!p.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 2, 9) + && objectId == 2151 + && p.getInventory().containsItems(Runes.COSMIC_RUNE.getItem(15), Runes.WATER_RUNE.getItem(150), new Item(UNPOWERED_ORB.getId(), 5))) { + p.setAttribute("/save:diary:seers:water-orb-can-earn", true); + System.out.println("can_earn_true"); + p.setAttribute("/save:diary:seers:water-orb", 1); + } + if (!meetsRequirements(entity, true, true)) { + return false; + } + p.faceLocation(obj.getLocation()); + visualize(p, target); + if (!p.getPulseManager().hasPulseRunning()) { + p.getPulseManager().run(new ChargeOrbPulse(p, new Item(itemId), target, buttonId)); + } + p.getInventory().add(new Item(itemId)); + return true; + } + + /** + * Represents the pulse for automatically charging orbs on obelisks. + * + * @author Splinter + * @version 1.0 + */ + public static class ChargeOrbPulse extends SkillPulse { + + /** + * The item we are going to recieve (always an orb). + */ + public Item item; + + /** + * The target of the spell. + */ + public Node target; + + /** + * The button (spell) that we clicked. + */ + public int buttonId; + + /** + * The unpowered orb item. + */ + private static final Item UNPOWERED_ORB = new Item(567, 1); + + /** + * Constructs a new {@code ChargeOrbPulse} {@code Object}. + * + * @param player the player. + * @param target the node. + * @param item the item. + * @param buttonId the clicked button + */ + public ChargeOrbPulse(Player player, Item item, Node target, int buttonId) { + super(player, item); + this.item = item; + this.target = target; + this.buttonId = buttonId; + } + + @Override + public boolean checkRequirements() { + if (player.getInventory().contains(UNPOWERED_ORB.getId(), 1)) { + return true; + } + return false; + } + + @Override + public void animate() { + player.animate(new Animation(791)); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + super.setDelay(4); + return false; + } + if (ChargeOrbSpells.castSpell(player, SpellBook.MODERN, buttonId, target)) { + if (!player.getAchievementDiaryManager().hasCompletedTask(DiaryType.SEERS_VILLAGE, 2, 9) + && player.getAttribute("diary:seers:water-orb-can-earn", false)) { + player.setAttribute("/save:diary:seers:water-orb", 1 + player.getAttribute("diary:seers:water-orb", 0)); + } + if (player.getAttribute("diary:seers:water-orb", 0) >= 5) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 9); + player.removeAttribute("diary:seers:water-orb-can-earn"); + } + return false; + } else { + return true; + } + } + + @Override + public void stop() { + player.removeAttribute("diary:seers:water-orb-can-earn"); + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/ChargeSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/ChargeSpell.java new file mode 100644 index 000000000..8fe66583b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/ChargeSpell.java @@ -0,0 +1,53 @@ +package core.game.node.entity.skill.magic; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the charge spell magic spell. + * @author Emperor + * @version 1.0 + */ +@Initializable +public final class ChargeSpell extends MagicSpell { + + /** + * Constructs a new {@code ChargeSpell} {@code Object}. + */ + public ChargeSpell() { + super(SpellBook.MODERN, 80, 180, Animation.create(811), new Graphics(6, 96), null, new Item[] { Runes.FIRE_RUNE.getItem(3), Runes.BLOOD_RUNE.getItem(3), Runes.AIR_RUNE.getItem(3) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(58, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player p = (Player) entity; + if (p.getLocks().isLocked("charge_cast")) { + p.getPacketDispatch().sendMessage("You need to wait for the spell to recharge."); + return false; + } + if (!meetsRequirements(entity, true, true)) { + return false; + } + p.getLocks().lock("charge_cast", 100); + visualize(entity, target); + p.registerState("godcharge").init(); + p.getPacketDispatch().sendMessage("You feel charged with magic power."); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/CombinationRune.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/CombinationRune.java new file mode 100644 index 000000000..8b29ba69b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/CombinationRune.java @@ -0,0 +1,33 @@ +package core.game.node.entity.skill.magic; + +import java.util.ArrayList; +import java.util.List; + +public enum CombinationRune { + LAVA_RUNE(4699, Runes.FIRE_RUNE,Runes.EARTH_RUNE), + STEAM_RUNE(4694,Runes.FIRE_RUNE,Runes.WATER_RUNE), + MIST_RUNE(4695,Runes.WATER_RUNE,Runes.AIR_RUNE), + DUST_RUNE(4696, Runes.AIR_RUNE,Runes.EARTH_RUNE), + SMOKE_RUNE(4697,Runes.FIRE_RUNE,Runes.AIR_RUNE), + MUD_RUNE(4698,Runes.EARTH_RUNE,Runes.WATER_RUNE); + + + public Runes[] types; + public int id; + CombinationRune(int id, Runes... types){ + this.id = id; + this.types = types; + } + + public static List eligibleFor(Runes rune){ + List runes = new ArrayList<>(); + for(CombinationRune r : CombinationRune.values()){ + for(Runes ru : r.types){ + if(ru == rune){ + runes.add(r); + } + } + } + return runes; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/EnchantCrossbowSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/EnchantCrossbowSpell.java new file mode 100644 index 000000000..4feae9aba --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/EnchantCrossbowSpell.java @@ -0,0 +1,44 @@ +package core.game.node.entity.skill.magic; + +import core.game.component.Component; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the enchant crossbow spell. + * @author 'Vexia. + * @version 1.0 + */ +@Initializable +public final class EnchantCrossbowSpell extends MagicSpell { + + /** + * Constructs a new {@code EnchantCrossbowSpell} {@code Object}. + */ + public EnchantCrossbowSpell() { + super(SpellBook.MODERN, 4, 0, null, null, null, null); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(3, this); + return null; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + player.getInterfaceManager().open(new Component(432)); + int[][] data = new int[][] { { 17, 879 }, { 21, 9335 }, { 25, 880 }, { 28, 9336 }, { 31, 9337 }, { 34, 9338 }, { 37, 9339 }, { 40, 9340 }, { 43, 9341 }, { 46, 9342 } }; + for (int i = 0; i < data.length; i++) { + player.getPacketDispatch().sendItemZoomOnInterface(data[i][1], 10, 270, 432, data[i][0]); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/HouseTeleportPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/HouseTeleportPlugin.java new file mode 100644 index 000000000..4833d6ebe --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/HouseTeleportPlugin.java @@ -0,0 +1,53 @@ +package core.game.node.entity.skill.magic; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * + * For house teleportation. + * + * @author Jamix77 + * + */ +public class HouseTeleportPlugin extends MagicSpell { + + public HouseTeleportPlugin(final int level, final double experience, final Item... items) { + super(SpellBook.MODERN, level, experience, null, null, null, items); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + if (((Player)entity).getHouseManager().getLocation().getExitLocation() == null) { + ((Player)entity).sendMessage("You must have a house to teleport to before attempting that."); + return false; + } + Location location = ((Player)entity).getHouseManager().getLocation().getExitLocation(); + if (entity.getLocks().isTeleportLocked() || !super.meetsRequirements(entity, true, false)) { + return false; + } + if (entity.getTeleporter().send(location.transform(0, RandomFunction.random(3), 0), TeleportType.NORMAL)) { + entity.setAttribute("teleport:items", super.runes); + entity.setAttribute("magic-delay", GameWorld.getTicks() + 5); + ((Player) entity).getInventory().remove(super.runes); + return true; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/MagicSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/MagicSpell.java new file mode 100644 index 000000000..3cf050b45 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/MagicSpell.java @@ -0,0 +1,427 @@ +package core.game.node.entity.skill.magic; + +import core.game.component.Component; +import core.game.node.entity.skill.Skills; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.MapDistance; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a magic spell. + * @author Emperor + */ +public abstract class MagicSpell implements Plugin { + + /** + * The spell book. + */ + protected final SpellBook book; + + /** + * The level requirement. + */ + protected final int level; + + /** + * The animation. + */ + protected final Animation animation; + + /** + * The casting graphics. + */ + protected final Graphics graphic; + + /** + * The casting Audio. + */ + protected final Audio audio; + + /** + * The item-array containing the runes required. + */ + protected final Item[] runes; + + /** + * The spell id. + */ + protected int spellId; + + /** + * The experience gained. + */ + private final double experience; + + /** + * Constructs a new {@code MagicSpell} {@code Object}. + */ + public MagicSpell() { + this(SpellBook.MODERN, 0, 0, null, null, null, new Item[0]); + } + + /** + * Constructs a new {@code MagicSpell} {@code Object}. + * @param book The spell book this spell is from. + * @param level The level requirement. + * @param animation the cast animation. + * @param graphic The cast graphic. + * @param Audio The casting Audio. + * @param runes The runes required to cast the spell. + */ + public MagicSpell(SpellBook book, int level, final double experience, Animation animation, Graphics graphic, Audio Audio, Item[] runes) { + this.book = book; + this.level = level; + this.experience = experience; + this.animation = animation; + this.graphic = graphic; + this.audio = Audio; + this.runes = runes; + } + + /** + * Casts a spell. + * @param p The player casting the spell. + * @param target The target. + */ + public static boolean castSpell(final Player p, SpellBook book, int spellId, Node target) { + if (p.getAttribute("magic-delay", 0) > GameWorld.getTicks()) { + return false; + } + MagicSpell spell = book.getSpell(spellId); + if (spell == null) { + return false; + } + if (spell.book != book || p.getSpellBookManager().getSpellBook() != book.getInterfaceId()) { + return false; + } + if (target.getLocation() != null && target != p) { + if (!target.getLocation().withinDistance(p.getLocation(), 15)) { + return false; + } + p.faceLocation(target.getLocation()); + } + boolean combatSpell = spell instanceof CombatSpell; + if (!combatSpell && target instanceof Entity) { + p.faceTemporary((Entity) target, 1); + } + if (spell.cast(p, target)) { + if (book != SpellBook.LUNAR && p.getAttribute("spell:swap", 0) != 0) { + p.removeAttribute("spell:swap"); + p.getSpellBookManager().setSpellBook(SpellBook.LUNAR); + p.getInterfaceManager().openTab(new Component(SpellBook.LUNAR.getInterfaceId())); + } + if (!combatSpell) { + p.getSkills().addExperience(Skills.MAGIC, spell.getExperience(p), true); + } + if (p.getAttribute("magic-delay", 0) <= GameWorld.getTicks()) { + p.setAttribute("magic-delay", GameWorld.getTicks() + spell.getDelay()); + } + return true; + } + return false; + } + + /** + * Gets the delay. + * @return the delay. + */ + public int getDelay() { + return 3; + } + + /** + * Starts the effect of this spell (if any). + * @param entity The entity. + */ + public abstract boolean cast(Entity entity, Node target); + + /** + * Visualizes the spell. + * @param entity The entity. + * @param target The target. + */ + public void visualize(Entity entity, Node target) { + entity.graphics(graphic); + entity.animate(animation); + sendAudio(entity); + } + + /** + * Checks if the player is holding the staff that will be used instead of + * the rune. + * @param p The player. + * @param rune The rune item id. + * @return {@code True} if the player is wearing the correct staff for the + * rune. + */ + public boolean usingStaff(Player p, int rune) { + Item weapon = p.getEquipment().get(3); + if (weapon == null) { + return false; + } + MagicStaff staff = MagicStaff.forId(rune); + if (staff == null) { + return false; + } + int[] staves = staff.getStaves(); + for (int id : staves) { + if (weapon.getId() == id) { + return true; + } + } + return false; + } + + /** + * Checks if the casting entity meets the requirements to cast this spell. + * @param caster The caster. + * @param message If a message should be send to the caster if it doesn't + * meet the requirements. + * @param remove If we should remove the runes from the player's inventory. + * @return {@code True} if so. + */ + public boolean meetsRequirements(Entity caster, boolean message, boolean remove) { + if (!checkLevelRequirement(caster, message)) { + return false; + } + if (caster instanceof Player) { + CombatSpell spell = ((Player) caster).getProperties().getAutocastSpell(); + if (spell != null) { + boolean slayer = ((Player) caster).getEquipment().get(3).getName().contains("layer's staff"); + boolean voidKnight = ((Player) caster).getEquipment().get(3).getName().contains("knight mace"); + if ((spell.getSpellId() == 31 && !slayer) || (spell.getSpellId() == 42 && !voidKnight)) { + ((Player) caster).getPacketDispatch().sendMessage("You need the proper staff to autocast this spell."); + return false; + } + } + } + if((spellId == 12 || spellId == 30 || spellId == 56) && caster instanceof Player){ + if (caster.getAttribute("entangleDelay", 0) > GameWorld.getTicks()) { + caster.asPlayer().sendMessage("You have recently cast a binding spell."); + return false; + } + } + if (caster instanceof Player) { + Player p = (Player) caster; + if(p.getEquipment().get(3) != null && p.getEquipment().get(3).getId() == 14726){ + if(RandomFunction.getRandom(100) < 13){ + p.sendMessage("Your staff negates the rune requirement of the spell."); + return true; + } + } + if (runes == null) { + return true; + } + List toRemove = new ArrayList<>(); + for (Item item : runes) { + if (!hasRune(p, item, toRemove, message)) { + return false; + } + } + if (remove) { + toRemove.forEach(i -> { + p.getInventory().remove(i); + }); + } + return true; + } + return true; + } + + /** + * Checks the level requirement. + * @param caster The caster. + * @param message If we display the message. + * @return {@code True} if passed. + */ + public boolean checkLevelRequirement(Entity caster, boolean message) { + if (caster instanceof Player && caster.getSkills().getLevel(Skills.MAGIC, this instanceof CombatSpell ? true : false) < levelRequirement()) { + if (message && caster instanceof Player) { + ((Player) caster).getPacketDispatch().sendMessage("You need a Magic level of " + levelRequirement() + " to cast this spell."); + } + return false; + } + return true; + } + + /** + * Checks if the player has a rune to remove. + * @param p the player. + * @param item the item. + * @param toRemove the list of items to remove. + * @param message the message. + * @return {@code True} if so. + */ + public boolean hasRune(Player p, Item item, List toRemove, boolean message) { + if (!usingStaff(p, item.getId())) { + boolean hasBaseRune = p.getInventory().contains(item.getId(),item.getAmount()); + if(!hasBaseRune){ + int baseAmt = p.getInventory().getAmount(item.getId()); + if(baseAmt > 0){ + toRemove.add(new Item(item.getId(),p.getInventory().getAmount(item.getId()))); + } + int amtRemaining = item.getAmount() - baseAmt; + List possibleComboRunes = CombinationRune.eligibleFor(Runes.forId(item.getId())); + for(CombinationRune r : possibleComboRunes){ + if(p.getInventory().containsItem(new Item(r.id)) && amtRemaining > 0){ + int amt = p.getInventory().getAmount(r.id); + if(amtRemaining < amt){ + toRemove.add(new Item(r.id,amtRemaining)); + amtRemaining = 0; + continue; + } + amtRemaining -= p.getInventory().getAmount(r.id); + toRemove.add(new Item(r.id,p.getInventory().getAmount(r.id))); + } + } + if(amtRemaining <= 0){ + return true; + } else { + p.getPacketDispatch().sendMessage("You don't have enough " + item.getName() + "s to cast this spell."); + return false; + } + } + toRemove.add(item); + return true; + } + return true; + } + + /** + * Adds the experience for casting this spell. + * @param entity The entity to reward with experience. + * @param hit The hit. + */ + public void addExperience(Entity entity, int hit) { + if (!(entity instanceof Player) || hit < 1) { + return; + } + entity.getSkills().addExperience(Skills.HITPOINTS, hit * 1.33, true); + if (entity.getProperties().getAttackStyle().getStyle() == WeaponInterface.STYLE_DEFENSIVE_CAST) { + entity.getSkills().addExperience(Skills.DEFENCE, hit, true); + entity.getSkills().addExperience(Skills.MAGIC, 1.33 * hit, true); + return; + } + entity.getSkills().addExperience(Skills.MAGIC, hit * (CombatSwingHandler.EXPERIENCE_MOD / 2), true); + } + + /** + * Gets the level requirement to cast this spell. + * @return The level requirement. + */ + public int levelRequirement() { + return level; + } + + /** + * Sends the Audio packet for all players to hear (in a distance specified + * by ). + * @param entity The entity from where this Audio comes from. + */ + public void sendAudio(Entity entity) { + sendAudio(entity, audio); + } + + /** + * Sends the Audio packet for all players to hear (in a distance specified + * by ). + * @param entity The entity from where this Audio comes from. + * @param audio The Audio to send. + */ + public void sendAudio(Entity entity, Audio audio) { + if (audio == null || audio.getId() < 0) { + return; + } + for (Player p : RegionManager.getLocalPlayers(entity, MapDistance.SOUND.getDistance())) { + p.getAudioManager().send(audio); + } + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Gets the audio. + * @return the audio. + */ + public Audio getAudio() { + return audio; + } + + /** + * Gets the spell book for this spell. + * @return The spell book. + */ + public SpellBook getBook() { + return book; + } + + /** + * Gets the item array of runes required to cast this spell. + * @return The item array of runes, or {@code null} if the spell doesn't need + * any runes. + */ + public Item[] getCastRunes() { + return runes; + } + + /** + * Gets the spellId. + * @return The spellId. + */ + public int getSpellId() { + return spellId; + } + + /** + * Sets the spellId. + * @param spellId The spellId to set. + */ + public void setSpellId(int spellId) { + this.spellId = spellId; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the experience. + * @param player the player. + * @return the experience. + */ + public double getExperience(Player player) { + return experience; + } + + /** + * Gets the level requirement. + * @return The level requirement. + */ + public int getLevel() { + return level; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/MagicStaff.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/MagicStaff.java new file mode 100644 index 000000000..bae873e7f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/MagicStaff.java @@ -0,0 +1,88 @@ +package core.game.node.entity.skill.magic; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents a magic staff. + * @author Emperor + */ +public enum MagicStaff { + + /** + * Represents the fire rune staves. + */ + FIRE_RUNE(554, 1387, 1393, 1401, 3053, 3055, 3056, 11736, 11738), + + /** + * Represents the water rune staves. + */ + WATER_RUNE(555, 1383, 1395, 1403, 6563, 11736, 11738, 6562), + + /** + * Represents the air rune staves. + */ + AIR_RUNE(556, 1381, 1397, 1405, 21777), + + /** + * Represents the earth rune staves. + */ + EARTH_RUNE(557, 3053, 3055, 3056, 1385, 1399, 1407, 557, 6563, 6562); + + /** + * The magic staves mapping. + */ + private static final Map MAGIC_STAVES = new HashMap(); + + /** + * Populate the mapping. + */ + static { + for (MagicStaff m : MagicStaff.values()) { + MAGIC_STAVES.put(m.getRuneId(), m); + } + } + + /** + * Gets a magic staff from the mapping. + * @param runeId The rune id. + * @return The magic staff instance. + */ + public static MagicStaff forId(int runeId) { + return MAGIC_STAVES.get(runeId); + } + + /** + * The rune id. + */ + private final int runeId; + + /** + * The staves. + */ + private final int[] staves; + + /** + * Constructs a new {@code MagicStaff} {@code Object}. + * @param runeId The rune id. + * @param staves The possible staff item ids. + */ + private MagicStaff(int runeId, int... staves) { + this.runeId = runeId; + this.staves = staves; + } + + /** + * @return the runeId + */ + public int getRuneId() { + return runeId; + } + + /** + * @return the staves + */ + public int[] getStaves() { + return staves; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/ModernTeleportPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/ModernTeleportPlugin.java new file mode 100644 index 000000000..e2a57e4e7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/ModernTeleportPlugin.java @@ -0,0 +1,105 @@ +package core.game.node.entity.skill.magic; + +import core.ServerConstants; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the plugin to handle all teleport spells in the modern book. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class ModernTeleportPlugin extends MagicSpell { + + /** + * Represents the location to teleport to. + */ + private Location location; + + /** + * Constructs a new {@code ModernTeleportPlugin} {@code Object}. + */ + public ModernTeleportPlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ModernTeleportPlugin.java} {@code Object}. + * @param level the level. + * @param experience the experience. + * @param location the location. + * @param items the items. + */ + public ModernTeleportPlugin(final int level, final double experience, final Location location, final Item... items) { + super(SpellBook.MODERN, level, experience, null, null, null, items); + this.location = location; + } + + @Override + public boolean cast(Entity entity, Node target) { + if (entity.getLocks().isTeleportLocked() || !super.meetsRequirements(entity, true, false)) { + return false; + } + if (entity.getTeleporter().send(location.transform(0, RandomFunction.random(3), 0), getSpellId() == 0 ? TeleportType.HOME : TeleportType.NORMAL)) { + if (!super.meetsRequirements(entity, true, true)) { + entity.getTeleporter().getCurrentTeleport().stop(); + return false; + } + // Use the teleport to Varrock spell + if (entity.isPlayer() && location.equals(Location.create(3213, 3424, 0))) { + entity.asPlayer().getAchievementDiaryManager().finishTask(entity.asPlayer(),DiaryType.VARROCK,1, 13); + } + // + if (entity.isPlayer() && location.getX() == 2758 && location.getY() == 3478) { + entity.asPlayer().getAchievementDiaryManager().finishTask(entity.asPlayer(), DiaryType.SEERS_VILLAGE, 1, 5); + } + // Use the teleport Lumbridge spell + if (entity.isPlayer() && location.equals(Location.create(3221, 3219, 0))) { + entity.asPlayer().getAchievementDiaryManager().finishTask(entity.asPlayer(), DiaryType.LUMBRIDGE, 2, 2); + } + entity.setAttribute("teleport:items", super.runes); + entity.setAttribute("magic-delay", GameWorld.getTicks() + 5); + return true; + } + return false; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + // home + SpellBook.MODERN.register(0, new ModernTeleportPlugin(0, 0, ServerConstants.HOME_LOCATION)); + // varrock + SpellBook.MODERN.register(15, new ModernTeleportPlugin(25, 35, Location.create(3213, 3424, 0), new Item(Runes.FIRE_RUNE.getId()), new Item(Runes.AIR_RUNE.getId(), 3), new Item(Runes.LAW_RUNE.getId(), 1))); + // lumby + SpellBook.MODERN.register(18, new ModernTeleportPlugin(31, 41, Location.create(3221, 3219, 0), new Item(Runes.EARTH_RUNE.getId()), new Item(Runes.AIR_RUNE.getId(), 3), new Item(Runes.LAW_RUNE.getId(), 1))); + // fally + SpellBook.MODERN.register(21, new ModernTeleportPlugin(37, 47, Location.create(2965, 3378, 0), new Item(Runes.WATER_RUNE.getId()), new Item(Runes.AIR_RUNE.getId(), 3), new Item(Runes.LAW_RUNE.getId(), 1))); + // camelot + SpellBook.MODERN.register(26, new ModernTeleportPlugin(45, 55.5, Location.create(2758, 3478, 0), new Item(Runes.AIR_RUNE.getId(), 5), new Item(Runes.LAW_RUNE.getId(), 1))); + // house + SpellBook.MODERN.register(23, new HouseTeleportPlugin(40, 50, new Item(Runes.LAW_RUNE.getId()), new Item(Runes.AIR_RUNE.getId(), 1), new Item(Runes.EARTH_RUNE.getId(), 1))); + // ardougne + SpellBook.MODERN.register(32, new ModernTeleportPlugin(51, 61, Location.create(2662, 3307, 0), new Item(Runes.WATER_RUNE.getId(), 2), new Item(Runes.LAW_RUNE.getId(), 2))); + // watchtower + SpellBook.MODERN.register(37, new ModernTeleportPlugin(58, 68, Location.create(2549, 3112, 0), new Item(Runes.EARTH_RUNE.getId(), 2), new Item(Runes.LAW_RUNE.getId(), 2))); + // trollheim + SpellBook.MODERN.register(44, new ModernTeleportPlugin(61, 68, Location.create(2891, 3678, 0), new Item(Runes.FIRE_RUNE.getId(), 2), new Item(Runes.LAW_RUNE.getId(), 2))); + // ape atol + SpellBook.MODERN.register(47, new ModernTeleportPlugin(64, 74, Location.create(2754, 2784, 0), new Item(Runes.FIRE_RUNE.getId(), 2), new Item(Runes.WATER_RUNE.getId(), 2), new Item(Runes.LAW_RUNE.getId(), 2), new Item(1963, 1))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/Runes.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/Runes.java new file mode 100644 index 000000000..2eb542494 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/Runes.java @@ -0,0 +1,114 @@ +package core.game.node.entity.skill.magic; + +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.item.Item; +import core.tools.Items; + +/** + * Represents the Constants of runes. + * @author 'Vexia + */ +public enum Runes { + AIR_RUNE(556), WATER_RUNE(555), EARTH_RUNE(557), FIRE_RUNE(554), MIND_RUNE(558), NATURE_RUNE(561), CHAOS_RUNE(562), DEATH_RUNE(560), COSMIC_RUNE(564), BLOOD_RUNE(565), SOUL_RUNE(566), ASTRAL_RUNE(9075), LAW_RUNE(563), BODY_RUNE(559), SARADOMIN_STAFF(2415), GUTHIX_STAFF(2416), ZAMORAK_STAFF(2417), ZURIELS_STAFF(13867); + + /** + * Constructs a new {@code Runes} {@code Object}. + * @param id the id. + */ + Runes(int id) { + this.id = id; + } + + /** + * The id of the rune. + */ + private int id; + + /** + * Gets the id of the rune. + * @return the id. + */ + public int getId() { + return id; + } + + /** + * Gets the rune by the id. + * @param id the id. + * @return the id. + */ + public static Runes forId(int id) { + for (Runes rune : Runes.values()) { + if (rune.getId() == id) { + return rune; + } + } + return null; + } + + /** + * Checks if the player has an infinite amt of runes. + * @param rune the rune. + * @param weapon the weapon. + * @return {@code true} if so. + */ + public static final boolean isInfinite(Runes rune, Item weapon, SpellType... type) { + if (weapon == null || rune == null) { + return false; + } + if (type != null) { + if (weapon.getId() == 2415 && rune == Runes.SARADOMIN_STAFF && type.length == 1) { + if (type[0] == SpellType.GOD_STRIKE) { + return true; + } + } + if (weapon.getId() == 2416 && rune == Runes.GUTHIX_STAFF && type.length == 1) { + if (type[0] == SpellType.GOD_STRIKE) { + return true; + } + } + if (weapon.getId() == 13867 && rune == Runes.ZURIELS_STAFF && type.length == 1) { + if (type[0] == SpellType.BARRAGE || type[0] == SpellType.BLITZ + || type[0] == SpellType.RUSH || type[0] == SpellType.BURST) { + return true; + } + } + if (weapon.getId() == 2417 && rune == Runes.ZAMORAK_STAFF && type.length == 1) { + if (type[0] == SpellType.GOD_STRIKE) { + return true; + } + } + } + if (rune == Runes.AIR_RUNE) { + if (weapon.getId() == Items.STAFF_OF_AIR_1381 || weapon.getId() == Items.AIR_BATTLESTAFF_1397) // air staff + return true; + } else if (rune == Runes.WATER_RUNE) { + if (weapon.getId() == Items.STAFF_OF_WATER_1383 || weapon.getId() == Items.WATER_BATTLESTAFF_1395) // water staff + return true; + } else if (rune == Runes.EARTH_RUNE) { + if (weapon.getId() == Items.STAFF_OF_EARTH_1385 || weapon.getId() == Items.EARTH_BATTLESTAFF_1399) // earth staff + return true; + } else if (rune == Runes.FIRE_RUNE) { + if (weapon.getId() == Items.STAFF_OF_FIRE_1387 || weapon.getId() == Items.FIRE_BATTLESTAFF_1393) // fire staff + return true; + } + return false; + } + + /** + * Method used to transform this item. + * @return the item. + */ + public Item transform() { + return new Item(id); + } + + /** + * Gets the item of this rune. + * @param amount The amount. + * @return The item instance. + */ + public Item getItem(int amount) { + return new Item(id, amount); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/SuperheatSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/SuperheatSpell.java new file mode 100644 index 000000000..3b308aaa6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/SuperheatSpell.java @@ -0,0 +1,85 @@ +package core.game.node.entity.skill.magic; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.smithing.smelting.Bar; +import core.game.node.entity.skill.smithing.smelting.SmeltingPulse; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Represents the super heat spell. + * @author Vexia + * @version 1.0 + */ +@Initializable +public final class SuperheatSpell extends MagicSpell { + + /** + * Constructs a new {@code SuperheatSpell} {@code Object}. + */ + public SuperheatSpell() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SuperheatSpell} {@code Object}. + * @param level the level. + * @param runes the runes. + */ + public SuperheatSpell(int level, Item... runes) { + super(SpellBook.MODERN, level, 53.0, null, null, null, runes); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(25, new SuperheatSpell(43, new Item(Runes.FIRE_RUNE.getId(), 4), new Item(Runes.NATURE_RUNE.getId(), 1))); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + final Item item = ((Item) target); + player.getInterfaceManager().setViewedTab(6); + if (player.inCombat()) { + player.getPacketDispatch().sendMessage("You can't do that during combat."); + return false; + } + if (!item.getName().contains("ore") && !item.getName().toLowerCase().equals("coal")) { + player.getPacketDispatch().sendMessage("You need to cast superheat item on ore."); + return false; + } + final Bar bar = Bar.forOre(item.getId()); + if (bar == null) { + return false; + } + if (player.getSkills().getLevel(Skills.SMITHING) < bar.getLevel()) { + player.sendMessage("You need a Smithing level of at least " + bar.getLevel() + " to do this."); + return false; + } + boolean hasOres = true; + for (Item items : bar.getOres()) { + if (!player.getInventory().contains(items.getId(), item.getAmount())) { + player.getPacketDispatch().sendMessage("You do not have the required ores to make this bar."); + hasOres = false; + break; + } + } + if(!hasOres) return false; + if (!super.meetsRequirements(entity, true, true)) { + return false; + } + player.getAudioManager().send(117); + player.getPulseManager().run(new SmeltingPulse(player, item, bar, 1, true)); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/TeleblockSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/TeleblockSpell.java new file mode 100644 index 000000000..937d59383 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/TeleblockSpell.java @@ -0,0 +1,124 @@ +package core.game.node.entity.skill.magic; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the teleportation block spell in the modern spellbook. + * @author Splinter + * + */ +@Initializable +public final class TeleblockSpell extends CombatSpell { + + /** + * The projectile for the teleblock spell. + */ + private static final Projectile TELEBLOCK_ORB = Projectile.create((Entity) null, null, 1842, 40, 36, 52, 75, 15, 11); + + /** + * The ending graphic for the teleblock spell. + */ + private static final Graphics TELEBLOCK_SUCCESS = new Graphics(1843, 0); + + /** + * The starting graphic for the teleblock spell. + */ + private static final Graphics TELEBLOCK_START = new Graphics(1841, 0); + + /** + * Constructs a new {@code TeleblockSpell} {@code Object}. + */ + public TeleblockSpell() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code TeleblockSpell} {@code Object}. + * @param level - the level needed to cast this spell + * @param baseExperience - the base amount of experience we need to give + * @param impactSound -the sound played on successful impact + * @param anim - the animation to play + * @param start - the starting graphic + * @param projectile - the projectile to send + * @param end - the ending graphic + */ + public TeleblockSpell(SpellType type, int level, double baseExperience, int impactSound, Animation anim, Graphics start, Projectile projectile, Graphics end, Item... runes) { + super(type, SpellBook.MODERN, level, baseExperience, 202, 203, anim, TELEBLOCK_START, TELEBLOCK_ORB, TELEBLOCK_SUCCESS, runes); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.MODERN.register(63, new TeleblockSpell(SpellType.TELEBLOCK, 85, 80, 203, new Animation(10503, Priority.HIGH), TELEBLOCK_START, TELEBLOCK_ORB, TELEBLOCK_SUCCESS, Runes.LAW_RUNE.getItem(1), Runes.DEATH_RUNE.getItem(1), Runes.CHAOS_RUNE.getItem(1))); + return this; + } + + @Override + public void visualize(Entity entity, Node target) { + entity.graphics(graphic); + if (projectile != null) { + projectile.transform(entity, (Entity) target, false, 58, 10).send(); + } + entity.animate(animation); + sendAudio(entity, audio); + } + + @Override + public boolean cast(Entity entity, Node target) { + if (!(target instanceof Player)) { + entity.asPlayer().sendMessage("You can only cast this spell on another player."); + return false; + } + if (!entity.getZoneMonitor().isInZone("Wilderness") || !((Player) target).getZoneMonitor().isInZone("Wilderness")) { + entity.asPlayer().sendMessage("You and your opponent must both be in the wilderness for you to use this spell."); + return false; + } + if (((Player) target).isTeleBlocked()) { + entity.asPlayer().sendMessage("That player is already affected by this spell."); + return false; + } + if (!meetsRequirements(entity, true, false)) { + return false; + } + return super.cast(entity, target); + } + + @Override + public void visualizeImpact(Entity entity, Entity target, BattleState state) { + super.visualizeImpact(entity, target, state); + } + + @Override + public int getMaximumImpact(Entity entity, Entity victim, BattleState state) { + return 0; + } + + @Override + public void fireEffect(Entity entity, Entity victim, BattleState state) { + if(!victim.isTeleBlocked() && victim instanceof Player && state.getStyle().getSwingHandler().isAccurateImpact(entity, victim) && state.getEstimatedHit() > 0){ + int ticks = 500; + if(((Player) victim).getPrayer().get(PrayerType.PROTECT_FROM_MAGIC)){ + ticks /= 2; + } + victim.getStateManager().set(EntityState.TELEBLOCK, ticks); + } else if(victim.isTeleBlocked()){ + entity.asPlayer().sendMessage("Your target is already blocked from teleporting."); + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/TeleotherSpells.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/TeleotherSpells.java new file mode 100644 index 000000000..60cf8f45c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/TeleotherSpells.java @@ -0,0 +1,120 @@ +package core.game.node.entity.skill.magic; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the teleport other spells. + * @author Emperor + */ +@Initializable +public final class TeleotherSpells extends MagicSpell { + + /** + * The destination. + */ + private String destination; + + /** + * The destination location. + */ + private Location location; + + /** + * Constructs a new {@code TeleotherSpells} {@code Object}. + */ + public TeleotherSpells() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code TeleotherSpells} {@code Object}. + * @param level The level required. + * @param destination The destination name. + * @param location The location to teleport to. + * @param runes The runes required. + */ + public TeleotherSpells(int level, double experience, String destination, Location location, Item... runes) { + super(SpellBook.MODERN, level, experience, Animation.create(1818), Graphics.create(343), new Audio(199, 0, 0), runes); + this.destination = destination; + this.location = location; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + ComponentDefinition.put(326, new ComponentPlugin() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (button == 5) { + player.lock(2); + if (player.getTeleporter().send(player.getAttribute("t-o_location", player.getLocation()), TeleportType.TELE_OTHER)) { + player.visualize(Animation.create(1816), Graphics.create(342)); + } + } + player.getInterfaceManager().close(); + return true; + } + }); + SpellBook.MODERN.register(54, new TeleotherSpells(74, 84, "Lumbridge", Location.create(3222, 3217, 0), Runes.SOUL_RUNE.getItem(1), Runes.LAW_RUNE.getItem(1), Runes.EARTH_RUNE.getItem(1))); + SpellBook.MODERN.register(59, new TeleotherSpells(82, 92, "Falador", Location.create(2965, 3378, 0), Runes.SOUL_RUNE.getItem(1), Runes.LAW_RUNE.getItem(1), Runes.WATER_RUNE.getItem(1))); + SpellBook.MODERN.register(62, new TeleotherSpells(90, 100, "Camelot", Location.create(2758, 3478, 0), Runes.SOUL_RUNE.getItem(2), Runes.LAW_RUNE.getItem(1))); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + Player p = (Player) entity; + if (!(target instanceof Player)) { + p.getPacketDispatch().sendMessage("You can only cast this spell on other players."); + return false; + } + if (!entity.getZoneMonitor().teleport(0, null)) { + return false; + } + Player o = (Player) target; + if (!o.isActive() || o.getLocks().isTeleportLocked() || o.getInterfaceManager().isOpened()) { + p.getPacketDispatch().sendMessage("The other player is currently busy."); + return false; + } + if(o.getZoneMonitor().isInZone("Wilderness") && o.getProperties().getCombatPulse().isInCombat()){ + p.sendMessage("The other player has their hands full at the moment!"); + return true; + } + if (!o.getSettings().isAcceptAid()) { + p.getPacketDispatch().sendMessage("The player is not accepting any aid."); + return false; + } + if (!meetsRequirements(entity, true, true)) { + return false; + } + visualize(entity, target); + p.faceLocation(o.getLocation()); + o.setAttribute("t-o_location", location); + o.getPacketDispatch().sendString(p.getUsername(), 326,1); + o.getPacketDispatch().sendString(destination, 326, 3); + o.getInterfaceManager().open(new Component(326)); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/ancient/AncientTeleportPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/ancient/AncientTeleportPlugin.java new file mode 100644 index 000000000..7da6a9d9c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/ancient/AncientTeleportPlugin.java @@ -0,0 +1,96 @@ +package core.game.node.entity.skill.magic.ancient; + +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the plugin used to handle all ancient teleporting plugins. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class AncientTeleportPlugin extends MagicSpell { + + /** + * Represents the location to teleport to. + */ + private Location location; + + /** + * Constructs a new {@code AncientTeleportPlugin} {@code Object}. + */ + public AncientTeleportPlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code AncientTeleportPlugin.java} {@code Object}. + * @param level the level. + * @param experience the experience. + * @param location the location. + * @param items the items. + */ + public AncientTeleportPlugin(final int level, final double experience, final Location location, final Item... items) { + super(SpellBook.ANCIENT, level, experience, null, null, null, items); + this.location = location; + } + + @Override + public boolean cast(Entity entity, Node target) { + if (entity.getLocks().isTeleportLocked() || !super.meetsRequirements(entity, true, false)) { + return false; + } + if (entity.getTeleporter().send(location.transform(0, RandomFunction.random(3), 0), getSpellId() == 24 ? TeleportType.HOME : TeleportType.ANCIENT)) { + if (!super.meetsRequirements(entity, true, true)) { + entity.getTeleporter().getCurrentTeleport().stop(); + return false; + } + // Use the Home Teleport spell in the Ancient Magicks spellbook

to teleport to Edgeville + if (entity.isPlayer() && location.equals(Location.create(3087, 3495, 0))) { + entity.asPlayer().getAchievementDiaryManager().finishTask(entity.asPlayer(), DiaryType.VARROCK, 2, 11); + } + entity.setAttribute("teleport:items", super.runes); + entity.setAttribute("magic-delay", GameWorld.getTicks() + 5); + return true; + } + return false; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + // home + SpellBook.ANCIENT.register(28, new AncientTeleportPlugin(0, 0, Location.create(3087, 3495, 0))); + // paddewwa teleport + SpellBook.ANCIENT.register(20, new AncientTeleportPlugin(54, 64, Location.create(3098, 9882, 0), new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.FIRE_RUNE.getId(), 1), new Item(Runes.AIR_RUNE.getId(), 1))); + // sennisten teleport + SpellBook.ANCIENT.register(21, new AncientTeleportPlugin(60, 70, Location.create(3320, 3338, 0), new Item(Runes.SOUL_RUNE.getId(), 1), new Item(Runes.LAW_RUNE.getId(), 2))); + // karyll teleport + SpellBook.ANCIENT.register(22, new AncientTeleportPlugin(66, 76, Location.create(3493, 3472, 0), new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.BLOOD_RUNE.getId(), 1))); + // lassar teleport + SpellBook.ANCIENT.register(23, new AncientTeleportPlugin(72, 82, Location.create(3003, 3470, 0), new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.WATER_RUNE.getId(), 4))); + // dareeyak teleport + SpellBook.ANCIENT.register(24, new AncientTeleportPlugin(78, 88, Location.create(2966, 3696, 0), new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.FIRE_RUNE.getId(), 3), new Item(Runes.AIR_RUNE.getId(), 2))); + // carralangar teleport + SpellBook.ANCIENT.register(25, new AncientTeleportPlugin(84, 82, Location.create(3163, 3664, 0), new Item(Runes.SOUL_RUNE.getId(), 2), new Item(Runes.LAW_RUNE.getId(), 2))); + // annakarl teleport + SpellBook.ANCIENT.register(26, new AncientTeleportPlugin(90, 100, Location.create(3287, 3883, 0), new Item(Runes.BLOOD_RUNE.getId(), 2), new Item(Runes.LAW_RUNE.getId(), 2))); + // ghorrock teleport + SpellBook.ANCIENT.register(27, new AncientTeleportPlugin(96, 106, Location.create(2972, 3873, 0), new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.WATER_RUNE.getId(), 8))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/BakePieSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/BakePieSpell.java new file mode 100644 index 000000000..a4cedae8f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/BakePieSpell.java @@ -0,0 +1,156 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.cooking.CookableItems; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Represents the pie baking lunar spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BakePieSpell extends MagicSpell { + + /** + * Represents the animation of the spell. + */ + private static final Animation ANIMATION = Animation.create(4413); + + /** + * Represents the graphics to use. + */ + private static final Graphics GRAPHIC = new Graphics(746, (150 << 16)); + + /** + * Constructs a new {@code BakePieSpell} {@code Object}. + */ + public BakePieSpell() { + super(SpellBook.LUNAR, 65, 60, null, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 1), new Item(Runes.FIRE_RUNE.getId(), 5), new Item(Runes.WATER_RUNE.getId(), 4) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(15, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + if (!super.meetsRequirements(player, true, false)) { + return false; + } + Item foodItem = target.asItem(); + CookableItems food = null; + for (Item item : player.getInventory().toArray()) { + if (item == null) { + continue; + } + if (item.getName().toLowerCase().contains("pie") && item.getName().toLowerCase().contains("uncooked") || item.getName().toLowerCase().contains("raw")) { + food = CookableItems.forId(item.getId()); + } + } + if (food == null) { + player.getPacketDispatch().sendMessage("You need a pie in order to cast this spell."); + return false; + } + player.getPulseManager().run(new LunarPiePulse(player, foodItem, food)); + return true; + } + + /** + * Represents the skill pulse used to cook a pie. + * @author 'Vexia + */ + public final class LunarPiePulse extends SkillPulse { + + //the pie + private CookableItems pie; + + /** + * Constructs a new {@code BakePieSpell} {@code Object}. + * @param player the player. + * @param node the node. + */ + public LunarPiePulse(final Player player, final Item node, final CookableItems pie) { + super(player, node); + this.pie = pie; + } + + @Override + public boolean checkRequirements() { + if (player.getSkills().getLevel(Skills.COOKING) < pie.level) { + player.getDialogueInterpreter().sendDialogue("You need to have a Cooking level of " + pie.level + " to cook this pie."); + return false; + } + if (!player.getInventory().containsItem(new Item(pie.raw))) { + stop(); + return false; + } + return true; + } + + @Override + public void animate() { + player.animate(ANIMATION); + player.graphics(GRAPHIC); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + setDelay(5); + return false; + } + if (player.getInventory().remove(new Item(pie.raw)) && meetsRequirements(player, true, true)) { + player.getInventory().add(new Item(pie.cooked)); + } else { + return true; + } + return nextPie() == null; + } + + @Override + public void stop() { + super.stop(); + player.graphics(new Graphics(-1)); + } + + @Override + public void message(int type) { + } + + /** + * Method used to get the next pie. + * @return the pie. + */ + public CookableItems nextPie() { + for (Item item : player.getInventory().toArray()) { + if (item == null) { + continue; + } + if (item.getName().toLowerCase().contains("pie") && item.getName().toLowerCase().contains("uncooked") || item.getName().toLowerCase().contains("raw")) { + if(CookableItems.cookingMap.get(item.getId()) == null){ + pie = null; + } + pie = CookableItems.forId(item.getId()); + node = item; + } + } + return pie; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CureGroupSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CureGroupSpell.java new file mode 100644 index 000000000..0b64ac5df --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CureGroupSpell.java @@ -0,0 +1,72 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * The cure group spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CureGroupSpell extends MagicSpell { + + /** + * Represents the animation of this graphics. + */ + private static final Animation ANIMATION = new Animation(4409); + + /** + * Represents the graphic to use. + */ + private static final Graphics GRAPHIC = new Graphics(751, 130); + + /** + * Constructs a new {@code CureGroupSpell} {@code Object}. + */ + public CureGroupSpell() { + super(SpellBook.LUNAR, 74, 74, ANIMATION, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.COSMIC_RUNE.getId(), 2) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(3, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + Player p = (Player) entity; + if (!meetsRequirements(entity, true, true)) { + return false; + } + p.animate(ANIMATION); + p.graphics(GRAPHIC); + p.getStateManager().remove(EntityState.POISONED); + for (Player players : RegionManager.getLocalPlayers(p, 1)) { + Player o = (Player) players; + if (!o.isActive() || o.getLocks().isInteractionLocked()) { + continue; + } + if (!o.getSettings().isAcceptAid()) { + continue; + } + o.getStateManager().remove(EntityState.POISONED); + o.graphics(GRAPHIC); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CureMeSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CureMeSpell.java new file mode 100644 index 000000000..a34134b2c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CureMeSpell.java @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * The cure me spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CureMeSpell extends MagicSpell { + + /** + * Represents the animation of this graphics. + */ + private static final Animation ANIMATION = new Animation(4411); + + /** + * Repesents the graphick, next spells of this spell. + */ + private static final Graphics GRAPHIC = new Graphics(731, 90); + + /** + * Constructs a new {@code CureOtherSpell} {@code Object}. + */ + public CureMeSpell() { + super(SpellBook.LUNAR, 71, 69, ANIMATION, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.LAW_RUNE.getId(), 1), new Item(Runes.COSMIC_RUNE.getId(), 2) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(23, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + Player p = (Player) entity; + if (!p.getStateManager().hasState(EntityState.POISONED)) { + p.getPacketDispatch().sendMessage("You are not poisoned."); + return false; + } + if (!meetsRequirements(entity, true, true)) { + return false; + } + p.animate(ANIMATION); + p.graphics(GRAPHIC); + p.getStateManager().remove(EntityState.POISONED); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CureOtherSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CureOtherSpell.java new file mode 100644 index 000000000..d73dd1a9d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CureOtherSpell.java @@ -0,0 +1,78 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.state.EntityState; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * The cure other spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CureOtherSpell extends MagicSpell { + + /** + * Represents the animation of this graphics. + */ + private static final Animation ANIMATION = new Animation(4411); + + /** + * Repesents the graphick, next spells of this spell. + */ + private static final Graphics GRAPHIC = new Graphics(738, 130); + + /** + * Constructs a new {@code CureOtherSpell} {@code Object}. + */ + public CureOtherSpell() { + super(SpellBook.LUNAR, 68, 65, ANIMATION, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 1), new Item(Runes.LAW_RUNE.getId(), 1), new Item(Runes.EARTH_RUNE.getId(), 10) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(1, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + Player p = (Player) entity; + if (!(target instanceof Player)) { + p.getPacketDispatch().sendMessage("You can only cast this spell on other players."); + return false; + } + Player o = (Player) target; + if (!o.isActive() || o.getLocks().isInteractionLocked()) { + p.getPacketDispatch().sendMessage("This player is busy."); + return false; + } + if (!o.getSettings().isAcceptAid()) { + p.getPacketDispatch().sendMessage("The player is not accepting any aid."); + return false; + } + if (!o.getStateManager().hasState(EntityState.POISONED)) { + p.getPacketDispatch().sendMessage("This player is not poisoned."); + return false; + } + if (!meetsRequirements(entity, true, true)) { + return false; + } + p.face(o); + p.animate(ANIMATION); + o.graphics(GRAPHIC); + o.getStateManager().remove(EntityState.POISONED); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CurePlantSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CurePlantSpell.java new file mode 100644 index 000000000..d6fce7c11 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/CurePlantSpell.java @@ -0,0 +1,92 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.entity.skill.farming.FarmingPatch; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Cures a diseased plant. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class CurePlantSpell extends MagicSpell { + + /** + * Represents the animation of the spell. + */ + private final static Animation ANIMATION = Animation.create(4409); + + /** + * Represents the graphics to use. + */ + private final static Graphics GRAPHIC = new Graphics(742, 100); + + /** + * Constructs a new {@code CurePlantSpell} {@code Object}. + */ + public CurePlantSpell() { + super(SpellBook.LUNAR, 66, 60, ANIMATION, GRAPHIC, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 1), new Item(Runes.EARTH_RUNE.getId(), 8) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(32, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + if (!(target instanceof GameObject)) { + return false; + } + final GameObject object = ((GameObject) target); + /*if (FarmingPatch.forObject(object.getWrapper().getId()) == null) { + return false; + }*/ + /*final PatchWrapper wrapper = player.getFarmingManager().getPatchWrapper(object.getWrapper().getId()); + if (wrapper == null) { + player.getPacketDispatch().sendMessage("Umm... this spell won't cure that!"); + return false; + } + if (!wrapper.getCycle().getDiseaseHandler().isDiseased() && (wrapper.getCycle().getGrowthHandler().isGrowing() || wrapper.getCycle().getWaterHandler().isWatered())) { + player.getPacketDispatch().sendMessage("It is growing just fine."); + return false; + } + if (wrapper.isWeedy()) { + player.getPacketDispatch().sendMessage("The weeds are healthy enough already."); + return false; + }*/ + /*if (wrapper.isEmpty()) { + player.getPacketDispatch().sendMessage("There's nothing there to cure."); + return false; + }*/ + /*if (wrapper.getCycle().getDeathHandler().isDead()) { + player.getPacketDispatch().sendMessage("It says 'Cure' not 'Resurrect'. Although death may arise from disease, it is not in itself a disease and hence cannot be cured. So there."); + return false; + }*/ + if (!super.meetsRequirements(player, true, true)) { + return false; + } +/* + wrapper.getCycle().getDiseaseHandler().cure(player, true); +*/ + player.animate(ANIMATION); + player.graphics(GRAPHIC); + player.getSkills().addExperience(Skills.FARMING, 91.5, true); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/DreamSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/DreamSpell.java new file mode 100644 index 000000000..78e7338ef --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/DreamSpell.java @@ -0,0 +1,104 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the dream magic spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DreamSpell extends MagicSpell { + + /** + * Represents the starting animation. + */ + private static final Animation START = Animation.create(6295); + + /** + * Represents the dreaming animation. + */ + private static final Animation DREAMING = Animation.create(6296); + + /** + * Represents the end animation. + */ + private static final Animation END = Animation.create(6297); + + /** + * Represents the graphics of this spell. + */ + private static final Graphics GRAPHIC = new Graphics(1056); + + /** + * Constructs a new {@code CureOtherSpell} {@code Object}. + */ + public DreamSpell() { + super(SpellBook.LUNAR, 79, 82, null, null, null, new Item[] { new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.BODY_RUNE.getId(), 5) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(10, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player p = (Player) entity; + if (p.getSkills().getLifepoints() == p.getSkills().getStaticLevel(Skills.HITPOINTS)) { + p.getPacketDispatch().sendMessage("You already have full hitpoints."); + return false; + } + if (!meetsRequirements(entity, true, true)) { + return false; + } + p.animate(START); + p.lock(); + GameWorld.getPulser().submit(new Pulse(4, p) { + @Override + public boolean pulse() { + p.animate(DREAMING); + p.graphics(GRAPHIC); + p.unlock(); + return true; + } + + }); + p.getPulseManager().run(new Pulse(18, p) { + @Override + public boolean pulse() { + p.graphics(GRAPHIC); + p.getSkills().heal(1); + if (p.getSkills().getLifepoints() == p.getSkills().getStaticLevel(Skills.HITPOINTS)) { + stop(); + return true; + } + return false; + } + + @Override + public void stop() { + super.stop(); + p.graphics(new Graphics(-1)); + p.animate(END); + } + }); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/EnergyTransferSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/EnergyTransferSpell.java new file mode 100644 index 000000000..cce1ee35f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/EnergyTransferSpell.java @@ -0,0 +1,82 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the energy transfer spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EnergyTransferSpell extends MagicSpell { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(4411); + + /** + * Repesents the graphic, next spells of this spell. + */ + private static final Graphics GRAPHICS = new Graphics(738, 90); + + /** + * Constructs a new {@code EnergyTransferSpell} {@code Object}. + */ + public EnergyTransferSpell() { + super(SpellBook.LUNAR, 91, 100, null, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 3), new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.NATURE_RUNE.getId(), 1) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(5, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + if (!(target instanceof Player)) { + return false; + } + final Player player = ((Player) entity); + if (!super.meetsRequirements(player, true, true)) { + return false; + } + final Player o = ((Player) target); + int hp = (int) Math.floor(player.getSkills().getLifepoints() * 0.10); + int run = hp; + if (run > (100 - o.getSettings().getRunEnergy())) { + run = (int) (100 - o.getSettings().getRunEnergy()); + } + if (run < 0) { + run = 0; + } + o.getSettings().updateRunEnergy(-run); + player.getImpactHandler().manualHit(player, hp, HitsplatType.NORMAL, 2); + int energy = 100; + energy -= o.getSettings().getSpecialEnergy(); + if (energy < 0) { + energy = 0; + } + if (energy > player.getSettings().getSpecialEnergy()) { + energy = player.getSettings().getSpecialEnergy(); + } + o.getSettings().setSpecialEnergy(o.getSettings().getSpecialEnergy() + energy); + player.getSettings().setSpecialEnergy(player.getSettings().getSpecialEnergy() - energy); + player.animate(ANIMATION); + o.graphics(GRAPHICS); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/FertileSoilSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/FertileSoilSpell.java new file mode 100644 index 000000000..2ee2b743c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/FertileSoilSpell.java @@ -0,0 +1,68 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.entity.skill.farming.FarmingPatch; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the fertile soil spell plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FertileSoilSpell extends MagicSpell { + + /** + * Represents the graphic to use. + */ + private static final Graphics GRAPHIC = new Graphics(141, 96); + + /** + * Represents the animaton to use. + */ + private static final Animation ANIMATION = new Animation(722); + + /** + * Constructs a new {@code FertileSoilSpell} {@code Object}. + */ + public FertileSoilSpell() { + super(SpellBook.LUNAR, 83, 87, null, null, null, new Item[] { new Item(Runes.NATURE_RUNE.getId(), 2), new Item(Runes.ASTRAL_RUNE.getId(), 3), new Item(Runes.EARTH_RUNE.getId(), 15) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(2, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + final GameObject object = (GameObject) target; + /*if (FarmingPatch.forObject(object.getWrapper().getId()) == null) { + return false; + }*/ + /*final PatchWrapper wrapper = player.getFarmingManager().getPatchWrapper(object.getWrapper().getId()); + if (!wrapper.isEmpty() && !wrapper.getCycle().getGrowthHandler().isGrowing()) { + player.getPacketDispatch().sendMessage("You can't fertilize the patch."); + return false; + }*/ + if (!super.meetsRequirements(player, true, true)) { + return false; + } + player.graphics(GRAPHIC); + player.animate(ANIMATION); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/HealSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/HealSpell.java new file mode 100644 index 000000000..e4abd8f1f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/HealSpell.java @@ -0,0 +1,138 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +import java.util.Iterator; +import java.util.List; + +/** + * Represents the healing spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HealSpell extends MagicSpell { + + /** + * Represents the animation for this spell. + */ + private static final Animation ANIMATION = new Animation(4411); + + /** + * Represents the graphics of this spell. + */ + private static final Graphics GRAPHICS = new Graphics(738, 90); + + /** + * Represents the animation used for the group heal. + */ + private static final Animation ANIMATION_G = new Animation(1979); + + /** + * Represents the graphics used for the group heal. + */ + private static final Graphics GRAPHICS_G = new Graphics(734, 90); + + /** + * Constructs a new {@code HealSpell} {@code Object}. + */ + public HealSpell() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code HealSpell} {@code Object}. + */ + public HealSpell(int level, int experience, Item[] runes) { + super(SpellBook.LUNAR, level, experience, null, null, null, runes); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(29, new HealSpell(92, 101, new Item[] { new Item(Runes.BLOOD_RUNE.getId(), 1), new Item(Runes.LAW_RUNE.getId(), 3), new Item(Runes.ASTRAL_RUNE.getId(), 3) })); + SpellBook.LUNAR.register(30, new HealSpell(92, 101, new Item[] { new Item(Runes.BLOOD_RUNE.getId(), 3), new Item(Runes.LAW_RUNE.getId(), 6), new Item(Runes.ASTRAL_RUNE.getId(), 4) })); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = (Player) entity; + boolean group = getSpellId() == 30; + int eleven = (int) (player.getSkills().getStaticLevel(Skills.HITPOINTS) * 0.11); + if (player.getSkills().getLifepoints() < eleven) { + player.sendMessage("You need at least 11 percent of your original hitpoints in order to do this."); + return false; + } + if (!group) { + if (!(target instanceof Player)) { + return false; + } + final Player o = (Player) target; + player.face(o); + if (!o.isActive() || o.getLocks().isInteractionLocked()) { + player.getPacketDispatch().sendMessage("This player is busy."); + return false; + } + if (!o.getSettings().isAcceptAid()) { + player.getPacketDispatch().sendMessage("The player is not accepting any aid."); + return false; + } + if (o.getSkills().getLifepoints() == o.getSkills().getLevel(Skills.HITPOINTS)) { + player.getPacketDispatch().sendMessage("The player already has full hitpoints."); + return false; + } + if (!super.meetsRequirements(player, true, true)) { + return false; + } + int transfer = (int) (player.getSkills().getLifepoints() * 0.75); + player.getImpactHandler().manualHit(player, transfer, null); + o.getSkills().heal(transfer); + player.animate(ANIMATION); + o.graphics(GRAPHICS); + } else { + List players = RegionManager.getLocalPlayers(player, 1); + if (!super.meetsRequirements(player, true, true)) { + return false; + } + int percentage = (int) Math.ceil(player.getSkills().getLifepoints() * 0.75); + for (Iterator it = players.iterator(); it.hasNext();) { + Player p = it.next(); + if (p == player || !p.getSettings().isAcceptAid() || !p.isActive() || p.getSkills().getLifepoints() == p.getSkills().getMaximumLifepoints()) { + it.remove(); + } + } + if (players.isEmpty()) { + player.getPacketDispatch().sendMessage("There are no players around to replenish."); + return false; + } + if (percentage < 1) { + player.getPacketDispatch().sendMessage("You don't have enough hitpoints left to cast this spell."); + return false; + } + player.getImpactHandler().manualHit(player, percentage, HitsplatType.NORMAL); + player.animate(ANIMATION_G); + for (Player p : players) { + p.graphics(GRAPHICS_G); + p.getSkills().heal(percentage); + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/HumidifySpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/HumidifySpell.java new file mode 100644 index 000000000..9596c4f7e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/HumidifySpell.java @@ -0,0 +1,90 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the humidify spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HumidifySpell extends MagicSpell { + + /** + * Represents the animation of this graphics. + */ + private static final Animation ANIMATION = new Animation(6294); + + /** + * Repesents the graphick, next spells of this spell. + */ + private static final Graphics GRAPHIC = new Graphics(1061); + + /** + * Represents the empty vessels. + */ + private static final int[] EMPTY = { 229, 1831, 1829, 1827, 1825, 1925, 1923, 1935, 5331, 5332, 5333, 5334, 5335, 5337, 5338, 5339, 6667, 7688, 731, 1980, 434 }; + + /** + * Represents the full vessels. + */ + private static final int[] FULL = { 227, 1823, 1823, 1823, 1823, 1929, 1921, 1937, 5340, 5340, 5340, 5340, 5340, 5340, 5340, 5340, 6668, 7690, 732, 4458, 1761 }; + + /** + * Constructs a new {@code CureOtherSpell} {@code Object}. + */ + public HumidifySpell() { + super(SpellBook.LUNAR, 68, 65, ANIMATION, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 1), new Item(Runes.WATER_RUNE.getId(), 3), new Item(Runes.FIRE_RUNE.getId(), 1) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(7, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + Player p = (Player) entity; + boolean good = false; + for (int i = 0; i < EMPTY.length; i++) { + if (p.getInventory().contains(EMPTY[i], 1)) { + good = true; + break; + } + } + if (!good) { + p.sendMessage("You need something which holds water in order to do this spell."); + return false; + } + if (!super.meetsRequirements(p, true, true)) { + return false; + } + p.lock(ANIMATION.getDuration() + 1); + p.animate(ANIMATION); + p.graphics(GRAPHIC); + p.getAudioManager().send(3614); + for (int k = 0; k < 28; k++) { + for (int i = 0; i < 21; i++) { + if (p.getInventory().contains(EMPTY[i], 1)) { + if (p.getInventory().remove(new Item(EMPTY[i]))) { + p.getInventory().add(new Item(FULL[i])); + } + } + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/HunterKitSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/HunterKitSpell.java new file mode 100644 index 000000000..94da3d4b8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/HunterKitSpell.java @@ -0,0 +1,96 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.cache.def.impl.ItemDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Represents the hunter kit spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class HunterKitSpell extends MagicSpell { + + /** + * Represents the hunter kit. + */ + private static final Item KIT = new Item(11159); + + /** + * Represents the animation of this graphics. + */ + private static final Animation ANIMATION = new Animation(6303); + + /** + * Repesents the graphick, next spells of this spell. + */ + private static final Graphics GRAPHIC = new Graphics(1074); + + /** + * Constructs a new {@code CureOtherSpell} {@code Object}. + */ + public HunterKitSpell() { + super(SpellBook.LUNAR, 71, 70, null, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.EARTH_RUNE.getId(), 2) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(8, this); + ItemDefinition.forId(KIT.getId()).getHandlers().put("option:open", new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getInventory().freeSlots() < 7) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return true; + } + if (player.getInventory().remove((Item) node)) { + player.getInventory().add(new Item[] { new Item(10150), new Item(10010), new Item(10006), new Item(10031), new Item(10029), new Item(596), new Item(10008) }); + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + }); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + Player p = (Player) entity; + if (p.getInventory().freeSlots() == 0) { + p.getPacketDispatch().sendMessage("Not enough inventory space!"); + return false; + } + if (!meetsRequirements(entity, true, true)) { + return false; + } + if (p.getInventory().add(KIT)) { + p.lock(5); + p.animate(ANIMATION); + p.graphics(GRAPHIC); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/LunarTeleportPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/LunarTeleportPlugin.java new file mode 100644 index 000000000..8a6bdf0ac --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/LunarTeleportPlugin.java @@ -0,0 +1,154 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Plugin; + +/** + * Represents the plugin to handle all teleport spells. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class LunarTeleportPlugin extends MagicSpell { + + /** + * Represents the component used for group spells. + */ + private static final Component COMPONENT = new Component(326); + + /** + * Represents the location to teleport to. + */ + private Location location; + + /** + * Represents if it's a group teleport. + */ + private boolean group; + + /** + * Constructs a new {@code LunarTeleportPlugin} {@code Object}. + */ + public LunarTeleportPlugin() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code LunarTeleportPlugin} {@code Object}. + * @param level the level. + * @param experience the experience. + * @param items the items. + */ + public LunarTeleportPlugin(final int level, final double experience, final Location location, boolean group, final Item... items) { + super(SpellBook.LUNAR, level, experience, null, null, null, items); + this.location = location; + this.group = group; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = (Player) entity; + if (player.getLocks().isTeleportLocked() || !meetsRequirements(player, true, false)) { + return false; + } + player.getTeleporter().send(location.transform(0, 0, 0), getSpellId() == 16 ? TeleportType.HOME : TeleportType.LUNAR); + if (!meetsRequirements(player, true, true)) { + return false; + } + entity.setAttribute("teleport:items", super.runes); + if (group) { + String destination = "Moonclan Island"; + switch (getSpellId()) { + case 34: + destination = "Waterbirth Island"; + break; + case 35: + destination = "Barbarian outpost"; + break; + case 36: + destination = "Port Khazard"; + break; + case 37: + destination = "Fishing guild"; + break; + case 38: + destination = "Catherby"; + break; + case 39: + destination = "Ice plateau"; + break; + } + for (Player p : RegionManager.getLocalPlayers(player, 1)) { + if (p == player) { + continue; + } + if (!p.isActive() || p.getLocks().isTeleportLocked()) { + player.getPacketDispatch().sendMessage("The other player is currently busy."); + continue; + } + if (!p.getSettings().isAcceptAid()) { + player.getPacketDispatch().sendMessage("The player is not accepting any aid."); + continue; + } + visualize(entity, p); + p.setAttribute("t-o_location", location); + p.getPacketDispatch().sendString(player.getUsername(), 326, 1); + p.getPacketDispatch().sendString(destination, 326, 3); + p.getInterfaceManager().open(COMPONENT); + } + } + return true; + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + // home + SpellBook.LUNAR.register(16, new LunarTeleportPlugin(0, 0, Location.create(2100, 3914, 0), false)); + // moonclan teleport + SpellBook.LUNAR.register(20, new LunarTeleportPlugin(69, 66, Location.create(2111, 3916, 0), false, new Item(Runes.LAW_RUNE.getId(), 1), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.EARTH_RUNE.getId(), 2))); + // moonclan group teleport + SpellBook.LUNAR.register(33, new LunarTeleportPlugin(70, 67, Location.create(2111, 3916, 0), true, new Item(Runes.LAW_RUNE.getId(), 1), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.EARTH_RUNE.getId(), 4))); + // ourina teleport + SpellBook.LUNAR.register(31, new LunarTeleportPlugin(71, 69, Location.create(2469, 3247, 0), false, new Item(Runes.LAW_RUNE.getId(), 1), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.EARTH_RUNE.getId(), 6))); + // waterbirth teleport + SpellBook.LUNAR.register(24, new LunarTeleportPlugin(72, 71, Location.create(2527, 3739, 0), false, new Item(Runes.LAW_RUNE.getId(), 1), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.WATER_RUNE.getId(), 1))); + // waterbirth group teleport + SpellBook.LUNAR.register(34, new LunarTeleportPlugin(73, 72, Location.create(2527, 3739, 0), true, new Item(Runes.LAW_RUNE.getId(), 1), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.WATER_RUNE.getId(), 5))); + // barbarian post teleport. + SpellBook.LUNAR.register(0, new LunarTeleportPlugin(75, 76, Location.create(2544, 3572, 0), false, new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.FIRE_RUNE.getId(), 3))); + // barbarian group teleport + SpellBook.LUNAR.register(35, new LunarTeleportPlugin(77, 77, Location.create(2544, 3572, 0), true, new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.FIRE_RUNE.getId(), 6))); + // khzard teleport + SpellBook.LUNAR.register(18, new LunarTeleportPlugin(78, 80, Location.create(2656, 3157, 0), false, new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.WATER_RUNE.getId(), 4))); + // khzard group teleport + SpellBook.LUNAR.register(36, new LunarTeleportPlugin(79, 81, Location.create(2656, 3157, 0), true, new Item(Runes.LAW_RUNE.getId(), 2), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.WATER_RUNE.getId(), 8))); + // fishing guild teleport + SpellBook.LUNAR.register(17, new LunarTeleportPlugin(85, 89, Location.create(2611, 3393, 0), false, new Item(Runes.LAW_RUNE.getId(), 3), new Item(Runes.ASTRAL_RUNE.getId(), 3), new Item(Runes.WATER_RUNE.getId(), 10))); + // fishing guild group teleport + SpellBook.LUNAR.register(37, new LunarTeleportPlugin(86, 90, Location.create(2611, 3393, 0), true, new Item(Runes.LAW_RUNE.getId(), 3), new Item(Runes.ASTRAL_RUNE.getId(), 3), new Item(Runes.WATER_RUNE.getId(), 14))); + // catherby teleport + SpellBook.LUNAR.register(21, new LunarTeleportPlugin(87, 92, Location.create(2804, 3433, 0), false, new Item(Runes.LAW_RUNE.getId(), 3), new Item(Runes.ASTRAL_RUNE.getId(), 3), new Item(Runes.WATER_RUNE.getId(), 10))); + // catherby group teleport + SpellBook.LUNAR.register(38, new LunarTeleportPlugin(88, 93, Location.create(2804, 3433, 0), true, new Item(Runes.LAW_RUNE.getId(), 3), new Item(Runes.ASTRAL_RUNE.getId(), 3), new Item(Runes.WATER_RUNE.getId(), 12))); + // ice plateua teleport + SpellBook.LUNAR.register(28, new LunarTeleportPlugin(89, 96, Location.create(2972, 3873, 0), false, new Item(Runes.LAW_RUNE.getId(), 3), new Item(Runes.ASTRAL_RUNE.getId(), 3), new Item(Runes.WATER_RUNE.getId(), 8))); + // ice plateua group teleport + SpellBook.LUNAR.register(39, new LunarTeleportPlugin(90, 99, Location.create(2972, 3873, 0), true, new Item(Runes.LAW_RUNE.getId(), 3), new Item(Runes.ASTRAL_RUNE.getId(), 3), new Item(Runes.WATER_RUNE.getId(), 16))); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/MagicImbueSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/MagicImbueSpell.java new file mode 100644 index 000000000..f93138a61 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/MagicImbueSpell.java @@ -0,0 +1,67 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * The magic imbue spell. + * @author 'Vexia + */ +@Initializable +public class MagicImbueSpell extends MagicSpell { + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(141, 96); + + /** + * The animation. + */ + private static final Animation ANIMATION = new Animation(722); + + /** + * Constructs a new {@code StatRestoreSpell} {@code Object}. + */ + public MagicImbueSpell() { + super(SpellBook.LUNAR, 82, 86, null, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.FIRE_RUNE.getId(), 7), new Item(Runes.WATER_RUNE.getId(), 7) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(13, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + if (player == null) { + return false; + } + if (player.getAttribute("spell:imbue", 0) > GameWorld.getTicks()) { + player.sendMessage("You already have this activated."); + return false; + } + if (!super.meetsRequirements(player, true, true)) { + return false; + } + player.setAttribute("spell:imbue", GameWorld.getTicks() + 20); + player.lock(ANIMATION.getDuration() + 1); + player.graphics(GRAPHIC); + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You are charged to combine runes!"); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/MonsterExamineSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/MonsterExamineSpell.java new file mode 100644 index 000000000..60aee9d32 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/MonsterExamineSpell.java @@ -0,0 +1,93 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Represents the monster examine spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class MonsterExamineSpell extends MagicSpell { + + /** + * Represents the animation of this spell. + */ + private final static Animation ANIMATION = new Animation(6293); + + /** + * Repesents the graphics of this spell. + */ + private static final Graphics GRAPHIC = new Graphics(738, 130); + + /** + * Represents the graphics of the eye. + */ + private static final Graphics EYE = new Graphics(1059); + + /** + * Represents the animation of the spell. + */ + private static final Component COMPONENT = new Component(522); + + /** + * Constructs a new {@code CurePlantSpell} {@code Object}. + */ + public MonsterExamineSpell() { + super(SpellBook.LUNAR, 66, 61, ANIMATION, null, null, new Item[] { new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.ASTRAL_RUNE.getId(), 1), new Item(Runes.MIND_RUNE.getId(), 1) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(6, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + if (!(target instanceof NPC)) { + player.getPacketDispatch().sendMessage("You can only cast this spell on monsters."); + return false; + } + if (!super.meetsRequirements(player, true, true)) { + return false; + } + final NPC npc = ((NPC) target); + player.animate(ANIMATION); + player.face(npc); + player.getAudioManager().send(3621); + ; + COMPONENT.setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + player.getInterfaceManager().restoreTabs(); + return true; + } + }); + player.graphics(EYE); + npc.graphics(GRAPHIC); + npc.getSkills().updateCombatLevel(); + player.getPacketDispatch().sendString("Monster name: " + npc.getName(), 522, 0); + player.getPacketDispatch().sendString("Combat level: " + npc.getDefinition().getCombatLevel(), 522, 1); + player.getPacketDispatch().sendString("Life points: " + npc.getSkills().getMaximumLifepoints(), 522, 2); + player.getPacketDispatch().sendString("Creature's max hit: " + npc.getSwingHandler(false).calculateHit(npc, npc, 1.0), 522, 3); + player.getPacketDispatch().sendString("", 522, 4); + player.getInterfaceManager().openSingleTab(COMPONENT); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/NPContactSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/NPContactSpell.java new file mode 100644 index 000000000..a0a25b7e5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/NPContactSpell.java @@ -0,0 +1,183 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.component.Component; +import core.game.component.ComponentPlugin; +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the npc contact spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class NPContactSpell extends MagicSpell { + + /** + * Represents the animation of this graphics. + */ + private static final Animation ANIMATION = new Animation(4413); + + /** + * Represents the graphhcics of the spell. + */ + private static final Graphics GRAPHIC = new Graphics(730, 130); + + /** + * Constructs a new {@code CurePlantSpell} {@code Object}. + */ + public NPContactSpell() { + super(SpellBook.LUNAR, 67, 63, ANIMATION, GRAPHIC, null, new Item[] { new Item(Runes.COSMIC_RUNE.getId(), 1), new Item(Runes.ASTRAL_RUNE.getId(), 1), new Item(Runes.AIR_RUNE.getId(), 2) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(4, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + final Component component = new Component(429); + if (meetsRequirements(player, true, true)) { + player.getInterfaceManager().open(component); + component.setPlugin(new ComponentPlugin() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 51: + player.getInterfaceManager().close(); + break; + default: + NPCContact contact = NPCContact.forId(button); + if (contact == NPCContact.RANDOM) { + contact = NPCContact.values()[RandomFunction.random(NPCContact.values().length)]; + } + if (contact == null) { + return true; + } + if (player.getDialogueInterpreter().open(contact.getNpc(), contact.getNpc())) { + player.animate(ANIMATION); + player.graphics(GRAPHIC); + player.getAudioManager().send(3618); + player.getInterfaceManager().close(); + } else { + player.getPacketDispatch().sendMessage("This npc is unable to be contacted at this moment."); + } + return true; + } + return true; + } + + }); + return true; + } + return false; + } + + /** + * Represents the npc's to contact. + * @author 'Vexia + */ + public enum NPCContact { + HONEST_JIMM(10, 4362), + BERT_THE_SANDMAN(11, 3108), + ADVISOR_GHRIM(12, 1375), + TURAEL(13, 8273), + LANTHUS(17, 1526), + SUMONA(27, 7780), + MAZCHNA(18, 8274), + DURADEL(23, 8275), + VANNAKA(28, 1597), + MURPHY(30, 466), + CHAELDAR(29, 1598), + CYRISUS(32, 5893), + LARRY(34, 5425), + RANDOM(35, -1); + + /** + * Constructs a new {@code NPContactSpell} {@code Object}. + * @param button the button. + * @param npc the npc. + */ + NPCContact(int button, int npc) { + this.button = button; + this.npc = npc; + } + + /** + * Represents the button of the npc to contact. + */ + private int button; + + /** + * Represents the npc to contact. + */ + private int npc; + + /** + * Gets the button. + * @return The button. + */ + public int getButton() { + return button; + } + + /** + * Sets the button. + * @param button The button to set. + */ + public void setButton(int button) { + this.button = button; + } + + /** + * Gets the npc. + * @return The npc. + */ + public int getNpc() { + return npc; + } + + /** + * Sets the npc. + * @param npc The npc to set. + */ + public void setNpc(int npc) { + this.npc = npc; + } + + /** + * Gets the npc. + * @param id the id. + * @return the npc contact. + */ + public static NPCContact forId(int id) { + for (NPCContact npc : NPCContact.values()) { + if (npc.getButton() == id) { + return npc; + } + } + return null; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/PlankMeSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/PlankMeSpell.java new file mode 100644 index 000000000..c60e4ca4d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/PlankMeSpell.java @@ -0,0 +1,185 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.repository.Repository; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Turns one log into a plank, without need of the sawmill. Coins are still + * required to convert a log into a plank, but the amount is decreased. + * @author 'Vexia + */ +@Initializable +public class PlankMeSpell extends MagicSpell { + + /** + * The graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1063, 120); + + /** + * The animation. + */ + private static final Animation ANIMATION = new Animation(6298); + + /** + * Constructs a new {@code StatRestoreSpell} {@code Object}. + */ + public PlankMeSpell() { + super(SpellBook.LUNAR, 86, 90, null, null, null, new Item[] { new Item(Runes.NATURE_RUNE.getId(), 1), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.EARTH_RUNE.getId(), 15) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(11, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + final Plank plank = Plank.forLog(((Item) target)); + player.getInterfaceManager().setViewedTab(6); + final Item item = ((Item) target); + if (plank == null) { + player.getPacketDispatch().sendMessage("You need to use this spell on logs."); + return false; + } + if (!player.getInventory().contains(995, plank.getPrice())) { + player.getPacketDispatch().sendMessage("You need " + plank.getPrice() + " coins to convert that log into a plank."); + return false; + } + player.lock(4); + create(player, plank, player.getInventory().getAmount(item)); + return true; + } + + /** + * Method used to create a plank from a log. + * @param player the player. + * @param plank the plank. + * @param amount the amount. + */ + public final void create(final Player player, final Plank plank, int amount) { + player.getInterfaceManager().close(); + if (amount > player.getInventory().getAmount(plank.getLog())) { + amount = player.getInventory().getAmount(plank.getLog()); + } + if (!player.getInventory().containsItem(plank.getLog())) { + player.getDialogueInterpreter().sendDialogues(Repository.findNPC(4250), null, "You'll need to bring me some more logs."); + return; + } + int newAmt = 1; + for (int i = 1; i <= amount; i++) { + if (player.getInventory().contains(995, plank.getPrice() * amount)) { + newAmt = i; + continue; + } + } + amount = newAmt; + if (!player.getInventory().contains(995, plank.getPrice() * amount)) { + player.getDialogueInterpreter().sendDialogues(player, null, "Sorry, I don't have enough coins to pay for that."); + return; + } + if (!player.getInventory().contains(plank.getLog().getId(), amount)) { + return; + } + Item coins = new Item(995, plank.getPrice() * amount); + if (!player.getInventory().containsItem(coins)) { + return; + } + if (super.meetsRequirements(player, true, true)) { + player.graphics(GRAPHIC); + player.animate(ANIMATION); + if (player.getInventory().remove(coins)) { + Item remove = plank.getLog(); + remove.setAmount(amount); + if (player.getInventory().remove(remove)) { + Item planks = plank.getPlank(); + planks.setAmount(amount); + player.getInventory().add(planks); + } + } + } + } + + /** + * Represents an enum of planks to be boughten. + * @author 'Vexia + * @date Oct 8, 2013 + */ + public enum Plank { + WOOD(new Item(1511), new Item(960), 70), OAK(new Item(1521), new Item(8778), 175), TEAK(new Item(6333), new Item(8780), 350), MAHOGANY(new Item(6332), new Item(8782), 1050); + /** + * Constructs a new {@code SawmillPlankInterface} {@code Object}. + * @param log the log. + * @param plank the plank. + * @param price the price. + */ + Plank(Item log, Item plank, int price) { + this.log = log; + this.plank = plank; + this.price = price; + } + + /** + * Represents the item needed. + */ + private final Item log; + + /** + * Represents the item given. + */ + private final Item plank; + + /** + * Represents the price of the plank. + */ + private final int price; + + /** + * Gets the plank. + * @param item the item. + * @return the plank. + */ + public static Plank forLog(final Item item) { + for (Plank p : Plank.values()) { + if (p.getLog().getId() == item.getId()) { + return p; + } + } + return null; + } + + /** + * @return the log. + */ + public Item getLog() { + return log; + } + + /** + * @return the plank. + */ + public Item getPlank() { + return plank; + } + + /** + * @return the price. + */ + public int getPrice() { + return price; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/SpellbookSwapSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/SpellbookSwapSpell.java new file mode 100644 index 000000000..158c27011 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/SpellbookSwapSpell.java @@ -0,0 +1,84 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.component.Component; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * The spellbook swap spell. + * @author 'Vexia + */ +@Initializable +public class SpellbookSwapSpell extends MagicSpell { + + /** + * Represents the animation of this spell. + */ + private final Animation ANIMATION = new Animation(6299); + + /** + * Represents the graphics of this spell. + */ + private final Graphics GRAPHIC = new Graphics(1062); + + /** + * Constructs a new {@code SpellbookSwapSpell} {@code Object}. + */ + public SpellbookSwapSpell() { + super(SpellBook.LUNAR, 96, 130, null, null, null, new Item[] { new Item(Runes.LAW_RUNE.getId(), 1), new Item(Runes.COSMIC_RUNE.getId(), 2), new Item(Runes.ASTRAL_RUNE.getId(), 3) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(12, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = (Player) entity; + if (!super.meetsRequirements(player, true, true)) { + return false; + } + player.lock(9); + player.animate(ANIMATION); + player.graphics(GRAPHIC); + player.getDialogueInterpreter().open(3264731); + final int id = RandomFunction.random(1, 500000); + player.setAttribute("spell:swap", id); + GameWorld.getPulser().submit(new Pulse(20, player) { + @Override + public boolean pulse() { + if (player.getAttribute("spell:swap", 0) == id) { + removeTemporarySpell(player); + } + return true; + } + + }); + return true; + } + + /** + * Method used to remove the temp spell swap. + * @param player the player. + */ + public static void removeTemporarySpell(final Player player) { + player.removeAttribute("spell:swap"); + player.getSpellBookManager().setSpellBook(SpellBook.LUNAR); + player.getInterfaceManager().openTab(new Component(SpellBook.LUNAR.getInterfaceId())); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StatBoostSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StatBoostSpell.java new file mode 100644 index 000000000..0578bc2f0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StatBoostSpell.java @@ -0,0 +1,93 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.content.consumable.Consumables; +import core.game.content.consumable.Potion; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import plugin.ai.AIPlayer; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.util.List; + +@Initializable +public final class StatBoostSpell extends MagicSpell { + + private static final Animation ANIMATION = new Animation(4413); + private static final Graphics GRAPHICS = new Graphics(733, 130); + public static final int VIAL = 229; + public StatBoostSpell() { + super(SpellBook.LUNAR, 84, 88, null, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 3), new Item(Runes.EARTH_RUNE.getId(), 12), new Item(Runes.WATER_RUNE.getId(), 10) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(26, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + Item item = ((Item) target); + final Potion potion = (Potion) Consumables.getConsumableById(item.getId()); + player.getInterfaceManager().setViewedTab(6); + if (potion == null) { + player.getPacketDispatch().sendMessage("For use of this spell use only one a potion."); + return false; + } + if (!item.getDefinition().isTradeable() || item.getName().toLowerCase().contains("restore") || item.getName().toLowerCase().contains("zamorak") || item.getName().toLowerCase().contains("saradomin") || item.getName().toLowerCase().contains("combat")) { + player.getPacketDispatch().sendMessage("You can't cast this spell on that item."); + return false; + } + List pl = RegionManager.getLocalPlayers(player, 1); + int plSize = pl.size() - 1; + int doses = potion.getDose(item); + if (plSize > doses) { + player.getPacketDispatch().sendMessage("You don't have enough doses."); + return false; + } + if (doses > plSize) { + doses = plSize; + } + if (pl.size() == 0) { + return false; + } + if (!super.meetsRequirements(player, true, false)) { + return false; + } + int size = 1; + for (Player players : pl) { + Player o = (Player) players; + if (!o.isActive() || o.getLocks().isInteractionLocked() || o == player) { + continue; + } + if (!o.getSettings().isAcceptAid() && !(o instanceof AIPlayer)) { + continue; + } + o.graphics(GRAPHICS); + potion.getEffect().activate(o); + size++; + } + if (size == 1) { + player.getPacketDispatch().sendMessage("There is nobody around that has accept aid on to share the potion with you."); + return false; + } + super.meetsRequirements(player, true, true); + potion.getEffect().activate(player); + player.animate(ANIMATION); + player.graphics(GRAPHICS); + player.getInventory().remove(item); + player.getInventory().add(new Item(potion.getIds()[size - 1])); + return true; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StatRestoreSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StatRestoreSpell.java new file mode 100644 index 000000000..c71fffb89 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StatRestoreSpell.java @@ -0,0 +1,105 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.content.consumable.Consumables; +import core.game.content.consumable.Potion; +import core.plugin.Initializable; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import plugin.ai.AIPlayer; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +import java.util.List; + +@Initializable +public class StatRestoreSpell extends MagicSpell { + + private static final Animation ANIMATION = new Animation(4413); + private static final Graphics GRAPHICS = new Graphics(733, 130); + + private static final int[] IDS = new int[] { 2430, 127, 129, 131, 3024, 3026, 3028, 3030 }; + + public StatRestoreSpell() { + super(SpellBook.LUNAR, 81, 84, null, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.EARTH_RUNE.getId(), 10), new Item(Runes.WATER_RUNE.getId(), 10) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(27, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + Item item = ((Item) target); + final Potion potion = (Potion) Consumables.getConsumableById(item.getId()); + player.getInterfaceManager().setViewedTab(6); + if (potion == null) { + player.getPacketDispatch().sendMessage("For use of this spell use only one a potion."); + return false; + } + if (!item.getDefinition().isTradeable() || !isRestore(item.getId())) { + player.getPacketDispatch().sendMessage("You can't cast this spell on that item."); + return false; + } + List pl = RegionManager.getLocalPlayers(player, 1); + int plSize = pl.size() - 1; + int doses = potion.getDose(item); + if (plSize > doses) { + player.getPacketDispatch().sendMessage("You don't have enough doses."); + return false; + } + if (doses > plSize) { + doses = plSize; + } + if (pl.size() == 0) { + return false; + } + if (!super.meetsRequirements(player, true, false)) { + return false; + } + int size = 1; + for (Player players : pl) { + Player o = (Player) players; + if (!o.isActive() || o.getLocks().isInteractionLocked() || o == player) { + continue; + } + if (!o.getSettings().isAcceptAid() && !(o instanceof AIPlayer)) { + continue; + } + o.graphics(GRAPHICS); + potion.getEffect().activate(o); + size++; + } + if (size == 1) { + player.getPacketDispatch().sendMessage("There is nobody around that has accept aid on to share the potion with you."); + return false; + } + super.meetsRequirements(player, true, true); + potion.getEffect().activate(player); + player.animate(ANIMATION); + player.graphics(GRAPHICS); + player.getInventory().remove(item); + player.getInventory().add(new Item(potion.getIds()[size - 1])); + return true; + } + + private boolean isRestore(int id) { + for (int i : IDS) { + if (i == id) { + return true; + } + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StatSpySpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StatSpySpell.java new file mode 100644 index 000000000..ddd4236c3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StatSpySpell.java @@ -0,0 +1,96 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * The stat spy spell. + * @author 'Vexia + */ +@Initializable +public final class StatSpySpell extends MagicSpell { + + /** + * Represents the animation of this spell. + */ + private final static Animation ANIMATION = new Animation(6293); + + /** + * Repesents the graphics of this spell. + */ + private static final Graphics GRAPHIC = new Graphics(734, 120); + + /** + * Represents the graphics. + */ + private static final Graphics EYE = new Graphics(1059); + + /** + * Represents the component. + */ + private static final Component COMPONENT = new Component(523); + + /** + * Represents the array of skills. + */ + private static int[][] SKILLS = { { Skills.ATTACK, 1, 2 }, { Skills.HITPOINTS, 5, 6 }, { Skills.MINING, 9, 10 }, { Skills.STRENGTH, 13, 14 }, { Skills.AGILITY, 17, 18 }, { Skills.SMITHING, 21, 22 }, { Skills.DEFENCE, 25, 26 }, { Skills.HERBLORE, 29, 30 }, { Skills.FISHING, 33, 34 }, { Skills.RANGE, 37, 38 }, { Skills.THIEVING, 41, 42 }, { Skills.COOKING, 45, 46 }, { Skills.PRAYER, 49, 50 }, { Skills.CRAFTING, 53, 54 }, { Skills.FIREMAKING, 57, 58 }, { Skills.MAGIC, 61, 62 }, { Skills.FLETCHING, 65, 66 }, { Skills.WOODCUTTING, 69, 70 }, { Skills.RUNECRAFTING, 73, 74 }, { Skills.SLAYER, 77, 78 }, { Skills.FARMING, 81, 82 }, { Skills.CONSTRUCTION, 85, 86 }, { Skills.HUNTER, 89, 90 }, { Skills.SUMMONING, 93, 94 } }; + + /** + * Constructs a new {@code CureOtherSpell} {@code Object}. + */ + public StatSpySpell() { + super(SpellBook.LUNAR, 75, 76, ANIMATION, null, null, new Item[] { new Item(Runes.COSMIC_RUNE.getId(), 2), new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.BODY_RUNE.getId(), 5) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(9, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + if (!(target instanceof Player)) { + player.getPacketDispatch().sendMessage("You can only cast this spell on players."); + return false; + } + if (super.meetsRequirements(player, true, true)) { + final Player o = ((Player) target); + player.animate(ANIMATION); + player.face(o); + player.getAudioManager().send(3620); + COMPONENT.setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + player.getInterfaceManager().restoreTabs(); + return true; + } + }); + player.graphics(EYE); + o.graphics(GRAPHIC); + for (int[] element : SKILLS) { + player.getPacketDispatch().sendString("" + o.getSkills().getLevel(element[0]) + "", 523, element[1]); + player.getPacketDispatch().sendString("" + o.getSkills().getStaticLevel(element[0]) + "", 523, element[2]); + } + player.getPacketDispatch().sendString((o.getUsername()), 523, 99); + player.getInterfaceManager().openSingleTab(COMPONENT); + return true; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StringJewellerySpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StringJewellerySpell.java new file mode 100644 index 000000000..50aaeafcd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/StringJewellerySpell.java @@ -0,0 +1,164 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the jewllery stringing spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class StringJewellerySpell extends MagicSpell { + + /** + * Represents the animation of this spell. + */ + private static final Animation ANIMATION = Animation.create(4412); + + /** + * Represents the graphic of this spell. + */ + private static final Graphics GRAPHIC = new Graphics(728, 100); + + /** + * Represents the array of unstrung jewellery. + */ + private static final int[] UNSTRUNG = { 1673, 1675, 1677, 1679, 1681, 1683, 1714 }; + + /** + * Represents an array of strung jewellery. + */ + private static final int[] STRUNG = { 1692, 1694, 1696, 1698, 1700, 1702, 1718 }; + + /** + * Constructs a new {@code CureOtherSpell} {@code Object}. + */ + public StringJewellerySpell() { + super(SpellBook.LUNAR, 80, 87, null, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.EARTH_RUNE.getId(), 10), new Item(Runes.WATER_RUNE.getId(), 5) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(22, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player p = (Player) entity; + boolean contains = false; + Item item = null; + for (int i : UNSTRUNG) { + if (p.getInventory().contains(i, 1)) { + contains = true; + item = new Item(i); + break; + } + } + if (!contains) { + p.getPacketDispatch().sendMessage("You need jewellery in order to use this spell."); + return false; + } + if (!meetsRequirements(entity, true, false)) { + return false; + } + p.getPulseManager().run(new LunarStringPulse(p, item)); + return true; + } + + /** + * Represents the skill pulse used to string a jewellery. + * @author 'Vexia + */ + public class LunarStringPulse extends SkillPulse { + + /** + * Constructs a new {@code LunarStringPulse} {@code Object}. + * @param player the player. + * @param node the node. + */ + public LunarStringPulse(final Player player, final Item node) { + super(player, node); + } + + @Override + public boolean checkRequirements() { + if (!player.getInventory().containsItem(node)) { + stop(); + return false; + } + return true; + } + + @Override + public void animate() { + player.animate(ANIMATION); + player.graphics(GRAPHIC); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + setDelay(2); + return false; + } + if (meetsRequirements(player, true, true) && player.getInventory().remove(node)) { + player.getInventory().add(new Item(STRUNG[getIndex()])); + player.getSkills().addExperience(Skills.CRAFTING, 4, true); + player.getSkills().addExperience(Skills.CRAFTING, 87, true); + } else { + return true; + } + return nextItem() == null; + } + + @Override + public void stop() { + super.stop(); + player.graphics(new Graphics(-1)); + } + + @Override + public void message(int type) { + } + + /** + * Method used to get index. + * @return the index. + */ + public int getIndex() { + for (int i = 0; i < UNSTRUNG.length; i++) { + if (node.getId() == UNSTRUNG[i]) { + return i; + } + } + return -1; + } + + /** + * Method used to get the next string. + * @return the string. + */ + public Item nextItem() { + for (int i : UNSTRUNG) { + if (player.getInventory().contains(i, 1)) { + node = new Item(i); + } + } + return node; + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/SuperglassMakeSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/SuperglassMakeSpell.java new file mode 100644 index 000000000..8b20e1506 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/SuperglassMakeSpell.java @@ -0,0 +1,115 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * The super glass make spell. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public class SuperglassMakeSpell extends MagicSpell { + + /** + * Represents the animation of this spell. + */ + private static final Animation ANIMATION = Animation.create(4413); + + /** + * Represents the graphics of this spell. + */ + private static final Graphics GRAPHIC = new Graphics(729, 120); + + /** + * Represents the bucket of sand item. + */ + private static final Item BUCKET_OF_SAND = new Item(1783); + + /** + * Represents the molten glass item. + */ + private static final Item MOLTEN_GLASS = new Item(1775); + + /** + * The set of items to be used with sand. + */ + private static final Item[] SETS = new Item[] { new Item(1781), new Item(401), new Item(10978) }; + + /** + * Constructs a new {@code SuperglassMakeSpell} {@code Object}. + */ + public SuperglassMakeSpell() { + super(SpellBook.LUNAR, 77, 78, null, null, null, new Item[] { new Item(Runes.ASTRAL_RUNE.getId(), 2), new Item(Runes.FIRE_RUNE.getId(), 6), new Item(Runes.AIR_RUNE.getId(), 10) }); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + SpellBook.LUNAR.register(25, this); + return this; + } + + @Override + public boolean cast(Entity entity, Node target) { + final Player player = ((Player) entity); + int setIndex = getSetIndex(player); + int sand = player.getInventory().getAmount(BUCKET_OF_SAND); + if (setIndex == -1) { + player.getPacketDispatch().sendMessage("You don't have the required ingredients."); + return false; + } + if (!super.meetsRequirements(player, true, true)) { + return false; + } + player.lock(4); + player.graphics(GRAPHIC); + player.animate(ANIMATION); + for (int i = 0; i < sand; i++) { + if (hasSet(player, setIndex)) { + if (player.getInventory().remove(BUCKET_OF_SAND, SETS[setIndex])) { + player.getInventory().add(MOLTEN_GLASS); + player.getSkills().addExperience(Skills.CRAFTING, 10, true); + } + } + } + return true; + } + + /** + * Checks if the player has the set. + * @param player the player. + * @param index the index. + * @return {@code True} if so. + */ + public boolean hasSet(final Player player, final int index) { + return player.getInventory().containsItem(BUCKET_OF_SAND) && player.getInventory().containsItem(SETS[index]); + } + + /** + * Gets the set index. + * @param player the player. + * @return the index.s + */ + public int getSetIndex(final Player player) { + if (!player.getInventory().containsItem(BUCKET_OF_SAND)) { + return -1; + } + for (int i = 0; i < SETS.length; i++) { + if (player.getInventory().containsItem(SETS[i])) { + return i; + } + } + return -1; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/VengeanceSpell.java b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/VengeanceSpell.java new file mode 100644 index 000000000..3373bfa67 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/magic/lunar/VengeanceSpell.java @@ -0,0 +1,88 @@ +package core.game.node.entity.skill.magic.lunar; + +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.magic.Runes; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.equipment.SpellType; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the vengeance (other) spell. + * @author Emperor + */ +@Initializable +public final class VengeanceSpell extends MagicSpell { + + /** + * Constructs a new {@code VengeanceSpell} {@code Object}. + */ + public VengeanceSpell() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code VengeanceSpell} {@code Object}. + * @param level The level required. + * @param experience The experience gained from casting this spell. + * @param anim The cast animation. + * @param graphic The graphics. + * @param runes The runes required. + */ + public VengeanceSpell(int level, double experience, Animation anim, Graphics graphic, Item... runes) { + super(SpellBook.LUNAR, level, experience, anim, graphic, null, runes); + } + + @Override + public Plugin newInstance(SpellType arg) throws Throwable { + // Vengeance other + SpellBook.LUNAR.register(19, new VengeanceSpell(93, 78, Animation.create(4411), new Graphics(725, 96), Runes.ASTRAL_RUNE.getItem(3), Runes.DEATH_RUNE.getItem(2), Runes.EARTH_RUNE.getItem(10))); + // Vengeance + SpellBook.LUNAR.register(14, new VengeanceSpell(94, 112, Animation.create(4410), new Graphics(726, 96), Runes.ASTRAL_RUNE.getItem(4), Runes.DEATH_RUNE.getItem(2), Runes.EARTH_RUNE.getItem(10))); + return this; + } + + @Override + public void visualize(Entity entity, Node target) { + entity.animate(animation); + ((Entity) target).graphics(graphic); + } + + @Override + public boolean cast(Entity entity, Node target) { + int ticks = GameWorld.getTicks(); + boolean vengOther = spellId == 19; + if (entity.getAttribute("vengeance_delay", -1) > ticks) { + ((Player) entity).getPacketDispatch().sendMessage("You can only cast vengeance spells once every 30 seconds."); + return false; + } + if (vengOther && (target == null || !(target instanceof Player))) { + return false; + } + Player p = (Player) (vengOther ? target : entity); + if (vengOther) { + if (!p.getSettings().isAcceptAid()) { + ((Player) entity).getPacketDispatch().sendMessage("The player is not accepting any aid."); + return false; + } + } + if (!meetsRequirements(entity, true, true)) { + return false; + } + visualize(entity, p); + entity.setAttribute("vengeance_delay", ticks + 50); + p.setAttribute("vengeance", true); + p.getAudioManager().send(vengOther ? 2907 : 2908); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/package-info.java b/Server/src/main/java/Server/core/game/node/entity/skill/package-info.java new file mode 100644 index 000000000..b39254204 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/package-info.java @@ -0,0 +1,7 @@ +/** + * Holds skill-related plugins. + * + * @author Emperor + * + */ +package core.game.node.entity.skill; \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/prayer/BoneBuryingOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/prayer/BoneBuryingOptionPlugin.java new file mode 100644 index 000000000..af1997f34 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/prayer/BoneBuryingOptionPlugin.java @@ -0,0 +1,84 @@ +package core.game.node.entity.skill.prayer; + +import core.cache.def.impl.ItemDefinition; +import core.game.content.global.Bones; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Represents the bone bury option plugin. + * @author Vexia + */ +@Initializable +public final class BoneBuryingOptionPlugin extends OptionHandler { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(827); + + /** + * Represents the sound to use. + */ + private static final Audio SOUND = new Audio(2738, 10, 1); + + @Override + public boolean handle(final Player player, Node node, String option) { + if (player.getAttribute("delay:bury", -1) > GameWorld.getTicks()) { + return true; + } + player.setAttribute("delay:bury", GameWorld.getTicks() + 2); + final Item item = (Item) node; + Bones bone = Bones.forId(item.getId()); + if (bone == null) { + bone = Bones.BONES; + } + if (item.getSlot() < 0) { + return false; + } + boolean remove = true; + if (!remove) { + player.sendMessage("The gods intervene and you keep your bones!"); + } + if (remove) { + if (player.getInventory().replace(null, item.getSlot()) != item) { + return false; + } + } + player.lock(2); + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You dig a hole in the ground..."); + player.getAudioManager().send(SOUND); + final Bones bonee = bone; + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.getPacketDispatch().sendMessage("You bury the bones."); + player.getSkills().addExperience(Skills.PRAYER, bonee.equals(Bones.LAVA_DRAGON_BONES) && player.getLocation().getY() >= 3794 && player.getLocation().getY() <= 3859 ? bonee.getExperience() * 3 : bonee.getExperience(), true); + return true; + } + }); + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("bury", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/prayer/PrayerAltarPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/prayer/PrayerAltarPlugin.java new file mode 100644 index 000000000..ece634902 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/prayer/PrayerAltarPlugin.java @@ -0,0 +1,274 @@ +package core.game.node.entity.skill.prayer; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.plugin.Initializable; +import core.game.node.entity.skill.SkillRestoration; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the praying at an alter. + * @author Vexia + */ +@Initializable +public class PrayerAltarPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("pray-at", this); + ObjectDefinition.setOptionHandler("pray", this); + ObjectDefinition.forId(61).getHandlers().put("option:check", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (option.equalsIgnoreCase("check")) { + final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal"); + if (quest.getStage(player) == 70) { + player.getDialogueInterpreter().sendDialogue("You find a small inscription at the bottom of the altar. It reads:", "'Snarthon Candtrick Termanto'."); + quest.setStage(player, 80); + return true; + } + player.getPacketDispatch().sendMessage("An altar of the evil god Zamorak."); + return true; + } + Altar altar = Altar.forId(node.getId()); + if (altar != null) { + altar.pray(player); + visualize(player); + return true; + } + if (player.getSkills().getPrayerPoints() == player.getSkills().getStaticLevel(Skills.PRAYER)) { + player.getPacketDispatch().sendMessage("You already have full prayer points."); + return true; + } + visualize(player); + player.getSkills().rechargePrayerPoints(); + player.getPacketDispatch().sendMessage("You recharge your Prayer points."); + if (node.getId() == 2640) { + player.getSkills().setLevel(Skills.PRAYER, player.getSkills().getStaticLevel(Skills.PRAYER) + 2); + player.getSkills().getRestoration()[Skills.PRAYER] = new SkillRestoration(Skills.PRAYER); + player.getSkills().getRestoration()[Skills.PRAYER].restartHpSummPray(false); + } + if (node.getId() == 409 + && player.getLocation().withinDistance(new Location(3209, 3495, 1)) + && player.getPrayer().getActive().contains(PrayerType.SMITE)) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.VARROCK,2, 4); + } + if (node.getId() == 39842 + && player.getLocation().withinDistance(new Location(2995, 3177, 0))) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR,0, 13); + } + // Seers task can be completed with either of camelot altar or seers church altar + if (node.getId() == 19145 + && player.getLocation().withinDistance(new Location(2749, 3496, 1))) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.SEERS_VILLAGE,0, 10); + } + if (node.getId() == 409 + && player.getLocation().withinDistance(new Location(2694, 3462, 0))) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.SEERS_VILLAGE,0, 10); + } + + if (node.getLocation().equals(new Location(2571, 9499, 0))) { + player.teleport(new Location(2583, 9576, 0)); + player.sendMessage("It's a trap!"); + return true; + } + return true; + } + + /** + * Visualizes the prayer. + * @param player the player. + */ + public void visualize(Player player) { + player.lock(3); + player.getAudioManager().send(2674); + player.animate(Animation.create(645)); + } + + /** + * An altar. + * @author Vexia + */ + public enum Altar { + ANCIENT(6552, SpellBook.ANCIENT.getInterfaceId(), "You feel a strange wisdom fill your mind...", "You feel a strange drain upon your memory...") { + @Override + public void pray(Player player) { + if (player.getSkills().getStaticLevel(Skills.MAGIC) < 50) { + player.sendMessage("You need a Magic level of at least 50 in order to do this."); + return; + } + drain(player); + if (!isPrayerType(player)) { + switchToBook(player); + player.sendMessage(getMessages()[0]); + } else { + revert(player); + player.sendMessage(getMessages()[1]); + } + } + }, + LUNAR(17010, SpellBook.LUNAR.getInterfaceId(), "Lunar spells activated!", "Modern spells activated!") { + @Override + public void pray(Player player) { + if (player.getSkills().getStaticLevel(Skills.MAGIC) < 65) { + player.sendMessage("You need a Magic level of at least 65 in order to do this."); + return; + } + if (!isPrayerType(player)) { + switchToBook(player); + player.sendMessage(getMessages()[0]); + } else { + revert(player); + player.sendMessage(getMessages()[1]); + } + } + }; + + /** + * The id. + */ + private int id; + + /** + * The book. + */ + private int book; + + /** + * The messages. + */ + private String[] messages; + + /** + * Constructs a new {@Code Altar} {@Code Object} + * @param id the id. + * @param book the book. + * @param messages the messages. + */ + private Altar(int id, int book, String... messages) { + this.id = id; + this.book = book; + this.messages = messages; + } + + /** + * Prays at the altar. + * @param player the player. + */ + public void pray(Player player) { + + } + + /** + * Reverts the book. + * @param player the player. + */ + public void revert(Player player) { + player.getSpellBookManager().setSpellBook(SpellBook.MODERN); + player.getInterfaceManager().openTab(new Component(SpellBook.values()[SpellBook.MODERN.ordinal()].getInterfaceId())); + } + + /** + * Drains the player. + * @param player the player. + */ + public void drain(Player player) { + player.getSkills().decrementPrayerPoints(player.getSkills().getPrayerPoints()); + } + + /** + * Switches to the book. + * @param player the player. + */ + public void switchToBook(Player player) { + player.getSpellBookManager().setSpellBook(SpellBook.forInterface(book)); + player.getInterfaceManager().openTab(new Component(book)); + } + + /** + * Checks if it is the prayer type. + * @param player the player. + * @return true if so. + */ + public boolean isPrayerType(Player player) { + return player.getSpellBookManager().getSpellBook() == book; + } + + /** + * Gets an altar. + * @param id the id. + * @return the altar. + */ + public static Altar forId(int id) { + for (Altar altar : values()) { + if (id == altar.getId()) { + return altar; + } + } + return null; + } + + /** + * Gets the id. + * @return the id + */ + public int getId() { + return id; + } + + /** + * Sets the baid. + * @param id the id to set. + */ + public void setId(int id) { + this.id = id; + } + + /** + * Gets the book. + * @return the book + */ + public int getBook() { + return book; + } + + /** + * Sets the babook. + * @param book the book to set. + */ + public void setBook(int book) { + this.book = book; + } + + /** + * Gets the messages. + * @return the messages + */ + public String[] getMessages() { + return messages; + } + + /** + * Sets the bamessages. + * @param messages the messages to set. + */ + public void setMessages(String[] messages) { + this.messages = messages; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Altar.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Altar.java new file mode 100644 index 000000000..d14a4e503 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Altar.java @@ -0,0 +1,179 @@ +package core.game.node.entity.skill.runecrafting; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; + +/** + * Represents an altar an it's relative information(corresponding ruin, etc) + * @author 'Vexia + * @date 01/11/2013 + */ +public enum Altar { + AIR(2478, 2465, 7139, MysteriousRuin.AIR, Rune.AIR), + MIND(2479, 2466, 7140, MysteriousRuin.MIND, Rune.MIND), + WATER(2480, 2467, 7137, MysteriousRuin.WATER, Rune.WATER), + EARTH(2481, 2468, 7130, MysteriousRuin.EARTH, Rune.EARTH), + FIRE(2482, 2469, 7129, MysteriousRuin.FIRE, Rune.FIRE), + BODY(2483, 2470, 7131, MysteriousRuin.BODY, Rune.BODY), + COSMIC(2484, 2471, 7132, MysteriousRuin.COSMIC, Rune.COSMIC), + CHAOS(2487, 2474, 7134, MysteriousRuin.CHAOS, Rune.CHAOS), + ASTRAL(17010, 0, 0, null, Rune.ASTRAL), + NATURE(2486, 2473, 7133, MysteriousRuin.NATURE, Rune.NATURE), + LAW(2485, 2472, 7135, MysteriousRuin.LAW, Rune.LAW), + DEATH(2488, 2475, 7136, MysteriousRuin.DEATH, Rune.DEATH), + BLOOD(30624, 2477, 7141, MysteriousRuin.BLOOD, Rune.BLOOD), + SOUL(2489, 0, 7138, null, Rune.SOUL), OURANIA(26847, 0, 0, null, null); + + /** + * Represents the object of the altar. + */ + private final int object; + + /** + * Represents the portal object. + */ + private final int portal; + + /** + * The rift id. + */ + private final int riftId; + + /** + * Represents the corresponding ruin. + */ + private final MysteriousRuin ruin; + + /** + * Represents the rune constructed. + */ + private final Rune rune; + + /** + * Constructs a new {@code Altar} {@code Object}. + * @param object the object. + * @param ruin the ruin. + * @param rune the rune. + */ + Altar(final int object, final int portal, final int riftId, final MysteriousRuin ruin, final Rune rune) { + this.object = object; + this.portal = portal; + this.riftId = riftId; + this.ruin = ruin; + this.rune = rune; + } + + /** + * Enters a rift. + * @param player the player. + */ + public void enterRift(Player player) { + if (this == LAW) { + if (!ItemDefinition.canEnterEntrana(player)) { + player.sendMessage("You can't take weapons and armour into the law rift."); + return; + } + } + if (this == COSMIC && !player.getQuestRepository().isComplete("Lost City")) { + player.getPacketDispatch().sendMessage("You need to have completed the Lost City quest in order to do that."); + return; + } + if (getRuin() == null) { + return; + } + if (getRuin().getEnd() == null) { + return; + } + player.getProperties().setTeleportLocation(getRuin().getEnd()); + } + + /** + * Gets the object. + * @return The object. + */ + public int getObject() { + return object; + } + + /** + * Gets the ruin. + * @return The ruin. + */ + public MysteriousRuin getRuin() { + return ruin; + } + + /** + * Gets the rune. + * @return The rune. + */ + public Rune getRune() { + return rune; + } + + /** + * Checks if its the ourania altar. + * @return the ourania. + */ + public boolean isOurania() { + return getRune() == null; + } + + /** + * Gets the talisman. + * @return the talisman. + */ + public Talisman getTalisman() { + for (Talisman talisman : Talisman.values()) { + if (talisman.name().equals(name())) { + return talisman; + } + } + return null; + } + + /** + * Gets the tiara. + * @return the tiara. + */ + public Tiara getTiara() { + for (Tiara tiara : Tiara.values()) { + if (tiara.name().equals(name())) { + return tiara; + } + } + return null; + } + + /** + * Method used to get the Altar by the object. + * @param object the object. + * @return the Altar or Null. + */ + public static Altar forObject(final GameObject object) { + for (Altar altar : values()) { + if (altar.getObject() == object.getId() || altar.getPortal() == object.getId() || object.getId() == altar.getRiftId()) { + return altar; + } + } + return null; + } + + /** + * Gets the portal. + * @return The portal. + */ + public int getPortal() { + return portal; + } + + /** + * Gets the riftId. + * @return The riftId. + */ + public int getRiftId() { + return riftId; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/CombinationRune.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/CombinationRune.java new file mode 100644 index 000000000..facb37967 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/CombinationRune.java @@ -0,0 +1,130 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.node.item.Item; + +/** + * Represents the combination rune. + * @author 'Vexia + */ +public enum CombinationRune { + MIST(new Item(4695), 6, 8.0, new Altar[] { Altar.WATER, Altar.AIR }, Rune.AIR, Rune.WATER), + DUST(new Item(4696), 10, 8.3, new Altar[] { Altar.EARTH, Altar.AIR }, Rune.AIR, Rune.EARTH), + MUD(new Item(4698), 13, 9.3, new Altar[] { Altar.EARTH, Altar.WATER }, Rune.WATER, Rune.EARTH), + SMOKE(new Item(4697), 15, 8.5, new Altar[] { Altar.FIRE, Altar.AIR }, Rune.AIR, Rune.FIRE), + STEAM(new Item(4694), 19, 9.3, new Altar[] { Altar.WATER, Altar.FIRE }, Rune.WATER, Rune.FIRE), + LAVA(new Item(4699), 23, 10.0, new Altar[] { Altar.FIRE, Altar.EARTH }, Rune.EARTH, Rune.FIRE); + + /** + * Represents the rune rewarded. + */ + private final Item rune; + + /** + * Represents the required level. + */ + private final int level; + + /** + * Represents the base experience. + */ + private final double experience; + + /** + * Represents the altars. + */ + private final Altar[] altars; + + /** + * Represents the runes required. + */ + private final Rune[] runes; + + /** + * Constructs a new {@code CombinationRune} {@code Object}. + * @param rune the rune. + * @param level the level. + * @param experience the base experience/ + * @param runes the runes. + */ + CombinationRune(final Item rune, final int level, final double experience, final Altar[] altars, final Rune... runes) { + this.rune = rune; + this.level = level; + this.experience = experience; + this.altars = altars; + this.runes = runes; + } + + /** + * Gets the rune. + * @return The rune. + */ + public final Item getRune() { + return rune; + } + + /** + * Gets the level. + * @return The level. + */ + public final int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public final double getExperience() { + return experience; + } + + /** + * Gets the runes. + * @return The runes. + */ + public final Rune[] getRunes() { + return runes; + } + + /** + * Method used to get the high experience. + * @return the experience incremented. + */ + public final double getHighExperience() { + return (experience % 1 == 0) ? experience + 5 : experience + 8; + } + + /** + * Gets the altars. + * @return The altars. + */ + public Altar[] getAltars() { + return altars; + } + + /** + * Gets the combination rune. + * @param altar the altar. + * @return the combo rune. + */ + public static CombinationRune forAltar(final Altar altar, final Item item) { + for (CombinationRune rune : values()) { + for (Altar alt : rune.getAltars()) { + if (alt == altar) { + String altarElement = alt.name(); + String talismanElement = item.getName().contains("talisman") ? Talisman.forItem(item).name() : Rune.forItem(item).name(); + if (altarElement.equals(talismanElement)) { + continue; + } + for (Rune r : rune.getRunes()) { + if (r.name().equals(talismanElement)) { + return rune; + } + } + continue; + } + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/CombinationRunePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/CombinationRunePlugin.java new file mode 100644 index 000000000..4c8baef2c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/CombinationRunePlugin.java @@ -0,0 +1,42 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Plugin; + +/** + * Handles the combination runes. + * @author Vexia + */ +public final class CombinationRunePlugin extends UseWithHandler { + + /** + * Constructs a new {@code CombinationRunePlugin} {@code Object}. + */ + public CombinationRunePlugin() { + super(Talisman.AIR.getTalisman().getId(), Talisman.WATER.getTalisman().getId(), Talisman.EARTH.getTalisman().getId(), Talisman.FIRE.getTalisman().getId(), Rune.WATER.getRune().getId(), Rune.EARTH.getRune().getId(), Rune.AIR.getRune().getId(), Rune.FIRE.getRune().getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Altar altar : Altar.values()) { + addHandler(altar.getObject(), OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final Altar altar = Altar.forObject(((GameObject) event.getUsedWith())); + final CombinationRune combo = CombinationRune.forAltar(altar, event.getUsedItem()); + if (combo == null) { + return false; + } + player.getPulseManager().run(new RuneCraftPulse(player, event.getUsedItem(), altar, true, combo)); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/EnchantTiaraPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/EnchantTiaraPlugin.java new file mode 100644 index 000000000..521709f96 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/EnchantTiaraPlugin.java @@ -0,0 +1,41 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Plugin; + +/** + * Handles the tiara enchanting. + * @author Vexia + */ +public final class EnchantTiaraPlugin extends UseWithHandler { + + /** + * Constructs a new {@code EnchantTiaraPlugin} {@code Object}. + */ + public EnchantTiaraPlugin() { + super(1438, 1448, 1444, 1440, 1442, 5516, 1446, 1454, 1452, 1462, 1458, 1456, 1450, 1460, 5525); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Altar altar : Altar.values()) { + addHandler(altar.getObject(), OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + Player player = event.getPlayer(); + Altar altar = Altar.forObject(((GameObject) event.getUsedWith())); + if (!player.getInventory().containsItem(altar.getTalisman().getTalisman())) { + return false; + } + event.getPlayer().getDialogueInterpreter().open(8432482, event); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/EnchantTiaraPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/EnchantTiaraPulse.java new file mode 100644 index 000000000..9be72c321 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/EnchantTiaraPulse.java @@ -0,0 +1,104 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.node.entity.impl.Animator; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents the enchanting of a tiara pulse. + * @author 'Vexia + * @date 02/11/2013 + */ +public class EnchantTiaraPulse extends SkillPulse { + + /** + * Represents the tiara. + */ + private final Tiara tiara; + + /** + * Represents the item tiara. + */ + private final Item TIARA = new Item(5525); + + private static final Animation ANIMATION = new Animation(791, Animator.Priority.HIGH); + private static final Graphics GRAPHICS = new Graphics(186, 100); + + /** + * Represents the amount. + */ + private int amount; + + /** + * Constructs a new {@code EnchantTiaraPulse.java} {@code Object}. + * @param player the player. + * @param node the node. + */ + public EnchantTiaraPulse(Player player, Item node, final Tiara tiara, final int amount) { + super(player, node); + this.tiara = tiara; + this.amount = amount; + } + + @Override + public void start() { + super.start(); + int tiaraAmt = player.getInventory().getAmount(TIARA); + int talsminAmt = player.getInventory().getAmount(node); + if (tiaraAmt > talsminAmt) { + amount = talsminAmt; + } else { + amount = tiaraAmt; + } + } + + @Override + public boolean checkRequirements() { + if (!player.getInventory().containsItem(TIARA)) { + player.getPacketDispatch().sendMessage("You need a tiara."); + return false; + } + return true; + } + + @Override + public void animate() { + player.animate(ANIMATION); + player.graphics(GRAPHICS); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + setDelay(2); + return false; + } + if (player.getInventory().remove(TIARA) && player.getInventory().remove(tiara.getTalisman().getTalisman())) { + player.getInventory().add(tiara.getTiara()); + player.getSkills().addExperience(Skills.RUNECRAFTING, tiara.getExperience(), true); + + if (tiara == Tiara.AIR) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 0, 11); + } + // Craft an earth tiara on the Earth Altar + if (tiara == Tiara.EARTH) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 11); + } + } + amount--; + return amount == 0; + } + + @Override + public void message(int type) { + if (type == 1) { + player.getPacketDispatch().sendMessage("You bind the power of the talisman into your tiara."); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/MysteriousRuin.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/MysteriousRuin.java new file mode 100644 index 000000000..bf91fec2e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/MysteriousRuin.java @@ -0,0 +1,166 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; + +/** + * Represents a mysterious ruin. + * @author 'Vexia + * @date 01/11/2013 + */ +public enum MysteriousRuin { + AIR(new int[] { 2452, 7103, 7104 }, Location.create(2983, 3292, 0), Location.create(2841, 4829, 0), Talisman.AIR, Tiara.AIR), + MIND(new int[] { 2453, 7105, 7106 }, Location.create(2980, 3514, 0), Location.create(2793, 4828, 0), Talisman.MIND, Tiara.MIND), + WATER(new int[] { 2454, 7107, 7108 }, Location.create(3183, 3163, 0), Location.create(3482 ,4838,0), Talisman.WATER, Tiara.WATER), + EARTH(new int[] { 2455, 7109, 7110 }, Location.create(3304, 3475, 0), Location.create(2655, 4830, 0), Talisman.EARTH, Tiara.EARTH), + FIRE(new int[] { 2456, 7111, 7112 }, Location.create(3312, 3253, 0), Location.create(2574, 4849, 0), Talisman.FIRE, Tiara.FIRE), + BODY(new int[] { 2457, 7113, 7114 }, Location.create(3051, 3443, 0), Location.create(2521, 4834, 0), Talisman.BODY, Tiara.BODY), + COSMIC(new int[] { 2458, 7115, 7116 }, Location.create(2406, 4375, 0), Location.create(2162, 4833, 0), Talisman.COSMIC, Tiara.COSMIC), + CHAOS(new int[] { 2461, 7121, 7122 }, Location.create(3059, 3590, 0), Location.create(2281, 4837, 0), Talisman.CHAOS, Tiara.CHAOS), + NATURE(new int[] { 2460, 7119, 7120 }, Location.create(2869, 3021, 0), Location.create(2400, 4835, 0), Talisman.NATURE, Tiara.NATURE), + LAW(new int[] { 2459, 7117, 7118 }, Location.create(2857, 3379, 0), Location.create(2464, 4819, 0), Talisman.LAW, Tiara.LAW), + DEATH(new int[] { 2462, 7123, 7124 }, Location.create(1862, 4639, 0), Location.create(2208, 4830, 0), Talisman.DEATH, Tiara.DEATH), + BLOOD(new int[] { 2464, 30529, 30530 }, Location.create(3561, 9779, 0), Location.create(2467, 4889, 1), Talisman.BLOOD, Tiara.BLOOD); + + /** + * Represents the object id. + */ + private final int[] object; + + /** + * Represents the base location. + */ + private final Location base; + + /** + * Represents the end location. + */ + private final Location end; + + /** + * Represents the talisman. + */ + private final Talisman talisman; + + /** + * Represents the tiara. + */ + private final Tiara tiara; + + /** + * Constructs a new {@code MysteriousRuin} {@code Object}. + * @param object the object. + * @param base the base. + * @param end the end. + * @param talisman the talisman. + * @param tiara the tiara. + */ + MysteriousRuin(int[] object, Location base, Location end, final Talisman talisman, final Tiara tiara) { + this.object = object; + this.base = base; + this.end = end; + this.talisman = talisman; + this.tiara = tiara; + } + + /** + * Enters the ruin. + * @param player the player. + */ + public void enter(Player player) { + if (player.getEquipment().get(EquipmentContainer.SLOT_HAT) == null) { + return; + } + if (getTiara() == null) { + return; + } + if (getTiara().getTiara().getId() != player.getEquipment().get(EquipmentContainer.SLOT_HAT).getId()) { + return; + } + player.getProperties().setTeleportLocation(getEnd()); + player.getPacketDispatch().sendMessage("You feel a powerful force take hold of you..."); + } + + /** + * Gets the object. + * @return The object. + */ + public int[] getObject() { + return object; + } + + /** + * Gets the base. + * @return The base. + */ + public Location getBase() { + return base; + } + + /** + * Gets the end. + * @return The end. + */ + public Location getEnd() { + return end; + } + + /** + * Gets the talisman. + * @return The talisman. + */ + public Talisman getTalisman() { + for (Talisman talisman : Talisman.values()) { + if (talisman.name().equals(name())) { + return talisman; + } + } + return talisman; + } + + /** + * Gets the tiara. + * @return The tiara. + */ + public Tiara getTiara() { + for (Tiara tiara : Tiara.values()) { + if (tiara.name().equals(name())) { + return tiara; + } + } + return tiara; + } + + /** + * Method used to get the MysteriousRuin by the object. + * @param object the object. + * @return the MysteriousRuin or Null. + */ + public static MysteriousRuin forObject(final GameObject object) { + for (MysteriousRuin ruin : values()) { + for (int i : ruin.getObject()) { + if (i == object.getId()) { + return ruin; + } + } + } + return null; + } + + /** + * Method used to get the MysteriousRuin + * @param talisman the talisman. + * @return the MysteriousRuin. + */ + public static MysteriousRuin forTalisman(final Talisman talisman) { + for (MysteriousRuin ruin : values()) { + if (ruin.getTalisman() == talisman) { + return ruin; + } + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/MysteriousRuinPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/MysteriousRuinPlugin.java new file mode 100644 index 000000000..3e5320c9f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/MysteriousRuinPlugin.java @@ -0,0 +1,85 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; + +/** + * Handles the entering into a mysterious ruin. + * @author Vexia + */ +public final class MysteriousRuinPlugin extends UseWithHandler { + + /** + * Represents the animation used. + */ + private static final Animation ANIMATION = new Animation(827); + + /** + * Constructs a new {@code RunecraftingOptionPlugin} {@code Object}. + */ + public MysteriousRuinPlugin() { + super(1438, 1448, 1444, 1440, 1442, 5516, 1446, 1454, 1452, 1462, 1458, 1456, 1450, 1460); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (MysteriousRuin ruin : MysteriousRuin.values()) { + for (int i : ruin.getObject()) { + addHandler(i, OBJECT_TYPE, this); + } + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (!player.getQuestRepository().isComplete("Rune Mysteries") && player.getDetails().getRights() != Rights.ADMINISTRATOR) { + player.getPacketDispatch().sendMessage("You need to finish the Rune Mysteries Quest in order to do this."); + return true; + } + final Talisman talisman = Talisman.forItem(event.getUsedItem()); + final MysteriousRuin ruin = MysteriousRuin.forObject(((GameObject) event.getUsedWith())); + if (talisman != ruin.getTalisman() && talisman != Talisman.ELEMENTAL) { + return false; + } + if (talisman == Talisman.ELEMENTAL && (ruin.getTalisman() != Talisman.AIR && ruin.getTalisman() != Talisman.WATER && ruin.getTalisman() != Talisman.FIRE && ruin.getTalisman() != Talisman.EARTH)) { + return false; + } + teleport(player, event, ruin); + return true; + } + + /** + * Teleports the player to the ruin location. + * @param player the player. + * @param event the event. + * @param ruin the ruin. + */ + private void teleport(final Player player, final NodeUsageEvent event, final MysteriousRuin ruin) { + player.lock(4); + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You hold the " + event.getUsedItem().getName() + " towards the mysterious ruins."); + player.getPacketDispatch().sendMessage("You feel a powerful force take hold of you."); + GameWorld.getPulser().submit(new Pulse(3, player) { + @Override + public boolean pulse() { + player.getProperties().setTeleportLocation(ruin.getEnd()); + // Enter the Earth Altar using an earth tiara or talisman + if (ruin == MysteriousRuin.EARTH) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 0, 13); + } + return true; + } + }); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/PouchManager.kt b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/PouchManager.kt new file mode 100644 index 000000000..972155430 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/PouchManager.kt @@ -0,0 +1,197 @@ +package core.game.node.entity.skill.runecrafting + +import core.game.container.Container +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.Items +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import core.game.node.entity.skill.Skills +import core.game.system.SystemLogger +import core.tools.stringtools.colorize + +/** + * A class for managing rune pouches. + * @param player the player this manager instance belongs to. + * @author Ceikry + */ +class PouchManager(val player: Player) { + + val pouches = hashMapOf( + Items.SMALL_POUCH_5509 to RCPouch(3,1), + Items.MEDIUM_POUCH_5510 to RCPouch(6,25), + Items.LARGE_POUCH_5512 to RCPouch(9,50), + Items.GIANT_POUCH_5514 to RCPouch(12,75) + ) + + /** + * Method to add essence to a pouch + * @param pouchId the id of the pouch we are adding to + * @param amount the amount of essence to add + * @param essence the ID of the essence item we are trying to add + * @author Ceikry + */ + fun addToPouch(pouchId: Int, amount: Int, essence: Int){ + if(!checkRequirement(pouchId)){ + player.sendMessage(colorize("%RYou lack the required level to use this pouch.")) + return + } + var amt = amount + val pouch = pouches[pouchId] + val otherEssence = when(essence){ + Items.RUNE_ESSENCE_1436 -> Items.PURE_ESSENCE_7936 + Items.PURE_ESSENCE_7936 -> Items.RUNE_ESSENCE_1436 + else -> 0 + } + pouch ?: return + if(amount > pouch.container.freeSlots()){ + amt = pouch.container.freeSlots() + } + if(amt == 0){ + player.sendMessage("This pouch is already full.") + } + if(pouch.container.contains(otherEssence,1)){ + player.sendMessage("You can only store one type of essence in each pouch.") + return + } + player.inventory.remove(Item(essence,amt)) + pouch.container.add(Item(essence,amt)) + } + + + /** + * Method to withdraw rune essence from a pouch. + * @param pouchId the item ID of the pouch to withdraw from + * @author Ceikry + */ + fun withdrawFromPouch(pouchId: Int){ + val pouch = pouches[pouchId] + pouch ?: return + val playerFree = player.inventory.freeSlots() + var amount = pouch.currentCap - pouch.container.freeSlots() + if (amount > playerFree) amount = playerFree + player.debug("$amount") + if(amount == 0) return + val essence = Item(pouch.container.get(0).id,amount) + pouch.container.remove(essence) + pouch.container.shift() + player.inventory.add(essence) + if(pouch.charges-- <= 0){ + pouch.currentCap -= when(pouchId){ + 5510 -> 1 + 5512 -> 2 + 5514 -> 3 + else -> 0 + } + if(pouch.currentCap <= 0){ + player.inventory.remove(Item(pouchId)) + player.inventory.add(Item(pouchId + 1)) + player.sendMessage(colorize("%RYour ${Item(pouchId).name} has degraded completely.")) + } + pouch.remakeContainer() + pouch.charges = 10 + if(pouchId != 5509) { + player.sendMessage(colorize("%RYour ${Item(pouchId).name.toLowerCase()} has degraded slightly from use.")) + } + } + + } + + + /** + * Method to save pouches to a root JSONObject + * @param root the JSONObject we are adding the "pouches" JSONArray to + * @author Ceikry + */ + fun save(root: JSONObject){ + val pouches = JSONArray() + + for(i in this.pouches){ + val pouch = JSONObject() + pouch.put("id",i.key.toString()) + val items = JSONArray() + for(item in i.value.container.toArray()){ + item ?: continue + val it = JSONObject() + it.put("itemId",item.id.toString()) + it.put("amount",item.amount.toString()) + items.add(it) + } + pouch.put("container",items) + pouch.put("charges",i.value.charges.toString()) + pouch.put("currentCap",i.value.currentCap.toString()) + pouches.add(pouch) + } + root.put("pouches",pouches) + } + + + /** + * Method to parse save data from a JSONArray + * @param data the JSONArray that contains the data to parse + * @author Ceikry + */ + fun parse(data: JSONArray){ + for(e in data){ + val pouch = e as JSONObject + val id = pouch["id"].toString().toInt() + val p = pouches[id] + p ?: return + val charges = pouch["charges"].toString().toInt() + val currentCap = pouch["currentCap"].toString().toInt() + p.charges = charges + p.currentCap = currentCap + p.remakeContainer() + for(i in pouch["container"] as JSONArray){ + val it = i as JSONObject + it["itemId"] ?: continue + val item = it["itemId"].toString().toInt() + val amount = it["amount"].toString().toInt() + p.container.add(Item(item,amount)) + } + } + } + + + /** + * Method for checking the level requirement for a given pouch. + * @param pouchId the item ID of the pouch to check + * @author Ceikry + */ + fun checkRequirement(pouchId: Int): Boolean{ + val p = pouches[pouchId] + p ?: return false + return player.skills.getLevel(Skills.RUNECRAFTING) >= p.levelRequirement + } + + + /** + * Method for sending the player a message about how much space is left in a pouch + * @param pouchId the item ID of the pouch to check + * @author Ceikry + */ + fun checkAmount(pouchId: Int){ + val p = pouches[pouchId] + p ?: return + player.sendMessage("This pouch has space for ${p.container.freeSlots()} more essence.") + } + + + fun isDecayedPouch(pouchId: Int): Boolean{ + if(pouchId == 5510) return false + return pouches[pouchId - 1] != null + } + + /** + * A class that represents a runecrafting pouch. + * @author Ceikry + */ + class RCPouch(val capacity: Int, val levelRequirement: Int){ + var container = Container(capacity) + var currentCap = capacity + var charges = 10 + fun remakeContainer(){ + this.container = Container(currentCap) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Rune.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Rune.java new file mode 100644 index 000000000..5f455a3d4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Rune.java @@ -0,0 +1,136 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.node.entity.skill.magic.Runes; +import core.game.node.item.Item; + +/** + * Represents a Rune type to craft. + * @author 'Vexia + * @date 01/11/2013 + */ +public enum Rune { + AIR(Runes.AIR_RUNE.transform(), 1, 5, new int[] { 1, 11, 22, 33, 44, 55, 66, 77, 88, 99 }), + MIND(Runes.MIND_RUNE.transform(), 2, 5.5, new int[] { 1, 14, 28, 42, 56, 70, 84, 98 }), + WATER(Runes.WATER_RUNE.transform(), 5, 6, new int[] { 1, 19, 38, 57, 76, 95 }), + EARTH(Runes.EARTH_RUNE.transform(), 9, 6.5, new int[] { 1, 26, 52, 78 }), + FIRE(Runes.FIRE_RUNE.transform(), 14, 7, new int[] { 1, 35, 70 }), + BODY(Runes.BODY_RUNE.transform(), 20, 7.5, new int[] { 1, 46, 92 }), + COSMIC(Runes.COSMIC_RUNE.transform(), 27, 8, new int[] { 1, 59 }), + CHAOS(Runes.CHAOS_RUNE.transform(), 35, 8.5, new int[] { 1, 74 }), + ASTRAL(Runes.ASTRAL_RUNE.transform(), 40, 8.7, new int[] { 1, 82 }), + NATURE(Runes.NATURE_RUNE.transform(), 44, 9, new int[] { 1, 91 }), + LAW(Runes.LAW_RUNE.transform(), 54, 9.5), + DEATH(Runes.DEATH_RUNE.transform(), 65, 10), + BLOOD(Runes.BLOOD_RUNE.transform(), 77, 10.5), + SOUL(Runes.SOUL_RUNE.transform(), 90, 11); + + /** + * Constructs a new {@code Rune} {@code Object}. + * @param rune the rune. + * @param level the level. + * @param experience the experience. + * @param multiple + */ + Rune(Item rune, int level, double experience, int... multiple) { + this.rune = rune; + this.level = level; + this.experience = experience; + this.multiple = multiple; + } + + /** + * Represents the rune item to craft. + */ + private final Item rune; + + /** + * Represents the level required. + */ + private final int level; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Represents the multiple runes allowed to create at a certain level. + */ + private final int[] multiple; + + /** + * Gets the rune. + * @return The rune. + */ + public Item getRune() { + return rune; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the multiple. + * @return The multiple. + */ + public int[] getMultiple() { + return multiple; + } + + /** + * Checks if this rune uses normal essence. + * @return True if so. + */ + public final boolean isNormal() { + return this == AIR || this == MIND || this == WATER || this == EARTH || this == FIRE || this == BODY; + } + + /** + * Checks if this rune is a multi creation rune. + * @return True if so. + */ + public final boolean isMultiple() { + return getMultiple() != null; + } + + /** + * Method used to get the Rune by the item. + * @param item the item. + * @return the Rune or Null. + */ + public static Rune forItem(final Item item) { + for (Rune rune : values()) { + if (rune.getRune().getId() == item.getId()) { + return rune; + } + } + return null; + } + + /** + * Method used to the Rune by the name. + * @param name the name. + * @return the Rune or Null. + */ + public static Rune forName(final String name) { + for (Rune r : Rune.values()) { + if (r.name().equals(name)) { + return r; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RuneCraftPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RuneCraftPulse.java new file mode 100644 index 000000000..a9b334029 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RuneCraftPulse.java @@ -0,0 +1,341 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * A class used to craft runes. + * + * @author Vexia + */ +public final class RuneCraftPulse extends SkillPulse { + + /** + * Represent the rune essence item. + */ + private static final Item RUNE_ESSENCE = new Item(1436); + + /** + * Represents the pure essence item. + */ + private static final Item PURE_ESSENCE = new Item(7936); + + /** + * Represents the binding necklace item. + */ + private static final Item BINDING_NECKLACE = new Item(5521); + + /** + * Represents the animation used for this pulse. + */ + private static final Animation ANIMATION = new Animation(791, Priority.HIGH); + + /** + * Represents the graphics used for this pulse. + */ + private static final Graphics GRAPHICS = new Graphics(186, 100); + + /** + * Represents the altar. + */ + private final Altar altar; + + /** + * Represents the rune we're crafting. + */ + private final Rune rune; + + /** + * Represents the combination rune(if any) + */ + private final CombinationRune combo; + + /** + * Represents if it's a combination pulse. + */ + private final boolean combination; + + /** + * Represents the talisman to remove. + */ + private Talisman talisman; + + /** + * Constructs a new {@code RuneCraftPulse} {@code Object}. + * + * @param player the player. + * @param node the node. + * @param altar the altar. + */ + public RuneCraftPulse(Player player, Item node, final Altar altar, final boolean combination, final CombinationRune combo) { + super(player, node); + this.altar = altar; + this.rune = altar.getRune(); + this.combination = combination; + this.combo = combo; + this.resetAnimation = false; + } + + @Override + public boolean checkRequirements() { + if (!altar.isOurania() && player.getSkills().getLevel(Skills.RUNECRAFTING) < rune.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Runecrafting level of at least " + rune.getLevel() + " to craft this rune."); + return false; + } + if (combination && !player.getInventory().containsItem(PURE_ESSENCE)) { + player.getPacketDispatch().sendMessage("You need pure essence to craft this rune."); + return false; + } + if (!altar.isOurania() && !rune.isNormal() && !player.getInventory().containsItem(PURE_ESSENCE)) { + player.getPacketDispatch().sendMessage("You need pure essence to craft this rune."); + return false; + } + if (!altar.isOurania() && rune.isNormal() && !player.getInventory().containsItem(PURE_ESSENCE) && !player.getInventory().containsItem(RUNE_ESSENCE)) { + player.getPacketDispatch().sendMessage("You need rune essence or pure essence in order to craft this rune."); + return false; + } + if (altar.isOurania() && !player.getInventory().containsItem(PURE_ESSENCE)) { + player.getPacketDispatch().sendMessage("You need pure essence to craft this rune."); + return false; + } + if (combination && player.getSkills().getLevel(Skills.RUNECRAFTING) < combo.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Runecrafting level of at least " + combo.getLevel() + " to combine this rune."); + return false; + } + if (node != null) { + if (node.getName().contains("rune") && !hasSpellImbue()) { + final Rune r = Rune.forItem(node); + final Talisman t = Talisman.forName(r.name()); + if (!player.getInventory().containsItem(t.getTalisman())) { + player.getPacketDispatch().sendMessage("You don't have the correct talisman to combine this rune."); + return false; + } + talisman = t; + } + } + player.lock(4); + return true; + } + + @Override + public void animate() { + player.animate(ANIMATION); + player.graphics(GRAPHICS); + } + + @Override + public boolean reward() { + if (!combination) { + craft(); + } else { + combine(); + } + return true; + } + + @Override + public void stop() { + super.stop(); + player.animate(ANIMATION); + } + + @Override + public void message(int type) { + switch (type) { + case 1: + if (altar != Altar.OURANIA) { + player.getPacketDispatch().sendMessage("You bind the temple's power into " + (combination ? combo.getRune().getName().toLowerCase() : rune.getRune().getName().toLowerCase()) + "s."); + } else { + player.getPacketDispatch().sendMessage("You bind the temple's power into runes."); + } + break; + } + } + + /** + * Method used to craft runes. + */ + private final void craft() { + final Item item = new Item(getEssence().getId(), getEssenceAmount()); + int amount = player.getInventory().getAmount(item); + if (!altar.isOurania()) { + Item i = new Item(rune.getRune().getId(), amount * getMultiplier()); + + if (player.getInventory().remove(item) && player.getInventory().hasSpaceFor(i)) { + player.getInventory().add(i); + player.getSkills().addExperience(Skills.RUNECRAFTING, rune.getExperience() * amount, true); + + // Achievement Diary handling + // Craft some nature runes + if (altar == Altar.NATURE) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 2, 3); + } + // Craft 196 or more air runes simultaneously + if (altar == Altar.AIR && i.getAmount() >= 196) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 2, 2); + } + // Craft a water rune at the Water Altar + if (altar == Altar.WATER && rune == Rune.WATER) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 11); + } + + } + } else { + if (player.getInventory().remove(item)) { + for (int i = 0; i < amount; i++) { + Rune rune = null; + while (rune == null) { + final Rune temp = Rune.values()[RandomFunction.random(Rune.values().length)]; + if (player.getSkills().getLevel(Skills.RUNECRAFTING) >= temp.getLevel()) { + rune = temp; + } else { + if (RandomFunction.random(3) == 1) { + rune = temp; + } + } + } + player.getSkills().addExperience(Skills.RUNECRAFTING, rune.getExperience() * 2, true); + Item runeItem = rune.getRune(); + player.getInventory().add(runeItem); + } + } + } + + + } + + /** + * Method used to combine runes. + */ + private final void combine() { + final Item remove = node.getName().contains("talisman") ? node : talisman != null ? talisman.getTalisman() : Talisman.forName(Rune.forItem(node).name()).getTalisman(); + boolean imbued = hasSpellImbue(); + if (!imbued ? player.getInventory().remove(remove) : imbued) { + int amount = 0; + int essenceAmt = player.getInventory().getAmount(PURE_ESSENCE); + final Item rune = node.getName().contains("rune") ? Rune.forItem(node).getRune() : Rune.forName(Talisman.forItem(node).name()).getRune(); + int runeAmt = player.getInventory().getAmount(rune); + if (essenceAmt > runeAmt) { + amount = runeAmt; + } else { + amount = essenceAmt; + } + if (player.getInventory().remove(new Item(PURE_ESSENCE.getId(), amount)) && player.getInventory().remove(new Item(rune.getId(), amount))) { + for (int i = 0; i < amount; i++) { + if (RandomFunction.random(1, 3) == 1 || hasBindingNeckalce()) { + player.getInventory().add(new Item(combo.getRune().getId(), 1)); + player.getSkills().addExperience(Skills.RUNECRAFTING, combo.getExperience(), true); + } + } + if (hasBindingNeckalce()) { + player.getEquipment().get(EquipmentContainer.SLOT_HAT).setCharge(player.getEquipment().get(EquipmentContainer.SLOT_HAT).getCharge() - 1); + if (1000 - player.getEquipment().get(EquipmentContainer.SLOT_HAT).getCharge() > 14) { + player.getEquipment().remove(BINDING_NECKLACE, true); + player.getPacketDispatch().sendMessage("Your binding necklace crumbles into dust."); + } + } + } + } + } + + /** + * Checks if the player has the spell imbue. + * + * @return {@code True} if so. + */ + private boolean hasSpellImbue() { + return player.getAttribute("spell:imbue", 0) > GameWorld.getTicks(); + } + + /** + * Gets the essence amount. + * + * @return the amount of essence. + */ + private int getEssenceAmount() { + if (altar.isOurania() && player.getInventory().containsItem(PURE_ESSENCE)) { + return player.getInventory().getAmount(PURE_ESSENCE); + } + if (!rune.isNormal() && player.getInventory().containsItem(PURE_ESSENCE)) { + return player.getInventory().getAmount(PURE_ESSENCE); + } else if (rune.isNormal() && player.getInventory().containsItem(PURE_ESSENCE)) { + return player.getInventory().getAmount(PURE_ESSENCE); + } else { + return player.getInventory().getAmount(RUNE_ESSENCE); + } + } + + /** + * Gets the rune essence that needs to be defined. + * + * @return the item. + */ + private Item getEssence() { + if (altar.isOurania() && player.getInventory().containsItem(PURE_ESSENCE)) { + return PURE_ESSENCE; + } + if (!rune.isNormal() && player.getInventory().containsItem(PURE_ESSENCE)) { + return PURE_ESSENCE; + } else if (rune.isNormal() && player.getInventory().containsItem(PURE_ESSENCE)) { + return PURE_ESSENCE; + } else { + return RUNE_ESSENCE; + } + } + + /** + * Gets the multiplied amount of runes to make. + * + * @return the amount. + */ + public int getMultiplier() { + if (altar.isOurania()) { + return 1; + } + int i = 0; + for (int level : rune.getMultiple()) { + if (player.getSkills().getLevel(Skills.RUNECRAFTING) >= level) { + i++; + } + } + + if (player.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE).isComplete(1) + && new ArrayList<>(Arrays.asList(Rune.AIR, Rune.WATER, Rune.FIRE, Rune.EARTH)).contains(rune) + && RandomFunction.getRandom(10) == 0) { //approximately 10% chance //TODO fix RandomFunction to be more random, should be uniformly distributed but isn't + i += 1; + } + + return i != 0 ? i : 1; + } + + /** + * Method used to check if the player has a binding necklace. + * + * @return True if so. + */ + public boolean hasBindingNeckalce() { + return player.getEquipment().containsItem(BINDING_NECKLACE); + } + + /** + * Gets the altar. + * + * @return The altar. + */ + public Altar getAltar() { + return altar; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouch.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouch.java new file mode 100644 index 000000000..36364a670 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouch.java @@ -0,0 +1,643 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.content.global.action.DropItemHandler; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a rune pouch. + * @author Vexia + */ +public enum RunePouch { + SMALL(new Item(5509), 1, 3, 3, 0), MEDIUM(new Item(5510), 25, 6, 9, 45), LARGE(new Item(5512), 50, 9, 18, 29), GIANT(new Item(5514), 75, 12, 30, 10); + + /** + * The pure essence item. + */ + private static final Item PURE_ESSENCE = new Item(7936); + + /** + * The rune essence item. + */ + private static final Item NORMAL_ESSENCE = new Item(1436); + + /** + * The pure essence base. + */ + private static final int PURE_BASE = 6000; + + /** + * The normal essence base. + */ + private static final int NORMAL_BASE = 2000; + + /** + * The pouch item. + */ + private final Item pouch; + + /** + * The decayed pouch. + */ + private final Item decayedPouch; + + /** + * The level required to use it. + */ + private final int level; + + /** + * The capacity. + */ + private final int capacity; + + /** + * The cumulative capacity. + */ + private final int cumulativeCapacity; + + /** + * The uses until decay. + */ + private final int uses; + + /** + * Constructs a new {@code Pouch} {@code Object}. + * @param pouch the pouch. + * @param level the level. + * @param capacity the capacity. + * @param cumulativeCapacity the cumulative capacity. + * @param uses the uses. + */ + RunePouch(Item pouch, int level, int capacity, int cumulativeCapacity, int uses) { + this.pouch = pouch; + this.decayedPouch = new Item(pouch.getId() + 1); + this.level = level; + this.capacity = capacity; + this.cumulativeCapacity = cumulativeCapacity; + this.uses = uses; + } + + /** + * Method used to handle the reward. + * @param player the player. + * @param pouch the item. + * @param option the option. + */ + public void action(final Player player, final Item pouch, final String option) { + if (pouch.getCharge() == 1000 && getDecay(player) > 0) { + resetDecay(player); + } + switch (option) { + case "fill": + fill(player, pouch); + break; + case "empty": + empty(player, pouch); + break; + case "check": + check(player, pouch); + break; + case "drop": + drop(player, pouch); + break; + } + } + + /** + * Method used to fill a pouch. + * @param player the player. + * @param pouch the item. + */ + public final void fill(final Player player, Item pouch) { + if (isFull(pouch, player)) { + return; + } + if (!hasEssence(player)) { + player.sendMessage("You do not have any essence to fill your pouch with."); + return; + } + if (player.getSkills().getStaticLevel(Skills.RUNECRAFTING) < level) { + player.sendMessage("You need level " + level + " Runecrafting to fill a " + name().toLowerCase() + " pouch."); + return; + } + final Item essence = getEssence(player); + if (!isValidEssence(pouch, essence, player)) { + player.sendMessage("You can only put " + getPouchEssenceName(pouch) + " in this pouch."); + return; + } + int amount = getAddAmount(pouch, essence, player); + addEssence(player, pouch, essence, amount); + if (isFull(pouch, player)) { + return; + } + } + + /** + * Emptys a rune pouch. + * @param player the player. + * @param pouch the item. + */ + public final void empty(final Player player, Item pouch) { + if (isEmpty(pouch)) { + player.sendMessage("There are no essences in your pouch."); + return; + } + int essenceAmount = getEssence(pouch); + int addAmount = essenceAmount; + if (player.getInventory().freeSlots() < essenceAmount) { + addAmount = essenceAmount - (essenceAmount - player.getInventory().freeSlots()); + } + Item add = new Item(getEssenceType(pouch).getId(), addAmount); + if (!player.getInventory().hasSpaceFor(add)) { + player.sendMessage("You do not have any more free space in your inventory."); + return; + } + if (player.getInventory().add(add)) { + incrementCharge(pouch, addAmount); + if (essenceAmount != addAmount) {// means all didnt get added + player.sendMessage("You do not have any more free space in your inventory."); + } + } + } + + /** + * Check for doubles. + * @param player the player. + */ + public boolean checkDoubles(Player player) { + boolean hit = false; + for (RunePouch pouch : values()) { + if (player.getInventory().getAmount(pouch.getPouch()) > 1 || player.getBank().getAmount(pouch.getPouch()) > 1) { + hit = true; + player.getInventory().remove(new Item(pouch.getPouch().getId(), player.getInventory().getAmount(pouch.getPouch()) - 1)); + player.getBank().remove(new Item(pouch.getPouch().getId(), player.getBank().getAmount(pouch.getPouch()))); + } + } + return hit; + } + + /** + * Checks the essence pouch. + * @param player the player. + * @param item the item. + */ + public final void check(final Player player, Item item) { + int amount = getEssence(item); + player.sendMessage(amount == 0 ? "There are no essences in this pouch." : "There " + (amount == 1 ? "is" : "are") + " " + amount + " " + getPouchEssenceName(item, amount) + " in this pouch."); + } + + /** + * Drops an item. + * @param player the player. + * @param item the item. + */ + private void drop(Player player, Item item) { + onDrop(player, item); + DropItemHandler.drop(player, item); + } + + /** + * Handles the on dropping of a pouch. + * @param player the player. + * @param item the item. + */ + public void onDrop(Player player, Item item) { + if (!isEmpty(item)) { + resetCharge(item); + player.sendMessage("The contents of the pouch fell out as you dropped it!"); + } + } + + /** + * Adds an essence amount to the pouch. + * @param player the player. + * @param pouch the pouch. + * @param essence the essence. + * @param amount the amount. + */ + public void addEssence(Player player, Item pouch, Item essence, int amount) { + final Item remove = new Item(essence.getId(), amount); + if (!player.getInventory().containsItem(remove)) { + return; + } + if (player.getInventory().remove(remove)) { + int charge = getPouchCharge(pouch); + if (charge == 1000) { + charge = (isPureEssence(essence) ? PURE_BASE : NORMAL_BASE); + setCharge(pouch, charge); + } + if (isPureEssence(essence) && charge == NORMAL_BASE) { + charge = PURE_BASE; + } else if (isNormalEssence(essence) && charge == PURE_BASE) { + charge = NORMAL_BASE; + } + charge -= amount; + setHash(pouch, charge); + decay(player, pouch); + } + } + + /** + * Decays a pouch. + * @param player the player. + * @param pouch the pouch. + */ + public void decay(Player player, Item pouch) { + incrementDecay(player); + if (getDecay(player) >= uses) { + String message = ""; + if (!isDecayed(pouch)) { + int decrementAmount = 0; + if (getDecayAmount() > getEssence(pouch)) { + decrementAmount = getDecayAmount() - (getDecayAmount() - getEssence(pouch)); + } else { + decrementAmount = getEssence(pouch) - (getEssence(pouch) - getDecayAmount()); + } + incrementCharge(pouch, decrementAmount); + message = "Your pouch has decayed through use."; + player.getInventory().replace(new Item(getDecayedPouch().getId(), pouch.getAmount(), pouch.getCharge()), pouch.getSlot()); + } else { + message = "Your pouch has decayed beyond any further use."; + player.getInventory().remove(pouch); + } + resetDecay(player); + player.sendMessage(message); + } + } + + /** + * Repairs a pouch. + * @param pouch the pouch. + */ + public void repair(Player player, Item pouch) { + if (isDecayed(pouch)) { + player.getInventory().replace(new Item(getPouch().getId(), pouch.getAmount(), pouch.getCharge()), pouch.getSlot()); + } + resetDecay(player); + } + + /** + * Increments the decay. + * @param player the player. + */ + public void incrementDecay(Player player) { + player.getSavedData().getGlobalData().getRcDecays()[ordinal() - 1]++; + } + + /** + * Increments the charge on a pouch. + * @param pouch the pouch. + * @param chargeIncrement the charge increment. + */ + public void incrementCharge(Item pouch, int chargeIncrement) { + setHash(pouch, getPouchCharge(pouch) + chargeIncrement); + } + + /** + * Decrements the charge on a pouch. + * @param pouch the pouch. + * @param chargeIncrement the charge increment. + */ + public void decrementCharge(Item pouch, int chargeIncrement) { + setHash(pouch, getPouchCharge(pouch) - chargeIncrement); + } + + /** + * Sets the charge. + * @param pouch the pouch. + * @param charge the charge. + */ + public void setCharge(Item pouch, int charge) { + setHash(pouch, charge); + } + + /** + * Resets the decay on a pouch. + */ + public void resetDecay(Player player) { + player.getSavedData().getGlobalData().getRcDecays()[ordinal() - 1] = 0; + } + + /** + * Resets the charge on the pouch. + * @param pouch the pouch. + */ + public void resetCharge(Item pouch) { + setHash(pouch, 1000); + } + + /** + * Sets the hash of the pouch. + * @param pouch the pouch. + * @param charge the charge. + */ + public void setHash(Item pouch, int charge) { + pouch.setCharge(charge); + } + + /** + * Gets the decay. + * @param player the player. + * @return the decay. + */ + public int getDecay(Player player) { + return player.getSavedData().getGlobalData().getRcDecay(ordinal() - 1); + } + + /** + * Gets the charge of the pouch. + * @param pouch the pouch. + * @return the charge. + */ + public int getPouchCharge(Item pouch) { + return pouch.getCharge(); + } + + /** + * Checks if the pouch is full. + * @param item the item. + * @return {@code True} if so. + */ + public boolean isFull(Item item) { + return getEssence(item) >= getCapacity(pouch); + } + + /** + * Gets the add amount. + * @param pouch the pouch. + * @param essence the essence. + * @return the amount. + */ + public int getAddAmount(Item pouch, Item essence, Player player) { + int essyAmount = player.getInventory().getAmount(essence); + int pouchAmount = getEssence(pouch); + int maxAdd = getCapacity(pouch) - pouchAmount;// 3 - 0 == 3, thus max = + // 3. + if (essyAmount > maxAdd) { + return maxAdd; + } else if (essyAmount <= maxAdd) { + return essyAmount; + } + return 0; + + } + + /** + * Checks if essence can go inside a pouch. + * @param pouch the pouch. + * @param essence the essence. + * @param player the player. + * @return {@code True} if so. + */ + public boolean isValidEssence(Item pouch, Item essence, Player player) { + if (isEmpty(pouch)) { + return true; + } + return getPouchEssenceName(pouch).equals(getEssenceName(essence)); + } + + /** + * Checks if the pouch is full. + * @param item the item. + * @param player the player. + * @return + */ + public boolean isFull(Item item, Player player) { + if (isFull(item)) { + player.sendMessage("Your pouch is full."); + return true; + } + return false; + } + + /** + * Gets the essence name. + * @param item the item. + * @param amount the amount. + * @return the name. + */ + public String getPouchEssenceName(Item item, int amount) { + return getPouchEssenceName(item) + (amount > 1 ? "s" : ""); + } + + /** + * Gets the essence name. + * @param item the item. + * @return the name. + */ + public String getPouchEssenceName(Item item) { + int charge = getPouchCharge(item); + return charge > NORMAL_BASE ? "pure essence" : "normal essence"; + } + + /** + * Gets the essence item in the pouch. + * @param pouch the pouch. + * @return {@code True} item. + */ + public Item getEssenceInPouch(Item pouch) { + return getPouchEssenceName(pouch).equals("pure essence") ? PURE_ESSENCE : NORMAL_ESSENCE; + } + + /** + * Gets the essence name. + * @param essence the essence. + * @return the name. + */ + public String getEssenceName(Item essence) { + return essence.getId() == PURE_ESSENCE.getId() ? "pure essence" : "normal essence"; + } + + /** + * Gets the essence base. + * @param item the item. + * @return the base. + */ + public int getEssenceBase(Item item) { + return getPouchEssenceName(item).equals("pure essence") ? PURE_BASE : NORMAL_BASE; + } + + /** + * Checks if it's a pure essence pouch. + * @param pouch the item. + * @return {@code True} if so. + */ + public boolean isPureEssencePouch(Item pouch) { + return getPouchEssenceName(pouch).equals("pure essence"); + } + + /** + * Checks if its a pure essence. + * @param essence the essence. + * @return {@code True} if so. + */ + public boolean isPureEssence(Item essence) { + return essence.getId() == PURE_ESSENCE.getId(); + } + + /** + * Checks if its normal essence. + * @param essence the essence. + * @return {@code True} if so. + */ + public boolean isNormalEssence(Item essence) { + return essence.getId() == NORMAL_ESSENCE.getId(); + } + + /** + * Gets the essence type. + * @param pouch the pouch. + * @return the item. + */ + public Item getEssenceType(Item pouch) { + return getPouchEssenceName(pouch).equals("pure essence") ? PURE_ESSENCE : NORMAL_ESSENCE; + } + + /** + * Gets the essence type. + * @param player the player. + * @return {@code True} if so. + */ + public Item getEssence(Player player) { + if (player.getInventory().containsItem(PURE_ESSENCE)) { + return PURE_ESSENCE; + } else if (player.getInventory().containsItem(NORMAL_ESSENCE)) { + return NORMAL_ESSENCE; + } + return null; + } + + /** + * Checks if the player has essence. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasEssence(Player player) { + return player.getInventory().containsItem(PURE_ESSENCE) || player.getInventory().containsItem(NORMAL_ESSENCE); + } + + /** + * Gets a rune pouch for the item. + * @param pouch the pouch. + * @return the {@code RunePouch}. + */ + public static RunePouch forItem(final Item pouch) { + for (RunePouch p : RunePouch.values()) { + if (p.getPouch().getId() == pouch.getId() || (p != SMALL && p.getDecayedPouch().getId() == pouch.getId())) { + return p; + } + } + return null; + } + + /** + * Checks if the pouch is empty. + * @param item the item. + * @return {@code True} if so. + */ + public boolean isEmpty(Item item) { + return getEssence(item) <= 0; + } + + /** + * Gets the essence amount. + * @param item the item. + * @return the amount. + */ + public int getEssence(Item item) { + if (getPouchCharge(item) == 1000 || getPouchCharge(item) == 2000) { + return 0; + } + return getEssenceBase(item) - getPouchCharge(item); + } + + /** + * Gets the pouch. + * @return The pouch. + */ + public Item getPouch() { + return pouch; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the capacity. + * @param pouch the pouch. + * @return The capacity. + */ + public int getCapacity(Item pouch) { + return capacity - (isDecayed(pouch) ? getDecayAmount() : 0); + } + + /** + * Gets the decay amount. + * @return the amount. + */ + public int getDecayAmount() { + return this == GIANT ? 3 : this == LARGE ? 2 : 1; + } + + /** + * Gets the cumulativeCapacity. + * @return The cumulativeCapacity. + */ + public int getCumulativeCapacity() { + return cumulativeCapacity; + } + + /** + * Gets the uses. + * @return The uses. + */ + public int getUses() { + return uses; + } + + /** + * Checks if the pouch is decayed. + * @param pouch the pouch. + * @returne {@code True} if decayed. + */ + public boolean isDecayed(Item pouch) { + return pouch.getId() == decayedPouch.getId(); + } + + /** + * Checks if the pouch is decayable. + * @return {@code True} if so. + */ + public boolean isDecayable() { + return this != SMALL; + } + + /** + * Gets the decayedPouch. + * @return The decayedPouch. + */ + public Item getDecayedPouch() { + if (this == SMALL) { + return pouch; + } + return decayedPouch; + } + + /** + * Checks if this pouch has decay. + * @param player the player. + * @param pouch the pouch. + * @return {@code True} if so. + */ + public boolean hasDecay(Player player, Item pouch) { + return getDecay(player) > 0 || isDecayed(pouch); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouchPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouchPlugin.kt new file mode 100644 index 000000000..679b7a3c5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunePouchPlugin.kt @@ -0,0 +1,62 @@ +package core.game.node.entity.skill.runecrafting + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Plugin +import core.tools.Items +import core.tools.stringtools.colorize + +/** + * Handles the rune pouches. + * @author Ceikry + */ +class RunePouchPlugin : OptionHandler() { + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin? { + for (i in 5509..5515) { + ItemDefinition.forId(i).handlers["option:fill"] = this + ItemDefinition.forId(i).handlers["option:empty"] = this + ItemDefinition.forId(i).handlers["option:check"] = this + ItemDefinition.forId(i).handlers["option:drop"] = this + } + return this + } + + override fun handle(player: Player, node: Node, option: String): Boolean { + val rEssAmt = player.inventory.getAmount(Items.RUNE_ESSENCE_1436) + val pEssAmt = player.inventory.getAmount(Items.PURE_ESSENCE_7936) + var preferenceFlag = 0 //0 -> rune ess, 1 -> pure ess + if(rEssAmt - pEssAmt == 0 && option == "fill") return true + if(rEssAmt > pEssAmt) preferenceFlag = 0 else preferenceFlag = 1 + + val essence = Item( + if(preferenceFlag == 0) Items.RUNE_ESSENCE_1436 else Items.PURE_ESSENCE_7936, + if(preferenceFlag == 0) rEssAmt else pEssAmt + ) + + + if(player.pouchManager.isDecayedPouch(node.id)){ + player.debug("E2") + when(option) { //Handling for IF the pouch has already completely decayed + "drop" -> player.dialogueInterpreter.open(9878,Item(node.id)) + else -> player.sendMessage(colorize("%RThis pouch has completely decayed and needs to be repaired.")) + } + } else { + player.debug("E") + when (option) { //Normal handling + "fill" -> player.pouchManager.addToPouch(node.id, essence.amount, essence.id) + "empty" -> player.pouchManager.withdrawFromPouch(node.id) + "check" -> player.pouchManager.checkAmount(node.id) + "drop" -> player.dialogueInterpreter.open(9878,Item(node.id)) + } + } + return true + } + + override fun isWalk(): Boolean { + return false + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.java new file mode 100644 index 000000000..a7cb9de7d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/RunecraftingPlugin.java @@ -0,0 +1,155 @@ +package core.game.node.entity.skill.runecrafting; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.travel.EssenceTeleport; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.game.node.entity.skill.runecrafting.abyss.AbyssPlugin; + +/** + * Handles runecraftign related options. + * @author Vexia + */ +@Initializable +public class RunecraftingPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addNodes(); + PluginManager.definePlugin(new AbyssPlugin()); + PluginManager.definePlugin(new TiaraPlugin()); + PluginManager.definePlugin(new RunePouchPlugin()); + PluginManager.definePlugin(new EnchantTiaraPlugin()); + PluginManager.definePlugin(new MysteriousRuinPlugin()); + PluginManager.definePlugin(new CombinationRunePlugin()); + ObjectDefinition.forId(2492).getHandlers().put("option:use", this); + NPCDefinition.forId(553).getHandlers().put("option:teleport", this); + NPCDefinition.forId(2328).getHandlers().put("option:teleport", this); + ObjectDefinition.forId(26849).getHandlers().put("option:climb", this); + ObjectDefinition.forId(26850).getHandlers().put("option:climb", this); + ObjectDefinition.forId(268).getHandlers().put("option:climb", this); + ObjectDefinition.forId(26844).getHandlers().put("option:squeeze-through", this); + ObjectDefinition.forId(26845).getHandlers().put("option:squeeze-through", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (!player.getQuestRepository().isComplete("Rune Mysteries") && player.getDetails().getRights() != Rights.ADMINISTRATOR) { + player.getPacketDispatch().sendMessage("You need to finish the Rune Mysteries Quest in order to do this."); + return true; + } + switch (node.getId()) { + case 2492: + EssenceTeleport.home(player); + return true; + case 26844: + case 26845: + final Location location = node.getId() == 26845 ? new Location(3309, 4820, 0) : new Location(3311, 4817, 0); + player.lock(4); + player.getInterfaceManager().openOverlay(new Component(115)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 1)); + GameWorld.getPulser().submit(new Pulse(4, player) { + + @Override + public boolean pulse() { + player.teleport(location); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeOverlay(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + return true; + } + + }); + return true; + case 553: + case 2328: + case 844: + EssenceTeleport.teleport(((NPC) node), player); + return true; + } + switch (option) { + case "use": + final Altar altar = Altar.forObject(((GameObject) node)); + player.getProperties().setTeleportLocation(altar.getRuin().getBase()); + break; + case "craft-rune": + if(node.getLocation().equals(new Location(3151, 3484))){ + player.sendMessage("You can only craft Astral runes on Lunar Isle."); + return true; + } + player.getPulseManager().run(new RuneCraftPulse(player, null, Altar.forObject(((GameObject) node)), false, null)); + break; + case "locate": + final Talisman talisman = Talisman.forItem(((Item) node)); + talisman.locate(player); + break; + case "enter": + final MysteriousRuin ruin = MysteriousRuin.forObject(((GameObject) node)); + if (ruin == null) { + return true; + } + ruin.enter(player); + break; + case "climb": + int id = ((GameObject) node).getId(); + switch (id) { + case 26849: + ClimbActionHandler.climb(player, null, new Location(3271, 4861, 0)); + break; + case 26850: + ClimbActionHandler.climb(player, null, new Location(2452, 3230, 0)); + break; + } + break; + } + return true; + } + + /** + * Adds the nodes to this plugin. + */ + private void addNodes() { + for (Altar altar : Altar.values()) { + ObjectDefinition.forId(altar.getObject()).getHandlers().put("option:craft-rune", this); + ObjectDefinition.forId(altar.getPortal()).getHandlers().put("option:use", this); + } + for (MysteriousRuin ruin : MysteriousRuin.values()) { + for (int i : ruin.getObject()) { + ObjectDefinition.forId(i).getHandlers().put("option:enter", this); + } + } + for (Talisman talisman : Talisman.values()) { + ItemDefinition.forId(talisman.getTalisman().getId()).getHandlers().put("option:locate", this); + } + } + + @Override + public boolean isWalk() { + return false; + } + + @Override + public boolean isWalk(final Player player, final Node node) { + return !(node instanceof Item); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Talisman.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Talisman.java new file mode 100644 index 000000000..8e4db131f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Talisman.java @@ -0,0 +1,121 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; + +/** + * Represents a talisman. + * @author 'Vexia + */ +public enum Talisman { + AIR(new Item(1438), MysteriousRuin.AIR), MIND(new Item(1448), MysteriousRuin.MIND), WATER(new Item(1444), MysteriousRuin.WATER), EARTH(new Item(1440), MysteriousRuin.EARTH), FIRE(new Item(1442), MysteriousRuin.FIRE), ELEMENTAL(new Item(5516), null), BODY(new Item(1446), MysteriousRuin.BODY), COSMIC(new Item(1454), MysteriousRuin.COSMIC), CHAOS(new Item(1452), MysteriousRuin.CHAOS), NATURE(new Item(1462), MysteriousRuin.NATURE), LAW(new Item(1458), MysteriousRuin.LAW), DEATH(new Item(1456), MysteriousRuin.DEATH), BLOOD(new Item(1450), null), SOUL(new Item(1460), null); + + /** + * Constructs a new {@code Talisman} {@code Object}. + */ + Talisman(final Item talisman, MysteriousRuin ruin) { + this.talisman = talisman; + this.ruin = ruin; + } + + /** + * Represents the talisman item. + */ + private final Item talisman; + + /** + * Represents the mysterious ruin. + */ + private final MysteriousRuin ruin; + + /** + * Gets the talisman. + * @return The talisman. + */ + public Item getTalisman() { + return talisman; + } + + /** + * Method used to locate a ruin. + */ + public final void locate(final Player player) { + if (this == ELEMENTAL || getRuin() == null) { + player.getPacketDispatch().sendMessage("You cannot tell which direction the Talisman is pulling..."); + return; + } + String direction = ""; + Location loc = getRuin().getBase(); + if (player.getLocation().getY() > loc.getY() && player.getLocation().getX() - 1 > loc.getX()) + direction = "south-west"; + else if (player.getLocation().getX() < loc.getX() && player.getLocation().getY() > loc.getY()) + direction = "south-east"; + else if (player.getLocation().getX() > loc.getX() + 1 && player.getLocation().getY() < loc.getY()) + direction = "north-west"; + else if (player.getLocation().getX() < loc.getX() && player.getLocation().getY() < loc.getY()) + direction = "north-east"; + else if (player.getLocation().getY() < loc.getY()) + direction = "north"; + else if (player.getLocation().getY() > loc.getY()) + direction = "south"; + else if (player.getLocation().getX() < loc.getX() + 1) + direction = "east"; + else if (player.getLocation().getX() > loc.getX() + 1) + direction = "west"; + player.getPacketDispatch().sendMessage("The talisman pulls towards the " + direction + "."); + } + + /** + * Gets the ruin. + * @return The ruin. + */ + public MysteriousRuin getRuin() { + for (MysteriousRuin ruin : MysteriousRuin.values()) { + if (ruin.name().equals(name())) { + return ruin; + } + } + return ruin; + } + + /** + * Gets the tiara. + * @return the tiara. + */ + public Tiara getTiara() { + for (Tiara tiara : Tiara.values()) { + if (tiara.name().equals(name())) { + return tiara; + } + } + return null; + } + + /** + * Method used to get the Talisman by the item. + * @param item the item. + * @return the Talisman or Null. + */ + public static Talisman forItem(final Item item) { + for (Talisman talisman : values()) { + if (talisman.getTalisman().getId() == item.getId()) { + return talisman; + } + } + return null; + } + + /** + * Method used to get the Talisman by the item. + * @return the Talisman or Null. + */ + public static Talisman forName(final String name) { + for (Talisman talisman : values()) { + if (talisman.name().equals(name)) { + return talisman; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Tiara.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Tiara.java new file mode 100644 index 000000000..171d5f10c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/Tiara.java @@ -0,0 +1,89 @@ +package core.game.node.entity.skill.runecrafting; + +import core.game.node.item.Item; + +/** + * Represents a tiara item and it's corresponding information related to + * (runecrafting) + * @author 'Vexia + * @date 01/11/2013 + */ +public enum Tiara { + AIR(new Item(5527), 25), + MIND(new Item(5529), 27.5), + WATER(new Item(5531), 30), + EARTH(new Item(5535), 32.5), + FIRE(new Item(5537), 35), + BODY(new Item(5533), 37.5), + COSMIC(new Item(5539), 40), + CHAOS(new Item(5543), 43.5), + ASTRAL(new Item(9106), 43.5), + NATURE(new Item(5541), 45), + LAW(new Item(5545), 47.5), + DEATH(new Item(5547), 50), + BLOOD(new Item(5549), 52.5), + SOUL(new Item(5551), 55); + + /** + * Constructs a new {@code Tiara} {@code Object}. + * @param tiara the tiara. + * @param experience the experience. + */ + Tiara(final Item tiara, final double experience) { + this.tiara = tiara; + this.experience = experience; + } + + /** + * Represents the tiara item. + */ + private final Item tiara; + + /** + * Represents the experience gained. + */ + private final double experience; + + /** + * Gets the tiara. + * @return The tiara. + */ + public Item getTiara() { + return tiara; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Method used to get the talisman for this tiara. + * @return the talisman. + */ + public Talisman getTalisman() { + for (Talisman talisman : Talisman.values()) { + if (talisman.name().equals(name())) { + return talisman; + } + } + return null; + } + + /** + * Method used to get the Tiara by the item. + * @param item the item. + * @return the Tiara or Null. + */ + public static Tiara forItem(final Item item) { + for (Tiara tiara : values()) { + if (tiara.getTiara().getId() == item.getId()) { + return tiara; + } + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/TiaraPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/TiaraPlugin.java new file mode 100644 index 000000000..f27845bb1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/TiaraPlugin.java @@ -0,0 +1,67 @@ +package core.game.node.entity.skill.runecrafting; + +import core.cache.def.impl.VarbitDefinition; +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Handles a tiara equipment. + * @author Vexia + */ +public final class TiaraPlugin implements Plugin { + + /** + * The config id. + */ + private static final int CONFIG = 491; + + /** + * The tiara ids. + */ + private static final int[] IDS = new int[] { 9765, 9766, 14831, 14833, 14835, 14839, 14840, 5527, 5529, 5531, 5533, 5535, 5537, 5539, 5541, 5543, 5545, 5547, 5551, 5549 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : IDS) { + ItemDefinition.forId(i).getHandlers().put("equipment", this); + } + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + final Player player = (Player) args[0]; + final Item item = (Item) args[1]; + switch (identifier) { + case "equip": + if (item.getName().contains("cape")) { + player.getConfigManager().set(CONFIG, 6143); + break; + } + MysteriousRuin ruin = MysteriousRuin.forTalisman(Tiara.forItem(item).getTalisman()); + player.getConfigManager().set(CONFIG, 1 << VarbitDefinition.forObjectID(ObjectDefinition.forId(ruin.getObject()[0]).getVarbitID()).getBitShift(), true); + break; + case "unequip": + final Item other = args.length == 2 ? null : (Item) args[2]; + if (other != null) { + if (other.getName().toLowerCase().contains("cape")) { + player.getConfigManager().set(CONFIG, 6143); + break; + } + Tiara tiara = Tiara.forItem(other); + if (tiara != null) { + MysteriousRuin r = MysteriousRuin.forTalisman(tiara.getTalisman()); + player.getConfigManager().set(CONFIG, 1 << VarbitDefinition.forObjectID(ObjectDefinition.forId(r.getObject()[0]).getVarbitID()).getBitShift(), true); + break; + } + } + player.getConfigManager().set(CONFIG, 0); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.java new file mode 100644 index 000000000..e56404a2b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/AbyssPlugin.java @@ -0,0 +1,440 @@ +package core.game.node.entity.skill.runecrafting.abyss; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.node.entity.skill.runecrafting.Altar; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * A plugin used to handle the abyss. + * @author Vexia + */ +public final class AbyssPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (AbbysalObstacle obstacle : AbbysalObstacle.values()) { + for (int i : obstacle.getObjects()) { + ObjectDefinition.forId(i).getHandlers().put("option:" + obstacle.getOption(), this); + } + } + PluginManager.definePlugin(new AbyssalNPC()); + PluginManager.definePlugin(new DarkMageDialogue()); + ObjectDefinition.setOptionHandler("exit-through", this); + PluginManager.definePlugin(new ZamorakMageDialogue()); + NPCDefinition.forId(2259).getHandlers().put("option:teleport", this); + NPCDefinition.forId(2262).getHandlers().put("option:repair-pouches", this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "teleport": + teleport(player, (NPC) node); + break; + case "repair-pouches": + player.getDialogueInterpreter().open(node.getId(), node, true); + break; + case "exit-through": + Altar altar = Altar.forObject((GameObject) node); + if (altar != null) { + altar.enterRift(player); + } + break; + case "mine": + case "chop": + case "squeeze-through": + case "distract": + case "go-through": + case "burn-down": + final AbbysalObstacle obstacle = AbbysalObstacle.forObject(((GameObject) node)); + obstacle.handle(player, ((GameObject) node)); + break; + } + return true; + } + + /** + * Represents the teleporting to the abyss. + * @param player the player. + */ + public static void teleport(final Player player, final NPC npc) { + player.lock(3); + npc.visualize(new Animation(1979), new Graphics(4)); + npc.sendChat("Veniens! Sallakar! Rinnesset!"); + player.getSkills().decrementPrayerPoints(100); + player.getSkullManager().checkSkull(player); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.getProperties().setTeleportLocation(Location.create(3021, 4847, 0)); + npc.getUpdateMasks().reset(); + return true; + } + }); + } + + /** + * Represents an obstacle in an abbsyal. + * @author 'Vexia + * @date 02/11/2013 + */ + public enum AbbysalObstacle { + BOIL("burn-down", new Location[] { Location.create(3024, 4833, 0), Location.create(3053, 4830, 0) }, 7165) { + @Override + public void handle(final Player player, final GameObject object) { + if (!player.getInventory().contains(590, 1)) { + player.getPacketDispatch().sendMessage("You don't have a tinderbox to burn it."); + return; + } + player.animate(new Animation(733)); + player.lock(3); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + switch (count) { + case 1: + player.getPacketDispatch().sendMessage("You attempt to burn your way through.."); + break; + case 4: + if (RandomFunction.random(3) != 1) { + player.getPacketDispatch().sendMessage("...and manage to burn it down and get past."); + player.getProperties().setTeleportLocation(getLocations()[getIndex(object)]); + return true; + } else { + player.getPacketDispatch().sendMessage("You fail to set it on fire."); + return true; + } + } + count++; + return false; + } + + @Override + public void stop() { + super.stop(); + player.animate(new Animation(-1, Priority.HIGH)); + } + }); + } + }, + MINE("mine", new Location[] { Location.create(3030, 4821, 0), Location.create(3048, 4822, 0) }, 7158, 7153) { + @Override + public void handle(final Player player, final GameObject object) { + final SkillingTool tool = setTool(true, player); + if (tool == null) { + player.getPacketDispatch().sendMessage("You need a pickaxe in order to do that."); + return; + } + player.animate(tool.getAnimation()); + player.lock(3); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + switch (count) { + case 1: + player.getPacketDispatch().sendMessage("You attempt to mine your way through.."); + break; + case 4: + if (RandomFunction.random(3) != 1) { + player.getPacketDispatch().sendMessage("...and manage to break through the rock."); + player.getProperties().setTeleportLocation(getLocations()[getIndex(object)]); + return true; + } else { + player.getPacketDispatch().sendMessage("...but fail to break-up the rock."); + return true; + } + } + count++; + return false; + } + + @Override + public void stop() { + super.stop(); + player.animate(new Animation(-1, Priority.HIGH)); + } + }); + } + }, + CHOP("chop", new Location[] { Location.create(3050, 4824, 0), Location.create(3028, 4824, 0) }, 7161, 7144) { + @Override + public void handle(final Player player, final GameObject object) { + final SkillingTool tool = setTool(false, player); + if (tool == null) { + player.getPacketDispatch().sendMessage("You need an axe in order to do that."); + return; + } + player.animate(tool.getAnimation()); + player.lock(3); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + switch (count) { + case 1: + player.getPacketDispatch().sendMessage("You attempt to chop your way through..."); + break; + case 4: + if (RandomFunction.random(3) != 1) { + player.getPacketDispatch().sendMessage("...and manage to chop down the tendrils."); + player.getProperties().setTeleportLocation(getLocations()[getIndex(object)]); + return true; + } else { + player.getPacketDispatch().sendMessage("You fail to cut through the tendrils."); + return true; + } + } + count++; + return false; + } + + @Override + public void stop() { + super.stop(); + player.animate(new Animation(-1, Priority.HIGH)); + } + }); + } + }, + SQUEEZE("squeeze-through", new Location[] { Location.create(3048, 4842, 0), Location.create(3031, 4842, 0) }, 7164, 7147) { + @Override + public void handle(final Player player, final GameObject object) { + player.animate(new Animation(1331)); + player.lock(3); + player.lock(3); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + switch (count) { + case 1: + player.getPacketDispatch().sendMessage("You attempt to squeeze through the narrow gap..."); + break; + case 2: + player.getPacketDispatch().sendMessage("...and you manage to crawl through."); + player.getProperties().setTeleportLocation(getLocations()[getIndex(object)]); + return true; + } + count++; + return false; + } + + @Override + public void stop() { + super.stop(); + player.animate(new Animation(-1, Priority.HIGH)); + } + }); + } + }, + DISTRACT("distract", new Location[] { Location.create(3029, 4841, 0), Location.create(3051, 4838, 0) }, 7168, 7150) { + @Override + public void handle(final Player player, final GameObject object) { + int[] emotes = { 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 2113, 2109, 2111, 2106, 2107, 2108, 0x558, 2105, 2110, 2112, 0x84F, 0x850, 1131, 1130, 1129, 1128, 1745, 3544, 3543, 2836 }; + int index = RandomFunction.random(emotes.length); + player.animate(new Animation(emotes[index])); + player.lock(3); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count = 0; + + @Override + public boolean pulse() { + switch (count) { + case 1: + player.getPacketDispatch().sendMessage("You use your thieving skills to misdirect the eyes..."); + break; + case 4: + if (RandomFunction.random(3) != 1) { + player.getPacketDispatch().sendMessage("...and sneak past while they're not looking."); + player.getProperties().setTeleportLocation(getLocations()[getIndex(object)]); + } else { + player.getPacketDispatch().sendMessage("You fail to distract the eyes."); + return true; + } + return true; + } + count++; + return false; + } + + @Override + public void stop() { + super.stop(); + player.animate(new Animation(-1, Priority.HIGH)); + } + }); + } + }, + PASSAGE("go-through", new Location[] { Location.create(3040, 4844, 0) }, 7154) { + @Override + public void handle(final Player player, final GameObject object) { + player.getProperties().setTeleportLocation(getLocations()[0]); + } + }; + /** + * Constructs a new {@code RunecraftingOptionPlugin} {@code Object}. + * @param locations the locations. + * @param objects the objects. + */ + AbbysalObstacle(final String option, Location[] locations, int... objects) { + this.option = option; + this.objects = objects; + this.locations = locations; + this.option = option; + } + + /** + * Represents the option. + */ + private String option; + + /** + * Represents the corssing location. + */ + private final Location[] locations; + + /** + * Represents the object id. + */ + private final int[] objects; + + /** + * Gets the locations. + * @return The locations. + */ + public Location[] getLocations() { + return locations; + } + + /** + * Gets the objects. + * @return The objects. + */ + public int[] getObjects() { + return objects; + } + + /** + * Method used to get the abbysal obstacle. + * @param object the object. + * @return the AbbysalObstacle or Null. + */ + public static AbbysalObstacle forObject(final GameObject object) { + for (AbbysalObstacle obstacle : values()) { + for (int i : obstacle.getObjects()) { + if (i == object.getId()) { + return obstacle; + } + } + } + return null; + } + + /** + * Method used to get the index. + * @param object the object. + * @return the index. + */ + public int getIndex(final GameObject object) { + for (int i = 0; i < objects.length; i++) { + if (getObjects()[i] == object.getId()) { + return i; + } + } + return 0; + } + + /** + * Methhod used to handle the obstacle. + * @param player the player. + * @param object the object. + */ + public void handle(final Player player, final GameObject object) { + + } + + /** + * Gets the option. + * @return The option. + */ + public String getOption() { + return option; + } + + /** + * Sets the tool used. + */ + private static SkillingTool setTool(final boolean mining, final Player player) { + SkillingTool tool = null; + if (!mining) { + if (checkTool(player, SkillingTool.DRAGON_AXE)) { + tool = SkillingTool.DRAGON_AXE; + } else if (checkTool(player, SkillingTool.RUNE_AXE)) { + tool = SkillingTool.RUNE_AXE; + } else if (checkTool(player, SkillingTool.ADAMANT_AXE)) { + tool = SkillingTool.ADAMANT_AXE; + } else if (checkTool(player, SkillingTool.MITHRIL_AXE)) { + tool = SkillingTool.MITHRIL_AXE; + } else if (checkTool(player, SkillingTool.BLACK_AXE)) { + tool = SkillingTool.BLACK_AXE; + } else if (checkTool(player, SkillingTool.STEEL_AXE)) { + tool = SkillingTool.STEEL_AXE; + } else if (checkTool(player, SkillingTool.IRON_AXE)) { + tool = SkillingTool.IRON_AXE; + } else if (checkTool(player, SkillingTool.BRONZE_AXE)) { + tool = SkillingTool.BRONZE_AXE; + } + } else { + if (checkTool(player, SkillingTool.RUNE_PICKAXE)) { + tool = SkillingTool.RUNE_PICKAXE; + } else if (checkTool(player, SkillingTool.ADAMANT_PICKAXE)) { + tool = SkillingTool.ADAMANT_PICKAXE; + } else if (checkTool(player, SkillingTool.MITHRIL_PICKAXE)) { + tool = SkillingTool.MITHRIL_PICKAXE; + } else if (checkTool(player, SkillingTool.STEEL_PICKAXE)) { + tool = SkillingTool.STEEL_PICKAXE; + } else if (checkTool(player, SkillingTool.IRON_PICKAXE)) { + tool = SkillingTool.IRON_PICKAXE; + } else if (checkTool(player, SkillingTool.BRONZE_PICKAXE)) { + tool = SkillingTool.BRONZE_PICKAXE; + } + } + return tool; + } + + /** + * Checks if the player has a tool and if he can use it. + * @param tool The tool. + * @return {@code True} if the tool is usable. + */ + private static boolean checkTool(final Player player, SkillingTool tool) { + if (player.getEquipment().contains(tool.getId(), 1)) { + return true; + } + return player.getInventory().contains(tool.getId(), 1); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/AbyssalNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/AbyssalNPC.java new file mode 100644 index 000000000..25850c2ac --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/AbyssalNPC.java @@ -0,0 +1,91 @@ +package core.game.node.entity.skill.runecrafting.abyss; + +import core.game.node.entity.skill.runecrafting.RunePouch; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +/** + * Handles an abyssal npc. + * @author Vexia + */ +public final class AbyssalNPC extends AbstractNPC { + + /** + * Constructs a new {@code AbyssalNPC} {@code Object}. + */ + public AbyssalNPC() { + super(0, null, true); + setAggressive(true); + } + + /** + * Constructs a new {@code AbyssalNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public AbyssalNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new AbyssalNPC(id, location); + } + + @Override + public void init() { + super.init(); + this.setDefaultBehavior(); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + Player p = killer.asPlayer(); + if (RandomFunction.random(750) < 12) { + Item pouch = getPouch(p); + if (pouch != null) { + getDefinition().getDropTables().createDrop(pouch, p, this, getLocation()); + } + } + } + } + + /** + * Gets the next pouch item. + * @param player the player. + * @return the pouch. + */ + private Item getPouch(Player player) { + Item pouch = RunePouch.SMALL.getPouch(); + if (player.hasItem(pouch)) { + pouch = RunePouch.MEDIUM.getPouch(); + } + if (player.hasItem(RunePouch.MEDIUM.getPouch()) || player.hasItem(RunePouch.MEDIUM.getDecayedPouch())) { + pouch = RunePouch.LARGE.getPouch(); + } + if (player.hasItem(RunePouch.LARGE.getPouch()) || player.hasItem(RunePouch.LARGE.getDecayedPouch())) { + pouch = RunePouch.GIANT.getPouch(); + } + if (player.hasItem(RunePouch.GIANT.getPouch()) || player.hasItem(RunePouch.GIANT.getDecayedPouch())) { + pouch = null; + } + return pouch; + } + + @Override + public int[] getIds() { + return new int[] { 2263, 2264, 2265 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/DarkMageDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/DarkMageDialogue.java new file mode 100644 index 000000000..e5f13ca58 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/DarkMageDialogue.java @@ -0,0 +1,172 @@ +package core.game.node.entity.skill.runecrafting.abyss; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Handles the dark mages dialogue. + * @author Vexia + */ +public final class DarkMageDialogue extends DialoguePlugin { + + /** + * Constructs a new {@code DarkMageDialogue} {@code Object}. + */ + public DarkMageDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code DarkMageDialogue} {@code Object}. + * @param player the player. + */ + public DarkMageDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new DarkMageDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + if (args.length >= 2) { + if (repair()) { + npc("There, I have repaired your pouches.", "Now leave me alone. I'm concentrating."); + stage = 30; + return true; + } else { + npc("You don't seem to have any pouches in need of repair.", "Leave me alone."); + stage = 30; + return true; + } + } + player("Hello there."); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + npc("Quiet!", "You must not break my concentration!"); + stage++; + break; + case 1: + options("Why not?", "What are you doing here?", "Can you repair my pouches?","Ok, Sorry"); + stage++; + break; + case 2: + switch (buttonId) { + case 1: + player("Why not?"); + stage = 10; + break; + case 2: + player("What are you doing here?"); + stage = 20; + break; + case 3: + player("Can you repair my pouches, please?"); + stage = 50; + break; + case 4: + player("Ok, sorry."); + stage = 30; + break; + } + break; + case 10: + npc("Well, if my concentration is broken while keeping this", "gate open, then if we are lucky, everyone within a one", "mile radius will either have their heads explode, or will be", "consumed internally by the creatures of the Abyss."); + stage++; + break; + case 11: + player("Erm...", "And if we are unlucky?"); + stage++; + break; + case 12: + npc("If we are unlucky, then the entire universe will begin", "to fold in upon itself, and all reality as we know it will", "be annihilated in a single stroke."); + stage++; + break; + case 13: + npc("So leave me alone!"); + stage = 30; + break; + case 20: + npc("Do you mean what am I doing here in Abyssal space,", "Or are you asking me what I consider my ultimate role", "to be in this voyage that we call life?"); + stage++; + break; + case 21: + player("Um... the first one."); + stage++; + break; + case 22: + npc("By remaining here and holding this portal open, I am", "providing a permanent link between normal space and", "this strange dimension that we call Abyssal space."); + stage++; + break; + case 23: + npc("As long as this spell remains in effect, we have the", "capability to teleport into abyssal space at will."); + stage++; + break; + case 24: + npc("Now leave me be!", "I can afford no distraction in my task!"); + stage = 30; + break; + case 30: + end(); + break; + case 50: + npc("Fine, fine! Give them here."); + stage++; + break; + case 51: + repair(); + npc("There, I've repaired them all.","Now get out of my sight!"); + stage = 30; + break; + } + return true; + } + + /** + * Repairs pouches. + */ + private boolean repair() { + player.pouchManager.getPouches().forEach((id, pouch) -> { + pouch.setCurrentCap(pouch.getCapacity()); + pouch.setCharges(10); + Item essence = null; + if(!pouch.getContainer().isEmpty()){ + int ess = pouch.getContainer().get(0).getId(); + int amount = pouch.getContainer().getAmount(ess); + essence = new Item(ess,amount); + } + pouch.remakeContainer(); + if(essence != null){ + pouch.getContainer().add(essence); + } + if(id != 5509) { + if (player.getInventory().contains(id + 1, 1)) { + player.getInventory().remove(new Item(id + 1, 1)); + player.getInventory().add(new Item(id, 1)); + } + if (player.getBank().contains(id + 1, 1)) { + player.getBank().remove(new Item(id + 1, 1)); + player.getBank().add(new Item(id, 1)); + } + } + }); + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2262 }; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/ZamorakMageDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/ZamorakMageDialogue.java new file mode 100644 index 000000000..519fe98cc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/runecrafting/abyss/ZamorakMageDialogue.java @@ -0,0 +1,473 @@ +package core.game.node.entity.skill.runecrafting.abyss; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + + +/** + * Handles the zamorak mages dialogue. + * @author Vexia + */ +public final class ZamorakMageDialogue extends DialoguePlugin { + + /** + * The scrying orbs. + */ + private static final Item[] ORBS = new Item[] { new Item(5519), new Item(5518) }; + + /** + * If its the varrock mage. + */ + private boolean varrockMage; + + /** + * Constructs a new {@code ZamorakMageDialogue} {@code Object}. + */ + public ZamorakMageDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code ZamorakMageDialogue} {@code Object}. + * @param player the player. + */ + public ZamorakMageDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new ZamorakMageDialogue(player); + } + + @Override + public boolean open(Object... args) { + npc = (NPC) args[0]; + varrockMage = npc.getId() == 2261 || npc.getId() == 2260; + if (!player.getQuestRepository().isComplete("Rune Mysteries")) { + end(); + player.sendMessage("The mage doesn't seem interested in talking to you."); + return true; + } + if (!varrockMage) { + switch (getStage()) { + case 0: + npc("Meet me in Varrock's Chaos Temple.", "Here is not the place to talk."); + break; + case 1: + case 2: + case 3: + npc("I already told you!", "meet me in the Varrock Chaos Temple!"); + break; + case 4: + npc("This is no place to talk!", "Meet me at the Varrock Chaos Temple!"); + break; + } + } else { + switch (getStage()) { + case 0: + npc("I am in no mood to talk to you", "stranger!"); + break; + case 1: + npc("Ah, you again.", "What was it you wanted?", "The wilderness is hardly the appropriate place for a", "conversation now, is it?"); + break; + case 2: + npc("Well?", "Have you managed to use my scrying orb to obtain the", "information yet?"); + break; + case 3: + player("So... that's my end of the deal upheld.", "What do I get in return?"); + break; + case 4: + options("So what is this 'abyss' stuff?", "Is this abyss dangerous?", "Can you teleport me there now?"); + break; + } + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (!varrockMage) { + switch (getStage()) { + case 0: + setStage(1); + end(); + break; + case 1: + case 2: + case 3: + case 4: + end(); + break; + } + } else { + switch (getStage()) { + case 0: + end(); + break; + case 1: + switch (stage) { + case 0: + options("I'd like to buy some runes!", "Where do you get your runes from?", "All hail Zamorak!", "Nothing, thanks."); + stage++; + break; + case 1: + switch (buttonId) { + case 1: + player("I'd like to buy some runes!"); + stage = 10; + break; + case 2: + player("Where do you get your runes from?", "No offence, but people around here don't exactly like", "'your type'."); + stage = 20; + break; + case 3: + player("All hail Zamorak!", "He's the man!", "If he can't do it, maybe some other guy can!"); + stage = 30; + break; + case 4: + player("I didn't really want anything, thanks.", "I just like talking to random people I meet around the", "world."); + stage = 40; + break; + } + break; + case 10: + npc("I do not conduct business in this pathetic city.", "Speak to me in the wilderness if you desire to purchase", "runes from me."); + stage++; + break; + case 11: + end(); + break; + case 20: + npc("My 'type' Explain."); + stage++; + break; + case 21: + player("You know...", "Scary bearded men in dark clothing with unhealthy", "obsessions with destruction and stuff."); + stage++; + break; + case 22: + npc("Hmmm.", "Well, you may be right, the foolish Saradominists that", "own this pathetic city don't appreciate loyal Zamorakians,", "it is true."); + stage++; + break; + case 23: + player("So you can't be getting your runes anywhere around", "here..."); + stage++; + break; + case 24: + npc("That is correct stranger.", "My mysteries of manufacturing Runes is a closely", "guarded secret of the Zamorakian brotherhood."); + stage++; + break; + case 25: + player("Oh, you mean the whole teleporting to the Rune", "essence mine, mining some essence, then using the", "talismans to locate the Rune Temples, then binding", "runes there?"); + stage++; + break; + case 26: + player("I know all about it..."); + stage++; + break; + case 27: + npc("WHAT?", "I... but... you..."); + stage++; + break; + case 28: + npc("Tell me, this is important:", "You know of the ancient temples?", "You have been to a place where this 'rune essence'", "material is freely available?"); + stage++; + break; + case 29: + npc("How did you get to such place?"); + stage = 200; + break; + case 200: + player("Well, I helped deliver some research notes to Sedridor", "at the Wizards Tower, and he teleported me to a huge", "mine he said was hidden off to the North somewhere", "where I could mine essence."); + stage++; + break; + case 201: + npc("And there is an ubundant supply of this 'essence' there", "you say?"); + stage++; + break; + case 202: + player("Yes, but I thought you said that you knew how to make", "runes?", "All this stuff is fairly basic knowledge I thought."); + stage++; + break; + case 203: + npc("No.", "No, not at all."); + stage++; + break; + case 204: + npc("We occasionally manage to plunder small samples of this", "'essence' and we have recently discovered these temples", "you speak of, but I have never ever heard of these talismans", "before, and I was certainly not aware that this 'essence'"); + stage++; + break; + case 205: + npc("substance is a heavily stockpiled resource at the Wizards", "Tower."); + stage++; + break; + case 206: + npc("This changes everything."); + stage++; + break; + case 207: + player("How do you mean?"); + stage++; + break; + case 208: + npc("For many years there has been a struggle for power", "on this world.", "You may dispute the morality of each side as you wish,", "but the stalemate that exists between my Lord Zamorak"); + stage++; + break; + case 209: + npc("and that pathetic meddling fool Saradomin has meant", "that our struggle have become more secretive.", "We exist in a 'cold war' if you will, each side fearful of", "letting the other gain too much power, and each side"); + stage++; + break; + case 210: + npc("equally fearful of entering into open warfare for fear of", "bringing our struggles to the attention of... other", "beings."); + stage++; + break; + case 211: + player("You mean Guthix?"); + stage++; + break; + case 212: + npc("Indeed.", "Amongst others.", "But you now tell me that the Saradominist Wizards", "have the capability to mass produce runes, I can only"); + stage++; + break; + case 213: + npc("conclude that they have been doing so secretly for some", "time now."); + stage++; + break; + case 214: + npc("I implore you adventurer, you may or may not agree", "with my aims, but you cannot allow such a one-sided", "shift in the balance of power to occur."); + stage++; + break; + case 215: + npc("Will you help me and my fellow Zamorakians to access", "this 'essence' mine?", "In return I will share with you the research we have", "gathered."); + stage++; + break; + case 216: + player("Okay, I'll help you.", "What can I do?"); + stage++; + break; + case 217: + npc("All I need from you is the spell that will teleport me to", "this essence mine.", "That should be sufficient for the armies of Zamorak to", "once more begin stockpiling magic for war."); + stage++; + break; + case 218: + player("Oh.", "Erm...", "I don't actually know that spell."); + stage++; + break; + case 219: + npc("What?", "Then how do you access this location?"); + stage++; + break; + case 220: + player("Oh, well, people who do know the spell teleport me there", "directly.", "Apparently they wouldn't teach it to me to try and keep", "the location secret."); + stage++; + break; + case 221: + npc("Hmmm.", "Yes, yes I see.", "Very well then, you may still assist us in finding this", "mysterious essence mine."); + stage++; + break; + case 222: + player("How would I do that?"); + stage++; + break; + case 223: + setStage(2); + player.getInventory().add(ORBS[0], player); + npc("Here, take this scrying orb.", "I have cast a standard cypher spell upon it, so that it", "will absorb mystical energies that it is exposed to."); + stage++; + break; + case 30: + end(); + break; + case 40: + npc("...I see.", "Well, in the future, do not waste my time, or you will", "feel the wrath of Zamorak upon you."); + stage++; + break; + case 41: + end(); + break; + } + break; + case 2: + switch (stage) { + case 0: + if (!player.hasItem(ORBS[0]) && !player.getInventory().containsItem(ORBS[1])) { + player("Uh...", "No...", "I kinda lost that orb thingy that you have me."); + stage++; + break; + } + if (!player.getInventory().containsItem(ORBS[1])) { + player("No...", "Actually, I had something I wanted to ask you..."); + stage = 3; + } else { + player("Yes I have! I've got it right here!"); + stage = 50; + } + break; + case 1: + player.getInventory().add(ORBS[0], player); + npc("What?", "Incompetent fool. Take this.", "And do not make me refret allying myself with you."); + stage++; + break; + case 2: + end(); + break; + case 3: + npc("I assume the task to be self-explainatory.", "What is it you wish to know?"); + stage++; + break; + case 4: + player("Please excuse me, I have a very bad short term", "memory.", "What exactly am I supposed to be doing again?"); + stage++; + break; + case 5: + npc("All I wish for you to do is to teleport to this 'rune", "essence' location from three different locations wile", "carrying the scrying orb I gave you.", "It will collect the data as you teleport."); + stage++; + break; + case 6: + end(); + break; + case 224: + npc("Bring it with you and teleport to the rune essence", "location, and it will absorb the mechanics of the spell and", "allow us to reverse-engineer the magic behind it."); + stage++; + break; + case 225: + npc("The important part is that you must teleport to the", "essence location from three entirely seperate locations."); + stage++; + break; + case 226: + npc("More than three may be helpful to us, but we need a", "minimum of three in order to triangulate the position of", "this essence mine."); + stage++; + break; + case 227: + npc("Is that all clear, stranger?"); + stage++; + break; + case 228: + player("Yeah, I think so."); + stage++; + break; + case 229: + npc("Good.", "If you encounter any difficulties speak to me again."); + stage++; + break; + case 230: + end(); + break; + case 50: + npc("Excellent.", "Give it here, and I shall examine the findings.", "Speak to me in a small while."); + stage++; + break; + case 51: + setStage(3); + player.getInventory().remove(ORBS[1]); + end(); + break; + } + break; + case 3: + switch (stage) { + case 0: + npc("Indeed, a deal is always a deal."); + stage++; + break; + case 1: + npc("I offer you three things as a reward for your efforts on", "behalf of my Lord Zamorak;"); + stage++; + break; + case 2: + npc("The first is knowledge.", "I offer you my collected research on the abyss.", "I also offer you 1000 points of experience in", "RuneCrafting for your trouble."); + stage++; + break; + case 3: + npc("Your second gift is convenience.", "Here you may take this pouch I discovered amidst my", "research.", "You will find it to have certain... interesting properties."); + stage++; + break; + case 4: + npc("Your final gift is that of movement", "I will from now on offer you a teleport to the abyss", "whenever you should require it."); + stage++; + break; + case 5: + setStage(4); + player.getInventory().add(new Item(5520), player); + player.getInventory().add(new Item(5509), player); + player.getSkills().addExperience(Skills.RUNECRAFTING, 1000); + player("Huh?", "Abyss?", "What are you talking about?", "You told me that you would help me with"); + stage++; + break; + } + break; + case 4: + switch (stage) { + case 0: + switch (buttonId) { + case 1: + player("Uh...", "I really don't see how this talk about an 'abyss' relates", "to RuneCrafting in the slightest..."); + stage = 10; + break; + case 2: + player("So...", "This 'abyss' place...", "Is it dangerous?"); + stage = 20; + break; + case 3: + player("Well, I reckon I'm prepared to go there now.", "Beam me there, or whatever it is that you do!"); + stage = 30; + break; + } + break; + case 10: + npc("My primary research responsibility was not towards the", "manufacture of runes, this is true."); + stage = 8; + break; + case 20: + npc("Well, the creates there ARE particularly offensive..."); + stage = 8; + break; + case 30: + npc("No, not from here.", "The use of my Lord Zamorak magic in this land will", "draw too much attention to myself."); + stage = 8; + break; + case 6: + player("RuneCrafting!"); + stage++; + break; + case 7: + npc("And so I have done.", "Read my research notes, they may enlighten you", "somewhat."); + stage++; + break; + case 8: + end(); + break; + } + break; + } + } + return true; + } + + @Override + public int[] getIds() { + return new int[] { 2257, 2258, 2259, 2260, 2261 }; + } + + /** + * Sets the stage. + * @param stage the stage. + */ + public void setStage(int stage) { + player.getConfigManager().set(492, stage, true); + } + + /** + * Gets the stage. + * @return the stage. + */ + public int getStage() { + return player.getConfigManager().get(492); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/Skillcape.kt b/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/Skillcape.kt new file mode 100644 index 000000000..9ebfe55b5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/Skillcape.kt @@ -0,0 +1,62 @@ +package core.game.node.entity.skill.skillcapeperks + +enum class Skillcape { + ATTACK, + STRENGTH, + DEFENCE, + RANGING, + PRAYER, + MAGIC, + RUNECRAFTING, + HITPOINTS, + AGILITY, + HERBLORE, + THIEVING, + CRAFTING, + FLETCHING, + SLAYER, + CONSTRUCTION, + MINING, + SMITHING, + FISHING, + COOKING, + FIREMAKING, + WOODCUTTING, + FARMING, + HUNTING, + SUMMONING, + NONE + ; + companion object{ + @JvmStatic + fun forId(id: Int): Skillcape{ + return when(id){ + 9747,9748 -> ATTACK + 9750,9751 -> STRENGTH + 9753,9754 -> DEFENCE + 9756,9757 -> RANGING + 9759,9760 -> PRAYER + 9762,9763 -> MAGIC //magic + 9765,9766 -> RUNECRAFTING //runecrafting + 9768,9769 -> HITPOINTS //hp + 9771,9772 -> AGILITY //agility + 9774,9775 -> HERBLORE //herblore + 9777,9778 -> THIEVING //thieving + 9780,9781 -> CRAFTING //crafting + 9783,9784 -> FLETCHING //fletching + 9786,9787 -> SLAYER //slayer + 9789,9790 -> CONSTRUCTION //construction + 9792,9793 -> MINING //mining + 9795,9796 -> SMITHING //smithing + 9798,9799 -> FISHING //fishing + 9801,9802 -> COOKING //cooking + 9804,9805 -> FIREMAKING //firemaking + 9807,9808 -> WOODCUTTING //woodcutting + 9810,9811 -> FARMING //farming + 9948,9949 -> HUNTING //hunting + 12169,12170 -> SUMMONING //summoning + else -> NONE + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPlugin.kt new file mode 100644 index 000000000..6e7c23c13 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeEquipmentPlugin.kt @@ -0,0 +1,40 @@ +package core.game.node.entity.skill.skillcapeperks + +import core.cache.def.impl.ItemDefinition +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class SkillcapeEquipmentPlugin : Plugin { + override fun newInstance(arg: Item?): Plugin { + for(cape in core.game.content.global.SkillcapePerks.values()){ + cape.skillcapeIds.forEach { + ItemDefinition.forId(it).handlers["equipment"] = this + } + } + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + val player = args[0] as Player + val id = (args[1] as Item).id + + val skillcape = Skillcape.forId(id) + val perk = SkillcapePerks.forSkillcape(skillcape) + + when(identifier){ + + "equip" -> { + perk.activate(player) + } + + "unequip" -> { + perk.deactivate(player) + } + } + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin.kt b/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin.kt new file mode 100644 index 000000000..15f4d6e75 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapeOperatePlugin.kt @@ -0,0 +1,30 @@ +package core.game.node.entity.skill.skillcapeperks + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +class SkillcapeOperatePlugin : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + for(cape in core.game.content.global.SkillcapePerks.values()){ + cape.skillcapeIds.forEach { + ItemDefinition.forId(it).handlers["option:operate"] = this + } + } + return this + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + val skillcape = Skillcape.forId(node?.id ?: 0) + val perk = SkillcapePerks.forSkillcape(skillcape) + + perk.operate(player) + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapePerks.kt b/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapePerks.kt new file mode 100644 index 000000000..95c380ded --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/skillcapeperks/SkillcapePerks.kt @@ -0,0 +1,253 @@ +package core.game.node.entity.skill.skillcapeperks + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.SpellBookManager +import core.game.node.entity.player.link.TeleportManager +import core.game.world.map.zone.impl.DarkZone +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.game.node.entity.skill.runecrafting.Altar +import core.game.world.GameWorld + +enum class SkillcapePerks(val attribute: String, val effect: ((Player) -> Unit)? = null) { + BAREFISTED_SMITHING("cape_perks:barefisted-smithing"), + DIVINE_FAVOR("cape_perks:divine-favor"), + CONSTANT_GLOW("cape_perks:eternal-glow"), + PRECISION_MINER("cape_perks:precision-miner"), + GREAT_AIM("cape_perks:great-aim"), + NEST_HUNTER("cape_perks:nest-hunter"), + PRECISION_STRIKES("cape_perks:precision-strikes"), + FINE_ATTUNEMENT("cape_perks:fine-attunement"), + GRAND_BULLWARK("cape_perks:grand-bullwark"), + ACCURATE_MARKSMAN("cape_perks:accurate-marksman"), + DAMAGE_SPONG("cape_perks:damage-sponge"), + MARATHON_RUNNER("cape_perks:marathon-runner"), + LIBRARIAN_MAGUS("cape_perks:librarian-magus",{player -> + val time = player.getAttribute("cape_perks:librarian-magus-timer",0L) + if(player.getAttribute("cape_perks:librarian-magus-charges",2) > 0 || System.currentTimeMillis() > time){ + if(System.currentTimeMillis() > time) player.setAttribute("/save:cape_perks:librarian-magus-charges",3) + player.dialogueInterpreter.open(509871234) + if(System.currentTimeMillis() > time) + player.setAttribute("/save:cape_perks:librarian-magus-timer",System.currentTimeMillis() + java.util.concurrent.TimeUnit.DAYS.toMillis(1)) + } + }), + ABYSS_WARPING("cape_perks:abyss_warp",{ player -> + val time = player.getAttribute("cape_perks:abyssal_warp_timer",0L) + if(player.getAttribute("cape_perks:abyssal_warp",3) > 0 || System.currentTimeMillis() > time){ + if(System.currentTimeMillis() > time) player.setAttribute("/save:cape_perks:abyssal_warp",3) + player.dialogueInterpreter.open(509871233) + if(System.currentTimeMillis() > time) + player.setAttribute("/save:cape_perks:abyssal_warp_timer",System.currentTimeMillis() + java.util.concurrent.TimeUnit.DAYS.toMillis(1)) + } else { + player.dialogueInterpreter.sendDialogue("Your cape is still on cooldown.","Ready in " + java.util.concurrent.TimeUnit.MILLISECONDS.toMinutes(time - System.currentTimeMillis()) + " minutes.") + } + }), + SEED_ATTRACTION("cape_perks:seed_attract",{player -> + val time = player.getAttribute("cape_perks:seed_attract_timer",0L) + if(System.currentTimeMillis() > time){ + /*for(i in 0 until 10) { + when (core.tools.RandomFunction.random(100) % 4) { + 0 -> { + val seedID = core.game.node.entity.skill.farming.patch.Allotments.values().random().farmingNode.seed.id + player.inventory.add(core.game.node.item.Item(seedID,1)) + } + 1 -> { + val seedID = core.game.node.entity.skill.farming.patch.Herbs.values().random().farmingNode.seed.id + player.inventory.add(core.game.node.item.Item(seedID, 1)) + } + 2 -> { + val seedID = core.game.node.entity.skill.farming.patch.Hops.values().random().farmingNode.seed.id + player.inventory.add(core.game.node.item.Item(seedID, 1)) + } + 3 -> { + val seedID = core.game.node.entity.skill.farming.patch.Flowers.values().random().farmingNode.seed.id + player.inventory.add(core.game.node.item.Item(seedID, 1)) + } + } + }*/ + player.dialogueInterpreter.sendDialogue("You pluck off the seeds that were stuck to your cape.") + player.setAttribute("/save:cape_perks:seed_attract_timer",System.currentTimeMillis() + java.util.concurrent.TimeUnit.DAYS.toMillis(1)) + } else { + player.dialogueInterpreter.sendDialogue("Your cape is still on cooldown.","Ready in " + java.util.concurrent.TimeUnit.MILLISECONDS.toMinutes(time - System.currentTimeMillis()) + " minutes.") + } + }), + NONE("cape_perks:none") + ; + + companion object{ + @JvmStatic + fun isActive(perk: SkillcapePerks, player: Player): Boolean{ + return player.getAttribute(perk.attribute,false) + } + + fun forSkillcape(skillcape: Skillcape): SkillcapePerks{ + return when(skillcape){ + Skillcape.ATTACK -> PRECISION_STRIKES + Skillcape.STRENGTH -> FINE_ATTUNEMENT + Skillcape.DEFENCE -> GRAND_BULLWARK + Skillcape.RANGING -> ACCURATE_MARKSMAN + Skillcape.PRAYER -> DIVINE_FAVOR + Skillcape.MAGIC -> LIBRARIAN_MAGUS + Skillcape.RUNECRAFTING -> ABYSS_WARPING + Skillcape.HITPOINTS -> DAMAGE_SPONG + Skillcape.AGILITY -> MARATHON_RUNNER + Skillcape.HERBLORE -> NONE + Skillcape.THIEVING -> NONE + Skillcape.CRAFTING -> NONE + Skillcape.FLETCHING -> NONE + Skillcape.SLAYER -> NONE + Skillcape.CONSTRUCTION -> NONE + Skillcape.MINING -> PRECISION_MINER + Skillcape.SMITHING -> BAREFISTED_SMITHING + Skillcape.FISHING -> GREAT_AIM + Skillcape.COOKING -> NONE + Skillcape.FIREMAKING -> CONSTANT_GLOW + Skillcape.WOODCUTTING -> NONE + Skillcape.FARMING -> SEED_ATTRACTION + Skillcape.HUNTING -> NONE + Skillcape.SUMMONING -> NONE + else -> NONE + } + } + } + + fun activate(player: Player){ + if(GameWorld.settings?.skillcape_perks != true){ + return + } + if(!isActive(this,player)){ + player.setAttribute("/save:$attribute",true) + } + if(this == CONSTANT_GLOW) + DarkZone.checkDarkArea(player) + } + + fun operate(player: Player){ + if(GameWorld.settings?.skillcape_perks != true){ + player.sendMessage("This item can not be operated.") + return + } + effect?.invoke(player) + } + + fun deactivate(player: Player){ + player.removeAttribute(attribute) + if(this == CONSTANT_GLOW) + DarkZone.checkDarkArea(player) + } + + @Initializable + class MagicCapeDialogue(player: Player? = null): DialoguePlugin(player){ + override fun newInstance(player: Player?): DialoguePlugin { + return MagicCapeDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + when(player.spellBookManager.spellBook){ + SpellBookManager.SpellBook.ANCIENT.interfaceId -> options("Modern","Lunar") + SpellBookManager.SpellBook.MODERN.interfaceId -> options("Ancient","Lunar") + SpellBookManager.SpellBook.LUNAR.interfaceId -> options ("Modern","Ancient") + } + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + val spellbook = when(player.spellBookManager.spellBook){ + SpellBookManager.SpellBook.ANCIENT.interfaceId -> { + when(buttonId){ + 1 -> SpellBookManager.SpellBook.MODERN + 2 -> SpellBookManager.SpellBook.LUNAR + else -> null + } + } + + SpellBookManager.SpellBook.MODERN.interfaceId -> { + when(buttonId){ + 1 -> SpellBookManager.SpellBook.ANCIENT + 2 -> SpellBookManager.SpellBook.LUNAR + else -> null + } + } + + SpellBookManager.SpellBook.LUNAR.interfaceId -> { + when(buttonId){ + 1 -> SpellBookManager.SpellBook.MODERN + 2 -> SpellBookManager.SpellBook.ANCIENT + else -> null + } + } + + else -> null + } + + if(spellbook != null){ + player.spellBookManager.setSpellBook(spellbook) + player.interfaceManager.openTab(Component(spellbook.interfaceId)) + player.incrementAttribute("/save:cape_perks:librarian-magus-charges",-1) + } + end() + return true + } + + override fun getIds(): IntArray { + return intArrayOf(509871234) + } + + } + + @Initializable + class RCCapeDialogue(player: Player? = null) : DialoguePlugin(player){ + override fun newInstance(player: Player?): DialoguePlugin { + return RCCapeDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + options("Air","Mind","Water","Earth","More...") + stage = 0; + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> when(buttonId){ + 1 -> sendAltar(player,Altar.AIR) + 2 -> sendAltar(player,Altar.MIND) + 3 -> sendAltar(player,Altar.WATER) + 4 -> sendAltar(player,Altar.EARTH) + 5 -> options("Fire","Body","Cosmic","Chaos","More...").also { stage++ } + } + 1 -> when(buttonId){ + 1 -> sendAltar(player,Altar.FIRE) + 2 -> sendAltar(player,Altar.BODY) + 3 -> sendAltar(player,Altar.COSMIC) + 4 -> sendAltar(player,Altar.CHAOS) + 5 -> options("Astral","Nature","Law","Death","More...").also { stage++ } + } + 2 -> when(buttonId){ + 1 -> sendAltar(player,Altar.ASTRAL) + 2 -> sendAltar(player,Altar.NATURE) + 3 -> sendAltar(player,Altar.LAW) + 4 -> sendAltar(player,Altar.DEATH) + 5 -> options("Blood","Nevermind").also { stage++ } + } + 3 -> when(buttonId){ + 1 -> sendAltar(player,Altar.BLOOD) + 2 -> end() + } + } + return true + } + + fun sendAltar(player: Player,altar: Altar){ + end() + player.teleporter.send(altar.ruin.end,TeleportManager.TeleportType.TELE_OTHER) + player.incrementAttribute("/save:cape_perks:abyssal_warp",-1) + } + + override fun getIds(): IntArray { + return intArrayOf(509871233) + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/AberrantSpectreNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/AberrantSpectreNPC.java new file mode 100644 index 000000000..fdfc7fce1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/AberrantSpectreNPC.java @@ -0,0 +1,86 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.handlers.MagicSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Handles the aberrant spectre npc. + * @author Vexia + */ +@Initializable +public final class AberrantSpectreNPC extends AbstractNPC { + + /** + * The skills to drain. + */ + private static final int[] SKILLS = new int[] { Skills.ATTACK, Skills.STRENGTH, Skills.DEFENCE, Skills.RANGE, Skills.MAGIC, Skills.PRAYER, Skills.AGILITY }; + + /** + * The combat handler to use. + */ + private static final MagicSwingHandler COMBAT_HANDLER = new MagicSwingHandler() { + @Override + public void impact(final Entity entity, final Entity victim, BattleState state) { + if (victim instanceof Player) { + Player player = (Player) victim; + if (!Equipment.NOSE_PEG.hasEquipment(player)) { + for (int skill : SKILLS) { + int drain = (int) (player.getSkills().getStaticLevel(skill) * 0.5); + player.getSkills().updateLevel(skill, -drain, 0); + } + } + } + super.impact(entity, victim, state); + } + }; + + /** + * Constructs a new {@code AberrantSpectreNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public AberrantSpectreNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code AberrantSpectreNPC} {@code Object}. + */ + public AberrantSpectreNPC() { + super(0, null); + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + if (state.getAttacker() instanceof Player) { + final Player player = (Player) state.getAttacker(); + if (!Equipment.NOSE_PEG.hasEquipment(player)) { + state.neutralizeHits(); + } + } + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return COMBAT_HANDLER; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new AberrantSpectreNPC(id, location); + } + + @Override + public int[] getIds() { + return Tasks.ABERRANT_SPECTRES.getNpcs(); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/AbyssalDemonNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/AbyssalDemonNPC.java new file mode 100644 index 000000000..e386f276c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/AbyssalDemonNPC.java @@ -0,0 +1,75 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the abyssal npc. + * @author Vexia + */ +@Initializable +public class AbyssalDemonNPC extends AbstractNPC { + + /** + * The melee swing handler. + */ + private static final MeleeSwingHandler SWING_HANDLER = new MeleeSwingHandler() { + + @Override + public int swing(Entity entity, Entity victim, BattleState state) { + if (victim instanceof Player && RandomFunction.random(8) <= 2) { + boolean npc = RandomFunction.random(100) <= 50; + Entity source = npc ? victim : entity; + Entity teleported = npc ? entity : victim; + Location loc = source.getLocation().transform(Direction.values()[RandomFunction.random(Direction.values().length)], 1); + if (loc != null && !loc.equals(source.getLocation()) && RegionManager.isTeleportPermitted(loc) && RegionManager.getObject(loc) == null) { + teleported.graphics(Graphics.create(409)); + teleported.teleport(loc, 1); + } + } + return super.swing(entity, victim, state); + } + }; + + /** + * Constructs a new {@Code AbyssalNPC} {@Code Object} + */ + public AbyssalDemonNPC() { + super(-1, null); + } + + /** + * Constructs a new {@Code AbyssalNPC} {@Code Object} + * @param id the id. + * @param location the location. + */ + public AbyssalDemonNPC(int id, Location location) { + super(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return SWING_HANDLER; + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new AbyssalDemonNPC(id, location); + } + + @Override + public int[] getIds() { + return Tasks.ABYSSAL_DEMONS.getNpcs(); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BansheeNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BansheeNPC.java new file mode 100644 index 000000000..8b28b0c8f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BansheeNPC.java @@ -0,0 +1,116 @@ +package core.game.node.entity.skill.slayer; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +/** + * Handles the banshee npc. + * @author Vexia + */ +@Initializable +public final class BansheeNPC extends AbstractNPC { + + /** + * The skills to drain. + */ + private static final int[] SKILLS = new int[] { Skills.ATTACK, Skills.STRENGTH, Skills.DEFENCE, Skills.RANGE, Skills.MAGIC, Skills.PRAYER, Skills.AGILITY }; + + /** + * The combat handler. + */ + private static final MeleeSwingHandler COMBAT_HANDLER = new MeleeSwingHandler() { + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (victim instanceof Player) { + final Player player = (Player) victim; + if (!hasEarMuffs(player)) { + if (RandomFunction.random(10) < 4 && player.getProperties().getCombatPulse().getNextAttack() <= GameWorld.getTicks()) { + player.getWalkingQueue().reset(); + player.getLocks().lockMovement(3); + player.getProperties().getCombatPulse().setNextAttack(3); + player.animate(new Animation(1572, Priority.HIGH)); + } + for (int skill : SKILLS) { + int drain = (int) (player.getSkills().getStaticLevel(skill) * 0.5); + player.getSkills().updateLevel(skill, -drain, 0); + } + state.setEstimatedHit(8); + } + } + super.impact(entity, victim, state); + } + + @Override + public InteractionType isAttackable(Entity entity, Entity victim) { + return CombatStyle.MAGIC.getSwingHandler().isAttackable(entity, victim); + } + }; + + /** + * Constructs a new {@code BansheeNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public BansheeNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code BansheeNPC} {@code Object}. + */ + public BansheeNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BansheeNPC(id, location); + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + if (state.getAttacker() instanceof Player) { + final Player player = (Player) state.getAttacker(); + if (!hasEarMuffs(player)) { + state.neutralizeHits(); + } + } + if (state.getEstimatedHit() > 0 || state.getSecondaryHit() > 0) { + getSkills().heal(1); + } + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return COMBAT_HANDLER; + } + + /** + * Checks if the player has ear muffs. + * @param player the player. + * @return {@code True} if they have it. + */ + public static boolean hasEarMuffs(Player player) { + return Equipment.EARMUFFS.hasEquipment(player); + } + + @Override + public int[] getIds() { + return new int[] { 1612 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BasiliskNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BasiliskNPC.java new file mode 100644 index 000000000..632f4b5bd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BasiliskNPC.java @@ -0,0 +1,53 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Handles the basilisk npc. + * @author Vexia + */ +@Initializable +public final class BasiliskNPC extends AbstractNPC { + + /** + * Constructs a new {@code BasiliskNPC} {@code Object}. + */ + public BasiliskNPC() { + super(0, null); + } + + /** + * Constructs a new {@code BasiliskNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public BasiliskNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BasiliskNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return MirrorShieldHandler.SINGLETON; + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + MirrorShieldHandler.SINGLETON.checkImpact(state); + } + + @Override + public int[] getIds() { + return new int[] { 1616, 1617 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BrutalDragonNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BrutalDragonNPC.java new file mode 100644 index 000000000..8f98916b6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BrutalDragonNPC.java @@ -0,0 +1,69 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.DragonfireSwingHandler; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; + +/** + * Handles a brutal dragon npc. + * @author Vexia + */ +@Initializable +public final class BrutalDragonNPC extends AbstractNPC { + + /** + * The dragonfire attack. + */ + private static final SwitchAttack DRAGONFIRE = DragonfireSwingHandler.get(false, 52, new Animation(81, Priority.HIGH), Graphics.create(1), null, null); + + /** + * Handles the combat. + */ + private final CombatSwingHandler combatAction = new MultiSwingHandler(true, new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), new Animation(80, Priority.HIGH)), new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), new Animation(80, Priority.HIGH)), new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), new Animation(81, Priority.HIGH), null, null, Projectile.create((Entity) null, null, 500, 20, 20, 41, 40, 18, 255)), DRAGONFIRE); + + /** + * Constructs a new {@code BrutalDragonNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public BrutalDragonNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code MithrilDragonNPC} {@code Object}. + */ + public BrutalDragonNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BrutalDragonNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatAction; + } + + @Override + public int getDragonfireProtection(boolean fire) { + return 0x2 | 0x4 | 0x8; + } + + @Override + public int[] getIds() { + return new int[] { 5362 }; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BugSwarmNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BugSwarmNPC.java new file mode 100644 index 000000000..2930c5089 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BugSwarmNPC.java @@ -0,0 +1,65 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Represents the plugin used to handle the harpie bug swarm. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BugSwarmNPC extends AbstractNPC { + + /** + * Represents the lit latern item. + */ + private static final Item LIT_LANTERN = new Item(7053); + + /** + * Constructs a new {@code BugSwarmNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public BugSwarmNPC(int id, Location location) { + super(id, location, true); + } + + /** + * Constructs a new {@code BugSwarmNPC} {@code Object}. + */ + public BugSwarmNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new BugSwarmNPC(id, location); + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + if (state.getAttacker() instanceof Player) { + final Player player = (Player) state.getAttacker(); + if (!player.getEquipment().containsItem(LIT_LANTERN)) { + if (state.getEstimatedHit() > -1) { + state.setEstimatedHit(0); + } + if (state.getSecondaryHit() > -1) { + state.setSecondaryHit(0); + } + } + } + } + + @Override + public int[] getIds() { + return new int[] { 3153 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BuglanternPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BuglanternPlugin.java new file mode 100644 index 000000000..656f96bbc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/BuglanternPlugin.java @@ -0,0 +1,95 @@ +package core.game.node.entity.skill.slayer; + +import core.cache.def.impl.ItemDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle a bug lantern. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class BuglanternPlugin implements Plugin { + + /** + * Represents the unlit lantern item. + */ + private static final Item UNLIT_LANTERN = new Item(7051); + + /** + * Represents the lit latern item. + */ + private static final Item LIT_LANTERN = new Item(7053); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new LightLanternPlugin().newInstance(arg); + ItemDefinition.forId(LIT_LANTERN.getId()).getHandlers().put("option:extinguish", new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getInventory().remove(LIT_LANTERN)) { + player.getInventory().add(UNLIT_LANTERN); + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + }); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Represents the plugin used to light the lantern. + * @author 'Vexia + * @version 1.0 + */ + public final class LightLanternPlugin extends UseWithHandler { + + /** + * Constructs a new {@code LightLanternPlugin} {@code Object}. + */ + public LightLanternPlugin() { + super(590); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(UNLIT_LANTERN.getId(), ITEM_TYPE, this); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getSkills().getLevel(Skills.FIREMAKING) < 33) { + player.sendMessage("You need a Firemaking level of at least 33 in order to do this."); + return true; + } + player.getInventory().replace(LIT_LANTERN, event.getUsedItem().getSlot()); + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/CaveBugNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/CaveBugNPC.java new file mode 100644 index 000000000..2f7d95015 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/CaveBugNPC.java @@ -0,0 +1,60 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Handles the cave bug npc. + * @author Vexia + * + */ +@Initializable +public class CaveBugNPC extends AbstractNPC { + + /** + * The cave border. + */ +// private static final ZoneBorders CAVE_BORDER = new ZoneBorders(3139, 9534, 3260, 9587); + + /** + * Constructs the {@code CaveBugNPC} + */ + public CaveBugNPC() { + super(-1, null); + } + + /** + * Constructs the {@code CaveBugNPC} + * @param id The id. + * @param location The location. + */ + public CaveBugNPC(int id, Location location) { + super(id, location); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + Player p = killer.asPlayer(); +/* AchievementDiary diary = p.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE); + if (!diary.isComplete(0, 0) && CAVE_BORDER.insideBorder(p)) { + diary.updateTask(p, 0, 0, true); + }*/ + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new CaveBugNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] {1832, 1833, 5750}; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/CaveHorrorNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/CaveHorrorNPC.java new file mode 100644 index 000000000..05d6fb796 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/CaveHorrorNPC.java @@ -0,0 +1,85 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the Cave Horrors on Mos'le Harmless. You technically do not need a witchwood icon to fight them. + * "Without the icon, cave horrors can damage the player for 10% of their total hitpoints, although it does not lower stats." + * @author Splinter + */ +@Initializable +public final class CaveHorrorNPC extends AbstractNPC { + /** + * The Cave Horror combat handler. + */ + private static final MeleeSwingHandler COMBAT_HANDLER = new MeleeSwingHandler() { + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (victim instanceof Player) { + final Player player = (Player) victim; + if (!hasWitchwood(player)) { + if (RandomFunction.random(10) < 5) { + state.setEstimatedHit(player.getSkills().getLifepoints() / 10); + } + } + } + super.impact(entity, victim, state); + } + + @Override + public InteractionType isAttackable(Entity entity, Entity victim) { + return CombatStyle.MELEE.getSwingHandler().isAttackable(entity, victim); + } + }; + + /** + * Constructs a new {@code CaveHorrorNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public CaveHorrorNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code CaveHorrorNPC} {@code Object}. + */ + public CaveHorrorNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new CaveHorrorNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return COMBAT_HANDLER; + } + + /** + * Checks if the player has the icon equipped. + * @param player the player. + * @return {@code true} if it is equipped. + */ + public static boolean hasWitchwood(Player player) { + return player.getEquipment().containsItem(Equipment.WITCHWOOD_ICON.getItem()); + } + + @Override + public int[] getIds() { + return new int[] { 4354, 4355, 4353, 4356, 4357 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/CockatriceNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/CockatriceNPC.java new file mode 100644 index 000000000..3fddadcc9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/CockatriceNPC.java @@ -0,0 +1,53 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Handles a cockatrice npc. + * @author Vexia + */ +@Initializable +public final class CockatriceNPC extends AbstractNPC { + + /** + * Constructs a new {@code CockatriceNPC} {@code Object}. + */ + public CockatriceNPC() { + super(0, null); + } + + /** + * Constructs a new {@code CockatriceNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public CockatriceNPC(int id, Location location) { + super(id, location); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new CockatriceNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return MirrorShieldHandler.SINGLETON; + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + MirrorShieldHandler.SINGLETON.checkImpact(state); + } + + @Override + public int[] getIds() { + return new int[] { 1620, 1621 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/DesertLizardPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/DesertLizardPlugin.java new file mode 100644 index 000000000..265d787d8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/DesertLizardPlugin.java @@ -0,0 +1,148 @@ +package core.game.node.entity.skill.slayer; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Represents the dezert lizard plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class DesertLizardPlugin implements Plugin { + + /** + * Represents the ids to use. + */ + private static final int[] IDS = new int[] { 2803, 2804, 2805, 2806, 2807, 2808 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + new IcecoolerPlugin().newInstance(arg); + new DezertLizardNPC().newInstance(arg); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Represents the ice cooler plugin. + * @author 'Vexia + * @version 1.0 + */ + public static final class IcecoolerPlugin extends UseWithHandler { + + /** + * Represents the ice cooler item. + */ + private static final Item ICE_COOLER = new Item(6696); + + /** + * Constructs a new {@code IcecoolerPlugin} {@code Object}. + */ + public IcecoolerPlugin() { + super(ICE_COOLER.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : IDS) { + addHandler(id, NPC_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getSkills().getLevel(Skills.SLAYER) < 22) { + player.getPacketDispatch().sendMessage("You need a Slayer level of at least 22 to do this."); + return true; + } + final NPC npc = (NPC) event.getUsedWith(); + if (npc.getSkills().getLifepoints() > 2) { + player.getPacketDispatch().sendMessage("The lizard isn't weak enough to be affected by the icy water."); + return true; + } + if (player.getInventory().remove(ICE_COOLER)) { + npc.getImpactHandler().manualHit(player, npc.getSkills().getLifepoints(), HitsplatType.NORMAL); + player.getPacketDispatch().sendMessage("The lizard shudders and collapses from the freezing water."); + } + return true; + } + + } + + /** + * Represents the desert lizard npc. + * @author 'Vexia + * @version 1.0 + */ + public final class DezertLizardNPC extends AbstractNPC { + + /** + * Constructs a new {@code DezertLizardNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public DezertLizardNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code DezertLizardNPC} {@code Object}. + */ + public DezertLizardNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DezertLizardNPC(id, location); + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + int lifepoints = getSkills().getLifepoints(); + if (state.getEstimatedHit() > -1) { + lifepoints -= state.getEstimatedHit(); + if (lifepoints < 1) { + state.setEstimatedHit(lifepoints - 1); + } + if (state.getEstimatedHit() < 0) { + state.setEstimatedHit(0); + getSkills().setLifepoints(2); + } + } + if (state.getSecondaryHit() > -1) { + lifepoints -= state.getSecondaryHit(); + if (lifepoints < 1) { + state.setSecondaryHit(lifepoints - 1); + } + if (state.getSecondaryHit() < 0) { + state.setSecondaryHit(0); + } + } + } + + @Override + public int[] getIds() { + return IDS; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/DustDevilNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/DustDevilNPC.java new file mode 100644 index 000000000..11ae630e6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/DustDevilNPC.java @@ -0,0 +1,95 @@ +package core.game.node.entity.skill.slayer; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.InteractionType; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Handles the dust devil npc. + * @author Vexia + */ +@Initializable +public final class DustDevilNPC extends AbstractNPC { + + /** + * The skills. + */ + private static final int[] SKILLS = new int[] { Skills.ATTACK, Skills.STRENGTH, Skills.RANGE, Skills.MAGIC }; + + /** + * The combat handler. + */ + private static final MeleeSwingHandler COMBAT_HANDLER = new MeleeSwingHandler() { + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (victim instanceof Player) { + final Player player = (Player) victim; + if (!Equipment.FACEMASK.hasEquipment(player)) { + for (int i : SKILLS) { + player.getSkills().updateLevel(i, -player.getSkills().getStaticLevel(i), 0); + } + player.getSkills().decrementPrayerPoints(player.getSkills().getStaticLevel(Skills.PRAYER) / 2); + state.setEstimatedHit(14); + } + } + super.impact(entity, victim, state); + } + + @Override + public InteractionType isAttackable(Entity entity, Entity victim) { + return CombatStyle.MAGIC.getSwingHandler().isAttackable(entity, victim); + } + }; + + /** + * Constructs a new {@code DustDevilNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public DustDevilNPC(int id, Location location) { + super(id, location); + super.getProperties().getCombatPulse().setHandler(COMBAT_HANDLER); + } + + /** + * Constructs a new {@code DustDevilNPC} {@code Object}. + */ + public DustDevilNPC() { + super(0, null); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return COMBAT_HANDLER; + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + if (state.getAttacker() instanceof Player) { + Player player = (Player) state.getAttacker(); + if (!Equipment.FACEMASK.hasEquipment(player)) { + state.neutralizeHits(); + } + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DustDevilNPC(id, location); + } + + @Override + public int[] getIds() { + return Tasks.DUST_DEVILS.getNpcs(); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java new file mode 100644 index 000000000..583a59ab8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/EnchantedGemDialogue.java @@ -0,0 +1,267 @@ +package core.game.node.entity.skill.slayer; + +import core.cache.def.impl.NPCDefinition; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.world.map.Direction; +import core.plugin.Initializable; + +/** + * Rerpresents the enchanted gem dialogue. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class EnchantedGemDialogue extends DialoguePlugin { + + /** + * Represents the id associated with this plugin. + */ + public static final int ID = 77777; + + /** + * Constructs a new {@code EnchantedGemDialogue} {@code Object}. + */ + public EnchantedGemDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code EnchantedGemDialogue} {@code Object}. + * @param player the player. + */ + public EnchantedGemDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new EnchantedGemDialogue(player); + } + + @Override + public boolean open(Object... args) { + player.faceLocation(player.getLocation().transform(1, 0, 0)); + player.setDirection(Direction.EAST); + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "Hello there " + player.getUsername() + ", what can I help you with?"); + stage = 0; + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (stage) { + case 0: + interpreter.sendOptions("Select an Option", "How am I doing so far?", "Who are you?", "Where are you?", "Got any tips for me?", "Nothing really."); + stage = 2; + break; + case 2: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How am I doing so far?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Who are you?"); + stage = 20; + break; + case 3: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Where are you?"); + stage = 30; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Got any tips for me?"); + stage = 400; + break; + case 5: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Nothing really."); + stage = 99; + break; + + } + break; + case 99: + end(); + break; + case 10: + if (!player.getSlayer().hasTask()) { + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt. Come and see me", "When you can and I'll give you a new task."); + stage = 11; + break; + } + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You're currently assigned to kill " + (player.getSlayer().getTask() == Tasks.JAD ? " TzTok-Jad!" : NPCDefinition.forId((player.getSlayer().getTask().getNpcs()[0])).getName().toLowerCase() + "'s;"), "only " + player.getSlayer().getAmount() + " more to go."); + player.varpManager.get(2502).setVarbit(1,player.getSlayer().getTask().ordinal()); + player.varpManager.get(2502).setVarbit(8,player.getSlayer().getAmount()).send(player); + stage = 11; + break; + case 11: + interpreter.sendOptions("Select an Option", "Who are you?", "Where are you?", "Got any tips for me?", "That's all thanks."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); + stage = 21; + break; + case 2: + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); + stage = 31; + break; + case 3: + if (!player.getSlayer().hasTask()) { + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); + stage = 99; + break; + } + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); + stage = 401; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all thanks."); + stage = 99; + break; + case 99: + end(); + break; + } + break; + case 20: + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); + stage = 21; + break; + case 21: + interpreter.sendOptions("Select an Option", "How am I doing so far?", "Where are you?", "Got any tips for me?", "That's all thanks."); + stage = 25; + break; + case 25: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How am I doing so far?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); + stage = 31; + break; + case 3: + if (!player.getSlayer().hasTask()) { + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); + stage = 99; + break; + } + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); + stage = 401; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all thanks."); + stage = 99; + break; + + } + break; + case 30: + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); + stage = 31; + break; + case 31: + interpreter.sendOptions("Select an Option", "How am I doing so far?", "Who are you?", "Got any tips for me?", "That's all thanks."); + stage = 32; + break; + case 32: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How am I doing so far?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); + stage = 21; + break; + case 3: + if (!player.getSlayer().hasTask()) { + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); + stage = 0; + break; + } + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); + stage = 401; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all thanks."); + stage = 99; + break; + + } + break; + case 400: + if (!player.getSlayer().hasTask()) { + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You need something new to hunt."); + stage = 0; + break; + } + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, player.getSlayer().getTask().getTip()); + stage = 401; + break; + case 401: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Great, thanks!"); + stage = 403; + break; + case 403: + interpreter.sendOptions("Select an Option", "How am I doing so far?", "Who are you?", "Where are you?", "That's all thanks."); + stage = 404; + break; + case 404: + switch (buttonId) { + case 1: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "How am I doing so far?"); + stage = 10; + break; + case 2: + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "My name's " + NPCDefinition.forId(player.getSlayer().getMaster().getNpc()).getName() + ", I'm the Slayer Master best able", "to train you."); + stage = 21; + break; + case 3: + interpreter.sendDialogues(player.getSlayer().getMaster().getNpc(), FacialExpression.HALF_GUILTY, "You'll find me in " + masterLocation() + ", I'll be here when you need a", "new task."); + stage = 31; + break; + case 4: + interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "That's all thanks."); + stage = 99; + break; + + } + break; + } + return true; + } + + /** + * Method used to get the masters location. + * @return the location. + */ + public String masterLocation() { + if (player.getSlayer().getMaster().getNpc() == Master.MAZCHNA.getNpc()) + return "Canifis"; + else if (player.getSlayer().getMaster().getNpc() == Master.TURAEL.getNpc()) + return "Taverley"; + else if (player.getSlayer().getMaster().getNpc() == Master.CHAELDAR.getNpc()) + return "Zanaris"; + else if (player.getSlayer().getMaster().getNpc() == Master.VANNAKA.getNpc()) + return "Edgeville dungeon"; + else if (player.getSlayer().getMaster().getNpc() == Master.DURADEL.getNpc()) + return "Shilo village"; + else if(player.getSlayer().getMaster() == null) { + return "the Gnome Stronghold"; + } + return null; + } + + @Override + public int[] getIds() { + return new int[] { ID }; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Equipment.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Equipment.java new file mode 100644 index 000000000..e4fcbcff7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Equipment.java @@ -0,0 +1,117 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a slayer equipment. + * @author Vexia + */ +public enum Equipment { + ENCHANTED_GEM(new Item(4155, 1)), + MIRROR_SHIELD(new Item(4156, 1)) { + @Override + public boolean hasRequirement(final Player player) { + return player.getSkills().getStaticLevel(Skills.DEFENCE) >= 20; + } + }, + LEAF_BLADED_SPEAR(new Item(4158, 1)), + BROAD_ARROWS(new Item(4150, 1)), + BAG_OF_SALT(new Item(4161, 1)), + ROCK_HAMMER(new Item(4162, 1)), + FACEMASK(new Item(4164, 1), true), + EARMUFFS(new Item(4166, 1), true) { + @Override + public boolean hasRequirement(final Player player) { + return player.getSkills().getStaticLevel(Skills.DEFENCE) >= 15; + } + }, + NOSE_PEG(new Item(4168, 1), true), + SLAYERS_STAFF(new Item(4170, 1)), + SPINY_HELMET(new Item(4551, 1), true), + FISHING_EXPLOSIVE(new Item(6660, 1)), + ICE_COOLER(new Item(6696, 1)), + SLAYER_GLOVES(new Item(6708, 1)), + UNLIT_BUG_LANTERN(new Item(7051, 1)), + INSULATED_BOOTS(new Item(7159, 1)), + FUNGICIDE_SPRAY_10(new Item(7421, 1)), + FUNGICIDE(new Item(7432, 1)), + LUMBER_PATCH(new Item(8932, 1)), + SLAYER_BELL(new Item(10952, 1)), + WITCHWOOD_ICON(new Item(8923, 1)), + LIT_BUG_LANTERN(new Item(7053, 1)), + + //null equipment for when none is needed + NONE(new Item(0)); + + /** + * The slayer helmet item. + */ + private static final Item SLAYER_HELM = new Item(13263); + + /** + * Represents the item. + */ + private final Item item; + + /** + * IF the slayer helm has this equipment. + */ + private final boolean slayerHelm; + + /** + * Constructs a new {@Code Equipment} {@Code Object} + * @param item The item. + * @param slayerHelm If slayer helm incorporated. + */ + Equipment(Item item, boolean slayerHelm) { + this.item = item; + this.slayerHelm = slayerHelm; + } + + /** + * Constructs a new {@Code Equipment} {@Code Object} + * @param item The item. + */ + Equipment(Item item) { + this(item, false); + } + + /** + * Checks if the player has the requirement for the item. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasRequirement(final Player player) { + return item.getDefinition().hasRequirement(player, false, false); + } + + /** + * Checks if the player has the equipment equipped. + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasEquipment(final Player player) { + if (slayerHelm && player.getEquipment().containsItem(SLAYER_HELM)) { + return true; + } + return player.getEquipment().containsItem(item); + } + + /** + * Gets the item. + * @return The item. + */ + public Item getItem() { + return item; + } + + /** + * Gets the slayerHelm. + * @return the slayerHelm. + */ + public boolean isSlayerHelm() { + return slayerHelm; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/FishingExplosivePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/FishingExplosivePlugin.java new file mode 100644 index 000000000..d120bdf90 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/FishingExplosivePlugin.java @@ -0,0 +1,228 @@ +package core.game.node.entity.skill.slayer; + +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.HintIconManager; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the plugin used to handle the fishing expolosive on a omnious + * fishing spot. + * @author 'Vexia + */ +@Initializable +public final class FishingExplosivePlugin extends OptionHandler { + + /** + * Represents the ominous fishing spot ids. + */ + private final static int[] IDS = new int[] { 10087, 10088, 10089 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : IDS) { + ObjectDefinition.forId(id).getHandlers().put("option:lure", this); + ObjectDefinition.forId(id).getHandlers().put("option:bait", this); + } + new FishingExplosiveHandler().newInstance(arg); + new MogreNPC().newInstance(arg); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + player.getPacketDispatch().sendMessage("Something seems to have scared all the fishes away..."); + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + return node.getLocation(); + } + + /** + * Represents the handler for the fishing expolsive on a fishing spot. + * @author 'Vexia + * @version 1.0 + */ + public static final class FishingExplosiveHandler extends UseWithHandler { + + /** + * Represents the throwing animation. + */ + private static final Animation ANIMATION = new Animation(385); + + /** + * Represents the splashing graphics. + */ + private static final Graphics SPLASH_GRAPHIC = new Graphics(68); + + /** + * Represents the npc mogre id. + */ + private static final int MOGRE_ID = 114; + + /** + * Represents the messages used to send for the mogres. + */ + private static final String[] MESSAGES = new String[] { "Da boom-boom kill all da fishies!", "I smack you good!", "Smash stupid human!", "Tasty human!", "Human hit me on the head!", "I get you!", "Human scare all da fishies!" }; + + /** + * Constructs a new {@code FishingExplosiveHandler} {@code Object}. + */ + public FishingExplosiveHandler() { + super(6664, 12633); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : IDS) { + addHandler(i, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(final NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getAttributes().containsKey("hasMogre")) { + player.getDialogueInterpreter().sendDialogues(player, null, "Sinister as that fishing spot is, why would I want to", "explode it?"); + return true; + } + if (!player.getInventory().remove(new Item(event.getUsedItem().getId(), 1))) { + return true; + } + final int delay = (int) (2 + (player.getLocation().getDistance(event.getUsedWith().getLocation())) * 0.5); + player.animate(ANIMATION); + player.getPacketDispatch().sendMessage("You hurl the shuddering vial into the water..."); + sendProjectile(player, (GameObject) event.getUsedWith()); + GameWorld.getPulser().submit(new Pulse(delay, player) { + @Override + public boolean pulse() { + Direction dir = event.getUsedWith().getDirection(); + NPC mogre = NPC.create(MOGRE_ID, event.getUsedWith().getLocation().transform(dir.getStepX() << 1, dir.getStepY() << 1, 0)); + mogre.init(); + mogre.moveStep(); + mogre.setRespawn(false); + mogre.getProperties().getCombatPulse().attack(player); + mogre.setAttribute("player", player); + mogre.sendChat(MESSAGES[RandomFunction.random(MESSAGES.length)]); + HintIconManager.registerHintIcon(player, mogre); + if (event.getUsedItem().getId() == 12633) { + mogre.getImpactHandler().manualHit(player, 15, HitsplatType.NORMAL); + } + player.setAttribute("hasMogre", true); + mogre.graphics(SPLASH_GRAPHIC); + player.getPacketDispatch().sendMessage("...and a Mogre appears!"); + return true; + } + }); + return true; + } + + /** + * Method used to send the fishign explosive projectile. + * @param player the player. + * @param object the object. + */ + private void sendProjectile(final Player player, final GameObject object) { + Projectile p = Projectile.create(player, null, 49, 30, 20, 30, Projectile.getSpeed(player, object.getLocation())); + p.setEndLocation(object.getLocation()); + p.send(); + } + + @Override + public Location getDestination(Player player, Node with) { + return player.getLocation(); + } + } + + /** + * Represents a mogre npc. + * @author 'Vexia + * @version 1.0 + */ + public final class MogreNPC extends AbstractNPC { + + /** + * Constructs a new {@code MogreNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public MogreNPC(int id, Location location) { + super(id, location, true); + } + + /** + * Constructs a new {@code MogreNPC} {@code Object}. + */ + public MogreNPC() { + super(0, null); + } + + @Override + public void tick() { + super.tick(); + final Player pl = getAttribute("player", null); + if (pl == null || pl.getLocation().getDistance(getLocation()) > 15) { + clear(); + } + } + + @Override + public void clear() { + super.clear(); + final Player pl = getAttribute("player", null); + if (pl != null) { + pl.removeAttribute("hasMogre"); + } + } + + @Override + public boolean isAttackable(final Entity entity, CombatStyle style) { + final Player pl = getAttribute("player", null); + return pl != null && pl == entity && super.isAttackable(entity, style); + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player player = killer.asPlayer(); + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR, 2, 7); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MogreNPC(id, location); + } + + @Override + public int[] getIds() { + return new int[] { 114 }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/GargoyleNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/GargoyleNPC.java new file mode 100644 index 000000000..a6760e218 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/GargoyleNPC.java @@ -0,0 +1,117 @@ +package core.game.node.entity.skill.slayer; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the gargoyle npc. + * @author Vexia + */ +@Initializable +public final class GargoyleNPC extends AbstractNPC { + + /** + * Constructs a new {@code GargoyleNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public GargoyleNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code GargoyleNPC} {@code Object}. + */ + public GargoyleNPC() { + super(0, null); + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + int lp = getSkills().getLifepoints(); + if (state.getEstimatedHit() > -1) { + if (lp - state.getEstimatedHit() < 1) { + state.setEstimatedHit(0); + if (lp > 1) { + state.setEstimatedHit(lp - 1); + } + } + } + if (state.getSecondaryHit() > -1) { + if (lp - state.getSecondaryHit() < 1) { + state.setSecondaryHit(0); + if (lp > 1) { + state.setSecondaryHit(lp - 1); + } + } + } + int totalHit = state.getEstimatedHit() + state.getSecondaryHit(); + if (lp - totalHit < 1) { + state.setEstimatedHit(0); + state.setSecondaryHit(0); + } + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new RockHammerHandler()); + return super.newInstance(arg); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new GargoyleNPC(id, location); + } + + @Override + public int[] getIds() { + return Tasks.GARGOYLES.getNpcs(); + } + + /** + * The rock hammer handler plugin. + * @author Vexia + */ + public final class RockHammerHandler extends UseWithHandler { + + /** + * Constructs a new {@code RockHammerHandler} {@code Object}. + */ + public RockHammerHandler() { + super(Equipment.ROCK_HAMMER.getItem().getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : getIds()) { + addHandler(id, NPC_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final NPC npc = (NPC) event.getUsedWith(); + if (npc.getSkills().getLifepoints() > 10) { + player.getPacketDispatch().sendMessage("The gargoyle isn't weak enough to be harmed by the hammer."); + } else { + player.getPacketDispatch().sendMessage("The gargoyle cracks apart."); + npc.getImpactHandler().manualHit(player, npc.getSkills().getLifepoints(), HitsplatType.NORMAL); + } + return true; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/InfernalMageNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/InfernalMageNPC.java new file mode 100644 index 000000000..0f0bcb93d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/InfernalMageNPC.java @@ -0,0 +1,48 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.combat.CombatSpell; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Handles the infernal mage npc. + * @author Vexia + */ +@Initializable +public final class InfernalMageNPC extends AbstractNPC { + + /** + * Constructs a new {@code InfernalMageNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public InfernalMageNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code InfernalMageNPC} {@code Object}. + */ + public InfernalMageNPC() { + super(0, null); + } + + @Override + public void init() { + super.init(); + getProperties().setAutocastSpell((CombatSpell) SpellBook.MODERN.getSpell(8)); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new InfernalMageNPC(id, location); + } + + @Override + public int[] getIds() { + return Tasks.INFERNAL_MAGES.getNpcs(); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/KuraskNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/KuraskNPC.java new file mode 100644 index 000000000..d3a80343b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/KuraskNPC.java @@ -0,0 +1,61 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Handles the kurask npc. + * @author Vexia + */ +@Initializable +public final class KuraskNPC extends AbstractNPC { + + /** + * Constructs a new {@code KuraskNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public KuraskNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code KuraskNPC} {@code Object}. + */ + public KuraskNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new KuraskNPC(id, location); + } + + @Override + public void checkImpact(final BattleState state) { + super.checkImpact(state); + boolean effective = false; + if (state.getAttacker() instanceof Player) { + final Player player = (Player) state.getAttacker(); + if ((state.getWeapon() != null && state.getWeapon().getId() == 4158) || (state.getAmmunition() != null && state.getAmmunition().getItemId() == 4160) || (state.getWeapon() != null && state.getWeapon().getId() == 13290) || (state.getSpell() != null && state.getSpell().getSpellId() == 31 && player.getSpellBookManager().getSpellBook() == SpellBook.MODERN.getInterfaceId()) || (state.getAmmunition() != null && state.getAmmunition().getItemId() == 881)) { + effective = true; + } + } + if (!effective) { + state.setEstimatedHit(0); + if (state.getSecondaryHit() > 0) { + state.setSecondaryHit(0); + } + } + } + + @Override + public int[] getIds() { + return new int[] { 1608, 1609, 4229 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Master.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Master.java new file mode 100644 index 000000000..324a28449 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Master.java @@ -0,0 +1,259 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +/** + * A non-garbage way of representing slayer masters + * @author ceik + */ +public enum Master { + TURAEL(8273, 0, 0, new int[]{15, 50}, new int[]{0, 0, 0}, + new Task(Tasks.BANSHEE, 8), + new Task(Tasks.CRAWLING_HAND, 8), + new Task(Tasks.SKELETONS, 7), + new Task(Tasks.WOLVES, 7), + new Task(Tasks.GOBLINS, 7), + new Task(Tasks.DOG, 7), + new Task(Tasks.CAVE_SLIMES, 8), + new Task(Tasks.KALPHITES, 6), + new Task(Tasks.ICE_FIENDS, 8), + new Task(Tasks.MINOTAURS, 7), + new Task(Tasks.CAVE_CRAWLERS, 8), + new Task(Tasks.GHOSTS, 7), + new Task(Tasks.BEARS, 7), + new Task(Tasks.BATS, 7), + new Task(Tasks.ZOMBIES, 7), + new Task(Tasks.SCORPIONS, 7), + new Task(Tasks.CAVE_BUG, 8), + new Task(Tasks.DESERT_LIZARDS, 8), + new Task(Tasks.DWARF, 7), + new Task(Tasks.SPIDERS, 6), + new Task(Tasks.BIRDS, 6), + new Task(Tasks.COWS, 8), + new Task(Tasks.MONKEYS, 6), + new Task(Tasks.RATS, 7)), + MAZCHNA(8274, 20, 0, new int[]{30, 70}, new int[]{2, 5, 15}, + new Task(Tasks.VAMPIRES, 6), + new Task(Tasks.GHOULS, 7), + new Task(Tasks.BANSHEE, 8), + new Task(Tasks.CRAWLING_HAND, 8), + new Task(Tasks.SKELETONS, 7), + //MOGRES -> new Task(Tasks2.Mogres, 8), + new Task(Tasks.PYREFIENDS, 8), + //KILLERWATTS -> new Task(Tasks2.KILLERWATTS, 6), + new Task(Tasks.SHADE,8), + new Task(Tasks.COCKATRICES, 8), + new Task(Tasks.HILL_GIANTS,7), + new Task(Tasks.ROCK_SLUGS,8), + new Task(Tasks.DESERT_LIZARDS, 8), + new Task(Tasks.CAVE_SLIMES, 8), + new Task(Tasks.HOBGOBLINS, 7), + new Task(Tasks.WOLVES, 7), + new Task(Tasks.DOG,7), + new Task(Tasks.FLESH_CRAWLERS,7), + new Task(Tasks.CATABLEPONS,8), + //WALL BEASTS -> new Task(Tasks2.WALL_BEASTS,7), + new Task(Tasks.KALPHITES,6), + new Task(Tasks.CAVE_CRAWLERS, 8), + new Task(Tasks.GHOSTS,7), + new Task(Tasks.BEARS,6), + new Task(Tasks.EARTH_WARRIORS,6), + new Task(Tasks.ZOMBIES,7), + new Task(Tasks.ICE_WARRIOR, 7), + new Task(Tasks.CAVE_BUG,8), + new Task(Tasks.BATS,7), + new Task(Tasks.SCORPIONS,7)), + VANNAKA(1597, 40, 0, new int[]{30, 80}, new int[]{4, 20, 60}, + new Task(Tasks.HARPIE_BUG_SWARMS,8), + // SHADOW WARRIORS -> new Task(Tasks2.SHADOW_WARRIORS, 8), + new Task(Tasks.BLOODVELDS,8), + new Task(Tasks.DUST_DEVILS,8), + new Task(Tasks.ABERRANT_SPECTRES, 8), + new Task(Tasks.JUNGLE_HORRORS, 8), + new Task(Tasks.TUROTHS, 8), + new Task(Tasks.JELLIES,8), + new Task(Tasks.INFERNAL_MAGES,8), + new Task(Tasks.BASILISKS,8), + new Task(Tasks.PYREFIENDS,8), + new Task(Tasks.SHADE,8), + new Task(Tasks.COCKATRICES,8), + new Task(Tasks.OTHERWORDLY_BEING,8), + new Task(Tasks.SPIRTUAL_MAGES,3), + new Task(Tasks.SPIRTUAL_RANGERS, 3), + new Task(Tasks.SPIRTUAL_WARRIORS,3), + new Task(Tasks.DAGANNOTHS, 7), + //ELVES -> new Task(Tasks2.ELVES, 7), + new Task(Tasks.WEREWOLFS,7), + new Task(Tasks.KURASKS,7), + new Task(Tasks.KALPHITES,7), + new Task(Tasks.FIRE_GIANTS,7), + new Task(Tasks.OGRES,7), + new Task(Tasks.MOSS_GIANTS,7), + new Task(Tasks.TROLLS,7), + new Task(Tasks.HELLHOUNDS,7), + new Task(Tasks.BRONZE_DRAGONS,7), + new Task(Tasks.BLUE_DRAGONS,7), + new Task(Tasks.LESSER_DEMONS,7), + new Task(Tasks.ANKOU,7), + new Task(Tasks.ICE_GIANTS,7), + new Task(Tasks.BRINE_RATS,7), + //FEVER SPIDERS -> new Task(Tasks2.FEVER_SPIDERS,7), + new Task(Tasks.VAMPIRES,7), + //MOLANISKS -> new Task(Tasks2.MOLANISKS,7), + //MOGRES -> new Task(Tasks2.MOGRES,7), + new Task(Tasks.ICE_WARRIOR,7), + new Task(Tasks.GHOULS,7), + new Task(Tasks.DESERT_LIZARDS,7), + new Task(Tasks.ROCK_SLUGS,7), + new Task(Tasks.CAVE_SLIMES,7), + new Task(Tasks.CAVE_CRAWLERS,7), + new Task(Tasks.CAVE_BUG,7), + new Task(Tasks.HILL_GIANTS,7), + new Task(Tasks.HOBGOBLINS,7), + //KILLERWATTS -> new Task(Tasks2.KILLERWATTS,6), + new Task(Tasks.CROCODILES,6), + //SEA SNAKES -> new Task(Tasks2.SEA_SNAKES,6), + //TERROR DOGS -> new Task(Tasks2.TERROR_DOGS,6), + new Task(Tasks.GREEN_DRAGON,6), + //WALL BEAST -> new Task(Tasks2.WALL_BEAST,6), + new Task(Tasks.EARTH_WARRIORS,6), + new Task(Tasks.BANSHEE,6), + new Task(Tasks.CRAWLING_HAND,6), + new Task(Tasks.GARGOYLES, 5), + new Task(Tasks.NECHRYAELS, 5), + new Task(Tasks.ABYSSAL_DEMONS, 5)), + + CHAELDAR(1598, 70, 25, new int[]{110, 170}, new int[]{10, 50, 150}, + new Task(Tasks.ABYSSAL_DEMONS,12), + new Task(Tasks.IRON_DRAGONS,12), + new Task(Tasks.NECHRYAELS, 12), + new Task(Tasks.KURASKS, 12), + new Task(Tasks.FIRE_GIANTS, 12), + new Task(Tasks.SPIRTUAL_WARRIORS,4), + new Task(Tasks.SPIRTUAL_RANGERS,4), + new Task(Tasks.SPIRTUAL_MAGES,4), + new Task(Tasks.GARGOYLES,11), + new Task(Tasks.KALPHITES,11), + new Task(Tasks.DAGANNOTHS,11), + new Task(Tasks.BRONZE_DRAGONS,11), + new Task(Tasks.TROLLS,11), + new Task(Tasks.JUNGLE_HORRORS,10), + new Task(Tasks.BLACK_DEMONS,10), + new Task(Tasks.TUROTHS, 10), + new Task(Tasks.CAVE_HORRORS,10), + new Task(Tasks.JELLIES, 10), + new Task(Tasks.AVIANSIES,9), + new Task(Tasks.STEEL_DRAGONS,9), + new Task(Tasks.LESSER_DEMONS,9), + new Task(Tasks.GREATER_DEMONS,9), + new Task(Tasks.HELLHOUNDS,9), + new Task(Tasks.DUST_DEVILS,9), + new Task(Tasks.BLUE_DRAGONS,8), + //ELVES -> new Task(Tasks2.ELVES,8), + new Task(Tasks.ABERRANT_SPECTRES,8), + //SHADOW WARRIORS -> new Task(Tasks2.SHADOW_WARRIORS,8), + new Task(Tasks.BLOODVELDS,8), + new Task(Tasks.SKELETAL_WYVERN,7), + //MUTATED ZYGOMITE -> new Task(Tasks2.MUTATED_ZYGOMITES,7), + new Task(Tasks.INFERNAL_MAGES,7), + new Task(Tasks.BRINE_RATS,7), + //FEVER SPIDERS -> new Task(Tasks2.FEVER_SPIDERS,7), + new Task(Tasks.BASILISKS,7), + //WALL BEASTS -> new Task(Tasks2.WALL_BEASTS,6), + //MOLANISKS -> new Task(Tasks2.MOLANISKS,6), + //MOGRES -> new Task(Tasks2.MOGRES,6), + new Task(Tasks.PYREFIENDS,6), + new Task(Tasks.HARPIE_BUG_SWARMS,6), + new Task(Tasks.COCKATRICES,6), + new Task(Tasks.CAVE_SLIMES,6), + new Task(Tasks.DESERT_LIZARDS, 5), + new Task(Tasks.ROCK_SLUGS, 5), + new Task(Tasks.BANSHEE, 5), + new Task(Tasks.CAVE_CRAWLERS, 5)), + DURADEL(8275, 100, 50, new int[]{50, 199}, new int[]{15, 75, 225}, + new Task(Tasks.ABYSSAL_DEMONS,12), + new Task(Tasks.DARK_BEASTS,11), + new Task(Tasks.TZHAAR, 10), + new Task(Tasks.HELLHOUNDS, 10), + new Task(Tasks.KALPHITES,9), + new Task(Tasks.NECHRYAELS,9), + new Task(Tasks.MITHRIL_DRAGON,9), + new Task(Tasks.BLACK_DRAGONS,9), + new Task(Tasks.GREATER_DEMONS,9), + new Task(Tasks.DAGANNOTHS,9), + new Task(Tasks.GARGOYLES,8), + new Task(Tasks.BLACK_DEMONS,8), + //RED DRAGONS new Task(Tasks2.RED_DRAGONS,8), + new Task(Tasks.BLOODVELDS,8), + new Task(Tasks.AVIANSIES,8), + //SUQAHS new Task(Tasks2.SUQAHS,8), + new Task(Tasks.ABERRANT_SPECTRES,7), + new Task(Tasks.STEEL_DRAGONS,7), + new Task(Tasks.SPIRTUAL_MAGES,2), + new Task(Tasks.SPIRTUAL_RANGERS,2), + new Task(Tasks.SPIRTUAL_WARRIORS,2), + new Task(Tasks.SKELETAL_WYVERN,7), + new Task(Tasks.FIRE_GIANTS,7), + new Task(Tasks.TROLLS,6), + new Task(Tasks.IRON_DRAGONS,5), + new Task(Tasks.ANKOU,5), + new Task(Tasks.DUST_DEVILS,5), + new Task(Tasks.KURASKS,4), + new Task(Tasks.CAVE_HORRORS,4), + new Task(Tasks.BLUE_DRAGONS,4), + //ELVES new Task(Tasks2.ELVES,4), + //ZYGOMITES new Task(Tasks2.MUTATED_ZYGOMITES,2), + new Task(Tasks.WATERFIENDS,2)); + + private static HashMap idMap = new HashMap<>(); + + static{ + Arrays.stream(Master.values()).forEach(m -> idMap.putIfAbsent(m.npc_id, m)); + } + + int npc_id,required_combat,required_slayer; + int[] assignment_range; + int[] streakPoints; + List tasks; + Master(int npc_id, int required_combat, int required_slayer, int[] assignment_range, int[] streakPoints, Task... tasks) { + this.npc_id = npc_id; + this.assignment_range = assignment_range; + this.streakPoints = streakPoints; + this.tasks = new ArrayList<>(Arrays.asList(tasks)); + } + + public static Master forId(int id){ + return idMap.get(id); + } + + public int getNpc(){ + return this.npc_id; + } + + public int[] getTaskPoints(){ + return streakPoints; + } + + public boolean hasRequirements(Player player){ + return player.getProperties().getCurrentCombatLevel() >= this.required_combat && player.getSkills().getLevel(Skills.SLAYER) >= this.required_slayer; + } + + public static boolean hasSameTask(Master master, Player player){ + return master.tasks.stream().filter(task -> task.task == player.getSlayer().getTask()).count() != 0; + } + + public static class Task{ + Tasks task; + Integer weight; + Task(Tasks task, Integer weight){ + this.task = task; + this.weight = weight; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/MirrorShieldHandler.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/MirrorShieldHandler.java new file mode 100644 index 000000000..1c219c422 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/MirrorShieldHandler.java @@ -0,0 +1,66 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.handlers.MeleeSwingHandler; +import core.game.node.entity.player.Player; + +/** + * The swing handler for an npc that requires a mirror shield with its victim. + * @author Vexia + * @version 1.0 + */ +public final class MirrorShieldHandler extends MeleeSwingHandler { + + /** + * The singleton of this handler. + */ + public static final MirrorShieldHandler SINGLETON = new MirrorShieldHandler(); + + /** + * The skills to drain. + */ + private static final int[] SKILLS = new int[] { Skills.ATTACK, Skills.STRENGTH, Skills.DEFENCE, Skills.RANGE }; + + @Override + public void impact(Entity entity, Entity victim, BattleState state) { + if (victim instanceof Player) { + final Player player = (Player) victim; + if (!hasShield(player)) { + state.setEstimatedHit(11); + for (int skill : SKILLS) { + int drain = (int) (player.getSkills().getStaticLevel(skill) * 0.25); + player.getSkills().updateLevel(skill, -drain, player.getSkills().getStaticLevel(skill) - drain); + } + } + } + super.impact(entity, victim, state); + } + + /** + * Checks the impact of a victim with or without a shield. + * @param state the state. + */ + public void checkImpact(final BattleState state) { + if (state.getAttacker() instanceof Player) { + final Player player = (Player) state.getAttacker(); + if (!hasShield(player)) { + state.setEstimatedHit(0); + if (state.getSecondaryHit() > 0) { + state.setSecondaryHit(0); + } + } + } + } + + /** + * Checks if the player has the mirror shield. + * @param player the player. + * @return {@code True} if so. + */ + private static boolean hasShield(final Player player) { + return Equipment.MIRROR_SHIELD.hasEquipment(player); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/MithrilDragonNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/MithrilDragonNPC.java new file mode 100644 index 000000000..9a08c307f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/MithrilDragonNPC.java @@ -0,0 +1,97 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.DragonfireSwingHandler; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles a mithril dragon npc. + * @author Vexia + */ +@Initializable +public final class MithrilDragonNPC extends AbstractNPC { + + /** + * The dragonfire attack. + */ + private static final SwitchAttack DRAGONFIRE = DragonfireSwingHandler.get(false, 52, new Animation(81, Priority.HIGH), Graphics.create(1), null, null); + + /** + * Handles the combat. + */ + private final CombatSwingHandler combatAction = new MultiSwingHandler(true, new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), new Animation(80, Priority.HIGH)), new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), new Animation(80, Priority.HIGH)), new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), new Animation(81, Priority.HIGH), null, null, Projectile.create((Entity) null, null, 500, 20, 20, 41, 40, 18, 255)), DRAGONFIRE, new SwitchAttack(CombatStyle.RANGE.getSwingHandler(), new Animation(81, Priority.HIGH), null, null, Projectile.create((Entity) null, null, 16, 20, 20, 41, 40, 18, 255))); + + /** + * Constructs a new {@code MithrilDragonNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public MithrilDragonNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code MithrilDragonNPC} {@code Object}. + */ + public MithrilDragonNPC() { + super(0, null); + } + + @Override + public void sendImpact(BattleState state) { + CombatStyle style = state.getStyle(); + if (style == null) { + return; + } + int maxHit = state.getEstimatedHit(); + if (maxHit < 1) { + return; + } + switch (style) { + case MELEE: + maxHit = 28; + break; + case MAGIC: + maxHit = 18; + break; + case RANGE: + maxHit = 18; + break; + } + if (state.getEstimatedHit() > maxHit) { + state.setEstimatedHit(RandomFunction.random(maxHit - 5, maxHit)); + } + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new MithrilDragonNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatAction; + } + + @Override + public int getDragonfireProtection(boolean fire) { + return 0x2 | 0x4 | 0x8; + } + + @Override + public int[] getIds() { + return Tasks.MITHRIL_DRAGON.getNpcs(); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/NechryaelNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/NechryaelNPC.java new file mode 100644 index 000000000..ea5b81b5c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/NechryaelNPC.java @@ -0,0 +1,187 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the nechryael npc. + * @author Vexia + */ +@Initializable +public final class NechryaelNPC extends AbstractNPC { + + /** + * The death spawn id. + */ + private static final int DEATH_SPAWN = 1614; + + /** + * The death spawn npcs. + */ + private List spawns = new ArrayList<>(); + + /** + * The next spawn time. + */ + private int nextSpawn; + + /** + * Constructs a new {@code NechryaelNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public NechryaelNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code NechryaelNPC} {@code Object}. + */ + public NechryaelNPC() { + super(0, null); + } + + @Override + public void onImpact(Entity entity, final BattleState state) { + super.onImpact(entity, state); + if (entity instanceof Player && RandomFunction.random(5) == 1) { + spawn((Player) entity); + } + } + + /** + * Spawns a death spawn. + * @param player the player. + */ + public void spawn(Player player) { + if (!canSpawn()) { + return; + } + final DeathSpawnNPC spawn = new DeathSpawnNPC(DEATH_SPAWN, getLocation().transform(getDirection(), 1), player, this); + spawn.init(); + setSpawnTime(); + spawns.add(spawn); + animate(Animation.create(9491)); + spawn.getProperties().getCombatPulse().attack(player); + } + + /** + * Sets the next spawn time. + */ + private void setSpawnTime() { + nextSpawn = GameWorld.getTicks() + 50; + } + + /** + * Checks if a death spawn can spawn. + * @return {@code True} if so. + */ + private boolean canSpawn() { + if (spawns.size() >= 2) { + setSpawnTime(); + return false; + } + return nextSpawn < GameWorld.getTicks(); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new NechryaelNPC(id, location); + } + + @Override + public int[] getIds() { + return Tasks.NECHRYAELS.getNpcs(); + } + + /** + * Handles the death spawn npc. + * @author Vexia + */ + public static final class DeathSpawnNPC extends AbstractNPC { + + /** + * The player binded with the death spawn. + */ + private final Player player; + + /** + * The parent npc. + */ + private final NechryaelNPC parent; + + /** + * The time until its cleared. + */ + private int time; + + /** + * Constructs a new {@code DeathSpawnNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public DeathSpawnNPC(int id, Location location, final Player player, NechryaelNPC parent) { + super(id, location); + this.player = player; + this.parent = parent; + this.setRespawn(false); + this.time = GameWorld.getTicks() + 120; + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + if (!inCombat() || !player.inCombat()) { + getProperties().getCombatPulse().attack(player); + } + if (time < GameWorld.getTicks() || !player.isActive() || player.getLocation().getDistance(getLocation()) > 15) { + clear(); + } + } + + @Override + public void clear() { + super.clear(); + parent.spawns.remove(this); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new DeathSpawnNPC(id, location, null, null); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity instanceof Player) { + final Player t = (Player) entity; + if (t != player) { + t.getPacketDispatch().sendMessage("This isn't spawned for you."); + return false; + } + } + return super.isAttackable(entity, style); + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + return new int[] { DEATH_SPAWN }; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/RockSlugPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/RockSlugPlugin.java new file mode 100644 index 000000000..c4fe24d1d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/RockSlugPlugin.java @@ -0,0 +1,148 @@ +package core.game.node.entity.skill.slayer; + +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.path.Pathfinder; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the interactions of a rock slug. + * @author Vexia + */ +@Initializable +public final class RockSlugPlugin implements Plugin { + + /** + * The bag of salt item. + */ + private static final Item SALT = new Item(4161, 1); + + /** + * The rockslug npc ids. + */ + private static final int[] IDS = new int[] { 1631, 1632 }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new RockSlugNPC()); + PluginManager.definePlugin(new SaltBagHandler()); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * The use with handler for the bag of salt on a rock slug. + * @author Vexia + */ + public final class SaltBagHandler extends UseWithHandler { + + /** + * Constructs a new {@code SaltBagHandler} {@code Object}. + */ + public SaltBagHandler() { + super(SALT.getId()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : IDS) { + addHandler(id, NPC_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + final NPC npc = (NPC) event.getUsedWith(); + player.getInventory().remove(SALT); + if (npc.getSkills().getLifepoints() < 10) { + npc.getImpactHandler().manualHit(player, npc.getSkills().getLifepoints(), HitsplatType.NORMAL); + player.getPacketDispatch().sendMessage("The rockslug shrivels up and dies."); + } else { + player.sendMessage("Your bag of salt is ineffective. The Rockslug is not weak enough."); + } + return true; + } + + } + + /** + * The rock slug npc. + * @author Vexia + */ + public final class RockSlugNPC extends AbstractNPC { + + /** + * Constructs a new {@code RockSlugNPC} {@code Object}. + */ + public RockSlugNPC() { + super(-1, null); + } + + /** + * Constructs a new {@code RockSlugNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public RockSlugNPC(int id, Location location) { + super(id, location, true); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new RockSlugNPC(id, location); + } + + @Override + public void checkImpact(BattleState state) { + super.checkImpact(state); + int lifepoints = getSkills().getLifepoints(); + boolean run = false; + if (state.getEstimatedHit() > -1) { + lifepoints -= state.getEstimatedHit(); + if (lifepoints < 1) { + run = true; + state.setEstimatedHit(lifepoints - 1); + } + if (state.getEstimatedHit() < 0) { + state.setEstimatedHit(0); + } + } + if (state.getSecondaryHit() > -1) { + lifepoints -= state.getSecondaryHit(); + if (lifepoints < 1) { + run = true; + state.setSecondaryHit(lifepoints - 1); + } + if (state.getSecondaryHit() < 0) { + state.setSecondaryHit(0); + } + } + if (run) { + getProperties().getCombatPulse().stop(); + Pathfinder.find(getLocation(), getProperties().getSpawnLocation()); + } + } + + @Override + public int[] getIds() { + return IDS; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SkeletalWyvernNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SkeletalWyvernNPC.java new file mode 100644 index 000000000..a0cd00d84 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SkeletalWyvernNPC.java @@ -0,0 +1,101 @@ +package core.game.node.entity.skill.slayer; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.DragonfireSwingHandler; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Initializable; +import core.tools.RandomFunction; + +/** + * Handles the skeletal wyvern npc. + * @author Vexia + * @author Splinter + * @version 1.0 + */ +@Initializable +public final class SkeletalWyvernNPC extends AbstractNPC { + + /** + * The combat swing handler. + */ + private static final MultiSwingHandler COMBAT_HANDLER = new MultiSwingHandler(new SwitchAttack(CombatStyle.MELEE.getSwingHandler(), new Animation(2985)), new SwitchAttack(CombatStyle.RANGE.getSwingHandler(), new Animation(2989), new Graphics(499)), DragonfireSwingHandler.get(false, 54, new Animation(2988), new Graphics(501), null, null, false)); + + /** + * The combat swing handler for far combat (5+ tile distance) + */ + private static final MultiSwingHandler COMBAT_HANDLER_FAR = new MultiSwingHandler(new SwitchAttack(CombatStyle.RANGE.getSwingHandler(), new Animation(2989), new Graphics(499))); + + /** + * Constructs a new {@code SkeletalWyvernNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public SkeletalWyvernNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code SkeletalWyvernNPC} {@code Object}. + */ + public SkeletalWyvernNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new SkeletalWyvernNPC(id, location); + } + + @Override + public void sendImpact(BattleState state) { + if (state.getStyle() == CombatStyle.MAGIC && state.getVictim() != null && state.getVictim().isPlayer()) { + Player p = state.getVictim().asPlayer(); + Item item = p.getEquipment().get(EquipmentContainer.SLOT_SHIELD); + if (item != null && (item.getId() == 2890 || item.getId() == 9731 || item.getId() == 11283) && state.getEstimatedHit() > 10) { + state.setEstimatedHit(RandomFunction.random(10)); + } + } + Player p = state.getVictim().asPlayer(); + Item item = p.getEquipment().get(EquipmentContainer.SLOT_SHIELD); + if(state.getVictim().getLocation().getDistance(state.getAttacker().getLocation()) >= 5 + && state.getVictim().asPlayer().getPrayer().get(PrayerType.PROTECT_FROM_MAGIC) && (item.getId() == 2890 || item.getId() == 9731 || item.getId() == 11283)){ + state.setEstimatedHit(0); + } + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + if (this.getProperties().getCombatPulse().getVictim() != null && this.getProperties().getCombatPulse().getVictim().getLocation().getDistance(this.getLocation()) >= 5){ + return COMBAT_HANDLER_FAR; + } + return COMBAT_HANDLER; + } + + @Override + public void finalizeDeath(final Entity killer) { + super.finalizeDeath(killer); + if (killer instanceof Player) { + final Player player = killer.asPlayer(); + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR, 2, 8); + } + } + + @Override + public int[] getIds() { + return Tasks.SKELETAL_WYVERN.getNpcs(); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerManager.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerManager.java new file mode 100644 index 000000000..9bd37bc80 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerManager.java @@ -0,0 +1,471 @@ +package core.game.node.entity.skill.slayer; + +import core.cache.def.impl.NPCDefinition; +import core.game.system.SystemLogger; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.entity.player.link.diary.DiaryType; +import core.tools.RandomFunction; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Manages the players slayer task. + * @author Vexia + * + */ +public final class SlayerManager implements SavingModule { + + /** + * The player instance. + */ + private final Player player; + + /** + * The current slayer master used. + */ + private Master master; + + /** + * The current task. + */ + private Tasks task; + + /** + * The amount of the hunted killed. + */ + private int amount; + + /** + * The slayer points. + */ + private int slayerPoints; + + /** + * The task streak. + */ + private int taskCount; + + /** + * Total tasks completed + */ + private int taskTotal; + + /** + * The learned rewards. + */ + private final boolean[] learned = new boolean[3]; + + /** + * The removed tasks. + */ + private final List removed = new ArrayList<>(4); + + /** + * Constructs a new {@Code SlayerManager} {@Code Object} + * @param player The player. + */ + public SlayerManager(Player player) { + this.player = player; + } + + /** + * If the player can earn points (taskTotal > 4) + */ + private boolean canEarnPoints = false; + + public void parse(JSONObject slayerData){ + Object m = slayerData.get("master"); + if(m != null) + this.master = Master.forId(Integer.parseInt(m.toString())); + Object t = slayerData.get("taskId"); + if(t != null) + task = Tasks.values()[Integer.parseInt(t.toString())]; + Object a = slayerData.get("taskAmount"); + if(a != null) + amount = Integer.parseInt(a.toString()); + slayerPoints = Integer.parseInt( slayerData.get("points").toString()); + taskCount = Integer.parseInt( slayerData.get("taskStreak").toString()); + JSONArray learnedArray = (JSONArray) slayerData.get("learned_rewards"); + for(int i = 0; i < learnedArray.size(); i++){ + learned[i] = (boolean) learnedArray.get(i); + } + JSONArray removedTasks = (JSONArray) slayerData.get("removedTasks"); + if(removedTasks != null){ + for(int i = 0; i < removedTasks.size(); i++){ + removed.add(Tasks.values()[Integer.parseInt(removedTasks.get(i).toString())]); + } + } + taskTotal = Integer.parseInt( slayerData.get("totalTasks").toString()); + canEarnPoints = (boolean) slayerData.get("canEarnPoints"); + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get() & 0xFF) != 0) { + switch (opcode) { + case 1: + master = Master.forId(buffer.getInt()); + break; + case 2: + int taskId = buffer.getInt(); + if (taskId > Tasks.values().length -1) { + SystemLogger.logErr("Invalid task i for " + player.getUsername() + " taskId = " + taskId); + break; + } + task = Tasks.values()[taskId]; + break; + case 3: + amount = buffer.getInt(); + break; + case 4: + slayerPoints = buffer.getInt(); + break; + case 5: + taskCount = buffer.getInt(); + break; + case 6: + int size = buffer.get(); + for (int i = 0; i < size; i++) { + learned[i] = buffer.get() == 1; + } + break; + case 7: + size = buffer.get(); + for (int i = 0; i < size; i++) { + removed.add(Tasks.values()[buffer.getInt()]); + } + break; + case 8: + taskTotal = buffer.getInt(); + break; + case 9: + int pointsEarnable = buffer.getInt(); + if(pointsEarnable == 1){ + canEarnPoints = true; + } + break; + default: + SystemLogger.logErr("Error parsing Slayer Manager opcode = " + opcode); + break; + } + } + } + + @Override + public void save(ByteBuffer buffer) { + if (master != null) { + buffer.put((byte) 1); + buffer.putInt(master.getNpc()); + } + if (task != null) { + buffer.put((byte) 2); + buffer.putInt(task.ordinal()); + } + if (task != null) { + buffer.put((byte) 3); + buffer.putInt(getAmount()); + } + if (slayerPoints != 0) { + buffer.put((byte) 4).putInt(slayerPoints); + } + if (taskCount != 0) { + buffer.put((byte) 5).putInt(taskCount); + } + for (int i = 0; i < learned.length; i++) { + if (learned[i] != false) { + buffer.put((byte) 6).put((byte) learned.length); + for (int k = 0; k < learned.length; k++) { + buffer.put((byte) (learned[k] ? 1 : 0)); + } + break; + } + } + if (!removed.isEmpty()) { + buffer.put((byte) 7).put((byte) removed.size()); + for (Tasks task : removed) { + buffer.putInt(task.ordinal()); + } + } + if (taskTotal != 0){ + buffer.put((byte) 8); + buffer.putInt(taskTotal); + } + if(canEarnPoints){ + buffer.put((byte) 9); + buffer.putInt(1); + } + buffer.put((byte) 0); + } + + /** + * Called when a hunted creature dies. + * @param player The player. + * @param npc The NPC. You're currently + */ + public void finalizeDeath(Player player, NPC npc) { + player.getSkills().addExperience(Skills.SLAYER,npc.getSkills().getMaximumLifepoints()); + decrementAmount(1); + if (!hasTask()) { + clear(); + taskCount++; + taskTotal++; + if ((taskCount > 4 || canEarnPoints ) && master != Master.TURAEL && slayerPoints < 64000) { + int points = master.getTaskPoints()[0]; + if (taskCount % 10 == 0) { + points = master.getTaskPoints()[1]; + } else if (taskCount % 50 == 0) { + points = master.getTaskPoints()[2]; + } + slayerPoints += points; + if (slayerPoints > 64000) { + slayerPoints = 64000; + } + player.sendMessages("You've completed " + taskCount + " tasks in a row and received " + points + " points, with a total of " + player.getSlayer().getSlayerPoints(),"You have completed " + taskTotal + " tasks in total. Return to a Slayer master."); + } else if(taskCount == 4){ + player.sendMessage("You've completed your task; you will start gaining points on your next task!"); + canEarnPoints = true; + } else { + player.sendMessages("You've completed your task; Complete " + (4 - taskCount) + " more task(s) to start gaining points.", "Return to a Slayer master."); + } + } else { + //player.sendMessage("You're assigned to kill " + NPCDefinition.forId((player.getSlayer().getTask().getNpcs()[0])).getName().toLowerCase() + "s; Only " + getAmount() + " more to go."); + } + } + + /** + * Assigns a task to the manager. + * @param task the task. + * @param master the master. + */ + public void assign(Tasks task, final Master master) { + setMaster(master); + setTask(task); + setAmount(getRandomAmount(master.assignment_range)); + if (master == Master.DURADEL) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 2, 8); + } else if (master == Master.VANNAKA) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 14); + } + getPlayer().varpManager.get(2502).setVarbit(1,task.ordinal()); + getPlayer().varpManager.get(2502).setVarbit(8,getAmount()).send(player); + } + + /** + * Method used to assign a new task for a player. + * @param master the master to give the task. + */ + public void generate(Master master) { + final List tasks = new ArrayList<>(); + final int[] taskWeightSum = {0}; + master.tasks.stream().filter(task -> canBeAssigned(task.task) && task.task.combatCheck <= player.getProperties().getCurrentCombatLevel()).forEach(task -> { + taskWeightSum[0] += task.weight; + tasks.add(task); + }); + Collections.shuffle(tasks, RandomFunction.RANDOM); + int rnd = RandomFunction.random(taskWeightSum[0]); + for(Master.Task task : tasks){ + if(rnd < task.weight) + assign(task.task,master); + rnd -= task.weight; + } + } + + public boolean canBeAssigned(Tasks task){ + return player.getSkills().getLevel(Skills.SLAYER) >= task.levelReq && !removed.contains(task); + } + + /** + * Clears the task. + */ + public void clear() { + setTask(null); + setAmount(0); + } + + /** + * Gets a random amount. + * @param ranges the ranges. + * @return the amt. + */ + private int getRandomAmount(int[] ranges) { + return RandomFunction.random(ranges[0], ranges[1]); + } + + /** + * Gets the task name. + * @return the name. + */ + public String getTaskName() { + if (task == null) { + return "null"; + } + if (task.getNpcs() == null) { + return "no npcs report me"; + } + if (task.getNpcs().length < 1) { + return "npc length to small report me"; + } + return NPCDefinition.forId(task.getNpcs()[0]).getName().toLowerCase(); + } + + /** + * Gets the task. + * @return The task. + */ + public Tasks getTask() { + return task; + } + + /** + * Sets the task. + * @param task The task to set. + */ + public void setTask(Tasks task) { + this.task = task; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the master. + * @return The master. + */ + public Master getMaster() { + return master; + } + + /** + * Sets the master. + * @param master The master to set. + */ + public void setMaster(Master master) { + this.master = master; + } + + /** + * Checks if a Player contains a task. + * @return {@code True} if so. + */ + public boolean hasTask() { + if (task == null) { + return false; + } + if (getAmount() == 0) { + return false; + } + return true; + } + + /** + * Method used to check if the task is completed. + * @return True if so. + */ + public boolean isCompleted() { + return amount <= 0; + } + + /** + * Gets the amount. + * @return The amount. + */ + public int getAmount() { + return amount; + } + + /** + * Sets the amount. + * @param amount The amount to set. + */ + public void setAmount(int amount) { + this.amount = amount; + } + + /** + * Method used to decrement an amount. + * @param amount the amount. + */ + public void decrementAmount(int amount) { + this.amount -= amount; + if(player.varpManager.get(2502).getVarbit(1) == null) player.varpManager.get(2502).setVarbit(1,task.ordinal()); + player.varpManager.get(2502).setVarbit(8,getAmount()); + player.varpManager.get(2502).send(player); + } + + /** + * Method used to check if the player has started slayer. + * @return {@code True} if so. + */ + public boolean hasStarted() { + return master != null; + } + + /** + * Gets the slayerPoints. + * @return the slayerPoints. + */ + public int getSlayerPoints() { + return slayerPoints; + } + + /** + * Sets the slayerPoints. + * @param slayerPoints the slayerPoints to set + */ + public void setSlayerPoints(int slayerPoints) { + this.slayerPoints = slayerPoints; + } + + /** + * Gets the taskCount. + * @return the taskCount. + */ + public int getTaskCount() { + return taskCount; + } + + /** + * Sets the taskCount. + * @param taskCount the taskCount to set + */ + public void setTaskCount(int taskCount) { + this.taskCount = taskCount; + } + + /** + * Gets the learned. + * @return the learned. + */ + public boolean[] getLearned() { + return learned; + } + + /** + * Gets the removed. + * @return the removed. + */ + public List getRemoved() { + return removed; + } + + public int getTotalTasks() {return taskTotal;} + + public boolean isCanEarnPoints(){ + return canEarnPoints; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java new file mode 100644 index 000000000..36859cce4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerMasterDialogue.java @@ -0,0 +1,670 @@ +package core.game.node.entity.skill.slayer; + +import core.game.world.GameWorld; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.dialogue.FacialExpression; +import core.game.content.global.Skillcape; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.AchievementDiary; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.plugin.Initializable; + +/** + * Represents the dialogue plugin used for a slayer master. + * + * @author Vexia + */ +@Initializable +public final class SlayerMasterDialogue extends DialoguePlugin { + + /** + * The enchanted gem item. + */ + private static final Item GEM = new Item(4155, 1); + + /** + * The mithril axe item. + */ + private static final Item MITHRIL_AXE = new Item(1355); + + /** + * The holy symbol item. + */ + private static final Item HOLY_SYMBOL = new Item(1718); + + /** + * Represents the items to use. + */ + private static final Item[] ITEMS = new Item[]{new Item(9813), new Item(9814)}; + + /** + * Represents the coins item. + */ + private static final Item COINS = new Item(995, 99000); + + /** + * Represents the master talking. + */ + private Master master; + + /** + * The quest instance. + */ + private Quest quest; + + /** + * The achievement diary. + */ + private AchievementDiary diary; + + /** + * If we're chatting about our diary. + */ + private boolean isDiary; + + private final int level = 2; + + /** + * Constructs a new {@code SlayerMasterDialogue} {@code Object}. + */ + public SlayerMasterDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code SlayerMasterDialogue} {@code Object}. + * + * @param player the player. + */ + public SlayerMasterDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new SlayerMasterDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (args[0] instanceof NPC) { + npc = (NPC) args[0]; + } + master = Master.forId(args[0] instanceof NPC ? ((NPC) args[0]).getId() : (int) args[0]); + quest = player.getQuestRepository().getQuest("Animal Magnetism"); + + if (master == Master.DURADEL) { + if (Skillcape.isMaster(player, Skills.SLAYER)) { + options("Ask about Skillcape", "Something else"); + stage = 900; + return true; + } + } + interpreter.sendDialogues(master.getNpc(), getExpression(master), "'Ello, and what are you after, then?"); + if (master == Master.VANNAKA) { + stage = -1; + } else { + stage = 0; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + if (isDiary) { + switch (stage) { + case 999: + end(); + break; + case -1: + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage++; + break; + case 0: + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); + } + switch (buttonId) { + case 1: + player("What is the Achievement Diary?"); + stage = 410; + break; + case 2: + player("What are the rewards?"); + stage = 420; + break; + case 3: + player("How do I claim the rewards?"); + stage = 430; + break; + case 4: + player("See you later."); + stage = 999; + break; + } + break; + case 440: + npc("I can imagine! I expect you'll be wanting a reward for", "your hard efforts, eh?"); + stage++; + break; + case 441: + player("Yes, please."); + stage++; + break; + case 442: + diary.setLevelRewarded(level); + for (Item i : diary.getType().getRewards(level)) { + player.getInventory().add(i, player); + } + npc("I'm happy to say that you've done well, so I will reward", "you suitably for your work."); + stage++; + break; + case 443: + player("Great! Thanks."); + stage++; + break; + case 444: + sendDialogue("Vannaka takes the Varrock armour and carves some symbols into it.", "He waves his hands over the symbols and the armour appears to glow", "brilliantly."); + stage++; + break; + case 450: + player.getInventory().add(diary.getType().getRewards(2)[0], player); + npc("You better be more careful this time."); + stage = 41; + break; + case 410: + npc("It's a diary that helps you keep track of particular", "achievements. Here in Varrock it can help you", "discover some quite useful things. Eventually, with", "enough exploration, the people of Varrock will reward"); + stage++; + break; + case 411: + npc("you."); + stage++; + break; + case 412: + npc("You can see what tasks you have listed by clicking on", "the green button in the Quest List."); + stage = 41; + break; + case 420: + npc("Well, there's three different levels of Varrock Armour,", "which match up with the three levels of difficulty. Each", "has the same rewards as the previous level, and an", "additional one too... but I won't spoil your surprise."); + stage++; + break; + case 421: + npc("Rest assured, the people of Varrock are happy to see", "you visiting the land."); + stage = 41; + break; + case 430: + npc("Just complete the tasks so they're all ticked off, then", "you can claim your reward. Most of them are", "straightforward; you might find some require quests to", "be started, if not finished."); + stage++; + break; + case 431: + npc("To claim the different Varrock Armour, speak to Vannaka", "Rat Burgis, and myself."); + stage = 41; + break; + case 50: + end(); + break; + } + return true; + } + switch (stage) { + case 999: + end(); + break; + case -1: // vannaka - has options for achievement diary + if (!player.getSlayer().hasStarted()) { + options("Who are you?", "Do you have anything for trade?", "Er...nothing...", "I have a question about my Achievement Diary."); + stage = 1; + } else { + options("I need another assignment.", "Do you have anything for trade?", "Er...nothing...", "I have a question about my Achievement Diary."); + stage = 690; + } + break; + case 0: // not vannaka + if (master == Master.TURAEL) { // only give option to talk about holy axe with Turael + if (quest.getStage(player) == 30) { + options("I need another assignment.", "Do you have anything for trade?", "Er...nothing...", "I'm here about a quest."); + stage = 700; + break; + } else if (quest.getStage(player) == 31) { + options("I need another assignment.", "Do you have anything for trade?", "Er...nothing...", "Hello, I'm here about those trees again."); + stage = 700; + break; + } + } + if (!player.getSlayer().hasStarted()) { + options("Who are you?", "Do you have anything for trade?", "Er...nothing..."); + stage = 1; + } else { + options("I need another assignment.", "Do you have anything for trade?", "Er...nothing..."); + stage = 700; + } + break; + case 1: + switch (buttonId) { + case 1: + player("Who are you?"); + stage = 10; + break; + case 2: + player("Do you have anything for trade?"); + stage = 20; + break; + case 3: + player("Er...nothing..."); + stage = 999; + break; + case 4: + player("I have a question about my Achievement Diary."); + stage = 691; + break; + } + break; + case 10: + interpreter.sendDialogues(master.getNpc(), getExpression(master), "I'm " + (master.getNpc() == 8273 ? "the lowest level Slayer Master available." : "one of the elite Slayer Masters."), + master.getNpc() == 8273 ? "The other Slayer Masters are spread around the world." : "I can teach you about the ways of the Slayer."); + stage = 11; + break; + case 11: + options("What's a Slayer?", "Never heard of you..."); + stage = 12; + break; + case 12: + switch (buttonId) { + case 1: + player("What's a Slayer?"); + stage = 100; + break; + case 2: + player("Never heard of you..."); + stage = 2000; + break; + } + break; + case 20: + interpreter.sendDialogues(master.getNpc(), getExpression(master), "I have a wide selection of Slayer equipment; take a look!"); + stage = 21; + break; + case 21: + end(); + if (npc != null) { + npc.openShop(player); + } + break; + case 100: + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Oh dear, what do they teach you in school?"); + stage = 101; + break; + case 101: + player("Well....er..."); + stage = 102; + break; + case 102: + interpreter.sendDialogues(master.getNpc(), getExpression(master), "I suppose I'll have to educate you, then. A Slayer is", "someone who is trained to fight specific creatures. They", "know those creatures' every weakenss and strength. As", "you can guess, it makes killing those creatures a lot"); + stage = 103; + break; + case 103: + interpreter.sendDialogues(master.getNpc(), getExpression(master), "easier."); + stage = 104; + break; + case 104: + options("Wow, can you teach me?", "Sounds useless to me."); + stage = 105; + break; + case 105: + switch (buttonId) { + case 1: + player("Wow, can you teach me?"); + stage = 500; + break; + case 2: + player("Sounds useless to me."); + stage = 1000; + break; + } + break; + case 500: + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Hmmm, well, I'm not so sure..."); + stage = 501; + break; + case 501: + player("Pleeeaasssse! I'll be your best friend!"); + stage = 502; + break; + case 502: + if (!master.hasRequirements(player)) { + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Sorry, but you're not strong enough to be taught by", "me."); + stage = 99; + break; + } + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Oh, okay then; you twisted my arm. You'll have to", "train against specific groups of creatures."); + stage = 503; + break; + case 503: + player("Okay then, what's first?"); + stage = 504; + break; + case 504: + if (player.getInventory().freeSlots() != 0) { + player.getInventory().add(GEM); + player.getSlayer().generate(master); + interpreter.sendDialogues(master.getNpc(), getExpression(master), "We'll start you off hunting " + player.getSlayer().getTaskName() + "'s, you'll need to", "kill " + player.getSlayer().getAmount() + " of them."); + stage = 510; + } else if (player.getInventory().freeSlots() == 0) { + player("Sorry, I don't have enough inventory space."); + stage = 999; + } + break; + case 510: + interpreter.sendDialogues(master.getNpc(), getExpression(master), "You'll also need this enchanted gem. It allows Slayer", "Masters like myself to contact you and update you on", "your progress. Don't worry if you lose it; you can buy", "another from any Slayer Master."); + stage = 511; + break; + case 511: + player("Okay, great!"); + stage = 999; + break; + case 1000: + interpreter.sendDialogues(master.getNpc(), getExpression(master), "That's what you think.."); + stage = 999; + break; + case 2000: + interpreter.sendDialogues(master.getNpc(), getExpression(master), "I am one of the greatest Slayer masters!"); + stage = 999; + break; + case 690: + switch (buttonId) { + case 1: + player("I need another assignment."); + stage = 701; + break; + case 2: + player("Do you have anything for trade?"); + stage = 20; + break; + case 3: + player("Er...nothing..."); + stage = 30; + break; + case 4: + player("I have a question about my Achievement Diary."); + stage = 691; + break; + } + break; + case 691: + sendDiaryDialogue(); + break; + case 700: + switch (buttonId) { + case 1: + player("I need another assignment."); + stage = 701; + break; + case 2: + player("Do you have anything for trade?"); + stage = 20; + break; + case 3: + player("Er...nothing..."); + stage = 30; + break; + case 4: + if (quest.getStage(player) == 30) { + player("I'm here about a quest. Ava said she saw you hanging", "around the moving trees near Draynor Manor."); + stage = 8000; + } else if (quest.getStage(player) == 31) { + player("Hello, I'm here about those trees again."); + stage = 8006; + } + break; + } + break; + case 8000:// avas. + npc("Ahh, you came to the right man, odd things, those trees.", "What is it you are needing exactly?"); + stage++; + break; + case 8001: + player("I think I need some of the wood from them, but my", "axe just bounced off the trunk."); + stage++; + break; + case 8002: + npc("Sounds like you need a blessed axe. No one really", "makes them, though these days."); + stage++; + break; + case 8003: + npc("If you can give me a mithril axe and a holy symbol of", "Saradomin I can let you have my axe. I'll make myself", "a new one when no one is pestering me for Slayer", "tasks."); + stage++; + break; + case 8004: + player("Okay, so I'll see whether I can spare an axe and a", "symbol. Thanks."); + stage++; + break; + case 8005: + quest.setStage(player, 31); + end(); + break; + case 8006: + if (player.hasItem(new Item(10491))) { + npc("You already have an axe."); + stage = 999; + break; + } + npc("I can make an axe for you now, if you wish.", "Remember, it will be no use for normal wooducutting", "after I have added the silver edge."); + stage++; + break; + case 8007: + player("I'd love one, thanks."); + stage++; + break; + case 8008: + if (!player.getInventory().containsItem(MITHRIL_AXE)) { + npc("You'll need to hand over both a mithril axe and a holy", "symbol of Saradomin. You don't have an axe in your", "pack, so I'm not able to help."); + stage = 999; + break; + } + if (!player.getInventory().containsItem(HOLY_SYMBOL)) { + npc("You'll need to hand over both a mithril axe and a holy", "symbol of Saradomin. You don't have a holy symbol in", "your pack, so I'm not able to help."); + stage = 999; + break; + } + if (player.getInventory().remove(MITHRIL_AXE, HOLY_SYMBOL)) { + player.getInventory().add(new Item(10491)); + npc("Here's a new axe; may it serve you well."); + stage = 999; + } + break; + case 701: + if (!master.hasRequirements(player)) { + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Sorry, but you're not strong enough to be taught by", "me."); + stage = 99; + break; + } + if (!player.getSlayer().hasTask()) { + player.getSlayer().generate(master); + if (player.getSlayer().getTask() == Tasks.JAD) { + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to", "defeat the almighty TzTok-Jad."); + } else { + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + player.getSlayer().getAmount() + " " + player.getSlayer().getTaskName() + "s."); + } + stage = 844; + break; + } + if (Master.hasSameTask(master, player)) { + interpreter.sendDialogues(master.getNpc(), getExpression(master), "You're still hunting something. Come back when you've", "finished your task."); + stage = 999; + } else { + player.getSlayer().setTaskCount(0); + player.getSlayer().generate(master); + if (player.getSlayer().getTask() == Tasks.JAD) { + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to", "defeat the almighty TzTok-Jad."); + } else { + interpreter.sendDialogues(master.getNpc(), getExpression(master), "Excellent, you're doing great. Your new task is to kill", "" + player.getSlayer().getAmount() + " " + player.getSlayer().getTaskName() + "'s."); + } + stage = 844; + } + break; + case 844: + if (GameWorld.getSettings().getAllow_slayer_reroll()) { + options("Got any tips for me?", "Okay, great!", "I'd like to re-roll that task."); + } else { + options("Got any tips for me?", "Okay, great!"); + } + stage = 854; + break; + case 854: + switch (buttonId) { + case 1: + interpreter.sendDialogues(master.getNpc(), getExpression(master), player.getSlayer().getTask().getTip()); + stage = 860; + break; + case 2: + player("Okay, great!"); + stage = 999; + break; + case 3: + player("I'd like to re-roll this task."); + player.getSlayer().clear(); + stage = 701; + } + break; + case 860: + player("Great, thanks!"); + stage = 999; + break; + case 900: + switch (buttonId) { + case 1: + player("Can I buy a Skillcape of Slayer?"); + stage = 901; + break; + case 2: + interpreter.sendDialogues(master.getNpc(), FacialExpression.HALF_GUILTY, "'Ello, and what are you after, then?"); + stage = 0; + break; + } + break; + case 901: + interpreter.sendDialogues(Master.DURADEL.getNpc(), FacialExpression.HALF_GUILTY, "Certainly! Right when you give me 99000 coins."); + stage = 902; + break; + case 902: + options("Okay, here you go.", "No, thanks."); + stage = 903; + break; + case 903: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 904; + break; + case 2: + end(); + break; + } + break; + case 904: + if (Skillcape.purchase(player, Skills.SLAYER)) { + interpreter.sendDialogues(Master.DURADEL.getNpc(), FacialExpression.HALF_GUILTY, "There you go! Enjoy."); + } + stage = 999; + break; + case 906: + switch (buttonId) { + case 1: + player("May I buy a Quest Point cape?"); + stage = 907; + break; + case 2: + interpreter.sendDialogues(master.getNpc(), FacialExpression.HALF_GUILTY, "'Ello, and what are you after, then?"); + stage = 0; + break; + } + break; + case 907: + npc("You bet, " + player.getUsername() + "! Right when you give me 99000 coins."); + stage = 908; + break; + case 908: + options("Okay, here you go.", "No, thanks."); + stage = 909; + break; + case 909: + switch (buttonId) { + case 1: + player("Okay, here you go."); + stage = 910; + break; + case 2: + end(); + break; + } + break; + case 910: + if (player.getInventory().freeSlots() < 2) { + player("I don't seem to have enough inventory space."); + stage = 999; + return true; + } + if (!player.getInventory().containsItem(COINS)) { + player("I don't seem to have enough coins with", "me at this time."); + stage = 999; + return true; + } + if (player.getInventory().remove(COINS) && player.getInventory().add(ITEMS)) { + npc("Have fun with it."); + stage = 999; + } else { + player("I don't seem to have enough coins with", "me at this time."); + stage = 999; + } + break; + } + return true; + } + + /** + * Checks which expression to use. + * + * @param master the master. + * @return the expression. + */ + private FacialExpression getExpression(Master master) { + if (master == Master.CHAELDAR) { + return FacialExpression.OLD_NORMAL; + } + return FacialExpression.HALF_GUILTY; + } + + /** + * Sends the diary dialogue. + */ + private void sendDiaryDialogue() { + isDiary = true; + if (diary == null) { + diary = player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK); + } + if (diary.isComplete(level) && !diary.isLevelRewarded(level)) { + player("I've completed all the hard tasks in my Varrock", "Achievement Diary and, let me tell you, it wasn't an", "easy job."); + stage = 440; + return; + } + if (diary.isLevelRewarded(level) && diary.isComplete(level) && !player.hasItem(diary.getType().getRewards(level)[0])) { + player("I've seemed to have lost my armour..."); + stage = 460; + return; + } + options("What is the Achievement Diary?", "What are the rewards?", "How do I claim the rewards?", "See you later."); + stage = 0; + } + + @Override + public int[] getIds() { + return new int[]{70, 1598, 1596, 1597, 1599, 8275, 8273, 8274, 8649}; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerPlugin.java new file mode 100644 index 000000000..c545fbcc6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerPlugin.java @@ -0,0 +1,91 @@ +package core.game.node.entity.skill.slayer; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.ClimbActionHandler; +import core.game.content.global.action.DigAction; +import core.game.content.global.action.DigSpadeHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles related slayer nodes. + * @author Vexia + */ +@Initializable +public class SlayerPlugin extends OptionHandler { + + /** + * The bryne dig locations. + */ + private static final Location[] BRYNE_DIGS = new Location[] { new Location(2749, 3733, 0), new Location(2748, 3733, 0), new Location(2747, 3733, 0), new Location(2747, 3734, 0), new Location(2747, 3735, 0), new Location(2747, 3736, 0), new Location(2748, 3736, 0), new Location(2749, 3736, 0) }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(8783).getHandlers().put("option:open", this); + ObjectDefinition.forId(8785).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(23158).getHandlers().put("option:exit", this); + ObjectDefinition.forId(23157).getHandlers().put("option:exit", this); + ObjectDefinition.forId(15767).getHandlers().put("option:enter", this); + ObjectDefinition.forId(15811).getHandlers().put("option:exit", this); + ObjectDefinition.forId(15812).getHandlers().put("option:exit", this); + ObjectDefinition.forId(96).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(35121).getHandlers().put("option:climb-down", this); + for (Location loc : BRYNE_DIGS) { + DigSpadeHandler.register(loc, new DigAction() { + @Override + public void run(Player player) { + player.teleport(new Location(2697, 10119, 0)); + player.sendMessages("You dig a hole...", "...And fall into a dark and slimy pit!"); + } + + }); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 8783: + player.teleport(new Location(2044, 4649, 0)); + break; + case 8785: + player.teleport(new Location(2543, 3327, 0)); + break; + case 23158: + case 23157: + player.teleport(new Location(2729, 3733, 0)); + break; + case 15767: + player.teleport(new Location(3748, 9373, 0)); + break; + case 15811: + case 15812: + player.teleport(new Location(3749, 2973, 0)); + break; + case 96: + ClimbActionHandler.climb(player, null, new Location(2649, 9804, 0)); + break; + case 35121: + ClimbActionHandler.climb(player, null, new Location(2641, 9763, 0)); + break; + } + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n.getId() == 23158 || n.getId() == 23157) { + return new Location(2690, 10124, 0); + } + if (n.getId() == 96) { + return new Location(2641, 9763, 0); + } + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java new file mode 100644 index 000000000..d7f820885 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerRewardPlugin.java @@ -0,0 +1,395 @@ +package core.game.node.entity.skill.slayer; + +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.skill.Skills; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the slayer reward interface plugin. + * @author Vexia + * + */ +@Initializable +public class SlayerRewardPlugin extends ComponentPlugin { + + /** + * The assignment component tab. + */ + private static final Component ASSIGNMENT = new Component(161); + + /** + * The learn component tab. + */ + private static final Component LEARN = new Component(163); + + /** + * The buy component tab. + */ + private static final Component BUY = new Component(164); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.forId(161).setPlugin(this);//assignment + ComponentDefinition.forId(163).setPlugin(this);//learn + ComponentDefinition.forId(164).setPlugin(this);//buy + PluginManager.definePlugins(new SlayerMasterPlugin(), new SlayerHelmCraftPlugin()); + return this; + } + + @Override + public void open(Player player, Component open) { + updateInterface(player, open); + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (component.getId()) { + case 161://asignment + switch (button) { + case 23://reassign + case 26: + if (!player.getSlayer().hasTask()) { + player.sendMessage("You don't have an active task right now."); + break; + } + if (purchase(player, 30)) { + player.getSlayer().clear(); + player.getSlayer().setTaskCount(0); + player.sendMessage("You have canceled your current task."); + } + break; + case 24: + case 27: + if (player.getSlayer().getTask() == null) { + player.sendMessage("You don't have a slayer task."); + break; + } + if (player.getSlayer().getRemoved().size() >= 4) { + player.sendMessage("You can't remove anymore tasks."); + break; + } + if (player.getSlayer().getSlayerPoints() >= 30 && !player.isAdmin()) { + int size = player.getSlayer().getRemoved().size(); + int qp = player.getQuestRepository().getAvailablePoints(); + if (size == 0 && qp < 50) { + player.sendMessage("You need 50 quest points as a requirement in order to block one task."); + break; + } else if (size == 1 && qp < 100) { + player.sendMessage("You need 100 quest points as a requirement in order to block two tasks."); + break; + } else if (size == 2 && qp < 150) { + player.sendMessage("You need 150 quest points as a requirement in order to block three tasks."); + break; + } else if (size == 3 && qp < 200) { + player.sendMessage("You need 200 quest points as a requirement in order to block four tasks."); + break; + } + } + if (purchase(player, 100)) { + player.getSlayer().getRemoved().add(player.getSlayer().getTask()); + player.getSlayer().clear(); + updateInterface(player, player.getInterfaceManager().getOpened()); + } + break; + case 36: + case 37: + case 38: + case 39: + int index = 3 - (39 - button); + if (player.getSlayer().getRemoved().isEmpty() || index > player.getSlayer().getRemoved().size() - 1 || player.getSlayer().getRemoved().get(index) == null) { + break; + } + player.getSlayer().getRemoved().remove(index); + updateInterface(player, player.getInterfaceManager().getOpened()); + break; + case 15: + openTab(player, BUY); + break; + case 14: + openTab(player, LEARN); + break; + } + break; + case 163://learn + switch (button) { + case 14: + openTab(player, ASSIGNMENT); + break; + case 15: + openTab(player, BUY); + break; + case 22://Broad arrows + case 29: + if (player.getSlayer().getLearned()[0]) { + player.sendMessage("You don't need to learn this ability again."); + break; + } + if (purchase(player, 300)) { + player.getSlayer().getLearned()[0] = true; + updateInterface(player, component); + } + break; + case 23://Slayer ring + case 30: + if (player.getSlayer().getLearned()[1]) { + player.sendMessage("You don't need to learn this ability again."); + break; + } + if (purchase(player, 300)) { + player.getSlayer().getLearned()[1] = true; + updateInterface(player, component); + } + break; + case 24://Slayer helm + case 31: + if (player.getSlayer().getLearned()[2]) { + player.sendMessage("You don't need to learn this ability again."); + break; + } + if (purchase(player, 400)) { + player.getSlayer().getLearned()[2] = true; + updateInterface(player, component); + } + break; + } + break; + case 164://buy + switch (button) { + case 16: + openTab(player, LEARN); + break; + case 17: + openTab(player, ASSIGNMENT); + break; + case 24://slayer exp + case 32: + if (purchase(player, 400)) { + player.getSkills().addExperience(Skills.SLAYER, 10000, false); + } + break; + case 26://ring of slaying + case 33: + if (player.getInventory().freeSlots() < 1 && player.getSlayer().getSlayerPoints() >= 75) { + player.sendMessage("You don't have enough inventory space."); + break; + } + if (purchase(player, 75)) { + player.getInventory().add(new Item(13281), player); + } + break; + case 28: + case 36: + if (purchase(player, 35)) { + player.getInventory().add(new Item(558, 750), player); + player.getInventory().add(new Item(560, 250), player); + } + break; + case 34: + case 37: + if (purchase(player, 35)) { + player.getInventory().add(new Item(13280, 250), player); + } + break; + case 35: + case 39: + if (purchase(player, 35)) { + player.getInventory().add(new Item(4172, 250), player); + } + break; + } + break; + } + return true; + } + + /** + * Purchases a slayer point reward. + * @param player The player. + * @param amount The amount of points. + * @return {@code True} if purchased. + */ + private boolean purchase(Player player, int amount) { + if (player.getSlayer().getSlayerPoints() < amount) { + player.sendMessage("You need " + amount + " slayer points in order to purchase this reward."); + return false; + } + player.getSlayer().setSlayerPoints(player.getSlayer().getSlayerPoints() - amount); + updateInterface(player, player.getInterfaceManager().getOpened()); + return true; + } + + /** + * Switches the tab on the reward interface. + * @param player The player instance + * @param open The component to open. + */ + private void openTab(Player player, Component open) { + player.getInterfaceManager().open(open); + updateInterface(player, open); + } + + /** + * Update the current points text. + * @param player the player. + * @param open the component. + */ + private void updateInterface(Player player, Component open) { + if (open == null) { + return; + } + String space = ""; + String num = String.valueOf(player.getSlayer().getSlayerPoints()); + if (num != "0") { + for (int i = 0; i < num.length(); i++) { + space += " "; + } + } + switch (open.getId()) { + case 161://assignment + int childs[] = new int[] {35, 30, 31, 32}; + String[] letters = new String[] {"A", "B", "C", "D"}; + Tasks task = null; + for (int i = 0; i < 4; i++) { + task = i > player.getSlayer().getRemoved().size() - 1 ? null : player.getSlayer().getRemoved().get(i); + player.getPacketDispatch().sendString(task == null ? letters[i] : task.getName(), open.getId(), childs[i]); + } + player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 19); + break; + case 163://learn + for (int i = 0; i < player.getSlayer().getLearned().length; i++) { + player.getPacketDispatch().sendInterfaceConfig(open.getId(), 25 + i, !player.getSlayer().getLearned()[i]); + } + player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 18); + break; + case 164://buy + player.getPacketDispatch().sendString(space + player.getSlayer().getSlayerPoints(), open.getId(), 20); + break; + } + } + + /** + * Handles the slayer master option plugin. + * @author Vexia + * + */ + public class SlayerMasterPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Master m : Master.values()) { + NPCDefinition.forId(m.getNpc()).getHandlers().put("option:rewards", this); + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + openTab(player, BUY); + return true; + } + + } + + /** + * Handles the crafting of a slayer helmet. + * @author Vexia + * + */ + public static class SlayerHelmCraftPlugin extends UseWithHandler { + + /** + * The slayer helm item. + */ + private static final Item SLAYER_HELM = new Item(13263); + + /** + * The spiny helmet. + */ + private static final Item SPINY_HELMET = new Item(4551); + + /** + * The ingredients needed. + */ + private static final int[] INGREDIENTS = new int[] {4168, 4166, 4164, 8921}; + + /** + * Constructs a new {@Code SlayerHelmCraftPlugin} {@Code Object} + */ + public SlayerHelmCraftPlugin() { + super(INGREDIENTS); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + addHandler(SPINY_HELMET.getId(), ITEM_TYPE, this); + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(SLAYER_HELM.getId()).getHandlers().put("option:disassemble", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + if (player.getInventory().freeSlots() < 4) { + player.sendMessage("You don't have enough inventory space."); + return true; + } + player.lock(1); + if (player.getInventory().remove(node.asItem())) { + for (int id : INGREDIENTS) { + player.getInventory().add(new Item(id)); + } + player.getInventory().add(SPINY_HELMET); + } + player.sendMessage("You dissasemble your Slayer helm."); + return true; + } + + }); + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + if (player.getSkills().getStaticLevel(Skills.CRAFTING) < 55) { + player.sendMessage("You need a Crafting level of at least 55 in order to do this."); + return true; + } + if (!player.getSlayer().getLearned()[2]) { + player.sendMessage("You need to unlock the ability to do that first."); + return true; + } + if (!player.getInventory().containItems(INGREDIENTS)) { + player.sendMessages("You need a nosepeg, facemask, earmuffs, spiny helmet, and a black mask in", "your inventory in order to construct a Slayer helm."); + return true; + } + player.lock(1); + if (player.getInventory().remove(SPINY_HELMET)) { + for (int id : INGREDIENTS) { + if (!player.getInventory().remove(new Item(id))) { + return true; + } + } + player.getInventory().add(SLAYER_HELM); + player.sendMessage("You combine the items into a Slayer helm."); + } + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerTowerPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerTowerPlugin.java new file mode 100644 index 000000000..34f62d5a8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerTowerPlugin.java @@ -0,0 +1,69 @@ +package core.game.node.entity.skill.slayer; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the interactions for the slayer tower. + * @author Vexia + */ +@Initializable +public final class SlayerTowerPlugin extends OptionHandler { + + /** + * The locations of the states. + */ + private static final Location[] LOCATIONS = new Location[] { new Location(3430, 3534, 0), new Location(3426, 3534, 0) }; + + /** + * The open id. + */ + private static final int OPEN_ID = 5117; + + /** + * The closed id. + */ + private static final int CLOSED_ID = 5116; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(4490).getHandlers().put("option:open", this); + ObjectDefinition.forId(4487).getHandlers().put("option:open", this); + ObjectDefinition.forId(4492).getHandlers().put("option:close", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 4490: + case 4487: + DoorActionHandler.handleAutowalkDoor(player, (GameObject) node); + switchStatue(); + return true; + } + return true; + } + + /** + * Switches the object id of the statue. + */ + private void switchStatue() { + for (Location l : LOCATIONS) { + GameObject object = RegionManager.getObject(l); + if (object != null) { + int id = object.getId() == OPEN_ID ? CLOSED_ID : OPEN_ID; + ObjectBuilder.replace(object, object.transform(id)); + } + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerTowerZone.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerTowerZone.java new file mode 100644 index 000000000..c25793144 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/SlayerTowerZone.java @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.slayer; + +import core.game.content.global.action.DoorActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the slayer tower map zone. + * @author Vexia + */ +@Initializable +public final class SlayerTowerZone extends MapZone implements Plugin { + + /** + * Constructs a new {@code SlayerTowerZone} {@code Object}. + */ + public SlayerTowerZone() { + super("slayer tower", true, ZoneRestriction.CANNON); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + Player player = (Player) e; + int level = player.getLocation().getZ() == 0 ? 61 : 71; + if (target.getId() == 9319 && e.getSkills().getLevel(Skills.AGILITY) < level) { + player.getPacketDispatch().sendMessage("You need an Agility level of at least " + level + " in order to do this."); + return true; + } + if (target.getId() == 10527 || target.getId() == 10528) { + DoorActionHandler.handleAutowalkDoor(player, (GameObject) target); + return true; + } + } + return super.interact(e, target, option); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(3401, 3527, 3459, 3585)); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Tasks.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Tasks.java new file mode 100644 index 000000000..ce60e221d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/Tasks.java @@ -0,0 +1,150 @@ +package core.game.node.entity.skill.slayer; + + +import core.cache.def.impl.NPCDefinition; + +import java.util.Arrays; +import java.util.HashMap; + +/** + * A non-garbage way of representing tasks + * @author ceik + */ +public enum Tasks { + ABERRANT_SPECTRES(65, new int[] { 1604, 1605, 1606, 1607 }, new String[] { "Aberrant spectres have an extremely potent stench that drains", "stats and life points. A nose peg, protects against the stench." }, 60, true, Equipment.NOSE_PEG), + ABYSSAL_DEMONS(85, new int[] { 1615, 4230 }, new String[] { "Abyssal Demons are nasty creatures to deal with, they aren't really part, ", "of this realm, and are able to move very quickly to trap their prey"}, 85, false, Equipment.NONE), + ANKOU(40, new int[] { 4381, 4382, 4383 }, new String[] { "Neither skeleton nor ghost, but a combination of both." }, 1, true, Equipment.NONE), + AVIANSIES(60, new int[] { 6245, 6243, 6235, 6232, 6244, 6246, 6233, 6241, 6238, 6237, 6240, 6242, 6239, 6234 }, new String[] { "Graceful, bird-like creature." }, 1, false, Equipment.NONE), + BANSHEE(20, new int[] { 1612 }, new String[] { "Banshees use a piercing scream to shock their enemies, you'll", "need some Earmuffs to protect yourself from them." }, 15, true, Equipment.EARMUFFS), + BASILISKS(40, new int[] { 1616, 1617, 4228 }, new String[] { "A mirror shield is much neccesary when hunting these", "mad creatures." }, 40, false, Equipment.NONE), + BATS(5, new int[] { 412, 78, 1005, 2482, 3711, }, new String[] { "These little creatures are incredibly quick.", "make sure you keep your eye on them at all times." }, 1, false, Equipment.NONE), + BEARS(13, new int[] { 106, 105, 1195, 3645, 3664, 1326, 1327 }, new String[] { "A large animal with a crunching punch." }, 1, false, Equipment.NONE), + BIRDS(1, new int[] { 1475, 5120, 5121, 5122, 5123, 5133, 1475, 1476, 41, 951, 1017, 1401, 1402, 2313, 2314, 2315, 1016, 1550, 147, 1180, 1754, 1755, 1756, 2252, 4570, 4571, 1911, 6114, 46, 2693, 6113, 6112, 146, 149, 150, 450, 451, 1179, 1322, 1323, 1324, 1325, 1400, 2726, 2727, 3197, 138, 48, 4373, 4374, 4535, 139, 1751, 148, 1181, 6382, 2459, 2460, 2461, 2462, 2707, 2708, 6115, 6116, 3296, 6378, 1996, 3675, 3676, 6792, 6946, 7320, 7322, 7324, 7326, 7328, 1692, 6285, 6286, 6287, 6288, 6289, 6290, 6291, 6292, 6293, 6294, 6295, 6322, 6323, 6324, 6325, 6326, 6327, 6328, 6329, 6330, 6331, 6332, }, new String[] { "irds aren't the most intelligent of creatures, but watch out for their", "sharp, stabbing beaks." }, 1, false, Equipment.NONE), + BLACK_DEMONS(80, new int[] { 84, 677, 4702, 4703, 4704, 4705 }, new String[] { "Black Demons are magic creatures that are weak to magic attacks.", "They're the strongest demon and very dangerous." }, 1, false, Equipment.NONE), + BLACK_DRAGONS(80, new int[] {54, 4673, 4674, 4675, 4676, 3376, 50 }, new String[] { "Black dragons are the strongest dragons", "watch out for their firey breath" }, 1, false, 40 | 80 << 16, Equipment.NONE), + BLOODVELDS(50, new int[] { 1618, 1619, 6215, 7643, 7642 }, new String[] { "Bloodvelds are strange demonic creatures, they use their long rasping tongue", "to feed on just about anything they can find." }, 50, false, Equipment.NONE), + BLUE_DRAGONS(65, new int[] { 55, 4681, 4682, 4683, 4684, 5178, 52, 4665, 4666, }, new String[] { "Blue dragons aren't as strong as other dragons but they're still", "very powerful, watch out for their firey breath." }, 1, false, Equipment.NONE), + BRINE_RATS(45, new int[] { 3707 }, new String[] { "Small little creatures they are, yet so very", "powerfull." }, 47, false, Equipment.NONE), + BRONZE_DRAGONS(75, new int[] { 1590 }, new String[] { "Bronze dragons aren't as strong as other dragons but they're still", "very powerful, watch out for their firey breath." }, 1, false, 30 | 60 << 16, Equipment.NONE), + CATABLEPONS(35, new int[] { 4397, 4398, 4399, }, new String[] { "They use the magic spell Weaken to drain up to 15% of their", "opponent's maximum Strength level." }, 1, false, Equipment.NONE), + CAVE_BUG(1, new int[] { 1832, 5750, }, new String[] { "It regenerates life points quickly and seems to be a good", "herblore monster." }, 7, false, Equipment.NONE), + CAVE_CRAWLERS(10, new int[] { 1600, 1601, 1602, 1603, }, new String[] { "The poisonous parts of them are presumably removed." }, 10, false, Equipment.NONE), + CAVE_HORRORS(85, new int[] { 4353, 4354, 4355, 4356, 4357, }, new String[] { "A Cave horror wears a creepy mask, it is", "prefered to wear a witchwood icon." }, 58, false, Equipment.NONE), + CAVE_SLIMES(15, new int[] { 1831 }, new String[] { "These are lesser versions of jellies, watch out they can poison you." }, 17, false, Equipment.NONE), + COCKATRICES(25, new int[] { 1620, 1621, 4227, }, new String[] { "A Mirror shield is necessary when fighting these monsters." }, 25, false, Equipment.NONE), + COWS(5, new int[] { 1766, 1768, 2310, 81, 397, 955, 1767, 3309 }, new String[] { "Cow's may seem stupid, however they know more then", "you think. Don't under estimate them." }, 1, false, Equipment.NONE), + CRAWLING_HAND(1,new int[] { 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657, 4226, 7640, 7641 }, new String[] { "Crawling Hands are undead severed hands, fast and", "dexterous they claw their victims." }, 5, true, Equipment.NONE), + CROCODILES(50, new int[] { 1993, 6779 }, new String[] { "Crocodiles can be found near water and marshes in and near the Kharidian Desert." }, 1, false, Equipment.NONE), + CYCLOPES(25,new int[] { 116, 4291, 4292, 6078, 6079, 6080, 6081, 6269, 6270 }, new String[] { "Large one eyed creatures who normally wield a", "large mallet." }, 1, false, Equipment.NONE), + DAGANNOTHS(75, new int[] { 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 2454, 2455, 2456, 2881, 2882, 2883, 2887, 2888, 3591, }, new String[] { "There are many types of Dagannoth, the most powerful being the three Dagannoth Kings." }, 1, false, Equipment.NONE), + DARK_BEASTS(90, new int[] { 2783 }, new String[] { "A dark beast can attack using magic or melee." }, 90, false, Equipment.NONE), + DESERT_LIZARDS(15, new int[] { 2803, 2804, 2805, 2806, 2807 }, new String[] { "Desert lizards are big Slayer monsters found in the Kharidian Desert." }, 22, false, Equipment.NONE), + DOG(15, new int[] { 98, 99, 3582, 6374, 1994, 1593, 1594, 3582, 6374 }, new String[] { "Dogs are much like Wolves, they are pack creatures which will hunt in groups." }, 1, false, Equipment.NONE), + DUST_DEVILS(70, new int[] { 1624 }, new String[] { "Dust Devils use clouds of dust, sand, ash and whatever", "else they can inhale to blind and disorientate", "their victims." }, 65, false, Equipment.NONE), + DWARF(6, new int[] { 118, 120, 121, 382, 3219, 3220, 3221, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3275, 3294, 3295, 4316, 5880, 5881, 5882, 5883, 5884, 5885, 2130, 2131, 2132, 2133, 3276, 3277, 3278, 3279, 119, 2423 }, new String[] { "They are slightly resistant to Magic attacks, and", "are not recommended for low levels." }, 1, false, Equipment.NONE), + EARTH_WARRIORS(35, new int[] { 124 }, new String[] { "An Earth warrior is a monster made of earth which fights using melee." }, 1, false, Equipment.NONE), + FIRE_GIANTS(65, new int[] { 110, 1582, 1583, 1584, 1585, 1586, 7003, 7004 }, new String[] { "Like other giants, Fire Giants often wield large weapons", "learn to recognise what kind of weapon it is, and act accordingly." }, 1, false, Equipment.NONE), + FLESH_CRAWLERS(15, new int[] { 4389, 4390, 4391 }, new String[] { "Flesh crawlers are medium level monsters found on", "level 2 of the Stronghold of Security." }, 1, false, Equipment.NONE), + GARGOYLES(80, new int[] { 1610, 1611, 6389 }, new String[] { "Gargoyles are winged creatures of stone. You'll need to fight them to", "near death before breaking them apart with a rock hammer." }, 75, false, Equipment.ROCK_HAMMER), + GHOSTS(13, new int[] { 103, 104, 491, 1541, 1549, 2716, 2931, 4387, 388, 5342, 5343, 5344, 5345, 5346, 5347, 5348, 1698, 5349, 5350, 5351, 5352, 5369, 5370, 5371, 5372, 5373, 5374, 5572, 6094, 6095, 6096, 6097, 6098, 6504, 13645, 13466, 13467, 13468, 13469, 13470, 13471, 13472, 13473, 13474, 13475, 13476, 13477, 13478, 13479, 13480, 13481 }, new String[] { "A Ghost is an undead monster that is found", "in various places and dungeons. " }, 1, false, Equipment.NONE), + GHOULS(25, new int[] { 1218, 3059 }, new String[] { "Ghouls are a humanoid race and the descendants of a long-dead society", "that degraded to the point that its people ate their dead." }, 1, false, Equipment.NONE), + GOBLINS(1, new int[] { 100, 101, 102, 444, 445, 489, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2678, 2679, 2680, 2681, 3060, 3264, 3265, 3266, 3267, 3413, 3414, 3415, 3726, 4261, 4262, 4263, 4264, 4265, 4266, 4267, 4268, 4269, 4270, 4271, 4272, 4273, 4274, 4275, 4276, 4407, 4408, 4409, 4410, 4411, 4412, 4479, 4480, 4481, 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4499, 4633, 4634, 4635, 4636, 4637, 5786, 5824, 5855, 5856, 6125, 6126, 6132, 6133, 6279, 6280, 6281, 6282, 6283, 6402, 6403, 6404, 6405, 6406, 6407, 6408, 6409, 6410, 6411, 6412, 6413, 6414, 6415, 6416, 6417, 6418, 6419, 6420, 6421, 6422, 6423, 6424, 6425, 6426, 6427, 6428, 6429, 6430, 6431, 6432, 6433, 6434, 6435, 6436, 6437, 6438, 6439, 6440, 6441, 6442, 6443, 6444, 6445, 6446, 6447, 6448, 6449, 6450, 6451, 6452, 6453, 6454, 6455, 6456, 6457, 6458, 6459, 6460, 6461, 6462, 6463, 6464, 6465, 6466, 6467, 6490, 6491, 6492, 6493, 6494, 6495, 6496, 6497 }, new String[] { "Goblins are mostly just annoying, but they can be vicious.", "Watch out for the spears they sometimes carry." }, 1, false, Equipment.NONE), + GORAKS(70, new int[] { 4418, 6218 }, new String[] { "Goraks can be tough monsters to fight. Be prepared." }, 1, false, Equipment.NONE), + GREATER_DEMONS(75, new int[] { 83, 4698, 4699, 4700, 4701, 6208, 6206, 6204 }, new String[] { "Greater Demons are magic creatures so they are weak to magical attacks.", "They're the strongest demon and very dangerous." }, 1, false, Equipment.NONE), + GREEN_DRAGON(52, new int[] { 941, 4677, 4678, 4679, 4680, 5362 }, new String[] { "Green dragons are very powerfull, they have fierce", "fiery breath." }, 1, false, Equipment.NONE), + HARPIE_BUG_SWARMS(45, new int[] { 3153 }, new String[] { "Harpie Bug Swarms are insectoid Slayer monsters." }, 33, false, Equipment.NONE), + HELLHOUNDS(75, new int[] { 49, 3586, 6210, }, new String[] { "Hellhounds are mid to high level demons." }, 1, false, Equipment.NONE), + HILL_GIANTS(25, new int[] { 117, 4689, 4690, 3058, 4691, 4692, 4693 }, new String[] { "Hill giants can hit up to 19 damage, and they only attack with Melee." }, 1, false, Equipment.NONE), + HOBGOBLINS(20, new int[] { 122, 123, 2685, 2686, 3061, 6608, 6642, 6661, 6684, 6710, 6722, 6727, 2687, 2688, 3583, 4898, 6275 }, new String[] { "Mysterious goblin like creatures." }, 1, false, Equipment.NONE), + ICE_FIENDS(20, new int[] { 3406, 6217, 7714, 7715, 7716 }, new String[] { "An Icefiend is a monster found on top of Ice Mountain." }, 1, false, Equipment.NONE), + ICE_GIANTS(50, new int[] { 111, 3072, 4685, 4686, 4687 }, new String[] { "Ice Giants often wield large weapons, learn to recognise", "what kind of weapon it is, and act accordingly" }, 1, false, Equipment.NONE), + ICE_WARRIOR(45, new int[] { 125, 145, 3073 }, new String[] { "Ice warriors, are cold magestic creatures." }, 1, false, Equipment.NONE), + INFERNAL_MAGES(40, new int[] { 1643, 1644, 1645, 1646, 1647 }, new String[] { "Infernal Mages are dangerous spell users, beware of their magic", "spells an go properly prepared" }, 45, false, Equipment.NONE), + IRON_DRAGONS(80, new int[] { 1591 }, new String[] { "Iron dragons aren't as strong as other dragons but they're still", "very powerful, watch out for their firey breath." }, 1, false, 40 | 59 << 16, Equipment.NONE), + JELLIES(57, new int[] { 1637, 1638, 1639, 1640, 1641, 1642 }, new String[] { "Jellies are nasty cube-like gelatinous creatures which", "absorb everything they come across into themselves." }, 52, false, Equipment.NONE), + JUNGLE_HORRORS(65, new int[] { 4348, 4349, 4350, 4351, 4352 }, new String[] { "Jungle Horrors can be found all over Mos Le'Harmless.", "They are strong and aggressive, so watch out!" }, 1, false, Equipment.NONE), + KALPHITES(15, new int[] { 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161 }, new String[] { "Kalaphite are large insects which live in great hives under the desert sands." }, 1, false, Equipment.NONE), + KURASKS(65, new int[] { 1608, 1609, 4229 }, new String[] { "A kurask is a very quick creature." }, 70, false, Equipment.NONE), + LESSER_DEMONS(60, new int[] { 82, 3064, 4694, 4695, 6208, 6204, 6206, 3064, 4696, 4697, 6101 }, new String[] { "Lesser Demons are magic creatures so they are weak to magical attacks." }, 1, false, Equipment.NONE), + MITHRIL_DRAGON(60, new int[] { 5363 }, new String[] { "Mithril dragons aren't as strong as other dragons but they're still", "very powerful, watch out for their firey breath." }, 1, false, 5 | 9 << 16, Equipment.NONE), + MINOTAURS(7, new int[] { 4404, 4405, 4406 }, new String[] { "Minotaurs are large manlike creatures but you'll", "want to be careful of their horns." }, 1, false, Equipment.NONE), + MONKEYS(1, new int[] { 132, 1463, 1464, 2301, 4344, 4363, 6943, 7211, 7213, 7215, 7217, 7219, 7221, 7223, 7225, 7227, 1455, 1459, 1460, 1456, 1457, 1458 }, new String[] { "Small agile creatures, watch out they pinch!" }, 1, false, Equipment.NONE), + MOSS_GIANTS(40, new int[] { 112, 1587, 1588, 1681, 4534, 4688, 4706 }, new String[] { "They are known to carry large sticks." }, 1, false, Equipment.NONE), + NECHRYAELS(85, new int[] { 1613 }, new String[] { "Nechryael are demons of decay which summon small winged beings which", "help them fight their victems." }, 80, false, Equipment.NONE), + OGRES(40, new int[] { 114, 115, 374, 3587, 6267 }, new String[] { "Ogres are brutal creatures, favouring large blunt maces and clubs", "they often attack without warning." }, 1, false, Equipment.NONE), + OTHERWORDLY_BEING(40, new int[] { 126 }, new String[] { "A creature filled with everlasting power." }, 1, false, Equipment.NONE), + PYREFIENDS(25, new int[] { 1633, 1634, 1635, 1636, 6216, 6631, 6641, 6660, 6668, 6683, 6709, 6721, }, new String[] { "A scorching hot creature, watch out!" }, 30, false, Equipment.NONE), + RATS(1, new int[] { 2682, 2980, 2981, 3007, 88, 224, 4928, 4929, 4936, 4937, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 4396, 4415, 7202, 7204, 7417, 7461, 87, 446, 950, 4395, 4922, 4923, 4924, 4925, 4926, 4927, 4942, 4943, 4944, 4945, 86, 87, 446, 950, 4395, 4922, 4923, 4924, 4925, 4926, 4927, 4942, 4943, 4944, 4945 }, new String[] { "Quick little rodents!" }, 1, false, Equipment.NONE), + ROCK_SLUGS(20, new int[] { 1631, 1632 }, new String[] { "A rock slug can leave behind a trail of his presence.." }, 20, false, Equipment.NONE), + SCORPIONS(7, new int[] { 107, 1477, 4402, 4403, 144 }, new String[] { "A scorpion makes a piercing sound, watch out for it's", " long sharp tail." }, 1, false, Equipment.NONE), + SHADE(30, new int[] { 3617, 1250, 1241, 1246, 1248, 1250, 428, 1240 }, new String[] { "Shades are dark and mysterious, they hide in the shadows so be wary of ambushes." }, 1, true, Equipment.NONE), + SKELETONS(15, new int[] { 90, 91, 92, 93, 94, 459, 1471, 1575, 1973, 2036, 2037, 2715, 2717, 3065, 3151, 3291, 3581, 3697, 3698, 3699, 3700, 3701, 3702, 3703, 3704, 3705, 3844, 3850, 3851, 4384, 4385, 4386, 5332, 5333, 5334, 5335, 5336, 5337, 5338, 5339, 5340, 5341, 5359, 5365, 5366, 5367, 5368, 5381, 5384, 5385, 5386, 5387, 5388, 5389, 5390, 5391, 5392, 5411, 5412, 5422, 6091, 6092, 6093, 6103, 6104, 6105, 6106, 6107, 6764, 6765, 6766, 6767, 6768 }, new String[] { "Skeletons are undead monsters found in various locations." }, 1, true, Equipment.NONE), + SPIDERS(1, new int[] { 61, 1004, 1221, 1473, 1474, 63, 4401, 2034, 977, 7207, 134, 1009, 59, 60, 4400, 58, 62, 1478, 2491, 2492, 6376, 6377, }, new String[] { "Level 24 spiders are aggressive and can hit up to 60 life points." }, 1, false, Equipment.NONE), + SPIRTUAL_MAGES(60, new int[] { 6221, 6231, 6257, 6278 }, new String[] { "They are dangerous, they hit with mage." }, 83, false, Equipment.NONE), + SPIRTUAL_RANGERS(60, new int[] { 6220, 6230, 6256, 6276 }, new String[] { "They are dangerous, they hit with range." }, 63, false, Equipment.NONE), + SPIRTUAL_WARRIORS(60, new int[] { 6219, 6229, 6255, 6277, }, new String[] { "They are dangerous, they hit with melee." }, 68, false, Equipment.NONE), + STEEL_DRAGONS( 85,new int[] { 1592, 3590 }, new String[] { "Steel dragons aren't as strong as other dragons but they're still", "very powerful, watch out for their firey breath." }, 1, false, 10 | 20 << 16, Equipment.NONE), + TROLLS(60, new int[] { 72, 3584, 1098, 1096, 1097, 1095, 1101, 1105, 1102, 1103, 1104, 1130, 1131, 1132, 1133, 1134, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1138, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 3840, 3841, 3842, 3843, 3845, 1933, 1934, }, new String[] { "Trolls have a crushing attack, it's bets to wear a high crushing defence." }, 1, false, Equipment.NONE), + TUROTHS(60, new int[] { 1626, 1627, 1628, 1629, 1630 }, new String[] { "Turoths are Slayer monsters that require a Slayer level of 55 to kill" }, 55, false, Equipment.NONE), + TZHAAR(45, new int[] { 2591, 2592, 2593, 2745, 2594, 2595, 2596, 2597, 2604, 2605, 2606, 2607, 2608, 2609, 7755, 7753, 2598, 2599, 2600, 2601, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2624, 2617, 2618, 2625, 2602, 2603, 7754, 7767, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2624, 2625, 2627, 2628, 2629, 2630, 2631, 2632, 7746, 7747, 7748, 7749, 7750, 7751, 7752, 7753, 7754, 7755, 7756, 7757, 7758, 7759, 7760, 7761, 7762, 7763, 7764, 7765, 7766, 7767, 7768, 7769, 7770, 7771, 7747, 7747, 7748, 7749, 7750, 7751, 7752, 7753, 7757, 7765, 7769, 7768 }, new String[] { "Young Tzhaar's of the century are furious with your kind." }, 1, false, Equipment.NONE), + VAMPIRES(35, new int[] { 1023, 1220, 1223, 1225, 6214 }, new String[] { "Vampies arr equiped with large fangs", "they can do serious damage." }, 1, false, Equipment.NONE), + WATERFIENDS(75, new int[] { 5361 }, new String[] { "A waterfiend takes no damage from fire!" }, 1, false, Equipment.NONE), + WEREWOLFS(60, new int[] { 1665, 6006, 6007, 6008, 6009, 6010, 6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6019, 6020, 6021, 6022, 6023, 6024, 6025, 6212, 6213, 6607, 6609, 6614, 6617, 6625, 6632, 6644, 6663, 6675, 6686, 6701, 6712, 6724, 6728, }, new String[] { "There temper is alot more nasty then a regular wolf!" }, 1, false, Equipment.NONE), + WOLVES(20, new int[] { 95, 96, 97, 141, 142, 143, 839, 1198, 1330, 1558, 1559, 1951, 1952, 1953, 1954, 1955, 1956, 4413, 4414, 6046, 6047, 6048, 6049, 6050, 6051, 6052, 6829, 6830, 7005 }, new String[] { "Wolves are more agressive then dog's." }, 1, false, Equipment.NONE), + ZOMBIES(10, new int[] { 73, 74, 75, 76, 2058, 2714, 2863, 2866, 2869, 2878, 3622, 4392, 4393, 4394, 5293, 5294, 5295, 5296, 5297, 5298, 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5312, 5313, 5314, 5315, 5316, 5317, 5318, 5319, 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, 5328, 5329, 5330, 5331, 5375, 5376, 5377, 5378, 5379, 5380, 5393, 5394, 5395, 5396, 5397, 5398, 5399, 5400, 5401, 5402, 5403, 5404, 5405, 5406, 5407, 5408, 5409, 5410, 6099, 6100, 6131, }, new String[] { "Zombies are creatures with no brain, they do hit farley", "high though." }, 1, true, Equipment.NONE), + JAD(90, new int[] { }, new String[] { "TzTok-Jad is the king of the Fight Caves." }, 1, false, 1 | 1 << 16, Equipment.NONE), + CHAOS_ELEMENTAL(90, new int[] { 3200 }, new String[] { "The Chaos Elemental is located in the deep Wilderness." }, 1, false, 5 | 25 << 16, Equipment.NONE), + GIANT_MOLE(75, new int[] { 3340 }, new String[] { "Fighting the Giant Mole will require a light source." }, 1, false, 5 | 25 << 16, Equipment.NONE), + KING_BLACK_DRAGON(75, new int[] { 50 }, new String[] { "The King Black Dragon is located in the deep wilderness." }, 1, false, 5 | 25 << 16, Equipment.NONE), + COMMANDER_ZILYANA(90, new int[] { 6247 }, new String[] { "Commander Zilyana is one of the four Godwars bosses." }, 1, false, 5 | 25 << 16, Equipment.NONE), + GENERAL_GRARDOOR(90, new int[] { 6260 }, new String[] { "General Grardoor is one of the four Godwars bosses." }, 1, false, 5 | 25 << 16, Equipment.NONE), + KRIL_TSUTSAROTH(90, new int[] { 6203 }, new String[] { "Kril Tsutsaroth is one of the four Godwars bosses." }, 1, false, 5 | 25 << 16, Equipment.NONE), + KREE_ARRA(90, new int[] { 6222 }, new String[] { "Kree'arra is one of the four Godwars bosses." }, 1, false, 5 | 25 << 16, Equipment.NONE), + SKELETAL_WYVERN(70, new int[] { 3068, 3069, 3070, 3071 }, new String[] { "A skeletal wyvern requires an elemental, mirror", "or dragonfire shield." }, 72, false, 24 | 39 << 16, Equipment.NONE); + + static final HashMap taskMap = new HashMap<>(); + static{ + Arrays.stream(Tasks.values()).forEach(entry -> Arrays.stream(entry.ids).forEach(id -> taskMap.putIfAbsent(id,entry))); + } + public int levelReq, combatCheck; + public String[] info; + public int[] ids; + public boolean undead; + public Equipment recEquip; + public int amtHash; + Tasks(int combatCheck, int[] ids, String[] info, int levelReq, boolean undead, Equipment recEquip){ + this.levelReq = levelReq; + this.ids = ids; + this.info = info; + this.undead = undead; + this.recEquip = recEquip; + this.combatCheck = combatCheck; + } + + Tasks(int combatCheck,int[] ids, String[] info, int levelReq, boolean undead, int amtHash, Equipment recEquip){ + this.levelReq = levelReq; + this.ids = ids; + this.info = info; + this.undead = undead; + this.recEquip = recEquip; + this.amtHash = amtHash; + this.combatCheck = combatCheck; + } + + public int[] getNpcs(){ + return ids; + } + + public String[] getTip(){ + return info; + } + + public static Tasks forId(int id){ + return taskMap.get(id); + } + + public String getName(){ + return NPCDefinition.forId(ids[0]).getName(); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/TurothNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/TurothNPC.java new file mode 100644 index 000000000..c36239f22 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/TurothNPC.java @@ -0,0 +1,61 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager.SpellBook; +import core.game.world.map.Location; +import core.plugin.Initializable; + +/** + * Handles the turoth npc. + * @author Vexia + */ +@Initializable +public final class TurothNPC extends AbstractNPC { + + /** + * Constructs a new {@code TurothNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public TurothNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code TurothNPC} {@code Object}. + */ + public TurothNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new TurothNPC(id, location); + } + + @Override + public void checkImpact(final BattleState state) { + super.checkImpact(state); + boolean effective = false; + if (state.getAttacker() instanceof Player) { + final Player player = (Player) state.getAttacker(); + if ((state.getWeapon() != null && state.getWeapon().getId() == 4158) || (state.getAmmunition() != null && state.getAmmunition().getItemId() == 4160) || (state.getWeapon() != null && state.getWeapon().getId() == 13290) || (state.getSpell() != null && state.getSpell().getSpellId() == 31 && player.getSpellBookManager().getSpellBook() == SpellBook.MODERN.getInterfaceId())) { + effective = true; + } + } + if (!effective) { + state.setEstimatedHit(0); + if (state.getSecondaryHit() > 0) { + state.setSecondaryHit(0); + } + } + } + + @Override + public int[] getIds() { + return new int[] { 1626, 1627, 1628, 1629, 1630 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/WaterFiendNPC.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/WaterFiendNPC.java new file mode 100644 index 000000000..0f5900d54 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/WaterFiendNPC.java @@ -0,0 +1,58 @@ +package core.game.node.entity.skill.slayer; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.SwitchAttack; +import core.game.node.entity.combat.handlers.MultiSwingHandler; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.AbstractNPC; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; + +/** + * Handles the water fiend npc. + * @author Vexia + */ +@Initializable +public final class WaterFiendNPC extends AbstractNPC { + + /** + * Handles the combat. + */ + private final CombatSwingHandler combatAction = new MultiSwingHandler(true, new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), new Animation(1581, Priority.HIGH), null, null, Projectile.create((Entity) null, null, 500, 15, 30, 50, 50, 14, 255)), new SwitchAttack(CombatStyle.RANGE.getSwingHandler(), new Animation(1581, Priority.HIGH), null, null, Projectile.create((Entity) null, null, 16, 15, 30, 50, 50, 14, 255))); + + /** + * Constructs a new {@code WaterFiendNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public WaterFiendNPC(int id, Location location) { + super(id, location); + } + + /** + * Constructs a new {@code WaterFiendNPC} {@code Object}. + */ + public WaterFiendNPC() { + super(0, null); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new WaterFiendNPC(id, location); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + return combatAction; + } + + @Override + public int[] getIds() { + return Tasks.WATERFIENDS.getNpcs(); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/AncientCavern.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/AncientCavern.java new file mode 100644 index 000000000..46f506aff --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/AncientCavern.java @@ -0,0 +1,234 @@ +package core.game.node.entity.skill.slayer.dungeon; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.plugin.Initializable; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.MinimapState; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +/** + * Handles the ancient cavern. + * @author Vexia + */ +@Initializable +public final class AncientCavern extends MapZone implements Plugin { + + /** + * The loots recieved when rummaging a skeleton. + */ + private static final Item[] LOOTS = new Item[] { new Item(526), new Item(11337), new Item(11341) }; + + /** + * The skeleton barbarian id. + */ + private static final int[] SKELETONS = new int[] { 6103, 6106 }; + + /** + * Constructs a new {@code AnicentCavern} {@code Object}. + */ + public AncientCavern() { + super("ancient cavern", true, ZoneRestriction.CANNON); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(25274).getHandlers().put("option:dive in", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + AgilityHandler.forceWalk(player, -1, player.getLocation(), player.getLocation().transform(0, -6, 0), Animation.create(6723), 10, 0.0, null); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 4: + player.getInterfaceManager().openOverlay(new Component(115)); + break; + case 7: + player.getAnimator().reset(); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeOverlay(); + player.getProperties().setTeleportLocation(Location.create(1763, 5365, 1)); + player.getPacketDispatch().sendMessages("You dive into the swirling maelstorm of the whirlpool.", "You are swirled beneath the water, the darkness and pressure are overwhelming.", "Mystical forces guide you into a cavern below the whirlpool."); + return true; + } + return false; + } + }); + return true; + } + + @Override + public Location getDestination(Node node, Node n) { + if (node.getLocation().getX() <= 2511) { + return Location.create(2511, 3516, 0); + } else { + return Location.create(2512, 3516, 0); + } + } + + }); + return this; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (e instanceof Player) { + Player player = (Player) e; + switch (target.getId()) { + case 25216: + handleLog(player); + return true; + case 25362: + rummageSkeleton(player, (GameObject) target); + return true; + } + } + return super.interact(e, target, option); + } + + /** + * Handles the log ride. + * @param player the player. + */ + private void handleLog(final Player player) { + player.removeAttribute("canClose"); + player.lock(14); + player.getImpactHandler().setDisabledTicks(14); + GameWorld.getPulser().submit(new Pulse(1) { + int count = 0; + + @Override + public boolean pulse() { + switch (count++) { + case 1: + Component c = new Component(115); + c.setCloseEvent(new CloseEvent() { + + @Override + public boolean close(Player player, Component c) { + if (player.getAttribute("canClose", false)) { + return true; + } + return false; + } + + }); + player.getInterfaceManager().open(c); + break; + case 3: + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 2)); + player.getInterfaceManager().hideTabs(0, 1, 2, 3, 4, 5, 6, 11, 12); + break; + case 13: + player.getProperties().setTeleportLocation(Location.create(2532, 3412, 0)); + break; + case 14: + player.setAttribute("canClose", true); + player.unlock(); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeOverlay(); + player.getInterfaceManager().restoreTabs(); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + return true; + } + return false; + } + + }); + } + + /** + * Rummages a skeleton. + * @param player the player. + * @param object the object. + */ + private void rummageSkeleton(Player player, GameObject object) { + final boolean fullInvy = player.getInventory().freeSlots() < 1; + final int random = RandomFunction.random(0, 2); + player.getPacketDispatch().sendMessages("You rummage in the sharp, slimy pile of bones in search of something useful..."); + if (random == 0) { + if (!fullInvy) { + player.getInventory().add(LOOTS[RandomFunction.random(LOOTS.length)], player); + player.getPacketDispatch().sendMessage("...you find something and stow it in your pack."); + } else { + player.getPacketDispatch().sendMessage("...you find something, but it drops to the floor."); + } + } else if (random == 1) { + NPC spawn = NPC.create(SKELETONS[RandomFunction.random(SKELETONS.length)], object.getLocation()); + spawn.init(); + spawn.setRespawn(false); + removeSkeleton(object, spawn); + spawn.getProperties().getCombatPulse().attack(player); + player.getPacketDispatch().sendMessage("...the bones object."); + } else { + player.getPacketDispatch().sendMessage("...but there's nothing remotely valuable."); + } + if (RandomFunction.random(10) < 3) { + player.getImpactHandler().manualHit(player, RandomFunction.random(14), HitsplatType.NORMAL); + } + } + + /** + * Removes a skeleton. + * @param object the object. + * @param spawn the spawn. + */ + private void removeSkeleton(final GameObject object, final NPC spawn) { + ObjectBuilder.remove(object); + GameWorld.getPulser().submit(new Pulse(200) { + @Override + public boolean pulse() { + if (spawn != null && spawn.isActive()) { + spawn.clear(); + } + ObjectBuilder.add(object); + return true; + } + }); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return this; + } + + @Override + public void configure() { + register(new ZoneBorders(1723, 5296, 1831, 5394)); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.java new file mode 100644 index 000000000..db9df789c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/FremennikDungeon.java @@ -0,0 +1,111 @@ +package core.game.node.entity.skill.slayer.dungeon; + +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.agility.AgilityHandler; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +/** + * Represents the femennik dungeon zone. + * @author Vexia + */ +@Initializable +public final class FremennikDungeon extends MapZone implements Plugin { + + /** + * Constructs a new {@code FremennikDungeon} {@code Object}. + */ + public FremennikDungeon() { + super("fremennik", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return true; + } + + @Override + public boolean interact(Entity entity, Node target, Option option) { + if (entity instanceof Player && target instanceof GameObject) { + final Player player = (Player) entity; + final GameObject object = (GameObject) target; + final Direction dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + switch (target.getId()) { + case 9326:// pyrefiend area. + if (player.getSkills().getLevel(Skills.AGILITY) < 81) { + player.getPacketDispatch().sendMessage("You need an Agility level of at least 81 to do this."); + return true; + } + player.lock(); + GameWorld.getPulser().submit(new Pulse(1, player) { + int count; + + @Override + public boolean pulse() { + switch (++count) { + case 1: + Location start = object.getLocation().transform(dir.getOpposite(), 2); + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(start.getX(), start.getY()); + break; + case 2: + player.faceLocation(object.getLocation()); + break; + case 3: + Location end = object.getLocation().transform(dir, 1); + AgilityHandler.forceWalk(player, -1, player.getLocation(), end, Animation.create(1995), 20, 0.0, null); + break; + case 4: + final boolean fail = AgilityHandler.hasFailed(player, 20, 0.1); + if (fail) { + player.getImpactHandler().manualHit(player, RandomFunction.random(6), HitsplatType.NORMAL); + player.getPacketDispatch().sendMessage("You trigger the trap as you jump over it."); + } + player.animate(Animation.create(1603)); + player.unlock(); + return true; + } + return false; + } + }); + return true; + case 9321: + if (player.getSkills().getLevel(Skills.AGILITY) < 62) { + player.getPacketDispatch().sendMessage("You need an Agility level of at least 62 to do this."); + return true; + } + Location end = object.getLocation().transform(dir, 4); + AgilityHandler.walk(player, -1, player.getLocation(), end, Animation.create(156), 10, "You climb your way through the narrow crevice."); + return true; + } + } + return super.interact(entity, target, option); + } + + @Override + public void configure() { + register(new ZoneBorders(2671, 9950, 2813, 10054)); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.java new file mode 100644 index 000000000..2a9c1825d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/LumbridgeDungeon.java @@ -0,0 +1,181 @@ +package core.game.node.entity.skill.slayer.dungeon; + +import core.cache.def.impl.NPCDefinition; +import core.game.node.entity.skill.slayer.Equipment; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.AbstractNPC; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +import java.util.HashMap; +import java.util.Map; + +/** + * Handles the lumbridge dungeon. + * @author Vexia + */ +@Initializable +public final class LumbridgeDungeon extends MapZone implements Plugin { + + /** + * The beast locations to check. + */ + private static final Map BEASTS = new HashMap<>(); + + /** + * Constructs a new {@code LumbridgeDungeon} {@code Object}. + */ + public LumbridgeDungeon() { + super("lumbridge swamp dungeon", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + PluginManager.definePlugin(new WallBeastNPC()); + return this; + } + + /* + * @Override public boolean move(Entity e, Location loc, Location dest) { if + * (!e.getLocks().isMovementLocked() && e instanceof Player) { final + * WallBeastNPC npc = BEASTS.get(e.getLocation()); if (npc != null) { + * e.setDirection(Direction.getLogicalDirection(loc, dest)); return false; } + * } return super.move(e, loc, dest); } + */ + + @Override + public void locationUpdate(Entity entity, Location last) { + if (entity instanceof Player) { + final Player player = (Player) entity; + final WallBeastNPC npc = BEASTS.get(last); + if (npc != null && npc.canAttack(player)) { + npc.trigger(player); + } + } + } + + /** + * Checks if the player has the helmet. + * @param player the player. + * @return {@code True} if so. + */ + private boolean hasHelmet(final Player player) { + return Equipment.SPINY_HELMET.hasEquipment(player); + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + return super.interact(e, target, option); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(3137, 9534, 3295, 9602)); + } + + /** + * Handles the wall beast npc. + * @author Vexia + */ + public final class WallBeastNPC extends AbstractNPC { + + /** + * Constructs a new {@code WallBeastNPC} {@code Object}. + * @param id the id. + * @param location the location. + */ + public WallBeastNPC(int id, Location location) { + super(id, location,false); + } + + /** + * Constructs a new {@code WallBeastNPC} {@code Object}. + */ + public WallBeastNPC() { + super(7823, null,false); + } + + @Override + public AbstractNPC construct(int id, Location location, Object... objects) { + return new WallBeastNPC(id, location); + } + + @Override + public void init() { + super.init(); + getLocks().lockMovement(Integer.MAX_VALUE); + BEASTS.put(getLocation().transform(Direction.SOUTH, 1), this); + } + + @Override + public void handleTickActions() { + super.handleTickActions(); + + } + + /** + * Triggers the beast. + * @param player the player. + */ + public void trigger(final Player player) { + boolean isProtected = hasHelmet(player); + player.face(this); + if (!isProtected) { + animate(NPCDefinition.forId(7823).getCombatAnimation(3)); + player.animate(Animation.create(1810)); + GameWorld.getPulser().submit(new Pulse(8, player) { + @Override + public boolean pulse() { + getAnimator().reset(); + player.getAnimator().reset(); + player.getImpactHandler().handleImpact(WallBeastNPC.this, RandomFunction.random(1, 18), CombatStyle.MELEE); + return true; + } + }); + return; + } else { + transform(7823); + attack(player); + } + } + + @Override + public void finalizeDeath(Entity killer) { + //TODO + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + @Override + public int[] getIds() { + //return Tasks.WALL_BEASTS.getTask().getNpcs(); + int[] empty = {}; + return empty; + } + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.java new file mode 100644 index 000000000..0e3e6437d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/SmokeDungeon.java @@ -0,0 +1,181 @@ +package core.game.node.entity.skill.slayer.dungeon; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.node.entity.skill.slayer.Equipment; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.ZoneBuilder; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the smoke dungeon. + * @author Vexia + */ +@Initializable +public final class SmokeDungeon extends MapZone implements Plugin { + + /** + * The chats to send. + */ + private static final String[] CHATS = new String[] { "*choke*", "*cough*" }; + + /** + * The players list. + */ + private static final List PLAYERS = new ArrayList<>(); + + /** + * The tick delay until the next effect. + */ + private static final int DELAY = 20; + + /** + * The smoke effect pulse. + */ + private static Pulse pulse = new Pulse(3) { + @Override + public boolean pulse() { + for (Player player : PLAYERS) { + if (player.getInterfaceManager().isOpened() || player.getInterfaceManager().hasChatbox() || player.getLocks().isMovementLocked()) { + continue; + } + if (SmokeDungeon.getDelay(player) < GameWorld.getTicks() && !isProtected(player)) { + effect(player); + } + } + return PLAYERS.isEmpty(); + } + }; + + /** + * Constructs a new {@code SmokeDungeon} {@code Object} + */ + public SmokeDungeon() { + super("zmoke dungeon", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + PluginManager.definePlugin(new OptionHandler() { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(36002).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(6439).getHandlers().put("option:climb-up", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (node.getId()) { + case 36002: + player.getProperties().setTeleportLocation(Location.create(3206, 9379, 0)); + player.getPacketDispatch().sendMessage("You climb down the well."); + break; + case 6439: + player.getProperties().setTeleportLocation(Location.create(3310, 2963, 0)); + player.getPacketDispatch().sendMessage("You climb up the rope."); + break; + } + return true; + } + + }); + ZoneBuilder.configure(this); + return this; + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player p = (Player) e; + setDelay(p); + PLAYERS.add(p); + if (!pulse.isRunning()) { + pulse.restart(); + pulse.start(); + GameWorld.getPulser().submit(pulse); + } + p.getInterfaceManager().openOverlay(new Component(118)); + } + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + Player p = (Player) e; + p.getInterfaceManager().closeOverlay(); + PLAYERS.remove(e); + e.removeAttribute("smoke-delay"); + } + return super.leave(e, logout); + } + + /** + * Effects the player with smoke. + * @param player the player. + */ + private static void effect(Player player) { + int hit = 2; + setDelay(player); + if (RandomFunction.random(2) == 1) { + player.sendChat(CHATS[RandomFunction.random(CHATS.length)]); + player.getPacketDispatch().sendMessage("The stagnant, smoky air chokes you."); + } + player.getImpactHandler().manualHit(player, hit, HitsplatType.NORMAL); + } + + /** + * Sets the delay on the player. + * @param player the player. + */ + private static void setDelay(Player player) { + player.setAttribute("smoke-delay", GameWorld.getTicks() + DELAY); + } + + /** + * Gets the smoke delay. + * @param player the player. + * @return the delay. + */ + private static int getDelay(Player player) { + return player.getAttribute("smoke-delay", 0); + } + + /** + * Checks if the player is protected. + * @param player the player. + * @return {@code True} if so. + */ + private static boolean isProtected(Player player) { + return Equipment.FACEMASK.hasEquipment(player); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return this; + } + + @Override + public void configure() { + register(new ZoneBorders(3196, 9337, 3344, 9407)); + pulse.stop(); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/StrongholdSlayerCave.java b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/StrongholdSlayerCave.java new file mode 100644 index 000000000..018171acf --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/dungeon/StrongholdSlayerCave.java @@ -0,0 +1,241 @@ +/* +package core.game.node.entity.skill.slayer.dungeon; + +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.gather.SkillingTool; +import core.game.node.entity.skill.slayer.Master; +import org.crandor.game.interaction.Option; +import org.crandor.game.node.Node; +import org.crandor.game.node.entity.Entity; +import org.crandor.game.node.entity.combat.CombatStyle; +import org.crandor.game.node.entity.impl.ForceMovement; +import org.crandor.game.node.entity.npc.NPC; +import org.crandor.game.node.entity.player.Player; +import org.crandor.game.node.object.GameObject; +import org.crandor.game.node.object.ObjectBuilder; +import org.crandor.game.system.task.Pulse; +import org.crandor.game.world.map.Location; +import org.crandor.game.world.map.zone.MapZone; +import org.crandor.game.world.map.zone.ZoneBorders; +import org.crandor.game.world.map.zone.ZoneBuilder; +import org.crandor.game.world.update.flag.context.Animation; +import org.crandor.plugin.InitializablePlugin; +import org.crandor.plugin.Plugin; + +*/ +/** + * Handles the stronghold slayer cave. + * @author Vexia + * @author Empathy + * + *//* + +@InitializablePlugin +public class StrongholdSlayerCave extends MapZone implements Plugin { + + */ +/** + * The step over animation. + *//* + + private final Animation stepOver = new Animation(1603); + + */ +/** + * The climb animation. + *//* + + private final Animation climb = new Animation(3063); + + */ +/** + * Constructs a new @{Code StrongholdSlayerCave} object. + *//* + + public StrongholdSlayerCave() { + super("Slayer stronghold zone", true); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ZoneBuilder.configure(this); + return this; + } + + @Override + public boolean interact(Entity e, final Node node, Option option) { + int id = node.getId(); + final Player player = e.asPlayer(); + switch (option.getName().toLowerCase()) { + case "attack": + if (player.isAdmin()) { + player.attack(node); + return true; + } + attack: { + if (player.getSlayer().getMaster() == Master.NIEVE) { + for (int i : player.getSlayer().getTask().getNpcs()) { + if (i != id) { + continue; + } + player.attack(node); + break attack; + } + } + player.face(node.asNpc()); + player.getDialogueInterpreter().sendDialogues(Master.NIEVE.getNpc(), FacialExpression.OLD_NORMAL, "That's not your assigned Slayer target. In my cave,", "I expect people to focus on their Slayer training."); + } + return true; + case "enter": + switch (id){ + case 44131://stronghold entrance + player.teleport(Location.create(2444, 9825, 0)); + break; + case 42284://kraken entrance + player.teleport(Location.create(3696, 5798, 0)); + break; + } + return true; + case "use": + switch (id) { + case 42287: + player.teleport(Location.create(2430, 3424, 0)); + break; + case 42340: + player.teleport(Location.create(2486, 9797, 0)); + break; + } + return true; + case "chop": + final GameObject object = node.asObject(); + SkillingTool axe = SkillingTool.getHatchet(player); + if (axe == null) { + player.sendMessage("You need an axe to chop through this."); + return true; + } + player.animate(axe.getAnimation()); + player.getPulseManager().run(new Pulse(3, player) { + + @Override + public boolean pulse() { + if (ObjectBuilder.replace(object, object.transform(0), 2)) { + Location destination = getRootLocation(player, object); + player.lock(3); + player.getWalkingQueue().reset(); + player.getWalkingQueue().addPath(destination.getX(), destination.getY(), true); + return true; + } + return true; + } + + }); + return true; + case "climb": + final GameObject mud = node.asObject(); + final Location rightPile = Location.create(2427, 9763, 0); + final Location leftPile = Location.create(2427, 9766, 0); + if (id == 42311) { + if (player.getSkills().getLevel(Skills.AGILITY) < 72) { + player.sendMessage("You need an Agility level of at least 72 to negotiate this obstacle."); + return true; + } + final boolean northPile = mud.getLocation().equals(leftPile); + ForceMovement.run(player, player.getLocation(), northPile ? leftPile : rightPile, climb); + player.getPulseManager().run(new Pulse(1, player) { + + int count; + + @Override + public boolean pulse() { + count++; + if (count == 6) { + player.teleport(Location.create(2427, northPile ? 9762 : 9767, 0)); + return true; + } + if (count == 3) { + player.teleport(northPile ? rightPile : leftPile); + player.faceLocation(northPile ? leftPile : rightPile); + return false; + } + return false; + } + + }); + + } + return true; + case "step-over": + final GameObject root = node.asObject(); + final Location destination = getRootLocation(player, root); + player.getPulseManager().run(new Pulse(1, player) { + + @Override + public boolean pulse() { + ForceMovement.run(player, player.getLocation(), destination, stepOver); + return true; + } + + }); + return true; + } + return super.interact(e, node, option); + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + @Override + public void configure() { + register(new ZoneBorders(2244, 9730, 2506, 9845)); + registerRegion(14682); + registerRegion(9525); + registerRegion(14939); + } + + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (!e.isPlayer() || !(target instanceof NPC)) { + return super.continueAttack(e, target, style, message); + } + Player player = e.asPlayer(); + if (player.isAdmin()) { + return super.continueAttack(player, target, style, message); + } + int id = target.getId(); + if (player.getSlayer().getMaster() == Master.NIEVE) { + for (int i : player.getSlayer().getTask().getNpcs()) { + if (i != id) { + continue; + } + return super.continueAttack(player, target, style, message); + } + } + player.face(target.asNpc()); + player.getDialogueInterpreter().sendDialogues(Master.NIEVE.getNpc(), FacialExpression.OLD_NORMAL, "That's not your assigned Slayer target. In my cave,", "I expect people to focus on their Slayer training."); + return false; + } + + */ +/** + * Gets the location for the player to move to. + * @param player The player. + * @param object The object. + *//* + + private Location getRootLocation(Player player, GameObject object) { + Location obj = object.getLocation(); + Location play = player.getLocation(); + if (obj.getY() == play.getY()) { + int newX = (play.getX() - obj.getX() > 0 ? obj.getX() - 1 : obj.getX() + 1); + return Location.create(newX, play.getY(), play.getZ()); + } + int newY = (play.getY() - obj.getY() > 0 ? obj.getY() - 1 : obj.getY() + 1); + return Location.create(play.getX(), newY, play.getZ()); + } + +} +*/ diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/slayer/unused-tasks b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/unused-tasks new file mode 100644 index 000000000..03501f20e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/slayer/unused-tasks @@ -0,0 +1,92 @@ + /*WALL_BEASTS(new Task(new int[] { 7823 }, new String[] { "A spiny helmet or equivalent is required to start fighting one " }, 35, new Master[] { Master.MAZCHNA }, false, Equipment.SPINY_HELMET) { + @Override + public boolean isDisabled() { + return true; + } + }), + WARPED_TERRORBIRDS(new Task(new int[] { 6285, 6286, 6287, 6288, 6289, 6290, 6291, 6292, 6293, 6294, 6295, 6322, 6323, 6324, 6325, 6326, 6327, 6328, 6329, 6330, 6331, 6332, }, new String[] { "They require 56 Slayer and a Crystal chime to be killed. " }, 56, new Master[] { Master.DURADEL }, false) { + @Override + public boolean isDisabled() { + return true; + } + }), + WARPED_TORTOISES(new Task(new int[] { 6296, 6297 }, new String[] { "A warped tortoise is not as slow as they look." }, 56, new Master[] { Master.DURADEL }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ +/*CERBERUS(new Task(new int[] {8632, 8634}, new String[] {"Cerberus is about the best guard dog there is!"}, 91, new Master[] {Master.VANNAKA, Master.CHAELDAR, Master.NIEVE, Master.DURADEL}, false, 20 | 25 << 16) { + @Override + public boolean isDisabled() { + return true; + } + })*/ +/*ZYGOMITES(new Task(new int[] { 3346, 3347 }, new String[] { "Mutated zygomites are monsters that appear as Fungi until provoked." }, 57, new Master[] { Master.CHAELDAR }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ +/*SUQAHS(new Task(new int[] { 4527, 4528, 4529, 4530, 4531, 4532, 4533 }, new String[] {}, 1, new Master[] { Master.DURADEL }, false) { + @Override + public boolean isDisabled() { + return true; + } + }), + TERROR_DOG(new Task(new int[] { 5417, 5418 }, new String[] { "Terror Dogs are much like Wolves, they are pack creatures which will hunt in groups." }, 1, new Master[] { Master.VANNAKA, Master.DURADEL }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ +/*SHADOW_WARRIORS(new Task(new int[] { 158 }, new String[] { "Shadow warriors are dark and mysterious, they hide in the shadows so be wary of ambushes." }, 1, new Master[] { Master.VANNAKA, Master.CHAELDAR }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ +//MOGRES(new Task(new int[] { 114 }, new String[] { "Mogres are Slayer monsters and require level 32 Slayer to kill. " }, 32, new Master[] { Master.MAZCHNA, Master.VANNAKA }, false)), + /*MOLANISKS(new Task(new int[] { 5751 }, new String[] { "Molanisks are found attached to cave walls and must be lured", "off with a Slayer bell" }, 39, new Master[] { Master.VANNAKA }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ + + /*RED_DRAGONS(new Task(new int[] { 53, 4669, 4670, 4671, 4672, 1589, 3588, 4667, 4668, }, new String[] { "Red dragons aren't as strong as other dragons but they're still", "very powerful, watch out for their firey breath." }, 1, new Master[] { Master.DURADEL }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ + /*SCABARITES(new Task(new int[] { 2009 }, new String[] { "The Scabarites are fairly strong monsters, and can hit pretty hard." }, 1, new Master[] { Master.CHAELDAR }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ + /*SEA_SNAKES(new Task(new int[] { 3943, 3939, }, new String[] { "They are quick, make sure you don't let your", "eye off of them for 1 second." }, 1, new Master[] { Master.VANNAKA }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ +/*ELVES(new Task(new int[] { 1184, 1183, 1185 }, new String[] { "Elves are quick, agile and vicious fighters which", "often favour bows and polearms." }, 1, new Master[] { Master.VANNAKA, Master.CHAELDAR, Master.NIEVE }, false) { + @Override + public boolean isDisabled() { + return true; + } + }), + FEVER_SPIDERS(new Task(new int[] { 2850 }, new String[] { "Fever Spiders are giant spiders that carry the deadly Spider Fever.", "If you don't want to catch it I suggest you wear Slayer Gloves to fight them." }, 1, new Master[] { Master.CHAELDAR, Master.DURADEL }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ + /*KILLERWATTS(new Task(new int[] { 3201, 3202 }, new String[] { "Vexia halfassed this... (this was shadow knight text)" }, 37, new Master[] { Master.VANNAKA }, false) { + @Override + public boolean isDisabled() { + return true; + } + }),*/ \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/smithing/BarType.java b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/BarType.java new file mode 100644 index 000000000..fff3d85e0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/BarType.java @@ -0,0 +1,113 @@ +package core.game.node.entity.skill.smithing; + +/** + * @author Emperor + */ +public enum BarType { + + /** + * Bronze Interface + */ + BRONZE(2349, 12.5, "Bronze Smithing"), + + /** + * Blurite + */ + BLURITE(9467, 16, "Blurite Smithing"), + + /** + * Iron + */ + IRON(2351, 25, "Iron Smithing"), + + /** + * Steel + */ + STEEL(2353, 37.5, "Steel Smithing"), + + /** + * Mithril + */ + MITHRIL(2359, 50, "Mithril Smithing"), + + /** + * Adamant + */ + ADAMANT(2361, 62.5, "Adamant Smithing"), + + /** + * Runite + */ + RUNITE(2363, 75, "Runite Smithing"); + + /** + * The bar type id. + */ + private int bar; + + /** + * The bar's name. + */ + private String string; + + /** + * The amount of experience gained + */ + private double experience; + + /** + * Constructs a new {@code BarType} {@code Object}. + * @param bar the bar. + * @param experience the exp. + * @param string the string. + */ + private BarType(int bar, double experience, String string) { + this.bar = bar; + this.string = string; + this.experience = experience; + } + + /** + * Retreive's the bar's type. + * @return bar type id; + */ + public int getBarType() { + return bar; + } + + /** + * Retreive's the bar's name. + * @return the bar's name. + */ + public String getBarName() { + return string; + } + + /** + * Gets the exp. + * @return the exp. + */ + public double getExperience() { + return experience; + } + + public static BarType getBarTypeForId(int itemId) { + switch (itemId) { + case 2349: + return BarType.BRONZE; + case 2351: + return BarType.IRON; + case 2353: + return BarType.STEEL; + case 2359: + return BarType.MITHRIL; + case 2361: + return BarType.ADAMANT; + case 2363: + return BarType.RUNITE; + case 9467: + return BarType.BLURITE; + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/smithing/Bars.java b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/Bars.java new file mode 100644 index 000000000..38b21f09e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/Bars.java @@ -0,0 +1,920 @@ +package core.game.node.entity.skill.smithing; + +import core.game.node.entity.player.Player; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Emperor + * @author 'Vexia + */ +public enum Bars { + + /** + * Bronze Dagger + */ + BRONZE_DAGGER(BarType.BRONZE, SmithingType.TYPE_DAGGER, 1205, 1), + + /** + * Bronze Axe + */ + BRONZE_AXE(BarType.BRONZE, SmithingType.TYPE_AXE, 1351, 1), + + /** + * Bronze Mace + */ + BRONZE_MACE(BarType.BRONZE, SmithingType.TYPE_MACE, 1422, 2), + + /** + * Bronze Medium helm + */ + BRONZE_MED_HELM(BarType.BRONZE, SmithingType.TYPE_MEDIUM_HELM, 1139, 3), + + /** + * Bronze Crossbow Bolt + */ + BRONZE_CROSSBOW_BOLT(BarType.BRONZE, SmithingType.TYPE_CROSSBOW_BOLT, 9375, 3), + + /** + * Bronze Sword + */ + BRONZE_SWORD(BarType.BRONZE, SmithingType.TYPE_SWORD, 1277, 4), + + /** + * Bronze Dart Tips + */ + BRONZE_DART_TIPS(BarType.BRONZE, SmithingType.TYPE_DART_TIP, 819, 4), + + /** + * Bronze Nails + */ + BRONZE_NAILS(BarType.BRONZE, SmithingType.TYPE_NAIL, 4819, 4), + + /** + * Bronze Wire + */ + BRONZE_WIRE(BarType.BRONZE, SmithingType.TYPE_WIRE, 1794, 4), + + /** + * Bronze Arrow Tips + */ + BRONZE_ARROW_TIPS(BarType.BRONZE, SmithingType.TYPE_ARROW_TIP, 39, 5), + + /** + * Bronze Scimitar + */ + BRONZE_SCIMITAR(BarType.BRONZE, SmithingType.TYPE_SCIMITAR, 1321, 5), + + /** + * Bronze Crossbow Limbs + */ + BRONZE_CROSSBOW_LIMBS(BarType.BRONZE, SmithingType.TYPE_CROSSBOW_LIMB, 9420, 6), + + /** + * Bronze longsword + */ + BRONZE_LONGSWORD(BarType.BRONZE, SmithingType.TYPE_LONGSWORD, 1291, 6), + + /** + * Bronze ThrowingKnife + */ + BRONZE_THROWINGKNFIE(BarType.BRONZE, SmithingType.TYPE_THROWING_KNIFE, 864, 7), + + /** + * Bronze Full helmet + */ + BRONZE_FULL_HELM(BarType.BRONZE, SmithingType.TYPE_FULL_HELM, 1155, 7), + + /** + * Bronze Square Shield + */ + BRONZE_SQUARE_SHIELD(BarType.BRONZE, SmithingType.TYPE_SQUARE_SHIELD, 1173, 8), + + /** + * Bronze Warhammer + */ + BRONZE_WAR_HAMMER(BarType.BRONZE, SmithingType.TYPE_WARHAMMER, 1337, 9), + + /** + * Bronze BattleAxe + */ + BRONZE_BATTLEAXE(BarType.BRONZE, SmithingType.TYPE_BATTLE_AXE, 1375, 10), + + /** + * Bronze ChainBody + */ + BRONZE_CHAINBODY(BarType.BRONZE, SmithingType.TYPE_CHAINBODY, 1103, 11), + + /** + * Bronze KitShield + */ + BRONZE_KITESHIELD(BarType.BRONZE, SmithingType.TYPE_KITE_SHIELD, 1189, 12), + + /** + * Bronze Claws + */ + BRONZE_CLAWS(BarType.BRONZE, SmithingType.TYPE_CLAWS, 3095, 13), + + /** + * Bronze 2h + */ + BRONZE_TWO_HANDED(BarType.BRONZE, SmithingType.TYPE_TWO_HAND_SWORD, 1307, 14), + + /** + * Bronze PlateSkirt + */ + BRONZE_PLATE_SKIRT(BarType.BRONZE, SmithingType.TYPE_PLATE_SKIRT, 1087, 16), + + /** + * Bronze PlateLegs + */ + BRONZE_PLATELEGS(BarType.BRONZE, SmithingType.TYPE_PLATELEG, 1075, 16), + + /** + * Bronze PlateBody + */ + BRONZE_PLATEBODY(BarType.BRONZE, SmithingType.TYPE_PLATEBODY, 1117, 18), + + /** + * Bronze Pickaxe + */ + BRONZE_PICKAXE(BarType.BRONZE, SmithingType.TYPE_PICKAXE, 1265, 5), + + /** + * Iron Dagger + */ + IRON_DAGGER(BarType.IRON, SmithingType.TYPE_DAGGER, 1203, 15), + + /** + * Iron Hatchet + */ + IRON_AXE(BarType.IRON, SmithingType.TYPE_AXE, 1349, 16), + + /** + * Iron Mace + */ + IRON_MACE(BarType.IRON, SmithingType.TYPE_MACE, 1420, 17), + + /** + * Iron Med Helm + */ + IRON_MED_HELM(BarType.IRON, SmithingType.TYPE_MEDIUM_HELM, 1137, 18), + + /** + * Iron Bolt + */ + IRON_BOLT(BarType.IRON, SmithingType.TYPE_CROSSBOW_BOLT, 9377, 18), + + /** + * Iron Sword + */ + IRON_SWORD(BarType.IRON, SmithingType.TYPE_SWORD, 1279, 19), + + /** + * Iron Dart Tips + */ + IRON_DART_TIPS(BarType.IRON, SmithingType.TYPE_DART_TIP, 820, 19), + + /** + * Iron Nails + */ + IRON_NAILS(BarType.IRON, SmithingType.TYPE_NAIL, 4820, 19), + + /** + * Iron Split + */ + IRON_SPIT(BarType.IRON, SmithingType.TYPE_SPIT_IRON, 7225, 16), + + /** + * Iron Arrow Tips + */ + IRON_ARROW_TIPS(BarType.IRON, SmithingType.TYPE_ARROW_TIP, 40, 20), + + /** + * Iron Scimitar + */ + IRON_SCIMITAR(BarType.IRON, SmithingType.TYPE_SCIMITAR, 1323, 20), + + /** + * Iron Crossbow Limbs + */ + IRON_CROSSBOW_LimbS(BarType.IRON, SmithingType.TYPE_CROSSBOW_LIMB, 9423, 23), + + /** + * Iron LongSword + */ + IRON_LONGSWORD(BarType.IRON, SmithingType.TYPE_LONGSWORD, 1293, 21), + + /** + * Iron Knife + */ + IRON_KNIFE(BarType.IRON, SmithingType.TYPE_THROWING_KNIFE, 863, 22), + + /** + * Iron Full Helm + */ + IRON_FULL_HELM(BarType.IRON, SmithingType.TYPE_FULL_HELM, 1153, 22), + + /** + * Iron Square Shield + */ + IRON_SQUARE_SHIELD(BarType.IRON, SmithingType.TYPE_SQUARE_SHIELD, 1175, 23), + + /** + * Oil Lantern Frame + */ + OIL_LANTERN_FRAME(BarType.IRON, SmithingType.TYPE_OIL_LANTERN, 4540, 26), + /** + * Iron WarHammer + */ + IRON_WARHAMMER(BarType.IRON, SmithingType.TYPE_WARHAMMER, 1335, 24), + + /** + * Iron Battleaxe + */ + IRON_BATTLEAXE(BarType.IRON, SmithingType.TYPE_BATTLE_AXE, 1363, 25), + + /** + * Iron ChainBody + */ + IRON_CHAINBODY(BarType.IRON, SmithingType.TYPE_CHAINBODY, 1101, 26), + + /** + * Iron Kite Shield + */ + IRON_KITE_SHIELD(BarType.IRON, SmithingType.TYPE_KITE_SHIELD, 1191, 27), + + /** + * Iron Claws + */ + IRON_CLAWS(BarType.IRON, SmithingType.TYPE_CLAWS, 3096, 28), + + /** + * Iron 2H + */ + IRON_TWO_HANDED_SWORD(BarType.IRON, SmithingType.TYPE_TWO_HAND_SWORD, 1309, 29), + + /** + * Iron PlateSkirt + */ + IRON_PLATESKIRT(BarType.IRON, SmithingType.TYPE_PLATE_SKIRT, 1081, 31), + + /** + * Iron PlateLegs + */ + IRON_PLATELEGS(BarType.IRON, SmithingType.TYPE_PLATELEG, 1067, 31), + + /** + * Iron PlateBody + */ + IRON_PLATEBODY(BarType.IRON, SmithingType.TYPE_PLATEBODY, 1115, 33), + + /** + * Iron PickAxe + */ + IRON_PICKAXE(BarType.IRON, SmithingType.TYPE_PICKAXE, 1267, 20), + + /** + * Steel Dagger + */ + STEEL_DAGGER(BarType.STEEL, SmithingType.TYPE_DAGGER, 1207, 30), + + /** + * Steel Axe + */ + STEEL_AXE(BarType.STEEL, SmithingType.TYPE_AXE, 1353, 31), + + /** + * Steel Mace + */ + STEEL_MACE(BarType.STEEL, SmithingType.TYPE_MACE, 1424, 32), + + /** + * Steel Medium Helm + */ + STEEL_MED_HELM(BarType.STEEL, SmithingType.TYPE_MEDIUM_HELM, 1141, 33), + + /** + * Steel CrossBow bolts + */ + STEEL_CROSSBOW_BOLT(BarType.STEEL, SmithingType.TYPE_CROSSBOW_BOLT, 9378, 33), + + /** + * Steel Sword + */ + STEEL_SWORD(BarType.STEEL, SmithingType.TYPE_SWORD, 1281, 34), + + /** + * Steel Dart Tips + */ + STEEL_DART_TIPS(BarType.STEEL, SmithingType.TYPE_DART_TIP, 821, 34), + + /** + * Steel Nails + */ + STEEL_NAILS(BarType.STEEL, SmithingType.TYPE_NAIL, 1539, 34), + + /** + * Steel ArrowTips + */ + STEEL_ARROW_TIPS(BarType.STEEL, SmithingType.TYPE_ARROW_TIP, 41, 35), + + /** + * Steel Scimitar + */ + STEEL_SCIMITAR(BarType.STEEL, SmithingType.TYPE_SCIMITAR, 1325, 35), + + /** + * Steel Crossbow Limbs + */ + STEEL_CROSSBOW_LIMBS(BarType.STEEL, SmithingType.TYPE_CROSSBOW_LIMB, 9425, 36), + + /** + * Steel LongSword + */ + STEEL_LONGSWORD(BarType.STEEL, SmithingType.TYPE_LONGSWORD, 1295, 36), + + /** + * Steel Knife + */ + STEEL_THROWING_KNIFE(BarType.STEEL, SmithingType.TYPE_THROWING_KNIFE, 865, 37), + + /** + * Steel Full Helm + */ + STEEL_FULL_HELM(BarType.STEEL, SmithingType.TYPE_FULL_HELM, 1157, 37), + + /** + * Steel Studs + */ + STEEL_STUDS(BarType.STEEL, SmithingType.TYPE_STUDS, 2370, 36), + + /** + * Steel Square Shield + */ + STEEL_SQUARE_SHIELD(BarType.STEEL, SmithingType.TYPE_SQUARE_SHIELD, 1177, 38), + + /** + * Steel Lantern + */ + STEEL_LANTERN(BarType.STEEL, SmithingType.TYPE_LANTERN, 4527, 49), + + STEEL_BULLSEYE(BarType.STEEL, SmithingType.TYPE_BULLSEYE, 4544, 49), + + /** + * Steel WarHammer + */ + STEEL_WARHAMMER(BarType.STEEL, SmithingType.TYPE_WARHAMMER, 1339, 39), + + /** + * Steel battle axe + */ + STEEL_BATTLE_AXE(BarType.STEEL, SmithingType.TYPE_BATTLE_AXE, 1365, 40), + + /** + * Steel ChainBody + */ + STEEL_CHAINBODY(BarType.STEEL, SmithingType.TYPE_CHAINBODY, 1105, 41), + + /** + * Steel Kite Shield + */ + STEEL_KITE_SHIELD(BarType.STEEL, SmithingType.TYPE_KITE_SHIELD, 1193, 42), + + /** + * Steel Claws + */ + STEEL_CLAWS(BarType.STEEL, SmithingType.TYPE_CLAWS, 3097, 43), + + /** + * Steel 2h + */ + STEEL_TWO_HANDED_SWORD(BarType.STEEL, SmithingType.TYPE_TWO_HAND_SWORD, 1311, 44), + + /** + * Steel plate skirt + */ + STEEL_PLATE_SKIRT(BarType.STEEL, SmithingType.TYPE_PLATE_SKIRT, 1083, 46), + + /** + * Steel platelegs + */ + STEEL_PLATELEGS(BarType.STEEL, SmithingType.TYPE_PLATELEG, 1069, 46), + + /** + * Steel platebody + */ + STEEL_PLATEBODY(BarType.STEEL, SmithingType.TYPE_PLATEBODY, 1119, 48), + + /** + * Steel pickaxe + */ + STEEL_PICKAXE(BarType.STEEL, SmithingType.TYPE_PICKAXE, 1269, 35), + + /** + * Mithril Dagger + */ + MITHRIL_DAGGER(BarType.MITHRIL, SmithingType.TYPE_DAGGER, 1209, 50), + + /** + * Mithril Hatchet + */ + MITHRIL_HATCHET(BarType.MITHRIL, SmithingType.TYPE_AXE, 1355, 51), + + /** + * Mithril Mace + */ + MITHRIL_MACE(BarType.MITHRIL, SmithingType.TYPE_MACE, 1428, 52), + + /** + * Mithril Med Helm + */ + MITHRIL_MED_HELM(BarType.MITHRIL, SmithingType.TYPE_MEDIUM_HELM, 1143, 53), + + /** + * Mithril Crossbow Bolt + */ + MITHRIL_CROSSBOW_BOLT(BarType.MITHRIL, SmithingType.TYPE_CROSSBOW_BOLT, 9379, 53), + + /** + * Mithril Sword + */ + MITHRIL_SWORD(BarType.MITHRIL, SmithingType.TYPE_SWORD, 1285, 54), + + /** + * Mithril Dart Tips + */ + MITHRIL_DART_TIPS(BarType.MITHRIL, SmithingType.TYPE_DART_TIP, 822, 54), + + /** + * Mithril Nails + */ + MITHRIL_NAILS(BarType.MITHRIL, SmithingType.TYPE_NAIL, 4822, 54), + + /** + * Mithril Arrow Tips + */ + MITHRIL_ARROW_TIPS(BarType.MITHRIL, SmithingType.TYPE_ARROW_TIP, 42, 55), + + /** + * Mithril Scimitar + */ + MITHRIL_SCIMITAR(BarType.MITHRIL, SmithingType.TYPE_SCIMITAR, 1329, 55), + + /** + * Mithril Crossbow Limbs + */ + MITHRIL_CROSSBOW_LIMBS(BarType.MITHRIL, SmithingType.TYPE_CROSSBOW_LIMB, 9427, 56), + + /** + * Mithril LongSword + */ + MITHRIL_LONGSWORD(BarType.MITHRIL, SmithingType.TYPE_LONGSWORD, 1299, 56), + + /** + * Mithril Knife + */ + MITHRIL_KNIFE(BarType.MITHRIL, SmithingType.TYPE_THROWING_KNIFE, 866, 57), + + /** + * Mithril Full Helm + */ + MITHRIL_FULL_HELM(BarType.MITHRIL, SmithingType.TYPE_FULL_HELM, 1159, 57), + + /** + * Mithril SquareShield + */ + MITHRIL_SQUARE_SHIELD(BarType.MITHRIL, SmithingType.TYPE_SQUARE_SHIELD, 1181, 58), + + /** + * Mithril Grapple Tips + */ + MITHRIL_GRAPPLE_TIPS(BarType.MITHRIL, SmithingType.TYPE_GRAPPLE_TIP, 9416, 59), + + /** + * Mithril Warhammer + */ + MITHRIL_WARHAMMER(BarType.MITHRIL, SmithingType.TYPE_WARHAMMER, 1343, 59), + + /** + * Mithril BattleAxe + */ + MITHRIL_BATTLEAXE(BarType.MITHRIL, SmithingType.TYPE_BATTLE_AXE, 1369, 60), + + /** + * Mithril ChainBody + */ + MITHRIL_CHAINBODY(BarType.MITHRIL, SmithingType.TYPE_CHAINBODY, 1109, 61), + + /** + * Mithril KiteShield + */ + MITHRIL_KITE_SHIELD(BarType.MITHRIL, SmithingType.TYPE_KITE_SHIELD, 1197, 62), + + /** + * Mithril Claws + */ + MITHRIL_CLAWS(BarType.MITHRIL, SmithingType.TYPE_CLAWS, 3099, 63), + + /** + * Mithril 2H + */ + MITHRIL_TWO_HANDED_SWORD(BarType.MITHRIL, SmithingType.TYPE_TWO_HAND_SWORD, 1315, 64), + + /** + * Mithril PlateSkirt + */ + MITHRIL_PLATESKIRT(BarType.MITHRIL, SmithingType.TYPE_PLATE_SKIRT, 1085, 66), + + /** + * Mithril PlateLegs + */ + MITHRIL_PLATELEGS(BarType.MITHRIL, SmithingType.TYPE_PLATELEG, 1071, 66), + + /** + * Mithril PlateBody + */ + MITHRIL_PLATEBODY(BarType.MITHRIL, SmithingType.TYPE_PLATEBODY, 1121, 68), + + /** + * Mithril PickAxe + */ + MITHRIL_PICKAXE(BarType.MITHRIL, SmithingType.TYPE_PICKAXE, 1273, 55), + + /** + * Adamant Dagger + */ + ADAMANT_DAGGER(BarType.ADAMANT, SmithingType.TYPE_DAGGER, 1211, 70), + + /** + * Adamant Hatchet + */ + ADAMANT_AXE(BarType.ADAMANT, SmithingType.TYPE_AXE, 1357, 71), + + /** + * Adamant Mace + */ + ADAMANT_MACE(BarType.ADAMANT, SmithingType.TYPE_MACE, 1430, 72), + + /** + * Adamant Med Helm + */ + ADAMANT_MEDIUM_HELM(BarType.ADAMANT, SmithingType.TYPE_MEDIUM_HELM, 1145, 73), + + /** + * Adamant Crossbow Bolt + */ + ADAMANT_BOLT(BarType.ADAMANT, SmithingType.TYPE_CROSSBOW_BOLT, 9380, 73), + + /** + * Adamant Sword + */ + ADAMANT_SWORD(BarType.ADAMANT, SmithingType.TYPE_SWORD, 1287, 74), + + /** + * Adamant Dart Tips + */ + ADAMANT_DART_TIPS(BarType.ADAMANT, SmithingType.TYPE_DART_TIP, 823, 74), + + /** + * Adamant Nails + */ + ADAMANT_NAILS(BarType.ADAMANT, SmithingType.TYPE_NAIL, 4823, 74), + + /** + * Adamant Arrow Tips + */ + ADAMANT_ARROW_TIPS(BarType.ADAMANT, SmithingType.TYPE_ARROW_TIP, 43, 75), + + /** + * Adamant Scmitar + */ + ADAMANT_SCIMITAR(BarType.ADAMANT, SmithingType.TYPE_SCIMITAR, 1331, 75), + + /** + * Adamant Crossbow Limbs + */ + ADAMANT_LIMBS(BarType.ADAMANT, SmithingType.TYPE_CROSSBOW_LIMB, 9429, 76), + + /** + * Adamant LongSword + */ + ADAMANT_LONGSWORD(BarType.ADAMANT, SmithingType.TYPE_LONGSWORD, 1301, 76), + + /** + * Adamant Knife + */ + ADAMANT_KNIFE(BarType.ADAMANT, SmithingType.TYPE_THROWING_KNIFE, 867, 77), + + /** + * Adamant Full Helm + */ + ADAMANT_FULL_HELM(BarType.ADAMANT, SmithingType.TYPE_FULL_HELM, 1161, 77), + + /** + * Adamant Square Shield + */ + ADAMANT_SQUARE_SHIELD(BarType.ADAMANT, SmithingType.TYPE_SQUARE_SHIELD, 1183, 78), + + /** + * Adamant Warhammer + */ + ADAMANT_WARHAMMER(BarType.ADAMANT, SmithingType.TYPE_WARHAMMER, 1345, 79), + + /** + * Adamant BattleAxe + */ + ADAMANT_BATTLEAXE(BarType.ADAMANT, SmithingType.TYPE_BATTLE_AXE, 1371, 80), + + /** + * Adamant ChainBody + */ + ADAMANT_CHAINBODY(BarType.ADAMANT, SmithingType.TYPE_CHAINBODY, 1111, 81), + + /** + * Adamant KiteShield + */ + ADAMANT_KITESHIELD(BarType.ADAMANT, SmithingType.TYPE_KITE_SHIELD, 1199, 82), + + /** + * Adamant Claws + */ + ADAMANT_CLAWS(BarType.ADAMANT, SmithingType.TYPE_CLAWS, 3100, 83), + + /** + * Adamant 2H + */ + ADAMANT_TWO_HANDED_SWORD(BarType.ADAMANT, SmithingType.TYPE_TWO_HAND_SWORD, 1317, 84), + + /** + * Adamant PlateSkirt + */ + ADAMANT_PLATE_SKIRT(BarType.ADAMANT, SmithingType.TYPE_PLATE_SKIRT, 1091, 86), + + /** + * Adamant PlateLegs + */ + ADAMANT_PLATE_LEGS(BarType.ADAMANT, SmithingType.TYPE_PLATELEG, 1073, 86), + + /** + * Adamant PlateBody + */ + ADAMANT_PLATE_BODY(BarType.ADAMANT, SmithingType.TYPE_PLATEBODY, 1123, 88), + + /** + * Adamant PickAxe + */ + ADAMANT_PICKAXE(BarType.ADAMANT, SmithingType.TYPE_PICKAXE, 1271, 75), + + /** + * Rune Dagger + */ + RUNE_DAGGER(BarType.RUNITE, SmithingType.TYPE_DAGGER, 1213, 85), + + /** + * Rune Hatchet + */ + RUNITE_AXE(BarType.RUNITE, SmithingType.TYPE_AXE, 1359, 86), + + /** + * Rune Mace + */ + RUNITE_MACE(BarType.RUNITE, SmithingType.TYPE_MACE, 1432, 87), + + /** + * Rune Med Helm + */ + RUNITE_MEDIUM_HELM(BarType.RUNITE, SmithingType.TYPE_MEDIUM_HELM, 1147, 88), + + /** + * Rune Crossbow Bolt + */ + RUNITE_BOLT(BarType.RUNITE, SmithingType.TYPE_CROSSBOW_BOLT, 9381, 88), + + /** + * Rune Sword + */ + RUNITE_SWORD(BarType.RUNITE, SmithingType.TYPE_SWORD, 1289, 89), + + /** + * Rune Dart Tips + */ + RUNITE_DART_TIPS(BarType.RUNITE, SmithingType.TYPE_DART_TIP, 824, 89), + + /** + * Rune Nails + */ + RUNITE_NAILS(BarType.RUNITE, SmithingType.TYPE_NAIL, 4824, 89), + + /** + * Rune Arrow Tips + */ + RUNITE_ARROW_TIPS(BarType.RUNITE, SmithingType.TYPE_ARROW_TIP, 44, 90), + + /** + * Rune Scmitar + */ + RUNITE_SCIMITAR(BarType.RUNITE, SmithingType.TYPE_SCIMITAR, 1333, 90), + + /** + * Rune Crossbow Limbs + */ + RUNITE_LIMBS(BarType.RUNITE, SmithingType.TYPE_CROSSBOW_LIMB, 9431, 91), + + /** + * Rune LongSword + */ + RUNITE_LONGSWORD(BarType.RUNITE, SmithingType.TYPE_LONGSWORD, 1303, 91), + + /** + * Rune Knife + */ + RUNITE_KNIFE(BarType.RUNITE, SmithingType.TYPE_THROWING_KNIFE, 868, 92), + + /** + * Rune Full Helm + */ + RUNITE_FULL_HELM(BarType.RUNITE, SmithingType.TYPE_FULL_HELM, 1163, 92), + + /** + * Rune Square Shield + */ + RUNITE_SQUARE_SHIELD(BarType.RUNITE, SmithingType.TYPE_SQUARE_SHIELD, 1185, 93), + + /** + * Rune Warhammer + */ + RUNITE_WARHAMMER(BarType.RUNITE, SmithingType.TYPE_WARHAMMER, 1347, 94), + + /** + * Rune BattleAxe + */ + RUNITE_BATTLEAXE(BarType.RUNITE, SmithingType.TYPE_BATTLE_AXE, 1373, 95), + + /** + * Rune ChainBody + */ + RUNITE_CHAINBODY(BarType.RUNITE, SmithingType.TYPE_CHAINBODY, 1113, 96), + + /** + * Rune KiteShield + */ + RUNITE_KITESHIELD(BarType.RUNITE, SmithingType.TYPE_KITE_SHIELD, 1201, 97), + + /** + * Rune Claws + */ + RUNITE_CLAWS(BarType.RUNITE, SmithingType.TYPE_CLAWS, 3101, 98), + + /** + * Rune 2H + */ + RUNITE_TWO_HANDED_SWORD(BarType.RUNITE, SmithingType.TYPE_TWO_HAND_SWORD, 1319, 99), + + /** + * Rune PlateSkirt + */ + RUNITE_PLATE_SKIRT(BarType.RUNITE, SmithingType.TYPE_PLATE_SKIRT, 1093, 99), + + /** + * Rune PlateLegs + */ + RUNITE_PLATE_LEGS(BarType.RUNITE, SmithingType.TYPE_PLATELEG, 1079, 99), + + /** + * Rune PlateBody + */ + RUNITE_PLATE_BODY(BarType.RUNITE, SmithingType.TYPE_PLATEBODY, 1127, 99), + + /** + * Rune PickAxe + */ + RUNITE_PICKAXE(BarType.RUNITE, SmithingType.TYPE_PICKAXE, 1275, 90), + + /** + * Blurite CrossBow bolts + */ + BLURITE_CROSSBOW_BOLT(BarType.BLURITE, SmithingType.TYPE_CROSSBOW_BOLT, 9376, 8), + + /** + * Blurite Crossbow Limbs + */ + BLURITE_CROSSBOW_LIMBS(BarType.BLURITE, SmithingType.TYPE_CROSSBOW_LIMB, 9422, 13); + + /** + * A map of object ids to primary ingredients. + */ + private static Map bars = new HashMap(); + + /** + * Gets a bar by an item id. + * @param item The item id. + * @return The bar or null if the object is not a bar. + */ + public static Bars forId(int item) { + for (Bars bar : Bars.values()) { + if (bar.getProduct() == item) { + return bar; + } + } + return null; + } + + /** + * Populates the herb mapping. + */ + static { + for (Bars bar : Bars.values()) { + bars.put((short) bar.getProduct(), bar); + } + } + + private BarType Btype; + private SmithingType Stype; + private int product; + private int level; + + private Bars(BarType Btype, SmithingType Stype, int productId, int level) { + this.Btype = Btype; + this.Stype = Stype; + this.product = productId; + this.level = level; + } + + public BarType getBarType() { + return Btype; + } + + public SmithingType getSmithingType() { + return Stype; + } + + public int getProduct() { + return product; + } + + public int getLevel() { + return level; + } + + public static boolean constructInterface(Player player, int itemId) { + switch (itemId) { + case 2349: + case 2351: + case 2353: + case 2359: + case 2361: + case 2363: + return true; + } + return false; + } + + public static Bars[] getBars(BarType type) { + List bars = new ArrayList(); + for (Bars bar : Bars.values()) { + if (bar.getBarType() == type) { + bars.add(bar); + } + } + Bars[] barss = new Bars[bars.size()]; + for (int i = 0; i < bars.size(); i++) { + barss[i] = bars.get(i); + } + return barss; + } + + public static int getItemId(int buttonId, BarType type) { + for (Bars bar : Bars.values()) { + if (bar.getBarType() != type) { + continue; + } + for (int i : bar.getSmithingType().getButton()) { + if (buttonId == i) { + return bar.getProduct(); + } + } + } + return -1; + } + + public static int getIndex(Player player, int buttonId, BarType type) { + int index = 0; + for (Bars bar : Bars.values()) { + if (bar.getBarType() != type) { + continue; + } + bar = Bars.forId(bar.getProduct()); + for (int i = 0; i < bar.getSmithingType().getButton().length; i++) { + if (buttonId != bar.getSmithingType().getButton()[i]) { + index++; + return index; + } + } + } + return -1; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/smithing/FurnaceOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/FurnaceOptionPlugin.java new file mode 100644 index 000000000..fb0fddda2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/FurnaceOptionPlugin.java @@ -0,0 +1,174 @@ +package core.game.node.entity.skill.smithing; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.smithing.smelting.Bar; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.OptionHandler; +import core.game.interaction.UseWithHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents the plugin used for the furnace. + * @author Vexia + */ +@Initializable +public final class FurnaceOptionPlugin extends OptionHandler { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(833); + + /** + * Represents the items used for the tutorial island (ores). + */ + private static final Item[] ITEMS = new Item[] { new Item(438, 1), new Item(436, 1) }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("smelt", this); + ObjectDefinition.setOptionHandler("smelt-ore", this); + ObjectDefinition.forId(3044).getHandlers().put("option:use", this); + ObjectDefinition.forId(21303).getHandlers().put("option:use", this); + new SmeltUseWithHandler().newInstance(arg); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + switch (((GameObject) node).getId()) { + case 3044: + handleTutorialIsland(player); + return true; + } + if (node.getId() == 26814 && !player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK).isComplete(0)) { + player.sendMessage("You need to have completed the easy tasks in the Varrock Diary in order to use this."); + return true; + } + show(player); + return true; + } + + /** + * Shows the items. + * @param player the player. + */ + private static void show(final Player player) { + player.getInterfaceManager().openChatbox(311); + player.getPacketDispatch().sendItemZoomOnInterface(2349, 150, 311, 4); + if (player.getQuestRepository().isComplete("The Knight's Sword")) { + player.getPacketDispatch().sendString("



Blurite", 311, 20); + } + player.getPacketDispatch().sendItemZoomOnInterface(Bar.BLURITE.getProduct().getId(), 150, 311, 5); + player.getPacketDispatch().sendItemZoomOnInterface(Bar.IRON.getProduct().getId(), 150, 311, 6); + player.getPacketDispatch().sendItemZoomOnInterface(2355, 150, 311, 7); + player.getPacketDispatch().sendItemZoomOnInterface(2353, 150, 311, 8); + player.getPacketDispatch().sendItemZoomOnInterface(2357, 150, 311, 9); + player.getPacketDispatch().sendItemZoomOnInterface(2359, 150, 311, 10); + player.getPacketDispatch().sendItemZoomOnInterface(2361, 150, 311, 11); + player.getPacketDispatch().sendItemZoomOnInterface(2363, 150, 311, 12); + } + + /** + * Method used to handle the tutorial island interaction. + * @param player the player. + */ + private final void handleTutorialIsland(final Player player) { + if (player.getInventory().containItems(438, 436)) { + player.animate(ANIMATION); + GameWorld.getPulser().submit(new Pulse(2, player) { + @Override + public boolean pulse() { + player.getInventory().remove(ITEMS); + player.getInventory().add(Bar.BRONZE.getProduct()); + player.getSkills().addExperience(Skills.SMITHING, Bar.BRONZE.getExperience()); + if (TutorialSession.getExtension(player).getStage() == 39) { + TutorialStage.load(player, 40, false); + } + return true; + } + + }); + } + } + + /** + * Represents the plugin used to handle the ore on the furance. + * @author 'Vexia + * @version 1.0 + */ + public final static class SmeltUseWithHandler extends UseWithHandler { + + /** + * Represents the ids. + */ + private static final int[] IDS = new int[] { 4304, 6189, 11010, 11666, 12100, 12809, 14921, 18497, 26814, 30021, 30510, 36956, 37651 }; + + /** + * Constructs a new {@code SmeltUseWithHandler} {@code Object}. + */ + public SmeltUseWithHandler() { + super(getIds()); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : IDS) { + addHandler(i, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + if (event.getUsedWith().getId() == 26814 && !event.getPlayer().getAchievementDiaryManager().getDiary(DiaryType.VARROCK).isComplete(0)) { + event.getPlayer().sendMessage("You need to have completed the easy tasks in the Varrock Diary in order to use this."); + return true; + } + show(event.getPlayer()); + return true; + } + + /** + * Gets the ore ids. + * @return the ids. + */ + public static final int[] getIds() { + List ids = new ArrayList<>(); + for (Bar bar : Bar.values()) { + for (Item i : bar.getOres()) { + ids.add(i.getId()); + } + } + int[] array = new int[ids.size()]; + for (int i = 0; i < ids.size(); i++) { + array[i] = ids.get(i); + } + return array; + } + } + + @Override + public Location getDestination(Node node, Node n) { + if (node instanceof Player && ((Player) node).getZoneMonitor().isInZone("Donator Zone")) { + return n.getLocation().transform(1, 2, 0); + } + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/smithing/SmithingBuilder.java b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/SmithingBuilder.java new file mode 100644 index 000000000..d10c08188 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/SmithingBuilder.java @@ -0,0 +1,107 @@ +package core.game.node.entity.skill.smithing; + +import core.game.component.Component; +import core.game.container.access.InterfaceContainer; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.smithing.smelting.Bar; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.tools.StringUtils; + +/** + * Represents the builder class to view the correct information, on the + * interface of smithing, ie, the items ammount, and name. + * @author 'Vexia + */ +public final class SmithingBuilder { + + /** + * The bar type. + */ + private BarType type; + + /** + * The bar used. + */ + private Bar bar; + + /** + * Constructs a new {@code SmithingBuilder.java} {@code Object}. + * @param item the item. + */ + public SmithingBuilder(Item item) { + this.bar = Bar.forId(item.getId()); + this.type = BarType.getBarTypeForId(item.getId()); + } + + /** + * Builds the interface of the smithing. + * @param player the player. + */ + public void build(Player player) { + player.getGameAttributes().removeAttribute("smith-type"); + player.getGameAttributes().setAttribute("smith-type", type); + player.getPacketDispatch().sendInterfaceConfig(300, 267, false);// pickaxe + final Bars bars[] = Bars.getBars(type); + for (int i = 0; i < bars.length; i++) { + if (bars[i].getSmithingType() == SmithingType.TYPE_GRAPPLE_TIP) { + player.getPacketDispatch().sendInterfaceConfig(300, 169, false); + } + if (bars[i].getSmithingType() == SmithingType.TYPE_DART_TIP) { + player.getPacketDispatch().sendInterfaceConfig(300, 65, false); + } + if (bars[i].getSmithingType() == SmithingType.TYPE_SPIT_IRON || bars[i].getSmithingType() == SmithingType.TYPE_WIRE || bars[i].getSmithingType() == SmithingType.TYPE_BULLSEYE) { + player.getPacketDispatch().sendInterfaceConfig(300, 89, false); + } + if (bars[i].getSmithingType() == SmithingType.TYPE_CLAWS) { + player.getPacketDispatch().sendInterfaceConfig(300, 209, false); + } + if (bars[i].getSmithingType() == SmithingType.TYPE_LANTERN || bars[i].getSmithingType() == SmithingType.TYPE_OIL_LANTERN) { + player.getPacketDispatch().sendInterfaceConfig(300, 161, false); + } + if (bars[i].getSmithingType() == SmithingType.TYPE_STUDS) { + player.getPacketDispatch().sendInterfaceConfig(300, 169, false); + } + String color = ""; + if (player.getSkills().getLevel(Skills.SMITHING) < bars[i].getLevel()) { + } else { + color = ""; + } + player.getPacketDispatch().sendString(color + StringUtils.formatDisplayName(bars[i].getSmithingType().name().replace("TYPE_", "")), 300, bars[i].getSmithingType().getName()); + if (player.getInventory().contains(bars[i].getBarType().getBarType(), bars[i].getSmithingType().getRequired())) { + color = ""; + } else { + color = null; + } + if (color != null) { + String amt = bars[i].getSmithingType().getRequired() > 1 ? "s" : ""; + player.getPacketDispatch().sendString(color + String.valueOf(bars[i].getSmithingType().getRequired()) + " Bar" + amt, 300, bars[i].getSmithingType().getName() + 1); + } + InterfaceContainer.generateItems(player, new Item[] { new Item(bars[i].getProduct(), bars[i].getSmithingType().getProductAmount()) }, new String[] { "" }, 300, bars[i].getSmithingType().getChild() - 1); + } + player.getPacketDispatch().sendString(type.getBarName(), 300, 15); + player.getInterfaceManager().open(new Component(300)); + if (TutorialSession.getExtension(player).getStage() == 41) { + TutorialStage.load(player, 42, false); + } + } + + /** + * Gets the type. + * @return the type. + */ + public BarType getType() { + return type; + } + + /** + * Gets the bar. + * @return the bar. + */ + public Bar getBar() { + return bar; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/smithing/SmithingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/SmithingPulse.java new file mode 100644 index 000000000..73fb8206a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/SmithingPulse.java @@ -0,0 +1,127 @@ +package core.game.node.entity.skill.smithing; + +import core.cache.def.impl.ItemDefinition; +import core.game.world.map.Location; +import core.game.content.quest.tutorials.tutorialisland.TutorialSession; +import core.game.content.quest.tutorials.tutorialisland.TutorialStage; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.tools.StringUtils; +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks; + +/** + * Represents the pulse used to smith a bar. + * + * @author 'Vexia + */ +public class SmithingPulse extends SkillPulse { + + /** + * Represents the animation to use. + */ + private static final Animation ANIMATION = new Animation(898); + + /** + * Represents the bar being made. + */ + private final Bars bar; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Constructs a new {@code SmithingPulse} {@code Object}. + * + * @param player the player. + * @param item the item. + */ + public SmithingPulse(Player player, Item item, Bars bar, int amount) { + super(player, item); + this.bar = bar; + this.amount = amount; + } + + @Override + public boolean checkRequirements() { + if (!player.getInventory().contains(bar.getBarType().getBarType(), bar.getSmithingType().getRequired() * amount)) { + amount = player.getInventory().getAmount(new Item(bar.getBarType().getBarType())); + } + player.getInterfaceManager().close(); + if (player.getSkills().getLevel(Skills.SMITHING) < bar.getLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a Smithing level of " + bar.getLevel() + " to make a " + ItemDefinition.forId(bar.getProduct()).getName() + "."); + return false; + } + if (!player.getInventory().contains(bar.getBarType().getBarType(), bar.getSmithingType().getRequired())) { + player.getDialogueInterpreter().sendDialogue("You don't have enough " + ItemDefinition.forId(bar.getBarType().getBarType()).getName().toLowerCase() + "s to make a " + bar.getSmithingType().name().replace("TYPE_", "").replace("_", " ").toLowerCase() + "."); + return false; + } + if (!player.getInventory().contains(2347, 1) && !SkillcapePerks.isActive(SkillcapePerks.BAREFISTED_SMITHING,player)) { + player.getDialogueInterpreter().sendDialogue("You need a hammer to work the metal with."); + return false; + } + if (!player.getQuestRepository().isComplete("The Tourist Trap") && bar.getSmithingType() == SmithingType.TYPE_DART_TIP) { + player.getDialogueInterpreter().sendDialogue("You need to complete Tourist Trap to smith dart tips."); + return false; + } + if (TutorialSession.getExtension(player).getStage() < TutorialSession.MAX_STAGE && node.getId() != Bars.BRONZE_DAGGER.getProduct()) { + return false; + } + return true; + } + + @Override + public void animate() { + if(SkillcapePerks.isActive(SkillcapePerks.BAREFISTED_SMITHING,player)){ + player.animate(new Animation(2068)); //Torag's Hammer animation lol + return; + } + player.animate(ANIMATION); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + setDelay(4); + return false; + } + player.getInventory().remove(new Item(bar.getBarType().getBarType(), bar.getSmithingType().getRequired())); + final Item item = new Item(node.getId(), bar.getSmithingType().getProductAmount()); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.SMITHING, bar.getBarType().getExperience() * bar.getSmithingType().getRequired(), true); + String message = StringUtils.isPlusN(ItemDefinition.forId(bar.getProduct()).getName().toLowerCase()) ? "an" : "a"; + player.getPacketDispatch().sendMessage("You hammer the " + bar.getBarType().getBarName().toLowerCase().replace("smithing", "") + "and make " + message + " " + ItemDefinition.forId(bar.getProduct()).getName().toLowerCase() + "."); + if (TutorialSession.getExtension(player).getStage() == 42) { + TutorialStage.load(player, 43, false); + } + + if (bar == Bars.BLURITE_CROSSBOW_LIMBS + && player.getLocation().withinDistance(new Location(3000, 3145, 0), 10)) { // near Thurgo's anvil + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 1, 9); + } + + // Smith a steel longsword on the anvil in the jailhouse

sewers + if (bar == Bars.STEEL_LONGSWORD && player.getLocation().withinDistance(Location.create(3112, 9688, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 0); + } + + // Smith an adamantite medium helm on the south-east anvil in

Varrock, next to Aubury's Rune Shop + if (bar == Bars.ADAMANT_MEDIUM_HELM && player.getLocation().withinDistance(Location.create(3247, 3404, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 2, 3); + } + + amount--; + return amount < 1; + } + + @Override + public void message(int type) { + + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/smithing/SmithingType.java b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/SmithingType.java new file mode 100644 index 000000000..7f00a32ad --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/SmithingType.java @@ -0,0 +1,262 @@ +package core.game.node.entity.skill.smithing; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Represents a type of smithing. + * @author Emperor + */ +public enum SmithingType { + + /** + * Dagger + */ + TYPE_DAGGER(1, 18, 19, new int[] { 24, 23, 22, 21 }, 1), + + /** + * Axe + */ + TYPE_AXE(1, 26, 27, new int[] { 32, 31, 30, 29 }, 1), + + /** + * Mace + */ + TYPE_MACE(1, 34, 35, new int[] { 40, 39, 38, 37 }, 1), + + /** + * Med helm + */ + TYPE_MEDIUM_HELM(1, 42, 43, new int[] { 48, 47, 46, 45 }, 1), + + /** + * Crossbow bolt + */ + TYPE_CROSSBOW_BOLT(1, 50, 51, new int[] { 56, 55, 54, 53 }, 10), + + /** + * Sword + */ + TYPE_SWORD(1, 58, 59, new int[] { 64, 63, 62, 61 }, 1), + + /** + * Dart tips + */ + TYPE_DART_TIP(1, 66, 67, new int[] { 72, 71, 70, 69 }, 10), + + /** + * Nails + */ + TYPE_NAIL(1, 74, 75, new int[] { 80, 79, 78, 77 }, 15), + + /** + * Bullseye + */ + TYPE_BULLSEYE(1, 90, 91, new int[] { 96, 95, 94, 93 }, 1), + + /** + * Spit Iron + */ + TYPE_SPIT_IRON(1, 90, 91, new int[] { 96, 95, 94, 93 }, 1), + /** + * + */ + TYPE_WIRE(1, 90, 91, new int[] { 96, 95, 94, 93 }, 1), + + /** + * Arrow Tips + */ + TYPE_ARROW_TIP(1, 106, 107, new int[] { 112, 111, 110, 109 }, 15), + + /** + * Scimitar + */ + TYPE_SCIMITAR(2, 114, 115, new int[] { 120, 119, 118, 117 }, 1), + + /** + * Crossbow Limbs + */ + TYPE_CROSSBOW_LIMB(1, 122, 123, new int[] { 128, 127, 126, 125 }, 1), + + /** + * LongSword + */ + TYPE_LONGSWORD(2, 130, 131, new int[] { 136, 135, 134, 133 }, 1), + + /** + * Throwing Knife + */ + TYPE_THROWING_KNIFE(1, 138, 139, new int[] { 144, 143, 142, 141 }, 5), + + /** + * Full helm + */ + TYPE_FULL_HELM(2, 146, 147, new int[] { 152, 151, 150, 149 }, 1), + + /** + * Square Shield + */ + TYPE_SQUARE_SHIELD(2, 154, 155, new int[] { 160, 159, 158, 157 }, 1), + + /** + * Latern + */ + TYPE_LANTERN(1, 162, 163, new int[] { 168, 167, 166, 165 }, 1), + + /** + * Oil Lantern + */ + TYPE_OIL_LANTERN(1,162,163,new int[] {168,167,166,165},1), + + /** + * Grapple Tips + */ + TYPE_GRAPPLE_TIP(1, 170, 171, new int[] { 175, 176, 175, 174, 173 }, 1), + + /** + * The studs type. + */ + TYPE_STUDS(1, 170, 171, new int[] { 175, 176, 174, 173, 172 }, 1), + + /** + * Warhammer + */ + TYPE_WARHAMMER(3, 178, 179, new int[] { 184, 183, 182, 181 }, 1), + + /** + * Battle axe + */ + TYPE_BATTLE_AXE(3, 186, 187, new int[] { 192, 191, 190, 189 }, 1), + + /** + * Chainbody + */ + TYPE_CHAINBODY(3, 194, 195, new int[] { 200, 199, 198, 197 }, 1), + + /** + * Kite shield + */ + TYPE_KITE_SHIELD(3, 202, 203, new int[] { 208, 207, 206, 205 }, 1), + + /** + * Claws + */ + TYPE_CLAWS(2, 210, 211, new int[] { 216, 215, 214, 213 }, 1), + + /** + * 2H + */ + TYPE_TWO_HAND_SWORD(3, 218, 219, new int[] { 224, 223, 222, 221 }, 1), + + /** + * Plate Skirt + */ + TYPE_PLATE_SKIRT(3, 226, 227, new int[] { 232, 231, 230, 229 }, 1), + + /** + * Platelegs + */ + TYPE_PLATELEG(3, 234, 235, new int[] { 240, 239, 238, 237 }, 1), + + /** + * Platebody + */ + TYPE_PLATEBODY(5, 242, 243, new int[] { 248, 247, 246, 245 }, 1), + + /** + * Pickaxe + */ + TYPE_PICKAXE(2, 267, 268, new int[] { 273, 272, 271, 270 }, 1); + + private int name; + + private int[] button; + + private int child; + + private int required; + + private int product_amount; + + /** + * Constructs a new {@code SmithingType.java} {@code Object}. + * @param requiredBars bars. + * @param interfaceChild the interface child. + * @param nameChild the name child. + * @param buttonId the button id. + * @param productedAmount the producted amount. + */ + SmithingType(int requiredBars, int interfaceChild, int nameChild, int[] buttonId, int productedAmount) { + this.name = nameChild; + this.button = buttonId; + this.child = interfaceChild; + this.required = requiredBars; + this.product_amount = productedAmount; + } + + /** + * @return the name. + */ + public int getName() { + return name; + } + + /** + * @return the button. + */ + public int[] getButton() { + return button; + } + + /** + * @return the child. + */ + public int getChild() { + return child; + } + + /** + * @return the required. + */ + public int getRequired() { + return required; + } + + /** + * @return the product_amount. + */ + public int getProductAmount() { + return product_amount; + } + + /** + * @param name the name to set. + */ + public void setName(int name) { + this.name = name; + } + + public static int forButton(Player player, Bars bar, int button, int item) { + int count = 0; + if (bar == null) { + return -1; + } + for (int i = 0; i < bar.getSmithingType().getButton().length; i++) { + if (bar.getSmithingType().getButton()[i] != button) { + count++; + } else { + if (count == 0) { + count = 1; + } else if (count == 1) { + count = 5; + } else if (count == 2) { + count = -1; + } else if (count == 3) { + count = player.getInventory().getAmount(new Item(item)); + } + return count; + } + } + return -1; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/smithing/smelting/Bar.java b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/smelting/Bar.java new file mode 100644 index 000000000..b85acb89d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/smelting/Bar.java @@ -0,0 +1,103 @@ +package core.game.node.entity.skill.smithing.smelting; + +import core.game.node.item.Item; + +/** + * Represents the Bar that can be created during a

Smelting

+ * session. + * @author 'Vexia + */ +public enum Bar { + BRONZE(1, 6.2, new Item(2349, 1), new Item(436, 1), new Item(438, 1)), + BLURITE(8, 8, new Item(9467, 1), new Item(668, 1)), + IRON(15, 12.5, new Item(2351, 1), new Item(440)), + SILVER(20, 13.7, new Item(2355, 1), new Item(442, 1)), + STEEL(30, 17.5, new Item(2353, 1), new Item(453, 2), new Item(440, 1)), + GOLD(40, 22.5, new Item(2357, 1), new Item(444, 1)), + MITHRIL(50, 30, new Item(2359, 1), new Item(447, 1), new Item(453, 4)), + ADAMANT(70, 37.5, new Item(2361, 1), new Item(449, 1), new Item(453, 6)), + RUNITE(85, 50, new Item(2363, 1), new Item(451, 1), new Item(453, 8)); + + /** + * The ore required. + */ + private final Item[] ores; + + /** + * The product gained. + */ + private final Item product; + + /** + * The level required. + */ + private final int level; + + /** + * The experience gained. + */ + private final double experience; + + /** + * Constructs a new {@code Bar} {@code Object}. + * @param level the level. + * @param experience the experience. + * @param product the product. + * @param ores the ores. + */ + Bar(int level, double experience, Item product, Item... ores) { + this.level = level; + this.experience = experience; + this.product = product; + this.ores = ores; + } + + public static Bar forId(int id) { + for (Bar bar : Bar.values()) { + if (bar.getProduct().getId() == id) { + return bar; + } + } + return null; + } + + public static Bar forOre(int id) { + for (Bar bar : Bar.values()) { + for (Item i : bar.getOres()) { + if (i.getId() == id) { + return bar; + } + } + } + return null; + } + + /** + * @return the ores. + */ + public Item[] getOres() { + return ores; + } + + /** + * @return the product. + */ + public Item getProduct() { + return product; + } + + /** + * @return the level. + */ + public int getLevel() { + return level; + } + + /** + * @return the experience. + */ + public double getExperience() { + return experience; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/smithing/smelting/SmeltingPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/smelting/SmeltingPulse.java new file mode 100644 index 000000000..7c81b6d49 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/smithing/smelting/SmeltingPulse.java @@ -0,0 +1,198 @@ +package core.game.node.entity.skill.smithing.smelting; + +import core.game.container.impl.EquipmentContainer; +import core.tools.Items; +import core.game.world.map.Location; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +/** + * Represents the pulse used to smelt. + * + * @author 'Vexia + */ +public class SmeltingPulse extends SkillPulse { + + /** + * The ring of forging item. + */ + private static final Item RING_OF_FORGING = new Item(2568); + + /** + * Represents the bar to make. + */ + private final Bar bar; + + /** + * Represents if using the super heat spell. + */ + private final boolean superHeat; + + /** + * The ticks passed. + */ + private int ticks; + + /** + * Represents the amount to produce. + */ + private int amount; + + /** + * Constructs a new {@code SmeltingPulse} {@code Object}. + * + * @param player the player. + * @param node the node. + * @param bar the bar. + * @param amount the amount. + */ + public SmeltingPulse(Player player, Item node, Bar bar, int amount) { + super(player, node); + this.bar = bar; + this.amount = amount; + this.superHeat = false; + } + + /** + * Constructs a new {@code SmeltingPulse} {@code Object}. + * + * @param player the player. + * @param node the node. + * @param bar the bar. + * @param amount the amount. + * @param heat the heat. + */ + public SmeltingPulse(Player player, Item node, Bar bar, int amount, boolean heat) { + super(player, node); + this.bar = bar; + this.amount = amount; + this.superHeat = heat; + this.resetAnimation = false; + } + + @Override + public boolean checkRequirements() { + player.getInterfaceManager().closeChatbox(); + if (bar == null || player == null) { + return false; + } + if (bar == Bar.BLURITE && !player.getQuestRepository().isComplete("The Knight's Sword")) { + return false; + } + if (player.getSkills().getLevel(Skills.SMITHING) < bar.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Smithing level of at least " + bar.getLevel() + " in order to smelt " + bar.getProduct().getName().toLowerCase().replace("bar", "") + "."); + player.getInterfaceManager().closeChatbox(); + return false; + } + for (Item item : bar.getOres()) { + if (!player.getInventory().contains(item.getId(), item.getAmount())) { + player.getPacketDispatch().sendMessage("You do not have the required ores to make this bar."); + return false; + } + } + return true; + } + + @Override + public void animate() { + if (ticks == 0 || ticks % 5 == 0) { + if (superHeat) { + player.visualize(Animation.create(725), new Graphics(148, 96)); + } else { + player.animate(Animation.create(3243)); // Used to be 899 but that looked wonky and broken + } + } + } + + @Override + public boolean reward() { + if (!superHeat && ++ticks % 5 != 0) { + return false; + } + if (!superHeat) { + player.getPacketDispatch().sendMessage("You place the required ores and attempt to create a bar of " + StringUtils.formatDisplayName(bar.toString().toLowerCase()) + "."); + } + for (Item i : bar.getOres()) { + if (!player.getInventory().remove(i)) { + return true; + } + } + if (success(player)) { + // Varrock Armour secondary reward + int amt = (player.getInventory().freeSlots() != 0 && !superHeat + && player.getLocation().withinDistance(Location.create(3107, 3500, 0)) // edgeville furnace + && player.getInventory().containsItems(bar.getOres()) + && player.getAchievementDiaryManager().getDiary(DiaryType.VARROCK).getLevel() != -1 + && player.getAchievementDiaryManager().checkSmithReward(bar) + && RandomFunction.random(100) <= 10) ? 2 : 1; + if (amt != 1) { + if (!player.getInventory().remove(bar.getOres())) { + amt = 1; + } else { + player.sendMessage("The magic of the Varrock armour enables you to smelt 2 bars at the same time."); + } + } + player.getInventory().add(new Item(bar.getProduct().getId(), amt)); + double xp = bar.getExperience() * amt; + // Goldsmith gauntlets + if (((player.getEquipment().get(EquipmentContainer.SLOT_HANDS) != null + && player.getEquipment().get(EquipmentContainer.SLOT_HANDS).getId() == Items.GOLDSMITH_GAUNTLETS_776)) + && bar.getProduct().getId() == 2357) { + xp = 56.2 * amt; + } + player.getSkills().addExperience(Skills.SMITHING, xp, true); + if (!superHeat) { + player.getPacketDispatch().sendMessage("You retrieve a bar of " + bar.getProduct().getName().toLowerCase().replace(" bar", "") + "."); + } + + // Smelt a steel bar in the Lumbridge furnace + if (bar == Bar.STEEL && player.getLocation().withinDistance(Location.create(3226, 3254, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 1, 5); + } + // Smelt a silver bar in the Lumbridge furnace + if (bar == Bar.SILVER && player.getLocation().withinDistance(Location.create(3226, 3254, 0))) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.LUMBRIDGE, 2, 7); + } + + } else { + player.getPacketDispatch().sendMessage("The ore is too impure and you fail to refine it."); + } + amount--; + return amount < 1; + } + + /** + * Checks if the player has a ring of forging. + * + * @param player the player. + * @return {@code True} if so. + */ + public boolean hasForgingRing(Player player) { + return player.getEquipment().containsItem(RING_OF_FORGING); + } + + /** + * Checks if the forging is a succes. + * + * @param player the player. + * @return {@code True} if success. + */ + public boolean success(Player player) { + if (bar == Bar.IRON && !superHeat) { + if (hasForgingRing(player)) { + return true; + } else { + return RandomFunction.getRandom(100) <= (player.getSkills().getLevel(Skills.SMITHING) >= 45 ? 80 : 50); + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/ObeliskOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/ObeliskOptionPlugin.java new file mode 100644 index 000000000..ad92bf519 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/ObeliskOptionPlugin.java @@ -0,0 +1,47 @@ +package core.game.node.entity.skill.summoning; + +import core.cache.def.impl.ObjectDefinition; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; + +/** + * Represents the option used on the summoning obelisk. + * @author 'Vexia + * @author Emperor + */ +@Initializable +public final class ObeliskOptionPlugin extends OptionHandler { + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "infuse-pouch": + SummoningCreator.open(player, true); + return true; + case "renew-points": + if (player.getSkills().getLevel(Skills.SUMMONING) == player.getSkills().getStaticLevel(Skills.SUMMONING)) { + player.getPacketDispatch().sendMessage("You already have full summoning points."); + return true; + } + player.visualize(Animation.create(8502), Graphics.create(1308)); + player.getSkills().setLevel(Skills.SUMMONING, player.getSkills().getStaticLevel(Skills.SUMMONING)); + player.getPacketDispatch().sendMessage("You renew your summoning points."); + return true; + } + return false; + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.setOptionHandler("infuse-pouch", this); + ObjectDefinition.setOptionHandler("renew-points", this); + return this; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningCreationPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningCreationPlugin.java new file mode 100644 index 000000000..2d12eab0a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningCreationPlugin.java @@ -0,0 +1,115 @@ +package core.game.node.entity.skill.summoning; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Represents a component plugin used to handle the summoning creation of a + * node. + * @author 'Vexia + */ +@Initializable +public final class SummoningCreationPlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(669, this); + ComponentDefinition.put(673, this); + PluginManager.definePlugin(new ObeliskHandler()); + return this; + } + + @Override + public boolean handle(Player player, final Component component, int opcode, int button, final int slot, int itemId) { + switch (button) { + case 18: + case 17: + SummoningCreator.configure(player, button == 17); + break; + } + switch (component.getId()) { + case 669: + case 673: + switch (opcode) { + case 155: + case 196: + case 124: + case 199: + SummoningCreator.create(player, getItemAmount(opcode), component.getId() == 669 ? SummoningPouch.forSlot(slot > 50 ? slot -1 : slot) : SummoningScroll.forId(slot > 50 ? slot -1 : slot)); + break; + case 234: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + SummoningCreator.create(player, (int) getValue(), component.getId() == 669 ? SummoningPouch.forSlot(slot > 50 ? slot -1 : slot) : SummoningScroll.forId(slot > 50 ? slot -1 : slot)); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + return true; + case 166: + SummoningCreator.list(player, SummoningPouch.forSlot(slot > 50 ? slot -1 : slot)); + break; + } + break; + case 168: + player.getPacketDispatch().sendMessage(ItemDefinition.forId(SummoningScroll.forId(slot > 50 ? slot -1 : slot).getItemId()).getExamine()); + break; + } + return true; + } + + /** + * Method used to get the item amount based on id. + * @param opcode the opcode. + * @return the amount to make. + */ + private final int getItemAmount(final int opcode) { + return opcode == 155 ? 1 : opcode == 196 ? 5 : opcode == 124 ? 10 : opcode == 199 ? 28 : -1; + } + + /** + * Represents the use with handler for an obelisk. + * @author 'Vexia + * @version 1.0 + */ + public static final class ObeliskHandler extends UseWithHandler { + + /** + * Represents the ids of the obelisks. + */ + private static final int[] IDS = new int[] { 28716, 28719, 28722, 28725, 28278, 28731, 28734 }; + + /** + * Constructs a new {@code ObeliskHandler} {@code Object}. + */ + public ObeliskHandler() { + super(12047, 12043, 12059, 12019, 12009, 12778, 12049, 12055, 12808, 2067, 12064, 12091, 12800, 12053, 12065, 12021, 12818, 12781, 12798, 12814, 12073, 12075, 12077, 12079, 12081, 12083, 12087, 12071, 12051, 12095, 12097, 12099, 12101, 12103, 12105, 12107, 12816, 12041, 12061, 12007, 12035, 12027, 12531, 12812, 12784, 12710, 12023, 12085, 12037, 12015, 12045, 12123, 12031, 12029, 12033, 12820, 12057, 12792, 12069, 12011, 12782, 12794, 12013, 12025, 12017, 12039, 12089, 12093, 12802, 12804, 12806, 12788, 12776, 12786, 12796, 12822, 12790); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : IDS) { + addHandler(id, OBJECT_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Player player = event.getPlayer(); + SummoningCreator.open(player, false); + return true; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningCreator.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningCreator.java new file mode 100644 index 000000000..1a7f10f6e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningCreator.java @@ -0,0 +1,300 @@ +package core.game.node.entity.skill.summoning; + +import core.cache.def.impl.CS2Mapping; +import core.game.component.Component; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; + +/** + * Represents a utility class of creating summoning nodes. + * @author Vexia + */ +public final class SummoningCreator { + + /** + * Represents the animation used when creating a node. + */ + private static final Animation ANIMATION = new Animation(9068); + + /** + * Represents the params used for the accessmask on the pouch creating + * interface. + */ + private static final Object[] POUCH_PARAMS = new Object[] { "List", "Infuse-X", "Infuse-All", "Infuse-10", "Infuse-5", "Infuse", 20, 4, 669 << 16 | 15 }; + + /** + * Represents the params used for the accessmask on the scrollc reating + * interface. + */ + private static final Object[] SCROLL_PARAMS = new Object[] { "Transform-X", "Transform-All", "Transform-10", "Transform-5", "Transform", 20, 4, 673 << 16 | 15 }; + + /** + * Represents the summoning component. + */ + private static final Component SUMMONING_COMPONENT = new Component(669); + + /** + * Represents the scroll component. + */ + private static final Component SCROLL_COMPONENT = new Component(673); + + /** + * Method used to open the creation screen. + * @param player the player. + */ + public static final void open(final Player player, final boolean pouch) { + configure(player, pouch); + } + + /** + * Method used to configure a creation interface. + * @param player the player. + * @param pouch the pouch. + */ + public static final void configure(final Player player, final boolean pouch) { + player.getInterfaceManager().open(pouch ? SUMMONING_COMPONENT : SCROLL_COMPONENT); + player.getPacketDispatch().sendRunScript(pouch ? 757 : 765, pouch ? "Iiissssss" : "Iiisssss", pouch ? POUCH_PARAMS : SCROLL_PARAMS); + player.getPacketDispatch().sendAccessMask(pouch ? 190 : 126, 15, pouch ? 669 : 673, 0, 78); + } + + /** + * Method used to create a summoning node type. + * @param player the player. + * @param amount the amount. + * @param node the node. + */ + public static void create(final Player player, final int amount, Object node) { + if (node == null) { + return; + } + player.getPulseManager().run(new CreatePulse(player, null, SummoningNode.parse(node), amount)); + } + + /** + * Method used to list the items needed for a pouch. + * @param pouch the pouch. + */ + public static void list(final Player player, final SummoningPouch pouch) { + player.getPacketDispatch().sendMessage((String) CS2Mapping.forId(1186).getMap().get(pouch.getPouchId())); + } + + /** + * Represents the skill pulse used to create a summoning node. + * @author 'Vexia + */ + public static final class CreatePulse extends SkillPulse { + + /** + * Represents the summoning node type. + */ + private final SummoningCreator.SummoningNode type; + + /** + * Represents the object. + */ + private GameObject object; + + /** + * Represents the amount to make. + */ + private int amount; + + /** + * Constructs a new {@code SummoningCreator} {@code Object}. + * @param player the player. + * @param node the node. + * @param type the type. + * @param amount the amount. + */ + public CreatePulse(Player player, Item node, final SummoningCreator.SummoningNode type, final int amount) { + super(player, node); + this.type = type; + this.amount = amount; + this.object = RegionManager.getObject(new Location(2209, 5344, 0)); + + } + + @Override + public boolean checkRequirements() { + player.getInterfaceManager().close(); + if (player.getSkills().getLevel(Skills.SUMMONING) < type.getLevel()) { + player.getPacketDispatch().sendMessage("You need a Summoning level of at least " + type.getLevel() + " in order to do this."); + return false; + } + if (amount == 0) { + player.getPacketDispatch().sendMessage("You don't have the required item(s) to make this."); + return false; + } + for (Item i : type.getRequired()) { + if (!player.getInventory().containsItem(i)) { + player.getPacketDispatch().sendMessage("You don't have the required item(s) to make this."); + return false; + } + } + return true; + } + + @Override + public void animate() { + player.lock(3); + player.animate(ANIMATION); + } + + @Override + public void stop() { + super.stop(); + player.getPacketDispatch().sendObjectAnimation(object, new Animation(8510)); + } + + @Override + public boolean reward() { + if (getDelay() == 1) { + setDelay(4); + player.getPacketDispatch().sendObjectAnimation(object, Animation.create(8509)); + return false; + } + player.getPacketDispatch().sendObjectAnimation(object, Animation.create(8510)); + for (int i = 0; i < amount; i++) { + for (Item item : type.getRequired()) { + if (!player.getInventory().containsItem(item)) { + return true; + } + } + if (player.getInventory().remove(type.getRequired())) { + final Item item = type.getProduct(); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.SUMMONING, type.getExperience(), true); + } + } + return true; + } + + } + + /** + * Represents a summoning node type. + * @author 'Vexia + */ + public static class SummoningNode { + + /** + * Represents the base object. + */ + private final Object base; + + /** + * Represents the required items. + */ + private final Item[] required; + + /** + * Represents the product. + */ + private final Item product; + + /** + * Represents the experience. + */ + private final double experience; + + /** + * Represents the level. + */ + private final int level; + + /** + * Constructs a new {@code SummoningCreator} {@code Object}. + * @param required the required items. + * @param product the product. + * @param experience the experience. + * @param level the level. + */ + public SummoningNode(final Object base, Item[] required, Item product, double experience, int level) { + this.base = base; + this.required = required; + this.product = product; + this.experience = experience; + this.level = level; + } + + /** + * Gets the required. + * @return The required. + */ + public Item[] getRequired() { + return required; + } + + /** + * Gets the product. + * @return The product. + */ + public Item getProduct() { + return product; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the base. + * @return The base. + */ + public Object getBase() { + return base; + } + + /** + * Method used to check if the base is a pouch. + * @return the pouch. + */ + public boolean isPouch() { + return base instanceof SummoningPouch; + } + + /** + * Method used to parse a summoning node. + * @param node the node. + * @return the summoning node. + */ + public static SummoningNode parse(final Object node) { + final Item[] required = node instanceof SummoningPouch ? ((SummoningPouch) node).getItems() : createList(((SummoningScroll) node).getItems()); + final Item product = node instanceof SummoningPouch ? new Item(((SummoningPouch) node).getPouchId(), 1) : new Item(((SummoningScroll) node).getItemId(), 10); + final int level = node instanceof SummoningPouch ? ((SummoningPouch) node).getLevelRequired() : ((SummoningScroll) node).getLevel(); + final double experience = node instanceof SummoningPouch ? ((SummoningPouch) node).getCreateExperience() : ((SummoningScroll) node).getExperience(); + return new SummoningNode(node, required, product, experience, level); + } + + /** + * Method used to create the list. + * @param ids the ids. + * @return the array of items. + */ + private static final Item[] createList(final int... ids) { + Item[] list = new Item[ids.length]; + for (int i = 0; i < ids.length; i++) { + list[i] = new Item(ids[i], 1); + } + return list; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningPouch.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningPouch.java new file mode 100644 index 000000000..5c10a3b89 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningPouch.java @@ -0,0 +1,567 @@ +package core.game.node.entity.skill.summoning; + +import core.game.node.item.Item; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents a summoning pouch. + * @author Emperor + */ +public enum SummoningPouch { + + /** + * Represents a spirit wolf pouch. + */ + SPIRIT_WOLF_POUCH(0, 12047, 1, 4.8, 6829, 0.1, 1, new Item(12158), new Item(12155), new Item(2859), new Item(12183, 7)), + + /** + * Represents a dreadfowl pouch. + */ + DREADFOWL_POUCH(1, 12043, 4, 9.3, 6825, 0.1, 1, new Item(12158), new Item(12155), new Item(2138), new Item(12183, 8)), + + /** + * Represents a spirit spider pouch. + */ + SPIRIT_SPIDER_POUCH(2, 12059, 10, 12.6, 6841, 0.2, 2, new Item(12158), new Item(12155), new Item(6291), new Item(12183, 8)), + + /** + * Represents a thorny snail pouch. + */ + THORNY_SNAIL_POUCH(3, 12019, 13, 12.6, 6806, 0.2, 2, new Item(12158), new Item(12155), new Item(3363), new Item(12183, 9)), + + /** + * Represents a granite crab pouch. + */ + GRANITE_CRAB_POUCH(4, 12009, 16, 31.6, 6796, 0.2, 2, new Item(12158), new Item(12155), new Item(440), new Item(12183, 7)), + + /** + * Represents a spirit mosquito pouch. + */ + SPIRIT_MOSQUITO_POUCH(5, 12778, 17, 46.5, 7331, 0.5, 2, new Item(12158), new Item(12155), new Item(6319), new Item(12183, 1)), + + /** + * Represents a desrrt wyrm pouch. + */ + DESERT_WYRM_POUCH(6, 12049, 18, 31.2, 6831, 0.4, 1, new Item(12159), new Item(12155), new Item(1783), new Item(12183, 45)), + + /** + * Represents a spirit scorpion pouch. + */ + SPIRIT_SCORPION_POUCH(7, 12055, 19, 83.2, 6837, 0.9, 2, new Item(12160), new Item(12155), new Item(3095), new Item(12183, 57)), + + /** + * Represents a spirit tz-kih pouch. + */ + SPIRIT_TZ_KIH_POUCH(8, 12808, 22, 96.8, 7361, 1.1, 3, new Item(12160), new Item(12168), new Item(12155), new Item(12183, 64)), + + /** + * Represents an albino rat pouch. + */ + ALBINO_RAT_POUCH(9, 12067, 23, 202.4, 6847, 2.3, 1, new Item(12163), new Item(12155), new Item(2134), new Item(12183, 75)), + + /** + * Represents a spirit kalphite pouch. + */ + SPIRIT_KALPHITE_POUCH(10, 12063, 25, 220, 6994, 2.5, 3, new Item(12163), new Item(12155), new Item(3138), new Item(12183, 51)), + + /** + * Represents a compost mound pouch. + */ + COMPOST_MOUND_POUCH(11, 12091, 28, 49.8, 6871, 0.6, 6, new Item(12159), new Item(12155), new Item(6032), new Item(12183, 47)), + + /** + * Represents a giant chinchompa pouch. + */ + GIANT_CHINCHOMPA_POUCH(12, 12800, 29, 255.2, 7353, 2.9, 1, new Item(12163), new Item(12155), new Item(10033), new Item(12183, 84)), + + /** + * Represents a vampire bat pouch. + */ + VAMPIRE_BAT_POUCH(13, 12053, 31, 136, 6835, 1.5, 4, new Item(12160), new Item(12155), new Item(3325), new Item(12183, 81)), + + /** + * Represents a honey badger pouch. + */ + HONEY_BADGER_POUCH(14, 12065, 32, 140.8, 6845, 1.6, 4, new Item(12160), new Item(12155), new Item(12156), new Item(12183, 84)), + + /** + * Represents a beaver pouch. + */ + BEAVER_POUCH(15, 12021, 33, 57.6, 6808, 0.7, 4, new Item(12159), new Item(12155), new Item(1519), new Item(12183, 72)), + + /** + * Represents a void ravager pouch. + */ + VOID_RAVAGER_POUCH(16, 12818, 34, 59.6, 7370, 0.7, 4, new Item(12159), new Item(12164), new Item(12155), new Item(12183, 74)), + + /** + * Represents a void spinner pouch. + */ + VOID_SPINNER_POUCH(17, 12780, 34, 59.6, 7333, 0.7, 4, new Item(12163), new Item(12166), new Item(12155), new Item(12183, 74)), + + /** + * Represents a void torcher pouch. + */ + VOID_TORCHER_POUCH(18, 12798, 34, 59.6, 7351, 0.7, 4, new Item(12163), new Item(12167), new Item(12155), new Item(12183, 74)), + + /** + * Represents a void shifter pouch. + */ + VOID_SHIFTER_POUCH(19, 12814, 34, 59.6, 7367, 0.7, 4, new Item(12163), new Item(12165), new Item(12155), new Item(12183, 74)), + + /** + * Represents a bronze minotaur pouch. + */ + BRONZE_MINOTAUR_POUCH(64, 12073, 36, 316.8, 6853, 3.6, 3, new Item(12163), new Item(12155), new Item(2349), new Item(12183, 102)), + + /** + * Represents an iron minotaur pouch. + */ + IRON_MINOTAUR_POUCH(65, 12075, 46, 404.8, 6855, 4.6, 9, new Item(12163), new Item(12155), new Item(2351), new Item(12183, 125)), + + /** + * Represents a steel minotaur pouch. + */ + STEEL_MINOTAUR_POUCH(66, 12077, 56, 492.8, 6857, 5.6, 9, new Item(12163), new Item(12155), new Item(2353), new Item(12183, 141)), + + /** + * Represents a mithril minotaur pouch. + */ + MITHRIL_MINOTAUR_POUCH(67, 12079, 66, 580.8, 6859, 6.6, 9, new Item(12163), new Item(12155), new Item(2359), new Item(12183, 152)), + + /** + * Represents an adamant minotaur pouch. + */ + ADAMANT_MINOTAUR_POUCH(68, 12081, 76, 668.8, 6861, 7.6, 9, new Item(12163), new Item(12155), new Item(2361), new Item(12183, 144)), + + /** + * Represents a rune minotaur pouch. + */ + RUNE_MINOTAUR_POUCH(69, 12083, 86, 756.8, 6863, 8.6, 9, new Item(12163), new Item(12155), new Item(2363), new Item(12183, 1)), + + /** + * Represents a bull ant pouch. + */ + BULL_ANT_POUCH(20, 12087, 40, 52.8, 6867, 0.6, 5, new Item(12158), new Item(12155), new Item(6010), new Item(12183, 11)), + + /** + * Represents a macaw pouch. + */ + MACAW_POUCH(21, 12071, 41, 72.4, 6851, 0.8, 5, new Item(12159), new Item(12155), new Item(249), new Item(12183, 78)), + + /** + * Represents an evil turnip pouch. + */ + EVIL_TURNIP_POUCH(22, 12051, 42, 184.8, 6833, 2.1, 5, new Item(12160), new Item(12155), new Item(12153), new Item(12183, 104)), + + /** + * Represents a spirit cockatrice pouch. + */ + SPIRIT_COCKATRICE_POUCH(23, 12095, 43, 75.2, 6875, 0.9, 5, new Item(12159), new Item(12155), new Item(12109), new Item(12183, 88)), + + /** + * Represents a spirit guthatrice pouch. + */ + SPIRIT_GUTHATRICE_POUCH(24, 12097, 43, 75.2, 6877, 0.9, 5, new Item(12159), new Item(12155), new Item(12111), new Item(12183, 88)), + + /** + * Represents a spirit saratrice pouch. + */ + SPIRIT_SARATRICE_POUCH(25, 12099, 43, 75.2, 6879, 0.9, 5, new Item(12159), new Item(12155), new Item(12113), new Item(12183, 88)), + + /** + * Represents a spirit zamatrice pouch. + */ + SPIRIT_ZAMATRICE_POUCH(26, 12101, 43, 75.2, 6881, 0.9, 5, new Item(12159), new Item(12155), new Item(12115), new Item(12183, 88)), + + /** + * Represents a spirit pengatrice pouch. + */ + SPIRIT_PENGATRICE_POUCH(27, 12103, 43, 75.2, 6883, 0.9, 5, new Item(12159), new Item(12155), new Item(12117), new Item(12183, 88)), + + /** + * Represents a coraxatrice pouch. + */ + SPIRIT_CORAXATRICE_POUCH(28, 12105, 43, 75.2, 6885, 0.9, 5, new Item(12159), new Item(12155), new Item(12119), new Item(12183, 88)), + + /** + * Represents a vulatrice pouch. + */ + SPIRIT_VULATRICE(29, 12107, 43, 75.2, 6887, 0.9, 5, new Item(12159), new Item(12155), new Item(12121), new Item(12183, 88)), + + /** + * Represents a pyrelord pouch. + */ + PYRELORD_POUCH(30, 12816, 46, 202.4, 7377, 2.3, 5, new Item(12160), new Item(12155), new Item(590), new Item(12183, 111)), + + /** + * Represents a magpie pouch. + */ + MAGPIE_POUCH(31, 12041, 47, 83.2, 6824, 0.9, 5, new Item(12159), new Item(12155), new Item(1635), new Item(12183, 88)), + + /** + * Represents a bloated leech pouch. + */ + BLOATED_LEECH_POUCH(32, 12061, 49, 215.2, 6843, 2.4, 5, new Item(12160), new Item(12155), new Item(2132), new Item(12183, 117)), + + /** + * Represents a spirit terrorbird pouch. + */ + SPIRIT_TERRORBIRD_POUCH(33, 12007, 52, 68.4, 6794, 0.8, 6, new Item(12158), new Item(12155), new Item(9978), new Item(12183, 12)), + + /** + * Represents an abyssal parasite pouch. + */ + ABYSSAL_PARASITE_POUCH(34, true,12035, 54, 94.8, 6818, 1.1, 6, new Item(12159), new Item(12155), new Item(12161), new Item(12183, 106)), + + /** + * Represents a spirit jelly pouch. + */ + SPIRIT_JELLY_POUCH(35, 12027, 55, 484, 6992, 5.5, 6, new Item(12163), new Item(12155), new Item(1937), new Item(12183, 151)), + + /** + * Represents an ibis pouch. + */ + IBIS_POUCH(36, 12531, 56, 98.8, 6991, 1.1, 6, new Item(12159), new Item(12155), new Item(311), new Item(12183, 109)), + + /** + * Represents a spirit kyatt pouch. + */ + SPIRIT_KYATT_POUCH(37, 12812, 57, 501.6, 7365, 5.7, 6, new Item(12163), new Item(12155), new Item(10103), new Item(12183, 153)), + + /** + * Represents a spirit larupia pouch. + */ + SPIRIT_LARUPIA_POUCH(38, 12784, 57, 501.6, 7337, 5.7, 6, new Item(12163), new Item(12155), new Item(10095), new Item(12183, 155)), + + /** + * Represents a spirit graahk pouch. + */ + SPIRIT_GRAAHK_POUCH(39, 12810, 57, 501.6, 7363, 5.7, 6, new Item(12163), new Item(12155), new Item(10099), new Item(12183, 154)), + + /** + * Represents a karamthulhu overlord pouch. + */ + KARAMTHULHU_POUCH(40, 12023, 58, 510.4, 6809, 5.8, 6, new Item(12163), new Item(12155), new Item(6667), new Item(12183, 144)), + + /** + * Represents a smoke devil pouch. + */ + SMOKE_DEVIL_POUCH(41, 12085, 61, 268, 6865, 3, 7, new Item(12160), new Item(12155), new Item(9736), new Item(12183, 141)), + + /** + * Represents an abyssal lurker pouch. + */ + ABYSSAL_LUKRER(42, true,12037, 62, 109.6, 6820, 1.9, 9, new Item(12159), new Item(12155), new Item(12161), new Item(12183, 119)), + + /** + * Represents a spirit cobra pouch. + */ + SPIRIT_COBRA_POUCH(43, 12015, 63, 276.8, 6802, 3.1, 6, new Item(12160), new Item(12155), new Item(6287), new Item(12183, 116)), + + /** + * Represents a stranger plant pouch. + */ + STRANGER_PLANT_POUCH(44, 12045, 64, 281.6, 6827, 3.2, 6, new Item(12160), new Item(12155), new Item(8431), new Item(12183, 128)), + + /** + * Represents a barker toad pouch. + */ + BARKER_TOAD_POUCH(45, 12123, 66, 87, 6889, 1, 7, new Item(12158), new Item(12155), new Item(2150), new Item(12183, 11)), + + /** + * Represents a war tortoise pouch. + */ + WAR_TORTOISE_POUCH(46, 12031, 67, 58.6, 6815, 0.7, 7, new Item(12158), new Item(12155), new Item(7939), new Item(12183, 1)), + + /** + * Represents a bunyip pouch. + */ + BUNYIP_POUCH(47, 12029, 68, 119.2, 6813, 1.4, 7, new Item(12159), new Item(12155), new Item(383), new Item(12183, 110)), + + /** + * Represents a fruit bat pouch. + */ + FRUIT_BAT_POUCH(48, 12033, 69, 121.2, 6817, 1.4, 8, new Item(12159), new Item(12155), new Item(1963), new Item(12183, 130)), + + /** + * Represents a ravenous locust pouch. + */ + RAVENOUS_LOCUST_POUCH(49, 12820, 70, 132, 7372, 1.5, 4, new Item(12160), new Item(12155), new Item(1933), new Item(12183, 79)), + + /** + * Represents an arctic bear pouch. + */ + ARCTIC_BEAR_POUCH(50, 12057, 71, 93.2, 6839, 1.1, 8, new Item(12158), new Item(12155), new Item(10117), new Item(12183, 14)), + + /** + * Represents a Phoenix + */ + PHOENIX_POUCH(50, 14623, 72, 93.2, 8575, 1.1, 8, new Item(12160, 1), new Item(12183, 165), new Item(12155, 1), new Item(14616, 1)), + + /** + * Represents an obsidian golem pouch. + */ + OBSIDIAN_GOLEM_POUCH(51, 12792, 73, 642.4, 7345, 7.3, 8, new Item(12163), new Item(12155), new Item(12168), new Item(12183, 195)), + + /** + * Represents a granite lobster pouch. + */ + GRANITE_LOBSTER_POUCH(52, 12069, 74, 325.6, 6849, 3.7, 8, new Item(12160), new Item(12155), new Item(6979), new Item(12183, 166)), + + /** + * Represents a praying mantis pouch. + */ + PRAYING_MANTIS_POUCH(53, 12011, 75, 329.6, 6798, 3.6, 8, new Item(12160), new Item(12155), new Item(2460), new Item(12183, 168)), + + /** + * Represents a forge regent pouch. + */ + FORGE_REGENT_BEAST(54, 12782, 76, 134, 7335, 1.5, 9, new Item(12159), new Item(12155), new Item(10020), new Item(12183, 141)), + + /** + * Represents a talon beast pouch. + */ + TALON_BEAST_POUCH(55, 12794, 77, 1015.2, 7347, 3.8, 9, new Item(12160), new Item(12155), new Item(12162), new Item(12183, 174)), + + /** + * Represents a giant ent pouch. + */ + GIANT_ENT_POUCH(56, 12013, 78, 136.8, 6800, 1.6, 8, new Item(12159), new Item(5933), new Item(12155), new Item(12183, 124)), + + /** + * Represents a hydra pouch. + */ + HYDRA_POUCH(60, 12025, 80, 140.8, 6811, 1.6, 9, new Item(12159), new Item(571), new Item(12183, 128)), + + /** + * Represents a spirit dagannoth pouch. + */ + SPIRIT_DAGANNOTH_POUCH(61, 12017, 83, 364.8, 6804, 4.1, 9, new Item(12160), new Item(6155), new Item(12183, 1)), + + /** + * Represents a unicorn stallion pouch. + */ + UNICORN_STALLION_POUCH(70, 12039, 88, 154.4, 6822, 1.8, 9, new Item(12159), new Item(237), new Item(12183, 203)), + + /** + * Represents a wolpertinger pouch. + */ + WOLPERTINGER_POUCH(72, 12089, 92, 404.8, 6869, 4.5, 10, new Item(12160), new Item(2859), new Item(3226), new Item(12183, 203)), + + /** + * Represents a pack yak pouch. + */ + PACK_YAK_POUCH(75, 12093, 96, 422.4, 6873, 4.8, 10, new Item(12160), new Item(10818), new Item(12183, 211)), + + /** + * Represents a fire titan pouch. + */ + FIRE_TITAN_POUCH(57, 12802, 79, 695.2, 7355, 7.9, 9, new Item(12163), new Item(1442), new Item(12155), new Item(12183, 198)), + + /** + * Represents a moss titan pouch. + */ + MOSS_TITAN_POUCH(58, 12804, 79, 695.2, 7357, 7.9, 9, new Item(12163), new Item(1440), new Item(12155), new Item(12183, 198)), + + /** + * Represents an ice titan pouch. + */ + ICE_TITAN_POUCH(59, 12806, 79, 695.2, 7359, 7.9, 9, new Item(12163), new Item(1438), new Item(1444), new Item(12155), new Item(12183, 198)), + + /** + * Represents a lava titan pouch. + */ + LAVA_TITAN_POUCH(62, 12788, 83, 730.4, 7341, 8.3, 9, new Item(12163), new Item(12168), new Item(12155), new Item(12183, 219)), + + /** + * Represents a swamp titan pouch. + */ + SWAMP_TITAN_POUCH(63, 12776, 85, 373.6, 7329, 4.2, 9, new Item(12160), new Item(10149), new Item(12155), new Item(12183, 150)), + + /** + * Represents a geyser titan pouch. + */ + GEYSER_TITAN_POUCH(71, 12786, 89, 783.2, 7339, 8.9, 9, new Item(12163), new Item(1444), new Item(12155), new Item(12183, 222)), + + /** + * Represents an abyssal titan pouch. + */ + ABYSSAL_TITAN_POUCH(73, true,12796, 93, 163.2, 7349, 1.9, 10, new Item(12159), new Item(12161), new Item(12155), new Item(12183, 113)), + + /** + * Represents an iron titan pouch. + */ + IRON_TITAN_POUCH(74, 12822, 95, 417.6, 7375, 4.7, 10, new Item(12160), new Item(1115), new Item(12155), new Item(12183, 198)), + + /** + * Represents a steel titan pouch. + */ + STEEL_TITAN_POUCH(76, 12790, 99, 435.2, 7343, 4.9, 10, new Item(12160), new Item(1119), new Item(12155), new Item(12183, 178)); + + /** + * The mapping. + */ + private static final Map POUCHES = new HashMap(); + + /** + * Populate the mapping. + */ + static { + for (SummoningPouch pouch : SummoningPouch.values()) { + POUCHES.put(pouch.pouchId, pouch); + } + } + + /** + * Gets a summoning pouch object from the mapping. + * @param pouchId The pouch item id. + * @return The {@code SummoningPouch} {@code Object},
or {@code null} + * if the pouch didn't exist. + */ + public static SummoningPouch get(int pouchId) { + return POUCHES.get(pouchId); + } + + /** + * The slot id. + */ + private final int slot; + + /** + * The pouch item id. + */ + private final int pouchId; + + /** + * The level required to create this pouch. + */ + private final int levelRequired; + + /** + * The experience gained when creating this pouch. + */ + private final double createExperience; + + /** + * The familiar npc id. + */ + private final int npcId; + + /** + * The experience gained when summoning the familiar. + */ + private final double summonExperience; + + /** + * The summon cost. + */ + private final int summonCost; + + /** + * The items required to create this pouch. + */ + private final Item[] items; + + public boolean abyssal; + + /** + * Constructs a new {@code SummoningPouch} {@code Object}. + * @param pouchId The pouch item id. + * @param levelRequired The level required to create. + * @param createExperience The experience gained when creating a pouch. + * @param npcId The familiar's NPC id. + * @param summonExperience The experience gained when summoning. + * @param summonCost The amount of summoning points to drain when summoned. + * @param items The items required to create this pouch. + */ + private SummoningPouch(int slot, int pouchId, int levelRequired, double createExperience, int npcId, double summonExperience, int summonCost, Item... items) { + this.slot = slot; + this.pouchId = pouchId; + this.levelRequired = levelRequired; + this.createExperience = createExperience; + this.npcId = npcId; + this.summonExperience = summonExperience; + this.summonCost = summonCost; + this.items = items; + } + + private SummoningPouch(int slot, boolean abyssal, int pouchId, int levelRequired, double createExperience, int npcId, double summonExperience, int summonCost, Item... items) { + this(slot, pouchId, levelRequired, createExperience, npcId, summonExperience, summonCost, items); + this.abyssal = abyssal; + } + /** + * Gets the summoning pouch for the given slot. + * @param slot The slot. + * @return The summoning pouch. + */ + public static SummoningPouch forSlot(int slot) { + for (SummoningPouch pouch : SummoningPouch.values()) { + if (pouch.getSlot() == slot) { + return pouch; + } + } + return null; + } + + /** + * @return the pouchId + */ + public int getPouchId() { + return pouchId; + } + + /** + * @return the levelRequired + */ + public int getLevelRequired() { + return levelRequired; + } + + /** + * @return the createExperience + */ + public double getCreateExperience() { + return createExperience; + } + + /** + * @return the npcId + */ + public int getNpcId() { + return npcId; + } + + /** + * @return the summonExperience + */ + public double getSummonExperience() { + return summonExperience; + } + + /** + * Gets the amount of points to decrease the summoning points with when + * summoned. + * @return The amount of points. + */ + public int getSummonCost() { + return summonCost; + } + + /** + * @return the items + */ + public Item[] getItems() { + return items; + } + + /** + * @return the slot + */ + public int getSlot() { + return slot; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningScroll.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningScroll.java new file mode 100644 index 000000000..a1b7d5520 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningScroll.java @@ -0,0 +1,134 @@ +package core.game.node.entity.skill.summoning; + +/** + * Represents a summoning scroll. + * @author 'Vexia + */ +public enum SummoningScroll { + HOWL_SCROLL(0, 12425, 0.1, 1, 12047), DREADFOWL_STRIKE_SCROLL(1, 12445, 0.1, 4, 12043), EGG_SPAWN_SCROLL(2, 12428, 0.2, 10, 12059), SLIME_SPRAY_SCROLL(3, 12459, 0.2, 13, 12019), STONY_SHELL_SCROLL(4, 12533, 0.2, 16, 12009), PESTER_SCROLL(5, 12838, 0.5, 17, 12778), ELECTRIC_LASH_SCROLL(6, 12460, 0.4, 18, 12049), VENOM_SHOT_SCROLL(7, 12432, 0.9, 19, 12055), FIREBALL_ASSAULT_SCROLL(8, 12839, 1.1, 22, 12808), CHEESE_FEAST_SCROLL(9, 12430, 2.3, 23, 12067), SANDSTORM_SCROLL(10, 12446, 2.5, 25, 12063), GENERATE_COMPOST_SCROLL(11, 12440, 0.6, 28, 12091), EXPLODE_SCROLL(12, 12834, 2.9, 29, 12800), VAMPYRE_TOUCH_SCROLL(13, 12447, 1.5, 31, 12053), INSANE_FEROCITY_SCROLL(14, 12433, 1.6, 32, 12065), MULTICHOP_SCROLL(15, 12429, 0.7, 33, 12021), CALL_TO_ARMS_SCROLL1(16, 12443, 0.7, 34, 12818), CALL_TO_ARMS_SCROLL2(17, 12443, 0.7, 34, 12814), CALL_TO_ARMS_SCROLL3(18, 12443, 0.7, 34, 12780), CALL_TO_ARMS_SCROLL4(19, 12443, 0.7, 34, 12798), BRONZE_BULL_RUSH_SCROLL(64, 12461, 3.6, 36, 12073), UNBURDEN_SCROLL(20, 12431, 0.6, 40, 12087), HERBCALL_SCROLL(21, 12422, 0.8, 41, 12071), EVIL_FLAMES_SCROLL(22, 12448, 2.1, 42, 12051), PETRIFYING_GAZE_SCROLL1(23, 12458, 0.9, 43, 12095), PETRIFYING_GAZE_SCROLL2(24, 12458, 0.9, 43, 12097), PETRIFYING_GAZE_SCROLL3(25, 12458, 0.9, 43, 12099), PETRIFYING_GAZE_SCROLL4(26, 12458, 0.9, 43, 12101), PETRIFYING_GAZE_SCROLL5(27, 12458, 0.9, 43, 12103), PETRIFYING_GAZE_SCROLL6(28, 12458, 0.9, 43, 12105), PETRIFYING_GAZE_SCROLL7(29, 12458, 0.9, 43, 12107), IRON_BULL_RUSH_SCROLL(65, 12462, 4.6, 46, 12075), IMMENSE_HEAT_SCROLL(30, 12829, 2.3, 46, 12816), THIEVING_FINGERS_SCROLL(31, 12426, 47, 167, 12041), BLOOD_DRAIN_SCROLL(32, 12444, 2.4, 49, 12061), TIRELESS_RUN_SCROLL(33, 12441, 0.8, 52, 12007), ABYSSAL_DRAIN_SCROLL(34, 12454, 1.1, 54, 12035), DISSOLVE_SCROLL(35, 12453, 5.5, 55, 12027), STEEL_BULL_RUSH_SCROLL(66, 12463, 5.6, 56, 12077), FISH_RAIN_SCROLL(36, 12424, 1.1, 56, 12531), AMBUSH_SCROLL(37, 12836, 5.7, 57, 12812), RENDING_SCROLL(38, 12840, 5.7, 57, 12784), GOAD_SCROLL(39, 12835, 5.7, 57, 12810), DOOMSPHERE_SCROLL(40, 12455, 5.8, 58, -1), DUST_CLOUD_SCROLL(41, 12468, 3.0, 61, 12085), ABYSSAL_STEALTH_SCROLL(42, 12427, 1.9, 62, 12037), OPHIDIAN_INCUBATION_SCROLL(43, 12436, 3.1, 63, 12015), POISONOUS_BLAST_SCROLL(44, 12467, 3.2, 64, 12045), MITHRIL_BULL_RUSH_SCROLL(67, 12464, 6.6, 66, 12079), TOAD_BARK_SCROLL(45, 12452, 1.0, 66, 12123), TESTUDO_SCROLL(46, 12439, 0.7, 67, 12031), SWALLOW_WHOLE_SCROLL(47, 12438, 1.4, 68, 12029), FRUITFALL_SCROLL(48, 12423, 1.4, 69, 12033), FAMINE_SCROLL(49, 12830, 1.5, 70, 12820), ARCTIC_BLAST_SCROLL(50, 12451, 1.1, 71, 12057), + // RISE_FROM_THE_ASHES_SCROLL(51, 14622, 8.0, 277, -1), + VOLCANIC_STRENGTH_SCROLL(51, 12826, 7.3, 73, 12792), CRUSHING_CLAW_SCROLL(52, 12449, 3.7, 74, 12069), MANTIS_STRIKE_SCROLL(53, 12450, 3.7, 75, 12011), INFERNO_SCROLL(54, 12841, 1.5, 76, 12782), ADAMANT_BULL_RUSH_SCROLL(68, 12465, 7.6, 76, 12081), DEADLY_CLAW_SCROLL(55, 12831, 11.0, 77, 12162), ACORN_MISSILE_SCROLL(56, 12457, 1.6, 78, 12013), TITANS_CONSTITUTION_SCROLL1(57, 12824, 7.9, 79, 12802), TITANS_CONSTITUTION_SCROLL2(58, 12824, 7.9, 79, 12806), TITANS_CONSTITUTION_SCROLL3(59, 12824, 7.9, 79, 12804), REGROWTH_SCROLL(60, 12442, 1.6, 80, 12025), SPIKE_SHOT_SCROLL(61, 12456, 4.1, 83, 12017), EBON_THUNDER_SCROLL(62, 12837, 8.3, 83, 12788), SWAMP_PLAGUE_SCROLL(63, 12832, 4.1, 85, 12776), RUNE_BULL_RUSH_SCROLL(69, 12466, 8.6, 86, 12083), HEALING_AURA_SCROLL(70, 12434, 1.8, 88, 12039), BOIL_SCROLL(71, 12833, 8.9, 89, 12786), MAGIC_FOCUS_SCROLL(72, 12437, 4.6, 92, 12089), ESSENCE_SHIPMENT_SCROLL(73, 12827, 1.9, 93, 12796), IRON_WITHIN_SCROLL(74, 12828, 4.7, 95, 12822), WINTER_STORAGE_SCROLL(75, 12435, 4.8, 96, 12093), STEEL_OF_LEGENDS_SCROLL(76, 12825, 4.9, 99, 12790); + + /** + * The level required. + */ + private int level; + + /** + * The item id needed. + */ + private int itemId; + + /** + * The slot id. + */ + private int slotId; + + /** + * The xp gained. + */ + private double xp; + + /** + * The items required. + */ + private int[] items; + + /** + * Constructs a new {@code SummoningScroll} {@code Object}. + * @param level + * @param itemId + * @param xp + * @param slotId + * @param items + */ + SummoningScroll(int slotId, int itemId, double xp, int level, int... items) { + this.level = level; + this.itemId = itemId; + this.xp = xp; + this.slotId = slotId; + this.items = items; + } + + public int getPouch(){ + return items[0]; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the itemId. + * @return The itemId. + */ + public int getItemId() { + return itemId; + } + + /** + * Gets the slotId. + * @return The slotId. + */ + public int getSlotId() { + return slotId; + } + + /** + * Gets the xp. + * @return The xp. + */ + public double getExperience() { + return xp; + } + + /** + * Gets the items. + * @return The items. + */ + public int[] getItems() { + return items; + } + + /** + * Gets the summoning value for the id. + * @param id + * @return + */ + public static SummoningScroll forId(int id) { + for (SummoningScroll scroll : SummoningScroll.values()) { + if (scroll.slotId == id) { + return scroll; + } + } + return null; + } + + public static SummoningScroll forItemId(int id) { + for (SummoningScroll scroll : SummoningScroll.values()) { + if (scroll.itemId == id) { + return scroll; + } + } + return null; + } + + /** + * Gets the scroll for the given pouch item id. + * @param pouchId The pouch item id. + * @return The scroll. + */ + public static SummoningScroll forPouch(int pouchId) { + for (SummoningScroll scroll : SummoningScroll.values()) { + if (scroll.items[0] == pouchId) { + return scroll; + } + } + return null; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningTabPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningTabPlugin.java new file mode 100644 index 000000000..22792835c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningTabPlugin.java @@ -0,0 +1,77 @@ +package core.game.node.entity.skill.summoning; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.node.entity.skill.summoning.familiar.BurdenBeast; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.player.Player; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the component plugin handler for the summoning tab. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SummoningTabPlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(662, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + switch (button) { + case 51: + if (player.getFamiliarManager().hasFamiliar()) { + player.getFamiliarManager().getFamiliar().call(); + } else { + player.getPacketDispatch().sendMessage("You don't have a follower."); + } + break; + case 67: + if (player.getFamiliarManager().hasFamiliar()) { + if (!player.getFamiliarManager().getFamiliar().isBurdenBeast()) { + player.getPacketDispatch().sendMessage("Your familiar is not a beast of burden."); + break; + } + BurdenBeast beast = (BurdenBeast) player.getFamiliarManager().getFamiliar(); + if (beast.getContainer().isEmpty()) { + player.getPacketDispatch().sendMessage("Your familiar is not carrying any items."); + break; + } + beast.withdrawAll(); + break; + } + player.getPacketDispatch().sendMessage("You don't have a follower."); + break; + case 53: + if (player.getFamiliarManager().hasFamiliar()) { + player.getDialogueInterpreter().open("dismiss_dial"); + } else { + player.getPacketDispatch().sendMessage("You don't have a follower."); + } + break; + case 113: + case 101: + case 117: + case 163: + case 151: + case 83: + case 75: + default: + if (player.getFamiliarManager().hasFamiliar()) { + player.getFamiliarManager().getFamiliar().executeSpecialMove(new FamiliarSpecial(player)); + } else { + player.getPacketDispatch().sendMessage("You don't have a follower."); + } + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningTrainingRoom.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningTrainingRoom.java new file mode 100644 index 000000000..8dc51034f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/SummoningTrainingRoom.java @@ -0,0 +1,609 @@ +package core.game.node.entity.skill.summoning; + +import core.cache.def.impl.ObjectDefinition; +import core.game.component.Component; +import core.game.content.activity.ActivityManager; +import core.game.content.activity.ActivityPlugin; +import core.game.content.activity.CutscenePlugin; +import core.plugin.Initializable; +import core.game.content.dialogue.DialoguePlugin; +import core.game.content.global.action.ClimbActionHandler; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.quest.Quest; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.context.MinimapStateContext; +import core.net.packet.out.CameraViewPacket; +import core.net.packet.out.MinimapState; +import core.plugin.Plugin; +import core.plugin.PluginManager; + +/** + * Handles the summoning training room. + * @author Emperor + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class SummoningTrainingRoom extends OptionHandler { + + /** + * Represents the wolf bones item. + */ + private static final Item BONES = new Item(2859, 2); + + /** + * Represents the trapdoor key. + */ + private static final Item TRAPDOOR_KEY = new Item(12528); + + /** + * Represents the howl scroll item. + */ + private static final Item HOWL_SCROLL = new Item(12425); + + /** + * Represents the wolf pouch. + */ + private static final Item WOLF_POUCH = new Item(12047); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ObjectDefinition.forId(28675).getHandlers().put("option:open", this); + ObjectDefinition.forId(28676).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(28653).getHandlers().put("option:climb-down", this); + ObjectDefinition.forId(28572).getHandlers().put("option:climb-up", this); + ObjectDefinition.forId(28676).getHandlers().put("option:close", this); + ObjectDefinition.forId(28714).getHandlers().put("option:climb", this); + ObjectDefinition.forId(28586).getHandlers().put("option:search", this); + ActivityManager.register(new FluffyCutscene()); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + GameObject object = (GameObject) node; + Location loc = null; + Quest quest = player.getQuestRepository().getQuest("Wolf Whistle"); + int questVal = quest.getStage(player) == 0 ? 0 : quest.getStage(player) > 0 && quest.getStage(player) < 100 ? 5 : 28893; + switch (option) { + case "close": + player.getConfigManager().set(1178, questVal == 28893 ? 32989 : (1 << 11) + questVal); + return true; + case "open": + if (quest.getStage(player) < 40) { + player.getPacketDispatch().sendMessage("The trapdoor is locked."); + return true; + } else if (quest.getStage(player) == 40) { + if (player.getAttribute("has-key", false) || player.getInventory().remove(TRAPDOOR_KEY)) { + player.setAttribute("has-key", true); + player.getConfigManager().set(1178, (2 << 11) + questVal, true); + } else { + player.getPacketDispatch().sendMessage("The trapdoor is locked."); + return true; + } + } + player.getConfigManager().set(1178, questVal == 28893 ? 28893 : (2 << 11) + questVal); + return true; + case "climb-down": + if (object.getId() == 28653) { + if (quest.getStage(player) == 50) { + final CutscenePlugin plugin = player.getAttribute("in-cutscene", null); + if (plugin != null) { + plugin.stop(true); + } else { + ClimbActionHandler.climbLadder(player, object, option); + } + } else { + ClimbActionHandler.climbLadder(player, object, option); + } + return true; + } + if (!object.getLocation().equals(Location.create(2927, 3444, 0))) { + return false; + } + loc = Location.create(2209, 5348, 0); + break; + case "climb": + if (!object.getLocation().equals(Location.create(2209, 5349, 0))) { + return false; + } + loc = Location.create(2926, 3444, 0); + break; + case "climb-up": + switch (quest.getStage(player)) { + case 10: + case 50: + if (player.getFamiliarManager().hasFamiliar()) { + player.getPacketDispatch().sendMessage("You can't bring a familiar up there."); + return true; + } + if (quest.getStage(player) == 50 && (!player.getInventory().containsItem(WOLF_POUCH) || !player.getInventory().containsItem(HOWL_SCROLL))) { + player.getDialogueInterpreter().sendDialogues(player, null, "I should bring my spirit wolf pouch and howl scroll", "with me up there."); + return true; + } + ActivityManager.start(player, "fluffy cutscene", false); + break; + case 100: + case 60: + ClimbActionHandler.climbLadder(player, (GameObject) node, option); + break; + default: + player.getDialogueInterpreter().sendDialogue("There is a loud crash from upstairs, followed by the tinkling of", "broken glass."); + break; + } + return true; + case "search": + if (quest.getStage(player) == 30 && !player.getAttribute("searched-body", false)) { + if (!player.getInventory().hasSpaceFor(BONES)) { + player.getPacketDispatch().sendMessage("You search the dead body but find nothing."); + return true; + } + if (!player.getInventory().containsItem(BONES) && player.getInventory().add(BONES)) { + player.setAttribute("/save:searched-body", true); + player.getPacketDispatch().sendMessage("You search the dead body and find two wolf bones."); + return true; + } else { + player.getPacketDispatch().sendMessage("You search the dead body but find nothing."); + return true; + } + } else { + player.getPacketDispatch().sendMessage("You search the dead body but find nothing."); + } + return true; + default: + return false; + } + ClimbActionHandler.climb(player, new Animation(828), loc); + return true; + } + + /** + * Represents the cutscene used during wolf whistle. + * @author 'Vexia + * @version 1.0 + */ + public static final class FluffyCutscene extends CutscenePlugin { + + /** + * Constructs a new {@code FluffyCutscene} {@code Object}. + */ + public FluffyCutscene() { + super("fluffy cutscene"); + } + + /** + * Constructs a new {@code FluffyCutscene} {@code Object}. + * @param player the player. + */ + public FluffyCutscene(final Player player) { + this(); + this.player = player; + } + + @Override + public ActivityPlugin newInstance(Player p) throws Throwable { + return new FluffyCutscene(p); + } + + @Override + public void open() { + player.getDialogueInterpreter().open(392932, this); + player.setAttribute("wolf-dial", player.getDialogueInterpreter().getDialogue()); + player.setAttribute("in-cutscene", this); + player.lock(); + } + + @Override + public void end() { + super.end(); + player.removeAttribute("in-cutscene"); + player.getFamiliarManager().dismiss(); + } + + @Override + public Location getSpawnLocation() { + return null; + } + + @Override + public Location getStartLocation() { + return base.transform(46, 50, 1); + } + + @Override + public void configure() { + region = DynamicRegion.create(11573); + setRegionBase(); + registerRegion(region.getId()); + } + + @Override + public void register() { + PluginManager.definePlugin(new FluffyDialogue()); + } + + /** + * Represents the dialogue used during the fluffy cutscene. + * @author 'Vexia + * @version 1.0 + */ + public static final class FluffyDialogue extends DialoguePlugin { + + /** + * Represents the scared animation. + */ + private static final Animation SCARED_ANIMATION = new Animation(2836); + + /** + * Represents the wolpertiner graphic. + */ + private static final Graphics GRAPHIC = new Graphics(1522); + + /** + * Represents the shudder animation. + */ + private static final Animation SHUDDER_ANIMATION = new Animation(8506); + + /** + * Represents the death animation. + */ + private static final Animation DEATH_ANIMATION = new Animation(8507); + + /** + * Represents the cutscene instance. + */ + private CutscenePlugin cutscene; + + /** + * Represents the quest instance. + */ + private Quest quest; + + /** + * Represents the fluffy npc. + */ + private NPC fluffy; + + /** + * Represents the wolf npc. + */ + private NPC wolf; + + /** + * Constructs a new {@code FluffyDialogue} {@code Object}. + */ + public FluffyDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code FluffyDialogue} {@code Object}. + * @param player the player. + */ + public FluffyDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new FluffyDialogue(player); + } + + @Override + public boolean open(Object... args) { + cutscene = (CutscenePlugin) args[0]; + quest = player.getQuestRepository().getQuest("Wolf Whistle"); + fluffy = NPC.create(6990, cutscene.getBase().transform(41, 52, 1)); + fluffy.init(); + fluffy.faceTemporary(player, 1); + Location b = cutscene.getBase().transform(42, 50, 0); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, b.getX(), b.getY(), 244, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, b.getX() + 1, b.getY(), 244, 1, 100)); + switch (quest.getStage(player)) { + case 10: + player("Come on then little, fluffy..."); + break; + case 50: + player("Mustn't look round, bunny will eat me.", "Mustn't look round, bunny will eat me.", "Mustn't look round, bunny will eat me."); + break; + } + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + player.sendMessage("ButtonId=" + buttonId + ", stage=" + stage); + switch (quest.getStage(player)) { + case 10: + switch (stage) { + case 0: + close(); + GameWorld.getPulser().submit(new Pulse(1, player, fluffy) { + int counter = 0; + + @Override + public boolean pulse() { + switch (++counter) { + case 2: + player.face(fluffy); + break; + case 5: + player("Gigantic..."); + stage = 1; + return true; + } + return false; + } + + }); + break; + case 1: + player("scary-looking..."); + stage = 2; + break; + case 2: + player("razor-fanged..."); + stage = 3; + break; + case 3: + player("bunny..."); + stage = 4; + break; + case 4: + close(); + int x = player.getLocation().getX() + 1; + int y = player.getLocation().getY() - 1; + int height = 300; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x, y, height, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + 1000, y + 13, height, 1, 100)); + player.faceLocation(cutscene.getBase().transform(44, 50, 1)); + GameWorld.getPulser().submit(new Pulse(1, player, fluffy) { + int counter = 0; + + @Override + public boolean pulse() { + switch (++counter) { + case 3: + fluffy.sendChat("Mrooowr?"); + break; + case 6: + player("What is that thing?"); + stage = 5; + return true; + } + return false; + } + + }); + break; + case 5: + player("Maybe, if I leave quitely, it won't notice me."); + stage = 6; + break; + case 6: + close(); + GameWorld.getPulser().submit(new Pulse(1, player, fluffy) { + int counter = 0; + + @Override + public boolean pulse() { + switch (++counter) { + case 2: + Pathfinder.find(fluffy, cutscene.getBase().transform(41, 51, 1)).walk(fluffy); + break; + case 4: + fluffy.face(player); + fluffy.graphics(GRAPHIC); + break; + case 5: + fluffy.sendChat("Raaaarw!"); + break; + case 8: + int x = player.getLocation().getX() - 4; + int y = player.getLocation().getY(); + int height = 270; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x, y, height, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + 1, y, height, 1, 100)); + interpreter.sendDialogue("A chilling, unnatural fear envelops you!"); + stage = 7; + return true; + } + return false; + } + + }); + break; + case 7: + player("It's coming to get me!"); + player.animate(SCARED_ANIMATION); + player.sendChat("It's coming to get me!"); + stage = 8; + break; + case 8: + end(); + GameWorld.getPulser().submit(new Pulse(2) { + @Override + public boolean pulse() { + player.animate(Animation.create(827)); + return true; + } + + }); + cutscene.stop(true); + quest.setStage(player, 20); + break; + } + break; + case 50:// second cutscene. + switch (stage) { + case 0: + fluffy.faceLocation(cutscene.getBase().transform(40, 53, 1)); + player("Okay, I have the spirit wolf pouch, so it can't hurt me..."); + stage = 1; + break; + case 1: + player("...I hope."); + stage = 2; + break; + case 2: + int x = player.getLocation().getX() + 1; + int y = player.getLocation().getY() - 1; + int height = 300; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x, y, height, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + 1000, y + 13, height, 1, 100)); + player.faceLocation(cutscene.getBase().transform(44, 50, 1)); + close(); + player("Oh, good. It's too busy gnawing to notice me."); + stage = 3; + break; + case 3: + fluffy.faceTemporary(player, 1); + fluffy.sendChat("Raaaarw!"); + player("I spoke too soon!"); + stage = 4; + break; + case 4: + player("I'll use the spirit wolf pouch. I hope this works."); + stage = 5; + break; + case 5: + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0 + 1000, 0 + 13, 0, 1, 100)); + PacketRepository.send(MinimapState.class, new MinimapStateContext(player, 0)); + player.unlock(); + player.getLocks().lockMovement(10000000); + player.getInterfaceManager().openTab(new Component(149)); + stage = -5; + break; + case -5: + player.setAttribute("in-cutscene", cutscene); + close(); + stage = 6; + break; + case 6: + Location l = cutscene.getBase().transform(46, 50, 0); + x = l.getX() + 1; + y = l.getY() - 2; + height = 440; + player.lock(); + player.getLocks().lockMovement(100000); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x, y, height, 1, 95)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + 1000, y + 17, height, 1, 95)); + wolf = player.getFamiliarManager().getFamiliar(); + GameWorld.getPulser().submit(new Pulse(1, player, fluffy) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 1: + wolf.sendChat("Grrrrrrrrrrrrrrrr..."); + break; + case 2: + fluffy.sendChat("Whiiiiiine!"); + break; + case 4: + player("Get that thing!"); + stage = 7; + return true; + } + return false; + } + }); + break; + case 7: + player.getLocks().lockMovement(1000000); + player.lock(); + close(); + fluffy.animate(SHUDDER_ANIMATION); + if (player.getInventory().remove(HOWL_SCROLL)) { + player.getDialogueInterpreter().setDialogue(this); + player.getDialogueInterpreter().getDialogue().setStage(8); + GameWorld.getPulser().submit(new Pulse(1, player, fluffy, wolf) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 2: + wolf.animate(Animation.create(8293)); + Projectile.magic(wolf, fluffy, 1333, 40, 36, 50, 5).send(); + player.getSkills().updateLevel(Skills.SUMMONING, -2, 0); + break; + case 5: + fluffy.animate(DEATH_ANIMATION); + break; + case 12: + fluffy.clear(); + wolf.face(player); + player.face(player); + player("Well, that certainly seems to have got rid of the giant", "wolpertinger."); + stage = 8; + player.getDialogueInterpreter().setDialogue(FluffyDialogue.this); + player.getDialogueInterpreter().getDialogue().setStage(8); + return true; + } + return false; + } + + }); + } + break; + case 8: + player("Come on, let's go tell Pikkupstix."); + stage = 9; + break; + case 9: + wolf.clear(); + player("They both vanished! I'm sure Pikkupstix will be able to", "explain this to me."); + stage = 10; + break; + case 10: + end(); + quest.setStage(player, 60); + cutscene.stop(true); + break; + } + break; + } + return true; + } + + @Override + public boolean close() { + return super.close(); + } + + @Override + public void end() { + super.end(); + if (player.getFamiliarManager().hasFamiliar()) { + player.getFamiliarManager().getFamiliar().dismiss(); + } + } + + @Override + public int[] getIds() { + return new int[] { 392932 }; + } + + } + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenBeast.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenBeast.java new file mode 100644 index 000000000..f4fc48d23 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenBeast.java @@ -0,0 +1,212 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.game.component.CloseEvent; +import core.game.component.Component; +import core.game.container.Container; +import core.game.container.access.InterfaceContainer; +import core.game.system.config.ItemConfigParser; +import core.game.node.entity.skill.summoning.SummoningPouch; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +/** + * Represents a beast of burden familiar. + * @author Emperor + */ +public abstract class BurdenBeast extends Familiar { + + /** + * The container. + */ + protected Container container; + + /** + * Constructs a new {@code BurdenBeast} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + * @param ticks The amount of ticks. + * @param pouchId The pouch id. + * @param specialCost The special move cost. + * @param containerSize The container size. + * @param attackStyle the style. + */ + public BurdenBeast(Player owner, int id, int ticks, int pouchId, int specialCost, int containerSize, int attackStyle) { + super(owner, id, ticks, pouchId, specialCost, attackStyle); + this.container = new Container(containerSize).register(new BurdenContainerListener(owner)); + } + + /** + * Constructs a new {@code BurdenBeast} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + * @param ticks The amount of ticks. + * @param pouchId The pouch id. + * @param specialCost The special move cost. + * @param containerSize The container size. + */ + public BurdenBeast(Player owner, int id, int ticks, int pouchId, int specialCost, int containerSize) { + this(owner, id, ticks, pouchId, specialCost, containerSize, WeaponInterface.STYLE_DEFENSIVE); + } + + @Override + public void dismiss() { + if (owner.getInterfaceManager().hasMainComponent(671)) { + owner.getInterfaceManager().close(); + } + if (!owner.getIronmanManager().isIronman()) { + for (Item item : container.toArray()) { + if (item != null) { + GroundItemManager.create(new GroundItem(item, location, 500, owner)); + } + } + } + container.clear(); + super.dismiss(); + } + + @Override + public boolean isBurdenBeast() { + return true; + } + + @Override + public boolean isPoisonImmune() { + return true; + } + + /** + * Checks if the item is allowed to be stored. + * @param owner The owner. + * @param item The item to store. + * @return {@code True} if so. + */ + public boolean isAllowed(Player owner, Item item) { + if (item.getValue() > 50000) { + owner.getPacketDispatch().sendMessage("This item is too valuable to trust to this familiar."); + return false; + } + if (!item.getDefinition().isTradeable()) { + owner.getPacketDispatch().sendMessage("You can't trade this item, not even to your familiar."); + return false; + } + if ((!SummoningPouch.get(getPouchId()).abyssal && (item.getId() == 1436 || item.getId() == 7936))|| !item.getDefinition().getConfiguration(ItemConfigParser.BANKABLE, true)) { + owner.getPacketDispatch().sendMessage("You can't store " + item.getName().toLowerCase() + " in this familiar."); + return false; + } + if(SummoningPouch.get(this.getPouchId()).abyssal){ + if(!item.getName().toLowerCase().contains("essence")) { + owner.getPacketDispatch().sendMessage("You can only give unnoted essence to this familiar."); + return false; + } + if(item.getId() == 1437 || item.getId() == 7937) { + owner.getPacketDispatch().sendMessage("You can't give noted essence to this familiar."); + return false; + } + } + return true; + } + + /** + * Transfers an item. + * @param item The item to store. + * @param amount The amount to store. + * @param withdraw If the player is withdrawing. + */ + public void transfer(Item item, int amount, boolean withdraw) { + if (this instanceof Forager && !withdraw) { + owner.getPacketDispatch().sendMessage("You can't store your items in this familiar."); + return; + } + if (item == null || owner == null) { + return; + } + if (!withdraw && !isAllowed(owner, new Item(item.getId(), item.getDefinition().isStackable() ? amount : 1))) { + return; + } + Container to = withdraw ? owner.getInventory() : container; + Container from = withdraw ? container : owner.getInventory(); + int fromAmount = from.getAmount(item); + if (amount > fromAmount) { + amount = fromAmount; + } + int maximum = to.getMaximumAdd(item); + if (amount > maximum) { + amount = maximum; + } + if (amount < 1) { + if (withdraw) { + owner.getPacketDispatch().sendMessage("Not enough space in your inventory."); + } else { + owner.getPacketDispatch().sendMessage("Your familiar can't carry any more items."); + } + return; + } + if (!item.getDefinition().isStackable() && item.getSlot() > -1) { + from.replace(null, item.getSlot()); + to.add(new Item(item.getId(), 1)); + amount--; + } + if (amount > 0) { + item = new Item(item.getId(), amount); + if (from.remove(item)) { + to.add(item); + } + } + } + + /** + * Withdraws the full container. + */ + public void withdrawAll() { + for (int i = 0; i < container.capacity(); i++) { + Item item = container.get(i); + if (item == null) { + continue; + } + int amount = owner.getInventory().getMaximumAdd(item); + if (item.getAmount() > amount) { + item = new Item(item.getId(), amount); + container.remove(item, false); + owner.getInventory().add(item, false); + } else { + container.replace(null, i, false); + owner.getInventory().add(item, false); + } + } + container.update(); + owner.getInventory().update(); + } + + /** + * Opens the beast of burden interface. + */ + public void openInterface() { + if (getContainer().itemCount() == 0 && this instanceof Forager) { + owner.getPacketDispatch().sendMessage("Your familiar is not carrying any items that you can withdraw."); + return; + } + owner.getInterfaceManager().open(new Component(671)).setCloseEvent(new CloseEvent() { + @Override + public boolean close(Player player, Component c) { + player.getInterfaceManager().closeSingleTab(); + return true; + } + }); + container.shift(); + owner.getInterfaceManager().openSingleTab(new Component(665)); + InterfaceContainer.generateItems(owner, owner.getInventory().toArray(), new String[] { "Examine", "Store-X", "Store-All", "Store-10", "Store-5", "Store-1" }, 665, 0, 7, 4, 93); + InterfaceContainer.generateItems(owner, container.toArray(), new String[] { "Examine", "Withdraw-X", "Withdraw-All", "Withdraw-10", "Withdraw-5", "Withdraw-1" }, 671, 27, 5, 6, 30); + container.refresh(); + } + + /** + * Gets the item container. + * @return The container. + */ + public Container getContainer() { + return container; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenContainerListener.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenContainerListener.java new file mode 100644 index 000000000..860030941 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenContainerListener.java @@ -0,0 +1,40 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.game.container.Container; +import core.game.container.ContainerEvent; +import core.game.container.ContainerListener; +import core.game.node.entity.player.Player; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContainerContext; +import core.net.packet.out.ContainerPacket; + +/** + * The beast of burden container listener. + * @author Emperor + */ +public final class BurdenContainerListener implements ContainerListener { + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@code BurdenContainerListener} {@code Object}. + * @param player The player. + */ + public BurdenContainerListener(Player player) { + this.player = player; + } + + @Override + public void update(Container c, ContainerEvent event) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 30, event.getItems(), false, event.getSlots())); + } + + @Override + public void refresh(Container c) { + PacketRepository.send(ContainerPacket.class, new ContainerContext(player, -1, -2, 30, c.toArray(), c.capacity(), false)); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenInterfacePlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenInterfacePlugin.java new file mode 100644 index 000000000..ade8f01dd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/BurdenInterfacePlugin.java @@ -0,0 +1,73 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.game.component.Component; +import core.game.component.ComponentDefinition; +import core.game.component.ComponentPlugin; +import core.game.container.Container; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the beast of burden interface. + * @author Emperor + */ +@Initializable +public final class BurdenInterfacePlugin extends ComponentPlugin { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ComponentDefinition.put(665, this); + ComponentDefinition.put(671, this); + return this; + } + + @Override + public boolean handle(Player player, Component component, int opcode, int button, int slot, int itemId) { + if (!player.getFamiliarManager().hasFamiliar() || !player.getFamiliarManager().getFamiliar().isBurdenBeast()) { + return false; + } + final BurdenBeast beast = (BurdenBeast) player.getFamiliarManager().getFamiliar(); + final boolean withdraw = component.getId() == 671; + final Container container = withdraw ? beast.getContainer() : player.getInventory(); + final Item item = slot >= 0 && slot < container.capacity() ? container.get(slot) : null; + if (item == null && button != 29) { + return true; + } + switch (opcode) { + case 155: + if (button == 29) { + beast.withdrawAll(); + return true; + } + beast.transfer(item, 1, withdraw); + return true; + case 196: + beast.transfer(item, 5, withdraw); + return true; + case 124: + beast.transfer(item, 10, withdraw); + return true; + case 199: + beast.transfer(item, container.getAmount(item), withdraw); + return true; + case 234: + player.setAttribute("runscript", new RunScript() { + @Override + public boolean handle() { + beast.transfer(item, (int) getValue(), withdraw); + return true; + } + }); + player.getDialogueInterpreter().sendInput(false, "Enter the amount:"); + break; + case 168: + player.getPacketDispatch().sendMessage(item.getDefinition().getExamine()); + return true; + } + return false; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/Familiar.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/Familiar.java new file mode 100644 index 000000000..159d946e1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/Familiar.java @@ -0,0 +1,737 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.cache.def.impl.NPCDefinition; +import core.game.node.entity.skill.SkillBonus; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.SummoningScroll; +import core.game.node.entity.skill.summoning.pet.Pet; +import core.game.interaction.MovementPulse; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.combat.CombatPulse; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Pathfinder; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.update.flag.context.Animation; +import core.game.world.update.flag.context.Graphics; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a familiar. + * @author Emperor + */ +public abstract class Familiar extends NPC implements Plugin { + + /** + * The summon graphics for a small familiar. + */ + protected static final Graphics SMALL_SUMMON_GRAPHIC = Graphics.create(1314); + + /** + * The spawn graphics for a large familiar. + */ + protected static final Graphics LARGE_SUMMON_GRAPHIC = Graphics.create(1315); + + /** + * The special animation. + */ + protected static final Animation SPECIAL_ANIMATION = Animation.create(7660); + + /** + * The special graphic. + */ + protected static final Graphics SPECIAL_GRAPHIC = Graphics.create(1316); + + /** + * The owner. + */ + protected Player owner; + + /** + * The amount of ticks left. + */ + protected int ticks; + + /** + * The initial amount of ticks. + */ + protected int maximumTicks; + + /** + * The amount of special points left. + */ + protected int specialPoints = 60; + + /** + * The pouch id. + */ + private final int pouchId; + + /** + * The special move cost. + */ + private final int specialCost; + + /** + * The combat reward. + */ + private CombatSwingHandler combatHandler; + + /** + * If the familiar is a combat familiar. + */ + protected boolean combatFamiliar; + + /** + * If the familiars special is charged. + */ + protected boolean charged; + + /** + * The invisible familiar boosts. + */ + protected List boosts = new ArrayList<>(); + + /** + * The attack style. + */ + private final int attackStyle; + + /** + * Constructs a new {@code Familiar} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + * @param ticks The ticks left. + * @param pouchId The pouch. + * @param specialCost The special move cost. + * @param attackStyle the style. + */ + public Familiar(Player owner, int id, int ticks, int pouchId, int specialCost, final int attackStyle) { + super(id, null); + this.owner = owner; + this.maximumTicks = ticks; + this.ticks = ticks; + this.pouchId = pouchId; + this.specialCost = specialCost; + this.combatFamiliar = NPCDefinition.forId(getOriginalId() + 1).getName().equals(getName()); + this.attackStyle = attackStyle; + } + + /** + * Constructs a new {@code Familiar} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + * @param ticks The ticks left. + * @param pouchId The pouch. + * @param specialCost The special move cost. + */ + public Familiar(Player owner, int id, int ticks, int pouchId, int specialCost) { + this(owner, id, ticks, pouchId, specialCost, WeaponInterface.STYLE_DEFENSIVE); + } + + /** + * Creates the familiar. + * @param loc The location. + */ + public void init(Location loc, boolean call) { + location = loc; + if (location == null) { + location = owner.getLocation(); + setInvisible(true); + } + super.init(); + startFollowing(); + sendConfiguration(); + if (call) { + call(); + } + owner.getInterfaceManager().openInfoBars(); + if (getZoneMonitor().isInZone("Wilderness")) { + transform(); + } + } + + @Override + public void init() { + init(getSpawnLocation(), true); + } + + @Override + public void handleTickActions() { + if (ticks-- % 50 == 0) { + updateSpecialPoints(-15); + owner.getSkills().updateLevel(Skills.SUMMONING, -1, 0); + if (!getText().isEmpty()) { + super.sendChat(getText()); + } + } + sendTimeRemaining(); + switch (ticks) { + case 100: + owner.getPacketDispatch().sendMessage("You have 1 minute before your familiar vanishes."); + break; + case 50: + owner.getPacketDispatch().sendMessage("You have 30 seconds before your familiar vanishes."); + break; + case 0: + if (isBurdenBeast() && !((BurdenBeast) this).getContainer().isEmpty()) { + owner.getPacketDispatch().sendMessage("Your familiar has dropped all the items it was holding."); + } else { + owner.getPacketDispatch().sendMessage("Your familiar has vanished."); + } + dismiss(); + return; + } + CombatPulse combat = owner.getProperties().getCombatPulse(); + if (!isInvisible() && !getProperties().getCombatPulse().isAttacking() && (combat.isAttacking() || owner.inCombat())) { + Entity victim = combat.getVictim(); + if (victim == null) { + victim = owner.getAttribute("combat-attacker"); + } + if (combat.getVictim() != this && victim != null && !victim.isInvisible() && getProperties().isMultiZone() && owner.getProperties().isMultiZone() && isCombatFamiliar() && !isBurdenBeast()) { + getProperties().getCombatPulse().attack(victim); + } + } + if ((!isInvisible() && owner.getLocation().getDistance(getLocation()) > 12) || (isInvisible() && ticks % 25 == 0)) { + if (!call()) { + setInvisible(true); + } + } else if (!getPulseManager().hasPulseRunning()) { + startFollowing(); + } + handleFamiliarTick(); + } + + @Override + public boolean isAttackable(Entity entity, CombatStyle style) { + if (entity == owner) { + owner.getPacketDispatch().sendMessage("You can't just betray your own familiar like that!"); + return false; + } + if (entity instanceof Player) { + if (!owner.isAttackable(entity, style)) { + return false; + } + } + if (!getProperties().isMultiZone()) { + if (entity instanceof Player && !((Player) entity).getProperties().isMultiZone()) { + ((Player) entity).getPacketDispatch().sendMessage("You have to be in multicombat to attack a player's familiar."); + return false; + } + if (entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage("This familiar is not in the a multicombat zone."); + } + return false; + } + if (entity instanceof Player) { + if (!((Player) entity).getSkullManager().isWilderness()) { + ((Player) entity).getPacketDispatch().sendMessage("You have to be in the wilderness to attack a player's familiar."); + return false; + } + if (!owner.getSkullManager().isWilderness()) { + ((Player) entity).getPacketDispatch().sendMessage("This familiar's owner is not in the wilderness."); + return false; + } + } + return super.isAttackable(entity, style); + } + + @Override + public void onRegionInactivity() { + call(); + } + + @Override + public CombatSwingHandler getSwingHandler(boolean swing) { + if (combatHandler != null) { + return combatHandler; + } + return super.getSwingHandler(swing); + } + + /** + * Constructs a new {@code Familiar} {@code Object}. + * @param owner The owner. + * @param id The NPC id. + * @return The familiar. + */ + public abstract Familiar construct(Player owner, int id); + + /** + * Executes the special move. + * @param special The familiar special object. + * @return {@code True} if the move was executed. + */ + protected abstract boolean specialMove(FamiliarSpecial special); + + /** + * Handles the familiar special tick. + */ + protected void handleFamiliarTick() { + } + + /** + * Configures use with events, and other plugin related content.. + */ + protected void configureFamiliar() { + + } + + /** + * Gets the forced chat text for this familiar. + * @return The forced chat text. + */ + protected String getText() { + return ""; + } + + /** + * Transforms the familiar into the Wilderness combat form. + */ + public void transform() { + if (isCombatFamiliar()) { + transform(getOriginalId() + 1); + } + } + + /** + * Sends the time remaining. + */ + private void sendTimeRemaining() { + int minutes = (int) Math.ceil(ticks * 0.01); + int hash = minutes << 7 | ((ticks - (minutes * 100)) > 49 ? 1 : 0) << 6; + owner.getConfigManager().set(1176, hash); + } + + /** + * Checks if the familiar can execute its special move and does so if able. + * @param special The familiar special object. + */ + public void executeSpecialMove(FamiliarSpecial special) { + if (special.getNode() == this) { + return; + } + if (specialCost > specialPoints) { + owner.getPacketDispatch().sendMessage("Your familiar does not have enough special move points left."); + return; + } + SummoningScroll scroll = SummoningScroll.forPouch(pouchId); + if (scroll == null) { + owner.getPacketDispatch().sendMessage("Invalid scroll for pouch " + pouchId + " - report!"); + return; + } + if (!owner.getInventory().contains(scroll.getItemId(), 1)) { + owner.getPacketDispatch().sendMessage("You do not have enough scrolls left to do this special move."); + return; + } + if (owner.getLocation().getDistance(getLocation()) > 15) { + owner.getPacketDispatch().sendMessage("Your familiar is too far away to use that scroll, or it cannot see you."); + return; + } + if (specialMove(special)) { + setAttribute("special-delay", GameWorld.getTicks() + 3); + owner.getInventory().remove(new Item(scroll.getItemId())); + visualizeSpecialMove(); + updateSpecialPoints(specialCost); + owner.getSkills().addExperience(Skills.SUMMONING, scroll.getExperience(), true); + } + } + + /** + * Sends the special move visualization for the owner. + */ + public void visualizeSpecialMove() { + owner.visualize(Animation.create(7660), Graphics.create(1316)); + } + + /** + * Sends a familiar hit. + * @param target the target. + * @param maxHit the max hit. + * @param graphics the graphics. + */ + public void sendFamiliarHit(final Entity target, final int maxHit, final Graphics graphics) { + final int ticks = 2 + (int) Math.floor(getLocation().getDistance(target.getLocation()) * 0.5); + getProperties().getCombatPulse().setNextAttack(4); + GameWorld.getPulser().submit(new Pulse(ticks, this, target) { + @Override + public boolean pulse() { + BattleState state = new BattleState(Familiar.this, target); + int hit = 0; + if (getCombatStyle().getSwingHandler().isAccurateImpact(Familiar.this, target)) { + hit = RandomFunction.randomize(maxHit); + } + state.setEstimatedHit(hit); + target.getImpactHandler().handleImpact(owner, hit, CombatStyle.MELEE, state); + if (graphics != null) { + target.graphics(graphics); + } + return true; + } + }); + } + + /** + * Sends a projectile to the target. + * @param target the target. + * @param projectileId the projectile id. + */ + public void projectile(final Entity target, final int projectileId) { + Projectile.magic(this, target, projectileId, 40, 36, 51, 10).send(); + } + + /** + * Sends a familiar hit. + * @param maxHit the max hit. + */ + public void sendFamiliarHit(final Entity target, final int maxHit) { + sendFamiliarHit(target, maxHit, null); + } + + /** + * Checks if this familiar can attack the target (used mainly for special + * moves). + */ + public boolean canAttack(Entity target, boolean message) { + if (!target.isAttackable(owner, owner.getProperties().getCombatPulse().getStyle())) { + return false; + } + if (target.getLocation().getDistance(getLocation()) > 8) { + if (message) { + owner.getPacketDispatch().sendMessage("That target is too far."); + } + return false; + } + if (target.getLocks().isInteractionLocked() || !target.isAttackable(this, CombatStyle.MAGIC)) { + return false; + } + return isCombatFamiliar(); + } + + @Override + public boolean canAttack(Entity target) { + return canAttack(target, true); + } + + /** + * Checks if a familiar can perform a combat special attack. + * @param target the target. + * @param message show message. + * @return {@code True} if so. + */ + public boolean canCombatSpecial(Entity target, boolean message) { + if (!canAttack(target, message)) { + return false; + } + if (!isOwnerAttackable()) { + return false; + } + if (getAttribute("special-delay", 0) > GameWorld.getTicks()) { + return false; + } + return true; + } + + /** + * Checks if a faimiliar can perform a combat special attack. + * @param target the target. + * @return {@code True} if so. + */ + public boolean canCombatSpecial(Entity target) { + return canCombatSpecial(target, true); + } + + /** + * Checks if the owner is attackable. + * @return {@code True} if so. + */ + public boolean isOwnerAttackable() { + if (!owner.getProperties().getCombatPulse().isAttacking() && !owner.inCombat() && !getProperties().getCombatPulse().isAttacking()) { + owner.getPacketDispatch().sendMessage("Your familiar cannot fight whilst you are not in combat."); + return false; + } + return true; + } + + /** + * Gets the combat style. + * @return the style. + */ + public CombatStyle getCombatStyle() { + return CombatStyle.MAGIC; + } + + /** + * Adjusts a players battle state. + * @param state the state. + */ + public void adjustPlayerBattle(final BattleState state) { + + } + + /** + * Starts following the owner. + */ + public void startFollowing() { + getPulseManager().run(new MovementPulse(this, owner, Pathfinder.DUMB) { + @Override + public boolean pulse() { + return false; + } + }, "movement"); + face(owner); + } + + @Override + public void finalizeDeath(Entity killer) { + dismiss(); + } + + /** + * Checks if the familiar is a combat familiar. + * @return {@code True} if so. + */ + public boolean isCombatFamiliar() { + return combatFamiliar; + } + + /** + * Sends the familiar packets. + */ + public void sendConfiguration() { + owner.getConfigManager().set(448, getPouchId()); + owner.getConfigManager().set(1174, getOriginalId()); + owner.getConfigManager().set(1175, specialCost << 23); + sendTimeRemaining(); + updateSpecialPoints(0); + } + + /** + * Calls the familiar. + */ + //int spamTimer = 0; + public boolean call() { + Location destination = getSpawnLocation(); + if (destination == null) { + //owner.getPacketDispatch().sendMessage("Your familiar is too big to fit here. Try calling it again when you are standing"); + //owner.getPacketDispatch().sendMessage("somewhere with more space."); + //spamTimer = 50; + return false; + } + setInvisible(getZoneMonitor().isRestricted(ZoneRestriction.FOLLOWERS) && !owner.getLocks().isLocked("enable_summoning")); + getProperties().setTeleportLocation(destination); + if (!(this instanceof Pet)) { + if (size() > 1) { + graphics(LARGE_SUMMON_GRAPHIC); + } else { + graphics(SMALL_SUMMON_GRAPHIC); + } + } + if (getProperties().getCombatPulse().isAttacking()) { + startFollowing(); + } else { + face(owner); + } + if (!isRenderable() && owner.isActive()) { + // SystemLogger.logErr("Familiar in inactive region!"); + getWalkingQueue().update(); + getUpdateMasks().prepare(this); + } + return true; + } + + /** + * Gets the spawning location of the familiar. + * @return The spawn location. + */ + public Location getSpawnLocation() { + return RegionManager.getSpawnLocation(owner, this); + } + + /** + * Dismisses the familiar. + */ + public void dismiss() { + clear(); + getPulseManager().clear(); + owner.getInterfaceManager().hideTabs(7); + owner.getFamiliarManager().setFamiliar(null); + owner.getConfigManager().set(448, -1); + owner.getConfigManager().set(1176, 0); + owner.getConfigManager().set(1175, 182986); + owner.getConfigManager().set(1174, -1); + if (owner.getSkullManager().isWilderness()) { + owner.getAppearance().sync(); + } + owner.getInterfaceManager().setViewedTab(3); + } + + /** + * Updates the special move points. + * @param diff The difference to decrease with. + */ + public void updateSpecialPoints(int diff) { + specialPoints -= diff; + if (specialPoints > 60) { + specialPoints = 60; + } + owner.getConfigManager().set(1177, specialPoints); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int id : getIds()) { + if (FamiliarManager.getFamiliars().containsKey(id)) { + SystemLogger.logErr("Familiar " + id + " was already registered!"); + return null; + } + FamiliarManager.getFamiliars().put(id, this); + configureFamiliar(); + } + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + /** + * Gets the charged. + * @return The charged. + */ + public boolean isCharged() { + if (charged) { + owner.getPacketDispatch().sendMessage("Your familiar is already charging its attack!"); + return true; + } + return false; + } + + /** + * Gets a familiar boost. + * @param skill the skill. + * @return the boost. + */ + public int getBoost(int skill) { + SkillBonus bonus = null; + for (SkillBonus b : boosts) { + if (b.getSkillId() == skill) { + bonus = b; + break; + } + } + if (bonus == null) { + return 0; + } + return (int) bonus.getBonus(); + } + + /** + * Charges a familiar. + */ + public void charge() { + setCharged(true); + } + + /** + * Sets the charged. + * @param charged The charged to set. + */ + public void setCharged(boolean charged) { + this.charged = charged; + } + + /** + * Checks if the familiar is a beast of burden. + * @return {@code True} if so. + */ + public boolean isBurdenBeast() { + return false; + } + + /** + * Gets the NPC ids. + * @return The npc ids. + */ + public abstract int[] getIds(); + + /** + * Gets the pouch id. + * @return The pouch id. + */ + public int getPouchId() { + return pouchId; + } + + /** + * Gets the owner. + * @return The owner. + */ + public Player getOwner() { + return owner; + } + + /** + * Sets the owner. + * @param owner The owner to set. + */ + public void setOwner(Player owner) { + this.owner = owner; + } + + /** + * Gets the combatHandler. + * @return The combatHandler. + */ + public CombatSwingHandler getCombatHandler() { + return combatHandler; + } + + /** + * Sets the combatHandler. + * @param combatHandler The combatHandler to set. + */ + public void setCombatHandler(CombatSwingHandler combatHandler) { + this.combatHandler = combatHandler; + } + + /** + * Gets the view animation for remote viewing. + * @return the animation. + */ + public Animation getViewAnimation() { + return null; + } + + /** + * Gets the exp style. + * @return the style. + */ + public int getAttackStyle() { + return attackStyle; + } + + public int getTicks() { + return ticks; + } + + public int getSpecialPoints() { + return specialPoints; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarFeedPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarFeedPlugin.java new file mode 100644 index 000000000..5277bcb3b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarFeedPlugin.java @@ -0,0 +1,43 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.game.node.entity.skill.summoning.pet.Pet; +import core.game.interaction.NodeUsageEvent; +import core.game.interaction.UseWithHandler; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the class used to handle the feeding of pets. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FamiliarFeedPlugin extends UseWithHandler { + + /** + * Constructs a new {@code FamiliarFeedPlugin} {@code Object}. + */ + public FamiliarFeedPlugin() { + super(321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526, 1059, 225, 221, 526, 592, 12125, 12127, 12125, 12127, 12125, 12127, 12125, 12127, 12125, 12127, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 313, 12129, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 313, 12129, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 313, 12129, 2970, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927, 1977, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 313, 12129, 313, 12129, 313, 12129, 313, 12129, 313, 12129, 313, 12129, 12130, 12130, 12130, 12130, 12130, 313, 12129, 313, 12129, 313, 12129, 13379, 592, 592, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 221, 313, 12129, 313, 12129, 313, 12129, 313, 12129, 313, 12129, 313, 12129, 12125, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 1963, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + int[] ids = new int[] { 761, 762, 763, 764, 765, 766, 3505, 3598, 6969, 7259, 7260, 6964, 7249, 7251, 6960, 7241, 7243, 6962, 7245, 7247, 6966, 7253, 7255, 6958, 7237, 7239, 6915, 7277, 7278, 7279, 7280, 7018, 7019, 7020, 6908, 7313, 7316, 6947, 7293, 7295, 7297, 7299, 6911, 7261, 7263, 7265, 7267, 7269, 6919, 7301, 7303, 7305, 7307, 6949, 6952, 6955, 6913, 7271, 7273, 6945, 7319, 7321, 7323, 7325, 7327, 6922, 6942, 7210, 7212, 7214, 7216, 7218, 7220, 7222, 7224, 7226, 6900, 6902, 6904, 6906, 768, 769, 770, 771, 772, 773, 3504, 8214, 6968, 7257, 7258, 6965, 7250, 7252, 6961, 7242, 7244, 6963, 7246, 7248, 6967, 7254, 7256, 6859, 7238, 7240, 6916, 7281, 7282, 7283, 7284, 7015, 7016, 7017, 6909, 7314, 7317, 11413, 6948, 7294, 7296, 7298, 7300, 6912, 7262, 7264, 7266, 7268, 7270, 6920, 7302, 7304, 7306, 7308, 6950, 6953, 6956, 6914, 7272, 7274, 13090, 6946, 7320, 7322, 7324, 7326, 7328, 6923, 6943, 7211, 7213, 7215, 7217, 7219, 7221, 7223, 7225, 7227, 6901, 6903, 6905, 6907, 774, 775, 776, 777, 778, 779, 3503, 8216, 6951, 6954, 6957 }; + for (int i : ids) { + addHandler(i, NPC_TYPE, this); + } + return this; + } + + @Override + public boolean handle(NodeUsageEvent event) { + final Familiar f = (Familiar) event.getUsedWith(); + if (!(f instanceof Pet)) { + return false; + } + event.getPlayer().getFamiliarManager().eat(event.getUsedItem().getId(), (Pet) f); + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarItemOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarItemOptionPlugin.java new file mode 100644 index 000000000..f5f45dd27 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarItemOptionPlugin.java @@ -0,0 +1,64 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.skill.summoning.pet.Pets; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the familiar items option plugin. + * @author 'Vexia + * @version 1.0 + */ +@Initializable +public final class FamiliarItemOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (Pets p : Pets.values()) { + ItemDefinition def = ItemDefinition.forId(p.getBabyItemId()); + if (def == null) { + continue; + } + def.getHandlers().put("option:drop", this); + def.getHandlers().put("option:release", this); + if (p.getGrownItemId() > -1) { + ItemDefinition.forId(p.getGrownItemId()).getHandlers().put("option:drop", this); + ItemDefinition.forId(p.getGrownItemId()).getHandlers().put("option:release", this); + } + if (p.getOvergrownItemId() > -1) { + ItemDefinition.forId(p.getOvergrownItemId()).getHandlers().put("option:drop", this); + ItemDefinition.forId(p.getOvergrownItemId()).getHandlers().put("option:release", this); + } + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "drop": + player.getFamiliarManager().summon(((Item) node), true); + return true; + case "release": + if (((Item) node).getId() == 7771) { + player.getFamiliarManager().summon(((Item) node), true); + return true; + } + if (player.getInventory().remove(((Item) node))) { + player.getDialogueInterpreter().sendDialogues(player, null, "Run along; I'm setting you free."); + } + return true; + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarManager.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarManager.java new file mode 100644 index 000000000..29096624f --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarManager.java @@ -0,0 +1,589 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.cache.def.impl.ItemDefinition; +import core.game.component.Component; +import core.game.container.Container; +import core.game.system.SystemLogger; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.skill.summoning.SummoningPouch; +import core.game.node.entity.skill.summoning.pet.Pet; +import core.game.node.entity.skill.summoning.pet.PetDetails; +import core.game.node.entity.skill.summoning.pet.Pets; +import core.game.node.entity.combat.BattleState; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneRestriction; +import core.game.world.update.flag.context.Animation; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Handles a player's familiar. + * @author Emperor + */ +public final class FamiliarManager implements SavingModule { + + /** + * The familiars mapping. + */ + private static final Map FAMILIARS = new HashMap<>(); + + /** + * The pet details mapping, sorted by item id. + */ + private final Map petDetails = new HashMap(); + + /** + * The player. + */ + private final Player player; + + /** + * The familiar. + */ + private Familiar familiar; + + /** + * The combat level difference when using summoning. + */ + private int summoningCombatLevel; + + /** + * If the player has a summoning pouch. + */ + private boolean hasPouch; + + /** + * The list of insured pets. + */ + private List insuredPets = new ArrayList<>(); + + /** + * Constructs a new {@code FamiliarManager} {@code Object}. + * @param player The player. + */ + public FamiliarManager(Player player) { + this.player = player; + } + + @Override + public void save(ByteBuffer buffer) { + for (Entry entry : petDetails.entrySet()) { + buffer.put((byte) 3); + buffer.putInt(entry.getKey()); + entry.getValue().save(buffer); + } + if (hasPet()) { + buffer.put((byte) 4); + buffer.putInt(((Pet) familiar).getPet().getBabyItemId()); + } else if (hasFamiliar()) { + buffer.put((byte) 1); + buffer.putShort((short) familiar.getOriginalId()); + buffer.putShort((short) familiar.ticks); + buffer.put((byte) familiar.specialPoints); + if (familiar.isBurdenBeast() && !((BurdenBeast) familiar).getContainer().isEmpty()) { + ((BurdenBeast) familiar).getContainer().save(buffer.put((byte) 2)); + } + buffer.put((byte) 5).putInt(familiar.getSkills().getLifepoints()); + } + if (insuredPets.size() > 0) { + buffer.put((byte) 6); + buffer.put((byte) insuredPets.size()); + for (Pets pet : insuredPets) { + buffer.putInt(pet.getBabyItemId()); + } + } + buffer.put((byte) 0); + } + + public final void parse(JSONObject familiarData){ + JSONArray petDetails = (JSONArray) familiarData.get("petDetails"); + for(int i = 0 ; i < petDetails.size(); i++){ + JSONObject detail = (JSONObject) petDetails.get(i); + PetDetails details = new PetDetails(0); + details.updateHunger(Double.parseDouble(detail.get("hunger").toString())); + details.updateGrowth(Double.parseDouble(detail.get("growth").toString())); + details.setStage(Integer.parseInt(detail.get("stage").toString())); + this.petDetails.put(Integer.parseInt(detail.get("petId").toString()),details); + } + + if(familiarData.containsKey("currentPet")){ + int currentPet = Integer.parseInt( familiarData.get("currentPet").toString()); + PetDetails details = this.petDetails.get(currentPet); + Pets pets = Pets.forId(currentPet); + if (details == null) { + details = new PetDetails(pets.getGrowthRate() == 0.0 ? 100.0 : 0.0); + this.petDetails.put(currentPet, details); + } + familiar = new Pet(player, details, currentPet, pets.getNpcId(details.getStage())); + } else if(familiarData.containsKey("familiar")){ + JSONObject currentFamiliar = (JSONObject) familiarData.get("familiar"); + int familiarId = Integer.parseInt( currentFamiliar.get("originalId").toString()); + familiar = FAMILIARS.get(familiarId).construct(player,familiarId); + familiar.ticks = Integer.parseInt( currentFamiliar.get("ticks").toString()); + familiar.specialPoints = Integer.parseInt( currentFamiliar.get("specialPoints").toString()); + JSONArray famInv = (JSONArray) currentFamiliar.get("inventory"); + if(famInv != null){ + ((BurdenBeast) familiar).container.parse(famInv); + } + familiar.setAttribute("hp",Integer.parseInt( currentFamiliar.get("lifepoints").toString())); + } + } + + @Override + public final void parse(ByteBuffer buffer) { + int opcode; + PetDetails details; + while ((opcode = buffer.get() & 0xFF) != 0) { + switch (opcode) { + case 1: + int npcId = buffer.getShort() & 0xFFFF; + familiar = FAMILIARS.get(npcId).construct(player, npcId); + familiar.ticks = buffer.getShort() & 0xFFFF; + familiar.specialPoints = buffer.get() & 0xFF; + break; + case 2: + if (familiar == null || !familiar.isBurdenBeast()) { + SystemLogger.logErr("Error parsing BoB container!"); + new Container(30).parse(buffer); + continue; + } + ((BurdenBeast) familiar).getContainer().parse(buffer); + break; + case 3: + int baseItem = buffer.getInt(); + details = new PetDetails(0); + details.parse(buffer); + petDetails.put(baseItem, details); + break; + case 4: + int itemId = buffer.getInt(); + details = petDetails.get(itemId); + Pets pets = Pets.forId(itemId); + if (details == null) { + details = new PetDetails(pets.getGrowthRate() == 0.0 ? 100.0 : 0.0); + petDetails.put(itemId, details); + } + familiar = new Pet(player, details, itemId, pets.getNpcId(details.getStage())); + break; + case 5: + int hp = buffer.getInt(); + if (familiar != null) { + familiar.setAttribute("hp", hp); + } + break; + case 6: + int size = buffer.get(); + Pets pet; + for (int i = 0; i < size; i++) { + pet = Pets.forId(buffer.getInt()); + if (pet != null) { + insuredPets.add(pet); + } + } + break; + } + } + } + + /** + * Called when the player logs in. + */ + public void login() { + if (hasFamiliar()) { + familiar.init(); + } + player.getFamiliarManager().setConfig(243269632); + } + + /** + * Summons a familiar. + * @param item The item. + * @param pet If the familiar is a pet. + * @param deleteItem we should delete the item. + */ + public void summon(Item item, boolean pet, boolean deleteItem) { + if (hasFamiliar()) { + player.getPacketDispatch().sendMessage("You already have a follower."); + return; + } + if (player.getZoneMonitor().isRestricted(ZoneRestriction.FOLLOWERS) && !player.getLocks().isLocked("enable_summoning")) { + player.getPacketDispatch().sendMessage("This is a Summoning-free area."); + return; + } + if (pet) { + summonPet(item, deleteItem); + return; + } + final SummoningPouch pouch = SummoningPouch.get(item.getId()); + if (pouch == null) { + return; + } + if (player.getSkills().getStaticLevel(Skills.SUMMONING) < pouch.getLevelRequired()) { + player.getPacketDispatch().sendMessage("You need a Summoning level of " + pouch.getLevelRequired() + " to summon this familiar."); + return; + } + if (player.getSkills().getLevel(Skills.SUMMONING) < pouch.getSummonCost()) { + player.getPacketDispatch().sendMessage("You need at least " + pouch.getSummonCost() + " Summoning points to summon this familiar."); + return; + } + final int npcId = pouch.getNpcId(); + Familiar fam = FAMILIARS.get(npcId); + if (fam == null) { + player.getPacketDispatch().sendMessage("Invalid familiar " + npcId + " - report on 2009scape github"); + return; + } + fam = fam.construct(player, npcId); + if (fam.getSpawnLocation() == null) { + player.getPacketDispatch().sendMessage("The spirit in this pouch is too big to summon here. You will need to move to a larger"); + player.getPacketDispatch().sendMessage("area."); + return; + } + if (!player.getInventory().remove(item)) { + return; + } + player.getSkills().updateLevel(Skills.SUMMONING, -pouch.getSummonCost(), 0); + player.getSkills().addExperience(Skills.SUMMONING, pouch.getSummonExperience()); + familiar = fam; + spawnFamiliar(); + if (player.getSkullManager().isWilderness()) { + player.getAppearance().sync(); + } + } + + /** + * Summons a familiar. + * @param item the item. + * @param pet the pet. + */ + public void summon(final Item item, boolean pet) { + summon(item, pet, true); + } + + /** + * Morphs a pet. + * @param item the item. + * @param deleteItem the item. + * @param location the location. + */ + public void morphPet(final Item item, boolean deleteItem, Location location) { + if (hasFamiliar()) { + familiar.dismiss(); + } + summonPet(item, deleteItem, true, location); + } + + /** + * Summons a pet. + * @param item the item. + * @param deleteItem the item. + */ + private boolean summonPet(final Item item, boolean deleteItem) { + return summonPet(item, deleteItem, false, null); + } + + /** + * Summons a pet. + * @param item the item. + * @param morph the pet. + */ + private boolean summonPet(final Item item, boolean deleteItem, boolean morph, Location location) { + final int itemId = item.getId(); + if (itemId > 8850 && itemId < 8900) { + return false; + } + Pets pets = Pets.forId(itemId); + if (pets == null) { + return false; + } + if (player.getSkills().getStaticLevel(Skills.SUMMONING) < pets.getSummoningLevel()) { + player.getDialogueInterpreter().sendDialogue("You need a summoning level of " + pets.getSummoningLevel() + " to summon this."); + return false; + } + int baseItemId = pets.getBabyItemId(); + PetDetails details = petDetails.get(baseItemId); + if (details == null) { + details = new PetDetails(pets.getGrowthRate() == 0.0 ? 100.0 : 0.0); + petDetails.put(baseItemId, details); + } + int id = pets.getItemId(details.getStage()); + if (itemId != id) { + player.getPacketDispatch().sendMessage("This is not the right pet, grow the pet correctly."); + return true; + } + int npcId = pets.getNpcId(details.getStage()); + if (npcId > 0) { + familiar = new Pet(player, details, itemId, npcId); + if (deleteItem) { + player.animate(new Animation(827)); + player.getInventory().remove(item); + } + if (morph) { + morphFamiliar(location); + } else { + spawnFamiliar(); + } + return true; + } + return true; + } + + /** + * Morphs the current familiar. + * @param location the location. + */ + public void morphFamiliar(Location location) { + familiar.init(location, false); + player.getInterfaceManager().openTab(new Component(662)); + player.getInterfaceManager().setViewedTab(7); + } + + /** + * Spawns the current familiar. + */ + public void spawnFamiliar() { + familiar.init(); + player.getInterfaceManager().openTab(new Component(662)); + player.getInterfaceManager().setViewedTab(7); + } + + /** + * Dumps the bob. + */ + public void dumpBob() { + if (!hasFamiliar()) { + player.getPacketDispatch().sendMessage("You don't have a familiar."); + return; + } + Familiar familiar = getFamiliar(); + if (!familiar.isBurdenBeast()) { + player.getPacketDispatch().sendMessage("Your familiar is not a beast of burden."); + return; + } + BurdenBeast beast = ((BurdenBeast) familiar); + if (!player.getBank().hasSpaceFor(beast.getContainer())) { + player.getPacketDispatch().sendMessage("There is not enough space left in your bank."); + return; + } + player.getBank().addAll(beast.getContainer()); + beast.getContainer().clear(); + } + + /** + * Makes the pet eat. + * @param foodId The food item id. + * @param npc The pet NPC. + */ + public void eat(int foodId, Pet npc) { + if (npc != familiar) { + player.getPacketDispatch().sendMessage("This isn't your pet!"); + return; + } + Pet pet = (Pet) familiar; + Pets pets = Pets.forId(pet.getItemId()); + if (pets == null) { + return; + } + for (int food : pets.getFood()) { + if (food == foodId) { + player.getInventory().remove(new Item(foodId)); + player.getPacketDispatch().sendMessage("Your pet happily eats the " + ItemDefinition.forId(food).getName() + "."); + player.animate(new Animation(827)); + npc.getDetails().updateHunger(-15.0); + return; + } + } + player.getPacketDispatch().sendMessage("Nothing interesting happens."); + } + + /** + * Picks up a pet. + */ + public void pickup() { + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough room in your inventory."); + return; + } + Pet pet = ((Pet) familiar); + PetDetails details = pet.getDetails(); + if (player.getInventory().add(new Item(pet.getPet().getItemId(details.getStage())))) { + player.animate(Animation.create(827)); + player.getFamiliarManager().dismiss(); + } + } + + /** + * Adjusts the battle state. + * @param state the state. + */ + public void adjustBattleState(final BattleState state) { + if (!hasFamiliar()) { + return; + } + familiar.adjustPlayerBattle(state); + } + + /** + * Gets a boost from a familiar. + * @param skill the skill. + * @return the boosted level. + */ + public int getBoost(int skill) { + if (!hasFamiliar()) { + return 0; + } + return familiar.getBoost(skill); + } + + /** + * Checks if the player has an active familiar. + * @return {@code True} if so. + */ + public boolean hasFamiliar() { + return familiar != null; + } + + /** + * Checks if the player has an active familiar and is a pet. + * @return {@code True} if so. + */ + public boolean hasPet() { + return hasFamiliar() && familiar instanceof Pet; + } + + /** + * Dismisses the familiar. + * @param saveDetails the details of a pet. + */ + public void dismiss(boolean saveDetails) { + if (hasPet() && !saveDetails) { + removeDetails(((Pet) familiar).getItemId()); + } + if (hasFamiliar()) { + familiar.dismiss(); + } + } + + /** + * Dismisses the familiar. + */ + public void dismiss() { + dismiss(true); + } + + /** + * Removes the details for this pet. + * @param itemId The item id of the pet. + */ + public void removeDetails(int itemId) { + Pets pets = Pets.forId(itemId); + if (pets == null) { + return; + } + petDetails.remove(pets.getBabyItemId()); + } + + /** + * Checks if it's the owner of a familiar. + * @param familiar the familiar + * @return {@code True} if so. + */ + public boolean isOwner(Familiar familiar) { + if (!hasFamiliar()) { + return false; + } + if (this.familiar != familiar) { + player.getPacketDispatch().sendMessage("This is not your familiar."); + return false; + } + return true; + } + + /** + * Sets a config value. + * @param value the value. + */ + public void setConfig(int value) { + int current = player.getConfigManager().get(1160); + int newVal = current + value; + player.getConfigManager().set(1160, newVal); + } + + /** + * Gets the familiar. + * @return The familiar. + */ + public Familiar getFamiliar() { + return familiar; + } + + /** + * Sets the familiar. + * @param familiar The familiar to set. + */ + public void setFamiliar(Familiar familiar) { + this.familiar = familiar; + } + + /** + * Gets the familiars. + * @return The familiars. + */ + public static Map getFamiliars() { + return FAMILIARS; + } + + /** + * Gets the usingSummoning. + * @return The usingSummoning. + */ + public boolean isUsingSummoning() { + return hasPouch || hasFamiliar(); + } + + /** + * Gets the hasPouch. + * @return The hasPouch. + */ + public boolean isHasPouch() { + return hasPouch; + } + + /** + * Sets the hasPouch. + * @param hasPouch The hasPouch to set. + */ + public void setHasPouch(boolean hasPouch) { + this.hasPouch = hasPouch; + } + + /** + * Gets the summoningCombatLevel. + * @return The summoningCombatLevel. + */ + public int getSummoningCombatLevel() { + return summoningCombatLevel; + } + + /** + * Sets the summoningCombatLevel. + * @param summoningCombatLevel The summoningCombatLevel to set. + */ + public void setSummoningCombatLevel(int summoningCombatLevel) { + this.summoningCombatLevel = summoningCombatLevel; + } + + + public Map getPetDetails() { + return petDetails; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarNPCOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarNPCOptionPlugin.java new file mode 100644 index 000000000..558fe0d5d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarNPCOptionPlugin.java @@ -0,0 +1,63 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.cache.def.impl.NPCDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.world.update.flag.player.FaceLocationFlag; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the class used for handling the npc options of familiars. + * @author Emperor + * @author 'Vexia + * @version 2.0 + */ +@Initializable +public final class FamiliarNPCOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("pick-up", this); + NPCDefinition.setOptionHandler("interact-with", this); + NPCDefinition.setOptionHandler("interact", this); + NPCDefinition.setOptionHandler("store", this); + NPCDefinition.setOptionHandler("withdraw", this); + return this; + } + + @Override + public boolean handle(final Player player, Node node, String option) { + if (!(node instanceof Familiar)) { + return false; + } + Familiar familiar = (Familiar) node; + if (familiar.getOwner() != player) { + player.getPacketDispatch().sendMessage("This is not your familiar."); + return true; + } + switch (option) { + case "pick-up": + player.faceLocation(FaceLocationFlag.getFaceLocation(player, familiar)); + player.getFamiliarManager().pickup(); + break; + case "interact-with": + player.getDialogueInterpreter().open(343823); + break; + case "interact": + player.getDialogueInterpreter().open(node.getId(), node); + break; + case "store": + case "withdraw": + if (!familiar.isBurdenBeast()) { + player.getPacketDispatch().sendMessage("This is not a beast of burden."); + break; + } + ((BurdenBeast) familiar).openInterface(); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarSpecial.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarSpecial.java new file mode 100644 index 000000000..03cff5599 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/FamiliarSpecial.java @@ -0,0 +1,127 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.item.Item; + +/** + * A class which represents a familiar special. + * @author Aero + */ +public class FamiliarSpecial { + + /** + * The node. + */ + private Node node; + + /** + * The interface id. + */ + private int interfaceID; + + /** + * The component. + */ + private int component; + + /** + * The item. + */ + private Item item; + + /** + * Constructs a new {@code FamiliarSpecial} {@code Object}. + * @param node The node. + */ + public FamiliarSpecial(Node node) { + this(node, -1, -1, null); + } + + /** + * Constructs a new {@code FamiliarSpecial} {@code Object}. + * @param node The node. + * @param interfaceID The interface id. + * @param component The component. + * @param item The item. + */ + public FamiliarSpecial(Node node, int interfaceID, int component, Item item) { + this.node = node; + this.interfaceID = interfaceID; + this.component = component; + this.item = item; + } + + /** + * Gets the node. + * @return The node. + */ + public Node getNode() { + return node; + } + + /** + * Sets the node. + * @param node The node to set. + */ + public void setNode(Node node) { + this.node = node; + } + + /** + * Gets the interfaceID. + * @return The interfaceID. + */ + public int getInterfaceID() { + return interfaceID; + } + + /** + * Sets the interfaceID. + * @param interfaceID The interfaceID to set. + */ + public void setInterfaceID(int interfaceID) { + this.interfaceID = interfaceID; + } + + /** + * Gets the component. + * @return The component. + */ + public int getComponent() { + return component; + } + + /** + * Sets the component. + * @param component The component to set. + */ + public void setComponent(int component) { + this.component = component; + } + + /** + * Gets the item. + * @return The item. + */ + public Item getItem() { + return item; + } + + /** + * Sets the item. + * @param item The item to set. + */ + public void setItem(Item item) { + this.item = item; + } + + /** + * Gets the target. + * @return the target. + */ + public Entity getTarget() { + return (Entity) node; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/Forager.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/Forager.java new file mode 100644 index 000000000..e8cd9f669 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/Forager.java @@ -0,0 +1,108 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.game.node.entity.combat.equipment.WeaponInterface; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.tools.RandomFunction; + +/** + * Represents a forager familiar. + * @author Vexia + */ +public abstract class Forager extends BurdenBeast { + + /** + * The items to product if passive with no restrictions. + */ + private final Item[] items; + + /** + * The delay until the next random passive product. + */ + private int passiveDelay; + + /** + * Constructs a new {@code Forager} {@code Object}. + * @param owner the owner. + * @param id the id. + * @param ticks the ticks. + * @param pouchId the pouch id. + * @param specialCost the special cost. + */ + public Forager(Player owner, int id, int ticks, int pouchId, int specialCost, int attackStyle, final Item... items) { + super(owner, id, ticks, pouchId, specialCost, 30, attackStyle); + this.items = items; + setRandomPassive(); + } + + /** + * Constructs a new {@code Forager} {@code Object}. + * @param owner the owner. + * @param id the id. + * @param ticks the ticks. + * @param pouchId the pouch id. + * @param specialCost the special cost. + */ + public Forager(Player owner, int id, int ticks, int pouchId, int specialCost, final Item... items) { + this(owner, id, ticks, pouchId, specialCost, WeaponInterface.STYLE_DEFENSIVE, items); + } + + @Override + public void handleFamiliarTick() { + super.handleFamiliarTick(); + if (items != null && items.length > 0 && passiveDelay < GameWorld.getTicks()) { + if (RandomFunction.random(getRandom()) < 4) { + produceItem(items[RandomFunction.random(items.length)]); + } + setRandomPassive(); + } + } + + /** + * Adds an item to the container. + * @param item the item. + * @return {@code True} if so. + */ + public boolean produceItem(final Item item) { + if (!container.hasSpaceFor(item)) { + owner.getPacketDispatch().sendMessage("Your familar is too full to collect items."); + return false; + } + owner.getPacketDispatch().sendMessage(item.getAmount() == 1 ? "Your familar has produced an item." : "Your familiar has produced items."); + return container.add(item); + } + + /** + * Wrapper method for {@link #produceItem()}. + * @return {@code True} if produced. + */ + public boolean produceItem() { + if (items == null || items.length == 0) { + return false; + } + return produceItem(items[RandomFunction.random(items.length)]); + } + + /** + * Handles the passive reward of a forager. + */ + public void handlePassiveAction() { + + } + + /** + * Gets the random mod. + * @return the random mod. + */ + public int getRandom() { + return 11; + } + + /** + * Sets a random passive delay. + */ + public void setRandomPassive() { + passiveDelay = GameWorld.getTicks() + RandomFunction.random(100, 440); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/RemoteViewDialogue.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/RemoteViewDialogue.java new file mode 100644 index 000000000..c2918c68a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/RemoteViewDialogue.java @@ -0,0 +1,62 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.plugin.Initializable; +import core.game.content.dialogue.DialogueInterpreter; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.summoning.familiar.RemoteViewer.ViewType; +import core.game.node.entity.player.Player; + +/** + * Handles the remote viewing dialogue. + * @author Vexia + */ +@Initializable +public final class RemoteViewDialogue extends DialoguePlugin { + + /** + * The familiar instance. + */ + private Familiar familiar; + + /** + * Constructs a new {@code RemoteViewDialogue} {@code Object}. + */ + public RemoteViewDialogue() { + /** + * empty. + */ + } + + /** + * Constructs a new {@code RemoteViewDialogue} {@code Object}. + * @param player the player. + */ + public RemoteViewDialogue(final Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new RemoteViewDialogue(player); + } + + @Override + public boolean open(Object... args) { + familiar = (Familiar) args[0]; + options("North", "East", "Sotuh", "West", "Straight up"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + end(); + RemoteViewer.create(player, familiar, familiar.getViewAnimation(), ViewType.values()[-1 + buttonId]).startViewing(); + return true; + } + + @Override + public int[] getIds() { + return new int[] { DialogueInterpreter.getDialogueKey(RemoteViewer.DIALOGUE_NAME) }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/RemoteViewer.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/RemoteViewer.java new file mode 100644 index 000000000..864304442 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/RemoteViewer.java @@ -0,0 +1,271 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.net.packet.PacketRepository; +import core.net.packet.context.CameraContext; +import core.net.packet.context.CameraContext.CameraType; +import core.net.packet.out.CameraViewPacket; + +/** + * Handles the remote viewing of an area. + * @author Vexia + */ +public final class RemoteViewer { + + /** + * The dialogue name to use. + */ + public static final String DIALOGUE_NAME = "remote-view"; + + /** + * The remote camera height. + */ + public static final int HEIGHT = 1000; + + /** + * The player. + */ + private final Player player; + + /** + * The familiar. + */ + private final Familiar familiar; + + /** + * The animation to start viewing. + */ + private final Animation animation; + + /** + * The view type. + */ + private final ViewType type; + + /** + * Constructs a new {@code RemoteViewer} {@code Object}. + * @param player the player. + * @param familiar the familiar. + * @param animation the animation. + * @param type the type. + */ + public RemoteViewer(Player player, Familiar familiar, Animation animation, ViewType type) { + this.player = player; + this.familiar = familiar; + this.animation = animation; + this.type = type; + } + + /** + * Creates a remote view object. + * @param player the player. + * @param familiar the familiar. + * @param animation the animation. + * @param type + * @return + */ + public static RemoteViewer create(final Player player, Familiar familiar, Animation animation, ViewType type) { + return new RemoteViewer(player, familiar, animation, type); + } + + /** + * Starts viewing an area. + */ + public void startViewing() { + player.lock(); + familiar.animate(animation); + player.getPacketDispatch().sendMessage("You send the " + familiar.getName().toLowerCase() + " to fly " + (type == ViewType.STRAIGHT_UP ? "directly up" : "to the " + type.name().toLowerCase()) + "..."); + GameWorld.getPulser().submit(new Pulse(5) { + @Override + public boolean pulse() { + view(); + return true; + } + }); + } + + /** + * Views the area from the view type. + */ + private void view() { + if (!canView()) { + return; + } + sendCamera(type.getXOffset(), type.getYOffset(), type.getXRot(), type.getYRot()); + GameWorld.getPulser().submit(new Pulse(13) { + @Override + public boolean pulse() { + reset(); + return true; + } + }); + } + + /** + * Checks if a remote view can start. + * @return {@code True} if so. + */ + private boolean canView() { + // player.getPacketDispatch().sendMessage("There seems to be an obstruction in the direction; the familiar cannot fly there"); + if (!familiar.isActive()) { + return false; + } + return true; + } + + /** + * Resets the camera packet. + */ + private void reset() { + familiar.call(); + player.unlock(); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.RESET, 0, 0, HEIGHT, 1, 100)); + } + + /** + * Sends a camera packet. + * @param xRot the xRot. + * @param yRot the yRot. + */ + private void sendCamera(int xOffset, int yOffset, final int xRot, final int yRot) { + final Location location = type.getLocationTransform(player); + final int x = location.getX() + xOffset; + final int y = location.getY() + yOffset; + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.POSITION, x, y, HEIGHT, 1, 100)); + PacketRepository.send(CameraViewPacket.class, new CameraContext(player, CameraType.ROTATION, x + xRot, y + yRot, HEIGHT, 1, 90)); + } + + /** + * Opens the remote viewing dialogue. + * @param player the player. + * @param familiar the familiar. + */ + public static void openDialogue(final Player player, final Familiar familiar) { + player.getDialogueInterpreter().open(DIALOGUE_NAME, familiar); + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the familiar. + * @return The familiar. + */ + public Familiar getFamiliar() { + return familiar; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } + + /** + * Gets the type. + * @return The type. + */ + public ViewType getType() { + return type; + } + + /** + * A view type. + * @author Vexia + */ + public enum ViewType { + NORTH(Direction.NORTH, 0, 0, 0, 0), EAST(Direction.WEST, 0, 0, 0, 0), SOUTH(Direction.SOUTH, 0, 0, 0, 0), WEST(Direction.EAST, 0, 0, 0, 0), STRAIGHT_UP(null, 0, 0, 0, 0); + + /** + * The direction. + */ + private final Direction direction; + + /** + * The data for the camera. + */ + private final int[] data; + + /** + * Constructs a new {@code ViewType} {@code Object}. + * @param data the data. + */ + private ViewType(Direction direction, int... data) { + this.direction = direction; + this.data = data; + } + + /** + * Gets the transformed location. + * @param player the player. + * @return the location. + */ + public Location getLocationTransform(final Player player) { + if (this == STRAIGHT_UP) { + return player.getLocation(); + } + return player.getLocation().transform(direction, 10); + } + + /** + * Gets the direction. + * @return The direction. + */ + public Direction getDirection() { + return direction; + } + + /** + * Gets the x offset. + * @return the offset. + */ + public int getXOffset() { + return data[0]; + } + + /** + * Gets the y offset. + * @return the offset. + */ + public int getYOffset() { + return data[1]; + } + + /** + * Gets the x rotation. + * @return the rotation. + */ + public int getXRot() { + return data[2]; + } + + /** + * Gets the y rot. + * @return the rot. + */ + public int getYRot() { + return data[3]; + } + + /** + * Gets the data. + * @return The data. + */ + public int[] getData() { + return data; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/SummonFamiliarPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/SummonFamiliarPlugin.java new file mode 100644 index 000000000..76db891c4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/familiar/SummonFamiliarPlugin.java @@ -0,0 +1,46 @@ +package core.game.node.entity.skill.summoning.familiar; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.world.map.zone.ZoneBorders; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.game.node.entity.npc.familiar.IbisNPC; + +/** + * Handles summoning a familiar. + * @author Emperor + */ +@Initializable +public final class SummonFamiliarPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.setOptionHandler("summon", this); + return null; + } + + @Override + public boolean handle(Player player, Node node, String option) { + Item item = (Item) node; + if (!player.getQuestRepository().isComplete("Wolf Whistle") && player.getAttribute("in-cutscene", null) == null) { + player.getPacketDispatch().sendMessage("You have to complete Wolf Whistle before you can summon a familiar."); + return true; + } + player.getFamiliarManager().summon(item, false); + + // Achievement diary handlers + if (player.getFamiliarManager().hasFamiliar() + && player.getFamiliarManager().getFamiliar() instanceof IbisNPC + && (new ZoneBorders(3011, 3222, 3017, 3229, 0).insideBorder(player) + || new ZoneBorders(3011, 3220, 3015, 3221, 0).insideBorder(player))) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR, 2, 9); + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/IncubatorEgg.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/IncubatorEgg.java new file mode 100644 index 000000000..3a98c948c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/IncubatorEgg.java @@ -0,0 +1,102 @@ +package core.game.node.entity.skill.summoning.pet; + +import core.game.node.item.Item; + +/** + * An egg to put in the incubator. + * @author Vexia + */ +public enum IncubatorEgg { + PENGUIN(new Item(12483), 30, 30, new Item(12481)), + RAVEN(new Item(11964), 50, 30, new Item(12484)), + SARADOMIN_OWL(new Item(5077), 70, 60, new Item(12503)), + ZAMORAK_HAWK(new Item(5076), 70, 60, new Item(12506)), + GUTHIX_RAPTOR(new Item(5078), 70, 60, new Item(12509)), + VULTURE(new Item(11965), 85, 60, new Item(12498)), + CHAMELEON(new Item(12494), 90, 60, new Item(12492)), + RED_DRAGON(new Item(12477), 99, 60, new Item(12469)), + BLACK_DRAGON(new Item(12480), 99, 60, new Item(12475)), + BLUE_DRAGON(new Item(12478), 99, 60, new Item(12471)), + GREEN_DRAGON(new Item(12479), 99, 60, new Item(12473)); + + /** + * The egg item. + */ + private final Item egg; + + /** + * The level. + */ + private final int level; + + /** + * The incubation time. + */ + private final int inucbationTime; + + /** + * The product item. + */ + private final Item product; + + /** + * Constructs a new {@Code IncubatorEgg} {@Code Object} + * @param egg the egg. + * @param level the level. + * @param inucbationTime the incubation time. + * @param product the product. + */ + private IncubatorEgg(Item egg, int level, int inucbationTime, Item product) { + this.egg = egg; + this.level = level; + this.inucbationTime = inucbationTime; + this.product = product; + } + + /** + * Gets an egg by the item. + * @param item the item. + * @return the egg. + */ + public static IncubatorEgg forItem(Item item) { + for (IncubatorEgg e : values()) { + if (e.getEgg().getId() == item.getId()) { + return e; + } + } + return null; + } + + /** + * Gets the egg. + * @return the egg + */ + public Item getEgg() { + return egg; + } + + /** + * Gets the level. + * @return the level + */ + public int getLevel() { + return level; + } + + /** + * Gets the inucbationTime. + * @return the inucbationTime + */ + public int getInucbationTime() { + return inucbationTime; + } + + /** + * Gets the product. + * @return the product + */ + public Item getProduct() { + return product; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/Pet.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/Pet.java new file mode 100644 index 000000000..0bda20e7a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/Pet.java @@ -0,0 +1,170 @@ +package core.game.node.entity.skill.summoning.pet; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.node.entity.player.Player; + +/** + * Represents a pet. + * @author Emperor + * @author 'Vexia + */ +public final class Pet extends Familiar { + + /** + * The item id. + */ + private final int itemId; + + /** + * The pet details. + */ + private final PetDetails details; + + /** + * The growth rate of the pet. + */ + private double growthRate; + + /** + * The pets type. + */ + private final Pets pet; + + /** + * Constructs a new {@code Pet} {@code Object}. + * @param owner the owner. + * @param details the details. + * @param itemId the itemId. + * @param id the id. + */ + public Pet(Player owner, final PetDetails details, int itemId, int id) { + super(owner, id, -1, -1, -1); + this.pet = Pets.forId(itemId); + this.details = details; + this.itemId = itemId; + this.growthRate = pet.getGrowthRate(); + } + + @Override + public void sendConfiguration() { + owner.getConfigManager().set(1175, ((int) details.getGrowth() << 1) | ((int) details.getHunger() << 9)); + owner.getConfigManager().set(1174, getId()); + owner.getConfigManager().set(448, itemId); + } + + @Override + public void handleTickActions() { + final PetDetails petDetails = details; + if (getPet().getFood().length > 0) { + petDetails.updateHunger(petDetails.getStage() == 0 ? 0.025 : 0.018); + } + double hunger = petDetails.getHunger(); + if (hunger >= 90.0 && hunger < 90.025) { + owner.getPacketDispatch().sendMessage("Your pet is starving, feed it before it runs off."); + } + double growth = petDetails.getGrowth(); + if (pet.getGrowthRate() > 0.000) { + petDetails.updateGrowth(pet.getGrowthRate()); + if (growth == 100.0) { + growNextStage(); + } + } + if ((!isInvisible() && owner.getLocation().getDistance(getLocation()) > 12) || (isInvisible() && ticks % 25 == 0)) { + if (!call()) { + setInvisible(true); + } + } else if (!getPulseManager().hasPulseRunning()) { + startFollowing(); + } + owner.getConfigManager().set(1175, ((int) details.getGrowth() << 1) | ((int) details.getHunger() << 9)); + } + + /** + * Method used to grow the npc's next stage. + */ + public final void growNextStage() { + if (details.getStage() == 3) { + return; + } + if (pet == null) { + return; + } + int npcId = pet.getNpcId(details.getStage() + 1); + if (npcId < 1) { + return; + } + details.setStage(details.getStage() + 1); + int itemId = pet.getItemId(details.getStage()); + if (pet.getNpcId(details.getStage() + 1) > 0) { + details.updateGrowth(-100.0); + } + clear(); + Pet newPet = new Pet(owner, details, itemId, npcId); + newPet.growthRate = growthRate; + owner.getFamiliarManager().setFamiliar(newPet); + owner.getPacketDispatch().sendMessage("Your pet has grown larger."); + owner.getFamiliarManager().spawnFamiliar(); + } + + @Override + public Familiar construct(Player owner, int id) { + return this; + } + + @Override + protected boolean specialMove(FamiliarSpecial special) { + return false; + } + + @Override + public boolean isCombatFamiliar() { + return false; + } + + /** + * Gets the growthRate. + * @return The growthRate. + */ + public double getGrowthRate() { + return growthRate; + } + + /** + * Sets the growthRate. + * @param growthRate The growthRate to set. + */ + public void setGrowthRate(double growthRate) { + this.growthRate = growthRate; + } + + /** + * Gets the itemId. + * @return The itemId. + */ + public int getItemId() { + return itemId; + } + + /** + * Gets the details. + * @return The details. + */ + public PetDetails getDetails() { + return details; + } + + /** + * Gets the pet. + * @return The pet. + */ + public Pets getPet() { + return pet; + } + + @Override + public int[] getIds() { + return new int[] { 761, 762, 763, 764, 765, 766, 3505, 3598, 6969, 7259, 7260, 6964, 7249, 7251, 6960, 7241, 7243, 6962, 7245, 7247, 6966, 7253, 7255, 6958, 7237, 7239, 6915, 7277, 7278, 7279, 7280, 7018, 7019, 7020, 6908, 7313, 7316, 6947, 7293, 7295, 7297, 7299, 6911, 7261, 7263, 7265, 7267, 7269, 6919, 7301, 7303, 7305, 7307, 6949, 6952, 6955, 6913, 7271, 7273, 6945, 7319, 7321, 7323, 7325, 7327, 6922, 6942, 7210, 7212, 7214, 7216, 7218, 7220, 7222, 7224, 7226, 6900, 6902, 6904, 6906, 768, 769, 770, 771, 772, 773, 3504, 6968, 7257, 7258, 6965, 7250, 7252, 6961, 7242, 7244, 6963, 7246, 7248, 6967, 7254, 7256, 6859, 7238, 7240, 6916, 7281, 7282, 7283, 7284, 7015, 7016, 7017, 6909, 7314, 7317, 6948, 7294, 7296, 7298, 7300, 6912, 7262, 7264, 7266, 7268, 7270, 6920, 7302, 7304, 7306, 7308, 6950, 6953, 6956, 6914, 7272, 7274, 6946, 7320, 7322, 7324, 7326, 7328, 6923, 6943, 7211, 7213, 7215, 7217, 7219, 7221, 7223, 7225, 7227, 6901, 6903, 6905, 6907, 774, 775, 776, 777, 778, 779, 3503, 6951, 6954, 6957 }; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/PetDetails.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/PetDetails.java new file mode 100644 index 000000000..246421924 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/PetDetails.java @@ -0,0 +1,108 @@ +package core.game.node.entity.skill.summoning.pet; + +import core.game.node.entity.player.info.login.SavingModule; + +import java.nio.ByteBuffer; + +/** + * A class containing pet details for a certain pet. + * @author Emperor + */ +public final class PetDetails implements SavingModule { + + /** + * The hunger rate. + */ + private double hunger = 0.0; + + /** + * The growth rate. + */ + private double growth = 0.0; + + /** + * The current stage of the pet (0 - baby, 1 - grown, 2 - overgrown). + */ + private int stage; + + /** + * Constructs a new {@code PetDetails} {@code Object}. + * @param growth The growth value. + */ + public PetDetails(double growth) { + this.growth = growth; + } + + @Override + public void save(ByteBuffer buffer) { + buffer.putDouble(hunger); + buffer.putDouble(growth); + buffer.put((byte) stage); + } + + @Override + public void parse(ByteBuffer buffer) { + hunger = buffer.getDouble(); + growth = buffer.getDouble(); + stage = buffer.get(); + } + + /** + * Increases the hunger value by the given amount. + * @param amount The amount. + */ + public void updateHunger(double amount) { + hunger += amount; + if (hunger < 0.0) { + hunger = 0.0; + } else if (hunger > 100.0) { + hunger = 100.0; + } + } + + /** + * Increases the growth value by the given amount. + * @param amount The amount. + */ + public void updateGrowth(double amount) { + growth += amount; + if (growth < 0.0) { + growth = 0.0; + } else if (growth > 100.0) { + growth = 100.0; + } + } + + /** + * Gets the hunger. + * @return The hunger. + */ + public double getHunger() { + return hunger; + } + + /** + * Gets the growth. + * @return The growth. + */ + public double getGrowth() { + return growth; + } + + /** + * Gets the stage. + * @return The stage. + */ + public int getStage() { + return stage; + } + + /** + * Sets the stage. + * @param stage The stage to set. + */ + public void setStage(int stage) { + this.stage = stage; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/Pets.java b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/Pets.java new file mode 100644 index 000000000..79db2dc04 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/summoning/pet/Pets.java @@ -0,0 +1,480 @@ +package core.game.node.entity.skill.summoning.pet; + +import core.game.node.entity.player.Player; + +import java.util.HashMap; +import java.util.Map; + +/** + * An enum containing all the pets and their info. + * @author Emperor + */ +public enum Pets { + + /** + * A cat/kitten pet. + */ + CAT(1555, 1561, 1567, 761, 768, 774, 0.0154320987654321, 0, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927), CAT_1(1556, 1562, 1568, 762, 769, 775, 0.0154320987654321, 0, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927), CAT_2(1557, 1563, 1569, 763, 770, 776, 0.0154320987654321, 0, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927), CAT_3(1558, 1564, 1570, 764, 771, 777, 0.0154320987654321, 0, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927), CAT_4(1559, 1565, 1571, 765, 772, 778, 0.0154320987654321, 0, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927), CAT_5(1560, 1566, 1572, 766, 773, 779, 0.0154320987654321, 0, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927), HELLCAT(7583, 7582, 7581, 3505, 3504, 3503, 0.0154320987654321, 0, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927), CAT_7(14089, 14090, 15092, 8217, 8214, 8216, 0.0154320987654321, 0, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 1927), + + /** + * A clockwork cat. + */ + CLOCKWORK_CAT(7771, 7772, -1, 3598, -1, -1, 0.0, 0), + + /** + * The firemaker's curse pets. + */ + SEARING_FLAME(22994, -1, -1, 14769, -1, -1, 0.0, 0), GLOWING_EMBER(22993, -1, -1, 14768, -1, -1, 0.0, 0), TWISTED_FIRESTARTER(22995, -1, -1, 14770, -1, -1, 0.0, 0), WARMING_FLAME(22992, -1, -1, 14767, -1, -1, 0.0, 0), + + /** + * Troll baby pet. + */ + TROLL_BABY(23030, 23030, -1, 14846, -1, -1, 0.0, 0), + + /** + * A bulldog pet. + */ + BULLDOG(12522, 12523, -1, 6969, 6968, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), BULLDOG_1(12720, 12721, -1, 7259, 7257, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), BULLDOG_2(12722, 12723, -1, 7260, 7258, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), + + /** + * A dalmation pet. + */ + DALMATIAN(12518, 12519, -1, 6964, 6965, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), DALMATIAN_1(12712, 12713, -1, 7249, 7250, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), DALMATIAN_2(12714, 12715, -1, 7251, 7252, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), + + /** + * A greyhound pet. + */ + GREYHOUND(12514, 12515, -1, 6960, 6961, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), GREYHOUND_1(12704, 12705, -1, 7241, 7242, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), GREYHOUND_2(12706, 12707, -1, 7243, 7244, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), + + /** + * A labrador pet. + */ + LABRADOR(12516, 12517, -1, 6962, 6963, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), LABRADOR_1(12708, 12709, -1, 7245, 7246, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), LABRADOR_2(12710, 12711, -1, 7247, 7248, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), + + /** + * A sheepdog pet. + */ + SHEEPDOG(12520, 12521, -1, 6966, 6967, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), SHEEPDOG_1(12716, 12717, -1, 7253, 7254, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), SHEEPDOG_2(12718, 12719, -1, 7255, 7256, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), + + /** + * A terrier pet. + */ + TERRIER(12512, 12513, -1, 6958, 6859, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), TERRIER_1(12700, 12701, -1, 7237, 7238, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), TERRIER_2(12702, 12703, -1, 7239, 7240, -1, 0.0033333333333333, 4, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 526), + + /** + * A creeping hand pet. + */ + CREEPING_HAND(14652, -1, -1, 8619, -1, -1, 0.0033333333333333, 4, 1059), + + /** + * Minitrice pet. + */ + MINITRICE(14653, -1, -1, 8620, -1, -1, 0.0033333333333333, 4, 225), + + /** + * Baby basilisk pet. + */ + BABY_BASILISK(14654, -1, -1, 8621, -1, -1, 0.0033333333333333, 4, 221), + + /** + * Baby kurask pet. + */ + BABY_KURASK(14655, -1, -1, 8622, -1, -1, 0.0033333333333333, 4, 526), + + /** + * Abyssal minion pet. + */ + ABYSSAL_MINION(14651, -1, -1, 8624, -1, -1, 0.0033333333333333, 4, 592), + + /** + * Rune guardian pets. + */ + RUNE_GUARDIAN(15626, -1, -1, 9656, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_1(15627, -1, -1, 9657, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_2(15628, -1, -1, 9658, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_3(15629, -1, -1, 9659, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_4(15630, -1, -1, 9660, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_5(15631, -1, -1, 9661, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_6(15632, -1, -1, 9662, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_7(15633, -1, -1, 9663, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_8(15634, -1, -1, 9664, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_9(15635, -1, -1, 9665, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_10(15636, -1, -1, 9666, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_11(15637, -1, -1, 9667, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_12(15638, -1, -1, 9668, -1, -1, 0.0033333333333333, 4), RUNE_GUARDIAN_13(15639, -1, -1, 9669, -1, -1, 0.0033333333333333, 4), + + /** + * Gecko pet. + */ + GECKO(12488, 12489, -1, 6915, 6916, -1, 0.005, 10, 12125, 12127), GECKO_1(12738, 12742, -1, 7277, 7281, -1, 0.005, 10, 12125, 12127), GECKO_2(12739, 12743, -1, 7278, 7282, -1, 0.005, 10, 12125, 12127), GECKO_3(12740, 12744, -1, 7279, 7283, -1, 0.005, 10, 12125, 12127), GECKO_4(12741, 12745, -1, 7280, 7284, -1, 0.005, 10, 12125, 12127), + + /** + * The platypus pet. + */ + PLATYPUS(12551, 12548, -1, 7018, 7015, -1, 0.0046296296296296, 10, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 313, 12129), PLATYPUS_1(12552, 12549, -1, 7019, 7016, -1, 0.0046296296296296, 10, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 313, 12129), PLATYPUS_2(12553, 12550, -1, 7020, 7017, -1, 0.0046296296296296, 10, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 313, 12129), + + /** + * The broav pet. + */ + BROAV(14533, -1, -1, 8491, -1, -1, 0.0, 23, 2970), + + /** + * The penguin pet. + */ + PENGUIN(12481, 12482, -1, 6908, 6909, -1, 0.0046296296296296, 30, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), PENGUIN_1(12763, 12762, -1, 7313, 7314, -1, 0.0046296296296296, 30, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), PENGUIN_2(12765, 12764, -1, 7316, 7317, -1, 0.0046296296296296, 30, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), + + /** + * A tooth creature pet. + */ + TOOTH_CREATURE(18671, 18669, -1, 11411, 11413, -1, 0.075757575757576, 37, 1927, 1977), + + /** + * A giant crab pet. + */ + GIANT_CRAB(12500, 12501, -1, 6947, 6948, -1, 0.0069444444444444, 40, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), GIANT_CRAB_1(12746, 12747, -1, 7293, 7294, -1, 0.0069444444444444, 40, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), GIANT_CRAB_2(12748, 12749, -1, 7295, 7296, -1, 0.0069444444444444, 40, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), GIANT_CRAB_3(12750, 12751, -1, 7297, 7298, -1, 0.0069444444444444, 40, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), GIANT_CRAB_4(12752, 12753, -1, 7299, 7300, -1, 0.0069444444444444, 40, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), + + /** + * A Raven pet. + */ + RAVEN(12484, 12485, -1, 6911, 6912, -1, 0.00698888, 50, 313, 12129), RAVEN_1(12724, 12725, -1, 7261, 7262, -1, 0.00698888, 50, 313, 12129), RAVEN_2(12726, 12727, -1, 7263, 7264, -1, 0.00698888, 50, 313, 12129), RAVEN_3(12728, 12729, -1, 7265, 7266, -1, 0.00698888, 50, 313, 12129), RAVEN_4(12730, 12731, -1, 7267, 7268, -1, 0.00698888, 50, 313, 12129), RAVEN_5(12732, 12733, -1, 7269, 7270, -1, 0.00698888, 50, 313, 12129), + + /** + * A squirrel pet. + */ + SQUIRREL(12490, 12491, -1, 6919, 6920, -1, 0.0071225071225071, 60, 12130), SQUIRREL_1(12754, 12755, -1, 7301, 7302, -1, 0.0071225071225071, 60, 12130), SQUIRREL_2(12756, 12757, -1, 7303, 7304, -1, 0.0071225071225071, 60, 12130), SQUIRREL_3(12758, 12759, -1, 7305, 7306, -1, 0.0071225071225071, 60, 12130), SQUIRREL_4(12760, 12761, -1, 7307, 7308, -1, 0.0071225071225071, 60, 12130), + + /** + * Godbirds. + */ + SARADOMIN_OWL(12503, 12504, 12505, 6949, 6950, 6951, 0.0069444444444444, 70, 313, 12129), ZAMORAK_HAWK(12506, 12507, 12508, 6952, 6953, 6954, 0.0069444444444444, 70, 313, 12129), GUTHIX_RAPTOR(12509, 12510, 12511, 6955, 6956, 6957, 0.0069444444444444, 70, 313, 12129), + + /** + * Ex-ex parrot + */ + EX_EX_PARROT(13335, -1, -1, 7844, -1, -1, 0.0, 71, 13379), + + /** + * The phoenix eggling pets. + */ + CUTE_PHOENIX_EGGLING(14627, -1, -1, 8578, -1, -1, 0.0, 72, 592), MEAN_PHOENIX_EGGLING(14626, -1, -1, 8577, -1, -1, 0.0, 72, 592), + + /** + * A raccoon pet. + */ + RACCOON(12486, 12487, -1, 6913, 6914, -1, 0.0029444444444444, 80, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 2132, 2134, 2136, 2138, 10816, 9986, 9978), RACCOON_1(12734, 12735, -1, 7271, 7272, -1, 0.0029444444444444, 80, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 2132, 2134, 2136, 2138, 10816, 9986, 9978), RACCOON_2(12736, 12737, -1, 7273, 7274, -1, 0.0029444444444444, 80, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270, 2132, 2134, 2136, 2138, 10816, 9986, 9978), + + /** + * A sneaker peeper pet. + */ + SNEAKER_PEEPER(19894, 19895, -1, 13089, 13090, -1, 0.05, 80, 221), + + /** + * A vulture pet. + */ + VULTURE(12498, 12499, -1, 6945, 6946, -1, 0.0078, 85, 313, 12129), VULTURE_1(12766, 12767, -1, 7319, 7320, -1, 0.0078, 85, 313, 12129), VULTURE_2(12768, 12769, -1, 7321, 7322, -1, 0.0078, 85, 313, 12129), VULTURE_3(12770, 12771, -1, 7323, 7324, -1, 0.0078, 85, 313, 12129), VULTURE_4(12772, 12773, -1, 7325, 7326, -1, 0.0078, 85, 313, 12129), VULTURE_5(12774, 12775, -1, 7327, 7328, -1, 0.0078, 85, 313, 12129), + + /** + * A chameleon pet. + */ + CHAMELEON(12492, 12493, -1, 6922, 6923, -1, 0.0069444444444444, 90, 12125), + + /** + * A monkey pet. + */ + MONKEY(12496, 12497, -1, 6942, 6943, -1, 0.0069444444444444, 95, 1963), MONKEY_1(12682, 12683, -1, 7210, 7211, -1, 0.0069444444444444, 95, 1963), MONKEY_2(12684, 12685, -1, 7212, 7213, -1, 0.0069444444444444, 95, 1963), MONKEY_3(12686, 12687, -1, 7214, 7215, -1, 0.0069444444444444, 95, 1963), MONKEY_4(12688, 12689, -1, 7216, 7217, -1, 0.0069444444444444, 95, 1963), MONKEY_5(12690, 12691, -1, 7218, 7219, -1, 0.0069444444444444, 95, 1963), MONKEY_6(12692, 12693, -1, 7220, 7221, -1, 0.0069444444444444, 95, 1963), MONKEY_7(12694, 12695, -1, 7222, 7223, -1, 0.0069444444444444, 95, 1963), MONKEY_8(12696, 12697, -1, 7224, 7225, -1, 0.0069444444444444, 95, 1963), MONKEY_9(12698, 12699, -1, 7226, 7227, -1, 0.0069444444444444, 95, 1963), + + /** + * A baby dragon pet. + */ + BABY_DRAGON(12469, 12470, -1, 6900, 6901, -1, 0.0052, 99, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), BABY_DRAGON_1(12471, 12472, -1, 6902, 6903, -1, 0.0052, 99, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), BABY_DRAGON_2(12473, 12474, -1, 6904, 6905, -1, 0.0052, 99, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270), BABY_DRAGON_3(12475, 12476, -1, 6906, 6907, -1, 0.0052, 99, 2132, 2134, 2136, 2138, 10816, 9986, 9978, 321, 363, 341, 15264, 345, 377, 353, 389, 7944, 349, 331, 327, 395, 383, 317, 371, 335, 359, 15264, 15270); + + +// /** +// * Emperor's pets (that's right, MY pet"S"). +// */ +// GIANT_WOLPERTINGER(8888, -1, -1, 6990, -1, -1, 0.0, 99), DRAKAN(8889, -1, -1, 4794, -1, -1, 0.0, 99), DILL(8890, -1, -1, 7770, -1, -1, 0.0, 99), + +// /** +// * Vexias pet. +// */ +// IMP(9952, -1, -1, 1531, -1, -1, 0.0, 99), BIG_GUY(9951, -1, -1, 3101, -1, -1, 0.0, 99), LITTLE_GUY(8887, -1, -1, 5805, -1, -1, 0.0, 99), +// +// /** +// * Godwars boss pets. +// */ +// KRIL_JR(14648, -1, -1, 8591, -1, -1, 0.0, 1), KREE_JR(14645, -1, -1, 8592, -1, -1, 0.0, 1), ZILYANA_JR(14647, -1, -1, 8593, -1, -1, 0.0, 1), GRAARDOOR_JR(14646, -1, -1, 8594, -1, -1, 0.0, 1), +// +// /** +// * Classic boss pets. +// */ +// CHAOS_ELE_JR(14638, -1, -1, 8595, -1, -1, 0.0, 1), PRINCE_BLACK_DRAGON(14649, -1, -1, 8596, -1, -1, 0.0, 1), BABY_MOLE(14642, -1, -1, 8601, -1, -1, 0.0, 1), KQ_FORM_1(14643, -1, -1, 8602, -1, -1, 0.0, 1), KQ_FORM_2(14650, -1, -1, 8603, -1, -1, 0.0, 1), DARK_CORE(14653, -1, -1, 8630, -1, -1, 0.0, 1), +// +// /** +// * The boss pets for the Dagannoths +// */ +// DAGANNOTH_SUPREME(14639, -1, -1, 8605, -1, -1, 0.0, 1), DAGANNOTH_PRIME(14640, -1, -1, 8606, -1, -1, 0.0, 1), DAGANNOTH_REX(14641, -1, -1, 8607, -1, -1, 0.0, 1), +// /** +// * The new OSRS bosses. +// */ +// CALLISTO_CUB(14658, -1, -1, 8597, -1, -1, 0.0, 1), +// SCORPIA_JR(14661, -1, -1, 8598, -1, -1, 0.0, 1), +// VENENATIS_JR(14657, -1, -1, 8654, -1, -1, 0.0, 1), +// VETION_JR(14659, -1, -1, 8600, -1, -1, 0.0, 1), +// VETION_JR_2(14660, -1, -1, 8654, -1, -1, 0.0, 1), +// RELEASE_THE_KRAKEN(14651, -1, -1, 8608, -1, -1, 0.0, 1), +// SMOKE_DEVIL(14644, -1, -1, 8609, -1, -1, 0.0, 1), +// SNAKELING_YELLOW(14654, -1, -1, 8626, -1, -1, 0.0, 1), +// SNAKELING_ORANGE(14655, -1, -1, 8627, -1, -1, 0.0, 1), +// SNAKELING_PURPLE(14656, -1, -1, 8628, -1, -1, 0.0, 1), +// /** +// * The boss pet representing the likeness of the Penance Queen +// */ +// DRAMA_QUEEN(14652, -1, -1, 8604, -1, -1, 0.0, 1), +// /** +// * The skilling pets +// */ +// BEAVER(14821, -1, -1, 8635, -1, -1, 0.0, 1), +// ROCK_GOLEM(14822, -1, -1, 8637, -1, -1, 0.0, 1), +// BABY_RED_CHINCHOMPA(14823, -1, -1, 8643, -1, -1, 0.0, 1), +// BABY_GREY_CHINCHOMPA(14824, -1, -1, 8644, -1, -1, 0.0, 1), +// BABY_BLACK_CHINCHOMPA(14825, -1, -1, 8657, -1, -1, 0.0, 1), +// BABY_GOLD_CHINCHOMPA(14826, -1, -1, 8658, -1, -1, 0.0, 1), +// HERON(14827, -1, -1, 8647, -1, -1, 0.0, 1), +// TZREK_JAD(14828, -1, -1, 8650, -1, -1, 0.0, 1); + + + /** + * The baby pets mapping. + */ + private static final Map babyPets = new HashMap(); + + /** + * The grown pets mapping. + */ + private static final Map grownPets = new HashMap(); + + /** + * The overgrown pets mapping. + */ + private static final Map overgrownPets = new HashMap(); + + /** + * Populates the mappings. + */ + static { + for (Pets pet : Pets.values()) { + babyPets.put(pet.babyItemId, pet); + if (pet.grownItemId > 0) { + grownPets.put(pet.grownItemId, pet); + if (pet.getOvergrownItemId() > 0) { + overgrownPets.put(pet.overgrownItemId, pet); + } + } + } + } + + /** + * Gets the pet object for the item id. + * @param itemId The item id. + * @return The pet object. + */ + public static Pets forId(int itemId) { + Pets pet = babyPets.get(itemId); + if (pet == null) { + pet = grownPets.get(itemId); + if (pet == null) { + return overgrownPets.get(itemId); + } + return pet; + } + return pet; + } + + /** + * Checks if a player has a pet. + * @param player The player. + * @return {@code True} if so. + */ + public static boolean hasPet(Player player) { + for (int itemId : babyPets.keySet()) { + if (player.getInventory().containsAtLeastOneItem(itemId)) { + return true; + } + } + for (int itemId : grownPets.keySet()) { + if (player.getInventory().containsAtLeastOneItem(itemId)) { + return true; + } + } + for (int itemId : overgrownPets.keySet()) { + if (player.getInventory().containsAtLeastOneItem(itemId)) { + return true; + } + } + return false; + } + + /** + * The baby item id. + */ + private final int babyItemId; + + /** + * The grown pet's item id. + */ + private final int grownItemId; + + /** + * The overgrown pet's item id. + */ + private final int overgrownItemId; + + /** + * The baby pet NPC id. + */ + private final int babyNpcId; + + /** + * The grown pet NPC id. + */ + private final int grownNpcId; + + /** + * The overgrown pet NPC id. + */ + private final int overgrownNpcId; + + /** + * The growth rate. + */ + private final double growthRate; + + /** + * The summoning level required. + */ + private final int summoningLevel; + + /** + * The food this pet uses. + */ + private final int[] food; + + /** + * Constructs a new {@code Pets} {@code Object}. + * @param babyItemId The baby pet item id. + * @param grownItemId The grown pet item id. + * @param overgrownItemId The overgrown item id. + * @param babyNpcId The baby pet npc id. + * @param grownNpcId The grown pet npc id. + * @param overgrownNpcId The overgrown npc id. + * @param growthRate The growth rate (amount to increase growth with every + * tick). + * @param summoningLevel The summoning level required. + * @param food The food item ids the pet uses. + */ + private Pets(int babyItemId, int grownItemId, int overgrownItemId, int babyNpcId, int grownNpcId, int overgrownNpcId, double growthRate, int summoningLevel, int... food) { + this.babyItemId = babyItemId; + this.grownItemId = grownItemId; + this.overgrownItemId = overgrownItemId; + this.babyNpcId = babyNpcId; + this.grownNpcId = grownNpcId; + this.overgrownNpcId = overgrownNpcId; + this.growthRate = growthRate; + this.summoningLevel = summoningLevel; + this.food = food; + } + + /** + * Gets the babyItemId. + * @return The babyItemId. + */ + public int getBabyItemId() { + return babyItemId; + } + + /** + * Gets the grownItemId. + * @return The grownItemId. + */ + public int getGrownItemId() { + return grownItemId; + } + + /** + * Gets the overgrownItemId. + * @return The overgrownItemId. + */ + public int getOvergrownItemId() { + return overgrownItemId; + } + + /** + * Gets the babyNpcId. + * @return The babyNpcId. + */ + public int getBabyNpcId() { + return babyNpcId; + } + + /** + * Gets the grownNpcId. + * @return The grownNpcId. + */ + public int getGrownNpcId() { + return grownNpcId; + } + + /** + * Gets the overgrownNpcId. + * @return The overgrownNpcId. + */ + public int getOvergrownNpcId() { + return overgrownNpcId; + } + + /** + * Gets the growthRate. + * @return The growthRate. + */ + public double getGrowthRate() { + return growthRate; + } + + /** + * Gets the summoningLevel. + * @return The summoningLevel. + */ + public int getSummoningLevel() { + return summoningLevel; + } + + /** + * Gets the food. + * @return The food. + */ + public int[] getFood() { + return food; + } + + /** + * Gets the NPC id for this pet. + * @param stage The stage of the pet. + * @return The NPc id. + */ + public int getNpcId(int stage) { + switch (stage) { + case 0: + return babyNpcId; + case 1: + return grownNpcId; + case 2: + return overgrownNpcId; + } + return 0; + } + + /** + * Gets the item id for this pet. + * @param stage The stage of the pet. + * @return The item id. + */ + public int getItemId(int stage) { + switch (stage) { + case 0: + return babyItemId; + case 1: + return grownItemId; + case 2: + return overgrownItemId; + } + return 0; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/thieving/PickableDoorHandler.java b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/PickableDoorHandler.java new file mode 100644 index 000000000..f3b33af0b --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/PickableDoorHandler.java @@ -0,0 +1,239 @@ +package core.game.node.entity.skill.thieving; + +import core.cache.def.impl.ObjectDefinition; +import core.game.content.global.action.DoorActionHandler; +import core.plugin.Initializable; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.plugin.Plugin; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a pickable door. + * @author Vexia + */ +@Initializable +public class PickableDoorHandler extends OptionHandler { + /** + * The lock pick item. + */ + private static final Item LOCK_PICK = new Item(1523); + + private static final List pickableDoors = new ArrayList<>(); + + private static final int[] DOORS = new int[]{42028, 2550, 2551, 2554, 2555, 2556, 2557, 2558, 2559, 5501, 7246, 9565, 13314, 13317, 13320, 13323, 13326, 13344, 13345, 13346, 13347, 13348, 13349, 15759, 34005, 34805, 34806, 34812}; + + PickableDoor door; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + for (int i : DOORS) { + ObjectDefinition.forId(i).getHandlers().put("option:pick-lock", this); + ObjectDefinition.forId(i).getHandlers().put("option:open", this); + } + pickableDoors.add(new PickableDoor(new Location[]{Location.create(2672, 3308, 0)}, 1, 3.8)); + pickableDoors.add(new PickableDoor(new Location[]{Location.create(2672, 3301, 0)}, 14, 15)); + pickableDoors.add(new PickableDoor(new Location[]{Location.create(2610, 3316, 0)}, 15, 15)); + pickableDoors.add(new PickableDoor(new Location[]{Location.create(3190, 3957, 0)}, 32, 25, true)); + pickableDoors.add(new PickableDoor(new Location[]{Location.create(2565, 3356, 0)}, 46, 37.5)); + pickableDoors.add(new PickableDoor(new Location[]{Location.create(2579, 3286, 1)}, 61, 50)); + pickableDoors.add(new PickableDoor(new Location[]{Location.create(3018, 3187, 0)}, 1, 0.0)); + pickableDoors.add(new PickableDoor(new Location[]{Location.create(2601, 9482, 0)}, 82, 0.0, true)); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + door = forDoor(node.getLocation()); + if (option.equals("open")) { + if (door == null) { + player.getPacketDispatch().sendMessage("The door is locked."); + return true; + } + door.open(player, (GameObject) node); + return true; + } + if (option.equals("pick-lock")) { + door.pickLock(player, (GameObject) node); + return true; + } + System.out.println("Unhandled door: " + node.getId()); + return false; + } + + @Override + public Location getDestination(Node node, Node n) { + if (n instanceof GameObject) { + GameObject object = (GameObject) n; + if (object.getDefinition().hasAction("pick-lock")) { + return DoorActionHandler.getDestination((Entity) node, object); + } + } + return null; + } + + private PickableDoor forDoor(Location location) { + for (PickableDoor door : pickableDoors) { + for (Location l : door.getLocations()) { + if (l.equals(location)) { + return door; + } + } + } + return null; + } + + public class PickableDoor{ + /** + * The locations of the door. + */ + private final Location[] locations; + + /** + * The level. + */ + private final int level; + + /** + * The experience required. + */ + private final double experience; + + /** + * If it requires a lockpick. + */ + private final boolean lockpick; + + /** + * Constructs a new {@code PickableDoor} {@code Object}. + * @param locations the locations. + * @param level the level. + * @param experience the experience. + * @param lockpick the lock pick. + */ + public PickableDoor(final Location[] locations, int level, double experience, boolean lockpick) { + this.locations = locations; + this.level = level; + this.experience = experience; + this.lockpick = lockpick; + } + + /** + * Constructs a new {@code PickableDoor} {@code Object}. + * @param level the level. + * @param experience the experience. + */ + public PickableDoor(Location[] locations, int level, double experience) { + this(locations, level, experience, false); + } + + /** + * Gets the location. + * @return The location. + */ + public Location[] getLocations() { + return locations; + } + + /** + * Opens a pickable door. + * @param player the player. + * @param object the object. + */ + public void open(Player player, GameObject object) { + if (isInside(player, object)) { + DoorActionHandler.handleAutowalkDoor(player, object); + player.getPacketDispatch().sendMessage("You go through the door."); + } else { + player.getPacketDispatch().sendMessage("The door is locked."); + } + } + + /** + * Picks a lock on a door. + * @param player the player. + * @param object the object. + */ + public void pickLock(Player player, GameObject object) { + boolean success = RandomFunction.random(12) >= 4; + if (isInside(player, object)) { + player.getPacketDispatch().sendMessage("The door is already unlocked."); + return; + } + if (player.getSkills().getLevel(Skills.THIEVING) < level) { + player.sendMessage("You attempt to pick the lock."); + boolean hit = RandomFunction.random(10) < 5; + player.getImpactHandler().manualHit(player, RandomFunction.random(1, 3), ImpactHandler.HitsplatType.NORMAL); + player.sendMessage(hit ? "You have activated a trap on the lock." : "You fail to pick the lock."); + return; + } + if (lockpick && !player.getInventory().containsItem(LOCK_PICK)) { + player.sendMessage("You need a lockpick in order to pick this lock."); + return; + } + if (success) { + player.getSkills().addExperience(Skills.THIEVING, experience, true); + DoorActionHandler.handleAutowalkDoor(player, object); + } + player.getPacketDispatch().sendMessage("You attempt to pick the lock."); + player.getPacketDispatch().sendMessage("You " + (success ? "manage" : "fail") + " to pick the lock."); + } + + /** + * Checks if we're behind the door/inside the building. + * @param player the player. + * @param object the object. + * @return {@code True} if so. + */ + private boolean isInside(Player player, GameObject object) { + boolean inside = false; + Direction dir = Direction.getLogicalDirection(player.getLocation(), object.getLocation()); + Direction direction = object.getDirection(); + if (direction == Direction.SOUTH && dir == Direction.WEST) { + inside = true; + } else if (direction == Direction.EAST && dir == Direction.SOUTH) { + inside = true; + } else if (direction == Direction.NORTH && dir == Direction.EAST) { + inside = true; + } + return inside; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the lockpick. + * @return The lockpick. + */ + public boolean isLockpick() { + return lockpick; + } + } + +} + diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/thieving/Pickpocket.kt b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/Pickpocket.kt new file mode 100644 index 000000000..404f87cad --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/Pickpocket.kt @@ -0,0 +1,321 @@ +package core.game.node.entity.skill.thieving + +import core.game.node.entity.npc.NPC +import core.game.node.entity.npc.drop.DropFrequency +import core.game.node.entity.player.Player +import core.game.node.item.ChanceItem +import core.game.node.item.Item +import core.tools.RandomFunction +import core.game.content.ttrail.ClueLevel +import core.game.content.ttrail.ClueScrollPlugin +import java.util.* +import java.util.stream.IntStream + +/** + * Represents a pickpocket npc. + * @author Ceikry + */ +enum class Pickpocket(val npc: IntArray, val level: Int, val experience: Double, val stunDamage: Int, val loot: Array) { + MAN(intArrayOf(1, 2, 3, 4, 5, 6, 16, 24, 170, 3915), 1, 8.0, 1, arrayOf( + ChanceItem(995, 3, DropFrequency.ALWAYS) + )), + FARMER(intArrayOf(7, 1757, 1758), 10, 14.5, 1, arrayOf( + ChanceItem(995, 9, DropFrequency.COMMON), + ChanceItem(5318, 1, DropFrequency.UNCOMMON) + )), + MALE_HAM_MEMBER(intArrayOf(1714), 20, 18.5, 1, arrayOf( + ChanceItem(995, 20, DropFrequency.COMMON), + ChanceItem(995, 3, DropFrequency.COMMON), + ChanceItem(590, 1, DropFrequency.COMMON), + ChanceItem(697, 1, DropFrequency.COMMON), + ChanceItem(1511, 1, DropFrequency.COMMON), + ChanceItem(201, 1, DropFrequency.COMMON), + ChanceItem(203, 1, DropFrequency.COMMON), + ChanceItem(205, 1, DropFrequency.COMMON), + ChanceItem(688, 1, DropFrequency.COMMON), + ChanceItem(1269, 1, DropFrequency.COMMON), + ChanceItem(1267, 1, DropFrequency.COMMON), + ChanceItem(1353, 1, DropFrequency.COMMON), + ChanceItem(199, 1, DropFrequency.COMMON), + ChanceItem(321, 1, DropFrequency.COMMON), + ChanceItem(2138, 1, DropFrequency.COMMON), + ChanceItem(1621, 1, DropFrequency.UNCOMMON), + ChanceItem(1623, 1, DropFrequency.UNCOMMON), + ChanceItem(995, 50, DropFrequency.UNCOMMON), + ChanceItem(453, 1, DropFrequency.UNCOMMON), + ChanceItem(4298, 1, DropFrequency.RARE), + ChanceItem(4300, 1, DropFrequency.RARE), + ChanceItem(4302, 1, DropFrequency.RARE), + ChanceItem(4304, 1, DropFrequency.RARE), + ChanceItem(4306, 1, DropFrequency.RARE), + ChanceItem(4308, 1, DropFrequency.RARE), + ChanceItem(995, 100, DropFrequency.RARE), + ChanceItem(4310, 1, DropFrequency.RARE), + ChanceItem(1625, 1, DropFrequency.RARE) + )), + FEMALE_HAM_MEMBER(intArrayOf(1715), 15, 18.5, 1, arrayOf( + ChanceItem(995, 20, DropFrequency.COMMON), + ChanceItem(995, 3, DropFrequency.COMMON), + ChanceItem(590, 1, DropFrequency.COMMON), + ChanceItem(697, 1, DropFrequency.COMMON), + ChanceItem(1511, 1, DropFrequency.COMMON), + ChanceItem(201, 1, DropFrequency.COMMON), + ChanceItem(203, 1, DropFrequency.COMMON), + ChanceItem(205, 1, DropFrequency.COMMON), + ChanceItem(688, 1, DropFrequency.COMMON), + ChanceItem(1269, 1, DropFrequency.COMMON), + ChanceItem(1267, 1, DropFrequency.COMMON), + ChanceItem(1353, 1, DropFrequency.COMMON), + ChanceItem(199, 1, DropFrequency.COMMON), + ChanceItem(321, 1, DropFrequency.COMMON), + ChanceItem(2138, 1, DropFrequency.COMMON), + ChanceItem(1621, 1, DropFrequency.UNCOMMON), + ChanceItem(1623, 1, DropFrequency.UNCOMMON), + ChanceItem(995, 50, DropFrequency.UNCOMMON), + ChanceItem(453, 1, DropFrequency.UNCOMMON), + ChanceItem(4298, 1, DropFrequency.RARE), + ChanceItem(4300, 1, DropFrequency.RARE), + ChanceItem(4302, 1, DropFrequency.RARE), + ChanceItem(4304, 1, DropFrequency.RARE), + ChanceItem(4306, 1, DropFrequency.RARE), + ChanceItem(4308, 1, DropFrequency.RARE), + ChanceItem(995, 100, DropFrequency.RARE), + ChanceItem(4310, 1, DropFrequency.RARE), + ChanceItem(1625, 1, DropFrequency.RARE) + )), + WARRIOR(intArrayOf(15, 18), 25, 26.0, 2, arrayOf( + ChanceItem(995, 18, DropFrequency.ALWAYS) + )), + ROGUE(intArrayOf(187, 2267, 2268, 2269, 8122), 32, 35.5, 2, arrayOf( + ChanceItem(995, 25, DropFrequency.COMMON), + ChanceItem(995, 40, DropFrequency.COMMON), + ChanceItem(1993, 1, DropFrequency.COMMON), + ChanceItem(556, 1, DropFrequency.COMMON), + ChanceItem(1219, 1, DropFrequency.COMMON), + ChanceItem(1523, 1, DropFrequency.COMMON), + ChanceItem(1944, 1, DropFrequency.COMMON) + )), + CAVE_GOBLIN(IntStream.rangeClosed(5752, 5768).toArray(), 36, 40.0, 2, arrayOf( + ChanceItem(995, 1, 30, DropFrequency.COMMON), + ChanceItem(4522, 1, DropFrequency.UNCOMMON), + ChanceItem(4544, 1, DropFrequency.UNCOMMON), + ChanceItem(596, 1, DropFrequency.COMMON), + ChanceItem(1939, 1, DropFrequency.UNCOMMON), + ChanceItem(442, 1, 4, DropFrequency.UNCOMMON), + ChanceItem(441, 1, DropFrequency.COMMON), + ChanceItem(10981, 1, DropFrequency.RARE) + )), + MASTER_FARMER(intArrayOf(2234, 2235), 38, 43.0, 3, arrayOf( + ChanceItem(5096, 1, DropFrequency.COMMON), + ChanceItem(5097, 1, DropFrequency.COMMON), + ChanceItem(5098, 1, DropFrequency.COMMON), + ChanceItem(5099, 1, DropFrequency.COMMON), + ChanceItem(5100, 1, DropFrequency.COMMON), + ChanceItem(5101, 1, DropFrequency.COMMON), + ChanceItem(5102, 1, DropFrequency.COMMON), + ChanceItem(5103, 1, DropFrequency.COMMON), + ChanceItem(5104, 1, DropFrequency.COMMON), + ChanceItem(5105, 1, DropFrequency.COMMON), + ChanceItem(5106, 1, DropFrequency.COMMON), + ChanceItem(5291, 1, DropFrequency.UNCOMMON), + ChanceItem(5292, 1, DropFrequency.UNCOMMON), + ChanceItem(5293, 1, DropFrequency.UNCOMMON), + ChanceItem(5294, 1, DropFrequency.UNCOMMON), + ChanceItem(5295, 1, DropFrequency.UNCOMMON), + ChanceItem(5296, 1, DropFrequency.UNCOMMON), + ChanceItem(5297, 1, DropFrequency.UNCOMMON), + ChanceItem(5298, 1, DropFrequency.UNCOMMON), + ChanceItem(5299, 1, DropFrequency.UNCOMMON), + ChanceItem(5300, 1, DropFrequency.UNCOMMON), + ChanceItem(5301, 1, DropFrequency.UNCOMMON), + ChanceItem(5302, 1, DropFrequency.UNCOMMON), + ChanceItem(5303, 1, DropFrequency.UNCOMMON), + ChanceItem(5304, 1, DropFrequency.UNCOMMON) + )), + GUARD(intArrayOf(9, 32, 206, 296, 297, 298, 299, 344, 345, 346, 368, 678, 812, 9, 32, 296, 297, 298, 299, 2699, 2700, 2701, 2702, 2703, 3228, 3229, 3230, 3231, 3232, 3233, 3241, 3407, 3408, 4307, 4308, 4309, 4310, 4311, 5919, 5920), 40, 46.5, 2, arrayOf( + ChanceItem(995, 30, DropFrequency.ALWAYS) + )), + FREMENIK_CITIZEN(intArrayOf(2462), 45, 65.0, 2, arrayOf( + ChanceItem(995, 40, DropFrequency.ALWAYS) + )), + BEARDED_BANDIT(intArrayOf(1880, 1881, 6174), 45, 65.0, 5, arrayOf( + ChanceItem(995, 40, DropFrequency.ALWAYS) + )), + DESERT_BANDIT(intArrayOf(1926, 1921), 53, 79.5, 3, arrayOf( + ChanceItem(995, 30, DropFrequency.ALWAYS) + )), + KNIGHT_OF_ADROUGNE(intArrayOf(23, 26), 55, 84.3, 3, arrayOf( + ChanceItem(995, 50, DropFrequency.ALWAYS) + )), + YANILLE_WATCHMAN(intArrayOf(34), 65, 137.5, 5, arrayOf( + ChanceItem(995, 60, DropFrequency.ALWAYS) + )), + MENAPHITE_THUG(intArrayOf(1905), 65, 137.5, 5, arrayOf( + ChanceItem(995, 60, DropFrequency.ALWAYS) + )), + PALADIN(intArrayOf(20, 2256), 70, 151.75, 3, arrayOf( + ChanceItem(995, 80, DropFrequency.ALWAYS), + ChanceItem(562, 1, 2, DropFrequency.ALWAYS) + )), + MONKEY_KNIFE_FIGHTER(intArrayOf(13195, 13212, 13213), 70, 150.0, 1, arrayOf( + ChanceItem(995, 1, DropFrequency.COMMON), + ChanceItem(995, 50, DropFrequency.UNCOMMON), + ChanceItem(869, 1, 4, DropFrequency.COMMON), + ChanceItem(874, 1, 2, DropFrequency.COMMON), + ChanceItem(379, 1, DropFrequency.COMMON), + ChanceItem(1331, 1, DropFrequency.COMMON), + ChanceItem(1333, 1, DropFrequency.COMMON), + ChanceItem(4587, 1, DropFrequency.COMMON) + )), + GNOME(intArrayOf(66, 67, 68, 168, 169, 2249, 2250, 2251, 2371, 2649, 2650, 6002, 6004), 75, 198.5, 1, arrayOf( + ChanceItem(995, 1, 300, DropFrequency.COMMON), + ChanceItem(557, 1, DropFrequency.COMMON), + ChanceItem(444, 1, DropFrequency.COMMON), + ChanceItem(569, 1, DropFrequency.COMMON), + ChanceItem(2150, 1, DropFrequency.COMMON), + ChanceItem(2162, 1, DropFrequency.COMMON) + )), + HERO(intArrayOf(21), 80, 273.3, 5, arrayOf( + ChanceItem(995, 1, 200, DropFrequency.COMMON), + ChanceItem(995, 1, 300, DropFrequency.UNCOMMON), + ChanceItem(560, 1, 2, DropFrequency.COMMON), + ChanceItem(565, 1, DropFrequency.COMMON), + ChanceItem(569, 1, DropFrequency.COMMON), + ChanceItem(1601, 1, DropFrequency.COMMON), + ChanceItem(444, 1, DropFrequency.COMMON), + ChanceItem(1993, 1, DropFrequency.COMMON) + )), + ELF(intArrayOf(), 85, 353.0, 5, arrayOf( + ChanceItem(995, 250, DropFrequency.COMMON), + ChanceItem(995, 350, DropFrequency.COMMON), + ChanceItem(995, 300, DropFrequency.COMMON) + )), + DWARF_TRADER(intArrayOf(2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126), 90, 556.5, 1, arrayOf( + ChanceItem(995, 1, 100, DropFrequency.COMMON), + ChanceItem(995, 1, 400, DropFrequency.COMMON), + ChanceItem(2350, 1, DropFrequency.COMMON), + ChanceItem(2352, 1, DropFrequency.COMMON), + ChanceItem(2354, 1, DropFrequency.COMMON), + ChanceItem(2360, 1, DropFrequency.COMMON), + ChanceItem(2362, 1, DropFrequency.COMMON), + ChanceItem(2364, 1, DropFrequency.COMMON), + ChanceItem(437, 1, DropFrequency.COMMON), + ChanceItem(439, 1, DropFrequency.COMMON), + ChanceItem(441, 1, DropFrequency.COMMON), + ChanceItem(448, 1, DropFrequency.COMMON), + ChanceItem(450, 1, DropFrequency.COMMON), + ChanceItem(452, 1, DropFrequency.COMMON), + ChanceItem(454, 1, DropFrequency.COMMON) + )), + MARTIN_THE_MASTER_GARDENER(intArrayOf(3299), 38, 43.0, 3, arrayOf( + ChanceItem(5318, 1, 4, DropFrequency.COMMON), + ChanceItem(5319, 1, 3, DropFrequency.COMMON), + ChanceItem(5324, 1, 3, DropFrequency.COMMON), + ChanceItem(5322, 1, 2, DropFrequency.COMMON), + ChanceItem(5320, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5323, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5321, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5096, 1, 1, DropFrequency.COMMON), + ChanceItem(5097, 1, 1, DropFrequency.COMMON), + ChanceItem(5098, 1, 1, DropFrequency.COMMON), + ChanceItem(5099, 1, 2, DropFrequency.COMMON), + ChanceItem(5100, 1, 1, DropFrequency.COMMON), + ChanceItem(5305, 1, 4, DropFrequency.COMMON), + ChanceItem(5307, 1, 3, DropFrequency.COMMON), + ChanceItem(5308, 1, 2, DropFrequency.COMMON), + ChanceItem(5306, 1, 3, DropFrequency.COMMON), + ChanceItem(5319, 1, 3, DropFrequency.COMMON), + ChanceItem(5309, 1, 2, DropFrequency.COMMON), + ChanceItem(5310, 1, 1, DropFrequency.COMMON), + ChanceItem(5311, 1, 1, DropFrequency.COMMON), + ChanceItem(5101, 1, 1, DropFrequency.COMMON), + ChanceItem(5102, 1, 1, DropFrequency.COMMON), + ChanceItem(5103, 1, 1, DropFrequency.COMMON), + ChanceItem(5104, 1, 2, DropFrequency.COMMON), + ChanceItem(5105, 1, 1, DropFrequency.COMMON), + ChanceItem(5106, 1, 1, DropFrequency.COMMON), + ChanceItem(5291, 1, 1, DropFrequency.COMMON), + ChanceItem(5292, 1, 1, DropFrequency.COMMON), + ChanceItem(5293, 1, 1, DropFrequency.COMMON), + ChanceItem(5294, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5295, 1, 1, DropFrequency.RARE), + ChanceItem(5296, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5297, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5298, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5299, 1, 1, DropFrequency.RARE), + ChanceItem(5300, 1, 1, DropFrequency.VERY_RARE), + ChanceItem(5301, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5302, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5303, 1, 1, DropFrequency.RARE), + ChanceItem(5304, 1, 1, DropFrequency.VERY_RARE), + ChanceItem(5282, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5280, 1, 1, DropFrequency.UNCOMMON), + ChanceItem(5281, 1, 1, DropFrequency.UNCOMMON) + )); + + companion object { + private val idMap = HashMap() + @JvmStatic + fun forNPC(npc: NPC): Pickpocket { + var pp = idMap[npc.id] + if (pp == null) { + println("Unhandled pickpocket option for: " + npc.name + "(" + npc.id + ")") + pp = MAN + } + return pp + } + + init { + Arrays.stream(values()).forEach{entry -> Arrays.stream(entry.npc).forEach{id -> idMap.putIfAbsent(id,entry)}} + } + } + + private val messages: Array = arrayOf( + "You attempt to pick the " + "@name" + "'s pocket...", + "You pick the " + "@name" + "'s pocket.", + "You fail to pick the " + "@name" + "'s pocket.", + "What do you think you're doing?" + ) + + val startMessage: String + get() = messages[0] + + val rewardMessage: String + get() = messages[1] + + val failMessage: String + get() = messages[2] + + val forceMessage: String + get() = messages[3] + + fun getRandomLoot(player: Player): List { + // 5/250 chance for easy clue scroll + if ((this == MALE_HAM_MEMBER || this == FEMALE_HAM_MEMBER) && RandomFunction.random(250) <= 5 && !player.treasureTrailManager.hasClue()) { + return ArrayList(listOf((ClueScrollPlugin.getClue(ClueLevel.EASY)))) + } + val loot = RandomFunction.rollChanceTable(true, *loot) + + // Calculate any bonus multipliers + var bonusMultiplier = 1 + var rogueItemsWorn = 0 + val rogueItemIds = intArrayOf(5553, 5554, 5555, 5556, 5557) + + // Figure out how many rogue equipment pieces are worn + rogueItemIds.forEach { + if(player.equipment.contains(it, 1)){ + rogueItemsWorn += 1 + } + } + + // Calculate if the player will get double the loot for this pickpocket + if(RandomFunction.random(0.0, 1.0) <= 0.2 * rogueItemsWorn){ + bonusMultiplier += 1 + } + + // Multiply the loot amounts by the bonus multiplier + loot.stream().forEach { item: Item -> item.amount = item.amount * bonusMultiplier } + return loot + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/thieving/PickpocketPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/PickpocketPulse.java new file mode 100644 index 000000000..ecb53fccc --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/PickpocketPulse.java @@ -0,0 +1,202 @@ +package core.game.node.entity.skill.thieving; + +import core.game.world.map.zone.ZoneBorders; +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.audio.Audio; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.entity.state.EntityState; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; + +import java.util.List; + +/** + * Represents the pulse used to pickpocket an npc. + * + * @author Vexia + */ +public final class PickpocketPulse extends SkillPulse { + + /** + * Represents the animation specific to pickpocketing. + */ + private static final Animation ANIMATION = new Animation(881); + + /** + * Represents the npc animation. + */ + private static final Animation NPC_ANIM = new Animation(422); + + /** + * Represents the animation specific to pickpocketing. + */ + private static final Animation STUN_ANIMATION = new Animation(424); + + /** + * Represents the sound to send when failed. + */ + private static final Audio SOUND = new Audio(2727, 1, 0); + + /** + * Represents the pickpocket type. + */ + private final Pickpocket type; + + /** + * Represents the tickets to be rewarded. + */ + private int ticks; + + /** + * Constructs a new {@code PickpocketPulse} {@code Object}. + * + * @param player the player. + * @param node the node. + * @param type the type. + */ + public PickpocketPulse(Player player, NPC node, final Pickpocket type) { + super(player, node); + this.type = type; + this.resetAnimation = false; + } + + @Override + public boolean checkRequirements() { + if (!interactable() && !player.getLocks().isInteractionLocked()) { + return false; + } + if (player.getSkills().getLevel(Skills.THIEVING) < type.getLevel()) { + player.getPacketDispatch().sendMessage("You need to be a level " + type.getLevel() + " thief in order to pick this pocket."); + return false; + } + if (!hasInventorySpace()) { + player.getPacketDispatch().sendMessage("You do not have enough space in your inventory to pick this pocket."); + return false; + } + player.getLocks().lockInteractions(2); + player.faceTemporary(node, 2); + node.getWalkingQueue().reset(); + node.getLocks().lockMovement(1); + return true; + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + if (ticks == 0) { + player.animate(ANIMATION); + } + if (++ticks % 2 != 0) { + return false; + } + final boolean success = success(); + if (success) { + player.getPacketDispatch().sendMessage(type.getRewardMessage().replace("@name", node.getName().toLowerCase())); + player.getSkills().addExperience(Skills.THIEVING, type.getExperience(), true); + List loot = type.getRandomLoot(player); + loot.stream().forEach(item -> { + if (!player.getInventory().add(item)) { + GroundItemManager.create(item, player.getLocation(), player); + } + }); + if (type == Pickpocket.GUARD && node.getId() == 9) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 1, 6); + } + if (type == Pickpocket.GUARD && node.getId() == 5920 + && new ZoneBorders(3202, 3459, 3224, 3470, 0).insideBorder(player)) { + player.getAchievementDiaryManager().finishTask(player, DiaryType.VARROCK, 1, 12); + } + player.getLocks().unlockInteraction(); + } else { + node.animate(NPC_ANIM); + node.faceTemporary(player, 1); + node.sendChat(type.getForceMessage()); + player.animate(STUN_ANIMATION); + player.getAudioManager().send(new Audio(1842)); + player.getStateManager().set(EntityState.STUNNED, 4); + player.getAudioManager().send(SOUND); + player.setAttribute("thief-delay", GameWorld.getTicks() + 4); + player.getImpactHandler().manualHit(player, type.getStunDamage(), HitsplatType.NORMAL); + player.getPacketDispatch().sendMessage(type.getFailMessage().replace("@name", node.getName().toLowerCase())); + } + return true; + } + + @Override + public void stop() { + super.stop(); + } + + @Override + public void message(int type) { + switch (type) { + case 0: + player.getPacketDispatch().sendMessage(this.type.getStartMessage().replace("@name", node.getName().toLowerCase())); + break; + } + } + + /** + * Checks if the npc is interable. + * + * @return {@code True} if so. + */ + private boolean interactable() { + if (DeathTask.isDead(((Entity) node)) || ((NPC) node).isHidden(player) || !node.isActive() || player.getAttribute("thief-delay", 0) > GameWorld.getTicks()) { + return false; + } else if (player.inCombat()) { + player.getPacketDispatch().sendMessage("You can't pickpocket during combat."); + return false; + } else if (!hasInventorySpace()) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return false; + } + return true; + } + + /** + * Checks if the pickpocket is a success. + * + * @return {@code True} if so. + */ + private boolean success() { + double level = player.getSkills().getLevel(Skills.THIEVING); + double req = type.getLevel(); + double successChance = Math.ceil((level * 50 - req * 15) / req / 3 * 4); + int roll = RandomFunction.random(99); + if (RandomFunction.random(12) < 2) { + return false; + } + if (successChance >= roll) { + return true; + } + return false; + } + + /** + * Checks if player has enough inventory space to pickpocket npc. + * @return {@code True} if player has enough inventory space. + */ + private boolean hasInventorySpace() { + if (player.getInventory().isFull() && type.getLoot().length > 0) { + if (!(type.getLoot().length == 1 && player.getInventory().hasSpaceFor( + new Item(type.getLoot()[0].getId(), type.getLoot()[0].getMaximumAmount())))) { + return false; + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/thieving/Stall.java b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/Stall.java new file mode 100644 index 000000000..53225b659 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/Stall.java @@ -0,0 +1,93 @@ +package core.game.node.entity.skill.thieving; + +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.tools.RandomFunction; + +import java.util.*; + +/** + * Represents a thieving stall. + * @author Ceikry, Woahscam + */ +public enum Stall { + VEGETABLE_STALL(new Integer[]{4706, 4708}, new Integer[] { 634 }, 2, new Item[]{new Item(1957, 1), new Item(1965, 1), new Item(1942, 1), new Item(1982, 1), new Item(1550, 1)}, 10, 4,"vegetables"), + BAKER_STALL(new Integer[]{2561, 6163, 34384}, new Integer[] { 634, 6984, 34381 }, 5, new Item[]{new Item(1891, 1), new Item(2309, 1), new Item(1901, 1)}, 16, 4,"pastries"), + CRAFTING_STALL(new Integer[]{4874, 6166}, new Integer[] { 4797, 6984 }, 5, new Item[]{new Item(1592, 1), new Item(1597, 1), new Item(1755, 1)}, 16, 12,"crafting supplies"), + TEA_STALL(new Integer[]{635, 6574}, new Integer[] { 634, 6573 }, 5, new Item[]{new Item(712, 1)}, 16, 12,"tea"), + SILK_STALL(new Integer[]{34383, 2560}, new Integer[] { 34381, 634 }, 20, new Item[]{new Item(950, 1)}, 24, 13,"silk"), + WINE_STALL(new Integer[]{2046}, new Integer[] { 634 }, 22, new Item[]{new Item(1935, 1), new Item(1937, 1), new Item(1993, 1), new Item(7919, 1)}, 27, 27,"wine"), //OBJECT MISSING IN CACHE + MARKET_SEED_STALL(new Integer[]{7053}, new Integer[] { 634 }, 27, new Item[]{new Item(5096, 1), new Item(5097, 1), new Item(5101, 1), new Item(5318, 1), new Item(5319, 1), new Item(5324, 1)}, 10, 19,"seeds"), + FUR_STALL(new Integer[]{34387, 2563}, new Integer[] { 34381, 634 }, 35, new Item[]{new Item(6814, 1), new Item(958, 1)}, 36, 25,"fur"), + FISH_STALL(new Integer[]{4277, 4705, 4707}, new Integer[] { 634 }, 42, new Item[]{new Item(331, 1), new Item(359, 1), new Item(377, 1)}, 42, 27,"fish"), + CROSSBOW_STALL(new Integer[]{17031}, new Integer[] { 6984 }, 49, new Item[]{new Item(877, 3), new Item(9420, 1), new Item(9440, 1)}, 52, 19,"equipment"), + SILVER_STALL(new Integer[]{2565, 6164, 34382}, new Integer[] { 634, 6984, 34381}, 50, new Item[]{new Item(442, 1)}, 54, 50,"jewellery"), + SPICE_STALL(new Integer[]{6166}, new Integer[] { 6984 }, 65, new Item[]{new Item(2007, 1)}, 16, 134,"spices"), + GEM_STALL(new Integer[]{2562, 6162, 34385}, new Integer[] { 634, 6984, 34381 }, 75, new Item[]{new Item(1623, 1), new Item(1605, 1), new Item(1603, 1), new Item(1601, 1)}, 160, 300,"gems"), + //Ape Atoll Stalls + SCIMITAR_STALL(new Integer[]{4878}, new Integer[] { 4797 }, 65, new Item[]{new Item(1323, 1)}, 100, 134,"equipment"), + MAGIC_STALL(new Integer[]{4877}, new Integer[] { 4797 }, 65, new Item[]{new Item(556, 1), new Item(557, 1), new Item(554, 1), new Item(555, 1), new Item(563, 1)}, 100, 134,"equipment"), + GENERAL_STALL(new Integer[]{4876}, new Integer[] { 4797 }, 5, new Item[]{new Item(1931, 1), new Item(2347, 1), new Item(590, 1)}, 16, 12,"goods"), + FOOD_STALL(new Integer[]{4875}, new Integer[] { 4797 }, 5, new Item[]{new Item(1963, 1)}, 16, 12,"food"); + //CRAFTING_STALL (Ape Atoll) shares same drops/exp as regular crafting stall + + //Quest Stalls Rocking Out + //CUSTOMS_EVIDENCE_FILES(new Integer[]{FIND OBJ ID}, FIND OBJ EMPTY ID, 63, new Item[]{new Item(1333, 1), new Item(1617, 1), new Item(1619, 1), new Item(1623, 1), new Item(385, 1), new Item(2359, 1), new Item(2357, 1), new Item(2351, 1), new Item(7114, 1), new Item(7134, 1), new Item(1025, 1), new Item(1281, 1), new Item(1325, 1), new Item(1323, 1), new Item(1321, 1), new Item(995, 300)}, 75, 100); + + public static HashMap idMap = new HashMap<>(); + static{ + Arrays.stream(Stall.values()).forEach(entry -> entry.full_ids.stream().forEach(id -> idMap.putIfAbsent(id, entry))); + } + + List full_ids; + List empty_ids; + int level, delay; + Item[] rewards; + double experience; + String msgItem; + + Stall(Integer[] full_ids, Integer[] empty_ids, int level, Item[] rewards, double experience, int delay, String msgItem) { + this.full_ids = new ArrayList(Arrays.asList(full_ids)); + this.empty_ids = new ArrayList(Arrays.asList(empty_ids)); + this.level = level; + this.delay = delay; + this.rewards = rewards; + this.experience = experience; + this.msgItem = msgItem; + } + + + + public List getFullIDs() { + return full_ids; + } + + public int getLevel() { + return level; + } + + public Item[] getRewards() { + return rewards; + } + + public double getExperience() { + return experience; + } + + public int getEmpty(int id) { + int fullIndex = full_ids.indexOf(id); + return this.empty_ids.get(fullIndex); + } + + public int getDelay() { + return delay; + } + + public Item getRandomLoot() { + return rewards[RandomFunction.random(rewards.length)]; + } + + public static Stall forObject(final GameObject object) { + return idMap.get(object.getId()); + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/thieving/StallThiefPulse.java b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/StallThiefPulse.java new file mode 100644 index 000000000..d8e3b2d0e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/StallThiefPulse.java @@ -0,0 +1,147 @@ +package core.game.node.entity.skill.thieving; + +import core.game.node.entity.skill.SkillPulse; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.diary.DiaryType; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.context.Animation; +import core.tools.RandomFunction; +import core.tools.StringUtils; + +/** + * Represents the pulse used to thieve a stall. + * @author 'Vexia + */ +public final class StallThiefPulse extends SkillPulse { + + /** + * Represents the stealing animation. + */ + private static final Animation ANIMATION = new Animation(832); + + /** + * Represents the stall being thieved. + */ + private final Stall stall; + + /** + * Represents the ticks passed. + */ + private int ticks; + + /** + * Constructs a new {@code StallThiefPulse} {@code Object}. + * @param player the player. + * @param node the node. + * @param stall the stall. + */ + public StallThiefPulse(Player player, GameObject node, final Stall stall) { + super(player, node); + this.stall = stall; + } + + @Override + public void start() { + player.setAttribute("thieveDelay", GameWorld.getTicks()); + super.start(); + } + + @Override + public boolean checkRequirements() { + if (stall == null) { + return false; + } + if (player.inCombat()) { + player.getPacketDispatch().sendMessage("You cant steal from the market stall during combat!"); + return false; + } + if (player.getSkills().getLevel(Skills.THIEVING) < stall.getLevel()) { + player.getPacketDispatch().sendMessage("You need to be level " + stall.getLevel() + " to steal from the " + node.getName().toLowerCase() + "."); + return false; + } + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("You don't have enough inventory space."); + return false; + } + return true; + } + + @Override + public boolean hasInactiveNode() { + if (player.getAttribute("thieveDelay", 0) <= GameWorld.getTicks()) { + return false; + } + return super.hasInactiveNode(); + } + + @Override + public void animate() { + } + + @Override + public boolean reward() { + if (ticks == 0) { + player.animate(ANIMATION); + player.getLocks().lockInteractions(2); + } + if (++ticks % 3 != 0) { + return false; + } + final boolean success = success(); + if (success) { + if (stall == Stall.SILK_STALL) { + player.getSavedData().getGlobalData().setSilkSteal(System.currentTimeMillis() + 1800000); + } + if (stall == Stall.TEA_STALL && player.getLocation().withinDistance(new Location(3266, 3413, 0))) { + player.getAchievementDiaryManager().finishTask(player,DiaryType.VARROCK,0, 12); + } + if (node.isActive()) { + ObjectBuilder.replace(((GameObject) node), ((GameObject) node).transform(stall.getEmpty(node.getId())), stall.getDelay()); + } + final Item item = stall.getRandomLoot(); + player.getInventory().add(item); + player.getSkills().addExperience(Skills.THIEVING, stall.getExperience(), true); + if (item.getId() == 1987) { + player.getPacketDispatch().sendMessage("You steal grapes from the grape stall."); + return true; + } + player.getPacketDispatch().sendMessage("You steal " + (StringUtils.isPlusN(item.getName()) ? "an" : "a") + " " + item.getName().toLowerCase() + " from the " + stall.name().toLowerCase().replace('_',' ') + "."); + } + return true; + } + + @Override + public void message(int type) { + switch (type) { + case 0: + player.getPacketDispatch().sendMessage("You attempt to steal some " + stall.msgItem + " from the " + stall.name().toLowerCase().replace('_',' ')); + break; + } + } + + /** + * Checks if the thief is successful. + * @return {@code True} if so. + */ + private boolean success() { + int mod = 0; + if (RandomFunction.random(15 + mod) < 4) { + for (NPC npc : RegionManager.getLocalNpcs(player.getLocation(), 8)) { + if (!npc.getProperties().getCombatPulse().isAttacking() && (npc.getId() == 32 || npc.getId() == 2236)) { + npc.sendChat("Hey! Get your hands off there!"); + npc.getProperties().getCombatPulse().attack(player); + return false; + } + } + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/thieving/ThievableChestPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/ThievableChestPlugin.java new file mode 100644 index 000000000..7fcc4a09a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/ThievableChestPlugin.java @@ -0,0 +1,280 @@ +package core.game.node.entity.skill.thieving; + +import core.cache.def.impl.ObjectDefinition; +import core.game.node.entity.skill.Skills; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.node.object.ObjectBuilder; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.Animation; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Handles the thieving of chests. + * @author Vexia + */ +@Initializable +public final class ThievableChestPlugin extends OptionHandler { + /** + * The lock pick item. + */ + private static final Item LOCK_PICK = new Item(1523); + + @Override + public Plugin newInstance(Object arg) throws Throwable { + + for (Chest chest : Chest.values()) { + for (int id : chest.getObjectIds()) { + ObjectDefinition def = ObjectDefinition.forId(id); + def.getHandlers().put("option:open", this); + def.getHandlers().put("option:search for traps", this); + } + } + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Chest chest = Chest.forId(node.getId()); + switch (option) { + case "open": + if (chest != null) { + chest.open(player, (GameObject) node); + return true; + } + return true; + case "search for traps": + chest.searchTraps(player, (GameObject) node); + return true; + } + return true; + } + + /** + * Represents a thievable chest. + * @author Vexia + */ + public static enum Chest { + TEN_COIN(2566, 13, 7.8, new Item[] { new Item(995, 10) }, 7), NATURE_RUNE(2567, 28, 25, new Item[] { new Item(995, 3), new Item(561, 1) }, 8), FIFTY_COIN(2568, 43, 125, new Item[] { new Item(995, 50) }, 55), STEEL_ARROWHEADS(2573, 47, 150, new Item[] { new Item(41, 5) }, 210), BLOOD_RUNES(2569, 59, 250, new Item[] { new Item(995, 500), new Item(565, 2) }, 135), PALADIN(2570, 72, 500, new Item[] { new Item(995, 1000), new Item(383, 1), new Item(449, 1), new Item(1623, 1) }, 120); + + /** + * The object id. + */ + private final int[] objectIds; + + /** + * The level required. + */ + private final int level; + + /** + * The experience gained. + */ + private final double experience; + + /** + * The rewards. + */ + private final Item[] rewards; + + /** + * The respawn time. + */ + private final int respawn; + + /** + * The current respawn time. + */ + private int currentRespawn; + + /** + * Constructs a new {@code Chest} {@code Object}. + * @param level the level. + * @param experience the experience. + * @param rewards the rewards. + * @param respawn the respawn time. + */ + private Chest(int[] objectIds, int level, double experience, Item[] rewards, int respawn) { + this.objectIds = objectIds; + this.level = level; + this.experience = experience; + this.rewards = rewards; + this.respawn = respawn; + } + + /** + * Constructs a new {@code Chest} {@code Object}. + * @param objectId the object id. + * @param level the level. + * @param experience the experience. + * @param rewards the rewards. + * @param respawn the respawn time. + */ + private Chest(int objectId, int level, double experience, Item[] rewards, int respawn) { + this(new int[] { objectId }, level, experience, rewards, respawn); + } + + /** + * Opens the chest for a reward. + * @param player the player. + * @param object the object. + */ + private void open(final Player player, final GameObject object) { + if (isRespawning()) { + player.sendMessage("It looks like this chest has already been looted."); + return; + } + player.lock(2); + player.sendMessage("You have activated a trap on the chest."); + player.getImpactHandler().manualHit(player, getHitAmount(player), HitsplatType.NORMAL); + } + + /** + * Searches for traps on a chest. + * @param player the player. + * @param object the object. + */ + private void searchTraps(final Player player, final GameObject object) { + player.faceLocation(object.getLocation()); + if (isRespawning()) { + player.sendMessage("It looks like this chest has already been looted."); + return; + } + player.lock(); + player.animate(Animation.create(536)); + if (player.getSkills().getLevel(Skills.THIEVING) < level) { + player.lock(2); + player.sendMessage("You search the chest for traps."); + player.sendMessage("You find nothing.", 1); + player.unlock(); + return; + } + if (player.getInventory().freeSlots() == 0) { + player.getPacketDispatch().sendMessage("Not enough inventory space."); + return; + } + player.sendMessage("You find a trap on the chest..."); + player.getImpactHandler().setDisabledTicks(6); + GameWorld.getPulser().submit(new Pulse(1, player) { + int counter; + + @Override + public boolean pulse() { + switch (++counter) { + case 2: + player.sendMessage("You disable the trap."); + break; + case 4: + player.animate(Animation.create(536)); + player.sendMessage("You open the chest."); + break; + case 6: + player.unlock(); + for (Item i : rewards) { + player.getInventory().add(i, player); + } + player.sendMessage("You find treasure inside!"); + player.getSkills().addExperience(Skills.THIEVING, experience, true); + if (object.isActive()) { + ObjectBuilder.replace(object, object.transform(2574), 3); + } + setRespawn(); + return true; + } + return false; + } + }); + } + + /** + * Sets the respawn delay. + */ + public void setRespawn() { + currentRespawn = GameWorld.getTicks() + (int) (respawn / 0.6); + } + + /** + * Checks if the chest is respawning. + * @return {@code True} if so. + */ + public boolean isRespawning() { + return currentRespawn > GameWorld.getTicks(); + } + + /** + * Gets the amount of damage to deal. + * @param player The player. + * @return The amount of damage. + */ + protected static int getHitAmount(Player player) { + int hit = player.getSkills().getLifepoints() / 12; + if (hit < 2) { + hit = 2; + } + return hit; + } + + /** + * Gets a chest by the id. + * @param id the id. + * @return the chest. + */ + public static Chest forId(int id) { + for (Chest chest : values()) { + for (int i : chest.getObjectIds()) { + if (i == id) { + return chest; + } + } + } + return null; + } + + /** + * Gets the objectId. + * @return The objectId. + */ + public int[] getObjectIds() { + return objectIds; + } + + /** + * Gets the level. + * @return The level. + */ + public int getLevel() { + return level; + } + + /** + * Gets the experience. + * @return The experience. + */ + public double getExperience() { + return experience; + } + + /** + * Gets the rewards. + * @return The rewards. + */ + public Item[] getRewards() { + return rewards; + } + + /** + * Gets the respawn. + * @return The respawn. + */ + public int getRespawn() { + return respawn; + } + + } +} diff --git a/Server/src/main/java/Server/core/game/node/entity/skill/thieving/ThievingOptionPlugin.java b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/ThievingOptionPlugin.java new file mode 100644 index 000000000..4f930cc7a --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/skill/thieving/ThievingOptionPlugin.java @@ -0,0 +1,46 @@ +package core.game.node.entity.skill.thieving; + +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.plugin.Initializable; +import core.plugin.Plugin; + +/** + * Represents the plugin used to handle thieving options. + * @author 'Vexia + * @date 22/10/2013 + */ +@Initializable +public class ThievingOptionPlugin extends OptionHandler { + + @Override + public Plugin newInstance(Object arg) throws Throwable { + NPCDefinition.setOptionHandler("pick-pocket", this); + NPCDefinition.setOptionHandler("pickpocket", this); + ObjectDefinition.setOptionHandler("steal-from", this); + ObjectDefinition.setOptionHandler("steal from", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + switch (option) { + case "pick-pocket": + case "pickpocket": + player.getPulseManager().run(new PickpocketPulse(player, (NPC) node, Pickpocket.forNPC((NPC) node))); + break; + case "steal-from": + case "steal from": + player.getPulseManager().run(new StallThiefPulse(player, (GameObject) node, Stall.forObject((GameObject) node))); + player.getLocks().lockInteractions(6); + break; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/state/EntityState.java b/Server/src/main/java/Server/core/game/node/entity/state/EntityState.java new file mode 100644 index 000000000..1101a3b70 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/EntityState.java @@ -0,0 +1,61 @@ +package core.game.node.entity.state; + +import core.game.node.entity.state.impl.*; + +/** + * Represents the statuses. + * @author Emperor + */ +public enum EntityState { + + /** + * The entity is poisoned. + */ + POISONED(new PoisonStatePulse(null)), + + /** + * The entity is stunned. + */ + STUNNED(new StunStatePulse(null, 0)), + + /** + * The entity is frozen. + */ + FROZEN(new FrozenStatePulse(null, 0)), + + /** + * The entity is skulled. + */ + SKULLED(new SkullStatePulse(null, 0)), + + /** + * The entity is under teleblock. + */ + TELEBLOCK(new TeleblockStatePulse(null, 0, 0)), + + /** + * The entity has decreased weapon speeds. + */ + MIASMIC(new MiasmicStatePulse(null, 0)); + + /** + * The state pulse used for this state. + */ + private final StatePulse pulse; + + /** + * Constructs a new {@code EntityState} {@code Object}. + * @param pulse The state pulse. + */ + private EntityState(StatePulse pulse) { + this.pulse = pulse; + } + + /** + * Gets the pulse. + * @return The pulse. + */ + public StatePulse getPulse() { + return pulse; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/StateManager.java b/Server/src/main/java/Server/core/game/node/entity/state/StateManager.java new file mode 100644 index 000000000..303e95fa1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/StateManager.java @@ -0,0 +1,167 @@ +package core.game.node.entity.state; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.info.login.SavingModule; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +/** + * Handles an entity's status (eg. poisoned, stunned, frozen, skulled, ...) + * @author Emperor + */ +public final class StateManager implements SavingModule { + + /** + * The entity. + */ + private final Entity entity; + + /** + * The entity's current states. + */ + private final Map states = new HashMap<>(); + + /** + * Constructs a new {@code StateManager} {@code Object}. + * @param entity The entity. + */ + public StateManager(Entity entity) { + this.entity = entity; + } + + @Override + public void save(ByteBuffer buffer) { + for (EntityState state : states.keySet()) { + StatePulse pulse = states.get(state); + if (pulse == null) { + System.out.println("Pulse for state " + state + " is null!"); + continue; + } + if (pulse.isSaveRequired()) { + buffer.put((byte) state.ordinal()); + pulse.save(buffer); + } + } + buffer.put((byte) -1); + } + + @Override + public void parse(ByteBuffer buffer) { + int ordinal = 0; + while ((ordinal = buffer.get()) != -1) { + EntityState state = EntityState.values()[ordinal]; + StatePulse pulse = state.getPulse().parse(entity, buffer); + if (pulse == null) { + System.out.println("Pulse for state " + state + " is null!"); + } + states.put(state, pulse); + } + } + + /** + * Initializes the pulses. + */ + public void init() { + for (StatePulse pulse : states.values()) { + pulse.run(); + } + } + + /** + * Checks if a save is required. + * @return {@code True} if so. + */ + public boolean isSaveRequired() { + return !states.isEmpty(); + } + + /** + * Registers a state. + * @param state The state. + * @param args The arguments. + */ + public void set(EntityState state, Object... args) { + register(state, true, args); + } + + /** + * Registers a state. + * @param state The state. + * @param override If the previous pulse (if any) should be overriden. + * @param args The arguments. + */ + public void register(EntityState state, boolean override, Object... args) { + if (!state.getPulse().canRun(entity)) { + return; + } + StatePulse pulse = states.get(state); + if (pulse != null) { + if (!override) { + return; + } + pulse.stop(); + } + pulse = state.getPulse().create(entity, args); + pulse.run(); + states.put(state, pulse); + } + + /** + * Resets all the states. + */ + public void reset() { + for (StatePulse pulse : states.values()) { + if (pulse.isRunning()) { + pulse.remove(); + pulse.stop(); + } + } + states.clear(); + } + + /** + * Resets the state pulse. + * @param state The state. + */ + public void remove(EntityState state) { + StatePulse pulse = states.get(state); + if (pulse != null && pulse.isRunning()) { + pulse.remove(); + pulse.stop(); + } + states.remove(state); + } + + /** + * Checks if the entity has a pulse running for the given state. + * @param state The state. + * @return {@code True} if so. + */ + public boolean hasState(EntityState state) { + StatePulse pulse = states.get(state); + return pulse != null && pulse.isRunning(); + } + + /** + * Gets the pulse for the given state. + * @param state The state to get the pulse for. + * @return The state pulse. + */ + public StatePulse get(EntityState state) { + return states.get(state); + } + + /** + * Gets the entity. + * @return The entity. + */ + public Entity getEntity() { + return entity; + } + + public Map getStates() { + return states; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/StatePulse.java b/Server/src/main/java/Server/core/game/node/entity/state/StatePulse.java new file mode 100644 index 000000000..c4f006be0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/StatePulse.java @@ -0,0 +1,89 @@ +package core.game.node.entity.state; + +import core.game.node.entity.Entity; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; + +import java.nio.ByteBuffer; + +/** + * Represents a state pulse. + * @author Emperor + */ +public abstract class StatePulse extends Pulse { + + /** + * The entity. + */ + protected final Entity entity; + + /** + * Constructs a new {@code StatePulse} {@code Object}. + * @param entity The entity. + * @param ticks The amount of ticks. + */ + public StatePulse(Entity entity, int ticks) { + super(ticks, entity); + super.stop(); + this.entity = entity; + } + + /** + * Checks if data has to be saved. + * @return {@code True} if so. + */ + public abstract boolean isSaveRequired(); + + /** + * Saves the state data. + * @param buffer The buffer. + */ + public abstract void save(ByteBuffer buffer); + + /** + * Parses the state data. + * @param entity The entity. + * @param buffer The buffer. + * @return The state pulse created. + */ + public abstract StatePulse parse(Entity entity, ByteBuffer buffer); + + /** + * Creates a new instance of this state pulse. + * @param entity The entity. + * @param args The arguments. + * @return The state pulse. + */ + public abstract StatePulse create(Entity entity, Object... args); + + /** + * Checks if this pulse can be ran for the given entity. + * @param entity The entity. + * @return {@code True} if so. + */ + public boolean canRun(Entity entity) { + return true; + } + + /** + * Called when the pulse gets manually removed. + */ + public void remove() { + /* + * empty. + */ + } + + /** + * Runs the pulse. + */ + public void run() { + if (isRunning()) { + return; + } + restart(); + start(); + GameWorld.getPulser().submit(this); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/impl/FireResistantPulse.java b/Server/src/main/java/Server/core/game/node/entity/state/impl/FireResistantPulse.java new file mode 100644 index 000000000..b00e4cbbd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/impl/FireResistantPulse.java @@ -0,0 +1,77 @@ +package core.game.node.entity.state.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.StatePulse; +import core.game.world.GameWorld; + +import java.nio.ByteBuffer; + +/** + * The pulse used for fire resistant. + * @author Vexia + */ +public class FireResistantPulse extends StatePulse { + + /** + * The time to finish. + */ + private static int END_TIME = GameWorld.getSettings().isDevMode() ? 30 : 600; + + /** + * The current tick. + */ + private int currentTick; + + /** + * If the potion is an extended antifire. + */ + private boolean extended; + + /** + * Constructs a new {@Code FireResistantPulse} {@Code Object} + * @param entity the entity. + * @param ticks the ticks. + */ + public FireResistantPulse(Entity entity, int ticks, int currentTick, boolean extended) { + super(entity, ticks); + this.extended = extended; + this.currentTick = currentTick; + } + + @Override + public boolean isSaveRequired() { + return true; + } + + @Override + public void save(ByteBuffer buffer) { + buffer.putInt(currentTick); + } + + @Override + public StatePulse parse(Entity entity, ByteBuffer buffer) { + return new FireResistantPulse(entity, 1, buffer.getInt(), extended); + } + + @Override + public StatePulse create(Entity entity, Object... args) { + return new FireResistantPulse(entity, 1, 0, (boolean) args[0]); + } + + @Override + public boolean pulse() { + if(extended && currentTick == 0 && END_TIME < 1200){ + END_TIME += 600; + } + if (entity instanceof Player) { + if (currentTick == (END_TIME - 25)) { + entity.asPlayer().getPacketDispatch().sendMessage("Your resistance to dragonfire is about to run out."); + } else if (currentTick == (END_TIME - 1)) { + entity.asPlayer().getPacketDispatch().sendMessage("Your resistance to dragonfire has run out."); + } + } + return ++currentTick >= END_TIME; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/impl/FrozenStatePulse.java b/Server/src/main/java/Server/core/game/node/entity/state/impl/FrozenStatePulse.java new file mode 100644 index 000000000..ac22619e9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/impl/FrozenStatePulse.java @@ -0,0 +1,95 @@ +package core.game.node.entity.state.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.StatePulse; +import core.game.world.GameWorld; + +import java.nio.ByteBuffer; + +/** + * Handles the frozen state pulse. + * @author Emperor + */ +public final class FrozenStatePulse extends StatePulse { + + /** + * The amount of ticks immunity lasts. + */ + private static final int IMMUNITY_TICK = 7; + + /** + * The message when frozen. + */ + private final String message; + + /** + * Constructs a new {@code FrozenStatePulse} {@code Object}. + * @param entity The entity. + * @param ticks The ticks to freeze for. + */ + public FrozenStatePulse(Entity entity, String message, int ticks) { + super(entity, ticks); + this.message = message; + } + + /** + * Constructs a new {@code FrozenStatePulse} {@code Object}. + * @param entity The entity. + * @param ticks The ticks to freeze for. + */ + public FrozenStatePulse(Entity entity, int ticks) { + this(entity, "You have been frozen!", ticks); + } + + @Override + public boolean canRun(Entity entity) { + return entity.getAttribute("freeze_immunity", -1) < GameWorld.getTicks(); + } + + @Override + public void start() { + super.start(); + if (entity.getPulseManager().isMovingPulse()) { + entity.getPulseManager().clear(); + } + entity.getWalkingQueue().reset(); + entity.getLocks().lockMovement(getDelay()); + entity.setAttribute("freeze_immunity", GameWorld.getTicks() + getDelay() + IMMUNITY_TICK); + if (entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage(message); + } + } + + @Override + public StatePulse create(Entity entity, Object... args) { + if (args.length > 1) { + return new FrozenStatePulse(entity, (String) args[1], (Integer) args[0]); + } else { + return new FrozenStatePulse(entity, (Integer) args[0]); + } + } + + @Override + public boolean pulse() { + return true; + } + + @Override + public boolean isSaveRequired() { + return false; + } + + @Override + public void save(ByteBuffer buffer) { + /* + * empty. + */ + } + + @Override + public StatePulse parse(Entity entity, ByteBuffer buffer) { + return null; + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/state/impl/MiasmicStatePulse.java b/Server/src/main/java/Server/core/game/node/entity/state/impl/MiasmicStatePulse.java new file mode 100644 index 000000000..628934bd8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/impl/MiasmicStatePulse.java @@ -0,0 +1,90 @@ +package core.game.node.entity.state.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.StatePulse; +import core.game.world.GameWorld; + +import java.nio.ByteBuffer; + +/** + * Handles the Miasmic state pulse. + * @author Emperor + */ +public final class MiasmicStatePulse extends StatePulse { + + /** + * The amount of ticks immunity lasts. + */ + private static final int IMMUNITY_TICK = 7; + + /** + * The message when frozen. + */ + private final String message; + + /** + * Constructs a new {@code MiasmicStatePulse} {@code Object}. + * @param entity The entity. + * @param ticks The ticks to freeze for. + */ + public MiasmicStatePulse(Entity entity, String message, int ticks) { + super(entity, ticks); + this.message = message; + } + + /** + * Constructs a new {@code MiasmicStatePulse} {@code Object}. + * @param entity The entity. + * @param ticks The ticks to freeze for. + */ + public MiasmicStatePulse(Entity entity, int ticks) { + this(entity, null, ticks); + } + + @Override + public boolean canRun(Entity entity) { + return entity.getAttribute("miasmic_immunity", -1) < GameWorld.getTicks(); + } + + @Override + public void start() { + super.start(); + entity.setAttribute("miasmic_immunity", GameWorld.getTicks() + getDelay() + IMMUNITY_TICK); + if (entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage(message); + } + } + + @Override + public StatePulse create(Entity entity, Object... args) { + if (args.length > 1) { + return new MiasmicStatePulse(entity, (String) args[1], (Integer) args[0]); + } else { + return new MiasmicStatePulse(entity, (Integer) args[0]); + } + } + + @Override + public boolean pulse() { + return true; + } + + @Override + public boolean isSaveRequired() { + return false; + } + + @Override + public void save(ByteBuffer buffer) { + /* + * empty. + */ + } + + @Override + public StatePulse parse(Entity entity, ByteBuffer buffer) { + return null; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/impl/PoisonStatePulse.java b/Server/src/main/java/Server/core/game/node/entity/state/impl/PoisonStatePulse.java new file mode 100644 index 000000000..26594fb9c --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/impl/PoisonStatePulse.java @@ -0,0 +1,120 @@ +package core.game.node.entity.state.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.combat.ImpactHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.StatePulse; + +import java.nio.ByteBuffer; + +/** + * Handles the poisoned state. + * @author Emperor + */ +public final class PoisonStatePulse extends StatePulse { + + /** + * The current amount of poison damage. + */ + private int damage; + + /** + * The entity poisoning this entity. + */ + private Entity poisoner; + + /** + * Constructs a new {@code PoisonStatePulse} {@code Object}. + * @param entity The entity. + */ + public PoisonStatePulse(Entity entity) { + super(entity, 30); + } + + @Override + public boolean canRun(Entity entity) { + return !entity.isPoisonImmune(); + } + + @Override + public void start() { + super.start(); + if (entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage("You have been poisoned!"); + } + } + + @Override + public boolean pulse() { + if (!poisoner.isActive()) { + poisoner = entity; + } + if (damage / 10 > 0) { + entity.getImpactHandler().manualHit(poisoner, damage / 10, ImpactHandler.HitsplatType.POISON); + } + damage -= 2; + if (damage < 10) { + if (entity instanceof Player) { + ((Player) entity).getPacketDispatch().sendMessage("The poison has wore off."); + } + return true; + } + return false; + } + + @Override + public boolean isSaveRequired() { + return damage > 9; + } + + @Override + public void save(ByteBuffer buffer) { + buffer.put((byte) damage); + } + + @Override + public StatePulse parse(Entity entity, ByteBuffer buffer) { + return create(entity, buffer.get() & 0xFF, entity); + } + + @Override + public StatePulse create(Entity entity, Object... args) { + PoisonStatePulse pulse = new PoisonStatePulse(entity); + pulse.damage = (Integer) args[0]; + pulse.poisoner = (Entity) args[1]; + return pulse; + } + + /** + * Gets the damage. + * @return The damage. + */ + public int getDamage() { + return damage; + } + + /** + * Sets the damage. + * @param damage The damage to set. + */ + public void setDamage(int damage) { + this.damage = damage; + } + + /** + * Gets the poisoner. + * @return The poisoner. + */ + public Entity getPoisoner() { + return poisoner; + } + + /** + * Sets the poisoner. + * @param poisoner The poisoner to set. + */ + public void setPoisoner(Entity poisoner) { + this.poisoner = poisoner; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/impl/SkullStatePulse.java b/Server/src/main/java/Server/core/game/node/entity/state/impl/SkullStatePulse.java new file mode 100644 index 000000000..9946b3fbb --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/impl/SkullStatePulse.java @@ -0,0 +1,70 @@ +package core.game.node.entity.state.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.StatePulse; + +import java.nio.ByteBuffer; + +/** + * Handles the skulled state. + * @author Emperor + */ +public final class SkullStatePulse extends StatePulse { + + /** + * The amount of ticks. + */ + public static final int TICKS = 2000; + + /** + * Constructs a new {@code SkullStatePulse} {@code Object}. + * @param entity The entity. + * @param ticks The amount of ticks. + */ + public SkullStatePulse(Entity entity, int ticks) { + super(entity, ticks); + } + + @Override + public void start() { + super.start(); + Player player = (Player) entity; + player.getSkullManager().setSkullIcon(0); + player.getSkullManager().setSkulled(true); + } + + @Override + public boolean isSaveRequired() { + return getTicksPassed() < getDelay(); + } + + @Override + public void save(ByteBuffer buffer) { + buffer.putShort((short) (getDelay() - getTicksPassed())); + } + + @Override + public StatePulse parse(Entity entity, ByteBuffer buffer) { + return create(entity, buffer.getShort() & 0xFFFF); + } + + @Override + public StatePulse create(Entity entity, Object... args) { + int ticks = args.length > 0 ? (Integer) args[0] : TICKS; + return new SkullStatePulse(entity, ticks); + } + + @Override + public boolean pulse() { + setTicksPassed(getDelay()); + remove(); + return true; + } + + @Override + public void remove() { + ((Player) entity).getSkullManager().reset(); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/impl/StunStatePulse.java b/Server/src/main/java/Server/core/game/node/entity/state/impl/StunStatePulse.java new file mode 100644 index 000000000..e3ff0f615 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/impl/StunStatePulse.java @@ -0,0 +1,88 @@ +package core.game.node.entity.state.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.StatePulse; +import core.game.world.update.flag.context.Graphics; + +import java.nio.ByteBuffer; + +/** + * Handles the stunned state. + * @author Emperor + */ +public final class StunStatePulse extends StatePulse { + + /** + * The stun graphic. + */ + private static final Graphics STUN_GRAPHIC = new Graphics(80, 96); + + /** + * The stun message. + */ + private String stunMessage; + + /** + * Constructs a new {@code FrozenStatePulse} {@code Object}. + * @param entity The entity. + * @param ticks The ticks to freeze for. + * @param stunMessage The stun message. + */ + public StunStatePulse(Entity entity, int ticks, String stunMessage) { + super(entity, ticks); + this.stunMessage = stunMessage; + } + + /** + * Constructs a new @{Code StunStatePulse} object. + * @param entity The entity. + * @param ticks The ticks to freeze for. + */ + public StunStatePulse(Entity entity, int ticks) { + this(entity, ticks, "You have been stunned!"); + } + + @Override + public void start() { + super.start(); + entity.getWalkingQueue().reset(); + entity.getLocks().lock(getDelay()); + entity.graphics(STUN_GRAPHIC); + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(3201); + ((Player) entity).getPacketDispatch().sendMessage(stunMessage); + } + } + + @Override + public StatePulse create(Entity entity, Object... args) { + return new StunStatePulse(entity, (Integer) args[0], args.length > 1 ? (String) args[1] : "You have been stunned!"); + } + + @Override + public boolean pulse() { + if (entity.getAnimator().getGraphics() == STUN_GRAPHIC) { + entity.graphics(Graphics.create(-1)); + } + return true; + } + + @Override + public boolean isSaveRequired() { + return false; + } + + @Override + public void save(ByteBuffer buffer) { + /* + * empty. + */ + } + + @Override + public StatePulse parse(Entity entity, ByteBuffer buffer) { + return null; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/impl/TeleblockStatePulse.java b/Server/src/main/java/Server/core/game/node/entity/state/impl/TeleblockStatePulse.java new file mode 100644 index 000000000..ef4fe23f4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/impl/TeleblockStatePulse.java @@ -0,0 +1,74 @@ +package core.game.node.entity.state.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.state.StatePulse; + +import java.nio.ByteBuffer; + +/** + * Handles the teleblock state pulse. + * @author Vexia + */ +public final class TeleblockStatePulse extends StatePulse { + + /** + * The ticks needed to pass. + */ + private final int ticks; + + /** + * The current tick. + */ + private int currentTick; + + /** + * Constructs a new {@Code TeleblockStatePulse} {@Code Object} + * @param entity the entity. + * @param ticks the ticks. + * @param currentTick the current tick. + */ + public TeleblockStatePulse(Entity entity, int ticks, int currentTick) { + super(entity, 1); + this.ticks = ticks; + this.currentTick = currentTick; + } + + @Override + public boolean isSaveRequired() { + return currentTick < ticks; + } + + @Override + public void save(ByteBuffer buffer) { + buffer.putInt(ticks); + buffer.putInt(currentTick); + } + + @Override + public StatePulse parse(Entity entity, ByteBuffer buffer) { + return new TeleblockStatePulse(entity, buffer.getInt(), buffer.getInt()); + } + + @Override + public void start() { + if (currentTick == 0) { + if (entity instanceof Player) { + entity.asPlayer().getAudioManager().send(203, true); + entity.asPlayer().sendMessage("You have been teleblocked."); + } + } + super.start(); + } + + @Override + public boolean pulse() { + return ++currentTick >= ticks; + } + + @Override + public StatePulse create(Entity entity, Object... args) { + return new TeleblockStatePulse(entity, (int) args[0], 0); + } + +} diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/PlayerState.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/PlayerState.kt new file mode 100644 index 000000000..97cc072bd --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/PlayerState.kt @@ -0,0 +1,3 @@ +package core.game.node.entity.state.newsys + +annotation class PlayerState(val key: String) diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/State.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/State.kt new file mode 100644 index 000000000..cba464571 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/State.kt @@ -0,0 +1,42 @@ +package core.game.node.entity.state.newsys + +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld.Pulser +import org.json.simple.JSONObject + +/** + * A class representing a state that the player or some associated thing can be in. + * @param player The player the state is for + * @author Ceikry + */ +abstract class State(val player: Player? = null) { + var pulse: Pulse? = null + + /** + * Saves any additional data the state might need to the player's save. + */ + abstract fun save(root: JSONObject) + + /** + * Parses any additional saved data the state might have. + */ + abstract fun parse(_data: JSONObject) + + /** + * Returns a new instance of the class constructed for the player. + */ + abstract fun newInstance(player: Player? = null) : State + + /** + * Method used to define the pulse the state uses. + * Called during the init method of the state, which is done during save parsing and done + * manually when first creating a state. + */ + abstract fun createPulse() + fun init() { + createPulse() + pulse ?: return + Pulser.submit(pulse!!) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/StateRepository.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/StateRepository.kt new file mode 100644 index 000000000..c7f1cea42 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/StateRepository.kt @@ -0,0 +1,34 @@ +package core.game.node.entity.state.newsys + +import core.game.node.entity.player.Player +import io.github.classgraph.ClassGraph + +object StateRepository { + val states = HashMap() + + @JvmStatic + fun init() { + val result = ClassGraph().enableClassInfo().enableAnnotationInfo().acceptPackages("core.game.node.entity.state").scan() + result.getClassesWithAnnotation("core.game.node.entity.state.newsys.PlayerState").forEach{ + val key = it.getAnnotationInfo("core.game.node.entity.state.newsys.PlayerState").parameterValues[0].value as String + val clazz = it.loadClass().newInstance() + if(clazz is State) { + states.put(key, clazz) + } + } + } + + @JvmStatic + fun forKey(key: String, player: Player): State?{ + val state = states[key] + if(player.states[key] != null){ + return null + } + if(state != null){ + val clazz = state.newInstance(player) + player.states[key] = clazz + return clazz + } + return null + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/AvaDeviceState.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/AvaDeviceState.kt new file mode 100644 index 000000000..d460e4701 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/AvaDeviceState.kt @@ -0,0 +1,96 @@ +package core.game.node.entity.state.newsys.states + +import core.game.container.impl.EquipmentContainer +import core.game.node.entity.npc.drop.NPCDropTables +import core.game.node.entity.player.Player +import core.game.node.entity.state.newsys.PlayerState +import core.game.node.entity.state.newsys.State +import core.game.node.item.ChanceItem +import core.game.node.item.Item +import core.game.system.config.ItemConfigParser +import core.game.system.task.Pulse +import core.tools.Items +import core.tools.RandomFunction +import org.json.simple.JSONObject +import kotlin.math.ceil + +@PlayerState("avadevice") +class AvaDeviceState(player: Player? = null) : State(player) { + val TICKS = ceil(180 / 0.6).toInt() + var device = 0 + + private val ATTRACTOR_REWARDS = arrayOf(Items.IRON_BAR_2351,Items.IRON_KNIFE_863,Items.IRON_DART_807,Items.IRON_DAGGER_1203,Items.IRON_BOLTS_9140,Items.IRON_ARROW_884,Items.IRON_ORE_440,Items.COPPER_ORE_436,Items.IRON_FULL_HELM_1153,Items.IRON_2H_SWORD_1309,Items.STEEL_BAR_2353) + private val ACCUMULATOR_REWARDS = arrayOf(Items.STEEL_BAR_2353,Items.STEEL_2H_SWORD_1311,Items.STEEL_KNIFE_865,Items.STEEL_DAGGER_1207,Items.STEEL_MED_HELM_1141,Items.STEEL_DART_808,Items.STEEL_BOLTS_9141,Items.STEEL_ARROW_886,Items.IRON_BAR_2351) + + override fun save(root: JSONObject) { + root.put("device-id",device) + } + + override fun parse(_data: JSONObject) { + if(_data.containsKey("device-id")){ + device = _data["device-id"].toString().toInt() + } + } + + override fun newInstance(player: Player?): State { + return AvaDeviceState(player) + } + + override fun createPulse() { + player ?: return + if(device == 0 && !hasDevice(player)) return + if(player.savedData.globalData.isAvasDisabled) return + + pulse = object : Pulse(TICKS){ + override fun pulse(): Boolean { + if(!hasDevice(player)){ + return true + } + + if(isInterfered()) return false + + if(RandomFunction.random(10) > 4) return false + + val rewards = if(isAccumulator()) ACCUMULATOR_REWARDS else ATTRACTOR_REWARDS + + val item = Item(rewards.random()) + + if (item.definition.getConfiguration(ItemConfigParser.EQUIP_SLOT, -1) == EquipmentContainer.SLOT_ARROWS) { + val arrowSlot = player.equipment[EquipmentContainer.SLOT_ARROWS] + if (arrowSlot == null || arrowSlot.id == item.getId()) { + player.equipment.add(item, true, EquipmentContainer.SLOT_ARROWS) + return false + } + } + player.inventory.add(item, player) + + return !hasDevice(player) + } + } + } + + fun hasDevice(player: Player?) : Boolean{ + player ?: return false + return player.equipment.containsAtLeastOneItem(intArrayOf(Items.AVAS_ACCUMULATOR_10499,Items.AVAS_ATTRACTOR_10498)) + } + + fun isAccumulator() : Boolean{ + return device == Items.AVAS_ACCUMULATOR_10499 + } + + //just took this method from the old arios pulse as well (I'm being lazy) + private fun isInterfered(): Boolean { + player ?: return true + val cape = player.equipment[EquipmentContainer.SLOT_CAPE] + if (cape != null && (cape.id == 10498 || cape.id == 10499)) { + val torso = player.equipment[EquipmentContainer.SLOT_CHEST] + val modelId = torso?.definition?.maleWornModelId1 ?: -1 + if (modelId == 301 || modelId == 306 || modelId == 3379) { + player.packetDispatch.sendMessage("Your armour interferes with Ava's device.") + return true + } + } + return false + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/DiseasedState.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/DiseasedState.kt new file mode 100644 index 000000000..f2cb8ebf9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/DiseasedState.kt @@ -0,0 +1,53 @@ +package core.game.node.entity.state.newsys.states + +import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.player.Player +import core.game.node.entity.state.newsys.PlayerState +import core.game.node.entity.state.newsys.State +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.tools.RandomFunction +import org.json.simple.JSONObject + +@PlayerState("disease") +class DiseasedState(player: Player? = null) : State(player){ + var hitsLeft = 25 + + override fun save(root: JSONObject) { + if(hitsLeft > 0){ + root.put("hitsLeft",hitsLeft) + } + } + + override fun parse(_data: JSONObject) { + if(_data.containsKey("hitsLeft")){ + hitsLeft = _data["hitsLeft"].toString().toInt() + } + } + + override fun newInstance(player: Player?): State { + return DiseasedState(player) + } + + override fun createPulse() { + player ?: return + if(player.getAttribute("immunity:disease",0) > GameWorld.ticks){ + return + } + if(hitsLeft <= 0) return + player.sendMessage("You have been diseased!") + pulse = object : Pulse(30){ + override fun pulse(): Boolean { + val damage = RandomFunction.random(1,5) + player.impactHandler.manualHit(player,damage,ImpactHandler.HitsplatType.DISEASE) + var skillId = RandomFunction.random(24) + if(skillId == 3) skillId-- + player.skills.updateLevel(skillId,-damage,0) + hitsLeft-- + if(hitsLeft <= 0) player.sendMessage("The disease has wore off.") + return hitsLeft <= 0 + } + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/FarmingState.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/FarmingState.kt new file mode 100644 index 000000000..a92207777 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/FarmingState.kt @@ -0,0 +1,166 @@ +package core.game.node.entity.state.newsys.states + +import core.game.node.entity.player.Player +import core.game.node.entity.skill.farming.* +import core.game.node.entity.state.newsys.PlayerState +import core.game.node.entity.state.newsys.State +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import java.util.concurrent.TimeUnit +import kotlin.math.exp + +@PlayerState("farming") +class FarmingState(player: Player? = null) : State(player) { + private val patchMap = HashMap() + private val binMap = HashMap() + + + fun getPatch(patch: FarmingPatch): Patch { + return patchMap[patch] ?: (Patch(player!!,patch).also { patchMap[patch] = it }) + } + + fun getBin(bin: CompostBins) : CompostBin{ + return binMap[bin] ?: (CompostBin(player!!,bin).also { binMap[bin] = it }) + } + + fun getPatches(): MutableCollection{ + return patchMap.values + } + + fun getBins(): MutableCollection{ + return binMap.values + } + + override fun save(root: JSONObject) { + val patches = JSONArray() + for((key,patch) in patchMap){ + val p = JSONObject() + p.put("patch-ordinal",key.ordinal) + p.put("patch-plantable-ordinal",patch.plantable?.ordinal ?: -1) + p.put("patch-watered",patch.isWatered) + p.put("patch-diseased",patch.isDiseased) + p.put("patch-dead",patch.isDead) + p.put("patch-stage",patch.currentGrowthStage) + p.put("patch-state",patch.getCurrentState()) + p.put("patch-nextGrowth",patch.nextGrowth) + p.put("patch-harvestAmt",patch.harvestAmt) + p.put("patch-checkHealth",patch.isCheckHealth) + p.put("patch-compost",patch.compost.ordinal) + patches.add(p) + } + val bins = JSONArray() + for((key,bin) in binMap){ + val b = JSONObject() + b.put("bin-ordinal",key.ordinal) + bin.save(b) + bins.add(b) + } + root.put("farming-patches",patches) + root.put("farming-bins",bins) + } + + override fun parse(_data: JSONObject) { + player ?: return + if(_data.containsKey("farming-bins")){ + (_data["farming-bins"] as JSONArray).forEach { + val bin = it as JSONObject + val binOrdinal = bin["bin-ordinal"].toString().toInt() + val cBin = CompostBins.values()[binOrdinal] + val b = CompostBin(player,cBin) + b.parse(bin["binData"] as JSONObject) + if(binMap[cBin] == null) { + binMap[cBin] = b + } + SystemLogger.logErr("bin size " + binMap.size) + } + } + if(_data.containsKey("farming-patches")){ + val data = _data["farming-patches"] as JSONArray + for(d in data){ + val p = d as JSONObject + val patchOrdinal = p["patch-ordinal"].toString().toInt() + val patchPlantableOrdinal = p["patch-plantable-ordinal"].toString().toInt() + val patchWatered = p["patch-watered"] as Boolean + val patchDiseased = p["patch-diseased"] as Boolean + val patchDead = p["patch-dead"] as Boolean + val patchStage = p["patch-stage"].toString().toInt() + val nextGrowth = p["patch-nextGrowth"].toString().toLong() + val harvestAmt = (p["patch-harvestAmt"] ?: 0).toString().toInt() + val checkHealth = p["patch-checkHealth"] as Boolean + val savedState = p["patch-state"].toString().toInt() + val compostOrdinal = p["patch-compost"].toString().toInt() + val fPatch = FarmingPatch.values()[patchOrdinal] + val plantable = if(patchPlantableOrdinal != -1) Plantable.values()[patchPlantableOrdinal] else null + val patch = Patch(player,fPatch,plantable,patchStage,patchDiseased,patchDead,patchWatered,nextGrowth,harvestAmt,checkHealth) + + patch.compost = CompostType.values()[compostOrdinal] + if(patch.currentGrowthStage < patch.plantable?.stages ?: 0 && !patch.isWeedy()){ + val startTime = (patch.nextGrowth - TimeUnit.MINUTES.toMillis(patch.patch.type.stageGrowthTime * (patch.currentGrowthStage + 1).toLong())) + var expectedStage = Math.floor((System.currentTimeMillis() - startTime.toDouble()) / TimeUnit.MINUTES.toMillis(patch.patch.type.stageGrowthTime.toLong())).toInt() + SystemLogger.logErr("$expectedStage $startTime ${System.currentTimeMillis()}") + + if(!patchDiseased && !patchDead) { + if (expectedStage > patch.plantable?.stages ?: 0) { + expectedStage = patch.plantable?.stages ?: 0 + } + for(i in 0 until (expectedStage - patch.currentGrowthStage)){ + patch.update() + } + } + } + + if(savedState > patch.plantable?.value ?: 0 + patch.currentGrowthStage){ + patch.setCurrentState(savedState) + } else { + patch.setCurrentState((patch.plantable?.value ?: 0) + patch.currentGrowthStage) + } + + if(patchMap[fPatch] == null) { + patchMap[fPatch] = patch + } + } + } + } + + override fun newInstance(player: Player?): State { + return FarmingState(player) + } + + override fun createPulse() { + if(patchMap.isNotEmpty() || binMap.isNotEmpty()){ + pulse = object : Pulse(3){ + override fun pulse(): Boolean { + + GlobalScope.launch { + var removeList = ArrayList() + for((_,patch) in patchMap){ + + if(patch.getCurrentState() in 1..3 && patch.nextGrowth == 0L){ + patch.nextGrowth = System.currentTimeMillis() + 60000 + continue + } + + if(patch.nextGrowth < System.currentTimeMillis() && !patch.isDead){ + patch.update() + patch.nextGrowth = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(patch.patch.type.stageGrowthTime.toLong()) + } + + } + + for((_,bin) in binMap){ + if(bin.isReady() && !bin.isFinished){ + bin.finish() + } + } + } + + return false + } + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/GodspellChargedState.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/GodspellChargedState.kt new file mode 100644 index 000000000..023c4280d --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/GodspellChargedState.kt @@ -0,0 +1,41 @@ +package core.game.node.entity.state.newsys.states + +import core.game.node.entity.player.Player +import core.game.node.entity.state.newsys.PlayerState +import core.game.node.entity.state.newsys.State +import core.game.system.task.Pulse +import org.json.simple.JSONObject + +@PlayerState("godcharge") +class GodspellChargedState(player: Player? = null) : State(player) { + var TICKS = 700 + + override fun save(root: JSONObject) { + if(TICKS > 0){ + root.put("ticksleft",TICKS) + } + } + + override fun parse(_data: JSONObject) { + if(_data.containsKey("ticksleft")){ + TICKS = _data["ticksleft"].toString().toInt() + } + } + + override fun newInstance(player: Player?): State { + return GodspellChargedState(player) + } + + override fun createPulse() { + player ?: return + if(TICKS <= 0) return + pulse = object : Pulse(TICKS){ + override fun pulse(): Boolean { + player.sendMessage("Your magical charge fades away.") + pulse = null + return true + } + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/IncubatorState.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/IncubatorState.kt new file mode 100644 index 000000000..d417c4e36 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/IncubatorState.kt @@ -0,0 +1,53 @@ +package core.game.node.entity.state.newsys.states + +import core.game.node.entity.player.Player +import core.game.node.entity.skill.summoning.pet.IncubatorEgg +import core.game.node.entity.state.newsys.PlayerState +import core.game.node.entity.state.newsys.State +import core.game.system.task.Pulse +import org.json.simple.JSONObject + +@PlayerState("incubator") +class IncubatorState(player: Player? = null) : State(player) { + var egg: IncubatorEgg? = null + var ticksLeft = 0 + + override fun newInstance(player: Player?): State { + return IncubatorState(player) + } + + override fun save(root: JSONObject) { + if(ticksLeft <= 0) return + + val data = JSONObject() + data.put("eggOrdinal",(egg?.ordinal ?: 0).toString()) + data.put("ticksLeft",ticksLeft.toString()) + root.put("eggdata",data) + } + + override fun parse(_data: JSONObject) { + if(_data.containsKey("eggdata")){ + val data = _data["eggdata"] as JSONObject + egg = IncubatorEgg.values()[data["eggOrdinal"].toString().toInt()] + ticksLeft = data["ticksLeft"].toString().toInt() + } + } + + override fun createPulse() { + player ?: return + egg ?: return + player.varpManager.get(1160).setVarbit(4,1).send(player) + pulse = object : Pulse(){ + override fun pulse(): Boolean { + if(ticksLeft-- <= 0){ + player.setAttribute("/save:inc", egg!!.ordinal) + player.sendMessage("Your " + egg!!.product.name.toLowerCase() + " has finished hatching.") + pulse = null + return true + } + return false + } + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/ShootingStarState.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/ShootingStarState.kt new file mode 100644 index 000000000..8440760a6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/ShootingStarState.kt @@ -0,0 +1,47 @@ +package core.game.node.entity.state.newsys.states + +import core.game.node.entity.player.Player +import core.game.node.entity.state.newsys.PlayerState +import core.game.node.entity.state.newsys.State +import core.game.system.task.Pulse +import core.tools.ticksToSeconds +import org.json.simple.JSONObject + +@PlayerState("shooting-star") +class ShootingStarState(player: Player? = null) : State(player) { + var ticksLeft = 1500 + + override fun save(root: JSONObject) { + root["ticksLeft"] = ticksLeft + } + + override fun parse(_data: JSONObject) { + if(_data.containsKey("ticksLeft")){ + ticksLeft = _data["ticksLeft"].toString().toInt() + } + } + + override fun newInstance(player: Player?): State { + return ShootingStarState(player) + } + + override fun createPulse() { + player ?: return + if(ticksLeft <= 0) return + pulse = object : Pulse(){ + override fun pulse(): Boolean { + val minutes = ticksToSeconds(ticksLeft) / 60.0 + if(minutes % 5.0 == 0.0){ + player.sendMessage("You have $minutes minutes of your mining bonus left") + } + if(ticksLeft-- <= 0){ + player.sendMessage("Your mining bonus has run out!") + pulse = null + return true + } + return false + } + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/SkulledState.kt b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/SkulledState.kt new file mode 100644 index 000000000..413780873 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/entity/state/newsys/states/SkulledState.kt @@ -0,0 +1,43 @@ +package core.game.node.entity.state.newsys.states + +import core.game.node.entity.player.Player +import core.game.node.entity.state.newsys.State +import core.game.system.task.Pulse +import org.json.simple.JSONObject + +class SkulledState(player: Player? = null) : State(player) { + var ticksLeft = 2000 + + override fun save(root: JSONObject) { + root.put("ticksLeft",ticksLeft) + } + + override fun parse(_data: JSONObject) { + if(_data.containsKey("ticksLeft")){ + ticksLeft = _data["ticksLeft"].toString().toInt() + } + } + + override fun newInstance(player: Player?): State { + return SkulledState(player) + } + + override fun createPulse() { + player ?: return + if(ticksLeft <= 0) return + player.skullManager.setSkullIcon(0) + player.skullManager.isSkulled = true + pulse = object : Pulse(){ + override fun pulse(): Boolean { + ticksLeft-- + if(ticksLeft <= 0) { + player.skullManager.reset() + pulse = null + return true + } + return false + } + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/item/ChanceItem.java b/Server/src/main/java/Server/core/game/node/item/ChanceItem.java new file mode 100644 index 000000000..80ca1bc31 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/item/ChanceItem.java @@ -0,0 +1,267 @@ +package core.game.node.item; + +import core.game.node.entity.npc.drop.DropFrequency; +import core.tools.RandomFunction; + +/** + * Represents an item with a chance-rate. + * @author Emperor + */ +public final class ChanceItem extends Item { + + public static final int[] DROP_RATES = { 5,15,150,750 }; + + /** + * The chance rate of this item. + */ + private double chanceRate; + + /** + * The minimum amount. + */ + private int minimumAmount; + + /** + * The maximum amount. + */ + private int maximumAmount; + + /** + * The table slot. + */ + private int tableSlot; + + /** + * The drop frequency. + */ + private DropFrequency dropFrequency; + + /** + * The set rate. + */ + private int setRate = -1; + + /** + * Constructs a new {@code ChanceItem} {@code Object}. + * @param id The item id. + */ + public ChanceItem(int id) { + this(id, 1, 1, 1000, 1.0); + } + + /** + * Constructs a new {@code ChanceItem} {@code Object}. + * @param id The item id. + * @param minimumAmount The minimum amount. + * @param chanceRate The chance rate. + */ + public ChanceItem(int id, int minimumAmount, double chanceRate) { + this(id, minimumAmount, minimumAmount, 1000, chanceRate); + } + + public ChanceItem(int id, int minimumAmount, int chanceRate) { + this(id,minimumAmount,minimumAmount,1000,(double) chanceRate); + } + + /** + * Constructs a new {@code ChanceItem} {@code Object}. + * @param id The item id. + * @param minimumAmount The minimum amount. + * @param maximumAmount The maximum amount. + * @param chanceRate The chance rate. + */ + public ChanceItem(int id, int minimumAmount, int maximumAmount, double chanceRate) { + this(id, minimumAmount, maximumAmount, 1000, chanceRate); + } + + /** + * Constructs a new {@code ChanceItem} {@code Object}. + * @param id the id. + * @param minimumAmount the min amount. + * @param maximumAmount the max amount. + * @param frequency the frequency. + */ + public ChanceItem(int id, int minimumAmount, int maximumAmount, DropFrequency frequency) { + this(id, minimumAmount, maximumAmount, 1000, DropFrequency.rate(frequency)); + } + + /** + * Constructs a new {@code ChanceItem} {@code Object}. + * @param id The item id. + * @param minimumAmount The minimum amount. + * @param maximumAmount The maximum amount. + * @param charge The charge. if(frequency == DropFrequency.ALWAYS){ + + } + * @param chanceRate The chance rate. + */ + public ChanceItem(int id, int minimumAmount, int maximumAmount, int charge, double chanceRate) { + this(id, minimumAmount, maximumAmount, charge, chanceRate, DropFrequency.UNCOMMON); + } + + /** + * Constructs a new {@code ChanceItem} {@code Object}. + * @param id The item id. + * @param minimumAmount The minimum amount. + * @param maximumAmount The maximum amount. + * @param charge The charge. + * @param frequency The drop frequency. + * @param chanceRate The chance rate. + */ + public ChanceItem(int id, int minimumAmount, int maximumAmount, int charge, double chanceRate, DropFrequency frequency) { + this(id, minimumAmount, maximumAmount, charge, chanceRate, frequency, -1); + } + + /** + * Constructs a new {@code ChanceItem} {@code Object}. + * @param id The item id. + * @param minimumAmount The minimum amount. + * @param maximumAmount The maximum amount. + * @param charge The charge. + * @param frequency The drop frequency. + * @param chanceRate The chance rate. + * @param setRate the set rate. + */ + public ChanceItem(int id, int minimumAmount, int maximumAmount, int charge, double chanceRate, DropFrequency frequency, int setRate) { + super(id, minimumAmount, charge); + this.minimumAmount = minimumAmount; + this.maximumAmount = maximumAmount; + this.chanceRate = chanceRate; + this.dropFrequency = frequency; + this.setRate = setRate; + } + + public ChanceItem(int id, int amount, DropFrequency frequency){ + this(id, amount, amount, frequency); + } + + /** + * Gets the item instance. + * @return the item. + */ + public Item getRandomItem() { + if (minimumAmount == maximumAmount) { + return new Item(getId(), minimumAmount); + } + return new Item(getId(), RandomFunction.random(minimumAmount, maximumAmount)); + } + + /** + * Gets a random chance item from the table. + * @param table The table. + * @return The chance item. + */ + public static ChanceItem getItem(ChanceItem... table) { + return getItem(RandomFunction.getRandomDouble(75.0), table); + } + + /** + * Gets a random chance item from the table. + * @param table The table. + * @return The chance item. + */ + public static ChanceItem getItem(double chance, ChanceItem... table) { + // TODO: + return table[0]; + } + + /** + * Gets a copy. + * @return the copy. + */ + public ChanceItem getCopy() { + ChanceItem newItem = new ChanceItem(getId(), minimumAmount, maximumAmount, getCharge(), chanceRate, dropFrequency); + return newItem; + } + + /** + * @return the chanceRate. + */ + public double getChanceRate() { + return chanceRate; + } + + /** + * @param chanceRate the chanceRate to set. + */ + public void setChanceRate(double chanceRate) { + this.chanceRate = chanceRate; + } + + /** + * @return the minimumAmount. + */ + public int getMinimumAmount() { + return minimumAmount; + } + + /** + * @param minimumAmount the minimumAmount to set. + */ + public void setMinimumAmount(int minimumAmount) { + this.minimumAmount = minimumAmount; + } + + /** + * @return the maximumAmount. + */ + public int getMaximumAmount() { + return maximumAmount; + } + + /** + * @param maximumAmount the maximumAmount to set. + */ + public void setMaximumAmount(int maximumAmount) { + this.maximumAmount = maximumAmount; + } + + /** + * @return the dropFrequency. + */ + public DropFrequency getDropFrequency() { + return dropFrequency; + } + + /** + * @param dropFrequency the dropFrequency to set. + */ + public void setDropFrequency(DropFrequency dropFrequency) { + this.dropFrequency = dropFrequency; + } + + /** + * @return the tableSlot. + */ + public int getTableSlot() { + return tableSlot; + } + + /** + * @param tableSlot the tableSlot to set. + */ + public void setTableSlot(int tableSlot) { + this.tableSlot = tableSlot; + } + + @Override + public String toString() { + return "ChanceItem " + super.toString() + " [chanceRate=" + chanceRate + ", minimumAmount=" + minimumAmount + ", maximumAmount=" + maximumAmount + ", tableSlot=" + tableSlot + ", dropFrequency=" + dropFrequency + "]"; + } + + /** + * Gets the setRate. + * @return the setRate + */ + public int getSetRate() { + return setRate; + } + + /** + * Sets the basetRate. + * @param setRate the setRate to set. + */ + public void setSetRate(int setRate) { + this.setRate = setRate; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/item/GroundItem.java b/Server/src/main/java/Server/core/game/node/item/GroundItem.java new file mode 100644 index 000000000..1ad9864b6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/item/GroundItem.java @@ -0,0 +1,198 @@ +package core.game.node.item; + +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; + +/** + * Represents a ground item. + * @author Emperor + */ +public class GroundItem extends Item { + + /** + * The player who dropped this item. + */ + private Player dropper; + + /** + * The amount of ticks. + */ + private int ticks; + + /** + * The amount of ticks when to remove this item. + */ + private int decayTime; + + /** + * If the item should remain private. + */ + private boolean remainPrivate; + + /** + * If the ground item has been removed. + */ + private boolean removed; + + /** + * Constructs a new {@code GroundItem} {@code Object}. + * @param item The item + */ + public GroundItem(Item item) { + this(item, null, null); + } + + /** + * Constructs a new {@code GroundItem} {@code Object}. + * @param item The item. + * @param location The location. + */ + public GroundItem(Item item, Location location) { + this(item, location, 200, null); + } + + /** + * Constructs a new {@code GroundItem} {@code Object}. + * @param item The item. + * @param location The location. + * @param player The player who dropped this item. + */ + public GroundItem(Item item, Location location, Player player) { + this(item, location, 200, player); + } + + /** + * Constructs a new {@code GroundItem} {@code Object}. + * @param item The item. + * @param location The location. + * @param player The player who dropped this item. + */ + public GroundItem(Item item, Location location, int decay, Player player) { + super(item.getId(), item.getAmount(), item.getCharge()); + super.location = location; + super.index = -1; + super.interaction.setDefault(); + this.dropper = player; + this.ticks = GameWorld.getTicks(); + this.decayTime = ticks + decay; + } + + /** + * Used to respawn the ground item. + */ + public void respawn() { + + } + + /** + * Checks if the ground item is private. + * @return {@code True} if so. + */ + public boolean isPrivate() { + return remainPrivate || (decayTime - GameWorld.getTicks() > 100); + } + + @Override + public boolean isActive() { + return removed || GameWorld.getTicks() < decayTime; + } + + /** + * Checks if this item was dropped by the player. + * @param p The player. + * @return {@code True} if so. + */ + public boolean droppedBy(Player p) { + if (dropper != null && p.getDetails().getUid() == dropper.getDetails().getUid()) { + dropper = p; + return true; + } + return false; + } + + /** + * Gets the dropper. + * @return The dropper. + */ + public Player getDropper() { + return dropper; + } + + /** + * Sets the dropper. + * @param player The player who dropped this item. + */ + public void setDropper(Player player) { + this.dropper = player; + } + + /** + * Gets the ticks. + * @return The ticks. + */ + public int getTicks() { + return ticks; + } + + /** + * Gets the decayTime. + * @return The decayTime. + */ + public int getDecayTime() { + return decayTime; + } + + /** + * Sets the decayTime. + * @param decayTime The decayTime to set. + */ + public void setDecayTime(int decayTime) { + this.decayTime = GameWorld.getTicks() + decayTime; + } + + /** + * Gets the autoSpawn. + * @return The autoSpawn. + */ + public boolean isAutoSpawn() { + return false; + } + + /** + * Gets the remainPrivate. + * @return The remainPrivate. + */ + public boolean isRemainPrivate() { + return remainPrivate; + } + + /** + * Sets the remainPrivate. + * @param remainPrivate The remainPrivate to set. + */ + public void setRemainPrivate(boolean remainPrivate) { + this.remainPrivate = remainPrivate; + } + + /** + * Gets the removed. + * @return The removed. + */ + public boolean isRemoved() { + return removed; + } + + /** + * Sets the removed. + * @param removed The removed to set. + */ + public void setRemoved(boolean removed) { + this.removed = removed; + } + + @Override + public String toString() { + return "GroundItem [dropper=" + (dropper != null ? dropper.getUsername() : dropper) + ", ticks=" + ticks + ", decayTime=" + decayTime + ", remainPrivate=" + remainPrivate + ", removed=" + removed + "]"; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/item/GroundItemManager.java b/Server/src/main/java/Server/core/game/node/item/GroundItemManager.java new file mode 100644 index 000000000..04f2080a6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/item/GroundItemManager.java @@ -0,0 +1,169 @@ +package core.game.node.item; + +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.chunk.ItemUpdateFlag; +import core.net.packet.PacketRepository; +import core.net.packet.context.BuildItemContext; +import core.net.packet.out.UpdateGroundItemAmount; +import plugin.ai.AIRepository; + +import java.util.ArrayList; +import java.util.List; + +/** + * Handles ground items. + * @author Emperor + */ +public final class GroundItemManager { + /** + * The list of ground items. + */ + private static final List GROUND_ITEMS = new ArrayList<>(); + + /** + * Creates a ground item. + * @param item The ground item to create. + * @param location The location to set the ground item on. + */ + public static GroundItem create(Item item, Location location) { + return create(new GroundItem(item, location, null)); + } + + /** + * Creates a ground item. + * @param item the item. + * @param player the player. + * @return + */ + public static GroundItem create(Item item, final Player player) { + return create(new GroundItem(item, player.getLocation(), player)); + } + + /** + * Creates a ground item. + * @param item The ground item to create. + * @param location The location to set the ground item on. + * @param player The player creating the ground item. + */ + public static GroundItem create(Item item, Location location, Player player) { + return create(new GroundItem(item, location, player)); + } + + /** + * Creates a ground item. + * @param item The ground item to create. + * @param location The location to set the ground item on. + * @param player The player creating the ground item. + */ + public static void create(Item[] item, Location location, Player player) { + for (int i = 0; i < item.length; i++) { + create(new GroundItem(item[i], location, player)); + } + } + + /** + * Creates a ground item. + * @param item The ground item to create. + * @return The ground item. + */ + public static GroundItem create(GroundItem item) { + if (!item.getDefinition().isTradeable()) { + item.setRemainPrivate(true); + } + if (item.getDropper() != null && item.hasItemPlugin()) { + item.getPlugin().remove(item.getDropper(), item, ItemPlugin.DROP); + } + item.setRemoved(false); + RegionManager.getRegionPlane(item.getLocation()).add(item); + if (GROUND_ITEMS.add(item)) { + return item; + } + return null; + } + + /** + * Destroys the ground item. + * @param item The ground item. + */ + public static GroundItem destroy(GroundItem item) { + if (item == null) { + return null; + } + GROUND_ITEMS.remove(item); + RegionManager.getRegionPlane(item.getLocation()).remove(item); + if (item.isAutoSpawn()) { + item.respawn(); + } + return item; + } + + /** + * Gets a ground item. + * @param itemId The item id. + * @param location The location. + * @param player The player. + * @return The ground item, or {@code null} if the ground item wasn't found. + */ + public static GroundItem get(int itemId, Location location, Player player) { + return RegionManager.getRegionPlane(location).getItem(itemId, location, player); + } + + /** + * Increases the amount of a ground item on the floor, or creates a new + * ground item. + * @param item The item to drop. + * @param location The drop location. + * @param p The player. + * @return The ground item. + */ + public static GroundItem increase(Item item, Location location, Player p) { + GroundItem g = get(item.getId(), location, p); + if (g == null || !g.droppedBy(p) || !g.isPrivate() || g.isRemoved()) { + return create(item, location, p); + } + int oldAmount = g.getAmount(); + g.setAmount(oldAmount + item.getAmount()); + PacketRepository.send(UpdateGroundItemAmount.class, new BuildItemContext(p, g, oldAmount)); + return g; + } + + /** + * Handles the ground items. + */ + public static void pulse() { + Object[] giArray = GROUND_ITEMS.toArray(); + int size = giArray.length; + for (int i = 0; i < size; i++) { + GroundItem item = (GroundItem) giArray[i]; + if (item.isAutoSpawn()) { + continue; + } + if (!item.isActive()) { + GROUND_ITEMS.remove(item); + if(item.getDropper() != null) { + if (item.getDropper().isArtificial()) { + ArrayList val = AIRepository.getItems(item.getDropper()); + if (val != null) + val.remove(item); + } + } + if (!item.isRemoved()) { + RegionManager.getRegionPlane(item.getLocation()).remove(item); + } + } else if (!item.isRemainPrivate() && item.getDecayTime() - GameWorld.getTicks() == 100) { + RegionManager.getRegionChunk(item.getLocation()).flag(new ItemUpdateFlag(item, ItemUpdateFlag.CONSTRUCT_TYPE)); + } + } + } + + /** + * Gets the list of ground items. + * @return The ground items. + */ + public static List getItems() { + return GROUND_ITEMS; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/item/Item.java b/Server/src/main/java/Server/core/game/node/item/Item.java new file mode 100644 index 000000000..14c5845d9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/item/Item.java @@ -0,0 +1,254 @@ +package core.game.node.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.ge.GrandExchangeDatabase; +import core.game.ge.GrandExchangeEntry; +import core.game.interaction.DestinationFlag; +import core.game.interaction.Interaction; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.combat.equipment.DegradableEquipment; + +/** + * Represents an item. + * @author Emperor + */ +public class Item extends Node{ + + /** + * The identification hash (itemId << 16 | charge) + */ + private int idHash; + + /** + * The item amount. + */ + private int amount; + + /** + * The item definition. + */ + private ItemDefinition definition; + + /** + * Constructs a new {@code Item} {@code Object}.
The id will be -1 + * (thus definition will be null + */ + public Item() { + super("null", null); + super.interaction = new Interaction(this); + this.idHash = -1 << 16 | 1000; + } + + /** + * Constructs a new fully charged {@code Item} {@code Object}. + * @param id The item id. + */ + public Item(int id) { + this(id, 1, 1000); + } + + /** + * Constructs a new fully charged {@code Item} {@code Object}. + * @param id The item id. + * @param amount The amount. + */ + public Item(int id, int amount) { + this(id, amount, 1000); + } + + /** + * Constructs a new {@code Item} {@code Object}. + * @param id The item id. + * @param amount The amount. + * @param charge The charge. + */ + public Item(int id, int amount, int charge) { + super(ItemDefinition.forId(id).getName(), null); + super.destinationFlag = DestinationFlag.ITEM; + super.index = -1; // Item slot. + super.interaction = new Interaction(this); + this.idHash = id << 16 | charge; + this.amount = amount; + this.definition = ItemDefinition.forId(id); + } + + /** + * Gets this item as a ground item. + * @return The item. + */ + public Item getDropItem() { + int itemId = DegradableEquipment.getDropReplacement(getId()); + if (itemId != getId()) { + return new Item(itemId, getAmount()); + } + return this; + } + + /** + * Gets the operate option handler. + * @return The option handler for the operate option. + */ + public OptionHandler getOperateHandler() { + return ItemDefinition.getOptionHandler(getId(), "operate"); + } + + /** + * Gets the value of the item. + * @return The value. + */ + public long getValue() { + long value = 1; + GrandExchangeEntry entry = GrandExchangeDatabase.getDatabase().get(getId()); + if (entry != null) { + value = entry.getValue(); + } + if (definition.getValue() > value) { + value = definition.getValue(); + } + if (definition.getAlchemyValue(true) > value) { + value = definition.getAlchemyValue(true); + } + return value * getAmount(); + } + + /** + * Gets a copy of the item. + * @return The item copy. + */ + public Item copy() { + return new Item(getId(), getAmount(), getCharge()); + } + + /** + * Gets the item id of the exchange item for this item. + * @return The note item id, if this item is unnoted, or the unnoted item id + * if this item is noted. + */ + public int getNoteChange() { + int noteId = definition.getNoteId(); + if (noteId > -1) { + return noteId; + } + return getId(); + } + + /** + * @return the id + */ + public int getId() { + return idHash >> 16 & 0xFFFF; + } + + /** + * @param id the id to set + */ + public void setId(int id) { + this.idHash = id << 16 | (idHash & 0xFFFF); + this.definition = ItemDefinition.forId(id); + } + + /** + * @return the amount + */ + public int getAmount() { + return amount; + } + + /** + * @param amount the amount to set + */ + public void setAmount(int amount) { + if (amount < 0) { + amount = 0; + } + this.amount = amount; + } + + /** + * Checks if the item has atleast one charge left. + * @return {@code True} if so. + */ + public boolean isCharged() { + return getCharge() > 0; + } + + /** + * @return the charge + */ + public int getCharge() { + return idHash & 0xFFFF; + } + + /** + * @param charge the charge to set + */ + public void setCharge(int charge) { + this.idHash = (idHash >> 16 & 0xFFFF) << 16 | charge; + } + + /** + * @return the identification hash + */ + public int getIdHash() { + return idHash; + } + + /** + * Sets the id hash. + * @param hash the hash to set + */ + public void setIdHash(int hash) { + this.idHash = hash; + } + + /** + * Checks if the item has a wrapper plugin. + * @return {@code True} if so. + */ + public boolean hasItemPlugin() { + return getPlugin() != null; + } + + /** + * Gets the item plugin. + * @return the plugin. + */ + public ItemPlugin getPlugin() { + if (definition == null) { + return null; + } + return definition.getItemPlugin(); + } + + /** + * Gets the definition. + * @return The definition. + */ + public ItemDefinition getDefinition() { + return definition; + } + + /** + * Sets the definition. + * @param definition The definition to set. + */ + public void setDefinition(ItemDefinition definition) { + this.definition = definition; + } + + /** + * Gets the slot of this item. + * @return The container slot, or {@code -1} if the item wasn't added to a + * container. + */ + public int getSlot() { + return index; + } + + @Override + public String toString() { + return "Item id=" + getId() + ", name=" + getName() + ", amount=" + amount; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/item/ItemPlugin.java b/Server/src/main/java/Server/core/game/node/item/ItemPlugin.java new file mode 100644 index 000000000..6dd572da3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/item/ItemPlugin.java @@ -0,0 +1,95 @@ +package core.game.node.item; + +import core.cache.def.impl.ItemDefinition; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.plugin.Plugin; + +/** + * Represents a plugin for an item. + * @author Vexia + */ +public abstract class ItemPlugin implements Plugin { + + /** + * The drop type identifier. + */ + protected static final int DROP = 1; + + /** + * Constructs a new {@Code ItemPlugin} {@Code Object} + */ + public ItemPlugin() { + /** + * empty. + */ + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return this; + } + + /** + * Registers items to this plugin. + * @param ids the ids. + */ + public void register(int... ids) { + for (int id : ids) { + ItemDefinition.forId(id).setItemPlugin(this); + } + } + + /** + * Called when the item is removed from the player. + * @param player the player. + * @param item the item. + * @param type the type. (1=drop) + */ + public void remove(Player player, Item item, int type) { + + } + + /** + * Checks if the item can be picked up. + * @param player the player. + * @param item the item. + * @param type the pickup type (1=ground, 2=telegab) + * @return {@code True} if so. + */ + public boolean canPickUp(Player player, GroundItem item, int type) { + return true; + } + + /** + * Checks if the item can be made as a drop. + * @param item the item. + * @param player the player. + * @param npc TODO + * @param l the location. + * @return + */ + public boolean createDrop(Item item, Player player, NPC npc, Location l) { + return true; + } + + /** + * Changes an item if needed. + * @param item the item. + * @param npc the npc. + * @return the item. + */ + public Item getItem(Item item, NPC npc) { + return item; + } + + /** + * Gets the death item. + * @param item the item. + * @return the item. + */ + public Item getDeathItem(Item item) { + return item; + } +} diff --git a/Server/src/main/java/Server/core/game/node/item/WeightedChanceItem.java b/Server/src/main/java/Server/core/game/node/item/WeightedChanceItem.java new file mode 100644 index 000000000..fd131ba32 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/item/WeightedChanceItem.java @@ -0,0 +1,23 @@ +package core.game.node.item; + +import core.tools.RandomFunction; + +public class WeightedChanceItem { + int id,minimum_amount,maximum_amount; + public int weight; + + public WeightedChanceItem(int id, int minimum_amount, int maximum_amount, int weight){ + this.id = id; + this.minimum_amount = minimum_amount; + this.maximum_amount = maximum_amount; + this.weight = weight; + } + + public WeightedChanceItem(int id, int amount, int weight){ + this(id,amount,amount,weight); + } + + public Item getItem(){ + return new Item(this.id, RandomFunction.random(this.minimum_amount, this.maximum_amount)); + } +} diff --git a/Server/src/main/java/Server/core/game/node/object/Constructed.java b/Server/src/main/java/Server/core/game/node/object/Constructed.java new file mode 100644 index 000000000..1c9d57680 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/object/Constructed.java @@ -0,0 +1,126 @@ +package core.game.node.object; + +import core.game.node.item.Item; +import core.game.world.map.Location; + +/** + * Represents a constructed object. + * @author Emperor + */ +public class Constructed extends GameObject { + + /** + * The game object we've replaced. + */ + private GameObject replaced; + + /** + * The ground items places after the tick is up. + */ + private Item[] items; + + /** + * Constructs a new Constructed object. + * @param id The object id. + * @param x The object x-coordinate. + * @param y The object y-coordinate. + * @param z The object z-coordinate. + */ + public Constructed(int id, int x, int y, int z) { + super(id, Location.create(x, y, z), 10, 0); + } + + /** + * Constructs a new Constructed object. + * @param id The object id. + * @param location The object's location. + */ + public Constructed(int id, Location location) { + super(id, location, 10, 0); + } + + /** + * Constructs a new Constructed object. + * @param id The object id. + * @param location The object's location. + * @param rotation The object's rotation. + */ + public Constructed(int id, Location location, int rotation) { + super(id, location, 10, rotation); + } + + /** + * Constructs a new {@code Constructed} {@code Object}. + * @param id The object id. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param z The z-coordinate. + * @param type The object type. + * @param rotation The rotation. + */ + public Constructed(int id, int x, int y, int z, int type, int rotation) { + super(id, Location.create(x, y, z), type, rotation); + } + + /** + * Constructs a new {@code Constructed} {@code Object}. + * @param id The object id. + * @param type The object type. + * @param rotation The rotation. + */ + public Constructed(int id, int type, int rotation) { + super(id, Location.create(0, 0, 0), type, rotation); + } + + /** + * Constructs a new {@code Constructed} {@code Object}. + * @param id The object id. + * @param location The location. + * @param type The object type. + * @param rotation The rotation. + */ + public Constructed(int id, Location location, int type, int rotation) { + super(id, location, type, rotation); + } + + @Override + public boolean isPermanent() { + return false; + } + + @Override + public Constructed asConstructed() { + return this; + } + + /** + * Gets the replaced. + * @return The replaced. + */ + public GameObject getReplaced() { + return replaced; + } + + /** + * Sets the replaced. + * @param replaced The replaced to set. + */ + public void setReplaced(GameObject replaced) { + this.replaced = replaced; + } + + /** + * @return the items + */ + public Item[] getItems() { + return items; + } + + /** + * @param items the items to set + */ + public void setItems(Item[] items) { + this.items = items; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/object/GameObject.java b/Server/src/main/java/Server/core/game/node/object/GameObject.java new file mode 100644 index 000000000..2d5fc7408 --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/object/GameObject.java @@ -0,0 +1,429 @@ +package core.game.node.object; + +import core.cache.def.impl.VarbitDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.game.interaction.DestinationFlag; +import core.game.interaction.Interaction; +import core.game.node.Node; +import core.game.node.entity.impl.GameAttributes; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.map.Direction; +import core.game.world.map.Location; + +/** + * Represents a game object. + * @author Emperor + */ +public class GameObject extends Node { + + /** + * The object id. + */ + private final int id; + + /** + * Object's type. + */ + private final int type; + + /** + * The rotation. + */ + private final int rotation; + + /** + * The object's definition. + */ + private final ObjectDefinition definition; + + /** + * The restore pulse. + */ + private Pulse restorePulse; + + /** + * The destruction pulse. + */ + private Pulse destructionPulse; + + /** + * The charge of this object. + */ + private int charge = 1000; + + /** + * The entity's attributes. + */ + private final GameAttributes attributes = new GameAttributes(); + + /** + * The child objects. + */ + private final GameObject[] childs; + + /** + * The game object wrapper (used for object configurations). + */ + private GameObject wrapper; + + /** + * Constructs a new game object. + * @param id The object id. + * @param x The object x-coordinate. + * @param y The object y-coordinate. + * @param z The object z-coordinate. + */ + public GameObject(int id, int x, int y, int z) { + this(id, Location.create(x, y, z), 10, 0); + } + + /** + * Constructs a new game object. + * @param id The object id. + * @param location The object's location. + */ + public GameObject(int id, Location location) { + this(id, location, 10, 0); + } + + /** + * Constructs a new game object. + * @param id The object id. + * @param location The object's location. + * @param rotation The object's rotation. + */ + public GameObject(int id, Location location, int rotation) { + this(id, location, 10, rotation); + } + + public GameObject(int id, Location location, int rotation, Direction direction) { + this(id, location, 10, rotation); + } + + /** + * Constructs a new {@code GameObject} {@code Object}. + * @param id The object id. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param z The z-coordinate. + * @param type The object type. + * @param rotation The rotation. + */ + public GameObject(int id, int x, int y, int z, int type, int rotation) { + this(id, Location.create(x, y, z), type, rotation); + } + + /** + * Constructs a new {@code GameObject} {@code Object}. + * @param id The object id. + * @param type The object type. + * @param rotation The rotation. + */ + public GameObject(int id, int type, int rotation) { + this(id, Location.create(0, 0, 0), type, rotation); + } + + /** + * Constructs a new {@code GameObject} {@code Object}. + * @param id The object id. + * @param location The location. + * @param type The object type. + * @param rotation The rotation. + */ + public GameObject(int id, Location location, int type, int rotation) { + super(ObjectDefinition.forId(id).getName(), location); + if (rotation < 0) { + rotation += 4; + } + if (id < 1) { + type = 22; + } + super.destinationFlag = DestinationFlag.OBJECT; + super.direction = Direction.get(rotation); + super.interaction = new Interaction(this); + this.rotation = rotation; + this.id = id; + this.location = location; + this.type = type; + this.definition = ObjectDefinition.forId(id); + super.size = definition.sizeX; + if (definition.childrenIds != null && definition.childrenIds.length > 0) { + this.childs = new GameObject[definition.childrenIds.length]; + for (int i = 0; i < childs.length; i++) { + childs[i] = transform(definition.childrenIds[i]); + childs[i].wrapper = this; + } + } else { + childs = null; + } + } + + /** + * Called when an object is removed. + */ + public void remove() {}; + + /** + * Gets the current x-size. + * @return The current size. + */ + public int getSizeX() { + if (direction.toInteger() % 2 != 0) { + return definition.sizeY; + } + return definition.sizeX; + } + + /** + * Gets the current y-size. + * @return The current size. + */ + public int getSizeY() { + if (direction.toInteger() % 2 != 0) { + return definition.sizeX; + } + return definition.sizeY; + } + + @Override + public void setActive(boolean active) { + if (super.active && !active && destructionPulse != null) { + destructionPulse.pulse(); + } + super.setActive(active); + } + + /** + * Gets the child object shown for the current player. + * @param player The player. + * @return The child object. + */ + public GameObject getChild(Player player) { + if (childs != null) { + ObjectDefinition def = definition.getChildObject(player); + for (GameObject child : childs) { + if (child.getId() == def.getId()) { + return child; + } + } + } + return this; + } + + /** + * Sets the child object index. + * @param player The player. + * @param index The child object. + */ + public void setChildIndex(Player player, int index) { + ObjectDefinition def = getDefinition(); + if (childs == null && wrapper != null) { + def = wrapper.getDefinition(); + } + if (def.getVarbitID() > -1) { + VarbitDefinition config = def.getConfigFile(); + if (config != null) { + player.varpManager.get(config.getConfigId()).setVarbit(config.getBitShift(),index).send(player); + } + } else if (def.getConfigId() > -1) { + player.varpManager.get(def.getConfigId()).setVarbit(0,index); + } + } + + /** + * Gets a transformed object of this object. + * @param id The new object id. + * @return The constructed game object. + */ + public GameObject transform(int id) { + return new GameObject(id, location, type, rotation); + } + + /** + * Gets a transformed object of this object. + * @param id The new object id. + * @param rotation The new rotation. + * @return The constructed game object. + */ + public GameObject transform(int id, int rotation) { + return new GameObject(id, location, type, rotation); + } + + /** + * Gets a transformed object of this object. + * @param id The new object id. + * @param rotation The new rotation. + * @param location The new location. + * @return The constructed game object. + */ + public GameObject transform(int id, int rotation, Location location) { + return new GameObject(id, location, type, rotation); + } + + /** + * Gets a transformed object of this object. + * @param id The new object id. + * @param rotation The new rotation. + * @param type The object type. + * @return The constructed game object. + */ + public GameObject transform(int id, int rotation, int type) { + return new GameObject(id, location, type, rotation); + } + + /** + * If the object is permanent. + * @return {@code True} if so. + */ + public boolean isPermanent() { + return true; + } + + /** + * Gets this game object as Constructed object. + * @return The {@link Constructed} object. + */ + public Constructed asConstructed() { + return new Constructed(id, location, type, rotation); + } + + /** + * @return the id + */ + public int getId() { + return id; + } + + /** + * @return the type + */ + public int getType() { + return type; + } + + /** + * @return the rotation + */ + public int getRotation() { + return rotation; + } + + /** + * @return the location + */ + @Override + public Location getLocation() { + return location; + } + + /** + * Gets the definition. + * @return The definition. + */ + public ObjectDefinition getDefinition() { + return definition; + } + + @Override + public Location getCenterLocation() { + return location.transform(getSizeX() >> 1, getSizeY() >> 1, 0); + } + + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof GameObject)) { + return false; + } + GameObject other = (GameObject) obj; + return other.id == id && other.location.equals(location) && rotation == other.rotation && other.type == type; + } + + @Override + public String toString() { + return "[GameObject " + id + ", " + location + ", type=" + type + ", rot=" + rotation + "]"; + } + + /** + * Gets the restorePulse. + * @return The restorePulse. + */ + public Pulse getRestorePulse() { + return restorePulse; + } + + /** + * Sets the restorePulse. + * @param restorePulse The restorePulse to set. + */ + public void setRestorePulse(Pulse restorePulse) { + this.restorePulse = restorePulse; + } + + /** + * Gets the charge. + * @return The charge. + */ + public int getCharge() { + return charge; + } + + /** + * Sets the charge. + * @param charge The charge to set. + */ + public void setCharge(int charge) { + this.charge = charge; + } + + /** + * Gets the destructionPulse. + * @return The destructionPulse. + */ + public Pulse getDestructionPulse() { + return destructionPulse; + } + + /** + * Sets the destructionPulse. + * @param destructionPulse The destructionPulse to set. + */ + public void setDestructionPulse(Pulse destructionPulse) { + this.destructionPulse = destructionPulse; + } + + /** + * @return the attributes. + */ + public GameAttributes getAttributes() { + return attributes; + } + + /** + * Gets the childs. + * @return The childs. + */ + public GameObject[] getChilds() { + return childs; + } + + /** + * Gets the wrapper. + * @return The wrapper. + */ + public GameObject getWrapper() { + if (wrapper == null) { + return this; + } + return wrapper; + } + + /** + * Sets the wrapper. + * @param wrapper The wrapper to set. + */ + public void setWrapper(GameObject wrapper) { + this.wrapper = wrapper; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/node/object/ObjectBuilder.java b/Server/src/main/java/Server/core/game/node/object/ObjectBuilder.java new file mode 100644 index 000000000..69272fe5e --- /dev/null +++ b/Server/src/main/java/Server/core/game/node/object/ObjectBuilder.java @@ -0,0 +1,273 @@ +package core.game.node.object; + +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.system.SystemLogger; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.build.LandscapeParser; +import core.game.world.update.flag.chunk.ObjectUpdateFlag; + +/** + * An aiding class for object constructing/removing. + * + * @author Emperor + */ +public final class ObjectBuilder { + + /** + * Replaces a game object. + * + * @param remove The object to remove. + * @param construct The object to add. + * @return {@code True} if successful. + */ + public static boolean replace(GameObject remove, GameObject construct) { + return replace(remove, construct, true, false); + } + + /** + * Replaces a game object. + * + * @param remove The object to remove. + * @param construct The object to add. + * @param clip If clipping should be adjusted. + * @return {@code True} if successful. + */ + public static boolean replace(GameObject remove, GameObject construct, boolean clip, boolean permanent) { + if (!clip) { + return replaceClientSide(remove, construct, -1); + } + remove = remove.getWrapper(); + GameObject current = LandscapeParser.removeGameObject(remove); + if (current == null) { + if (GameWorld.getSettings().isDevMode()) { + SystemLogger.logErr("Object could not be replaced - object to remove is invalid."); + } + return false; + } + if (current.getRestorePulse() != null) { + current.getRestorePulse().stop(); + current.setRestorePulse(null); + } + if (current instanceof Constructed) { + GameObject previous = ((Constructed) current).getReplaced(); + if (previous != null && previous.equals(construct)) { + LandscapeParser.addGameObject(previous); + update(current, previous); + return true; + } + } + Constructed constructed = construct.asConstructed(); + if (!permanent) { + constructed.setReplaced(current); + } + LandscapeParser.addGameObject(constructed); + update(current, constructed); + return true; + } + + /** + * Replaces the object client sided alone. + * + * @param remove The object to remove. + * @param construct The object to replace with. + * @param restoreTicks The restoration ticks. + * @return {@code True} if successful. + */ + private static boolean replaceClientSide(final GameObject remove, final GameObject construct, int restoreTicks) { + RegionManager.getRegionChunk(remove.getLocation()).flag(new ObjectUpdateFlag(remove, true)); + RegionManager.getRegionChunk(construct.getLocation()).flag(new ObjectUpdateFlag(construct, false)); + if (restoreTicks > 0) { + GameWorld.getPulser().submit(new Pulse(restoreTicks) { + @Override + public boolean pulse() { + return replaceClientSide(construct, remove, -1); + } + }); + } + return true; + } + + /** + * Replaces a game object temporarily. + * + * @param remove The object to remove. + * @param construct The object to add. + * @param restoreTicks The amount of ticks before the object gets restored. + * @return {@code True} if successful. + */ + public static boolean replace(GameObject remove, GameObject construct, int restoreTicks) { + return replace(remove, construct, restoreTicks, true); + } + + /** + * Replaces a game object temporarily. + * + * @param remove The object to remove. + * @param construct The object to add. + * @param restoreTicks The amount of ticks before the object gets restored. + * @return {@code True} if successful. + */ + public static boolean replace(GameObject remove, GameObject construct, int restoreTicks, final boolean clip) { + if (!clip) { + return replaceClientSide(remove, construct, restoreTicks); + } + remove = remove.getWrapper(); + GameObject current = LandscapeParser.removeGameObject(remove); + if (current == null) { + if (GameWorld.getSettings().isDevMode()) { + SystemLogger.logErr("Object could not be replaced - object to remove is invalid."); + } + return false; + } + if (current.getRestorePulse() != null) { + current.getRestorePulse().stop(); + current.setRestorePulse(null); + } + if (current instanceof Constructed) { + GameObject previous = ((Constructed) current).getReplaced(); + if (previous != null && previous.equals(construct)) { + // Shouldn't happen. + throw new IllegalStateException("Can't temporarily replace an already temporary object!"); + } + } + final Constructed constructed = construct.asConstructed(); + constructed.setReplaced(current); + LandscapeParser.addGameObject(constructed); + update(current, constructed); + if (restoreTicks < 0) { + return true; + } + constructed.setRestorePulse(new Pulse(restoreTicks) { + @Override + public boolean pulse() { + replace(constructed, constructed.getReplaced()); + return true; + } + }); + GameWorld.getPulser().submit(constructed.getRestorePulse()); + return true; + } + + /** + * Adds a game object. + * + * @param object The object to add. + * @return {@code True} if successful. + */ + public static Constructed add(GameObject object) { + return add(object, -1); + } + + /** + * Adds a game object. + * + * @param object The object to add. + * @param ticks The amount of ticks this object should last for (-1 for + * permanent). + * @return {@code True} if successful. + */ + public static Constructed add(GameObject object, int ticks, final GroundItem... items) { + object = object.getWrapper(); + final Constructed constructed = object.asConstructed(); + LandscapeParser.addGameObject(constructed); + update(constructed); + if (ticks > -1) { + GameWorld.getPulser().submit(new Pulse(ticks, object) { + @Override + public boolean pulse() { + remove(constructed); + if (items != null) { + for (int i = 0; i < items.length; i++) { + GroundItemManager.create(items[i]); + } + } + return true; + } + }); + } + return constructed; + } + + /** + * Removes all objects within a box + * @param objectId - the object id to remove + * @param southWest + * @param northEast + * @return + */ + public static boolean removeAll(int objectId, Location southWest, Location northEast) { + if (southWest.getX() > northEast.getX() || southWest.getY() > northEast.getY()) + return false; + + int differenceX = northEast.getX() - southWest.getX(); + int differenceY = northEast.getY() - southWest.getY(); + + for (int x = 0; x <= differenceX; x++) { + for (int y = 0; y <= differenceY; y++){ + GameObject object = new GameObject(objectId, Location.create(southWest.getX() + x, southWest.getY() + y, southWest.getZ())); + remove(object); + } + } + return true; + } + + /** + * Removes a game object. + * + * @param object The object to remove. + * @return {@code True} if successful. + */ + public static boolean remove(GameObject object) { + if (object == null) { + return false; + } + object = object.getWrapper(); + GameObject current = LandscapeParser.removeGameObject(object); + if (current == null) { + return false; + } + update(current); + return true; + } + + /** + * Removes a game object. + * + * @param object the object. + * @param respawnTicks the respawn ticks. + * @return {@code True}if removed. + */ + public static boolean remove(final GameObject object, int respawnTicks) { + if (remove(object)) { + GameWorld.getPulser().submit(new Pulse(respawnTicks) { + + @Override + public boolean pulse() { + add(object); + return true; + } + + }); + return true; + } + return false; + } + + /** + * Updates the game object on all the player's screen. + * + * @param objects The game objects. + */ + public static void update(GameObject... objects) { + for (GameObject o : objects) { + if (o == null) { + continue; + } + RegionManager.getRegionChunk(o.getLocation()).flag(new ObjectUpdateFlag(o, !o.isActive())); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/package-info.java b/Server/src/main/java/Server/core/game/package-info.java new file mode 100644 index 000000000..bd16114fa --- /dev/null +++ b/Server/src/main/java/Server/core/game/package-info.java @@ -0,0 +1,7 @@ +/** + * Used for handling important aspects of the game. + * + * @author Emperor + * + */ +package core.game; \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/SystemConfig.java b/Server/src/main/java/Server/core/game/system/SystemConfig.java new file mode 100644 index 000000000..a98bb4e0d --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/SystemConfig.java @@ -0,0 +1,170 @@ +package core.game.system; + +import core.game.node.entity.player.Player; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Holds the system configurations from the database. + * @author Vexia + * + */ +public class SystemConfig { + + /** + * The system-object configurations. + */ + private final Map configs = new HashMap<>(); + + /** + * The list of beta user names. + */ + private final List betaUsers = new ArrayList<>(); + + /** + * Constructs a new {@Code SystemConfig} {@Code Object} + */ + public SystemConfig() { + } + + /** + * Parses system configurations from the SQL database. + */ + public void parse() { + } + + /** + * Parses a config using the SQL info given. + * @param key The key identity. + * @param value The value. + * @param dataType The data type to parse. + */ + private void parseConfig(String key, String value, String dataType) { + if (dataType == null) { + configs.put(key, value); + return; + } + if (value == null || value == "") { + return; + } + switch (dataType) { + case "int": + configs.put(key, Integer.valueOf(value)); + break; + case "double": + break; + case "boolean": + break; + case "date": + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date parsed = null; + try { + parsed = format.parse(value); + } catch (ParseException e) { + e.printStackTrace(); + } + configs.put(key, parsed); + break; + default: + configs.put(key, value); + break; + } + } + + /** + * Checks if the player passes the system configuration validation. + * @param player The player. + * @return {@code True} if successfull. + */ + public boolean validLogin(Player player) { + return true; + } + + /** + * Checks if double experience is active. + * @return {@code True} if active. + */ + public boolean isDoubleExp() { + Date date = getConfig("dxp", null); + if (date == null) { + return false; + } + return date.after(new Date()); + } + + /** + * Splits the data into an array list using a regex. + * @param data the data. + * @param regex the regex to split. + * @return the list of data. + */ + public List split(String data, String regex) { + if (!data.contains(regex)) { + List split = new ArrayList<>(); + split.add(data); + return split; + } + List split = new ArrayList<>(); + String[] tokens = data.trim().split(regex); + for (String s : tokens) { + split.add(s); + } + return split; + } + + /** + * Checks if a username is a beta user. + * @param name The name. + * @return {@code True} if so. + */ + public boolean isBetaUser(String name) { + return betaUsers.contains(name); + } + + /** + * Gets an attribute. + * @param key The attribute name. + * @return The attribute value. + */ + @SuppressWarnings("unchecked") + public T getConfig(String key) { + if (!configs.containsKey(key)) { + return null; + } + return (T) configs.get(key); + } + + /** + * Gets an attribute. + * @param string The attribute name. + * @param fail The value to return if the attribute is null. + * @return The attribute value, or the fail argument when null. + */ + @SuppressWarnings("unchecked") + public T getConfig(String string, T fail) { + Object object = configs.get(string); + if (object != null) { + return (T) object; + } + return fail; + } + + /** + * Gets the configs. + * @return the configs. + */ + public Map getConfigs() { + return configs; + } + + /** + * Gets the betaUsers. + * @return the betaUsers. + */ + public List getBetaUsers() { + return betaUsers; + } + +} diff --git a/Server/src/main/java/Server/core/game/system/SystemLogger.kt b/Server/src/main/java/Server/core/game/system/SystemLogger.kt new file mode 100644 index 000000000..f895dd202 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/SystemLogger.kt @@ -0,0 +1,82 @@ +package core.game.system + +import com.github.ajalt.mordant.rendering.TextColors +import com.github.ajalt.mordant.terminal.Terminal +import core.ServerConstants +import core.game.node.entity.player.Player +import core.game.world.GameWorld +import java.io.* +import java.nio.charset.StandardCharsets +import java.nio.file.Files +import java.nio.file.Paths +import java.nio.file.StandardOpenOption +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.util.* + +/** + * Handles server log printing + * @author Ceikry + * Thanks to the awesome library made by AJ Alt + */ +object SystemLogger { + val t = Terminal() + val formatter = SimpleDateFormat("HH:mm:ss") + var tradeLog: Writer? = null + var tradeLogWriter: BufferedWriter? = null + + @JvmStatic + fun initTradeLogger(){ + if(!File(ServerConstants.LOGS_PATH + "trade" + File.separator + "test").exists()){ + File(ServerConstants.LOGS_PATH + "trade" + File.separator + "test").mkdirs() + } + tradeLog = FileWriter(ServerConstants.LOGS_PATH + "trade" + File.separator + SimpleDateFormat("dd-MM-yyyy").format(System.currentTimeMillis()) + ".log") + tradeLogWriter = BufferedWriter(tradeLog!!) + } + + @JvmStatic() + fun flushLogs() { + tradeLogWriter?.flush() + tradeLogWriter?.close() + } + + fun getTime(): String{ + return "[" + formatter.format(Date(System.currentTimeMillis())) +"]" + } + + @JvmStatic + fun logInfo(vararg messages: String){ + for(m in messages){ + if(m.isNotBlank()) t.println("${getTime()}: [INFO] $m") + } + } + + @JvmStatic + fun logErr(message: String){ + if(message.isNotBlank()) t.println("${getTime()}: ${TextColors.brightRed("[ ERR] $message")}") + } + + @JvmStatic + fun logWarn(message: String){ + if(message.isNotBlank()) t.println("${getTime()}: ${TextColors.yellow("[WARN] $message")}") + } + + @JvmStatic + fun logAlert(message: String){ + if(message.isNotBlank()) t.println("${getTime()}: ${TextColors.brightYellow("[ALRT] $message")}") + } + + @JvmStatic + fun logAI(message: String){ + if(message.isNotBlank()) t.println("${getTime()}: ${TextColors.gray("[AIPL] $message")}") + } + + @JvmStatic + fun logTrade(message: String){ + if(message.isNotBlank()){ + if(tradeLogWriter == null) logWarn("Trade Logger is null!") + tradeLogWriter?.write("${getTime()}: $message") + tradeLogWriter?.newLine() + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/SystemManager.java b/Server/src/main/java/Server/core/game/system/SystemManager.java new file mode 100644 index 000000000..5c1ba185a --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/SystemManager.java @@ -0,0 +1,143 @@ +package core.game.system; + +import core.game.system.security.EncryptionManager; +import core.game.world.GameWorld; + +/** + * Manages the "game system" states, such as updating or terminating. + * @author Emperor + */ +public final class SystemManager { + + /** + * The system state. + */ + private static SystemState state = SystemState.TERMINATED; + + /** + * The system update handler. + */ + private static final SystemUpdate UPDATER = new SystemUpdate(); + + /** + * The system termination handler. + */ + private static final SystemTermination TERMINATOR = new SystemTermination(); + + /** + * The system configurator. + */ + private static final SystemConfig SYSTEM_CONFIG = new SystemConfig(); + + /** + * The encryption the server uses. + */ + private static final EncryptionManager ENCRYPTION = new EncryptionManager(); + + /** + * Constructs a new {@code SystemManager} {@code Object}. + */ + private SystemManager() { + /* + * empty. + */ + } + + /** + * Sets the current state and handles it accordingly. + * @param state The system state. + */ + public static void flag(SystemState state) { + if (SystemManager.state == state) { + return; + } + SystemManager.state = state; + switch (state) { + case ACTIVE: + case PRIVATE: + GameWorld.getMajorUpdateWorker().setStarted(false); + GameWorld.getMajorUpdateWorker().start(); + break; + case UPDATING: + UPDATER.schedule(); + break; + case TERMINATED: + TERMINATOR.terminate(); + break; + } + } + + /** + * Checks if the system is still active (updating keeps the system active + * until termination). + * @return {@code True} if the state does not equal + * {@link SystemState#TERMINATED}. + */ + public static boolean isActive() { + return state != SystemState.TERMINATED; + } + + /** + * Checks if the system is being updated. + * @return {@code True} if so. + */ + public static boolean isUpdating() { + return state == SystemState.UPDATING; + } + + /** + * Checks if the system is private, so only developers can connect. + * @return {@code True} if so. + */ + public static boolean isPrivate() { + return state == SystemState.PRIVATE; + } + + /** + * Checks if the system has been terminated. + * @return {@code True} if so. + */ + public static boolean isTerminated() { + return state == SystemState.TERMINATED; + } + + /** + * Gets the current system state. + * @return The state. + */ + public static SystemState state() { + return state; + } + + /** + * Gets the updater. + * @return The updater. + */ + public static SystemUpdate getUpdater() { + return UPDATER; + } + + /** + * Gets the terminator. + * @return The terminator. + */ + public static SystemTermination getTerminator() { + return TERMINATOR; + } + + /** + * Gets the systemConfig. + * @return the systemConfig. + */ + public static SystemConfig getSystemConfig() { + return SYSTEM_CONFIG; + } + + /** + * Gets the encryption. + * @return the encryption. + */ + public static EncryptionManager getEncryption() { + return ENCRYPTION; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/SystemShutdownHook.java b/Server/src/main/java/Server/core/game/system/SystemShutdownHook.java new file mode 100644 index 000000000..ad1a28fa2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/SystemShutdownHook.java @@ -0,0 +1,17 @@ +package core.game.system; + +/** + * Handles the shutdown hook. + * @author Emperor + */ +public final class SystemShutdownHook implements Runnable { + + @Override + public void run() { + if (SystemManager.isTerminated()) { + return; + } + SystemLogger.logInfo("[SystemShutdownHook] Terminating..."); + SystemManager.getTerminator().terminate(); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/SystemState.java b/Server/src/main/java/Server/core/game/system/SystemState.java new file mode 100644 index 000000000..b1ec72726 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/SystemState.java @@ -0,0 +1,29 @@ +package core.game.system; + +/** + * Represents the system states. + * @author Emperor + */ +public enum SystemState { + + /** + * The system is currently active. + */ + ACTIVE, + + /** + * The system is being updated. + */ + UPDATING, + + /** + * The system is in development, thus only developers can connect. + */ + PRIVATE, + + /** + * The system has been terminated. + */ + TERMINATED; + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/SystemTermination.java b/Server/src/main/java/Server/core/game/system/SystemTermination.java new file mode 100644 index 000000000..f46e5749c --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/SystemTermination.java @@ -0,0 +1,89 @@ +package core.game.system; + +import core.ServerConstants; +import core.game.ge.GrandExchangeDatabase; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.PlayerParser; +import core.game.world.repository.Repository; +import core.game.ge.OfferManager; +import core.game.interaction.object.dmc.DMCHandler; + +import java.io.File; +import java.util.Iterator; + +/** + * Handles the terminating of the system. + * @author Emperor + * + */ +public final class SystemTermination { + + /** + * Constructs a new {@code SystemTermination} {@code Object}. + */ + protected SystemTermination() { + /* + * empty. + */ + } + + /** + * Terminates the system safely. + */ + public void terminate() { + SystemLogger.logInfo("[SystemTerminator] Initializing termination sequence - do not shutdown!"); + try { + for(Player player : Repository.getPlayers()){ + DMCHandler dmc = player.getAttribute("dmc",null); + if(dmc != null){ + dmc.clear(false); + } + } + save(ServerConstants.DATA_PATH); + } catch (Throwable e) { + e.printStackTrace(); + } + SystemLogger.logInfo("[SystemTerminator] Server successfully terminated!"); + Runtime.getRuntime().removeShutdownHook(ServerConstants.SHUTDOWN_HOOK); + System.exit(0); + } + + /** + * Saves all system data on the directory. + * @param directory The base directory. + */ + public void save(String directory) { + File file = new File(directory); + SystemLogger.logInfo("[SystemTerminator] Saving data [dir=" + file.getAbsolutePath() + "]..."); + if (!file.isDirectory()) { + file.mkdirs(); + } + GrandExchangeDatabase.save(); + OfferManager.save(); + SystemLogger.flushLogs(); + SystemLogger.logInfo("[SystemTerminator] Saved Grand Exchange databases!"); + Repository.getDisconnectionQueue().clear(); + for (Iterator it = Repository.getPlayers().iterator(); it.hasNext();) { + try { + Player p = it.next(); + if (p != null && !p.isArtificial()) { // Should never be null. + p.removeAttribute("combat-time"); + p.clear(); + PlayerParser.save(p); + p.getDetails().save(); + p.getLogoutPlugins().forEach(playerPlugin -> { + try { + playerPlugin.newInstance(p); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + }); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } +// ServerStore.dump(directory + "store/"); + SystemLogger.logInfo("[SystemTerminator] Saved player accounts!"); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/SystemUpdate.java b/Server/src/main/java/Server/core/game/system/SystemUpdate.java new file mode 100644 index 000000000..bb5375ea0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/SystemUpdate.java @@ -0,0 +1,138 @@ +package core.game.system; + +import core.ServerConstants; +import core.game.node.entity.player.Player; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.repository.Repository; + +import java.util.Iterator; +import java.util.concurrent.Executors; + +/** + * Handles a system update. + * @author Emperor + */ +public final class SystemUpdate extends Pulse { + + /** + * The default countdown for an update, in ticks. + */ + public static final int DEFAULT_COUNTDOWN = 100; + + /** + * The amount of ticks left of when to create a backup. + */ + public static final int BACKUP_TICK = 10; + + /** + * If a backup should be created. + */ + private boolean createBackup = false; + + /** + * Constructs a new {@code SystemUpdate} {@code Object}. + */ + protected SystemUpdate() { + super(DEFAULT_COUNTDOWN); + } + + @Override + public boolean pulse() { + if (getDelay() >= BACKUP_TICK && createBackup) { + try { + SystemManager.getTerminator().save(ServerConstants.DATA_PATH); + } catch (Throwable e) { + e.printStackTrace(); + } + setDelay(BACKUP_TICK - 1); + return false; + } + SystemManager.flag(SystemState.TERMINATED); + return true; + } + + /** + * Notifies the players. + */ + public void notifyPlayers() { + try { + System.out.println("BEGINNING UPDATE SEQUENCE - TIME TIL UPDATE " + getDelay() + " TICKS"); + int time = getDelay() + (createBackup ? BACKUP_TICK : 0); + for (Iterator it = Repository.getPlayers().iterator(); it.hasNext();) { + Player p = it.next(); + if (p != null) { // Should never be null. + p.getPacketDispatch().sendSystemUpdate(time); + } + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + + /** + * Schedules an update. + */ + public void schedule() { + super.setTicksPassed(0); + super.start(); + if (GameWorld.getMajorUpdateWorker().getStarted()) { + notifyPlayers(); + GameWorld.getPulser().submit(this); + return; + } + Executors.newSingleThreadExecutor().submit(new Runnable() { + @Override + public void run() { + while (isRunning()) { + try { + Thread.sleep(600); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if (update()) { + break; + } + } + } + }); + } + + /** + * Sets the system update countdown. + * @param ticks The amount of ticks. + */ + public void setCountdown(int ticks) { + if (createBackup) { + if (ticks < BACKUP_TICK) { + ticks = BACKUP_TICK; + } + ticks -= BACKUP_TICK; + } + super.setDelay(ticks); + } + + /** + * Cancels the system update task. + */ + public void cancel() { + super.stop(); + SystemManager.flag(SystemState.ACTIVE); + } + + /** + * Gets the createBackup. + * @return The createBackup. + */ + public boolean isCreateBackup() { + return createBackup; + } + + /** + * Sets the createBackup. + * @param createBackup The createBackup to set. + */ + public void setCreateBackup(boolean createBackup) { + this.createBackup = createBackup; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/Command.kt b/Server/src/main/java/Server/core/game/system/command/Command.kt new file mode 100644 index 000000000..1902ca4e0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/Command.kt @@ -0,0 +1,43 @@ +package core.game.system.command + +import core.game.node.entity.player.Player +import core.game.world.GameWorld + +/** + * Base class for Commands in the new system. Can pass a lambda as part of the constructor or after the constructor. + * @author Ceikry + */ +class Command(val name: String, val privilege: Privilege, val handle: (Player, Array) -> Unit) { + fun attemptHandling(player: Player, args: Array?){ + args ?: return + if(player.rights.ordinal >= privilege.ordinal || GameWorld.settings?.isDevMode == true){ + handle(player,args) + } + } + + enum class Privilege{ + STANDARD, + MODERATOR, + ADMIN + } +} + +object CommandMapping { + private val mapping = hashMapOf() + + fun get(name: String): Command?{ + return mapping[name] + } + + fun register(command: Command){ + mapping[command.name] = command + } + + fun getCommands(): Array { + return mapping.values.toTypedArray() + } + + fun getNames(): Array { + return mapping.keys.toTypedArray() + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/CommandPlugin.kt b/Server/src/main/java/Server/core/game/system/command/CommandPlugin.kt new file mode 100644 index 000000000..cf3ad04c2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/CommandPlugin.kt @@ -0,0 +1,107 @@ +package core.game.system.command + +import core.game.node.entity.player.Player +import core.game.world.repository.Repository +import core.plugin.Plugin + +/** + * Represents a command plugin that can be linked to a command set. + * @author Vexia + */ +abstract class CommandPlugin : Plugin { + /** + * Method used to wrap around a command sets pase method. + * @param player the player. + * @param name the name. + * @param args the arguments. + * @return `True` if so. + */ + abstract fun parse(player: Player?, name: String?, args: Array?): Boolean + + /** + * Used to override for specific plugins. + * @param player the player. + * @return `True` if so. + */ + fun validate(player: Player?): Boolean { + return true + } + + override fun fireEvent(identifier: String, vararg args: Any): Any { + return Unit + } + + /** + * Method used to link this command plugin to a command set. + * @param sets the sets to link to. + */ + fun link(vararg sets: CommandSet) { + for (set in sets) { + set.plugins.add(this) + } + } + + companion object { + /** + * Method used to parse the string as an integer. + * @param string the string. + * @return the integer. + */ + @JvmStatic + fun toInteger(string: String): Int { + return try { + string.toInt() + } catch (exception: NumberFormatException) { + 1 + } + } + + /** + * Gets the argument line (starting at index 1). + * @param args The arguments. + * @return The argument line. + */ + fun getArgumentLine(args: Array): String { + return getArgumentLine(args, 1, args.size) + } + + /** + * Gets the argument line from the given arguments. + * @param args The arguments. + * @param offset The start index. + * @param length The end index. + * @return the line. + */ + fun getArgumentLine(args: Array, offset: Int, length: Int): String { + val sb = StringBuilder() + for (i in offset until length) { + if (i != offset) { + sb.append(" ") + } + sb.append(args[i]) + } + return sb.toString() + } + + /** + * Gets the target player. + * @param name The name. + * @param load If we load the file. + * @return The player. + */ + @JvmStatic + fun getTarget(name: String?, load: Boolean): Player? { + return Repository.getPlayerByName(name) + } + + /** + * Gets the target player. + * @param name The name. + * @return The player. + */ + @JvmStatic + fun getTarget(name: String?): Player? { + return Repository.getPlayerByName(name) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/CommandSet.java b/Server/src/main/java/Server/core/game/system/command/CommandSet.java new file mode 100644 index 000000000..449b4362d --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/CommandSet.java @@ -0,0 +1,99 @@ +package core.game.system.command; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.world.GameWorld; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a command set. + * @author Vexia + */ +public enum CommandSet { + PLAYER(), + MODERATOR() { + @Override + public boolean validate(Player player) { + return player.getDetails().getRights().ordinal() > 0; + } + }, + ADMINISTRATOR() { + @Override + public boolean validate(Player player) { + return player.getDetails().getRights().equals(Rights.ADMINISTRATOR); + } + }, + DEVELOPER() { + @Override + public boolean validate(Player player) { + return player.getDetails().getRights().equals(Rights.ADMINISTRATOR); + } + }, + BETA() { + @Override + public boolean validate(Player player) { + return GameWorld.getSettings().isBeta() || ADMINISTRATOR.validate(player) || GameWorld.getSettings().isDevMode(); + } + }; + + /** + * Represents the list of linked plugins with this command set. + */ + private final List plugins = new ArrayList<>(); + + /** + * Constructs a new {@code CommandSet} {@code Object}. + */ + private CommandSet() { + /* + * empty. + */ + } + + /** + * Checks if the player can use this set. + * @param player the player. + */ + public boolean validate(final Player player) { + return true; + } + + /** + * Interprets and incoming command by dispatching it to it's plugins. + * @param player the player. + * @param name the name. + * @param arguments the arguments. + * @return True if the command was interpreted. + */ + public boolean interpret(final Player player, final String name, final String... arguments) { + if (player == null) { + return false; + } + if (!validate(player)) { + return false; + } + if (player.getZoneMonitor().parseCommand(player, name, arguments)) { + return true; + } + for (int i = 0; i < plugins.size(); i++) { + CommandPlugin plugin = plugins.get(i); + if (!plugin.validate(player)) { + continue; + } + if (plugin.parse(player, name, arguments)) { + return true; + } + } + return false; + } + + /** + * Gets the list of plugins of this command set. + * @return the plugins of this set. + */ + public List getPlugins() { + return plugins; + } +} diff --git a/Server/src/main/java/Server/core/game/system/command/CommandSystem.kt b/Server/src/main/java/Server/core/game/system/command/CommandSystem.kt new file mode 100644 index 000000000..442719dba --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/CommandSystem.kt @@ -0,0 +1,43 @@ +package core.game.system.command + +import core.game.node.entity.player.Player + +/** + * Represents a managing system used to dispatch incoming commands. + * @author Vexia + */ +class CommandSystem { + /** + * Method used to parse an incomming command packet. + * @param player the player. + * @param message the command message. + */ + fun parse(player: Player?, message: String): Boolean { + player ?: return false + val arguments = message.split(" ").toTypedArray() + val command = CommandMapping.get(arguments[0]) + + if(command == null) { + for (set in CommandSet.values()) { + if (set.interpret(player, arguments[0], *arguments)) { + return true + } + } + } else { + command.attemptHandling(player,arguments) + } + return false + } + + companion object { + /** + * Gets the command system instance. + * @return the instance. + */ + /** + * Represents the singleton instance of this class. + */ + val commandSystem = CommandSystem() + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/MapDumpCommand.kt b/Server/src/main/java/Server/core/game/system/command/MapDumpCommand.kt new file mode 100644 index 000000000..749afd795 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/MapDumpCommand.kt @@ -0,0 +1,81 @@ +package core.game.system.command + +import core.game.node.entity.player.Player +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.plugin.Initializable +import core.plugin.Plugin +import java.util.* + +@Initializable +class MapDumpCommand : CommandPlugin() { + + @Throws(Throwable::class) + override fun newInstance(arg: Any?): Plugin? { + link(CommandSet.ADMINISTRATOR) + return this + } + + override fun parse(player: Player?, name: String?, args: Array?): Boolean { + when (name) { + "mapredo" -> redoMap(3000, 3000, 1).also { return true } + "findobj" -> findObj(player, args?.toList() as List?).also { return true } + } + return false + } + + companion object { + private val GameObjectMap = HashMap() + private val LocationObjectMap = HashMap?>() + private fun redoMap(xmax: Int, ymax: Int, zmax: Int) { + GameObjectMap.clear() + LocationObjectMap.clear() + for (x in 0 until xmax - 1) { + for (y in 0 until ymax - 1) { + for (z in 0 until zmax - 1) { + val temp = RegionManager.getObject(z, x, y) + if (temp != null) { + GameObjectMap[Location(x, y, z)] = temp.id + } + } + } + } + for ((key, value) in GameObjectMap) { + if (LocationObjectMap.containsKey(value)) { + LocationObjectMap[value]!!.add(key) + } else { + val locations: MutableList = ArrayList() + locations.add(key) + LocationObjectMap[value] = locations + } + } + return; + } + + private fun findObj(player: Player?, args: List?) { + val objId = Integer.parseInt(args?.getOrNull(1)) + val xmin = 50 + val ymin = 50 + val zmin = 0 + val xmax = 55 + val ymax = 55 + val zmax = 1 + + player!!.packetDispatch.sendMessage("Searching...") + + for (x in xmin until xmax - 1) { + for (y in ymin until ymax - 1) { + for (z in zmin until zmax - 1) { + player.packetDispatch.sendMessage(Location(x,y,z).toString()) + val temp = RegionManager.getObject(Location(x,y,z)) + if (temp != null && temp.id == objId) { + player.packetDispatch.sendMessage("Absolute: [$x,$y,$z]") + } + } + } + } + + return; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/oldsys/AIPCommandPlugin.kt b/Server/src/main/java/Server/core/game/system/command/oldsys/AIPCommandPlugin.kt new file mode 100644 index 000000000..6375d46ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/oldsys/AIPCommandPlugin.kt @@ -0,0 +1,329 @@ +package core.game.system.command.oldsys + +import core.game.container.impl.EquipmentContainer +import core.game.interaction.Interaction +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.appearance.Gender +import core.game.system.command.CommandPlugin +import core.game.system.command.CommandSet +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.ImmerseWorld +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.map.path.Pathfinder +import core.game.world.repository.Repository +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.RandomFunction +import plugin.ai.AIPBuilder +import plugin.ai.AIPlayer +import plugin.ai.general.GeneralBotCreator +import plugin.ai.general.scriptrepository.LobsterCatcher +//import plugin.ai.general.scriptrepository.ManThiever +import plugin.ai.pvmbots.PvMBotsBuilder +import plugin.ai.pvp.PVPAIPActions +import plugin.ai.pvp.PVPAIPBuilderUtils +import plugin.ai.resource.ResourceAIPActions +import plugin.ai.skillingbot.SkillingBotsBuilder +import plugin.ai.wilderness.PvPBotsBuilder +import core.game.node.entity.skill.Skills +import java.util.* + +/** + * Handles the AIPlayer commands. + * These commands are for bots + * + * @author Emperor + */ +@Initializable +class AIPCommandPlugin : CommandPlugin() { + override fun newInstance(arg: Any?): Plugin? { + link(CommandSet.ADMINISTRATOR) + return this + } + + override fun parse(player: Player?, name: String?, args: Array?): Boolean { + var name = name + var legion = player!!.getAttribute>("aip_legion") + when (name) { + "desaip" -> { + player.removeAttribute("aip_select") + return true + } + "sellegion" -> { + if (legion != null && !legion.isEmpty()) { + player.setAttribute("aip_select", legion[0]) + } + return true + } + "regroup" -> { + var last = player + if (legion != null && !legion.isEmpty()) { + for (p in legion) { + p.follow(last) + last = p + } + } + player.removeAttribute("aip_select") + return true + } + "clearlegion" -> { + if (legion != null && !legion.isEmpty()) { + for (p in legion) { + AIPlayer.deregister(p.uid) + } + legion.clear() + } + player.removeAttribute("aip_select") + player.removeAttribute("aip_legion") + return true + } + "clearaips" -> { + for (p in Repository.players) { + if (p.isArtificial) { + p.clear() + } + } + return true + } + "aip" -> { + name = if (args!!.size < 2) player.name else args[1] + val p = AIPBuilder.copy(player, player.location.transform(0, 1, 0)) + p.init() + Interaction.sendOption(player, 7, "Control") + return true + } + "legion" -> { + val size = if (args!!.size < 2) 10 else args[1]!!.toInt() + var last = player + if (legion == null) { + player.setAttribute("aip_legion", ArrayList().also { legion = it }) + } + Interaction.sendOption(player, 7, "Control") + val joinClan = player.communication.clan != null && !player.communication.clan.isDefault + var i = 0 + while (i < size) { + val aip = AIPBuilder.copy(player, last!!.getLocation().transform(0, 1, 0)) + aip.init() + if (legion!!.isEmpty()) { + aip.setAttribute("aip_legion", legion) + } + legion!!.add(aip) + val l: Player = last!! + if (joinClan) { + if (player.communication.clan.enter(aip)) { + aip.communication.clan = player.communication.clan + } + if (player.communication.clan.clanWar != null) { + player.communication.clan.clanWar.fireEvent("join", aip) + } + } + GameWorld.Pulser.submit(object : Pulse(1) { + override fun pulse(): Boolean { + aip.follow(l) + return true + } + }) + last = aip + i++ + } + return true + } + "banktest" -> { + val bot = AIPlayer(player.location) + //Location.create(2719, 3431, 0) + //Location.create(2726, 3477, 0) + //Location.create(2726, 3491, 0) + Pathfinder.find(bot,Location.create(2726, 3491, 0)).walk(bot) + return true + } + "pvplegion" -> { + val size = if (args!!.size < 2) 10 else args[1]!!.toInt() + var last = player + if (PVPAIPActions.pvp_players == null) { + player.setAttribute("aip_legion", ArrayList().also { PVPAIPActions.pvp_players = it }) + } + var i = 0 + while (i < size) { + val aip = AIPBuilder.create(generateLocation(player)) + aip.controler = player + aip.appearance.gender = if (RandomFunction.random(3) == 1) Gender.FEMALE else Gender.MALE + aip.init() + PVPAIPBuilderUtils.generateClass(aip) + if (PVPAIPActions.pvp_players.isEmpty()) { + aip.setAttribute("aip_legion", PVPAIPActions.pvp_players) + } + PVPAIPActions.pvp_players.add(aip) + last = aip + i++ + } + return true + } + "resourcelegion" -> { + val size = if (args!!.size < 2) 10 else args[1]!!.toInt() + var last = player + if (ResourceAIPActions.resource_players == null) { + player.setAttribute("aip_legion", ArrayList().also { ResourceAIPActions.resource_players = it }) + } + var i = 0 + while (i < size) { + val aip = AIPBuilder.create(generateLocation(player)) + aip.controler = player + aip.appearance.gender = if (RandomFunction.random(3) == 1) Gender.FEMALE else Gender.MALE + aip.init() + PVPAIPBuilderUtils.generateClass(aip) + if (ResourceAIPActions.resource_players.isEmpty()) { + aip.setAttribute("aip_legion", ResourceAIPActions.resource_players) + } + ResourceAIPActions.resource_players.add(aip) + i++ + } + return true + } + "syncresource" -> ResourceAIPActions.syncBotThread(player) + "pvpfight" -> { + PVPAIPActions.syncBotThread(player) + return true + } + "bot" -> { + PvMBotsBuilder.spawnLowest(player.location) + return true + } + "molebot" -> { + PvMBotsBuilder.spawnGiantMoleBot(player.location) + return true + } + "slayerpoints" -> { + player.slayer.slayerPoints = 50000 + return true + } + "dragonbot" -> { + PvMBotsBuilder.spawnDragonKiller(player.location) + return true + } + "pure" -> { + player.skills.setStaticLevel(Skills.HITPOINTS, 60) + player.skills.setStaticLevel(Skills.RANGE, 95) + player.skills.setStaticLevel(Skills.MAGIC, 95) + player.skills.setStaticLevel(Skills.ATTACK, 50) + player.skills.setStaticLevel(Skills.STRENGTH, 93) + player.skills.setStaticLevel(Skills.DEFENCE, 1) + player.skills.setStaticLevel(Skills.PRAYER, 1) + player.skills.updateCombatLevel() + return true + } + "noobbot" -> { + PvMBotsBuilder.spawnNoob(player.location) + return true + } + "immerse", "immersiveworld", "immersive" -> { + ImmerseWorld.init() + player.sendMessage("Started immersive world, 2") + return true + } + "botdataform" -> { + //Dumps your current character info in the form used by data/botdata + //name:cblevel:helmet:cape:neck:weapon:chest:shield:unknown:legs:unknown:gloves:boots: + println(player.username + ":" + + player.properties.currentCombatLevel + ":" + + player.equipment.getAsId(EquipmentContainer.SLOT_HAT) + ":" + + player.equipment.getAsId(EquipmentContainer.SLOT_CAPE) + ":" + + player.equipment.getAsId(EquipmentContainer.SLOT_AMULET) + ":" + + player.equipment.getAsId(EquipmentContainer.SLOT_WEAPON) + ":" + + player.equipment.getAsId(EquipmentContainer.SLOT_CHEST) + ":" + + player.equipment.getAsId(EquipmentContainer.SLOT_SHIELD) + ":" + + "0" + ":" + + player.equipment.getAsId(EquipmentContainer.SLOT_LEGS) + ":" + + "0" + ":" + + player.equipment.getAsId(EquipmentContainer.SLOT_HANDS) + ":" + + player.equipment.getAsId(EquipmentContainer.SLOT_FEET) + ":" + ) + return true + } + "fishtest" -> { + SkillingBotsBuilder.spawnTroutLumbridge(Location(3241, 3242)) + return true + } + "varrockminebots" -> { + SkillingBotsBuilder.spawnClayBotVarrock(Location(3181, 3368)) + SkillingBotsBuilder.spawnSilverBotVarrock(Location(3181, 3368)) + SkillingBotsBuilder.spawnIronBotVarrock(Location(3181, 3368)) + SkillingBotsBuilder.spawnTinBotVarrock(Location(3181, 3368)) + return true + } + "pvpbot" -> { + PvPBotsBuilder.spawn(player.location) + return true + } + "pvpbots" -> { + var amountBots = 0 + while (amountBots < 50) { + PvPBotsBuilder.spawn(player.location) + amountBots++ + } + return true + } + "ranger" -> { + } + "removetask" -> return if (!player.slayer.hasTask()) { + player.sendMessage("You don't have an active task right now.") + true + } else { + player.slayer.clear() + player.sendMessage("You have canceled your current task.") + true + } + "testpest", "pcbots", "pestcontrolbots", "pest-test", "test-pest", "pesttest" -> { + player.sendMessage("Spawning some bots I think") + val arg2: Int + arg2 = try { + args!![1]!!.toInt() + } catch (e: Exception) { + 20 + } + var pestBotsAmount = 0 + while (pestBotsAmount < arg2) { + PvMBotsBuilder.createPestControlTestBot(player.location) + pestBotsAmount++ + } + return true + } + "bots" -> { + var arg = 1 + var xpos = 0 + var ypos = 0 + try { + arg = args!![1]!!.toInt() + } catch (e: Exception) { + println("Rip " + args!![1]) + } + var amountBots2 = 0 + while (amountBots2 < arg) { + xpos = 2500 + RandomFunction.getRandom(1000) + ypos = 3000 + RandomFunction.getRandom(500) + PvMBotsBuilder.spawnNoob(Location(xpos, ypos)) + amountBots2++ + } + println("$xpos $ypos") + return true + } + //"manthiev" -> GeneralBotCreator(player.location, ManThiever()) + "fish" -> GeneralBotCreator(Location.create(2805, 3435, 0), LobsterCatcher()) + } + return false + } + + private fun generateLocation(player: Player?): Location { + val random_location = player!!.location.transform(RandomFunction.random(-15, 15), RandomFunction.random(-15, 15), 0) + if (!RegionManager.isTeleportPermitted(random_location)) { + return generateLocation(player) + } + if (!Pathfinder.find(player, random_location, false, Pathfinder.DUMB).isSuccessful) { + return generateLocation(player) + } + return if (RegionManager.getObject(random_location) != null) { + generateLocation(player) + } else random_location + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/oldsys/SimpleDumpingCommands.kt b/Server/src/main/java/Server/core/game/system/command/oldsys/SimpleDumpingCommands.kt new file mode 100644 index 000000000..566d0ab94 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/oldsys/SimpleDumpingCommands.kt @@ -0,0 +1,102 @@ +package core.game.system.command.oldsys + +import core.cache.def.impl.ItemDefinition +import core.cache.def.impl.NPCDefinition +import core.cache.def.impl.ObjectDefinition +import core.game.node.entity.player.Player +import core.game.system.command.CommandPlugin +import core.game.system.command.CommandSet +import core.plugin.Initializable +import core.plugin.Plugin +import java.io.BufferedWriter +import java.io.File + +@Initializable +class SimpleDumpingCommands : CommandPlugin() { + override fun parse(player: Player?, name: String?, args: Array?): Boolean { + when(name) { + "make" -> handleMake(player, args?.toList() as List?).also { return true } + } + return false + } + + private fun handleMake(player: Player?,args: List?){ + val dataType = args?.getOrNull(1) + val outputType = args?.getOrNull(2) + + if(dataType == null || outputType == null) player?.sendMessage("Usage: ::make item|object|npc list|doc") + + when(outputType){ + "list" -> makeDumpList(dataType!!).also { player?.sendMessage("Creating $dataType dump list...") } + "doc" -> makeDumpDoc(dataType!!).also { player?.sendMessage("Creating $dataType dump doc...") } + } + } + + private fun makeDumpList(type: String){ + val f = File(System.getProperty("user.dir") + File.separator + "${type}list.txt") + val writer = f.bufferedWriter() + when(type){ + "item" -> for (i in ItemDefinition.getDefinitions().values){ + writer.writeLn("${i.name}(${i.id}) - ${i.examine}") + } + "object" -> for(i in ObjectDefinition.getDefinitions().values){ + writer.writeLn("${i.name}(${i.id}) - ${i.examine}") + } + "npc" -> for(i in NPCDefinition.getDefinitions().values){ + writer.writeLn("${i.name}(${i.id}) - ${i.examine}") + } + } + writer.close() + } + + private fun makeDumpDoc(type: String){ + val f = File(System.getProperty("user.dir") + File.separator + "${type}list.html") + println(f.absolutePath) + val writer = f.bufferedWriter() + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + when(type){ + "item" -> for (i in ItemDefinition.getDefinitions().values){ + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + } + "object" -> for(i in ObjectDefinition.getDefinitions().values){ + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + } + "npc" -> for(i in NPCDefinition.getDefinitions().values){ + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + writer.writeLn("") + } + } + writer.writeLn("
$type name$type IDExamine Text
${i.name}${i.id}${i.examine}
${i.name}${i.id}${i.examine}
${i.name}${i.id}${i.examine}
") + writer.close() + } + + override fun newInstance(arg: Any?): Plugin? { + link(CommandSet.ADMINISTRATOR) + return this + } + + private fun BufferedWriter.writeLn(line: String){ + this.write(line) + this.newLine() + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/oldsys/VisualCommand.kt b/Server/src/main/java/Server/core/game/system/command/oldsys/VisualCommand.kt new file mode 100644 index 000000000..ba3a3ea03 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/oldsys/VisualCommand.kt @@ -0,0 +1,460 @@ +package core.game.system.command.oldsys + +import core.cache.Cache +import core.game.container.access.InterfaceContainer +import core.game.node.`object`.GameObject +import core.game.node.`object`.ObjectBuilder +import core.game.node.entity.combat.ImpactHandler.HitsplatType +import core.game.node.entity.impl.Projectile +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.IronmanMode +import core.game.node.entity.player.link.audio.Audio +import core.game.node.item.Item +import core.game.system.command.CommandPlugin +import core.game.system.command.CommandSet +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.repository.Repository +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.plugin.Initializable +import core.plugin.Plugin +import core.game.content.activity.ActivityManager +import core.game.content.quest.tutorials.tutorialisland.CharacterDesign +import java.awt.Toolkit +import java.awt.datatransfer.StringSelection + +/** + * Represents the the command plugin used for visual commands. + * @author Vexia + * @author Emperor + */ +@Initializable +class VisualCommand : CommandPlugin() { + override fun newInstance(arg: Any?): Plugin? { + link(CommandSet.ADMINISTRATOR) + return this + } + + override fun parse(player: Player?, name: String?, args: Array?): Boolean { + var location: Location? = null + var `object`: GameObject? = null + var o: Player? = null + when (name) { + "invisible", "invis", "seti" -> { + player!!.isInvisible = !player.isInvisible + player.sendMessage("You are now " + (if (player.isInvisible) "invisible" else "rendering") + " for other players.") + } + "maxkc" -> { + var i = 0 + while (i < 6) { + player!!.savedData.activityData.barrowBrothers[i] = true + i++ + } + val names = arrayOf("Ahrim", "Dharok", "Guthan", "Karil", "Torag", "Verac") + player!!.savedData.activityData.barrowKills = 50 + player.packetDispatch.sendMessage("Flagged all barrow brothers killed and 50 catacomb kills, current entrance: " + names[player.savedData.activityData.barrowTunnelIndex] + ".") + return true + } + "1hko" -> { + player!!.setAttribute("1hko", !player.getAttribute("1hko", false)) + player.packetDispatch.sendMessage("1-hit KO mode " + if (player.getAttribute("1hko", false)) "on." else "off.") + return true + } + "anim", "emote" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: id (optional) delay") + return true + } + val animation = Animation(args[1]!!.toInt(), if (args.size > 2) args[2]!!.toInt() else 0) + player!!.animate(animation) + return true + } + "render", "remote" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: ::render id") + return true + } + try { + player!!.appearance.setAnimations(Animation.create(args[1]!!.toInt())) + player.appearance.sync() + } catch (e: NumberFormatException) { + player!!.packetDispatch.sendMessage("Use: ::remote id") + } + return true + } + "normalwalk" -> { + player!!.appearance.prepareBodyData(player) + player.appearance.setDefaultAnimations() + player.appearance.setAnimations() + player.appearance.sync() + return true + } + "gfx", "graphic", "graphics" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: id (optional) height delay") + return true + } + player!!.graphics(Graphics(args[1]!!.toInt(), if (args.size > 2) args[2]!!.toInt() else 0, if (args.size > 3) args[3]!!.toInt() else 0)) + return true + } + "sync", "visual" -> { + if (args!!.size < 3) { + player!!.debug("syntax error: anim_id gfx_id (optional) height") + return true + } + val animId = toInteger(args[1]!!) + val gfxId = toInteger(args[2]!!) + val height = if (args.size > 3) toInteger(args[3]!!) else 0 + player!!.visualize(Animation.create(animId), Graphics(gfxId, height)) + return true + } + "pos_graphic", "position_gfx", "pos_gfx", "lgfx" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: id x y (optional) z height delay") + return true + } + location = Location.create(args[2]!!.toInt(), args[3]!!.toInt(), if (args.size > 4) args[4]!!.toInt() else 0) + player!!.packetDispatch.sendPositionedGraphic(args[1]!!.toInt(), if (args.size > 5) args[5]!!.toInt() else 0, if (args.size > 6) args[6]!!.toInt() else 0, location) + } + "npc" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: id (optional) direction") + return true + } + val npc = NPC.create(toInteger(args[1]!!), player!!.location) + npc.setAttribute("spawned:npc", true) + npc.isRespawn = false + npc.direction = player.direction + npc.init() + npc.isWalks = if (args.size > 2) true else false + val npcString = "{" + npc.location.x + "," + npc.location.y + "," + npc.location.z + "," + (if (npc.isWalks) "1" else "0") + "," + npc.direction.ordinal + "}" + val clpbrd = Toolkit.getDefaultToolkit().systemClipboard + clpbrd.setContents(StringSelection(npcString), null) + println(npcString) + return true + } + "npcsquad" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: id (optional) sizeX sizeY") + return true + } + var sizeX = 3 + var sizeY = 3 + if (args.size > 2) { + sizeX = toInteger(args[2]!!) + sizeY = if (args.size > 3) { + toInteger(args[3]!!) + } else { + sizeX + } + } + val aggressive = args.size > 4 + var x = 0 + while (x < sizeX) { + var y = 0 + while (y < sizeY) { + val npc = NPC.create(toInteger(args[1]!!), player!!.location.transform(1 + x, 1 + y, 0)) + npc.setAttribute("spawned:npc", true) + npc.setAggressive(aggressive) + npc.init() + npc.setRespawn(false) + npc.setWalks(aggressive) + y++ + } + x++ + } + return true + } + "oib" -> player!!.interfaceManager.openInfoBars() + "char" -> CharacterDesign.open(player) + "savenpc" -> return true + "objwithanim" -> { + val go = GameObject(toInteger(args!![1]!!), player!!.location, 0) + ObjectBuilder.add(go) + player.packetDispatch.sendObjectAnimation(go, Animation.create(toInteger(args[2]!!))) + return true + } + "oa", "object_anim", "obj_anim", "objectanim", "objanim" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: x y id") + return true + } + location = if (args.size > 2) Location.create(args[1]!!.toInt(), args[2]!!.toInt(), 3) else player!!.location + `object` = RegionManager.getObject(location) + if (`object` == null) { + player!!.debug("error: object not found in region cache.") + return true + } + player!!.packetDispatch.sendObjectAnimation(`object`, Animation(toInteger(args[args.size - 1]!!))) + return true + } + "inter", "component", "interface" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: interface-id") + return true + } + val componentId = toInteger(args[1]!!) + if (componentId < 0 || componentId > Cache.getInterfaceDefinitionsSize()) { + player!!.debug("Invalid component id [id=" + componentId + ", max=" + Cache.getInterfaceDefinitionsSize() + "].") + return true + } + player!!.interfaceManager.openComponent(componentId) + return true + } + "ti" -> player!!.packetDispatch.sendInterfaceConfig(90, 87, false) + "iconfig", "inter_config" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: interface-id child hidden") + return true + } + val hidden = if (args.size > 3) java.lang.Boolean.parseBoolean(args[3]) else true + player!!.packetDispatch.sendInterfaceConfig(toInteger(args[1]!!), toInteger(args[2]!!), hidden) + player.packetDispatch.sendMessage("Interface child (id=" + args[1] + ", child=" + args[2] + ") is " + if (hidden) "hidden." else "visible.") + return true + } + "loop_varposition" -> { + val value = (args!![1]!!.toString().toInt()) ?: 0 + val config_index = (args!![2]!!.toString().toInt()) + GameWorld.Pulser.submit(object : Pulse(3, player) { + var pos = 0 + override fun pulse(): Boolean { + player?.configManager?.forceSet(config_index, value shl pos,false) + player?.sendMessage("$pos") + return pos++ >= 32 + } + }) + } + "loop_inter" -> { + val st = toInteger(args!![1]!!) + val en = if (args.size > 2) toInteger(args[2]!!) else 740 + GameWorld.Pulser.submit(object : Pulse(3, player) { + var id = st + override fun pulse(): Boolean { +// PacketRepository.send(Interface.class, new InterfaceContext(player, 548, 77, id, false)); + player!!.interfaceManager.openComponent(id) + player.debug("Interface id: $id") + return ++id >= en + } + }) + return true + } + "loop_iconfig" -> { + val st = toInteger(args!![1]!!) + val en = if (args.size > 2) toInteger(args[2]!!) else 740 + GameWorld.Pulser.submit(object : Pulse(3, player) { + var id = 0 + override fun pulse(): Boolean { +// PacketRepository.send(Interface.class, new InterfaceContext(player, 548, 77, id, false)); + player!!.packetDispatch.sendInterfaceConfig(st,id,true) + player.debug("child id: $id") + return ++id >= en + } + }) + return true + } + "loop_itemoni" -> { + val st = toInteger(args!![1]!!) + val en = if (args.size > 2) toInteger(args[2]!!) else 740 + GameWorld.Pulser.submit(object : Pulse(1, player) { + var id = 0 + override fun pulse(): Boolean { +// PacketRepository.send(Interface.class, new InterfaceContext(player, 548, 77, id, false)); + InterfaceContainer.generateItems(player, arrayOf(Item(4151),Item(410)), arrayOf("E"),367,id,5,4) + player?.packetDispatch?.sendInterfaceConfig(st,id,true) + //player?.packetDispatch?.sendString("ASDASDASD",st,id) + player?.debug("child id: $id") + return ++id >= en + } + }) + return true + } + "loop_config", "config_loop" -> { + if (args!!.size < 4) { + player!!.debug("syntax error: config-id start end value") + return true + } + val value = toInteger(args[3]!!) + var i = toInteger(args[1]!!) + while (i < toInteger(args[2]!!)) { + player!!.configManager[i] = value + i++ + } + return true + } + "string" -> { + if (args!!.size < 3) { + player!!.debug("syntax error: interface child text") + return true + } + player!!.packetDispatch.sendString(args[3], toInteger(args[1]!!), toInteger(args[2]!!)) + return true + } + "loop_string", "string_loop" -> { + if (args!!.size < 3) { + player!!.debug("syntax error: interface min max") + return true + } + val interfaceId = toInteger(args[1]!!) + var i = toInteger(args[2]!!) + while (i < toInteger(args[3]!!)) { + player!!.packetDispatch.sendString("child=$i", interfaceId, i) + i++ + } + return true + } + "loop_oa" -> { + val startId = toInteger(args!![1]!!) + val endId = if (args.size > 2) toInteger(args[2]!!) else 11000 + GameWorld.Pulser.submit(object : Pulse(3, player) { + var id = startId + override fun pulse(): Boolean { + val `object` = RegionManager.getObject(player!!.location) + if (`object` == null) { + player.debug("error: object not found in region cache.") + return true + } + player.packetDispatch.sendObjectAnimation(`object`, Animation(id)) + player.debug("Animation id: $id") + return ++id >= endId + } + }) + return true + } + "loop_anim" -> { + val start = toInteger(args!![1]!!) + val end = if (args.size > 2) toInteger(args[2]!!) else 11000 + GameWorld.Pulser.submit(object : Pulse(3, player) { + var id = start + override fun pulse(): Boolean { + player!!.animate(Animation.create(id)) + player.debug("Animation id: $id") + return ++id >= end + } + }) + return true + } + "loop_gfx" -> { + val s = toInteger(args!![1]!!) + val e = if (args.size > 2) toInteger(args[2]!!) else 11000 + GameWorld.Pulser.submit(object : Pulse(3, player) { + var id = s + override fun pulse(): Boolean { + Projectile.create(player!!.location, player.location.transform(0, 3, 0), id, 42, 36, 46, 75, 5, 11).send() + player.graphics(Graphics(id, 96)) + player.debug("Graphic id: $id") + return ++id >= e + } + }) + return true + } + "removenpc" -> { + player!!.setAttribute("removenpc", !player.getAttribute("removenpc", false)) + player.debug("You have set remove npc value to " + player.getAttribute("removenpc", false) + ".") + return true + } + "pnpc" -> { + if (args!!.size < 2) { + player!!.debug("syntax error: id") + return true + } + player!!.appearance.transformNPC(toInteger(args[1]!!)) + return true + } + "itemoni" -> { + val inter = toInteger(args!![1]!!) + val child = toInteger(args[2]!!) + val item = if (args.size > 3) toInteger(args[3]!!) else 1038 + player!!.packetDispatch.sendItemZoomOnInterface(item, 270, inter, child) + return true + } + "hit" -> { + player!!.impactHandler.manualHit(player, toInteger(args!![1]!!), HitsplatType.NORMAL) + return true + } + "sound" -> { + player!!.audioManager.send(Audio(args!![1]!!.toInt(), 10, 1)) + return true + } + "noclip" -> { + player!!.setAttribute("no_clip", !player.getAttribute("no_clip", false)) + return true + } + /*"grow" -> { + for (wrapper in player!!.farmingManager.patches) { + if (wrapper == null || wrapper.patch == null || wrapper.cycle == null || wrapper.cycle.growthHandler == null) { + continue + } + wrapper.cycle.growthHandler.handle() + } + return true + }*/ + "disabledisease" -> { + player!!.setAttribute("stop-disease", !player.getAttribute("stop-disease", false)) + player.sendMessage("Disable disease=" + player.getAttribute("stop-disease", false)) + return true + } + /* + "rake" -> { + for (wrapper in player!!.farmingManager.patches) { + wrapper.cycle.clear(player) + } + return true + } + "full" -> { + for (wrapper in player!!.farmingManager.patches) { + var i = 0 + while (i < 20) { + if (wrapper == null || wrapper.patch == null || wrapper.cycle == null || wrapper.cycle.growthHandler == null) { + i++ + continue + } + wrapper.cycle.growthHandler.handle() + i++ + } + } + return true + } + "toreg" -> { + o = Repository.getPlayerByName(args!![1]) + o?.ironmanManager?.mode = IronmanMode.NONE + player!!.sendMessage("done...") + o?.sendMessage("You are no longer an ironman. Log out to see the ironman icon disappear.") + } + "testcut" -> { + ActivityManager.start(player,"Lost Tribe Cutscene",true) + } + "tryinfinity" -> { + GameWorld.Pulser.submit(object : Pulse(1, player) { + var id = 0 + override fun pulse(): Boolean { + player?.configManager?.set(532,id) + player?.debug("Child: $id") + return ++id == 999 + } + }) + } + "clearpatches" -> { + if (args!!.size > 1) { + o = Repository.getPlayerByName(args[1]) + } + if (o != null) { + for (wrapper in o.farmingManager.patches) { + wrapper.cycle.clear(o) + } + o.sendMessage("Your patches have been cleared.") + player!!.sendMessage("You cleared " + o.username + "'s patches.") + return true + } + for (wrapper in player!!.farmingManager.patches) { + wrapper.cycle.clear(player) + } + return true + }*/ + } + return false; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithNPCDialogue.kt b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithNPCDialogue.kt new file mode 100644 index 000000000..df3f2b215 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithNPCDialogue.kt @@ -0,0 +1,69 @@ +package core.game.system.command.rottenpotato + +import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.tools.stringtools.colorize + +/** + * Rotten potato -> npc interaction menu + * @author Ceikry + */ +@Initializable +class RPUseWithNPCDialogue(player: Player? = null) : DialoguePlugin(player) { + var npc: NPC? = null + val ID = 38575795 + override fun newInstance(player: Player?): DialoguePlugin { + return RPUseWithNPCDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + npc = args[0] as NPC + options("Remove NPC","Enable Respawning","Disable Respawning","Kill","Copy Appearance") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + npc ?: return false + when(buttonId){ + //remove NPC + 1 -> { + end() + npc.isRespawn = false + npc.clear() + player.sendMessage(colorize("%RNPC Cleared.")) + } + //Enable Respawn + 2 -> { + end() + npc.isRespawn = true + player.sendMessage(colorize("%RNPC Respawn Enabled")) + } + //Disable Respawn + 3 -> { + end() + npc.isRespawn = false + player.sendMessage(colorize("%RNPC Respawn Disabled")) + } + //Kill + 4 -> { + end() + npc.impactHandler.manualHit(player,npc.skills.lifepoints,ImpactHandler.HitsplatType.NORMAL) + } + //Copy Appearance + 5 -> { + end() + player.appearance.transformNPC(npc.id) + } + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(ID) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithPlayerDialogue.kt b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithPlayerDialogue.kt new file mode 100644 index 000000000..df3236dfd --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RPUseWithPlayerDialogue.kt @@ -0,0 +1,44 @@ +package core.game.system.command.rottenpotato + +import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.player.Player +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin + +@Initializable +/** + * Rotten Potato -> Player interaction dialogue + * @author Ceikry + */ +class RPUseWithPlayerDialogue(player: Player? = null) : DialoguePlugin(player) { + var other: Player? = null + val ID = 38575796 + + override fun newInstance(player: Player?): DialoguePlugin { + return RPUseWithPlayerDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + other = args[0] as Player + + options("Kill","View Bank","Copy Inventory") + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(buttonId){ + 1 -> other!!.impactHandler.manualHit(player,other!!.skills.lifepoints,ImpactHandler.HitsplatType.NORMAL) + 2 -> other!!.bank!!.open(player) + 3 -> { + player.inventory.clear() + player.inventory.addAll(other!!.inventory) + } + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(ID) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue.kt b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue.kt new file mode 100644 index 000000000..fef5dee3d --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoExtraDialogue.kt @@ -0,0 +1,124 @@ +package core.game.system.command.rottenpotato + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.RunScript +import core.game.world.map.RegionManager +import core.game.world.repository.Repository +import core.plugin.Initializable +import core.game.content.dialogue.DialoguePlugin +import core.tools.stringtools.colorize + +@Initializable +/** + * Rotten Potato Right click -> Extra dialogue menu + * @author Ceikry + */ +class RottenPotatoExtraDialogue(player: Player? = null) : DialoguePlugin(player) { + val ID = 38575794 + val AMEs = arrayOf("chicken","Sandwich Lady","tree spirit","rick turpentine","Genie") + val BossIDs = arrayOf(50,8350,8133,2745) + val BossNames = arrayOf("KBD","Tormented Demon","Corporeal Beast","Jad") + + override fun newInstance(player: Player?): DialoguePlugin { + return RottenPotatoExtraDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + options("Send Player Notification","Targeted AME","Spawn Boss","Force Area NPC Chat","Kill All Nearby NPCs") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage) { + + 0 -> when (buttonId) { + //Send Player Notification + 1 -> { + end() + player.setAttribute("runscript", object : RunScript() { + override fun handle(): Boolean { + val message = getValue().toString() + for (p in Repository.players) { + p ?: continue + p.packetDispatch.sendString(colorize("%Y${message.replace("_", " ").capitalize()}"), 754, 5) + } + return true + } + }) + player.dialogueInterpreter.sendLongInput("Enter the notification message:") + } + //Targeted AME + 2 -> { + options(*AMEs) + stage = 100 + } + + //Boss Spawn menu + 3 -> { + options(*BossNames) + stage = 200 + } + + //Force Area NPC Chat + 4 -> { + end() + player.setAttribute("runscript", object : RunScript() { + override fun handle(): Boolean { + val msg = getValue().toString() + RegionManager.getLocalNpcs(player).forEach { + it.sendChat(msg) + } + return true + } + }) + player.dialogueInterpreter.sendLongInput("Enter the chat message:") + } + + //Kill all nearby NPCs + 5 -> { + end() + RegionManager.getLocalNpcs(player).forEach { + it.finalizeDeath(player) + } + } + + } + //AME Spawning + 100 -> { + end() + player.setAttribute("runscript", object : RunScript() { + override fun handle(): Boolean { + val other = Repository.getPlayerByName(getValue().toString().toLowerCase().replace(" ", "_")) + if (other == null) { + player.sendMessage(colorize("%RInvalid player name.")) + return true + } + + other?.antiMacroHandler?.fireEvent(AMEs[buttonId - 1]) + + return true + } + }) + player.dialogueInterpreter.sendInput(true, "Enter player name:") + } + + //Spawn boss + 200 -> { + end() + val id = BossIDs[buttonId - 1] + val boss = NPC(id,player.location) + boss.isRespawn = false + boss.isAggressive = true + boss.init() + } + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(ID) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kt b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kt new file mode 100644 index 000000000..cc4f2bd89 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoOptionHandler.kt @@ -0,0 +1,43 @@ +package core.game.system.command.rottenpotato + +import core.cache.def.impl.ItemDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.system.command.CommandSystem +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items +import core.tools.stringtools.colorize + +/** + * Handles the Rotten Potato options + * @author Ceikry + */ +private val ROTTEN_POTATO_OPTIONS = arrayOf("RS HD","Heal","Extra","Commands") +@Initializable +class RottenPotatoOptionHandler : OptionHandler() { + override fun newInstance(arg: Any?): Plugin { + for(option in ROTTEN_POTATO_OPTIONS) { + ItemDefinition.forId(Items.ROTTEN_POTATO_5733).handlers["option:${option.toLowerCase()}"] = this + } + return this; + } + + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + player ?: return false + node ?: return false + option ?: return false + + when(option){ + "rs hd" -> player.dialogueInterpreter.open(RottenPotatoRSHDDialogue().ID) + "heal" -> player.fullRestore().also { player.sendMessage(colorize("%RAll healed!")) } + "extra" -> player.dialogueInterpreter.open(RottenPotatoExtraDialogue().ID) + "commands" -> { + CommandSystem.commandSystem.parse(player,"commands") + } + } + return true + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt new file mode 100644 index 000000000..fa2d58eb4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoRSHDDialogue.kt @@ -0,0 +1,96 @@ +package core.game.system.command.rottenpotato + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.login.PlayerParser +import core.game.node.entity.player.link.RunScript +import core.game.world.ImmerseWorld +import core.game.world.repository.Repository +import core.plugin.Initializable +import plugin.ai.AIPlayer +import plugin.ai.AIRepository +import core.game.content.dialogue.DialoguePlugin +import core.tools.stringtools.colorize + +@Initializable +/** + * Rotten Potato "RS HD" option menu + * @author Ceikry + */ +class RottenPotatoRSHDDialogue(player: Player? = null) : DialoguePlugin(player) { + val ID = 38575793 + override fun newInstance(player: Player?): DialoguePlugin { + return RottenPotatoRSHDDialogue(player) + } + + override fun open(vararg args: Any?): Boolean { + options("Wipe Bots", "Spawn Bots", "Force Log Players", "View Bank", "Copy Inventory") + stage = 0 + return true + } + + override fun handle(interfaceId: Int, buttonId: Int): Boolean { + when(stage){ + 0 -> { + when (buttonId) { + //Wipe Bots + 1 -> AIRepository.PulseRepository.toTypedArray().forEach { it.stop(); it.botScript.bot.clear(); AIPlayer.deregister((it.botScript.bot as AIPlayer).uid) }.also { player.sendMessage(colorize("%RBots wiped.")); end() } + //Spawn Bots + 2 -> ImmerseWorld.init().also { player.sendMessage(colorize("%RBots Respawning...")); end() } + //Force Log All Online Players + 3 -> { + Repository.disconnectionQueue.clear().also { end() } + Repository.players.toArray().forEach { + val p = it.asPlayer() + if (p != null && !p.isArtificial()) { // Should never be null. + p.removeAttribute("combat-time") + p.clear() + PlayerParser.save(p) + p.getDetails().save() + } + } + } + //View Bank + 4 -> { + end() + player.setAttribute("runscript", object : RunScript() { + override fun handle(): Boolean { + val other = Repository.getPlayerByName(getValue().toString().toLowerCase().replace(" ","_")) + if(other == null){ + player.sendMessage(colorize("%RInvalid player name.")) + return true + } + + other.bank.open(player) + return true + } + }) + player.dialogueInterpreter.sendInput(true, "Enter the player name:") + } + //View Inventory + 5 -> { + end() + player.setAttribute("runscript", object : RunScript() { + override fun handle(): Boolean { + val other = Repository.getPlayerByName(getValue().toString().toLowerCase().replace(" ","_")) + if(other == null){ + player.sendMessage(colorize("%RInvalid player name.")) + return true + } + + player.inventory.clear() + player.inventory.addAll(other.inventory) + return true + } + }) + player.dialogueInterpreter.sendInput(true, "Enter the player name:") + } + } + } + } + return true + } + + override fun getIds(): IntArray { + return intArrayOf(ID) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoUseWithHandler.kt b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoUseWithHandler.kt new file mode 100644 index 000000000..804275d2a --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/rottenpotato/RottenPotatoUseWithHandler.kt @@ -0,0 +1,34 @@ +package core.game.system.command.rottenpotato + +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item + +/** + * Rotten Potato use-with handling + * @author Ceikry + */ +object RottenPotatoUseWithHandler{ + @JvmStatic + fun handle(node: Node, player: Player){ + if(node is GameObject){ + val go = node.asObject() + } + + if(node is NPC){ + val npc = node.asNpc() + player.dialogueInterpreter.open(RPUseWithNPCDialogue().ID,npc) + } + + if(node is Item){ + val item = node.asItem() + } + + if(node is Player){ + val p = node.asPlayer() + player.dialogueInterpreter.open(RPUseWithPlayerDialogue().ID,p) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/AnimationCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/AnimationCommandSet.kt new file mode 100644 index 000000000..1141f19b7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/AnimationCommandSet.kt @@ -0,0 +1,82 @@ +package core.game.system.command.sets + +import core.game.node.entity.npc.NPC +import core.game.system.command.CommandPlugin.Companion.toInteger +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.game.system.command.Command +import java.util.* + +@Initializable +class AnimationCommandSet : CommandSet(Command.Privilege.ADMIN) { + + protected var npcs: List = ArrayList() + + override fun defineCommands() { + + /** + * Force the player to play animation + */ + define("anim"){ player, args -> + if (args.size < 2) { + reject(player, "Syntax error: ::anim ") + return@define + } + val animation = Animation(args[1].toInt()) + player.animate(animation) + } + + /** + * Force the player to loop animation + */ + define("loopanim"){ player, args -> + if (args.size < 2) { + reject(player, "Syntax error: ::loopanim ") + return@define + } + val start = toInteger(args[1]) + var end = toInteger((args[2])) + if (end > 25) { + player.sendMessage("Really...? $end times...? Looping 25 times instead.") + end = 25 + } + GameWorld.Pulser.submit(object : Pulse(3, player) { + var id = start + override fun pulse(): Boolean { + player.animate(Animation.create(id)) + return ++id >= end + } + }) + } + + /** + * Change the player's render animation to + */ + define("ranim"){ player, args -> + if (args.size < 2) { + reject(player, "Syntax error: ::ranim ") + return@define + } + try { + player.appearance.setAnimations(Animation.create(args[1].toInt())) + player.appearance.sync() + } catch (e: NumberFormatException) { + reject(player, "Syntax error: ::ranim ") + return@define + } + } + + + /** + * Reset the player's render animation to default + */ + define("ranimreset"){ player, _ -> + player.appearance.prepareBodyData(player) + player.appearance.setDefaultAnimations() + player.appearance.setAnimations() + player.appearance.sync() + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/BottingCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/BottingCommandSet.kt new file mode 100644 index 000000000..fc2fd57e6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/BottingCommandSet.kt @@ -0,0 +1,72 @@ +package core.game.system.command.sets + +import core.game.component.Component +import core.plugin.Initializable +import plugin.ai.general.GeneralBotCreator +import plugin.ai.general.scriptrepository.PlayerScripts +import plugin.ai.general.scriptrepository.Script +import core.game.system.command.Command +import core.game.world.GameWorld +import core.tools.stringtools.colorize + +@Initializable +class BottingCommandSet : CommandSet(Command.Privilege.STANDARD) { + override fun defineCommands() { + define("scripts"){player, _ -> + if(GameWorld.settings?.enabled_botting != true){ + player.sendChat("I just tried to do something silly!") + return@define + } + if(!player.getAttribute("botting:warning_shown",false)){ + player.dialogueInterpreter.sendDialogue(colorize("%RWARNING: Running a bot script will permanently remove you"),colorize("%Rfrom the highscores.")) + player.dialogueInterpreter.addAction { player, buttonId -> player.setAttribute("/save:botting:warning_shown",true) } + return@define + } + for (i in 0..310) { + player.packetDispatch.sendString("", 275, i) + } + var lineid = 11 + player.packetDispatch.sendString("Bot Scripts",275,2) + for(script in PlayerScripts.identifierMap.values) { + player.packetDispatch.sendString("${script.name}", 275, lineid++) + script.description.forEach { line -> + player.packetDispatch.sendString(line,275,lineid++) + } + player.packetDispatch.sendString(" ::script ${script.identifier}",275,lineid++) + player.packetDispatch.sendString(" ",275,lineid++) + } + player.interfaceManager.open(Component(275)) + } + define("script"){player,args -> + if(GameWorld.settings?.enabled_botting != true){ + player.sendChat("I just tried to do something very silly!") + return@define + } + if(!player.getAttribute("botting:warning_shown",false)){ + player.dialogueInterpreter.sendDialogue(colorize("%RWARNING: Running a bot script will permanently remove you from the highscores.")) + player.dialogueInterpreter.addAction { player, buttonId -> player.setAttribute("/save:botting:warning_shown",true) } + return@define + } + if(args.size < 2){ + reject(player,"Usage: ::script identifier") + return@define + } + val identifier = args[1] + val script = PlayerScripts.identifierMap[identifier] + if(script == null){ + reject(player,"Invalid script identifier") + return@define + } + player.interfaceManager.close() + GeneralBotCreator(script.clazz.newInstance() as Script,player,true) + player.sendMessage(colorize("%RStarting script...")) + player.sendMessage(colorize("%RTo stop the script, do ::stopscript or log out.")) + + } + define("stopscript"){player,args -> + val pulse: GeneralBotCreator.BotScriptPulse? = player.getAttribute("botting:script",null) + pulse?.stop() + player.interfaceManager.closeOverlay() + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/CommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/CommandSet.kt new file mode 100644 index 000000000..081cfbe3e --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/CommandSet.kt @@ -0,0 +1,45 @@ +package core.game.system.command.sets + +import core.game.node.entity.player.Player +import core.plugin.Plugin +import core.tools.stringtools.colorize +import core.game.system.command.Command +import core.game.system.command.CommandMapping + +/** + * Command sets allow you to organize sets of commands by category/type. It also provides + * a clean way to define them and get them registered to the command mapping, as well as + * a couple other small utiltiies. + * @author Ceikry + * @param defaultPrivilege the default privilege level for all commands in this set. + */ +abstract class CommandSet(val defaultPrivilege: Command.Privilege) : Plugin { + override fun newInstance(arg: Any?): Plugin { + defineCommands() + return this + } + + override fun fireEvent(identifier: String?, vararg args: Any?): Any { + return Unit + } + + abstract fun defineCommands() + + /** + * Glorified player.sendMessage with red text coloring. Please use this + * rather than just player.sendMessage for anything that involves informing the player + * of proper usage or invalid syntax. + */ + fun reject(player: Player, message: String){ + player.sendMessage(colorize("%R$message")) + } + + /** + * Used to define commands. define("name",(optional) privilege override){ handle } + * @param name the name of the command. Example: ::example would be just "example" + * @param privilege (optional) privilege override from the set default. + */ + fun define(name: String, privilege: Command.Privilege = defaultPrivilege, handle: (Player, Array) -> Unit){ + CommandMapping.register(Command(name, privilege, handle)) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/ConfigCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/ConfigCommandSet.kt new file mode 100644 index 000000000..378f07216 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/ConfigCommandSet.kt @@ -0,0 +1,54 @@ +package core.game.system.command.sets + +import core.plugin.Initializable +import core.game.system.command.Command + +@Initializable +class ConfigCommandSet : CommandSet(Command.Privilege.ADMIN){ + override fun defineCommands() { + + /** + * Sets a range of configs to a maximum value + */ + define("sconfigrange"){player, args -> + if (args.size < 3) { + reject(player, "usage: sconfigrange idlo idhi") + return@define + } + val idlo = args[1].toIntOrNull() ?: return@define + val idhi = args[2].toIntOrNull() ?: return@define + for (idsend in idlo until idhi) { + player.configManager.set(idsend, Integer.MAX_VALUE) + player.packetDispatch.sendMessage("Config: $idsend value: " + Integer.MAX_VALUE) + } + } + + /** + * Sets a range of configs to 0 + */ + define("sconfigrange0"){player, args -> + if (args.size < 3) { + reject(player, "usage: sconfigrange0 idlo idhi") + return@define + } + val idlo = args[1].toIntOrNull() ?: return@define + val idhi = args[2].toIntOrNull() ?: return@define + for (idsend in idlo until idhi) { + player.configManager.set(idsend, 0) + player.packetDispatch.sendMessage("Config: $idsend value: 0") + } + } + + /** + * Opens an interface component + */ + define("iface"){player, args -> + if (args.size < 2) { + reject(player, "usage: iface id") + return@define + } + val id = args[1].toIntOrNull() ?: return@define + player.interfaceManager.openComponent(id) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/DevelopmentCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/DevelopmentCommandSet.kt new file mode 100644 index 000000000..e53140664 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/DevelopmentCommandSet.kt @@ -0,0 +1,25 @@ +package core.game.system.command.sets + +import core.game.node.item.Item +import core.plugin.Initializable +import core.tools.Items +import core.game.system.command.Command + +@Initializable +class DevelopmentCommandSet : CommandSet(Command.Privilege.ADMIN) { + val farmKitItems = arrayListOf(Items.RAKE_5341, Items.SPADE_952, Items.SEED_DIBBER_5343, Items.WATERING_CAN8_5340, Items.SECATEURS_5329, Items.GARDENING_TROWEL_5325) + + override fun defineCommands() { + + /** + * Gives the player a set of tools used to test farming stuff. + */ + define("farmkit"){player,_ -> + for(item in farmKitItems){ + player.inventory.add(Item(item)) + } + } + + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/FunCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/FunCommandSet.kt new file mode 100644 index 000000000..ff958bc85 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/FunCommandSet.kt @@ -0,0 +1,123 @@ +package core.game.system.command.sets + +import core.game.node.entity.npc.NPC +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.RegionManager +import core.game.world.update.flag.context.Animation +import core.plugin.Initializable +import core.game.system.command.Command +import core.game.content.quest.tutorials.tutorialisland.CharacterDesign +import java.util.* + +@Initializable +class FunCommandSet : CommandSet(Command.Privilege.ADMIN) { + + var npcs: List = ArrayList() + + + override fun defineCommands() { + + /** + * Force animation + messages on all NPCs in a radius of 10 from the player. + */ + define("npcareaanim") { player, args -> + if (args.size < 3) { + reject(player, "Syntax error: ::npcareaanim ") + return@define + } + npcs = RegionManager.getLocalNpcs(player.location, 10) + for (n in npcs) { + n.sendChat(args.slice(2 until args.size).joinToString(" ")) + n.lock(6) + n.faceTemporary(player, 6) + n.animator.animate(Animation(args[1].toInt())) + n.animate(Animation.create(-1), 6) + } + } + + + /** + * Transform a player's appearance into that of an NPC. + */ + define("pnpc", Command.Privilege.MODERATOR){ player, args -> + if(args.size < 2){ + reject(player, "Usage: ::pnpc ") + return@define + } + + val pnpc_id = args[1].toIntOrNull() + if(pnpc_id == null){ + reject(player, " must be a valid integer.") + return@define + } + + player.appearance.transformNPC(pnpc_id) + player.sendMessage("Transformed into NPC $pnpc_id") + } + + + /** + * Open bank + */ + define("bank"){ player, _ -> + player.getBank().open() + } + + /** + * Toggle invisibility + */ + define("invis"){ player, _ -> + player.isInvisible = !player.isInvisible + player.sendMessage("You are now ${if (player.isInvisible) "invisible" else "visible"} to others.") + } + + + /** + * Toggle 1-hit kills + */ + define("1hit"){ player, _ -> + player.setAttribute("1hko", !player.getAttribute("1hko", false)) + player.sendMessage("1-hit KO mode " + if (player.getAttribute("1hko", false)) "on." else "off.") + } + + + /** + * Toggle god mode + */ + define("god"){ player, _ -> + player.setAttribute("godMode", !player.getAttribute("godMode", false)) + player.sendMessage("God mode ${if (player.getAttribute("godMode", false)) "enabled." else "disabled."}") + } + + + /** + * Go on Mr Bones' Wild Ride + */ + define("mrboneswildride"){ player, _ -> + val boneMode = !player.getAttribute("boneMode",false) + player.setAttribute("boneMode", boneMode) + player.sendMessage("Bone Mode ${if (boneMode) "ENGAGED." else "POWERING DOWN."}") + player.appearance.rideCart(boneMode) + if (player.appearance.isRidingMinecart) { + var i = 0 + GameWorld.Pulser.submit(object : Pulse(1, player) { + override fun pulse(): Boolean { + if (i++ % 12 == 0) player.sendChat("I want to get off Mr. Bones Wild Ride.") + player.moveStep() + return !player.appearance.isRidingMinecart + } + }) + } + } + + + /** + * Opens up the makeover interface + */ + define("makeover", Command.Privilege.MODERATOR){ player, _ -> + CharacterDesign.open(player) + } + + } +} diff --git a/Server/src/main/java/Server/core/game/system/command/sets/MiscCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/MiscCommandSet.kt new file mode 100644 index 000000000..442722370 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/MiscCommandSet.kt @@ -0,0 +1,456 @@ +package core.game.system.command.sets + +import core.ServerConstants +import core.cache.def.impl.ItemDefinition +import core.cache.def.impl.ObjectDefinition +import core.cache.def.impl.VarbitDefinition +import core.game.component.Component +import core.game.node.`object`.GameObject +import core.game.node.entity.player.info.Rights +import core.game.node.entity.player.link.RunScript +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.communication.CommunicationInfo +import core.game.world.GameWorld +import core.game.world.map.RegionManager +import core.game.world.map.build.DynamicRegion +import core.game.world.repository.Repository +import core.plugin.Initializable +import core.tools.StringUtils +import core.game.content.activity.fishingtrawler.TrawlerLoot +import core.game.system.command.Command +import core.game.system.command.CommandMapping +import plugin.creditshop.CreditShop +import core.game.ge.OfferManager +import core.game.ge.OfferState +import core.game.node.entity.skill.Skills +import core.game.node.entity.state.newsys.states.FarmingState +import core.tools.stringtools.colorize +import java.awt.Toolkit +import java.awt.datatransfer.StringSelection +import java.util.* + +@Initializable +class MiscCommandSet : CommandSet(Command.Privilege.ADMIN){ + override fun defineCommands() { + + /** + * Toggles debug mode + */ + define("debug", Command.Privilege.STANDARD){ player, _ -> + player.toggleDebug() + } + + /** + * Prints player's current location + */ + define("loc", Command.Privilege.STANDARD){ player, _-> + val l = player.location + val r = player.viewport.region + var obj: GameObject? = null + player.packetDispatch.sendMessage("Absolute: " + l + ", regional: [" + l.localX + ", " + l.localY + "], chunk: [" + l.chunkOffsetX + ", " + l.chunkOffsetY + "], flag: [" + RegionManager.isTeleportPermitted(l) + ", " + RegionManager.getClippingFlag(l) + ", " + RegionManager.isLandscape(l) + "].") + player.packetDispatch.sendMessage("Region: [id=" + l.regionId + ", active=" + r.isActive + ", instanced=" + (r is DynamicRegion) + "], obj=" + RegionManager.getObject(l) + ".") + player.packetDispatch.sendMessage("Object: " + RegionManager.getObject(l).also{obj = it} + ".") + player.packetDispatch.sendMessage("Object Varp: " + obj?.definition?.configFile?.configId + " offset: " + obj?.definition?.configFile?.bitShift + " size: " + (obj?.definition?.configFile?.bitShift?.minus(obj?.definition?.configFile?.bitShift!!))) + SystemLogger.logInfo("Viewport: " + l.getSceneX(player.playerFlags.lastSceneGraph) + "," + l.getSceneY(player.playerFlags.lastSceneGraph)) + val loc = "Location.create(" + l.x + ", " + l.y + ", " + l.z + ")" + SystemLogger.logInfo(loc + "; " + player.playerFlags.lastSceneGraph + ", " + l.localX + ", " + l.localY) + val stringSelection = StringSelection(loc) + val clpbrd = Toolkit.getDefaultToolkit().systemClipboard + clpbrd.setContents(stringSelection, null) + } + + /** + * Tells the player to use loc + */ + define("pos", Command.Privilege.STANDARD){ player, _-> + player.packetDispatch.sendMessage("Do you mean ::loc?") + } + + /** + * Tells the player to use loc + */ + define("coords", Command.Privilege.STANDARD){ player, _-> + player.packetDispatch.sendMessage("Do you mean ::loc?") + } + + /** + * Empty a player's inventory + * ADMIN only (for obvious reasons) + */ + define("empty"){player,_-> + player.inventory.clear() + player.inventory.refresh() + } + + /** + * Announces a message in chat (NEWS) + */ + define("announce"){_,args -> + val message = args.slice(1 until args.size).joinToString(" ") + Repository.sendNews(message) + } + + /** + * Lists the players currently online + */ + define("players", Command.Privilege.STANDARD){ player, _ -> + val rights = player.rights.ordinal + if (player!!.interfaceManager.isOpened && player.interfaceManager.opened.id != 275 || player.locks.isMovementLocked || player.locks.isTeleportLocked) { + player.sendMessage("Please finish what you're doing first.") + return@define + } + player.interfaceManager.open(Component(275)) + var i = 0 + while (i < 257) { + player.packetDispatch.sendString("", 275, i) + i++ + } + val red = "" + player.packetDispatch.sendString("" + "Players" + "", 275, 2) + val builder = StringBuilder("
") + var count = 0 + for (p in Repository.players) { + if (count > 45) { + builder.append("
Max amount we can show on this interface.") + break + } + if (p == null || p.isAdmin && GameWorld.settings?.isDevMode != true && !player.isAdmin || p.isArtificial) { + continue + } + builder.append(red + "" + p.username + if(rights > 0) " [ip=" + p.details.ipAddress + ", name=" + p.details.compName + "]

" else "

") + count++ + } + player.packetDispatch.sendString(builder.toString(), 275, 11) + } + /** + * =================================================================================== + */ + + + /** + * Opens the credit/voting shop + */ + define("shop", Command.Privilege.STANDARD){ player, _ -> + CreditShop().open(player) + } + + /** + * Shows the player a list of currently active GE sell offers + */ + define("ge", Command.Privilege.STANDARD) { player, _ -> + val offers = HashMap() + for (offerIDs in OfferManager.OFFERS_BY_ITEMID) { + var totalOffered = 0 + for (offer in offerIDs.value) { + if (offer.offerState != OfferState.PENDING && offer.sell) { + totalOffered += offer.amountLeft + } + } + if (totalOffered != 0) { + offers[offerIDs.key] = totalOffered + } + } + for (offerIDs in OfferManager.BOT_OFFERS) { + if (offerIDs.value > 0) { + if (offers[offerIDs.key] == null) { + offers[offerIDs.key] = offerIDs.value + } else { + offers[offerIDs.key] = offers[offerIDs.key]!! + offerIDs.value + } + } + } + for (i in 0..310) { + player!!.packetDispatch.sendString("", 275, i) + } + var lineId = 11 + player!!.packetDispatch.sendString("Active Sell Offers", 275, 2) + var counter = 0 + for(i in 0..299) { + val offer = offers.entries.elementAtOrNull(i) + if (offer != null) + player.packetDispatch.sendString("${ItemDefinition.forId(offer.key).name} x${offer.value}", 275, lineId++) + else + player.packetDispatch.sendString("", 275, lineId++) + } + player.interfaceManager.open(Component(275)) + } + /** + * ================================================================================== + */ + + + /** + * List all commands + */ + define("commands"){player,_ -> + for (i in 0..310) { + player.packetDispatch.sendString("", 275, i) + } + var lineid = 11 + player.packetDispatch.sendString("Commands",275,2) + for(line in CommandMapping.getNames()) + player.packetDispatch.sendString(line,275,lineid++) + player.interfaceManager.open(Component(275)) + } + + /** + * Reply to PMs (also enables tab-to-reply) + */ + define("reply", Command.Privilege.STANDARD){ player, _ -> + if(player.interfaceManager.isOpened){ + player.sendMessage("Please finish what you're doing first.") + return@define + } + if (player.attributes.containsKey("replyTo")) { + player.setAttribute("keepDialogueAlive", true) + val replyTo = player.getAttribute("replyTo", "").replace("_".toRegex(), " ") + player.setAttribute("runscript", object : RunScript() { + override fun handle(): Boolean { + CommunicationInfo.sendMessage(player, replyTo.toLowerCase(), getValue() as String) + player.removeAttribute("keepDialogueAlive") + return true + } + }) + player.dialogueInterpreter.sendMessageInput(StringUtils.formatDisplayName(replyTo)) + } else { + player.packetDispatch.sendMessage("You have not recieved any recent messages to which you can reply.") + } + } + + + /** + * Max account stats + */ + define("max"){player,_ -> + var index = 0 + Skills.SKILL_NAME.forEach { + player.skills.setStaticLevel(index,99) + player.skills.setLevel(index,99) + index++ + } + player.skills.updateCombatLevel() + } + + define("noobme"){ player,_ -> + var index = 0 + Skills.SKILL_NAME.forEach { + if (index == Skills.HITPOINTS) { + player.skills.setStaticLevel(index,10) + player.skills.setLevel(index,10) + index++ + } else { + player.skills.setStaticLevel(index,1) + player.skills.setLevel(index,1) + index++ + } + } + player.skills.updateCombatLevel() + } + + /** + * Set a specific skill to a specific level + */ + define("setlevel"){player,args -> + if(args.size < 2) reject(player,"Usage: ::setlevel skillname level").also { return@define } + val skillname = args[1] + val desiredLevel: Int? = args[2].toIntOrNull() + if(desiredLevel == null){ + reject(player, "Level must be an integer.") + return@define + } + if(desiredLevel > 99) reject(player,"Level must be 99 or lower.").also { return@define } + val skill = Skills.getSkillByName(skillname) + + if(skill < 0) reject(player, "Must use a valid skill name!").also { return@define } + + player.skills.setStaticLevel(skill,desiredLevel) + player.skills.setLevel(skill,desiredLevel) + player.skills.updateCombatLevel() + } + + define("completediaries"){player,_ -> + player.achievementDiaryManager.diarys.forEach { + for(level in it.taskCompleted.indices){ + for(task in it.taskCompleted[level].indices){ + it.finishTask(player,level,task) + } + } + } + } + + define("log"){player,_ -> + var log: ArrayList? = player.getAttribute("loc-log") + log = log ?: ArrayList() + val locString = "{${player.location.x},${player.location.y},${player.location.z},1,0}" + log.add(locString) + player.setAttribute("loc-log",log) + } + + define("logdone"){player,_ -> + val log: ArrayList? = player.getAttribute("loc-log") + log ?: return@define + + val sb = StringBuilder() + var first = true + for(entry in log){ + if(!first) sb.append("-") + sb.append(entry) + first = false + } + + val stringSelection = StringSelection(sb.toString()) + val clpbrd = Toolkit.getDefaultToolkit().systemClipboard + clpbrd.setContents(stringSelection, null) + + log.clear() + player.setAttribute("loc-log",log) + } + + define("rolltrawlerloot"){player,args -> + val rolls = if(args.size < 2){ + 100 + } else { + args[1].toString().toInt() + } + player.bank.add(*TrawlerLoot.getLoot(rolls,false).toTypedArray()) + } + + define("fillbank"){player,_ -> + for(i in 0 until ServerConstants.BANK_SIZE){ + player.bank.add(Item(i)) + } + } + + define("emptybank"){player,_ -> + player.bank.clear() + player.bank.update() + } + + define("setconfig"){player,args -> + if(args.size < 3){ + reject(player,"Syntax: ::setconfig configID value") + return@define + } + val configID = args[1].toString().toInt() + val configValue = args[2].toString().toInt() + player.configManager.forceSet(configID,configValue,false) + } + + define("getobjectvarp"){player,args -> + if(args.size < 2){ + reject(player,"Syntax: ::getobjectvarp objectid") + return@define + } + val objectID = args[1].toInt() + player.sendMessage("${VarbitDefinition.forObjectID(ObjectDefinition.forId(objectID).varbitID).configId}") + } + + define("togglexp",Command.Privilege.STANDARD){ player, args -> + val enabled = player.varpManager.get(2501).getVarbit(0)?.value == 1 + player.varpManager.get(2501).setVarbit(0,if(enabled) 0 else 1).send(player) + player.sendMessage("XP drops are now " + colorize("%R" + if(!enabled) "ON." else "OFF.")) + player.varpManager.flagSave(2501) + } + + define("xpconfig",Command.Privilege.STANDARD){player,args -> + if(args.size < 3){ + reject(player,"Usage: ::xpconfig track|mode type") + reject(player,"Track types: total|recent") + reject(player, "Mode types: instant|increment") + reject(player,"Defaults: track - total, mode - increment") + return@define + } + + when(args[1]){ + "track" -> when(args[2]){ + "total" -> { + player.varpManager.get(2501).setVarbit(2,0).send(player) + player.sendMessage("You are now tracking " + colorize("%RTOTAL") + " experience.") + } + "recent" -> { + player.varpManager.get(2501).setVarbit(2,1).send(player) + player.sendMessage("You are now tracking the " + colorize("%RMOST RECENT") + " skill's experience.") + } + else -> { + reject(player,"Usage: ::xpconfig track|mode type") + reject(player,"Track types: total|recent") + reject(player, "Mode types: instant|increment") + reject(player,"Defaults: track - total, mode - increment") + } + } + + "mode" -> { + when(args[2]){ + "instant" -> { + player.varpManager.get(2501).setVarbit(1,1).send(player) + player.sendMessage("Your xp tracker now updates " + colorize("%RINSTANTLY") + ".") + } + "increment" -> { + player.varpManager.get(2501).setVarbit(1,0).send(player) + player.sendMessage("Your xp tracker now updates " + colorize("%RINCREMENTALLY") + ".") + } + else -> { + reject(player,"Usage: ::xpconfig track|mode type") + reject(player,"Track types: total|recent") + reject(player, "Mode types: instant|increment") + reject(player,"Defaults: track - total, mode - increment") + } + } + } + else -> { + reject(player,"Usage: ::xpconfig track|mode type") + reject(player,"Track types: total|recent") + reject(player, "Mode types: instant|increment") + reject(player,"Defaults: track - total, mode - increment") + } + } + player.varpManager.flagSave(2501) + } + + define("toggleslayer",Command.Privilege.STANDARD){player,_ -> + val disabled = player.varpManager.get(2502).getVarbit(0)?.value == 1 + player.varpManager.get(2502).setVarbit(0,if(disabled) 0 else 1).send(player) + if(!disabled){ + player.varpManager.flagSave(2502) + } else { + player.varpManager.get(2502).save = false + } + player.sendMessage("Slayer task tracker is now " + (if(disabled) colorize("%RON") else colorize("%ROFF")) + ".") + } + + define("setvarbit",Command.Privilege.ADMIN){ + player,args -> + if(args.size < 4){ + reject(player,"Usage: ::setvarbit index offset value") + return@define + } + val index = args[1].toIntOrNull() + val offset = args[2].toIntOrNull() + val value = args[3].toIntOrNull() + + if(index == null || offset == null || value == null){ + reject(player,"Usage ::setvarbit index offset value") + return@define + } + + player.varpManager.get(index).setVarbit(offset,value).send(player) + } + + define("grow",Command.Privilege.ADMIN){player,_ -> + val state: FarmingState = player.states.get("farming") as FarmingState? ?: return@define + + for(patch in state.getPatches()){ + patch.nextGrowth = System.currentTimeMillis() + } + } + + define("finishbins",Command.Privilege.ADMIN){player,_ -> + val state: FarmingState = player.states.get("farming") as FarmingState? ?: return@define + + for(bin in state.getBins()){ + bin.finishedTime = System.currentTimeMillis() + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/ModerationCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/ModerationCommandSet.kt new file mode 100644 index 000000000..15b83c4f8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/ModerationCommandSet.kt @@ -0,0 +1,68 @@ +package core.game.system.command.sets + +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.repository.Repository +import core.plugin.Initializable +import core.game.system.command.Command +import java.util.concurrent.TimeUnit + +@Initializable +/** + * Moderation commands + * @author Ceikry + */ +class ModerationCommandSet : CommandSet(Command.Privilege.MODERATOR){ + override fun defineCommands() { + val MAX_JAIL_TIME = 1800 //Max jail time (in seconds) + + + /** + * Jail a player + * ============================================================================================================= + */ + define("jail"){player,args -> + if(args.size < 3) { + reject(player,"Usage: ::jail ") + return@define + } + + val timeSeconds = args[1].toIntOrNull() + if(timeSeconds == null){ + reject(player, " Must be a valid integer!") + return@define + } + if(timeSeconds > MAX_JAIL_TIME){ + reject(player, "Maximum jail time is $MAX_JAIL_TIME seconds.") + return@define + } + val name = args.slice(2 until args.size).joinToString("_") + val otherPlayer = Repository.getPlayerByName(name) + if(otherPlayer == null){ + reject(player, "Can not find $name in the player list!") + return@define + } + player.sendMessage("Jailing ${otherPlayer.username} for $timeSeconds seconds.") + GameWorld.Pulser.submit(object : Pulse(3){ + val originalLoc = otherPlayer.location + val releaseTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(timeSeconds.toLong()) + override fun pulse(): Boolean { + val done = System.currentTimeMillis() >= releaseTime + if(otherPlayer.location != Location.create(3228, 3407, 0)){ + otherPlayer.properties.teleportLocation = Location.create(3228, 3407, 0) + } + if(done){ + otherPlayer.properties.teleportLocation = originalLoc + } + return done + } + }) + } + /** + * ============================================================================================================= + */ + + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/MusicCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/MusicCommandSet.kt new file mode 100644 index 000000000..19e583388 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/MusicCommandSet.kt @@ -0,0 +1,38 @@ +package core.game.system.command.sets + +import core.game.node.entity.player.link.music.MusicEntry +import core.plugin.Initializable +import core.game.system.command.Command + +@Initializable +class MusicCommandSet : CommandSet(Command.Privilege.STANDARD){ + override fun defineCommands() { + + /** + * Command that lets you play a specific song + */ + define("playsong"){player,args -> + if(args.size < 2){ + reject(player,"Usage: ::playsong songID") + return@define + } + val id = args[1].toIntOrNull() + if(id == null){ + reject(player,"Please use a valid integer for the song id.") + return@define + } + player.musicPlayer.play(MusicEntry.forId(id)) + player.sendMessage("Now playing song $id") + } + + /** + * Command that unlocks all music tracks for the player + * Restricted to ADMIN access only. + */ + define("allmusic", Command.Privilege.ADMIN){ player, _ -> + for (me in MusicEntry.getSongs().values) { + player.musicPlayer.unlock(me.id) + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/QuestCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/QuestCommandSet.kt new file mode 100644 index 000000000..9c3c5d208 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/QuestCommandSet.kt @@ -0,0 +1,85 @@ +package core.game.system.command.sets + +import core.game.component.Component +import core.game.node.entity.player.Player +import core.game.node.entity.player.link.quest.QuestRepository +import core.plugin.Initializable +import core.game.system.command.Command + +@Initializable +class QuestCommandSet : CommandSet(Command.Privilege.ADMIN){ + override fun defineCommands() { + /** + * Completes all quests + */ + define("allquest"){player,_-> + for (quest in QuestRepository.getQuests().values) { + quest.finish(player) + } + } + + /** + * Displays the currently implemented quests with debug information + */ + define("quest"){player,_ -> + sendQuestsDebug(player) + } + + /** + * Sets stage of quest + */ + define("setqueststage"){player,args -> + if (args.size < 2) { + reject(player,"You must specify the index# of a quest, and a stage number") + return@define + } + val quest = args[1].toIntOrNull() ?: return@define + val stage = args[2].toIntOrNull() ?: return@define + player.questRepository.setStage(player.questRepository.forIndex(quest), stage) + player.sendMessage("Setting " + player.questRepository.forIndex(quest).name + " to stage $stage") + } + + /** + * Displays the currently implemented quests + */ + define("quests", Command.Privilege.STANDARD){ player, _ -> + sendQuests(player) + } + } + + /** + * Sends the list of quests. + * @param player the player. + */ + private fun sendQuests(player: Player?) { + player!!.interfaceManager.open(Component(275)) + for (i in 0..310) { + player.packetDispatch.sendString("", 275, i) + } + var lineId = 11 + player.packetDispatch.sendString("" + "Available Quests" + "", 275, 2) + for (q in QuestRepository.getQuests().toSortedMap().values) { + // Add a space to beginning and end of string for the strikethrough + player.packetDispatch.sendString("" + (if (q.isCompleted(player)) " " else "") + q.name + " ", 275, lineId++) + } + } + + /** + * Sends the list of quests with debug information + * @param player the player. + */ + private fun sendQuestsDebug(player: Player?) { + player!!.interfaceManager.open(Component(275)) + for (i in 0..310) { + player.packetDispatch.sendString("", 275, i) + } + var lineId = 11 + player.packetDispatch.sendString("" + "Quests Debug" + "", 275, 2) + for (q in QuestRepository.getQuests().values) { + // Add a space to beginning and end of string for the strikethrough + player.packetDispatch.sendString("${q.name}", 275, lineId++) + player.packetDispatch.sendString("Index: ${q.index} | Stage: ${player.questRepository.getStage(q)}", 275, lineId++) + player.packetDispatch.sendString(" ", 275, lineId++) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/SlayerCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/SlayerCommandSet.kt new file mode 100644 index 000000000..2f462f255 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/SlayerCommandSet.kt @@ -0,0 +1,40 @@ +package core.game.system.command.sets + +import core.game.node.entity.npc.NPC +import core.plugin.Initializable +import core.game.system.command.Command + +@Initializable +class SlayerCommandSet : CommandSet(Command.Privilege.ADMIN){ + override fun defineCommands() { + /** + * Finishes a player's slayer task (the correct way) + */ + define("finishtask"){player,_ -> + player.debug("Kill the npc that spawned to finish your task.") + player.slayer.amount = 1 + val finisher = NPC(player.slayer.task.npcs[0], player.location) + finisher.isRespawn = false + finisher.init() + } + + /** + * Set slayer points + */ + define("setslayerpoints"){player,args -> + if(args.size < 2){ + reject(player,"Usage: ::setslayerpoints amount") + return@define + } + + val amount = args[1].toIntOrNull() + if(amount == null){ + reject(player,"Amount needs to be a valid integer!") + return@define + } + + player.slayer.slayerPoints = amount + player.sendMessage("Set slayer points to $amount.") + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/SpawnCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/SpawnCommandSet.kt new file mode 100644 index 000000000..9792533be --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/SpawnCommandSet.kt @@ -0,0 +1,74 @@ +package core.game.system.command.sets + +import core.cache.Cache +import core.game.node.`object`.GameObject +import core.game.node.`object`.ObjectBuilder +import core.game.node.entity.npc.NPC +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.command.CommandPlugin +import core.plugin.Initializable +import core.game.system.command.Command +import java.awt.Toolkit +import java.awt.datatransfer.StringSelection + +@Initializable +class SpawnCommandSet : CommandSet(Command.Privilege.ADMIN){ + override fun defineCommands() { + /** + * Spawns an npc with the given ID + */ + define("npc"){player,args -> + if (args.size < 2) { + reject(player,"syntax error: id (optional) direction") + return@define + } + val npc = NPC.create(CommandPlugin.toInteger(args[1]!!), player!!.location) + npc.setAttribute("spawned:npc", true) + npc.isRespawn = false + npc.direction = player.direction + npc.init() + npc.isWalks = args.size > 2 + val npcString = "{" + npc.location.x + "," + npc.location.y + "," + npc.location.z + "," + (if (npc.isWalks) "1" else "0") + "," + npc.direction.ordinal + "}" + val clpbrd = Toolkit.getDefaultToolkit().systemClipboard + clpbrd.setContents(StringSelection(npcString), null) + println(npcString) + } + + /** + * Spawns an item with the given ID + */ + define("item"){player,args -> + if (args.size < 2) { + reject(player,"You must specify an item ID") + return@define + } + val id = args[1].toIntOrNull() ?: return@define + var amount = (args.getOrNull(2) ?: "1").toInt() + if (id > Cache.getItemDefinitionsSize()) { + reject(player,"Item ID '$id' out of range.") + return@define + } + val item = Item(id, amount) + val max = player.inventory.getMaximumAdd(item) + if (amount > max) { + amount = max + } + item.setAmount(amount) + player.inventory.add(item) + } + + /** + * Spawn object with given ID at the player's location + */ + define("object"){player,args -> + if (args!!.size < 2) { + reject(player,"syntax error: id (optional) type rotation or rotation") + return@define + } + val `object` = if (args.size > 3) GameObject(CommandPlugin.toInteger(args[1]!!), player!!.location, CommandPlugin.toInteger(args[2]!!), CommandPlugin.toInteger(args[3]!!)) else if (args.size == 3) GameObject(CommandPlugin.toInteger(args[1]!!), player!!.location, CommandPlugin.toInteger(args[2]!!)) else GameObject(CommandPlugin.toInteger(args[1]!!), player!!.location) + ObjectBuilder.add(`object`) + SystemLogger.logInfo("object = $`object`") + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/SystemCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/SystemCommandSet.kt new file mode 100644 index 000000000..d980ad4b3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/SystemCommandSet.kt @@ -0,0 +1,76 @@ +package core.game.system.command.sets + +import core.game.node.entity.player.info.login.Response +import core.game.node.entity.player.info.portal.PlayerSQLManager +import core.game.node.item.Item +import core.game.system.SystemManager +import core.game.system.SystemState +import core.plugin.Initializable +import core.tools.Items +import core.game.system.command.Command + +@Initializable +class SystemCommandSet : CommandSet(Command.Privilege.ADMIN){ + override fun defineCommands() { + /** + * Start an update countdown + */ + define("update"){player,args -> + if (args.size > 1) { + SystemManager.getUpdater().setCountdown(args[1].toInt()) + } + SystemManager.flag(SystemState.UPDATING) + } + + /** + * Cancel an update countdown + */ + define("cancelupdate"){player,_ -> + SystemManager.getUpdater().cancel() + } + + + /** + * Allows a player to reset their password + */ + define("resetpassword", Command.Privilege.STANDARD){ player, args -> + if(args.size != 3){ + reject(player,"Usage: ::resetpassword current new") + reject(player,"WARNING: THIS IS PERMANENT.") + reject(player,"WARNING: PASSWORD CAN NOT CONTAIN SPACES.") + return@define + } + val oldPass = args[1] + var newPass = args[2] + + if(PlayerSQLManager.getCredentialResponse(player.details.username,oldPass) != Response.SUCCESSFUL){ + reject(player,"INVALID PASSWORD!") + return@define + } + + if(newPass.length < 5 || newPass.length > 20){ + reject(player,"NEW PASSWORD MUST BE BETWEEN 5 AND 20 CHARACTERS") + return@define + } + + if(newPass == player.username){ + reject(player,"PASSWORD CAN NOT BE SAME AS USERNAME.") + return@define + } + + if(newPass == oldPass){ + reject(player,"PASSWORDS CAN NOT BE THE SAME") + return@define + } + + newPass = SystemManager.getEncryption().hashPassword(newPass) + PlayerSQLManager.updatePassword(player.username.toLowerCase().replace(" ","_"),newPass) + reject(player,"Password updated successfully.") + } + + define("potato"){player,_ -> + player.inventory.add(Item(Items.ROTTEN_POTATO_5733)) + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/command/sets/TeleportCommandSet.kt b/Server/src/main/java/Server/core/game/system/command/sets/TeleportCommandSet.kt new file mode 100644 index 000000000..74977edaf --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/command/sets/TeleportCommandSet.kt @@ -0,0 +1,107 @@ +package core.game.system.command.sets + +import core.ServerConstants +import core.game.node.entity.player.link.TeleportManager +import core.game.world.map.Location +import core.game.world.repository.Repository +import core.plugin.Initializable +import core.game.system.command.Command + +@Initializable +class TeleportCommandSet : CommandSet(Command.Privilege.ADMIN){ + override fun defineCommands() { + /** + * Allows teleporting by location name + */ + define("to"){player,args -> + var destination: Location? = null + val place = args.slice(1 until args.size).joinToString(" ") + for (destinations in ServerConstants.TELEPORT_DESTINATIONS) { + var i = 1 + while (i < destinations.size) { + if (place == destinations[i]) { + destination = destinations[0] as Location + break + } + i++ + } + } + if (destination != null) { + player.teleporter.send(destination, TeleportManager.TeleportType.NORMAL) + } else { + reject(player,"Could not locate teleport destination [name=$place]!") + } + } + + /** + * Teleport to location using coordinates + */ + define("tele"){player,args -> + if (args.size == 2 && args[1].contains(",")) { + val args2 = args[1].split(",".toRegex()).toTypedArray() + val x = args2[1].toInt() shl 6 or args2[3].toInt() + val y = args2[2].toInt() shl 6 or args2[4].toInt() + val z = args2[0].toInt() + player.properties.teleportLocation = Location.create(x, y, z) + return@define + } + if (args.size < 2) { + reject(player,"syntax error: x, y, (optional) z") + return@define + } + player.properties.teleportLocation = Location.create(args[1].toInt(), args[2].toInt(), if (args.size > 3) args[3].toInt() else 0) + } + + + /** + * Teleport to a specific player + */ + define("teleto"){player,args -> + if (args.size < 1) { + reject(player,"syntax error: name") + return@define + } + val n = args.slice(1 until args.size).joinToString("_") + val target = Repository.getPlayerByName(n) + if (target == null) { + reject(player,"syntax error: name") + return@define + } + if (target.getAttribute("fc_wave") != null) { + reject(player,"You cannot teleport to a player who is in the Fight Caves.") + return@define + } + player.properties.teleportLocation = target.location + } + + + /** + * Teleport a specific player to you + */ + define("teletome"){player,args -> + if (args.size < 1) { + reject(player,"syntax error: name") + return@define + } + val n = args.slice(1 until args.size).joinToString("_") + val target = Repository.getPlayerByName(n) + if (target == null) { + reject(player,"syntax error: name") + return@define + } + if (target.getAttribute("fc_wave") != null) { + reject(player,"You cannot teleport to a player who is in the Fight Caves.") + return@define + } + target.properties.teleportLocation = player.location + } + + + /** + * Teleports to the server's home location + */ + define("home"){player,_ -> + player.properties.teleportLocation = ServerConstants.HOME_LOCATION + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/communication/ClanEntry.java b/Server/src/main/java/Server/core/game/system/communication/ClanEntry.java new file mode 100644 index 000000000..4e293d7f9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/communication/ClanEntry.java @@ -0,0 +1,95 @@ +package core.game.system.communication; + +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; + +/** + * Represents a player in a clan chat. + * @author Emperor + */ +public class ClanEntry { + + /** + * The name. + */ + private final String name; + + /** + * The player. + */ + private Player player; + + /** + * The world id. + */ + private int worldId; + + /** + * Constructs a new {@code ClanEntry} {@code Object} + * @param player The player. + */ + public ClanEntry(Player player) { + this.player = player; + this.name = player.getName(); + this.worldId = GameWorld.getSettings().getWorldId(); + } + + /** + * Constructs a new {@code ClanEntry} {@code Object} + * @param name The player's name. + * @param worldId The world id. + */ + public ClanEntry(String name, int worldId) { + this.name = name; + this.worldId = worldId; + } + + @Override + public boolean equals(Object o) { + ClanEntry e = (ClanEntry) o; + if (name != null && !name.equals(e.name)) { + return false; + } + return e.player == player; + } + + /** + * Gets the name. + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the player. + * @param player The player. + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * Gets the player. + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Gets the worldId. + * @return the worldId + */ + public int getWorldId() { + return worldId; + } + + /** + * Sets the worldId. + * @param worldId the worldId to set. + */ + public void setWorldId(int worldId) { + this.worldId = worldId; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/communication/ClanMember.java b/Server/src/main/java/Server/core/game/system/communication/ClanMember.java new file mode 100644 index 000000000..82d9bf6bd --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/communication/ClanMember.java @@ -0,0 +1,38 @@ +package core.game.system.communication; + +/** + * Represents a clan member. + * @author Emperor + */ +public final class ClanMember { + + /** + * Represents the rank of the player. + */ + private ClanRank rank = ClanRank.FRIEND; + + /** + * Constructs a new {@code ClanMember} {@code Object}. + * @param rank The clan rank. + */ + public ClanMember(ClanRank rank) { + this.rank = rank; + } + + /** + * Gets the rank. + * @return The rank. + */ + public ClanRank getRank() { + return rank; + } + + /** + * Sets the rank. + * @param rank The rank to set. + */ + public void setRank(ClanRank rank) { + this.rank = rank; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/communication/ClanRank.java b/Server/src/main/java/Server/core/game/system/communication/ClanRank.java new file mode 100644 index 000000000..d3f3f23b2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/communication/ClanRank.java @@ -0,0 +1,50 @@ +package core.game.system.communication; + +/** + * Represents the rank of a clan member. + * @author Emperor + */ +public enum ClanRank { + NONE(-1, "Anyone"), FRIEND(0, "Any friends"), RECRUIT(1, "Recruit+"), CORPORAL(2, "Corporal+"), SERGEANT(3, "Sergeant+"), LIEUTENANT(4, "Lieutenant+"), CAPTAIN(5, "Captain+"), GENERAL(6, "General+"), OWNER(7, "Only me"), ADMINISTRATOR(127, "No-one"); + + /** + * The value of the rank. + */ + private final int value; + + /** + * The requirement info. + */ + private final String info; + + /** + * Constructs a new {@code ClanRank} {@code Object}. + * @param value The rank value. + * @param info The requirement info. + */ + private ClanRank(int value, String info) { + this.value = value; + this.info = info; + } + + /** + * Gets the value. + * @return The value. + */ + public int getValue() { + return value; + } + + /** + * Gets the info. + * @return The info. + */ + public String getInfo() { + return info; + } + + @Override + public String toString() { + return "Rank=[" + name() + "], Info=" + "[" + getInfo() + "]"; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/communication/ClanRepository.java b/Server/src/main/java/Server/core/game/system/communication/ClanRepository.java new file mode 100644 index 000000000..56dc16e20 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/communication/ClanRepository.java @@ -0,0 +1,562 @@ +package core.game.system.communication; + +import core.game.component.Component; +import core.game.content.activity.ActivityPlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.PlayerDetails; +import core.game.node.entity.player.info.Rights; +import core.game.system.monitor.PlayerMonitor; +import core.game.world.GameWorld; +import core.game.world.repository.Repository; +import core.net.amsc.WorldCommunicator; +import core.net.packet.PacketRepository; +import core.net.packet.context.ClanContext; +import core.net.packet.context.MessageContext; +import core.net.packet.out.CommunicationMessage; +import core.net.packet.out.UpdateClanChat; + +import java.util.*; + +/** + * Handles clan communication. + * @author Emperor + */ +public final class ClanRepository { + + /** + * The maximum amount of members to be in a clan chat. + */ + private static final int MAX_MEMBERS = 100; + + /** + * The clan repository. + */ + private static final Map CLAN_REPOSITORY = new HashMap<>(); + + /** + * The name of the clan owner. + */ + private final String owner; + + /** + * The clan name. + */ + private String name = "Chat disabled"; + + /** + * The rank required for joining. + */ + private ClanRank joinRequirement = ClanRank.FRIEND; + + /** + * The rank required for messaging. + */ + private ClanRank messageRequirement = ClanRank.NONE; + + /** + * The rank required for kicking members. + */ + private ClanRank kickRequirement = ClanRank.OWNER; + + /** + * The rank required for loot-share. + */ + private ClanRank lootRequirement = ClanRank.ADMINISTRATOR; + + /** + * The members mapping. + */ + private final Map ranks = new HashMap<>(); + + /** + * The banned players. + */ + private final Map banned = new HashMap<>(); + + /** + * The players who are currently in the friends chat. + */ + private List players = new ArrayList<>(MAX_MEMBERS); + + /** + * The current clan wars activity. + */ + private ActivityPlugin clanWar; + + /** + * Constructs a new {@code ClanRepository} {@code Object}. + * @param owner The owner of the clan. + */ + public ClanRepository(String owner) { + this.owner = owner; + } + + /** + * Enters the clan chat. + * @param player The player. + * @return {@code True} if the player successfully entered the clan chat. + */ + public boolean enter(Player player) { + if (!owner.equals("2009scape") && players.size() >= MAX_MEMBERS) { + player.getPacketDispatch().sendMessage("The channel you tried to join is full.:clan:"); + return false; + } + if (!player.getName().equals(owner) && player.getDetails().getRights() != Rights.ADMINISTRATOR) { + if (isBanned(player.getName())) { + player.getPacketDispatch().sendMessage("You are temporarily banned from this clan channel.:clan:"); + return false; + } + Player o = Repository.getPlayerByName(owner); + if (o != null) { + if (o.getCommunication().getBlocked().contains(player.getName())) { + player.getPacketDispatch().sendMessage("You do not have a high enough rank to join this clan channel.:clan:"); + return false; + } + } + ClanRank rank = getRank(player); + if (rank.ordinal() < joinRequirement.ordinal()) { + player.getPacketDispatch().sendMessage("You do not have a high enough rank to join this clan channel.:clan:"); + return false; + } + } + ClanEntry entry = new ClanEntry(player); + if (!players.contains(entry)) { + players.add(entry); + } + player.getPacketDispatch().sendMessage("Now talking in clan channel " + name + ":clan:"); + player.getPacketDispatch().sendMessage("To talk, start each line of chat with the / symbol.:clan:"); + update(); + return true; + } + + /** + * Cleans the chat from all players that shouldn't be in it. + */ + public void clean(boolean disable) { + if (WorldCommunicator.isEnabled()) { + return; + } + for (Iterator it = players.iterator(); it.hasNext();) { + ClanEntry entry = it.next(); + Player player = entry.getPlayer(); + boolean remove = disable; + if (!remove) { + remove = getRank(player).ordinal() < joinRequirement.ordinal(); + } + if (remove) { + leave(player, false); + player.getCommunication().setClan(null); + it.remove(); + } + } + if (players.isEmpty()) { + banned.clear(); + } + update(); + } + + /** + * Checks if a player is banned. + * @param name The player's name. + * @return {@code True} if so. + */ + public boolean isBanned(String name) { + if (banned.containsKey(name)) { + long time = banned.get(name); + if (time > System.currentTimeMillis()) { + return true; + } + banned.remove(name); + } + return false; + } + + /** + * Sends a message to all players in the chat. + * @param player The player sending the message. + * @param message The message to send. + */ + public void message(Player player, String message) { + if (player.getLocks().isLocked("cc_message") || isBanned(player.getName())) { + return; + } + player.getLocks().lock("cc_message", 1); + if (!player.getName().equals(owner) && player.getDetails().getRights() != Rights.ADMINISTRATOR) { + ClanRank rank = getRank(player); + if (rank.ordinal() < messageRequirement.ordinal()) { + player.getPacketDispatch().sendMessage("You do not have a high enough rank to talk in this clan channel.:clan:"); + return; + } + } + StringBuilder sb = new StringBuilder(message); + sb.append(" => ").append(name).append(" (owned by ").append(owner).append(")"); + player.getMonitor().log(sb.toString(), PlayerMonitor.CLAN_CHAT_LOG); + for (Iterator it = players.iterator(); it.hasNext();) { + ClanEntry entry = it.next(); + Player p = entry.getPlayer(); + if (p != null) { + PacketRepository.send(CommunicationMessage.class, new MessageContext(p, player, MessageContext.CLAN_MESSAGE, message)); + } + } + } + + /** + * Kicks a player from this chat. + * @param player the player. + * @param target the victim. + */ + public void kick(Player player, Player target) { + ClanRank rank = getRank(player); + if (target.getDetails().getRights() == Rights.ADMINISTRATOR) { + player.sendMessage("You can't kick an administrator.:clan:"); + return; + } + if (target.getName().equals(player.getName())) { + player.sendMessage("You can't kick yourself.:clan:"); + return; + } + if (player.getDetails().getRights() != Rights.ADMINISTRATOR && rank.ordinal() < kickRequirement.ordinal()) { + player.getPacketDispatch().sendMessage("You do not have a high enough rank to kick in this clan channel.:clan:"); + return; + } + if (target.getName().equals(owner)) { + player.getPacketDispatch().sendMessage("You can't kick the owner of this clan channel.:clan:"); + return; + } + for (ClanEntry e : players) { + PacketRepository.send(CommunicationMessage.class, new MessageContext(e.getPlayer(), player, MessageContext.CLAN_MESSAGE, "[Attempting to kick/ban " + target.getUsername() + " from this Clan Chat.]")); + } + leave(target, true, "You have been kicked from the channel.:clan:"); + target.getCommunication().setClan(null); + banned.put(target.getName(), System.currentTimeMillis() + (3_600_000)); + } + + /** + * Represents the method to leave a clan. + * @param player the player. + * @param remove If the player should be removed from the list. + */ + public void leave(Player player, boolean remove) { + leave(player, remove, "You have left the channel.:clan:"); + } + + /** + * Represents the method to leave a clan. + * @param player the player. + * @param remove If the player should be removed from the list. + */ + public void leave(Player player, boolean remove, String message) { + if (remove) { + players.remove(new ClanEntry(player)); + update(); + if (players.size() < 1) { + banned.clear(); + } + } + PacketRepository.send(UpdateClanChat.class, new ClanContext(player, this, true)); + player.getPacketDispatch().sendMessage(message); + if (clanWar != null && !isDefault()) { + clanWar.fireEvent("leavefc", player); + } + } + + /** + * Ranks a member of this chat. + * @param name The name of the member. + * @param rank The rank to set. + */ + public void rank(String name, ClanRank rank) { + boolean update; + if (rank == ClanRank.NONE) { + update = ranks.remove(name) != null; + } else { + update = ranks.put(name, rank) != rank; + } + if (update) { + clean(false); + } + } + + /** + * Updates the clan chat for all players in this clan. + */ + public void update() { + for (Iterator it = players.iterator(); it.hasNext();) { + ClanEntry e = it.next(); + if (e.getWorldId() == GameWorld.getSettings().getWorldId() && e.getPlayer() != null) { + PacketRepository.send(UpdateClanChat.class, new ClanContext(e.getPlayer(), this, false)); + } + } + } + + /** + * Gets the clan rank for the given clan entry. + * @param entry The clan entry. + * @return The rank. + */ + public ClanRank getRank(ClanEntry entry) { + if (entry.getPlayer() != null) { + return getRank(entry.getPlayer()); + } + ClanRank rank = ranks.get(entry.getName()); + if (rank == null) { + return ClanRank.NONE; + } + return rank; + } + + /** + * Gets the rank of the player. + * @param player The player. + * @return The clan rank. + */ + public ClanRank getRank(Player player) { + ClanRank rank = ranks.get(player.getName()); + if (player.getDetails().getRights() == Rights.ADMINISTRATOR && !player.getName().equals(owner)) { + return ClanRank.ADMINISTRATOR; + } + if (rank == null) { + if (player.getName().equals(owner)) { + return ClanRank.OWNER; + } + return ClanRank.NONE; + } + return rank; + } + + /** + * Opens the clan settings for the player. + * @param player The player. + */ + public static void openSettings(Player player) { + player.getInterfaceManager().open(new Component(590)); + ClanRepository c = get(player.getName()); + if (c != null) { + c.updateSettings(player); + } + } + + /** + * Updates the clan settings for the player. + * @param player The player. + */ + public void updateSettings(Player player) { + player.getPacketDispatch().sendString(name, 590, 22); + // player.getPacketDispatch().sendConfig(1083, (isCoinshare() ? 1 : 0) + // << 18 | (isLootshare() ? 0 : 1)); + player.getPacketDispatch().sendString(joinRequirement.getInfo(), 590, 23); + player.getPacketDispatch().sendString(messageRequirement.getInfo(), 590, 24); + player.getPacketDispatch().sendString(kickRequirement.getInfo(), 590, 25); + player.getPacketDispatch().sendString(lootRequirement.getInfo(), 590, 26); + } + + /** + * Loads the clan data. + * @param owner The owner of the clan to load. + * @return The clan data. + */ + public static ClanRepository get(String owner) { + return get(owner, false); + } + + /** + * Loads the clan data. + * @param owner The owner of the clan to load. + * @param create If the clan should be created if it doesn't exist. + * @return The clan data. + */ + public static ClanRepository get(String owner, boolean create) { + ClanRepository clan = CLAN_REPOSITORY.get(owner); + if (clan != null) { + return clan; + } + Player player = Repository.getPlayerByName(owner); + PlayerDetails details = player != null ? player.getDetails() : null; + if (details == null) { + details = PlayerDetails.getDetails(owner); + if (details == null) { + return null; + } + } + String name = details.getCommunication().getClanName(); + if (name.length() < 1) { + if (!create) { + return null; + } + name = "Chat disabled"; + } + CLAN_REPOSITORY.put(owner, clan = new ClanRepository(owner)); + for (Contact c : details.getCommunication().getContacts().values()) { + clan.ranks.put(c.getUsername(), c.getRank()); + } + clan.name = name; + clan.joinRequirement = details.getCommunication().getJoinRequirement(); + clan.messageRequirement = details.getCommunication().getMessageRequirement(); + clan.kickRequirement = details.getCommunication().getKickRequirement(); + clan.lootRequirement = details.getCommunication().getLootRequirement(); + return clan; + } + + /** + * Checks if this clan chat is the default clan chat. + * @return {@code True} if so. + */ + public boolean isDefault() { + return owner.equals(GameWorld.getSettings().getName().toLowerCase()); + } + + /** + * Gets the default clan chat. + * @return The default clan chat. + */ + public static ClanRepository getDefault() { + return get(GameWorld.getSettings().getName().toLowerCase()); + } + + /** + * Deletes a clan. + */ + public void delete() { + CLAN_REPOSITORY.remove(owner); + clean(true); + } + + /** + * Gets the currently loaded clans. + * @return The clans. + */ + public static Map getClans() { + return CLAN_REPOSITORY; + } + + /** + * Gets the list of players currently in the clan. + * @return The list of players. + */ + public List getPlayers() { + return players; + } + + /** + * Gets the joinRequirement. + * @return The joinRequirement. + */ + public ClanRank getJoinRequirement() { + return joinRequirement; + } + + /** + * Sets the joinRequirement. + * @param joinRequirement The joinRequirement to set. + */ + public void setJoinRequirement(ClanRank joinRequirement) { + this.joinRequirement = joinRequirement; + clean(false); + } + + /** + * Gets the messageRequirement. + * @return The messageRequirement. + */ + public ClanRank getMessageRequirement() { + return messageRequirement; + } + + /** + * Sets the messageRequirement. + * @param messageRequirement The messageRequirement to set. + */ + public void setMessageRequirement(ClanRank messageRequirement) { + this.messageRequirement = messageRequirement; + } + + /** + * Gets the kickRequirement. + * @return The kickRequirement. + */ + public ClanRank getKickRequirement() { + return kickRequirement; + } + + /** + * Sets the kickRequirement. + * @param kickRequirement The kickRequirement to set. + */ + public void setKickRequirement(ClanRank kickRequirement) { + this.kickRequirement = kickRequirement; + update(); + } + + /** + * Gets the lootRequirement. + * @return The lootRequirement. + */ + public ClanRank getLootRequirement() { + return lootRequirement; + } + + /** + * Gets the banned. + * @return the banned + */ + public Map getBanned() { + return banned; + } + + /** + * Sets the lootRequirement. + * @param lootRequirement The lootRequirement to set. + */ + public void setLootRequirement(ClanRank lootRequirement) { + this.lootRequirement = lootRequirement; + } + + /** + * Gets the owner. + * @return The owner. + */ + public String getOwner() { + return owner; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * @param name The name to set. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the members. + * @return The members. + */ + public Map getRanks() { + return ranks; + } + + /** + * Gets the clanWar. + * @return The clanWar. + */ + public ActivityPlugin getClanWar() { + return clanWar; + } + + /** + * Sets the clanWar. + * @param clanWar The clanWar to set. + */ + public void setClanWar(ActivityPlugin clanWar) { + this.clanWar = clanWar; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/communication/CommunicationInfo.java b/Server/src/main/java/Server/core/game/system/communication/CommunicationInfo.java new file mode 100644 index 000000000..1b44a8dc5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/communication/CommunicationInfo.java @@ -0,0 +1,637 @@ +package core.game.system.communication; + +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.system.monitor.PlayerMonitor; +import core.game.system.mysql.SQLTable; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.repository.Repository; +import core.net.amsc.MSPacketRepository; +import core.net.amsc.WorldCommunicator; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContactContext; +import core.net.packet.context.MessageContext; +import core.net.packet.out.CommunicationMessage; +import core.net.packet.out.ContactPackets; +import core.tools.StringUtils; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Holds communication information. + * @author Emperor + */ +public final class CommunicationInfo { + + /** + * The maximum list size. + */ + public static final int MAX_LIST_SIZE = 200; + + /** + * The clan ranks. + */ + private final Map contacts = new HashMap<>(); + + /** + * The list of blocked players. + */ + private final List blocked = new ArrayList<>(); + + /** + * The player's clan name. + */ + private String clanName = ""; + + /** + * The current clan this player is in. + */ + private String currentClan = ""; + + /** + * The rank required for joining. + */ + private ClanRank joinRequirement = ClanRank.FRIEND; + + /** + * The rank required for messaging. + */ + private ClanRank messageRequirement = ClanRank.NONE; + + /** + * The rank required for kicking members. + */ + private ClanRank kickRequirement = ClanRank.OWNER; + + /** + * The rank required for loot-share. + */ + private ClanRank lootRequirement = ClanRank.ADMINISTRATOR; + + /** + * If lootshare is enabled. + */ + private boolean lootShare; + + /** + * The current clan joined. + */ + private ClanRepository clan = null; + + /** + * The loot-share pulse. + */ + private Pulse lootSharePulse; + + /** + * Constructs a new {@code CommunicationInfo} {@code Object}. + */ + public CommunicationInfo() { + /* + * empty. + */ + } + + /** + * Saves the communication info. + * @param table The SQL table to update. + */ + public void save(SQLTable table) { + String contacts = ""; + String blocked = ""; + for (int i = 0; i < this.blocked.size(); i++) { + blocked += (i == 0 ? "" : ",") + this.blocked.get(i); + } + int count = 0; + for (Entry entry : this.contacts.entrySet()) { + contacts += "{" + entry.getKey() + "," + entry.getValue().getRank().ordinal() + "}" + (count == this.contacts.size() - 1 ? "" : "~"); + count++; + } + table.getColumn("blocked").updateValue(blocked); + table.getColumn("contacts").updateValue(contacts); + table.getColumn("clanName").updateValue(clanName); + table.getColumn("currentClan").updateValue(currentClan); + table.getColumn("clanReqs").updateValue(joinRequirement.ordinal() + "," + messageRequirement.ordinal() + "," + kickRequirement.ordinal() + "," + lootRequirement.ordinal()); + } + + /** + * Parses the communication info from the database. + * @param table The sql table to parse. + */ + public void parse(SQLTable table) { + String[] tokens = null; + if (table.getColumn("contacts").getValue() != null ) { + String contacts = (String) table.getColumn("contacts").getValue(); + if (!contacts.isEmpty()) { + String[] datas = contacts.split("~"); + Contact contact = null; + for (String d : datas) { + tokens = d.replace("{", "").replace("}", "").split(","); + if (tokens.length == 0) { + continue; + } + contact = new Contact(tokens[0]); + contact.setRank(ClanRank.values()[Integer.valueOf(tokens[1])]); + this.contacts.put(tokens[0], contact); + } + } + } + if (table.getColumn("blocked").getValue() != null ) { + String blocked = (String) table.getColumn("blocked").getValue(); + if (!blocked.isEmpty()) { + tokens = blocked.split(","); + for (String name : tokens) { + this.blocked.add(name); + } + } + } + clanName = ((String) table.getColumn("clanName").getValue()); + currentClan = (String) table.getColumn("currentClan").getValue(); + String clanReqs = (String) table.getColumn("clanReqs").getValue(); + if (clanReqs == "") { + return; + } + tokens = clanReqs.split(","); + ClanRank rank = null; + int ordinal = 0; + for (int i = 0; i < tokens.length; i++) { + ordinal = Integer.parseInt(tokens[i]); + if (ordinal < 0 || ordinal > ClanRank.values().length -1) { + continue; + } + rank = ClanRank.values()[ordinal]; + switch (i) { + case 0: + joinRequirement = rank; + break; + case 1: + messageRequirement = rank; + break; + case 2: + if (ordinal < 3 || ordinal > 8) { + break; + } + kickRequirement = rank; + break; + case 3: + lootRequirement = rank; + break; + } + } + } + + /** + * Toggles the loot-share. + */ + public void toggleLootshare(final Player player) { + if (lootShare) { + lootShare = false; + player.getConfigManager().set(1083, 0); + } else if (lootSharePulse != null) { + lootSharePulse.stop(); + lootSharePulse = null; + player.getConfigManager().set(1083, 0); + } else if (!lootShare) { + player.getConfigManager().set(1083, 2); + lootSharePulse = new Pulse(GameWorld.getSettings().isDevMode() ? 5 : 200, player) { + @Override + public boolean pulse() { + lootShare = true; + lootSharePulse = null; + player.getConfigManager().set(1083, 1); + return true; + } + }; + GameWorld.getPulser().submit(lootSharePulse); + } + } + + /** + * Roar temp + * @param buffer + */ + public void parsePrevious(ByteBuffer buffer) { + int size = buffer.get() & 0xFF; + for (int i = 0; i < size; i++) { + String name = ByteBufferUtils.getString(buffer); + Contact contact = new Contact(name); + contact.setRank(ClanRank.FRIEND); + contacts.put(name, contact); + } + size = buffer.get() & 0xFF; + for (int i = 0; i < size; i++) { + blocked.add(ByteBufferUtils.getString(buffer)); + } + if (buffer.get() == 1) { + ByteBufferUtils.getString(buffer); + } + } + + /** + * Synchronizes the contact lists. + */ + public void sync(Player player) { + if (WorldCommunicator.isEnabled()) { + if (!player.isArtificial()) { + MSPacketRepository.requestCommunicationInfo(player.getName()); + } + return; + } + if (player.getSettings().getPrivateChatSetting() != 2) { + notifyPlayers(player, true, false); + } + PacketRepository.send(ContactPackets.class, new ContactContext(player, ContactContext.UPDATE_STATE_TYPE)); + PacketRepository.send(ContactPackets.class, new ContactContext(player, ContactContext.IGNORE_LIST_TYPE)); + for (String name : contacts.keySet()) { + Player p = Repository.getPlayerByName(name); + int worldId = 0; + if (p != null && showActive(player, p)) { + worldId = GameWorld.getSettings().getWorldId(); + } + PacketRepository.send(ContactPackets.class, new ContactContext(player, name, worldId)); + } + if (currentClan != null && !player.isArtificial() && (clan = ClanRepository.get(currentClan)) != null) { + clan.enter(player); + } + } + + /** + * Notifies all other players. + * @param online If this player is online. + * @param chatSetting If it was a chat setting change. + */ + public static void notifyPlayers(Player player, boolean online, boolean chatSetting) { + if (WorldCommunicator.isEnabled()) { + if (!online && !chatSetting) { + MSPacketRepository.sendPlayerRemoval(player.getName()); + } + return; + } + for (Player p : Repository.getPlayers()) { + if (p == player || !p.isActive()) { + continue; + } + if (hasContact(p, player.getName())) { + int worldId = 0; + if (online && showActive(p, player)) { + worldId = GameWorld.getSettings().getWorldId(); + } + p.getCommunication().getContacts().get(player.getName()).setWorldId(worldId); + PacketRepository.send(ContactPackets.class, new ContactContext(p, player.getName(), worldId)); + } + } + if (!online && !chatSetting && player.getCommunication().getClan() != null) { + player.getCommunication().getClan().leave(player, true); + } + } + + /** + * Sends a message to the target. + * @param player The player sending the message. + * @param target The target. + * @param message The message to send. + */ + public static void sendMessage(Player player, String target, String message) { + if (WorldCommunicator.isEnabled()) { + StringBuilder sb = new StringBuilder(message); + sb.append(" => ").append(target); + player.getMonitor().log(sb.toString(), PlayerMonitor.PRIVATE_CHAT_LOG); + MSPacketRepository.sendPrivateMessage(player, target, message); + return; + } + if (!player.getDetails().getCommunication().contacts.containsKey(target)) { + return; + } + Player p = Repository.getPlayerByName(target); + if (p == null || !p.isActive() || !showActive(p, player)) { + player.getPacketDispatch().sendMessage("That player is currently offline."); + return; + } + if (!GameWorld.getSettings().isDevMode()) { + StringBuilder sb = new StringBuilder(message); + sb.append(" => ").append(target); + player.getMonitor().log(sb.toString(), PlayerMonitor.PRIVATE_CHAT_LOG); + } + PacketRepository.send(CommunicationMessage.class, new MessageContext(player, p, MessageContext.SEND_MESSAGE, message)); + PacketRepository.send(CommunicationMessage.class, new MessageContext(p, player, MessageContext.RECIEVE_MESSAGE, message)); + } + + /** + * Adds a contact. + * @param contact The contact to add. + */ + public static void add(Player player, String contact) { + CommunicationInfo info = player.getDetails().getCommunication(); + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendContactUpdate(player.getName(), contact, false, false, null); + return; + } + if (info.contacts.size() >= MAX_LIST_SIZE) { + player.getPacketDispatch().sendMessage("Your friend list is full."); + return; + } + if (info.contacts.containsKey(contact)) { + player.getPacketDispatch().sendMessage(StringUtils.formatDisplayName(contact) + " is already on your friend list."); + return; + } + ClanRepository clan = ClanRepository.get(player.getName(), false); + if (clan != null) { + clan.rank(contact, ClanRank.FRIEND); + } + info.contacts.put(contact, new Contact(contact)); + Player target = Repository.getPlayerByName(contact); + if (target != null) { + if (showActive(player, target)) { + PacketRepository.send(ContactPackets.class, new ContactContext(player, contact, GameWorld.getSettings().getWorldId())); + } + if (player.getSettings().getPrivateChatSetting() == 1 && showActive(target, player)) { + PacketRepository.send(ContactPackets.class, new ContactContext(target, player.getName(), GameWorld.getSettings().getWorldId())); + } + } + } + + /** + * Removes a contact. + * @param contact The contact to remove. + * @param block If the contact should be removed from the block list. + */ + public static void remove(Player player, String contact, boolean block) { + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendContactUpdate(player.getName(), contact, true, block, null); + return; + } + CommunicationInfo info = player.getDetails().getCommunication(); + if (block) { + info.blocked.remove(contact); + Player target = Repository.getPlayerByName(contact); + if (target != null && hasContact(target, player.getName())) { + int worldId = 0; + if (showActive(target, player)) { + worldId = GameWorld.getSettings().getWorldId(); + } + PacketRepository.send(ContactPackets.class, new ContactContext(target, player.getName(), worldId)); + } + } else { + info.contacts.remove(contact); + ClanRepository clan = ClanRepository.get(player.getName(), false); + if (clan != null) { + clan.rank(contact, ClanRank.NONE); + } + if (player.getSettings().getPrivateChatSetting() == 1) { + Player target = Repository.getPlayerByName(contact); + if (target != null) { + PacketRepository.send(ContactPackets.class, new ContactContext(target, player.getName(), 0)); + } + } + } + } + + /** + * Adds a blocked contact. + * @param contact The contact to block. + */ + public static void block(Player player, String contact) { + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendContactUpdate(player.getName(), contact, false, true, null); + return; + } + CommunicationInfo info = player.getDetails().getCommunication(); + if (info.blocked.size() >= MAX_LIST_SIZE) { + player.getPacketDispatch().sendMessage("Your ignore list is full."); + return; + } + if (info.blocked.contains(contact)) { + player.getPacketDispatch().sendMessage(StringUtils.formatDisplayName(contact) + " is already on your ignore list."); + return; + } + info.blocked.add(contact); + Player target = Repository.getPlayerByName(contact); + if (target != null && hasContact(target, player.getName())) { + PacketRepository.send(ContactPackets.class, new ContactContext(target, player.getName(), 0)); + } + } + + /** + * Updates the clan rank of a certain contact. + * @param contact The contact. + * @param clanRank The clan rank to set. + */ + public static void updateClanRank(Player player, String contact, ClanRank clanRank) { + CommunicationInfo info = player.getDetails().getCommunication(); + Contact c = info.contacts.get(contact); + if (c == null) { + SystemLogger.logErr("Could not find contact " + contact + " to update clan rank!"); + return; + } + c.setRank(clanRank); + ClanRepository clan = ClanRepository.get(player.getName()); + if (clan != null) { + clan.rank(contact, clanRank); + } + int worldId = 0; + if (CommunicationInfo.showActive(player, contact)) { + worldId = c.getWorldId(); + } + PacketRepository.send(ContactPackets.class, new ContactContext(player, contact, worldId)); + } + + /** + * Checks if the player has the contact added. + * @param player The player. + * @param contact The contact. + * @return {@code True} if so. + */ + public static boolean hasContact(Player player, String contact) { + return player.getDetails().getCommunication().contacts.containsKey(contact); + } + + /** + * Checks if the target should be shown as online. + * @param name The target's name. + * @return {@code True} if so. + */ + public static boolean showActive(Player player, String name) { + Player p = Repository.getPlayerByName(name); + if (p != null) { + return showActive(player, p); + } + return false; + } + + /** + * Checks if the target should be shown as online. + * @param target The target. + * @return {@True} if so. + */ + public static boolean showActive(Player player, Player target) { + if (target.getName().equals(player.getName())) { + return false; + } + if (target.getCommunication().getBlocked().contains(player.getName())) { + return false; + } + switch (target.getSettings().getPrivateChatSetting()) { + case 1: + if (!hasContact(target, player.getName())) { + return false; + } + return true; + case 2: + return false; + } + return true; + } + + /** + * Gets the contacts value. + * @return The contacts. + */ + public Map getContacts() { + return contacts; + } + + /** + * Gets the blocked value. + * @return The blocked. + */ + public List getBlocked() { + return blocked; + } + + /** + * Gets the clanName value. + * @return The clanName. + */ + public String getClanName() { + return clanName; + } + + /** + * Sets the clanName value. + * @param clanName The clanName to set. + */ + public void setClanName(String clanName) { + this.clanName = clanName; + } + + /** + * Gets the currentClan value. + * @return The currentClan. + */ + public String getCurrentClan() { + return currentClan; + } + + /** + * Sets the currentClan value. + * @param currentClan The currentClan to set. + */ + @Deprecated + public void setCurrentClan(String currentClan) { + this.currentClan = currentClan; + } + + /** + * Gets the joinRequirement value. + * @return The joinRequirement. + */ + public ClanRank getJoinRequirement() { + return joinRequirement; + } + + /** + * Sets the joinRequirement value. + * @param joinRequirement The joinRequirement to set. + */ + public void setJoinRequirement(ClanRank joinRequirement) { + this.joinRequirement = joinRequirement; + } + + /** + * Gets the messageRequirement value. + * @return The messageRequirement. + */ + public ClanRank getMessageRequirement() { + return messageRequirement; + } + + /** + * Sets the messageRequirement value. + * @param messageRequirement The messageRequirement to set. + */ + public void setMessageRequirement(ClanRank messageRequirement) { + this.messageRequirement = messageRequirement; + } + + /** + * Gets the kickRequirement value. + * @return The kickRequirement. + */ + public ClanRank getKickRequirement() { + return kickRequirement; + } + + /** + * Sets the kickRequirement value. + * @param kickRequirement The kickRequirement to set. + */ + public void setKickRequirement(ClanRank kickRequirement) { + this.kickRequirement = kickRequirement; + } + + /** + * Gets the lootRequirement value. + * @return The lootRequirement. + */ + public ClanRank getLootRequirement() { + return lootRequirement; + } + + /** + * Sets the lootRequirement value. + * @param lootRequirement The lootRequirement to set. + */ + public void setLootRequirement(ClanRank lootRequirement) { + this.lootRequirement = lootRequirement; + } + + /** + * Gets the clan. + * @return the clan + */ + public ClanRepository getClan() { + return clan; + } + + /** + * Sets the clan. + * @param clan the clan to set. + */ + public void setClan(ClanRepository clan) { + this.clan = clan; + this.currentClan = clan == null ? null : clan.getOwner(); + } + + /** + * Gets the lootShare. + * @return the lootShare + */ + public boolean isLootShare() { + return lootShare; + } + + /** + * Sets the lootShare. + * @param lootShare the lootShare to set. + */ + public void setLootShare(boolean lootShare) { + this.lootShare = lootShare; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/communication/Contact.java b/Server/src/main/java/Server/core/game/system/communication/Contact.java new file mode 100644 index 000000000..d6106d306 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/communication/Contact.java @@ -0,0 +1,72 @@ +package core.game.system.communication; + +/** + * Represents a contact. + * @author Emperor + */ +public final class Contact { + + /** + * The username of the contact. + */ + private final String username; + + /** + * The world the contact is in. + */ + private int worldId; + + /** + * The contact's rank in the player's clan. + */ + private ClanRank rank = ClanRank.FRIEND; + + /** + * Constructs a new {@code Contact} {@code Object} + * @param username The username. + */ + public Contact(String username) { + this.username = username; + } + + /** + * Gets the worldId. + * @return the worldId + */ + public int getWorldId() { + return worldId; + } + + /** + * Sets the worldId. + * @param worldId the worldId to set. + */ + public void setWorldId(int worldId) { + this.worldId = worldId; + } + + /** + * Gets the rank. + * @return the rank + */ + public ClanRank getRank() { + return rank; + } + + /** + * Sets the rank. + * @param rank the rank to set. + */ + public void setRank(ClanRank rank) { + this.rank = rank; + } + + /** + * Gets the username. + * @return the username + */ + public String getUsername() { + return username; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/ConfigParser.kt b/Server/src/main/java/Server/core/game/system/config/ConfigParser.kt new file mode 100644 index 000000000..e9ecba870 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/ConfigParser.kt @@ -0,0 +1,33 @@ +package core.game.system.config + +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking + +class ConfigParser { + fun prePlugin() = GlobalScope.launch{ + launch { + NPCConfigParser().load() + ItemConfigParser().load() + } + launch { + ObjectConfigParser().load() + XteaParser().load() + } + InterfaceConfigParser().load() + } + + fun postPlugin() = GlobalScope.launch{ + launch { + ShopParser().load() + DropTableParser().load() + NPCSpawner().load() + } + launch { + DoorConfigLoader().load() + GroundSpawnLoader().load() + MusicConfigLoader().load() + } + RangedConfigLoader().load() + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/DoorConfigLoader.kt b/Server/src/main/java/Server/core/game/system/config/DoorConfigLoader.kt new file mode 100644 index 000000000..71a778d1d --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/DoorConfigLoader.kt @@ -0,0 +1,96 @@ +package core.game.system.config + +import core.ServerConstants +import core.game.system.SystemLogger +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader + +class DoorConfigLoader { + companion object { + val DOORS = hashMapOf() + + fun forId(id: Int): Door?{ + return DOORS[id] + } + } + val parser = JSONParser() + var reader: FileReader? = null + + fun load(){ + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "door_configs.json") + var configs = parser.parse(reader) as JSONArray + for(config in configs){ + val e = config as JSONObject + val door = Door(e["id"].toString().toInt()) + door.replaceId = e["replaceId"].toString().toInt() + door.isFence = e["fence"].toString().toBoolean() + door.isMetal = e["metal"].toString().toBoolean() + DOORS[door.id] = door + count++ + } + SystemLogger.logInfo("Parsed $count door configs.") + } + + + class Door + /** + * Constructs a new `DoorManager` `Object`. + */( + /** + * The door's object id. + */ + val id: Int) { + /** + * Gets the id. + * @return The id. + */ + + /** + * Gets the replaceId. + * @return The replaceId. + */ + /** + * Sets the replaceId. + * @param replaceId The replaceId to set. + */ + /** + * The door's replace object id. + */ + var replaceId = 0 + + /** + * Gets the fence. + * @return The fence. + */ + /** + * Sets the fence. + * @param fence The fence to set. + */ + /** + * If the door is closed. + */ + var isFence = false + + /** + * Gets the autoWalk. + * @return The autoWalk. + */ + /** + * Sets the autoWalk. + * @param autoWalk The autoWalk to set. + */ + /** + * If the player should automatically walk through it. + */ + var isAutoWalk = false + + /** + * Is the door metal? + */ + var isMetal = false + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/DropTableParser.kt b/Server/src/main/java/Server/core/game/system/config/DropTableParser.kt new file mode 100644 index 000000000..4812111ae --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/DropTableParser.kt @@ -0,0 +1,50 @@ +package core.game.system.config + +import core.ServerConstants +import core.cache.def.impl.NPCDefinition +import core.game.node.item.WeightedChanceItem +import core.game.system.SystemLogger +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader +import java.util.* + +class DropTableParser { + val parser = JSONParser() + var reader: FileReader? = null + fun load(){ + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "drop_tables.json") + val obj = parser.parse(reader) as JSONArray + for(i in obj){ + val tab = i as JSONObject + val ids = tab["ids"].toString().split(",") + for(n in ids){ + val def = NPCDefinition.forId(n.toInt()).dropTables + def ?: continue + val mainTable: List = parseTable(tab["main"] as JSONArray) + val charmTable: List = parseTable(tab["charm"] as JSONArray) + val defaultTable: List = parseTable(tab["default"] as JSONArray) + def.mainTable.addAll(mainTable) + def.charmTable.addAll(charmTable) + def.defaultTable.addAll(defaultTable) + } + } + SystemLogger.logInfo("Parsed $count drop tables.") + } + + private fun parseTable(data: JSONArray): List { + val table: MutableList = ArrayList() + for(it in data){ + val item = it as JSONObject + val id = item["id"].toString().toInt() + val minAmount = item["minAmount"].toString().toInt() + val maxAmount = item["maxAmount"].toString().toInt() + val weight = item["weight"].toString().toInt() + val newItem = WeightedChanceItem(id,minAmount,maxAmount,weight) + table.add(newItem) + } + return table + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/GroundSpawnLoader.kt b/Server/src/main/java/Server/core/game/system/config/GroundSpawnLoader.kt new file mode 100644 index 000000000..040c50143 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/GroundSpawnLoader.kt @@ -0,0 +1,119 @@ +package core.game.system.config + +import core.ServerConstants +import core.game.node.item.GroundItem +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.repository.Repository +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader +import java.nio.ByteBuffer + +class GroundSpawnLoader { + val parser = JSONParser() + var reader: FileReader? = null + + fun load() { + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "ground_spawns.json") + var configs = parser.parse(reader) as JSONArray + for(config in configs){ + val e = config as JSONObject + val datas = e["loc_data"].toString().split("-") + val id = e["item_id"].toString().toInt() + for(d in datas){ + val tokens = d.replace("{", "").replace("}", "").split(",".toRegex()).toTypedArray() + val spawn = GroundSpawn(tokens[4].toInt(), Item(id, tokens[0].toInt()), Location(Integer.valueOf(tokens[1]), Integer.valueOf(tokens[2]), Integer.valueOf(tokens[3]))) + spawn.init() + count++ + } + } + SystemLogger.logInfo("Initialized $count ground items.") + } + class GroundSpawn + /** + * Constructs a new `GroundItemParser` `Object`. + * @param item the item. + * @param location the location. + */( + /** + * Represents the rate at which a ground item will respawn. + */ + var respawnRate: Int, item: Item?, location: Location?) : GroundItem(item, location) { + /** + * Gets the respawn rate. + * @return the rate. + */ + + override fun toString(): String { + return "GroundSpawn [name=" + getName() + ", respawnRate=" + respawnRate + ", loc=" + getLocation() + "]" + } + + /** + * Method used to save this ground item to a byte buffer. + * @param buffer the buffer. + */ + fun save(buffer: ByteBuffer) { + buffer.putInt(respawnRate) + buffer.putShort(id.toShort()) + buffer.putInt(amount) + buffer.putShort((getLocation().x and 0xFFFF).toShort()).putShort((getLocation().y and 0xFFFF).toShort()).put(getLocation().z.toByte()) + } + + /** + * Method used to initialize this spawn. + */ + fun init() { + GroundItemManager.create(this) + } + + override fun isActive(): Boolean { + return true + } + + override fun isPrivate(): Boolean { + return false + } + + override fun isAutoSpawn(): Boolean { + return true + } + + override fun respawn() { + GameWorld.Pulser.submit(object : Pulse(respawnDuration) { + override fun pulse(): Boolean { + GroundItemManager.create(this@GroundSpawn) + return true + } + }) + } + + /** + * Method used to set the respawn rate. + * @param min the min. + * @param max the max. + */ + fun setRespawnRate(min: Int, max: Int) { + respawnRate = min or max shl 16 + } + + /** + * Gets the current respawn duration (in ticks). + * @return The respawn duration. + */ + val respawnDuration: Int + get() { + val minimum = respawnRate and 0xFFFF + val maximum = respawnRate shr 16 and 0xFFFF + val playerRatio = ServerConstants.MAX_PLAYERS / Repository.players.size.toDouble() + return (minimum + (maximum - minimum) / playerRatio).toInt() + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/InterfaceConfigParser.kt b/Server/src/main/java/Server/core/game/system/config/InterfaceConfigParser.kt new file mode 100644 index 000000000..6034e016e --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/InterfaceConfigParser.kt @@ -0,0 +1,29 @@ +package core.game.system.config + +import core.ServerConstants +import core.game.component.ComponentDefinition +import core.game.system.SystemLogger +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader + +class InterfaceConfigParser{ + val parser = JSONParser() + var reader: FileReader? = null + fun load() { + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "interface_configs.json") + val configlist = parser.parse(reader) as JSONArray + for(config in configlist){ + val e = config as JSONObject + val id = e["id"].toString().toInt() + if (ComponentDefinition.getDefinitions().containsKey(id)) { + ComponentDefinition.getDefinitions()[id]!!.parse(e["interfaceType"].toString(),e["walkable"].toString(),e["tabIndex"].toString()) + } + ComponentDefinition.getDefinitions()[id] = ComponentDefinition().parse(e["interfaceType"].toString(),e["walkable"].toString(),e["tabIndex"].toString()) + count++ + } + SystemLogger.logInfo("Parsed $count interface configs.") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/ItemConfigParser.kt b/Server/src/main/java/Server/core/game/system/config/ItemConfigParser.kt new file mode 100644 index 000000000..63c151067 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/ItemConfigParser.kt @@ -0,0 +1,298 @@ +package core.game.system.config + +import core.ServerConstants +import core.cache.def.impl.ItemDefinition +import core.game.node.entity.impl.Animator +import core.game.node.entity.player.link.audio.Audio +import core.game.system.SystemLogger +import core.game.world.update.flag.context.Animation +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader + +class ItemConfigParser { + companion object{ + /** + * The tradeable item configuration key. + */ + const val TRADEABLE = "tradeable" + + /** + * The lendable item configuration key. + */ + const val LENDABLE = "lendable" + + /** + * If the item is spawnable. + */ + const val SPAWNABLE = "spawnable" + + /** + * The destroy item configuration key. + */ + const val DESTROY = "destroy" + + /** + * The two-handed item configuration key. + */ + const val TWO_HANDED = "two_handed" + + /** + * The high-alchemy price item configuration key. + */ + const val HIGH_ALCHEMY = "high_alchemy" + + /** + * The low-alchemy price item configuration key. + */ + const val LOW_ALCHEMY = "low_alchemy" + + /** + * The shop price item configuration key. + */ + const val SHOP_PRICE = "shop_price" + + /** + * The grand exchange price item configuration key. + */ + const val GE_PRICE = "grand_exchange_price" + + /** + * The examine item configuration key. + */ + const val EXAMINE = "examine" + + /** + * The weight item configuration key. + */ + const val WEIGHT = "weight" + + /** + * The bonuses item configuration key. + */ + const val BONUS = "bonuses" + + /** + * The absorb item configuration key. + */ + const val ABSORB = "absorb" + + /** + * The equipment slot item configuration key. + */ + const val EQUIP_SLOT = "equipment_slot" + + /** + * The attack speed item configuration key. + */ + const val ATTACK_SPEED = "attack_speed" + + /** + * The remove hair item configuration key. + */ + const val REMOVE_HEAD = "remove_head" + + /** + * The remove beard item configuration key. + */ + const val REMOVE_BEARD = "remove_beard" + + /** + * The remove sleeves item configuration key. + */ + const val REMOVE_SLEEVES = "remove_sleeves" + + /** + * The stand anim item configuration key. + */ + const val STAND_ANIM = "stand_anim" + + /** + * The stand-run anim item configuration key. + */ + const val STAND_TURN_ANIM = "stand_turn_anim" + + /** + * The walk anim item configuration key. + */ + const val WALK_ANIM = "walk_anim" + + /** + * The run anim item configuration key. + */ + const val RUN_ANIM = "run_anim" + + /** + * The turn 180 anim item configuration key. + */ + const val TURN180_ANIM = "turn180_anim" + + /** + * The turn 90cw anim item configuration key. + */ + const val TURN90CW_ANIM = "turn90cw_anim" + + /** + * The turn 90ccw anim item configuration key. + */ + const val TURN90CCW_ANIM = "turn90ccw_anim" + + /** + * The weapon interface. + */ + const val WEAPON_INTERFACE = "weapon_interface" + + /** + * If the item has a special attack bar. + */ + const val HAS_SPECIAL = "has_special" + + /** + * The item's attack animations. + */ + const val ATTACK_ANIMS = "attack_anims" + + /** + * The items destroy message. + */ + const val DESTROY_MESSAGE = "destroy_message" + + /** + * The requirements. + */ + const val REQUIREMENTS = "requirements" + + /** + * The grand exchange buying limit attribute key. + */ + const val GE_LIMIT = "ge_buy_limit" + + /** + * The defence animation key. + */ + const val DEFENCE_ANIMATION = "defence_anim" + + /** + * The attack sound key. + */ + const val ATTACK_AUDIO = "attack_audios" + + /** + * The equip sound key + */ + const val EQUIP_AUDIO = "equip_audio" + + /** + * The point price. + */ + const val POINT_PRICE = "point_price" + + /** + * If the item is bankable. + */ + const val BANKABLE = "bankable" + + /** + * If the item is a rare item. + */ + const val RARE_ITEM = "rare_item" + + /** + * The tokkul price of an item. + */ + const val TOKKUL_PRICE = "tokkul_price" + + /** + * The render animation id of an item. + */ + const val RENDER_ANIM_ID = "render_anim" + + /** + * the archery ticket price of an item. + */ + const val ARCHERY_TICKET_PRICE = "archery_ticket_price" + + } + + val parser = JSONParser() + var reader: FileReader? = null + fun load(){ + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "item_configs.json") + val configlist = parser.parse(reader) as JSONArray + for(config in configlist){ + val e = config as JSONObject + val def = ItemDefinition.forId(e["id"].toString().toInt()) + val configs = def.handlers + val requirements = HashMap() + e.map { + if (it.value.toString().isNotEmpty() && it.value.toString() != "null") { + when (it.key.toString()) { + //Special cases + "defence_anim" -> configs.put(it.key.toString(), Animation(it.value.toString().toInt(), Animator.Priority.HIGH)) + "shop_price" -> {def.value = (it.value.toString().toInt()); configs.put(it.key.toString(),it.value.toString().toInt())} + "requirements" -> { configs.put(it.key.toString(),requirements) + it.value.toString() + .split("-") + .map { + en -> val tokens = en.replace("{", "").replace("}", "").split(",") + requirements.put(tokens[0].toInt(),tokens[1].toInt()) + } + } + "attack_audios" -> configs.put(it.key.toString(),it.value.toString().split(",").map { i -> Audio(i.toInt()) }.toTypedArray()) + "attack_anims" -> configs.put(it.key.toString(),it.value.toString().split(",").map { i -> Animation(i.toInt(), Animator.Priority.HIGH) }.toTypedArray()) + + //int arrays + "absorb", + "bonuses" -> configs.put(it.key.toString(),it.value.toString().split(",").map { i -> i.toInt() }.toIntArray()) + + //booleans + "fun_weapon", + "rare_item", + "bankable", + "two_handed", + "has_special", + "remove_sleeves", + "remove_beard", + "remove_head", + "destroy", + "lendable", + "tradeable" -> configs.put(it.key.toString(),it.value.toString().toBoolean()) + + //doubles + "weight" -> configs.put(it.key.toString(),it.value.toString().toDouble()) + + //ints + "equip_audio", + "point_price", + "tokkul_price", + "archery_ticket_price", + "ge_buy_limit", + "weapon_interface", + "attack_speed", + "equipment_slot", + "render_anim", + "turn90ccw_anim", + "turn90cw_anim", + "turn180_anim", + "run_anim", + "walk_anim", + "stand_anim", + "low_alchemy", + "high_alchemy", + "grand_exchange_price", + "id" -> configs.put(it.key.toString(),it.value.toString().toInt()) + + //Strings + "examine", + "destroy_message", + "name" -> configs.put(it.key.toString(),it.value.toString()) + } + } + } + count++ + } + SystemLogger.logInfo("Parsed $count item configs.") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/MusicConfigLoader.kt b/Server/src/main/java/Server/core/game/system/config/MusicConfigLoader.kt new file mode 100644 index 000000000..24941fbb8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/MusicConfigLoader.kt @@ -0,0 +1,64 @@ +package core.game.system.config + +import core.ServerConstants +import core.game.node.entity.player.link.music.MusicEntry +import core.game.node.entity.player.link.music.MusicZone +import core.game.system.SystemLogger +import core.game.world.map.RegionManager +import core.game.world.map.zone.ZoneBorders +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader + +class MusicConfigLoader { + val parser = JSONParser() + var reader: FileReader? = null + fun load(){ + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "music_configs.json") + var configs = parser.parse(reader) as JSONArray + + for(config in configs){ + val e = config as JSONObject + val musicId = Integer.parseInt(e["id"].toString()) + val entry = MusicEntry( + musicId, + e["name"].toString(), + Integer.parseInt(e["indexId"].toString()) + ) + MusicEntry.getSongs().putIfAbsent(entry.id,entry) + val string = e["borders"].toString() + val borderArray = string.split("-") + var tokens: Array? = null + var borders: ZoneBorders? = null + for (border in borderArray) { + if(border.isEmpty()){ + continue + } + tokens = border.replace("{", "").replace("}", "").split(",").toTypedArray() + borders = ZoneBorders(tokens[0].toInt(), tokens[1].toInt(), tokens[2].toInt(), tokens[3].toInt()) + if (border.contains("[")) { //no exception borders + var exceptions: String? = "" + for (i in 4 until tokens.size) { + exceptions += tokens[i] + if (!tokens[i].contains("]~")) "," else if (tokens[i].contains("[")) "," else "" + } + tokens = exceptions!!.split("~".toRegex()).toTypedArray() + var e: Array? = null + for (exception in tokens) { + e = exception.replace("[", "").replace("]", "").split(",".toRegex()).toTypedArray() + borders.addException(ZoneBorders(e[0].toInt(), e[1].toInt(), e[2].toInt(), e[3].toInt())) + } + e = null + exceptions = null + } + val zone = MusicZone(musicId, borders) + for (id in borders.getRegionIds()) { + RegionManager.forId(id!!).musicZones.add(zone) + } + } + count++ + } + SystemLogger.logInfo("Parsed $count music configs.") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/NPCConfigParser.kt b/Server/src/main/java/Server/core/game/system/config/NPCConfigParser.kt new file mode 100644 index 000000000..afd032ec0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/NPCConfigParser.kt @@ -0,0 +1,266 @@ +package core.game.system.config + +import core.ServerConstants +import core.cache.def.impl.NPCDefinition +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.impl.Animator +import core.game.system.SystemLogger +import core.game.world.update.flag.context.Animation +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import core.game.content.ttrail.ClueLevel +import java.io.FileReader + +class NPCConfigParser { + companion object{ + const val WEAKNESS = "weakness" + + /** + * The lifepoints attribute. + */ + const val LIFEPOINTS = "lifepoints" + + /** + * The attack level attribute. + */ + const val ATTACK_LEVEL = "attack_level" + + /** + * The strength level attribute. + */ + const val STRENGTH_LEVEL = "strength_level" + + /** + * The defence level attribute. + */ + const val DEFENCE_LEVEL = "defence_level" + + /** + * The range level attribute. + */ + const val RANGE_LEVEL = "range_level" + + /** + * The range level attribute. + */ + const val MAGIC_LEVEL = "magic_level" + + /** + * The examine attribute. + */ + const val EXAMINE = "examine" + + /** + * The slayer task attribute. + */ + const val SLAYER_TASK = "slayer_task" + + /** + * The poisonous attribute. + */ + const val POISONOUS = "poisonous" + + /** + * The aggressive attribute. + */ + const val AGGRESSIVE = "aggressive" + + /** + * The respawn delay attribute. + */ + const val RESPAWN_DELAY = "respawn_delay" + + /** + * The attack speed attribute. + */ + const val ATTACK_SPEED = "attack_speed" + + /** + * The poison immune attribute. + */ + const val POISON_IMMUNE = "poison_immune" + + /** + * The bonuses attribute. + */ + const val BONUSES = "bonuses" + + /** + * The start graphic attribute. + */ + const val START_GRAPHIC = "start_gfx" + + /** + * The projectile attribute. + */ + const val PROJECTILE = "projectile" + + /** + * The end graphic attribute. + */ + const val END_GRAPHIC = "end_gfx" + + /** + * The combat style attribute. + */ + const val COMBAT_STYLE = "combat_style" + + /** + * The aggressive radius attribute. + */ + const val AGGRESSIVE_RADIUS = "agg_radius" + + /** + * The slayer experience attribute. + */ + const val SLAYER_EXP = "slayer_exp" + + /** + * The amount to poison. + */ + const val POISON_AMOUNT = "poison_amount" + + /** + * The movement radius. + */ + const val MOVEMENT_RADIUS = "movement_radius" + + /** + * The spawn animation. + */ + const val SPAWN_ANIMATION = "spawn_animation" + + /** + * The start height. + */ + const val START_HEIGHT = "start_height" + + /** + * The projectile height. + */ + const val PROJECTILE_HEIGHT = "prj_height" + + /** + * The end height. + */ + const val END_HEIGHT = "end_height" + + /** + * The clue level. + */ + const val CLUE_LEVEL = "clue_level" + + /** + * The spell id. + */ + const val SPELL_ID = "spell_id" + + /** + * The combat audio. + */ + const val COMBAT_AUDIO = "combat_audio" + + /** + * The melee-attack anim. + */ + const val MELEE_ANIMATION = "melee_animation" + + /** + * The defence anim. + */ + const val DEFENCE_ANIMATION = "defence_animation" + + /** + * The death anim. + */ + const val DEATH_ANIMATION = "death_animation" + + /** + * The range anim. + */ + const val RANGE_ANIMATION = "range_animation" + + /** + * The magic anim. + */ + const val MAGIC_ANIMATION = "magic_animation" + + /** + * The combat style protected from. + */ + const val PROTECT_STYLE = "protect_style" + + } + val parser = JSONParser() + var reader: FileReader? = null + fun load(){ + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "npc_configs.json") + val configlist = parser.parse(reader) as JSONArray + for(config in configlist){ + val e = config as JSONObject + val def = NPCDefinition.forId(e["id"].toString().toInt()) + val configs = def.handlers + e.map { + if(it.value.toString().isNotEmpty() && it.value.toString() != "null") { + when (it.key.toString()) { + //animations + "melee_animation", + "range_animation", + "magic_animation", + "death_animation", + "defence_animation" -> configs.put(it.key.toString(), Animation(it.value.toString().toInt(), Animator.Priority.HIGH)) + + //combat/protect style + "combat_style", + "protect_style" -> configs.put(it.key.toString(), CombatStyle.values()[it.value.toString().toInt()]) + + + "clue_level" -> configs.put(it.key.toString(), ClueLevel.values()[it.value.toString().toInt()]) + "name", "examine" -> configs.put(it.key.toString(), it.value.toString()) + "combat_audio", "bonuses" -> configs.put(it.key.toString(), it.value.toString().split(",").map { v -> v.toInt() }.toIntArray()) + "force_talk" -> configs.put(it.key.toString(),it.value.toString()) + + //ints + "spawn_animation", + "id", + "lifepoints", + "attack_level", + "strength_level", + "defence_level", + "range_level", + "movement_radius", + "agg_radius", + "attack_speed", + "poison_amount", + "respawn_delay", + "start_gfx", + "projectile", + "end_gfx", + "weakness", + "slayer_task", + "start_height", + "prj_height", + "end_height", + "spell_id", + "magic_level" -> configs.put(it.key.toString(), if (it.value.toString().isEmpty()) Unit else it.value.toString().toInt()) + + //doubles + "slayer_exp" -> configs.put(it.key.toString(), it.value.toString().toDouble()) + + //booleans + "safespot", + "aggressive", + "poisonous", + "poison_immune", + "water_npc"-> configs.put(it.key.toString(), it.value.toString().toBoolean()) + else -> SystemLogger.logWarn("Unhandled key for npc config: ${it.key.toString()}") + } + } + } + count++ + } + SystemLogger.logInfo("Parsed $count NPC configurations") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/NPCSpawner.kt b/Server/src/main/java/Server/core/game/system/config/NPCSpawner.kt new file mode 100644 index 000000000..3a3b03d30 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/NPCSpawner.kt @@ -0,0 +1,40 @@ +package core.game.system.config + +import core.ServerConstants +import core.game.node.entity.npc.NPC +import core.game.system.SystemLogger +import core.game.world.map.Direction +import core.game.world.map.Location +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader + +class NPCSpawner { + val parser = JSONParser() + var reader: FileReader? = null + fun load(){ + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "npc_spawns.json") + val configs = parser.parse(reader) as JSONArray + for(config in configs){ + val e = config as JSONObject + val datas: Array = e["loc_data"].toString().split("-".toRegex()).toTypedArray() + var tokens: Array? = null + val id = e["npc_id"].toString().toInt() + for (d in datas) { + if(d.isEmpty()){ + continue + } + tokens = d.replace("{", "").replace("}", "").split(",".toRegex()).toTypedArray() + val npc = NPC.create(id, Location.create(Integer.valueOf(tokens[0].trim { it <= ' ' }), Integer.valueOf(tokens[1].trim { it <= ' ' }), Integer.valueOf(tokens[2].trim { it <= ' ' }))) + npc.isWalks = tokens[3].trim { it <= ' ' } == "1" + npc.direction = Direction.values()[Integer.valueOf(tokens[4].trim { it <= ' ' })] + npc.setAttribute("spawned:npc", true) + npc.init() + count++ + } + } + SystemLogger.logInfo("Spawned $count NPCs") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/ObjectConfigParser.kt b/Server/src/main/java/Server/core/game/system/config/ObjectConfigParser.kt new file mode 100644 index 000000000..cb2afe6f4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/ObjectConfigParser.kt @@ -0,0 +1,41 @@ +package core.game.system.config + +import core.ServerConstants +import core.cache.def.impl.ObjectDefinition +import core.game.system.SystemLogger +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader + +class ObjectConfigParser { + val parser = JSONParser() + var reader: FileReader? = null + fun load(){ + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "object_configs.json") + val configlist = parser.parse(reader) as JSONArray + for(config in configlist){ + val e = config as JSONObject + val ids = e["ids"].toString().split(",").map { it.toInt() } + for (id in ids) { + val def = ObjectDefinition.forId(id) + val configs = def.handlers + e.map { + if (it.value.toString().isNotEmpty() && it.value.toString() != "null") { + when (it.key.toString()) { + //Strings + "examine" -> configs.put(it.key.toString(), it.value.toString()) + + //Animations + "render_anim" -> def.animationId = it.value.toString().toInt() + } + } + } + count++ + } + } + SystemLogger.logInfo("Parsed $count object configs.") + } +} + diff --git a/Server/src/main/java/Server/core/game/system/config/RangedConfigLoader.kt b/Server/src/main/java/Server/core/game/system/config/RangedConfigLoader.kt new file mode 100644 index 000000000..37a4516d0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/RangedConfigLoader.kt @@ -0,0 +1,80 @@ +package core.game.system.config + +import core.ServerConstants +import core.cache.def.impl.ItemDefinition +import core.game.node.entity.combat.equipment.Ammunition +import core.game.node.entity.combat.equipment.BoltEffect +import core.game.node.entity.combat.equipment.RangeWeapon +import core.game.node.entity.impl.Projectile +import core.game.node.entity.npc.NPC +import core.game.system.SystemLogger +import core.game.world.map.Location +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader + +class RangedConfigLoader { + val parser = JSONParser() + var reader: FileReader? = null + + fun load(){ + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "ammo_configs.json") + var configs = parser.parse(reader) as JSONArray + for(entry in configs){ + val e = entry as JSONObject + var dbowgfx: Graphics? = null + val projectile = e["projectile"].toString().split(",") + if(e["darkbow_graphic"].toString().isNotBlank()){ + val darkbow = e["darkbow_graphic"].toString().split(",") + dbowgfx = Graphics(Integer.parseInt(darkbow[0]),Integer.parseInt(darkbow[1])) + } + val gfx = e["start_graphic"].toString().split(",") + val ammo = Ammunition( + Integer.parseInt(e["itemId"] as String), + Graphics(Integer.parseInt(gfx[0]),Integer.parseInt(gfx[1])), + dbowgfx, + Projectile.create( + NPC(0, Location(0,0,0)), + NPC(0,Location(0,0,0)), + Integer.parseInt(projectile[0]), + Integer.parseInt(projectile[1]), + Integer.parseInt(projectile[2]), + Integer.parseInt(projectile[3]), + Integer.parseInt(projectile[4]), + Integer.parseInt(projectile[5]), + Integer.parseInt(projectile[6])), + Integer.parseInt(e["poison_damage"].toString())) + val effect = BoltEffect.forId(Integer.parseInt(e["itemId"].toString())) + if (effect != null) { + ammo.effect = effect + } + Ammunition.getAmmunition().putIfAbsent(Integer.parseInt(e["itemId"].toString()),ammo) + count++ + } + SystemLogger.logWarn("Parsed $count ammo configs...") + + count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "ranged_weapon_configs.json") + configs = parser.parse(reader) as JSONArray + for(entry in configs){ + val e = entry as JSONObject + val id = Integer.parseInt(e["itemId"].toString()) + val weapon = RangeWeapon( + id, + Animation(Integer.parseInt(e["animation"].toString())), + ItemDefinition.forId(id).getConfiguration("attack_speed",4), + Integer.parseInt(e["ammo_slot"].toString()), + Integer.parseInt(e["weapon_type"].toString()), + (e["drop_ammo"].toString().toBoolean()), + e["ammunition"].toString().split(",").map { Integer.parseInt(it) } + ) + RangeWeapon.getRangeWeapons().putIfAbsent(weapon.itemId,weapon) + count++ + } + SystemLogger.logInfo("Parsed $count ranged weapon configs...") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/ServerConfigParser.kt b/Server/src/main/java/Server/core/game/system/config/ServerConfigParser.kt new file mode 100644 index 000000000..28237fffc --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/ServerConfigParser.kt @@ -0,0 +1,64 @@ +package core.game.system.config + +import core.JSONUtils +import core.ServerConstants +import core.game.world.GameSettings +import core.game.world.GameWorld +import core.plugin.PluginManager +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.File +import java.io.FileReader +import kotlin.system.exitProcess + +/** + * Class for parsing the server config, I.E default.json + * @param path the path to the JSON file to parse. + * @author Ceikry + */ +class ServerConfigParser(path: String) { + val pathTo = JSONUtils.parsePath(path) + val confFile = File(pathTo) + val parser = JSONParser() + var reader: FileReader? = null + var data: JSONObject? = null + + init { + if(!confFile.canonicalFile.exists()){ + println("Could not find ${confFile.canonicalFile} - Double check your working directory!") + exitProcess(0) + } else if(!pathTo.contains(".json")) { + println("Config file MUST be a JSON file!!") + println("(Got $pathTo)") + } else { + reader = FileReader(pathTo) + data = parser.parse(reader) as JSONObject + ServerConstants.SERVER_NAME = data!!["name"] as String + parseGameSettings() + parseServerSettings() + parsePluginToggles() + } + } + + private fun parseGameSettings(){ + data ?: return + val gsData = data!!["GameSettings"] as JSONObject + GameWorld.settings = GameSettings.parse(gsData) + } + + private fun parseServerSettings(){ + data ?: return + val ssData = data!!["ServerSettings"] as JSONObject + ServerConstants.parse(ssData) + } + + private fun parsePluginToggles(){ + data ?: return + val dpData = data!!["PluginToggles"] as JSONObject + dpData.map { + if(!(it.value as Boolean)){ + PluginManager.disabledPlugins.put(it.key.toString(),it.value as Boolean) + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/ShopParser.kt b/Server/src/main/java/Server/core/game/system/config/ShopParser.kt new file mode 100644 index 000000000..bd7fd3ed5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/ShopParser.kt @@ -0,0 +1,70 @@ +package core.game.system.config + +import core.ServerConstants +import core.game.content.global.shop.Shop +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.SystemLogger +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader + +class ShopParser{ + val parser = JSONParser() + var reader: FileReader? = null + + companion object{ + val SHOPS = HashMap() + val UID_SHOPS = HashMap() + fun openUid(player: Player,uid: Int): Boolean { + val shop = UID_SHOPS[uid] ?: return false; + shop.open(player); + return true; + } + } + + fun load(){ + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "shops.json") + val configlist = parser.parse(reader) as JSONArray + for(config in configlist){ + var shop: Shop? = null + val e = config as JSONObject + val id = e["id"].toString().toInt() + val title = e["title"].toString() + val general = e["general_store"].toString().toBoolean() + val stock = parseStock(e["stock"].toString()).toTypedArray() + val npcs = if(e["npcs"].toString().isNotBlank()) e["npcs"].toString().split(",").map { it.toInt() }.toIntArray() else intArrayOf() + val currency = e["currency"].toString().toInt() + val highAlch = e["high_alch"].toString() == "1" + if(general && stock.isEmpty()){ + shop = Shop(title,true,currency,highAlch) + } else { + shop = Shop(title, stock, general, currency, highAlch) + } + if(npcs.isNotEmpty()){ + npcs.map { SHOPS[it] = shop } + } else { + UID_SHOPS[id] = shop + } + count++ + } + SystemLogger.logInfo("Parsed $count shops.") + } + + fun parseStock(stock: String): ArrayList{ + val items = ArrayList() + if(stock.isEmpty()){ + return items + } + stock.split('-').map { + val tokens = it.replace("{", "").replace("}", "").split(",".toRegex()).toTypedArray() + var amount = tokens[1].trim() + if(amount == "inf") + amount = "-1" + items.add(Item(tokens[0].trim().toInt(),amount.toInt())) + } + return items + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/config/TableDump.kt b/Server/src/main/java/Server/core/game/system/config/TableDump.kt new file mode 100644 index 000000000..e69de29bb diff --git a/Server/src/main/java/Server/core/game/system/config/XteaParser.kt b/Server/src/main/java/Server/core/game/system/config/XteaParser.kt new file mode 100644 index 000000000..62d540ba8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/config/XteaParser.kt @@ -0,0 +1,42 @@ +package core.game.system.config + +import core.ServerConstants +import core.game.system.SystemLogger +import org.json.simple.JSONArray +import org.json.simple.JSONObject +import org.json.simple.parser.JSONParser +import java.io.FileReader +import java.util.* +import kotlin.collections.HashMap + +class XteaParser { + companion object{ + val REGION_XTEA = HashMap() + val DEFAULT_REGION_KEYS = intArrayOf(14881828, -6662814, 58238456, 146761213) + fun getRegionXTEA(regionId: Int): IntArray? { //Uses the xtea's from the sql to unlock regions + // System.out.println("USING SQL REGION KEYS");//Confirms we have unlocked those regions + return REGION_XTEA[regionId] + ?: // System.out.println("USING DEFAULT REGION KEYS FOR REGION " + regionId);//Used to check for missing regions + return DEFAULT_REGION_KEYS //This one grabs the keys from the SQL + // return DEFAULT_REGION_KEYS;//This one only uses the default keys at the top,{ 14881828, -6662814, 58238456, 146761213 }. Unsure why they chose these numbers. + } + } + val parser = JSONParser() + var reader: FileReader? = null + + + fun load() { + var count = 0 + reader = FileReader(ServerConstants.CONFIG_PATH + "xteas.json") + val obj = parser.parse(reader) as JSONObject + val configlist = obj["xteas"] as JSONArray + for(config in configlist){ + val e = config as JSONObject + val id = e["regionId"].toString().toInt() + val keys = e["keys"].toString().split(",").map(String::toInt) + REGION_XTEA[id] = intArrayOf(keys[0],keys[1],keys[2],keys[3]) + count++ + } + SystemLogger.logInfo("Parsed $count region keys.") + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/monitor/DuplicationLog.java b/Server/src/main/java/Server/core/game/system/monitor/DuplicationLog.java new file mode 100644 index 000000000..de1d380ba --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/monitor/DuplicationLog.java @@ -0,0 +1,116 @@ +package core.game.system.monitor; + +import core.ServerConstants; + +/** + * Handles duplication-related logging. + * @author Emperor + */ +public final class DuplicationLog extends MessageLog { + + /** + * The amount of milliseconds the player's actions should be logged. (days * + * hours * minutes * milliseconds) + */ + public static long LOGGING_DURATION = 5 * 24 * 60 * 60_000; + + /** + * The duplication flag for player talking about duping. + */ + public static final int DUPE_TALK = 0x1; + + /** + * The duplication flag for a large networth increase. + */ + public static final int NW_INCREASE = 0x8; + + /** + * The current flag. + */ + private int flag; + + /** + * The last time the player triggered the "large networth increase" flag. + */ + private long lastIncreaseFlag; + + /** + * Constructs a new {@code DuplicationLog} {@code Object}. + */ + public DuplicationLog() { + super(-1, false); + } + + @Override + public void write(String playerName) { + String priority = "low"; + switch (getProbability()) { + case 3: + priority = "high"; + break; + case 2: + priority = "mid"; + } + super.write(ServerConstants.LOGS_PATH + "duplicationflags/" + priority + "prior/" + playerName + ".log"); + } + + /** + * Gets the probability of duping (scale from 0 - 3). + * @return The probability (where 3 is very likely and 0 is very unlikely). + */ + public int getProbability() { + int probability = 0; + if ((flag & NW_INCREASE) != 0) { + probability += 2; + } + if ((flag & DUPE_TALK) != 0) { + probability++; + } + return probability; + } + + /** + * Checks if the player's actions should be logged (to find cause of + * duping). + * @return {@code True} if so. + */ + public boolean isLoggingFlagged() { + return (flag & NW_INCREASE) != 0 && (System.currentTimeMillis() - lastIncreaseFlag) < LOGGING_DURATION; + } + + /** + * Adds a flag. + * @param flag The flag to add. + */ + public void flag(int flag) { + this.flag |= flag; + if (flag == NW_INCREASE) { + lastIncreaseFlag = System.currentTimeMillis(); + } + } + + /** + * Gets the flag. + * @return The flag. + */ + public int getFlag() { + return flag; + } + + /** + * Gets the lastIncreaseFlag. + * @return The lastIncreaseFlag. + */ + public long getLastIncreaseFlag() { + return lastIncreaseFlag; + } + + /** + * Sets the lastIncreaseFlag. + * @param lastIncreaseFlag The lastIncreaseFlag to set. + */ + public void setLastIncreaseFlag(long lastIncreaseFlag) { + this.lastIncreaseFlag = lastIncreaseFlag; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/monitor/ExceptionLog.java b/Server/src/main/java/Server/core/game/system/monitor/ExceptionLog.java new file mode 100644 index 000000000..d5b742c39 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/monitor/ExceptionLog.java @@ -0,0 +1,98 @@ +package core.game.system.monitor; + +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; + +/** + * Handles exception logging. + * @author Emperor + */ +public final class ExceptionLog extends PrintStream { + + /** + * The logger. + */ + private final PrintStream logger; + + /** + * Constructs a new {@code ExceptionLog} {@code Object} + * @param file The output file directory. + * @throws IOException When an I/O exception occurs. + */ + public ExceptionLog(String file) throws IOException { + super(new File(file)); + this.logger = System.err; + } + + @Override + public void println(String message) { + logger.println(message); + } + + @Override + public PrintStream printf(String message, Object... objects) { + logger.printf(message, objects); + return super.printf(message, objects); + } + + @Override + public void println(boolean message) { + logger.println(message); + } + + @Override + public void println(int message) { + logger.println(message); + } + + @Override + public void println(double message) { + logger.println(message); + } + + @Override + public void println(char message) { + logger.println(message); + } + + @Override + public void println(long message) { + logger.println(message); + } + + @Override + public void println(Object message) { + logger.println(message); + } + + @Override + public void print(boolean message) { + logger.print(message); + } + + @Override + public void print(int message) { + logger.print(message); + } + + @Override + public void print(double message) { + logger.print(message); + } + + @Override + public void print(char message) { + logger.print(message); + } + + @Override + public void print(long message) { + logger.print(message); + } + + @Override + public void print(Object message) { + logger.print(message); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/monitor/MessageLog.java b/Server/src/main/java/Server/core/game/system/monitor/MessageLog.java new file mode 100644 index 000000000..36cb01385 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/monitor/MessageLog.java @@ -0,0 +1,143 @@ +package core.game.system.monitor; + +import core.cache.misc.buffer.ByteBufferUtils; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Handles message monitoring. + * @author Emperor + */ +public class MessageLog { + + /** + * The date format used. + */ + private static final DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + + /** + * The messages. + */ + private List messages; + + /** + * The logging capacity. + */ + private final int capacity; + + /** + * If all messages logged should be unique. + */ + private boolean uniqueLogging; + + /** + * Constructs a new {@code MessageLog} {@code Object} without capacity and + * uniqueLogging mode disabled. + */ + public MessageLog() { + this(-1, false); + } + + /** + * Constructs a new {@code MessageLog} {@code Object} with uniqueLogging + * mode disabled. + * @param capacity The capacity (-1 for no capacity). + */ + public MessageLog(int capacity) { + this(capacity, false); + } + + /** + * Constructs a new {@code MessageLog} {@code Object}. + * @param capacity The capacity (-1 for no capacity). + * @param uniqueLogging If all messages logged should be unique. + */ + public MessageLog(int capacity, boolean uniqueLogging) { + this.capacity = capacity; + this.messages = new ArrayList<>(); + this.uniqueLogging = uniqueLogging; + } + + /** + * Adds a message to the cache. + * @param message The message. + * @param timeStamp If the message should be time stamped. + */ + public void log(String message, boolean timeStamp) { + if (messages.size() == capacity) { + messages.remove(0); + } + if (uniqueLogging && messages.contains(message)) { + return; + } + if (timeStamp) { + StringBuilder sb = new StringBuilder(dateFormat.format(new Date())); + message = sb.append(": ").append(message).toString(); + } + messages.add(message); + } + + /** + * Writes the logged data to the file. + * @param fileName The name of the file to write on. + */ + public void write(String fileName) { + if (messages.isEmpty()) { + return; + } + int size = messages.size(); + ByteBuffer buffer = ByteBuffer.allocate(size * 16055); + buffer.putShort((short) size); + for (String message : messages) { + ByteBufferUtils.putString(message, buffer); + buffer.put((byte) '\n'); + } + buffer.putShort((short) -1); + buffer.flip(); + try (RandomAccessFile raf = new RandomAccessFile(fileName, "rw")) { + FileChannel channel = raf.getChannel(); + long pos = channel.size() - 2l; + if (pos < 1) { + pos = 0; + } + channel.write(buffer, pos); + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + messages.clear(); + } + + /** + * Gets the messages. + * @return The messages. + */ + public List getMessages() { + return messages; + } + + /** + * Sets the messages. + * @param messages The messages to set. + */ + public void setMessages(List messages) { + this.messages = messages; + } + + /** + * Gets the capacity. + * @return The capacity. + */ + public int getCapacity() { + return capacity; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/monitor/PlayerMonitor.java b/Server/src/main/java/Server/core/game/system/monitor/PlayerMonitor.java new file mode 100644 index 000000000..d54b727ed --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/monitor/PlayerMonitor.java @@ -0,0 +1,322 @@ +package core.game.system.monitor; + +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.SavingModule; + +import java.nio.ByteBuffer; + +/** + * Handles the player monitoring. + * @author Emperor + */ +public final class PlayerMonitor implements SavingModule { + + /** + * The public chat log. + */ + public static final int PUBLIC_CHAT_LOG = 0; + + /** + * The private chat log. + */ + public static final int PRIVATE_CHAT_LOG = 1; + + /** + * The clan chat log. + */ + public static final int CLAN_CHAT_LOG = 2; + + /** + * The IP/MAC-address log. + */ + public static final int ADDRESS_LOG = 3; + + /** + * The command log. + */ + public static final int COMMAND_LOG = 4; + + /** + * The trade log. + */ + public static final int TRADE_LOG = 5; + + /** + * The GE logs. + */ + public static final int GRAND_EXCHANGE_LOG = 6; + + /** + * The duel stake logs. + */ + public static final int DUEL_LOG = 7; + + /** + * The macro flag for a click when the client was out of focus. + */ + public static final int MF_NO_FOCUS_CLICK = 0x1; + + /** + * The networth of the player. + */ + private long networth; + + /** + * If the client is currently focused. + */ + private boolean clientFocus = true; + + /** + * How likely it is this player has used a macro. + */ + private int macroFlag; + + /** + * The duplication log. + */ + private DuplicationLog duplicationLog; + + /** + * The message monitors. + */ + private MessageLog[] logs = new MessageLog[8]; + + /** + * Constructs a new {@code PlayerMonitor} {@code Object}. + */ + public PlayerMonitor() { + logs[PUBLIC_CHAT_LOG] = new MessageLog(500); + logs[PRIVATE_CHAT_LOG] = new MessageLog(500); + logs[CLAN_CHAT_LOG] = new MessageLog(500); + logs[ADDRESS_LOG] = new MessageLog(200); + logs[COMMAND_LOG] = new MessageLog(200); + logs[TRADE_LOG] = new MessageLog(200); + logs[GRAND_EXCHANGE_LOG] = new MessageLog(500); + logs[DUEL_LOG] = new MessageLog(200); + } + + @Override + public void save(ByteBuffer buffer) { + if (duplicationLog != null && duplicationLog.getFlag() != 0) { + buffer.put((byte) 1).put((byte) duplicationLog.getFlag()); + } + if (macroFlag != 0) { + buffer.put((byte) 2).put((byte) macroFlag); + } + if (duplicationLog != null && duplicationLog.isLoggingFlagged()) { + buffer.put((byte) 4).putLong(duplicationLog.getLastIncreaseFlag()); + } + buffer.put((byte) 0); // EOF + } + + @Override + public void parse(ByteBuffer buffer) { + int opcode; + while ((opcode = buffer.get() & 0xFF) != 0) { + switch (opcode) { + case 1: + getDuplicationLog().flag(buffer.get() & 0xFF); + break; + case 2: + macroFlag = buffer.get() & 0xFF; + break; + case 3: + int size = buffer.get() & 0xFF; + for (int i = 0; i < size; i++) { + ByteBufferUtils.getString(buffer); + } + break; + case 4: + getDuplicationLog().setLastIncreaseFlag(buffer.getLong()); + break; + } + } + } + + /** + * Clears the logs. + */ + public void clear() { + for (int i = 0; i < logs.length; i++) { + if (logs[i] == null) { + continue; + } + logs[i].getMessages().clear(); + } + duplicationLog.getMessages().clear(); + } + + /** + * If the player's actions should be logged. + * @return {@code True} if so. + */ + public boolean isLogActions() { + return duplicationLog != null && duplicationLog.isLoggingFlagged(); + } + + /** + * Logs the given string. + * @param string The string to log. + * @param type The log type. + */ + public void log(String string, int type) { + log(string, type, true); + } + + /** + * Logs the given string. + * @param string The string to log. + * @param type The log type. + * @param timeStamp If we should time stamp the logged string. + */ + public void log(String string, int type, boolean timeStamp) { + if (type < 3) { + String check = string.toLowerCase(); + if (check.contains("dupe") || check.contains("duping") || check.contains("bug") || check.contains("glitch") || check.contains("exploit")) { + getDuplicationLog().flag(DuplicationLog.DUPE_TALK); + String prefix = null; + if (type == PUBLIC_CHAT_LOG) { + prefix = "Public"; + } else if (type == PRIVATE_CHAT_LOG) { + prefix = "Private"; + } else { + prefix = "Clan"; + } + getDuplicationLog().log(prefix + " chat message: " + string, true); + } + } + logs[type].log(string, timeStamp); + } + + /** + * Checks the networth difference for a player (called on logout). + * @param player The player. + * @param currentNet The current networth. + */ + public void checkNetworth(Player player, long currentNet) { + long difference = currentNet - this.networth; + if (difference < 1) { // The player lost money. + return; + } + if (difference > 150_000_000l) { + getDuplicationLog().flag(DuplicationLog.NW_INCREASE); + getDuplicationLog().log("Large networth increase - [incr=" + difference + ", old=" + this.networth + ", cur=" + currentNet + "].", true); + } + } + + /** + * Called when the player does a mouse click. + * @param x The x-coordinate of the cursor. + * @param y The y-coordinate of the cursor. + * @param delay The time between this click and last. + * @param rightClick If the right mouse-button was used to click. + */ + public void handleMouseClick(int x, int y, int delay, boolean rightClick) { + if (!clientFocus) { + macroFlag |= MF_NO_FOCUS_CLICK; + } + } + + /** + * Gets the address log. + * @param original the original log. + * @param address the address. + * @return the address. + */ + public static String getAddressLog(String original, String address) { + String log = ""; + if (original != null && original.length() > 0) { + log += original; + if (log.charAt(log.length() - 1) != '|') { + log += "|"; + } + } + if (address != null && address.length() > 0 && (original == null || !original.contains(address))) { + log += address + "|"; + } + if (log.length() > 0 && log.charAt(log.length() - 1) == '|') { + log = log.substring(0, log.length() - 1); + } + if (log == null) { + log = ""; + } + return log; + } + + /** + * Adds a macro flag. + * @param flag The flag. + */ + public void addMacroFlag(int flag) { + macroFlag |= flag; + } + + /** + * Gets the macroFlag. + * @return The macroFlag. + */ + public int getMacroFlag() { + return macroFlag; + } + + /** + * Sets the macroFlag. + * @param macroFlag The macroFlag to set. + */ + public void setMacroFlag(int macroFlag) { + this.macroFlag = macroFlag; + } + + /** + * Gets the networth. + * @return The networth. + */ + public long getNetworth() { + return networth; + } + + /** + * Sets the networth. + * @param networth The networth to set. + */ + public void setNetworth(long networth) { + this.networth = networth; + } + + /** + * Gets the clientFocus. + * @return The clientFocus. + */ + public boolean isClientFocus() { + return clientFocus; + } + + /** + * Sets the clientFocus. + * @param clientFocus The clientFocus to set. + */ + public void setClientFocus(boolean clientFocus) { + this.clientFocus = clientFocus; + } + + /** + * Gets the logs. + * @return The logs. + */ + public MessageLog[] getLogs() { + return logs; + } + + /** + * Gets the duplicationLog. + * @return The duplicationLog. + */ + public DuplicationLog getDuplicationLog() { + if (duplicationLog == null) { + duplicationLog = new DuplicationLog(); + } + return duplicationLog; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/mysql/SQLColumn.java b/Server/src/main/java/Server/core/game/system/mysql/SQLColumn.java new file mode 100644 index 000000000..3e6b7a36d --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/mysql/SQLColumn.java @@ -0,0 +1,154 @@ +package core.game.system.mysql; + +/** + * Represents a column used in an SQL table. + * @author Emperor + */ +public final class SQLColumn { + + /** + * The name. + */ + private final String name; + + /** + * The data type. + */ + private final Class type; + + /** + * If this column should never be updated in the database. + */ + private final boolean neverUpdate; + + /** + * The value. + */ + private Object value; + + /** + * If the column value changed. + */ + private boolean changed; + + /** + * If the column should be parsed. + */ + private boolean parse; + + /** + * Constructs a new {@code SQLColumn} {@code Object}. + * @param name The column name. + * @param type The data type. + */ + public SQLColumn(String name, Class type) { + this(name, type, false, true); + } + + /** + * Constructs a new {@code SQLColumn} {@code Object}. + * @param name The column name. + * @param type The data type. + * @param parse If the column should be parsed. + */ + public SQLColumn(String name, Class type, boolean parse) { + this(name, type, false, parse); + } + + /** + * Constructs a new {@code SQLColumn} {@code Object}. + * @param name The column name. + * @param type The data type. + * @param neverUpdate If this column should never be updated in the + * database. + * @param parse If the column should be parsed. + */ + public SQLColumn(String name, Class type, boolean neverUpdate, boolean parse) { + this.name = name; + this.type = type; + this.neverUpdate = neverUpdate; + this.parse = parse; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Updates the value. + * @param value The value. + */ + public void updateValue(Object value) { + this.changed = value != this.value; + this.value = value; + } + + /** + * Gets the value. + * @return The value. + */ + public Object getValue() { + return value; + } + + /** + * Sets the value. + * @param value The value to set. + */ + public void setValue(Object value) { + this.value = value; + this.changed = false; + } + + /** + * Gets the changed. + * @return The changed. + */ + public boolean isChanged() { + return changed; + } + + /** + * Sets the changed. + * @param changed The changed to set. + */ + public void setChanged(boolean changed) { + this.changed = changed; + } + + /** + * Gets the type. + * @return The type. + */ + public Class getType() { + return type; + } + + /** + * Gets the neverUpdate. + * @return The neverUpdate. + */ + public boolean isNeverUpdate() { + return neverUpdate; + } + + /** + * Gets the parse. + * @return the parse. + */ + public boolean isParse() { + return parse; + } + + /** + * Sets the parse. + * @param parse the parse to set + */ + public void setParse(boolean parse) { + this.parse = parse; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/mysql/SQLEntryHandler.java b/Server/src/main/java/Server/core/game/system/mysql/SQLEntryHandler.java new file mode 100644 index 000000000..fc2c66335 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/mysql/SQLEntryHandler.java @@ -0,0 +1,210 @@ +package core.game.system.mysql; + +import core.game.system.SystemLogger; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Handles an SQL entry. + * @author Emperor + * @param The entry type. + */ +public abstract class SQLEntryHandler { + + /** + * The connection. + */ + protected Connection connection; + + /** + * The entry. + */ + protected T entry; + + /** + * The result set. + */ + protected ResultSet result; + + /** + * The table name. + */ + protected String table; + + /** + * The column name. + */ + private String column; + + /** + * The value to use. + */ + protected String value; + + /** + * Constructs a new {@code SQLEntryHandler} {@code Object}. + * @param entry The entry. + * @param table The table name. + * @param column column name. + * @param value The column value. + */ + public SQLEntryHandler(T entry, String table, String column, String value) { + this.entry = entry; + this.table = table; + this.column = column; + this.value = value; + } + + /** + * Reads the SQL entry. + * @param entry The entry. + */ + public static boolean read(SQLEntryHandler entry) { + if (!SQLManager.isInitialized()) { + return false; + } + entry.connection = entry.getConnection(); + if (entry.connection == null) { + SystemLogger.logErr("Could not read SQL data: connection is null!"); + return false; + } + boolean success = false; + try { + entry.read(); + if (entry.result == null || !entry.result.next()) { + entry.create(); + } else { + entry.parse(); + } + success = true; + } catch (SQLException e) { + e.printStackTrace(); + } + SQLManager.close(entry.connection); + entry.connection = null; + return success; + } + + /** + * Writes the entry data on the SQL database. + * @param entry The entry. + */ + public static void write(SQLEntryHandler entry) { + write(entry, entry.getConnection(), true); + } + + /** + * Reads the SQL entry. + * @param entry The entry. + */ + public static void write(SQLEntryHandler entry, Connection connection, boolean commit) { + if (connection == null) { + SystemLogger.logErr("Could not write SQL data: connection is null!"); + return; + } + entry.connection = connection; + try { + if (!commit) { + entry.connection.setAutoCommit(false); + } + entry.save(); + } catch (SQLException e) { + e.printStackTrace(); + } + if (commit) { + SQLManager.close(entry.connection); + } + entry.connection = null; + } + + /** + * Reads the table from the SQL database. + * @throws SQLException When an SQL exception occurs. + */ + public void read() throws SQLException { + PreparedStatement statement = connection.prepareStatement("SELECT " + getReadSelection() + " FROM " + table + " WHERE " + column + " = ?"); + statement.setString(1, value); + result = statement.executeQuery(); + } + + /** + * Gets the result. + * @return the result. + */ + public ResultSet getResult() { + return result; + } + + /** + * Gets the selection. + * @return The selection. + */ + public String getReadSelection() { + return "*"; + } + + /** + * Gets the writing statement. + * @param create If we are creating a new row. + * @param columns The columns to update. + */ + public PreparedStatement getWritingStatement(boolean create, String... columns) { + PreparedStatement statement = null; + try { + StringBuilder sb = new StringBuilder(); + if (create) { + sb.append("INSERT INTO ").append(table).append(" (").append(column); + for (String name : columns) { + sb.append(",").append(name); + } + sb.append(") VALUES (?"); + for (int i = 0; i < columns.length; i++) { + sb.append(",?"); + } + sb.append(")"); + } else { + sb.append("UPDATE ").append(table).append(" SET "); + for (int i = 0; i < columns.length; i++) { + sb.append(columns[i]).append("=?"); + if (i < columns.length - 1) { + sb.append(","); + } + } + sb.append(" WHERE ").append(column).append("=?"); + } + statement = connection.prepareStatement(sb.toString()); + statement.setString(create ? 1 : columns.length + 1, value); + } catch (SQLException e) { + e.printStackTrace(); + } + return statement; + } + + /** + * Parses the entry. + * @throws SQLException When an SQL exception occurs. + */ + public abstract void parse() throws SQLException; + + /** + * Creates a new row in the database. + * @throws SQLException When an SQL exception occurs. + */ + public abstract void create() throws SQLException; + + /** + * Saves the entry. + * @throws SQLException When an SQL exception occurs. + */ + public abstract void save() throws SQLException; + + /** + * Gets the connection. + * @return The connection. + */ + public abstract Connection getConnection(); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/mysql/SQLManager.java b/Server/src/main/java/Server/core/game/system/mysql/SQLManager.java new file mode 100644 index 000000000..6a34155e7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/mysql/SQLManager.java @@ -0,0 +1,108 @@ +package core.game.system.mysql; + +import core.ServerConstants; +import core.game.system.SystemLogger; +import core.game.system.SystemManager; +import core.game.system.mysql.impl.*; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +/** + * Manages the SQL connections. + * @author Vexia + * + */ +public final class SQLManager { + + /** + * If the sql manager is locally hosted. Generally you never should change this. Ignore this. + */ + public static final boolean LOCAL = false; + + /** + * The database URL. + */ + public static String DATABASE_URL; + + /** + * IF the sql manager is initialized. + */ + private static boolean initialized; + + /** + * Constructs a new {@code SQLManager} {@code Object} + */ + public SQLManager() { + /** + * empty. + */ + } + + /** + * Initializes the sql manager. + */ + public static void init() { + initialized = true; + SystemManager.getSystemConfig().parse(); + } + + /** + * Pre-plugin parsing. + */ + public static void prePlugin() { + //new NPCConfigSQLHandler().parse(); + + } + + /** + * Parses data from the database for the server post plugin loading. + */ + public static void postPlugin() { + + } + + /** + * Gets a connection. + * @return The connection. + */ + public static Connection getConnection() { + DATABASE_URL = ServerConstants.DATABASE_ADDRESS + ":" + ServerConstants.DATABASE_PORT + "/" + ServerConstants.DATABASE_NAME + "?useTimezone=true&serverTimezone=UTC"; + try { + return DriverManager.getConnection("jdbc:mysql://" + DATABASE_URL, ServerConstants.DATABASE_USER, ServerConstants.DATABASE_PASS); + } catch (SQLException e) { + SystemLogger.logErr("Mysql error message=" + e.getMessage() + "."); + } + return null; + } + + /** + * Releases the connection so it's available for usage. + * @param connection The connection. + */ + public static void close(Connection connection) { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + /** + * Gets the initialized. + * @return the initialized + */ + public static boolean isInitialized() { + return initialized; + } + + /** + * Sets the bainitialized. + * @param initialized the initialized to set. + */ + public static void setInitialized(boolean initialized) { + SQLManager.initialized = initialized; + } + +} diff --git a/Server/src/main/java/Server/core/game/system/mysql/SQLTable.java b/Server/src/main/java/Server/core/game/system/mysql/SQLTable.java new file mode 100644 index 000000000..9daedc144 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/mysql/SQLTable.java @@ -0,0 +1,62 @@ +package core.game.system.mysql; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents an SQL table. + * @author Emperor + */ +public final class SQLTable { + + /** + * The columns. + */ + private final SQLColumn[] columns; + + /** + * Constructs a new {@code SQLTable} {@code Object}. + * @param columns The columns. + */ + public SQLTable(SQLColumn... columns) { + this.columns = columns; + } + + /** + * Gets the column for the given name. + * @param name The column name. + * @return The column. + */ + public SQLColumn getColumn(String name) { + for (SQLColumn column : columns) { + if (column.getName().equals(name)) { + return column; + } + } + return null; + } + + /** + * Gets the changed columns. + * @return The columns. + */ + public List getChanged() { + List updated = new ArrayList<>(); + for (int i = 0; i < columns.length; i++) { + SQLColumn column = columns[i]; + if (column.isChanged()) { + updated.add(column); + } + } + return updated; + } + + /** + * Gets the columns. + * @return The columns. + */ + public SQLColumn[] getColumns() { + return columns; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/mysql/impl/HighscoreSQLHandler.java b/Server/src/main/java/Server/core/game/system/mysql/impl/HighscoreSQLHandler.java new file mode 100644 index 000000000..f7bb9d342 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/mysql/impl/HighscoreSQLHandler.java @@ -0,0 +1,98 @@ +package core.game.system.mysql.impl; + +import core.ServerConstants; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.system.mysql.SQLEntryHandler; +import core.game.system.mysql.SQLManager; +import core.game.world.GameWorld; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +/** + * Handles the sql handler. + * @author Vexia + */ +public final class HighscoreSQLHandler extends SQLEntryHandler { + + /** + * Constructs a new {@code HighscoreSQLHandler} {@code Object}. + */ + public HighscoreSQLHandler(Player entry) { + super(entry, (SQLManager.LOCAL ? "global" : ServerConstants.DATABASE_NAME) + ".highscores", "username", entry.getName()); + } + + @Override + public void parse() throws SQLException { + + } + + @Override + public void create() throws SQLException { + if (entry.getDetails().getRights() == Rights.ADMINISTRATOR || GameWorld.getSettings().isDevMode()) { + return; + } + StringBuilder b = new StringBuilder("INSERT highscores(username,overall_xp,total_level,ironManMode,xp_0,xp_1,xp_2,xp_3,xp_4,xp_5,xp_6,xp_7,xp_8,xp_9,xp_10,xp_11,xp_12,xp_13,xp_14,xp_15,xp_16,xp_17,xp_18,xp_19,xp_20,xp_21,xp_22,xp_23) "); + b.append("VALUES('" + value + "', '" + entry.getSkills().getTotalXp() + "', '" + entry.getSkills().getTotalLevel() + "', '" + entry.getIronmanManager().getMode().name() + "', "); + int xp; + for (int i = 0; i < Skills.SKILL_NAME.length; i++) { + xp = (int) entry.getSkills().getExperience(i); + b.append("'" + xp + "'" + (i == Skills.SKILL_NAME.length - 1 ? "" : ",")); + } + b.append(")"); + PreparedStatement statement = connection.prepareStatement(b.toString()); + statement.executeUpdate(); + SQLManager.close(statement.getConnection()); + } + + @Override + public void save() throws SQLException { + if (entry.getDetails().getRights() == Rights.ADMINISTRATOR || GameWorld.getSettings().isDevMode()) { + return; + } + super.read(); + if (result == null || !result.next()) { + create(); + return; + } + if (entry.getSavedData().getActivityData().getHardcoreDeath() == true){ + //Update the SQL table to indicate the player was a Hardcore ironman that died, do not update hiscores + StringBuilder b = new StringBuilder("UPDATE highscores SET ironManMode='HARDCORE_DEAD' WHERE username ='" + value + "'"); + PreparedStatement statement = connection.prepareStatement(b.toString()); + statement.executeUpdate(); + SQLManager.close(statement.getConnection()); + return; + } + StringBuilder b = new StringBuilder("UPDATE highscores SET overall_xp='" + entry.getSkills().getTotalXp() + "', total_level='" + entry.getSkills().getTotalLevel() + "', ironManMode='" + entry.getIronmanManager().getMode().name() + "', "); + int xp; + for (int i = 0; i < Skills.SKILL_NAME.length; i++) { + xp = (int) entry.getSkills().getExperience(i); + b.append("xp_" + i + "='" + xp + "'" + (i == Skills.SKILL_NAME.length - 1 ? "" : ",")); + } + b.append("WHERE username='" + value + "'"); + PreparedStatement statement = connection.prepareStatement(b.toString()); + statement.executeUpdate(); + SQLManager.close(statement.getConnection()); + } + + /** + * Sets the data. + * @param statement the statement. + * @param startIndex the start index. + * @throws SQLException the exception. + */ + public void setData(PreparedStatement statement, int startIndex) throws SQLException { + for (int i = 0; i < Skills.SKILL_NAME.length; i++) { + statement.setInt(startIndex + i, entry.getSkills().getStaticLevel(i)); + } + } + + @Override + public Connection getConnection() { + return SQLManager.getConnection(); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/mysql/impl/PlayerLogSQLHandler.java b/Server/src/main/java/Server/core/game/system/mysql/impl/PlayerLogSQLHandler.java new file mode 100644 index 000000000..1fc6d1043 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/mysql/impl/PlayerLogSQLHandler.java @@ -0,0 +1,121 @@ +package core.game.system.mysql.impl; + +import core.ServerConstants; +import core.game.system.monitor.MessageLog; +import core.game.system.monitor.PlayerMonitor; +import core.game.system.mysql.SQLEntryHandler; +import core.game.system.mysql.SQLManager; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * SQL Entry handler to log player's messages, duplications, & addresses. + * @author Vexia + * + */ +public class PlayerLogSQLHandler extends SQLEntryHandler { + + /** + * The column names. + */ + private static final String[] MESSAGE_COLUMNS = new String[] { "public_chat", "private_chat", "clan_chat", "address_log", "command_log", "trade_log", "ge_log", "duel_log" }; + + /** + * Constructs a new {@Code PlayerLogSQLHandler} {@Code Object} + * @param entry the player monitor entry. + */ + public PlayerLogSQLHandler(PlayerMonitor entry, String playerName) { + super(entry, (SQLManager.LOCAL ? "global" : ServerConstants.DATABASE_NAME) + ".player_logs", "username", playerName); + } + + @Override + public void parse() throws SQLException { + } + + @Override + public void create() throws SQLException { + } + + @Override + public void save() throws SQLException { + Connection connection = getConnection(); + if (connection.prepareStatement("SELECT * FROM " + table + " WHERE username='" + value + "' LIMIT 1").executeQuery().next()) { + String b = "SET "; + int size = 0; + List columns = new ArrayList<>(); + for (int i = 0; i < MESSAGE_COLUMNS.length; i++) { + if (!entry.getLogs()[i].getMessages().isEmpty()) { + b += MESSAGE_COLUMNS[i] + " = CONCAT(" + MESSAGE_COLUMNS[i] + ", ?)" + (i == MESSAGE_COLUMNS.length - 1 ? "" : ","); + size++; + columns.add(i); + } + } + if (!entry.getDuplicationLog().getMessages().isEmpty()) { + b += (b.charAt(b.length() - 1) != ',' ? "," : "") + "duplication_log = CONCAT(duplication_log, ?)"; + } + if (b.charAt(b.length() - 1) == ',') { + b = b.substring(0, b.length() - 1); + } + PreparedStatement statement = connection.prepareStatement("UPDATE " + table + " " + b + " WHERE username='" + value + "'"); + for (int i = 0; i < size; i++) { + writeLog(statement, 1 + i, columns.get(i)); + } + if (!entry.getDuplicationLog().getMessages().isEmpty()) { + String log = ""; + MessageLog messageLog = entry.getDuplicationLog(); + for (int i = 0; i < messageLog.getMessages().size(); i++) { + if (log.contains(messageLog.getMessages().get(i))) { + continue; + } + log += messageLog.getMessages().get(i) + "\n"; + } + statement.setString(size + 1, log); + } + statement.executeUpdate(); + } else { + PreparedStatement statement = connection.prepareStatement("INSERT INTO " + table + " (username,public_chat,private_chat,clan_chat,address_log,command_log,trade_log,ge_log,duel_log,duplication_log) VALUES(?,?,?,?,?,?,?,?,?,?)"); + statement.setString(1, value); + for (int i = 0; i < MESSAGE_COLUMNS.length; i++) { + writeLog(statement, 2 + i, i); + } + String log = ""; + MessageLog messageLog = entry.getDuplicationLog(); + for (int i = 0; i < messageLog.getMessages().size(); i++) { + if (log.contains(messageLog.getMessages().get(i))) { + continue; + } + log += messageLog.getMessages().get(i) + "\n"; + } + statement.setString(10, log); + statement.executeUpdate(); + } + entry.clear(); + SQLManager.close(connection); + } + + /** + * Writes a message log to the prepared statement. + * @param statement the statement. + * @param columnIndex the column index. + * @param logIndex the log index. + * @throws SQLException the exception if thrown. + */ + private void writeLog(PreparedStatement statement, int columnIndex, int logIndex) throws SQLException { + String log = ""; + MessageLog messageLog = entry.getLogs()[logIndex]; + for (int i = 0; i < messageLog.getMessages().size(); i++) { + log += messageLog.getMessages().get(i) + "\n"; + } + statement.setString(columnIndex, log); + } + + @Override + public Connection getConnection() { + return SQLManager.getConnection(); + } + +} diff --git a/Server/src/main/java/Server/core/game/system/mysql/impl/PlayerSQLHandler.java b/Server/src/main/java/Server/core/game/system/mysql/impl/PlayerSQLHandler.java new file mode 100644 index 000000000..811b65182 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/mysql/impl/PlayerSQLHandler.java @@ -0,0 +1,133 @@ +package core.game.system.mysql.impl; + +import core.ServerConstants; +import core.game.node.entity.player.info.PlayerDetails; +import core.game.system.mysql.SQLColumn; +import core.game.system.mysql.SQLEntryHandler; +import core.game.system.mysql.SQLManager; + +import java.math.BigInteger; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.List; + +/** + * Handles player details parsing/saving using SQL. + * @author Emperor + */ +public final class PlayerSQLHandler extends SQLEntryHandler { + + /** + * Constructs a new {@code PlayerSQLHandler} {@code Object}. + * @param entry The player details. + */ + public PlayerSQLHandler(PlayerDetails entry) { + super(entry, (SQLManager.LOCAL ? "global" : ServerConstants.DATABASE_NAME) + ".members", "username", entry.getUsername()); + } + + @Override + public void parse() throws SQLException { + for (SQLColumn column : entry.getSqlManager().getTable().getColumns()) { + if (!column.isParse()) { + continue; + } + if (column.getType() == Integer.class) { + column.setValue(result.getInt(column.getName())); + } else if (column.getType() == String.class) { + column.setValue(result.getString(column.getName())); + } else if (column.getType() == Boolean.class) { + column.setValue(result.getBoolean(column.getName())); + } else if (column.getType() == Long.class) { + column.setValue(result.getLong(column.getName())); + } else if (column.getType() == Timestamp.class) { + column.setValue(result.getTimestamp(column.getName())); + } else if (column.getType() == BigInteger.class) { + column.setValue(result.getLong(column.getName())); + } + } + } + + @Override + public String getReadSelection() { + StringBuilder selection = new StringBuilder(); + boolean first = true; + for (SQLColumn column : entry.getSqlManager().getTable().getColumns()) { + if (!first) { + selection.append(","); + } else { + first = false; + } + selection.append(column.getName()); + } + return selection.toString(); + } + + @Override + public void create() throws SQLException { + if (entry == null) { + return; + } + String[] names = new String[entry.getSqlManager().getTable().getColumns().length]; + for (int i = 0; i < entry.getSqlManager().getTable().getColumns().length; i++) { + names[i] = entry.getSqlManager().getTable().getColumns()[i].getName(); + } + PreparedStatement statement = getWritingStatement(true, names); + for (int i = 0; i < entry.getSqlManager().getTable().getColumns().length; i++) { + SQLColumn column = entry.getSqlManager().getTable().getColumns()[i]; + if (column.getType() == Integer.class) { + statement.setInt(i + 2, (int) column.getValue()); + } else if (column.getType() == String.class) { + statement.setString(i + 2, (String) column.getValue()); + } else if (column.getType() == Boolean.class) { + statement.setBoolean(i + 2, (boolean) column.getValue()); + } else if (column.getType() == Long.class) { + statement.setLong(i + 2, (Long) column.getValue()); + } else if (column.getType() == Timestamp.class) { + statement.setTimestamp(i + 2, (Timestamp) column.getValue()); + } else if (column.getType() == java.math.BigInteger.class) { + statement.setLong(i + 2, (Long) column.getValue()); + } + } + statement.executeUpdate(); + SQLManager.close(statement.getConnection()); + } + + @Override + public void save() throws SQLException { + List updated = entry.getSqlManager().getTable().getChanged(); + if (updated.isEmpty()) { + return; + } + String[] names = new String[updated.size()]; + for (int i = 0; i < names.length; i++) { + names[i] = updated.get(i).getName(); + } + PreparedStatement statement = getWritingStatement(false, names); + for (int i = 0; i < updated.size(); i++) { + SQLColumn column = updated.get(i); + if (column.getType() == Integer.class) { + statement.setInt(i + 1, (int) column.getValue()); + } else if (column.getType() == String.class) { + statement.setString(i + 1, (String) column.getValue()); + } else if (column.getType() == Boolean.class) { + statement.setBoolean(i + 1, (boolean) column.getValue()); + } else if (column.getType() == Long.class) { + statement.setLong(i + 1, (Long) column.getValue()); + } else if (column.getType() == Timestamp.class) { + statement.setTimestamp(i + 1, (Timestamp) column.getValue()); + } else if (column.getType() == BigInteger.class) { + statement.setLong(i + 1, (Long) column.getValue()); + } + } + statement.executeUpdate(); + SQLManager.close(statement.getConnection()); + } + + @Override + public Connection getConnection() { + return SQLManager.getConnection(); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/InstructionType.java b/Server/src/main/java/Server/core/game/system/script/InstructionType.java new file mode 100644 index 000000000..539d23c27 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/InstructionType.java @@ -0,0 +1,73 @@ +package core.game.system.script; + +/** + * Represents the instruction types. + * @author Emperor + */ +public enum InstructionType { + + /** + * The condition type. + */ + CONDITION('$'), + + /** + * The instruction type. + */ + INSTRUCTION('*'), + + /** + * The method type. + */ + METHOD('#'), + + /** + * The local method type. + */ + LOCAL_METHOD('@'), + + /** + * The go to type. + */ + GOTO('>'), + + /** + * The end bracket type. + */ + END_BRACKET('}'); + + /** + * Gets the instruction type. + * @param c The character. + * @return The instruction type. + */ + public static InstructionType forIndicator(char c) { + for (InstructionType type : values()) { + if (type.indication == c) { + return type; + } + } + return null; + } + + /** + * The character indication. + */ + private final char indication; + + /** + * Constructs a new {@code InstructionType} {@code Object}. + * @param indication The indicator. + */ + private InstructionType(char indication) { + this.indication = indication; + } + + /** + * Gets the indication. + * @return The indication character. + */ + public char getIndication() { + return indication; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/MethodCall.java b/Server/src/main/java/Server/core/game/system/script/MethodCall.java new file mode 100644 index 000000000..f11a0f796 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/MethodCall.java @@ -0,0 +1,77 @@ +package core.game.system.script; + +/** + * Represents a method call. + * @author Emperor + */ +public final class MethodCall { + + /** + * The method name. + */ + private final String methodName; + + /** + * The arguments. + */ + private final String arguments; + + /** + * The method script. + */ + private ScriptContext script; + + /** + * Constructs a new {@code MethodCall} {@code Object}. + * @param methodName The method name. + * @param arguments The arguments. + */ + public MethodCall(String methodName, String arguments) { + this(methodName, arguments, null); + } + + /** + * Constructs a new {@code MethodCall} {@code Object}. + * @param methodName The method name. + * @param arguments The arguments. + * @param script The script context. + */ + public MethodCall(String methodName, String arguments, ScriptContext script) { + this.methodName = methodName; + this.arguments = arguments; + this.script = script; + } + + /** + * Gets the methodName. + * @return The methodName. + */ + public String getMethodName() { + return methodName; + } + + /** + * Gets the arguments. + * @return The arguments. + */ + public String getArguments() { + return arguments; + } + + /** + * Gets the script. + * @return The script. + */ + public ScriptContext getScript() { + return script; + } + + /** + * Sets the script. + * @param script The script to set. + */ + public void setScript(ScriptContext script) { + this.script = script; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/ParamCall.java b/Server/src/main/java/Server/core/game/system/script/ParamCall.java new file mode 100644 index 000000000..8f054afcc --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/ParamCall.java @@ -0,0 +1,29 @@ +package core.game.system.script; + +/** + * Represents a parameter call. + * @author Emperor + */ +public final class ParamCall { + + /** + * The parameter name. + */ + private final String parameter; + + /** + * Constructs a new {@code MethodParam} {@code Object}. + * @param parameter The parameter name. + */ + public ParamCall(String parameter) { + this.parameter = parameter; + } + + /** + * Gets the parameter. + * @return The parameter. + */ + public String getParameter() { + return parameter; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/ScriptBuilder.java b/Server/src/main/java/Server/core/game/system/script/ScriptBuilder.java new file mode 100644 index 000000000..51e7e0d1d --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/ScriptBuilder.java @@ -0,0 +1,58 @@ +package core.game.system.script; + +import core.game.system.script.exc.ScriptException; + +/** + * Used for building scripts. + * @author Emperor + */ +public abstract class ScriptBuilder { + + /** + * The builder arguments. + */ + protected Object[] arguments; + + /** + * Constructs a new {@code ScriptBuilder} {@code Object}. + */ + public ScriptBuilder(Object[] arguments) { + this.arguments = arguments; + } + + /** + * Parses the builder arguments. + * @param args The arguments to parse. + * @return The builder arguments. + */ + public abstract Object[] parseArguments(String args); + + /** + * Initializes the script. + * @param context The script context. + */ + public abstract void configureScript(ScriptContext context); + + /** + * Creates a new script builder. + * @param args The arguments. + * @return The builder. + */ + public abstract ScriptBuilder create(Object... args); + + /** + * Handles a local method. + * @param name The method name. + * @param context The method script. + * @param current The current script. + */ + public abstract void handleLocalMethod(String name, ScriptContext context, ScriptContext current) throws ScriptException; + + /** + * Gets the builder arguments. + * @return The arguments. + */ + public Object[] getArguments() { + return arguments; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/ScriptCompiler.java b/Server/src/main/java/Server/core/game/system/script/ScriptCompiler.java new file mode 100644 index 000000000..8a22c61f4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/ScriptCompiler.java @@ -0,0 +1,598 @@ +package core.game.system.script; + +import core.ServerConstants; +import core.game.system.SystemLogger; +import plugin.ai.AIPBuilder; +import plugin.ai.AIPlayer; +import core.game.system.script.exc.InvalidGOTOException; +import core.game.system.script.exc.InvalidInstructionException; +import core.game.system.script.exc.InvalidInterpreterException; +import core.game.system.script.exc.ScriptException; +import core.game.world.GameWorld; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.*; + +/** + * Used for compiling scripts. + * @author Emperor + */ +public final class ScriptCompiler { + + /** + * The current line index. + */ + private static int lineId; + + /** + * The mapping of methods. + */ + private static Map methodScripts; + + /** + * The mapping of method calls. + */ + private static Map methodCalls; + + /** + * The mapping of fields. + */ + private static Map fields; + + /** + * The mapping of field calls. + */ + @SuppressWarnings("unused") + private static Map fieldCalls; + + /** + * The current builder. + */ + private static ScriptBuilder builder; + + /** + * The instructions. + */ + private static Map instructions; + + /** + * The main method. + * @param args The arguments cast on runtime. + */ + public static void main(String... args) { + try { + GameWorld.prompt(false); + ScriptContext context = parseRaw(new File(ServerConstants.DIALOGUE_SCRIPTS_PATH + "test.asc")); + AIPlayer player = AIPBuilder.create(null); + context.execute(player); + ScriptManager.run(context, player); + } catch (Throwable e) { + e.printStackTrace(); + } + System.exit(0); + } + + /** + * Loads the instructions. + * @throws Throwable When an exception occurs. + */ + public static void loadInstructions() throws Throwable { + if (instructions != null) { + return; + } + instructions = new HashMap<>(); + for (File file : new File("core/game/system/script/context/").listFiles()) { + String name = file.getName(); + if (name.contains("$")) { + continue; + } + Class context = Class.forName("org.crandor.game.system.script.context." + name.replace(".class", "")); + Object object = context.newInstance(); + if (object instanceof ScriptContext) { + ScriptContext script = (ScriptContext) object; + instructions.put(script.getName(), script); + } + } + } + + /** + * Parses a raw script + * @param file The script file. + * @throws Throwable When an exception occurs. + */ + public static ScriptContext parseRaw(File file) throws Throwable { + loadInstructions(); + BufferedReader br = new BufferedReader(new FileReader(file)); + lineId = -1; + String line; + builder = null; + methodScripts = new HashMap<>(); + methodCalls = new HashMap<>(); + fields = new HashMap<>(); + try { + Queue rawScript = new LinkedList<>(); + boolean first = true; + while ((line = br.readLine()) != null) { + lineId++; + StringBuilder sb = formatArgument(new StringBuilder(line)); + int commentIndex = sb.toString().indexOf("//"); + if (commentIndex > -1) { + sb.setLength(commentIndex); + } + if (first && sb.length() > 0) { + first = false; + if (line.charAt(0) == '@') { + builder = createBuilder(sb); + continue; + } + } + rawScript.add(sb.toString()); + + } + lineId = 0; + if (builder != null) { + lineId++; + } + line = rawScript.poll(); + if (line == null) { + br.close(); + throw new ScriptException("ScriptAPI " + file.getName() + " is empty!", -1); + } + br.close(); + ScriptContext context = parseScript(line, rawScript, new ScriptEntry(null, null, null, false), null); + if (context != null) { + for (ScriptContext caller : methodCalls.keySet()) { + MethodCall call = methodCalls.get(caller); + MethodCall method = methodScripts.get(call.getMethodName()); + if (method == null) { + throw new InvalidGOTOException(call.getMethodName() + "", -1); + } + ScriptContext script = method.getScript(); + if (call.getArguments() != null && call.getArguments().length() > 0) { + String[] parameterNames = getArguments(method.getArguments()); + Object[] values = getParameters(call.getArguments(), 0); + if (values.length != parameterNames.length) { + throw new IllegalArgumentException("Not enough parameters name=" + call.getMethodName() + "!"); + } + for (int i = 0; i < parameterNames.length; i++) { + fields.put(parameterNames[i], values[i]); + } + script = checkScriptParameters(script, caller, null); + } + script.setName(call.getMethodName()); + caller.setInstruction(script); + } + } + return context; + } catch (ScriptException e) { + e.printStackTrace(); + } catch (Throwable t) { + br.close(); + throw new ScriptException("Error parsing line " + lineId + "!", t); + } + br.close(); + return null; + } + + /** + * Checks for parameters. + * @param script The script to check. + * @param original The original script, to prevent infinite looping. + */ + private static ScriptContext checkScriptParameters(ScriptContext script, ScriptContext last, ScriptContext original) { + Object[] copy = null; + for (int i = 0; i < script.parameters.length; i++) { + Object object = script.parameters[i]; + if (object instanceof ParamCall) { + if (copy == null) { + copy = Arrays.copyOf(script.parameters, script.parameters.length); + } + ParamCall call = (ParamCall) object; + copy[i] = fields.get(call.getParameter()); + if (copy[i] == null) { + System.out.println("Could not find field " + call.getParameter()); + } + } + } + if (copy == null) { + copy = script.parameters; + } + ScriptContext context = script.parse(copy); + if (script == last.getCondition()) { + last.setCondition(context); + } else { + last.setInstruction(context); + } + context.setCondition(script.getCondition()); + context.setInstruction(script.getInstruction()); + if (original == null) { + original = context; + } + script = context; + if (script.getCondition() != null && script.getCondition() != original) { + checkScriptParameters(script.getCondition(), script, original); + } + if (script.getInstruction() != null && script.getInstruction() != original) { + checkScriptParameters(script.getInstruction(), script, original); + } + return script; + } + + /** + * Parses the script. + * @param line The first line the parse. + * @param rawScript The script data queue. + * @param script The main script context. + * @throws IOException When an I/O exception occurs. + */ + private static ScriptContext parseScript(String line, Queue rawScript, ScriptEntry script, ScriptContext previous) throws Throwable { + ScriptContext condition = null; + ScriptContext current = null; + InstructionType type = null; + boolean main = script.getName() == null; + stop: while (line != null) { + if (main) { + lineId++; + } + if (line.length() < 1) { + line = rawScript.poll(); + continue; + } + char c = line.charAt(0); + Object[] ctx = parse(InstructionType.forIndicator(c), line); + type = (InstructionType) ctx[0]; + String name = (String) ctx[1]; + String arguments = (String) ctx[2]; + boolean bracket = (Boolean) ctx[3]; + switch (type) { + case LOCAL_METHOD: + case METHOD: + Queue queue = new LinkedList<>(); + queue.add(Boolean.toString(bracket)); + String data; + int bracketCount = bracket ? 1 : 0; + while ((data = rawScript.poll()) != null) { + if (main) { + lineId++; + } + c = data.length() > 0 ? data.charAt(0) : 'f'; + queue.add(data); + if (data.indexOf('{') > -1) { + bracketCount++; + } + if (parse(InstructionType.forIndicator(c), data)[0] == InstructionType.END_BRACKET) { + bracketCount--; + } + if (bracketCount < 1) { + break; + } + } + queue.poll(); + ScriptContext context = parseScript(queue.poll(), queue, new ScriptEntry(null, null, name, bracket), current); + if (type == InstructionType.METHOD) { + methodScripts.put(name, new MethodCall(name, arguments, context)); + } else { + handleLocalMethod(name, context, current); + } + break; + case CONDITION: + context = getInstruction(name, arguments); + if (context == null) { + throw new InvalidInstructionException(name, lineId); + } + if (current != null) { + current.setCondition(context); + } else { + condition = context; + } + script = new ScriptEntry(context, script, null, bracket); + current = context; + break; + case INSTRUCTION: + case GOTO: + if (type == InstructionType.GOTO) { + if (name == null) { + name = arguments; + arguments = null; + } + methodCalls.put(current, new MethodCall(name, arguments)); + if (!script.isBracket() && script.getPreviousEntry() != null) { + script = script.getPreviousEntry(); + current = script.getCurrent(); + while (current.getInstruction() != null) { + current = current.getInstruction(); + } + } + break; + } else { + context = getInstruction(name, arguments); + if (context == null) { + throw new InvalidInstructionException(name + " - " + arguments, lineId); + } + } + if (script.getCurrent() == null) { + current = context; + script.setCurrent(context); + context.setCondition(condition); + condition = null; + break; + } + current.setInstruction(context); + current = context; + if (!script.isBracket() && script.getPreviousEntry() != null) { + script = script.getPreviousEntry(); + current = script.getCurrent(); + while (current.getInstruction() != null) { + current = current.getInstruction(); + } + } + break; + case END_BRACKET: + if (script.isBracket() && script.getPreviousEntry() != null) { + script = script.getPreviousEntry(); + current = script.getCurrent(); + while (current.getInstruction() != null) { + current = current.getInstruction(); + } + break; + } + break stop; + } + line = rawScript.poll(); + } + if (script.getPreviousEntry() != null) { + SystemLogger.logErr("Error parsing " + type + " at line " + lineId + ": " + script.getName() + "!"); + } + return script.getCurrent(); + } + + /** + * Handles a local method. + * @param name The name. + * @param context The method script. + * @param current The current script. + * @throws ScriptException When an exception occurs. + */ + private static void handleLocalMethod(String name, ScriptContext context, ScriptContext current) throws ScriptException { + if (builder != null) { + builder.handleLocalMethod(name, context, current); + } + } + + /** + * Gets the instruction for the given name. + * @param name The name. + * @param arguments The arguments. + * @return The script context. + */ + public static ScriptContext getInstruction(String name, String arguments) { + ScriptContext context = instructions.get(name); + if (context != null) { + context = context.parse(getParameters(arguments, 0)); + } + // ScriptContext context = builder != null ? + // builder.newInstruction(name, arguments) : null; + // if (context == null) { + // String[] args = getArguments(arguments); + // switch (name) { + // case "startactivity": + // name = args[0]; + // context = new StartActivityInstruction(name, getParameters(arguments, + // 1)); + // break; + // case "message": + // for (int i = 0; i < args.length; i++) { + // args[i] = getString(args[i]); + // } + // context = new PMessageInstruction(args); + // break; + // case "hasitem": + // Item[] items = new Item[args.length / 2]; + // for (int i = 0; i < items.length; i++) { + // items[i] = new Item(Integer.parseInt(args[i]), + // Integer.parseInt(args[i + 1])); + // } + // context = new InvItemCondition(items); + // break; + // } + // } + return context; + } + + /** + * Gets the parameters. + * @param arguments The argument line. + * @param offset The offset. + * @return The parameters. + */ + public static Object[] getParameters(String arguments, int offset) { + String[] args = getArguments(arguments); + Object[] params = new Object[args.length - offset]; + for (int i = offset; i < params.length; i++) { + Object object = null; + char c = args[i].charAt(0); + if (c == '"') { + object = getString(args[i]); + } else if (Character.isDigit(c)) { + object = Integer.parseInt(args[i]); + } else if (args[i].equals("true")) { + object = true; + } else if (args[i].equals("false")) { + object = false; + } else { + object = new ParamCall(args[i]); + } + params[i - offset] = object; + } + return params; + } + + /** + * Gets the string without the surrounding "". + * @param string The string. + * @return The string without surrounding ""s. + */ + public static String getString(String string) { + return string.substring(1, string.length() - 1); + } + + /** + * Parses the script context. + * @param type The instruction type. + * @param line The line. + * @return The script context. + */ + private static Object[] parse(InstructionType type, String line) { + int index = 1; + if (type == null) { + index = 0; + type = InstructionType.INSTRUCTION; + } + String instructionName = null; + String arguments = null; + boolean bracketUsed = false; + StringBuilder sb = new StringBuilder(); + boolean openingParenthese = false; + boolean string = false; + for (; index < line.length(); index++) { + char ch = line.charAt(index); + if (!string) { + if (ch == ':' && !openingParenthese && type == InstructionType.INSTRUCTION) { + type = InstructionType.METHOD; + instructionName = formatArgument(sb).toString(); + sb = new StringBuilder(); + continue; + } + if (ch == '(') { + openingParenthese = true; + if (type != InstructionType.METHOD) { + instructionName = formatArgument(sb).toString(); + } + sb = new StringBuilder(); + continue; + } + if (ch == ')') { + arguments = formatArgument(sb).toString(); + sb = new StringBuilder(); + continue; + } + if (ch == '{') { + if (type == InstructionType.LOCAL_METHOD) { + instructionName = formatArgument(sb).toString(); + sb = new StringBuilder(); + } + bracketUsed = true; + break; + } + } + if (ch == '"') { + string = !string; + } + sb.append(ch); + } + + if (arguments == null) { + arguments = formatArgument(sb).toString(); + } + return new Object[] { type, instructionName, arguments, bracketUsed }; + } + + /** + * Creates a builder from the arguments. + * @param sb The arguments string builder. + * @return The script builder. + * @throws InvalidInterpreterException When the interpreter could not be + * found. + */ + private static ScriptBuilder createBuilder(StringBuilder sb) throws InvalidInterpreterException { + String[] args = sb.substring(1).toString().replaceFirst(" ", ";").split(";"); + ScriptType i = ScriptType.forTag(args[0]); + if (i == null) { + throw new InvalidInterpreterException(); + } + StringBuilder s = new StringBuilder(); + for (int j = 1; j < args.length; j++) { + if (j != 1) { + s.append(";"); + } + s.append(args[j]); + } + Object[] builderArguments = i.getBuilder().parseArguments(formatArgument(s).toString()); + return i.getBuilder().create(builderArguments); + } + + /** + * Gets the arguments. + * @param argumentLine The argument line. + * @return The arguments. + */ + public static String[] getArguments(String argumentLine) { + String[] args = new String[20]; + int size = 0; + StringBuilder sb = new StringBuilder(); + boolean string = false; + for (int i = 0; i < argumentLine.length(); i++) { + char c = argumentLine.charAt(i); + if (c == '"') { + string = !string; + } + if (!string) { + if (c == ',') { + args[size++] = sb.toString(); + sb = new StringBuilder(); + if (size == args.length) { + args = Arrays.copyOf(args, args.length * 2); + } + continue; + } + if (c == ' ') { + continue; + } + } + sb.append(c); + } + if (sb.length() > 0) { + args[size++] = sb.toString(); + } + if (size == 0) { + return null; + } + return Arrays.copyOf(args, size); + } + + /** + * Formats an argument. + * @return The formatted argument. + */ + public static StringBuilder formatArgument(String string) { + return formatArgument(new StringBuilder(string)); + } + + /** + * Formats an argument. + * @param sb The argument string builder. + * @return The formatted argument. + */ + public static StringBuilder formatArgument(StringBuilder sb) { + while (sb.length() > 0 && (sb.charAt(0) == ' ' || sb.charAt(0) == ' ')) { + sb.deleteCharAt(0); + } + char c; + while (sb.length() > 0 && ((c = sb.charAt(sb.length() - 1)) == ' ' || c == ' ')) { + sb.deleteCharAt(sb.length() - 1); + } + return sb; + } + + /** + * Gets the script builder used. + * @return The script builder. + */ + public static ScriptBuilder getBuilder() { + return builder; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/ScriptContext.java b/Server/src/main/java/Server/core/game/system/script/ScriptContext.java new file mode 100644 index 000000000..e699c0792 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/ScriptContext.java @@ -0,0 +1,165 @@ +package core.game.system.script; + +/** + * ScriptAPI context, this can be a condition or an instruction. + * @author Emperor + */ +public abstract class ScriptContext { + + /** + * The default arguments. + */ + private boolean instant = true; + + /** + * The name of this script. + */ + private String name; + + /** + * The argument line. + */ + protected Object[] parameters; + + /** + * The condition. + */ + private ScriptContext condition; + + /** + * The instruction. + */ + private ScriptContext instruction; + + /** + * Constructs a new {@code ScriptContext} {@code Object}. + * @param name The script context name. + */ + public ScriptContext(String name) { + this.name = name; + } + + /** + * Parses the parameters and creates a new script context object. + * @param params The parameters. + * @return The script context. + */ + public abstract ScriptContext parse(Object... params); + + /** + * Executes the script. + * @param args The arguments. + * @return {@code True} if successfully executed. + */ + public abstract boolean execute(Object... args); + + /** + * Creates a new instance of this script with the given argument line. + * @param args The argument line. + * @return The script context. + */ + public ScriptContext create(String args) { + ScriptContext context = ScriptCompiler.getInstruction(name, args); + if (context == null) { + return null; + } + context.condition = condition; + context.instruction = instruction; + return context; + } + + /** + * Runs the script. + * @param args The script arguments. + * @return {@code True} if successfully executed. + */ + public ScriptContext run(Object... args) { + if (condition != null && condition.execute(args)) { + return condition; + } + if (instruction != null && instruction.execute(args)) { + return instruction; + } + return null; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * @param name The name. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the condition. + * @return The condition. + */ + public ScriptContext getCondition() { + return condition; + } + + /** + * Sets the condition. + * @param condition The condition to set. + */ + public void setCondition(ScriptContext condition) { + this.condition = condition; + } + + /** + * Gets the instruction. + * @return The instruction. + */ + public ScriptContext getInstruction() { + return instruction; + } + + /** + * Sets the instruction. + * @param instruction The instruction to set. + */ + public void setInstruction(ScriptContext instruction) { + this.instruction = instruction; + } + + /** + * Gets the instant. + * @return The instant. + */ + public boolean isInstant() { + return instant; + } + + /** + * Sets the instant. + * @param instant The instant to set. + */ + public void setInstant(boolean instant) { + this.instant = instant; + } + + /** + * Gets the parameters. + * @return The parameters. + */ + public Object[] getParameters() { + return parameters; + } + + /** + * Sets the parameters. + * @param parameters The parameters to set. + */ + public void setParameters(Object[] parameters) { + this.parameters = parameters; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/ScriptEntry.java b/Server/src/main/java/Server/core/game/system/script/ScriptEntry.java new file mode 100644 index 000000000..2f96c8451 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/ScriptEntry.java @@ -0,0 +1,104 @@ +package core.game.system.script; + +/** + * A script compiling entry. + * @author Emperor + */ +public class ScriptEntry { + + /** + * The current script context. + */ + private ScriptContext current; + + /** + * The previous script context. + */ + private ScriptEntry previousEntry; + + /** + * The instruction name. + */ + private String name; + + /** + * If a bracket was used. + */ + private boolean bracket; + + /** + * Constructs a new {@code ScriptEntry} {@code Object}. + * @param current The current script context. + * @param previous The previous script entry. + */ + public ScriptEntry(ScriptContext current, ScriptEntry previous, String name, boolean bracket) { + this.current = current; + this.previousEntry = previous; + this.name = name; + this.bracket = bracket; + } + + /** + * Gets the current. + * @return The current. + */ + public ScriptContext getCurrent() { + return current; + } + + /** + * Sets the current. + * @param current The current to set. + */ + public void setCurrent(ScriptContext current) { + this.current = current; + } + + /** + * Gets the previous. + * @return The previous. + */ + public ScriptEntry getPreviousEntry() { + return previousEntry; + } + + /** + * Sets the previous. + * @param previous The previous to set. + */ + public void setPrevious(ScriptEntry previous) { + this.previousEntry = previous; + } + + /** + * Gets the bracket. + * @return The bracket. + */ + public boolean isBracket() { + return bracket; + } + + /** + * Sets the bracket. + * @param bracket The bracket to set. + */ + public void setBracket(boolean bracket) { + this.bracket = bracket; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * @param name The name to set. + */ + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/ScriptManager.java b/Server/src/main/java/Server/core/game/system/script/ScriptManager.java new file mode 100644 index 000000000..3610d4eb4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/ScriptManager.java @@ -0,0 +1,115 @@ +package core.game.system.script; + +import core.ServerConstants; +import core.game.system.SystemLogger; +import core.game.world.GameWorld; + +import java.io.File; + +/** + * A class used to manage the loading of scripts. + * @author 'Vexia + */ +public final class ScriptManager { + + /** + * The amount of scripts loaded. + */ + private static int amount; + + /** + * Method used to load the script manager. + * @param args the arguments. + */ + public static void main(String... args) { + load(); + } + + /** + * Runs the script and returns the current script context after executing. + * @param context The script to run. + * @param args The arguments. + * @return The last script context executed. + */ + public static ScriptContext run(ScriptContext context, Object... args) { + ScriptContext ctx = context; + do { + ctx = ctx.run(args); + } while (ctx != null && ctx.isInstant()); + return ctx; + } + + /** + * Runs the script and returns the current script context after executing. + * @param context The script to run. + * @param name The method name. + * @return The method script context. + */ + public static ScriptContext getMethod(ScriptContext context, String name) { + ScriptContext ctx = context; + while (ctx != null) { + if (ctx.getCondition() != null) { + context = getMethod(ctx.getCondition(), name); + if (context != null) { + return context; + } + } + if (ctx.getName().equals(name)) { + // System.out.println(ctx + ", " + + // Arrays.toString(ctx.getParameters())); + return ctx; + } + ctx = ctx.getInstruction(); + } + return null; + } + + /** + * Initiates the chain reaction of script loading. + */ + public static void load() { + amount = 0; + load(new File(ServerConstants.SCRIPTS_PATH)); + SystemLogger.logInfo("Parsed " + amount + " " + GameWorld.getSettings().getName() + " script" + (amount == 1 ? "" : "s") + "..."); + } + + /** + * Method used to load a script by its path. + * @param path the path. + */ + public static void load(final String path) { + load(new File(path)); + } + + /** + * Loads scripts from a directory. + * @param directory the directory. + * @throws Throwable the throwable. + */ + public static void load(final File directory) { + try { + for (File file : directory.listFiles()) { + if (file.getName().equals(".DS_Store")) { + continue; + } + //Files to EXCLUDE from loading + if (file.getName().equals("simon_templeton.asc") || file.getName().equals("ardougne_baker.asc") || file.getName().equals("anna_isaakson.asc")){ + continue; + } + if (file.isDirectory()) { + load(file); + continue; + } +// ScriptContext context = ScriptCompiler.parseRaw(file); +// if (ScriptCompiler.getBuilder() != null) { +// ScriptCompiler.getBuilder().configureScript(context); +// } + amount++; + } + } catch (Throwable e) { + e.printStackTrace(); + SystemLogger.logErr("Error loading at directory - " + directory + "!"); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/system/script/ScriptType.java b/Server/src/main/java/Server/core/game/system/script/ScriptType.java new file mode 100644 index 000000000..9349c4631 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/ScriptType.java @@ -0,0 +1,78 @@ +package core.game.system.script; + +import core.game.system.script.build.DialogueScriptBuilder; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents the information for a script type. + * @author 'Vexia + */ +public enum ScriptType { + + DIALOGUE("dialogue", new DialogueScriptBuilder(null)); + + /** + * The mapping of the script informations. + */ + private static final Map INFOS = new HashMap<>(); + + /** + * The tag of the script info. + */ + private final String tag; + + /** + * The script builder. + */ + private final ScriptBuilder builder; + + /** + * Constructs a new {@code ScriptInfo} {@code Object}. + * @param tag the tag. + */ + private ScriptType(String tag, ScriptBuilder builder) { + this.tag = tag; + this.builder = builder; + } + + /** + * Gets the script info by the tag. + * @param tag the tag. + * @return the tag. + */ + public static ScriptType forTag(final String tag) { + ScriptType info = INFOS.get(tag); + if (info == null) { + throw new NullPointerException("Error! Unknown script type for tag - " + tag + "."); + } + return info; + } + + /** + * Gets the tag. + * @return The tag. + */ + public String getTag() { + return tag; + } + + /** + * Gets the builder. + * @return The builder. + */ + public ScriptBuilder getBuilder() { + return builder; + } + + /** + * static-block for populating map. + */ + static { + for (ScriptType info : values()) { + INFOS.put(info.getTag(), info); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/system/script/build/DialogueScriptBuilder.java b/Server/src/main/java/Server/core/game/system/script/build/DialogueScriptBuilder.java new file mode 100644 index 000000000..2d492ec57 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/build/DialogueScriptBuilder.java @@ -0,0 +1,99 @@ +package core.game.system.script.build; + +import core.game.content.dialogue.DialogueInterpreter; +import core.game.system.script.ScriptBuilder; +import core.game.system.script.ScriptCompiler; +import core.game.system.script.ScriptContext; +import core.game.system.script.context.OptionDialInstruction; +import core.game.system.script.exc.InvalidInstructionException; +import core.game.system.script.exc.ScriptException; + +import java.util.Arrays; + +/** + * Handles dialogue script building. + * @author Emperor + */ +public final class DialogueScriptBuilder extends ScriptBuilder { + + /** + * Constructs a new {@code DialogueScriptBuilder} {@code Object}. + * @param args The builder arguments. + */ + public DialogueScriptBuilder(Object[] args) { + super(args); + } + + @Override + public void configureScript(ScriptContext context) { + if (arguments[0] instanceof String) { + for (int i = 0; i < arguments.length; i++) { + DialogueInterpreter.add(DialogueInterpreter.getDialogueKey((String) arguments[i]), context); + } + return; + } + for (int i = 0; i < arguments.length; i++) { + DialogueInterpreter.add((Integer) arguments[i], context); + } + } + + @Override + public ScriptBuilder create(Object... args) { + return new DialogueScriptBuilder(args); + } + + @Override + public Object[] parseArguments(String args) { + Object[] objects = null; + if (args.startsWith("npc:")) { + args = args.replace("npc:", "").replaceAll(" ", ""); + String[] str = args.split(","); + objects = new Object[str.length]; + for (int i = 0; i < str.length; i++) { + objects[i] = Integer.parseInt(str[i]); + } + } else if (args.startsWith("type:")) { + args = args.replace("npc:", ""); + objects = new Object[20]; + int length = 0; + StringBuilder sb = new StringBuilder(); + boolean creating = false; + for (int i = 0; i < args.length(); i++) { + char c = args.charAt(i); + if (c == '"') { + if (creating && sb.length() > 0) { + objects[length++] = sb.toString(); + sb = new StringBuilder(); + } + creating = !creating; + continue; + } + if (creating) { + sb.append(c); + } + } + objects = Arrays.copyOf(objects, length); + } + return objects; + } + + @Override + public void handleLocalMethod(String name, ScriptContext context, ScriptContext current) throws ScriptException { + if (name.startsWith("option")) { + if (!(current instanceof OptionDialInstruction)) { + throw new InvalidInstructionException("Can't set local method option for instruction " + current + "!", -1); + } + OptionDialInstruction ins = (OptionDialInstruction) current; + StringBuilder sb = new StringBuilder(name.substring("option".length())); + int index = Integer.parseInt(ScriptCompiler.formatArgument(sb).toString()); + index -= 1; + if (index < 0 || index >= ins.getOptionHandlers().length) { + throw new IllegalArgumentException("Index out of bounds - " + index + "!"); + } + // System.out.println("Setting index " + index + " (" + name + "), " + // + context); + ins.getOptionHandlers()[index] = context; + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/AddItemInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/AddItemInstruction.java new file mode 100644 index 000000000..5db1e1035 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/AddItemInstruction.java @@ -0,0 +1,63 @@ +package core.game.system.script.context; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.script.ScriptContext; + +/** + * Used for adding an item to the inventory. + * @author 'Vexia + */ +public final class AddItemInstruction extends ScriptContext { + + /** + * The id of the item. + */ + private final int id; + + /** + * The amount to add. + */ + private final int amount; + + /** + * Constructs a new {@code PauseInstruction} {@code Object}. + */ + public AddItemInstruction() { + this(-1, -1); + } + + /** + * Constructs a new {@code AddItemInstruction} {@code Object}. + * @param id the id. + * @param amount the amount. + */ + public AddItemInstruction(int id, int amount) { + super("additem"); + this.id = id; + this.amount = amount; + } + + @Override + public ScriptContext parse(Object... params) { + int id = 0; + int amount = 0; + if (params[0] instanceof Integer) { + id = (Integer) params[0]; + } + if (params[1] instanceof Integer) { + amount = (Integer) params[1]; + } + AddItemInstruction context = new AddItemInstruction(id, amount); + context.parameters = params; + return context; + } + + @Override + public boolean execute(final Object... args) { + final Player player = (Player) args[0]; + player.getInventory().add(new Item(id, amount), player); + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/CheckRandomCondition.java b/Server/src/main/java/Server/core/game/system/script/context/CheckRandomCondition.java new file mode 100644 index 000000000..0a69683a5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/CheckRandomCondition.java @@ -0,0 +1,50 @@ +package core.game.system.script.context; + +import core.game.node.entity.Entity; +import core.game.system.script.ScriptContext; + +/** + * Used to check current random value (set by setrandom(value) instruction). + * @author Emperor + */ +public final class CheckRandomCondition extends ScriptContext { + + /** + * Sets the value. + */ + private final int value; + + /** + * Constructs a new {@code CheckRandomCondition} {@code Object}. + */ + public CheckRandomCondition() { + this(0); + } + + /** + * Constructs a new {@code CheckRandomCondition} {@code Object}. + * @param value The value. + */ + public CheckRandomCondition(int value) { + super("israndom"); + this.value = value; + } + + @Override + public ScriptContext parse(Object... params) { + int value = 0; + if (params[0] instanceof Integer) { + value = (Integer) params[0]; + } + CheckRandomCondition context = new CheckRandomCondition(value); + context.parameters = params; + return context; + } + + @Override + public boolean execute(Object... args) { + System.out.println("CheckRandomCondition:" + (String) ((Entity) args[0]).getAttribute("asc_random") ); + return ((Entity) args[0]).getAttribute("asc_random", 0) == value; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/InvItemCondition.java b/Server/src/main/java/Server/core/game/system/script/context/InvItemCondition.java new file mode 100644 index 000000000..9d4848bd3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/InvItemCondition.java @@ -0,0 +1,58 @@ +package core.game.system.script.context; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.script.ScriptContext; + +import java.util.Arrays; + +/** + * ScriptAPI condition for checking if a player has an item in the inventory. + * @author Emperor + */ +public final class InvItemCondition extends ScriptContext { + + /** + * The items required. + */ + private final Item[] items; + + /** + * Constructs a new {@code InvItemCondition} {@code Object}. + */ + public InvItemCondition() { + this(null); + } + + /** + * Constructs a new {@code InvItemCondition} {@code Object}. + * @param items the items required. + */ + public InvItemCondition(Item[] items) { + super("hasitem"); + this.items = items; + } + + @Override + public boolean execute(Object... args) { + return ((Player) args[0]).getInventory().containsItems(items); + } + + @Override + public ScriptContext parse(Object... params) { + Item[] items = new Item[params.length / 2]; + int index = 0; + for (int i = 0; i < params.length; i++) { + if (params[i] instanceof Integer) { + items[index++] = new Item((Integer) params[i], (Integer) params[i + 1]); + i++; + } + } + if (index != items.length) { + items = Arrays.copyOf(items, index); + } + ScriptContext context = new InvItemCondition(items); + context.setParameters(params); + return context; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/ItemMessageInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/ItemMessageInstruction.java new file mode 100644 index 000000000..1c2c3def5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/ItemMessageInstruction.java @@ -0,0 +1,55 @@ +package core.game.system.script.context; + +import core.game.node.entity.player.Player; +import core.game.system.script.ScriptContext; + +/** + * Handles a send item message to a player. + * @author 'Vexia + */ +public class ItemMessageInstruction extends ScriptContext { + + /** + * The item id. + */ + private final int id; + + /** + * The message to send. + */ + private final String message; + + /** + * Constructs a new {@code PlainMessageInstruction} {@code Object}. + */ + public ItemMessageInstruction() { + this(-1, null); + } + + /** + * Constructs a new {@code PlainMessageInstruction} {@code Object}. + */ + public ItemMessageInstruction(int id, final String message) { + super("itemmessage"); + super.setInstant(false); + this.id = id; + this.message = message; + } + + @Override + public boolean execute(Object... args) { + Player player = (Player) args[0]; + player.getDialogueInterpreter().sendItemMessage(id, message); + player.getDialogueInterpreter().setDialogueStage(this); + return true; + } + + @Override + public ScriptContext parse(Object... params) { + int id = (Integer) params[0]; + String message = (String) params[1]; + ItemMessageInstruction context = new ItemMessageInstruction(id, message); + context.parameters = params; + return context; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/NPCDialInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/NPCDialInstruction.java new file mode 100644 index 000000000..7a3984a52 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/NPCDialInstruction.java @@ -0,0 +1,124 @@ +package core.game.system.script.context; + +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.script.ParamCall; +import core.game.system.script.ScriptCompiler; +import core.game.system.script.ScriptContext; + +import java.util.Arrays; + +/** + * The NPC dialogue instruction. + * @author Emperor + */ +public final class NPCDialInstruction extends ScriptContext { + + /** + * The messages. + */ + private final String[] messages; + + /** + * The facial expression. + */ + private final int expression; + + /** + * If the continue option should be hidden. + */ + private boolean hideContinue; + + /** + * The NPC id to show for this dialogue. + */ + private int forceNPCId; + + /** + * Constructs a new {@code PDialInstruction} {@code Object}. + */ + public NPCDialInstruction() { + this(null, -1); + } + + /** + * Constructs a new {@code PDialInstruction} {@code Object}. + * @param messages The messages. + * @param expression The facial expression animation id. + */ + public NPCDialInstruction(String[] messages, int expression) { + super("npc"); + super.setInstant(false); + this.messages = messages; + this.expression = expression; + } + + @Override + // Arguments should be [player, npc]! + public boolean execute(Object... args) { + Player player = (Player) args[0]; // 1 = NPC + int npcId = -1; + if (args[1] instanceof NPC) { + npcId = ((NPC) args[1]).getId(); + } else { + npcId = (Integer) args[1]; + } + String[] messages = new String[this.messages.length]; + for (int i = 0; i < messages.length; i++) { + String message = this.messages[i]; + if (message.contains(">playername<")) { + message = message.replace(">playername<", player.getUsername()); + } + messages[i] = message; + } + player.getDialogueInterpreter().sendDialogues(forceNPCId == -1 ? npcId : forceNPCId, expression, hideContinue, messages); + player.getDialogueInterpreter().setDialogueStage(this); + return true; + } + + @Override + public ScriptContext parse(Object... params) { + String[] messages = new String[6]; + int messageIndex = 0; + int expression = FacialExpression.HALF_GUILTY.getAnimationId(); + int npcId = -1; + boolean hide = false; + for (int i = 0; i < params.length; i++) { + Object o = params[i]; + if (o instanceof ParamCall) { + String param = ((ParamCall) o).getParameter(); + if (param.startsWith("anim:")) { + String expr = ScriptCompiler.formatArgument(param.substring("anim:".length())).toString(); + FacialExpression exp = null; + for (FacialExpression e : FacialExpression.values()) { + if (e.name().equals(expr)) { + exp = e; + break; + } + } + if (exp != null) { + expression = exp.getAnimationId(); + } else { + expression = Integer.parseInt(expr); + } + } else if (param.startsWith("hidecont:")) { + hide = Boolean.parseBoolean(ScriptCompiler.formatArgument(param.substring("hidecont:".length())).toString()); + } else if (param.startsWith("npc:")) { + npcId = Integer.parseInt(ScriptCompiler.formatArgument(param.substring("npc:".length())).toString()); + } + } else if (o instanceof String) { + messages[messageIndex++] = (String) o; + } + } + if (messageIndex != messages.length) { + messages = Arrays.copyOf(messages, messageIndex); + } + NPCDialInstruction context = new NPCDialInstruction(messages, expression); + context.forceNPCId = npcId; + context.hideContinue = hide; + context.parameters = params; + return context; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/OptionDialInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/OptionDialInstruction.java new file mode 100644 index 000000000..276c6f0f6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/OptionDialInstruction.java @@ -0,0 +1,136 @@ +package core.game.system.script.context; + +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.game.system.script.ParamCall; +import core.game.system.script.ScriptCompiler; +import core.game.system.script.ScriptContext; + +import java.util.Arrays; + +/** + * Sends an option dialogue. + * @author Emperor + */ +public final class OptionDialInstruction extends ScriptContext { + + /** + * The title. + */ + private final String title; + + /** + * The options. + */ + private final String[] options; + + /** + * The option handlers. + */ + private final ScriptContext[] optionHandlers; + + /** + * Constructs a new {@code OptionDialInstruction} {@code Object}. + */ + public OptionDialInstruction() { + this(null); + } + + /** + * Constructs a new {@code OptionDialInstruction} {@code Object}. + * @param title The title. + * @param options The options. + */ + public OptionDialInstruction(String title, String... options) { + super("option"); + super.setInstant(false); + this.title = title; + this.options = options; + this.optionHandlers = new ScriptContext[options.length]; + } + + @Override + public boolean execute(Object... args) { + Player player = (Player) args[0]; + player.getDialogueInterpreter().sendOptions(title, options); + player.getDialogueInterpreter().setDialogueStage(this); + return true; + } + + @Override + public ScriptContext parse(Object... params) { + String[] messages = new String[params.length]; + int messageIndex = 0; + String title = null; + for (int i = 0; i < params.length; i++) { + Object o = params[i]; + if (o instanceof String) { + messages[messageIndex++] = (String) o; + } else if (o instanceof ParamCall) { + String param = ((ParamCall) o).getParameter(); + if (param.startsWith("title:")) { + title = ScriptCompiler.formatArgument(param.substring("title:".length())).toString(); + } else { + messages[messageIndex++] = param; + } + } + } + if (messageIndex != messages.length) { + messages = Arrays.copyOf(messages, messageIndex); + } + OptionDialInstruction context = new OptionDialInstruction(title, messages); + for (int i = 0; i < context.optionHandlers.length; i++) { + if (i < optionHandlers.length) { + context.optionHandlers[i] = optionHandlers[i]; + } + } + context.parameters = params; + return context; + } + + @Override + public ScriptContext create(String args) { + System.out.println("OptionDialInstruction: " + args); + ScriptContext context = super.create(args); + + if (context != null) { + OptionDialInstruction other = (OptionDialInstruction) context; + for (int i = 0; i < other.optionHandlers.length; i++) { + if (i >= optionHandlers.length) { + break; + } + other.optionHandlers[i] = optionHandlers[i]; + } + } + return context; + } + + @Override + public ScriptContext run(Object... args) { + if (args.length < 3) { + return null; + } + int option = (Integer) args[2] - 1; + if (option > optionHandlers.length -1) { + SystemLogger.logErr("Error! Option out of bounds for option handlers."); + return null; + } + ScriptContext context = optionHandlers[option]; + if (context == null) { + SystemLogger.logErr("No option handler found!"); + ((Player) args[0]).getDialogueInterpreter().close(); + return null; + } + context.execute(args); + return context; + } + + /** + * Gets the optionHandlers. + * @return The optionHandlers. + */ + public ScriptContext[] getOptionHandlers() { + return optionHandlers; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/PDialInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/PDialInstruction.java new file mode 100644 index 000000000..71c0185a6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/PDialInstruction.java @@ -0,0 +1,110 @@ +package core.game.system.script.context; + +import core.game.content.dialogue.FacialExpression; +import core.game.node.entity.player.Player; +import core.game.system.script.ParamCall; +import core.game.system.script.ScriptCompiler; +import core.game.system.script.ScriptContext; + +import java.util.Arrays; + +/** + * Player dialogue instruction. + * @author Emperor + */ +public class PDialInstruction extends ScriptContext { + + /** + * The messages. + */ + private final String[] messages; + + /** + * The facial expression. + */ + private final int expression; + + /** + * If the continue option should be hidden. + */ + private boolean hideContinue; + + /** + * Constructs a new {@code PDialInstruction} {@code Object}. + */ + public PDialInstruction() { + this(null, -1); + } + + /** + * Constructs a new {@code PDialInstruction} {@code Object}. + * @param messages The messages. + * @param expression The facial expression animation id. + */ + public PDialInstruction(String[] messages, int expression) { + super("player"); + super.setInstant(false); + this.messages = messages; + this.expression = expression; + } + + @Override + // Arguments should be [player, npc]! + public boolean execute(Object... args) { + Player player = (Player) args[0]; // 1 = NPC + String[] messages = new String[this.messages.length]; + for (int i = 0; i < messages.length; i++) { + String message = this.messages[i]; + if (message.contains(">playername<")) { + message = message.replace(">playername<", player.getUsername()); + } + messages[i] = message; + } + player.getDialogueInterpreter().sendDialogues(player, expression, hideContinue, messages); + player.getDialogueInterpreter().setDialogueStage(this); + return true; + } + + @Override + public ScriptContext parse(Object... params) { + String[] messages = new String[6]; + int messageIndex = 0; + int expression = FacialExpression.HALF_GUILTY.getAnimationId(); + boolean hide = false; + for (int i = 0; i < params.length; i++) { + Object o = params[i]; + if (o instanceof ParamCall) { + String param = ((ParamCall) o).getParameter(); + if (param.startsWith("anim:")) { + String expr = ScriptCompiler.formatArgument(param.substring("anim:".length())).toString(); + FacialExpression exp = null; + for (FacialExpression e : FacialExpression.values()) { + if (e.name().equals(expr)) { + exp = e; + break; + } + } + if (exp != null) { + expression = exp.getAnimationId(); + } else { + expression = Integer.parseInt(expr); + } + } else if (param.startsWith("hidecont:")) { + hide = Boolean.parseBoolean(ScriptCompiler.formatArgument(param.substring("hidecont:".length())).toString()); + } else { + messages[messageIndex++] = param; + } + } else if (o instanceof String) { + messages[messageIndex++] = (String) o; + } + } + if (messageIndex != messages.length) { + messages = Arrays.copyOf(messages, messageIndex); + } + PDialInstruction context = new PDialInstruction(messages, expression); + context.hideContinue = hide; + context.parameters = params; + return context; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/PMessageInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/PMessageInstruction.java new file mode 100644 index 000000000..0638bfbc8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/PMessageInstruction.java @@ -0,0 +1,66 @@ +package core.game.system.script.context; + +import core.game.node.entity.player.Player; +import core.game.system.script.ScriptContext; + +import java.util.Arrays; + +/** + * Handles a send message to player instruction. + * @author Emperor + */ +public class PMessageInstruction extends ScriptContext { + + /** + * The messages to send. + */ + private final String[] messages; + + /** + * Constructs a new {@code PMessageInstruction} {@code Object}. + */ + public PMessageInstruction() { + this(null); + } + + /** + * Constructs a new {@code PMessageInstruction} {@code Object}. + * @param messages The messages. + */ + public PMessageInstruction(String[] messages) { + super("message"); + this.messages = messages; + } + + @Override + public boolean execute(Object... args) { + Player player = (Player) args[0]; + for (String s : messages) { + player.getPacketDispatch().sendMessage(s); + } + return true; + } + + @Override + public String toString() { + return Arrays.toString(messages); + } + + @Override + public ScriptContext parse(Object... params) { + String[] messages = new String[params.length]; + int messageIndex = 0; + for (int i = 0; i < params.length; i++) { + Object o = params[i]; + if (o instanceof String) { + messages[messageIndex++] = (String) o; + } + } + if (messageIndex != messages.length) { + messages = Arrays.copyOf(messages, messageIndex); + } + PMessageInstruction context = new PMessageInstruction(messages); + context.parameters = params; + return context; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/PauseInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/PauseInstruction.java new file mode 100644 index 000000000..d2d2bfa8d --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/PauseInstruction.java @@ -0,0 +1,59 @@ +package core.game.system.script.context; + +import core.game.system.script.ScriptContext; +import core.game.system.script.ScriptManager; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; + +/** + * Used for pausing the script. + * @author Emperor + */ +public final class PauseInstruction extends ScriptContext { + + /** + * The amount of ticks to pause for. + */ + private final int ticks; + + /** + * Constructs a new {@code PauseInstruction} {@code Object}. + */ + public PauseInstruction() { + this(-1); + } + + /** + * Constructs a new {@code PauseInstruction} {@code Object}. + * @param ticks The amount of ticks to pause for. + */ + public PauseInstruction(int ticks) { + super("pause"); + super.setInstant(false); + this.ticks = ticks; + } + + @Override + public ScriptContext parse(Object... params) { + int ticks = -1; + if (params[0] instanceof Integer) { + ticks = (Integer) params[0]; + } + PauseInstruction context = new PauseInstruction(ticks); + context.parameters = params; + return context; + } + + @Override + public boolean execute(final Object... args) { + GameWorld.getPulser().submit(new Pulse(ticks) { + @Override + public boolean pulse() { + ScriptManager.run(PauseInstruction.this, args); + return true; + } + }); + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/PlainMessageInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/PlainMessageInstruction.java new file mode 100644 index 000000000..8f67fb836 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/PlainMessageInstruction.java @@ -0,0 +1,66 @@ +package core.game.system.script.context; + +import core.game.node.entity.player.Player; +import core.game.system.script.ScriptContext; + +import java.util.Arrays; + +/** + * Handles a send dialogue plain message to a player. + * @author Emperor + */ +public class PlainMessageInstruction extends ScriptContext { + + /** + * The messages to send. + */ + private final String[] messages; + + /** + * Constructs a new {@code PlainMessageInstruction} {@code Object}. + */ + public PlainMessageInstruction() { + this(null); + } + + /** + * Constructs a new {@code PlainMessageInstruction} {@code Object}. + * @param messages the messages. + */ + public PlainMessageInstruction(String[] messages) { + super("plainmessage"); + super.setInstant(false); + this.messages = messages; + } + + @Override + public boolean execute(Object... args) { + Player player = (Player) args[0]; + player.getDialogueInterpreter().sendDialogue(messages); + player.getDialogueInterpreter().setDialogueStage(this); + return true; + } + + @Override + public String toString() { + return Arrays.toString(messages); + } + + @Override + public ScriptContext parse(Object... params) { + String[] messages = new String[params.length]; + int messageIndex = 0; + for (int i = 0; i < params.length; i++) { + Object o = params[i]; + if (o instanceof String) { + messages[messageIndex++] = (String) o; + } + } + if (messageIndex != messages.length) { + messages = Arrays.copyOf(messages, messageIndex); + } + PlainMessageInstruction context = new PlainMessageInstruction(messages); + context.parameters = params; + return context; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/RemoveItemInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/RemoveItemInstruction.java new file mode 100644 index 000000000..01c8b9bb3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/RemoveItemInstruction.java @@ -0,0 +1,66 @@ +package core.game.system.script.context; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.script.ScriptContext; + +/** + * Used for removing an item to the inventory. + * @author 'Vexia + */ +public final class RemoveItemInstruction extends ScriptContext { + + /** + * The id of the item. + */ + private final int id; + + /** + * The amount to add. + */ + private final int amount; + + /** + * Constructs a new {@code RemoveItemInstruction} {@code Object}. + */ + public RemoveItemInstruction() { + this(-1, -1); + } + + /** + * Constructs a new {@code AddItemInstruction} {@code Object}. + * @param id the id. + * @param amount the amount. + */ + public RemoveItemInstruction(int id, int amount) { + super("removeitem"); + this.id = id; + this.amount = amount; + } + + @Override + public ScriptContext parse(Object... params) { + int id = 0; + int amount = 0; + if (params[0] instanceof Integer) { + id = (Integer) params[0]; + } + if (params[1] instanceof Integer) { + amount = (Integer) params[1]; + } + RemoveItemInstruction context = new RemoveItemInstruction(id, amount); + context.parameters = params; + return context; + } + + @Override + public boolean execute(final Object... args) { + final Player player = (Player) args[0]; + final Item item = new Item(id, amount); + if (!player.getInventory().containsItem(item)) { + return false; + } + return player.getInventory().remove(item); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/SetAttributeInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/SetAttributeInstruction.java new file mode 100644 index 000000000..0df61c6dd --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/SetAttributeInstruction.java @@ -0,0 +1,63 @@ +package core.game.system.script.context; + +import core.game.node.entity.player.Player; +import core.game.system.script.ScriptContext; + +/** + * Sets an attribute. + * @author Emperor + */ +public final class SetAttributeInstruction extends ScriptContext { + + /** + * The attribute key + */ + private final String key; + + /** + * The object. + */ + private final Object value; + + /** + * Constructs a new {@code PMessageInstruction} {@code Object}. + */ + public SetAttributeInstruction() { + this(null, null); + } + + /** + * Constructs a new {@code SetAttributeInstruction} {@code Object}. + * @param key The attribute key. + * @param value The value. + */ + public SetAttributeInstruction(String key, Object value) { + super("setattribute"); + this.key = key; + this.value = value; + } + + @Override + public boolean execute(Object... args) { + Player player = (Player) args[0]; + player.setAttribute(key, value); + return true; + } + + @Override + public ScriptContext parse(Object... params) { + String key = null; + Object value = null; + for (int i = 0; i < params.length; i++) { + Object o = params[i]; + if (o instanceof String && key == null) { + key = (String) o; + } else { + value = o; + } + } + SetAttributeInstruction context = new SetAttributeInstruction(key, value); + context.parameters = params; + return context; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/SetRandomInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/SetRandomInstruction.java new file mode 100644 index 000000000..da4040a28 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/SetRandomInstruction.java @@ -0,0 +1,51 @@ +package core.game.system.script.context; + +import core.game.node.entity.Entity; +import core.game.system.script.ScriptContext; +import core.tools.RandomFunction; + +/** + * Sets a random value. + * @author Emperor + */ +public final class SetRandomInstruction extends ScriptContext { + + /** + * Sets the value. + */ + private final int value; + + /** + * Constructs a new {@code SetRandomInstruction} {@code Object}. + */ + public SetRandomInstruction() { + this(1); + } + + /** + * Constructs a new {@code SetRandomInstruction} {@code Object}. + * @param value The value. + */ + public SetRandomInstruction(int value) { + super("setrandom"); + this.value = value; + } + + @Override + public ScriptContext parse(Object... params) { + int value = 0; + if (params[0] instanceof Integer) { + value = (Integer) params[0]; + } + SetRandomInstruction context = new SetRandomInstruction(value); + context.parameters = params; + return context; + } + + @Override + public boolean execute(Object... args) { + ((Entity) args[0]).setAttribute("asc_random", RandomFunction.randomize(value)); + return true; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/ShopInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/ShopInstruction.java new file mode 100644 index 000000000..3c2cf54d7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/ShopInstruction.java @@ -0,0 +1,55 @@ +package core.game.system.script.context; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.script.ScriptContext; +import core.game.world.map.RegionManager; + +/** + * Handles the opening of a shop instruction. + * @author 'Vexia + */ +public class ShopInstruction extends ScriptContext { + + /** + * The id to open. + */ + private int id; + + /** + * Constructs a new {@code ShopInstruction} {@code Object}. + */ + public ShopInstruction() { + this(-1); + } + + /** + * Constructs a new {@code ShopInstruction} {@code Object}. + * @param id the id. + */ + public ShopInstruction(int id) { + super("openshop"); + this.setInstant(false); + this.id = id; + } + + @Override + public boolean execute(Object... args) { + Player player = (Player) args[0]; + NPC n = RegionManager.getNpc(player, id); + n.openShop(player); + return true; + } + + @Override + public ScriptContext parse(Object... params) { + int id = -1; + if (params[0] instanceof Integer) { + id = (Integer) params[0]; + } + ShopInstruction context = new ShopInstruction(id); + context.parameters = params; + return context; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/StartActivityInstruction.java b/Server/src/main/java/Server/core/game/system/script/context/StartActivityInstruction.java new file mode 100644 index 000000000..48343e3b2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/StartActivityInstruction.java @@ -0,0 +1,78 @@ +package core.game.system.script.context; + +import core.game.content.activity.ActivityManager; +import core.game.node.entity.player.Player; +import core.game.system.script.ScriptContext; + +import java.util.Arrays; + +/** + * The start activity instruction. + * @author Emperor + */ +public final class StartActivityInstruction extends ScriptContext { + + /** + * The activity to start. + */ + private final String activity; + + /** + * The arguments. + */ + private final Object[] arguments; + + /** + * Constructs a new {@code StartActivityInstruction} {@code Object}. + */ + public StartActivityInstruction() { + this(null); + } + + /** + * Constructs a new {@code StartActivityInstruction} {@code Object}. + * @param activity The name of the activity to start. + * @param arguments The arguments. + */ + public StartActivityInstruction(String activity, Object... arguments) { + super("startactivity"); + this.activity = activity; + this.arguments = arguments; + } + + @Override + public boolean execute(Object... args) { + Player player = (Player) args[0]; + args = new Object[arguments.length + 1]; + args[0] = player; + for (int i = 0; i < arguments.length; i++) { + args[i + 1] = arguments[i]; + } + // System.out.println("Starting activity " + activity + " - " + + // Arrays.toString(args)); + ActivityManager.start(player, activity, false, args); + return true; + } + + @Override + public ScriptContext parse(Object... params) { + String activityName = null; + Object[] args = new Object[params.length - 1]; + int paramIndex = 0; + for (int i = 0; i < params.length; i++) { + Object o = params[i]; + if (o instanceof String && activityName == null) { + activityName = (String) o; + continue; + } + args[paramIndex++] = params[i]; + } + if (paramIndex != args.length) { + args = Arrays.copyOf(args, paramIndex); + } + StartActivityInstruction context = new StartActivityInstruction(activityName, args); + context.parameters = params; + return context; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/context/WGuildTokenCondition.java b/Server/src/main/java/Server/core/game/system/script/context/WGuildTokenCondition.java new file mode 100644 index 000000000..57ddf0532 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/context/WGuildTokenCondition.java @@ -0,0 +1,30 @@ +package core.game.system.script.context; + +import core.game.node.entity.player.Player; +import core.game.system.script.ScriptContext; + +/** + * ScriptAPI condition for checking if a player has warrior guild tokens. + * @author 'Vexia + */ +public final class WGuildTokenCondition extends ScriptContext { + + /** + * Constructs a new {@code WGuildTokenCondition} {@code Object}. + */ + public WGuildTokenCondition() { + super("hasWarriorTokens"); + } + + @Override + public boolean execute(Object... args) { + return ((Player) args[0]).getSavedData().getActivityData().getWarriorGuildTokens() > 0; + } + + @Override + public ScriptContext parse(Object... params) { + ScriptContext context = new WGuildTokenCondition(); + context.setParameters(params); + return context; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/exc/InvalidGOTOException.java b/Server/src/main/java/Server/core/game/system/script/exc/InvalidGOTOException.java new file mode 100644 index 000000000..968779e74 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/exc/InvalidGOTOException.java @@ -0,0 +1,29 @@ +package core.game.system.script.exc; + +/** + * Thrown when a GOTO method name could not be found. + * @author Emperor + */ +public final class InvalidGOTOException extends ScriptException { + + /** + * The serial UID. + */ + private static final long serialVersionUID = 8909510580401378793L; + + /** + * Constructs a new {@code InvalidGOTOException} {@code Object}. + * @param lineId The parsing line id. + */ + public InvalidGOTOException(int lineId) { + super(lineId); + } + + /** + * Constructs a new {@code InvalidGOTOException} {@code Object}. + * @param lineId The parsing line id. + */ + public InvalidGOTOException(String cause, int lineId) { + super(cause, lineId); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/exc/InvalidInstructionException.java b/Server/src/main/java/Server/core/game/system/script/exc/InvalidInstructionException.java new file mode 100644 index 000000000..e813f46de --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/exc/InvalidInstructionException.java @@ -0,0 +1,29 @@ +package core.game.system.script.exc; + +/** + * Thrown when an instruction could not be found. + * @author Emperor + */ +public class InvalidInstructionException extends ScriptException { + + /** + * The serial UID. + */ + private static final long serialVersionUID = -7969980063835245652L; + + /** + * Constructs a new {@code InvalidInstructionException} {@code Object}. + * @param lineId The parsing line id. + */ + public InvalidInstructionException(int lineId) { + super(lineId); + } + + /** + * Constructs a new {@code InvalidInstructionException} {@code Object}. + * @param lineId The parsing line id. + */ + public InvalidInstructionException(String cause, int lineId) { + super(cause, lineId); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/exc/InvalidInterpreterException.java b/Server/src/main/java/Server/core/game/system/script/exc/InvalidInterpreterException.java new file mode 100644 index 000000000..e6b31ab14 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/exc/InvalidInterpreterException.java @@ -0,0 +1,38 @@ +package core.game.system.script.exc; + +/** + * An exception thrown when the interpreter could not be found. + * @author Emperor + */ +public final class InvalidInterpreterException extends ScriptException { + + /** + * The serial UID. + */ + private static final long serialVersionUID = 6096860966849544737L; + + /** + * Constructs a new {@code InvalidInterpreterException} {@code Object}. + */ + public InvalidInterpreterException() { + super(); + } + + /** + * Constructs a new {@code InvalidInterpreterException} {@code Object}. + * @param lineId The line id. + */ + public InvalidInterpreterException(int lineId) { + super(lineId); + } + + /** + * Constructs a new {@code InvalidInterpreterException} {@code Object}. + * @param cause The cause. + * @param lineId The parsing line id. + */ + public InvalidInterpreterException(String cause, int lineId) { + super(cause, lineId); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/script/exc/ScriptException.java b/Server/src/main/java/Server/core/game/system/script/exc/ScriptException.java new file mode 100644 index 000000000..693fb18e6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/exc/ScriptException.java @@ -0,0 +1,55 @@ +package core.game.system.script.exc; + +/** + * An exception thrown when compiling an asc script. + * @author 'Vexia + */ +public class ScriptException extends Exception { + + /** + * The serial version UID. + */ + private static final long serialVersionUID = -1328749105522163758L; + + /** + * The line index. + */ + protected final int lineId; + + /** + * Constructs a new {@code ScriptException} {@code Object}. + */ + public ScriptException() { + this(-1); + } + + /** + * Constructs a new {@code ScriptException} {@code Object}. + * @param lineId The parsing line id. + */ + public ScriptException(int lineId) { + super(); + this.lineId = lineId; + } + + /** + * Constructs a new {@code ScriptException} {@code Object}. + * @param message the message. + * @param lineId The parsing line id. + */ + public ScriptException(final String message, int lineId) { + super("Error parsing line " + lineId + ": " + message); + this.lineId = lineId; + } + + /** + * Constructs a new {@code ScriptException} {@code Object}. + * @param message The error message. + * @param cause The cause. + */ + public ScriptException(String message, Throwable cause) { + super(message, cause); + lineId = -1; + } + +} diff --git a/Server/src/main/java/Server/core/game/system/script/exc/UnknownScriptException.java b/Server/src/main/java/Server/core/game/system/script/exc/UnknownScriptException.java new file mode 100644 index 000000000..a652f3b51 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/script/exc/UnknownScriptException.java @@ -0,0 +1,23 @@ +package core.game.system.script.exc; + +/** + * An exception thrown when the script type is unknown. + * @author Emperor + */ +public class UnknownScriptException extends ScriptException { + + /** + * The serial UID. + */ + private static final long serialVersionUID = -4897522544605020858L; + + /** + * Constructs a new {@code UnknownScriptException} {@code Object}. + * @param message The cause. + * @param lineId The parsing line index. + */ + public UnknownScriptException(String message, int lineId) { + super(message, lineId); + } + +} diff --git a/Server/src/main/java/Server/core/game/system/security/EncryptionManager.java b/Server/src/main/java/Server/core/game/system/security/EncryptionManager.java new file mode 100644 index 000000000..fd8aa59b1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/security/EncryptionManager.java @@ -0,0 +1,513 @@ +package core.game.system.security; + +import core.game.system.SystemManager; + +import java.io.UnsupportedEncodingException; +import java.security.SecureRandom; + +/** + * Represents the class of simple encryption functions. + * @author Unknown + */ +public class EncryptionManager { + + // Define the BCrypt workload to use when generating password hashes. 10-31 + // is a valid value. + private static int workload = 12; + + public static void main(String... args) { + + String pass = "lugi"; + String salt = BCrypt.gensalt(workload); + System.out.println("pw=" + SystemManager.getEncryption().hashPassword(pass, salt)); System.out.println("Salt=" + salt); + + // System.out.println(BCrypt.checkpw("yes", + // "$2a$12$N3jCPMPEZTisbMf7PG9O7ePgTQEJjhNXGHOJ9zvovT8ibY3Uk.Xlm")); + String hash = "$2a$12$N3jCPMPEZTisbMf7PG9O7ePgTQEJjhNXGHOJ9zvovT8ibY3Uk.Xlm"; + salt = hash.substring(0, 29); + System.out.println("salt=" + salt); + String hsh = hash.substring(29, hash.length()); + System.out.println("hash=" + hsh); + } + + /** + * This method can be used to generate a string representing an account + * password suitable for storing in a database. It will be an OpenBSD-style + * crypt(3) formatted hash string of length=60 The bcrypt workload is + * specified in the above static variable, a value from 10 to 31. A workload + * of 12 is a very reasonable safe default as of 2013. This automatically + * handles secure 128-bit salt generation and storage within the hash. + * @param password_plaintext The account's plaintext password as provided + * during account creation, or when changing an account's password. + * @return String - a string of length 60 that is the bcrypt hashed password + * in crypt(3) format. + */ + public String hashPassword(String password_plaintext) { + String salt = BCrypt.gensalt(workload); + String hashed_password = BCrypt.hashpw(password_plaintext, salt); + return (hashed_password); + } + + /** + * Hash pass. + * @param password_plaintext + * @param salt + * @return + */ + public String hashPassword(String password_plaintext, String salt) { + String hashed_password = BCrypt.hashpw(password_plaintext, salt); + return (hashed_password); + } + + /** + * This method can be used to verify a computed hash from a plaintext (e.g. + * during a login request) with that of a stored hash from a database. The + * password hash from the database must be passed as the second variable. + * @param password_plaintext The account's plaintext password, as provided + * during a login request + * @param stored_hash The account's stored password hash, retrieved from the + * authorization database + * @return boolean - true if the password matches the password of the stored + * hash, false otherwise + */ + public boolean checkPassword(String password_plaintext, String stored_hash) { + boolean password_verified = false; + if (null == stored_hash || !stored_hash.startsWith("$2a$")) + throw new java.lang.IllegalArgumentException("Invalid hash provided for comparison"); + password_verified = BCrypt.checkpw(password_plaintext, stored_hash); + return (password_verified); + } + + // Copyright (c) 2006 Damien Miller + // + // Permission to use, copy, modify, and distribute this software for any + // purpose with or without fee is hereby granted, provided that the above + // copyright notice and this permission notice appear in all copies. + // + // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + /** + * BCrypt implements OpenBSD-style Blowfish password hashing using the + * scheme described in "A Future-Adaptable Password Scheme" by Niels Provos + * and David Mazieres.

This password hashing system tries to thwart + * off-line password cracking using a computationally-intensive hashing + * algorithm, based on Bruce Schneier's Blowfish cipher. The work factor of + * the algorithm is parameterised, so it can be increased as computers get + * faster.

Usage is really simple. To hash a password for the first + * time, call the hashpw method with a random salt, like this:

+ * String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
+ *

To check whether a plaintext password matches one that has + * been hashed previously, use the checkpw method:

if + * (BCrypt.checkpw(candidate_password, stored_hash))
+ *     System.out.println("It matches");
else
    System.out.println("It does not match");
+ *

The gensalt() method takes an optional parameter (log_rounds) + * that determines the computational complexity of the hashing:

+ * String strong_salt = BCrypt.gensalt(10)
String stronger_salt = + * BCrypt.gensalt(12)

The amount of work increases + * exponentially (2**log_rounds), so each increment is twice as much work. + * The default log_rounds is 10, and the valid range is 4 to 31. + * @author Damien Miller + * @version 0.2 + */ + public static class BCrypt { + // BCrypt parameters + private static final int GENSALT_DEFAULT_LOG2_ROUNDS = 10; + private static final int BCRYPT_SALT_LEN = 16; + + // Blowfish parameters + private static final int BLOWFISH_NUM_ROUNDS = 16; + + // Initial contents of key schedule + private static final int P_orig[] = { 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b }; + private static final int S_orig[] = { 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, + 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 }; + + // bcrypt IV: "OrpheanBeholderScryDoubt" + static private final int bf_crypt_ciphertext[] = { 0x4f727068, 0x65616e42, 0x65686f6c, 0x64657253, 0x63727944, 0x6f756274 }; + + // Table for Base64 encoding + static private final char base64_code[] = { '.', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; + + // Table for Base64 decoding + static private final byte index_64[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1 }; + + // Expanded Blowfish key + private int P[]; + private int S[]; + + /** + * Encode a byte array using bcrypt's slightly-modified base64 encoding + * scheme. Note that this is *not* compatible with the standard + * MIME-base64 encoding. + * @param d the byte array to encode + * @param len the number of bytes to encode + * @return base64-encoded string + * @exception IllegalArgumentException if the length is invalid + */ + private static String encode_base64(byte d[], int len) throws IllegalArgumentException { + int off = 0; + StringBuffer rs = new StringBuffer(); + int c1, c2; + + if (len <= 0 || len > d.length) + throw new IllegalArgumentException("Invalid len"); + + while (off < len) { + c1 = d[off++] & 0xff; + rs.append(base64_code[(c1 >> 2) & 0x3f]); + c1 = (c1 & 0x03) << 4; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 4) & 0x0f; + rs.append(base64_code[c1 & 0x3f]); + c1 = (c2 & 0x0f) << 2; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 6) & 0x03; + rs.append(base64_code[c1 & 0x3f]); + rs.append(base64_code[c2 & 0x3f]); + } + return rs.toString(); + } + + /** + * Look up the 3 bits base64-encoded by the specified character, + * range-checking againt conversion table + * @param x the base64-encoded value + * @return the decoded value of x + */ + private static byte char64(char x) { + if ((int) x < 0 || (int) x > index_64.length) + return -1; + return index_64[(int) x]; + } + + /** + * Decode a string encoded using bcrypt's base64 scheme to a byte array. + * Note that this is *not* compatible with the standard MIME-base64 + * encoding. + * @param s the string to decode + * @param maxolen the maximum number of bytes to decode + * @return an array containing the decoded bytes + * @throws IllegalArgumentException if maxolen is invalid + */ + private static byte[] decode_base64(String s, int maxolen) throws IllegalArgumentException { + StringBuffer rs = new StringBuffer(); + int off = 0, slen = s.length(), olen = 0; + byte ret[]; + byte c1, c2, c3, c4, o; + + if (maxolen <= 0) + throw new IllegalArgumentException("Invalid maxolen"); + + while (off < slen - 1 && olen < maxolen) { + c1 = char64(s.charAt(off++)); + c2 = char64(s.charAt(off++)); + if (c1 == -1 || c2 == -1) + break; + o = (byte) (c1 << 2); + o |= (c2 & 0x30) >> 4; + rs.append((char) o); + if (++olen >= maxolen || off >= slen) + break; + c3 = char64(s.charAt(off++)); + if (c3 == -1) + break; + o = (byte) ((c2 & 0x0f) << 4); + o |= (c3 & 0x3c) >> 2; + rs.append((char) o); + if (++olen >= maxolen || off >= slen) + break; + c4 = char64(s.charAt(off++)); + o = (byte) ((c3 & 0x03) << 6); + o |= c4; + rs.append((char) o); + ++olen; + } + + ret = new byte[olen]; + for (off = 0; off < olen; off++) + ret[off] = (byte) rs.charAt(off); + return ret; + } + + /** + * Blowfish encipher a single 64-bit block encoded as two 32-bit halves + * @param lr an array containing the two 32-bit half blocks + * @param off the position in the array of the blocks + */ + private final void encipher(int lr[], int off) { + int i, n, l = lr[off], r = lr[off + 1]; + + l ^= P[0]; + for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) { + // Feistel substitution on left word + n = S[(l >> 24) & 0xff]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[++i]; + + // Feistel substitution on right word + n = S[(r >> 24) & 0xff]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[++i]; + } + lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; + lr[off + 1] = l; + } + + /** + * Cycically extract a word of key material + * @param data the string to extract the data from + * @param offp a "pointer" (as a one-entry array) to the current offset + * into data + * @return the next word of material from data + */ + private static int streamtoword(byte data[], int offp[]) { + int i; + int word = 0; + int off = offp[0]; + + for (i = 0; i < 4; i++) { + word = (word << 8) | (data[off] & 0xff); + off = (off + 1) % data.length; + } + + offp[0] = off; + return word; + } + + /** + * Initialise the Blowfish key schedule + */ + private void init_key() { + P = (int[]) P_orig.clone(); + S = (int[]) S_orig.clone(); + } + + /** + * Key the Blowfish cipher + * @param key an array containing the key + */ + private void key(byte key[]) { + int i; + int koffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) + P[i] = P[i] ^ streamtoword(key, koffp); + + for (i = 0; i < plen; i += 2) { + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + /** + * Perform the "enhanced key schedule" step described by Provos and + * Mazieres in "A Future-Adaptable Password Scheme" + * http://www.openbsd.org/papers/bcrypt-paper.ps + * @param data salt information + * @param key password information + */ + private void ekskey(byte data[], byte key[]) { + int i; + int koffp[] = { 0 }, doffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) + P[i] = P[i] ^ streamtoword(key, koffp); + + for (i = 0; i < plen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + /** + * Perform the central password hashing step in the bcrypt scheme + * @param password the password to hash + * @param salt the binary salt to hash with the password + * @param log_rounds the binary logarithm of the number of rounds of + * hashing to apply + * @return an array containing the binary hashed password + */ + private byte[] crypt_raw(byte password[], byte salt[], int log_rounds) { + int rounds, i, j; + int cdata[] = (int[]) bf_crypt_ciphertext.clone(); + int clen = cdata.length; + byte ret[]; + + if (log_rounds < 4 || log_rounds > 31) + throw new IllegalArgumentException("Bad number of rounds"); + rounds = 1 << log_rounds; + if (salt.length != BCRYPT_SALT_LEN) + throw new IllegalArgumentException("Bad salt length"); + + init_key(); + ekskey(salt, password); + for (i = 0; i < rounds; i++) { + key(password); + key(salt); + } + + for (i = 0; i < 64; i++) { + for (j = 0; j < (clen >> 1); j++) + encipher(cdata, j << 1); + } + + ret = new byte[clen * 4]; + for (i = 0, j = 0; i < clen; i++) { + ret[j++] = (byte) ((cdata[i] >> 24) & 0xff); + ret[j++] = (byte) ((cdata[i] >> 16) & 0xff); + ret[j++] = (byte) ((cdata[i] >> 8) & 0xff); + ret[j++] = (byte) (cdata[i] & 0xff); + } + return ret; + } + + /** + * Hash a password using the OpenBSD bcrypt scheme + * @param password the password to hash + * @param salt the salt to hash with (perhaps generated using + * BCrypt.gensalt) + * @return the hashed password + */ + public static String hashpw(String password, String salt) { + BCrypt B; + String real_salt; + byte passwordb[], saltb[], hashed[]; + char minor = (char) 0; + int rounds, off = 0; + StringBuffer rs = new StringBuffer(); + + if (salt.charAt(0) != '$' || salt.charAt(1) != '2') + throw new IllegalArgumentException("Invalid salt version"); + if (salt.charAt(2) == '$') + off = 3; + else { + minor = salt.charAt(2); + if (minor != 'a' || salt.charAt(3) != '$') + throw new IllegalArgumentException("Invalid salt revision"); + off = 4; + } + + // Extract number of rounds + if (salt.charAt(off + 2) > '$') + throw new IllegalArgumentException("Missing salt rounds"); + rounds = Integer.parseInt(salt.substring(off, off + 2)); + + real_salt = salt.substring(off + 3, off + 25); + try { + passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF-8"); + } catch (UnsupportedEncodingException uee) { + throw new AssertionError("UTF-8 is not supported"); + } + + saltb = decode_base64(real_salt, BCRYPT_SALT_LEN); + + B = new BCrypt(); + hashed = B.crypt_raw(passwordb, saltb, rounds); + + rs.append("$2"); + if (minor >= 'a') + rs.append(minor); + rs.append("$"); + if (rounds < 10) + rs.append("0"); + rs.append(Integer.toString(rounds)); + rs.append("$"); + rs.append(encode_base64(saltb, saltb.length)); + rs.append(encode_base64(hashed, bf_crypt_ciphertext.length * 4 - 1)); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of hashing to apply + * - the work factor therefore increases as 2**log_rounds. + * @param random an instance of SecureRandom to use + * @return an encoded salt value + */ + public static String gensalt(int log_rounds, SecureRandom random) { + StringBuffer rs = new StringBuffer(); + byte rnd[] = new byte[BCRYPT_SALT_LEN]; + + random.nextBytes(rnd); + + rs.append("$2a$"); + if (log_rounds < 10) + rs.append("0"); + rs.append(Integer.toString(log_rounds)); + rs.append("$"); + rs.append(encode_base64(rnd, rnd.length)); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of hashing to apply + * - the work factor therefore increases as 2**log_rounds. + * @return an encoded salt value + */ + public static String gensalt(int log_rounds) { + return gensalt(log_rounds, new SecureRandom()); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method, selecting a + * reasonable default for the number of hashing rounds to apply + * @return an encoded salt value + */ + public static String gensalt() { + return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS); + } + + /** + * Check that a plaintext password matches a previously hashed one + * @param plaintext the plaintext password to verify + * @param hashed the previously-hashed password + * @return true if the passwords match, false otherwise + */ + public static boolean checkpw(String plaintext, String hashed) { + return (hashed.compareTo(hashpw(plaintext, hashed)) == 0); + } + } + +} diff --git a/Server/src/main/java/Server/core/game/system/task/ItemLogoutTask.java b/Server/src/main/java/Server/core/game/system/task/ItemLogoutTask.java new file mode 100644 index 000000000..27c29b91d --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/task/ItemLogoutTask.java @@ -0,0 +1,34 @@ +package core.game.system.task; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; + +/** + * Logout task used for adding items when the player logs out. + * @author Emperor + */ +public final class ItemLogoutTask extends LogoutTask { + + /** + * The items. + */ + private final Item[] items; + + /** + * Constructs a new {@code ItemLogoutTask} {@code Object}. + * @param ticks The amount of ticks. + * @param items The items to add on logout. + */ + public ItemLogoutTask(int ticks, Item... items) { + super(ticks); + this.items = items; + } + + @Override + public void run(Player player) { + for (Item item : items) { + player.getInventory().add(item); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/task/LocationLogoutTask.java b/Server/src/main/java/Server/core/game/system/task/LocationLogoutTask.java new file mode 100644 index 000000000..ed9a6198c --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/task/LocationLogoutTask.java @@ -0,0 +1,33 @@ +package core.game.system.task; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; + +/** + * Sets the player's location on logout. + * @author Emperor + */ +public final class LocationLogoutTask extends LogoutTask { + + /** + * The location to set. + */ + private final Location location; + + /** + * Constructs a new {@code LocationLogoutTask} {@code Object}. + * @param ticks The amount of ticks this task is valid for. + * @param location The location to set. + */ + public LocationLogoutTask(int ticks, Location location) { + super(ticks); + this.location = location; + } + + @SuppressWarnings("deprecation") + @Override + public void run(Player player) { + player.setLocation(location); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/task/LogoutTask.java b/Server/src/main/java/Server/core/game/system/task/LogoutTask.java new file mode 100644 index 000000000..a8584282b --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/task/LogoutTask.java @@ -0,0 +1,63 @@ +package core.game.system.task; + +import core.game.node.entity.player.Player; +import core.game.world.GameWorld; + +/** + * A task called upon when a player disconnects from the game. + * @author Emperor + */ +public abstract class LogoutTask { + + /** + * The amount of ticks this logout task is valid for. + */ + private int validity; + + /** + * Constructs a new {@code LogoutTask} {@code Object}. + */ + public LogoutTask() { + this(Integer.MAX_VALUE - GameWorld.getTicks()); + } + + /** + * Constructs a new {@code LogoutTask} {@code Object}. + * @param ticks The amount of ticks this logout task is valid. + */ + public LogoutTask(int ticks) { + this.validity = GameWorld.getTicks() + ticks; + } + + /** + * Runs the task. + * @param player The player. + */ + public abstract void run(Player player); + + /** + * Fires the logout task, if it is still valid. + * @param player The player logging out. + */ + public void fire(Player player) { + if (isValid()) { + run(player); + } + } + + /** + * Checks if the logout task is valid. + * @return {@code True} if so. + */ + public boolean isValid() { + return validity > GameWorld.getTicks(); + } + + /** + * Sets the new validity delay. + * @param ticks The amount of ticks this task should remain valid for. + */ + public void setDelay(int ticks) { + this.validity = GameWorld.getTicks() + ticks; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/task/MovementHook.java b/Server/src/main/java/Server/core/game/system/task/MovementHook.java new file mode 100644 index 000000000..fd7fdf4b6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/task/MovementHook.java @@ -0,0 +1,21 @@ +package core.game.system.task; + +import core.game.node.entity.Entity; +import core.game.world.map.Location; + +/** + * An interface used for hooking to the + *.world.map.MovementUpdate} class. + * @author Emperor + */ +public interface MovementHook { + + /** + * Called when an entity has moved. + * @param e The moving entity. + * @param l The location. + * @return {@code True} if no further hooks should be called. + */ + boolean handle(Entity e, Location l); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/task/NodeTask.java b/Server/src/main/java/Server/core/game/system/task/NodeTask.java new file mode 100644 index 000000000..113d2f2a9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/task/NodeTask.java @@ -0,0 +1,125 @@ +package core.game.system.task; + +import core.game.node.Node; +import core.game.world.GameWorld; + +/** + * Represents "Node pulse", which is used to execute methods with node + * parameters. + * @author Emperor + */ +public abstract class NodeTask { + + /** + * The amount of ticks for the pulse (if any). + */ + private final int ticks; + + /** + * The pulse + */ + private Pulse pulse; + + /** + * Constructs a new {@code NodeTask} {@code Object}. + */ + public NodeTask() { + this(-1); + } + + /** + * Constructs a new {@code NodeTask} {@Code Object} + * @param ticks The ticks. + */ + public NodeTask(int ticks) { + this.ticks = ticks; + } + + /** + * Called when the pulse starts. + * @param node The base node. + * @param n The other nodes. + */ + public void start(Node node, Node... n) { + + } + + /** + * Runs the task. + * @param node The base node. + * @param n The other nodes. + * @return {@code True} if the pulse (if this is used in a pulse) should + * stop. + */ + public abstract boolean exec(Node node, Node... n); + + /** + * Called when the pulse is stopped. + * @param node The base node. + * @param n The other nodes. + */ + public void stop(Node node, Node... n) { + + } + + /** + * Checks if the node task pulse should be removed for a duplicate. + * @param s The command string. + * @param node The base node. + * @param n The other nodes. + */ + public boolean removeFor(String s, Node node, Node... n) { + return true; + } + + /** + * Schedules the node task. + * @param node The base node. + * @param n The other nodes. + * @return The pulse used for this task. + */ + public Pulse schedule(final Node node, final Node... n) { + GameWorld.getPulser().submit(pulse = new Pulse(ticks, node) { + + @Override + public void start() { + super.start(); + NodeTask.this.start(node, n); + } + + @Override + public boolean pulse() { + return exec(node, n); + } + + @Override + public void stop() { + super.stop(); + NodeTask.this.stop(node, n); + } + + @Override + public boolean removeFor(String s) { + return NodeTask.this.removeFor(s, node, n); + } + }); + return pulse; + } + + /** + * Gets the Pulse for this Task + * @return the Pulse + */ + public Pulse getPulse() { + return pulse; + } + + /** + * Gets the ticks. + * @return the ticks. + */ + public int getTicks() { + return ticks; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/task/Pulse.java b/Server/src/main/java/Server/core/game/system/task/Pulse.java new file mode 100644 index 000000000..827bca3aa --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/task/Pulse.java @@ -0,0 +1,205 @@ +package core.game.system.task; + +import core.game.node.Node; + +/** + * Represents a pulse object (a task executed once every 600ms on the + * MajorUpdateWorker thread). + * @author Emperor + */ +public abstract class Pulse implements Runnable { + + /** + * If the task is still running. + */ + private boolean running = true; + + /** + * The amount of game-ticks to wait before execution. + */ + private int delay; + + /** + * The amount of ticks passed. + */ + int ticksPassed; + + /** + * The nodes that have to be active for the pulse to continue. + */ + protected Node[] checks; + + /** + * Constructs a new {@code Pulse} {@code Object}. + */ + public Pulse() { + this(1); + } + + /** + * Constructs a new {@code Pulse} object. + * @param delay The delay. + */ + public Pulse(int delay) { + this.delay = delay; + } + + /** + * Constructs a new {@code Pulse} object. + * @param delay The delay. + * @param checks The nodes that have to be active for the pulse to continue. + */ + public Pulse(int delay, Node... checks) { + this.delay = delay; + this.checks = checks; + } + + @Override + public void run() { + if(update()){ + //GameWorld.TASKS.remove(this); + } + } + + /**s + * Called when the world pulses, once every 600ms. + * @return {@code True} if this {@code Pulse} is finished and can be removed, + * {@code false} if not. + */ + public boolean update() { + if (hasInactiveNode()) { + stop(); + return true; + } + if (!isRunning()) { + return true; + } + if (++ticksPassed >= delay) { + ticksPassed = 0; + try { + if (pulse()) { + stop(); + return true; + } + } catch (Exception e){ + e.printStackTrace(); + stop(); + return true; + } + return !isRunning(); + } + return false; + } + + /** + * Checks if one of the node checks is inactive. + * @return {@code True} if so. + */ + public boolean hasInactiveNode() { + if (checks != null) { + int size = checks.length; + for (int i = 0; i < size; i++) { + Node n = checks[i]; + if (n != null && !n.isActive()) { + return true; + } + } + } + return false; + } + + /** + * Called after the delay has passed. + * @return {@code True} if the pulse has finished and should be removed. + */ + public abstract boolean pulse(); + + /** + * Checks if this pulse should be terminated so the new pulse (represented + * in string format) can run. + * @param pulse The pulse to run in string format. + * @return {@code True} if this pulse should be removed (default). + */ + public boolean removeFor(String pulse) { + return true; + } + + /** + * Adds a node check. + * @param index The index. + * @param n The node. + */ + public void addNodeCheck(int index, Node n) { + checks[index] = n; + } + + /** + * Gets a node check. + * @param index The index. + * @return The node. + */ + public Node getNodeCheck(int index) { + return checks[index]; + } + + /** + * Manually stop the {@code Pulse} task. + */ + public void stop() { + running = false; + } + + /** + * Manually start the {@code Pulse} task. + */ + public void start() { + running = true; + } + + /** + * Restarts the pulse delay. + */ + public void restart() { + ticksPassed = 0; + } + + /** + * Checks if the pulse is still running. + * @return {@code True} if the pulse is still running. + */ + public boolean isRunning() { + return running; + } + + /** + * Gets the delay of this {@code Pulse}. + * @return The delay. + */ + public int getDelay() { + return delay; + } + + /** + * Sets the delay. + * @param delay The delay. + */ + public void setDelay(int delay) { + this.delay = delay; + } + + /** + * Sets the amount of ticks passed. + * @param ticks The amount of ticks passed in this pulse. + */ + public void setTicksPassed(int ticks) { + this.ticksPassed = ticks; + } + + /** + * Gets the amount of ticks passed. + * @return The amount of ticks passed so far. + */ + public int getTicksPassed() { + return ticksPassed; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/system/task/TaskExecutor.java b/Server/src/main/java/Server/core/game/system/task/TaskExecutor.java new file mode 100644 index 000000000..ed9b7d73f --- /dev/null +++ b/Server/src/main/java/Server/core/game/system/task/TaskExecutor.java @@ -0,0 +1,54 @@ +package core.game.system.task; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +/** + * A class holding methods to execute tasks. + * @author Emperor + */ +public final class TaskExecutor { + + /** + * The executor to use. + */ + private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor(); + + /** + * The SQL task executor. + */ + private static final ScheduledExecutorService SQL_EXECUTOR = Executors.newSingleThreadScheduledExecutor(); + + /** + * Constructs a new {@code TaskExecutor} {@code Object}. + */ + private TaskExecutor() { + /* + * empty. + */ + } + + /** + * Executes an SQL handling task. + * @param task The task. + */ + public static void executeSQL(Runnable task) { + SQL_EXECUTOR.execute(task); + } + + /** + * Executes the task. + * @param task The task to execute. + */ + public static void execute(Runnable task) { + EXECUTOR.execute(task); + } + + /** + * Gets the executor. + * @return The executor. + */ + public static ScheduledExecutorService getExecutor() { + return EXECUTOR; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/DeadlockDetector.kt b/Server/src/main/java/Server/core/game/world/DeadlockDetector.kt new file mode 100644 index 000000000..5eaf92e85 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/DeadlockDetector.kt @@ -0,0 +1,37 @@ +package core.game.world + +import core.game.system.SystemLogger +import java.lang.management.ManagementFactory +import java.lang.management.ThreadMXBean + +class DeadlockDetector : Runnable { + override fun run() { + val mbean = ManagementFactory.getThreadMXBean(); + val deadLockedThreads = mbean.findDeadlockedThreads() + + + + + fun `(┛◉Д◉)┛彡┻━┻`() { + val infos = mbean.getThreadInfo(deadLockedThreads) + infos.forEach { threadInfo -> + if (threadInfo != null) { + for (thread in Thread.getAllStackTraces().keys) { + if (thread.id == threadInfo.threadId) { + SystemLogger.logErr(threadInfo.toString().trim()) + for (ste in thread.stackTrace) { + SystemLogger.logErr("\t" + ste.toString().trim { it <= ' ' }) + } + } + } + } + } + } + + + if(deadLockedThreads != null){ + `(┛◉Д◉)┛彡┻━┻`() + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/GameSettings.kt b/Server/src/main/java/Server/core/game/world/GameSettings.kt new file mode 100644 index 000000000..9bcc1969f --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/GameSettings.kt @@ -0,0 +1,179 @@ +package core.game.world + +import core.ServerConstants +import org.json.simple.JSONObject +import java.io.FileInputStream +import java.io.IOException +import java.util.* +/** + * Represents the game settings used for this game instance. + * @author Vexia + */ +class GameSettings +/** + * Constructs a new `GameSettings` `Object`. + * @param name the name. + * @param beta the beta. + * @param type the game type. + * @param gui if gui is enabled. + * @param worldId the world id. + * @param countryIndex The country index. + * @param members If the world is members only. + * @param msAddress The address of the Management server. + */ internal constructor( + /** + * The name of the namme. + */ + var name: String, + /** + * If the game is in beta mode. + */ + var isBeta: Boolean, + /** + * If the game is in developer mode. + */ + var isDevMode: Boolean, + /** + * If the gui is enabled. + */ + var isGui: Boolean, + /** + * The world id of the server. + */ + var worldId: Int, + /** + * The country index. + */ + var countryIndex: Int, + /** + * The activity. + */ + var activity: String, + /** + * If the world is members only. + */ + var isMembers: Boolean, + /** + * If the world is a pvp world. + */ + var isPvp: Boolean, + /** + * If only quick chat can be used on the world. + */ + var isQuickChat: Boolean, + /** + * If lootshare option is enabled on this world. + */ + var isLootshare: Boolean, + /** + * The address of the Management server. + */ + var msAddress: String, + var default_xp_rate: Double, + var allow_slayer_reroll: Boolean, + var enable_default_clan: Boolean, + var enable_bots: Boolean, + var autostock_ge: Boolean, + var allow_token_purchase: Boolean, + var skillcape_perks: Boolean, + var increased_door_time: Boolean, + var enabled_botting : Boolean, + + /**"Lobby" interface + * The message of the week models to display + * 15 & 22 = keys & lock || 16 = fly swat || 17 = person with question marks || 18 & 447 = wise old man + * 19 = man & woman with mouth closed || 20 = man & lock & key || 21 = closed chests + * 23 = snowmen || 405 = Construction houses || 622 = Two sets of 3 people range, mage, melee + * 623 = Woodcutting || 679 = Summoning || 715 = Easter || 800 = Halloween + * Any value that isn't one listed above = random selection + */ + var message_model: Int, + + /**"Lobby" interface + * The message of the week text + * The "child" for writing text to these interfaces is located inside of LoginConfiguration.java + * method: getMessageChild + */ + var message_string: String + ) { + val isHosted: Boolean + get() = !isDevMode + + override fun toString(): String { + return "GameSettings [name=$name, debug=$isBeta, devMode=$isDevMode, gui=$isGui, worldId=$worldId]" + } + + companion object { + /** + * Parses a JSONObject and creates a new GameSettings object from it. + * @param data the JSONObject to parse. + * @return the settings object. + * @author Ceikry + */ + fun parse(data: JSONObject): GameSettings? { + val name = ServerConstants.SERVER_NAME + val debug = data["debug"] as Boolean + val dev = data["dev"] as Boolean + val startGui = data["startGui"] as Boolean + val worldId = data["worldID"].toString().toInt() + val countryId = data["countryID"].toString().toInt() + val activity = data["activity"].toString() + val pvpWorld = data["pvpWorld"] as Boolean + val msip = data["msip"].toString() + val default_xp_rate = data["default_xp_rate"].toString().toDouble() + val allow_slayer_reroll = data["allow_slayer_reroll"] as Boolean + val enable_default_clan = data["enable_default_clan"] as Boolean + val enable_bots = data["enable_bots"] as Boolean + val autostock_ge = data["autostock_ge"] as Boolean + val skillcape_perks = if(data.containsKey("skillcape_perks")) data["skillcape_perks"] as Boolean else false + val increased_door_time = if(data.containsKey("increased_door_time")) data["increased_door_time"] as Boolean else false + val enable_botting = if(data.containsKey("botting_enabled")) data["botting_enabled"] as Boolean else false + val allow_token_purchase = data["allow_token_purchase"] as Boolean + val message_of_the_week_identifier = data["message_of_the_week_identifier"].toString().toInt() + val message_of_the_week_text = data["message_of_the_week_text"].toString() + return GameSettings( + name, + debug, + dev, + startGui, + worldId, + countryId, + activity, + true, + pvpWorld, + false, + false, + msip, + default_xp_rate, + allow_slayer_reroll, + enable_default_clan, + enable_bots, + autostock_ge, + allow_token_purchase, + skillcape_perks, + increased_door_time, + enable_botting, + message_of_the_week_identifier, + message_of_the_week_text + ) + } + + /** + * Gets the properties. + * @param path the path. + * @return the properties. + */ + private fun getProperties(path: String): Properties { + val file: FileInputStream + val properties = Properties() + try { + file = FileInputStream(path) + properties.load(file) + } catch (e: IOException) { + println("Warning: Could not find file in " + System.getProperty("user.dir") + path) + e.printStackTrace() + } + return properties + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/GameType.java b/Server/src/main/java/Server/core/game/world/GameType.java new file mode 100644 index 000000000..6cf13425e --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/GameType.java @@ -0,0 +1,34 @@ +package core.game.world; + + +/** + * Represents the game type. + * @author Vexia + * + */ +public enum GameType { + ECONOMY, + SPAWN; + + /** + * Parses the game type. + * @param string the string. + * @return {@code GameType} the type. + */ + public static GameType parse(String string) { + return Boolean.parseBoolean(string) ? ECONOMY : SPAWN; + } + + /** + * Gets a game type for the name. + * @param property the property. + * @return the type. + */ + public static GameType forName(String property) { + if (property == null) { + return null; + } + return property.equals("economy") ? ECONOMY : property.equals("spawn") ? SPAWN : null; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/GameWorld.kt b/Server/src/main/java/Server/core/game/world/GameWorld.kt new file mode 100644 index 000000000..070068ddc --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/GameWorld.kt @@ -0,0 +1,189 @@ +package core.game.world + +import core.ServerConstants +import core.cache.Cache +import core.cache.ServerStore +import core.cache.def.impl.ObjectDefinition +import core.game.node.entity.npc.drop.RareDropTable +import core.game.node.entity.player.Player +import core.game.system.SystemManager +import core.game.system.SystemState +import core.game.system.config.ConfigParser +import core.game.system.script.ScriptManager +import core.game.system.task.Pulse +import core.game.system.task.TaskExecutor +import core.game.world.callback.CallbackHub +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.repository.Repository +import core.plugin.PluginManager +import core.tools.RandomFunction +import core.tools.mysql.DatabaseManager +import core.worker.MajorUpdateWorker +import core.plugin.CorePluginTypes.StartupPlugin +import plugin.ai.general.scriptrepository.PlayerScripts +import core.game.ge.GrandExchangeDatabase +import core.game.node.entity.state.newsys.StateRepository +import core.game.system.SystemLogger +import core.game.system.SystemLogger.logInfo +import java.util.* +import java.util.function.Consumer + +/** + * Represents the game world. + * @author Ceikry + */ +object GameWorld { + + /** + * The major update worker. + */ + @JvmStatic + val majorUpdateWorker = MajorUpdateWorker() + + @JvmStatic + val STARTUP_PLUGINS: List = ArrayList() + private val configParser = ConfigParser() + @JvmStatic + var PCBotsSpawned = false + @JvmStatic + var PCnBotsSpawned = false + @JvmStatic + var PCiBotsSpawned = false + /** + * The game settings to use. + */ + @JvmStatic + var settings: GameSettings? = null + /** + * The current amount of (600ms) cycles elapsed. + */ + @JvmStatic + var ticks = 0 + @JvmStatic + var databaseManager: DatabaseManager? = null + private set + + @JvmStatic + var Pulser = PulseRunner() + + /** + * Submits a pulse. + * + * @param pulse the pulse. + */ + @Deprecated("", ReplaceWith("Pulser.submit(pulse!!)", "core.game.world.GameWorld.Pulser")) + fun submit(pulse: Pulse?) { + Pulser.submit(pulse!!) + } + + fun pulse() { + ticks++ + if (ticks % 50 == 0) { + TaskExecutor.execute { + val player = Repository.players + try { + player.stream().filter { obj: Player? -> Objects.nonNull(obj) }.filter { p: Player -> !p.isArtificial && p.isPlaying }.forEach { p: Player? -> Repository.disconnectionQueue.save(p!!, false) } + } catch (t: Throwable) { + t.printStackTrace() + } + } + } + } + + private fun checkDay(): Boolean { + val calendar = Calendar.getInstance(TimeZone.getTimeZone("America/Toronto")) + val day = calendar[Calendar.DAY_OF_WEEK] + val hour = calendar[Calendar.HOUR_OF_DAY] + return day == Calendar.SATURDAY && hour == 1 || day == Calendar.SUNDAY && hour == 1 || day == Calendar.TUESDAY && hour == 10 + } + + /** + * Prompts the [GameWorld] to begin it's initialization. + * + * @param directory the directory to the properties. + * @throws Throwable when the exception occurs. + */ + @Throws(Throwable::class) + fun prompt(directory: String?) { + prompt(true, directory) + } + + /** + * Prompts the game world. + * + * @param running if running. + * @throws Throwable the throwable. + */ + @Throws(Throwable::class) + @JvmStatic + fun prompt(running: Boolean) { + prompt(running, "server.properties") + } + + /** + * Prompts the [GameWorld] to begin its initialization. + * + * @param run If the server should be running. + * @param directory the path to the dir. + * @throws Throwable When an exception occurs. + */ + @Throws(Throwable::class) + fun prompt(run: Boolean, directory: String?){ + SystemLogger.logInfo("Prompting ${settings?.name} Game World...") + Cache.init(ServerConstants.CACHE_PATH) + ServerStore.init(ServerConstants.STORE_PATH) + databaseManager = DatabaseManager(ServerConstants.DATABASE) + databaseManager!!.connect() + GrandExchangeDatabase.init() + configParser.prePlugin() + PluginManager.init() + configParser.postPlugin() + RareDropTable.init() + logInfo("Initialized Rare Drop Table from " + ServerConstants.RDT_DATA_PATH) + if (settings!!.enable_bots) { + ImmerseWorld.init() + } + CallbackHub.call() + STARTUP_PLUGINS.forEach(Consumer { plugin: StartupPlugin? -> + plugin?.run() + }) + if (run) { + SystemManager.flag(if (settings?.isDevMode == true) SystemState.PRIVATE else SystemState.ACTIVE) + } + ObjectDefinition.getDefinitions().values.forEach(Consumer { obj: ObjectDefinition -> obj.examine }) + System.gc() + PlayerScripts.init() + StateRepository.init() + SystemLogger.initTradeLogger() + } + + /** + * Called when the server shuts down. + * + * @throws Throwable When an exception occurs. + */ + @Throws(Throwable::class) + fun shutdown() { + SystemManager.flag(SystemState.TERMINATED) + } + + /** + * Checks if its the economy world. + * + * @return `True` if so. + */ + @JvmStatic + val isEconomyWorld: Boolean + get() = false + + private fun generateLocation(): Location { + val random_location = Location(3075 + RandomFunction.random(-15, 15), 3954 + RandomFunction.random(-15, 15), 0) + if (!RegionManager.isTeleportPermitted(random_location)) { + return generateLocation() + } + return if (RegionManager.getObject(random_location) != null) { + generateLocation() + } else random_location + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/ImmerseWorld.kt b/Server/src/main/java/Server/core/game/world/ImmerseWorld.kt new file mode 100644 index 000000000..b10d62c2b --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/ImmerseWorld.kt @@ -0,0 +1,93 @@ +package core.game.world + +import core.game.node.entity.combat.CombatStyle +import core.game.world.map.Location +import core.game.world.map.zone.ZoneBorders +import plugin.ai.general.GeneralBotCreator +import plugin.ai.general.scriptrepository.* +import plugin.ai.pvmbots.CombatBotAssembler +import plugin.ai.skillingbot.SkillingBotAssembler +import java.util.concurrent.Executors + +object ImmerseWorld { + var assembler = CombatBotAssembler() + var skillingBotAssembler = SkillingBotAssembler() + @JvmStatic + fun init() { + Executors.newSingleThreadExecutor().execute { + immerseSeersAndCatherby() + immerseLumbridgeDraynor() + immerseVarrock() + immerseWilderness() + immerseFishingGuild() + immerseAdventurer() + // immerseSlayer() + } + } + fun immerseAdventurer(){ + val lumbridge = Location.create(3221, 3219, 0) + for(i in (0..51)){ + GeneralBotCreator(Adventurer(CombatStyle.MELEE), assembler.MeleeAdventurer(CombatBotAssembler.Tier.LOW,lumbridge)) + GeneralBotCreator(Adventurer(CombatStyle.MELEE), assembler.MeleeAdventurer(CombatBotAssembler.Tier.MED,lumbridge)) + GeneralBotCreator(Adventurer(CombatStyle.RANGE), assembler.RangeAdventurer(CombatBotAssembler.Tier.MED,lumbridge)) + } + } + + fun immerseFishingGuild(){ + val fishingGuild = Location.create(2604, 3421, 0) + for (i in (0..4)) { + GeneralBotCreator(fishingGuild, SharkCatcher()) + } + } + + fun immerseSeersAndCatherby(){ + GeneralBotCreator(SeersMagicTrees(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2702, 3397, 0))) + GeneralBotCreator(SeersFlax(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(2738, 3444, 0))) + GeneralBotCreator(FletchingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2722, 3493, 0))) + GeneralBotCreator(GlassBlowingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2807, 3441, 0))) + GeneralBotCreator(Location.create(2805, 3435, 0), LobsterCatcher()) + } + + fun immerseLumbridgeDraynor(){ + GeneralBotCreator(CowKiller(), assembler.produce(CombatBotAssembler.Type.RANGE, CombatBotAssembler.Tier.MED, Location.create(3261, 3269, 0))) + GeneralBotCreator(CowKiller(), assembler.produce(CombatBotAssembler.Type.MELEE, CombatBotAssembler.Tier.LOW, Location.create(3261, 3269, 0))) + GeneralBotCreator(CowKiller(), assembler.produce(CombatBotAssembler.Type.MELEE, CombatBotAssembler.Tier.MED, Location.create(3257, 3267, 0))) + GeneralBotCreator(ManThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3235, 3213, 0))) + GeneralBotCreator(FarmerThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3094,3243,0))) + GeneralBotCreator(FarmerThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3094,3243,0))) + GeneralBotCreator(DraynorWillows(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.values().random(),Location.create(3094, 3245, 0))) + GeneralBotCreator(DraynorWillows(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.values().random(),Location.create(3094, 3245, 0))) + GeneralBotCreator(DraynorWillows(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.values().random(),Location.create(3094, 3245, 0))) + GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0))) + GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0))) + GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0))) + } + + fun immerseVarrock(){ + val WestBankIdlerBorders = ZoneBorders(3184, 3435,3187, 3444) + GeneralBotCreator(GlassBlowingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.RICH,Location.create(3189, 3435, 0))) + GeneralBotCreator(FletchingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE,Location.create(3189, 3439, 0))) + GeneralBotCreator(Idler(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.RICH,WestBankIdlerBorders.randomLoc)) + GeneralBotCreator(GlassBlowingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3256, 3420, 0))) + GeneralBotCreator(VarrockEssenceMiner(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3253, 3420, 0))) + GeneralBotCreator(VarrockSmither(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.RICH,Location.create(3189, 3436, 0))) + GeneralBotCreator(NonBankingMiner(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3182, 3374, 0))) + } + + fun immerseWilderness(){ + val wilderness = Location.create(2979, 3603, 0) + for (i in (0..1)) { + GeneralBotCreator(GreenDragonKiller(CombatStyle.MELEE), assembler.assembleMeleeDragonBot(CombatBotAssembler.Tier.HIGH,wilderness)) + GeneralBotCreator(GreenDragonKiller(CombatStyle.MELEE), assembler.assembleMeleeDragonBot(CombatBotAssembler.Tier.MED,wilderness)) + GeneralBotCreator(GreenDragonKiller(CombatStyle.RANGE), assembler.assembleRangedBot(CombatBotAssembler.Tier.HIGH,wilderness)) + } + } + + fun immerseFalador(){ + GeneralBotCreator(CoalMiner(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3037, 9737, 0))) + } + + fun immerseSlayer(){ + GeneralBotCreator(GenericSlayerBot(), assembler.produce(CombatBotAssembler.Type.MELEE,CombatBotAssembler.Tier.HIGH,Location.create(2673, 3635, 0))) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/PulseRunner.kt b/Server/src/main/java/Server/core/game/world/PulseRunner.kt new file mode 100644 index 000000000..589ea087a --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/PulseRunner.kt @@ -0,0 +1,100 @@ +package core.game.world + +import core.game.system.task.Pulse +import java.util.* +import java.util.concurrent.Executors +import java.util.concurrent.ThreadPoolExecutor +import java.util.concurrent.TimeUnit +import kotlin.math.floor + +/** new way of running pulses that multithreads based on core count automatically, should improve performance drastically. + * @author ceik + * @author angle + */ + +class PulseRunner { + val TASKS = ArrayList() + fun submit(pulse: Pulse){ + TASKS.add(pulse) + } +} +/* +class PulseeRunner { + val MAXIMUM_NUM_THREADS = 4 + val TARGET_PULSES_PER_THREAD = 100 + val ThreadPool = Executors.newFixedThreadPool(MAXIMUM_NUM_THREADS - 1) as ThreadPoolExecutor + val TASKS: MutableList = ArrayList() + var cores = Runtime.getRuntime().availableProcessors() + var EXECUTOR = Executors.newSingleThreadScheduledExecutor() + var lastPulse: Pulse? = null + fun init(tickTimeMS: Int) { + EXECUTOR.scheduleAtFixedRate(Runner(), 1200, tickTimeMS.toLong(), TimeUnit.MILLISECONDS) + } + + fun submit(pulse: Pulse) { + TASKS.add(pulse) + } + + inner class Runner : Runnable { + override fun run() { + val currTime = System.nanoTime() + var pulses: MutableList? = null + pulses = ArrayList(TASKS) + val pulseArray: Array = pulses.toTypedArray() + */ +/*var numThreads = 1 + pulseArray.size / TARGET_PULSES_PER_THREAD + if (numThreads > MAXIMUM_NUM_THREADS) numThreads = MAXIMUM_NUM_THREADS + val nowTime = System.nanoTime() + // Execute all the tasks not run on the first core + for (i in 1 until numThreads) { + val pulsesLengthStart = floor(pulseArray.size / numThreads * i.toDouble()).toInt() + var pulsesLengthEnd = floor(pulseArray.size / numThreads * (i + 1).toDouble()).toInt() + if (i + 1 == numThreads) pulsesLengthEnd = pulseArray.size + ThreadPool.execute(PulseThread(pulsesLengthStart, pulsesLengthEnd, pulseArray)) + } + + + // Execute the first core tasks all together just as before + val pulsesLengthStart = floor(pulseArray.size / numThreads.toDouble()).toInt()*//* + + + for (element in pulseArray) { + val pulse = element as Pulse? ?: continue + try { + if (TASKS.contains(pulse)) { + lastPulse = pulse + if (pulse.update()) { + TASKS.remove(pulse) + } + } + } catch (t: Throwable) { + t.printStackTrace() + pulse.stop() + TASKS.remove(pulse) + } + } + pulses.clear() + } + } + + inner class PulseThread(var threadStart: Int, var threadFinish: Int, var pulseArray: Array) : Runnable { + override fun run() { + for (i in threadStart until threadFinish) { + val pulse = pulseArray[i] as Pulse? ?: continue + try { + if (TASKS.contains(pulse)) { + lastPulse = pulse + if (pulse.update()) { + TASKS.remove(pulse) + } + } + } catch (t: Throwable) { + t.printStackTrace() + pulse.stop() + TASKS.remove(pulse) + } + } + } + + } +}*/ diff --git a/Server/src/main/java/Server/core/game/world/callback/CallBack.java b/Server/src/main/java/Server/core/game/world/callback/CallBack.java new file mode 100644 index 000000000..90034bf0b --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/callback/CallBack.java @@ -0,0 +1,16 @@ +package core.game.world.callback; + +/** + * Represents a call back which is used in {@link CallbackHub} to load any + * neccesary details used on the starting of a world. + * @author 'Vexia + */ +public interface CallBack { + + /** + * Method used to call anything related to this {@link CallBack}. + * @return True if succesfull with calling, and + * False if not. + */ + public boolean call(); +} diff --git a/Server/src/main/java/Server/core/game/world/callback/CallbackHub.kt b/Server/src/main/java/Server/core/game/world/callback/CallbackHub.kt new file mode 100644 index 000000000..13c5b146c --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/callback/CallbackHub.kt @@ -0,0 +1,31 @@ +package core.game.world.callback + +import core.game.world.map.zone.ZoneBuilder +import core.game.node.entity.skill.hunter.ImpetuousImpulses +import core.game.world.GameWorld +import core.game.ge.OfferManager +import core.game.node.entity.skill.farming.UseWithPatchHandler +import core.game.system.SystemLogger +import java.util.ArrayList + +/** + * Initializes a few world pulses that need to continuously run + * @author Vexia + */ +object CallbackHub { + private var calls: MutableList = ArrayList() + + fun call(): Boolean { + calls.add(ZoneBuilder()) + calls.add(OfferManager()) + calls.add(ImpetuousImpulses()) + for (call in calls) { + if (!call.call()) { + SystemLogger.logErr("A callback was stopped, callback=" + call.javaClass.simpleName + ".") + return false + } + } + calls.clear() + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/BuildRegionChunk.java b/Server/src/main/java/Server/core/game/world/map/BuildRegionChunk.java new file mode 100644 index 000000000..b79cc819b --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/BuildRegionChunk.java @@ -0,0 +1,281 @@ +package core.game.world.map; + + +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.Item; +import core.game.node.object.Constructed; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.world.map.build.LandscapeParser; +import core.net.packet.IoBuffer; +import core.net.packet.out.ClearObject; +import core.net.packet.out.ConstructGroundItem; +import core.net.packet.out.ConstructObject; + +/** + * A region chunk, used for easily modifying objects. + * @author Emperor + * + */ +public class BuildRegionChunk extends RegionChunk { + + /** + * The maximum amount of objects to be stored on one tile in the chunk. + */ + public static final int ARRAY_SIZE = 5; + + /** + * The list of changes made. + */ + private final GameObject[][][] objects; + + /** + * Constructs a new {@code BuildRegionChunk} {@code Object} + * @param base The base location. + * @param rotation The rotation. + * @param plane The region plane. + */ + public BuildRegionChunk(Location base, int rotation, RegionPlane plane) { + super(base, rotation, plane); + this.objects = new GameObject[ARRAY_SIZE][8][8]; + this.objects[0] = super.objects; + } + + @Override + protected boolean appendUpdate(Player player, IoBuffer buffer) { + boolean updated = false;//super.appendUpdate(player, buffer); + for (int i = 0; i < objects.length; i++) { + for (int x = 0; x < SIZE; x++) { + for (int y = 0; y < SIZE; y++) { + GameObject o = objects[i][x][y]; + if (o instanceof Constructed) { + ConstructObject.write(buffer, o); + updated = true; + } + else if (o != null && !o.isRenderable()) { + ClearObject.write(buffer, o); + updated = true; + } + } + } + } + if (items != null) { + for (Item item : items) { + if (item != null && item.isActive() && item.getLocation() != null) { + GroundItem g = (GroundItem) item; + if (!g.isPrivate() || g.droppedBy(player)) { + ConstructGroundItem.write(buffer, item); + updated = true; + } + } + } + } + return updated; + } + + @Override + public void rotate(Direction direction) { + if (rotation != 0) { + SystemLogger.logErr("Region chunk was already rotated!"); + return; + } + GameObject[][][] copy = new GameObject[ARRAY_SIZE][SIZE][SIZE]; + int baseX = currentBase.getLocalX(); + int baseY = currentBase.getLocalY(); + for (int x = 0; x < SIZE; x++) { + for (int y = 0; y < SIZE; y++) { + for (int i = 0; i < objects.length; i++) { + copy[i][x][y] = objects[i][x][y]; + objects[i][x][y] = null; + } + plane.getObjects()[baseX + x][baseY + y] = null; + plane.getFlags().getClippingFlags()[baseX + x][baseY + y] = 0; + } + } + clear(); + rotation = (direction.toInteger() + (direction.toInteger() % 2 == 0 ? 2 : 0)) % 4; + for (int i = 0; i < objects.length; i++) { + for (int x = 0; x < SIZE; x++) { + for (int y = 0; y < SIZE; y++) { + GameObject object = copy[i][x][y]; + if (object != null) { + int[] pos = getRotatedPosition(x, y, object.getDefinition().getSizeX(), object.getDefinition().getSizeY(), object.getRotation(), rotation); + GameObject obj = object.transform(object.getId(), (object.getRotation() + rotation) % 4, object.getLocation().transform(pos[0] - x, pos[1] - y, 0)); + if (object instanceof Constructed) { + obj = obj.asConstructed(); + } + obj.setActive(object.isActive()); + obj.setRenderable(object.isRenderable()); + LandscapeParser.flagGameObject(plane, baseX + pos[0], baseY + pos[1], obj, true, true); + } + } + } + } + } + + @Override + public BuildRegionChunk copy(RegionPlane plane) { + BuildRegionChunk chunk = new BuildRegionChunk(base, rotation, plane); + for (int i = 0; i < chunk.objects.length; i++) { + for (int x = 0; x < SIZE; x++) { + for (int y = 0; y < SIZE; y++) { + GameObject o = objects[i][x][y]; + if (o instanceof Constructed) { + chunk.objects[i][x][y] = o.transform(o.getId(), o.getRotation()).asConstructed(); + } + else if (o != null) { + chunk.objects[i][x][y] = o.transform(o.getId()); + chunk.objects[i][x][y].setActive(o.isActive()); + chunk.objects[i][x][y].setRenderable(o.isRenderable()); + } + } + } + } + return chunk; + } + + @Override + public void clear() { + super.clear(); + for (int i = 0; i < objects.length; i++) { + for (int x = 0; x < objects[i].length; x++) { + for (int y = 0; y < objects[i][x].length; y++) { + objects[i][x][y] = null; + } + } + } + } + + /** + * Removes the game object. + * @param object The object to remove. + */ + public void remove(GameObject object) { + int chunkX = object.getLocation().getChunkOffsetX(); + int chunkY = object.getLocation().getChunkOffsetY(); + GameObject current = null; + int index = -1; + int i = 0; + while ((current == null || current.getId() != object.getId()) && i < objects.length) { + current = objects[i++][chunkX][chunkY]; + if ((current == null || current.getId() < 1) && index == -1) { + index = i - 1; + } + } + if (current != null && current.equals(object)) { + current.setActive(false); + object.setRenderable(false); + } + else { + objects[index][chunkX][chunkY] = object; + } + object.setActive(false); + object.setRenderable(false); + } + + /** + * Adds the game object. + * @param object The object to add. + */ + public void add(GameObject object) { + int chunkX = object.getLocation().getChunkOffsetX(); + int chunkY = object.getLocation().getChunkOffsetY(); + GameObject current = null; + int index = -1; + int i = 0; + while ((current == null || current.getId() != object.getId()) && i < objects.length) { + current = objects[i++][chunkX][chunkY]; + if ((current == null || current.getId() < 1) && index == -1) { + index = i - 1; + } + } + if (current != null && current.equals(object)) { + current.setActive(true); + current.setRenderable(true); + } + else if (index == -1) { + throw new IllegalStateException("Insufficient array length for storing object!"); + } + else { + objects[index][chunkX][chunkY] = object = object.asConstructed(); + } + object.setActive(true); + object.setRenderable(true); + } + + /** + * Stores an object on the region chunk. + * @param object The object. + */ + public void store(GameObject object) { + if (object == null) { + return; + } + int chunkX = object.getLocation().getChunkOffsetX(); + int chunkY = object.getLocation().getChunkOffsetY(); + for (int i = 0; i < objects.length; i++) { + GameObject stat = objects[i][chunkX][chunkY]; + if (stat == null || stat.getId() < 1) { + objects[i][chunkX][chunkY] = object; + object.setActive(true); + object.setRenderable(true); + return; + } + } + System.err.print("Objects - ["); + for (int i = 0; i < objects.length; i++) { + System.err.print(objects[i][chunkX][chunkY]); + if (i < objects.length - 1) { + System.err.print(", "); + } + } + SystemLogger.logErr("]!"); + throw new IllegalStateException("Insufficient array length for storing all objects! "); + } + + /** + * Gets the objects index for the given object id. + * @param x The x-coordinate on the region chunk. + * @param y The y-coordinate on the region chunk. + * @param objectId The object id. + */ + public int getIndex(int x, int y, int objectId) { + for (int i = 0; i < objects.length; i++) { + GameObject o = get(x, y, i); + if (o != null && ((objectId > -1 && o.getId() == objectId) || (objectId == -1 && o.getDefinition().hasOptions(false)))) { + return i; + } + } + return 0; + } + + /** + * Gets a game object. + * @param x The chunk x-coordinate. + * @param y The chunk y-coordinate. + * @param index The index (0 = default). + * @return The object. + */ + public GameObject get(int x, int y, int index) { + return objects[index][x][y]; + } + + @Override + public GameObject[] getObjects(int chunkX, int chunkY) { + GameObject[] objects = new GameObject[ARRAY_SIZE]; + for (int i = 0; i < ARRAY_SIZE; i++) { + objects[i] = this.objects[i][chunkX][chunkY]; + } + return objects; + } + + /** + * Gets the objects. + * @param index The index. + * @return The objects array. + */ + public GameObject[][] getObjects(int index) { + return objects[index]; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/Direction.java b/Server/src/main/java/Server/core/game/world/map/Direction.java new file mode 100644 index 000000000..96cc6d0e5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/Direction.java @@ -0,0 +1,272 @@ +package core.game.world.map; + +/** + * Represents a direction. + * @author Emperor + */ +public enum Direction { + /** + * 0 1 2 + * \ | / + * 3 - . - 4 + * / | \ + * 5 6 7 + */ + + + /** + * The north-west direction. + */ + NORTH_WEST(-1, 1, 7, 0x12c0108, 0x12c0120, 0x12c0138), + + /** + * The north direction. + */ + NORTH(0, 1, 0, 0x12c0120), + + /** + * The north-east direction. + */ + NORTH_EAST(1, 1, 4, 0x12c0180, 0x12c0120, 0x12c01e0), + + /** + * The west direction. + */ + WEST(-1, 0, 3, 0x12c0108), + + /** + * The east direction. + */ + EAST(1, 0, 1, 0x12c0180), + + /** + * The south-west direction. + */ + SOUTH_WEST(-1, -1, 6, 0x12c0108, 0x12c0102, 0x12c010e), + + /** + * The south direction. + */ + SOUTH(0, -1, 2, 0x12c0102), + + /** + * The south-east direction. + */ + SOUTH_EAST(1, -1, 5, 0x12c0180, 0x12c0102, 0x12c0183); + + /** + * The amounts of steps on the x-axis. + */ + private final int stepX; + + /** + * The amounts of steps on the y-axis. + */ + private final int stepY; + + /** + * The integer value. + */ + private final int value; + + /** + * The traversal flags. + */ + private int[] traversal; + + /** + * Constructs a new {@code Direction} {@code Object}. + * @param stepX The x-offset to move a step. + * @param stepY The y-offset to move a step. + * @param value The direction value. + * @param traversal The traversal flags. + */ + Direction(int stepX, int stepY, int value, int... traversal) { + this.stepX = stepX; + this.stepY = stepY; + this.value = value; + this.setTraversal(traversal); + } + + /** + * Gets the direction. + * @param rotation The int value. + * @return The direction. + */ + public static Direction get(int rotation) { + for (Direction dir : Direction.values()) { + if (dir.value == rotation) { + return dir; + } + } + throw new IllegalArgumentException("Invalid direction value - " + rotation); + } + + /** + * Gets the walk point for a direction.
The point will be the offset to + * the location the node is facing. + * @param direction The direction. + * @return The point. + */ + public static Point getWalkPoint(Direction direction) { + return new Point(direction.stepX, direction.stepY); + } + + /** + * Gets the direction. + * @param location The start location. + * @param l The end location. + * @return The direction. + */ + public static Direction getDirection(Location location, Location l) { + return getDirection(l.getX() - location.getX(), l.getY() - location.getY()); + } + + /** + * Gets the direction for movement. + * @param diffX The difference between 2 x-coordinates. + * @param diffY The difference between 2 y-coordinates. + * @return The direction. + */ + public static Direction getDirection(int diffX, int diffY) { + if (diffX < 0) { + if (diffY < 0) { + return SOUTH_WEST; + } else if (diffY > 0) { + return NORTH_WEST; + } + return WEST; + } else if (diffX > 0) { + if (diffY < 0) { + return SOUTH_EAST; + } else if (diffY > 0) { + return NORTH_EAST; + } + return EAST; + } + if (diffY < 0) { + return SOUTH; + } + return NORTH; + } + + /** + * Gets the direction for the given walking flag. + * @param walkingFlag The walking flag. + * @param rotation The rotation. + * @return The direction, or null if the walk flag was 0. + */ + public static Direction forWalkFlag(int walkingFlag, int rotation) { + if (rotation != 0) { + walkingFlag = (walkingFlag << rotation & 0xf) + (walkingFlag >> 4 - rotation); + } + if (walkingFlag > 0) { + if ((walkingFlag & 0x8) == 0) { + return Direction.WEST; + } + if ((walkingFlag & 0x2) == 0) { + return Direction.EAST; + } + if ((walkingFlag & 0x4) == 0) { + return Direction.SOUTH; + } + if ((walkingFlag & 0x1) == 0) { + return Direction.NORTH; + } + } + return null; + } + + /** + * Gets the opposite dir. + * @return the direction. + */ + public Direction getOpposite() { + return Direction.get(toInteger() + 2 & 3); + } + + /** + * Gets the most logical direction. + * @param location The start location. + * @param l The end location. + * @return The most logical direction. + */ + public static Direction getLogicalDirection(Location location, Location l) { + int offsetX = Math.abs(l.getX() - location.getX()); + int offsetY = Math.abs(l.getY() - location.getY()); + if (offsetX > offsetY) { + if (l.getX() > location.getX()) { + return Direction.EAST; + } else { + return Direction.WEST; + } + } else if (l.getY() < location.getY()) { + return Direction.SOUTH; + } + return Direction.NORTH; + } + + /** + * Method used to go to clue the anme. + * @param direction the direction. + * @return the name. + */ + public String toName(Direction direction) { + return direction.name().toLowerCase(); + } + + /** + * Method used to get the direction to an integer. + * @return the integer. + */ + public int toInteger() { + return value; + } + + /** + * Gets the stepX. + * @return The stepX. + */ + public int getStepX() { + return stepX; + } + + /** + * Gets the stepY. + * @return The stepY. + */ + public int getStepY() { + return stepY; + } + + /** + * Checks if traversal is permitted for this direction. + * @param l The location. + * @return {@code True} if so. + */ + public boolean canMove(Location l) { + int flag = RegionManager.getClippingFlag(l.getZ(), l.getX(), l.getY()); + for (int f : traversal) { + if ((flag & f) != 0) { + return false; + } + } + return true; + } + + /** + * Gets the traversal. + * @return The traversal. + */ + public int[] getTraversal() { + return traversal; + } + + /** + * Sets the traversal. + * @param traversal The traversal to set. + */ + public void setTraversal(int[] traversal) { + this.traversal = traversal; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/Location.java b/Server/src/main/java/Server/core/game/world/map/Location.java new file mode 100644 index 000000000..fd5590e16 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/Location.java @@ -0,0 +1,456 @@ +package core.game.world.map; + +import core.game.interaction.DestinationFlag; +import core.game.node.Node; +import core.game.world.map.path.Path; +import core.game.world.map.path.Pathfinder; +import core.tools.RandomFunction; + +import java.nio.ByteBuffer; + +/** + * Represents a location on the world map. + * @author Emperor + */ +public final class Location extends Node { + + /** + * The x-coordinate. + */ + private int x; + + /** + * The y-coordinate. + */ + private int y; + + /** + * The plane. + */ + private int z; + + /** + * Constructs a new {@code Location} {@code Object}. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param z The z-coordinate. + */ + public Location(int x, int y, int z) { + super(null, null); + super.destinationFlag = DestinationFlag.LOCATION; + this.x = x; + this.y = y; + if (z < 0) { + z += 4; + } + this.z = z; + } + + /** + * Constructs a new {@code Location} {@code Object} + * @param x The x-coordinate. + * @param y The y-coordinate. + */ + public Location(int x, int y) { + this(x, y, 0); + } + + /** + * Constructs a new {@code Location} {@code Object}. + * @param x The x-coordinate. + * @param y The y coordinate. + * @param z The z-coordinate. + * @param randomizer The amount we should randomize the x and y coordinates + * with (x + random(randomizer), y + random(randomizer)). + */ + public Location(int x, int y, int z, int randomizer) { + this(x + RandomFunction.getRandom(randomizer), y + RandomFunction.getRandom(randomizer), z); + } + + + + /** + * Construct a new Location. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param z The z-coordinate. + * @return The constructed location. + */ + public static Location create(int x, int y, int z) { + return new Location(x, y, z); + } + + public static Location create(int x, int y) { + return new Location(x, y, 0); + } + + /** + * Creates a new instance of the given location. + * @param location The given location. + * @return The new instance. + */ + public static Location create(Location location) { + return create(location.getX(), location.getY(), location.getZ()); + } + + /** + * Creates a location instance with coordinates being the difference between + * {@code other} & {@code location}. + * @param location The first location. + * @param other The other location. + * @return The delta location. + */ + public static Location getDelta(Location location, Location other) { + return Location.create(other.x - location.x, other.y - location.y, other.z - location.z); + } + + /** + * Gets a random location near the main location. + * @param main The main location. + * @param radius The radius. + * @param reachable If the locations should be able to reach eachother. + * @return The location. + */ + public static Location getRandomLocation(Location main, int radius, boolean reachable) { + Location location = RegionManager.getTeleportLocation(main, radius); + if (!reachable) { + return location; + } + Path path = Pathfinder.find(main, location, false, Pathfinder.DUMB); + if (!path.isSuccessful()) { + location = main; + if (!path.getPoints().isEmpty()) { + Point p = path.getPoints().getLast(); + location = Location.create(p.getX(), p.getY(), main.getZ()); + } + } + return location; + } + + @Override + public Location getLocation() { + return this; + } + + /** + * Saves the location to a buffer. + * @param buffer the buffer. + * @return the buffer. + */ + public ByteBuffer save(ByteBuffer buffer) { + return buffer.putShort((short) getX()).putShort((short) getY()).put((byte) getZ()); + } + + /** + * Parses a location from the buffer. + * @param buffer the buffer. + * @return the location. + */ + public static Location parse(ByteBuffer buffer) { + return Location.create(buffer.getShort(), buffer.getShort(), buffer.get()); + } + + /** + * Checks if this location is right next to the node (assuming the node is + * size 1x1). + * @param node The node to check. + * @return {@code True} if this location is 1 tile north, west, south or + * east of the node location. + */ + public boolean isNextTo(Node node) { + Location l = node.getLocation(); + if (l.getY() == y) { + return l.getX() - x == -1 || l.getX() - x == 1; + } + if (l.getX() == x) { + return l.getY() - y == -1 || l.getY() - y == 1; + } + return false; + } + + /** + * Gets the region id. + * @return The region id. + */ + public int getRegionId() { + return (x >> 6) << 8 | (y >> 6); + } + + /** + * Gets the location incremented by the given coordinates. + * @param dir The direction to transform this location. + * @return The location. + */ + public Location transform(Direction dir) { + return transform(dir, 1); + } + + /** + * Gets the location incremented by the given coordinates. + * @param dir The direction to transform this location. + * @param steps The amount of steps to move in this direction. + * @return The location. + */ + public Location transform(Direction dir, int steps) { + return new Location(x + (dir.getStepX() * steps), y + (dir.getStepY() * steps), this.z); + } + + /** + * Gets the location incremented by the given coordinates. + * @param l incremental location + * @return The location. + */ + public Location transform(Location l) { + return new Location(x + l.getX(), y + l.getY(), this.z + l.getZ()); + } + + /** + * Gets the location incremented by the given coordinates. + * @param diffX The x-difference. + * @param diffY The y-difference. + * @param z The height difference. + * @return The location. + */ + public Location transform(int diffX, int diffY, int z) { + return new Location(x + diffX, y + diffY, this.z + z); + } + + /** + * Checks if the other location is within viewing distance. + * @param other The other location. + * @return If you're within the other distance. + */ + public boolean withinDistance(Location other) { + return withinDistance(other, MapDistance.RENDERING.getDistance()); + } + + /** + * Returns if a player is within a specified distance. + * @param other The other location. + * @param dist The amount of distance. + * @return If you're within the other distance. + */ + public boolean withinDistance(Location other, int dist) { + if (other.z != z) { + return false; + } + int deltaX = other.x - x, deltaY = other.y - y; + return deltaX <= dist && deltaX >= -dist && deltaY <= dist && deltaY >= -dist; + } + + public boolean withinDistanceProper(Location other, int dist){ + int a = (other.x - x); + int b = (other.y - y); + double product = Math.sqrt((a*a) + (b*b)); + return product <= dist; + } + + /** + * Returns the distance between you and the other. + * @param other The other location. + * @return The amount of distance between you and other. + */ + public double getDistance(Location other) { + int xdiff = this.getX() - other.getX(); + int ydiff = this.getY() - other.getY(); + return Math.sqrt(xdiff * xdiff + ydiff * ydiff); + } + + /** + * Returns the distance between the first and the second specified distance. + * @param first The first location. + * @param second The other location. + * @return The amount of distance between first and other. + */ + public static double getDistance(Location first, Location second) { + int xdiff = first.getX() - second.getX(); + int ydiff = first.getY() - second.getY(); + return Math.sqrt(xdiff * xdiff + ydiff * ydiff); + } + + /** + * Gets the x position on the region chunk. + * @return The x position on the region chunk. + */ + public int getChunkOffsetX() { + int x = getLocalX(); + return x - ((x / RegionChunk.SIZE) * RegionChunk.SIZE); + } + + /** + * Gets the y position on the region chunk. + * @return The y position on the region chunk. + */ + public int getChunkOffsetY() { + int y = getLocalY(); + return y - ((y / RegionChunk.SIZE) * RegionChunk.SIZE); + } + + /** + * Gets the base location for the chunk this location is in. + * @return The base location. + */ + public Location getChunkBase() { + return create(getRegionX() << 3, getRegionY() << 3, z); + } + + /** + * Gets the region x-coordinate. + * @return The region x-coordinate. + */ + public int getRegionX() { + return x >> 3; + } + + /** + * Gets the region y-coordinate. + * @return The region y-coordinate. + */ + public int getRegionY() { + return y >> 3; + } + + /** + * Gets the local x-coordinate on the current region. + * @return The local x-coordinate. + */ + public int getLocalX() { + return x - ((x >> 6) << 6); + } + + /** + * Gets the local y-coordinate on the current region. + * @return The local y-coordinate. + */ + public int getLocalY() { + return y - ((y >> 6) << 6); + } + + /** + * Gets the local x-coordinate. + * @return The local x-coordinate. + */ + public int getSceneX() { + return x - ((getRegionX() - 6) << 3); + } + + /** + * Gets the local y-coordinate. + * @return The local y-coordinate. + */ + public int getSceneY() { + return y - ((getRegionY() - 6) << 3); + } + + /** + * Gets the local x-coordinate. + * @param loc The location containing the regional coordinates. + * @return The local x-coordinate. + */ + public int getSceneX(Location loc) { + return x - ((loc.getRegionX() - 6) << 3); + } + + /** + * Gets the local y-coordinate. + * @param loc The location containing the regional coordinates. + * @return The local y-coordinate. + */ + public int getSceneY(Location loc) { + return y - ((loc.getRegionY() - 6) * 8); + } + + /** + * Gets the chunk's x-coordinate (0-7). + * @return The x in the (8x8) region. + */ + public int getChunkX() { + return getLocalX() >> 3; + } + + /** + * Gets the chunk's y-coordinate (0-7). + * @return The y in the (8x8) region. + */ + public int getChunkY() { + return getLocalY() >> 3; + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof Location)) { + return false; + } + Location loc = (Location) other; + return loc.x == x && loc.y == y && loc.z == z; + } + + /** + * Checks if these coordinates equal this location. + * @param x the x. + * @param y the y. + * @param z the x. + * @return {@code True} if so. + */ + public boolean equals(int x, int y, int z) { + return equals(new Location(x, y, z)); + } + + @Override + public String toString() { + return "[" + x + ", " + y + ", " + z + "]"; + } + + @Override + public int hashCode() { + return z << 30 | x << 15 | y; + } + + /** + * Gets the x. + * @return The x. + */ + public int getX() { + return x; + } + + /** + * Sets the x. + * @param x The x to set. + */ + public void setX(int x) { + this.x = x; + } + + /** + * Gets the y. + * @return The y. + */ + public int getY() { + return y; + } + + /** + * Sets the y. + * @param y The y to set. + */ + public void setY(int y) { + this.y = y; + } + + /** + * Gets the z. + * @return The z. + */ + public int getZ() { + return z % 4; + } + + /** + * Sets the z. + * @param z The z to set. + */ + public void setZ(int z) { + this.z = z; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/MapDistance.java b/Server/src/main/java/Server/core/game/world/map/MapDistance.java new file mode 100644 index 000000000..a809eaca3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/MapDistance.java @@ -0,0 +1,39 @@ +package core.game.world.map; + +/** + * An enum holding commonly used distances (in tiles of the map). + * @author Emperor + */ +public enum MapDistance { + + /** + * The rendering distance. + */ + RENDERING(15), + + /** + * The sound packet sending distance. + */ + SOUND(5), ; + + /** + * The distance. + */ + private final int distance; + + /** + * Constructs a new {@code MapDistance} {@code Object}. + * @param distance The distance (in tiles). + */ + private MapDistance(int distance) { + this.distance = distance; + } + + /** + * Gets the distance. + * @return the distance. + */ + public int getDistance() { + return distance; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/Point.java b/Server/src/main/java/Server/core/game/world/map/Point.java new file mode 100644 index 000000000..4a3e01c14 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/Point.java @@ -0,0 +1,143 @@ +package core.game.world.map; + +/** + * Represents a point. + * @author Emperor + */ +public final class Point { + + /** + * The x-coordinate. + */ + private final int x; + + /** + * The y-coordinate. + */ + private final int y; + + /** + * The difference x between previous and current point. + */ + private final int diffX; + + /** + * The difference y between previous and current point. + */ + private final int diffY; + + /** + * The direction for the next point. + */ + private final Direction direction; + + /** + * If we can't run during this point. + */ + private boolean runDisabled; + + /** + * Constructs a new {@code Point} {@code Object}. + * @param x The x-coordinate. + * @param y The y-coordinate. + */ + public Point(int x, int y) { + this(x, y, null, 0, 0); + } + + /** + * Constructs a new {@code Point} {@code Object}. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param direction The direction. + */ + public Point(int x, int y, Direction direction) { + this(x, y, direction, 0, 0); + } + + /** + * Constructs a new {@code Point} {@code Object}. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param direction The direction. + * @param diffX The difference x between previous and current point. + * @param diffY The difference y between previous and current point. + */ + public Point(int x, int y, Direction direction, int diffX, int diffY) { + this.x = x; + this.y = y; + this.direction = direction; + this.diffX = diffX; + this.diffY = diffY; + } + + /** + * Constructs a new {@code Point} {@code Object}. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param direction The direction. + * @param diffX The difference x between previous and current point. + * @param diffY The difference y between previous and current point. + * @param runDisabled If running is disabled for this walking point. + */ + public Point(int x, int y, Direction direction, int diffX, int diffY, boolean runDisabled) { + this(x, y, direction, diffX, diffY); + this.runDisabled = runDisabled; + } + + /** + * Gets the x. + * @return The x. + */ + public int getX() { + return x; + } + + /** + * Gets the y. + * @return The y. + */ + public int getY() { + return y; + } + + /** + * Gets the direction. + * @return The direction. + */ + public Direction getDirection() { + return direction; + } + + /** + * Gets the diffX. + * @return The diffX. + */ + public int getDiffX() { + return diffX; + } + + /** + * Gets the diffY. + * @return The diffY. + */ + public int getDiffY() { + return diffY; + } + + /** + * Gets the runDisabled. + * @return The runDisabled. + */ + public boolean isRunDisabled() { + return runDisabled; + } + + /** + * Sets the runDisabled. + * @param runDisabled The runDisabled to set. + */ + public void setRunDisabled(boolean runDisabled) { + this.runDisabled = runDisabled; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/Region.java b/Server/src/main/java/Server/core/game/world/map/Region.java new file mode 100644 index 000000000..2b5b298e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/Region.java @@ -0,0 +1,541 @@ +package core.game.world.map; + +import core.cache.Cache; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.music.MusicZone; +import core.game.system.SystemLogger; +import core.game.system.config.XteaParser; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.build.LandscapeParser; +import core.game.world.map.build.MapscapeParser; +import core.game.world.map.zone.RegionZone; +import core.game.world.repository.Repository; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a region. + * + * @author Emperor + */ +public class Region { + + /** + * The default size of a region. + */ + public static final int SIZE = 64; + + /** + * The region x-coordinate. + */ + private final int x; + + /** + * The region y-coordinate. + */ + private final int y; + + /** + * The region planes. + */ + private final RegionPlane[] planes = new RegionPlane[4]; + + /** + * The activity pulse. + */ + private final Pulse activityPulse; + + /** + * The region zones lying in this region. + */ + private final List regionZones = new ArrayList<>(); + + /** + * The music zones lying in this region. + */ + private final List musicZones = new ArrayList<>(); + + /** + * If the region is active. + */ + private boolean active; + + /** + * The amount of objects in this region. + */ + private int objectCount; + + /** + * If the region has flags. + */ + private boolean hasFlags; + + /** + * If the region has been loaded. + */ + private boolean loaded; + + /** + * The amount of players viewing this region. + */ + private int viewAmount; + + /** + * If the region can be edited. + */ + private boolean build; + + /** + * If all planes should be updated when in this region (instead of just current one). + */ + private boolean updateAllPlanes; + + /** + * Constructs a new {@code Region} {@code Object}. + * @param x The x-coordinate of the region. + * @param y The y-coordinate of the region. + */ + public Region(int x, int y) { + this.x = x; + this.y = y; + for (int plane = 0; plane < 4; plane++) { + planes[plane] = new RegionPlane(this, plane); + } + this.activityPulse = new Pulse(50) { + @Override + public boolean pulse() { + flagInactive(); + return true; + } + }; + activityPulse.stop(); + } + + /** + * Gets the base location. + * @return The base location. + */ + public Location getBaseLocation() { + return Location.create(x << 6, y << 6, 0); + } + + /** + * Adds a region zone to this region. + * @param zone The region zone. + */ + public void add(RegionZone zone) { + regionZones.add(zone); + for (RegionPlane plane : planes) { + for (NPC npc : plane.getNpcs()) { + npc.getZoneMonitor().updateLocation(npc.getLocation()); + } + for (Player p : plane.getPlayers()) { + p.getZoneMonitor().updateLocation(p.getLocation()); + } + } + } + + /** + * Adds a player to this region. + * @param player The player. + */ + public void add(Player player) { + planes[player.getLocation().getZ()].add(player); + flagActive(); + } + + /** + * Adds an npc to this region. + * @param npc The npc. + */ + public void add(NPC npc) { + planes[npc.getLocation().getZ()].add(npc); + } + + /** + * Removes an NPC from this region. + * @param npc The NPC. + */ + public void remove(NPC npc) { + RegionPlane plane = npc.getViewport().getCurrentPlane(); + if (plane != null && plane != planes[npc.getLocation().getZ()]) { + plane.remove(npc); + } + planes[npc.getLocation().getZ()].remove(npc); + } + + /** + * Removes a player from this region. + * @param player The player. + */ + public void remove(Player player) { + player.getViewport().getCurrentPlane().remove(player); + checkInactive(); + } + + /** + * Checks if the region is inactive, if so it will start the inactivity flagging. + * @return {@code True} if the region is inactive. + */ + public boolean checkInactive() { + return isInactive(true); + } + + /** + * Checks if the region is inactive. + * @param runPulse If the pulse for flagging the region as inactive should be ran. + * @return {@code True} if so. + */ + public boolean isInactive(boolean runPulse) { + if (isViewed()) { + return false; + } + for (RegionPlane p : planes) { + if (!p.getPlayers().isEmpty()) { + return false; + } + } + if (runPulse) { + if (!activityPulse.isRunning()) { + activityPulse.restart(); + activityPulse.start(); + GameWorld.getPulser().submit(activityPulse); + } + } + return true; + } + + /** + * Checks if this region has the inactivity flagging pulse running. + * @return {@code True} if so. + */ + public boolean isPendingRemoval() { + return activityPulse.isRunning(); + } + + /** + * Flags the region as active. + */ + public void flagActive() { + activityPulse.stop(); + if (!active) { + active = true; + load(this); + for (RegionPlane r : planes) { + for (NPC n : r.getNpcs()) { + if (n.isActive()) { + Repository.addRenderableNPC(n); + } + } + } + } + } + + /** + * Flags the region as inactive. + */ + protected void flagInactive() { + unload(this); + active = false; + } + + /** + * Loads the flags for a region. + * @param r The region. + */ + public static void load(Region r) { + load(r, r.build); + } + + /** + * Loads the flags for a region. + * @param r The region. + * @param build if all objects in this region should be stored (rather than just the ones with options). + */ + public static void load(Region r, boolean build) { + try { + if (r.isLoaded() && r.isBuild() == build) { + return; + } + r.build = build; + boolean dynamic = r instanceof DynamicRegion; + int regionId = dynamic ? ((DynamicRegion) r).getRegionId() : r.getId(); + int regionX = regionId >> 8 & 0xFF; + int regionY = regionId & 0xFF; + int mapscapeId = Cache.getIndexes()[5].getArchiveId("m" + regionX + "_"+ regionY); + byte[][][] mapscapeData = new byte[4][SIZE][SIZE]; + for (RegionPlane plane : r.planes) { + plane.getFlags().setLandscape(new boolean[SIZE][SIZE]); + plane.getFlags().setClippingFlags(new int[SIZE][SIZE]); + plane.getProjectileFlags().setClippingFlags(new int[SIZE][SIZE]); + } + if (mapscapeId > -1) { + ByteBuffer mapscape = ByteBuffer.wrap(Cache.getIndexes()[5].getCacheFile().getContainerUnpackedData(mapscapeId)); + MapscapeParser.parse(r, mapscapeData, mapscape); + } + r.hasFlags = dynamic; + r.setLoaded(true); + int landscapeId = Cache.getIndexes()[5].getArchiveId("l" + regionX + "_" + regionY); + if (landscapeId > -1) { + byte[] landscape = Cache.getIndexes()[5].getFileData(landscapeId, 0, XteaParser.Companion.getRegionXTEA(regionId)); + if (landscape == null || landscape.length < 4) { + return; + } + r.hasFlags = true; + try { + LandscapeParser.parse(r, mapscapeData, ByteBuffer.wrap(landscape), build); + } catch (Throwable t) { + new Throwable("Failed parsing region " + regionId + "!", t).printStackTrace(); + } + } + MapscapeParser.clipMapscape(r, mapscapeData); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + /** + * Unloads a region. + * @param r The region. + */ + private static void unload(Region r) { + if (r.isViewed()) { + SystemLogger.logErr("Players viewing region!"); + r.flagActive(); + return; + } + for (RegionPlane p : r.planes) { + if (!p.getPlayers().isEmpty()) { + SystemLogger.logErr("Players still in region!"); + r.flagActive(); + return; + } + } + for (RegionPlane p : r.planes) { + p.clear(); + if (!(r instanceof DynamicRegion)) { + for (NPC n : p.getNpcs()) { + n.onRegionInactivity(); + } + } + } + } + + /** + * Checks if the region is being viewed by a player. + * @return {@code True} if so. + */ + public boolean isViewed() { + synchronized (this) { + return viewAmount > 0; + } + } + + /** + * Increments the view amount. + * @return The view amount after incrementing. + */ + public int incrementViewAmount() { + synchronized (this) { + return ++viewAmount; + } + } + + /** + * Decrements the amount of viewers. + * @return The view amount after decrementing. + */ + public int decrementViewAmount() { + synchronized (this) { + if (viewAmount < 1) { + //SystemLogger.logErr("View amount is " + (viewAmount - 1)); + viewAmount++; + } + return --viewAmount; + } + } + + /** + * Gets the active. + * @return The active. + */ + public boolean isActive() { + return active; + } + + /** + * Sets the active. + * @param active The active to set. + * @deprecated This should not be used, instead use the {@link #flagInactive()}, + * {@link #flagActive()} & {@link #checkInactive()} methods to safely change the activity state. + */ + @Deprecated + public void setActive(boolean active) { + this.active = active; + } + + /** + * Gets the region id. + * @return The region id. + */ + public int getId() { + return x << 8 | y; + } + + /** + * Gets the real region id (this returns the copied region id for dynamic regions). + * @return The region id. + */ + public int getRegionId() { + return getId(); + } + + /** + * Gets the x. + * @return The x. + */ + public int getX() { + return x; + } + + /** + * Gets the y. + * @return The y. + */ + public int getY() { + return y; + } + + /** + * Gets the planes. + * @return The planes. + */ + public RegionPlane[] getPlanes() { + return planes; + } + + /** + * Gets the regionZones. + * @return The regionZones. + */ + public List getRegionZones() { + return regionZones; + } + + /** + * Gets the musicZones. + * @return The musicZones. + */ + public List getMusicZones() { + return musicZones; + } + + /** + * Gets the object count. + * @return The object count. + */ + public int getObjectCount() { + return objectCount; + } + + /** + * Sets the object count. + * @param objectCount The object count. + */ + public void setObjectCount(int objectCount) { + this.objectCount = objectCount; + } + + /** + * Gets the hasFlags. + * @return The hasFlags. + */ + public boolean isHasFlags() { + return hasFlags; + } + + /** + * Sets the hasFlags. + * @param hasFlags The hasFlags to set. + */ + public void setHasFlags(boolean hasFlags) { + this.hasFlags = hasFlags; + } + + /** + * Sets the region time out duration. + * @param ticks The amount of ticks before the region is flagged as inactive. + */ + public void setRegionTimeOut(int ticks) { + activityPulse.setDelay(ticks); + } + + /** + * Gets the loaded. + * @return The loaded. + */ + public boolean isLoaded() { + return loaded; + } + + /** + * Sets the loaded. + * @param loaded The loaded to set. + */ + public void setLoaded(boolean loaded) { + this.loaded = loaded; + } + + /** + * Gets the viewAmount. + * @return The viewAmount. + */ + public int getViewAmount() { + return viewAmount; + } + + /** + * Sets the viewAmount. + * @param viewAmount The viewAmount to set. + */ + public void setViewAmount(int viewAmount) { + this.viewAmount = viewAmount; + } + + /** + * Gets the build. + * @return the build + */ + public boolean isBuild() { + return build; + } + + /** + * Sets the build. + * @param build the build to set. + */ + public void setBuild(boolean build) { + this.build = build; + } + + /** + * Gets the updateAllPlanes value. + * @return The updateAllPlanes. + */ + public boolean isUpdateAllPlanes() { + return updateAllPlanes; + } + + /** + * Sets the updateAllPlanes value. + * @param updateAllPlanes The updateAllPlanes to set. + */ + public void setUpdateAllPlanes(boolean updateAllPlanes) { + this.updateAllPlanes = updateAllPlanes; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/RegionChunk.java b/Server/src/main/java/Server/core/game/world/map/RegionChunk.java new file mode 100644 index 000000000..7442b295e --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/RegionChunk.java @@ -0,0 +1,368 @@ +package core.game.world.map; + +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.build.LandscapeParser; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; +import core.net.packet.out.ClearObject; +import core.net.packet.out.ConstructGroundItem; +import core.net.packet.out.ConstructObject; +import core.net.packet.out.UpdateAreaPosition; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a region chunk. + * @author Emperor + * + */ +public class RegionChunk { + + /** + * The chunk size. + */ + public static final int SIZE = 8; + + /** + * The base location of the copied region chunk. + */ + protected Location base; + + /** + * The current base location. + */ + protected Location currentBase; + + /** + * The region plane. + */ + protected RegionPlane plane; + + /** + * The items in this chunk. + */ + protected List items; + + /** + * The game objects in this chunk. + */ + protected GameObject[][] objects; + + /** + * The rotation. + */ + protected int rotation; + + /** + * The update flags. + */ + private List> flags = new ArrayList<>(); + + /** + * Constructs a new {@code RegionChunk} {@code Object}. + * @param base The base location of the region chunk. + * @param rotation The rotation. + */ + public RegionChunk(Location base, int rotation, RegionPlane plane) { + this.base = base; + this.currentBase = base; + this.rotation = rotation; + this.plane = plane; + this.objects = new GameObject[SIZE][SIZE]; + } + + /** + * Copies the region chunk. + * @param plane The region plane. + * @return The region chunk. + */ + public BuildRegionChunk copy(RegionPlane plane) { + return new BuildRegionChunk(base, rotation, plane); + } + + /** + * Registers an update flag. + * @param flag The flag. + */ + public void flag(UpdateFlag flag) { + flags.add(flag); + } + + /** + * Clears the region chunk. + */ + public void clear() { + flags.clear(); + if (items != null && plane.getRegion() instanceof DynamicRegion) { + items.clear(); + items = null; + } + } + + /** + * Updates the region chunk. + * @param player The player. + */ + public void synchronize(Player player) { + IoBuffer buffer = UpdateAreaPosition.getChunkUpdateBuffer(player, currentBase); + if (appendUpdate(player, buffer)) { + player.getSession().write(buffer); + } + } + + /** + * Writes the region chunk update data on the buffer. + * @param player The player we're updating for. + * @param buffer The buffer to write on. + * @return {@code True} if an update occured. + */ + protected boolean appendUpdate(Player player, IoBuffer buffer) { + boolean updated = false; + int baseX = currentBase.getLocalX(); + int baseY = currentBase.getLocalY(); + for (int x = 0; x < SIZE; x++) { + for (int y = 0; y < SIZE; y++) { + GameObject dyn = objects[x][y]; + if (dyn == null || plane.getObjects() == null) { + continue; + } + GameObject stat = plane.getObjects()[baseX + x][baseY + y]; + if (!dyn.isRenderable() && stat != null) { + ClearObject.write(buffer, stat); + updated = true; + } + else if (dyn != stat) { + if (stat != null) { + ClearObject.write(buffer, stat); + } + ConstructObject.write(buffer, dyn); + updated = true; + } + } + } + if (items != null) { + for (Item item : items) { + if (item != null && item.isActive() && item.getLocation() != null) { + GroundItem g = (GroundItem) item; + if (!g.isPrivate() || g.droppedBy(player)) { + ConstructGroundItem.write(buffer, item); + updated = true; + } + } + } + } + return updated; + } + + /** + * Sends all the update flags. + */ + public void update(Player player) { + if (isUpdated()) { + IoBuffer buffer = UpdateAreaPosition.getChunkUpdateBuffer(player, currentBase); + Object[] flagsArray = flags.toArray(); + int size = flagsArray.length; + for (int i = 0; i < size; i++) { + UpdateFlag flag = (UpdateFlag) flagsArray[i]; + flag.writeDynamic(buffer, player); + } + player.getSession().write(buffer); + } + } + + /** + * Rotates the chunk. + * @param direction The direction. + */ + public void rotate(Direction direction) { + if (rotation != 0) { + SystemLogger.logErr("Region chunk was already rotated!"); + return; + } + GameObject[][] copy = new GameObject[SIZE][SIZE]; + GameObject[][] staticCopy = new GameObject[SIZE][SIZE]; + int baseX = currentBase.getLocalX(); + int baseY = currentBase.getLocalY(); + for (int x = 0; x < SIZE; x++) { + for (int y = 0; y < SIZE; y++) { + copy[x][y] = objects[x][y]; + staticCopy[x][y] = plane.getObjects()[baseX + x][baseY + y]; + objects[x][y] = plane.getObjects()[baseX + x][baseY + y] = null; + plane.getFlags().getClippingFlags()[baseX + x][baseY + y] = 0; + } + } + rotation = direction.toInteger(); + for (int x = 0; x < SIZE; x++) { + for (int y = 0; y < SIZE; y++) { + GameObject object = copy[x][y]; + GameObject stat = staticCopy[x][y]; + boolean match = object == stat; + if (stat == null) { + continue; + } + int[] pos = getRotatedPosition(x, y, stat.getDefinition().getSizeX(), stat.getDefinition().getSizeY(), stat.getRotation(), rotation); + if (object != null) { + object = object.transform(object.getId(), (object.getRotation() + rotation) % 4, object.getLocation().transform(pos[0] - x, pos[1] - y, 0)); + LandscapeParser.flagGameObject(plane, baseX + pos[0], baseY + pos[1], object, true, true); + } + if (match) { + stat = object; + } else { + stat = stat.transform(stat.getId(), (stat.getRotation() + rotation) % 4, stat.getLocation().transform(pos[0] - x, pos[1] - y, 0)); + } + plane.getObjects()[baseX + pos[0]][baseY + pos[1]] = stat; + } + } + } + + /** + * Gets the new coordinates for an object/chunk tile when rotating. + * @param x The current x-coordinate. + * @param y The current y-coordinate. + * @param sizeX The x-size of the object. + * @param sizeY The y-size of the object. + * @param rotation The object rotation. + * @param chunkRotation The chunk rotation. + * @return The new x-coordinate. + */ + public static int[] getRotatedPosition(int x, int y, int sizeX, int sizeY, int rotation, int chunkRotation) { + if ((rotation & 0x1) == 1) { + int s = sizeX; + sizeX = sizeY; + sizeY = s; + } + if (chunkRotation == 0) { + return new int[] { x, y }; + } + if (chunkRotation == 1) { + return new int[] { y, 7 - x - (sizeX - 1) }; + } + if (chunkRotation == 2) { + return new int[] { 7 - x - (sizeX - 1), 7 - y - (sizeY - 1) }; + } + return new int[] { 7 - y - (sizeY - 1), x }; + } + + /** + * Gets the items. + * @return The items. + */ + public List getItems() { + if (items == null) { + items = new ArrayList(); + } + return items; + } + + /** + * Sets the items. + * @param items The items to set. + */ + public void setItems(List items) { + this.items = items; + } + + /** + * Gets the game objects located on the coordinates in this chunk. + * @param chunkX The chunk x-coordinate (0-7). + * @param chunkY The chunk y-coordinate (0-7). + * @return The objects. + */ + public GameObject[] getObjects(int chunkX, int chunkY) { + return new GameObject[] { objects[chunkX][chunkY] }; + } + + /** + * Gets the objects. + * @return The objects. + */ + public GameObject[][] getObjects() { + return objects; + } + + /** + * Sets the objects. + * @param objects The objects to set. + */ + public void setObjects(GameObject[][] objects) { + this.objects = objects; + } + + /** + * Gets the base. + * @return The base. + */ + public Location getBase() { + return base; + } + + /** + * Sets the base location of the region to copy. + * @param base The base location. + */ + public void setBase(Location base) { + this.base = base; + } + + /** + * Gets the rotation. + * @return The rotation. + */ + public int getRotation() { + return rotation; + } + + /** + * Sets the rotation of the region chunk. + * @param rotation The rotation + */ + public void setRotation(int rotation) { + this.rotation = rotation; + } + + /** + * Gets the updated. + * @return The updated. + */ + public boolean isUpdated() { + return !flags.isEmpty(); + } + + /** + * Resets the flags. + */ + public void resetFlags() { + flags.clear(); + } + + /** + * Gets the region plane. + * @return The plane. + */ + public RegionPlane getPlane() { + return plane; + } + + /** + * Gets the currentBase. + * @return The currentBase. + */ + public Location getCurrentBase() { + return currentBase; + } + + /** + * Sets the currentBase. + * @param currentBase The currentBase to set. + */ + public void setCurrentBase(Location currentBase) { + this.currentBase = currentBase; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/RegionManager.java b/Server/src/main/java/Server/core/game/world/map/RegionManager.java new file mode 100644 index 000000000..29e6d6ab7 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/RegionManager.java @@ -0,0 +1,737 @@ +package core.game.world.map; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.world.map.zone.ZoneBorders; +import core.tools.RandomFunction; + +import java.util.*; + +/** + * Manages the regions. + * @author Emperor + * + */ +public final class RegionManager { + + /** + * The region cache mapping. + */ + private static final Map REGION_CACHE = new HashMap<>(); + + /** + * Gets the region for the given region id. + * @param regionId The region id. + * @return The region. + */ + public static Region forId(int regionId) { + Region region = REGION_CACHE.get(regionId); + if (region == null) { + region = new Region(regionId >> 8 & 0xFF, regionId & 0xFF); + REGION_CACHE.put(regionId, region); + } + return region; + } + + /** + * Pulses the active regions. + */ + public static void pulse() { + Object[] rCacheArray = new Object[0]; + try { + rCacheArray = REGION_CACHE.values().toArray(); + } catch (ConcurrentModificationException e){ + SystemLogger.logErr("Region Cache tried to process too early -- restarting..."); + System.exit(0); + } + int rCacheLength = rCacheArray.length; + for (int i = 0; i < rCacheLength; i++) { + Region r = (Region) rCacheArray[i]; + if (r != null && r.isActive()) { + RegionPlane[] planes = r.getPlanes(); + int size = planes.length; + for (int j = 0; j < size; j++) { + planes[j].pulse(); + } + } + } + } + + /** + * Gets the clipping flag on the given location. + * @param l The location. + * @return The clipping flag. + */ + public static int getClippingFlag(Location l) { + return getClippingFlag(l.getZ(), l.getX(), l.getY()); + } + + /** + * Gets the clipping flag. + * @param z The plane. + * @param x The absolute x-coordinate. + * @param y The absolute y-coordinate. + * @return The clipping flags. + */ + public static int getClippingFlag(int z, int x, int y) { + Region region = forId((x >> 6) << 8 | y >> 6); + Region.load(region); + if (!region.isHasFlags()) { + return -1; + } + x -= (x >> 6) << 6; + y -= (y >> 6) << 6; + return region.getPlanes()[z].getFlags().getClippingFlags()[x][y]; + } + + /** + * Gets the water variant of a tile's clipping flag + * Essentially strips the landscape flag off a tile and keeps other flags, and makes normally walkable tiles unwalkable. + * @author Ceikry + */ + public static int getWaterClipFlag(int z, int x, int y){ + int flag = getClippingFlag(z,x,y); + if(!isClipped(z,x,y)){ + return flag | 0x100; + } + return flag & (~0x200000); + } + + /** + * Checks if the tile is part of the landscape. + * @param l The location. + * @return {@code True} if so. + */ + public static boolean isLandscape(Location l) { + return isLandscape(l.getZ(), l.getX(), l.getY()); + } + + /** + * Checks if the tile is part of the landscape. + * @param z The plane. + * @param x The absolute x-coordinate. + * @param y The absolute y-coordinate. + * @return {@code True} if so. + */ + public static boolean isLandscape(int z, int x, int y) { + Region region = forId((x >> 6) << 8 | y >> 6); + Region.load(region); + if (!region.isHasFlags() || region.getPlanes()[z].getFlags().getLandscape() == null) { + return false; + } + x -= (x >> 6) << 6; + y -= (y >> 6) << 6; + return region.getPlanes()[z].getFlags().getLandscape()[x][y]; + } + + /** + * Sets the clipping flag on the given location. + * @param l The location. + * @param flag The flag to set. + */ + public static void setClippingFlag(Location l, int flag) { + int x = l.getX(); + int y = l.getY(); + int z = l.getZ(); + Region region = forId((x >> 6) << 8 | y >> 6); + Region.load(region); + if (!region.isHasFlags()) { + return; + } + x -= (x >> 6) << 6; + y -= (y >> 6) << 6; + region.getPlanes()[z].getFlags().getClippingFlags()[x][y] = flag; + } + + /** + * Adds a clipping flag. + * @param z The plane. + * @param x The absolute x-coordinate. + * @param y The absolute y-coordinate. + * @param projectile If the flag is being set for projectile pathfinding. + * @param flag The clipping flag. + */ + public static void addClippingFlag(int z, int x, int y, boolean projectile, int flag) { + Region region = forId((x >> 6) << 8 | y >> 6); + Region.load(region); + if (!region.isHasFlags()) { + return; + } + x -= (x >> 6) << 6; + y -= (y >> 6) << 6; + if (projectile) { + region.getPlanes()[z].getProjectileFlags().flag(x, y, flag); + } else { + region.getPlanes()[z].getFlags().flag(x, y, flag); + } + } + + /** + * Adds a clipping flag. + * @param z The plane. + * @param x The absolute x-coordinate. + * @param y The absolute y-coordinate. + * @param projectile If the flag is being set for projectile pathfinding. + * @param flag The clipping flag. + */ + public static void removeClippingFlag(int z, int x, int y, boolean projectile, int flag) { + Region region = forId((x >> 6) << 8 | y >> 6); + Region.load(region); + if (!region.isHasFlags()) { + return; + } + x -= (x >> 6) << 6; + y -= (y >> 6) << 6; + if (projectile) { + region.getPlanes()[z].getProjectileFlags().unflag(x, y, flag); + } else { + region.getPlanes()[z].getFlags().unflag(x, y, flag); + } + } + + /** + * Gets the clipping flag. + * @param z The plane. + * @param x The absolute x-coordinate. + * @param y The absolute y-coordinate. + * @return The clipping flags. + */ + public static int getProjectileFlag(int z, int x, int y) { + Region region = forId((x >> 6) << 8 | y >> 6); + Region.load(region); + if (!region.isHasFlags()) { + return -1; + } + x -= (x >> 6) << 6; + y -= (y >> 6) << 6; + return region.getPlanes()[z].getProjectileFlags().getClippingFlags()[x][y]; + } + + /** + * Gets the clipping flag + * @param location the Location + * @return the clipping flag + */ + public static boolean isTeleportPermitted(Location location) { + return isTeleportPermitted(location.getZ(), location.getX(), location.getY()); + } + + /** + * Gets the clipping flag. + * @param z The plane. + * @param x The absolute x-coordinate. + * @param y The absolute y-coordinate. + * @return The clipping flags. + */ + public static boolean isTeleportPermitted(int z, int x, int y) { + if (!isLandscape(z, x, y)) { + return false; + } + int flag = getClippingFlag(z, x, y); + return (flag & 0x12c0102) == 0 || (flag & 0x12c0108) == 0 || (flag & 0x12c0120) == 0 || (flag & 0x12c0180) == 0; + } + + /** + * Checks if the location has any clipping flags. + * @param location The location. + * @return {@code True} if a clipping flag disables access for this location. + */ + public static boolean isClipped(Location location) { + return isClipped(location.getZ(), location.getX(), location.getY()); + } + + /** + * Checks if the location has any clipping flags. + * @param z The plane. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @return {@code True} if a clipping flag disables access for this location. + */ + public static boolean isClipped(int z, int x, int y) { + if (!isLandscape(z, x, y)) { + return true; + } + int flag = getClippingFlag(z, x, y); + return (flag & 0x12c0102) != 0 || (flag & 0x12c0108) != 0 || (flag & 0x12c0120) != 0 || (flag & 0x12c0180) != 0; + } + + /** + * Gets the spawn location of a node. + * @param owner the owner. + * @param node the node. + * @return the location. + */ + public static Location getSpawnLocation(Player owner, Node node) { + if (owner == null || node == null) { + return null; + } + Location destination = null; + for (int i = 0; i < 4; i++) { + Direction dir = Direction.get(i); + Location l = owner.getLocation().transform(dir, dir.toInteger() < 2 ? 1 : node.size()); + boolean success = true; + loop:{ + for (int x = 0; x < node.size(); x++) { + for (int y = 0; y < node.size(); y++) { + if (RegionManager.isClipped(l.transform(x, y, 0))) { + success = false; + break loop; + } + } + } + } + if (success) { + destination = l; + break; + } + } + return destination; + } + + /** + * Gets the game object on the current location. + * @param l The location. + * @return The game object, or {@code null} if no object was found. + */ + public static GameObject getObject(Location l) { + return getObject(l.getZ(), l.getX(), l.getY()); + } + + /** + * Gets the game object on the current absolute coordinates. + * @param z The height. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @return The game object, or {@code null} if no object was found. + */ + public static GameObject getObject(int z, int x, int y) { + return getObject(z, x, y, -1); + } + + /** + * Gets the object on the given absolute coordinates. + * @param z The height. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param objectId The object id. + * @return The game object, or {@code null} if no object was found. + */ + public static GameObject getObject(int z, int x, int y, int objectId) { + int regionId = ((x >> 6) << 8) | y >> 6; + x -= ((x >> 6) << 6); + y -= ((y >> 6) << 6); + Region region = forId(regionId); + Region.load(region); + GameObject object = region.getPlanes()[z].getChunkObject(x, y, objectId); + if (object != null && !object.isRenderable()) { + return null; + } + return object; + } + + /** + * Gets the region plane for this location. + * @param l The location. + * @return The region plane. + */ + public static RegionPlane getRegionPlane(Location l) { + int regionId = ((l.getX() >> 6) << 8) | l.getY() >> 6; + return forId(regionId).getPlanes()[l.getZ()]; + } + + /** + * Gets a region chunk. + * @param l The location. + * @return The region chunk. + */ + public static RegionChunk getRegionChunk(Location l) { + RegionPlane plane = getRegionPlane(l); + return plane.getRegionChunk(l.getLocalX() / RegionChunk.SIZE, l.getLocalY() / RegionChunk.SIZE); + } + + /** + * Moves the entity from the current region to the new one. + * @param entity The entity. + */ + public static void move(Entity entity) { + boolean player = entity instanceof Player; + int regionId = (entity.getLocation().getRegionX() >> 3) << 8 | (entity.getLocation().getRegionY() >> 3); + Viewport viewport = entity.getViewport(); + Region current = forId(regionId); + int z = entity.getLocation().getZ(); + RegionPlane plane = current.getPlanes()[z]; + viewport.updateViewport(entity); + if (plane == viewport.getCurrentPlane()) { + entity.getZoneMonitor().updateLocation(entity.getWalkingQueue().getFootPrint()); + return; + } + viewport.remove(entity); + if (player) { + current.add((Player) entity); + } else { + current.add((NPC) entity); + } + viewport.setRegion(current); + viewport.setCurrentPlane(plane); + List view = new LinkedList<>(); + for (int regionX = (entity.getLocation().getRegionX() >> 3) - 1; regionX <= (entity.getLocation().getRegionX() >> 3) + 1; regionX++) { + for (int regionY = (entity.getLocation().getRegionY() >> 3) - 1; regionY <= (entity.getLocation().getRegionY() >> 3) + 1; regionY++) { + if (regionX < 0 || regionY < 0) { + continue; + } + Region region = forId(regionX << 8 | regionY); + RegionPlane p = region.getPlanes()[z]; + if (player) { + region.incrementViewAmount(); + region.flagActive(); + } + view.add(p); + } + } + viewport.setViewingPlanes(view); + entity.getZoneMonitor().updateLocation(entity.getWalkingQueue().getFootPrint()); + } + + /** + * Gets the list of local NPCs with a maximum distance of 16. + * @param n The entity. + * @return The list of local NPCs. + */ + public static List getLocalNpcs(Entity n) { + return getLocalNpcs(n, MapDistance.RENDERING.getDistance()); + } + + /** + * Gets the location entitys. + * @param location the location. + * @param distance the distance. + * @return the list. + */ + public static List getLocalEntitys(Location location, int distance){ + List entitys = new ArrayList<>(); + entitys.addAll(getLocalNpcs(location, distance)); + entitys.addAll(getLocalPlayers(location, distance)); + return entitys; + } + + /** + * Gets the location entitys. + * @param entity the entity. + * @param distance the distance. + * @return the list. + */ + public static List getLocalEntitys(Entity entity, int distance) { + return getLocalEntitys(entity.getLocation(), distance); + } + + /** + * Gets the local entitys. + * @param entity the entity. + * @return the entitys. + */ + public static List getLocalEntitys(Entity entity) { + return getLocalEntitys(entity.getLocation(), MapDistance.RENDERING.getDistance()); + } + + /** + * Gets the list of local NPCs. + * @param n The entity. + * @param distance The distance to the entity. + * @return The list of local NPCs. + */ + public static List getLocalNpcs(Entity n, int distance) { + List npcs = new LinkedList<>(); + for (RegionPlane r : n.getViewport().getViewingPlanes()) { + for (NPC npc : r.getNpcs()) { + if (npc.getLocation().withinDistance(n.getLocation(), distance)) { + npcs.add(npc); + } + } + } + return npcs; + } + + /** + * Gets the list of local players with a maximum distance of 15. + * @param n The entity. + * @return The list of local players. + */ + public static List getLocalPlayers(Entity n) { + return getLocalPlayers(n, MapDistance.RENDERING.getDistance()); + } + + /** + * Gets the list of local players. + * @param n The entity. + * @param distance The distance to the entity. + * @return The list of local players. + */ + public static List getLocalPlayers(Entity n, int distance) { + List players = new LinkedList<>(); + for (RegionPlane r : n.getViewport().getViewingPlanes()) { + for (Player p : r.getPlayers()) { + if (p.getLocation().withinDistance(n.getLocation(), distance)) { + players.add(p); + } + } + } + return players; + } + + /** + * Gets the surrounding players. + * @param n The node the players should be surrounding. + * @param ignore The nodes not to add to the list. + * @return The list of players. + */ + public static List getSurroundingPlayers(Node n, Node...ignore) { + return getSurroundingPlayers(n, 9, ignore); + } + + /** + * Gets the surrounding players. + * @param n The node the players should be surrounding. + * @param ignore The nodes not to add to the list. + * @return The list of players. + */ + public static List getSurroundingPlayers(Node n, int maximum, Node...ignore) { + List players = getLocalPlayers(n.getLocation(), 1); + int count = 0; + for (Iterator it = players.iterator(); it.hasNext();) { + Player p = it.next(); + if (++count >= maximum) { + it.remove(); + continue; + } + for (Node node : ignore) { + if (p == node) { + count--; + it.remove(); + break; + } + } + } + return players; + } + + /** + * Gets the surrounding players. + * @param n The node the players should be surrounding. + * @param ignore The nodes not to add to the list. + * @return The list of players. + */ + public static List getSurroundingNPCs(Node n, Node...ignore) { + return getSurroundingNPCs(n, 9, ignore); + } + + /** + * Gets the surrounding players. + * @param n The node the npcs should be surrounding. + * @param ignore The nodes not to add to the list. + * @return The list of npcs. + */ + public static List getSurroundingNPCs(Node n, int maximum, Node...ignore) { + List npcs = getLocalNpcs(n.getLocation(), 1); + int count = 0; + for (Iterator it = npcs.iterator(); it.hasNext();) { + NPC p = it.next(); + if (++count > maximum) { + it.remove(); + continue; + } + for (Node node : ignore) { + if (p == node) { + count--; + it.remove(); + break; + } + } + } + return npcs; + } + + /** + * Gets a random teleport location in the radius around the given location. + * @param location The centre location. + * @param radius The radius. + * @return A random teleport location. + */ + public static Location getTeleportLocation(Location location, int radius) { + int mod = radius >> 1; + if (mod == 0) { + mod++; + radius--; + } + return getTeleportLocation(location.transform(-mod, -mod, 0), mod + radius, mod + radius); + } + + /** + * Gets a random teleport location in the radius around the given location. + * @param location The centre location. + * @return A random teleport location. + */ + public static Location getTeleportLocation(Location location, int areaX, int areaY) { + Location destination = location; + int x = RandomFunction.random(1 + areaX); + int y = RandomFunction.random(1 + areaY); + int count = 0; + while (!isTeleportPermitted(destination = location.transform(x, y, 0))) { + x = RandomFunction.random(1 + areaX); + y = RandomFunction.random(1 + areaY); + if (count++ >= areaX * 2) { + //This would be able to keep looping for several seconds otherwise (this actually happens). + for (x = 0; x < areaX + 1; x++) { + for (y = 0; y < areaY + 1; y++) { + if (isTeleportPermitted(destination = location.transform(x, y, 0))) { + return destination; + } + } + } + break; + } + } + return destination; + } + + /** + * Gets the current viewport for the location. + * @param l The location. + * @return The viewport. + */ + public static List getViewportPlayers(Location l) { + List players = new LinkedList<>(); + l = l.getChunkBase().transform(-8, -8, 0); + ZoneBorders b = new ZoneBorders(l.getX(), l.getY(), l.getX() + 24, l.getY() + 24); + for (int regionX = (l.getRegionX() - 6) >> 3; regionX <= (l.getRegionX() + 6) >> 3; regionX++) { + for (int regionY = (l.getRegionY() - 6) >> 3; regionY <= (l.getRegionY() + 6) >> 3; regionY++) { + for (Player player : forId(regionX << 8 | regionY).getPlanes()[l.getZ()].getPlayers()) { + l = player.getLocation(); + if (b.insideBorder(l.getX(), l.getY())) { + players.add(player); + } + } + } + } + return players; + } + + /** + * Gets a list of players in the given region. + * @param regionId The region id. + * @return The list of players in this region. + */ + public static List getRegionPlayers(int regionId) { + Region r = forId(regionId); + List players = new ArrayList<>(); + for (RegionPlane plane : r.getPlanes()) { + players.addAll(plane.getPlayers()); + } + return players; + } + + /** + * Gets a list of local players within rendering distance of the location. + * @param l The location. + * @return The list of players. + */ + public static List getLocalPlayers(Location l) { + return getLocalPlayers(l, MapDistance.RENDERING.getDistance()); + } + + /** + * Gets a list of local players. + * @param l The location. + * @param distance The distance to that location. + * @return The list of players. + */ + public static List getLocalPlayers(Location l, int distance) { + List players = new LinkedList<>(); + for (int regionX = (l.getRegionX() - 6) >> 3; regionX <= (l.getRegionX() + 6) >> 3; regionX++) { + for (int regionY = (l.getRegionY() - 6) >> 3; regionY <= (l.getRegionY() + 6) >> 3; regionY++) { + for (Player player : forId(regionX << 8 | regionY).getPlanes()[l.getZ()].getPlayers()) { + if (player.getLocation().withinDistance(l, distance)) { + players.add(player); + } + } + } + } + return players; + } + + /** + * Gets a list of local players within 16 tile distance of the location. + * @param l The location. + * @return The list of players. + */ + public static List getLocalNpcs(Location l) { + return getLocalNpcs(l, MapDistance.RENDERING.getDistance()); + } + + /** + * Gets the npc. + * @param entity the entity. + * @param id the id. + */ + public static NPC getNpc(final Entity entity, final int id) { + return getNpc(entity, id, 16); + } + + /** + * Gets the npc. + * @param entity the entity. + * @param id the id. + * @param distance the distance. + * @return the npc. + */ + public static NPC getNpc(Entity entity, int id, int distance) { + return getNpc(entity.getLocation(), id, distance); + } + + /** + * Gets an npc near the entity. + * @param id the id, + * @param distance the dinstance. + * @return the npc. + */ + public static NPC getNpc(final Location location, int id, int distance) { + List npcs = getLocalNpcs(location, distance); + for (NPC n : npcs) { + if (n.getId() == id) { + return n; + } + } + return null; + } + + /** + * Gets a list of local players. + * @param l The location. + * @param distance The distance to that location. + * @return The list of players. + */ + public static List getLocalNpcs(Location l, int distance) { + List npcs = new LinkedList<>(); + for (int regionX = (l.getRegionX() - 6) >> 3; regionX <= (l.getRegionX() + 6) >> 3; regionX++) { + for (int regionY = (l.getRegionY() - 6) >> 3; regionY <= (l.getRegionY() + 6) >> 3; regionY++) { + for (NPC n : forId(regionX << 8 | regionY).getPlanes()[l.getZ()].getNpcs()) { + if (n.getLocation().withinDistance(l, (n.size() >> 1) + distance)) { + npcs.add(n); + } + } + } + } + return npcs; + } + + /** + * Gets the regionCache. + * @return The regionCache. + */ + public static Map getRegionCache() { + return REGION_CACHE; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/RegionPlane.java b/Server/src/main/java/Server/core/game/world/map/RegionPlane.java new file mode 100644 index 000000000..c20503083 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/RegionPlane.java @@ -0,0 +1,422 @@ +package core.game.world.map; + +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.world.map.build.DynamicRegion; +import core.game.world.map.build.RegionFlags; +import core.game.world.update.flag.chunk.ItemUpdateFlag; +import core.net.packet.PacketRepository; +import core.net.packet.context.BuildItemContext; +import core.net.packet.out.ClearGroundItem; +import core.net.packet.out.ConstructGroundItem; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Represents one of the 4 planes of a region. + * @author Emperor + * + */ +public final class RegionPlane { + + /** + * The region size. + */ + public static final int REGION_SIZE = 64; + + /** + * The amount of chunks in this plane. + */ + public static final int CHUNK_SIZE = REGION_SIZE >> 3; + + /** + * Represents a removed game object. + */ + public static final GameObject NULL_OBJECT = new GameObject(0, Location.create(0, 0, 0)); + + /** + * The plane. + */ + private final int plane; + + /** + * The region. + */ + private final Region region; + + /** + * The region flags. + */ + private final RegionFlags flags; + + /** + * The region projectile flags. + */ + private final RegionFlags projectileFlags; + + /** + * The region chunks. + */ + private final RegionChunk[][] chunks; + + /** + * The list of NPCs in this region. + */ + private final List npcs; + + /** + * The list of players in this region. + */ + private final List players; + + /** + * The game objects. + */ + private GameObject[][] objects; + + /** + * Constructs a new {@code RegionPlane} {@code Object}. + * @param region The region. + * @param plane The plane. + */ + public RegionPlane(Region region, int plane) { + this.plane = plane; + this.region = region; + this.players = new CopyOnWriteArrayList(); + this.npcs = new CopyOnWriteArrayList(); + Location base = region.getBaseLocation(); + this.flags = new RegionFlags(plane, base.getX(), base.getY()); + this.projectileFlags = new RegionFlags(plane, base.getX(), base.getY(), true); + this.objects = new GameObject[REGION_SIZE][REGION_SIZE]; + this.chunks = new RegionChunk[CHUNK_SIZE][CHUNK_SIZE]; + } + + /** + * Called at the end of the update sequence, if the region is active. + */ + public void pulse() { + Arrays.stream(chunks).forEach(regionChunks -> {Arrays.stream(regionChunks).filter(Objects::nonNull).forEach(RegionChunk::resetFlags);}); + } + + /** + * Adds a game object. + * @param object The object to add. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param landscape If this object is added through landscape parsing. + */ + public void add(GameObject object, int x, int y, boolean landscape) { + setChunkObject(x, y, object); + if (landscape) { + objects[x][y] = object; + } + if (object != null) { + object.setRenderable(true); + } + } + + /** + * Gets the region chunk. + * @param chunkX The chunk base x-coordinate. + * @param chunkY The chunk base y-coordinate. + * @return The region chunk. + */ + public RegionChunk getRegionChunk(int chunkX, int chunkY) { + RegionChunk r = chunks[chunkX][chunkY]; + if (r != null) { + return r; + } + if (region.isBuild()) { + return chunks[chunkX][chunkY] = new BuildRegionChunk(region.getBaseLocation().transform(chunkX << 3, chunkY << 3, plane), 0, this); + } + return chunks[chunkX][chunkY] = new RegionChunk(region.getBaseLocation().transform(chunkX << 3, chunkY << 3, plane), 0, this); + } + + /** + * Removes a game object. + * @param x The x-coordinate. + * @param y The y-coordinate. + */ + public void remove(int x, int y) { + remove(x, y, -1); + } + + /** + * Removes a game object. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param objectId The object id. + */ + public void remove(int x, int y, int objectId) { + int chunkX = x / CHUNK_SIZE; + int chunkY = y / CHUNK_SIZE; + int offsetX = x - chunkX * CHUNK_SIZE; + int offsetY = y - chunkY * CHUNK_SIZE; + RegionChunk chunk = getRegionChunk(chunkX, chunkY); + GameObject remove = new GameObject(0, region.getBaseLocation().transform(x, y, plane), 22, 0); + remove.setRenderable(false); + if (chunk instanceof BuildRegionChunk) { + int index = ((BuildRegionChunk) chunk).getIndex(offsetX, offsetY, objectId); + ((BuildRegionChunk) chunk).getObjects(index)[offsetX][offsetY] = remove; + return; + } + chunk.getObjects()[offsetX][offsetY] = remove; + } + + /** + * Sets an object on a chunk. + * @param x The regional x-coordinate. + * @param y The regional y-coordinate. + * @param object The object to set. + */ + private void setChunkObject(int x, int y, GameObject object) { + int chunkX = x / CHUNK_SIZE; + int chunkY = y / CHUNK_SIZE; + int offsetX = x - chunkX * CHUNK_SIZE; + int offsetY = y - chunkY * CHUNK_SIZE; + RegionChunk r = getRegionChunk(chunkX, chunkY); + if (r instanceof BuildRegionChunk) { + ((BuildRegionChunk) r).store(object); + return; + } + r.getObjects()[offsetX][offsetY] = object; + } + + /** + * Gets the game objects. + * @return The game objects. + */ + public GameObject[][] getObjects() { + return objects; + } + + /** + * Clears this region plane. + */ + public void clear() { + for (RegionChunk[] c : chunks) { + for (RegionChunk chunk : c) { + if (chunk != null) { + chunk.clear(); + } + } + } + if (region instanceof DynamicRegion && objects != null) { + for (int x = 0; x < REGION_SIZE; x++) { + for (int y = 0; y < REGION_SIZE; y++) { + objects[x][y] = null; + } + } + objects = null; + } + } + + /** + * Adds an NPC to this region. + * @param npc The NPC to add. + */ + public void add(NPC npc) { + npcs.add(npc); + } + + /** + * Adds a player to this region. + * @param player The player. + */ + public void add(Player player) { + players.add(player); + } + + /** + * Adds an item to this region. + * @param item The item. + */ + public void add(GroundItem item) { + Location l = item.getLocation(); + RegionChunk c = getRegionChunk(l.getLocalX() / RegionChunk.SIZE, l.getLocalY() / RegionChunk.SIZE); + if (!c.getItems().add(item)) { + return; + } + GroundItem g = (GroundItem) item; + if (g.isPrivate()) { + if (g.getDropper() != null) { + PacketRepository.send(ConstructGroundItem.class, new BuildItemContext(g.getDropper(), item)); + } + return; + } + c.flag(new ItemUpdateFlag(g, ItemUpdateFlag.CONSTRUCT_TYPE)); + } + + /** + * Removes an NPC from this region. + * @param npc The NPC. + */ + public void remove(NPC npc) { + npcs.remove(npc); + } + + /** + * Removes a player from this region. + * @param player The player. + */ + public void remove(Player player) { + players.remove(player); + } + + /** + * Removes an item from this region. + * @param item The ground item. + */ + public void remove(GroundItem item) { + Location l = item.getLocation(); + RegionChunk c = getRegionChunk(l.getLocalX() / RegionChunk.SIZE, l.getLocalY() / RegionChunk.SIZE); + if (!c.getItems().remove(item)) { + return; + } + if (item.isPrivate()) { + if (item.getDropper() != null && item.getDropper().isPlaying() && item.getDropper().getLocation().withinDistance(l)) { + PacketRepository.send(ClearGroundItem.class, new BuildItemContext(item.getDropper(), item)); + } + return; + } + c.flag(new ItemUpdateFlag(item, ItemUpdateFlag.REMOVE_TYPE)); + } + + /** + * Gets the region flags. + * @return The flags. + */ + public RegionFlags getFlags() { + return flags; + } + + /** + * Gets the projectileFlags. + * @return The projectileFlags. + */ + public RegionFlags getProjectileFlags() { + return projectileFlags; + } + + /** + * Gets the npcs. + * @return The npcs. + */ + public List getNpcs() { + return npcs; + } + + public List getEntities() + { + List entities = new ArrayList<>(npcs); + Arrays.stream(getObjects()).forEach(o -> entities.addAll(Arrays.asList(o))); + return entities; + } + + /** + * Gets the players. + * @return The players. + */ + public List getPlayers() { + return players; + } + + /** + * Gets the plane. + * @return The plane. + */ + public int getPlane() { + return plane; + } + + /** + * Gets the region. + * @return The region. + */ + public Region getRegion() { + return region; + } + + /** + * Gets an object from a region chunk. + * @param x The region x-coordinate. + * @param y The region y-coordinate. + * @return The game object. + */ + public GameObject getChunkObject(int x, int y) { + return getChunkObject(x, y, -1); + } + + /** + * Gets an object from a region chunk. + * @param x The region x-coordinate. + * @param y The region y-coordinate. + * @param objectId The object id. + * @return The game object. + */ + public GameObject getChunkObject(int x, int y, int objectId) { + int chunkX = x / CHUNK_SIZE; + int chunkY = y / CHUNK_SIZE; + int offsetX = x - chunkX * CHUNK_SIZE; + int offsetY = y - chunkY * CHUNK_SIZE; + RegionChunk chunk = getRegionChunk(chunkX, chunkY); + if (chunk instanceof BuildRegionChunk) { + BuildRegionChunk brc = (BuildRegionChunk) chunk; + return brc.get(offsetX, offsetY, brc.getIndex(offsetX, offsetY, objectId)); + } + return getRegionChunk(chunkX, chunkY).getObjects()[offsetX][offsetY]; + } + + /** + * Gets an object from a region chunk. + * @param x The region x-coordinate. + * @param y The region y-coordinate. + * @return The game object. + */ + public List getChunkItems(int x, int y) { + int chunkX = x / CHUNK_SIZE; + int chunkY = y / CHUNK_SIZE; + return getRegionChunk(chunkX, chunkY).getItems(); + } + + /** + * Gets a ground item from this plane. + * @param itemId The item id. + * @param l The location. + * @param player The player. + * @return The item. + */ + public GroundItem getItem(int itemId, Location l, Player player) { + GroundItem groundItem = null; + for (Item item : getChunkItems(l.getLocalX(), l.getLocalY())) { + GroundItem g = (GroundItem) item; + if (g.getId() == itemId && l.equals(g.getLocation()) && !g.isRemoved()) { + if (groundItem != null && (!g.isPrivate() || player == null)) { + continue; + } + if ((!g.isPrivate() || player == null || g.droppedBy(player))) { + groundItem = g; + } + } + } + return groundItem; + } + + /** + * Gets the region chunks. + * @return The chunks. + */ + public RegionChunk[][] getChunks() { + return chunks; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/Viewport.java b/Server/src/main/java/Server/core/game/world/map/Viewport.java new file mode 100644 index 000000000..8489b40c0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/Viewport.java @@ -0,0 +1,155 @@ +package core.game.world.map; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; + +import java.util.LinkedList; +import java.util.List; + +/** + * Represents an entity's viewport. + * @author Emperor + */ +public final class Viewport { + + /** + * The amount of chunks in a viewport. + */ + public static final int CHUNK_SIZE = 5; + + /** + * The region region. + */ + private Region region; + + /** + * The region chunks. + */ + private RegionChunk[][] chunks = new RegionChunk[CHUNK_SIZE][CHUNK_SIZE]; + + /** + * The region region plane. + */ + private RegionPlane currentPlane; + + /** + * The region planes the entity can see. + */ + private List viewingPlanes = new LinkedList<>(); + + /** + * Constructs a new {@code Viewport} {@code Object}. + */ + public Viewport() { + /* + * empty. + */ + } + + /** + * Updates the entity's viewport. + * @param entity The entity. + */ + public void updateViewport(Entity entity) { + RegionChunk chunk = RegionManager.getRegionChunk(entity.getLocation()); + int center = chunks.length >> 1; + if (chunks[center][center] == chunk) { + return; + } + int offset = center * -8; + Location l = chunk.getCurrentBase(); + for (int x = 0; x < chunks.length; x++) { + for (int y = 0; y < chunks[x].length; y++) { + chunks[x][y] = RegionManager.getRegionChunk(l.transform(offset + (8 * x), offset + (8 * y), 0)); + } + } + } + + /** + * Removes the entity from the viewingPlanes. + * @param entity The entity. + */ + public void remove(Entity entity) { + if (region == null) { + return; + } + if (entity instanceof Player) { + region.remove((Player) entity); + Region region = null; + for (RegionPlane r : viewingPlanes) { + if (region != r.getRegion()) { + region = r.getRegion(); + region.decrementViewAmount(); + region.checkInactive(); + } + } + } else { + region.remove((NPC) entity); + } + } + + /** + * Gets the region. + * @return The region. + */ + public Region getRegion() { + return region; + } + + /** + * Sets the region. + * @param region The region to set. + */ + public void setRegion(Region region) { + this.region = region; + } + + /** + * Gets the chunks. + * @return The chunks. + */ + public RegionChunk[][] getChunks() { + return chunks; + } + + /** + * Sets the chunks. + * @param chunks The chunks to set. + */ + public void setChunks(RegionChunk[][] chunks) { + this.chunks = chunks; + } + + /** + * Gets the viewingPlanes. + * @return The viewingPlanes. + */ + public List getViewingPlanes() { + return viewingPlanes; + } + + /** + * Sets the viewingPlanes. + */ + public void setViewingPlanes(List regions) { + this.viewingPlanes = regions; + } + + /** + * Gets the currentPlane. + * @return The currentPlane. + */ + public RegionPlane getCurrentPlane() { + return currentPlane; + } + + /** + * Sets the currentPlane. + * @param currentPlane The currentPlane to set. + */ + public void setCurrentPlane(RegionPlane currentPlane) { + this.currentPlane = currentPlane; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/build/DynamicRegion.java b/Server/src/main/java/Server/core/game/world/map/build/DynamicRegion.java new file mode 100644 index 000000000..6076a9bfe --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/build/DynamicRegion.java @@ -0,0 +1,470 @@ +package core.game.world.map.build; + +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.music.MusicZone; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.object.GameObject; +import core.game.world.map.*; +import core.game.world.map.zone.RegionZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.map.zone.impl.MultiwayCombatZone; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + + +/** + * Represents a dynamically constructed region. + * + * @author Emperor + */ +public final class DynamicRegion extends Region { + + /** + * The reserved areas. + */ + private static final List RESERVED_AREAS = new ArrayList<>(); + + /** + * The region id of the copied region. + */ + private final int regionId; + + /** + * The region chunks. + */ + private final RegionChunk[][][] chunks; + + /** + * The zone borders. + */ + private ZoneBorders borders; + + /** + * If the dynamic region is a multiway combat zone. + */ + private boolean multicombat; + + /** + * If the region is permanent. + */ + private boolean permanent; + + /** + * An array of linked regions. + */ + private DynamicRegion[] linked; + + /** + * The parent region (used for linking regions). + */ + private DynamicRegion parentRegion; + + /** + * Constructs a new {@code DynamicRegion} {@code Object}. + * @param regionId The region id of the region to copy. + * @param x The x-coordinate. + * @param y The y-coordinate. + */ + public DynamicRegion(int regionId, int x, int y) { + super(x, y); + this.regionId = regionId; + this.chunks = new RegionChunk[4][SIZE >> 3][SIZE >> 3]; + } + + /** + * Creates a dynamic region copy of the region id. + * @param regionId The region id. + * @return The dynamic region. + */ + public static DynamicRegion create(int regionId) { + int x = (regionId >> 8) << 6; + int y = (regionId & 0xFF) << 6; + return create(new ZoneBorders(x, y, x + SIZE, y + SIZE))[0]; + } + + /** + * Creates a dynamic region copy of two regions and everything in between. + * @param regionOne The first region. + * @param regionTwo The second/last region. + * @return The new region. + */ + public static DynamicRegion create(int regionOne, int regionTwo) { + int x = (regionOne >> 8) << 6; + int y = (regionOne & 0xFF) << 6; + int x1 = (regionTwo >> 8) << 6; + int y1 = (regionTwo & 0xFF) << 6; + return create(new ZoneBorders(x, y, x1 + SIZE, y1 + SIZE))[0]; + } + + /** + * Copies the zone into a new dynamic region. + * @param copy The zone to copy. + * @return The dynamic region. + */ + public static DynamicRegion[] create(ZoneBorders copy) { + int baseX = copy.getSouthWestX() >> 6; + int baseY = copy.getSouthWestY() >> 6; + + ZoneBorders border = findZoneBorders((copy.getNorthEastX() - copy.getSouthWestX()) >> 3, (copy.getNorthEastY() - copy.getSouthWestY()) >> 3); + RESERVED_AREAS.add(border); + Location l = Location.create(border.getSouthWestX(), border.getSouthWestY(), 0); + List regions = new ArrayList<>(); + for (int x = copy.getSouthWestX() >> 6; x < copy.getNorthEastX() >> 6; x++) { + for (int y = copy.getSouthWestY() >> 6; y < copy.getNorthEastY() >> 6; y++) { + int regionId = x << 8 | y; + Location loc = l.transform((x - baseX) << 6, (y - baseY) << 6, 0); + DynamicRegion region = copy(regionId, loc); + region.setBorders(border); + Region r = RegionManager.getRegionCache().get(region.getId()); + if (r != null) { + for (int z = 0; z < 4; z++) { + region.getPlanes()[z].getPlayers().addAll(r.getPlanes()[z].getPlayers()); + region.getPlanes()[z].getNpcs().addAll(r.getPlanes()[z].getNpcs()); + } + } + RegionManager.getRegionCache().put(region.getId(), region); + regions.add(region); + } + } + for (Region r : regions) { + for (int z = 0; z < 4; z++) { + for (Player p : r.getPlanes()[z].getPlayers()) { + p.updateSceneGraph(false); + } + } + } + return regions.toArray(new DynamicRegion[regions.size()]); + } + + /** + * Finds and reserves borders for a new dynamic region area. + * @param sizeX The x-size of the region (in chunks). + * @param sizeY The y-size of the region (in chunks). + * @return The zone borders. + */ + public static ZoneBorders reserveArea(int sizeX, int sizeY) { + ZoneBorders borders = findZoneBorders(sizeX, sizeY); + RESERVED_AREAS.add(borders); + return borders; + } + + /** + * Finds free borders for a new dynamic region area. + * @param sizeX The x-size of the region (in chunks). + * @param sizeY The y-size of the region (in chunks). + * @return The zone borders. + */ + public static ZoneBorders findZoneBorders(int sizeX, int sizeY) { + int x = 0; + int y = 0; + int count = 0; + int width = (sizeX >> 3) << 6; + int height = (sizeY >> 3) << 6; + if (width < 64) { + width = 64; + } + if (height < 64) { + height = 64; + } + while (true) { + int endX = x + width; + int endY = y + height; + boolean reserved = false; + for (ZoneBorders b : RESERVED_AREAS) { + if (b.insideBorder(x, y) || b.insideBorder(endX, endY) + || b.insideBorder(x, endY) || b.insideBorder(endX, y)) { + reserved = true; + break; + } + } + if (!reserved) { + return new ZoneBorders(x, y, endX, endY); + } + if (++count % 15 == 0) { + y += 64; + x = 0; + } else { + x += 64; + } + } + } + + /** + * Copies (but does not initialize) a region. + * @param regionId The id of the region to copy. + * @param to The location to copy the region to. + * @return The {@code DynamicRegion} object. + */ + public static DynamicRegion copy(int regionId, Location to) { + int regionX = ((regionId >> 8) & 0xFF) << 6; + int regionY = (regionId & 0xFF) << 6; + DynamicRegion region = new DynamicRegion(regionId, to.getRegionX() >> 3, to.getRegionY() >> 3); + for (int offsetX = 0; offsetX < 8; offsetX++) { + for (int offsetY = 0; offsetY < 8; offsetY++) { + int x = regionX + (offsetX << 3); + int y = regionY + (offsetY << 3); + for (int plane = 0; plane < 4; plane++) { + RegionChunk c = region.chunks[plane][offsetX][offsetY]; + if (c == null) { + region.chunks[plane][offsetX][offsetY] = c = new RegionChunk(Location.create(0, 0, 0), 0, region.getPlanes()[plane]); + } + c.setRotation(0); + c.setBase(Location.create(x, y, plane)); + } + } + } + return region; + } + + /** + * Links regions with this region as parent region. + * @param regions The regions to link. + * @warning This region will be flagged as active! + */ + public void link(DynamicRegion...regions) { + for (DynamicRegion r : regions) { + r.parentRegion = this; + } + this.linked = regions; + flagActive(); + } + + /** + * Toggles the multiway combat flag. + */ + public void toggleMulticombat() { + if (multicombat) { + for (Iterator it = getRegionZones().iterator(); it.hasNext();) { + if (it.next().getZone() == MultiwayCombatZone.getInstance()) { + it.remove(); + } + } + multicombat = false; + return; + } + getRegionZones().add(new RegionZone(MultiwayCombatZone.getInstance(), borders)); + multicombat = true; + } + + /** + * Sets the music id for this region. + * @param musicId The music id. + */ + public void setMusicId(int musicId) { + getMusicZones().add(new MusicZone(musicId, borders)); + } + + /** + * Rotates the region 90% clockwise. + * TODO: Finish this + */ + public void rotate() { + for (int z = 0; z < 4; z++) { + RegionChunk[][] c = Arrays.copyOf(chunks[z], 8); + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + RegionChunk r = chunks[z][x][y] = c[8 - y - 1][x]; + if (r != null) { + r.setRotation(r.getRotation() + 1); + } + } + } + } + } + + /** + * Sets a region chunk (without setting objects/clipping flags). + * @param z The plane. + * @param x The chunk x (0-8). + * @param y The chunk y (0-8). + * @param chunk The chunk to set. + */ + public void setChunk(int z, int x, int y, RegionChunk chunk) { + chunks[z][x][y] = chunk; + getPlanes()[z].getChunks()[x][y] = chunk; + if (chunk != null) { + chunk.setCurrentBase(getBaseLocation().transform(x << 3, y << 3, 0)); + } + } + + /** + * Replaces a region chunk. + * @param z The plane. + * @param x The x-coordinate of the chunk. (0-7) + * @param y The y-coordinate of the chunk. (0-7) + * @param chunk The chunk to replace with. + * @param fromRegion The region the chunk is copied from. + */ + public void replaceChunk(int z, int x, int y, RegionChunk chunk, Region fromRegion) { + Region.load(DynamicRegion.this); + RegionPlane p = getPlanes()[z]; + chunks[z][x][y] = chunk; + p.getChunks()[x][y] = chunk; + if (chunk == null) { + for (int i = x << 3; i < (x + 1) << 3; i++) { + for (int j = y << 3; j < (y + 1) << 3; j++) { + p.getFlags().getClippingFlags()[i][j] = -1; + p.getProjectileFlags().getClippingFlags()[i][j] = -1; + GameObject object = p.getObjects()[i][j]; + if (object != null) { + LandscapeParser.removeGameObject(object); + } else { + p.add(null, i, j, true); + } + } + } + } else { + chunk.clear(); + Region.load(fromRegion); + Location l = chunk.getBase(); + chunk.setCurrentBase(getBaseLocation().transform(x << 3, y << 3, 0)); + Location regionBase = fromRegion.getBaseLocation(); + RegionPlane rp = fromRegion.getPlanes()[l.getZ()]; + for (int i = 0; i < 8; i++) { + for (int j = 0; j < 8; j++) { + int toX = (x << 3) + i; + int toY = (y << 3) + j; + int fromX = (l.getX() - regionBase.getX()) + i; + int fromY = (l.getY() - regionBase.getY()) + j; + p.getFlags().getLandscape()[toX][toY] = rp.getFlags().getLandscape()[fromX][fromY]; + p.getFlags().getClippingFlags()[toX][toY] = rp.getFlags().getClippingFlags()[fromX][fromY]; + p.getProjectileFlags().getClippingFlags()[toX][toY] = rp.getProjectileFlags().getClippingFlags()[fromX][fromY]; + GameObject[] objects = { rp.getChunkObject(fromX, fromY) }; + RegionChunk ch = rp.getChunks()[fromX >> 3][fromY >> 3]; + if (ch instanceof BuildRegionChunk) { + BuildRegionChunk bc = (BuildRegionChunk) ch; + objects = new GameObject[BuildRegionChunk.ARRAY_SIZE]; + for (int k = 0; k < objects.length; k++) { + objects[k] = bc.get(i, j, k); + } + } + for (GameObject object : objects) { + if (object != null) { + object = object.transform(object.getId(), object.getRotation(), getBaseLocation().transform(toX, toY, 0)); + LandscapeParser.flagGameObject(p, toX, toY, object, false, true);//chunk instanceof BuildRegionChunk);//.addGameObject(object, true); + } else { + p.add(null, toX, toY, true); + } + } + } + } + + } + } + + @Override + public void flagInactive() { + if (!permanent) { + if (parentRegion != null && parentRegion.isActive()) { + parentRegion.checkInactive(); + return; + } + if (linked != null) { + for (DynamicRegion r : linked) { + if (!r.isInactive(false)) { + return; + } + } + } + super.flagInactive(); + for (RegionPlane plane : getPlanes()) { + for (int i = 0; i < plane.getNpcs().size(); i++) { + NPC npc = plane.getNpcs().get(0); + npc.clear(); + } + for (RegionChunk[] chunks : getChunks()[plane.getPlane()]) { + for (RegionChunk chunk : chunks) { + if (chunk != null) { + for (Iterator it = chunk.getItems().iterator(); it.hasNext();) { + GroundItemManager.getItems().remove(it.next()); + } + } + } + } + } + RESERVED_AREAS.remove(borders); + if (multicombat) { + toggleMulticombat(); + } + if (linked != null) { + for (DynamicRegion r : linked) { + r.flagInactive(); + } + } + } + } + + @Override + public int getRegionId() { + return regionId; + } + + /** + * Gets the chunks. + * @return The chunks. + */ + public RegionChunk[][][] getChunks() { + return chunks; + } + + /** + * Gets the borders. + * @return The borders. + */ + public ZoneBorders getBorders() { + return borders; + } + + /** + * Sets the borders. + * @param borders The borders to set. + */ + public void setBorders(ZoneBorders borders) { + this.borders = borders; + } + + /** + * Gets the multicombat. + * @return The multicombat. + */ + public boolean isMulticombat() { + return multicombat; + } + + /** + * Sets the multicombat. + * @param multicombat The multicombat to set. + */ + public void setMulticombat(boolean multicombat) { + this.multicombat = multicombat; + } + + /** + * Gets the permanent value. + * @return The permanent. + */ + public boolean isPermanent() { + return permanent; + } + + /** + * Sets the permanent value. + * @param permanent The permanent to set. + */ + public void setPermanent(boolean permanent) { + this.permanent = permanent; + } + + /** + * Gets the parentRegion value. + * @return The parentRegion. + */ + public DynamicRegion getParent() { + return parentRegion; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/build/LandscapeParser.java b/Server/src/main/java/Server/core/game/world/map/build/LandscapeParser.java new file mode 100644 index 000000000..6b6529dd5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/build/LandscapeParser.java @@ -0,0 +1,217 @@ +package core.game.world.map.build; + +import core.cache.def.impl.ObjectDefinition; +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.map.Region; +import core.game.world.map.RegionManager; +import core.game.world.map.RegionPlane; + +import java.nio.ByteBuffer; + +/** + * A utility class used for parsing landscapes. + * @author Emperor + * + */ +public final class LandscapeParser { + + /** + * Parses the landscape. + * @param r The region. + * @param mapscape The mapscape data. + * @param storeObjects If all objects should be stored (rather than just the objects with options). + */ + public static void parse(Region r, byte[][][] mapscape, ByteBuffer buffer, boolean storeObjects) { + int objectId = -1; + for (;;) { + int offset = ByteBufferUtils.getBigSmart(buffer); + if (offset == 0) { + break; + } + objectId += offset; + int location = 0; + for (;;) { + offset = ByteBufferUtils.getSmart(buffer); + if (offset == 0) { + break; + } + location += offset - 1; + int y = location & 0x3f; + int x = location >> 6 & 0x3f; + int configuration = buffer.get() & 0xFF; + int rotation = configuration & 0x3; + int type = configuration >> 2; + int z = location >> 12; + r.setObjectCount(r.getObjectCount() + 1); + if (x >= 0 && y >= 0 && x < 64 && y < 64) { + if ((mapscape[1][x][y] & 0x2) == 2) { + z--; + } + if (z >= 0 && z <= 3) { + GameObject object = new GameObject(objectId, Location.create((r.getX() << 6) + x, (r.getY() << 6) + y, z), type, rotation); + flagGameObject(r.getPlanes()[z], x, y, object, true, storeObjects); + } + } else { + System.out.println("Object out of bounds: " + objectId + " - " + x + ", " + y + ", " + z); + } + } + } + } + + /** + * Adds a game object temporarily. + * @param object The object to add. + */ + public static void addGameObject(GameObject object) { + addGameObject(object, false); + } + + /** + * Adds a game object. + * @param object The object to add. + * @param landscape If the object should be added permanent. + */ + public static void addGameObject(GameObject object, boolean landscape) { + Location l = object.getLocation(); + flagGameObject(RegionManager.getRegionPlane(l), l.getLocalX(), l.getLocalY(), object, landscape, false); + } + + /** + * Flags a game object on the plane's clipping flags. + * @param plane The plane. + * @param object The object. + * @param landscape If we are adding this game object permanent. + * @param storeObjects If all objects should be stored (rather than just the objects with options). + */ + public static void flagGameObject(RegionPlane plane, int localX, int localY, GameObject object, boolean landscape, boolean storeObjects) { + Region.load(plane.getRegion()); + ObjectDefinition def = object.getDefinition(); + int sizeX; + int sizeY; + if (object.getRotation() % 2 == 0) { + sizeX = def.sizeX; + sizeY = def.sizeY; + } else { + sizeX = def.sizeY; + sizeY = def.sizeX; + } + + object.setActive(true); + boolean add = storeObjects || !landscape || def.getChildObject(null).hasActions(); + if (add) { + addPlaneObject(plane, object, localX, localY, landscape, storeObjects); + } + // if (localX == 34 && localY == 32 && plane.getRegion().getId() == 14746) { + // System.out.println(object + ", " + Arrays.toString(object.getDefinition().getOptions()) + ", " + object.getDefinition().projectileClipped); + // } + int type = object.getType(); + if (type == 22) { //Tile + plane.getFlags().getLandscape()[localX][localY] = true; + if (def.secondInt != 0 || def.clipType == 1 || def.secondBool) { + if (def.clipType == 1) { + plane.getFlags().flagTileObject(localX, localY); + if (def.isProjectileClipped()) { + plane.getProjectileFlags().flagTileObject(localX, localY); + } + } + } + } else if (type >= 9) { //Default objects + if (def.clipType != 0) { + plane.getFlags().flagSolidObject(localX, localY, sizeX, sizeY, def.projectileClipped); + if (def.isProjectileClipped()) { + plane.getProjectileFlags().flagSolidObject(localX, localY, sizeX, sizeY, def.projectileClipped); + } + } + } else if (type >= 0 && type <= 3) { //Doors/walls + if (def.clipType != 0) { + plane.getFlags().flagDoorObject(localX, localY, object.getRotation(), type, def.projectileClipped); + if (def.isProjectileClipped()) { + plane.getProjectileFlags().flagDoorObject(localX, localY, object.getRotation(), type, def.projectileClipped); + } + } + } else { + return; + } + if (!storeObjects && !add && (!def.getChildObject(null).getName().equals("null"))) { + addPlaneObject(plane, object, localX, localY, landscape, false); + } + } + + /** + * Adds an object to the region plane. + * @param plane The region plane. + * @param object The object to add. + * @param localX The local x-coordinate. + * @param localY The local y-coordinate. + * @param landscape The landscape. + */ + private static void addPlaneObject(RegionPlane plane, GameObject object, int localX, int localY, boolean landscape, boolean storeAll) { + if (landscape && !storeAll) { + GameObject current = plane.getObjects()[localX][localY]; + if (current != null && current.getDefinition().getChildObject(null).hasOptions(!object.getDefinition().getChildObject(null).hasOptions(false))) { + return; + } + } + plane.add(object, localX, localY, landscape && !storeAll); + } + + /** + * Removes a game object. + * @param object The object. + * @return The removed game object. + */ + public static GameObject removeGameObject(GameObject object) { + if (!object.isRenderable()) { + return null; + } + RegionPlane plane = RegionManager.getRegionPlane(object.getLocation()); + Region.load(plane.getRegion()); + int localX = object.getLocation().getLocalX(); + int localY = object.getLocation().getLocalY(); + GameObject current = plane.getChunkObject(localX, localY, object.getId()); + if (current == null || current.getId() != object.getId()) { + return null; + } + current.setActive(false); + object.setActive(false); + plane.remove(localX, localY, object.getId()); + ObjectDefinition def = object.getDefinition(); + int sizeX; + int sizeY; + if (object.getRotation() % 2 == 0) { + sizeX = def.sizeX; + sizeY = def.sizeY; + } else { + sizeX = def.sizeY; + sizeY = def.sizeX; + } + int type = object.getType(); + if (type == 22) { //Tile + if (def.secondInt != 0 || def.clipType == 1 || def.secondBool) { + if (def.clipType == 1) { + plane.getFlags().unflagTileObject(localX, localY); + if (def.isProjectileClipped()) { + plane.getProjectileFlags().unflagTileObject(localX, localY); + } + } + } + } else if (type >= 9) { //Default objects + if (def.clipType != 0) { + plane.getFlags().unflagSolidObject(localX, localY, sizeX, sizeY, def.projectileClipped); + if (def.isProjectileClipped()) { + plane.getProjectileFlags().unflagSolidObject(localX, localY, sizeX, sizeY, def.projectileClipped); + } + } + } else if (type >= 0 && type <= 3) { //Doors/walls + if (def.clipType != 0) { + plane.getFlags().unflagDoorObject(localX, localY, object.getRotation(), type, def.projectileClipped); + if (def.isProjectileClipped()) { + plane.getProjectileFlags().unflagDoorObject(localX, localY, object.getRotation(), type, def.projectileClipped); + } + } + } + return current; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/build/MapscapeParser.java b/Server/src/main/java/Server/core/game/world/map/build/MapscapeParser.java new file mode 100644 index 000000000..896a464ee --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/build/MapscapeParser.java @@ -0,0 +1,76 @@ +package core.game.world.map.build; + +import core.game.world.map.Region; + +import java.nio.ByteBuffer; + +/** + * A utility class used for parsing mapscapes. + * @author Emperor + * + */ +public final class MapscapeParser { + + /** + * Parses the mapscape buffer. + * @param r The region. + * @param buffer The buffer. + */ + public static void parse(Region r, byte[][][] mapscape, ByteBuffer buffer) { + for (int z = 0; z < 4; z++) { + boolean[][] landscape = r.getPlanes()[z].getFlags().getLandscape(); + for (int x = 0; x < 64; x++) { + for (int y = 0; y < 64; y++) { + while (true) { + int value = buffer.get() & 0xFF; + if (value == 0) { + break; + } + if (value == 1) { + buffer.get(); + break; + } + if (value <= 49) { //Overlay data + int val = buffer.get() & 0xFF; + if (val != 42 && val > 0) { + landscape[x][y] = true; + } + } + else if (value <= 81) { + mapscape[z][x][y] = (byte) (value - 49); + } + else { + int val = (byte) (value - 81) & 0xFF; //Underlay data + if (val != 42 && val > 0) { + landscape[x][y] = true; + } + } + } + } + } + } + } + + /** + * Clips the mapscape. + * @param r The region. + * @param mapscape The mapscape. + */ + public static void clipMapscape(Region r, byte[][][] mapscape) { + for (int z = 0; z < 4; z++) { + for (int x = 0; x < 64; x++) { + for (int y = 0; y < 64; y++) { + if ((mapscape[z][x][y] & 0x1) == 1) { + int plane = z; + if ((mapscape[1][x][y] & 0x2) == 2) { + plane--; + } + if (plane > -1) { + r.getPlanes()[plane].getFlags().flagSolidTile(x, y); + } + } + } + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/build/RegionFlags.java b/Server/src/main/java/Server/core/game/world/map/build/RegionFlags.java new file mode 100644 index 000000000..131407bca --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/build/RegionFlags.java @@ -0,0 +1,530 @@ +package core.game.world.map.build; + +import core.game.world.map.RegionManager; + +/** + * Holds a region's flags like clipping flags, members, ... + * @author Emperor + * + */ +public final class RegionFlags { + + /** + * The plane. + */ + private final int plane; + + /** + * If the region is members only. + */ + private boolean members; + + /** + * The base x-coordinate. + */ + private final int baseX; + + /** + * The base y-coordinate. + */ + private final int baseY; + + /** + * The clipping flags. + */ + private int[][] clippingFlags; + + /** + * The landscape data. + */ + private boolean[][] landscape; + + /** + * If the flags are set for projectile clipping + */ + private boolean projectile; + + /** + * Constructs a new {@code RegionFlags} {@code Object}. + * @param x The base x-coordinate (absolute). + * @param y The base y-coordinate (absolute). + */ + public RegionFlags(int plane, int x, int y) { + this(plane, x, y, false); + } + + /** + * Constructs a new {@code RegionFlags} {@code Object}. + * @param x The base x-coordinate (absolute). + * @param y The base y-coordinate (absolute). + */ + public RegionFlags(int plane, int x, int y, boolean projectile) { + this.plane = plane; + this.baseX = x; + this.baseY = y; + this.projectile = projectile; + } + + /** + * Flags a solid tile. + * @param x The x-coordinate. + * @param y The y-coordinate. + */ + public void flagSolidTile(int x, int y) { + clippingFlags[x][y] |= 0x200000; + } + + /** + * Flags a tile object (object type 22). + * @param x The x-coordinate. + * @param y The y-coordinate. + */ + public void flagTileObject(int x, int y) { + clippingFlags[x][y] |= 0x40000; + } + + /** + * Unflags a tile object. + * @param x The x-coordinate. + * @param y The y-coordinate. + */ + public void unflagTileObject(int x, int y) { + if (clippingFlags == null) { + return; + } + if ((clippingFlags[x][y] & 0x40000) != 0) { + clippingFlags[x][y] &= ~0x40000; + } + } + + /** + * Flags a solid object (type 10/11). + * @param x The x-coordinate + * @param y The y-coordinate. + * @param sizeX The x-size of the object. + * @param sizeY The y-size of the object. + * @param projectileClipped If the object is solid. + */ + public void flagSolidObject(int x, int y, int sizeX, int sizeY, boolean projectileClipped) { + int clipdata = 0x100; + if (projectileClipped) { + clipdata += 0x20000; + } + for (int i = x; i < x + sizeX; i++) { + for (int j = y; j < y + sizeY; j++) { + flag(i, j, clipdata); + } + } + } + + /** + * Adds a flag. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param clipdata The clip data. + */ + public void flag(int x, int y, int clipdata) { + if (x > -1 && x < 64 && y > -1 && y < 64) { + clippingFlags[x][y] |= clipdata; + } else { + RegionManager.addClippingFlag(plane, baseX + x, baseY + y, projectile, clipdata); + } + } + + + /** + * Unflags a solid object (type 10/11). + * @param x The x-coordinate + * @param y The y-coordinate. + * @param sizeX The x-size of the object. + * @param sizeY The y-size of the object. + * @param projectileClipped If the object is solid. + */ + public void unflagSolidObject(int x, int y, int sizeX, int sizeY, boolean projectileClipped) { + int clipdata = 0x100; + if (projectileClipped) { + clipdata += 0x20000; + } + for (int i = x; i < x + sizeX; i++) { + for (int j = y; j < y + sizeY; j++) { + unflag(i, j, clipdata); + } + } + } + + /** + * Removes a flag. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param clipdata The clip data. + */ + public void unflag(int x, int y, int clipdata) { + if (clippingFlags == null) { + return; + } + if (x > -1 && x < 64 && y > -1 && y < 64) { + if ((clippingFlags[x][y] & clipdata) != 0) { + clippingFlags[x][y] &= ~clipdata; + } + } else { + RegionManager.removeClippingFlag(plane, baseX + x, baseY + y, projectile, clipdata); + } + } + + /** + * Flags a door object (type 0-3). + * @param x The x-coordinate + * @param y The y-coordinate. + * @param rotation The rotation. + * @param type The type. + * @param projectileClipped If the door is solid. + */ + public void flagDoorObject(int x, int y, int rotation, int type, boolean projectileClipped) { + switch (type) { + case 0: + switch (rotation) { + case 0: + flag(x, y, 0x80); + flag(x - 1, y, 0x8); + break; + case 1: + flag(x, y, 0x2); + flag(x, y + 1, 0x20); + break; + case 2: + flag(x, y, 0x8); + flag(x + 1, y, 0x80); + break; + case 3: + flag(x, y, 0x20); + flag(x, y - 1, 0x2); + break; + } + break; + case 1: + case 3: + switch (rotation) { + case 0: + flag(x, y, 0x1); + flag(x - 1, y + 1, 0x10); + break; + case 1: + flag(x, y, 0x4); + flag(x + 1, y + 1, 0x40); + break; + case 2: + flag(x, y, 0x10); + flag(x + 1, y - 1, 0x1); + break; + case 3: + flag(x, y, 0x40); + flag(x - 1, y - 1, 0x4); + break; + } + break; + case 2: + switch (rotation) { + case 0: + flag(x, y, 0x82); + flag(x - 1, y, 0x8); + flag(x, y + 1, 0x20); + break; + case 1: + flag(x, y, 0xA); + flag(x, y + 1, 0x20); + flag(x + 1, y, 0x80); + break; + case 2: + flag(x, y, 0x28); + flag(x + 1, y, 0x80); + flag(x, y - 1, 0x2); + break; + case 3: + flag(x, y, 0xA0); + flag(x, y - 1, 0x2); + flag(x - 1, y, 0x8); + break; + } + break; + } + if (projectileClipped) { + switch (type) { + case 0: + switch (rotation) { + case 0: + flag(x, y, 0x10000); + flag(x - 1, y, 0x1000); + break; + case 1: + flag(x, y, 0x400); + flag(x, y + 1, 0x4000); + break; + case 2: + flag(x, y, 0x1000); + flag(x + 1, y, 0x10000); + break; + case 3: + flag(x, y, 0x4000); + flag(x, y - 1, 0x400); + break; + } + break; + case 1: + case 3: + switch (rotation) { + case 0: + flag(x, y, 0x200); + flag(x - 1, y + 1, 0x2000); + break; + case 1: + flag(x, y, 0x800); + flag(x + 1, y + 1, 0x8000); + break; + case 2: + flag(x, y, 0x2000); + flag(x + 1 , y - 1, 0x200); + break; + case 3: + flag(x, y, 0x8000); + flag(x - 1, y - 1, 0x800); + break; + } + break; + case 2: + switch (rotation) { + case 0: + flag(x, y, 0x10400); + flag(x - 1, y, 0x1000); + flag(x, y + 1, 0x4000); + break; + case 1: + flag(x, y, 0x1400); + flag(x, y + 1, 0x4000); + flag(x + 1, y, 0x10000); + break; + case 2: + flag(x, y, 0x5000); + flag(x + 1, y, 0x10000); + flag(x, y - 1, 0x400); + break; + case 3: + flag(x, y, 0x14000); + flag(x, y - 1, 0x400); + flag(x - 1, y, 0x1000); + break; + } + break; + } + } + } + + /** + * Unlags a door object (type 0-3). + * @param x The x-coordinate + * @param y The y-coordinate. + * @param rotation The rotation. + * @param type The type. + * @param projectileClipped If the door is solid. + */ + public void unflagDoorObject(int x, int y, int rotation, int type, boolean projectileClipped) { + switch (type) { + case 0: + switch (rotation) { + case 0: + unflag(x, y, 0x80); + unflag(x - 1, y, 0x8); + break; + case 1: + unflag(x, y, 0x2); + unflag(x, y + 1, 0x20); + break; + case 2: + unflag(x, y, 0x8); + unflag(x + 1, y, 0x80); + break; + case 3: + unflag(x, y, 0x20); + unflag(x, y - 1, 0x2); + break; + } + break; + case 1: + case 3: + switch (rotation) { + case 0: + unflag(x, y, 0x1); + unflag(x - 1, y + 1, 0x10); + break; + case 1: + unflag(x, y, 0x4); + unflag(x + 1, y + 1, 0x40); + break; + case 2: + unflag(x, y, 0x10); + unflag(x + 1, y - 1, 0x1); + break; + case 3: + unflag(x, y, 0x40); + unflag(x - 1, y - 1, 0x4); + break; + } + break; + case 2: + switch (rotation) { + case 0: + unflag(x, y, 0x82); + unflag(x - 1, y, 0x8); + unflag(x, y + 1, 0x20); + break; + case 1: + unflag(x, y, 0xA); + unflag(x, y + 1, 0x20); + unflag(x + 1, y, 0x80); + break; + case 2: + unflag(x, y, 0x28); + unflag(x + 1, y, 0x80); + unflag(x, y - 1, 0x2); + break; + case 3: + unflag(x, y, 0xA0); + unflag(x, y - 1, 0x2); + unflag(x - 1, y, 0x8); + break; + } + break; + } + if (projectileClipped) { + switch (type) { + case 0: + switch (rotation) { + case 0: + unflag(x, y, 0x10000); + unflag(x - 1, y, 0x1000); + break; + case 1: + unflag(x, y, 0x400); + unflag(x, y + 1, 0x4000); + break; + case 2: + unflag(x, y, 0x1000); + unflag(x + 1, y, 0x10000); + break; + case 3: + unflag(x, y, 0x4000); + unflag(x, y - 1, 0x400); + break; + } + break; + case 1: + case 3: + switch (rotation) { + case 0: + unflag(x, y, 0x200); + unflag(x - 1, y + 1, 0x2000); + break; + case 1: + unflag(x, y, 0x800); + unflag(x + 1, y + 1, 0x8000); + break; + case 2: + unflag(x, y, 0x2000); + unflag(x + 1 , y - 1, 0x200); + break; + case 3: + unflag(x, y, 0x8000); + unflag(x - 1, y - 1, 0x800); + break; + } + break; + case 2: + switch (rotation) { + case 0: + unflag(x, y, 0x10400); + unflag(x - 1, y, 0x1000); + unflag(x, y + 1, 0x4000); + break; + case 1: + unflag(x, y, 0x1400); + unflag(x, y + 1, 0x4000); + unflag(x + 1, y, 0x10000); + break; + case 2: + unflag(x, y, 0x5000); + unflag(x + 1, y, 0x10000); + unflag(x, y - 1, 0x400); + break; + case 3: + unflag(x, y, 0x14000); + unflag(x, y - 1, 0x400); + unflag(x - 1, y, 0x1000); + break; + } + break; + } + } + } + + /** + * Unloads the clipping flags. + */ + public void unload() { + clippingFlags = null; + } + + /** + * Gets the members. + * @return The members. + */ + public boolean isMembers() { + return members; + } + + /** + * Sets the members. + * @param members The members to set. + */ + public void setMembers(boolean members) { + this.members = members; + } + + /** + * Gets the clippingFlags. + * @return The clippingFlags. + */ + public int[][] getClippingFlags() { + return clippingFlags; + } + + /** + * Sets the clippingFlags. + * @param clippingFlags The clippingFlags to set. + */ + public void setClippingFlags(int[][] clippingFlags) { + this.clippingFlags = clippingFlags; + } + + /** + * Gets the plane. + * @return The plane. + */ + public int getPlane() { + return plane; + } + + /** + * Gets the landscape. + * @return The landscape. + */ + public boolean[][] getLandscape() { + return landscape; + } + + /** + * Sets the landscape. + * @param landscape The landscape to set. + */ + public void setLandscape(boolean[][] landscape) { + this.landscape = landscape; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/path/ClipMaskSupplier.java b/Server/src/main/java/Server/core/game/world/map/path/ClipMaskSupplier.java new file mode 100644 index 000000000..346f5c0bf --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/path/ClipMaskSupplier.java @@ -0,0 +1,7 @@ +package core.game.world.map.path; + +@FunctionalInterface +public interface ClipMaskSupplier { + + int getClippingFlag(int z, int x, int y); +} diff --git a/Server/src/main/java/Server/core/game/world/map/path/DumbPathfinder.java b/Server/src/main/java/Server/core/game/world/map/path/DumbPathfinder.java new file mode 100644 index 000000000..e4b8e6d5e --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/path/DumbPathfinder.java @@ -0,0 +1,430 @@ +package core.game.world.map.path; + +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.Point; + +import java.util.ArrayList; +import java.util.List; + +/** + * A pathfinder implementation used for an easy path, where the pathfinder won't + * find a way around clipped objects..
This is used for NPC combat + * following, NPC random movement, etc. + * @author Emperor + */ +public final class DumbPathfinder extends Pathfinder { + + /** + * If a path can be found. + */ + private boolean found; + + /** + * The plane. + */ + private int z; + + /** + * The x-coordinate. + */ + private int x; + + /** + * The y-coordinate. + */ + private int y; + + @Override + public Path find(Location start, int size, Location end, int sizeX, int sizeY, int rotation, int type, int walkingFlag, boolean near, ClipMaskSupplier clipMaskSupplier) { + Path path = new Path(); + z = start.getZ(); + x = start.getX(); + y = start.getY(); + List points = new ArrayList<>(); + path.setSuccesful(true); + while (x != end.getX() || y != end.getY()) { + Direction[] directions = getDirection(x, y, end); + if (type != 0) { + if ((type < 5 || type == 10) && canDoorInteract(x, y, size, end.getX(), end.getY(), type - 1, rotation, z, clipMaskSupplier)) { + break; + } + if (type < 10 && canDecorationInteract(x, y, size, end.getX(), end.getY(), type - 1, rotation, z, clipMaskSupplier)) { + break; + } + } + if (sizeX != 0 && sizeY != 0) { + if (canInteract(x, y, size, end.getX(), end.getY(), sizeX, sizeY, walkingFlag, z, clipMaskSupplier)) { + break; + } + if (directions.length > 1) { // Ensures we approach the location + // correctly (non-diagonal). + Direction dir = directions[0]; + if (x + dir.getStepX() == end.getX() && y + dir.getStepY() == end.getY()) { + directions[0] = directions[directions.length - 1]; + directions[directions.length - 1] = dir; + } + } + } + found = true; + if (size < 2) { + checkSingleTraversal(points, clipMaskSupplier, directions); + } else if (size == 2) { + checkDoubleTraversal(points, clipMaskSupplier, directions); + } else { + checkVariableTraversal(points, directions, size, clipMaskSupplier); + } + if (!found) { + path.setMoveNear(x != start.getX() || y != start.getY()); + path.setSuccesful(false); + break; + } + } + if (!points.isEmpty()) { + Direction last = null; + for (int i = 0; i < points.size() - 1; i++) { + Point p = points.get(i); + if (p.getDirection() != last) { + path.getPoints().add(p); + } + } + path.getPoints().add(points.get(points.size() - 1)); + } + return path; + } + + /** + * Checks traversal for a size 1 entity. + * @param points The points list. + * @param directions The directions. + */ + private void checkSingleTraversal(List points, ClipMaskSupplier clipMaskSupplier, Direction... directions) { + for (Direction dir : directions) { + found = true; + switch (dir) { + case NORTH: + if ((clipMaskSupplier.getClippingFlag(z, x, y + 1) & 0x12c0120) != 0) { + found = false; + break; + } + points.add(new Point(x, y + 1, dir)); + y++; + break; + case NORTH_EAST: + if ((clipMaskSupplier.getClippingFlag(z, x + 1, y) & 0x12c0180) != 0 || (clipMaskSupplier.getClippingFlag(z, x, y + 1) & 0x12c0120) != 0 || (clipMaskSupplier.getClippingFlag(z, x + 1, y + 1) & 0x12c01e0) != 0) { + found = false; + break; + } + points.add(new Point(x + 1, y + 1, dir)); + x++; + y++; + break; + case EAST: + if ((clipMaskSupplier.getClippingFlag(z, x + 1, y) & 0x12c0180) != 0) { + found = false; + break; + } + points.add(new Point(x + 1, y, dir)); + x++; + break; + case SOUTH_EAST: + if ((clipMaskSupplier.getClippingFlag(z, x + 1, y) & 0x12c0180) != 0 || (clipMaskSupplier.getClippingFlag(z, x, y - 1) & 0x12c0102) != 0 || (clipMaskSupplier.getClippingFlag(z, x + 1, y - 1) & 0x12c0183) != 0) { + found = false; + break; + } + points.add(new Point(x + 1, y - 1, dir)); + x++; + y--; + break; + case SOUTH: + if ((clipMaskSupplier.getClippingFlag(z, x, y - 1) & 0x12c0102) != 0) { + found = false; + break; + } + points.add(new Point(x, y - 1, dir)); + y--; + break; + case SOUTH_WEST: + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y) & 0x12c0108) != 0 || (clipMaskSupplier.getClippingFlag(z, x, y - 1) & 0x12c0102) != 0 || (clipMaskSupplier.getClippingFlag(z, x - 1, y - 1) & 0x12c010e) != 0) { + found = false; + break; + } + points.add(new Point(x - 1, y - 1, dir)); + x--; + y--; + break; + case WEST: + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y) & 0x12c0108) != 0) { + found = false; + break; + } + points.add(new Point(x - 1, y, dir)); + x--; + break; + case NORTH_WEST: + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y) & 0x12c0108) != 0 || (clipMaskSupplier.getClippingFlag(z, x, y + 1) & 0x12c0120) != 0 || (clipMaskSupplier.getClippingFlag(z, x - 1, y + 1) & 0x12c0138) != 0) { + found = false; + break; + } + points.add(new Point(x - 1, y + 1, dir)); + x--; + y++; + break; + } + if (found) { + break; + } + } + } + + /** + * Checks traversal for a size 1 entity. + * @param points The points list. + * @param directions The directions. + */ + private void checkDoubleTraversal(List points, ClipMaskSupplier clipMaskSupplier, Direction... directions) { + for (Direction dir : directions) { + found = true; + switch (dir) { + case NORTH: + if ((clipMaskSupplier.getClippingFlag(z, x, y + 2) & 0x12c0138) != 0 || (clipMaskSupplier.getClippingFlag(z, x + 1, y + 2) & 0x12c01e0) != 0) { + found = false; + break; + } + points.add(new Point(x, y + 1, dir)); + y++; + break; + case NORTH_EAST: + if ((clipMaskSupplier.getClippingFlag(z, x + 1, y + 2) & 0x12c0138) != 0 || (clipMaskSupplier.getClippingFlag(z, x + 2, y + 2) & 0x12c01e0) != 0 || (clipMaskSupplier.getClippingFlag(z, x + 2, y + 1) & 0x12c0183) != 0) { + found = false; + break; + } + points.add(new Point(x + 1, y + 1, dir)); + x++; + y++; + break; + case EAST: + if ((clipMaskSupplier.getClippingFlag(z, x + 2, y) & 0x12c0183) != 0 || (clipMaskSupplier.getClippingFlag(z, x + 2, y + 1) & 0x12c01e0) != 0) { + found = false; + break; + } + points.add(new Point(x + 1, y, dir)); + x++; + break; + case SOUTH_EAST: + if ((clipMaskSupplier.getClippingFlag(z, x + 1, y - 1) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x + 2, y) & 0x12c01e0) != 0 || (clipMaskSupplier.getClippingFlag(z, x + 2, y - 1) & 0x12c0183) != 0) { + found = false; + break; + } + points.add(new Point(x + 1, y - 1, dir)); + x++; + y--; + break; + case SOUTH: + if ((clipMaskSupplier.getClippingFlag(z, x, y - 1) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x + 1, y - 1) & 0x12c0183) != 0) { + found = false; + break; + } + points.add(new Point(x, y - 1, dir)); + y--; + break; + case SOUTH_WEST: + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y - 1) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x - 1, y) & 0x12c0138) != 0 || (clipMaskSupplier.getClippingFlag(z, x, y - 1) & 0x12c0183) != 0) { + found = false; + break; + } + points.add(new Point(x - 1, y - 1, dir)); + x--; + y--; + break; + case WEST: + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x - 1, y + 1) & 0x12c0138) != 0) { + found = false; + break; + } + points.add(new Point(x - 1, y, dir)); + x--; + break; + case NORTH_WEST: + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y + 1) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x - 1, y + 2) & 0x12c0138) != 0 || (clipMaskSupplier.getClippingFlag(z, x, y + 2) & 0x12c01e0) != 0) { + found = false; + break; + } + points.add(new Point(x - 1, y + 1, dir)); + x--; + y++; + break; + } + if (found) { + break; + } + } + } + + /** + * Checks traversal for variable size entities. + * @param points The points list. + * @param directions The directions to check. + * @param size The mover size. + */ + private void checkVariableTraversal(List points, Direction[] directions, int size, ClipMaskSupplier clipMaskSupplier) { + for (Direction dir : directions) { + found = true; + roar: switch (dir) { + case NORTH: + if ((clipMaskSupplier.getClippingFlag(z, x, y + size) & 0x12c0138) != 0 || (clipMaskSupplier.getClippingFlag(z, x + (size - 1), y + size) & 0x12c01e0) != 0) { + found = false; + break; + } + for (int i = 1; i < size - 1; i++) { + if ((clipMaskSupplier.getClippingFlag(z, x + i, y + size) & 0x12c01f8) != 0) { + found = false; + break roar; + } + } + points.add(new Point(x, y + 1, dir)); + y++; + break; + case NORTH_EAST: + if ((clipMaskSupplier.getClippingFlag(z, x + 1, y + size) & 0x12c0138) != 0 || (clipMaskSupplier.getClippingFlag(z, x + size, y + size) & 0x12c01e0) != 0 || (clipMaskSupplier.getClippingFlag(z, x + size, y + 1) & 0x12c0183) != 0) { + found = false; + break; + } + for (int i = 1; i < size - 1; i++) { + if ((clipMaskSupplier.getClippingFlag(z, x + (i + 1), y + size) & 0x12c01f8) != 0 || (clipMaskSupplier.getClippingFlag(z, x + size, y + (i + 1)) & 0x12c01e3) != 0) { + found = false; + break roar; + } + } + points.add(new Point(x + 1, y + 1, dir)); + x++; + y++; + break; + case EAST: + if ((clipMaskSupplier.getClippingFlag(z, x + size, y) & 0x12c0183) != 0 || (clipMaskSupplier.getClippingFlag(z, x + size, y + (size - 1)) & 0x12c01e0) != 0) { + found = false; + break; + } + for (int i = 1; i < size - 1; i++) { + if ((clipMaskSupplier.getClippingFlag(z, x + size, y + i) & 0x12c01e3) != 0) { + found = false; + break roar; + } + } + points.add(new Point(x + 1, y, dir)); + x++; + break; + case SOUTH_EAST: + if ((clipMaskSupplier.getClippingFlag(z, x + 1, y - 1) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x + size, y + (size - 2)) & 0x12c01e0) != 0 || (clipMaskSupplier.getClippingFlag(z, x + size, y - 1) & 0x12c0183) != 0) { + found = false; + break; + } + for (int i = 1; i < size - 1; i++) { + if ((clipMaskSupplier.getClippingFlag(z, x + size, y + (i - 1)) & 0x12c01e3) != 0 || (clipMaskSupplier.getClippingFlag(z, x + (i + 1), y - 1) & 0x12c018f) != 0) { + found = false; + break roar; + } + } + points.add(new Point(x + 1, y - 1, dir)); + x++; + y--; + break; + case SOUTH: + if ((clipMaskSupplier.getClippingFlag(z, x, y - 1) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x + (size - 1), y - 1) & 0x12c0183) != 0) { + found = false; + break; + } + for (int i = 1; i < size - 1; i++) { + if ((clipMaskSupplier.getClippingFlag(z, x + i, y - 1) & 0x12c018f) != 0) { + found = false; + break roar; + } + } + points.add(new Point(x, y - 1, dir)); + y--; + break; + case SOUTH_WEST: + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y + (size - 2)) & 0x12c0138) != 0 || (clipMaskSupplier.getClippingFlag(z, x - 1, y - 1) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x + (size - 2), y - 1) & 0x12c0183) != 0) { + found = false; + break; + } + for (int i = 1; i < size - 1; i++) { + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y + (i - 1)) & 0x12c013e) != 0 || (clipMaskSupplier.getClippingFlag(z, x + (i - 1), y - 1) & 0x12c018f) != 0) { + found = false; + break roar; + } + } + points.add(new Point(x - 1, y - 1, dir)); + x--; + y--; + break; + case WEST: + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x - 1, y + (size - 1)) & 0x12c0138) != 0) { + found = false; + break; + } + for (int i = 1; i < size - 1; i++) { + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y + i) & 0x12c013e) != 0) { + found = false; + break roar; + } + } + points.add(new Point(x - 1, y, dir)); + x--; + break; + case NORTH_WEST: + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y + 1) & 0x12c010e) != 0 || (clipMaskSupplier.getClippingFlag(z, x - 1, y + size) & 0x12c0138) != 0 || (clipMaskSupplier.getClippingFlag(z, x, y + size) & 0x12c01e0) != 0) { + found = false; + break; + } + for (int i = 1; i < size - 1; i++) { + if ((clipMaskSupplier.getClippingFlag(z, x - 1, y + (i + 1)) & 0x12c013e) != 0 || (clipMaskSupplier.getClippingFlag(z, x + (i - 1), y + size) & 0x12c01f8) != 0) { + found = false; + break roar; + } + } + points.add(new Point(x - 1, y + 1, dir)); + x--; + y++; + break; + } + if (found) { + break; + } + } + } + + /** + * Gets the direction. + * @param end The end direction. + * @return The direction. + */ + private static Direction[] getDirection(int startX, int startY, Location end) { + int endX = end.getX(); + int endY = end.getY(); + if (startX == endX) { + if (startY > endY) { + return new Direction[] { Direction.SOUTH }; + } else if (startY < endY) { + return new Direction[] { Direction.NORTH }; + } + } else if (startY == endY) { + if (startX > endX) { + return new Direction[] { Direction.WEST }; + } + return new Direction[] { Direction.EAST }; + } else { + if (startX < endX && startY < endY) { + return new Direction[] { Direction.NORTH_EAST, Direction.EAST, Direction.NORTH }; + } else if (startX < endX && startY > endY) { + return new Direction[] { Direction.SOUTH_EAST, Direction.EAST, Direction.SOUTH }; + } else if (startX > endX && startY < endY) { + return new Direction[] { Direction.NORTH_WEST, Direction.WEST, Direction.NORTH }; + } else if (startX > endX && startY > endY) { + return new Direction[] { Direction.SOUTH_WEST, Direction.WEST, Direction.SOUTH }; + } + } + return new Direction[0]; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/path/Path.java b/Server/src/main/java/Server/core/game/world/map/path/Path.java new file mode 100644 index 000000000..7357feaf8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/path/Path.java @@ -0,0 +1,100 @@ +package core.game.world.map.path; + +import core.game.node.entity.Entity; +import core.game.world.map.Point; + +import java.util.ArrayDeque; +import java.util.Deque; + +/** + * Represents a path. + * @author Emperor + */ +public class Path { + + /** + * If the path was found. + */ + private boolean succesful; + + /** + * If we have to move near the destination (as we can't reach it). + */ + private boolean moveNear; + + /** + * The points to walk. + */ + private Deque points = new ArrayDeque(); + + /** + * Constructs a new {@code Path} {@code Object}. + */ + public Path() { + /* + * empty. + */ + } + + /** + * Walks this path. + * @param entity The entity. + */ + public void walk(Entity entity) { + if (entity.getLocks().isMovementLocked()) { + return; + } + entity.getWalkingQueue().reset(); + for (Point step : points) { + entity.getWalkingQueue().addPath(step.getX(), step.getY()); + } + } + + /** + * Gets the succesful. + * @return The succesful. + */ + public boolean isSuccessful() { + return succesful; + } + + /** + * Sets the succesful. + * @param succesful The succesful to set. + */ + public void setSuccesful(boolean succesful) { + this.succesful = succesful; + } + + /** + * Gets the points. + * @return The points. + */ + public Deque getPoints() { + return points; + } + + /** + * Sets the points. + * @param points The points to set. + */ + public void setPoints(Deque points) { + this.points = points; + } + + /** + * Gets the moveNear. + * @return The moveNear. + */ + public boolean isMoveNear() { + return moveNear; + } + + /** + * Sets the moveNear. + * @param moveNear The moveNear to set. + */ + public void setMoveNear(boolean moveNear) { + this.moveNear = moveNear; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/path/Pathfinder.java b/Server/src/main/java/Server/core/game/world/map/path/Pathfinder.java new file mode 100644 index 000000000..e18de12a9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/path/Pathfinder.java @@ -0,0 +1,683 @@ +package core.game.world.map.path; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.item.GroundItem; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; + +public abstract class Pathfinder { + + /** + * The smart path finder. + */ + public static final SmartPathfinder SMART = new SmartPathfinder(); + + /** + * The dumb path finder. + */ + public static final DumbPathfinder DUMB = new DumbPathfinder(); + + /** + * The projectile path finder. + */ + public static final ProjectilePathfinder PROJECTILE = new ProjectilePathfinder(); + + /** + * The south direction flag. + */ + static final int SOUTH_FLAG = 0x1; + + /** + * The west direction flag. + */ + static final int WEST_FLAG = 0x2; + + /** + * The north direction flag. + */ + static final int NORTH_FLAG = 0x4; + + /** + * The east direction flag. + */ + static final int EAST_FLAG = 0x8; + + /** + * The south-west direction flag. + */ + static final int SOUTH_WEST_FLAG = SOUTH_FLAG | WEST_FLAG; + + /** + * The north-west direction flag. + */ + static final int NORTH_WEST_FLAG = NORTH_FLAG | WEST_FLAG; + + /** + * The south-east direction flag. + */ + static final int SOUTH_EAST_FLAG = SOUTH_FLAG | EAST_FLAG; + + /** + * The north-east direction flag. + */ + static final int NORTH_EAST_FLAG = NORTH_FLAG | EAST_FLAG; + + /** + * Finds a path from the location to the end location. + * @param location The start location. + * @param size The mover size. + * @param end The end location. + * @param sizeX The x-size of the destination node. + * @param sizeY The y-size of the destination node. + * @param rotation The object rotation. + * @param type The object type. + * @param walkingFlag The object walking flag. + * @param near If we should find the nearest location if a path can't be + * found. + * @return The path. + */ + public abstract Path find(Location location, int size, Location end, int sizeX, int sizeY, int rotation, int type, int walkingFlag, boolean near, ClipMaskSupplier clipMaskSupplier); + + /** + * Finds a path from the start location to the end location. + * @param mover The moving entity. + * @param destination The destination node. + * @return The path. + */ + public static Path find(Entity mover, Node destination) { + return find(mover, destination, true, SMART); + } + + /** + * Finds a path from the start location to the end location. + * @param mover The moving entity. + * @param destination The destination node. + * @param near If we should move near the end location, if we can't reach + * it. + * @param finder The pathfinder to use. + * @return The path. + */ + public static Path find(Entity mover, Node destination, boolean near, Pathfinder finder) { + return find(mover.getLocation(), mover.size(), destination, near, finder, RegionManager::getClippingFlag); + } + + public static Path findWater(Entity mover, Node destination, boolean near, Pathfinder finder){ + return find(mover.getLocation(),mover.size(),destination,near,finder, RegionManager::getWaterClipFlag); + } + + public static Path find(Entity mover, Node destination, boolean near, Pathfinder finder, ClipMaskSupplier clipMaskSupplier) { + return find(mover.getLocation(), mover.size(), destination, near, finder, clipMaskSupplier); + } + + /** + * Finds a path from the start location to the end location. + * @param destination The destination node. + * @return The path. + */ + public static Path find(Location start, Node destination) { + return find(start, destination, true, SMART); + } + + /** + * Finds a path from the start location to the end location. + * @param destination The destination node. + * @param near If we should move near the end location, if we can't reach + * it. + * @param finder The pathfinder to use. + * @return The path. + */ + public static Path find(Location start, Node destination, boolean near, Pathfinder finder) { + return find(start, 1, destination, near, finder, RegionManager::getClippingFlag); + } + + /** + * Finds a path from the start location to the end location. + * @param destination The destination node. + * @param near If we should move near the end location, if we can't reach + * it. + * @param finder The pathfinder to use. + * @return The path. + */ + public static Path find(Location start, int moverSize, Node destination, boolean near, Pathfinder finder, ClipMaskSupplier clipMaskSupplier) { + if (destination instanceof GameObject) { + GameObject object = (GameObject) destination; + int type = object.getType(); + int rotation = object.getRotation(); + if (type == 10 || type == 11 || type == 22) { + int sizeX = object.getDefinition().sizeX; + int sizeY = object.getDefinition().sizeY; + if (rotation % 2 != 0) { + sizeX = object.getDefinition().sizeY; + sizeY = object.getDefinition().sizeX; + } + int walkingFlag = object.getDefinition().getWalkingFlag(); + if (rotation != 0) { + walkingFlag = (walkingFlag << rotation & 0xf) + (walkingFlag >> 4 - rotation); + } + return finder.find(start, moverSize, destination.getLocation(), sizeX, sizeY, 0, 0, walkingFlag, near, clipMaskSupplier); + } + return finder.find(start, moverSize, destination.getLocation(), 0, 0, rotation, 1 + type, 0, near, clipMaskSupplier); + } + int size = 0; + if (destination instanceof Entity) { + size = destination.size(); + } else if (destination instanceof GroundItem && !RegionManager.isTeleportPermitted(destination.getLocation())) { + size = 1; + } + return finder.find(start, moverSize, destination.getLocation(), size, size, 0, 0, 0, near, clipMaskSupplier); + } + + /** + * Checks if interaction with decoration is possible. + * @param curX The current x-coordinate in viewport. + * @param curY The current y-coordinate in viewport. + * @param size The mover size. + * @param destX The destination x-coordinate in viewport. + * @param destY The destination y-coordinate in viewport. + * @param type The object type. + * @param rotation The object rotation. + * @return {@code True} if so. + */ + public static boolean canDecorationInteract(int curX, int curY, int size, int destX, int destY, int rotation, int type, int z, ClipMaskSupplier clipMaskSupplier) { + if (size != 1) { + if (destX >= curX && destX <= (curX + size) - 1 && destY >= destY && destY <= (destY + size) - 1) { + return true; + } + } else if (destX == curX && curY == destY) { + return true; + } + if (size == 1) { + int flag = clipMaskSupplier.getClippingFlag(z, curX, curY); + if (type == 6 || type == 7) { + if (type == 7) { + rotation = rotation + 2 & 0x3; + } + if (rotation == 0) { + if (curX == 1 + destX && curY == destY && (0x80 & flag) == 0) { + return true; + } + if (destX == curX && curY == destY - 1 && (flag & 0x2) == 0) { + return true; + } + } else if (rotation == 1) { + if (curX == destX - 1 && curY == destY && (0x8 & flag) == 0) { + return true; + } + if (curX == destX && curY == destY - 1 && (flag & 0x2) == 0) { + return true; + } + } else if (rotation == 2) { + if (destX - 1 == curX && destY == curY && (flag & 0x8) == 0) { + return true; + } + if (destX == curX && destY + 1 == curY && (0x20 & flag) == 0) { + return true; + } + } else if (rotation == 3) { + if (destX + 1 == curX && curY == destY && (0x80 & flag) == 0) { + return true; + } + if (destX == curX && curY == destY + 1 && (0x20 & flag) == 0) { + return true; + } + } + } + if (type == 8) { + if (destX == curX && curY == destY + 1 && (flag & 0x20) == 0) { + return true; + } + if (destX == curX && -1 + destY == curY && (0x2 & flag) == 0) { + return true; + } + if (curX == destX - 1 && curY == destY && (0x8 & flag) == 0) { + return true; + } + if (curX == destX + 1 && curY == destY && (flag & 0x80) == 0) { + return true; + } + } + } else { + int cornerX = curX + size - 1; + int cornerY = curY + size - 1; + if (type == 6 || type == 7) { + if (type == 7) { + rotation = 0x3 & 2 + rotation; + } + if (rotation == 0) { + if (destX + 1 == curX && destY >= curY && destY <= cornerY && (clipMaskSupplier.getClippingFlag(z, curX, destY) & 0x80) == 0) { + return true; + } + if (destX >= curX && destX <= cornerX && destY - size == curY && (0x2 & clipMaskSupplier.getClippingFlag(z, destX, cornerY)) == 0) { + return true; + } + } else if (rotation == 1) { + if (-size + destX == curX && destY >= curY && cornerY >= destY && (clipMaskSupplier.getClippingFlag(z, cornerX, destY) & 0x8) == 0) { + return true; + } + if (curX <= destX && cornerX >= destX && -size + destY == curY && (clipMaskSupplier.getClippingFlag(z, destX, cornerY) & 0x2) == 0) { + return true; + } + } else if (rotation == 2) { + if (curX == destX - size && curY <= destY && destY <= cornerY && (0x8 & clipMaskSupplier.getClippingFlag(z, cornerX, destY)) == 0) { + return true; + } + if (curX <= destX && cornerX >= destX && destY + 1 == curY && (0x20 & clipMaskSupplier.getClippingFlag(z, destX, curY)) == 0) { + return true; + } + } else if (rotation == 3) { + if (1 + destX == curX && curY <= destY && destY <= cornerY && (0x80 & clipMaskSupplier.getClippingFlag(z, curX, destY)) == 0) { + return true; + } + if (destX >= curX && destX <= cornerX && 1 + destY == curY && (clipMaskSupplier.getClippingFlag(z, destX, curY) & 0x20) == 0) { + return true; + } + } + } + if (type == 8) { + if (curX <= destX && destX <= cornerX && 1 + destY == curY && (clipMaskSupplier.getClippingFlag(z, destX, curY) & 0x20) == 0) { + return true; + } + if (curX <= destX && destX <= cornerX && curY == -size + destY && (0x2 & clipMaskSupplier.getClippingFlag(z, destX, cornerY)) == 0) { + return true; + } + if (curX == -size + destX && destY >= curY && destY <= cornerY && (0x8 & clipMaskSupplier.getClippingFlag(z, cornerX, destY)) == 0) { + return true; + } + if (1 + destX == curX && curY <= destY && cornerY >= destY && (clipMaskSupplier.getClippingFlag(z, curX, destY) & 0x80) == 0) { + return true; + } + } + } + return false; + } + + /** + * Checks if interaction with a door is possible. + * @param curX The current x-coordinate in viewport. + * @param curY The current y-coordinate in viewport. + * @param size The mover size. + * @param destX The destination x-coordinate in viewport. + * @param destY The destination y-coordinate in viewport. + * @param type The object type. + * @param rotation The object rotation. + * @return {@code True} if so. + */ + public static boolean canDoorInteract(int curX, int curY, int size, int destX, int destY, int type, int rotation, int z, ClipMaskSupplier clipMaskSupplier) { + if (size != 1) { + if (destX >= curX && destX <= size + curX - 1 && destY >= destY && destY <= destY + size - 1) { + return true; + } + } else if (curX == destX && destY == curY) { + return true; + } + + if (size == 1) { + if (type == 0) { + if (rotation == 0) { + if (curX == destX - 1 && destY == curY) { + return true; + } + if (destX == curX && 1 + destY == curY && (0x12c0120 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (curX == destX && destY - 1 == curY && (clipMaskSupplier.getClippingFlag(z, curX, curY) & 0x12c0102) == 0) { + return true; + } + } else if (rotation == 1) { + if (curX == destX && destY + 1 == curY) { + return true; + } + if (curX == destX - 1 && curY == destY && (0x12c0108 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (curX == 1 + destX && destY == curY && (0x12c0180 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + } else if (rotation == 2) { + if (1 + destX == curX && destY == curY) { + return true; + } + if (destX == curX && 1 + destY == curY && (0x12c0120 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (curX == destX && curY == destY - 1 && (clipMaskSupplier.getClippingFlag(z, curX, curY) & 0x12c0102) == 0) { + return true; + } + } else if (rotation == 3) { + if (curX == destX && -1 + destY == curY) { + return true; + } + if (curX == -1 + destX && destY == curY && (0x12c0108 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (curX == 1 + destX && destY == curY && (clipMaskSupplier.getClippingFlag(z, curX, curY) & 0x12c0180) == 0) { + return true; + } + } + } else if (type == 2) { + if (rotation == 0) { + if (destX - 1 == curX && curY == destY) { + return true; + } + if (destX == curX && curY == 1 + destY) { + return true; + } + if (curX == destX + 1 && curY == destY && (0x12c0180 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (curX == destX && destY - 1 == curY && (clipMaskSupplier.getClippingFlag(z, curX, curY) & 0x12c0102) == 0) { + return true; + } + } else if (rotation == 1) { + if (curX == destX - 1 && curY == destY && (0x12c0108 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (curX == destX && curY == 1 + destY) { + return true; + } + if (1 + destX == curX && curY == destY) { + return true; + } + if (curX == destX && destY - 1 == curY && (clipMaskSupplier.getClippingFlag(z, curX, curY) & 0x12c0102) == 0) { + return true; + } + } else if (rotation == 2) { + if (destX - 1 == curX && destY == curY && (0x12c0108 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (destX == curX && 1 + destY == curY && (0x12c0120 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (1 + destX == curX && curY == destY) { + return true; + } + if (curX == destX && curY == destY - 1) { + return true; + } + } else if (rotation == 3) { + if (destX - 1 == curX && curY == destY) { + return true; + } + if (destX == curX && curY == destY + 1 && (0x12c0120 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (curX == 1 + destX && curY == destY && (clipMaskSupplier.getClippingFlag(z, curX, curY) & 0x12c0180) == 0) { + return true; + } + if (destX == curX && destY - 1 == curY) { + return true; + } + } + } else if (type == 9) { + if (curX == destX && curY == destY + 1 && (clipMaskSupplier.getClippingFlag(z, curX, curY) & 0x20) == 0) { + return true; + } + if (curX == destX && curY == destY - 1 && (clipMaskSupplier.getClippingFlag(z, curX, curY) & 0x2) == 0) { + return true; + } + if (curX == destX - 1 && curY == destY && (0x8 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + if (destX + 1 == curX && curY == destY && (0x80 & clipMaskSupplier.getClippingFlag(z, curX, curY)) == 0) { + return true; + } + } + } else { + int cornerX = curX - (1 - size); + int cornerY = -1 + curY + size; + if (type == 0) { + if (rotation == 0) { + if (destX - size == curX && destY >= curY && destY <= cornerY) { + return true; + } + if (destX >= curX && cornerX >= destX && curY == 1 + destY && (clipMaskSupplier.getClippingFlag(z, destX, curY) & 0x12c0120) == 0) { + return true; + } + if (destX >= curX && cornerX >= destX && destY - size == curY && (clipMaskSupplier.getClippingFlag(z, destX, cornerY) & 0x12c0102) == 0) { + return true; + } + } else if (rotation == 1) { + if (destX >= curX && cornerX >= destX && destY + 1 == curY) { + return true; + } + if (curX == -size + destX && destY >= curY && cornerY >= destY && (0x12c0108 & clipMaskSupplier.getClippingFlag(z, cornerX, destY)) == 0) { + return true; + } + if (curX == 1 + destX && destY >= curY && cornerY >= destY && (clipMaskSupplier.getClippingFlag(z, curX, destY) & 0x12c0180) == 0) { + return true; + } + } else if (rotation == 2) { + if (curX == 1 + destX && curY <= destY && destY <= cornerY) { + return true; + } + if (curX <= destX && cornerX >= destX && destY + 1 == curY && (0x12c0120 & clipMaskSupplier.getClippingFlag(z, destX, curY)) == 0) { + return true; + } + if (destX >= curX && destX <= cornerX && destY - size == curY && (0x12c0102 & clipMaskSupplier.getClippingFlag(z, destX, cornerY)) == 0) { + return true; + } + } else if (rotation == 3) { + if (curX <= destX && destX <= cornerX && curY == -size + destY) { + return true; + } + if (-size + destX == curX && curY <= destY && destY <= cornerY && (clipMaskSupplier.getClippingFlag(z, cornerX, destY) & 0x12c0108) == 0) { + return true; + } + if (1 + destX == curX && curY <= destY && cornerY >= destY && (clipMaskSupplier.getClippingFlag(z, curX, destY) & 0x12c0180) == 0) { + return true; + } + } + } + if (type == 2) { + if (rotation == 0) { + if (destX - size == curX && curY <= destY && destY <= cornerY) { + return true; + } + if (curX <= destX && destX <= cornerX && curY == 1 + destY) { + return true; + } + if (curX == 1 + destX && curY <= destY && destY <= cornerY && (0x12c0180 & clipMaskSupplier.getClippingFlag(z, curX, destY)) == 0) { + return true; + } + if (curX <= destX && cornerX >= destX && -size + destY == curY && (clipMaskSupplier.getClippingFlag(z, destX, cornerY) & 0x12c0102) == 0) { + return true; + } + } else if (rotation == 1) { + if (-size + destX == curX && destY >= curY && destY <= cornerY && (clipMaskSupplier.getClippingFlag(z, cornerX, destY) & 0x12c0108) == 0) { + return true; + } + if (destX >= curX && cornerX >= destX && curY == 1 + destY) { + return true; + } + if (destX + 1 == curX && curY <= destY && destY <= cornerY) { + return true; + } + if (destX >= curX && cornerX >= destX && destY + -size == curY && (0x12c0102 & clipMaskSupplier.getClippingFlag(z, destX, cornerY)) == 0) { + return true; + } + } else if (rotation == 2) { + if (curX == destX - size && curY <= destY && cornerY >= destY && (clipMaskSupplier.getClippingFlag(z, cornerX, destY) & 0x12c0108) == 0) { + return true; + } + if (destX >= curX && destX <= cornerX && 1 + destY == curY && (0x12c0120 & clipMaskSupplier.getClippingFlag(z, destX, curY)) == 0) { + return true; + } + if (1 + destX == curX && destY >= curY && cornerY >= destY) { + return true; + } + if (curX <= destX && destX <= cornerX && curY == -size + destY) { + return true; + } + } else if (rotation == 3) { + if (destX + -size == curX && destY >= curY && destY <= cornerY) { + return true; + } + if (curX <= destX && cornerX >= destX && curY == 1 + destY && (clipMaskSupplier.getClippingFlag(z, destX, curY) & 0x12c0120) == 0) { + return true; + } + if (1 + destX == curX && destY >= curY && cornerY >= destY && (0x12c0180 & clipMaskSupplier.getClippingFlag(z, curX, destY)) == 0) { + return true; + } + if (destX >= curX && destX <= cornerX && curY == -size + destY) { + return true; + } + } + } + if (type == 9) { + if (destX >= curX && destX <= cornerX && curY == 1 + destY && (clipMaskSupplier.getClippingFlag(z, destX, curY) & 0x12c0120) == 0) { + return true; + } + if (destX >= curX && cornerX >= destX && curY == -size + destY && (0x12c0102 & clipMaskSupplier.getClippingFlag(z, destX, cornerY)) == 0) { + return true; + } + if (-size + destX == curX && destY >= curY && cornerY >= destY && (0x12c0108 & clipMaskSupplier.getClippingFlag(z, cornerX, destY)) == 0) { + return true; + } + if (curX == destX + 1 && destY >= curY && cornerY >= destY && (clipMaskSupplier.getClippingFlag(z, curX, destY) & 0x12c0180) == 0) { + return true; + } + } + } + return false; + } + + /** + * Checks if the mover is standing on the destination. + * @param x The current x-location (in viewport). + * @param y The current y-location (in viewport). + * @param moverSizeX The mover x size. + * @param moverSizeY The mover y size. + * @param destX The destination x-location in viewport. + * @param destY The destination y-location in viewport. + * @param sizeX The destination node x-size. + * @param sizeY The destination node y-size. + * @return {@code True} if so. + */ + public static boolean isStandingIn(int x, int y, int moverSizeX, int moverSizeY, int destX, int destY, int sizeX, int sizeY) { + if (x >= sizeX + destX || moverSizeX + x <= destX) { + return false; + } + if (destY + sizeY <= y || y + moverSizeY <= destY) { + return false; + } + return true; + } + + /** + * Checks if interaction is possible from the current location. + * @param x The current x-location (in viewport). + * @param y The current y-location (in viewport). + * @param moverSize The mover size. + * @param destX The destination x-location in viewport. + * @param destY The destination y-location in viewport. + * @param sizeX The destination node x-size. + * @param sizeY The destination node y-size. + * @param walkFlag The walking flag. + * @return {@code True} if so. + */ + public static boolean canInteract(int x, int y, int moverSize, int destX, int destY, int sizeX, int sizeY, int walkFlag, int z, ClipMaskSupplier clipMaskSupplier) { + if (moverSize > 1) { + return isStandingIn(x, y, moverSize, moverSize, destX, destY, sizeX, sizeY) || canInteractSized(x, y, moverSize, moverSize, destX, destY, sizeX, sizeY, walkFlag, z); + } + int flag = clipMaskSupplier.getClippingFlag(z, x, y); + int cornerX = destX + sizeX - 1; + int cornerY = destY + sizeY - 1; + if (destX <= x && cornerX >= x && y >= destY && y <= cornerY) { + return true; + } + if (x == destX - 1 && destY <= y && y <= cornerY && (0x8 & flag) == 0 && (0x8 & walkFlag) == 0) { + return true; + } + if (x == cornerX + 1 && destY <= y && cornerY >= y && (flag & 0x80) == 0 && (0x2 & walkFlag) == 0) { + return true; + } + if (y == destY - 1 && destX <= x && cornerX >= x && (0x2 & flag) == 0 && (0x4 & walkFlag) == 0) { + return true; + } + if (y == cornerY + 1 && destX <= x && cornerX >= x && (flag & 0x20) == 0 && (0x1 & walkFlag) == 0) { + return true; + } + return false; + } + + /** + * Checks if interaction is possible from the current location. + * @param destX The destination x-location in viewport. + * @param destY The destination y-location in viewport. + * @param sizeX The destination node x-size. + * @param sizeY The destination node y-size. + * @return {@code True} if so. + */ + public static boolean canInteractSized(int curX, int curY, int moverSizeX, int moverSizeY, int destX, int destY, int sizeX, int sizeY, int walkingFlag, int z) { + int fromCornerY = curY + moverSizeY; + int fromCornerX = curX + moverSizeX; + int toCornerX = sizeX + destX; + int toCornerY = sizeY + destY; + if (destX <= curX && curX < toCornerX) { + if (destY == fromCornerY && (walkingFlag & 0x4) == 0) { + int x = curX; + for (int endX = toCornerX < fromCornerX ? toCornerX : fromCornerX; endX > x; x++) { + if ((RegionManager.getClippingFlag(z, x, -1 + fromCornerY) & 0x2) == 0) { + return true; + } + } + } else if (toCornerY == curY && (walkingFlag & 0x1) == 0) { + int x = curX; + for (int endX = fromCornerX <= toCornerX ? fromCornerX : toCornerX; x < endX; x++) { + if ((RegionManager.getClippingFlag(z, x, curY) & 0x20) == 0) { + return true; + } + } + } + } else if (destX < fromCornerX && toCornerX >= fromCornerX) { + if (fromCornerY == destY && (0x4 & walkingFlag) == 0) { + for (int x = destX; fromCornerX > x; x++) { + if ((RegionManager.getClippingFlag(z, x, -1 + (fromCornerY)) & 0x2) == 0) { + return true; + } + } + } else if (toCornerY == curY && (0x1 & walkingFlag) == 0) { + for (int x = destX; fromCornerX > x; x++) { + if ((RegionManager.getClippingFlag(z, x, curY) & 0x20) == 0) { + return true; + } + } + } + } else if (curY < destY || curY >= toCornerY) { + if (fromCornerY > destY && toCornerY >= fromCornerY) { + if (fromCornerX == destX && (walkingFlag & 0x8) == 0) { + for (int y = destY; y < fromCornerY; y++) { + if ((RegionManager.getClippingFlag(z, -1 + fromCornerX, y) & 0x8) == 0) { + return true; + } + } + } else if (curX == toCornerX && (0x2 & walkingFlag) == 0) { + for (int y = destY; fromCornerY > y; y++) { + if ((RegionManager.getClippingFlag(z, curX, y) & 0x80) == 0) { + return true; + } + } + } + } + } else if (destX != fromCornerX || (0x8 & walkingFlag) != 0) { + if (curX == toCornerX && (walkingFlag & 0x2) == 0) { + int y = curY; + for (int endY = fromCornerY <= toCornerY ? fromCornerY : toCornerY; y < endY; y++) { + if ((0x80 & RegionManager.getClippingFlag(z, curX, y)) == 0) { + return true; + } + } + } + } else { + int y = curY; + for (int endY = fromCornerY > toCornerY ? toCornerY : fromCornerY; endY > y; y++) { + if ((RegionManager.getClippingFlag(z, fromCornerX - 1, y) & 0x8) == 0) { + return true; + } + } + } + return false; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/path/ProjectilePathfinder.java b/Server/src/main/java/Server/core/game/world/map/path/ProjectilePathfinder.java new file mode 100644 index 000000000..79afec84b --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/path/ProjectilePathfinder.java @@ -0,0 +1,200 @@ +package core.game.world.map.path; + +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.Point; +import core.game.world.map.RegionManager; + +import java.util.ArrayList; +import java.util.List; + +/** + * A pathfinder implementation used for checking projectile paths. + * @author Emperor + */ +public final class ProjectilePathfinder extends Pathfinder { + + /** + * If a path can be found. + */ + private boolean found; + + /** + * The plane. + */ + private int z; + + /** + * The x-coordinate. + */ + private int x; + + /** + * The y-coordinate. + */ + private int y; + + @Override + public Path find(Location start, int size, Location end, int sizeX, int sizeY, int rotation, int type, int walkingFlag, boolean near, ClipMaskSupplier clipMaskSupplier) { + Path path = new Path(); + z = start.getZ(); + x = start.getX(); + y = start.getY(); + List points = new ArrayList<>(); + path.setSuccesful(true); + while (x != end.getX() || y != end.getY()) { + Direction[] directions = getDirection(x, y, end); + found = true; + checkSingleTraversal(points, directions); + if (!found) { + path.setMoveNear(x != start.getX() || y != start.getY()); + path.setSuccesful(false); + break; + } + } + if (!points.isEmpty()) { + for (int i = 0; i < points.size() - 1; i++) { + Point p = points.get(i); + if (p.getDirection() != null) { + path.getPoints().add(p); + } + } + path.getPoints().add(points.get(points.size() - 1)); + } + return path; + } + + /** + * Checks traversal for a size 1 entity. + * + * @param points The points list. + * @param directions The directions. + */ + private void checkSingleTraversal(List points, Direction... directions) { + dir: + for (Direction dir : directions) { + found = true; + switch (dir) { + case NORTH: + if (flagged(z, x, y + 1, 0x12c0120)) { + found = false; + break dir; + } + points.add(new Point(x, y + 1, dir)); + y++; + break; + case NORTH_EAST: + if (flagged(z, x + 1, y, 0x12c0180) + || flagged(z, x, y + 1, 0x12c0120) + || flagged(z, x + 1, y + 1, 0x12c01e0)) { + found = false; + break dir; + } + points.add(new Point(x + 1, y + 1, dir)); + x++; + y++; + break; + case EAST: + if (flagged(z, x + 1, y, 0x12c0180)) { + found = false; + break dir; + } + points.add(new Point(x + 1, y, dir)); + x++; + break; + case SOUTH_EAST: + if (flagged(z, x + 1, y, 0x12c0180) + || flagged(z, x, y - 1, 0x12c0102) + || flagged(z, x + 1, y - 1, 0x12c0183)) { + found = false; + break dir; + } + points.add(new Point(x + 1, y - 1, dir)); + x++; + y--; + break; + case SOUTH: + if (flagged(z, x, y - 1, 0x12c0102)) { + found = false; + break dir; + } + points.add(new Point(x, y - 1, dir)); + y--; + break; + case SOUTH_WEST: + if (flagged(z, x - 1, y, 0x12c0108) + || flagged(z, x, y - 1, 0x12c0102) + || flagged(z, x - 1, y - 1, 0x12c010e)) { + found = false; + break dir; + } + points.add(new Point(x - 1, y - 1, dir)); + x--; + y--; + break; + case WEST: + if (flagged(z, x - 1, y, 0x12c0108)) { + found = false; + break dir; + } + points.add(new Point(x - 1, y, dir)); + x--; + break; + case NORTH_WEST: + if (flagged(z, x - 1, y, 0x12c0108) + || flagged(z, x, y + 1, 0x12c0120) + || flagged(z, x - 1, y + 1, 0x12c0138)) { + found = false; + break dir; + } + points.add(new Point(x - 1, y + 1, dir)); + x--; + y++; + break; + } + if (found) { + break; + } + } + } + + private static boolean flagged(int z, int x, int y, int pFlagMask) { + int pFlag = RegionManager.getProjectileFlag(z, x, y); + return (pFlag & pFlagMask) != 0 || (pFlag & 0x20000) != 0 || (RegionManager.getClippingFlag(z, x, y) & 0x20000) != 0; + } + + /** + * Gets the direction. + * @param startX The startX. + * @param startY The startY. + * @param end The end direction. + * @return The direction. + */ + private static Direction[] getDirection(int startX, int startY, Location end) { + int endX = end.getX(); + int endY = end.getY(); + if (startX == endX) { + if (startY > endY) { + return new Direction[] { Direction.SOUTH }; + } else if (startY < endY) { + return new Direction[] { Direction.NORTH }; + } + } else if (startY == endY) { + if (startX > endX) { + return new Direction[] { Direction.WEST }; + } + return new Direction[] { Direction.EAST }; + } else { + if (startX < endX && startY < endY) { + return new Direction[] { Direction.NORTH_EAST, Direction.EAST, Direction.NORTH }; + } else if (startX < endX && startY > endY) { + return new Direction[] { Direction.SOUTH_EAST, Direction.EAST, Direction.SOUTH }; + } else if (startX > endX && startY < endY) { + return new Direction[] { Direction.NORTH_WEST, Direction.WEST, Direction.NORTH }; + } else if (startX > endX && startY > endY) { + return new Direction[] { Direction.SOUTH_WEST, Direction.WEST, Direction.SOUTH }; + } + } + return new Direction[0]; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/path/SmartPathfinder.kt b/Server/src/main/java/Server/core/game/world/map/path/SmartPathfinder.kt new file mode 100644 index 000000000..ece18eef2 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/path/SmartPathfinder.kt @@ -0,0 +1,446 @@ +package core.game.world.map.path + +import core.game.world.map.Location +import core.game.world.map.Point + +class SmartPathfinder +/** + * Constructs a new `SmartPathfinder` `Object`. + */ +internal constructor() : Pathfinder() { + /** + * The x-queue. + */ + private var queueX: IntArray = intArrayOf(0) + + /** + * The y-queue. + */ + private var queueY: IntArray = intArrayOf(0) + + /** + * The "via" array. + */ + private var via: Array = Array(104) { IntArray(104) } + + /** + * The cost array. + */ + private var cost: Array = Array(104) { IntArray(104) } + + /** + * The current writing position. + */ + private var writePathPosition = 0 + + /** + * The current x-coordinate. + */ + private var curX = 0 + + /** + * The current y-coordinate. + */ + private var curY = 0 + + /** + * The destination x-coordinate. + */ + private var dstX = 0 + + /** + * The destination y-coordinate. + */ + private var dstY = 0 + + /** + * If a path was found. + */ + private var foundPath = false + + /** + * Resets the pathfinder. + */ + fun reset() { + queueX = IntArray(4096) + queueY = IntArray(4096) + via = Array(104) { IntArray(104) } + cost = Array(104) { IntArray(104) } + writePathPosition = 0 + } + + /** + * Checks a tile. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param dir The direction. + * @param currentCost The current cost. + */ + fun check(x: Int, y: Int, dir: Int, currentCost: Int) { + queueX[writePathPosition] = x + queueY[writePathPosition] = y + via[x][y] = dir + cost[x][y] = currentCost + writePathPosition = writePathPosition + 1 and 0xfff + } + + override fun find(start: Location?, moverSize: Int, end: Location?, sizeX: Int, sizeY: Int, rotation: Int, type: Int, walkingFlag: Int, near: Boolean, clipMaskSupplier: ClipMaskSupplier?): Path { + reset() + assert(start != null && end != null) + val path = Path() + foundPath = false + for (x in 0..103) { + for (y in 0..103) { + via[x][y] = 0 + cost[x][y] = 99999999 + } + } + val z = start!!.z + val location = Location.create(start.regionX - 6 shl 3, start.regionY - 6 shl 3, z) + curX = start.sceneX + curY = start.sceneY + dstX = end!!.getSceneX(start) + dstY = end.getSceneY(start) + var attempts: Int + var readPosition: Int + check(curX, curY, 99, 0) + try { + if (moverSize < 2) { + checkSingleTraversal(end, sizeX, sizeY, type, rotation, walkingFlag, location, clipMaskSupplier!!) + } else if (moverSize == 2) { + checkDoubleTraversal(end, sizeX, sizeY, type, rotation, walkingFlag, location, clipMaskSupplier!!) + } else { + checkVariableTraversal(end, moverSize, sizeX, sizeY, type, rotation, walkingFlag, location, clipMaskSupplier!!) + } + } catch (e: Exception) {} + if (!foundPath) { + if (near) { + var fullCost = 1000 + var thisCost = 100 + val depth = 10 + for (x in dstX - depth..dstX + depth) { + for (y in dstY - depth..dstY + depth) { + if (x >= 0 && y >= 0 && x < 104 && y < 104 && cost[x][y] < 100) { + var diffX = 0 + if (x < dstX) { + diffX = dstX - x + } else if (x > dstX + sizeX - 1) { + diffX = x - (dstX + sizeX - 1) + } + var diffY = 0 + if (y < dstY) { + diffY = dstY - y + } else if (y > dstY + sizeY - 1) { + diffY = y - (dstY + sizeY - 1) + } + val totalCost = diffX * diffX + diffY * diffY + if (totalCost < fullCost || totalCost == fullCost && cost[x][y] < thisCost) { + fullCost = totalCost + thisCost = cost[x][y] + curX = x + curY = y + } + } + } + } + if (fullCost == 1000) { + return path + } + path.isMoveNear = true + } + } + readPosition = 0 + queueX[readPosition] = curX + queueY[readPosition++] = curY + var previousDirection: Int + attempts = 0 + var directionFlag = via[curX][curY].also { previousDirection = it } + while (curX != start.sceneX || curY != start.sceneY) { + if (++attempts > queueX.size) { + return path + } + if (directionFlag != previousDirection) { + previousDirection = directionFlag + queueX[readPosition] = curX + queueY[readPosition++] = curY + } + if (directionFlag and WEST_FLAG != 0) { + curX++ + } else if (directionFlag and EAST_FLAG != 0) { + curX-- + } + if (directionFlag and SOUTH_FLAG != 0) { + curY++ + } else if (directionFlag and NORTH_FLAG != 0) { + curY-- + } + directionFlag = via[curX][curY] + } + val size = readPosition-- + var absX = location.x + queueX[readPosition] + var absY = location.y + queueY[readPosition] + path.points.add(Point(absX, absY)) + for (i in 1 until size) { + readPosition-- + absX = location.x + queueX[readPosition] + absY = location.y + queueY[readPosition] + path.points.add(Point(absX, absY)) + } + path.setSuccesful(true) + return path + } + + /** + * Checks possible traversal for a size 1 entity. + * @param end The destination location. + * @param sizeX The x-size of the destination. + * @param sizeY The y-size of the destination. + * @param type The object type. + * @param rotation The object rotation. + * @param walkingFlag The walking flag. + * @param location The viewport location. + */ + private fun checkSingleTraversal(end: Location, sizeX: Int, sizeY: Int, type: Int, rotation: Int, walkingFlag: Int, location: Location, clipMaskSupplier: ClipMaskSupplier) { + var readPosition = 0 + val z = location.z + while (writePathPosition != readPosition) { + curX = queueX[readPosition] + curY = queueY[readPosition] + readPosition = readPosition + 1 and 0xfff + if (curX == dstX && curY == dstY) { + foundPath = true + break + } + try { + val absX = location.x + curX + val absY = location.y + curY + if (type != 0) { + if ((type < 5 || type == 10) && canDoorInteract(absX, absY, 1, end.x, end.y, type - 1, rotation, z, clipMaskSupplier)) { + foundPath = true + break + } + if (type < 10 && canDecorationInteract(absX, absY, 1, end.x, end.y, type - 1, rotation, z, clipMaskSupplier)) { + foundPath = true + break + } + } + if (sizeX != 0 && sizeY != 0 && canInteract(absX, absY, 1, end.x, end.y, sizeX, sizeY, walkingFlag, z, clipMaskSupplier)) { + foundPath = true + break + } + val thisCost = cost[curX][curY] + 1 + if (curY > 0 && via[curX][curY - 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY - 1) and 0x12c0102 == 0) { + check(curX, curY - 1, SOUTH_FLAG, thisCost) + } + if (curX > 0 && via[curX - 1][curY] == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY) and 0x12c0108 == 0) { + check(curX - 1, curY, WEST_FLAG, thisCost) + } + if (curY < 103 && via[curX][curY + 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY + 1) and 0x12c0120 == 0) { + check(curX, curY + 1, NORTH_FLAG, thisCost) + } + if (curX < 103 && via[curX + 1][curY] == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY) and 0x12c0180 == 0) { + check(curX + 1, curY, EAST_FLAG, thisCost) + } + if (curX > 0 && curY > 0 && via[curX - 1][curY - 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY - 1) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY) and 0x12c0108 == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY - 1) and 0x12c0102 == 0) { + check(curX - 1, curY - 1, SOUTH_WEST_FLAG, thisCost) + } + if (curX > 0 && curY < 103 && via[curX - 1][curY + 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY + 1) and 0x12c0138 == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY) and 0x12c0108 == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY + 1) and 0x12c0120 == 0) { + check(curX - 1, curY + 1, NORTH_WEST_FLAG, thisCost) + } + if (curX < 103 && curY > 0 && via[curX + 1][curY - 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY - 1) and 0x12c0183 == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY) and 0x12c0180 == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY - 1) and 0x12c0102 == 0) { + check(curX + 1, curY - 1, SOUTH_EAST_FLAG, thisCost) + } + if (curX < 103 && curY < 103 && via[curX + 1][curY + 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY + 1) and 0x12c01e0 == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY) and 0x12c0180 == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY + 1) and 0x12c0120 == 0) { + check(curX + 1, curY + 1, NORTH_EAST_FLAG, thisCost) + } + } catch (e: Exception) { + // e.printStackTrace()println("curX " + curX + " curY" + curY + " via " + via[curX + 1] + via[curY + 1]) + } + } + } + + /** + * Checks possible traversal for a size 2 entity. + * @param end The destination location. + * @param sizeX The x-size of the destination. + * @param sizeY The y-size of the destination. + * @param type The object type. + * @param rotation The object rotation. + * @param walkingFlag The walking flag. + * @param location The viewport location. + */ + private fun checkDoubleTraversal(end: Location, sizeX: Int, sizeY: Int, type: Int, rotation: Int, walkingFlag: Int, location: Location, clipMaskSupplier: ClipMaskSupplier) { + var readPosition = 0 + val z = location.z + while (writePathPosition != readPosition) { + curX = queueX[readPosition] + curY = queueY[readPosition] + readPosition = readPosition + 1 and 0xfff + if (curX == dstX && curY == dstY) { + foundPath = true + break + } + val absX = location.x + curX + val absY = location.y + curY + if (type != 0) { + if ((type < 5 || type == 10) && canDoorInteract(absX, absY, 2, end.x, end.y, type - 1, rotation, z, clipMaskSupplier)) { + foundPath = true + break + } + if (type < 10 && canDecorationInteract(absX, absY, 2, end.x, end.y, type - 1, rotation, z, clipMaskSupplier)) { + foundPath = true + break + } + } + if (sizeX != 0 && sizeY != 0 && canInteract(absX, absY, 2, end.x, end.y, sizeX, sizeY, walkingFlag, z, clipMaskSupplier)) { + foundPath = true + break + } + val thisCost = cost[curX][curY] + 1 + if (curY > 0 && via[curX][curY - 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY - 1) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY - 1) and 0x12c0183 == 0) { + check(curX, curY - 1, SOUTH_FLAG, thisCost) + } + if (curX > 0 && via[curX - 1][curY] == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY + 1) and 0x12c0138 == 0) { + check(curX - 1, curY, WEST_FLAG, thisCost) + } + if (curY < 102 && via[curX][curY + 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY + 2) and 0x12c0138 == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY + 2) and 0x12c01e0 == 0) { + check(curX, curY + 1, NORTH_FLAG, thisCost) + } + if (curX < 102 && via[curX + 1][curY] == 0 && clipMaskSupplier.getClippingFlag(z, absX + 2, absY) and 0x12c0183 == 0 && clipMaskSupplier.getClippingFlag(z, absX + 2, absY + 1) and 0x12c01e0 == 0) { + check(curX + 1, curY, EAST_FLAG, thisCost) + } + if (curX > 0 && curY > 0 && via[curX - 1][curY - 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY - 1) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY) and 0x12c0138 == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY - 1) and 0x12c0183 == 0) { + check(curX - 1, curY - 1, SOUTH_WEST_FLAG, thisCost) + } + if (curX > 0 && curY < 102 && via[curX - 1][curY + 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY + 1) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY + 2) and 0x12c0138 == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY + 2) and 0x12c01e0 == 0) { + check(curX - 1, curY + 1, NORTH_WEST_FLAG, thisCost) + } + if (curX < 102 && curY > 0 && via[curX + 1][curY - 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY - 1) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX + 2, absY) and 0x12c01e0 == 0 && clipMaskSupplier.getClippingFlag(z, absX + 2, absY - 1) and 0x12c0183 == 0) { + check(curX + 1, curY - 1, SOUTH_EAST_FLAG, thisCost) + } + if (curX < 102 && curY < 102 && via[curX + 1][curY + 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY + 2) and 0x12c0138 == 0 && clipMaskSupplier.getClippingFlag(z, absX + 2, absY + 2) and 0x12c01e0 == 0 && clipMaskSupplier.getClippingFlag(z, absX + 2, absY + 1) and 0x12c0183 == 0) { + check(curX + 1, curY + 1, NORTH_EAST_FLAG, thisCost) + } + } + } + + /** + * Checks possible traversal for any sized entity. + * @param end The destination location. + * @param size The mover size. + * @param sizeX The x-size of the destination. + * @param sizeY The y-size of the destination. + * @param type The object type. + * @param rotation The object rotation. + * @param walkingFlag The walking flag. + * @param location The viewport location. + */ + private fun checkVariableTraversal(end: Location, size: Int, sizeX: Int, sizeY: Int, type: Int, rotation: Int, walkingFlag: Int, location: Location, clipMaskSupplier: ClipMaskSupplier) { + var readPosition = 0 + val z = location.z + main@ while (writePathPosition != readPosition) { + curX = queueX[readPosition] + curY = queueY[readPosition] + readPosition = readPosition + 1 and 0xfff + if (curX == dstX && curY == dstY) { + foundPath = true + break + } + val absX = location.x + curX + val absY = location.y + curY + if (type != 0) { + if ((type < 5 || type == 10) && canDoorInteract(absX, absY, size, end.x, end.y, type - 1, rotation, z, clipMaskSupplier)) { + foundPath = true + break + } + if (type < 10 && canDecorationInteract(absX, absY, size, end.x, end.y, type - 1, rotation, z, clipMaskSupplier)) { + foundPath = true + break + } + } + if (sizeX != 0 && sizeY != 0 && canInteract(absX, absY, size, end.x, end.y, sizeX, sizeY, walkingFlag, z, clipMaskSupplier)) { + foundPath = true + break + } + val thisCost = cost[curX][curY] + 1 + south@ do { + if (curY > 0 && via[curX][curY - 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY - 1) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX + (size - 1), absY - 1) and 0x12c0183 == 0) { + for (i in 1 until size - 1) { + if (clipMaskSupplier.getClippingFlag(z, absX + i, absY - 1) and 0x12c018f != 0) { + break@south + } + } + check(curX, curY - 1, SOUTH_FLAG, thisCost) + } + } while (false) + west@ do { + if (curX > 0 && via[curX - 1][curY] == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY + (size - 1)) and 0x12c0138 == 0) { + for (i in 1 until size - 1) { + if (clipMaskSupplier.getClippingFlag(z, absX - 1, absY + i) and 0x12c013e != 0) { + break@west + } + } + check(curX - 1, curY, WEST_FLAG, thisCost) + } + } while (false) + north@ do { + if (curY < 102 && via[curX][curY + 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY + size) and 0x12c0138 == 0 && clipMaskSupplier.getClippingFlag(z, absX + (size - 1), absY + size) and 0x12c01e0 == 0) { + for (i in 1 until size - 1) { + if (clipMaskSupplier.getClippingFlag(z, absX + i, absY + size) and 0x12c01f8 != 0) { + break@north + } + } + check(curX, curY + 1, NORTH_FLAG, thisCost) + } + } while (false) + east@ do { + if (curX < 102 && via[curX + 1][curY] == 0 && clipMaskSupplier.getClippingFlag(z, absX + size, absY) and 0x12c0183 == 0 && clipMaskSupplier.getClippingFlag(z, absX + size, absY + (size - 1)) and 0x12c01e0 == 0) { + for (i in 1 until size - 1) { + if (clipMaskSupplier.getClippingFlag(z, absX + size, absY + i) and 0x12c01e3 != 0) { + break@east + } + } + check(curX + 1, curY, EAST_FLAG, thisCost) + } + } while (false) + southWest@ do { + if (curX > 0 && curY > 0 && via[curX - 1][curY - 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY + (size - 2)) and 0x12c0138 == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY - 1) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX + (size - 2), absY - 1) and 0x12c0183 == 0) { + for (i in 1 until size - 1) { + if (clipMaskSupplier.getClippingFlag(z, absX - 1, absY + (i - 1)) and 0x12c013e != 0 || clipMaskSupplier.getClippingFlag(z, absX + (i - 1), absY - 1) and 0x12c018f != 0) { + break@southWest + } + } + check(curX - 1, curY - 1, SOUTH_WEST_FLAG, thisCost) + } + } while (false) + northWest@ do { + if (curX > 0 && curY < 102 && via[curX - 1][curY + 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY + 1) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX - 1, absY + size) and 0x12c0138 == 0 && clipMaskSupplier.getClippingFlag(z, absX, absY + size) and 0x12c01e0 == 0) { + for (i in 1 until size - 1) { + if (clipMaskSupplier.getClippingFlag(z, absX - 1, absY + (i + 1)) and 0x12c013e != 0 || clipMaskSupplier.getClippingFlag(z, absX + (i - 1), absY + size) and 0x12c01f8 != 0) { + break@northWest + } + } + check(curX - 1, curY + 1, NORTH_WEST_FLAG, thisCost) + } + } while (false) + southEast@ do { + if (curX < 102 && curY > 0 && via[curX + 1][curY - 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY - 1) and 0x12c010e == 0 && clipMaskSupplier.getClippingFlag(z, absX + size, absY - 1) and 0x12c0183 == 0 && clipMaskSupplier.getClippingFlag(z, absX + size, absY + (size - 2)) and 0x12c01e0 == 0) { + for (i in 1 until size - 1) { + if (clipMaskSupplier.getClippingFlag(z, absX + size, absY + (i - 1)) and 0x12c01e3 != 0 || clipMaskSupplier.getClippingFlag(z, absX + (i + 1), absY - 1) and 0x12c018f != 0) { + break@southEast + } + } + check(curX + 1, curY - 1, SOUTH_EAST_FLAG, thisCost) + } + } while (false) + if (curX < 102 && curY < 102 && via[curX + 1][curY + 1] == 0 && clipMaskSupplier.getClippingFlag(z, absX + 1, absY + size) and 0x12c0138 == 0 && clipMaskSupplier.getClippingFlag(z, absX + size, absY + size) and 0x12c01e0 == 0 && clipMaskSupplier.getClippingFlag(z, absX + size, absY + 1) and 0x12c0183 == 0) { + for (i in 1 until size - 1) { + if (clipMaskSupplier.getClippingFlag(z, absX + (i + 1), absY + size) and 0x12c01f8 != 0 || clipMaskSupplier.getClippingFlag(z, absX + size, absY + (i + 1)) and 0x12c01e3 != 0) { + continue@main + } + } + check(curX + 1, curY + 1, NORTH_EAST_FLAG, thisCost) + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/MapZone.java b/Server/src/main/java/Server/core/game/world/map/zone/MapZone.java new file mode 100644 index 000000000..30efb7340 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/MapZone.java @@ -0,0 +1,456 @@ +package core.game.world.map.zone; + +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.request.RequestType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.Region; +import core.game.world.map.RegionManager; + +import java.util.Iterator; + +/** + * Represents a map zone. + * @author Emperor + */ +public abstract class MapZone implements Zone { + + /** + * The map zone uid. + */ + private int uid; + + /** + * The zone name. + */ + private String name; + + /** + * If the map zone can be overlapped by another zone. + */ + private boolean overlappable; + + /** + * If random events should be fired in this zone. + */ + protected boolean fireRandomEvents; + + /** + * If restriction flag. + */ + private int restriction; + + /** + * The zone type (used for items kept on death). + */ + private int zoneType; + + /** + * Constructs a new {@code MapZone} {@code Object}. + * @param name The name. + * @param overlappable If the zone can be overlapped. + */ + public MapZone(String name, boolean overlappable, ZoneRestriction... restrictions) { + this.name = name; + this.overlappable = overlappable; + for (ZoneRestriction restriction : restrictions) { + addRestriction(restriction.getFlag()); + } + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player p = (Player) e; + } else if (e instanceof NPC) { + NPC npc = (NPC) e; + if (e instanceof Familiar && isRestricted(ZoneRestriction.FOLLOWERS.getFlag())) { + npc.setInvisible(true); + } + } + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + return true; + } + + /** + * Checks if the player can logout. + * @param p The player. + * @return {@code True} if so. + */ + public boolean canLogout(Player p) { + return true; + } + + /** + * Called when an entity dies. + * @param e The entity dying. + * @param killer The killer. + * @return {@code True} if the death got handled by this zone handler. + */ + public boolean death(Entity e, Entity killer) { + return false; + } + + /** + * Handles an interaction. + * @param e The entity. + * @param target The target to interact with. + * @param option The option. + * @return {@code True} if the option got handled. + */ + public boolean interact(Entity e, Node target, Option option) { + return false; + } + + /** + * Handles an reward button. + * @param player The player. + * @param interfaceId The interface id. + * @param buttonId The button id. + * @param slot The slot. + * @param itemId The item id. + * @param opcode The packet opcode. + * @return {@code True} if the button got handled. + */ + public boolean actionButton(Player player, int interfaceId, int buttonId, int slot, int itemId, int opcode) { + return false; + } + + /** + * Checks if the entity is able to continue attacking the target. + * @param e the attacking entity. + * @param target The target. + * @param style The combat style used. + * @param message If a message should be send. + * @return {@code True} if so. + */ + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + return true; + } + + /** + * If multi-zone boundaries should be ignored. + * @param attacker The attacker. + * @param victim The victim. + * @return {@code True} if the entity can attack regardless of multicombat. + */ + public boolean ignoreMultiBoundaries(Entity attacker, Entity victim) { + return false; + } + + /** + * Checks if the entity can attack the target. + * @param e The attacking entity. + * @param t The target. + * @param message If a message should be sent. + * @return {@code True} if the entity can continue attacking. + */ + public static boolean checkMulti(Entity e, Entity t, boolean message) { + long time = System.currentTimeMillis(); + boolean multi = t.getProperties().isMultiZone() && e.getProperties().isMultiZone(); + if (multi || e.isIgnoreMultiBoundaries(t) || e.getZoneMonitor().isIgnoreMultiBoundaries(t)) { + return true; + } + Entity target = t.getAttribute("combat-attacker", e); + if (t.getAttribute("combat-time", -1L) > time && target != e && target.isActive()) { + if (message && e instanceof Player) { + ((Player) e).getPacketDispatch().sendMessage("Someone else is already fighting this" + (t instanceof Player ? " player." : ".")); + } + return false; + } + if (e.getAttribute("combat-time", -1L) > time && (target = e.getAttribute("combat-attacker", t)) != t && target.isActive()) { + if (t.getId() == 1614 || t.getId() == 1613) { + return true; + } + if (message && e instanceof Player) { + ((Player) e).getPacketDispatch().sendMessage("You're already under attack!"); + } + return false; + } + return true; + } + + /** + * Checks if the entity can teleport. + * @param e The entity. + * @param type The teleport type (0=spell, 1=item, 2=object, 3=npc -1= + * force) + * @return {@code True} if so. + */ + public boolean teleport(Entity e, int type, Node node) { + return true; + } + + /** + * Checks if the death should start. + * @param e the entity. + * @param killer the killer. + * @return {@code True} if so. + */ + public boolean startDeath(Entity e, Entity killer) { + return true; + } + + /** + * Checks if a request can be made in this zone. + * @param type the type. + * @param target the target. + * @return {@code True} if so. + */ + public boolean canRequest(RequestType type, Player player, Player target) { + return true; + } + + /** + * Checks if the entity can move. + * @param e The entity. + * @param from The current location. + * @param to The destination location. + * @return {@code True} if so. + */ + public boolean move(Entity e, Location from, Location to) { + return true; + } + + /** + * Parses a command in this map zone. + * @param player the player. + * @param name the name. + * @param arguments the arguments. + * @return {@code True} if so. + */ + public boolean parseCommand(Player player, String name, String[] arguments) { + return false; + } + + /** + * Called when an entity changed location. + * @param e The entity. + * @param last The previous location the entity was standing on. + */ + public void locationUpdate(Entity e, Location last) { + + } + + /** + * Configures this map zone. + */ + public abstract void configure(); + + /** + * Cleans items from a players inventory, equipment and bank. + * @param player the player. + * @param items the items. + */ + public void cleanItems(Player player, Item[] items) { + if (player == null) { + return; + } + for (Item item : items) { + if (item == null) { + continue; + } + if (player.getInventory().containsItem(item)) { + player.getInventory().remove(new Item(item.getId(), player.getInventory().getAmount(item))); + } + if (player.getEquipment().containsItem(item)) { + player.getEquipment().remove(new Item(item.getId(), player.getEquipment().getAmount(item))); + } + if (player.getBank().containsItem(item)) { + player.getBank().remove(new Item(item.getId(), player.getBank().getAmount(item))); + } + } + } + + /** + * Sends a message to the entity (if it is a player). + * @param e The entity. + * @param message The message. + */ + protected static void message(Entity e, String message) { + if (!(e instanceof Player)) { + return; + } + ((Player) e).getPacketDispatch().sendMessage(message); + } + + /** + * Registers this mapzone in the appropriate regions. + * @param borders The borders of this zone. + */ + public void register(ZoneBorders borders) { + for (Integer id : borders.getRegionIds()) { + Region r = RegionManager.forId(id); + if (r != null) { + r.add(new RegionZone(this, borders)); + } + } + } + + /** + * Registers this zone in the region for the given id. + * @param regionId The region id. + */ + public void registerRegion(int regionId) { + register(ZoneBorders.forRegion(regionId)); + } + + /** + * Registers a region with zone borders and the region id. + * @param regionId the region id. + * @param borders the borders. + */ + public void registerRegion(int regionId, ZoneBorders borders) { + Region r = RegionManager.forId(regionId); + if (r != null) { + r.add(new RegionZone(this, borders)); + } + } + + /** + * Unregisters the borders in a region. + * @param regionId The region id. + */ + public void unregisterRegion(int regionId) { + Region r = RegionManager.forId(regionId); + if (r != null) { + for (Iterator it = r.getRegionZones().iterator(); it.hasNext();) { + if (it.next().getZone() == this) { + it.remove(); + } + } + } + } + + /** + * Disables the firing of random events in this zone. + */ + public void disableRandomEvents() { + this.fireRandomEvents = false; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * @param name The name to set. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the overlappable. + * @return The overlappable. + */ + public boolean isOverlappable() { + return overlappable; + } + + /** + * Sets the overlappable. + * @param overlappable The overlappable to set. + */ + public void setOverlappable(boolean overlappable) { + this.overlappable = overlappable; + } + + /** + * Gets the uid. + * @return The uid. + */ + public int getUid() { + return uid; + } + + /** + * Sets the uid. + * @param uid The uid to set. + */ + public void setUid(int uid) { + this.uid = uid; + } + + /** + * Gets the fireRandoms. + * @return The fireRandoms. + */ + public boolean isFireRandoms() { + return fireRandomEvents; + } + + /** + * If the zone is dynamicly added and removed. Non-location based zones will + * typicly return true. + * @return {@code false} on default. + */ + public boolean isDynamicZone() { + return false; + } + + /** + * Adds a restriction flag. + * @param restriction The restriction flag. + */ + public void addRestriction(ZoneRestriction restriction) { + addRestriction(restriction.getFlag()); + } + + /** + * Adds a restriction flag. + * @param flag The restriction flag. + */ + public void addRestriction(int flag) { + restriction |= flag; + } + + /** + * Checks if the restriction was flagged. + * @param flag The restriction flag. + * @return {@code True} if so. + */ + public boolean isRestricted(int flag) { + return (restriction & flag) != 0; + } + + /** + * Gets the restriction. + * @return The restriction. + */ + public int getRestriction() { + return restriction; + } + + /** + * Gets the type. + * @return The type. + */ + public int getZoneType() { + return zoneType; + } + + /** + * Sets the type. + * @param type The type to set. + */ + public void setZoneType(int type) { + this.zoneType = type; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/RegionZone.java b/Server/src/main/java/Server/core/game/world/map/zone/RegionZone.java new file mode 100644 index 000000000..102755f10 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/RegionZone.java @@ -0,0 +1,45 @@ +package core.game.world.map.zone; + +/** + * Represents a zone inside a single region of the world map. + * @author Emperor + */ +public final class RegionZone { + + /** + * The map zone. + */ + private final MapZone zone; + + /** + * The borders. + */ + private final ZoneBorders borders; + + /** + * Constructs a new {@code RegionZone} {@code Object}. + * @param zone The map zone. + * @param borders The borders. + */ + public RegionZone(MapZone zone, ZoneBorders borders) { + this.zone = zone; + this.borders = borders; + } + + /** + * Gets the borders. + * @return The borders. + */ + public ZoneBorders getBorders() { + return borders; + } + + /** + * Gets the zone. + * @return The zone. + */ + public MapZone getZone() { + return zone; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/Zone.java b/Server/src/main/java/Server/core/game/world/map/zone/Zone.java new file mode 100644 index 000000000..91cd44106 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/Zone.java @@ -0,0 +1,26 @@ +package core.game.world.map.zone; + +import core.game.node.entity.Entity; + +/** + * Represents a zone. + * @author Emperor + */ +public interface Zone { + + /** + * Checks if the entity can enter this map zone. + * @param e The entity. + * @return {@code True} if so. + */ + boolean enter(Entity e); + + /** + * Called when the entity leaves this map zone. + * @param e The entity. + * @param logout If the entity is logging out. + * @return {@code True} if the entity can leave. + */ + boolean leave(Entity e, boolean logout); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/ZoneBorders.java b/Server/src/main/java/Server/core/game/world/map/zone/ZoneBorders.java new file mode 100644 index 000000000..6b2c1bc45 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/ZoneBorders.java @@ -0,0 +1,271 @@ +package core.game.world.map.zone; + +import core.game.node.Node; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * Represents the borders of a zone. + * @author Emperor + */ +public final class ZoneBorders { + + /** + * The south west x-coordinate. + */ + private final int southWestX; + + /** + * The south west y-coordinate. + */ + private final int southWestY; + + /** + * The north east x-coordinate. + */ + private final int northEastX; + + /** + * The north east y-coordinate. + */ + private final int northEastY; + + /** + * The plane required to be on. + */ + private int plane; + + /** + * The list of exceptions. + */ + private List exceptions; + + /** + * If we need to do a zero plane check. + */ + private boolean zeroPlaneCheck; + + /** + * Constructs a new {@code ZoneBorders} {@code Object}. + * @param x1 The south west x-coordinate. + * @param y1 The south west y-coordinate. + * @param x2 The north east x-coordinate. + * @param y2 The north east y-coordinate. + * Invariant enforced at runtime. + */ + public ZoneBorders(int x1, int y1, int x2, int y2) { + this.southWestX = Math.min(x1, x2); + this.southWestY = Math.min(y1, y2); + this.northEastX = Math.max(x1, x2); + this.northEastY = Math.max(y1, y2); + } + + /** + * Constructs a new {@code ZoneBorders} {@code Object}. + * @param x1 The south west x-coordinate. + * @param y1 The south west y-coordinate. + * @param x2 The north east x-coordinate. + * @param y2 The north east y-coordinate. + * Invariant enforced at runtime. + * @param plane the plane. + */ + public ZoneBorders(int x1, int y1, int x2, int y2, int plane) { + this.southWestX = Math.min(x1, x2); + this.southWestY = Math.min(y1, y2); + this.northEastX = Math.max(x1, x2); + this.northEastY = Math.max(y1, y2); + this.setPlane(plane); + } + + /** + * Constructs a new {@code ZoneBorders} {@code Object}. + * @param x1 The south west x-coordinate. + * @param y1 The south west y-coordinate. + * @param x2 The north east x-coordinate. + * @param y2 The north east y-coordinate. + * Invariant enforced at runtime. + * @param plane the plane. + * @param zeroPlaneCheck the plane check. + */ + public ZoneBorders(int x1, int y1, int x2, int y2, int plane, boolean zeroPlaneCheck) { + this(x1, y1, x2, y2, plane); + this.zeroPlaneCheck = zeroPlaneCheck; + } + + /** + * Creates zone borders for the given region id. + * @param regionId The region id. + * @return The zone borders. + */ + public static ZoneBorders forRegion(int regionId) { + int baseX = ((regionId >> 8) & 0xFF) << 6; + int baseY = (regionId & 0xFF) << 6; + int size = 64 - 1; + return new ZoneBorders(baseX, baseY, baseX + size, baseY + size); + } + + /** + * Checks if the location is inside the borders. + * @param location The location. + * @return {@code True} if the location is inside the zone borders. + */ + public boolean insideBorder(Location location) { + return insideBorder(location.getX(), location.getY(), location.getZ()); + } + + /** + * Checks if the node is inside the borders. + * @param node the node. + * @return {@code True} if so. + */ + public boolean insideBorder(Node node) { + return insideBorder(node.getLocation()); + } + + /** + * Checks if the player is in the zone + * @param x the x. + * @param y the y. + * @return the z. + */ + public boolean insideBorder(int x, int y) { + return insideBorder(x, y, 0); + } + + /** + * Checks if the coordinates are inside the borders. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param z The z coordinate. + * @return {@code True} if the coordinates lay in the zone borders. + */ + public boolean insideBorder(int x, int y, int z) { + if (zeroPlaneCheck ? z != plane : (plane != 0 && z != plane)) { + return false; + } + if (southWestX <= x && southWestY <= y && northEastX >= x && northEastY >= y) { + if (exceptions != null) { + Object[] exceptArray = exceptions.toArray(); + int length = exceptArray.length; + for (int i = 0; i < length; i++) { + ZoneBorders exception = (ZoneBorders) exceptArray[i]; + if (exception.insideBorder(x, y, z)) { + return false; + } + } + } + return true; + } + return false; + } + + /** + * Gets the ids of all the regions inside these borders. + * @return The region ids. + */ + public List getRegionIds() { + List regionIds = new ArrayList<>(); + int neX = (northEastX >> 6) + 1; + int neY = (northEastY >> 6) + 1; + for (int x = southWestX >> 6; x < neX; x++) { + for (int y = southWestY >> 6; y < neY; y++) { + int id = y | x << 8; + regionIds.add(id); + } + } + return regionIds; + } + + /** + * Gets the southWestX. + * @return The southWestX. + */ + public int getSouthWestX() { + return southWestX; + } + + /** + * Gets the southWestY. + * @return The southWestY. + */ + public int getSouthWestY() { + return southWestY; + } + + /** + * Gets the northEastX. + * @return The northEastX. + */ + public int getNorthEastX() { + return northEastX; + } + + /** + * Gets the northEastY. + * @return The northEastY. + */ + public int getNorthEastY() { + return northEastY; + } + + /** + * Gets the exceptions. + * @return The exceptions. + */ + public List getExceptions() { + return exceptions; + } + + public Location getWeightedRandomLoc(int intensity) + { + int x = northEastX - southWestX == 0 ? southWestX : RandomFunction.normalRandDist(northEastX - southWestX, intensity) + southWestX; + int y = northEastY - southWestY == 0 ? southWestY : RandomFunction.normalRandDist(northEastY - southWestY, intensity) + southWestY; + return new Location(x, y); + } + + public Location getRandomLoc() { + int x = northEastX - southWestX == 0 ? southWestX : new Random().nextInt(northEastX - southWestX + 1) + southWestX; + int y = northEastY - southWestY == 0 ? southWestY : new Random().nextInt(northEastY - southWestY + 1) + southWestY; + return new Location(x, y); + } + + /** + * Adds an exception. + * @param exception The exception to add. + */ + public void addException(ZoneBorders exception) { + if (exceptions == null) { + this.exceptions = new ArrayList<>(); + } + exceptions.add(exception); + } + + @Override + public String toString() { + return "ZoneBorders [southWestX=" + southWestX + ", southWestY=" + southWestY + ", northEastX=" + northEastX + ", northEastY=" + northEastY + ", exceptions=" + exceptions + "]"; + } + + /** + * Gets the bplane. + * @return the plane + */ + public int getPlane() { + return plane; + } + + /** + * Sets the baplane. + * @param plane the plane to set. + */ + public void setPlane(int plane) { + this.plane = plane; + } + + public boolean insideRegion(Node n) { + return insideBorder(n.getLocation().getRegionX(), n.getLocation().getRegionY()); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/ZoneBuilder.java b/Server/src/main/java/Server/core/game/world/map/zone/ZoneBuilder.java new file mode 100644 index 000000000..b5e69f641 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/ZoneBuilder.java @@ -0,0 +1,32 @@ +package core.game.world.map.zone; + +import core.game.world.callback.CallBack; +import core.game.world.map.zone.impl.*; + + +/** + * Loads all the default zones. + * @author Emperor + */ +public class ZoneBuilder implements CallBack { + + @Override + public boolean call() { + configure(WildernessZone.getInstance()); + configure(MultiwayCombatZone.getInstance()); + configure(new ModeratorZone()); + configure(new DarkZone()); + configure(new KaramjaZone()); + configure(new BankZone()); + return true; + } + + /** + * Configures the map zone. + * @param zone The map zone. + */ + public static void configure(MapZone zone) { + zone.setUid(zone.getName().hashCode()); + zone.configure(); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/ZoneMonitor.java b/Server/src/main/java/Server/core/game/world/map/zone/ZoneMonitor.java new file mode 100644 index 000000000..626623697 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/ZoneMonitor.java @@ -0,0 +1,417 @@ +package core.game.world.map.zone; + +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.music.MusicZone; +import core.game.node.entity.player.link.request.RequestType; +import core.game.world.map.Location; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Handles the zones for an entity. + * @author Emperor + */ +public final class ZoneMonitor { + + /** + * The entity. + */ + private final Entity entity; + + /** + * The currently entered zones. + */ + private final List zones = new ArrayList<>(); + + /** + * The currently entered music zones. + */ + private final List musicZones = new ArrayList<>(); + + /** + * Constructs a new {@code ZoneMonitor} {@code Object}. + * @param entity The entity. + */ + public ZoneMonitor(Entity entity) { + this.entity = entity; + } + + /** + * Gets the zone type. + * @return The zone type. + */ + public int getType() { + for (RegionZone zone : zones) { + if (zone.getZone().getZoneType() != 0) { + return zone.getZone().getZoneType(); + } + } + return 0; + } + + /** + * Checks if the player can logout. + * @return {@code True} if so. + */ + public boolean canLogout() { + for (RegionZone z : zones) { + if (!z.getZone().canLogout((Player) entity)) { + return false; + } + } + return true; + } + + /** + * Checks if the restriction was flagged. + * @param restriction The restriction flag. + * @return {@code True} if so. + */ + public boolean isRestricted(ZoneRestriction restriction) { + return isRestricted(restriction.getFlag()); + } + + /** + * Checks if the restriction was flagged. + * @param flag The restriction flag. + * @return {@code True} if so. + */ + public boolean isRestricted(int flag) { + for (RegionZone z : zones) { + if (z.getZone().isRestricted(flag)) { + return true; + } + } + return false; + } + + /** + * Handles a death. + * @param killer The killer. + * @return {@code True} if the death got handled. + */ + public boolean handleDeath(Entity killer) { + for (RegionZone z : zones) { + if (z.getZone().death(entity, killer)) { + return true; + } + } + return false; + } + + /** + * Checks if the entity is able to continue attacking the target. + * @param target The target. + * @param style The combat style used. + * @return {@code True} if so. + */ + public boolean continueAttack(Node target, CombatStyle style) { + if (target instanceof Entity) { + if (!entity.continueAttack((Entity) target, style)) { + return false; + } + } + for (RegionZone z : zones) { + if (!z.getZone().continueAttack(entity, target, style, true)) { + return false; + } + } + if (entity instanceof Player && target instanceof Player) { + if (!((Player) entity).getSkullManager().isWilderness() || !((Player) target).getSkullManager().isWilderness()) { + ((Player) entity).getPacketDispatch().sendMessage("You can only attack other players in the wilderness."); + return false; + } + } + if (target instanceof Entity && !MapZone.checkMulti(entity, (Entity) target, true)) { + return false; + } + return true; + } + + /** + * Checks if the entity can interact with the target. + * @param target The target to interact with. + * @param option The option. + * @return {@code True} if the option got handled. + */ + public boolean interact(Node target, Option option) { + for (RegionZone z : zones) { + if (z.getZone().interact(entity, target, option)) { + return true; + } + } + return false; + } + + /** + * Checks if the player handled the reward button using a map zone. + * @param interfaceId The interface id. + * @param buttonId The button id. + * @param slot The slot. + * @param itemId The item id. + * @param opcode The packet opcode. + * @return {@code True} if the button got handled. + */ + public boolean clickButton(int interfaceId, int buttonId, int slot, int itemId, int opcode) { + for (RegionZone z : zones) { + if (z.getZone().actionButton((Player) entity, interfaceId, buttonId, slot, itemId, opcode)) { + return true; + } + } + return false; + } + + /** + * Checks if multiway combat zone rules should be ignored. + * @param victim The victim. + * @return {@code True} if this entity can attack regardless of multiway + * combat zone. + */ + public boolean isIgnoreMultiBoundaries(Entity victim) { + for (RegionZone z : zones) { + if (z.getZone().ignoreMultiBoundaries(entity, victim)) { + return true; + } + } + return false; + } + + /** + * Checks if the entity can teleport. + * @param type The teleport type (0=spell, 1=item, 2=object, 3=npc -1= force) + * @return {@code True} if so. + */ + public boolean teleport(int type, Node node) { + if (type != -1 && entity.isTeleBlocked()) { + if (entity.isPlayer()) { + entity.asPlayer().sendMessage("A magical force has stopped you from teleporting."); + } + return false; + } + for (RegionZone z : zones) { + if (!z.getZone().teleport(entity, type, node)) { + return false; + } + } + return true; + } + + /** + * Checks if the death should start for an entity. + * @param entity the entity. + * @param killer the killer. + * @return {@code True} if so. + */ + public boolean startDeath(Entity entity, Entity killer) { + for (RegionZone z : zones) { + if (!z.getZone().startDeath(entity, killer)) { + return false; + } + } + return true; + } + + /** + * Checks if the entity can fire a random event. + * @return {@code True} if so. + */ + public boolean canFireRandomEvent() { + for (RegionZone z : zones) { + if (!z.getZone().isFireRandoms()) { + return false; + } + } + return true; + } + + /** + * Clears the zones. + * @return {@code True} if the entity successfully left all regions. + */ + public boolean clear() { + for (RegionZone z : zones) { + if (!z.getZone().leave(entity, true)) { + return false; + } + } + for (MusicZone z : musicZones) { + z.leave(entity, true); + } + zones.clear(); + musicZones.clear(); + return true; + } + + /** + * Checks if the entity can move. + * @param location The destination location. + * @param destination The destination location. + * @return {@code True} if so. + */ + public boolean move(Location location, Location destination) { + for (RegionZone z : zones) { + if (!z.getZone().move(entity, location, destination)) { + return false; + } + } + return true; + } + + /** + * Handles a location update. + * @param last The last location of the entity. + * @return {@code false} If the entity could not enter/leave a region. + */ + public boolean updateLocation(Location last) { + if(entity instanceof Player && !entity.asPlayer().isArtificial()) { + checkMusicZones(); + } + entity.updateLocation(last); + for (Iterator it = zones.iterator(); it.hasNext();) { + RegionZone zone = it.next(); + if (!zone.getBorders().insideBorder(entity)) { + if (zone.getZone().isDynamicZone()) { + continue; + } + if (!zone.getZone().leave(entity, false)) { + return false; + } + it.remove(); + } + } + for (RegionZone zone : entity.getViewport().getRegion().getRegionZones()) { + if (!zone.getBorders().insideBorder(entity)) { + continue; + } + boolean alreadyEntered = false; + for (RegionZone z : zones) { + if (z.getZone() == zone.getZone()) { + alreadyEntered = true; + break; + } + } + if (alreadyEntered) { + zone.getZone().locationUpdate(entity, last); + continue; + } + if (!zone.getZone().enter(entity)) { + return false; + } + zones.add(zone); + zone.getZone().locationUpdate(entity, last); + } + return true; + } + + /** + * Checks the music zones. + */ + public void checkMusicZones() { + if (!(entity instanceof Player)) { + return; + } + Player player = (Player) entity; + Location l = player.getLocation(); + for (Iterator it = musicZones.iterator(); it.hasNext();) { + MusicZone zone = it.next(); + if (!zone.getBorders().insideBorder(l.getX(), l.getY())) { + zone.leave(player, false); + it.remove(); + } + } + for (MusicZone zone : player.getViewport().getRegion().getMusicZones()) { + if (!zone.getBorders().insideBorder(l.getX(), l.getY())) { + continue; + } + if (!musicZones.contains(zone)) { + zone.enter(player); + musicZones.add(zone); + } + } + if (musicZones.isEmpty() && !player.getMusicPlayer().isPlaying()) { + player.getMusicPlayer().playDefault(); + } + } + + /** + * Parses commands in a certain zone. + * @param player the player. + * @param name the name. + * @param arguments the arguments. + * @return {@code True} if parsed. + */ + public boolean parseCommand(Player player, String name, String[] arguments) { + for (RegionZone zone : zones) { + if (zone.getZone().parseCommand(player, name, arguments)) { + return true; + } + } + return false; + } + + /** + * Checks if a request can be made in this zone. + * @param type the type. + * @param target the target. + * @return {@code True} if so. + */ + public boolean canRequest(RequestType type, Player target) { + for (RegionZone zone : zones) { + if (!zone.getZone().canRequest(type, entity.asPlayer(), target)) { + return false; + } + } + return true; + } + + /** + * Checks if the entity is in a zone. + * @param name The name of the zone. + * @return {@code True} if so. + */ + public boolean isInZone(String name) { + int uid = name.hashCode(); + for (RegionZone zone : zones) { + if (zone.getZone().getUid() == uid) { + return true; + } + } + return false; + } + + /** + * Removes the proper region zone for the given map zone. + * @param zone The map zone. + */ + public void remove(MapZone zone) { + for (Iterator it = zones.iterator(); it.hasNext();) { + if (it.next().getZone() == zone) { + it.remove(); + break; + } + } + } + + /** + * Gets the zones list. + * @return The list of region zones the entity is in. + */ + public List getZones() { + return zones; + } + + /** + * Gets the musicZones. + * @return The musicZones. + */ + public List getMusicZones() { + return musicZones; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/ZoneRestriction.java b/Server/src/main/java/Server/core/game/world/map/zone/ZoneRestriction.java new file mode 100644 index 000000000..fb600ce2d --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/ZoneRestriction.java @@ -0,0 +1,41 @@ +package core.game.world.map.zone; + +/** + * The zone restrictions. + * @author Emperor + */ +public enum ZoneRestriction { + + /** + * No followers allowed in this zone. + */ + FOLLOWERS, + + /** + * No random events allowed. + */ + RANDOM_EVENTS, + + /** + * No fires allowed. + */ + FIRES, + + /** + * Members only. + */ + MEMBERS, + + /** + * No cannons allowed. + */ + CANNON, ; + + /** + * Gets the restriction flag. + * @return The flag. + */ + public int getFlag() { + return 1 << ordinal(); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/ZoneType.java b/Server/src/main/java/Server/core/game/world/map/zone/ZoneType.java new file mode 100644 index 000000000..839ebc6d9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/ZoneType.java @@ -0,0 +1,59 @@ +package core.game.world.map.zone; + +/** + * Represents the default zone types. + * @author Emperor + */ +public enum ZoneType { + + /** + * Default zone. + */ + DEFAULT(0), + + /** + * Safe area. + */ + SAFE(1), + + /** + * Player-owner house type. + */ + P_O_H(2), + + /** + * Castle wars zone. + */ + CASTLE_WARS(3), + + /** + * Trouble brewing zone. + */ + TROUBLE_BREWING(4), + + /** + * Barbarian assault zone. + */ + BARBARIAN_ASSAULT(5), ; + + /** + * The zone id. + */ + private final int id; + + /** + * Constructs a new {@code ZoneType} {@code Object}. + * @param id The zone id. + */ + ZoneType(int id) { + this.id = id; + } + + /** + * Gets the id. + * @return The id. + */ + public int getId() { + return id; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/impl/BankZone.java b/Server/src/main/java/Server/core/game/world/map/zone/impl/BankZone.java new file mode 100644 index 000000000..0a11a7bfa --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/impl/BankZone.java @@ -0,0 +1,49 @@ +package core.game.world.map.zone.impl; + +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; + +/** + * Represents a bank zone. + * @author 'Vexia + */ +public final class BankZone extends MapZone { + + /** + * Represents the instance. + */ + private static final BankZone INSTANCE = new BankZone(); + + /** + * Represents the varrock west bank. + */ + public static final ZoneBorders VARROCK_WEST = new ZoneBorders(3179, 3432, 3194, 3446); + + /** + * Represents the varrock east bank. + */ + public static final ZoneBorders VARROCK_EAST = new ZoneBorders(3250, 3416, 3257, 3423); + + + /** + * Constructs a new {@code BankZone} {@code Object}. + */ + public BankZone() { + super("bank", true); + } + + @Override + public void configure() { + register(VARROCK_WEST); + register(VARROCK_EAST); + } + + /** + * Gets the instance. + * @return The instance. + */ + public static BankZone getInstance() { + return INSTANCE; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/impl/DarkZone.java b/Server/src/main/java/Server/core/game/world/map/zone/impl/DarkZone.java new file mode 100644 index 000000000..0861ca16f --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/impl/DarkZone.java @@ -0,0 +1,190 @@ +package core.game.world.map.zone.impl; + +import core.game.component.Component; +import core.game.content.global.LightSource; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.combat.ImpactHandler.HitsplatType; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.RegionZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.node.entity.skill.skillcapeperks.SkillcapePerks; + +/** + * Handles a dark area. + * @author Emperor + */ +public final class DarkZone extends MapZone { + + /** + * The darkness overlay. + */ + public static final Component DARKNESS_OVERLAY = new Component(96) { + @Override + public void open(final Player player) { + Pulse pulse = player.getExtension(DarkZone.class); + if (pulse != null && pulse.isRunning()) { + return; + } + pulse = new Pulse(2, player) { + int count = 0; + + @Override + public boolean pulse() { + if (count == 0) { + player.getPacketDispatch().sendMessage("You hear tiny insects skittering over the ground..."); + } else if (count == 5) { + player.getPacketDispatch().sendMessage("Tiny biting insects swarm all over you!"); + } else if (count > 5) { + player.getImpactHandler().manualHit(player, 1, HitsplatType.NORMAL); + } + count++; + return false; + } + }; + GameWorld.getPulser().submit(pulse); + player.addExtension(DarkZone.class, pulse); + super.open(player); + } + + @Override + public boolean close(final Player player) { + if (!super.close(player)) { + return false; + } + Pulse pulse = player.getExtension(DarkZone.class); + if (pulse != null) { + pulse.stop(); + } + return true; + } + }; + + /** + * Constructs a new {@code DarkZone} {@code Object}. + */ + public DarkZone() { + super("Dark zone", true); + } + + @Override + public void configure() { + register(new ZoneBorders(1728, 5120, 1791, 5247)); + registerRegion(12693); + registerRegion(12949); + register(new ZoneBorders(3306,9661,3222,9600)); + register(new ZoneBorders(3717,9473,3841,9346)); + } + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (e instanceof Player) { + Player player = (Player) e; + if (player.getInterfaceManager().getOverlay() != DARKNESS_OVERLAY) { + return true; + } + return false; + } + return true; + } + + @Override + public boolean interact(Entity e, Node target, Option option) { + if (target instanceof Item) { + Item item = (Item) target; + LightSource s = LightSource.forProductId(item.getId()); + if (s != null) { + String name = option.getName().toLowerCase(); + if (name.equals("drop")) { + ((Player) e).getPacketDispatch().sendMessage("Dropping the " + s.getName() + " would leave you without a light source."); + return true; + } + if (name.equals("extinguish")) { + ((Player) e).getPacketDispatch().sendMessage("Extinguishing the " + s.getName() + " would leave you without a light source."); + return true; + } + } + } + return false; + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + final Player player = (Player) e; + LightSource source = LightSource.getActiveLightSource(player); + if(SkillcapePerks.isActive(SkillcapePerks.CONSTANT_GLOW,player)){ + return true; + } + if (source == null) { + player.getInterfaceManager().openOverlay(DARKNESS_OVERLAY); + } else if (source.getInterfaceId() > 0) { + player.getInterfaceManager().openOverlay(new Component(source.getInterfaceId())); + } + } + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (e instanceof Player) { + ((Player) e).getInterfaceManager().closeOverlay(); + } + return true; + } + + /** + * Updates the overlay. + * @param player The player. + */ + public void updateOverlay(Player player) { + LightSource source = LightSource.getActiveLightSource(player); + if(SkillcapePerks.isActive(SkillcapePerks.CONSTANT_GLOW,player)){ + if(player.getInterfaceManager().getOverlay().getId() == DARKNESS_OVERLAY.getId()) + player.getInterfaceManager().closeOverlay(); + return; + } + int overlay = -1; + if (player.getInterfaceManager().getOverlay() != null) { + overlay = player.getInterfaceManager().getOverlay().getId(); + } + if (source == null) { + if (overlay != DARKNESS_OVERLAY.getId()) { + player.getInterfaceManager().openOverlay(DARKNESS_OVERLAY); + } + return; + } + Pulse pulse = player.getExtension(DarkZone.class); + if (pulse != null) { + pulse.stop(); + } + if (source.getInterfaceId() != overlay) { + if (source.getInterfaceId() == -1) { + player.getInterfaceManager().closeOverlay(); + return; + } + player.getInterfaceManager().openOverlay(new Component(source.getInterfaceId())); + } + } + + /** + * Checks if the player is in a dark area and will update accordingly. + * @param p The player. + */ + public static boolean checkDarkArea(Player p) { + for (RegionZone r : p.getZoneMonitor().getZones()) { + if (r.getZone() instanceof DarkZone) { + DarkZone zone = (DarkZone) r.getZone(); + zone.updateOverlay(p); + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/impl/KaramjaZone.java b/Server/src/main/java/Server/core/game/world/map/zone/impl/KaramjaZone.java new file mode 100644 index 000000000..fb66645e8 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/impl/KaramjaZone.java @@ -0,0 +1,53 @@ +package core.game.world.map.zone.impl; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.zone.MapZone; + +/** + * Represents the karamja zone area. + * @author 'Vexia + * @version 1.0 + */ +public final class KaramjaZone extends MapZone { + + /** + * Represents the region ids. + */ + private static final int[] REGIONS = new int[] { 11309, 11054, 11566, 11565, 11567, 11568, 11053, 11821, 11055, 11057, 11569, 11822, 11823, 11825, 11310, 11311, 11312, 11313, 11314, 11056, 11057, 11058, 10802, 10801 }; + + /** + * Represents the karamjan rum item. + */ + private static final Item KARAMJAN_RUM = new Item(431); + + /** + * Constructs a new {@code KaramjaZone} {@code Object}. + */ + public KaramjaZone() { + super("karamja", true); + } + + @Override + public void configure() { + for (int regionId : REGIONS) { + registerRegion(regionId); + } + } + + @Override + public boolean teleport(Entity entity, int type, Node node) { + if (entity instanceof Player) { + final Player p = ((Player) entity); + int amt = p.getInventory().getAmount(KARAMJAN_RUM); + if (amt != 0) { + p.getInventory().remove(new Item(KARAMJAN_RUM.getId(), amt)); + p.getPacketDispatch().sendMessage("During the trip you lose your rum to a sailor in a game of dice. Better luck next time!"); + } + } + return super.teleport(entity, type, node); + } + +} diff --git a/Server/src/main/java/Server/core/game/world/map/zone/impl/ModeratorZone.java b/Server/src/main/java/Server/core/game/world/map/zone/impl/ModeratorZone.java new file mode 100644 index 000000000..1c8b113dd --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/impl/ModeratorZone.java @@ -0,0 +1,132 @@ +package core.game.world.map.zone.impl; + +import core.ServerConstants; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.link.TeleportManager.TeleportType; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; + +/** + * Represents the moderator zone. + * @author Vexia + * + */ +public class ModeratorZone extends MapZone { + + /** + * Represents if the moderator zone is open. + */ + public static boolean open = true; + + /** + * Represents the center of the zone. + */ + public static final Location center = Location.create(2846, 5213, 0); + + /** + * Constructs a new {@code ModeratorZone} {@code Object}. + */ + public ModeratorZone() { + super("Moderator Zone", true); + } + + @Override + public boolean enter(final Entity entity) { + if (!(entity instanceof Player)) { + return true; + } + final Player player = ((Player) entity); + if ((!open && player.getDetails().getRights() != Rights.ADMINISTRATOR)) { + home(player); + return false; + } + if (player.getDetails().getRights() == Rights.PLAYER_MODERATOR) { + // player.getInterfaceManager().removeTabs(0, 1, 2, 3, 4, 5, 6, 12); + } else { + player.getPacketDispatch().sendMessage(getToggleMessage()); + } + return true; + } + + @Override + public boolean leave(final Entity entity, final boolean logout) { + if (!(entity instanceof Player)) { + return true; + } + final Player player = ((Player) entity); + player.getInterfaceManager().restoreTabs(); + return true; + } + + @Override + public boolean interact(Entity entity, Node target, Option option) { + if (entity instanceof Player) { + } + return super.interact(entity, target, option); + } + + @Override + public void configure() { + register(new ZoneBorders(2840, 5204, 2853, 5224)); + } + + /** + * Method used to toggle the moderator zone. + * @param player the player. + * @param on the toggle switch. + */ + public static final void toggle(final Player player, final boolean on) { + open = on ? true : false; + player.getPacketDispatch().sendMessage(getToggleMessage()); + if (!open) { + for (Player p : RegionManager.getLocalPlayers(center)) { + if (p == null || p.getDetails().getRights() == Rights.ADMINISTRATOR) { + continue; + } + home(p); + } + } + } + + /** + * Method used to get the togglemessage. + * @return the message. + */ + public static final String getToggleMessage() { + return "The moderator room is currently " + (open ? "available" : "not available") + " to player moderators."; + } + + /** + * Method used to send a player home. + * @param player the player. + */ + public static final void home(final Player player) { + player.getTeleporter().send(ServerConstants.HOME_LOCATION, TeleportType.NORMAL); + } + + /** + * Method used to teleport a player into the zone. + * @param player the player. + */ + public static final void teleport(final Player player) { + player.getTeleporter().send(center, TeleportType.NORMAL); + } + + /** + * Method used to check if the moderator zone is open. + * @return return True if so. + */ + public static boolean isOpen() { + if (!open) { + return false; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/core/game/world/map/zone/impl/MultiwayCombatZone.java b/Server/src/main/java/Server/core/game/world/map/zone/impl/MultiwayCombatZone.java new file mode 100644 index 000000000..e0ac6ba2d --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/impl/MultiwayCombatZone.java @@ -0,0 +1,167 @@ +package core.game.world.map.zone.impl; + +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.MapDistance; +import core.game.world.map.RegionManager; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.ZoneBorders; +import core.net.packet.PacketRepository; +import core.net.packet.context.InterfaceContext; +import core.net.packet.out.CloseInterface; +import core.net.packet.out.Interface; + +/** + * Handles the multiway combat zones. + * @author Emperor + */ +public final class MultiwayCombatZone extends MapZone { + + /** + * The instance. + */ + private static final MultiwayCombatZone INSTANCE = new MultiwayCombatZone(); + + /** + * Constructs a new {@code MultiwayCombatZone} {@code Object}. + */ + private MultiwayCombatZone() { + super("Multicombat", true); + } + + @Override + public void configure() { + register(new ZoneBorders(3210, 9333, 3339, 9424)); + register(new ZoneBorders(2607, 3296, 2644, 3332)); + register(new ZoneBorders(2949, 3370, 3001, 3392)); + register(new ZoneBorders(3250, 9800, 3342, 9870)); + register(new ZoneBorders(3190, 3648, 3327, 3839)); + register(new ZoneBorders(3200, 3840, 3390, 3967)); + register(new ZoneBorders(2992, 3912, 3007, 3967)); + register(new ZoneBorders(2946, 3816, 2959, 3831)); + register(new ZoneBorders(3008, 3856, 3199, 3903)); + register(new ZoneBorders(3008, 3600, 3071, 3711)); + register(new ZoneBorders(3072, 3608, 3327, 3647)); + register(new ZoneBorders(2624, 2550, 2690, 2619)); + register(new ZoneBorders(2371, 5062, 2422, 5117)); + register(new ZoneBorders(2896, 3595, 2927, 3630)); + register(new ZoneBorders(2820, 5250, 2955, 5370)); + register(new ZoneBorders(2892, 4435, 2932, 4464)); + register(new ZoneBorders(2724, 5071, 2747, 5109)); + register(new ZoneBorders(2256, 4680, 2287, 4711)); + register(new ZoneBorders(3107, 3234, 3134, 3259)); + register(new ZoneBorders(2931, 3514, 2940, 3518)); + register(new ZoneBorders(2869, 3687, 2940, 3839)); + register(new ZoneBorders(1728, 5120, 1791, 5247)); + register(new ZoneBorders(3136, 3523, 3328, 3710)); + registerRegion(13105, new ZoneBorders(3282, 3159, 3303, 3177)); + registerRegion(12341); + // Kalphite queen lair + registerRegion(13972); + // Abbys area + registerRegion(12107); + registerRegion(7505); + // Rock crabs. + registerRegion(10554); + // Wizard's tower + registerRegion(12337); + // zmi + registerRegion(13131); + // Kraken + registerRegion(14682); + //top of GE + register(new ZoneBorders(3154, 3483, 3176, 3500, 2)); + // Tzhaar caves + register(new ZoneBorders(2424, 5105, 2536, 5183)); + register(new ZoneBorders(2487, 10113, 2563, 10174)); + registerRegion(7236); + registerRegion(7492); + registerRegion(7748); + registerRegion(12610); + register(new ZoneBorders(3097, 4224, 3225, 4317)); + register(new ZoneBorders(3116, 5412, 3362, 5584)); + register(new ZoneBorders(3078, 5520, 3123, 5552, 0)); + registerRegion(11844); //Corporeal beast + registerRegion(10329);//TDS + registerRegion(13370);//Venenatis + registerRegion(12603);//Callisto + registerRegion(14939);//Kalphite Stronghold Cave + } + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player p = (Player) e; + boolean resizable = p.getInterfaceManager().isResizable(); + PacketRepository.send(Interface.class, new InterfaceContext(p, p.getInterfaceManager().getWindowPaneId(), resizable ? 17 : 7, 745, true)); + p.getPacketDispatch().sendInterfaceConfig(745, 1, false); + } + e.getProperties().setMultiZone(true); + return super.enter(e); + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (!logout && e instanceof Player) { + Player p = (Player) e; + boolean resizable = p.getInterfaceManager().isResizable(); + PacketRepository.send(CloseInterface.class, new InterfaceContext(p, p.getInterfaceManager().getWindowPaneId(), resizable ? 17 : 7, 745, true)); + } + e.getProperties().setMultiZone(false); + return super.leave(e, logout); + } + + @Override + public boolean move(Entity e, Location loc, Location destination) { + // Disables "NPC stacking". + if (e.getProperties().isNPCWalkable()) { + return true; + } + boolean pestControl = e.getViewport().getRegion().getRegionId() == 10536; + boolean player = e instanceof Player; + if (!player) { + Direction dir = Direction.getDirection(loc, destination); + if (dir.getStepX() != 0 && dir.getStepY() != 0) { + return true; // Allow diagonal steps so people can still "stack" + // npcs (see barraging mummies) + } + } + if (e instanceof NPC || pestControl) { + for (NPC n : RegionManager.getLocalNpcs(e, MapDistance.RENDERING.getDistance() / 2)) { + if (n.isInvisible() || !n.getDefinition().hasAttackOption() || n == e) { + continue; + } + if (player && pestControl && !(n.getId() >= 3772 && n.getId() <= 3776)) { + continue; + } + Location l = n.getLocation(); + // TODO: Better support for sizes. + int s = n.size() - 1; + int x = destination.getX(); + int y = destination.getY(); + if (x > l.getX()) { + x += e.size() - 1; + } + if (y > l.getY()) { + y += e.size() - 1; + } + if (l.getX() <= x && l.getY() <= y && (l.getX() + s) >= x && (l.getY() + s) >= y) { + return false; + } + } + } + return true; + } + + /** + * Gets the instance. + * @return The instance. + */ + public static MultiwayCombatZone getInstance() { + return INSTANCE; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/map/zone/impl/WildernessZone.java b/Server/src/main/java/Server/core/game/world/map/zone/impl/WildernessZone.java new file mode 100644 index 000000000..a0d8c54be --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/map/zone/impl/WildernessZone.java @@ -0,0 +1,429 @@ +package core.game.world.map.zone.impl; + +import core.game.component.Component; +import core.game.container.Container; +import core.game.node.entity.combat.DeathTask; +import core.game.node.entity.player.link.IronmanMode; +import core.game.node.item.GroundItem; +import core.game.system.config.NPCConfigParser; +import core.game.content.ame.AntiMacroNPC; +import core.game.node.entity.skill.summoning.familiar.Familiar; +import core.game.interaction.Option; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.combat.CombatStyle; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.npc.agg.AggressiveBehavior; +import core.game.node.entity.npc.agg.AggressiveHandler; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.zone.MapZone; +import core.game.world.map.zone.RegionZone; +import core.game.world.map.zone.ZoneBorders; +import core.game.world.repository.Repository; +import core.tools.RandomFunction; +import core.game.interaction.item.brawling_gloves.BrawlingGloves; +import core.game.content.ttrail.UriNPC; + +import java.util.ArrayList; +import java.util.List; + +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_BASE; +import static core.game.node.entity.player.info.stats.StatAttributeKeysKt.STATS_DEATHS; + +/** + * Handles the wilderness zone. + * @author Emperor + */ +public final class WildernessZone extends MapZone { + /** + * The PvP gear items + */ + private static int[] PVP_GEAR = { 13887, 13893, 13899, 13905, 13870, 13873, 13876, 13879, 13883, 13884, 13890, 13896, 13902, 13858, 13861, 13864, 13867}; + + /** + * The wilderness zone. + */ + private static final WildernessZone INSTANCE = new WildernessZone(new ZoneBorders(2944, 3525, 3400, 3975), new ZoneBorders(3070, 9924, 3135, 10002), ZoneBorders.forRegion(12193), ZoneBorders.forRegion(11937)); + + /** + * The zone borders. + */ + private ZoneBorders[] borders; + + /** + * Constructs a new {@code WildernessZone} {@code Object}. + */ + public WildernessZone(ZoneBorders... borders) { + super("Wilderness", true); + this.borders = borders; + } + + @Override + public void configure() { + for (ZoneBorders border : borders) { + register(border); + } + } + + /** + * calculate drop rate for rev items based on combat level + * @author ceik + * @param combatLevel + * @return + */ + public int getNewDropRate(int combatLevel){ + double x = combatLevel; + double A = 44044.5491; + double B = -7360.19548; + return (int) (A + (B * Math.log(x))) / 2; + } + + /** + * Handles rev drops + * @author ceik + * @param e The entity dying. + * @param killer The killer. + * @return true + */ + @Override + public boolean death(Entity e, Entity killer) { + try { + if (e instanceof UriNPC) { + e.finalizeDeath(killer); + } + if(e instanceof Player){ + Player player = e.asPlayer(); + player.getSettings().setSpecialEnergy(100); + player.getSettings().updateRunEnergy(player.getSettings().getRunEnergy() - 100); + Player owner = killer instanceof Player ? (Player) killer : player; + player.getPacketDispatch().sendMessage("Oh dear, you are dead!"); + player.incrementAttribute("/save:"+STATS_BASE+":"+STATS_DEATHS); + + //If player was a Hardcore Ironman, announce that they died + if (player.getIronmanManager().getMode().equals(IronmanMode.HARDCORE)){ //if this was checkRestriction, ultimate irons would be moved to HARDCORE_DEAD as well + String gender = player.isMale() ? "Man " : "Woman "; + Repository.sendNews("Hardcore Iron " + gender + " " + player.getUsername() +" has fallen. Total Level: " + player.getSkills().getTotalLevel()); // Not enough room for XP + player.getIronmanManager().setMode(IronmanMode.STANDARD); + player.getSavedData().getActivityData().setHardcoreDeath(true); + player.sendMessage("You have fallen as a Hardcore Iron Man, your Hardcore status has been revoked."); + } + + player.getPacketDispatch().sendTempMusic(90); + if (player.getDetails().getRights() != Rights.ADMINISTRATOR) { + GroundItemManager.create(new Item(526), player.getLocation(), owner); + final Container[] c = DeathTask.getContainers(player); + boolean gravestone = player.getGraveManager().generateable() && player.getIronmanManager().getMode() != IronmanMode.ULTIMATE && !(killer instanceof Player); + int seconds = player.getGraveManager().getType().getDecay() * 60; + int ticks = (1000 * seconds) / 600; + List items = new ArrayList<>(); + for (Item item : c[1].toArray()) { + if (item != null) { + GroundItem ground; + if (item.hasItemPlugin()) { + item = item.getPlugin().getDeathItem(item); + } + if (!item.getDefinition().isTradeable()) { + ground = new GroundItem(item, player.getLocation(), gravestone ? ticks + 100 : 200, player); + } else { + ground = new GroundItem(item.getDropItem(), player.getLocation(), owner); + } + items.add(ground); + ground.setDropper(owner); //Checking for ironman mode in any circumstance for death items is inaccurate to how it works in both 2009scapes. + GroundItemManager.create(ground); + } + } + player.getEquipment().clear(); + player.getInventory().clear(); + if(!player.getSkullManager().isSkulled() || killer instanceof NPC) { + player.getInventory().addAll(c[0]); + } else { + for(Item item : c[0].toArray()){ + GroundItemManager.create(item,player.getLocation(),owner); + } + } + player.getFamiliarManager().dismiss(); + + } + player.getSkullManager().setSkulled(false); + player.removeAttribute("combat-time"); + player.getPrayer().reset(); + player.getAppearance().sync(); + if (GameWorld.isEconomyWorld() && !player.getSavedData().getGlobalData().isDeathScreenDisabled()) { + player.getInterfaceManager().open(new Component(153)); + } + if (!player.getSavedData().getGlobalData().isDeathScreenDisabled()) { + player.getInterfaceManager().open(new Component(153)); + } + } + if (e instanceof NPC && killer instanceof Player && (e.asNpc().getName().contains("Revenant") || e.asNpc().getName().equals("Chaos elemental"))) { + int combatLevel = e.asNpc().getDefinition().getCombatLevel(); + int dropRate = getNewDropRate(combatLevel); + for (int i = 0; i < PVP_GEAR.length; i++) { + boolean chance = RandomFunction.random(dropRate) == dropRate / 2; + if (chance) { + Item reward; + if (PVP_GEAR[i] == 13879 || PVP_GEAR[i] == 13883) { // checks if it's a javelin or throwing axe + reward = new Item(PVP_GEAR[i], RandomFunction.random(15, 50)); + } else { + reward = new Item(PVP_GEAR[i]); + } + Repository.sendNews(killer.asPlayer().getUsername() + " has received a " + reward.getName() + " from a " + e.asNpc().getName() + "!"); + GroundItemManager.create(reward, ((NPC) e).getDropLocation(), killer.asPlayer()); + return true; + } + } + } + if (killer.isPlayer()) { + if (e instanceof NPC) { + boolean gloveDrop = RandomFunction.random(1, 100) == 54; + if (gloveDrop) { + byte glove = (byte) RandomFunction.random(1, 13); + Item reward = new Item(BrawlingGloves.forIndicator(glove).getId()); + GroundItemManager.create(reward, e.asNpc().getDropLocation(), killer.asPlayer()); + Repository.sendNews(killer.getUsername() + " has received " + reward.getName().toLowerCase() + " from a " + e.asNpc().getName() + "!"); + } + e.asNpc().getDefinition().getDropTables().drop(e.asNpc(), killer); + if (((NPC) e).getTask() != null && killer instanceof Player && ((Player) killer).getSlayer().getTask() == e.asNpc().getTask()) { + ((Player) killer).getSlayer().finalizeDeath(killer.asPlayer(), e.asNpc()); + } + } + + } + + if (e instanceof NPC || e instanceof AntiMacroNPC) { + e.asNpc().setRespawnTick(GameWorld.getTicks() + e.asNpc().getDefinition().getConfiguration(NPCConfigParser.RESPAWN_DELAY, 17)); + if (!e.asNpc().isRespawn()) { + e.asNpc().clear(); + } + } + } catch (Exception f){ + System.out.println("Unhandled NPC death in wilderness: " + e.getId()); + } + return true; + } + + /** + * Fixes attack options for the revs + * @param e The entity. + * @param target The target to interact with. + * @param option The option. + * @return true + */ + @Override + public boolean interact(Entity e, Node target, Option option) { + if(target instanceof NPC){ + if(target.asNpc().getName().contains("Revenant")){ + e.asPlayer().getProperties().getCombatPulse().attack(target); + return true; + } + } + return super.interact(e, target, option); + } + + + + @Override + public boolean enter(Entity e) { + if (e instanceof Player) { + Player p = (Player) e; + if(!p.isArtificial()) { + show(p); + } else { + p.getSkullManager().setWilderness(true); + p.getSkullManager().setLevel(getWilderness(p)); + } + p.getAntiMacroHandler().isDisabled = true; + for (int i = 0; i < 7; i++) { + if (i == 5 || i == 3) { + continue; + } + if(p.getAttributes().containsKey("overload") || p.getSkills().getLevel(i) > 118){ + if (p.getSkills().getLevel(i) > p.getSkills().getStaticLevel(i)) { + p.getSkills().setLevel(i, p.getSkills().getStaticLevel(i)); + p.removeAttribute("overload"); + } + } + } + if (p.getFamiliarManager().hasFamiliar() && !p.getFamiliarManager().hasPet()) { + Familiar familiar = p.getFamiliarManager().getFamiliar(); + familiar.transform(); + } + p.getAppearance().sync(); + } else if (e instanceof NPC) { + NPC n = (NPC) e; + if (n.getDefinition().hasAttackOption()) { + n.setAggressive(true); + n.setAggressiveHandler(new AggressiveHandler(n, AggressiveBehavior.WILDERNESS)); + } + } + return true; + } + + @Override + public boolean leave(Entity e, boolean logout) { + if (!logout && e instanceof Player) { + Player p = (Player) e; + leave(p); + p.getAntiMacroHandler().isDisabled = p.getAttribute("randoms:disabled",false); + if (p.getFamiliarManager().hasFamiliar() && !p.getFamiliarManager().hasPet()) { + Familiar familiar = p.getFamiliarManager().getFamiliar(); + if (familiar.isCombatFamiliar()) { + familiar.reTransform(); + } + } + p.getAppearance().sync(); + } + return true; + } + + /** + * Method used to remove traces of being in the zone. + * @param p the player. + */ + public final void leave(final Player p) { + Component overlay = new Component(381); + if (overlay.getId() == 381) { + p.getInterfaceManager().close(overlay); + } + p.getInteraction().remove(Option._P_ATTACK); + p.getSkullManager().setWilderness(false); + p.getSkullManager().setLevel(0); + } + + /** + * Method used to show being the wilderness. + * @param p the player. + */ + public static final void show(final Player p) { + if (p.getSkullManager().isWildernessDisabled()) { + return; + } + p.getInterfaceManager().openWildernessOverlay(new Component(381)); + p.getSkullManager().setLevel(getWilderness(p)); + p.getPacketDispatch().sendString("Level: " + p.getSkullManager().getLevel(), 381, 1); + p.getInteraction().set(Option._P_ATTACK); + p.getSkullManager().setWilderness(true); + } + + @Override + public boolean teleport(Entity e, int type, Node node) { + if (e instanceof Player) { + Player p = (Player) e; + if (p.getDetails().getRights() == Rights.ADMINISTRATOR) { + return true; + } + if (!checkTeleport(p, (node != null && node instanceof Item && (((Item) node).getName().contains("glory") || ((Item) node).getName().contains("slaying")) ? 30 : 20))) { + return false; + } + } + return true; + } + + /** + * Method used to check if a player can teleport past a level. + * @param p the player. + * @param level the level. + * @return {@code True} if they can teleport. + */ + public static boolean checkTeleport(Player p, int level) { + if (p.getSkullManager().getLevel() > level && !p.getSkullManager().isWildernessDisabled()) { + message(p, "You can't teleport this deep in the wilderness!"); + return false; + } + return true; + } + + @Override + public boolean continueAttack(Entity e, Node target, CombatStyle style, boolean message) { + if (e instanceof Player && target instanceof Player) { + Player p = (Player) e; + Player t = (Player) target; + int level = p.getSkullManager().getLevel(); + if (t.getSkullManager().getLevel() < level) { + level = t.getSkullManager().getLevel(); + } + int combat = p.getProperties().getCurrentCombatLevel(); + int targetCombat = t.getProperties().getCurrentCombatLevel(); + if (combat - level > targetCombat || combat + level < targetCombat) { + if (message) { + p.getPacketDispatch().sendMessage("The level difference between you and your opponent is too great."); + } + return false; + } + } + return true; + } + + @Override + public void locationUpdate(Entity e, Location last) { + if (e instanceof Player && !e.asPlayer().isArtificial()) { + Player p = (Player) e; + p.getSkullManager().setLevel(getWilderness(p)); + Component overlay = p.getInterfaceManager().getOverlay(); + if (overlay == null || overlay.getId() != 381) { + show(p); + } + if (!p.getSkullManager().isWildernessDisabled()) { + p.getPacketDispatch().sendString("Level: " + p.getSkullManager().getLevel(), 381, 1); + } + } + } + + /** + * Checks if the entity is inside the wilderness. + * @param e The entity. + * @return {@code True} if so. + */ + public static boolean isInZone(Entity e) { + Location l = e.getLocation(); + for (RegionZone zone : e.getViewport().getRegion().getRegionZones()) { + if (zone.getZone() == INSTANCE && zone.getBorders().insideBorder(l.getX(), l.getY())) { + return true; + } + } + return false; + } + + /** + * The wilderness level. + * @return the level. + */ + public static int getWilderness(Entity e) { + final int regionId = e.getViewport().getRegion().getId(); + int offsetY = 3524; + if (regionId == 12443 || e.getViewport().getRegion().getId() == 12444) { + offsetY = 9923; + } else if (regionId == 12193) { + offsetY = 10000 - 80; + } else if (regionId == 11937) { + offsetY = 9920; + } + int level = (int) Math.ceil((double) (e.getLocation().getY() - offsetY) / 8d); + if (level < 0) { + return 1; + } + return level; + } + + /** + * Gets the zone borders. + * @return The borders. + */ + public ZoneBorders[] getBorders() { + return borders; + } + + /** + * Gets the instance. + * @return The instance. + */ + public static WildernessZone getInstance() { + return INSTANCE; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/objectparser/ObjectParser.java b/Server/src/main/java/Server/core/game/world/objectparser/ObjectParser.java new file mode 100644 index 000000000..b9a8b25c3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/objectparser/ObjectParser.java @@ -0,0 +1,117 @@ +package core.game.world.objectparser; + +import core.ServerConstants; +import core.game.node.object.GameObject; +import core.game.world.GameWorld; +import core.game.world.map.build.LandscapeParser; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManifest; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import core.plugin.CorePluginTypes.StartupPlugin; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.File; + +@Initializable +@PluginManifest(name="ObjectParser") +public class ObjectParser extends StartupPlugin { + + public void parseObjects(){ + File f = new File(ServerConstants.OBJECT_PARSER_PATH); + if(!f.exists()){ + System.out.println("[ObjectParser]: Can't find file " + ServerConstants.OBJECT_PARSER_PATH); + return; + } + + try{ + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(f); + + NodeList parseList = doc.getElementsByTagName("ObjectAction"); + + System.out.println("Parsing " + parseList.getLength() + " object modifications."); + + for(int i = 0; i < parseList.getLength(); i++){ + Node parseNode = parseList.item(i); + if(parseNode.getNodeType() == Node.ELEMENT_NODE){ + Element parseElement = (Element) parseNode; + String type = parseElement.getAttribute("mode"); + switch(type){ + case "add": { + int id = Integer.parseInt(parseElement.getAttribute("id")); + int x = Integer.parseInt(parseElement.getAttribute("x")); + int y = Integer.parseInt(parseElement.getAttribute("y")); + int z = Integer.parseInt(parseElement.getAttribute("z")); + int objType = 10; + if (parseElement.hasAttribute("type")) { + objType = Integer.parseInt(parseElement.getAttribute("type")); + } + String rawDir = parseElement.getAttribute("direction"); + int dir = 1; + switch (rawDir) { + case "n": + dir = 1; + break; + case "ne": + dir = 2; + break; + case "nw": + dir = 0; + break; + case "w": + dir = 3; + break; + case "e": + dir = 4; + break; + case "sw": + dir = 5; + break; + case "se": + dir = 7; + break; + case "s": + dir = 6; + break; + } + LandscapeParser.addGameObject(new GameObject(id, x, y, z, objType, dir)); + break; + } + case "remove": { + int id = Integer.parseInt(parseElement.getAttribute("id")); + int x = Integer.parseInt(parseElement.getAttribute("x")); + int y = Integer.parseInt(parseElement.getAttribute("y")); + int z = Integer.parseInt(parseElement.getAttribute("z")); + int objType = 10; + LandscapeParser.removeGameObject(new GameObject(id,x,y,z)); + } + } + } + } + } catch (Exception e){ + e.printStackTrace(); + } + } + + @Override + public void run() { + parseObjects(); + } + + @Override + public Plugin newInstance(Object arg) throws Throwable { + GameWorld.getSTARTUP_PLUGINS().add(this); + return this; + } + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/game/world/repository/DisconnectionQueue.kt b/Server/src/main/java/Server/core/game/world/repository/DisconnectionQueue.kt new file mode 100644 index 000000000..06203fa9c --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/repository/DisconnectionQueue.kt @@ -0,0 +1,207 @@ +package core.game.world.repository + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.login.PlayerParser +import core.game.system.SystemLogger +import core.game.system.mysql.SQLEntryHandler +import core.game.system.mysql.impl.HighscoreSQLHandler +import core.game.system.mysql.impl.PlayerLogSQLHandler +import core.game.system.task.TaskExecutor +import core.game.world.GameWorld +import java.util.* +import java.util.concurrent.ConcurrentHashMap + +/** + * Handles disconnecting players queuing. + * @author Emperor + */ +class DisconnectionQueue { + /**A + * The pending disconnections queue. + */ + private val queue: MutableMap + + /** + * Updates all entries. + */ + fun update() { + if (queue.isEmpty() || GameWorld.ticks % 3 != 0 && GameWorld.settings?.isDevMode != true) { + return + } + //make a copy of current entries as to avoid concurrency exceptions + val entries = ArrayList(queue.entries) + + //loop through entries and disconnect each + entries.forEach { + if(finish(it.value,false)) queue.remove(it.key) + } + } + + /** + * Finishes a disconnection. + * @param entry The entry. + * @param force If finalization should be forced. + */ + private fun finish(entry: DisconnectionEntry?, force: Boolean): Boolean { + val player = entry!!.player + if (!force && player.allowRemoval()) { + return false + } + if (entry.isClear) { + player.clear() + } + Repository.playerNames.remove(player.name) + Repository.lobbyPlayers.remove(player) + Repository.players.remove(player) + Repository.LOGGED_IN_PLAYERS.remove(player.details.username) + SystemLogger.logInfo("Player cleared. Removed ${player.details.username}") + try { + player.communication.clan.leave(player, false) + } catch (e: Exception) { + } + if (player.isArtificial) { + return true + } + if (!force) { + TaskExecutor.executeSQL { save(player, true) } + return true + } + save(player, false) + return true + } + + /** + * Gets a queued player. + * @param name The player name. + * @return The player instance. + */ + operator fun get(name: String?): Player? { + val entry = queue[name] + return entry?.player + } + + /** + * Clears the queue. + */ + fun clear() { + for (entry in queue.values) { + finish(entry, true) + } + queue.clear() + } + + fun safeClear(){ + for(entry in queue.values){ + finish(entry,false) + } + queue.clear() + } + /** + * Adds a player to the disconnection queue. + * @param player The player. + * @param clear If the player should be cleared. + */ + /** + * Adds a player to the disconnection queue. + * @param player The player. + */ + @JvmOverloads + fun add(player: Player, clear: Boolean = false) { + queue[player.name] = DisconnectionEntry(player, clear) + } + + /** + * Checks if the queue contains the player name. + * @param name The name. + * @return `True` if so. + */ + operator fun contains(name: String?): Boolean { + return queue.containsKey(name) + } + + /** + * Removes a queued player. + * @param name The name. + */ + fun remove(name: String?) { + queue.remove(name) + } + + /** + * Represents an entry in the disconnection queue, holding the disconnected + * player and time stamp of disconnection. + * @author Emperor + */ + internal inner class DisconnectionEntry( + /** + * The player. + */ + val player: Player, + /** + * If the `Player#clear()` method should be called. + */ + var isClear: Boolean) { + /** + * Gets the timeStamp. + * @return The timeStamp. + */ + /** + * Sets the timeStamp. + * @param timeStamp The timeStamp to set. + */ + /** + * The time of disconnection. + */ + var timeStamp: Int + + /** + * Gets the player. + * @return The player. + */ + + /** + * Gets the clear. + * @return The clear. + */ + /** + * Sets the clear. + * @param isClear The clear to set. + */ + + /** + * Constructs a new `DisconnectionQueue` `Object`. + * @param player The disconnecting player. + * @param clear If the player should be cleared. + */ + init { + timeStamp = GameWorld.ticks + } + } + + /** + * Saves the player. + * @param player The player to be saved. + * @param sql If the sql database should be updated. + */ + fun save(player: Player, sql: Boolean): Boolean { + try { + PlayerParser.save(player) + if (sql) { + player.details.sqlManager.update(player) + player.details.save() + SQLEntryHandler.write(HighscoreSQLHandler(player)) + SQLEntryHandler.write(PlayerLogSQLHandler(player.monitor, player.name)) + } + return true + } catch (t: Throwable) { + t.printStackTrace() + } + return false + } + /** + * Constructs a new `DisconnectionQueue` `Object`. + */ + init { + queue = ConcurrentHashMap() + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/repository/InitializationEntry.java b/Server/src/main/java/Server/core/game/world/repository/InitializationEntry.java new file mode 100644 index 000000000..e5b86daf1 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/repository/InitializationEntry.java @@ -0,0 +1,88 @@ +package core.game.world.repository; + +import core.game.node.Node; + +/** + * Wraps around a node to represent its entry in a queue. + * @author Emperor + */ +public class InitializationEntry { + + /** + * The node. + */ + private final Node node; + + /** + * If the node is being removed from the game, rather than added. + */ + private boolean removal; + + /** + * Constructs a new {@code InitializationEntry} {@code Object}. + * @param node The node. + */ + public InitializationEntry(Node node) { + this(node, false); + } + + /** + * Constructs a new {@code InitializationEntry} {@code Object}. + * @param node The node. + * @param removal If the node should be removed from the game, rather than + * added. + */ + public InitializationEntry(Node node, boolean removal) { + this.node = node; + this.removal = removal; + } + + /** + * Initializes the node. + * @return The node instance. + */ + public Node initialize() { + node.setActive(true); + return node; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof InitializationEntry)) { + return false; + } + return ((InitializationEntry) o).node.equals(node); + } + + @Override + public int hashCode() { + if (node != null) { + return node.hashCode(); + } + return super.hashCode(); + } + + /** + * Gets the node. + * @return The node. + */ + public Node getNode() { + return node; + } + + /** + * Gets the removal. + * @return The removal. + */ + public boolean isRemoval() { + return removal; + } + + /** + * Sets the removal. + * @param removal The removal to set. + */ + public void setRemoval(boolean removal) { + this.removal = removal; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/repository/InitializingNodeList.java b/Server/src/main/java/Server/core/game/world/repository/InitializingNodeList.java new file mode 100644 index 000000000..1d227ecf3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/repository/InitializingNodeList.java @@ -0,0 +1,64 @@ +package core.game.world.repository; + +import core.game.node.Node; + +import java.util.ArrayList; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +/** + * A node list implementation backed by an initialization queue. + * @author Emperor + */ +public final class InitializingNodeList extends ArrayList { + + /** + * The serial UID. + */ + private static final long serialVersionUID = 7727358901001709156L; + + /** + * The queue. + */ + private final Queue queue = new ConcurrentLinkedQueue<>(); + + /** + * Constructs a new {@code InitializingNodeList} {@code Object}. + */ + public InitializingNodeList() { + super(); + } + + /** + * Synchronizes the backing queue with this list. + */ + @SuppressWarnings("unchecked") + public void sync() { + while (!queue.isEmpty()) { + InitializationEntry entry = queue.poll(); + if (entry.isRemoval()) { + super.remove(entry.getNode()); + entry.getNode().setRenderable(false); + } else { + Node n = entry.initialize(); + if (n != null) { + super.add((T) n); + n.setRenderable(true); + } + } + } + } + + @Override + public boolean add(T node) { + return !contains(node) && queue.add(new InitializationEntry(node, false)); + } + + @Override + public boolean remove(Object node) { + if (!contains(node)) { + return false; + } + return queue.add(new InitializationEntry((Node) node, true)); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/repository/NodeList.java b/Server/src/main/java/Server/core/game/world/repository/NodeList.java new file mode 100644 index 000000000..c55f2491a --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/repository/NodeList.java @@ -0,0 +1,231 @@ +package core.game.world.repository; + +import core.game.node.Node; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; + +/** + * A class which represents a list of nodes. + * @author Graham Edgecombe + * @author Emperor + * @param The type of Node. + */ +public class NodeList implements Collection, Iterable { + + /** + * Internal nodes array. + */ + private Node[] nodes; + + /** + * Current size. + */ + private int size = 0; + + /** + * Creates a Node list with the specified capacity. + * @param capacity The capacity. + */ + public NodeList(int capacity) { + nodes = new Node[capacity + 1]; // do not use idx 0 + } + + /** + * Gets an Node. + * @param index The index. + * @return The Node. + * @throws IndexOutOufBoundException if the index is out of bounds. + */ + @SuppressWarnings("unchecked") + public E get(int index) { + synchronized (this) { + if (index <= 0 || index >= nodes.length) { + throw new IndexOutOfBoundsException(); + } + return (E) nodes[index]; + } + } + + /** + * Gets the index of an Node. + * @return The index in the list. + */ + public int indexOf(Node node) { + return node.getIndex(); + } + + /** + * Gets the next free id. + * @return The next free id. + */ + private int getNextId() { + for (int i = 1; i < nodes.length; i++) { + if (nodes[i] == null) { + return i; + } + } + return -1; + } + + @Override + public boolean add(E arg0) { + synchronized (this) { + int id = getNextId(); + if (id == -1) { + return false; + } + nodes[id] = arg0; + arg0.setIndex(id); + size++; + return true; + } + } + + @Override + public boolean addAll(Collection arg0) { + synchronized (this) { + boolean changed = false; + for (E node : arg0) { + if (add(node)) { + changed = true; + } + } + return changed; + } + } + + @Override + public void clear() { + synchronized (this) { + for (int i = 1; i < nodes.length; i++) { + nodes[i] = null; + } + size = 0; + } + } + + @Override + public boolean contains(Object arg0) { + synchronized (this) { + for (int i = 1; i < nodes.length; i++) { + if (nodes[i] == arg0) { + return true; + } + } + } + return false; + } + + @Override + public boolean containsAll(Collection arg0) { + boolean failed = false; + for (Object o : arg0) { + if (!contains(o)) { + failed = true; + } + } + return !failed; + } + + @Override + public boolean isEmpty() { + return size() == 0; + } + + @Override + public Iterator iterator() { + return new NodeListIterator(this); + } + + /** + * Removes the node on this index. + * @param index The index. + * @return {@code True} if a node got removed. + */ + public boolean remove(int index) { + synchronized (this) { + Node n = nodes[index]; + if (n != null) { + size--; + nodes[index] = null; + } + return n != null; + } + } + + @Override + public boolean remove(Object arg0) { + synchronized (this) { + for (int i = 1; i < nodes.length; i++) { + if (nodes[i] == arg0) { + nodes[i] = null; + size--; + return true; + } + } + return false; + } + } + + @Override + public boolean removeAll(Collection arg0) { + synchronized (this) { + boolean changed = false; + for (Object o : arg0) { + if (remove(o)) { + changed = true; + } + } + return changed; + } + } + + @Override + public boolean retainAll(Collection arg0) { + synchronized (this) { + boolean changed = false; + for (int i = 1; i < nodes.length; i++) { + if (nodes[i] != null) { + if (!arg0.contains(nodes[i])) { + nodes[i] = null; + size--; + changed = true; + } + } + } + return changed; + } + } + + @Override + public int size() { + return size; + } + + public int length(){ return nodes.length;} + + @Override + public Node[] toArray() { + synchronized (this) { + int size = size(); + Node[] array = new Node[size]; + int ptr = 0; + for (int i = 1; i < nodes.length; i++) { + if (nodes[i] != null) { + array[ptr++] = nodes[i]; + } + } + return array; + } + } + + @SuppressWarnings("unchecked") + @Override + public T[] toArray(T[] arg0) { + Node[] arr = toArray(); + return (T[]) Arrays.copyOf(arr, arr.length, arg0.getClass()); + } + +} diff --git a/Server/src/main/java/Server/core/game/world/repository/NodeListIterator.java b/Server/src/main/java/Server/core/game/world/repository/NodeListIterator.java new file mode 100644 index 000000000..5f125698f --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/repository/NodeListIterator.java @@ -0,0 +1,80 @@ +package core.game.world.repository; + +import core.game.node.Node; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +/** + * An implementation of an iterator for a node list. + * @author Graham Edgecombe + * @author Emperor + * @param The type of node. + */ +public class NodeListIterator implements Iterator { + + /** + * The nodes. + */ + private Node[] nodes; + + /** + * The entity list. + */ + private NodeList entityList; + + /** + * The previous index. + */ + private int lastIndex = -1; + + /** + * The current index. + */ + private int cursor = 0; + + /** + * The size of the list. + */ + private int size; + + /** + * Creates an node list iterator. + * @param nodeList The node list. + */ + public NodeListIterator(NodeList nodeList) { + this.entityList = nodeList; + nodes = nodeList.toArray(new Node[0]); + size = nodes.length; + } + + @Override + public boolean hasNext() { + while (cursor < size) { + if (nodes[cursor] != null) { + return true; + } + cursor++; + } + return false; + } + + @SuppressWarnings("unchecked") + @Override + public E next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + lastIndex = cursor++; + return (E) nodes[lastIndex]; + } + + @Override + public void remove() { + if (lastIndex == -1) { + throw new IllegalStateException(); + } + entityList.remove(nodes[lastIndex]); + } + +} diff --git a/Server/src/main/java/Server/core/game/world/repository/Repository.kt b/Server/src/main/java/Server/core/game/world/repository/Repository.kt new file mode 100644 index 000000000..126f6465f --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/repository/Repository.kt @@ -0,0 +1,169 @@ +package core.game.world.repository + +import core.ServerConstants +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import java.util.concurrent.CopyOnWriteArrayList +import java.util.HashMap +import kotlin.jvm.JvmOverloads +import core.game.world.map.RegionManager +import core.game.world.map.Location +import java.util.ArrayList + +/** + * The repository holding all node lists, etc in the game world. + * @author Emperor + */ +object Repository { + /** + * Represents the repository of active players. + */ + @JvmStatic + val players = NodeList(ServerConstants.MAX_PLAYERS) + /** + * Represents the repository of active npcs. + */ + @JvmStatic + val npcs = NodeList(ServerConstants.MAX_NPCS) + + /** + * List of player names who have logged in, quick and dirty work-around for the double-logging issue. + * This list needs to have values added to it before any sort of parsing is done for the login process due + * to the time it takes for the parsing to occur, which is the root of this issue to begin with. + */ + val LOGGED_IN_PLAYERS: MutableList = ArrayList(ServerConstants.MAX_PLAYERS) + + /** + * The renderable NPCs. + */ + private val RENDERABLE_NPCS: MutableList = CopyOnWriteArrayList() + + /** + * A mapping holding the players sorted by their names. + */ + @JvmStatic + val playerNames: MutableMap = HashMap() + /** + * Represents the list of players in lobby. + */ + @JvmStatic + val lobbyPlayers: MutableList = ArrayList() + /** + * The disconnection queue. + */ + @JvmStatic + val disconnectionQueue = DisconnectionQueue() + /** + * Sends a market update message to all players. + * @param string The string. + * @param color The color. + */ + @JvmOverloads + fun sendMarketUpdate(string: String, icon: Int = 12, color: String = "") { + val players: Array = playerNames.values.toTypedArray() + val size = players.size + for (i in 0 until size) { + val player = players[i] as Player ?: continue + player.sendMessage("" + color + "Market Update: " + string) + } + } + /** + * Send a news message to all players. + * @param string The string. + * @param icon The icon. + */ + @JvmStatic + fun sendNews(string: String, icon: Int = 12, color: String = "") { + val players: Array = playerNames.values.toTypedArray() + val size = players.size + for (i in 0 until size) { + val player = players[i] as Player ?: continue + player.sendMessage("" + color + "News: " + string) + } + } + + /** + * This is another sendnews method which redirects to the one above. + * This needs to exist because java fails to recognize default arguments in Kotlin methods.... + * I fucking hate java. + */ + @JvmStatic + fun sendNews(string: String){ + sendNews(string,12) + } + + /** + * Adds a renderable NPC. + * @param npc The NPC. + */ + @JvmStatic + fun addRenderableNPC(npc: NPC) { + if (!RENDERABLE_NPCS.contains(npc)) { + RENDERABLE_NPCS.add(npc) + npc.isRenderable = true + } + } + + /** + * Removes an NPC from rendering. + * @param npc The NPC. + */ + @JvmStatic + fun removeRenderableNPC(npc: NPC) { + RENDERABLE_NPCS.remove(npc) + npc.isRenderable = false + } + + /** + * Finds the NPC on the given location. + * @param l The location. + * @return The NPC, or `null` if the NPC wasn't found. + */ + @JvmStatic + fun findNPC(l: Location): NPC? { + for (n in RegionManager.getRegionPlane(l).npcs) { + if (n.location == l) { + return n + } + } + return null + } + + /** + * Find a non-player character. + * @param npcId The non-player character's id. + * @return The non-player character's node. + */ + @JvmStatic + fun findNPC(npcId: Int): NPC? { + for (npc in npcs) { + if (npc == null) { + continue + } + if (npc.id == npcId) { + return npc + } + } + return null + } + + /** + * Get a player by its username. + * @param name The player's **username**. + * @return The player. + */ + @JvmStatic + fun getPlayerByName(name: String?): Player? { + return if (name == null) { + null + } else playerNames[name.toLowerCase().replace(" ".toRegex(), "_")] + } + + /** + * Gets the renderableNpcs. + * @return The renderableNpcs. + */ + @JvmStatic + val renderableNpcs: List + get() = RENDERABLE_NPCS +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/MapChunkRenderer.kt b/Server/src/main/java/Server/core/game/world/update/MapChunkRenderer.kt new file mode 100644 index 000000000..a24f32141 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/MapChunkRenderer.kt @@ -0,0 +1,72 @@ +package core.game.world.update + +import core.game.node.entity.player.Player +import core.game.world.map.RegionChunk +import core.net.packet.PacketRepository +import core.net.packet.context.ClearChunkContext +import core.net.packet.out.ClearRegionChunk +import java.util.* + +/** + * Handles the rendering of the player's surrounding map chunks. + * @author Emperor + */ +object MapChunkRenderer { + /** + * Sends the map chunk rendering packet. + * @param player The player. + */ + @JvmStatic + fun render(player: Player) { + val v = player.viewport + val last = player.playerFlags.lastViewport + val updated: MutableList = ArrayList() + val current = v.chunks + if (!Arrays.equals(current, last)) { //don't update if the viewport hasn't changed + var sizeX = last.size + for (x in 0 until sizeX) { + val sizeY: Int = last[x].size + for (y in 0 until sizeY) { + val previous = last[x][y] ?: continue + if (!containsChunk(current, previous)) { + PacketRepository.send(ClearRegionChunk::class.java, ClearChunkContext(player, previous)) + } else { + updated.add(previous) + } + } + } + sizeX = current.size + for (x in 0 until sizeX) { + val sizeY: Int = current[x].size + for (y in 0 until sizeY) { + val chunk = current[x][y] + if (!updated.contains(chunk)) { + chunk.synchronize(player) + } else { + chunk.update(player) + } + last[x][y] = current[x][y] + } + } + } + } + + /** + * Checks if the chunks list contains the specified region chunk. + * @param list The list to search. + * @param c The region chunk. + * @return `True` if so. + */ + private fun containsChunk(list: Array>, c: RegionChunk): Boolean { + val sizeList = list.size + for (x in 0 until sizeList) { + val chunkSize: Int = list[x].size + for (y in 0 until chunkSize) { + if (list[x][y] === c) { + return true + } + } + } + return false + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/NPCRenderer.kt b/Server/src/main/java/Server/core/game/world/update/NPCRenderer.kt new file mode 100644 index 000000000..99c474909 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/NPCRenderer.kt @@ -0,0 +1,118 @@ +package core.game.world.update + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.world.GameWorld +import core.game.world.map.RegionManager +import core.net.packet.IoBuffer +import core.net.packet.PacketHeader +import java.nio.ByteBuffer +import java.util.* + +/** + * The NPC renderer. + * @author Emperor + */ +object NPCRenderer { + /** + * Handles the NPC rendering for a player. + * @param player The player. + */ + @JvmStatic + fun render(player: Player) { + val buffer = IoBuffer(32, PacketHeader.SHORT) + val info = player.renderInfo + val localNPCs = info.localNpcs + val maskBuffer = IoBuffer(-1, PacketHeader.NORMAL, ByteBuffer.allocate(1 shl 16)) + buffer.setBitAccess() + buffer.putBits(8, localNPCs.size) + val toRemove: MutableList = ArrayList() + val it: Iterator = localNPCs.iterator() + while (it.hasNext()) { + val npc = it.next() + val withinDistance = player.location.withinDistance(npc.location) + if (npc.isHidden(player) || !withinDistance || npc.properties.isTeleporting) { + buffer.putBits(1, 1).putBits(2, 3) + toRemove.add(npc) + if (!withinDistance && npc.aggressiveHandler != null) { + npc.aggressiveHandler.removeTolerance(player.index) + } + } else if (npc.walkingQueue.runDir != -1) { + buffer.putBits(1, 1).putBits(2, 2).putBits(3, npc.walkingQueue.walkDir).putBits(3, npc.walkingQueue.runDir) + flagMaskUpdate(player, buffer, maskBuffer, npc, false) + } else if (npc.walkingQueue.walkDir != -1) { + buffer.putBits(1, 1).putBits(2, 1).putBits(3, npc.walkingQueue.walkDir) + flagMaskUpdate(player, buffer, maskBuffer, npc, false) + } else if (npc.updateMasks.isUpdateRequired) { + buffer.putBits(1, 1).putBits(2, 0) + writeMaskUpdates(player, maskBuffer, npc, false) + } else { + buffer.putBits(1, 0) + } + } + localNPCs.removeAll(toRemove) + for (npc in RegionManager.getLocalNpcs(player)) { + if (localNPCs.size >= 255) { + break + } + if (localNPCs.contains(npc) || npc.isHidden(player)) { + continue + } + buffer.putBits(15, npc.index).putBits(1, if (npc.properties.isTeleporting) 1 else 0).putBits(3, npc.direction.ordinal) + flagMaskUpdate(player, buffer, maskBuffer, npc, true) + var offsetX = npc.location.x - player.location.x + var offsetY = npc.location.y - player.location.y + if (offsetX < 0) { + offsetX += 32 + } + if (offsetY < 0) { + offsetY += 32 + } + buffer.putBits(5, offsetY) + buffer.putBits(14, npc.id) + buffer.putBits(5, offsetX) + if (npc.aggressiveHandler != null) { + npc.aggressiveHandler.playerTolerance[player.index] = GameWorld.ticks + } + localNPCs.add(npc) + } + val masks = maskBuffer.toByteBuffer() + masks.flip() + if (masks.hasRemaining()) { + buffer.putBits(15, 32767) + buffer.setByteAccess() + buffer.put(masks) + } else { + buffer.setByteAccess() + } + player.session.write(buffer) + } + + /** + * Sets the mask update flag. + * @param buffer The buffer to write on. + * @param npc The NPC. + */ + private fun flagMaskUpdate(player: Player, buffer: IoBuffer, maskBuffer: IoBuffer, npc: NPC, sync: Boolean) { + if (npc.updateMasks.isUpdateRequired) { + buffer.putBits(1, 1) + writeMaskUpdates(player, maskBuffer, npc, sync) + } else { + buffer.putBits(1, 0) + } + } + + /** + * Writes the mask updates. + * @param maskBuffer The mask buffer to write on. + * @param npc The NPC to update. + * @param sync If called upon synchronization. + */ + fun writeMaskUpdates(player: Player?, maskBuffer: IoBuffer?, npc: NPC, sync: Boolean) { + if (sync) { + npc.updateMasks.writeSynced(player, npc, maskBuffer!!, true) + } else { + npc.updateMasks.write(player, npc, maskBuffer!!) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/PlayerRenderer.kt b/Server/src/main/java/Server/core/game/world/update/PlayerRenderer.kt new file mode 100644 index 000000000..0fb1068bc --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/PlayerRenderer.kt @@ -0,0 +1,180 @@ +package core.game.world.update + +import core.game.node.entity.player.Player +import core.game.node.entity.player.info.RenderInfo +import core.game.world.map.RegionManager +import core.net.packet.IoBuffer +import core.net.packet.PacketHeader + +/** + * Handles the player rendering. + * @author Emperor + */ +object PlayerRenderer { + /** + * The maximum amount of players to add per cycle. + */ + private const val MAX_ADD_COUNT = 10 + + /** + * Handles the player rendering for a player. + * @param player The player. + */ + @JvmStatic + fun render(player: Player) { + val buffer = IoBuffer(225, PacketHeader.SHORT) + val flags = IoBuffer(-1, PacketHeader.NORMAL) + val info = player.renderInfo + updateLocalPosition(player, buffer, flags) + buffer.putBits(8, info.localPlayers.size) + val it = info.localPlayers.iterator() + while (it.hasNext()) { + val other = it.next() + if (!other.isActive || !other.location.withinDistance(player.location) || other.properties.isTeleporting || other.isInvisible) { + buffer.putBits(1, 1) + buffer.putBits(2, 3) + it.remove() + continue + } + renderLocalPlayer(player, other, buffer, flags) + } + var count = 0 + for (other in RegionManager.getLocalPlayers(player, 15)) { + if (other === player || !other.isActive || info.localPlayers.contains(other) || other.isInvisible) { + continue + } + if (info.localPlayers.size >= 255 || ++count == MAX_ADD_COUNT) { + break + } + addLocalPlayer(player, other, info, buffer, flags) + } + val masks = flags.toByteBuffer() + masks.flip() + if (masks.hasRemaining()) { + buffer.putBits(11, 2047) + buffer.setByteAccess() + buffer.put(masks) + } else { + buffer.setByteAccess() + } + player.details.session.write(buffer) + } + + /** + * Renders a local player. + * @param player The player we're updating for. + * @param other The player. + * @param buffer The buffer. + * @param flags The update flags buffer. + */ + private fun renderLocalPlayer(player: Player, other: Player, buffer: IoBuffer, flags: IoBuffer) { + if (other.walkingQueue.runDir != -1) { + buffer.putBits(1, 1) // Updating + buffer.putBits(2, 2) // Sub opcode + buffer.putBits(1, 1) + buffer.putBits(3, other.walkingQueue.walkDir) + buffer.putBits(3, other.walkingQueue.runDir) + flagMaskUpdate(player, other, buffer, flags, false, false) + } else if (other.walkingQueue.walkDir != -1) { + buffer.putBits(1, 1) // Updating + buffer.putBits(2, 1) // Sub opcode + buffer.putBits(3, other.walkingQueue.walkDir) + flagMaskUpdate(player, other, buffer, flags, false, false) + } else if (other.updateMasks.isUpdateRequired) { + buffer.putBits(1, 1) + buffer.putBits(2, 0) + writeMaskUpdates(player, other, flags, false, false) + } else { + buffer.putBits(1, 0) + } + } + + /** + * Adds a local player. + * @param player The player. + * @param other The player to add. + * @param info The render info of the player. + * @param buffer The buffer. + * @param flags The flag based buffer. + */ + private fun addLocalPlayer(player: Player, other: Player, info: RenderInfo, buffer: IoBuffer, flags: IoBuffer) { + buffer.putBits(11, other.index) + var offsetX = other.location.x - player.location.x + var offsetY = other.location.y - player.location.y + if (offsetY < 0) { + offsetY += 32 + } + if (offsetX < 0) { + offsetX += 32 + } + val appearance = info.appearanceStamps[other.index and 0x800] != other.updateMasks.appearanceStamp + val update = appearance || other.updateMasks.isUpdateRequired || other.updateMasks.hasSynced() + buffer.putBits(1, if (update) 1 else 0) + buffer.putBits(5, offsetX) + buffer.putBits(3, other.direction.ordinal) + buffer.putBits(1, if (other.properties.isTeleporting) 1 else 0) + buffer.putBits(5, offsetY) + info.localPlayers.add(other) + if (update) { + if (appearance) { + info.appearanceStamps[other.index and 0x800] = other.updateMasks.appearanceStamp + } + writeMaskUpdates(player, other, flags, appearance, true) + } + } + + /** + * Updates the local player's client position. + * @param local The local player. + * @param buffer The i/o buffer. + * @param flags The update flags buffer. + */ + private fun updateLocalPosition(local: Player, buffer: IoBuffer, flags: IoBuffer) { + if (local.playerFlags.isUpdateSceneGraph || local.properties.isTeleporting) { + buffer.putBits(1, 1) // Updating + buffer.putBits(2, 3) // Sub opcode + buffer.putBits(7, local.location.getSceneY(local.playerFlags.lastSceneGraph)) + buffer.putBits(1, if (local.properties.isTeleporting) 1 else 0) + buffer.putBits(2, local.location.z) + flagMaskUpdate(local, local, buffer, flags, false, false) + buffer.putBits(7, local.location.getSceneX(local.playerFlags.lastSceneGraph)) + } else { + renderLocalPlayer(local, local, buffer, flags) + } + } + + /** + * Sets the update mask flag. + * @param local The local player. + * @param player The player to update. + * @param buffer The packet buffer. + * @param maskBuffer The mask buffer. + * @param sync If we should use the synced buffer. + * @param appearance If appearance update mask should be used in the synced + * buffer. + */ + private fun flagMaskUpdate(local: Player, player: Player, buffer: IoBuffer, maskBuffer: IoBuffer, sync: Boolean, appearance: Boolean) { + if (player.updateMasks.isUpdateRequired) { + buffer.putBits(1, 1) + writeMaskUpdates(local, player, maskBuffer, appearance, sync) + } else { + buffer.putBits(1, 0) + } + } + + /** + * Updates the player flags. + * @param local The local player. + * @param player The player to update. + * @param flags The flags buffer. + * @param appearance If we should force appearance. + * @param sync If we should use the synced buffer. + */ + private fun writeMaskUpdates(local: Player, player: Player, flags: IoBuffer, appearance: Boolean, sync: Boolean) { + if (sync) { + player.updateMasks.writeSynced(local, player, flags, appearance) + } else if (player.updateMasks.isUpdateRequired) { + player.updateMasks.write(local, player, flags) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/UpdateMasks.kt b/Server/src/main/java/Server/core/game/world/update/UpdateMasks.kt new file mode 100644 index 000000000..feb8eddc5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/UpdateMasks.kt @@ -0,0 +1,222 @@ +package core.game.world.update + +import core.game.node.entity.Entity +import core.game.node.entity.combat.ImpactHandler +import core.game.node.entity.player.Player +import core.game.world.update.flag.UpdateFlag +import core.game.world.update.flag.context.HitMark +import core.game.world.update.flag.npc.NPCHitFlag +import core.game.world.update.flag.npc.NPCHitFlag1 +import core.game.world.update.flag.player.AppearanceFlag +import core.game.world.update.flag.player.HitUpdateFlag +import core.game.world.update.flag.player.HitUpdateFlag1 +import core.net.packet.IoBuffer +import java.util.concurrent.atomic.AtomicBoolean + +/** + * Holds an entity's update masks. + * @author Emperor + */ +class UpdateMasks { + /** + * The mask data. + */ + private var maskData = 0 + + /** + * The update masks array. + */ + private val masks = arrayOfNulls?>(SIZE) + + /** + * Gets the appearanceStamp. + * @return The appearanceStamp. + */ + /** + * Sets the appearanceStamp. + * @param appearanceStamp The appearanceStamp to set. + */ + /** + * The appearance time stamp. + */ + var appearanceStamp: Long = 0 + + /** + * The synced mask data. + */ + private var syncedMask = 0 + + /** + * The update masks array. + */ + private val syncedMasks = arrayOfNulls?>(SIZE) + + /** + * If the update masks are being updated. + */ + private val updating = AtomicBoolean() + /** + * Registers an update flag. + * @param flag The update flag. + * @return `True` if successful. + */ + /** + * Registers an update flag. + * @param flag The update flag. + * @return `True` if successful. + */ + @JvmOverloads + fun register(flag: UpdateFlag<*>, synced: Boolean = false): Boolean { + var synced = synced + if (updating.get()) { + return false + } + if (flag is AppearanceFlag) { + appearanceStamp = System.currentTimeMillis() + synced = true + } + if (synced) { + syncedMasks[flag.ordinal()] = flag + syncedMask = syncedMask or flag.data() + } + maskData = maskData or flag.data() + masks[flag.ordinal()] = flag + return true + } + + /** + * Unregisters a synced update mask. + * @param maskData The mask data. + * @return `True` if the mask got removed. + */ + fun unregisterSynced(ordinal: Int): Boolean { + if (syncedMasks[ordinal] != null) { + syncedMask = syncedMask and syncedMasks[ordinal]!!.data().inv() + syncedMasks[ordinal] = null + return true + } + return false + } + + /** + * Writes the flags. + * @param p The player. + * @param e The entity to update. + * @param buffer The buffer to write on. + */ + fun write(p: Player?, e: Entity?, buffer: IoBuffer) { + var maskData = maskData + if (maskData >= 0x100) { + maskData = maskData or if (e is Player) 0x10 else 0x8 + buffer.put(maskData).put(maskData shr 8) + } else { + buffer.put(maskData) + } + for (i in masks.indices) { + val flag = masks[i] + flag?.writeDynamic(buffer, p) + } + } + + /** + * Writes the update masks on synchronization. + * @param p The player. + * @param e The entity to update. + * @param buffer The buffer to write on. + * @param appearance If the appearance mask should be written. + */ + fun writeSynced(p: Player?, e: Entity?, buffer: IoBuffer, appearance: Boolean) { + var maskData = maskData + var synced = syncedMask + if (!appearance && synced and AppearanceFlag.getData() != 0) { + synced = synced and AppearanceFlag.getData().inv() + } + maskData = maskData or synced + if (maskData >= 0x100) { + maskData = maskData or if (e is Player) 0x10 else 0x8 + buffer.put(maskData).put(maskData shr 8) + } else { + buffer.put(maskData) + } + for (i in masks.indices) { + var flag = masks[i] + if (flag == null) { + flag = syncedMasks[i] + if (!appearance && flag is AppearanceFlag) { + continue + } + } + flag?.writeDynamic(buffer, p) + } + } + + /** + * Adds the dynamic update flags. + * @param entity The entity. + */ + fun prepare(entity: Entity) { + val handler = entity.impactHandler + for (i in 0..1) { + if (handler.impactQueue.peek() == null) { + break + } + val impact = handler.impactQueue.poll() + registerHitUpdate(entity, impact, i == 1) + } + updating.set(true) + } + + /** + * Registers the hit update for the given [Impact]. + * @param e The entity. + * @param impact The impact to update. + * @param secondary If the hit update is secondary. + */ + private fun registerHitUpdate(e: Entity, impact: ImpactHandler.Impact, secondary: Boolean): HitMark { + val player = e is Player + val mark = HitMark(impact.amount, impact.type.ordinal, e) + if (player) { + register(if (secondary) HitUpdateFlag1(mark) else HitUpdateFlag(mark)) + } else { + register(if (secondary) NPCHitFlag1(mark) else NPCHitFlag(mark)) + } + return mark + } + + /** + * Resets the update masks. + */ + fun reset() { + for (i in masks.indices) { + masks[i] = null + } + maskData = 0 + updating.set(false) + } + + fun isUpdating(): Boolean { + return updating.get() + } + + /** + * Checks if an update is required. + * @return `True` if so. + */ + val isUpdateRequired: Boolean + get() = maskData != 0 + + /** + * Checks if synced update masks have been registered. + * @return `True` if so. + */ + fun hasSynced(): Boolean { + return syncedMask != 0 + } + + companion object { + /** + * The amount of update masks. + */ + const val SIZE = 11 + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/UpdateSequence.kt b/Server/src/main/java/Server/core/game/world/update/UpdateSequence.kt new file mode 100644 index 000000000..ea479e4b0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/UpdateSequence.kt @@ -0,0 +1,113 @@ +package core.game.world.update + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.world.map.RegionManager +import core.game.world.repository.InitializingNodeList +import core.game.world.repository.Repository +import core.net.packet.PacketRepository +import core.net.packet.context.PlayerContext +import core.net.packet.out.ClearMinimapFlag +import java.util.concurrent.CountDownLatch +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit +import java.util.function.Consumer + +/** + * The entity update sequence. + * @author Emperor + */ +class UpdateSequence +/** + * Constructs a new `ParallelUpdatingSequence` `Object`. + */ +{ + var lobbyList: List? = null + var playersList: List? = null + var npcList: List? = null + + /** + * Starts the update sequence. + * @return `True` if we should continue. + */ + fun start() { + lobbyList = Repository.lobbyPlayers + playersList = renderablePlayers + npcList = Repository.renderableNpcs + lobbyList!!.map{ PacketRepository.send(ClearMinimapFlag::class.java, PlayerContext(it)) } + playersList!!.map{player -> + try { + player.tick() + } catch (e: Exception) { + e.printStackTrace() + } + } + npcList!!.map{npc -> + try { + npc.tick() + } catch (e: Exception) { + e.printStackTrace() + } + } + } + + /** + * Runs the updating part of the sequence. + */ + fun run() { + val latch = CountDownLatch(renderablePlayers.size) + playersList!!.forEach(Consumer { player: Player -> + EXECUTOR.execute { + try { + player.update() + } catch (t: Throwable) { + t.printStackTrace() + } + latch.countDown() + } + }) + try { + latch.await(1000L, TimeUnit.MILLISECONDS) + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + + /** + * Ends the sequence, calls the [Entity.reset] method.. + */ + fun end() { + playersList!!.forEach(Consumer { obj: Player -> obj.reset() }) + npcList!!.forEach(Consumer { obj: NPC -> obj.reset() }) + renderablePlayers.sync() + RegionManager.pulse() + GroundItemManager.pulse() + } + + /** + * Terminates the update sequence. + */ + fun terminate() { + EXECUTOR.shutdown() + } + + companion object { + /** + * Gets the renderablePlayers. + * @return The renderablePlayers. + */ + /** + * The list of active players. + */ + @JvmStatic + val renderablePlayers = InitializingNodeList() + + /** + * The executor used. + */ + @JvmStatic + private val EXECUTOR = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/FlagContext.java b/Server/src/main/java/Server/core/game/world/update/flag/FlagContext.java new file mode 100644 index 000000000..336362356 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/FlagContext.java @@ -0,0 +1,9 @@ +package core.game.world.update.flag; + +/** + * Represents an update flag context. + * @author Emperor + */ +public interface FlagContext { + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/PlayerFlags.java b/Server/src/main/java/Server/core/game/world/update/flag/PlayerFlags.java new file mode 100644 index 000000000..c67408a65 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/PlayerFlags.java @@ -0,0 +1,86 @@ +package core.game.world.update.flag; + +import core.game.world.map.Location; +import core.game.world.map.RegionChunk; +import core.game.world.map.Viewport; + +/** + * A class holding a player's updating flags. + * @author Emperor + */ +public final class PlayerFlags { + + /** + * If the scene graph has been updated during this tick. + */ + private boolean updateSceneGraph; + + /** + * The last viewport. + */ + private RegionChunk[][] lastViewport = new RegionChunk[Viewport.CHUNK_SIZE][Viewport.CHUNK_SIZE]; + + /** + * The location the player was standing on when last scene graph update + * occured. + */ + private Location lastSceneGraph; + + /** + * Constructs a new {@code PlayerFlags} {@code Object}. + */ + public PlayerFlags() { + /* + * empty. + */ + } + + /** + * Gets the updateSceneGraph. + * @return The updateSceneGraph. + */ + public boolean isUpdateSceneGraph() { + return updateSceneGraph; + } + + /** + * Sets the updateSceneGraph. + * @param updateSceneGraph The updateSceneGraph to set. + */ + public void setUpdateSceneGraph(boolean updateSceneGraph) { + this.updateSceneGraph = updateSceneGraph; + } + + /** + * Gets the lastSceneGraph. + * @return The lastSceneGraph. + */ + public Location getLastSceneGraph() { + return lastSceneGraph; + } + + /** + * Sets the lastSceneGraph. + * @param lastSceneGraph The lastSceneGraph to set. + */ + public void setLastSceneGraph(Location lastSceneGraph) { + this.lastSceneGraph = lastSceneGraph; + } + + /** + * Gets the lastViewport. + * @return The lastViewport. + */ + public RegionChunk[][] getLastViewport() { + return lastViewport; + } + + /** + * Sets the lastViewport. + * @param lastViewport The lastViewport to set. + */ + public void setLastViewport(RegionChunk[][] lastViewport) { + this.lastViewport = lastViewport; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/UpdateFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/UpdateFlag.java new file mode 100644 index 000000000..81fd8064c --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/UpdateFlag.java @@ -0,0 +1,86 @@ +package core.game.world.update.flag; + +import core.game.node.entity.Entity; +import core.net.packet.IoBuffer; + +/** + * Represents an update flag, which holds the data the update mask uses to + * write. + * @author Emperor + */ +public abstract class UpdateFlag implements Comparable> { + + /** + * The context. + */ + protected T context; + + /** + * Constructs a new {@code UpdateFlag} {@code Object}. + * @param context The context. + */ + public UpdateFlag(T context) { + this.context = context; + } + + /** + * Writes the data on the buffer. + * @param buffer The buffer. + */ + public abstract void write(IoBuffer buffer); + + /** + * Writes the data on the buffer. + * @param buffer The buffer. + * @param e The entity to write for. + */ + public void writeDynamic(IoBuffer buffer, Entity e) { + write(buffer); + } + + /** + * Gets the update mask data for this update flag. + * @return The update mask data. + */ + public abstract int data(); + + /** + * The ordinal. + * @return The update mask ordinal. + */ + public abstract int ordinal(); + + @Override + public int compareTo(UpdateFlag flag) { + if (flag.ordinal() == ordinal()) { + return 0; + } + if (flag.ordinal() < ordinal()) { + return 1; + } + return -1; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof UpdateFlag)) { + return false; + } + return ((UpdateFlag) o).data() == data() && ((UpdateFlag) o).ordinal() == ordinal(); + } + + /** + * Get the context. + * @return the context + */ + public T getContext() { + return context; + } + + /** + * @param context the context to set + */ + public void setContext(T context) { + this.context = context; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/chunk/AnimateObjectUpdateFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/chunk/AnimateObjectUpdateFlag.java new file mode 100644 index 000000000..4ddb29efd --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/chunk/AnimateObjectUpdateFlag.java @@ -0,0 +1,37 @@ +package core.game.world.update.flag.chunk; + +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.Animation; +import core.net.packet.IoBuffer; +import core.net.packet.out.AnimateObjectPacket; + +/** + * The animate object update flag. + * @author Emperor + */ +public final class AnimateObjectUpdateFlag extends UpdateFlag { + + /** + * Constructs a new {@code AnimateObjectUpdateFlag} {@code Object}. + * @param context The animation. + */ + public AnimateObjectUpdateFlag(Animation context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + AnimateObjectPacket.write(buffer, context); + } + + @Override + public int data() { + return 0; + } + + @Override + public int ordinal() { + return 0; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/chunk/GraphicUpdateFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/chunk/GraphicUpdateFlag.java new file mode 100644 index 000000000..66150690d --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/chunk/GraphicUpdateFlag.java @@ -0,0 +1,48 @@ +package core.game.world.update.flag.chunk; + +import core.game.world.map.Location; +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.IoBuffer; + +/** + * Handles the location graphic update. + * @author Emperor + */ +public final class GraphicUpdateFlag extends UpdateFlag { + + /** + * The location. + */ + private final Location location; + + /** + * Constructs a new {@code GraphicUpdateFlag} {@code Object}. + * @param graphic The graphic. + * @param location The location. + */ + public GraphicUpdateFlag(Graphics graphic, Location location) { + super(graphic); + this.location = location; + } + + @Override + public void write(IoBuffer buffer) { + buffer.put((byte) 17); // opcode + buffer.put((location.getChunkOffsetX() << 4) | (location.getChunkOffsetY() & 0x7)); + buffer.putShort(context.getId()); + buffer.put(context.getHeight()); + buffer.putShort(context.getDelay()); + } + + @Override + public int data() { + return 0; + } + + @Override + public int ordinal() { + return 3; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/chunk/ItemUpdateFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/chunk/ItemUpdateFlag.java new file mode 100644 index 000000000..f2eb536f5 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/chunk/ItemUpdateFlag.java @@ -0,0 +1,122 @@ +package core.game.world.update.flag.chunk; + +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.node.item.GroundItem; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; +import core.net.packet.out.ClearGroundItem; +import core.net.packet.out.ConstructGroundItem; +import core.net.packet.out.UpdateGroundItemAmount; + +/** + * Handles an item update flag. + * @author Emperor + */ +public final class ItemUpdateFlag extends UpdateFlag { + + /** + * The construct update type. + */ + public static final int CONSTRUCT_TYPE = 0; + + /** + * The remove update type. + */ + public static final int REMOVE_TYPE = 1; + + /** + * The update amount update type. + */ + public static final int UPDATE_AMOUNT_TYPE = 2; + + /** + * The ground item to update. + */ + private final GroundItem item; + + /** + * The update type + */ + private final int type; + + /** + * The old amount. + */ + private int oldAmount; + + /** + * Constructs a new {@code ItemContext} {@code Object}. + * @param item The ground item to update. + * @param type The update type. + */ + public ItemUpdateFlag(GroundItem item, int type) { + this(item, type, 0); + } + + /** + * Constructs a new {@code ItemContext} {@code Object}. + * @param item The ground item to update. + * @param type The update type. + */ + public ItemUpdateFlag(GroundItem item, int type, int oldAmount) { + super(null); + this.item = item; + this.type = type; + this.oldAmount = oldAmount; + } + + @Override + public void writeDynamic(IoBuffer buffer, Entity e) { + if (!isRemove() && item.droppedBy((Player) e)) { + return; + } + write(buffer); + } + + @Override + public void write(IoBuffer buffer) { + if (isRemove()) { + ClearGroundItem.write(buffer, item); + } else if (isConstruct()) { + ConstructGroundItem.write(buffer, item); + } else { + UpdateGroundItemAmount.write(buffer, item, oldAmount); + } + } + + /** + * Checks if we're removing the ground item. + * @return {@code True} if so. + */ + public boolean isRemove() { + return type == REMOVE_TYPE; + } + + /** + * Checks if we're constructing the ground item. + * @return {@code True} if so. + */ + public boolean isConstruct() { + return type == CONSTRUCT_TYPE; + } + + /** + * Checks if we're removing the ground item. + * @return {@code True} if so. + */ + public boolean isAmountUpdate() { + return type == UPDATE_AMOUNT_TYPE; + } + + @Override + public int data() { + return 0; + } + + @Override + public int ordinal() { + return 1; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/chunk/ObjectUpdateFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/chunk/ObjectUpdateFlag.java new file mode 100644 index 000000000..601c7e118 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/chunk/ObjectUpdateFlag.java @@ -0,0 +1,55 @@ +package core.game.world.update.flag.chunk; + +import core.game.node.object.GameObject; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; +import core.net.packet.out.ClearObject; +import core.net.packet.out.ConstructObject; + +/** + * The object update flag. + * @author Emperor + */ +public class ObjectUpdateFlag extends UpdateFlag { + + /** + * The object to update. + */ + private final GameObject object; + + /** + * If we should remove the object. + */ + private final boolean remove; + + /** + * Constructs a new {@code ObjectUpdateFlag} {@code Object}. + * @param object The object to update. + * @param remove If we should remove the object. + */ + public ObjectUpdateFlag(GameObject object, boolean remove) { + super(null); + this.object = object; + this.remove = remove; + } + + @Override + public void write(IoBuffer buffer) { + if (remove) { + ClearObject.write(buffer, object); + } else { + ConstructObject.write(buffer, object); + } + } + + @Override + public int data() { + return 0; + } + + @Override + public int ordinal() { + return 0; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/chunk/ProjectileUpdateFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/chunk/ProjectileUpdateFlag.java new file mode 100644 index 000000000..b1a176f60 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/chunk/ProjectileUpdateFlag.java @@ -0,0 +1,54 @@ +package core.game.world.update.flag.chunk; + +import core.game.node.entity.Entity; +import core.game.node.entity.impl.Projectile; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; + +/** + * Handles the projectile updating. + * @author Emperor + */ +public final class ProjectileUpdateFlag extends UpdateFlag { + + /** + * Constructs a new {@code ProjectileUpdateFlag} {@code Object}. + * @param projectile The projectile. + */ + public ProjectileUpdateFlag(Projectile projectile) { + super(projectile); + } + + @Override + public void write(IoBuffer buffer) { + Projectile p = context; + Location start = p.getSourceLocation(); + Entity target = p.getVictim(); + Location end = p.isLocationBased() ? p.getEndLocation() : target.getLocation(); + buffer.put((byte) 16) //opcode + .put((start.getChunkOffsetX() << 4) | (start.getChunkOffsetY() & 0x7)) + .put(end.getX() - start.getX()) + .put(end.getY() - start.getY()) + .putShort(target != null ? (target instanceof Player ? -(target.getIndex() + 1) : (target.getIndex() + 1)) : -1) + .putShort(p.getProjectileId()) + .put(p.getStartHeight()) + .put(p.getEndHeight()) + .putShort(p.getStartDelay()) + .putShort(p.getSpeed()) + .put(p.getAngle()) + .put(p.getDistance()); + } + + @Override + public int data() { + return 0; + } + + @Override + public int ordinal() { + return 2; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/context/Animation.java b/Server/src/main/java/Server/core/game/world/update/flag/context/Animation.java new file mode 100644 index 000000000..0b0f848ea --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/context/Animation.java @@ -0,0 +1,167 @@ +package core.game.world.update.flag.context; + +import core.cache.def.impl.AnimationDefinition; +import core.game.node.entity.impl.Animator.Priority; +import core.game.node.object.GameObject; + +/** + * Represents an animation. + * @author Emperor + */ +public class Animation { + + /** + * The reset animation. + */ + public static final Animation RESET = new Animation(-1, Priority.VERY_HIGH); + + /** + * The priority. + */ + private Priority priority; + + /** + * The animation id. + */ + private int id; + + /** + * The animation delay. + */ + private final int delay; + + /** + * The animation definitions. + */ + private AnimationDefinition definition; + + /** + * The object to animate. + */ + private GameObject object; + + /** + * Constructs a new {@code Animation} {@code Object}. + * @param id The animation id. + */ + public Animation(int id) { + this(id, 0, Priority.MID); + } + + /** + * Constructs a new {@code Animation}. + * @param id the id. + * @return + */ + public static Animation create(int id) { + return new Animation(id, 0, Priority.MID); + } + + /** + * Constructs a new {@code Animation} {@code Object}. + * @param id The animation id. + */ + public Animation(int id, Priority priority) { + this(id, 0, priority); + } + + /** + * Constructs a new {@code Animation} {@code Object}. + * @param id The animation id. + * @param delay The animation delay. + */ + public Animation(int id, int delay) { + this(id, delay, Priority.MID); + } + + /** + * Constructs a new {@code Animation} {@code Object}. + * @param id The animation id. + * @param delay The animation delay. + */ + public Animation(int id, int delay, Priority priority) { + this.id = id; + this.delay = delay; + this.priority = priority; + } + + /** + * Gets the animation definitions of this animation. + * @return The animation definitions. + */ + public AnimationDefinition getDefinition() { + if (definition == null) { + definition = AnimationDefinition.forId(id); + } + return definition; + } + + /** + * The duration of the animation. + * @return The duration in ticks. + */ + public int getDuration() { + AnimationDefinition def = getDefinition(); + return def != null ? def.getDurationTicks() : 1; + } + + /** + * Get the id. + * @return the id + */ + public int getId() { + return id; + } + + /** + * Get the delay. + * @return the delay + */ + public int getDelay() { + return delay; + } + + /** + * Sets the id. + * @param id + */ + public void setId(int id) { + this.id = id; + } + + /** + * @return the priority. + */ + public Priority getPriority() { + return priority; + } + + /** + * Gets the object. + * @return The object. + */ + public GameObject getObject() { + return object; + } + + /** + * Sets the object. + * @param object The object to set. + */ + public void setObject(GameObject object) { + this.object = object; + } + + /** + * Sets the priority. + * @param priority The priority. + */ + public void setPriority(Priority priority) { + this.priority = priority; + } + + @Override + public String toString() { + return "Animation [priority=" + priority + ", id=" + id + "]"; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/context/ChatMessage.java b/Server/src/main/java/Server/core/game/world/update/flag/context/ChatMessage.java new file mode 100644 index 000000000..56ed92146 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/context/ChatMessage.java @@ -0,0 +1,88 @@ +package core.game.world.update.flag.context; + +import core.game.node.entity.player.Player; + +/** + * Represents a chat message. + * @author Emperor + */ +public class ChatMessage { + + /** + * The player reference. + */ + private Player player; + + /** + * The chat text. + */ + private String text; + + /** + * The effects. + */ + private int effects; + + /** + * The numChars. + */ + private int numChars; + + public boolean isQuickChat = false; + + /** + * Constructs a new {@code ChatMessage} {@code Object}. + * @param player The player. + * @param text The chat text. + * @param effects The chat effects. + * @param numChars The num chars. + */ + public ChatMessage(Player player, String text, int effects, int numChars) { + this.player = player; + this.text = text; + this.effects = effects; + this.numChars = numChars; + } + + /** + * Constructs a new {@code ChatMessage.java} {@code Object}. + * @param player the player. + * @param text the text. + */ + public ChatMessage(Player player, String text) { + this.player = player; + this.text = text; + } + + /** + * Gets the player. + * @return The player. + */ + public Player getPlayer() { + return player; + } + + /** + * Get the chat text. + * @return The chat text. + */ + public String getText() { + return text; + } + + /** + * Get the chat effects. + * @return The chat effects. + */ + public int getEffects() { + return effects; + } + + /** + * Get the num chars. + * @return The num chars. + */ + public int getNumChars() { + return numChars; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/context/Graphics.java b/Server/src/main/java/Server/core/game/world/update/flag/context/Graphics.java new file mode 100644 index 000000000..37dea63f4 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/context/Graphics.java @@ -0,0 +1,113 @@ +package core.game.world.update.flag.context; + +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.update.flag.chunk.GraphicUpdateFlag; + +/** + * Represents a graphic. + * @author Emperor + */ +public class Graphics { + + /** + * The graphic id. + */ + private final int id; + + /** + * The graphic height. + */ + private final int height; + + /** + * The graphic height. + */ + private final int delay; + + /** + * Constructs a new {@code Graphics} {@code Object}. + * @param id The graphics id. + */ + public Graphics(int id) { + this(id, 0, 0); + } + + /** + * Constructs a new {@code Graphics} {@code Object}. + * @param id The graphics id. + * @param height The graphics height. + */ + public Graphics(int id, int height) { + this(id, height, 0); + } + + /** + * Constructs a new {@code Graphics} {@code Object}. + * @param id The graphics id. + * @param height The graphics height. + * @param delay The graphics delay. + */ + public Graphics(int id, int height, int delay) { + this.id = id; + this.height = height; + this.delay = delay; + } + + /** + * Constructs a new graphic. + * @param id The graphic id. + * @return The graphics instance. + */ + public static Graphics create(int id) { + return new Graphics(id, 0, 0); + } + + /** + * Constructs a new graphic. + * @param id The graphic id. + * @param height The graphic height. + * @return The graphics instance. + */ + public static Graphics create(int id, int height) { + return new Graphics(id, height, 0); + } + + /** + * Sends a graphic on a location. + * @param graphic The graphic. + * @param l The location. + */ + public static void send(Graphics graphic, Location l) { + RegionManager.getRegionChunk(l).flag(new GraphicUpdateFlag(graphic, l)); + } + + /** + * Get the graphic id. + * @return The graphic id. + */ + public int getId() { + return id; + } + + /** + * Get the graphic height. + * @return The graphic height. + */ + public int getHeight() { + return height; + } + + /** + * Gets the delay. + * @return The delay. + */ + public int getDelay() { + return delay; + } + + @Override + public String toString() { + return "Graphics [id=" + id + ", height=" + height + ", delay=" + delay + "]"; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/context/HitMark.java b/Server/src/main/java/Server/core/game/world/update/flag/context/HitMark.java new file mode 100644 index 000000000..ea6428624 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/context/HitMark.java @@ -0,0 +1,80 @@ +package core.game.world.update.flag.context; + +import core.game.node.entity.Entity; + +/** + * Represents a hit mark. + * @author Emperor + */ +public class HitMark { + /** + * The amount of damage dealt. + */ + private final int damage; + + /** + * The hit type. + */ + private final int type; + + /** + * The entity's lifepoints. + */ + private int lifepoints; + + /** + * The entity. + */ + private final Entity entity; + + /** + * Constructs a new {@code HitMark} {@code Object}. + * @param damage The amount of damage. + * @param type The hit type; + * @param entity The entity. + */ + public HitMark(int damage, int type, Entity entity) { + this.damage = damage; + this.type = type; + this.entity = entity; + } + + /** + * Gets the damage. + * @return The damage. + */ + public int getDamage() { + return damage; + } + + /** + * Gets the type. + * @return The type. + */ + public int getType() { + return type; + } + + /** + * @return the entity. + */ + public Entity getEntity() { + return entity; + } + + /** + * Gets the lifepoints. + * @return The lifepoints. + */ + public int getLifepoints() { + return lifepoints; + } + + /** + * Sets the lifepoints. + * @param lifepoints The lifepoints to set. + */ + public void setLifepoints(int lifepoints) { + this.lifepoints = lifepoints; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCAnimation.java b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCAnimation.java new file mode 100644 index 000000000..b87ae5dd9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCAnimation.java @@ -0,0 +1,45 @@ +package core.game.world.update.flag.npc; + +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.Animation; +import core.net.packet.IoBuffer; + +/** + * The NPC animation update flag. + * @author Emperor + * + */ +public final class NPCAnimation extends UpdateFlag { + + /** + * Constructs a new {@code NPCAnimation} {@code Object}. + * @param context The animation. + */ + public NPCAnimation(Animation context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putShort(context.getId()).put(context.getDelay()); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 2; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int maskData() { + return 0x10; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCFaceEntity.java b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCFaceEntity.java new file mode 100644 index 000000000..5f4098db3 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCFaceEntity.java @@ -0,0 +1,45 @@ +package core.game.world.update.flag.npc; + +import core.game.node.entity.Entity; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; + +/** + * The face entity update flag for NPCs. + * @author Emperor + * + */ +public final class NPCFaceEntity extends UpdateFlag { + + /** + * Constructs a new {@code NPCFaceEntity} {@code Object}. + * @param context The context. + */ + public NPCFaceEntity(Entity context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putShortA(context == null ? -1 : context.getClientIndex()); + } + + @Override + public int data() { + return 0x4; + } + + @Override + public int ordinal() { + return getOrdinal(); + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int getOrdinal() { + return 3; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCFaceLocation.java b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCFaceLocation.java new file mode 100644 index 000000000..922d14258 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCFaceLocation.java @@ -0,0 +1,45 @@ +package core.game.world.update.flag.npc; + +import core.game.world.map.Location; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; + +/** + * The NPC face coordinates update flag. + * @author Emperor + * + */ +public final class NPCFaceLocation extends UpdateFlag { + + /** + * Constructs a new {@code NPCFaceLocation} {@code Object}. + * @param context The location to face. + */ + public NPCFaceLocation(Location context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putShortA((context.getX() << 1) + 1).putShort((context.getY() << 1) + 1); + } + + @Override + public int data() { + return 0x200; + } + + @Override + public int ordinal() { + return getOrdinal(); + } + + /** + * Gets the mask ordinal. + * @return The ordinal. + */ + public static int getOrdinal() { + return 8; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCForceChat.java b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCForceChat.java new file mode 100644 index 000000000..1a6b66658 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCForceChat.java @@ -0,0 +1,43 @@ +package core.game.world.update.flag.npc; + +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; + +/** + * The NPC force chat update flag. + * @author Emperor + * + */ +public final class NPCForceChat extends UpdateFlag { + + /** + * Constructs a new {@code NPCForceChat} {@code Object}. + * @param context The chat message. + */ + public NPCForceChat(String context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putString(context); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 6; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int maskData() { + return 0x20; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCGraphic.java b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCGraphic.java new file mode 100644 index 000000000..f15c01fa6 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCGraphic.java @@ -0,0 +1,45 @@ +package core.game.world.update.flag.npc; + +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.IoBuffer; + +/** + * Handles an NPC's graphic update flag. + * @author Emperor + * + */ +public final class NPCGraphic extends UpdateFlag { + + /** + * Constructs a new {@code NPCGraphic} {@code Object}. + * @param context The graphics. + */ + public NPCGraphic(Graphics context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putShortA(context.getId()).putLEInt(context.getHeight() << 16 | context.getDelay()); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 4; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int maskData() { + return 0x80; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCHitFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCHitFlag.java new file mode 100644 index 000000000..7fbde01ac --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCHitFlag.java @@ -0,0 +1,56 @@ +package core.game.world.update.flag.npc; + +import core.game.node.entity.Entity; +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.HitMark; +import core.net.packet.IoBuffer; + +/** + * The NPC's main hit update flag. + * @author Emperor + * + */ +public final class NPCHitFlag extends UpdateFlag { + + /** + * Constructs a new {@code NPCHitFlag} {@code Object}. + * @param context The hit mark. + */ + public NPCHitFlag(HitMark context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + Entity e = context.getEntity(); + int max = e.getSkills().getMaximumLifepoints(); + int ratio = 0; + if (max > 0) { + if (max < e.getSkills().getLifepoints()) { + ratio = 255; + } else { + ratio = e.getSkills().getLifepoints() * 255 / max; + } + } + buffer.put(context.getDamage()).putC(context.getType()).putS(ratio); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 0; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int maskData() { + return 0x40; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCHitFlag1.java b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCHitFlag1.java new file mode 100644 index 000000000..e443f6f0f --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCHitFlag1.java @@ -0,0 +1,45 @@ +package core.game.world.update.flag.npc; + +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.HitMark; +import core.net.packet.IoBuffer; + +/** + * The NPC's supporting hit update flag. + * @author Emperor + * + */ +public class NPCHitFlag1 extends UpdateFlag { + + /** + * Constructs a new {@code NPCHitFlag1} {@code Object}. + * @param context The hit mark. + */ + public NPCHitFlag1(HitMark context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putC(context.getDamage()).putS(context.getType()); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 1; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int maskData() { + return 0x2; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCSwitchId.java b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCSwitchId.java new file mode 100644 index 000000000..a72c45f1e --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/npc/NPCSwitchId.java @@ -0,0 +1,44 @@ +package core.game.world.update.flag.npc; + +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; + +/** + * The switch NPC id update flag. + * @author Emperor + * + */ +public final class NPCSwitchId extends UpdateFlag { + + /** + * Constructs a new {@code NPCSwitchId} {@code Object}. + * @param context The new NPC id. + */ + public NPCSwitchId(int context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putLEShort(context); + } + + @Override + public int data() { + return 0x1; + } + + @Override + public int ordinal() { + return getOrdinal(); + } + + /** + * Gets the mask ordinal. + * @return The ordinal. + */ + public static int getOrdinal() { + return 5; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/AnimationFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/player/AnimationFlag.java new file mode 100644 index 000000000..925602e21 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/AnimationFlag.java @@ -0,0 +1,43 @@ +package core.game.world.update.flag.player; + +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.Animation; +import core.net.packet.IoBuffer; + +/** + * Handles the animation update flag. + * @author Emperor + */ +public final class AnimationFlag extends UpdateFlag { + + /** + * Constructs a new {@code AnimationFlag} {@code Object}. + */ + public AnimationFlag(Animation context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putShort(context.getId()); + buffer.put(context.getDelay()); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 2; + } + + /** + * Gets the mask data of the animation update flag. + * @return The mask data. + */ + public static int maskData() { + return 0x8; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/AppearanceFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/player/AppearanceFlag.java new file mode 100644 index 000000000..3fb42f2bb --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/AppearanceFlag.java @@ -0,0 +1,91 @@ +package core.game.world.update.flag.player; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.appearance.Appearance; +import core.game.node.entity.player.link.appearance.BodyPart; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; +import core.tools.StringUtils; + +/** + * Handles the appearance update flag. + * @author Emperor + * + */ +public final class AppearanceFlag extends UpdateFlag { + + /** + * Constructs a new {@code AppearanceFlag} {@code Object}. + * @param player The player. + */ + public AppearanceFlag(Player player) { + super(player); + } + + @Override + public void write(IoBuffer buffer) { + Appearance appearance = context.getAppearance(); + appearance.prepareBodyData(context); + IoBuffer block = new IoBuffer(); + int settings = appearance.getGender().toByte(); + if (context.size() > 1) { + settings |= (context.size() - 1) << 3; + } + block.put(settings); // settings hash. + block.put(appearance.getSkullIcon()); // Skull icon + block.put(appearance.getHeadIcon()); // Head icon + int npcId = appearance.getNpcId(); + if (npcId == -1) { + int[] parts = appearance.getBodyParts(); + for (int i = 0; i < 12; i++) { + int value = parts[i]; + if (value == 0) { + block.put(0); + } else { + block.putShort(value); + } + } + } else { + block.putShort(-1); + block.putShort(npcId); + block.put(255); + } + final BodyPart[] colors = new BodyPart[] { appearance.getHair(), appearance.getTorso(), appearance.getLegs(), appearance.getFeet(), appearance.getSkin() }; + for (int i = 0; i < colors.length; i++) {// colours + block.put(colors[i].getColor()); + } + block.putShort(appearance.getRenderAnimation()); + block.putLong(StringUtils.stringToLong(context.getUsername())); + block.put(context.getProperties().getCurrentCombatLevel()); + block.putShort(0); + block.put(0); + buffer.putA(block.toByteBuffer().position()); + buffer.put(block); + } + + @Override + public int data() { + return getData(); + } + + @Override + public int ordinal() { + return getOrdinal(); + } + + /** + * Gets the ordinal for this flag. + * @return The flag ordinal. + */ + public static int getOrdinal() { + return 3; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int getData() { + return 0x4; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/ChatFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/player/ChatFlag.java new file mode 100644 index 000000000..ca11afcee --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/ChatFlag.java @@ -0,0 +1,57 @@ +package core.game.world.update.flag.player; + +import core.game.node.entity.player.info.Rights; +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.ChatMessage; +import core.net.packet.IoBuffer; +import core.tools.StringUtils; + +/** + * Handles the chat flag. + * @author Emperor + */ +public class ChatFlag extends UpdateFlag { + + /** + * Constructs a new {@code ChatFlag.java} {@code Object}. + * @param context The context. + */ + public ChatFlag(ChatMessage context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + byte[] chatStr = new byte[256]; + chatStr[0] = (byte) context.getText().length(); + int offset = 1 + StringUtils.encryptPlayerChat(chatStr, 0, 1, context.getText().length(), context.getText().getBytes()); + buffer.putLEShort(context.getEffects()); // 0x8000 does something (you'd + // need to send something + // extra. + if(context.isQuickChat){ + buffer.put((byte) 4); + } else { + buffer.put((byte) Rights.getChatIcon(context.getPlayer())); + } + buffer.put(offset + 1); + buffer.putReverse(chatStr, 0, offset); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 0; + } + + /** + * Gets the mask data of the chat update flag. + * @return The mask data. + */ + public static int maskData() { + return 0x80; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/FaceEntityFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/player/FaceEntityFlag.java new file mode 100644 index 000000000..fa2327027 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/FaceEntityFlag.java @@ -0,0 +1,45 @@ +package core.game.world.update.flag.player; + +import core.game.node.entity.Entity; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; + +/** + * The face entity update flag. + * @author Emperor + * + */ +public final class FaceEntityFlag extends UpdateFlag { + + /** + * Constructs a new {@code FaceEntityFlag} {@code Object}. + * @param context The entity to face. + */ + public FaceEntityFlag(Entity context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putShortA(context == null ? -1 : context.getClientIndex()); + } + + @Override + public int data() { + return 0x2; + } + + @Override + public int ordinal() { + return getOrdinal(); + } + + /** + * Gets the mask ordinal. + * @return The ordinal. + */ + public static int getOrdinal() { + return 4; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/FaceLocationFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/player/FaceLocationFlag.java new file mode 100644 index 000000000..f8ad46396 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/FaceLocationFlag.java @@ -0,0 +1,84 @@ +package core.game.world.update.flag.player; + +import core.game.node.Node; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; + +/** + * Handles the face coordinates update flag. + * @author Emperor + */ +public class FaceLocationFlag extends UpdateFlag { + + /** + * Constructs a new {@code FaceLocationFlag} {@code Object}. + * @param location The location to face. + */ + public FaceLocationFlag(Location location) { + super(location); + } + + /** + * Gets the face location of the node. + * @param n The facing node. + * @param node The node to face. + * @return The location. + */ + public static Location getFaceLocation(Node n, Node node) { + int x = node.size() >> 1; + int y = node.size() >> 1; + if (node instanceof GameObject) { + GameObject o = (GameObject) node; + x = o.getDefinition().sizeX >> 1; + y = o.getDefinition().sizeY >> 1; + if (o.getRotation() % 2 != 0) { + x = y; + y = o.getDefinition().sizeX >> 1; + } + if (n.getLocation().equals(o.getLocation()) && node.size() == 1) { + switch (o.getRotation()) { + case 0: + x -= 1; + break; + case 1: + y += 1; + break; + case 2: + x += 1; + break; + case 3: + y -= 1; + break; + } + } + } + return node.getLocation().transform(x, y, 0); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putShort((context.getX() << 1) + 1); + buffer.putLEShortA((context.getY() << 1) + 1); + } + + @Override + public int data() { + return 0x40; + } + + @Override + public int ordinal() { + return getOrdinal(); + } + + /** + * Gets the mask ordinal. + * @return The ordinal. + */ + public static int getOrdinal() { + return 10; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/ForceChatFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/player/ForceChatFlag.java new file mode 100644 index 000000000..318d008ed --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/ForceChatFlag.java @@ -0,0 +1,44 @@ +package core.game.world.update.flag.player; + +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; + +/** + * The force chat update flag. + * @author Emperor + * + */ +public final class ForceChatFlag extends UpdateFlag { + + /** + * Constructs a new {@code ForceChatFlag} {@code Object}. + * @param context The chat message. + */ + public ForceChatFlag(String context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putString(context); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 6; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int maskData() { + return 0x20; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/ForceMovementFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/player/ForceMovementFlag.java new file mode 100644 index 000000000..5625e51a0 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/ForceMovementFlag.java @@ -0,0 +1,60 @@ +package core.game.world.update.flag.player; + +import core.game.node.entity.Entity; +import core.game.node.entity.impl.ForceMovement; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.update.flag.UpdateFlag; +import core.net.packet.IoBuffer; + +/** + * Handles the force movement player update flag. + * @author Emperor + * + */ +public final class ForceMovementFlag extends UpdateFlag { + + /** + * Constructs a new {@code ForceMovementFlag} {@code Object}. + * @param forceMovement The force movement data. + */ + public ForceMovementFlag(ForceMovement forceMovement) { + super(forceMovement); + } + + @Override + public void write(IoBuffer buffer) { + } + + @Override + public void writeDynamic(IoBuffer buffer, Entity e) { + Location l = ((Player) e).getPlayerFlags().getLastSceneGraph(); + buffer.putC(context.getStart().getSceneX(l)) // Start location + .put(context.getStart().getSceneY(l)).putA(context.getDestination().getSceneX(l)) // Destination + // location + .put(context.getDestination().getSceneY(l)).putLEShort(context.getCommenceSpeed() * 30)// Commencing + // speed + .putLEShort((context.getCommenceSpeed() * 30) + (context.getPathSpeed() * 30 + 1)) // Path + // speed + .putC(context.getDirection().toInteger()); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 5; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int maskData() { + return 0x400; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/GraphicFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/player/GraphicFlag.java new file mode 100644 index 000000000..661a9472b --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/GraphicFlag.java @@ -0,0 +1,45 @@ +package core.game.world.update.flag.player; + +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.IoBuffer; + +/** + * Handles the graphic update flag. + * @author Emperor + * + */ +public final class GraphicFlag extends UpdateFlag { + + /** + * Constructs a new {@code GraphicFlag} {@code Object}. + * @param context The context. + */ + public GraphicFlag(Graphics context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putLEShort(context.getId()); + buffer.putIntB(context.getHeight() << 16 | context.getDelay()); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 9; + } + + /** + * Gets the mask data of the graphic update flag. + * @return The mask data. + */ + public static int maskData() { + return 0x100; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/HitUpdateFlag.java b/Server/src/main/java/Server/core/game/world/update/flag/player/HitUpdateFlag.java new file mode 100644 index 000000000..702befba9 --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/HitUpdateFlag.java @@ -0,0 +1,52 @@ +package core.game.world.update.flag.player; + +import core.game.node.entity.Entity; +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.HitMark; +import core.net.packet.IoBuffer; + +/** + * The main hit update flag. + * @author Emperor + * + */ +public final class HitUpdateFlag extends UpdateFlag { + + /** + * Constructs a new {@code HitUpdateFlag} {@code Object}. + * @param context The hit mark. + */ + public HitUpdateFlag(HitMark context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + Entity e = context.getEntity(); + int max = e.getSkills().getMaximumLifepoints(); + int ratio = 255; + if (max > e.getSkills().getLifepoints()) { + ratio = e.getSkills().getLifepoints() * 255 / max; + } + buffer.putSmart(context.getDamage()).putA(context.getType()).putS(ratio); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 1; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int maskData() { + return 0x1; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/game/world/update/flag/player/HitUpdateFlag1.java b/Server/src/main/java/Server/core/game/world/update/flag/player/HitUpdateFlag1.java new file mode 100644 index 000000000..a4f35bb4e --- /dev/null +++ b/Server/src/main/java/Server/core/game/world/update/flag/player/HitUpdateFlag1.java @@ -0,0 +1,45 @@ +package core.game.world.update.flag.player; + +import core.game.world.update.flag.UpdateFlag; +import core.game.world.update.flag.context.HitMark; +import core.net.packet.IoBuffer; + +/** + * The supportive hit update flag. + * @author Emperor + * + */ +public final class HitUpdateFlag1 extends UpdateFlag { + + /** + * Constructs a new {@code HitUpdateFlag1} {@code Object}. + * @param context The hit mark. + */ + public HitUpdateFlag1(HitMark context) { + super(context); + } + + @Override + public void write(IoBuffer buffer) { + buffer.putSmart(context.getDamage()).putS(context.getType()); + } + + @Override + public int data() { + return maskData(); + } + + @Override + public int ordinal() { + return 7; + } + + /** + * Gets the mask data. + * @return The mask data. + */ + public static int maskData() { + return 0x200; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/gui/ConsoleFrame.java b/Server/src/main/java/Server/core/gui/ConsoleFrame.java new file mode 100644 index 000000000..e4d1210de --- /dev/null +++ b/Server/src/main/java/Server/core/gui/ConsoleFrame.java @@ -0,0 +1,168 @@ +package core.gui; + + +import core.gui.tab.GrandExchangeTab; +import core.gui.tab.PlayerTab; +import core.gui.tab.StatisticsTab; +import core.gui.tab.UtilityTab; + +import javax.swing.*; +import java.awt.*; + +/** + * The console frame tool. + * + * @author Vexia + */ +public class ConsoleFrame extends JFrame { + + /** + * The console frame instance. + */ + public static final ConsoleFrame INSTANCE = new ConsoleFrame(); + + /** + * The serail UID. + */ + private static final long serialVersionUID = 6368064564449356833L; + + /** + * The size of the frame. + */ + private static final Dimension SIZE = new Dimension(1074, 664); + + /** + * The tabbed pane. + */ + private final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); + + /** + * The statistics tab. + */ + private final StatisticsTab statisticsTab = StatisticsTab.INSTANCE.init(); + + /** + * The player tab. + */ + private final PlayerTab playerTab = new PlayerTab(); + + /** + * The grand exchange tab. + */ + private final GrandExchangeTab grandExchangeTab = new GrandExchangeTab(); + + /** + * The utility tab. + */ + private final UtilityTab utilityTab = UtilityTab.getInstance(); + + /** + * Constructs a new {@Code consoleFrame} {@Code Object} + */ + private ConsoleFrame() { + super("Console"); + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + } + + /** + * Initializes the console frame. + * + * @return the frame. + */ + public ConsoleFrame init() { + setLocationRelativeTo(null); + setSize(SIZE); + getContentPane().setLayout(null); + tabbedPane.setBounds(0, 0, 1068, 636); + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + setLocation(dim.width / 2 - this.getSize().width / 2, dim.height / 2 - this.getSize().height / 2); + getContentPane().add(tabbedPane); + addTabs(statisticsTab, utilityTab, playerTab, grandExchangeTab); + setResizable(false); + setVisible(true); + return this; + } + + public static void main(String... args) { + INSTANCE.init(); + } + + /** + * Adds tabs. + * + * @param tabs the tabs. + */ + public void addTabs(ConsoleTab... tabs) { + for (ConsoleTab tab : tabs) { + addTab(tab); + } + } + + /** + * Adds a tab to the tabbed pane. + * + * @param tab the tab. + */ + public void addTab(ConsoleTab tab) { + tabbedPane.add(tab.getName(), tab); + } + + /** + * Gets the statisticsTab. + * + * @return the statisticsTab + */ + public StatisticsTab getStatisticsTab() { + return statisticsTab; + } + + /** + * Gets the tabbedPane. + * + * @return the tabbedPane + */ + public JTabbedPane getTabbedPane() { + return tabbedPane; + } + + /** + * Gets the playerTab. + * + * @return the playerTab + */ + public PlayerTab getPlayerTab() { + return playerTab; + } + + /** + * Gets the utilityTab. + * + * @return the utilityTab + */ + public UtilityTab getUtilityTab() { + return utilityTab; + } + + /** + * Gets the instance. + * + * @return the instance. + */ + public static ConsoleFrame getInstance() { + return INSTANCE; + } + + /** + * Gets the grandExchangeTab. + * + * @return the grandExchangeTab + */ + public GrandExchangeTab getGrandExchangeTab() { + return grandExchangeTab; + } + +} diff --git a/Server/src/main/java/Server/core/gui/ConsoleTab.java b/Server/src/main/java/Server/core/gui/ConsoleTab.java new file mode 100644 index 000000000..daf37deb4 --- /dev/null +++ b/Server/src/main/java/Server/core/gui/ConsoleTab.java @@ -0,0 +1,44 @@ +package core.gui; + +import javax.swing.*; +import java.awt.*; + +/** + * The console tab. + * + * @author Vexia + */ +public class ConsoleTab extends JPanel { + + /** + * The serial UID. + */ + private static final long serialVersionUID = 2899642836866716523L; + + /** + * The name of the console tab. + */ + private final String name; + + /** + * Constructs a new {@Code consoleTab} {@Code Object} + * + * @param name the name. + */ + public ConsoleTab(String name) { + super(); + this.name = name; + setLayout(null); + setBounds(new Rectangle(0, 0, 1068, 663)); + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + +} diff --git a/Server/src/main/java/Server/core/gui/component/ConsoleLogger.java b/Server/src/main/java/Server/core/gui/component/ConsoleLogger.java new file mode 100644 index 000000000..48f98e1a4 --- /dev/null +++ b/Server/src/main/java/Server/core/gui/component/ConsoleLogger.java @@ -0,0 +1,68 @@ +package core.gui.component; + + +import core.gui.ConsoleFrame; + +import java.io.PrintStream; + +/** + * Loggs output to the gui console. + * + * @author Vexia + */ +public class ConsoleLogger extends PrintStream { + + /** + * Constructs a new {@code WorkLogger} {@code Object} + * + * @param stream the stream. + */ + public ConsoleLogger(PrintStream stream) { + super(stream); + } + + @Override + public void println(String message) { + log(message); + } + + @Override + public PrintStream printf(String message, Object... objects) { + return null; + } + + @Override + public void println(boolean message) { + log(String.valueOf(message)); + } + + @Override + public void println(int message) { + log(String.valueOf(message)); + } + + @Override + public void println(double message) { + log(String.valueOf(message)); + } + + @Override + public void println(char message) { + log("" + message); + } + + @Override + public void println(long message) { + log("" + message); + } + + /** + * Method used to log the message. + * + * @param message the message. + */ + public void log(final String message) { + ConsoleFrame.getInstance().getStatisticsTab().log(message); + } + +} diff --git a/Server/src/main/java/Server/core/gui/component/PlayerViewer.java b/Server/src/main/java/Server/core/gui/component/PlayerViewer.java new file mode 100644 index 000000000..2540f27fb --- /dev/null +++ b/Server/src/main/java/Server/core/gui/component/PlayerViewer.java @@ -0,0 +1,270 @@ +package core.gui.component; + + +import core.game.container.Container; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.PlayerDetails; +import core.game.node.item.Item; +import core.game.world.GameWorld; +import core.game.world.repository.Repository; +import core.gui.ConsoleFrame; +import core.tools.PlayerLoader; +import core.tools.StringUtils; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import java.awt.*; +import java.awt.event.ActionListener; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Views a players details. + * + * @author Vexia + */ +public class PlayerViewer extends JPanel { + + /** + * The serail UID. + */ + private static final long serialVersionUID = 1589056461884384398L; + + /** + * The name of the viewer. + */ + private final String name; + + /** + * The player details. + */ + private PlayerDetails details; + + /** + * The player file. + */ + private Player player; + + /** + * Constructs a new {@Code PlayerViewer} {@Code Object} + * + * @param name the name. + */ + public PlayerViewer(String name) { + super(); + this.name = name; + this.details = PlayerLoader.getPlayerDetailFile(name); + if (Repository.getPlayerByName(name) != null) { + setPlayer(Repository.getPlayerByName(name)); + } else { + if (GameWorld.getMajorUpdateWorker().getStarted()) { + setPlayer(PlayerLoader.getPlayerFile(name)); + } + } + setBounds(new Rectangle(0, 0, 755, 539)); + setLayout(null); + JButton btnClose = new JButton("Close"); + btnClose.addActionListener(e -> ConsoleFrame.getInstance().getPlayerTab().closeViewer(PlayerViewer.this)); + btnClose.setBounds(6, 6, 117, 29); + add(btnClose); + + JPanel panel = new JPanel(); + panel.setBorder(new TitledBorder(null, "Info", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + panel.setBounds(6, 35, 286, 428); + add(panel); + panel.setLayout(null); + + JLabel lblName = new JLabel("Username: " + details.getUsername()); + lblName.setBounds(6, 16, 224, 16); + panel.add(lblName); + + JLabel lblIp = new JLabel("IP: " + details.getInfo().getIp()); + lblIp.setBounds(6, 96, 190, 16); + panel.add(lblIp); + + JLabel lblMac = new JLabel("Mac: " + details.getInfo().getMac()); + lblMac.setBounds(6, 124, 224, 16); + panel.add(lblMac); + + JLabel lblCompName = new JLabel("Comp name: " + details.getInfo().getCompName()); + lblCompName.setBounds(6, 208, 236, 16); + panel.add(lblCompName); + + JLabel lblLastLogin = new JLabel("Last login: " + new Date(details.getLastLogin())); + lblLastLogin.setBounds(6, 152, 274, 16); + panel.add(lblLastLogin); + + JLabel lblStatus = new JLabel("Status: " + getStatus()); + lblStatus.setBounds(6, 236, 149, 16); + panel.add(lblStatus); + +// JLabel lblCredits = new JLabel("Credits: " + details.getShop().getCredits()); +// lblCredits.setBounds(6, 180, 139, 16); +// panel.add(lblCredits); + + JLabel lblRights = new JLabel("Rights: " + StringUtils.formatDisplayName(details.getRights().toString())); + lblRights.setBounds(6, 68, 176, 16); + panel.add(lblRights); + +// JLabel lblDisplayName = new JLabel("Display name: " + details.getUsername()); +// lblDisplayName.setBounds(6, 40, 213, 16); +// panel.add(lblDisplayName); + + JLabel lblNetworth = new JLabel("Networth:"); + lblNetworth.setBounds(6, 264, 165, 16); + panel.add(lblNetworth); + + JLabel lblBanned = new JLabel("Banned: " + (details.getBanTime() > 0)); + lblBanned.setBounds(6, 292, 149, 16); + panel.add(lblBanned); + + JLabel lblMuted = new JLabel("Muted: " + (details.getMuteTime() > 0)); + lblMuted.setBounds(6, 317, 149, 16); + panel.add(lblMuted); + + JLabel lblActive = new JLabel("Active: " + checkActive()); + lblActive.setBounds(6, 342, 165, 16); + panel.add(lblActive); + if (player != null) { + lblNetworth.setText("Networth: " + player.getMonitor().getNetworth() + ""); + } + + JButton btnRefresh = new JButton("Refresh"); + btnRefresh.setBounds(124, 6, 117, 29); + add(btnRefresh); + + JButton btnViewContainer = new JButton("View Container"); + btnViewContainer.addActionListener(e -> { + if (player == null) { + return; + } + viewContainer(); + }); + btnViewContainer.setBounds(365, 6, 144, 29); + add(btnViewContainer); + + JButton btnDelete = new JButton("Delete"); + btnDelete.addActionListener(e -> { + int result = JOptionPane.showConfirmDialog(null, "Are you sure you want to delete this account!?"); + if (result == 0) { + ConsoleFrame.getInstance().getUtilityTab().delete(details); + ConsoleFrame.getInstance().getPlayerTab().closeViewer(PlayerViewer.this); + } + }); + btnDelete.setBounds(244, 6, 117, 29); + add(btnDelete); + } + + /** + * Opens the view containermanager. + */ + public void viewContainer() { + JPanel panel = new JPanel(new GridLayout(0, 1)); + ActionListener listener = e -> { + String name1 = e.getActionCommand(); + Container container = null; + switch (name1) { + case "Inventory": + container = player.getInventory(); + break; + case "Equipment": + container = player.getEquipment(); + break; + case "Bank": + container = player.getBank(); + break; + } + if (container != null) { + showContainer(container, name1); + } + }; + JButton invy = new JButton("Inventory"); + panel.add(invy); + invy.addActionListener(listener); + JButton equip = new JButton("Equipment"); + panel.add(equip); + equip.addActionListener(listener); + JButton bank = new JButton("Bank"); + bank.addActionListener(listener); + panel.add(bank); + JOptionPane.showConfirmDialog(null, panel, "View Container", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + } + + /** + * Shows a container. + * + * @param container the container. + * @param name the name. + */ + public void showContainer(core.game.container.Container container, String name) { + JPanel panel = new JPanel(new GridLayout(0, 1)); + JScrollPane pane = new JScrollPane(); + DefaultListModel model = new DefaultListModel<>(); + JList list = new JList<>(); + for (Item i : container.toArray()) { + if (i == null) { + continue; + } + model.addElement(i.toString()); + } + list.setModel(model); + pane.setViewportView(list); + panel.add(pane); + JOptionPane.showConfirmDialog(null, panel, name, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + } + + /** + * Checks if the player is active. + * + * @return {@code True} if so. + */ + public String checkActive() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date cutOff = null; + long mili = 0; + try { + cutOff = sdf.parse("2014-6-10"); + mili = cutOff.getTime(); + } catch (ParseException e) { + e.printStackTrace(); + } + return ((details.getLastLogin() < mili) ? "Not " : "") + "Active"; + } + + /** + * Checks active status. + * + * @return the status. + */ + public String getStatus() { + return Repository.getPlayerByName(name) != null ? "Online" : "Offline"; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the player. + * + * @return the player + */ + public Player getPlayer() { + return player; + } + + /** + * Sets the baplayer. + * + * @param player the player to set. + */ + public void setPlayer(Player player) { + this.player = player; + } +} diff --git a/Server/src/main/java/Server/core/gui/tab/GrandExchangeTab.java b/Server/src/main/java/Server/core/gui/tab/GrandExchangeTab.java new file mode 100644 index 000000000..c497b131b --- /dev/null +++ b/Server/src/main/java/Server/core/gui/tab/GrandExchangeTab.java @@ -0,0 +1,191 @@ +package core.gui.tab; + + +import core.game.node.entity.player.Player; +import core.gui.ConsoleFrame; +import core.gui.ConsoleTab; +import core.game.ge.GrandExchangeOffer; +import core.game.ge.OfferManager; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * A tab used to view the grand exchange. + * + * @author Vexia + */ +public class GrandExchangeTab extends ConsoleTab { + + /** + * The serial UID. + */ + private static final long serialVersionUID = -1619650762760289798L; + + /** + * The search field. + */ + private JTextField searchField; + + /** + * The jlist. + */ + private final JList list = new JList(); + + /** + * The model. + */ + private final DefaultListModel model = new DefaultListModel(); + + /** + * The id search field. + */ + private JTextField idSearchField; + + /** + * Constructs a new {@Code GrandExchangeTab} {@Code Object} + */ + @SuppressWarnings("serial") + public GrandExchangeTab() { + super("Grand Exchange"); + list.setCellRenderer(new DefaultListCellRenderer() { + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + GrandExchangeOffer offer = (GrandExchangeOffer) value; + if (offer == null) { + return label; + } + Player player = null; + for (Player p : ConsoleFrame.getInstance().getUtilityTab().getPlayers()) { + if (p == null) { + continue; + } + if (p.getDetails().getUid() == offer.getUid()) { + player = p; + break; + } + } + label.setText((player == null ? "" : player.getName() + " - ") + offer.toString()); + return label; + } + + }); + list.setModel(model); + JLabel lblSearch = new JLabel("Search player:"); + lblSearch.setBounds(24, 20, 95, 16); + add(lblSearch); + + searchField = new JTextField(); + searchField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + searchPlayer(); + } + }); + searchField.setBounds(119, 14, 185, 28); + add(searchField); + searchField.setColumns(10); + + JPanel panel = new JPanel(); + panel.setBounds(24, 78, 1015, 518); + add(panel); + panel.setLayout(null); + + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setBounds(6, 6, 375, 517); + panel.add(scrollPane); + scrollPane.setViewportView(list); + + JButton btnDisplayDatabase = new JButton("Display Database"); + btnDisplayDatabase.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + displayDatabase(); + } + }); + btnDisplayDatabase.setBounds(316, 15, 173, 29); + add(btnDisplayDatabase); + + JLabel lblNewLabel = new JLabel("Search id:"); + lblNewLabel.setBounds(24, 48, 61, 16); + add(lblNewLabel); + + idSearchField = new JTextField(); + idSearchField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + searchId(); + } + }); + idSearchField.setColumns(10); + idSearchField.setBounds(119, 48, 185, 28); + add(idSearchField); + + JButton btnNewButton = new JButton("Load"); + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ConsoleFrame.getInstance().getUtilityTab().populateList(); + } + }); + btnNewButton.setBounds(316, 43, 173, 29); + add(btnNewButton); + } + + /** + * Searches the player. + */ + private void searchPlayer() { + model.clear(); + Player player = ConsoleFrame.getInstance().getUtilityTab().getPlayer(searchField.getText()); + if (player == null) { + JOptionPane.showMessageDialog(null, "Error! No player found."); + return; + } + for (GrandExchangeOffer o : player.getPlayerGrandExchange().getOffers()) { + if (o == null) { + continue; + } + addOffer(o); + } + } + + /** + * Searches the id. + */ + private void searchId() { + model.clear(); + int itemId = 0; + try { + itemId = Integer.parseInt(idSearchField.getText()); + } catch (NumberFormatException e) { + + } + for (GrandExchangeOffer o : OfferManager.Companion.getOffersForItem(itemId)) { + if (o == null) { + continue; + } + addOffer(o); + } + } + + /** + * Adds a g.e offer. + */ + private void addOffer(GrandExchangeOffer offer) { + model.addElement(offer); + } + + /** + * Displays a database. + */ + private void displayDatabase() { + if (ConsoleFrame.getInstance().getUtilityTab().getPlayers().size() == 0) { + JOptionPane.showMessageDialog(null, "Error! No data in DB yet. Press load."); + return; + } + for (GrandExchangeOffer offer : OfferManager.Companion.getOFFER_MAPPING().values()) { + model.addElement(offer); + } + } +} diff --git a/Server/src/main/java/Server/core/gui/tab/PlayerTab.java b/Server/src/main/java/Server/core/gui/tab/PlayerTab.java new file mode 100644 index 000000000..8127488a4 --- /dev/null +++ b/Server/src/main/java/Server/core/gui/tab/PlayerTab.java @@ -0,0 +1,186 @@ +package core.gui.tab; + + +import core.ServerConstants; +import core.gui.ConsoleTab; +import core.gui.component.PlayerViewer; + +import javax.swing.*; +import javax.swing.border.BevelBorder; +import javax.swing.border.SoftBevelBorder; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.util.*; + +/** + * The player tab. + * + * @author Vexia + */ +public class PlayerTab extends ConsoleTab { + + /** + * The serial UID. + */ + private static final long serialVersionUID = 8865322670299347942L; + + /** + * The list of player names to search through. + */ + private final List playerNames = new ArrayList<>(); + + /** + * The player name text field. + */ + private JTextField textField; + + /** + * The default model. + */ + private final DefaultListModel model = new DefaultListModel(); + + /** + * The tabbed panes. + */ + private final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); + + /** + * The mapping of open player viewers. + */ + private final Map viewers = new HashMap<>(); + + /** + * Constructs a new {@Code PlayerTab} {@Code Object} + */ + public PlayerTab() { + super("Players"); + + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null)); + scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); + scrollPane.setBounds(6, 43, 260, 539); + add(scrollPane); + + final JList list = new JList(); + list.addListSelectionListener(e -> { + if (list.getSelectedValue() != null) { + openViewer(list.getSelectedValue()); + } + }); + list.setModel(model); + scrollPane.setViewportView(list); + + JLabel lblSearchForPlayer = new JLabel("Search for player:"); + lblSearchForPlayer.setBounds(6, 15, 143, 16); + add(lblSearchForPlayer); + + textField = new JTextField(); + textField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + model.clear(); + if (textField.getText() == null || textField.getText().length() < 1) { + populatePlayerSearch(); + return; + } + for (String name : playerNames) { + if (name.toLowerCase().contains(textField.getText())) { + model.addElement(name); + } + } + } + }); + textField.setBounds(117, 9, 149, 28); + add(textField); + textField.setColumns(10); + + tabbedPane.setBounds(278, 43, 755, 539); + add(tabbedPane); + + JButton btnRepopulate = new JButton("Repopulate"); + btnRepopulate.addActionListener(e -> populatePlayerSearch()); + btnRepopulate.setBounds(278, 10, 117, 29); + add(btnRepopulate); + populatePlayerSearch(); + } + + /** + * Opens a viewer for a player. + * + * @param name the name. + * @return {@code True} if opened. + */ + public boolean openViewer(String name) { + if (viewers.containsKey(name)) { + return false; + } + PlayerViewer viewer = new PlayerViewer(name); + viewers.put(name, viewer); + tabbedPane.add(viewer.getName(), viewer); + return true; + } + + /** + * Closes a viewer. + * + * @param viewer the viewer. + * @return {@code True} if closed. + */ + public boolean closeViewer(PlayerViewer viewer) { + if (!viewers.containsValue(viewer)) { + JOptionPane.showMessageDialog(null, "Error! Viewer wasn't open."); + return false; + } + viewers.remove(viewer.getName()); + tabbedPane.remove(viewer); + return true; + } + + /** + * Populates the searchable names. + */ + public void populatePlayerSearch() { + playerNames.clear(); + model.clear(); + File f = new File(ServerConstants.PLAYER_SAVE_PATH); + if (f.listFiles() == null) { + System.out.println("Player directory was null!"); + return; + } + for (File file : Objects.requireNonNull(f.listFiles())) { + String fileName = file.getName(); + if (!fileName.contains(".save")) continue; + String playerName = fileName.replace(".save", "").trim(); + playerNames.add(playerName); + model.addElement(playerName); + } + } + + /** + * Adds a searchable name to the list. + * + * @param name the name. + */ + public void addSearchableName(String name) { + playerNames.add(name); + } + + /** + * Gets the playerNames. + * + * @return the playerNames + */ + public List getPlayerNames() { + return playerNames; + } + + /** + * Gets the viewers. + * + * @return the viewers + */ + public Map getViewers() { + return viewers; + } +} diff --git a/Server/src/main/java/Server/core/gui/tab/StatisticsTab.java b/Server/src/main/java/Server/core/gui/tab/StatisticsTab.java new file mode 100644 index 000000000..627032b96 --- /dev/null +++ b/Server/src/main/java/Server/core/gui/tab/StatisticsTab.java @@ -0,0 +1,666 @@ +package core.gui.tab; + + +import core.Server; +import core.ServerConstants; +import core.game.node.item.GroundItemManager; +import core.game.system.SystemManager; +import core.game.system.SystemState; +import core.game.world.GameWorld; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; +import core.gui.ConsoleTab; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.net.URL; + +/** + * Handles server info tab. + * + * @author Emperor + */ +public class StatisticsTab extends ConsoleTab { + + /** + * The serial UID. + */ + private static final long serialVersionUID = 6164020580271944550L; + + /** + * The queue size. + */ + public static final int QUEUE_SIZE = 1 << 16; + + /** + * The performance data queue. + */ + private static short[] performanceQueue = new short[QUEUE_SIZE]; + + /** + * The memory data queue. + */ + private static short[] memoryQueue = new short[QUEUE_SIZE]; + + /** + * The current index of the performance queue. + */ + private static int queueIndex = 0; + + /** + * The current statistics zoom. + */ + private static int statisticsZoom = 5; + + /** + * The singleton. + */ + public static final StatisticsTab INSTANCE = new StatisticsTab(); + + /** + * The statistics mouse coordinates. + */ + private Point statisticMousePoint = null; + + /** + * The zoom in button. + */ + private JButton zoomIn; + + /** + * The zoom out button. + */ + private JButton zoomOut; + + /** + * The reset button. + */ + private JButton resetButton; + + /** + * The save log button. + */ + private JButton saveLogButton; + + /** + * The shutdown button. + */ + private JButton shutdown; + + /** + * The file chooser instance. + */ + private JFileChooser fileChooser; + + /** + * If the tool tip is currently opened. + */ + private boolean toolTipOpened; + + /** + * The world statistics text pane. + */ + private StatsTextPane worldStatistics; + + /** + * The thread statistics text pane. + */ + private StatsTextPane threadStatistics; + + /** + * The working time of the main thread. + */ + private static long workingTime; + + /** + * The maximum amount of players being active at the same time. + */ + private static int maximumPlayers; + + /** + * The text area. + */ + private final JTextArea console = new JTextArea(); + + /** + * Constructs a new {@Code StatisticsTab} {@Code Object} + */ + public StatisticsTab() { + super("Statistics"); + setLayout(null); + + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); + scrollPane.setBackground(UIManager.getColor("Button.background")); + scrollPane.setBounds(6, 403, 1042, 189); + scrollPane.setBorder(new TitledBorder(null, "Console", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + add(scrollPane); + + console.setLineWrap(true); + console.setBackground(UIManager.getColor("CheckBox.background")); + console.setEditable(false); + scrollPane.setViewportView(console); + + JLabel label = new JLabel(); + label.setBounds(450, 345, 163, 16); + add(label); + } + + @Override + public String getToolTipText(MouseEvent e) { + if (e.getX() > getWidth() / 2 && e.getX() < getWidth() + && e.getY() > 2 && e.getY() < getHeight() / 2) { + int max = (getWidth() / 2) / statisticsZoom; + int index = queueIndex - (max - (e.getX() - (getWidth() / 2)) / statisticsZoom); + toolTipOpened = true; + if (index < 0) { + return "Tick: null, time: null."; + } + return new StringBuilder("Tick: ").append(index).append(", time: ").append(performanceQueue[index] + 600).append(".").toString(); + } + toolTipOpened = false; + return null; + } + + @Override + public Point getToolTipLocation(MouseEvent e) { + if (e.getX() > getWidth() / 2 && e.getX() < getWidth() + && e.getY() > 2 && e.getY() < getHeight() / 2) { + return new Point(e.getX() + 15, e.getY() + 10); + } + return null; + } + + @Override + public void paint(Graphics g) { + super.paint(g); + drawPerformanceStatistics(this, g); + } + + /** + * Positions the components. + */ + public void positionComponents() { + int init = 90; + int diff = 5; + zoomIn.setLocation(getWidth() / 2 - (zoomIn.getWidth() / 2) - diff, 5 + init); + zoomOut.setLocation(getWidth() / 2 - (zoomOut.getWidth() / 2) - diff, 30 + init); + resetButton.setLocation(getWidth() / 2 - (resetButton.getWidth() / 2) - diff, 55 + init); + saveLogButton.setLocation(getWidth() / 2 - (saveLogButton.getWidth() / 2) - diff, 80 + init); + shutdown.setLocation(getWidth() / 2 - (shutdown.getWidth() / 2), 310); + worldStatistics.setLocation(55, 310); + threadStatistics.setLocation(shutdown.getX() + shutdown.getWidth() + 35, 310); + } + + /** + * Initializes the server info tab. + * + * @return This instance. + */ + public StatisticsTab init() { + initMaximumPlayers(); + fileChooser = new JFileChooser("./"); + zoomIn = new JButton("+"); + zoomIn.setLayout(null); + zoomIn.setVisible(true); + zoomIn.setSize(50, 20); + zoomIn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + zoomOut.setEnabled(true); + if (++statisticsZoom > 20) { + statisticsZoom = 20; + zoomIn.setEnabled(false); + return; + } + drawPerformanceStatistics(StatisticsTab.this, getGraphics()); + } + }); + zoomOut = new JButton("-"); + zoomOut.setLayout(null); + zoomOut.setVisible(true); + zoomOut.setSize(50, 20); + zoomOut.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + zoomIn.setEnabled(true); + if (--statisticsZoom < 2) { + statisticsZoom = 2; + zoomOut.setEnabled(false); + return; + } + drawPerformanceStatistics(StatisticsTab.this, getGraphics()); + } + }); + resetButton = new JButton("x"); + resetButton.setLayout(null); + resetButton.setVisible(true); + resetButton.setSize(50, 20); + resetButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + queueIndex = 0; + } + }); + saveLogButton = new JButton("", createImageIcon("Save16.gif")); + saveLogButton.setLayout(null); + saveLogButton.setVisible(true); + saveLogButton.setSize(50, 20); + saveLogButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int returnVal = fileChooser.showSaveDialog(StatisticsTab.this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + if (!file.getName().contains(".")) { + file = new File(file.getPath() + ".txt"); + } + logQueues(file); + } + } + }); + add(resetButton); + add(zoomIn); + add(zoomOut); + add(saveLogButton); + shutdown = new JButton("Shutdown"); + shutdown.setLayout(null); + shutdown.setVisible(true); + shutdown.setSize(100, 20); + shutdown.addActionListener(e -> SystemManager.flag(SystemState.TERMINATED)); + add(shutdown); + worldStatistics = new StatsTextPane().init(); + worldStatistics.setSize(390, 90); + add(worldStatistics); + updateWorldText(); + threadStatistics = new StatsTextPane().init(); + threadStatistics.setSize(390, 90); + add(threadStatistics); + updateThreadText(); + setLayout(null); + setVisible(true); + ToolTipManager.sharedInstance().setInitialDelay(0); + positionComponents(); + return this; + } + + /** + * Initializes the maximum players count. + */ + private static void initMaximumPlayers() { + setMaximumPlayers(0); + } + + /** + * Sets the maximum amount of players. + * + * @param maximum The maximum. + */ + private static void setMaximumPlayers(int maximum) { + maximumPlayers = maximum; + } + + /** + * Logs the queues. + * + * @param file The file to log to. + */ + protected static void logQueues(File file) { + try (BufferedWriter bw = new BufferedWriter(new FileWriter(file, true))) { + bw.append("/////////////////////////////////////////////////////////////////////////"); + bw.newLine(); + bw.append("/////////////////////////////////////////////////////////////////////////"); + bw.newLine(); + // bw.append("// " + CalenderDate.getFormattedDate() + " performance log results:"); + bw.newLine(); + bw.append("/////////////////////////////////////////////////////////////////////////"); + bw.newLine(); + for (int i = 0; i < queueIndex; i++) { + bw.append(new StringBuilder("performance_report:memory_usage-[tick=").append(i).append(", mem=").append(memoryQueue[i]).append("mb].")); + bw.newLine(); + } + for (int i = 0; i < queueIndex; i++) { + int value = 600 + performanceQueue[i]; + bw.append(new StringBuilder("performance_report:clock_speed-[tick=").append(i).append(", time=").append(value).append(", status=").append(value < 601 ? "NORMAL]." : "DELAYED].")); + bw.newLine(); + } + bw.append("/////////////////////////////////////////////////////////////////////////"); + bw.newLine(); + bw.flush(); + bw.close(); + } catch (Throwable t) { + t.printStackTrace(); + } + } + + /** + * Creates an image icon. + * + * @param path The path of the image file. + * @return The image icon. + */ + private static ImageIcon createImageIcon(String path) { + URL imgURL = StatisticsTab.class.getResource(path); + if (imgURL != null) { + return new ImageIcon(imgURL); + } + return null; + } + + /** + * Reports the performance value. + * + * @param value The value. + */ + public static void reportPerformance(int value) { + if (value >= Short.MAX_VALUE) { + value = Short.MAX_VALUE - 1; + } + secureQueues(); + performanceQueue[queueIndex] = (short) value; + memoryQueue[queueIndex++] = (short) ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1_000_000); + INSTANCE.repaint(); + workingTime += (600 + value); + if (INSTANCE.threadStatistics != null) { + INSTANCE.updateThreadText(); + if ((GameWorld.getTicks() % 10) == 0) { + INSTANCE.updateWorldText(); + } + } + } + + /** + * Updates the thread statistics text. + */ + public void updateThreadText() { + StringBuilder sb = new StringBuilder(); + long runtime = System.currentTimeMillis() - Server.startTime; + double percentage = workingTime / (runtime * 0.01); + long hours = runtime / 3600000; + runtime -= hours * 3600000; + long minutes = runtime / 60000; + runtime -= minutes * 60000; + long seconds = runtime / 1000; + sb.append("Runtime: ").append(hours).append("h ").append(minutes).append("m ").append(seconds).append("s").append(" - ").append(GameWorld.getTicks()).append(" ticks").append("\n"); + sb.append("Working time: ").append(workingTime).append("ms").append(" - ").append(String.format("%.2f", percentage)).append("%").append("\n"); + sb.append("Average cycle: ").append(String.format("%.1f", (double) workingTime / GameWorld.getTicks())).append("ms").append("\n"); + threadStatistics.setText(sb.toString()); + } + + /** + * Updates the world statistics text. + */ + public void updateWorldText() { + int players = Repository.getPlayers().size(); + if (players > getMaximumPlayers()) { + setMaximumPlayers(players); + } + StringBuilder sb = new StringBuilder(); + sb.append("Players: ").append(players).append(", max: ").append(getMaximumPlayers()).append("\n"); + sb.append("NPCs: ").append(Repository.getNpcs().size()).append("\n"); + sb.append("Regions: ").append(RegionManager.getRegionCache().size()).append("\n"); + sb.append("Ground items: ").append(GroundItemManager.getItems().size()).append("\n"); + worldStatistics.setText(sb.toString()); + } + + /** + * Draws the performance statistics. + * + * @param c The component. + * @param g The graphics. + */ + private static void drawPerformanceStatistics(Component c, Graphics g) { + int x = c.getWidth() / 2 + 48; + int y = c.getHeight() / 2; + + Point zero = new Point(x, y / 2); + g.setColor(Color.LIGHT_GRAY); + + //Fill the background rectangle. + g.fillRect(x, 5, c.getWidth() - 4 - x, y - 5); + g.setColor(Color.GRAY); + + int count = 0; + for (int i = 0; i < c.getWidth() - 4 - x; i += statisticsZoom) { + g.drawLine((int) (zero.getX() + i), 5, + (int) (zero.getX() + i), y - 1); + count++; + } + + int space = (y / 2 - 10) / 4; + g.setFont(new Font(null, Font.PLAIN, 9)); + for (int i = 0; i < 5; i++) { + g.setColor(i == 0 ? Color.BLACK : Color.GRAY); + g.drawLine(x, (int) zero.getY() - (space * i), c.getWidth() - 5, (int) zero.getY() - (space * i)); + g.drawLine(x, (int) zero.getY() + (space * i), c.getWidth() - 5, (int) zero.getY() + (space * i)); + g.setColor(Color.BLACK); + g.drawString("" + (i * 150), x - 18, (int) zero.getY() - (space * i) + 2); + if (i != 0) { + g.drawString("-" + (i * 150), x - 20, (int) zero.getY() + (space * i) + 2); + } + } + g.setColor(Color.GREEN); + for (int i = 1; i < count; i++) { + int index = queueIndex - i; + if (index < 1) { + break; + } + int fromPoint = performanceQueue[index]; + int fromX = (count - i) * statisticsZoom; + int fromY = (int) (-fromPoint / (600D / (space * 4))); + int toPoint = index == 0 ? 0 : performanceQueue[index - 1]; + int toX = (count - i - 1) * statisticsZoom; + int toY = (int) (-toPoint / (600D / (space * 4))); + if (fromY < 0) { + g.setColor(Color.RED); + } + g.drawLine((int) (zero.getX() + fromX), (int) (zero.getY() + fromY), + (int) (zero.getX() + toX), (int) (zero.getY() + toY)); + if (fromY >= 0) { + g.setColor(Color.GREEN); + } + } + g.setColor(Color.BLACK); + //Draw vertical line. + g.drawLine(x, y + 4, x, 1); + Point p = ((StatisticsTab) c).statisticMousePoint; + if (p != null) { + g.setColor(new Color(251, 230, 130)); + g.fillRoundRect((int) (p.getX() + 10), (int) (p.getY() - 10), 100, 50, 10, 10); + } + if (((StatisticsTab) c).toolTipOpened) { + ((StatisticsTab) c).setToolTipText("test"); + } + drawMemoryStatistics(c, g); + } + + /** + * Draws the performance statistics. + * + * @param c The component. + * @param g The graphics. + */ + private static void drawMemoryStatistics(Component c, Graphics g) { + int x = 5; + int y = c.getHeight() / 2; + int endX = (c.getWidth() / 2) - 48; + + Point zero = new Point(x + 18, y); + g.setColor(Color.LIGHT_GRAY); + + //Fill the background rectangle. + g.fillRect((int) zero.getX(), 5, endX - x, y - 5); + g.setColor(Color.GRAY); + + int count = 0; + for (int i = 0; i < endX - x; i += statisticsZoom) { + g.drawLine((int) (zero.getX() + i), 5, + (int) (zero.getX() + i), y - 1); + count++; + } + + int space = (y) / 10; + g.setFont(new Font(null, Font.PLAIN, 9)); + for (int i = 0; i < 10; i++) { + g.setColor(Color.GRAY); + g.drawLine((int) zero.getX() - 2, (int) zero.getY() - (space * i), endX + 17, (int) zero.getY() - (space * i)); + g.setColor(Color.BLACK); + g.drawString("" + (i * 100), 2, (int) zero.getY() - (space * i) + 2); + } + g.setColor(Color.BLUE); + for (int i = 1; i < count; i++) { + int index = queueIndex - i; + if (index < 1) { + break; + } + int fromPoint = memoryQueue[index]; + int fromX = (count - i) * statisticsZoom; + int fromY = (int) (fromPoint / (900D / (space * 10))); + int toPoint = index == 0 ? 0 : memoryQueue[index - 1]; + int toX = (count - i - 1) * statisticsZoom; + int toY = (int) (toPoint / (900D / (space * 10))); + if (fromY < 0) { + g.setColor(Color.RED); + } + g.drawLine((int) (zero.getX() + fromX), (int) (zero.getY() - fromY), + (int) (zero.getX() + toX), (int) (zero.getY() - toY)); + if (fromY < 0) { + g.setColor(Color.GREEN); + } + } + g.setColor(Color.BLACK); + //Draw horizontal line. + g.drawLine((int) (zero.getX() - 4), (int) zero.getY(), endX + 21, (int) zero.getY()); + //Draw vertical line. + g.drawLine((int) zero.getX(), (int) zero.getY() + 4, (int) zero.getX(), 1); + Point p = ((StatisticsTab) c).statisticMousePoint; + if (p != null) { + g.setColor(new Color(251, 230, 130)); + g.fillRoundRect((int) (p.getX() + 10), (int) (p.getY() - 10), 100, 50, 10, 10); + } + if (((StatisticsTab) c).toolTipOpened) { + ((StatisticsTab) c).setToolTipText("test"); + } + } + + /** + * Secures the queues. + */ + private static void secureQueues() { + if (queueIndex >= QUEUE_SIZE) { + int lagSpikes = 0; + int memoryUsageSpikes = 0; + @SuppressWarnings("unused") + int totalMemory = 0; + @SuppressWarnings("unused") + int totalCycleTime = 0; + //Start at tick 500, the JVM has to "warm up" first. + for (int i = 500; i < QUEUE_SIZE; i++) { + if (performanceQueue[i] > 0) { //Anything above 0 (-600 + 600) = lag + lagSpikes++; + } + if (memoryQueue[i] > 700) { //Over 700Mb + memoryUsageSpikes++; + } + totalMemory += memoryQueue[i]; + totalCycleTime += performanceQueue[i]; + } + if (lagSpikes > 350 || memoryUsageSpikes > 350) { + logQueues(new File(ServerConstants.LOGS_PATH + "/system/Performance-log.txt")); + } + //System.out.println("Average cycle time: " + (600 + (totalCycleTime / (QUEUE_SIZE - 500))) + "ms."); + //System.out.println("Average memory usage: " + (totalMemory / (QUEUE_SIZE - 500)) + "Mb."); + queueIndex = 0; + } + } + + /** + * Logs a message to the console. + * + * @param message the message. + */ + public void log(String message) { + console.append(message + "\n"); + console.setCaretPosition(console.getDocument().getLength()); + } + + /** + * Sets the statistics zoom. + * + * @param pixels The amount of pixels. + */ + public static void setStatisticsZoom(int pixels) { + statisticsZoom = pixels; + } + + /** + * Gets the workingTime. + * + * @return The workingTime. + */ + public static long getWorkingTime() { + return workingTime; + } + + /** + * Sets the workingTime. + * + * @param workingTime The workingTime to set. + */ + public static void setWorkingTime(long workingTime) { + StatisticsTab.workingTime = workingTime; + } + + /** + * Gets the maximumPlayers. + * + * @return The maximumPlayers. + */ + public static int getMaximumPlayers() { + return maximumPlayers; + } + + /** + * Handles the statistics tab text pane. + * + * @author Emperor + */ + public final class StatsTextPane extends JTextPane { + + /** + * The serial UID. + */ + private static final long serialVersionUID = 664276151176087663L; + + /** + * Constructs a new {@code StatsTextPane} {@code Object}. + */ + public StatsTextPane() { + super(); + } + + /** + * Initializes the stats text pane. + * + * @return The stats text pane. + */ + public StatsTextPane init() { + setEditable(false); + setLayout(null); + Font font = new Font("Monospaced", Font.PLAIN, 12); + setFont(font); + super.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); + super.setVisible(true); + return this; + } + + } +} diff --git a/Server/src/main/java/Server/core/gui/tab/UtilityTab.java b/Server/src/main/java/Server/core/gui/tab/UtilityTab.java new file mode 100644 index 000000000..7ef3ac48a --- /dev/null +++ b/Server/src/main/java/Server/core/gui/tab/UtilityTab.java @@ -0,0 +1,598 @@ +package core.gui.tab; + + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.PlayerDetails; +import core.game.node.entity.player.info.Rights; +import core.game.node.item.Item; +import core.game.system.task.TaskExecutor; +import core.gui.ConsoleFrame; +import core.gui.ConsoleTab; +import core.tools.PlayerLoader; +import core.tools.StringUtils; + +import javax.swing.*; +import javax.swing.border.EtchedBorder; +import javax.swing.border.TitledBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.text.NumberFormat; +import java.util.*; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Handles the utility programs. + * + * @author Vexia + */ +public final class UtilityTab extends ConsoleTab { + /** + * The {@link Logger} instance. + */ + private static final Logger logger = Logger.getLogger(UtilityTab.class.getName()); + /** + * The utility tab. + */ + private static final UtilityTab INSTANCE = new UtilityTab(); + + /** + * The serial UID. + */ + private static final long serialVersionUID = -4962790192758757624L; + + /** + * The list of players. + */ + private final List players = new ArrayList<>(); + + /** + * The mapping of ips & their users. + */ + private final Map> IPS = new HashMap<>(); + + /** + * The mapping of macs & their users. + */ + private final Map> MACS = new HashMap<>(); + + /** + * The mapping of comp names & their users. + */ + private final Map> COMPS = new HashMap<>(); + + /** + * The players loaded list. + */ + private final JLabel lblPlayersLoaded = new JLabel("Players loaded: "); + + /** + * If the map is being populated. + */ + private boolean populating; + + /** + * Constructs a new {@Code UtilityTab} {@Code Object} + */ + public UtilityTab() { + super("Utilities"); + + JPanel panel = new JPanel(); + panel.setBorder(new TitledBorder(null, "Resolvers & Trackers", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + panel.setBackground(UIManager.getColor("Button.background")); + panel.setBounds(18, 98, 152, 219); + add(panel); + panel.setLayout(null); + JButton btnResolveIp = new JButton("Resolve Ip"); + btnResolveIp.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + resolve(IPS); + } + }); + btnResolveIp.setBounds(17, 28, 117, 29); + panel.add(btnResolveIp); + + JButton btnResolveMac = new JButton("Resolve Mac"); + btnResolveMac.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + resolve(MACS); + } + }); + btnResolveMac.setBounds(17, 69, 117, 29); + panel.add(btnResolveMac); + + JButton btnResolveCompName = new JButton("Resolve Comp"); + btnResolveCompName.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + resolve(COMPS); + } + }); + btnResolveCompName.setBounds(17, 110, 117, 29); + panel.add(btnResolveCompName); + + JButton btnPopulateMaps = new JButton("Populate Maps"); + btnPopulateMaps.addActionListener(e -> { + populateList(); + JOptionPane.showMessageDialog(null, "Finished populating maps!"); + }); + btnPopulateMaps.setBounds(405, 32, 236, 29); + add(btnPopulateMaps); + + JLabel lblMustBeDone = new JLabel("MUST BE DONE BEFORE RUNNING TOOLS"); + lblMustBeDone.setBounds(390, 6, 379, 16); + add(lblMustBeDone); + + lblPlayersLoaded.setBounds(460, 61, 157, 16); + add(lblPlayersLoaded); + + JPanel panel_1 = new JPanel(); + panel_1.setLayout(null); + panel_1.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null), "Wealth & Items", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + panel_1.setBackground(UIManager.getColor("Button.background")); + panel_1.setBounds(182, 98, 145, 219); + add(panel_1); + + JButton btnWealthScanner = new JButton("Wealth Scanner"); + btnWealthScanner.addActionListener(e -> wealthScanner()); + btnWealthScanner.setBounds(6, 29, 129, 29); + panel_1.add(btnWealthScanner); + + JButton btnItemScanner = new JButton("Item Scanner"); + btnItemScanner.addActionListener(e -> itemScanner()); + btnItemScanner.setBounds(6, 69, 129, 29); + panel_1.add(btnItemScanner); + + JPanel panel_2 = new JPanel(); + panel_2.setLayout(null); + panel_2.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null), "Player Utils", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + panel_2.setBackground(UIManager.getColor("Button.background")); + panel_2.setBounds(345, 98, 145, 219); + add(panel_2); + + JButton btnStaffChecker = new JButton("Staff Scanner"); + btnStaffChecker.addActionListener(e -> staffScanner()); + btnStaffChecker.setBounds(6, 29, 129, 29); + panel_2.add(btnStaffChecker); + + JPanel panel_3 = new JPanel(); + panel_3.setLayout(null); + panel_3.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null), "Security", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + panel_3.setBackground(UIManager.getColor("Button.background")); + panel_3.setBounds(502, 98, 145, 219); + add(panel_3); + + JButton btnMacViewer = new JButton("Mac Viewer"); + btnMacViewer.addActionListener(e -> viewMacs()); + btnMacViewer.setBounds(6, 29, 129, 29); + panel_3.add(btnMacViewer); + + JButton btnMacRemover = new JButton("Mac Remover"); + btnMacRemover.addActionListener(e -> removeMac()); + btnMacRemover.setBounds(6, 64, 129, 29); + panel_3.add(btnMacRemover); + } + + /** + * Removes a mac. + */ + public void removeMac() { + String mac = JOptionPane.showInputDialog("Enter address:"); + if (mac == null || mac.length() <= 1) { + JOptionPane.showMessageDialog(null, "Error! Nothing entered."); + return; + } +// if (SystemManager.getSecurity().isBanned(mac)) { +// SystemManager.getSecurity().remove(mac); +// JOptionPane.showMessageDialog(null, "Removed the mac - " + mac + "!"); +// } else { +// JOptionPane.showMessageDialog(null, "Error! Couldn't find mac in system manager."); +// } + } + + /** + * Views the banned macs. + */ + public void viewMacs() { + JPanel panel = new JPanel(new GridLayout(0, 1)); + JScrollPane pane = new JScrollPane(); + DefaultListModel model = new DefaultListModel(); + JList list = new JList(); +// for (String i : SystemManager.getSecurity().getBannedAddresses()) { +// if (i == null) { +// continue; +// } +// model.addElement(i.toString()); +// } + list.setModel(model); + pane.setViewportView(list); + panel.add(pane); + JOptionPane.showConfirmDialog(null, panel, "Banned Addresses", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + } + + /** + * Wealth scanner. + */ + public void wealthScanner() { + String args = JOptionPane.showInputDialog("Enter item id:"); + int id = -1; + if (args != null && args.length() > 0) { + try { + id = Integer.parseInt(args); + } catch (NumberFormatException e) { + id = -1; + logger.log(Level.WARNING, "Error in wealth scanner, number exception!"); + } + } + List data = wealthScanner(id); + JPanel panel = new JPanel(new GridLayout(0, 1)); + JScrollPane pane = new JScrollPane(); + DefaultListModel model = new DefaultListModel(); + JList list = new JList(); + for (String i : data) { + if (i == null) { + continue; + } + model.addElement(i.toString()); + } + list.setModel(model); + pane.setViewportView(list); + panel.add(pane); + JOptionPane.showConfirmDialog(null, panel, "Wealth Scanner", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + + } + + /** + * Wealth scanner. + */ + public List wealthScanner(int itemId) { + Item item = null; + if (itemId != -1) { + item = new Item(itemId); + } + Object[][] mostWealthy = new Object[50][2]; + int player = 0; + long count = 0; + for (Player p : players) { + if (p.getDetails().getRights() == Rights.PLAYER_MODERATOR) { + continue; + } + if (item != null) { + long old = count; + count += p.getInventory().getAmount(item); + count += p.getEquipment().getAmount(item); + count += p.getBank().getAmount(item); + if (old != count) { + player++; + } + } + for (int i = 0; i < mostWealthy.length; i++) { + Long value = (Long) mostWealthy[i][0]; + if (value == null || value < p.getMonitor().getNetworth()) { + for (int j = mostWealthy.length - 1; j > i; j--) { + mostWealthy[j] = mostWealthy[j - 1]; + } + mostWealthy[i] = new Object[2]; + mostWealthy[i][0] = p.getMonitor().getNetworth(); + mostWealthy[i][1] = p.getName(); + break; + } + } + } + List formats = new ArrayList<>(); + for (int i = mostWealthy.length - 1; i >= 0; i--) { + Object[] info = mostWealthy[i]; + if (info != null && info[0] != null) { + formats.add(i + ": " + info[1] + " - " + NumberFormat.getNumberInstance(Locale.US).format((Long) info[0]) + " coins."); + } + } + if (item != null) { + formats.add(NumberFormat.getNumberInstance(Locale.US).format(count) + " occurrences of item " + item.getName() + " (id=" + item.getId() + ") by " + player + " players!"); + } + return formats; + } + + /** + * The item scanner. + */ + public void itemScanner() { + String args = JOptionPane.showInputDialog("Enter item id:"); + Item item = new Item(11694); + if (args != null && args.length() > 0) { + try { + item = new Item(Integer.parseInt(args)); + } catch (NumberFormatException e) { + item = new Item(11694); + logger.log(Level.WARNING, "Error in wealth scanner, number exception!"); + } + } + List formats = itemScanner(item); + JPanel panel = new JPanel(new GridLayout(0, 1)); + JScrollPane pane = new JScrollPane(); + DefaultListModel model = new DefaultListModel(); + JList list = new JList(); + for (String i : formats) { + if (i == null) { + continue; + } + model.addElement(i.toString()); + } + list.setModel(model); + pane.setViewportView(list); + panel.add(pane); + JOptionPane.showConfirmDialog(null, panel, "Item Scanner", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + } + + /** + * Scans for items in the eco. + */ + public List itemScanner(Item item) { + Map map = new HashMap<>(); + for (Player p : players) { + p.getAnimator(); + List containers = new ArrayList<>(); + containers.add(p.getInventory()); + containers.add(p.getBank()); + containers.add(p.getEquipment()); + int amount = 0; + for (core.game.container.Container container : containers) { + Item i = container.getItem(item); + if (i != null) { + amount += i.getAmount(); + } + } + if (amount > 0) { + map.put(p.getName(), amount); + } + } + List formats = new ArrayList<>(); + for (Map.Entry entry : map.entrySet()) { + formats.add("Player name=" + entry.getKey() + ", contained a total of " + entry.getValue() + " " + item.getName() + "."); + } + if (formats.size() == 0) { + formats.add("There were no occurrences of " + item + "."); + } + return formats; + } + + /** + * Resolves the address. + * + * @param map the map. + */ + public void resolve(Map> map) { + String address = JOptionPane.showInputDialog("Enter the address."); + List names = resolve(map, address, false); + String string = "No names found registered with that address!"; + if (names == null) { + JOptionPane.showMessageDialog(null, string); + } else { + string = "Names:" + Arrays.toString(names.toArray()); + JOptionPane.showMessageDialog(null, string); + } + } + + /** + * Resolves & tracks an adddress. + * + * @param map the map. + * @param value the value. + * @param name if the name or not. + * @return the names resolved. + */ + public List resolve(Map> map, String value, boolean name) { + List names = null; + String address = !name ? value : ""; + if (name) { + for (Map.Entry> entry : map.entrySet()) { + for (String s : entry.getValue()) { + if (s.equals(value)) { + address = entry.getKey(); + break; + } + } + } + } + names = map.get(address); + return names; + } + + /** + * Gets the mapping. + * + * @param id the id. + * @return the map. + */ + public Map> getMap(int id) { + return id == 1 ? IPS : id == 2 ? MACS : COMPS; + } + + /** + * Populates the lists. + */ + public void populateList() { + if (populating) { + return; + } + populating = true; + players.clear(); + TaskExecutor.execute(() -> { + ConsoleFrame.getInstance().getPlayerTab().getPlayerNames().clear(); + ConsoleFrame.getInstance().getPlayerTab().populatePlayerSearch(); + for (String name : ConsoleFrame.getInstance().getPlayerTab().getPlayerNames()) { + Player player = PlayerLoader.getPlayerFile(name); + if (player == null) { + continue; + } + PlayerDetails details = player.getDetails(); + if (details != null) { + addAddressToMap(name, details.getIpAddress(), IPS); + addAddressToMap(name, details.getMacAddress(), MACS); + addAddressToMap(name, details.getCompName(), COMPS); + players.add(player); + } + } + populating = false; + System.gc(); + lblPlayersLoaded.setText("Players loaded: " + players.size()); + }); + } + + /** + * Checks the staff. + */ + public void staffScanner() { + List staff = new ArrayList<>(); + for (Player player : players) { + if (player.getDetails().getRights() != Rights.REGULAR_PLAYER) { + staff.add(player.getName() + " - " + StringUtils.formatDisplayName(player.getDetails().getRights().toString())); + } + } + JPanel panel = new JPanel(new GridLayout(0, 1)); + JScrollPane pane = new JScrollPane(); + DefaultListModel model = new DefaultListModel(); + JList list = new JList(); + for (String i : staff) { + if (i == null) { + continue; + } + model.addElement(i.toString()); + } + list.setModel(model); + pane.setViewportView(list); + panel.add(pane); + JOptionPane.showConfirmDialog(null, panel, "Staff Scanner", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + } + + /** + * Adds an address with its names to the map. + * + * @param name the name. + * @param address the address. + * @param map the map. + */ + public void addAddressToMap(String name, String address, Map> map) { + if (address == null) { + return; + } + List names = map.get(address); + if (names == null) { + names = new ArrayList(); + } + names.add(name); + map.put(address, names); + } + + /** + * Deletes a player. + * + * @param details the details. + */ + public void delete(PlayerDetails details) { + if (details.getRights() == Rights.PLAYER_MODERATOR) { + return; + } + // TODO +// Connection connection = SQLManager.getConnection(); +// PreparedStatement statement; +// try { +// statement = connection.prepareStatement("DELETE FROM " + "playerdata" + " WHERE " + "" + "username" + "='" + details.getUsername().toLowerCase() + "'"); +// statement.execute(); +// statement = connection.prepareStatement("DELETE FROM " + "highscores" + " WHERE " + "" + "username" + "='" + details.getUsername().toLowerCase() + "'"); +// statement.execute(); +// } catch (SQLException e) { +// e.printStackTrace(); +// } +// +// File detailFile = new File(GameConstants.getPlayerDetailsPath() + "/" + details.getUsername() + ".store"); +// File playerFile = new File(GameConstants.getPlayerSavePath() + "/" + details.getUsername() + ".store"); +// detailFile.delete(); +// playerFile.delete(); +// SQLManager.close(connection); +// ConsoleFrame.getInstance().getPlayerTab().getPlayerNames().remove(details.getUsername()); + + } + + /** + * Gets the player. + * + * @param name the name. + * @return the player. + */ + public Player getPlayer(String name) { + if (players.size() == 0) { + populateList(); + return null; + } + for (Player p : players) { + if (p.getName().equals(name)) { + return p; + } + } + return null; + } + + /** + * Gets the ips. + * + * @return the ips. + */ + public Map> getIps() { + return IPS; + } + + /** + * Gets the macs. + * + * @return the macs. + */ + public Map> getMacs() { + return MACS; + } + + /** + * Gets the comps. + * + * @return the comps. + */ + public Map> getComps() { + return COMPS; + } + + /** + * Gets the players. + * + * @return the players. + */ + public List getPlayers() { + return players; + } + + /** + * Gets the populating. + * + * @return the populating + */ + public boolean isPopulating() { + return populating; + } + + /** + * Sets the bapopulating. + * + * @param populating the populating to set. + */ + public void setPopulating(boolean populating) { + this.populating = populating; + } + + /** + * Gets the instance. + * + * @return the instance + */ + public static UtilityTab getInstance() { + return INSTANCE; + } +} diff --git a/Server/src/main/java/Server/core/net/Constants.java b/Server/src/main/java/Server/core/net/Constants.java new file mode 100644 index 000000000..b9aebe87f --- /dev/null +++ b/Server/src/main/java/Server/core/net/Constants.java @@ -0,0 +1,30 @@ +package core.net; + +/** + * Network constants. + * @author Vexia + */ +public final class Constants { + + /** + * Represents the post the server is hosted on. + */ + public static final int PORT = 43594; + + /** + * The revision of the game server. + */ + public static final int REVISION = 530; + + /** + * The client build of the client, used for notifying players of a client + * update. + */ + public static final int CLIENT_BUILD = 1; + + /** + * The default Management server IP. + */ + public static final String DEFAULT_MS_IP = "127.0.0.1"; + +} diff --git a/Server/src/main/java/Server/core/net/EventProducer.java b/Server/src/main/java/Server/core/net/EventProducer.java new file mode 100644 index 000000000..79db6bf18 --- /dev/null +++ b/Server/src/main/java/Server/core/net/EventProducer.java @@ -0,0 +1,27 @@ +package core.net; + +import java.nio.ByteBuffer; + +/** + * Used for producing I/O events. + * @author Emperor + */ +public interface EventProducer { + + /** + * Produces a new read event. + * @param session The session. + * @param buffer The buffer to read. + * @return The read event handler. + */ + IoReadEvent produceReader(IoSession session, ByteBuffer buffer); + + /** + * Produces a new writing event. + * @param session The session. + * @param context The context. + * @return The write event handler. + */ + IoWriteEvent produceWriter(IoSession session, Object context); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/IoEventHandler.java b/Server/src/main/java/Server/core/net/IoEventHandler.java new file mode 100644 index 000000000..bd8b48eb2 --- /dev/null +++ b/Server/src/main/java/Server/core/net/IoEventHandler.java @@ -0,0 +1,100 @@ +package core.net; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.*; +import java.util.concurrent.ExecutorService; + +/** + * I/O event handling. + * @author Emperor + */ +public class IoEventHandler { + + /** + * The executor service. + */ + protected final ExecutorService service; + + /** + * Constructs a new {@code IoEventHandler}. + * @param service The executor service used for handling events. + */ + public IoEventHandler(ExecutorService service) { + this.service = service; + } + + /** + * Called when making a new connection. + * @param key The selection key. + * @throws IOException When an I/O exception occurs. + */ + public void connect(SelectionKey key) throws IOException { + /* + * empty. + */ + } + + /** + * Used for accepting a new connection. + * @param key The selection key. + * @param selector The selector. + * @throws IOException When an I/O exception occurs. + */ + public void accept(SelectionKey key, Selector selector) throws IOException { + SocketChannel sc = ((ServerSocketChannel) key.channel()).accept(); + sc.configureBlocking(false); + sc.socket().setTcpNoDelay(true); + sc.register(selector, SelectionKey.OP_READ); + } + + /** + * Reads the incoming packet data. + * @param key The selection key. + * @throws IOException When an I/O exception occurs. + */ + public void read(SelectionKey key) throws IOException { + ReadableByteChannel channel = (ReadableByteChannel) key.channel(); + ByteBuffer buffer = ByteBuffer.allocate(100_000); + IoSession session = (IoSession) key.attachment(); + if (channel.read(buffer) == -1) { + //just when a client closes their client, nothing to worry about. + throw new IOException("An existing connection was disconnected!"); + } + buffer.flip(); + if (session == null) { + key.attach(session = new IoSession(key, service)); + } + service.execute(session.getProducer().produceReader(session, buffer)); + } + + /** + * Writes the outgoing packet data. + * @param key The selection key. + */ + public void write(SelectionKey key) { + IoSession session = (IoSession) key.attachment(); + key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE); + session.write(); + } + + /** + * Disconnects a connection. + * @param key The selection key. + * @param t The occurred exception (if any). + */ + public void disconnect(SelectionKey key, Throwable t) { + try { + IoSession session = (IoSession) key.attachment(); + String cause = "" + t; + if (t != null && !(t instanceof ClosedChannelException || cause.contains("De externe host") || cause.contains("De software op uw") || cause.contains("An established connection was aborted") || cause.contains("An existing connection") || cause.contains("AsynchronousClose"))) { + t.printStackTrace(); + } + if (session != null) { + session.disconnect(); + } + } catch (Throwable e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/IoReadEvent.java b/Server/src/main/java/Server/core/net/IoReadEvent.java new file mode 100644 index 000000000..0efbc67cf --- /dev/null +++ b/Server/src/main/java/Server/core/net/IoReadEvent.java @@ -0,0 +1,72 @@ +package core.net; + +import java.nio.ByteBuffer; + +/** + * Handles a reading event. + * @author Emperor + */ +public abstract class IoReadEvent implements Runnable { + + /** + * The I/O session. + */ + private final IoSession session; + + /** + * The buffer. + */ + private ByteBuffer buffer; + + /** + * If the queued reading buffer was used (debugging purposes). + */ + protected boolean usedQueuedBuffer; + + /** + * Constructs a new {@code IoReadEvent}. + * @param session The session. + * @param buffer The buffer to read from. + */ + public IoReadEvent(IoSession session, ByteBuffer buffer) { + this.session = session; + this.buffer = buffer; + } + + @Override + public void run() { + try { + if (session.getReadingQueue() != null) { + buffer = session.getReadingQueue().put(buffer); + buffer.flip(); + session.setReadingQueue(null); + usedQueuedBuffer = true; + } + read(session, buffer); + } catch (Throwable t) { + t.printStackTrace(); + session.disconnect(); + } + } + + /** + * Queues the buffer until more data has been received. + * @param data The data that has been read already. + */ + public void queueBuffer(int... data) { + ByteBuffer queue = ByteBuffer.allocate(data.length + buffer.remaining() + 100_000); + for (int value : data) { + queue.put((byte) value); + } + queue.put(buffer); + session.setReadingQueue(queue); + } + + /** + * Reads the data from the buffer. + * @param session The session. + * @param buffer The buffer to read from. + */ + public abstract void read(IoSession session, ByteBuffer buffer); + +} diff --git a/Server/src/main/java/Server/core/net/IoSession.java b/Server/src/main/java/Server/core/net/IoSession.java new file mode 100644 index 000000000..96e87f42b --- /dev/null +++ b/Server/src/main/java/Server/core/net/IoSession.java @@ -0,0 +1,437 @@ +package core.net; + +import core.cache.crypto.ISAACPair; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.ClientInfo; +import core.game.node.entity.player.info.login.Response; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.producer.HSEventProducer; +import core.net.producer.LoginEventProducer; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.SocketChannel; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Represents a connected I/O session. + * @author Emperor + */ +public class IoSession { + + /** + * The handshake event producer. + */ + private static final EventProducer HANDSHAKE_PRODUCER = new HSEventProducer(); + + /** + * The selection key. + */ + private final SelectionKey key; + + public int isaacInputOpcode = 0; + + /** + * The executor service. + */ + private final ExecutorService service; + + /** + * The event producer. + */ + private EventProducer producer = HANDSHAKE_PRODUCER; + + /** + * The currently queued writing data. + */ + private List writingQueue = new ArrayList<>(); + + /** + * The currently queued reading data. + */ + private ByteBuffer readingQueue; + + /** + * The writing lock. + */ + private Lock writingLock = new ReentrantLock(); + + /** + * The ISAAC cipher pair. + */ + private ISAACPair isaacPair; + + /** + * The name hash. + */ + private int nameHash; + + /** + * The server key. + */ + private long serverKey; + + /** + * The JS-5 encryption value. + */ + private int js5Encryption; + + /** + * The object. + */ + private Object object; + + /** + * If the session is active. + */ + private boolean active = true; + + /** + * The last ping time stamp. + */ + private long lastPing; + + /** + * The address. + */ + private final String address; + + /** + * The JS-5 queue. + */ + private final JS5Queue js5Queue; + + /** + * The client info. + */ + private ClientInfo clientInfo; + + /** + * Constructs a new {@code IoSession}. + * @param key The selection key. + * @param service The executor service. + */ + public IoSession(SelectionKey key, ExecutorService service) { + this.key = key; + this.service = service; + this.address = getRemoteAddress().replaceAll("/", "").split(":")[0]; + this.js5Queue = new JS5Queue(this); + } + + /** + * Fires a write event created using the current event producer. + * @param context The event context. + */ + public void write(Object context) { + write(context, false); + } + + /** + * Fires a write event created using the current event producer. + * @param context The event context. + * @param instant If the event should be instantly executed on this thread. + */ + public void write(Object context, boolean instant) { + if (context == null) { + throw new IllegalStateException("Invalid writing context!"); + } + if (!(context instanceof Response) && producer instanceof LoginEventProducer) { + // new Throwable().printStackTrace(); + return; + } + if (instant) { + producer.produceWriter(this, context).run(); + return; + } + service.execute(producer.produceWriter(this, context)); + } + + /** + * Sends the packet data (without write event encoding). + * @param buffer The buffer. + */ + public void queue(ByteBuffer buffer) { + try { + writingLock.tryLock(1000L, TimeUnit.MILLISECONDS); + } catch (Exception e){ + System.out.println(e); + writingLock.unlock(); + } + writingQueue.add(buffer); + writingLock.unlock(); + write(); + } + + /** + * Handles the writing of all buffers in the queue. + */ + public void write() { + if (!key.isValid()) { + disconnect(); + return; + } + try { + writingLock.tryLock(1000L, TimeUnit.MILLISECONDS); + } catch (Exception e){ + System.out.println(e); + writingLock.unlock(); + return; + } + SocketChannel channel = (SocketChannel) key.channel(); + try { + while (!writingQueue.isEmpty()) { + ByteBuffer buffer = writingQueue.get(0); + channel.write(buffer); + if (buffer.hasRemaining()) { + key.interestOps(key.interestOps() | SelectionKey.OP_WRITE); + break; + } + writingQueue.remove(0); + } + } catch (IOException e) { + disconnect(); + } + writingLock.unlock(); + } + + /** + * Disconnects the session. + */ + public void disconnect() { + try { + if (!active) { + return; + } + active = false; + key.cancel(); + SocketChannel channel = (SocketChannel) key.channel(); + channel.socket().close(); + if (object instanceof Player) { + final Player p = getPlayer(); + GameWorld.getPulser().submit(new Pulse(0) { + @Override + public boolean pulse() { + if (p.isActive() && !p.getSession().active) { + p.clear(); + } + return true; + } + }); + } + object = null; + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Gets the IP-address (without the port). + * @return The address. + */ + public String getAddress() { + return address; + } + + /** + * Gets the remote address of this session. + * @return The remote address, as a String. + */ + public String getRemoteAddress() { + try { + return ((SocketChannel) key.channel()).getRemoteAddress().toString(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + /** + * Gets the current event producer. + * @return The producer. + */ + public EventProducer getProducer() { + return producer; + } + + /** + * Sets the event producer. + * @param producer The producer to set. + */ + public void setProducer(EventProducer producer) { + this.producer = producer; + } + + /** + * Gets the queued reading data. + * @return The readingQueue. + */ + public ByteBuffer getReadingQueue() { + synchronized (this) { + return readingQueue; + } + } + + /** + * Queues reading data. + * @param readingQueue The readingQueue to set. + */ + public void setReadingQueue(ByteBuffer readingQueue) { + synchronized (this) { + this.readingQueue = readingQueue; + } + } + + /** + * Gets the writing lock. + * @return The writing lock. + */ + public Lock getWritingLock() { + return writingLock; + } + + /** + * Gets the selection key. + * @return The selection key. + */ + public SelectionKey getKey() { + return key; + } + + /** + * @return The active. + */ + public boolean isActive() { + return active; + } + + /** + * @return The js5Encryption. + */ + public int getJs5Encryption() { + return js5Encryption; + } + + /** + * @param js5Encryption The js5Encryption to set. + */ + public void setJs5Encryption(int js5Encryption) { + this.js5Encryption = js5Encryption; + } + + /** + * @return The player. + */ + public Player getPlayer() { + return (Player) object; + } + + /** + * Gets the object. + * @return the object. + */ + public Object getObject() { + return object; + } + + /** + * @param object The object to set. + */ + public void setObject(Object object) { + this.object = object; + } + + /** + * Gets the lastPing. + * @return The lastPing. + */ + public long getLastPing() { + return lastPing; + } + + /** + * Sets the lastPing. + * @param lastPing The lastPing to set. + */ + public void setLastPing(long lastPing) { + this.lastPing = lastPing; + } + + /** + * Gets the nameHash. + * @return The nameHash. + */ + public int getNameHash() { + return nameHash; + } + + /** + * Sets the nameHash. + * @param nameHash The nameHash to set. + */ + public void setNameHash(int nameHash) { + this.nameHash = nameHash; + } + + /** + * Gets the serverKey. + * @return The serverKey. + */ + public long getServerKey() { + return serverKey; + } + + /** + * Sets the serverKey. + * @param serverKey The serverKey to set. + */ + public void setServerKey(long serverKey) { + this.serverKey = serverKey; + } + + /** + * Gets the isaacPair. + * @return The isaacPair. + */ + public ISAACPair getIsaacPair() { + return isaacPair; + } + + /** + * Sets the isaacPair. + * @param isaacPair The isaacPair to set. + */ + public void setIsaacPair(ISAACPair isaacPair) { + this.isaacPair = isaacPair; + } + + /** + * Gets the js5Queue. + * @return the js5Queue + */ + public JS5Queue getJs5Queue() { + return js5Queue; + } + + /** + * Gets the clientInfo value. + * @return The clientInfo. + */ + public ClientInfo getClientInfo() { + return clientInfo; + } + + /** + * Sets the clientInfo value. + * @param clientInfo The clientInfo to set. + */ + public void setClientInfo(ClientInfo clientInfo) { + this.clientInfo = clientInfo; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/IoWriteEvent.java b/Server/src/main/java/Server/core/net/IoWriteEvent.java new file mode 100644 index 000000000..acb113225 --- /dev/null +++ b/Server/src/main/java/Server/core/net/IoWriteEvent.java @@ -0,0 +1,50 @@ +package core.net; + +import java.nio.channels.CancelledKeyException; + +/** + * Handles a writing event. + * @author Emperor + */ +public abstract class IoWriteEvent implements Runnable { + + /** + * The I/O session. + */ + private final IoSession session; + + /** + * The buffer. + */ + private final Object context; + + /** + * Constructs a new {@code IoWriteEvent}. + * @param session The session. + * @param context The write event context. + */ + public IoWriteEvent(IoSession session, Object context) { + this.session = session; + this.context = context; + } + + @Override + public void run() { + try { + write(session, context); + } catch (Throwable t) { + if (!(t instanceof CancelledKeyException)) { + t.printStackTrace(); + } + session.disconnect(); + } + } + + /** + * Writes the data. + * @param session The session. + * @param context The write event context. + */ + public abstract void write(IoSession session, Object context); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/JS5Queue.java b/Server/src/main/java/Server/core/net/JS5Queue.java new file mode 100644 index 000000000..7dbe80ce0 --- /dev/null +++ b/Server/src/main/java/Server/core/net/JS5Queue.java @@ -0,0 +1,120 @@ +package core.net; + +import core.game.system.task.TaskExecutor; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Handles the JS5 queue for a session. + * @author Emperor + */ +public final class JS5Queue { + + /** + * The queued JS5 requests. + */ + private final Map queue = new HashMap<>(); + + /** + * The I/O session. + */ + private final IoSession session; + + /** + * If the queue has been scheduled for release. + */ + private boolean scheduledRelease; + + /** + * The lock object. + */ + private Lock lock = new ReentrantLock(); + + /** + * Constructs a new {@code JS5Queue} {@code Object}. + * @param session The I/O session. + */ + public JS5Queue(IoSession session) { + this.session = session; + } + + /** + * Queues a JS-5 request. + * @param container The container. + * @param archive The archive. + * @param highPriority If the request is high priority. + */ + public void queue(int container, int archive, boolean highPriority) { + try { + lock.tryLock(1000L, TimeUnit.MILLISECONDS); + } catch (Exception e){ + e.printStackTrace(); + lock.unlock(); + return; + } + int key = container << 16 | archive; + if (queue.containsKey(key)) { + // SystemLogger.logErr("Queue already contained request " + container + // + "," + archive + " > " + (container << 16 | archive) + "."); + } + queue.put(key, highPriority); + lock.unlock(); + release(); + } + + /** + * Releases the queue. + */ + public void release() { + lock.lock(); + if (!scheduledRelease) { + scheduledRelease = true; + TaskExecutor.getExecutor().schedule(new Runnable() { + @Override + public void run() { + lock.lock(); + for (Integer hash : queue.keySet()) { + try { + session.write(new int[] { hash >> 16 & 0xFF, hash & 0xFFFF, queue.get(hash) ? 1 : 0 }); + } catch (Throwable t) { + t.printStackTrace(); + } + } + queue.clear(); + scheduledRelease = false; + lock.unlock(); + } + }, 100, TimeUnit.MILLISECONDS); + } + lock.unlock(); + } + + /** + * Gets the session. + * @return the session + */ + public IoSession getSession() { + return session; + } + + /** + * Gets the scheduledRelease. + * @return the scheduledRelease + */ + public boolean isScheduledRelease() { + return scheduledRelease; + } + + /** + * Sets the scheduledRelease. + * @param scheduledRelease the scheduledRelease to set. + */ + public void setScheduledRelease(boolean scheduledRelease) { + this.scheduledRelease = scheduledRelease; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/NioReactor.java b/Server/src/main/java/Server/core/net/NioReactor.java new file mode 100644 index 000000000..42fea5a1d --- /dev/null +++ b/Server/src/main/java/Server/core/net/NioReactor.java @@ -0,0 +1,148 @@ +package core.net; + +import core.net.amsc.MSEventHandler; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Iterator; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * Handles (NIO-based) networking events using the reactor pattern. + * @author Emperor + */ +public final class NioReactor implements Runnable { + + /** + * The executor service. + */ + private final ExecutorService service; + + /** + * The socket channel. + */ + private ServerSocketConnection channel; + + /** + * The I/O event handling instance. + */ + private IoEventHandler eventHandler; + + /** + * If the reactor is running. + */ + private boolean running; + + /** + * Constructs a new {@code NioReactor}. + */ + private NioReactor(IoEventHandler eventHandler) { + this.service = Executors.newSingleThreadScheduledExecutor(); + this.eventHandler = eventHandler; + } + + /** + * Creates and configures a new {@code NioReactor} with a pool size of 1. + * @param port The port. + * @return The {@code NioReactor} {@code Object}. + * @throws IOException When an I/O exception occurs. + */ + public static NioReactor configure(int port) throws IOException { + return configure(port, 1); + } + + /** + * Creates and configures a new {@code NioReactor}. + * @param port The port. + * @param poolSize The amount of threads in the thread pool. + * @return The {@code NioReactor} {@code Object}. + * @throws IOException When an I/O exception occurs. + */ + public static NioReactor configure(int port, int poolSize) throws IOException { + NioReactor reactor = new NioReactor(new IoEventHandler(Executors.newFixedThreadPool(poolSize))); + ServerSocketChannel channel = ServerSocketChannel.open(); + Selector selector = Selector.open(); + channel.bind(new InetSocketAddress(port)); + channel.configureBlocking(false); + channel.register(selector, SelectionKey.OP_ACCEPT); + reactor.channel = new ServerSocketConnection(selector, channel); + return reactor; + } + + /** + * Starts a NIO reactor used for client connections. + * @param address The IP-address to connect to. + * @param port The port used. + * @return The NIO reactor object. + * @throws IOException When an exception occurs. + */ + public static NioReactor connect(String address, int port) throws IOException { + NioReactor reactor = new NioReactor(new MSEventHandler()); + Selector selector = Selector.open(); + SocketChannel channel = SocketChannel.open(); + channel.configureBlocking(false); + channel.socket().setKeepAlive(true); + channel.socket().setTcpNoDelay(true); + channel.connect(new InetSocketAddress(address, port)); + channel.register(selector, SelectionKey.OP_CONNECT); + reactor.channel = new ServerSocketConnection(selector, channel); + return reactor; + } + + /** + * Starts the reactor. + */ + public void start() { + running = true; + service.execute(this); + } + + @Override + public void run() { + Thread.currentThread().setName("NioReactor"); + while (running) { + try { + channel.getSelector().select(); + } catch (IOException e) { + e.printStackTrace(); + } + Iterator iterator = channel.getSelector().selectedKeys().iterator(); + while (iterator.hasNext()) { + SelectionKey key = iterator.next(); + iterator.remove(); + try { + if (!key.isValid() || !key.channel().isOpen()) { + key.cancel(); + continue; + } + if (key.isConnectable()) { + eventHandler.connect(key); + } + if (key.isAcceptable()) { + eventHandler.accept(key, channel.getSelector()); + } + if (key.isReadable()) { + eventHandler.read(key); + } else if (key.isWritable()) { + eventHandler.write(key); + } + } catch (Throwable t) { + eventHandler.disconnect(key, t); + } + } + } + } + + /** + * Terminates the reactor (once it's done processing current I/O events). + */ + public void terminate() { + running = false; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/ServerSocketConnection.java b/Server/src/main/java/Server/core/net/ServerSocketConnection.java new file mode 100644 index 000000000..d4fb0f20d --- /dev/null +++ b/Server/src/main/java/Server/core/net/ServerSocketConnection.java @@ -0,0 +1,83 @@ +package core.net; + +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; + +/** + * Represents a server socket and its selector. + * @author Emperor + */ +public final class ServerSocketConnection { + + /** + * The selector. + */ + private final Selector selector; + + /** + * The channel. + */ + private final ServerSocketChannel channel; + + /** + * The socket channel. + */ + private final SocketChannel socket; + + /** + * Constructs a new {@code ServerSocketConnection} {@code Object}. + * @param selector The selector. + * @param channel The channel. + */ + public ServerSocketConnection(Selector selector, ServerSocketChannel channel) { + this.selector = selector; + this.channel = channel; + this.socket = null; + } + + /** + * Constructs a new {@Code ServerSocketConnection} {@Code + * Object} + * @param selector The selector. + * @param channel The channel. + */ + public ServerSocketConnection(Selector selector, SocketChannel channel) { + this.selector = selector; + this.socket = channel; + this.channel = null; + } + + /** + * If the channel is used as client. + * @return {@code True} if so. + */ + public boolean isClient() { + return socket != null; + } + + /** + * Gets the selector. + * @return the selector. + */ + public Selector getSelector() { + return selector; + } + + /** + * Gets the channel. + * @return the channel. + */ + public ServerSocketChannel getChannel() { + return channel; + } + + /** + * Gets the socket. + * @return the socket + */ + public SocketChannel getSocket() { + return socket; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/amsc/MSEventHandler.java b/Server/src/main/java/Server/core/net/amsc/MSEventHandler.java new file mode 100644 index 000000000..c39712451 --- /dev/null +++ b/Server/src/main/java/Server/core/net/amsc/MSEventHandler.java @@ -0,0 +1,66 @@ +package core.net.amsc; + +import core.game.system.SystemLogger; +import core.net.IoEventHandler; +import core.net.IoSession; + +import java.io.IOException; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.SocketChannel; +import java.util.concurrent.Executors; + +/** + * Handles the management server events. + * @author Emperor + */ +public final class MSEventHandler extends IoEventHandler { + + /** + * Constructs a new {@Code MSEventHandler} {@Code Object} + */ + public MSEventHandler() { + super(Executors.newSingleThreadExecutor()); + } + + @Override + public void connect(SelectionKey key) throws IOException { + SocketChannel ch = (SocketChannel) key.channel(); + try { + if (ch.finishConnect()) { + key.interestOps(key.interestOps() ^ SelectionKey.OP_CONNECT); + key.interestOps(key.interestOps() | SelectionKey.OP_READ); + IoSession session = (IoSession) key.attachment(); + key.attach(session = new IoSession(key, service)); + WorldCommunicator.register(session); + return; + } + } catch (Throwable t) { + t.printStackTrace(); + } + SystemLogger.logErr("Failed connecting to Management Server!"); + WorldCommunicator.terminate(); + } + + @Override + public void accept(SelectionKey key, Selector selector) throws IOException { + super.write(key); + } + + @Override + public void read(SelectionKey key) throws IOException { + super.read(key); + } + + @Override + public void write(SelectionKey key) { + super.write(key); + } + + @Override + public void disconnect(SelectionKey key, Throwable t) { + super.disconnect(key, t); + WorldCommunicator.terminate(); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/amsc/MSPacketRepository.java b/Server/src/main/java/Server/core/net/amsc/MSPacketRepository.java new file mode 100644 index 000000000..0e849e30f --- /dev/null +++ b/Server/src/main/java/Server/core/net/amsc/MSPacketRepository.java @@ -0,0 +1,663 @@ +package core.net.amsc; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.PlayerDetails; +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.info.login.LoginParser; +import core.game.node.entity.player.info.login.Response; +import core.game.system.SystemLogger; +import core.game.system.SystemManager; +import core.game.system.SystemState; +import core.game.system.communication.*; +import core.game.world.GameWorld; +import core.game.world.repository.Repository; +import core.net.packet.IoBuffer; +import core.net.packet.PacketHeader; +import core.net.packet.PacketRepository; +import core.net.packet.context.ClanContext; +import core.net.packet.context.ContactContext; +import core.net.packet.context.MessageContext; +import core.net.packet.out.CommunicationMessage; +import core.net.packet.out.ContactPackets; +import core.net.packet.out.UpdateClanChat; + +import java.nio.ByteBuffer; + +/** + * The Management server packet repository. + * @author Emperor + */ +public final class MSPacketRepository { + + /** + * Handles a player info update. + * + */ + public static void sendInfoUpdate(Player player) { + IoBuffer buffer = new IoBuffer(14, PacketHeader.BYTE); + buffer.putString(player.getName()); + buffer.put(Rights.getChatIcon(player)); + WorldCommunicator.getSession().write(buffer); + player.getAppearance().sync(); + } + + /** + * Registers a player on the management server. + * + * @param parser The login. + */ + public static void sendPlayerRegistry(LoginParser parser) { + IoBuffer buffer = new IoBuffer(0, PacketHeader.BYTE); + PlayerDetails d = parser.getDetails(); + buffer.putString(d.getUsername()); + buffer.putString(d.getPassword()); + buffer.putString(d.getIpAddress()); + buffer.putString(d.getMacAddress()); + buffer.putString(d.getCompName()); + buffer.putString(d.getSerial()); + buffer.putInt(d.getRights().toInteger()); + buffer.put((byte) getIcon(d)); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Sends the player removal packet. + * + * @param username The name of the player to remove. + */ + public static void sendPlayerRemoval(String username) { + if (!WorldCommunicator.isEnabled()) { + return; + } + IoBuffer buffer = new IoBuffer(1, PacketHeader.BYTE); + buffer.putString(username); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Sends the punishment packet to the MS. + * + * @param player The player punishing the other player. + * @param name The name of the player to punish. + * @param type The punishment type (0: mute, 1: ban, 2: ip-ban, 3: mac-ban, + * 4: msk-ban) + * @param duration The duration of the punishment (in milliseconds, -1 = + * permanent). + */ + public static void sendPunishment(Player player, String name, int type, long duration) { + IoBuffer buffer = new IoBuffer(2, PacketHeader.BYTE); + buffer.put(type); + buffer.putString(name); + buffer.putLong(duration); + buffer.putString(player.getName()); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Requests the communication info for the given player. + * + * @param username The username. + */ + public static void requestCommunicationInfo(String username) { + IoBuffer buffer = new IoBuffer(3, PacketHeader.BYTE); + buffer.putString(username); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Sends a contact update. + * + * @param username The username. + * @param contact The contact's username. + * @param remove If we're removing the contact from the list. + * @param block If the contact list is for the blocked players. + * @param rank The new clan rank (or null when not updating clan rank!). + */ + public static void sendContactUpdate(String username, String contact, boolean remove, boolean block, ClanRank rank) { + IoBuffer buffer = new IoBuffer(block ? 5 : 4, PacketHeader.BYTE); + buffer.putString(username); + buffer.putString(contact); + if (rank != null) { + buffer.put((byte) 2); + buffer.put((byte) rank.ordinal()); + } else { + buffer.put((byte) (remove ? 1 : 0)); + } + WorldCommunicator.getSession().write(buffer); + } + + /** + * Joins a clan. + * + * @param player The player joining a clan. + * @param name The clan's owner name. + */ + public static void sendJoinClan(Player player, String name) { + if (name.length() > 0 && !ClanRepository.getClans().containsKey(name)) { + requestClanInfo(name); + } + IoBuffer buffer = new IoBuffer(6, PacketHeader.BYTE); + buffer.putString(player.getName()); + buffer.putString(name); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Sends the clan rename packet. + * + * @param player The player. + * @param clanName The clan name. + */ + public static void sendClanRename(Player player, String clanName) { + IoBuffer buffer = new IoBuffer(7, PacketHeader.BYTE); + buffer.putString(player.getName()); + buffer.putString(clanName); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Sets a clan setting. + * + * @param player The player. + * @param type The setting type. + * @param rank The rank to set. + */ + public static void setClanSetting(Player player, int type, ClanRank rank) { + if (!WorldCommunicator.isEnabled()) { + return; + } + IoBuffer buffer = new IoBuffer(8, PacketHeader.BYTE); + buffer.putString(player.getName()); + buffer.put((byte) type); + if (rank != null) { + buffer.put((byte) rank.ordinal()); + } + WorldCommunicator.getSession().write(buffer); + } + + /** + * Sends the kicking a clan member packet. + * + * @param username The player's username. + * @param name The name. + */ + public static void sendClanKick(String username, String name) { + IoBuffer buffer = new IoBuffer(9, PacketHeader.BYTE); + buffer.putString(username); + buffer.putString(name); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Sends a clan message. + * + * @param player The player sending the message. + * @param message The message to send. + */ + public static void sendClanMessage(Player player, String message) { + IoBuffer buffer = new IoBuffer(10, PacketHeader.BYTE); + buffer.putString(player.getName()); + buffer.putString(message); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Sends a private message. + * + * @param player The player. + * @param name The target name. + * @param message The message. + */ + public static void sendPrivateMessage(Player player, String name, String message) { + IoBuffer buffer = new IoBuffer(11, PacketHeader.BYTE); + buffer.putString(player.getName()); + buffer.putString(name); + buffer.putString(message); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Requests clan information. + * + * @param name The clan's owner name. + */ + public static void requestClanInfo(String name) { + IoBuffer buffer = new IoBuffer(12, PacketHeader.BYTE); + buffer.putString(name); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Sends the chat settings. + * + * @param player The player. + * @param publicSetting The public chat setting. + * @param privateSetting The private chat setting. + * @param tradeSetting The trade setting. + */ + public static void sendChatSetting(Player player, int publicSetting, int privateSetting, int tradeSetting) { + IoBuffer buffer = new IoBuffer(13, PacketHeader.BYTE); + buffer.putString(player.getName()); + buffer.put(publicSetting); + buffer.put(privateSetting); + buffer.put(tradeSetting); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Handles an incoming packet from the management server. + * + * @param opcode The opcode. + * @param b The buffer. + */ + public static void handleIncoming(int opcode, ByteBuffer b) { + IoBuffer buffer = new IoBuffer(opcode, PacketHeader.NORMAL, b); + switch (opcode) { + case 0: + handleRegistryResponse(buffer); + break; + case 2: + handlePlayerMessage(buffer); + break; + case 3: + handleContactInformation(buffer); + break; + case 4: + handleContactUpdate(buffer); + break; + case 5: + handleMessage(buffer); + break; + case 6: + handleClanInformation(buffer); + break; + case 7: + handleLeaveClan(buffer); + break; + case 8: + handleContactNotification(buffer); + break; + case 9: + handlePlayerLogout(buffer); + break; + case 10: + handleUpdate(buffer); + break; + case 11: + handlePunishmentUpdate(buffer); + break; + case 15: + SystemManager.getSystemConfig().parse(); + SystemLogger.logInfo("System configurations reloaded."); + break; + default: + System.out.println("Handling incoming packet [opcode=" + opcode + ", size=" + b.limit() + "]."); + } + } + + /** + * Handles the player registry response packet. + * + * @param buffer The buffer. + */ + private static void handleRegistryResponse(IoBuffer buffer) { + String username = buffer.getString(); + int opcode = buffer.get() & 0xFF; + LoginParser parser = WorldCommunicator.finishLoginAttempt(username); + if (parser != null) { + PlayerDetails details = parser.getDetails(); + Response response = Response.get(opcode); + Player player = null; + switch (response) { + case ALREADY_ONLINE: + player = Repository.getPlayerByName(username); + if (player == null || player.getSession().isActive() || !player.getSession().getAddress().equals(details.getSession().getAddress())) { + details.getSession().write(response, true); + break; + } + player.getPacketDispatch().sendLogout(); + case SUCCESSFUL: + if (!details.getSession().isActive()) { + sendPlayerRemoval(username); + break; + } + if (player == null) { + player = new Player(details); + } else { + player.updateDetails(details); + } + parser.initialize(player, response == Response.ALREADY_ONLINE); + break; + + case MOVING_WORLD: + details.getSession().setServerKey(buffer.get()); + default: + details.getSession().write(response, true); + break; + } + } + } + + /** + * Sends global message to all player nodes. + * + * @param message The message. + */ + public static void sendWorldMessage(String message) { + IoBuffer buffer = new IoBuffer(12, PacketHeader.BYTE); + buffer.putString(message); + WorldCommunicator.getSession().write(buffer); + } + + /** + * Handles sending a message to a player. + * + * @param buffer The buffer to read from. + */ + private static void handlePlayerMessage(IoBuffer buffer) { + String name = buffer.getString(); + String message = buffer.getString(); + Player player = Repository.getPlayerByName(name); + if (player != null && player.isActive()) { + player.getPacketDispatch().sendMessage(message); + } + } + + /** + * Handles the contact information packet. + * + * @param buffer The buffer to read from. + */ + private static void handleContactInformation(IoBuffer buffer) { + String username = buffer.getString(); + Player player = Repository.getPlayerByName(username); + if (player == null || !player.isActive()) { + return; + } + PacketRepository.send(ContactPackets.class, new ContactContext(player, ContactContext.UPDATE_STATE_TYPE)); + player.getCommunication().getContacts().clear(); + int length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + String name = buffer.getString(); + Contact contact = new Contact(name); + contact.setRank(ClanRank.values()[buffer.get() & 0xFF]); + contact.setWorldId(buffer.get() & 0xFF); + player.getCommunication().getContacts().put(name, contact); + PacketRepository.send(ContactPackets.class, new ContactContext(player, name, contact.getWorldId())); + } + player.getCommunication().getBlocked().clear(); + length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + player.getCommunication().getBlocked().add(buffer.getString()); + } + PacketRepository.send(ContactPackets.class, new ContactContext(player, ContactContext.IGNORE_LIST_TYPE)); + if (buffer.get() == 1) { + String name = buffer.getString(); + sendJoinClan(player, name); + } + } + + /** + * Handles the contact update packet. + */ + private static void handleContactUpdate(IoBuffer buffer) { + String username = buffer.getString(); + String contactName = buffer.getString(); + boolean block = buffer.get() == 1; + int type = buffer.get(); + Player player = Repository.getPlayerByName(username); + if (player == null || !player.isActive()) { + return; + } + switch (type) { + case 0: + if (block) { + player.getCommunication().getBlocked().add(contactName); + PacketRepository.send(ContactPackets.class, new ContactContext(player, ContactContext.IGNORE_LIST_TYPE)); + break; + } + int worldId = buffer.get() & 0xFF; + Contact contact = player.getCommunication().getContacts().get(contactName); + if (contact == null) { + player.getCommunication().getContacts().put(contactName, contact = new Contact(contactName)); + } + contact.setWorldId(worldId); + PacketRepository.send(ContactPackets.class, new ContactContext(player, contactName, worldId)); + break; + case 1: + if (block) { + player.getCommunication().getBlocked().remove(contactName); + PacketRepository.send(ContactPackets.class, new ContactContext(player, ContactContext.IGNORE_LIST_TYPE)); + break; + } + player.getCommunication().getContacts().remove(contactName); + break; + default: + ClanRank rank = ClanRank.values()[type - 2]; + contact = player.getCommunication().getContacts().get(contactName); + if (contact == null) { + // SystemLogger.logErr("Invalid contact specified [name=" + + // contact + "]!"); + break; + } + contact.setRank(rank); + ClanRepository clan = ClanRepository.get(username); + if (clan != null) { + clan.rank(contactName, rank); + } + PacketRepository.send(ContactPackets.class, new ContactContext(player, contactName, contact.getWorldId())); + break; + } + } + + /** + * Handles the message packet. + * + * @param buffer The buffer. + */ + private static void handleMessage(IoBuffer buffer) { + String username = buffer.getString(); + String sender = buffer.getString(); + int type = buffer.get() & 0xFF; + int icon = buffer.get() & 0xFF; + String message = buffer.getString(); + Player player = Repository.getPlayerByName(username); + if (player == null || !player.isActive()) { + return; + } + int opcode = MessageContext.SEND_MESSAGE; + switch (type) { + case 1: + opcode = MessageContext.RECIEVE_MESSAGE; + break; + case 2: + opcode = MessageContext.CLAN_MESSAGE; + break; + } + PacketRepository.send(CommunicationMessage.class, new MessageContext(player, sender, icon, opcode, message)); + } + + /** + * Handles the clan information packet. + * + * @param buffer The buffer. + */ + private static void handleClanInformation(IoBuffer buffer) { + String owner = buffer.getString(); + ClanRepository clan = ClanRepository.getClans().get(owner); + if (clan == null) { + ClanRepository.getClans().put(owner, clan = new ClanRepository(owner)); + } else { + clan.getRanks().clear(); + clan.getPlayers().clear(); + } + clan.setName(buffer.getString()); + int length = buffer.get() & 0xFF; + for (int i = 0; i < length; i++) { + String name = buffer.getString(); + int worldId = buffer.get() & 0xFF; + clan.getRanks().put(name, ClanRank.values()[buffer.get() & 0xFF]); + ClanEntry entry = new ClanEntry(name, worldId); + if (worldId == GameWorld.getSettings().getWorldId()) { + Player player = Repository.getPlayerByName(name); + entry.setPlayer(player); + if (player != null) { + player.getCommunication().setClan(clan); + } + } + clan.getPlayers().add(entry); + } + clan.setJoinRequirement(ClanRank.values()[buffer.get() & 0xFF]); + clan.setKickRequirement(ClanRank.values()[buffer.get() & 0xFF]); + clan.setMessageRequirement(ClanRank.values()[buffer.get() & 0xFF]); + clan.setLootRequirement(ClanRank.values()[buffer.get() & 0xFF]); + clan.update(); + } + + /** + * Handles the clan information packet. + * + * @param buffer The buffer. + */ + private static void handleLeaveClan(IoBuffer buffer) { + String name = buffer.getString(); + Player player = Repository.getPlayerByName(name); + if (player == null || !player.isActive()) { + return; + } + if (player.getCommunication().getClan() == null) { + return; + } + PacketRepository.send(UpdateClanChat.class, new ClanContext(player, null, true)); + player.getCommunication().setClan(null); + } + + /** + * Handles a contact notification packet. + * + * @param buffer The buffer. + */ + private static void handleContactNotification(IoBuffer buffer) { + String name = buffer.getString(); + int worldId = buffer.get() & 0xFF; + int size = buffer.get() & 0xFF; + for (int i = 0; i < size; i++) { + String username = buffer.getString(); + Player player = Repository.getPlayerByName(username); + if (player == null) { + continue; + } + Contact c = player.getCommunication().getContacts().get(name); + if (c == null) { + continue; + } + c.setWorldId(worldId); + PacketRepository.send(ContactPackets.class, new ContactContext(player, name, worldId)); + } + } + + /** + * Handles a player logout notification packet. + * + * @param buffer The buffer. + */ + private static void handlePlayerLogout(IoBuffer buffer) { + String name = buffer.getString(); + for (Player p : Repository.getPlayers()) { + if (CommunicationInfo.hasContact(p, name)) { + PacketRepository.send(ContactPackets.class, new ContactContext(p, name, 0)); + } + } + } + + /** + * Handles the update packet. + * + * @param buffer The buffer. + */ + private static void handleUpdate(IoBuffer buffer) { + int ticks = buffer.getInt(); + if (ticks < 0) { + SystemManager.getUpdater().cancel(); + } else { + SystemManager.getUpdater().setCountdown(ticks); + SystemManager.flag(SystemState.UPDATING); + } + } + + /** + * Handles the punishment update packet. + * + * @param buffer The buffer. + */ + private static void handlePunishmentUpdate(IoBuffer buffer) { + String key = buffer.getString(); + int type = buffer.get(); + long duration = buffer.getLong(); + switch (type) { + case 0: + Player player = Repository.getPlayerByName(key); + if (player != null && player.isActive()) { + player.getPacketDispatch().sendMessages((duration > 0L ? new String[]{"You have been muted.", "To prevent further mutes please read the rules."} : new String[]{"You have been unmuted."})); + } + player.getDetails().setMuteTime(duration); + break; + case 1: + player = Repository.getPlayerByName(key); + if (player != null && player.isActive() && duration > System.currentTimeMillis()) { + player.getSession().disconnect(); + } + break; + case 2: + for (Player p : Repository.getPlayers()) { + if (p.getDetails().getIpAddress().equals(key)) { + p.getSession().disconnect(); + } + } + break; + case 3: + for (Player p : Repository.getPlayers()) { + if (p == null || key == null || p.getDetails() == null) { + return; + } + if (p.getDetails().getMacAddress().equals(key)) { + p.getSession().disconnect(); + } + } + break; + case 4: + for (Player p : Repository.getPlayers()) { + if (p == null || key == null || p.getDetails() == null) { + return; + } + if (p.getDetails().getSerial().equals(key)) { + p.getSession().disconnect(); + } + } + break; + case 6: + player = Repository.getPlayerByName(key); + if (player != null) { + player.getPacketDispatch().sendLogout(); + player.clear(true); + player.getSession().disconnect(); + } + break; + } + } + + + /** + * Gets the icon to send. + * + * @param d the details. + * @return the icon. + */ + private static int getIcon(PlayerDetails d) { + int icon = 0; + if (d.getRights() != Rights.REGULAR_PLAYER) { + icon = d.getRights().toInteger(); + } + return icon; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/amsc/ManagementServerState.java b/Server/src/main/java/Server/core/net/amsc/ManagementServerState.java new file mode 100644 index 000000000..81db14310 --- /dev/null +++ b/Server/src/main/java/Server/core/net/amsc/ManagementServerState.java @@ -0,0 +1,59 @@ +package core.net.amsc; + +import core.game.node.entity.player.Player; +import core.game.world.repository.Repository; +import core.net.packet.PacketRepository; +import core.net.packet.context.ContactContext; +import core.net.packet.out.ContactPackets; + +/** + * The management server state. + * @author Emperor + */ +public enum ManagementServerState { + + /** + * If the management server is not available. + */ + NOT_AVAILABLE(2), + + /** + * If we're still connecting to the Management server. + */ + CONNECTING(1), + + /** + * If we're connected to the management server. + */ + AVAILABLE(2); + + /** + * The value of this state. + */ + private final int value; + + /** + * Constructs a new {@code ManagementServerState} {@code Object} + * @param value The value. + */ + private ManagementServerState(int value) { + this.value = value; + } + + /** + * Called when the state gets set. + */ + public void set() { + for (Player player : Repository.getPlayers()) { + PacketRepository.send(ContactPackets.class, new ContactContext(player, ContactContext.UPDATE_STATE_TYPE)); + } + } + + /** + * Gets the state value. + * @return The value. + */ + public int value() { + return value; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/amsc/WorldCommunicator.java b/Server/src/main/java/Server/core/net/amsc/WorldCommunicator.java new file mode 100644 index 000000000..86bc6b7ab --- /dev/null +++ b/Server/src/main/java/Server/core/net/amsc/WorldCommunicator.java @@ -0,0 +1,236 @@ +package core.net.amsc; + +import core.game.node.entity.player.info.Rights; +import core.game.node.entity.player.info.login.LoginParser; +import core.game.node.entity.player.info.login.Response; +import core.game.system.SystemLogger; +import core.game.system.task.TaskExecutor; +import core.game.world.GameWorld; +import core.net.EventProducer; +import core.net.IoSession; +import core.net.NioReactor; +import core.net.producer.MSHSEventProducer; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Handles world communication. + * @author Emperor + */ +public final class WorldCommunicator { + + /** + * The handshake events producer. + */ + private static final EventProducer HANDSHAKE_PRODUCER = new MSHSEventProducer(); + + /** + * The current state. + */ + private static ManagementServerState state = ManagementServerState.CONNECTING; + + /** + * The I/O session. + */ + private static IoSession session; + + /** + * The world information. + */ + private static final WorldStatistics[] WORLDS = new WorldStatistics[10]; + + /** + * The current login attempts. + */ + private static final Map loginAttempts = new ConcurrentHashMap<>(); + + /** + * The NIO reactor. + */ + private static NioReactor reactor; + + /** + * Registers a new world. + * @param session The session. + */ + public static void register(IoSession session) { + WorldCommunicator.session = session; + session.setProducer(HANDSHAKE_PRODUCER); + session.write(true); + WORLDS[GameWorld.getSettings().getWorldId() - 1] = new WorldStatistics(GameWorld.getSettings().getWorldId()); + session.setObject(WORLDS[GameWorld.getSettings().getWorldId() - 1]); + } + + /** + * Registers a login attempt. + * @param parser The login attempt. + */ + public static void register(final LoginParser parser) { + LoginParser p = loginAttempts.get(parser.getDetails().getUsername()); + if (p != null && GameWorld.getTicks() - p.getTimeStamp() < 50 && p.getDetails().getRights() == Rights.REGULAR_PLAYER) { + parser.getDetails().getSession().write(Response.ALREADY_ONLINE, true); + return; + } + loginAttempts.put(parser.getDetails().getUsername(), parser); + TaskExecutor.executeSQL(new Runnable() { + @Override + public void run() { + if (!parser.getDetails().parse()) { + parser.getDetails().getSession().write(Response.INVALID_LOGIN_SERVER, true); + return; + } + MSPacketRepository.sendPlayerRegistry(parser); + } + }); + } + + /** + * Attempts to connect to the management server. + */ + public static void connect() { + try { + SystemLogger.logInfo("Attempting to connect to management server..."); + setState(ManagementServerState.CONNECTING); + /*if (isLocallyHosted()) { + SystemLogger.log("Management server is hosted on local machine!"); + reactor = NioReactor.connect(GameWorld.getSettings().getMsAddress(), 5555); + } else {*/ + reactor = NioReactor.connect(GameWorld.getSettings().getMsAddress(), 5555); + //} + reactor.start(); + } catch (Throwable e) { + SystemLogger.logErr("Unable to connect to management server"); + e.printStackTrace(); + terminate(); + } + } + + /** + * Checks if the Management server is locally hosted. + * @return {@code True} if so. + * @throws IOException When an I/O exception occurs. + */ + private static boolean isLocallyHosted() throws IOException { + InetAddress address = InetAddress.getByName(GameWorld.getSettings().getMsAddress()); + if (address.isAnyLocalAddress() || address.isLoopbackAddress()) { + return true; + } + return NetworkInterface.getByInetAddress(address) != null; + } + + /** + * Terminates the world communicator. + */ + public static void terminate() { + setState(ManagementServerState.NOT_AVAILABLE); + if (reactor != null) { + reactor.terminate(); + reactor = null; + } + } + + /** + * Gets and removes the login attempt for the given username. + * @param username The username. + * @return The login attempt. + */ + public static LoginParser finishLoginAttempt(String username) { + return loginAttempts.remove(username); + } + + /** + * Gets the local world. + * @return The world statistics of this world server. + */ + public static WorldStatistics getLocalWorld() { + return WORLDS[GameWorld.getSettings().getWorldId() - 1]; + } + + /** + * Gets the id of the world the player is connected to. + * @param playerName The player's name. + * @return The world id, or -1 if the player wasn't connected. + */ + public static int getWorld(String playerName) { + for (int i = 0; i < WORLDS.length; i++) { + if (WORLDS[i].getPlayers().contains(playerName)) { + return i; + } + } + return -1; + } + + /** + * Gets the world statistics for the given index. + * @param id The world id. + * @return The world statistics. + */ + public static WorldStatistics getWorld(int id) { + return WORLDS[id - 1]; + } + + /** + * Gets the session. + * @return the session + */ + public static IoSession getSession() { + return session; + } + + /** + * Checks if this world is connected to the Management server. + * @return {@code True} if so. + */ + public static boolean isEnabled() { + return state == ManagementServerState.AVAILABLE; + } + + /** + * Gets the login attempts mapping. + * @return The login attempts mapping. + */ + public static Map getLoginAttempts() { + return loginAttempts; + } + + /** + * Gets the state. + * @return the state + */ + public static ManagementServerState getState() { + return state; + } + + /** + * Sets the state. + * @param state the state to set. + */ + public static void setState(ManagementServerState state) { + if (WorldCommunicator.state != state) { + WorldCommunicator.state = state; + state.set(); + SystemLogger.logInfo("Management server status: " + state + "."); + } + } + + /** + * Gets the reactor. + * @return the reactor + */ + public static NioReactor getReactor() { + return reactor; + } + + /** + * Sets the reactor. + * @param reactor the reactor to set. + */ + public static void setReactor(NioReactor reactor) { + WorldCommunicator.reactor = reactor; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/amsc/WorldStatistics.java b/Server/src/main/java/Server/core/net/amsc/WorldStatistics.java new file mode 100644 index 000000000..7a6d6b90e --- /dev/null +++ b/Server/src/main/java/Server/core/net/amsc/WorldStatistics.java @@ -0,0 +1,45 @@ +package core.net.amsc; + +import java.util.ArrayList; +import java.util.List; + +/** + * Holds information of a certain game world. + * @author Emperor + */ +public final class WorldStatistics { + + /** + * The world id. + */ + private final int id; + + /** + * The list of players connected to this world. + */ + private final List players = new ArrayList<>(); + + /** + * Constructs a new {@code WorldStatistics} {@Code Object} + * @param id The world id. + */ + public WorldStatistics(int id) { + this.id = id; + } + + /** + * Gets the players. + * @return the players + */ + public List getPlayers() { + return players; + } + + /** + * Gets the id. + * @return the id + */ + public int getId() { + return id; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/GameReadEvent.java b/Server/src/main/java/Server/core/net/event/GameReadEvent.java new file mode 100644 index 000000000..5c4a8e464 --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/GameReadEvent.java @@ -0,0 +1,145 @@ +package core.net.event; + +import core.game.system.SystemLogger; +import core.game.world.GameWorld; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.net.packet.PacketRepository; + +import java.nio.ByteBuffer; + +/** + * Handles game packet reading. + * @author Emperor + */ +public final class GameReadEvent extends IoReadEvent { + + /** + * The incoming packet sizes, sorted by opcode. + */ + public static final int[] PACKET_SIZES = { + -3, -3, -3, 2, 2, -3, 8, -3, -3, 6, // 0-9 + 4, -3, -3, -3, -3, -3, -3, 0, -3, -3, // 10-19 + 4, 4, 1, 4, -3, -3, -3, 16, -3, -3, // 20-29 + 2, -3, -3, 6, 8, -3, -3, -3, -3, -1, // 30-39 + -3, -3, -3, -3, -1, -3, -3, -3, 6, -3, // 40-49 + -3, -3, -3, 6, -3, 8, -3, 8, -3, -3, // 50-59 + -3, -3, -3, -3, 6, -1, 6, -3, 2, -3, // 60-69 + -3, 2, 2, 12, -3, 6, -3, -1, 2, 12, // 70-79 + -3, 8, 12, -3, 6, 8, -3, -3, -3, -3, // 80-89 + -3, -3, 2, 0, 2, -3, -3, -3, 4, 10, // 90-99 + -3, 14, -3, -3, 8, -3, 2, -3, -3, 6, // 100-109 + 0, 2, -3, -3, 2, 10, -3, -1, -3, -3, // 110-119 + 8, -3, -3, -1, 6, -3, -3, -3, -3, -3, // 120-129 + -3, 10, 6, 2, 14, 8, -3, 4, -3, -3, // 130-139 + -3, -3, -3, -3, -3, -3, -3, -3, 2, -3, // 140-149 + -3, -3, -3, 8, 8, 6, 8, 3, -3, -3, // 150-159 + -3, 8, 8, -3, -3, -3, 6, -1, 6, -3, // 160-169 + 6, -3, -3, -3, -3, 2, -3, 2, -1, 4, // 170-179 + 2, -3, -3, -3, 0, -3, -3, -3, 9, -3, // 180-189 + -3, -3, -3, -3, 6, 8, 6, -3, -3, 6, // 190-199 + -3, -1, -3, -3, -3, -3, 8, -3, -3, -3, // 200-209 + -3, -3, -3, 8, -3, -1, -3, -3, 2, -3, // 210-219 + -3, -3, -3, -3, -3, -3, -3, -3, 6, -3, // 220-229 + -3, 9, -3, 12, 6, -3, -3, -1, -3, 8, // 230-239 + -3, -3, -3, 6, 8, 0, -3, 6, 10, -3, // 240-249 + -3, -3, -3, 14, 6, -3 // 250-255 + }; + + /** + * Constructs a new {@code GameReadEvent}. + * @param session The session. + * @param buffer The buffer to read from. + */ + public GameReadEvent(IoSession session, ByteBuffer buffer) { + super(session, buffer); + } + + @Override + public void read(IoSession session, ByteBuffer buffer) { + int last = -1; + while (buffer.hasRemaining()) { + int opcode = buffer.get() & 0xFF; + if (session == null || session.getPlayer() == null) { + continue; + } + if (opcode >= PACKET_SIZES.length) { + break; + } + int header = PACKET_SIZES[opcode]; + int size = header; + if (header < 0) { + size = getPacketSize(buffer, opcode, header, last); + } + if (size == -1) { + break; + } + if (buffer.remaining() < size) { + switch (header) { + case -2: + queueBuffer(opcode, size >> 8, size); + break; + case -1: + queueBuffer(opcode, size); + break; + default: + queueBuffer(opcode); + break; + } + break; + } + byte[] data = new byte[size]; + buffer.get(data); + IoBuffer buf = new IoBuffer(opcode, null, ByteBuffer.wrap(data)); + //SystemLogger.log("Packet opcode " + opcode + "received."); + IncomingPacket packet = PacketRepository.getIncoming(opcode); + session.setLastPing(System.currentTimeMillis()); + if (packet == null) { + if (GameWorld.getSettings().isDevMode()) { + SystemLogger.logErr("Unhandled packet [opcode=" + opcode + ", previous=" + last + ", size=" + size + ", header=" + header + "]"); + } + continue; + } + last = opcode; + try { + packet.decode(session.getPlayer(), opcode, buf); + //System.out.println("Handled packed " + opcode + "!"); + } catch (Throwable t) { + t.printStackTrace(); + } + } + } + + /** + * Gets the packet size for the given opcode. + * @param buffer The buffer. + * @param opcode The opcode. + * @param header The packet header. + * @param last The last opcode. + * @return The packet size. + */ + private int getPacketSize(ByteBuffer buffer, int opcode, int header, int last) { + if (header == -1) { + if (buffer.remaining() < 1) { + queueBuffer(opcode); + return -1; + } + return buffer.get() & 0xFF; + } + if (header == -2) { + if (buffer.remaining() < 2) { + queueBuffer(opcode); + return -1; + } + return buffer.getShort() & 0xFFFF; + } + if(header == -3){ + System.out.println(buffer.remaining()); + } + SystemLogger.logErr("Invalid packet [opcode=" + opcode + ", last=" + last + ", queued=" + usedQueuedBuffer + "], header=" + header+"!"); + return -1; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/GameWriteEvent.java b/Server/src/main/java/Server/core/net/event/GameWriteEvent.java new file mode 100644 index 000000000..568b97480 --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/GameWriteEvent.java @@ -0,0 +1,54 @@ +package core.net.event; + +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.packet.IoBuffer; + +import java.nio.ByteBuffer; + +/** + * Handles game packet writing events. + * @author Emperor + */ +public final class GameWriteEvent extends IoWriteEvent { + + /** + * Constructs a new {@code GameWriteEvent}. + * @param session The session. + * @param context The context. + */ + public GameWriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + if (context instanceof ByteBuffer) { + session.queue((ByteBuffer) context); + return; + } + IoBuffer buffer = (IoBuffer) context; + ByteBuffer buf = (ByteBuffer) buffer.toByteBuffer().flip(); + if (buf == null) { + throw new RuntimeException("Critical networking error: The byte buffer requested was null."); + } + if (buffer.opcode() != -1) { + int packetLength = buf.remaining() + 4; + ByteBuffer response = ByteBuffer.allocate(packetLength); + response.put((byte) buffer.opcode()); + switch (buffer.getHeader()) { + case BYTE: + response.put((byte) buf.remaining()); + break; + case SHORT: + response.putShort((short) buf.remaining()); + break; + default: + break; + } + buf = (ByteBuffer) response.put(buf).flip(); + } + session.queue(buf); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/HSReadEvent.java b/Server/src/main/java/Server/core/net/event/HSReadEvent.java new file mode 100644 index 000000000..363ca5aa9 --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/HSReadEvent.java @@ -0,0 +1,72 @@ +package core.net.event; + +import core.net.Constants; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.lobby.WorldList; +import core.net.registry.AccountRegister; +import core.tools.RandomFunction; + +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +/** + * Handles handshake read events. + * @author Emperor + */ +public final class HSReadEvent extends IoReadEvent { + + // debug + static Map count = new HashMap<>(); + + /** + * Constructs a new {@code HSReadEvent}. + * @param session The session. + * @param buffer The buffer. + */ + public HSReadEvent(IoSession session, ByteBuffer buffer) { + super(session, buffer); + } + + @Override + public void read(IoSession session, ByteBuffer buffer) { + Integer amount = count.get(session.getAddress()); + if (amount == null) { + amount = 0; + } + count.put(session.getAddress(), amount + 1); + int opcode = buffer.get() & 0xFF; + switch (opcode) { + case 14: + session.setNameHash(buffer.get() & 0xFF); + session.setServerKey(RandomFunction.RANDOM.nextLong()); + session.write(true); + break; + case 15: + int revision = buffer.getInt(); + //int sub_revision = buffer.getInt(); + buffer.flip(); + System.out.println(buffer.limit()); + if (revision != 530 ){//|| sub_revision != Constants.CLIENT_BUILD) { + session.disconnect(); + break; + } + session.write(false); + break; + case 147: + case 186: + case 36: + AccountRegister.read(session, opcode, buffer); + break; + case 255: // World list + int updateStamp = buffer.getInt(); + WorldList.sendUpdate(session, updateStamp); + break; + default: + session.disconnect(); + break; + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/HSWriteEvent.java b/Server/src/main/java/Server/core/net/event/HSWriteEvent.java new file mode 100644 index 000000000..fec876579 --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/HSWriteEvent.java @@ -0,0 +1,49 @@ +package core.net.event; + +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.producer.JS5EventProducer; +import core.net.producer.LoginEventProducer; + +import java.nio.ByteBuffer; + +/** + * Handles Handshake write events. + * @author Emperor + */ +public final class HSWriteEvent extends IoWriteEvent { + + /** + * The JS-5 event producer. + */ + private static final JS5EventProducer JS5_PRODUCER = new JS5EventProducer(); + + /** + * The login event producer. + */ + private static final LoginEventProducer LOGIN_PRODUCER = new LoginEventProducer(); + + /** + * Constructs a new {@code HSWriteEvent} {@code Object}. + * @param session The session. + * @param context The context. + */ + public HSWriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + ByteBuffer buffer = ByteBuffer.allocate(9); + buffer.put((byte) 0); + if ((Boolean) context) { + buffer.putLong(session.getServerKey()); + session.setProducer(LOGIN_PRODUCER); + } else { + session.setProducer(JS5_PRODUCER); + } + buffer.flip(); + session.queue(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/JS5ReadEvent.java b/Server/src/main/java/Server/core/net/event/JS5ReadEvent.java new file mode 100644 index 000000000..893e9d374 --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/JS5ReadEvent.java @@ -0,0 +1,81 @@ +package core.net.event; + +import core.cache.misc.buffer.ByteBufferUtils; +import core.net.IoReadEvent; +import core.net.IoSession; + +import java.nio.ByteBuffer; + +/** + * Handles JS-5 reading events. + * @author Emperor + */ +public final class JS5ReadEvent extends IoReadEvent { + + /** + * Constructs a new {@code JS5ReadEvent}. + * @param session The session. + * @param buffer The buffer. + */ + public JS5ReadEvent(IoSession session, ByteBuffer buffer) { + super(session, buffer); + } + + @Override + public void read(IoSession session, ByteBuffer buffer) { + while (buffer.hasRemaining()) { + int opcode = buffer.get() & 0xFF; + //System.out.println("JS5 initiated! Opcode: " + opcode); + if (buffer.remaining() < 3) { + queueBuffer(opcode); + return; + } + switch (opcode) { + case 0: + case 1: + int request = ByteBufferUtils.getTriByte(buffer); + //System.out.println("Requested file " + request); + int container = request >> 16 & 0xFF; + //System.out.println("In container " + container); + int archive = request & 0xFFFF; + //System.out.println("In archive " + archive); + session.getJs5Queue().queue(container, archive, opcode == 1); + break; + case 2: // music + case 3: // Music + buffer.get(); + buffer.getShort(); + break; + case 4: + session.setJs5Encryption(buffer.get()); + if (buffer.getShort() != 0) { + session.disconnect(); + return; + } + break; + case 5: + case 9: + if (buffer.remaining() < 4) { + queueBuffer(opcode); + return; + } + buffer.getInt(); + break; + case 6: + ByteBufferUtils.getTriByte(buffer); // Value should be 3 + // buffer.getShort(); // Value should be 0 + break; + case 7: + buffer.get(); + buffer.getShort(); + session.disconnect(); + return; + default: + System.out.println("Unhandled JS5 opcode " + opcode + "!"); + buffer.get(); + buffer.getShort(); + break; + } + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/JS5WriteEvent.java b/Server/src/main/java/Server/core/net/event/JS5WriteEvent.java new file mode 100644 index 000000000..bd0bd223f --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/JS5WriteEvent.java @@ -0,0 +1,71 @@ +package core.net.event; + +import core.cache.Cache; +import core.net.IoSession; +import core.net.IoWriteEvent; + +import java.nio.ByteBuffer; + +/** + * Handles JS-5 writing events. + * @author Emperor + */ +public final class JS5WriteEvent extends IoWriteEvent { + + /** + * The cached reference data. + */ + private static byte[] cachedReference; + + /** + * Constructs a new {@code JS5WriteEvent}. + * @param session The session. + * @param context The event context. + */ + public JS5WriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + int[] request = (int[]) context; + int container = request[0]; + int archive = request[1]; + boolean priority = request[2] == 1; + if (archive == 255 && container == 255) { + session.queue(getReferenceData()); + return; + } + ByteBuffer response = Cache.getArchiveData(container, archive, priority, session.getJs5Encryption()); + if (response != null) { + session.queue(response); + } + } + + /** + * Gets the reference data. + * @return The reference data. + */ + private static ByteBuffer getReferenceData() { + if (cachedReference == null) { + cachedReference = Cache.generateReferenceData(); + } + ByteBuffer buffer = ByteBuffer.allocate(cachedReference.length << 2); + buffer.put((byte) 255); + buffer.putShort((short) 255); + buffer.put((byte) 0); + buffer.putInt(cachedReference.length); + int offset = 10; + for (int index = 0; index < cachedReference.length; index++) { + if (offset == 512) { + buffer.put((byte) 255); + offset = 1; + } + buffer.put(cachedReference[index]); + offset++; + } + buffer.flip(); + return buffer; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/LoginReadEvent.kt b/Server/src/main/java/Server/core/net/event/LoginReadEvent.kt new file mode 100644 index 000000000..50d79bfae --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/LoginReadEvent.kt @@ -0,0 +1,173 @@ +package core.net.event + +import core.ServerConstants +import core.cache.Cache +import core.cache.crypto.ISAACCipher +import core.cache.crypto.ISAACPair +import core.cache.misc.buffer.ByteBufferUtils +import core.game.node.entity.player.info.ClientInfo +import core.game.node.entity.player.info.PlayerDetails +import core.game.node.entity.player.info.UIDInfo +import core.game.node.entity.player.info.login.LoginParser +import core.game.node.entity.player.info.login.LoginType +import core.game.node.entity.player.info.login.Response +import core.game.node.entity.player.info.portal.PlayerSQLManager +import core.game.system.SystemLogger +import core.game.system.task.TaskExecutor +import core.game.world.repository.Repository +import core.net.Constants +import core.net.IoReadEvent +import core.net.IoSession +import core.net.amsc.WorldCommunicator +import core.tools.StringUtils +import java.lang.Runnable +import java.math.BigInteger +import java.nio.ByteBuffer + +/** + * Handles login reading events. + * @author Emperor + */ +class LoginReadEvent +/** + * Constructs a new `LoginReadEvent`. + * @param session The session. + * @param buffer The buffer with data to read from. + */ +(session: IoSession?, buffer: ByteBuffer?) : IoReadEvent(session, buffer) { + override fun read(session: IoSession, buffer: ByteBuffer) { + val opcode: Int = buffer.get().toInt() + if (buffer.short.toInt() != buffer.remaining()) { + session.write(Response.BAD_SESSION_ID) + return + } + val build = buffer.int + if (build != Constants.REVISION) { // || buffer.getInt() != Constants.CLIENT_BUILD) { + session.write(Response.UPDATED) + return + } + when (opcode) { + 12 -> println("User details event detected") + 16, 18 -> decodeWorld(opcode, session, buffer) + else -> { + SystemLogger.logErr("[Login] Unhandled login type [opcode=$opcode]!") + session.disconnect() + } + } + } + + companion object { + + /** + * Decodes a world login request. + * @param session The session. + * @param buffer The buffer to read from. + */ + private fun decodeWorld(opcode: Int, session: IoSession, buffer: ByteBuffer) { + var buffer = buffer + val d = buffer.get() // Memory? + val e = buffer.get() // no advertisement = 1 + val f = buffer.get() // 1 + val windowMode = buffer.get().toInt() // Screen size mode + val screenWidth = buffer.short.toInt() // Screen size Width + val screenHeight = buffer.short.toInt() // Screen size Height + val displayMode = buffer.get().toInt() // Display mode + val data = ByteArray(24) // random.dat data. + buffer[data] + ByteBufferUtils.getString(buffer) + buffer.int // Affiliate id + buffer.int // Hash containing a bunch of settings + val curpackets = buffer.short //Current interface packet counter. + for (i in Cache.getIndexes().indices) { + val crc = if (Cache.getIndexes()[i] == null) 0 else Cache.getIndexes()[i].information.informationContainer.crc + if (crc != buffer.int && crc != 0) { + /*session.write(Response.UPDATED); + return;*/ + } + } + buffer = getRSABlock(buffer) + buffer.rewind() + if(buffer.get().toInt() != 10){ + session.write(Response.COULD_NOT_LOGIN) + return + } + val isaacSeed = getISAACSeed(buffer) + val inCipher = ISAACCipher(isaacSeed) + for(i in 0..curpackets){ + inCipher.nextValue + } + for (i in 0..3) { + isaacSeed[i] += 50 + } + val outCipher = ISAACCipher(isaacSeed) + session.isaacPair = ISAACPair(inCipher, outCipher) + session.clientInfo = ClientInfo(displayMode, windowMode, screenWidth, screenHeight) + val b = buffer + TaskExecutor.executeSQL(Runnable { + try { + val username = StringUtils.longToString(b.long) + val password = ByteBufferUtils.getString(b) + val response = PlayerSQLManager.getCredentialResponse(username, password) + if (response != Response.SUCCESSFUL) { + session.write(response, true) + return@Runnable + } + login(PlayerDetails(username, password), session, b, opcode) + } catch (e: Exception) { + e.printStackTrace() + session.write(Response.COULD_NOT_LOGIN) + } + }) + } + + /** + * Handles the login procedure after we check an acc is registered & certified. + * @param username the username. + * @param password the password. + * @param session the session. + * @param buffer the byte buffer. + * @param opcode the opcode. + */ + @JvmStatic + private fun login(details: PlayerDetails, session: IoSession, buffer: ByteBuffer, opcode: Int) { + if(!Repository.LOGGED_IN_PLAYERS.contains(details.username)) + Repository.LOGGED_IN_PLAYERS.add(details.username) + val parser = LoginParser(details, LoginType.fromType(opcode)) + details.session = session + details.info.translate(UIDInfo(details.ipAddress, ByteBufferUtils.getString(buffer), ByteBufferUtils.getString(buffer), ByteBufferUtils.getString(buffer))) + if (WorldCommunicator.isEnabled()) { + WorldCommunicator.register(parser) + } else { + TaskExecutor.executeSQL(parser) + } + } + + /** + * Gets the ISAAC seed from the buffer. + * @param buffer The buffer to read from. + * @return The ISAAC seed. + */ + @JvmStatic + fun getISAACSeed(buffer: ByteBuffer): IntArray { + val seed = IntArray(4) + for (i in 0..3) { + seed[i] = buffer.int + } + return seed + } + + /** + * Gets the RSA block buffer. + * @param buffer The buffer to get the RSA block from. + * @return The RSA block buffer. + */ + @JvmStatic + fun getRSABlock(buffer: ByteBuffer): ByteBuffer { + val numBytes = 256 + buffer.get() + val encryptedByteArray = ByteArray(numBytes) + buffer.get(encryptedByteArray) + val encryptedBytes = BigInteger(encryptedByteArray) + return ByteBuffer.wrap(encryptedBytes.modPow(ServerConstants.EXPONENT,ServerConstants.MODULUS).toByteArray()) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/LoginWriteEvent.java b/Server/src/main/java/Server/core/net/event/LoginWriteEvent.java new file mode 100644 index 000000000..95b4e61c8 --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/LoginWriteEvent.java @@ -0,0 +1,74 @@ +package core.net.event; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.Response; +import core.net.EventProducer; +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.producer.GameEventProducer; + +import java.nio.ByteBuffer; + +/** + * Handles login writing events. + * @author Emperor + */ +public final class LoginWriteEvent extends IoWriteEvent { + + /** + * The game event producer. + */ + private static final EventProducer GAME_PRODUCER = new GameEventProducer(); + + /** + * Constructs a new {@code LoginWriteEvent}. + * @param session The session. + * @param context The event context. + */ + public LoginWriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + Response response = (Response) context; + ByteBuffer buffer = ByteBuffer.allocate(500); + buffer.put((byte) response.opcode()); + switch (response.opcode()) { + case 2: //successful login + buffer.put(getWorldResponse(session)); + session.setProducer(GAME_PRODUCER); + break; + //Could add a case here to auto-restart the server in case the login server goes offline (case 8) + //Possibly a risk for malicious attacks though + case 21: //Moving world + buffer.put((byte) session.getServerKey()); + break; + } + buffer.flip(); + session.queue(buffer); + } + + /** + * Gets the world response buffer. + * @param session The session. + * @return The buffer. + */ + private static ByteBuffer getWorldResponse(IoSession session) { + ByteBuffer buffer = ByteBuffer.allocate(150); + Player player = session.getPlayer(); + buffer.put((byte) player.getDetails().getRights().ordinal()); + buffer.put((byte) 0); + buffer.put((byte) 0); + buffer.put((byte) 0); + buffer.put((byte) 1); + buffer.put((byte) 0); + buffer.put((byte) 0); + buffer.putShort((short) player.getIndex()); + buffer.put((byte) (1)); // Enable all G.E boxes + buffer.put((byte) 1); + buffer.flip(); + return buffer; + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/MSHSReadEvent.java b/Server/src/main/java/Server/core/net/event/MSHSReadEvent.java new file mode 100644 index 000000000..210cd097c --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/MSHSReadEvent.java @@ -0,0 +1,39 @@ +package core.net.event; + +import core.net.EventProducer; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.producer.RegistryEventProducer; + +import java.nio.ByteBuffer; + +/** + * Handles the management server handshake read events. + * @author Emperor + */ +public final class MSHSReadEvent extends IoReadEvent { + + /** + * The event producer. + */ + private static final EventProducer REGISTRY_PRODUCER = new RegistryEventProducer(); + + /** + * Constructs a new {@code MSHSReadEvent} {@Code Object} + * @param session The session. + * @param buffer The buffer to read. + */ + public MSHSReadEvent(IoSession session, ByteBuffer buffer) { + super(session, buffer); + } + + @Override + public void read(IoSession session, ByteBuffer buffer) { + int opcode = buffer.get() & 0xFF; + if (opcode == 14) { + session.setProducer(REGISTRY_PRODUCER); + session.write(true); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/MSHSWriteEvent.java b/Server/src/main/java/Server/core/net/event/MSHSWriteEvent.java new file mode 100644 index 000000000..6f55dfd71 --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/MSHSWriteEvent.java @@ -0,0 +1,37 @@ +package core.net.event; + +import core.cache.misc.buffer.ByteBufferUtils; +import core.net.IoSession; +import core.net.IoWriteEvent; + +import java.nio.ByteBuffer; + +/** + * Handles the management server handshake write event. + * @author Emperor + */ +public final class MSHSWriteEvent extends IoWriteEvent { + + /** + * The password used to verify + */ + private static final String PASSWORD = "0x14ari0SSbh98989910"; + + /** + * Constructs a new {@code MSHSWriteEvent} {@code Object} + * @param session The session. + * @param context The context. + */ + public MSHSWriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + ByteBuffer buffer = ByteBuffer.allocate(2 + PASSWORD.length()); + buffer.put((byte) 88); + ByteBufferUtils.putString(PASSWORD, buffer); + session.queue((ByteBuffer) buffer.flip()); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/MSReadEvent.java b/Server/src/main/java/Server/core/net/event/MSReadEvent.java new file mode 100644 index 000000000..84a340b3d --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/MSReadEvent.java @@ -0,0 +1,98 @@ +package core.net.event; + +import core.game.system.SystemLogger; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.amsc.MSPacketRepository; + +import java.nio.ByteBuffer; + +/** + * Handles reading Management server packets. + * @author Emperor + */ +public final class MSReadEvent extends IoReadEvent { + + /** + * The packet sizes. + */ + private static final int[] PACKET_SIZE = { -1, -1, -1, -2, -1, -1, -2, -1, -2, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; + + /** + * Constructs a new {@code MSReadEvent} {@code Object} + * @param session The I/O session. + * @param buffer The buffer to read from. + */ + public MSReadEvent(IoSession session, ByteBuffer buffer) { + super(session, buffer); + } + + @Override + public void read(IoSession session, ByteBuffer buffer) { + int last = -1; + while (buffer.hasRemaining()) { + int opcode = buffer.get() & 0xFF; + if (opcode >= PACKET_SIZE.length) { + break; + } + int header = PACKET_SIZE[opcode]; + int size = header; + if (header < 0) { + size = getPacketSize(buffer, opcode, header, last); + } + if (size == -1) { + break; + } + if (buffer.remaining() < size) { + switch (header) { + case -2: + queueBuffer(opcode, size >> 8, size); + break; + case -1: + queueBuffer(opcode, size); + break; + default: + queueBuffer(opcode); + break; + } + break; + } + byte[] data = new byte[size]; + buffer.get(data); + last = opcode; + try { + MSPacketRepository.handleIncoming(opcode, ByteBuffer.wrap(data)); + } catch (Throwable t) { + t.printStackTrace(); + } + } + } + + /** + * Gets the packet size for the given opcode. + * @param buffer The buffer. + * @param opcode The opcode. + * @param header The packet header. + * @param last The last opcode. + * @return The packet size. + */ + private int getPacketSize(ByteBuffer buffer, int opcode, int header, int last) { + if (header == -1) { + if (buffer.remaining() < 1) { + queueBuffer(opcode); + return -1; + } + return buffer.get() & 0xFF; + } + if (header == -2) { + if (buffer.remaining() < 2) { + queueBuffer(opcode); + return -1; + } + return buffer.getShort() & 0xFFFF; + } + SystemLogger.logErr("Invalid packet [opcode=" + opcode + ", last=" + last + ", queued=" + usedQueuedBuffer + "]!"); + return -1; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/MSWriteEvent.java b/Server/src/main/java/Server/core/net/event/MSWriteEvent.java new file mode 100644 index 000000000..1f6dfc6de --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/MSWriteEvent.java @@ -0,0 +1,44 @@ +package core.net.event; + +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.packet.IoBuffer; + +import java.nio.ByteBuffer; + +/** + * Handles management server write events. + * @author Emperor + */ +public final class MSWriteEvent extends IoWriteEvent { + + /** + * Constructs a new {@code MSWriteEvent} {@code Object} + * @param session The I/O session. + * @param context The packet context. + */ + public MSWriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + IoBuffer b = (IoBuffer) context; + int size = b.toByteBuffer().position(); + ByteBuffer buffer = ByteBuffer.allocate(1 + size + b.getHeader().ordinal()); + buffer.put((byte) b.opcode()); + switch (b.getHeader()) { + case NORMAL: + break; + case BYTE: + buffer.put((byte) size); + break; + case SHORT: + buffer.putShort((short) size); + break; + } + buffer.put((ByteBuffer) b.toByteBuffer().flip()); + session.queue((ByteBuffer) buffer.flip()); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/RegistryReadEvent.java b/Server/src/main/java/Server/core/net/event/RegistryReadEvent.java new file mode 100644 index 000000000..42a6f51b1 --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/RegistryReadEvent.java @@ -0,0 +1,60 @@ +package core.net.event; + +import core.game.system.SystemLogger; +import core.game.world.GameWorld; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.amsc.ManagementServerState; +import core.net.amsc.WorldCommunicator; +import core.net.producer.MSEventProducer; + +import java.nio.ByteBuffer; + +/** + * Handles world registry read events. + * @author Emperor + */ +public final class RegistryReadEvent extends IoReadEvent { + + /** + * The event producer. + */ + private static final MSEventProducer PRODUCER = new MSEventProducer(); + + /** + * Constructs a new {@code RegistryReadEvent} {@code Object}. + * @param session The session. + * @param buffer The buffer to read. + */ + public RegistryReadEvent(IoSession session, ByteBuffer buffer) { + super(session, buffer); + } + + @Override + public void read(IoSession session, ByteBuffer buffer) { + int opcode = buffer.get() & 0xFF; + switch (opcode) { + case 0: + WorldCommunicator.setState(ManagementServerState.NOT_AVAILABLE); + SystemLogger.logErr("Failed registering world to AMS - [id=" + GameWorld.getSettings().getWorldId() + ", cause=World id out of bounds]!"); + break; + case 1: + session.setProducer(PRODUCER); + WorldCommunicator.setState(ManagementServerState.AVAILABLE); + SystemLogger.logInfo("Successfully registered world to AMS - [id=" + GameWorld.getSettings().getWorldId() + "]!"); + break; + case 2: + WorldCommunicator.setState(ManagementServerState.NOT_AVAILABLE); + SystemLogger.logErr("Failed registering world to AMS - [id=" + GameWorld.getSettings().getWorldId() + ", cause=World id already in use]!"); + break; + case 3: + WorldCommunicator.setState(ManagementServerState.NOT_AVAILABLE); + SystemLogger.logErr("Failed registering world to AMS - [id=" + GameWorld.getSettings().getWorldId() + ", cause=Exception in AMS]!"); + break; + default: + System.out.println("??" + opcode); + break; + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/event/RegistryWriteEvent.java b/Server/src/main/java/Server/core/net/event/RegistryWriteEvent.java new file mode 100644 index 000000000..6e94e58c0 --- /dev/null +++ b/Server/src/main/java/Server/core/net/event/RegistryWriteEvent.java @@ -0,0 +1,46 @@ +package core.net.event; + +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.world.GameWorld; +import core.net.Constants; +import core.net.IoSession; +import core.net.IoWriteEvent; + +import java.nio.ByteBuffer; + +/** + * Handles game world registry writing events. + * @author Emperor + */ +public final class RegistryWriteEvent extends IoWriteEvent { + + /** + * The string check. + */ + private static final String CHECK = "12x4578f5g45hrdjiofed59898"; + + /** + * Constructs a new {@code RegistryWriteEvent} {@code Object}. + * @param session The I/O session. + * @param context The writing context. + */ + public RegistryWriteEvent(IoSession session, Object context) { + super(session, context); + } + + @Override + public void write(IoSession session, Object context) { + ByteBuffer buffer = ByteBuffer.allocate(128); + buffer.put((byte) GameWorld.getSettings().getWorldId()); + buffer.putInt(Constants.REVISION); + buffer.put((byte) GameWorld.getSettings().getCountryIndex()); + buffer.put((byte) (GameWorld.getSettings().isMembers() ? 1 : 0)); + buffer.put((byte) (GameWorld.getSettings().isPvp() ? 1 : 0)); + buffer.put((byte) (GameWorld.getSettings().isQuickChat() ? 1 : 0)); + buffer.put((byte) (GameWorld.getSettings().isLootshare() ? 1 : 0)); + ByteBufferUtils.putString(GameWorld.getSettings().getActivity(), buffer); + buffer.put(CHECK.getBytes()); + session.queue((ByteBuffer) buffer.flip()); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/lobby/WorldDefinition.java b/Server/src/main/java/Server/core/net/lobby/WorldDefinition.java new file mode 100644 index 000000000..92baf066c --- /dev/null +++ b/Server/src/main/java/Server/core/net/lobby/WorldDefinition.java @@ -0,0 +1,149 @@ +package core.net.lobby; + +import core.game.world.GameWorld; +import core.game.world.repository.Repository; + +/** + * Represents a world's definition. + * @author Dementhium development team. + * + */ +public class WorldDefinition { + + /** + * The activity for this world. + */ + private final String activity; + + /** + * The coutry flag. + */ + private final int country; + + /** + * If the world is members. + */ + private final int flag; + + /** + * The ip-address for this world. + */ + private final String ip; + + /** + * The location. + */ + private final int location; + + /** + * The region. + */ + private final String region; + + /** + * The world's id. + */ + private final int worldId; + + /** + * The amount of players in this world. + */ + private int players; + + /** + * Constructs a new {@code WorldDefinition} {@code Object}. + * @param worldId The world's id. + * @param location The location. + * @param flag If the world is members. + * @param activity The activity for this world. + * @param ip The IP-address. + * @param region The region. + * @param country The country flag. + */ + public WorldDefinition(int worldId, int location, int flag, String activity, String ip, String region, int country) { + this.worldId = worldId; + this.location = location; + this.flag = flag; + this.activity = activity; + this.ip = ip; + this.region = region; + this.country = country; + } + + /** + * @return the activity + */ + public String getActivity() { + return activity; + } + + /** + * @return the country + */ + public int getCountry() { + return country; + } + + /** + * @return the flag + */ + public int getFlag() { + return flag; + } + + /** + * @return the ip + */ + public String getIp() { + return ip; + } + + /** + * @return the location + */ + public int getLocation() { + return location; + } + + /** + * @return the region + */ + public String getRegion() { + return region; + } + + /** + * @return the worldId + */ + public int getWorldId() { + return worldId; + } + + /** + * Gets the player count. + * @return The player count. + */ + public int getPlayerCount() { + if (worldId == GameWorld.getSettings().getWorldId()) { + return Repository.getPlayers().size(); + } + return players; + } + + /** + * Gets the players. + * @return the players + */ + public int getPlayers() { + return players; + } + + /** + * Sets the baplayers. + * @param players the players to set. + */ + public void setPlayers(int players) { + this.players = players; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/lobby/WorldList.java b/Server/src/main/java/Server/core/net/lobby/WorldList.java new file mode 100644 index 000000000..0da990c44 --- /dev/null +++ b/Server/src/main/java/Server/core/net/lobby/WorldList.java @@ -0,0 +1,214 @@ +package core.net.lobby; + +import core.game.world.GameWorld; +import core.net.IoSession; +import core.net.packet.IoBuffer; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; + +/** + * Handles the world list. + * @author Emperor + * + */ +public final class WorldList { + + /** + * The value for Australia. + */ + public static final int COUNTRY_AUSTRALIA = 16; + + /** + * The value for Belgium. + */ + public static final int COUNTRY_BELGIUM = 22; + + /** + * The value for Brazil. + */ + public static final int COUNTRY_BRAZIL = 31; + + /** + * The value for Canada. + */ + public static final int COUNTRY_CANADA = 38; + + /** + * The value for Denmark. + */ + public static final int COUNTRY_DENMARK = 58; + + /** + * The value for Finland. + */ + public static final int COUNTRY_FINLAND = 69; + + /** + * The value for Ireland. + */ + public static final int COUNTRY_IRELAND = 101; + + /** + * The value for Mexico. + */ + public static final int COUNTRY_MEXICO = 152; + + /** + * The value for the Netherlands. + */ + public static final int COUNTRY_NETHERLANDS = 161; + + /** + * The value for Norway. + */ + public static final int COUNTRY_NORWAY = 162; + + /** + * The value for Sweden. + */ + public static final int COUNTRY_SWEDEN = 191; + + /** + * The value for the UK. + */ + public static final int COUNTRY_UK = 77; + + /** + * The value for USA. + */ + public static final int COUNTRY_USA = 225; + + /** + * If the world is free to play. + */ + public static final int FLAG_NON_MEMBERS = 0; + + /** + * If the world is a members world. + */ + public static final int FLAG_MEMBERS = 1; + + /** + * If the world is a quick chat world + */ + public static final int FLAG_QUICK_CHAT = 2; + + /** + * If the world is a PvP-world. + */ + public static final int FLAG_PVP = 4; + + /** + * If the world is a lootshare world. + */ + public static final int FLAG_LOOTSHARE = 8; + + /** + * A list holding all the currently loaded worlds. + */ + private static final List WORLD_LIST = new ArrayList(); + + /** + * The last update time stamp (in server ticks). + */ + private static int updateStamp = 0; + + /** + * Populates the world list. + */ + static { + addWorld(new WorldDefinition(1, 0, FLAG_MEMBERS | FLAG_LOOTSHARE, "2009Scape Classic", "127.0.0.1", "Anywhere, USA", COUNTRY_USA)); + } + + /** + * Adds a world to the world list. + * @param def The world definitions. + */ + public static void addWorld(WorldDefinition def) { + WORLD_LIST.add(def); + flagUpdate(); + } + + /** + * Gets the packet to update the world list in the lobby. + * @return The {@code OutgoingPacket} to write. + */ + public static void sendUpdate(IoSession session, int updateStamp) { + ByteBuffer buf = ByteBuffer.allocate(1024); + buf.put((byte) 0); + buf.putShort((short) 0); + buf.put((byte) 1); + IoBuffer buffer = new IoBuffer(); + if (updateStamp != WorldList.updateStamp) { + buf.put((byte) 1); // Indicates an update occured. + putWorldListinfo(buffer); + } else { + buf.put((byte) 0); + } + putPlayerInfo(buffer); + if (buffer.toByteBuffer().position() > 0) { + buf.put((ByteBuffer) buffer.toByteBuffer().flip()); + } + buf.putShort(1, (short) (buf.position() - 3)); + session.queue((ByteBuffer) buf.flip()); + } + + /** + * Adds the world configuration on the packet. + * @param buffer The current packet. + */ + private static void putWorldListinfo(IoBuffer buffer) { + buffer.putSmart(WORLD_LIST.size()); + putCountryInfo(buffer); + buffer.putSmart(0); + buffer.putSmart(WORLD_LIST.size()); + buffer.putSmart(WORLD_LIST.size()); + for (WorldDefinition w : WORLD_LIST) { + buffer.putSmart(w.getWorldId()); + buffer.put(w.getLocation()); + buffer.putInt(w.getFlag()); + buffer.putJagString(w.getActivity()); + buffer.putJagString(w.getIp()); + } + buffer.putInt(updateStamp); + } + + /** + * Adds the world status on the packet. + * @param buffer The current packet. + */ + private static void putPlayerInfo(IoBuffer buffer) { + for (WorldDefinition w : WORLD_LIST) { + buffer.putSmart(w.getWorldId()); + buffer.putShort(w.getPlayerCount()); + } + } + + /** + * Sets the countries for each world. + * @param buffer The current packet. + */ + private static void putCountryInfo(IoBuffer buffer) { + for (WorldDefinition w : WORLD_LIST) { + buffer.putSmart(w.getCountry()); + buffer.putJagString(w.getRegion()); + } + } + + /** + * Gets the updateStamp. + * @return the updateStamp + */ + public static int getUpdateStamp() { + return updateStamp; + } + + /** + * Sets the baupdateStamp. + */ + public static void flagUpdate() { + WorldList.updateStamp = GameWorld.getTicks(); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/Context.java b/Server/src/main/java/Server/core/net/packet/Context.java new file mode 100644 index 000000000..d806634e3 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/Context.java @@ -0,0 +1,17 @@ +package core.net.packet; + +import core.game.node.entity.player.Player; + +/** + * Represents packet context. + * @author Emperor + */ +public interface Context { + + /** + * Gets the node. + * @return The node. + */ + public Player getPlayer(); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/IncomingPacket.java b/Server/src/main/java/Server/core/net/packet/IncomingPacket.java new file mode 100644 index 000000000..01564be5b --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/IncomingPacket.java @@ -0,0 +1,20 @@ +package core.net.packet; + +import core.game.node.entity.player.Player; + +/** + * Represents an incoming packet. + * @author Emperor + */ +public interface IncomingPacket { + + /** + * Decodes the incoming packet. + * @param player The player. + * @param opcode The opcode. + * @param buffer The buffer. + * @return The new buffer to send in response. + */ + public void decode(Player player, int opcode, IoBuffer buffer); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/IoBuffer.java b/Server/src/main/java/Server/core/net/packet/IoBuffer.java new file mode 100644 index 000000000..31def3cc8 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/IoBuffer.java @@ -0,0 +1,638 @@ +package core.net.packet; + +import core.cache.crypto.ISAACCipher; +import core.cache.misc.buffer.ByteBufferUtils; + +import java.nio.ByteBuffer; + +/** + * Represents the buffer used for reading/writing packets. + * @author Emperor + */ +public class IoBuffer { + + /** + * The bit masks. + */ + private static final int[] BIT_MASK = new int[32]; + + /** + * The packet size. + */ + private int packetSize; + + /** + * The opcode. + */ + private int opcode; + + /** + * The packet header. + */ + private final PacketHeader header; + + /** + * The byte buffer. + */ + private ByteBuffer buf; + + /** + * The bit position. + */ + private int bitPosition = 0; + + /** + * Constructs a new {@code IoBuffer} {@code Object}. + */ + public IoBuffer() { + this(-1, PacketHeader.NORMAL, ByteBuffer.allocate(2048)); + } + + /** + * Constructs a new {@code IoBuffer} {@code Object}. + * @param opcode The opcode. + */ + public IoBuffer(int opcode) { + this(opcode, PacketHeader.NORMAL, ByteBuffer.allocate(2048)); + } + + /** + * Constructs a new {@code IoBuffer} {@code Object}. + * @param opcode The opcode. + * @param header The packet header. + */ + public IoBuffer(int opcode, PacketHeader header) { + this(opcode, header, ByteBuffer.allocate((1 << 16) + 1)); + } + + /** + * Constructs a new {@code IoBuffer} {@code Object}. + * @param opcode The opcode. + * @param header The packet header. + * @param buf The byte buffer. + */ + public IoBuffer(int opcode, PacketHeader header, ByteBuffer buf) { + this.opcode = opcode; + this.header = header; + this.buf = buf; + } + + static { + for (int i = 0; i < 32; i++) { + BIT_MASK[i] = (1 << i) - 1; + } + } + + /** + * @return + */ + public IoBuffer clear() { + buf.clear(); + bitPosition = 0; + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer put(int val) { + buf.put((byte) val); + return this; + } + + /** + * @param datas + * @param offset + * @param len + * @return + */ + public IoBuffer putBytes(byte[] datas, int offset, int len) { + for (int i = offset; i < len; i++) { + put(datas[i]); + } + return this; + } + + public final void getBytes(byte data[], int off, int len) { + for (int k = off; k < len + off; k++) { + data[k] = data[off++]; + } + } + + /** + * @param val + * @return + */ + public IoBuffer putA(int val) { + buf.put((byte) (val + 128)); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putC(int val) { + buf.put((byte) -val); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putS(int val) { + buf.put((byte) (128 - val)); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putTri(int val) { + buf.put((byte) (val >> 16)); + buf.put((byte) (val >> 8)); + buf.put((byte) val); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putShort(int val) { + buf.putShort((short) val); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putLEShort(int val) { + buf.put((byte) val); + buf.put((byte) (val >> 8)); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putShortA(int val) { + buf.put((byte) (val >> 8)); + buf.put((byte) (val + 128)); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putLEShortA(int val) { + buf.put((byte) (val + 128)); + buf.put((byte) (val >> 8)); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putInt(int val) { + buf.putInt(val); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putLEInt(int val) { + buf.put((byte) val); + buf.put((byte) (val >> 8)); + buf.put((byte) (val >> 16)); + buf.put((byte) (val >> 24)); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putIntA(int val) { + buf.put((byte) (val >> 8)); + buf.put((byte) val); + buf.put((byte) (val >> 24)); + buf.put((byte) (val >> 16)); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putIntB(int val) { + buf.put((byte) (val >> 16)); + buf.put((byte) (val >> 24)); + buf.put((byte) val); + buf.put((byte) (val >> 8)); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putLong(long val) { + buf.putLong(val); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putSmart(int val) { + if (val > Byte.MAX_VALUE) { + buf.putShort((short) (val + 32768)); + } else { + buf.put((byte) val); + } + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putIntSmart(int val) { + if (val > Short.MAX_VALUE) { + buf.putInt(val + 32768); + } else { + buf.putShort((short) val); + } + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putString(String val) { + buf.put(val.getBytes()); + buf.put((byte) 0); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putJagString(String val) { + buf.put((byte) 0); + buf.put(val.getBytes()); + buf.put((byte) 0); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer putJagString2(String val) { + byte[] packed = new byte[256]; + int length = ByteBufferUtils.packGJString2(0, packed, val); + buf.put((byte) 0).put(packed, 0, length).put((byte) 0); + return this; + } + + /** + * @param val + * @return + */ + public IoBuffer put(byte[] val) { + buf.put(val); + return this; + } + + /** + * Puts a byte array as byte A in reverse. + * @param data The data to put. + * @param start The start index. + * @param offset The offset. + */ + public void putReverseA(byte[] data, int start, int offset) { + for (int i = offset + start; i >= start; i--) { + putA(data[i]); + } + } + + /** + * Puts a byte array as byte A in reverse. + * @param data The data to put. + * @param start The start index. + * @param offset The offset. + */ + public void putReverse(byte[] data, int start, int offset) { + for (int i = offset + start; i >= start; i--) { + put(data[i]); + } + } + + /** + * @param numBits + * @param value + * @return + */ + public IoBuffer putBits(int numBits, int value) { + int bytePos = getBitPosition() >> 3; + int bitOffset = 8 - (getBitPosition() & 7); + bitPosition += numBits; + for (; numBits > bitOffset; bitOffset = 8) { + byte b = buf.get(bytePos); + buf.put(bytePos, b &= ~BIT_MASK[bitOffset]); + buf.put(bytePos++, b |= value >> numBits - bitOffset & BIT_MASK[bitOffset]); + numBits -= bitOffset; + } + byte b = buf.get(bytePos); + if (numBits == bitOffset) { + buf.put(bytePos, b &= ~BIT_MASK[bitOffset]); + buf.put(bytePos, b |= value & BIT_MASK[bitOffset]); + } else { + buf.put(bytePos, b &= ~(BIT_MASK[numBits] << bitOffset - numBits)); + buf.put(bytePos, b |= (value & BIT_MASK[numBits]) << bitOffset - numBits); + } + return this; + } + + /** + * @param buffer + * @return + */ + public IoBuffer put(IoBuffer buffer) { + buffer.toByteBuffer().flip(); + buf.put(buffer.toByteBuffer()); + return this; + } + + /** + * @param buffer + * @return + */ + public IoBuffer putA(IoBuffer buffer) { + buffer.toByteBuffer().flip(); + while (buffer.toByteBuffer().hasRemaining()) { + putA(buffer.toByteBuffer().get()); + } + return this; + } + + /** + * @param buffer + * @return + */ + public IoBuffer put(ByteBuffer buffer) { + buf.put(buffer); + return this; + } + + /** + * @return + */ + public IoBuffer setBitAccess() { + bitPosition = buf.position() * 8; + return this; + } + + /** + * @return + */ + public IoBuffer setByteAccess() { + buf.position((getBitPosition() + 7) / 8); + return this; + } + + /** + * @return + */ + public int get() { + return buf.get(); + } + + /** + * @return + */ + public int getA() { + return (buf.get() & 0xFF) - 128; + } + + /** + * @return + */ + public int getC() { + return -buf.get(); + } + + /** + * @return + */ + public int getS() { + return 128 - (buf.get() & 0xFF); + } + + /** + * @return + */ + public int getTri() { + return ((buf.get() << 16) & 0xFF) | ((buf.get() << 8) & 0xFF) | (buf.get() & 0xFF); + } + + /** + * @return + */ + public int getShort() { + return buf.getShort(); + } + + /** + * @return + */ + public int getLEShort() { + return (buf.get() & 0xFF) | ((buf.get() & 0xFF) << 8); + } + + /** + * @return + */ + public int getShortA() { + return ((buf.get() & 0xFF) << 8) | (buf.get() - 128 & 0xFF); + } + + /** + * @return + */ + public int getLEShortA() { + return (buf.get() - 128 & 0xFF) | ((buf.get() & 0xFF) << 8); + } + + /** + * @return + */ + public int getInt() { + return buf.getInt(); + } + + /** + * @return + */ + public int getLEInt() { + return (buf.get() & 0xFF) + ((buf.get() & 0xFF) << 8) + ((buf.get() & 0xFF) << 16) + ((buf.get() & 0xFF) << 24); + } + + /** + * @return + */ + public int getIntA() { + return ((buf.get() & 0xFF) << 8) + (buf.get() & 0xFF) + ((buf.get() & 0xFF) << 24) + ((buf.get() & 0xFF) << 16); + } + + /** + * @return + */ + public int getIntB() { + return ((buf.get() & 0xFF) << 16) + ((buf.get() & 0xFF) << 24) + (buf.get() & 0xFF) + ((buf.get() & 0xFF) << 8); + } + + /** + * @return + */ + public long getLongL() { + long first = getIntB(); + long second = getIntB(); + if (second < 0) + second = second & 0xffffffffL; + return (first << -41780448) + second; + } + + /** + * @return + */ + public long getLong() { + return buf.getLong(); + } + + /** + * @return + */ + public int getSmart() { + int peek = buf.get(buf.position()); + if (peek <= Byte.MAX_VALUE) { + return buf.get() & 0xFF; + } + return (buf.getShort() & 0xFFFF) - 32768; + } + + /** + * @return + */ + public int getIntSmart() { + int peek = buf.getShort(buf.position()); + if (peek <= Short.MAX_VALUE) { + return buf.getShort() & 0xFFFF; + } + return (buf.getInt() & 0xFFFFFFFF) - 32768; + } + + /** + * @return + */ + public String getString() { + return ByteBufferUtils.getString(buf); + } + + /** + * @return + */ + public String getJagString() { + buf.get(); + return ByteBufferUtils.getString(buf); + } + + /** + * @param is + * @param offset + * @param length + * @return + */ + public IoBuffer getReverseA(byte[] is, int offset, int length) { + for (int i = (offset + length - 1); i >= offset; i--) { + is[i] = (byte) (buf.get() - 128); + } + return this; + } + + public void cypherOpcode(ISAACCipher cipher){ + this.opcode += (byte)cipher.getNextValue(); + } + + /** + * @return + */ + public ByteBuffer toByteBuffer() { + return buf; + } + + /** + * @return + */ + public int opcode() { + return opcode; + } + + /** + * @return + */ + public int readableBytes() { + return buf.capacity() - buf.remaining(); + } + + /** + * @return + */ + public PacketHeader getHeader() { + return header; + } + + /** + * @return + */ + public byte[] array() { + return buf.array(); + } + + /** + * @return the packetSize. + */ + public int getPacketSize() { + return packetSize; + } + + /** + * @param packetSize the packetSize to set. + */ + public void setPacketSize(int packetSize) { + this.packetSize = packetSize; + } + + /** + * Gets the bitPosition. + * @return The bitPosition. + */ + public int getBitPosition() { + return bitPosition; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/OutgoingPacket.java b/Server/src/main/java/Server/core/net/packet/OutgoingPacket.java new file mode 100644 index 000000000..8fee2ba95 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/OutgoingPacket.java @@ -0,0 +1,16 @@ +package core.net.packet; + +/** + * Represents an outgoing packet. + * @author Emperor + * @param The context type. + */ +public interface OutgoingPacket { + + /** + * Sends the packet. + * @param context The context. + */ + public void send(T context); + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/PacketHeader.java b/Server/src/main/java/Server/core/net/packet/PacketHeader.java new file mode 100644 index 000000000..8ea4278ce --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/PacketHeader.java @@ -0,0 +1,24 @@ +package core.net.packet; + +/** + * Represents the types of packet headers. + * @author Emperor + */ +public enum PacketHeader { + + /** + * The normal packet header. + */ + NORMAL, + + /** + * The byte packet header. + */ + BYTE, + + /** + * The short packet header. + */ + SHORT; + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/PacketRepository.java b/Server/src/main/java/Server/core/net/packet/PacketRepository.java new file mode 100644 index 000000000..5ca6a2ee3 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/PacketRepository.java @@ -0,0 +1,202 @@ +package core.net.packet; + +import core.game.system.SystemLogger; +import core.net.packet.in.*; +import core.net.packet.out.*; +import core.net.packet.out.GrandExchangePacket; + +import java.util.HashMap; +import java.util.Map; + +/** + * The packet repository. + * @author Emperor + */ +public final class PacketRepository { + + /** + * The outgoing packets mapping. + */ + private final static Map, OutgoingPacket> OUTGOING_PACKETS = new HashMap<>(); + + /** + * The incoming packets mapping. + */ + private final static Map INCOMING_PACKETS = new HashMap<>(); + + /** + * Populate the mappings. + */ + static { + OUTGOING_PACKETS.put(LoginPacket.class, new LoginPacket()); // + OUTGOING_PACKETS.put(UpdateSceneGraph.class, new UpdateSceneGraph()); // + OUTGOING_PACKETS.put(WindowsPane.class, new WindowsPane()); // + OUTGOING_PACKETS.put(Interface.class, new Interface()); // + OUTGOING_PACKETS.put(SkillLevel.class, new SkillLevel()); // + OUTGOING_PACKETS.put(Config.class, new Config()); // + OUTGOING_PACKETS.put(AccessMask.class, new AccessMask()); // + OUTGOING_PACKETS.put(GameMessage.class, new GameMessage()); // + OUTGOING_PACKETS.put(RunScriptPacket.class, new RunScriptPacket()); // + OUTGOING_PACKETS.put(RunEnergy.class, new RunEnergy()); // + OUTGOING_PACKETS.put(ContainerPacket.class, new ContainerPacket()); // + OUTGOING_PACKETS.put(StringPacket.class, new StringPacket()); // + OUTGOING_PACKETS.put(Logout.class, new Logout()); // + OUTGOING_PACKETS.put(CloseInterface.class, new CloseInterface()); // + OUTGOING_PACKETS.put(AnimateInterface.class, new AnimateInterface()); // + OUTGOING_PACKETS.put(DisplayModel.class, new DisplayModel()); // + OUTGOING_PACKETS.put(InterfaceConfig.class, new InterfaceConfig()); // + OUTGOING_PACKETS.put(PingPacket.class, new PingPacket()); // + OUTGOING_PACKETS.put(UpdateAreaPosition.class, new UpdateAreaPosition()); // + OUTGOING_PACKETS.put(ConstructObject.class, new ConstructObject()); // + OUTGOING_PACKETS.put(ClearObject.class, new ClearObject()); // + OUTGOING_PACKETS.put(HintIcon.class, new HintIcon()); // + OUTGOING_PACKETS.put(ClearMinimapFlag.class, new ClearMinimapFlag()); // + OUTGOING_PACKETS.put(InteractionOption.class, new InteractionOption()); // + OUTGOING_PACKETS.put(SetWalkOption.class, new SetWalkOption()); // + OUTGOING_PACKETS.put(MinimapState.class, new MinimapState()); // + OUTGOING_PACKETS.put(ConstructGroundItem.class, new ConstructGroundItem()); // + OUTGOING_PACKETS.put(ClearGroundItem.class, new ClearGroundItem()); // + OUTGOING_PACKETS.put(RepositionChild.class, new RepositionChild()); // + OUTGOING_PACKETS.put(PositionedGraphic.class, new PositionedGraphic()); // + OUTGOING_PACKETS.put(SystemUpdatePacket.class, new SystemUpdatePacket()); // + OUTGOING_PACKETS.put(CameraViewPacket.class, new CameraViewPacket()); // + OUTGOING_PACKETS.put(MusicPacket.class, new MusicPacket()); // + OUTGOING_PACKETS.put(AudioPacket.class, new AudioPacket()); // + OUTGOING_PACKETS.put(GrandExchangePacket.class, new GrandExchangePacket()); // + OUTGOING_PACKETS.put(BuildDynamicScene.class, new BuildDynamicScene()); // + OUTGOING_PACKETS.put(AnimateObjectPacket.class, new AnimateObjectPacket()); // + OUTGOING_PACKETS.put(ClearRegionChunk.class, new ClearRegionChunk()); // + OUTGOING_PACKETS.put(ContactPackets.class, new ContactPackets()); // + OUTGOING_PACKETS.put(CommunicationMessage.class, new CommunicationMessage()); // + OUTGOING_PACKETS.put(UpdateClanChat.class, new UpdateClanChat()); // + OUTGOING_PACKETS.put(UpdateGroundItemAmount.class, new UpdateGroundItemAmount()); // + OUTGOING_PACKETS.put(WeightUpdate.class, new WeightUpdate()); // + OUTGOING_PACKETS.put(UpdateRandomFile.class, new UpdateRandomFile()); // + OUTGOING_PACKETS.put(InstancedLocationUpdate.class, new InstancedLocationUpdate()); // + OUTGOING_PACKETS.put(CSConfigPacket.class, new CSConfigPacket()); // + INCOMING_PACKETS.put(22, new ClientFocusPacket()); + INCOMING_PACKETS.put(93, new PingPacketHandler()); + INCOMING_PACKETS.put(44, new CommandPacket()); + INCOMING_PACKETS.put(237, new ChatPacket()); + INCOMING_PACKETS.put(21, new CameraMovementPacket()); + INCOMING_PACKETS.put(75, new MouseClickPacket()); + INCOMING_PACKETS.put(243, new DisplayUpdatePacket()); + INCOMING_PACKETS.put(177, new UpdateInterfaceCounter()); + INCOMING_PACKETS.put(4, new DummyPacket()); + INCOMING_PACKETS.put(245, new IdlePacketHandler()); + INCOMING_PACKETS.put(111, new core.net.packet.in.GrandExchangePacket()); + IncomingPacket packet = new WalkPacket(); + INCOMING_PACKETS.put(39, packet); + INCOMING_PACKETS.put(77, packet); + INCOMING_PACKETS.put(215, packet); + packet = new ItemActionPacket(); + INCOMING_PACKETS.put(134, packet);//item on object + INCOMING_PACKETS.put(115, packet);//on npc + INCOMING_PACKETS.put(27, packet);//item on item + INCOMING_PACKETS.put(248, packet);//on player + INCOMING_PACKETS.put(101,new ItemOnGroundItemPacket()); //Item on Ground Item + INCOMING_PACKETS.put(3, packet = new InteractionPacket()); + INCOMING_PACKETS.put(180, packet);//Player interact options v + INCOMING_PACKETS.put(68, packet); + INCOMING_PACKETS.put(71, packet); + INCOMING_PACKETS.put(114, packet); + INCOMING_PACKETS.put(175, packet);//Player interact options ^ + INCOMING_PACKETS.put(30, packet); + INCOMING_PACKETS.put(78, packet); + INCOMING_PACKETS.put(148, packet); + INCOMING_PACKETS.put(218, packet); + INCOMING_PACKETS.put(84, packet); + INCOMING_PACKETS.put(170, packet); + INCOMING_PACKETS.put(254, packet); + INCOMING_PACKETS.put(194, packet); + INCOMING_PACKETS.put(66, packet); + INCOMING_PACKETS.put(33, packet); + INCOMING_PACKETS.put(247, packet); + INCOMING_PACKETS.put(156, packet = new ActionButtonPacket()); //Item V + INCOMING_PACKETS.put(55, packet); + INCOMING_PACKETS.put(153, packet); + INCOMING_PACKETS.put(161, packet); + INCOMING_PACKETS.put(135, packet); //^ + INCOMING_PACKETS.put(81, packet); + INCOMING_PACKETS.put(184, packet);//close interface + INCOMING_PACKETS.put(155, packet); //Interface V + INCOMING_PACKETS.put(196, packet); + INCOMING_PACKETS.put(124, packet); + INCOMING_PACKETS.put(199, packet); + INCOMING_PACKETS.put(234, packet); + INCOMING_PACKETS.put(168, packet); + INCOMING_PACKETS.put(166, packet); + INCOMING_PACKETS.put(64, packet); + INCOMING_PACKETS.put(53, packet); + INCOMING_PACKETS.put(9, packet); //^ + INCOMING_PACKETS.put(132, packet); //Dialogue + INCOMING_PACKETS.put(10, packet); //logout + INCOMING_PACKETS.put(206, packet);//operate + INCOMING_PACKETS.put(72, packet = new ExaminePacket()); + INCOMING_PACKETS.put(92, packet); + INCOMING_PACKETS.put(94, packet); + /*INCOMING_PACKETS.put(57, packet); + INCOMING_PACKETS.put(34, packet); + INCOMING_PACKETS.put(213, packet);*/ + //INCOMING_PACKETS.put(69, packet); + //packet 98 - 530 settings interface + INCOMING_PACKETS.put(104, packet = new ClanPacketHandler()); + INCOMING_PACKETS.put(188, packet); + INCOMING_PACKETS.put(162, packet); + INCOMING_PACKETS.put(157, new ChatSettingsPacket()); + INCOMING_PACKETS.put(244, packet = new RunScriptPacketHandler()); + INCOMING_PACKETS.put(23, packet); + INCOMING_PACKETS.put(65, packet); + INCOMING_PACKETS.put(110, new RegionChangePacket()); + INCOMING_PACKETS.put(195, packet = new InterfaceUseOnPacket()); + INCOMING_PACKETS.put(239, packet); + INCOMING_PACKETS.put(73, packet); + INCOMING_PACKETS.put(253, packet); + INCOMING_PACKETS.put(233, packet); + INCOMING_PACKETS.put(231, packet = new SlotSwitchPacket()); + INCOMING_PACKETS.put(79, packet); + INCOMING_PACKETS.put(167, new QuickChatPacketHandler()); + INCOMING_PACKETS.put(201, packet = new CommunicationPacket()); + INCOMING_PACKETS.put(120, packet); + INCOMING_PACKETS.put(57, packet); + INCOMING_PACKETS.put(34, packet); + INCOMING_PACKETS.put(213, packet); + INCOMING_PACKETS.put(99, packet = new ReportAbusePacket()); + INCOMING_PACKETS.put(98, packet = new MapClosedPacket()); // this packet is sent when the world map is closed by the client + INCOMING_PACKETS.put(137,packet = new MusicPacketHandler()); //this packet is received when the client stops playing a song + // INCOMING_PACKETS.put(77, packet); + // INCOMING_PACKETS.put(191, packet); + // INCOMING_PACKETS.put(139, packet); + // INCOMING_PACKETS.put(251, packet); + // INCOMING_PACKETS.put(55, packet); + + //Packet 22 is sent on focus gain/loss + //packet 177 is sent when opening/closing interfaces + + } + + /** + * Sends a new packet. + * @param clazz The class of the outgoing packet to send. + * @param context The context. + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void send(Class clazz, Context context) { + OutgoingPacket p = OUTGOING_PACKETS.get(clazz); + if (p == null) { + SystemLogger.logErr("Invalid outgoing packet [handler=" + clazz + ", context=" + context + "]."); + return; + } + if(!context.getPlayer().isArtificial()) + p.send(context); + } + + /** + * Gets an incoming packet. + * @param opcode The opcode. + * @return The incoming packet. + */ + public static IncomingPacket getIncoming(int opcode) { + return INCOMING_PACKETS.get(opcode); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/AccessMaskContext.java b/Server/src/main/java/Server/core/net/packet/context/AccessMaskContext.java new file mode 100644 index 000000000..5c14f7f5d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/AccessMaskContext.java @@ -0,0 +1,125 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The access mask context. + * @author Emperor + */ +public class AccessMaskContext implements Context { + + /** + * The player reference. + */ + private Player player; + + /** + * The access mask id. + */ + private int id; + + /** + * The child id. + */ + private int childId; + + /** + * The interface id. + */ + private int interfaceId; + + /** + * The offset. + */ + private int offset; + + /** + * The length. + */ + private int length; + + /** + * Construct a new {@code AccessMaskContext} {@code Object}. + * @param player + * @param id + * @param childId + * @param interfaceId + * @param offset + * @param length + */ + public AccessMaskContext(Player player, int id, int childId, int interfaceId, int offset, int length) { + this.player = player; + this.id = id; + this.childId = childId; + this.interfaceId = interfaceId; + this.offset = offset; + this.length = length; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Transforms this access mask context into a new instance with the player + * instance and id value changed. + * @param player The player to set. + * @param id The id to set. + * @return The access mask context. + */ + public AccessMaskContext transform(Player player, int id) { + return new AccessMaskContext(player, id, childId, interfaceId, offset, length); + } + + /** + * Sets the player. + * @param player The player. + * @return This context instance. + */ + public Context setPlayer(Player player) { + this.player = player; + return this; + } + + /** + * Get the access mask id. + * @return The access mask. + */ + public int getId() { + return id; + } + + /** + * Get the child id. + * @return The child id. + */ + public int getChildId() { + return childId; + } + + /** + * Get the interface id. + * @return The interface id. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Get the offset. + * @return The offset. + */ + public int getOffset() { + return offset; + } + + /** + * Get the length. + * @return The length. + */ + public int getLength() { + return length; + } +} diff --git a/Server/src/main/java/Server/core/net/packet/context/AnimateInterfaceContext.java b/Server/src/main/java/Server/core/net/packet/context/AnimateInterfaceContext.java new file mode 100644 index 000000000..d2394c3f7 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/AnimateInterfaceContext.java @@ -0,0 +1,74 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The animate interface context. + * @author Emperor + */ +public class AnimateInterfaceContext implements Context { + + /** + * The player reference. + */ + private Player player; + + /** + * The animation id. + */ + private int animationId; + + /** + * The interface id. + */ + private int interfaceId; + + /** + * The child id. + */ + private int childId; + + /** + * Construct a new {@code AnimateInterfaceContext} {@code Object}. + * @param player The player reference. + * @param animationId The animation id. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public AnimateInterfaceContext(Player player, int animationId, int interfaceId, int childId) { + this.player = player; + this.animationId = animationId; + this.interfaceId = interfaceId; + this.childId = childId; + } + + /** + * Get the animation id. + * @return The animation id. + */ + public int getAnimationId() { + return animationId; + } + + /** + * Get the interface id. + * @return The interface id. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Get the child id. + * @return The child id. + */ + public int getChildId() { + return childId; + } + + @Override + public Player getPlayer() { + return player; + } +} diff --git a/Server/src/main/java/Server/core/net/packet/context/AnimateObjectContext.java b/Server/src/main/java/Server/core/net/packet/context/AnimateObjectContext.java new file mode 100644 index 000000000..ab8cda86e --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/AnimateObjectContext.java @@ -0,0 +1,47 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.world.update.flag.context.Animation; +import core.net.packet.Context; + +/** + * Represents the context of animating an object. + * @author Emperor + * @author 'Vexia + * @date 10/11/2013 + */ +public class AnimateObjectContext implements Context { + + /** + * Represents the player of the context. + */ + private final Player player; + + /** + * Represents the animation to use. + */ + private final Animation animation; + + /** + * Constructs a new {@code AnimateObjectContext} {@code Object}. + * @param player the player. + * @param animation the animation. + */ + public AnimateObjectContext(Player player, Animation animation) { + this.player = player; + this.animation = animation; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the animation. + * @return The animation. + */ + public Animation getAnimation() { + return animation; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/AreaPositionContext.java b/Server/src/main/java/Server/core/net/packet/context/AreaPositionContext.java new file mode 100644 index 000000000..5ba7ce4bc --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/AreaPositionContext.java @@ -0,0 +1,76 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.net.packet.Context; + +/** + * Handles the area position update packet context. + * @author Emperor + */ +public final class AreaPositionContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The location. + */ + private final Location location; + + /** + * The offset x-coordinate. + */ + private final int offsetX; + + /** + * The offset y-coordinate. + */ + private final int offsetY; + + /** + * Constructs a new {@code AreaPositionContext} {@code Object}. + * @param player The player. + * @param location The location. + * @param offsetX The offset x-coordinate. + * @param offsetY The offset y-coordinate. + */ + public AreaPositionContext(Player player, Location location, int offsetX, int offsetY) { + this.player = player; + this.location = location; + this.offsetX = offsetX; + this.offsetY = offsetY; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the location. + * @return The location. + */ + public Location getLocation() { + return location; + } + + /** + * Gets the offsetX. + * @return The offsetX. + */ + public int getOffsetX() { + return offsetX; + } + + /** + * Gets the offsetY. + * @return The offsetY. + */ + public int getOffsetY() { + return offsetY; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/BuildItemContext.java b/Server/src/main/java/Server/core/net/packet/context/BuildItemContext.java new file mode 100644 index 000000000..300660c99 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/BuildItemContext.java @@ -0,0 +1,71 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.Context; + +/** + * Represents the build item packet context,
which is used for + * construct/clear item outgoing packet. + * @author Emperor + */ +public final class BuildItemContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The item to send. + */ + private final Item item; + + /** + * The old item amount. + */ + private final int oldAmount; + + /** + * Constructs a new {@code BuildObjectContext} {@code Object}. + * @param player The player + * @param item The item to send. + */ + public BuildItemContext(Player player, Item item) { + this(player, item, 0); + } + + /** + * Constructs a new {@code BuildObjectContext} {@code Object}. + * @param player The player + * @param item The item to send. + * @param oldAmount The old item amount. + */ + public BuildItemContext(Player player, Item item, int oldAmount) { + this.player = player; + this.item = item; + this.oldAmount = oldAmount; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the item. + * @return The item. + */ + public Item getItem() { + return item; + } + + /** + * Gets the oldAmount. + * @return The oldAmount. + */ + public int getOldAmount() { + return oldAmount; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/BuildObjectContext.java b/Server/src/main/java/Server/core/net/packet/context/BuildObjectContext.java new file mode 100644 index 000000000..a7229f3bb --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/BuildObjectContext.java @@ -0,0 +1,47 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.net.packet.Context; + +/** + * Represents the build object packet context,
which is used for + * construct/clear object outgoing packet. + * @author Emperor + */ +public final class BuildObjectContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The list of game objects to send. + */ + private final GameObject gameObject; + + /** + * Constructs a new {@code BuildObjectContext} {@code Object}. + * @param player The player + * @param gameObject the game object to send. + */ + public BuildObjectContext(Player player, GameObject gameObject) { + this.player = player; + this.gameObject = gameObject; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the gameObject. + * @return The gameObject. + */ + public GameObject getGameObject() { + return gameObject; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/CSConfigContext.java b/Server/src/main/java/Server/core/net/packet/context/CSConfigContext.java new file mode 100644 index 000000000..52ea7bf2c --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/CSConfigContext.java @@ -0,0 +1,84 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The context for ClientScript configurations. + * + * @author Torchic + */ +public class CSConfigContext implements Context { + /** + * The player reference. + */ + private Player player; + + /** + * The value + */ + private int value; + + /** + * The id. + */ + private int id; + private final Object[] parameters; + private final String types; + + + /** + * Constructs a new {@Code CSConfigContext} {@Code Object} + * @param player The player. + * @param id The id. + * @param value The config value. + * @param parameters + * @param types + */ + public CSConfigContext(Player player, int id, int value, String types, Object[] parameters) { + this.player = player; + this.value = value; + this.id = id; + this.parameters = parameters; + this.types = types; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Sets the player. + * @param player The player. + * @return This context instance. + */ + public Context setPlayer(Player player) { + this.player = player; + return this; + } + + /** + * Get the config value. + * @return The config value. + */ + public int getValue() { + return value; + } + + /** + * Get the config id. + * @return The config id. + */ + public int getId() { + return id; + } + + public String getTypes() { + return types; + } + + public Object[] getParameters() { + return parameters; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/CameraContext.java b/Server/src/main/java/Server/core/net/packet/context/CameraContext.java new file mode 100644 index 000000000..057104712 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/CameraContext.java @@ -0,0 +1,178 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.net.packet.Context; + +/** + * Represents a camera context. + * @author Emperor + */ +public final class CameraContext implements Context { + + + /** + * Represents the camera types used for determining which packet to send. + * @author Emperor + */ + public static enum CameraType { + POSITION(154), + ROTATION(125), + SET(187), SHAKE(27), RESET(24); + + /** + * The opcode. + */ + private final int opcode; + + /** + * Constructs a new {@code CameraContext} {@Code Object}. + * @param opcode The opcode. + */ + private CameraType(int opcode) { + this.opcode = opcode; + } + + /** + * Gets the packet opcode. + * @return The opcode. + */ + public int opcode() { + return opcode; + } + } + + /* + * rotateCamera(Player p, int x, int y, int z, int angle) { MessageBuilder + * bldr = new MessageBuilder(26); bldr.writeByte(y); //idk + * bldr.writeByte(x); //idk bldr.writeLEShortA(z >>> 2); //idk + * bldr.writeByte(0); // speed :S bldr.writeByteS(100); + */ + /** + * The player. + */ + private final Player player; + + /** + * The camera type. + */ + private final CameraType type; + + /** + * x The (local) x-coordinate of the camera. + */ + private final int x; + + /** + * The (local) y-coordinate of the camera. + */ + private final int y; + + /** + * The height. + */ + private final int height; + + /** + * The zoom speed. + */ + private final int zoomSpeed; + + /** + * The speed. + */ + private final int speed; + + /** + * Constructs a new {@code CameraContext} {@Code Object}. + * @param player The player. + * @param type The camera type. + * @param x The x-coordinate of the camera. + * @param y The y-coordinate of the camera. + * @param height The height. + * @param zoomSpeed The zoom speed. + * @param speed The speed. + */ + public CameraContext(Player player, CameraType type, int x, int y, int height, int speed, int zoomSpeed) { + this.player = player; + this.type = type; + this.x = x; + this.y = y; + this.height = height; + this.speed = speed; + this.zoomSpeed = zoomSpeed; + } + + /** + * Method used to transform a camera context. + * @param x the x. + * @param y the y. + * @return the new context. + */ + public CameraContext transform(final Player player, final int x, final int y) { + return new CameraContext(player, type, this.x + x, this.y + y, height, speed, zoomSpeed); + } + + /** + * Method used to transform the context. + * @param heightOffset the height offset. + * @return the new context. + */ + public CameraContext transform(final int heightOffset) { + return new CameraContext(player, type, x, y, height + heightOffset, speed, zoomSpeed); + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the type. + * @return The type. + */ + public CameraType getType() { + return type; + } + + /** + * Gets the x. + * @return The x. + */ + public int getX() { + return x; + } + + /** + * Gets the y. + * @return The y. + */ + public int getY() { + return y; + } + + /** + * Gets the height. + * @return The height. + */ + public int getHeight() { + return height; + } + + /** + * Gets the speed. + * @return The speed. + */ + public int getSpeed() { + return speed; + } + + /** + * Gets the zoomSpeed. + * @return The zoomSpeed. + */ + public int getZoomSpeed() { + return zoomSpeed; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/ChildPositionContext.java b/Server/src/main/java/Server/core/net/packet/context/ChildPositionContext.java new file mode 100644 index 000000000..ab333f7e4 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/ChildPositionContext.java @@ -0,0 +1,78 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +import java.awt.*; + +/** + * A context implementation used for the interface child repositioning packet. + * @author Emperor + */ +public final class ChildPositionContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The interface id. + */ + private final int interfaceId; + + /** + * The child id. + */ + private final int childId; + + /** + * The new position of the child. + */ + private final Point position; + + /** + * Constructs a new {@code ChildPositionContext} {@code Object}. + * @param player The player. + * @param interfaceId The interface id. + * @param childId The id of the child to reposition. + * @param positionX The new x-position. + * @param positionY The new y-position. + */ + public ChildPositionContext(Player player, int interfaceId, int childId, int positionX, int positionY) { + this.player = player; + this.interfaceId = interfaceId; + this.childId = childId; + this.position = new Point(positionX, positionY); + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the interfaceId. + * @return The interfaceId. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Gets the childId. + * @return The childId. + */ + public int getChildId() { + return childId; + } + + /** + * Gets the position. + * @return The position. + */ + public Point getPosition() { + return position; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/ClanContext.java b/Server/src/main/java/Server/core/net/packet/context/ClanContext.java new file mode 100644 index 000000000..9b9f29641 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/ClanContext.java @@ -0,0 +1,60 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.system.communication.ClanRepository; +import core.net.packet.Context; + +/** + * The packet context for clan-related outgoing packets. + * @author Emperor + */ +public final class ClanContext implements Context { + + /** + * The player + */ + private final Player player; + + /** + * The clan instance. + */ + private final ClanRepository clan; + + /** + * If the player is leaving the clan. + */ + private final boolean leave; + + /** + * Constructs a new {@code ClanContext} {@code Object}. + * @param player the player. + * @param clan the clan. + * @param leave If the player is leaving the clan. + */ + public ClanContext(Player player, ClanRepository clan, boolean leave) { + this.player = player; + this.clan = clan; + this.leave = leave; + } + + /** + * Gets the clan. + * @return The clan. + */ + public ClanRepository getClan() { + return clan; + } + + /** + * Gets the leave. + * @return The leave. + */ + public boolean isLeave() { + return leave; + } + + @Override + public Player getPlayer() { + return player; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/ClearChunkContext.java b/Server/src/main/java/Server/core/net/packet/context/ClearChunkContext.java new file mode 100644 index 000000000..739a728df --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/ClearChunkContext.java @@ -0,0 +1,46 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.world.map.RegionChunk; +import core.net.packet.Context; + +/** + * The packet context for the clear region chunk outgoing packet. + * @author Emperor + */ +public final class ClearChunkContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The region chunk to clear. + */ + private final RegionChunk chunk; + + /** + * Constructs a new {@code ClearChunkContext} {@code Object}. + * @param player The player. + * @param chunk The chunk to clear. + */ + public ClearChunkContext(Player player, RegionChunk chunk) { + this.player = player; + this.chunk = chunk; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the chunk. + * @return The chunk. + */ + public RegionChunk getChunk() { + return chunk; + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/context/ConfigContext.java b/Server/src/main/java/Server/core/net/packet/context/ConfigContext.java new file mode 100644 index 000000000..b9200a005 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/ConfigContext.java @@ -0,0 +1,93 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The config packet context. + * @author Emperor + */ +public class ConfigContext implements Context { + + /** + * The player reference. + */ + private Player player; + + /** + * The config id. + */ + private int id; + + /** + * The config value. + */ + private int value; + + /** + * If the config is a cs2-config. + */ + private boolean cs2; + + /** + * Construct a new {@code ConfigContext} {@code Object}. + * @param player The player reference. + * @param id The config id. + * @param value The config value. + */ + public ConfigContext(Player player, int id, int value) { + this(player, id, value, false); + } + + /** + * Construct a new {@code ConfigContext} {@code Object}. + * @param player The player reference. + * @param id The config id. + * @param value The config value. + */ + public ConfigContext(Player player, int id, int value, boolean cs2) { + this.player = player; + this.id = id; + this.value = value; + this.cs2 = cs2; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Sets the player. + * @param player The player. + * @return This context instance. + */ + public Context setPlayer(Player player) { + this.player = player; + return this; + } + + /** + * Get the config id. + * @return The config id. + */ + public int getId() { + return id; + } + + /** + * Get the config value. + * @return The config value. + */ + public int getValue() { + return value; + } + + /** + * Gets the cs2. + * @return The cs2. + */ + public boolean isCs2() { + return cs2; + } +} diff --git a/Server/src/main/java/Server/core/net/packet/context/ContactContext.java b/Server/src/main/java/Server/core/net/packet/context/ContactContext.java new file mode 100644 index 000000000..237710024 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/ContactContext.java @@ -0,0 +1,131 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The packet context for the contact packets. + * @author Emperor + */ +public final class ContactContext implements Context { + + /** + * The update communication server state type. + */ + public static final int UPDATE_STATE_TYPE = 0; + + /** + * The update friend type. + */ + public static final int UPDATE_FRIEND_TYPE = 1; + + /** + * The ignore list type. + */ + public static final int IGNORE_LIST_TYPE = 2; + + /** + * The player. + */ + private final Player player; + + /** + * The contact packet type. + */ + private int type; + + /** + * The player name. + */ + private String name; + + /** + * The world id + */ + private int worldId; + + /** + * Constructs a new {@code ContactContext} {@code Object}. + * @param player The player. + * @param type The contact packet type. + */ + public ContactContext(Player player, int type) { + this.player = player; + this.type = type; + } + + /** + * Constructs a new {@code ContactContext} {@code Object}. + * @param player The player. + * @param name The player name. + * @param worldId The world id (0 = offline). + */ + public ContactContext(Player player, String name, int worldId) { + this.player = player; + this.name = name; + this.worldId = worldId; + this.type = UPDATE_FRIEND_TYPE; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the type. + * @return The type. + */ + public int getType() { + return type; + } + + /** + * Sets the type. + * @param type The type to set. + */ + public void setType(int type) { + this.type = type; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * @param name The name to set. + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the online. + * @return The online. + */ + public boolean isOnline() { + return worldId > 0; + } + + /** + * Gets the worldId. + * @return the worldId + */ + public int getWorldId() { + return worldId; + } + + /** + * Sets the worldId. + * @param worldId the worldId to set. + */ + public void setWorldId(int worldId) { + this.worldId = worldId; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/ContainerContext.java b/Server/src/main/java/Server/core/net/packet/context/ContainerContext.java new file mode 100644 index 000000000..0a8d2de95 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/ContainerContext.java @@ -0,0 +1,216 @@ +package core.net.packet.context; + +import core.game.container.Container; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.Context; + +/** + * Represents the context for the container packet. + * @author Emperor + */ +public final class ContainerContext implements Context { + + /** + * The player. + */ + private Player player; + + /** + * The interface id. + */ + private final int interfaceId; + + /** + * The child id. + */ + private final int childId; + + /** + * The container type. + */ + private final int type; + + /** + * The items. + */ + private final Item[] items; + + /** + * The length of the array to send. + */ + private final int length; + + /** + * If the container should be split up. + */ + private final boolean split; + + /** + * The slots we're changing. + */ + private final int[] slots; + + /** + * If the container should be cleared. + */ + private boolean clear; + + /** + * Constructs a new {@code ContainerContext} {@code Object}. + * @param player The player. + * @param interfaceId The interface id. + * @param childId The child id. + * @param clear If the container should be cleared. + */ + public ContainerContext(Player player, int interfaceId, int childId, boolean clear) { + this(player, interfaceId, childId, 0, null, 1, false); + this.clear = clear; + } + + /** + * Constructs a new {@code ContainerContext} {@code Object}. + * @param player The player. + * @param interfaceId The interface id. + * @param childId The child id. + * @param type The container type. + * @param container The container. + * @param split If the container should be split. + */ + public ContainerContext(Player player, int interfaceId, int childId, int type, Container container, boolean split) { + this(player, interfaceId, childId, type, container.toArray(), container.toArray().length, split); + } + + /** + * Constructs a new {@code ContainerContext} {@code Object}. + * @param player The player. + * @param interfaceId The interface id. + * @param childId The child id. + * @param type The container type. + * @param items The items. + * @param split If the container should be split. + */ + public ContainerContext(Player player, int interfaceId, int childId, int type, Item[] items, boolean split) { + this(player, interfaceId, childId, type, items, items.length, split); + } + + /** + * Constructs a new {@code ContainerContext} {@code Object}. + * @param player The player. + * @param interfaceId The interface id. + * @param childId The child id. + * @param type The container type. + * @param items The items. + * @param length The length. + * @param split If the container should be split. + */ + public ContainerContext(Player player, int interfaceId, int childId, int type, Item[] items, int length, boolean split) { + this.player = player; + this.interfaceId = interfaceId; + this.childId = childId; + this.type = type; + this.items = items; + this.length = length; + this.split = split; + this.slots = null; + } + + /** + * Constructs a new {@code ContainerContext} {@code Object}. + * @param player The player. + * @param interfaceId The interface id. + * @param childId The child id. + * @param type The container type. + * @param items The items. + * @param split If the container should be split. + * @param slots The slots to update. + */ + public ContainerContext(Player player, int interfaceId, int childId, int type, Item[] items, boolean split, int... slots) { + this.player = player; + this.interfaceId = interfaceId; + this.childId = childId; + this.type = type; + this.items = items; + this.length = items.length; + this.split = split; + this.slots = slots; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the interfaceId. + * @return The interfaceId. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Gets the type. + * @return The type. + */ + public int getType() { + return type; + } + + /** + * Gets the items. + * @return The items. + */ + public Item[] getItems() { + return items; + } + + /** + * Gets the length. + * @return The length. + */ + public int getLength() { + return length; + } + + /** + * Gets the split. + * @return The split. + */ + public boolean isSplit() { + return split; + } + + /** + * Gets the slots. + * @return The slots. + */ + public int[] getSlots() { + return slots; + } + + /** + * Gets the childId. + * @return The childId. + */ + public int getChildId() { + return childId; + } + + /** + * Gets the clear. + * @return The clear. + */ + public boolean isClear() { + return clear; + } + + /** + * Sets the clear. + * @param clear The clear to set. + */ + public void setClear(boolean clear) { + this.clear = clear; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/DefaultContext.java b/Server/src/main/java/Server/core/net/packet/context/DefaultContext.java new file mode 100644 index 000000000..6d12eb5bc --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/DefaultContext.java @@ -0,0 +1,56 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * Represents a default context of a packet. + * @author 'Vexia + */ +public class DefaultContext implements Context { + /** + * Represents the {@link Player} instance. + */ + private Player player; + /** + * Represents the array of objects casted. + */ + private Object[] objects; + + /** + * Constructs a new {@code DefaultContext.java} {@code Object}. + * @param player the player. + * @param objects the objects. + */ + public DefaultContext(Player player, Object... objects) { + this.player = player; + this.objects = objects; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * @return the objects. + */ + public Object[] getObjects() { + return objects; + } + + /** + * @param player the player to set. + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * @param objects the objects to set. + */ + public void setObjects(Object[] objects) { + this.objects = objects; + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/context/DisplayModelContext.java b/Server/src/main/java/Server/core/net/packet/context/DisplayModelContext.java new file mode 100644 index 000000000..4910239a0 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/DisplayModelContext.java @@ -0,0 +1,174 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * Represents the player on interface context. + * @author Emperor + */ +public class DisplayModelContext implements Context { + + /** + * Represents the model types. + * @author Emperor + */ + public static enum ModelType { + PLAYER, NPC, ITEM, MODEL; + } + + /** + * The player reference. + */ + private final Player player; + + /** + * The model type. + */ + private final ModelType type; + + /** + * The node id. + */ + private final int nodeId; + + /** + * The amount (for item display). + */ + private int amount; + + /** + * The zoom. + */ + private int zoom; + + /** + * The interface id. + */ + private final int interfaceId; + + /** + * The child id. + */ + private final int childId; + + /** + * Construct a new {@code DisplayModelContext} {@code Object} used for + * displaying the player. + * @param player The player reference. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public DisplayModelContext(Player player, int interfaceId, int childId) { + this(player, ModelType.PLAYER, -1, 0, interfaceId, childId); + } + + /** + * Construct a new {@code DisplayModelContext} {@code Object} used for + * displaying an NPC. + * @param player The player reference. + * @param nodeId The node id to display. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public DisplayModelContext(Player player, int nodeId, int interfaceId, int childId) { + this(player, ModelType.NPC, nodeId, 0, interfaceId, childId); + } + + /** + * Construct a new {@code DisplayModelContext} {@code Object} used by the + * other constructors or for displaying an item. + * @param player The player reference. + * @param type The model type. + * @param nodeId The node id to display. + * @param amount The amount. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public DisplayModelContext(Player player, ModelType type, int nodeId, int amount, int interfaceId, int childId) { + this.player = player; + this.type = type; + this.nodeId = nodeId; + this.amount = amount; + this.interfaceId = interfaceId; + this.childId = childId; + } + + /** + * Construct a new {@code DisplayModelContext} {@code Object} used by the + * other constructors or for displaying an item. + * @param player The player reference. + * @param type The model type. + * @param nodeId The node id to display. + * @param interfaceId The interface id. + * @param childId The child id. + */ + public DisplayModelContext(Player player, ModelType type, int nodeId, int zoom, int interfaceId, int childId, Object... object) { + this.player = player; + this.type = type; + this.nodeId = nodeId; + this.setZoom(zoom); + this.interfaceId = interfaceId; + this.childId = childId; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the type. + * @return The type. + */ + public ModelType getType() { + return type; + } + + /** + * Gets the nodeId. + * @return The nodeId. + */ + public int getNodeId() { + return nodeId; + } + + /** + * Gets the amount. + * @return The amount. + */ + public int getAmount() { + return amount; + } + + /** + * Get the interface id. + * @return The interface id. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Get the child id. + * @return The child id. + */ + public int getChildId() { + return childId; + } + + /** + * @return the zoom. + */ + public int getZoom() { + return zoom; + } + + /** + * @param zoom the zoom to set. + */ + public void setZoom(int zoom) { + this.zoom = zoom; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/DynamicSceneContext.java b/Server/src/main/java/Server/core/net/packet/context/DynamicSceneContext.java new file mode 100644 index 000000000..7c2c5bf82 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/DynamicSceneContext.java @@ -0,0 +1,20 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; + +/** + * Represents the packet context for the build dynamic scene graph packet. + * @author Emperor + */ +public final class DynamicSceneContext extends SceneGraphContext { + + /** + * Constructs a new {@code DynamicSceneContext} {@code Object}. + * @param player The player. + * @param login If the player is logging in. + */ + public DynamicSceneContext(Player player, boolean login) { + super(player, login); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/GameMessageContext.java b/Server/src/main/java/Server/core/net/packet/context/GameMessageContext.java new file mode 100644 index 000000000..c807b68e5 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/GameMessageContext.java @@ -0,0 +1,44 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The game message packet context. + * @author Emperor + */ +public final class GameMessageContext implements Context { + + /** + * The player reference. + */ + private Player player; + + /** + * The game message. + */ + private String message; + + /** + * Construct a new {@code GameMessageContext} {@code Object}. + * @param player The player. + * @param message The game message. + */ + public GameMessageContext(Player player, String message) { + this.player = player; + this.message = message; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Get the game message. + * @return The game message. + */ + public String getMessage() { + return message; + } +} diff --git a/Server/src/main/java/Server/core/net/packet/context/GrandExchangeContext.java b/Server/src/main/java/Server/core/net/packet/context/GrandExchangeContext.java new file mode 100644 index 000000000..9caba3efa --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/GrandExchangeContext.java @@ -0,0 +1,52 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The packet context of the grand exchange update packet. + * @author Emperor + */ +public class GrandExchangeContext implements Context { + + /** + * The player. + */ + private final Player player; + + public final byte idx; + public final byte state; + public final short itemID; + public final boolean isSell; + public final int value; + public final int amt; + public final int completedAmt; + public final int totalCoinsExchanged; + + /** + * Constructs a new {@code GrandExchangeContext} {@code Object}. + * @param player The player. + * @param state + * @param itemID + * @param value + * @param amt + * @param completedAmt + * @param totalCoinsExchanged + */ + public GrandExchangeContext(Player player, byte idx, byte state, short itemID, boolean isSell, int value, int amt, int completedAmt, int totalCoinsExchanged) { + this.player = player; + this.idx = idx; + this.state = state; + this.itemID = itemID; + this.isSell = isSell; + this.value = value; + this.amt = amt; + this.completedAmt = completedAmt; + this.totalCoinsExchanged = totalCoinsExchanged; + } + + @Override + public Player getPlayer() { + return player; + } +} diff --git a/Server/src/main/java/Server/core/net/packet/context/HintIconContext.java b/Server/src/main/java/Server/core/net/packet/context/HintIconContext.java new file mode 100644 index 000000000..2902219d3 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/HintIconContext.java @@ -0,0 +1,198 @@ +package core.net.packet.context; + +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.net.packet.Context; + +/** + * Represents the hint icon packet context. + * @author Emperor + */ +public final class HintIconContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The hint icon slot. + */ + private final int slot; + + /** + * The target type. + */ + private int targetType; + + /** + * The arrow id. + */ + private int arrowId; + + /** + * The entity index. + */ + private final int index; + + /** + * The model id. + */ + private final int modelId; + + /** + * The location. + */ + private final Location location; + + /** + * The height. + */ + private int height; + + /** + * Constructs a new {@code HintIconContext} {@code Object}.
This hint + * icon is entity based. + * @param player The player. + * @param slot The hint icon slot. + * @param arrowId The arrow id. + * @param target The target. + * @param modelId The model id. + */ + public HintIconContext(Player player, int slot, int arrowId, Node target, int modelId) { + this(player, slot, arrowId, -1, target, modelId); + targetType = 2; + if (target instanceof Entity) { + targetType = target instanceof Player ? 10 : 1; + } + } + + /** + * Constructs a new {@code HintIconContext} {@code Object}.
This hint + * icon is entity based. + * @param player The player. + * @param slot The hint icon slot. + * @param arrowId The arrow id. + * @param targetType The target type. + * @param target The index of the entity. + * @param modelId The model id. + */ + public HintIconContext(Player player, int slot, int arrowId, int targetType, Node target, int modelId) { + this(player, slot, arrowId, targetType, target, modelId, 0); + } + + /** + * Constructs a new {@code HintIconContext} {@code Object}.
This hint + * icon is entity based. + * @param player The player. + * @param slot The hint icon slot. + * @param arrowId The arrow id. + * @param targetType The target type. + * @param target The index of the entity. + * @param modelId The model id. + * @param height The height. + */ + public HintIconContext(Player player, int slot, int arrowId, int targetType, Node target, int modelId, int height) { + this.player = player; + this.slot = slot; + this.targetType = targetType; + this.arrowId = arrowId; + this.modelId = modelId; + this.height = height; + if (target instanceof Entity) { + this.index = ((Entity) target).getIndex(); + this.location = null; + } else { + this.location = target.getLocation(); + this.index = -1; + } + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the slot. + * @return The slot. + */ + public int getSlot() { + return slot; + } + + /** + * Gets the targetType. + * @return The targetType. + */ + public int getTargetType() { + return targetType; + } + + /** + * Gets the arrowId. + * @return The arrowId. + */ + public int getArrowId() { + return arrowId; + } + + /** + * Gets the index. + * @return The index. + */ + public int getIndex() { + return index; + } + + /** + * Gets the modelId. + * @return The modelId. + */ + public int getModelId() { + return modelId; + } + + /** + * Gets the location. + * @return The location. + */ + public Location getLocation() { + return location; + } + + /** + * Sets the targetType. + * @param targetType The targetType to set. + */ + public void setTargetType(int targetType) { + this.targetType = targetType; + } + + /** + * Sets the arrowId. + * @param arrowId The arrowId to set. + */ + public void setArrowId(int arrowId) { + this.arrowId = arrowId; + } + + /** + * Gets the height. + * @return The height. + */ + public int getHeight() { + return height; + } + + /** + * Sets the height. + * @param height The height to set. + */ + public void setHeight(int height) { + this.height = height; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/IntegerContext.java b/Server/src/main/java/Server/core/net/packet/context/IntegerContext.java new file mode 100644 index 000000000..b30d2502a --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/IntegerContext.java @@ -0,0 +1,51 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The Integer context. + * @author 'Vexia + */ +public class IntegerContext implements Context { + + /** + * The player instance. + */ + private Player player; + + /** + * The integer value. + */ + private int integer; + + /** + * Constructs a new {@code IntegerContext.java} {@code Object}. + * @param player the player. + * @param integer the integer. + */ + public IntegerContext(Player player, int integer) { + this.player = player; + this.setInteger(integer); + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * @return the integer. + */ + public int getInteger() { + return integer; + } + + /** + * @param integer the integer to set. + */ + public void setInteger(int integer) { + this.integer = integer; + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/context/InteractionOptionContext.java b/Server/src/main/java/Server/core/net/packet/context/InteractionOptionContext.java new file mode 100644 index 000000000..c57fc6b64 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/InteractionOptionContext.java @@ -0,0 +1,74 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The context implementation used for the InteractionOption outgoing packet. + * @author Emperor + */ +public final class InteractionOptionContext implements Context { + + /** + * The player reference. + */ + private final Player player; + + /** + * The index. + */ + private final int index; + + private boolean remove = false; + + /** + * The name. + */ + private final String name; + + /** + * Constructs a new {@code InteractionOptionContext} {@code Object}. + * @param player The player. + * @param index The index. + * @param name The option name. + */ + public InteractionOptionContext(Player player, int index, String name) { + this.player = player; + this.index = index; + this.name = name; + this.remove = false; + } + + public InteractionOptionContext(Player player, int index, String name, boolean remove){ + this.player = player; + this.index = index; + this.name = name; + this.remove = remove; + } + + @Override + public Player getPlayer() { + return player; + } + + public boolean isRemove() { + return remove; + } + + /** + * Gets the index. + * @return The index. + */ + public int getIndex() { + return index; + } + + /** + * Gets the name. + * @return The name. + */ + public String getName() { + return name; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/InterfaceConfigContext.java b/Server/src/main/java/Server/core/net/packet/context/InterfaceConfigContext.java new file mode 100644 index 000000000..b31de8910 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/InterfaceConfigContext.java @@ -0,0 +1,74 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The interface config packet context. + * @author Emperor + */ +public class InterfaceConfigContext implements Context { + + /** + * The player reference. + */ + private Player player; + + /** + * The interface id. + */ + private int interfaceId; + + /** + * The child id. + */ + private int childId; + + /** + * If the interface child should be hidden. + */ + private boolean hide; + + /** + * Construct a new {@code InterfaceConfigContext} {@code Object}. + * @param player The player reference. + * @param interfaceId The interface id. + * @param childId The child id. + * @param hide If the component should be hidden. + */ + public InterfaceConfigContext(Player player, int interfaceId, int childId, boolean hide) { + this.player = player; + this.interfaceId = interfaceId; + this.childId = childId; + this.hide = hide; + } + + /** + * Get the interface id. + * @return The interface id. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Get the child id. + * @return The child id. + */ + public int getChildId() { + return childId; + } + + /** + * If is set. + * @return If is set {@code true}. + */ + public boolean isHidden() { + return hide; + } + + @Override + public Player getPlayer() { + return player; + } +} diff --git a/Server/src/main/java/Server/core/net/packet/context/InterfaceContext.java b/Server/src/main/java/Server/core/net/packet/context/InterfaceContext.java new file mode 100644 index 000000000..3fb157378 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/InterfaceContext.java @@ -0,0 +1,118 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The interface packet context. + * @author Emperor + */ +public final class InterfaceContext implements Context { + + /** + * The player. + */ + private Player player; + + /** + * The window id. + */ + private final int windowId; + + /** + * The component id. + */ + private int componentId; + + /** + * The interface id. + */ + private final int interfaceId; + + /** + * If the interface can be walked over. + */ + private final boolean walkable; + + /** + * Constructs a new {@code InterfaceContext} {@code Object}. + * @param player The player. + * @param windowId The window id. + * @param componentId The window component id. + * @param interfaceId The interface id. + * @param walkable If we can walk over the interface. + */ + public InterfaceContext(Player player, int windowId, int componentId, int interfaceId, boolean walkable) { + this.player = player; + this.windowId = windowId; + this.componentId = componentId; + this.interfaceId = interfaceId; + this.walkable = walkable; + } + + /** + * Transforms this context for the new player & id. + * @param player The player. + * @param id The new interface id. + * @return The interface context created. + */ + public InterfaceContext transform(Player player, int id) { + return new InterfaceContext(player, windowId, componentId, id, walkable); + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Sets the player. + * @param player The player. + * @return This context instance. + */ + public Context setPlayer(Player player) { + this.player = player; + return this; + } + + /** + * Gets the windowId. + * @return The windowId. + */ + public int getWindowId() { + return windowId; + } + + /** + * Sets the component id. + * @param componentId The component id. + */ + public void setComponentId(int componentId) { + this.componentId = componentId; + } + + /** + * Gets the componentId. + * @return The componentId. + */ + public int getComponentId() { + return componentId; + } + + /** + * Gets the interfaceId. + * @return The interfaceId. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Gets the walkable. + * @return The walkable. + */ + public boolean isWalkable() { + return walkable; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/LocationContext.java b/Server/src/main/java/Server/core/net/packet/context/LocationContext.java new file mode 100644 index 000000000..d683469b0 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/LocationContext.java @@ -0,0 +1,61 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.net.packet.Context; + +/** + * Packet context used for location based packets. + * @author Emperor + */ +public final class LocationContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The location. + */ + private final Location location; + + /** + * If the location update is flagged as a teleport. + */ + private final boolean teleport; + + /** + * Constructs a new {@code LocationContext} {@code Object}. + * @param player The player. + * @param location The location. + * @param teleport If the location update is flagged as a teleport. + */ + public LocationContext(Player player, Location location, boolean teleport) { + this.player = player; + this.location = location; + this.teleport = teleport; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the location. + * @return The location. + */ + public Location getLocation() { + return location; + } + + /** + * Gets the teleport. + * @return The teleport. + */ + public boolean isTeleport() { + return teleport; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/MessageContext.java b/Server/src/main/java/Server/core/net/packet/context/MessageContext.java new file mode 100644 index 000000000..ecc514c31 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/MessageContext.java @@ -0,0 +1,119 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.net.packet.Context; + +/** + * Packet context for communication message packets. + * @author Emperor + */ +public final class MessageContext implements Context { + + /** + * Represents the packet id to use when sending a message. + */ + public static final int SEND_MESSAGE = 71; + + /** + * Represents the packet id to use when receiving a message. + */ + public static final int RECIEVE_MESSAGE = 0; + + /** + * Represents the packet id use to send a clan message. + */ + public static final int CLAN_MESSAGE = 54; + + /** + * The player. + */ + private final Player player; + + /** + * The other player. + */ + private final String other; + + /** + * The chat icon. + */ + private final int chatIcon; + + /** + * The opcode. + */ + private final int opcode; + + /** + * The message. + */ + private final String message; + + /** + * Constructs a new MessageContext Object. + * @param player The player. + * @param other The communicated player. + * @param opcode The opcode. + * @param message The message. + */ + public MessageContext(Player player, Player other, int opcode, String message) { + this.player = player; + this.other = other.getName(); + this.chatIcon = Rights.getChatIcon(other); + this.opcode = opcode; + this.message = message; + } + + /** + * Constructs a new MessageContext Object. + * @param player The player. + * @param other The communicated player. + * @param opcode The opcode. + * @param message The message. + */ + public MessageContext(Player player, String other, int chatIcon, int opcode, String message) { + this.player = player; + this.other = other; + this.chatIcon = chatIcon; + this.opcode = opcode; + this.message = message; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the other. + * @return The other. + */ + public String getOther() { + return other; + } + + /** + * Gets the opcode. + * @return The opcode. + */ + public int getOpcode() { + return opcode; + } + + /** + * Gets the message. + * @return The message. + */ + public String getMessage() { + return message; + } + + /** + * Gets the chatIcon. + * @return the chatIcon + */ + public int getChatIcon() { + return chatIcon; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/MinimapStateContext.java b/Server/src/main/java/Server/core/net/packet/context/MinimapStateContext.java new file mode 100644 index 000000000..6b0441c0d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/MinimapStateContext.java @@ -0,0 +1,45 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * Represents the context used for the Minimap State packet. + * @author Emperor + */ +public class MinimapStateContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The minimap state to set. + */ + private final int state; + + /** + * Constructs a new {@code MinimapStateContext} {@code Object}. + * @param player The player. + * @param state The minimap state to set. + */ + public MinimapStateContext(Player player, int state) { + this.player = player; + this.state = state; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the state. + * @return The state. + */ + public int getState() { + return state; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/MusicContext.java b/Server/src/main/java/Server/core/net/packet/context/MusicContext.java new file mode 100644 index 000000000..c19336a6b --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/MusicContext.java @@ -0,0 +1,78 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * Packet context for music. + * @author Emperor + * @author SonicForce41 + */ +public class MusicContext implements Context { + + /** + * The Player + */ + private Player player; + + /** + * The music Id + */ + private int musicId; + + /** + * The secondary music type. + */ + private boolean secondary; + + /** + * Constructs a new {@code MusicContext} {@code Object}. + * @param player The player. + * @param musicId The music id. + */ + public MusicContext(Player player, int musicId) { + this(player, musicId, false); + } + + /** + * Constructs a new {@code MusicContext} {@code Object}. + * @param player The player. + * @param musicId The music id. + * @param temporary The temporary music type. + */ + public MusicContext(Player player, int musicId, boolean temporary) { + this.player = player; + this.musicId = musicId; + this.secondary = temporary; + } + + /** + * Gets the Music Id + * @return the musicId + */ + public final int getMusicId() { + return musicId; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the secondary. + * @return The secondary. + */ + public boolean isSecondary() { + return secondary; + } + + /** + * Sets the secondary. + * @param secondary The secondary to set. + */ + public void setSecondary(boolean secondary) { + this.secondary = secondary; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/PlayerContext.java b/Server/src/main/java/Server/core/net/packet/context/PlayerContext.java new file mode 100644 index 000000000..bf700e956 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/PlayerContext.java @@ -0,0 +1,30 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The default packet context. + * @author Emperor + */ +public final class PlayerContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * Constructs a new {@code PlayerContext} {@code Object}. + * @param player The player. + */ + public PlayerContext(Player player) { + this.player = player; + } + + @Override + public Player getPlayer() { + return player; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/PositionedGraphicContext.java b/Server/src/main/java/Server/core/net/packet/context/PositionedGraphicContext.java new file mode 100644 index 000000000..d26116617 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/PositionedGraphicContext.java @@ -0,0 +1,60 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.Context; + +/** + * The packet context for the positioned graphic packet. + * @author Emperor + */ +public final class PositionedGraphicContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The graphics. + */ + private final Graphics graphic; + + /** + * The location. + */ + private final Location location; + + /** + * Constructs a new {@code PositionedGraphicContext} {@code Object}. + * @param player The player. + * @param graphic The graphic to display on the given location. + * @param location The location to display the graphic on. + */ + public PositionedGraphicContext(Player player, Graphics graphic, Location location) { + this.player = player; + this.graphic = graphic; + this.location = location; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * @return the graphic + */ + public Graphics getGraphic() { + return graphic; + } + + /** + * @return the location + */ + public Location getLocation() { + return location; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/RunScriptContext.java b/Server/src/main/java/Server/core/net/packet/context/RunScriptContext.java new file mode 100644 index 000000000..295bf381a --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/RunScriptContext.java @@ -0,0 +1,84 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The run script packet context. + * @author Emperor + */ +public class RunScriptContext implements Context { + + /** + * The player reference. + */ + private Player player; + + /** + * The run script id. + */ + private int id; + + /** + * The parameters. + */ + private Object[] objects; + + /** + * The string. + */ + private String string; + + /** + * Construct a new {@code RunScriptContext} {@code Object}. + * @param player + * @param id + * @param string + * @param objects + */ + public RunScriptContext(Player player, int id, String string, Object... objects) { + this.player = player; + this.id = id; + this.objects = objects; + this.string = string; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Sets the player. + * @param player The player. + * @return This context instance. + */ + public Context setPlayer(Player player) { + this.player = player; + return this; + } + + /** + * Get the run scripts id. + * @return The run scripts id. + */ + public int getId() { + return id; + } + + /** + * Get the objects. + * @return The objects. + */ + public Object[] getObjects() { + return objects; + } + + /** + * Get the string. + * @return The string. + */ + public String getString() { + return string; + } +} diff --git a/Server/src/main/java/Server/core/net/packet/context/SceneGraphContext.java b/Server/src/main/java/Server/core/net/packet/context/SceneGraphContext.java new file mode 100644 index 000000000..25783cbfd --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/SceneGraphContext.java @@ -0,0 +1,45 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The update scene graph packet context. + * @author Emperor + */ +public class SceneGraphContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * If we are logging in. + */ + private final boolean login; + + /** + * Constructs a new {@code SceneGraphContext} {@code Object}. + * @param player The player. + * @param login If we are logging in. + */ + public SceneGraphContext(Player player, boolean login) { + this.player = player; + this.login = login; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the login. + * @return The login. + */ + public boolean isLogin() { + return login; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/SkillContext.java b/Server/src/main/java/Server/core/net/packet/context/SkillContext.java new file mode 100644 index 000000000..d35960674 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/SkillContext.java @@ -0,0 +1,45 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The skill context. + * @author Emperor + */ +public final class SkillContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The skill id. + */ + private final int skillId; + + /** + * Constructs a new {@code SkillContext} {@code Object}. + * @param player The player. + * @param skillId The skill id. + */ + public SkillContext(Player player, int skillId) { + this.player = player; + this.skillId = skillId; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the skillId. + * @return The skillId. + */ + public int getSkillId() { + return skillId; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/StringContext.java b/Server/src/main/java/Server/core/net/packet/context/StringContext.java new file mode 100644 index 000000000..b311ef0a6 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/StringContext.java @@ -0,0 +1,74 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * The StringPacket packet context. + * @author Emperor + */ +public class StringContext implements Context { + + /** + * The player reference. + */ + private Player player; + + /** + * The StringPacket string. + */ + private String string; + + /** + * The interface id. + */ + private int interfaceId; + + /** + * The line id. + */ + private int lineId; + + /** + * Constructs a new {@code StringContext} {@code Object}. + * @param player The player. + * @param string The string to send. + * @param interfaceId The interface id. + * @param lineId The child id. + */ + public StringContext(Player player, String string, int interfaceId, int lineId) { + this.player = player; + this.string = string; + this.interfaceId = interfaceId; + this.lineId = lineId; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Get the StringPacket string. + * @return The string. + */ + public String getString() { + return string; + } + + /** + * Get the interface id. + * @return The interface id. + */ + public int getInterfaceId() { + return interfaceId; + } + + /** + * Gets the line id. + * @return The line id. + */ + public int getLineId() { + return lineId; + } +} diff --git a/Server/src/main/java/Server/core/net/packet/context/SystemUpdateContext.java b/Server/src/main/java/Server/core/net/packet/context/SystemUpdateContext.java new file mode 100644 index 000000000..5e6ab110f --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/SystemUpdateContext.java @@ -0,0 +1,51 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * Represents a system update. + * @author 'Vexia + */ +public class SystemUpdateContext implements Context { + + /** + * The Player instance. + */ + private Player player; + + /** + * The time. + */ + private int time; + + /** + * Constructs a new {@code SystemUpdateContext.java} {@code Object}. + * @param player the Player. + * @param time the time. + */ + public SystemUpdateContext(Player player, int time) { + this.player = player; + this.setTime(time); + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * @return the time + */ + public int getTime() { + return time; + } + + /** + * @param time the time to set + */ + public void setTime(int time) { + this.time = time; + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/context/WalkOptionContext.java b/Server/src/main/java/Server/core/net/packet/context/WalkOptionContext.java new file mode 100644 index 000000000..e95546cfc --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/WalkOptionContext.java @@ -0,0 +1,45 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * Represents the set walk-to option context. + * @author Emperor + */ +public final class WalkOptionContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The option. + */ + private final String option; + + /** + * Constructs a new {@code WalkOptionContext} {@code Object}. + * @param player The player. + * @param option The option name. + */ + public WalkOptionContext(Player player, String option) { + this.player = player; + this.option = option; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the option. + * @return The option. + */ + public String getOption() { + return option; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/context/WindowsPaneContext.java b/Server/src/main/java/Server/core/net/packet/context/WindowsPaneContext.java new file mode 100644 index 000000000..03bba3e9d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/context/WindowsPaneContext.java @@ -0,0 +1,60 @@ +package core.net.packet.context; + +import core.game.node.entity.player.Player; +import core.net.packet.Context; + +/** + * Represents the windows pane packet context. + * @author Emperor + */ +public final class WindowsPaneContext implements Context { + + /** + * The player. + */ + private final Player player; + + /** + * The window id. + */ + private final int windowId; + + /** + * The type. + */ + private final int type; + + /** + * Constructs a new {@code WindowsPaneContext} object. + * @param player The player. + * @param windowId The window id. + * @param type The type. + */ + public WindowsPaneContext(Player player, int windowId, int type) { + this.player = player; + this.windowId = windowId; + this.type = type; + } + + @Override + public Player getPlayer() { + return player; + } + + /** + * Gets the windowId. + * @return The windowId. + */ + public int getWindowId() { + return windowId; + } + + /** + * Gets the type. + * @return The type. + */ + public int getType() { + return type; + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/in/ActionButtonPacket.java b/Server/src/main/java/Server/core/net/packet/in/ActionButtonPacket.java new file mode 100644 index 000000000..1b8d512cd --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/ActionButtonPacket.java @@ -0,0 +1,342 @@ +package core.net.packet.in; + +import core.game.component.Component; +import core.game.component.ComponentPlugin; +import core.game.container.Container; +import core.game.content.dialogue.DialogueAction; +import core.game.interaction.Option; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.login.LoginConfiguration; +import core.game.node.entity.player.link.request.assist.AssistSession; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +import java.util.List; + +/** + * The incoming reward button packet. + * @author Emperor + */ +public class ActionButtonPacket implements IncomingPacket { + + @Override + public void decode(final Player player, int opcode, IoBuffer buffer) { + if (player == null) { + return; + } + int[] args = getArguments(player, buffer); + if (args == null || (buffer.opcode() != 76 && args[0] != 106 && args[0] != 108 && args[0] != 110 && args[0] != 646 && player.getLocks().isComponentLocked() && player.getExtension(AssistSession.class) == null)) { + player.debug("Check this code in reward button packet, where args arent null && opcode !="); + return; + } + int componentId = args[0]; + int buttonId = args[1]; + int slot = args[2]; + int itemId = args[3]; + player.debug("Component=" + componentId + ", button=" + buttonId + ", slot=" + slot + ", item=" + itemId + ", opcode=" + buffer.opcode()); + if (player.getDialogueInterpreter().getDialogue() != null && buffer.opcode() != 132 && componentId != 64) { + player.getDialogueInterpreter().close(); + } + if (player.getLocks().isComponentLocked()) { + return; + } + if (itemId > -1 && slot > -1) { + Container container = getContainer(player, componentId); + if (container != null) { + handleItemInteraction(player, buffer.opcode(), itemId, slot, container); + return; + } + } + if (player.getZoneMonitor().clickButton(componentId, buttonId, slot, itemId, opcode)) { + return; + } + Component c = player.getInterfaceManager().getComponent(componentId); + if (c == null || c.isHidden()) { + player.debug("Component " + c + " wasn't opened in interface manager."); + return; + } + ComponentPlugin plugin = c.getPlugin(); + if (plugin != null) { + player.debug("Component plugin = " + plugin.getClass().getSimpleName()); + plugin.handle(player, c, buffer.opcode(), buttonId, slot, itemId); + } + } + + /** + * Gets the container for the component id. + * @param player The player. + * @param componentId The component id. + * @return The container. + */ + private Container getContainer(Player player, int componentId) { + switch (componentId) { + case 149: + return player.getInventory(); + } + return null; + } + + /** + * Gets the arguments for the reward button. + * @param player The player. + * @param buffer The buffer. + * @return The arguments [component, button, slot, item] + */ + private static int[] getArguments(final Player player, IoBuffer buffer) { + int data = -1; + int componentId = -1; + int buttonId = -1; + int itemId = -1; + int slot = -1; + switch (buffer.opcode()) { + case 81: + //System.out.println("Using action handler81"); + slot = buffer.getShortA(); + itemId = buffer.getShort(); + buttonId = buffer.getShort(); + componentId = buffer.getShort(); + break; + case 156: + //System.out.println("Using action handler156"); + slot = buffer.getLEShortA(); + itemId = buffer.getShortA(); + data = buffer.getLEInt(); + componentId = data >> 16; + buttonId = data & 0xffff; + break; + case 55: + //System.out.println("Using action handler55"); + itemId = buffer.getLEShort(); + slot = buffer.getShortA(); + data = buffer.getIntA(); + componentId = data >> 16; + buttonId = data & 0xffff; + break; + case 153: + //System.out.println("Using action handler153"); + data = buffer.getLEInt(); + slot = buffer.getLEShort(); + itemId = buffer.getLEShort(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xFFFF; + break; + case 161: + //System.out.println("Using action handler161"); + data = buffer.getLEInt(); + itemId = buffer.getLEShortA(); + slot = buffer.getLEShortA(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xFFFF; + break; + case 135: + //System.out.println("Using action handler135"); + itemId = buffer.getShortA(); + slot = buffer.getShortA(); + data = buffer.getIntB(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xFFFF; + break; + case 155: //Interface options + case 196: + case 124: + case 199: + case 234: + case 168: + case 166: + case 64: + case 53: + case 9: + //System.out.println("Using action handler155-9"); + data = buffer.getInt(); + slot = buffer.getShort(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xFFFF; + break; + case 132: //Dialogue options + //System.out.println("Using action handler132"); + data = buffer.getIntA(); + slot = buffer.getLEShort(); + componentId = data >> 16; + buttonId = data & 0xffff; + if (player.getDialogueInterpreter().getDialogue() == null && player.getDialogueInterpreter().getDialogueStage() == null) { + player.getInterfaceManager().closeChatbox(); + List actions = player.getDialogueInterpreter().getActions(); + if (actions.size() > 0) { + DialogueAction action = actions.get(0); + action.handle(player, buttonId); + actions.remove(action); + } + break; + } + player.getDialogueInterpreter().handle(componentId, buttonId); + break; + case 133: + //System.out.println("Using action handler133"); + data = buffer.getLEInt(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xFFFF; + slot = buffer.getShort(); + itemId = buffer.getLEShortA(); + break; + case 206: + //System.out.println("Using action handler206"); + itemId = buffer.getShortA(); + slot = buffer.getLEShort(); + data = buffer.getLEInt(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xFFFF; + //player.sendMessage("itemId=" + itemId + ", data=" + data + ", buttonId=" + buttonId + ", compId= " + componentId); + break; + case 230: // Short + case 180: + case 10: + //System.out.println("Using action handler230-10"); + data = buffer.getInt(); + componentId = data >> 16; + buttonId = data & 0xffff; + if (buffer.opcode() == 230) { + slot = buffer.getShort(); + } + if (componentId == 49) { + if (player.getDialogueInterpreter().getDialogue() == null && player.getDialogueInterpreter().getDialogueStage() == null) { + player.setAttribute("chatbox-buttonid",buttonId); + player.getInterfaceManager().closeChatbox(); + return null; + } + player.setAttribute("chatbox-buttonid",buttonId); + player.getDialogueInterpreter().getDialogue().handle(componentId, buttonId); + } + break; + case 157: + //System.out.println("Using action handler157"); + itemId = buffer.getLEShort(); + slot = buffer.getLEShort(); + data = buffer.getLEInt(); + componentId = data >> 16; + buttonId = data & 0xffff; + break; + case 39: + //System.out.println("Using action handler39"); + data = buffer.getInt(); + slot = buffer.getShort(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xFFFF; + break; + case 128: + //System.out.println("Using action handler128"); + data = buffer.getInt(); + slot = buffer.getShort(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xffff; + break; + case 235: + //System.out.println("Using action handler235"); + data = buffer.getInt(); + slot = buffer.getShort(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xffff; + break; + case 243: + //System.out.println("Using action handler243"); + data = buffer.getInt(); + itemId = buffer.getShortA(); + slot = buffer.getLEShortA(); + componentId = data >> 16; + buttonId = data & 0xffff; + break; + case 170: + //System.out.println("Using action handler170"); + slot = buffer.getLEShort(); + itemId = buffer.getShortA(); + data = buffer.getLEInt(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xFFFF; + break; + case 145: + //System.out.println("Using action handler145"); + data = buffer.getIntB(); + itemId = buffer.getShortA(); + slot = buffer.getLEShort(); + componentId = (data >> 16) & 0xFFFF; + buttonId = data & 0xffff; + // TODO dialogue with store X. + break; + case 127:// 3rd option on send item. + case 203:// 5th option on send item. + case 205:// 2 option + case 211:// 4rth option on send item. + case 187: // 6th + //System.out.println("Using action handler127-187"); + data = buffer.getInt(); + slot = buffer.getShort(); + componentId = data >> 16; + buttonId = data & 0xffff; + itemId = -1; + break; + case 184: + case 95: + //System.out.println("Using action handler184-95"); + if (player.getAttribute("logging_in") != null) { + player.getInterfaceManager().close(); + GameWorld.getPulser().submit(new Pulse(1, player) { + @Override + public boolean pulse() { + player.removeAttribute("logging_in"); + LoginConfiguration.configureGameWorld(player); + return true; + } + }); + } + player.getInterfaceManager().close(); + if (player.getAttribute("worldMap:viewing") != null) { + player.removeAttribute("worldMap:viewing"); + player.getPacketDispatch().sendWindowsPane(player.getInterfaceManager().isResizable() ? 746 : 548, 2); + player.unlock(); + } + break; + } + return new int[] { componentId, buttonId, slot, itemId }; + } + + /** + * Handles an item interaction. + * @param player The player. + * @param opcode The opcode. + * @param itemId The item. + */ + private static void handleItemInteraction(Player player, int opcode, int itemId, int slot, Container container) { + if (slot < 0 || slot >= container.capacity()) { + return; + } + Item item = container.get(slot); + if (item == null || item.getId() != itemId) { + return; + } + int index = 0; + switch (opcode) { + case 156: // First option + index = 0; + break; + case 55: // Second option (wield/wear) + index = 1; + break; + case 153: // Third option + index = 2; + break; + case 161: // Fourth option (summon) + index = 3; + break; + case 135: // Fifth option (drop/destroy) + index = 4; + break; + } + final Option option = item.getInteraction().get(index); + if (option == null || player.getLocks().isInteractionLocked()) { + return; + } + item.getInteraction().handleItemOption(player, option, container); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/CameraMovementPacket.java b/Server/src/main/java/Server/core/net/packet/in/CameraMovementPacket.java new file mode 100644 index 000000000..4f1f00e55 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/CameraMovementPacket.java @@ -0,0 +1,19 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Handles an incoming camera movement changed packet. + * @author Emperor + */ +public final class CameraMovementPacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + buffer.getShortA(); + buffer.getLEShort(); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/ChatPacket.java b/Server/src/main/java/Server/core/net/packet/in/ChatPacket.java new file mode 100644 index 000000000..78b2e5434 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/ChatPacket.java @@ -0,0 +1,57 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.game.system.monitor.PlayerMonitor; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.update.flag.context.ChatMessage; +import core.game.world.update.flag.player.ChatFlag; +import core.net.amsc.MSPacketRepository; +import core.net.amsc.WorldCommunicator; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.tools.StringUtils; + +/** + * Represents the incoming chat packet. + * @author Emperor + */ +public class ChatPacket implements IncomingPacket { + + @Override + public void decode(final Player player, int opcode, IoBuffer buffer) { + try { + final int effects = buffer.getShort(); + final int numChars = buffer.getSmart(); + final String message = StringUtils.decryptPlayerChat(buffer, numChars); + if (player.getDetails().isMuted()) { + player.getPacketDispatch().sendMessage("You have been " + (player.getDetails().isPermMute() ? "permanently" : "temporarily") + " muted due to breaking a rule."); + return; + } + if (message.startsWith("/") && player.getCommunication().getClan() != null) { + StringBuilder sb = new StringBuilder(message); + sb.append(" => ").append(player.getName()).append(" (owned by ").append(player.getCommunication().getClan().getOwner()).append(")"); + String m = sb.toString(); + player.getMonitor().log(m.replace(m.charAt(0), ' ').trim(), PlayerMonitor.CLAN_CHAT_LOG); + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendClanMessage(player, message.substring(1)); + } else { + player.getCommunication().getClan().message(player, message.substring(1)); + } + return; + } + player.getMonitor().log(message, PlayerMonitor.PUBLIC_CHAT_LOG); + ChatMessage ctx = new ChatMessage(player, message, effects, numChars); + GameWorld.getPulser().submit(new Pulse(0, player) { + @Override + public boolean pulse() { + player.getUpdateMasks().register(new ChatFlag(ctx)); + return true; + } + }); + } catch (Throwable t) { + t.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/ChatSettingsPacket.java b/Server/src/main/java/Server/core/net/packet/in/ChatSettingsPacket.java new file mode 100644 index 000000000..c0fa1b0f7 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/ChatSettingsPacket.java @@ -0,0 +1,26 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.amsc.MSPacketRepository; +import core.net.amsc.WorldCommunicator; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Handles an incoming chat settings update packet. + * @author Emperor + */ +public final class ChatSettingsPacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + int publicSetting = buffer.get(); + int privateSetting = buffer.get(); + int tradeSetting = buffer.get(); + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendChatSetting(player, publicSetting, privateSetting, tradeSetting); + } + player.getSettings().updateChatSettings(publicSetting, privateSetting, tradeSetting); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/ClanPacketHandler.java b/Server/src/main/java/Server/core/net/packet/in/ClanPacketHandler.java new file mode 100644 index 000000000..98a78e3c8 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/ClanPacketHandler.java @@ -0,0 +1,72 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.game.system.communication.ClanRank; +import core.game.system.communication.ClanRepository; +import core.game.system.communication.CommunicationInfo; +import core.game.world.repository.Repository; +import core.net.amsc.MSPacketRepository; +import core.net.amsc.WorldCommunicator; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.tools.StringUtils; + +/** + * Handles incoming clan packets. + * @author Emperor + */ +public class ClanPacketHandler implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + switch (buffer.opcode()) { + case 104: + long nameLong = buffer.getLong(); + String name = StringUtils.longToString(nameLong); + if (nameLong != 0l) { + player.getPacketDispatch().sendMessage("Attempting to join channel...:clan:"); + } + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendJoinClan(player, name); + return; + } + if (player.getCommunication().getClan() != null) { + player.getCommunication().getClan().leave(player, true); + player.getCommunication().setClan(null); + return; + } + ClanRepository clan = ClanRepository.get(name); + if (clan == null || clan.getName().equals("Chat disabled")) { + player.getPacketDispatch().sendMessage("The channel you tried to join does not exist."); + break; + } + if (clan.enter(player)) { + player.getCommunication().setClan(clan); + } + break; + case 188: + int rank = buffer.getA(); + name = StringUtils.longToString(buffer.getLong()); + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendContactUpdate(player.getName(), name, false, false, ClanRank.values()[rank + 1]); + break; + } + CommunicationInfo.updateClanRank(player, name, ClanRank.values()[rank + 1]); + break; + case 162: + name = StringUtils.longToString(buffer.getLong()); + if (WorldCommunicator.isEnabled()) { + MSPacketRepository.sendClanKick(player.getName(), name); + break; + } + clan = player.getCommunication().getClan(); + Player target = Repository.getPlayerByName(name); + if (clan == null || target == null) { + break; + } + clan.kick(player, target); + break; + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/ClientFocusPacket.java b/Server/src/main/java/Server/core/net/packet/in/ClientFocusPacket.java new file mode 100644 index 000000000..95b9b60c6 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/ClientFocusPacket.java @@ -0,0 +1,20 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Handles an incoming client focus changed packet. + * @author Emperor + */ +public final class ClientFocusPacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + if (player != null) { + player.getMonitor().setClientFocus(buffer.get() == 1); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/CommandPacket.java b/Server/src/main/java/Server/core/net/packet/in/CommandPacket.java new file mode 100644 index 000000000..3a299895e --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/CommandPacket.java @@ -0,0 +1,35 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.game.system.command.CommandSystem; +import core.game.system.monitor.PlayerMonitor; +import core.game.world.GameWorld; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Handles an incoming command packet. + * @author Emperor + * @author 'Vexia + */ +public final class CommandPacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + final int data = buffer.get(); + if (buffer.toByteBuffer().hasRemaining()) { + final String message = ((char) data + buffer.getString()).toLowerCase(); + if (!GameWorld.getSettings().isDevMode()) { + int last = player.getAttribute("commandLast", 0); + if (last > GameWorld.getTicks()) { + return; + } + player.setAttribute("commandLast", GameWorld.getTicks() + 1); + } + if (CommandSystem.Companion.getCommandSystem().parse(player, message)) { + player.getMonitor().log(message, PlayerMonitor.COMMAND_LOG); + } + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/CommunicationPacket.java b/Server/src/main/java/Server/core/net/packet/in/CommunicationPacket.java new file mode 100644 index 000000000..a4a26805b --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/CommunicationPacket.java @@ -0,0 +1,43 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.game.system.communication.CommunicationInfo; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.tools.StringUtils; + +/** + * Represents the packet used to handle all incoming packets related to + * communication. + * @author 'Vexia + */ +public final class CommunicationPacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + switch (buffer.opcode()) { + case 120: + CommunicationInfo.add(player, StringUtils.longToString(buffer.getLong())); + break; + case 57: + CommunicationInfo.remove(player, StringUtils.longToString(buffer.getLong()), false); + break; + case 34: + CommunicationInfo.block(player, StringUtils.longToString(buffer.getLong())); + break; + case 213: + CommunicationInfo.remove(player, StringUtils.longToString(buffer.getLong()), true); + break; + case 201: + String name = StringUtils.longToString(buffer.getLong()); + String message = StringUtils.decryptPlayerChat(buffer, buffer.get() & 0xFF); + if (player.getDetails().isMuted()) { + player.getPacketDispatch().sendMessage("You have been " + (player.getDetails().isPermMute() ? "permanently" : "temporarily") + " muted due to breaking a rule."); + return; + } + CommunicationInfo.sendMessage(player, name, message); + break; + } + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/in/DisplayUpdatePacket.java b/Server/src/main/java/Server/core/net/packet/in/DisplayUpdatePacket.java new file mode 100644 index 000000000..4b8ed425d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/DisplayUpdatePacket.java @@ -0,0 +1,26 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Handles the display update packet. + * @author Emperor + * + */ +public class DisplayUpdatePacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + int windowMode = buffer.get(); //Window mode + int screenWidth = buffer.getShort(); + int screenHeight = buffer.getShort(); + int displayMode = buffer.get(); //Display mode + player.getSession().getClientInfo().setScreenWidth(screenWidth); + player.getSession().getClientInfo().setScreenHeight(screenHeight); + player.getSession().getClientInfo().setDisplayMode(displayMode); + player.getInterfaceManager().switchWindowMode(windowMode); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/DummyPacket.java b/Server/src/main/java/Server/core/net/packet/in/DummyPacket.java new file mode 100644 index 000000000..349ccd10e --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/DummyPacket.java @@ -0,0 +1,13 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +public class DummyPacket implements IncomingPacket { + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + SystemLogger.logInfo("Received opcode " + opcode + " packet."); + } +} diff --git a/Server/src/main/java/Server/core/net/packet/in/ExaminePacket.java b/Server/src/main/java/Server/core/net/packet/in/ExaminePacket.java new file mode 100644 index 000000000..076e8befd --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/ExaminePacket.java @@ -0,0 +1,76 @@ +package core.net.packet.in; + +import core.cache.Cache; +import core.cache.def.impl.ItemDefinition; +import core.cache.def.impl.NPCDefinition; +import core.cache.def.impl.ObjectDefinition; +import core.cache.def.impl.VarbitDefinition; +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +import java.util.Arrays; + +/** + * Handles the incoming examine packets. + * @author Emperor + */ +public final class ExaminePacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + String name; + switch (buffer.opcode()) { + case 94: // Object examine + int id = buffer.getLEShortA(); + if (id < 0 || id > Cache.getObjectDefinitionsSize()) { + break; + } + ObjectDefinition d = ObjectDefinition.forId(id); + name = d.getExamine(); + //String coords = id + ", " + player.getLocation().getX() + ", " + player.getLocation().getY() + ", " + player.getLocation().getZ(); + player.debug("Object id: " + id + ", models: " + (d.getModelIds() != null ? Arrays.toString(d.getModelIds()) : null) + ", anim: " + d.animationId + ", config: " + (d.getVarbitID() != -1 ? d.getVarbitID() + " (file)" : d.getConfigId()) + "."); + player.debug("Varp config index: " + VarbitDefinition.forObjectID(d.getVarbitID()).getConfigId()); + player.getPacketDispatch().sendMessage(""+name+""); + /*if { + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection("LandscapeParser.removeGameObject(new GameObject("+coords+"));//"+ d.getName() ), null); + }*/ + break; + case 235: + case 92: // Item examine + id = buffer.getLEShortA(); + if (id < 0 || id > Cache.getItemDefinitionsSize()) { + break; + } + player.getPacketDispatch().sendMessage(getItemExamine(id)); + break; + case 72: // NPC examine + id = buffer.getShort(); + if (id < 0 || id > Cache.getNPCDefinitionsSize()) { + break; + } + player.debug("NPC id: " + id + "."); + NPCDefinition def = NPCDefinition.forId(id); + if (def == null) { + break; + } + player.getPacketDispatch().sendMessage(def.getExamine()); + break; + } + } + + /** + * Gets the item examine. + * @param id the id. + * @return the name. + */ + public static String getItemExamine(int id) { + if (id == 995) { + return "Lovely money!"; + } + if (ItemDefinition.forId(id).getExamine().length() == 255) { + return "A set of instructions to be followed."; + } + return ItemDefinition.forId(id).getExamine(); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/GrandExchangePacket.java b/Server/src/main/java/Server/core/net/packet/in/GrandExchangePacket.java new file mode 100644 index 000000000..96a82b5e6 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/GrandExchangePacket.java @@ -0,0 +1,20 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Represents the Incoming packet of the grand exchange. + * @author Emperor + */ +public class GrandExchangePacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + int itemId = buffer.getShort(); + player.getPlayerGrandExchange().constructBuy(itemId); + player.getInterfaceManager().closeChatbox(); + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/in/IdlePacketHandler.java b/Server/src/main/java/Server/core/net/packet/in/IdlePacketHandler.java new file mode 100644 index 000000000..7da242108 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/IdlePacketHandler.java @@ -0,0 +1,26 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import plugin.ai.general.GeneralBotCreator; + +/** + * Handles the idle packet handler. + * @author Emperor + */ +public final class IdlePacketHandler implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + if (player.getDetails().getRights() != Rights.ADMINISTRATOR) { + GeneralBotCreator.BotScriptPulse pulse = player.getAttribute("botting:script",null); + if(pulse != null && pulse.isRunning()){ + return; + } + player.getPacketDispatch().sendLogout(); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/InteractionPacket.java b/Server/src/main/java/Server/core/net/packet/in/InteractionPacket.java new file mode 100644 index 000000000..0854e203b --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/InteractionPacket.java @@ -0,0 +1,382 @@ +package core.net.packet.in; + +import core.ServerConstants; +import core.cache.def.impl.ObjectDefinition; +import core.cache.def.impl.VarbitDefinition; +import core.game.interaction.Interaction; +import core.game.interaction.MovementPulse; +import core.game.interaction.Option; +import core.game.interaction.SpecialGroundItems; +import core.game.node.Node; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.system.SystemLogger; +import plugin.ai.AIPlayer; +import core.game.node.item.GroundItem; +import core.game.node.item.GroundItemManager; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.net.packet.PacketRepository; +import core.net.packet.context.PlayerContext; +import core.net.packet.out.ClearMinimapFlag; +import core.game.content.quest.PluginInteractionManager; + +import java.util.Arrays; +import java.util.List; + +/** + * Handles the incoming interaction packets. + * @author Emperor + */ +public final class InteractionPacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + if (player == null) { + return; + } + if (buffer.opcode() != 105) { + player = getPlayer(player); + } + if (player.getLocks().isInteractionLocked() || !player.getInterfaceManager().close()) { + return; + } + player.getInterfaceManager().closeChatbox(); + player.debug("Received " + buffer.opcode()); + try { + switch (buffer.opcode()) { + case 78: // NPC reward 1 + int index = buffer.getLEShort(); + handleNPCInteraction(player, 0, index); + break; + case 3: // NPC reward 2 + index = buffer.getLEShortA(); + handleNPCInteraction(player, 1, index); + break; + case 148: // NPC reward 3 + index = buffer.getShortA(); + handleNPCInteraction(player, 2, index); + break; + case 30: // NPC reward 4 + index = buffer.getShort(); + handleNPCInteraction(player, 3, index); + break; + case 218: // NPC reward 5 + index = buffer.getLEShort(); + handleNPCInteraction(player, 4, index); + break; + case 254: // Object reward 1 + int x = buffer.getLEShort(); + int objectId = buffer.getShortA() & 0xFFFF; + int y = buffer.getShort(); + handleObjectInteraction(player, 0, x, y, objectId); + break; + case 194: // Object reward 2 + y = buffer.getLEShortA(); + x = buffer.getLEShort(); + objectId = buffer.getShort() & 0xFFFF; + handleObjectInteraction(player, 1, x, y, objectId); + break; + case 84: // Object reward 3 + objectId = buffer.getLEShortA() & 0xFFFF; + y = buffer.getLEShortA(); + x = buffer.getLEShort(); + handleObjectInteraction(player, 2, x, y, objectId); + break; + case 152: // Object reward 4 TODO + objectId = buffer.getLEShortA() & 0xFFFF; + x = buffer.getLEShort(); + y = buffer.getLEShortA(); + handleObjectInteraction(player, 3, x, y, objectId); + break; + case 247://Object reward 4 + y = buffer.getLEShort() & 0xFFFF; + x = buffer.getLEShortA(); + objectId = buffer.getShort() & 0xFFFF; + handleObjectInteraction(player, 3, x, y, objectId); + break; + case 170: // Object reward 5 + objectId = buffer.getLEShortA() & 0xFFFF; + x = buffer.getLEShortA(); + y = buffer.getLEShortA(); + handleObjectInteraction(player, 4, x, y, objectId); + break; + case 68: // Player reward 1 - Challenge + index = buffer.getLEShortA(); + handlePlayerInteraction(player, 0, index); + break; + /*case : // Player reward 2 TODO + index = buffer.getLEShort(); + handlePlayerInteraction(player, 1, index); + break;*/ + case 71: // Player reward 3 - follow + index = buffer.getLEShortA(); + handlePlayerInteraction(player, 2, index); + break; + case 180: // Player reward 4 - trade + index = buffer.getLEShortA(); + handlePlayerInteraction(player, 3, index); + break; + /*case : // Player reward 5 TODO + index = buffer.getLEShortA(); + handlePlayerInteraction(player, 4, index); + break;*/ + /*case : // Player reward 6 TODO + index = buffer.getShort(); + handlePlayerInteraction(player, 5, index); + break;*/ + case 114: // Player reward 7 - req assistance + index = buffer.getLEShortA(); + handlePlayerInteraction(player, 6, index); + break; + case 175: // Player reward 8 - "whack" (also "control" for AIPs) + index = buffer.getShortA(); + handlePlayerInteraction(player, 7, index); + break; + case 66: // Ground item reward 1 + x = buffer.getLEShort(); + int itemId = buffer.getShort(); + y = buffer.getLEShortA(); + handleGroundItemInteraction(player, 2, itemId, Location.create(x, y, player.getLocation().getZ())); + break; + case 33: // Ground item reward 2 + itemId = buffer.getShort(); + x = buffer.getShort(); + y = buffer.getLEShort(); + handleGroundItemInteraction(player, 3, itemId, Location.create(x, y, player.getLocation().getZ())); + break; + } + } catch (Exception e){ + e.printStackTrace(); + } + } + + /** + * Handles the NPC interaction. + * @param player the player. + * @param index the index. + */ + public static void handleNPCInteraction(Player player, int optionIndex, final int index) { + if (index < 1 || index > ServerConstants.MAX_NPCS) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + return; + } + final NPC npc = Repository.getNpcs().get(index); + if (npc == null) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + return; + } + if (player.getAttribute("removenpc", false)) { + npc.clear(); + player.getPacketDispatch().sendMessage("Removed npc=" + npc.toString()); + return; + } + NPC shown = npc.getShownNPC(player); + final Option option = shown.getInteraction().get(optionIndex); + if (option == null) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + Interaction.handleInvalidInteraction(player, npc, Option.NULL); + return; + } + player.debug("NPC Interacting with \"" + shown.getUsername() + "\" [index=" + index + ", renderable=" + npc.isRenderable() + "]"); + player.debug("option=" + option.getName() + ", slot=" + option.getIndex() + ", id=" + shown.getId() + " original=" + npc.getId() + ", location=" + npc.getLocation() + ""); + player.debug("spawn=" + npc.getProperties().getSpawnLocation() + "."); + player.debug("Varp ID= " + npc.getDefinition().getConfigId() + " Offset=" + npc.getDefinition().getVarbitOffset() + " Size=" + npc.getDefinition().getVarbitSize()); + handleAIPLegion(player, 0, optionIndex, index); + if(PluginInteractionManager.handle(player,shown,option)){ + return; + } + npc.getInteraction().handle(player, option); + } + + /** + * Handles Node interaction with the first index + * @param player The interacting player. + * @param n The node to interact with. + */ + public static void handleObjectInteraction(final Player player, Node n) + { + handleObjectInteraction(player, 0, n.getLocation(), n.getId()); + } + + /** + * Handles object interaction + * @param player The interacting player. + * @param optionIndex The option index. + * @param l The (x,y) location of the object. + * @param objectId The object id. + */ + public static void handleObjectInteraction(final Player player, int optionIndex, Location l, int objectId) { + handleObjectInteraction(player, optionIndex, l.getX(), l.getY(), objectId); + } + + /** + * Handles object interaction + * @param player The interacting player. + * @param optionIndex The option index. + * @param x The x-coordinate of the object. + * @param y The y-coordinate of the object. + * @param objectId The object id. + */ + public static void handleObjectInteraction(final Player player, int optionIndex, int x, int y, int objectId) { + GameObject object = RegionManager.getObject(player.getLocation().getZ(), x, y, objectId); + if (objectId == 29735) {//player safety. + player.getPulseManager().run(new MovementPulse(player, Location.create(x, y, player .getLocation().getZ())) { + @Override + public boolean pulse() { + player.getDialogueInterpreter().sendDialogue("There appears to be a tunnel behind the poster."); + player.getDialogueInterpreter().addAction((player1, buttonId) -> player1.teleport(new Location(3140, 4230, 2))); + return true; + } + }, "movement"); + return; + } + if (objectId == 6898) { + object = new GameObject(6898, new Location(3219, 9618)); + } else if (objectId == 6899) { + object = new GameObject(6899, new Location(3221, 9618)); + } + if (object == null || object.getId() != objectId) { + player.debug("GameObject(" + objectId + ") interaction was " + object + " at location " + x + ", " + y + "."); + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + Interaction.handleInvalidInteraction(player, object, Option.NULL); + return; + } + if (!object.isActive()) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + Interaction.handleInvalidInteraction(player, object, Option.NULL); + return; + } + object = object.getChild(player); + Option option = object.getInteraction().get(optionIndex); + if (option == null) { + player.debug("Invalid option" + object + ", original: " + objectId + "."); + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + Interaction.handleInvalidInteraction(player, object, Option.NULL); + return; + } + player.debug(object + ", original=" + objectId + ", option=" + option.getName() + ""); + player.debug("dir=" + object.getDirection()); + VarbitDefinition def = VarbitDefinition.forObjectID(ObjectDefinition.forId(objectId).getVarbitID()); + player.debug("Varp ID=" + def.getConfigId() + " Offset=" + def.getBitShift() + " Size=" + def.getBitSize()); + if (option.getHandler() != null) { + player.debug("Object handler: " + option.getHandler().getClass().getSimpleName()); + } + handleAIPLegion(player, 1, optionIndex, x, y, objectId); + if(PluginInteractionManager.handle(player,object)){ + return; + } + object.getInteraction().handle(player, option); + } + + /** + * Handles player interaction. + * @param player The player interacting. + * @param optionIndex The option index. + * @param index The target index. + */ + private static void handlePlayerInteraction(Player player, int optionIndex, int index) { + if (index < 1 || index > ServerConstants.MAX_PLAYERS) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + return; + } + final Player target = Repository.getPlayers().get(index); + if (target == null || !target.isActive()) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + return; + } + final Option option = player.getInteraction().get(optionIndex); + //Handling for "Pelt" option + if(option.getName().toLowerCase().equals("pelt")){ + + } + if (option == null) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + return; + } + handleAIPLegion(player, 2, optionIndex, index); + target.getInteraction().handle(player, option); + } + + /** + * Handles the ground item interaction. + * @param player The player. + * @param index The index of the reward. + * @param itemId The item id. + * @param location The location of the item. + */ + private static void handleGroundItemInteraction(final Player player, int index, int itemId, Location location) { + final GroundItem item = GroundItemManager.get(itemId, location, player); + SpecialGroundItems[] groundItems = SpecialGroundItems.values(); + for(SpecialGroundItems specialItem : groundItems){ + if(specialItem.getItemid() == itemId && specialItem.getLocation().getX() == location.getX() && specialItem.getLocation().getY() == location.getY()){ + player.debug("Using special ground item handler"); + specialItem.getInteraction().handle(player,item.getInteraction().get(index)); + return; + } + } + if (item == null) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + return; + } + final Option option = item.getInteraction().get(index); + if (option == null) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + Interaction.handleInvalidInteraction(player, item, Option.NULL); + return; + } + if(PluginInteractionManager.handle(player,item,option)){ + player.debug("Handled by quest interaction manager."); + return; + } + item.getInteraction().handle(player, option); + } + + /** + * Handles the AIPlayer legion. + * @param player The player. + * @param type The interaction type. + * @param args The arguments. + */ + private static void handleAIPLegion(Player player, int type, int... args) { + if (player.isArtificial()) { + List legion = player.getAttribute("aip_legion"); + if (legion != null) { + for (AIPlayer aip : legion) { + if (aip != player) { + switch (type) { + case 0: + handleNPCInteraction(aip, args[0], args[1]); + break; + case 1: + handleObjectInteraction(aip, args[0], args[1], args[2], args[3]); + break; + case 2: + handlePlayerInteraction(aip, args[0], args[1]); + break; + } + } + } + } + } + } + + /** + * Gets the player instance (used for AIP controlling). + * @param player The player. + * @return The player instance, or the AIP when the player is controlling an + * AIP. + */ + private static Player getPlayer(Player player) { + AIPlayer aip = player.getAttribute("aip_select"); + if (aip != null && aip.getLocation().withinDistance(player.getLocation())) { + return aip; + } + return player; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/InterfaceUseOnPacket.java b/Server/src/main/java/Server/core/net/packet/in/InterfaceUseOnPacket.java new file mode 100644 index 000000000..803e077b1 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/InterfaceUseOnPacket.java @@ -0,0 +1,251 @@ +package core.net.packet.in; + +import core.ServerConstants; +import core.game.node.entity.skill.magic.MagicSpell; +import core.game.node.entity.skill.summoning.familiar.FamiliarSpecial; +import core.game.interaction.MovementPulse; +import core.game.node.entity.combat.CombatSwingHandler; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.item.GroundItemManager; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.world.GameWorld; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.net.packet.PacketRepository; +import core.net.packet.context.PlayerContext; +import core.net.packet.out.ClearMinimapFlag; + +/** + * Handles the Interface "Use" on packets. + * @author Stacx + */ +public class InterfaceUseOnPacket implements IncomingPacket { + + @SuppressWarnings("unused") + @Override + public void decode(final Player player, int opcode, IoBuffer buffer) { + int payload; + int interfaceId; + int componentId; + int itemId; + int x; + int y; + switch (buffer.opcode()) { + case 73: // Interface On GroundItem + componentId = buffer.getShort(); + interfaceId = buffer.getShort(); + y = buffer.getShort(); + itemId = buffer.getLEShortA(); + x = buffer.getLEShortA(); + final int spell = buffer.getLEShort(); + final Item groundItem = GroundItemManager.get(itemId, Location.create(x, y, player.getLocation().getZ()), player); + if (groundItem == null || !player.getLocation().withinDistance(groundItem.getLocation())) { + break; + } + if (player.getAttribute("magic:delay", -1) > GameWorld.getTicks()) { + break; + } + if (player.getZoneMonitor().clickButton(interfaceId, componentId, spell, itemId, opcode)) { + break; + } + if (CombatSwingHandler.isProjectileClipped(player, groundItem, false)) { + MagicSpell.castSpell(player, SpellBookManager.SpellBook.MODERN, spell, groundItem); + } else { + player.getPulseManager().run(new MovementPulse(player, groundItem) { + @Override + public boolean update() { + if (CombatSwingHandler.isProjectileClipped(player, groundItem, false)) { + super.destination = player.getLocation(); + } + boolean finished = super.update(); + if (finished) { + player.getWalkingQueue().reset(); + } + return finished; + + } + + @Override + public boolean pulse() { + MagicSpell.castSpell(player, SpellBookManager.SpellBook.MODERN, spell, groundItem); + return true; + } + }, "movement"); + } + break; + case 195: // Interface On Player + payload = buffer.getShortA(); + componentId = buffer.getLEShort(); + interfaceId = buffer.getLEShort(); + int targetIndex = buffer.getLEShortA(); + // Logger.log("Interface:" + interfaceId+ " Component:" + + // componentId + " Target Index:"+ targetIndex); + //System.out.println("magic on player component = "+componentId+"!"); + final Player target = Repository.getPlayers().get(targetIndex); + if (target == null || !player.getLocation().withinDistance(target.getLocation())) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + break; + } + switch (interfaceId) { + case 192: + MagicSpell.castSpell(player, SpellBookManager.SpellBook.MODERN, componentId, target); + break; + case 193: + MagicSpell.castSpell(player, SpellBookManager.SpellBook.ANCIENT, componentId, target); + break; + case 430: + MagicSpell.castSpell(player, SpellBookManager.SpellBook.LUNAR, componentId, target); + break; + case 662: + switch (componentId) { + case 67: + case 69: + case 119: + case 121: + default: + if (!player.getFamiliarManager().hasFamiliar()) { + player.getPacketDispatch().sendMessage("You don't have a familiar."); + } else { + player.getFamiliarManager().getFamiliar().executeSpecialMove(new FamiliarSpecial(target)); + } + break; + } + break; + default: + player.debug("Option usage [inter=" + interfaceId + ", child=" + componentId + ", target=" + target + "]."); + } + break; + case 233: // Interface On Object + y = buffer.getLEShortA(); + x = buffer.getShortA(); + itemId = buffer.getLEShortA(); + if (itemId == 65535) { + itemId = -1; + } + payload = buffer.getIntA(); + interfaceId = payload >> 16; + componentId = payload & 0xFFFF; + int objectId = buffer.getShortA(); + player.debug("Option usage [inter=" + interfaceId + ", child=" + componentId + ", target=(" + objectId + "," + x + "," + y + "), item=" + itemId + "]."); + GameObject object = RegionManager.getObject(player.getLocation().getZ(), x, y); + if (object == null) { + object = RegionManager.getObject(Location.create(x, y, 0)); + } + if (object != null) { + object = object.getChild(player); + } + if (object == null || (object.getId() != objectId && object.getWrapper().getId() != objectId) || !player.getLocation().withinDistance(object.getLocation())) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + break; + } + switch (interfaceId) { + case 430: + MagicSpell.castSpell(player, SpellBookManager.SpellBook.LUNAR, componentId, object); + break; + case 192: + MagicSpell.castSpell(player, SpellBookManager.SpellBook.MODERN, componentId, object); + break; + case 662: + switch (componentId) { + case 137: + default: + player.getFamiliarManager().getFamiliar().executeSpecialMove(new FamiliarSpecial(object)); + break; + } + break; + } + break; + case 239: // Interface On NPC + componentId = buffer.getLEShort(); + interfaceId = buffer.getLEShort(); + int unknown = buffer.getShortA(); + int index = buffer.getLEShortA(); + if (index < 1 || index > ServerConstants.MAX_NPCS) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + break; + } + + NPC npc = Repository.getNpcs().get(index); + if (npc == null || !player.getLocation().withinDistance(npc.getLocation())) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + break; + } + if (player.getAttribute("magic:delay", -1) > GameWorld.getTicks()) { + break; + } + switch (interfaceId) { + case 430: + MagicSpell.castSpell(player, SpellBookManager.SpellBook.LUNAR, componentId, npc); + break; + case 192: + MagicSpell.castSpell(player, SpellBookManager.SpellBook.MODERN, componentId, npc); + break; + case 193: + MagicSpell.castSpell(player, SpellBookManager.SpellBook.ANCIENT, componentId, npc); + break; + case 662: + switch (componentId) { + case 67: + case 69: + case 177: + case 121: + case 119: + default: + if (!player.getFamiliarManager().hasFamiliar()) { + player.getPacketDispatch().sendMessage("You don't have a familiar."); + } else { + player.getFamiliarManager().getFamiliar().executeSpecialMove(new FamiliarSpecial(npc)); + } + break; + } + break; + default: + player.debug("Option usage [inter=" + interfaceId + ", child=" + componentId + ", target=" + npc + "]."); + } + break; + case 253: // Interface On Item + componentId = buffer.getLEShort(); + interfaceId = buffer.getLEShort(); + int itemSlot = buffer.getLEShortA(); + itemId = buffer.getShortA(); + unknown = buffer.getShortA(); + if (itemSlot < 0 || itemSlot > 27) { + break; + } + Item item = player.getInventory().get(itemSlot); + if (item == null) { + break; + } + switch (interfaceId) { + case 430: + if (player.getAttribute("magic:delay", -1) > GameWorld.getTicks()) { + break; + } + MagicSpell.castSpell(player, SpellBookManager.SpellBook.LUNAR, componentId, item); + break; + case 192: + if (player.getAttribute("magic:delay", -1) > GameWorld.getTicks()) { + break; + } + MagicSpell.castSpell(player, SpellBookManager.SpellBook.MODERN, componentId, item); + break; + case 662: + if (player.getFamiliarManager().hasFamiliar()) { + player.getFamiliarManager().getFamiliar().executeSpecialMove(new FamiliarSpecial(item, interfaceId, componentId, item)); + } else { + player.getPacketDispatch().sendMessage("You don't have a follower."); + } + break; + default: + player.debug("Option usage [inter=" + interfaceId + ", child=" + componentId + ", target=" + item + "]."); + } + break; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/ItemActionPacket.java b/Server/src/main/java/Server/core/net/packet/in/ItemActionPacket.java new file mode 100644 index 000000000..d7eca1095 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/ItemActionPacket.java @@ -0,0 +1,223 @@ +package core.net.packet.in; + +import core.game.interaction.*; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.skill.farming.CompostBins; +import core.game.node.entity.skill.farming.FarmingPatch; +import core.game.node.entity.skill.farming.UseWithBinHandler; +import core.game.node.entity.skill.farming.UseWithPatchHandler; +import core.game.node.item.Item; +import core.game.node.object.GameObject; +import core.game.system.SystemLogger; +import core.game.world.map.RegionManager; +import core.game.world.repository.Repository; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.net.packet.PacketRepository; +import core.net.packet.context.PlayerContext; +import core.net.packet.out.ClearMinimapFlag; +import core.tools.Items; +import core.game.system.command.rottenpotato.RottenPotatoUseWithHandler; +import core.game.content.quest.PluginInteractionManager; + +/** + * The incoming item reward packet. + * @author Emperor + */ +public class ItemActionPacket implements IncomingPacket { + + @SuppressWarnings("unused") + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + if (player.getLocks().isInteractionLocked()) { + return; + } + int usedWithItemId = -1; + int usedWithSlot = -1; + int interfaceHash1 = -1; + int interfaceId1 = -1; + int childId1 = -1; + int usedItemId = -1; + int usedSlot = -1; + int interfaceHash2 = -1; + int interfaceId2 = -1; + int childId2 = -1; + NodeUsageEvent event = null; + Item used = null; + switch (buffer.opcode()) { + case 115: // Item on NPC + int interfaceId = buffer.getIntA() >> 16; + int slotId = buffer.getLEShort(); + int npcIndex = buffer.getLEShort(); + int itemId = buffer.getLEShortA(); + NPC npc = Repository.getNpcs().get(npcIndex); + Item item = player.getInventory().get(slotId); + if (item == null || item.getId() != itemId) { + return; + } + if(itemId == Items.ROTTEN_POTATO_5733){ + RottenPotatoUseWithHandler.handle(npc,player); + return; + } + event = new NodeUsageEvent(player, interfaceId, item, npc); + if(PluginInteractionManager.handle(player,event)){ + return; + } + event = new NodeUsageEvent(player, interfaceId, item, npc); + try { + UseWithHandler.run(event); + } catch (Exception e){ + e.printStackTrace(); + } + return; + case 248: // Item on Player + int playerIndex = buffer.getLEShortA(); + itemId = buffer.getShort(); + slotId = buffer.getShort(); + interfaceId = buffer.getInt() >> 16; + Player target = Repository.getPlayers().get(playerIndex); + item = player.getInventory().get(slotId); + if (target == null || item == null || item.getId() != itemId) { + return; + } + if(itemId == Items.ROTTEN_POTATO_5733){ + RottenPotatoUseWithHandler.handle(target,player); + return; + } + event = new NodeUsageEvent(player, interfaceId, item, target); + if(PluginInteractionManager.handle(player,event)){ + return; + } + event = new NodeUsageEvent(player, interfaceId, item, target); + try { + UseWithHandler.run(event); + } catch (Exception e){ + e.printStackTrace(); + } + return; + case 27://Item on Item + usedSlot = buffer.getShort(); + interfaceHash1 = buffer.getLEInt(); + usedWithSlot = buffer.getLEShort(); + interfaceHash2 = buffer.getLEInt(); + usedItemId = buffer.getLEShortA(); + usedWithItemId = buffer.getLEShortA(); + interfaceId1 = interfaceHash1 >> 16; + childId1 = interfaceHash1 & 0xFFFF; + interfaceId2 = interfaceHash2 >> 16; + childId2 = interfaceHash2 & 0xFFFF; + used = player.getInventory().get(usedSlot); + Item with = player.getInventory().get(usedWithSlot); + if (used == null || with == null || used.getId() != usedItemId || with.getId() != usedWithItemId) { + return; + } + if(used.getId() == Items.ROTTEN_POTATO_5733){ + RottenPotatoUseWithHandler.handle(with,player); + return; + } + if(with.getId() == Items.ROTTEN_POTATO_5733){ + RottenPotatoUseWithHandler.handle(used,player); + return; + } + if (usedItemId < usedWithItemId) { + item = used; + used = with; + with = item; + } + player.debug("USED: " + used + " WITH: " + with); + event = new NodeUsageEvent(player, interfaceId1, used, with); + if(PluginInteractionManager.handle(player,event)){ + return; + } + event = new NodeUsageEvent(player, interfaceId1, used, with); + try { + UseWithHandler.run(event); + } catch (Exception e){ + e.printStackTrace(); + } + break; + case 134://Item on Object + int x = buffer.getShortA(); + int id = buffer.getShort(); + int y = buffer.getLEShort(); + int slot = buffer.getShort(); + buffer.getLEShort(); + buffer.getShort(); + int objectId = buffer.getShortA(); + int z = player.getLocation().getZ(); + GameObject object = RegionManager.getObject(z, x, y); + if(objectId != 6898) { + if (object == null || object.getId() != objectId) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + return; + } + object = object.getChild(player); + if (object == null) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + break; + } + } else { + object = new GameObject(6898,x,y,z); + } + used = player.getInventory().get(slot); + if (used == null || used.getId() != id) { + return; + } + if(used.getId() == Items.ROTTEN_POTATO_5733){ + RottenPotatoUseWithHandler.handle(object,player); + return; + } + event = new NodeUsageEvent(player, 0, used, object); + + /** + * Farming-specific handler for item -> patch + */ + if(FarmingPatch.forObject(object) != null && UseWithPatchHandler.allowedNodes.contains(used.getId())){ + NodeUsageEvent finalEvent = event; + player.getPulseManager().run(new MovementPulse(player,object, DestinationFlag.OBJECT) { + @Override + public boolean pulse() { + player.faceLocation(destination.getLocation()); + UseWithPatchHandler.handle(finalEvent); + return true; + } + }); + return; + } + + /** + * Farming-specific handler for item -> compost bin + */ + if(CompostBins.forObject(object) != null && UseWithBinHandler.allowedNodes.contains(used.getId())){ + NodeUsageEvent finalEvent = event; + player.getPulseManager().run(new MovementPulse(player,object,DestinationFlag.OBJECT){ + @Override + public boolean pulse() { + player.faceLocation(destination.getLocation()); + UseWithBinHandler.handle(finalEvent); + return true; + } + }); + return; + } + + if(PluginInteractionManager.handle(player,event)){ + return; + } + if(object.getName().toLowerCase().contains("bank booth")){ + new ItemOnBankBooth().handle(event); + return; + } + try { + UseWithHandler.run(event); + } catch (Exception e){ + e.printStackTrace(); + } + return; + default: + SystemLogger.logErr("Error in Item Action Packet! Unhandled opcode = " + buffer.opcode()); + return; + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/ItemOnGroundItemPacket.kt b/Server/src/main/java/Server/core/net/packet/in/ItemOnGroundItemPacket.kt new file mode 100644 index 000000000..c02c375a5 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/ItemOnGroundItemPacket.kt @@ -0,0 +1,62 @@ +package core.net.packet.`in` + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.entity.player.Player +import core.game.node.item.GroundItemManager +import core.game.world.map.Location +import core.net.packet.IncomingPacket +import core.net.packet.IoBuffer +import core.tools.Items +import core.game.node.entity.skill.firemaking.FireMakingPulse + +/** + * Handles the Item -> Ground Item packet + * Decided not to include it with the rest of ItemActionPacket because it functions a bit differently from the rest of that + * Will also require its own handlers instead of the normal UseWithHandler. Kind of annoying especially considering there's very few + * Interactions that actually make use of this packet. + * @author Ceikry + */ +class ItemOnGroundItemPacket : IncomingPacket { + override fun decode(player: Player?, opcode: Int, buffer: IoBuffer?) { + buffer ?: return + player ?: return + val x = buffer.leShortA + val slot = buffer.leShort + val usedItemId = buffer.leShort + val usedWithItemId = buffer.leShort + val y = buffer.leShortA + buffer.int //uncertain what the use for this int is. My suspicion was region ID but no variety of the int data type matches up with the region id + + val GILocation = Location.create(x,y,player.location.z) + + var usedWith = GroundItemManager.get(usedWithItemId, GILocation, null) ?: GroundItemManager.get(usedWithItemId, GILocation, player) + usedWith ?: return + + var used = player.inventory.get(slot) + if(used.id != usedItemId) return + + + /** + * I'm just gonna put the handler for tinderbox -> logs here. Yes I know it's lazy, etc, etc but frankly the number of interactions + * that are actually item -> ground item are so few it just doesn't make sense to make a whole system for it. + */ + player.pulseManager.run(object : MovementPulse(player,GILocation, DestinationFlag.ITEM){ + override fun pulse(): Boolean { + if(used.id == Items.TINDERBOX_590 || used.id == Items.GOLDEN_TINDERBOX_2946){ + when(usedWithItemId){ + Items.LOGS_1511,Items.ACHEY_TREE_LOGS_2862,Items.ARCTIC_PINE_LOGS_10810,Items.MAGIC_LOGS_1513,Items.MAHOGANY_LOGS_6332,Items.MAPLE_LOGS_1517,Items.YEW_LOGS_1515,Items.TEAK_LOGS_6333,Items.OAK_LOGS_1521,Items.WILLOW_LOGS_1519 + -> { + player.pulseManager.run(FireMakingPulse(player,usedWith.asItem(),usedWith)) + } + else -> player.sendMessage("Nothing interesting happens.") + } + } else { + player.sendMessage("Nothing interesting happens.") + } + return true + } + }) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/MapClosedPacket.java b/Server/src/main/java/Server/core/net/packet/in/MapClosedPacket.java new file mode 100644 index 000000000..e98f30148 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/MapClosedPacket.java @@ -0,0 +1,12 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +public class MapClosedPacket implements IncomingPacket { + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + //This buffer contains an int that is actually a bunch of booleans bitshifted into specific positions. No clue what the use might be. + } +} diff --git a/Server/src/main/java/Server/core/net/packet/in/MouseClickPacket.java b/Server/src/main/java/Server/core/net/packet/in/MouseClickPacket.java new file mode 100644 index 000000000..23cecfe4d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/MouseClickPacket.java @@ -0,0 +1,27 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Handles incoming mouse click packets. + * @author Emperor + */ +public final class MouseClickPacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + int data = buffer.getLEShortA(); + int positioning = buffer.getIntB(); + boolean rightClick = ((data >> 15) & 0x1) == 1; + int delay = data & 0x7FF; + int x = positioning >> 16; + int y = positioning & 0xFFFF; + if (player == null) { + return; + } + player.getMonitor().handleMouseClick(x, y, delay, rightClick); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/MusicPacketHandler.java b/Server/src/main/java/Server/core/net/packet/in/MusicPacketHandler.java new file mode 100644 index 000000000..8dbc4506f --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/MusicPacketHandler.java @@ -0,0 +1,23 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Handles music-related incoming packets. + * @author Ceikry + */ +public final class MusicPacketHandler implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + int musicId = buffer.getLEShortA(); + if (player.getMusicPlayer().isLooping()) { + player.getMusicPlayer().replay(); + return; + } + player.getMusicPlayer().setPlaying(false); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/PingPacketHandler.java b/Server/src/main/java/Server/core/net/packet/in/PingPacketHandler.java new file mode 100644 index 000000000..38a4b6eaf --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/PingPacketHandler.java @@ -0,0 +1,18 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Handles an incoming ping packet. + * @author Emperor + */ +public final class PingPacketHandler implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/QuickChatPacketHandler.kt b/Server/src/main/java/Server/core/net/packet/in/QuickChatPacketHandler.kt new file mode 100644 index 000000000..d8be5a921 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/QuickChatPacketHandler.kt @@ -0,0 +1,77 @@ +package core.net.packet.`in` + +import core.game.interaction.QCRepository +import core.game.node.entity.player.Player +import core.game.system.SystemLogger +import core.game.world.GameWorld +import core.net.packet.IncomingPacket +import core.net.packet.IoBuffer + +/** + * Decodes the quick chat packet + * @author Ceikry + */ +/** + * There's different varieties of the quick chat packet. + * Standard, which is only 3 (sometimes 4) bytes and has no string replacement selections. + * Single-replacement, which is 5 bytes and has one string replacement. The last 3 bytes can and should be converted to a Short. + * Double-replacement, which is 7 bytes and has two string replacements. + * The first byte is whether or not the message is intended for your clan. 0 = public chat, 1 = clan chat + * The second byte will either be 0,1,2,3. This is the number 256 is to be multiplied by. + * The third byte is the index. This can be negative. This number is added to the multiple of 256 determined by the previous byte to get the actual id of the cache file holding the quick chat message. + * In a single replacement, you then have a short (which is 3 bytes in length) that will tell you either the item ID or the index of the selection on the menu. + * In a double replacement, you would have something like 0 1 0 3 instead as the proceeding 4 bytes. The 0s are spacers and the 1 and 3 are the selection indexes for the menus. + */ +class QuickChatPacketHandler : IncomingPacket { + override fun decode(player: Player?, opcode: Int, buffer: IoBuffer?) { + buffer ?: return + val x = buffer.toByteBuffer() + + val packetType = when(x.array().size){ + 3,4 -> QCPacketType.STANDARD + 5 -> QCPacketType.SINGLE + 7 -> QCPacketType.DOUBLE + else -> QCPacketType.UNHANDLED.also { SystemLogger.logWarn("UNHANDLED QC PACKET TYPE Size ${x.array().size}") } + } + + val forClan = (buffer.get() and 0xFF) == 1 + val multiplier: Int = buffer.get() + val offset: Int = buffer.get() + var selection_a_index = -1 + var selection_b_index = -1 + + when(packetType){ + QCPacketType.SINGLE -> { + selection_a_index = buffer.short + } + QCPacketType.DOUBLE -> { + buffer.get() //discard + selection_a_index = buffer.get() + buffer.get() //discard + selection_b_index = buffer.get() + } + QCPacketType.UNHANDLED -> SystemLogger.logWarn("Unhandled packet type, skipping remaining buffer contents.") + } + + + //Prints the values of each byte in the buffer to server log + //If the world is in dev mode + if(GameWorld.settings?.isDevMode == true) { + SystemLogger.logInfo("Begin QuickChat Packet Buffer Dump---------") + SystemLogger.logInfo("Packet Type: ${packetType.name} Chat Type: ${if(forClan) "Clan" else "Public"}") + x?.array()?.forEach { + SystemLogger.logInfo("$it") + } + SystemLogger.logInfo("End QuickChat Packet Buffer Dump-----------") + } + + QCRepository.sendQC(player,multiplier,offset,packetType,selection_a_index,selection_b_index,forClan) + } +} + +enum class QCPacketType{ + STANDARD, + SINGLE, + DOUBLE, + UNHANDLED +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/RegionChangePacket.java b/Server/src/main/java/Server/core/net/packet/in/RegionChangePacket.java new file mode 100644 index 000000000..4db834ec7 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/RegionChangePacket.java @@ -0,0 +1,19 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Packet received when a player's region has changed. + * @author Emperor + * @author 'Vexia + */ +public class RegionChangePacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + //TODO: no data is sen't so not sure what to do. + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/in/ReportAbusePacket.java b/Server/src/main/java/Server/core/net/packet/in/ReportAbusePacket.java new file mode 100644 index 000000000..8cc4f2682 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/ReportAbusePacket.java @@ -0,0 +1,36 @@ +package core.net.packet.in; + +import core.ServerConstants; +import core.game.content.global.report.AbuseReport; +import core.game.content.global.report.Rule; +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.tools.StringUtils; + +import java.io.File; + +/** + * Represents the incoming packet to handle a report against a player. + * @author Vexia + */ +public class ReportAbusePacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + String target = StringUtils.longToString(buffer.getLong()); + Rule rule = Rule.forId(buffer.get()); + boolean mute = buffer.get() == 1; + File file = new File(ServerConstants.PLAYER_SAVE_PATH + target + ".save"); + if (!file.exists()) { + player.getPacketDispatch().sendMessage("Invalid player name."); + return; + } + if (target.equalsIgnoreCase(player.getUsername())) { + player.getPacketDispatch().sendMessage("You can't report yourself!"); + return; + } + AbuseReport abuse = new AbuseReport(player.getName(), target, rule); + abuse.construct(player, mute); + } +} diff --git a/Server/src/main/java/Server/core/net/packet/in/RunScriptPacketHandler.java b/Server/src/main/java/Server/core/net/packet/in/RunScriptPacketHandler.java new file mode 100644 index 000000000..c5875de04 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/RunScriptPacketHandler.java @@ -0,0 +1,36 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.RunScript; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.tools.StringUtils; + +/** + * Represents the incoming packet to handle a run script. + * @author 'Vexia + */ +public class RunScriptPacketHandler implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + final RunScript script = player.getAttribute("runscript", null); + if (script == null || player.getLocks().isInteractionLocked()) { + return; + } + Object value = ""; + if (opcode == 244) { + value = StringUtils.longToString(buffer.getLong()); + } else if (opcode == 23) { + value = buffer.getInt(); + } else if (opcode == 65){ + value = buffer.getString();//"longInput" + } else { + value = buffer.getInt(); + } + script.setValue(value); + script.setPlayer(player); + player.removeAttribute("runscript"); + script.handle(); + } +} diff --git a/Server/src/main/java/Server/core/net/packet/in/SlotSwitchPacket.java b/Server/src/main/java/Server/core/net/packet/in/SlotSwitchPacket.java new file mode 100644 index 000000000..0359526c8 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/SlotSwitchPacket.java @@ -0,0 +1,109 @@ +package core.net.packet.in; + +import core.game.container.Container; +import core.game.container.impl.BankContainer; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Represents the packet to handle an item slot switch. + * @author 'Vexia + */ +public class SlotSwitchPacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + if (buffer.opcode() == 79) { + int interfaceHash = buffer.getIntB(); + int secondSlot = buffer.getLEShort(); + int interfaceHash2 = buffer.getInt(); + int slot = buffer.getLEShort(); + int interfaceId = interfaceHash >> 16; + int childId = interfaceHash & 0xFF; + int withInterfaceId = interfaceHash2 >> 16; + int withChildId = interfaceHash2 & 0xFF; + Container container = player.getInventory(); + switch (interfaceId) { + case 762: + if (withInterfaceId == 762) { + if (withChildId == 73) { + container = player.getBank(); + switchItem(slot, secondSlot, container, player.getBank().isInsertItems(), player); + player.debug("Switching item [" + slot + ", " + interfaceId + ", " + childId + "] with [" + secondSlot + ", " + withInterfaceId + ", " + withChildId + "]!"); + } + else { + int tabIndex = BankContainer.getArrayIndex(withChildId); + if (tabIndex > -1) { + secondSlot = tabIndex == 10 ? player.getBank().freeSlot() : player.getBank().getTabStartSlot()[tabIndex] + player.getBank().getItemsInTab(tabIndex); + childId = player.getBank().getTabByItemSlot(slot); + if (secondSlot > slot) { + player.getBank().insert(slot, secondSlot - 1); + } else if (slot > secondSlot) { + player.getBank().insert(slot, secondSlot); + } + player.getBank().increaseTabStartSlots(tabIndex); + player.getBank().decreaseTabStartSlots(childId); + player.getBank().setTabConfigurations(); + return; + } + } + break; + } + break; + default: + player.debug("Switching item slot [from=" + slot + ", to=" + secondSlot + ", child=" + childId + ", to child=" + withChildId + "]."); + switchItem(slot, secondSlot, container, false, player); + break; + } + return; + } + int slot = buffer.getShort(); + int interfaceHash = buffer.getLEInt(); + int secondSlot = buffer.getShortA(); + boolean insert = buffer.get() == 1; + int interfaceId = interfaceHash >> 16; + Container container = interfaceId == 762 ? player.getBank() : (interfaceId == 15 || interfaceId == 149 || interfaceId == 763) ? player.getInventory() : null; + switchItem(slot, secondSlot, container, insert, player); + } + + /** + * Switches an item. + * @param slot The slot. + * @param secondSlot The slot to switch slots with. + * @param container The container. + * @param insert If inserting should happen. + */ + public void switchItem(int slot, int secondSlot, Container container, boolean insert, Player player) { + if (container == null || slot < 0 || slot >= container.toArray().length || secondSlot < 0 || secondSlot >= container.toArray().length) { + return; + } + + final Item item = container.get(slot); + final Item second = container.get(secondSlot); + if (player.getInterfaceManager().hasChatbox()) { + player.getInterfaceManager().closeChatbox(); + switchItem(secondSlot,slot,container,insert,player); + container.refresh(); + return; + } + if (item == null) { + return; + } + if (!insert) { + container.replace(second, slot, false); + container.replace(item, secondSlot, false); + if (item != null) { + item.setIndex(secondSlot); + } + if (second != null) { + second.setIndex(slot); + } + } else { + container.insert(slot, secondSlot, false); + } + container.refresh(); + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/in/UpdateInterfaceCounter.java b/Server/src/main/java/Server/core/net/packet/in/UpdateInterfaceCounter.java new file mode 100644 index 000000000..3e10fa8bd --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/UpdateInterfaceCounter.java @@ -0,0 +1,20 @@ +package core.net.packet.in; + +import core.game.node.entity.player.Player; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; + +/** + * Handles the update interface packet counter packet. + * @author Emperor + * + */ +public final class UpdateInterfaceCounter implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + int count = buffer.getShort() - player.getInterfaceManager().getPacketCount(0); + player.getInterfaceManager().getPacketCount(count); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/in/WalkPacket.java b/Server/src/main/java/Server/core/net/packet/in/WalkPacket.java new file mode 100644 index 000000000..36e83c692 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/in/WalkPacket.java @@ -0,0 +1,97 @@ +package core.net.packet.in; + +import core.game.interaction.MovementPulse; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import plugin.ai.AIPlayer; +import core.game.world.map.Location; +import core.net.packet.IncomingPacket; +import core.net.packet.IoBuffer; +import core.net.packet.PacketRepository; +import core.net.packet.context.PlayerContext; +import core.net.packet.out.ClearMinimapFlag; + +/** + * Handles an incoming walk packet. + * @author Emperor + */ +public final class WalkPacket implements IncomingPacket { + + @Override + public void decode(Player player, int opcode, IoBuffer buffer) { + player = getPlayer(player); + if (player == null) { + return; + } + if (player.getLocks().isMovementLocked() || !player.getInterfaceManager().close() || !player.getInterfaceManager().closeSingleTab() || !player.getDialogueInterpreter().close()) { + PacketRepository.send(ClearMinimapFlag.class, new PlayerContext(player)); + player.debug("[WalkPacket] did not handle - [locked=" + player.getLocks().isMovementLocked() + "]!"); + return; + } + player.getProperties().setSpell(null); + player.getInterfaceManager().close(); + player.getInterfaceManager().closeChatbox(); + player.getDialogueInterpreter().getActions().clear(); + boolean running = buffer.getA() == 1; + int x = buffer.getShort(); + int y = buffer.getShortA(); + int steps = (buffer.toByteBuffer().remaining() - (buffer.opcode() == 39 ? 14 : 0)) >> 1; + for (int i = 0; i < steps; i++) { + int offsetX = buffer.getA(); + int offsetY = buffer.getS(); + if (i == steps - 1) { + x += offsetX; + y += offsetY; + } + } + if (opcode == 77) { + player.getWalkingQueue().setRunning(running); + return; // Action walking. + } + player.face((Entity) null); + player.faceLocation((Location) null); + //player.getWalkingQueue().reset(running); + player.getPulseManager().run(new MovementPulse(player, Location.create(x, y, player.getLocation().getZ()), running) { + @Override + public boolean pulse() { + return true; + } + }, true, "movement"); + if (opcode == 39) { + buffer.get(); // The x-coordinate of where we clicked on the + // minimap. + buffer.get(); // The y-coordinate of where we clicked on the + // minimap. + buffer.getShort(); // The rotation of the minimap. + buffer.get(); // Always 57. + buffer.get(); + buffer.get(); + buffer.get(); // Always 89 + buffer.getShort(); + buffer.getShort(); + buffer.get(); + buffer.get(); // Always 63 + } + } + + /** + * Gets the player instance (used for AIP controlling). + * @param player The player. + * @return The player instance, or the AIP when the player is controlling an + * AIP. + */ + private static Player getPlayer(Player player) { + if (player == null) { + return null; + } + AIPlayer aip = player.getAttribute("aip_select"); + if (aip != null && aip.getLocation().withinDistance(player.getLocation())) { + if (!player.getAttribute("aip_perm_select", true)) { + player.removeAttribute("aip_select"); + } + return aip; + } + return player; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/AccessMask.java b/Server/src/main/java/Server/core/net/packet/out/AccessMask.java new file mode 100644 index 000000000..edf1cfbb5 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/AccessMask.java @@ -0,0 +1,23 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.AccessMaskContext; + +/** + * The access mask outgoing packet. + * @author Emperor + */ +public class AccessMask implements OutgoingPacket { + + @Override + public void send(AccessMaskContext context) { + IoBuffer buffer = new IoBuffer(165); + buffer.putLEShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.putLEShort(context.getLength()); + buffer.putInt(context.getInterfaceId() << 16 | context.getChildId()); + buffer.putShortA(context.getOffset()); + buffer.putIntA(context.getId()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } +} diff --git a/Server/src/main/java/Server/core/net/packet/out/AnimateInterface.java b/Server/src/main/java/Server/core/net/packet/out/AnimateInterface.java new file mode 100644 index 000000000..499aabaa5 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/AnimateInterface.java @@ -0,0 +1,21 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.AnimateInterfaceContext; + +/** + * The animate interface outgoing packet. + * @author Emperor + */ +public class AnimateInterface implements OutgoingPacket { + + @Override + public void send(AnimateInterfaceContext context) { + IoBuffer buffer = new IoBuffer(36); + buffer.putIntB((context.getInterfaceId() << 16) + context.getChildId()); + buffer.putLEShort(context.getAnimationId()); + buffer.putShortA(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/AnimateObjectPacket.java b/Server/src/main/java/Server/core/net/packet/out/AnimateObjectPacket.java new file mode 100644 index 000000000..5ce73df5a --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/AnimateObjectPacket.java @@ -0,0 +1,39 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.game.world.update.flag.context.Animation; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.AnimateObjectContext; + +/** + * Represents the packet used to animate an object. + * @author Vexia + * @date 10/11/2013 + */ +public class AnimateObjectPacket implements OutgoingPacket { + + /** + * Writes the packet. + * @param buffer The buffer. + */ + public static IoBuffer write(IoBuffer buffer, Animation animation) { + GameObject object = animation.getObject(); + Location l = object.getLocation(); + buffer.put(20); + buffer.putS((l.getChunkOffsetX() << 4) | (l.getChunkOffsetY() & 0x7)); + buffer.putS((object.getType() << 2) + (object.getRotation() & 0x3)); + buffer.putLEShort(animation.getId()); + return buffer; + } + + @Override + public void send(AnimateObjectContext context) { + Player player = context.getPlayer(); + GameObject object = context.getAnimation().getObject(); + IoBuffer buffer = write(UpdateAreaPosition.getBuffer(player, object.getLocation().getChunkBase()), context.getAnimation()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());player.getSession().write(buffer); + } +} diff --git a/Server/src/main/java/Server/core/net/packet/out/AudioPacket.java b/Server/src/main/java/Server/core/net/packet/out/AudioPacket.java new file mode 100644 index 000000000..11e4b6e33 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/AudioPacket.java @@ -0,0 +1,27 @@ +package core.net.packet.out; + +import core.game.node.entity.player.link.audio.Audio; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.DefaultContext; + +/** + * Sends an audio packet. + * @author Vexia + */ +public class AudioPacket implements OutgoingPacket { + + //208 music effect + //4 music + //172 sound effect + @Override + public void send(DefaultContext context) { + final Audio audio = (Audio) context.getObjects()[0]; + IoBuffer buffer = new IoBuffer(172); + buffer.putShort(audio.getId()); + buffer.put((byte) audio.getVolume()); + buffer.putShort(audio.getDelay()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/out/BuildDynamicScene.java b/Server/src/main/java/Server/core/net/packet/out/BuildDynamicScene.java new file mode 100644 index 000000000..74d9b8d87 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/BuildDynamicScene.java @@ -0,0 +1,78 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.system.config.XteaParser; +import core.game.world.map.Region; +import core.game.world.map.RegionChunk; +import core.game.world.map.RegionManager; +import core.game.world.map.build.DynamicRegion; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.DynamicSceneContext; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Emperor + */ +public final class BuildDynamicScene implements OutgoingPacket { + + @Override + public void send(DynamicSceneContext context) { + IoBuffer buffer = new IoBuffer(214, PacketHeader.SHORT); + List regionIds = new ArrayList<>(); + Player player = context.getPlayer(); + buffer.putLEShortA(player.getLocation().getSceneX()); + buffer.putLEShortA(player.getLocation().getRegionX()); + buffer.putS(player.getLocation().getZ()); + buffer.putLEShortA(player.getLocation().getSceneY()); + buffer.setBitAccess(); + Region r = player.getViewport().getRegion(); + RegionChunk[][][] chunks = new RegionChunk[4][13][13]; + int baseX = player.getLocation().getRegionX() - 6; + int baseY = player.getLocation().getRegionY() - 6; + for (int z = 0; z < 4; z++) { + for (int x = baseX; x <= player.getLocation().getRegionX() + 6; x++) { + for (int y = baseY; y <= player.getLocation().getRegionY() + 6; y++) { + r = RegionManager.forId((x >> 3) << 8 | (y >> 3)); + if (r instanceof DynamicRegion) { + DynamicRegion dr = (DynamicRegion) r; + chunks[z][x - baseX][y - baseY] = dr.getChunks()[z][x - (dr.getX() << 3)][y - (dr.getY() << 3)]; + } + } + } + } + for (int plane = 0; plane < 4; plane++) { + for (int offsetX = 0; offsetX < 13; offsetX++) { + for (int offsetY = 0; offsetY < 13; offsetY++) { + RegionChunk c = chunks[plane][offsetX][offsetY]; + if (c == null || c.getBase().getX() < 0 || c.getBase().getY() < 0) { + buffer.putBits(1, 0); + continue; + } + int realRegionX = c.getBase().getRegionX(); + int realRegionY = c.getBase().getRegionY(); + int realPlane = c.getBase().getZ(); + int rotation = c.getRotation(); + int id = (realRegionX >> 3) << 8 | (realRegionY >> 3); + if (!regionIds.contains(id)) { + regionIds.add(id); + } + buffer.putBits(1, 1); + buffer.putBits(26, (rotation << 1) | (realPlane << 24) | (realRegionX << 14) | (realRegionY << 3)); + } + } + } + buffer.setByteAccess(); + for (int id : regionIds) { + int[] keys = XteaParser.Companion.getRegionXTEA(id); + buffer.putIntB(keys[0]).putIntB(keys[1]).putIntB(keys[2]).putIntB(keys[3]); + } + buffer.putShort(player.getLocation().getRegionY()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + player.getPlayerFlags().setLastSceneGraph(player.getLocation()); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/CSConfigPacket.java b/Server/src/main/java/Server/core/net/packet/out/CSConfigPacket.java new file mode 100644 index 000000000..a9b821fb1 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/CSConfigPacket.java @@ -0,0 +1,40 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.CSConfigContext; + +/** + * The outgoing packet for client script configs. + * + * @author Snickerize + */ +public class CSConfigPacket implements OutgoingPacket { + + @Override + public void send(CSConfigContext context) { + IoBuffer buffer = new IoBuffer(65); + buffer.putLEShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.putC((byte) context.getValue()); + buffer.putLEShortA(context.getId()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } + + /*@Override + public void send(CSConfigContext context) { + IoBuffer buffer = new IoBuffer(115); + buffer.putShort(context.getId()); + buffer.putString(context.getTypes()); + + for (int i = context.getTypes().length() - 1; i >= 0; i--) { + if (context.getTypes().charAt(i) == 's') { + buffer.putString((String) context.getParameters()[i]); + } else { + buffer.putInt(((Number) context.getParameters()[i]).intValue()); + } + } + + buffer.putInt(context.getValue()); + context.getPlayer().getDetails().getSession().write(buffer); + }*/ +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/CameraViewPacket.java b/Server/src/main/java/Server/core/net/packet/out/CameraViewPacket.java new file mode 100644 index 000000000..4bd39d807 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/CameraViewPacket.java @@ -0,0 +1,44 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.CameraContext; + +/** + * Handles the outgoing camera view packets. + * @author Emperor + */ +public final class CameraViewPacket implements OutgoingPacket { + + @Override + public void send(CameraContext context) { + CameraContext.CameraType type = context.getType(); + IoBuffer buffer = new IoBuffer(type.opcode()); + Location l = Location.create(context.getX(), context.getY(), 0); + Player p = context.getPlayer(); + switch (type) { + case ROTATION: + case POSITION: + buffer.putShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + int x = l.getSceneX(p.getPlayerFlags().getLastSceneGraph()); + int y = l.getSceneY(p.getPlayerFlags().getLastSceneGraph()); + buffer.put(x).put(y).putShort(context.getHeight()).put(context.getSpeed()).put(context.getZoomSpeed()); + break; + case SET: + buffer.putLEShort(context.getX()) + .putShort(context.getPlayer().getInterfaceManager().getPacketCount(1)).putShort(context.getY()); + break; + case SHAKE: + buffer.putShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.put(l.getX()).put(l.getY()).put(context.getSpeed()).put(context.getZoomSpeed()).putShort(context.getHeight()); + break; + case RESET: + buffer.putShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + break; + } + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());p.getSession().write(buffer); + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/out/ClearGroundItem.java b/Server/src/main/java/Server/core/net/packet/out/ClearGroundItem.java new file mode 100644 index 000000000..c22b84ad6 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/ClearGroundItem.java @@ -0,0 +1,35 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.BuildItemContext; + +/** + * Represents the outgoing packet of clearing ground items. + * @author Emperor + */ +public final class ClearGroundItem implements OutgoingPacket { + + /** + * Writes the packet. + * @param buffer The buffer. + * @param item The item. + */ + public static IoBuffer write(IoBuffer buffer, Item item) { + Location l = item.getLocation(); + buffer.put(240); + buffer.putS((l.getChunkOffsetX() << 4) | (l.getChunkOffsetY() & 0x7)).putShort(item.getId()); + return buffer; + } + + @Override + public void send(BuildItemContext context) { + Player player = context.getPlayer(); + Item item = context.getItem(); + IoBuffer buffer = write(UpdateAreaPosition.getBuffer(player, item.getLocation().getChunkBase()), item); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());player.getSession().write(buffer); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/ClearMinimapFlag.java b/Server/src/main/java/Server/core/net/packet/out/ClearMinimapFlag.java new file mode 100644 index 000000000..03a9edcb3 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/ClearMinimapFlag.java @@ -0,0 +1,19 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.PlayerContext; + +/** + * Handles the removal of the minimap flag. + * @author Emperor + */ +public final class ClearMinimapFlag implements OutgoingPacket { + + @Override + public void send(PlayerContext context) { + IoBuffer buffer = new IoBuffer(153); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/ClearObject.java b/Server/src/main/java/Server/core/net/packet/out/ClearObject.java new file mode 100644 index 000000000..98e4d5748 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/ClearObject.java @@ -0,0 +1,36 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.BuildObjectContext; + +/** + * The clear game object outgoing packet. + * @author Emperor + */ +public final class ClearObject implements OutgoingPacket { + + /** + * Writes the packet. + * @param buffer The buffer. + * @param object The object. + */ + public static IoBuffer write(IoBuffer buffer, GameObject object) { + Location l = object.getLocation(); + buffer.put(195) // Opcode + .putC((object.getType() << 2) + (object.getRotation() & 3)).put((l.getChunkOffsetX() << 4) | (l.getChunkOffsetY() & 0x7)); + return buffer; + } + + @Override + public void send(BuildObjectContext context) { + Player player = context.getPlayer(); + GameObject o = context.getGameObject(); + IoBuffer buffer = write(UpdateAreaPosition.getBuffer(player, o.getLocation().getChunkBase()), o); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());player.getSession().write(buffer); + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/ClearRegionChunk.java b/Server/src/main/java/Server/core/net/packet/out/ClearRegionChunk.java new file mode 100644 index 000000000..f94a7a4df --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/ClearRegionChunk.java @@ -0,0 +1,25 @@ +package core.net.packet.out; + +import core.game.world.map.Location; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.ClearChunkContext; + +/** + * Handles the clear region chunk outgoing packet. + * @author Emperor + */ +public final class ClearRegionChunk implements OutgoingPacket { + + @Override + public void send(ClearChunkContext context) { + Location l = context.getPlayer().getPlayerFlags().getLastSceneGraph(); + int x = context.getChunk().getCurrentBase().getSceneX(l); + int y = context.getChunk().getCurrentBase().getSceneY(l); + if (x >= 0 && y >= 0 && x < 96 && y < 96) { + IoBuffer buffer = new IoBuffer(112).put(x).putC(y); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/out/CloseInterface.java b/Server/src/main/java/Server/core/net/packet/out/CloseInterface.java new file mode 100644 index 000000000..79d07dddc --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/CloseInterface.java @@ -0,0 +1,22 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.InterfaceContext; + +/** + * Represents the outgoing packet used for closing an interface. + * @author Emperor + */ +public final class CloseInterface implements OutgoingPacket { + + @Override + public void send(InterfaceContext context) { + IoBuffer buffer = new IoBuffer(149); + buffer.putShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.putShort(context.getWindowId()); + buffer.putShort(context.getComponentId()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/CommunicationMessage.java b/Server/src/main/java/Server/core/net/packet/out/CommunicationMessage.java new file mode 100644 index 000000000..40beeb97b --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/CommunicationMessage.java @@ -0,0 +1,76 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.system.communication.ClanRepository; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.MessageContext; +import core.tools.StringUtils; +import plugin.ai.AIPlayer; + +import java.util.Random; + +/** + * Handles communication message packet sending. + * @author Emperor + */ +public final class CommunicationMessage implements OutgoingPacket { + + @Override + public void send(MessageContext context) { + IoBuffer buffer = new IoBuffer(context.getOpcode(), PacketHeader.BYTE); + String message = context.getMessage(); + Player player = context.getPlayer(); + String other = context.getOther(); + switch (context.getOpcode()) { + case MessageContext.SEND_MESSAGE: + byte[] bytes = new byte[256]; + int length = StringUtils.encryptPlayerChat(bytes, 0, 0, message.length(), message.getBytes()); + buffer.putLong(StringUtils.stringToLong(other)); + buffer.put((byte) message.length()); + buffer.putBytes(bytes, 0, length); + break; + case MessageContext.RECIEVE_MESSAGE: + bytes = new byte[256]; + bytes[0] = (byte) message.length(); + length = 1 + StringUtils.encryptPlayerChat(bytes, 0, 1, message.length(), message.getBytes()); + player.setAttribute("replyTo", other); + buffer.putLong(StringUtils.stringToLong(other)).putShort(new Random().nextInt(0xFFFF)).putTri(getMessageIndex(player)).put((byte) context.getChatIcon()).putBytes(bytes, 0, length); + break; + case MessageContext.CLAN_MESSAGE: + ClanRepository clan = player.getCommunication().getClan(); + if (clan == null) { + System.out.println("Player " + player.getUsername() + " was no longer in clan!"); + return; + } + bytes = new byte[256]; + bytes[0] = (byte) context.getMessage().length(); + length = 1 + StringUtils.encryptPlayerChat(bytes, 0, 1, message.length(), message.getBytes()); + buffer.putLong(StringUtils.stringToLong(other)); + buffer.put((byte) 0);// it's just read does nothing + buffer.putLong(StringUtils.stringToLong(clan.getName())); + buffer.putShort(new Random().nextInt(0xFFFF)); + buffer.putTri(getMessageIndex(player)); + buffer.put((byte) context.getChatIcon()); // rights + buffer.putBytes(bytes, 0, length); + break; + } + if(player.isArtificial()){ + ((AIPlayer) player).handleIncomingChat(context); + } + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());player.getSession().write(buffer); + } + + /** + * Gets the message index. + * @param p The player. + * @return The message index. + */ + private static int getMessageIndex(Player p) { + int count = p.getAttribute("pm_index", 0) + 1; + p.setAttribute("pm_index", count); + return count; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/Config.java b/Server/src/main/java/Server/core/net/packet/out/Config.java new file mode 100644 index 000000000..d22bd175d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/Config.java @@ -0,0 +1,29 @@ +package core.net.packet.out; + +import core.net.packet.context.ConfigContext; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; + +/** + * The config outgoing packet. + * @author Emperor + */ +public class Config implements OutgoingPacket { + + @Override + public void send(ConfigContext context) { + IoBuffer buffer; + if (context.getValue() < Byte.MIN_VALUE || context.getValue() > Byte.MAX_VALUE) { + buffer = new IoBuffer(226); + buffer.putInt(context.getValue()); + buffer.putShortA(context.getId()); + } else { + buffer = new IoBuffer(60); + buffer.putShortA(context.getId()); + buffer.putC(context.getValue()); + } + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());if(!context.getPlayer().isArtificial()) { + context.getPlayer().getDetails().getSession().write(buffer); + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/ConstructGroundItem.java b/Server/src/main/java/Server/core/net/packet/out/ConstructGroundItem.java new file mode 100644 index 000000000..e1ee39c0d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/ConstructGroundItem.java @@ -0,0 +1,35 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.BuildItemContext; + +/** + * Represents the outgoing packet of constructing a ground item. + * @author Emperor + */ +public final class ConstructGroundItem implements OutgoingPacket { + + /** + * Writes the packet. + * @param buffer The buffer. + * @param item The item. + */ + public static IoBuffer write(IoBuffer buffer, Item item) { + Location l = item.getLocation(); + buffer.put(33); + buffer.putLEShort(item.getId()).put((l.getChunkOffsetX() << 4) | (l.getChunkOffsetY() & 0x7)).putShortA(item.getAmount()); + return buffer; + } + + @Override + public void send(BuildItemContext context) { + Player player = context.getPlayer(); + Item item = context.getItem(); + IoBuffer buffer = write(UpdateAreaPosition.getBuffer(player, item.getLocation().getChunkBase()), item); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());player.getDetails().getSession().write(buffer); + } +} diff --git a/Server/src/main/java/Server/core/net/packet/out/ConstructObject.java b/Server/src/main/java/Server/core/net/packet/out/ConstructObject.java new file mode 100644 index 000000000..91eb48e10 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/ConstructObject.java @@ -0,0 +1,36 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.node.object.GameObject; +import core.game.world.map.Location; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.BuildObjectContext; + +/** + * The construct game object packet. + * @author Emperor + */ +public final class ConstructObject implements OutgoingPacket { + + /** + * Writes the packet. + * @param buffer The buffer. + * @param object The object. + */ + public static IoBuffer write(IoBuffer buffer, GameObject object) { + Location l = object.getLocation(); + buffer.put(179).putA((object.getType() << 2) | (object.getRotation() & 0x3)).put((l.getChunkOffsetX() << 4) | (l.getChunkOffsetY() & 0x7)).putShortA(object.getId()); + return buffer; + } + + @Override + public void send(BuildObjectContext context) { + Player player = context.getPlayer(); + GameObject o = context.getGameObject(); + IoBuffer buffer = write(UpdateAreaPosition.getBuffer(player, o.getLocation().getChunkBase()), o); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());player.getSession().write(buffer); + + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/ContactPackets.java b/Server/src/main/java/Server/core/net/packet/out/ContactPackets.java new file mode 100644 index 000000000..88a7cc4b4 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/ContactPackets.java @@ -0,0 +1,55 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.system.communication.Contact; +import core.net.amsc.WorldCommunicator; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.ContactContext; +import core.tools.StringUtils; + +/** + * Handles the contact packet sending. + * @author Emperor + */ +public final class ContactPackets implements OutgoingPacket { + + @Override + public void send(ContactContext context) { + IoBuffer buffer = null; + Player player = context.getPlayer(); + switch (context.getType()) { + case ContactContext.UPDATE_STATE_TYPE: + buffer = new IoBuffer(197).put(WorldCommunicator.getState().value()); + break; + case ContactContext.IGNORE_LIST_TYPE: + buffer = new IoBuffer(126, PacketHeader.SHORT); + for (String string : player.getCommunication().getBlocked()) { + if (string.length() == 0) { + continue; + } + buffer.putLong(StringUtils.stringToLong(string)); + } + break; + case ContactContext.UPDATE_FRIEND_TYPE: + buffer = new IoBuffer(62, PacketHeader.BYTE); + buffer.putLong(StringUtils.stringToLong(context.getName())); + buffer.putShort(context.getWorldId()); + Contact c = player.getCommunication().getContacts().get(context.getName()); + if (c != null) { + buffer.put((byte) c.getRank().getValue()); + } else { + buffer.put((byte) 0); + } + if (context.isOnline()) { + buffer.putString("World " + context.getWorldId()); + } + break; + } + if (buffer != null) { + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());player.getSession().write(buffer); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/ContainerPacket.java b/Server/src/main/java/Server/core/net/packet/out/ContainerPacket.java new file mode 100644 index 000000000..be4dcd001 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/ContainerPacket.java @@ -0,0 +1,63 @@ +package core.net.packet.out; + +import core.game.container.ContainerEvent; +import core.game.node.item.Item; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.ContainerContext; + +/** + * Represents the outgoing container packet. + * @author Emperor + */ +public final class ContainerPacket implements OutgoingPacket { + + @Override + public void send(ContainerContext context) { + IoBuffer buffer = null; + if (context.isClear()) { + buffer = new IoBuffer(144); + buffer.putIntB(context.getInterfaceId() << 16 | context.getChildId()); + } else { + boolean slotBased = context.getSlots() != null; + buffer = new IoBuffer(slotBased ? 22 : 105, PacketHeader.SHORT); + buffer.putShort(context.getInterfaceId()); + buffer.putShort(context.getChildId()); + buffer.putShort(context.getType()); + if (slotBased) { + for (int slot : context.getSlots()) { + buffer.putSmart(slot); + Item item = context.getItems()[slot]; + if (item != null && !item.equals(ContainerEvent.NULL_ITEM)) { + buffer.putShort(item.getId() + 1); + int amount = item.getAmount(); + if (amount < 0 || amount > 254) { + buffer.put(255).putInt(amount); + } else { + buffer.put(amount); + } + } else { + buffer.putShort(0); + } + } + } else { + buffer.putShort(context.getItems().length); + for (Item item : context.getItems()) + if (item != null) { + int amount = item.getAmount(); + if (amount < 0 || amount > 254) { + buffer.putS(255).putInt(amount); + } else { + buffer.putS(amount); + } + buffer.putShort(item.getId() + 1); + } else { + buffer.putS(0).putShort(0); + } + } + } + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/DisplayModel.java b/Server/src/main/java/Server/core/net/packet/out/DisplayModel.java new file mode 100644 index 000000000..4fb26cfbb --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/DisplayModel.java @@ -0,0 +1,49 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.DisplayModelContext; + +/** + * Represents the outgoing packet for the displaying of a node model on an + * interface. + * @author Emperor + */ +public final class DisplayModel implements OutgoingPacket { + + @Override + public void send(DisplayModelContext context) { + IoBuffer buffer; + switch (context.getType()) { + case PLAYER: + buffer = new IoBuffer(66); + buffer.putLEShortA(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.putIntA(context.getInterfaceId() << 16 | context.getChildId()); + break; + case NPC: + buffer = new IoBuffer(73); + buffer.putShortA(context.getNodeId()); + buffer.putLEInt((context.getInterfaceId() << 16) | context.getChildId()); + buffer.putLEShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + break; + case ITEM: + int value = context.getAmount() > 0 ? context.getAmount() : context.getZoom(); + buffer = new IoBuffer(50); + buffer.putInt(value); + buffer.putIntB((context.getInterfaceId() << 16) | context.getChildId()); + buffer.putLEShortA(context.getNodeId()); + buffer.putLEShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + break; + case MODEL: + buffer = new IoBuffer(130); + buffer.putLEInt(context.getInterfaceId() << 16 | context.getChildId()); + buffer.putLEShortA(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.putShortA(context.getNodeId()); + break; + default: + return; + } + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/GameMessage.java b/Server/src/main/java/Server/core/net/packet/out/GameMessage.java new file mode 100644 index 000000000..3c1111a73 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/GameMessage.java @@ -0,0 +1,20 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.GameMessageContext; + +/** + * The game message outgoing packet. + * @author Emperor + */ +public class GameMessage implements OutgoingPacket { + + @Override + public void send(GameMessageContext context) { + IoBuffer buffer = new IoBuffer(70, PacketHeader.BYTE); + buffer.putString(context.getMessage()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/GrandExchangePacket.java b/Server/src/main/java/Server/core/net/packet/out/GrandExchangePacket.java new file mode 100644 index 000000000..ba57cfff4 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/GrandExchangePacket.java @@ -0,0 +1,42 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.GrandExchangeContext; + +/** + * The outgoing packet used for updating a player's grand exchange data. + * @author Emperor + * @author Vexia + * @author Angle + */ +public class GrandExchangePacket implements OutgoingPacket { + + private final int REMOVED = 6; + private final int ABORTED = 2; + + @Override + public void send(GrandExchangeContext context) { + final IoBuffer buffer = new IoBuffer(116, PacketHeader.NORMAL); + buffer.put(context.idx); + if (context.state == REMOVED) { + buffer.put(0).putShort(0).putInt(0).putInt(0).putInt(0).putInt(0); + } else { + byte state = (byte) (context.state + 1); + if (context.isSell) { + state += 8; + } + if (context.state == ABORTED) { + state = context.isSell ? (byte) -3 : (byte) 5; + } + buffer.put(state).putShort(context.itemID).putInt(context.value).putInt(context.amt). + putInt(context.completedAmt).putInt(context.totalCoinsExchanged); + } + try { + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } catch (Exception e) { + } + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/out/HintIcon.java b/Server/src/main/java/Server/core/net/packet/out/HintIcon.java new file mode 100644 index 000000000..77b046b28 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/HintIcon.java @@ -0,0 +1,31 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.HintIconContext; + +/** + * Handles the Hint icon outgoing packet. + * @author Emperor + */ +public final class HintIcon implements OutgoingPacket { + + @Override + public void send(HintIconContext context) { + IoBuffer buffer = new IoBuffer(217); + buffer.put(context.getSlot() << 6 | context.getTargetType()).put(context.getArrowId()); + if (context.getArrowId() > 0) { + if (context.getTargetType() == 1 || context.getTargetType() == 10) { + buffer.putShort(context.getIndex()).putShort(0) // Skip 3 bytes + .put(0); + } else if (context.getLocation() != null) { + buffer.putShort(context.getLocation().getX()).putShort(context.getLocation().getY()).put(context.getHeight()); + } else { + buffer.putShort(0).putShort(0).put(0); // Skip all bytes. + } + buffer.putShort(context.getModelId()); + } + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/InstancedLocationUpdate.java b/Server/src/main/java/Server/core/net/packet/out/InstancedLocationUpdate.java new file mode 100644 index 000000000..ecaf5f3ca --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/InstancedLocationUpdate.java @@ -0,0 +1,31 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.LocationContext; + +/** + * Outgoing packet used for updating a player's location solely on his own + * client. + * @author Emperor + */ +public final class InstancedLocationUpdate implements OutgoingPacket { + + @Override + public void send(LocationContext context) { + IoBuffer buffer = new IoBuffer(110); + Location l = context.getLocation(); + Player player = context.getPlayer(); + int flag = l.getZ() << 1; + if (context.isTeleport()) { + flag |= 0x1; + } + buffer.putS(flag); + buffer.put(l.getSceneX(player.getPlayerFlags().getLastSceneGraph())); + buffer.putA(l.getSceneY(player.getPlayerFlags().getLastSceneGraph())); + // TODO player.getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/InteractionOption.java b/Server/src/main/java/Server/core/net/packet/out/InteractionOption.java new file mode 100644 index 000000000..38b4fc322 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/InteractionOption.java @@ -0,0 +1,28 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.InteractionOptionContext; + +/** + * Handles the interaction option changed outgoing packet. + * @author Emperor + */ +public final class InteractionOption implements OutgoingPacket { + + @Override + public void send(InteractionOptionContext context) { + IoBuffer buffer = new IoBuffer(44, PacketHeader.BYTE); + buffer.putLEShortA(-1); + if(context.isRemove()){ + buffer.put(0); + } else { + buffer.put(context.getIndex() == 0 ? 1 : 0); + } + buffer.put(context.getIndex() + 1); + buffer.putString(context.getName()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/Interface.java b/Server/src/main/java/Server/core/net/packet/out/Interface.java new file mode 100644 index 000000000..6a8381922 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/Interface.java @@ -0,0 +1,21 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.InterfaceContext; + +/** + * The interface outgoing packet. + * @author Emperor + */ +public final class Interface implements OutgoingPacket { + + @Override + public void send(InterfaceContext context) { + IoBuffer buffer = new IoBuffer(155); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());buffer.put(context.isWalkable() ? 1 : 0); + buffer.putIntB(context.getWindowId() << 16 | context.getComponentId()).putShortA(context.getPlayer().getInterfaceManager().getPacketCount(1)).putShort(context.getInterfaceId()); + context.getPlayer().getDetails().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/InterfaceConfig.java b/Server/src/main/java/Server/core/net/packet/out/InterfaceConfig.java new file mode 100644 index 000000000..d4a7bcd82 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/InterfaceConfig.java @@ -0,0 +1,21 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.InterfaceConfigContext; + +/** + * The outgoing interface configuration packet. + * @author Emperor + */ +public class InterfaceConfig implements OutgoingPacket { + + @Override + public void send(InterfaceConfigContext context) { + IoBuffer buffer = new IoBuffer(21); + buffer.putC(context.isHidden() ? 1 : 0); + buffer.putShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.putLEInt(context.getInterfaceId() << 16 | context.getChildId()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } +} diff --git a/Server/src/main/java/Server/core/net/packet/out/LoginPacket.java b/Server/src/main/java/Server/core/net/packet/out/LoginPacket.java new file mode 100644 index 000000000..462be004c --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/LoginPacket.java @@ -0,0 +1,32 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.PlayerContext; + +import java.nio.ByteBuffer; + +/** + * Handles the login outgoing packet. + * @author Emperor + */ +public final class LoginPacket implements OutgoingPacket { + + @Override + public void send(PlayerContext context) { + Player p = context.getPlayer(); + ByteBuffer buffer = ByteBuffer.allocate(9); + int right = context.getPlayer().getDetails().getRights() == Rights.PLAYER_MODERATOR ? 1 : context.getPlayer().getDetails().getRights() == Rights.ADMINISTRATOR ? 2 : 0; + buffer.put((byte) (right)); + buffer.put((byte) 0); // Something with client scripts, maybe login // + // screen? + buffer.put((byte) 0); // No idea. + buffer.put((byte) 0); // No idea. + buffer.put((byte) 1); // Boolean, possibly members. + buffer.putShort((short) p.getIndex()); + buffer.put((byte) 1); // No idea. (something with client scripts, again) + p.getDetails().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/Logout.java b/Server/src/main/java/Server/core/net/packet/out/Logout.java new file mode 100644 index 000000000..daefb9768 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/Logout.java @@ -0,0 +1,18 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.PlayerContext; + +/** + * The outgoing logout packet. + * @author Emperor + */ +public class Logout implements OutgoingPacket { + + @Override + public void send(PlayerContext context) { + IoBuffer buffer = new IoBuffer(86); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/MinimapState.java b/Server/src/main/java/Server/core/net/packet/out/MinimapState.java new file mode 100644 index 000000000..f13ea5a90 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/MinimapState.java @@ -0,0 +1,19 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.MinimapStateContext; + +/** + * Handles the sending of the minimap state outgoing packet. + * @author Emperor + */ +public final class MinimapState implements OutgoingPacket { + + @Override + public void send(MinimapStateContext context) { + IoBuffer buffer = new IoBuffer(192).put(context.getState()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/MusicPacket.java b/Server/src/main/java/Server/core/net/packet/out/MusicPacket.java new file mode 100644 index 000000000..e2831e513 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/MusicPacket.java @@ -0,0 +1,27 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.MusicContext; + +/** + * Outgoing Music packet + * @author SonicForce41 + */ +public class MusicPacket implements OutgoingPacket { + + @Override + public void send(MusicContext context) { + IoBuffer buffer = null; + if (context.isSecondary()) { + buffer = new IoBuffer(208); + buffer.putTri(255); + buffer.putLEShort(context.getMusicId()); + } else { + buffer = new IoBuffer(4); + buffer.putLEShortA(context.getMusicId()); + } + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/out/PingPacket.java b/Server/src/main/java/Server/core/net/packet/out/PingPacket.java new file mode 100644 index 000000000..70ea914c3 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/PingPacket.java @@ -0,0 +1,20 @@ +package core.net.packet.out; + +import core.net.packet.OutgoingPacket; +import core.net.packet.context.PlayerContext; + +/** + * Handles the ping packet sending. + * @author Emperor + */ +public final class PingPacket implements OutgoingPacket { + + @Override + public void send(PlayerContext context) { + // TODO: Find real ping packet, this is actually clear minimap flag + // packet. + // context.getPlayer().getDetails().getSession().write(new + // IoBuffer(47)); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/PositionedGraphic.java b/Server/src/main/java/Server/core/net/packet/out/PositionedGraphic.java new file mode 100644 index 000000000..2652632eb --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/PositionedGraphic.java @@ -0,0 +1,23 @@ +package core.net.packet.out; + +import core.game.world.map.Location; +import core.game.world.update.flag.context.Graphics; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.PositionedGraphicContext; + +/** + * The positioned graphic outgoing packet. + * @author Emperor + */ +public final class PositionedGraphic implements OutgoingPacket { + + @Override + public void send(PositionedGraphicContext context) { + Location l = context.getLocation(); + Graphics g = context.getGraphic(); + IoBuffer buffer = UpdateAreaPosition.getBuffer(context.getPlayer(), l).put(17).put((l.getChunkOffsetX() << 4) | (l.getChunkOffsetY() & 0x7)).putShort(g.getId()).put(g.getHeight()).putShort(g.getDelay()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/out/RepositionChild.java b/Server/src/main/java/Server/core/net/packet/out/RepositionChild.java new file mode 100644 index 000000000..06898b20c --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/RepositionChild.java @@ -0,0 +1,23 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.ChildPositionContext; + +/** + * Handles the "reposition interface child" outgoing packet. + * @author Emperor + */ +public final class RepositionChild implements OutgoingPacket { + + @Override + public void send(ChildPositionContext context) { + IoBuffer buffer = new IoBuffer(119) + .putShortA(context.getPlayer().getInterfaceManager().getPacketCount(1)) + .putLEInt(context.getInterfaceId() << 16 | context.getChildId()) + .putShort(context.getPosition().x) + .putShortA(context.getPosition().y); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/RunEnergy.java b/Server/src/main/java/Server/core/net/packet/out/RunEnergy.java new file mode 100644 index 000000000..0fef5dd98 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/RunEnergy.java @@ -0,0 +1,19 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.PlayerContext; + +/** + * The run energy outgoing packet. + * @author Emperor + */ +public class RunEnergy implements OutgoingPacket { + + @Override + public void send(PlayerContext context) { + IoBuffer buffer = new IoBuffer(234); + buffer.put((byte) context.getPlayer().getSettings().getRunEnergy()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/RunScriptPacket.java b/Server/src/main/java/Server/core/net/packet/out/RunScriptPacket.java new file mode 100644 index 000000000..de4bc0884 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/RunScriptPacket.java @@ -0,0 +1,54 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.RunScriptContext; + +/** + * The run script outgoing packet. + * @author Snickerize + */ +public class RunScriptPacket implements OutgoingPacket { + + /*@Override + public void send(RunScriptContext context) { + String string = context.getString(); + Object[] objects = context.getObjects(); + IoBuffer buffer = new IoBuffer(115, PacketHeader.SHORT); + buffer.putShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.putString(string); + int j = 0; + for (int i = (string.length() - 1); i >= 0; i--) { + if (string.charAt(i) == 's') { + buffer.putString((String) objects[j]); + } else { + buffer.putInt((Integer) objects[j]); + } + j++; + } + buffer.putInt(context.getId()); + context.getPlayer().getDetails().getSession().write(buffer); + }*/ + @Override + public void send(RunScriptContext context) { + String types = context.getString(); + Object[] objects = context.getObjects(); + IoBuffer buffer = new IoBuffer(115, PacketHeader.SHORT); + buffer.putShort(context.getPlayer().getInterfaceManager().getPacketCount(1)); + + buffer.putString(types); + int j = 0; + for (int i = (types.length() - 1); i >= 0; i--) { + if (types.charAt(i) == 's') { + buffer.putString((String) objects[j]); + } else { + buffer.putInt((Integer) objects[j]); + } + j++; + } + + buffer.putInt(context.getId()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } +} diff --git a/Server/src/main/java/Server/core/net/packet/out/SetWalkOption.java b/Server/src/main/java/Server/core/net/packet/out/SetWalkOption.java new file mode 100644 index 000000000..32e71deb0 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/SetWalkOption.java @@ -0,0 +1,19 @@ +package core.net.packet.out; + +import core.net.packet.OutgoingPacket; +import core.net.packet.context.WalkOptionContext; + +/** + * Handles the sending of the "Set walk-to option" packet. + * @author Emperor + */ +public final class SetWalkOption implements OutgoingPacket { + + @Override + public void send(WalkOptionContext context) { + // TODO IoBuffer buffer = new IoBuffer(10, + // PacketHeader.BYTE).putString(context.getOption()); + // context.getPlayer().getDetails().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/SkillLevel.java b/Server/src/main/java/Server/core/net/packet/out/SkillLevel.java new file mode 100644 index 000000000..35bd1399d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/SkillLevel.java @@ -0,0 +1,29 @@ +package core.net.packet.out; + +import core.game.node.entity.skill.Skills; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.SkillContext; + +/** + * Handles the update skill outgoing packet. + * @author Emperor + */ +public final class SkillLevel implements OutgoingPacket { + + @Override + public void send(SkillContext context) { + final IoBuffer buffer = new IoBuffer(38); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());Skills skills = context.getPlayer().getSkills(); + if (context.getSkillId() == Skills.PRAYER) { + buffer.putA((int) Math.ceil(skills.getPrayerPoints())); + } else if (context.getSkillId() == Skills.HITPOINTS) { + buffer.putA(skills.getLifepoints()); + } else { + buffer.putA(skills.getLevel(context.getSkillId(), true)); + } + buffer.putIntA((int) skills.getExperience(context.getSkillId())).put(context.getSkillId()); + context.getPlayer().getDetails().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/StringPacket.java b/Server/src/main/java/Server/core/net/packet/out/StringPacket.java new file mode 100644 index 000000000..0da5ec39a --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/StringPacket.java @@ -0,0 +1,22 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.StringContext; + +/** + * The outgoing set component string packet. + * @author Emperor + */ +public class StringPacket implements OutgoingPacket { + + @Override + public void send(StringContext context) { + IoBuffer buffer = new IoBuffer(171, PacketHeader.SHORT); + buffer.putIntB((context.getInterfaceId() << 16) | context.getLineId()); + buffer.putString(context.getString()); + buffer.putShortA(context.getPlayer().getInterfaceManager().getPacketCount(1)); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } +} diff --git a/Server/src/main/java/Server/core/net/packet/out/SystemUpdatePacket.java b/Server/src/main/java/Server/core/net/packet/out/SystemUpdatePacket.java new file mode 100644 index 000000000..6e598e83b --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/SystemUpdatePacket.java @@ -0,0 +1,19 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.SystemUpdateContext; + +/** + * Handles the system update packet. + * @author 'Vexia + */ +public class SystemUpdatePacket implements OutgoingPacket { + + @Override + public void send(final SystemUpdateContext context) { + IoBuffer buffer = new IoBuffer(85).putShort(context.getTime()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getDetails().getSession().write(buffer); + } + +} diff --git a/Server/src/main/java/Server/core/net/packet/out/UpdateAreaPosition.java b/Server/src/main/java/Server/core/net/packet/out/UpdateAreaPosition.java new file mode 100644 index 000000000..85621d44d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/UpdateAreaPosition.java @@ -0,0 +1,46 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.world.map.Location; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.AreaPositionContext; + +/** + * Handles the update area position packet. + * @author Emperor + */ +public final class UpdateAreaPosition implements OutgoingPacket { + + /** + * Gets the region chunk update buffer. + * @param player The player. + * @param base The base location of the chunk. + * @return The buffer. + */ + public static IoBuffer getChunkUpdateBuffer(Player player, Location base) { + int x = base.getSceneX(player.getPlayerFlags().getLastSceneGraph()); + int y = base.getSceneY(player.getPlayerFlags().getLastSceneGraph()); + return new IoBuffer(230, PacketHeader.SHORT).putA(y).putS(x); + } + + /** + * Gets the region chunk update buffer. + * @param player The player. + * @param base The base location of the chunk. + * @return The buffer. + */ + public static IoBuffer getBuffer(Player player, Location base) { + int x = base.getSceneX(player.getPlayerFlags().getLastSceneGraph()); + int y = base.getSceneY(player.getPlayerFlags().getLastSceneGraph()); + return new IoBuffer(26).putC(x).put(y); + } + + @Override + public void send(AreaPositionContext context) { + IoBuffer buffer = getBuffer(context.getPlayer(),context.getLocation()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/UpdateClanChat.java b/Server/src/main/java/Server/core/net/packet/out/UpdateClanChat.java new file mode 100644 index 000000000..86e298ee2 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/UpdateClanChat.java @@ -0,0 +1,43 @@ +package core.net.packet.out; + +import core.game.system.communication.ClanEntry; +import core.game.system.communication.ClanRepository; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.ClanContext; +import core.tools.StringUtils; + +/** + * Handles the update clan chat outgoing packet. + * @author Emperor + */ +public final class UpdateClanChat implements OutgoingPacket { + + @Override + public void send(ClanContext context) { + IoBuffer buffer = new IoBuffer(55, PacketHeader.SHORT); + ClanRepository clan = context.getClan(); + if (!context.isLeave()) { + buffer.putLong(StringUtils.stringToLong(clan.getOwner())); + buffer.putLong(StringUtils.stringToLong(clan.getName())); + buffer.put(clan.getKickRequirement().getValue()); + int size = clan.getPlayers().size(); + if (size > 100) { + size = 100; + } + buffer.put(size); + for (int i = 0; i < size; i++) { + ClanEntry entry = clan.getPlayers().get(i); + String name = entry.getName(); + buffer.putLong(StringUtils.stringToLong(name)).putShort(entry.getWorldId()); + buffer.put(clan.getRank(entry).getValue()); + buffer.putString("World " + entry.getWorldId()); + } + } else { + buffer.putLong(0); + } + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/UpdateGroundItemAmount.java b/Server/src/main/java/Server/core/net/packet/out/UpdateGroundItemAmount.java new file mode 100644 index 000000000..21a764a3a --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/UpdateGroundItemAmount.java @@ -0,0 +1,34 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.BuildItemContext; + +/** + * Updates the ground item amount. + * @author Emperor + */ +public final class UpdateGroundItemAmount implements OutgoingPacket { + + /** + * Writes the packet. + * @param buffer The buffer. + * @param item The item. + */ + public static IoBuffer write(IoBuffer buffer, Item item, int oldAmount) { + Location l = item.getLocation(); + buffer.put(14).put((l.getChunkOffsetX() << 4) | (l.getChunkOffsetY() & 0x7)).putShort(item.getId()).putShort(oldAmount).putShort(item.getAmount()); + return buffer; + } + + @Override + public void send(BuildItemContext context) { + Player player = context.getPlayer(); + Item item = context.getItem(); + IoBuffer buffer = write(UpdateAreaPosition.getBuffer(player, item.getLocation().getChunkBase()), item, context.getOldAmount()); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());player.getDetails().getSession().write(buffer); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/UpdateRandomFile.java b/Server/src/main/java/Server/core/net/packet/out/UpdateRandomFile.java new file mode 100644 index 000000000..3e51b2b64 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/UpdateRandomFile.java @@ -0,0 +1,27 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.PlayerContext; + +/** + * Updates the random.dat file for the player. + * @author Emperor + */ +public final class UpdateRandomFile implements OutgoingPacket { + + @Override + public void send(PlayerContext context) { + IoBuffer buffer = new IoBuffer(211); + buffer.putInt(1); // Let's assume this is UID. + buffer.put(0); + buffer.put(0); + buffer.put(0); + buffer.put(0); + for (int i = 0; i < 4; i++) { + buffer.putInt(i + 100); + } + // TODO context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/UpdateSceneGraph.java b/Server/src/main/java/Server/core/net/packet/out/UpdateSceneGraph.java new file mode 100644 index 000000000..19d76661e --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/UpdateSceneGraph.java @@ -0,0 +1,39 @@ +package core.net.packet.out; + +import core.game.node.entity.player.Player; +import core.game.system.config.XteaParser; +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.PacketHeader; +import core.net.packet.context.SceneGraphContext; + +/** + * The update scene graph outgoing packet. + * @author Emperor + */ +public final class UpdateSceneGraph implements OutgoingPacket { + + @Override + public void send(SceneGraphContext context) { + IoBuffer buffer = new IoBuffer(162, PacketHeader.SHORT); + Player player = context.getPlayer(); + buffer.cypherOpcode(player.getSession().getIsaacPair().getOutput()); + player.getPlayerFlags().setLastSceneGraph(player.getLocation()); + buffer.putShortA(player.getLocation().getSceneX()); + for (int regionX = (player.getLocation().getRegionX() - 6) / 8; regionX <= ((player.getLocation().getRegionX() + 6) / 8); regionX++) { + for (int regionY = (player.getLocation().getRegionY() - 6) / 8; regionY <= ((player.getLocation().getRegionY() + 6) / 8); regionY++) { + int[] keys = XteaParser.Companion.getRegionXTEA(regionX << 8 | regionY); + for (int i = 0; i < keys.length; i++) { + buffer.putIntB(keys[i]); + } + } + } + + buffer.putS(player.getLocation().getZ()); + buffer.putShort(player.getLocation().getRegionX()); + buffer.putShortA(player.getLocation().getRegionY()); + buffer.putShortA(player.getLocation().getSceneY()); + player.getDetails().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/WeightUpdate.java b/Server/src/main/java/Server/core/net/packet/out/WeightUpdate.java new file mode 100644 index 000000000..935e0b77d --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/WeightUpdate.java @@ -0,0 +1,20 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.PlayerContext; + +/** + * Handles the outgoing weight update packet. + * @author Emperor + */ +public final class WeightUpdate implements OutgoingPacket { + + @Override + public void send(PlayerContext context) { + IoBuffer buffer = new IoBuffer(174); + buffer.putShort((int) context.getPlayer().getSettings().getWeight()); + // TODO context.getPlayer().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/packet/out/WindowsPane.java b/Server/src/main/java/Server/core/net/packet/out/WindowsPane.java new file mode 100644 index 000000000..97a59b921 --- /dev/null +++ b/Server/src/main/java/Server/core/net/packet/out/WindowsPane.java @@ -0,0 +1,22 @@ +package core.net.packet.out; + +import core.net.packet.IoBuffer; +import core.net.packet.OutgoingPacket; +import core.net.packet.context.WindowsPaneContext; + +/** + * Handles the windows pane outgoing packet. + * @author Emperor + */ +public final class WindowsPane implements OutgoingPacket { + + @Override + public void send(WindowsPaneContext context) { + IoBuffer buffer = new IoBuffer(145); + buffer.cypherOpcode(context.getPlayer().getSession().getIsaacPair().getOutput());buffer.putLEShortA(context.getWindowId()); + buffer.putS(context.getType()); + buffer.putLEShortA(context.getPlayer().getInterfaceManager().getPacketCount(1)); + context.getPlayer().getDetails().getSession().write(buffer); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/producer/GameEventProducer.java b/Server/src/main/java/Server/core/net/producer/GameEventProducer.java new file mode 100644 index 000000000..d28255ec8 --- /dev/null +++ b/Server/src/main/java/Server/core/net/producer/GameEventProducer.java @@ -0,0 +1,28 @@ +package core.net.producer; + +import core.net.EventProducer; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.event.GameReadEvent; +import core.net.event.GameWriteEvent; + +import java.nio.ByteBuffer; + +/** + * Produces game packet I/O events. + * @author Emperor + */ +public final class GameEventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new GameReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new GameWriteEvent(session, context); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/producer/HSEventProducer.java b/Server/src/main/java/Server/core/net/producer/HSEventProducer.java new file mode 100644 index 000000000..5fb3895ff --- /dev/null +++ b/Server/src/main/java/Server/core/net/producer/HSEventProducer.java @@ -0,0 +1,28 @@ +package core.net.producer; + +import core.net.EventProducer; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.event.HSReadEvent; +import core.net.event.HSWriteEvent; + +import java.nio.ByteBuffer; + +/** + * Produces I/O events for the handshake protocol. + * @author Emperor + */ +public final class HSEventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new HSReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new HSWriteEvent(session, context); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/producer/JS5EventProducer.java b/Server/src/main/java/Server/core/net/producer/JS5EventProducer.java new file mode 100644 index 000000000..26cf8635a --- /dev/null +++ b/Server/src/main/java/Server/core/net/producer/JS5EventProducer.java @@ -0,0 +1,29 @@ +package core.net.producer; + +import core.net.EventProducer; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.event.JS5ReadEvent; +import core.net.event.JS5WriteEvent; + +import java.nio.ByteBuffer; + +/** + * Produces JS-5 I/O events. + * @author Tyler + * @author Emperor + */ +public class JS5EventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new JS5ReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new JS5WriteEvent(session, context); + } + +} diff --git a/Server/src/main/java/Server/core/net/producer/LoginEventProducer.java b/Server/src/main/java/Server/core/net/producer/LoginEventProducer.java new file mode 100644 index 000000000..9f5a30776 --- /dev/null +++ b/Server/src/main/java/Server/core/net/producer/LoginEventProducer.java @@ -0,0 +1,28 @@ +package core.net.producer; + +import core.net.EventProducer; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.event.LoginReadEvent; +import core.net.event.LoginWriteEvent; + +import java.nio.ByteBuffer; + +/** + * Produces login I/O events. + * @author Emperor + */ +public final class LoginEventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new LoginReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new LoginWriteEvent(session, context); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/producer/MSEventProducer.java b/Server/src/main/java/Server/core/net/producer/MSEventProducer.java new file mode 100644 index 000000000..cc7400ecc --- /dev/null +++ b/Server/src/main/java/Server/core/net/producer/MSEventProducer.java @@ -0,0 +1,28 @@ +package core.net.producer; + +import core.net.EventProducer; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.event.MSReadEvent; +import core.net.event.MSWriteEvent; + +import java.nio.ByteBuffer; + +/** + * Handles Management server events. + * @author Emperor + */ +public final class MSEventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new MSReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new MSWriteEvent(session, context); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/producer/MSHSEventProducer.java b/Server/src/main/java/Server/core/net/producer/MSHSEventProducer.java new file mode 100644 index 000000000..3372461f4 --- /dev/null +++ b/Server/src/main/java/Server/core/net/producer/MSHSEventProducer.java @@ -0,0 +1,28 @@ +package core.net.producer; + +import core.net.EventProducer; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.event.MSHSReadEvent; +import core.net.event.MSHSWriteEvent; + +import java.nio.ByteBuffer; + +/** + * Handles the Management server handshake event producing. + * @author Emperor + */ +public final class MSHSEventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new MSHSReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new MSHSWriteEvent(session, context); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/producer/RegistryEventProducer.java b/Server/src/main/java/Server/core/net/producer/RegistryEventProducer.java new file mode 100644 index 000000000..3986deb73 --- /dev/null +++ b/Server/src/main/java/Server/core/net/producer/RegistryEventProducer.java @@ -0,0 +1,28 @@ +package core.net.producer; + +import core.net.EventProducer; +import core.net.IoReadEvent; +import core.net.IoSession; +import core.net.IoWriteEvent; +import core.net.event.RegistryReadEvent; +import core.net.event.RegistryWriteEvent; + +import java.nio.ByteBuffer; + +/** + * Handles world server registry. + * @author Emperor + */ +public final class RegistryEventProducer implements EventProducer { + + @Override + public IoReadEvent produceReader(IoSession session, ByteBuffer buffer) { + return new RegistryReadEvent(session, buffer); + } + + @Override + public IoWriteEvent produceWriter(IoSession session, Object context) { + return new RegistryWriteEvent(session, context); + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/net/registry/AccountRegister.java b/Server/src/main/java/Server/core/net/registry/AccountRegister.java new file mode 100644 index 000000000..1b1da78ff --- /dev/null +++ b/Server/src/main/java/Server/core/net/registry/AccountRegister.java @@ -0,0 +1,206 @@ +package core.net.registry; + +import java.nio.ByteBuffer; +import java.sql.Connection; +import java.sql.Date; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import core.ServerConstants; +import core.cache.misc.buffer.ByteBufferUtils; +import core.game.node.entity.player.info.portal.PlayerSQLManager; +import core.game.system.SystemLogger; +import core.game.system.SystemManager; +import core.game.system.mysql.SQLEntryHandler; +import core.game.system.mysql.SQLManager; +import core.game.system.task.TaskExecutor; +import core.game.world.GameWorld; +import core.net.Constants; +import core.net.IoSession; +import core.net.event.LoginReadEvent; + +/** + * Handles the registry of new accounts. + * @author Vexia + * + */ +public class AccountRegister extends SQLEntryHandler { + + /** + * The table name. + */ + private static final String TABLE = "members"; + + /** + * The column name. + */ + private static final String COLUMN = "username"; + + /** + * The pattern compiler. + */ + private static final Pattern PATTERN = Pattern.compile("[a-z0-9_]{1,12}"); + + /** + * Constructs a new {@Code AccountRegister} {@Code Object} + * @param entry The registry entry. + */ + public AccountRegister(RegistryDetails entry) { + super(entry, TABLE, COLUMN, entry.getUsername()); + } + + /** + * Reads the incoming opcode of an account register. + * @param session the session. + * @param opcode the opcode. + * @param buffer the buffer. + */ + public static void read(final IoSession session, int opcode, ByteBuffer buffer) { + int day,month,year,country; + switch (opcode) { + case 147://details + day = buffer.get(); + month = buffer.get(); + year = buffer.getShort(); + country = buffer.getShort(); + response(session, RegistryResponse.SUCCESS); + break; + case 186://username + final String username = ByteBufferUtils.getString(buffer).replace(" ", "_").toLowerCase().replace("|", ""); + if (username.length() <= 0 || username.length() > 12) { + response(session, RegistryResponse.INVALID_USERNAME); + break; + } + if (!validUsername(username)) { + System.out.println("AHAHHA " + username); + response(session,RegistryResponse.INVALID_USERNAME); + break; + } + System.out.println(username); + TaskExecutor.executeSQL(new Runnable() { + @Override + public void run() { + try { + if (PlayerSQLManager.hasSqlAccount(username, "username")) { + response(session, RegistryResponse.NOT_AVAILBLE_USER); + return; + } + response(session, RegistryResponse.SUCCESS); + } catch (SQLException e) { + e.printStackTrace(); + } + } + }); + break; + case 36://Register details + buffer.get(); //Useless size being written that is already written in the RSA block + buffer = LoginReadEvent.getRSABlock(buffer); + if(buffer.get() != 10){ //RSA header (aka did this decrypt properly) + response(session, RegistryResponse.CANNOT_CREATE); + break; + } + buffer.getShort(); // random data + int revision = buffer.getShort();//revision? + if (revision != Constants.REVISION) { + response(session, RegistryResponse.CANNOT_CREATE); + break; + } + final String name = ByteBufferUtils.getString(buffer).replace(" ", "_").toLowerCase().replace("|", ""); + buffer.getInt(); + String password = ByteBufferUtils.getString(buffer); + if (password.length() < 5 || password.length() > 20) { + response(session, RegistryResponse.INVALID_PASS_LENGTH); + break; + } + if (password.equals(name)) { + response(session, RegistryResponse.PASS_SIMILAR_TO_USER); + break; + } + if (!validUsername(name)) { + response(session, RegistryResponse.INVALID_USERNAME); + break; + } + buffer.getInt(); + buffer.getShort(); + day = buffer.get(); + month = buffer.get(); + buffer.getInt(); + year = buffer.getShort(); + country = buffer.getShort(); + buffer.getInt(); + @SuppressWarnings("deprecation") + final RegistryDetails details = new RegistryDetails(name, SystemManager.getEncryption().hashPassword(password), new Date(year, month, day), country); + TaskExecutor.execute(new Runnable() { + @Override + public void run() { + try { + if (PlayerSQLManager.hasSqlAccount(name, "username")) { + response(session, RegistryResponse.CANNOT_CREATE); + return; + } + SQLEntryHandler.write(new AccountRegister(details)); + response(session, RegistryResponse.SUCCESS); + } catch (SQLException e) { + e.printStackTrace(); + response(session, RegistryResponse.CANNOT_CREATE); + } + } + }); + break; + default: + SystemLogger.logErr("Unhandled account registry opcode = " + opcode); + break; + } + } + + @Override + public void create() throws SQLException {} + + @Override + public void parse() throws SQLException {} + + @Override + public void save() throws SQLException { + PreparedStatement statement = getWritingStatement(true, "password", "salt", "birthday", "countryCode", "joined_date","currentClan"); + statement.setString(1, entry.getUsername()); + statement.setString(2, entry.getPassword()); + statement.setString(3, entry.getPassword().substring(0, 29)); + statement.setDate(4, entry.getBirth()); + statement.setInt(5, entry.getCountry()); + statement.setTimestamp(6, new Timestamp(System.currentTimeMillis())); + + statement.setString(7, GameWorld.getSettings().getEnable_default_clan() ? ServerConstants.SERVER_NAME.toLowerCase(): null); + + statement.executeUpdate(); + SQLManager.close(statement.getConnection()); + } + + /** + * Sends a registry response code. + * @param response the response. + */ + private static void response(IoSession session, RegistryResponse response) { + ByteBuffer buf = ByteBuffer.allocate(100); + buf.put((byte) response.getId()); + session.queue((ByteBuffer) buf.flip()); + } + + /** + * Checks if a username is valid. + * @return {@code True} if so. + */ + public static boolean validUsername(final String username) { + Matcher matcher = PATTERN.matcher(username); + return matcher.matches(); + + } + + @Override + public Connection getConnection() { + return SQLManager.getConnection(); + } + +} diff --git a/Server/src/main/java/Server/core/net/registry/RegistryDetails.java b/Server/src/main/java/Server/core/net/registry/RegistryDetails.java new file mode 100644 index 000000000..443eaa5cf --- /dev/null +++ b/Server/src/main/java/Server/core/net/registry/RegistryDetails.java @@ -0,0 +1,78 @@ +package core.net.registry; + +import java.sql.Date; + +/** + * Represents details of an account to register. + * @author Vexia + * + */ +public class RegistryDetails { + + /** + * The username. + */ + private final String username; + + /** + * The password. + */ + private final String password; + + /** + * The date of birth. + */ + private final Date birth; + + /** + * The country. + */ + private final int country; + + /** + * Constructs a new {@Code RegistryDetails} {@Code Object} + * @param username The username to register. + * @param password The password to register. + * @param birth The birth year. + * @param country The country code. + */ + public RegistryDetails(String username, String password, Date birth, int country) { + this.username = username; + this.password = password; + this.birth = birth; + this.country = country; + } + + /** + * Gets the username. + * @return the username. + */ + public String getUsername() { + return username; + } + + /** + * Gets the password. + * @return the password. + */ + public String getPassword() { + return password; + } + + /** + * Gets the birth. + * @return the birth. + */ + public Date getBirth() { + return birth; + } + + /** + * Gets the country. + * @return the country. + */ + public int getCountry() { + return country; + } + +} diff --git a/Server/src/main/java/Server/core/net/registry/RegistryResponse.java b/Server/src/main/java/Server/core/net/registry/RegistryResponse.java new file mode 100644 index 000000000..573e729be --- /dev/null +++ b/Server/src/main/java/Server/core/net/registry/RegistryResponse.java @@ -0,0 +1,46 @@ +package core.net.registry; + +/** + * An account registry response. + * @author Vexia + * + */ +public enum RegistryResponse { + SUCCESS(2), + CONTACT_ERROR(3), + SERVER_BUSY(7), + CANNOT_CREATE(9), + INVALID_BIRTH(10), + FUTURE_BIRTH(11), + BIRTH_THIS_YEAR(12), + BIRTH_LAST_YEAR(13), + INVALID_COUNTRY(14), + NOT_AVAILBLE_USER(20), + INVALID_USERNAME(22), + INVALID_PASS_LENGTH(30), + INVALID_PASS(31), + WEAK_PASS(32), + PASS_SIMILAR_TO_USER(33); + + /** + * The response id. + */ + private final int id; + + /** + * Constructs a new {@Code RegistryResponse} {@Code Object} + * @param id the id. + */ + RegistryResponse(int id) { + this.id = id; + } + + /** + * Gets the id. + * @return the id. + */ + public int getId() { + return id; + } + +} diff --git a/Server/src/main/java/Server/core/plugin/CorePluginTypes/ManagerPlugin.java b/Server/src/main/java/Server/core/plugin/CorePluginTypes/ManagerPlugin.java new file mode 100644 index 000000000..bb25c1393 --- /dev/null +++ b/Server/src/main/java/Server/core/plugin/CorePluginTypes/ManagerPlugin.java @@ -0,0 +1,12 @@ +package core.plugin.CorePluginTypes; + +import core.plugin.Plugin; + +public abstract class ManagerPlugin implements Plugin { + public abstract void tick(); + + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } +} diff --git a/Server/src/main/java/Server/core/plugin/CorePluginTypes/Managers.java b/Server/src/main/java/Server/core/plugin/CorePluginTypes/Managers.java new file mode 100644 index 000000000..440be0c7c --- /dev/null +++ b/Server/src/main/java/Server/core/plugin/CorePluginTypes/Managers.java @@ -0,0 +1,22 @@ +package core.plugin.CorePluginTypes; + +import core.game.system.SystemLogger; + +import java.util.ArrayList; +import java.util.List; + +public class Managers { + + private static List plugins = new ArrayList<>(); + public static void register(ManagerPlugin plugin){ + if(plugin != null){ + plugins.add(plugin); + } + } + + public static void tick(){ + for(ManagerPlugin p : plugins){ + p.tick(); + } + } +} diff --git a/Server/src/main/java/Server/core/plugin/CorePluginTypes/StartupPlugin.java b/Server/src/main/java/Server/core/plugin/CorePluginTypes/StartupPlugin.java new file mode 100644 index 000000000..169ac1568 --- /dev/null +++ b/Server/src/main/java/Server/core/plugin/CorePluginTypes/StartupPlugin.java @@ -0,0 +1,7 @@ +package core.plugin.CorePluginTypes; + +import core.plugin.Plugin; + +public abstract class StartupPlugin implements Plugin { + public abstract void run(); +} diff --git a/Server/src/main/java/Server/core/plugin/CorePluginTypes/XPGainPlugins.kt b/Server/src/main/java/Server/core/plugin/CorePluginTypes/XPGainPlugins.kt new file mode 100644 index 000000000..976ca3ded --- /dev/null +++ b/Server/src/main/java/Server/core/plugin/CorePluginTypes/XPGainPlugins.kt @@ -0,0 +1,28 @@ +package core.plugin.CorePluginTypes + +import core.game.node.entity.player.Player +import core.plugin.Plugin + +object XPGainPlugins { + @JvmStatic + private val plugins = ArrayList() + @JvmStatic + fun add(plugin: XPGainPlugin){ + plugins.add(plugin) + } + @JvmStatic + fun run(player: Player, skill: Int, amount: Double){ + if(player.isArtificial) return + plugins.forEach { + it.run(player,skill,amount) + } + } +} + +abstract class XPGainPlugin : Plugin { + override fun newInstance(arg: Any?): Plugin { + XPGainPlugins.add(this) + return this + } + abstract fun run(player: Player, skill: Int, amount: Double) +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/plugin/Initializable.java b/Server/src/main/java/Server/core/plugin/Initializable.java new file mode 100644 index 000000000..b48044fb6 --- /dev/null +++ b/Server/src/main/java/Server/core/plugin/Initializable.java @@ -0,0 +1,18 @@ +package core.plugin; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Represents a initializable piece of content. + * + * @author Jonathan + */ + +@Retention(RetentionPolicy.RUNTIME) +@Target(value = ElementType.TYPE) +public @interface Initializable { + +} diff --git a/Server/src/main/java/Server/core/plugin/Plugin.java b/Server/src/main/java/Server/core/plugin/Plugin.java new file mode 100644 index 000000000..b9f81b4ea --- /dev/null +++ b/Server/src/main/java/Server/core/plugin/Plugin.java @@ -0,0 +1,29 @@ +package core.plugin; + +import core.game.node.entity.player.Player; + +/** + * Represents a plugin. + * @author Emperor + * @param The argument type. + */ +public interface Plugin { + + /** + * Creates a new instance. + * @param arg The argument. + * @return The plugin instance created. + */ + public Plugin newInstance(T arg) throws Throwable; + + /** + * Fires a plugin event. + * @param identifier The identifier. + * @param args The arguments. + * @return Specified by the plugin implementation. + */ + Object fireEvent(String identifier, Object... args); + + public default void handleSelectionCallback(int skill, Player player){}; + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/plugin/PluginManager.kt b/Server/src/main/java/Server/core/plugin/PluginManager.kt new file mode 100644 index 000000000..ca8470fc0 --- /dev/null +++ b/Server/src/main/java/Server/core/plugin/PluginManager.kt @@ -0,0 +1,122 @@ +package core.plugin + +import core.game.node.entity.player.info.login.LoginConfiguration +import core.game.node.entity.player.link.quest.Quest +import core.game.node.entity.player.link.quest.QuestRepository +import core.game.system.SystemLogger +import io.github.classgraph.ClassGraph +import io.github.classgraph.ClassInfo +import core.game.content.activity.ActivityManager +import core.game.content.activity.ActivityPlugin +import core.game.system.command.Command +import core.game.content.dialogue.DialoguePlugin +import java.lang.Exception +import java.util.* +import java.util.function.Consumer +import kotlin.reflect.jvm.internal.impl.load.kotlin.JvmType + +/** + * Represents a class used to handle the loading of all plugins. + * @author Ceikry + */ +object PluginManager { + var disabledPlugins = HashMap() + /** + * The amount of plugins loaded. + */ + var amountLoaded = 0 + private set + + /** + * The currently loaded plugin names. + */ + private var loadedPlugins: MutableList? = ArrayList() + + /** + * The last loaded plugin. + */ + private val lastLoaded: String? = null + + /** + * Initializes the plugin manager. + */ + @JvmStatic + fun init() { + try { + load() + loadedPlugins!!.clear() + loadedPlugins = null + SystemLogger.logInfo("Initialized $amountLoaded plugins...") + } catch (t: Throwable) { + SystemLogger.logErr("Error initializing Plugins -> " + t.localizedMessage + " for file -> " + lastLoaded) + t.printStackTrace() + } + } + + fun load() { + var result = ClassGraph().enableClassInfo().enableAnnotationInfo().scan() + result.getClassesWithAnnotation("core.plugin.Initializable").forEach(Consumer { p: ClassInfo -> + try { + definePlugin(p.loadClass().newInstance() as Plugin) + } catch (e: InstantiationException) { + e.printStackTrace() + } catch (e: IllegalAccessException) { + e.printStackTrace() + } + }) + result.getSubclasses("core.game.system.command.Command").forEach { + System.out.println("E") + try { + definePlugin(it.loadClass().newInstance() as Plugin).also { System.out.println("Initializing $it") } + } catch (e: Exception) {e.printStackTrace()} + } + } + + /** + * Defines a list of plugins. + * @param plugins the plugins. + */ + @JvmStatic + fun definePlugins(vararg plugins: Plugin<*>) { + val pluginsLength = plugins.size + for (i in 0 until pluginsLength) { + val p = plugins[i] + definePlugin(p) + } + } + + /** + * Defines the plugin. + * @param plugin The plugin. + */ + @JvmStatic + fun definePlugin(plugin: Plugin<*>) { + try { + var manifest = plugin.javaClass.getAnnotation(PluginManifest::class.java) + if (manifest == null) { + manifest = plugin.javaClass.superclass.getAnnotation(PluginManifest::class.java) + } else { + if (disabledPlugins[manifest.name] != null) { + return + } + } + if (manifest == null || manifest.type == PluginType.ACTION) { + plugin.newInstance(null) + } else { + when (manifest.type) { + PluginType.DIALOGUE -> (plugin as DialoguePlugin).init() + PluginType.ACTIVITY -> ActivityManager.register(plugin as ActivityPlugin) + PluginType.LOGIN -> LoginConfiguration.getLoginPlugins().add(plugin as Plugin) + PluginType.QUEST -> { + plugin.newInstance(null) + QuestRepository.register(plugin as Quest) + } + else -> SystemLogger.logWarn("Unknown Manifest: " + manifest.type) + } + } + amountLoaded++ + } catch (e: Throwable) { + e.printStackTrace() + } + } +} diff --git a/Server/src/main/java/Server/core/plugin/PluginManifest.java b/Server/src/main/java/Server/core/plugin/PluginManifest.java new file mode 100644 index 000000000..eb5e603f5 --- /dev/null +++ b/Server/src/main/java/Server/core/plugin/PluginManifest.java @@ -0,0 +1,19 @@ +package core.plugin; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Represents a plugin manifest. + * @author Emperor + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface PluginManifest { + + /** + * Gets the plugin type. + * @return The plugin type. + */ + public PluginType type() default PluginType.ACTION; + public String name() default ""; +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/plugin/PluginType.java b/Server/src/main/java/Server/core/plugin/PluginType.java new file mode 100644 index 000000000..0dd8b18ff --- /dev/null +++ b/Server/src/main/java/Server/core/plugin/PluginType.java @@ -0,0 +1,39 @@ +package core.plugin; + +/** + * Represents the plugin types. + * @author Emperor + */ +public enum PluginType { + + /** + * Action plugin type. + */ + ACTION, + + /** + * Dialogue plugin type. + */ + DIALOGUE, + + /** + * Activity plugin type. + */ + ACTIVITY, + + /** + * Player login plugin type. + */ + LOGIN, + + /** + * Player logout plugin type. + */ + LOGOUT, + + /** + * Quest plugin type. + */ + QUEST; + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/tools/Interfaces.kt b/Server/src/main/java/Server/core/tools/Interfaces.kt new file mode 100644 index 000000000..98d262630 --- /dev/null +++ b/Server/src/main/java/Server/core/tools/Interfaces.kt @@ -0,0 +1,495 @@ +package core.tools + +object Interfaces { + const val GUIDE_EGGS_OVERLAY_0 = 0 + const val GUIDE_FLOUR_OVERLAY_1 = 1 + const val GUIDE_INV_FLOUR_2 = 2 + const val GUIDE_MILK_OVERLAY_3 = 3 + const val TOG_WATER_BOWL_4 = 4 + const val AGILITYARENA_OVERLAY_5 = 5 + const val AGILITYARENA_TRADE_6 = 6 + const val AHOY_BLACKOUT_7 = 7 + const val AHOY_ISLANDMAP_8 = 8 + const val AHOY_RUNEDRAW_9 = 9 + const val AHOY_WINDSPEED_10 = 10 + const val BANK_DEPOSIT_BOX_11 = 11 + const val BANKPIN_MAIN_13 = 13 + const val BANKPIN_SETTINGS_14 = 14 + const val BANNER_PADLOCK_KEYS_15 = 15 + const val BANNER_ANTI_VIRUS_16 = 16 + const val BANNER_SCAMMING_21 = 21 + const val BANNER_SECURITY_22 = 22 + const val BANNER_XMAS_23 = 23 + const val BARROWS_OVERLAY_24 = 24 + const val BARROWS_PUZZLE_25 = 25 + const val BLAST_FURNACE_BAR_STOCK_28 = 28 + const val BLAST_FURNACE_PLAN_SCROLL_29 = 29 + const val BLAST_FURNACE_TEMP_GAUGE_30 = 30 + const val BOARDGAMES_CHALLENGE_31 = 31 + const val BOARDGAMES_DRAUGHTS_32 = 32 + const val BOARDGAMES_DRAUGHTS_OPTIONS_33 = 33 + const val BOARDGAMES_DRAUGHTS_OVERLAY_34 = 34 + const val BOARDGAMES_DRAUGHTS_VIEW_35 = 35 + const val BOARDGAMES_RUNELINK_36 = 36 + const val BOARDGAMES_RUNELINK_OPTIONS_37 = 37 + const val BOARDGAMES_RUNELINK_OVERLAY_38 = 38 + const val BOARDGAMES_RUNELINK_VIEW_39 = 39 + const val BOARDGAMES_RUNESQUARES_40 = 40 + const val BOARDGAMES_RUNESQUARES_OPTIONS_41 = 41 + const val BOARDGAMES_RUNESQUARES_OVERLAY_42 = 42 + const val BOARDGAMES_RUNESQUARES_VIEW_43 = 43 + const val BOARDGAMES_RUNEVERSI_44 = 44 + const val BOARDGAMES_RUNEVERSI_OPTIONS_45 = 45 + const val BOARDGAMES_RUNEVERSI_OVERLAY_46 = 46 + const val BOARDGAMES_RUNEVERSI_VIEW_47 = 47 + const val BOB_LOCATOR_AMULET_48 = 48 + const val BURGH_MAP_51 = 51 + const val CANOE_52 = 52 + const val CANOE_STATIONS_MAP_53 = 53 + const val CASTLEWARS_CATAPULT_54 = 54 + const val CASTLEWARS_SCORE_55 = 55 + const val CASTLEWARS_SHOPSIDE_56 = 56 + const val CASTLEWARS_STATUS_OVERLAY_57 = 57 + const val CASTLEWARS_STATUS_OVERLAY_SARADOMIN_58 = 58 + const val CASTLEWARS_STATUS_OVERLAY_ZAMORAK_59 = 59 + const val CASTLEWARS_TRADE_60 = 60 + const val CAT_NAMING_61 = 61 + const val CAVE_GOBLIN_MARKERS_62 = 62 + const val CHAMPIONS_SCROLL_63 = 63 + const val CHAT1_64 = 64 + const val CHAT2_65 = 65 + const val CHAT3_66 = 66 + const val CHAT4_67 = 67 + const val CHAT_NP1_68 = 68 + const val CHAT_NP2_69 = 69 + const val CHAT_NP3_70 = 70 + const val CHAT_NP4_71 = 71 + const val COOKING_CHURN_OP1_72 = 72 + const val COOKING_CHURN_OP2_73 = 73 + const val COOKING_CHURN_OP3_74 = 74 + const val WEAPON_BAXE_SEL_75 = 75 + const val WEAPON_WARHAMMER_SEL_76 = 76 + const val WEAPON_BOW_SEL_77 = 77 + const val WEAPON_CLAWS_SEL_78 = 78 + const val WEAPON_XBOW_SEL_79 = 79 + const val WEAPON_FIXED_DEVICE_SEL_80 = 80 + const val WEAPON_SCIMITAR_SEL_81 = 81 + const val WEAPON_2H_SWORD_SEL_82 = 82 + const val WEAPON_PICKAXE_SEL_83 = 83 + const val WEAPON_HALBERD_SEL_84 = 84 + const val WEAPON_SCEPTER_SEL_85 = 85 + const val WEAPON_SCYTHE_SEL_86 = 86 + const val WEAPON_SPEAR_SEL_87 = 87 + const val WEAPON_MACE_SEL_88 = 88 + const val WEAPON_DAGGER_SEL_89 = 89 + const val WEAPON_STAFF_SEL_90 = 90 + const val WEAPON_THROWN_SEL_91 = 91 + const val WEAPON_FISTS_SEL_92 = 92 + const val WEAPON_WHIP_SEL_93 = 93 + const val CONFIRM_DESTROY_94 = 94 + const val SAILING_TRANSPORT_WORLD_MAP_95 = 95 + const val DARKNESS_DARK_96 = 96 + const val DARKNESS_LIGHT_97 = 97 + const val DARKNESS_MEDIUM_98 = 98 + const val DEATH_DICE_99 = 99 + const val DEEP_BLUE_100 = 100 + const val PATTERN_NEXT_103 = 103 + const val STOCKMARKET_105 = 105 + const val STOCKSIDE_107 = 107 + const val STOCKCOLLECT_109 = 109 + const val DWARF_ROCK_BOOK_111 = 111 + const val DWARF_ROCK_CANNON_112 = 112 + const val DWARF_ROCK_SCHEMATICS_113 = 113 + const val DWARF_ROCK_SCHEMATICS_CONTROL_114 = 114 + const val ENAKH_FILM_117 = 117 + const val ENAKH_SMOKE_OVERLAY_118 = 118 + const val FADE_TO_BLACK_120 = 120 + const val FADE_TO_LIGHT_BLUE_121 = 121 + const val FADE_TO_WHITE_122 = 122 + const val FAIRY_CERTIFICATE_123 = 123 + const val FARMING_TOOLS_125 = 125 + const val FARMING_TOOLS_SIDE_126 = 126 + const val FAVOUR_KEYRING_127 = 127 + const val DOUBLEOBJBOX_131 = 131 + const val GARDEN_LIST_132 = 132 + const val GARDEN_QUIZ_133 = 133 + const val AIDE_COMPASS_135 = 135 + const val CHATDEFAULT_137 = 137 + const val GLIDERMAP_138 = 138 + const val GNOMEBALL_139 = 139 + const val HORROR_METALDOOR_142 = 142 + const val HAUNTEDMINE_CONTROLS_144 = 144 + const val INVENTORY_149 = 149 + const val KELDAGRIM_MAP_150 = 150 + const val KELDAGRIM_STORY1_151 = 151 + const val KELDAGRIM_TITLES_152 = 152 + const val AIDE_DEATH_153 = 153 + const val LEATHER_CRAFTING_154 = 154 + const val LEGENDS_MIRROR_155 = 155 + const val QUICKCHAT_TUTORIAL_157 = 157 + const val ROCKO_KITTENS_160 = 160 + const val SMKI_ASSIGNMENT_161 = 161 + const val SMKI_LEARN_163 = 163 + const val SMKI_BUY_164 = 164 + const val SMKI_SMOKE_OVERLAY_165 = 165 + const val ROCKO_CANNONBALL_166 = 166 + const val ROCKO_UNDERWATER_167 = 167 + const val ROCKO_SEAGULL_168 = 168 + const val FADE_FROM_BLACK_170 = 170 + const val CHATLARGE_173 = 173 + const val WOM_SCROLL_174 = 174 + const val HEAT_OVERLAY_175 = 175 + const val FADE_FROM_WHITE_177 = 177 + const val LIGHT2_178 = 178 + const val LIGHT_BLUE_179 = 179 + const val LIGHTNING_FLASH_180 = 180 + const val LOGOUT_182 = 182 + const val MACRO_COMBILOCK_185 = 185 + const val MACRO_EVIL_BOB_186 = 186 + const val MUSIC_V3_187 = 187 + const val MACRO_MIME_EMOTES_188 = 188 + const val MACRO_QUIZSHOW_191 = 191 + const val MAGIC_192 = 192 + const val MAGIC_ZAROS_193 = 193 + const val MAGICTRAINING_GRAVE_196 = 196 + const val MAGICTRAINING_SHOP_197 = 197 + const val MAGICTRAINING_TELE_198 = 198 + const val MAZETIMER_209 = 209 + const val MESSAGE1_210 = 210 + const val MESSAGE2_211 = 211 + const val MESSAGE3_212 = 212 + const val MESSAGE4_213 = 213 + const val MESSAGE5_214 = 214 + const val MESSAGE_NP1_215 = 215 + const val MESSAGE_NP2_216 = 216 + const val MESSAGE_NP3_217 = 217 + const val MESSAGE_NP4_218 = 218 + const val MESSAGE_NP5_219 = 219 + const val MESSAGESCROLL_220 = 220 + const val MESSAGESCROLL2_221 = 221 + const val PENG_EMOTE_223 = 223 + const val MISC_SHIPJOURNEY_224 = 224 + const val MM_MESSAGE_225 = 225 + const val MOLE_MUD_226 = 226 + const val MOURNING_DEATHALTER_LIST_227 = 227 + const val MULTI2_228 = 228 + const val MULTI2_CHAT_229 = 229 + const val MULTI3_230 = 230 + const val MULTI3_CHAT_231 = 231 + const val MULTI4_232 = 232 + const val MULTI4_CHAT_233 = 233 + const val MULTI5_234 = 234 + const val MULTI5_CHAT_235 = 235 + const val MULTIVAR2_236 = 236 + const val MULTIVAR4_237 = 237 + const val MULTIVAR5_238 = 238 + const val NPCCHAT1_241 = 241 + const val NPCCHAT2_242 = 242 + const val NPCCHAT3_243 = 243 + const val NPCCHAT4_244 = 244 + const val NPCCHAT_NP1_245 = 245 + const val NPCCHAT_NP2_246 = 246 + const val NPCCHAT_NP3_247 = 247 + const val NPCCHAT_NP4_248 = 248 + const val SUROK_LETTER1_249 = 249 + const val SUROK_LETTER2_250 = 250 + const val OLAF2_LOCK_GATE_252 = 252 + const val OLAF2_SKULL_PUZZLE_253 = 253 + const val OLAF2_TREASUREMAP_254 = 254 + const val AREA_TASK_259 = 259 + const val DREAM_ARMOUR_260 = 260 + const val OPTIONS_261 = 261 + const val PINBALL_INTERFACE_263 = 263 + const val PAINT_CANNON_264 = 264 + const val CLANWARS_OVERLAY_265 = 265 + const val PEST_REWARDS_267 = 267 + const val PRAYER_271 = 271 + const val PRIESTPERIL_GRAVEMONUMENT_272 = 272 + const val PRISONPETE_273 = 273 + const val QUESTJOURNAL_V2_274 = 274 + const val QUESTJOURNAL_SCROLL_275 = 275 + const val RATCATCHER_FLUTE_282 = 282 + const val RATCATCHER_FLUTE_MUSIC_283 = 283 + const val RATCATCHER_OVERLAY_284 = 284 + const val RD_COMBOLOCK_285 = 285 + const val REGICIDE_STILL_286 = 286 + const val ROGUESDEN_DIALS_290 = 290 + const val ROGUESDEN_GEAR_SELECT_291 = 291 + const val ROGUESDEN_GEARS_292 = 292 + const val ROGUESDEN_PUZZLE_293 = 293 + const val RUM_DEAL_TITLE_295 = 295 + const val SANDSTORM_296 = 296 + const val SEER_COMBOLOCK_298 = 298 + const val SMITHING_NEW_300 = 300 + const val SKILL_COOKMANY_307 = 307 + const val LOTR_SCROLL_308 = 308 + const val SKILL_MULTI1_309 = 309 + const val SLAYER_STAFF_SPELLS_310 = 310 + const val SMELTING_311 = 311 + const val SMOKEOVERLAY_313 = 313 + const val SOULBANE_ANGERBAR_315 = 315 + const val SOULBANE_CUT_316 = 316 + const val SOULBANE_DARKNESS_317 = 317 + const val SOULBANE_SCARE_318 = 318 + const val STAFF_SPELLS_319 = 319 + const val STATS_320 = 320 + const val SWAMP_BOATJOURNEY_321 = 321 + const val SWAMP_BOATJOURNEY_BACK_322 = 322 + const val TANNER_324 = 324 + const val TARGET_325 = 325 + const val TELEPORT_OTHER_326 = 326 + const val CWS_WARNING_11_327 = 327 + const val TEMPLE_SCREEN_328 = 328 + const val TEMPLETREK_MAP_329 = 329 + const val TRADECONFIRM_334 = 334 + const val TRADEMAIN_335 = 335 + const val TRADESIDE_336 = 336 + const val TRAIL_CLUELONG_345 = 345 + const val TRAIL_MAP01_346 = 346 + const val TRAIL_MAP02_347 = 347 + const val TRAIL_MAP03_348 = 348 + const val TRAIL_MAP04_349 = 349 + const val TRAIL_MAP05_350 = 350 + const val TRAIL_MAP06_351 = 351 + const val TRAIL_MAP07_352 = 352 + const val TRAIL_MAP08_353 = 353 + const val TRAIL_MAP09_354 = 354 + const val TRAIL_MAP10_355 = 355 + const val TRAIL_MAP11_356 = 356 + const val TRAIL_MAP12_357 = 357 + const val TRAIL_MAP13_358 = 358 + const val TRAIL_MAP14_359 = 359 + const val TRAIL_MAP15_360 = 360 + const val TRAIL_MAP16_361 = 361 + const val TRAIL_MAP17_362 = 362 + const val TRAIL_PUZZLE_363 = 363 + const val TRAIL_REWARD_364 = 364 + const val TRAIL_SEXTANT_365 = 365 + const val TRAWLER_OVERLAY_366 = 366 + const val TRAWLER_REWARD_367 = 367 + const val TRAWLER_START_368 = 368 + const val TUTORIAL_PROGRESS_371 = 371 + const val TUTORIAL_TEXT_372 = 372 + const val TZHAAR_FIGHTPIT_373 = 373 + const val WELCOME_SCREEN_378 = 378 + const val WEREWOLF_GOAL_379 = 379 + const val WELCOME_FINAL_TEX_380 = 380 + const val WILDERNESS_OVERLAY_381 = 381 + const val WILDERNESS_WARNING_382 = 382 + const val WOM_TELESCOPE_386 = 386 + const val WORNITEMS_387 = 387 + const val OBJDIALOG_389 = 389 + const val POH_HANGMAN_393 = 393 + const val POH_HOUSE_OPTIONS_398 = 398 + const val POH_MAGIC_TABLETS_400 = 400 + const val POH_RANGING_401 = 401 + const val POH_SAWMILL_403 = 403 + const val POH_SCRYING_POOL_404 = 404 + const val BANNER_POH_405 = 405 + const val PEST_MACE_406 = 406 + const val PEST_LANDER_OVERLAY_407 = 407 + const val PEST_STATUS_OVERLAY_408 = 408 + const val MCANNON_INTERFACE_409 = 409 + const val WARGUILD_DEFENCE_410 = 410 + const val WARGUILD_DEFENCE_MINI_411 = 411 + const val WARGUILD_DUMMY_412 = 412 + const val BREW_TELESCOPE_OVERLAY_413 = 413 + const val BREW_GAME_OVER_414 = 414 + const val BREW_OVERLAY_415 = 415 + const val BREW_WORKTABLE_416 = 416 + const val BREW_TOOLS_417 = 417 + const val TUTORIAL_TEXT2_421 = 421 + const val FAIRY2_CERTIFICATE_BROKEN_423 = 423 + const val FAIRY2_MESSAGE_424 = 424 + const val SCROLL_GODFATHER_427 = 427 + const val NTK_OVERLAY_428 = 428 + const val MAGIC_LUNAR_430 = 430 + const val XBOWS_ENCHANT_BOLT_432 = 432 + const val XBOWS_POUCH_433 = 433 + const val CRAFTING_SILVER_CASTING_438 = 438 + const val OPENURL_445 = 445 + const val CRAFTING_GOLD_446 = 446 + const val BANNER_CHATHEADS_447 = 447 + const val BRAIN_WATER_OVERLAY_448 = 448 + const val MULTIVAR3_451 = 451 + const val MYQ3_STATUE_PAINTING_452 = 452 + const val MYQ3_BLACKOUT_453 = 453 + const val MYQ3_BOAT_MAP_454 = 454 + const val CRAFTING_SPINNING_459 = 459 + const val SEASLUG_BOAT_TRAVEL_461 = 461 + const val KINGS_LETTER_V2_463 = 463 + const val EMOTES_464 = 464 + const val ZEP_BALLOON_MAP_469 = 469 + const val ZEP_INTERFACE_470 = 470 + const val ZEP_INTERFACE_SIDE_471 = 471 + const val WEAPON_CHINCHOMPA_SEL_473 = 473 + const val WEAPON_SALAMANDER_SEL_474 = 474 + const val ANMA_RGB_480 = 480 + const val BARBASSAULT_HORN_484 = 484 + const val BARBASSAULT_OVER_ATT_485 = 485 + const val BARBASSAULT_OVER_COL_486 = 486 + const val BARBASSAULT_OVER_DEF_487 = 487 + const val BARBASSAULT_OVER_HEAL_488 = 488 + const val BARBASSAULT_PLAYERSTAT_490 = 490 + const val BARBASSAULT_REWARD_SHOP_491 = 491 + const val BARBASSAULT_TIMER_OVERLAY_494 = 494 + const val BARBASSAULT_TURRET_495 = 495 + const val BARBASSAULT_TUTORIAL_496 = 496 + const val BARBASSAULT_WAVECOMPLETE_497 = 497 + const val CONTACT_SCROLL_BLOOD_498 = 498 + const val SKILL_GUIDE_V2_499 = 499 + const val POH_HANGMAN_GERMAN_507 = 507 + const val TOL_HOMONCULUS_OVERLAY_508 = 508 + const val TOL_CAGE_PUZZLE_509 = 509 + const val TOL_PRESSURE_MACHINE_510 = 510 + const val TOL_PIPE_MACHINE_511 = 511 + const val INVENTORY_RANGING_512 = 512 + const val INVENTORY_WEAR_513 = 513 + const val BRAIN_CAT_OVERLAY_514 = 514 + const val BRAIN_GAS_OVERLAY_515 = 515 + const val OBJBOX_519 = 519 + const val DREAM_CYRISUS_521 = 521 + const val DREAM_MONSTER_STAT_522 = 522 + const val DREAM_PLAYER_STATS_523 = 523 + const val DREAM_TITLE_524 = 524 + const val VM_MUSEUM_MAP_527 = 527 + const val VM_DIGSITE_528 = 528 + const val VM_KUDOS_532 = 532 + const val VM_TIMELINE_534 = 534 + const val GRIM_TASKLIST_538 = 538 + const val NOEXIT_539 = 539 + const val CRAFTING_GLASS_542 = 542 + const val DRAGON_SLAYER_QIP_CLOUDS_543 = 543 + const val DRAGON_SLAYER_QIP_CR_JOURNEY_544 = 544 + const val DRAGON_SLAYER_QIP_ELVARG_545 = 545 + const val DRAGON_SLAYER_QIP_ELVARG_FLY_546 = 546 + const val DRAGON_SLAYER_QIP_MAP_547 = 547 + const val TOPLEVEL_548 = 548 + const val TOPLEVEL_FULL_549 = 549 + const val FRIENDS2_550 = 550 + const val IGNORE2_551 = 551 + const val SNAPSHOT_MAIN_553 = 553 + const val MULTI2_MES_557 = 557 + const val SKILL_MULTI6_558 = 558 + const val PATTERN_CARDS_559 = 559 + const val CWS_WARNING_9_560 = 560 + const val CWS_WARNING_21_561 = 561 + const val CWS_WARNING_2_562 = 562 + const val CWS_WARNING_5_563 = 563 + const val CWS_WARNING_23_564 = 564 + const val CWS_WARNING_10_565 = 565 + const val CWS_WARNING_6_566 = 566 + const val CWS_WARNING_14_567 = 567 + const val CWS_WARNING_3_568 = 568 + const val CWS_WARNING_16_569 = 569 + const val CWS_WARNING_17_570 = 570 + const val CWS_WARNING_19_571 = 571 + const val CWS_WARNING_13_572 = 572 + const val CWS_WARNING_12_573 = 573 + const val CWS_WARNING_1_574 = 574 + const val CWS_WARNING_8_576 = 576 + const val CWS_WARNING_18_577 = 577 + const val CWS_WARNING_15_578 = 578 + const val CWS_WARNING_4_579 = 579 + const val CWS_WARNING_20_580 = 580 + const val CWS_WARNING_24_581 = 581 + const val SKILL_MULTI1_SMALL_582 = 582 + const val CWS_DOOMSAYER_583 = 583 + const val KR_KING_STATUE_584 = 584 + const val KR_PYRAMID_ESCAPE_585 = 585 + const val KR_PICKLOCK_588 = 588 + const val CLANJOIN_589 = 589 + const val CLANSETUP_590 = 590 + const val CWS_WARNING_25_600 = 600 + const val GODWARS_OVERLAY_601 = 601 + const val SHOP_TEMPLATE_620 = 620 + const val SHOP_TEMPLATE_SIDE_621 = 621 + const val BANNER_GROUP_622 = 622 + const val BANNER_GROUP_ASSIST_623 = 623 + const val CWS_WARNING_26_627 = 627 + const val DUEL2_SIDE_628 = 628 + const val DUEL2_SCOREBOARD_632 = 632 + const val DUEL2_CHALLENGEOVERLAY_638 = 638 + const val DUEL2_SELECT_TYPE_640 = 640 + const val EXCHANGE_HISTORY_643 = 643 + const val EXCHANGE_SETS_SIDE_644 = 644 + const val EXCHANGE_ITEMSETS_645 = 645 + const val EXCHANGE_SAND_TIMER_646 = 646 + const val CLANWARS_VIEWING_ORB_649 = 649 + const val CWS_WARNING_30_650 = 650 + const val GRAVESTONE_SHOP_652 = 652 + const val BOUNTY_OVERLAY_653 = 653 + const val BOUNTY_OVERLAY_WAITING_656 = 656 + const val BOUNTY_WARNING_657 = 657 + const val LORE_STATS_SIDE_662 = 662 + const val LORE_CATS_SIDE_663 = 663 + const val LORE_BANK_SIDE_665 = 665 + const val EQUIP_SCREEN2_667 = 667 + const val INVENTORY_WEAR2_670 = 670 + const val LORE_BANK_671 = 671 + const val TUTORIAL2_MESBOX_674 = 674 + const val CWS_WARNING_27_676 = 676 + const val CWS_WARNING_28_677 = 677 + const val CWS_WARNING_29_678 = 678 + const val BANNER_SUMMONING_679 = 679 + const val RABBIT_SHOP_686 = 686 + const val RABBIT_OVERLAY_689 = 689 + const val BANNER_EASTER08_715 = 715 + const val SUMMONING_SIDE_722 = 722 + const val CARPET_INFO_723 = 723 + const val CARPET_RUNESQUARES_724 = 724 + const val CARPET_RUNELINK_725 = 725 + const val CARPET_RUNEVERSI_726 = 726 + const val CARPET_DRAUGHTS_727 = 727 + const val CARPET_MAIN_728 = 728 + const val CARPET_TICKET_729 = 729 + const val GRAPHICS_OPTIONS_742 = 742 + const val SOUND_OPTIONS_743 = 743 + const val LOGINSCREEN_744 = 744 + const val STATUSICONS_745 = 745 + const val TOPLEVEL_FULLSCREEN_746 = 746 + const val TOPSTAT_LORE_747 = 747 + const val TOPSTAT_HITPOINTS_748 = 748 + const val TOPSTAT_PRAYER_749 = 749 + const val TOPSTAT_RUN_750 = 750 + const val FILTERBUTTONS_751 = 751 + const val CHATTOP_752 = 752 + const val PMCHAT_754 = 754 + const val WORLDMAP_755 = 755 + const val BOARDGAMES_OPTIONS_756 = 756 + const val NPCCHATLARGE_757 = 757 + const val CANOE_TRAVEL_758 = 758 + const val TUTORIAL2_OBJBOX_760 = 760 + const val BANK_V2_MAIN_762 = 762 + const val BANK_V2_SIDE_763 = 763 + const val TUTORIAL2_SWITCH_TASK_765 = 765 + const val TUTORIAL2_DEATH_766 = 766 + const val BANK_V2_HELP_767 = 767 + const val TUTORIAL2_TEXT_769 = 769 + const val RCGUILD_SIDE_778 = 778 + const val RCGUILD_REWARDS_779 = 779 + const val RCGUILD_MAP_780 = 780 + const val RCGUILD_OVERLAY_781 = 781 + const val CRCS_TIGHTROPE_783 = 783 + const val CRCS_SIDE_784 = 784 + const val CRCS_REWARDS_785 = 785 + const val CRCS_EQUIPMENT_786 = 786 + const val CRCS_SCOREBOARD_788 = 788 + const val CLANWARS_END_790 = 790 + const val CLANWARS_SETUP_791 = 791 + const val CLANWARS_SETUP_SIDE_792 = 792 + const val BANNER_HALLOWEEN_800 = 800 + const val QUICKCHAT_LOCKED_801 = 801 + const val SC_TUTORIAL_OVERLAY_802 = 802 + const val SC_SCORES_BORDER_803 = 803 + const val SC_ITEM_TRANSFER_805 = 805 + const val SC_REMAINING_CLAY_806 = 806 + const val SC_SCORES_810 = 810 + const val SC_REWARD_SHOP_811 = 811 + const val SC_PROCESSING_813 = 813 + const val LUC2_CHAPTER2_814 = 814 + const val LUC2_TELESCOPE_VIEW_816 = 816 + const val LUC2_CHAPTER3_822 = 822 + const val LUC2_CHAPTER1_826 = 826 + const val LUC2_LUCIEN_PROJECTILES_827 = 827 +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/tools/Items.kt b/Server/src/main/java/Server/core/tools/Items.kt new file mode 100644 index 000000000..eeef8c55f --- /dev/null +++ b/Server/src/main/java/Server/core/tools/Items.kt @@ -0,0 +1,14652 @@ +package core.tools + +object Items { + const val DWARF_REMAINS_0 = 0 + const val TOOLKIT_1 = 1 + const val CANNONBALL_2 = 2 + const val NULODIONS_NOTES_3 = 3 + const val AMMO_MOULD_4 = 4 + const val INSTRUCTION_MANUAL_5 = 5 + const val CANNON_BASE_6 = 6 + const val CANNON_BASE_7 = 7 + const val CANNON_STAND_8 = 8 + const val CANNON_STAND_9 = 9 + const val CANNON_BARRELS_10 = 10 + const val CANNON_BARRELS_11 = 11 + const val CANNON_FURNACE_12 = 12 + const val CANNON_FURNACE_13 = 13 + const val RAILING_14 = 14 + const val HOLY_TABLE_NAPKIN_15 = 15 + const val MAGIC_WHISTLE_16 = 16 + const val GRAIL_BELL_17 = 17 + const val MAGIC_GOLD_FEATHER_18 = 18 + const val HOLY_GRAIL_19 = 19 + const val WHITE_COG_20 = 20 + const val BLACK_COG_21 = 21 + const val BLUE_COG_22 = 22 + const val RED_COG_23 = 23 + const val RAT_POISON_24 = 24 + const val RED_VINE_WORM_25 = 25 + const val FISHING_TROPHY_26 = 26 + const val FISHING_PASS_27 = 27 + const val INSECT_REPELLENT_28 = 28 + const val TINDERBOX_29 = 29 + const val BUCKET_OF_WAX_30 = 30 + const val TINDERBOX_31 = 31 + const val LIT_BLACK_CANDLE_32 = 32 + const val LIT_CANDLE_33 = 33 + const val LIT_CANDLE_34 = 34 + const val EXCALIBUR_35 = 35 + const val CANDLE_36 = 36 + const val CANDLE_37 = 37 + const val BLACK_CANDLE_38 = 38 + const val BRONZE_ARROWTIPS_39 = 39 + const val IRON_ARROWTIPS_40 = 40 + const val STEEL_ARROWTIPS_41 = 41 + const val MITHRIL_ARROWTIPS_42 = 42 + const val ADAMANT_ARROWTIPS_43 = 43 + const val RUNE_ARROWTIPS_44 = 44 + const val OPAL_BOLT_TIPS_45 = 45 + const val PEARL_BOLT_TIPS_46 = 46 + const val BARB_BOLTTIPS_47 = 47 + const val LONGBOW_U_48 = 48 + const val LONGBOW_U_49 = 49 + const val SHORTBOW_U_50 = 50 + const val SHORTBOW_U_51 = 51 + const val ARROW_SHAFT_52 = 52 + const val HEADLESS_ARROW_53 = 53 + const val OAK_SHORTBOW_U_54 = 54 + const val OAK_SHORTBOW_U_55 = 55 + const val OAK_LONGBOW_U_56 = 56 + const val OAK_LONGBOW_U_57 = 57 + const val WILLOW_LONGBOW_U_58 = 58 + const val WILLOW_LONGBOW_U_59 = 59 + const val WILLOW_SHORTBOW_U_60 = 60 + const val WILLOW_SHORTBOW_U_61 = 61 + const val MAPLE_LONGBOW_U_62 = 62 + const val MAPLE_LONGBOW_U_63 = 63 + const val MAPLE_SHORTBOW_U_64 = 64 + const val MAPLE_SHORTBOW_U_65 = 65 + const val YEW_LONGBOW_U_66 = 66 + const val YEW_LONGBOW_U_67 = 67 + const val YEW_SHORTBOW_U_68 = 68 + const val YEW_SHORTBOW_U_69 = 69 + const val MAGIC_LONGBOW_U_70 = 70 + const val MAGIC_LONGBOW_U_71 = 71 + const val MAGIC_SHORTBOW_U_72 = 72 + const val MAGIC_SHORTBOW_U_73 = 73 + const val KHAZARD_HELMET_74 = 74 + const val KHAZARD_ARMOUR_75 = 75 + const val KHAZARD_CELL_KEYS_76 = 76 + const val KHALI_BREW_77 = 77 + const val ICE_ARROWS_78 = 78 + const val NULL_79 = 79 + const val NULL_80 = 80 + const val NULL_81 = 81 + const val NULL_82 = 82 + const val LEVER_83 = 83 + const val STAFF_OF_ARMADYL_84 = 84 + const val SHINY_KEY_85 = 85 + const val PENDANT_OF_LUCIEN_86 = 86 + const val ARMADYL_PENDANT_87 = 87 + const val BOOTS_OF_LIGHTNESS_88 = 88 + const val BOOTS_OF_LIGHTNESS_89 = 89 + const val CHILDS_BLANKET_90 = 90 + const val GUAM_POTIONUNF_91 = 91 + const val GUAM_POTIONUNF_92 = 92 + const val MARRENTILL_POTIONUNF_93 = 93 + const val MARRENTILL_POTIONUNF_94 = 94 + const val TARROMIN_POTIONUNF_95 = 95 + const val TARROMIN_POTIONUNF_96 = 96 + const val HARRALANDER_POTIONUNF_97 = 97 + const val HARRALANDER_POTIONUNF_98 = 98 + const val RANARR_POTIONUNF_99 = 99 + const val RANARR_POTIONUNF_100 = 100 + const val IRIT_POTIONUNF_101 = 101 + const val IRIT_POTIONUNF_102 = 102 + const val AVANTOE_POTIONUNF_103 = 103 + const val AVANTOE_POTIONUNF_104 = 104 + const val KWUARM_POTIONUNF_105 = 105 + const val KWUARM_POTIONUNF_106 = 106 + const val CADANTINE_POTIONUNF_107 = 107 + const val CADANTINE_POTIONUNF_108 = 108 + const val DWARF_WEED_POTIONUNF_109 = 109 + const val DWARF_WEED_POTIONUNF_110 = 110 + const val TORSTOL_POTIONUNF_111 = 111 + const val TORSTOL_POTIONUNF_112 = 112 + const val STRENGTH_POTION4_113 = 113 + const val STRENGTH_POTION4_114 = 114 + const val STRENGTH_POTION3_115 = 115 + const val STRENGTH_POTION3_116 = 116 + const val STRENGTH_POTION2_117 = 117 + const val STRENGTH_POTION2_118 = 118 + const val STRENGTH_POTION1_119 = 119 + const val STRENGTH_POTION1_120 = 120 + const val ATTACK_POTION3_121 = 121 + const val ATTACK_POTION3_122 = 122 + const val ATTACK_POTION2_123 = 123 + const val ATTACK_POTION2_124 = 124 + const val ATTACK_POTION1_125 = 125 + const val ATTACK_POTION1_126 = 126 + const val RESTORE_POTION3_127 = 127 + const val RESTORE_POTION3_128 = 128 + const val RESTORE_POTION2_129 = 129 + const val RESTORE_POTION2_130 = 130 + const val RESTORE_POTION1_131 = 131 + const val RESTORE_POTION1_132 = 132 + const val DEFENCE_POTION3_133 = 133 + const val DEFENCE_POTION3_134 = 134 + const val DEFENCE_POTION2_135 = 135 + const val DEFENCE_POTION2_136 = 136 + const val DEFENCE_POTION1_137 = 137 + const val DEFENCE_POTION1_138 = 138 + const val PRAYER_POTION3_139 = 139 + const val PRAYER_POTION3_140 = 140 + const val PRAYER_POTION2_141 = 141 + const val PRAYER_POTION2_142 = 142 + const val PRAYER_POTION1_143 = 143 + const val PRAYER_POTION1_144 = 144 + const val SUPER_ATTACK3_145 = 145 + const val SUPER_ATTACK3_146 = 146 + const val SUPER_ATTACK2_147 = 147 + const val SUPER_ATTACK2_148 = 148 + const val SUPER_ATTACK1_149 = 149 + const val SUPER_ATTACK1_150 = 150 + const val FISHING_POTION3_151 = 151 + const val FISHING_POTION3_152 = 152 + const val FISHING_POTION2_153 = 153 + const val FISHING_POTION2_154 = 154 + const val FISHING_POTION1_155 = 155 + const val FISHING_POTION1_156 = 156 + const val SUPER_STRENGTH3_157 = 157 + const val SUPER_STRENGTH3_158 = 158 + const val SUPER_STRENGTH2_159 = 159 + const val SUPER_STRENGTH2_160 = 160 + const val SUPER_STRENGTH1_161 = 161 + const val SUPER_STRENGTH1_162 = 162 + const val SUPER_DEFENCE3_163 = 163 + const val SUPER_DEFENCE3_164 = 164 + const val SUPER_DEFENCE2_165 = 165 + const val SUPER_DEFENCE2_166 = 166 + const val SUPER_DEFENCE1_167 = 167 + const val SUPER_DEFENCE1_168 = 168 + const val RANGING_POTION3_169 = 169 + const val RANGING_POTION3_170 = 170 + const val RANGING_POTION2_171 = 171 + const val RANGING_POTION2_172 = 172 + const val RANGING_POTION1_173 = 173 + const val RANGING_POTION1_174 = 174 + const val ANTIPOISON3_175 = 175 + const val ANTIPOISON3_176 = 176 + const val ANTIPOISON2_177 = 177 + const val ANTIPOISON2_178 = 178 + const val ANTIPOISON1_179 = 179 + const val ANTIPOISON1_180 = 180 + const val SUPER_ANTIPOISON3_181 = 181 + const val SUPER_ANTIPOISON3_182 = 182 + const val SUPER_ANTIPOISON2_183 = 183 + const val SUPER_ANTIPOISON2_184 = 184 + const val SUPER_ANTIPOISON1_185 = 185 + const val SUPER_ANTIPOISON1_186 = 186 + const val WEAPON_POISON_187 = 187 + const val WEAPON_POISON_188 = 188 + const val ZAMORAK_BREW3_189 = 189 + const val ZAMORAK_BREW3_190 = 190 + const val ZAMORAK_BREW2_191 = 191 + const val ZAMORAK_BREW2_192 = 192 + const val ZAMORAK_BREW1_193 = 193 + const val ZAMORAK_BREW1_194 = 194 + const val POTION_195 = 195 + const val POTION_196 = 196 + const val POISON_CHALICE_197 = 197 + const val POISON_CHALICE_198 = 198 + const val GRIMY_GUAM_199 = 199 + const val GRIMY_GUAM_200 = 200 + const val GRIMY_MARRENTILL_201 = 201 + const val GRIMY_MARRENTILL_202 = 202 + const val GRIMY_TARROMIN_203 = 203 + const val GRIMY_TARROMIN_204 = 204 + const val GRIMY_HARRALANDER_205 = 205 + const val GRIMY_HARRALANDER_206 = 206 + const val GRIMY_RANARR_207 = 207 + const val GRIMY_RANARR_208 = 208 + const val GRIMY_IRIT_209 = 209 + const val GRIMY_IRIT_210 = 210 + const val GRIMY_AVANTOE_211 = 211 + const val GRIMY_AVANTOE_212 = 212 + const val GRIMY_KWUARM_213 = 213 + const val GRIMY_KWUARM_214 = 214 + const val GRIMY_CADANTINE_215 = 215 + const val GRIMY_CADANTINE_216 = 216 + const val GRIMY_DWARF_WEED_217 = 217 + const val GRIMY_DWARF_WEED_218 = 218 + const val GRIMY_TORSTOL_219 = 219 + const val GRIMY_TORSTOL_220 = 220 + const val EYE_OF_NEWT_221 = 221 + const val EYE_OF_NEWT_222 = 222 + const val RED_SPIDERS_EGGS_223 = 223 + const val RED_SPIDERS_EGGS_224 = 224 + const val LIMPWURT_ROOT_225 = 225 + const val LIMPWURT_ROOT_226 = 226 + const val VIAL_OF_WATER_227 = 227 + const val VIAL_OF_WATER_228 = 228 + const val VIAL_229 = 229 + const val VIAL_230 = 230 + const val SNAPE_GRASS_231 = 231 + const val SNAPE_GRASS_232 = 232 + const val PESTLE_AND_MORTAR_233 = 233 + const val PESTLE_AND_MORTAR_234 = 234 + const val UNICORN_HORN_DUST_235 = 235 + const val UNICORN_HORN_DUST_236 = 236 + const val UNICORN_HORN_237 = 237 + const val UNICORN_HORN_238 = 238 + const val WHITE_BERRIES_239 = 239 + const val WHITE_BERRIES_240 = 240 + const val DRAGON_SCALE_DUST_241 = 241 + const val DRAGON_SCALE_DUST_242 = 242 + const val BLUE_DRAGON_SCALE_243 = 243 + const val BLUE_DRAGON_SCALE_244 = 244 + const val WINE_OF_ZAMORAK_245 = 245 + const val WINE_OF_ZAMORAK_246 = 246 + const val JANGERBERRIES_247 = 247 + const val JANGERBERRIES_248 = 248 + const val CLEAN_GUAM_249 = 249 + const val CLEAN_GUAM_250 = 250 + const val CLEAN_MARRENTILL_251 = 251 + const val CLEAN_MARRENTILL_252 = 252 + const val CLEAN_TARROMIN_253 = 253 + const val CLEAN_TARROMIN_254 = 254 + const val CLEAN_HARRALANDER_255 = 255 + const val CLEAN_HARRALANDER_256 = 256 + const val CLEAN_RANARR_257 = 257 + const val CLEAN_RANARR_258 = 258 + const val CLEAN_IRIT_259 = 259 + const val CLEAN_IRIT_260 = 260 + const val CLEAN_AVANTOE_261 = 261 + const val CLEAN_AVANTOE_262 = 262 + const val CLEAN_KWUARM_263 = 263 + const val CLEAN_KWUARM_264 = 264 + const val CLEAN_CADANTINE_265 = 265 + const val CLEAN_CADANTINE_266 = 266 + const val CLEAN_DWARF_WEED_267 = 267 + const val CLEAN_DWARF_WEED_268 = 268 + const val CLEAN_TORSTOL_269 = 269 + const val CLEAN_TORSTOL_270 = 270 + const val PRESSURE_GAUGE_271 = 271 + const val FISH_FOOD_272 = 272 + const val POISON_273 = 273 + const val POISONED_FISH_FOOD_274 = 274 + const val KEY_275 = 275 + const val RUBBER_TUBE_276 = 276 + const val OIL_CAN_277 = 277 + const val CATTLEPROD_278 = 278 + const val SHEEP_FEED_279 = 279 + const val SHEEP_BONES_1_280 = 280 + const val SHEEP_BONES_2_281 = 281 + const val SHEEP_BONES_3_282 = 282 + const val SHEEP_BONES_4_283 = 283 + const val PLAGUE_JACKET_284 = 284 + const val PLAGUE_TROUSERS_285 = 285 + const val ORANGE_GOBLIN_MAIL_286 = 286 + const val BLUE_GOBLIN_MAIL_287 = 287 + const val GOBLIN_MAIL_288 = 288 + const val GOBLIN_MAIL_289 = 289 + const val RESEARCH_PACKAGE_290 = 290 + const val NOTES_291 = 291 + const val BOOK_ON_BAXTORIAN_292 = 292 + const val A_KEY_293 = 293 + const val GLARIALS_PEBBLE_294 = 294 + const val GLARIALS_AMULET_295 = 295 + const val GLARIALS_URN_296 = 296 + const val GLARIALS_URN_297 = 297 + const val A_KEY_298 = 298 + const val MITHRIL_SEEDS_299 = 299 + const val RATS_TAIL_300 = 300 + const val LOBSTER_POT_301 = 301 + const val LOBSTER_POT_302 = 302 + const val SMALL_FISHING_NET_303 = 303 + const val SMALL_FISHING_NET_304 = 304 + const val BIG_FISHING_NET_305 = 305 + const val BIG_FISHING_NET_306 = 306 + const val FISHING_ROD_307 = 307 + const val FISHING_ROD_308 = 308 + const val FLY_FISHING_ROD_309 = 309 + const val FLY_FISHING_ROD_310 = 310 + const val HARPOON_311 = 311 + const val HARPOON_312 = 312 + const val FISHING_BAIT_313 = 313 + const val FEATHER_314 = 314 + const val SHRIMPS_315 = 315 + const val SHRIMPS_316 = 316 + const val RAW_SHRIMPS_317 = 317 + const val RAW_SHRIMPS_318 = 318 + const val ANCHOVIES_319 = 319 + const val ANCHOVIES_320 = 320 + const val RAW_ANCHOVIES_321 = 321 + const val RAW_ANCHOVIES_322 = 322 + const val BURNT_FISH_323 = 323 + const val BURNT_FISH_324 = 324 + const val SARDINE_325 = 325 + const val SARDINE_326 = 326 + const val RAW_SARDINE_327 = 327 + const val RAW_SARDINE_328 = 328 + const val SALMON_329 = 329 + const val SALMON_330 = 330 + const val RAW_SALMON_331 = 331 + const val RAW_SALMON_332 = 332 + const val TROUT_333 = 333 + const val TROUT_334 = 334 + const val RAW_TROUT_335 = 335 + const val RAW_TROUT_336 = 336 + const val GIANT_CARP_337 = 337 + const val RAW_GIANT_CARP_338 = 338 + const val COD_339 = 339 + const val COD_340 = 340 + const val RAW_COD_341 = 341 + const val RAW_COD_342 = 342 + const val BURNT_FISH_343 = 343 + const val BURNT_FISH_344 = 344 + const val RAW_HERRING_345 = 345 + const val RAW_HERRING_346 = 346 + const val HERRING_347 = 347 + const val HERRING_348 = 348 + const val RAW_PIKE_349 = 349 + const val RAW_PIKE_350 = 350 + const val PIKE_351 = 351 + const val PIKE_352 = 352 + const val RAW_MACKEREL_353 = 353 + const val RAW_MACKEREL_354 = 354 + const val MACKEREL_355 = 355 + const val MACKEREL_356 = 356 + const val BURNT_FISH_357 = 357 + const val BURNT_FISH_358 = 358 + const val RAW_TUNA_359 = 359 + const val RAW_TUNA_360 = 360 + const val TUNA_361 = 361 + const val TUNA_362 = 362 + const val RAW_BASS_363 = 363 + const val RAW_BASS_364 = 364 + const val BASS_365 = 365 + const val BASS_366 = 366 + const val BURNT_FISH_367 = 367 + const val BURNT_FISH_368 = 368 + const val BURNT_FISH_369 = 369 + const val BURNT_FISH_370 = 370 + const val RAW_SWORDFISH_371 = 371 + const val RAW_SWORDFISH_372 = 372 + const val SWORDFISH_373 = 373 + const val SWORDFISH_374 = 374 + const val BURNT_SWORDFISH_375 = 375 + const val BURNT_SWORDFISH_376 = 376 + const val RAW_LOBSTER_377 = 377 + const val RAW_LOBSTER_378 = 378 + const val LOBSTER_379 = 379 + const val LOBSTER_380 = 380 + const val BURNT_LOBSTER_381 = 381 + const val BURNT_LOBSTER_382 = 382 + const val RAW_SHARK_383 = 383 + const val RAW_SHARK_384 = 384 + const val SHARK_385 = 385 + const val SHARK_386 = 386 + const val BURNT_SHARK_387 = 387 + const val BURNT_SHARK_388 = 388 + const val RAW_MANTA_RAY_389 = 389 + const val RAW_MANTA_RAY_390 = 390 + const val MANTA_RAY_391 = 391 + const val MANTA_RAY_392 = 392 + const val BURNT_MANTA_RAY_393 = 393 + const val BURNT_MANTA_RAY_394 = 394 + const val RAW_SEA_TURTLE_395 = 395 + const val RAW_SEA_TURTLE_396 = 396 + const val SEA_TURTLE_397 = 397 + const val SEA_TURTLE_398 = 398 + const val BURNT_SEA_TURTLE_399 = 399 + const val BURNT_SEA_TURTLE_400 = 400 + const val SEAWEED_401 = 401 + const val SEAWEED_402 = 402 + const val EDIBLE_SEAWEED_403 = 403 + const val EDIBLE_SEAWEED_404 = 404 + const val CASKET_405 = 405 + const val CASKET_406 = 406 + const val OYSTER_407 = 407 + const val OYSTER_408 = 408 + const val EMPTY_OYSTER_409 = 409 + const val EMPTY_OYSTER_410 = 410 + const val OYSTER_PEARL_411 = 411 + const val OYSTER_PEARL_412 = 412 + const val OYSTER_PEARLS_413 = 413 + const val OYSTER_PEARLS_414 = 414 + const val ETHENEA_415 = 415 + const val LIQUID_HONEY_416 = 416 + const val SULPHURIC_BROLINE_417 = 417 + const val PLAGUE_SAMPLE_418 = 418 + const val TOUCH_PAPER_419 = 419 + const val DISTILLATOR_420 = 420 + const val LATHAS_AMULET_421 = 421 + const val BIRD_FEED_422 = 422 + const val KEY_423 = 423 + const val PIGEON_CAGE_424 = 424 + const val PIGEON_CAGE_425 = 425 + const val PRIEST_GOWN_426 = 426 + const val PRIEST_GOWN_427 = 427 + const val PRIEST_GOWN_428 = 428 + const val PRIEST_GOWN_429 = 429 + const val DOCTORS_GOWN_430 = 430 + const val KARAMJAN_RUM_431 = 431 + const val CHEST_KEY_432 = 432 + const val PIRATE_MESSAGE_433 = 433 + const val CLAY_434 = 434 + const val CLAY_435 = 435 + const val COPPER_ORE_436 = 436 + const val COPPER_ORE_437 = 437 + const val TIN_ORE_438 = 438 + const val TIN_ORE_439 = 439 + const val IRON_ORE_440 = 440 + const val IRON_ORE_441 = 441 + const val SILVER_ORE_442 = 442 + const val SILVER_ORE_443 = 443 + const val GOLD_ORE_444 = 444 + const val GOLD_ORE_445 = 445 + const val PERFECT_GOLD_ORE_446 = 446 + const val MITHRIL_ORE_447 = 447 + const val MITHRIL_ORE_448 = 448 + const val ADAMANTITE_ORE_449 = 449 + const val ADAMANTITE_ORE_450 = 450 + const val RUNITE_ORE_451 = 451 + const val RUNITE_ORE_452 = 452 + const val COAL_453 = 453 + const val COAL_454 = 454 + const val BARCRAWL_CARD_455 = 455 + const val SCORPION_CAGE_456 = 456 + const val SCORPION_CAGE_457 = 457 + const val SCORPION_CAGE_458 = 458 + const val SCORPION_CAGE_459 = 459 + const val SCORPION_CAGE_460 = 460 + const val SCORPION_CAGE_461 = 461 + const val SCORPION_CAGE_462 = 462 + const val SCORPION_CAGE_463 = 463 + const val STRANGE_FRUIT_464 = 464 + const val STRANGE_FRUIT_465 = 465 + const val PICKAXE_HANDLE_466 = 466 + const val PICKAXE_HANDLE_467 = 467 + const val BROKEN_PICKAXE_468 = 468 + const val BROKEN_PICKAXE_469 = 469 + const val BROKEN_PICKAXE_470 = 470 + const val BROKEN_PICKAXE_471 = 471 + const val BROKEN_PICKAXE_472 = 472 + const val BROKEN_PICKAXE_473 = 473 + const val BROKEN_PICKAXE_474 = 474 + const val BROKEN_PICKAXE_475 = 475 + const val BROKEN_PICKAXE_476 = 476 + const val BROKEN_PICKAXE_477 = 477 + const val BROKEN_PICKAXE_478 = 478 + const val BROKEN_PICKAXE_479 = 479 + const val BRONZE_PICK_HEAD_480 = 480 + const val BRONZE_PICK_HEAD_481 = 481 + const val IRON_PICK_HEAD_482 = 482 + const val IRON_PICK_HEAD_483 = 483 + const val STEEL_PICK_HEAD_484 = 484 + const val STEEL_PICK_HEAD_485 = 485 + const val MITHRIL_PICK_HEAD_486 = 486 + const val MITHRIL_PICK_HEAD_487 = 487 + const val ADAMANT_PICK_HEAD_488 = 488 + const val ADAMANT_PICK_HEAD_489 = 489 + const val RUNE_PICK_HEAD_490 = 490 + const val RUNE_PICK_HEAD_491 = 491 + const val PICTURE_492 = 492 + const val PICTURE_493 = 493 + const val BROKEN_AXE_494 = 494 + const val BROKEN_AXE_495 = 495 + const val BROKEN_AXE_496 = 496 + const val BROKEN_AXE_497 = 497 + const val BROKEN_AXE_498 = 498 + const val BROKEN_AXE_499 = 499 + const val BROKEN_AXE_500 = 500 + const val BROKEN_AXE_501 = 501 + const val BROKEN_AXE_502 = 502 + const val BROKEN_AXE_503 = 503 + const val BROKEN_AXE_504 = 504 + const val BROKEN_AXE_505 = 505 + const val BROKEN_AXE_506 = 506 + const val BROKEN_AXE_507 = 507 + const val PICTURE_508 = 508 + const val PICTURE_509 = 509 + const val PICTURE_510 = 510 + const val PICTURE_511 = 511 + const val PICTURE_512 = 512 + const val PICTURE_513 = 513 + const val PICTURE_514 = 514 + const val PICTURE_515 = 515 + const val PICTURE_516 = 516 + const val PICTURE_517 = 517 + const val PICTURE_518 = 518 + const val PICTURE_519 = 519 + const val PICTURE_520 = 520 + const val PICTURE_521 = 521 + const val ENCHANTED_BEEF_522 = 522 + const val ENCHANTED_RAT_MEAT_523 = 523 + const val ENCHANTED_BEAR_MEAT_524 = 524 + const val ENCHANTED_CHICKEN_525 = 525 + const val BONES_526 = 526 + const val BONES_527 = 527 + const val BURNT_BONES_528 = 528 + const val BURNT_BONES_529 = 529 + const val BAT_BONES_530 = 530 + const val BAT_BONES_531 = 531 + const val BIG_BONES_532 = 532 + const val BIG_BONES_533 = 533 + const val BABYDRAGON_BONES_534 = 534 + const val BABYDRAGON_BONES_535 = 535 + const val DRAGON_BONES_536 = 536 + const val DRAGON_BONES_537 = 537 + const val DRUIDS_ROBE_538 = 538 + const val DRUIDS_ROBE_539 = 539 + const val DRUIDS_ROBE_540 = 540 + const val DRUIDS_ROBE_541 = 541 + const val MONKS_ROBE_542 = 542 + const val MONKS_ROBE_543 = 543 + const val MONKS_ROBE_544 = 544 + const val MONKS_ROBE_545 = 545 + const val SHADE_ROBE_546 = 546 + const val PICTURE_547 = 547 + const val SHADE_ROBE_548 = 548 + const val PICTURE_549 = 549 + const val NEWCOMER_MAP_550 = 550 + const val NEWCOMER_MAP_551 = 551 + const val GHOSTSPEAK_AMULET_552 = 552 + const val GHOSTS_SKULL_553 = 553 + const val FIRE_RUNE_554 = 554 + const val WATER_RUNE_555 = 555 + const val AIR_RUNE_556 = 556 + const val EARTH_RUNE_557 = 557 + const val MIND_RUNE_558 = 558 + const val BODY_RUNE_559 = 559 + const val DEATH_RUNE_560 = 560 + const val NATURE_RUNE_561 = 561 + const val CHAOS_RUNE_562 = 562 + const val LAW_RUNE_563 = 563 + const val COSMIC_RUNE_564 = 564 + const val BLOOD_RUNE_565 = 565 + const val SOUL_RUNE_566 = 566 + const val UNPOWERED_ORB_567 = 567 + const val UNPOWERED_ORB_568 = 568 + const val FIRE_ORB_569 = 569 + const val FIRE_ORB_570 = 570 + const val WATER_ORB_571 = 571 + const val WATER_ORB_572 = 572 + const val AIR_ORB_573 = 573 + const val AIR_ORB_574 = 574 + const val EARTH_ORB_575 = 575 + const val EARTH_ORB_576 = 576 + const val WIZARD_ROBE_577 = 577 + const val WIZARD_ROBE_578 = 578 + const val WIZARD_HAT_579 = 579 + const val WIZARD_HAT_580 = 580 + const val BLACK_ROBE_581 = 581 + const val BLACK_ROBE_582 = 582 + const val BAILING_BUCKET_583 = 583 + const val BAILING_BUCKET_584 = 584 + const val BAILING_BUCKET_585 = 585 + const val BAILING_BUCKET_586 = 586 + const val ORB_OF_PROTECTION_587 = 587 + const val ORBS_OF_PROTECTION_588 = 588 + const val GNOME_AMULET_589 = 589 + const val TINDERBOX_590 = 590 + const val TINDERBOX_591 = 591 + const val ASHES_592 = 592 + const val ASHES_593 = 593 + const val LIT_TORCH_594 = 594 + const val TORCH_595 = 595 + const val UNLIT_TORCH_596 = 596 + const val UNLIT_TORCH_597 = 597 + const val BRONZE_FIRE_ARROWS_598 = 598 + const val PICTURE_599 = 599 + const val ASTRONOMY_BOOK_600 = 600 + const val GOBLIN_KITCHEN_KEY_601 = 601 + const val LENS_MOULD_602 = 602 + const val OBSERVATORY_LENS_603 = 603 + const val BONE_SHARD_604 = 604 + const val BONE_KEY_605 = 605 + const val STONE_PLAQUE_606 = 606 + const val TATTERED_SCROLL_607 = 607 + const val CRUMPLED_SCROLL_608 = 608 + const val RASHILIYIA_CORPSE_609 = 609 + const val ZADIMUS_CORPSE_610 = 610 + const val LOCATING_CRYSTAL_611 = 611 + const val LOCATING_CRYSTAL_612 = 612 + const val LOCATING_CRYSTAL_613 = 613 + const val LOCATING_CRYSTAL_614 = 614 + const val LOCATING_CRYSTAL_615 = 615 + const val BEADS_OF_THE_DEAD_616 = 616 + const val COINS_617 = 617 + const val BONE_BEADS_618 = 618 + const val PARAMAYA_TICKET_619 = 619 + const val PARAMAYA_TICKET_620 = 620 + const val SHIP_TICKET_621 = 621 + const val TINDERBOX_622 = 622 + const val SWORD_POMMEL_623 = 623 + const val BERVIRIUS_NOTES_624 = 624 + const val WAMPUM_BELT_625 = 625 + const val BOOTS_626 = 626 + const val BOOTS_627 = 627 + const val BOOTS_628 = 628 + const val BOOTS_629 = 629 + const val BOOTS_630 = 630 + const val BOOTS_631 = 631 + const val BOOTS_632 = 632 + const val BOOTS_633 = 633 + const val BOOTS_634 = 634 + const val BOOTS_635 = 635 + const val ROBE_TOP_636 = 636 + const val ROBE_TOP_637 = 637 + const val ROBE_TOP_638 = 638 + const val ROBE_TOP_639 = 639 + const val ROBE_TOP_640 = 640 + const val ROBE_TOP_641 = 641 + const val ROBE_TOP_642 = 642 + const val ROBE_TOP_643 = 643 + const val ROBE_TOP_644 = 644 + const val ROBE_TOP_645 = 645 + const val ROBE_BOTTOMS_646 = 646 + const val ROBE_BOTTOMS_647 = 647 + const val ROBE_BOTTOMS_648 = 648 + const val ROBE_BOTTOMS_649 = 649 + const val ROBE_BOTTOMS_650 = 650 + const val ROBE_BOTTOMS_651 = 651 + const val ROBE_BOTTOMS_652 = 652 + const val ROBE_BOTTOMS_653 = 653 + const val ROBE_BOTTOMS_654 = 654 + const val ROBE_BOTTOMS_655 = 655 + const val HAT_656 = 656 + const val HAT_657 = 657 + const val HAT_658 = 658 + const val HAT_659 = 659 + const val HAT_660 = 660 + const val HAT_661 = 661 + const val HAT_662 = 662 + const val HAT_663 = 663 + const val HAT_664 = 664 + const val HAT_665 = 665 + const val PORTRAIT_666 = 666 + const val BLURITE_SWORD_667 = 667 + const val BLURITE_ORE_668 = 668 + const val SPECIMEN_JAR_669 = 669 + const val SPECIMEN_BRUSH_670 = 670 + const val ANIMAL_SKULL_671 = 671 + const val SPECIAL_CUP_672 = 672 + const val TEDDY_673 = 673 + const val CRACKED_SAMPLE_674 = 674 + const val ROCK_PICK_675 = 675 + const val TROWEL_676 = 676 + const val PANNING_TRAY_677 = 677 + const val PANNING_TRAY_678 = 678 + const val PANNING_TRAY_679 = 679 + const val NUGGETS_680 = 680 + const val ANCIENT_TALISMAN_681 = 681 + const val UNSTAMPED_LETTER_682 = 682 + const val SEALED_LETTER_683 = 683 + const val BELT_BUCKLE_684 = 684 + const val OLD_BOOT_685 = 685 + const val RUSTY_SWORD_686 = 686 + const val BROKEN_ARROW_687 = 687 + const val BUTTONS_688 = 688 + const val BROKEN_STAFF_689 = 689 + const val PICTURE_690 = 690 + const val LEVEL_1_CERTIFICATE_691 = 691 + const val LEVEL_2_CERTIFICATE_692 = 692 + const val LEVEL_3_CERTIFICATE_693 = 693 + const val CERAMIC_REMAINS_694 = 694 + const val OLD_TOOTH_695 = 695 + const val INVITATION_LETTER_696 = 696 + const val DAMAGED_ARMOUR_697 = 697 + const val BROKEN_ARMOUR_698 = 698 + const val STONE_TABLET_699 = 699 + const val CHEMICAL_POWDER_700 = 700 + const val AMMONIUM_NITRATE_701 = 701 + const val UNIDENTIFIED_LIQUID_702 = 702 + const val NITROGLYCERIN_703 = 703 + const val GROUND_CHARCOAL_704 = 704 + const val MIXED_CHEMICALS_705 = 705 + const val MIXED_CHEMICALS_706 = 706 + const val CHEMICAL_COMPOUND_707 = 707 + const val ARCENIA_ROOT_708 = 708 + const val CHEST_KEY_709 = 709 + const val VASE_710 = 710 + const val BOOK_ON_CHEMICALS_711 = 711 + const val CUP_OF_TEA_712 = 712 + const val PICTURE_713 = 713 + const val RADIMUS_NOTES_714 = 714 + const val RADIMUS_NOTES_715 = 715 + const val BULL_ROARER_716 = 716 + const val SCRAWLED_NOTE_717 = 717 + const val A_SCRIBBLED_NOTE_718 = 718 + const val SCRUMPLED_NOTE_719 = 719 + const val SKETCH_720 = 720 + const val GOLD_BOWL_721 = 721 + const val BLESSED_GOLD_BOWL_722 = 722 + const val GOLDEN_BOWL_723 = 723 + const val GOLDEN_BOWL_724 = 724 + const val GOLDEN_BOWL_725 = 725 + const val GOLDEN_BOWL_726 = 726 + const val HOLLOW_REED_727 = 727 + const val HOLLOW_REED_728 = 728 + const val SHAMANS_TOME_729 = 729 + const val BINDING_BOOK_730 = 730 + const val ENCHANTED_VIAL_731 = 731 + const val HOLY_WATER_732 = 732 + const val SMASHED_GLASS_733 = 733 + const val TINDERBOX_734 = 734 + const val YOMMI_TREE_SEEDS_735 = 735 + const val YOMMI_TREE_SEEDS_736 = 736 + const val SNAKEWEED_MIXTURE_737 = 737 + const val ARDRIGAL_MIXTURE_738 = 738 + const val BRAVERY_POTION_739 = 739 + const val BLUE_HAT_740 = 740 + const val CHUNK_OF_CRYSTAL_741 = 741 + const val HUNK_OF_CRYSTAL_742 = 742 + const val LUMP_OF_CRYSTAL_743 = 743 + const val HEART_CRYSTAL_744 = 744 + const val HEART_CRYSTAL_745 = 745 + const val DARK_DAGGER_746 = 746 + const val GLOWING_DAGGER_747 = 747 + const val HOLY_FORCE_748 = 748 + const val YOMMI_TOTEM_749 = 749 + const val GILDED_TOTEM_750 = 750 + const val GNOMEBALL_751 = 751 + const val GNOMEBALL_752 = 752 + const val CADAVA_BERRIES_753 = 753 + const val CADAVA_BERRIES_754 = 754 + const val MESSAGE_755 = 755 + const val CADAVA_POTION_756 = 756 + const val BOOK_757 = 757 + const val PHOENIX_HQ_KEY_758 = 758 + const val WEAPON_STORE_KEY_759 = 759 + const val WEAPON_STORE_KEY_760 = 760 + const val INTEL_REPORT_761 = 761 + const val PICTURE_762 = 762 + const val BROKEN_SHIELD_763 = 763 + const val PICTURE_764 = 764 + const val BROKEN_SHIELD_765 = 765 + const val PICTURE_766 = 766 + const val PHOENIX_CROSSBOW_767 = 767 + const val PHOENIX_CROSSBOW_768 = 768 + const val CERTIFICATE_769 = 769 + const val PICTURE_770 = 770 + const val DRAMEN_BRANCH_771 = 771 + const val DRAMEN_STAFF_772 = 772 + const val PERFECT_RING_773 = 773 + const val PERFECT_NECKLACE_774 = 774 + const val COOKING_GAUNTLETS_775 = 775 + const val GOLDSMITH_GAUNTLETS_776 = 776 + const val CHAOS_GAUNTLETS_777 = 777 + const val FAMILY_GAUNTLETS_778 = 778 + const val CREST_PART_779 = 779 + const val CREST_PART_780 = 780 + const val CREST_PART_781 = 781 + const val FAMILY_CREST_782 = 782 + const val BARK_SAMPLE_783 = 783 + const val TRANSLATION_BOOK_784 = 784 + const val GLOUGHS_JOURNAL_785 = 785 + const val HAZELMERES_SCROLL_786 = 786 + const val LUMBER_ORDER_787 = 787 + const val GLOUGHS_KEY_788 = 788 + const val TWIGS_789 = 789 + const val TWIGS_790 = 790 + const val TWIGS_791 = 791 + const val TWIGS_792 = 792 + const val DACONIA_ROCK_793 = 793 + const val INVASION_PLANS_794 = 794 + const val WAR_SHIP_795 = 795 + const val EXPLODING_VIAL_796 = 796 + const val HERB_BOWL_797 = 797 + const val GRINDER_798 = 798 + const val NULL_799 = 799 + const val BRONZE_THROWNAXE_800 = 800 + const val IRON_THROWNAXE_801 = 801 + const val STEEL_THROWNAXE_802 = 802 + const val MITHRIL_THROWNAXE_803 = 803 + const val ADAMANT_THROWNAXE_804 = 804 + const val RUNE_THROWNAXE_805 = 805 + const val BRONZE_DART_806 = 806 + const val IRON_DART_807 = 807 + const val STEEL_DART_808 = 808 + const val MITHRIL_DART_809 = 809 + const val ADAMANT_DART_810 = 810 + const val RUNE_DART_811 = 811 + const val BRONZE_DARTP_812 = 812 + const val IRON_DARTP_813 = 813 + const val STEEL_DARTP_814 = 814 + const val MITHRIL_DARTP_815 = 815 + const val ADAMANT_DARTP_816 = 816 + const val RUNE_DARTP_817 = 817 + const val POISONED_DARTP_818 = 818 + const val BRONZE_DART_TIP_819 = 819 + const val IRON_DART_TIP_820 = 820 + const val STEEL_DART_TIP_821 = 821 + const val MITHRIL_DART_TIP_822 = 822 + const val ADAMANT_DART_TIP_823 = 823 + const val RUNE_DART_TIP_824 = 824 + const val BRONZE_JAVELIN_825 = 825 + const val IRON_JAVELIN_826 = 826 + const val STEEL_JAVELIN_827 = 827 + const val MITHRIL_JAVELIN_828 = 828 + const val ADAMANT_JAVELIN_829 = 829 + const val RUNE_JAVELIN_830 = 830 + const val BRONZE_JAVELINP_831 = 831 + const val IRON_JAVELINP_832 = 832 + const val STEEL_JAVELINP_833 = 833 + const val MITHRIL_JAVELINP_834 = 834 + const val ADAMANT_JAVELINP_835 = 835 + const val RUNE_JAVELINP_836 = 836 + const val CROSSBOW_837 = 837 + const val CROSSBOW_838 = 838 + const val LONGBOW_839 = 839 + const val LONGBOW_840 = 840 + const val SHORTBOW_841 = 841 + const val SHORTBOW_842 = 842 + const val OAK_SHORTBOW_843 = 843 + const val OAK_SHORTBOW_844 = 844 + const val OAK_LONGBOW_845 = 845 + const val OAK_LONGBOW_846 = 846 + const val WILLOW_LONGBOW_847 = 847 + const val WILLOW_LONGBOW_848 = 848 + const val WILLOW_SHORTBOW_849 = 849 + const val WILLOW_SHORTBOW_850 = 850 + const val MAPLE_LONGBOW_851 = 851 + const val MAPLE_LONGBOW_852 = 852 + const val MAPLE_SHORTBOW_853 = 853 + const val MAPLE_SHORTBOW_854 = 854 + const val YEW_LONGBOW_855 = 855 + const val YEW_LONGBOW_856 = 856 + const val YEW_SHORTBOW_857 = 857 + const val YEW_SHORTBOW_858 = 858 + const val MAGIC_LONGBOW_859 = 859 + const val MAGIC_LONGBOW_860 = 860 + const val MAGIC_SHORTBOW_861 = 861 + const val MAGIC_SHORTBOW_862 = 862 + const val IRON_KNIFE_863 = 863 + const val BRONZE_KNIFE_864 = 864 + const val STEEL_KNIFE_865 = 865 + const val MITHRIL_KNIFE_866 = 866 + const val ADAMANT_KNIFE_867 = 867 + const val RUNE_KNIFE_868 = 868 + const val BLACK_KNIFE_869 = 869 + const val BRONZE_KNIFEP_870 = 870 + const val IRON_KNIFEP_871 = 871 + const val STEEL_KNIFEP_872 = 872 + const val MITHRIL_KNIFEP_873 = 873 + const val BLACK_KNIFEP_874 = 874 + const val ADAMANT_KNIFEP_875 = 875 + const val RUNE_KNIFEP_876 = 876 + const val BRONZE_BOLTS_877 = 877 + const val BRONZE_BOLTSP_878 = 878 + const val OPAL_BOLTS_879 = 879 + const val PEARL_BOLTS_880 = 880 + const val BARBED_BOLTS_881 = 881 + const val BRONZE_ARROW_882 = 882 + const val BRONZE_ARROWP_883 = 883 + const val IRON_ARROW_884 = 884 + const val IRON_ARROWP_885 = 885 + const val STEEL_ARROW_886 = 886 + const val STEEL_ARROWP_887 = 887 + const val MITHRIL_ARROW_888 = 888 + const val MITHRIL_ARROWP_889 = 889 + const val ADAMANT_ARROW_890 = 890 + const val ADAMANT_ARROWP_891 = 891 + const val RUNE_ARROW_892 = 892 + const val RUNE_ARROWP_893 = 893 + const val NULL_894 = 894 + const val NULL_895 = 895 + const val NULL_896 = 896 + const val NULL_897 = 897 + const val NULL_898 = 898 + const val NULL_899 = 899 + const val NULL_900 = 900 + const val NULL_901 = 901 + const val NULL_902 = 902 + const val NULL_903 = 903 + const val NULL_904 = 904 + const val NULL_905 = 905 + const val NULL_906 = 906 + const val NULL_907 = 907 + const val NULL_908 = 908 + const val NULL_909 = 909 + const val NULL_910 = 910 + const val NULL_911 = 911 + const val NULL_912 = 912 + const val NULL_913 = 913 + const val NULL_914 = 914 + const val NULL_915 = 915 + const val NULL_916 = 916 + const val NULL_917 = 917 + const val NULL_918 = 918 + const val NULL_919 = 919 + const val NULL_920 = 920 + const val NULL_921 = 921 + const val NULL_922 = 922 + const val NULL_923 = 923 + const val NULL_924 = 924 + const val NULL_925 = 925 + const val NULL_926 = 926 + const val NULL_927 = 927 + const val NULL_928 = 928 + const val NULL_929 = 929 + const val NULL_930 = 930 + const val NULL_931 = 931 + const val NULL_932 = 932 + const val NULL_933 = 933 + const val NULL_934 = 934 + const val NULL_935 = 935 + const val NULL_936 = 936 + const val NULL_937 = 937 + const val NULL_938 = 938 + const val NULL_939 = 939 + const val NULL_940 = 940 + const val NULL_941 = 941 + const val BRONZE_FIRE_ARROWS_942 = 942 + const val WORM_943 = 943 + const val WORM_944 = 944 + const val THROWING_ROPE_945 = 945 + const val KNIFE_946 = 946 + const val KNIFE_947 = 947 + const val BEAR_FUR_948 = 948 + const val BEAR_FUR_949 = 949 + const val SILK_950 = 950 + const val SILK_951 = 951 + const val SPADE_952 = 952 + const val SPADE_953 = 953 + const val ROPE_954 = 954 + const val ROPE_955 = 955 + const val FLIER_956 = 956 + const val TINDERBOX_957 = 957 + const val GREY_WOLF_FUR_958 = 958 + const val GREY_WOLF_FUR_959 = 959 + const val PLANK_960 = 960 + const val PLANK_961 = 961 + const val CHRISTMAS_CRACKER_962 = 962 + const val CHRISTMAS_CRACKER_963 = 963 + const val SKULL_964 = 964 + const val SKULL_965 = 965 + const val TILE_966 = 966 + const val TINDERBOX_967 = 967 + const val ROCK_968 = 968 + const val TINDERBOX_969 = 969 + const val PAPYRUS_970 = 970 + const val PAPYRUS_971 = 971 + const val PAPYRUS_972 = 972 + const val CHARCOAL_973 = 973 + const val CHARCOAL_974 = 974 + const val MACHETE_975 = 975 + const val MACHETE_976 = 976 + const val COOKING_POT_977 = 977 + const val COOKING_POT_978 = 978 + const val NULL_979 = 979 + const val NULL_980 = 980 + const val DISK_OF_RETURNING_981 = 981 + const val DISK_OF_RETURNING_982 = 982 + const val BRASS_KEY_983 = 983 + const val BRASS_KEY_984 = 984 + const val TOOTH_HALF_OF_A_KEY_985 = 985 + const val TOOTH_HALF_OF_A_KEY_986 = 986 + const val LOOP_HALF_OF_A_KEY_987 = 987 + const val LOOP_HALF_OF_A_KEY_988 = 988 + const val CRYSTAL_KEY_989 = 989 + const val CRYSTAL_KEY_990 = 990 + const val MUDDY_KEY_991 = 991 + const val MUDDY_KEY_992 = 992 + const val SINISTER_KEY_993 = 993 + const val SINISTER_KEY_994 = 994 + const val COINS_995 = 995 + const val NULL_996 = 996 + const val NULL_997 = 997 + const val NULL_998 = 998 + const val NULL_999 = 999 + const val NULL_1000 = 1000 + const val NULL_1001 = 1001 + const val NULL_1002 = 1002 + const val NULL_1003 = 1003 + const val NULL_1004 = 1004 + const val WHITE_APRON_1005 = 1005 + const val WHITE_APRON_1006 = 1006 + const val CAPE_1007 = 1007 + const val CAPE_1008 = 1008 + const val BRASS_NECKLACE_1009 = 1009 + const val BRASS_NECKLACE_1010 = 1010 + const val BLUE_SKIRT_1011 = 1011 + const val BLUE_SKIRT_1012 = 1012 + const val PINK_SKIRT_1013 = 1013 + const val PINK_SKIRT_1014 = 1014 + const val BLACK_SKIRT_1015 = 1015 + const val BLACK_SKIRT_1016 = 1016 + const val WIZARD_HAT_1017 = 1017 + const val WIZARD_HAT_1018 = 1018 + const val CAPE_1019 = 1019 + const val CAPE_1020 = 1020 + const val CAPE_1021 = 1021 + const val CAPE_1022 = 1022 + const val CAPE_1023 = 1023 + const val CAPE_1024 = 1024 + const val EYE_PATCH_1025 = 1025 + const val EYE_PATCH_1026 = 1026 + const val CAPE_1027 = 1027 + const val CAPE_1028 = 1028 + const val CAPE_1029 = 1029 + const val CAPE_1030 = 1030 + const val CAPE_1031 = 1031 + const val CAPE_1032 = 1032 + const val ZAMORAK_ROBE_1033 = 1033 + const val ZAMORAK_ROBE_1034 = 1034 + const val ZAMORAK_ROBE_1035 = 1035 + const val ZAMORAK_ROBE_1036 = 1036 + const val BUNNY_EARS_1037 = 1037 + const val RED_PARTYHAT_1038 = 1038 + const val RED_PARTYHAT_1039 = 1039 + const val YELLOW_PARTYHAT_1040 = 1040 + const val YELLOW_PARTYHAT_1041 = 1041 + const val BLUE_PARTYHAT_1042 = 1042 + const val BLUE_PARTYHAT_1043 = 1043 + const val GREEN_PARTYHAT_1044 = 1044 + const val GREEN_PARTYHAT_1045 = 1045 + const val PURPLE_PARTYHAT_1046 = 1046 + const val PURPLE_PARTYHAT_1047 = 1047 + const val WHITE_PARTYHAT_1048 = 1048 + const val WHITE_PARTYHAT_1049 = 1049 + const val SANTA_HAT_1050 = 1050 + const val SANTA_HAT_1051 = 1051 + const val CAPE_OF_LEGENDS_1052 = 1052 + const val GREEN_HWEEN_MASK_1053 = 1053 + const val GREEN_HWEEN_MASK_1054 = 1054 + const val BLUE_HWEEN_MASK_1055 = 1055 + const val BLUE_HWEEN_MASK_1056 = 1056 + const val RED_HWEEN_MASK_1057 = 1057 + const val RED_HWEEN_MASK_1058 = 1058 + const val LEATHER_GLOVES_1059 = 1059 + const val LEATHER_GLOVES_1060 = 1060 + const val LEATHER_BOOTS_1061 = 1061 + const val LEATHER_BOOTS_1062 = 1062 + const val LEATHER_VAMBRACES_1063 = 1063 + const val LEATHER_VAMBRACES_1064 = 1064 + const val GREEN_DHIDE_VAMB_1065 = 1065 + const val GREEN_DHIDE_VAMB_1066 = 1066 + const val IRON_PLATELEGS_1067 = 1067 + const val IRON_PLATELEGS_1068 = 1068 + const val STEEL_PLATELEGS_1069 = 1069 + const val STEEL_PLATELEGS_1070 = 1070 + const val MITHRIL_PLATELEGS_1071 = 1071 + const val MITHRIL_PLATELEGS_1072 = 1072 + const val ADAMANT_PLATELEGS_1073 = 1073 + const val ADAMANT_PLATELEGS_1074 = 1074 + const val BRONZE_PLATELEGS_1075 = 1075 + const val BRONZE_PLATELEGS_1076 = 1076 + const val BLACK_PLATELEGS_1077 = 1077 + const val BLACK_PLATELEGS_1078 = 1078 + const val RUNE_PLATELEGS_1079 = 1079 + const val RUNE_PLATELEGS_1080 = 1080 + const val IRON_PLATESKIRT_1081 = 1081 + const val IRON_PLATESKIRT_1082 = 1082 + const val STEEL_PLATESKIRT_1083 = 1083 + const val STEEL_PLATESKIRT_1084 = 1084 + const val MITHRIL_PLATESKIRT_1085 = 1085 + const val MITHRIL_PLATESKIRT_1086 = 1086 + const val BRONZE_PLATESKIRT_1087 = 1087 + const val BRONZE_PLATESKIRT_1088 = 1088 + const val BLACK_PLATESKIRT_1089 = 1089 + const val BLACK_PLATESKIRT_1090 = 1090 + const val ADAMANT_PLATESKIRT_1091 = 1091 + const val ADAMANT_PLATESKIRT_1092 = 1092 + const val RUNE_PLATESKIRT_1093 = 1093 + const val RUNE_PLATESKIRT_1094 = 1094 + const val LEATHER_CHAPS_1095 = 1095 + const val LEATHER_CHAPS_1096 = 1096 + const val STUDDED_CHAPS_1097 = 1097 + const val STUDDED_CHAPS_1098 = 1098 + const val GREEN_DHIDE_CHAPS_1099 = 1099 + const val GREEN_DHIDE_CHAPS_1100 = 1100 + const val IRON_CHAINBODY_1101 = 1101 + const val IRON_CHAINBODY_1102 = 1102 + const val BRONZE_CHAINBODY_1103 = 1103 + const val BRONZE_CHAINBODY_1104 = 1104 + const val STEEL_CHAINBODY_1105 = 1105 + const val STEEL_CHAINBODY_1106 = 1106 + const val BLACK_CHAINBODY_1107 = 1107 + const val BLACK_CHAINBODY_1108 = 1108 + const val MITHRIL_CHAINBODY_1109 = 1109 + const val MITHRIL_CHAINBODY_1110 = 1110 + const val ADAMANT_CHAINBODY_1111 = 1111 + const val ADAMANT_CHAINBODY_1112 = 1112 + const val RUNE_CHAINBODY_1113 = 1113 + const val RUNE_CHAINBODY_1114 = 1114 + const val IRON_PLATEBODY_1115 = 1115 + const val IRON_PLATEBODY_1116 = 1116 + const val BRONZE_PLATEBODY_1117 = 1117 + const val BRONZE_PLATEBODY_1118 = 1118 + const val STEEL_PLATEBODY_1119 = 1119 + const val STEEL_PLATEBODY_1120 = 1120 + const val MITHRIL_PLATEBODY_1121 = 1121 + const val MITHRIL_PLATEBODY_1122 = 1122 + const val ADAMANT_PLATEBODY_1123 = 1123 + const val ADAMANT_PLATEBODY_1124 = 1124 + const val BLACK_PLATEBODY_1125 = 1125 + const val BLACK_PLATEBODY_1126 = 1126 + const val RUNE_PLATEBODY_1127 = 1127 + const val RUNE_PLATEBODY_1128 = 1128 + const val LEATHER_BODY_1129 = 1129 + const val LEATHER_BODY_1130 = 1130 + const val HARDLEATHER_BODY_1131 = 1131 + const val HARDLEATHER_BODY_1132 = 1132 + const val STUDDED_BODY_1133 = 1133 + const val STUDDED_BODY_1134 = 1134 + const val GREEN_DHIDE_BODY_1135 = 1135 + const val GREEN_DHIDE_BODY_1136 = 1136 + const val IRON_MED_HELM_1137 = 1137 + const val IRON_MED_HELM_1138 = 1138 + const val BRONZE_MED_HELM_1139 = 1139 + const val BRONZE_MED_HELM_1140 = 1140 + const val STEEL_MED_HELM_1141 = 1141 + const val STEEL_MED_HELM_1142 = 1142 + const val MITHRIL_MED_HELM_1143 = 1143 + const val MITHRIL_MED_HELM_1144 = 1144 + const val ADAMANT_MED_HELM_1145 = 1145 + const val ADAMANT_MED_HELM_1146 = 1146 + const val RUNE_MED_HELM_1147 = 1147 + const val RUNE_MED_HELM_1148 = 1148 + const val DRAGON_MED_HELM_1149 = 1149 + const val DRAGON_MED_HELM_1150 = 1150 + const val BLACK_MED_HELM_1151 = 1151 + const val BLACK_MED_HELM_1152 = 1152 + const val IRON_FULL_HELM_1153 = 1153 + const val IRON_FULL_HELM_1154 = 1154 + const val BRONZE_FULL_HELM_1155 = 1155 + const val BRONZE_FULL_HELM_1156 = 1156 + const val STEEL_FULL_HELM_1157 = 1157 + const val STEEL_FULL_HELM_1158 = 1158 + const val MITHRIL_FULL_HELM_1159 = 1159 + const val MITHRIL_FULL_HELM_1160 = 1160 + const val ADAMANT_FULL_HELM_1161 = 1161 + const val ADAMANT_FULL_HELM_1162 = 1162 + const val RUNE_FULL_HELM_1163 = 1163 + const val RUNE_FULL_HELM_1164 = 1164 + const val BLACK_FULL_HELM_1165 = 1165 + const val BLACK_FULL_HELM_1166 = 1166 + const val LEATHER_COWL_1167 = 1167 + const val LEATHER_COWL_1168 = 1168 + const val COIF_1169 = 1169 + const val COIF_1170 = 1170 + const val WOODEN_SHIELD_1171 = 1171 + const val WOODEN_SHIELD_1172 = 1172 + const val BRONZE_SQ_SHIELD_1173 = 1173 + const val BRONZE_SQ_SHIELD_1174 = 1174 + const val IRON_SQ_SHIELD_1175 = 1175 + const val IRON_SQ_SHIELD_1176 = 1176 + const val STEEL_SQ_SHIELD_1177 = 1177 + const val STEEL_SQ_SHIELD_1178 = 1178 + const val BLACK_SQ_SHIELD_1179 = 1179 + const val BLACK_SQ_SHIELD_1180 = 1180 + const val MITHRIL_SQ_SHIELD_1181 = 1181 + const val MITHRIL_SQ_SHIELD_1182 = 1182 + const val ADAMANT_SQ_SHIELD_1183 = 1183 + const val ADAMANT_SQ_SHIELD_1184 = 1184 + const val RUNE_SQ_SHIELD_1185 = 1185 + const val RUNE_SQ_SHIELD_1186 = 1186 + const val DRAGON_SQ_SHIELD_1187 = 1187 + const val DRAGON_SQ_SHIELD_1188 = 1188 + const val BRONZE_KITESHIELD_1189 = 1189 + const val BRONZE_KITESHIELD_1190 = 1190 + const val IRON_KITESHIELD_1191 = 1191 + const val IRON_KITESHIELD_1192 = 1192 + const val STEEL_KITESHIELD_1193 = 1193 + const val STEEL_KITESHIELD_1194 = 1194 + const val BLACK_KITESHIELD_1195 = 1195 + const val BLACK_KITESHIELD_1196 = 1196 + const val MITHRIL_KITESHIELD_1197 = 1197 + const val MITHRIL_KITESHIELD_1198 = 1198 + const val ADAMANT_KITESHIELD_1199 = 1199 + const val ADAMANT_KITESHIELD_1200 = 1200 + const val RUNE_KITESHIELD_1201 = 1201 + const val RUNE_KITESHIELD_1202 = 1202 + const val IRON_DAGGER_1203 = 1203 + const val IRON_DAGGER_1204 = 1204 + const val BRONZE_DAGGER_1205 = 1205 + const val BRONZE_DAGGER_1206 = 1206 + const val STEEL_DAGGER_1207 = 1207 + const val STEEL_DAGGER_1208 = 1208 + const val MITHRIL_DAGGER_1209 = 1209 + const val MITHRIL_DAGGER_1210 = 1210 + const val ADAMANT_DAGGER_1211 = 1211 + const val ADAMANT_DAGGER_1212 = 1212 + const val RUNE_DAGGER_1213 = 1213 + const val RUNE_DAGGER_1214 = 1214 + const val DRAGON_DAGGER_1215 = 1215 + const val DRAGON_DAGGER_1216 = 1216 + const val BLACK_DAGGER_1217 = 1217 + const val BLACK_DAGGER_1218 = 1218 + const val IRON_DAGGERP_1219 = 1219 + const val IRON_DAGGERP_1220 = 1220 + const val BRONZE_DAGGERP_1221 = 1221 + const val BRONZE_DAGGERP_1222 = 1222 + const val STEEL_DAGGERP_1223 = 1223 + const val STEEL_DAGGERP_1224 = 1224 + const val MITHRIL_DAGGERP_1225 = 1225 + const val MITHRIL_DAGGERP_1226 = 1226 + const val ADAMANT_DAGGERP_1227 = 1227 + const val ADAMANT_DAGGERP_1228 = 1228 + const val RUNE_DAGGERP_1229 = 1229 + const val RUNE_DAGGERP_1230 = 1230 + const val DRAGON_DAGGERP_1231 = 1231 + const val DRAGON_DAGGERP_1232 = 1232 + const val BLACK_DAGGERP_1233 = 1233 + const val BLACK_DAGGERP_1234 = 1234 + const val POISONED_DAGGERP_1235 = 1235 + const val POISONED_DAGGERP_1236 = 1236 + const val BRONZE_SPEAR_1237 = 1237 + const val BRONZE_SPEAR_1238 = 1238 + const val IRON_SPEAR_1239 = 1239 + const val IRON_SPEAR_1240 = 1240 + const val STEEL_SPEAR_1241 = 1241 + const val STEEL_SPEAR_1242 = 1242 + const val MITHRIL_SPEAR_1243 = 1243 + const val MITHRIL_SPEAR_1244 = 1244 + const val ADAMANT_SPEAR_1245 = 1245 + const val ADAMANT_SPEAR_1246 = 1246 + const val RUNE_SPEAR_1247 = 1247 + const val RUNE_SPEAR_1248 = 1248 + const val DRAGON_SPEAR_1249 = 1249 + const val DRAGON_SPEAR_1250 = 1250 + const val BRONZE_SPEARP_1251 = 1251 + const val BRONZE_SPEARP_1252 = 1252 + const val IRON_SPEARP_1253 = 1253 + const val IRON_SPEARP_1254 = 1254 + const val STEEL_SPEARP_1255 = 1255 + const val STEEL_SPEARP_1256 = 1256 + const val MITHRIL_SPEARP_1257 = 1257 + const val MITHRIL_SPEARP_1258 = 1258 + const val ADAMANT_SPEARP_1259 = 1259 + const val ADAMANT_SPEARP_1260 = 1260 + const val RUNE_SPEARP_1261 = 1261 + const val RUNE_SPEARP_1262 = 1262 + const val DRAGON_SPEARP_1263 = 1263 + const val DRAGON_SPEARP_1264 = 1264 + const val BRONZE_PICKAXE_1265 = 1265 + const val BRONZE_PICKAXE_1266 = 1266 + const val IRON_PICKAXE_1267 = 1267 + const val IRON_PICKAXE_1268 = 1268 + const val STEEL_PICKAXE_1269 = 1269 + const val STEEL_PICKAXE_1270 = 1270 + const val ADAMANT_PICKAXE_1271 = 1271 + const val ADAMANT_PICKAXE_1272 = 1272 + const val MITHRIL_PICKAXE_1273 = 1273 + const val MITHRIL_PICKAXE_1274 = 1274 + const val RUNE_PICKAXE_1275 = 1275 + const val RUNE_PICKAXE_1276 = 1276 + const val BRONZE_SWORD_1277 = 1277 + const val BRONZE_SWORD_1278 = 1278 + const val IRON_SWORD_1279 = 1279 + const val IRON_SWORD_1280 = 1280 + const val STEEL_SWORD_1281 = 1281 + const val STEEL_SWORD_1282 = 1282 + const val BLACK_SWORD_1283 = 1283 + const val BLACK_SWORD_1284 = 1284 + const val MITHRIL_SWORD_1285 = 1285 + const val MITHRIL_SWORD_1286 = 1286 + const val ADAMANT_SWORD_1287 = 1287 + const val ADAMANT_SWORD_1288 = 1288 + const val RUNE_SWORD_1289 = 1289 + const val RUNE_SWORD_1290 = 1290 + const val BRONZE_LONGSWORD_1291 = 1291 + const val BRONZE_LONGSWORD_1292 = 1292 + const val IRON_LONGSWORD_1293 = 1293 + const val IRON_LONGSWORD_1294 = 1294 + const val STEEL_LONGSWORD_1295 = 1295 + const val STEEL_LONGSWORD_1296 = 1296 + const val BLACK_LONGSWORD_1297 = 1297 + const val BLACK_LONGSWORD_1298 = 1298 + const val MITHRIL_LONGSWORD_1299 = 1299 + const val MITHRIL_LONGSWORD_1300 = 1300 + const val ADAMANT_LONGSWORD_1301 = 1301 + const val ADAMANT_LONGSWORD_1302 = 1302 + const val RUNE_LONGSWORD_1303 = 1303 + const val RUNE_LONGSWORD_1304 = 1304 + const val DRAGON_LONGSWORD_1305 = 1305 + const val DRAGON_LONGSWORD_1306 = 1306 + const val BRONZE_2H_SWORD_1307 = 1307 + const val BRONZE_2H_SWORD_1308 = 1308 + const val IRON_2H_SWORD_1309 = 1309 + const val IRON_2H_SWORD_1310 = 1310 + const val STEEL_2H_SWORD_1311 = 1311 + const val STEEL_2H_SWORD_1312 = 1312 + const val BLACK_2H_SWORD_1313 = 1313 + const val BLACK_2H_SWORD_1314 = 1314 + const val MITHRIL_2H_SWORD_1315 = 1315 + const val MITHRIL_2H_SWORD_1316 = 1316 + const val ADAMANT_2H_SWORD_1317 = 1317 + const val ADAMANT_2H_SWORD_1318 = 1318 + const val RUNE_2H_SWORD_1319 = 1319 + const val RUNE_2H_SWORD_1320 = 1320 + const val BRONZE_SCIMITAR_1321 = 1321 + const val BRONZE_SCIMITAR_1322 = 1322 + const val IRON_SCIMITAR_1323 = 1323 + const val IRON_SCIMITAR_1324 = 1324 + const val STEEL_SCIMITAR_1325 = 1325 + const val STEEL_SCIMITAR_1326 = 1326 + const val BLACK_SCIMITAR_1327 = 1327 + const val BLACK_SCIMITAR_1328 = 1328 + const val MITHRIL_SCIMITAR_1329 = 1329 + const val MITHRIL_SCIMITAR_1330 = 1330 + const val ADAMANT_SCIMITAR_1331 = 1331 + const val ADAMANT_SCIMITAR_1332 = 1332 + const val RUNE_SCIMITAR_1333 = 1333 + const val RUNE_SCIMITAR_1334 = 1334 + const val IRON_WARHAMMER_1335 = 1335 + const val IRON_WARHAMMER_1336 = 1336 + const val BRONZE_WARHAMMER_1337 = 1337 + const val BRONZE_WARHAMMER_1338 = 1338 + const val STEEL_WARHAMMER_1339 = 1339 + const val STEEL_WARHAMMER_1340 = 1340 + const val BLACK_WARHAMMER_1341 = 1341 + const val BLACK_WARHAMMER_1342 = 1342 + const val MITHRIL_WARHAMMER_1343 = 1343 + const val MITHRIL_WARHAMMER_1344 = 1344 + const val ADAMANT_WARHAMMER_1345 = 1345 + const val ADAMANT_WARHAMMER_1346 = 1346 + const val RUNE_WARHAMMER_1347 = 1347 + const val RUNE_WARHAMMER_1348 = 1348 + const val IRON_AXE_1349 = 1349 + const val IRON_AXE_1350 = 1350 + const val BRONZE_AXE_1351 = 1351 + const val BRONZE_AXE_1352 = 1352 + const val STEEL_AXE_1353 = 1353 + const val STEEL_AXE_1354 = 1354 + const val MITHRIL_AXE_1355 = 1355 + const val MITHRIL_AXE_1356 = 1356 + const val ADAMANT_AXE_1357 = 1357 + const val ADAMANT_AXE_1358 = 1358 + const val RUNE_AXE_1359 = 1359 + const val RUNE_AXE_1360 = 1360 + const val BLACK_AXE_1361 = 1361 + const val BLACK_AXE_1362 = 1362 + const val IRON_BATTLEAXE_1363 = 1363 + const val IRON_BATTLEAXE_1364 = 1364 + const val STEEL_BATTLEAXE_1365 = 1365 + const val STEEL_BATTLEAXE_1366 = 1366 + const val BLACK_BATTLEAXE_1367 = 1367 + const val BLACK_BATTLEAXE_1368 = 1368 + const val MITHRIL_BATTLEAXE_1369 = 1369 + const val MITHRIL_BATTLEAXE_1370 = 1370 + const val ADAMANT_BATTLEAXE_1371 = 1371 + const val ADAMANT_BATTLEAXE_1372 = 1372 + const val RUNE_BATTLEAXE_1373 = 1373 + const val RUNE_BATTLEAXE_1374 = 1374 + const val BRONZE_BATTLEAXE_1375 = 1375 + const val BRONZE_BATTLEAXE_1376 = 1376 + const val DRAGON_BATTLEAXE_1377 = 1377 + const val DRAGON_BATTLEAXE_1378 = 1378 + const val STAFF_1379 = 1379 + const val STAFF_1380 = 1380 + const val STAFF_OF_AIR_1381 = 1381 + const val STAFF_OF_AIR_1382 = 1382 + const val STAFF_OF_WATER_1383 = 1383 + const val STAFF_OF_WATER_1384 = 1384 + const val STAFF_OF_EARTH_1385 = 1385 + const val STAFF_OF_EARTH_1386 = 1386 + const val STAFF_OF_FIRE_1387 = 1387 + const val STAFF_OF_FIRE_1388 = 1388 + const val MAGIC_STAFF_1389 = 1389 + const val MAGIC_STAFF_1390 = 1390 + const val BATTLESTAFF_1391 = 1391 + const val BATTLESTAFF_1392 = 1392 + const val FIRE_BATTLESTAFF_1393 = 1393 + const val FIRE_BATTLESTAFF_1394 = 1394 + const val WATER_BATTLESTAFF_1395 = 1395 + const val WATER_BATTLESTAFF_1396 = 1396 + const val AIR_BATTLESTAFF_1397 = 1397 + const val AIR_BATTLESTAFF_1398 = 1398 + const val EARTH_BATTLESTAFF_1399 = 1399 + const val EARTH_BATTLESTAFF_1400 = 1400 + const val MYSTIC_FIRE_STAFF_1401 = 1401 + const val MYSTIC_FIRE_STAFF_1402 = 1402 + const val MYSTIC_WATER_STAFF_1403 = 1403 + const val MYSTIC_WATER_STAFF_1404 = 1404 + const val MYSTIC_AIR_STAFF_1405 = 1405 + const val MYSTIC_AIR_STAFF_1406 = 1406 + const val MYSTIC_EARTH_STAFF_1407 = 1407 + const val MYSTIC_EARTH_STAFF_1408 = 1408 + const val IBANS_STAFF_1409 = 1409 + const val IBANS_STAFF_1410 = 1410 + const val FARMERS_FORK_1411 = 1411 + const val FARMERS_FORK_1412 = 1412 + const val HALBERD_1413 = 1413 + const val HALBERD_1414 = 1414 + const val WARHAMMER_1415 = 1415 + const val WARHAMMER_1416 = 1416 + const val JAVELIN_1417 = 1417 + const val JAVELIN_1418 = 1418 + const val SCYTHE_1419 = 1419 + const val IRON_MACE_1420 = 1420 + const val IRON_MACE_1421 = 1421 + const val BRONZE_MACE_1422 = 1422 + const val BRONZE_MACE_1423 = 1423 + const val STEEL_MACE_1424 = 1424 + const val STEEL_MACE_1425 = 1425 + const val BLACK_MACE_1426 = 1426 + const val BLACK_MACE_1427 = 1427 + const val MITHRIL_MACE_1428 = 1428 + const val MITHRIL_MACE_1429 = 1429 + const val ADAMANT_MACE_1430 = 1430 + const val ADAMANT_MACE_1431 = 1431 + const val RUNE_MACE_1432 = 1432 + const val RUNE_MACE_1433 = 1433 + const val DRAGON_MACE_1434 = 1434 + const val DRAGON_MACE_1435 = 1435 + const val RUNE_ESSENCE_1436 = 1436 + const val RUNE_ESSENCE_1437 = 1437 + const val AIR_TALISMAN_1438 = 1438 + const val AIR_TALISMAN_1439 = 1439 + const val EARTH_TALISMAN_1440 = 1440 + const val EARTH_TALISMAN_1441 = 1441 + const val FIRE_TALISMAN_1442 = 1442 + const val FIRE_TALISMAN_1443 = 1443 + const val WATER_TALISMAN_1444 = 1444 + const val WATER_TALISMAN_1445 = 1445 + const val BODY_TALISMAN_1446 = 1446 + const val BODY_TALISMAN_1447 = 1447 + const val MIND_TALISMAN_1448 = 1448 + const val MIND_TALISMAN_1449 = 1449 + const val BLOOD_TALISMAN_1450 = 1450 + const val BLOOD_TALISMAN_1451 = 1451 + const val CHAOS_TALISMAN_1452 = 1452 + const val CHAOS_TALISMAN_1453 = 1453 + const val COSMIC_TALISMAN_1454 = 1454 + const val COSMIC_TALISMAN_1455 = 1455 + const val DEATH_TALISMAN_1456 = 1456 + const val DEATH_TALISMAN_1457 = 1457 + const val LAW_TALISMAN_1458 = 1458 + const val LAW_TALISMAN_1459 = 1459 + const val SOUL_TALISMAN_1460 = 1460 + const val SOUL_TALISMAN_1461 = 1461 + const val NATURE_TALISMAN_1462 = 1462 + const val NATURE_TALISMAN_1463 = 1463 + const val ARCHERY_TICKET_1464 = 1464 + const val WEAPON_POISON_1465 = 1465 + const val SEA_SLUG_1466 = 1466 + const val DAMP_STICKS_1467 = 1467 + const val DRY_STICKS_1468 = 1468 + const val BROKEN_GLASS_1469 = 1469 + const val RED_BEAD_1470 = 1470 + const val RED_BEAD_1471 = 1471 + const val YELLOW_BEAD_1472 = 1472 + const val YELLOW_BEAD_1473 = 1473 + const val BLACK_BEAD_1474 = 1474 + const val BLACK_BEAD_1475 = 1475 + const val WHITE_BEAD_1476 = 1476 + const val WHITE_BEAD_1477 = 1477 + const val AMULET_OF_ACCURACY_1478 = 1478 + const val AMULET_OF_ACCURACY_1479 = 1479 + const val ROCK_1480 = 1480 + const val ORB_OF_LIGHT_1481 = 1481 + const val ORB_OF_LIGHT_1482 = 1482 + const val ORB_OF_LIGHT_1483 = 1483 + const val ORB_OF_LIGHT_1484 = 1484 + const val DAMP_CLOTH_1485 = 1485 + const val PIECE_OF_RAILING_1486 = 1486 + const val UNICORN_HORN_1487 = 1487 + const val PALADINS_BADGE_1488 = 1488 + const val PALADINS_BADGE_1489 = 1489 + const val PALADINS_BADGE_1490 = 1490 + const val WITCHS_CAT_1491 = 1491 + const val DOLL_OF_IBAN_1492 = 1492 + const val OLD_JOURNAL_1493 = 1493 + const val HISTORY_OF_IBAN_1494 = 1494 + const val KLANKS_GAUNTLETS_1495 = 1495 + const val IBANS_DOVE_1496 = 1496 + const val AMULET_OF_OTHANIAN_1497 = 1497 + const val AMULET_OF_DOOMION_1498 = 1498 + const val AMULET_OF_HOLTHION_1499 = 1499 + const val IBANS_SHADOW_1500 = 1500 + const val DWARF_BREW_1501 = 1501 + const val IBANS_ASHES_1502 = 1502 + const val WARRANT_1503 = 1503 + const val HANGOVER_CURE_1504 = 1504 + const val A_MAGIC_SCROLL_1505 = 1505 + const val GAS_MASK_1506 = 1506 + const val A_SMALL_KEY_1507 = 1507 + const val A_SCRUFFY_NOTE_1508 = 1508 + const val BOOK_1509 = 1509 + const val PICTURE_1510 = 1510 + const val LOGS_1511 = 1511 + const val LOGS_1512 = 1512 + const val MAGIC_LOGS_1513 = 1513 + const val MAGIC_LOGS_1514 = 1514 + const val YEW_LOGS_1515 = 1515 + const val YEW_LOGS_1516 = 1516 + const val MAPLE_LOGS_1517 = 1517 + const val MAPLE_LOGS_1518 = 1518 + const val WILLOW_LOGS_1519 = 1519 + const val WILLOW_LOGS_1520 = 1520 + const val OAK_LOGS_1521 = 1521 + const val OAK_LOGS_1522 = 1522 + const val LOCKPICK_1523 = 1523 + const val LOCKPICK_1524 = 1524 + const val GRIMY_SNAKE_WEED_1525 = 1525 + const val CLEAN_SNAKE_WEED_1526 = 1526 + const val GRIMY_ARDRIGAL_1527 = 1527 + const val CLEAN_ARDRIGAL_1528 = 1528 + const val GRIMY_SITO_FOIL_1529 = 1529 + const val CLEAN_SITO_FOIL_1530 = 1530 + const val GRIMY_VOLENCIA_MOSS_1531 = 1531 + const val CLEAN_VOLENCIA_MOSS_1532 = 1532 + const val GRIMY_ROGUES_PURSE_1533 = 1533 + const val CLEAN_ROGUES_PURSE_1534 = 1534 + const val MAP_PART_1535 = 1535 + const val MAP_PART_1536 = 1536 + const val MAP_PART_1537 = 1537 + const val CRANDOR_MAP_1538 = 1538 + const val STEEL_NAILS_1539 = 1539 + const val ANTI_DRAGON_SHIELD_1540 = 1540 + const val ANTI_DRAGON_SHIELD_1541 = 1541 + const val MAZE_KEY_1542 = 1542 + const val KEY_1543 = 1543 + const val KEY_1544 = 1544 + const val KEY_1545 = 1545 + const val KEY_1546 = 1546 + const val KEY_1547 = 1547 + const val KEY_1548 = 1548 + const val STAKE_1549 = 1549 + const val GARLIC_1550 = 1550 + const val GARLIC_1551 = 1551 + const val DOOGLE_SARDINE_1552 = 1552 + const val TINDERBOX_1553 = 1553 + const val NULL_1554 = 1554 + const val PET_KITTEN_1555 = 1555 + const val PET_KITTEN_1556 = 1556 + const val PET_KITTEN_1557 = 1557 + const val PET_KITTEN_1558 = 1558 + const val PET_KITTEN_1559 = 1559 + const val PET_KITTEN_1560 = 1560 + const val PET_CAT_1561 = 1561 + const val PET_CAT_1562 = 1562 + const val PET_CAT_1563 = 1563 + const val PET_CAT_1564 = 1564 + const val PET_CAT_1565 = 1565 + const val PET_CAT_1566 = 1566 + const val OVERGROWN_CAT_1567 = 1567 + const val OVERGROWN_CAT_1568 = 1568 + const val OVERGROWN_CAT_1569 = 1569 + const val OVERGROWN_CAT_1570 = 1570 + const val OVERGROWN_CAT_1571 = 1571 + const val OVERGROWN_CAT_1572 = 1572 + const val DOOGLE_LEAVES_1573 = 1573 + const val TINDERBOX_1574 = 1574 + const val CAT_TRAINING_MEDAL_1575 = 1575 + const val TINDERBOX_1576 = 1576 + const val PETES_CANDLESTICK_1577 = 1577 + const val PETES_CANDLESTICK_1578 = 1578 + const val THIEVES_ARMBAND_1579 = 1579 + const val ICE_GLOVES_1580 = 1580 + const val BLAMISH_SNAIL_SLIME_1581 = 1581 + const val BLAMISH_OIL_1582 = 1582 + const val FIRE_FEATHER_1583 = 1583 + const val ID_PAPERS_1584 = 1584 + const val OILY_FISHING_ROD_1585 = 1585 + const val MISCELLANEOUS_KEY_1586 = 1586 + const val MISCELLANEOUS_KEY_1587 = 1587 + const val GRIPS_KEY_RING_1588 = 1588 + const val PICTURE_1589 = 1589 + const val DUSTY_KEY_1590 = 1590 + const val JAIL_KEY_1591 = 1591 + const val RING_MOULD_1592 = 1592 + const val RING_MOULD_1593 = 1593 + const val UNHOLY_MOULD_1594 = 1594 + const val AMULET_MOULD_1595 = 1595 + const val AMULET_MOULD_1596 = 1596 + const val NECKLACE_MOULD_1597 = 1597 + const val NECKLACE_MOULD_1598 = 1598 + const val HOLY_MOULD_1599 = 1599 + const val HOLY_MOULD_1600 = 1600 + const val DIAMOND_1601 = 1601 + const val DIAMOND_1602 = 1602 + const val RUBY_1603 = 1603 + const val RUBY_1604 = 1604 + const val EMERALD_1605 = 1605 + const val EMERALD_1606 = 1606 + const val SAPPHIRE_1607 = 1607 + const val SAPPHIRE_1608 = 1608 + const val OPAL_1609 = 1609 + const val OPAL_1610 = 1610 + const val JADE_1611 = 1611 + const val JADE_1612 = 1612 + const val RED_TOPAZ_1613 = 1613 + const val RED_TOPAZ_1614 = 1614 + const val DRAGONSTONE_1615 = 1615 + const val DRAGONSTONE_1616 = 1616 + const val UNCUT_DIAMOND_1617 = 1617 + const val UNCUT_DIAMOND_1618 = 1618 + const val UNCUT_RUBY_1619 = 1619 + const val UNCUT_RUBY_1620 = 1620 + const val UNCUT_EMERALD_1621 = 1621 + const val UNCUT_EMERALD_1622 = 1622 + const val UNCUT_SAPPHIRE_1623 = 1623 + const val UNCUT_SAPPHIRE_1624 = 1624 + const val UNCUT_OPAL_1625 = 1625 + const val UNCUT_OPAL_1626 = 1626 + const val UNCUT_JADE_1627 = 1627 + const val UNCUT_JADE_1628 = 1628 + const val UNCUT_RED_TOPAZ_1629 = 1629 + const val UNCUT_RED_TOPAZ_1630 = 1630 + const val UNCUT_DRAGONSTONE_1631 = 1631 + const val UNCUT_DRAGONSTONE_1632 = 1632 + const val CRUSHED_GEM_1633 = 1633 + const val CRUSHED_GEM_1634 = 1634 + const val GOLD_RING_1635 = 1635 + const val GOLD_RING_1636 = 1636 + const val SAPPHIRE_RING_1637 = 1637 + const val SAPPHIRE_RING_1638 = 1638 + const val EMERALD_RING_1639 = 1639 + const val EMERALD_RING_1640 = 1640 + const val RUBY_RING_1641 = 1641 + const val RUBY_RING_1642 = 1642 + const val DIAMOND_RING_1643 = 1643 + const val DIAMOND_RING_1644 = 1644 + const val DRAGONSTONE_RING_1645 = 1645 + const val DRAGONSTONE_RING_1646 = 1646 + const val NULL_1647 = 1647 + const val NULL_1648 = 1648 + const val SAPPHIRE_RING_1649 = 1649 + const val EMERALD_RING_1650 = 1650 + const val RUBY_RING_1651 = 1651 + const val DIAMOND_RING_1652 = 1652 + const val DRAGONSTONE_RING_1653 = 1653 + const val GOLD_NECKLACE_1654 = 1654 + const val GOLD_NECKLACE_1655 = 1655 + const val SAPPHIRE_NECKLACE_1656 = 1656 + const val SAPPHIRE_NECKLACE_1657 = 1657 + const val EMERALD_NECKLACE_1658 = 1658 + const val EMERALD_NECKLACE_1659 = 1659 + const val RUBY_NECKLACE_1660 = 1660 + const val RUBY_NECKLACE_1661 = 1661 + const val DIAMOND_NECKLACE_1662 = 1662 + const val DIAMOND_NECKLACE_1663 = 1663 + const val DRAGON_NECKLACE_1664 = 1664 + const val DRAGON_NECKLACE_1665 = 1665 + const val NULL_1666 = 1666 + const val NULL_1667 = 1667 + const val SAPPHIRE_NECKLACE_1668 = 1668 + const val EMERALD_NECKLACE_1669 = 1669 + const val RUBY_NECKLACE_1670 = 1670 + const val DIAMOND_NECKLACE_1671 = 1671 + const val DRAGON_NECKLACE_1672 = 1672 + const val GOLD_AMULET_1673 = 1673 + const val GOLD_AMULET_1674 = 1674 + const val SAPPHIRE_AMULET_1675 = 1675 + const val SAPPHIRE_AMULET_1676 = 1676 + const val EMERALD_AMULET_1677 = 1677 + const val EMERALD_AMULET_1678 = 1678 + const val RUBY_AMULET_1679 = 1679 + const val RUBY_AMULET_1680 = 1680 + const val DIAMOND_AMULET_1681 = 1681 + const val DIAMOND_AMULET_1682 = 1682 + const val DRAGONSTONE_AMMY_1683 = 1683 + const val DRAGONSTONE_AMMY_1684 = 1684 + const val NULL_1685 = 1685 + const val NULL_1686 = 1686 + const val SAPPHIRE_AMULET_1687 = 1687 + const val EMERALD_AMULET_1688 = 1688 + const val RUBY_AMULET_1689 = 1689 + const val DIAMOND_AMULET_1690 = 1690 + const val DRAGONSTONE_AMMY_1691 = 1691 + const val GOLD_AMULET_1692 = 1692 + const val GOLD_AMULET_1693 = 1693 + const val SAPPHIRE_AMULET_1694 = 1694 + const val SAPPHIRE_AMULET_1695 = 1695 + const val EMERALD_AMULET_1696 = 1696 + const val EMERALD_AMULET_1697 = 1697 + const val RUBY_AMULET_1698 = 1698 + const val RUBY_AMULET_1699 = 1699 + const val DIAMOND_AMULET_1700 = 1700 + const val DIAMOND_AMULET_1701 = 1701 + const val DRAGONSTONE_AMMY_1702 = 1702 + const val DRAGONSTONE_AMMY_1703 = 1703 + const val AMULET_OF_GLORY_1704 = 1704 + const val AMULET_OF_GLORY_1705 = 1705 + const val AMULET_OF_GLORY1_1706 = 1706 + const val AMULET_OF_GLORY1_1707 = 1707 + const val AMULET_OF_GLORY2_1708 = 1708 + const val AMULET_OF_GLORY2_1709 = 1709 + const val AMULET_OF_GLORY3_1710 = 1710 + const val AMULET_OF_GLORY3_1711 = 1711 + const val AMULET_OF_GLORY4_1712 = 1712 + const val AMULET_OF_GLORY4_1713 = 1713 + const val UNSTRUNG_SYMBOL_1714 = 1714 + const val UNSTRUNG_SYMBOL_1715 = 1715 + const val UNBLESSED_SYMBOL_1716 = 1716 + const val UNBLESSED_SYMBOL_1717 = 1717 + const val HOLY_SYMBOL_1718 = 1718 + const val HOLY_SYMBOL_1719 = 1719 + const val UNSTRUNG_EMBLEM_1720 = 1720 + const val UNSTRUNG_EMBLEM_1721 = 1721 + const val UNPOWERED_SYMBOL_1722 = 1722 + const val UNPOWERED_SYMBOL_1723 = 1723 + const val UNHOLY_SYMBOL_1724 = 1724 + const val AMULET_OF_STRENGTH_1725 = 1725 + const val AMULET_OF_STRENGTH_1726 = 1726 + const val AMULET_OF_MAGIC_1727 = 1727 + const val AMULET_OF_MAGIC_1728 = 1728 + const val AMULET_OF_DEFENCE_1729 = 1729 + const val AMULET_OF_DEFENCE_1730 = 1730 + const val AMULET_OF_POWER_1731 = 1731 + const val AMULET_OF_POWER_1732 = 1732 + const val NEEDLE_1733 = 1733 + const val THREAD_1734 = 1734 + const val SHEARS_1735 = 1735 + const val SHEARS_1736 = 1736 + const val WOOL_1737 = 1737 + const val WOOL_1738 = 1738 + const val COWHIDE_1739 = 1739 + const val COWHIDE_1740 = 1740 + const val LEATHER_1741 = 1741 + const val LEATHER_1742 = 1742 + const val HARD_LEATHER_1743 = 1743 + const val HARD_LEATHER_1744 = 1744 + const val GREEN_D_LEATHER_1745 = 1745 + const val GREEN_D_LEATHER_1746 = 1746 + const val BLACK_DRAGONHIDE_1747 = 1747 + const val BLACK_DRAGONHIDE_1748 = 1748 + const val RED_DRAGONHIDE_1749 = 1749 + const val RED_DRAGONHIDE_1750 = 1750 + const val BLUE_DRAGONHIDE_1751 = 1751 + const val BLUE_DRAGONHIDE_1752 = 1752 + const val GREEN_DRAGONHIDE_1753 = 1753 + const val GREEN_DRAGONHIDE_1754 = 1754 + const val CHISEL_1755 = 1755 + const val CHISEL_1756 = 1756 + const val BROWN_APRON_1757 = 1757 + const val BROWN_APRON_1758 = 1758 + const val BALL_OF_WOOL_1759 = 1759 + const val BALL_OF_WOOL_1760 = 1760 + const val SOFT_CLAY_1761 = 1761 + const val SOFT_CLAY_1762 = 1762 + const val RED_DYE_1763 = 1763 + const val RED_DYE_1764 = 1764 + const val YELLOW_DYE_1765 = 1765 + const val YELLOW_DYE_1766 = 1766 + const val BLUE_DYE_1767 = 1767 + const val BLUE_DYE_1768 = 1768 + const val ORANGE_DYE_1769 = 1769 + const val ORANGE_DYE_1770 = 1770 + const val GREEN_DYE_1771 = 1771 + const val GREEN_DYE_1772 = 1772 + const val PURPLE_DYE_1773 = 1773 + const val PURPLE_DYE_1774 = 1774 + const val MOLTEN_GLASS_1775 = 1775 + const val MOLTEN_GLASS_1776 = 1776 + const val BOW_STRING_1777 = 1777 + const val BOW_STRING_1778 = 1778 + const val FLAX_1779 = 1779 + const val FLAX_1780 = 1780 + const val SODA_ASH_1781 = 1781 + const val SODA_ASH_1782 = 1782 + const val BUCKET_OF_SAND_1783 = 1783 + const val BUCKET_OF_SAND_1784 = 1784 + const val GLASSBLOWING_PIPE_1785 = 1785 + const val GLASSBLOWING_PIPE_1786 = 1786 + const val UNFIRED_POT_1787 = 1787 + const val UNFIRED_POT_1788 = 1788 + const val UNFIRED_PIE_DISH_1789 = 1789 + const val UNFIRED_PIE_DISH_1790 = 1790 + const val UNFIRED_BOWL_1791 = 1791 + const val UNFIRED_BOWL_1792 = 1792 + const val WOAD_LEAF_1793 = 1793 + const val BRONZE_WIRE_1794 = 1794 + const val BRONZE_WIRE_1795 = 1795 + const val SILVER_NECKLACE_1796 = 1796 + const val SILVER_NECKLACE_1797 = 1797 + const val SILVER_CUP_1798 = 1798 + const val SILVER_CUP_1799 = 1799 + const val SILVER_BOTTLE_1800 = 1800 + const val SILVER_BOTTLE_1801 = 1801 + const val SILVER_BOOK_1802 = 1802 + const val SILVER_BOOK_1803 = 1803 + const val SILVER_NEEDLE_1804 = 1804 + const val SILVER_NEEDLE_1805 = 1805 + const val SILVER_POT_1806 = 1806 + const val SILVER_POT_1807 = 1807 + const val CRIMINALS_THREAD_1808 = 1808 + const val CRIMINALS_THREAD_1809 = 1809 + const val CRIMINALS_THREAD_1810 = 1810 + const val FLYPAPER_1811 = 1811 + const val PUNGENT_POT_1812 = 1812 + const val CRIMINALS_DAGGER_1813 = 1813 + const val CRIMINALS_DAGGER_1814 = 1814 + const val KILLERS_PRINT_1815 = 1815 + const val ANNAS_PRINT_1816 = 1816 + const val BOBS_PRINT_1817 = 1817 + const val CAROLS_PRINT_1818 = 1818 + const val DAVIDS_PRINT_1819 = 1819 + const val ELIZABETHS_PRINT_1820 = 1820 + const val FRANKS_PRINT_1821 = 1821 + const val UNKNOWN_PRINT_1822 = 1822 + const val WATERSKIN4_1823 = 1823 + const val WATERSKIN4_1824 = 1824 + const val WATERSKIN3_1825 = 1825 + const val WATERSKIN3_1826 = 1826 + const val WATERSKIN2_1827 = 1827 + const val WATERSKIN2_1828 = 1828 + const val WATERSKIN1_1829 = 1829 + const val WATERSKIN1_1830 = 1830 + const val WATERSKIN0_1831 = 1831 + const val WATERSKIN0_1832 = 1832 + const val DESERT_SHIRT_1833 = 1833 + const val DESERT_SHIRT_1834 = 1834 + const val DESERT_ROBE_1835 = 1835 + const val DESERT_ROBE_1836 = 1836 + const val DESERT_BOOTS_1837 = 1837 + const val DESERT_BOOTS_1838 = 1838 + const val METAL_KEY_1839 = 1839 + const val CELL_DOOR_KEY_1840 = 1840 + const val BARREL_1841 = 1841 + const val ANA_IN_A_BARREL_1842 = 1842 + const val WROUGHT_IRON_KEY_1843 = 1843 + const val SLAVE_SHIRT_1844 = 1844 + const val SLAVE_ROBE_1845 = 1845 + const val SLAVE_BOOTS_1846 = 1846 + const val SCRUMPLED_PAPER_1847 = 1847 + const val SHANTAY_DISCLAIMER_1848 = 1848 + const val PROTOTYPE_DART_1849 = 1849 + const val TECHNICAL_PLANS_1850 = 1850 + const val TENTI_PINEAPPLE_1851 = 1851 + const val BEDABIN_KEY_1852 = 1852 + const val PROTOTYPE_DART_TIP_1853 = 1853 + const val SHANTAY_PASS_1854 = 1854 + const val ROCK_1855 = 1855 + const val GUIDE_BOOK_1856 = 1856 + const val TOTEM_1857 = 1857 + const val ADDRESS_LABEL_1858 = 1858 + const val RAW_UGTHANKI_MEAT_1859 = 1859 + const val RAW_UGTHANKI_MEAT_1860 = 1860 + const val UGTHANKI_MEAT_1861 = 1861 + const val UGTHANKI_MEAT_1862 = 1862 + const val PITTA_DOUGH_1863 = 1863 + const val PITTA_DOUGH_1864 = 1864 + const val PITTA_BREAD_1865 = 1865 + const val PITTA_BREAD_1866 = 1866 + const val BURNT_PITTA_BREAD_1867 = 1867 + const val BURNT_PITTA_BREAD_1868 = 1868 + const val CHOPPED_TOMATO_1869 = 1869 + const val CHOPPED_TOMATO_1870 = 1870 + const val CHOPPED_ONION_1871 = 1871 + const val CHOPPED_ONION_1872 = 1872 + const val CHOPPED_UGTHANKI_1873 = 1873 + const val CHOPPED_UGTHANKI_1874 = 1874 + const val ONION_AND_TOMATO_1875 = 1875 + const val ONION_AND_TOMATO_1876 = 1876 + const val UGTHANKI_AND_ONION_1877 = 1877 + const val UGTHANKI_AND_ONION_1878 = 1878 + const val UGTHANKI_AND_TOMATO_1879 = 1879 + const val UGTHANKI_AND_TOMATO_1880 = 1880 + const val KEBAB_MIX_1881 = 1881 + const val KEBAB_MIX_1882 = 1882 + const val UGTHANKI_KEBAB_1883 = 1883 + const val UGTHANKI_KEBAB_1884 = 1884 + const val UGTHANKI_KEBAB_1885 = 1885 + const val UGTHANKI_KEBAB_1886 = 1886 + const val CAKE_TIN_1887 = 1887 + const val CAKE_TIN_1888 = 1888 + const val UNCOOKED_CAKE_1889 = 1889 + const val UNCOOKED_CAKE_1890 = 1890 + const val CAKE_1891 = 1891 + const val CAKE_1892 = 1892 + const val TWO_THIRDS_CAKE_1893 = 1893 + const val TWO_THIRDS_CAKE_1894 = 1894 + const val SLICE_OF_CAKE_1895 = 1895 + const val SLICE_OF_CAKE_1896 = 1896 + const val CHOCOLATE_CAKE_1897 = 1897 + const val CHOCOLATE_CAKE_1898 = 1898 + const val TWO_THIRDS_CHOCOLATE_CAKE_1899 = 1899 + const val TWO_THIRDS_CHOCOLATE_CAKE_1900 = 1900 + const val CHOCOLATE_SLICE_1901 = 1901 + const val CHOCOLATE_SLICE_1902 = 1902 + const val BURNT_CAKE_1903 = 1903 + const val BURNT_CAKE_1904 = 1904 + const val ASGARNIAN_ALE_1905 = 1905 + const val ASGARNIAN_ALE_1906 = 1906 + const val WIZARDS_MIND_BOMB_1907 = 1907 + const val WIZARDS_MIND_BOMB_1908 = 1908 + const val GREENMANS_ALE_1909 = 1909 + const val GREENMANS_ALE_1910 = 1910 + const val DRAGON_BITTER_1911 = 1911 + const val DRAGON_BITTER_1912 = 1912 + const val DWARVEN_STOUT_1913 = 1913 + const val DWARVEN_STOUT_1914 = 1914 + const val GROG_1915 = 1915 + const val GROG_1916 = 1916 + const val BEER_1917 = 1917 + const val BEER_1918 = 1918 + const val BEER_GLASS_1919 = 1919 + const val BEER_GLASS_1920 = 1920 + const val BOWL_OF_WATER_1921 = 1921 + const val BOWL_OF_WATER_1922 = 1922 + const val BOWL_1923 = 1923 + const val BOWL_1924 = 1924 + const val BUCKET_1925 = 1925 + const val BUCKET_1926 = 1926 + const val BUCKET_OF_MILK_1927 = 1927 + const val BUCKET_OF_MILK_1928 = 1928 + const val BUCKET_OF_WATER_1929 = 1929 + const val BUCKET_OF_WATER_1930 = 1930 + const val EMPTY_POT_1931 = 1931 + const val EMPTY_POT_1932 = 1932 + const val POT_OF_FLOUR_1933 = 1933 + const val POT_OF_FLOUR_1934 = 1934 + const val JUG_1935 = 1935 + const val JUG_1936 = 1936 + const val JUG_OF_WATER_1937 = 1937 + const val JUG_OF_WATER_1938 = 1938 + const val SWAMP_TAR_1939 = 1939 + const val RAW_SWAMP_PASTE_1940 = 1940 + const val SWAMP_PASTE_1941 = 1941 + const val POTATO_1942 = 1942 + const val POTATO_1943 = 1943 + const val EGG_1944 = 1944 + const val EGG_1945 = 1945 + const val FLOUR_1946 = 1946 + const val GRAIN_1947 = 1947 + const val GRAIN_1948 = 1948 + const val CHEFS_HAT_1949 = 1949 + const val CHEFS_HAT_1950 = 1950 + const val REDBERRIES_1951 = 1951 + const val REDBERRIES_1952 = 1952 + const val PASTRY_DOUGH_1953 = 1953 + const val PASTRY_DOUGH_1954 = 1954 + const val COOKING_APPLE_1955 = 1955 + const val COOKING_APPLE_1956 = 1956 + const val ONION_1957 = 1957 + const val ONION_1958 = 1958 + const val PUMPKIN_1959 = 1959 + const val PUMPKIN_1960 = 1960 + const val EASTER_EGG_1961 = 1961 + const val EASTER_EGG_1962 = 1962 + const val BANANA_1963 = 1963 + const val BANANA_1964 = 1964 + const val CABBAGE_1965 = 1965 + const val CABBAGE_1966 = 1966 + const val CABBAGE_1967 = 1967 + const val CABBAGE_1968 = 1968 + const val SPINACH_ROLL_1969 = 1969 + const val TINDERBOX_1970 = 1970 + const val KEBAB_1971 = 1971 + const val KEBAB_1972 = 1972 + const val CHOCOLATE_BAR_1973 = 1973 + const val CHOCOLATE_BAR_1974 = 1974 + const val CHOCOLATE_DUST_1975 = 1975 + const val CHOCOLATE_DUST_1976 = 1976 + const val CHOCOLATEY_MILK_1977 = 1977 + const val CUP_OF_TEA_1978 = 1978 + const val CUP_OF_TEA_1979 = 1979 + const val EMPTY_CUP_1980 = 1980 + const val EMPTY_CUP_1981 = 1981 + const val TOMATO_1982 = 1982 + const val TOMATO_1983 = 1983 + const val ROTTEN_APPLE_1984 = 1984 + const val CHEESE_1985 = 1985 + const val CHEESE_1986 = 1986 + const val GRAPES_1987 = 1987 + const val GRAPES_1988 = 1988 + const val HALF_FULL_WINE_JUG_1989 = 1989 + const val HALF_FULL_WINE_JUG_1990 = 1990 + const val JUG_OF_BAD_WINE_1991 = 1991 + const val JUG_OF_BAD_WINE_1992 = 1992 + const val JUG_OF_WINE_1993 = 1993 + const val JUG_OF_WINE_1994 = 1994 + const val UNFERMENTED_WINE_1995 = 1995 + const val UNFERMENTED_WINE_1996 = 1996 + const val INCOMPLETE_STEW_1997 = 1997 + const val INCOMPLETE_STEW_1998 = 1998 + const val INCOMPLETE_STEW_1999 = 1999 + const val INCOMPLETE_STEW_2000 = 2000 + const val UNCOOKED_STEW_2001 = 2001 + const val UNCOOKED_STEW_2002 = 2002 + const val STEW_2003 = 2003 + const val STEW_2004 = 2004 + const val BURNT_STEW_2005 = 2005 + const val BURNT_STEW_2006 = 2006 + const val SPICE_2007 = 2007 + const val SPICE_2008 = 2008 + const val UNCOOKED_CURRY_2009 = 2009 + const val UNCOOKED_CURRY_2010 = 2010 + const val CURRY_2011 = 2011 + const val CURRY_2012 = 2012 + const val BURNT_CURRY_2013 = 2013 + const val BURNT_CURRY_2014 = 2014 + const val VODKA_2015 = 2015 + const val VODKA_2016 = 2016 + const val WHISKY_2017 = 2017 + const val WHISKY_2018 = 2018 + const val GIN_2019 = 2019 + const val GIN_2020 = 2020 + const val BRANDY_2021 = 2021 + const val BRANDY_2022 = 2022 + const val COCKTAIL_GUIDE_2023 = 2023 + const val COCKTAIL_GUIDE_2024 = 2024 + const val COCKTAIL_SHAKER_2025 = 2025 + const val COCKTAIL_GLASS_2026 = 2026 + const val COCKTAIL_GLASS_2027 = 2027 + const val PREMADE_BLURB_SP_2028 = 2028 + const val PREMADE_BLURB_SP_2029 = 2029 + const val PREMADE_CHOC_SDY_2030 = 2030 + const val PREMADE_CHOC_SDY_2031 = 2031 + const val PREMADE_DR_DRAGON_2032 = 2032 + const val PREMADE_DR_DRAGON_2033 = 2033 + const val PREMADE_FR_BLAST_2034 = 2034 + const val PREMADE_FR_BLAST_2035 = 2035 + const val PREMADE_P_PUNCH_2036 = 2036 + const val PREMADE_P_PUNCH_2037 = 2037 + const val PREMADE_SGG_2038 = 2038 + const val PREMADE_SGG_2039 = 2039 + const val PREMADE_WIZ_BLZD_2040 = 2040 + const val PREMADE_WIZ_BLZD_2041 = 2041 + const val PICTURE_2042 = 2042 + const val PICTURE_2043 = 2043 + const val PICTURE_2044 = 2044 + const val PICTURE_2045 = 2045 + const val PICTURE_2046 = 2046 + const val PICTURE_2047 = 2047 + const val PINEAPPLE_PUNCH_2048 = 2048 + const val PINEAPPLE_PUNCH_2049 = 2049 + const val PICTURE_2050 = 2050 + const val PICTURE_2051 = 2051 + const val PICTURE_2052 = 2052 + const val PICTURE_2053 = 2053 + const val WIZARD_BLIZZARD_2054 = 2054 + const val WIZARD_BLIZZARD_2055 = 2055 + const val PICTURE_2056 = 2056 + const val PICTURE_2057 = 2057 + const val PICTURE_2058 = 2058 + const val PICTURE_2059 = 2059 + const val PICTURE_2060 = 2060 + const val PICTURE_2061 = 2061 + const val PICTURE_2062 = 2062 + const val PICTURE_2063 = 2063 + const val BLURBERRY_SPECIAL_2064 = 2064 + const val BLURBERRY_SPECIAL_2065 = 2065 + const val PICTURE_2066 = 2066 + const val PICTURE_2067 = 2067 + const val PICTURE_2068 = 2068 + const val PICTURE_2069 = 2069 + const val PICTURE_2070 = 2070 + const val PICTURE_2071 = 2071 + const val PICTURE_2072 = 2072 + const val PICTURE_2073 = 2073 + const val CHOC_SATURDAY_2074 = 2074 + const val CHOC_SATURDAY_2075 = 2075 + const val PICTURE_2076 = 2076 + const val PICTURE_2077 = 2077 + const val PICTURE_2078 = 2078 + const val PICTURE_2079 = 2079 + const val SHORT_GREEN_GUY_2080 = 2080 + const val SHORT_GREEN_GUY_2081 = 2081 + const val PICTURE_2082 = 2082 + const val PICTURE_2083 = 2083 + const val FRUIT_BLAST_2084 = 2084 + const val FRUIT_BLAST_2085 = 2085 + const val PICTURE_2086 = 2086 + const val PICTURE_2087 = 2087 + const val PICTURE_2088 = 2088 + const val PICTURE_2089 = 2089 + const val PICTURE_2090 = 2090 + const val PICTURE_2091 = 2091 + const val DRUNK_DRAGON_2092 = 2092 + const val DRUNK_DRAGON_2093 = 2093 + const val PICTURE_2094 = 2094 + const val PICTURE_2095 = 2095 + const val PICTURE_2096 = 2096 + const val PICTURE_2097 = 2097 + const val PICTURE_2098 = 2098 + const val PICTURE_2099 = 2099 + const val PICTURE_2100 = 2100 + const val PICTURE_2101 = 2101 + const val LEMON_2102 = 2102 + const val LEMON_2103 = 2103 + const val LEMON_CHUNKS_2104 = 2104 + const val LEMON_CHUNKS_2105 = 2105 + const val LEMON_SLICES_2106 = 2106 + const val LEMON_SLICES_2107 = 2107 + const val ORANGE_2108 = 2108 + const val ORANGE_2109 = 2109 + const val ORANGE_CHUNKS_2110 = 2110 + const val ORANGE_CHUNKS_2111 = 2111 + const val ORANGE_SLICES_2112 = 2112 + const val ORANGE_SLICES_2113 = 2113 + const val PINEAPPLE_2114 = 2114 + const val PINEAPPLE_2115 = 2115 + const val PINEAPPLE_CHUNKS_2116 = 2116 + const val PINEAPPLE_CHUNKS_2117 = 2117 + const val PINEAPPLE_RING_2118 = 2118 + const val PINEAPPLE_RING_2119 = 2119 + const val LIME_2120 = 2120 + const val LIME_2121 = 2121 + const val LIME_CHUNKS_2122 = 2122 + const val LIME_CHUNKS_2123 = 2123 + const val LIME_SLICES_2124 = 2124 + const val LIME_SLICES_2125 = 2125 + const val DWELLBERRIES_2126 = 2126 + const val DWELLBERRIES_2127 = 2127 + const val EQUA_LEAVES_2128 = 2128 + const val EQUA_LEAVES_2129 = 2129 + const val POT_OF_CREAM_2130 = 2130 + const val POT_OF_CREAM_2131 = 2131 + const val RAW_BEEF_2132 = 2132 + const val RAW_BEEF_2133 = 2133 + const val RAW_RAT_MEAT_2134 = 2134 + const val RAW_RAT_MEAT_2135 = 2135 + const val RAW_BEAR_MEAT_2136 = 2136 + const val RAW_BEAR_MEAT_2137 = 2137 + const val RAW_CHICKEN_2138 = 2138 + const val RAW_CHICKEN_2139 = 2139 + const val COOKED_CHICKEN_2140 = 2140 + const val COOKED_CHICKEN_2141 = 2141 + const val COOKED_MEAT_2142 = 2142 + const val COOKED_MEAT_2143 = 2143 + const val BURNT_CHICKEN_2144 = 2144 + const val BURNT_CHICKEN_2145 = 2145 + const val BURNT_MEAT_2146 = 2146 + const val BURNT_MEAT_2147 = 2147 + const val RAW_LAVA_EEL_2148 = 2148 + const val LAVA_EEL_2149 = 2149 + const val SWAMP_TOAD_2150 = 2150 + const val SWAMP_TOAD_2151 = 2151 + const val TOADS_LEGS_2152 = 2152 + const val TOADS_LEGS_2153 = 2153 + const val PICTURE_2154 = 2154 + const val PICTURE_2155 = 2155 + const val SPICY_TOADS_LEGS_2156 = 2156 + const val SPICY_TOADS_LEGS_2157 = 2157 + const val SEASONED_LEGS_2158 = 2158 + const val SEASONED_LEGS_2159 = 2159 + const val SPICY_WORM_2160 = 2160 + const val SPICY_WORM_2161 = 2161 + const val KING_WORM_2162 = 2162 + const val KING_WORM_2163 = 2163 + const val BATTA_TIN_2164 = 2164 + const val CRUNCHY_TRAY_2165 = 2165 + const val GNOMEBOWL_MOULD_2166 = 2166 + const val GIANNES_COOK_BOOK_2167 = 2167 + const val GIANNES_COOK_BOOK_2168 = 2168 + const val GNOME_SPICE_2169 = 2169 + const val GNOME_SPICE_2170 = 2170 + const val GIANNE_DOUGH_2171 = 2171 + const val GIANNE_DOUGH_2172 = 2172 + const val PICTURE_2173 = 2173 + const val PICTURE_2174 = 2174 + const val BURNT_GNOMEBOWL_2175 = 2175 + const val BURNT_GNOMEBOWL_2176 = 2176 + const val HALF_BAKED_BOWL_2177 = 2177 + const val RAW_GNOMEBOWL_2178 = 2178 + const val PICTURE_2179 = 2179 + const val PICTURE_2180 = 2180 + const val PICTURE_2181 = 2181 + const val PICTURE_2182 = 2182 + const val PICTURE_2183 = 2183 + const val PICTURE_2184 = 2184 + const val CHOCOLATE_BOMB_2185 = 2185 + const val CHOCOLATE_BOMB_2186 = 2186 + const val TANGLED_TOADS_LEGS_2187 = 2187 + const val TANGLED_TOADS_LEGS_2188 = 2188 + const val PICTURE_2189 = 2189 + const val PICTURE_2190 = 2190 + const val WORM_HOLE_2191 = 2191 + const val WORM_HOLE_2192 = 2192 + const val PICTURE_2193 = 2193 + const val PICTURE_2194 = 2194 + const val VEG_BALL_2195 = 2195 + const val VEG_BALL_2196 = 2196 + const val ODD_CRUNCHIES_2197 = 2197 + const val ODD_CRUNCHIES_2198 = 2198 + const val BURNT_CRUNCHIES_2199 = 2199 + const val BURNT_CRUNCHIES_2200 = 2200 + const val HALF_BAKED_CRUNCHY_2201 = 2201 + const val RAW_CRUNCHIES_2202 = 2202 + const val PICTURE_2203 = 2203 + const val PICTURE_2204 = 2204 + const val WORM_CRUNCHIES_2205 = 2205 + const val WORM_CRUNCHIES_2206 = 2206 + const val PICTURE_2207 = 2207 + const val PICTURE_2208 = 2208 + const val CHOCCHIP_CRUNCHIES_2209 = 2209 + const val CHOCCHIP_CRUNCHIES_2210 = 2210 + const val PICTURE_2211 = 2211 + const val PICTURE_2212 = 2212 + const val SPICY_CRUNCHIES_2213 = 2213 + const val SPICY_CRUNCHIES_2214 = 2214 + const val PICTURE_2215 = 2215 + const val PICTURE_2216 = 2216 + const val TOAD_CRUNCHIES_2217 = 2217 + const val TOAD_CRUNCHIES_2218 = 2218 + const val PREMADE_WM_BATTA_2219 = 2219 + const val PREMADE_WM_BATTA_2220 = 2220 + const val PREMADE_TD_BATTA_2221 = 2221 + const val PREMADE_TD_BATTA_2222 = 2222 + const val PREMADE_C_PLUST_BATTA_2223 = 2223 + const val PREMADE_C_PLUST_BATTA_2224 = 2224 + const val PREMADE_FRT_BATTA_2225 = 2225 + const val PREMADE_FRT_BATTA_2226 = 2226 + const val PREMADE_VEG_BATTA_2227 = 2227 + const val PREMADE_VEG_BATTA_2228 = 2228 + const val PREMADE_CHOC_BOMB_2229 = 2229 + const val PREMADE_CHOC_BOMB_2230 = 2230 + const val PREMADE_TTL_2231 = 2231 + const val PREMADE_TTL_2232 = 2232 + const val PREMADE_WORM_HOLE_2233 = 2233 + const val PREMADE_WORM_HOLE_2234 = 2234 + const val PREMADE_VEG_BALL_2235 = 2235 + const val PREMADE_VEG_BALL_2236 = 2236 + const val PREMADE_WM_CRUN_2237 = 2237 + const val PREMADE_WM_CRUN_2238 = 2238 + const val PREMADE_CH_CRUNCH_2239 = 2239 + const val PREMADE_CH_CRUNCH_2240 = 2240 + const val PREMADE_SY_CRUNCH_2241 = 2241 + const val PREMADE_SY_CRUNCH_2242 = 2242 + const val PREMADE_TD_CRUNCH_2243 = 2243 + const val PREMADE_TD_CRUNCH_2244 = 2244 + const val PICTURE_2245 = 2245 + const val PICTURE_2246 = 2246 + const val BURNT_BATTA_2247 = 2247 + const val BURNT_BATTA_2248 = 2248 + const val HALF_BAKED_BATTA_2249 = 2249 + const val RAW_BATTA_2250 = 2250 + const val PICTURE_2251 = 2251 + const val PICTURE_2252 = 2252 + const val WORM_BATTA_2253 = 2253 + const val WORM_BATTA_2254 = 2254 + const val TOAD_BATTA_2255 = 2255 + const val TOAD_BATTA_2256 = 2256 + const val PICTURE_2257 = 2257 + const val PICTURE_2258 = 2258 + const val CHEESE_PLUSTOM_BATTA_2259 = 2259 + const val CHEESE_PLUSTOM_BATTA_2260 = 2260 + const val UNFINISHED_BATTA_2261 = 2261 + const val UNFINISHED_BATTA_2262 = 2262 + const val UNFINISHED_BATTA_2263 = 2263 + const val UNFINISHED_BATTA_2264 = 2264 + const val UNFINISHED_BATTA_2265 = 2265 + const val UNFINISHED_BATTA_2266 = 2266 + const val UNFINISHED_BATTA_2267 = 2267 + const val UNFINISHED_BATTA_2268 = 2268 + const val UNFINISHED_BATTA_2269 = 2269 + const val UNFINISHED_BATTA_2270 = 2270 + const val UNFINISHED_BATTA_2271 = 2271 + const val UNFINISHED_BATTA_2272 = 2272 + const val UNFINISHED_BATTA_2273 = 2273 + const val UNFINISHED_BATTA_2274 = 2274 + const val PICTURE_2275 = 2275 + const val PICTURE_2276 = 2276 + const val FRUIT_BATTA_2277 = 2277 + const val FRUIT_BATTA_2278 = 2278 + const val PICTURE_2279 = 2279 + const val PICTURE_2280 = 2280 + const val VEGETABLE_BATTA_2281 = 2281 + const val VEGETABLE_BATTA_2282 = 2282 + const val PIZZA_BASE_2283 = 2283 + const val PIZZA_BASE_2284 = 2284 + const val INCOMPLETE_PIZZA_2285 = 2285 + const val INCOMPLETE_PIZZA_2286 = 2286 + const val UNCOOKED_PIZZA_2287 = 2287 + const val UNCOOKED_PIZZA_2288 = 2288 + const val PLAIN_PIZZA_2289 = 2289 + const val PLAIN_PIZZA_2290 = 2290 + const val HALF_PLAIN_PIZZA_2291 = 2291 + const val HALF_PLAIN_PIZZA_2292 = 2292 + const val MEAT_PIZZA_2293 = 2293 + const val MEAT_PIZZA_2294 = 2294 + const val HALF_MEAT_PIZZA_2295 = 2295 + const val HALF_MEAT_PIZZA_2296 = 2296 + const val ANCHOVY_PIZZA_2297 = 2297 + const val ANCHOVY_PIZZA_2298 = 2298 + const val HALF_ANCHOVY_PIZZA_2299 = 2299 + const val HALF_ANCHOVY_PIZZA_2300 = 2300 + const val PINEAPPLE_PIZZA_2301 = 2301 + const val PINEAPPLE_PIZZA_2302 = 2302 + const val HALF_PAPPLE_PIZZA_2303 = 2303 + const val HALF_PAPPLE_PIZZA_2304 = 2304 + const val BURNT_PIZZA_2305 = 2305 + const val BURNT_PIZZA_2306 = 2306 + const val BREAD_DOUGH_2307 = 2307 + const val BREAD_DOUGH_2308 = 2308 + const val BREAD_2309 = 2309 + const val BREAD_2310 = 2310 + const val BURNT_BREAD_2311 = 2311 + const val BURNT_BREAD_2312 = 2312 + const val PIE_DISH_2313 = 2313 + const val PIE_DISH_2314 = 2314 + const val PIE_SHELL_2315 = 2315 + const val PIE_SHELL_2316 = 2316 + const val UNCOOKED_APPLE_PIE_2317 = 2317 + const val UNCOOKED_APPLE_PIE_2318 = 2318 + const val UNCOOKED_MEAT_PIE_2319 = 2319 + const val UNCOOKED_MEAT_PIE_2320 = 2320 + const val UNCOOKED_BERRY_PIE_2321 = 2321 + const val UNCOOKED_BERRY_PIE_2322 = 2322 + const val APPLE_PIE_2323 = 2323 + const val APPLE_PIE_2324 = 2324 + const val REDBERRY_PIE_2325 = 2325 + const val REDBERRY_PIE_2326 = 2326 + const val MEAT_PIE_2327 = 2327 + const val MEAT_PIE_2328 = 2328 + const val BURNT_PIE_2329 = 2329 + const val BURNT_PIE_2330 = 2330 + const val HALF_A_MEAT_PIE_2331 = 2331 + const val HALF_A_MEAT_PIE_2332 = 2332 + const val HALF_A_REDBERRY_PIE_2333 = 2333 + const val HALF_A_REDBERRY_PIE_2334 = 2334 + const val HALF_AN_APPLE_PIE_2335 = 2335 + const val HALF_AN_APPLE_PIE_2336 = 2336 + const val RAW_OOMLIE_2337 = 2337 + const val RAW_OOMLIE_2338 = 2338 + const val PALM_LEAF_2339 = 2339 + const val PALM_LEAF_2340 = 2340 + const val WRAPPED_OOMLIE_2341 = 2341 + const val WRAPPED_OOMLIE_2342 = 2342 + const val COOKED_OOMLIE_WRAP_2343 = 2343 + const val COOKED_OOMLIE_WRAP_2344 = 2344 + const val BURNT_OOMLIE_WRAP_2345 = 2345 + const val BURNT_OOMLIE_WRAP_2346 = 2346 + const val HAMMER_2347 = 2347 + const val HAMMER_2348 = 2348 + const val BRONZE_BAR_2349 = 2349 + const val BRONZE_BAR_2350 = 2350 + const val IRON_BAR_2351 = 2351 + const val IRON_BAR_2352 = 2352 + const val STEEL_BAR_2353 = 2353 + const val STEEL_BAR_2354 = 2354 + const val SILVER_BAR_2355 = 2355 + const val SILVER_BAR_2356 = 2356 + const val GOLD_BAR_2357 = 2357 + const val GOLD_BAR_2358 = 2358 + const val MITHRIL_BAR_2359 = 2359 + const val MITHRIL_BAR_2360 = 2360 + const val ADAMANTITE_BAR_2361 = 2361 + const val ADAMANTITE_BAR_2362 = 2362 + const val RUNITE_BAR_2363 = 2363 + const val RUNITE_BAR_2364 = 2364 + const val PERFECT_GOLD_BAR_2365 = 2365 + const val SHIELD_LEFT_HALF_2366 = 2366 + const val SHIELD_LEFT_HALF_2367 = 2367 + const val SHIELD_RIGHT_HALF_2368 = 2368 + const val SHIELD_RIGHT_HALF_2369 = 2369 + const val STEEL_STUDS_2370 = 2370 + const val STEEL_STUDS_2371 = 2371 + const val OGRE_RELIC_2372 = 2372 + const val RELIC_PART_1_2373 = 2373 + const val RELIC_PART_2_2374 = 2374 + const val RELIC_PART_3_2375 = 2375 + const val SKAVID_MAP_2376 = 2376 + const val OGRE_TOOTH_2377 = 2377 + const val TOBANS_KEY_2378 = 2378 + const val ROCK_CAKE_2379 = 2379 + const val CRYSTAL_2380 = 2380 + const val CRYSTAL_2381 = 2381 + const val CRYSTAL_2382 = 2382 + const val CRYSTAL_2383 = 2383 + const val FINGERNAILS_2384 = 2384 + const val OLD_ROBE_2385 = 2385 + const val UNUSUAL_ARMOUR_2386 = 2386 + const val DAMAGED_DAGGER_2387 = 2387 + const val TATTERED_EYE_PATCH_2388 = 2388 + const val VIAL_2389 = 2389 + const val VIAL_2390 = 2390 + const val GROUND_BAT_BONES_2391 = 2391 + const val GROUND_BAT_BONES_2392 = 2392 + const val TOBANS_GOLD_2393 = 2393 + const val POTION_2394 = 2394 + const val MAGIC_OGRE_POTION_2395 = 2395 + const val SPELL_SCROLL_2396 = 2396 + const val SHAMAN_ROBE_2397 = 2397 + const val CAVE_NIGHTSHADE_2398 = 2398 + const val SILVERLIGHT_KEY_2399 = 2399 + const val SILVERLIGHT_KEY_2400 = 2400 + const val SILVERLIGHT_KEY_2401 = 2401 + const val SILVERLIGHT_2402 = 2402 + const val HAZEEL_SCROLL_2403 = 2403 + const val CHEST_KEY_2404 = 2404 + const val CARNILLEAN_ARMOUR_2405 = 2405 + const val HAZEELS_MARK_2406 = 2406 + const val BALL_2407 = 2407 + const val DIARY_2408 = 2408 + const val DOOR_KEY_2409 = 2409 + const val MAGNET_2410 = 2410 + const val KEY_2411 = 2411 + const val SARADOMIN_CAPE_2412 = 2412 + const val GUTHIX_CAPE_2413 = 2413 + const val ZAMORAK_CAPE_2414 = 2414 + const val SARADOMIN_STAFF_2415 = 2415 + const val GUTHIX_STAFF_2416 = 2416 + const val ZAMORAK_STAFF_2417 = 2417 + const val BRONZE_KEY_2418 = 2418 + const val WIG_2419 = 2419 + const val PICTURE_2420 = 2420 + const val WIG_2421 = 2421 + const val BLUE_PARTYHAT_2422 = 2422 + const val KEY_PRINT_2423 = 2423 + const val PASTE_2424 = 2424 + const val PICTURE_2425 = 2425 + const val BURNT_OOMLIE_2426 = 2426 + const val BURNT_OOMLIE_2427 = 2427 + const val ATTACK_POTION4_2428 = 2428 + const val ATTACK_POTION4_2429 = 2429 + const val RESTORE_POTION4_2430 = 2430 + const val RESTORE_POTION4_2431 = 2431 + const val DEFENCE_POTION4_2432 = 2432 + const val DEFENCE_POTION4_2433 = 2433 + const val PRAYER_POTION4_2434 = 2434 + const val PRAYER_POTION4_2435 = 2435 + const val SUPER_ATTACK4_2436 = 2436 + const val SUPER_ATTACK4_2437 = 2437 + const val FISHING_POTION4_2438 = 2438 + const val FISHING_POTION4_2439 = 2439 + const val SUPER_STRENGTH4_2440 = 2440 + const val SUPER_STRENGTH4_2441 = 2441 + const val SUPER_DEFENCE4_2442 = 2442 + const val SUPER_DEFENCE4_2443 = 2443 + const val RANGING_POTION4_2444 = 2444 + const val RANGING_POTION4_2445 = 2445 + const val ANTIPOISON4_2446 = 2446 + const val ANTIPOISON4_2447 = 2447 + const val SUPER_ANTIPOISON4_2448 = 2448 + const val SUPER_ANTIPOISON4_2449 = 2449 + const val ZAMORAK_BREW4_2450 = 2450 + const val ZAMORAK_BREW4_2451 = 2451 + const val ANTIFIRE_POTION4_2452 = 2452 + const val ANTIFIRE_POTION4_2453 = 2453 + const val ANTIFIRE_POTION3_2454 = 2454 + const val ANTIFIRE_POTION3_2455 = 2455 + const val ANTIFIRE_POTION2_2456 = 2456 + const val ANTIFIRE_POTION2_2457 = 2457 + const val ANTIFIRE_POTION1_2458 = 2458 + const val ANTIFIRE_POTION1_2459 = 2459 + const val FLOWERS_2460 = 2460 + const val FLOWERS_2461 = 2461 + const val FLOWERS_2462 = 2462 + const val FLOWERS_2463 = 2463 + const val FLOWERS_2464 = 2464 + const val FLOWERS_2465 = 2465 + const val FLOWERS_2466 = 2466 + const val FLOWERS_2467 = 2467 + const val FLOWERS_2468 = 2468 + const val FLOWERS_2469 = 2469 + const val FLOWERS_2470 = 2470 + const val FLOWERS_2471 = 2471 + const val FLOWERS_2472 = 2472 + const val FLOWERS_2473 = 2473 + const val FLOWERS_2474 = 2474 + const val FLOWERS_2475 = 2475 + const val FLOWERS_2476 = 2476 + const val FLOWERS_2477 = 2477 + const val TINDERBOX_2478 = 2478 + const val TINDERBOX_2479 = 2479 + const val PICTURE_2480 = 2480 + const val CLEAN_LANTADYME_2481 = 2481 + const val CLEAN_LANTADYME_2482 = 2482 + const val LANTADYME_POTIONUNF_2483 = 2483 + const val LANTADYME_POTIONUNF_2484 = 2484 + const val GRIMY_LANTADYME_2485 = 2485 + const val GRIMY_LANTADYME_2486 = 2486 + const val BLUE_DHIDE_VAMB_2487 = 2487 + const val BLUE_DHIDE_VAMB_2488 = 2488 + const val RED_DHIDE_VAMB_2489 = 2489 + const val RED_DHIDE_VAMB_2490 = 2490 + const val BLACK_DHIDE_VAMB_2491 = 2491 + const val BLACK_DHIDE_VAMB_2492 = 2492 + const val BLUE_DHIDE_CHAPS_2493 = 2493 + const val BLUE_DHIDE_CHAPS_2494 = 2494 + const val RED_DHIDE_CHAPS_2495 = 2495 + const val RED_DHIDE_CHAPS_2496 = 2496 + const val BLACK_DHIDE_CHAPS_2497 = 2497 + const val BLACK_DHIDE_CHAPS_2498 = 2498 + const val BLUE_DHIDE_BODY_2499 = 2499 + const val BLUE_DHIDE_BODY_2500 = 2500 + const val RED_DHIDE_BODY_2501 = 2501 + const val RED_DHIDE_BODY_2502 = 2502 + const val BLACK_DHIDE_BODY_2503 = 2503 + const val BLACK_DHIDE_BODY_2504 = 2504 + const val BLUE_D_LEATHER_2505 = 2505 + const val BLUE_D_LEATHER_2506 = 2506 + const val RED_DRAGON_LEATHER_2507 = 2507 + const val RED_DRAGON_LEATHER_2508 = 2508 + const val BLACK_D_LEATHER_2509 = 2509 + const val BLACK_D_LEATHER_2510 = 2510 + const val LOGS_2511 = 2511 + const val PICTURE_2512 = 2512 + const val DRAGON_CHAINBODY_2513 = 2513 + const val RAW_SHRIMPS_2514 = 2514 + const val RAW_SHRIMPS_2515 = 2515 + const val POT_OF_FLOUR_2516 = 2516 + const val POT_OF_FLOUR_2517 = 2517 + const val ROTTEN_TOMATO_2518 = 2518 + const val ROTTEN_TOMATO_2519 = 2519 + const val TOY_HORSEY_2520 = 2520 + const val TOY_HORSEY_2521 = 2521 + const val TOY_HORSEY_2522 = 2522 + const val TOY_HORSEY_2523 = 2523 + const val TOY_HORSEY_2524 = 2524 + const val TOY_HORSEY_2525 = 2525 + const val TOY_HORSEY_2526 = 2526 + const val TOY_HORSEY_2527 = 2527 + const val LAMP_2528 = 2528 + const val ORB_OF_LIGHT_2529 = 2529 + const val BONES_2530 = 2530 + const val BONES_2531 = 2531 + const val IRON_FIRE_ARROWS_2532 = 2532 + const val IRON_FIRE_ARROWS_2533 = 2533 + const val STEEL_FIRE_ARROWS_2534 = 2534 + const val STEEL_FIRE_ARROWS_2535 = 2535 + const val MITHRIL_FIRE_ARROWS_2536 = 2536 + const val MITHRIL_FIRE_ARROWS_2537 = 2537 + const val ADAMANT_FIRE_ARROWS_2538 = 2538 + const val ADAMANT_FIRE_ARROWS_2539 = 2539 + const val RUNE_FIRE_ARROWS_2540 = 2540 + const val RUNE_FIRE_ARROWS_2541 = 2541 + const val NULL_2542 = 2542 + const val NULL_2543 = 2543 + const val NULL_2544 = 2544 + const val NULL_2545 = 2545 + const val NULL_2546 = 2546 + const val NULL_2547 = 2547 + const val NULL_2548 = 2548 + const val NULL_2549 = 2549 + const val RING_OF_RECOIL_2550 = 2550 + const val RING_OF_RECOIL_2551 = 2551 + const val RING_OF_DUELLING8_2552 = 2552 + const val RING_OF_DUELLING8_2553 = 2553 + const val RING_OF_DUELLING7_2554 = 2554 + const val RING_OF_DUELLING7_2555 = 2555 + const val RING_OF_DUELLING6_2556 = 2556 + const val RING_OF_DUELLING6_2557 = 2557 + const val RING_OF_DUELLING5_2558 = 2558 + const val RING_OF_DUELLING5_2559 = 2559 + const val RING_OF_DUELLING4_2560 = 2560 + const val RING_OF_DUELLING4_2561 = 2561 + const val RING_OF_DUELLING3_2562 = 2562 + const val RING_OF_DUELLING3_2563 = 2563 + const val RING_OF_DUELLING2_2564 = 2564 + const val RING_OF_DUELLING2_2565 = 2565 + const val RING_OF_DUELLING1_2566 = 2566 + const val RING_OF_DUELLING1_2567 = 2567 + const val RING_OF_FORGING_2568 = 2568 + const val RING_OF_FORGING_2569 = 2569 + const val RING_OF_LIFE_2570 = 2570 + const val RING_OF_LIFE_2571 = 2571 + const val RING_OF_WEALTH_2572 = 2572 + const val RING_OF_WEALTH_2573 = 2573 + const val SEXTANT_2574 = 2574 + const val WATCH_2575 = 2575 + const val CHART_2576 = 2576 + const val RANGER_BOOTS_2577 = 2577 + const val RANGER_BOOTS_2578 = 2578 + const val WIZARD_BOOTS_2579 = 2579 + const val WIZARD_BOOTS_2580 = 2580 + const val ROBIN_HOOD_HAT_2581 = 2581 + const val ROBIN_HOOD_HAT_2582 = 2582 + const val BLACK_PLATEBODY_T_2583 = 2583 + const val BLACK_PLATEBODY_T_2584 = 2584 + const val BLACK_PLATELEGS_T_2585 = 2585 + const val BLACK_PLATELEGS_T_2586 = 2586 + const val BLACK_FULL_HELMT_2587 = 2587 + const val BLACK_FULL_HELMT_2588 = 2588 + const val BLACK_KITESHIELD_T_2589 = 2589 + const val BLACK_KITESHIELD_T_2590 = 2590 + const val BLACK_PLATEBODY_G_2591 = 2591 + const val BLACK_PLATEBODY_G_2592 = 2592 + const val BLACK_PLATELEGS_G_2593 = 2593 + const val BLACK_PLATELEGS_G_2594 = 2594 + const val BLACK_FULL_HELMG_2595 = 2595 + const val BLACK_FULL_HELMG_2596 = 2596 + const val BLACK_KITESHIELD_G_2597 = 2597 + const val BLACK_KITESHIELD_G_2598 = 2598 + const val ADAM_PLATEBODY_T_2599 = 2599 + const val ADAM_PLATEBODY_T_2600 = 2600 + const val ADAM_PLATELEGS_T_2601 = 2601 + const val ADAM_PLATELEGS_T_2602 = 2602 + const val ADAM_KITESHIELD_T_2603 = 2603 + const val ADAM_KITESHIELD_T_2604 = 2604 + const val ADAM_FULL_HELMT_2605 = 2605 + const val ADAM_FULL_HELMT_2606 = 2606 + const val ADAM_PLATEBODY_G_2607 = 2607 + const val ADAM_PLATEBODY_G_2608 = 2608 + const val ADAM_PLATELEGS_G_2609 = 2609 + const val ADAM_PLATELEGS_G_2610 = 2610 + const val ADAM_KITESHIELD_G_2611 = 2611 + const val ADAM_KITESHIELD_G_2612 = 2612 + const val ADAM_FULL_HELMG_2613 = 2613 + const val ADAM_FULL_HELMG_2614 = 2614 + const val RUNE_PLATEBODY_G_2615 = 2615 + const val RUNE_PLATEBODY_G_2616 = 2616 + const val RUNE_PLATELEGS_G_2617 = 2617 + const val RUNE_PLATELEGS_G_2618 = 2618 + const val RUNE_FULL_HELMG_2619 = 2619 + const val RUNE_FULL_HELMG_2620 = 2620 + const val RUNE_KITESHIELD_G_2621 = 2621 + const val RUNE_KITESHIELD_G_2622 = 2622 + const val RUNE_PLATEBODY_T_2623 = 2623 + const val RUNE_PLATEBODY_T_2624 = 2624 + const val RUNE_PLATELEGS_T_2625 = 2625 + const val RUNE_PLATELEGS_T_2626 = 2626 + const val RUNE_FULL_HELM_T_2627 = 2627 + const val RUNE_FULL_HELM_T_2628 = 2628 + const val RUNE_KITESHIELD_T_2629 = 2629 + const val RUNE_KITESHIELD_T_2630 = 2630 + const val HIGHWAYMAN_MASK_2631 = 2631 + const val HIGHWAYMAN_MASK_2632 = 2632 + const val BLUE_BERET_2633 = 2633 + const val BLUE_BERET_2634 = 2634 + const val BLACK_BERET_2635 = 2635 + const val BLACK_BERET_2636 = 2636 + const val WHITE_BERET_2637 = 2637 + const val WHITE_BERET_2638 = 2638 + const val TAN_CAVALIER_2639 = 2639 + const val TAN_CAVALIER_2640 = 2640 + const val DARK_CAVALIER_2641 = 2641 + const val DARK_CAVALIER_2642 = 2642 + const val BLACK_CAVALIER_2643 = 2643 + const val BLACK_CAVALIER_2644 = 2644 + const val RED_HEADBAND_2645 = 2645 + const val RED_HEADBAND_2646 = 2646 + const val BLACK_HEADBAND_2647 = 2647 + const val BLACK_HEADBAND_2648 = 2648 + const val BROWN_HEADBAND_2649 = 2649 + const val BROWN_HEADBAND_2650 = 2650 + const val PIRATES_HAT_2651 = 2651 + const val PIRATES_HAT_2652 = 2652 + const val ZAMORAK_PLATEBODY_2653 = 2653 + const val ZAMORAK_PLATEBODY_2654 = 2654 + const val ZAMORAK_PLATELEGS_2655 = 2655 + const val ZAMORAK_PLATELEGS_2656 = 2656 + const val ZAMORAK_FULL_HELM_2657 = 2657 + const val ZAMORAK_FULL_HELM_2658 = 2658 + const val ZAMORAK_KITESHIELD_2659 = 2659 + const val ZAMORAK_KITESHIELD_2660 = 2660 + const val SARADOMIN_PLATEBODY_2661 = 2661 + const val SARADOMIN_PLATEBODY_2662 = 2662 + const val SARADOMIN_PLATELEGS_2663 = 2663 + const val SARADOMIN_PLATELEGS_2664 = 2664 + const val SARADOMIN_FULL_HELM_2665 = 2665 + const val SARADOMIN_FULL_HELM_2666 = 2666 + const val SARADOMIN_KITESHIELD_2667 = 2667 + const val SARADOMIN_KITESHIELD_2668 = 2668 + const val GUTHIX_PLATEBODY_2669 = 2669 + const val GUTHIX_PLATEBODY_2670 = 2670 + const val GUTHIX_PLATELEGS_2671 = 2671 + const val GUTHIX_PLATELEGS_2672 = 2672 + const val GUTHIX_FULL_HELM_2673 = 2673 + const val GUTHIX_FULL_HELM_2674 = 2674 + const val GUTHIX_KITESHIELD_2675 = 2675 + const val GUTHIX_KITESHIELD_2676 = 2676 + const val CLUE_SCROLL_2677 = 2677 + const val CLUE_SCROLL_2678 = 2678 + const val CLUE_SCROLL_2679 = 2679 + const val CLUE_SCROLL_2680 = 2680 + const val CLUE_SCROLL_2681 = 2681 + const val CLUE_SCROLL_2682 = 2682 + const val CLUE_SCROLL_2683 = 2683 + const val CLUE_SCROLL_2684 = 2684 + const val CLUE_SCROLL_2685 = 2685 + const val CLUE_SCROLL_2686 = 2686 + const val CLUE_SCROLL_2687 = 2687 + const val CLUE_SCROLL_2688 = 2688 + const val CLUE_SCROLL_2689 = 2689 + const val CLUE_SCROLL_2690 = 2690 + const val CLUE_SCROLL_2691 = 2691 + const val CLUE_SCROLL_2692 = 2692 + const val CLUE_SCROLL_2693 = 2693 + const val CLUE_SCROLL_2694 = 2694 + const val CLUE_SCROLL_2695 = 2695 + const val CLUE_SCROLL_2696 = 2696 + const val CLUE_SCROLL_2697 = 2697 + const val CLUE_SCROLL_2698 = 2698 + const val CLUE_SCROLL_2699 = 2699 + const val CLUE_SCROLL_2700 = 2700 + const val CLUE_SCROLL_2701 = 2701 + const val CLUE_SCROLL_2702 = 2702 + const val CLUE_SCROLL_2703 = 2703 + const val CLUE_SCROLL_2704 = 2704 + const val CLUE_SCROLL_2705 = 2705 + const val CLUE_SCROLL_2706 = 2706 + const val CLUE_SCROLL_2707 = 2707 + const val CLUE_SCROLL_2708 = 2708 + const val CLUE_SCROLL_2709 = 2709 + const val CLUE_SCROLL_2710 = 2710 + const val CLUE_SCROLL_2711 = 2711 + const val CLUE_SCROLL_2712 = 2712 + const val CLUE_SCROLL_2713 = 2713 + const val CASKET_2714 = 2714 + const val CASKET_2715 = 2715 + const val CLUE_SCROLL_2716 = 2716 + const val CASKET_2717 = 2717 + const val CASKET_2718 = 2718 + const val CLUE_SCROLL_2719 = 2719 + const val CASKET_2720 = 2720 + const val CASKET_2721 = 2721 + const val CLUE_SCROLL_2722 = 2722 + const val CLUE_SCROLL_2723 = 2723 + const val CASKET_2724 = 2724 + const val CLUE_SCROLL_2725 = 2725 + const val CASKET_2726 = 2726 + const val CLUE_SCROLL_2727 = 2727 + const val CASKET_2728 = 2728 + const val CLUE_SCROLL_2729 = 2729 + const val CASKET_2730 = 2730 + const val CLUE_SCROLL_2731 = 2731 + const val CASKET_2732 = 2732 + const val CLUE_SCROLL_2733 = 2733 + const val CASKET_2734 = 2734 + const val CLUE_SCROLL_2735 = 2735 + const val CASKET_2736 = 2736 + const val CLUE_SCROLL_2737 = 2737 + const val CASKET_2738 = 2738 + const val CLUE_SCROLL_2739 = 2739 + const val CASKET_2740 = 2740 + const val CLUE_SCROLL_2741 = 2741 + const val CASKET_2742 = 2742 + const val CLUE_SCROLL_2743 = 2743 + const val CASKET_2744 = 2744 + const val CLUE_SCROLL_2745 = 2745 + const val CASKET_2746 = 2746 + const val CLUE_SCROLL_2747 = 2747 + const val CASKET_2748 = 2748 + const val SLIDING_PIECE_2749 = 2749 + const val SLIDING_PIECE_2750 = 2750 + const val SLIDING_PIECE_2751 = 2751 + const val SLIDING_PIECE_2752 = 2752 + const val SLIDING_PIECE_2753 = 2753 + const val SLIDING_PIECE_2754 = 2754 + const val SLIDING_PIECE_2755 = 2755 + const val SLIDING_PIECE_2756 = 2756 + const val SLIDING_PIECE_2757 = 2757 + const val SLIDING_PIECE_2758 = 2758 + const val SLIDING_PIECE_2759 = 2759 + const val SLIDING_PIECE_2760 = 2760 + const val SLIDING_PIECE_2761 = 2761 + const val SLIDING_PIECE_2762 = 2762 + const val SLIDING_PIECE_2763 = 2763 + const val SLIDING_PIECE_2764 = 2764 + const val SLIDING_PIECE_2765 = 2765 + const val SLIDING_PIECE_2766 = 2766 + const val SLIDING_PIECE_2767 = 2767 + const val SLIDING_PIECE_2768 = 2768 + const val SLIDING_PIECE_2769 = 2769 + const val SLIDING_PIECE_2770 = 2770 + const val SLIDING_PIECE_2771 = 2771 + const val SLIDING_PIECE_2772 = 2772 + const val CLUE_SCROLL_2773 = 2773 + const val CLUE_SCROLL_2774 = 2774 + const val CASKET_2775 = 2775 + const val CLUE_SCROLL_2776 = 2776 + const val CASKET_2777 = 2777 + const val CLUE_SCROLL_2778 = 2778 + const val CASKET_2779 = 2779 + const val CLUE_SCROLL_2780 = 2780 + const val CASKET_2781 = 2781 + const val CLUE_SCROLL_2782 = 2782 + const val CLUE_SCROLL_2783 = 2783 + const val CASKET_2784 = 2784 + const val CLUE_SCROLL_2785 = 2785 + const val CLUE_SCROLL_2786 = 2786 + const val CASKET_2787 = 2787 + const val CLUE_SCROLL_2788 = 2788 + const val CASKET_2789 = 2789 + const val CLUE_SCROLL_2790 = 2790 + const val CASKET_2791 = 2791 + const val CLUE_SCROLL_2792 = 2792 + const val CLUE_SCROLL_2793 = 2793 + const val CLUE_SCROLL_2794 = 2794 + const val PUZZLE_BOX_2795 = 2795 + const val CLUE_SCROLL_2796 = 2796 + const val CLUE_SCROLL_2797 = 2797 + const val PUZZLE_BOX_2798 = 2798 + const val CLUE_SCROLL_2799 = 2799 + const val PUZZLE_BOX_2800 = 2800 + const val CLUE_SCROLL_2801 = 2801 + const val CASKET_2802 = 2802 + const val CLUE_SCROLL_2803 = 2803 + const val CASKET_2804 = 2804 + const val CLUE_SCROLL_2805 = 2805 + const val CASKET_2806 = 2806 + const val CLUE_SCROLL_2807 = 2807 + const val CASKET_2808 = 2808 + const val CLUE_SCROLL_2809 = 2809 + const val CASKET_2810 = 2810 + const val CLUE_SCROLL_2811 = 2811 + const val CASKET_2812 = 2812 + const val CLUE_SCROLL_2813 = 2813 + const val CASKET_2814 = 2814 + const val CLUE_SCROLL_2815 = 2815 + const val CASKET_2816 = 2816 + const val CLUE_SCROLL_2817 = 2817 + const val CASKET_2818 = 2818 + const val CLUE_SCROLL_2819 = 2819 + const val CASKET_2820 = 2820 + const val CLUE_SCROLL_2821 = 2821 + const val CASKET_2822 = 2822 + const val CLUE_SCROLL_2823 = 2823 + const val CASKET_2824 = 2824 + const val CLUE_SCROLL_2825 = 2825 + const val CASKET_2826 = 2826 + const val CLUE_SCROLL_2827 = 2827 + const val CASKET_2828 = 2828 + const val CLUE_SCROLL_2829 = 2829 + const val CASKET_2830 = 2830 + const val CLUE_SCROLL_2831 = 2831 + const val KEY_2832 = 2832 + const val CLUE_SCROLL_2833 = 2833 + const val KEY_2834 = 2834 + const val CLUE_SCROLL_2835 = 2835 + const val KEY_2836 = 2836 + const val CLUE_SCROLL_2837 = 2837 + const val KEY_2838 = 2838 + const val CLUE_SCROLL_2839 = 2839 + const val KEY_2840 = 2840 + const val CLUE_SCROLL_2841 = 2841 + const val CHALLENGE_SCROLL_2842 = 2842 + const val CLUE_SCROLL_2843 = 2843 + const val CHALLENGE_SCROLL_2844 = 2844 + const val CLUE_SCROLL_2845 = 2845 + const val CHALLENGE_SCROLL_2846 = 2846 + const val CLUE_SCROLL_2847 = 2847 + const val CLUE_SCROLL_2848 = 2848 + const val CLUE_SCROLL_2849 = 2849 + const val CHALLENGE_SCROLL_2850 = 2850 + const val CLUE_SCROLL_2851 = 2851 + const val CHALLENGE_SCROLL_2852 = 2852 + const val CLUE_SCROLL_2853 = 2853 + const val CHALLENGE_SCROLL_2854 = 2854 + const val CLUE_SCROLL_2855 = 2855 + const val CLUE_SCROLL_2856 = 2856 + const val CLUE_SCROLL_2857 = 2857 + const val CLUE_SCROLL_2858 = 2858 + const val WOLF_BONES_2859 = 2859 + const val WOLF_BONES_2860 = 2860 + const val WOLFBONE_ARROWTIPS_2861 = 2861 + const val ACHEY_TREE_LOGS_2862 = 2862 + const val ACHEY_TREE_LOGS_2863 = 2863 + const val OGRE_ARROW_SHAFT_2864 = 2864 + const val FLIGHTED_OGRE_ARROW_2865 = 2865 + const val OGRE_ARROW_2866 = 2866 + const val NULL_2867 = 2867 + const val NULL_2868 = 2868 + const val NULL_2869 = 2869 + const val NULL_2870 = 2870 + const val OGRE_BELLOWS_2871 = 2871 + const val OGRE_BELLOWS_3_2872 = 2872 + const val OGRE_BELLOWS_2_2873 = 2873 + const val OGRE_BELLOWS_1_2874 = 2874 + const val BLOATED_TOAD_2875 = 2875 + const val RAW_CHOMPY_2876 = 2876 + const val RAW_CHOMPY_2877 = 2877 + const val COOKED_CHOMPY_2878 = 2878 + const val COOKED_CHOMPY_2879 = 2879 + const val RUINED_CHOMPY_2880 = 2880 + const val RUINED_CHOMPY_2881 = 2881 + const val SEASONED_CHOMPY_2882 = 2882 + const val OGRE_BOW_2883 = 2883 + const val NULL_2884 = 2884 + const val NULL_2885 = 2885 + const val BATTERED_BOOK_2886 = 2886 + const val BATTERED_KEY_2887 = 2887 + const val A_STONE_BOWL_2888 = 2888 + const val A_STONE_BOWL_2889 = 2889 + const val ELEMENTAL_SHIELD_2890 = 2890 + const val ELEMENTAL_SHIELD_2891 = 2891 + const val ELEMENTAL_ORE_2892 = 2892 + const val ELEMENTAL_METAL_2893 = 2893 + const val BOOTS_2894 = 2894 + const val BOOTS_2895 = 2895 + const val ROBE_TOP_2896 = 2896 + const val ROBE_TOP_2897 = 2897 + const val ROBE_BOTTOMS_2898 = 2898 + const val ROBE_BOTTOMS_2899 = 2899 + const val HAT_2900 = 2900 + const val HAT_2901 = 2901 + const val GLOVES_2902 = 2902 + const val GLOVES_2903 = 2903 + const val BOOTS_2904 = 2904 + const val BOOTS_2905 = 2905 + const val ROBE_TOP_2906 = 2906 + const val ROBE_TOP_2907 = 2907 + const val ROBE_BOTTOMS_2908 = 2908 + const val ROBE_BOTTOMS_2909 = 2909 + const val HAT_2910 = 2910 + const val HAT_2911 = 2911 + const val GLOVES_2912 = 2912 + const val GLOVES_2913 = 2913 + const val BOOTS_2914 = 2914 + const val BOOTS_2915 = 2915 + const val ROBE_TOP_2916 = 2916 + const val ROBE_TOP_2917 = 2917 + const val ROBE_BOTTOMS_2918 = 2918 + const val ROBE_BOTTOMS_2919 = 2919 + const val HAT_2920 = 2920 + const val HAT_2921 = 2921 + const val GLOVES_2922 = 2922 + const val GLOVES_2923 = 2923 + const val BOOTS_2924 = 2924 + const val BOOTS_2925 = 2925 + const val ROBE_TOP_2926 = 2926 + const val ROBE_TOP_2927 = 2927 + const val ROBE_BOTTOMS_2928 = 2928 + const val ROBE_BOTTOMS_2929 = 2929 + const val HAT_2930 = 2930 + const val HAT_2931 = 2931 + const val GLOVES_2932 = 2932 + const val GLOVES_2933 = 2933 + const val BOOTS_2934 = 2934 + const val BOOTS_2935 = 2935 + const val ROBE_TOP_2936 = 2936 + const val ROBE_TOP_2937 = 2937 + const val ROBE_BOTTOMS_2938 = 2938 + const val ROBE_BOTTOMS_2939 = 2939 + const val HAT_2940 = 2940 + const val HAT_2941 = 2941 + const val GLOVES_2942 = 2942 + const val GLOVES_2943 = 2943 + const val GOLDEN_KEY_2944 = 2944 + const val IRON_KEY_2945 = 2945 + const val GOLDEN_TINDERBOX_2946 = 2946 + const val GOLDEN_CANDLE_2947 = 2947 + const val GOLDEN_POT_2948 = 2948 + const val GOLDEN_HAMMER_2949 = 2949 + const val GOLDEN_FEATHER_2950 = 2950 + const val GOLDEN_NEEDLE_2951 = 2951 + const val WOLFBANE_2952 = 2952 + const val BUCKET_OF_WATER_2953 = 2953 + const val BUCKET_OF_WATER_2954 = 2954 + const val MOONLIGHT_MEAD_2955 = 2955 + const val MOONLIGHT_MEAD_2956 = 2956 + const val DRUID_POUCH_2957 = 2957 + const val DRUID_POUCH_2958 = 2958 + const val ROTTEN_FOOD_2959 = 2959 + const val ROTTEN_FOOD_2960 = 2960 + const val SILVER_SICKLE_2961 = 2961 + const val SILVER_SICKLE_2962 = 2962 + const val SILVER_SICKLEB_2963 = 2963 + const val WASHING_BOWL_2964 = 2964 + const val PICTURE_2965 = 2965 + const val MIRROR_2966 = 2966 + const val JOURNAL_2967 = 2967 + const val DRUIDIC_SPELL_2968 = 2968 + const val A_USED_SPELL_2969 = 2969 + const val MORT_MYRE_FUNGUS_2970 = 2970 + const val MORT_MYRE_FUNGUS_2971 = 2971 + const val MORT_MYRE_STEM_2972 = 2972 + const val MORT_MYRE_STEM_2973 = 2973 + const val MORT_MYRE_PEAR_2974 = 2974 + const val MORT_MYRE_PEAR_2975 = 2975 + const val SICKLE_MOULD_2976 = 2976 + const val SICKLE_MOULD_2977 = 2977 + const val CHOMPY_BIRD_HAT_2978 = 2978 + const val CHOMPY_BIRD_HAT_2979 = 2979 + const val CHOMPY_BIRD_HAT_2980 = 2980 + const val CHOMPY_BIRD_HAT_2981 = 2981 + const val CHOMPY_BIRD_HAT_2982 = 2982 + const val CHOMPY_BIRD_HAT_2983 = 2983 + const val CHOMPY_BIRD_HAT_2984 = 2984 + const val CHOMPY_BIRD_HAT_2985 = 2985 + const val CHOMPY_BIRD_HAT_2986 = 2986 + const val CHOMPY_BIRD_HAT_2987 = 2987 + const val CHOMPY_BIRD_HAT_2988 = 2988 + const val CHOMPY_BIRD_HAT_2989 = 2989 + const val CHOMPY_BIRD_HAT_2990 = 2990 + const val CHOMPY_BIRD_HAT_2991 = 2991 + const val CHOMPY_BIRD_HAT_2992 = 2992 + const val CHOMPY_BIRD_HAT_2993 = 2993 + const val CHOMPY_BIRD_HAT_2994 = 2994 + const val CHOMPY_BIRD_HAT_2995 = 2995 + const val AGILITY_ARENA_TICKET_2996 = 2996 + const val PIRATES_HOOK_2997 = 2997 + const val CLEAN_TOADFLAX_2998 = 2998 + const val CLEAN_TOADFLAX_2999 = 2999 + const val CLEAN_SNAPDRAGON_3000 = 3000 + const val CLEAN_SNAPDRAGON_3001 = 3001 + const val TOADFLAX_POTIONUNF_3002 = 3002 + const val TOADFLAX_POTIONUNF_3003 = 3003 + const val SNAPDRAGON_POTIONUNF_3004 = 3004 + const val SNAPDRAGON_POTIONUNF_3005 = 3005 + const val FIREWORK_3006 = 3006 + const val FIREWORK_3007 = 3007 + const val ENERGY_POTION4_3008 = 3008 + const val ENERGY_POTION4_3009 = 3009 + const val ENERGY_POTION3_3010 = 3010 + const val ENERGY_POTION3_3011 = 3011 + const val ENERGY_POTION2_3012 = 3012 + const val ENERGY_POTION2_3013 = 3013 + const val ENERGY_POTION1_3014 = 3014 + const val ENERGY_POTION1_3015 = 3015 + const val SUPER_ENERGY4_3016 = 3016 + const val SUPER_ENERGY4_3017 = 3017 + const val SUPER_ENERGY3_3018 = 3018 + const val SUPER_ENERGY3_3019 = 3019 + const val SUPER_ENERGY2_3020 = 3020 + const val SUPER_ENERGY2_3021 = 3021 + const val SUPER_ENERGY1_3022 = 3022 + const val SUPER_ENERGY1_3023 = 3023 + const val SUPER_RESTORE4_3024 = 3024 + const val SUPER_RESTORE4_3025 = 3025 + const val SUPER_RESTORE3_3026 = 3026 + const val SUPER_RESTORE3_3027 = 3027 + const val SUPER_RESTORE2_3028 = 3028 + const val SUPER_RESTORE2_3029 = 3029 + const val SUPER_RESTORE1_3030 = 3030 + const val SUPER_RESTORE1_3031 = 3031 + const val AGILITY_POTION4_3032 = 3032 + const val AGILITY_POTION4_3033 = 3033 + const val AGILITY_POTION3_3034 = 3034 + const val AGILITY_POTION3_3035 = 3035 + const val AGILITY_POTION2_3036 = 3036 + const val AGILITY_POTION2_3037 = 3037 + const val AGILITY_POTION1_3038 = 3038 + const val AGILITY_POTION1_3039 = 3039 + const val MAGIC_POTION4_3040 = 3040 + const val MAGIC_POTION4_3041 = 3041 + const val MAGIC_POTION3_3042 = 3042 + const val MAGIC_POTION3_3043 = 3043 + const val MAGIC_POTION2_3044 = 3044 + const val MAGIC_POTION2_3045 = 3045 + const val MAGIC_POTION1_3046 = 3046 + const val MAGIC_POTION1_3047 = 3047 + const val PIRATES_HOOK_3048 = 3048 + const val GRIMY_TOADFLAX_3049 = 3049 + const val GRIMY_TOADFLAX_3050 = 3050 + const val GRIMY_SNAPDRAGON_3051 = 3051 + const val GRIMY_SNAPDRAGON_3052 = 3052 + const val LAVA_BATTLESTAFF_3053 = 3053 + const val MYSTIC_LAVA_STAFF_3054 = 3054 + const val LAVA_BATTLESTAFF_3055 = 3055 + const val MYSTIC_LAVA_STAFF_3056 = 3056 + const val MIME_MASK_3057 = 3057 + const val MIME_TOP_3058 = 3058 + const val MIME_LEGS_3059 = 3059 + const val MIME_GLOVES_3060 = 3060 + const val MIME_BOOTS_3061 = 3061 + const val STRANGE_BOX_3062 = 3062 + const val NULL_3063 = 3063 + const val NULL_3064 = 3064 + const val NULL_3065 = 3065 + const val NULL_3066 = 3066 + const val NULL_3067 = 3067 + const val NULL_3068 = 3068 + const val NULL_3069 = 3069 + const val NULL_3070 = 3070 + const val NULL_3071 = 3071 + const val NULL_3072 = 3072 + const val NULL_3073 = 3073 + const val NULL_3074 = 3074 + const val NULL_3075 = 3075 + const val NULL_3076 = 3076 + const val NULL_3077 = 3077 + const val NULL_3078 = 3078 + const val NULL_3079 = 3079 + const val NULL_3080 = 3080 + const val NULL_3081 = 3081 + const val NULL_3082 = 3082 + const val NULL_3083 = 3083 + const val NULL_3084 = 3084 + const val NULL_3085 = 3085 + const val NULL_3086 = 3086 + const val NULL_3087 = 3087 + const val NULL_3088 = 3088 + const val NULL_3089 = 3089 + const val NULL_3090 = 3090 + const val NULL_3091 = 3091 + const val NULL_3092 = 3092 + const val BLACK_DART_3093 = 3093 + const val BLACK_DARTP_3094 = 3094 + const val BRONZE_CLAWS_3095 = 3095 + const val IRON_CLAWS_3096 = 3096 + const val STEEL_CLAWS_3097 = 3097 + const val BLACK_CLAWS_3098 = 3098 + const val MITHRIL_CLAWS_3099 = 3099 + const val ADAMANT_CLAWS_3100 = 3100 + const val RUNE_CLAWS_3101 = 3101 + const val COMBINATION_3102 = 3102 + const val IOU_3103 = 3103 + const val SECRET_WAY_MAP_3104 = 3104 + const val CLIMBING_BOOTS_3105 = 3105 + const val CLIMBING_BOOTS_3106 = 3106 + const val SPIKED_BOOTS_3107 = 3107 + const val PICTURE_3108 = 3108 + const val STONE_BALL_3109 = 3109 + const val STONE_BALL_3110 = 3110 + const val STONE_BALL_3111 = 3111 + const val STONE_BALL_3112 = 3112 + const val STONE_BALL_3113 = 3113 + const val CERTIFICATE_3114 = 3114 + const val BRONZE_CLAWS_3115 = 3115 + const val IRON_CLAWS_3116 = 3116 + const val STEEL_CLAWS_3117 = 3117 + const val BLACK_CLAWS_3118 = 3118 + const val MITHRIL_CLAWS_3119 = 3119 + const val ADAMANT_CLAWS_3120 = 3120 + const val RUNE_CLAWS_3121 = 3121 + const val GRANITE_SHIELD_3122 = 3122 + const val SHAIKAHAN_BONES_3123 = 3123 + const val SHAIKAHAN_BONES_3124 = 3124 + const val JOGRE_BONES_3125 = 3125 + const val JOGRE_BONES_3126 = 3126 + const val BURNT_JOGRE_BONES_3127 = 3127 + const val PASTY_JOGRE_BONES_3128 = 3128 + const val PASTY_JOGRE_BONES_3129 = 3129 + const val MARINATED_J_BONES_3130 = 3130 + const val PASTY_JOGRE_BONES_3131 = 3131 + const val PASTY_JOGRE_BONES_3132 = 3132 + const val MARINATED_J_BONES_3133 = 3133 + const val GRANITE_SHIELD_3134 = 3134 + const val PRISON_KEY_3135 = 3135 + const val CELL_KEY_1_3136 = 3136 + const val CELL_KEY_2_3137 = 3137 + const val POTATO_CACTUS_3138 = 3138 + const val POTATO_CACTUS_3139 = 3139 + const val DRAGON_CHAINBODY_3140 = 3140 + const val DRAGON_CHAINBODY_3141 = 3141 + const val RAW_KARAMBWAN_3142 = 3142 + const val RAW_KARAMBWAN_3143 = 3143 + const val COOKED_KARAMBWAN_3144 = 3144 + const val COOKED_KARAMBWAN_3145 = 3145 + const val POISON_KARAMBWAN_3146 = 3146 + const val COOKED_KARAMBWAN_3147 = 3147 + const val BURNT_KARAMBWAN_3148 = 3148 + const val BURNT_KARAMBWAN_3149 = 3149 + const val RAW_KARAMBWANJI_3150 = 3150 + const val KARAMBWANJI_3151 = 3151 + const val KARAMBWAN_PASTE_3152 = 3152 + const val KARAMBWAN_PASTE_3153 = 3153 + const val KARAMBWAN_PASTE_3154 = 3154 + const val KARAMBWANJI_PASTE_3155 = 3155 + const val KARAMBWANJI_PASTE_3156 = 3156 + const val KARAMBWAN_VESSEL_3157 = 3157 + const val KARAMBWAN_VESSEL_3158 = 3158 + const val KARAMBWAN_VESSEL_3159 = 3159 + const val KARAMBWAN_VESSEL_3160 = 3160 + const val CRAFTING_MANUAL_3161 = 3161 + const val SLICED_BANANA_3162 = 3162 + const val SLICED_BANANA_3163 = 3163 + const val KARAMJAN_RUM_3164 = 3164 + const val KARAMJAN_RUM_3165 = 3165 + const val MONKEY_CORPSE_3166 = 3166 + const val MONKEY_SKIN_3167 = 3167 + const val SEAWEED_SANDWICH_3168 = 3168 + const val STUFFED_MONKEY_3169 = 3169 + const val BRONZE_SPEARKP_3170 = 3170 + const val IRON_SPEARKP_3171 = 3171 + const val STEEL_SPEARKP_3172 = 3172 + const val MITHRIL_SPEARKP_3173 = 3173 + const val ADAMANT_SPEARKP_3174 = 3174 + const val RUNE_SPEARKP_3175 = 3175 + const val DRAGON_SPEARKP_3176 = 3176 + const val PICTURE_3177 = 3177 + const val PICTURE_3178 = 3178 + const val MONKEY_BONES_3179 = 3179 + const val MONKEY_BONES_3180 = 3180 + const val MONKEY_BONES_3181 = 3181 + const val MONKEY_BONES_3182 = 3182 + const val MONKEY_BONES_3183 = 3183 + const val MONKEY_BONES_3184 = 3184 + const val MONKEY_BONES_3185 = 3185 + const val MONKEY_BONES_3186 = 3186 + const val BONES_3187 = 3187 + const val CLEANING_CLOTH_3188 = 3188 + const val CLEANING_CLOTH_3189 = 3189 + const val BRONZE_HALBERD_3190 = 3190 + const val BRONZE_HALBERD_3191 = 3191 + const val IRON_HALBERD_3192 = 3192 + const val IRON_HALBERD_3193 = 3193 + const val STEEL_HALBERD_3194 = 3194 + const val STEEL_HALBERD_3195 = 3195 + const val BLACK_HALBERD_3196 = 3196 + const val BLACK_HALBERD_3197 = 3197 + const val MITHRIL_HALBERD_3198 = 3198 + const val MITHRIL_HALBERD_3199 = 3199 + const val ADAMANT_HALBERD_3200 = 3200 + const val ADAMANT_HALBERD_3201 = 3201 + const val RUNE_HALBERD_3202 = 3202 + const val RUNE_HALBERD_3203 = 3203 + const val DRAGON_HALBERD_3204 = 3204 + const val DRAGON_HALBERD_3205 = 3205 + const val KINGS_MESSAGE_3206 = 3206 + const val IORWERTHS_MESSAGE_3207 = 3207 + const val CRYSTAL_PENDANT_3208 = 3208 + const val SULPHUR_3209 = 3209 + const val TINDERBOX_3210 = 3210 + const val LIMESTONE_3211 = 3211 + const val LIMESTONE_3212 = 3212 + const val QUICKLIME_3213 = 3213 + const val POT_OF_QUICKLIME_3214 = 3214 + const val GROUND_SULPHUR_3215 = 3215 + const val BARREL_3216 = 3216 + const val BARREL_3217 = 3217 + const val BARREL_BOMB_3218 = 3218 + const val BARREL_BOMB_3219 = 3219 + const val BARREL_OF_COAL_TAR_3220 = 3220 + const val BARREL_OF_NAPHTHA_3221 = 3221 + const val NAPHTHA_MIX_3222 = 3222 + const val NAPHTHA_MIX_3223 = 3223 + const val STRIP_OF_CLOTH_3224 = 3224 + const val TINDERBOX_3225 = 3225 + const val RAW_RABBIT_3226 = 3226 + const val RAW_RABBIT_3227 = 3227 + const val COOKED_RABBIT_3228 = 3228 + const val COOKED_RABBIT_3229 = 3229 + const val BIG_BOOK_OF_BANGS_3230 = 3230 + const val PICTURE_3231 = 3231 + const val PICTURE_3232 = 3232 + const val PICTURE_3233 = 3233 + const val PICTURE_3234 = 3234 + const val PICTURE_3235 = 3235 + const val PICTURE_3236 = 3236 + const val PICTURE_3237 = 3237 + const val PICTURE_3238 = 3238 + const val BARK_3239 = 3239 + const val BARK_3240 = 3240 + const val MAN_3241 = 3241 + const val NULL_3242 = 3242 + const val FARMER_3243 = 3243 + const val NULL_3244 = 3244 + const val WARRIOR_WOMAN_3245 = 3245 + const val NULL_3246 = 3246 + const val ROGUE_3247 = 3247 + const val NULL_3248 = 3248 + const val GUARD_3249 = 3249 + const val NULL_3250 = 3250 + const val KNIGHT_OF_ARDOUGNE_3251 = 3251 + const val NULL_3252 = 3252 + const val WATCHMAN_3253 = 3253 + const val NULL_3254 = 3254 + const val PALADIN_3255 = 3255 + const val NULL_3256 = 3256 + const val GNOME_3257 = 3257 + const val NULL_3258 = 3258 + const val HERO_3259 = 3259 + const val NULL_3260 = 3260 + const val GOUTWEED_3261 = 3261 + const val TROLL_THISTLE_3262 = 3262 + const val DRIED_THISTLE_3263 = 3263 + const val GROUND_THISTLE_3264 = 3264 + const val TROLL_POTION_3265 = 3265 + const val DRUNK_PARROT_3266 = 3266 + const val DIRTY_ROBE_3267 = 3267 + const val FAKE_MAN_3268 = 3268 + const val STOREROOM_KEY_3269 = 3269 + const val ALCO_CHUNKS_3270 = 3270 + const val NULL_3271 = 3271 + const val NULL_3272 = 3272 + const val NULL_3273 = 3273 + const val NULL_3274 = 3274 + const val NULL_3275 = 3275 + const val NULL_3276 = 3276 + const val NULL_3277 = 3277 + const val NULL_3278 = 3278 + const val NULL_3279 = 3279 + const val NULL_3280 = 3280 + const val NULL_3281 = 3281 + const val NULL_3282 = 3282 + const val NULL_3283 = 3283 + const val NULL_3284 = 3284 + const val NULL_3285 = 3285 + const val NULL_3286 = 3286 + const val NULL_3287 = 3287 + const val NULL_3288 = 3288 + const val NULL_3289 = 3289 + const val NULL_3290 = 3290 + const val NULL_3291 = 3291 + const val NULL_3292 = 3292 + const val NULL_3293 = 3293 + const val NULL_3294 = 3294 + const val NULL_3295 = 3295 + const val NULL_3296 = 3296 + const val NULL_3297 = 3297 + const val NULL_3298 = 3298 + const val NULL_3299 = 3299 + const val NULL_3300 = 3300 + const val NULL_3301 = 3301 + const val NULL_3302 = 3302 + const val NULL_3303 = 3303 + const val NULL_3304 = 3304 + const val NULL_3305 = 3305 + const val NULL_3306 = 3306 + const val NULL_3307 = 3307 + const val NULL_3308 = 3308 + const val NULL_3309 = 3309 + const val NULL_3310 = 3310 + const val NULL_3311 = 3311 + const val NULL_3312 = 3312 + const val NULL_3313 = 3313 + const val NULL_3314 = 3314 + const val NULL_3315 = 3315 + const val NULL_3316 = 3316 + const val NULL_3317 = 3317 + const val NULL_3318 = 3318 + const val NULL_3319 = 3319 + const val NULL_3320 = 3320 + const val NULL_3321 = 3321 + const val NULL_3322 = 3322 + const val NULL_3323 = 3323 + const val NULL_3324 = 3324 + const val VAMPIRE_DUST_3325 = 3325 + const val VAMPIRE_DUST_3326 = 3326 + const val MYRE_SNELM_3327 = 3327 + const val MYRE_SNELM_3328 = 3328 + const val BLOODNTAR_SNELM_3329 = 3329 + const val BLOODNTAR_SNELM_3330 = 3330 + const val OCHRE_SNELM_3331 = 3331 + const val OCHRE_SNELM_3332 = 3332 + const val BRUISE_BLUE_SNELM_3333 = 3333 + const val BRUISE_BLUE_SNELM_3334 = 3334 + const val BROKEN_BARK_SNELM_3335 = 3335 + const val BROKEN_BARK_SNELM_3336 = 3336 + const val MYRE_SNELM_3337 = 3337 + const val MYRE_SNELM_3338 = 3338 + const val BLOODNTAR_SNELM_3339 = 3339 + const val BLOODNTAR_SNELM_3340 = 3340 + const val OCHRE_SNELM_3341 = 3341 + const val OCHRE_SNELM_3342 = 3342 + const val BRUISE_BLUE_SNELM_3343 = 3343 + const val BRUISE_BLUE_SNELM_3344 = 3344 + const val BLAMISH_MYRE_SHELL_3345 = 3345 + const val BLAMISH_MYRE_SHELL_3346 = 3346 + const val BLAMISH_RED_SHELL_3347 = 3347 + const val BLAMISH_RED_SHELL_3348 = 3348 + const val BLAMISH_OCHRE_SHELL_3349 = 3349 + const val BLAMISH_OCHRE_SHELL_3350 = 3350 + const val BLAMISH_BLUE_SHELL_3351 = 3351 + const val BLAMISH_BLUE_SHELL_3352 = 3352 + const val BLAMISH_BARK_SHELL_3353 = 3353 + const val BLAMISH_BARK_SHELL_3354 = 3354 + const val BLAMISH_MYRE_SHELL_3355 = 3355 + const val BLAMISH_MYRE_SHELL_3356 = 3356 + const val BLAMISH_RED_SHELL_3357 = 3357 + const val BLAMISH_RED_SHELL_3358 = 3358 + const val BLAMISH_OCHRE_SHELL_3359 = 3359 + const val BLAMISH_OCHRE_SHELL_3360 = 3360 + const val BLAMISH_BLUE_SHELL_3361 = 3361 + const val BLAMISH_BLUE_SHELL_3362 = 3362 + const val THIN_SNAIL_3363 = 3363 + const val THIN_SNAIL_3364 = 3364 + const val LEAN_SNAIL_3365 = 3365 + const val LEAN_SNAIL_3366 = 3366 + const val FAT_SNAIL_3367 = 3367 + const val FAT_SNAIL_3368 = 3368 + const val THIN_SNAIL_MEAT_3369 = 3369 + const val THIN_SNAIL_MEAT_3370 = 3370 + const val LEAN_SNAIL_MEAT_3371 = 3371 + const val LEAN_SNAIL_MEAT_3372 = 3372 + const val FAT_SNAIL_MEAT_3373 = 3373 + const val FAT_SNAIL_MEAT_3374 = 3374 + const val BURNT_SNAIL_3375 = 3375 + const val BURNT_SNAIL_3376 = 3376 + const val SAMPLE_BOTTLE_3377 = 3377 + const val SAMPLE_BOTTLE_3378 = 3378 + const val SLIMY_EEL_3379 = 3379 + const val SLIMY_EEL_3380 = 3380 + const val COOKED_SLIMY_EEL_3381 = 3381 + const val COOKED_SLIMY_EEL_3382 = 3382 + const val BURNT_EEL_3383 = 3383 + const val TINDERBOX_3384 = 3384 + const val SPLITBARK_HELM_3385 = 3385 + const val SPLITBARK_HELM_3386 = 3386 + const val SPLITBARK_BODY_3387 = 3387 + const val SPLITBARK_BODY_3388 = 3388 + const val SPLITBARK_LEGS_3389 = 3389 + const val SPLITBARK_LEGS_3390 = 3390 + const val SPLITBARK_GAUNTLETS_3391 = 3391 + const val SPLITBARK_GAUNTLETS_3392 = 3392 + const val SPLITBARK_BOOTS_3393 = 3393 + const val SPLITBARK_BOOTS_3394 = 3394 + const val DIARY_3395 = 3395 + const val LOAR_REMAINS_3396 = 3396 + const val LOAR_REMAINS_3397 = 3397 + const val PHRIN_REMAINS_3398 = 3398 + const val PHRIN_REMAINS_3399 = 3399 + const val RIYL_REMAINS_3400 = 3400 + const val RIYL_REMAINS_3401 = 3401 + const val ASYN_REMAINS_3402 = 3402 + const val ASYN_REMAINS_3403 = 3403 + const val FIYR_REMAINS_3404 = 3404 + const val FIYR_REMAINS_3405 = 3405 + const val ASH_POTIONUNF_3406 = 3406 + const val ASH_POTIONUNF_3407 = 3407 + const val SERUM_207_4_3408 = 3408 + const val TINDERBOX_3409 = 3409 + const val SERUM_207_3_3410 = 3410 + const val TINDERBOX_3411 = 3411 + const val SERUM_207_2_3412 = 3412 + const val TINDERBOX_3413 = 3413 + const val SERUM_207_1_3414 = 3414 + const val TINDERBOX_3415 = 3415 + const val SERUM_208_4_3416 = 3416 + const val SERUM_208_3_3417 = 3417 + const val SERUM_208_2_3418 = 3418 + const val SERUM_208_1_3419 = 3419 + const val LIMESTONE_BRICK_3420 = 3420 + const val LIMESTONE_BRICK_3421 = 3421 + const val OLIVE_OIL4_3422 = 3422 + const val OLIVE_OIL4_3423 = 3423 + const val OLIVE_OIL3_3424 = 3424 + const val OLIVE_OIL3_3425 = 3425 + const val OLIVE_OIL2_3426 = 3426 + const val OLIVE_OIL2_3427 = 3427 + const val OLIVE_OIL1_3428 = 3428 + const val OLIVE_OIL1_3429 = 3429 + const val SACRED_OIL4_3430 = 3430 + const val SACRED_OIL4_3431 = 3431 + const val SACRED_OIL3_3432 = 3432 + const val SACRED_OIL3_3433 = 3433 + const val SACRED_OIL2_3434 = 3434 + const val SACRED_OIL2_3435 = 3435 + const val SACRED_OIL1_3436 = 3436 + const val SACRED_OIL1_3437 = 3437 + const val PYRE_LOGS_3438 = 3438 + const val PYRE_LOGS_3439 = 3439 + const val OAK_PYRE_LOGS_3440 = 3440 + const val OAK_PYRE_LOGS_3441 = 3441 + const val WILLOW_PYRE_LOGS_3442 = 3442 + const val WILLOW_PYRE_LOGS_3443 = 3443 + const val MAPLE_PYRE_LOGS_3444 = 3444 + const val MAPLE_PYRE_LOGS_3445 = 3445 + const val YEW_PYRE_LOGS_3446 = 3446 + const val YEW_PYRE_LOGS_3447 = 3447 + const val MAGIC_PYRE_LOGS_3448 = 3448 + const val MAGIC_PYRE_LOGS_3449 = 3449 + const val BRONZE_KEY_RED_3450 = 3450 + const val BRONZE_KEY_BROWN_3451 = 3451 + const val BRONZE_KEY_CRIMSON_3452 = 3452 + const val BRONZE_KEY_BLACK_3453 = 3453 + const val BRONZE_KEY_PURPLE_3454 = 3454 + const val STEEL_KEY_RED_3455 = 3455 + const val STEEL_KEY_BROWN_3456 = 3456 + const val STEEL_KEY_CRIMSON_3457 = 3457 + const val STEEL_KEY_BLACK_3458 = 3458 + const val STEEL_KEY_PURPLE_3459 = 3459 + const val BLACK_KEY_RED_3460 = 3460 + const val BLACK_KEY_BROWN_3461 = 3461 + const val BLACK_KEY_CRIMSON_3462 = 3462 + const val BLACK_KEY_BLACK_3463 = 3463 + const val BLACK_KEY_PURPLE_3464 = 3464 + const val SILVER_KEY_RED_3465 = 3465 + const val SILVER_KEY_BROWN_3466 = 3466 + const val SILVER_KEY_CRIMSON_3467 = 3467 + const val SILVER_KEY_BLACK_3468 = 3468 + const val SILVER_KEY_PURPLE_3469 = 3469 + const val FINE_CLOTH_3470 = 3470 + const val FINE_CLOTH_3471 = 3471 + const val BLACK_PLATESKIRT_T_3472 = 3472 + const val BLACK_PLATESKIRT_G_3473 = 3473 + const val ADAM_PLATESKIRT_T_3474 = 3474 + const val ADAM_PLATESKIRT_G_3475 = 3475 + const val RUNE_PLATESKIRT_G_3476 = 3476 + const val RUNE_PLATESKIRT_T_3477 = 3477 + const val ZAMORAK_PLATESKIRT_3478 = 3478 + const val SARADOMIN_PLATESKIRT_3479 = 3479 + const val GUTHIX_PLATESKIRT_3480 = 3480 + const val GILDED_PLATEBODY_3481 = 3481 + const val GILDED_PLATEBODY_3482 = 3482 + const val GILDED_PLATELEGS_3483 = 3483 + const val GILDED_PLATELEGS_3484 = 3484 + const val GILDED_PLATESKIRT_3485 = 3485 + const val GILDED_FULL_HELM_3486 = 3486 + const val GILDED_FULL_HELM_3487 = 3487 + const val GILDED_KITESHIELD_3488 = 3488 + const val GILDED_KITESHIELD_3489 = 3489 + const val CLUE_SCROLL_3490 = 3490 + const val CLUE_SCROLL_3491 = 3491 + const val CLUE_SCROLL_3492 = 3492 + const val CLUE_SCROLL_3493 = 3493 + const val CLUE_SCROLL_3494 = 3494 + const val CLUE_SCROLL_3495 = 3495 + const val CLUE_SCROLL_3496 = 3496 + const val CLUE_SCROLL_3497 = 3497 + const val CLUE_SCROLL_3498 = 3498 + const val CLUE_SCROLL_3499 = 3499 + const val CLUE_SCROLL_3500 = 3500 + const val CLUE_SCROLL_3501 = 3501 + const val CLUE_SCROLL_3502 = 3502 + const val CLUE_SCROLL_3503 = 3503 + const val CLUE_SCROLL_3504 = 3504 + const val CLUE_SCROLL_3505 = 3505 + const val CLUE_SCROLL_3506 = 3506 + const val CLUE_SCROLL_3507 = 3507 + const val CLUE_SCROLL_3508 = 3508 + const val CLUE_SCROLL_3509 = 3509 + const val CLUE_SCROLL_3510 = 3510 + const val CASKET_3511 = 3511 + const val CLUE_SCROLL_3512 = 3512 + const val CLUE_SCROLL_3513 = 3513 + const val CLUE_SCROLL_3514 = 3514 + const val CLUE_SCROLL_3515 = 3515 + const val CLUE_SCROLL_3516 = 3516 + const val CASKET_3517 = 3517 + const val CLUE_SCROLL_3518 = 3518 + const val CASKET_3519 = 3519 + const val CLUE_SCROLL_3520 = 3520 + const val CASKET_3521 = 3521 + const val CLUE_SCROLL_3522 = 3522 + const val CASKET_3523 = 3523 + const val CLUE_SCROLL_3524 = 3524 + const val CLUE_SCROLL_3525 = 3525 + const val CLUE_SCROLL_3526 = 3526 + const val CASKET_3527 = 3527 + const val CLUE_SCROLL_3528 = 3528 + const val CASKET_3529 = 3529 + const val CLUE_SCROLL_3530 = 3530 + const val CASKET_3531 = 3531 + const val CLUE_SCROLL_3532 = 3532 + const val CASKET_3533 = 3533 + const val CLUE_SCROLL_3534 = 3534 + const val CASKET_3535 = 3535 + const val CLUE_SCROLL_3536 = 3536 + const val CASKET_3537 = 3537 + const val CLUE_SCROLL_3538 = 3538 + const val CASKET_3539 = 3539 + const val CLUE_SCROLL_3540 = 3540 + const val CASKET_3541 = 3541 + const val CLUE_SCROLL_3542 = 3542 + const val CASKET_3543 = 3543 + const val CLUE_SCROLL_3544 = 3544 + const val CASKET_3545 = 3545 + const val CLUE_SCROLL_3546 = 3546 + const val CASKET_3547 = 3547 + const val CLUE_SCROLL_3548 = 3548 + const val CASKET_3549 = 3549 + const val CLUE_SCROLL_3550 = 3550 + const val CASKET_3551 = 3551 + const val CLUE_SCROLL_3552 = 3552 + const val CASKET_3553 = 3553 + const val CLUE_SCROLL_3554 = 3554 + const val CASKET_3555 = 3555 + const val CLUE_SCROLL_3556 = 3556 + const val CASKET_3557 = 3557 + const val CLUE_SCROLL_3558 = 3558 + const val CASKET_3559 = 3559 + const val CLUE_SCROLL_3560 = 3560 + const val CASKET_3561 = 3561 + const val CLUE_SCROLL_3562 = 3562 + const val CASKET_3563 = 3563 + const val CLUE_SCROLL_3564 = 3564 + const val PUZZLE_BOX_3565 = 3565 + const val CLUE_SCROLL_3566 = 3566 + const val PUZZLE_BOX_3567 = 3567 + const val CLUE_SCROLL_3568 = 3568 + const val PUZZLE_BOX_3569 = 3569 + const val CLUE_SCROLL_3570 = 3570 + const val PUZZLE_BOX_3571 = 3571 + const val CLUE_SCROLL_3572 = 3572 + const val CLUE_SCROLL_3573 = 3573 + const val CLUE_SCROLL_3574 = 3574 + const val CLUE_SCROLL_3575 = 3575 + const val PUZZLE_BOX_3576 = 3576 + const val CLUE_SCROLL_3577 = 3577 + const val PUZZLE_BOX_3578 = 3578 + const val CLUE_SCROLL_3579 = 3579 + const val CLUE_SCROLL_3580 = 3580 + const val CASKET_3581 = 3581 + const val CLUE_SCROLL_3582 = 3582 + const val CASKET_3583 = 3583 + const val CLUE_SCROLL_3584 = 3584 + const val CASKET_3585 = 3585 + const val CLUE_SCROLL_3586 = 3586 + const val CASKET_3587 = 3587 + const val CLUE_SCROLL_3588 = 3588 + const val CASKET_3589 = 3589 + const val CLUE_SCROLL_3590 = 3590 + const val CASKET_3591 = 3591 + const val CLUE_SCROLL_3592 = 3592 + const val CASKET_3593 = 3593 + const val CLUE_SCROLL_3594 = 3594 + const val CASKET_3595 = 3595 + const val CLUE_SCROLL_3596 = 3596 + const val CASKET_3597 = 3597 + const val CLUE_SCROLL_3598 = 3598 + const val CLUE_SCROLL_3599 = 3599 + const val CASKET_3600 = 3600 + const val CLUE_SCROLL_3601 = 3601 + const val CLUE_SCROLL_3602 = 3602 + const val CASKET_3603 = 3603 + const val CLUE_SCROLL_3604 = 3604 + const val CLUE_SCROLL_3605 = 3605 + const val KEY_3606 = 3606 + const val CLUE_SCROLL_3607 = 3607 + const val KEY_3608 = 3608 + const val CLUE_SCROLL_3609 = 3609 + const val CLUE_SCROLL_3610 = 3610 + const val CLUE_SCROLL_3611 = 3611 + const val CLUE_SCROLL_3612 = 3612 + const val CLUE_SCROLL_3613 = 3613 + const val CLUE_SCROLL_3614 = 3614 + const val CLUE_SCROLL_3615 = 3615 + const val CLUE_SCROLL_3616 = 3616 + const val CLUE_SCROLL_3617 = 3617 + const val CLUE_SCROLL_3618 = 3618 + const val SLIDING_PIECE_3619 = 3619 + const val SLIDING_PIECE_3620 = 3620 + const val SLIDING_PIECE_3621 = 3621 + const val SLIDING_PIECE_3622 = 3622 + const val SLIDING_PIECE_3623 = 3623 + const val SLIDING_PIECE_3624 = 3624 + const val SLIDING_PIECE_3625 = 3625 + const val SLIDING_PIECE_3626 = 3626 + const val SLIDING_PIECE_3627 = 3627 + const val SLIDING_PIECE_3628 = 3628 + const val SLIDING_PIECE_3629 = 3629 + const val SLIDING_PIECE_3630 = 3630 + const val SLIDING_PIECE_3631 = 3631 + const val SLIDING_PIECE_3632 = 3632 + const val SLIDING_PIECE_3633 = 3633 + const val SLIDING_PIECE_3634 = 3634 + const val SLIDING_PIECE_3635 = 3635 + const val SLIDING_PIECE_3636 = 3636 + const val SLIDING_PIECE_3637 = 3637 + const val SLIDING_PIECE_3638 = 3638 + const val SLIDING_PIECE_3639 = 3639 + const val SLIDING_PIECE_3640 = 3640 + const val SLIDING_PIECE_3641 = 3641 + const val SLIDING_PIECE_3642 = 3642 + const val SLIDING_PIECE_3643 = 3643 + const val SLIDING_PIECE_3644 = 3644 + const val SLIDING_PIECE_3645 = 3645 + const val SLIDING_PIECE_3646 = 3646 + const val SLIDING_PIECE_3647 = 3647 + const val SLIDING_PIECE_3648 = 3648 + const val SLIDING_PIECE_3649 = 3649 + const val SLIDING_PIECE_3650 = 3650 + const val SLIDING_PIECE_3651 = 3651 + const val SLIDING_PIECE_3652 = 3652 + const val SLIDING_PIECE_3653 = 3653 + const val SLIDING_PIECE_3654 = 3654 + const val SLIDING_PIECE_3655 = 3655 + const val SLIDING_PIECE_3656 = 3656 + const val SLIDING_PIECE_3657 = 3657 + const val SLIDING_PIECE_3658 = 3658 + const val SLIDING_PIECE_3659 = 3659 + const val SLIDING_PIECE_3660 = 3660 + const val SLIDING_PIECE_3661 = 3661 + const val SLIDING_PIECE_3662 = 3662 + const val SLIDING_PIECE_3663 = 3663 + const val SLIDING_PIECE_3664 = 3664 + const val SLIDING_PIECE_3665 = 3665 + const val SLIDING_PIECE_3666 = 3666 + const val PICTURE_3667 = 3667 + const val BLACK_PLATESKIRT_T_3668 = 3668 + const val BLACK_PLATESKIRT_G_3669 = 3669 + const val ADAM_PLATESKIRT_T_3670 = 3670 + const val ADAM_PLATESKIRT_G_3671 = 3671 + const val RUNE_PLATESKIRT_G_3672 = 3672 + const val RUNE_PLATESKIRT_T_3673 = 3673 + const val ZAMORAK_PLATESKIRT_3674 = 3674 + const val SARADOMIN_PLATESKIRT_3675 = 3675 + const val GUTHIX_PLATESKIRT_3676 = 3676 + const val GILDED_PLATESKIRT_3677 = 3677 + const val FLAMTAER_HAMMER_3678 = 3678 + const val PICTURE_3679 = 3679 + const val PICTURE_3680 = 3680 + const val PICTURE_3681 = 3681 + const val PICTURE_3682 = 3682 + const val PICTURE_3683 = 3683 + const val PICTURE_3684 = 3684 + const val PICTURE_3685 = 3685 + const val FREMENNIK_3686 = 3686 + const val NULL_3687 = 3687 + const val UNSTRUNG_LYRE_3688 = 3688 + const val LYRE_3689 = 3689 + const val ENCHANTED_LYRE_3690 = 3690 + const val ENCHANTED_LYRE1_3691 = 3691 + const val BRANCH_3692 = 3692 + const val GOLDEN_FLEECE_3693 = 3693 + const val GOLDEN_WOOL_3694 = 3694 + const val PET_ROCK_3695 = 3695 + const val HUNTERS_TALISMAN_3696 = 3696 + const val HUNTERS_TALISMAN_3697 = 3697 + const val EXOTIC_FLOWER_3698 = 3698 + const val FREMENNIK_BALLAD_3699 = 3699 + const val STURDY_BOOTS_3700 = 3700 + const val TRACKING_MAP_3701 = 3701 + const val CUSTOM_BOW_STRING_3702 = 3702 + const val UNUSUAL_FISH_3703 = 3703 + const val SEA_FISHING_MAP_3704 = 3704 + const val WEATHER_FORECAST_3705 = 3705 + const val CHAMPIONS_TOKEN_3706 = 3706 + const val LEGENDARY_COCKTAIL_3707 = 3707 + const val FISCAL_STATEMENT_3708 = 3708 + const val PROMISSORY_NOTE_3709 = 3709 + const val WARRIORS_CONTRACT_3710 = 3710 + const val KEG_OF_BEER_3711 = 3711 + const val LOW_ALCOHOL_KEG_3712 = 3712 + const val STRANGE_OBJECT_3713 = 3713 + const val LIT_STRANGE_OBJECT_3714 = 3714 + const val PICTURE_3715 = 3715 + const val PICTURE_3716 = 3716 + const val NULL_3717 = 3717 + const val MAGNET_3718 = 3718 + const val THREAD_3719 = 3719 + const val PICK_3720 = 3720 + const val SHIP_TOY_3721 = 3721 + const val FULL_BUCKET_3722 = 3722 + const val FOUR_5THS_FULL_BUCKET_3723 = 3723 + const val THREE_5THS_FULL_BUCKET_3724 = 3724 + const val TWO_5THS_FULL_BUCKET_3725 = 3725 + const val ONE_5THS_FULL_BUCKET_3726 = 3726 + const val EMPTY_BUCKET_3727 = 3727 + const val FROZEN_BUCKET_3728 = 3728 + const val FULL_JUG_3729 = 3729 + const val TWO_THIRDSRDS_FULL_JUG_3730 = 3730 + const val ONE_THIRDRDS_FULL_JUG_3731 = 3731 + const val EMPTY_JUG_3732 = 3732 + const val FROZEN_JUG_3733 = 3733 + const val VASE_3734 = 3734 + const val VASE_OF_WATER_3735 = 3735 + const val FROZEN_VASE_3736 = 3736 + const val VASE_LID_3737 = 3737 + const val SEALED_VASE_3738 = 3738 + const val SEALED_VASE_3739 = 3739 + const val SEALED_VASE_3740 = 3740 + const val FROZEN_KEY_3741 = 3741 + const val RED_HERRING_3742 = 3742 + const val RED_DISK_3743 = 3743 + const val WOODEN_DISK_3744 = 3744 + const val SEERS_KEY_3745 = 3745 + const val STICKY_RED_GOOP_3746 = 3746 + const val STICKY_RED_GOOP_3747 = 3747 + const val FREMENNIK_HELM_3748 = 3748 + const val ARCHER_HELM_3749 = 3749 + const val ARCHER_HELM_3750 = 3750 + const val BERSERKER_HELM_3751 = 3751 + const val BERSERKER_HELM_3752 = 3752 + const val WARRIOR_HELM_3753 = 3753 + const val WARRIOR_HELM_3754 = 3754 + const val FARSEER_HELM_3755 = 3755 + const val FARSEER_HELM_3756 = 3756 + const val FREMENNIK_BLADE_3757 = 3757 + const val FREMENNIK_SHIELD_3758 = 3758 + const val FREMENNIK_CLOAK_3759 = 3759 + const val FREMENNIK_CLOAK_3760 = 3760 + const val FREMENNIK_CLOAK_3761 = 3761 + const val FREMENNIK_CLOAK_3762 = 3762 + const val FREMENNIK_CLOAK_3763 = 3763 + const val FREMENNIK_CLOAK_3764 = 3764 + const val FREMENNIK_CLOAK_3765 = 3765 + const val FREMENNIK_CLOAK_3766 = 3766 + const val FREMENNIK_SHIRT_3767 = 3767 + const val FREMENNIK_SHIRT_3768 = 3768 + const val FREMENNIK_SHIRT_3769 = 3769 + const val FREMENNIK_SHIRT_3770 = 3770 + const val FREMENNIK_SHIRT_3771 = 3771 + const val FREMENNIK_SHIRT_3772 = 3772 + const val FREMENNIK_SHIRT_3773 = 3773 + const val FREMENNIK_SHIRT_3774 = 3774 + const val FREMENNIK_SHIRT_3775 = 3775 + const val FREMENNIK_SHIRT_3776 = 3776 + const val FREMENNIK_CLOAK_3777 = 3777 + const val FREMENNIK_CLOAK_3778 = 3778 + const val FREMENNIK_CLOAK_3779 = 3779 + const val FREMENNIK_CLOAK_3780 = 3780 + const val FREMENNIK_CLOAK_3781 = 3781 + const val FREMENNIK_CLOAK_3782 = 3782 + const val FREMENNIK_CLOAK_3783 = 3783 + const val FREMENNIK_CLOAK_3784 = 3784 + const val FREMENNIK_CLOAK_3785 = 3785 + const val FREMENNIK_CLOAK_3786 = 3786 + const val FREMENNIK_CLOAK_3787 = 3787 + const val FREMENNIK_CLOAK_3788 = 3788 + const val FREMENNIK_CLOAK_3789 = 3789 + const val FREMENNIK_CLOAK_3790 = 3790 + const val FREMENNIK_BOOTS_3791 = 3791 + const val FREMENNIK_BOOTS_3792 = 3792 + const val FREMENNIK_ROBE_3793 = 3793 + const val FREMENNIK_ROBE_3794 = 3794 + const val FREMENNIK_SKIRT_3795 = 3795 + const val FREMENNIK_SKIRT_3796 = 3796 + const val FREMENNIK_HAT_3797 = 3797 + const val FREMENNIK_HAT_3798 = 3798 + const val GLOVES_3799 = 3799 + const val GLOVES_3800 = 3800 + const val KEG_OF_BEER_3801 = 3801 + const val KEG_OF_BEER_3802 = 3802 + const val BEER_3803 = 3803 + const val BEER_3804 = 3804 + const val TANKARD_3805 = 3805 + const val TANKARD_3806 = 3806 + const val NULL_3807 = 3807 + const val NULL_3808 = 3808 + const val NULL_3809 = 3809 + const val NULL_3810 = 3810 + const val NULL_3811 = 3811 + const val NULL_3812 = 3812 + const val NULL_3813 = 3813 + const val NULL_3814 = 3814 + const val NULL_3815 = 3815 + const val NULL_3816 = 3816 + const val NULL_3817 = 3817 + const val NULL_3818 = 3818 + const val NULL_3819 = 3819 + const val NULL_3820 = 3820 + const val NULL_3821 = 3821 + const val NULL_3822 = 3822 + const val NULL_3823 = 3823 + const val NULL_3824 = 3824 + const val NULL_3825 = 3825 + const val NULL_3826 = 3826 + const val SARADOMIN_PAGE_1_3827 = 3827 + const val SARADOMIN_PAGE_2_3828 = 3828 + const val SARADOMIN_PAGE_3_3829 = 3829 + const val SARADOMIN_PAGE_4_3830 = 3830 + const val ZAMORAK_PAGE_1_3831 = 3831 + const val ZAMORAK_PAGE_2_3832 = 3832 + const val ZAMORAK_PAGE_3_3833 = 3833 + const val ZAMORAK_PAGE_4_3834 = 3834 + const val GUTHIX_PAGE_1_3835 = 3835 + const val GUTHIX_PAGE_2_3836 = 3836 + const val GUTHIX_PAGE_3_3837 = 3837 + const val GUTHIX_PAGE_4_3838 = 3838 + const val DAMAGED_BOOK_3839 = 3839 + const val HOLY_BOOK_3840 = 3840 + const val DAMAGED_BOOK_3841 = 3841 + const val UNHOLY_BOOK_3842 = 3842 + const val DAMAGED_BOOK_3843 = 3843 + const val BOOK_OF_BALANCE_3844 = 3844 + const val JOURNAL_3845 = 3845 + const val DIARY_3846 = 3846 + const val MANUAL_3847 = 3847 + const val LIGHTHOUSE_KEY_3848 = 3848 + const val RUSTY_CASKET_3849 = 3849 + const val NULL_3850 = 3850 + const val NULL_3851 = 3851 + const val UNHOLY_SYMBOL_3852 = 3852 + const val GAMES_NECKLACE8_3853 = 3853 + const val GAMES_NECKLACE8_3854 = 3854 + const val GAMES_NECKLACE7_3855 = 3855 + const val GAMES_NECKLACE7_3856 = 3856 + const val GAMES_NECKLACE6_3857 = 3857 + const val GAMES_NECKLACE6_3858 = 3858 + const val GAMES_NECKLACE5_3859 = 3859 + const val GAMES_NECKLACE5_3860 = 3860 + const val GAMES_NECKLACE4_3861 = 3861 + const val GAMES_NECKLACE4_3862 = 3862 + const val GAMES_NECKLACE3_3863 = 3863 + const val GAMES_NECKLACE3_3864 = 3864 + const val GAMES_NECKLACE2_3865 = 3865 + const val GAMES_NECKLACE2_3866 = 3866 + const val GAMES_NECKLACE1_3867 = 3867 + const val GAMES_NECKLACE1_3868 = 3868 + const val BOARD_GAME_PIECE_3869 = 3869 + const val BOARD_GAME_PIECE_3870 = 3870 + const val BOARD_GAME_PIECE_3871 = 3871 + const val BOARD_GAME_PIECE_3872 = 3872 + const val BOARD_GAME_PIECE_3873 = 3873 + const val BOARD_GAME_PIECE_3874 = 3874 + const val BOARD_GAME_PIECE_3875 = 3875 + const val BOARD_GAME_PIECE_3876 = 3876 + const val BOARD_GAME_PIECE_3877 = 3877 + const val BOARD_GAME_PIECE_3878 = 3878 + const val BOARD_GAME_PIECE_3879 = 3879 + const val BOARD_GAME_PIECE_3880 = 3880 + const val NULL_3881 = 3881 + const val NULL_3882 = 3882 + const val NULL_3883 = 3883 + const val NULL_3884 = 3884 + const val NULL_3885 = 3885 + const val NULL_3886 = 3886 + const val NULL_3887 = 3887 + const val NULL_3888 = 3888 + const val NULL_3889 = 3889 + const val NULL_3890 = 3890 + const val NULL_3891 = 3891 + const val NULL_3892 = 3892 + const val STOOL_3893 = 3893 + const val AWFUL_ANTHEM_3894 = 3894 + const val GOOD_ANTHEM_3895 = 3895 + const val TREATY_3896 = 3896 + const val GIANT_NIB_3897 = 3897 + const val GIANT_PEN_3898 = 3898 + const val IRON_SICKLE_3899 = 3899 + const val PICTURE_3900 = 3900 + const val GHRIMS_BOOK_3901 = 3901 + const val PICTURE_3902 = 3902 + const val PICTURE_3903 = 3903 + const val SLIDING_BUTTON_3904 = 3904 + const val NULL_3905 = 3905 + const val SLIDING_BUTTON_3906 = 3906 + const val NULL_3907 = 3907 + const val SLIDING_BUTTON_3908 = 3908 + const val NULL_3909 = 3909 + const val SLIDING_BUTTON_3910 = 3910 + const val NULL_3911 = 3911 + const val SLIDING_BUTTON_3912 = 3912 + const val NULL_3913 = 3913 + const val SLIDING_BUTTON_3914 = 3914 + const val NULL_3915 = 3915 + const val SLIDING_BUTTON_3916 = 3916 + const val NULL_3917 = 3917 + const val SLIDING_BUTTON_3918 = 3918 + const val NULL_3919 = 3919 + const val SLIDING_BUTTON_3920 = 3920 + const val NULL_3921 = 3921 + const val SLIDING_BUTTON_3922 = 3922 + const val NULL_3923 = 3923 + const val SLIDING_BUTTON_3924 = 3924 + const val NULL_3925 = 3925 + const val SLIDING_BUTTON_3926 = 3926 + const val NULL_3927 = 3927 + const val SLIDING_BUTTON_3928 = 3928 + const val NULL_3929 = 3929 + const val SLIDING_BUTTON_3930 = 3930 + const val NULL_3931 = 3931 + const val SLIDING_BUTTON_3932 = 3932 + const val NULL_3933 = 3933 + const val SLIDING_BUTTON_3934 = 3934 + const val NULL_3935 = 3935 + const val SLIDING_BUTTON_3936 = 3936 + const val NULL_3937 = 3937 + const val SLIDING_BUTTON_3938 = 3938 + const val NULL_3939 = 3939 + const val SLIDING_BUTTON_3940 = 3940 + const val NULL_3941 = 3941 + const val SLIDING_BUTTON_3942 = 3942 + const val NULL_3943 = 3943 + const val SLIDING_BUTTON_3944 = 3944 + const val NULL_3945 = 3945 + const val SLIDING_BUTTON_3946 = 3946 + const val NULL_3947 = 3947 + const val SLIDING_BUTTON_3948 = 3948 + const val NULL_3949 = 3949 + const val SLIDING_BUTTON_3950 = 3950 + const val NULL_3951 = 3951 + const val SLIDING_BUTTON_3952 = 3952 + const val NULL_3953 = 3953 + const val SLIDING_BUTTON_3954 = 3954 + const val NULL_3955 = 3955 + const val SLIDING_BUTTON_3956 = 3956 + const val NULL_3957 = 3957 + const val SLIDING_BUTTON_3958 = 3958 + const val NULL_3959 = 3959 + const val SLIDING_BUTTON_3960 = 3960 + const val NULL_3961 = 3961 + const val SLIDING_BUTTON_3962 = 3962 + const val NULL_3963 = 3963 + const val SLIDING_BUTTON_3964 = 3964 + const val NULL_3965 = 3965 + const val SLIDING_BUTTON_3966 = 3966 + const val NULL_3967 = 3967 + const val SLIDING_BUTTON_3968 = 3968 + const val NULL_3969 = 3969 + const val SLIDING_BUTTON_3970 = 3970 + const val NULL_3971 = 3971 + const val SLIDING_BUTTON_3972 = 3972 + const val NULL_3973 = 3973 + const val SLIDING_BUTTON_3974 = 3974 + const val NULL_3975 = 3975 + const val SLIDING_BUTTON_3976 = 3976 + const val NULL_3977 = 3977 + const val SLIDING_BUTTON_3978 = 3978 + const val NULL_3979 = 3979 + const val SLIDING_BUTTON_3980 = 3980 + const val NULL_3981 = 3981 + const val SLIDING_BUTTON_3982 = 3982 + const val NULL_3983 = 3983 + const val SLIDING_BUTTON_3984 = 3984 + const val NULL_3985 = 3985 + const val SLIDING_BUTTON_3986 = 3986 + const val NULL_3987 = 3987 + const val SLIDING_BUTTON_3988 = 3988 + const val NULL_3989 = 3989 + const val SLIDING_BUTTON_3990 = 3990 + const val NULL_3991 = 3991 + const val SLIDING_BUTTON_3992 = 3992 + const val NULL_3993 = 3993 + const val SLIDING_BUTTON_3994 = 3994 + const val NULL_3995 = 3995 + const val SLIDING_BUTTON_3996 = 3996 + const val NULL_3997 = 3997 + const val SLIDING_BUTTON_3998 = 3998 + const val NULL_3999 = 3999 + const val PICTURE_4000 = 4000 + const val HARDY_GOUT_TUBER_4001 = 4001 + const val SPARE_CONTROLS_4002 = 4002 + const val PICTURE_4003 = 4003 + const val GNOME_ROYAL_SEAL_4004 = 4004 + const val NARNODES_ORDERS_4005 = 4005 + const val MONKEY_DENTURES_4006 = 4006 + const val ENCHANTED_BAR_4007 = 4007 + const val EYE_OF_GNOME_4008 = 4008 + const val EYE_OF_GNOME_4009 = 4009 + const val MONKEY_MAGIC_4010 = 4010 + const val PICTURE_4011 = 4011 + const val MONKEY_NUTS_4012 = 4012 + const val PICTURE_4013 = 4013 + const val MONKEY_BAR_4014 = 4014 + const val PICTURE_4015 = 4015 + const val BANANA_STEW_4016 = 4016 + const val PICTURE_4017 = 4017 + const val MONKEY_WRENCH_4018 = 4018 + const val PICTURE_4019 = 4019 + const val MAMULET_MOULD_4020 = 4020 + const val MSPEAK_AMULET_4021 = 4021 + const val MSPEAK_AMULET_4022 = 4022 + const val MONKEY_TALISMAN_4023 = 4023 + const val MONKEY_GREEGREE_4024 = 4024 + const val MONKEY_GREEGREE_4025 = 4025 + const val MONKEY_GREEGREE_4026 = 4026 + const val MONKEY_GREEGREE_4027 = 4027 + const val MONKEY_GREEGREE_4028 = 4028 + const val MONKEY_GREEGREE_4029 = 4029 + const val MONKEY_GREEGREE_4030 = 4030 + const val MONKEY_GREEGREE_4031 = 4031 + const val DUMMY_4032 = 4032 + const val MONKEY_4033 = 4033 + const val MONKEY_SKULL_4034 = 4034 + const val TENTH_SQUAD_SIGIL_4035 = 4035 + const val NULL_4036 = 4036 + const val SARADOMIN_BANNER_4037 = 4037 + const val SARADOMIN_BANNER_4038 = 4038 + const val ZAMORAK_BANNER_4039 = 4039 + const val ZAMORAK_BANNER_4040 = 4040 + const val HOODED_CLOAK_4041 = 4041 + const val HOODED_CLOAK_4042 = 4042 + const val ROCK_4043 = 4043 + const val ROCK_4044 = 4044 + const val EXPLOSIVE_POTION_4045 = 4045 + const val EXPLOSIVE_POTION_4046 = 4046 + const val CLIMBING_ROPE_4047 = 4047 + const val CLIMBING_ROPE_4048 = 4048 + const val BANDAGES_4049 = 4049 + const val BANDAGES_4050 = 4050 + const val TOOLKIT_4051 = 4051 + const val TOOLKIT_4052 = 4052 + const val BARRICADE_4053 = 4053 + const val BARRICADE_4054 = 4054 + const val CASTLEWARS_MANUAL_4055 = 4055 + const val NULL_4056 = 4056 + const val NULL_4057 = 4057 + const val NULL_4058 = 4058 + const val NULL_4059 = 4059 + const val NULL_4060 = 4060 + const val NULL_4061 = 4061 + const val NULL_4062 = 4062 + const val NULL_4063 = 4063 + const val NULL_4064 = 4064 + const val NULL_4065 = 4065 + const val NULL_4066 = 4066 + const val CASTLE_WARS_TICKET_4067 = 4067 + const val DECORATIVE_SWORD_4068 = 4068 + const val DECORATIVE_ARMOUR_4069 = 4069 + const val DECORATIVE_ARMOUR_4070 = 4070 + const val DECORATIVE_HELM_4071 = 4071 + const val DECORATIVE_SHIELD_4072 = 4072 + const val DAMP_TINDERBOX_4073 = 4073 + const val DAMP_TINDERBOX_4074 = 4074 + const val GLOWING_FUNGUS_4075 = 4075 + const val PICTURE_4076 = 4076 + const val CRYSTAL_MINE_KEY_4077 = 4077 + const val ZEALOTS_KEY_4078 = 4078 + const val YO_YO_4079 = 4079 + const val NULL_4080 = 4080 + const val SALVE_AMULET_4081 = 4081 + const val SALVE_SHARD_4082 = 4082 + const val SLED_4083 = 4083 + const val SLED_4084 = 4084 + const val WAX_4085 = 4085 + const val TROLLWEISS_4086 = 4086 + const val DRAGON_PLATELEGS_4087 = 4087 + const val DRAGON_PLATELEGS_4088 = 4088 + const val MYSTIC_HAT_4089 = 4089 + const val MYSTIC_HAT_4090 = 4090 + const val MYSTIC_ROBE_TOP_4091 = 4091 + const val MYSTIC_ROBE_TOP_4092 = 4092 + const val MYSTIC_ROBE_BOTTOM_4093 = 4093 + const val MYSTIC_ROBE_BOTTOM_4094 = 4094 + const val MYSTIC_GLOVES_4095 = 4095 + const val MYSTIC_GLOVES_4096 = 4096 + const val MYSTIC_BOOTS_4097 = 4097 + const val MYSTIC_BOOTS_4098 = 4098 + const val MYSTIC_HAT_4099 = 4099 + const val MYSTIC_HAT_4100 = 4100 + const val MYSTIC_ROBE_TOP_4101 = 4101 + const val MYSTIC_ROBE_TOP_4102 = 4102 + const val MYSTIC_ROBE_BOTTOM_4103 = 4103 + const val MYSTIC_ROBE_BOTTOM_4104 = 4104 + const val MYSTIC_GLOVES_4105 = 4105 + const val MYSTIC_GLOVES_4106 = 4106 + const val MYSTIC_BOOTS_4107 = 4107 + const val MYSTIC_BOOTS_4108 = 4108 + const val MYSTIC_HAT_4109 = 4109 + const val MYSTIC_HAT_4110 = 4110 + const val MYSTIC_ROBE_TOP_4111 = 4111 + const val MYSTIC_ROBE_TOP_4112 = 4112 + const val MYSTIC_ROBE_BOTTOM_4113 = 4113 + const val MYSTIC_ROBE_BOTTOM_4114 = 4114 + const val MYSTIC_GLOVES_4115 = 4115 + const val MYSTIC_GLOVES_4116 = 4116 + const val MYSTIC_BOOTS_4117 = 4117 + const val MYSTIC_BOOTS_4118 = 4118 + const val BRONZE_BOOTS_4119 = 4119 + const val BRONZE_BOOTS_4120 = 4120 + const val IRON_BOOTS_4121 = 4121 + const val IRON_BOOTS_4122 = 4122 + const val STEEL_BOOTS_4123 = 4123 + const val STEEL_BOOTS_4124 = 4124 + const val BLACK_BOOTS_4125 = 4125 + const val BLACK_BOOTS_4126 = 4126 + const val MITHRIL_BOOTS_4127 = 4127 + const val MITHRIL_BOOTS_4128 = 4128 + const val ADAMANT_BOOTS_4129 = 4129 + const val ADAMANT_BOOTS_4130 = 4130 + const val RUNE_BOOTS_4131 = 4131 + const val RUNE_BOOTS_4132 = 4132 + const val CRAWLING_HAND_4133 = 4133 + const val CAVE_CRAWLER_4134 = 4134 + const val BANSHEE_4135 = 4135 + const val ROCKSLUG_4136 = 4136 + const val COCKATRICE_4137 = 4137 + const val PYREFIEND_4138 = 4138 + const val BASILISK_4139 = 4139 + const val INFERNAL_MAGE_4140 = 4140 + const val BLOODVELD_4141 = 4141 + const val JELLY_4142 = 4142 + const val TUROTH_4143 = 4143 + const val ABBERANT_SPECTRE_4144 = 4144 + const val DUST_DEVIL_4145 = 4145 + const val KURASK_4146 = 4146 + const val GARGOYLE_4147 = 4147 + const val NECHRYAEL_4148 = 4148 + const val ABYSSAL_DEMON_4149 = 4149 + const val BROAD_ARROWS_4150 = 4150 + const val ABYSSAL_WHIP_4151 = 4151 + const val ABYSSAL_WHIP_4152 = 4152 + const val GRANITE_MAUL_4153 = 4153 + const val GRANITE_MAUL_4154 = 4154 + const val ENCHANTED_GEM_4155 = 4155 + const val MIRROR_SHIELD_4156 = 4156 + const val MIRROR_SHIELD_4157 = 4157 + const val LEAF_BLADED_SPEAR_4158 = 4158 + const val LEAF_BLADED_SPEAR_4159 = 4159 + const val BROAD_ARROW_4160 = 4160 + const val BAG_OF_SALT_4161 = 4161 + const val ROCK_HAMMER_4162 = 4162 + const val ROCK_HAMMER_4163 = 4163 + const val FACE_MASK_4164 = 4164 + const val FACE_MASK_4165 = 4165 + const val EARMUFFS_4166 = 4166 + const val EARMUFFS_4167 = 4167 + const val NOSE_PEG_4168 = 4168 + const val NOSE_PEG_4169 = 4169 + const val SLAYERS_STAFF_4170 = 4170 + const val SLAYERS_STAFF_4171 = 4171 + const val BROAD_ARROWS_4172 = 4172 + const val BROAD_ARROWS_4173 = 4173 + const val BROAD_ARROWS_4174 = 4174 + const val BROAD_ARROWS_4175 = 4175 + const val NULL_4176 = 4176 + const val PICTURE_4177 = 4177 + const val ABYSSAL_WHIP_4178 = 4178 + const val STICK_4179 = 4179 + const val DRAGON_PLATELEGS_4180 = 4180 + const val MOUTH_GRIP_4181 = 4181 + const val GOUTWEED_4182 = 4182 + const val STAR_AMULET_4183 = 4183 + const val CAVERN_KEY_4184 = 4184 + const val TOWER_KEY_4185 = 4185 + const val SHED_KEY_4186 = 4186 + const val MARBLE_AMULET_4187 = 4187 + const val OBSIDIAN_AMULET_4188 = 4188 + const val GARDEN_CANE_4189 = 4189 + const val GARDEN_BRUSH_4190 = 4190 + const val EXTENDED_BRUSH_4191 = 4191 + const val EXTENDED_BRUSH_4192 = 4192 + const val EXTENDED_BRUSH_4193 = 4193 + const val TORSO_4194 = 4194 + const val ARMS_4195 = 4195 + const val LEGS_4196 = 4196 + const val DECAPITATED_HEAD_4197 = 4197 + const val DECAPITATED_HEAD_4198 = 4198 + const val PICKLED_BRAIN_4199 = 4199 + const val CONDUCTOR_MOULD_4200 = 4200 + const val CONDUCTOR_4201 = 4201 + const val RING_OF_CHAROS_4202 = 4202 + const val JOURNAL_4203 = 4203 + const val LETTER_4204 = 4204 + const val CONSECRATION_SEED_4205 = 4205 + const val CONSECRATION_SEED_4206 = 4206 + const val CRYSTAL_SEED_4207 = 4207 + const val CRYSTAL_SEED_4208 = 4208 + const val CADARN_LINEAGE_4209 = 4209 + const val TINDERBOX_4210 = 4210 + const val ELF_CRYSTAL_4211 = 4211 + const val NEW_CRYSTAL_BOW_4212 = 4212 + const val NEW_CRYSTAL_BOW_4213 = 4213 + const val CRYSTAL_BOW_FULL_4214 = 4214 + const val CRYSTAL_BOW_9_10_4215 = 4215 + const val CRYSTAL_BOW_8_10_4216 = 4216 + const val CRYSTAL_BOW_7_10_4217 = 4217 + const val CRYSTAL_BOW_6_10_4218 = 4218 + const val CRYSTAL_BOW_5_10_4219 = 4219 + const val CRYSTAL_BOW_4_10_4220 = 4220 + const val CRYSTAL_BOW_3_10_4221 = 4221 + const val CRYSTAL_BOW_2_10_4222 = 4222 + const val CRYSTAL_BOW_1_10_4223 = 4223 + const val NEW_CRYSTAL_SHIELD_4224 = 4224 + const val CRYSTAL_SHIELD_FULL_4225 = 4225 + const val CRYSTAL_SHIELD_9_10_4226 = 4226 + const val CRYSTAL_SHIELD_8_10_4227 = 4227 + const val CRYSTAL_SHIELD_7_10_4228 = 4228 + const val CRYSTAL_SHIELD_6_10_4229 = 4229 + const val CRYSTAL_SHIELD_5_10_4230 = 4230 + const val CRYSTAL_SHIELD_4_10_4231 = 4231 + const val CRYSTAL_SHIELD_3_10_4232 = 4232 + const val CRYSTAL_SHIELD_2_10_4233 = 4233 + const val CRYSTAL_SHIELD_1_10_4234 = 4234 + const val NEW_CRYSTAL_SHIELD_4235 = 4235 + const val SIGNED_OAK_BOW_4236 = 4236 + const val NETTLE_WATER_4237 = 4237 + const val PUDDLE_OF_SLIME_4238 = 4238 + const val NETTLE_TEA_4239 = 4239 + const val NETTLE_TEA_4240 = 4240 + const val NETTLES_4241 = 4241 + const val CUP_OF_TEA_4242 = 4242 + const val CUP_OF_TEA_4243 = 4243 + const val PORCELAIN_CUP_4244 = 4244 + const val CUP_OF_TEA_4245 = 4245 + const val CUP_OF_TEA_4246 = 4246 + const val MYSTICAL_ROBES_4247 = 4247 + const val BOOK_OF_HARICANTO_4248 = 4248 + const val TRANSLATION_MANUAL_4249 = 4249 + const val GHOSTSPEAK_AMULET_4250 = 4250 + const val ECTOPHIAL_4251 = 4251 + const val ECTOPHIAL_4252 = 4252 + const val MODEL_SHIP_4253 = 4253 + const val MODEL_SHIP_4254 = 4254 + const val BONEMEAL_4255 = 4255 + const val BONEMEAL_4256 = 4256 + const val BONEMEAL_4257 = 4257 + const val BONEMEAL_4258 = 4258 + const val BONEMEAL_4259 = 4259 + const val BONEMEAL_4260 = 4260 + const val BONEMEAL_4261 = 4261 + const val BONEMEAL_4262 = 4262 + const val BONEMEAL_4263 = 4263 + const val BONEMEAL_4264 = 4264 + const val BONEMEAL_4265 = 4265 + const val BONEMEAL_4266 = 4266 + const val BONEMEAL_4267 = 4267 + const val BONEMEAL_4268 = 4268 + const val BONEMEAL_4269 = 4269 + const val BONEMEAL_4270 = 4270 + const val BONEMEAL_4271 = 4271 + const val BONE_KEY_4272 = 4272 + const val CHEST_KEY_4273 = 4273 + const val MAP_SCRAP_4274 = 4274 + const val MAP_SCRAP_4275 = 4275 + const val MAP_SCRAP_4276 = 4276 + const val TREASURE_MAP_4277 = 4277 + const val ECTO_TOKEN_4278 = 4278 + const val NULL_4279 = 4279 + const val NULL_4280 = 4280 + const val NULL_4281 = 4281 + const val NULL_4282 = 4282 + const val PETITION_FORM_4283 = 4283 + const val BEDSHEET_4284 = 4284 + const val BEDSHEET_4285 = 4285 + const val BUCKET_OF_SLIME_4286 = 4286 + const val RAW_BEEF_4287 = 4287 + const val RAW_BEEF_4288 = 4288 + const val RAW_CHICKEN_4289 = 4289 + const val RAW_CHICKEN_4290 = 4290 + const val COOKED_CHICKEN_4291 = 4291 + const val COOKED_CHICKEN_4292 = 4292 + const val COOKED_MEAT_4293 = 4293 + const val COOKED_MEAT_4294 = 4294 + const val FEMALE_HAM_4295 = 4295 + const val NULL_4296 = 4296 + const val MALE_HAM_4297 = 4297 + const val HAM_SHIRT_4298 = 4298 + const val HAM_SHIRT_4299 = 4299 + const val HAM_ROBE_4300 = 4300 + const val HAM_ROBE_4301 = 4301 + const val HAM_HOOD_4302 = 4302 + const val HAM_HOOD_4303 = 4303 + const val HAM_CLOAK_4304 = 4304 + const val HAM_CLOAK_4305 = 4305 + const val HAM_LOGO_4306 = 4306 + const val HAM_LOGO_4307 = 4307 + const val GLOVES_4308 = 4308 + const val GLOVES_4309 = 4309 + const val BOOTS_4310 = 4310 + const val BOOTS_4311 = 4311 + const val NULL_4312 = 4312 + const val CRYSTAL_OF_SEREN_4313 = 4313 + const val TINDERBOX_4314 = 4314 + const val TEAM_1_CAPE_4315 = 4315 + const val TEAM_1_CAPE_4316 = 4316 + const val TEAM_2_CAPE_4317 = 4317 + const val TEAM_2_CAPE_4318 = 4318 + const val TEAM_3_CAPE_4319 = 4319 + const val TEAM_3_CAPE_4320 = 4320 + const val TEAM_4_CAPE_4321 = 4321 + const val TEAM_4_CAPE_4322 = 4322 + const val TEAM_5_CAPE_4323 = 4323 + const val TEAM_5_CAPE_4324 = 4324 + const val TEAM_6_CAPE_4325 = 4325 + const val TEAM_6_CAPE_4326 = 4326 + const val TEAM_7_CAPE_4327 = 4327 + const val TEAM_7_CAPE_4328 = 4328 + const val TEAM_8_CAPE_4329 = 4329 + const val TEAM_8_CAPE_4330 = 4330 + const val TEAM_9_CAPE_4331 = 4331 + const val TEAM_9_CAPE_4332 = 4332 + const val TEAM_10_CAPE_4333 = 4333 + const val TEAM_10_CAPE_4334 = 4334 + const val TEAM_11_CAPE_4335 = 4335 + const val TEAM_11_CAPE_4336 = 4336 + const val TEAM_12_CAPE_4337 = 4337 + const val TEAM_12_CAPE_4338 = 4338 + const val TEAM_13_CAPE_4339 = 4339 + const val TEAM_13_CAPE_4340 = 4340 + const val TEAM_14_CAPE_4341 = 4341 + const val TEAM_14_CAPE_4342 = 4342 + const val TEAM_15_CAPE_4343 = 4343 + const val TEAM_15_CAPE_4344 = 4344 + const val TEAM_16_CAPE_4345 = 4345 + const val TEAM_16_CAPE_4346 = 4346 + const val TEAM_17_CAPE_4347 = 4347 + const val TEAM_17_CAPE_4348 = 4348 + const val TEAM_18_CAPE_4349 = 4349 + const val TEAM_18_CAPE_4350 = 4350 + const val TEAM_19_CAPE_4351 = 4351 + const val TEAM_19_CAPE_4352 = 4352 + const val TEAM_20_CAPE_4353 = 4353 + const val TEAM_20_CAPE_4354 = 4354 + const val TEAM_21_CAPE_4355 = 4355 + const val TEAM_21_CAPE_4356 = 4356 + const val TEAM_22_CAPE_4357 = 4357 + const val TEAM_22_CAPE_4358 = 4358 + const val TEAM_23_CAPE_4359 = 4359 + const val TEAM_23_CAPE_4360 = 4360 + const val TEAM_24_CAPE_4361 = 4361 + const val TEAM_24_CAPE_4362 = 4362 + const val TEAM_25_CAPE_4363 = 4363 + const val TEAM_25_CAPE_4364 = 4364 + const val TEAM_26_CAPE_4365 = 4365 + const val TEAM_26_CAPE_4366 = 4366 + const val TEAM_27_CAPE_4367 = 4367 + const val TEAM_27_CAPE_4368 = 4368 + const val TEAM_28_CAPE_4369 = 4369 + const val TEAM_28_CAPE_4370 = 4370 + const val TEAM_29_CAPE_4371 = 4371 + const val TEAM_29_CAPE_4372 = 4372 + const val TEAM_30_CAPE_4373 = 4373 + const val TEAM_30_CAPE_4374 = 4374 + const val TEAM_31_CAPE_4375 = 4375 + const val TEAM_31_CAPE_4376 = 4376 + const val TEAM_32_CAPE_4377 = 4377 + const val TEAM_32_CAPE_4378 = 4378 + const val TEAM_33_CAPE_4379 = 4379 + const val TEAM_33_CAPE_4380 = 4380 + const val TEAM_34_CAPE_4381 = 4381 + const val TEAM_34_CAPE_4382 = 4382 + const val TEAM_35_CAPE_4383 = 4383 + const val TEAM_35_CAPE_4384 = 4384 + const val TEAM_36_CAPE_4385 = 4385 + const val TEAM_36_CAPE_4386 = 4386 + const val TEAM_37_CAPE_4387 = 4387 + const val TEAM_37_CAPE_4388 = 4388 + const val TEAM_38_CAPE_4389 = 4389 + const val TEAM_38_CAPE_4390 = 4390 + const val TEAM_39_CAPE_4391 = 4391 + const val TEAM_39_CAPE_4392 = 4392 + const val TEAM_40_CAPE_4393 = 4393 + const val TEAM_40_CAPE_4394 = 4394 + const val TEAM_41_CAPE_4395 = 4395 + const val TEAM_41_CAPE_4396 = 4396 + const val TEAM_42_CAPE_4397 = 4397 + const val TEAM_42_CAPE_4398 = 4398 + const val TEAM_43_CAPE_4399 = 4399 + const val TEAM_43_CAPE_4400 = 4400 + const val TEAM_44_CAPE_4401 = 4401 + const val TEAM_44_CAPE_4402 = 4402 + const val TEAM_45_CAPE_4403 = 4403 + const val TEAM_45_CAPE_4404 = 4404 + const val TEAM_46_CAPE_4405 = 4405 + const val TEAM_46_CAPE_4406 = 4406 + const val TEAM_47_CAPE_4407 = 4407 + const val TEAM_47_CAPE_4408 = 4408 + const val TEAM_48_CAPE_4409 = 4409 + const val TEAM_48_CAPE_4410 = 4410 + const val TEAM_49_CAPE_4411 = 4411 + const val TEAM_49_CAPE_4412 = 4412 + const val TEAM_50_CAPE_4413 = 4413 + const val TEAM_50_CAPE_4414 = 4414 + const val BLUNT_AXE_4415 = 4415 + const val HERBAL_TINCTURE_4416 = 4416 + const val GUTHIX_REST4_4417 = 4417 + const val GUTHIX_REST4_4418 = 4418 + const val GUTHIX_REST3_4419 = 4419 + const val GUTHIX_REST3_4420 = 4420 + const val GUTHIX_REST2_4421 = 4421 + const val GUTHIX_REST2_4422 = 4422 + const val GUTHIX_REST1_4423 = 4423 + const val GUTHIX_REST1_4424 = 4424 + const val STODGY_MATTRESS_4425 = 4425 + const val COMFY_MATTRESS_4426 = 4426 + const val IRON_OXIDE_4427 = 4427 + const val ANIMATE_ROCK_SCROLL_4428 = 4428 + const val BROKEN_VANE_PART_4429 = 4429 + const val DIRECTIONALS_4430 = 4430 + const val BROKEN_VANE_PART_4431 = 4431 + const val ORNAMENT_4432 = 4432 + const val BROKEN_VANE_PART_4433 = 4433 + const val WEATHERVANE_PILLAR_4434 = 4434 + const val WEATHER_REPORT_4435 = 4435 + const val AIRTIGHT_POT_4436 = 4436 + const val AIRTIGHT_POT_4437 = 4437 + const val UNFIRED_POT_LID_4438 = 4438 + const val UNFIRED_POT_LID_4439 = 4439 + const val POT_LID_4440 = 4440 + const val POT_LID_4441 = 4441 + const val BREATHING_SALTS_4442 = 4442 + const val CHICKEN_CAGE_4443 = 4443 + const val SHARPENED_AXE_4444 = 4444 + const val RED_MAHOGANY_LOG_4445 = 4445 + const val STEEL_KEY_RING_4446 = 4446 + const val ANTIQUE_LAMP_4447 = 4447 + const val NULL_4448 = 4448 + const val NULL_4449 = 4449 + const val NULL_4450 = 4450 + const val NULL_4451 = 4451 + const val NULL_4452 = 4452 + const val NULL_4453 = 4453 + const val NULL_4454 = 4454 + const val NULL_4455 = 4455 + const val BOWL_OF_HOT_WATER_4456 = 4456 + const val BOWL_OF_HOT_WATER_4457 = 4457 + const val CUP_OF_WATER_4458 = 4458 + const val CUP_OF_WATER_4459 = 4459 + const val CUP_OF_HOT_WATER_4460 = 4460 + const val CUP_OF_HOT_WATER_4461 = 4461 + const val RUINED_HERB_TEA_4462 = 4462 + const val RUINED_HERB_TEA_4463 = 4463 + const val HERB_TEA_MIX_4464 = 4464 + const val HERB_TEA_MIX_4465 = 4465 + const val HERB_TEA_MIX_4466 = 4466 + const val HERB_TEA_MIX_4467 = 4467 + const val HERB_TEA_MIX_4468 = 4468 + const val HERB_TEA_MIX_4469 = 4469 + const val HERB_TEA_MIX_4470 = 4470 + const val HERB_TEA_MIX_4471 = 4471 + const val HERB_TEA_MIX_4472 = 4472 + const val HERB_TEA_MIX_4473 = 4473 + const val HERB_TEA_MIX_4474 = 4474 + const val HERB_TEA_MIX_4475 = 4475 + const val HERB_TEA_MIX_4476 = 4476 + const val HERB_TEA_MIX_4477 = 4477 + const val HERB_TEA_MIX_4478 = 4478 + const val HERB_TEA_MIX_4479 = 4479 + const val HERB_TEA_MIX_4480 = 4480 + const val HERB_TEA_MIX_4481 = 4481 + const val HERB_TEA_MIX_4482 = 4482 + const val HERB_TEA_MIX_4483 = 4483 + const val SAFETY_GUARANTEE_4484 = 4484 + const val WHITE_PEARL_4485 = 4485 + const val WHITE_PEARL_SEED_4486 = 4486 + const val HALF_A_ROCK_4487 = 4487 + const val CORPSE_OF_WOMAN_4488 = 4488 + const val ASLEIFS_NECKLACE_4489 = 4489 + const val MUD_4490 = 4490 + const val TINDERBOX_4491 = 4491 + const val MUDDY_ROCK_4492 = 4492 + const val TINDERBOX_4493 = 4493 + const val POLE_4494 = 4494 + const val POLE_4495 = 4495 + const val BROKEN_POLE_4496 = 4496 + const val TINDERBOX_4497 = 4497 + const val ROPE_4498 = 4498 + const val ROPE_4499 = 4499 + const val POLE_4500 = 4500 + const val POLE_4501 = 4501 + const val BEARHEAD_4502 = 4502 + const val DECORATIVE_SWORD_4503 = 4503 + const val DECORATIVE_ARMOUR_4504 = 4504 + const val DECORATIVE_ARMOUR_4505 = 4505 + const val DECORATIVE_HELM_4506 = 4506 + const val DECORATIVE_SHIELD_4507 = 4507 + const val DECORATIVE_SWORD_4508 = 4508 + const val DECORATIVE_ARMOUR_4509 = 4509 + const val DECORATIVE_ARMOUR_4510 = 4510 + const val DECORATIVE_HELM_4511 = 4511 + const val DECORATIVE_SHIELD_4512 = 4512 + const val CASTLEWARS_HOOD_4513 = 4513 + const val CASTLEWARS_CLOAK_4514 = 4514 + const val CASTLEWARS_HOOD_4515 = 4515 + const val CASTLEWARS_CLOAK_4516 = 4516 + const val GIANT_FROG_LEGS_4517 = 4517 + const val GIANT_FROG_LEGS_4518 = 4518 + const val SWAMP_WALLBEAST_4519 = 4519 + const val SWAMP_CAVE_SLIME_4520 = 4520 + const val SWAMP_CAVE_BUG_4521 = 4521 + const val OIL_LAMP_4522 = 4522 + const val OIL_LAMP_4523 = 4523 + const val OIL_LAMP_4524 = 4524 + const val OIL_LAMP_4525 = 4525 + const val OIL_LAMP_4526 = 4526 + const val CANDLE_LANTERN_4527 = 4527 + const val CANDLE_LANTERN_4528 = 4528 + const val CANDLE_LANTERN_4529 = 4529 + const val CANDLE_LANTERN_4530 = 4530 + const val CANDLE_LANTERN_4531 = 4531 + const val CANDLE_LANTERN_4532 = 4532 + const val CANDLE_LANTERN_4533 = 4533 + const val CANDLE_LANTERN_4534 = 4534 + const val OIL_LANTERN_4535 = 4535 + const val OIL_LANTERN_4536 = 4536 + const val OIL_LANTERN_4537 = 4537 + const val OIL_LANTERN_4538 = 4538 + const val OIL_LANTERN_4539 = 4539 + const val OIL_LANTERN_FRAME_4540 = 4540 + const val OIL_LANTERN_FRAME_4541 = 4541 + const val LANTERN_LENS_4542 = 4542 + const val LANTERN_LENS_4543 = 4543 + const val BULLSEYE_LANTERN_4544 = 4544 + const val BULLSEYE_LANTERN_4545 = 4545 + const val BULLSEYE_LANTERN_4546 = 4546 + const val BULLSEYE_LANTERN_4547 = 4547 + const val BULLSEYE_LANTERN_4548 = 4548 + const val BULLSEYE_LANTERN_4549 = 4549 + const val BULLSEYE_LANTERN_4550 = 4550 + const val SPINY_HELMET_4551 = 4551 + const val SPINY_HELMET_4552 = 4552 + const val NULL_4553 = 4553 + const val NULL_4554 = 4554 + const val NULL_4555 = 4555 + const val NULL_4556 = 4556 + const val NULL_4557 = 4557 + const val BLUE_SWEETS_4558 = 4558 + const val DEEP_BLUE_SWEETS_4559 = 4559 + const val WHITE_SWEETS_4560 = 4560 + const val PURPLE_SWEETS_4561 = 4561 + const val RED_SWEETS_4562 = 4562 + const val GREEN_SWEETS_4563 = 4563 + const val PINK_SWEETS_4564 = 4564 + const val BASKET_OF_EGGS_4565 = 4565 + const val RUBBER_CHICKEN_4566 = 4566 + const val GOLD_HELMET_4567 = 4567 + const val DWARVEN_LORE_4568 = 4568 + const val BOOK_PAGE_1_4569 = 4569 + const val BOOK_PAGE_2_4570 = 4570 + const val BOOK_PAGE_3_4571 = 4571 + const val PAGES_4572 = 4572 + const val PAGES_4573 = 4573 + const val BASE_SCHEMATICS_4574 = 4574 + const val SCHEMATIC_4575 = 4575 + const val SCHEMATICS_4576 = 4576 + const val SCHEMATICS_4577 = 4577 + const val SCHEMATIC_4578 = 4578 + const val CANNON_BALL_4579 = 4579 + const val BLACK_SPEAR_4580 = 4580 + const val BLACK_SPEAR_4581 = 4581 + const val BLACK_SPEARP_4582 = 4582 + const val BLACK_SPEARP_4583 = 4583 + const val BLACK_SPEARKP_4584 = 4584 + const val DRAGON_PLATESKIRT_4585 = 4585 + const val DRAGON_PLATESKIRT_4586 = 4586 + const val DRAGON_SCIMITAR_4587 = 4587 + const val DRAGON_SCIMITAR_4588 = 4588 + const val KEYS_4589 = 4589 + const val JEWELS_4590 = 4590 + const val KARIDIAN_HEADPIECE_4591 = 4591 + const val PICTURE_4592 = 4592 + const val FAKE_BEARD_4593 = 4593 + const val PICTURE_4594 = 4594 + const val KARIDIAN_DISGUISE_4595 = 4595 + const val PICTURE_4596 = 4596 + const val NOTE_4597 = 4597 + const val NOTE_4598 = 4598 + const val OAK_BLACKJACK_4599 = 4599 + const val WILLOW_BLACKJACK_4600 = 4600 + const val UGTHANKI_DUNG_4601 = 4601 + const val UGTHANKI_DUNG_4602 = 4602 + const val RECEIPT_4603 = 4603 + const val HAGS_POISON_4604 = 4604 + const val SNAKE_CHARM_4605 = 4605 + const val SNAKE_BASKET_4606 = 4606 + const val SNAKE_BASKET_FULL_4607 = 4607 + const val SUPER_KEBAB_4608 = 4608 + const val SUPER_KEBAB_4609 = 4609 + const val RED_HOT_SAUCE_4610 = 4610 + const val DESERT_DISGUISE_4611 = 4611 + const val WILLOW_BLACKJACK_4612 = 4612 + const val SPINNING_PLATE_4613 = 4613 + const val BROKEN_PLATE_4614 = 4614 + const val LETTER_4615 = 4615 + const val VARMENS_NOTES_4616 = 4616 + const val DISPLAY_CABINET_KEY_4617 = 4617 + const val STATUETTE_4618 = 4618 + const val STRANGE_IMPLEMENT_4619 = 4619 + const val BLACK_MUSHROOM_4620 = 4620 + const val PHOENIX_FEATHER_4621 = 4621 + const val BLACK_MUSHROOM_INK_4622 = 4622 + const val PHOENIX_QUILL_PEN_4623 = 4623 + const val GOLEM_PROGRAM_4624 = 4624 + const val BANDIT_4625 = 4625 + const val NULL_4626 = 4626 + const val BANDITS_BREW_4627 = 4627 + const val BANDITS_BREW_4628 = 4628 + const val NULL_4629 = 4629 + const val NULL_4630 = 4630 + const val NULL_4631 = 4631 + const val NULL_4632 = 4632 + const val NULL_4633 = 4633 + const val NULL_4634 = 4634 + const val NULL_4635 = 4635 + const val NULL_4636 = 4636 + const val NULL_4637 = 4637 + const val NULL_4638 = 4638 + const val NULL_4639 = 4639 + const val NULL_4640 = 4640 + const val NULL_4641 = 4641 + const val NULL_4642 = 4642 + const val NULL_4643 = 4643 + const val NULL_4644 = 4644 + const val NULL_4645 = 4645 + const val NULL_4646 = 4646 + const val NULL_4647 = 4647 + const val NULL_4648 = 4648 + const val NULL_4649 = 4649 + const val NULL_4650 = 4650 + const val NULL_4651 = 4651 + const val NULL_4652 = 4652 + const val FIRE_4653 = 4653 + const val ETCHINGS_4654 = 4654 + const val TRANSLATION_4655 = 4655 + const val WARM_KEY_4656 = 4656 + const val RING_OF_VISIBILITY_4657 = 4657 + const val SILVER_POT_4658 = 4658 + const val BLESSED_POT_4659 = 4659 + const val SILVER_POT_4660 = 4660 + const val BLESSED_POT_4661 = 4661 + const val SILVER_POT_4662 = 4662 + const val BLESSED_POT_4663 = 4663 + const val SILVER_POT_4664 = 4664 + const val BLESSED_POT_4665 = 4665 + const val SILVER_POT_4666 = 4666 + const val BLESSED_POT_4667 = 4667 + const val GARLIC_POWDER_4668 = 4668 + const val TINDERBOX_4669 = 4669 + const val BLOOD_DIAMOND_4670 = 4670 + const val ICE_DIAMOND_4671 = 4671 + const val SMOKE_DIAMOND_4672 = 4672 + const val SHADOW_DIAMOND_4673 = 4673 + const val GILDED_CROSS_4674 = 4674 + const val ANCIENT_STAFF_4675 = 4675 + const val ANCIENT_STAFF_4676 = 4676 + const val CATSPEAK_AMULET_4677 = 4677 + const val CANOPIC_JAR_4678 = 4678 + const val CANOPIC_JAR_4679 = 4679 + const val CANOPIC_JAR_4680 = 4680 + const val CANOPIC_JAR_4681 = 4681 + const val HOLY_SYMBOL_4682 = 4682 + const val UNHOLY_SYMBOL_4683 = 4683 + const val LINEN_4684 = 4684 + const val PICTURE_4685 = 4685 + const val EMBALMING_MANUAL_4686 = 4686 + const val BUCKET_OF_SAP_4687 = 4687 + const val TINDERBOX_4688 = 4688 + const val PILE_OF_SALT_4689 = 4689 + const val TINDERBOX_4690 = 4690 + const val SPHINXS_TOKEN_4691 = 4691 + const val GOLD_LEAF_4692 = 4692 + const val FULL_BUCKET_4693 = 4693 + const val STEAM_RUNE_4694 = 4694 + const val MIST_RUNE_4695 = 4695 + const val DUST_RUNE_4696 = 4696 + const val SMOKE_RUNE_4697 = 4697 + const val MUD_RUNE_4698 = 4698 + const val LAVA_RUNE_4699 = 4699 + const val SAPPHIRE_LANTERN_4700 = 4700 + const val SAPPHIRE_LANTERN_4701 = 4701 + const val SAPPHIRE_LANTERN_4702 = 4702 + const val MAGIC_STONE_4703 = 4703 + const val STONE_BOWL_4704 = 4704 + const val NULL_4705 = 4705 + const val NULL_4706 = 4706 + const val CRUMBLING_TOME_4707 = 4707 + const val AHRIMS_HOOD_4708 = 4708 + const val AHRIMS_HOOD_4709 = 4709 + const val AHRIMS_STAFF_4710 = 4710 + const val AHRIMS_STAFF_4711 = 4711 + const val AHRIMS_ROBETOP_4712 = 4712 + const val AHRIMS_ROBETOP_4713 = 4713 + const val AHRIMS_ROBESKIRT_4714 = 4714 + const val AHRIMS_ROBESKIRT_4715 = 4715 + const val DHAROKS_HELM_4716 = 4716 + const val DHAROKS_HELM_4717 = 4717 + const val DHAROKS_GREATAXE_4718 = 4718 + const val DHAROKS_GREATAXE_4719 = 4719 + const val DHAROKS_PLATEBODY_4720 = 4720 + const val DHAROKS_PLATEBODY_4721 = 4721 + const val DHAROKS_PLATELEGS_4722 = 4722 + const val DHAROKS_PLATELEGS_4723 = 4723 + const val GUTHANS_HELM_4724 = 4724 + const val GUTHANS_HELM_4725 = 4725 + const val GUTHANS_WARSPEAR_4726 = 4726 + const val GUTHANS_WARSPEAR_4727 = 4727 + const val GUTHANS_PLATEBODY_4728 = 4728 + const val GUTHANS_PLATEBODY_4729 = 4729 + const val GUTHANS_CHAINSKIRT_4730 = 4730 + const val GUTHANS_CHAINSKIRT_4731 = 4731 + const val KARILS_COIF_4732 = 4732 + const val KARILS_COIF_4733 = 4733 + const val KARILS_CROSSBOW_4734 = 4734 + const val KARILS_CROSSBOW_4735 = 4735 + const val KARILS_LEATHERTOP_4736 = 4736 + const val KARILS_LEATHERTOP_4737 = 4737 + const val KARILS_LEATHERSKIRT_4738 = 4738 + const val KARILS_LEATHERSKIRT_4739 = 4739 + const val BOLT_RACK_4740 = 4740 + const val NULL_4741 = 4741 + const val NULL_4742 = 4742 + const val NULL_4743 = 4743 + const val NULL_4744 = 4744 + const val TORAGS_HELM_4745 = 4745 + const val TORAGS_HELM_4746 = 4746 + const val TORAGS_HAMMERS_4747 = 4747 + const val TORAGS_HAMMERS_4748 = 4748 + const val TORAGS_PLATEBODY_4749 = 4749 + const val TORAGS_PLATEBODY_4750 = 4750 + const val TORAGS_PLATELEGS_4751 = 4751 + const val TORAGS_PLATELEGS_4752 = 4752 + const val VERACS_HELM_4753 = 4753 + const val VERACS_HELM_4754 = 4754 + const val VERACS_FLAIL_4755 = 4755 + const val VERACS_FLAIL_4756 = 4756 + const val VERACS_BRASSARD_4757 = 4757 + const val VERACS_BRASSARD_4758 = 4758 + const val VERACS_PLATESKIRT_4759 = 4759 + const val VERACS_PLATESKIRT_4760 = 4760 + const val NULL_4761 = 4761 + const val NULL_4762 = 4762 + const val NULL_4763 = 4763 + const val NULL_4764 = 4764 + const val NULL_4765 = 4765 + const val NULL_4766 = 4766 + const val NULL_4767 = 4767 + const val NULL_4768 = 4768 + const val NULL_4769 = 4769 + const val NULL_4770 = 4770 + const val NULL_4771 = 4771 + const val NULL_4772 = 4772 + const val BRONZE_BRUTAL_4773 = 4773 + const val NULL_4774 = 4774 + const val NULL_4775 = 4775 + const val NULL_4776 = 4776 + const val NULL_4777 = 4777 + const val IRON_BRUTAL_4778 = 4778 + const val NULL_4779 = 4779 + const val NULL_4780 = 4780 + const val NULL_4781 = 4781 + const val NULL_4782 = 4782 + const val STEEL_BRUTAL_4783 = 4783 + const val NULL_4784 = 4784 + const val NULL_4785 = 4785 + const val NULL_4786 = 4786 + const val NULL_4787 = 4787 + const val BLACK_BRUTAL_4788 = 4788 + const val NULL_4789 = 4789 + const val NULL_4790 = 4790 + const val NULL_4791 = 4791 + const val NULL_4792 = 4792 + const val MITHRIL_BRUTAL_4793 = 4793 + const val NULL_4794 = 4794 + const val NULL_4795 = 4795 + const val NULL_4796 = 4796 + const val NULL_4797 = 4797 + const val ADAMANT_BRUTAL_4798 = 4798 + const val NULL_4799 = 4799 + const val NULL_4800 = 4800 + const val NULL_4801 = 4801 + const val NULL_4802 = 4802 + const val RUNE_BRUTAL_4803 = 4803 + const val NULL_4804 = 4804 + const val NULL_4805 = 4805 + const val NULL_4806 = 4806 + const val NULL_4807 = 4807 + const val BLACK_PRISM_4808 = 4808 + const val TORN_PAGE_4809 = 4809 + const val RUINED_BACKPACK_4810 = 4810 + const val DRAGON_INN_TANKARD_4811 = 4811 + const val ZOGRE_BONES_4812 = 4812 + const val ZOGRE_BONES_4813 = 4813 + const val SITHIK_PORTRAIT_4814 = 4814 + const val SITHIK_PORTRAIT_4815 = 4815 + const val SIGNED_PORTRAIT_4816 = 4816 + const val BOOK_OF_PORTRAITURE_4817 = 4817 + const val OGRE_ARTEFACT_4818 = 4818 + const val BRONZE_NAILS_4819 = 4819 + const val IRON_NAILS_4820 = 4820 + const val BLACK_NAILS_4821 = 4821 + const val MITHRIL_NAILS_4822 = 4822 + const val ADAMANTITE_NAILS_4823 = 4823 + const val RUNE_NAILS_4824 = 4824 + const val UNSTRUNG_COMP_BOW_4825 = 4825 + const val UNSTRUNG_COMP_BOW_4826 = 4826 + const val COMP_OGRE_BOW_4827 = 4827 + const val COMP_OGRE_BOW_4828 = 4828 + const val BOOK_OF_HAM_4829 = 4829 + const val FAYRG_BONES_4830 = 4830 + const val FAYRG_BONES_4831 = 4831 + const val RAURG_BONES_4832 = 4832 + const val RAURG_BONES_4833 = 4833 + const val OURG_BONES_4834 = 4834 + const val OURG_BONES_4835 = 4835 + const val STRANGE_POTION_4836 = 4836 + const val NECROMANCY_BOOK_4837 = 4837 + const val CUP_OF_TEA_4838 = 4838 + const val OGRE_GATE_KEY_4839 = 4839 + const val ROGUES_PURSE_POTIONUNF_4840 = 4840 + const val ROGUES_PURSE_POTIONUNF_4841 = 4841 + const val RELICYMS_BALM4_4842 = 4842 + const val RELICYMS_BALM4_4843 = 4843 + const val RELICYMS_BALM3_4844 = 4844 + const val RELICYMS_BALM3_4845 = 4845 + const val RELICYMS_BALM2_4846 = 4846 + const val RELICYMS_BALM2_4847 = 4847 + const val RELICYMS_BALM1_4848 = 4848 + const val RELICYMS_BALM1_4849 = 4849 + const val OGRE_COFFIN_KEY_4850 = 4850 + const val OGRE_COFFIN_KEY_4851 = 4851 + const val BONEMEAL_4852 = 4852 + const val BONEMEAL_4853 = 4853 + const val BONEMEAL_4854 = 4854 + const val BONEMEAL_4855 = 4855 + const val AHRIMS_HOOD_100_4856 = 4856 + const val AHRIMS_HOOD_75_4857 = 4857 + const val AHRIMS_HOOD_50_4858 = 4858 + const val AHRIMS_HOOD_25_4859 = 4859 + const val AHRIMS_HOOD_0_4860 = 4860 + const val AHRIMS_HOOD_0_4861 = 4861 + const val AHRIMS_STAFF_100_4862 = 4862 + const val AHRIMS_STAFF_75_4863 = 4863 + const val AHRIMS_STAFF_50_4864 = 4864 + const val AHRIMS_STAFF_25_4865 = 4865 + const val AHRIMS_STAFF_0_4866 = 4866 + const val AHRIMS_STAFF_0_4867 = 4867 + const val AHRIMS_TOP_100_4868 = 4868 + const val AHRIMS_TOP_75_4869 = 4869 + const val AHRIMS_TOP_50_4870 = 4870 + const val AHRIMS_TOP_25_4871 = 4871 + const val AHRIMS_TOP_0_4872 = 4872 + const val AHRIMS_TOP_0_4873 = 4873 + const val AHRIMS_SKIRT_100_4874 = 4874 + const val AHRIMS_SKIRT_75_4875 = 4875 + const val AHRIMS_SKIRT_50_4876 = 4876 + const val AHRIMS_SKIRT_25_4877 = 4877 + const val AHRIMS_SKIRT_0_4878 = 4878 + const val AHRIMS_SKIRT_0_4879 = 4879 + const val DHAROKS_HELM_100_4880 = 4880 + const val DHAROKS_HELM_75_4881 = 4881 + const val DHAROKS_HELM_50_4882 = 4882 + const val DHAROKS_HELM_25_4883 = 4883 + const val DHAROKS_HELM_0_4884 = 4884 + const val DHAROKS_HELM_0_4885 = 4885 + const val DHAROKS_AXE_100_4886 = 4886 + const val DHAROKS_AXE_75_4887 = 4887 + const val DHAROKS_AXE_50_4888 = 4888 + const val DHAROKS_AXE_25_4889 = 4889 + const val DHAROKS_AXE_0_4890 = 4890 + const val DHAROKS_AXE_0_4891 = 4891 + const val DHAROKS_BODY_100_4892 = 4892 + const val DHAROKS_BODY_75_4893 = 4893 + const val DHAROKS_BODY_50_4894 = 4894 + const val DHAROKS_BODY_25_4895 = 4895 + const val DHAROKS_BODY_0_4896 = 4896 + const val DHAROKS_BODY_0_4897 = 4897 + const val DHAROKS_LEGS_100_4898 = 4898 + const val DHAROKS_LEGS_75_4899 = 4899 + const val DHAROKS_LEGS_50_4900 = 4900 + const val DHAROKS_LEGS_25_4901 = 4901 + const val DHAROKS_LEGS_0_4902 = 4902 + const val DHAROKS_LEGS_0_4903 = 4903 + const val GUTHANS_HELM_100_4904 = 4904 + const val GUTHANS_HELM_75_4905 = 4905 + const val GUTHANS_HELM_50_4906 = 4906 + const val GUTHANS_HELM_25_4907 = 4907 + const val GUTHANS_HELM_0_4908 = 4908 + const val GUTHANS_HELM_0_4909 = 4909 + const val GUTHANS_SPEAR_100_4910 = 4910 + const val GUTHANS_SPEAR_75_4911 = 4911 + const val GUTHANS_SPEAR_50_4912 = 4912 + const val GUTHANS_SPEAR_25_4913 = 4913 + const val GUTHANS_SPEAR_0_4914 = 4914 + const val GUTHANS_SPEAR_0_4915 = 4915 + const val GUTHANS_BODY_100_4916 = 4916 + const val GUTHANS_BODY_75_4917 = 4917 + const val GUTHANS_BODY_50_4918 = 4918 + const val GUTHANS_BODY_25_4919 = 4919 + const val GUTHANS_BODY_0_4920 = 4920 + const val GUTHANS_BODY_0_4921 = 4921 + const val GUTHANS_SKIRT_100_4922 = 4922 + const val GUTHANS_SKIRT_75_4923 = 4923 + const val GUTHANS_SKIRT_50_4924 = 4924 + const val GUTHANS_SKIRT_25_4925 = 4925 + const val GUTHANS_SKIRT_0_4926 = 4926 + const val GUTHANS_SKIRT_0_4927 = 4927 + const val KARILS_COIF_100_4928 = 4928 + const val KARILS_COIF_75_4929 = 4929 + const val KARILS_COIF_50_4930 = 4930 + const val KARILS_COIF_25_4931 = 4931 + const val KARILS_COIF_0_4932 = 4932 + const val KARILS_COIF_0_4933 = 4933 + const val KARILS_X_BOW_100_4934 = 4934 + const val KARILS_X_BOW_75_4935 = 4935 + const val KARILS_X_BOW_50_4936 = 4936 + const val KARILS_X_BOW_25_4937 = 4937 + const val KARILS_X_BOW_0_4938 = 4938 + const val KARILS_X_BOW_0_4939 = 4939 + const val KARILS_TOP_100_4940 = 4940 + const val KARILS_TOP_75_4941 = 4941 + const val KARILS_TOP_50_4942 = 4942 + const val KARILS_TOP_25_4943 = 4943 + const val KARILS_TOP_0_4944 = 4944 + const val KARILS_TOP_0_4945 = 4945 + const val KARILS_SKIRT_100_4946 = 4946 + const val KARILS_SKIRT_75_4947 = 4947 + const val KARILS_SKIRT_50_4948 = 4948 + const val KARILS_SKIRT_25_4949 = 4949 + const val KARILS_SKIRT_0_4950 = 4950 + const val KARILS_SKIRT_0_4951 = 4951 + const val TORAGS_HELM_100_4952 = 4952 + const val TORAGS_HELM_75_4953 = 4953 + const val TORAGS_HELM_50_4954 = 4954 + const val TORAGS_HELM_25_4955 = 4955 + const val TORAGS_HELM_0_4956 = 4956 + const val TORAGS_HELM_0_4957 = 4957 + const val TORAGS_HAMMER_100_4958 = 4958 + const val TORAGS_HAMMER_75_4959 = 4959 + const val TORAGS_HAMMER_50_4960 = 4960 + const val TORAGS_HAMMER_25_4961 = 4961 + const val TORAGS_HAMMER_0_4962 = 4962 + const val TORAGS_HAMMER_0_4963 = 4963 + const val TORAGS_BODY_100_4964 = 4964 + const val TORAGS_BODY_75_4965 = 4965 + const val TORAGS_BODY_50_4966 = 4966 + const val TORAGS_BODY_25_4967 = 4967 + const val TORAGS_BODY_0_4968 = 4968 + const val TORAGS_BODY_0_4969 = 4969 + const val TORAGS_LEGS_100_4970 = 4970 + const val TORAGS_LEGS_75_4971 = 4971 + const val TORAGS_LEGS_50_4972 = 4972 + const val TORAGS_LEGS_25_4973 = 4973 + const val TORAGS_LEGS_0_4974 = 4974 + const val TORAGS_LEGS_0_4975 = 4975 + const val VERACS_HELM_100_4976 = 4976 + const val VERACS_HELM_75_4977 = 4977 + const val VERACS_HELM_50_4978 = 4978 + const val VERACS_HELM_25_4979 = 4979 + const val VERACS_HELM_0_4980 = 4980 + const val VERACS_HELM_0_4981 = 4981 + const val VERACS_FLAIL_100_4982 = 4982 + const val VERACS_FLAIL_75_4983 = 4983 + const val VERACS_FLAIL_50_4984 = 4984 + const val VERACS_FLAIL_25_4985 = 4985 + const val VERACS_FLAIL_0_4986 = 4986 + const val VERACS_FLAIL_0_4987 = 4987 + const val VERACS_TOP_100_4988 = 4988 + const val VERACS_TOP_75_4989 = 4989 + const val VERACS_TOP_50_4990 = 4990 + const val VERACS_TOP_25_4991 = 4991 + const val VERACS_TOP_0_4992 = 4992 + const val VERACS_TOP_0_4993 = 4993 + const val VERACS_SKIRT_100_4994 = 4994 + const val VERACS_SKIRT_75_4995 = 4995 + const val VERACS_SKIRT_50_4996 = 4996 + const val VERACS_SKIRT_25_4997 = 4997 + const val VERACS_SKIRT_0_4998 = 4998 + const val VERACS_SKIRT_0_4999 = 4999 + const val NULL_5000 = 5000 + const val RAW_CAVE_EEL_5001 = 5001 + const val BURNT_CAVE_EEL_5002 = 5002 + const val CAVE_EEL_5003 = 5003 + const val FROG_SPAWN_5004 = 5004 + const val RAW_CAVE_EEL_5005 = 5005 + const val BURNT_CAVE_EEL_5006 = 5006 + const val CAVE_EEL_5007 = 5007 + const val BROOCH_5008 = 5008 + const val GOBLIN_SYMBOL_BOOK_5009 = 5009 + const val KEY_5010 = 5010 + const val SILVERWARE_5011 = 5011 + const val PEACE_TREATY_5012 = 5012 + const val MINING_HELMET_5013 = 5013 + const val MINING_HELMET_5014 = 5014 + const val MINING_HELMET_5015 = 5015 + const val BONE_SPEAR_5016 = 5016 + const val BONE_SPEAR_5017 = 5017 + const val BONE_CLUB_5018 = 5018 + const val BONE_CLUB_5019 = 5019 + const val MINECART_TICKET_5020 = 5020 + const val MINECART_TICKET_5021 = 5021 + const val MINECART_TICKET_5022 = 5022 + const val MINECART_TICKET_5023 = 5023 + const val WOVEN_TOP_5024 = 5024 + const val WOVEN_TOP_5025 = 5025 + const val WOVEN_TOP_5026 = 5026 + const val WOVEN_TOP_5027 = 5027 + const val WOVEN_TOP_5028 = 5028 + const val WOVEN_TOP_5029 = 5029 + const val SHIRT_5030 = 5030 + const val SHIRT_5031 = 5031 + const val SHIRT_5032 = 5032 + const val SHIRT_5033 = 5033 + const val SHIRT_5034 = 5034 + const val SHIRT_5035 = 5035 + const val TROUSERS_5036 = 5036 + const val TROUSERS_5037 = 5037 + const val TROUSERS_5038 = 5038 + const val TROUSERS_5039 = 5039 + const val TROUSERS_5040 = 5040 + const val TROUSERS_5041 = 5041 + const val SHORTS_5042 = 5042 + const val SHORTS_5043 = 5043 + const val SHORTS_5044 = 5044 + const val SHORTS_5045 = 5045 + const val SHORTS_5046 = 5046 + const val SHORTS_5047 = 5047 + const val SKIRT_5048 = 5048 + const val SKIRT_5049 = 5049 + const val SKIRT_5050 = 5050 + const val SKIRT_5051 = 5051 + const val SKIRT_5052 = 5052 + const val SKIRT_5053 = 5053 + const val DWARF_5054 = 5054 + const val DWARF_5055 = 5055 + const val DWARVEN_BATTLEAXE_5056 = 5056 + const val DWARVEN_BATTLEAXE_5057 = 5057 + const val DWARVEN_BATTLEAXE_5058 = 5058 + const val DWARVEN_BATTLEAXE_5059 = 5059 + const val DWARVEN_BATTLEAXE_5060 = 5060 + const val DWARVEN_BATTLEAXE_5061 = 5061 + const val LEFT_BOOT_5062 = 5062 + const val RIGHT_BOOT_5063 = 5063 + const val EXQUISITE_BOOTS_5064 = 5064 + const val BOOK_ON_COSTUMES_5065 = 5065 + const val MEETING_NOTES_5066 = 5066 + const val EXQUISITE_CLOTHES_5067 = 5067 + const val MASTER_FARMER_5068 = 5068 + const val NULL_5069 = 5069 + const val BIRDS_NEST_5070 = 5070 + const val BIRDS_NEST_5071 = 5071 + const val BIRDS_NEST_5072 = 5072 + const val BIRDS_NEST_5073 = 5073 + const val BIRDS_NEST_5074 = 5074 + const val BIRDS_NEST_5075 = 5075 + const val BIRDS_EGG_5076 = 5076 + const val BIRDS_EGG_5077 = 5077 + const val BIRDS_EGG_5078 = 5078 + const val NULL_5079 = 5079 + const val NULL_5080 = 5080 + const val NULL_5081 = 5081 + const val NULL_5082 = 5082 + const val NULL_5083 = 5083 + const val NULL_5084 = 5084 + const val NULL_5085 = 5085 + const val NULL_5086 = 5086 + const val NULL_5087 = 5087 + const val NULL_5088 = 5088 + const val NULL_5089 = 5089 + const val NULL_5090 = 5090 + const val NULL_5091 = 5091 + const val NULL_5092 = 5092 + const val NULL_5093 = 5093 + const val NULL_5094 = 5094 + const val NULL_5095 = 5095 + const val MARIGOLD_SEED_5096 = 5096 + const val ROSEMARY_SEED_5097 = 5097 + const val NASTURTIUM_SEED_5098 = 5098 + const val WOAD_SEED_5099 = 5099 + const val LIMPWURT_SEED_5100 = 5100 + const val REDBERRY_SEED_5101 = 5101 + const val CADAVABERRY_SEED_5102 = 5102 + const val DWELLBERRY_SEED_5103 = 5103 + const val JANGERBERRY_SEED_5104 = 5104 + const val WHITEBERRY_SEED_5105 = 5105 + const val POISON_IVY_SEED_5106 = 5106 + const val NULL_5107 = 5107 + const val NULL_5108 = 5108 + const val NULL_5109 = 5109 + const val NULL_5110 = 5110 + const val NULL_5111 = 5111 + const val NULL_5112 = 5112 + const val NULL_5113 = 5113 + const val NULL_5114 = 5114 + const val NULL_5115 = 5115 + const val NULL_5116 = 5116 + const val NULL_5117 = 5117 + const val NULL_5118 = 5118 + const val NULL_5119 = 5119 + const val NULL_5120 = 5120 + const val NULL_5121 = 5121 + const val NULL_5122 = 5122 + const val NULL_5123 = 5123 + const val NULL_5124 = 5124 + const val NULL_5125 = 5125 + const val NULL_5126 = 5126 + const val NULL_5127 = 5127 + const val NULL_5128 = 5128 + const val NULL_5129 = 5129 + const val NULL_5130 = 5130 + const val NULL_5131 = 5131 + const val NULL_5132 = 5132 + const val NULL_5133 = 5133 + const val NULL_5134 = 5134 + const val NULL_5135 = 5135 + const val NULL_5136 = 5136 + const val NULL_5137 = 5137 + const val NULL_5138 = 5138 + const val NULL_5139 = 5139 + const val NULL_5140 = 5140 + const val NULL_5141 = 5141 + const val NULL_5142 = 5142 + const val NULL_5143 = 5143 + const val NULL_5144 = 5144 + const val NULL_5145 = 5145 + const val NULL_5146 = 5146 + const val NULL_5147 = 5147 + const val NULL_5148 = 5148 + const val NULL_5149 = 5149 + const val NULL_5150 = 5150 + const val NULL_5151 = 5151 + const val NULL_5152 = 5152 + const val NULL_5153 = 5153 + const val NULL_5154 = 5154 + const val NULL_5155 = 5155 + const val NULL_5156 = 5156 + const val NULL_5157 = 5157 + const val NULL_5158 = 5158 + const val NULL_5159 = 5159 + const val NULL_5160 = 5160 + const val NULL_5161 = 5161 + const val NULL_5162 = 5162 + const val NULL_5163 = 5163 + const val NULL_5164 = 5164 + const val NULL_5165 = 5165 + const val NULL_5166 = 5166 + const val NULL_5167 = 5167 + const val NULL_5168 = 5168 + const val NULL_5169 = 5169 + const val NULL_5170 = 5170 + const val SEEDS_5171 = 5171 + const val NULL_5172 = 5172 + const val NULL_5173 = 5173 + const val NULL_5174 = 5174 + const val NULL_5175 = 5175 + const val NULL_5176 = 5176 + const val NULL_5177 = 5177 + const val NULL_5178 = 5178 + const val NULL_5179 = 5179 + const val NULL_5180 = 5180 + const val NULL_5181 = 5181 + const val NULL_5182 = 5182 + const val NULL_5183 = 5183 + const val NULL_5184 = 5184 + const val NULL_5185 = 5185 + const val NULL_5186 = 5186 + const val NULL_5187 = 5187 + const val NULL_5188 = 5188 + const val NULL_5189 = 5189 + const val NULL_5190 = 5190 + const val NULL_5191 = 5191 + const val NULL_5192 = 5192 + const val NULL_5193 = 5193 + const val NULL_5194 = 5194 + const val NULL_5195 = 5195 + const val NULL_5196 = 5196 + const val NULL_5197 = 5197 + const val NULL_5198 = 5198 + const val NULL_5199 = 5199 + const val NULL_5200 = 5200 + const val NULL_5201 = 5201 + const val NULL_5202 = 5202 + const val NULL_5203 = 5203 + const val NULL_5204 = 5204 + const val NULL_5205 = 5205 + const val NULL_5206 = 5206 + const val NULL_5207 = 5207 + const val NULL_5208 = 5208 + const val NULL_5209 = 5209 + const val NULL_5210 = 5210 + const val NULL_5211 = 5211 + const val NULL_5212 = 5212 + const val NULL_5213 = 5213 + const val NULL_5214 = 5214 + const val NULL_5215 = 5215 + const val NULL_5216 = 5216 + const val NULL_5217 = 5217 + const val NULL_5218 = 5218 + const val NULL_5219 = 5219 + const val NULL_5220 = 5220 + const val NULL_5221 = 5221 + const val NULL_5222 = 5222 + const val NULL_5223 = 5223 + const val NULL_5224 = 5224 + const val NULL_5225 = 5225 + const val NULL_5226 = 5226 + const val NULL_5227 = 5227 + const val NULL_5228 = 5228 + const val NULL_5229 = 5229 + const val NULL_5230 = 5230 + const val NULL_5231 = 5231 + const val NULL_5232 = 5232 + const val NULL_5233 = 5233 + const val NULL_5234 = 5234 + const val NULL_5235 = 5235 + const val NULL_5236 = 5236 + const val NULL_5237 = 5237 + const val NULL_5238 = 5238 + const val NULL_5239 = 5239 + const val NULL_5240 = 5240 + const val NULL_5241 = 5241 + const val NULL_5242 = 5242 + const val NULL_5243 = 5243 + const val NULL_5244 = 5244 + const val NULL_5245 = 5245 + const val NULL_5246 = 5246 + const val NULL_5247 = 5247 + const val NULL_5248 = 5248 + const val NULL_5249 = 5249 + const val NULL_5250 = 5250 + const val NULL_5251 = 5251 + const val NULL_5252 = 5252 + const val NULL_5253 = 5253 + const val NULL_5254 = 5254 + const val NULL_5255 = 5255 + const val NULL_5256 = 5256 + const val NULL_5257 = 5257 + const val NULL_5258 = 5258 + const val NULL_5259 = 5259 + const val NULL_5260 = 5260 + const val NULL_5261 = 5261 + const val NULL_5262 = 5262 + const val NULL_5263 = 5263 + const val NULL_5264 = 5264 + const val NULL_5265 = 5265 + const val NULL_5266 = 5266 + const val NULL_5267 = 5267 + const val NULL_5268 = 5268 + const val NULL_5269 = 5269 + const val NULL_5270 = 5270 + const val NULL_5271 = 5271 + const val NULL_5272 = 5272 + const val NULL_5273 = 5273 + const val NULL_5274 = 5274 + const val NULL_5275 = 5275 + const val NULL_5276 = 5276 + const val NULL_5277 = 5277 + const val NULL_5278 = 5278 + const val NULL_5279 = 5279 + const val CACTUS_SEED_5280 = 5280 + const val BELLADONNA_SEED_5281 = 5281 + const val MUSHROOM_SPORE_5282 = 5282 + const val APPLE_TREE_SEED_5283 = 5283 + const val BANANA_TREE_SEED_5284 = 5284 + const val ORANGE_TREE_SEED_5285 = 5285 + const val CURRY_TREE_SEED_5286 = 5286 + const val PINEAPPLE_SEED_5287 = 5287 + const val PAPAYA_TREE_SEED_5288 = 5288 + const val PALM_TREE_SEED_5289 = 5289 + const val CALQUAT_TREE_SEED_5290 = 5290 + const val GUAM_SEED_5291 = 5291 + const val MARRENTILL_SEED_5292 = 5292 + const val TARROMIN_SEED_5293 = 5293 + const val HARRALANDER_SEED_5294 = 5294 + const val RANARR_SEED_5295 = 5295 + const val TOADFLAX_SEED_5296 = 5296 + const val IRIT_SEED_5297 = 5297 + const val AVANTOE_SEED_5298 = 5298 + const val KWUARM_SEED_5299 = 5299 + const val SNAPDRAGON_SEED_5300 = 5300 + const val CADANTINE_SEED_5301 = 5301 + const val LANTADYME_SEED_5302 = 5302 + const val DWARF_WEED_SEED_5303 = 5303 + const val TORSTOL_SEED_5304 = 5304 + const val BARLEY_SEED_5305 = 5305 + const val JUTE_SEED_5306 = 5306 + const val HAMMERSTONE_SEED_5307 = 5307 + const val ASGARNIAN_SEED_5308 = 5308 + const val YANILLIAN_SEED_5309 = 5309 + const val KRANDORIAN_SEED_5310 = 5310 + const val WILDBLOOD_SEED_5311 = 5311 + const val ACORN_5312 = 5312 + const val WILLOW_SEED_5313 = 5313 + const val MAPLE_SEED_5314 = 5314 + const val YEW_SEED_5315 = 5315 + const val MAGIC_SEED_5316 = 5316 + const val SPIRIT_SEED_5317 = 5317 + const val POTATO_SEED_5318 = 5318 + const val ONION_SEED_5319 = 5319 + const val SWEETCORN_SEED_5320 = 5320 + const val WATERMELON_SEED_5321 = 5321 + const val TOMATO_SEED_5322 = 5322 + const val STRAWBERRY_SEED_5323 = 5323 + const val CABBAGE_SEED_5324 = 5324 + const val GARDENING_TROWEL_5325 = 5325 + const val GARDENING_TROWEL_5326 = 5326 + const val SPADE_HANDLE_5327 = 5327 + const val SPADE_HEAD_5328 = 5328 + const val SECATEURS_5329 = 5329 + const val SECATEURS_5330 = 5330 + const val WATERING_CAN_5331 = 5331 + const val WATERING_CAN_5332 = 5332 + const val WATERING_CAN1_5333 = 5333 + const val WATERING_CAN2_5334 = 5334 + const val WATERING_CAN3_5335 = 5335 + const val WATERING_CAN4_5336 = 5336 + const val WATERING_CAN5_5337 = 5337 + const val WATERING_CAN6_5338 = 5338 + const val WATERING_CAN7_5339 = 5339 + const val WATERING_CAN8_5340 = 5340 + const val RAKE_5341 = 5341 + const val RAKE_5342 = 5342 + const val SEED_DIBBER_5343 = 5343 + const val SEED_DIBBER_5344 = 5344 + const val GARDENING_BOOTS_5345 = 5345 + const val GARDENING_BOOTS_5346 = 5346 + const val RAKE_HANDLE_5347 = 5347 + const val RAKE_HEAD_5348 = 5348 + const val NULL_5349 = 5349 + const val PLANT_POT_5350 = 5350 + const val PLANT_POT_5351 = 5351 + const val UNFIRED_PLANT_POT_5352 = 5352 + const val UNFIRED_PLANT_POT_5353 = 5353 + const val PLANT_POT_5354 = 5354 + const val PLANT_POT_5355 = 5355 + const val PLANT_POT_5356 = 5356 + const val PLANT_POT_5357 = 5357 + const val OAK_SEEDLING_5358 = 5358 + const val WILLOW_SEEDLING_5359 = 5359 + const val MAPLE_SEEDLING_5360 = 5360 + const val YEW_SEEDLING_5361 = 5361 + const val MAGIC_SEEDLING_5362 = 5362 + const val SPIRIT_SEEDLING_5363 = 5363 + const val OAK_SEEDLING_5364 = 5364 + const val WILLOW_SEEDLING_5365 = 5365 + const val MAPLE_SEEDLING_5366 = 5366 + const val YEW_SEEDLING_5367 = 5367 + const val MAGIC_SEEDLING_5368 = 5368 + const val SPIRIT_SEEDLING_5369 = 5369 + const val OAK_SAPLING_5370 = 5370 + const val WILLOW_SAPLING_5371 = 5371 + const val MAPLE_SAPLING_5372 = 5372 + const val YEW_SAPLING_5373 = 5373 + const val MAGIC_SAPLING_5374 = 5374 + const val SPIRIT_SAPLING_5375 = 5375 + const val BASKET_5376 = 5376 + const val BASKET_5377 = 5377 + const val APPLES1_5378 = 5378 + const val APPLES1_5379 = 5379 + const val APPLES2_5380 = 5380 + const val APPLES2_5381 = 5381 + const val APPLES3_5382 = 5382 + const val APPLES3_5383 = 5383 + const val APPLES4_5384 = 5384 + const val APPLES4_5385 = 5385 + const val APPLES5_5386 = 5386 + const val APPLES5_5387 = 5387 + const val ORANGES1_5388 = 5388 + const val ORANGES1_5389 = 5389 + const val ORANGES2_5390 = 5390 + const val ORANGES2_5391 = 5391 + const val ORANGES3_5392 = 5392 + const val ORANGES3_5393 = 5393 + const val ORANGES4_5394 = 5394 + const val ORANGES4_5395 = 5395 + const val ORANGES5_5396 = 5396 + const val ORANGES5_5397 = 5397 + const val STRAWBERRIES1_5398 = 5398 + const val STRAWBERRIES1_5399 = 5399 + const val STRAWBERRIES2_5400 = 5400 + const val STRAWBERRIES2_5401 = 5401 + const val STRAWBERRIES3_5402 = 5402 + const val STRAWBERRIES3_5403 = 5403 + const val STRAWBERRIES4_5404 = 5404 + const val STRAWBERRIES4_5405 = 5405 + const val STRAWBERRIES5_5406 = 5406 + const val STRAWBERRIES5_5407 = 5407 + const val BANANAS1_5408 = 5408 + const val BANANAS1_5409 = 5409 + const val BANANAS2_5410 = 5410 + const val BANANAS2_5411 = 5411 + const val BANANAS3_5412 = 5412 + const val BANANAS3_5413 = 5413 + const val BANANAS4_5414 = 5414 + const val BANANAS4_5415 = 5415 + const val BANANAS5_5416 = 5416 + const val BANANAS5_5417 = 5417 + const val EMPTY_SACK_5418 = 5418 + const val EMPTY_SACK_5419 = 5419 + const val POTATOES1_5420 = 5420 + const val POTATOES1_5421 = 5421 + const val POTATOES2_5422 = 5422 + const val POTATOES2_5423 = 5423 + const val POTATOES3_5424 = 5424 + const val POTATOES3_5425 = 5425 + const val POTATOES4_5426 = 5426 + const val POTATOES4_5427 = 5427 + const val POTATOES5_5428 = 5428 + const val POTATOES5_5429 = 5429 + const val POTATOES6_5430 = 5430 + const val POTATOES6_5431 = 5431 + const val POTATOES7_5432 = 5432 + const val POTATOES7_5433 = 5433 + const val POTATOES8_5434 = 5434 + const val POTATOES8_5435 = 5435 + const val POTATOES9_5436 = 5436 + const val POTATOES9_5437 = 5437 + const val POTATOES10_5438 = 5438 + const val POTATOES10_5439 = 5439 + const val ONIONS1_5440 = 5440 + const val ONIONS1_5441 = 5441 + const val ONIONS2_5442 = 5442 + const val ONIONS2_5443 = 5443 + const val ONIONS3_5444 = 5444 + const val ONIONS3_5445 = 5445 + const val ONIONS4_5446 = 5446 + const val ONIONS4_5447 = 5447 + const val ONIONS5_5448 = 5448 + const val ONIONS5_5449 = 5449 + const val ONIONS6_5450 = 5450 + const val ONIONS6_5451 = 5451 + const val ONIONS7_5452 = 5452 + const val ONIONS7_5453 = 5453 + const val ONIONS8_5454 = 5454 + const val ONIONS8_5455 = 5455 + const val ONIONS9_5456 = 5456 + const val ONIONS9_5457 = 5457 + const val ONIONS10_5458 = 5458 + const val ONIONS10_5459 = 5459 + const val CABBAGES1_5460 = 5460 + const val CABBAGES1_5461 = 5461 + const val CABBAGES2_5462 = 5462 + const val CABBAGES2_5463 = 5463 + const val CABBAGES3_5464 = 5464 + const val CABBAGES3_5465 = 5465 + const val CABBAGES4_5466 = 5466 + const val CABBAGES4_5467 = 5467 + const val CABBAGES5_5468 = 5468 + const val CABBAGES5_5469 = 5469 + const val CABBAGES6_5470 = 5470 + const val CABBAGES6_5471 = 5471 + const val CABBAGES7_5472 = 5472 + const val CABBAGES7_5473 = 5473 + const val CABBAGES8_5474 = 5474 + const val CABBAGES8_5475 = 5475 + const val CABBAGES9_5476 = 5476 + const val CABBAGES9_5477 = 5477 + const val CABBAGES10_5478 = 5478 + const val CABBAGES10_5479 = 5479 + const val APPLE_SEEDLING_5480 = 5480 + const val BANANA_SEEDLING_5481 = 5481 + const val ORANGE_SEEDLING_5482 = 5482 + const val CURRY_SEEDLING_5483 = 5483 + const val PINEAPPLE_SEEDLING_5484 = 5484 + const val PAPAYA_SEEDLING_5485 = 5485 + const val PALM_SEEDLING_5486 = 5486 + const val CALQUAT_SEEDLING_5487 = 5487 + const val APPLE_SEEDLING_5488 = 5488 + const val BANANA_SEEDLING_5489 = 5489 + const val ORANGE_SEEDLING_5490 = 5490 + const val CURRY_SEEDLING_5491 = 5491 + const val PINEAPPLE_SEEDLING_5492 = 5492 + const val PAPAYA_SEEDLING_5493 = 5493 + const val PALM_SEEDLING_5494 = 5494 + const val CALQUAT_SEEDLING_5495 = 5495 + const val APPLE_SAPLING_5496 = 5496 + const val BANANA_SAPLING_5497 = 5497 + const val ORANGE_SAPLING_5498 = 5498 + const val CURRY_SAPLING_5499 = 5499 + const val PINEAPPLE_SAPLING_5500 = 5500 + const val PAPAYA_SAPLING_5501 = 5501 + const val PALM_SAPLING_5502 = 5502 + const val CALQUAT_SAPLING_5503 = 5503 + const val STRAWBERRY_5504 = 5504 + const val STRAWBERRY_5505 = 5505 + const val OLD_MANS_MESSAGE_5506 = 5506 + const val STRANGE_BOOK_5507 = 5507 + const val BOOK_OF_FOLKLORE_5508 = 5508 + const val SMALL_POUCH_5509 = 5509 + const val MEDIUM_POUCH_5510 = 5510 + const val MEDIUM_POUCH_5511 = 5511 + const val LARGE_POUCH_5512 = 5512 + const val LARGE_POUCH_5513 = 5513 + const val GIANT_POUCH_5514 = 5514 + const val GIANT_POUCH_5515 = 5515 + const val ELEMENTAL_TALISMAN_5516 = 5516 + const val ELEMENTAL_TALISMAN_5517 = 5517 + const val SCRYING_ORB_5518 = 5518 + const val SCRYING_ORB_5519 = 5519 + const val ABYSSAL_BOOK_5520 = 5520 + const val BINDING_NECKLACE_5521 = 5521 + const val BINDING_NECKLACE_5522 = 5522 + const val TIARA_MOULD_5523 = 5523 + const val TIARA_MOULD_5524 = 5524 + const val TIARA_5525 = 5525 + const val TIARA_5526 = 5526 + const val AIR_TIARA_5527 = 5527 + const val AIR_TIARA_5528 = 5528 + const val MIND_TIARA_5529 = 5529 + const val MIND_TIARA_5530 = 5530 + const val WATER_TIARA_5531 = 5531 + const val WATER_TIARA_5532 = 5532 + const val BODY_TIARA_5533 = 5533 + const val BODY_TIARA_5534 = 5534 + const val EARTH_TIARA_5535 = 5535 + const val EARTH_TIARA_5536 = 5536 + const val FIRE_TIARA_5537 = 5537 + const val FIRE_TIARA_5538 = 5538 + const val COSMIC_TIARA_5539 = 5539 + const val COSMIC_TIARA_5540 = 5540 + const val NATURE_TIARA_5541 = 5541 + const val NATURE_TIARA_5542 = 5542 + const val CHAOS_TIARA_5543 = 5543 + const val CHAOS_TIARA_5544 = 5544 + const val LAW_TIARA_5545 = 5545 + const val LAW_TIARA_5546 = 5546 + const val DEATH_TIARA_5547 = 5547 + const val DEATH_TIARA_5548 = 5548 + const val BLOOD_TIARA_5549 = 5549 + const val BLOOD_TIARA_5550 = 5550 + const val SOUL_TIARA_5551 = 5551 + const val SOUL_TIARA_5552 = 5552 + const val ROGUE_TOP_5553 = 5553 + const val ROGUE_MASK_5554 = 5554 + const val ROGUE_TROUSERS_5555 = 5555 + const val ROGUE_GLOVES_5556 = 5556 + const val ROGUE_BOOTS_5557 = 5557 + const val ROGUE_KIT_5558 = 5558 + const val FLASH_POWDER_5559 = 5559 + const val STETHOSCOPE_5560 = 5560 + const val MYSTIC_JEWEL_5561 = 5561 + const val PICTURE_5562 = 5562 + const val PICTURE_5563 = 5563 + const val PICTURE_5564 = 5564 + const val PICTURE_5565 = 5565 + const val PICTURE_5566 = 5566 + const val PICTURE_5567 = 5567 + const val PICTURE_5568 = 5568 + const val PICTURE_5569 = 5569 + const val PICTURE_5570 = 5570 + const val PICTURE_5571 = 5571 + const val DIAL_5572 = 5572 + const val NULL_5573 = 5573 + const val INITIATE_SALLET_5574 = 5574 + const val INITIATE_HAUBERK_5575 = 5575 + const val INITIATE_CUISSE_5576 = 5576 + const val CUPRIC_SULPHATE_5577 = 5577 + const val ACETIC_ACID_5578 = 5578 + const val GYPSUM_5579 = 5579 + const val SODIUM_CHLORIDE_5580 = 5580 + const val NITROUS_OXIDE_5581 = 5581 + const val VIAL_OF_LIQUID_5582 = 5582 + const val TIN_ORE_POWDER_5583 = 5583 + const val CUPRIC_ORE_POWDER_5584 = 5584 + const val BRONZE_KEY_5585 = 5585 + const val METAL_SPADE_5586 = 5586 + const val METAL_SPADE_5587 = 5587 + const val ALCHEMICAL_NOTES_5588 = 5588 + const val UNKNOWN_MIXTURE_5589 = 5589 + const val UNKNOWN_MIXTURE_5590 = 5590 + const val UNKNOWN_MIXTURE_5591 = 5591 + const val TIN_5592 = 5592 + const val TIN_5593 = 5593 + const val TIN_5594 = 5594 + const val TIN_5595 = 5595 + const val TIN_5596 = 5596 + const val TIN_5597 = 5597 + const val TIN_5598 = 5598 + const val TIN_5599 = 5599 + const val TIN_5600 = 5600 + const val CHISEL_5601 = 5601 + const val BRONZE_WIRE_5602 = 5602 + const val SHEARS_5603 = 5603 + const val MAGNET_5604 = 5604 + const val KNIFE_5605 = 5605 + const val MAKEOVER_VOUCHER_5606 = 5606 + const val GRAIN_5607 = 5607 + const val FOX_5608 = 5608 + const val CHICKEN_5609 = 5609 + const val HOURGLASS_5610 = 5610 + const val INITIATE_SALLET_5611 = 5611 + const val INITIATE_HAUBERK_5612 = 5612 + const val INITIATE_CUISSE_5613 = 5613 + const val MAGIC_CARPET_5614 = 5614 + const val BONEMEAL_5615 = 5615 + const val BRONZE_ARROWP_PLUS_5616 = 5616 + const val IRON_ARROWP_PLUS_5617 = 5617 + const val STEEL_ARROWP_PLUS_5618 = 5618 + const val MITHRIL_ARROWP_PLUS_5619 = 5619 + const val ADAMANT_ARROWP_PLUS_5620 = 5620 + const val RUNE_ARROWP_PLUS_5621 = 5621 + const val BRONZE_ARROWP_PLUS_PLUS_5622 = 5622 + const val IRON_ARROWP_PLUS_PLUS_5623 = 5623 + const val STEEL_ARROWP_PLUS_PLUS_5624 = 5624 + const val MITHRIL_ARROWP_PLUS_PLUS_5625 = 5625 + const val ADAMANT_ARROWP_PLUS_PLUS_5626 = 5626 + const val RUNE_ARROWP_PLUS_PLUS_5627 = 5627 + const val BRONZE_DARTP_PLUS_5628 = 5628 + const val IRON_DARTP_PLUS_5629 = 5629 + const val STEEL_DARTP_PLUS_5630 = 5630 + const val BLACK_DARTP_PLUS_5631 = 5631 + const val MITHRIL_DARTP_PLUS_5632 = 5632 + const val ADAMANT_DARTP_PLUS_5633 = 5633 + const val RUNE_DARTP_PLUS_5634 = 5634 + const val BRONZE_DARTP_PLUS_PLUS_5635 = 5635 + const val IRON_DARTP_PLUS_PLUS_5636 = 5636 + const val STEEL_DARTP_PLUS_PLUS_5637 = 5637 + const val BLACK_DARTP_PLUS_PLUS_5638 = 5638 + const val MITHRIL_DARTP_PLUS_PLUS_5639 = 5639 + const val ADAMANT_DARTP_PLUS_PLUS_5640 = 5640 + const val RUNE_DARTP_PLUS_PLUS_5641 = 5641 + const val BRONZE_JAVELINP_PLUS_5642 = 5642 + const val IRON_JAVELINP_PLUS_5643 = 5643 + const val STEEL_JAVELINP_PLUS_5644 = 5644 + const val MITHRIL_JAVELINP_PLUS_5645 = 5645 + const val ADAMANT_JAVELINP_PLUS_5646 = 5646 + const val RUNE_JAVELINP_PLUS_5647 = 5647 + const val BRONZE_JAVNP_PLUS_PLUS_5648 = 5648 + const val IRON_JAVELINP_PLUS_PLUS_5649 = 5649 + const val STEEL_JAVELINP_PLUS_PLUS_5650 = 5650 + const val MITHRIL_JAVELINP_PLUS_PLUS_5651 = 5651 + const val ADAMANT_JAVELINP_PLUS_PLUS_5652 = 5652 + const val RUNE_JAVELINP_PLUS_PLUS_5653 = 5653 + const val BRONZE_KNIFEP_PLUS_5654 = 5654 + const val IRON_KNIFEP_PLUS_5655 = 5655 + const val STEEL_KNIFEP_PLUS_5656 = 5656 + const val MITHRIL_KNIFEP_PLUS_5657 = 5657 + const val BLACK_KNIFEP_PLUS_5658 = 5658 + const val ADAMANT_KNIFEP_PLUS_5659 = 5659 + const val RUNE_KNIFEP_PLUS_5660 = 5660 + const val BRONZE_KNIFEP_PLUS_PLUS_5661 = 5661 + const val IRON_KNIFEP_PLUS_PLUS_5662 = 5662 + const val STEEL_KNIFEP_PLUS_PLUS_5663 = 5663 + const val MITHRIL_KNIFEP_PLUS_PLUS_5664 = 5664 + const val BLACK_KNIFEP_PLUS_PLUS_5665 = 5665 + const val ADAMANT_KNIFEP_PLUS_PLUS_5666 = 5666 + const val RUNE_KNIFEP_PLUS_PLUS_5667 = 5667 + const val IRON_DAGGERP_PLUS_5668 = 5668 + const val IRON_DAGGERP_PLUS_5669 = 5669 + const val BRONZE_DAGGERP_PLUS_5670 = 5670 + const val BRONZE_DAGGERP_PLUS_5671 = 5671 + const val STEEL_DAGGERP_PLUS_5672 = 5672 + const val STEEL_DAGGERP_PLUS_5673 = 5673 + const val MITHRIL_DAGGERP_PLUS_5674 = 5674 + const val MITHRIL_DAGGERP_PLUS_5675 = 5675 + const val ADAMANT_DAGGERP_PLUS_5676 = 5676 + const val ADAMANT_DAGGERP_PLUS_5677 = 5677 + const val RUNE_DAGGERP_PLUS_5678 = 5678 + const val RUNE_DAGGERP_PLUS_5679 = 5679 + const val DRAGON_DAGGERP_PLUS_5680 = 5680 + const val DRAGON_DAGGERP_PLUS_5681 = 5681 + const val BLACK_DAGGERP_PLUS_5682 = 5682 + const val BLACK_DAGGERP_PLUS_5683 = 5683 + const val POISON_DAGGERP_PLUS_5684 = 5684 + const val POISON_DAGGERP_PLUS_5685 = 5685 + const val IRON_DAGGERP_PLUS_PLUS_5686 = 5686 + const val IRON_DAGGERP_PLUS_PLUS_5687 = 5687 + const val BRZE_DAGGERP_PLUS_PLUS_5688 = 5688 + const val BRZE_DAGGERP_PLUS_PLUS_5689 = 5689 + const val STEEL_DAGGERP_PLUS_PLUS_5690 = 5690 + const val STEEL_DAGGERP_PLUS_PLUS_5691 = 5691 + const val MITHRIL_DAGGERP_PLUS_PLUS_5692 = 5692 + const val MITHRIL_DAGGERP_PLUS_PLUS_5693 = 5693 + const val ADAMANT_DAGGERP_PLUS_PLUS_5694 = 5694 + const val ADAMANT_DAGGERP_PLUS_PLUS_5695 = 5695 + const val RUNE_DAGGERP_PLUS_PLUS_5696 = 5696 + const val RUNE_DAGGERP_PLUS_PLUS_5697 = 5697 + const val DRAGON_DAGGERP_PLUS_PLUS_5698 = 5698 + const val DRAGON_DAGGERP_PLUS_PLUS_5699 = 5699 + const val BLACK_DAGGERP_PLUS_PLUS_5700 = 5700 + const val BLACK_DAGGERP_PLUS_PLUS_5701 = 5701 + const val POISON_DAGGERP_PLUS_PLUS_5702 = 5702 + const val POISON_DAGGERP_PLUS_PLUS_5703 = 5703 + const val BRONZE_SPEARP_PLUS_5704 = 5704 + const val BRONZE_SPEARP_PLUS_5705 = 5705 + const val IRON_SPEARP_PLUS_5706 = 5706 + const val IRON_SPEARP_PLUS_5707 = 5707 + const val STEEL_SPEARP_PLUS_5708 = 5708 + const val STEEL_SPEARP_PLUS_5709 = 5709 + const val MITHRIL_SPEARP_PLUS_5710 = 5710 + const val MITHRIL_SPEARP_PLUS_5711 = 5711 + const val ADAMANT_SPEARP_PLUS_5712 = 5712 + const val ADAMANT_SPEARP_PLUS_5713 = 5713 + const val RUNE_SPEARP_PLUS_5714 = 5714 + const val RUNE_SPEARP_PLUS_5715 = 5715 + const val DRAGON_SPEARP_PLUS_5716 = 5716 + const val DRAGON_SPEARP_PLUS_5717 = 5717 + const val BRONZE_SPEARP_PLUS_PLUS_5718 = 5718 + const val BRONZE_SPEARP_PLUS_PLUS_5719 = 5719 + const val IRON_SPEARP_PLUS_PLUS_5720 = 5720 + const val IRON_SPEARP_PLUS_PLUS_5721 = 5721 + const val STEEL_SPEARP_PLUS_PLUS_5722 = 5722 + const val STEEL_SPEARP_PLUS_PLUS_5723 = 5723 + const val MITHRIL_SPEARP_PLUS_PLUS_5724 = 5724 + const val MITHRIL_SPEARP_PLUS_PLUS_5725 = 5725 + const val ADAMANT_SPEARP_PLUS_PLUS_5726 = 5726 + const val ADAMANT_SPEARP_PLUS_PLUS_5727 = 5727 + const val RUNE_SPEARP_PLUS_PLUS_5728 = 5728 + const val RUNE_SPEARP_PLUS_PLUS_5729 = 5729 + const val DRAGON_SPEARP_PLUS_PLUS_5730 = 5730 + const val DRAGON_SPEARP_PLUS_PLUS_5731 = 5731 + const val STOOL_5732 = 5732 + const val ROTTEN_POTATO_5733 = 5733 + const val BLACK_SPEARP_PLUS_5734 = 5734 + const val BLACK_SPEARP_PLUS_5735 = 5735 + const val BLACK_SPEARP_PLUS_PLUS_5736 = 5736 + const val BLACK_SPEARP_PLUS_PLUS_5737 = 5737 + const val WOAD_LEAF_5738 = 5738 + const val ASGARNIAN_ALEM_5739 = 5739 + const val ASGARNIAN_ALEM_5740 = 5740 + const val MATURE_WMB_5741 = 5741 + const val MATURE_WMB_5742 = 5742 + const val GREENMANS_ALEM_5743 = 5743 + const val GREENMANS_ALEM_5744 = 5744 + const val DRAGON_BITTERM_5745 = 5745 + const val DRAGON_BITTERM_5746 = 5746 + const val DWARVEN_STOUTM_5747 = 5747 + const val DWARVEN_STOUTM_5748 = 5748 + const val MOONLIGHT_MEADM_5749 = 5749 + const val MOONLIGHT_MEADM_5750 = 5750 + const val AXEMANS_FOLLY_5751 = 5751 + const val AXEMANS_FOLLY_5752 = 5752 + const val AXEMANS_FOLLYM_5753 = 5753 + const val AXEMANS_FOLLYM_5754 = 5754 + const val CHEFS_DELIGHT_5755 = 5755 + const val CHEFS_DELIGHT_5756 = 5756 + const val CHEFS_DELIGHTM_5757 = 5757 + const val CHEFS_DELIGHTM_5758 = 5758 + const val SLAYERS_RESPITE_5759 = 5759 + const val SLAYERS_RESPITE_5760 = 5760 + const val SLAYERS_RESPITEM_5761 = 5761 + const val SLAYERS_RESPITEM_5762 = 5762 + const val CIDER_5763 = 5763 + const val CIDER_5764 = 5764 + const val MATURE_CIDER_5765 = 5765 + const val MATURE_CIDER_5766 = 5766 + const val ALE_YEAST_5767 = 5767 + const val ALE_YEAST_5768 = 5768 + const val CALQUAT_KEG_5769 = 5769 + const val CALQUAT_KEG_5770 = 5770 + const val DWARVEN_STOUT1_5771 = 5771 + const val DWARVEN_STOUT1_5772 = 5772 + const val DWARVEN_STOUT2_5773 = 5773 + const val DWARVEN_STOUT2_5774 = 5774 + const val DWARVEN_STOUT3_5775 = 5775 + const val DWARVEN_STOUT3_5776 = 5776 + const val DWARVEN_STOUT4_5777 = 5777 + const val DWARVEN_STOUT4_5778 = 5778 + const val ASGARNIAN_ALE1_5779 = 5779 + const val ASGARNIAN_ALE1_5780 = 5780 + const val ASGARNIAN_ALE2_5781 = 5781 + const val ASGARNIAN_ALE2_5782 = 5782 + const val ASGARNIAN_ALE3_5783 = 5783 + const val ASGARNIAN_ALE3_5784 = 5784 + const val ASGARNIAN_ALE4_5785 = 5785 + const val ASGARNIAN_ALE4_5786 = 5786 + const val GREENMANS_ALE1_5787 = 5787 + const val GREENMANS_ALE1_5788 = 5788 + const val GREENMANS_ALE2_5789 = 5789 + const val GREENMANS_ALE2_5790 = 5790 + const val GREENMANS_ALE3_5791 = 5791 + const val GREENMANS_ALE3_5792 = 5792 + const val GREENMANS_ALE4_5793 = 5793 + const val GREENMANS_ALE4_5794 = 5794 + const val MIND_BOMB1_5795 = 5795 + const val MIND_BOMB1_5796 = 5796 + const val MIND_BOMB2_5797 = 5797 + const val MIND_BOMB2_5798 = 5798 + const val MIND_BOMB3_5799 = 5799 + const val MIND_BOMB3_5800 = 5800 + const val MIND_BOMB4_5801 = 5801 + const val MIND_BOMB4_5802 = 5802 + const val DRAGON_BITTER1_5803 = 5803 + const val DRAGON_BITTER1_5804 = 5804 + const val DRAGON_BITTER2_5805 = 5805 + const val DRAGON_BITTER2_5806 = 5806 + const val DRAGON_BITTER3_5807 = 5807 + const val DRAGON_BITTER3_5808 = 5808 + const val DRAGON_BITTER4_5809 = 5809 + const val DRAGON_BITTER4_5810 = 5810 + const val MOONLIGHT_MEAD1_5811 = 5811 + const val MOONLIGHT_MEAD1_5812 = 5812 + const val MOONLIGHT_MEAD2_5813 = 5813 + const val MOONLIGHT_MEAD2_5814 = 5814 + const val MOONLIGHT_MEAD3_5815 = 5815 + const val MOONLIGHT_MEAD3_5816 = 5816 + const val MOONLIGHT_MEAD4_5817 = 5817 + const val MOONLIGHT_MEAD4_5818 = 5818 + const val AXEMANS_FOLLY1_5819 = 5819 + const val AXEMANS_FOLLY1_5820 = 5820 + const val AXEMANS_FOLLY2_5821 = 5821 + const val AXEMANS_FOLLY2_5822 = 5822 + const val AXEMANS_FOLLY3_5823 = 5823 + const val AXEMANS_FOLLY3_5824 = 5824 + const val AXEMANS_FOLLY4_5825 = 5825 + const val AXEMANS_FOLLY4_5826 = 5826 + const val CHEFS_DELIGHT1_5827 = 5827 + const val CHEFS_DELIGHT1_5828 = 5828 + const val CHEFS_DELIGHT2_5829 = 5829 + const val CHEFS_DELIGHT2_5830 = 5830 + const val CHEFS_DELIGHT3_5831 = 5831 + const val CHEFS_DELIGHT3_5832 = 5832 + const val CHEFS_DELIGHT4_5833 = 5833 + const val CHEFS_DELIGHT4_5834 = 5834 + const val SLAYERS_RESPITE1_5835 = 5835 + const val SLAYERS_RESPITE1_5836 = 5836 + const val SLAYERS_RESPITE2_5837 = 5837 + const val SLAYERS_RESPITE2_5838 = 5838 + const val SLAYERS_RESPITE3_5839 = 5839 + const val SLAYERS_RESPITE3_5840 = 5840 + const val SLAYERS_RESPITE4_5841 = 5841 + const val SLAYERS_RESPITE4_5842 = 5842 + const val CIDER1_5843 = 5843 + const val CIDER1_5844 = 5844 + const val CIDER2_5845 = 5845 + const val CIDER2_5846 = 5846 + const val CIDER3_5847 = 5847 + const val CIDER3_5848 = 5848 + const val CIDER4_5849 = 5849 + const val CIDER4_5850 = 5850 + const val DWARVEN_STOUTM1_5851 = 5851 + const val DWARVEN_STOUTM1_5852 = 5852 + const val DWARVEN_STOUTM2_5853 = 5853 + const val DWARVEN_STOUTM2_5854 = 5854 + const val DWARVEN_STOUTM3_5855 = 5855 + const val DWARVEN_STOUTM3_5856 = 5856 + const val DWARVEN_STOUTM4_5857 = 5857 + const val DWARVEN_STOUTM4_5858 = 5858 + const val ASGARNIAN_ALEM1_5859 = 5859 + const val ASGARNIAN_ALEM1_5860 = 5860 + const val ASGARNIAN_ALEM2_5861 = 5861 + const val ASGARNIAN_ALEM2_5862 = 5862 + const val ASGARNIAN_ALEM3_5863 = 5863 + const val ASGARNIAN_ALEM3_5864 = 5864 + const val ASGARNIAN_ALEM4_5865 = 5865 + const val ASGARNIAN_ALEM4_5866 = 5866 + const val GREENMANS_ALEM1_5867 = 5867 + const val GREENMANS_ALEM1_5868 = 5868 + const val GREENMANS_ALEM2_5869 = 5869 + const val GREENMANS_ALEM2_5870 = 5870 + const val GREENMANS_ALEM3_5871 = 5871 + const val GREENMANS_ALEM3_5872 = 5872 + const val GREENMANS_ALEM4_5873 = 5873 + const val GREENMANS_ALEM4_5874 = 5874 + const val MIND_BOMBM1_5875 = 5875 + const val MIND_BOMBM1_5876 = 5876 + const val MIND_BOMBM2_5877 = 5877 + const val MIND_BOMBM2_5878 = 5878 + const val MIND_BOMBM3_5879 = 5879 + const val MIND_BOMBM3_5880 = 5880 + const val MIND_BOMBM4_5881 = 5881 + const val MIND_BOMBM4_5882 = 5882 + const val DRAGON_BITTERM1_5883 = 5883 + const val DRAGON_BITTERM1_5884 = 5884 + const val DRAGON_BITTERM2_5885 = 5885 + const val DRAGON_BITTERM2_5886 = 5886 + const val DRAGON_BITTERM3_5887 = 5887 + const val DRAGON_BITTERM3_5888 = 5888 + const val DRAGON_BITTERM4_5889 = 5889 + const val DRAGON_BITTERM4_5890 = 5890 + const val MLIGHT_MEADM1_5891 = 5891 + const val MLIGHT_MEADM1_5892 = 5892 + const val MLIGHT_MEADM2_5893 = 5893 + const val MLIGHT_MEADM2_5894 = 5894 + const val MLIGHT_MEADM3_5895 = 5895 + const val MLIGHT_MEADM3_5896 = 5896 + const val MLIGHT_MEADM4_5897 = 5897 + const val MLIGHT_MEADM4_5898 = 5898 + const val AXEMANS_FOLLYM1_5899 = 5899 + const val AXEMANS_FOLLYM1_5900 = 5900 + const val AXEMANS_FOLLYM2_5901 = 5901 + const val AXEMANS_FOLLYM2_5902 = 5902 + const val AXEMANS_FOLLYM3_5903 = 5903 + const val AXEMANS_FOLLYM3_5904 = 5904 + const val AXEMANS_FOLLYM4_5905 = 5905 + const val AXEMANS_FOLLYM4_5906 = 5906 + const val CHEFS_DELIGHTM1_5907 = 5907 + const val CHEFS_DELIGHTM1_5908 = 5908 + const val CHEFS_DELIGHTM2_5909 = 5909 + const val CHEFS_DELIGHTM2_5910 = 5910 + const val CHEFS_DELIGHTM3_5911 = 5911 + const val CHEFS_DELIGHTM3_5912 = 5912 + const val CHEFS_DELIGHTM4_5913 = 5913 + const val CHEFS_DELIGHTM4_5914 = 5914 + const val SLAYER_RESPITEM1_5915 = 5915 + const val SLAYER_RESPITEM1_5916 = 5916 + const val SLAYER_RESPITEM2_5917 = 5917 + const val SLAYER_RESPITEM2_5918 = 5918 + const val SLAYER_RESPITEM3_5919 = 5919 + const val SLAYER_RESPITEM3_5920 = 5920 + const val SLAYER_RESPITEM4_5921 = 5921 + const val SLAYER_RESPITEM4_5922 = 5922 + const val CIDERM1_5923 = 5923 + const val CIDERM1_5924 = 5924 + const val CIDERM2_5925 = 5925 + const val CIDERM2_5926 = 5926 + const val CIDERM3_5927 = 5927 + const val CIDERM3_5928 = 5928 + const val CIDERM4_5929 = 5929 + const val CIDERM4_5930 = 5930 + const val JUTE_FIBRE_5931 = 5931 + const val JUTE_FIBRE_5932 = 5932 + const val WILLOW_BRANCH_5933 = 5933 + const val WILLOW_BRANCH_5934 = 5934 + const val COCONUT_MILK_5935 = 5935 + const val WEAPON_POISON_PLUSUNF_5936 = 5936 + const val WEAPON_POISON_PLUS_5937 = 5937 + const val WEAPON_POISON_PLUS_5938 = 5938 + const val WEAPON_POISON_PLUS_PLUSUNF_5939 = 5939 + const val WEAPON_POISON_PLUS_PLUS_5940 = 5940 + const val WEAPON_POISON_PLUS_PLUS_5941 = 5941 + const val ANTIPOISON_PLUSUNF_5942 = 5942 + const val ANTIPOISON_PLUS4_5943 = 5943 + const val ANTIPOISON_PLUS4_5944 = 5944 + const val ANTIPOISON_PLUS3_5945 = 5945 + const val ANTIPOISON_PLUS3_5946 = 5946 + const val ANTIPOISON_PLUS2_5947 = 5947 + const val ANTIPOISON_PLUS2_5948 = 5948 + const val ANTIPOISON_PLUS1_5949 = 5949 + const val ANTIPOISON_PLUS1_5950 = 5950 + const val ANTIPOISON_PLUS_PLUSUNF_5951 = 5951 + const val ANTIPOISON_PLUS_PLUS4_5952 = 5952 + const val ANTIPOISON_PLUS_PLUS4_5953 = 5953 + const val ANTIPOISON_PLUS_PLUS3_5954 = 5954 + const val ANTIPOISON_PLUS_PLUS3_5955 = 5955 + const val ANTIPOISON_PLUS_PLUS2_5956 = 5956 + const val ANTIPOISON_PLUS_PLUS2_5957 = 5957 + const val ANTIPOISON_PLUS_PLUS1_5958 = 5958 + const val ANTIPOISON_PLUS_PLUS1_5959 = 5959 + const val TOMATOES1_5960 = 5960 + const val TOMATOES1_5961 = 5961 + const val TOMATOES2_5962 = 5962 + const val TOMATOES2_5963 = 5963 + const val TOMATOES3_5964 = 5964 + const val TOMATOES3_5965 = 5965 + const val TOMATOES4_5966 = 5966 + const val TOMATOES4_5967 = 5967 + const val TOMATOES5_5968 = 5968 + const val TOMATOES5_5969 = 5969 + const val CURRY_LEAF_5970 = 5970 + const val CURRY_LEAF_5971 = 5971 + const val PAPAYA_FRUIT_5972 = 5972 + const val PAPAYA_FRUIT_5973 = 5973 + const val COCONUT_5974 = 5974 + const val COCONUT_5975 = 5975 + const val COCONUT_5976 = 5976 + const val COCONUT_5977 = 5977 + const val COCONUT_SHELL_5978 = 5978 + const val COCONUT_SHELL_5979 = 5979 + const val CALQUAT_FRUIT_5980 = 5980 + const val CALQUAT_FRUIT_5981 = 5981 + const val WATERMELON_5982 = 5982 + const val WATERMELON_5983 = 5983 + const val WATERMELON_SLICE_5984 = 5984 + const val WATERMELON_SLICE_5985 = 5985 + const val SWEETCORN_5986 = 5986 + const val SWEETCORN_5987 = 5987 + const val COOKED_SWEETCORN_5988 = 5988 + const val COOKED_SWEETCORN_5989 = 5989 + const val BURNT_SWEETCORN_5990 = 5990 + const val BURNT_SWEETCORN_5991 = 5991 + const val APPLE_MUSH_5992 = 5992 + const val APPLE_MUSH_5993 = 5993 + const val HAMMERSTONE_HOPS_5994 = 5994 + const val HAMMERSTONE_HOPS_5995 = 5995 + const val ASGARNIAN_HOPS_5996 = 5996 + const val ASGARNIAN_HOPS_5997 = 5997 + const val YANILLIAN_HOPS_5998 = 5998 + const val YANILLIAN_HOPS_5999 = 5999 + const val KRANDORIAN_HOPS_6000 = 6000 + const val KRANDORIAN_HOPS_6001 = 6001 + const val WILDBLOOD_HOPS_6002 = 6002 + const val WILDBLOOD_HOPS_6003 = 6003 + const val MUSHROOM_6004 = 6004 + const val MUSHROOM_6005 = 6005 + const val BARLEY_6006 = 6006 + const val BARLEY_6007 = 6007 + const val BARLEY_MALT_6008 = 6008 + const val BARLEY_MALT_6009 = 6009 + const val MARIGOLDS_6010 = 6010 + const val MARIGOLDS_6011 = 6011 + const val NASTURTIUMS_6012 = 6012 + const val NASTURTIUMS_6013 = 6013 + const val ROSEMARY_6014 = 6014 + const val ROSEMARY_6015 = 6015 + const val CACTUS_SPINE_6016 = 6016 + const val CACTUS_SPINE_6017 = 6017 + const val POISON_IVY_BERRIES_6018 = 6018 + const val POISON_IVY_BERRIES_6019 = 6019 + const val LEAVES_6020 = 6020 + const val LEAVES_6021 = 6021 + const val LEAVES_6022 = 6022 + const val LEAVES_6023 = 6023 + const val LEAVES_6024 = 6024 + const val LEAVES_6025 = 6025 + const val LEAVES_6026 = 6026 + const val LEAVES_6027 = 6027 + const val LEAVES_6028 = 6028 + const val LEAVES_6029 = 6029 + const val LEAVES_6030 = 6030 + const val LEAVES_6031 = 6031 + const val COMPOST_6032 = 6032 + const val COMPOST_6033 = 6033 + const val SUPERCOMPOST_6034 = 6034 + const val SUPERCOMPOST_6035 = 6035 + const val PLANT_CURE_6036 = 6036 + const val PLANT_CURE_6037 = 6037 + const val MAGIC_STRING_6038 = 6038 + const val MAGIC_STRING_6039 = 6039 + const val AMULET_OF_NATURE_6040 = 6040 + const val PRE_NATURE_AMULET_6041 = 6041 + const val PRE_NATURE_AMULET_6042 = 6042 + const val OAK_ROOTS_6043 = 6043 + const val OAK_ROOTS_6044 = 6044 + const val WILLOW_ROOTS_6045 = 6045 + const val WILLOW_ROOTS_6046 = 6046 + const val MAPLE_ROOTS_6047 = 6047 + const val MAPLE_ROOTS_6048 = 6048 + const val YEW_ROOTS_6049 = 6049 + const val YEW_ROOTS_6050 = 6050 + const val MAGIC_ROOTS_6051 = 6051 + const val MAGIC_ROOTS_6052 = 6052 + const val SPIRIT_ROOTS_6053 = 6053 + const val SPIRIT_ROOTS_6054 = 6054 + const val WEEDS_6055 = 6055 + const val WEEDS_6056 = 6056 + const val HAY_SACK_6057 = 6057 + const val HAY_SACK_6058 = 6058 + const val SCARECROW_6059 = 6059 + const val STOOL_6060 = 6060 + const val BRONZE_BOLTSP_PLUS_6061 = 6061 + const val BRONZE_BOLTSP_PLUS_PLUS_6062 = 6062 + const val SPIRIT_TREE_6063 = 6063 + const val BLOODY_MOURNER_TOP_6064 = 6064 + const val MOURNER_TOP_6065 = 6065 + const val MOURNER_TROUSERS_6066 = 6066 + const val MOURNER_TROUSERS_6067 = 6067 + const val MOURNER_GLOVES_6068 = 6068 + const val MOURNER_BOOTS_6069 = 6069 + const val MOURNER_CLOAK_6070 = 6070 + const val MOURNER_LETTER_6071 = 6071 + const val TEGIDS_SOAP_6072 = 6072 + const val PRIFDDINAS_HISTORY_6073 = 6073 + const val PICTURE_6074 = 6074 + const val EASTERN_DISCOVERY_6075 = 6075 + const val PICTURE_6076 = 6076 + const val EASTERN_SETTLEMENT_6077 = 6077 + const val PICTURE_6078 = 6078 + const val THE_GREAT_DIVIDE_6079 = 6079 + const val PICTURE_6080 = 6080 + const val BROKEN_DEVICE_6081 = 6081 + const val FIXED_DEVICE_6082 = 6082 + const val TARNISHED_KEY_6083 = 6083 + const val WORN_KEY_6084 = 6084 + const val RED_DYE_BELLOWS_6085 = 6085 + const val BLUE_DYE_BELLOWS_6086 = 6086 + const val YELLOW_DYE_BELLOWS_6087 = 6087 + const val GREEN_DYE_BELLOWS_6088 = 6088 + const val BLUE_TOAD_6089 = 6089 + const val RED_TOAD_6090 = 6090 + const val YELLOW_TOAD_6091 = 6091 + const val GREEN_TOAD_6092 = 6092 + const val ROTTEN_APPLES_6093 = 6093 + const val APPLE_BARREL_6094 = 6094 + const val NAPHTHA_APPLE_MIX_6095 = 6095 + const val TOXIC_NAPHTHA_6096 = 6096 + const val SIEVE_6097 = 6097 + const val TOXIC_POWDER_6098 = 6098 + const val TELEPORT_CRYSTAL_4_6099 = 6099 + const val TELEPORT_CRYSTAL_3_6100 = 6100 + const val TELEPORT_CRYSTAL_2_6101 = 6101 + const val TELEPORT_CRYSTAL_1_6102 = 6102 + const val TINY_ELF_CRYSTAL_6103 = 6103 + const val NEW_KEY_6104 = 6104 + const val ELF_6105 = 6105 + const val GHOSTLY_BOOTS_6106 = 6106 + const val GHOSTLY_ROBE_6107 = 6107 + const val GHOSTLY_ROBE_6108 = 6108 + const val GHOSTLY_HOOD_6109 = 6109 + const val GHOSTLY_GLOVES_6110 = 6110 + const val GHOSTLY_CLOAK_6111 = 6111 + const val KELDA_SEED_6112 = 6112 + const val KELDA_HOPS_6113 = 6113 + const val NULL_6114 = 6114 + const val NULL_6115 = 6115 + const val NULL_6116 = 6116 + const val NULL_6117 = 6117 + const val KELDA_STOUT_6118 = 6118 + const val SQUARE_STONE_6119 = 6119 + const val SQUARE_STONE_6120 = 6120 + const val LETTER_6121 = 6121 + const val A_CHAIR_6122 = 6122 + const val BEER_GLASS_6123 = 6123 + const val COCONUT_MILK_6124 = 6124 + const val ENCHANTED_LYRE2_6125 = 6125 + const val ENCHANTED_LYRE3_6126 = 6126 + const val ENCHANTED_LYRE4_6127 = 6127 + const val ROCK_SHELL_HELM_6128 = 6128 + const val ROCK_SHELL_PLATE_6129 = 6129 + const val ROCK_SHELL_LEGS_6130 = 6130 + const val SPINED_HELM_6131 = 6131 + const val SPINED_HELM_6132 = 6132 + const val SPINED_BODY_6133 = 6133 + const val SPINED_BODY_6134 = 6134 + const val SPINED_CHAPS_6135 = 6135 + const val SPINED_CHAPS_6136 = 6136 + const val SKELETAL_HELM_6137 = 6137 + const val SKELETAL_HELM_6138 = 6138 + const val SKELETAL_TOP_6139 = 6139 + const val SKELETAL_TOP_6140 = 6140 + const val SKELETAL_BOTTOMS_6141 = 6141 + const val SKELETAL_BOTTOMS_6142 = 6142 + const val SPINED_BOOTS_6143 = 6143 + const val SPINED_BOOTS_6144 = 6144 + const val ROCK_SHELL_BOOTS_6145 = 6145 + const val ROCK_SHELL_BOOTS_6146 = 6146 + const val SKELETAL_BOOTS_6147 = 6147 + const val SKELETAL_BOOTS_6148 = 6148 + const val SPINED_GLOVES_6149 = 6149 + const val SPINED_GLOVES_6150 = 6150 + const val ROCK_SHELL_GLOVES_6151 = 6151 + const val ROCK_SHELL_GLOVES_6152 = 6152 + const val SKELETAL_GLOVES_6153 = 6153 + const val SKELETAL_GLOVES_6154 = 6154 + const val DAGANNOTH_HIDE_6155 = 6155 + const val DAGANNOTH_HIDE_6156 = 6156 + const val ROCK_SHELL_CHUNK_6157 = 6157 + const val ROCK_SHELL_CHUNK_6158 = 6158 + const val ROCK_SHELL_SHARD_6159 = 6159 + const val ROCK_SHELL_SHARD_6160 = 6160 + const val ROCK_SHELL_SPLINTER_6161 = 6161 + const val ROCK_SHELL_SPLINTER_6162 = 6162 + const val SKULL_PIECE_6163 = 6163 + const val SKULL_PIECE_6164 = 6164 + const val RIBCAGE_PIECE_6165 = 6165 + const val RIBCAGE_PIECE_6166 = 6166 + const val FIBULA_PIECE_6167 = 6167 + const val FIBULA_PIECE_6168 = 6168 + const val CIRCULAR_HIDE_6169 = 6169 + const val CIRCULAR_HIDE_6170 = 6170 + const val FLATTENED_HIDE_6171 = 6171 + const val FLATTENED_HIDE_6172 = 6172 + const val STRETCHED_HIDE_6173 = 6173 + const val STRETCHED_HIDE_6174 = 6174 + const val ROCK_SHELL_HELM_6175 = 6175 + const val ROCK_SHELL_PLATE_6176 = 6176 + const val ROCK_SHELL_LEGS_6177 = 6177 + const val RAW_PHEASANT_6178 = 6178 + const val RAW_PHEASANT_6179 = 6179 + const val LEDERHOSEN_TOP_6180 = 6180 + const val LEDERHOSEN_SHORTS_6181 = 6181 + const val LEDERHOSEN_HAT_6182 = 6182 + const val FROG_TOKEN_6183 = 6183 + const val PRINCE_TUNIC_6184 = 6184 + const val PRINCE_LEGGINGS_6185 = 6185 + const val PRINCESS_BLOUSE_6186 = 6186 + const val PRINCESS_SKIRT_6187 = 6187 + const val FROG_MASK_6188 = 6188 + const val NULL_6189 = 6189 + const val NULL_6190 = 6190 + const val NULL_6191 = 6191 + const val NULL_6192 = 6192 + const val NULL_6193 = 6193 + const val NULL_6194 = 6194 + const val NULL_6195 = 6195 + const val NULL_6196 = 6196 + const val NULL_6197 = 6197 + const val NULL_6198 = 6198 + const val MYSTERY_BOX_6199 = 6199 + const val RAW_FISHLIKE_THING_6200 = 6200 + const val PICTURE_6201 = 6201 + const val FISHLIKE_THING_6202 = 6202 + const val PICTURE_6203 = 6203 + const val RAW_FISHLIKE_THING_6204 = 6204 + const val PICTURE_6205 = 6205 + const val FISHLIKE_THING_6206 = 6206 + const val PICTURE_6207 = 6207 + const val MAN_SPEAK_AMULET_6208 = 6208 + const val SMALL_FISHING_NET_6209 = 6209 + const val PICTURE_6210 = 6210 + const val TEAK_PYRE_LOGS_6211 = 6211 + const val TEAK_PYRE_LOGS_6212 = 6212 + const val MAHOGANY_PYRE_LOG_6213 = 6213 + const val MAHOGANY_PYRE_LOG_6214 = 6214 + const val BROODOO_SHIELD_10_6215 = 6215 + const val BROODOO_SHIELD_10_6216 = 6216 + const val BROODOO_SHIELD_9_6217 = 6217 + const val BROODOO_SHIELD_9_6218 = 6218 + const val BROODOO_SHIELD_8_6219 = 6219 + const val BROODOO_SHIELD_8_6220 = 6220 + const val BROODOO_SHIELD_7_6221 = 6221 + const val BROODOO_SHIELD_7_6222 = 6222 + const val BROODOO_SHIELD_6_6223 = 6223 + const val BROODOO_SHIELD_6_6224 = 6224 + const val BROODOO_SHIELD_5_6225 = 6225 + const val BROODOO_SHIELD_5_6226 = 6226 + const val BROODOO_SHIELD_4_6227 = 6227 + const val BROODOO_SHIELD_4_6228 = 6228 + const val BROODOO_SHIELD_3_6229 = 6229 + const val BROODOO_SHIELD_3_6230 = 6230 + const val BROODOO_SHIELD_2_6231 = 6231 + const val BROODOO_SHIELD_2_6232 = 6232 + const val BROODOO_SHIELD_1_6233 = 6233 + const val BROODOO_SHIELD_1_6234 = 6234 + const val BROODOO_SHIELD_6235 = 6235 + const val BROODOO_SHIELD_6236 = 6236 + const val BROODOO_SHIELD_10_6237 = 6237 + const val BROODOO_SHIELD_10_6238 = 6238 + const val BROODOO_SHIELD_9_6239 = 6239 + const val BROODOO_SHIELD_9_6240 = 6240 + const val BROODOO_SHIELD_8_6241 = 6241 + const val BROODOO_SHIELD_8_6242 = 6242 + const val BROODOO_SHIELD_7_6243 = 6243 + const val BROODOO_SHIELD_7_6244 = 6244 + const val BROODOO_SHIELD_6_6245 = 6245 + const val BROODOO_SHIELD_6_6246 = 6246 + const val BROODOO_SHIELD_5_6247 = 6247 + const val BROODOO_SHIELD_5_6248 = 6248 + const val BROODOO_SHIELD_4_6249 = 6249 + const val BROODOO_SHIELD_4_6250 = 6250 + const val BROODOO_SHIELD_3_6251 = 6251 + const val BROODOO_SHIELD_3_6252 = 6252 + const val BROODOO_SHIELD_2_6253 = 6253 + const val BROODOO_SHIELD_2_6254 = 6254 + const val BROODOO_SHIELD_1_6255 = 6255 + const val BROODOO_SHIELD_1_6256 = 6256 + const val BROODOO_SHIELD_6257 = 6257 + const val BROODOO_SHIELD_6258 = 6258 + const val BROODOO_SHIELD_10_6259 = 6259 + const val BROODOO_SHIELD_10_6260 = 6260 + const val BROODOO_SHIELD_9_6261 = 6261 + const val BROODOO_SHIELD_9_6262 = 6262 + const val BROODOO_SHIELD_8_6263 = 6263 + const val BROODOO_SHIELD_8_6264 = 6264 + const val BROODOO_SHIELD_7_6265 = 6265 + const val BROODOO_SHIELD_7_6266 = 6266 + const val BROODOO_SHIELD_6_6267 = 6267 + const val BROODOO_SHIELD_6_6268 = 6268 + const val BROODOO_SHIELD_5_6269 = 6269 + const val BROODOO_SHIELD_5_6270 = 6270 + const val BROODOO_SHIELD_4_6271 = 6271 + const val BROODOO_SHIELD_4_6272 = 6272 + const val BROODOO_SHIELD_3_6273 = 6273 + const val BROODOO_SHIELD_3_6274 = 6274 + const val BROODOO_SHIELD_2_6275 = 6275 + const val BROODOO_SHIELD_2_6276 = 6276 + const val BROODOO_SHIELD_1_6277 = 6277 + const val BROODOO_SHIELD_1_6278 = 6278 + const val BROODOO_SHIELD_6279 = 6279 + const val BROODOO_SHIELD_6280 = 6280 + const val THATCH_SPAR_LIGHT_6281 = 6281 + const val THATCH_SPAR_LIGHT_6282 = 6282 + const val THATCH_SPAR_MED_6283 = 6283 + const val THATCH_SPAR_MED_6284 = 6284 + const val THATCH_SPAR_DENSE_6285 = 6285 + const val THATCH_SPAR_DENSE_6286 = 6286 + const val SNAKE_HIDE_6287 = 6287 + const val SNAKE_HIDE_6288 = 6288 + const val SNAKESKIN_6289 = 6289 + const val SNAKESKIN_6290 = 6290 + const val SPIDER_CARCASS_6291 = 6291 + const val SPIDER_CARCASS_6292 = 6292 + const val SPIDER_ON_STICK_6293 = 6293 + const val SPIDER_ON_STICK_6294 = 6294 + const val SPIDER_ON_SHAFT_6295 = 6295 + const val SPIDER_ON_SHAFT_6296 = 6296 + const val SPIDER_ON_STICK_6297 = 6297 + const val SPIDER_ON_STICK_6298 = 6298 + const val SPIDER_ON_SHAFT_6299 = 6299 + const val SPIDER_ON_SHAFT_6300 = 6300 + const val BURNT_SPIDER_6301 = 6301 + const val BURNT_SPIDER_6302 = 6302 + const val SPIDER_ON_SHAFT_6303 = 6303 + const val SPIDER_ON_SHAFT_6304 = 6304 + const val SKEWER_STICK_6305 = 6305 + const val TRADING_STICKS_6306 = 6306 + const val NULL_6307 = 6307 + const val NULL_6308 = 6308 + const val NULL_6309 = 6309 + const val NULL_6310 = 6310 + const val GOUT_TUBER_6311 = 6311 + const val GOUT_TUBER_6312 = 6312 + const val OPAL_MACHETE_6313 = 6313 + const val OPAL_MACHETE_6314 = 6314 + const val JADE_MACHETE_6315 = 6315 + const val JADE_MACHETE_6316 = 6316 + const val RED_TOPAZ_MACHETE_6317 = 6317 + const val RED_TOPAZ_MACHETE_6318 = 6318 + const val PROBOSCIS_6319 = 6319 + const val NULL_6320 = 6320 + const val NULL_6321 = 6321 + const val SNAKESKIN_BODY_6322 = 6322 + const val SNAKESKIN_BODY_6323 = 6323 + const val SNAKESKIN_CHAPS_6324 = 6324 + const val SNAKESKIN_CHAPS_6325 = 6325 + const val SNAKESKIN_BANDANA_6326 = 6326 + const val SNAKESKIN_BANDANA_6327 = 6327 + const val SNAKESKIN_BOOTS_6328 = 6328 + const val SNAKESKIN_BOOTS_6329 = 6329 + const val SNAKESKIN_VBRACE_6330 = 6330 + const val SNAKESKIN_VBRACE_6331 = 6331 + const val MAHOGANY_LOGS_6332 = 6332 + const val TEAK_LOGS_6333 = 6333 + const val TEAK_LOGS_6334 = 6334 + const val TRIBAL_MASK_6335 = 6335 + const val TRIBAL_MASK_6336 = 6336 + const val TRIBAL_MASK_6337 = 6337 + const val TRIBAL_MASK_6338 = 6338 + const val TRIBAL_MASK_6339 = 6339 + const val TRIBAL_MASK_6340 = 6340 + const val TRIBAL_TOP_6341 = 6341 + const val TRIBAL_TOP_6342 = 6342 + const val VILLAGER_ROBE_6343 = 6343 + const val VILLAGER_ROBE_6344 = 6344 + const val VILLAGER_HAT_6345 = 6345 + const val VILLAGER_HAT_6346 = 6346 + const val VILLAGER_ARMBAND_6347 = 6347 + const val VILLAGER_ARMBAND_6348 = 6348 + const val VILLAGER_SANDALS_6349 = 6349 + const val VILLAGER_SANDALS_6350 = 6350 + const val TRIBAL_TOP_6351 = 6351 + const val TRIBAL_TOP_6352 = 6352 + const val VILLAGER_ROBE_6353 = 6353 + const val VILLAGER_ROBE_6354 = 6354 + const val VILLAGER_HAT_6355 = 6355 + const val VILLAGER_HAT_6356 = 6356 + const val VILLAGER_SANDALS_6357 = 6357 + const val VILLAGER_SANDALS_6358 = 6358 + const val VILLAGER_ARMBAND_6359 = 6359 + const val VILLAGER_ARMBAND_6360 = 6360 + const val TRIBAL_TOP_6361 = 6361 + const val TRIBAL_TOP_6362 = 6362 + const val VILLAGER_ROBE_6363 = 6363 + const val VILLAGER_ROBE_6364 = 6364 + const val VILLAGER_HAT_6365 = 6365 + const val VILLAGER_HAT_6366 = 6366 + const val VILLAGER_SANDALS_6367 = 6367 + const val VILLAGER_SANDALS_6368 = 6368 + const val VILLAGER_ARMBAND_6369 = 6369 + const val VILLAGER_ARMBAND_6370 = 6370 + const val TRIBAL_TOP_6371 = 6371 + const val TRIBAL_TOP_6372 = 6372 + const val VILLAGER_ROBE_6373 = 6373 + const val VILLAGER_ROBE_6374 = 6374 + const val VILLAGER_HAT_6375 = 6375 + const val VILLAGER_HAT_6376 = 6376 + const val VILLAGER_SANDALS_6377 = 6377 + const val VILLAGER_SANDALS_6378 = 6378 + const val VILLAGER_ARMBAND_6379 = 6379 + const val VILLAGER_ARMBAND_6380 = 6380 + const val PICTURE_6381 = 6381 + const val FEZ_6382 = 6382 + const val FEZ_6383 = 6383 + const val DESERT_TOP_6384 = 6384 + const val DESERT_TOP_6385 = 6385 + const val DESERT_ROBES_6386 = 6386 + const val DESERT_ROBES_6387 = 6387 + const val DESERT_TOP_6388 = 6388 + const val DESERT_TOP_6389 = 6389 + const val DESERT_LEGS_6390 = 6390 + const val DESERT_LEGS_6391 = 6391 + const val MENAP_HEADGEAR_6392 = 6392 + const val MENAP_HEADGEAR_6393 = 6393 + const val MENAPHITE_TOP_6394 = 6394 + const val MENAPHITE_TOP_6395 = 6395 + const val MENAPHITE_ROBE_6396 = 6396 + const val MENAPHITE_ROBE_6397 = 6397 + const val MENAP_ACTION_KILT_6398 = 6398 + const val MENAP_ACTION_KILT_6399 = 6399 + const val MENAP_HEADGEAR_6400 = 6400 + const val MENAP_HEADGEAR_6401 = 6401 + const val MENAPHITE_TOP_6402 = 6402 + const val MENAPHITE_TOP_6403 = 6403 + const val MENAPHITE_ROBE_6404 = 6404 + const val MENAPHITE_ROBE_6405 = 6405 + const val MENAP_ACTION_KILT_6406 = 6406 + const val MENAP_ACTION_KILT_6407 = 6407 + const val OAK_BLACKJACKO_6408 = 6408 + const val OAK_BLACKJACKO_6409 = 6409 + const val OAK_BLACKJACKD_6410 = 6410 + const val OAK_BLACKJACKD_6411 = 6411 + const val WILLOW_BLACKJACKO_6412 = 6412 + const val WILLOW_BLACKJACKO_6413 = 6413 + const val WILLOW_BLACKJACKD_6414 = 6414 + const val WILLOW_BLACKJACKD_6415 = 6415 + const val MAPLE_BLACKJACK_6416 = 6416 + const val MAPLE_BLACKJACK_6417 = 6417 + const val MAPLE_BLACKJACKO_6418 = 6418 + const val MAPLE_BLACKJACKO_6419 = 6419 + const val MAPLE_BLACKJACKD_6420 = 6420 + const val MAPLE_BLACKJACKD_6421 = 6421 + const val AIR_RUNE_6422 = 6422 + const val AIR_RUNE_6423 = 6423 + const val WATER_RUNE_6424 = 6424 + const val WATER_RUNE_6425 = 6425 + const val EARTH_RUNE_6426 = 6426 + const val EARTH_RUNE_6427 = 6427 + const val FIRE_RUNE_6428 = 6428 + const val FIRE_RUNE_6429 = 6429 + const val CHAOS_RUNE_6430 = 6430 + const val CHAOS_RUNE_6431 = 6431 + const val DEATH_RUNE_6432 = 6432 + const val DEATH_RUNE_6433 = 6433 + const val LAW_RUNE_6434 = 6434 + const val LAW_RUNE_6435 = 6435 + const val MIND_RUNE_6436 = 6436 + const val MIND_RUNE_6437 = 6437 + const val BODY_RUNE_6438 = 6438 + const val BODY_RUNE_6439 = 6439 + const val NULL_6440 = 6440 + const val NULL_6441 = 6441 + const val NULL_6442 = 6442 + const val NULL_6443 = 6443 + const val NULL_6444 = 6444 + const val NULL_6445 = 6445 + const val NULL_6446 = 6446 + const val NULL_6447 = 6447 + const val SPADEFUL_OF_COKE_6448 = 6448 + const val NULL_6449 = 6449 + const val NULL_6450 = 6450 + const val NULL_6451 = 6451 + const val NULL_6452 = 6452 + const val WHITE_ROSE_SEED_6453 = 6453 + const val RED_ROSE_SEED_6454 = 6454 + const val PINK_ROSE_SEED_6455 = 6455 + const val VINE_SEED_6456 = 6456 + const val DELPHINIUM_SEED_6457 = 6457 + const val ORCHID_SEED_6458 = 6458 + const val ORCHID_SEED_6459 = 6459 + const val SNOWDROP_SEED_6460 = 6460 + const val WHITE_TREE_SHOOT_6461 = 6461 + const val WHITE_TREE_SHOOT_6462 = 6462 + const val WHITE_TREE_SHOOT_6463 = 6463 + const val WHITE_TREE_SAPLING_6464 = 6464 + const val RING_OF_CHAROSA_6465 = 6465 + const val RUNE_SHARDS_6466 = 6466 + const val RUNE_DUST_6467 = 6467 + const val PLANT_CURE_6468 = 6468 + const val WHITE_TREE_FRUIT_6469 = 6469 + const val COMPOST_POTION4_6470 = 6470 + const val COMPOST_POTION4_6471 = 6471 + const val COMPOST_POTION3_6472 = 6472 + const val COMPOST_POTION3_6473 = 6473 + const val COMPOST_POTION2_6474 = 6474 + const val COMPOST_POTION2_6475 = 6475 + const val COMPOST_POTION1_6476 = 6476 + const val COMPOST_POTION1_6477 = 6477 + const val TROLLEY_6478 = 6478 + const val LIST_6479 = 6479 + const val NULL_6480 = 6480 + const val NULL_6481 = 6481 + const val NULL_6482 = 6482 + const val NULL_6483 = 6483 + const val NULL_6484 = 6484 + const val NULL_6485 = 6485 + const val NULL_6486 = 6486 + const val NULL_6487 = 6487 + const val NULL_6488 = 6488 + const val NULL_6489 = 6489 + const val NULL_6490 = 6490 + const val NULL_6491 = 6491 + const val NULL_6492 = 6492 + const val NULL_6493 = 6493 + const val NULL_6494 = 6494 + const val NULL_6495 = 6495 + const val NULL_6496 = 6496 + const val NULL_6497 = 6497 + const val NULL_6498 = 6498 + const val NULL_6499 = 6499 + const val NULL_6500 = 6500 + const val NULL_6501 = 6501 + const val NULL_6502 = 6502 + const val NULL_6503 = 6503 + const val NULL_6504 = 6504 + const val NULL_6505 = 6505 + const val NULL_6506 = 6506 + const val NULL_6507 = 6507 + const val NULL_6508 = 6508 + const val NULL_6509 = 6509 + const val NULL_6510 = 6510 + const val NULL_6511 = 6511 + const val NULL_6512 = 6512 + const val NULL_6513 = 6513 + const val AGILITY_JUMP_6514 = 6514 + const val AGILITY_BALANCE_6515 = 6515 + const val AGILITY_CONTORTION_6516 = 6516 + const val AGILITY_CLIMB_6517 = 6517 + const val AGILITY_JUMP_6518 = 6518 + const val AGILITY_BALANCE_6519 = 6519 + const val AGILITY_CONTORTION_6520 = 6520 + const val AGILITY_CLIMB_6521 = 6521 + const val TOKTZ_XIL_UL_6522 = 6522 + const val TOKTZ_XIL_AK_6523 = 6523 + const val TOKTZ_KET_XIL_6524 = 6524 + const val TOKTZ_XIL_EK_6525 = 6525 + const val TOKTZ_MEJ_TAL_6526 = 6526 + const val TZHAAR_KET_EM_6527 = 6527 + const val TZHAAR_KET_OM_6528 = 6528 + const val TOKKUL_6529 = 6529 + const val NULL_6530 = 6530 + const val NULL_6531 = 6531 + const val NULL_6532 = 6532 + const val NULL_6533 = 6533 + const val NULL_6534 = 6534 + const val TOKTZ_XIL_AK_6535 = 6535 + const val TOKTZ_KET_XIL_6536 = 6536 + const val TOKTZ_XIL_EK_6537 = 6537 + const val TOKTZ_MEJ_TAL_6538 = 6538 + const val TZHAAR_KET_EM_6539 = 6539 + const val TZHAAR_KET_OM_6540 = 6540 + const val MOUSE_TOY_6541 = 6541 + const val PRESENT_6542 = 6542 + const val ANTIQUE_LAMP_6543 = 6543 + const val CATSPEAK_AMULETE_6544 = 6544 + const val CHORES_6545 = 6545 + const val RECIPE_6546 = 6546 + const val DOCTORS_HAT_6547 = 6547 + const val NURSE_HAT_6548 = 6548 + const val LAZY_CAT_6549 = 6549 + const val LAZY_CAT_6550 = 6550 + const val LAZY_CAT_6551 = 6551 + const val LAZY_CAT_6552 = 6552 + const val LAZY_CAT_6553 = 6553 + const val LAZY_CAT_6554 = 6554 + const val WILY_CAT_6555 = 6555 + const val WILY_CAT_6556 = 6556 + const val WILY_CAT_6557 = 6557 + const val WILY_CAT_6558 = 6558 + const val WILY_CAT_6559 = 6559 + const val WILY_CAT_6560 = 6560 + const val AHABS_BEER_6561 = 6561 + const val MUD_BATTLESTAFF_6562 = 6562 + const val MYSTIC_MUD_STAFF_6563 = 6563 + const val ONYX_RING_6564 = 6564 + const val ONYX_NECKLACE_6565 = 6565 + const val ONYX_AMULET_6566 = 6566 + const val NULL_6567 = 6567 + const val OBSIDIAN_CAPE_6568 = 6568 + const val OBSIDIAN_CAPE_6569 = 6569 + const val FIRE_CAPE_6570 = 6570 + const val UNCUT_ONYX_6571 = 6571 + const val UNCUT_ONYX_6572 = 6572 + const val ONYX_6573 = 6573 + const val ONYX_6574 = 6574 + const val ONYX_RING_6575 = 6575 + const val ONYX_RING_6576 = 6576 + const val ONYX_NECKLACE_6577 = 6577 + const val ONYX_NECKLACE_6578 = 6578 + const val ONYX_AMULET_6579 = 6579 + const val ONYX_AMULET_6580 = 6580 + const val ONYX_AMULET_6581 = 6581 + const val ONYX_AMULET_6582 = 6582 + const val RING_OF_STONE_6583 = 6583 + const val RING_OF_STONE_6584 = 6584 + const val AMULET_OF_FURY_6585 = 6585 + const val AMULET_OF_FURY_6586 = 6586 + const val WHITE_CLAWS_6587 = 6587 + const val WHITE_CLAWS_6588 = 6588 + const val WHITE_BATTLEAXE_6589 = 6589 + const val WHITE_BATTLEAXE_6590 = 6590 + const val WHITE_DAGGER_6591 = 6591 + const val WHITE_DAGGER_6592 = 6592 + const val WHITE_DAGGERP_6593 = 6593 + const val WHITE_DAGGERP_6594 = 6594 + const val WHITE_DAGGERP_PLUS_6595 = 6595 + const val WHITE_DAGGERP_PLUS_6596 = 6596 + const val WHITE_DAGGERP_PLUS_PLUS_6597 = 6597 + const val WHITE_DAGGERP_PLUS_PLUS_6598 = 6598 + const val WHITE_HALBERD_6599 = 6599 + const val WHITE_HALBERD_6600 = 6600 + const val WHITE_MACE_6601 = 6601 + const val WHITE_MACE_6602 = 6602 + const val WHITE_MAGIC_STAFF_6603 = 6603 + const val WHITE_MAGIC_STAFF_6604 = 6604 + const val WHITE_SWORD_6605 = 6605 + const val WHITE_SWORD_6606 = 6606 + const val WHITE_LONGSWORD_6607 = 6607 + const val WHITE_LONGSWORD_6608 = 6608 + const val WHITE_2H_SWORD_6609 = 6609 + const val WHITE_2H_SWORD_6610 = 6610 + const val WHITE_SCIMITAR_6611 = 6611 + const val WHITE_SCIMITAR_6612 = 6612 + const val WHITE_WARHAMMER_6613 = 6613 + const val WHITE_WARHAMMER_6614 = 6614 + const val WHITE_CHAINBODY_6615 = 6615 + const val WHITE_CHAINBODY_6616 = 6616 + const val WHITE_PLATEBODY_6617 = 6617 + const val WHITE_PLATEBODY_6618 = 6618 + const val WHITE_BOOTS_6619 = 6619 + const val WHITE_BOOTS_6620 = 6620 + const val WHITE_MED_HELM_6621 = 6621 + const val WHITE_MED_HELM_6622 = 6622 + const val WHITE_FULL_HELM_6623 = 6623 + const val WHITE_FULL_HELM_6624 = 6624 + const val WHITE_PLATELEGS_6625 = 6625 + const val WHITE_PLATELEGS_6626 = 6626 + const val WHITE_PLATESKIRT_6627 = 6627 + const val WHITE_PLATESKIRT_6628 = 6628 + const val WHITE_GLOVES_6629 = 6629 + const val WHITE_GLOVES_6630 = 6630 + const val WHITE_SQ_SHIELD_6631 = 6631 + const val WHITE_SQ_SHIELD_6632 = 6632 + const val WHITE_KITESHIELD_6633 = 6633 + const val WHITE_KITESHIELD_6634 = 6634 + const val COMMORB_6635 = 6635 + const val SOLUSS_HAT_6636 = 6636 + const val DARK_BEAST_6637 = 6637 + const val COLOUR_WHEEL_6638 = 6638 + const val HAND_MIRROR_6639 = 6639 + const val RED_CRYSTAL_6640 = 6640 + const val YELLOW_CRYSTAL_6641 = 6641 + const val GREEN_CRYSTAL_6642 = 6642 + const val CYAN_CRYSTAL_6643 = 6643 + const val BLUE_CRYSTAL_6644 = 6644 + const val MAGENTA_CRYSTAL_6645 = 6645 + const val FRACTURED_CRYSTAL_6646 = 6646 + const val FRACTURED_CRYSTAL_6647 = 6647 + const val ITEM_LIST_6648 = 6648 + const val EDERNS_JOURNAL_6649 = 6649 + const val BLACKENED_CRYSTAL_6650 = 6650 + const val NEWLY_MADE_CRYSTAL_6651 = 6651 + const val NEWLY_MADE_CRYSTAL_6652 = 6652 + const val CRYSTAL_TRINKET_6653 = 6653 + const val CAMO_TOP_6654 = 6654 + const val CAMO_BOTTOMS_6655 = 6655 + const val CAMO_HELMET_6656 = 6656 + const val CAMO_TOP_6657 = 6657 + const val CAMO_BOTTOMS_6658 = 6658 + const val CAMO_HELMET_6659 = 6659 + const val FISHING_EXPLOSIVE_6660 = 6660 + const val MOGRE_6661 = 6661 + const val BROKEN_FISHING_ROD_6662 = 6662 + const val FORLORN_BOOT_6663 = 6663 + const val FISHING_EXPLOSIVE_6664 = 6664 + const val MUDSKIPPER_HAT_6665 = 6665 + const val FLIPPERS_6666 = 6666 + const val FISHBOWL_6667 = 6667 + const val FISHBOWL_6668 = 6668 + const val FISHBOWL_6669 = 6669 + const val FISHBOWL_6670 = 6670 + const val FISHBOWL_6671 = 6671 + const val FISHBOWL_6672 = 6672 + const val FISHBOWL_AND_NET_6673 = 6673 + const val TINY_NET_6674 = 6674 + const val AN_EMPTY_BOX_6675 = 6675 + const val TINDERBOX_6676 = 6676 + const val GUAM_IN_A_BOX_6677 = 6677 + const val GUAM_IN_A_BOX_6678 = 6678 + const val SEAWEED_IN_A_BOX_6679 = 6679 + const val SEAWEED_IN_A_BOX_6680 = 6680 + const val GROUND_GUAM_6681 = 6681 + const val GROUND_GUAM_6682 = 6682 + const val GROUND_SEAWEED_6683 = 6683 + const val GROUND_SEAWEED_6684 = 6684 + const val SARADOMIN_BREW4_6685 = 6685 + const val SARADOMIN_BREW4_6686 = 6686 + const val SARADOMIN_BREW3_6687 = 6687 + const val SARADOMIN_BREW3_6688 = 6688 + const val SARADOMIN_BREW2_6689 = 6689 + const val SARADOMIN_BREW2_6690 = 6690 + const val SARADOMIN_BREW1_6691 = 6691 + const val SARADOMIN_BREW1_6692 = 6692 + const val CRUSHED_NEST_6693 = 6693 + const val CRUSHED_NEST_6694 = 6694 + const val DESERT_LIZARD_6695 = 6695 + const val ICE_COOLER_6696 = 6696 + const val PAT_OF_BUTTER_6697 = 6697 + const val PAT_OF_BUTTER_6698 = 6698 + const val BURNT_POTATO_6699 = 6699 + const val BURNT_POTATO_6700 = 6700 + const val BAKED_POTATO_6701 = 6701 + const val BAKED_POTATO_6702 = 6702 + const val POTATO_WITH_BUTTER_6703 = 6703 + const val POTATO_WITH_BUTTER_6704 = 6704 + const val POTATO_WITH_CHEESE_6705 = 6705 + const val POTATO_WITH_CHEESE_6706 = 6706 + const val CAMULET_6707 = 6707 + const val SLAYER_GLOVES_6708 = 6708 + const val FEVER_SPIDER_6709 = 6709 + const val BLINDWEED_SEED_6710 = 6710 + const val BLINDWEED_6711 = 6711 + const val BUCKET_OF_WATER_6712 = 6712 + const val WRENCH_6713 = 6713 + const val HOLY_WRENCH_6714 = 6714 + const val SLUGLINGS_6715 = 6715 + const val KARAMTHULHU_6716 = 6716 + const val KARAMTHULHU_6717 = 6717 + const val FEVER_SPIDER_BODY_6718 = 6718 + const val UNSANITARY_SWILL_6719 = 6719 + const val SLAYER_GLOVES_6720 = 6720 + const val RUSTY_SCIMITAR_6721 = 6721 + const val ZOMBIE_HEAD_6722 = 6722 + const val FISHBOWL_6723 = 6723 + const val SEERCULL_6724 = 6724 + const val SEERCULL_6725 = 6725 + const val MUD_BATTLESTAFF_6726 = 6726 + const val MYSTIC_MUD_STAFF_6727 = 6727 + const val BONEMEAL_6728 = 6728 + const val DAGANNOTH_BONES_6729 = 6729 + const val DAGANNOTH_BONES_6730 = 6730 + const val SEERS_RING_6731 = 6731 + const val SEERS_RING_6732 = 6732 + const val ARCHERS_RING_6733 = 6733 + const val ARCHERS_RING_6734 = 6734 + const val WARRIOR_RING_6735 = 6735 + const val WARRIOR_RING_6736 = 6736 + const val BERSERKER_RING_6737 = 6737 + const val BERSERKER_RING_6738 = 6738 + const val DRAGON_AXE_6739 = 6739 + const val DRAGON_AXE_6740 = 6740 + const val BROKEN_AXE_6741 = 6741 + const val BROKEN_AXE_6742 = 6742 + const val PICTURE_6743 = 6743 + const val PICTURE_6744 = 6744 + const val SILVERLIGHT_6745 = 6745 + const val DARKLIGHT_6746 = 6746 + const val DEMONIC_SIGIL_MOULD_6747 = 6747 + const val DEMONIC_SIGIL_6748 = 6748 + const val DEMONIC_TOME_6749 = 6749 + const val BLACK_DESERT_SHIRT_6750 = 6750 + const val TINDERBOX_6751 = 6751 + const val BLACK_DESERT_ROBE_6752 = 6752 + const val PICTURE_6753 = 6753 + const val ENCHANTED_KEY_6754 = 6754 + const val JOURNAL_6755 = 6755 + const val LETTER_6756 = 6756 + const val LETTER_6757 = 6757 + const val SCROLL_6758 = 6758 + const val CHEST_6759 = 6759 + const val GUTHIX_MJOLNIR_6760 = 6760 + const val GUTHIX_MJOLNIR_6761 = 6761 + const val SARADOMIN_MJOLNIR_6762 = 6762 + const val SARADOMIN_MJOLNIR_6763 = 6763 + const val ZAMORAK_MJOLNIR_6764 = 6764 + const val ZAMORAK_MJOLNIR_6765 = 6765 + const val CAT_ANTIPOISON_6766 = 6766 + const val BOOK_6767 = 6767 + const val POISONED_CHEESE_6768 = 6768 + const val MUSIC_SCROLL_6769 = 6769 + const val DIRECTIONS_6770 = 6770 + const val POT_OF_WEEDS_6771 = 6771 + const val SMOULDERING_POT_6772 = 6772 + const val RAT_POLE_6773 = 6773 + const val RAT_POLE_6774 = 6774 + const val RAT_POLE_6775 = 6775 + const val RAT_POLE_6776 = 6776 + const val RAT_POLE_6777 = 6777 + const val RAT_POLE_6778 = 6778 + const val RAT_POLE_6779 = 6779 + const val MENAPHITE_THUG_6780 = 6780 + const val BANDIT_6781 = 6781 + const val BANDIT_6782 = 6782 + const val NULL_6783 = 6783 + const val NULL_6784 = 6784 + const val STATUETTE_6785 = 6785 + const val ROBE_OF_ELIDINIS_6786 = 6786 + const val ROBE_OF_ELIDINIS_6787 = 6787 + const val TORN_ROBE_6788 = 6788 + const val TORN_ROBE_6789 = 6789 + const val SHOES_6790 = 6790 + const val SOLE_6791 = 6791 + const val ANCESTRAL_KEY_6792 = 6792 + const val BALLAD_6793 = 6793 + const val CHOC_ICE_6794 = 6794 + const val CHOC_ICE_6795 = 6795 + const val LAMP_6796 = 6796 + const val WATERING_CAN_6797 = 6797 + const val CHAMPION_SCROLL_6798 = 6798 + const val CHAMPION_SCROLL_6799 = 6799 + const val CHAMPION_SCROLL_6800 = 6800 + const val CHAMPION_SCROLL_6801 = 6801 + const val CHAMPION_SCROLL_6802 = 6802 + const val CHAMPION_SCROLL_6803 = 6803 + const val CHAMPION_SCROLL_6804 = 6804 + const val CHAMPION_SCROLL_6805 = 6805 + const val CHAMPION_SCROLL_6806 = 6806 + const val CHAMPION_SCROLL_6807 = 6807 + const val CHAMPION_SCROLL_6808 = 6808 + const val GRANITE_LEGS_6809 = 6809 + const val BONEMEAL_6810 = 6810 + const val SKELETAL_WYVERN_6811 = 6811 + const val WYVERN_BONES_6812 = 6812 + const val GRANITE_LEGS_6813 = 6813 + const val FUR_6814 = 6814 + const val FUR_6815 = 6815 + const val WYVERN_BONES_6816 = 6816 + const val SLENDER_BLADE_6817 = 6817 + const val BOW_SWORD_6818 = 6818 + const val LARGE_POUCH_6819 = 6819 + const val RELIC_6820 = 6820 + const val ORB_6821 = 6821 + const val STAR_BAUBLE_6822 = 6822 + const val STAR_BAUBLE_6823 = 6823 + const val STAR_BAUBLE_6824 = 6824 + const val STAR_BAUBLE_6825 = 6825 + const val STAR_BAUBLE_6826 = 6826 + const val STAR_BAUBLE_6827 = 6827 + const val BOX_BAUBLE_6828 = 6828 + const val BOX_BAUBLE_6829 = 6829 + const val BOX_BAUBLE_6830 = 6830 + const val BOX_BAUBLE_6831 = 6831 + const val BOX_BAUBLE_6832 = 6832 + const val BOX_BAUBLE_6833 = 6833 + const val DIAMOND_BAUBLE_6834 = 6834 + const val DIAMOND_BAUBLE_6835 = 6835 + const val DIAMOND_BAUBLE_6836 = 6836 + const val DIAMOND_BAUBLE_6837 = 6837 + const val DIAMOND_BAUBLE_6838 = 6838 + const val DIAMOND_BAUBLE_6839 = 6839 + const val TREE_BAUBLE_6840 = 6840 + const val TREE_BAUBLE_6841 = 6841 + const val TREE_BAUBLE_6842 = 6842 + const val TREE_BAUBLE_6843 = 6843 + const val TREE_BAUBLE_6844 = 6844 + const val TREE_BAUBLE_6845 = 6845 + const val BELL_BAUBLE_6846 = 6846 + const val BELL_BAUBLE_6847 = 6847 + const val BELL_BAUBLE_6848 = 6848 + const val BELL_BAUBLE_6849 = 6849 + const val BELL_BAUBLE_6850 = 6850 + const val BELL_BAUBLE_6851 = 6851 + const val PUPPET_BOX_6852 = 6852 + const val BAUBLE_BOX_6853 = 6853 + const val PUPPET_BOX_6854 = 6854 + const val BAUBLE_BOX_6855 = 6855 + const val BOBBLE_HAT_6856 = 6856 + const val BOBBLE_SCARF_6857 = 6857 + const val JESTER_HAT_6858 = 6858 + const val JESTER_SCARF_6859 = 6859 + const val TRI_JESTER_HAT_6860 = 6860 + const val TRI_JESTER_SCARF_6861 = 6861 + const val WOOLLY_HAT_6862 = 6862 + const val WOOLLY_SCARF_6863 = 6863 + const val MARIONETTE_HANDLE_6864 = 6864 + const val BLUE_MARIONETTE_6865 = 6865 + const val GREEN_MARIONETTE_6866 = 6866 + const val RED_MARIONETTE_6867 = 6867 + const val BLUE_MARIONETTE_6868 = 6868 + const val GREEN_MARIONETTE_6869 = 6869 + const val RED_MARIONETTE_6870 = 6870 + const val RED_MARIONETTE_6871 = 6871 + const val RED_MARIONETTE_6872 = 6872 + const val RED_MARIONETTE_6873 = 6873 + const val RED_MARIONETTE_6874 = 6874 + const val BLUE_MARIONETTE_6875 = 6875 + const val BLUE_MARIONETTE_6876 = 6876 + const val BLUE_MARIONETTE_6877 = 6877 + const val BLUE_MARIONETTE_6878 = 6878 + const val GREEN_MARIONETTE_6879 = 6879 + const val GREEN_MARIONETTE_6880 = 6880 + const val GREEN_MARIONETTE_6881 = 6881 + const val GREEN_MARIONETTE_6882 = 6882 + const val PEACH_6883 = 6883 + const val NULL_6884 = 6884 + const val PROGRESS_HAT_6885 = 6885 + const val PROGRESS_HAT_6886 = 6886 + const val PROGRESS_HAT_6887 = 6887 + const val GUARDIAN_STATUE_6888 = 6888 + const val MAGES_BOOK_6889 = 6889 + const val MAGES_BOOK_6890 = 6890 + const val ARENA_BOOK_6891 = 6891 + const val TINDERBOX_6892 = 6892 + const val LEATHER_BOOTS_6893 = 6893 + const val ADAMANT_KITESHIELD_6894 = 6894 + const val ADAMANT_MED_HELM_6895 = 6895 + const val EMERALD_6896 = 6896 + const val RUNE_LONGSWORD_6897 = 6897 + const val CYLINDER_6898 = 6898 + const val CUBE_6899 = 6899 + const val ICOSAHEDRON_6900 = 6900 + const val PENTAMID_6901 = 6901 + const val ORB_6902 = 6902 + const val DRAGONSTONE_6903 = 6903 + const val ANIMALS_BONES_6904 = 6904 + const val ANIMALS_BONES_6905 = 6905 + const val ANIMALS_BONES_6906 = 6906 + const val ANIMALS_BONES_6907 = 6907 + const val BEGINNER_WAND_6908 = 6908 + const val BEGINNER_WAND_6909 = 6909 + const val APPRENTICE_WAND_6910 = 6910 + const val APPRENTICE_WAND_6911 = 6911 + const val TEACHER_WAND_6912 = 6912 + const val TEACHER_WAND_6913 = 6913 + const val MASTER_WAND_6914 = 6914 + const val MASTER_WAND_6915 = 6915 + const val INFINITY_TOP_6916 = 6916 + const val INFINITY_TOP_6917 = 6917 + const val INFINITY_HAT_6918 = 6918 + const val INFINITY_HAT_6919 = 6919 + const val INFINITY_BOOTS_6920 = 6920 + const val INFINITY_BOOTS_6921 = 6921 + const val INFINITY_GLOVES_6922 = 6922 + const val INFINITY_GLOVES_6923 = 6923 + const val INFINITY_BOTTOMS_6924 = 6924 + const val INFINITY_BOTTOMS_6925 = 6925 + const val BONES_TO_PEACHES_6926 = 6926 + const val NULL_6927 = 6927 + const val NULL_6928 = 6928 + const val NULL_6929 = 6929 + const val NULL_6930 = 6930 + const val NULL_6931 = 6931 + const val NULL_6932 = 6932 + const val NULL_6933 = 6933 + const val NULL_6934 = 6934 + const val NULL_6935 = 6935 + const val NULL_6936 = 6936 + const val NULL_6937 = 6937 + const val NULL_6938 = 6938 + const val NULL_6939 = 6939 + const val NULL_6940 = 6940 + const val NULL_6941 = 6941 + const val NULL_6942 = 6942 + const val NULL_6943 = 6943 + const val NULL_6944 = 6944 + const val SANDY_HAND_6945 = 6945 + const val BEER_SOAKED_HAND_6946 = 6946 + const val BERTS_ROTA_6947 = 6947 + const val SANDYS_ROTA_6948 = 6948 + const val A_MAGIC_SCROLL_6949 = 6949 + const val MAGICAL_ORB_6950 = 6950 + const val MAGICAL_ORB_A_6951 = 6951 + const val TRUTH_SERUM_6952 = 6952 + const val BOTTLED_WATER_6953 = 6953 + const val REDBERRY_JUICE_6954 = 6954 + const val PINK_DYE_6955 = 6955 + const val ROSE_TINTED_LENS_6956 = 6956 + const val WIZARDS_HEAD_6957 = 6957 + const val SAND_6958 = 6958 + const val CAPE_6959 = 6959 + const val CAPE_6960 = 6960 + const val BAGUETTE_6961 = 6961 + const val TRIANGLE_SANDWICH_6962 = 6962 + const val ROLL_6963 = 6963 + const val COINS_6964 = 6964 + const val SQUARE_SANDWICH_6965 = 6965 + const val PRISON_KEY_6966 = 6966 + const val DRAGON_MED_HELM_6967 = 6967 + const val TRIANGLE_SANDWICH_6968 = 6968 + const val SHARK_6969 = 6969 + const val PYRAMID_TOP_6970 = 6970 + const val SANDSTONE_1KG_6971 = 6971 + const val SANDSTONE_1KG_6972 = 6972 + const val SANDSTONE_2KG_6973 = 6973 + const val SANDSTONE_2KG_6974 = 6974 + const val SANDSTONE_5KG_6975 = 6975 + const val SANDSTONE_5KG_6976 = 6976 + const val SANDSTONE_10KG_6977 = 6977 + const val SANDSTONE_10KG_6978 = 6978 + const val GRANITE_500G_6979 = 6979 + const val GRANITE_500G_6980 = 6980 + const val GRANITE_2KG_6981 = 6981 + const val GRANITE_2KG_6982 = 6982 + const val GRANITE_5KG_6983 = 6983 + const val GRANITE_5KG_6984 = 6984 + const val SANDSTONE_20KG_6985 = 6985 + const val SANDSTONE_32KG_6986 = 6986 + const val SANDSTONE_BODY_6987 = 6987 + const val SANDSTONE_BASE_6988 = 6988 + const val STONE_HEAD_6989 = 6989 + const val STONE_HEAD_6990 = 6990 + const val STONE_HEAD_6991 = 6991 + const val STONE_HEAD_6992 = 6992 + const val Z_SIGIL_6993 = 6993 + const val M_SIGIL_6994 = 6994 + const val R_SIGIL_6995 = 6995 + const val K_SIGIL_6996 = 6996 + const val STONE_LEFT_ARM_6997 = 6997 + const val STONE_RIGHT_ARM_6998 = 6998 + const val STONE_LEFT_LEG_6999 = 6999 + const val STONE_RIGHT_LEG_7000 = 7000 + const val CAMEL_MOULD_P_7001 = 7001 + const val STONE_HEAD_7002 = 7002 + const val CAMEL_MASK_7003 = 7003 + const val CHISEL_7004 = 7004 + const val NULL_7005 = 7005 + const val NULL_7006 = 7006 + const val NULL_7007 = 7007 + const val NULL_7008 = 7008 + const val NULL_7009 = 7009 + const val NULL_7010 = 7010 + const val NULL_7011 = 7011 + const val NULL_7012 = 7012 + const val NULL_7013 = 7013 + const val NULL_7014 = 7014 + const val NULL_7015 = 7015 + const val NULL_7016 = 7016 + const val NULL_7017 = 7017 + const val NULL_7018 = 7018 + const val NULL_7019 = 7019 + const val NULL_7020 = 7020 + const val NULL_7021 = 7021 + const val NULL_7022 = 7022 + const val NULL_7023 = 7023 + const val NULL_7024 = 7024 + const val NULL_7025 = 7025 + const val NULL_7026 = 7026 + const val NULL_7027 = 7027 + const val NULL_7028 = 7028 + const val NULL_7029 = 7029 + const val NULL_7030 = 7030 + const val NULL_7031 = 7031 + const val NULL_7032 = 7032 + const val NULL_7033 = 7033 + const val NULL_7034 = 7034 + const val NULL_7035 = 7035 + const val NULL_7036 = 7036 + const val NULL_7037 = 7037 + const val NULL_7038 = 7038 + const val NULL_7039 = 7039 + const val NULL_7040 = 7040 + const val NULL_7041 = 7041 + const val NULL_7042 = 7042 + const val NULL_7043 = 7043 + const val NULL_7044 = 7044 + const val NULL_7045 = 7045 + const val NULL_7046 = 7046 + const val NULL_7047 = 7047 + const val NULL_7048 = 7048 + const val NULL_7049 = 7049 + const val SWARM_7050 = 7050 + const val UNLIT_BUG_LANTERN_7051 = 7051 + const val UNLIT_BUG_LANTERN_7052 = 7052 + const val LIT_BUG_LANTERN_7053 = 7053 + const val CHILLI_POTATO_7054 = 7054 + const val CHILLI_POTATO_7055 = 7055 + const val EGG_POTATO_7056 = 7056 + const val EGG_POTATO_7057 = 7057 + const val MUSHROOM_POTATO_7058 = 7058 + const val MUSHROOM_POTATO_7059 = 7059 + const val TUNA_POTATO_7060 = 7060 + const val TUNA_POTATO_7061 = 7061 + const val CHILLI_CON_CARNE_7062 = 7062 + const val CHILLI_CON_CARNE_7063 = 7063 + const val EGG_AND_TOMATO_7064 = 7064 + const val EGG_AND_TOMATO_7065 = 7065 + const val MUSHROOM_AND_ONION_7066 = 7066 + const val MUSHROOM_AND_ONION_7067 = 7067 + const val TUNA_AND_CORN_7068 = 7068 + const val TUNA_AND_CORN_7069 = 7069 + const val MINCED_MEAT_7070 = 7070 + const val MINCED_MEAT_7071 = 7071 + const val SPICY_SAUCE_7072 = 7072 + const val SPICY_SAUCE_7073 = 7073 + const val CHOPPED_GARLIC_7074 = 7074 + const val CHOPPED_GARLIC_7075 = 7075 + const val UNCOOKED_EGG_7076 = 7076 + const val UNCOOKED_EGG_7077 = 7077 + const val SCRAMBLED_EGG_7078 = 7078 + const val SCRAMBLED_EGG_7079 = 7079 + const val SLICED_MUSHROOMS_7080 = 7080 + const val SLICED_MUSHROOMS_7081 = 7081 + const val FRIED_MUSHROOMS_7082 = 7082 + const val FRIED_MUSHROOMS_7083 = 7083 + const val FRIED_ONIONS_7084 = 7084 + const val FRIED_ONIONS_7085 = 7085 + const val CHOPPED_TUNA_7086 = 7086 + const val CHOPPED_TUNA_7087 = 7087 + const val SWEETCORN_7088 = 7088 + const val SWEETCORN_7089 = 7089 + const val BURNT_EGG_7090 = 7090 + const val BURNT_EGG_7091 = 7091 + const val BURNT_ONION_7092 = 7092 + const val BURNT_ONION_7093 = 7093 + const val BURNT_MUSHROOM_7094 = 7094 + const val BURNT_MUSHROOM_7095 = 7095 + const val BOARD_GAME_PIECE_7096 = 7096 + const val BOARD_GAME_PIECE_7097 = 7097 + const val BOARD_GAME_PIECE_7098 = 7098 + const val BOARD_GAME_PIECE_7099 = 7099 + const val BOARD_GAME_PIECE_7100 = 7100 + const val BOARD_GAME_PIECE_7101 = 7101 + const val BOARD_GAME_PIECE_7102 = 7102 + const val BOARD_GAME_PIECE_7103 = 7103 + const val BOARD_GAME_PIECE_7104 = 7104 + const val BOARD_GAME_PIECE_7105 = 7105 + const val BOARD_GAME_PIECE_7106 = 7106 + const val BOARD_GAME_PIECE_7107 = 7107 + const val GUNPOWDER_7108 = 7108 + const val FUSE_7109 = 7109 + const val STRIPY_PIRATE_SHIRT_7110 = 7110 + const val STRIPY_PIRATE_SHIRT_7111 = 7111 + const val PIRATE_BANDANA_7112 = 7112 + const val PIRATE_BANDANA_7113 = 7113 + const val PIRATE_BOOTS_7114 = 7114 + const val PIRATE_BOOTS_7115 = 7115 + const val PIRATE_LEGGINGS_7116 = 7116 + const val PIRATE_LEGGINGS_7117 = 7117 + const val CANISTER_7118 = 7118 + const val CANNON_BALL_7119 = 7119 + const val RAMROD_7120 = 7120 + const val REPAIR_PLANK_7121 = 7121 + const val STRIPY_PIRATE_SHIRT_7122 = 7122 + const val STRIPY_PIRATE_SHIRT_7123 = 7123 + const val PIRATE_BANDANA_7124 = 7124 + const val PIRATE_BANDANA_7125 = 7125 + const val PIRATE_LEGGINGS_7126 = 7126 + const val PIRATE_LEGGINGS_7127 = 7127 + const val STRIPY_PIRATE_SHIRT_7128 = 7128 + const val STRIPY_PIRATE_SHIRT_7129 = 7129 + const val PIRATE_BANDANA_7130 = 7130 + const val PIRATE_BANDANA_7131 = 7131 + const val PIRATE_LEGGINGS_7132 = 7132 + const val PIRATE_LEGGINGS_7133 = 7133 + const val STRIPY_PIRATE_SHIRT_7134 = 7134 + const val STRIPY_PIRATE_SHIRT_7135 = 7135 + const val PIRATE_BANDANA_7136 = 7136 + const val PIRATE_BANDANA_7137 = 7137 + const val PIRATE_LEGGINGS_7138 = 7138 + const val PIRATE_LEGGINGS_7139 = 7139 + const val LUCKY_CUTLASS_7140 = 7140 + const val HARRYS_CUTLASS_7141 = 7141 + const val RAPIER_7142 = 7142 + const val PLUNDER_7143 = 7143 + const val BOOK_O_PIRACY_7144 = 7144 + const val CANNON_BARREL_7145 = 7145 + const val BROKEN_CANNON_7146 = 7146 + const val CANNON_BALLS_7147 = 7147 + const val REPAIR_PLANK_7148 = 7148 + const val CANISTER_7149 = 7149 + const val TACKS_7150 = 7150 + const val NULL_7151 = 7151 + const val NULL_7152 = 7152 + const val NULL_7153 = 7153 + const val NULL_7154 = 7154 + const val ROPE_7155 = 7155 + const val TINDERBOX_7156 = 7156 + const val BRAINDEATH_RUM_7157 = 7157 + const val DRAGON_2H_SWORD_7158 = 7158 + const val INSULATED_BOOTS_7159 = 7159 + const val KILLERWATT_7160 = 7160 + const val INSULATED_BOOTS_7161 = 7161 + const val PIE_RECIPE_BOOK_7162 = 7162 + const val PIE_RECIPE_BOOK_7163 = 7163 + const val PART_MUD_PIE_7164 = 7164 + const val PART_MUD_PIE_7165 = 7165 + const val PART_MUD_PIE_7166 = 7166 + const val PART_MUD_PIE_7167 = 7167 + const val RAW_MUD_PIE_7168 = 7168 + const val RAW_MUD_PIE_7169 = 7169 + const val MUD_PIE_7170 = 7170 + const val MUD_PIE_7171 = 7171 + const val PART_GARDEN_PIE_7172 = 7172 + const val PART_GARDEN_PIE_7173 = 7173 + const val PART_GARDEN_PIE_7174 = 7174 + const val PART_GARDEN_PIE_7175 = 7175 + const val RAW_GARDEN_PIE_7176 = 7176 + const val RAW_GARDEN_PIE_7177 = 7177 + const val GARDEN_PIE_7178 = 7178 + const val GARDEN_PIE_7179 = 7179 + const val HALF_A_GARDEN_PIE_7180 = 7180 + const val HALF_A_GARDEN_PIE_7181 = 7181 + const val PART_FISH_PIE_7182 = 7182 + const val PART_FISH_PIE_7183 = 7183 + const val PART_FISH_PIE_7184 = 7184 + const val PART_FISH_PIE_7185 = 7185 + const val RAW_FISH_PIE_7186 = 7186 + const val RAW_FISH_PIE_7187 = 7187 + const val FISH_PIE_7188 = 7188 + const val FISH_PIE_7189 = 7189 + const val HALF_A_FISH_PIE_7190 = 7190 + const val HALF_A_FISH_PIE_7191 = 7191 + const val PART_ADMIRAL_PIE_7192 = 7192 + const val PART_ADMIRAL_PIE_7193 = 7193 + const val PART_ADMIRAL_PIE_7194 = 7194 + const val PART_ADMIRAL_PIE_7195 = 7195 + const val RAW_ADMIRAL_PIE_7196 = 7196 + const val RAW_ADMIRAL_PIE_7197 = 7197 + const val ADMIRAL_PIE_7198 = 7198 + const val ADMIRAL_PIE_7199 = 7199 + const val HALF_AN_ADMIRAL_PIE_7200 = 7200 + const val HALF_AN_ADMIRAL_PIE_7201 = 7201 + const val PART_WILD_PIE_7202 = 7202 + const val PART_WILD_PIE_7203 = 7203 + const val PART_WILD_PIE_7204 = 7204 + const val PART_WILD_PIE_7205 = 7205 + const val RAW_WILD_PIE_7206 = 7206 + const val RAW_WILD_PIE_7207 = 7207 + const val WILD_PIE_7208 = 7208 + const val WILD_PIE_7209 = 7209 + const val HALF_A_WILD_PIE_7210 = 7210 + const val HALF_A_WILD_PIE_7211 = 7211 + const val PART_SUMMER_PIE_7212 = 7212 + const val PART_SUMMER_PIE_7213 = 7213 + const val PART_SUMMER_PIE_7214 = 7214 + const val PART_SUMMER_PIE_7215 = 7215 + const val RAW_SUMMER_PIE_7216 = 7216 + const val RAW_SUMMER_PIE_7217 = 7217 + const val SUMMER_PIE_7218 = 7218 + const val SUMMER_PIE_7219 = 7219 + const val HALF_A_SUMMER_PIE_7220 = 7220 + const val HALF_A_SUMMER_PIE_7221 = 7221 + const val BURNT_RABBIT_7222 = 7222 + const val ROAST_RABBIT_7223 = 7223 + const val SKEWERED_RABBIT_7224 = 7224 + const val IRON_SPIT_7225 = 7225 + const val BURNT_CHOMPY_7226 = 7226 + const val BURNT_CHOMPY_7227 = 7227 + const val COOKED_CHOMPY_7228 = 7228 + const val COOKED_CHOMPY_7229 = 7229 + const val SKEWERED_CHOMPY_7230 = 7230 + const val BURNT_RABBIT_7231 = 7231 + const val ROAST_RABBIT_7232 = 7232 + const val SKEWERED_RABBIT_7233 = 7233 + const val IRON_SPIT_7234 = 7234 + const val SKEWERED_CHOMPY_7235 = 7235 + const val CLUE_SCROLL_7236 = 7236 + const val CASKET_7237 = 7237 + const val CLUE_SCROLL_7238 = 7238 + const val CLUE_SCROLL_7239 = 7239 + const val CASKET_7240 = 7240 + const val CLUE_SCROLL_7241 = 7241 + const val CASKET_7242 = 7242 + const val CLUE_SCROLL_7243 = 7243 + const val CASKET_7244 = 7244 + const val CLUE_SCROLL_7245 = 7245 + const val CASKET_7246 = 7246 + const val CLUE_SCROLL_7247 = 7247 + const val CLUE_SCROLL_7248 = 7248 + const val CLUE_SCROLL_7249 = 7249 + const val CLUE_SCROLL_7250 = 7250 + const val CLUE_SCROLL_7251 = 7251 + const val CLUE_SCROLL_7252 = 7252 + const val CLUE_SCROLL_7253 = 7253 + const val CLUE_SCROLL_7254 = 7254 + const val CLUE_SCROLL_7255 = 7255 + const val CLUE_SCROLL_7256 = 7256 + const val CASKET_7257 = 7257 + const val CLUE_SCROLL_7258 = 7258 + const val CASKET_7259 = 7259 + const val CLUE_SCROLL_7260 = 7260 + const val CASKET_7261 = 7261 + const val CLUE_SCROLL_7262 = 7262 + const val CASKET_7263 = 7263 + const val CLUE_SCROLL_7264 = 7264 + const val CASKET_7265 = 7265 + const val CLUE_SCROLL_7266 = 7266 + const val CASKET_7267 = 7267 + const val CLUE_SCROLL_7268 = 7268 + const val CHALLENGE_SCROLL_7269 = 7269 + const val CLUE_SCROLL_7270 = 7270 + const val CHALLENGE_SCROLL_7271 = 7271 + const val CLUE_SCROLL_7272 = 7272 + const val CHALLENGE_SCROLL_7273 = 7273 + const val CLUE_SCROLL_7274 = 7274 + const val CHALLENGE_SCROLL_7275 = 7275 + const val CLUE_SCROLL_7276 = 7276 + const val CHALLENGE_SCROLL_7277 = 7277 + const val CLUE_SCROLL_7278 = 7278 + const val CHALLENGE_SCROLL_7279 = 7279 + const val CLUE_SCROLL_7280 = 7280 + const val CHALLENGE_SCROLL_7281 = 7281 + const val CLUE_SCROLL_7282 = 7282 + const val CHALLENGE_SCROLL_7283 = 7283 + const val CLUE_SCROLL_7284 = 7284 + const val CHALLENGE_SCROLL_7285 = 7285 + const val CLUE_SCROLL_7286 = 7286 + const val CASKET_7287 = 7287 + const val CLUE_SCROLL_7288 = 7288 + const val CASKET_7289 = 7289 + const val CLUE_SCROLL_7290 = 7290 + const val CASKET_7291 = 7291 + const val CLUE_SCROLL_7292 = 7292 + const val CASKET_7293 = 7293 + const val CLUE_SCROLL_7294 = 7294 + const val CASKET_7295 = 7295 + const val CLUE_SCROLL_7296 = 7296 + const val KEY_7297 = 7297 + const val CLUE_SCROLL_7298 = 7298 + const val KEY_7299 = 7299 + const val CLUE_SCROLL_7300 = 7300 + const val CLUE_SCROLL_7301 = 7301 + const val KEY_7302 = 7302 + const val CLUE_SCROLL_7303 = 7303 + const val CLUE_SCROLL_7304 = 7304 + const val CLUE_SCROLL_7305 = 7305 + const val CASKET_7306 = 7306 + const val CLUE_SCROLL_7307 = 7307 + const val CASKET_7308 = 7308 + const val CLUE_SCROLL_7309 = 7309 + const val CASKET_7310 = 7310 + const val CLUE_SCROLL_7311 = 7311 + const val CASKET_7312 = 7312 + const val CLUE_SCROLL_7313 = 7313 + const val CASKET_7314 = 7314 + const val CLUE_SCROLL_7315 = 7315 + const val CASKET_7316 = 7316 + const val CLUE_SCROLL_7317 = 7317 + const val CASKET_7318 = 7318 + const val RED_BOATER_7319 = 7319 + const val RED_BOATER_7320 = 7320 + const val ORANGE_BOATER_7321 = 7321 + const val ORANGE_BOATER_7322 = 7322 + const val GREEN_BOATER_7323 = 7323 + const val GREEN_BOATER_7324 = 7324 + const val BLUE_BOATER_7325 = 7325 + const val BLUE_BOATER_7326 = 7326 + const val BLACK_BOATER_7327 = 7327 + const val BLACK_BOATER_7328 = 7328 + const val RED_FIRELIGHTER_7329 = 7329 + const val GREEN_FIRELIGHTER_7330 = 7330 + const val BLUE_FIRELIGHTER_7331 = 7331 + const val BLACK_SHIELDH1_7332 = 7332 + const val BLACK_SHIELDH1_7333 = 7333 + const val ADAMANT_SHIELDH1_7334 = 7334 + const val ADAMANT_SHIELDH1_7335 = 7335 + const val RUNE_SHIELDH1_7336 = 7336 + const val RUNE_SHIELDH1_7337 = 7337 + const val BLACK_SHIELDH2_7338 = 7338 + const val BLACK_SHIELDH2_7339 = 7339 + const val ADAMANT_SHIELDH2_7340 = 7340 + const val ADAMANT_SHIELDH2_7341 = 7341 + const val RUNE_SHIELDH2_7342 = 7342 + const val RUNE_SHIELDH2_7343 = 7343 + const val BLACK_SHIELDH3_7344 = 7344 + const val BLACK_SHIELDH3_7345 = 7345 + const val ADAMANT_SHIELDH3_7346 = 7346 + const val ADAMANT_SHIELDH3_7347 = 7347 + const val RUNE_SHIELDH3_7348 = 7348 + const val RUNE_SHIELDH3_7349 = 7349 + const val BLACK_SHIELDH4_7350 = 7350 + const val BLACK_SHIELDH4_7351 = 7351 + const val ADAMANT_SHIELDH4_7352 = 7352 + const val ADAMANT_SHIELDH4_7353 = 7353 + const val RUNE_SHIELDH4_7354 = 7354 + const val RUNE_SHIELDH4_7355 = 7355 + const val BLACK_SHIELDH5_7356 = 7356 + const val BLACK_SHIELDH5_7357 = 7357 + const val ADAMANT_SHIELDH5_7358 = 7358 + const val ADAMANT_SHIELDH5_7359 = 7359 + const val RUNE_SHIELDH5_7360 = 7360 + const val RUNE_SHIELDH5_7361 = 7361 + const val STUDDED_BODY_G_7362 = 7362 + const val STUDDED_BODY_G_7363 = 7363 + const val STUDDED_BODY_T_7364 = 7364 + const val STUDDED_BODY_T_7365 = 7365 + const val STUDDED_CHAPS_G_7366 = 7366 + const val STUDDED_CHAPS_G_7367 = 7367 + const val STUDDED_CHAPS_T_7368 = 7368 + const val STUDDED_CHAPS_T_7369 = 7369 + const val DHIDE_BODYG_7370 = 7370 + const val DHIDE_BODYG_7371 = 7371 + const val DHIDE_BODY_T_7372 = 7372 + const val DHIDE_BODY_T_7373 = 7373 + const val DHIDE_BODY_G_7374 = 7374 + const val DHIDE_BODY_G_7375 = 7375 + const val DHIDE_BODY_T_7376 = 7376 + const val DHIDE_BODY_T_7377 = 7377 + const val DHIDE_CHAPS_G_7378 = 7378 + const val DHIDE_CHAPS_G_7379 = 7379 + const val DHIDE_CHAPS_T_7380 = 7380 + const val DHIDE_CHAPS_T_7381 = 7381 + const val DHIDE_CHAPS_G_7382 = 7382 + const val DHIDE_CHAPS_G_7383 = 7383 + const val DHIDE_CHAPS_T_7384 = 7384 + const val DHIDE_CHAPS_T_7385 = 7385 + const val BLUE_SKIRT_G_7386 = 7386 + const val BLUE_SKIRT_G_7387 = 7387 + const val BLUE_SKIRT_T_7388 = 7388 + const val BLUE_SKIRT_T_7389 = 7389 + const val WIZARD_ROBE_G_7390 = 7390 + const val WIZARD_ROBE_G_7391 = 7391 + const val WIZARD_ROBE_T_7392 = 7392 + const val WIZARD_ROBE_T_7393 = 7393 + const val WIZARD_HAT_G_7394 = 7394 + const val WIZARD_HAT_G_7395 = 7395 + const val WIZARD_HAT_T_7396 = 7396 + const val WIZARD_HAT_T_7397 = 7397 + const val ENCHANTED_ROBE_7398 = 7398 + const val ENCHANTED_TOP_7399 = 7399 + const val ENCHANTED_HAT_7400 = 7400 + const val ENCHANTED_ROBE_7401 = 7401 + const val ENCHANTED_TOP_7402 = 7402 + const val ENCHANTED_HAT_7403 = 7403 + const val RED_LOGS_7404 = 7404 + const val GREEN_LOGS_7405 = 7405 + const val BLUE_LOGS_7406 = 7406 + const val DRAGON_2H_SWORD_7407 = 7407 + const val DRAYNOR_SKULL_7408 = 7408 + const val MAGIC_SECATEURS_7409 = 7409 + const val QUEENS_SECATEURS_7410 = 7410 + const val SYMPTOMS_LIST_7411 = 7411 + const val NULL_7412 = 7412 + const val BIRDS_NEST_7413 = 7413 + const val PADDLE_7414 = 7414 + const val PADDLE_7415 = 7415 + const val MOLE_CLAW_7416 = 7416 + const val MOLE_CLAW_7417 = 7417 + const val MOLE_SKIN_7418 = 7418 + const val MOLE_SKIN_7419 = 7419 + const val MUTATED_ZYGOMITE_7420 = 7420 + const val FUNGICIDE_SPRAY_10_7421 = 7421 + const val FUNGICIDE_SPRAY_9_7422 = 7422 + const val FUNGICIDE_SPRAY_8_7423 = 7423 + const val FUNGICIDE_SPRAY_7_7424 = 7424 + const val FUNGICIDE_SPRAY_6_7425 = 7425 + const val FUNGICIDE_SPRAY_5_7426 = 7426 + const val FUNGICIDE_SPRAY_4_7427 = 7427 + const val FUNGICIDE_SPRAY_3_7428 = 7428 + const val FUNGICIDE_SPRAY_2_7429 = 7429 + const val FUNGICIDE_SPRAY_1_7430 = 7430 + const val FUNGICIDE_SPRAY_0_7431 = 7431 + const val FUNGICIDE_7432 = 7432 + const val WOODEN_SPOON_7433 = 7433 + const val WOODEN_SPOON_7434 = 7434 + const val EGG_WHISK_7435 = 7435 + const val EGG_WHISK_7436 = 7436 + const val SPORK_7437 = 7437 + const val SPORK_7438 = 7438 + const val SPATULA_7439 = 7439 + const val SPATULA_7440 = 7440 + const val FRYING_PAN_7441 = 7441 + const val FRYING_PAN_7442 = 7442 + const val SKEWER_7443 = 7443 + const val SKEWER_7444 = 7444 + const val ROLLING_PIN_7445 = 7445 + const val ROLLING_PIN_7446 = 7446 + const val KITCHEN_KNIFE_7447 = 7447 + const val KITCHEN_KNIFE_7448 = 7448 + const val MEAT_TENDERISER_7449 = 7449 + const val MEAT_TENDERISER_7450 = 7450 + const val CLEAVER_7451 = 7451 + const val CLEAVER_7452 = 7452 + const val GLOVES_7453 = 7453 + const val GLOVES_7454 = 7454 + const val GLOVES_7455 = 7455 + const val GLOVES_7456 = 7456 + const val GLOVES_7457 = 7457 + const val GLOVES_7458 = 7458 + const val GLOVES_7459 = 7459 + const val GLOVES_7460 = 7460 + const val GLOVES_7461 = 7461 + const val GLOVES_7462 = 7462 + const val CORNFLOUR_7463 = 7463 + const val BOOK_ON_CHICKENS_7464 = 7464 + const val VANILLA_POD_7465 = 7465 + const val CORNFLOUR_7466 = 7466 + const val TINDERBOX_7467 = 7467 + const val POT_OF_CORNFLOUR_7468 = 7468 + const val TINDERBOX_7469 = 7469 + const val CORNFLOUR_MIXTURE_7470 = 7470 + const val MILKY_MIXTURE_7471 = 7471 + const val CINNAMON_7472 = 7472 + const val BRULEE_7473 = 7473 + const val BRULEE_7474 = 7474 + const val BRULEE_7475 = 7475 + const val BRULEE_SUPREME_7476 = 7476 + const val EVIL_CHICKENS_EGG_7477 = 7477 + const val DRAGON_TOKEN_7478 = 7478 + const val SPICY_STEW_7479 = 7479 + const val RED_SPICE_4_7480 = 7480 + const val RED_SPICE_3_7481 = 7481 + const val RED_SPICE_2_7482 = 7482 + const val RED_SPICE_1_7483 = 7483 + const val ORANGE_SPICE_4_7484 = 7484 + const val ORANGE_SPICE_3_7485 = 7485 + const val ORANGE_SPICE_2_7486 = 7486 + const val ORANGE_SPICE_1_7487 = 7487 + const val BROWN_SPICE_4_7488 = 7488 + const val BROWN_SPICE_3_7489 = 7489 + const val BROWN_SPICE_2_7490 = 7490 + const val BROWN_SPICE_1_7491 = 7491 + const val YELLOW_SPICE_4_7492 = 7492 + const val YELLOW_SPICE_3_7493 = 7493 + const val YELLOW_SPICE_2_7494 = 7494 + const val YELLOW_SPICE_1_7495 = 7495 + const val EMPTY_SPICE_SHAKER_7496 = 7496 + const val DIRTY_BLAST_7497 = 7497 + const val ANTIQUE_LAMP_7498 = 7498 + const val EVIL_DAVE_7499 = 7499 + const val DWARF_7500 = 7500 + const val GOBLINS_7501 = 7501 + const val LUMBRIDGE_GUIDE_7502 = 7502 + const val MONKEY_7503 = 7503 + const val OSMAN_7504 = 7504 + const val PIRATE_PETE_7505 = 7505 + const val SIR_AMIK_VARZE_7506 = 7506 + const val SKRACH_7507 = 7507 + const val ASGOLDIAN_ALE_7508 = 7508 + const val DWARVEN_ROCK_CAKE_7509 = 7509 + const val DWARVEN_ROCK_CAKE_7510 = 7510 + const val SLOP_OF_COMPROMISE_7511 = 7511 + const val SOGGY_BREAD_7512 = 7512 + const val SPICY_MAGGOTS_7513 = 7513 + const val DYED_ORANGE_7514 = 7514 + const val BREADCRUMBS_7515 = 7515 + const val KELP_7516 = 7516 + const val GROUND_KELP_7517 = 7517 + const val CRAB_MEAT_7518 = 7518 + const val CRAB_MEAT_7519 = 7519 + const val BURNT_CRAB_MEAT_7520 = 7520 + const val COOKED_CRAB_MEAT_7521 = 7521 + const val COOKED_CRAB_MEAT_7522 = 7522 + const val COOKED_CRAB_MEAT_7523 = 7523 + const val COOKED_CRAB_MEAT_7524 = 7524 + const val COOKED_CRAB_MEAT_7525 = 7525 + const val COOKED_CRAB_MEAT_7526 = 7526 + const val GROUND_CRAB_MEAT_7527 = 7527 + const val GROUND_COD_7528 = 7528 + const val RAW_FISHCAKE_7529 = 7529 + const val COOKED_FISHCAKE_7530 = 7530 + const val BURNT_FISHCAKE_7531 = 7531 + const val MUDSKIPPER_HIDE_7532 = 7532 + const val ROCK_7533 = 7533 + const val FISHBOWL_HELMET_7534 = 7534 + const val DIVING_APPARATUS_7535 = 7535 + const val FRESH_CRAB_CLAW_7536 = 7536 + const val CRAB_CLAW_7537 = 7537 + const val FRESH_CRAB_SHELL_7538 = 7538 + const val CRAB_HELMET_7539 = 7539 + const val BROKEN_CRAB_CLAW_7540 = 7540 + const val BROKEN_CRAB_SHELL_7541 = 7541 + const val CAKE_OF_GUIDANCE_7542 = 7542 + const val RAW_GUIDE_CAKE_7543 = 7543 + const val ENCHANTED_EGG_7544 = 7544 + const val ENCHANTED_MILK_7545 = 7545 + const val ENCHANTED_FLOUR_7546 = 7546 + const val DRUID_POUCH_7547 = 7547 + const val POTATO_SEED_7548 = 7548 + const val POTATO_SEED_7549 = 7549 + const val ONION_SEED_7550 = 7550 + const val ONION_SEED_7551 = 7551 + const val MITHRIL_ARROW_7552 = 7552 + const val MITHRIL_ARROW_7553 = 7553 + const val FIRE_RUNE_7554 = 7554 + const val FIRE_RUNE_7555 = 7555 + const val WATER_RUNE_7556 = 7556 + const val WATER_RUNE_7557 = 7557 + const val AIR_RUNE_7558 = 7558 + const val AIR_RUNE_7559 = 7559 + const val CHAOS_RUNE_7560 = 7560 + const val CHAOS_RUNE_7561 = 7561 + const val TOMATO_SEED_7562 = 7562 + const val TOMATO_SEED_7563 = 7563 + const val BALLOON_TOAD_7564 = 7564 + const val BALLOON_TOAD_7565 = 7565 + const val RAW_JUBBLY_7566 = 7566 + const val RAW_JUBBLY_7567 = 7567 + const val COOKED_JUBBLY_7568 = 7568 + const val COOKED_JUBBLY_7569 = 7569 + const val BURNT_JUBBLY_7570 = 7570 + const val BURNT_JUBBLY_7571 = 7571 + const val RED_BANANA_7572 = 7572 + const val TCHIKI_MONKEY_NUTS_7573 = 7573 + const val SLICED_RED_BANANA_7574 = 7574 + const val TCHIKI_NUT_PASTE_7575 = 7575 + const val SNAKE_CORPSE_7576 = 7576 + const val RAW_STUFFED_SNAKE_7577 = 7577 + const val ODD_STUFFED_SNAKE_7578 = 7578 + const val STUFFED_SNAKE_7579 = 7579 + const val SNAKE_OVER_COOKED_7580 = 7580 + const val OVERGROWN_HELLCAT_7581 = 7581 + const val HELL_CAT_7582 = 7582 + const val HELL_KITTEN_7583 = 7583 + const val LAZY_HELL_CAT_7584 = 7584 + const val WILY_HELLCAT_7585 = 7585 + const val DUMMY_7586 = 7586 + const val COFFIN_7587 = 7587 + const val COFFIN_7588 = 7588 + const val COFFIN_7589 = 7589 + const val COFFIN_7590 = 7590 + const val COFFIN_7591 = 7591 + const val ZOMBIE_SHIRT_7592 = 7592 + const val ZOMBIE_TROUSERS_7593 = 7593 + const val ZOMBIE_MASK_7594 = 7594 + const val ZOMBIE_GLOVES_7595 = 7595 + const val ZOMBIE_BOOTS_7596 = 7596 + const val ITEM_7597 = 7597 + const val ITEM_7598 = 7598 + const val ITEM_7599 = 7599 + const val ITEM_7600 = 7600 + const val ITEM_7601 = 7601 + const val ITEM_7602 = 7602 + const val ITEM_7603 = 7603 + const val ITEM_7604 = 7604 + const val ITEM_7605 = 7605 + const val ITEM_7606 = 7606 + const val ITEM_7607 = 7607 + const val ITEM_7608 = 7608 + const val ITEM_7609 = 7609 + const val ITEM_7610 = 7610 + const val ITEM_7611 = 7611 + const val ITEM_7612 = 7612 + const val ITEM_7613 = 7613 + const val ITEM_7614 = 7614 + const val ITEM_7615 = 7615 + const val ITEM_7616 = 7616 + const val ITEM_7617 = 7617 + const val ITEM_7618 = 7618 + const val NULL_7619 = 7619 + const val SILVTHRILL_ROD_7620 = 7620 + const val NULL_7621 = 7621 + const val BUCKET_OF_RUBBLE_7622 = 7622 + const val TINDERBOX_7623 = 7623 + const val BUCKET_OF_RUBBLE_7624 = 7624 + const val TINDERBOX_7625 = 7625 + const val BUCKET_OF_RUBBLE_7626 = 7626 + const val TINDERBOX_7627 = 7627 + const val PLASTER_FRAGMENT_7628 = 7628 + const val DUSTY_SCROLL_7629 = 7629 + const val CRATE_7630 = 7630 + const val TINDERBOX_7631 = 7631 + const val TEMPLE_LIBRARY_KEY_7632 = 7632 + const val ANCIENT_BOOK_7633 = 7633 + const val BATTERED_TOME_7634 = 7634 + const val LEATHER_BOOK_7635 = 7635 + const val ROD_DUST_7636 = 7636 + const val SILVTHRILL_ROD_7637 = 7637 + const val SILVTHRILL_ROD_7638 = 7638 + const val ROD_OF_IVANDIS10_7639 = 7639 + const val ROD_OF_IVANDIS9_7640 = 7640 + const val ROD_OF_IVANDIS8_7641 = 7641 + const val ROD_OF_IVANDIS7_7642 = 7642 + const val ROD_OF_IVANDIS6_7643 = 7643 + const val ROD_OF_IVANDIS5_7644 = 7644 + const val ROD_OF_IVANDIS4_7645 = 7645 + const val ROD_OF_IVANDIS3_7646 = 7646 + const val ROD_OF_IVANDIS2_7647 = 7647 + const val ROD_OF_IVANDIS1_7648 = 7648 + const val ROD_CLAY_MOULD_7649 = 7649 + const val SILVER_DUST_7650 = 7650 + const val SILVER_DUST_7651 = 7651 + const val GUTHIX_BALANCEUNF_7652 = 7652 + const val GUTHIX_BALANCEUNF_7653 = 7653 + const val GUTHIX_BALANCEUNF_7654 = 7654 + const val GUTHIX_BALANCEUNF_7655 = 7655 + const val GUTHIX_BALANCEUNF_7656 = 7656 + const val GUTHIX_BALANCEUNF_7657 = 7657 + const val GUTHIX_BALANCEUNF_7658 = 7658 + const val GUTHIX_BALANCEUNF_7659 = 7659 + const val GUTHIX_BALANCE4_7660 = 7660 + const val GUTHIX_BALANCE4_7661 = 7661 + const val GUTHIX_BALANCE3_7662 = 7662 + const val GUTHIX_BALANCE3_7663 = 7663 + const val GUTHIX_BALANCE2_7664 = 7664 + const val GUTHIX_BALANCE2_7665 = 7665 + const val GUTHIX_BALANCE1_7666 = 7666 + const val GUTHIX_BALANCE1_7667 = 7667 + const val GADDERHAMMER_7668 = 7668 + const val GADDERHAMMER_7669 = 7669 + const val NULL_7670 = 7670 + const val BOXING_GLOVES_7671 = 7671 + const val PICTURE_7672 = 7672 + const val BOXING_GLOVES_7673 = 7673 + const val PERFECT_7674 = 7674 + const val WOODEN_SWORD_7675 = 7675 + const val WOODEN_SHIELD_7676 = 7676 + const val TREASURE_STONE_7677 = 7677 + const val PRIZE_KEY_7678 = 7678 + const val PUGEL_7679 = 7679 + const val PUGEL_7680 = 7680 + const val GAME_BOOK_7681 = 7681 + const val HOOP_7682 = 7682 + const val HOOP_7683 = 7683 + const val DART_7684 = 7684 + const val DART_7685 = 7685 + const val BOW_AND_ARROW_7686 = 7686 + const val BOW_AND_ARROW_7687 = 7687 + const val KETTLE_7688 = 7688 + const val KETTLE_7689 = 7689 + const val FULL_KETTLE_7690 = 7690 + const val HOT_KETTLE_7691 = 7691 + const val POT_OF_TEA_4_7692 = 7692 + const val POT_OF_TEA_4_7693 = 7693 + const val POT_OF_TEA_3_7694 = 7694 + const val POT_OF_TEA_3_7695 = 7695 + const val POT_OF_TEA_2_7696 = 7696 + const val POT_OF_TEA_2_7697 = 7697 + const val POT_OF_TEA_1_7698 = 7698 + const val POT_OF_TEA_1_7699 = 7699 + const val TEAPOT_WITH_LEAVES_7700 = 7700 + const val TEAPOT_WITH_LEAVES_7701 = 7701 + const val TEAPOT_7702 = 7702 + const val TEAPOT_7703 = 7703 + const val POT_OF_TEA_4_7704 = 7704 + const val POT_OF_TEA_4_7705 = 7705 + const val POT_OF_TEA_3_7706 = 7706 + const val POT_OF_TEA_3_7707 = 7707 + const val POT_OF_TEA_2_7708 = 7708 + const val POT_OF_TEA_2_7709 = 7709 + const val POT_OF_TEA_1_7710 = 7710 + const val POT_OF_TEA_1_7711 = 7711 + const val TEAPOT_WITH_LEAVES_7712 = 7712 + const val TEAPOT_WITH_LEAVES_7713 = 7713 + const val TEAPOT_7714 = 7714 + const val TEAPOT_7715 = 7715 + const val POT_OF_TEA_4_7716 = 7716 + const val POT_OF_TEA_4_7717 = 7717 + const val POT_OF_TEA_3_7718 = 7718 + const val POT_OF_TEA_3_7719 = 7719 + const val POT_OF_TEA_2_7720 = 7720 + const val POT_OF_TEA_2_7721 = 7721 + const val POT_OF_TEA_1_7722 = 7722 + const val POT_OF_TEA_1_7723 = 7723 + const val TEAPOT_WITH_LEAVES_7724 = 7724 + const val TEAPOT_WITH_LEAVES_7725 = 7725 + const val TEAPOT_7726 = 7726 + const val TEAPOT_7727 = 7727 + const val EMPTY_CUP_7728 = 7728 + const val EMPTY_CUP_7729 = 7729 + const val CUP_OF_TEA_7730 = 7730 + const val CUP_OF_TEA_7731 = 7731 + const val PORCELAIN_CUP_7732 = 7732 + const val CUP_OF_TEA_7733 = 7733 + const val CUP_OF_TEA_7734 = 7734 + const val PORCELAIN_CUP_7735 = 7735 + const val CUP_OF_TEA_7736 = 7736 + const val CUP_OF_TEA_7737 = 7737 + const val TEA_LEAVES_7738 = 7738 + const val TEA_LEAVES_7739 = 7739 + const val BEER_7740 = 7740 + const val BEER_7741 = 7741 + const val BEER_GLASS_7742 = 7742 + const val BEER_GLASS_7743 = 7743 + const val ASGARNIAN_ALE_7744 = 7744 + const val ASGARNIAN_ALE_7745 = 7745 + const val GREENMANS_ALE_7746 = 7746 + const val GREENMANS_ALE_7747 = 7747 + const val DRAGON_BITTER_7748 = 7748 + const val DRAGON_BITTER_7749 = 7749 + const val MOONLIGHT_MEAD_7750 = 7750 + const val MOONLIGHT_MEAD_7751 = 7751 + const val CIDER_7752 = 7752 + const val CIDER_7753 = 7753 + const val CHEFS_DELIGHT_7754 = 7754 + const val CHEFS_DELIGHT_7755 = 7755 + const val PAINTBRUSH_7756 = 7756 + const val PAINTBRUSH_7757 = 7757 + const val RUSTY_SWORD_7758 = 7758 + const val TOY_SOLDIER_7759 = 7759 + const val TOY_SOLDIER_7760 = 7760 + const val TOY_SOLDIER_WOUND_7761 = 7761 + const val TOY_SOLDIER_WOUND_7762 = 7762 + const val TOY_DOLL_7763 = 7763 + const val TOY_DOLL_7764 = 7764 + const val TOY_DOLL_WOUND_7765 = 7765 + const val TOY_DOLL_WOUND_7766 = 7766 + const val TOY_MOUSE_7767 = 7767 + const val TOY_MOUSE_7768 = 7768 + const val TOY_MOUSE_WOUND_7769 = 7769 + const val TOY_MOUSE_WOUND_7770 = 7770 + const val CLOCKWORK_CAT_7771 = 7771 + const val CLOCKWORK_CAT_7772 = 7772 + const val BRANCH_7773 = 7773 + const val REWARD_TOKEN_7774 = 7774 + const val REWARD_TOKEN_7775 = 7775 + const val REWARD_TOKEN_7776 = 7776 + const val LONG_VINE_7777 = 7777 + const val SHORT_VINE_7778 = 7778 + const val FISHING_TOME_7779 = 7779 + const val FISHING_TOME_7780 = 7780 + const val FISHING_TOME_7781 = 7781 + const val AGILITY_TOME_7782 = 7782 + const val AGILITY_TOME_7783 = 7783 + const val AGILITY_TOME_7784 = 7784 + const val THIEVING_TOME_7785 = 7785 + const val THIEVING_TOME_7786 = 7786 + const val THIEVING_TOME_7787 = 7787 + const val SLAYER_TOME_7788 = 7788 + const val SLAYER_TOME_7789 = 7789 + const val SLAYER_TOME_7790 = 7790 + const val MINING_TOME_7791 = 7791 + const val MINING_TOME_7792 = 7792 + const val MINING_TOME_7793 = 7793 + const val FIREMAKING_TOME_7794 = 7794 + const val FIREMAKING_TOME_7795 = 7795 + const val FIREMAKING_TOME_7796 = 7796 + const val WOODCUTTING_TOME_7797 = 7797 + const val WOODCUTTING_TOME_7798 = 7798 + const val WOODCUTTING_TOME_7799 = 7799 + const val SNAIL_SHELL_7800 = 7800 + const val SNAKE_HIDE_7801 = 7801 + const val SNAKE_HIDE_7802 = 7802 + const val YIN_YANG_AMULET_7803 = 7803 + const val PICTURE_7804 = 7804 + const val PICTURE_7805 = 7805 + const val ANGER_SWORD_7806 = 7806 + const val ANGER_BATTLEAXE_7807 = 7807 + const val ANGER_MACE_7808 = 7808 + const val ANGER_SPEAR_7809 = 7809 + const val JUG_OF_VINEGAR_7810 = 7810 + const val POT_OF_VINEGAR_7811 = 7811 + const val GOBLIN_SKULL_7812 = 7812 + const val BONE_IN_VINEGAR_7813 = 7813 + const val GOBLIN_SKULL_7814 = 7814 + const val BEAR_RIBS_7815 = 7815 + const val BONE_IN_VINEGAR_7816 = 7816 + const val BEAR_RIBS_7817 = 7817 + const val RAM_SKULL_7818 = 7818 + const val BONE_IN_VINEGAR_7819 = 7819 + const val RAM_SKULL_7820 = 7820 + const val UNICORN_BONE_7821 = 7821 + const val BONE_IN_VINEGAR_7822 = 7822 + const val UNICORN_BONE_7823 = 7823 + const val GIANT_RAT_BONE_7824 = 7824 + const val BONE_IN_VINEGAR_7825 = 7825 + const val GIANT_RAT_BONE_7826 = 7826 + const val GIANT_BAT_WING_7827 = 7827 + const val BONE_IN_VINEGAR_7828 = 7828 + const val GIANT_BAT_WING_7829 = 7829 + const val WOLF_BONE_7830 = 7830 + const val BONE_IN_VINEGAR_7831 = 7831 + const val WOLF_BONE_7832 = 7832 + const val BAT_WING_7833 = 7833 + const val BONE_IN_VINEGAR_7834 = 7834 + const val BAT_WING_7835 = 7835 + const val RAT_BONE_7836 = 7836 + const val BONE_IN_VINEGAR_7837 = 7837 + const val RAT_BONE_7838 = 7838 + const val BABY_DRAGON_BONE_7839 = 7839 + const val BONE_IN_VINEGAR_7840 = 7840 + const val BABY_DRAGON_BONE_7841 = 7841 + const val OGRE_RIBS_7842 = 7842 + const val BONE_IN_VINEGAR_7843 = 7843 + const val OGRE_RIBS_7844 = 7844 + const val JOGRE_BONE_7845 = 7845 + const val BONE_IN_VINEGAR_7846 = 7846 + const val JOGRE_BONE_7847 = 7847 + const val ZOGRE_BONE_7848 = 7848 + const val BONE_IN_VINEGAR_7849 = 7849 + const val ZOGRE_BONE_7850 = 7850 + const val MOGRE_BONE_7851 = 7851 + const val BONE_IN_VINEGAR_7852 = 7852 + const val MOGRE_BONE_7853 = 7853 + const val MONKEY_PAW_7854 = 7854 + const val BONE_IN_VINEGAR_7855 = 7855 + const val MONKEY_PAW_7856 = 7856 + const val DAGANNOTH_RIBS_7857 = 7857 + const val BONE_IN_VINEGAR_7858 = 7858 + const val DAGANNOTH_RIBS_7859 = 7859 + const val SNAKE_SPINE_7860 = 7860 + const val BONE_IN_VINEGAR_7861 = 7861 + const val SNAKE_SPINE_7862 = 7862 + const val ZOMBIE_BONE_7863 = 7863 + const val BONE_IN_VINEGAR_7864 = 7864 + const val ZOMBIE_BONE_7865 = 7865 + const val WEREWOLF_BONE_7866 = 7866 + const val BONE_IN_VINEGAR_7867 = 7867 + const val WEREWOLF_BONE_7868 = 7868 + const val MOSS_GIANT_BONE_7869 = 7869 + const val BONE_IN_VINEGAR_7870 = 7870 + const val MOSS_GIANT_BONE_7871 = 7871 + const val FIRE_GIANT_BONE_7872 = 7872 + const val BONE_IN_VINEGAR_7873 = 7873 + const val FIRE_GIANT_BONE_7874 = 7874 + const val ICE_GIANT_RIBS_7875 = 7875 + const val BONE_IN_VINEGAR_7876 = 7876 + const val ICE_GIANT_RIBS_7877 = 7877 + const val TERRORBIRD_WING_7878 = 7878 + const val BONE_IN_VINEGAR_7879 = 7879 + const val TERRORBIRD_WING_7880 = 7880 + const val GHOUL_BONE_7881 = 7881 + const val BONE_IN_VINEGAR_7882 = 7882 + const val GHOUL_BONE_7883 = 7883 + const val TROLL_BONE_7884 = 7884 + const val BONE_IN_VINEGAR_7885 = 7885 + const val TROLL_BONE_7886 = 7886 + const val SEAGULL_WING_7887 = 7887 + const val BONE_IN_VINEGAR_7888 = 7888 + const val SEAGULL_WING_7889 = 7889 + const val UNDEAD_COW_RIBS_7890 = 7890 + const val BONE_IN_VINEGAR_7891 = 7891 + const val UNDEAD_COW_RIBS_7892 = 7892 + const val EXPERIMENT_BONE_7893 = 7893 + const val BONE_IN_VINEGAR_7894 = 7894 + const val EXPERIMENT_BONE_7895 = 7895 + const val RABBIT_BONE_7896 = 7896 + const val BONE_IN_VINEGAR_7897 = 7897 + const val RABBIT_BONE_7898 = 7898 + const val BASILISK_BONE_7899 = 7899 + const val BONE_IN_VINEGAR_7900 = 7900 + const val BASILISK_BONE_7901 = 7901 + const val DESERT_LIZARD_BONE_7902 = 7902 + const val BONE_IN_VINEGAR_7903 = 7903 + const val DESERT_LIZARD_BONE_7904 = 7904 + const val CAVE_GOBLIN_SKULL_7905 = 7905 + const val BONE_IN_VINEGAR_7906 = 7906 + const val CAVE_GOBLIN_SKULL_7907 = 7907 + const val BIG_FROG_LEG_7908 = 7908 + const val BONE_IN_VINEGAR_7909 = 7909 + const val BIG_FROG_LEG_7910 = 7910 + const val VULTURE_WING_7911 = 7911 + const val BONE_IN_VINEGAR_7912 = 7912 + const val VULTURE_WING_7913 = 7913 + const val JACKAL_BONE_7914 = 7914 + const val BONE_IN_VINEGAR_7915 = 7915 + const val JACKAL_BONE_7916 = 7916 + const val RAM_SKULL_HELM_7917 = 7917 + const val BONESACK_7918 = 7918 + const val BOTTLE_OF_WINE_7919 = 7919 + const val BOTTLE_OF_WINE_7920 = 7920 + const val EMPTY_WINE_BOTTLE_7921 = 7921 + const val AL_KHARID_FLYER_7922 = 7922 + const val NULL_7923 = 7923 + const val NULL_7924 = 7924 + const val NULL_7925 = 7925 + const val NULL_7926 = 7926 + const val EASTER_RING_7927 = 7927 + const val EASTER_EGG_7928 = 7928 + const val EASTER_EGG_7929 = 7929 + const val EASTER_EGG_7930 = 7930 + const val EASTER_EGG_7931 = 7931 + const val EASTER_EGG_7932 = 7932 + const val EASTER_EGG_7933 = 7933 + const val FIELD_RATION_7934 = 7934 + const val FIELD_RATION_7935 = 7935 + const val PURE_ESSENCE_7936 = 7936 + const val PURE_ESSENCE_7937 = 7937 + const val BOB_7938 = 7938 + const val TORTOISE_SHELL_7939 = 7939 + const val TORTOISE_SHELL_7940 = 7940 + const val IRON_SHEET_7941 = 7941 + const val FRESH_MONKFISH_7942 = 7942 + const val FRESH_MONKFISH_7943 = 7943 + const val RAW_MONKFISH_7944 = 7944 + const val RAW_MONKFISH_7945 = 7945 + const val MONKFISH_7946 = 7946 + const val MONKFISH_7947 = 7947 + const val BURNT_MONKFISH_7948 = 7948 + const val BURNT_MONKFISH_7949 = 7949 + const val BONE_SEEDS_7950 = 7950 + const val HERMANS_BOOK_7951 = 7951 + const val PICTURE_7952 = 7952 + const val PICTURE_7953 = 7953 + const val BURNT_SHRIMP_7954 = 7954 + const val BURNT_SHRIMP_7955 = 7955 + const val CASKET_7956 = 7956 + const val WHITE_APRON_7957 = 7957 + const val MINING_PROP_7958 = 7958 + const val HEAVY_BOX_7959 = 7959 + const val EMPTY_BOX_7960 = 7960 + const val BURNT_DIARY_7961 = 7961 + const val BURNT_DIARY_7962 = 7962 + const val BURNT_DIARY_7963 = 7963 + const val BURNT_DIARY_7964 = 7964 + const val BURNT_DIARY_7965 = 7965 + const val LETTER_7966 = 7966 + const val ENGINE_7967 = 7967 + const val SCROLL_7968 = 7968 + const val PULLEY_BEAM_7969 = 7969 + const val LONG_PULLEY_BEAM_7970 = 7970 + const val LONGER_PULLEY_BEAM_7971 = 7971 + const val LIFT_MANUAL_7972 = 7972 + const val BEAM_7973 = 7973 + const val SERVANT_BELL_7974 = 7974 + const val CRAWLING_HAND_7975 = 7975 + const val COCKATRICE_HEAD_7976 = 7976 + const val BASILISK_HEAD_7977 = 7977 + const val KURASK_HEAD_7978 = 7978 + const val ABYSSAL_HEAD_7979 = 7979 + const val KBD_HEADS_7980 = 7980 + const val KQ_HEAD_7981 = 7981 + const val CRAWLING_HAND_7982 = 7982 + const val COCKATRICE_HEAD_7983 = 7983 + const val BASILISK_HEAD_7984 = 7984 + const val KURASK_HEAD_7985 = 7985 + const val ABYSSAL_HEAD_7986 = 7986 + const val KBD_HEADS_7987 = 7987 + const val KQ_HEAD_7988 = 7988 + const val BIG_BASS_7989 = 7989 + const val BIG_BASS_7990 = 7990 + const val BIG_SWORDFISH_7991 = 7991 + const val BIG_SWORDFISH_7992 = 7992 + const val BIG_SHARK_7993 = 7993 + const val BIG_SHARK_7994 = 7994 + const val ARTHUR_PORTRAIT_7995 = 7995 + const val ELENA_PORTRAIT_7996 = 7996 + const val KELDAGRIM_PORTRAIT_7997 = 7997 + const val MISC_PORTRAIT_7998 = 7998 + const val DESERT_PAINTING_7999 = 7999 + const val ISAFDAR_PAINTING_8000 = 8000 + const val KARAMJA_PAINTING_8001 = 8001 + const val LUMBRIDGE_PAINTING_8002 = 8002 + const val MORYTANIA_PAINTING_8003 = 8003 + const val SMALL_MAP_8004 = 8004 + const val MEDIUM_MAP_8005 = 8005 + const val LARGE_MAP_8006 = 8006 + const val VARROCK_TELEPORT_8007 = 8007 + const val LUMBRIDGE_TELEPORT_8008 = 8008 + const val FALADOR_TELEPORT_8009 = 8009 + const val CAMELOT_TELEPORT_8010 = 8010 + const val ARDOUGNE_TELEPORT_8011 = 8011 + const val WATCHTOWER_TPORT_8012 = 8012 + const val TELEPORT_TO_HOUSE_8013 = 8013 + const val BONES_TO_BANANAS_8014 = 8014 + const val BONES_TO_PEACHES_8015 = 8015 + const val ENCHANT_SAPPHIRE_8016 = 8016 + const val ENCHANT_EMERALD_8017 = 8017 + const val ENCHANT_RUBY_8018 = 8018 + const val ENCHANT_DIAMOND_8019 = 8019 + const val ENCHANT_DRAGONSTN_8020 = 8020 + const val ENCHANT_ONYX_8021 = 8021 + const val TELEKINETIC_GRAB_8022 = 8022 + const val BOXING_RING_8023 = 8023 + const val FENCING_RING_8024 = 8024 + const val COMBAT_RING_8025 = 8025 + const val RANGING_PEDESTALS_8026 = 8026 + const val BALANCE_BEAM_8027 = 8027 + const val GLOVE_RACK_8028 = 8028 + const val WEAPONS_RACK_8029 = 8029 + const val EXTRA_WEAPONS_RACK_8030 = 8030 + const val WOODEN_BED_8031 = 8031 + const val OAK_BED_8032 = 8032 + const val LARGE_OAK_BED_8033 = 8033 + const val TEAK_BED_8034 = 8034 + const val LARGE_TEAK_BED_8035 = 8035 + const val FOUR_POSTER_8036 = 8036 + const val GILDED_4_POSTER_8037 = 8037 + const val SHOE_BOX_8038 = 8038 + const val OAK_DRAWERS_8039 = 8039 + const val OAK_WARDROBE_8040 = 8040 + const val TEAK_DRAWERS_8041 = 8041 + const val TEAK_WARDROBE_8042 = 8042 + const val MAHOGANY_DROBE_8043 = 8043 + const val GILDED_WARDROBE_8044 = 8044 + const val SHAVING_STAND_8045 = 8045 + const val OAK_SHAVING_STAND_8046 = 8046 + const val OAK_DRESSER_8047 = 8047 + const val TEAK_DRESSER_8048 = 8048 + const val FANCY_TEAK_DRESSER_8049 = 8049 + const val MAHOGANY_DRESSER_8050 = 8050 + const val GILDED_DRESSER_8051 = 8051 + const val OAK_CLOCK_8052 = 8052 + const val TEAK_CLOCK_8053 = 8053 + const val GILDED_CLOCK_8054 = 8054 + const val SARADOMIN_SYMBOL_8055 = 8055 + const val ZAMORAK_SYMBOL_8056 = 8056 + const val GUTHIX_SYMBOL_8057 = 8057 + const val SARADOMIN_ICON_8058 = 8058 + const val ZAMORAK_ICON_8059 = 8059 + const val GUTHIX_ICON_8060 = 8060 + const val ICON_OF_BOB_8061 = 8061 + const val OAK_ALTAR_8062 = 8062 + const val TEAK_ALTAR_8063 = 8063 + const val CLOTH_COVERD_ALTAR_8064 = 8064 + const val MAHOGANY_ALTAR_8065 = 8065 + const val LIMESTONE_ALTAR_8066 = 8066 + const val MARBLE_ALTAR_8067 = 8067 + const val GILDED_ALTAR_8068 = 8068 + const val WOODEN_TORCHES_8069 = 8069 + const val STEEL_TORCHES_8070 = 8070 + const val STEEL_CANDLESTICKS_8071 = 8071 + const val GOLD_CANDLESTICKS_8072 = 8072 + const val INCENSE_BURNERS_8073 = 8073 + const val MAHOGANY_BURNERS_8074 = 8074 + const val MARBLE_BURNERS_8075 = 8075 + const val SHUTTERED_WINDOW_8076 = 8076 + const val DECORATIVE_WINDOW_8077 = 8077 + const val STAINED_GLASS_8078 = 8078 + const val WINDCHIMES_8079 = 8079 + const val BELLS_8080 = 8080 + const val ORGAN_8081 = 8081 + const val SMALL_STATUES_8082 = 8082 + const val MEDIUM_STATUES_8083 = 8083 + const val LARGE_STATUES_8084 = 8084 + const val SUIT_OF_ARMOUR_8085 = 8085 + const val SMALL_PORTRAIT_8086 = 8086 + const val MINOR_HEAD_8087 = 8087 + const val MEDIUM_HEAD_8088 = 8088 + const val MAJOR_HEAD_8089 = 8089 + const val MOUNTED_SWORD_8090 = 8090 + const val SMALL_LANDSCAPE_8091 = 8091 + const val GUILD_TROPHY_8092 = 8092 + const val LARGE_PORTRAIT_8093 = 8093 + const val LARGE_LANDSCAPE_8094 = 8094 + const val RUNE_DISPLAY_CASE_8095 = 8095 + const val LOW_LEVEL_PLANTS_8096 = 8096 + const val MID_LEVEL_PLANTS_8097 = 8097 + const val HIGH_LEVEL_PLANTS_8098 = 8098 + const val ROPE_BELL_PULL_8099 = 8099 + const val BELL_PULL_8100 = 8100 + const val POSH_BELL_PULL_8101 = 8101 + const val OAK_DECORATION_8102 = 8102 + const val TEAK_DECORATION_8103 = 8103 + const val GILDED_DECORATION_8104 = 8104 + const val ROUND_SHIELD_8105 = 8105 + const val SQUARE_SHIELD_8106 = 8106 + const val KITE_SHIELD_8107 = 8107 + const val WOODEN_BENCH_8108 = 8108 + const val OAK_BENCH_8109 = 8109 + const val CARVED_OAK_BENCH_8110 = 8110 + const val TEAK_DINING_BENCH_8111 = 8111 + const val CARVED_TEAK_BENCH_8112 = 8112 + const val MAHOGANY_BENCH_8113 = 8113 + const val GILDED_BENCH_8114 = 8114 + const val WOOD_DINING_TABLE_8115 = 8115 + const val OAK_DINING_TABLE_8116 = 8116 + const val CARVED_OAK_TABLE_8117 = 8117 + const val TEAK_TABLE_8118 = 8118 + const val CARVED_TEAK_TABLE_8119 = 8119 + const val MAHOGANY_TABLE_8120 = 8120 + const val OPULENT_TABLE_8121 = 8121 + const val OAK_DOOR_8122 = 8122 + const val STEEL_PLATED_DOOR_8123 = 8123 + const val MARBLE_DOOR_8124 = 8124 + const val DECORATIVE_BLOOD_8125 = 8125 + const val DECORATIVE_PIPE_8126 = 8126 + const val HANGING_SKELETON_8127 = 8127 + const val CANDLES_8128 = 8128 + const val TORCHES_8129 = 8129 + const val SKULL_TORCHES_8130 = 8130 + const val SKELETON_GUARD_8131 = 8131 + const val GUARD_DOG_8132 = 8132 + const val HOBGOBLIN_GUARD_8133 = 8133 + const val BABY_RED_DRAGON_8134 = 8134 + const val HUGE_SPIDER_8135 = 8135 + const val TROLL_GUARD_8136 = 8136 + const val HELLHOUND_8137 = 8137 + const val DEMON_8138 = 8138 + const val KALPHITE_SOLDIER_8139 = 8139 + const val TOK_XIL_8140 = 8140 + const val DAGANNOTH_8141 = 8141 + const val STEEL_DRAGON_8142 = 8142 + const val SPIKE_TRAP_8143 = 8143 + const val MAN_TRAP_8144 = 8144 + const val TANGLE_VINE_8145 = 8145 + const val MARBLE_TRAP_8146 = 8146 + const val TELEPORT_TRAP_8147 = 8147 + const val WOODEN_CRATE_8148 = 8148 + const val OAK_CHEST_8149 = 8149 + const val TEAK_CHEST_8150 = 8150 + const val MAHOGANY_CHEST_8151 = 8151 + const val MAGIC_CHEST_8152 = 8152 + const val CLAY_ATTACK_STONE_8153 = 8153 + const val ATTACK_STONE_8154 = 8154 + const val MARBLE_ATT_STONE_8155 = 8155 + const val MAGICAL_BALANCE_1_8156 = 8156 + const val MAGICAL_BALANCE_2_8157 = 8157 + const val MAGICAL_BALANCE_3_8158 = 8158 + const val JESTER_8159 = 8159 + const val TREASURE_HUNT_8160 = 8160 + const val HANGMAN_GAME_8161 = 8161 + const val HOOP_AND_STICK_8162 = 8162 + const val DARTBOARD_8163 = 8163 + const val ARCHERY_TARGET_8164 = 8164 + const val OAK_PRIZE_CHEST_8165 = 8165 + const val TEAK_PRIZE_CHEST_8166 = 8166 + const val MAHOGANY_CHEST_8167 = 8167 + const val EXIT_PORTAL_8168 = 8168 + const val DECORATIVE_ROCK_8169 = 8169 + const val POND_8170 = 8170 + const val IMP_STATUE_8171 = 8171 + const val DUNGEON_ENTRANCE_8172 = 8172 + const val TREE_8173 = 8173 + const val NICE_TREE_8174 = 8174 + const val OAK_TREE_8175 = 8175 + const val WILLOW_TREE_8176 = 8176 + const val MAPLE_TREE_8177 = 8177 + const val YEW_TREE_8178 = 8178 + const val MAGIC_TREE_8179 = 8179 + const val PLANT_8180 = 8180 + const val SMALL_FERN_8181 = 8181 + const val FERN_8182 = 8182 + const val DOCK_LEAF_8183 = 8183 + const val THISTLE_8184 = 8184 + const val REEDS_8185 = 8185 + const val FERN_8186 = 8186 + const val BUSH_8187 = 8187 + const val TALL_PLANT_8188 = 8188 + const val SHORT_PLANT_8189 = 8189 + const val LARGE_LEAF_PLANT_8190 = 8190 + const val HUGE_PLANT_8191 = 8191 + const val GAZEBO_8192 = 8192 + const val SMALL_FOUNTAIN_8193 = 8193 + const val LARGE_FOUNTAIN_8194 = 8194 + const val POSH_FOUNTAIN_8195 = 8195 + const val BOUNDARY_STONES_8196 = 8196 + const val WOODEN_FENCE_8197 = 8197 + const val STONE_WALL_8198 = 8198 + const val IRON_RAILINGS_8199 = 8199 + const val PICKET_FENCE_8200 = 8200 + const val GARDEN_FENCE_8201 = 8201 + const val MARBLE_WALL_8202 = 8202 + const val THORNY_HEDGE_8203 = 8203 + const val NICE_HEDGE_8204 = 8204 + const val SMALL_BOX_HEDGE_8205 = 8205 + const val TOPIARY_HEDGE_8206 = 8206 + const val FANCY_HEDGE_8207 = 8207 + const val TALL_FANCY_HEDGE_8208 = 8208 + const val TALL_BOX_HEDGE_8209 = 8209 + const val ROSEMARY_8210 = 8210 + const val DAFFODILS_8211 = 8211 + const val BLUEBELLS_8212 = 8212 + const val SUNFLOWER_8213 = 8213 + const val MARIGOLDS_8214 = 8214 + const val ROSES_8215 = 8215 + const val FIREPIT_8216 = 8216 + const val FIREPIT_WITH_HOOK_8217 = 8217 + const val FIREPIT_WITH_POT_8218 = 8218 + const val SMALL_OVEN_8219 = 8219 + const val LARGE_OVEN_8220 = 8220 + const val STEEL_RANGE_8221 = 8221 + const val FANCY_RANGE_8222 = 8222 + const val WOODEN_SHELVES_1_8223 = 8223 + const val WOODEN_SHELVES_2_8224 = 8224 + const val WOODEN_SHELVES_3_8225 = 8225 + const val OAK_SHELVES_1_8226 = 8226 + const val OAK_SHELVES_2_8227 = 8227 + const val TEAK_SHELVES_1_8228 = 8228 + const val TEAK_SHELVES_2_8229 = 8229 + const val PUMP_AND_DRAIN_8230 = 8230 + const val PUMP_AND_TUB_8231 = 8231 + const val SINK_8232 = 8232 + const val WOODEN_LARDER_8233 = 8233 + const val OAK_LARDER_8234 = 8234 + const val TEAK_LARDER_8235 = 8235 + const val CAT_BLANKET_8236 = 8236 + const val CAT_BASKET_8237 = 8237 + const val CUSHIONED_BASKET_8238 = 8238 + const val BEER_BARREL_8239 = 8239 + const val CIDER_BARREL_8240 = 8240 + const val ASGARNIAN_ALE_8241 = 8241 + const val GREENMANS_ALE_8242 = 8242 + const val DRAGON_BITTER_8243 = 8243 + const val CHEFS_DELIGHT_8244 = 8244 + const val BLANK_POH_ENTITY_8245 = 8245 + const val WOOD_KITCHEN_TABLE_8246 = 8246 + const val OAK_KITCHEN_TABLE_8247 = 8247 + const val TEAK_KITCHEN_TABLE_8248 = 8248 + const val OAK_STAIRCASE_8249 = 8249 + const val OAK_STAIRCASE_8250 = 8250 + const val OAK_STAIRCASE_8251 = 8251 + const val TEAK_STAIRCASE_8252 = 8252 + const val TEAK_STAIRCASE_8253 = 8253 + const val TEAK_STAIRCASE_8254 = 8254 + const val MARBLE_STAIRCASE_8255 = 8255 + const val MARBLE_STAIRCASE_8256 = 8256 + const val MARBLE_STAIRCASE_8257 = 8257 + const val SPIRAL_STAIRCASE_8258 = 8258 + const val MARBLE_SPIRAL_8259 = 8259 + const val CRAWLING_HAND_8260 = 8260 + const val COCKATRICE_HEAD_8261 = 8261 + const val BASILISK_HEAD_8262 = 8262 + const val KURASK_HEAD_8263 = 8263 + const val ABYSSAL_HEAD_8264 = 8264 + const val KBD_HEADS_8265 = 8265 + const val KQ_HEAD_8266 = 8266 + const val MOUNTED_BASS_8267 = 8267 + const val MOUNTED_SWORDFISH_8268 = 8268 + const val MOUNTED_SHARK_8269 = 8269 + const val MITHRIL_ARMOUR_8270 = 8270 + const val ADAMANTITE_ARMOUR_8271 = 8271 + const val RUNITE_ARMOUR_8272 = 8272 + const val CW_ARMOUR_1_8273 = 8273 + const val CW_ARMOUR_2_8274 = 8274 + const val CW_ARMOUR_3_8275 = 8275 + const val RUNE_CASE_1_8276 = 8276 + const val RUNE_CASE_2_8277 = 8277 + const val RUNE_CASE_3_8278 = 8278 + const val SILVERLIGHT_8279 = 8279 + const val EXCALIBUR_8280 = 8280 + const val DARKLIGHT_8281 = 8281 + const val ANTI_DRAGON_SHIELD_8282 = 8282 + const val AMULET_OF_GLORY_8283 = 8283 + const val CAPE_OF_LEGENDS_8284 = 8284 + const val KING_ARTHUR_8285 = 8285 + const val ELENA_8286 = 8286 + const val GIANT_DWARF_8287 = 8287 + const val MISCELLANIANS_8288 = 8288 + const val LUMBRIDGE_8289 = 8289 + const val THE_DESERT_8290 = 8290 + const val MORYTANIA_8291 = 8291 + const val KARAMJA_8292 = 8292 + const val ISAFDAR_8293 = 8293 + const val SMALL_MAP_8294 = 8294 + const val MEDIUM_MAP_8295 = 8295 + const val LARGE_MAP_8296 = 8296 + const val OAK_CAGE_8297 = 8297 + const val OAK_AND_STEEL_CAGE_8298 = 8298 + const val STEEL_CAGE_8299 = 8299 + const val SPIKED_CAGE_8300 = 8300 + const val BONE_CAGE_8301 = 8301 + const val SPIKES_8302 = 8302 + const val TENTACLE_POOL_8303 = 8303 + const val FLAME_PIT_8304 = 8304 + const val ROCNAR_8305 = 8305 + const val OAK_LADDER_8306 = 8306 + const val TEAK_LADDER_8307 = 8307 + const val MAHOGANY_LADDER_8308 = 8308 + const val CRUDE_WOODEN_CHAIR_8309 = 8309 + const val WOODEN_CHAIR_8310 = 8310 + const val ROCKING_CHAIR_8311 = 8311 + const val OAK_CHAIR_8312 = 8312 + const val OAK_ARMCHAIR_8313 = 8313 + const val TEAK_ARMCHAIR_8314 = 8314 + const val MAHOGANY_ARMCHAIR_8315 = 8315 + const val BROWN_RUG_8316 = 8316 + const val RUG_8317 = 8317 + const val OPULENT_RUG_8318 = 8318 + const val WOODEN_BOOKCASE_8319 = 8319 + const val OAK_BOOKCASE_8320 = 8320 + const val MAHOGANY_BKCASE_8321 = 8321 + const val TORN_CURTAINS_8322 = 8322 + const val CURTAINS_8323 = 8323 + const val OPULENT_CURTAINS_8324 = 8324 + const val CLAY_FIREPLACE_8325 = 8325 + const val STONE_FIREPLACE_8326 = 8326 + const val MARBLE_FIREPLACE_8327 = 8327 + const val TEAK_PORTAL_8328 = 8328 + const val MAHOGANY_PORTAL_8329 = 8329 + const val MARBLE_PORTAL_8330 = 8330 + const val TELEPORT_FOCUS_8331 = 8331 + const val GREATER_FOCUS_8332 = 8332 + const val SCRYING_POOL_8333 = 8333 + const val OAK_LECTERN_8334 = 8334 + const val EAGLE_LECTERN_8335 = 8335 + const val DEMON_LECTERN_8336 = 8336 + const val TEAK_EAGLE_LECTERN_8337 = 8337 + const val TEAK_DEMON_LECTERN_8338 = 8338 + const val MAHOGANY_EAGLE_8339 = 8339 + const val MAHOGANY_DEMON_8340 = 8340 + const val GLOBE_8341 = 8341 + const val ORNAMENTAL_GLOBE_8342 = 8342 + const val LUNAR_GLOBE_8343 = 8343 + const val CELESTIAL_GLOBE_8344 = 8344 + const val ARMILLARY_SPHERE_8345 = 8345 + const val SMALL_ORRERY_8346 = 8346 + const val LARGE_ORRERY_8347 = 8347 + const val WOODEN_TELESCOPE_8348 = 8348 + const val TEAK_TELESCOPE_8349 = 8349 + const val MAHOGANY_SCOPE_8350 = 8350 + const val CRYSTAL_BALL_8351 = 8351 + const val ELEMENTAL_SPHERE_8352 = 8352 + const val CRYSTAL_OF_POWER_8353 = 8353 + const val ALCHEMICAL_CHART_8354 = 8354 + const val ASTRONOMICAL_CHART_8355 = 8355 + const val INFERNAL_CHART_8356 = 8356 + const val OAK_THRONE_8357 = 8357 + const val TEAK_THRONE_8358 = 8358 + const val MAHOGANY_THRONE_8359 = 8359 + const val GILDED_THRONE_8360 = 8360 + const val SKELETON_THRONE_8361 = 8361 + const val CRYSTAL_THRONE_8362 = 8362 + const val DEMONIC_THRONE_8363 = 8363 + const val OAK_LEVER_8364 = 8364 + const val TEAK_LEVER_8365 = 8365 + const val MAHOGANY_LEVER_8366 = 8366 + const val TRAPDOOR_8367 = 8367 + const val TRAPDOOR_8368 = 8368 + const val TRAPDOOR_8369 = 8369 + const val FLOOR_DECORATION_8370 = 8370 + const val STEEL_CAGE_8371 = 8371 + const val TRAPDOOR_8372 = 8372 + const val LESSER_MAGIC_CAGE_8373 = 8373 + const val GREATER_MAGIC_CAGE_8374 = 8374 + const val WOODEN_WORKBENCH_8375 = 8375 + const val OAK_WORKBENCH_8376 = 8376 + const val STEEL_FRAMED_BENCH_8377 = 8377 + const val BENCH_WITH_VICE_8378 = 8378 + const val BENCH_WITH_LATHE_8379 = 8379 + const val CRAFTING_TABLE_1_8380 = 8380 + const val CRAFTING_TABLE_2_8381 = 8381 + const val CRAFTING_TABLE_3_8382 = 8382 + const val CRAFTING_TABLE_4_8383 = 8383 + const val TOOL_STORE_1_8384 = 8384 + const val TOOL_STORE_2_8385 = 8385 + const val TOOL_STORE_3_8386 = 8386 + const val TOOL_STORE_4_8387 = 8387 + const val TOOL_STORE_5_8388 = 8388 + const val REPAIR_BENCH_8389 = 8389 + const val WHETSTONE_8390 = 8390 + const val ARMOUR_STAND_8391 = 8391 + const val PLUMING_STAND_8392 = 8392 + const val SHIELD_EASEL_8393 = 8393 + const val BANNER_EASEL_8394 = 8394 + const val PARLOUR_8395 = 8395 + const val KITCHEN_8396 = 8396 + const val DINING_ROOM_8397 = 8397 + const val BEDROOM_8398 = 8398 + const val GAMES_ROOM_8399 = 8399 + const val COMBAT_ROOM_8400 = 8400 + const val HALL_8401 = 8401 + const val HALL_8402 = 8402 + const val HALL_8403 = 8403 + const val HALL_8404 = 8404 + const val CHAPEL_8405 = 8405 + const val WORKSHOP_8406 = 8406 + const val STUDY_8407 = 8407 + const val PORTAL_CHAMBER_8408 = 8408 + const val THRONE_ROOM_8409 = 8409 + const val OUBLIETTE_8410 = 8410 + const val DUNGEON_CORRIDOR_8411 = 8411 + const val DUNGEON_CROSS_8412 = 8412 + const val DUNGEON_STAIRS_8413 = 8413 + const val TREASURE_ROOM_8414 = 8414 + const val GARDEN_8415 = 8415 + const val FORMAL_GARDEN_8416 = 8416 + const val BAGGED_DEAD_TREE_8417 = 8417 + const val BAGGED_DEAD_TREE_8418 = 8418 + const val BAGGED_NICE_TREE_8419 = 8419 + const val BAGGED_NICE_TREE_8420 = 8420 + const val BAGGED_OAK_TREE_8421 = 8421 + const val BAGGED_OAK_TREE_8422 = 8422 + const val BAGGED_WILLOW_TREE_8423 = 8423 + const val BAGGED_WILLOW_TREE_8424 = 8424 + const val BAGGED_MAPLE_TREE_8425 = 8425 + const val BAGGED_MAPLE_TREE_8426 = 8426 + const val BAGGED_YEW_TREE_8427 = 8427 + const val BAGGED_YEW_TREE_8428 = 8428 + const val BAGGED_MAGIC_TREE_8429 = 8429 + const val BAGGED_MAGIC_TREE_8430 = 8430 + const val BAGGED_PLANT_1_8431 = 8431 + const val BAGGED_PLANT_1_8432 = 8432 + const val BAGGED_PLANT_2_8433 = 8433 + const val BAGGED_PLANT_2_8434 = 8434 + const val BAGGED_PLANT_3_8435 = 8435 + const val BAGGED_PLANT_3_8436 = 8436 + const val THORNY_HEDGE_8437 = 8437 + const val THORNY_HEDGE_8438 = 8438 + const val NICE_HEDGE_8439 = 8439 + const val NICE_HEDGE_8440 = 8440 + const val SMALL_BOX_HEDGE_8441 = 8441 + const val SMALL_BOX_HEDGE_8442 = 8442 + const val TOPIARY_HEDGE_8443 = 8443 + const val TOPIARY_HEDGE_8444 = 8444 + const val FANCY_HEDGE_8445 = 8445 + const val FANCY_HEDGE_8446 = 8446 + const val TALL_FANCY_HEDGE_8447 = 8447 + const val TALL_FANCY_HEDGE_8448 = 8448 + const val TALL_BOX_HEDGE_8449 = 8449 + const val TALL_BOX_HEDGE_8450 = 8450 + const val BAGGED_ROSEMARY_8451 = 8451 + const val BAGGED_ROSEMARY_8452 = 8452 + const val BAGGED_DAFFODILS_8453 = 8453 + const val BAGGED_DAFFODILS_8454 = 8454 + const val BAGGED_BLUEBELLS_8455 = 8455 + const val BAGGED_BLUEBELLS_8456 = 8456 + const val BAGGED_SUNFLOWER_8457 = 8457 + const val BAGGED_SUNFLOWER_8458 = 8458 + const val BAGGED_MARIGOLDS_8459 = 8459 + const val BAGGED_MARIGOLDS_8460 = 8460 + const val BAGGED_ROSES_8461 = 8461 + const val BAGGED_ROSES_8462 = 8462 + const val CONSTRUCTION_GUIDE_8463 = 8463 + const val RUNE_HERALDIC_HELM_8464 = 8464 + const val NULL_8465 = 8465 + const val RUNE_HERALDIC_HELM_8466 = 8466 + const val NULL_8467 = 8467 + const val RUNE_HERALDIC_HELM_8468 = 8468 + const val NULL_8469 = 8469 + const val RUNE_HERALDIC_HELM_8470 = 8470 + const val NULL_8471 = 8471 + const val RUNE_HERALDIC_HELM_8472 = 8472 + const val NULL_8473 = 8473 + const val RUNE_HERALDIC_HELM_8474 = 8474 + const val NULL_8475 = 8475 + const val RUNE_HERALDIC_HELM_8476 = 8476 + const val NULL_8477 = 8477 + const val RUNE_HERALDIC_HELM_8478 = 8478 + const val NULL_8479 = 8479 + const val RUNE_HERALDIC_HELM_8480 = 8480 + const val NULL_8481 = 8481 + const val RUNE_HERALDIC_HELM_8482 = 8482 + const val NULL_8483 = 8483 + const val RUNE_HERALDIC_HELM_8484 = 8484 + const val NULL_8485 = 8485 + const val RUNE_HERALDIC_HELM_8486 = 8486 + const val NULL_8487 = 8487 + const val RUNE_HERALDIC_HELM_8488 = 8488 + const val NULL_8489 = 8489 + const val RUNE_HERALDIC_HELM_8490 = 8490 + const val NULL_8491 = 8491 + const val RUNE_HERALDIC_HELM_8492 = 8492 + const val NULL_8493 = 8493 + const val RUNE_HERALDIC_HELM_8494 = 8494 + const val NULL_8495 = 8495 + const val CRUDE_WOODEN_CHAIR_8496 = 8496 + const val CRUDE_WOODEN_CHAIR_8497 = 8497 + const val WOODEN_CHAIR_8498 = 8498 + const val WOODEN_CHAIR_8499 = 8499 + const val ROCKING_CHAIR_8500 = 8500 + const val ROCKING_CHAIR_8501 = 8501 + const val OAK_CHAIR_8502 = 8502 + const val OAK_CHAIR_8503 = 8503 + const val OAK_ARMCHAIR_8504 = 8504 + const val OAK_ARMCHAIR_8505 = 8505 + const val TEAK_ARMCHAIR_8506 = 8506 + const val TEAK_ARMCHAIR_8507 = 8507 + const val MAHOGANY_ARMCHAIR_8508 = 8508 + const val MAHOGANY_ARMCHAIR_8509 = 8509 + const val WOODEN_BOOKCASE_8510 = 8510 + const val WOODEN_BOOKCASE_8511 = 8511 + const val OAK_BOOKCASE_8512 = 8512 + const val OAK_BOOKCASE_8513 = 8513 + const val MAHOGANY_BKCASE_8514 = 8514 + const val MAHOGANY_BKCASE_8515 = 8515 + const val BEER_BARREL_8516 = 8516 + const val BEER_BARREL_8517 = 8517 + const val CIDER_BARREL_8518 = 8518 + const val CIDER_BARREL_8519 = 8519 + const val ASGARNIAN_ALE_8520 = 8520 + const val ASGARNIAN_ALE_8521 = 8521 + const val GREENMANS_ALE_8522 = 8522 + const val GREENMANS_ALE_8523 = 8523 + const val DRAGON_BITTER_8524 = 8524 + const val DRAGON_BITTER_8525 = 8525 + const val CHEFS_DELIGHT_8526 = 8526 + const val CHEFS_DELIGHT_8527 = 8527 + const val WOOD_KITCHEN_TABLE_8528 = 8528 + const val WOOD_KITCHEN_TABLE_8529 = 8529 + const val OAK_KITCHEN_TABLE_8530 = 8530 + const val OAK_KITCHEN_TABLE_8531 = 8531 + const val TEAK_KITCHEN_TABLE_8532 = 8532 + const val TEAK_KITCHEN_TABLE_8533 = 8533 + const val OAK_LECTERN_8534 = 8534 + const val OAK_LECTERN_8535 = 8535 + const val EAGLE_LECTERN_8536 = 8536 + const val EAGLE_LECTERN_8537 = 8537 + const val DEMON_LECTERN_8538 = 8538 + const val DEMON_LECTERN_8539 = 8539 + const val TEAK_EAGLE_LECTERN_8540 = 8540 + const val TEAK_EAGLE_LECTERN_8541 = 8541 + const val TEAK_DEMON_LECTERN_8542 = 8542 + const val TEAK_DEMON_LECTERN_8543 = 8543 + const val MAHOGANY_EAGLE_8544 = 8544 + const val MAHOGANY_EAGLE_8545 = 8545 + const val MAHOGANY_DEMON_8546 = 8546 + const val MAHOGANY_DEMON_8547 = 8547 + const val WOOD_DINING_TABLE_8548 = 8548 + const val WOOD_DINING_TABLE_8549 = 8549 + const val OAK_DINING_TABLE_8550 = 8550 + const val OAK_DINING_TABLE_8551 = 8551 + const val CARVED_OAK_TABLE_8552 = 8552 + const val CARVED_OAK_TABLE_8553 = 8553 + const val TEAK_TABLE_8554 = 8554 + const val TEAK_TABLE_8555 = 8555 + const val CARVED_TEAK_TABLE_8556 = 8556 + const val CARVED_TEAK_TABLE_8557 = 8557 + const val MAHOGANY_TABLE_8558 = 8558 + const val MAHOGANY_TABLE_8559 = 8559 + const val OPULENT_TABLE_8560 = 8560 + const val OPULENT_TABLE_8561 = 8561 + const val WOODEN_BENCH_8562 = 8562 + const val WOODEN_BENCH_8563 = 8563 + const val OAK_BENCH_8564 = 8564 + const val OAK_BENCH_8565 = 8565 + const val CARVED_OAK_BENCH_8566 = 8566 + const val CARVED_OAK_BENCH_8567 = 8567 + const val TEAK_DINING_BENCH_8568 = 8568 + const val TEAK_DINING_BENCH_8569 = 8569 + const val CARVED_TEAK_BENCH_8570 = 8570 + const val CARVED_TEAK_BENCH_8571 = 8571 + const val MAHOGANY_BENCH_8572 = 8572 + const val MAHOGANY_BENCH_8573 = 8573 + const val GILDED_BENCH_8574 = 8574 + const val GILDED_BENCH_8575 = 8575 + const val WOODEN_BED_8576 = 8576 + const val WOODEN_BED_8577 = 8577 + const val OAK_BED_8578 = 8578 + const val OAK_BED_8579 = 8579 + const val LARGE_OAK_BED_8580 = 8580 + const val LARGE_OAK_BED_8581 = 8581 + const val TEAK_BED_8582 = 8582 + const val TEAK_BED_8583 = 8583 + const val LARGE_TEAK_BED_8584 = 8584 + const val LARGE_TEAK_BED_8585 = 8585 + const val FOUR_POSTER_8586 = 8586 + const val FOUR_POSTER_8587 = 8587 + const val GILDED_4_POSTER_8588 = 8588 + const val GILDED_4_POSTER_8589 = 8589 + const val OAK_CLOCK_8590 = 8590 + const val OAK_CLOCK_8591 = 8591 + const val TEAK_CLOCK_8592 = 8592 + const val TEAK_CLOCK_8593 = 8593 + const val GILDED_CLOCK_8594 = 8594 + const val GILDED_CLOCK_8595 = 8595 + const val SHAVING_STAND_8596 = 8596 + const val SHAVING_STAND_8597 = 8597 + const val OAK_SHAVING_STAND_8598 = 8598 + const val OAK_SHAVING_STAND_8599 = 8599 + const val OAK_DRESSER_8600 = 8600 + const val OAK_DRESSER_8601 = 8601 + const val TEAK_DRESSER_8602 = 8602 + const val TEAK_DRESSER_8603 = 8603 + const val FANCY_TEAK_DRESSER_8604 = 8604 + const val FANCY_TEAK_DRESSER_8605 = 8605 + const val MAHOGANY_DRESSER_8606 = 8606 + const val MAHOGANY_DRESSER_8607 = 8607 + const val GILDED_DRESSER_8608 = 8608 + const val GILDED_DRESSER_8609 = 8609 + const val SHOE_BOX_8610 = 8610 + const val SHOE_BOX_8611 = 8611 + const val OAK_DRAWERS_8612 = 8612 + const val OAK_DRAWERS_8613 = 8613 + const val OAK_WARDROBE_8614 = 8614 + const val OAK_WARDROBE_8615 = 8615 + const val TEAK_DRAWERS_8616 = 8616 + const val TEAK_DRAWERS_8617 = 8617 + const val TEAK_WARDROBE_8618 = 8618 + const val TEAK_WARDROBE_8619 = 8619 + const val MAHOGANY_DROBE_8620 = 8620 + const val MAHOGANY_DROBE_8621 = 8621 + const val GILDED_WARDROBE_8622 = 8622 + const val GILDED_WARDROBE_8623 = 8623 + const val CRYSTAL_BALL_8624 = 8624 + const val CRYSTAL_BALL_8625 = 8625 + const val ELEMENTAL_SPHERE_8626 = 8626 + const val ELEMENTAL_SPHERE_8627 = 8627 + const val CRYSTAL_OF_POWER_8628 = 8628 + const val CRYSTAL_OF_POWER_8629 = 8629 + const val GLOBE_8630 = 8630 + const val GLOBE_8631 = 8631 + const val ORNAMENTAL_GLOBE_8632 = 8632 + const val ORNAMENTAL_GLOBE_8633 = 8633 + const val LUNAR_GLOBE_8634 = 8634 + const val LUNAR_GLOBE_8635 = 8635 + const val CELESTIAL_GLOBE_8636 = 8636 + const val CELESTIAL_GLOBE_8637 = 8637 + const val ARMILLARY_SPHERE_8638 = 8638 + const val ARMILLARY_SPHERE_8639 = 8639 + const val SMALL_ORRERY_8640 = 8640 + const val SMALL_ORRERY_8641 = 8641 + const val LARGE_ORRERY_8642 = 8642 + const val LARGE_ORRERY_8643 = 8643 + const val WOODEN_TELESCOPE_8644 = 8644 + const val WOODEN_TELESCOPE_8645 = 8645 + const val TEAK_TELESCOPE_8646 = 8646 + const val TEAK_TELESCOPE_8647 = 8647 + const val MAHOGANY_SCOPE_8648 = 8648 + const val MAHOGANY_SCOPE_8649 = 8649 + const val BANNER_8650 = 8650 + const val NULL_8651 = 8651 + const val BANNER_8652 = 8652 + const val NULL_8653 = 8653 + const val BANNER_8654 = 8654 + const val NULL_8655 = 8655 + const val BANNER_8656 = 8656 + const val NULL_8657 = 8657 + const val BANNER_8658 = 8658 + const val NULL_8659 = 8659 + const val BANNER_8660 = 8660 + const val NULL_8661 = 8661 + const val BANNER_8662 = 8662 + const val NULL_8663 = 8663 + const val BANNER_8664 = 8664 + const val NULL_8665 = 8665 + const val BANNER_8666 = 8666 + const val NULL_8667 = 8667 + const val BANNER_8668 = 8668 + const val NULL_8669 = 8669 + const val BANNER_8670 = 8670 + const val NULL_8671 = 8671 + const val BANNER_8672 = 8672 + const val NULL_8673 = 8673 + const val BANNER_8674 = 8674 + const val NULL_8675 = 8675 + const val BANNER_8676 = 8676 + const val NULL_8677 = 8677 + const val BANNER_8678 = 8678 + const val NULL_8679 = 8679 + const val BANNER_8680 = 8680 + const val NULL_8681 = 8681 + const val STEEL_HERALDIC_HELM_8682 = 8682 + const val NULL_8683 = 8683 + const val STEEL_HERALDIC_HELM_8684 = 8684 + const val NULL_8685 = 8685 + const val STEEL_HERALDIC_HELM_8686 = 8686 + const val NULL_8687 = 8687 + const val STEEL_HERALDIC_HELM_8688 = 8688 + const val NULL_8689 = 8689 + const val STEEL_HERALDIC_HELM_8690 = 8690 + const val NULL_8691 = 8691 + const val STEEL_HERALDIC_HELM_8692 = 8692 + const val NULL_8693 = 8693 + const val STEEL_HERALDIC_HELM_8694 = 8694 + const val NULL_8695 = 8695 + const val STEEL_HERALDIC_HELM_8696 = 8696 + const val NULL_8697 = 8697 + const val STEEL_HERALDIC_HELM_8698 = 8698 + const val NULL_8699 = 8699 + const val STEEL_HERALDIC_HELM_8700 = 8700 + const val NULL_8701 = 8701 + const val STEEL_HERALDIC_HELM_8702 = 8702 + const val NULL_8703 = 8703 + const val STEEL_HERALDIC_HELM_8704 = 8704 + const val NULL_8705 = 8705 + const val STEEL_HERALDIC_HELM_8706 = 8706 + const val NULL_8707 = 8707 + const val STEEL_HERALDIC_HELM_8708 = 8708 + const val NULL_8709 = 8709 + const val STEEL_HERALDIC_HELM_8710 = 8710 + const val NULL_8711 = 8711 + const val STEEL_HERALDIC_HELM_8712 = 8712 + const val NULL_8713 = 8713 + const val RUNE_KITESHIELD_8714 = 8714 + const val NULL_8715 = 8715 + const val RUNE_KITESHIELD_8716 = 8716 + const val NULL_8717 = 8717 + const val RUNE_KITESHIELD_8718 = 8718 + const val NULL_8719 = 8719 + const val RUNE_KITESHIELD_8720 = 8720 + const val NULL_8721 = 8721 + const val RUNE_KITESHIELD_8722 = 8722 + const val NULL_8723 = 8723 + const val RUNE_KITESHIELD_8724 = 8724 + const val NULL_8725 = 8725 + const val RUNE_KITESHIELD_8726 = 8726 + const val NULL_8727 = 8727 + const val RUNE_KITESHIELD_8728 = 8728 + const val NULL_8729 = 8729 + const val RUNE_KITESHIELD_8730 = 8730 + const val NULL_8731 = 8731 + const val RUNE_KITESHIELD_8732 = 8732 + const val NULL_8733 = 8733 + const val RUNE_KITESHIELD_8734 = 8734 + const val NULL_8735 = 8735 + const val RUNE_KITESHIELD_8736 = 8736 + const val NULL_8737 = 8737 + const val RUNE_KITESHIELD_8738 = 8738 + const val NULL_8739 = 8739 + const val RUNE_KITESHIELD_8740 = 8740 + const val NULL_8741 = 8741 + const val RUNE_KITESHIELD_8742 = 8742 + const val NULL_8743 = 8743 + const val RUNE_KITESHIELD_8744 = 8744 + const val NULL_8745 = 8745 + const val STEEL_KITESHIELD_8746 = 8746 + const val NULL_8747 = 8747 + const val STEEL_KITESHIELD_8748 = 8748 + const val NULL_8749 = 8749 + const val STEEL_KITESHIELD_8750 = 8750 + const val NULL_8751 = 8751 + const val STEEL_KITESHIELD_8752 = 8752 + const val NULL_8753 = 8753 + const val STEEL_KITESHIELD_8754 = 8754 + const val NULL_8755 = 8755 + const val STEEL_KITESHIELD_8756 = 8756 + const val NULL_8757 = 8757 + const val STEEL_KITESHIELD_8758 = 8758 + const val NULL_8759 = 8759 + const val STEEL_KITESHIELD_8760 = 8760 + const val NULL_8761 = 8761 + const val STEEL_KITESHIELD_8762 = 8762 + const val NULL_8763 = 8763 + const val STEEL_KITESHIELD_8764 = 8764 + const val NULL_8765 = 8765 + const val STEEL_KITESHIELD_8766 = 8766 + const val NULL_8767 = 8767 + const val STEEL_KITESHIELD_8768 = 8768 + const val NULL_8769 = 8769 + const val STEEL_KITESHIELD_8770 = 8770 + const val NULL_8771 = 8771 + const val STEEL_KITESHIELD_8772 = 8772 + const val NULL_8773 = 8773 + const val STEEL_KITESHIELD_8774 = 8774 + const val NULL_8775 = 8775 + const val STEEL_KITESHIELD_8776 = 8776 + const val NULL_8777 = 8777 + const val OAK_PLANK_8778 = 8778 + const val OAK_PLANK_8779 = 8779 + const val TEAK_PLANK_8780 = 8780 + const val TEAK_PLANK_8781 = 8781 + const val MAHOGANY_PLANK_8782 = 8782 + const val MAHOGANY_PLANK_8783 = 8783 + const val GOLD_LEAF_8784 = 8784 + const val GOLD_LEAF_8785 = 8785 + const val MARBLE_BLOCK_8786 = 8786 + const val MARBLE_BLOCK_8787 = 8787 + const val MAGIC_STONE_8788 = 8788 + const val MAGIC_STONE_8789 = 8789 + const val BOLT_OF_CLOTH_8790 = 8790 + const val BOLT_OF_CLOTH_8791 = 8791 + const val CLOCKWORK_8792 = 8792 + const val CLOCKWORK_8793 = 8793 + const val SAW_8794 = 8794 + const val SAW_8795 = 8795 + const val THING_8796 = 8796 + const val PICTURE_8797 = 8797 + const val NULL_8798 = 8798 + const val NULL_8799 = 8799 + const val NULL_8800 = 8800 + const val NULL_8801 = 8801 + const val NULL_8802 = 8802 + const val NULL_8803 = 8803 + const val NULL_8804 = 8804 + const val NULL_8805 = 8805 + const val NULL_8806 = 8806 + const val NULL_8807 = 8807 + const val NULL_8808 = 8808 + const val NULL_8809 = 8809 + const val NULL_8810 = 8810 + const val NULL_8811 = 8811 + const val NULL_8812 = 8812 + const val NULL_8813 = 8813 + const val NULL_8814 = 8814 + const val NULL_8815 = 8815 + const val NULL_8816 = 8816 + const val NULL_8817 = 8817 + const val NULL_8818 = 8818 + const val NULL_8819 = 8819 + const val NULL_8820 = 8820 + const val NULL_8821 = 8821 + const val NULL_8822 = 8822 + const val NULL_8823 = 8823 + const val NULL_8824 = 8824 + const val NULL_8825 = 8825 + const val NULL_8826 = 8826 + const val NULL_8827 = 8827 + const val NULL_8828 = 8828 + const val NULL_8829 = 8829 + const val NULL_8830 = 8830 + const val NULL_8831 = 8831 + const val NULL_8832 = 8832 + const val NULL_8833 = 8833 + const val NULL_8834 = 8834 + const val NULL_8835 = 8835 + const val MAHOGANY_LOGS_8836 = 8836 + const val TIMBER_BEAM_8837 = 8837 + const val TIMBER_BEAM_8838 = 8838 + const val VOID_KNIGHT_TOP_8839 = 8839 + const val VOID_KNIGHT_ROBE_8840 = 8840 + const val VOID_KNIGHT_MACE_8841 = 8841 + const val VOID_KNIGHT_GLOVES_8842 = 8842 + const val NULL_8843 = 8843 + const val BRONZE_DEFENDER_8844 = 8844 + const val IRON_DEFENDER_8845 = 8845 + const val STEEL_DEFENDER_8846 = 8846 + const val BLACK_DEFENDER_8847 = 8847 + const val MITHRIL_DEFENDER_8848 = 8848 + const val ADAMANT_DEFENDER_8849 = 8849 + const val RUNE_DEFENDER_8850 = 8850 + const val WARRIOR_GUILD_TOKEN_8851 = 8851 + const val NULL_8852 = 8852 + const val NULL_8853 = 8853 + const val NULL_8854 = 8854 + const val NULL_8855 = 8855 + const val DEFENSIVE_SHIELD_8856 = 8856 + const val SHOT_8857 = 8857 + const val EIGHTEEN_LB_SHOT_8858 = 8858 + const val TWENTY_TWO_LB_SHOT_8859 = 8859 + const val ONE_BARREL_8860 = 8860 + const val TWO_BARRELS_8861 = 8861 + const val THREE_BARRELS_8862 = 8862 + const val FOUR_BARRELS_8863 = 8863 + const val FIVE_BARRELS_8864 = 8864 + const val GROUND_ASHES_8865 = 8865 + const val STEEL_KEY_8866 = 8866 + const val BRONZE_KEY_8867 = 8867 + const val SILVER_KEY_8868 = 8868 + const val IRON_KEY_8869 = 8869 + const val ZANIK_8870 = 8870 + const val CRATE_WITH_ZANIK_8871 = 8871 + const val BONE_DAGGER_8872 = 8872 + const val BONE_DAGGER_8873 = 8873 + const val BONE_DAGGER_P_8874 = 8874 + const val BONE_DAGGER_P_8875 = 8875 + const val BONE_DAGGER_P_PLUS_8876 = 8876 + const val BONE_DAGGER_P_PLUS_8877 = 8877 + const val BONE_DAGGER_P_PLUS_PLUS_8878 = 8878 + const val BONE_DAGGER_P_PLUS_PLUS_8879 = 8879 + const val DORGESHUUN_CBOW_8880 = 8880 + const val DORGESHUUN_CBOW_8881 = 8881 + const val BONE_BOLTS_8882 = 8882 + const val NULL_8883 = 8883 + const val NULL_8884 = 8884 + const val NULL_8885 = 8885 + const val NULL_8886 = 8886 + const val ZANIK_8887 = 8887 + const val ZANIK_HAM_8888 = 8888 + const val ZANIK_SHOWDOWN_8889 = 8889 + const val COINS_8890 = 8890 + const val NULL_8891 = 8891 + const val NULL_8892 = 8892 + const val NULL_8893 = 8893 + const val NULL_8894 = 8894 + const val NULL_8895 = 8895 + const val NULL_8896 = 8896 + const val NULL_8897 = 8897 + const val NULL_8898 = 8898 + const val NULL_8899 = 8899 + const val CAVE_HORROR_8900 = 8900 + const val BLACK_MASK_10_8901 = 8901 + const val BLACK_MASK_10_8902 = 8902 + const val BLACK_MASK_9_8903 = 8903 + const val BLACK_MASK_9_8904 = 8904 + const val BLACK_MASK_8_8905 = 8905 + const val BLACK_MASK_8_8906 = 8906 + const val BLACK_MASK_7_8907 = 8907 + const val BLACK_MASK_7_8908 = 8908 + const val BLACK_MASK_6_8909 = 8909 + const val BLACK_MASK_6_8910 = 8910 + const val BLACK_MASK_5_8911 = 8911 + const val BLACK_MASK_5_8912 = 8912 + const val BLACK_MASK_4_8913 = 8913 + const val BLACK_MASK_4_8914 = 8914 + const val BLACK_MASK_3_8915 = 8915 + const val BLACK_MASK_3_8916 = 8916 + const val BLACK_MASK_2_8917 = 8917 + const val BLACK_MASK_2_8918 = 8918 + const val BLACK_MASK_1_8919 = 8919 + const val BLACK_MASK_1_8920 = 8920 + const val BLACK_MASK_8921 = 8921 + const val BLACK_MASK_8922 = 8922 + const val WITCHWOOD_ICON_8923 = 8923 + const val BANDANA_AND_EYEPATCH_8924 = 8924 + const val BANDANA_AND_EYEPATCH_8925 = 8925 + const val BANDANA_AND_EYEPATCH_8926 = 8926 + const val BANDANA_AND_EYEPATCH_8927 = 8927 + const val HAT_AND_EYEPATCH_8928 = 8928 + const val CRABCLAW_AND_HOOK_8929 = 8929 + const val PIPE_SECTION_8930 = 8930 + const val PIPE_SECTION_8931 = 8931 + const val LUMBER_PATCH_8932 = 8932 + const val LUMBER_PATCH_8933 = 8933 + const val SCRAPEY_TREE_LOGS_8934 = 8934 + const val SCRAPEY_TREE_LOGS_8935 = 8935 + const val BLUE_FLOWERS_8936 = 8936 + const val BLUE_FLOWERS_8937 = 8937 + const val RED_FLOWERS_8938 = 8938 + const val RED_FLOWERS_8939 = 8939 + const val RUM_8940 = 8940 + const val RUM_8941 = 8941 + const val MONKEY_8942 = 8942 + const val BLUE_MONKEY_8943 = 8943 + const val BLUE_MONKEY_8944 = 8944 + const val BLUE_MONKEY_8945 = 8945 + const val RED_MONKEY_8946 = 8946 + const val RED_MONKEY_8947 = 8947 + const val RED_MONKEY_8948 = 8948 + const val PIRATE_BANDANA_8949 = 8949 + const val PIRATE_HAT_8950 = 8950 + const val PIECES_OF_EIGHT_8951 = 8951 + const val BLUE_NAVAL_SHIRT_8952 = 8952 + const val GREEN_NAVAL_SHIRT_8953 = 8953 + const val RED_NAVAL_SHIRT_8954 = 8954 + const val BROWN_NAVAL_SHIRT_8955 = 8955 + const val BLACK_NAVAL_SHIRT_8956 = 8956 + const val PURPLE_NAVAL_SHIRT_8957 = 8957 + const val GREY_NAVAL_SHIRT_8958 = 8958 + const val BLUE_TRICORN_HAT_8959 = 8959 + const val GREEN_TRICORN_HAT_8960 = 8960 + const val RED_TRICORN_HAT_8961 = 8961 + const val BROWN_TRICORN_HAT_8962 = 8962 + const val BLACK_TRICORN_HAT_8963 = 8963 + const val PURPLE_TRICORN_HAT_8964 = 8964 + const val GREY_TRICORN_HAT_8965 = 8965 + const val CUTTHROAT_FLAG_8966 = 8966 + const val GUILDED_SMILE_FLAG_8967 = 8967 + const val BRONZE_FIST_FLAG_8968 = 8968 + const val LUCKY_SHOT_FLAG_8969 = 8969 + const val TREASURE_FLAG_8970 = 8970 + const val PHASMATYS_FLAG_8971 = 8971 + const val BOWL_OF_RED_WATER_8972 = 8972 + const val BOWL_OF_RED_WATER_8973 = 8973 + const val BOWL_OF_BLUE_WATER_8974 = 8974 + const val BOWL_OF_BLUE_WATER_8975 = 8975 + const val BITTERNUT_8976 = 8976 + const val SCRAPEY_BARK_8977 = 8977 + const val SCRAPEY_BARK_8978 = 8978 + const val BRIDGE_SECTION_8979 = 8979 + const val BRIDGE_SECTION_8980 = 8980 + const val SWEETGRUBS_8981 = 8981 + const val SWEETGRUBS_8982 = 8982 + const val NULL_8983 = 8983 + const val NULL_8984 = 8984 + const val NULL_8985 = 8985 + const val BUCKET_8986 = 8986 + const val TORCH_8987 = 8987 + const val THE_STUFF_8988 = 8988 + const val BREWIN_GUIDE_8989 = 8989 + const val BREWIN_GUIDE_8990 = 8990 + const val BLUE_NAVY_SLACKS_8991 = 8991 + const val GREEN_NAVY_SLACKS_8992 = 8992 + const val RED_NAVY_SLACKS_8993 = 8993 + const val BROWN_NAVY_SLACKS_8994 = 8994 + const val BLACK_NAVY_SLACKS_8995 = 8995 + const val PURPLE_NAVY_SLACKS_8996 = 8996 + const val GREY_NAVY_SLACKS_8997 = 8997 + const val BANDANA_AND_EYEPATCH_8998 = 8998 + const val BANDANA_AND_EYEPATCH_8999 = 8999 + const val BANDANA_AND_EYEPATCH_9000 = 9000 + const val BANDANA_AND_EYEPATCH_9001 = 9001 + const val HAT_AND_EYEPATCH_9002 = 9002 + const val SECURITY_BOOK_9003 = 9003 + const val STRONGHOLD_NOTES_9004 = 9004 + const val FANCY_BOOTS_9005 = 9005 + const val FIGHTING_BOOTS_9006 = 9006 + const val RIGHT_SKULL_HALF_9007 = 9007 + const val LEFT_SKULL_HALF_9008 = 9008 + const val STRANGE_SKULL_9009 = 9009 + const val TOP_OF_SCEPTRE_9010 = 9010 + const val BOTTOM_OF_SCEPTRE_9011 = 9011 + const val RUNED_SCEPTRE_9012 = 9012 + const val SKULL_SCEPTRE_9013 = 9013 + const val SECURITY_BOOK_9014 = 9014 + const val STRONGHOLD_NOTES_9015 = 9015 + const val GORAK_CLAWS_9016 = 9016 + const val STAR_FLOWER_9017 = 9017 + const val GORAK_CLAW_POWDER_9018 = 9018 + const val MAGIC_ESSENCEUNF_9019 = 9019 + const val QUEENS_SECATEURS_9020 = 9020 + const val MAGIC_ESSENCE4_9021 = 9021 + const val MAGIC_ESSENCE3_9022 = 9022 + const val MAGIC_ESSENCE2_9023 = 9023 + const val MAGIC_ESSENCE1_9024 = 9024 + const val NUFFS_CERTIFICATE_9025 = 9025 + const val IVORY_COMB_9026 = 9026 + const val IVORY_COMB_9027 = 9027 + const val GOLDEN_SCARAB_9028 = 9028 + const val GOLDEN_SCARAB_9029 = 9029 + const val STONE_SCARAB_9030 = 9030 + const val STONE_SCARAB_9031 = 9031 + const val POTTERY_SCARAB_9032 = 9032 + const val POTTERY_SCARAB_9033 = 9033 + const val GOLDEN_STATUETTE_9034 = 9034 + const val GOLDEN_STATUETTE_9035 = 9035 + const val POTTERY_STATUETTE_9036 = 9036 + const val POTTERY_STATUETTE_9037 = 9037 + const val STONE_STATUETTE_9038 = 9038 + const val STONE_STATUETTE_9039 = 9039 + const val GOLD_SEAL_9040 = 9040 + const val GOLD_SEAL_9041 = 9041 + const val STONE_SEAL_9042 = 9042 + const val STONE_SEAL_9043 = 9043 + const val PHARAOHS_SCEPTRE_9044 = 9044 + const val PHARAOHS_SCEPTRE_9045 = 9045 + const val PHARAOHS_SCEPTRE_9046 = 9046 + const val PHARAOHS_SCEPTRE_9047 = 9047 + const val PHARAOHS_SCEPTRE_9048 = 9048 + const val PHARAOHS_SCEPTRE_9049 = 9049 + const val PHARAOHS_SCEPTRE_9050 = 9050 + const val PHARAOHS_SCEPTRE_9051 = 9051 + const val LOCUST_MEAT_9052 = 9052 + const val LOCUST_MEAT_9053 = 9053 + const val RED_GOBLIN_MAIL_9054 = 9054 + const val BLACK_GOBLIN_MAIL_9055 = 9055 + const val YELLOW_GOBLIN_MAIL_9056 = 9056 + const val GREEN_GOBLIN_MAIL_9057 = 9057 + const val PURPLE_GOBLIN_MAIL_9058 = 9058 + const val PINK_GOBLIN_MAIL_9059 = 9059 + const val NULL_9060 = 9060 + const val NULL_9061 = 9061 + const val NULL_9062 = 9062 + const val NULL_9063 = 9063 + const val EMERALD_LANTERN_9064 = 9064 + const val EMERALD_LANTERN_9065 = 9065 + const val EMERALD_LENS_9066 = 9066 + const val DREAM_LOG_9067 = 9067 + const val MOONCLAN_HELM_9068 = 9068 + const val MOONCLAN_HAT_9069 = 9069 + const val MOONCLAN_ARMOUR_9070 = 9070 + const val MOONCLAN_SKIRT_9071 = 9071 + const val MOONCLAN_GLOVES_9072 = 9072 + const val MOONCLAN_BOOTS_9073 = 9073 + const val MOONCLAN_CAPE_9074 = 9074 + const val ASTRAL_RUNE_9075 = 9075 + const val LUNAR_ORE_9076 = 9076 + const val LUNAR_BAR_9077 = 9077 + const val MOONCLAN_MANUAL_9078 = 9078 + const val SUQAH_TOOTH_9079 = 9079 + const val SUQAH_HIDE_9080 = 9080 + const val SUQAH_LEATHER_9081 = 9081 + const val GROUND_TOOTH_9082 = 9082 + const val SEAL_OF_PASSAGE_9083 = 9083 + const val LUNAR_STAFF_9084 = 9084 + const val EMPTY_VIAL_9085 = 9085 + const val VIAL_OF_WATER_9086 = 9086 + const val WAKING_SLEEP_VIAL_9087 = 9087 + const val GUAM_VIAL_9088 = 9088 + const val MARR_VIAL_9089 = 9089 + const val GUAM_MARR_VIAL_9090 = 9090 + const val LUNAR_STAFF___PT1_9091 = 9091 + const val LUNAR_STAFF___PT2_9092 = 9092 + const val LUNAR_STAFF___PT3_9093 = 9093 + const val KINDLING_9094 = 9094 + const val SOAKED_KINDLING_9095 = 9095 + const val LUNAR_HELM_9096 = 9096 + const val LUNAR_TORSO_9097 = 9097 + const val LUNAR_LEGS_9098 = 9098 + const val LUNAR_GLOVES_9099 = 9099 + const val LUNAR_BOOTS_9100 = 9100 + const val LUNAR_CAPE_9101 = 9101 + const val LUNAR_AMULET_9102 = 9102 + const val A_SPECIAL_TIARA_9103 = 9103 + const val LUNAR_RING_9104 = 9104 + const val SUQAH_MONSTER_9105 = 9105 + const val ASTRAL_TIARA_9106 = 9106 + const val NULL_9107 = 9107 + const val NULL_9108 = 9108 + const val NULL_9109 = 9109 + const val NULL_9110 = 9110 + const val NULL_9111 = 9111 + const val NULL_9112 = 9112 + const val NULL_9113 = 9113 + const val NULL_9114 = 9114 + const val NULL_9115 = 9115 + const val NULL_9116 = 9116 + const val NULL_9117 = 9117 + const val NULL_9118 = 9118 + const val NULL_9119 = 9119 + const val NULL_9120 = 9120 + const val NULL_9121 = 9121 + const val NULL_9122 = 9122 + const val NULL_9123 = 9123 + const val NULL_9124 = 9124 + const val NULL_9125 = 9125 + const val NULL_9126 = 9126 + const val NULL_9127 = 9127 + const val NULL_9128 = 9128 + const val NULL_9129 = 9129 + const val NULL_9130 = 9130 + const val NULL_9131 = 9131 + const val NULL_9132 = 9132 + const val NULL_9133 = 9133 + const val NULL_9134 = 9134 + const val NULL_9135 = 9135 + const val NULL_9136 = 9136 + const val NULL_9137 = 9137 + const val NULL_9138 = 9138 + const val BLURITE_BOLTS_9139 = 9139 + const val IRON_BOLTS_9140 = 9140 + const val STEEL_BOLTS_9141 = 9141 + const val MITHRIL_BOLTS_9142 = 9142 + const val ADAMANT_BOLTS_9143 = 9143 + const val RUNE_BOLTS_9144 = 9144 + const val SILVER_BOLTS_9145 = 9145 + const val NULL_9146 = 9146 + const val NULL_9147 = 9147 + const val NULL_9148 = 9148 + const val NULL_9149 = 9149 + const val NULL_9150 = 9150 + const val NULL_9151 = 9151 + const val NULL_9152 = 9152 + const val NULL_9153 = 9153 + const val NULL_9154 = 9154 + const val NULL_9155 = 9155 + const val NULL_9156 = 9156 + const val NULL_9157 = 9157 + const val NULL_9158 = 9158 + const val NULL_9159 = 9159 + const val NULL_9160 = 9160 + const val NULL_9161 = 9161 + const val NULL_9162 = 9162 + const val NULL_9163 = 9163 + const val NULL_9164 = 9164 + const val NULL_9165 = 9165 + const val NULL_9166 = 9166 + const val NULL_9167 = 9167 + const val NULL_9168 = 9168 + const val NULL_9169 = 9169 + const val NULL_9170 = 9170 + const val NULL_9171 = 9171 + const val NULL_9172 = 9172 + const val NULL_9173 = 9173 + const val BRONZE_CROSSBOW_9174 = 9174 + const val BRONZE_CROSSBOW_9175 = 9175 + const val BLURITE_CROSSBOW_9176 = 9176 + const val IRON_CROSSBOW_9177 = 9177 + const val IRON_CROSSBOW_9178 = 9178 + const val STEEL_CROSSBOW_9179 = 9179 + const val STEEL_CROSSBOW_9180 = 9180 + const val MITH_CROSSBOW_9181 = 9181 + const val MITH_CROSSBOW_9182 = 9182 + const val ADAMANT_CROSSBOW_9183 = 9183 + const val ADAMANT_CROSSBOW_9184 = 9184 + const val RUNE_CROSSBOW_9185 = 9185 + const val RUNE_CROSSBOW_9186 = 9186 + const val JADE_BOLT_TIPS_9187 = 9187 + const val TOPAZ_BOLT_TIPS_9188 = 9188 + const val SAPPHIRE_BOLT_TIPS_9189 = 9189 + const val EMERALD_BOLT_TIPS_9190 = 9190 + const val RUBY_BOLT_TIPS_9191 = 9191 + const val DIAMOND_BOLT_TIPS_9192 = 9192 + const val DRAGON_BOLT_TIPS_9193 = 9193 + const val ONYX_BOLT_TIPS_9194 = 9194 + const val NULL_9195 = 9195 + const val NULL_9196 = 9196 + const val NULL_9197 = 9197 + const val NULL_9198 = 9198 + const val NULL_9199 = 9199 + const val NULL_9200 = 9200 + const val NULL_9201 = 9201 + const val NULL_9202 = 9202 + const val NULL_9203 = 9203 + const val NULL_9204 = 9204 + const val NULL_9205 = 9205 + const val NULL_9206 = 9206 + const val NULL_9207 = 9207 + const val NULL_9208 = 9208 + const val NULL_9209 = 9209 + const val NULL_9210 = 9210 + const val NULL_9211 = 9211 + const val NULL_9212 = 9212 + const val NULL_9213 = 9213 + const val NULL_9214 = 9214 + const val NULL_9215 = 9215 + const val NULL_9216 = 9216 + const val NULL_9217 = 9217 + const val NULL_9218 = 9218 + const val NULL_9219 = 9219 + const val NULL_9220 = 9220 + const val NULL_9221 = 9221 + const val NULL_9222 = 9222 + const val NULL_9223 = 9223 + const val NULL_9224 = 9224 + const val NULL_9225 = 9225 + const val NULL_9226 = 9226 + const val NULL_9227 = 9227 + const val NULL_9228 = 9228 + const val NULL_9229 = 9229 + const val NULL_9230 = 9230 + const val NULL_9231 = 9231 + const val NULL_9232 = 9232 + const val NULL_9233 = 9233 + const val NULL_9234 = 9234 + const val NULL_9235 = 9235 + const val OPAL_BOLTS_E_9236 = 9236 + const val JADE_BOLTS_E_9237 = 9237 + const val PEARL_BOLTS_E_9238 = 9238 + const val TOPAZ_BOLTS_E_9239 = 9239 + const val SAPPHIRE_BOLTS_E_9240 = 9240 + const val EMERALD_BOLTS_E_9241 = 9241 + const val RUBY_BOLTS_E_9242 = 9242 + const val DIAMOND_BOLTS_E_9243 = 9243 + const val DRAGON_BOLTS_E_9244 = 9244 + const val ONYX_BOLTS_E_9245 = 9245 + const val NULL_9246 = 9246 + const val NULL_9247 = 9247 + const val NULL_9248 = 9248 + const val NULL_9249 = 9249 + const val NULL_9250 = 9250 + const val NULL_9251 = 9251 + const val NULL_9252 = 9252 + const val NULL_9253 = 9253 + const val NULL_9254 = 9254 + const val NULL_9255 = 9255 + const val NULL_9256 = 9256 + const val NULL_9257 = 9257 + const val NULL_9258 = 9258 + const val NULL_9259 = 9259 + const val NULL_9260 = 9260 + const val NULL_9261 = 9261 + const val NULL_9262 = 9262 + const val NULL_9263 = 9263 + const val NULL_9264 = 9264 + const val NULL_9265 = 9265 + const val NULL_9266 = 9266 + const val NULL_9267 = 9267 + const val NULL_9268 = 9268 + const val NULL_9269 = 9269 + const val NULL_9270 = 9270 + const val NULL_9271 = 9271 + const val NULL_9272 = 9272 + const val NULL_9273 = 9273 + const val NULL_9274 = 9274 + const val NULL_9275 = 9275 + const val NULL_9276 = 9276 + const val NULL_9277 = 9277 + const val NULL_9278 = 9278 + const val NULL_9279 = 9279 + const val NULL_9280 = 9280 + const val NULL_9281 = 9281 + const val NULL_9282 = 9282 + const val NULL_9283 = 9283 + const val NULL_9284 = 9284 + const val NULL_9285 = 9285 + const val BLURITE_BOLTSP_9286 = 9286 + const val IRON_BOLTS_P_9287 = 9287 + const val STEEL_BOLTS_P_9288 = 9288 + const val MITHRIL_BOLTS_P_9289 = 9289 + const val ADAMANT_BOLTS_P_9290 = 9290 + const val RUNITE_BOLTS_P_9291 = 9291 + const val SILVER_BOLTS_P_9292 = 9292 + const val BLURITE_BOLTSP_PLUS_9293 = 9293 + const val IRON_BOLTSP_PLUS_9294 = 9294 + const val STEEL_BOLTSP_PLUS_9295 = 9295 + const val MITHRIL_BOLTSP_PLUS_9296 = 9296 + const val ADAMANT_BOLTSP_PLUS_9297 = 9297 + const val RUNITE_BOLTSP_PLUS_9298 = 9298 + const val SILVER_BOLTSP_PLUS_9299 = 9299 + const val BLURITE_BOLTSP_PLUS_PLUS_9300 = 9300 + const val IRON_BOLTSP_PLUS_PLUS_9301 = 9301 + const val STEEL_BOLTSP_PLUS_PLUS_9302 = 9302 + const val MITHRIL_BOLTSP_PLUS_PLUS_9303 = 9303 + const val ADAMANT_BOLTSP_PLUS_PLUS_9304 = 9304 + const val RUNITE_BOLTSP_PLUS_PLUS_9305 = 9305 + const val SILVER_BOLTSP_PLUS_PLUS_9306 = 9306 + const val NULL_9307 = 9307 + const val NULL_9308 = 9308 + const val NULL_9309 = 9309 + const val NULL_9310 = 9310 + const val NULL_9311 = 9311 + const val NULL_9312 = 9312 + const val NULL_9313 = 9313 + const val NULL_9314 = 9314 + const val NULL_9315 = 9315 + const val NULL_9316 = 9316 + const val NULL_9317 = 9317 + const val NULL_9318 = 9318 + const val NULL_9319 = 9319 + const val NULL_9320 = 9320 + const val NULL_9321 = 9321 + const val NULL_9322 = 9322 + const val NULL_9323 = 9323 + const val NULL_9324 = 9324 + const val NULL_9325 = 9325 + const val NULL_9326 = 9326 + const val NULL_9327 = 9327 + const val NULL_9328 = 9328 + const val NULL_9329 = 9329 + const val NULL_9330 = 9330 + const val NULL_9331 = 9331 + const val NULL_9332 = 9332 + const val NULL_9333 = 9333 + const val NULL_9334 = 9334 + const val JADE_BOLTS_9335 = 9335 + const val TOPAZ_BOLTS_9336 = 9336 + const val SAPPHIRE_BOLTS_9337 = 9337 + const val EMERALD_BOLTS_9338 = 9338 + const val RUBY_BOLTS_9339 = 9339 + const val DIAMOND_BOLTS_9340 = 9340 + const val DRAGON_BOLTS_9341 = 9341 + const val ONYX_BOLTS_9342 = 9342 + const val NULL_9343 = 9343 + const val NULL_9344 = 9344 + const val NULL_9345 = 9345 + const val NULL_9346 = 9346 + const val NULL_9347 = 9347 + const val NULL_9348 = 9348 + const val NULL_9349 = 9349 + const val NULL_9350 = 9350 + const val NULL_9351 = 9351 + const val NULL_9352 = 9352 + const val NULL_9353 = 9353 + const val NULL_9354 = 9354 + const val NULL_9355 = 9355 + const val NULL_9356 = 9356 + const val NULL_9357 = 9357 + const val NULL_9358 = 9358 + const val NULL_9359 = 9359 + const val NULL_9360 = 9360 + const val NULL_9361 = 9361 + const val NULL_9362 = 9362 + const val NULL_9363 = 9363 + const val NULL_9364 = 9364 + const val NULL_9365 = 9365 + const val NULL_9366 = 9366 + const val NULL_9367 = 9367 + const val NULL_9368 = 9368 + const val NULL_9369 = 9369 + const val NULL_9370 = 9370 + const val NULL_9371 = 9371 + const val NULL_9372 = 9372 + const val NULL_9373 = 9373 + const val NULL_9374 = 9374 + const val BRONZE_BOLTS_UNF_9375 = 9375 + const val BLURITE_BOLTS_UNF_9376 = 9376 + const val IRON_BOLTS_UNF_9377 = 9377 + const val STEEL_BOLTS_UNF_9378 = 9378 + const val MITHRIL_BOLTS_UNF_9379 = 9379 + const val ADAMANT_BOLTSUNF_9380 = 9380 + const val RUNITE_BOLTS_UNF_9381 = 9381 + const val SILVER_BOLTS_UNF_9382 = 9382 + const val NULL_9383 = 9383 + const val NULL_9384 = 9384 + const val NULL_9385 = 9385 + const val NULL_9386 = 9386 + const val NULL_9387 = 9387 + const val NULL_9388 = 9388 + const val NULL_9389 = 9389 + const val NULL_9390 = 9390 + const val NULL_9391 = 9391 + const val NULL_9392 = 9392 + const val NULL_9393 = 9393 + const val NULL_9394 = 9394 + const val NULL_9395 = 9395 + const val NULL_9396 = 9396 + const val NULL_9397 = 9397 + const val NULL_9398 = 9398 + const val NULL_9399 = 9399 + const val NULL_9400 = 9400 + const val NULL_9401 = 9401 + const val NULL_9402 = 9402 + const val NULL_9403 = 9403 + const val NULL_9404 = 9404 + const val NULL_9405 = 9405 + const val NULL_9406 = 9406 + const val NULL_9407 = 9407 + const val NULL_9408 = 9408 + const val NULL_9409 = 9409 + const val NULL_9410 = 9410 + const val NULL_9411 = 9411 + const val NULL_9412 = 9412 + const val NULL_9413 = 9413 + const val NULL_9414 = 9414 + const val GRAPPLE_9415 = 9415 + const val MITH_GRAPPLE_TIP_9416 = 9416 + const val MITH_GRAPPLE_TIP_9417 = 9417 + const val MITH_GRAPPLE_9418 = 9418 + const val MITH_GRAPPLE_9419 = 9419 + const val BRONZE_LIMBS_9420 = 9420 + const val BRONZE_LIMBS_9421 = 9421 + const val BLURITE_LIMBS_9422 = 9422 + const val IRON_LIMBS_9423 = 9423 + const val IRON_LIMBS_9424 = 9424 + const val STEEL_LIMBS_9425 = 9425 + const val STEEL_LIMBS_9426 = 9426 + const val MITHRIL_LIMBS_9427 = 9427 + const val MITHRIL_LIMBS_9428 = 9428 + const val ADAMANTITE_LIMBS_9429 = 9429 + const val ADAMANTITE_LIMBS_9430 = 9430 + const val RUNITE_LIMBS_9431 = 9431 + const val RUNITE_LIMBS_9432 = 9432 + const val BOLT_POUCH_9433 = 9433 + const val BOLT_MOULD_9434 = 9434 + const val BOLT_MOULD_9435 = 9435 + const val SINEW_9436 = 9436 + const val SINEW_9437 = 9437 + const val CROSSBOW_STRING_9438 = 9438 + const val CROSSBOW_STRING_9439 = 9439 + const val WOODEN_STOCK_9440 = 9440 + const val WOODEN_STOCK_9441 = 9441 + const val OAK_STOCK_9442 = 9442 + const val OAK_STOCK_9443 = 9443 + const val WILLOW_STOCK_9444 = 9444 + const val WILLOW_STOCK_9445 = 9445 + const val TEAK_STOCK_9446 = 9446 + const val TEAK_STOCK_9447 = 9447 + const val MAPLE_STOCK_9448 = 9448 + const val MAPLE_STOCK_9449 = 9449 + const val MAHOGANY_STOCK_9450 = 9450 + const val MAHOGANY_STOCK_9451 = 9451 + const val YEW_STOCK_9452 = 9452 + const val YEW_STOCK_9453 = 9453 + const val BRONZE_CBOW_U_9454 = 9454 + const val BRONZE_CBOW_U_9455 = 9455 + const val BLURITE_CBOW_U_9456 = 9456 + const val IRON_CBOW_U_9457 = 9457 + const val IRON_CBOW_U_9458 = 9458 + const val STEEL_CBOW_U_9459 = 9459 + const val STEEL_CBOW_U_9460 = 9460 + const val MITHRIL_CBOW_U_9461 = 9461 + const val MITHRIL_CBOW_U_9462 = 9462 + const val ADAMANT_CBOW_U_9463 = 9463 + const val ADAMANT_CBOW_U_9464 = 9464 + const val RUNITE_CBOW_U_9465 = 9465 + const val RUNITE_CBOW_U_9466 = 9466 + const val BLURITE_BAR_9467 = 9467 + const val SAWDUST_9468 = 9468 + const val GRAND_SEED_POD_9469 = 9469 + const val GNOME_SCARF_9470 = 9470 + const val GNOME_SCARF_9471 = 9471 + const val GNOME_GOGGLES_9472 = 9472 + const val GNOME_GOGGLES_9473 = 9473 + const val REWARD_TOKEN_9474 = 9474 + const val MINT_CAKE_9475 = 9475 + const val MINT_CAKE_9476 = 9476 + const val ALUFT_ALOFT_BOX_9477 = 9477 + const val HALF_MADE_BATTA_9478 = 9478 + const val UNFINISHED_BATTA_9479 = 9479 + const val HALF_MADE_BATTA_9480 = 9480 + const val UNFINISHED_BATTA_9481 = 9481 + const val HALF_MADE_BATTA_9482 = 9482 + const val HALF_MADE_BATTA_9483 = 9483 + const val UNFINISHED_BATTA_9484 = 9484 + const val HALF_MADE_BATTA_9485 = 9485 + const val UNFINISHED_BATTA_9486 = 9486 + const val WIZARD_BLIZZARD_9487 = 9487 + const val WIZARD_BLIZZARD_9488 = 9488 + const val WIZARD_BLIZZARD_9489 = 9489 + const val PICTURE_9490 = 9490 + const val NULL_9491 = 9491 + const val NULL_9492 = 9492 + const val NULL_9493 = 9493 + const val NULL_9494 = 9494 + const val NULL_9495 = 9495 + const val NULL_9496 = 9496 + const val NULL_9497 = 9497 + const val NULL_9498 = 9498 + const val NULL_9499 = 9499 + const val NULL_9500 = 9500 + const val NULL_9501 = 9501 + const val NULL_9502 = 9502 + const val NULL_9503 = 9503 + const val NULL_9504 = 9504 + const val NULL_9505 = 9505 + const val NULL_9506 = 9506 + const val NULL_9507 = 9507 + const val WIZARD_BLIZZARD_9508 = 9508 + const val WIZARD_BLIZZARD_9509 = 9509 + const val SHORT_GREEN_GUY_9510 = 9510 + const val SHORT_GREEN_GUY_9511 = 9511 + const val PINEAPPLE_PUNCH_9512 = 9512 + const val PINEAPPLE_PUNCH_9513 = 9513 + const val FRUIT_BLAST_9514 = 9514 + const val FRUIT_BLAST_9515 = 9515 + const val DRUNK_DRAGON_9516 = 9516 + const val DRUNK_DRAGON_9517 = 9517 + const val CHOC_SATURDAY_9518 = 9518 + const val CHOC_SATURDAY_9519 = 9519 + const val BLURBERRY_SPECIAL_9520 = 9520 + const val BLURBERRY_SPECIAL_9521 = 9521 + const val BATTA_TIN_9522 = 9522 + const val BATTA_TIN_9523 = 9523 + const val BATTA_TIN_9524 = 9524 + const val BATTA_TIN_9525 = 9525 + const val NULL_9526 = 9526 + const val FRUIT_BATTA_9527 = 9527 + const val FRUIT_BATTA_9528 = 9528 + const val TOAD_BATTA_9529 = 9529 + const val TOAD_BATTA_9530 = 9530 + const val WORM_BATTA_9531 = 9531 + const val WORM_BATTA_9532 = 9532 + const val VEGETABLE_BATTA_9533 = 9533 + const val VEGETABLE_BATTA_9534 = 9534 + const val CHEESE_PLUSTOM_BATTA_9535 = 9535 + const val CHEESE_PLUSTOM_BATTA_9536 = 9536 + const val NULL_9537 = 9537 + const val TOAD_CRUNCHIES_9538 = 9538 + const val TOAD_CRUNCHIES_9539 = 9539 + const val SPICY_CRUNCHIES_9540 = 9540 + const val SPICY_CRUNCHIES_9541 = 9541 + const val WORM_CRUNCHIES_9542 = 9542 + const val WORM_CRUNCHIES_9543 = 9543 + const val CHOCCHIP_CRUNCHIES_9544 = 9544 + const val CHOCCHIP_CRUNCHIES_9545 = 9545 + const val NULL_9546 = 9546 + const val WORM_HOLE_9547 = 9547 + const val WORM_HOLE_9548 = 9548 + const val VEG_BALL_9549 = 9549 + const val VEG_BALL_9550 = 9550 + const val TANGLED_TOADS_LEGS_9551 = 9551 + const val TANGLED_TOADS_LEGS_9552 = 9552 + const val CHOCOLATE_BOMB_9553 = 9553 + const val CHOCOLATE_BOMB_9554 = 9554 + const val NULL_9555 = 9555 + const val NULL_9556 = 9556 + const val NULL_9557 = 9557 + const val HALF_MADE_BOWL_9558 = 9558 + const val HALF_MADE_BOWL_9559 = 9559 + const val UNFINISHED_BOWL_9560 = 9560 + const val HALF_MADE_BOWL_9561 = 9561 + const val UNFINISHED_BOWL_9562 = 9562 + const val HALF_MADE_BOWL_9563 = 9563 + const val UNFINISHED_BOWL_9564 = 9564 + const val COCKTAIL_SHAKER_9565 = 9565 + const val MIXED_BLIZZARD_9566 = 9566 + const val MIXED_SGG_9567 = 9567 + const val MIXED_BLAST_9568 = 9568 + const val MIXED_PUNCH_9569 = 9569 + const val MIXED_BLURBERRY_SPECIAL_9570 = 9570 + const val MIXED_SATURDAY_9571 = 9571 + const val MIXED_SATURDAY_9572 = 9572 + const val MIXED_SATURDAY_9573 = 9573 + const val MIXED_DRAGON_9574 = 9574 + const val MIXED_DRAGON_9575 = 9575 + const val MIXED_DRAGON_9576 = 9576 + const val HALF_MADE_CRUNCHY_9577 = 9577 + const val UNFINISHED_CRUNCHY_9578 = 9578 + const val HALF_MADE_CRUNCHY_9579 = 9579 + const val UNFINISHED_CRUNCHY_9580 = 9580 + const val HALF_MADE_CRUNCHY_9581 = 9581 + const val UNFINISHED_CRUNCHY_9582 = 9582 + const val HALF_MADE_CRUNCHY_9583 = 9583 + const val UNFINISHED_CRUNCHY_9584 = 9584 + const val BATTA_TIN_9585 = 9585 + const val CRUNCHY_TRAY_9586 = 9586 + const val GNOMEBOWL_MOULD_9587 = 9587 + const val RAW_CRUNCHIES_9588 = 9588 + const val DOSSIER_9589 = 9589 + const val DOSSIER_9590 = 9590 + const val BROKEN_CAULDRON_9591 = 9591 + const val MAGIC_GLUE_9592 = 9592 + const val WEIRD_GLOOP_9593 = 9593 + const val GROUND_MUD_RUNES_9594 = 9594 + const val HAZELMERES_BOOK_9595 = 9595 + const val PICTURE_9596 = 9596 + const val RED_CIRCLE_9597 = 9597 + const val RED_TRIANGLE_9598 = 9598 + const val RED_SQUARE_9599 = 9599 + const val RED_PENTAGON_9600 = 9600 + const val ORANGE_CIRCLE_9601 = 9601 + const val ORANGE_TRIANGLE_9602 = 9602 + const val ORANGE_SQUARE_9603 = 9603 + const val ORANGE_PENTAGON_9604 = 9604 + const val YELLOW_CIRCLE_9605 = 9605 + const val YELLOW_TRIANGLE_9606 = 9606 + const val YELLOW_SQUARE_9607 = 9607 + const val YELLOW_PENTAGON_9608 = 9608 + const val GREEN_CIRCLE_9609 = 9609 + const val GREEN_TRIANGLE_9610 = 9610 + const val GREEN_SQUARE_9611 = 9611 + const val GREEN_PENTAGON_9612 = 9612 + const val BLUE_CIRCLE_9613 = 9613 + const val BLUE_TRIANGLE_9614 = 9614 + const val BLUE_SQUARE_9615 = 9615 + const val BLUE_PENTAGON_9616 = 9616 + const val INDIGO_CIRCLE_9617 = 9617 + const val INDIGO_TRIANGLE_9618 = 9618 + const val INDIGO_SQUARE_9619 = 9619 + const val INDIGO_PENTAGON_9620 = 9620 + const val VIOLET_CIRCLE_9621 = 9621 + const val VIOLET_TRIANGLE_9622 = 9622 + const val VIOLET_SQUARE_9623 = 9623 + const val VIOLET_PENTAGON_9624 = 9624 + const val CRYSTAL_SAW_9625 = 9625 + const val SMALL_CRYSTAL_SEED_9626 = 9626 + const val A_HANDWRITTEN_BOOK_9627 = 9627 + const val NULL_9628 = 9628 + const val TYRAS_HELM_9629 = 9629 + const val TYRAS_HELM_9630 = 9630 + const val NULL_9631 = 9631 + const val DAEYALT_ORE_9632 = 9632 + const val MESSAGE_9633 = 9633 + const val VYREWATCH_TOP_9634 = 9634 + const val VYREWATCH_TOP_9635 = 9635 + const val VYREWATCH_LEGS_9636 = 9636 + const val VYREWATCH_LEGS_9637 = 9637 + const val VYREWATCH_SHOES_9638 = 9638 + const val VYREWATCH_SHOES_9639 = 9639 + const val CITIZEN_TOP_9640 = 9640 + const val CITIZEN_TOP_9641 = 9641 + const val CITIZEN_TROUSERS_9642 = 9642 + const val CITIZEN_TROUSERS_9643 = 9643 + const val CITIZEN_SHOES_9644 = 9644 + const val CITIZEN_SHOES_9645 = 9645 + const val CASTLE_SKETCH_1_9646 = 9646 + const val CASTLE_SKETCH_2_9647 = 9647 + const val CASTLE_SKETCH_3_9648 = 9648 + const val MESSAGE_9649 = 9649 + const val BLOOD_TITHE_POUCH_9650 = 9650 + const val LARGE_ORNATE_KEY_9651 = 9651 + const val HAEMALCHEMY_9652 = 9652 + const val SEALED_MESSAGE_9653 = 9653 + const val DOOR_KEY_9654 = 9654 + const val LADDER_TOP_9655 = 9655 + const val TOME_OF_XP_3_9656 = 9656 + const val TOME_OF_XP_2_9657 = 9657 + const val TOME_OF_XP_1_9658 = 9658 + const val BUCKET_OF_WATER_9659 = 9659 + const val BUCKET_9660 = 9660 + const val NULL_9661 = 9661 + const val SHORTCUT_KEY_9662 = 9662 + const val NULL_9663 = 9663 + const val NULL_9664 = 9664 + const val TORCH_9665 = 9665 + const val PROSYTE_HARNESS_M_9666 = 9666 + const val PROSYTE_HARNESS_M_9667 = 9667 + const val INITIATE_HARNESS_M_9668 = 9668 + const val INITIATE_HARNESS_M_9669 = 9669 + const val PROSYTE_HARNESS_F_9670 = 9670 + const val PROSYTE_HARNESS_F_9671 = 9671 + const val PROSELYTE_SALLET_9672 = 9672 + const val PROSELYTE_SALLET_9673 = 9673 + const val PROSELYTE_HAUBERK_9674 = 9674 + const val PROSELYTE_HAUBERK_9675 = 9675 + const val PROSELYTE_CUISSE_9676 = 9676 + const val PROSELYTE_CUISSE_9677 = 9677 + const val PROSELYTE_TASSET_9678 = 9678 + const val PROSELYTE_TASSET_9679 = 9679 + const val SEA_SLUG_GLUE_9680 = 9680 + const val COMMORB_V2_9681 = 9681 + const val DOOR_TRANSCRIPTION_9682 = 9682 + const val DEAD_SEA_SLUG_9683 = 9683 + const val PAGE_1_9684 = 9684 + const val PAGE_2_9685 = 9685 + const val PAGE_3_9686 = 9686 + const val FRAGMENT_1_9687 = 9687 + const val FRAGMENT_2_9688 = 9688 + const val FRAGMENT_3_9689 = 9689 + const val BLANK_WATER_RUNE_9690 = 9690 + const val WATER_RUNE_9691 = 9691 + const val BLANK_AIR_RUNE_9692 = 9692 + const val AIR_RUNE_9693 = 9693 + const val BLANK_EARTH_RUNE_9694 = 9694 + const val EARTH_RUNE_9695 = 9695 + const val BLANK_MIND_RUNE_9696 = 9696 + const val MIND_RUNE_9697 = 9697 + const val BLANK_FIRE_RUNE_9698 = 9698 + const val FIRE_RUNE_9699 = 9699 + const val PICTURE_9700 = 9700 + const val TORCH_9701 = 9701 + const val STICK_9702 = 9702 + const val TRAINING_SWORD_9703 = 9703 + const val TRAINING_SHIELD_9704 = 9704 + const val TRAINING_BOW_9705 = 9705 + const val TRAINING_ARROWS_9706 = 9706 + const val NULL_9707 = 9707 + const val NULL_9708 = 9708 + const val NULL_9709 = 9709 + const val NULL_9710 = 9710 + const val NULL_9711 = 9711 + const val NULL_9712 = 9712 + const val NULL_9713 = 9713 + const val NULL_9714 = 9714 + const val SLASHED_BOOK_9715 = 9715 + const val ROCK_9716 = 9716 + const val BEATEN_BOOK_9717 = 9717 + const val CRANE_SCHEMATIC_9718 = 9718 + const val LEVER_SCHEMATIC_9719 = 9719 + const val CRANE_CLAW_9720 = 9720 + const val SCROLL_9721 = 9721 + const val KEY_9722 = 9722 + const val PIPE_9723 = 9723 + const val LARGE_COG_9724 = 9724 + const val MEDIUM_COG_9725 = 9725 + const val SMALL_COG_9726 = 9726 + const val PRIMED_BAR_9727 = 9727 + const val ELEMENTAL_MIND_BAR_9728 = 9728 + const val ELEMENTAL_HELMET_9729 = 9729 + const val ELEMENTAL_HELMET_9730 = 9730 + const val MIND_SHIELD_9731 = 9731 + const val MIND_SHIELD_9732 = 9732 + const val MIND_HELMET_9733 = 9733 + const val MIND_HELMET_9734 = 9734 + const val DESERT_GOAT_HORN_9735 = 9735 + const val GOAT_HORN_DUST_9736 = 9736 + const val GOAT_HORN_DUST_9737 = 9737 + const val DESERT_GOAT_HORN_9738 = 9738 + const val COMBAT_POTION4_9739 = 9739 + const val COMBAT_POTION4_9740 = 9740 + const val COMBAT_POTION3_9741 = 9741 + const val COMBAT_POTION3_9742 = 9742 + const val COMBAT_POTION2_9743 = 9743 + const val COMBAT_POTION2_9744 = 9744 + const val COMBAT_POTION1_9745 = 9745 + const val COMBAT_POTION1_9746 = 9746 + const val ATTACK_CAPE_9747 = 9747 + const val ATTACK_CAPET_9748 = 9748 + const val ATTACK_HOOD_9749 = 9749 + const val STRENGTH_CAPE_9750 = 9750 + const val STRENGTH_CAPET_9751 = 9751 + const val STRENGTH_HOOD_9752 = 9752 + const val DEFENCE_CAPE_9753 = 9753 + const val DEFENCE_CAPET_9754 = 9754 + const val DEFENCE_HOOD_9755 = 9755 + const val RANGING_CAPE_9756 = 9756 + const val RANGING_CAPET_9757 = 9757 + const val RANGING_HOOD_9758 = 9758 + const val PRAYER_CAPE_9759 = 9759 + const val PRAYER_CAPET_9760 = 9760 + const val PRAYER_HOOD_9761 = 9761 + const val MAGIC_CAPE_9762 = 9762 + const val MAGIC_CAPET_9763 = 9763 + const val MAGIC_HOOD_9764 = 9764 + const val RUNECRAFT_CAPE_9765 = 9765 + const val RUNECRAFT_CAPET_9766 = 9766 + const val RUNECRAFTING_HOOD_9767 = 9767 + const val HITPOINTS_CAPE_9768 = 9768 + const val HITPOINTS_CAPET_9769 = 9769 + const val HITPOINTS_HOOD_9770 = 9770 + const val AGILITY_CAPE_9771 = 9771 + const val AGILITY_CAPET_9772 = 9772 + const val AGILITY_HOOD_9773 = 9773 + const val HERBLORE_CAPE_9774 = 9774 + const val HERBLORE_CAPET_9775 = 9775 + const val HERBLORE_HOOD_9776 = 9776 + const val THIEVING_CAPE_9777 = 9777 + const val THIEVING_CAPET_9778 = 9778 + const val THIEVING_HOOD_9779 = 9779 + const val CRAFTING_CAPE_9780 = 9780 + const val CRAFTING_CAPET_9781 = 9781 + const val CRAFTING_HOOD_9782 = 9782 + const val FLETCHING_CAPE_9783 = 9783 + const val FLETCHING_CAPET_9784 = 9784 + const val FLETCHING_HOOD_9785 = 9785 + const val SLAYER_CAPE_9786 = 9786 + const val SLAYER_CAPET_9787 = 9787 + const val SLAYER_HOOD_9788 = 9788 + const val CONSTRUCT_CAPE_9789 = 9789 + const val CONSTRUCT_CAPET_9790 = 9790 + const val CONSTRUCT_HOOD_9791 = 9791 + const val MINING_CAPE_9792 = 9792 + const val MINING_CAPET_9793 = 9793 + const val MINING_HOOD_9794 = 9794 + const val SMITHING_CAPE_9795 = 9795 + const val SMITHING_CAPET_9796 = 9796 + const val SMITHING_HOOD_9797 = 9797 + const val FISHING_CAPE_9798 = 9798 + const val FISHING_CAPET_9799 = 9799 + const val FISHING_HOOD_9800 = 9800 + const val COOKING_CAPE_9801 = 9801 + const val COOKING_CAPET_9802 = 9802 + const val COOKING_HOOD_9803 = 9803 + const val FIREMAKING_CAPE_9804 = 9804 + const val FIREMAKING_CAPET_9805 = 9805 + const val FIREMAKING_HOOD_9806 = 9806 + const val WOODCUTTING_CAPE_9807 = 9807 + const val WOODCUT_CAPET_9808 = 9808 + const val WOODCUTTING_HOOD_9809 = 9809 + const val FARMING_CAPE_9810 = 9810 + const val FARMING_CAPET_9811 = 9811 + const val FARMING_HOOD_9812 = 9812 + const val QUEST_POINT_CAPE_9813 = 9813 + const val QUEST_POINT_HOOD_9814 = 9814 + const val BOBBLE_HAT_9815 = 9815 + const val BOBBLE_SCARF_9816 = 9816 + const val OAK_CAPE_RACK_9817 = 9817 + const val TEAK_CAPE_RACK_9818 = 9818 + const val MGANY_CAPE_RACK_9819 = 9819 + const val GILDED_CAPE_RACK_9820 = 9820 + const val MARBLE_CAPE_RACK_9821 = 9821 + const val MAGICAL_CAPE_RACK_9822 = 9822 + const val OAK_COSTUME_BOX_9823 = 9823 + const val TEAK_COSTUME_BOX_9824 = 9824 + const val MAHOGANY_COS_BOX_9825 = 9825 + const val OAK_ARMOUR_CASE_9826 = 9826 + const val TEAK_ARMOUR_CASE_9827 = 9827 + const val MGANY_ARMR_CASE_9828 = 9828 + const val OAK_MAGIC_WARDROBE_9829 = 9829 + const val CARVED_OAK_MAGIC_WARDROBE_9830 = 9830 + const val TEAK_MAGIC_WARDROBE_9831 = 9831 + const val CARVED_TEAK_MAGIC_WARDROBE_9832 = 9832 + const val MAHOGANY_MAGIC_WARDROBE_9833 = 9833 + const val GILDED_MAGIC_WARDROBE_9834 = 9834 + const val MARBLE_MAGIC_WARDROBE_9835 = 9835 + const val OAK_TOY_BOX_9836 = 9836 + const val TEAK_TOY_BOX_9837 = 9837 + const val MAHOGANY_TOY_BOX_9838 = 9838 + const val OAK_TREASURE_CHEST_9839 = 9839 + const val TEAK_TREAS_CHEST_9840 = 9840 + const val MGANY_TREAS_CHEST_9841 = 9841 + const val COSTUME_ROOM_9842 = 9842 + const val OAK_CAPE_RACK_9843 = 9843 + const val TEAK_CAPE_RACK_9844 = 9844 + const val MGANY_CAPE_RACK_9845 = 9845 + const val GILDED_CAPE_RACK_9846 = 9846 + const val MARBLE_CAPE_RACK_9847 = 9847 + const val MAGICAL_CAPE_RACK_9848 = 9848 + const val OAK_TOY_BOX_9849 = 9849 + const val TEAK_TOY_BOX_9850 = 9850 + const val MAHOGANY_TOY_BOX_9851 = 9851 + const val OAK_MAGIC_WARDROBE_9852 = 9852 + const val CARVED_OAK_MAGIC_WARDROBE_9853 = 9853 + const val TEAK_MAGIC_WARDROBE_9854 = 9854 + const val CARVED_TEAK_MAGIC_WARDROBE_9855 = 9855 + const val MAHOGANY_MAGIC_WARDROBE_9856 = 9856 + const val GILDED_MAGIC_WARDROBE_9857 = 9857 + const val MARBLE_MAGIC_WARDROBE_9858 = 9858 + const val OAK_ARMOUR_CASE_9859 = 9859 + const val TEAK_ARMOUR_CASE_9860 = 9860 + const val MGANY_ARMR_CASE_9861 = 9861 + const val OAK_TREASURE_CHEST_9862 = 9862 + const val TEAK_TREAS_CHEST_9863 = 9863 + const val MGANY_TREAS_CHEST_9864 = 9864 + const val OAK_COSTUME_BOX_9865 = 9865 + const val TEAK_COSTUME_BOX_9866 = 9866 + const val MAHOGANY_COS_BOX_9867 = 9867 + const val OAK_CAPE_RACK_9868 = 9868 + const val TEAK_CAPE_RACK_9869 = 9869 + const val MGANY_CAPE_RACK_9870 = 9870 + const val GILDED_CAPE_RACK_9871 = 9871 + const val MARBLE_CAPE_RACK_9872 = 9872 + const val MAGICAL_CAPE_RACK_9873 = 9873 + const val OAK_TOY_BOX_9874 = 9874 + const val TEAK_TOY_BOX_9875 = 9875 + const val MAHOGANY_TOY_BOX_9876 = 9876 + const val OAK_MAGIC_WARDROBE_9877 = 9877 + const val CARVED_OAK_MAGIC_WARDROBE_9878 = 9878 + const val TEAK_MAGIC_WARDROBE_9879 = 9879 + const val CARVED_TEAK_MAGIC_WARDROBE_9880 = 9880 + const val MAHOGANY_MAGIC_WARDROBE_9881 = 9881 + const val GILDED_MAGIC_WARDROBE_9882 = 9882 + const val MARBLE_MAGIC_WARDROBE_9883 = 9883 + const val OAK_ARMOUR_CASE_9884 = 9884 + const val TEAK_ARMOUR_CASE_9885 = 9885 + const val MGANY_ARMR_CASE_9886 = 9886 + const val OAK_TREASURE_CHEST_9887 = 9887 + const val TEAK_TREAS_CHEST_9888 = 9888 + const val MGANY_TREAS_CHEST_9889 = 9889 + const val OAK_COSTUME_BOX_9890 = 9890 + const val TEAK_COSTUME_BOX_9891 = 9891 + const val MAHOGANY_COS_BOX_9892 = 9892 + const val NULL_9893 = 9893 + const val NULL_9894 = 9894 + const val NULL_9895 = 9895 + const val NULL_9896 = 9896 + const val NULL_9897 = 9897 + const val NULL_9898 = 9898 + const val NULL_9899 = 9899 + const val NULL_9900 = 9900 + const val GOUTWEEDY_LUMP_9901 = 9901 + const val HARDY_GOUT_TUBERS_9902 = 9902 + const val FARMING_MANUAL_9903 = 9903 + const val SAILING_BOOK_9904 = 9904 + const val NULL_9905 = 9905 + const val GHOST_BUSTER_500_9906 = 9906 + const val GHOST_BUSTER_500_9907 = 9907 + const val GHOST_BUSTER_500_9908 = 9908 + const val GHOST_BUSTER_500_9909 = 9909 + const val GHOST_BUSTER_500_9910 = 9910 + const val GHOST_BUSTER_500_9911 = 9911 + const val GHOST_BUSTER_500_9912 = 9912 + const val WHITE_DESTABILISER_9913 = 9913 + const val RED_DESTABILISER_9914 = 9914 + const val BLUE_DESTABILISER_9915 = 9915 + const val GREEN_DESTABILISER_9916 = 9916 + const val YELLOW_DESTABILISER_9917 = 9917 + const val BLACK_DESTABILISER_9918 = 9918 + const val EVIL_ROOT_9919 = 9919 + const val JACK_LANTERN_MASK_9920 = 9920 + const val SKELETON_BOOTS_9921 = 9921 + const val SKELETON_GLOVES_9922 = 9922 + const val SKELETON_LEGGINGS_9923 = 9923 + const val SKELETON_SHIRT_9924 = 9924 + const val SKELETON_MASK_9925 = 9925 + const val NULL_9926 = 9926 + const val NULL_9927 = 9927 + const val NULL_9928 = 9928 + const val NULL_9929 = 9929 + const val NULL_9930 = 9930 + const val NULL_9931 = 9931 + const val AUGUSTES_SAPLING_9932 = 9932 + const val BALLOON_STRUCTURE_9933 = 9933 + const val ORIGAMI_BALLOON_9934 = 9934 + const val YELLOW_BALLOON_9935 = 9935 + const val BLUE_BALLOON_9936 = 9936 + const val RED_BALLOON_9937 = 9937 + const val ORANGE_BALLOON_9938 = 9938 + const val GREEN_BALLOON_9939 = 9939 + const val PURPLE_BALLOON_9940 = 9940 + const val PINK_BALLOON_9941 = 9941 + const val BLACK_BALLOON_9942 = 9942 + const val SANDBAG_9943 = 9943 + const val BOMBER_JACKET_9944 = 9944 + const val BOMBER_CAP_9945 = 9945 + const val CAP_AND_GOGGLES_9946 = 9946 + const val OLD_RED_DISK_9947 = 9947 + const val HUNTER_CAPE_9948 = 9948 + const val HUNTER_CAPET_9949 = 9949 + const val HUNTER_HOOD_9950 = 9950 + const val FOOTPRINT_9951 = 9951 + const val IMP_9952 = 9952 + const val KEBBIT_9953 = 9953 + const val KEBBIT_9954 = 9954 + const val KEBBIT_9955 = 9955 + const val KEBBIT_9956 = 9956 + const val KEBBIT_9957 = 9957 + const val KEBBIT_9958 = 9958 + const val KEBBIT_9959 = 9959 + const val KEBBIT_9960 = 9960 + const val KEBBIT_9961 = 9961 + const val KEBBIT_9962 = 9962 + const val KEBBIT_9963 = 9963 + const val KEBBIT_9964 = 9964 + const val CRIMSON_SWIFT_9965 = 9965 + const val COPPER_LONGTAIL_9966 = 9966 + const val CERULEAN_TWITCH_9967 = 9967 + const val GOLDEN_WARBLER_9968 = 9968 + const val TROPICAL_WAGTAIL_9969 = 9969 + const val BUTTERFLY_9970 = 9970 + const val BUTTERFLY_9971 = 9971 + const val BUTTERFLY_9972 = 9972 + const val BUTTERFLY_9973 = 9973 + const val GIANT_EAGLE_9974 = 9974 + const val RABBIT_9975 = 9975 + const val CHINCHOMPA_9976 = 9976 + const val RED_CHINCHOMPA_9977 = 9977 + const val RAW_BIRD_MEAT_9978 = 9978 + const val RAW_BIRD_MEAT_9979 = 9979 + const val ROAST_BIRD_MEAT_9980 = 9980 + const val ROAST_BIRD_MEAT_9981 = 9981 + const val BURNT_BIRD_MEAT_9982 = 9982 + const val BURNT_BIRD_MEAT_9983 = 9983 + const val SKEWERED_BIRD_MEAT_9984 = 9984 + const val SKEWERED_BIRD_MEAT_9985 = 9985 + const val RAW_BEAST_MEAT_9986 = 9986 + const val RAW_BEAST_MEAT_9987 = 9987 + const val ROAST_BEAST_MEAT_9988 = 9988 + const val ROAST_BEAST_MEAT_9989 = 9989 + const val BURNT_BEAST_MEAT_9990 = 9990 + const val BURNT_BEAST_MEAT_9991 = 9991 + const val SKEWERED_BEAST_9992 = 9992 + const val SKEWERED_BEAST_9993 = 9993 + const val SPICY_TOMATO_9994 = 9994 + const val SPICY_TOMATO_9995 = 9995 + const val SPICY_MINCED_MEAT_9996 = 9996 + const val SPICY_MINCED_MEAT_9997 = 9997 + const val HUNTER_POTION4_9998 = 9998 + const val HUNTER_POTION4_9999 = 9999 + const val HUNTER_POTION3_10000 = 10000 + const val HUNTER_POTION3_10001 = 10001 + const val HUNTER_POTION2_10002 = 10002 + const val HUNTER_POTION2_10003 = 10003 + const val HUNTER_POTION1_10004 = 10004 + const val HUNTER_POTION1_10005 = 10005 + const val BIRD_SNARE_10006 = 10006 + const val BIRD_SNARE_10007 = 10007 + const val BOX_TRAP_10008 = 10008 + const val BOX_TRAP_10009 = 10009 + const val BUTTERFLY_NET_10010 = 10010 + const val BUTTERFLY_NET_10011 = 10011 + const val BUTTERFLY_JAR_10012 = 10012 + const val BUTTERFLY_JAR_10013 = 10013 + const val BLACK_WARLOCK_10014 = 10014 + const val BLACK_WARLOCK_10015 = 10015 + const val SNOWY_KNIGHT_10016 = 10016 + const val SNOWY_KNIGHT_10017 = 10017 + const val SAPPHIRE_GLACIALIS_10018 = 10018 + const val SAPPHIRE_GLACIALIS_10019 = 10019 + const val RUBY_HARVEST_10020 = 10020 + const val RUBY_HARVEST_10021 = 10021 + const val NULL_10022 = 10022 + const val FALCONERS_GLOVE_10023 = 10023 + const val FALCONERS_GLOVE_10024 = 10024 + const val MAGIC_BOX_10025 = 10025 + const val MAGIC_BOX_10026 = 10026 + const val IMP_IN_A_BOX2_10027 = 10027 + const val IMP_IN_A_BOX1_10028 = 10028 + const val TEASING_STICK_10029 = 10029 + const val TEASING_STICK_10030 = 10030 + const val RABBIT_SNARE_10031 = 10031 + const val RABBIT_SNARE_10032 = 10032 + const val CHINCHOMPA_10033 = 10033 + const val RED_CHINCHOMPA_10034 = 10034 + const val KYATT_LEGS_10035 = 10035 + const val KYATT_LEGS_10036 = 10036 + const val KYATT_TOP_10037 = 10037 + const val KYATT_TOP_10038 = 10038 + const val KYATT_HAT_10039 = 10039 + const val KYATT_HAT_10040 = 10040 + const val LARUPIA_LEGS_10041 = 10041 + const val LARUPIA_LEGS_10042 = 10042 + const val LARUPIA_TOP_10043 = 10043 + const val LARUPIA_TOP_10044 = 10044 + const val LARUPIA_HAT_10045 = 10045 + const val LARUPIA_HAT_10046 = 10046 + const val GRAAHK_LEGS_10047 = 10047 + const val GRAAHK_LEGS_10048 = 10048 + const val GRAAHK_TOP_10049 = 10049 + const val GRAAHK_TOP_10050 = 10050 + const val GRAAHK_HEADDRESS_10051 = 10051 + const val GRAAHK_HEADDRESS_10052 = 10052 + const val WOOD_CAMO_TOP_10053 = 10053 + const val WOOD_CAMO_TOP_10054 = 10054 + const val WOOD_CAMO_LEGS_10055 = 10055 + const val WOOD_CAMO_LEGS_10056 = 10056 + const val JUNGLE_CAMO_TOP_10057 = 10057 + const val JUNGLE_CAMO_TOP_10058 = 10058 + const val JUNGLE_CAMO_LEGS_10059 = 10059 + const val JUNGLE_CAMO_LEGS_10060 = 10060 + const val DESERT_CAMO_TOP_10061 = 10061 + const val DESERT_CAMO_TOP_10062 = 10062 + const val DESERT_CAMO_LEGS_10063 = 10063 + const val DESERT_CAMO_LEGS_10064 = 10064 + const val POLAR_CAMO_TOP_10065 = 10065 + const val POLAR_CAMO_TOP_10066 = 10066 + const val POLAR_CAMO_LEGS_10067 = 10067 + const val POLAR_CAMO_LEGS_10068 = 10068 + const val SPOTTED_CAPE_10069 = 10069 + const val SPOTTED_CAPE_10070 = 10070 + const val SPOTTIER_CAPE_10071 = 10071 + const val SPOTTIER_CAPE_10072 = 10072 + const val SPOTTED_CAPE_10073 = 10073 + const val SPOTTIER_CAPE_10074 = 10074 + const val GLOVES_OF_SILENCE_10075 = 10075 + const val GLOVES_OF_SILENCE_10076 = 10076 + const val SPIKY_VAMBRACES_10077 = 10077 + const val SPIKY_VAMBRACES_10078 = 10078 + const val GREEN_SPIKY_VAMBS_10079 = 10079 + const val GREEN_SPIKY_VAMBS_10080 = 10080 + const val BLUE_SPIKY_VAMBS_10081 = 10081 + const val BLUE_SPIKY_VAMBS_10082 = 10082 + const val RED_SPIKY_VAMBS_10083 = 10083 + const val RED_SPIKY_VAMBS_10084 = 10084 + const val BLACK_SPIKY_VAMBS_10085 = 10085 + const val BLACK_SPIKY_VAMBS_10086 = 10086 + const val STRIPY_FEATHER_10087 = 10087 + const val RED_FEATHER_10088 = 10088 + const val BLUE_FEATHER_10089 = 10089 + const val YELLOW_FEATHER_10090 = 10090 + const val ORANGE_FEATHER_10091 = 10091 + const val FERRET_10092 = 10092 + const val TATTY_LARUPIA_FUR_10093 = 10093 + const val TATTY_LARUPIA_FUR_10094 = 10094 + const val LARUPIA_FUR_10095 = 10095 + const val LARUPIA_FUR_10096 = 10096 + const val TATTY_GRAAHK_FUR_10097 = 10097 + const val TATTY_GRAAHK_FUR_10098 = 10098 + const val GRAAHK_FUR_10099 = 10099 + const val GRAAHK_FUR_10100 = 10100 + const val TATTY_KYATT_FUR_10101 = 10101 + const val TATTY_KYATT_FUR_10102 = 10102 + const val KYATT_FUR_10103 = 10103 + const val KYATT_FUR_10104 = 10104 + const val KEBBIT_SPIKE_10105 = 10105 + const val KEBBIT_SPIKE_10106 = 10106 + const val LONG_KEBBIT_SPIKE_10107 = 10107 + const val LONG_KEBBIT_SPIKE_10108 = 10108 + const val KEBBIT_TEETH_10109 = 10109 + const val KEBBIT_TEETH_10110 = 10110 + const val KEBBIT_TEETH_DUST_10111 = 10111 + const val KEBBIT_TEETH_DUST_10112 = 10112 + const val KEBBIT_CLAWS_10113 = 10113 + const val KEBBIT_CLAWS_10114 = 10114 + const val DARK_KEBBIT_FUR_10115 = 10115 + const val DARK_KEBBIT_FUR_10116 = 10116 + const val POLAR_KEBBIT_FUR_10117 = 10117 + const val POLAR_KEBBIT_FUR_10118 = 10118 + const val FELDIP_WEASEL_FUR_10119 = 10119 + const val FELDIP_WEASEL_FUR_10120 = 10120 + const val COMMON_KEBBIT_FUR_10121 = 10121 + const val COMMON_KEBBIT_FUR_10122 = 10122 + const val DESERT_DEVIL_FUR_10123 = 10123 + const val DESERT_DEVIL_FUR_10124 = 10124 + const val SPOTTED_KEBBIT_FUR_10125 = 10125 + const val SPOTTED_KEBBIT_FUR_10126 = 10126 + const val DASHING_KEBBIT_FUR_10127 = 10127 + const val DASHING_KEBBIT_FUR_10128 = 10128 + const val BARB_TAIL_HARPOON_10129 = 10129 + const val BARB_TAIL_HARPOON_10130 = 10130 + const val NULL_10131 = 10131 + const val STRUNG_RABBIT_FOOT_10132 = 10132 + const val STRUNG_RABBIT_FOOT_10133 = 10133 + const val RABBIT_FOOT_10134 = 10134 + const val RABBIT_FOOT_10135 = 10135 + const val RAINBOW_FISH_10136 = 10136 + const val RAINBOW_FISH_10137 = 10137 + const val RAW_RAINBOW_FISH_10138 = 10138 + const val RAW_RAINBOW_FISH_10139 = 10139 + const val BURNT_RAINBOW_FISH_10140 = 10140 + const val BURNT_RAINBOW_FISH_10141 = 10141 + const val GUAM_TAR_10142 = 10142 + const val MARRENTILL_TAR_10143 = 10143 + const val TARROMIN_TAR_10144 = 10144 + const val HARRALANDER_TAR_10145 = 10145 + const val ORANGE_SALAMANDER_10146 = 10146 + const val RED_SALAMANDER_10147 = 10147 + const val BLACK_SALAMANDER_10148 = 10148 + const val SWAMP_LIZARD_10149 = 10149 + const val NOOSE_WAND_10150 = 10150 + const val NOOSE_WAND_10151 = 10151 + const val NULL_10152 = 10152 + const val NULL_10153 = 10153 + const val NULL_10154 = 10154 + const val NULL_10155 = 10155 + const val HUNTERS_CROSSBOW_10156 = 10156 + const val HUNTERS_CROSSBOW_10157 = 10157 + const val KEBBIT_BOLTS_10158 = 10158 + const val LONG_KEBBIT_BOLTS_10159 = 10159 + const val ORANGE_SALAMANDER_10160 = 10160 + const val RED_SALAMANDER_10161 = 10161 + const val BLACK_SALAMANDER_10162 = 10162 + const val SWAMP_LIZARD_10163 = 10163 + const val NULL_10164 = 10164 + const val MORE_10165 = 10165 + const val BACK_10166 = 10166 + const val EAGLE_FEATHER_10167 = 10167 + const val NULL_10168 = 10168 + const val NULL_10169 = 10169 + const val NULL_10170 = 10170 + const val EAGLE_CAPE_10171 = 10171 + const val FAKE_BEAK_10172 = 10172 + const val BIRD_BOOK_10173 = 10173 + const val METAL_FEATHER_10174 = 10174 + const val GOLDEN_FEATHER_10175 = 10175 + const val SILVER_FEATHER_10176 = 10176 + const val BRONZE_FEATHER_10177 = 10177 + const val ODD_BIRD_SEED_10178 = 10178 + const val FEATHERED_JOURNAL_10179 = 10179 + const val CLUE_SCROLL_10180 = 10180 + const val CASKET_10181 = 10181 + const val CLUE_SCROLL_10182 = 10182 + const val CASKET_10183 = 10183 + const val CLUE_SCROLL_10184 = 10184 + const val CASKET_10185 = 10185 + const val CLUE_SCROLL_10186 = 10186 + const val CASKET_10187 = 10187 + const val CLUE_SCROLL_10188 = 10188 + const val CASKET_10189 = 10189 + const val CLUE_SCROLL_10190 = 10190 + const val CASKET_10191 = 10191 + const val CLUE_SCROLL_10192 = 10192 + const val CASKET_10193 = 10193 + const val CLUE_SCROLL_10194 = 10194 + const val CASKET_10195 = 10195 + const val CLUE_SCROLL_10196 = 10196 + const val CASKET_10197 = 10197 + const val CLUE_SCROLL_10198 = 10198 + const val CASKET_10199 = 10199 + const val CLUE_SCROLL_10200 = 10200 + const val CASKET_10201 = 10201 + const val CLUE_SCROLL_10202 = 10202 + const val CASKET_10203 = 10203 + const val CLUE_SCROLL_10204 = 10204 + const val CASKET_10205 = 10205 + const val CLUE_SCROLL_10206 = 10206 + const val CASKET_10207 = 10207 + const val CLUE_SCROLL_10208 = 10208 + const val CASKET_10209 = 10209 + const val CLUE_SCROLL_10210 = 10210 + const val CASKET_10211 = 10211 + const val CLUE_SCROLL_10212 = 10212 + const val CASKET_10213 = 10213 + const val CLUE_SCROLL_10214 = 10214 + const val CASKET_10215 = 10215 + const val CLUE_SCROLL_10216 = 10216 + const val CASKET_10217 = 10217 + const val CLUE_SCROLL_10218 = 10218 + const val CASKET_10219 = 10219 + const val CLUE_SCROLL_10220 = 10220 + const val CASKET_10221 = 10221 + const val CLUE_SCROLL_10222 = 10222 + const val CASKET_10223 = 10223 + const val CLUE_SCROLL_10224 = 10224 + const val CASKET_10225 = 10225 + const val CLUE_SCROLL_10226 = 10226 + const val CASKET_10227 = 10227 + const val CLUE_SCROLL_10228 = 10228 + const val CASKET_10229 = 10229 + const val CLUE_SCROLL_10230 = 10230 + const val CASKET_10231 = 10231 + const val CLUE_SCROLL_10232 = 10232 + const val CASKET_10233 = 10233 + const val CLUE_SCROLL_10234 = 10234 + const val CASKET_10235 = 10235 + const val CLUE_SCROLL_10236 = 10236 + const val CASKET_10237 = 10237 + const val CLUE_SCROLL_10238 = 10238 + const val CASKET_10239 = 10239 + const val CLUE_SCROLL_10240 = 10240 + const val CASKET_10241 = 10241 + const val CLUE_SCROLL_10242 = 10242 + const val CASKET_10243 = 10243 + const val CLUE_SCROLL_10244 = 10244 + const val CASKET_10245 = 10245 + const val CLUE_SCROLL_10246 = 10246 + const val CASKET_10247 = 10247 + const val CLUE_SCROLL_10248 = 10248 + const val CASKET_10249 = 10249 + const val CLUE_SCROLL_10250 = 10250 + const val CASKET_10251 = 10251 + const val CLUE_SCROLL_10252 = 10252 + const val CASKET_10253 = 10253 + const val CLUE_SCROLL_10254 = 10254 + const val CASKET_10255 = 10255 + const val CLUE_SCROLL_10256 = 10256 + const val CASKET_10257 = 10257 + const val CLUE_SCROLL_10258 = 10258 + const val CASKET_10259 = 10259 + const val CLUE_SCROLL_10260 = 10260 + const val CASKET_10261 = 10261 + const val CLUE_SCROLL_10262 = 10262 + const val CASKET_10263 = 10263 + const val CLUE_SCROLL_10264 = 10264 + const val CASKET_10265 = 10265 + const val CLUE_SCROLL_10266 = 10266 + const val CASKET_10267 = 10267 + const val CLUE_SCROLL_10268 = 10268 + const val CASKET_10269 = 10269 + const val CLUE_SCROLL_10270 = 10270 + const val CASKET_10271 = 10271 + const val CLUE_SCROLL_10272 = 10272 + const val CASKET_10273 = 10273 + const val CLUE_SCROLL_10274 = 10274 + const val CASKET_10275 = 10275 + const val CLUE_SCROLL_10276 = 10276 + const val CASKET_10277 = 10277 + const val CLUE_SCROLL_10278 = 10278 + const val CASKET_10279 = 10279 + const val WILLOW_COMP_BOW_10280 = 10280 + const val WILLOW_COMP_BOW_10281 = 10281 + const val YEW_COMP_BOW_10282 = 10282 + const val YEW_COMP_BOW_10283 = 10283 + const val MAGIC_COMP_BOW_10284 = 10284 + const val MAGIC_COMP_BOW_10285 = 10285 + const val RUNE_HELM_H1_10286 = 10286 + const val RUNE_HELM_H1_10287 = 10287 + const val RUNE_HELM_H2_10288 = 10288 + const val RUNE_HELM_H2_10289 = 10289 + const val RUNE_HELM_H3_10290 = 10290 + const val RUNE_HELM_H3_10291 = 10291 + const val RUNE_HELM_H4_10292 = 10292 + const val RUNE_HELM_H4_10293 = 10293 + const val RUNE_HELM_H5_10294 = 10294 + const val RUNE_HELM_H5_10295 = 10295 + const val ADAMANT_HELM_H1_10296 = 10296 + const val ADAMANT_HELM_H1_10297 = 10297 + const val ADAMANT_HELM_H2_10298 = 10298 + const val ADAMANT_HELM_H2_10299 = 10299 + const val ADAMANT_HELM_H3_10300 = 10300 + const val ADAMANT_HELM_H3_10301 = 10301 + const val ADAMANT_HELM_H4_10302 = 10302 + const val ADAMANT_HELM_H4_10303 = 10303 + const val ADAMANT_HELM_H5_10304 = 10304 + const val ADAMANT_HELM_H5_10305 = 10305 + const val BLACK_HELM_H1_10306 = 10306 + const val BLACK_HELM_H1_10307 = 10307 + const val BLACK_HELM_H2_10308 = 10308 + const val BLACK_HELM_H2_10309 = 10309 + const val BLACK_HELM_H3_10310 = 10310 + const val BLACK_HELM_H3_10311 = 10311 + const val BLACK_HELM_H4_10312 = 10312 + const val BLACK_HELM_H4_10313 = 10313 + const val BLACK_HELM_H5_10314 = 10314 + const val BLACK_HELM_H5_10315 = 10315 + const val BOB_SHIRT_10316 = 10316 + const val BOB_SHIRT_10317 = 10317 + const val BOB_SHIRT_10318 = 10318 + const val BOB_SHIRT_10319 = 10319 + const val BOB_SHIRT_10320 = 10320 + const val BOB_SHIRT_10321 = 10321 + const val BOB_SHIRT_10322 = 10322 + const val BOB_SHIRT_10323 = 10323 + const val BOB_SHIRT_10324 = 10324 + const val BOB_SHIRT_10325 = 10325 + const val PURPLE_FIRELIGHTER_10326 = 10326 + const val WHITE_FIRELIGHTER_10327 = 10327 + const val WHITE_LOGS_10328 = 10328 + const val PURPLE_LOGS_10329 = 10329 + const val THIRD_AGE_RANGE_TOP_10330 = 10330 + const val THIRD_AGE_RANGE_TOP_10331 = 10331 + const val THIRD_AGE_RANGE_LEGS_10332 = 10332 + const val THIRD_AGE_RANGE_LEGS_10333 = 10333 + const val THIRD_AGE_RANGE_COIF_10334 = 10334 + const val THIRD_AGE_RANGE_COIF_10335 = 10335 + const val THIRD_AGE_VAMBRACES_10336 = 10336 + const val THIRD_AGE_VAMBRACES_10337 = 10337 + const val THIRD_AGE_ROBE_TOP_10338 = 10338 + const val THIRD_AGE_ROBE_TOP_10339 = 10339 + const val THIRD_AGE_ROBE_10340 = 10340 + const val THIRD_AGE_ROBE_10341 = 10341 + const val THIRD_AGE_MAGE_HAT_10342 = 10342 + const val THIRD_AGE_MAGE_HAT_10343 = 10343 + const val THIRD_AGE_AMULET_10344 = 10344 + const val THIRD_AGE_AMULET_10345 = 10345 + const val THIRD_AGE_PLATELEGS_10346 = 10346 + const val THIRD_AGE_PLATELEGS_10347 = 10347 + const val THIRD_AGE_PLATEBODY_10348 = 10348 + const val THIRD_AGE_PLATEBODY_10349 = 10349 + const val THIRD_AGE_FULL_HELMET_10350 = 10350 + const val THIRD_AGE_FULL_HELMET_10351 = 10351 + const val THIRD_AGE_KITESHIELD_10352 = 10352 + const val THIRD_AGE_KITESHIELD_10353 = 10353 + const val AMULET_OF_GLORYT4_10354 = 10354 + const val AMULET_OF_GLORYT4_10355 = 10355 + const val AMULET_OF_GLORYT3_10356 = 10356 + const val AMULET_OF_GLORYT3_10357 = 10357 + const val AMULET_OF_GLORYT2_10358 = 10358 + const val AMULET_OF_GLORYT2_10359 = 10359 + const val AMULET_OF_GLORYT1_10360 = 10360 + const val AMULET_OF_GLORYT1_10361 = 10361 + const val AMULET_OF_GLORYT_10362 = 10362 + const val AMULET_OF_GLORYT_10363 = 10363 + const val STRENGTH_AMULETT_10364 = 10364 + const val STRENGTH_AMULETT_10365 = 10365 + const val AMULET_OF_MAGICT_10366 = 10366 + const val AMULET_OF_MAGICT_10367 = 10367 + const val ZAMORAK_BRACERS_10368 = 10368 + const val ZAMORAK_BRACERS_10369 = 10369 + const val ZAMORAK_DHIDE_10370 = 10370 + const val ZAMORAK_DHIDE_10371 = 10371 + const val ZAMORAK_CHAPS_10372 = 10372 + const val ZAMORAK_CHAPS_10373 = 10373 + const val ZAMORAK_COIF_10374 = 10374 + const val ZAMORAK_COIF_10375 = 10375 + const val GUTHIX_BRACERS_10376 = 10376 + const val GUTHIX_BRACERS_10377 = 10377 + const val GUTHIX_DRAGONHIDE_10378 = 10378 + const val GUTHIX_DRAGONHIDE_10379 = 10379 + const val GUTHIX_CHAPS_10380 = 10380 + const val GUTHIX_CHAPS_10381 = 10381 + const val GUTHIX_COIF_10382 = 10382 + const val GUTHIX_COIF_10383 = 10383 + const val SARADOMIN_BRACERS_10384 = 10384 + const val SARADOMIN_BRACERS_10385 = 10385 + const val SARADOMIN_DHIDE_10386 = 10386 + const val SARADOMIN_DHIDE_10387 = 10387 + const val SARADOMIN_CHAPS_10388 = 10388 + const val SARADOMIN_CHAPS_10389 = 10389 + const val SARADOMIN_COIF_10390 = 10390 + const val SARADOMIN_COIF_10391 = 10391 + const val A_POWDERED_WIG_10392 = 10392 + const val A_POWDERED_WIG_10393 = 10393 + const val FLARED_TROUSERS_10394 = 10394 + const val FLARED_TROUSERS_10395 = 10395 + const val PANTALOONS_10396 = 10396 + const val PANTALOONS_10397 = 10397 + const val SLEEPING_CAP_10398 = 10398 + const val SLEEPING_CAP_10399 = 10399 + const val BLACK_ELE_SHIRT_10400 = 10400 + const val BLACK_ELE_SHIRT_10401 = 10401 + const val BLACK_ELE_LEGS_10402 = 10402 + const val BLACK_ELE_LEGS_10403 = 10403 + const val RED_ELE_SHIRT_10404 = 10404 + const val RED_ELE_SHIRT_10405 = 10405 + const val RED_ELE_LEGS_10406 = 10406 + const val RED_ELE_LEGS_10407 = 10407 + const val BLUE_ELE_SHIRT_10408 = 10408 + const val BLUE_ELE_SHIRT_10409 = 10409 + const val BLUE_ELE_LEGS_10410 = 10410 + const val BLUE_ELE_LEGS_10411 = 10411 + const val GREEN_ELE_SHIRT_10412 = 10412 + const val GREEN_ELE_SHIRT_10413 = 10413 + const val GREEN_ELE_LEGS_10414 = 10414 + const val GREEN_ELE_LEGS_10415 = 10415 + const val PURPLE_ELE_SHIRT_10416 = 10416 + const val PURPLE_ELE_SHIRT_10417 = 10417 + const val PURPLE_ELE_LEGS_10418 = 10418 + const val PURPLE_ELE_LEGS_10419 = 10419 + const val WHITE_ELE_BLOUSE_10420 = 10420 + const val WHITE_ELE_BLOUSE_10421 = 10421 + const val WHITE_ELE_SKIRT_10422 = 10422 + const val WHITE_ELE_SKIRT_10423 = 10423 + const val RED_ELE_BLOUSE_10424 = 10424 + const val RED_ELE_BLOUSE_10425 = 10425 + const val RED_ELE_SKIRT_10426 = 10426 + const val RED_ELE_SKIRT_10427 = 10427 + const val BLUE_ELE_BLOUSE_10428 = 10428 + const val BLUE_ELE_BLOUSE_10429 = 10429 + const val BLUE_ELE_SKIRT_10430 = 10430 + const val BLUE_ELE_SKIRT_10431 = 10431 + const val GREEN_ELE_BLOUSE_10432 = 10432 + const val GREEN_ELE_BLOUSE_10433 = 10433 + const val GREEN_ELE_SKIRT_10434 = 10434 + const val GREEN_ELE_SKIRT_10435 = 10435 + const val PURPLE_ELE_BLOUSE_10436 = 10436 + const val PURPLE_ELE_BLOUSE_10437 = 10437 + const val PURPLE_ELE_SKIRT_10438 = 10438 + const val PURPLE_ELE_SKIRT_10439 = 10439 + const val SARADOMIN_CROZIER_10440 = 10440 + const val SARADOMIN_CROZIER_10441 = 10441 + const val GUTHIX_CROZIER_10442 = 10442 + const val GUTHIX_CROZIER_10443 = 10443 + const val ZAMORAK_CROZIER_10444 = 10444 + const val ZAMORAK_CROZIER_10445 = 10445 + const val SARADOMIN_CLOAK_10446 = 10446 + const val SARADOMIN_CLOAK_10447 = 10447 + const val GUTHIX_CLOAK_10448 = 10448 + const val GUTHIX_CLOAK_10449 = 10449 + const val ZAMORAK_CLOAK_10450 = 10450 + const val ZAMORAK_CLOAK_10451 = 10451 + const val SARADOMIN_MITRE_10452 = 10452 + const val SARADOMIN_MITRE_10453 = 10453 + const val GUTHIX_MITRE_10454 = 10454 + const val GUTHIX_MITRE_10455 = 10455 + const val ZAMORAK_MITRE_10456 = 10456 + const val ZAMORAK_MITRE_10457 = 10457 + const val SARADOMIN_ROBE_TOP_10458 = 10458 + const val SARADOMIN_ROBE_TOP_10459 = 10459 + const val ZAMORAK_ROBE_TOP_10460 = 10460 + const val ZAMORAK_ROBE_TOP_10461 = 10461 + const val GUTHIX_ROBE_TOP_10462 = 10462 + const val GUTHIX_ROBE_TOP_10463 = 10463 + const val SARADOMIN_ROBE_LEGS_10464 = 10464 + const val SARADOMIN_ROBE_LEGS_10465 = 10465 + const val GUTHIX_ROBE_LEGS_10466 = 10466 + const val GUTHIX_ROBE_LEGS_10467 = 10467 + const val ZAMORAK_ROBE_LEGS_10468 = 10468 + const val ZAMORAK_ROBE_LEGS_10469 = 10469 + const val SARADOMIN_STOLE_10470 = 10470 + const val SARADOMIN_STOLE_10471 = 10471 + const val GUTHIX_STOLE_10472 = 10472 + const val GUTHIX_STOLE_10473 = 10473 + const val ZAMORAK_STOLE_10474 = 10474 + const val ZAMORAK_STOLE_10475 = 10475 + const val PURPLE_SWEETS_10476 = 10476 + const val NULL_10477 = 10477 + const val NULL_10478 = 10478 + const val NULL_10479 = 10479 + const val NULL_10480 = 10480 + const val NULL_10481 = 10481 + const val NULL_10482 = 10482 + const val NULL_10483 = 10483 + const val NULL_10484 = 10484 + const val SCROLL_10485 = 10485 + const val EMPTY_SACK_10486 = 10486 + const val UNDEAD_CHICKEN_10487 = 10487 + const val SELECTED_IRON_10488 = 10488 + const val BAR_MAGNET_10489 = 10489 + const val UNDEAD_TWIGS_10490 = 10490 + const val BLESSED_AXE_10491 = 10491 + const val RESEARCH_NOTES_10492 = 10492 + const val TRANSLATED_NOTES_10493 = 10493 + const val A_PATTERN_10494 = 10494 + const val A_CONTAINER_10495 = 10495 + const val POLISHED_BUTTONS_10496 = 10496 + const val TINDERBOX_10497 = 10497 + const val AVAS_ATTRACTOR_10498 = 10498 + const val AVAS_ACCUMULATOR_10499 = 10499 + const val CRONE_MADE_AMULET_10500 = 10500 + const val SNOWBALL_10501 = 10501 + const val NULL_10502 = 10502 + const val NULL_10503 = 10503 + const val NULL_10504 = 10504 + const val NULL_10505 = 10505 + const val GUBLINCH_SHARDS_10506 = 10506 + const val REINDEER_HAT_10507 = 10507 + const val WINTUMBER_TREE_10508 = 10508 + const val SNOWBALL_10509 = 10509 + const val SNOWBALL_10510 = 10510 + const val ZANARIS_CHOIR_10511 = 10511 + const val SCROLL_10512 = 10512 + const val CRACKERS_10513 = 10513 + const val TOFU_10514 = 10514 + const val WORMS_10515 = 10515 + const val ATTACKER_HORN_10516 = 10516 + const val ATTACKER_HORN_10517 = 10517 + const val ATTACKER_HORN_10518 = 10518 + const val ATTACKER_HORN_10519 = 10519 + const val ATTACKER_HORN_10520 = 10520 + const val COLLECTION_BAG_10521 = 10521 + const val COLLECTION_BAG_10522 = 10522 + const val COLLECTION_BAG_10523 = 10523 + const val COLLECTION_BAG_10524 = 10524 + const val COLLECTION_BAG_10525 = 10525 + const val HEALER_HORN_10526 = 10526 + const val HEALER_HORN_10527 = 10527 + const val HEALER_HORN_10528 = 10528 + const val HEALER_HORN_10529 = 10529 + const val HEALER_HORN_10530 = 10530 + const val GREEN_EGG_10531 = 10531 + const val RED_EGG_10532 = 10532 + const val BLUE_EGG_10533 = 10533 + const val YELLOW_EGG_10534 = 10534 + const val POISONED_EGG_10535 = 10535 + const val SPIKED_POIS_EGG_10536 = 10536 + const val OMEGA_EGG_10537 = 10537 + const val DEFENDER_HORN_10538 = 10538 + const val POISONED_TOFU_10539 = 10539 + const val POISONED_WORMS_10540 = 10540 + const val POISONED_MEAT_10541 = 10541 + const val HEALING_VIAL4_10542 = 10542 + const val HEALING_VIAL3_10543 = 10543 + const val HEALING_VIAL2_10544 = 10544 + const val HEALING_VIAL1_10545 = 10545 + const val HEALING_VIAL_10546 = 10546 + const val HEALER_HAT_10547 = 10547 + const val FIGHTER_HAT_10548 = 10548 + const val RUNNER_HAT_10549 = 10549 + const val RANGER_HAT_10550 = 10550 + const val FIGHTER_TORSO_10551 = 10551 + const val RUNNER_BOOTS_10552 = 10552 + const val PENANCE_GLOVES_10553 = 10553 + const val PENANCE_GLOVES_10554 = 10554 + const val PENANCE_SKIRT_10555 = 10555 + const val PICTURE_10556 = 10556 + const val PICTURE_10557 = 10557 + const val PICTURE_10558 = 10558 + const val PICTURE_10559 = 10559 + const val COLLECTOR_HORN_10560 = 10560 + const val SPIKES_10561 = 10561 + const val QUEEN_HELP_BOOK_10562 = 10562 + const val NO_EGGS_10563 = 10563 + const val GRANITE_BODY_10564 = 10564 + const val GRANITE_BODY_10565 = 10565 + const val FIRE_CAPE_10566 = 10566 + const val PICTURE_10567 = 10567 + const val PICTURE_10568 = 10568 + const val PICTURE_10569 = 10569 + const val PICTURE_10570 = 10570 + const val PICTURE_10571 = 10571 + const val PICTURE_10572 = 10572 + const val PICTURE_10573 = 10573 + const val PICTURE_10574 = 10574 + const val PICTURE_10575 = 10575 + const val PICTURE_10576 = 10576 + const val PICTURE_10577 = 10577 + const val PICTURE_10578 = 10578 + const val PICTURE_10579 = 10579 + const val PICTURE_10580 = 10580 + const val KERIS_10581 = 10581 + const val KERISP_10582 = 10582 + const val KERISP_PLUS_10583 = 10583 + const val KERISP_PLUS_PLUS_10584 = 10584 + const val PARCHMENT_10585 = 10585 + const val COMBAT_LAMP_10586 = 10586 + const val TARNS_DIARY_10587 = 10587 + const val SALVE_AMULETE_10588 = 10588 + const val GRANITE_HELM_10589 = 10589 + const val GRANITE_HELM_10590 = 10590 + const val TERROR_DOG_10591 = 10591 + const val PENGUIN_BONGOS_10592 = 10592 + const val COWBELLS_10593 = 10593 + const val CLOCKWORK_BOOK_10594 = 10594 + const val CLOCKWORK_SUIT_10595 = 10595 + const val CLOCKWORK_SUIT_10596 = 10596 + const val MISSION_REPORT_10597 = 10597 + const val MISSION_REPORT_10598 = 10598 + const val MISSION_REPORT_10599 = 10599 + const val KGP_ID_CARD_10600 = 10600 + const val MYSTIC_HAT_10601 = 10601 + const val MYSTIC_HAT_10602 = 10602 + const val MYSTIC_HAT_10603 = 10603 + const val SKELETAL_HELM_10604 = 10604 + const val INFINITY_TOP_10605 = 10605 + const val SPLITBARK_HELM_10606 = 10606 + const val GHOSTLY_BOOTS_10607 = 10607 + const val MOONCLAN_HAT_10608 = 10608 + const val LUNAR_HELM_10609 = 10609 + const val DECORATIVE_ARMOUR_10610 = 10610 + const val VOID_KNIGHT_TOP_10611 = 10611 + const val ROGUE_MASK_10612 = 10612 + const val ROCK_SHELL_HELM_10613 = 10613 + const val SPINED_HELM_10614 = 10614 + const val TRIBAL_MASK_10615 = 10615 + const val TRIBAL_MASK_10616 = 10616 + const val TRIBAL_MASK_10617 = 10617 + const val WHITE_PLATEBODY_10618 = 10618 + const val INITIATE_HAUBERK_10619 = 10619 + const val PROSELYTE_HAUBERK_10620 = 10620 + const val MOURNER_TOP_10621 = 10621 + const val KYATT_TOP_10622 = 10622 + const val LARUPIA_TOP_10623 = 10623 + const val GRAAHK_TOP_10624 = 10624 + const val WOOD_CAMO_TOP_10625 = 10625 + const val JUNGLE_CAMO_TOP_10626 = 10626 + const val DESERT_CAMO_TOP_10627 = 10627 + const val POLAR_CAMO_TOP_10628 = 10628 + const val MIME_MASK_10629 = 10629 + const val PRINCESS_BLOUSE_10630 = 10630 + const val ZOMBIE_SHIRT_10631 = 10631 + const val CAMO_TOP_10632 = 10632 + const val LEDERHOSEN_TOP_10633 = 10633 + const val SHADE_ROBE_10634 = 10634 + const val CAPE_OF_LEGENDS_10635 = 10635 + const val OBSIDIAN_CAPE_10636 = 10636 + const val FIRE_CAPE_10637 = 10637 + const val TEAM_1_CAPE_10638 = 10638 + const val ATTACK_CAPE_10639 = 10639 + const val STRENGTH_CAPE_10640 = 10640 + const val DEFENCE_CAPE_10641 = 10641 + const val RANGING_CAPE_10642 = 10642 + const val PRAYER_CAPE_10643 = 10643 + const val MAGIC_CAPE_10644 = 10644 + const val RUNECRAFT_CAPE_10645 = 10645 + const val HUNTER_CAPE_10646 = 10646 + const val HITPOINTS_CAPE_10647 = 10647 + const val AGILITY_CAPE_10648 = 10648 + const val HERBLORE_CAPE_10649 = 10649 + const val THIEVING_CAPE_10650 = 10650 + const val CRAFTING_CAPE_10651 = 10651 + const val FLETCHING_CAPE_10652 = 10652 + const val SLAYER_CAPE_10653 = 10653 + const val CONSTRUCT_CAPE_10654 = 10654 + const val MINING_CAPE_10655 = 10655 + const val SMITHING_CAPE_10656 = 10656 + const val FISHING_CAPE_10657 = 10657 + const val COOKING_CAPE_10658 = 10658 + const val FIREMAKING_CAPE_10659 = 10659 + const val WOODCUTTING_CAPE_10660 = 10660 + const val FARMING_CAPE_10661 = 10661 + const val QUEST_POINT_CAPE_10662 = 10662 + const val SPOTTED_CAPE_10663 = 10663 + const val SPOTTIER_CAPE_10664 = 10664 + const val BLACK_SHIELDH1_10665 = 10665 + const val ADAMANT_SHIELDH1_10666 = 10666 + const val RUNE_SHIELDH1_10667 = 10667 + const val BLACK_SHIELDH2_10668 = 10668 + const val ADAMANT_SHIELDH2_10669 = 10669 + const val RUNE_SHIELDH2_10670 = 10670 + const val BLACK_SHIELDH3_10671 = 10671 + const val ADAMANT_SHIELDH3_10672 = 10672 + const val RUNE_SHIELDH3_10673 = 10673 + const val BLACK_SHIELDH4_10674 = 10674 + const val ADAMANT_SHIELDH4_10675 = 10675 + const val RUNE_SHIELDH4_10676 = 10676 + const val BLACK_SHIELDH5_10677 = 10677 + const val ADAMANT_SHIELDH5_10678 = 10678 + const val RUNE_SHIELDH5_10679 = 10679 + const val STUDDED_BODY_G_10680 = 10680 + const val STUDDED_BODY_T_10681 = 10681 + const val DHIDE_BODYG_10682 = 10682 + const val DHIDE_BODY_T_10683 = 10683 + const val DHIDE_BODY_G_10684 = 10684 + const val DHIDE_BODY_T_10685 = 10685 + const val WIZARD_ROBE_G_10686 = 10686 + const val WIZARD_ROBE_T_10687 = 10687 + const val ENCHANTED_TOP_10688 = 10688 + const val WIZARD_BOOTS_10689 = 10689 + const val BLACK_PLATEBODY_T_10690 = 10690 + const val BLACK_PLATEBODY_G_10691 = 10691 + const val HIGHWAYMAN_MASK_10692 = 10692 + const val BLUE_BERET_10693 = 10693 + const val BLACK_BERET_10694 = 10694 + const val WHITE_BERET_10695 = 10695 + const val RANGER_BOOTS_10696 = 10696 + const val ADAM_PLATEBODY_T_10697 = 10697 + const val ADAM_PLATEBODY_G_10698 = 10698 + const val BLACK_HELM_H1_10699 = 10699 + const val BLACK_HELM_H2_10700 = 10700 + const val BLACK_HELM_H3_10701 = 10701 + const val BLACK_HELM_H4_10702 = 10702 + const val BLACK_HELM_H5_10703 = 10703 + const val RUNE_HELM_H1_10704 = 10704 + const val RUNE_HELM_H2_10705 = 10705 + const val RUNE_HELM_H3_10706 = 10706 + const val RUNE_HELM_H4_10707 = 10707 + const val RUNE_HELM_H5_10708 = 10708 + const val ADAMANT_HELM_H1_10709 = 10709 + const val ADAMANT_HELM_H2_10710 = 10710 + const val ADAMANT_HELM_H3_10711 = 10711 + const val ADAMANT_HELM_H4_10712 = 10712 + const val ADAMANT_HELM_H5_10713 = 10713 + const val BOB_SHIRT_10714 = 10714 + const val BOB_SHIRT_10715 = 10715 + const val BOB_SHIRT_10716 = 10716 + const val BOB_SHIRT_10717 = 10717 + const val BOB_SHIRT_10718 = 10718 + const val AMULET_OF_GLORYT_10719 = 10719 + const val GUTHIX_CAPE_10720 = 10720 + const val FROG_MASK_10721 = 10721 + const val REINDEER_HAT_10722 = 10722 + const val JACK_LANTERN_MASK_10723 = 10723 + const val SKELETON_BOOTS_10724 = 10724 + const val SKELETON_GLOVES_10725 = 10725 + const val SKELETON_LEGGINGS_10726 = 10726 + const val SKELETON_SHIRT_10727 = 10727 + const val SKELETON_MASK_10728 = 10728 + const val EASTER_RING_10729 = 10729 + const val BLUE_MARIONETTE_10730 = 10730 + const val ZOMBIE_HEAD_10731 = 10731 + const val RUBBER_CHICKEN_10732 = 10732 + const val YO_YO_10733 = 10733 + const val BUNNY_EARS_10734 = 10734 + const val SCYTHE_10735 = 10735 + const val STRENGTH_AMULETT_10736 = 10736 + const val PICTURE_10737 = 10737 + const val AMULET_OF_MAGICT_10738 = 10738 + const val PICTURE_10739 = 10739 + const val A_POWDERED_WIG_10740 = 10740 + const val PICTURE_10741 = 10741 + const val FLARED_TROUSERS_10742 = 10742 + const val PICTURE_10743 = 10743 + const val PANTALOONS_10744 = 10744 + const val PICTURE_10745 = 10745 + const val SLEEPING_CAP_10746 = 10746 + const val PICTURE_10747 = 10747 + const val ELEGANT_SHIRT_10748 = 10748 + const val PICTURE_10749 = 10749 + const val ELEGANT_SHIRT_10750 = 10750 + const val PICTURE_10751 = 10751 + const val ELEGANT_SHIRT_10752 = 10752 + const val PICTURE_10753 = 10753 + const val ELEGANT_SHIRT_10754 = 10754 + const val PICTURE_10755 = 10755 + const val ELEGANT_SHIRT_10756 = 10756 + const val PICTURE_10757 = 10757 + const val RED_BOATER_10758 = 10758 + const val PICTURE_10759 = 10759 + const val ORANGE_BOATER_10760 = 10760 + const val PICTURE_10761 = 10761 + const val GREEN_BOATER_10762 = 10762 + const val PICTURE_10763 = 10763 + const val BLUE_BOATER_10764 = 10764 + const val PICTURE_10765 = 10765 + const val BLACK_BOATER_10766 = 10766 + const val PICTURE_10767 = 10767 + const val RED_HEADBAND_10768 = 10768 + const val PICTURE_10769 = 10769 + const val BLACK_HEADBAND_10770 = 10770 + const val PICTURE_10771 = 10771 + const val BROWN_HEADBAND_10772 = 10772 + const val PICTURE_10773 = 10773 + const val PIRATES_HAT_10774 = 10774 + const val PICTURE_10775 = 10775 + const val ZAMORAK_PLATEBODY_10776 = 10776 + const val PICTURE_10777 = 10777 + const val SARADOMIN_PLATE_10778 = 10778 + const val PICTURE_10779 = 10779 + const val GUTHIX_PLATEBODY_10780 = 10780 + const val PICTURE_10781 = 10781 + const val GILDED_PLATEBODY_10782 = 10782 + const val PICTURE_10783 = 10783 + const val SARADOMIN_ROBE_TOP_10784 = 10784 + const val PICTURE_10785 = 10785 + const val ZAMORAK_ROBE_TOP_10786 = 10786 + const val PICTURE_10787 = 10787 + const val GUTHIX_ROBE_TOP_10788 = 10788 + const val PICTURE_10789 = 10789 + const val ZAMORAK_DHIDE_10790 = 10790 + const val PICTURE_10791 = 10791 + const val SARADOMIN_DHIDE_10792 = 10792 + const val PICTURE_10793 = 10793 + const val GUTHIX_DRAGONHIDE_10794 = 10794 + const val PICTURE_10795 = 10795 + const val ROBIN_HOOD_HAT_10796 = 10796 + const val PICTURE_10797 = 10797 + const val RUNE_PLATEBODY_G_10798 = 10798 + const val PICTURE_10799 = 10799 + const val RUNE_PLATEBODY_T_10800 = 10800 + const val PICTURE_10801 = 10801 + const val TAN_CAVALIER_10802 = 10802 + const val PICTURE_10803 = 10803 + const val DARK_CAVALIER_10804 = 10804 + const val PICTURE_10805 = 10805 + const val BLACK_CAVALIER_10806 = 10806 + const val PICTURE_10807 = 10807 + const val ARCTIC_PYRE_LOGS_10808 = 10808 + const val ARCTIC_PYRE_LOGS_10809 = 10809 + const val ARCTIC_PINE_LOGS_10810 = 10810 + const val ARCTIC_PINE_LOGS_10811 = 10811 + const val SPLIT_LOG_10812 = 10812 + const val SPLIT_LOG_10813 = 10813 + const val HAIR_10814 = 10814 + const val HAIR_10815 = 10815 + const val RAW_YAK_MEAT_10816 = 10816 + const val RAW_YAK_MEAT_10817 = 10817 + const val YAK_HIDE_10818 = 10818 + const val YAK_HIDE_10819 = 10819 + const val CURED_YAK_HIDE_10820 = 10820 + const val CURED_YAK_HIDE_10821 = 10821 + const val YAK_HIDE_ARMOUR_10822 = 10822 + const val YAK_HIDE_ARMOUR_10823 = 10823 + const val YAK_HIDE_ARMOUR_10824 = 10824 + const val YAK_HIDE_ARMOUR_10825 = 10825 + const val FREMENNIK_ROUND_SHIELD_10826 = 10826 + const val FREMENNIK_ROUND_SHIELD_10827 = 10827 + const val HELM_OF_NEITIZNOT_10828 = 10828 + const val DOCUMENTS_10829 = 10829 + const val ROYAL_DECREE_10830 = 10830 + const val EMPTY_TAX_BAG_10831 = 10831 + const val LIGHT_TAX_BAG_10832 = 10832 + const val NORMAL_TAX_BAG_10833 = 10833 + const val HEFTY_TAX_BAG_10834 = 10834 + const val BULGING_TAXBAG_10835 = 10835 + const val SILLY_JESTER_HAT_10836 = 10836 + const val SILLY_JESTER_TOP_10837 = 10837 + const val SILLY_JESTER_TIGHTS_10838 = 10838 + const val SILLY_JESTER_BOOTS_10839 = 10839 + const val A_JESTER_STICK_10840 = 10840 + const val APRICOT_CREAM_PIE_10841 = 10841 + const val DECAPITATED_HEAD_10842 = 10842 + const val HELM_OF_NEITIZNOT_10843 = 10843 + const val SPRING_SQIRK_10844 = 10844 + const val SUMMER_SQIRK_10845 = 10845 + const val AUTUMN_SQIRK_10846 = 10846 + const val WINTER_SQIRK_10847 = 10847 + const val SPRING_SQIRKJUICE_10848 = 10848 + const val SUMMER_SQIRKJUICE_10849 = 10849 + const val AUTUMN_SQIRKJUICE_10850 = 10850 + const val WINTER_SQIRKJUICE_10851 = 10851 + const val SUMMER_GARDEN_10852 = 10852 + const val SPRING_GARDEN_10853 = 10853 + const val AUTUMN_GARDEN_10854 = 10854 + const val WINTER_GARDEN_10855 = 10855 + const val SIN_SEERS_NOTE_10856 = 10856 + const val SEVERED_LEG_10857 = 10857 + const val SHADOW_SWORD_10858 = 10858 + const val TEA_FLASK_10859 = 10859 + const val TEA_FLASK_10860 = 10860 + const val TEA_FLASK_10861 = 10861 + const val HARD_HAT_10862 = 10862 + const val BUILDERS_SHIRT_10863 = 10863 + const val BUILDERS_TROUSERS_10864 = 10864 + const val BUILDERS_BOOTS_10865 = 10865 + const val RIVETS_10866 = 10866 + const val NULL_10867 = 10867 + const val NULL_10868 = 10868 + const val NULL_10869 = 10869 + const val BINDING_FLUID_10870 = 10870 + const val PIPE_10871 = 10871 + const val PIPE_RING_10872 = 10872 + const val METAL_SHEET_10873 = 10873 + const val COLOURED_BALL_10874 = 10874 + const val VALVE_WHEEL_10875 = 10875 + const val METAL_BAR_10876 = 10876 + const val PLAIN_SATCHEL_10877 = 10877 + const val GREEN_SATCHEL_10878 = 10878 + const val RED_SATCHEL_10879 = 10879 + const val BLACK_SATCHEL_10880 = 10880 + const val GOLD_SATCHEL_10881 = 10881 + const val RUNE_SATCHEL_10882 = 10882 + const val HARD_HAT_10883 = 10883 + const val FUSE_10884 = 10884 + const val KEG_10885 = 10885 + const val PRAYER_BOOK_10886 = 10886 + const val BARRELCHEST_ANCHOR_10887 = 10887 + const val BARRELCHEST_ANCHOR_10888 = 10888 + const val BLESSED_LAMP_10889 = 10889 + const val PRAYER_BOOK_10890 = 10890 + const val WOODEN_CAT_10891 = 10891 + const val WOODEN_CAT_10892 = 10892 + const val CRANIAL_CLAMP_10893 = 10893 + const val BRAIN_TONGS_10894 = 10894 + const val BELL_JAR_10895 = 10895 + const val WOLF_WHISTLE_10896 = 10896 + const val SHIPPING_ORDER_10897 = 10897 + const val KEG_10898 = 10898 + const val CRATE_PART_10899 = 10899 + const val NULL_10900 = 10900 + const val NULL_10901 = 10901 + const val NULL_10902 = 10902 + const val NULL_10903 = 10903 + const val SKULL_STAPLE_10904 = 10904 + const val NULL_10905 = 10905 + const val NULL_10906 = 10906 + const val NULL_10907 = 10907 + const val NULL_10908 = 10908 + const val MIXTURE___STEP_14_10909 = 10909 + const val MIXTURE___STEP_14_10910 = 10910 + const val MIXTURE___STEP_13_10911 = 10911 + const val MIXTURE___STEP_13_10912 = 10912 + const val MIXTURE___STEP_12_10913 = 10913 + const val MIXTURE___STEP_12_10914 = 10914 + const val MIXTURE___STEP_11_10915 = 10915 + const val MIXTURE___STEP_11_10916 = 10916 + const val MIXTURE___STEP_24_10917 = 10917 + const val MIXTURE___STEP_24_10918 = 10918 + const val MIXTURE___STEP_23_10919 = 10919 + const val MIXTURE___STEP_23_10920 = 10920 + const val MIXTURE___STEP_22_10921 = 10921 + const val MIXTURE___STEP_22_10922 = 10922 + const val MIXTURE___STEP_21_10923 = 10923 + const val MIXTURE___STEP_21_10924 = 10924 + const val SANFEW_SERUM4_10925 = 10925 + const val SANFEW_SERUM4_10926 = 10926 + const val SANFEW_SERUM3_10927 = 10927 + const val SANFEW_SERUM3_10928 = 10928 + const val SANFEW_SERUM2_10929 = 10929 + const val SANFEW_SERUM2_10930 = 10930 + const val SANFEW_SERUM1_10931 = 10931 + const val SANFEW_SERUM1_10932 = 10932 + const val LUMBERJACK_BOOTS_10933 = 10933 + const val REWARD_TOKEN_10934 = 10934 + const val REWARD_TOKEN_10935 = 10935 + const val REWARD_TOKEN_10936 = 10936 + const val NAIL_BEAST_NAILS_10937 = 10937 + const val NAIL_BEAST_NAILS_10938 = 10938 + const val LUMBERJACK_TOP_10939 = 10939 + const val LUMBERJACK_LEGS_10940 = 10940 + const val LUMBERJACK_HAT_10941 = 10941 + const val REWARD_TOKEN_10942 = 10942 + const val REWARD_TOKEN_10943 = 10943 + const val REWARD_TOKEN_10944 = 10944 + const val LUMBERJACK_TOP_10945 = 10945 + const val PUSHUP_10946 = 10946 + const val RUN_10947 = 10947 + const val SITUP_10948 = 10948 + const val STARJUMP_10949 = 10949 + const val SKULL_STAPLES_10950 = 10950 + const val SKULL_STAPLES_10951 = 10951 + const val SLAYER_BELL_10952 = 10952 + const val SLAYER_BELL_10953 = 10953 + const val FROG_LEATHER_BODY_10954 = 10954 + const val FROG_LEATHER_BODY_10955 = 10955 + const val FROG_LEATHER_CHAPS_10956 = 10956 + const val FROG_LEATHER_CHAPS_10957 = 10957 + const val FROG_LEATHER_BOOTS_10958 = 10958 + const val FROG_LEATHER_BOOTS_10959 = 10959 + const val GREEN_GLOOP_SOUP_10960 = 10960 + const val FROGSPAWN_GUMBO_10961 = 10961 + const val FROGBURGER_10962 = 10962 + const val COATED_FROGS_LEGS_10963 = 10963 + const val BAT_SHISH_10964 = 10964 + const val FINGERS_10965 = 10965 + const val GRUBS_A_LA_MODE_10966 = 10966 + const val ROAST_FROG_10967 = 10967 + const val MUSHROOMS_10968 = 10968 + const val FILLETS_10969 = 10969 + const val LOACH_10970 = 10970 + const val EEL_SUSHI_10971 = 10971 + const val DORGESH_KAAN_SPHERE_10972 = 10972 + const val LIGHT_ORB_10973 = 10973 + const val LIGHT_ORB_10974 = 10974 + const val SPANNER_10975 = 10975 + const val LONG_BONE_10976 = 10976 + const val CURVED_BONE_10977 = 10977 + const val SWAMP_WEED_10978 = 10978 + const val SWAMP_WEED_10979 = 10979 + const val EMPTY_LIGHT_ORB_10980 = 10980 + const val CAVE_GOBLIN_WIRE_10981 = 10981 + const val CAVE_GOBLIN_WIRE_10982 = 10982 + const val COG_10983 = 10983 + const val COG_10984 = 10984 + const val FUSE_10985 = 10985 + const val FUSE_10986 = 10986 + const val METER_10987 = 10987 + const val METER_10988 = 10988 + const val CAPACITOR_10989 = 10989 + const val CAPACITOR_10990 = 10990 + const val LEVER_10991 = 10991 + const val LEVER_10992 = 10992 + const val POWERBOX_10993 = 10993 + const val POWERBOX_10994 = 10994 + const val PERFECT_SHELL_10995 = 10995 + const val PERFECT_SNAIL_SHELL_10996 = 10996 + const val MOLANISK_10997 = 10997 + const val CAVE_GOBLIN_10998 = 10998 + const val GOBLIN_BOOK_10999 = 10999 + const val PICTURE_11000 = 11000 + const val DAGONHAI_HISTORY_11001 = 11001 + const val SINKETHS_DIARY_11002 = 11002 + const val AN_EMPTY_FOLDER_11003 = 11003 + const val NULL_11004 = 11004 + const val NULL_11005 = 11005 + const val USED_FOLDER_11006 = 11006 + const val FULL_FOLDER_11007 = 11007 + const val RATS_PAPER_11008 = 11008 + const val RATS_LETTER_11009 = 11009 + const val SUROKS_LETTER_11010 = 11010 + const val ZAFFS_INSTRUCTIONS_11011 = 11011 + const val WAND_11012 = 11012 + const val INFUSED_WAND_11013 = 11013 + const val BEACON_RING_11014 = 11014 + const val CHICKEN_HEAD_11015 = 11015 + const val CHICKEN_FEET_11016 = 11016 + const val CHICKEN_WINGS_11017 = 11017 + const val CHICKEN_LEGS_11018 = 11018 + const val CHICKEN_FEET_11019 = 11019 + const val CHICKEN_WINGS_11020 = 11020 + const val CHICKEN_HEAD_11021 = 11021 + const val CHICKEN_LEGS_11022 = 11022 + const val MAGIC_EGG_11023 = 11023 + const val RABBIT_MOULD_11024 = 11024 + const val CHOCOLATE_CHUNKS_11025 = 11025 + const val CHOCOLATE_KEBBIT_11026 = 11026 + const val EASTER_EGG_11027 = 11027 + const val EASTER_EGG_11028 = 11028 + const val EASTER_EGG_11029 = 11029 + const val EASTER_EGG_11030 = 11030 + const val DAMP_PLANKS_11031 = 11031 + const val CRUDE_CARVING_11032 = 11032 + const val CRUDER_CARVING_11033 = 11033 + const val SVENS_LAST_MAP_11034 = 11034 + const val WINDSWEPT_LOGS_11035 = 11035 + const val PARCHMENT_11036 = 11036 + const val BRINE_SABRE_11037 = 11037 + const val BRINE_SABRE_11038 = 11038 + const val KEY_11039 = 11039 + const val KEY_11040 = 11040 + const val KEY_11041 = 11041 + const val KEY_11042 = 11042 + const val KEY_11043 = 11043 + const val ROTTEN_BARREL_11044 = 11044 + const val ROTTEN_BARREL_11045 = 11045 + const val ROPE_11046 = 11046 + const val BRINE_RAT_11047 = 11047 + const val ARMOUR_SHARD_11048 = 11048 + const val ARTEFACT_11049 = 11049 + const val AXE_HEAD_11050 = 11050 + const val ARTEFACT_11051 = 11051 + const val HELMET_FRAGMENT_11052 = 11052 + const val ARTEFACT_11053 = 11053 + const val SHIELD_FRAGMENT_11054 = 11054 + const val ARTEFACT_11055 = 11055 + const val SWORD_FRAGMENT_11056 = 11056 + const val ARTEFACT_11057 = 11057 + const val MACE_11058 = 11058 + const val ARTEFACT_11059 = 11059 + const val GOBLIN_VILLAGE_SPHERE_11060 = 11060 + const val ANCIENT_MACE_11061 = 11061 + const val ZANIK_SLICE_11062 = 11062 + const val NULL_11063 = 11063 + const val ANCIENT_MACE_11064 = 11064 + const val BRACELET_MOULD_11065 = 11065 + const val BRACELET_MOULD_11066 = 11066 + const val NULL_11067 = 11067 + const val NULL_11068 = 11068 + const val GOLD_BRACELET_11069 = 11069 + const val GOLD_BRACELET_11070 = 11070 + const val NULL_11071 = 11071 + const val SAPPHIRE_BRACELET_11072 = 11072 + const val SAPPHIRE_BRACELET_11073 = 11073 + const val BRACELET_OF_CLAY_11074 = 11074 + const val BRACELET_OF_CLAY_11075 = 11075 + const val EMERALD_BRACELET_11076 = 11076 + const val EMERALD_BRACELET_11077 = 11077 + const val NULL_11078 = 11078 + const val CASTLEWAR_BRACE3_11079 = 11079 + const val CASTLEWAR_BRACE3_11080 = 11080 + const val CASTLEWAR_BRACE2_11081 = 11081 + const val CASTLEWAR_BRACE2_11082 = 11082 + const val CASTLEWAR_BRACE1_11083 = 11083 + const val CASTLEWAR_BRACE1_11084 = 11084 + const val RUBY_BRACELET_11085 = 11085 + const val RUBY_BRACELET_11086 = 11086 + const val NULL_11087 = 11087 + const val INOCULATION_BRACE_11088 = 11088 + const val INOCULATION_BRACE_11089 = 11089 + const val PHOENIX_NECKLACE_11090 = 11090 + const val PHOENIX_NECKLACE_11091 = 11091 + const val DIAMOND_BRACELET_11092 = 11092 + const val DIAMOND_BRACELET_11093 = 11093 + const val NULL_11094 = 11094 + const val FORINTHRY_BRACE5_11095 = 11095 + const val FORINTHRY_BRACE5_11096 = 11096 + const val FORINTHRY_BRACE4_11097 = 11097 + const val FORINTHRY_BRACE4_11098 = 11098 + const val FORINTHRY_BRACE3_11099 = 11099 + const val FORINTHRY_BRACE3_11100 = 11100 + const val FORINTHRY_BRACE2_11101 = 11101 + const val FORINTHRY_BRACE2_11102 = 11102 + const val FORINTHRY_BRACE1_11103 = 11103 + const val FORINTHRY_BRACE1_11104 = 11104 + const val SKILLS_NECKLACE4_11105 = 11105 + const val SKILLS_NECKLACE4_11106 = 11106 + const val SKILLS_NECKLACE3_11107 = 11107 + const val SKILLS_NECKLACE3_11108 = 11108 + const val SKILLS_NECKLACE2_11109 = 11109 + const val SKILLS_NECKLACE2_11110 = 11110 + const val SKILLS_NECKLACE1_11111 = 11111 + const val SKILLS_NECKLACE1_11112 = 11112 + const val SKILLS_NECKLACE_11113 = 11113 + const val SKILLS_NECKLACE_11114 = 11114 + const val DRAGON_BRACELET_11115 = 11115 + const val DRAGON_BRACELET_11116 = 11116 + const val NULL_11117 = 11117 + const val COMBAT_BRACELET4_11118 = 11118 + const val COMBAT_BRACELET4_11119 = 11119 + const val COMBAT_BRACELET3_11120 = 11120 + const val COMBAT_BRACELET3_11121 = 11121 + const val COMBAT_BRACELET2_11122 = 11122 + const val COMBAT_BRACELET2_11123 = 11123 + const val COMBAT_BRACELET1_11124 = 11124 + const val COMBAT_BRACELET1_11125 = 11125 + const val COMBAT_BRACELET_11126 = 11126 + const val COMBAT_BRACELET_11127 = 11127 + const val BERSERKER_NECKLACE_11128 = 11128 + const val BERSERKER_NECKLACE_11129 = 11129 + const val ONYX_BRACELET_11130 = 11130 + const val ONYX_BRACELET_11131 = 11131 + const val NULL_11132 = 11132 + const val REGEN_BRACELET_11133 = 11133 + const val REGEN_BRACELET_11134 = 11134 + const val BOMBER_JACKET_11135 = 11135 + const val KARAMJA_GLOVES_1_11136 = 11136 + const val ANTIQUE_LAMP_11137 = 11137 + const val KARAMJA_GLOVES_2_11138 = 11138 + const val ANTIQUE_LAMP_11139 = 11139 + const val KARAMJA_GLOVES_3_11140 = 11140 + const val ANTIQUE_LAMP_11141 = 11141 + const val NULL_11142 = 11142 + const val NULL_11143 = 11143 + const val NULL_11144 = 11144 + const val NULL_11145 = 11145 + const val NULL_11146 = 11146 + const val NULL_11147 = 11147 + const val NULL_11148 = 11148 + const val NULL_11149 = 11149 + const val NULL_11150 = 11150 + const val DREAM_VIAL_EMPTY_11151 = 11151 + const val DREAM_VIAL_WATER_11152 = 11152 + const val DREAM_VIAL_HERB_11153 = 11153 + const val DREAM_POTION_11154 = 11154 + const val GROUND_ASTRAL_RUNE_11155 = 11155 + const val ASTRAL_RUNE_SHARDS_11156 = 11156 + const val DREAMY_LAMP_11157 = 11157 + const val CYRISUSS_CHEST_11158 = 11158 + const val HUNTER_KIT_11159 = 11159 + const val NULL_11160 = 11160 + const val NULL_11161 = 11161 + const val NULL_11162 = 11162 + const val NULL_11163 = 11163 + const val RESTORED_SHIELD_11164 = 11164 + const val PHOENIX_CROSSBOW_11165 = 11165 + const val PHOENIX_CROSSBOW_11166 = 11166 + const val PHOENIX_CROSSBOW_11167 = 11167 + const val PHOENIX_CROSSBOW_11168 = 11168 + const val NEWSPAPER_11169 = 11169 + const val NEWSPAPER_11170 = 11170 + const val NEWSPAPER_11171 = 11171 + const val NEWSPAPER_11172 = 11172 + const val HALF_CERTIFICATE_11173 = 11173 + const val HALF_CERTIFICATE_11174 = 11174 + const val UNCLEANED_FIND_11175 = 11175 + const val ARROWHEADS_11176 = 11176 + const val JEWELLERY_11177 = 11177 + const val POTTERY_11178 = 11178 + const val OLD_COIN_11179 = 11179 + const val ANCIENT_COIN_11180 = 11180 + const val ANCIENT_SYMBOL_11181 = 11181 + const val OLD_SYMBOL_11182 = 11182 + const val OLD_CHIPPED_VASE_11183 = 11183 + const val MUSEUM_MAP_11184 = 11184 + const val ANTIQUE_LAMP_11185 = 11185 + const val ANTIQUE_LAMP_11186 = 11186 + const val ANTIQUE_LAMP_11187 = 11187 + const val ANTIQUE_LAMP_11188 = 11188 + const val ANTIQUE_LAMP_11189 = 11189 + const val DIGSITE_PENDANT_1_11190 = 11190 + const val DIGSITE_PENDANT_2_11191 = 11191 + const val DIGSITE_PENDANT_3_11192 = 11192 + const val DIGSITE_PENDANT_4_11193 = 11193 + const val DIGSITE_PENDANT_5_11194 = 11194 + const val CLEAN_NECKLACE_11195 = 11195 + const val GRIFFIN_FEATHER_11196 = 11196 + const val MIAZRQAS_PENDANT_11197 = 11197 + const val MUSIC_SHEET_11198 = 11198 + const val RUPERTS_HELMET_11199 = 11199 + const val DWARVEN_HELMET_11200 = 11200 + const val DWARVEN_HELMET_11201 = 11201 + const val SHRINKING_RECIPE_11202 = 11202 + const val TO_DO_LIST_11203 = 11203 + const val SHRINK_ME_QUICK_11204 = 11204 + const val SHRUNK_OGLEROOT_11205 = 11205 + const val NULL_11206 = 11206 + const val NULL_11207 = 11207 + const val NULL_11208 = 11208 + const val NULL_11209 = 11209 + const val GOLDEN_GOBLIN_11210 = 11210 + const val MAGIC_BEANS_11211 = 11211 + const val DRAGON_ARROW_11212 = 11212 + const val NULL_11213 = 11213 + const val NULL_11214 = 11214 + const val NULL_11215 = 11215 + const val NULL_11216 = 11216 + const val DRAGON_FIRE_ARROWS_11217 = 11217 + const val NULL_11218 = 11218 + const val NULL_11219 = 11219 + const val NULL_11220 = 11220 + const val NULL_11221 = 11221 + const val DRAGON_FIRE_ARROWS_11222 = 11222 + const val NULL_11223 = 11223 + const val NULL_11224 = 11224 + const val NULL_11225 = 11225 + const val NULL_11226 = 11226 + const val DRAGON_ARROWP_11227 = 11227 + const val DRAGON_ARROWP_PLUS_11228 = 11228 + const val DRAGON_ARROWP_PLUS_PLUS_11229 = 11229 + const val DRAGON_DART_11230 = 11230 + const val DRAGON_DARTP_11231 = 11231 + const val DRAGON_DART_TIP_11232 = 11232 + const val DRAGON_DARTP_PLUS_11233 = 11233 + const val DRAGON_DARTP_PLUS_PLUS_11234 = 11234 + const val DARK_BOW_11235 = 11235 + const val DARK_BOW_11236 = 11236 + const val DRAGON_ARROWTIPS_11237 = 11237 + const val BABY_IMPLING_JAR_11238 = 11238 + const val BABY_IMPLING_JAR_11239 = 11239 + const val YOUNG_IMPLING_JAR_11240 = 11240 + const val YOUNG_IMPLING_JAR_11241 = 11241 + const val GOURM_IMPLING_JAR_11242 = 11242 + const val GOURM_IMPLING_JAR_11243 = 11243 + const val EARTH_IMPLING_JAR_11244 = 11244 + const val EARTH_IMPLING_JAR_11245 = 11245 + const val ESS_IMPLING_JAR_11246 = 11246 + const val ESS_IMPLING_JAR_11247 = 11247 + const val ECLECTIC_IMPLING_JAR_11248 = 11248 + const val ECLECTIC_IMPLING_JAR_11249 = 11249 + const val NATURE_IMPLING_JAR_11250 = 11250 + const val NATURE_IMPLING_JAR_11251 = 11251 + const val MAGPIE_IMPLING_JAR_11252 = 11252 + const val MAGPIE_IMPLING_JAR_11253 = 11253 + const val NINJA_IMPLING_JAR_11254 = 11254 + const val NINJA_IMPLING_JAR_11255 = 11255 + const val DRAGON_IMPLING_JAR_11256 = 11256 + const val DRAGON_IMPLING_JAR_11257 = 11257 + const val JAR_GENERATOR_11258 = 11258 + const val MAGIC_BUTTERFLY_NET_11259 = 11259 + const val IMPLING_JAR_11260 = 11260 + const val IMPLING_JAR_11261 = 11261 + const val IMP_REPELLENT_11262 = 11262 + const val IMP_REPELLENT_11263 = 11263 + const val ANCHOVY_OIL_11264 = 11264 + const val ANCHOVY_OIL_11265 = 11265 + const val ANCHOVY_PASTE_11266 = 11266 + const val PICTURE_11267 = 11267 + const val PICTURE_11268 = 11268 + const val PICTURE_11269 = 11269 + const val PICTURE_11270 = 11270 + const val PICTURE_11271 = 11271 + const val PICTURE_11272 = 11272 + const val IMPLING_SCROLL_11273 = 11273 + const val HAM_SHIRT_11274 = 11274 + const val MITH_GRAPPLE_11275 = 11275 + const val MITH_GRAPPLE_11276 = 11276 + const val CAVALIER_MASK_11277 = 11277 + const val BERET_MASK_11278 = 11278 + const val ELVARGS_HEAD_11279 = 11279 + const val CAVALIER_AND_MASK_11280 = 11280 + const val CAVALIER_AND_MASK_11281 = 11281 + const val BERET_AND_MASK_11282 = 11282 + const val DRAGONFIRE_SHIELD_11283 = 11283 + const val DRAGONFIRE_SHIELD_11284 = 11284 + const val DRAGONFIRE_SHIELD_11285 = 11285 + const val DRACONIC_VISAGE_11286 = 11286 + const val DRACONIC_VISAGE_11287 = 11287 + const val NULL_11288 = 11288 + const val NULL_11289 = 11289 + const val NULL_11290 = 11290 + const val NULL_11291 = 11291 + const val NULL_11292 = 11292 + const val NULL_11293 = 11293 + const val NULL_11294 = 11294 + const val NULL_11295 = 11295 + const val NULL_11296 = 11296 + const val NULL_11297 = 11297 + const val NULL_11298 = 11298 + const val NULL_11299 = 11299 + const val NULL_11300 = 11300 + const val NULL_11301 = 11301 + const val NULL_11302 = 11302 + const val NULL_11303 = 11303 + const val NULL_11304 = 11304 + const val NULL_11305 = 11305 + const val NULL_11306 = 11306 + const val NULL_11307 = 11307 + const val NULL_11308 = 11308 + const val NULL_11309 = 11309 + const val NULL_11310 = 11310 + const val NULL_11311 = 11311 + const val NULL_11312 = 11312 + const val NULL_11313 = 11313 + const val NULL_11314 = 11314 + const val NULL_11315 = 11315 + const val NULL_11316 = 11316 + const val NULL_11317 = 11317 + const val NULL_11318 = 11318 + const val NULL_11319 = 11319 + const val NULL_11320 = 11320 + const val NULL_11321 = 11321 + const val NULL_11322 = 11322 + const val BARBARIAN_ROD_11323 = 11323 + const val ROE_11324 = 11324 + const val ROE_11325 = 11325 + const val CAVIAR_11326 = 11326 + const val CAVIAR_11327 = 11327 + const val LEAPING_TROUT_11328 = 11328 + const val LEAPING_TROUT_11329 = 11329 + const val LEAPING_SALMON_11330 = 11330 + const val LEAPING_SALMON_11331 = 11331 + const val LEAPING_STURGEON_11332 = 11332 + const val LEAPING_STURGEON_11333 = 11333 + const val FISH_OFFCUTS_11334 = 11334 + const val DRAGON_FULL_HELM_11335 = 11335 + const val DRAGON_FULL_HELM_11336 = 11336 + const val MANGLED_BONES_11337 = 11337 + const val CHEWED_BONES_11338 = 11338 + const val MY_NOTES_11339 = 11339 + const val BARBARIAN_SKILLS_11340 = 11340 + const val ANCIENT_PAGE_11341 = 11341 + const val ANCIENT_PAGE_11342 = 11342 + const val ANCIENT_PAGE_11343 = 11343 + const val ANCIENT_PAGE_11344 = 11344 + const val ANCIENT_PAGE_11345 = 11345 + const val ANCIENT_PAGE_11346 = 11346 + const val ANCIENT_PAGE_11347 = 11347 + const val ANCIENT_PAGE_11348 = 11348 + const val ANCIENT_PAGE_11349 = 11349 + const val ANCIENT_PAGE_11350 = 11350 + const val ANCIENT_PAGE_11351 = 11351 + const val ANCIENT_PAGE_11352 = 11352 + const val ANCIENT_PAGE_11353 = 11353 + const val ANCIENT_PAGE_11354 = 11354 + const val ANCIENT_PAGE_11355 = 11355 + const val ANCIENT_PAGE_11356 = 11356 + const val ANCIENT_PAGE_11357 = 11357 + const val ANCIENT_PAGE_11358 = 11358 + const val ANCIENT_PAGE_11359 = 11359 + const val ANCIENT_PAGE_11360 = 11360 + const val ANCIENT_PAGE_11361 = 11361 + const val ANCIENT_PAGE_11362 = 11362 + const val ANCIENT_PAGE_11363 = 11363 + const val ANCIENT_PAGE_11364 = 11364 + const val ANCIENT_PAGE_11365 = 11365 + const val ANCIENT_PAGE_11366 = 11366 + const val BRONZE_HASTA_11367 = 11367 + const val BRONZE_HASTA_11368 = 11368 + const val IRON_HASTA_11369 = 11369 + const val IRON_HASTA_11370 = 11370 + const val STEEL_HASTA_11371 = 11371 + const val STEEL_HASTA_11372 = 11372 + const val MITHRIL_HASTA_11373 = 11373 + const val MITHRIL_HASTA_11374 = 11374 + const val ADAMANT_HASTA_11375 = 11375 + const val ADAMANT_HASTA_11376 = 11376 + const val RUNE_HASTA_11377 = 11377 + const val RUNE_HASTA_11378 = 11378 + const val BRONZE_HASTAP_11379 = 11379 + const val BRONZE_HASTAP_11380 = 11380 + const val BRONZE_HASTAKP_11381 = 11381 + const val BRONZE_HASTAP_PLUS_11382 = 11382 + const val BRONZE_HASTAP_PLUS_11383 = 11383 + const val BRONZE_HASTAP_PLUS_PLUS_11384 = 11384 + const val BRONZE_HASTAP_PLUS_PLUS_11385 = 11385 + const val IRON_HASTAP_11386 = 11386 + const val IRON_HASTAP_11387 = 11387 + const val IRON_HASTAKP_11388 = 11388 + const val IRON_HASTAP_PLUS_11389 = 11389 + const val IRON_HASTAP_PLUS_11390 = 11390 + const val IRON_HASTAP_PLUS_PLUS_11391 = 11391 + const val IRON_HASTAP_PLUS_PLUS_11392 = 11392 + const val STEEL_HASTAP_11393 = 11393 + const val STEEL_HASTAP_11394 = 11394 + const val STEEL_HASTAKP_11395 = 11395 + const val STEEL_HASTAP_PLUS_11396 = 11396 + const val STEEL_HASTAP_PLUS_11397 = 11397 + const val STEEL_HASTAP_PLUS_PLUS_11398 = 11398 + const val STEEL_HASTAP_PLUS_PLUS_11399 = 11399 + const val MITHRIL_HASTAP_11400 = 11400 + const val MITHRIL_HASTAP_11401 = 11401 + const val MITHRIL_HASTAKP_11402 = 11402 + const val MITHRIL_HASTAP_PLUS_11403 = 11403 + const val MITHRIL_HASTAP_PLUS_11404 = 11404 + const val MITHRIL_HASTAP_PLUS_PLUS_11405 = 11405 + const val MITHRIL_HASTAP_PLUS_PLUS_11406 = 11406 + const val ADAMANT_HASTAP_11407 = 11407 + const val ADAMANT_HASTAP_11408 = 11408 + const val ADAMANT_HASTAKP_11409 = 11409 + const val ADAMANT_HASTAP_PLUS_11410 = 11410 + const val ADAMANT_HASTAP_PLUS_11411 = 11411 + const val ADAMANT_HASTAP_PLUS_PLUS_11412 = 11412 + const val ADAMANT_HASTAP_PLUS_PLUS_11413 = 11413 + const val RUNE_HASTAP_11414 = 11414 + const val RUNE_HASTAP_11415 = 11415 + const val RUNE_HASTAKP_11416 = 11416 + const val RUNE_HASTAP_PLUS_11417 = 11417 + const val RUNE_HASTAP_PLUS_11418 = 11418 + const val RUNE_HASTAP_PLUS_PLUS_11419 = 11419 + const val RUNE_HASTAP_PLUS_PLUS_11420 = 11420 + const val NULL_11421 = 11421 + const val NULL_11422 = 11422 + const val NULL_11423 = 11423 + const val NULL_11424 = 11424 + const val NULL_11425 = 11425 + const val NULL_11426 = 11426 + const val FISH_VIAL_11427 = 11427 + const val FISH_VIAL_11428 = 11428 + const val ATTACK_MIX2_11429 = 11429 + const val ATTACK_MIX2_11430 = 11430 + const val ATTACK_MIX1_11431 = 11431 + const val ATTACK_MIX1_11432 = 11432 + const val ANTIPOISON_MIX2_11433 = 11433 + const val ANTIPOISON_MIX2_11434 = 11434 + const val ANTIPOISON_MIX1_11435 = 11435 + const val ANTIPOISON_MIX1_11436 = 11436 + const val RELICYMS_MIX2_11437 = 11437 + const val RELICYMS_MIX2_11438 = 11438 + const val RELICYMS_MIX1_11439 = 11439 + const val RELICYMS_MIX1_11440 = 11440 + const val STRENGTH_MIX1_11441 = 11441 + const val STRENGTH_MIX1_11442 = 11442 + const val STRENGTH_MIX2_11443 = 11443 + const val STRENGTH_MIX2_11444 = 11444 + const val COMBAT_MIX2_11445 = 11445 + const val COMBAT_MIX2_11446 = 11446 + const val COMBAT_MIX1_11447 = 11447 + const val COMBAT_MIX1_11448 = 11448 + const val RESTORE_MIX2_11449 = 11449 + const val RESTORE_MIX2_11450 = 11450 + const val RESTORE_MIX1_11451 = 11451 + const val RESTORE_MIX1_11452 = 11452 + const val ENERGY_MIX2_11453 = 11453 + const val ENERGY_MIX2_11454 = 11454 + const val ENERGY_MIX1_11455 = 11455 + const val ENERGY_MIX1_11456 = 11456 + const val DEFENCE_MIX2_11457 = 11457 + const val DEFENCE_MIX2_11458 = 11458 + const val DEFENCE_MIX1_11459 = 11459 + const val DEFENCE_MIX1_11460 = 11460 + const val AGILITY_MIX2_11461 = 11461 + const val AGILITY_MIX2_11462 = 11462 + const val AGILITY_MIX1_11463 = 11463 + const val AGILITY_MIX1_11464 = 11464 + const val PRAYER_MIX2_11465 = 11465 + const val PRAYER_MIX2_11466 = 11466 + const val PRAYER_MIX1_11467 = 11467 + const val PRAYER_MIX1_11468 = 11468 + const val SUPERATTACK_MIX2_11469 = 11469 + const val SUPERATTACK_MIX2_11470 = 11470 + const val SUPERATTACK_MIX1_11471 = 11471 + const val SUPERATTACK_MIX1_11472 = 11472 + const val ANTI_P_SUPERMIX2_11473 = 11473 + const val ANTI_P_SUPERMIX2_11474 = 11474 + const val ANTI_P_SUPERMIX1_11475 = 11475 + const val ANTI_P_SUPERMIX1_11476 = 11476 + const val FISHING_MIX2_11477 = 11477 + const val FISHING_MIX2_11478 = 11478 + const val FISHING_MIX1_11479 = 11479 + const val FISHING_MIX1_11480 = 11480 + const val SUP_ENERGY_MIX2_11481 = 11481 + const val SUP_ENERGY_MIX2_11482 = 11482 + const val SUP_ENERGY_MIX1_11483 = 11483 + const val SUP_ENERGY_MIX1_11484 = 11484 + const val SUP_STR_MIX2_11485 = 11485 + const val SUP_STR_MIX2_11486 = 11486 + const val SUP_STR_MIX1_11487 = 11487 + const val SUP_STR_MIX1_11488 = 11488 + const val MAGIC_ESS_MIX2_11489 = 11489 + const val MAGIC_ESS_MIX2_11490 = 11490 + const val MAGIC_ESS_MIX1_11491 = 11491 + const val MAGIC_ESS_MIX1_11492 = 11492 + const val SUP_RESTORE_MIX2_11493 = 11493 + const val SUP_RESTORE_MIX2_11494 = 11494 + const val SUP_RESTORE_MIX1_11495 = 11495 + const val SUP_RESTORE_MIX1_11496 = 11496 + const val SUP_DEF_MIX2_11497 = 11497 + const val SUP_DEF_MIX2_11498 = 11498 + const val SUP_DEF_MIX1_11499 = 11499 + const val SUP_DEF_MIX1_11500 = 11500 + const val ANTIDOTE_PLUS_MIX2_11501 = 11501 + const val ANTIDOTE_PLUS_MIX2_11502 = 11502 + const val ANTIDOTE_PLUS_MIX1_11503 = 11503 + const val ANTIDOTE_PLUS_MIX1_11504 = 11504 + const val ANTIFIRE_MIX2_11505 = 11505 + const val ANTIFIRE_MIX2_11506 = 11506 + const val ANTIFIRE_MIX1_11507 = 11507 + const val ANTIFIRE_MIX1_11508 = 11508 + const val RANGING_MIX2_11509 = 11509 + const val RANGING_MIX2_11510 = 11510 + const val RANGING_MIX1_11511 = 11511 + const val RANGING_MIX1_11512 = 11512 + const val MAGIC_MIX2_11513 = 11513 + const val MAGIC_MIX2_11514 = 11514 + const val MAGIC_MIX1_11515 = 11515 + const val MAGIC_MIX1_11516 = 11516 + const val HUNTING_MIX2_11517 = 11517 + const val HUNTING_MIX2_11518 = 11518 + const val HUNTING_MIX1_11519 = 11519 + const val HUNTING_MIX1_11520 = 11520 + const val ZAMORAK_MIX2_11521 = 11521 + const val ZAMORAK_MIX2_11522 = 11522 + const val ZAMORAK_MIX1_11523 = 11523 + const val ZAMORAK_MIX1_11524 = 11524 + const val WIMPY_FEATHER_11525 = 11525 + const val NULL_11526 = 11526 + const val NULL_11527 = 11527 + const val NULL_11528 = 11528 + const val NULL_11529 = 11529 + const val NULL_11530 = 11530 + const val NULL_11531 = 11531 + const val NULL_11532 = 11532 + const val NULL_11533 = 11533 + const val NULL_11534 = 11534 + const val NULL_11535 = 11535 + const val NULL_11536 = 11536 + const val NULL_11537 = 11537 + const val NULL_11538 = 11538 + const val NULL_11539 = 11539 + const val NULL_11540 = 11540 + const val NULL_11541 = 11541 + const val NULL_11542 = 11542 + const val NULL_11543 = 11543 + const val NULL_11544 = 11544 + const val NULL_11545 = 11545 + const val NULL_11546 = 11546 + const val NULL_11547 = 11547 + const val NULL_11548 = 11548 + const val NULL_11549 = 11549 + const val NULL_11550 = 11550 + const val NULL_11551 = 11551 + const val NULL_11552 = 11552 + const val NULL_11553 = 11553 + const val NULL_11554 = 11554 + const val NULL_11555 = 11555 + const val NULL_11556 = 11556 + const val NULL_11557 = 11557 + const val NULL_11558 = 11558 + const val NULL_11559 = 11559 + const val NULL_11560 = 11560 + const val NULL_11561 = 11561 + const val NULL_11562 = 11562 + const val NULL_11563 = 11563 + const val NULL_11564 = 11564 + const val NULL_11565 = 11565 + const val NULL_11566 = 11566 + const val NULL_11567 = 11567 + const val NULL_11568 = 11568 + const val NULL_11569 = 11569 + const val NULL_11570 = 11570 + const val NULL_11571 = 11571 + const val NULL_11572 = 11572 + const val NULL_11573 = 11573 + const val NULL_11574 = 11574 + const val NULL_11575 = 11575 + const val NULL_11576 = 11576 + const val NULL_11577 = 11577 + const val NULL_11578 = 11578 + const val NULL_11579 = 11579 + const val NULL_11580 = 11580 + const val NULL_11581 = 11581 + const val NULL_11582 = 11582 + const val NULL_11583 = 11583 + const val NULL_11584 = 11584 + const val NULL_11585 = 11585 + const val NULL_11586 = 11586 + const val NULL_11587 = 11587 + const val NULL_11588 = 11588 + const val NULL_11589 = 11589 + const val NULL_11590 = 11590 + const val NULL_11591 = 11591 + const val NULL_11592 = 11592 + const val NULL_11593 = 11593 + const val NULL_11594 = 11594 + const val NULL_11595 = 11595 + const val NULL_11596 = 11596 + const val NULL_11597 = 11597 + const val NULL_11598 = 11598 + const val NULL_11599 = 11599 + const val NULL_11600 = 11600 + const val NULL_11601 = 11601 + const val NULL_11602 = 11602 + const val NULL_11603 = 11603 + const val NULL_11604 = 11604 + const val NULL_11605 = 11605 + const val NULL_11606 = 11606 + const val NULL_11607 = 11607 + const val NULL_11608 = 11608 + const val NULL_11609 = 11609 + const val NULL_11610 = 11610 + const val NULL_11611 = 11611 + const val NULL_11612 = 11612 + const val NULL_11613 = 11613 + const val NULL_11614 = 11614 + const val NULL_11615 = 11615 + const val NULL_11616 = 11616 + const val NULL_11617 = 11617 + const val NULL_11618 = 11618 + const val NULL_11619 = 11619 + const val NULL_11620 = 11620 + const val NULL_11621 = 11621 + const val NULL_11622 = 11622 + const val NULL_11623 = 11623 + const val NULL_11624 = 11624 + const val NULL_11625 = 11625 + const val NULL_11626 = 11626 + const val NULL_11627 = 11627 + const val NULL_11628 = 11628 + const val NULL_11629 = 11629 + const val NULL_11630 = 11630 + const val NULL_11631 = 11631 + const val NULL_11632 = 11632 + const val NULL_11633 = 11633 + const val NULL_11634 = 11634 + const val NULL_11635 = 11635 + const val NULL_11636 = 11636 + const val NULL_11637 = 11637 + const val NULL_11638 = 11638 + const val NULL_11639 = 11639 + const val BOOK_OF_KNOWLEDGE_11640 = 11640 + const val NULL_11641 = 11641 + const val NULL_11642 = 11642 + const val NULL_11643 = 11643 + const val NULL_11644 = 11644 + const val NULL_11645 = 11645 + const val NULL_11646 = 11646 + const val NULL_11647 = 11647 + const val NULL_11648 = 11648 + const val NULL_11649 = 11649 + const val NULL_11650 = 11650 + const val NULL_11651 = 11651 + const val NULL_11652 = 11652 + const val NULL_11653 = 11653 + const val NULL_11654 = 11654 + const val ASTRONOMY_BOOK_11655 = 11655 + const val GLASSBLOWING_BOOK_11656 = 11656 + const val GLASSBLOWING_BOOK_11657 = 11657 + const val NULL_11658 = 11658 + const val NULL_11659 = 11659 + const val NULL_11660 = 11660 + const val NULL_11661 = 11661 + const val NULL_11662 = 11662 + const val VOID_MAGE_HELM_11663 = 11663 + const val VOID_RANGER_HELM_11664 = 11664 + const val VOID_MELEE_HELM_11665 = 11665 + const val VOID_SEAL8_11666 = 11666 + const val VOID_SEAL7_11667 = 11667 + const val VOID_SEAL6_11668 = 11668 + const val VOID_SEAL5_11669 = 11669 + const val VOID_SEAL4_11670 = 11670 + const val VOID_SEAL3_11671 = 11671 + const val VOID_SEAL2_11672 = 11672 + const val VOID_SEAL1_11673 = 11673 + const val VOID_MAGE_HELM_11674 = 11674 + const val VOID_RANGER_HELM_11675 = 11675 + const val VOID_MELEE_HELM_11676 = 11676 + const val EXPLORERS_NOTES_11677 = 11677 + const val BLACK_KNIGHT_HELM_11678 = 11678 + const val ANTIQUE_LAMP_11679 = 11679 + const val ADDRESS_FORM_11680 = 11680 + const val SCRAP_PAPER_11681 = 11681 + const val HAIR_CLIP_11682 = 11682 + const val NULL_11683 = 11683 + const val NULL_11684 = 11684 + const val NULL_11685 = 11685 + const val GODSWORD_SHARDS_11686 = 11686 + const val GODSWORD_SHARDS_11687 = 11687 + const val GODSWORD_SHARDS_11688 = 11688 + const val GODSWORD_SHARDS_11689 = 11689 + const val GODSWORD_BLADE_11690 = 11690 + const val GODSWORD_BLADE_11691 = 11691 + const val GODSWORD_SHARDS_11692 = 11692 + const val GODSWORD_SHARDS_11693 = 11693 + const val ARMADYL_GODSWORD_11694 = 11694 + const val ARMADYL_GODSWORD_11695 = 11695 + const val BANDOS_GODSWORD_11696 = 11696 + const val BANDOS_GODSWORD_11697 = 11697 + const val SARADOMIN_GODSWORD_11698 = 11698 + const val SARADOMIN_GODSWORD_11699 = 11699 + const val ZAMORAK_GODSWORD_11700 = 11700 + const val ZAMORAK_GODSWORD_11701 = 11701 + const val ARMADYL_HILT_11702 = 11702 + const val ARMADYL_HILT_11703 = 11703 + const val BANDOS_HILT_11704 = 11704 + const val BANDOS_HILT_11705 = 11705 + const val SARADOMIN_HILT_11706 = 11706 + const val SARADOMIN_HILT_11707 = 11707 + const val ZAMORAK_HILT_11708 = 11708 + const val ZAMORAK_HILT_11709 = 11709 + const val GODSWORD_SHARD_1_11710 = 11710 + const val GODSWORD_SHARD_1_11711 = 11711 + const val GODSWORD_SHARD_2_11712 = 11712 + const val GODSWORD_SHARD_2_11713 = 11713 + const val GODSWORD_SHARD_3_11714 = 11714 + const val GODSWORD_SHARD_3_11715 = 11715 + const val ZAMORAKIAN_SPEAR_11716 = 11716 + const val ZAMORAKIAN_SPEAR_11717 = 11717 + const val ARMADYL_HELMET_11718 = 11718 + const val ARMADYL_HELMET_11719 = 11719 + const val ARMADYL_CHESTPLATE_11720 = 11720 + const val ARMADYL_CHESTPLATE_11721 = 11721 + const val ARMADYL_PLATESKIRT_11722 = 11722 + const val ARMADYL_PLATESKIRT_11723 = 11723 + const val BANDOS_CHESTPLATE_11724 = 11724 + const val BANDOS_CHESTPLATE_11725 = 11725 + const val BANDOS_TASSETS_11726 = 11726 + const val BANDOS_TASSETS_11727 = 11727 + const val BANDOS_BOOTS_11728 = 11728 + const val BANDOS_BOOTS_11729 = 11729 + const val SARADOMIN_SWORD_11730 = 11730 + const val SARADOMIN_SWORD_11731 = 11731 + const val DRAGON_BOOTS_11732 = 11732 + const val DRAGON_BOOTS_11733 = 11733 + const val KNIGHTS_NOTES_11734 = 11734 + const val KNIGHTS_NOTES_11735 = 11735 + const val STEAM_BATTLESTAFF_11736 = 11736 + const val STEAM_BATTLESTAFF_11737 = 11737 + const val MYSTIC_STEAM_STAFF_11738 = 11738 + const val MYSTIC_STEAM_STAFF_11739 = 11739 + const val PICTURE_11740 = 11740 + const val PICTURE_11741 = 11741 + const val PICTURE_11742 = 11742 + const val PICTURE_11743 = 11743 + const val PICTURE_11744 = 11744 + const val PICTURE_11745 = 11745 + const val AGILITY_JUMP_11746 = 11746 + const val A_KEY_TO_A_CHEST_11747 = 11747 + const val STRONGROOM_KEY_11748 = 11748 + const val CRYSTAL_CHIME_11749 = 11749 + const val YEWNOCKS_NOTES_11750 = 11750 + const val NULL_11751 = 11751 + const val NULL_11752 = 11752 + const val ANTIQUE_LAMP_11753 = 11753 + const val ANTIQUE_LAMP_11754 = 11754 + const val ANTIQUE_LAMP_11755 = 11755 + const val VARROCK_ARMOUR_1_11756 = 11756 + const val VARROCK_ARMOUR_2_11757 = 11757 + const val VARROCK_ARMOUR_3_11758 = 11758 + const val NULL_11759 = 11759 + const val LOGS_11760 = 11760 + const val LOCKED_DIARY_11761 = 11761 + const val UNLOCKED_DIARY_11762 = 11762 + const val HAND_11763 = 11763 + const val FOOT_11764 = 11764 + const val TORSO_11765 = 11765 + const val LEFT_ARM_11766 = 11766 + const val RIGHT_ARM_11767 = 11767 + const val LEFT_LEG_11768 = 11768 + const val RIGHT_LEG_11769 = 11769 + const val ROOT_CUTTING_11770 = 11770 + const val ROOT_CUTTING_11771 = 11771 + const val ROOT_CUTTING_11772 = 11772 + const val ROOT_CUTTING_11773 = 11773 + const val ROOT_CUTTING_11774 = 11774 + const val WILTED_CUTTING_11775 = 11775 + const val POTTED_ROOT_11776 = 11776 + const val SEALED_POT_11777 = 11777 + const val JADE_VINE_SEED_11778 = 11778 + const val NULL_11779 = 11779 + const val THE_GRIM_REAPERS_DIARY_11780 = 11780 + const val GRIMS_ROBE_11781 = 11781 + const val LAST_WILL_AND_TESTAMENT_11782 = 11782 + const val HUMAN_BONES_11783 = 11783 + const val SERVANTS_SKULL_11784 = 11784 + const val HOURGLASS_11785 = 11785 + const val SCYTHE_SHARPENER_11786 = 11786 + const val HUMAN_EYE_11787 = 11787 + const val VOICE_OF_DOOM_POTION_11788 = 11788 + const val GRIM_REAPER_HOOD_11789 = 11789 + const val GRIM_REAPER_HOOD_11790 = 11790 + const val WHITE_GOBLIN_MAIL_11791 = 11791 + const val GRUBFOOT_11792 = 11792 + const val ZANIK_11793 = 11793 + const val PLAIN_OF_MUD_SPHERE_11794 = 11794 + const val EKELESHUUN_KEY_11795 = 11795 + const val NAROGOSHUUN_KEY_11796 = 11796 + const val HUZAMOGAARB_KEY_11797 = 11797 + const val SARAGORGAK_KEY_11798 = 11798 + const val HOROGOTHGAR_KEY_11799 = 11799 + const val YURKOLGOKH_KEY_11800 = 11800 + const val NULL_11801 = 11801 + const val SNOTHEADS_BONE_11802 = 11802 + const val SNAILFEETS_BONE_11803 = 11803 + const val MOSSCHINS_BONE_11804 = 11804 + const val REDEYESS_BONE_11805 = 11805 + const val STRONGBONESS_BONE_11806 = 11806 + const val PHARMAKOS_BERRIES_11807 = 11807 + const val WHITEFISH_11808 = 11808 + const val GOBLIN_POTION_4_11809 = 11809 + const val GOBLIN_POTION_3_11810 = 11810 + const val GOBLIN_POTION_2_11811 = 11811 + const val GOBLIN_POTION_1_11812 = 11812 + const val TINDERBOX_11813 = 11813 + const val BRONZE_ARMOUR_SET_L_11814 = 11814 + const val BRONZE_ARMOUR_SET_L_11815 = 11815 + const val BRONZE_ARMOUR_SET_SK_11816 = 11816 + const val BRONZE_ARMOUR_SET_SK_11817 = 11817 + const val IRON_ARMOUR_SET_L_11818 = 11818 + const val IRON_ARMOUR_SET_L_11819 = 11819 + const val IRON_ARMOUR_SET_SK_11820 = 11820 + const val IRON_ARMOUR_SET_SK_11821 = 11821 + const val STEEL_ARMOUR_SET_L_11822 = 11822 + const val STEEL_ARMOUR_SET_L_11823 = 11823 + const val STEEL_ARMOUR_SET_SK_11824 = 11824 + const val STEEL_ARMOUR_SET_SK_11825 = 11825 + const val BLACK_ARMOUR_SET_L_11826 = 11826 + const val BLACK_ARMOUR_SET_L_11827 = 11827 + const val BLACK_ARMOUR_SET_SK_11828 = 11828 + const val BLACK_ARMOUR_SET_SK_11829 = 11829 + const val MITHRIL_ARMOUR_SET_L_11830 = 11830 + const val MITHRIL_ARMOUR_SET_L_11831 = 11831 + const val MITHRIL_ARMOUR_SET_SK_11832 = 11832 + const val MITHRIL_ARMOUR_SET_SK_11833 = 11833 + const val ADAMANT_ARMOUR_SET_L_11834 = 11834 + const val ADAMANT_ARMOUR_SET_L_11835 = 11835 + const val ADAMANT_ARMOUR_SET_SK_11836 = 11836 + const val ADAMANT_ARMOUR_SET_SK_11837 = 11837 + const val RUNE_ARMOUR_SET_L_11838 = 11838 + const val RUNE_ARMOUR_SET_L_11839 = 11839 + const val RUNE_ARMOUR_SET_SK_11840 = 11840 + const val RUNE_ARMOUR_SET_SK_11841 = 11841 + const val DRAGON_CHAIN_ARMOUR_SET_L_11842 = 11842 + const val DRAGON_CHAIN_ARMOUR_SET_L_11843 = 11843 + const val DRAGON_CHAIN_ARMOUR_SET_SK_11844 = 11844 + const val DRAGON_CHAIN_ARMOUR_SET_SK_11845 = 11845 + const val BARROWS___AHRIMS_SET_11846 = 11846 + const val BARROWS___AHRIMS_SET_11847 = 11847 + const val BARROWS___DHAROKS_SET_11848 = 11848 + const val BARROWS___DHAROKS_SET_11849 = 11849 + const val BARROWS___GUTHANS_SET_11850 = 11850 + const val BARROWS___GUTHANS_SET_11851 = 11851 + const val BARROWS___KARILS_SET_11852 = 11852 + const val BARROWS___KARILS_SET_11853 = 11853 + const val BARROWS___TORAGS_SET_11854 = 11854 + const val BARROWS___TORAGS_SET_11855 = 11855 + const val BARROWS___VERACS_SET_11856 = 11856 + const val BARROWS___VERACS_SET_11857 = 11857 + const val THIRD_AGE_MELEE_SET_11858 = 11858 + const val THIRD_AGE_MELEE_SET_11859 = 11859 + const val THIRD_AGE_RANGER_SET_11860 = 11860 + const val THIRD_AGE_RANGER_SET_11861 = 11861 + const val THIRD_AGE_MAGE_SET_11862 = 11862 + const val THIRD_AGE_MAGE_SET_11863 = 11863 + const val GREEN_DRAGONHIDE_SET_11864 = 11864 + const val GREEN_DRAGONHIDE_SET_11865 = 11865 + const val BLUE_DRAGONHIDE_SET_11866 = 11866 + const val BLUE_DRAGONHIDE_SET_11867 = 11867 + const val RED_DRAGONHIDE_SET_11868 = 11868 + const val RED_DRAGONHIDE_SET_11869 = 11869 + const val BLACK_DRAGONHIDE_SET_11870 = 11870 + const val BLACK_DRAGONHIDE_SET_11871 = 11871 + const val MYSTIC_ROBES_SET_11872 = 11872 + const val MYSTIC_ROBES_SET_11873 = 11873 + const val INFINITY_ROBES_SET_11874 = 11874 + const val INFINITY_ROBES_SET_11875 = 11875 + const val SPLITBARK_ARMOUR_SET_11876 = 11876 + const val SPLITBARK_ARMOUR_SET_11877 = 11877 + const val BLACK_TRIMMED_ARMOUR_SET_L_11878 = 11878 + const val BLACK_TRIMMED_ARMOUR_SET_L_11879 = 11879 + const val BLACK_TRIMMED_ARMOUR_SET_SK_11880 = 11880 + const val BLACK_TRIMMED_ARMOUR_SET_SK_11881 = 11881 + const val BLACK_GOLD_TRIMMED_ARMOUR_SET_L_11882 = 11882 + const val BLACK_GOLD_TRIMMED_ARMOUR_SET_L_11883 = 11883 + const val BLACK_GOLD_TRIMMED_ARMOUR_SET_SK_11884 = 11884 + const val BLACK_GOLD_TRIMMED_ARMOUR_SET_SK_11885 = 11885 + const val ADAMANT_TRIMMED_ARMOUR_SET_L_11886 = 11886 + const val ADAMANT_TRIMMED_ARMOUR_SET_L_11887 = 11887 + const val ADAMANT_TRIMMED_ARMOUR_SET_SK_11888 = 11888 + const val ADAMANT_TRIMMED_ARMOUR_SET_SK_11889 = 11889 + const val ADAMANT_GOLD_TRIMMED_ARMOUR_SET_L_11890 = 11890 + const val ADAMANT_GOLD_TRIMMED_ARMOUR_SET_L_11891 = 11891 + const val ADAMANT_GOLD_TRIMMED_ARMOUR_SET_SK_11892 = 11892 + const val ADAMANT_GOLD_TRIMMED_ARMOUR_SET_SK_11893 = 11893 + const val RUNE_TRIMMED_ARMOUR_SET_L_11894 = 11894 + const val RUNE_TRIMMED_ARMOUR_SET_L_11895 = 11895 + const val RUNE_TRIMMED_ARMOUR_SET_SK_11896 = 11896 + const val RUNE_TRIMMED_ARMOUR_SET_SK_11897 = 11897 + const val RUNE_GOLD_TRIMMED_ARMOUR_SET_L_11898 = 11898 + const val RUNE_GOLD_TRIMMED_ARMOUR_SET_L_11899 = 11899 + const val RUNE_GOLD_TRIMMED_ARMOUR_SET_SK_11900 = 11900 + const val RUNE_GOLD_TRIMMED_ARMOUR_SET_SK_11901 = 11901 + const val ENCHANTED_SET_11902 = 11902 + const val ENCHANTED_SET_11903 = 11903 + const val TRIMMED_BLUE_WIZARD_SET_11904 = 11904 + const val TRIMMED_BLUE_WIZARD_SET_11905 = 11905 + const val GOLD_TRIMMED_BLUE_WIZARD_SET_11906 = 11906 + const val GOLD_TRIMMED_BLUE_WIZARD_SET_11907 = 11907 + const val TRIMMED_LEATHER_ARMOUR_SET_11908 = 11908 + const val TRIMMED_LEATHER_ARMOUR_SET_11909 = 11909 + const val GOLD_TRIMMED_LEATHER_ARMOUR_SET_11910 = 11910 + const val GOLD_TRIMMED_LEATHER_ARMOUR_SET_11911 = 11911 + const val GREEN_DHIDE_TRIMMED_SET_11912 = 11912 + const val GREEN_DHIDE_TRIMMED_SET_11913 = 11913 + const val GREEN_DHIDE_GOLD_TRIMMED_SET_11914 = 11914 + const val GREEN_DHIDE_GOLD_TRIMMED_SET_11915 = 11915 + const val BLUE_DHIDE_TRIMMED_SET_11916 = 11916 + const val BLUE_DHIDE_TRIMMED_SET_11917 = 11917 + const val BLUE_DHIDE_GOLD_TRIMMED_SET_11918 = 11918 + const val BLUE_DHIDE_GOLD_TRIMMED_SET_11919 = 11919 + const val GREEN_DHIDE_BLESSED_SET_11920 = 11920 + const val GREEN_DHIDE_BLESSED_SET_11921 = 11921 + const val BLUE_DHIDE_BLESSED_SET_11922 = 11922 + const val BLUE_DHIDE_BLESSED_SET_11923 = 11923 + const val RED_DHIDE_BLESSED_SET_11924 = 11924 + const val RED_DHIDE_BLESSED_SET_11925 = 11925 + const val GUTHIX_ARMOUR_SET_L_11926 = 11926 + const val GUTHIX_ARMOUR_SET_L_11927 = 11927 + const val SARADOMIN_ARMOUR_SET_L_11928 = 11928 + const val SARADOMIN_ARMOUR_SET_L_11929 = 11929 + const val ZAMORAK_ARMOUR_SET_L_11930 = 11930 + const val ZAMORAK_ARMOUR_SET_L_11931 = 11931 + const val GUTHIX_ARMOUR_SET_SK_11932 = 11932 + const val GUTHIX_ARMOUR_SET_SK_11933 = 11933 + const val SARADOMIN_ARMOUR_SET_SK_11934 = 11934 + const val SARADOMIN_ARMOUR_SET_SK_11935 = 11935 + const val ZAMORAK_ARMOUR_SET_SK_11936 = 11936 + const val ZAMORAK_ARMOUR_SET_SK_11937 = 11937 + const val GILDED_ARMOUR_SET_L_11938 = 11938 + const val GILDED_ARMOUR_SET_L_11939 = 11939 + const val GILDED_ARMOUR_SET_SK_11940 = 11940 + const val GILDED_ARMOUR_SET_SK_11941 = 11941 + const val ROCKSHELL_ARMOUR_SET_11942 = 11942 + const val ROCKSHELL_ARMOUR_SET_11943 = 11943 + const val SPINED_ARMOUR_SET_11944 = 11944 + const val SPINED_ARMOUR_SET_11945 = 11945 + const val SKELETAL_ARMOUR_SET_11946 = 11946 + const val SKELETAL_ARMOUR_SET_11947 = 11947 + const val NULL_11948 = 11948 + const val SNOW_GLOBE_11949 = 11949 + const val SNOW_GLOBE_11950 = 11950 + const val SNOWBALL_11951 = 11951 + const val ICE_SWORD_11952 = 11952 + const val WINTER_STAFF_11953 = 11953 + const val HOLLY_BOW_11954 = 11954 + const val BARBARIAN_SNOWMAN_HAT_11955 = 11955 + const val DRAGON_SNOWMAN_HAT_11956 = 11956 + const val DWARF_SNOWMAN_HAT_11957 = 11957 + const val PIRATE_SNOWMAN_HAT_11958 = 11958 + const val SNOWMAN_TOP_HAT_11959 = 11959 + const val LIGHT_MYSTIC_ROBES_SET_11960 = 11960 + const val LIGHT_MYSTIC_ROBES_SET_11961 = 11961 + const val DARK_MYSTIC_ROBES_SET_11962 = 11962 + const val DARK_MYSTIC_ROBES_SET_11963 = 11963 + const val RAVEN_EGG_11964 = 11964 + const val VULTURE_EGG_11965 = 11965 + const val BIRDS_NEST_11966 = 11966 + const val DWARF_CANNON_SET_11967 = 11967 + const val DWARF_CANNON_SET_11968 = 11968 + const val ENCHANTED_WATER_TIARA_11969 = 11969 + const val SMELLY_CRATE_11970 = 11970 + const val FULL_CRATE_11971 = 11971 + const val EMPTY_CRATE_11972 = 11972 + const val SCABARAS_RESEARCH_11973 = 11973 + const val ARTEFACT_RECEIPT_11974 = 11974 + const val SCABARITE_NOTES_11975 = 11975 + const val SCABARITE_NOTES_11976 = 11976 + const val SCABARITE_NOTES_11977 = 11977 + const val SCABARITE_NOTES_11978 = 11978 + const val SCABARITE_NOTES_11979 = 11979 + const val SCABARITE_NOTES_11980 = 11980 + const val SCABARITE_NOTES_11981 = 11981 + const val SCABARITE_NOTES_11982 = 11982 + const val SCABARITE_NOTES_11983 = 11983 + const val SCABARITE_NOTES_11984 = 11984 + const val SCABARITE_NOTES_11985 = 11985 + const val SCABARITE_NOTES_11986 = 11986 + const val SCABARITE_NOTES_11987 = 11987 + const val SCABARITE_NOTES_11988 = 11988 + const val SCABARITE_NOTES_11989 = 11989 + const val SCABARITE_NOTES_11990 = 11990 + const val SCABARITE_NOTES_11991 = 11991 + const val SCABARITE_NOTES_11992 = 11992 + const val SCABARITE_NOTES_11993 = 11993 + const val SCABARITE_KEY_11994 = 11994 + const val OXIDISED_DAGGER_11995 = 11995 + const val OXIDISED_MEDIUM_HELM_11996 = 11996 + const val OXIDISED_SWORD_11997 = 11997 + const val OXIDISED_SCIMITAR_11998 = 11998 + const val OXIDISED_LONGSWORD_11999 = 11999 + const val OXIDISED_FULL_HELM_12000 = 12000 + const val OXIDISED_SQUARE_SHIELD_12001 = 12001 + const val OXIDISED_CHAINBODY_12002 = 12002 + const val OXIDISED_KITESHIELD_12003 = 12003 + const val OXIDISED_TWO_HANDED_SWORD_12004 = 12004 + const val OXIDISED_PLATELEGS_12005 = 12005 + const val OXIDISED_PLATESKIRT_12006 = 12006 + const val SPIRIT_TERRORBIRD_POUCH_12007 = 12007 + const val SPIRIT_TERRORBIRD_POUCH_12008 = 12008 + const val GRANITE_CRAB_POUCH_12009 = 12009 + const val GRANITE_CRAB_POUCH_12010 = 12010 + const val PRAYING_MANTIS_POUCH_12011 = 12011 + const val PRAYING_MANTIS_POUCH_12012 = 12012 + const val GIANT_ENT_POUCH_12013 = 12013 + const val GIANT_ENT_POUCH_12014 = 12014 + const val SPIRIT_COBRA_POUCH_12015 = 12015 + const val SPIRIT_COBRA_POUCH_12016 = 12016 + const val SPIRIT_DAGANNOTH_POUCH_12017 = 12017 + const val SPIRIT_DAGANNOTH_POUCH_12018 = 12018 + const val THORNY_SNAIL_POUCH_12019 = 12019 + const val THORNY_SNAIL_POUCH_12020 = 12020 + const val BEAVER_POUCH_12021 = 12021 + const val BEAVER_POUCH_12022 = 12022 + const val KARAM_OVERLORD_POUCH_12023 = 12023 + const val KARAM_OVERLORD_POUCH_12024 = 12024 + const val HYDRA_POUCH_12025 = 12025 + const val HYDRA_POUCH_12026 = 12026 + const val SPIRIT_JELLY_POUCH_12027 = 12027 + const val SPIRIT_JELLY_POUCH_12028 = 12028 + const val BUNYIP_POUCH_12029 = 12029 + const val BUNYIP_POUCH_12030 = 12030 + const val WAR_TORTOISE_POUCH_12031 = 12031 + const val WAR_TORTOISE_POUCH_12032 = 12032 + const val FRUIT_BAT_POUCH_12033 = 12033 + const val FRUIT_BAT_POUCH_12034 = 12034 + const val ABYSSAL_PARASITE_POUCH_12035 = 12035 + const val ABYSSAL_PARASITE_POUCH_12036 = 12036 + const val ABYSSAL_LURKER_POUCH_12037 = 12037 + const val ABYSSAL_LURKER_POUCH_12038 = 12038 + const val UNICORN_STALLION_POUCH_12039 = 12039 + const val UNICORN_STALLION_POUCH_12040 = 12040 + const val MAGPIE_POUCH_12041 = 12041 + const val MAGPIE_POUCH_12042 = 12042 + const val DREADFOWL_POUCH_12043 = 12043 + const val DREADFOWL_POUCH_12044 = 12044 + const val STRANGER_PLANT_POUCH_12045 = 12045 + const val STRANGER_PLANT_POUCH_12046 = 12046 + const val SPIRIT_WOLF_POUCH_12047 = 12047 + const val SPIRIT_WOLF_POUCH_12048 = 12048 + const val DESERT_WYRM_POUCH_12049 = 12049 + const val DESERT_WYRM_POUCH_12050 = 12050 + const val EVIL_TURNIP_POUCH_12051 = 12051 + const val EVIL_TURNIP_POUCH_12052 = 12052 + const val VAMPIRE_BAT_POUCH_12053 = 12053 + const val VAMPIRE_BAT_POUCH_12054 = 12054 + const val SPIRIT_SCORPION_POUCH_12055 = 12055 + const val SPIRIT_SCORPION_POUCH_12056 = 12056 + const val ARCTIC_BEAR_POUCH_12057 = 12057 + const val ARCTIC_BEAR_POUCH_12058 = 12058 + const val SPIRIT_SPIDER_POUCH_12059 = 12059 + const val SPIRIT_SPIDER_POUCH_12060 = 12060 + const val BLOATED_LEECH_POUCH_12061 = 12061 + const val BLOATED_LEECH_POUCH_12062 = 12062 + const val SPIRIT_KALPHITE_POUCH_12063 = 12063 + const val SPIRIT_KALPHITE_POUCH_12064 = 12064 + const val HONEY_BADGER_POUCH_12065 = 12065 + const val HONEY_BADGER_POUCH_12066 = 12066 + const val ALBINO_RAT_POUCH_12067 = 12067 + const val ALBINO_RAT_POUCH_12068 = 12068 + const val GRANITE_LOBSTER_POUCH_12069 = 12069 + const val GRANITE_LOBSTER_POUCH_12070 = 12070 + const val MACAW_POUCH_12071 = 12071 + const val MACAW_POUCH_12072 = 12072 + const val BRONZE_MINOTAUR_POUCH_12073 = 12073 + const val BRONZE_MINOTAUR_POUCH_12074 = 12074 + const val IRON_MINOTAUR_POUCH_12075 = 12075 + const val IRON_MINOTAUR_POUCH_12076 = 12076 + const val STEEL_MINOTAUR_POUCH_12077 = 12077 + const val STEEL_MINOTAUR_POUCH_12078 = 12078 + const val MITHRIL_MINOTAUR_POUCH_12079 = 12079 + const val MITHRIL_MINOTAUR_POUCH_12080 = 12080 + const val ADAMANT_MINOTAUR_POUCH_12081 = 12081 + const val ADAMANT_MINOTAUR_POUCH_12082 = 12082 + const val RUNE_MINOTAUR_POUCH_12083 = 12083 + const val RUNE_MINOTAUR_POUCH_12084 = 12084 + const val SMOKE_DEVIL_POUCH_12085 = 12085 + const val SMOKE_DEVIL_POUCH_12086 = 12086 + const val BULL_ANT_POUCH_12087 = 12087 + const val BULL_ANT_POUCH_12088 = 12088 + const val WOLPERTINGER_POUCH_12089 = 12089 + const val WOLPERTINGER_POUCH_12090 = 12090 + const val COMPOST_MOUND_POUCH_12091 = 12091 + const val COMPOST_MOUND_POUCH_12092 = 12092 + const val PACK_YAK_POUCH_12093 = 12093 + const val PACK_YAK_POUCH_12094 = 12094 + const val SP_COCKATRICE_POUCH_12095 = 12095 + const val SP_COCKATRICE_POUCH_12096 = 12096 + const val SP_GUTHATRICE_POUCH_12097 = 12097 + const val SP_GUTHATRICE_POUCH_12098 = 12098 + const val SP_SARATRICE_POUCH_12099 = 12099 + const val SP_SARATRICE_POUCH_12100 = 12100 + const val SP_ZAMATRICE_POUCH_12101 = 12101 + const val SP_ZAMATRICE_POUCH_12102 = 12102 + const val SP_PENGATRICE_POUCH_12103 = 12103 + const val SP_PENGATRICE_POUCH_12104 = 12104 + const val SP_CORAXATRICE_POUCH_12105 = 12105 + const val SP_CORAXATRICE_POUCH_12106 = 12106 + const val SP_VULATRICE_POUCH_12107 = 12107 + const val SP_VULATRICE_POUCH_12108 = 12108 + const val COCKATRICE_EGG_12109 = 12109 + const val COCKATRICE_EGG_12110 = 12110 + const val GUTHATRICE_EGG_12111 = 12111 + const val GUTHATRICE_EGG_12112 = 12112 + const val SARATRICE_EGG_12113 = 12113 + const val SARATRICE_EGG_12114 = 12114 + const val ZAMATRICE_EGG_12115 = 12115 + const val ZAMATRICE_EGG_12116 = 12116 + const val PENGATRICE_EGG_12117 = 12117 + const val PENGATRICE_EGG_12118 = 12118 + const val CORAXATRICE_EGG_12119 = 12119 + const val CORAXATRICE_EGG_12120 = 12120 + const val VULATRICE_EGG_12121 = 12121 + const val VULATRICE_EGG_12122 = 12122 + const val BARKER_TOAD_POUCH_12123 = 12123 + const val BARKER_TOAD_POUCH_12124 = 12124 + const val FLIES_12125 = 12125 + const val FLIES_12126 = 12126 + const val BEETLE_BITS_12127 = 12127 + const val BEETLE_BITS_12128 = 12128 + const val GROUND_FISHING_BAIT_12129 = 12129 + const val NUTS_12130 = 12130 + const val NUTS_12131 = 12131 + const val TRUFFLE_12132 = 12132 + const val TRUFFLE_12133 = 12133 + const val EVIL_TURNIP_12134 = 12134 + const val EVIL_TURNIP_12135 = 12135 + const val TWO_THIRDS_EVIL_TURNIP_12136 = 12136 + const val TWO_THIRDS_EVIL_TURNIP_12137 = 12137 + const val ONE_THIRD_EVIL_TURNIP_12138 = 12138 + const val ONE_THIRD_EVIL_TURNIP_12139 = 12139 + const val SUMMONING_POTION4_12140 = 12140 + const val SUMMONING_POTION4_12141 = 12141 + const val SUMMONING_POTION3_12142 = 12142 + const val SUMMONING_POTION3_12143 = 12143 + const val SUMMONING_POTION2_12144 = 12144 + const val SUMMONING_POTION2_12145 = 12145 + const val SUMMONING_POTION1_12146 = 12146 + const val SUMMONING_POTION1_12147 = 12147 + const val EVIL_TURNIP_SEED_12148 = 12148 + const val NULL_12149 = 12149 + const val NULL_12150 = 12150 + const val NULL_12151 = 12151 + const val NULL_12152 = 12152 + const val CARVED_EVIL_TURNIP_12153 = 12153 + const val CARVED_EVIL_TURNIP_12154 = 12154 + const val POUCH_12155 = 12155 + const val HONEYCOMB_12156 = 12156 + const val HONEYCOMB_12157 = 12157 + const val GOLD_CHARM_12158 = 12158 + const val GREEN_CHARM_12159 = 12159 + const val CRIMSON_CHARM_12160 = 12160 + const val ABYSSAL_CHARM_12161 = 12161 + const val TALON_BEAST_CHARM_12162 = 12162 + const val BLUE_CHARM_12163 = 12163 + const val RAVAGER_CHARM_12164 = 12164 + const val SHIFTER_CHARM_12165 = 12165 + const val SPINNER_CHARM_12166 = 12166 + const val TORCHER_CHARM_12167 = 12167 + const val OBSIDIAN_CHARM_12168 = 12168 + const val SUMMONING_CAPE_12169 = 12169 + const val SUMMONING_CAPET_12170 = 12170 + const val SUMMONING_HOOD_12171 = 12171 + const val CLEAN_SPIRIT_WEED_12172 = 12172 + const val CLEAN_SPIRIT_WEED_12173 = 12173 + const val GRIMY_SPIRIT_WEED_12174 = 12174 + const val GRIMY_SPIRIT_WEED_12175 = 12175 + const val SPIRIT_WEED_SEED_12176 = 12176 + const val NULL_12177 = 12177 + const val NULL_12178 = 12178 + const val NULL_12179 = 12179 + const val NULL_12180 = 12180 + const val SPIRIT_WEED_POTIONUNF_12181 = 12181 + const val SPIRIT_WEED_POTIONUNF_12182 = 12182 + const val SPIRIT_SHARDS_12183 = 12183 + const val GECKO_12184 = 12184 + const val SARADOMIN_OWL_12185 = 12185 + const val ZAMORAK_HAWK_12186 = 12186 + const val GUTHIX_RAPTOR_12187 = 12187 + const val PENGUIN_12188 = 12188 + const val BIRD_12189 = 12189 + const val VULTURE_12190 = 12190 + const val TERRIER_PUPPY_12191 = 12191 + const val GREYHOUND_PUPPY_12192 = 12192 + const val LABRADOR_PUPPY_12193 = 12193 + const val DALMATIAN_PUPPY_12194 = 12194 + const val SHEEPDOG_PUPPY_12195 = 12195 + const val BULLDOG_PUPPY_12196 = 12196 + const val DRAGON_HATCHLING_12197 = 12197 + const val BABY_GIANT_CRAB_12198 = 12198 + const val BABY_RACCOON_12199 = 12199 + const val SQUIRREL_12200 = 12200 + const val MONKEY_12201 = 12201 + const val NULL_12202 = 12202 + const val CHAMELEON_12203 = 12203 + const val ANTLERS_12204 = 12204 + const val ANTLERS_12205 = 12205 + const val ANTLERS_CHARGED_12206 = 12206 + const val LIZARD_SKULL_12207 = 12207 + const val LIZARD_SKULL_12208 = 12208 + const val LIZARD_SKULL_CHARGED_12209 = 12209 + const val FEATHER_HEADDRESS_12210 = 12210 + const val FEATHER_HEADDRESS_12211 = 12211 + const val FEATHER_HEADDRESS_CHARGED_12212 = 12212 + const val FEATHER_HEADDRESS_12213 = 12213 + const val FEATHER_HEADDRESS_12214 = 12214 + const val FEATHER_HEADDRESS_CHARGED_12215 = 12215 + const val FEATHER_HEADDRESS_12216 = 12216 + const val FEATHER_HEADDRESS_12217 = 12217 + const val FEATHER_HEADDRESS_CHARGED_12218 = 12218 + const val FEATHER_HEADDRESS_12219 = 12219 + const val FEATHER_HEADDRESS_12220 = 12220 + const val FEATHER_HEADDRESS_CHARGED_12221 = 12221 + const val FEATHER_HEADDRESS_12222 = 12222 + const val FEATHER_HEADDRESS_12223 = 12223 + const val FEATHER_HEADDRESS_CHARGED_12224 = 12224 + const val POUCH_12225 = 12225 + const val POUCH_12226 = 12226 + const val POUCH_12227 = 12227 + const val POUCH_12228 = 12228 + const val POUCH_12229 = 12229 + const val POUCH_12230 = 12230 + const val POUCH_12231 = 12231 + const val POUCH_12232 = 12232 + const val POUCH_12233 = 12233 + const val POUCH_12234 = 12234 + const val POUCH_12235 = 12235 + const val POUCH_12236 = 12236 + const val POUCH_12237 = 12237 + const val POUCH_12238 = 12238 + const val POUCH_12239 = 12239 + const val POUCH_12240 = 12240 + const val POUCH_12241 = 12241 + const val POUCH_12242 = 12242 + const val POUCH_12243 = 12243 + const val POUCH_12244 = 12244 + const val POUCH_12245 = 12245 + const val POUCH_12246 = 12246 + const val POUCH_12247 = 12247 + const val POUCH_12248 = 12248 + const val POUCH_12249 = 12249 + const val POUCH_12250 = 12250 + const val POUCH_12251 = 12251 + const val POUCH_12252 = 12252 + const val POUCH_12253 = 12253 + const val POUCH_12254 = 12254 + const val POUCH_12255 = 12255 + const val POUCH_12256 = 12256 + const val POUCH_12257 = 12257 + const val POUCH_12258 = 12258 + const val POUCH_12259 = 12259 + const val POUCH_12260 = 12260 + const val POUCH_12261 = 12261 + const val POUCH_12262 = 12262 + const val POUCH_12263 = 12263 + const val POUCH_12264 = 12264 + const val POUCH_12265 = 12265 + const val POUCH_12266 = 12266 + const val POUCH_12267 = 12267 + const val POUCH_12268 = 12268 + const val POUCH_12269 = 12269 + const val POUCH_12270 = 12270 + const val POUCH_12271 = 12271 + const val POUCH_12272 = 12272 + const val POUCH_12273 = 12273 + const val POUCH_12274 = 12274 + const val POUCH_12275 = 12275 + const val POUCH_12276 = 12276 + const val POUCH_12277 = 12277 + const val POUCH_12278 = 12278 + const val POUCH_12279 = 12279 + const val POUCH_12280 = 12280 + const val POUCH_12281 = 12281 + const val POUCH_12282 = 12282 + const val POUCH_12283 = 12283 + const val POUCH_12284 = 12284 + const val POUCH_12285 = 12285 + const val POUCH_12286 = 12286 + const val POUCH_12287 = 12287 + const val POUCH_12288 = 12288 + const val POUCH_12289 = 12289 + const val POUCH_12290 = 12290 + const val POUCH_12291 = 12291 + const val POUCH_12292 = 12292 + const val POUCH_12293 = 12293 + const val POUCH_12294 = 12294 + const val POUCH_12295 = 12295 + const val POUCH_12296 = 12296 + const val POUCH_12297 = 12297 + const val POUCH_12298 = 12298 + const val POUCH_12299 = 12299 + const val POUCH_12300 = 12300 + const val POUCH_12301 = 12301 + const val POUCH_12302 = 12302 + const val POUCH_12303 = 12303 + const val POUCH_12304 = 12304 + const val POUCH_12305 = 12305 + const val POUCH_12306 = 12306 + const val POUCH_12307 = 12307 + const val POUCH_12308 = 12308 + const val POUCH_12309 = 12309 + const val POUCH_12310 = 12310 + const val POUCH_12311 = 12311 + const val POUCH_12312 = 12312 + const val POUCH_12313 = 12313 + const val POUCH_12314 = 12314 + const val POUCH_12315 = 12315 + const val POUCH_12316 = 12316 + const val POUCH_12317 = 12317 + const val POUCH_12318 = 12318 + const val POUCH_12319 = 12319 + const val POUCH_12320 = 12320 + const val POUCH_12321 = 12321 + const val POUCH_12322 = 12322 + const val POUCH_12323 = 12323 + const val POUCH_12324 = 12324 + const val POUCH_12325 = 12325 + const val POUCH_12326 = 12326 + const val POUCH_12327 = 12327 + const val POUCH_12328 = 12328 + const val POUCH_12329 = 12329 + const val POUCH_12330 = 12330 + const val POUCH_12331 = 12331 + const val POUCH_12332 = 12332 + const val POUCH_12333 = 12333 + const val POUCH_12334 = 12334 + const val POUCH_12335 = 12335 + const val POUCH_12336 = 12336 + const val POUCH_12337 = 12337 + const val POUCH_12338 = 12338 + const val POUCH_12339 = 12339 + const val POUCH_12340 = 12340 + const val POUCH_12341 = 12341 + const val POUCH_12342 = 12342 + const val POUCH_12343 = 12343 + const val POUCH_12344 = 12344 + const val POUCH_12345 = 12345 + const val POUCH_12346 = 12346 + const val POUCH_12347 = 12347 + const val POUCH_12348 = 12348 + const val POUCH_12349 = 12349 + const val POUCH_12350 = 12350 + const val POUCH_12351 = 12351 + const val POUCH_12352 = 12352 + const val POUCH_12353 = 12353 + const val POUCH_12354 = 12354 + const val POUCH_12355 = 12355 + const val POUCH_12356 = 12356 + const val POUCH_12357 = 12357 + const val POUCH_12358 = 12358 + const val POUCH_12359 = 12359 + const val POUCH_12360 = 12360 + const val POUCH_12361 = 12361 + const val POUCH_12362 = 12362 + const val POUCH_12363 = 12363 + const val POUCH_12364 = 12364 + const val POUCH_12365 = 12365 + const val POUCH_12366 = 12366 + const val POUCH_12367 = 12367 + const val POUCH_12368 = 12368 + const val POUCH_12369 = 12369 + const val POUCH_12370 = 12370 + const val POUCH_12371 = 12371 + const val POUCH_12372 = 12372 + const val POUCH_12373 = 12373 + const val POUCH_12374 = 12374 + const val POUCH_12375 = 12375 + const val POUCH_12376 = 12376 + const val POUCH_12377 = 12377 + const val POUCH_12378 = 12378 + const val POUCH_12379 = 12379 + const val POUCH_12380 = 12380 + const val POUCH_12381 = 12381 + const val POUCH_12382 = 12382 + const val POUCH_12383 = 12383 + const val POUCH_12384 = 12384 + const val POUCH_12385 = 12385 + const val POUCH_12386 = 12386 + const val POUCH_12387 = 12387 + const val POUCH_12388 = 12388 + const val POUCH_12389 = 12389 + const val POUCH_12390 = 12390 + const val POUCH_12391 = 12391 + const val POUCH_12392 = 12392 + const val POUCH_12393 = 12393 + const val POUCH_12394 = 12394 + const val POUCH_12395 = 12395 + const val POUCH_12396 = 12396 + const val POUCH_12397 = 12397 + const val POUCH_12398 = 12398 + const val POUCH_12399 = 12399 + const val POUCH_12400 = 12400 + const val POUCH_12401 = 12401 + const val POUCH_12402 = 12402 + const val POUCH_12403 = 12403 + const val POUCH_12404 = 12404 + const val POUCH_12405 = 12405 + const val POUCH_12406 = 12406 + const val POUCH_12407 = 12407 + const val POUCH_12408 = 12408 + const val POUCH_12409 = 12409 + const val POUCH_12410 = 12410 + const val POUCH_12411 = 12411 + const val POUCH_12412 = 12412 + const val POUCH_12413 = 12413 + const val POUCH_12414 = 12414 + const val POUCH_12415 = 12415 + const val POUCH_12416 = 12416 + const val POUCH_12417 = 12417 + const val POUCH_12418 = 12418 + const val POUCH_12419 = 12419 + const val POUCH_12420 = 12420 + const val SCROLL_12421 = 12421 + const val HERBCALL_SCROLL_12422 = 12422 + const val FRUITFALL_SCROLL_12423 = 12423 + const val FISH_RAIN_SCROLL_12424 = 12424 + const val HOWL_SCROLL_12425 = 12425 + const val THIEVING_FINGERS_SCROLL_12426 = 12426 + const val ABYSSAL_STEALTH_SCROLL_12427 = 12427 + const val EGG_SPAWN_SCROLL_12428 = 12428 + const val MULTICHOP_SCROLL_12429 = 12429 + const val CHEESE_FEAST_SCROLL_12430 = 12430 + const val UNBURDEN_SCROLL_12431 = 12431 + const val VENOM_SHOT_SCROLL_12432 = 12432 + const val INSANE_FEROCITY_SCROLL_12433 = 12433 + const val HEALING_AURA_SCROLL_12434 = 12434 + const val WINTER_STORAGE_SCROLL_12435 = 12435 + const val OPH_INCUBATION_SCROLL_12436 = 12436 + const val MAGIC_FOCUS_SCROLL_12437 = 12437 + const val SWALLOW_WHOLE_SCROLL_12438 = 12438 + const val TESTUDO_SCROLL_12439 = 12439 + const val GENERATE_COMPOST_SCROLL_12440 = 12440 + const val TIRELESS_RUN_SCROLL_12441 = 12441 + const val REGROWTH_SCROLL_12442 = 12442 + const val CALL_TO_ARMS_SCROLL_12443 = 12443 + const val BLOOD_DRAIN_SCROLL_12444 = 12444 + const val DREADFOWL_STRIKE_SCROLL_12445 = 12445 + const val SANDSTORM_SCROLL_12446 = 12446 + const val VAMPIRE_TOUCH_SCROLL_12447 = 12447 + const val EVIL_FLAMES_SCROLL_12448 = 12448 + const val CRUSHING_CLAW_SCROLL_12449 = 12449 + const val MANTIS_STRIKE_SCROLL_12450 = 12450 + const val ARCTIC_BLAST_SCROLL_12451 = 12451 + const val TOAD_BARK_SCROLL_12452 = 12452 + const val DISSOLVE_SCROLL_12453 = 12453 + const val ABYSSAL_DRAIN_SCROLL_12454 = 12454 + const val DOOMSPHERE_SCROLL_12455 = 12455 + const val SPIKE_SHOT_SCROLL_12456 = 12456 + const val ACORN_MISSILE_SCROLL_12457 = 12457 + const val PETRIFYING_GAZE_SCROLL_12458 = 12458 + const val SLIME_SPRAY_SCROLL_12459 = 12459 + const val ELECTRIC_LASH_SCROLL_12460 = 12460 + const val BRONZE_BULL_RUSH_SCROLL_12461 = 12461 + const val IRON_BULL_RUSH_SCROLL_12462 = 12462 + const val STEEL_BULL_RUSH_SCROLL_12463 = 12463 + const val MITH_BULL_RUSH_SCROLL_12464 = 12464 + const val ADDY_BULL_RUSH_SCROLL_12465 = 12465 + const val RUNE_BULL_RUSH_SCROLL_12466 = 12466 + const val POISONOUS_BLAST_SCROLL_12467 = 12467 + const val DUST_CLOUD_SCROLL_12468 = 12468 + const val HATCHLING_DRAGON_12469 = 12469 + const val BABY_DRAGON_12470 = 12470 + const val HATCHLING_DRAGON_12471 = 12471 + const val BABY_DRAGON_12472 = 12472 + const val HATCHLING_DRAGON_12473 = 12473 + const val BABY_DRAGON_12474 = 12474 + const val HATCHLING_DRAGON_12475 = 12475 + const val BABY_DRAGON_12476 = 12476 + const val RED_DRAGON_EGG_12477 = 12477 + const val BLUE_DRAGON_EGG_12478 = 12478 + const val GREEN_DRAGON_EGG_12479 = 12479 + const val BLACK_DRAGON_EGG_12480 = 12480 + const val BABY_PENGUIN_12481 = 12481 + const val PENGUIN_12482 = 12482 + const val PENGUIN_EGG_12483 = 12483 + const val RAVEN_CHICK_12484 = 12484 + const val RAVEN_12485 = 12485 + const val BABY_RACCOON_12486 = 12486 + const val RACCOON_12487 = 12487 + const val BABY_GECKO_12488 = 12488 + const val GECKO_12489 = 12489 + const val BABY_SQUIRREL_12490 = 12490 + const val SQUIRREL_12491 = 12491 + const val BABY_CHAMELEON_12492 = 12492 + const val CHAMELEON_12493 = 12493 + const val CHAMELEON_EGG_12494 = 12494 + const val CHAMELEON_EGG_12495 = 12495 + const val BABY_MONKEY_12496 = 12496 + const val MONKEY_12497 = 12497 + const val VULTURE_CHICK_12498 = 12498 + const val VULTURE_12499 = 12499 + const val BABY_GIANT_CRAB_12500 = 12500 + const val GIANT_CRAB_12501 = 12501 + const val CRUNCHY_CLAW_TOKEN_12502 = 12502 + const val SARADOMIN_CHICK_12503 = 12503 + const val SARADOMIN_BIRD_12504 = 12504 + const val SARADOMIN_OWL_12505 = 12505 + const val ZAMORAK_CHICK_12506 = 12506 + const val ZAMORAK_BIRD_12507 = 12507 + const val ZAMORAK_HAWK_12508 = 12508 + const val GUTHIX_CHICK_12509 = 12509 + const val GUTHIX_BIRD_12510 = 12510 + const val GUTHIX_RAPTOR_12511 = 12511 + const val TERRIER_PUPPY_12512 = 12512 + const val TERRIER_12513 = 12513 + const val GREYHOUND_PUPPY_12514 = 12514 + const val GREYHOUND_12515 = 12515 + const val LABRADOR_PUPPY_12516 = 12516 + const val LABRADOR_12517 = 12517 + const val DALMATIAN_PUPPY_12518 = 12518 + const val DALMATIAN_12519 = 12519 + const val SHEEPDOG_PUPPY_12520 = 12520 + const val SHEEPDOG_12521 = 12521 + const val BULLDOG_PUPPY_12522 = 12522 + const val BULLDOG_12523 = 12523 + const val SUMMONING_CAPE_12524 = 12524 + const val POUCH_12525 = 12525 + const val SPIRIT_WOLF_POUCH_12526 = 12526 + const val GOLD_CHARM_12527 = 12527 + const val TRAPDOOR_KEY_12528 = 12528 + const val HOWL_SCROLL_12529 = 12529 + const val SPIRIT_SHARDS_12530 = 12530 + const val IBIS_POUCH_12531 = 12531 + const val IBIS_POUCH_12532 = 12532 + const val STONY_SHELL_SCROLL_12533 = 12533 + const val NULL_12534 = 12534 + const val RAW_PAWYA_MEAT_12535 = 12535 + const val RAW_PAWYA_MEAT_12536 = 12536 + const val PICTURE_12537 = 12537 + const val PICTURE_12538 = 12538 + const val GRENWALL_SPIKES_12539 = 12539 + const val NULL_12540 = 12540 + const val NULL_12541 = 12541 + const val NULL_12542 = 12542 + const val NULL_12543 = 12543 + const val PICTURE_12544 = 12544 + const val PICTURE_12545 = 12545 + const val ENCHANTED_PAWYA_MEAT_12546 = 12546 + const val PLATYPUS_12547 = 12547 + const val PLATYPUS_12548 = 12548 + const val PLATYPUS_12549 = 12549 + const val PLATYPUS_12550 = 12550 + const val BABY_PLATYPUS_12551 = 12551 + const val BABY_PLATYPUS_12552 = 12552 + const val BABY_PLATYPUS_12553 = 12553 + const val PATRICK_12554 = 12554 + const val PENELOPE_12555 = 12555 + const val PETER_12556 = 12556 + const val PEANUT_12557 = 12557 + const val MUD_12558 = 12558 + const val OGRE_WIG_12559 = 12559 + const val OGRE_WIG_12560 = 12560 + const val OGRE_KILT_12561 = 12561 + const val OGRE_KILT_12562 = 12562 + const val OGRE_TOP_12563 = 12563 + const val OGRE_TOP_12564 = 12564 + const val OGRE_BOOTS_12565 = 12565 + const val OGRE_BOOTS_12566 = 12566 + const val DISEASED_KEBBIT_FUR_12567 = 12567 + const val DAVY_KEBBIT_HAT_12568 = 12568 + const val DAVY_KEBBIT_HAT_12569 = 12569 + const val OGRE_CLUB_12570 = 12570 + const val OGRE_CLUB_12571 = 12571 + const val LAVENDER_12572 = 12572 + const val LAVENDER_12573 = 12573 + const val FEVER_GRASS_12574 = 12574 + const val FEVER_GRASS_12575 = 12575 + const val TANSYMUM_12576 = 12576 + const val TANSYMUM_12577 = 12577 + const val SMOULDERING_FEVER_GRASS_12578 = 12578 + const val SMOULDERING_LAVENDER_12579 = 12579 + const val SMOULDERING_TANSYMUM_12580 = 12580 + const val EUCALYPTUS_LOGS_12581 = 12581 + const val EUCALYPTUS_LOGS_12582 = 12582 + const val EUCALYPTUS_PYRE_LOGS_12583 = 12583 + const val EUCALYPTUS_PYRE_LOGS_12584 = 12584 + const val NULL_12585 = 12585 + const val NULL_12586 = 12586 + const val NULL_12587 = 12587 + const val PRIMWEED_12588 = 12588 + const val PRIMWEED_12589 = 12589 + const val STINKBLOOM_12590 = 12590 + const val STINKBLOOM_12591 = 12591 + const val DISEASED_KEBBIT_FUR_12592 = 12592 + const val CATAPULT_SCHEMATICS_12593 = 12593 + const val ENGINEERS_LETTER_12594 = 12594 + const val SAILORS_HAT_12595 = 12595 + const val METAL_CATAPULT_PARTS_12596 = 12596 + const val MAHOGANY_CATAPULT_PART_12597 = 12597 + const val MAHOGANY_CATAPULT_PART_12598 = 12598 + const val MAHOGANY_CATAPULT_PART_12599 = 12599 + const val MAHOGANY_CATAPULT_PART_12600 = 12600 + const val MAHOGANY_CATAPULT_PART_12601 = 12601 + const val MAHOGANY_CATAPULT_PART_12602 = 12602 + const val MAHOGANY_CATAPULT_PART_12603 = 12603 + const val MAHOGANY_CATAPULT_PART_12604 = 12604 + const val MAHOGANY_CATAPULT_PART_12605 = 12605 + const val MAHOGANY_CATAPULT_PART_12606 = 12606 + const val PICTURE_12607 = 12607 + const val AMULET_OF_FARMING1_12608 = 12608 + const val AMULET_OF_FARMING1_12609 = 12609 + const val AMULET_OF_FARMING2_12610 = 12610 + const val AMULET_OF_FARMING2_12611 = 12611 + const val AMULET_OF_FARMING3_12612 = 12612 + const val AMULET_OF_FARMING3_12613 = 12613 + const val AMULET_OF_FARMING4_12614 = 12614 + const val AMULET_OF_FARMING4_12615 = 12615 + const val AMULET_OF_FARMING5_12616 = 12616 + const val AMULET_OF_FARMING5_12617 = 12617 + const val AMULET_OF_FARMING6_12618 = 12618 + const val AMULET_OF_FARMING6_12619 = 12619 + const val AMULET_OF_FARMING7_12620 = 12620 + const val AMULET_OF_FARMING7_12621 = 12621 + const val AMULET_OF_FARMING8_12622 = 12622 + const val AMULET_OF_FARMING8_12623 = 12623 + const val OGLEROOT_12624 = 12624 + const val FLAG_12625 = 12625 + const val TEST_PAPER_12626 = 12626 + const val ANTIQUE_LAMP_12627 = 12627 + const val ANTIQUE_LAMP_12628 = 12628 + const val SAFETY_GLOVES_12629 = 12629 + const val RUBIUM_12630 = 12630 + const val TOY_TRAIN_12631 = 12631 + const val NOTE_12632 = 12632 + const val SUPER_FISHING_EXPLOSIVE_12633 = 12633 + const val CHOCATRICE_CAPE_12634 = 12634 + const val EASTER_EGG_12635 = 12635 + const val EASTER_EGG_12636 = 12636 + const val EASTER_EGG_12637 = 12637 + const val EASTER_EGG_12638 = 12638 + const val EASTER_EGG_12639 = 12639 + const val EASTER_EGG_12640 = 12640 + const val EASTER_EGG_12641 = 12641 + const val EASTER_EGG_12642 = 12642 + const val EASTER_EGG_12643 = 12643 + const val EASTER_EGG_12644 = 12644 + const val CHOCATRICE_CAPE_12645 = 12645 + const val CHOCOLATE_EGG_12646 = 12646 + const val CHOCOLATE_EGG_12647 = 12647 + const val CHOCOLATE_EGG_12648 = 12648 + const val BUCKET_12649 = 12649 + const val BUCKET_OF_WATER_12650 = 12650 + const val BUCKET_OF_WATER_12651 = 12651 + const val BUCKET_OF_COAL_12652 = 12652 + const val BUCKET_OF_COAL_12653 = 12653 + const val COCKATRICE_EGG_12654 = 12654 + const val CHOCATRICE_EGG_12655 = 12655 + const val CHOCATRICE_OBJECT_12656 = 12656 + const val CHOCOLATE_CHUNKS_12657 = 12657 + const val ADAMANT_FULL_HELM_E_12658 = 12658 + const val ADAMANT_FULL_HELM_CHARGED_12659 = 12659 + const val SNAKESKIN_BANDANA_E_12660 = 12660 + const val SNAKESKIN_BANDANA_CHARGED_12661 = 12661 + const val SPLITBARK_HELM_E_12662 = 12662 + const val SPLITBARK_HELM_CHARGED_12663 = 12663 + const val RUNE_FULL_HELM_E_12664 = 12664 + const val RUNE_FULL_HELM_CHARGED_12665 = 12665 + const val DRAGON_MED_HELM_E_12666 = 12666 + const val DRAGON_MED_HELM_CHARGED_12667 = 12667 + const val LUNAR_HELM_E_12668 = 12668 + const val LUNAR_HELM_CHARGED_12669 = 12669 + const val ARMADYL_HELMET_E_12670 = 12670 + const val ARMADYL_HELMET_CHARGED_12671 = 12671 + const val ARCHER_HELM_E_12672 = 12672 + const val ARCHER_HELM_CHARGED_12673 = 12673 + const val BERSERKER_HELM_E_12674 = 12674 + const val BERSERKER_HELM_CHARGED_12675 = 12675 + const val WARRIOR_HELM_E_12676 = 12676 + const val WARRIOR_HELM_CHARGED_12677 = 12677 + const val FARSEER_HELM_E_12678 = 12678 + const val FARSEER_HELM_CHARGED_12679 = 12679 + const val HELM_OF_NEITIZNOT_E_12680 = 12680 + const val HELM_OF_NEITIZNOT_CHARGED_12681 = 12681 + const val BABY_MONKEY_12682 = 12682 + const val MONKEY_12683 = 12683 + const val BABY_MONKEY_12684 = 12684 + const val MONKEY_12685 = 12685 + const val BABY_MONKEY_12686 = 12686 + const val MONKEY_12687 = 12687 + const val BABY_MONKEY_12688 = 12688 + const val MONKEY_12689 = 12689 + const val BABY_MONKEY_12690 = 12690 + const val MONKEY_12691 = 12691 + const val BABY_MONKEY_12692 = 12692 + const val MONKEY_12693 = 12693 + const val BABY_MONKEY_12694 = 12694 + const val MONKEY_12695 = 12695 + const val BABY_MONKEY_12696 = 12696 + const val MONKEY_12697 = 12697 + const val BABY_MONKEY_12698 = 12698 + const val MONKEY_12699 = 12699 + const val TERRIER_PUPPY_12700 = 12700 + const val TERRIER_12701 = 12701 + const val TERRIER_PUPPY_12702 = 12702 + const val TERRIER_12703 = 12703 + const val GREYHOUND_PUPPY_12704 = 12704 + const val GREYHOUND_12705 = 12705 + const val GREYHOUND_PUPPY_12706 = 12706 + const val GREYHOUND_12707 = 12707 + const val LABRADOR_PUPPY_12708 = 12708 + const val LABRADOR_12709 = 12709 + const val LABRADOR_PUPPY_12710 = 12710 + const val LABRADOR_12711 = 12711 + const val DALMATIAN_PUPPY_12712 = 12712 + const val DALMATIAN_12713 = 12713 + const val DALMATIAN_PUPPY_12714 = 12714 + const val DALMATIAN_12715 = 12715 + const val SHEEPDOG_PUPPY_12716 = 12716 + const val SHEEPDOG_12717 = 12717 + const val SHEEPDOG_PUPPY_12718 = 12718 + const val SHEEPDOG_12719 = 12719 + const val BULLDOG_PUPPY_12720 = 12720 + const val BULLDOG_12721 = 12721 + const val BULLDOG_PUPPY_12722 = 12722 + const val BULLDOG_12723 = 12723 + const val RAVEN_CHICK_12724 = 12724 + const val RAVEN_12725 = 12725 + const val RAVEN_CHICK_12726 = 12726 + const val RAVEN_12727 = 12727 + const val RAVEN_CHICK_12728 = 12728 + const val RAVEN_12729 = 12729 + const val RAVEN_CHICK_12730 = 12730 + const val RAVEN_12731 = 12731 + const val RAVEN_CHICK_12732 = 12732 + const val RAVEN_12733 = 12733 + const val BABY_RACCOON_12734 = 12734 + const val RACCOON_12735 = 12735 + const val BABY_RACCOON_12736 = 12736 + const val RACCOON_12737 = 12737 + const val BABY_GECKO_12738 = 12738 + const val BABY_GECKO_12739 = 12739 + const val BABY_GECKO_12740 = 12740 + const val BABY_GECKO_12741 = 12741 + const val GECKO_12742 = 12742 + const val GECKO_12743 = 12743 + const val GECKO_12744 = 12744 + const val GECKO_12745 = 12745 + const val BABY_GIANT_CRAB_12746 = 12746 + const val GIANT_CRAB_12747 = 12747 + const val BABY_GIANT_CRAB_12748 = 12748 + const val GIANT_CRAB_12749 = 12749 + const val BABY_GIANT_CRAB_12750 = 12750 + const val GIANT_CRAB_12751 = 12751 + const val BABY_GIANT_CRAB_12752 = 12752 + const val GIANT_CRAB_12753 = 12753 + const val BABY_SQUIRREL_12754 = 12754 + const val SQUIRREL_12755 = 12755 + const val BABY_SQUIRREL_12756 = 12756 + const val SQUIRREL_12757 = 12757 + const val BABY_SQUIRREL_12758 = 12758 + const val SQUIRREL_12759 = 12759 + const val BABY_SQUIRREL_12760 = 12760 + const val SQUIRREL_12761 = 12761 + const val PENGUIN_12762 = 12762 + const val BABY_PENGUIN_12763 = 12763 + const val PENGUIN_12764 = 12764 + const val BABY_PENGUIN_12765 = 12765 + const val VULTURE_CHICK_12766 = 12766 + const val VULTURE_12767 = 12767 + const val VULTURE_CHICK_12768 = 12768 + const val VULTURE_12769 = 12769 + const val VULTURE_CHICK_12770 = 12770 + const val VULTURE_12771 = 12771 + const val VULTURE_CHICK_12772 = 12772 + const val VULTURE_12773 = 12773 + const val VULTURE_CHICK_12774 = 12774 + const val VULTURE_12775 = 12775 + const val SWAMP_TITAN_POUCH_12776 = 12776 + const val SWAMP_TITAN_POUCH_12777 = 12777 + const val SPIRIT_MOSQUITO_POUCH_12778 = 12778 + const val SPIRIT_MOSQUITO_POUCH_12779 = 12779 + const val VOID_SPINNER_POUCH_12780 = 12780 + const val VOID_SPINNER_POUCH_12781 = 12781 + const val FORGE_REGENT_POUCH_12782 = 12782 + const val FORGE_REGENT_POUCH_12783 = 12783 + const val SPIRIT_LARUPIA_POUCH_12784 = 12784 + const val SPIRIT_LARUPIA_POUCH_12785 = 12785 + const val GEYSER_TITAN_POUCH_12786 = 12786 + const val GEYSER_TITAN_POUCH_12787 = 12787 + const val LAVA_TITAN_POUCH_12788 = 12788 + const val LAVA_TITAN_POUCH_12789 = 12789 + const val STEEL_TITAN_POUCH_12790 = 12790 + const val STEEL_TITAN_POUCH_12791 = 12791 + const val OBSIDIAN_GOLEM_POUCH_12792 = 12792 + const val OBSIDIAN_GOLEM_POUCH_12793 = 12793 + const val TALON_BEAST_POUCH_12794 = 12794 + const val TALON_BEAST_POUCH_12795 = 12795 + const val ABYSSAL_TITAN_POUCH_12796 = 12796 + const val ABYSSAL_TITAN_POUCH_12797 = 12797 + const val VOID_TORCHER_POUCH_12798 = 12798 + const val VOID_TORCHER_POUCH_12799 = 12799 + const val GIANT_CHINCHOMPA_POUCH_12800 = 12800 + const val GIANT_CHINCHOMPA_POUCH_12801 = 12801 + const val FIRE_TITAN_POUCH_12802 = 12802 + const val FIRE_TITAN_POUCH_12803 = 12803 + const val MOSS_TITAN_POUCH_12804 = 12804 + const val MOSS_TITAN_POUCH_12805 = 12805 + const val ICE_TITAN_POUCH_12806 = 12806 + const val ICE_TITAN_POUCH_12807 = 12807 + const val SPIRIT_TZ_KIH_POUCH_12808 = 12808 + const val SPIRIT_TZ_KIH_POUCH_12809 = 12809 + const val SPIRIT_GRAAHK_POUCH_12810 = 12810 + const val SPIRIT_GRAAHK_POUCH_12811 = 12811 + const val SPIRIT_KYATT_POUCH_12812 = 12812 + const val SPIRIT_KYATT_POUCH_12813 = 12813 + const val VOID_SHIFTER_POUCH_12814 = 12814 + const val VOID_SHIFTER_POUCH_12815 = 12815 + const val PYRELORD_POUCH_12816 = 12816 + const val PYRELORD_POUCH_12817 = 12817 + const val VOID_RAVAGER_POUCH_12818 = 12818 + const val VOID_RAVAGER_POUCH_12819 = 12819 + const val RAVENOUS_LOCUST_POUCH_12820 = 12820 + const val RAVENOUS_LOCUST_POUCH_12821 = 12821 + const val IRON_TITAN_POUCH_12822 = 12822 + const val IRON_TITAN_POUCH_12823 = 12823 + const val TITANS_CON_SCROLL_12824 = 12824 + const val STEEL_OF_LEGENDS_SCROLL_12825 = 12825 + const val VOLCANIC_STR_SCROLL_12826 = 12826 + const val ESSENCE_SHIPMENT_SCROLL_12827 = 12827 + const val IRON_WITHIN_SCROLL_12828 = 12828 + const val IMMENSE_HEAT_SCROLL_12829 = 12829 + const val FAMINE_SCROLL_12830 = 12830 + const val DEADLY_CLAW_SCROLL_12831 = 12831 + const val SWAMP_PLAGUE_SCROLL_12832 = 12832 + const val BOIL_SCROLL_12833 = 12833 + const val EXPLODE_SCROLL_12834 = 12834 + const val GOAD_SCROLL_12835 = 12835 + const val AMBUSH_SCROLL_12836 = 12836 + const val EBON_THUNDER_SCROLL_12837 = 12837 + const val PESTER_SCROLL_12838 = 12838 + const val FIREBALL_ASSAULT_SCROLL_12839 = 12839 + const val RENDING_SCROLL_12840 = 12840 + const val INFERNO_SCROLL_12841 = 12841 + const val GNOMECOPTER_12842 = 12842 + const val GNOMECOPTER_TICKET_12843 = 12843 + const val TOY_KITE_12844 = 12844 + const val STONE_OF_POWER_12845 = 12845 + const val STONE_OF_POWER_12846 = 12846 + const val STONE_OF_POWER_12847 = 12847 + const val STONE_OF_POWER_12848 = 12848 + const val STONE_OF_POWER_12849 = 12849 + const val ELEMENTAL_RUNE_12850 = 12850 + const val CATALYTIC_RUNE_12851 = 12851 + const val FIST_OF_GUTHIX_TOKEN_12852 = 12852 + const val BANDAGES_12853 = 12853 + const val NULL_12854 = 12854 + const val TELE_ORB_12855 = 12855 + const val IRIT_GLOVES_12856 = 12856 + const val AVANTOE_GLOVES_12857 = 12857 + const val KWUARM_GLOVES_12858 = 12858 + const val CADANTINE_GLOVES_12859 = 12859 + const val SWORDFISH_GLOVES_12860 = 12860 + const val SHARK_GLOVES_12861 = 12861 + const val DRAGON_SLAYER_GLOVES_12862 = 12862 + const val AIR_RUNECRAFTING_GLOVES_12863 = 12863 + const val WATER_RUNECRAFTING_GLOVES_12864 = 12864 + const val EARTH_RUNECRAFTING_GLOVES_12865 = 12865 + const val BATTLE_HOOD_100_12866 = 12866 + const val BATTLE_HOOD_80_12867 = 12867 + const val BATTLE_HOOD_60_12868 = 12868 + const val BATTLE_HOOD_40_12869 = 12869 + const val BATTLE_HOOD_20_12870 = 12870 + const val BATTLE_HOOD_0_12871 = 12871 + const val BATTLE_HOOD_0_12872 = 12872 + const val BATTLE_ROBE_TOP_100_12873 = 12873 + const val BATTLE_ROBE_TOP_80_12874 = 12874 + const val BATTLE_ROBE_TOP_60_12875 = 12875 + const val BATTLE_ROBE_TOP_40_12876 = 12876 + const val BATTLE_ROBE_TOP_20_12877 = 12877 + const val BATTLE_ROBE_TOP_0_12878 = 12878 + const val BATTLE_ROBE_TOP_0_12879 = 12879 + const val BATTLE_ROBE_BOTTOM_100_12880 = 12880 + const val BATTLE_ROBE_BOTTOM_80_12881 = 12881 + const val BATTLE_ROBE_BOTTOM_60_12882 = 12882 + const val BATTLE_ROBE_BOTTOM_40_12883 = 12883 + const val BATTLE_ROBE_BOTTOM_20_12884 = 12884 + const val BATTLE_ROBE_BOTTOM_0_12885 = 12885 + const val BATTLE_ROBE_BOTTOM_0_12886 = 12886 + const val DRUIDIC_MAGE_HOOD_100_12887 = 12887 + const val DRUIDIC_MAGE_HOOD_80_12888 = 12888 + const val DRUIDIC_MAGE_HOOD_60_12889 = 12889 + const val DRUIDIC_MAGE_HOOD_40_12890 = 12890 + const val DRUIDIC_MAGE_HOOD_20_12891 = 12891 + const val DRUIDIC_MAGE_HOOD_0_12892 = 12892 + const val DRUIDIC_MAGE_HOOD_0_12893 = 12893 + const val DRUIDIC_MAGE_TOP_100_12894 = 12894 + const val DRUIDIC_MAGE_TOP_80_12895 = 12895 + const val DRUIDIC_MAGE_TOP_60_12896 = 12896 + const val DRUIDIC_MAGE_TOP_40_12897 = 12897 + const val DRUIDIC_MAGE_TOP_20_12898 = 12898 + const val DRUIDIC_MAGE_TOP_0_12899 = 12899 + const val DRUIDIC_MAGE_TOP_0_12900 = 12900 + const val DRUIDIC_MAGE_BOTTOM_100_12901 = 12901 + const val DRUIDIC_MAGE_BOTTOM_80_12902 = 12902 + const val DRUIDIC_MAGE_BOTTOM_60_12903 = 12903 + const val DRUIDIC_MAGE_BOTTOM_40_12904 = 12904 + const val DRUIDIC_MAGE_BOTTOM_20_12905 = 12905 + const val DRUIDIC_MAGE_BOTTOM_0_12906 = 12906 + const val DRUIDIC_MAGE_BOTTOM_0_12907 = 12907 + const val ADAMANT_SPIKESHIELD_100_12908 = 12908 + const val ADAMANT_SPIKESHIELD_80_12909 = 12909 + const val ADAMANT_SPIKESHIELD_60_12910 = 12910 + const val ADAMANT_SPIKESHIELD_40_12911 = 12911 + const val ADAMANT_SPIKESHIELD_20_12912 = 12912 + const val ADAMANT_SPIKESHIELD_0_12913 = 12913 + const val ADAMANT_SPIKESHIELD_0_12914 = 12914 + const val ADAMANT_BERSERKER_SHIELD_100_12915 = 12915 + const val ADAMANT_BERSERKER_SHIELD_80_12916 = 12916 + const val ADAMANT_BERSERKER_SHIELD_60_12917 = 12917 + const val ADAMANT_BERSERKER_SHIELD_40_12918 = 12918 + const val ADAMANT_BERSERKER_SHIELD_20_12919 = 12919 + const val ADAMANT_BERSERKER_SHIELD_0_12920 = 12920 + const val ADAMANT_BERSERKER_SHIELD_0_12921 = 12921 + const val RUNE_SPIKESHIELD_100_12922 = 12922 + const val RUNE_SPIKESHIELD_80_12923 = 12923 + const val RUNE_SPIKESHIELD_60_12924 = 12924 + const val RUNE_SPIKESHIELD_40_12925 = 12925 + const val RUNE_SPIKESHIELD_20_12926 = 12926 + const val RUNE_SPIKESHIELD_0_12927 = 12927 + const val RUNE_SPIKESHIELD_0_12928 = 12928 + const val RUNE_BERSERKER_SHIELD_100_12929 = 12929 + const val RUNE_BERSERKER_SHIELD_80_12930 = 12930 + const val RUNE_BERSERKER_SHIELD_60_12931 = 12931 + const val RUNE_BERSERKER_SHIELD_40_12932 = 12932 + const val RUNE_BERSERKER_SHIELD_20_12933 = 12933 + const val RUNE_BERSERKER_SHIELD_0_12934 = 12934 + const val RUNE_BERSERKER_SHIELD_0_12935 = 12935 + const val GREEN_DHIDE_COIF_100_12936 = 12936 + const val GREEN_DHIDE_COIF_80_12937 = 12937 + const val GREEN_DHIDE_COIF_60_12938 = 12938 + const val GREEN_DHIDE_COIF_40_12939 = 12939 + const val GREEN_DHIDE_COIF_20_12940 = 12940 + const val GREEN_DHIDE_COIF_0_12941 = 12941 + const val GREEN_DHIDE_COIF_0_12942 = 12942 + const val BLUE_DHIDE_COIF_100_12943 = 12943 + const val BLUE_DHIDE_COIF_80_12944 = 12944 + const val BLUE_DHIDE_COIF_60_12945 = 12945 + const val BLUE_DHIDE_COIF_40_12946 = 12946 + const val BLUE_DHIDE_COIF_20_12947 = 12947 + const val BLUE_DHIDE_COIF_0_12948 = 12948 + const val BLUE_DHIDE_COIF_0_12949 = 12949 + const val RED_DHIDE_COIF_100_12950 = 12950 + const val RED_DHIDE_COIF_80_12951 = 12951 + const val RED_DHIDE_COIF_60_12952 = 12952 + const val RED_DHIDE_COIF_40_12953 = 12953 + const val RED_DHIDE_COIF_20_12954 = 12954 + const val RED_DHIDE_COIF_0_12955 = 12955 + const val RED_DHIDE_COIF_0_12956 = 12956 + const val BLACK_DHIDE_COIF_100_12957 = 12957 + const val BLACK_DHIDE_COIF_80_12958 = 12958 + const val BLACK_DHIDE_COIF_60_12959 = 12959 + const val BLACK_DHIDE_COIF_40_12960 = 12960 + const val BLACK_DHIDE_COIF_20_12961 = 12961 + const val BLACK_DHIDE_COIF_0_12962 = 12962 + const val BLACK_DHIDE_COIF_0_12963 = 12963 + const val COMBAT_HOOD_100_12964 = 12964 + const val COMBAT_HOOD_80_12965 = 12965 + const val COMBAT_HOOD_60_12966 = 12966 + const val COMBAT_HOOD_40_12967 = 12967 + const val COMBAT_HOOD_20_12968 = 12968 + const val COMBAT_HOOD_0_12969 = 12969 + const val COMBAT_HOOD_0_12970 = 12970 + const val COMBAT_ROBE_TOP_100_12971 = 12971 + const val COMBAT_ROBE_TOP_80_12972 = 12972 + const val COMBAT_ROBE_TOP_60_12973 = 12973 + const val COMBAT_ROBE_TOP_40_12974 = 12974 + const val COMBAT_ROBE_TOP_20_12975 = 12975 + const val COMBAT_ROBE_TOP_0_12976 = 12976 + const val COMBAT_ROBE_TOP_0_12977 = 12977 + const val COMBAT_ROBE_BOTTOM_100_12978 = 12978 + const val COMBAT_ROBE_BOTTOM_80_12979 = 12979 + const val COMBAT_ROBE_BOTTOM_60_12980 = 12980 + const val COMBAT_ROBE_BOTTOM_40_12981 = 12981 + const val COMBAT_ROBE_BOTTOM_20_12982 = 12982 + const val COMBAT_ROBE_BOTTOM_0_12983 = 12983 + const val COMBAT_ROBE_BOTTOM_0_12984 = 12984 + const val BRONZE_GAUNTLETS_12985 = 12985 + const val WORN_OUT_BRONZE_GAUNTLETS_12986 = 12986 + const val WORN_OUT_BRONZE_GAUNTLETS_12987 = 12987 + const val IRON_GAUNTLETS_12988 = 12988 + const val WORN_OUT_IRON_GAUNTLETS_12989 = 12989 + const val WORN_OUT_IRON_GAUNTLETS_12990 = 12990 + const val STEEL_GAUNTLETS_12991 = 12991 + const val WORN_OUT_STEEL_GAUNTLETS_12992 = 12992 + const val WORN_OUT_STEEL_GAUNTLETS_12993 = 12993 + const val BLACK_GAUNTLETS_12994 = 12994 + const val WORN_OUT_BLACK_GAUNTLETS_12995 = 12995 + const val WORN_OUT_BLACK_GAUNTLETS_12996 = 12996 + const val MITHRIL_GAUNTLETS_12997 = 12997 + const val WORN_OUT_MITHRIL_GAUNTLETS_12998 = 12998 + const val WORN_OUT_MITHRIL_GAUNTLETS_12999 = 12999 + const val ADAMANT_GAUNTLETS_13000 = 13000 + const val WORN_OUT_ADAMANT_GAUNTLETS_13001 = 13001 + const val WORN_OUT_ADAMANT_GAUNTLETS_13002 = 13002 + const val RUNE_GAUNTLETS_13003 = 13003 + const val WORN_OUT_RUNE_GAUNTLETS_13004 = 13004 + const val WORN_OUT_RUNE_GAUNTLETS_13005 = 13005 + const val DRAGON_GAUNTLETS_13006 = 13006 + const val WORN_OUT_DRAGON_GAUNTLETS_13007 = 13007 + const val WORN_OUT_DRAGON_GAUNTLETS_13008 = 13008 + const val NULL_13009 = 13009 + const val CLUE_SCROLL_13010 = 13010 + const val PUZZLE_BOX_13011 = 13011 + const val CLUE_SCROLL_13012 = 13012 + const val PUZZLE_BOX_13013 = 13013 + const val CLUE_SCROLL_13014 = 13014 + const val PUZZLE_BOX_13015 = 13015 + const val CLUE_SCROLL_13016 = 13016 + const val PUZZLE_BOX_13017 = 13017 + const val CLUE_SCROLL_13018 = 13018 + const val PUZZLE_BOX_13019 = 13019 + const val CLUE_SCROLL_13020 = 13020 + const val PUZZLE_BOX_13021 = 13021 + const val CLUE_SCROLL_13022 = 13022 + const val PUZZLE_BOX_13023 = 13023 + const val CLUE_SCROLL_13024 = 13024 + const val PUZZLE_BOX_13025 = 13025 + const val CLUE_SCROLL_13026 = 13026 + const val PUZZLE_BOX_13027 = 13027 + const val CLUE_SCROLL_13028 = 13028 + const val PUZZLE_BOX_13029 = 13029 + const val CLUE_SCROLL_13030 = 13030 + const val PUZZLE_BOX_13031 = 13031 + const val CLUE_SCROLL_13032 = 13032 + const val PUZZLE_BOX_13033 = 13033 + const val CLUE_SCROLL_13034 = 13034 + const val PUZZLE_BOX_13035 = 13035 + const val CLUE_SCROLL_13036 = 13036 + const val CASKET_13037 = 13037 + const val CLUE_SCROLL_13038 = 13038 + const val CASKET_13039 = 13039 + const val CLUE_SCROLL_13040 = 13040 + const val CLUE_SCROLL_13041 = 13041 + const val CLUE_SCROLL_13042 = 13042 + const val CASKET_13043 = 13043 + const val CLUE_SCROLL_13044 = 13044 + const val CASKET_13045 = 13045 + const val CLUE_SCROLL_13046 = 13046 + const val CASKET_13047 = 13047 + const val CLUE_SCROLL_13048 = 13048 + const val CLUE_SCROLL_13049 = 13049 + const val CLUE_SCROLL_13050 = 13050 + const val CLUE_SCROLL_13051 = 13051 + const val CASKET_13052 = 13052 + const val CLUE_SCROLL_13053 = 13053 + const val CASKET_13054 = 13054 + const val CLUE_SCROLL_13055 = 13055 + const val CLUE_SCROLL_13056 = 13056 + const val CASKET_13057 = 13057 + const val CLUE_SCROLL_13058 = 13058 + const val CASKET_13059 = 13059 + const val CLUE_SCROLL_13060 = 13060 + const val CLUE_SCROLL_13061 = 13061 + const val CASKET_13062 = 13062 + const val CLUE_SCROLL_13063 = 13063 + const val CASKET_13064 = 13064 + const val CLUE_SCROLL_13065 = 13065 + const val CASKET_13066 = 13066 + const val CLUE_SCROLL_13067 = 13067 + const val CLUE_SCROLL_13068 = 13068 + const val CLUE_SCROLL_13069 = 13069 + const val CLUE_SCROLL_13070 = 13070 + const val CLUE_SCROLL_13071 = 13071 + const val CLUE_SCROLL_13072 = 13072 + const val KEY_13073 = 13073 + const val CLUE_SCROLL_13074 = 13074 + const val CLUE_SCROLL_13075 = 13075 + const val CLUE_SCROLL_13076 = 13076 + const val CASKET_13077 = 13077 + const val CLUE_SCROLL_13078 = 13078 + const val CLUE_SCROLL_13079 = 13079 + const val CLUE_SCROLL_13080 = 13080 + const val BLACK_CROSSBOW_13081 = 13081 + const val BLACK_CROSSBOW_13082 = 13082 + const val BLACK_BOLTS_13083 = 13083 + const val BLACK_BOLTSP_13084 = 13084 + const val BLACK_BOLTSP_PLUS_13085 = 13085 + const val BLACK_BOLTSP_PLUS_PLUS_13086 = 13086 + const val NULL_13087 = 13087 + const val NULL_13088 = 13088 + const val NULL_13089 = 13089 + const val NULL_13090 = 13090 + const val NULL_13091 = 13091 + const val NULL_13092 = 13092 + const val NULL_13093 = 13093 + const val NULL_13094 = 13094 + const val BLACK_CANE_13095 = 13095 + const val BLACK_CANE_13096 = 13096 + const val ADAMANT_CANE_13097 = 13097 + const val ADAMANT_CANE_13098 = 13098 + const val RUNE_CANE_13099 = 13099 + const val RUNE_CANE_13100 = 13100 + const val TOP_HAT_13101 = 13101 + const val TOP_HAT_13102 = 13102 + const val PITH_HELMET_13103 = 13103 + const val PITH_HELMET_13104 = 13104 + const val SPIKED_HELMET_13105 = 13105 + const val SPIKED_HELMET_13106 = 13106 + const val SHEEP_MASK_13107 = 13107 + const val SHEEP_MASK_13108 = 13108 + const val PENGUIN_MASK_13109 = 13109 + const val PENGUIN_MASK_13110 = 13110 + const val BAT_MASK_13111 = 13111 + const val BAT_MASK_13112 = 13112 + const val CAT_MASK_13113 = 13113 + const val CAT_MASK_13114 = 13114 + const val WOLF_MASK_13115 = 13115 + const val WOLF_MASK_13116 = 13116 + const val IVANDIS_FLAIL_30_13117 = 13117 + const val IVANDIS_FLAIL_29_13118 = 13118 + const val IVANDIS_FLAIL28_13119 = 13119 + const val IVANDIS_FLAIL_27_13120 = 13120 + const val IVANDIS_FLAIL_26_13121 = 13121 + const val IVANDIS_FLAIL_25_13122 = 13122 + const val IVANDIS_FLAIL_24_13123 = 13123 + const val IVANDIS_FLAIL_23_13124 = 13124 + const val IVANDIS_FLAIL_22_13125 = 13125 + const val IVANDIS_FLAIL_21_13126 = 13126 + const val IVANDIS_FLAIL_20_13127 = 13127 + const val IVANDIS_FLAIL_19_13128 = 13128 + const val IVANDIS_FLAIL_18_13129 = 13129 + const val IVANDIS_FLAIL_17_13130 = 13130 + const val IVANDIS_FLAIL_16_13131 = 13131 + const val IVANDIS_FLAIL_15_13132 = 13132 + const val IVANDIS_FLAIL_14_13133 = 13133 + const val IVANDIS_FLAIL_13_13134 = 13134 + const val IVANDIS_FLAIL_12_13135 = 13135 + const val IVANDIS_FLAIL_11_13136 = 13136 + const val IVANDIS_FLAIL_10_13137 = 13137 + const val IVANDIS_FLAIL_9_13138 = 13138 + const val IVANDIS_FLAIL_8_13139 = 13139 + const val IVANDIS_FLAIL_7_13140 = 13140 + const val IVANDIS_FLAIL_6_13141 = 13141 + const val IVANDIS_FLAIL_5_13142 = 13142 + const val IVANDIS_FLAIL_4_13143 = 13143 + const val IVANDIS_FLAIL_3_13144 = 13144 + const val IVANDIS_FLAIL_2_13145 = 13145 + const val IVANDIS_FLAIL_1_13146 = 13146 + const val FLAIL_DUST_13147 = 13147 + const val GLOVE_13148 = 13148 + const val BOOK_PAGE_13149 = 13149 + const val CRATE_13150 = 13150 + const val COMBAT_BOOK_13151 = 13151 + const val NULL_13152 = 13152 + const val CHAIN_LINK_MOULD_13153 = 13153 + const val SILVTHRIL_CHAIN_13154 = 13154 + const val SILVER_SICKLE_EMERALDB_13155 = 13155 + const val ENCHANTED_SICKLE_EMERALDB_13156 = 13156 + const val VYRE_CORPSE_13157 = 13157 + const val COLUMBARIUM_KEY_13158 = 13158 + const val ORNATE_TOMB_KEY_13159 = 13159 + const val TOME_OF_XP_2ND_ED_3_13160 = 13160 + const val TOME_OF_XP_2ND_ED_2_13161 = 13161 + const val TOME_OF_XP_2ND_ED_1_13162 = 13162 + const val BLACK_CANE_13163 = 13163 + const val ADAMANT_CANE_13164 = 13164 + const val RUNE_CANE_13165 = 13165 + const val TOP_HAT_13166 = 13166 + const val PITH_HELMET_13167 = 13167 + const val SPIKED_HELMET_13168 = 13168 + const val SHEEP_MASK_13169 = 13169 + const val PENGUIN_MASK_13170 = 13170 + const val BAT_MASK_13171 = 13171 + const val CAT_MASK_13172 = 13172 + const val WOLF_MASK_13173 = 13173 + const val BLUE_NAVY_SLACKS_13174 = 13174 + const val GREEN_NAVY_SLACKS_13175 = 13175 + const val RED_NAVY_SLACKS_13176 = 13176 + const val BROWN_NAVY_SLACKS_13177 = 13177 + const val BLACK_NAVY_SLACKS_13178 = 13178 + const val PURPLE_NAVY_SLACKS_13179 = 13179 + const val GREY_NAVY_SLACKS_13180 = 13180 + const val BLUE_NAVAL_SHIRT_13181 = 13181 + const val GREEN_NAVAL_SHIRT_13182 = 13182 + const val RED_NAVAL_SHIRT_13183 = 13183 + const val BROWN_NAVAL_SHIRT_13184 = 13184 + const val BLACK_NAVAL_SHIRT_13185 = 13185 + const val PURPLE_NAVAL_SHIRT_13186 = 13186 + const val GREY_NAVAL_SHIRT_13187 = 13187 + const val BLUE_TRICORN_HAT_13188 = 13188 + const val GREEN_TRICORN_HAT_13189 = 13189 + const val RED_TRICORN_HAT_13190 = 13190 + const val BROWN_TRICORN_HAT_13191 = 13191 + const val BLACK_TRICORN_HAT_13192 = 13192 + const val PURPLE_TRICORN_HAT_13193 = 13193 + const val GREY_TRICORN_HAT_13194 = 13194 + const val NULL_13195 = 13195 + const val NULL_13196 = 13196 + const val NULL_13197 = 13197 + const val NULL_13198 = 13198 + const val NULL_13199 = 13199 + const val NULL_13200 = 13200 + const val NULL_13201 = 13201 + const val NULL_13202 = 13202 + const val NULL_13203 = 13203 + const val NULL_13204 = 13204 + const val NULL_13205 = 13205 + const val NULL_13206 = 13206 + const val NULL_13207 = 13207 + const val NULL_13208 = 13208 + const val NULL_13209 = 13209 + const val NULL_13210 = 13210 + const val NULL_13211 = 13211 + const val NULL_13212 = 13212 + const val NULL_13213 = 13213 + const val NULL_13214 = 13214 + const val NULL_13215 = 13215 + const val NULL_13216 = 13216 + const val NULL_13217 = 13217 + const val NULL_13218 = 13218 + const val NULL_13219 = 13219 + const val NULL_13220 = 13220 + const val NULL_13221 = 13221 + const val NULL_13222 = 13222 + const val NULL_13223 = 13223 + const val NULL_13224 = 13224 + const val NULL_13225 = 13225 + const val NULL_13226 = 13226 + const val MYSTERIOUS_LAMP_13227 = 13227 + const val CRATE_13228 = 13228 + const val LETTER_13229 = 13229 + const val ICEFIEND_NET_13230 = 13230 + const val BABY_ICEFIEND_13231 = 13231 + const val TENT_13232 = 13232 + const val PLANS_13233 = 13233 + const val DWARVEN_KEY_13234 = 13234 + const val NULL_13235 = 13235 + const val THREE_LITTLE_KITTENS_13236 = 13236 + const val NULL_13237 = 13237 + const val TREATED_OAK_PLANK_13238 = 13238 + const val CHISEL_13239 = 13239 + const val _13240 = 13240 + const val TREATED_PLANK_13241 = 13241 + const val _13242 = 13242 + const val STONE_TABLET_13243 = 13243 + const val TZHAAR_TOURIST_GUIDE_13244 = 13244 + const val STONE_SLAB_13245 = 13245 + const val PILLAR_13246 = 13246 + const val SPLAT_13247 = 13247 + const val SPLAT_13248 = 13248 + const val SPLAT_13249 = 13249 + const val SPLAT_13250 = 13250 + const val NULL_13251 = 13251 + const val NULL_13252 = 13252 + const val NULL_13253 = 13253 + const val NULL_13254 = 13254 + const val NULL_13255 = 13255 + const val NULL_13256 = 13256 + const val NULL_13257 = 13257 + const val NULL_13258 = 13258 + const val RANGED_PATH_KEY_13259 = 13259 + const val MAGIC_PATH_KEY_13260 = 13260 + const val NULL_13261 = 13261 + const val NULL_13262 = 13262 + const val SLAYER_HELMET_13263 = 13263 + const val NULL_13264 = 13264 + const val NULL_13265 = 13265 + const val NULL_13266 = 13266 + const val NULL_13267 = 13267 + const val NULL_13268 = 13268 + const val NULL_13269 = 13269 + const val NULL_13270 = 13270 + const val NULL_13271 = 13271 + const val NULL_13272 = 13272 + const val NULL_13273 = 13273 + const val NULL_13274 = 13274 + const val NULL_13275 = 13275 + const val BANSHEE_VOICE_13276 = 13276 + const val MASKED_EARMUFFS_13277 = 13277 + const val BROAD_ARROW_HEADS_13278 = 13278 + const val UNFINISHED_BROAD_BOLTS_13279 = 13279 + const val BROAD_TIPPED_BOLTS_13280 = 13280 + const val RING_OF_SLAYING8_13281 = 13281 + const val RING_OF_SLAYING7_13282 = 13282 + const val RING_OF_SLAYING6_13283 = 13283 + const val RING_OF_SLAYING5_13284 = 13284 + const val RING_OF_SLAYING4_13285 = 13285 + const val RING_OF_SLAYING3_13286 = 13286 + const val RING_OF_SLAYING2_13287 = 13287 + const val RING_OF_SLAYING1_13288 = 13288 + const val NULL_13289 = 13289 + const val LEAF_BLADED_SWORD_13290 = 13290 + const val LEAF_BLADED_SWORD_13291 = 13291 + const val LETTER_13292 = 13292 + const val PLANS_13293 = 13293 + const val CHARCOAL_RUBBING_13294 = 13294 + const val FRANKS_MARK_13295 = 13295 + const val CRUDE_LOCKPICK_13296 = 13296 + const val CUSTOMS_SHIRT_13297 = 13297 + const val CUSTOMS_TROUSERS_13298 = 13298 + const val CUSTOMS_HAT_13299 = 13299 + const val FILE_13300 = 13300 + const val FILE_13301 = 13301 + const val BROOCH_13302 = 13302 + const val IZZYS_MARK_13303 = 13303 + const val KEY_13304 = 13304 + const val CROWBAR_13305 = 13305 + const val NULL_13306 = 13306 + const val IDOL_OF_MANY_HEADS_13307 = 13307 + const val BILL_TEACHS_MARK_13308 = 13308 + const val PAPER_13309 = 13309 + const val CONFESSION_13310 = 13310 + const val NOTE_13311 = 13311 + const val INK_BOTTLE_13312 = 13312 + const val INKY_PAPER_13313 = 13313 + const val INK_BOTTLE_13314 = 13314 + const val SMASHED_BOTTLE_13315 = 13315 + const val PRISON_UNIFORM_TOP_13316 = 13316 + const val PRISON_UNIFORM_TROUSERS_13317 = 13317 + const val FISHY_PRISON_UNIFORM_TOP_13318 = 13318 + const val TIN_CUP_13319 = 13319 + const val TIN_CUP_13320 = 13320 + const val PIPE_13321 = 13321 + const val ACCORDION_13322 = 13322 + const val ACCORDION_13323 = 13323 + const val ACCORDION_13324 = 13324 + const val VACUUM_PUMP_13325 = 13325 + const val VACUUM_PUMP_AND_GULL_13326 = 13326 + const val QUILL_13327 = 13327 + const val INKY_QUILL_13328 = 13328 + const val FILE_13329 = 13329 + const val FILE_13330 = 13330 + const val EX_PARROT_13331 = 13331 + const val MAGICAL_CAGE_13332 = 13332 + const val EX_PARROT_IN_A_MAGIC_CAGE_13333 = 13333 + const val EX_EX_PARROT_IN_A_MAGIC_CAGE_13334 = 13334 + const val EX_EX_PARROT_13335 = 13335 + const val EX_EX_PARROT_13336 = 13336 + const val PIRATE_IMPLING_JAR_13337 = 13337 + const val PIRATE_IMPLING_JAR_13338 = 13338 + const val BANDANA_AND_EYEPATCH_13339 = 13339 + const val BANDANA_AND_EYEPATCHES_13340 = 13340 + const val BANDANA_AND_EYEPATCH_13341 = 13341 + const val BANDANA_AND_EYEPATCHES_13342 = 13342 + const val BANDANA_AND_EYEPATCH_13343 = 13343 + const val BANDANA_AND_EYEPATCHES_13344 = 13344 + const val BANDANA_AND_EYEPATCH_13345 = 13345 + const val BANDANA_AND_EYEPATCHES_13346 = 13346 + const val BANDANA_AND_EYEPATCH_13347 = 13347 + const val BANDANA_AND_EYEPATCHES_13348 = 13348 + const val BANDANA_AND_EYEPATCH_13349 = 13349 + const val BANDANA_AND_EYEPATCHES_13350 = 13350 + const val BANDANA_AND_EYEPATCH_13351 = 13351 + const val BANDANA_AND_EYEPATCHES_13352 = 13352 + const val DOUBLE_EYEPATCHES_13353 = 13353 + const val PIRATE_HAT_AND_EYEPATCHES_13354 = 13354 + const val LEFT_EYEPATCH_13355 = 13355 + const val LEFT_EYEPATCH_13356 = 13356 + const val PIRATE_HAT_AND_EYEPATCH_13357 = 13357 + const val STRIPY_PIRATE_SHIRT_13358 = 13358 + const val STRIPY_PIRATE_SHIRT_13359 = 13359 + const val STRIPY_PIRATE_SHIRT_13360 = 13360 + const val STRIPY_PIRATE_SHIRT_13361 = 13361 + const val STRIPY_PIRATE_SHIRT_13362 = 13362 + const val STRIPY_PIRATE_SHIRT_13363 = 13363 + const val PIRATE_LEGGINGS_13364 = 13364 + const val PIRATE_LEGGINGS_13365 = 13365 + const val PIRATE_LEGGINGS_13366 = 13366 + const val PIRATE_LEGGINGS_13367 = 13367 + const val PIRATE_LEGGINGS_13368 = 13368 + const val PIRATE_LEGGINGS_13369 = 13369 + const val BANDANA_13370 = 13370 + const val BANDANA_13371 = 13371 + const val BANDANA_13372 = 13372 + const val BANDANA_13373 = 13373 + const val BANDANA_13374 = 13374 + const val BANDANA_13375 = 13375 + const val BANDANA_AND_EYEPATCH_13376 = 13376 + const val BANDANA_AND_EYEPATCH_13377 = 13377 + const val BANDANA_AND_EYEPATCH_13378 = 13378 + const val ROCK_FRAGMENTS_13379 = 13379 + const val INTRODUCTION_LETTER_13380 = 13380 + const val BROKEN_HAND_13381 = 13381 + const val BROKEN_HAND_13382 = 13382 + const val BROKEN_HAND_13383 = 13383 + const val BROKEN_HAND_13384 = 13384 + const val BROKEN_HAND_13385 = 13385 + const val FINGERS_13386 = 13386 + const val THUMB_13387 = 13387 + const val HAND_13388 = 13388 + const val WRIST_13389 = 13389 + const val BRACE_13390 = 13390 + const val BRASS_HAND_13391 = 13391 + const val INK_PAD_13392 = 13392 + const val INKY_HAND_13393 = 13393 + const val PAPER_13394 = 13394 + const val BRASS_HAND_HARRYS_MARK_13395 = 13395 + const val FAKE_BEARD_13396 = 13396 + const val FAKE_MOUSTACHE_AND_NOSE_13397 = 13397 + const val FAKE_MONOCLE_MOUSTACHE_AND_NOSE_13398 = 13398 + const val CURLY_WIG_13399 = 13399 + const val STRAIGHT_WIG_13400 = 13400 + const val ORDER_13401 = 13401 + const val BRAINDEATHS_MARK_13402 = 13402 + const val GOLDEN_TINDERBOX_13403 = 13403 + const val NULL_13404 = 13404 + const val DARK_BOW_13405 = 13405 + const val ANCIENT_STAFF_13406 = 13406 + const val ARCHER_HELM_13407 = 13407 + const val BERSERKER_HELM_13408 = 13408 + const val WARRIOR_HELM_13409 = 13409 + const val FARSEER_HELM_13410 = 13410 + const val ROCK_SHELL_HELM_13411 = 13411 + const val ROCK_SHELL_PLATE_13412 = 13412 + const val ROCK_SHELL_LEGS_13413 = 13413 + const val SPINED_HELM_13414 = 13414 + const val SPINED_BODY_13415 = 13415 + const val SPINED_CHAPS_13416 = 13416 + const val SKELETAL_HELM_13417 = 13417 + const val SKELETAL_TOP_13418 = 13418 + const val SKELETAL_BOTTOMS_13419 = 13419 + const val SPINED_BOOTS_13420 = 13420 + const val ROCK_SHELL_BOOTS_13421 = 13421 + const val SKELETAL_BOOTS_13422 = 13422 + const val SPINED_GLOVES_13423 = 13423 + const val ROCK_SHELL_GLOVES_13424 = 13424 + const val SKELETAL_GLOVES_13425 = 13425 + const val SEERS_RING_13426 = 13426 + const val ARCHERS_RING_13427 = 13427 + const val WARRIOR_RING_13428 = 13428 + const val BERSERKER_RING_13429 = 13429 + const val DRAGON_2H_SWORD_13430 = 13430 + const val CRAYFISH_CAGE_13431 = 13431 + const val CRAYFISH_CAGE_13432 = 13432 + const val CRAYFISH_13433 = 13433 + const val CRAYFISH_13434 = 13434 + const val RAW_CRAYFISH_13435 = 13435 + const val RAW_CRAYFISH_13436 = 13436 + const val BURNT_CRAYFISH_13437 = 13437 + const val BURNT_CRAYFISH_13438 = 13438 + const val ANTIQUE_LAMP_13439 = 13439 + const val BAG_OF_RUNES_13440 = 13440 + const val NULL_13441 = 13441 + const val AMULET_OF_FURY_13442 = 13442 + const val OBSIDIAN_CAPE_13443 = 13443 + const val ABYSSAL_WHIP_13444 = 13444 + const val GRANITE_MAUL_13445 = 13445 + const val ANTIQUE_LAMP_13446 = 13446 + const val ANTIQUE_LAMP_13447 = 13447 + const val ANTIQUE_LAMP_13448 = 13448 + const val DRAGON_FULL_HELM_13449 = 13449 + const val ARMADYL_GODSWORD_13450 = 13450 + const val BANDOS_GODSWORD_13451 = 13451 + const val SARADOMIN_GODSWORD_13452 = 13452 + const val ZAMORAK_GODSWORD_13453 = 13453 + const val ZAMORAKIAN_SPEAR_13454 = 13454 + const val ARMADYL_HELMET_13455 = 13455 + const val ARMADYL_CHESTPLATE_13456 = 13456 + const val ARMADYL_PLATESKIRT_13457 = 13457 + const val BANDOS_CHESTPLATE_13458 = 13458 + const val BANDOS_TASSETS_13459 = 13459 + const val BANDOS_BOOTS_13460 = 13460 + const val SARADOMIN_SWORD_13461 = 13461 + const val DRAGON_BOOTS_13462 = 13462 + const val ANTIQUE_LAMP_13463 = 13463 + const val TASK_LIST_13464 = 13464 + const val DRAGON_DAGGER_13465 = 13465 + const val DRAGON_DAGGERP_13466 = 13466 + const val DRAGON_DAGGERP_PLUS_13467 = 13467 + const val DRAGON_DAGGERP_PLUS_PLUS_13468 = 13468 + const val RUNE_AXE_13469 = 13469 + const val DRAGON_AXE_13470 = 13470 + const val RUNE_BATTLEAXE_13471 = 13471 + const val DRAGON_BATTLEAXE_13472 = 13472 + const val RUNE_WARHAMMER_13473 = 13473 + const val RUNE_LONGSWORD_13474 = 13474 + const val DRAGON_LONGSWORD_13475 = 13475 + const val RUNE_SCIMITAR_13476 = 13476 + const val DRAGON_SCIMITAR_13477 = 13477 + const val DRAGON_HALBERD_13478 = 13478 + const val DRAGON_MACE_13479 = 13479 + const val RUNE_PICKAXE_13480 = 13480 + const val DRAGON_CHAINBODY_13481 = 13481 + const val RUNE_PLATEBODY_13482 = 13482 + const val GREEN_DHIDE_BODY_13483 = 13483 + const val BLUE_DHIDE_BODY_13484 = 13484 + const val RED_DHIDE_BODY_13485 = 13485 + const val BLACK_DHIDE_BODY_13486 = 13486 + const val RUNE_PLATELEGS_13487 = 13487 + const val DRAGON_PLATELEGS_13488 = 13488 + const val RUNE_PLATESKIRT_13489 = 13489 + const val DRAGON_PLATESKIRT_13490 = 13490 + const val GREEN_DHIDE_CHAPS_13491 = 13491 + const val BLUE_DHIDE_CHAPS_13492 = 13492 + const val RED_DHIDE_CHAPS_13493 = 13493 + const val BLACK_DHIDE_CHAPS_13494 = 13494 + const val DRAGON_MED_HELM_13495 = 13495 + const val RUNE_FULL_HELM_13496 = 13496 + const val GREEN_DHIDE_VAMB_13497 = 13497 + const val BLUE_DHIDE_VAMB_13498 = 13498 + const val RED_DHIDE_VAMB_13499 = 13499 + const val BLACK_DHIDE_VAMB_13500 = 13500 + const val SPLITBARK_HELM_13501 = 13501 + const val SPLITBARK_BODY_13502 = 13502 + const val SPLITBARK_LEGS_13503 = 13503 + const val SPLITBARK_GAUNTLETS_13504 = 13504 + const val SPLITBARK_BOOTS_13505 = 13505 + const val DRAGON_SQ_SHIELD_13506 = 13506 + const val RUNE_KITESHIELD_13507 = 13507 + const val MYSTIC_HAT_13508 = 13508 + const val MYSTIC_ROBE_TOP_13509 = 13509 + const val MYSTIC_ROBE_BOTTOM_13510 = 13510 + const val MYSTIC_GLOVES_13511 = 13511 + const val MYSTIC_BOOTS_13512 = 13512 + const val MYSTIC_HAT_13513 = 13513 + const val MYSTIC_ROBE_TOP_13514 = 13514 + const val MYSTIC_ROBE_BOTTOM_13515 = 13515 + const val MYSTIC_GLOVES_13516 = 13516 + const val MYSTIC_BOOTS_13517 = 13517 + const val MYSTIC_HAT_13518 = 13518 + const val MYSTIC_ROBE_TOP_13519 = 13519 + const val MYSTIC_ROBE_BOTTOM_13520 = 13520 + const val MYSTIC_GLOVES_13521 = 13521 + const val MYSTIC_BOOTS_13522 = 13522 + const val MAPLE_LONGBOW_13523 = 13523 + const val MAPLE_SHORTBOW_13524 = 13524 + const val YEW_LONGBOW_13525 = 13525 + const val YEW_SHORTBOW_13526 = 13526 + const val MAGIC_LONGBOW_13527 = 13527 + const val MAGIC_SHORTBOW_13528 = 13528 + const val SEERCULL_13529 = 13529 + const val RUNE_CROSSBOW_13530 = 13530 + const val RED_PARTYHAT_13531 = 13531 + const val YELLOW_PARTYHAT_13532 = 13532 + const val BLUE_PARTYHAT_13533 = 13533 + const val GREEN_PARTYHAT_13534 = 13534 + const val PURPLE_PARTYHAT_13535 = 13535 + const val WHITE_PARTYHAT_13536 = 13536 + const val SANTA_HAT_13537 = 13537 + const val GREEN_HWEEN_MASK_13538 = 13538 + const val BLUE_HWEEN_MASK_13539 = 13539 + const val RED_HWEEN_MASK_13540 = 13540 + const val WILLOW_COMP_BOW_13541 = 13541 + const val YEW_COMP_BOW_13542 = 13542 + const val MAGIC_COMP_BOW_13543 = 13543 + const val THIRD_AGE_RANGE_TOP_13544 = 13544 + const val THIRD_AGE_RANGE_LEGS_13545 = 13545 + const val THIRD_AGE_RANGE_COIF_13546 = 13546 + const val THIRD_AGE_VAMBRACES_13547 = 13547 + const val THIRD_AGE_ROBE_TOP_13548 = 13548 + const val THIRD_AGE_ROBE_13549 = 13549 + const val THIRD_AGE_MAGE_HAT_13550 = 13550 + const val THIRD_AGE_AMULET_13551 = 13551 + const val THIRD_AGE_PLATELEGS_13552 = 13552 + const val THIRD_AGE_PLATEBODY_13553 = 13553 + const val THIRD_AGE_FULL_HELMET_13554 = 13554 + const val THIRD_AGE_KITESHIELD_13555 = 13555 + const val RANGER_BOOTS_13556 = 13556 + const val WIZARD_BOOTS_13557 = 13557 + const val ROBIN_HOOD_HAT_13558 = 13558 + const val NULL_13559 = 13559 + const val EXPLORERS_RING_1_13560 = 13560 + const val EXPLORERS_RING_2_13561 = 13561 + const val EXPLORERS_RING_3_13562 = 13562 + const val BUTTON_MUSHROOM_13563 = 13563 + const val BUTTON_MUSHROOM_13564 = 13564 + const val DOLL_13565 = 13565 + const val JENNICAS_RING_13566 = 13566 + const val CURSED_MAGIC_LOGS_13567 = 13567 + const val CURSED_MAGIC_LOGS_13568 = 13568 + const val ENCHANTED_KEY_NOTES_13569 = 13569 + const val BOWL_13570 = 13570 + const val BUCKET_OF_MILK_13571 = 13571 + const val CLEAN_GUAM_13572 = 13572 + const val BOWL_OF_HONEY_13573 = 13573 + const val BOWL_OF_MILK_AND_HONEY_13574 = 13574 + const val BOWL_OF_MILK_HONEY_AND_GUAM_13575 = 13575 + const val MAP_OF_2009scape_13576 = 13576 + const val PAPYRUS_13577 = 13577 + const val CHARCOAL_13578 = 13578 + const val SPADE_13579 = 13579 + const val PLANT_POT_13580 = 13580 + const val PEAR_TREE_SEEDLING_13581 = 13581 + const val MANGO_TREE_SEEDLING_13582 = 13582 + const val QUINCE_TREE_SEEDLING_13583 = 13583 + const val LEMON_TREE_SEEDLING_13584 = 13584 + const val AVOCADO_TREE_SEEDLING_13585 = 13585 + const val PLUM_TREE_SEEDLING_13586 = 13586 + const val PESTLE_AND_MORTAR_13587 = 13587 + const val GROUND_GUAM_13588 = 13588 + const val BUCKET_13589 = 13589 + const val NULL_13590 = 13590 + const val ENCHANTED_KEY_13591 = 13591 + const val A_BROOCH_13592 = 13592 + const val OLD_TOME_13593 = 13593 + const val NULL_13594 = 13594 + const val NULL_13595 = 13595 + const val NULL_13596 = 13596 + const val NULL_13597 = 13597 + const val RUNECRAFTING_GUILD_TELEPORT_13598 = 13598 + const val AIR_ALTAR_TELEPORT_13599 = 13599 + const val MIND_ALTAR_TELEPORT_13600 = 13600 + const val WATER_ALTAR_TELEPORT_13601 = 13601 + const val EARTH_ALTAR_TELEPORT_13602 = 13602 + const val FIRE_ALTAR_TELEPORT_13603 = 13603 + const val BODY_ALTAR_TELEPORT_13604 = 13604 + const val COSMIC_ALTAR_TELEPORT_13605 = 13605 + const val CHAOS_ALTAR_TELEPORT_13606 = 13606 + const val NATURE_ALTAR_TELEPORT_13607 = 13607 + const val LAW_ALTAR_TELEPORT_13608 = 13608 + const val DEATH_ALTAR_TELEPORT_13609 = 13609 + const val BLOOD_ALTAR_TELEPORT_13610 = 13610 + const val ASTRAL_ALTAR_TELEPORT_13611 = 13611 + const val RUNECRAFTER_HAT_13612 = 13612 + const val RUNECRAFTER_HAT_13613 = 13613 + const val RUNECRAFTER_ROBE_13614 = 13614 + const val RUNECRAFTER_HAT_13615 = 13615 + const val RUNECRAFTER_HAT_13616 = 13616 + const val RUNECRAFTER_SKIRT_13617 = 13617 + const val RUNECRAFTER_GLOVES_13618 = 13618 + const val RUNECRAFTER_ROBE_13619 = 13619 + const val RUNECRAFTER_HAT_13620 = 13620 + const val RUNECRAFTER_HAT_13621 = 13621 + const val RUNECRAFTER_SKIRT_13622 = 13622 + const val RUNECRAFTER_GLOVES_13623 = 13623 + const val RUNECRAFTER_ROBE_13624 = 13624 + const val RUNECRAFTER_HAT_13625 = 13625 + const val RUNECRAFTER_HAT_13626 = 13626 + const val RUNECRAFTER_SKIRT_13627 = 13627 + const val RUNECRAFTER_GLOVES_13628 = 13628 + const val RUNECRAFTING_STAFF_13629 = 13629 + const val AIR_TALISMAN_STAFF_13630 = 13630 + const val MIND_TALISMAN_STAFF_13631 = 13631 + const val WATER_TALISMAN_STAFF_13632 = 13632 + const val EARTH_TALISMAN_STAFF_13633 = 13633 + const val FIRE_TALISMAN_STAFF_13634 = 13634 + const val BODY_TALISMAN_STAFF_13635 = 13635 + const val COSMIC_TALISMAN_STAFF_13636 = 13636 + const val CHAOS_TALISMAN_STAFF_13637 = 13637 + const val NATURE_TALISMAN_STAFF_13638 = 13638 + const val LAW_TALISMAN_STAFF_13639 = 13639 + const val DEATH_TALISMAN_STAFF_13640 = 13640 + const val BLOOD_TALISMAN_STAFF_13641 = 13641 + const val OMNI_TALISMAN_STAFF_13642 = 13642 + const val YELLOW_ATTRACTOR_13643 = 13643 + const val YELLOW_REPELLER_13644 = 13644 + const val GREEN_ATTRACTOR_13645 = 13645 + const val GREEN_REPELLER_13646 = 13646 + const val GREEN_BARRIER_GENERATOR_13647 = 13647 + const val YELLOW_BARRIER_GENERATOR_13648 = 13648 + const val OMNI_TALISMAN_13649 = 13649 + const val RUNECRAFTING_GUILD_TOKEN_13650 = 13650 + const val RUNECRAFTING_GUILD_TOKEN_13651 = 13651 + const val RUNECRAFTING_GUILD_TOKEN_13652 = 13652 + const val RUNECRAFTING_GUILD_TOKEN_13653 = 13653 + const val RUNECRAFTING_GUILD_TOKEN_13654 = 13654 + const val OMNI_TIARA_13655 = 13655 + const val RUNECRAFTER_HAT_13656 = 13656 + const val RUNECRAFTER_HAT_13657 = 13657 + const val RUNECRAFTER_HAT_13658 = 13658 + const val RING_OF_FIRE_13659 = 13659 + const val FLAME_GLOVES_13660 = 13660 + const val INFERNO_ADZE_13661 = 13661 + const val FIRE_BEACON_13662 = 13662 + const val CIRCUS_TICKET_13663 = 13663 + const val NULL_13664 = 13664 + const val NULL_13665 = 13665 + const val GIANTS_HAND_13666 = 13666 + const val CLOWN_HAT_13667 = 13667 + const val CLOWN_SHIRT_13668 = 13668 + const val CLOWN_LEGGINGS_13669 = 13669 + const val CLOWN_SHOES_13670 = 13670 + const val TAMBOURINE_13671 = 13671 + const val RINGMASTER_HAT_13672 = 13672 + const val RINGMASTER_SHIRT_13673 = 13673 + const val RINGMASTER_PANTS_13674 = 13674 + const val RINGMASTER_BOOTS_13675 = 13675 + const val MEGA_PHONUS_13676 = 13676 + const val ACROBAT_SHIRT_13677 = 13677 + const val ACROBAT_PANTS_13678 = 13678 + const val ACROBAT_SHOES_13679 = 13679 + const val ACROBAT_HOOD_13680 = 13680 + const val ACROBAT_SHIRT_13681 = 13681 + const val ACROBAT_PANTS_13682 = 13682 + const val ACROBAT_SHOES_13683 = 13683 + const val ACROBAT_HOOD_13684 = 13684 + const val A_STYLISH_HAT_13685 = 13685 + const val A_STYLISH_HAT_13686 = 13686 + const val A_STYLISH_HAT_13687 = 13687 + const val A_STYLISH_HAT_13688 = 13688 + const val A_STYLISH_HAT_13689 = 13689 + const val A_STYLISH_HAT_13690 = 13690 + const val SHIRT_13691 = 13691 + const val SHIRT_13692 = 13692 + const val SHIRT_13693 = 13693 + const val SHIRT_13694 = 13694 + const val SHIRT_13695 = 13695 + const val SHIRT_13696 = 13696 + const val LEGGINGS_13697 = 13697 + const val LEGGINGS_13698 = 13698 + const val LEGGINGS_13699 = 13699 + const val SKIRT_13700 = 13700 + const val SKIRT_13701 = 13701 + const val SKIRT_13702 = 13702 + const val SHOES_13703 = 13703 + const val SHOES_13704 = 13704 + const val SHOES_13705 = 13705 + const val SHOES_13706 = 13706 + const val TIGHTROPE_101_13707 = 13707 + const val TIGHTROPE_101_13708 = 13708 + const val BALLS_LEVEL_10_APPROX_13709 = 13709 + const val PLATES_LEVEL_20_APPROX_13710 = 13710 + const val EGGS_LEVEL_30_APPROX_13711 = 13711 + const val KNIVES_LEVEL_40_APPROX_13712 = 13712 + const val SPADES_LEVEL_50_APPROX_13713 = 13713 + const val TUNA_LEVEL_60_APPROX_13714 = 13714 + const val SOAP_LEVEL_70_APPROX_13715 = 13715 + const val CANNON_BALLS_LEVEL_80_APPROX_13716 = 13716 + const val TORCHES_LEVEL_90_APPROX_13717 = 13717 + const val CHINCHOMPAS_LEVEL_99_APPROX_13718 = 13718 + const val PERFORMANCE_SHORTBOW_13719 = 13719 + const val PERFORMANCE_KNIFE_13720 = 13720 + const val PERFORMANCE_THROWING_AXE_13721 = 13721 + const val PERFORMANCE_ARROW_13722 = 13722 + const val TELEPORT_SPELL_13723 = 13723 + const val LEVITATION_SPELL_13724 = 13724 + const val ALCHEMY_SPELL_13725 = 13725 + const val ELEMENTAL_SPELL_13726 = 13726 + const val STARDUST_13727 = 13727 + const val NULL_13728 = 13728 + const val NULL_13729 = 13729 + const val NULL_13730 = 13730 + const val NULL_13731 = 13731 + const val SPY_NOTEBOOK_13732 = 13732 + const val NULL_13733 = 13733 + const val SPIRIT_SHIELD_13734 = 13734 + const val SPIRIT_SHIELD_13735 = 13735 + const val BLESSED_SPIRIT_SHIELD_13736 = 13736 + const val BLESSED_SPIRIT_SHIELD_13737 = 13737 + const val ARCANE_SPIRIT_SHIELD_13738 = 13738 + const val ARCANE_SPIRIT_SHIELD_13739 = 13739 + const val DIVINE_SPIRIT_SHIELD_13740 = 13740 + const val DIVINE_SPIRIT_SHIELD_13741 = 13741 + const val ELYSIAN_SPIRIT_SHIELD_13742 = 13742 + const val ELYSIAN_SPIRIT_SHIELD_13743 = 13743 + const val SPECTRAL_SPIRIT_SHIELD_13744 = 13744 + const val SPECTRAL_SPIRIT_SHIELD_13745 = 13745 + const val ARCANE_SIGIL_13746 = 13746 + const val ARCANE_SIGIL_13747 = 13747 + const val DIVINE_SIGIL_13748 = 13748 + const val DIVINE_SIGIL_13749 = 13749 + const val ELYSIAN_SIGIL_13750 = 13750 + const val ELYSIAN_SIGIL_13751 = 13751 + const val SPECTRAL_SIGIL_13752 = 13752 + const val SPECTRAL_SIGIL_13753 = 13753 + const val HOLY_ELIXIR_13754 = 13754 + const val HOLY_ELIXIR_13755 = 13755 + const val CURSED_WILLOW_LOGS_13756 = 13756 + const val HARTWIN_13757 = 13757 + const val GRUBBY_KEY_13758 = 13758 + const val SCRAP_OF_PAPER_13759 = 13759 + const val BOTTLE_13760 = 13760 + const val BOTTLE_OF_MIST_13761 = 13761 + const val LIST_OF_ELDERS_13762 = 13762 + const val CAVALIER_AND_MASK_13763 = 13763 + const val RUNE_CLAWS_13764 = 13764 + const val RUNE_DAGGER_13765 = 13765 + const val RUNE_DAGGERP_13766 = 13766 + const val RUNE_DAGGERP_PLUS_13767 = 13767 + const val RUNE_DAGGERP_PLUS_PLUS_13768 = 13768 + const val RUNE_SPEAR_13769 = 13769 + const val DRAGON_SPEAR_13770 = 13770 + const val RUNE_SPEARP_13771 = 13771 + const val DRAGON_SPEARP_13772 = 13772 + const val RUNE_SPEARP_PLUS_13773 = 13773 + const val DRAGON_SPEARP_PLUS_13774 = 13774 + const val RUNE_SPEARP_PLUS_PLUS_13775 = 13775 + const val DRAGON_SPEARP_PLUS_PLUS_13776 = 13776 + const val RUNE_SWORD_13777 = 13777 + const val RUNE_2H_SWORD_13778 = 13778 + const val RUNE_HALBERD_13779 = 13779 + const val RUNE_MACE_13780 = 13780 + const val RUNE_CHAINBODY_13781 = 13781 + const val RUNE_BOOTS_13782 = 13782 + const val RUNE_MED_HELM_13783 = 13783 + const val GRANITE_HELM_13784 = 13784 + const val GRANITE_BODY_13785 = 13785 + const val GRANITE_LEGS_13786 = 13786 + const val RUNE_SQ_SHIELD_13787 = 13787 + const val GRANITE_SHIELD_13788 = 13788 + const val A_POWDERED_WIG_13789 = 13789 + const val FLARED_TROUSERS_13790 = 13790 + const val PANTALOONS_13791 = 13791 + const val SLEEPING_CAP_13792 = 13792 + const val RUNE_CANE_13793 = 13793 + const val TOP_HAT_13794 = 13794 + const val SHEEP_MASK_13795 = 13795 + const val PENGUIN_MASK_13796 = 13796 + const val BAT_MASK_13797 = 13797 + const val CAT_MASK_13798 = 13798 + const val WOLF_MASK_13799 = 13799 + const val RUNE_PLATEBODY_G_13800 = 13800 + const val RUNE_PLATELEGS_G_13801 = 13801 + const val RUNE_PLATESKIRT_G_13802 = 13802 + const val RUNE_FULL_HELMG_13803 = 13803 + const val RUNE_KITESHIELD_G_13804 = 13804 + const val RUNE_PLATEBODY_T_13805 = 13805 + const val RUNE_PLATELEGS_T_13806 = 13806 + const val RUNE_PLATESKIRT_T_13807 = 13807 + const val RUNE_FULL_HELM_T_13808 = 13808 + const val RUNE_KITESHIELD_T_13809 = 13809 + const val HIGHWAYMAN_MASK_13810 = 13810 + const val BLUE_BERET_13811 = 13811 + const val BLACK_BERET_13812 = 13812 + const val WHITE_BERET_13813 = 13813 + const val TAN_CAVALIER_13814 = 13814 + const val DARK_CAVALIER_13815 = 13815 + const val BLACK_CAVALIER_13816 = 13816 + const val RED_HEADBAND_13817 = 13817 + const val BLACK_HEADBAND_13818 = 13818 + const val BROWN_HEADBAND_13819 = 13819 + const val ZAMORAK_PLATEBODY_13820 = 13820 + const val ZAMORAK_PLATELEGS_13821 = 13821 + const val ZAMORAK_PLATESKIRT_13822 = 13822 + const val ZAMORAK_FULL_HELM_13823 = 13823 + const val ZAMORAK_KITESHIELD_13824 = 13824 + const val SARADOMIN_PLATEBODY_13825 = 13825 + const val SARADOMIN_PLATELEGS_13826 = 13826 + const val SARADOMIN_PLATESKIRT_13827 = 13827 + const val SARADOMIN_FULL_HELM_13828 = 13828 + const val SARADOMIN_KITESHIELD_13829 = 13829 + const val GUTHIX_PLATEBODY_13830 = 13830 + const val GUTHIX_PLATELEGS_13831 = 13831 + const val GUTHIX_PLATESKIRT_13832 = 13832 + const val GUTHIX_FULL_HELM_13833 = 13833 + const val GUTHIX_KITESHIELD_13834 = 13834 + const val GILDED_PLATEBODY_13835 = 13835 + const val GILDED_PLATELEGS_13836 = 13836 + const val GILDED_PLATESKIRT_13837 = 13837 + const val GILDED_FULL_HELM_13838 = 13838 + const val GILDED_KITESHIELD_13839 = 13839 + const val NULL_13840 = 13840 + const val NULL_13841 = 13841 + const val NULL_13842 = 13842 + const val NULL_13843 = 13843 + const val NULL_13844 = 13844 + const val BRAWLING_GLOVES_MELEE_13845 = 13845 + const val BRAWLING_GLOVES_RANGED_13846 = 13846 + const val BRAWLING_GLOVES_MAGIC_13847 = 13847 + const val BRAWLING_GLOVES_PRAYER_13848 = 13848 + const val BRAWLING_GLOVES_AGILITY_13849 = 13849 + const val BRAWLING_GLOVES_WC_13850 = 13850 + const val BRAWLING_GLOVES_FM_13851 = 13851 + const val BRAWLING_GLOVES_MINING_13852 = 13852 + const val BRAWLING_GLOVES_HUNTER_13853 = 13853 + const val BRAWLING_GLOVES_THIEVING_13854 = 13854 + const val BRAWLING_GLOVES_SMITHING_13855 = 13855 + const val BRAWLING_GLOVES_FISHING_13856 = 13856 + const val BRAWLING_GLOVES_COOKING_13857 = 13857 + const val ZURIELS_ROBE_TOP_13858 = 13858 + const val ZURIELS_ROBE_TOP_13859 = 13859 + const val ZURIELS_ROBE_TOP_DEG_13860 = 13860 + const val ZURIELS_ROBE_BOTTOM_13861 = 13861 + const val ZURIELS_ROBE_BOTTOM_13862 = 13862 + const val ZURIELS_ROBE_BOTTOM_DEG_13863 = 13863 + const val ZURIELS_HOOD_13864 = 13864 + const val ZURIELS_HOOD_13865 = 13865 + const val ZURIELS_HOOD_DEG_13866 = 13866 + const val ZURIELS_STAFF_13867 = 13867 + const val ZURIELS_STAFF_13868 = 13868 + const val ZURIELS_STAFF_DEG_13869 = 13869 + const val MORRIGANS_LEATHER_BODY_13870 = 13870 + const val MORRIGANS_LEATHER_BODY_13871 = 13871 + const val MORRIGANS_LEATHER_BODY_DEG_13872 = 13872 + const val MORRIGANS_LEATHER_CHAPS_13873 = 13873 + const val MORRIGANS_LEATHER_CHAPS_13874 = 13874 + const val MORRIGANS_LEATHER_CHAPS_DEG_13875 = 13875 + const val MORRIGANS_COIF_13876 = 13876 + const val MORRIGANS_COIF_13877 = 13877 + const val MORRIGANS_COIF_DEG_13878 = 13878 + const val MORRIGANS_JAVELIN_13879 = 13879 + const val MORRIGANS_JAVELINP_13880 = 13880 + const val MORRIGANS_JAVELINP_PLUS_13881 = 13881 + const val MORRIGANS_JAVELINP_PLUS_PLUS_13882 = 13882 + const val MORRIGANS_THROWING_AXE_13883 = 13883 + const val STATIUSS_PLATEBODY_13884 = 13884 + const val STATIUSS_PLATEBODY_13885 = 13885 + const val STATIUSS_PLATEBODY_DEG_13886 = 13886 + const val VESTAS_CHAINBODY_13887 = 13887 + const val VESTAS_CHAINBODY_13888 = 13888 + const val VESTAS_CHAINBODY_DEG_13889 = 13889 + const val STATIUSS_PLATELEGS_13890 = 13890 + const val STATIUSS_PLATELEGS_13891 = 13891 + const val STATIUSS_PLATELEGS_DEG_13892 = 13892 + const val VESTAS_PLATESKIRT_13893 = 13893 + const val VESTAS_PLATESKIRT_13894 = 13894 + const val VESTAS_PLATESKIRT_DEG_13895 = 13895 + const val STATIUSS_FULL_HELM_13896 = 13896 + const val STATIUSS_FULL_HELM_13897 = 13897 + const val STATIUS_FULL_HELM_DEG_13898 = 13898 + const val VESTAS_LONGSWORD_13899 = 13899 + const val VESTAS_LONGSWORD_13900 = 13900 + const val VESTAS_LONGSWORD_DEG_13901 = 13901 + const val STATIUSS_WARHAMMER_13902 = 13902 + const val STATIUSS_WARHAMMER_13903 = 13903 + const val STATIUS_WARHAMMER_DEG_13904 = 13904 + const val VESTAS_SPEAR_13905 = 13905 + const val VESTAS_SPEAR_13906 = 13906 + const val VESTAS_SPEAR_DEG_13907 = 13907 + const val CORRUPT_STATIUSS_PLATEBODY_13908 = 13908 + const val CORRUPT_STATIUSS_PLATEBODY_13909 = 13909 + const val CORRUPT_STATIUSS_PLATEBODY_DEG_13910 = 13910 + const val CORRUPT_VESTAS_CHAINBODY_13911 = 13911 + const val CORRUPT_VESTAS_CHAINBODY_13912 = 13912 + const val CORRUPT_VESTAS_CHAINBODY_DEG_13913 = 13913 + const val CORRUPT_STATIUSS_PLATELEGS_13914 = 13914 + const val CORRUPT_STATIUSS_PLATELEGS_13915 = 13915 + const val CORRUPT_STATIUSS_PLATELEGS_DEG_13916 = 13916 + const val CORRUPT_VESTAS_PLATESKIRT_13917 = 13917 + const val CORRUPT_VESTAS_PLATESKIRT_13918 = 13918 + const val CORRUPT_VESTAS_PLATESKIRT_DEG_13919 = 13919 + const val CORRUPT_STATIUSS_FULL_HELM_13920 = 13920 + const val CORRUPT_STATIUSS_FULL_HELM_13921 = 13921 + const val CORRUPT_STATIUS_FULL_HELM_DEG_13922 = 13922 + const val CORRUPT_VESTAS_LONGSWORD_13923 = 13923 + const val CORRUPT_VESTAS_LONGSWORD_13924 = 13924 + const val C_VESTAS_LONGSWORD_DEG_13925 = 13925 + const val CORRUPT_STATIUSS_WARHAMMER_13926 = 13926 + const val CORRUPT_STATIUSS_WARHAMMER_13927 = 13927 + const val C_STATIUSS_WARHAMMER_DEG_13928 = 13928 + const val CORRUPT_VESTAS_SPEAR_13929 = 13929 + const val CORRUPT_VESTAS_SPEAR_13930 = 13930 + const val CORRUPT_VESTAS_SPEAR_DEG_13931 = 13931 + const val CORRUPT_ZURIELS_ROBE_TOP_13932 = 13932 + const val CORRUPT_ZURIELS_ROBE_TOP_13933 = 13933 + const val CORRUPT_ZURIELS_ROBE_TOP_DEG_13934 = 13934 + const val CORRUPT_ZURIELS_ROBE_BOTTOM_13935 = 13935 + const val CORRUPT_ZURIELS_ROBE_BOTTOM_13936 = 13936 + const val CORRUPT_ZURIELS_ROBE_BOTTOM_DEG_13937 = 13937 + const val CORRUPT_ZURIELS_HOOD_13938 = 13938 + const val CORRUPT_ZURIELS_HOOD_13939 = 13939 + const val CORRUPT_ZURIELS_HOOD_DEG_13940 = 13940 + const val CORRUPT_ZURIELS_STAFF_13941 = 13941 + const val CORRUPT_ZURIELS_STAFF_13942 = 13942 + const val CORRUPT_ZURIELS_STAFF_DEG_13943 = 13943 + const val CORRUPT_MORRIGANS_LEATHER_BODY_13944 = 13944 + const val CORRUPT_MORRIGANS_LEATHER_BODY_13945 = 13945 + const val CORRUPT_MORRIGANS_LEATHER_BODY_DEG_13946 = 13946 + const val CORRUPT_MORRIGANS_LEATHER_CHAPS_13947 = 13947 + const val CORRUPT_MORRIGANS_LEATHER_CHAPS_13948 = 13948 + const val CORRUPT_MORRIGANS_LEATHER_CHAPS_DEG_13949 = 13949 + const val CORRUPT_MORRIGANS_COIF_13950 = 13950 + const val CORRUPT_MORRIGANS_COIF_13951 = 13951 + const val CORRUPT_MORRIGANS_COIF_DEG_13952 = 13952 + const val CORRUPT_MORRIGANS_JAVELIN_13953 = 13953 + const val C_MORRIGANS_JAVELIN_P_13954 = 13954 + const val C_MORRIGANS_JAVELIN_P_PLUS_13955 = 13955 + const val C_MORRIGANS_JAVELIN_P_PLUS_PLUS_13956 = 13956 + const val C_MORRIGANS_THROWING_AXE_13957 = 13957 + const val CORRUPT_DRAGON_CHAINBODY_13958 = 13958 + const val CORRUPT_DRAGON_CHAINBODY_13959 = 13959 + const val CORRUPT_DRAGON_CHAINBODY_DEG_13960 = 13960 + const val CORRUPT_DRAGON_MED_HELM_13961 = 13961 + const val CORRUPT_DRAGON_MED_HELM_13962 = 13962 + const val CORRUPT_DRAGON_MED_HELM_DEG_13963 = 13963 + const val CORRUPT_DRAGON_SQ_SHIELD_13964 = 13964 + const val CORRUPT_DRAGON_SQ_SHIELD_13965 = 13965 + const val CORRUPT_DRAGON_SQ_SHIELD_DEG_13966 = 13966 + const val CORRUPT_DRAGON_PLATESKIRT_13967 = 13967 + const val CORRUPT_DRAGON_PLATESKIRT_13968 = 13968 + const val CORRUPT_DRAGON_PLATESKIRT_DEG_13969 = 13969 + const val CORRUPT_DRAGON_PLATELEGS_13970 = 13970 + const val CORRUPT_DRAGON_PLATELEGS_13971 = 13971 + const val CORRUPT_DRAGON_PLATELEGS_DEG_13972 = 13972 + const val CORRUPT_DRAGON_BATTLEAXE_13973 = 13973 + const val CORRUPT_DRAGON_BATTLEAXE_13974 = 13974 + const val C_DRAGON_BATTLEAXE_DEG_13975 = 13975 + const val CORRUPT_DRAGON_DAGGER_13976 = 13976 + const val CORRUPT_DRAGON_DAGGER_13977 = 13977 + const val C_DRAGON_DAGGER_DEG_13978 = 13978 + const val CORRUPT_DRAGON_SCIMITAR_13979 = 13979 + const val CORRUPT_DRAGON_SCIMITAR_13980 = 13980 + const val C_DRAGON_SCIMITAR_DEG_13981 = 13981 + const val CORRUPT_DRAGON_LONGSWORD_13982 = 13982 + const val CORRUPT_DRAGON_LONGSWORD_13983 = 13983 + const val C_DRAGON_LONGSWORD_DEG_13984 = 13984 + const val CORRUPT_DRAGON_MACE_13985 = 13985 + const val CORRUPT_DRAGON_MACE_13986 = 13986 + const val CORRUPT_DRAGON_MACE_DEG_13987 = 13987 + const val CORRUPT_DRAGON_SPEAR_13988 = 13988 + const val CORRUPT_DRAGON_SPEAR_13989 = 13989 + const val CORRUPT_DRAGON_SPEAR_DEG_13990 = 13990 + const val NULL_13991 = 13991 + const val NULL_13992 = 13992 + const val NULL_13993 = 13993 + const val NULL_13994 = 13994 + const val NULL_13995 = 13995 + const val NULL_13996 = 13996 + const val NULL_13997 = 13997 + const val NULL_13998 = 13998 + const val NULL_13999 = 13999 + const val NULL_14000 = 14000 + const val NULL_14001 = 14001 + const val NULL_14002 = 14002 + const val NULL_14003 = 14003 + const val NULL_14004 = 14004 + const val NULL_14005 = 14005 + const val NULL_14006 = 14006 + const val NULL_14007 = 14007 + const val NULL_14008 = 14008 + const val NULL_14009 = 14009 + const val NULL_14010 = 14010 + const val NULL_14011 = 14011 + const val NULL_14012 = 14012 + const val NULL_14013 = 14013 + const val NULL_14014 = 14014 + const val NULL_14015 = 14015 + const val NULL_14016 = 14016 + const val NULL_14017 = 14017 + const val NULL_14018 = 14018 + const val NULL_14019 = 14019 + const val NULL_14020 = 14020 + const val NULL_14021 = 14021 + const val NULL_14022 = 14022 + const val NULL_14023 = 14023 + const val NULL_14024 = 14024 + const val NULL_14025 = 14025 + const val NULL_14026 = 14026 + const val NULL_14027 = 14027 + const val NULL_14028 = 14028 + const val NULL_14029 = 14029 + const val NULL_14030 = 14030 + const val NULL_14031 = 14031 + const val NULL_14032 = 14032 + const val NULL_14033 = 14033 + const val NULL_14034 = 14034 + const val NULL_14035 = 14035 + const val NULL_14036 = 14036 + const val NULL_14037 = 14037 + const val NULL_14038 = 14038 + const val NULL_14039 = 14039 + const val NULL_14040 = 14040 + const val NULL_14041 = 14041 + const val NULL_14042 = 14042 + const val NULL_14043 = 14043 + const val NULL_14044 = 14044 + const val NULL_14045 = 14045 + const val NULL_14046 = 14046 + const val NULL_14047 = 14047 + const val NULL_14048 = 14048 + const val NULL_14049 = 14049 + const val NULL_14050 = 14050 + const val NULL_14051 = 14051 + const val NULL_14052 = 14052 + const val NULL_14053 = 14053 + const val NULL_14054 = 14054 + const val NULL_14055 = 14055 + const val PVP_WORLDS_MANUAL_14056 = 14056 + const val BROOMSTICK_14057 = 14057 + const val GOULASH_14058 = 14058 + const val NULL_14059 = 14059 + const val NULL_14060 = 14060 + const val MAGIC_UNGUENT_14061 = 14061 + const val BROOM_OINTMENT_14062 = 14062 + const val NULL_14063 = 14063 + const val NEWT_14064 = 14064 + const val NEWT_LABEL_14065 = 14065 + const val TOAD_LABEL_14066 = 14066 + const val NEWTS_AND_TOADS_LABEL_14067 = 14067 + const val BETTYS_WAND_14068 = 14068 + const val MAGIC_SLATE_14069 = 14069 + const val REPTILE_14070 = 14070 + const val BLACKBIRD_14071 = 14071 + const val BAT_14072 = 14072 + const val SPIDER_14073 = 14073 + const val RAT_14074 = 14074 + const val SNAIL_14075 = 14075 + const val WARLOCK_TOP_14076 = 14076 + const val WARLOCK_LEGS_14077 = 14077 + const val WITCH_TOP_14078 = 14078 + const val WITCH_SKIRT_14079 = 14079 + const val WITCH_CLOAK_14080 = 14080 + const val WARLOCK_CLOAK_14081 = 14081 + const val POPCORN_BALL_14082 = 14082 + const val CHOCOLATE_DROP_14083 = 14083 + const val WRAPPED_CANDY_14084 = 14084 + const val ARMADYL_COMMUNIQU_14085 = 14085 + const val WITCH_TOP_14086 = 14086 + const val WITCH_SKIRT_14087 = 14087 + const val WITCH_CLOAK_14088 = 14088 + const val PET_KITTEN_14089 = 14089 + const val PET_CAT_14090 = 14090 + const val LAZY_CAT_14091 = 14091 + const val OVERGROWN_CAT_14092 = 14092 + const val WILY_CAT_14093 = 14093 + const val SACRED_CLAY_PLATEBODY_14094 = 14094 + const val SACRED_CLAY_PLATELEGS_14095 = 14095 + const val SACRED_CLAY_HELM_14096 = 14096 + const val SACRED_CLAY_SCIMITAR_14097 = 14097 + const val VOLATILE_CLAY_TOOL_14098 = 14098 + const val VOLATILE_CLAY_PICKAXE_14099 = 14099 + const val VOLATILE_CLAY_HATCHET_14100 = 14100 + const val VOLATILE_CLAY_HARPOON_14101 = 14101 + const val VOLATILE_CLAY_BUTTERFLY_NET_14102 = 14102 + const val VOLATILE_CLAY_FLETCHING_KNIFE_14103 = 14103 + const val VOLATILE_CLAY_HAMMER_14104 = 14104 + const val VOLATILE_CLAY_NEEDLE_14105 = 14105 + const val PROTO_TOOL_14106 = 14106 + const val SACRED_CLAY_PICKAXE_14107 = 14107 + const val SACRED_CLAY_HATCHET_14108 = 14108 + const val SACRED_CLAY_HARPOON_14109 = 14109 + const val SACRED_CLAY_BUTTERFLY_NET_14110 = 14110 + const val SACRED_CLAY_FLETCHING_KNIFE_14111 = 14111 + const val SACRED_CLAY_HAMMER_14112 = 14112 + const val SACRED_CLAY_NEEDLE_14113 = 14113 + const val SACRED_CLAY_ROBE_TOP_14114 = 14114 + const val SACRED_CLAY_ROBE_BOTTOM_14115 = 14115 + const val SACRED_CLAY_HAT_14116 = 14116 + const val SACRED_CLAY_STAFF_14117 = 14117 + const val SACRED_CLAY_BODY_14118 = 14118 + const val SACRED_CLAY_CHAPS_14119 = 14119 + const val SACRED_CLAY_COIF_14120 = 14120 + const val SACRED_CLAY_BOW_14121 = 14121 + const val PICKAXE_CLASS_1_14122 = 14122 + const val PICKAXE_CLASS_1_14123 = 14123 + const val PICKAXE_CLASS_2_14124 = 14124 + const val PICKAXE_CLASS_2_14125 = 14125 + const val PICKAXE_CLASS_3_14126 = 14126 + const val PICKAXE_CLASS_3_14127 = 14127 + const val PICKAXE_CLASS_4_14128 = 14128 + const val PICKAXE_CLASS_4_14129 = 14129 + const val PICKAXE_CLASS_5_14130 = 14130 + const val PICKAXE_CLASS_5_14131 = 14131 + const val HATCHET_CLASS_1_14132 = 14132 + const val HATCHET_CLASS_1_14133 = 14133 + const val HATCHET_CLASS_2_14134 = 14134 + const val HATCHET_CLASS_2_14135 = 14135 + const val HATCHET_CLASS_3_14136 = 14136 + const val HATCHET_CLASS_3_14137 = 14137 + const val HATCHET_CLASS_4_14138 = 14138 + const val HATCHET_CLASS_4_14139 = 14139 + const val HATCHET_CLASS_5_14140 = 14140 + const val HATCHET_CLASS_5_14141 = 14141 + const val HARPOON_CLASS_1_14142 = 14142 + const val HARPOON_CLASS_1_14143 = 14143 + const val HARPOON_CLASS_2_14144 = 14144 + const val HARPOON_CLASS_2_14145 = 14145 + const val HARPOON_CLASS_3_14146 = 14146 + const val HARPOON_CLASS_3_14147 = 14147 + const val HARPOON_CLASS_4_14148 = 14148 + const val HARPOON_CLASS_4_14149 = 14149 + const val HARPOON_CLASS_5_14150 = 14150 + const val HARPOON_CLASS_5_14151 = 14151 + const val BUTTERFLY_NET_CLASS_1_14152 = 14152 + const val BUTTERFLY_NET_CLASS_1_14153 = 14153 + const val BUTTERFLY_NET_CLASS_2_14154 = 14154 + const val BUTTERFLY_NET_CLASS_2_14155 = 14155 + const val BUTTERFLY_NET_CLASS_3_14156 = 14156 + const val BUTTERFLY_NET_CLASS_3_14157 = 14157 + const val BUTTERFLY_NET_CLASS_4_14158 = 14158 + const val BUTTERFLY_NET_CLASS_4_14159 = 14159 + const val BUTTERFLY_NET_CLASS_5_14160 = 14160 + const val BUTTERFLY_NET_CLASS_5_14161 = 14161 + const val FOOD_CLASS_1_14162 = 14162 + const val FOOD_CLASS_1_14163 = 14163 + const val FOOD_CLASS_2_14164 = 14164 + const val FOOD_CLASS_2_14165 = 14165 + const val FOOD_CLASS_3_14166 = 14166 + const val FOOD_CLASS_3_14167 = 14167 + const val FOOD_CLASS_4_14168 = 14168 + const val FOOD_CLASS_4_14169 = 14169 + const val FOOD_CLASS_5_14170 = 14170 + const val FOOD_CLASS_5_14171 = 14171 + const val BARRIER_CLASS_1_14172 = 14172 + const val BARRIER_CLASS_1_14173 = 14173 + const val BARRIER_CLASS_2_14174 = 14174 + const val BARRIER_CLASS_2_14175 = 14175 + const val BARRIER_CLASS_3_14176 = 14176 + const val BARRIER_CLASS_3_14177 = 14177 + const val BARRIER_CLASS_4_14178 = 14178 + const val BARRIER_CLASS_4_14179 = 14179 + const val BARRIER_CLASS_5_14180 = 14180 + const val BARRIER_CLASS_5_14181 = 14181 + const val SACRED_CLAY_CLASS_1_14182 = 14182 + const val SACRED_CLAY_CLASS_1_14183 = 14183 + const val SACRED_CLAY_CLASS_2_14184 = 14184 + const val SACRED_CLAY_CLASS_2_14185 = 14185 + const val SACRED_CLAY_CLASS_3_14186 = 14186 + const val SACRED_CLAY_CLASS_3_14187 = 14187 + const val SACRED_CLAY_CLASS_4_14188 = 14188 + const val SACRED_CLAY_CLASS_4_14189 = 14189 + const val SACRED_CLAY_CLASS_5_14190 = 14190 + const val SACRED_CLAY_CLASS_5_14191 = 14191 + const val BOW_CLASS_1_14192 = 14192 + const val BOW_CLASS_1_14193 = 14193 + const val BOW_CLASS_2_14194 = 14194 + const val BOW_CLASS_2_14195 = 14195 + const val BOW_CLASS_3_14196 = 14196 + const val BOW_CLASS_3_14197 = 14197 + const val BOW_CLASS_4_14198 = 14198 + const val BOW_CLASS_4_14199 = 14199 + const val BOW_CLASS_5_14200 = 14200 + const val BOW_CLASS_5_14201 = 14201 + const val ARROWS_CLASS_1_14202 = 14202 + const val ARROWS_CLASS_2_14203 = 14203 + const val ARROWS_CLASS_3_14204 = 14204 + const val ARROWS_CLASS_4_14205 = 14205 + const val ARROWS_CLASS_5_14206 = 14206 + const val PRAYER_POTION5_14207 = 14207 + const val PRAYER_POTION5_14208 = 14208 + const val PRAYER_POTION4_14209 = 14209 + const val PRAYER_POTION4_14210 = 14210 + const val PRAYER_POTION3_14211 = 14211 + const val PRAYER_POTION3_14212 = 14212 + const val PRAYER_POTION2_14213 = 14213 + const val PRAYER_POTION2_14214 = 14214 + const val PRAYER_POTION1_14215 = 14215 + const val PRAYER_POTION1_14216 = 14216 + const val ENERGY_POTION_5_14217 = 14217 + const val ENERGY_POTION_5_14218 = 14218 + const val ENERGY_POTION_4_14219 = 14219 + const val ENERGY_POTION_4_14220 = 14220 + const val ENERGY_POTION_3_14221 = 14221 + const val ENERGY_POTION_3_14222 = 14222 + const val ENERGY_POTION_2_14223 = 14223 + const val ENERGY_POTION_2_14224 = 14224 + const val ENERGY_POTION_1_14225 = 14225 + const val ENERGY_POTION_1_14226 = 14226 + const val SUPER_ATTACK5_14227 = 14227 + const val SUPER_ATTACK5_14228 = 14228 + const val SUPER_ATTACK4_14229 = 14229 + const val SUPER_ATTACK4_14230 = 14230 + const val SUPER_ATTACK3_14231 = 14231 + const val SUPER_ATTACK3_14232 = 14232 + const val SUPER_ATTACK2_14233 = 14233 + const val SUPER_ATTACK2_14234 = 14234 + const val SUPER_ATTACK1_14235 = 14235 + const val SUPER_ATTACK1_14236 = 14236 + const val SUPER_STRENGTH5_14237 = 14237 + const val SUPER_STRENGTH5_14238 = 14238 + const val SUPER_STRENGTH4_14239 = 14239 + const val SUPER_STRENGTH4_14240 = 14240 + const val SUPER_STRENGTH3_14241 = 14241 + const val SUPER_STRENGTH3_14242 = 14242 + const val SUPER_STRENGTH2_14243 = 14243 + const val SUPER_STRENGTH2_14244 = 14244 + const val SUPER_STRENGTH1_14245 = 14245 + const val SUPER_STRENGTH1_14246 = 14246 + const val RANGING_POTION5_14247 = 14247 + const val RANGING_POTION5_14248 = 14248 + const val RANGING_POTION4_14249 = 14249 + const val RANGING_POTION4_14250 = 14250 + const val RANGING_POTION3_14251 = 14251 + const val RANGING_POTION3_14252 = 14252 + const val RANGING_POTION2_14253 = 14253 + const val RANGING_POTION2_14254 = 14254 + const val RANGING_POTION1_14255 = 14255 + const val RANGING_POTION1_14256 = 14256 + const val DEFENCE_POTION5_14257 = 14257 + const val DEFENCE_POTION5_14258 = 14258 + const val DEFENCE_POTION4_14259 = 14259 + const val DEFENCE_POTION4_14260 = 14260 + const val DEFENCE_POTION3_14261 = 14261 + const val DEFENCE_POTION3_14262 = 14262 + const val DEFENCE_POTION2_14263 = 14263 + const val DEFENCE_POTION2_14264 = 14264 + const val DEFENCE_POTION1_14265 = 14265 + const val DEFENCE_POTION1_14266 = 14266 + const val MAGIC_POTION5_14267 = 14267 + const val MAGIC_POTION5_14268 = 14268 + const val MAGIC_POTION4_14269 = 14269 + const val MAGIC_POTION4_14270 = 14270 + const val MAGIC_POTION3_14271 = 14271 + const val MAGIC_POTION3_14272 = 14272 + const val MAGIC_POTION2_14273 = 14273 + const val MAGIC_POTION2_14274 = 14274 + const val MAGIC_POTION1_14275 = 14275 + const val MAGIC_POTION1_14276 = 14276 + const val SUMMONING_POTION5_14277 = 14277 + const val SUMMONING_POTION5_14278 = 14278 + const val SUMMONING_POTION4_14279 = 14279 + const val SUMMONING_POTION4_14280 = 14280 + const val SUMMONING_POTION3_14281 = 14281 + const val SUMMONING_POTION3_14282 = 14282 + const val SUMMONING_POTION2_14283 = 14283 + const val SUMMONING_POTION2_14284 = 14284 + const val SUMMONING_POTION1_14285 = 14285 + const val SUMMONING_POTION1_14286 = 14286 + const val SCIMITAR_CLASS_1_14287 = 14287 + const val SCIMITAR_CLASS_1_14288 = 14288 + const val SCIMITAR_CLASS_2_14289 = 14289 + const val SCIMITAR_CLASS_2_14290 = 14290 + const val SCIMITAR_CLASS_3_14291 = 14291 + const val SCIMITAR_CLASS_3_14292 = 14292 + const val SCIMITAR_CLASS_4_14293 = 14293 + const val SCIMITAR_CLASS_4_14294 = 14294 + const val SCIMITAR_CLASS_5_14295 = 14295 + const val SCIMITAR_CLASS_5_14296 = 14296 + const val DAGGER_CLASS_1_14297 = 14297 + const val DAGGER_CLASS_1_14298 = 14298 + const val DAGGER_CLASS_2_14299 = 14299 + const val DAGGER_CLASS_2_14300 = 14300 + const val DAGGER_CLASS_3_14301 = 14301 + const val DAGGER_CLASS_3_14302 = 14302 + const val DAGGER_CLASS_4_14303 = 14303 + const val DAGGER_CLASS_4_14304 = 14304 + const val DAGGER_CLASS_5_14305 = 14305 + const val DAGGER_CLASS_5_14306 = 14306 + const val WARHAMMER_CLASS_1_14307 = 14307 + const val WARHAMMER_CLASS_1_14308 = 14308 + const val WARHAMMER_CLASS_2_14309 = 14309 + const val WARHAMMER_CLASS_2_14310 = 14310 + const val WARHAMMER_CLASS_3_14311 = 14311 + const val WARHAMMER_CLASS_3_14312 = 14312 + const val WARHAMMER_CLASS_4_14313 = 14313 + const val WARHAMMER_CLASS_4_14314 = 14314 + const val WARHAMMER_CLASS_5_14315 = 14315 + const val WARHAMMER_CLASS_5_14316 = 14316 + const val ROBE_TOP_CLASS_1_14317 = 14317 + const val ROBE_TOP_CLASS_1_14318 = 14318 + const val ROBE_TOP_CLASS_2_14319 = 14319 + const val ROBE_TOP_CLASS_2_14320 = 14320 + const val ROBE_TOP_CLASS_3_14321 = 14321 + const val ROBE_TOP_CLASS_3_14322 = 14322 + const val ROBE_TOP_CLASS_4_14323 = 14323 + const val ROBE_TOP_CLASS_4_14324 = 14324 + const val ROBE_TOP_CLASS_5_14325 = 14325 + const val ROBE_TOP_CLASS_5_14326 = 14326 + const val ROBE_BOTTOM_CLASS_1_14327 = 14327 + const val ROBE_BOTTOM_CLASS_1_14328 = 14328 + const val ROBE_BOTTOM_CLASS_2_14329 = 14329 + const val ROBE_BOTTOM_CLASS_2_14330 = 14330 + const val ROBE_BOTTOM_CLASS_3_14331 = 14331 + const val ROBE_BOTTOM_CLASS_3_14332 = 14332 + const val ROBE_BOTTOM_CLASS_4_14333 = 14333 + const val ROBE_BOTTOM_CLASS_4_14334 = 14334 + const val ROBE_BOTTOM_CLASS_5_14335 = 14335 + const val ROBE_BOTTOM_CLASS_5_14336 = 14336 + const val HAT_CLASS_1_14337 = 14337 + const val HAT_CLASS_1_14338 = 14338 + const val HAT_CLASS_2_14339 = 14339 + const val HAT_CLASS_2_14340 = 14340 + const val HAT_CLASS_3_14341 = 14341 + const val HAT_CLASS_3_14342 = 14342 + const val HAT_CLASS_4_14343 = 14343 + const val HAT_CLASS_4_14344 = 14344 + const val HAT_CLASS_5_14345 = 14345 + const val HAT_CLASS_5_14346 = 14346 + const val PLATEBODY_CLASS_1_14347 = 14347 + const val PLATEBODY_CLASS_1_14348 = 14348 + const val PLATEBODY_CLASS_2_14349 = 14349 + const val PLATEBODY_CLASS_2_14350 = 14350 + const val PLATEBODY_CLASS_3_14351 = 14351 + const val PLATEBODY_CLASS_3_14352 = 14352 + const val PLATEBODY_CLASS_4_14353 = 14353 + const val PLATEBODY_CLASS_4_14354 = 14354 + const val PLATEBODY_CLASS_5_14355 = 14355 + const val PLATEBODY_CLASS_5_14356 = 14356 + const val PLATELEGS_CLASS_1_14357 = 14357 + const val PLATELEGS_CLASS_1_14358 = 14358 + const val PLATELEGS_CLASS_2_14359 = 14359 + const val PLATELEGS_CLASS_2_14360 = 14360 + const val PLATELEGS_CLASS_3_14361 = 14361 + const val PLATELEGS_CLASS_3_14362 = 14362 + const val PLATELEGS_CLASS_4_14363 = 14363 + const val PLATELEGS_CLASS_4_14364 = 14364 + const val PLATELEGS_CLASS_5_14365 = 14365 + const val PLATELEGS_CLASS_5_14366 = 14366 + const val HELM_CLASS_1_14367 = 14367 + const val HELM_CLASS_1_14368 = 14368 + const val HELM_CLASS_2_14369 = 14369 + const val HELM_CLASS_2_14370 = 14370 + const val HELM_CLASS_3_14371 = 14371 + const val HELM_CLASS_3_14372 = 14372 + const val HELM_CLASS_4_14373 = 14373 + const val HELM_CLASS_4_14374 = 14374 + const val HELM_CLASS_5_14375 = 14375 + const val HELM_CLASS_5_14376 = 14376 + const val STAFF_CLASS_1_14377 = 14377 + const val STAFF_CLASS_1_14378 = 14378 + const val STAFF_CLASS_2_14379 = 14379 + const val STAFF_CLASS_2_14380 = 14380 + const val STAFF_CLASS_3_14381 = 14381 + const val STAFF_CLASS_3_14382 = 14382 + const val STAFF_CLASS_4_14383 = 14383 + const val STAFF_CLASS_4_14384 = 14384 + const val STAFF_CLASS_5_14385 = 14385 + const val STAFF_CLASS_5_14386 = 14386 + const val CAPE_14387 = 14387 + const val NULL_14388 = 14388 + const val CAPE_14389 = 14389 + const val NULL_14390 = 14390 + const val LEATHER_BODY_CLASS_1_14391 = 14391 + const val LEATHER_BODY_CLASS_1_14392 = 14392 + const val LEATHER_BODY_CLASS_2_14393 = 14393 + const val LEATHER_BODY_CLASS_2_14394 = 14394 + const val LEATHER_BODY_CLASS_3_14395 = 14395 + const val LEATHER_BODY_CLASS_3_14396 = 14396 + const val LEATHER_BODY_CLASS_4_14397 = 14397 + const val LEATHER_BODY_CLASS_4_14398 = 14398 + const val LEATHER_BODY_CLASS_5_14399 = 14399 + const val LEATHER_BODY_CLASS_5_14400 = 14400 + const val CHAPS_CLASS_1_14401 = 14401 + const val CHAPS_CLASS_1_14402 = 14402 + const val CHAPS_CLASS_2_14403 = 14403 + const val CHAPS_CLASS_2_14404 = 14404 + const val CHAPS_CLASS_3_14405 = 14405 + const val CHAPS_CLASS_3_14406 = 14406 + const val CHAPS_CLASS_4_14407 = 14407 + const val CHAPS_CLASS_4_14408 = 14408 + const val CHAPS_CLASS_5_14409 = 14409 + const val CHAPS_CLASS_5_14410 = 14410 + const val COIF_CLASS_1_14411 = 14411 + const val COIF_CLASS_1_14412 = 14412 + const val COIF_CLASS_2_14413 = 14413 + const val COIF_CLASS_2_14414 = 14414 + const val COIF_CLASS_3_14415 = 14415 + const val COIF_CLASS_3_14416 = 14416 + const val COIF_CLASS_4_14417 = 14417 + const val COIF_CLASS_4_14418 = 14418 + const val COIF_CLASS_5_14419 = 14419 + const val COIF_CLASS_5_14420 = 14420 + const val CLAY_DEPOSIT_SCROLL_14421 = 14421 + const val SACRED_CLAY_POUCH_CLASS_1_14422 = 14422 + const val SACRED_CLAY_POUCH_CLASS_1_14423 = 14423 + const val SACRED_CLAY_POUCH_CLASS_2_14424 = 14424 + const val SACRED_CLAY_POUCH_CLASS_2_14425 = 14425 + const val SACRED_CLAY_POUCH_CLASS_3_14426 = 14426 + const val SACRED_CLAY_POUCH_CLASS_3_14427 = 14427 + const val SACRED_CLAY_POUCH_CLASS_4_14428 = 14428 + const val SACRED_CLAY_POUCH_CLASS_4_14429 = 14429 + const val SACRED_CLAY_POUCH_CLASS_5_14430 = 14430 + const val SACRED_CLAY_POUCH_CLASS_5_14431 = 14431 + const val NULL_SACRED_CLAY_14432 = 14432 + const val NULL_14433 = 14433 + const val NULL_14434 = 14434 + const val NULL_14435 = 14435 + const val NULL_14436 = 14436 + const val NULL_14437 = 14437 + const val NULL_14438 = 14438 + const val NULL_14439 = 14439 + const val NULL_14440 = 14440 + const val NULL_14441 = 14441 + const val NULL_14442 = 14442 + const val NULL_14443 = 14443 + const val NULL_14444 = 14444 + const val NULL_14445 = 14445 + const val NULL_14446 = 14446 + const val NULL_14447 = 14447 + const val NULL_14448 = 14448 + const val NULL_14449 = 14449 + const val NULL_14450 = 14450 + const val NULL_14451 = 14451 + const val NULL_14452 = 14452 + const val NULL_14453 = 14453 + const val NULL_14454 = 14454 + const val NULL_14455 = 14455 + const val NULL_14456 = 14456 + const val NULL_14457 = 14457 + const val VINE_FLOWER_14458 = 14458 + const val UNCONSCIOUS_BROAV_14459 = 14459 + const val DIRTY_LAUNDRY_14460 = 14460 + const val WASTE_PAPER_BASKET_14461 = 14461 + const val RUBY_KEY_14462 = 14462 + const val NOTES_ON_PRESSURE_14463 = 14463 + const val MOVARIOS_NOTES_VOLUME_1_14464 = 14464 + const val MOVARIOS_NOTES_VOLUME_2_14465 = 14465 + const val WEIGHT_1KG_14466 = 14466 + const val WEIGHT_2KG_14467 = 14467 + const val WEIGHT_5KG_14468 = 14468 + const val STRANGE_KEY_LOOP_14469 = 14469 + const val STRANGE_KEY_TEETH_14470 = 14470 + const val DRAGONKIN_KEY_14471 = 14471 + const val RUINED_DRAGON_ARMOUR_LUMP_14472 = 14472 + const val RUINED_DRAGON_ARMOUR_LUMP_14473 = 14473 + const val RUINED_DRAGON_ARMOUR_SLICE_14474 = 14474 + const val RUINED_DRAGON_ARMOUR_SLICE_14475 = 14475 + const val RUINED_DRAGON_ARMOUR_SHARD_14476 = 14476 + const val RUINED_DRAGON_ARMOUR_SHARD_14477 = 14477 + const val BLAST_FUSION_HAMMER_14478 = 14478 + const val DRAGON_PLATEBODY_14479 = 14479 + const val DRAGON_PLATEBODY_14480 = 14480 + const val DRAGON_PLATEBODY_14481 = 14481 + const val NULL_14482 = 14482 + const val NULL_14483 = 14483 + const val DRAGON_CLAWS_14484 = 14484 + const val DRAGON_CLAWS_14485 = 14485 + const val DRAGON_CLAWS_14486 = 14486 + const val ENRICHED_SNAPDRAGON_14487 = 14487 + const val SUPER_TRUTH_SERUM_14488 = 14488 + const val SUSPECT_SKETCH_14489 = 14489 + const val ELITE_BLACK_PLATELEGS_14490 = 14490 + const val ELITE_BLACK_PLATELEGS_14491 = 14491 + const val ELITE_BLACK_PLATEBODY_14492 = 14492 + const val ELITE_BLACK_PLATEBODY_14493 = 14493 + const val ELITE_BLACK_FULL_HELM_14494 = 14494 + const val ELITE_BLACK_FULL_HELM_14495 = 14495 + const val CELL_KEY_14496 = 14496 + const val DAGONHAI_ROBE_TOP_14497 = 14497 + const val DAGONHAI_ROBE_TOP_14498 = 14498 + const val DAGONHAI_HAT_14499 = 14499 + const val DAGONHAI_HAT_14500 = 14500 + const val DAGONHAI_ROBE_BOTTOM_14501 = 14501 + const val DAGONHAI_ROBE_BOTTOM_14502 = 14502 + const val SILIF_14503 = 14503 + const val SILIF_14504 = 14504 + const val TELEORB_14505 = 14505 + const val ENRICHED_SNAPDRAGON_SEED_14506 = 14506 + const val DOLMEN_14507 = 14507 + const val DOLMEN_14508 = 14508 + const val DOLMEN_14509 = 14509 + const val DOLMEN_14510 = 14510 + const val DOLMEN_14511 = 14511 + const val DOLMEN_14512 = 14512 + const val DOLMEN_14513 = 14513 + const val DOLMEN_14514 = 14514 + const val AIR_KEY_14515 = 14515 + const val EARTH_KEY_14516 = 14516 + const val FIRE_KEY_14517 = 14517 + const val WATER_KEY_14518 = 14518 + const val AIR_KEY_14519 = 14519 + const val EARTH_KEY_14520 = 14520 + const val FIRE_KEY_14521 = 14521 + const val WATER_KEY_14522 = 14522 + const val NULL_14523 = 14523 + const val NULL_14524 = 14524 + const val DAGONHAI_ROBES_SET_14525 = 14525 + const val DAGONHAI_ROBES_SET_14526 = 14526 + const val ELITE_BLACK_ARMOUR_SET_14527 = 14527 + const val ELITE_BLACK_ARMOUR_SET_14528 = 14528 + const val DRAGON_PLATE_ARMOUR_SET_L_14529 = 14529 + const val DRAGON_PLATE_ARMOUR_SET_L_14530 = 14530 + const val DRAGON_PLATE_ARMOUR_SET_SK_14531 = 14531 + const val DRAGON_PLATE_ARMOUR_SET_SK_14532 = 14532 + const val BROAV_14533 = 14533 + const val STRANGE_TELEORB_14534 = 14534 + const val NULL_14535 = 14535 + const val TURKEY_BOOK_14536 = 14536 + const val CORNUCOPIA_14537 = 14537 + const val CORNUCOPIA_14538 = 14538 + const val RAW_TURKEY_14539 = 14539 + const val COOKED_TURKEY_14540 = 14540 + const val BURNT_TURKEY_14541 = 14541 + const val RAW_TURKEY_DRUMSTICK_14542 = 14542 + const val COOKED_TURKEY_DRUMSTICK_14543 = 14543 + const val BURNT_TURKEY_DRUMSTICK_14544 = 14544 + const val NULL_14545 = 14545 + const val NULL_14546 = 14546 + const val NULL_14547 = 14547 + const val NULL_14548 = 14548 + const val NULL_14549 = 14549 + const val NULL_14550 = 14550 + const val NULL_14551 = 14551 + const val NULL_14552 = 14552 + const val NULL_14553 = 14553 + const val NULL_14554 = 14554 + const val NULL_14555 = 14555 + const val NULL_14556 = 14556 + const val NULL_14557 = 14557 + const val NULL_14558 = 14558 + const val NULL_14559 = 14559 + const val NULL_14560 = 14560 + const val NULL_14561 = 14561 + const val NULL_14562 = 14562 + const val NULL_14563 = 14563 + const val NULL_14564 = 14564 + const val NULL_14565 = 14565 + const val NULL_14566 = 14566 + const val NULL_14567 = 14567 + const val NULL_14568 = 14568 + const val NULL_14569 = 14569 + const val CORNUCOPIA_14570 = 14570 + const val FREMENNIK_SEA_BOOTS_1_14571 = 14571 + const val FREMENNIK_SEA_BOOTS_2_14572 = 14572 + const val FREMENNIK_SEA_BOOTS_3_14573 = 14573 + const val ANTIQUE_LAMP_14574 = 14574 + const val ANTIQUE_LAMP_14575 = 14575 + const val ANTIQUE_LAMP_14576 = 14576 + const val FALADOR_SHIELD_1_14577 = 14577 + const val FALADOR_SHIELD_2_14578 = 14578 + const val FALADOR_SHIELD_3_14579 = 14579 + const val ANTIQUE_LAMP_14580 = 14580 + const val ANTIQUE_LAMP_14581 = 14581 + const val ANTIQUE_LAMP_14582 = 14582 + const val WHITE_LILY_14583 = 14583 + const val MONEY_CREST_VOUCHER_14584 = 14584 + const val NULL_14585 = 14585 + const val NULL_14586 = 14586 + const val NULL_14587 = 14587 + const val NULL_14588 = 14588 + const val WHITE_LILY_SEED_14589 = 14589 + const val ENCHANTED_LYRE5_14590 = 14590 + const val ENCHANTED_LYRE6_14591 = 14591 + const val ELITE_BLACK_PLATELEGS_14592 = 14592 + const val ELITE_BLACK_PLATEBODY_14593 = 14593 + const val ELITE_BLACK_FULL_HELM_14594 = 14594 + const val SANTA_COSTUME_TOP_14595 = 14595 + const val ICE_AMULET_14596 = 14596 + const val STONES_14597 = 14597 + const val ENCHANTED_STONES_14598 = 14598 + const val ICE_AMULET_14599 = 14599 + const val SANTA_COSTUME_TOP_14600 = 14600 + const val SANTA_COSTUME_TOP_14601 = 14601 + const val SANTA_COSTUME_GLOVES_14602 = 14602 + const val SANTA_COSTUME_LEGS_14603 = 14603 + const val SANTA_COSTUME_LEGS_14604 = 14604 + const val SANTA_COSTUME_BOOTS_14605 = 14605 + const val CINNAMON_TWIGS_14606 = 14606 + const val SASSAFRAS_TWIGS_14607 = 14607 + const val AILANTHUS_TWIGS_14608 = 14608 + const val CEDAR_TWIGS_14609 = 14609 + const val MASTIC_TWIGS_14610 = 14610 + const val CINNAMON_WEAVING_RIBBON_14611 = 14611 + const val SASSAFRAS_WEAVING_RIBBON_14612 = 14612 + const val AILANTHUS_WEAVING_RIBBON_14613 = 14613 + const val CEDAR_WEAVING_RIBBON_14614 = 14614 + const val MASTIC_WEAVING_RIBBON_14615 = 14615 + const val PHOENIX_QUILL_14616 = 14616 + const val PHOENIX_QUILL_14617 = 14617 + const val NULL_14618 = 14618 + const val NULL_14619 = 14619 + const val POUCH_14620 = 14620 + const val POUCH_14621 = 14621 + const val RISE_FROM_THE_ASHES_SCROLL_14622 = 14622 + const val PHOENIX_POUCH_14623 = 14623 + const val PHOENIX_POUCH_14624 = 14624 + const val POUCH_14625 = 14625 + const val PHOENIX_EGGLING_14626 = 14626 + const val PHOENIX_EGGLING_14627 = 14627 + const val NULL_14628 = 14628 + const val PHOENIX_EGG_14629 = 14629 + const val CRACKED_PHOENIX_EGG_14630 = 14630 + const val SEERS_HEADBAND_14631 = 14631 + const val ENHANCED_EXCALIBUR_14632 = 14632 + const val ANTIQUE_LAMP_14633 = 14633 + const val ANTIQUE_LAMP_14634 = 14634 + const val ANTIQUE_LAMP_14635 = 14635 + const val SLAYER_HELMET_E_14636 = 14636 + const val SLAYER_HELMET_CHARGED_14637 = 14637 + const val RING_OF_WEALTH_14638 = 14638 + const val RING_OF_WEALTH_14639 = 14639 + const val RING_OF_WEALTH1_14640 = 14640 + const val RING_OF_WEALTH1_14641 = 14641 + const val RING_OF_WEALTH2_14642 = 14642 + const val RING_OF_WEALTH2_14643 = 14643 + const val RING_OF_WEALTH3_14644 = 14644 + const val RING_OF_WEALTH3_14645 = 14645 + const val RING_OF_WEALTH4_14646 = 14646 + const val RING_OF_WEALTH4_14647 = 14647 +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/tools/PlayerLoader.java b/Server/src/main/java/Server/core/tools/PlayerLoader.java new file mode 100644 index 000000000..baebf05a9 --- /dev/null +++ b/Server/src/main/java/Server/core/tools/PlayerLoader.java @@ -0,0 +1,41 @@ +package core.tools; + + +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.PlayerDetails; +import core.game.node.entity.player.info.login.PlayerParser; + +/** + * Represents a class that is used to load a player, or details of it. + * + * @author 'Vexia + */ +public final class PlayerLoader { + + /** + * Method used to load the player file. + * + * @param name the name. + * @return the player. + */ + public static Player getPlayerFile(String name) { + final PlayerDetails playerDetails = new PlayerDetails(name, ""); + playerDetails.parse(); + final Player player = new Player(playerDetails); + PlayerParser.parse(player); +// GameWorld.getWorld().getAccountService().loadPlayer(player); + return player; + } + + /** + * Method used to load the player details file. + * + * @param name the name. + * @return the details + */ + public static PlayerDetails getPlayerDetailFile(String name) { + final PlayerDetails playerDetails = new PlayerDetails(name, ""); + playerDetails.parse(); + return playerDetails; + } +} diff --git a/Server/src/main/java/Server/core/tools/RSAKeyGen.java b/Server/src/main/java/Server/core/tools/RSAKeyGen.java new file mode 100644 index 000000000..14b0cc400 --- /dev/null +++ b/Server/src/main/java/Server/core/tools/RSAKeyGen.java @@ -0,0 +1,56 @@ +package core.tools; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.math.BigInteger; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.RSAPrivateKeySpec; +import java.security.spec.RSAPublicKeySpec; + +/** + * A class to generate a simple 1024 bit RSA pair + * @author Nikki + */ +public class RSAKeyGen { + + public static void main(String[] args) { + try { + KeyFactory factory = KeyFactory.getInstance("RSA"); + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(1024); + KeyPair keypair = keyGen.genKeyPair(); + PrivateKey privateKey = keypair.getPrivate(); + PublicKey publicKey = keypair.getPublic(); + + RSAPrivateKeySpec privSpec = factory.getKeySpec(privateKey, RSAPrivateKeySpec.class); + + writeKey("rsapriv", privSpec.getModulus(), privSpec.getPrivateExponent()); + + + RSAPublicKeySpec pubSpec = factory.getKeySpec(publicKey, RSAPublicKeySpec.class); + + writeKey("rsapub", pubSpec.getModulus(), pubSpec.getPublicExponent()); + } catch(Exception e) { + e.printStackTrace(); + } + } + + public static void writeKey(String file, BigInteger modulus, BigInteger exponent) { + try { + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.write("private static final BigInteger RSA_MODULUS = new BigInteger(\""+modulus.toString()+"\");"); + writer.newLine(); + writer.newLine(); + writer.write("private static final BigInteger RSA_EXPONENT = new BigInteger(\""+exponent.toString()+"\");"); + writer.newLine(); + writer.flush(); + writer.close(); + } catch(Exception e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/tools/RandomFunction.java b/Server/src/main/java/Server/core/tools/RandomFunction.java new file mode 100644 index 000000000..a752248d9 --- /dev/null +++ b/Server/src/main/java/Server/core/tools/RandomFunction.java @@ -0,0 +1,264 @@ +package core.tools; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import core.game.node.entity.npc.drop.DropFrequency; +import core.game.node.item.ChanceItem; +import core.game.node.item.Item; +import core.game.node.item.WeightedChanceItem; + +/** + * Represents a class used for random methods. + * @author Vexia + */ +public class RandomFunction { + + /** + * The random instance. + */ + public static final Random RANDOM = new Random(); + + /** + * Method used to ease the access of the random class. + * @param a the minimum random value. + * @param b the maximum random value. + * @return the value as an {@link Double}. + */ + public static final double random(double a, double b) { + final double min = Math.min(a, b); + final double max = Math.max(a, b); + return min + (max - min) * RANDOM.nextDouble(); + } + + /** + * Method used to ease the access of the random class. + * @param a the minimum random value. + * @param b the maximum random value. + * @return the value as an {@link Integer}. + */ + public static final int random(int a, int b) { + final int n = Math.abs(b - a); + return Math.min(a, b) + (n == 0 ? 0 : random(n)); + } + + /** + * Returns either the supplied integer, or -1 times the supplied integer. + * @param value the value. + * @return the integer. + */ + public static int randomSign(int value) { + return RANDOM.nextBoolean() ? value : -value; + } + + /** + * Method used to return the integer. + * @param maxValue the value. + * @return the value. + */ + public static final int getRandom(int maxValue) { + return (int) (Math.random() * (maxValue + 1)); + } + + /** + * Method used to return the random double. + * @param maxValue the value. + * @return the double. + */ + public static final double getRandomDouble(double maxValue) { + return (Math.random() * (maxValue + 1)); + } + + /** + * Method used to ease the access of the random class. + * @param maxValue the maximum value. + * @return the random integer. + */ + public static final int random(int maxValue) { + if (maxValue <= 0) { + return 0; + } + return RANDOM.nextInt(maxValue); + } + + public static int nextInt(int val) + { + return random(val); + } + + /** + * Generates a random number with a distrobution like: + * Where intensity is how intense the peak is (higher = more steep) + * * + * * * + * * * + * * * * * + * * * * * * + */ + public static int normalRandDist(int max, int intensity) { + int sum = 0; + for (int j = 0; j < intensity; j++) { + sum += RANDOM.nextInt(max); + } + return sum/intensity; + } + + /** + * Generates a random number with a distribution like: + * * + * * * + * * * + * * * * * + * * * * * * + */ + public static int normalRandDist(int max) { + return (RANDOM.nextInt(max) + RANDOM.nextInt(max))/2; + } + + /** + * Generates a random number with a distribution like: + * + * * + * * + * * + * * + * See some results: https://www.desmos.com/calculator/clzv66l7hk + */ + public static int linearDecreaseRand(int max) { + double seed = RANDOM.nextDouble(); + double modifier = RANDOM.nextDouble(); + return (int) (seed*modifier*max); + } + + /** + * Generates a random number likely in the area above val (I think) + */ + public static int normalPlusWeightRandDist(int val, int weight) + { + int normalDistRand = (RANDOM.nextInt(val) + RANDOM.nextInt(val))/2; + return normalDistRand/2 + weight < val ? normalDistRand/2 + weight : normalPlusWeightRandDist(val, weight - 1); + } + + /** + * Gets a chance item. + * @param items the items. + * @return the chance. + */ + public static final ChanceItem getChanceItem(final ChanceItem[] items) { + double total = 0; + for (ChanceItem i : items) { + total += i.getChanceRate(); + } + final int random = random((int) total); + double subTotal = 0; + List choices = new ArrayList<>(); + for (ChanceItem item : items) { + choices.add(item); + } + Collections.shuffle(choices); + for (ChanceItem i : choices) { + subTotal += i.getChanceRate(); + if (random < subTotal) { + return i; + } + } + return null; + } + + public static List rollChanceTable(boolean atLeastOne,List table){ + final List rewards = new ArrayList<>(); + final List always_rewards = new ArrayList<>(); + final List chanceTable = new ArrayList(table); + boolean isAllAlways = false; + if(table.stream().filter(item -> item.getChanceRate() == 1).count() == table.size()){ + isAllAlways = true; + } + if(table.size() == 1){ + atLeastOne = false; + } + if(!isAllAlways) { + if (atLeastOne) { + while (rewards.isEmpty()) { + Collections.shuffle(chanceTable); + for (ChanceItem item : chanceTable) { + if (item.getChanceRate() == 0.0) { + item.setChanceRate(DropFrequency.rate(item.getDropFrequency())); + } + boolean roll = RandomFunction.random(1, (int) item.getChanceRate()) == 1; + if (item.getChanceRate() != 1) { + if (roll) { + rewards.add(item.getRandomItem()); + break; + } + } + } + } + } else { + Collections.shuffle(chanceTable); + for (ChanceItem item : chanceTable) { + if (item.getChanceRate() == 0.0) { + item.setChanceRate(DropFrequency.rate(item.getDropFrequency())); + } + boolean roll = RandomFunction.random(1, (int) item.getChanceRate()) == 1; + if (item.getChanceRate() != 1) { + if (roll) { + rewards.add(item.getRandomItem()); + break; + } + } + } + } + } + table.stream().filter(item -> item.getChanceRate() == 1).forEach(item -> { + if(item.getChanceRate() == 0.0){ + item.setChanceRate(DropFrequency.rate(item.getDropFrequency())); + } + always_rewards.add(item.getRandomItem()); + }); + return Stream.concat(rewards.stream(),always_rewards.stream()).collect(Collectors.toList()); + } + + public static List rollChanceTable(boolean atLeastOne,ChanceItem... table){ + return rollChanceTable(atLeastOne, Arrays.asList(table)); + } + + public static Item rollWeightedChanceTable(WeightedChanceItem... table){ + return rollWeightedChanceTable(new ArrayList<>(Arrays.asList(table))); + } + + public static Item rollWeightedChanceTable(List table){ + int sumOfWeights = table.stream().mapToInt(item -> item.weight).sum(); + int rand = random(sumOfWeights); + Collections.shuffle(table); + for(WeightedChanceItem item : table){ + if(rand <= item.weight) + return item.getItem(); + rand -= item.weight; + } + //We should get here if and only if the weighted chance table is empty. + //System.out.println("ERROR ROLLING WEIGHTED CHANCE: WEIGHT SUM AND INDIVIDUAL WEIGHTS DO NOT MATCH!!"); + return null; + } + + /** + * Gets a random value from the array. + * @param array The array. + * @return A random element of the array. + */ + public static T getRandomElement(T[] array) { + return (T) array[randomize(array.length)]; + } + + /** + * Randomizes the value. + * @param value the value to randomize. + * @return The random value. + */ + public static int randomize(int value) { + if (value < 1) { + return 0; + } + return RANDOM.nextInt(value); + } +} diff --git a/Server/src/main/java/Server/core/tools/StringUtils.java b/Server/src/main/java/Server/core/tools/StringUtils.java new file mode 100644 index 000000000..8637707b8 --- /dev/null +++ b/Server/src/main/java/Server/core/tools/StringUtils.java @@ -0,0 +1,593 @@ +package core.tools; + +import java.text.DecimalFormat; +import java.util.StringTokenizer; + +import core.net.packet.IoBuffer; + +/** + * The string utils. + * @author Emperor + */ +public final class StringUtils { + + /** + * The valid characters to be used in names/messages/... + */ + public static final char[] VALID_CHARS = { '_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; + /** + * Character mapping. + */ + public static char[] mapping = { '\n', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ' }; + /** + * The an int array241. + */ + public static int[] anIntArray241 = { 215, 203, 83, 158, 104, 101, 93, 84, 107, 103, 109, 95, 94, 98, 89, 86, 70, 41, 32, 27, 24, 23, -1, -2, 26, -3, -4, 31, 30, -5, -6, -7, 37, 38, 36, -8, -9, -10, 40, -11, -12, 55, 48, 46, 47, -13, -14, -15, 52, 51, -16, -17, 54, -18, -19, 63, 60, 59, -20, -21, 62, -22, -23, 67, 66, -24, -25, 69, -26, -27, 199, 132, 80, 77, 76, -28, -29, 79, -30, -31, 87, 85, -32, -33, -34, -35, -36, 197, -37, 91, -38, 134, -39, -40, -41, 97, -42, -43, 133, 106, -44, 117, -45, -46, 139, -47, -48, 110, -49, -50, 114, 113, -51, -52, 116, -53, -54, 135, 138, 136, 129, 125, 124, -55, -56, 130, 128, -57, -58, -59, 183, -60, -61, -62, -63, -64, 148, -65, -66, 153, 149, 145, 144, -67, -68, 147, -69, -70, -71, 152, 154, -72, -73, -74, 157, 171, -75, -76, 207, 184, 174, 167, 166, 165, -77, -78, -79, 172, 170, -80, -81, -82, 178, -83, 177, 182, -84, -85, 187, 181, -86, -87, -88, -89, 206, 221, -90, 189, -91, 198, 254, 262, 195, 196, -92, -93, -94, -95, -96, 252, 255, 250, -97, 211, 209, -98, -99, 212, -100, 213, -101, -102, -103, 224, -104, 232, 227, 220, 226, -105, -106, 246, 236, -107, 243, -108, -109, 231, 237, 235, -110, -111, 239, 238, -112, -113, -114, -115, -116, 241, -117, 244, -118, -119, 248, -120, 249, -121, -122, -123, 253, -124, -125, -126, -127, 259, 258, -128, -129, 261, -130, -131, 390, 327, 296, 281, 274, 271, 270, -132, -133, 273, -134, -135, 278, 277, -136, -137, 280, -138, -139, 289, 286, 285, -140, -141, 288, -142, -143, 293, 292, -144, -145, 295, -146, -147, 312, 305, 302, 301, -148, -149, 304, -150, -151, 309, 308, -152, -153, 311, -154, -155, 320, 317, 316, -156, -157, 319, -158, -159, 324, 323, -160, -161, 326, -162, -163, 359, 344, 337, 334, 333, -164, -165, 336, -166, -167, 341, 340, -168, -169, 343, -170, -171, 352, 349, 348, -172, -173, 351, -174, -175, 356, 355, -176, -177, 358, -178, -179, 375, 368, 365, 364, -180, -181, 367, -182, -183, 372, 371, -184, -185, 374, -186, -187, 383, 380, 379, -188, -189, 382, -190, -191, 387, 386, -192, -193, 389, -194, -195, 454, 423, 408, 401, 398, 397, -196, -197, 400, -198, -199, 405, 404, -200, -201, 407, -202, -203, 416, 413, 412, -204, -205, 415, -206, -207, 420, 419, -208, -209, 422, -210, -211, 439, 432, 429, 428, -212, -213, 431, -214, -215, 436, 435, -216, -217, 438, -218, -219, 447, 444, 443, -220, -221, 446, -222, -223, 451, 450, -224, -225, 453, -226, -227, 486, 471, 464, 461, 460, -228, -229, 463, -230, -231, 468, 467, -232, -233, 470, -234, -235, 479, 476, 475, -236, -237, 478, -238, -239, 483, 482, -240, -241, 485, -242, -243, 499, 495, 492, 491, -244, -245, 494, -246, -247, 497, -248, 502, -249, 506, 503, -250, -251, 505, -252, -253, 508, -254, 510, -255, -256, 0 }; + + /** + * Constructs a new {@code StringUtils.java} {@code Object}. + */ + public StringUtils() { + /** + * empty. + */ + } + + /** + * Method used to get the formatted number as a string from the integer + * inputed. + * @param amount the ammount. + * @return the string value. + */ + public static String getFormattedNumber(int amount) { + return new DecimalFormat("#,###,##0").format(amount).toString(); + } + + /** + * Checks if the string contains an invalid character. + * @param name The string. + * @return {@code True} if so. + */ + public static boolean containsInvalidCharacter(String name) { + boolean pass = false; + for (char c : name.toCharArray()) { + for (char vc : VALID_CHARS) { + if (vc == c) { + pass = true; + break; + } + } + if (!pass) { + return true; + } + } + return false; + } + + /** + * If a word starts with a e i o u h for grammar = a + n. + * @param word The word. + * @return If the a should have +n {@code true}. + */ + public static boolean isPlusN(String word) { + if (word == null) + return false; + String s = word.toLowerCase(); + return s.charAt(0) == 'a' || s.charAt(0) == 'e' || s.charAt(0) == 'i' || s.charAt(0) == 'o' || s.charAt(0) == 'u' || (s.charAt(0) == 'h' && s.length() > 1 && s.charAt(1) != 'e'); + } + + /** + * Adds an s to make a world plural. + * @param word the word + * @return the plural word + */ + public static String plusS(String word) { + if (word == null) { + return null; + } + if (word.endsWith("s")) { + return word; + } + if (word.endsWith("y")) { + return word.substring(0, word.length() - 1) + "ies"; + } + return word + "s"; + } + /** + * Method used to get the player name as a long. + * @param s the string. + * @return the long. + */ + public static long getPlayerNameLong(String s) { + long l = 0L; + for (int i = 0; i < s.length() && i < 12; i++) { + char c = s.charAt(i); + l *= 37L; + if (c >= 'A' && c <= 'Z') + l += (1 + c) - 65; + else if (c >= 'a' && c <= 'z') + l += (1 + c) - 97; + else if (c >= '0' && c <= '9') + l += (27 + c) - 48; + } + while (l % 37L == 0L && l != 0L) + l /= 37L; + return l; + } + + /** + * Method used to convert the string to a long. + * @param s the string. + * @return the long. + */ + public static long convertStringToLong(String s) { + if (s.length() > 20) { + throw new IllegalArgumentException("String is too long: " + s); + } + long out = 0L; + for (int i = 0; i < s.length(); ++i) { + long m = reducedMapping(s.codePointAt(i)); + if (m == -1) { + throw new IllegalArgumentException("Unmapped Character in String: " + s); + } + m <<= ((9 - i) * 6) + 4; + out |= m; + } + return out; + } + + /** + * Formats the string as display name. + * @param name The string to format. + * @return The formatted name. + */ + public static String formatDisplayName(String name) { + name = name.replaceAll("_", " "); + name = name.toLowerCase(); + StringBuilder newName = new StringBuilder(); + boolean wasSpace = true; + for (int i = 0; i < name.length(); i++) { + if (wasSpace) { + newName.append((new String() + name.charAt(i)).toUpperCase()); + wasSpace = false; + } else { + newName.append(name.charAt(i)); + } + if (name.charAt(i) == ' ') { + wasSpace = true; + } + } + return newName.toString(); + } + + /** + * Gets the byte for the character. + * @param c The character. + * @return The byte. + */ + private static final byte getByte(char c) { + byte charByte; + if (c > 0 && c < '\200' || c >= '\240' && c <= '\377') + charByte = (byte) c; + else if (c != '\u20AC') { + if (c != '\u201A') { + if (c != '\u0192') { + if (c == '\u201E') + charByte = -124; + else if (c != '\u2026') { + if (c != '\u2020') { + if (c == '\u2021') + charByte = -121; + else if (c == '\u02C6') + charByte = -120; + else if (c == '\u2030') + charByte = -119; + else if (c == '\u0160') + charByte = -118; + else if (c == '\u2039') + charByte = -117; + else if (c == '\u0152') + charByte = -116; + else if (c != '\u017D') { + if (c == '\u2018') + charByte = -111; + else if (c != '\u2019') { + if (c != '\u201C') { + if (c == '\u201D') + charByte = -108; + else if (c != '\u2022') { + if (c == '\u2013') + charByte = -106; + else if (c == '\u2014') + charByte = -105; + else if (c == '\u02DC') + charByte = -104; + else if (c == '\u2122') + charByte = -103; + else if (c != '\u0161') { + if (c == '\u203A') + charByte = -101; + else if (c != '\u0153') { + if (c == '\u017E') + charByte = -98; + else if (c != '\u0178') + charByte = 63; + else + charByte = -97; + } else + charByte = -100; + } else + charByte = -102; + } else + charByte = -107; + } else + charByte = -109; + } else + charByte = -110; + } else + charByte = -114; + } else + charByte = -122; + } else + charByte = -123; + } else + charByte = -125; + } else + charByte = -126; + } else + charByte = -128; + return charByte; + } + + /** + * Gets the double value of this string + * @param s The string. + * @return The double value. + */ + public static double getDouble(String s) { + s = s.replaceAll(", ", "").replaceAll(",", ""); + StringBuilder sb = new StringBuilder(); + char c; + boolean foundStart = false; + for (int i = 0; i < s.length(); i++) { + c = s.charAt(i); + if (Character.isDigit(c) || c == '-' || c == '.') { + sb.append(c); + foundStart = true; + } else if (foundStart) + break; + } + try { + double amount = Double.parseDouble(sb.toString()); + return amount; + } catch (NumberFormatException e) { + return 0.0; + } + } + + public static String[] splitIntoLine(String input, int maxCharInLine) { + + StringTokenizer tok = new StringTokenizer(input, " "); + StringBuilder output = new StringBuilder(input.length()); + int lineLen = 0; + while (tok.hasMoreTokens()) { + String word = tok.nextToken(); + + while (word.length() > maxCharInLine) { + output.append(word.substring(0, maxCharInLine - lineLen) + "\n"); + word = word.substring(maxCharInLine - lineLen); + lineLen = 0; + } + + if (lineLen + word.length() > maxCharInLine) { + output.append("\n"); + lineLen = 0; + } + output.append(word + " "); + + lineLen += word.length() + 1; + } + // output.split(); + // return output.toString(); + return output.toString().split("\n"); + } + + /** + * Gets the hash for the string. + * @param str The string. + * @return The hash. + */ + public static final int getNameHash(String str) { + str = str.toLowerCase(); + int hash = 0; + for (int index = 0; index < str.length(); index++) + hash = getByte(str.charAt(index)) + ((hash << 5) - hash); + return hash; + } + + /** + * Gets the string value of this string (all html/... removed). + * @param s The string. + * @return The string value. + */ + public static String getString(String s) { + String string = s.replaceAll("\\<.*?>", "").replaceAll(" ", "").replaceAll("Discontinued Item:", ""); + return string; + } + + /** + * Characters used to convert a String to a Long. + */ + public static char[] validChars = { '_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; + public static int[] anIntArray233 = { 0, 1024, 2048, 3072, 4096, 5120, 6144, 8192, 9216, 12288, 10240, 11264, 16384, 18432, 17408, 20480, 21504, 22528, 23552, 24576, 25600, 26624, 27648, 28672, 29696, 30720, 31744, 32768, 33792, 34816, 35840, 36864, 536870912, 16777216, 37888, 65536, 38912, 131072, 196608, 33554432, 524288, 1048576, 1572864, 262144, 67108864, 4194304, 134217728, 327680, 8388608, 2097152, 12582912, 13631488, 14680064, 15728640, 100663296, 101187584, 101711872, 101974016, 102760448, 102236160, 40960, 393216, 229376, 117440512, 104857600, 109051904, 201326592, 205520896, 209715200, 213909504, 106954752, 218103808, 226492416, 234881024, 222298112, 224395264, 268435456, 272629760, 276824064, 285212672, 289406976, 223346688, 293601280, 301989888, 318767104, 297795584, 298844160, 310378496, 102498304, 335544320, 299892736, 300941312, 301006848, 300974080, 39936, 301465600, 49152, 1073741824, 369098752, 402653184, 1342177280, 1610612736, 469762048, 1476395008, -2147483648, -1879048192, 352321536, 1543503872, -2013265920, -1610612736, -1342177280, -1073741824, -1543503872, 356515840, -1476395008, -805306368, -536870912, -268435456, 1577058304, -134217728, 360710144, -67108864, 364904448, 51200, 57344, 52224, 301203456, 53248, 54272, 55296, 56320, 301072384, 301073408, 301074432, 301075456, 301076480, 301077504, 301078528, 301079552, 301080576, 301081600, 301082624, 301083648, 301084672, 301085696, 301086720, 301087744, 301088768, 301089792, 301090816, 301091840, 301092864, 301093888, 301094912, 301095936, 301096960, 301097984, 301099008, 301100032, 301101056, 301102080, 301103104, 301104128, 301105152, 301106176, 301107200, 301108224, 301109248, 301110272, 301111296, 301112320, 301113344, 301114368, 301115392, 301116416, 301117440, 301118464, 301119488, 301120512, 301121536, 301122560, 301123584, 301124608, 301125632, 301126656, 301127680, 301128704, 301129728, 301130752, 301131776, 301132800, 301133824, 301134848, 301135872, 301136896, 301137920, 301138944, 301139968, 301140992, 301142016, 301143040, 301144064, 301145088, 301146112, 301147136, 301148160, 301149184, 301150208, 301151232, 301152256, 301153280, 301154304, 301155328, 301156352, 301157376, 301158400, 301159424, 301160448, 301161472, 301162496, 301163520, 301164544, 301165568, 301166592, 301167616, 301168640, 301169664, 301170688, 301171712, 301172736, 301173760, 301174784, 301175808, 301176832, 301177856, 301178880, 301179904, 301180928, 301181952, 301182976, 301184000, 301185024, 301186048, 301187072, 301188096, 301189120, 301190144, 301191168, 301193216, 301195264, 301194240, 301197312, 301198336, 301199360, 301201408, 301202432 }; + public static byte[] aByteArray235 = { 22, 22, 22, 22, 22, 22, 21, 22, 22, 20, 22, 22, 22, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 3, 8, 22, 16, 22, 16, 17, 7, 13, 13, 13, 16, 7, 10, 6, 16, 10, 11, 12, 12, 12, 12, 13, 13, 14, 14, 11, 14, 19, 15, 17, 8, 11, 9, 10, 10, 10, 10, 11, 10, 9, 7, 12, 11, 10, 10, 9, 10, 10, 12, 10, 9, 8, 12, 12, 9, 14, 8, 12, 17, 16, 17, 22, 13, 21, 4, 7, 6, 5, 3, 6, 6, 5, 4, 10, 7, 5, 6, 4, 4, 6, 10, 5, 4, 4, 5, 7, 6, 10, 6, 10, 22, 19, 22, 14, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 22, 21, 22, 22, 22, 21, 22, 22 }; + + /** + * Encrypt a string for the client. + */ + public static int encryptPlayerChat(byte[] is, int i_25_, int i_26_, int i_27_, byte[] is_28_) { + try { + i_27_ += i_25_; + int i_29_ = 0; + int i_30_ = i_26_ << -2116795453; + for (; i_27_ > i_25_; i_25_++) { + int i_31_ = 0xff & is_28_[i_25_]; + int i_32_ = anIntArray233[i_31_]; + int i_33_ = aByteArray235[i_31_]; + int i_34_ = i_30_ >> -1445887805; + int i_35_ = i_30_ & 0x7; + i_29_ &= (-i_35_ >> 473515839); + i_30_ += i_33_; + int i_36_ = ((-1 + (i_35_ - -i_33_)) >> -1430991229) + i_34_; + i_35_ += 24; + is[i_34_] = (byte) (i_29_ = (i_29_ | (i_32_ >>> i_35_))); + if ((i_36_ ^ 0xffffffff) < (i_34_ ^ 0xffffffff)) { + i_34_++; + i_35_ -= 8; + is[i_34_] = (byte) (i_29_ = i_32_ >>> i_35_); + if (i_36_ > i_34_) { + i_34_++; + i_35_ -= 8; + is[i_34_] = (byte) (i_29_ = i_32_ >>> i_35_); + if (i_36_ > i_34_) { + i_35_ -= 8; + i_34_++; + is[i_34_] = (byte) (i_29_ = i_32_ >>> i_35_); + if (i_34_ < i_36_) { + i_35_ -= 8; + i_34_++; + is[i_34_] = (byte) (i_29_ = i_32_ << -i_35_); + } + } + } + } + } + return -i_26_ + ((7 + i_30_) >> -662855293); + } catch (RuntimeException runtimeexception) { + } + return 0; + } + + /** + * Gets an integer value from a string. + * @param s the string. + * @return The value; + */ + public static int getValue(String s) { + s = s.replaceAll(", ", "").replaceAll(",", ""); + StringBuilder sb = new StringBuilder(); + char c; + boolean foundStart = false; + for (int i = 0; i < s.length(); i++) { + c = s.charAt(i); + if (Character.isDigit(c) || c == '-') { + sb.append(c); + foundStart = true; + } else if (foundStart) + break; + } + try { + int amount = Integer.parseInt(sb.toString()); + return amount; + } catch (NumberFormatException e) { + return 0; + } + } + + /** + * Checks if the account name is valid. + * @param name The account name. + * @return {@code True} if the account name is invalid. + */ + public static boolean invalidAccountName(String name) { + return name.length() > 12 || name.startsWith("_") || name.endsWith("_") || name.contains("__") || containsInvalidCharacter(name); + } + + /** + * Converts a long to a string. + * @param l The long. + * @return The string. + */ + public static String longToString(long l) { + int i = 0; + char ac[] = new char[32]; + while (l != 0L) { + long l1 = l; + l /= 37L; + ac[11 - i++] = VALID_CHARS[(int) (l1 - l * 37L)]; + } + return new String(ac, 12 - i, i); + } + + /** + * Packs a GJ2-String. + * @param position The position to start. + * @param buffer The byte-array. + * @param str The string. + * @return The size of the string. + */ + public static final int packGJString2(int position, byte[] buffer, String str) { + int length = str.length(); + int offset = position; + for (int index = 0; length > index; index++) { + int character = str.charAt(index); + if (character > 127) { + if (character > 2047) { + buffer[offset++] = (byte) ((character | 919275) >> 12); + buffer[offset++] = (byte) (128 | ((character >> 6) & 63)); + buffer[offset++] = (byte) (128 | (character & 63)); + } else { + buffer[offset++] = (byte) ((character | 12309) >> 6); + buffer[offset++] = (byte) (128 | (character & 63)); + } + } else + buffer[offset++] = (byte) character; + } + return offset - position; + } + + /** + * Method used to... + * @param x idk, + * @return the idk. + */ + public static long reducedMapping(int x) { + long out = -1; + if (x >= 97 && x <= 122) + out = x - 96; + else if (x >= 65 && x <= 90) + out = x - 37; + else if (x >= 48 && x <= 57) + out = x - +5; + else if (x == 32) + out = 63L; + return out; + } + + /** + * Converts a string to a long. + * @param s The string. + * @return The long. + */ + public static long stringToLong(String s) { + long l = 0L; + for (int i = 0; i < s.length() && i < 12; i++) { + char c = s.charAt(i); + l *= 37L; + if (c >= 'A' && c <= 'Z') + l += (1 + c) - 65; + else if (c >= 'a' && c <= 'z') + l += (1 + c) - 97; + else if (c >= '0' && c <= '9') + l += (27 + c) - 48; + } + while (l % 37L == 0L && l != 0L) + l /= 37L; + return l; + } + + /** + * Decrypt player chat. + * @param buffer The buffer + * @param totalChars The total chars + * @return The string + */ + public static String decryptPlayerChat(IoBuffer buffer, int totalChars) { + try { + if (totalChars == 0) + return ""; + int charsDecoded = 0; + int i_4_ = 0; + String s = ""; + for (;;) { + byte i_7_ = (byte) buffer.get(); + if (i_7_ >= 0) + i_4_++; + else + i_4_ = anIntArray241[i_4_]; + int i_8_; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + i_4_ = 0; + } + if (((i_7_ & 0x40) ^ 0xffffffff) != -1) + i_4_ = anIntArray241[i_4_]; + else + i_4_++; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (++charsDecoded >= totalChars) + break; + i_4_ = 0; + } + if ((0x20 & i_7_) == 0) + i_4_++; + else + i_4_ = anIntArray241[i_4_]; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + i_4_ = 0; + } + if (((0x10 & i_7_) ^ 0xffffffff) == -1) + i_4_++; + else + i_4_ = anIntArray241[i_4_]; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + + i_4_ = 0; + } + if (((0x8 & i_7_) ^ 0xffffffff) != -1) + i_4_ = anIntArray241[i_4_]; + else + i_4_++; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (++charsDecoded >= totalChars) + break; + i_4_ = 0; + } + if ((0x4 & i_7_) == 0) + i_4_++; + else + i_4_ = anIntArray241[i_4_]; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + i_4_ = 0; + } + if (((i_7_ & 0x2) ^ 0xffffffff) != -1) + i_4_ = anIntArray241[i_4_]; + else + i_4_++; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (totalChars <= ++charsDecoded) + break; + i_4_ = 0; + } + if (((i_7_ & 0x1) ^ 0xffffffff) != -1) + i_4_ = anIntArray241[i_4_]; + else + i_4_++; + if ((i_8_ = anIntArray241[i_4_]) < 0) { + s += (char) (byte) (i_8_ ^ 0xffffffff); + if (++charsDecoded >= totalChars) + break; + i_4_ = 0; + } + } + return s; + } catch (RuntimeException runtimeexception) { + runtimeexception.printStackTrace(); + } + return ""; + } +} diff --git a/Server/src/main/java/Server/core/tools/TickUtils.kt b/Server/src/main/java/Server/core/tools/TickUtils.kt new file mode 100644 index 000000000..3d449d4ab --- /dev/null +++ b/Server/src/main/java/Server/core/tools/TickUtils.kt @@ -0,0 +1,14 @@ +package core.tools + +const val tick = 600 //ms +const val second = 1000 //ms + +fun secondsToTicks(seconds: Int): Int { + val seconds = seconds * second //seconds -> ms + return seconds / tick //returns an int with the closest number of ticks to the desired number of seconds possible +} + +fun ticksToSeconds(ticks: Int): Int { + val ticksMs = ticks * tick + return ticksMs / 1000 +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/tools/TimeStamp.java b/Server/src/main/java/Server/core/tools/TimeStamp.java new file mode 100644 index 000000000..13934b1fc --- /dev/null +++ b/Server/src/main/java/Server/core/tools/TimeStamp.java @@ -0,0 +1,73 @@ +package core.tools; + +/** + * Used for debugging duration of executing code. + * @author Emperor + */ +public final class TimeStamp { + + /** + * The start + */ + private long start; + + /** + * The interval. + */ + private long interval; + + /** + * Constructs a new {@code TimeStamp} {@code Object}. + */ + public TimeStamp() { + start = System.currentTimeMillis(); + interval = start; + } + + /** + * Set current interval. + * @return The duration of this interval. + */ + public long interval() { + return interval(true, ""); + } + + /** + * Set current interval. + * @param debug If we should print out the duration. + * @return The duration of this interval. + */ + public long interval(boolean debug) { + return interval(debug, ""); + } + + /** + * Set current interval. + * @param debug If we should print out the duration. + * @param info Extra information. + * @return The duration of this interval. + */ + public long interval(boolean debug, String info) { + long current = System.currentTimeMillis(); + long difference = current - interval; + if (debug || difference > 100) { + System.out.println("Interval " + info + " - time elapsed=" + difference + "ms."); + } + interval = current; + return difference; + } + + /** + * Gets the amount of milliseconds passed since the creation of this object. + * @return The duration. + */ + public long duration(boolean debug, String info) { + long current = System.currentTimeMillis(); + long difference = current - start; + if (debug) { + System.out.println("Interval " + info + " - time elapsed=" + difference + "ms."); + } + return difference; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/tools/Vector3d.java b/Server/src/main/java/Server/core/tools/Vector3d.java new file mode 100644 index 000000000..c44b826d6 --- /dev/null +++ b/Server/src/main/java/Server/core/tools/Vector3d.java @@ -0,0 +1,139 @@ +package core.tools; + +import core.game.world.map.Location; + +public class Vector3d { + public double x; + public double y; + public double z; + + public Vector3d(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Vector3d(double[] t) { + this.x = t[0]; + this.y = t[1]; + this.z = t[2]; + } + + public Vector3d(Vector3d v) { + this.x = v.x; + this.y = v.y; + this.z = v.z; + } + + public Vector3d(Location l) { + this.x = l.getX(); + this.y = l.getY(); + this.z = l.getZ(); + } + + public Vector3d() { + this.x = 0.0; + this.y = 0.0; + this.z = 0.0; + } + + public String toString() { + return "(" + this.x + ", " + this.y + ", " + this.z + ")"; + } + + public final Vector3d add(Vector3d v1, Vector3d v2) { + this.x = v1.x + v2.x; + this.y = v1.y + v2.y; + this.z = v1.z + v2.z; + return this; + } + + public final Vector3d add(Vector3d v1) { + this.x += v1.x; + this.y += v1.y; + this.z += v1.z; + return this; + } + + public final Vector3d sub(Vector3d v1, Vector3d v2) { + this.x = v1.x - v2.x; + this.y = v1.y - v2.y; + this.z = v1.z - v2.z; + return this; + } + + public final Vector3d sub(Vector3d v1) { + this.x -= v1.x; + this.y -= v1.y; + this.z -= v1.z; + return this; + } + + public final Vector3d negate(Vector3d v1) { + this.x = -v1.x; + this.y = -v1.y; + this.z = -v1.z; + return this; + } + + public final Vector3d negate() { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + return this; + } + + public final Vector3d cross(Vector3d v2) { + this.cross(new Vector3d(this), v2); + return this; + } + + public final Vector3d cross(Vector3d v1, Vector3d v2) { + this.x = v1.y*v2.z - v1.z*v2.y; + this.y = v1.z*v2.x - v1.x*v2.z; + this.z = v1.x*v2.y - v1.y*v2.x; + return this; + } + + public final double dot(Vector3d v2) { + return (this.x*v2.x + this.y*v2.y + this.z*v2.z); + } + + public final double l2norm() { + return Math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z); + } + + public final Vector3d normalize() { + double norm = this.l2norm(); + this.x /= norm; + this.y /= norm; + this.z /= norm; + return this; + } + + public static double signedAngle(final Vector3d v1, final Vector3d v2, final Vector3d n) { + return Math.atan2(new Vector3d().cross(v1, v2).dot(n), v1.dot(v2)); + } + + public boolean equals(final Vector3d v1) { + return (this.x == v1.x && this.y == v1.y && this.z == v1.z); + } + + public boolean epsilonEquals(final Vector3d v1, double epsilon) { + double diff; + + diff = this.x - v1.x; + if (Double.isNaN(diff)) return false; + if ((diff<0 ? -diff : diff) > epsilon) return false; + + diff = this.y - v1.y; + if (Double.isNaN(diff)) return false; + if ((diff<0 ? -diff : diff) > epsilon) return false; + + diff = this.z - v1.z; + if (Double.isNaN(diff)) return false; + if ((diff<0 ? -diff : diff) > epsilon) return false; + + return true; + } +} diff --git a/Server/src/main/java/Server/core/tools/mysql/Database.java b/Server/src/main/java/Server/core/tools/mysql/Database.java new file mode 100644 index 000000000..c893294f2 --- /dev/null +++ b/Server/src/main/java/Server/core/tools/mysql/Database.java @@ -0,0 +1,33 @@ +package core.tools.mysql; + +public class Database { + + private String host; + private String name; + private String username; + private String password; + + public Database(String host, String name, String username, String password) { + this.host = host; + this.name = name; + this.username = username; + this.password = password; + } + + public String host() { + return host; + } + + public String name() { + return name; + } + + public String username() { + return username; + } + + public String password() { + return password; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/core/tools/mysql/DatabaseManager.java b/Server/src/main/java/Server/core/tools/mysql/DatabaseManager.java new file mode 100644 index 000000000..e8a031ad1 --- /dev/null +++ b/Server/src/main/java/Server/core/tools/mysql/DatabaseManager.java @@ -0,0 +1,96 @@ +package core.tools.mysql; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; + +import core.ServerConstants; +import core.game.system.SystemLogger; + +public class DatabaseManager { + + private Map connections = new HashMap<>(); + private Map databases; + + private Database db; + private boolean connected; + + public DatabaseManager(Database db) { + this.db = db; + } + + public DatabaseManager connect() { + try { + Connection connection = DriverManager.getConnection("jdbc:mysql://" + db.host() + "/" + db.name() + "?useTimezone=true&serverTimezone=UTC", db.username(), db.password()); + connections.put(db.name(), connection); + + SystemLogger.logInfo("Successfully connected with '" + db.name() + "'."); + + this.connected = true; + + + } catch (SQLException e) { + SystemLogger.logErr("Couldn't connect to the database."); + e.printStackTrace(); + ServerConstants.MYSQL = false; + } + return this; + } + + public ResultSet query(String name, String query) { + + try { + + Connection connection = connections().get(name); + + if (connection == null) + return null; + + Statement statement = connection.createStatement(); + + return statement.executeQuery(query); + + } catch (SQLException e) { + System.out.println(e); + } + + return null; + } + + public int update(String name, String query) { + + try { + + Connection connection = connections().get(name); + + if (connection == null) + return -1; + + Statement statement = connection.createStatement(); + + return statement.executeUpdate(query); + + } catch (SQLException e) { + System.out.println(e); + } + + return -1; + } + + public Map connections() { + return connections; + } + + public Map databases() { + return databases; + } + + public boolean isConnected() { + return connected; + } + +} diff --git a/Server/src/main/java/Server/core/tools/mysql/Query.java b/Server/src/main/java/Server/core/tools/mysql/Query.java new file mode 100644 index 000000000..af047de94 --- /dev/null +++ b/Server/src/main/java/Server/core/tools/mysql/Query.java @@ -0,0 +1,48 @@ +package core.tools.mysql; + +public class Query { + + private String start; + private StringBuilder content; + private String end; + + public Query() { + this.start = ""; + this.content = new StringBuilder(); + this.end = ""; + } + + public String start(String start) { + this.start = start; + return this.start; + } + + public String end(String end) { + this.end = end; + return this.end; + } + + public StringBuilder add(String key, String value) { + this.content.append(key + "='" + value + "'").append(","); + return this.content; + } + + public StringBuilder add(String key, int value) { + this.content.append(key + "='" + value + "'").append(","); + return this.content; + } + + public StringBuilder add(String key, boolean value) { + this.content.append(key + "='" + (value ? 1 : 0) + "'").append(","); + return this.content; + } + + public String total() { + StringBuilder total = new StringBuilder(); + total.append(this.start); + total.append(this.content.substring(0, this.content.length() - 1)); + total.append(this.end); + return total.toString(); + } + + } diff --git a/Server/src/main/java/Server/core/tools/mysql/Results.java b/Server/src/main/java/Server/core/tools/mysql/Results.java new file mode 100644 index 000000000..6efc2333b --- /dev/null +++ b/Server/src/main/java/Server/core/tools/mysql/Results.java @@ -0,0 +1,107 @@ +package core.tools.mysql; + +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.util.ArrayList; +import java.util.List; + +public class Results { + + private ResultSet set; + + public Results(ResultSet set) { + this.set = set; + } + + public String string(String column) { + + try { + + String result = set().getString(column); + + return result; + + } catch (Exception e) { + System.out.println("Column '" + column + "' not found."); + } + + return null; + + } + + public int integer(String column) { + + try { + + int result = set().getInt(column); + + return result; + + } catch (Exception e) { + System.out.println("Column '" + column + "' not found."); + } + + return -1; + + } + + public List columns() { + + try { + + ResultSetMetaData meta = set().getMetaData(); + int count = meta.getColumnCount(); + + List columns = new ArrayList(count); + + for (int i = 1; i <= count; i++) + columns.add(meta.getColumnName(i)); + + return columns; + + } catch (Exception e) { + System.out.println("Unable to gather columns."); + } + + return null; + + } + + public boolean empty() { + + try { + return !set().next(); + } catch (Exception e) { + System.out.println("Error occurred, while checking for results."); + } + + return true; + } + + public static int[] integers(String[] values) { + + int[] integers = new int[values.length]; + + for (int i = 0; i < integers.length; i++) + integers[i] = Integer.parseInt(values[i]); + + return integers; + + } + + public static double[] doubles(String[] values) { + + double[] integers = new double[values.length]; + + for (int i = 0; i < integers.length; i++) + integers[i] = Double.parseDouble(values[i]); + + return integers; + + } + + public ResultSet set() { + return set; + } + +} diff --git a/Server/src/main/java/Server/core/tools/stringtools/StringTools.kt b/Server/src/main/java/Server/core/tools/stringtools/StringTools.kt new file mode 100644 index 000000000..9f990162b --- /dev/null +++ b/Server/src/main/java/Server/core/tools/stringtools/StringTools.kt @@ -0,0 +1,41 @@ +package core.tools.stringtools + +const val RED = "" +const val ORANGE = "" +const val YELLOW = "" +const val GREEN = "" +const val BLUE = "" +const val PURPLE = "" + +fun colorize(line: String): String{ + val new = line.replace("%R", RED) + .replace("%O", ORANGE) + .replace("%Y",YELLOW) + .replace("%G",GREEN) + .replace("%B",BLUE) + .replace("%P",PURPLE).append("") + " " + return new +} + +fun colorize(line: String, hexColor: String): String{ + return line.prepend("").append("") +} + +fun String.append(line: String): String{ + return this + line +} + +fun String.prepend(line: String): String{ + return line + this +} + +fun String.shuffle(): String{ + var new = "" + val old = this.split("").toMutableList() + for(i in this.indices){ + val c = old.random() + new += c.toString() + old.remove(c) + } + return new +} diff --git a/Server/src/main/java/Server/core/worker/MajorUpdateWorker.java b/Server/src/main/java/Server/core/worker/MajorUpdateWorker.java new file mode 100644 index 000000000..c3f412d4d --- /dev/null +++ b/Server/src/main/java/Server/core/worker/MajorUpdateWorker.java @@ -0,0 +1,133 @@ +/* +package core.worker; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +import core.game.system.SystemManager; +import core.game.world.GameWorld; +import core.game.world.repository.Repository; +import core.game.world.update.UpdateSequence; +import core.gui.tab.StatisticsTab; +import core.plugin.CorePluginTypes.Managers; + +*/ +/** + * The major update worker, this handles the game updating etc. + * @author Emperor + *//* + +public final class MajorUpdateWorker implements Runnable { + + */ +/** + * The updating sequence to use. + *//* + + private final UpdateSequence sequence = new UpdateSequence(); + + */ +/** + * The executor. + *//* + + private final Executor EXECUTOR = Executors.newSingleThreadExecutor(); + + */ +/** + * The start time of a cycle. + *//* + + private long start; + + */ +/** + * If the major update worker has started. + *//* + + private boolean started; + + */ +/** + * Constructs a new {@code MajorUpdateWorker} {@code Object}. + *//* + + public MajorUpdateWorker() { + */ +/* + * Empty. + *//* + + } + + */ +/** + * Starts the update worker. + *//* + + public void start() { + if (started) { + return; + } + started = true; + EXECUTOR.execute(MajorUpdateWorker.this); + } + + @Override + public void run() { + while (SystemManager.isActive()) { + try { + start = System.currentTimeMillis(); + sequence.start(); + sequence.run(); + sequence.end(); + //GameWorld.threadPool. + GameWorld.pulse(); + Repository.getDisconnectionQueue().update(); + Managers.tick(); + sleep(); + } catch (Throwable t) { + t.printStackTrace(); + } + } + started = false; + } + + */ +/** + * Lets the current thread sleep. + * @throws InterruptedException When the thread is interrupted. + *//* + + private void sleep() throws InterruptedException { + // How many ticks off we are + final int TICK_SPEED = (int) (600 / 1); //Allows you to make server ticks faster than normal + StatisticsTab.reportPerformance((int) (System.currentTimeMillis() - start)); + long duration = TICK_SPEED - ((System.currentTimeMillis() - start) % TICK_SPEED); + if (duration > 0) { + Thread.sleep(duration); + } else { + SystemLogger.logErr("Updating cycle duration took " + -duration + "ms too long!"); + } + } + + */ +/** + * Gets the started. + * @return The started. + *//* + + public boolean isStarted() { + return started; + } + + */ +/** + * Sets the started. + * @param started The started to set. + *//* + + public void setStarted(boolean started) { + this.started = started; + } +}*/ diff --git a/Server/src/main/java/Server/core/worker/MajorUpdateWorker.kt b/Server/src/main/java/Server/core/worker/MajorUpdateWorker.kt new file mode 100644 index 000000000..d4d4f1a1a --- /dev/null +++ b/Server/src/main/java/Server/core/worker/MajorUpdateWorker.kt @@ -0,0 +1,51 @@ +package core.worker + +import core.Server +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.repository.Repository +import core.game.world.update.UpdateSequence +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import core.plugin.CorePluginTypes.Managers + +/** + * Handles the running of pulses and writing of masks, etc + * @author Ceikry + */ +class MajorUpdateWorker { + var started = false + val sequence = UpdateSequence() + fun start() = GlobalScope.launch { + started = true + while(true){ + delay(600L) + val rmlist = ArrayList() + val list = ArrayList(GameWorld.Pulser.TASKS) + + //run our pulses + for(pulse in list) { + if (pulse == null || pulse.update()) rmlist.add(pulse) + } + + //remove all null or finished pulses from the list + rmlist.forEach { + if(GameWorld.Pulser.TASKS.contains(it)) GameWorld.Pulser.TASKS.remove(it) + } + + rmlist.clear() + //perform our update sequence where we write masks, etc + sequence.start() + sequence.run() + sequence.end() + //increment global ticks variable + GameWorld.pulse() + //disconnect all players waiting to be disconnected + Repository.disconnectionQueue.update() + //tick all manager plugins + Managers.tick() + Server.heartbeat() + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/AIPBuilder.java b/Server/src/main/java/Server/plugin/ai/AIPBuilder.java new file mode 100644 index 000000000..cb7cfe41f --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/AIPBuilder.java @@ -0,0 +1,1640 @@ +package plugin.ai; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.link.appearance.Gender; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Used for "building" artificial intelligent players. + * @author Emperor + */ +public final class AIPBuilder { + + /** + * Creates a new artificial intelligent player. + * @return The AIPlayer object. + */ + public static AIPlayer create(Location l) { + return new AIPlayer(l); + } + + /** + * Makes an artificial intelligent copy of the player. + * @param player The player. + * @return The artificial intelligent player with the same name, stats, + * items, etc. + */ + public static AIPlayer copy(Player player) { + return copy(player, player.getLocation()); + } + + /** + * Makes an artificial intelligent copy of the player. + * @param player The player. + * @param l The location the AIP should spawn on. + * @return The artificial intelligent player with the same name, stats, + * items, etc. + */ + public static AIPlayer copy(Player player, Location l) { + AIPlayer p = new AIPlayer(l); + p.getSkills().copy(player.getSkills()); + p.getInventory().copy(player.getInventory()); + p.getEquipment().copy(player.getEquipment()); + p.getBank().copy(player.getBank()); + p.getAppearance().copy(player.getAppearance()); + p.setControler(player); + return p; + } + + public static void RandomAfkPlayer(Location loc) + { + final AIPlayer bot = new AIPlayer(loc); + bot.getAppearance().setGender(RandomFunction.random(3) == 1 ? Gender.FEMALE : Gender.MALE); + + + + bot.getSkills().setStaticLevel(Skills.MAGIC, RandomFunction.getRandom(99)); + bot.getSkills().setStaticLevel(Skills.DEFENCE, RandomFunction.getRandom(99)); + bot.getSkills().setStaticLevel(Skills.ATTACK, RandomFunction.getRandom(99)); + bot.getSkills().setStaticLevel(Skills.STRENGTH, RandomFunction.getRandom(99)); + bot.getSkills().setStaticLevel(Skills.RANGE, RandomFunction.getRandom(99)); + bot.getSkills().setStaticLevel(Skills.HITPOINTS, RandomFunction.getRandom(99)); + + bot.getSkills().updateCombatLevel(); + bot.getAppearance().sync(); + + //set orientation? + } + + public static void immersiveSpawns() + { + //Edge + RandomAfkPlayer(new Location(3094, 3491)); + RandomAfkPlayer(new Location(3094, 3493)); + RandomAfkPlayer(new Location(3092, 3497)); + + //GE + RandomAfkPlayer(new Location(3160, 3492)); + RandomAfkPlayer(new Location(3161, 3491)); + RandomAfkPlayer(new Location(3165, 3483)); + RandomAfkPlayer(new Location(3168, 3485)); + RandomAfkPlayer(new Location(3165, 3485)); + RandomAfkPlayer(new Location(3164, 3493)); + + //Varrock Ge bank + RandomAfkPlayer(new Location(3189, 3439)); + + //Home Bank + RandomAfkPlayer(new Location(2099, 3918)); + } + + private List ITEMS = new ArrayList<>(Arrays.asList(new Item(286), //Orange goblin mail + + new Item(287), //Blue goblin mail + + new Item(288), //Goblin mail + + new Item(426), //Priest gown + + new Item(428), //Priest gown + + new Item(466), //Pickaxe handle + + new Item(492), //Picture + + new Item(542), //Monk's robe + + new Item(544), //Monk's robe + + new Item(546), //Shade robe + + new Item(548), //Shade robe + + new Item(552), //Ghostspeak amulet + + new Item(577), //Wizard robe + + new Item(579), //Wizard hat + + new Item(581), //Black robe + + new Item(599), //Picture + + new Item(667), //Blurite sword + + new Item(713), //Picture + + new Item(762), //Picture + + new Item(764), //Picture + + new Item(766), //Picture + + new Item(767), //Phoenix crossbow + + new Item(770), //Picture + + new Item(837), //Crossbow + + new Item(839), //Longbow + + new Item(841), //Shortbow + + new Item(843), //Oak shortbow + + new Item(845), //Oak longbow + + new Item(847), //Willow longbow + + new Item(849), //Willow shortbow + + new Item(851), //Maple longbow + + new Item(853), //Maple shortbow + + new Item(877), //Bronze bolts + + new Item(882), //Bronze arrow + + new Item(884), //Iron arrow + + new Item(886), //Steel arrow + + new Item(888), //Mithril arrow + + new Item(890), //Adamant arrow + + new Item(1005), //White apron + + new Item(1007), //Cape + + new Item(1009), //Brass necklace + + new Item(1011), //Blue skirt + + new Item(1013), //Pink skirt + + new Item(1015), //Black skirt + + new Item(1017), //Wizard hat + + new Item(1019), //Cape + + new Item(1021), //Cape + + new Item(1023), //Cape + + new Item(1027), //Cape + + new Item(1029), //Cape + + new Item(1031), //Cape + + new Item(1037), //Bunny ears + + new Item(1038), //Red partyhat + + new Item(1040), //Yellow partyhat + + new Item(1042), //Blue partyhat + + new Item(1044), //Green partyhat + + new Item(1046), //Purple partyhat + + new Item(1048), //White partyhat + + new Item(1050), //Santa hat + + new Item(1053), //Green h'ween mask + + new Item(1055), //Blue h'ween mask + + new Item(1057), //Red h'ween mask + + new Item(1059), //Leather gloves + + new Item(1061), //Leather boots + + new Item(1063), //Leather vambraces + + new Item(1065), //Green d'hide vamb + + new Item(1067), //Iron platelegs + + new Item(1069), //Steel platelegs + + new Item(1071), //Mithril platelegs + + new Item(1073), //Adamant platelegs + + new Item(1075), //Bronze platelegs + + new Item(1077), //Black platelegs + + new Item(1079), //Rune platelegs + + new Item(1081), //Iron plateskirt + + new Item(1083), //Steel plateskirt + + new Item(1085), //Mithril plateskirt + + new Item(1087), //Bronze plateskirt + + new Item(1089), //Black plateskirt + + new Item(1091), //Adamant plateskirt + + new Item(1093), //Rune plateskirt + + new Item(1095), //Leather chaps + + new Item(1097), //Studded chaps + + new Item(1099), //Green d'hide chaps + + new Item(1101), //Iron chainbody + + new Item(1103), //Bronze chainbody + + new Item(1105), //Steel chainbody + + new Item(1107), //Black chainbody + + new Item(1109), //Mithril chainbody + + new Item(1111), //Adamant chainbody + + new Item(1113), //Rune chainbody + + new Item(1115), //Iron platebody + + new Item(1117), //Bronze platebody + + new Item(1119), //Steel platebody + + new Item(1121), //Mithril platebody + + new Item(1123), //Adamant platebody + + new Item(1125), //Black platebody + + new Item(1127), //Rune platebody + + new Item(1129), //Leather body + + new Item(1131), //Hardleather body + + new Item(1133), //Studded body + + new Item(1135), //Green d'hide body + + new Item(1137), //Iron med helm + + new Item(1139), //Bronze med helm + + new Item(1141), //Steel med helm + + new Item(1143), //Mithril med helm + + new Item(1145), //Adamant med helm + + new Item(1147), //Rune med helm + + new Item(1151), //Black med helm + + new Item(1153), //Iron full helm + + new Item(1155), //Bronze full helm + + new Item(1157), //Steel full helm + + new Item(1159), //Mithril full helm + + new Item(1161), //Adamant full helm + + new Item(1163), //Rune full helm + + new Item(1165), //Black full helm + + new Item(1167), //Leather cowl + + new Item(1169), //Coif + + new Item(1171), //Wooden shield + + new Item(1173), //Bronze sq shield + + new Item(1175), //Iron sq shield + + new Item(1177), //Steel sq shield + + new Item(1179), //Black sq shield + + new Item(1181), //Mithril sq shield + + new Item(1183), //Adamant sq shield + + new Item(1185), //Rune sq shield + + new Item(1189), //Bronze kiteshield + + new Item(1191), //Iron kiteshield + + new Item(1193), //Steel kiteshield + + new Item(1195), //Black kiteshield + + new Item(1197), //Mithril kiteshield + + new Item(1199), //Adamant kiteshield + + new Item(1201), //Rune kiteshield + + new Item(1203), //Iron dagger + + new Item(1205), //Bronze dagger + + new Item(1207), //Steel dagger + + new Item(1209), //Mithril dagger + + new Item(1211), //Adamant dagger + + new Item(1213), //Rune dagger + + new Item(1217), //Black dagger + + new Item(1265), //Bronze pickaxe + + new Item(1267), //Iron pickaxe + + new Item(1269), //Steel pickaxe + + new Item(1271), //Adamant pickaxe + + new Item(1273), //Mithril pickaxe + + new Item(1275), //Rune pickaxe + + new Item(1277), //Bronze sword + + new Item(1279), //Iron sword + + new Item(1281), //Steel sword + + new Item(1283), //Black sword + + new Item(1285), //Mithril sword + + new Item(1287), //Adamant sword + + new Item(1289), //Rune sword + + new Item(1291), //Bronze longsword + + new Item(1293), //Iron longsword + + new Item(1295), //Steel longsword + + new Item(1297), //Black longsword + + new Item(1299), //Mithril longsword + + new Item(1301), //Adamant longsword + + new Item(1303), //Rune longsword + + new Item(1307), //Bronze 2h sword + + new Item(1309), //Iron 2h sword + + new Item(1311), //Steel 2h sword + + new Item(1313), //Black 2h sword + + new Item(1315), //Mithril 2h sword + + new Item(1317), //Adamant 2h sword + + new Item(1319), //Rune 2h sword + + new Item(1321), //Bronze scimitar + + new Item(1323), //Iron scimitar + + new Item(1325), //Steel scimitar + + new Item(1327), //Black scimitar + + new Item(1329), //Mithril scimitar + + new Item(1331), //Adamant scimitar + + new Item(1333), //Rune scimitar + + new Item(1335), //Iron warhammer + + new Item(1337), //Bronze warhammer + + new Item(1339), //Steel warhammer + + new Item(1341), //Black warhammer + + new Item(1343), //Mithril warhammer + + new Item(1345), //Adamant warhammer + + new Item(1347), //Rune warhammer + + new Item(1349), //Iron axe + + new Item(1351), //Bronze axe + + new Item(1353), //Steel axe + + new Item(1355), //Mithril axe + + new Item(1357), //Adamant axe + + new Item(1359), //Rune axe + + new Item(1361), //Black axe + + new Item(1363), //Iron battleaxe + + new Item(1365), //Steel battleaxe + + new Item(1367), //Black battleaxe + + new Item(1369), //Mithril battleaxe + + new Item(1371), //Adamant battleaxe + + new Item(1373), //Rune battleaxe + + new Item(1375), //Bronze battleaxe + + new Item(1379), //Staff + + new Item(1381), //Staff of air + + new Item(1383), //Staff of water + + new Item(1385), //Staff of earth + + new Item(1387), //Staff of fire + + new Item(1389), //Magic staff + + new Item(1419), //Scythe + + new Item(1420), //Iron mace + + new Item(1422), //Bronze mace + + new Item(1424), //Steel mace + + new Item(1426), //Black mace + + new Item(1428), //Mithril mace + + new Item(1430), //Adamant mace + + new Item(1432), //Rune mace + + new Item(1478), //Amulet of accuracy + + new Item(1540), //Anti-dragon shield + + new Item(1589), //Picture + + new Item(1635), //Gold ring + + new Item(1637), //Sapphire ring + + new Item(1639), //Emerald ring + + new Item(1641), //Ruby ring + + new Item(1643), //Diamond ring + + new Item(1654), //Gold necklace + + new Item(1656), //Sapphire necklace + + new Item(1658), //Emerald necklace + + new Item(1660), //Ruby necklace + + new Item(1662), //Diamond necklace + + new Item(1692), //Gold amulet + + new Item(1694), //Sapphire amulet + + new Item(1696), //Emerald amulet + + new Item(1698), //Ruby amulet + + new Item(1700), //Diamond amulet + + new Item(1716), //Unblessed symbol + + new Item(1718), //Holy symbol + + new Item(1725), //Amulet of strength + + new Item(1727), //Amulet of magic + + new Item(1729), //Amulet of defence + + new Item(1731), //Amulet of power + + new Item(1757), //Brown apron + + new Item(1949), //Chef's hat + + new Item(2402), //Silverlight + + new Item(2420), //Picture + + new Item(2422), //Blue partyhat + + new Item(2425), //Picture + + new Item(2480), //Picture + + new Item(2512), //Picture + + new Item(2513), //Dragon chainbody + + new Item(2583), //Black platebody (t) + + new Item(2585), //Black platelegs (t) + + new Item(2587), //Black full helm(t) + + new Item(2589), //Black kiteshield (t) + + new Item(2591), //Black platebody (g) + + new Item(2593), //Black platelegs (g) + + new Item(2595), //Black full helm(g) + + new Item(2597), //Black kiteshield (g) + + new Item(2599), //Adam platebody (t) + + new Item(2601), //Adam platelegs (t) + + new Item(2603), //Adam kiteshield (t) + + new Item(2605), //Adam full helm(t) + + new Item(2607), //Adam platebody (g) + + new Item(2609), //Adam platelegs (g) + + new Item(2611), //Adam kiteshield (g) + + new Item(2613), //Adam full helm(g) + + new Item(2615), //Rune platebody (g) + + new Item(2617), //Rune platelegs (g) + + new Item(2619), //Rune full helm(g) + + new Item(2621), //Rune kiteshield (g) + + new Item(2623), //Rune platebody (t) + + new Item(2625), //Rune platelegs (t) + + new Item(2627), //Rune full helm (t) + + new Item(2629), //Rune kiteshield (t) + + new Item(2653), //Zamorak platebody + + new Item(2655), //Zamorak platelegs + + new Item(2657), //Zamorak full helm + + new Item(2659), //Zamorak kiteshield + + new Item(2661), //Saradomin platebody + + new Item(2663), //Saradomin platelegs + + new Item(2665), //Saradomin full helm + + new Item(2667), //Saradomin kiteshield + + new Item(2669), //Guthix platebody + + new Item(2671), //Guthix platelegs + + new Item(2673), //Guthix full helm + + new Item(2675), //Guthix kiteshield + + new Item(2902), //Gloves + + new Item(2912), //Gloves + + new Item(2922), //Gloves + + new Item(2932), //Gloves + + new Item(2942), //Gloves + + new Item(3057), //Mime mask + + new Item(3058), //Mime top + + new Item(3059), //Mime legs + + new Item(3060), //Mime gloves + + new Item(3061), //Mime boots + + new Item(3472), //Black plateskirt (t) + + new Item(3473), //Black plateskirt (g) + + new Item(3474), //Adam plateskirt (t) + + new Item(3475), //Adam plateskirt (g) + + new Item(3476), //Rune plateskirt (g) + + new Item(3477), //Rune plateskirt (t) + + new Item(3478), //Zamorak plateskirt + + new Item(3479), //Saradomin plateskirt + + new Item(3480), //Guthix plateskirt + + new Item(3667), //Picture + + new Item(4000), //Picture + + new Item(4076), //Picture + + new Item(4178), //Abyssal whip + + new Item(4180), //Dragon platelegs + + new Item(4315), //Team-1 cape + + new Item(4317), //Team-2 cape + + new Item(4319), //Team-3 cape + + new Item(4321), //Team-4 cape + + new Item(4323), //Team-5 cape + + new Item(4325), //Team-6 cape + + new Item(4327), //Team-7 cape + + new Item(4329), //Team-8 cape + + new Item(4331), //Team-9 cape + + new Item(4333), //Team-10 cape + + new Item(4335), //Team-11 cape + + new Item(4337), //Team-12 cape + + new Item(4339), //Team-13 cape + + new Item(4341), //Team-14 cape + + new Item(4343), //Team-15 cape + + new Item(4345), //Team-16 cape + + new Item(4347), //Team-17 cape + + new Item(4349), //Team-18 cape + + new Item(4351), //Team-19 cape + + new Item(4353), //Team-20 cape + + new Item(4355), //Team-21 cape + + new Item(4357), //Team-22 cape + + new Item(4359), //Team-23 cape + + new Item(4361), //Team-24 cape + + new Item(4363), //Team-25 cape + + new Item(4365), //Team-26 cape + + new Item(4367), //Team-27 cape + + new Item(4369), //Team-28 cape + + new Item(4371), //Team-29 cape + + new Item(4373), //Team-30 cape + + new Item(4375), //Team-31 cape + + new Item(4377), //Team-32 cape + + new Item(4379), //Team-33 cape + + new Item(4381), //Team-34 cape + + new Item(4383), //Team-35 cape + + new Item(4385), //Team-36 cape + + new Item(4387), //Team-37 cape + + new Item(4389), //Team-38 cape + + new Item(4391), //Team-39 cape + + new Item(4393), //Team-40 cape + + new Item(4395), //Team-41 cape + + new Item(4397), //Team-42 cape + + new Item(4399), //Team-43 cape + + new Item(4401), //Team-44 cape + + new Item(4403), //Team-45 cape + + new Item(4405), //Team-46 cape + + new Item(4407), //Team-47 cape + + new Item(4409), //Team-48 cape + + new Item(4411), //Team-49 cape + + new Item(4413), //Team-50 cape + + new Item(4565), //Basket of eggs + + new Item(4566), //Rubber chicken + + new Item(5525), //Tiara + + new Item(5527), //Air tiara + + new Item(5529), //Mind tiara + + new Item(5531), //Water tiara + + new Item(5533), //Body tiara + + new Item(5535), //Earth tiara + + new Item(5537), //Fire tiara + + new Item(6180), //Lederhosen top + + new Item(6181), //Lederhosen shorts + + new Item(6182), //Lederhosen hat + + new Item(6184), //Prince tunic + + new Item(6185), //Prince leggings + + new Item(6186), //Princess blouse + + new Item(6187), //Princess skirt + + new Item(6188), //Frog mask + + new Item(6201), //Picture + + new Item(6203), //Picture + + new Item(6205), //Picture + + new Item(6207), //Picture + + new Item(6208), //Man speak amulet + + new Item(6210), //Picture + + new Item(6381), //Picture + + new Item(6654), //Camo top + + new Item(6655), //Camo bottoms + + new Item(6656), //Camo helmet + + new Item(6659), //Camo helmet + + new Item(6856), //Bobble hat + + new Item(6857), //Bobble scarf + + new Item(6858), //Jester hat + + new Item(6859), //Jester scarf + + new Item(6860), //Tri-jester hat + + new Item(6861), //Tri-jester scarf + + new Item(6862), //Woolly hat + + new Item(6863), //Woolly scarf + + new Item(6864), //Marionette handle + + new Item(6967), //Dragon med helm + + new Item(7332), //Black shield(h1) + + new Item(7334), //Adamant shield(h1) + + new Item(7336), //Rune shield(h1) + + new Item(7338), //Black shield(h2) + + new Item(7340), //Adamant shield(h2) + + new Item(7342), //Rune shield(h2) + + new Item(7344), //Black shield(h3) + + new Item(7346), //Adamant shield(h3) + + new Item(7348), //Rune shield(h3) + + new Item(7350), //Black shield(h4) + + new Item(7352), //Adamant shield(h4) + + new Item(7354), //Rune shield(h4) + + new Item(7356), //Black shield(h5) + + new Item(7358), //Adamant shield(h5) + + new Item(7360), //Rune shield(h5) + + new Item(7362), //Studded body (g) + + new Item(7364), //Studded body (t) + + new Item(7366), //Studded chaps (g) + + new Item(7368), //Studded chaps (t) + + new Item(7370), //D'hide body(g) + + new Item(7372), //D'hide body (t) + + new Item(7378), //D'hide chaps (g) + + new Item(7380), //D'hide chaps (t) + + new Item(7386), //Blue skirt (g) + + new Item(7388), //Blue skirt (t) + + new Item(7390), //Wizard robe (g) + + new Item(7392), //Wizard robe (t) + + new Item(7394), //Wizard hat (g) + + new Item(7396), //Wizard hat (t) + + new Item(7414), //Paddle + + new Item(7592), //Zombie shirt + + new Item(7593), //Zombie trousers + + new Item(7594), //Zombie mask + + new Item(7595), //Zombie gloves + + new Item(7596), //Zombie boots + + new Item(7672), //Picture + + new Item(7674), //Perfect + + new Item(7803), //Yin yang amulet + + new Item(7927), //Easter ring + + new Item(9005), //Fancy boots + + new Item(9006), //Fighting boots + + new Item(9013), //Skull sceptre + + new Item(9054), //Red goblin mail + + new Item(9056), //Yellow goblin mail + + new Item(9057), //Green goblin mail + + new Item(9058), //Purple goblin mail + + new Item(9059), //Pink goblin mail + + new Item(9665), //Torch + + new Item(9702), //Stick + + new Item(9703), //Training sword + + new Item(9704), //Training shield + + new Item(9705), //Training bow + + new Item(9706), //Training arrows + + new Item(9906), //Ghost buster 500 + + new Item(9907), //Ghost buster 500 + + new Item(9908), //Ghost buster 500 + + new Item(9909), //Ghost buster 500 + + new Item(9910), //Ghost buster 500 + + new Item(9911), //Ghost buster 500 + + new Item(9920), //Jack lantern mask + + new Item(9921), //Skeleton boots + + new Item(9922), //Skeleton gloves + + new Item(9923), //Skeleton leggings + + new Item(9924), //Skeleton shirt + + new Item(9925), //Skeleton mask + + new Item(10280), //Willow comp bow + + new Item(10286), //Rune helm (h1) + + new Item(10288), //Rune helm (h2) + + new Item(10290), //Rune helm (h3) + + new Item(10292), //Rune helm (h4) + + new Item(10294), //Rune helm (h5) + + new Item(10296), //Adamant helm (h1) + + new Item(10298), //Adamant helm (h2) + + new Item(10300), //Adamant helm (h3) + + new Item(10302), //Adamant helm (h4) + + new Item(10304), //Adamant helm (h5) + + new Item(10306), //Black helm (h1) + + new Item(10308), //Black helm (h2) + + new Item(10310), //Black helm (h3) + + new Item(10312), //Black helm (h4) + + new Item(10314), //Black helm (h5) + + new Item(10364), //Strength amulet(t) + + new Item(10366), //Amulet of magic(t) + + new Item(10501), //Snowball + + new Item(10507), //Reindeer hat + + new Item(10567), //Picture + + new Item(10569), //Picture + + new Item(10571), //Picture + + new Item(10573), //Picture + + new Item(10575), //Picture + + new Item(10577), //Picture + + new Item(10579), //Picture + + new Item(10629), //Mime mask + + new Item(10630), //Princess blouse + + new Item(10631), //Zombie shirt + + new Item(10632), //Camo top + + new Item(10633), //Lederhosen top + + new Item(10634), //Shade robe + + new Item(10665), //Black shield(h1) + + new Item(10666), //Adamant shield(h1) + + new Item(10667), //Rune shield(h1) + + new Item(10668), //Black shield(h2) + + new Item(10669), //Adamant shield(h2) + + new Item(10670), //Rune shield(h2) + + new Item(10671), //Black shield(h3) + + new Item(10672), //Adamant shield(h3) + + new Item(10673), //Rune shield(h3) + + new Item(10674), //Black shield(h4) + + new Item(10675), //Adamant shield(h4) + + new Item(10676), //Rune shield(h4) + + new Item(10677), //Black shield(h5) + + new Item(10678), //Adamant shield(h5) + + new Item(10679), //Rune shield(h5) + + new Item(10680), //Studded body (g) + + new Item(10681), //Studded body (t) + + new Item(10682), //D'hide body(g) + + new Item(10683), //D'hide body (t) + + new Item(10686), //Wizard robe (g) + + new Item(10687), //Wizard robe (t) + + new Item(10690), //Black platebody (t) + + new Item(10691), //Black platebody (g) + + new Item(10697), //Adam platebody (t) + + new Item(10698), //Adam platebody (g) + + new Item(10699), //Black helm (h1) + + new Item(10700), //Black helm (h2) + + new Item(10701), //Black helm (h3) + + new Item(10702), //Black helm (h4) + + new Item(10703), //Black helm (h5) + + new Item(10704), //Rune helm (h1) + + new Item(10705), //Rune helm (h2) + + new Item(10706), //Rune helm (h3) + + new Item(10707), //Rune helm (h4) + + new Item(10708), //Rune helm (h5) + + new Item(10709), //Adamant helm (h1) + + new Item(10710), //Adamant helm (h2) + + new Item(10711), //Adamant helm (h3) + + new Item(10712), //Adamant helm (h4) + + new Item(10713), //Adamant helm (h5) + + new Item(10736), //Strength amulet(t) + + new Item(10738), //Amulet of magic(t) + + new Item(10776), //Zamorak platebody + + new Item(10778), //Saradomin plate + + new Item(10780), //Guthix platebody + + new Item(10798), //Rune platebody (g) + + new Item(10800), //Rune platebody (t) + + new Item(11019), //Chicken feet + + new Item(11020), //Chicken wings + + new Item(11021), //Chicken head + + new Item(11022), //Chicken legs + + new Item(11165), //Phoenix crossbow + + new Item(11167), //Phoenix crossbow + + new Item(11789), //Grim reaper hood + + new Item(11790), //Grim reaper hood + + new Item(11951), //Snowball + + new Item(12629), //Safety gloves + + new Item(12634), //Chocatrice cape + + new Item(12645), //Chocatrice cape + + new Item(12844), //Toy kite + + new Item(12845), //Stone of power + + new Item(12846), //Stone of power + + new Item(12847), //Stone of power + + new Item(12848), //Stone of power + + new Item(12849), //Stone of power + + new Item(12860), //Swordfish gloves + + new Item(12863), //Air runecrafting gloves + + new Item(12864), //Water runecrafting gloves + + new Item(12865), //Earth runecrafting gloves + + new Item(12887), //Druidic mage hood 100 + + new Item(12888), //Druidic mage hood 80 + + new Item(12889), //Druidic mage hood 60 + + new Item(12890), //Druidic mage hood 40 + + new Item(12891), //Druidic mage hood 20 + + new Item(12892), //Druidic mage hood 0 + + new Item(12894), //Druidic mage top 100 + + new Item(12895), //Druidic mage top 80 + + new Item(12896), //Druidic mage top 60 + + new Item(12897), //Druidic mage top 40 + + new Item(12898), //Druidic mage top 20 + + new Item(12899), //Druidic mage top 0 + + new Item(12901), //Druidic mage bottom 100 + + new Item(12902), //Druidic mage bottom 80 + + new Item(12903), //Druidic mage bottom 60 + + new Item(12904), //Druidic mage bottom 40 + + new Item(12905), //Druidic mage bottom 20 + + new Item(12906), //Druidic mage bottom 0 + + new Item(12908), //Adamant spikeshield 100 + + new Item(12909), //Adamant spikeshield 80 + + new Item(12910), //Adamant spikeshield 60 + + new Item(12911), //Adamant spikeshield 40 + + new Item(12912), //Adamant spikeshield 20 + + new Item(12913), //Adamant spikeshield 0 + + new Item(12915), //Adamant berserker shield 100 + + new Item(12916), //Adamant berserker shield 80 + + new Item(12917), //Adamant berserker shield 60 + + new Item(12918), //Adamant berserker shield 40 + + new Item(12919), //Adamant berserker shield 20 + + new Item(12920), //Adamant berserker shield 0 + + new Item(12922), //Rune spikeshield 100 + + new Item(12923), //Rune spikeshield 80 + + new Item(12924), //Rune spikeshield 60 + + new Item(12925), //Rune spikeshield 40 + + new Item(12926), //Rune spikeshield 20 + + new Item(12927), //Rune spikeshield 0 + + new Item(12929), //Rune berserker shield 100 + + new Item(12930), //Rune berserker shield 80 + + new Item(12931), //Rune berserker shield 60 + + new Item(12932), //Rune berserker shield 40 + + new Item(12933), //Rune berserker shield 20 + + new Item(12934), //Rune berserker shield 0 + + new Item(12936), //Green d'hide coif 100 + + new Item(12937), //Green d'hide coif 80 + + new Item(12938), //Green d'hide coif 60 + + new Item(12939), //Green d'hide coif 40 + + new Item(12940), //Green d'hide coif 20 + + new Item(12941), //Green d'hide coif 0 + + new Item(12964), //Combat hood 100 + + new Item(12965), //Combat hood 80 + + new Item(12966), //Combat hood 60 + + new Item(12967), //Combat hood 40 + + new Item(12968), //Combat hood 20 + + new Item(12969), //Combat hood 0 + + new Item(12971), //Combat robe top 100 + + new Item(12972), //Combat robe top 80 + + new Item(12973), //Combat robe top 60 + + new Item(12974), //Combat robe top 40 + + new Item(12975), //Combat robe top 20 + + new Item(12976), //Combat robe top 0 + + new Item(12978), //Combat robe bottom 100 + + new Item(12979), //Combat robe bottom 80 + + new Item(12980), //Combat robe bottom 60 + + new Item(12981), //Combat robe bottom 40 + + new Item(12982), //Combat robe bottom 20 + + new Item(12983), //Combat robe bottom 0 + + new Item(12985), //Bronze gauntlets + + new Item(12986), //Worn-out bronze gauntlets + + new Item(12988), //Iron gauntlets + + new Item(12989), //Worn-out iron gauntlets + + new Item(12991), //Steel gauntlets + + new Item(12992), //Worn-out steel gauntlets + + new Item(12994), //Black gauntlets + + new Item(12995), //Worn-out black gauntlets + + new Item(12997), //Mithril gauntlets + + new Item(12998), //Worn-out mithril gauntlets + + new Item(13000), //Adamant gauntlets + + new Item(13001), //Worn-out adamant gauntlets + + new Item(13003), //Rune gauntlets + + new Item(13004), //Worn-out rune gauntlets + + new Item(13469), //Rune axe + + new Item(13471), //Rune battleaxe + + new Item(13473), //Rune warhammer + + new Item(13474), //Rune longsword + + new Item(13476), //Rune scimitar + + new Item(13480), //Rune pickaxe + + new Item(13482), //Rune platebody + + new Item(13483), //Green d'hide body + + new Item(13487), //Rune platelegs + + new Item(13489), //Rune plateskirt + + new Item(13491), //Green d'hide chaps + + new Item(13496), //Rune full helm + + new Item(13497), //Green d'hide vamb + + new Item(13507), //Rune kiteshield + + new Item(13523), //Maple longbow + + new Item(13524), //Maple shortbow + + new Item(13531), //Red partyhat + + new Item(13532), //Yellow partyhat + + new Item(13533), //Blue partyhat + + new Item(13534), //Green partyhat + + new Item(13535), //Purple partyhat + + new Item(13536), //White partyhat + + new Item(13537), //Santa hat + + new Item(13538), //Green h'ween mask + + new Item(13539), //Blue h'ween mask + + new Item(13540), //Red h'ween mask + + new Item(13541), //Willow comp bow + + new Item(13560), //Explorer's ring 1 + + new Item(13561), //Explorer's ring 2 + + new Item(13562), //Explorer's ring 3 + + new Item(13613), //Runecrafter hat + + new Item(13614), //Runecrafter robe + + new Item(13615), //Runecrafter hat + + new Item(13616), //Runecrafter hat + + new Item(13617), //Runecrafter skirt + + new Item(13618), //Runecrafter gloves + + new Item(13619), //Runecrafter robe + + new Item(13620), //Runecrafter hat + + new Item(13621), //Runecrafter hat + + new Item(13622), //Runecrafter skirt + + new Item(13623), //Runecrafter gloves + + new Item(13624), //Runecrafter robe + + new Item(13625), //Runecrafter hat + + new Item(13626), //Runecrafter hat + + new Item(13627), //Runecrafter skirt + + new Item(13628), //Runecrafter gloves + + new Item(13630), //Air talisman staff + + new Item(13631), //Mind talisman staff + + new Item(13632), //Water talisman staff + + new Item(13633), //Earth talisman staff + + new Item(13634), //Fire talisman staff + + new Item(13635), //Body talisman staff + + new Item(13643), //Yellow attractor + + new Item(13644), //Yellow repeller + + new Item(13645), //Green attractor + + new Item(13646), //Green repeller + + new Item(13657), //Runecrafter hat + + new Item(13658), //Runecrafter hat + + new Item(13765), //Rune dagger + + new Item(13777), //Rune sword + + new Item(13778), //Rune 2h sword + + new Item(13780), //Rune mace + + new Item(13781), //Rune chainbody + + new Item(13783), //Rune med helm + + new Item(13787), //Rune sq shield + + new Item(13800), //Rune platebody (g) + + new Item(13801), //Rune platelegs (g) + + new Item(13802), //Rune plateskirt (g) + + new Item(13803), //Rune full helm(g) + + new Item(13804), //Rune kiteshield (g) + + new Item(13805), //Rune platebody (t) + + new Item(13806), //Rune platelegs (t) + + new Item(13807), //Rune plateskirt (t) + + new Item(13808), //Rune full helm (t) + + new Item(13809), //Rune kiteshield (t) + + new Item(13820), //Zamorak platebody + + new Item(13821), //Zamorak platelegs + + new Item(13822), //Zamorak plateskirt + + new Item(13823), //Zamorak full helm + + new Item(13824), //Zamorak kiteshield + + new Item(13825), //Saradomin platebody + + new Item(13826), //Saradomin platelegs + + new Item(13827), //Saradomin plateskirt + + new Item(13828), //Saradomin full helm + + new Item(13829), //Saradomin kiteshield + + new Item(13830), //Guthix platebody + + new Item(13831), //Guthix platelegs + + new Item(13832), //Guthix plateskirt + + new Item(13833), //Guthix full helm + + new Item(13834), //Guthix kiteshield + + new Item(13958), //Corrupt dragon chainbody + + new Item(13960), //Corrupt dragon chainbody (deg) + + new Item(13961), //Corrupt dragon med helm + + new Item(13963), //Corrupt dragon med helm (deg) + + new Item(13964), //Corrupt dragon sq shield + + new Item(13966), //Corrupt dragon sq shield (deg) + + new Item(13967), //Corrupt dragon plateskirt + + new Item(13969), //Corrupt dragon plateskirt (deg) + + new Item(13970), //Corrupt dragon platelegs + + new Item(13972), //Corrupt dragon platelegs (deg) + + new Item(13973), //Corrupt dragon battleaxe + + new Item(13975), //C. dragon battleaxe (deg) + + new Item(13976), //Corrupt dragon dagger + + new Item(13978), //C. dragon dagger (deg) + + new Item(13979), //Corrupt dragon scimitar + + new Item(13981), //C. dragon scimitar (deg) + + new Item(13982), //Corrupt dragon longsword + + new Item(13984), //C. dragon longsword (deg) + + new Item(13985), //Corrupt dragon mace + + new Item(13987), //Corrupt dragon mace (deg) + + new Item(13988), //Corrupt dragon spear + + new Item(13990), //Corrupt dragon spear (deg) + + new Item(14057), //Broomstick + + new Item(14076), //Warlock top + + new Item(14077), //Warlock legs + + new Item(14078), //Witch top + + new Item(14079), //Witch skirt + + new Item(14080), //Witch cloak + + new Item(14081), //Warlock cloak + + new Item(14086), //Witch top + + new Item(14087), //Witch skirt + + new Item(14088), //Witch cloak + + new Item(14595), //Santa costume top + + new Item(14596), //Ice amulet + + new Item(14599), //Ice amulet + + new Item(14600), //Santa costume top + + new Item(14601), //Santa costume top + + new Item(14602), //Santa costume gloves + + new Item(14603), //Santa costume legs + + new Item(14604), //Santa costume legs + + new Item(14605), //Santa costume boots + + new Item(14812), //Black partyhat + + new Item(14819), //Rainbow partyhat + + new Item(14873), //Black santa hat + + new Item(14874)//Inverted santa hat + )); +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/AIPControlDialogue.java b/Server/src/main/java/Server/plugin/ai/AIPControlDialogue.java new file mode 100644 index 000000000..492470dce --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/AIPControlDialogue.java @@ -0,0 +1,107 @@ +package plugin.ai; + +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.Rights; + +/** + * Handles artificial intelligent player controls. + * @author Emperor + */ +public final class AIPControlDialogue extends DialoguePlugin { + + /** + * The AIP to control. + */ + private AIPlayer aip; + + /** + * Constructs a new {@code AIPControlDialogue} {@code Object}. + */ + public AIPControlDialogue() { + /* + * empty. + */ + } + + /** + * Constructs a new {@code AIPControlDialogue} {@code Object}. + * @param player The player. + */ + public AIPControlDialogue(Player player) { + super(player); + } + + @Override + public DialoguePlugin newInstance(Player player) { + return new AIPControlDialogue(player); + } + + @Override + public boolean open(Object... args) { + if (player.getDetails().getRights() != Rights.ADMINISTRATOR) { + return false; + } + aip = (AIPlayer) args[0]; + String select = "Select"; + if (player.getAttribute("aip_select") == aip) { + select = "Deselect"; + } + interpreter.sendOptions("AIP#" + aip.getUid() + " controls", select, "Settings", "Follow", "Stand-by", "Clear"); + return true; + } + + @Override + public boolean handle(int interfaceId, int buttonId) { + switch (interfaceId) { + case 234: + switch (buttonId) { + case 1: + if (player.getAttribute("aip_select") == aip) { + player.removeAttribute("aip_select"); + break; + } + player.setAttribute("aip_select", aip); + break; + case 2: + interpreter.sendOptions("AIP#" + aip.getUid() + " settings", "Toggle run", "Toggle retaliate", "Toggle special attack"); + return true; + case 3: + aip.follow(player); + player.removeAttribute("aip_select"); + break; + case 4: + aip.getPulseManager().clear(); + player.removeAttribute("aip_select"); + break; + case 5: + AIPlayer.deregister(aip.getUid()); + player.removeAttribute("aip_select"); + break; + } + close(); + return true; + case 230: + switch (buttonId) { + case 1: + aip.getSettings().toggleRun(); + break; + case 2: + aip.getSettings().toggleRetaliating(); + break; + case 3: + aip.getSettings().toggleSpecialBar(); + break; + } + close(); + return true; + } + return false; + } + + @Override + public int[] getIds() { + return new int[0]; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/AIPlayer.java b/Server/src/main/java/Server/plugin/ai/AIPlayer.java new file mode 100644 index 000000000..439b40a20 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/AIPlayer.java @@ -0,0 +1,615 @@ +package plugin.ai; + +import core.ServerConstants; +import core.game.container.impl.EquipmentContainer; +import core.game.interaction.DestinationFlag; +import core.game.interaction.MovementPulse; +import core.game.interaction.Option; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import core.game.node.entity.player.info.PlayerDetails; +import core.game.node.entity.player.link.appearance.Gender; +import core.game.node.item.Item; +import core.game.system.SystemLogger; +import core.game.world.map.Direction; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.game.world.map.path.Pathfinder; +import core.game.world.map.zone.impl.WildernessZone; +import core.game.world.repository.Repository; +import core.net.packet.context.MessageContext; +import core.net.packet.in.InteractionPacket; +import core.plugin.Plugin; +import core.tools.RandomFunction; +import core.tools.StringUtils; +import core.game.content.dialogue.DialoguePlugin; +import core.game.node.entity.skill.Skills; +import core.game.content.quest.tutorials.tutorialisland.CharacterDesign; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.*; + +/** + * Represents an Artificial Intelligent Player. + * + * @author Emperor + */ +public class AIPlayer extends Player { + + /** + * The current UID. + */ + private static int currentUID = 0x1; + + private static List botNames = new ArrayList(); + + private static List usedNames = new ArrayList(); + + /** + * The active Artificial intelligent players mapping. + */ + private static final Map botMapping = new HashMap<>(); + + /** + * The aip control dialogue. + */ + private static final AIPControlDialogue CONTROL_DIAL = new AIPControlDialogue(); + + /** + * A line of data from namesandarmor.txt that will be used to generate the appearance + * Data in format: + * //name:cblevel:helmet:cape:neck:weapon:chest:shield:unknown:legs:unknown:gloves:boots: + */ + private static String OSRScopyLine; + + /** + * The AIP's UID. + */ + private final int uid; + + /** + * The start location of the AIP. + */ + private final Location startLocation; + + /** + * The username. + */ + private String username; + + /** + * The player controlling this AIP. + */ + private Player controler; + + + /** + * Constructs a new {@code AIPlayer} {@code Object}. + * + * @param l The location. + */ + static { + loadNames("botnames.txt"); + } + + public AIPlayer(Location l) { + this(getRandomName(), l, null); + } + + public AIPlayer(String fileName, Location l) { + this(retrieveRandomName(fileName), l, null); + } + + @SuppressWarnings("deprecation") + private AIPlayer(String name, Location l, String ignored) { + super(new PlayerDetails("/aip" + (currentUID + 1) + ":" + name)); + super.setLocation(startLocation = l); + super.artificial = true; + super.getDetails().setSession(ArtificialSession.getSingleton()); + Repository.getPlayers().add(this); + this.username = StringUtils.formatDisplayName(name + (currentUID + 1)); + this.uid = currentUID++; + this.updateRandomValues(); + this.init(); + } + + /** + * Generates bot stats/equipment/etc based on OSRScopyLine + */ + public void updateRandomValues() { + this.getAppearance().setGender(RandomFunction.random(5) == 1 ? Gender.FEMALE : Gender.MALE); + int setTo = RandomFunction.random(0,10); + CharacterDesign.randomize(this,true); + this.setDirection(Direction.values()[new Random().nextInt(Direction.values().length)]); //Random facing dir + this.getSkills().updateCombatLevel(); + this.getAppearance().sync(); + } + + @Override + public void update() { + return; + } + + private void setLevels() { + //Create realistic player stats + int maxLevel = RandomFunction.random(1, Math.min(parseOSRS(1), 99)); + for (int i = 0; i < Skills.NUM_SKILLS; i++) { + this.getSkills().setStaticLevel(i, RandomFunction.linearDecreaseRand(maxLevel)); + } + int combatLevelsLeft = parseOSRS(1); + int hitpoints = Math.max(RandomFunction.random(10, Math.min(maxLevel, combatLevelsLeft * 4)), 10); + combatLevelsLeft -= 0.25 * hitpoints; + int prayer = combatLevelsLeft > 0 ? RandomFunction.random(Math.min(maxLevel, combatLevelsLeft * 8)) : 1; + combatLevelsLeft -= 0.125 * prayer; + int defence = combatLevelsLeft > 0 ? RandomFunction.random(Math.min(maxLevel, combatLevelsLeft * 4)) : 1; + combatLevelsLeft -= 0.25 * defence; + + combatLevelsLeft = Math.min(combatLevelsLeft, 199); + + int attack = combatLevelsLeft > 0 ? RandomFunction.normalRandDist(Math.min(maxLevel, combatLevelsLeft * 3)) : 1; + int strength = combatLevelsLeft > 0 ? combatLevelsLeft * 3 - attack : 1; + + this.getSkills().setStaticLevel(Skills.HITPOINTS, hitpoints); + this.getSkills().setStaticLevel(Skills.PRAYER, prayer); + this.getSkills().setStaticLevel(Skills.DEFENCE, defence); + this.getSkills().setStaticLevel(Skills.ATTACK, attack); + this.getSkills().setStaticLevel(Skills.STRENGTH, strength); + this.getSkills().setStaticLevel(Skills.RANGE, combatLevelsLeft / 2); + this.getSkills().setStaticLevel(Skills.MAGIC, combatLevelsLeft / 2); + } + + private void giveArmor() { + //name:cblevel:helmet2:cape3:neck4:weapon5:chest6:shield7:unknown8:legs9:unknown10:gloves11:boots12: + //sicriona:103:1163: 1023: 1725 :1333: 1127 :1201 :0: 1079 :0: 2922: 1061:0: + equipIfExists(new Item(parseOSRS(2)), EquipmentContainer.SLOT_HAT); + equipIfExists(new Item(parseOSRS(3)), EquipmentContainer.SLOT_CAPE); + equipIfExists(new Item(parseOSRS(4)), EquipmentContainer.SLOT_AMULET); + equipIfExists(new Item(parseOSRS(5)), EquipmentContainer.SLOT_WEAPON); + equipIfExists(new Item(parseOSRS(6)), EquipmentContainer.SLOT_CHEST); + equipIfExists(new Item(parseOSRS(7)), EquipmentContainer.SLOT_SHIELD); + equipIfExists(new Item(parseOSRS(9)), EquipmentContainer.SLOT_LEGS); + equipIfExists(new Item(parseOSRS(11)), EquipmentContainer.SLOT_HANDS); + equipIfExists(new Item(parseOSRS(12)), EquipmentContainer.SLOT_FEET); + } + + private int parseOSRS(int index) { + return Integer.parseInt(OSRScopyLine.split(":")[index]); + } + + private void equipIfExists(Item e, int slot) { + if (e == null || e.getName().equalsIgnoreCase("null")) { + return; + } + if (e.getId() != 0) + getEquipment().replace(e, slot); + + } + + /** + * Load a list of bot names into memory + */ + public static void loadNames(String fileName){ + try { + Scanner sc = new Scanner(new File(ServerConstants.BOT_DATA_PATH + fileName)); + while(sc.hasNextLine()){ + botNames.add(sc.next()); + } + } catch (Exception e){ + e.printStackTrace(); + } + } + + public static String getRandomName(){ + int index = (RandomFunction.random(botNames.size())); + String name = botNames.get(index); + while(usedNames.contains(name)){ + index = (RandomFunction.random(botNames.size())); + name = botNames.get(index); + } + usedNames.add(name); + return name; + } + + /** + * Get a bot content + */ + public static void updateRandomOSRScopyLine(String fileName) { + Random rand = new Random(); + int n = 0; + try { + for (Scanner sc = new Scanner(new File(ServerConstants.BOT_DATA_PATH + fileName)); sc.hasNext(); ) { + ++n; + String line = sc.nextLine(); + if (rand.nextInt(n) == 0) { //Chance of overwriting line is lower and lower + if (line.length() < 3 || line.startsWith("#")) //probably an empty line + { + continue; + } + OSRScopyLine = line; + } + } + } catch (FileNotFoundException e) { + System.out.println("Missing " + fileName); + e.printStackTrace(); + } + } + + private static String retrieveRandomName(String fileName) { + do { + updateRandomOSRScopyLine(fileName); + } while (OSRScopyLine.startsWith("#") || OSRScopyLine.contains("_") || OSRScopyLine.contains(" ")); //Comment + return OSRScopyLine.split(":")[0]; + } + + private static String retrieveRandomName() { + return retrieveRandomName("namesandarmor.txt"); + } + + @Override + public void init() { + getProperties().setSpawnLocation(startLocation); + getInterfaceManager().openDefaultTabs(); + getSession().setObject(this); + botMapping.put(uid, this); + super.init(); + getSettings().setRunToggled(true); + CharacterDesign.randomize(this, false); + getInteraction().set(new Option("Control", 7).setHandler(new OptionHandler() { + @Override + public Plugin newInstance(Object arg) throws Throwable { + return null; + } + + @Override + public boolean handle(Player p, Node node, String option) { + DialoguePlugin dial = CONTROL_DIAL.newInstance(p); + if (dial != null && dial.open(AIPlayer.this)) { + p.getDialogueInterpreter().setDialogue(dial); + } + return true; + } + + @Override + public boolean isWalk() { + return false; + } + + })); + getPlayerFlags().setLastSceneGraph(location); + } + + /** + * Handles the following. + * + * @param e The entity to follow. + */ + public void follow(final Entity e) { + getPulseManager().run(new MovementPulse(this, e, DestinationFlag.FOLLOW_ENTITY) { + @Override + public boolean pulse() { + face(e); + return false; + } + }, "movement"); + } + + public void randomWalkAroundPoint(Location point, int radius) { + Pathfinder.find(this, point.transform(RandomFunction.random(radius, (radius * -1)), RandomFunction.random(radius, (radius * -1)), 0), true, Pathfinder.SMART).walk(this); + } + + public void randomWalk(int radiusX, int radiusY) { + Pathfinder.find(this, this.getLocation().transform(RandomFunction.random(radiusX, (radiusX * -1)), RandomFunction.random(radiusY, (radiusY * -1)), 0), false, Pathfinder.SMART).walk(this); + } + + public void walkToPosSmart(int x, int y) { + walkToPosSmart(new Location(x, y)); + } + + public void walkToPosSmart(Location loc) { + Pathfinder.find(this, loc, true, Pathfinder.SMART).walk(this); + } + + public void walkPos(int x, int y) { + Pathfinder.find(this, new Location(x, y)); + } + + public boolean checkVictimIsPlayer() { + if (this.getProperties().getCombatPulse().getVictim() != null) + if (this.getProperties().getCombatPulse().getVictim().isPlayer()) + return true; + return false; + } + + @Override + public void tick() { + super.tick(); + if(getSkullManager().isWilderness()) { + getSkullManager().setLevel(WildernessZone.getWilderness(this)); + } + if(getSkills().getLifepoints() <= 0){ + //deregister(this.uid); + + } + } + + public Item getItemById(int id) { + for (int i = 0; i < 28; i++) { + Item item = this.getInventory().get(i); + if (item != null) { + if (item.getId() == id) + return item; + } + } + return null; + } + + public void handleIncomingChat(MessageContext ctx){ + } + + + private ArrayList getNodeInRange(int range, int entry) { + int meX = this.getLocation().getX(); + int meY = this.getLocation().getY(); + ArrayList nodes = new ArrayList(); + for (NPC npc : RegionManager.getLocalNpcs(this, range)) { + if (npc.getId() == entry) + nodes.add(npc); + } + for (int x = 0; x < range; x++) { + for (int y = 0; y < range - x; y++) { + Node node = RegionManager.getObject(0, meX + x, meY + y); + if (node != null) + if (node.getId() == entry) + nodes.add(node); + Node node2 = RegionManager.getObject(0, meX + x, meY - y); + if (node2 != null) + if (node2.getId() == entry) + nodes.add(node2); + Node node3 = RegionManager.getObject(0, meX - x, meY + y); + if (node3 != null) + if (node3.getId() == entry) + nodes.add(node3); + Node node4 = RegionManager.getObject(0, meX - x, meY - y); + if (node4 != null) + if (node4.getId() == entry) + nodes.add(node4); + } + } + return nodes; + } + + private ArrayList getNodeInRange(int range, List entrys) { + int meX = this.getLocation().getX(); + int meY = this.getLocation().getY(); + //int meX2 = this.getLocation().getX(); + //System.out.println("local " + meX + " real x? " + meX2 ); + ArrayList nodes = new ArrayList(); + for (NPC npc : RegionManager.getLocalNpcs(this, range)) { + if (entrys.contains(npc.getId())) + nodes.add(npc); + } + for (int x = 0; x < range; x++) { + for (int y = 0; y < range - x; y++) { + Node node = RegionManager.getObject(0, meX + x, meY + y); + if (node != null) + if (entrys.contains(node.getId())) + nodes.add(node); + Node node2 = RegionManager.getObject(0, meX + x, meY - y); + if (node2 != null) + if (entrys.contains(node2.getId())) + nodes.add(node2); + Node node3 = RegionManager.getObject(0, meX - x, meY + y); + if (node3 != null) + if (entrys.contains(node3.getId())) + nodes.add(node3); + Node node4 = RegionManager.getObject(0, meX - x, meY - y); + if (node4 != null) + if (entrys.contains(node4.getId())) + nodes.add(node4); + } + } + return nodes; + } + + public Node getClosestNodeWithEntryAndDirection(int range, int entry, Direction direction) { + ArrayList nodeList = getNodeInRange(range, entry); + if (nodeList.isEmpty()) { + //System.out.println("nodelist empty"); + return null; + } + Node node = getClosestNodeinNodeListWithDirection(nodeList, direction); + return node; + } + + public Node getClosestNodeWithEntry(int range, int entry) { + ArrayList nodeList = getNodeInRange(range, entry); + if (nodeList.isEmpty()) { + //System.out.println("nodelist empty"); + return null; + } + Node node = getClosestNodeinNodeList(nodeList); + return node; + } + + public Node getClosestNodeWithEntry(int range, List entrys) { + ArrayList nodeList = getNodeInRange(range, entrys); + if (nodeList.isEmpty()) { + //System.out.println("nodelist empty"); + return null; + } + Node node = getClosestNodeinNodeList(nodeList); + return node; + } + + public Node getClosesCreature(int radius) { + int distance = radius + 1; + Node npcReturn = null; + for (NPC npc : RegionManager.getLocalNpcs(this, radius)) { + double distanceToNpc = npc.getLocation().getDistance(this.getLocation()); + if ((distanceToNpc) < distance) { + distance = (int) distanceToNpc; + npcReturn = npc; + } + } + return npcReturn; + } + + public Node getClosesCreature(int radius, int entry) { + int distance = radius + 1; + Node npcReturn = null; + for (NPC npc : RegionManager.getLocalNpcs(this, radius)) { + double distanceToNpc = npc.getLocation().getDistance(this.getLocation()); + if (npc.getId() == entry) { + if ((distanceToNpc) < distance) { + distance = (int) distanceToNpc; + npcReturn = npc; + } + } + } + return npcReturn; + } + + public Node getClosesCreature(int radius, ArrayList entrys) { + int distance = radius + 1; + Node npcReturn = null; + for (NPC npc : RegionManager.getLocalNpcs(this, radius)) { + double distanceToNpc = npc.getLocation().getDistance(this.getLocation()); + if (entrys.contains(npc.getId())) { + if ((distanceToNpc) < distance) { + distance = (int) distanceToNpc; + npcReturn = npc; + } + } + } + return npcReturn; + } + + private Node getClosestNodeinNodeListWithDirection(ArrayList nodes, Direction direction) { + if (nodes.isEmpty()) { + //System.out.println("nodelist empty"); + return null; + } + + double distance = 0; + Node nodeReturn = null; + for (Node node : nodes) { + double nodeDistance = this.getLocation().getDistance(node.getLocation()); + if ((nodeReturn == null || nodeDistance < distance) && node.getDirection() == direction) { + distance = nodeDistance; + nodeReturn = node; + } + } + return nodeReturn; + } + + private Node getClosestNodeinNodeList(ArrayList nodes) { + if (nodes.isEmpty()) { + //System.out.println("nodelist empty"); + return null; + } + + double distance = 0; + Node nodeReturn = null; + for (Node node : nodes) { + double nodeDistance = this.getLocation().getDistance(node.getLocation()); + if (nodeReturn == null || nodeDistance < distance) { + distance = nodeDistance; + nodeReturn = node; + } + } + return nodeReturn; + } + + @Override + public void clear() { + botMapping.remove(uid); + super.clear(true); + } + + @Override + public void reset() { + if (getPlayerFlags().isUpdateSceneGraph()) { + getPlayerFlags().setLastSceneGraph(getLocation()); + } + super.reset(); + } + + @Override + public void finalizeDeath(Entity killer) { + super.finalizeDeath(killer); + fullRestore(); + } + + /** + * Gets the UID. + * + * @return the UID. + */ + public int getUid() { + return uid; + } + + /** + * Deregisters an AIP. + * + * @param uid The player's UID. + */ + public static void deregister(int uid) { + AIPlayer player = botMapping.get(uid); + if (player != null) { + player.clear(); + Repository.getPlayers().remove(player); + return; + } + //SystemLogger.logErr("Could not deregister AIP#" + uid + ": UID not added to the mapping!"); + } + + @Override + public String getUsername() { + return username; + } + + /** + * Gets the AIP for the given UID. + * + * @param uid The UID. + * @return The AIPlayer. + */ + public static AIPlayer get(int uid) { + return botMapping.get(uid); + } + + /** + * @return the startLocation. + */ + public Location getStartLocation() { + return startLocation; + } + + /** + * Gets the controler. + * + * @return The controler. + */ + public Player getControler() { + return controler; + } + + /** + * Sets the controler. + * + * @param controler The controler to set. + */ + public void setControler(Player controler) { + this.controler = controler; + } + + + public void interact(Node n) { + InteractionPacket.handleObjectInteraction(this, 0, n.getLocation(), n.getId()); + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/AIRepository.kt b/Server/src/main/java/Server/plugin/ai/AIRepository.kt new file mode 100644 index 000000000..458e2d770 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/AIRepository.kt @@ -0,0 +1,46 @@ +package plugin.ai + +import core.game.node.entity.player.Player +import core.game.node.item.GroundItem +import plugin.ai.general.GeneralBotCreator +import core.game.ge.GrandExchangeOffer + +/** + * A repository for bots to make use of that can contain any info that might be useful to them. + * @author Ceikry + */ +class AIRepository { + companion object { + val groundItems = HashMap>() + val GEOffers = HashMap() + + @JvmStatic + val PulseRepository = ArrayList() + + @JvmStatic + fun addItem(item: GroundItem){ + if(groundItems[item.dropper] == null){ + val list = ArrayList() + list.add(item) + groundItems[item.dropper] = list + return + } + groundItems[item.dropper]!!.add(item) + } + + @JvmStatic + fun getItems(player: Player): ArrayList?{ + return groundItems[player] + } + + @JvmStatic + fun addOffer(player: Player, offer: GrandExchangeOffer){ + GEOffers[player] = offer + } + + @JvmStatic + fun getOffer(player: Player): GrandExchangeOffer? { + return GEOffers[player] + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/ArtificialSession.java b/Server/src/main/java/Server/plugin/ai/ArtificialSession.java new file mode 100644 index 000000000..df5d73f62 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/ArtificialSession.java @@ -0,0 +1,53 @@ +package plugin.ai; + +import java.nio.ByteBuffer; + +import core.net.IoSession; + +/** + * Represents an artificial networking session. + * @author Emperor + */ +public final class ArtificialSession extends IoSession { + + /** + * The artificial session singleton. + */ + private static final ArtificialSession SINGLETON = new ArtificialSession(); + + /** + * Constructs a new {@code ArtificialSession} {@code Object}. + */ + private ArtificialSession() { + super(null, null); + } + + @Override + public String getRemoteAddress() { + return "127.0.0.1"; + } + + @Override + public void write(Object context, boolean instant) { + + } + + @Override + public void queue(ByteBuffer buffer) { + } + + @Override + public void write() { + } + + @Override + public void disconnect() { + } + + /** + * @return the singleton. + */ + public static ArtificialSession getSingleton() { + return SINGLETON; + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/GeneralBotCreator.kt b/Server/src/main/java/Server/plugin/ai/general/GeneralBotCreator.kt new file mode 100644 index 000000000..e54c6626a --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/GeneralBotCreator.kt @@ -0,0 +1,82 @@ +package plugin.ai.general + +import core.game.node.entity.player.Player +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.tools.RandomFunction +import plugin.ai.AIPBuilder +import plugin.ai.AIPlayer +import plugin.ai.AIRepository +import plugin.ai.general.scriptrepository.Idler +import plugin.ai.general.scriptrepository.Script + +class GeneralBotCreator { + //org/crandor/net/packet/in/InteractionPacket.java <<< This is a very useful class for learning to code bots + constructor(loc: Location?, botScript: Script) { + botScript.bot = AIPBuilder.create(loc) + GameWorld.Pulser.submit(BotScriptPulse(botScript)) + } + + constructor(botScript: Script, bot: AIPlayer?) { + botScript.bot = bot + GameWorld.Pulser.submit(BotScriptPulse(botScript).also { AIRepository.PulseRepository.add(it) }) + } + + constructor(botScript: Script, player: Player, isPlayer: Boolean){ + botScript.bot = player + val pulse = BotScriptPulse(botScript,isPlayer) + GameWorld.Pulser.submit(pulse) + player.setAttribute("/save:not_on_highscores",true) + player.setAttribute("botting:script",pulse) + } + + inner class BotScriptPulse(public val botScript: Script, val isPlayer: Boolean = false) : Pulse(1){ + var ticks = 0 + init { + botScript.init(isPlayer) + } + var randomDelay = 0 + + override fun pulse(): Boolean { + if(randomDelay > 0){ + randomDelay -= 1 + return false + } + if (!botScript.bot.pulseManager.hasPulseRunning()) { + + /*if (ticks++ >= RandomFunction.random(90000,120000)) { + AIPlayer.deregister(botScript.bot.uid) + ticks = 0 + SystemLogger.log("Submitting transition pulse from ticks") + GameWorld.Pulser.submit(TransitionPulse(botScript)) + return true + }*/ + if(!botScript.running) return true //has to be separated this way or it double-submits the respawn pulse. + + + val idleRoll = RandomFunction.random(50) + if(idleRoll == 2 && botScript !is Idler){ + randomDelay += RandomFunction.random(2,20) + return false + } + botScript.tick() + } + return false + } + + override fun stop() { + ticks = Integer.MAX_VALUE - 20 //Sets the ticks as high as they can go (safely) and then runs pulse again + pulse() //to trigger the transition pulse to be submitted. + super.stop() + AIRepository.PulseRepository.remove(this) + } + } + + inner class TransitionPulse(val script: Script) : Pulse(RandomFunction.random(60,200)){ + override fun pulse(): Boolean { + GameWorld.Pulser.submit(BotScriptPulse(script.newInstance()).also { AIRepository.PulseRepository.add(it) }) + return true + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/ScriptAPI.kt b/Server/src/main/java/Server/plugin/ai/general/ScriptAPI.kt new file mode 100644 index 000000000..1806ee471 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/ScriptAPI.kt @@ -0,0 +1,656 @@ +package plugin.ai.general + +import core.cache.def.impl.ItemDefinition +import core.game.component.Component +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.Entity +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.GroundItem +import core.game.node.item.GroundItemManager +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.map.path.Pathfinder +import core.game.world.repository.Repository +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.tools.Items +import core.tools.RandomFunction +import plugin.ai.AIRepository +import core.game.content.consumable.Consumable +import core.game.content.consumable.Consumables +import core.game.content.consumable.Food +import core.game.content.consumable.effects.HealingEffect +import core.game.ge.GrandExchangeOffer +import core.game.ge.OfferManager +import core.game.node.entity.skill.Skills +import core.tools.stringtools.colorize +import java.util.* +import java.util.concurrent.CountDownLatch +import java.util.concurrent.Executors +import kotlin.math.pow +import kotlin.math.sqrt + +class ScriptAPI(private val bot: Player) { + val GRAPHICSUP = Graphics(1576) + val ANIMATIONUP = Animation(8939) + val GRAPHICSDOWN = Graphics(1577) + val ANIMATIONDOWN = Animation(8941) + + /** + * Gets the distance between two nodes + * @param n1 the first node + * @param n2 the second node + * @author Ceikry + */ + fun distance(n1: Node, n2: Node): Double { + return sqrt((n1.location.x - n2.location.x.toDouble()).pow(2.0) + (n2.location.y - n1.location.y.toDouble()).pow(2.0)) + } + + /** + * Gets the nearest node with name entityName + * @param entityName the name of the node to look for + * @return the nearest node with a matching name or null + * @author Ceikry + */ + fun getNearestNode(entityName: String): Node? { + var entity: Node? = null + var minDistance = Double.MAX_VALUE + for (node in RegionManager.forId(bot.location.regionId).planes[bot.location.z].entities) { + if (node != null && node.name == entityName && distance(bot, node) < minDistance && !Pathfinder.find(bot, node).isMoveNear) { + entity = node + minDistance = distance(bot, node) + } + } + return entity + } + + /** + * Gets the nearest node with matching id. + * @param id the id to look for + * @param object whether or not the node we are looking for is an object. + * @return the closest node with matching id or null. + * @author Ceikry + */ + fun getNearestNode(id: Int, `object`: Boolean): Node? { + if (`object`) { + var entity: Node? = null + var minDistance = Double.MAX_VALUE + for (objects in RegionManager.forId(bot.location.regionId).planes[bot.location.z].objects) { + for(e in objects) { + if (e != null && e.id == id && distance(bot, e) < minDistance && !Pathfinder.find(bot, e).isMoveNear && e.isActive) { + entity = e + minDistance = distance(bot, e) + } + } + } + return if(entity == null) null else entity as GameObject + } else { + var entity: Node? = null + var minDistance = Double.MAX_VALUE + for (e in RegionManager.forId(bot.location.regionId).planes[bot.location.z].entities) { + if (e != null && e.id == id && distance(bot, e) < minDistance && !Pathfinder.find(bot, e).isMoveNear) { + entity = e + minDistance = distance(bot, e) + } + } + return entity + } + } + + /** + * Gets the nearest node with a matching name. + * @param name the name to look for. + * @param object whether or not the node we are looking for is an object. + * @return the nearest matching node or null. + * @author Ceikry + */ + fun getNearestNode(name: String, `object`: Boolean): Node? { + if (`object`) { + var entity: Node? = null + var minDistance = Double.MAX_VALUE + for (objects in RegionManager.forId(bot.location.regionId).planes[bot.location.z].objects) { + for(e in objects) { + if (e != null && e.name.toLowerCase() == name.toLowerCase() && distance(bot, e) < minDistance && !Pathfinder.find(bot, e).isMoveNear && e.isActive) { + entity = e + minDistance = distance(bot, e) + } + } + } + return if(entity == null) null else entity as GameObject + } else { + var entity: Node? = null + var minDistance = Double.MAX_VALUE + for (e in RegionManager.forId(bot.location.regionId).planes[bot.location.z].entities) { + if (e != null && e.name.toLowerCase() == name.toLowerCase() && distance(bot, e) < minDistance && !Pathfinder.find(bot, e).isMoveNear) { + entity = e + minDistance = distance(bot, e) + } + } + return entity + } + } + + /** + * Gets the nearest ground item with matching ID from the list in AIRepository. + * @param id the id of the ground item we are looking for. + * @return the nearest GroundItem with a matching id or null + * @author Ceikry + */ + private fun getNearestGroundItem(id: Int): GroundItem? { + var distance = 11.0 + var closest: GroundItem? = null + if(AIRepository.getItems(bot) != null) { + for (item in AIRepository.getItems(bot)!!.filter {it: GroundItem -> it.distance(bot.location) < 10 }) { + if (item.id == id) { + //distance = item.distance(bot.location) + closest = item + } + } + if (!GroundItemManager.getItems().contains(closest)){ + AIRepository.getItems(bot)?.remove(closest) + return null + } + } else { + val items: ArrayList? = bot.getAttribute("botting:drops",null) + if(items != null){ + for(item in items.filter { it.distance(bot.location) < 10 }){ + if(item.id == id) return item.also { items.remove(item); bot.setAttribute("botting:drops",items) } + } + } + } + return closest + } + + /** + * Takes the nearest ground item with a matching id if it exists. + * @param id the id to look for + * @author Ceikry + */ + fun takeNearestGroundItem(id: Int){ + val item = getNearestGroundItem(id) + if(item != null) + item.interaction?.handle(bot, item.interaction[2]) + } + + /** + * Gets the nearest GameObject to loc with matching objectId + * @param loc the location we are checking around + * @param objectId the id of the object we are looking for + * @return the nearest matching object or null. + * @author Ceikry + */ + fun getNearestGameObject(loc: Location, objectId: Int): GameObject? { + var nearestObject: GameObject? = null + val minDistance = Double.MAX_VALUE + for (o in RegionManager.forId(loc.regionId).planes[0].objects) { + for (obj in o) { + if (obj != null) { + if (distance(loc, obj) < minDistance && obj.id == objectId) { + nearestObject = obj + } + } + } + } + return nearestObject + } + + /** + * Gets a list of NPCs that are attackable around the entity. + * @param entity the entity to search around. + * @param radius the radius around entity to search in. + * @param name the name of the NPC to look for. + * @return an Array of the nearest NPCs with matching name, or null. + * @author Ceikry + */ + private fun findTargets(entity: Entity?, radius: Int, name: String? = null): List? { + val targets: MutableList = ArrayList() + val localNPCs: Array = RegionManager.getLocalNpcs(entity, radius).toTypedArray() + var length = localNPCs.size + if (length > 5) { + length = 5 + } + for (i in 0 until length) { + val npc = localNPCs[i] as NPC + run { if (checkValidTargets(npc, name)) targets.add(npc) } + } + return if (targets.size == 0) null else targets + } + + /** + * Checks if the given target is a valid target for a combat bot. + * @param target the NPC that we are checking + * @param name the expected name of the NPC. + * @return true if the target is valid, false if not. + * @author Ceikry + */ + private fun checkValidTargets(target: NPC, name: String?): Boolean { + if (!target.isActive) { + return false + } + if (!target.properties.isMultiZone && target.inCombat()) { + return false + } + if (name != null){ + if(target.name != name) + return false + } + return target.definition.hasAction("attack") + } + + /** + * Attacks npcs in the given radius of the bot. + * @param bot the bot that is attacking + * @param radius the radius to attack in + * @return true if successfully attacking an NPC within that radius, false if not. + * @author Ceikry + */ + fun attackNpcsInRadius(bot: Player, radius: Int): Boolean { + if (bot.inCombat()) return true + var creatures: List? = findTargets(bot, radius) ?: return false + bot.attack(creatures!![RandomFunction.getRandom(creatures.size - 1)]) + return if (creatures.isNotEmpty()) { + true + } else { + creatures = findTargets(bot, radius) + if (!creatures!!.isEmpty()) { + bot.attack(creatures[RandomFunction.getRandom(creatures.size - 1)]) + return true + } + false + } + } + + /** + * Function to iteratively walk a bot to a faraway location. Limited by doors and large obstacles like mountains. + * @param loc the location to walk to. + * @author Ceikry + */ + fun walkTo(loc: Location){ + if(!bot.walkingQueue.isMoving) { + Executors.newSingleThreadExecutor().execute { + walkToIterator(loc) + } + } + } + + /** + * @param loc the location to walk to. + * @param radius tiles around the location the bot could walk to. + * @author Kermit + */ + + fun randomWalkTo(loc: Location, radius: Int) { + if(!bot.walkingQueue.isMoving) { + Executors.newSingleThreadExecutor().execute { + var newloc = loc.transform(RandomFunction.random(radius,-radius), + RandomFunction.random(radius,-radius), 0) + walkToIterator(newloc) + } + } + } + + + /** + * The iterator for long-distance walking. Limited by doors and large obstacles like mountains. + * @param loc the location to find a path to. + * @author Ceikry + */ + private fun walkToIterator(loc: Location){ + var diffX = loc.x - bot.location.x + var diffY = loc.y - bot.location.y + while(!bot.location.transform(diffX, diffY, 0).withinDistance(bot.location)) { + diffX /= 2 + diffY /= 2 + } + GameWorld.Pulser.submit(object : MovementPulse(bot, bot.location.transform(diffX, diffY, 0), Pathfinder.SMART) { + override fun pulse(): Boolean { + return true + } + }) + } + + /** + * Attacks npcs in the given radius of the bot. + * @param bot the bot that is attacking + * @param radius the radius to attack in + * @param name the name of the NPC to target. + * @return true if successfully attacking an NPC within that radius, false if not. + * @author Ceikry + */ + fun attackNpcInRadius(bot: Player, name: String, radius: Int): Boolean { + if (bot.inCombat()) return true + var creatures: List? = findTargets(bot, radius, name) ?: return false + bot.attack(creatures!![RandomFunction.getRandom(creatures.size - 1)]) + return if (creatures.isNotEmpty()) { + true + } else { + creatures = findTargets(bot, radius, name) + if (!creatures!!.isEmpty()) { + bot.attack(creatures.random()) + return true + } + false + } + } + + /** + * Extension function to find the distance between a location and a ground item. + * @param loc the location to check the distance from. + * @return a Double representing the distance. + * @author Ceikry + */ + fun GroundItem.distance(loc: Location): Double{ + return location.getDistance(loc) + } + + /** + * A function for teleporting the bot to the GE + * @author Ceikry + */ + fun teleportToGE(){ + bot.lock() + bot.visualize(ANIMATIONUP, GRAPHICSUP) + bot.impactHandler.disabledTicks = 4 + val location = Location.create(3165, 3482, 0) + bot.pulseManager.run(object : Pulse(4, bot) { + override fun pulse(): Boolean { + bot.unlock() + bot.properties.teleportLocation = location + bot.animator.reset() + return true + } + }) + } + + /** + * A function for selling a given item on the GE. + * @param id the ID of the item to sell on the GE. Pulls from the bot's bank. + * @author Ceikry + * @author Angle + */ + fun sellOnGE(id: Int){ + class toCounterPulse : MovementPulse(bot, Location.create(3165, 3487, 0)){ + override fun pulse(): Boolean { + var actualId = id + val itemAmt = bot.bank.getAmount(id) + if (ItemDefinition.forId(id).noteId == id){ + actualId = Item(id).noteChange + } + val canSell = OfferManager.addBotOffer(actualId, itemAmt) + if (canSell && saleIsBigNews(actualId, itemAmt)) { + SystemLogger.logAI("Offered $itemAmt of $actualId on the GE.") + Repository.sendNews("2009Scape just offered " + itemAmt + " " + ItemDefinition.forId(actualId).name.toLowerCase() + " on the GE.") + } + bot.bank.remove(Item(id, itemAmt)) + bot.bank.refresh() + return true + } + } + bot.pulseManager.run(toCounterPulse()) + } + + /** + * Function to sell all items in a bot's bank on the Grand Exchange, if they are tradable. + * @author Ceikry + */ + fun sellAllOnGe(){ + class toCounterPulseAll : MovementPulse(bot, Location.create(3165, 3487, 0)){ + override fun pulse(): Boolean { + for(item in bot.bank.toArray()) { + item ?: continue + if (item.id == Items.LOBSTER_379) continue + if (item.id == Items.SWORDFISH_373) continue + if (item.id == Items.SHARK_385) continue + if(!item.definition.isTradeable) {continue} + val itemAmt = item.amount + var actualId = item.id + if (ItemDefinition.forId(actualId).noteId == actualId){ + actualId = Item(actualId).noteChange + } + val canSell = OfferManager.addBotOffer(actualId, itemAmt) + if (canSell && saleIsBigNews(actualId, itemAmt)) { + Repository.sendNews("2009Scape just offered " + itemAmt + " " + ItemDefinition.forId(actualId).name.toLowerCase() + " on the GE.") + } + bot.bank.remove(item) + bot.bank.refresh() + } + return true + } + } + bot.pulseManager.run(toCounterPulseAll()) + } + + /** + * Function to sell all items in a bot's bank on the Grand Exchange, if they are tradable. + * @author Ceikry & Kermit + */ + fun sellAllOnGeAdv(){ + val ge: GameObject? = getNearestNode("Desk", true) as GameObject? + class toCounterPulseAll : MovementPulse(bot, ge, DestinationFlag.OBJECT) { + override fun pulse(): Boolean { + for(item in bot.bank.toArray()) { + item ?: continue + if(!item.definition.isTradeable) {continue} + val itemAmt = item.amount + var actualId = item.id + if (ItemDefinition.forId(actualId).noteId == actualId){ + actualId = Item(actualId).noteChange + } + val canSell = OfferManager.addBotOffer(actualId, itemAmt) + if (canSell && saleIsBigNews(actualId, itemAmt)) { + Repository.sendNews("2009Scape just offered " + itemAmt + " " + ItemDefinition.forId(actualId).name.toLowerCase() + " on the GE.") + } + bot.bank.remove(item) + bot.bank.refresh() + } + return true + } + } + bot.pulseManager.run(toCounterPulseAll()) + } + + /** + * Function to determine whether or not to bother everyone on the server + * with the big news that a bot is selling something to the GE, based on item value + * @param itemID + * @param amount + * @author Gexja + */ + fun saleIsBigNews(itemID: Int, amount: Int): Boolean { + return ItemDefinition.forId(itemID).getAlchemyValue(true) * amount >= 500 + } + + /** + * Function to teleport a bot to the given location. + * @param loc the location to teleport to + * @author Ceikry + */ + fun teleport(loc: Location){ + bot.lock() + bot.visualize(ANIMATIONUP, GRAPHICSUP) + bot.impactHandler.disabledTicks = 4 + val location = loc + GameWorld.Pulser.submit(object : Pulse(4, bot) { + override fun pulse(): Boolean { + bot.unlock() + bot.properties.teleportLocation = location + bot.animator.reset() + return true + } + }) + } + + /** + * Takes the given item out of the bot's inventory and places it into the bank. Banks all items with matching ID. + * @param item the ID of the item to bank + * @author Ceikry + */ + fun bankItem(item: Int){ + class BankingPulse() : Pulse(20){ + override fun pulse(): Boolean { + val logs = bot.inventory.getAmount(item) + bot.inventory.remove(Item(item, logs)) + bot.bank.add(Item(item, logs)) + return true + } + } + bot.pulseManager.run(BankingPulse()) + } + + /** + * Function that makes the bot eat the food item in their inventory if their HP is below 2/3. + * @author Ceikry + * @param foodId the ID of the food item to eat + */ + fun eat(foodId: Int) { + val foodItem = Item(foodId) + if (bot.skills.getStaticLevel(Skills.HITPOINTS) * RandomFunction.random(0.5, 0.75) >= bot.skills.lifepoints && bot.inventory.containsItem(foodItem)) { + bot.lock(3) + //this.animate(new Animation(829)); + val food = bot.inventory.getItem(foodItem) + var consumable: Consumable? = Consumables.getConsumableById(foodId) + if (consumable == null) { + consumable = Food(intArrayOf(food.id), HealingEffect(1)) + } + consumable.consume(food, bot) + bot.properties.combatPulse.delayNextAttack(3) + } + } + + /** + * Same as the eat function, except that it forces the bot to eat regardless of HP. + * @author Ceikry + * @param foodId the ID of the food item to eat. + */ + fun forceEat(foodId: Int) { + val foodItem = Item(foodId) + if (bot.inventory.containsItem(foodItem)) { + bot.lock(3) + //this.animate(new Animation(829)); + val food = bot.inventory.getItem(foodItem) + var consumable: Consumable? = Consumables.getConsumableById(foodId) + if (consumable == null) { + consumable = Food(intArrayOf(foodId), HealingEffect(1)) + } + consumable.consume(food, bot) + bot.properties.combatPulse.delayNextAttack(3) + } + } + + /** + * Function for buying items off the GE. + * @param itemID the id of the item to buy off the GE. + * @param amount the amount to buy. + * @return true if item was successfully bought, false if not. + */ + fun buyFromGE(bot: Player, itemID: Int, amount: Int){ + Executors.newSingleThreadExecutor().execute{ + val offer = GrandExchangeOffer() + offer.itemID = itemID + offer.sell = false + offer.offeredValue = checkPriceOverrides(itemID) ?: ItemDefinition.forId(itemID).value + offer.amount = amount + offer.player = bot + OfferManager.dispatch(bot, offer) + AIRepository.addOffer(bot, offer) + var bought: Boolean = false + val latch = CountDownLatch(1) + bot.pulseManager.run(object : Pulse(5) { + override fun pulse(): Boolean { + bought = offer.completedAmount == offer.amount + latch.countDown() + return true + } + }) + latch.await() + if(bought){ + bot.bank.add(Item(offer.itemID, offer.completedAmount)) + bot.bank.refresh() + } + } + } + + /** + * Method to allow a bot to withdraw items from its bank. + * @param itemID the item to withdraw. + * @param amount the amount to withdraw. + * @author Ceikry + */ + fun withdraw(itemID: Int, amount: Int){ + var item: Item? = null + if(bot.bank.containsItem(Item(itemID, amount))){ + item = Item(itemID, amount) + } else { + item = Item(itemID, bot.bank.getAmount(itemID)) + } + if(item.amount == 0) return + if(!bot.inventory.hasSpaceFor(item)){ + item.amount = bot.inventory.getMaximumAdd(item) + } + bot.bank.remove(item) + bot.inventory.add(item) + } + + fun getOverlay(): BottingOverlay{ + return BottingOverlay(bot) + } + + /** + * Function to check for price overrides. + * @param id the id to check for overrides for. + * @author Ceikry + */ + fun checkPriceOverrides(id: Int): Int?{ + return when(id){ + Items.PURE_ESSENCE_7936 -> 50 + Items.BOW_STRING_1777 -> 250 + Items.MAGIC_LOGS_1513 -> 750 + Items.COWHIDE_1739 -> 250 + Items.DRAGON_BONES_536 -> 1250 + Items.GREEN_DRAGONHIDE_1753 -> 550 + Items.GRIMY_RANARR_207 -> 1214 + Items.GRIMY_AVANTOE_211 -> 453 + Items.GRIMY_CADANTINE_215 -> 232 + Items.GRIMY_DWARF_WEED_217 -> 86 + Items.GRIMY_GUAM_199 -> 50 + Items.GRIMY_HARRALANDER_205 -> 115 + Items.GRIMY_IRIT_209 -> 860 + Items.GRIMY_KWUARM_213 -> 334 + Items.GRIMY_LANTADYME_2485 -> 115 + Items.GRIMY_MARRENTILL_201 -> 250 + Items.LOBSTER_379 -> 268 + Items.RAW_LOBSTER_377 -> 265 + Items.LOOP_HALF_OF_A_KEY_987 -> 5250 + Items.TOOTH_HALF_OF_A_KEY_985-> 4263 + Items.SWORDFISH_373 -> 400 + Items.RAW_SWORDFISH_371 -> 390 + Items.SHARK_385 -> 720 + Items.RAW_SHARK_383 -> 710 + else -> null + } + } + + class BottingOverlay(val player: Player){ + fun init(){ + player.interfaceManager.openOverlay(Component(195)) + player.packetDispatch.sendInterfaceConfig(195,5,true) + } + fun setTitle(title: String){ + player.packetDispatch.sendString(colorize("%B$title"),195,7) + } + fun setTaskLabel(label: String){ + player.packetDispatch.sendString(colorize("%B$label"),195,8) + } + fun setAmount(amount: Int){ + player.packetDispatch.sendString(colorize("%B$amount"),195,9) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Adventurer.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Adventurer.kt new file mode 100644 index 000000000..a5ebba9bd --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Adventurer.kt @@ -0,0 +1,971 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.`object`.GameObject +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.combat.CombatSwingHandler +import core.game.node.entity.skill.Skills +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.map.zone.ZoneBorders +import core.game.world.repository.Repository.sendNews +import core.game.world.update.flag.* +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.ChatMessage +import core.game.world.update.flag.context.Graphics +import core.game.world.update.flag.player.ChatFlag +import core.tools.RandomFunction +import plugin.ai.AIPlayer +import plugin.ai.AIRepository +import plugin.ai.pvmbots.CombatBotAssembler +import plugin.ai.pvp.PVPAIPActions +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import kotlin.random.Random + + +/** + * A bot script for Adventurers who explore the world! + * @param counter used in the bots random idling function. + * @param random is used to generate random number. + * @param city determines the home city of the bot. + * @param freshspawn determines if the bot has just been spawned. + * @param random_city is the list of cities that can be randomly chosen as the home city. + * @param tree_list is the list of trees that a bot can start cutting randomly. + * @author Sir Kermit + * @author Ceikry + */ +class Adventurer(val style: CombatStyle): Script() { + + val yanille: Location = Location.create(2615, 3104, 0) + val ardougne: Location = Location.create(2662, 3304, 0) + val seers: Location = Location.create(2726, 3485, 0) + val edgeville: Location = Location.create(3088, 3486, 0) + val ge: Location = Location.create(3168, 3487, 0) + val ge2: Location = Location.create(3161, 3493, 0) + val catherby: Location = Location.create(2809, 3435, 0) + val falador: Location = Location.create(2965, 3380, 0) + val varrock: Location = Location.create(3213, 3428, 0) + val draynor: Location = Location.create(3080, 3250, 0) + val rimmington: Location = Location.create(2956, 3220, 0) + val lumbridge: Location = Location.create(3222, 3219, 0) + var city: Location = lumbridge + + fun dialogue() { + val player = RegionManager.getLocalPlayers(bot).random() + val real = if (!player.isArtificial) player else player + + val dialogue = listOf( + "Hey!", + "Hello ${real.username}", + "What are you doing ${real.username}?", + "Fishing level ${real.username}?", + "How do I make gp ${real.username}", + "Wyd ${real.username}?", + "How do i get to Varrock ${real.username}?", + "How do i get to Camelot ${real.username}?", + "How do i get to Taverly ${real.username}?", + "How do i get to Ardougne ${real.username}?", + "How do i get to Yanille ${real.username}?", + "How do i get to Catherby ${real.username}?", + "Gotta go srry.", + " /hop world 1 got a noob here!", + "woot", + "How's your day been ${real.username}?", + "heyy ${real.username} :)", + "gtg srry", + "I won't answer your questions ${real.username}", + "Stop asking questions ${real.username}", + "Roflmao", + "Can you stop following me ${real.username}?", + "I swear ${real.username} is following me.", + "${real.username}'s gear could really use an upgrade lol", + "Quack!", + "Sit.", + "Doubling gold trade me ${real.username}", + "Reeee!", + "Know any house parties ${real.username}?", + "Where am i ${real.username}??", + "Is there Nightmarezone ${real.username}?", + "Nice Armor ${real.username}!", + "Nice Weapon ${real.username}!", + "Venezuela #1", + "2009Scape and chill ${real.username}?", + "${real.username} is my girlfriend", + "Buying gf", + "Bank sale pm me for info", + "#1 trusted dicing site", + "Scary movie is a great movie", + "Cod Cold War sucks", + "Idek what game this is", + "Can you teach me how to dougie?", + "Check this out baby girl cat daddy", + "Fuckin sit ${real.username}.", + "Error: Botting client broken tell Evilwaffles.", + "${real.username} bots all the time", + "report ${real.username}", + "apparently ${real.username} bots", + "${real.username} hates kermit", + "There are no mods on to help you", + "Report me, you won't", + "Yes, I'm botting. And?", + "ERROR: BOTSCRIPT NPE. REPORT TO BOT OWNER (Evilwaffles)", + "flash2:wave: FUCK", + "I love 2009Scape!", + "Ja Ja Ja Ja", + "This is fun!", + "Ironman or you're a scrub ${real.username}.", + "Who even trains hunter ${real.username}?", + "Where do i get rune armor ${real.username}?", + "How do i get to the ge ${real.username}?", + "Don't come to falador tomorrow ${real.username}...", + "Woah!", + " /where are you??", + "How did i even get here ${real.username}", + "Why don't they add warding ${real.username}?", + "Where do i start dragon slayer ${real.username}?", + "I love this server!", + "How do i change my xp rate ${real.username}?", + "What quests are available ${real.username}?", + "Are you a real player ${real.username}?", + "Are you real ${real.username}?", + "Are you a bot ${real.username}?", + "I'm real lol", + "Why don't you respond to me ${real.username}?", + "Why can't i talk in clan chat ${real.username}?", + "I love Kermit", + "Add me as a friend ${real.username} :)", + "I'm a player lol", + "I'm a player lol", + "I'm a player lol", + "Hey ${real.username} :)", + "HEY ${real.username}", + "Hey ${real.username}!!!!", + "Lol wyd?", + "Patch Notes is more of an ultimate tin man", + "More like Rusty ass skills lmao", + "Trade me ${real.username}", + "LOL", + "How do I get to lumbrich", + "bruh", + "poggers", + "shitpost", + "I wish i could find an RS Gf", + "Where do you find runite ore ${real.username}?", + "Where is the best coal location ${real.username}?", + "Where do i find dragon weapons ${real.username}?", + "Can i have some free stuff ${real.username}?", + "Wyd here ${real.username}?", + "Didn't know anyone was on rn", + "I see ${real.username} all the time", + "How many times have i seen you", + "I see you a lot", + "Do you train summoning ${real.username}?", + "Where did you level hunter ${real.username}?", + "I wish they would add global pvp", + "Meet me in the wilderness ${real.username}", + "Why?", + "Praise our glorious frog overlord!", + "Kermit is bae tbh", + "Kermit is my god.", + " /Yeah I think ${real.username} is a bot", + "100% sure this is a bot", + "Oh no, not ${real.username} again.", + "Same as you", + "Me too", + "I knew ${real.username} was a bot lol", + "I'm not a bot", + "Nah I'm a real person", + "Bruh are you even a real person lol?", + "e", + "Hellooooo ${real.username}", + "wc lvl ${real.username}?", + "fletching level ${real.username}?", + "firemaking level ${real.username}?", + "Have you seen the dude in the ge?", + "Wonderful weather today ${real.username}", + "Lowkey drunk af rn", + "I am so tired", + "Wassup ${real.username}", + "follow me ${real.username}!", + "Server goes brrrr", + "bruh i am not a bot", + "I think ${real.username} is a bot", + "Are you a bot ${real.username}?", + "insert spiderman meme here", + "pot calling the kettle black etc", + "ooh, a piece of candy", + "I love woodcutting", + "I'm going to go level up later", + "I love mining shooting stars", + " /this ${real.username} looks dumb", + "AAAAAAAAAAAAAAAAAAAAAAAAHHHHHH!!!", + "como estas ${real.username}", + "Summer = best community manaer", + "so how about that ceikry guy", + "so how about that kermit dude", + "woah is an abusive mod", + "I heard Woah and Ceikry are dating now", + "House party in Yanille!", + "Can i have some gp ${real.username}?", + "Where do i find partyhats?", + "Why do mobs drop boxes?", + "What exp rate do you play on ${real.username}?", + "Have you met Summer?", + "Hey ${real.username}", + "Hey ${real.username}", + "Hey ${real.username}", + "Hey ${real.username}", + "Hey ${real.username}", + "Wyd?", + "Wyd?", + "Wyd?", + "Wyd?", + "${real.username} have you met Kermit?", + "${real.username} have you met Ceikry?", + "${real.username} have you met Woah?", + "Wanna chill at my poh?", + "Whats the best place to train attack?", + "Good Waffles > Evil Waffles", + "Ladies man? More like lame man LOL", + "NobodyCLP has big feet", + "Chicken tendies for dindin", + "Spicey Chicken tendies is litty as a mf titty", + "red bracket stinky", + "ra ra rasputin", + "lover of the russian queen", + "When's the next update coming out?", + "How many players are maxed?", + "I don't use discord ${real.username}", + "I don't use the CC ${real.username}", + "Why should i use discord?", + "2009Scape is life", + "brb gotta make dinner", + "I need to go to the GE", + "${real.username} can i have a ge tele?", + "lol ${real.username} shut up", + "Where are teak trees?", + "How do i make planks ${real.username}?", + "Idk about that scraggley ass alex guy.", + "Rusty? More like Crusty af lmfao.", + "I need to sell some stuff on the ge", + "I have so many logs to sell lol", + "nah", + "yes", + "Where can i mine iron?", + "Where can i mine tin?", + "Where can i mine copper?", + "Where can i mine clay?", + "Where can i mine coal?", + "no", + "We're no strangers to love", + "You know the rules and so do I", + "A full commitment's what I'm thinking of", + "You wouldn't get this from any other guy", + "Never gonna give you up", + "Never gonna let you down", + "why", + "why", + "why", + "why", + "Why does it not show your messages in the chatbox?", + "Why do you not show up in chat?", + "Why do you not show up in chat ${real.username}?", + "Why do you not show up in chat ${real.username}?", + "When did you start playing ${real.username}?", + "When did you start on this server ${real.username}?", + "When did you first get here ${real.username}?", + "russia's greatest love machine", + "Never gonna run around and desert you", + "Two things are infinite: the universe & ${real.username}'s stupidity", + "If you tell the truth, you don't have to remember anything.", + "We accept the love we think we deserve.", + "Without music, life would be a mistake.", + "Self esteem, motivation ${real.username}", + "A blessing in disguise ${real.username}", + "Break a leg", + "Cut somebody some slack", + "You’re in the right place!", + "Thanks so much.", + "I really appreciate you ${real.username}", + "Excuse me ${real.username}?", + "I’m sorry.", + "What do you think ${real.username}?", + "How does that sound ${real.username}?", + "That sounds great ${real.username}.", + "I’m learning English.", + "I don’t understand.", + "Could you repeat that please ${real.username}?", + "Could you please talk slower ${real.username}?", + "Thank you. That helps a lot.", + "How do you spell that ${real.username}?", + "What do you mean ${real.username}", + "Hi! I’m paul.", + "Nice to meet you.", + "Where are you from ${real.username}?", + "What do you do ${real.username}", + "What do you like to do", + "Do you have Facebook ${real.username}", + "How can I help you ${real.username}?", + "I’ll be with you in a moment ${real.username}", + "What time is our meeting ${real.username}?", + "Excellent ${real.username}", + "Good idea ${real.username}", + "He's very annoying.", + "How are you?", + "I can't hear you.", + "I'd like to go for a walk.", + "I don't know how to use it.", + "I don't like him ${real.username}", + "I don't like it ${real.username}", + "I'm an American.", + "I'm going to leave.", + "I'm happy ${real.username}", + "I'm not ready yet ${real.username}", + "I'm very busy. I don't have time now.", + "Is that enough ${real.username}?", + "I thought the clothes were cheaper ${real.username}", + "I've been here for two days ${real.username}.", + "Let me think about it", + "Never mind ${real.username}", + "Nonsense ${real.username}", + "Sorry to bother you", + "Take it outside ${real.username}", + "Thanks for your help", + "Thank you very much ${real.username}", + "That's not right ${real.username}", + "Very good, thanks ${real.username}", + "Your things are all here i think?", + "Long time no see ${real.username}", + "I couldn’t agree more ${real.username}", + "It cost me a fortune ${real.username}", + "I am dog tired", + "Don’t take it personally", + "We will be having a good time", + "Same as always ${real.username}", + "No problem", + "Anyway, I should get going ${real.username}", + "I can’t help you there ${real.username}", + "I agree 100% ${real.username}" + ) + val current = LocalDateTime.now() + + //val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS") + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val formatter2 = DateTimeFormatter.ofPattern("MMdd") + val formatter3 = DateTimeFormatter.ofPattern("HHmm") + val formatted: String = current.format(formatter) + val formatted2: String = current.format(formatter2) + val formatted3: String = current.format(formatter3) + + //2020-11-28 + //1128 + //1201 to 1225 + //2020-11-28 00:00:00.000 + val SnowDay = 1225 + val lead = formatted2.toInt() + val celebrate = formatted3.toInt() + val until = SnowDay - lead + + val Leading2Christmas = listOf( + "Only $until days left till christmas!", + "$until days till christmas ${real.username}!!!", + "I can't believe theres only $until days left till christmas", + "Isn't there $until days left till christmas??", + "I am so excited for christmas ${real.username}!", + "Guess what's in $until days ${real.username}?", + "I'm so excited for christmas in $until days!", + "I can't believe it's December already ${real.username}!", + "Do you like christmas ${real.username}?", + "I love december it's my favourite month ${real.username}", + "I love winter so much ${real.username}", + "I hate when it's cold outside ${real.username}", + "You need to put some warm clothes on ${real.username}", + "Wanna build a snowman ${real.username}?", + "Frozen is a terrible movie ${real.username}", + "${real.username} is a winter meme", + "${real.username} do you have an advent calendar?", + "${real.username} builds gingerbread houses", + "${real.username} likes liquorice", + "Do you drink egg nog ${real.username}?", + "${real.username} bites candy canes", + "${real.username} is my north star", + "Kermit is green, the grinch is green, coincidence?", + "${real.username} who do you thinks the server scrooge?", + "Do you like snow ${real.username}", + "I think there are $until days left then its christmas?", + "What day is christmas on ${real.username}?", + "Has it snowed where you live ${real.username}?", + "I wonder when it is going to snow", + "Building snow men for GP", + "Buying santa hats", + "Wanna buy a santa hat ${real.username}?", + "Where can i get a santa hat?", + "I need to put my christmas tree up", + "Do you like gingerbread cookies ${real.username}?", + "Do you decorate your christmas tree ${real.username}?", + "Oopsie looks like me and ${real.username} are under a mistletoe", + "I need ideas for stocking stuffers", + "I have $until days left to fill our stockings", + "Rusty = the grinch, ${real.username} = santa", + "${real.username} the red nose reindeer", + "Put one foot in front of the other", + "and soon you'll be walking out the doooor", + "Elf on the shelf time", + "${real.username} loves pinecones", + "I love the smell of pinecones", + "All i want for christmas is ${real.username}", + "${real.username} is underneath some mistletoe", + "Woah used to be a sled dog", + "Did you know woah was a sled dog before", + "I bet ${real.username} loves mariah carey", + "We have $until days to setup christmas lights", + "Christmas crackers when", + "${real.username} wanna do a christmas cracker??", + "I need to start wrapping presents i bought", + "I love fireside chats on cold days like this", + "Jingle bells batman smells", + "Jingle bells Rusty smells", + "Jingle bells Patch Notes smells", + "Jingle bells Evilwaffles smells", + "Jingle bells ${real.username} smells", + "Jingle all the way", + "In a one horse open sleigh", + "Oh, what fun it is to ride", + "Oh, what fun it is to ride, finish it ${real.username}", + "Jingle bells, jingle bells", + "Jingle all the way", + "I want a hippopotamus for christmas", + "Only a hippopotamus will do", + "I want a hippopotamus", + "I don't want a lot for Christmas", + "All I Want for Christmas Is You", + "I really can't stay, Baby it's cold outside", + "Christmas isn't a season. It's a feeling", + "Christmas is doing a little something extra for someone", + "There is nothing cozier than a Christmas tree all lit up", + "Christmas is a necessity", + "Christmas countdown: $until days.", + "Christmas in $until days ${real.username}", + "Frosty the Snowmannnn", + "Up on the housetop with old saint nick", + "Here comes santa claus, here comes santa claus", + "I saw mommy kissing santaaaa claus", + "I saw Kermit kissing santaaaa claus", + "You're a mean one, Mr. Grinch", + "Deck the hallsss", + "ITS BEGINNING TO LOOK A LOT LIKE CHRISTAAMASSSSS" + + ) + + val ChristmasEve = listOf( + "I can't wait for christmas tomorrow ${real.username}!!", + "It's almost christmas!!!", + "1 more day!!!!!", + "Don't forget to put cookies and milk out tonight!!", + "${real.username} do you like christmas??", + "Happy Christmas eve ${real.username} :)" + ) + + val Christmas = listOf( + "Merry Christmas ${real.username}!!", + "What did you get for christmas ${real.username}?", + "ITS CHRISTMASSSS!!!", + "Christmas party time!!", + "${real.username} vibing with the christmas spirit", + "Can't believe it's christmas!!", + "We need to have a christmas party ${real.username}!!", + "Merry christmas ${real.username} :))", + "Hope you're having an amazing christmas ${real.username} :)", + "I love winter so much ${real.username}", + "I hate when it's cold outside ${real.username}", + "You need to put some warm clothes on ${real.username}", + "Wanna build a snowman ${real.username}?", + "Do you like christmas ${real.username}?" + ) + + val NewYearsEve = listOf( + "What are you doing for New Years ${real.username}?", + "New Years Eve party orrr?", + "We should do something for New Years eve today ${real.username}!", + "Happy New Years Eve ${real.username}", + "1 More day left in 2021 thank god", + "What's your New Years resolution ${real.username}?" + ) + + val NewYears = listOf( + "Happy New Years ${real.username}!!!", + "It's New Years Day ${real.username}!", + "HAPPY NEW YEAR ${real.username}!!!", + "2022 let's fucking gooooooo", + "What are your goals for 2022 ${real.username}?" + ) + + when { + + //Celebrates lead up to Christmas! + until in 2..24 -> { + if (Random.nextBoolean()){ + val chat = Leading2Christmas.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + }else{ + val chat = dialogue.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + } + } + + //Celebrates Christmas Day! + formatted.contentEquals("2021-12-25") -> { + if (celebrate in 0..60){ + if (celebrate == 0) sendNews("MERRY CHRISTMAS HEAD TO THE GE!!!") + val chat = Christmas.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + if (Random.nextBoolean()) scriptAPI.teleport(ge) else scriptAPI.teleport(ge2) + city = if (Random.nextBoolean()) ge else ge2 + if (Random.nextBoolean()) state = State.EXPLORE else bot.animator.animate(Animation.create(11044), Graphics.create(1973)) + } + else if (Random.nextBoolean()) { + val chat = Christmas.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + }else{ + val chat = dialogue.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + } + } + + //Celebrates Christmas Eve + formatted.contentEquals("2021-12-24") -> { + if (Random.nextBoolean()) { + val chat = ChristmasEve.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + }else{ + val chat = dialogue.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + } + } + + //Celebrates New Years Eve + formatted.contentEquals("2021-12-31") -> { + if (Random.nextBoolean()) { + val chat = NewYearsEve.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + }else{ + val chat = dialogue.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + } + } + + //Celebrates New Years Day!!! + formatted.contentEquals("2022-01-01") -> { + if (celebrate in 0..60){ + if (celebrate == 0) sendNews("HAPPY NEW YEAR HEAD TO THE GE!!!") + val chat = NewYears.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + if (Random.nextBoolean()) scriptAPI.teleport(ge) else scriptAPI.teleport(ge2) + city = if (Random.nextBoolean()) ge else ge2 + state = State.EXPLORE + } + else if (Random.nextBoolean()) { + val chat = NewYears.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + }else{ + val chat = dialogue.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + } + } + + else -> { + val chat = dialogue.random() + bot.sendChat(chat) + bot.updateMasks.register(ChatFlag(ChatMessage(bot, chat, 0, 0))) + } + } + } + + var citygroupA = listOf(falador, varrock, draynor, rimmington, lumbridge, edgeville) + var citygroupB = listOf(yanille, ardougne, seers, catherby) + + var bankMap = hashMapOf( + falador to ZoneBorders(2950, 3374, 2943, 3368), + varrock to ZoneBorders(3182, 3435, 3189, 3446), + draynor to ZoneBorders(3092, 3240, 3095, 3246), + edgeville to ZoneBorders(3093, 3498, 3092, 3489), + yanille to ZoneBorders(2610, 3089, 2613, 3095), + ardougne to ZoneBorders(2649, 3281, 2655, 3286), + seers to ZoneBorders(2729, 3493, 2722, 3490), + catherby to ZoneBorders(2807, 3438, 2811, 3441) + ) + + var handler1: CombatSwingHandler? = null + + var ticks = 0 + var freshspawn = true + var new_city = false + val badedge = ZoneBorders(3094, 3494, 3096, 3497) + val badedge2 = Location.create(3094, 3492, 0) + val badedge3 = Location.create(3094, 3490, 0) + val badedge4 = Location.create(3094, 3494, 0) + var sold = false + val geloc: Location = if (Random.nextBoolean()){ + Location.create(3165, 3487, 0) + }else{ + Location.create(3164, 3492, 0) + } + + var counter: Int = 0 + var random: Int = (5..30).random() + + val type = when(style){ + CombatStyle.MELEE -> CombatBotAssembler.Type.MELEE + CombatStyle.MAGIC -> CombatBotAssembler.Type.MAGE + CombatStyle.RANGE -> CombatBotAssembler.Type.RANGE + } + + init { + + skills[Skills.AGILITY] = 99 + inventory.add(Item(1357))//Addy Axe + skills[Skills.WOODCUTTING] = 50 + inventory.add(Item(590))//Tinderbox + skills[Skills.FISHING] = 50 + inventory.add(Item(1271))//Addy Pickaxe + skills[Skills.MINING] = 90 + } + + private var state = State.START + + fun getRandomCity(): Location{ + return listOf(yanille, ardougne, seers, catherby, falador, varrock, + draynor, rimmington, lumbridge, ge, ge2, edgeville).random() + } + + fun immerse() { + if (counter++ == 180) {state = State.TELEPORTING} + val items = AIRepository.groundItems[bot] + if (Random.nextBoolean()) { + if (items.isNullOrEmpty()) { + scriptAPI.attackNpcsInRadius(bot, 8) + state = State.LOOT_DELAY + } + if (bot.inventory.isFull) { + if(bankMap[city] == null){ + scriptAPI.teleport(getRandomCity().also { city = it }) + } else { + if(bankMap[city]?.insideBorder(bot) == true){ + state = State.FIND_BANK + } else { + scriptAPI.walkTo(bankMap[city]?.randomLoc ?: Location(0, 0, 0)) + } + } + } + + } else { + if (bot.inventory.isFull){ + if(bankMap[city] == null){ + scriptAPI.teleport(getRandomCity().also { city = it }) + } else { + if(bankMap[city]?.insideBorder(bot) == true){ + state = State.FIND_BANK + } else { + scriptAPI.walkTo(bankMap[city]?.randomLoc ?: Location(0, 0, 0)) + } + } + } else { + val oak: Node? = scriptAPI.getNearestNode("Oak", true) + val tree: Node? = scriptAPI.getNearestNode("Tree", true) + val willow: Node? = scriptAPI.getNearestNode("Willow", true) + val rock: Node? = scriptAPI.getNearestNode("Rocks", true) + val star: Node? = scriptAPI.getNearestNode("Crashed star", true) + val node = listOf(oak, tree, willow, rock, star).random() + try { + node?.interaction?.handle(bot, node.interaction[0]) + } catch (e: Exception){} + } + } + return + } + + fun refresh() { + scriptAPI.teleport(lumbridge) + freshspawn = true + state = State.START + } + + //Adventure Bots v3.0.1 -Chat Edition- + override fun tick() { + ticks++ + if (ticks++ >= 800) { + ticks = 0 + refresh() + return + } + + when(state){ + + State.LOOT_DELAY -> { + bot.pulseManager.run(object : Pulse() { + var counter1 = 0 + override fun pulse(): Boolean { + when (counter1++) { + 4 -> return true.also { state = State.LOOT } + } + return false + } + }) + } + + State.LOOT -> { + val items = AIRepository.groundItems[bot] + if (items?.isNotEmpty() == true && !bot.inventory.isFull) { + items.forEach { + scriptAPI.takeNearestGroundItem(it.id) + } + } else { + state = State.EXPLORE + } + } + + State.START -> { + if (freshspawn) { + freshspawn = false + scriptAPI.randomWalkTo(lumbridge, 20) + } else { + city = getRandomCity() + state = State.TELEPORTING + } + } + + State.TELEPORTING -> { + ticks = 0 + counter = 0 + if (bot.location != city) { + scriptAPI.teleport(city) + } else { + state = State.EXPLORE + } + } + + State.EXPLORE -> { + if (counter++ == 300) { + state = State.TELEPORTING + } + + var chance = if (city == ge || city == ge2) 5000 else 2500 + if (RandomFunction.random(chance) <= 10) { + val nearbyPlayers = RegionManager.getLocalPlayers(bot) + if (nearbyPlayers.isNotEmpty()) { + ticks = 0 + dialogue() + } + } + + if (RandomFunction.random(1000) <= 150) { + var roamDistance = if (city != ge && city != ge2) 200 else 7 + if ((city == ge || city == ge2) && RandomFunction.random(100) < 90) { + if (!bot.bank.isEmpty) { + state = State.FIND_GE + } + return + } + scriptAPI.randomWalkTo(city, roamDistance) + return + } + + if (RandomFunction.random(1000) <= 50) { + if (city != ge && city != ge2) { + immerse() + return + } else { + return + } + } + + if ((city == ge || city == ge2) && RandomFunction.random(1000) >= 999) { + ticks = 0 + city = getRandomCity() + state = State.TELEPORTING + } + + if (city == ge || city == ge2) { + return + } + + if (counter++ >= 240 && RandomFunction.random(100) >= 10) { + city = getRandomCity() + if (RandomFunction.random(100) % 2 == 0) { + counter = 0 + ticks = 0 + state = State.TELEPORTING + } else { + if (citygroupA.contains(city)) { + city = citygroupA.random() + } else { + city = citygroupB.random() + } + counter = 0 + ticks = 0 + state = State.FIND_CITY + } + counter = 0 + return + } + return + } + + State.GE -> { + var ge = false + if (counter++ == 180) { + state = State.TELEPORTING + } + if (!sold) { + if (counter++ >= 15) { + sold = true + ge = true + counter = 0 + ticks = 0 + scriptAPI.sellAllOnGeAdv() + return + } + } else if (ge && sold) { + ge = false + city = getRandomCity() + state = State.TELEPORTING + } + return + } + + State.FIND_GE -> { + if (counter++ == 180) { + state = State.TELEPORTING + } + sold = false + val ge: GameObject? = scriptAPI.getNearestNode("Desk", true) as GameObject? + if (ge == null || bot.bank.isEmpty) state = State.EXPLORE + class GEPulse : MovementPulse(bot, ge, DestinationFlag.OBJECT) { + override fun pulse(): Boolean { + bot.faceLocation(ge?.location) + state = State.GE + return true + } + } + if (ge != null && !bot.bank.isEmpty) { + counter = 0 + scriptAPI.randomWalkTo(geloc, 3) + GameWorld.Pulser.submit(GEPulse()) + } + return + } + + State.FIND_BANK -> { + if (counter++ == 300) { + state = State.TELEPORTING + } + val bank: GameObject? = scriptAPI.getNearestNode("Bank booth", true) as GameObject? + if (badedge.insideBorder(bot) || bot.location == badedge2 || bot.location == badedge3 || bot.location == badedge4) { + bot.randomWalk(5, 5) + } + if (bank == null) state = State.EXPLORE + class BankingPulse : MovementPulse(bot, bank, DestinationFlag.OBJECT) { + override fun pulse(): Boolean { + bot.faceLocation(bank?.location) + state = State.IDLE_BANKS + return true + } + } + if (bank != null) { + bot.pulseManager.run(BankingPulse()) + } + return + } + + State.IDLE_BANKS -> { + if (counter++ == 300) { + state = State.TELEPORTING + } + if (RandomFunction.random(1000) < 100) { + for (item in bot.inventory.toArray()) { + item ?: continue + when (item.id) { + 1357, 590, 1271, 995 -> continue + } + bot.bank.add(item) + bot.inventory.remove(item) + } + counter = 0 + state = State.EXPLORE + } + return + } + + State.FIND_CITY -> { + if (counter++ >= 600 || (city == ge || city == ge2)) { + counter = 0 + scriptAPI.teleport(getRandomCity().also { city = it }) + state = State.EXPLORE + } + if (bot.location.equals(city)) { + state = State.EXPLORE + } else { + scriptAPI.randomWalkTo(city, 5) + } + return + } + + State.IDLE_CITY -> { + if (counter++ == 300) { + state = State.TELEPORTING + } + var random = (120..300).random() + if (counter++ == random && RandomFunction.random(1000) % 33 == 0) { + counter = 0 + state = State.EXPLORE + } + return + } + } + + } + + enum class State{ + START, + EXPLORE, + FIND_BANK, + IDLE_BANKS, + FIND_CITY, + IDLE_CITY, + GE, + TELEPORTING, + LOOT, + LOOT_DELAY, + FIND_GE + } + + + override fun newInstance(): Script { + val script = Adventurer(style) + script.state = State.START + val tier = CombatBotAssembler.Tier.MED + if (type == CombatBotAssembler.Type.RANGE) + script.bot = CombatBotAssembler().RangeAdventurer(tier, bot.startLocation) + else + script.bot = CombatBotAssembler().MeleeAdventurer(tier, bot.startLocation) + return script + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ChickenKiller.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ChickenKiller.kt new file mode 100644 index 000000000..442fec043 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ChickenKiller.kt @@ -0,0 +1,79 @@ +package plugin.ai.general.scriptrepository + +import core.game.system.SystemLogger +import core.game.world.map.Location +import core.tools.Items +import plugin.ai.general.ScriptAPI + +@PlayerCompatible +@ScriptName("Chicken Killer") +@ScriptDescription("Kills chickens and loots feathers. Start in any chicken area.") +@ScriptIdentifier("chicken_killer") +class ChickenKiller : Script(){ + var state = State.INIT + var chickenCounter = 0 + var overlay: ScriptAPI.BottingOverlay?= null + var startLocation = Location(0,0,0) + var timer = 3 + var lootFeathers = false + + override fun tick() { + when(state){ + + State.INIT -> { + overlay = scriptAPI.getOverlay() + overlay!!.init() + overlay!!.setTitle("Chickens") + overlay!!.setTaskLabel("Chickens KO'd:") + overlay!!.setAmount(0) + state = State.CONFIG + bot.dialogueInterpreter.sendOptions("Loot Feathers?","Yes","No") + bot.dialogueInterpreter.addAction{player,button -> + lootFeathers = button == 2 + state = State.KILLING + } + startLocation = bot.location + } + + State.KILLING -> { + val chicken = scriptAPI.getNearestNode("Chicken") + if(chicken == null){ + scriptAPI.randomWalkTo(startLocation,3) + } else { + scriptAPI.attackNpcInRadius(bot,"Chicken",10) + if(lootFeathers) { + state = State.IDLE + timer = 4 + } + chickenCounter++ + overlay!!.setAmount(chickenCounter) + } + } + + State.IDLE -> { + if(timer-- <= 0){ + state = State.LOOTING + } + } + + State.LOOTING -> { + scriptAPI.takeNearestGroundItem(Items.FEATHER_314) + state = State.KILLING + } + + } + } + + override fun newInstance(): Script { + return this + } + + enum class State { + IDLE, + INIT, + KILLING, + LOOTING, + RETURN, + CONFIG + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CoalMiner.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CoalMiner.kt new file mode 100644 index 000000000..6f0606ec4 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CoalMiner.kt @@ -0,0 +1,158 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.item.Item +import core.game.world.map.zone.ZoneBorders +import core.tools.Items +import plugin.ai.general.ScriptAPI +import plugin.ai.skillingbot.SkillingBotAssembler +import core.game.node.entity.skill.Skills + +@PlayerCompatible +@ScriptName("Falador Coal Miner") +@ScriptDescription("Start in Falador East Bank with a pick equipped","or in your inventory.") +@ScriptIdentifier("fally_coal") +class CoalMiner() : Script() { + var state = State.INIT + var ladderSwitch = false + + val bottomLadder = ZoneBorders(3016,9736,3024,9742) + val topLadder = ZoneBorders(3016,3336,3022,3342) + val mine = ZoneBorders(3027,9733,3054,9743) + val bank = ZoneBorders(3009,3355,3018,3358) + var overlay: ScriptAPI.BottingOverlay? = null + var coalAmount = 0 + + override fun tick() { + when(state){ + + State.INIT -> { + overlay = scriptAPI.getOverlay() + ladderSwitch = true + overlay!!.init() + overlay!!.setTitle("Mining") + overlay!!.setTaskLabel("Coal Mined:") + overlay!!.setAmount(0) + + if (mine.insideBorder(bot)){ + ladderSwitch = false + state = State.MINING + } else { + state = State.TO_MINE + } + } + + State.MINING -> { + if(bot.inventory.freeSlots() == 0){ + state = State.TO_BANK + } + if(!mine.insideBorder(bot)){ + scriptAPI.walkTo(mine.randomLoc) + } else { + val rock = scriptAPI.getNearestNode("rocks",true) + rock?.interaction?.handle(bot,rock.interaction[0]) + } + overlay!!.setAmount(bot.inventory.getAmount(Items.COAL_453) + coalAmount) + } + + State.TO_BANK -> { + if(bank.insideBorder(bot)){ + val bank = scriptAPI.getNearestNode("bank booth",true) + if(bank != null) { + bot.pulseManager.run(object : BankingPulse(this, bank){ + override fun pulse(): Boolean { + state = State.BANKING + return super.pulse() + } + }) + } + + } else { + if(!ladderSwitch) { + val ladder = scriptAPI.getNearestNode(30941, true) + ladder ?: scriptAPI.walkTo(bottomLadder.randomLoc).also { return } + ladder?.interaction?.handle(bot, ladder.interaction[0]).also { ladderSwitch = true } + } else { + if (!bank.insideBorder(bot)) scriptAPI.walkTo(bank.randomLoc).also { return } + } + } + } + + State.BANKING -> { + coalAmount += bot.inventory.getAmount(Items.COAL_453) + scriptAPI.bankItem(Items.COAL_453) + state = State.TO_MINE + } + + State.TO_MINE -> { + if(ladderSwitch){ + if(!topLadder.insideBorder(bot.location)){ + scriptAPI.walkTo(topLadder.randomLoc) + } else { + val ladder = scriptAPI.getNearestNode("Ladder",true) + if(ladder != null){ + ladder.interaction.handle(bot,ladder.interaction[0]) + ladderSwitch = false + } else { + scriptAPI.walkTo(topLadder.randomLoc) + } + } + } else { + if(!mine.insideBorder(bot)){ + scriptAPI.walkTo(mine.randomLoc) + } else { + state = State.MINING + } + } + } + + State.TO_GE -> { + scriptAPI.teleportToGE() + state = State.SELLING + } + + State.SELLING -> { + scriptAPI.sellOnGE(Items.COAL_453) + state = State.GO_BACK + } + + State.GO_BACK -> { + scriptAPI.teleport(bank.randomLoc) + state = State.TO_MINE + } + + } + } + + open class BankingPulse(val script: Script, val bank: Node) : MovementPulse(script.bot,bank, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + script.bot.faceLocation(bank.location) + return true + } + } + + override fun newInstance(): Script { + val script = CoalMiner() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.POOR,bot.startLocation) + return script + } + + enum class State { + MINING, + TO_MINE, + TO_BANK, + BANKING, + TO_GE, + SELLING, + GO_BACK, + INIT + } + + init { + equipment.add(Item(Items.IRON_PICKAXE_1267)) + skills.put(Skills.MINING,75) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CowKiller.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CowKiller.kt new file mode 100644 index 000000000..2a8415c53 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/CowKiller.kt @@ -0,0 +1,155 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.game.world.map.zone.ZoneBorders +import core.tools.Items +import plugin.ai.pvmbots.CombatBotAssembler + +class CowKiller : Script() { + var state = State.KILLING + var spawnZone = ZoneBorders(3254,3255,3264,3281) + var cowZone = ZoneBorders(3242, 3254,3265, 3296) + val bankZone = ZoneBorders(3208, 3217,3210, 3220) + init { + cowZone.addException(ZoneBorders(3242,3254,3252,3277)) + cowZone.addException(ZoneBorders(3242,3277,3242,3296)) + cowZone.addException(ZoneBorders(3253, 3267,3253, 3267)) + } + + override fun tick() { + when(state){ + State.KILLING -> { + scriptAPI.attackNpcInRadius(bot,"Cow",10) + state = State.LOOTING + } + + State.LOOTING -> { + bot.pulseManager.run(object: Pulse(4){ + override fun pulse(): Boolean { + state = State.KILLING + scriptAPI.takeNearestGroundItem(Items.COWHIDE_1739) + state = if(bot.inventory.getAmount(Items.COWHIDE_1739) > 22){ + State.TO_BANK + } else { + State.KILLING + } + return true + } + }) + } + + State.TO_BANK -> { + if(cowZone.insideBorder(bot)) + scriptAPI.walkTo(Location.create(3253, 3267, 0)) + else{ + val closedGate = scriptAPI.getNearestNode(15516,true) + if(closedGate != null && closedGate.location.withinDistance(bot.location,2)){ + closedGate.interaction.handle(bot,closedGate.interaction[0]) + } else { + when (bot.location) { + Location.create(3212, 3227, 0) -> { + val stairs = scriptAPI.getNearestGameObject(bot.location, 36776) + stairs?.interaction?.handle(bot, stairs.interaction[0]) + } + Location.create(3206, 3229, 1) -> { + val stairs = scriptAPI.getNearestNode(36777, true) + stairs?.interaction?.handle(bot, stairs.interaction[1]) + } + Location.create(3206, 3229, 2) -> { + scriptAPI.walkTo(bankZone.randomLoc) + state = State.BANKING + } + else -> scriptAPI.walkTo(Location.create(3212, 3227, 0)) + } + } + } + } + + State.BANKING -> { + if(bankZone.insideBorder(bot)) { + val bank = scriptAPI.getNearestNode(36786, true) + bot.pulseManager.run(object : MovementPulse(bot, bank, DestinationFlag.OBJECT) { + override fun pulse(): Boolean { + scriptAPI.bankItem(Items.COWHIDE_1739) + if (bot.bank.getAmount(Items.COWHIDE_1739) > 75) { + scriptAPI.teleportToGE() + state = State.TELE_GE + } else { + state = State.BACK_TO_COWS + } + return true + } + }) + } + } + + + State.BACK_TO_COWS -> { + if (bankZone.insideBorder(bot)) + scriptAPI.walkTo(Location.create(3206, 3229, 2)) + else { + when (bot.location) { + Location.create(3206, 3229, 2) -> { + val stairs = scriptAPI.getNearestNode(36778, true) + stairs?.interaction?.handle(bot, stairs.interaction[0]) + } + Location.create(3206, 3229, 1) -> { + val stairs = scriptAPI.getNearestNode(36777, true) + stairs?.interaction?.handle(bot, stairs.interaction[2]) + } + Location.create(3252, 3267, 0) -> { + val closedGate = scriptAPI.getNearestNode(15516, true) + if (closedGate != null && closedGate.location.withinDistance(bot.location, 2)) { + closedGate.interaction.handle(bot, closedGate.interaction[0]) + } else { + scriptAPI.walkTo(cowZone.randomLoc) + state = State.KILLING + } + } + else -> scriptAPI.walkTo(Location.create(3252, 3267, 0)) + } + } + } + + + State.TELE_GE -> { + if(bot.location == Location.create(3165, 3482, 0)) + state = State.SELL_GE + else + scriptAPI.walkTo(Location.create(3165, 3482, 0)) + } + + State.SELL_GE -> { + state = State.TELE_LUM + scriptAPI.sellOnGE(Items.COWHIDE_1739) + } + + State.TELE_LUM -> { + state = State.BACK_TO_COWS + scriptAPI.teleport(Location.create(3222, 3218, 0)) + } + } + } + + enum class State { + KILLING, + LOOTING, + BANKING, + TO_BANK, + BACK_TO_COWS, + SELL_GE, + TELE_GE, + TELE_LUM + } + + override fun newInstance(): Script { + val script = CowKiller() + script.bot = CombatBotAssembler().produce(CombatBotAssembler.Type.values().random(),CombatBotAssembler.Tier.LOW,spawnZone.randomLoc) + script.state = State.KILLING + return script + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorFisher.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorFisher.kt new file mode 100644 index 000000000..474794191 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorFisher.kt @@ -0,0 +1,66 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.item.Item +import core.game.world.map.Location +import core.game.world.map.zone.ZoneBorders +import core.tools.Items +import plugin.ai.skillingbot.SkillingBotAssembler + +class DraynorFisher : Script() { + val fishingZone = ZoneBorders(3085, 3223,3089, 3233) + val bankZone = ZoneBorders(3092, 3240,3094, 3246) + + + var state = State.FISHING + override fun tick() { + when(state){ + State.FISHING -> { + if(!fishingZone.insideBorder(bot)) + scriptAPI.walkTo(fishingZone.randomLoc) + else { + val spot = scriptAPI.getNearestNode(316,false) + spot?.interaction?.handle(bot,spot.interaction[0]) ?: scriptAPI.walkTo(fishingZone.randomLoc) + if(bot.inventory.getMaximumAdd(Item(4151)) < 5) + state = State.BANKING + } + } + + State.BANKING -> { + if(!bankZone.insideBorder(bot)) + scriptAPI.walkTo(bankZone.randomLoc) + else { + val bank = scriptAPI.getNearestNode("Bank booth") + if (bank != null){ + bot.pulseManager.run(object : MovementPulse(bot,bank, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + bot.inventory.clear() + state = State.FISHING + bot.inventory.add(Item(Items.SMALL_FISHING_NET_303)) + return true + } + }) + } + } + } + + + } + } + + override fun newInstance(): Script { + val script = DraynorFisher() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.POOR, Location.create(3094, 3242, 0)) + return script + } + + init { + inventory.add(Item(Items.SMALL_FISHING_NET_303)) + } + + enum class State { + FISHING, + BANKING + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorWillows.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorWillows.kt new file mode 100644 index 000000000..952d75e4b --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/DraynorWillows.kt @@ -0,0 +1,90 @@ +package plugin.ai.general.scriptrepository + +import core.game.component.Component +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.item.Item +import core.game.world.map.zone.ZoneBorders +import core.tools.Items +import core.game.node.entity.skill.Skills +import core.tools.stringtools.colorize + +@PlayerCompatible +@ScriptName("Draynor Willows") +@ScriptDescription("Start in Draynor with an axe equipped or in inventory.") +@ScriptIdentifier("draynor_trees") +class DraynorWillows : Script(){ + val willowZone = ZoneBorders(3084, 3225,3091, 3239) + + + val bankZone = ZoneBorders(3092, 3240,3094, 3246) + var state = State.INIT + var logCount = 0 + + override fun tick() { + when(state){ + State.INIT -> { + if(true){ + bot.interfaceManager.openOverlay(Component(195)) + bot.packetDispatch.sendString("Woodcutting",195,7) + bot.packetDispatch.sendString(colorize("%BLogs Chopped:"),195,8) + bot.packetDispatch.sendString(colorize("%B0"),195,9) + bot.packetDispatch.sendInterfaceConfig(195,5,true) + } + state = State.CHOPPING + } + + State.CHOPPING -> { + if (!willowZone.insideBorder(bot)) + scriptAPI.walkTo(willowZone.randomLoc) + else { + val willowtree = scriptAPI.getNearestNode("willow", true) + willowtree?.interaction?.handle(bot, willowtree.interaction[0]) + if (bot.inventory.isFull) + state = State.BANKING + } + + bot.packetDispatch.sendString(colorize("%B${logCount + bot.inventory.getAmount(Items.WILLOW_LOGS_1519)}"), 195, 9) + } + + State.BANKING -> { + if(!bankZone.insideBorder(bot)) + scriptAPI.walkTo(bankZone.randomLoc) + else{ + val bank = scriptAPI.getNearestNode("Bank Booth",true) + if(bank != null){ + bot.pulseManager.run(object : MovementPulse(bot,bank, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + val logs = bot.inventory.getAmount(Item(Items.WILLOW_LOGS_1519)) + logCount += logs + bot.inventory.remove(Item(Items.WILLOW_LOGS_1519,logs)) + bot.bank.add(Item(Items.WILLOW_LOGS_1519,logs)) + state = State.CHOPPING + return true + } + }) + } + } + } + + + + } + } + + init { + inventory.add(Item(Items.ADAMANT_AXE_1357)) + skills[Skills.WOODCUTTING] = 35 + } + + override fun newInstance(): Script { + val script = DraynorWillows() + return script + } + + enum class State { + CHOPPING, + BANKING, + INIT + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FarmerThiever.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FarmerThiever.kt new file mode 100644 index 000000000..68460146e --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FarmerThiever.kt @@ -0,0 +1,30 @@ +package plugin.ai.general.scriptrepository + +import core.game.world.map.zone.ZoneBorders +import plugin.ai.skillingbot.SkillingBotAssembler +import core.game.node.entity.skill.Skills + +class FarmerThiever : Script() { + val pickpocketZone = ZoneBorders(3074,3245,3086,3255) + + + override fun tick() { + if(!pickpocketZone.insideBorder(bot)) + scriptAPI.walkTo(pickpocketZone.randomLoc) + else{ + val farmer = scriptAPI.getNearestNode(2234,false) + farmer?.interaction?.handle(bot,farmer.interaction[2]) ?: scriptAPI.walkTo(pickpocketZone.randomLoc) + + } + } + + override fun newInstance(): Script { + val script = FarmerThiever() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.POOR,bot.startLocation) + return script + } + + init { + skills[Skills.THIEVING] = 80 + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FletchingBankstander.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FletchingBankstander.kt new file mode 100644 index 000000000..ce8216329 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/FletchingBankstander.kt @@ -0,0 +1,44 @@ +package plugin.ai.general.scriptrepository + +import core.game.node.item.Item +import core.tools.Items +import plugin.ai.skillingbot.SkillingBotAssembler +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.fletching.Fletching +import core.game.node.entity.skill.fletching.FletchingPulse + +class FletchingBankstander : Script(){ + var state = State.FLETCHING + override fun tick() { + val bank = scriptAPI.getNearestNode("Bank booth") + bot.faceLocation(bank?.location) + state = when(state){ + State.FLETCHING -> { + bot.inventory.add(Item(Items.KNIFE_946)) + bot.inventory.add(Item(Items.LOGS_1511,27)) + bot.pulseManager.run(FletchingPulse(bot, Item(Items.LOGS_1511),27,Fletching.FletchingItems.ARROW_SHAFT)) + State.BANKING + } + + State.BANKING -> { + bot.inventory.clear() + State.FLETCHING + } + } + } + + init { + skills[Skills.FLETCHING] = 99 + } + + override fun newInstance(): Script { + val script = FletchingBankstander() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.AVERAGE,bot.startLocation) + return script + } + + enum class State { + FLETCHING, + BANKING + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GenericSlayerBot.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GenericSlayerBot.kt new file mode 100644 index 000000000..f0a799bbc --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GenericSlayerBot.kt @@ -0,0 +1,256 @@ +package plugin.ai.general.scriptrepository + +import core.tools.Items +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.game.world.map.zone.ZoneBorders +import core.tools.RandomFunction +import plugin.ai.AIRepository +import core.game.node.entity.skill.Skills + +/** + * A bot that does various random slayer tasks throughout the game and sells the loot on the GE. + * @author Ceikry + */ +class GenericSlayerBot : Script() { + var state = State.GETTING_TASK + var task = Task.CAVE_CRAWLER //default value to ensure non-nullability + var assignment = Assignment("",0) //same as above + var teleportFlag = false //have we teleported? + val FOOD_ID = Items.LOBSTER_379 + val varrockBankBorders = ZoneBorders(3184, 3435,3187, 3441) + + + + /** + * Per-tick actions (they don't run if the bot already has a pulse running, such as moving or combat.) + */ + override fun tick() { + scriptAPI.eat(FOOD_ID) //try to eat every tick (does nothing if health isn't low enough) + + when(state){ + + /** + * State that handles getting a new task + */ + State.GETTING_TASK -> { + populateTaskAndAssignment() + state = State.GOING_TO_HUB //switch states + } + + /** + * State that handles going to the "hub" for the task. Such as fremmy slayer cave or slayer tower. + */ + State.GOING_TO_HUB -> { + when(task.hub){ + + TaskHub.FREMENNIK_CAVE -> { + if(!teleportFlag) { + scriptAPI.teleport(Location.create(2781, 3615, 0)) //tele -> fremennik fairy ring + teleportFlag = !teleportFlag //teleportFlag -> true + } + else { + val entrance = scriptAPI.getNearestNode(4499,true) //returns the object if within render distance, null if not. + if(entrance == null || !entrance.location.withinDistance(bot.location,2)) { + scriptAPI.walkTo(Location.create(2796, 3615, 0)) + } else { + entrance.interaction.handle(bot,entrance.interaction[0]) //bot -> use interaction [0] of cave object + teleportFlag = !teleportFlag //teleportFlag -> false + state = State.KILLING_ENEMY //switch states + } + } + } + + } + } + + + /** + * State used for combat. Handles moving the bot back into the zone for the monster and looting as well. + */ + State.KILLING_ENEMY -> { + val items = AIRepository.groundItems.get(bot) //retrieve drops that belong to this bot + if(items != null && items.isNotEmpty()){ //if we have loot... + if(bot.inventory.freeSlots() == 0){ + if(bot.inventory.contains(FOOD_ID,1)){ + scriptAPI.forceEat(FOOD_ID) + return + } + } + scriptAPI.takeNearestGroundItem(items.get(0).id) + if(bot.inventory.getAmount(Item(FOOD_ID)) == 0){ + state = State.GOING_TO_BANK + } + return + } + + if(assignment.amount > 0) { + if (task.borders.insideBorder(bot)) { //make sure bot is within the borders of the task's zone. + scriptAPI.attackNpcInRadius(bot, task.npc_name, 20) //attack nearest NPC with given task name within radius. + assignment.amount-- + } else { + scriptAPI.walkTo(task.borders.randomLoc) + } + } else { + state = State.GOING_TO_BANK //switch states and bank. + } + } + + /** + * State used to handle traveling to a bank. Due to the dynamic nature of where these bots might be + * in this state, they simply teleport to Varrock and then walk to the west bank to bank. + */ + State.GOING_TO_BANK -> { + if(!teleportFlag){ + scriptAPI.teleport(Location.create(3213, 3426, 0)) + teleportFlag = !teleportFlag + } else { + if(!varrockBankBorders.insideBorder(bot)) { + scriptAPI.walkTo(varrockBankBorders.randomLoc) + } else { + val bank = scriptAPI.getNearestNode("Bank Booth",true) + bank ?: return + /** + * Run a pulse that moves the bot to the bank booth and then faces it, and then swaps to the actual banking state + */ + bot.pulseManager.run(object: MovementPulse(bot,bank, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + bot.faceLocation(bank.location) + state = State.BANKING + teleportFlag = !teleportFlag + return true + } + }) + } + } + } + + /** + * State used to handle banking itself. Runs a pulse with a delay of 10 (to make it look like the bot is idling at the bank booth a bit.) + * the pulse adds every item in the bot's inventory to its bank and then clears the bot's inventory. Re-adds lobsters to the inventory afterwords. + */ + State.BANKING -> { + bot.pulseManager.run(object: Pulse(10){ + override fun pulse(): Boolean { + for(item in bot.inventory.toArray()){ + item ?: continue + if(item.checkIgnored()) continue + bot.bank.add(item) + } + bot.inventory.clear() + for(item in inventory) + bot.inventory.add(item) + scriptAPI.withdraw(core.tools.Items.LOBSTER_379,10) + bot.fullRestore() + + if(assignment.amount <= 0){ + state = State.GOING_TO_GE + } else { + state = State.GOING_TO_HUB + } + + return true + } + }) + } + + + /** + * State used to handle travelling to the GE. + */ + State.GOING_TO_GE -> { + if(bot.location != Location.create(3165, 3487, 0)) { + scriptAPI.walkTo(Location.create(3165, 3487, 0)) + } else { + state = State.SELLING + } + } + + /** + * State used to handle selling items on the GE + */ + State.SELLING -> { + scriptAPI.sellAllOnGe() + state = State.GETTING_TASK + } + + } + } + + + /** + * Called when a bot needs to be regenerated, like when a bot dies. + */ + override fun newInstance(): Script { + TODO("Not yet implemented") + } + + /** + * Populate task and assignment vars + */ + fun populateTaskAndAssignment() { + task = Task.values().random() //get a new random task from the enum + assignment = Assignment(task.npc_name, RandomFunction.random(task.minAmt, task.maxAmt + 1)) //produce a new Assignment class with values from our Task. + } + + + /** + * Item extension function to check for ignored items when banking. + */ + fun Item.checkIgnored(): Boolean { + if(name.toLowerCase().contains("charm")) return true + if(name.toLowerCase().contains("lobster")) return true + if(name.toLowerCase().contains("clue")) return true + if(!definition.isTradeable) return true + return when(id){ + Items.BONES_2530 -> true + 995 -> true + else -> false + } + } + + /** + * The state enums + */ + enum class State { + GETTING_TASK, + GOING_TO_HUB, + KILLING_ENEMY, + LOOTING, + GOING_TO_BANK, + BANKING, + GOING_TO_GE, + SELLING + } + + /** + * Assign default skills and initial inventory + */ + init { + skills[Skills.SLAYER] = 99 + inventory.add(Item(Items.LOBSTER_379,10)) + + } + + /** + * List of tasks that this bot can receive + */ + enum class Task(val npc_name: String, val minAmt: Int, val maxAmt: Int, val hub: TaskHub, val borders: ZoneBorders) { + CAVE_CRAWLER("Cave crawler",20,100,TaskHub.FREMENNIK_CAVE, ZoneBorders(2778, 9988,2798, 10002)) + } + + /** + * The task hubs + */ + enum class TaskHub { + FREMENNIK_CAVE, + SLAYER_TOWER, + TAVERLY_DUNGEON + } + + class Assignment(val npc_name: String, var amount: Int) //class used to keep track of current assignment and how many are left. +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GlassBlowingBankstander.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GlassBlowingBankstander.kt new file mode 100644 index 000000000..4ec8a4e4a --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GlassBlowingBankstander.kt @@ -0,0 +1,44 @@ +package plugin.ai.general.scriptrepository + +import core.game.node.item.Item +import core.tools.Items +import plugin.ai.skillingbot.SkillingBotAssembler +import core.game.interaction.inter.GlassInterface +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.crafting.GlassProduct + +class GlassBlowingBankstander : Script(){ + var state = State.BLOWING + override fun tick() { + val bank = scriptAPI.getNearestNode("Bank booth") + bot.faceLocation(bank?.location) + state = when(state){ + State.BLOWING -> { + bot.inventory.add(Item(Items.GLASSBLOWING_PIPE_1785)) + bot.inventory.add(Item(Items.MOLTEN_GLASS_1775,27)) + GlassInterface.make(bot,GlassProduct.ORB,27) + State.BANKING + } + + State.BANKING -> { + bot.inventory.clear() + State.BLOWING + } + } + } + + override fun newInstance(): Script { + val script = GlassBlowingBankstander() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.AVERAGE,bot.startLocation) + return script + } + + init { + skills[Skills.CRAFTING] = 99 + } + + enum class State { + BLOWING, + BANKING + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GreenDragonKiller.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GreenDragonKiller.kt new file mode 100644 index 000000000..7b174254a --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/GreenDragonKiller.kt @@ -0,0 +1,299 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.entity.Entity +import core.game.node.entity.combat.CombatStyle +import core.game.node.entity.combat.CombatSwingHandler +import core.game.node.entity.combat.InteractionType +import core.game.node.entity.combat.handlers.MagicSwingHandler +import core.game.node.entity.combat.handlers.MeleeSwingHandler +import core.game.node.entity.combat.handlers.RangeSwingHandler +import core.game.node.entity.player.Player +import core.game.node.entity.state.EntityState +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.system.task.Pulse +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.map.zone.ZoneBorders +import core.game.world.map.zone.impl.WildernessZone +import core.tools.Items +import plugin.ai.AIRepository +import plugin.ai.pvmbots.CombatBotAssembler +import core.game.ge.OfferState +import core.game.node.entity.skill.Skills +import kotlin.random.Random + +/** + * A bot script for killing green dragons in the wilderness.. Capable of banking, selling on ge, buying on ge, eating and more. + * @param style The combat style the bot is going to use. + * @param area (optional) What area the bot tries to kill dragons in. + * @author Ceikry + */ +class GreenDragonKiller(val style: CombatStyle, area: ZoneBorders? = null) : Script() { + var state = State.KILLING + var handler: CombatSwingHandler? = null + var lootDelay = 0 + var offerMade = false + + var food = if (Random.nextBoolean()){ + Items.LOBSTER_379 + } else if(Random.nextBoolean()){ + Items.SWORDFISH_373 + } else { + Items.SHARK_385 + } + + var myBorders: ZoneBorders? = null + val type = when(style){ + CombatStyle.MELEE -> CombatBotAssembler.Type.MELEE + CombatStyle.MAGIC -> CombatBotAssembler.Type.MAGE + CombatStyle.RANGE -> CombatBotAssembler.Type.RANGE + } + + val westDragons = ZoneBorders(2971,3606,2991,3628) + val wildernessLine = ZoneBorders(3078,3523,3096,3523) + val edgevilleLine = ZoneBorders(3078,3520,3096,3520) + val bankZone = ZoneBorders(3092,3489,3094,3493) + override fun tick() { + if(!bot.isActive){ + running = false + return + } + if(bot.inventory.getAmount(food) < 3 && state == State.KILLING) + state = State.TO_BANK + scriptAPI.eat(food) + when(state){ + + + + State.KILLING -> { + bot.properties.combatPulse.temporaryHandler = handler + scriptAPI.attackNpcInRadius(bot,"Green dragon",20) + state = State.LOOT_DELAYER + } + + State.LOOT_DELAYER -> { + if(lootDelay < 3) + lootDelay++ + else + state = State.LOOTING + } + + + State.RUNNING -> { + val players = RegionManager.getLocalPlayers(bot.location) + if(players.isEmpty()){ + state = State.TO_DRAGONS + } else { + if(bot.skullManager.level < 21 && bot.stateManager.get(EntityState.TELEBLOCK) != null){ + scriptAPI.teleportToGE() + state = State.REFRESHING + return + } + scriptAPI.walkTo(WildernessZone.getInstance().borders.random().randomLoc) + } + } + + State.LOOTING -> { + lootDelay = 0 + val items = AIRepository.groundItems.get(bot) + if(items.isNullOrEmpty()) {state = State.KILLING; return} + if(bot.inventory.isFull) { + if(bot.inventory.containsItem(Item(food))){ + scriptAPI.forceEat(food) + } else { + state = State.TO_BANK + } + return + } + items.forEach {it: Item -> scriptAPI.takeNearestGroundItem(it.id)} + } + + State.TO_BANK -> { + if(!wildernessLine.insideBorder(bot) && bot.location.y > 3521) + scriptAPI.walkTo(wildernessLine.randomLoc) + if(wildernessLine.insideBorder(bot)){ + val ditch = scriptAPI.getNearestNode("Wilderness Ditch",true) + ditch ?: return + ditch.interaction.handle(bot,ditch.interaction[0]) + } + if(!bankZone.insideBorder(bot)) + scriptAPI.walkTo(bankZone.randomLoc) + if(bankZone.insideBorder(bot)){ + val bank = scriptAPI.getNearestNode("Bank Booth",true) + bank ?: return + bot.pulseManager.run(object: MovementPulse(bot,bank, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + bot.faceLocation(bank.location) + state = State.BANKING + return true + } + }) + } + } + + State.BANKING -> { + bot.pulseManager.run(object: Pulse(25){ + override fun pulse(): Boolean { + for(item in bot.inventory.toArray()){ + item ?: continue + if(item.name.toLowerCase().contains("lobster") || item.name.toLowerCase().contains("swordfish") || item.name.toLowerCase().contains("shark")) continue + if(item.id == 995) continue + bot.bank.add(item) + } + bot.inventory.clear() + state = if(bot.bank.getAmount(food) < 10) + State.TO_GE + else + State.TO_DRAGONS + for(item in inventory) + bot.inventory.add(item) + scriptAPI.withdraw(food,10) + bot.fullRestore() + return true + } + }) + } + + State.BUYING_FOOD -> { + if(!offerMade) + { + scriptAPI.buyFromGE(bot, food, 100) + offerMade = true + } else + { + val offer = AIRepository.getOffer(bot) + if (offer == null) { + offerMade = false + } else { + if (offer.completedAmount == offer.amount) { + state = State.TO_DRAGONS + offer.offerState = OfferState.REMOVED + bot.bank.add(Item(offer.itemID, offer.completedAmount)) + bot.bank.refresh() + scriptAPI.withdraw(food, 10) + } + } + } + } + + State.TO_DRAGONS -> { + offerMade = false + if(bot.location.x >= 3143){ + if(bot.location != Location.create(3144, 3514, 0)) + scriptAPI.walkTo(Location.create(3144, 3514, 0)) + else { + val shortcut = scriptAPI.getNearestNode("Underwall Tunnel",true) + shortcut ?: return + shortcut.interaction.handle(bot,shortcut.interaction[0]) + } + } else { + if (!edgevilleLine.insideBorder(bot) && bot.location.y < 3520) { + scriptAPI.walkTo(edgevilleLine.randomLoc) + return + } + if (edgevilleLine.insideBorder(bot)) { + val ditch = scriptAPI.getNearestNode("Wilderness Ditch", true) + ditch ?: return + ditch.interaction.handle(bot, ditch.interaction[0]).also { return } + } + if (bot.location.y > 3520 && !myBorders!!.insideBorder(bot)) + scriptAPI.walkTo(myBorders!!.randomLoc).also { return } + if (myBorders!!.insideBorder(bot)) + state = State.KILLING + } + } + + State.TO_GE -> { + if(bot.location.x < 3143) { + if(bot.location == Location.create(3136, 3517, 0)){ + val shortcut = scriptAPI.getNearestNode("Underwall Tunnel",true) + shortcut ?: return + shortcut.interaction.handle(bot,shortcut.interaction[0]) + } else { + scriptAPI.walkTo(Location.create(3136, 3517, 0)) + } + return + } + if(bot.location != Location.create(3165, 3487, 0)) { + scriptAPI.walkTo(Location.create(3165, 3487, 0)) + } else { + state = State.SELL_GE + } + } + + State.SELL_GE -> { + scriptAPI.sellAllOnGe() + state = State.BUYING_FOOD + } + + State.REFRESHING -> { + running = false + return + } + + } + } + + override fun newInstance(): Script { + val script = GreenDragonKiller(style) + val tier = CombatBotAssembler.Tier.HIGH + if(type == CombatBotAssembler.Type.RANGE) + script.bot = CombatBotAssembler().assembleRangeDragonBot(tier,bot.startLocation) + else + script.bot = CombatBotAssembler().assembleMeleeDragonBot(tier, bot.startLocation) + return script + } + + enum class State { + KILLING, + RUNNING, + LOOTING, + LOOT_DELAYER, + BANKING, + TO_BANK, + TO_DRAGONS, + TO_GE, + SELL_GE, + REFRESHING, + BUYING_FOOD + + } + + init { + handler = when(style){ + CombatStyle.MELEE -> MeleeSwinger(this) + CombatStyle.MAGIC -> MageSwinger(this) + CombatStyle.RANGE -> RangeSwinger(this) + } + equipment.add(Item(Items.ANTI_DRAGON_SHIELD_1540)) + myBorders = westDragons + skills[Skills.AGILITY] = 99 + bankZone.addException(ZoneBorders(3094, 3492,3094, 3492)) + bankZone.addException(ZoneBorders(3094, 3490,3094, 3490)) + } + + internal class MeleeSwinger(val script: GreenDragonKiller) : MeleeSwingHandler() { + override fun canSwing(entity: Entity, victim: Entity): InteractionType? { + if(script.state == State.TO_BANK) {script.bot.pulseManager.current.stop()} + if(victim is Player) {script.state = State.RUNNING; script.bot.pulseManager.current.stop()} + return super.canSwing(entity, victim) + } + } + + internal class MageSwinger(val script: GreenDragonKiller) : MagicSwingHandler() { + override fun canSwing(entity: Entity, victim: Entity): InteractionType? { + if(victim is Player) {script.state = State.RUNNING; script.bot.pulseManager.current.stop()} + return super.canSwing(entity, victim) + } + } + + internal class RangeSwinger(val script: GreenDragonKiller) : RangeSwingHandler() { + override fun canSwing(entity: Entity, victim: Entity): InteractionType? { + if(victim is Player) {script.state = State.RUNNING; script.bot.pulseManager.current.stop()} + return super.canSwing(entity, victim) + } + } +} diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Idler.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Idler.kt new file mode 100644 index 000000000..1a42dbfa3 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Idler.kt @@ -0,0 +1,17 @@ +package plugin.ai.general.scriptrepository + +import core.game.system.command.CommandSystem +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.map.path.Pathfinder +import core.tools.RandomFunction +import plugin.ai.AIPlayer + +class Idler : Script(){ + override fun tick() { + } + + override fun newInstance(): Script { + return this + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/LobsterCatcher.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/LobsterCatcher.kt new file mode 100644 index 000000000..3a7e5a57f --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/LobsterCatcher.kt @@ -0,0 +1,196 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.path.Pathfinder +import core.game.world.update.flag.context.Animation +import core.game.world.update.flag.context.Graphics +import core.tools.Items +import core.tools.RandomFunction +import plugin.ai.AIPlayer +import plugin.ai.general.ScriptAPI + +import core.game.node.entity.skill.Skills +import kotlin.random.Random + +@PlayerCompatible +@ScriptName("Catherby Lobs") +@ScriptDescription("Start in Catherby bank with a lobster pot in your inventory.") +@ScriptIdentifier("cath_lobs") +class LobsterCatcher : Script() { + private val ANIMATION = Animation(714) + val offers = HashMap() + val limit = 2000 + var myCounter = 0 + /** + * Represents the graphics to use. + */ + private val GRAPHICS = Graphics(308, 100, 50) + internal enum class Sets(val equipment: List) { + SET_1(listOf(Item(2643), Item(9470), Item(10756), Item(10394), Item(88), Item(9793))), + SET_2(listOf(Item(2643), Item(6585), Item(10750), Item(10394), Item(88), Item(9793))), + SET_3(listOf(Item(9472), Item(9470), Item(10750), Item(10394), Item(88), Item(9786))), + SET_4(listOf(Item(2639), Item(6585), Item(10752), Item(10394), Item(88), Item(9786))), + SET_5(listOf(Item(2639), Item(9470), Item(10750), Item(10394), Item(88), Item(9784))), + SET_6(listOf(Item(2639), Item(6585), Item(10750), Item(10394), Item(88), Item(9784))); + + } + + private var bots = 0 + private var lobstopper = false + var overlay: ScriptAPI.BottingOverlay?= null + var fishCounter = 0 + + private var state = State.INIT + private var tick = 0 + override fun tick() { + when(state){ + + State.INIT -> { + overlay = scriptAPI.getOverlay() + overlay!!.init() + overlay!!.setTitle("Fishing") + overlay!!.setTaskLabel("Lobs Caught:") + overlay!!.setAmount(0) + state = State.FIND_SPOT + } + + + State.BANKING -> { + fishCounter += bot.inventory.getAmount(Items.RAW_LOBSTER_377) + scriptAPI.bankItem(Items.RAW_LOBSTER_377) + state = State.IDLE + } + + + State.FISHING -> { + val spot = scriptAPI.getNearestNode(333, false) + if(spot == null){ + state = State.IDLE + } else { + spot!!.interaction.handle(bot, spot.interaction[0]) + } + if(bot.inventory.isFull){ + state = State.FIND_BANK + } + overlay!!.setAmount(fishCounter + bot.inventory.getAmount(Items.RAW_LOBSTER_377)) + } + + State.IDLE -> { + if (Random.nextBoolean()){ + state = State.FIND_SPOT + } + else if(myCounter++ >= RandomFunction.random(1,25)){ + state = State.FIND_SPOT + } + } + + State.FIND_SPOT -> { + val spot = scriptAPI.getNearestNode(333, false) + if (spot != null) { + bot.walkingQueue.reset() + state = State.FISHING + } else { + if (bot.location.x < 2837) { + Pathfinder.find(bot, Location.create(2837, 3435, 0)).walk(bot) + } else { + Pathfinder.find(bot, Location.create(2854, 3427, 0)).walk(bot) + } + } + } + + + State.FIND_BANK -> { + val bank = scriptAPI.getNearestGameObject(bot.location, 2213) + class BankingPulse : MovementPulse(bot, bank, DestinationFlag.OBJECT) { + override fun pulse(): Boolean { + bot.faceLocation(bank!!.location) + state = State.BANKING + return true + } + } + if(bank != null){ + bot.pulseManager.run(BankingPulse()) + } else { + if (bot.location.x > 2837) { + Pathfinder.find(bot, Location.create(2837, 3435, 0)).walk(bot) + } else if (bot.location.x > 2821) { + Pathfinder.find(bot, Location.create(2821, 3435, 0)).walk(bot) + } else if (bot.location.x > 2809){ + Pathfinder.find(bot,Location.create(2809, 3436, 0)).walk(bot) + } + } + } + + + State.TELEPORT_GE -> { + scriptAPI.teleportToGE() + state = State.SELL_GE + } + + + State.SELL_GE -> { + scriptAPI.sellOnGE(Items.RAW_LOBSTER_377) + state = State.TELE_CATH + } + + State.TELE_CATH -> { + if(tick++ == 10) { + bot.lock() + bot.visualize(ANIMATION, GRAPHICS) + bot.impactHandler.disabledTicks = 4 + val location = Location.create(2819, 3437, 0) + GameWorld.Pulser.submit(object : Pulse(4, bot) { + override fun pulse(): Boolean { + bot.unlock() + bot.properties.teleportLocation = location + bot.animator.reset() + state = State.IDLE + return true + } + }) + } + } + + + } + } + + + init { + val setUp = RandomFunction.random(Sets.values().size) + equipment.addAll(Sets.values()[setUp].equipment) + inventory.add(Item(301)) + skills[Skills.FISHING] = 40 + } + + enum class State{ + FISHING, + BANKING, + FIND_BANK, + FIND_SPOT, + TELEPORT_GE, + SELL_GE, + TELE_CATH, + IDLE, + INIT + } + + override fun newInstance(): Script { + if (!lobstopper && bots <= 0) { + val script = LobsterCatcher() + script.bot = AIPlayer(bot.startLocation) + script.state = State.FIND_SPOT + bots = 1 + return script + }else if (tick++ == 6000 && lobstopper) { + tick = 0 + lobstopper = false + } + return newInstance() + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ManThiever.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ManThiever.kt new file mode 100644 index 000000000..39f9469a6 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ManThiever.kt @@ -0,0 +1,22 @@ +package plugin.ai.general.scriptrepository + +import core.game.node.item.Item +import plugin.ai.skillingbot.SkillingBotAssembler +import java.util.* + +class ManThiever : Script() { + override fun tick() { + val man = scriptAPI.getNearestNode("Man") + man?.interaction?.handle(bot, man.interaction[2]) + } + + override fun newInstance(): Script? { + val script = ManThiever() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.POOR, bot.startLocation) + return script + } + + init { + equipment.addAll(Arrays.asList(Item(1103), Item(1139), Item(1265))) + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/NonBankingMiner.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/NonBankingMiner.kt new file mode 100644 index 000000000..d60faf8a0 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/NonBankingMiner.kt @@ -0,0 +1,30 @@ +package plugin.ai.general.scriptrepository + +import core.game.node.item.Item +import core.tools.Items +import plugin.ai.skillingbot.SkillingBotAssembler +import core.game.node.entity.skill.Skills + +class NonBankingMiner : Script() { + override fun tick() { + val rock = scriptAPI.getNearestNode(11957,true) + if(rock != null){ + rock.interaction.handle(bot,rock.interaction[0]) + if(bot.inventory.isFull) + bot.inventory.clear() + } + } + + override fun newInstance(): Script { + val script = NonBankingMiner() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.POOR,bot.startLocation) + return script + } + + init { + skills[Skills.ATTACK] = 99 + equipment.add(Item(Items.MITHRIL_PICKAXE_1273)) + inventory.add(Item(Items.MITHRIL_PICKAXE_1273)) + skills[Skills.MINING] = 50 + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerCompatible.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerCompatible.kt new file mode 100644 index 000000000..27f9e30e3 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerCompatible.kt @@ -0,0 +1,3 @@ +package plugin.ai.general.scriptrepository + +annotation class PlayerCompatible diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerScripts.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerScripts.kt new file mode 100644 index 000000000..a9381c5b9 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/PlayerScripts.kt @@ -0,0 +1,19 @@ +package plugin.ai.general.scriptrepository + +import io.github.classgraph.ClassGraph + +object PlayerScripts { + class PlayerScript(val identifier: String, val description: Array, val name: String, val clazz: Class<*>) + val identifierMap = HashMap() + + + fun init(){ + val result = ClassGraph().enableAnnotationInfo().acceptPackages("plugin.ai.general.scriptrepository").scan() + result.getClassesWithAnnotation("plugin.ai.general.scriptrepository.PlayerCompatible").forEach { res -> + val description = res.getAnnotationInfo("plugin.ai.general.scriptrepository.ScriptDescription").parameterValues[0].value as Array + val identifier = res.getAnnotationInfo("plugin.ai.general.scriptrepository.ScriptIdentifier").parameterValues[0].value.toString() + val name = res.getAnnotationInfo("plugin.ai.general.scriptrepository.ScriptName").parameterValues[0].value.toString() + identifierMap[identifier] = PlayerScript(identifier,description,name,res.loadClass()) + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Script.java b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Script.java new file mode 100644 index 000000000..5fcdba027 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/Script.java @@ -0,0 +1,52 @@ +package plugin.ai.general.scriptrepository; + +import core.game.node.entity.player.Player; +import plugin.ai.general.ScriptAPI; +import core.game.node.item.Item; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public abstract class Script { + + public ScriptAPI scriptAPI; + public ArrayList inventory = new ArrayList<>(); + public ArrayList equipment = new ArrayList<>(); + public Map skills = new HashMap<>(); + + + public Player bot; + + public boolean running = true; + + public void init(boolean isPlayer) + { + //bot.init(); + scriptAPI = new ScriptAPI(bot); + + if(!isPlayer) { + for (Item i : equipment) { + bot.getEquipment().add(i, true, false); + } + bot.getInventory().clear(); + for (Item i : inventory) { + bot.getInventory().add(i); + } + for (Map.Entry skill : skills.entrySet()) { + setLevel(skill.getKey(), skill.getValue()); + } + } + } + + public abstract void tick(); + + public void setLevel(int skill, int level) { + bot.getSkills().setLevel(skill, level); + bot.getSkills().setStaticLevel(skill, level); + bot.getSkills().updateCombatLevel(); + bot.getAppearance().sync(); + } + + public abstract Script newInstance(); +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptDescription.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptDescription.kt new file mode 100644 index 000000000..1a34c47a5 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptDescription.kt @@ -0,0 +1,3 @@ +package plugin.ai.general.scriptrepository + +annotation class ScriptDescription(vararg val value: String) diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptIdentifier.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptIdentifier.kt new file mode 100644 index 000000000..08e957a31 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptIdentifier.kt @@ -0,0 +1,3 @@ +package plugin.ai.general.scriptrepository + +annotation class ScriptIdentifier(val value: String) diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptName.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptName.kt new file mode 100644 index 000000000..630265e05 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/ScriptName.kt @@ -0,0 +1,3 @@ +package plugin.ai.general.scriptrepository + +annotation class ScriptName(val value: String) diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersFlax.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersFlax.kt new file mode 100644 index 000000000..30c4a0676 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersFlax.kt @@ -0,0 +1,155 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.world.map.Location +import core.game.world.map.path.Pathfinder +import core.tools.Items +import plugin.ai.skillingbot.SkillingBotAssembler +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.crafting.spinning.SpinningItem +import core.game.node.entity.skill.crafting.spinning.SpinningPulse + +class SeersFlax : Script(){ + var state = State.PICKING + var stage = 0 + var doorOpen = false + override fun tick() { + + when(state){ + + State.PICKING -> { + val flax = scriptAPI.getNearestNode(2646,true) + flax?.interaction?.handle(bot,flax.interaction[1]) + if(bot.inventory.getAmount(Items.FLAX_1779) > 25){ + state = State.TO_SPINNER + } + } + + State.TO_SPINNER -> { + if(stage == 0) + Pathfinder.find(bot, Location.create(2736, 3442, 0)).walk(bot).also { stage++ } + when(bot.location){ + Location.create(2736, 3442, 0) -> Pathfinder.find(bot,Location.create(2722, 3456, 0)).walk(bot) + Location.create(2722, 3456, 0) -> Pathfinder.find(bot,Location.create(2716, 3472, 0)).walk(bot) + Location.create(2716, 3472, 0) -> { + val door = scriptAPI.getNearestNode(25819,true) + if(door != null && door.location?.withinDistance(bot.location,2)!!){ + door.interaction?.handle(bot, door.interaction[0]) + doorOpen = true + } else { + val ladder = scriptAPI.getNearestNode(25938,true) + ladder?.interaction?.handle(bot,ladder.interaction[0]) } + } + Location.create(2714, 3470, 1) -> { + val spinner = scriptAPI.getNearestNode(25824,true) + bot.faceLocation(spinner?.location) + bot.pulseManager.run(object: MovementPulse(bot,spinner, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + bot.faceLocation(spinner?.location) + state = State.SPINNING.also { stage = 0; doorOpen = false } + return true + } + }) + } + } + } + + State.SPINNING -> { + bot.pulseManager.run(SpinningPulse(bot, Item(Items.FLAX_1779),bot.inventory.getAmount(Items.FLAX_1779),SpinningItem.FLAX)) + state = State.FIND_BANK + } + + State.FIND_BANK -> { + when(bot.location){ + Location.create(2711, 3471, 1) -> { + val ladder = scriptAPI.getNearestNode(25939,true) + ladder?.interaction?.handle(bot,ladder?.interaction[0]) + } + Location.create(2714, 3470, 0) -> Pathfinder.find(bot,Location.create(2715, 3472, 0)).walk(bot) + Location.create(2715, 3472, 0) -> { + val door = scriptAPI.getNearestNode(25819,true) + if(door != null && door.location?.withinDistance(bot.location,2)!!){ + door.interaction?.handle(bot, door.interaction[0]) + doorOpen = true + } else { + Pathfinder.find(bot,Location.create(2726, 3481, 0)).walk(bot) + } + } + Location.create(2726, 3481, 0) -> Pathfinder.find(bot,Location.create(2724, 3491, 0)).walk(bot) + Location.create(2724, 3491, 0) -> state = State.BANKING + } + } + + State.BANKING -> { + val bank = scriptAPI.getNearestNode(25808,true) + if(bank != null) + bot.pulseManager.run(object: MovementPulse(bot,bank, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + bot.faceLocation(bank.location) + scriptAPI.bankItem(Items.BOW_STRING_1777) + if(bot.bank.getAmount(Items.BOW_STRING_1777) > 500){ + state = State.TELE_GE + return true + } + state = State.RETURN_TO_FLAX + return true + } + }) + } + + State.RETURN_TO_FLAX -> { + if(bot.location == Location.create(2756, 3478, 0)) + Pathfinder.find(bot,Location.create(2726, 3486, 0)).walk(bot) + if(stage == 0) + Pathfinder.find(bot,Location.create(2726, 3486, 0)).walk(bot).also { stage++ } + when(bot.location){ + Location.create(2726, 3486, 0) -> Pathfinder.find(bot,Location.create(2729, 3469, 0)).walk(bot) + Location.create(2729, 3469, 0) -> Pathfinder.find(bot,Location.create(2734, 3447, 0)).walk(bot) + Location.create(2734, 3447, 0) -> state = State.PICKING.also { stage = 0 } + } + } + + State.TELE_GE -> { + scriptAPI.teleportToGE() + state = State.SELL_GE + } + + State.SELL_GE -> { + scriptAPI.sellOnGE(Items.BOW_STRING_1777) + state = State.TELE_CAMELOT + } + + State.TELE_CAMELOT -> { + scriptAPI.teleport(Location.create(2756, 3478, 0)) + stage = 0 + state = State.RETURN_TO_FLAX + } + + } + } + + enum class State { + PICKING, + SPINNING, + TO_SPINNER, + FIND_BANK, + BANKING, + TELE_GE, + SELL_GE, + RETURN_TO_FLAX, + TELE_CAMELOT + } + + init { + skills[Skills.CRAFTING] = 10 + } + + override fun newInstance(): Script { + val script = SeersFlax() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.POOR,bot.startLocation) + return script + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersMagicTrees.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersMagicTrees.kt new file mode 100644 index 000000000..687a43386 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SeersMagicTrees.kt @@ -0,0 +1,115 @@ +package plugin.ai.general.scriptrepository + +import core.tools.Items +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.item.Item +import core.game.world.map.Location +import core.game.world.map.zone.ZoneBorders +import core.tools.RandomFunction +import plugin.ai.general.ScriptAPI +import plugin.ai.skillingbot.SkillingBotAssembler +import core.game.node.entity.skill.Skills + +@PlayerCompatible +@ScriptName("Seers Magics") +@ScriptDescription("Start in Seers Bank with an axe equipped or in your inventory.") +@ScriptIdentifier("seers_magics") +class SeersMagicTrees : Script(){ + var state = State.INIT + var stage = 0 + val bankZone = ZoneBorders(2722,3490,2727,3493) + val magicsZone = ZoneBorders(2700, 3396,2704, 3399) + var overlay: ScriptAPI.BottingOverlay? = null + var logCounter = 0 + + override fun tick() { + when(state){ + + State.INIT -> { + overlay = scriptAPI.getOverlay() + overlay!!.init() + overlay!!.setTitle("Woodcutting") + overlay!!.setTaskLabel("Logs cut:") + overlay!!.setAmount(0) + state = State.RETURN_TO_TREES + } + + State.CHOPPING -> { + val tree = scriptAPI.getNearestNode(1306,true) + tree?.interaction?.handle(bot,tree.interaction[0]) + if(bot.inventory.isFull){ + state = State.FIND_BANK + } + overlay!!.setAmount(logCounter + bot.inventory.getAmount(Items.MAGIC_LOGS_1513)) + } + + State.FIND_BANK -> { + if(!bankZone.insideBorder(bot)){ + scriptAPI.walkTo(bankZone.randomLoc) + } else { + state = State.BANKING + } + } + + State.BANKING -> { + val bank = scriptAPI.getNearestNode(25808,true) + if(bank != null) + bot.pulseManager.run(object: MovementPulse(bot,bank, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + bot.faceLocation(bank.location) + logCounter += bot.inventory.getAmount(Items.MAGIC_LOGS_1513) + scriptAPI.bankItem(Items.MAGIC_LOGS_1513) + state = State.RETURN_TO_TREES + return true + } + }) + } + + State.RETURN_TO_TREES -> { + if(!magicsZone.insideBorder(bot)){ + scriptAPI.walkTo(magicsZone.randomLoc) + } else { + state = State.CHOPPING + } + } + + State.TELE_GE -> { + state = State.SELL_GE + scriptAPI.teleportToGE() + } + + State.SELL_GE -> { + state = State.TELE_SEERS + scriptAPI.sellOnGE(Items.MAGIC_LOGS_1513) + } + + State.TELE_SEERS -> { + state = State.RETURN_TO_TREES + scriptAPI.teleport(Location.create(2756, 3478, 0)) + } + } + } + + init { + inventory.add(Item(Items.RUNE_AXE_1359)) + skills[Skills.WOODCUTTING] = RandomFunction.random(75,99) + } + + enum class State { + CHOPPING, + FIND_BANK, + BANKING, + RETURN_TO_TREES, + TELE_GE, + SELL_GE, + TELE_SEERS, + INIT + } + + override fun newInstance(): Script { + val script = SeersMagicTrees() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.AVERAGE,bot.startLocation) + return script + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SharkCatcher.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SharkCatcher.kt new file mode 100644 index 000000000..b2233c29c --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/SharkCatcher.kt @@ -0,0 +1,222 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.item.Item +import core.game.world.map.Location +import core.tools.Items +import core.tools.RandomFunction +import plugin.ai.AIPlayer +import plugin.ai.general.ScriptAPI +import core.game.ge.OfferManager +import core.game.node.entity.skill.Skills +import kotlin.random.Random + +/* +Grabs all amounts in GE +val offers = HashMap() +for (offer in GEOfferDispatch.offerMapping.values) { + val item = offer.itemId + val amount = offer.amount - offer.completedAmount + if (offers[item] == null) { offers[item] = amount } + else { offers[item] = offers[item]!!.plus(amount) } + + if (offers[383]!!.plus(amount) >= 1000) { +*/ +/* +Grabs just one offer +for (offer in GEOfferDispatch.offerMapping.values) { +if (offer.itemId == 383 && offer.amount >= 1000) { +*/ +/** + * A bot script for fishing sharks in the Fishing Guild - Fishes, Banks, Sells. + * @param mycounter used in the bots random idling function. + * @param pause is currently not used. + * @param limit is the number of Raw Sharks in the GE the bots will sleep at. + * @author Sir Kermit + * Training Wheel Manufacturer @Ceikry + * Very slight ge modifications by @Angle + */ +@PlayerCompatible +@ScriptName("Guild Sharks") +@ScriptDescription("Start in the fishing guild with a harpoon","in your inventory.") +@ScriptIdentifier("guild_sharks") +class SharkCatcher : Script() { + //val shark = Items.RAW_SHARK + val pause = (1000..3000) + val limit = 5000 + var myCounter = 0 + //val fishzone = ZoneBorders(2597, 3410, 2612, 3426) + internal enum class Sets(val equipment: List) { + SET_1(listOf(Item(10721), Item(8283), Item(10412), Item(10414), Item(88), Item(1007))), + SET_2(listOf(Item(10721), Item(8283), Item(10412), Item(10414), Item(88), Item(1007))), + SET_3(listOf(Item(10721), Item(8283), Item(10412), Item(10414), Item(88), Item(1019))), + SET_4(listOf(Item(10721), Item(8283), Item(10412), Item(10414), Item(88), Item(1019))), + SET_5(listOf(Item(10721), Item(8283), Item(10412), Item(10414), Item(88), Item(3765))), + SET_6(listOf(Item(10721), Item(8283), Item(10412), Item(10414), Item(88), Item(3765))); + + } + private var state = State.INIT + private var tick = 0 + var fishCounter = 0 + var overlay: ScriptAPI.BottingOverlay?= null + + override fun tick() { + val fishguild = Location.create(2596, 3410, 0) + if (tick++ >= 500){ + scriptAPI.teleport(fishguild) + state = State.FIND_SPOT + return + } + when(state){ + + State.INIT -> { + overlay = scriptAPI.getOverlay() + overlay!!.init() + overlay!!.setTitle("Fishing") + overlay!!.setTaskLabel("Sharks Caught:") + overlay!!.setAmount(0) + state = State.FIND_SPOT + } + + State.BANKING -> { + fishCounter += bot.inventory.getAmount(Items.RAW_SHARK_383) + scriptAPI.bankItem(Items.RAW_SHARK_383) + state = State.FIND_SPOT + } + + State.STOP -> { + val botAmount = bot.bank.getAmount(Items.RAW_SHARK_383) + 1 + var geAmount = OfferManager.getQuantitySoldForItem(Items.RAW_SHARK_383) + val totalAmount = (geAmount + botAmount) + 1 + if((totalAmount > limit) && myCounter++ == 300){ + bot.randomWalk(5,5) + myCounter = 0 + return + } else if (myCounter++ == 300){ + myCounter = 0 + State.TELE_FISH + } + return + + } + + State.IDLE -> { + if (Random.nextBoolean()){ + state = State.FIND_SPOT + } + else if(myCounter++ >= RandomFunction.random(1,25)){ + myCounter = 0 + state = State.FIND_SPOT + } + } + + State.FISHING -> { + if (Random.nextBoolean()) { + tick = 0 + val spot = scriptAPI.getNearestNode(334, false) + spot!!.interaction.handle(bot, spot.interaction[2]) + if(bot.inventory.isFull){ + state = State.FIND_BANK + } else { + state = State.IDLE + } + } + else{ + state = State.IDLE + } + overlay!!.setAmount(fishCounter + bot.inventory.getAmount(Items.RAW_SHARK_383)) + } + + State.FIND_SPOT -> { + val spot = scriptAPI.getNearestNode(334, false) + if (spot != null) { + bot.walkingQueue.reset() + state = State.FISHING + } else { + if(bot.location.x < 2591) { + scriptAPI.walkTo(Location.create(2604, 3421, 0)) + } else { + scriptAPI.walkTo(Location.create(2608, 3414, 0)) + } + } + } + + State.FIND_BANK -> { + val bank = scriptAPI.getNearestGameObject(bot.location, 2213) + class BankingPulse : MovementPulse(bot, bank, DestinationFlag.OBJECT) { + override fun pulse(): Boolean { + bot.faceLocation(bank!!.location) + state = State.BANKING + return true + } + } + if(bank != null){ + bot.pulseManager.run(BankingPulse()) + } else { + if (bot.location.x != 2596) { + scriptAPI.walkTo(Location.create(2596, 3415, 0)) + } else if (bot.location.x < 2591) { + scriptAPI.walkTo(Location.create(2591, 3415, 0)) + } else if (bot.location.x < 2587){ + scriptAPI.walkTo(Location.create(2587, 3420, 0)) + } + } + } + + State.TELEPORT_GE -> { + scriptAPI.teleportToGE() + state = State.SELL_GE + } + + State.SELL_GE -> { + val botAmount = bot.bank.getAmount(Items.RAW_SHARK_383) + 1 + var geAmount = OfferManager.getQuantitySoldForItem(Items.RAW_SHARK_383) + val totalAmount = (geAmount + botAmount) + 1 + if(totalAmount > limit){ + scriptAPI.walkTo(Location.create(3164, 3487, 0)) + scriptAPI.sellOnGE(Items.RAW_SHARK_383) + state = State.STOP//.also { println("STOPPING") } + } else { + scriptAPI.walkTo(Location.create(3164, 3487, 0)) + scriptAPI.sellOnGE(Items.RAW_SHARK_383) + state = State.TELE_FISH + } + } + + State.TELE_FISH -> { + scriptAPI.teleport(fishguild) + state = State.FIND_SPOT + } + + + } + } + + + init { + val setUp = RandomFunction.random(Sets.values().size) + equipment.addAll(Sets.values()[setUp].equipment) + inventory.add(Item(311)) + skills[Skills.FISHING] = 90 + } + + enum class State{ + FISHING, + BANKING, + FIND_BANK, + FIND_SPOT, + TELEPORT_GE, + SELL_GE, + TELE_FISH, + IDLE, + STOP, + INIT + } + override fun newInstance(): Script { + val script = SharkCatcher() + script.bot = AIPlayer(bot.startLocation) + script.state = State.FIND_SPOT + return script + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockEssenceMiner.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockEssenceMiner.kt new file mode 100644 index 000000000..e46fa5c9f --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockEssenceMiner.kt @@ -0,0 +1,117 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.item.Item +import core.game.system.SystemLogger +import core.game.world.map.Location +import core.game.world.map.zone.ZoneBorders +import core.tools.Items +import plugin.ai.skillingbot.SkillingBotAssembler +import core.game.node.entity.skill.Skills + +@PlayerCompatible +@ScriptDescription("Start in varrock bank with rune mysteries complete and a pickaxe equipped/in inventory") +@ScriptName("Varrock Essence Miner") +@ScriptIdentifier("essence_miner") +class VarrockEssenceMiner : Script(){ + + var state = State.TO_ESSENCE + val auburyZone = ZoneBorders(3252, 3398, 3254, 3402) + val bankZone = ZoneBorders(3251, 3420,3254, 3422) + override fun tick() { + + when(state){ + State.TO_ESSENCE -> { + if(!auburyZone.insideBorder(bot)) + scriptAPI.walkTo(auburyZone.randomLoc) + else { + val aubury = scriptAPI.getNearestNode("Aubury") + aubury?.interaction?.handle(bot,aubury.interaction[3]) + state = State.MINING + } + /*val bank = scriptAPI.getNearestNode("Bank booth",true) + if(bank != null && bank.location?.withinDistance(bot.location,2) == true){ + Pathfinder.find(bot, Location.create(3259, 3405, 0)).walk(bot) + } else { + when(bot.location){ + Location.create(3165, 3487, 0) -> scriptAPI.teleport(Location.create(3254, 3421, 0)) + Location.create(3259, 3405, 0) -> Pathfinder.find(bot,Location.create(3253, 3400, 0)).walk(bot) + Location.create(3253, 3400, 0) -> { + val aubury = scriptAPI.getNearestNode("Aubury") + aubury?.interaction?.handle(bot,aubury.interaction[3]) + } + Location.create(2922, 4820, 0) -> { + state = State.MINING + } + } + }*/ + } + + State.MINING -> { + val essence = scriptAPI.getNearestNode(2491,true) + essence?.interaction?.handle(bot,essence.interaction[0]) + if(bot.inventory.isFull) + state = State.TO_BANK + } + + State.TO_BANK -> { + val portal = scriptAPI.getNearestNode("Portal",true) + if(portal != null && portal.location.withinDistance(bot.location,20)) + portal.interaction.handle(bot,portal.interaction[0]) + else { + if(!bankZone.insideBorder(bot)){ + scriptAPI.walkTo(bankZone.randomLoc) + } else { + state = State.BANKING + } + } + } + + State.BANKING -> { + val bank = scriptAPI.getNearestNode("bank booth",true) + val item = + if(bot.inventory.getAmount(Items.RUNE_ESSENCE_1436) > 0) Items.RUNE_ESSENCE_1436 else Items.PURE_ESSENCE_7936 + if(bank != null){ + bot.pulseManager.run(object : MovementPulse(bot,bank, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + bot.faceLocation(bank.location) + scriptAPI.bankItem(item) + state = State.TO_ESSENCE + return true + } + }) + } + } + + State.TELE_GE -> { + if(bot.location != Location.create(3165, 3482, 0)) + scriptAPI.walkTo(Location.create(3165, 3482, 0)) + else + state = State.SELL_GE + } + + State.SELL_GE -> { + scriptAPI.sellOnGE(Items.PURE_ESSENCE_7936) + state = State.TO_ESSENCE + } + + } + + } + + enum class State{ + TO_ESSENCE, + TO_BANK, + MINING, + BANKING, + TELE_GE, + SELL_GE + } + + override fun newInstance(): Script { + val script = VarrockEssenceMiner() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.POOR,bot.startLocation) + return script + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockSmither.kt b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockSmither.kt new file mode 100644 index 000000000..d9c05c952 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/general/scriptrepository/VarrockSmither.kt @@ -0,0 +1,66 @@ +package plugin.ai.general.scriptrepository + +import core.game.interaction.DestinationFlag +import core.game.interaction.MovementPulse +import core.game.node.item.Item +import core.game.world.map.Location +import core.tools.Items +import core.tools.RandomFunction +import plugin.ai.skillingbot.SkillingBotAssembler +import core.game.node.entity.skill.Skills +import core.game.node.entity.skill.smithing.Bars +import core.game.node.entity.skill.smithing.SmithingPulse + +class VarrockSmither : Script() { + var state = State.SMITHING + override fun tick() { + when(state) { + State.SMITHING -> { + for (i in inventory) { + bot.inventory.add(i) + } + val anvil = scriptAPI.getNearestNode("anvil", true) + if (anvil != null) { + bot.pulseManager.run(object : MovementPulse(bot, anvil, DestinationFlag.OBJECT) { + override fun pulse(): Boolean { + bot.faceLocation(anvil.location) + bot.pulseManager.run(SmithingPulse(bot, Item(2353), Bars.STEEL_ARROW_TIPS, 27)) + state = State.BANKING + return true + } + }) + } + } + + State.BANKING -> { + val bank = scriptAPI.getNearestNode("Bank booth") + if(bank != null) + bot.pulseManager.run(object: MovementPulse(bot,bank, DestinationFlag.OBJECT){ + override fun pulse(): Boolean { + bot.faceLocation(bank.location) + bot.inventory.clear() + state = State.SMITHING + return true + } + }) + } + } + } + + override fun newInstance(): Script { + val script = VarrockSmither() + script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.RICH, Location.create(3189, 3436, 0)) + return script + } + + init { + skills[Skills.SMITHING] = RandomFunction.random(33,99) + inventory.add(Item(Items.HAMMER_2347)) + inventory.add(Item(Items.STEEL_BAR_2353,27)) + } + + enum class State { + SMITHING, + BANKING + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/lumbridge/DeadIdler.java b/Server/src/main/java/Server/plugin/ai/lumbridge/DeadIdler.java new file mode 100644 index 000000000..bacecadb3 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/lumbridge/DeadIdler.java @@ -0,0 +1,34 @@ +package plugin.ai.lumbridge; + +import plugin.ai.AIPlayer; +import core.game.world.map.Location; +import core.game.world.map.zone.ZoneBorders; +import core.tools.RandomFunction; + +public class DeadIdler extends AIPlayer { + //Recreation of players I saw in w417 who seemed to have quit their computer after dying. + + private int tick = RandomFunction.random(500); + + public DeadIdler() + { + super(getRandomRespawnLoc()); + this.setCustomState("Lumbridge Bot"); + } + + @Override + public void tick() + { + super.tick(); + if (this.tick > 0) + { + tick --; + } else { + AIPlayer.deregister(this.getUid()); + } + } + + private static Location getRandomRespawnLoc() { + return new ZoneBorders(3219, 3218, 3223, 3219).getRandomLoc(); + } +} diff --git a/Server/src/main/java/Server/plugin/ai/lumbridge/LumbridgeBotHandler.java b/Server/src/main/java/Server/plugin/ai/lumbridge/LumbridgeBotHandler.java new file mode 100644 index 000000000..675c6fd4c --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/lumbridge/LumbridgeBotHandler.java @@ -0,0 +1,33 @@ +package plugin.ai.lumbridge; + +import core.game.world.GameWorld; +import core.tools.RandomFunction; + +import java.util.concurrent.Executors; + +/** + * Creates a few random bots around Lumbridge area. + * Code by Red Bracket + */ +public class LumbridgeBotHandler { + public static void immersiveLumbridge() + { + //Generate a few random bots here and there + System.out.println("[" + GameWorld.getSettings().getName() + "]: LumbridgeBotHandler: Initialized dead idlers."); + generateDeadIdlers(); + } + + private static void generateDeadIdlers() { + Executors.newSingleThreadExecutor().execute(() -> { + while (true) //Would probably be better if this could be "while game is running" + { + new DeadIdler(); + try { + Thread.sleep(RandomFunction.random(300_000)); + } catch (InterruptedException e) { + System.out.println("LumbridgeBotHandler can't sleep!!?"); + } + } + }); + } +} diff --git a/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatState.kt b/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatState.kt new file mode 100644 index 000000000..b6e25ca79 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatState.kt @@ -0,0 +1,125 @@ +package plugin.ai.minigamebots.pestcontrol + +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.entity.npc.NPC +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.map.path.Pathfinder +import core.tools.RandomFunction +import core.game.content.activity.pestcontrol.PestControlHelper.GATE_ENTRIES +import core.game.content.activity.pestcontrol.PestControlHelper.getMyPestControlSession1 +import java.util.* +import java.util.concurrent.Executors + + +class CombatState(val bot: PestControlTestBot) { + private val Random = Random() + val randomtype = Random().nextInt(100) + + fun goToPortals() { + bot.customState = "I'm at portals." + val gate = bot.getClosestNodeWithEntry(75, GATE_ENTRIES) + val sesh = getMyPestControlSession1(bot) + + var portal: Node? = null + if(sesh != null && sesh.aportals.isNotEmpty()){ + val removeList = ArrayList() + for(port in sesh.aportals){ + if(!port.isActive){ + removeList.add(port) + } else { + portal = port + break; + } + } + sesh.aportals.removeAll(removeList) + } + + if(bot.pulseManager.hasPulseRunning() && portal == null){ + return + } + + if (bot.justStartedGame) { + bot.customState = "Walking randomly" + bot.justStartedGame = false + bot.randomWalkAroundPoint(getMyPestControlSession1(bot)?.squire?.location, 15) + bot.movetimer = Random.nextInt(7) + 6 + return + } + + if (gate != null && sesh?.aportals?.isEmpty() == true) { + bot.customState = "Interacting gate ID " + gate.id + bot.interact(gate) + bot.openedGate = true + if (Random.nextInt(4) == 1 && randomtype < 40) { + bot.movetimer = Random.nextInt(2) + 1 + } + return + } + + if (portal != null) { + if(bot.location.withinDistance(portal.location,10) && portal.isActive){ + val spinners = ArrayList() + RegionManager.getLocalNpcs(bot).forEach { + if(it.name.toLowerCase().equals("spinner") && it.location.withinDistance(bot.location,10)) spinners.add(it) + } + if(spinners.isNotEmpty()){ + bot.attack(spinners.random()) + } else { + bot.attack(portal) + } + } else { + randomWalkTo(portal.location, 5) + } + bot.movetimer = Random().nextInt(10) + 5 + return + } else { + bot.AttackNpcsInRadius(50) + } + + bot.customState = "Absolutely nothing. Everything is dead" + } + + fun fightNPCs() { + bot.customState = "Fight NPCs" + bot.AttackNpcsInRadius(8) + bot.eat(379) + + + if (!bot.inCombat()) { + /*if (bot.combatMoveTimer <= 0) { + if (bot.FindTargets(bot, 30) == null) + bot.combatMoveTimer = 5 + }*/ + } + } + + //Functions + + fun randomWalkTo(loc: Location, radius: Int) { + if(!bot.walkingQueue.isMoving) { + Executors.newSingleThreadExecutor().execute { + var newloc = loc.transform(RandomFunction.random(radius, -radius), + RandomFunction.random(radius, -radius), 0) + walkToIterator(newloc) + } + } + } + + private fun walkToIterator(loc: Location){ + var diffX = loc.x - bot.location.x + var diffY = loc.y - bot.location.y + while(!bot.location.transform(diffX, diffY, 0).withinDistance(bot.location)) { + diffX /= 2 + diffY /= 2 + } + GameWorld.Pulser.submit(object : MovementPulse(bot, bot.location.transform(diffX, diffY, 0), Pathfinder.SMART) { + override fun pulse(): Boolean { + return true + } + }) + } + +} diff --git a/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate.kt b/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate.kt new file mode 100644 index 000000000..5a42b5bb2 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/CombatStateIntermediate.kt @@ -0,0 +1,124 @@ +package plugin.ai.minigamebots.pestcontrol + +import core.game.interaction.MovementPulse +import core.game.node.Node +import core.game.node.entity.npc.NPC +import core.game.world.GameWorld +import core.game.world.map.Location +import core.game.world.map.RegionManager +import core.game.world.map.path.Pathfinder +import core.tools.RandomFunction +import core.game.content.activity.pestcontrol.PestControlHelper.getMyPestControlSession2 +import java.util.* +import core.game.content.activity.pestcontrol.PestControlHelper.GATE_ENTRIES +import java.util.concurrent.Executors + +class CombatStateIntermediate(val bot: PestControlTestBot2) { + private val Random = Random() + val randomtype = Random().nextInt(100) + + fun goToPortals() { + bot.customState = "I'm at portals." + val gate = bot.getClosestNodeWithEntry(75, GATE_ENTRIES) + val sesh = getMyPestControlSession2(bot) + + var portal: Node? = null + if(sesh != null && sesh.aportals.isNotEmpty()){ + val removeList = ArrayList() + for(port in sesh.aportals){ + if(!port.isActive){ + removeList.add(port) + } else { + portal = port + break; + } + } + sesh.aportals.removeAll(removeList) + } + + if(bot.pulseManager.hasPulseRunning() && portal == null){ + return + } + + if (bot.justStartedGame) { + bot.customState = "Walking randomly" + bot.justStartedGame = false + bot.randomWalkAroundPoint(getMyPestControlSession2(bot)?.squire?.location, 15) + bot.movetimer = Random.nextInt(7) + 6 + return + } + + if (gate != null && sesh?.aportals?.isEmpty() == true) { + bot.customState = "Interacting gate ID " + gate.id + bot.interact(gate) + bot.openedGate = true + if (Random.nextInt(4) == 1 && randomtype < 40) { + bot.movetimer = Random.nextInt(2) + 1 + } + return + } + + if (portal != null) { + if(bot.location.withinDistance(portal.location,10) && portal.isActive){ + val spinners = ArrayList() + RegionManager.getLocalNpcs(bot).forEach { + if(it.name.toLowerCase().equals("spinner") && it.location.withinDistance(bot.location,10)) spinners.add(it) + } + if(spinners.isNotEmpty()){ + bot.attack(spinners.random()) + } else { + bot.attack(portal) + } + } else { + randomWalkTo(portal.location, 5) + } + bot.movetimer = Random().nextInt(10) + 5 + return + } else { + bot.AttackNpcsInRadius(50) + } + + bot.customState = "Absolutely nothing. Everything is dead" + } + + fun fightNPCs() { + bot.customState = "Fight NPCs" + bot.AttackNpcsInRadius(8) + bot.eat(379) + + + if (!bot.inCombat()) { + /*if (bot.combatMoveTimer <= 0) { + if (bot.FindTargets(bot, 30) == null) + bot.combatMoveTimer = 5 + }*/ + } + } + + //Functions + + fun randomWalkTo(loc: Location, radius: Int) { + if(!bot.walkingQueue.isMoving) { + Executors.newSingleThreadExecutor().execute { + var newloc = loc.transform(RandomFunction.random(radius, -radius), + RandomFunction.random(radius, -radius), 0) + walkToIterator(newloc) + } + } + } + + private fun walkToIterator(loc: Location){ + var diffX = loc.x - bot.location.x + var diffY = loc.y - bot.location.y + while(!bot.location.transform(diffX, diffY, 0).withinDistance(bot.location)) { + diffX /= 2 + diffY /= 2 + } + GameWorld.Pulser.submit(object : MovementPulse(bot, bot.location.transform(diffX, diffY, 0), Pathfinder.SMART) { + override fun pulse(): Boolean { + return true + } + }) + } + +} diff --git a/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlIntermediateBot.kt b/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlIntermediateBot.kt new file mode 100644 index 000000000..51e18b5b3 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlIntermediateBot.kt @@ -0,0 +1,199 @@ +package plugin.ai.minigamebots.pestcontrol + +import core.game.world.map.Location +import core.tools.RandomFunction +import core.game.content.activity.pestcontrol.PestControlActivityPlugin +import core.game.content.activity.pestcontrol.PestControlHelper +import core.game.content.activity.pestcontrol.PestControlHelper.BoatInfo +import plugin.ai.pvmbots.CombatBotAssembler +import plugin.ai.pvmbots.PvMBots +import java.util.* + +class PestControlTestBot2(l: Location) : PvMBots(legitimizeLocation(l)) { + + var tick = 0 + var combatMoveTimer = 0 + var justStartedGame = true + var movetimer = 0 + var openedGate = false + var myCounter = 0 + val num = Random().nextInt(4) + val myBoat = BoatInfo.INTERMEDIATE + val combathandler = CombatStateIntermediate(this) + + var time = 0 + + enum class State { + OUTSIDE_GANGPLANK, + REFRESH, + WAITING_IN_BOAT, + PLAY_GAME, + GET_TO_PC + } + //Novice Lander co-ords (2657, 2639, 0) + //Intermediate lander co-ords (2644, 2644, 0) + //Veteran lander co-ords (2638, 2653 0) + init { + val random100 = Random().nextInt(100) + if (random100 < 30) { + setAttribute("pc_role","defend_squire"); + } else + { + setAttribute("pc_role","attack_portals") + this.customState = "Fighting NPCs" + } + if (num <= 2) { + CombatBotAssembler().gearPCiMeleeBot( this) + } else { + CombatBotAssembler().gearPCiRangedBot(this, Random().nextInt() % 2 == 0) + } + } + + + override fun tick() { + super.tick() + tick++ + time++ + movetimer-- + if (movetimer <= 0) { + movetimer = 0 + customState = state.toString() + movetimer + when (state) { + State.GET_TO_PC -> toPC() + State.OUTSIDE_GANGPLANK -> enterBoat() + State.WAITING_IN_BOAT -> idleInBoat() + State.PLAY_GAME -> attackNPCs() + State.REFRESH -> toPC() + } + } + } + + private val state: State + get() { + if (PestControlHelper.landerContainsLoc2(this.getLocation())) { + return State.WAITING_IN_BOAT + } + if (PestControlHelper.isInPestControlInstance(this)) { + return State.PLAY_GAME + } + if (PestControlHelper.outsideGangplankContainsLoc2(this.getLocation())) { + return State.OUTSIDE_GANGPLANK + } + if (time == 1200) { + return State.GET_TO_PC//.also { println("I was stuck ${this.username}") } + } + return State.GET_TO_PC + } + + + private fun attackNPCs() { + if (PestControlHelper.outsideGangplankContainsLoc2(getLocation())){ + PestControlActivityPlugin().leave(this,false) + val test = getClosestNodeWithEntry(50, myBoat.ladderId) + test ?: println("PC: Gangplank Null") + test.interaction.handle(this, test.interaction[0])//.also { println("Intermediate - We think we is in pest control ${this.username}.") } + } + walkingQueue.isRunning = true + + if (getAttribute("pc_role","E") == "attack_portals") { + combathandler.goToPortals() + } else { + movetimer = RandomFunction.random(2,10) + randomWalkAroundPoint(PestControlHelper.getMyPestControlSession2(this)?.squire?.location,5) + combathandler.fightNPCs() + } + } + + private var insideBoatWalks = 3 + fun idleInBoat() { + justStartedGame = true + openedGate = false + time = 0 + if (!prayer.active.isEmpty()) { + prayer.reset() + } + if (PestControlHelper.outsideGangplankContainsLoc2(getLocation())){ + val test = getClosestNodeWithEntry(15, myBoat.ladderId) + test.interaction.handle(this,test.interaction[0]) + enterBoat()//.also { println("We think we is in boat ${this.username}.") } + } + if (Random().nextInt(100) < 40) { + if (Random().nextInt(insideBoatWalks) <= 1) { + (insideBoatWalks * 1.5).toInt() + + if (Random().nextInt(4) == 1) { + this.walkingQueue.isRunning = !this.walkingQueue.isRunning + } + if (Random().nextInt(7) >= 4) { + this.walkToPosSmart(myBoat.boatBorder.randomLoc) + } + } + if (Random().nextInt(3) == 1) { + insideBoatWalks += 2 + } + } + } + + private fun enterBoat() { + if (PestControlHelper.outsideGangplankContainsLoc2(getLocation())){ + movetimer = Random().nextInt(10) + combathandler.randomWalkTo(PestControlHelper.PestControlLanderIntermediate, 1) + } + if (!prayer.active.isEmpty()) { + prayer.reset() + } + if (Random().nextInt(8) >= 3) + { + val pclocs = Location.create(2652,2646,0) + combathandler.randomWalkTo(pclocs,8) + movetimer = Random().nextInt(180) + 15 + } + if (Random().nextInt(8) >= 2) + { + randomWalk(3,3) + movetimer = Random().nextInt(10) + } + if (Random().nextInt(100) > 50) + { + if (Random().nextInt(10) <= 5) { + this.walkToPosSmart(myBoat.outsideBoatBorder.randomLoc) + movetimer += RandomFunction.normalPlusWeightRandDist(400, 200) + } + movetimer = RandomFunction.normalPlusWeightRandDist(100, 50); + return; + } + val test = getClosestNodeWithEntry(15, myBoat.ladderId) + test ?: randomWalk(1,1) + test?.interaction?.handle(this, test.interaction[0]) + insideBoatWalks = 3 + } + + var switch = false + fun toPC() { + time = 0 + if (!switch) { + this.teleport(PestControlHelper.PestControlLanderIntermediate)//.also { println("I was stuck ${this.username}") } + switch = true + return + } + if (switch) { + val test = getClosestNodeWithEntry(30, myBoat.ladderId) + if (test == null) { + switch = false + this.teleport(PestControlHelper.PestControlLanderIntermediate) + State.OUTSIDE_GANGPLANK + } else { + switch = false + test.interaction.handle(this, test.interaction[0]) + State.OUTSIDE_GANGPLANK + } + } + } + + + companion object { + fun legitimizeLocation(l: Location): Location { + return if (PestControlHelper.landerContainsLoc(l)) Location(2648, 2648, 0) else l + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlNoviceBot.kt b/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlNoviceBot.kt new file mode 100644 index 000000000..10197611c --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/minigamebots/pestcontrol/PestControlNoviceBot.kt @@ -0,0 +1,197 @@ +package plugin.ai.minigamebots.pestcontrol + +import core.game.world.map.Location +import core.tools.RandomFunction +import core.game.content.activity.pestcontrol.PestControlActivityPlugin +import core.game.content.activity.pestcontrol.PestControlHelper +import core.game.content.activity.pestcontrol.PestControlHelper.BoatInfo +import plugin.ai.pvmbots.CombatBotAssembler +import plugin.ai.pvmbots.PvMBots +import java.util.* + +class PestControlTestBot(l: Location) : PvMBots(legitimizeLocation(l)){ + var tick = 0 + var combatMoveTimer = 0 + var justStartedGame = true + var movetimer = 0 + var openedGate = false + var myCounter = 0 + val num = Random().nextInt(4) + val myBoat = BoatInfo.NOVICE + val combathandler = CombatState(this) + + var time = 0 + + enum class State { + REFRESH, + OUTSIDE_GANGPLANK, + WAITING_IN_BOAT, + PLAY_GAME, + GET_TO_PC + } + + //Novice Lander co-ords (2657, 2639, 0) + //Intermediate lander co-ords (2644, 2644, 0) + //Veteran lander co-ords (2638, 2653 0) + init { + val random100 = Random().nextInt(100) + if (random100 < 30) { + setAttribute("pc_role","defend_squire"); + } else + { + setAttribute("pc_role","attack_portals") + this.customState = "Fighting NPCs" + } + if (num <= 2) { + CombatBotAssembler().gearPCnMeleeBot(this) + } else { + CombatBotAssembler().gearPCnRangedBot(this, Random().nextInt() % 2 == 0) + } + } + + override fun tick() { + super.tick() + tick++ + time++ + movetimer-- + if (movetimer <= 0) { + movetimer = 0 + customState = state.toString() + movetimer + when (state) { + State.GET_TO_PC -> toPC() + State.OUTSIDE_GANGPLANK -> enterBoat() + State.WAITING_IN_BOAT -> idleInBoat() + State.PLAY_GAME -> attackNPCs() + State.REFRESH -> toPC() + } + } + } + + val state: State + get() { + if (PestControlHelper.landerContainsLoc(this.getLocation())) { + return State.WAITING_IN_BOAT + } + if (PestControlHelper.isInPestControlInstance(this)) { + return State.PLAY_GAME + } + if (PestControlHelper.outsideGangplankContainsLoc(this.getLocation())) { + return State.OUTSIDE_GANGPLANK + } + if (time == 1200) { + return State.GET_TO_PC + } + return State.GET_TO_PC + + } + + fun attackNPCs() { + if (PestControlHelper.outsideGangplankContainsLoc(getLocation())){ + PestControlActivityPlugin().leave(this,false) + val test = getClosestNodeWithEntry(50, myBoat.ladderId) + test ?: println("PC: Gangplank Null") + test.interaction.handle(this, test.interaction[0])//.also { println("Novice - We think we is in pest control ${this.username}.") } + } + walkingQueue.isRunning = true + + if (getAttribute("pc_role","E") == "attack_portals") { + combathandler.goToPortals() + } else { + movetimer = RandomFunction.random(2,10) + randomWalkAroundPoint(PestControlHelper.getMyPestControlSession1(this)?.squire?.location,5) + combathandler.fightNPCs() + } + } + + var insideBoatWalks = 3 + fun idleInBoat() { + justStartedGame = true + openedGate = false + time = 0 + if (!prayer.active.isEmpty()) { + prayer.reset() + } + if (PestControlHelper.outsideGangplankContainsLoc(getLocation())){ + val test = getClosestNodeWithEntry(15, myBoat.ladderId) + test.interaction.handle(this,test.interaction[0]) + enterBoat()//.also { println("We think we is in boat ${this.username}.") } + } + if (Random().nextInt(100) < 40) { + if (Random().nextInt(insideBoatWalks) <= 1) { + (insideBoatWalks * 1.5).toInt() + + if (Random().nextInt(4) == 1) { + this.walkingQueue.isRunning = !this.walkingQueue.isRunning + } + if (Random().nextInt(7) >= 4) { + this.walkToPosSmart(myBoat.boatBorder.randomLoc!!) + } + } + if (Random().nextInt(3) == 1) { + insideBoatWalks += 2 + } + } + } + + fun enterBoat() { + if (PestControlHelper.outsideGangplankContainsLoc(getLocation())){ + movetimer = Random().nextInt(10) + combathandler.randomWalkTo(PestControlHelper.PestControlLanderNovice, 1) + } + if (!prayer.active.isEmpty()) { + prayer.reset() + } + if (Random().nextInt(8) >= 4) + { + val pclocs = Location.create(2658,2659,0) + combathandler.randomWalkTo(pclocs,12) + movetimer = Random().nextInt(300) + 30 + } + if (Random().nextInt(8) >= 2) + { + randomWalk(3,3) + movetimer = Random().nextInt(10) + } + if (Random().nextInt(100) > 50) + { + if (Random().nextInt(10) <= 5) { + this.walkToPosSmart(myBoat.outsideBoatBorder.randomLoc) + movetimer += RandomFunction.normalPlusWeightRandDist(400, 200) + } + movetimer = RandomFunction.normalPlusWeightRandDist(100, 50); + return; + } + val test = getClosestNodeWithEntry(15, myBoat.ladderId) + test ?: randomWalk(1,1) + test?.interaction?.handle(this, test.interaction[0]) + insideBoatWalks = 3 + } + + var switch = false + fun toPC() { + time = 0 + if (!switch){ + this.teleport(PestControlHelper.PestControlLanderNovice)//.also { println("I was stuck ${this.username}") } + switch = true + return + } + if (switch) { + val test = getClosestNodeWithEntry(30, myBoat.ladderId) + if (test == null) { + switch = false + this.teleport(PestControlHelper.PestControlLanderNovice) + State.OUTSIDE_GANGPLANK + } else { + switch = false + test.interaction.handle(this, test.interaction[0]) + State.OUTSIDE_GANGPLANK + } + } + } + + companion object { + fun legitimizeLocation(l: Location): Location { + return if (PestControlHelper.landerContainsLoc(l)) Location(2660, 2648, 0) else l + } + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBot.kt b/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBot.kt new file mode 100644 index 000000000..6314ec9ad --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBot.kt @@ -0,0 +1,56 @@ +package plugin.ai.pvmbots + +import core.game.node.entity.player.link.appearance.Gender +import core.game.node.entity.player.link.prayer.PrayerType +import core.game.node.item.Item +import core.game.world.map.Direction +import core.game.world.map.Location +import core.tools.RandomFunction +import plugin.ai.AIPlayer +import core.game.content.consumable.Consumable +import core.game.content.consumable.Consumables +import core.game.content.consumable.Food +import core.game.content.consumable.effects.HealingEffect +import core.game.node.entity.skill.Skills +import java.util.* + +class CombatBot(location: Location) : AIPlayer(location) { + var tick = 0 + + override fun updateRandomValues() { + appearance.gender = if (RandomFunction.random(5) == 1) Gender.FEMALE else Gender.MALE + setDirection(Direction.values()[Random().nextInt(Direction.values().size)]) //Random facing dir + skills.updateCombatLevel() + appearance.sync() + } + override fun tick() { + super.tick() + this.tick++ + + //Despawn + if (skills.lifepoints == 0) { + //CombatBotAssembler.produce(CombatBotAssembler.Type.RANGE, CombatBotAssembler.Tier.LOW,this.location) + deregister(uid) + } + } + + fun CheckPrayer(type: Array) { + for (i in type.indices) prayer.toggle(type[i]) + } + + fun eat(foodId: Int) { + val foodItem = Item(foodId) + if (skills.getStaticLevel(Skills.HITPOINTS) >= skills.lifepoints * 3 && inventory.containsItem(foodItem)) { + this.lock(3) + //this.animate(new Animation(829)); + val food = inventory.getItem(foodItem) + var consumable: Consumable? = Consumables.getConsumableById(food.id) + if (consumable == null) { + consumable = Food(IntArray(food.id), HealingEffect(1)) + } + consumable.consume(food, this) + properties.combatPulse.delayNextAttack(3) + } + if (!checkVictimIsPlayer()) if (!inventory.contains(foodId, 1)) inventory.add(Item(foodId, 5)) //Add Food to Inventory + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBotAssembler.kt b/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBotAssembler.kt new file mode 100644 index 000000000..28192f29f --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvmbots/CombatBotAssembler.kt @@ -0,0 +1,531 @@ +package plugin.ai.pvmbots + +import core.game.node.item.Item +import core.game.world.map.Location +import core.tools.Items +import core.tools.RandomFunction +import plugin.ai.AIPlayer +import core.game.node.entity.skill.Skills +import java.util.* +import kotlin.collections.ArrayList + +/** + * Assembles combat-style bots, intended to replace PVMBotBuilder. + * @author Ceikry + */ +class CombatBotAssembler { + enum class Type{ + RANGE, + MAGE, + MELEE + } + enum class Tier{ + LOW, + MED, + HIGH, + PURE + } + + /** + * Produces a bot with the specified parameters. + * @param type the type of bot to produce. Melee, Ranged, or Mage. + * @param tier specifies the range of skills the bot can have, and thereby, the gear. LOW, MED, or HIGH. + * @param location the location that the bot spawns and respawns at. + * @return an AIPlayer with the specified values. + * @author Ceikry + */ + fun produce(type: Type, tier: Tier, location: Location): AIPlayer? { + return when (type) { + Type.RANGE -> assembleRangedBot(tier, location) + Type.MELEE -> assembleMeleeBot(tier,location) + Type.MAGE -> assembleMeleeBot(tier,location) + } + } + + /** + * Assembles a ranged bot with the specified values. + * @param tier the tier to use which defines skill ranges and gear. + * @param location the bot's spawn and respawn location + * @param crossbow (optional) whether or not this bot should use a crossbow + * @return a CombatBot with the specified values. + * @author Ceikry + */ + fun assembleRangedBot(tier: Tier, location: Location, crossbow: Boolean? = null): CombatBot { + val bot = CombatBot(location) + + generateStats(bot, tier, Skills.RANGE, Skills.DEFENCE) + gearRangedBot(bot, crossbow ?: Random().nextInt() % 2 == 0) + return bot + } + + /** + * Assembles a melee bot with the specified values. + * @param tier the tier of the bot. Specifies levels and gear. + * @param location the spawn and respawn location of the bot. + * @return a CombatBot with the specified values. + * @author Ceikry + */ + fun assembleMeleeBot(tier: Tier, location: Location): CombatBot { + val bot = CombatBot(location) + + generateStats(bot, tier, Skills.ATTACK, Skills.STRENGTH, Skills.DEFENCE) + gearMeleeBot(bot) + return bot + } + + /** + * Assembles a melee bot with gear appropriate for killing dragons. + * @param tier the tier of the bot, specifying levels and gear. + * @param location the spawn and respawn location of the bot. + * @return a CombatBot suited for killing dragons. + * @author Kermit + */ + fun MeleeAdventurer(tier: Tier, location: Location): CombatBot{ + val bot = CombatBot(location) + var max = 0 + val level = RandomFunction.random(25, 65).also {max = 99 } + generateStats(bot,tier,Skills.ATTACK, Skills.STRENGTH, Skills.DEFENCE) + bot.skills.setStaticLevel(Skills.HITPOINTS, level) + bot.skills.setStaticLevel(Skills.ATTACK, level + 5) + bot.skills.setStaticLevel(Skills.STRENGTH, level + 5) + bot.skills.setLevel(Skills.HITPOINTS, level) + bot.skills.setLevel(Skills.ATTACK, level + 5) + bot.skills.setLevel(Skills.STRENGTH, level + 5) + bot.skills.updateCombatLevel() + equipHighest(bot, MELEE_HELMS) + equipHighest(bot, MELEE_TOP) + equipHighest(bot, MELEE_LEG) + equipHighest(bot, MELEE_WEP) + equipHighest(bot, MELEE_SHIELD) + equipHighest(bot, CAPE) + equipHighest(bot, NNECK) + equipHighest(bot, NGLOVES) + equipHighest(bot, NBOOTS) + bot.equipment.refresh() + return bot + } + + /** + * Assembles a melee bot with gear appropriate for killing dragons. + * @param tier the tier of the bot, specifying levels and gear. + * @param location the spawn and respawn location of the bot. + * @return a CombatBot suited for killing dragons. + * @author Kermit + */ + fun RangeAdventurer(tier: Tier, location: Location): CombatBot{ + val bot = CombatBot(location) + var max = 0 + val level = RandomFunction.random(35, 65).also {max = 75 } + generateStats(bot,tier,Skills.ATTACK, Skills.STRENGTH) + bot.skills.setStaticLevel(Skills.HITPOINTS, level) + bot.skills.setStaticLevel(Skills.DEFENCE, level) + bot.skills.setStaticLevel(Skills.RANGE, level + 10) + bot.skills.setLevel(Skills.HITPOINTS, level) + bot.skills.setLevel(Skills.DEFENCE, level) + bot.skills.setLevel(Skills.RANGE, level + 10) + bot.skills.updateCombatLevel() + equipHighest(bot,RANGE_HELMS,65) + equipHighest(bot,RANGE_TOPS,65) + equipHighest(bot,RANGE_LEGS,65) + equipHighest(bot,CROSSBOWS,50) + equipHighest(bot, CAPE) + equipHighest(bot, NRANGENECK) + equipHighest(bot, NRANGESHIELD) + equipHighest(bot, PCRANGE_BACK) + equipHighest(bot, NGLOVES) + equipHighest(bot, NRBOOTS) + bot.equipment.add(Item(Items.BRONZE_BOLTS_877,100000),13,false,false) + bot.equipment.refresh() + return bot + } + + /** + * Assembles a melee bot with gear appropriate for killing dragons. + * @param tier the tier of the bot, specifying levels and gear. + * @param location the spawn and respawn location of the bot. + * @return a CombatBot suited for killing dragons. + * @author Ceikry + */ + fun assembleMeleeDragonBot(tier: Tier, location: Location): CombatBot{ + val bot = CombatBot(location) + generateStats(bot,tier,Skills.ATTACK, Skills.STRENGTH, Skills.DEFENCE) + equipHighest(bot, MELEE_HELMS, 50) + equipHighest(bot, MELEE_TOP, 40) + equipHighest(bot, MELEE_LEG, 40) + equipHighest(bot, MELEE_WEP, 60) + equipHighest(bot, CAPE) + equipHighest(bot, NGLOVES) + equipHighest(bot, NBOOTS) + bot.equipment.refresh() + return bot + } + + /** + * Assembles a ranged bot with gear appropriate for killing dragons. + * @param tier the tier of the bot, specifying levels and gear. + * @param location the spawn and respawn location of the bot. + * @return a CombatBot suited for killing dragons. + * @author Ceikry + */ + fun assembleRangeDragonBot(tier: Tier, location: Location): CombatBot{ + val bot = CombatBot(location) + bot.fullRestore() + generateStats(bot,tier,Skills.RANGE,Skills.DEFENCE) + equipHighest(bot,RANGE_HELMS,50) + equipHighest(bot,RANGE_TOPS,50) + equipHighest(bot,RANGE_LEGS,50) + equipHighest(bot,CROSSBOWS,50) + equipHighest(bot, CAPE) + equipHighest(bot, NGLOVES) + equipHighest(bot, NRBOOTS) + bot.equipment.add(Item(Items.BRONZE_BOLTS_877,100000),13,false,false) + bot.equipment.refresh() + return bot + } + + /** + * Gears a ranged bot with the best gear for its stats. + * @param bot the bot to gear + * @param crossbow (optional) whether or not this bot should use a crossbow. Default is false. + * @author Ceikry + */ + fun gearRangedBot(bot: AIPlayer, crossbow: Boolean? = false) { + equipHighest(bot, RANGE_HELMS) + equipHighest(bot, RANGE_TOPS) + equipHighest(bot, RANGE_LEGS) + equipHighest(bot, CAPE) + equipHighest(bot, NGLOVES) + equipHighest(bot, NRBOOTS) + if(crossbow == true) { equipHighest(bot,CROSSBOWS); equipHighest(bot,MELEE_SHIELD); bot.equipment.add(Item(Items.BRONZE_BOLTS_877,Integer.MAX_VALUE),13,false,false) } + else {equipHighest(bot, BOWS); bot.equipment.add(Item(Items.BRONZE_ARROW_882,Integer.MAX_VALUE),13,false,false) } + bot.equipment.refresh() + } + + /** + * Gears a melee bot with the best gear for its stats. + * @param bot the bot to gear. + * @author Ceikry + */ + fun gearMeleeBot(bot: AIPlayer){ + equipHighest(bot, MELEE_HELMS) + equipHighest(bot, MELEE_LEG) + equipHighest(bot, MELEE_SHIELD) + equipHighest(bot, MELEE_TOP) + equipHighest(bot, CAPE) + equipHighest(bot, NGLOVES) + equipHighest(bot, NBOOTS) + equipHighest(bot, MELEE_WEP) + bot.equipment.refresh() + } + + /** + * Gears a Novice Pest control bot. + * @author Sir Kermit & Ceikry + */ + fun gearPCnRangedBot(bot: AIPlayer, crossbow: Boolean? = false, vararg skills: Int) { + var max = 0 + val level = RandomFunction.random(30, 70).also {max = 75 } + bot.fullRestore() + + bot.skills.setStaticLevel(Skills.RANGE, 50) + bot.skills.setStaticLevel(Skills.DEFENCE, 50) + bot.skills.setStaticLevel(Skills.ATTACK, level) + bot.skills.setStaticLevel(Skills.STRENGTH, level) + bot.skills.setStaticLevel(Skills.HITPOINTS, level) + bot.skills.setLevel(Skills.RANGE, 50) + bot.skills.setLevel(Skills.DEFENCE, 50) + bot.skills.setLevel(Skills.ATTACK, level) + bot.skills.setLevel(Skills.STRENGTH, level) + bot.skills.setLevel(Skills.HITPOINTS, level) + bot.skills.updateCombatLevel() + equipHighest(bot, PCRANGE_HELMS) + equipHighest(bot, PCRANGE_TOPS) + equipHighest(bot, PCRANGE_BACK) + equipHighest(bot, PCRANGE_LEGS) + bot.equipment.refresh() + equipHighest(bot, NECK) + equipHighest(bot, GLOVES) + equipHighest(bot, BOOTS) + equipHighest(bot, RING_ARCH) + bot.equipment.refresh() + if(crossbow == true) { equipHighest(bot,PCCROSSBOWS); equipHighest(bot,MELEE_SHIELD); bot.equipment.add(Item(Items.BRONZE_BOLTS_877,Integer.MAX_VALUE),13,false,false) } + else {equipHighest(bot, PCBOWS); bot.equipment.add(Item(Items.BRONZE_ARROW_882,Integer.MAX_VALUE),13,false,false) } + bot.skills.setStaticLevel(Skills.RANGE, 99) + bot.skills.setLevel(Skills.RANGE, 99) + bot.equipment.refresh() + } + + fun gearPCnMeleeBot(bot: AIPlayer, vararg skills: Int){ + var max = 0 + val initial = RandomFunction.random(30, 75).also {max = 75 } + var level = initial + bot.fullRestore() + + bot.skills.setStaticLevel(Skills.STRENGTH, level) + bot.skills.setStaticLevel(Skills.DEFENCE, level) + bot.skills.setStaticLevel(Skills.ATTACK, level) + bot.skills.setStaticLevel(Skills.HITPOINTS, level) + bot.skills.setStaticLevel(Skills.PRAYER, 70) + bot.skills.setStaticLevel(Skills.RANGE, 10) + bot.skills.setStaticLevel(Skills.MAGIC, 10) + bot.skills.setLevel(Skills.STRENGTH, level) + bot.skills.setLevel(Skills.DEFENCE, level) + bot.skills.setLevel(Skills.ATTACK, level) + bot.skills.setLevel(Skills.HITPOINTS, level) + bot.skills.setLevel(Skills.PRAYER, 70) + bot.skills.setLevel(Skills.RANGE, 10) + bot.skills.setLevel(Skills.MAGIC, 10) + bot.skills.updateCombatLevel() + equipHighest(bot, PCMELEE_HELMS) + equipHighest(bot, PCMELEE_LEG) + equipHighest(bot, PCMELEE_SHIELD) + equipHighest(bot, PCMELEE_TOP) + equipHighest(bot, PCMELEE_WEP) + bot.equipment.refresh() + equipHighest(bot, CAPE) + equipHighest(bot, NECK) + equipHighest(bot, GLOVES) + equipHighest(bot, BOOTS) + equipHighest(bot, RING_BERS) + bot.equipment.refresh() + bot.skills.setStaticLevel(Skills.DEFENCE, 70) + bot.skills.setStaticLevel(Skills.ATTACK, 99) + bot.skills.setStaticLevel(Skills.STRENGTH, 99) + bot.skills.setStaticLevel(Skills.HITPOINTS, 80) + bot.skills.setLevel(Skills.DEFENCE, 70) + bot.skills.setLevel(Skills.ATTACK, 99) + bot.skills.setLevel(Skills.STRENGTH, 99) + bot.skills.setLevel(Skills.HITPOINTS, 80) + bot.fullRestore() + } + /** + * Gears a Intermediate Pest control bot. + * @author Sir Kermit & Ceikry + */ + fun gearPCiRangedBot(bot: AIPlayer, crossbow: Boolean? = false, vararg skills: Int) { + var max = 0 + val level = RandomFunction.random(50, 80).also {max=99 } + bot.fullRestore() + + bot.skills.setStaticLevel(Skills.RANGE, level) + bot.skills.setStaticLevel(Skills.DEFENCE, 80) + bot.skills.setStaticLevel(Skills.ATTACK, level) + bot.skills.setStaticLevel(Skills.STRENGTH, level) + bot.skills.setStaticLevel(Skills.HITPOINTS, 70) + bot.skills.setStaticLevel(Skills.SUMMONING, 99) + bot.skills.setLevel(Skills.RANGE, level) + bot.skills.setLevel(Skills.DEFENCE, 80) + bot.skills.setLevel(Skills.ATTACK, level) + bot.skills.setLevel(Skills.STRENGTH, level) + bot.skills.setLevel(Skills.HITPOINTS, 70) + bot.skills.setLevel(Skills.SUMMONING, 99) + bot.skills.updateCombatLevel() + equipHighest(bot, PCRANGE_HELMS) + equipHighest(bot, PCRANGE_TOPS) + equipHighest(bot, PCRANGE_BACK) + equipHighest(bot, PCRANGE_LEGS) + bot.equipment.refresh() + equipHighest(bot, GLOVES) + equipHighest(bot, NECK) + equipHighest(bot, BOOTS) + equipHighest(bot, RING_ARCH) + bot.equipment.refresh() + if(crossbow == true) { equipHighest(bot,PCCROSSBOWS); equipHighest(bot,MELEE_SHIELD); bot.equipment.add(Item(Items.BRONZE_BOLTS_877,Integer.MAX_VALUE),13,false,false) } + else {equipHighest(bot, PCBOWS); bot.equipment.add(Item(Items.BRONZE_ARROW_882,Integer.MAX_VALUE),13,false,false) } + bot.skills.setStaticLevel(Skills.RANGE, 99) + bot.skills.setLevel(Skills.RANGE, 99) + bot.equipment.refresh() + } + + fun gearPCiMeleeBot(bot: AIPlayer, vararg skills: Int){ + var max = 0 + val initial = RandomFunction.random(55, 95).also {max=95 } + var level = initial + bot.fullRestore() + + bot.skills.setStaticLevel(Skills.STRENGTH, level) + bot.skills.setStaticLevel(Skills.DEFENCE, level) + bot.skills.setStaticLevel(Skills.ATTACK, level) + bot.skills.setStaticLevel(Skills.HITPOINTS, level) + bot.skills.setStaticLevel(Skills.PRAYER, 99) + bot.skills.setStaticLevel(Skills.RANGE, level) + bot.skills.setStaticLevel(Skills.MAGIC, level) + bot.skills.setStaticLevel(Skills.SUMMONING, 99) + bot.skills.setLevel(Skills.STRENGTH, level) + bot.skills.setLevel(Skills.DEFENCE, level) + bot.skills.setLevel(Skills.ATTACK, level) + bot.skills.setLevel(Skills.HITPOINTS, level) + bot.skills.setLevel(Skills.PRAYER, 99) + bot.skills.setLevel(Skills.RANGE, level) + bot.skills.setLevel(Skills.MAGIC, level) + bot.skills.setLevel(Skills.SUMMONING, 99) + bot.skills.updateCombatLevel() + equipHighest(bot, PCMELEE_HELMS) + equipHighest(bot, PCMELEE_LEG) + equipHighest(bot, PCMELEE_SHIELD) + equipHighest(bot, PCMELEE_TOP) + equipHighest(bot, PCMELEE_WEP) + bot.equipment.refresh() + equipHighest(bot, CAPE) + equipHighest(bot, NECK) + equipHighest(bot, GLOVES) + equipHighest(bot, BOOTS) + equipHighest(bot, RING_BERS) + bot.equipment.refresh() + bot.skills.setStaticLevel(Skills.DEFENCE, 99) + bot.skills.setStaticLevel(Skills.ATTACK, 99) + bot.skills.setStaticLevel(Skills.STRENGTH, 99) + bot.skills.setStaticLevel(Skills.HITPOINTS, 99) + bot.skills.setLevel(Skills.DEFENCE, 99) + bot.skills.setLevel(Skills.ATTACK, 99) + bot.skills.setLevel(Skills.STRENGTH, 99) + bot.skills.setLevel(Skills.HITPOINTS, 99) + bot.fullRestore() + } + + + /** + * Generates the stats for a bot with the given tier. + * @param bot the bot to gear + * @param tier the Tier of stats and gear. LOW, MED, HIGH, PURE. + * @param skills the skills that we should generate. + * @author Ceikry and Eli + */ + fun generateStats(bot: AIPlayer, tier: CombatBotAssembler.Tier, vararg skills: Int) { + var totalXPAdd = 0.0 + var skillAmt = 0.0 + val variance = 0.5 + var max = 0 + val initial = when (tier) { + Tier.LOW -> RandomFunction.random(33).also { max = 33 } + Tier.MED -> RandomFunction.random(33, 66).also { max = 66 } + Tier.HIGH -> RandomFunction.random(66, 99).also { max = 99 } + Tier.PURE -> RandomFunction.random(90, 99).also {max = 99 } + } + for (skill in skills.indices) { + val perc = RandomFunction.random(-variance,variance) + var level = initial + (perc * 33).toInt() + if(level < 1) + level = 1 + if(level > max) + level = max + bot.skills.setLevel(skills[skill], level) + bot.skills.setStaticLevel(skills[skill], level) + totalXPAdd += bot.skills.getExperience(skills[skill]) + skillAmt++ + } + when (tier){ + Tier.PURE -> bot.skills.setStaticLevel(Skills.DEFENCE,10) + Tier.PURE -> bot.skills.setStaticLevel(Skills.STRENGTH,99) + Tier.PURE -> bot.skills.setStaticLevel(Skills.ATTACK,90) + Tier.PURE -> bot.skills.setStaticLevel(Skills.PRAYER,43) + Tier.PURE -> bot.skills.setStaticLevel(Skills.RANGE,1) + Tier.PURE -> bot.skills.setStaticLevel(Skills.MAGIC,1) + } + + bot.skills.addExperience(Skills.HITPOINTS, (totalXPAdd / skillAmt) * 0.2) + val new_hp = bot.skills.levelFromXP((totalXPAdd / skillAmt) * 0.2) + bot.skills.setStaticLevel(Skills.HITPOINTS,10 + new_hp) + bot.skills.updateCombatLevel() + bot.fullRestore() + } + + /** + * Equips the highest piece of gear from a set for the stats the bot has. + * @param bot the bot to equip gear to. + * @param set the IntArray set to check + * @param levelcap (optional) the max level of gear to equip. + * @author Ceikry + */ + private fun equipHighest(bot: AIPlayer, set: Array, levelcap: Int? = null) { + val highestItems = ArrayList() + var highest: Item? = null + for (i in set.indices) { + val item = Item(set[i]) + var canEquip = true + (item.definition.handlers.getOrDefault("requirements",null) as HashMap?)?.let { map -> + levelcap?.let {levelcap -> + map.map { + if (bot.skills.getLevel(it.key) < it.value || it.value > levelcap) + canEquip = false + } + } ?: map.map { + if (bot.skills.getLevel(it.key) < it.value) + canEquip = false + } + } + if (canEquip) { + if (highest == null) { + highest = item + highestItems.add(item) + continue + } + if (item.lvlAvg() > highest.lvlAvg()) { + highest = item + highestItems.clear() + highestItems.add(item) + } else if(item.lvlAvg() == highest.lvlAvg()){ + highestItems.add(item) + } + } + } + bot.equipment.add(highestItems.random(), highest!!.definition!!.handlers["equipment_slot"] as Int, false, false) + } + + /** + * Extension function for the Item class that gets the average of its level requirements. + * @author Ceikry + */ + fun Item.lvlAvg(): Int { + var total = 1 + var count = 1 + (definition.handlers.getOrDefault("requirements",null) as HashMap?)?.let { map -> + map.map { + total += it.value + count++ + } + } + return total / count + } + + + val RANGE_HELMS = arrayOf(1167,4732,3749) + val RANGE_TOPS = arrayOf(1129,1131,1135,2499,2501,2503) + val RANGE_LEGS = arrayOf(1095,1097,1099,2493,2495,2497) + val BOWS = arrayOf(841,843,847,853) + val CROSSBOWS = arrayOf(9185,9174,9177,9176,9179,9181,9183) + + val PCRANGE_HELMS = arrayOf(1167,4732,3749,11718) + val PCRANGE_TOPS = arrayOf(1129,1131,1135,2503,11720) + val PCRANGE_LEGS = arrayOf(1095,1097,1099,2497,11722) + val PCRANGE_BACK = arrayOf(1019,10498,10499) + val PCBOWS = arrayOf(841,843,847,853) + val PCCROSSBOWS = arrayOf(9185,9174,9177,9176,9179,9181,9183) + + val MELEE_HELMS = arrayOf(1137,1139, 1141, 6621, 1143,1145,1147,1149,1151,1153, 6623, 1159,1163,1165,3748, 3751, 3753, 4716,4724, 4745, 4753) + val MELEE_TOP = arrayOf(1101,1103,1105,1107,1109,1111,1113,2513,1115,1117,1119,1121,1123,1125,1127,4720,4728,4749,4749) + val MELEE_LEG = arrayOf(1081,1083,1085,1087,1089,1091,1093,4759,1067,1069,1071,1073,1075,1077,1079,4722,4751,4722,4751) + val MELEE_SHIELD = arrayOf(1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201) + val MELEE_WEP = arrayOf(1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1321,1323,1325,1327,1329,1331,1333,4587,4151,1363,1365,1367,1369,1371,1373,1375,1377) + val NGLOVES = arrayOf(1059,2922,2912,2902,2932,2942,3799) + val NBOOTS = arrayOf(4121,4123,4125,4127,4129,4131,1061,1837,2579,9005) + val NRBOOTS = arrayOf(9006,626,628,630,632,634) + val NNECK = arrayOf(1704,1725,1729,1731) + val NRANGENECK = arrayOf(1478,1704) + val NRANGESHIELD = arrayOf(1191,1193,1195,1197,1199,1201) + + val PCMELEE_HELMS = arrayOf(1137,1139, 1141, 6621, 1143,1145,1147,1149,1151,1153, 6623, 1159,1163,1165,3748, 3751, 10828, 11335, 3753, 4716,4724, 4745, 4753, 3751) + val PCMELEE_TOP = arrayOf(1101,1103,1105,1107,1109,1111,1113,2513,1115,1117,1119,1121,1123,1125,1127,4720,4728,4749,4749,11724,14479,2513) + val PCMELEE_LEG = arrayOf(1081,1083,1085,1087,1089,1091,1093,4759,1067,1069,1071,1073,1075,1077,1079,4722,4751,4722,4751,11726,4087) + val PCMELEE_SHIELD = arrayOf(1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,6524,13742,13740,13738,13736,13734) + val PCMELEE_WEP = arrayOf(1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1321,1323,1325,1327,1329,1331,1333,4587,4151,1363,1365,1367,1369,1371,1373,1375,1377,1434,5698) + + val NECK = arrayOf(1704,6585) + val CAPE = arrayOf(1019,1021,1023,6568,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333,4335,4337,4339,4341,4343,4345,4347,4349,4351) + val GLOVES = arrayOf(1059,7456,7457,7458,7459,7460,7461,7462) + val BOOTS = arrayOf(1061,4131,11732,11728,4131) + val RING_BERS = arrayOf(6737) + val RING_ARCH = arrayOf(6733) + + val RICH_MELEE_HELMS = arrayOf(2587,2595,2605,2613,2619,2627,2657,2665,2673,3486,1149,10828,4716,4724,4753) +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/pvmbots/DragonKiller.java b/Server/src/main/java/Server/plugin/ai/pvmbots/DragonKiller.java new file mode 100644 index 000000000..25a340e74 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvmbots/DragonKiller.java @@ -0,0 +1,66 @@ +package plugin.ai.pvmbots; + +import core.game.node.entity.skill.Skills; +import plugin.ai.AIPlayer; +import core.game.node.entity.player.link.prayer.*; +import core.game.world.map.Location; +import core.game.world.map.zone.impl.WildernessZone; + +public class DragonKiller extends PvMBots{ + + private int tick = 0; + + public DragonKiller(Location l) { + super(l); + // TODO Auto-generated constructor stub + } + + @Override + public void tick() + { + super.tick(); + + //Despawn + if (this.getSkills().getLifepoints() == 0 || this.getLocation().equals(new Location(0, 0))) + //this.teleport(new Location(500, 500)); + //Despawning not being delayed causes 3 errors in the console + AIPlayer.deregister(this.getUid()); + + if (this.checkVictimIsPlayer()) + { + tryEscape(); + } + + //Npc Combat + if (tick == 0) + { + if (!this.inCombat()) + AttackNpcsInRadius(this, 15); + this.tick = 10; + } + else + this.tick--; + + this.eat(379); + this.getSkills().setLevel(Skills.PRAYER, 99); + this.getSkills().setStaticLevel(Skills.PRAYER, 99); + if (!(this.getPrayer().getActive().contains(PrayerType.PROTECT_FROM_MELEE))) + this.getPrayer().toggle(PrayerType.PROTECT_FROM_MELEE); + //this.getPrayer().toggle() + } + + public void tryEscape() + { + if (this.isTeleBlocked() == false) + { + if (WildernessZone.getWilderness(this) <= 20) + { + System.out.println("not Teleblocked"); + this.teleport(new Location(0, 0)); + } + } + else + return; + //run away + } +} diff --git a/Server/src/main/java/Server/plugin/ai/pvmbots/GiantMoleBot.java b/Server/src/main/java/Server/plugin/ai/pvmbots/GiantMoleBot.java new file mode 100644 index 000000000..e469d0a56 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvmbots/GiantMoleBot.java @@ -0,0 +1,68 @@ +package plugin.ai.pvmbots; + +import plugin.ai.AIPlayer; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.Item; +import core.game.world.map.Location; + +public class GiantMoleBot extends PvMBots{ + + public GiantMoleBot(Location l) { + super(l); + // TODO Auto-generated constructor stub + } + + int tick = 0; + int movetimer = 5; + + private void checkLightSource() + { + if (!this.getInventory().containItems(33)) + { + if (this.getInventory().containItems(36)) + this.getInventory().remove(new Item(36)); + this.getInventory().add(new Item(33)); + } + } + + @Override + public void tick() + { + checkLightSource(); + super.tick(); + PrayerType type[] = {PrayerType.PROTECT_FROM_MELEE, PrayerType.PIETY}; + this.CheckPrayer(type); + + //Despawn + if (this.getSkills().getLifepoints() == 0) + //this.teleport(new Location(500, 500)); + //Despawning not being delayed causes 3 errors in the console + AIPlayer.deregister(this.getUid()); + + //Npc Combat + if (this.tick == 0) + { + if (!this.inCombat()) + AttackNpcsInRadius(this, 50); + this.tick = 5; + } + + else + this.tick--; + + /*if (this.movetimer == 0) + { + if (!this.inCombat()) + { + this.randomWalk(10, 10); + } + this.movetimer = 4; + } + else + this.movetimer--;*/ + //if (this.getSkills().getLifepoints() > 1) + //this.eat(); + //this.getPrayer().toggle() + } + +} diff --git a/Server/src/main/java/Server/plugin/ai/pvmbots/LowestBot.java b/Server/src/main/java/Server/plugin/ai/pvmbots/LowestBot.java new file mode 100644 index 000000000..84bafd8fe --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvmbots/LowestBot.java @@ -0,0 +1,38 @@ +package plugin.ai.pvmbots; + +import plugin.ai.AIPlayer; +import core.game.world.map.Location; + +public class LowestBot extends PvMBots{ + + public LowestBot(Location l) { + super(l); + } + + private int tick = 0; + + @Override + public void tick(){ + super.tick(); + + this.tick++; + + //Despawn + if (this.getSkills().getLifepoints() == 0) + //this.teleport(new Location(500, 500)); + //Despawning not being delayed causes 3 errors in the console + AIPlayer.deregister(this.getUid()); + + //Npc Combat + if (this.tick % 10 == 0) { + if (!this.inCombat()) + AttackNpcsInRadius(this, 5); + } + + if (this.tick == 100) this.tick = 0; + + this.eat(329); + //this.getPrayer().toggle() + } + +} diff --git a/Server/src/main/java/Server/plugin/ai/pvmbots/NoobBot.java b/Server/src/main/java/Server/plugin/ai/pvmbots/NoobBot.java new file mode 100644 index 000000000..696048f69 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvmbots/NoobBot.java @@ -0,0 +1,54 @@ +package plugin.ai.pvmbots; + +import plugin.ai.AIPlayer; +import core.game.world.map.Location; + +public class NoobBot extends PvMBots{ + + private int tick = 0; + private int movetimer = 0; + + public NoobBot(Location l) { + super(l); + // TODO Auto-generated constructor stub + } + + @Override + public void tick() + { + super.tick(); + + //Despawn + if (this.getSkills().getLifepoints() == 0) + //this.teleport(new Location(500, 500)); + //Despawning not being delayed causes 3 errors in the console + AIPlayer.deregister(this.getUid()); + + //Npc Combat + if (tick == 0) + { + if (!this.inCombat()) + AttackNpcsInRadius(this, 5); + this.tick = 5; + } + else + this.tick--; + + this.eat(329); + //this.getPrayer().toggle() + //System.out.println(this.getPulseManager().getCurrent()); + + if (!this.inCombat()) + { + if (movetimer == 0) + { + if (this.FindTargets(this, 5) == null) + this.randomWalk(5, 5); + this.movetimer = 10; + } + else + movetimer --; + } + } + +} diff --git a/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBots.java b/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBots.java new file mode 100644 index 000000000..1119ee77e --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBots.java @@ -0,0 +1,150 @@ +package plugin.ai.pvmbots; + +import java.util.ArrayList; +import java.util.List; + +import core.game.content.consumable.Consumable; +import core.game.content.consumable.Consumables; +import core.game.content.consumable.Food; +import core.game.content.consumable.effects.HealingEffect; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.Entity; +import core.game.node.entity.npc.NPC; +import core.game.node.entity.player.Player; +import plugin.ai.AIPlayer; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.tools.RandomFunction; + +public class PvMBots extends AIPlayer { + + //Used so the bot doesn't spam actions + private int tick = 0; + + public PvMBots(Location l) { + super(l); + } + + public PvMBots(String copyFromFile, Location l) { + super(copyFromFile, l); + } + + + public List FindTargets(Entity entity, int radius) { + List targets = new ArrayList<>(); + Object[] localNPCs = RegionManager.getLocalNpcs(entity,radius).toArray(); + int length = localNPCs.length; + if(length > 5){length = 5;} + for (int i = 0; i < length; i++) { + NPC npc = (NPC) localNPCs[i]; + { + if (checkValidTargets(npc)) + targets.add(npc); + } + } + if (targets.size() == 0) + return null; + return targets; + } + + public boolean checkValidTargets(NPC target) { + if (!target.isActive()) { + return false; + } + if (!target.getProperties().isMultiZone() && target.inCombat()) { + return false; + } + if (!target.getDefinition().hasAction("attack")) { + return false; + } + return true; + } + + public boolean AttackNpcsInRadius(int radius) + { + return AttackNpcsInRadius(this, radius); + } + + /** + * Attacks NPCs in radius of bot + * @param bot + * @param radius + * @return true if bot will be fighting + */ + public boolean AttackNpcsInRadius(Player bot, int radius) { + if (bot.inCombat()) + return true; + List creatures = FindTargets(bot, radius); + if (creatures == null) { + return false; + } + bot.attack(creatures.get(RandomFunction.getRandom((creatures.size() - 1)))); + if (!creatures.isEmpty()) { + return true; + } else { + creatures = FindTargets(bot, radius); + if (!creatures.isEmpty()) + { + bot.attack(creatures.get(RandomFunction.getRandom((creatures.size() - 1)))); + return true; + } + return false; + } + } + + @Override + public void tick() { + super.tick(); + + this.tick++; + + //Despawn + if (this.getSkills().getLifepoints() <= 5){ + //TODO: Just respawn a new bot (not sure how you'd do that :L) + // Maybe make all PvMBots know what to do if they aren't in right area? I.e. pest control bots teleport to PC + //this.teleport(new Location(500, 500)); + //Despawning not being delayed causes 3 errors in the console + this.getSkills().setLifepoints(20); + } + + //Npc Combat + /*if (this.tick % 10 == 0) { + if (!this.inCombat()) + AttackNpcsInRadius(this, 5); + }*/ + + if (this.tick == 100) this.tick = 0; + + //this.eat(); + //this.getPrayer().toggle() + } + + public void CheckPrayer(PrayerType type[]) { + for (int i = 0; i < type.length; i++) + this.getPrayer().toggle(type[i]); + } + + public void eat(int foodId) { + Item foodItem = new Item(foodId); + + if ((this.getSkills().getStaticLevel(Skills.HITPOINTS) >= this.getSkills().getLifepoints() * 3) && this.getInventory().containsItem(foodItem)) { + this.lock(3); + //this.animate(new Animation(829)); + Item food = this.getInventory().getItem(foodItem); + + Consumable consumable = Consumables.getConsumableById(food.getId()); + + if (consumable == null) { + consumable = new Food(new int[] {food.getId()}, new HealingEffect(1)); + } + + consumable.consume(food, this); + this.getProperties().getCombatPulse().delayNextAttack(3); + } + if (this.checkVictimIsPlayer() == false) + if (!(this.getInventory().contains(foodId, 1))) + this.getInventory().add(new Item(foodId, 5)); //Add Food to Inventory + } +} diff --git a/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBotsBuilder.kt b/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBotsBuilder.kt new file mode 100644 index 000000000..63b5d8a78 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvmbots/PvMBotsBuilder.kt @@ -0,0 +1,515 @@ +package plugin.ai.pvmbots + +import core.game.container.impl.EquipmentContainer +import core.game.node.entity.combat.CombatSpell +import core.game.node.entity.player.link.SpellBookManager +import core.game.node.entity.player.link.appearance.Gender +import core.game.node.item.Item +import core.game.world.GameWorld +import core.game.world.map.Location +import core.tools.RandomFunction +import plugin.ai.AIPlayer +import plugin.ai.minigamebots.pestcontrol.PestControlTestBot +import plugin.ai.minigamebots.pestcontrol.PestControlTestBot2 +import core.game.node.entity.skill.Skills +import java.util.* +import java.util.concurrent.Executors + +// import sun.util.resources.CalendarData; +class PvMBotsBuilder { + fun randomItem() { + var test: Item? = null + val tests = ArrayList() + for (x in 0..9998) test = Item(x) + if (test!!.definition.equipId != 0) tests.add(test) + } + + companion object { + var botsSpawned = 0 + + fun create(l: Location?): PvMBots { + botsSpawned++ + return PvMBots(l) + } + + fun createLowest(l: Location?): LowestBot { + botsSpawned++ + return LowestBot(l) + } + + fun createNoob(l: Location?): NoobBot { + botsSpawned++ + return NoobBot(l) + } + + fun createDragonKiller(l: Location?): DragonKiller { + botsSpawned++ + return DragonKiller(l) + } + + fun createGiantMoleBot(l: Location?): GiantMoleBot { + botsSpawned++ + return GiantMoleBot(l) + } + + fun generateGiantMoleBot(p: PvMBots) { + p.skills.setLevel(Skills.SLAYER, 99) + p.skills.setStaticLevel(Skills.SLAYER, 99) + p.skills.setLevel(Skills.STRENGTH, 99) + p.skills.setStaticLevel(Skills.STRENGTH, 99) + p.skills.setLevel(Skills.ATTACK, 99) + p.skills.setStaticLevel(Skills.ATTACK, 99) + p.skills.setStaticLevel(Skills.HITPOINTS, 99) + p.skills.setLevel(Skills.HITPOINTS, 99) + p.skills.setStaticLevel(Skills.DEFENCE, 99) + p.skills.setLevel(Skills.DEFENCE, 99) + p.skills.setStaticLevel(Skills.PRAYER, 99) + p.skills.setLevel(Skills.PRAYER, 99) + p.skills.updateCombatLevel() + p.appearance.sync() + p.equipment.replace(Item(4720), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(4722), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(4716), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(4718), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(-1), EquipmentContainer.SLOT_SHIELD) + p.inventory.add(Item(952)) + p.inventory.add(Item(33)) + } + + fun generateMinLevels(p: PvMBots) { + //Slayer so they can attack all monsters + p.skills.setLevel(Skills.SLAYER, 99) + p.skills.setStaticLevel(Skills.SLAYER, 99) + val combatType = RandomFunction.getRandom(2) + p.skills.setLevel(Skills.HITPOINTS, 15) + p.skills.setStaticLevel(Skills.HITPOINTS, 15) + p.inventory.add(Item(329, 5)) + when (combatType) { + 0 -> { + buildArcherStats(p) + buildArcherEquipment(p) + } + 1 -> { + buildMeleeStats(p) + buildMeleeEquipment(p) + } + 2 -> { + buildMageStats(p) + buildMagicEquipment(p) + setupWizard(p) + } + else -> { + buildMeleeStats(p) + buildMeleeEquipment(p) + } + } + } + + fun createDragonKiller(p: DragonKiller) { + p.skills.setLevel(Skills.SLAYER, 99) + p.skills.setStaticLevel(Skills.SLAYER, 99) + val combatType = RandomFunction.getRandom(2) + p.skills.setLevel(Skills.HITPOINTS, 55) + p.skills.setStaticLevel(Skills.HITPOINTS, 55) + when (combatType) { + 0 -> { + buildDragonArcherStats(p) + buildDragonArcherEquipment(p) + } + 1 -> { + buildDragonMeleeStats(p) + buildDragonMeleeEquipment(p) + } + else -> { + buildDragonMeleeStats(p) + buildDragonMeleeEquipment(p) + } + } + } + + private fun buildMaxMeleeStats(p: AIPlayer) { + p.skills.setLevel(Skills.ATTACK, 99) + p.skills.setStaticLevel(Skills.ATTACK, 99) + p.skills.setLevel(Skills.STRENGTH, 99) + p.skills.setStaticLevel(Skills.STRENGTH, 99) + p.skills.setLevel(Skills.DEFENCE, 99) + p.skills.setStaticLevel(Skills.DEFENCE, 99) + p.skills.updateCombatLevel() + p.appearance.sync() + } + + private fun buildMaxMeleeEquipment(p: AIPlayer) { + val helms = intArrayOf( + 3751) + val shield = intArrayOf( + 14767) + val platebody = intArrayOf( + 11724) + val platelegs = intArrayOf( + 11726) + val amulets = intArrayOf( + 6585) + val boots = intArrayOf( + 3105) + val cape = intArrayOf( + 6570) + val gloves = intArrayOf( + 7462) + val weapons2 = intArrayOf( + 4151) + val arrows = intArrayOf( + 892) + p.equipment.replace(Item(helms[RandomFunction.random(helms.size)]), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(shield[RandomFunction.random(shield.size)]), EquipmentContainer.SLOT_SHIELD) + p.equipment.replace(Item(platebody[RandomFunction.random(platebody.size)]), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(platelegs[RandomFunction.random(platelegs.size)]), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(weapons2[RandomFunction.random(weapons2.size)]), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(weapons2[RandomFunction.random(arrows.size)], 99999), EquipmentContainer.SLOT_ARROWS) + p.equipment.replace(Item(amulets[RandomFunction.random(amulets.size)]), EquipmentContainer.SLOT_AMULET) + p.equipment.replace(Item(boots[RandomFunction.random(boots.size)]), EquipmentContainer.SLOT_FEET) + p.equipment.replace(Item(cape[RandomFunction.random(cape.size)]), EquipmentContainer.SLOT_CAPE) + p.equipment.replace(Item(gloves[RandomFunction.random(gloves.size)]), EquipmentContainer.SLOT_HANDS) + } + + fun createNoob(p: NoobBot) { + p.skills.setLevel(Skills.SLAYER, 99) + p.skills.setStaticLevel(Skills.SLAYER, 99) + val combatType = RandomFunction.getRandom(3) + p.skills.setLevel(Skills.HITPOINTS, 10 + RandomFunction.getRandom(10)) + p.skills.setStaticLevel(Skills.HITPOINTS, 10 + RandomFunction.getRandom(10)) + p.skills.setLevel(Skills.DEFENCE, 1 + RandomFunction.getRandom(9)) + p.skills.setStaticLevel(Skills.DEFENCE, 1 + RandomFunction.getRandom(9)) + p.inventory.add(Item(329, 5)) + when (combatType) { + 0 -> { + buildNoobArcherStats(p) + buildNoobArcherEquipment(p) + } + 1 -> { + buildNoobMeleeStats(p) + buildNoobMeleeEquipment(p) + } + 2 -> { + run { + buildNoobMageStats(p) + buildNoobMagicEquipment(p) + setupWizard(p) + } + run { + buildNoobMeleeStats(p) + buildNoobMeleeEquipment(p) + } + } + else -> { + buildNoobMeleeStats(p) + buildNoobMeleeEquipment(p) + } + } + } + + private fun buildArcherStats(p: PvMBots) { + p.skills.setLevel(Skills.RANGE, 10) + p.skills.setStaticLevel(Skills.RANGE, 10) + p.skills.setLevel(Skills.DEFENCE, 10) + p.skills.setStaticLevel(Skills.DEFENCE, 10) + p.skills.updateCombatLevel() + p.appearance.sync() + } + + private fun buildDragonArcherStats(p: DragonKiller) { + p.skills.setStaticLevel(Skills.RANGE, 55 + RandomFunction.getRandom(15)) + p.skills.setLevel(Skills.RANGE, p.skills.getLevel(Skills.RANGE)) + p.skills.updateCombatLevel() + p.appearance.sync() + } + + private fun buildNoobArcherStats(p: NoobBot) { + p.skills.setLevel(Skills.RANGE, 1 + RandomFunction.getRandom(10)) + p.skills.setStaticLevel(Skills.RANGE, 1 + RandomFunction.getRandom(10)) + p.skills.updateCombatLevel() + p.appearance.sync() + } + + fun buildMeleeStats(p: PvMBots) { + p.skills.setLevel(Skills.ATTACK, 10) + p.skills.setStaticLevel(Skills.ATTACK, 10) + p.skills.setLevel(Skills.STRENGTH, 10) + p.skills.setStaticLevel(Skills.STRENGTH, 10) + p.skills.setLevel(Skills.DEFENCE, 10) + p.skills.setStaticLevel(Skills.DEFENCE, 10) + p.skills.updateCombatLevel() + p.appearance.sync() + } + + fun buildDragonMeleeStats(p: DragonKiller) { + p.skills.setStaticLevel(Skills.ATTACK, 55 + RandomFunction.getRandom(15)) + p.skills.setLevel(Skills.ATTACK, p.skills.getLevel(Skills.ATTACK)) + p.skills.setStaticLevel(Skills.STRENGTH, 55 + RandomFunction.getRandom(15)) + p.skills.setLevel(Skills.STRENGTH, p.skills.getLevel(Skills.STRENGTH)) + p.skills.setLevel(Skills.DEFENCE, 45 + RandomFunction.getRandom(15)) + p.skills.setLevel(Skills.DEFENCE, p.skills.getLevel(Skills.DEFENCE)) + p.skills.updateCombatLevel() + p.appearance.sync() + } + + private fun buildNoobMeleeStats(p: NoobBot) { + p.skills.setLevel(Skills.ATTACK, 1 + RandomFunction.getRandom(10)) + p.skills.setStaticLevel(Skills.ATTACK, 1 + RandomFunction.getRandom(10)) + p.skills.setLevel(Skills.STRENGTH, 1 + RandomFunction.getRandom(10)) + p.skills.setStaticLevel(Skills.STRENGTH, 1 + RandomFunction.getRandom(10)) + p.skills.updateCombatLevel() + p.appearance.sync() + } + + private fun buildMageStats(p: PvMBots) { + p.skills.setLevel(Skills.MAGIC, 10) + p.skills.setStaticLevel(Skills.MAGIC, 10) + p.skills.setLevel(Skills.DEFENCE, 10) + p.skills.setStaticLevel(Skills.DEFENCE, 10) + p.skills.updateCombatLevel() + p.appearance.sync() + } + + private fun buildNoobMageStats(p: NoobBot) { + p.skills.setLevel(Skills.MAGIC, 1 + RandomFunction.getRandom(10)) + p.skills.setStaticLevel(Skills.MAGIC, 1 + RandomFunction.getRandom(10)) + p.skills.updateCombatLevel() + p.appearance.sync() + } + + private fun setupWizard(p: PvMBots) { + //final int SPELL_IDS[] = new int[] {1, 4, 6, 8, 10, 14, 17, 20, 24, 27, 33, 38, 45, 48, 52, 55 }; + p.properties.autocastSpell = SpellBookManager.SpellBook.MODERN.getSpell(1) as CombatSpell + p.inventory.add(Item(556, 1000)) //Air runes + p.inventory.add(Item(558, 1000)) //Mind runes + } + + private fun buildArcherEquipment(p: PvMBots) { + p.equipment.replace(Item(1169), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(1129), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(1095), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(841), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(884, 5000), EquipmentContainer.SLOT_ARROWS) + p.equipment.replace(Item(1007), EquipmentContainer.SLOT_CAPE) + p.equipment.replace(Item(1478), EquipmentContainer.SLOT_AMULET) + } + + private fun buildDragonArcherEquipment(p: DragonKiller) { + p.equipment.replace(Item(1169), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(13483), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(1099), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(9185), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(1540), EquipmentContainer.SLOT_SHIELD) + p.equipment.replace(Item(9140, 500), EquipmentContainer.SLOT_ARROWS) + p.equipment.replace(Item(10498), EquipmentContainer.SLOT_CAPE) + p.equipment.replace(Item(1478), EquipmentContainer.SLOT_AMULET) + } + + private fun buildNoobArcherEquipment(p: PvMBots) { + val hats = intArrayOf(1169, 1169, 1139, 1137, 1153, 579) + val legs = intArrayOf(1095, 7366, 1075, 1087, 1095) + val chest = intArrayOf(1129, 1103, 1101, 1129, 1117, 577) + p.equipment.replace(Item(hats[RandomFunction.getRandom(hats.size - 1)]), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(chest[RandomFunction.getRandom(chest.size - 1)]), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(legs[RandomFunction.getRandom(legs.size - 1)]), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(841), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(884, 5000), EquipmentContainer.SLOT_ARROWS) + p.equipment.replace(Item(1007), EquipmentContainer.SLOT_CAPE) + p.equipment.replace(Item(1478), EquipmentContainer.SLOT_AMULET) + } + + private fun buildMeleeEquipment(p: PvMBots) { + p.equipment.replace(Item(1153), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(1115), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(1067), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(1309), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(884), EquipmentContainer.SLOT_ARROWS) + p.equipment.replace(Item(1007), EquipmentContainer.SLOT_CAPE) + p.equipment.replace(Item(1725), EquipmentContainer.SLOT_AMULET) + } + + private fun buildDragonMeleeEquipment(p: DragonKiller) { + p.equipment.replace(Item(1163), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(1127), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(1079), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(1333), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(1540), EquipmentContainer.SLOT_SHIELD) + p.equipment.replace(Item(1007), EquipmentContainer.SLOT_CAPE) + p.equipment.replace(Item(1725), EquipmentContainer.SLOT_AMULET) + } + + private fun buildNoobMeleeEquipment(p: PvMBots) { + val hats = intArrayOf(1169, 1169, 1139, 1137, 1153, 579) + val legs = intArrayOf(1095, 7366, 1075, 1087, 1095) + val chest = intArrayOf(1129, 1103, 1101, 1129, 1117, 577) + val weapons = intArrayOf(1307, 1321, 1375, 1203, 1239, 1267, 1293, 1323, 1335) + p.equipment.replace(Item(hats[RandomFunction.getRandom(hats.size - 1)]), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(chest[RandomFunction.getRandom(chest.size - 1)]), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(legs[RandomFunction.getRandom(legs.size - 1)]), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(weapons[RandomFunction.getRandom(weapons.size - 1)]), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(884), EquipmentContainer.SLOT_ARROWS) + p.equipment.replace(Item(1007), EquipmentContainer.SLOT_CAPE) + p.equipment.replace(Item(1725), EquipmentContainer.SLOT_AMULET) + } + + private fun buildMagicEquipment(p: PvMBots) { + p.equipment.replace(Item(579), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(577), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(1011), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(1389), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(884), EquipmentContainer.SLOT_ARROWS) + p.equipment.replace(Item(1007), EquipmentContainer.SLOT_CAPE) + p.equipment.replace(Item(1727), EquipmentContainer.SLOT_AMULET) + } + + private fun buildNoobMagicEquipment(p: PvMBots) { + val hats = intArrayOf(1169, 1169, 1139, 1137, 1153, 579) + val legs = intArrayOf(1095, 7366, 1075, 1087, 1095) + val chest = intArrayOf(1129, 1103, 1101, 1129, 1117, 577) + val weapons = intArrayOf(1379, 1383, 1385, 1387, 1389) + p.equipment.replace(Item(hats[RandomFunction.getRandom(hats.size - 1)]), EquipmentContainer.SLOT_HAT) + p.equipment.replace(Item(chest[RandomFunction.getRandom(chest.size - 1)]), EquipmentContainer.SLOT_CHEST) + p.equipment.replace(Item(legs[RandomFunction.getRandom(legs.size - 1)]), EquipmentContainer.SLOT_LEGS) + p.equipment.replace(Item(weapons[RandomFunction.getRandom(weapons.size - 1)]), EquipmentContainer.SLOT_WEAPON) + p.equipment.replace(Item(884), EquipmentContainer.SLOT_ARROWS) + p.equipment.replace(Item(1007), EquipmentContainer.SLOT_CAPE) + p.equipment.replace(Item(1727), EquipmentContainer.SLOT_AMULET) + } + + fun spawn(loc: Location?) { + val bot = create(loc) + bot.appearance.gender = if (RandomFunction.random(3) == 1) Gender.FEMALE else Gender.MALE + } + + fun spawnLowest(loc: Location?) { + val bot = createLowest(loc) + generateMinLevels(bot) + } + + fun spawnNoob(loc: Location?) { + val bot = createNoob(loc) + createNoob(bot) + } + + fun spawnDragonKiller(loc: Location?) { + val bot = createDragonKiller(loc) + bot.appearance.gender = if (RandomFunction.random(3) == 1) Gender.FEMALE else Gender.MALE + createDragonKiller(bot) + } + + fun spawnGiantMoleBot(loc: Location?) { + val bot = createGiantMoleBot(Location(0, 0)) + bot.teleport(loc) + bot.appearance.gender = if (RandomFunction.random(3) == 1) Gender.FEMALE else Gender.MALE + generateGiantMoleBot(bot) + } + + @JvmStatic + fun immersiveSpawns() { + Executors.newSingleThreadExecutor().execute { + /*//Lumbridge + //GOBLINS + spawnLowest(new Location(3259, 3224)); + spawnLowest(new Location(3251, 3235)); + spawnLowest(new Location(3244, 3247)); + spawnNoob(new Location(3244, 3247)); + //COWS + spawnLowest(new Location(3259, 3245)); + spawnLowest(new Location(3258, 3261)); + spawnLowest(new Location(3263, 3263)); + spawnLowest(new Location(3263, 3271)); + spawnLowest(new Location(3254, 3288)); + //CHICKENS + spawnLowest(new Location(3234, 3294)); + spawnLowest(new Location(3229, 3297)); + //GOBLINS2 + spawnLowest(new Location(3182, 3255)); + spawnLowest(new Location(3169, 3254)); + spawnLowest(new Location(3167, 3233)); + spawnLowest(new Location(3152, 3228));*/ + //Lumby castle + spawnLowest(Location(3221, 3219)) + /* spawnNoob(new Location(3193, 3208)); + //Lumby swamp + spawnNoob(new Location(3224, 3186)); + spawnNoob(new Location(3217, 3177)); + spawnNoob(new Location(3209, 3191)); + + //Edge + spawnLowest(new Location(3096, 3509)); + + //Edge dungeon + //Hill giants + spawnLowest(new Location(3118, 9848)); + spawnLowest(new Location(3110, 9842)); + spawnLowest(new Location(3115, 9836)); + spawnLowest(new Location(3107, 9832)); + spawnLowest(new Location(3099, 9834)); + //brass key room + spawnLowest(new Location(3127, 9863)); + + //Dark wizzards + spawnLowest(new Location(3226, 3367)); + spawnLowest(new Location(3226, 3368)); + spawnLowest(new Location(3230, 3373)); + spawnLowest(new Location(3209, 3378)); + + //Varrock palace + spawnLowest(new Location(3218, 3465)); + spawnLowest(new Location(3209, 3462)); + + //Varrock Sewers + spawnLowest(new Location(3235, 9868)); + spawnLowest(new Location(3242, 9915)); + spawnLowest(new Location(3176, 9883)); + + //Dragons Wilderness + //WEST + spawnDragonKiller(new Location(2977, 3614)); + spawnDragonKiller(new Location(2987, 3619)); + + //Burthrope Dungeon + //Blue dragons + spawnDragonKiller(new Location(2901, 9799)); + spawnDragonKiller(new Location(2910, 9804)); + //Al kharid + //palace + spawnLowest(new Location(3301, 3173)); + spawnNoob(new Location(3293, 3170)); + spawnNoob(new Location(3286, 3171)); + spawnNoob(new Location(3289, 3169)); + + //Slayer Tower + spawnLowest(new Location(3412, 3173)); + spawnNoob(new Location(3412, 3539)); + spawnNoob(new Location(3420, 3545)); + spawnNoob(new Location(3420, 3545)); + spawnNoob(new Location(3420, 3558)); + spawnNoob(new Location(3433, 3571)); + //Replace with something like rune bots + spawnDragonKiller(new Location(3437, 3562, 1)); + spawnDragonKiller(new Location(3437, 3562, 1)); + spawnDragonKiller(new Location(3437, 3562, 1)); + //Bloodvelds + spawnDragonKiller(new Location(3417, 3561, 1)); + spawnDragonKiller(new Location(3417, 3561, 1)); + spawnDragonKiller(new Location(3417, 3561, 1)); + //Brimhaven dragons + spawnDragonKiller(new Location(2704, 9450)); + spawnDragonKiller(new Location(2704, 9450));*/println("[" + GameWorld.settings?.name + "]: PvMBotsBuilder: Spawned " + botsSpawned + " bots.") + } + } + + @JvmStatic + fun createPestControlTestBot2(l: Location?): PestControlTestBot2 { + botsSpawned++ + return PestControlTestBot2(l!!) + } + @JvmStatic + fun createPestControlTestBot(l: Location?): PestControlTestBot { + botsSpawned++ + return PestControlTestBot(l!!) + } + + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/pvp/PVPAIPActions.java b/Server/src/main/java/Server/plugin/ai/pvp/PVPAIPActions.java new file mode 100644 index 000000000..4a8074046 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvp/PVPAIPActions.java @@ -0,0 +1,196 @@ +package plugin.ai.pvp; + +import java.util.List; + +import core.game.container.impl.EquipmentContainer; +import core.game.content.consumable.Consumable; +import core.game.content.consumable.Consumables; +import core.game.content.consumable.Food; +import core.game.content.consumable.effects.HealingEffect; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import plugin.ai.AIPlayer; +import core.game.node.item.Item; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.map.path.Pathfinder; +import core.game.world.update.flag.context.ChatMessage; +import core.game.world.update.flag.player.ChatFlag; +import core.tools.RandomFunction; + +public class PVPAIPActions { + + public static List pvp_players = null; + + private static final String[] trashMessages = { + "I'll do your bloody nan in m8", + "Your sister smells like a tuna sandwich", + "You suck at bridding bro lmao", + "Gf your bank :)", + "Just delete your cache ur bad", + "FFS mate get wrekt", + "Dylan is a better pkr than u, kid..l0l" + + + }; + + private static final String[] safeMessages = { + "Safe up n00b", + "No safe", + "Get rekt m8", + "Stop fkin eating scrub", + "Dw, you're gunna die anyhow.. :)", + "Either ur eating shrimps or I'm hitting high asf", + "Once i kill u wanna rematch?", + + }; + + public static void syncBotThread(final Player player) { + if (pvp_players == null || pvp_players.size() == 0) { + return; + } + for (int aip_index = 0; aip_index < pvp_players.size(); aip_index++) { + final AIPlayer bot = pvp_players.get(aip_index); + final AIPlayer[] target = { + pvp_players.get(RandomFunction.getRandom(pvp_players.size() - 1)) + }; + bot.getProperties().setRetaliating(true); + bot.setAttribute("dead", false); + GameWorld.getPulser().submit(new Pulse(1, bot) { + int ticks; + @Override + public boolean pulse() { + if (bot.getAttribute("dead", true)) { + AIPlayer.deregister(bot.getUid()); + pvp_players.remove(bot); + return true; + } + if (!bot.getInventory().contains(385, 1)) { + flee(bot); + return true; + } + //Inactivity logout timer. + if (ticks++ == 5000 && !bot.getProperties().getCombatPulse().isInCombat() && !bot.getProperties().getCombatPulse().isAttacking() && bot.getWalkingQueue().getQueue().isEmpty()) { + AIPlayer.deregister(bot.getUid()); + pvp_players.remove(bot); + return true; + } + if (!pvp_players.contains(target) || !Pathfinder.find(bot, target[0]).isSuccessful() || !canAttack(bot, target[0])) { + target[0] = pvp_players.get(RandomFunction.getRandom(pvp_players.size() - 1)); + } + attackTarget(player, bot, target[0]); + //prayer(bot, target[0]); + eat(bot, target[0]); + return false; + } + }); + } + } + + + private static void attackTarget(Player player, AIPlayer bot, AIPlayer target) { + //If bots target is not himself we continue. + if (bot != target) { + //If they are in combat or attacking: + if (bot.getProperties().getCombatPulse().isInCombat() || bot.getProperties().getCombatPulse().isAttacking()) { + //TODO: Pray + Item weapon = bot.getEquipment().get(EquipmentContainer.SLOT_WEAPON); + if (RandomFunction.getRandom(25) == 1) { + if(bot.getSettings().getSpecialEnergy() == 100) { //TODO: Change 100 to their weielded weapons spec max amount + bot.getSettings().toggleSpecialBar(); + } + } + } else { + if (RandomFunction.getRandom(25) == 1) { + bot.attack(player); + } else { + //If a 1/50 chance is true, the attacker screams his opponents name hoping his team will dogpile him. + int chatRandom = RandomFunction.getRandom(50); + switch(chatRandom) { + case 1: + String target_name = target.getName().substring(0, 1).toUpperCase() + target.getName().substring(1); + bot.getUpdateMasks().register(new ChatFlag(new ChatMessage(bot, target_name, 0, 0))); + break; + case 2: + bot.getUpdateMasks().register(new ChatFlag(new ChatMessage(bot, trashMessages[RandomFunction.getRandom(trashMessages.length - 1)], 0, 0))); + break; + } + bot.attack(target); + } + } + } + } + + /** + * A basic flee method to run them to another part of the wilderness. + * @param bot + * TODO: Possibly make them run away and hop the ditch (I did not do this because we have no other actions than pking at the moment). + */ + private static void flee(final AIPlayer bot) { + bot.sendChat("Outta food m8! Off!"); + bot.sendChat("Ahh!"); + bot.sendChat("GTFO M8"); + bot.sendChat("Someone spec him!"); + GameWorld.getPulser().submit(new Pulse(1, bot) { + int ticks; + @Override + public boolean pulse() { + switch(ticks++) { + case 1: + bot.getProperties().getCombatPulse().stop(); + bot.getProperties().getCombatPulse().setNextAttack(RandomFunction.getRandom(10)); + Pathfinder.find(bot, bot.getLocation().transform(RandomFunction.random(-100, 100), RandomFunction.random(-100, 100), 0), false, Pathfinder.SMART).walk(bot); + break; + case 500: + AIPlayer.deregister(bot.getUid()); + pvp_players.remove(bot); + return true; + } + if (bot.getAttribute("dead", true)) { + AIPlayer.deregister(bot.getUid()); + pvp_players.remove(bot); + return true; + } + return false; + } + }); + } + + /** + * Handles the eating of the AI player bots. + * @param bot + * TODO: Possibly add more food choices. + */ + private static void eat(Player bot, AIPlayer target) { + Item shark = new Item(385); + //385 is shark, you can add more from there easier. + if((bot.getSkills().getStaticLevel(Skills.HITPOINTS) > bot.getSkills().getLifepoints() * 3) && bot.getInventory().containsItem(shark)) { + bot.lock(3); + Item food = bot.getInventory().getItem(shark); + Consumable consumable = Consumables.getConsumableById(food.getId()); + if (consumable == null) { + consumable = new Food(new int[] {food.getId()}, new HealingEffect(1)); + } + consumable.consume(food, bot); + bot.getProperties().getCombatPulse().delayNextAttack(3); + int chatRandom = RandomFunction.getRandom(50); + if (chatRandom == 1) { + bot.getUpdateMasks().register(new ChatFlag(new ChatMessage(bot, safeMessages[RandomFunction.getRandom(safeMessages.length - 1)], 0, 0))); + } + } + } + + private static boolean canAttack(Player p, Player t) { + int level = p.getSkullManager().getLevel(); + if (t.getSkullManager().getLevel() < level) { + level = t.getSkullManager().getLevel(); + } + int combat = p.getProperties().getCombatLevel(); + int targetCombat = t.getProperties().getCombatLevel(); + if (combat - level > targetCombat || combat + level < targetCombat) { + return false; + } + return true; + } + +} diff --git a/Server/src/main/java/Server/plugin/ai/pvp/PVPAIPBuilderUtils.java b/Server/src/main/java/Server/plugin/ai/pvp/PVPAIPBuilderUtils.java new file mode 100644 index 000000000..c05b09bf8 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/pvp/PVPAIPBuilderUtils.java @@ -0,0 +1,2795 @@ +package plugin.ai.pvp; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.combat.CombatSpell; +import plugin.ai.AIPlayer; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.item.Item; +import core.tools.RandomFunction; + +public class PVPAIPBuilderUtils { + + public static void generateClass(AIPlayer p) { + int combatType = RandomFunction.getRandom(2); + switch(combatType) { + case 0: + buildArcherStats(p); + buildArcherEquipment(p); + break; + case 1: + buildMeleeStats(p); + buildMeleeEquipment(p); + break; + case 2: + //todo: magic + setupWizard(p); + buildWizardStats(p); + buildWizardEquipment(p); + break; + case 3: + //max rune + buildMaxMeleeStats(p); + buildMaxMeleeEquipment(p); + break; + } + p.getInventory().add(new Item(385, 20)); + p.getProperties().setCombatLevel(126); + + p.getSkills().setLevel(Skills.PRAYER, 98); + p.getSkills().setStaticLevel(Skills.PRAYER, 98); + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + correctHitpointsStat(p); + } + + private static void buildWizardEquipment(AIPlayer p) { + int[] weapons = { + 1381, + 4675, + }; + int hat = -1; + int platebody = -1; + int platelegs = -1; + int gloves = -1; + int boots = -1; + int set = RandomFunction.getRandom(2); + switch(set) { + //Blue set + case 0: + hat = 4089; + platebody = 4091; + platelegs = 4093; + gloves = RandomFunction.getRandom(10) == 1 ? generateGloves() : 4095; + boots = RandomFunction.getRandom(10) == 1 ? generateBoots() : 4097; + break; + //Red set + case 1: + hat = 4099; + platebody = 4101; + platelegs = 4103; + gloves = RandomFunction.getRandom(10) == 1 ? generateGloves() : 4105; + boots = RandomFunction.getRandom(10) == 1 ? generateBoots() : 4107; + break; + //White set + case 2: + hat = 4109; + platebody = 4111; + platelegs = 4113; + gloves = RandomFunction.getRandom(10) == 1 ? generateGloves() : 4115; + boots = RandomFunction.getRandom(10) == 1 ? generateBoots() : 4117; + break; + case 3: + hat = 4708; + platebody = 4712; + platelegs = 44714; + gloves = RandomFunction.getRandom(10) == 1 ? generateGloves() : 4095; + boots = RandomFunction.getRandom(10) == 1 ? generateBoots() : 4097; + break; + } + p.getEquipment().replace(new Item(hat), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(platebody), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(platelegs), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(weapons[RandomFunction.random(weapons.length)]), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(generateNecklace()), EquipmentContainer.SLOT_AMULET); + p.getEquipment().replace(new Item(boots), EquipmentContainer.SLOT_FEET); + p.getEquipment().replace(new Item(generateCape()), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(gloves), EquipmentContainer.SLOT_HANDS); + System.out.println("WE ARE WEARING " + p.getEquipment().format() + " FOR " + p.getName()); + } + + private static void setupWizard(AIPlayer p) { + //final int SPELL_IDS[] = new int[] {1, 4, 6, 8, 10, 14, 17, 20, 24, 27, 33, 38, 45, 48, 52, 55 }; + p.getProperties().setAutocastSpell(((CombatSpell) SpellBookManager.SpellBook.MODERN.getSpell(55))); + p.getInventory().add(new Item(554, 1000)); //Fire runes + p.getInventory().add(new Item(555, 1000)); //Water runes + p.getInventory().add(new Item(556, 1000)); //Air runes + p.getInventory().add(new Item(557, 1000)); //Earth runes + p.getInventory().add(new Item(558, 1000)); //Mind runes + p.getInventory().add(new Item(559, 1000)); //Body runes + p.getInventory().add(new Item(560, 1000)); //Death runes + p.getInventory().add(new Item(561, 1000)); //Nature runes + p.getInventory().add(new Item(562, 1000)); //Chaos runes + p.getInventory().add(new Item(563, 1000)); //Law runes + } + + private static void buildWizardStats(AIPlayer p) { + int magicLevel = RandomFunction.random(80, 98); + int defenceLevel = RandomFunction.random(80, 98); + + p.getSkills().setLevel(Skills.MAGIC, magicLevel); + p.getSkills().setStaticLevel(Skills.MAGIC, magicLevel); + p.getSkills().setLevel(Skills.DEFENCE, defenceLevel); + p.getSkills().setStaticLevel(Skills.DEFENCE, defenceLevel); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + correctHitpointsStat(p); + } + + + private static void buildMeleeStats(AIPlayer p) { + int attackLevel = RandomFunction.random(80, 98); + int strengthLevel = RandomFunction.random(attackLevel - 10, attackLevel + 10); + int defenceLevel = RandomFunction.random(60, 98); + + p.getSkills().setLevel(Skills.ATTACK, attackLevel); + p.getSkills().setStaticLevel(Skills.ATTACK, attackLevel); + p.getSkills().setLevel(Skills.STRENGTH, strengthLevel); + p.getSkills().setStaticLevel(Skills.STRENGTH, strengthLevel); + p.getSkills().setLevel(Skills.DEFENCE, defenceLevel); + p.getSkills().setStaticLevel(Skills.DEFENCE, defenceLevel); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + correctHitpointsStat(p); + } + + private static void buildMeleeEquipment(AIPlayer p) { + int[] helms = { + 1163, //Rune Full Helm + 3751, //Berserker Helm + 3753, //Warrior Helm + 10828, + 1038, + 4753, + //TODO: No helm + }; + int[] shield = { + 1185, //Rune sq shield + 1201, //Rune kiteshield + 6524, //Obsidian shield + 8850, //Rune defender + 11283, //dragonfire shield + 14767, //dragon defender + }; + int[] platebody = { + 1113, //Rune chainmail. + 1127, //Rune platebody. + 10551, + 4757, + 11724, + 4720, + }; + int[] platelegs = { + 1079, //Rune platelegs. + 4759, + 11726, + 1075, + }; + p.getEquipment().replace(new Item(helms[RandomFunction.random(helms.length)]), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(shield[RandomFunction.random(shield.length)]), EquipmentContainer.SLOT_SHIELD); + p.getEquipment().replace(new Item(platebody[RandomFunction.random(platebody.length)]), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(platelegs[RandomFunction.random(platelegs.length)]), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(weapons[RandomFunction.random(weapons.length)]), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(generateNecklace()), EquipmentContainer.SLOT_AMULET); + p.getEquipment().replace(new Item(generateBoots()), EquipmentContainer.SLOT_FEET); + p.getEquipment().replace(new Item(generateCape()), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(generateGloves()), EquipmentContainer.SLOT_HANDS); + } + + public static final int[] weapons = { + 4151, //Whip + 4587, //Dragon Scimitar + + }; + + + private static void buildMaxMeleeStats(AIPlayer p) { + + p.getSkills().setLevel(Skills.ATTACK, 99); + p.getSkills().setStaticLevel(Skills.ATTACK, 99); + p.getSkills().setLevel(Skills.STRENGTH, 99); + p.getSkills().setStaticLevel(Skills.STRENGTH, 99); + p.getSkills().setLevel(Skills.DEFENCE, 99); + p.getSkills().setStaticLevel(Skills.DEFENCE, 99); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + correctHitpointsStat(p); + } + + private static void buildMaxMeleeEquipment(AIPlayer p) { + int[] helms = { + 3751, //Berserker Helm + }; + int[] shield = { + 14767, //Dragon defender + }; + int[] platebody = { + 11724, //Bandos chainmail. + }; + int[] platelegs = { + 11726, //Bandos Tassets. + }; + int[] amulets = { + 6585, //fury + }; + int[] boots = { + 3105, //Climbing boots. + }; + int[] cape = { + 6570, //Fire cape. + }; + int[] gloves = { + 7462, //Barrows Gloves. + }; + p.getEquipment().replace(new Item(helms[RandomFunction.random(helms.length)]), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(shield[RandomFunction.random(shield.length)]), EquipmentContainer.SLOT_SHIELD); + p.getEquipment().replace(new Item(platebody[RandomFunction.random(platebody.length)]), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(platelegs[RandomFunction.random(platelegs.length)]), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(weapons2[RandomFunction.random(weapons2.length)]), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(amulets[RandomFunction.random(amulets.length)]), EquipmentContainer.SLOT_AMULET); + p.getEquipment().replace(new Item(boots[RandomFunction.random(boots.length)]), EquipmentContainer.SLOT_FEET); + p.getEquipment().replace(new Item(cape[RandomFunction.random(cape.length)]), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(gloves[RandomFunction.random(gloves.length)]), EquipmentContainer.SLOT_HANDS); + } + + public static final int[] weapons2 = { + 4151, //Whip + }; + + private static void buildArcherStats(AIPlayer p) { + int rangedLevel = RandomFunction.random(80, 98); + int defenceLevel = RandomFunction.random(60, 98); + + p.getSkills().setLevel(Skills.RANGE, rangedLevel); + p.getSkills().setStaticLevel(Skills.RANGE, rangedLevel); + p.getSkills().setLevel(Skills.DEFENCE, defenceLevel); + p.getSkills().setStaticLevel(Skills.DEFENCE, defenceLevel); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + correctHitpointsStat(p); + } + + private static void buildArcherEquipment(AIPlayer p) { + int[] helms = { + 3749, //Archer helm + 2581, + 10828, + }; + int[] weapons = { + 857, //Yew shortbow + 855, //Yew longbow + 861, //Magic shortbow + 859, //Magic longbow + 11235, + }; + int[] arrows = { + 892, //Rune arrow + 11212, + }; + int platebody = -1; + int platelegs = -1; + int gloves = -1; + int set = RandomFunction.getRandom(2); + switch(set) { + //Blue set + case 0: + platebody = 2499; + platelegs = 2493; + gloves = RandomFunction.getRandom(10) == 1 ? generateGloves() : 2487; + break; + //Red set + case 1: + platebody = 2501; + platelegs = 2495; + gloves = RandomFunction.getRandom(10) == 1 ? generateGloves() : 2489; + break; + //Black set + case 2: + platebody = 2503; + platelegs = 2497; + gloves = RandomFunction.getRandom(10) == 1 ? generateGloves() : 2491; + break; + } + p.getEquipment().replace(new Item(helms[RandomFunction.random(helms.length)]), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(platebody), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(platelegs), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(weapons[RandomFunction.random(weapons.length)]), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(generateNecklace()), EquipmentContainer.SLOT_AMULET); + p.getEquipment().replace(new Item(generateBoots()), EquipmentContainer.SLOT_FEET); + p.getEquipment().replace(new Item(generateCape()), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(gloves), EquipmentContainer.SLOT_HANDS); + p.getEquipment().replace(new Item(arrows[RandomFunction.random(arrows.length)], 1000), EquipmentContainer.SLOT_ARROWS); + } + + private static int generateCape() { + int[] capes = { + 1007, //Red Cape + 1023, //Yellow Cape + 1019, //Black cape + 1021, //Blue cape + 1027, //Green cape + 1052, //Legends Cape + 2412, //Saradomin Cape + 2413, //Guthix Cape + 2414, //Zamorak Cape + 6570, + }; + return capes[RandomFunction.random(capes.length)]; + } + + private static int generateNecklace() { + int[] amulets = { + 1712, //Glory + 1725, //Strength ammy + 1727, //Amulet of magic + 1729, //Amulet of defence + 1478, //Amulet of accuracy + 6585, + }; + return amulets[RandomFunction.random(amulets.length)]; + } + + private static int generateGloves() { + int[] gloves = { + 1059, + 7462 + }; + return gloves[RandomFunction.random(gloves.length)]; + } + + private static int generateBoots() { + int[] boots = { + 1061, //Leather boots. + 1837, //Desert boots. + 3105, //Climbing boots. + 3791, //Fremmy boots. + 11732, + }; + return boots[RandomFunction.random(boots.length)]; + } + + private static void correctHitpointsStat(AIPlayer player) { + player.getSkills().setLevel(Skills.HITPOINTS, 10); + player.getSkills().setStaticLevel(Skills.HITPOINTS, 10); + player.getSkills().updateCombatLevel(); + int rangedLevel = RandomFunction.random(80, 98); + int defenceLevel = RandomFunction.random(80, 98); + + player.getSkills().setLevel(Skills.HITPOINTS, rangedLevel); + player.getSkills().setStaticLevel(Skills.HITPOINTS, rangedLevel); + player.getSkills().setLevel(Skills.HITPOINTS, defenceLevel); + player.getSkills().setStaticLevel(Skills.HITPOINTS, defenceLevel); + + player.getSkills().updateCombatLevel(); + player.getAppearance().sync(); + } + + public static final String[] names = { + "karamellioole123", + "sillyninja20", + "darkonecut0", + "mars_noob", + "volvovr0", + "gagton23", + "inkheart", + "sock_flavour", + "sophie72", + "reaper_4me", + "bessiedog", + "brknsprk22", + "whyuhackme", + "rayvano55", + "rayvano98", + "zaborgttm", + "warrior", + "madsbang123", + "christensen", + "theboz87", + "iqoigu2d", + "f4ll3n0n3", + "xbox360123", + "stijnkessel", + "kessel1996", + "genderoni", + "lolimawesome", + "amac109", + "downhill", + "citricabyss", + "ceesis", + "terry1000666", + "bink2468", + "roman1248", + "abcdefghijk", + "superchunklz", + "lizzie9", + "fast_reflexx", + "asherasher", + "rebagon", + "44b19n1v", + "staylow", + "nismo360", + "tornoc109", + "thunder20", + "crosby_8127", + "silhouette", + "moltenore3", + "lavabomb", + "feedu_arrows", + "soccer28", + "mindkampfers", + "notsogood", + "ashbacher7", + "tppcrpg7", + "michaelsyer", + "cue2hug", + "drewno58", + "j_p_13", + "111robinson", + "heyitstrea", + "mccain", + "doc_control", + "fartmaster", + "neonarg", + "b9501175", + "snorlax4", + "jasonchou", + "xgameboy95", + "craig9596", + "ojaste296lku123", + "sheltzor", + "karateboy11", + "makkiestone", + "billymon", + "blackspidder", + "sn1perh34ded", + "jerzeythugz2", + "trueset", + "pure_x_400askaa1234", + "mr_sgytkonyn", + "twoitem", + "1archerhbk", + "assinass", + "tharifica1", + "apgart00", + "fildherbn", + "freeze112", + "kno_way", + "loloklol", + "supermacho1", + "09101991", + "raptor8721", + "justindb", + "jolo5001", + "catfish", + "spiker991", + "qpwoeiruty", + "seasonsdawn", + "seasonsend", + "jartt2", + "jartt1", + "uber3pic", + "doodoo12345", + "rio1927ieman11", + "angered_nubackers", + "user_zim", + "zacharyh1", + "cool_kevin50", + "4194ka", + "freitty", + "gamecube", + "silver_knig0", + "yourmom1", + "beanroid", + "smoke47149", + "flitch289", + "nooder000", + "amazing_cake", + "iridium", + "aliffridzuan", + "ridzuan2000", + "bartez4", + "k4eo9ssi7", + "juxikeederast", + "d_man_5567", + "mod_richard", + "q1w2e1r2", + "be_kingless", + "hardflip", + "yami671", + "fbr114", + "rowelselidio", + "gagoako", + "haggishanger", + "football1", + "z_4_t_1_o_n", + "sxngaming123", + "simbojimbo", + "digeryd00", + "noob_10010", + "dragonoid798", + "qwerty798", + "2016", + "pk4lifefoo", + "logieboi", + "wichking", + "kyros60r0bl33mfzo", + "charlto1", + "fmgh2145mvplesjack", + "hiei179", + "shadowx123", + "seamus10990", + "danward", + "crusher16619", + "doremember", + "master15125", + "ninjas11", + "zarkotics", + "saphira123", + "skyler_is_on", + "lolbobjo", + "daniboom", + "12345dani", + "do_mhamai", + "eoin3646", + "rikuislove23", + "denver23", + "patacorow", + "globalfun", + "killer_ox08", + "scott08", + "persian_bossreston22", + "gold_runmoon", + "123456q", + "nosweet15", + "jefferson123 ", + "applecore17", + "mjc1997", + "sayin68", + "joshua123", + "gray258ancakes", + "somnus53", + "antant123", + "odysseu5", + "gccdu58txs", + "white1_ghost", + "0622842800", + "warriorasas", + "bordtennis", + "call911fro0b", + "232323hi", + "i_4_sp3c_k0", + "anning12", + "dante_dark3ossu44", + "nifeman20", + "fujifilm", + "&pika_power08", + "skiller2010", + "quharas", + "gogos123", + "keatson", + "dodgers5", + "karils_starilgd001", + "mjordan145", + "02092006", + "koth4356", + "1989919899", + "viperwind72", + "3iderct1", + "faeldora81", + "naruto816", + "colt_thunder", + "tc1215", + "bayat4life", + "ali1234567", + "daniel323a", + "kxb69qjx", + "1_rang3_pwns", + "hwdpkonrad", + "o1xaddicted", + "abc123", + "adam402", + "498750", + "gimberly8", + "mrcoolio", + "baister88", + "meatball", + "goodguard5", + "29a11b96", + "josh12508", + "j39256", + "bozzzerzzz", + "nmwhuzrc", + "volcomskate", + "volcom", + "jonny_ere_7", + "ince78989", + "pk_kinkyeachs", + "vlad867", + "vladstorm12", + "justinhigg", + "suilui62", + "beastblade12", + "hobbsey", + "sticklysnipe", + "bayview1", + "snake_1464", + "metalgear", + "parklane79laystation", + "ghtyrupekj", + "jackryan", + "hewitje", + "halloroan", + "pupucachu5", + "spencer4123", + "8bloodhollow", + "ilovejesus", + "hunting_slea", + "h3llfire5", + "dds_o_w_n_s", + "9933230", + "mankikned22", + "kikulita", + "skaleris3", + "skaleriukas", + "bluejay303", + "codrocks", + "bloodhalo11", + "11272000", + "maxsheld", + "91330451", + "jd4gray", + "johnny12", + "krisi129", + "langbestur", + "zadashi", + "gearsfan", + "jollyspace", + "451901", + "quekchose111", + "5bp9mg", + "maxsheld", + "91330451", + "frog1421", + "tomatos1", + "drk34695", + "chimpanze243", + "undead0wner", + "talald2", + "86251234", + "radicalluke", + "kelly55", + "lakertein", + "metheman", + "krissu127", + "hyundai1", + "jmannon00b1", + "cheese1", + "swirkstas", + "rainislopas1", + "gnarwaster1", + "qrhvoq549", + "loveburito", + "carter22", + "tiglasutru", + "t1o2y3o4t5", + "fangedbabyokemon1", + "pijuitshorty", + "marakasaya", + "mr_funky_121", + "joker45", + "g_man", + "william", + "vexraill", + "austin123", + "pbcharger_85", + "radilla1", + "thepureryan", + "121489ine", + "lukasky", + "lukecool", + "dinbolir", + "remember1", + "swe_nintendo", + "lew492car", + "cody52368", + "fr0nt1er", + "xxandoxx2552", + "liverpool1", + "i_aduka_i", + "lolowned", + "downlar", + "jjasjjas", + "harrrocksrisonbreak", + "cookies_ohh", + "noseboy", + "nickspie", + "semmy12", + "u_rock123412", + "themind", + "hi_im_tom9ooloop", + "keatermy", + "thomas98", + "exemped", + "ikbenyufei", + "sum1udontno9", + "kr0iznt0", + "dark_rune195", + "theoldnite", + "savagelump", + "kilosteak4", + "lakwit17", + "93444900", + "pl0xables", + "lemonade1", + "leeboy262", + "niniwee", + "benosigmaaperisima", + "kazokas7", + "lopas123", + "demonza1", + "will00115", + "lavaminer4", + "meandme138", + "twinkseypeshill5", + "idrinkshakes", + "rfyhyj6", + "johnymuffin", + "casey88", + "rempicool", + "admiraal1", + "celayer", + "bhboca2009", + "seflarious", + "teslatron", + "artedhghtun", + "freeze112", + "pur3k0911", + "footlong", + "cooldude_x5", + "toprak123", + "cartoon_101", + "kfauynoob", + "okas5", + "sittur", + "el_sudado", + "sudadera", + "joeymaster93", + "cookiej1", + "thedrewboy12", + "123123ha", + "savior_4_u", + "slutbomb", + "jiwonbae1", + "flameblaze", + "xjordankr96x", + "goodboy99", + "solomon1103", + "09102000", + "omfgitsemo", + "tr4p34", + "marsh450rototype", + "pellikanelliper", + "messidonasef", + "yoyododo", + "selesan", + "kovalev27", + "n0_def_own_u", + "hv650cou", + "swarnes", + "sntioi004", + "snakeboy756", + "0014702211", + "seaviper101", + "willow8520", + "bradd1808", + "smokey1808", + "quintanamore", + "momcatakers", + "ahmarman", + "doggydoodoo", + "war4more", + "stephens", + "m3ntal_sh0ck", + "nosam123", + "tinybird02", + "m1l1tary", + "kill_guys", + "jugheadellenn", + "janieboy2", + "kakhoofd123", + "koedijk1", + "lolliepop", + "uhh_dead_k", + "lehrman", + "36dragon20", + "izzi29040", + "spuddman17", + "nearhood", + "ironedsockoleystr1", + "hotviper6", + "applesnakes6", + "tyber3796", + "nintendo1", + "putther", + "g9768241", + "ynot_money", + "superdude10", + "pl0x____die", + "c1tyw1ns", + "rob1tooby1", + "awesomeman2", + "rsrownage", + "welcome01", + "smail154", + "economie", + "actualglory", + "hello123", + "x_gril8", + "timmed1", + "north1085", + "jjn2008", + "maximus_ivo", + "1210729", + "robzicles", + "sk8ordie", + "semanttinen", + "koipallo", + "zink22100", + "toshiba1", + "frylok_lol", + "baseballftw", + "flux_wolf", + "glowx111", + "haddon70", + "jamaican13", + "clivet_goth", + "lol1lol1", + "celsius91", + "jonkka123", + "kacj321", + "9hjgyt83", + "puzzlled456", + "4elderwand", + "moonbear98", + "regitllij", + "worsinksteeg", + "logisung35", + "kingescape22", + "7dejulio", + "sanka181", + "campbell", + "chikn_kikkr", + "dinkdink", + "zachdamaniak", + "godzilla", + "pk_mpskiller", + "309251270", + "pukkajoep", + "sk1ttl35", + "edparks10", + "firemonkey4", + "sasarrus", + "superman1", + "900_monster", + "tealcrowd8", + "sonicboom367", + "wreckem", + "burnt_c", + "shadow123", + "lv_egils", + "qwerty12345", + "thorodd", + "zgergo", + "hieveryone21", + "snakesnakeoitsas", + "neo34rd", + "yl2bfbml", + "tobi5q", + "fredzio0", + "qwerty2k3_n2", + "allister3", + "james13975", + "movingon", + "im_adored", + "99str", + "magicpinga12", + "freminik", + "chirinako", + "miraculousmuppet", + "joshj304", + "m0t0r5h0w", + "valor226", + "empire2", + "elliott9900", + "meggie26", + "kiteofdark", + "ralph321", + "kyrzani", + "wsl63069", + "0nly_4t_he4d", + "marcao18", + "kernivore", + "born2bewild", + "1_jeterfan", + "goatmilk", + "killer_gomez", + "0007779", + "sto__joni", + "miljoona1", + "kittehgod", + "familyguy5", + "airman521", + "qwerty521", + "draskiller", + "123579jf", + "good_guy2222", + "jsl1983", + "macauqe", + "kabbible", + "the_magius", + "steven86", + "a007lex1", + "shadow581000", + "fearless264", + "61694jjl", + "trevor600000", + "trevorlee", + "leimz", + "konnad123", + "mblais5", + "nida17", + "r_0_b_1annkook123", + "hheadstrong", + "tremayne", + "goyzman", + "jennifer123", + "xleet_ninjax", + "zachyb11", + "adamdude333", + "adam1997", + "saat_pataa", + "cra2f52z", + "crazyidiot70", + "jellybean", + "plasma_guy4", + "maxpower", + "taohealin", + "insane1992", + "uhh_omg_obby", + "llop6123", + "edrash1", + "alenho", + "kent688", + "fghjkl46", + "123erer0", + "rustydog23", + "monstrs23", + "roblox123", + "soldbuffalo", + "benxharris", + "coen42", + "mh2agewi", + "specialguy16megama", + "jo0_my_b33ch", + "volcanic1", + "stany35", + "220198th", + "motas23", + "keese123", + "swordblood3", + "moomoo3", + "davyandicall", + "shakira", + "paivmonster", + "seven77", + "sharpair", + "a51thetruth", + "gabo2oo4m", + "demon_ftwz", + "chicken1252", + "goodguard4", + "29a11b96", + "phonix260", + "dragon123", + "bencebence1", + "19960227", + "trainsgomoo4", + "killhill", + "lightness178", + "xdpowerxd", + "magican_owns", + "0204492600", + "sly_155", + "dragonballz", + "ssj4gogeta95", + "eggnogg871", + "kerfoogle", + "football09", + "mattfrank7", + "1azsxdcfvgb", + "invaliid3", + "maolenmunn", + "arkanoid0", + "ftred432", + "anonoumous1", + "00100101", + "i_have_wingz", + "thibeault", + "wolf_of_warr", + "hurricane", + "rauan78", + "mental223", + "kay_0wned", + "9971282", + "marththemage", + "ssbmrules", + "hcberryblitz", + "uzumaki", + "beast_rage9", + "carbine666", + "deadlydude46", + "aardf1993", + "sharper_arro", + "imawesome1", + "unholy1zero", + "1w3e4r5", + "i_pkernoob_i", + "kirkyisko", + "stift8", + "jaapstam200", + "takeda_iesyu", + "h0lmg4rd", + "im_to_low", + "england123", + "viniciusrub", + "1224abb08e", + "harris_0066", + "james0066", + "daretorparn", + "volvo245", + "didzydang", + "hduerw", + "idskillet", + "ilovehalo1", + "cows_moo34", + "bigbang6", + "el_brento9", + "nightwing", + "fireshot_co2", + "bestest", + "king5646uppylove", + "max2531oepchinees", + "kain581", + "iecsf3hm", + "heffman_13", + "jl19605", + "peep310", + "ilovesanta", + "agentds7okerface77", + "kurithia", + "readytodie", + "ozzy_496", + "shebagirl", + "evilpk999", + "hidalgo", + "joker67tny", + "demilover", + "putles5", + "lacina100", + "redstone177", + "bb123bb", + "1hit1kill567", + "1456327", + "whiplashfan", + "suzukits50", + "vyndirya", + "sjzipje96", + "soapthrail", + "killzs11", + "i_hang_kids", + "circaman1", + "jason9918", + "jasonw11", + "austinz611", + "azorn611", + "zumerock", + "kirara45", + "abyssalite", + "un1versal", + "hellfire33k", + "j067946409", + "iron_vs_maul", + "notrated7", + "deadly_ghoul", + "chad1990", + "samie497", + "walkersv", + "sir_st77", + "94387747pablitoz", + "spijderkat", + "vissen24", + "blikbiermine", + "medion123", + "trixdig", + "nixon995", + "dragonwar729", + "dragonwar123", + "sc0rch1n_2h", + "jagvet66", + "apex_jrkspypk1", + "leynell", + "tresz134", + "blocky_ownz", + "ryan006", + "king_batty_s", + "godzilla", + "very_bigfoot", + "freded", + "slyestcat", + "zared45", + "loko3610", + "lucozade12", + "edwarrior317", + "thunderbolt17", + "quietatrange", + "alec123", + "0_0_0wned_00", + "doumdoum11", + "jaxnarb", + "darkness1", + "achilles0009", + "nathanok", + "r4ngepr0fi", + "leidinger", + "torbjorn6", + "google25me25", + "42_to_doom", + "leeong05", + "jammer8009", + "babybear", + "standi96", + "schakal1", + "sucuraboii27", + "ducks66", + "15_years_now", + "bleachfan", + "xuan_yu31", + "dcvhhvcd123", + "jazabar", + "772892ex", + "arch_4_dutch", + "zwart123", + "dizzy_loot", + "14racing", + "grimmm125", + "budgie88", + "chrisj144", + "chrisj92298", + "sir_arfa", + "arfaiscoolio", + "pvp_rangers2", + "skaiciuokle", + "aka_t_rex", + "kingdomkey0", + "uncletom96", + "cheese96", + "matrix_men33", + "matukka", + "haleyboy1", + "charlie21", + "roooooosa", + "kakajunn4444", + "sacniv_zzzokemonas", + "sint_gabriel", + "iamsogoodnow", + "nightwolf06", + "thelandshark", + "sirsparkles1elling123", + "sergioshm", + "wsaq3214", + "sxe_ickis", + "32210t86p", + "sterling1717", + "calvin1", + "dwarfman666", + "mynameis", + "romeo_beller", + "jess987", + "bandion", + "elhipfop", + "adam_josiah", + "vultures", + "bloodydruid3oopklol", + "majin125", + "q78j2rps", + "averykc", + "woodshirt", + "chemical711", + "linkhero", + "lord_fis0", + "hejhejhej", + "xvim999", + "tazsucks", + "colinmacray", + "cool123", + "zs102", + "funkytown27", + "croston10", + "jacob7767", + "2669331", + "charlto1", + "fmgh2145mvplesjack", + "&adam_c73", + "bamboozled", + "thegoge", + "hot123qw", + "puzzlled456", + "4elderwand", + "jrtiger297", + "zekerdog1", + "damexican99", + "1124phc92", + "tonganboyz1", + "ironman54", + "molson_1903", + "y8h9i20j", + "ketchupp9", + "mustard", + "shongo3258", + "thunderbolt", + "zammorak202", + "54126635", + "sword395", + "link_707", + "joshua12397", + "phenns", + "robots100", + "lucc666aspoort16", + "luukielakke", + "feyenoord", + "rangeown1123", + "joshienewtro", + "fennell100", + "bobdylan", + "junitre1", + "hidare22", + "slasher954", + "budflip12", + "depredad0r", + "656565", + "shadowzrs", + "narut0123", + "grimmick15", + "gowrangaownz", + "ultima_9899", + "1337master", + "dominzdrac", + "xxrunxx34", + "sinduko", + "baltimore", + "machoman275", + "y4ou21", + "ahmedspy", + "ahmed1992", + "ronnie19l", + "gilplatt97", + "evil_miedo", + "88nst0rm", + "ejaeger99", + "lilmanas", + "oozaru66", + "sanctuary", + "dima638arool123", + "nija646", + "luke1998", + "ditto110", + "catdog97", + "ebfft", + "ekonesone", + "morten_aj", + "sootyimpy11", + "money_boy688rton100", + "happyheelas", + "schema36", + "samyett", + "flapula123", + "tony634ash12", + "thedog77", + "pascals123mgomgomg", + "ikrissu", + "eestimaa", + "patrsa", + "4po2sj", + "morten_aj", + "sootyimpy11", + "danorah", + "coolcat60", + "crazywiteboi", + "g5x74m8ss", + "element11123", + "25193469", + "sawyer443swd1994", + "pomojoona", + "seliseli99", + "yanumba1boi1", + "43gb2im4", + "that_guy503", + "whatsdoin", + "glennneke123", + "cool123", + "revolution04", + "330330", + "ryanl809", + "asshass1", + "gh0stsnyper", + "chopper7", + "pyro_fyro_0rinceton", + "onilink992", + "skyrim1234", + "emsixteen", + "19890910", + "taeed24", + "assassin12", + "vi3t0wnage", + "wolfpack450", + "swarnes", + "sntioi004", + "lppalscore", + "thebob55", + "dhuurfa", + "roflitsme", + "astizzz", + "58912b50", + "manta566", + "koirahullu", + "robin5290", + "jameswalker", + "setiar1", + "jesus123", + "hej", + "abbcab", + "smegomeister", + "sammson98", + "dee_alster", + "mynameisbob", + "schadoxx", + "hell4hell", + "pk_mauzeris", + "12211995", + "sheepeater9", + "knauer12345", + "kartunez", + "143256a", + "machado123", + "jayhay22", + "jakee_bum", + "4445poop", + "smurfturf248", + "jzadams", + "arr0wpl0x", + "wiirules1", + "ryan01234", + "donald21", + "juoppoeki", + "asami789", + "dante_dark3ossu44", + "joseph999159", + "shadow1", + "rubini98", + "nutella1998", + "lazyfaith", + "qgy2o6", + "mrwreckedem", + "soccer1", + "ty_the_ninja", + "icychill", + "blackeye446", + "simonv3", + "logiemac11", + "maceachern1", + "short_tastic", + "blink182", + "pops_mahone", + "whitebtii", + "war_eagle47", + "mischief", + "qazross", + "dread46", + "13wesley13", + "warfight", + "hellz_rader", + "landman", + "dakatt13", + "nickname", + "poop_o_nator", + "0901257", + "nummy_flame9", + "magemage", + "ads784", + "bellonfire", + "werslty", + "tyler923", + "bowslinger_9", + "789987455", + "chainmall", + "jackson12398", + "gurglesprainennydrop1", + "legyplegyverboard99", + "junkyboy55", + "bindoosd", + "gaomaster", + "xuanhan", + "danielmedvec", + "123spill", + "oddly_alive", + "newyork", + "babababoe", + "runskape", + "bigdunk69", + "soccer13", + "cat_prince25", + "rockman", + "paxton269", + "22drp88", + "uchihazen", + "ihateyou111", + "expo136", + "alexpass", + "peliset", + "jfas97gv", + "sords_4_life", + "1011657", + "krazy_kat575", + "tigerflame", + "aligindahose", + "killforfood", + "impzoren", + "enter123", + "dylan00117", + "hotdog10", + "bisinji", + "rustysam", + "tangle_golen", + "02061996", + "jijdwaas", + "theelord", + "varduka", + "apina19", + "chinadarkelf", + "morrowind", + "kickball83", + "ilovekayla", + "bradwoodward", + "brad5420", + "kriznar56", + "machupichu56", + "dezzilisk", + "coldocean", + "jorieboy3", + "lwn13jk", + "joneliux458", + "5jega55", + "celayer", + "bhboca2009", + "will753357liver4793", + "gpunks3", + "gmschool", + "therayman940", + "buddyboy", + "schulpy", + "chelsea1", + "madfrk2222", + "mmrabb1", + "mattiege", + "buster98", + "monsterdany", + "fs7312kp", + "eldden", + "252 625 26", + "xbl33s_pk3rxortugal", + "grotsnik4", + "skulltaker", + "peaceweazer", + "sta10stik", + "jordanator2", + "maddydog1", + "indomezu", + "indasunay8", + "chainlink66ieisgood11", + "xchichimanx", + "babychich", + "rugissement", + "glen123", + "slayer78110", + "calcetin", + "drakeaumann", + "eminem45", + "voxyvax8563", + "konvict", + "niklasvegas", + "videohai72", + "elliotorin", + "dadcabsxxx", + "cw_range", + "clanwars", + "saynoob", + "holland5", + "fattyman_12", + "77vettee", + "tryharder4me", + "lolatmyname", + "native_ta_50", + "blood4life", + "xchichimanx", + "babychich", + "medevil_troy", + "bobbobster6", + "aolh8i", + "wildboy1888", + "9118747", + "macacox", + "12touchsuperett", + "sonny585", + "77vettee", + "theprorspker", + "1a2s3d4f5", + "The Old Nite", + "94cm442modrak96", + "north_omaha", + "southomaha", + "ruindungeon", + "fearoth", + "gpgard15", + "homies01", + "kaz123kaz123", + "bieniak0048", + "bartez4", + "k4eo9ssi7", + "myroyalwings", + "compact1157", + "godawgs08", + "dco14", + "baddiekins", + "gtrhro511", + "devilman651", + "georgekk9", + "zain_winters", + "158491122", + "vovakova", + "551879321", + "mr0sharkie", + "136qwerty136", + "tylerrockis1", + "yoyobaby", + "bbmonke1honglu1", + "armadylz_x", + "wtfyounoob", + "fille809", + "0763595260", + "mansonroks1", + "manson1", + "dubstepparty", + "lmmikjki", + "uniwide", + "darkmage", + "mandude65", + "manduderules", + "don_dalton", + "bobutberg", + "biscoito77", + "15181996", + "munkki345", + "dfzrbrm7", + "zarocks2", + "henry6679", + "nikdx", + "99long", + "smilly48", + "blackout22", + "im_not_afish", + "1wiiwii", + "javiercmh", + "teno8181", + "ancient_ttam", + "shooter12", + "str_poiss10", + "k2tlin", + "segraps", + "12qwaszx", + "nephew31", + "hubbabubba", + "guthix2569zzyjosh1234", + "rulxman", + "singapore", + "frozenax7955", + "noodles", + "terumpk1", + "hello101", + "xyameax", + "bert1127", + "scottstimo", + "sabop8", + "destructo361", + "13461618", + "nikdx", + "99long", + "khanpop1", + "khan2662", + "lilboibryan", + "dragon123", + "benjo171", + "spireite1", + "king___joel", + "monkey33", + "kukko12", + "kukkeli12", + "swanepoel101", + "luke081295", + "mobuis_three", + "mommys4", + "zorzacken", + "hookedon", + "feetsoup", + "forrest11", + "lilsaint343", + "0akwood", + "krisalix", + "karadic", + "saisseh", + "miskaman123", + "eckbulldog", + "ecknick2510", + "cruel_guy2", + "coolguy2", + "jawad1144", + "soldier123", + "sebber43", + "kiwiiscape", + "darkshiv", + "wert0980", + "sp3c_m4ul3r", + "covcov21", + "rhinaboy", + "dragon465", + "crazy_nut45", + "9687241", + "trx_despair", + "thethethe123", + "x1atcha", + "anthony", + "mr_nart", + "epicfail", + "marti1101", + "redfaction", + "paulohare", + "superman1", + "m4_0wns", + "juska123", + "coopershaw14", + "13scooter14", + "viper_snake", + "superfluous", + "fender_love", + "devoncallme", + "thorax777", + "stilton1", + "reese55rinter0", + "flyflip", + "jarrod123", + "blackeye446", + "simonv3", + "sircoolio", + "stillsnoopanddre", + "zimza_toes", + "leonard9", + "raza838", + "deadlove", + "jamsinkereewee50", + "jatanoma", + "lolnoobs1", + "starcat2002", + "i6560344", + "tarapita", + "ud2hnx6q", + "xcowboys", + "cowboys458", + "elgaro12", + "83ed04374", + "logrono23", + "logman23", + "grundledib", + "m3ath00ks", + "ballum2mega123", + "1w1ll0wna", + "thebrazil", + "patacorow", + "globalfun", + "savtej89", + "elkgrove", + "darth_nome", + "5ofclubs", + "tiili10", + "07010701", + "u_said_stick", + "ibanez28", + "lolxman123", + "qwerty123", + "rebel_goon", + "chrome18", + "shaunth3pur3", + "whatthe", + "ruagamer1212", + "nothing1", + "strownedyou6", + "lolnoob", + "willroley", + "hdw77k69", + "shortd00d", + "d1014d", + "mr_dark720artypooper", + "copadon", + "girordot", + "converse_con", + "bunny123", + "shallowspace", + "tums9182", + "xxlpad", + "arnis1996", + "camo124501", + "abcdefghijk", + "i_druelennythug", + "bonebreakerrikksuger", + "karma_rebornpaassss", + "katastrophi4", + "wrighton5", + "s_n_x_w", + "thatiscool", + "brusio", + "516967853", + "snakeboy756", + "0014702211", + "audiomonk", + "drumstick", + "sidekik123", + "liban123", + "nguyen374", + "nguyen1996", + "i_agsu_i", + "jsjugb69", + "jlventre", + "denmarka4", + "porto410ote1212", + "carltyler1", + "megadeth", + "batzo", + "qwerty88", + "crystalfang3", + "devin113", + "lvl50_attack", + "cherrim012", + "kristaps288", + "9792218", + "rockyroller3", + "harrytate2", + "karrashimo", + "never122", + "necrovolt", + "solovino1", + "addpoke", + "hpcdrt45", + "hotsauce4299", + "a1b2c3d4", + "elblelbl", + "djscratch", + "spiderman_o", + "kabsa23g", + "grenade18", + "goofygoober", + "blueguy8989", + "digimon8989", + "dusty_granny", + "naikyaone", + "ffs_i_say_no", + "erik123", + "my_str_maax", + "lukinhas", + "tankbuster97", + "tanksmash2", + "eemuman", + "nakkipate", + "pk_zorbes", + "mor1990", + "dgfriend5", + "456789abc", + "twisternick6", + "jason22", + "alan22589", + "gotmoney1", + "noob_karil3", + "ee11ee11", + "elmo909", + "focus123", + "swordfury40", + "stonecold9", + "rey_rey_6116", + "metsss11", + "rebagon", + "44b19n1v", + "lava_viper_6", + "lavaviper78", + "taryn_blue1", + "taryn71", + "pluralgarths", + "frederic123", + "skeloperch", + "zombieperch", + "verrrtigo", + "karolekas", + "fuhq247", + "6423694rocky", + "bnarney", + "clicker882", + "newbie882", + "str_bonage", + "minemunni135", + "brsnip3rlapster10", + "orangie_boi", + "jamesd23", + "legendy3", + "ubernozle1", + "maulz_w_t_f2", + "lilzoee", + "flyman821", + "tomtiger647", + "fishizle", + "hellomoto", + "sir_hepuli1", + "j0n10nh0t0rn0t", + "knight_alam", + "tors66", + "stavar111", + "ausdaniel", + "bulldogs1", + "o_he_shot_me", + "fuckhead", + "dan_10567", + "dragzxasqw", + "jeze666", + "minarell1", + "the_a97", + "romeydog", + "thegringo44", + "smdsmd44", + "dale_89", + "2215077", + "chrisroscher", + "jagex13245", + "rabye_str", + "hopk1t02", + "killangel0", + "cheatx101", + "grunt628", + "asshole1", + "wolf_boy247", + "blompee123", + "p_k_e_r_1_0", + "mustang1", + "99killerbull", + "fireman", + "jbird197", + "jistheman12", + "f__t__f", + "hahamines66", + "lkjhgfdsa420", + "charlie1", + "ilovehighlvl", + "sedef4", + "napplesauce", + "tony1243", + "biowarrior11", + "jmaj6722", + "klansman5", + "young10", + "dawnodarknes", + "redalert", + "negglesolbones22", + "garrdrenn1", + "gd2005", + "draognzboy", + "zippmeup", + "oseart55", + "starwars501", + "xfrightknite", + "jlidd8990", + "master_pk260skar123", + "3meister", + "dragon13", + "madevillemon", + "20111993", + "cupit11", + "harinton7", + "xrapidclawx", + "jordie4", + "aurocks14", + "310051552", + "dombomagexd", + "midweek", + "falconfan_24", + "battlehero96", + "charkrit019", + "apple1901", + "duongmaster", + "johnny07", + "recon783", + "eraserface", + "faxxx1", + "nightfall64", + "mrjiggles25", + "7415001", + "zarm3000", + "xzsawq67", + "final_pure_g", + "zammy88", + "redfox280attrock", + "rodrigo_g_m", + "daynnight", + "mag3_kill4s", + "magepwnsu", + "prime_maggot", + "almost1", + "elkalibre", + "b0n3cl1nkz", + "radi100", + "kamalkamal1", + "i_newarcher", + "nakniki1", + "lord_shunoby", + "2615948", + "stinkerror", + "dragondz", + "crusher16619", + "doremember", + "3_run_range", + "11011997", + "robo1rocks", + "rocco1998", + "tomcat975", + "hermano123", + "sarlon7", + "irish001", + "aznballer66", + "9312025", + "killers455", + "matthewmjk", + "desparo2222", + "yoelmejor", + "md650epa1", + "gonzalez", + "inferno368", + "rectamos", + "aced52", + "iwashere321", + "goblin5530hjok123", + "h4x_pl0xz0r", + "suzukirm85", + "jessinator18", + "hamedarash", + "uzi_of_doom", + "8401397", + "sotired", + "tootfart64", + "alphazone123", + "ankouisme123", + "daewoo45", + "joshowns", + "gundymonster", + "meow111", + "acidacre", + "kappa100", + "boeman75", + "ethsaq2", + "yorotomaru", + "qwopzxnm7913", + "im_not_afish", + "1wiiwii", + "2rubbish", + "muslim786", + "boomikiller", + "daco2023", + "knight_988", + "wearefamily", + "corbo999", + "whiterat", + "yaranzo5", + "keller18", + "nick4998", + "jnrc3271", + "rizeline55", + "hradhrad", + "lsufreak9", + "lsutigers1", + "lost_pker222", + "facebookrule", + "napplesauce", + "tony1243", + "13wesley13", + "warfight", + "chirinako", + "miraculousmuppet", + "tanked_you_l", + "qazwsx123", + "spence587", + "spencer", + "crabs_magee", + "reaperr7", + "kingspell", + "969896250", + "bewareof_me", + "200102494g", + "grundith", + "jadranovo05", + "numeris14", + "goblinn8", + "theepicscout", + "sonic44", + "&phat_dood5", + "briansucks", + "momrocker", + "nutmeg60", + "sp_i_r_i_t", + "1heehtam2", + "one_secret", + "firedoor56", + "wizcoltt", + "merlinnus", + "archebowz", + "bn0du7cs", + "outoftimewon", + "snapple12", + "gavistire", + "098665chaz", + "k_o_sorry", + "cristianor7", + "masta395", + "indy340", + "alvaroscary", + "killa94", + "mr_gandolff", + "1968camero", + "wizkidvic", + "uk3dbg", + "dgenx21388", + "wwefan1994", + "printingman", + "kopieer", + "humper123479", + "mikey97", + "davydude2", + "92thesnack92", + "pure0292", + "king1234", + "1_h8_n3rdz", + "bedtime", + "caveman422", + "ilikepie87", + "emosocks1", + "5496931", + "g2uypie", + "enok210", + "workrange_o", + "latefriday", + "surplus99", + "shabahang", + "jonnathan002", + "jonny002", + "132kickflip", + "heelflip", + "andrewfly89", + "roland123", + "&snypermatt69", + "canucks2012", + "youdie111", + "1moretime", + "dannyhxdman8", + "theend1", + "g__f__d", + "2fast4you", + "grundledib", + "m3ath00ks", + "zalvose", + "assassins", + "gangstabros8", + "master13", + "supanight", + "leonard12317", + "thefurrymage", + "hotrod1994", + "tim_but_dim", + "1994tyrer", + "woferiukas", + "deividas", + "failedgull", + "goupia123", + "inferno_1060", + "vtech1060", + "junk_king33", + "junkguy", + "racer_jaret", + "callofduty4", + "westorz", + "741825963", + "zenachue", + "bomber357", + "r4ngepr0fi", + "leidinger", + "kiryu36", + "leo8lion", + "monk_fights", + "4991diddly", + "boggom_8097", + "garret1998", + "svensktsnus", + "asdaasda123", + "ruudinho10", + "hans19953109", + "eltacolad", + "bartlett", + "esrb5", + "junk_king33", + "junkguy", + "vanquishwolf", + "hubertas", + "w_3_s_c_0_t", + "dogtown4life", + "10hp_clans", + "zinedine", + "vader11567", + "thunder1", + "rempicool", + "admiraal1", + "5cripter", + "roverdog123", + "stallion918", + "5489621", + "zeroz_pure", + "buster77owned123", + "north_omaha", + "southomaha", + "alexwars400", + "starwars4", + "pureskill714", + "raheem600", + "molson_1903", + "y8h9i20j", + "arromin", + "scarm4a1", + "ravenangel1", + "lancaster", + "willheath20", + "canuyo2", + "smokadadank", + "5433285", + "blkchocobo", + "shalico101", + "envious_soul", + "setcapmoc6", + "shepowndu", + "sll41ygi", + "shoot_here2", + "triops1029", + "bananaboy441", + "mieszawski", + "pur3iwillbe", + "monkeystew", + "toddy_the_pk", + "brosis09", + "logrono", + "gorillazfgi", + "b1itz3d", + "samsung90", + "blakkwizard", + "mythodea", + "toke223", + "hamster223", + "guyman123890", + "donkeykong", + "riduan34", + "lekurde", + "desiver2", + "throw80", + "silver_gunn", + "masteravery", + "darkhawk744", + "cocoman6", + "c0c0nutmilkeatrick0", + "&dragon_j86", + "1234567890a", + "steriili_pk", + "arsk4", + "c_robert_t", + "monster1234", + "sirpericlesmfgwtf", + "kiill42", + "your1zax", + "goliathsnail", + "illidan", + "balcattaboy", + "corbin94", + "vereza", + "d3susama", + "&fort_40", + "moonlight7", + "bobsmith909", + "kellyrocks", + "idirim", + "rennmaus358", + "latirem", + "muthsera", + "pur3man_v10", + "duckcow1", + "kanpar2", + "vinimi", + "slomdapom", + "k8s2e7g4", + "hi_on_420", + "dillweed", + "zellanisixy3000", + "tozzel", + "toypaj", + "triblouge", + "carsa100", + "texasdingoasswd123", + "donkie90", + "nicolas123", + "mag3_pur3_ko", + "hayesbonin", + "zedukas_x", + "eligijus", + "cbuity", + "code515396", + "wardmathias", + "ritabob", + "dubert4", + "rooney11", + "throwchance", + "chance5", + "karamellioole123", + "sillyninja20", + "darkonecut0", + "mars_noob", + "volvovr0", + "gagton23", + "inkheart", + "sock_flavour", + "sophie72", + "reaper_4me", + "bessiedog", + "brknsprk22", + "whyuhackme", + "rayvano55", + "rayvano98", + "zaborgttm", + "warrior", + "madsbang123", + "christensen", + "theboz87", + "iqoigu2d", + "f4ll3n0n3", + "xbox360123", + "stijnkessel", + "kessel1996", + "genderoni", + "lolimawesome", + "amac109", + "downhill", + "citricabyss", + "ceesis", + "terry1000666", + "bink2468", + "roman1248", + "abcdefghijk", + "superchunklz", + "lizzie9", + "fast_reflexx", + "asherasher", + "rebagon", + "44b19n1v", + "staylow", + "nismo360", + "tornoc109", + "thunder20", + "crosby_8127", + "silhouette", + "moltenore3", + "lavabomb", + "feedu_arrows", + "soccer28", + "mindkampfers", + "notsogood", + "ashbacher7", + "tppcrpg7", + "michaelsyer", + "cue2hug", + "drewno58", + "j_p_13", + "111robinson", + "heyitstrea", + "mccain", + "doc_control", + "fartmaster", + "neonarg", + "b9501175", + "snorlax4", + "jasonchou", + "xgameboy95", + "craig9596", + "ojaste296lku123", + "sheltzor", + "karateboy11", + "makkiestone", + "billymon", + "blackspidder", + "sn1perh34ded", + "jerzeythugz2", + "trueset", + "pure_x_400askaa1234", + "mr_sgytkonyn", + "twoitem", + "1archerhbk", + "assinass", + "tharifica1", + "apgart00", + "fildherbn", + "freeze112", + "kno_way", + "loloklol", + "supermacho1", + "09101991", + "raptor8721", + "justindb", + "jolo5001", + "catfish", + "spiker991", + "qpwoeiruty", + "seasonsdawn", + "seasonsend", + "jartt2", + "jartt1", + "uber3pic", + "doodoo12345", + "rio1927ieman11", + "angered_nubackers", + "user_zim", + "zacharyh1", + "cool_kevin50", + "4194ka", + "freitty", + "gamecube", + "silver_knig0", + "yourmom1", + "beanroid", + "smoke47149", + "flitch289", + "nooder000", + "amazing_cake", + "iridium", + "aliffridzuan", + "ridzuan2000", + "bartez4", + "k4eo9ssi7", + "juxikeederast", + "d_man_5567", + "q1w2e1r2", + "be_kingless", + "hardflip", + "yami671", + "fbr114", + "rowelselidio", + "gagoako", + "haggishanger", + "football1", + "sonderby", + "banjomus", + "sagar448", + "heroes12", + "windkid62595", + "lilly117", + "kacj321", + "9hjgyt83", + "sly_ninja80", + "waynegod13", + "discombobu99", + "rocky34", + "zorontu", + "xtaylorx", + "zezimaki", + "ilovelordi", + "joey7x", + "kaleb8598", + "kruiness", + "daisymay21", + "paul77777izzapizza1", + "cow_hearder", + "kingdrag", + "lama_007", + "trojans1", + "helslayer11", + "roblox11", + "knifebloody", + "1092310923", + "dansendeaap", + "uiensoep", + "pure_exz", + "29038995scotland", + "theysconator", + "ysbrandve1", + "chrissy_booy", + "egghead", + "supreme1511", + "landis1511", + "tharujusassword123", + "jdablada", + "ugotskills", + "kewl_kid", + "killer99", + "nicknack60", + "choffee12", + "a007lex1", + "shadow581000", + "ecmxflawless", + "twenty8", + "roguewolf33", + "firefox101", + "kaare83_2", + "korsvegen", + "da_king1295", + "xemnas1", + "airwalk285", + "archman", + "sir_kieran12", + "spiderpig08", + "fasterthanyu", + "asdflkj", + "lihtsaber2", + "joe00224", + "fortress170", + "centurion", + "youmeyou4", + "laxworld", + "xxmrfixitxx", + "killer55", + "morags", + "ericolde", + "e_a_r_l_y_k0liverkerr", + "benno_rules", + "lotrftw5", + "embrach", + "meier007", + "xxlpad", + "arnis1996", + "spike8342", + "knuckles", + "spit_fire469", + "tuesday23", + "jonahmonk", + "blackma9ic", + "manmage247", + "kingcoke", + "ourkornalmer64", + "paulypauly22", + "chickenpoo", + "kis_a_legend", + "samtr0n", + "amigos39", + "blackhole", + "abc12pee", + "zman1123", + "mr_frost22", + "bubby5522", + "lauren_maher", + "foamy1992", + "robertwb69", + "rwb691169187", + "blackhart74", + "sambone", + "janreypogi1", + "kakilala", + "hairy_marry", + "brucie123", + "gaming_gypsy", + "qwewqwewqwe", + "pros_only", + "killer29043", + "night_raid89", + "hershey", + "dragan_man62", + "sordman", + "vaizakhter1", + "19692000", + "rob1tooby1", + "awesomeman2", + "papagal7", + "cartof33", + "lil_0ctog0n", + "hi12", + "matthew_1001", + "elliemay", + "krilitor", + "charlesk", + "rileymango", + "882psauq", + "wutknochen", + "12muschel78", + "ravincal", + "warchief1", + "joloplex", + "scrubs93", + "kelly_koehn", + "goldrush", + "0k_im_sorry", + "david123", + "zack494", + "lima7277", + "killermac234", + "spartan", + "sharmen24", + "bigballs", + "ricarddragon", + "123123s", + "illepappeft", + "mapet123", + "josh6621", + "dragon6621", + "p__0__0__n3", + "bringmetolife", + "silentblue5", + "hardflip96", + "cbosk8er", + "getbuff", + "steelbeast97", + "ironbeast", + "zarkima", + "idioteque8", + "goselink1989", + "janlul123", + "rocky1247", + "rocklobster9", + "supapwnage", + "holden123", + "vietboihao", + "vietboi", + "cutvision", + "internet", + "stinkerror", + "dragondz", + "robert_magic", + "darlene2", + "min_ko7", + "kristian1998", + "adami888", + "tetramins", + "godssent2", + "shadow14", + "sawingmotion", + "drag00n", + "devincm", + "harder64", + "mrcrowley676", + "stevefry", + "canadian_nrg", + "elvens11", + "dbl_m", + "mattrox3", + "redgoblin352", + "beunard", + "sonderby", + "banjomus", + "sagar448", + "heroes12", + "windkid62595", + "lilly117", + "kacj321", + "9hjgyt83", + "sly_ninja80", + "waynegod13", + "discombobu99", + "rocky34", + "zorontu", + "xtaylorx", + "zezimaki", + "ilovelordi", + "joey7x", + "kaleb8598", + "kruiness", + "daisymay21", + "paul77777izzapizza1", + "cow_hearder", + "kingdrag", + "lama_007", + "trojans1", + "helslayer11", + "roblox11", + "knifebloody", + "1092310923", + "dansendeaap", + "uiensoep", + "pure_exz", + "29038995scotland", + "theysconator", + "ysbrandve1", + "chrissy_booy", + "egghead", + "supreme1511", + "landis1511", + "tharujusassword123", + "jdablada", + "ugotskills", + "kewl_kid", + "killer99", + "nicknack60", + "choffee12", + "a007lex1", + "shadow581000", + "ecmxflawless", + "twenty8", + "roguewolf33", + "firefox101", + "kaare83_2", + "korsvegen", + "da_king1295", + "xemnas1", + "airwalk285", + "archman", + "sir_kieran12", + "spiderpig08", + "fasterthanyu", + "asdflkj", + "lihtsaber2", + "joe00224", + "fortress170", + "centurion", + "youmeyou4", + "laxworld", + "xxmrfixitxx", + "killer55", + "morags", + "ericolde", + "e_a_r_l_y_k0liverkerr", + "benno_rules", + "lotrftw5", + "embrach", + "meier007", + "xxlpad", + "arnis1996", + "spike8342", + "knuckles", + "spit_fire469", + "tuesday23", + "jonahmonk", + "blackma9ic", + "manmage247", + "kingcoke", + "ourkornalmer64", + "paulypauly22", + "chickenpoo", + "kis_a_legend", + "samtr0n", + "amigos39", + "blackhole", + "abc12pee", + "zman1123", + "mr_frost22", + "bubby5522", + "lauren_maher", + "foamy1992", + "robertwb69", + "rwb691169187", + "blackhart74", + "sambone", + "janreypogi1", + "kakilala", + "hairy_marry", + "brucie123", + "gaming_gypsy", + "qwewqwewqwe", + "pros_only", + "killer29043", + "night_raid89", + "hershey", + "dragan_man62", + "sordman", + "vaizakhter1", + "19692000", + "rob1tooby1", + "awesomeman2", + "papagal7", + "cartof33", + "lil_0ctog0n", + "hi12", + "matthew_1001", + "elliemay", + "krilitor", + "charlesk", + "rileymango", + "882psauq", + "wutknochen", + "12muschel78", + "ravincal", + "warchief1", + "joloplex", + "scrubs93", + "kelly_koehn", + "goldrush", + "0k_im_sorry", + "david123", + "zack494", + "lima7277", + "killermac234", + "spartan", + "sharmen24", + "bigballs", + "ricarddragon", + "123123s", + "illepappeft", + "mapet123", + "josh6621", + "dragon6621", + "p__0__0__n3", + "bringmetolife", + "silentblue5", + "hardflip96", + "cbosk8er", + "getbuff", + "steelbeast97", + "ironbeast", + "zarkima", + "idioteque8", + "goselink1989", + "janlul123", + "rocky1247", + "rocklobster9", + "supapwnage", + "holden123", + "vietboihao", + "vietboi", + "cutvision", + "internet", + "stinkerror", + "dragondz", + "robert_magic", + "darlene2", + "min_ko7", + "kristian1998", + "adami888", + "tetramins", + "godssent2", + "shadow14", + "sawingmotion", + "drag00n", + "devincm", + "harder64", + "mrcrowley676", + "stevefry", + "canadian_nrg", + "elvens11", + "dbl_m", + "mattrox3", + "redgoblin352", + "beunard" + }; + +} diff --git a/Server/src/main/java/Server/plugin/ai/resource/ResourceAIPActions.java b/Server/src/main/java/Server/plugin/ai/resource/ResourceAIPActions.java new file mode 100644 index 000000000..f8565d9be --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/resource/ResourceAIPActions.java @@ -0,0 +1,71 @@ +package plugin.ai.resource; + +import core.game.node.entity.skill.gather.SkillingResource; +import core.game.node.entity.player.Player; +import plugin.ai.AIPlayer; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; +import core.game.world.repository.Repository; + +import java.util.List; + +public class ResourceAIPActions { + + public static List resource_players = null; + + protected SkillingResource resource; + + public static void syncBotThread(final Player player) { + if (resource_players == null || resource_players.size() == 0) { + return; + } + for (int aip_index = 0; aip_index < resource_players.size(); aip_index++) { + final AIPlayer bot = resource_players.get(aip_index); + GameWorld.getPulser().submit(new Pulse(1, bot) { + int ticks; + int ov; + @Override + public boolean pulse() { + /*if (bot.getInventory().freeSlots() < 1) { + //flee(bot); + return true; + }*/ + //Inactivity logout timer. + if (ticks++ == 5000/* && bot.getWalkingQueue().getQueue().isEmpty()*/) { + AIPlayer.deregister(bot.getUid()); + resource_players.remove(bot); + return true; + } + if (ov++ >= 3) { + chopTree(bot); + ov = 0; + } +// ov = 0; + System.out.println("ResourceAIPActions" + ov); + return false; + } + }); + } + } + + private static boolean chopTree(final AIPlayer bot) { + /*for (GameObject[] o : RegionManager.forId(bot.getLocation().getRegionId()).getPlanes()[0].getObjects()) { + for (GameObject obj : o) { + if (obj != null) { + for (SkillingResource r : SkillingResource.values()) { + if (obj.getId() == r.getId()) { + Pathfinder.find(bot, obj).walk(bot); + bot.sendChat("WE CHOPPIN"); + } + } + } + } + }*/ + bot.attack(Repository.getNpcs().get(106)); + +// Pulse pulse = new GatheringSkillPulse(bot, node); +// bot.getPulseManager().run(new GatheringSkillPulse(bot, node)); +// pulse.start(); + return true; + } +} diff --git a/Server/src/main/java/Server/plugin/ai/resource/ResourceAIPManager.java b/Server/src/main/java/Server/plugin/ai/resource/ResourceAIPManager.java new file mode 100644 index 000000000..c04e5f290 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/resource/ResourceAIPManager.java @@ -0,0 +1,168 @@ +package plugin.ai.resource; + +import core.game.node.entity.player.Player; +import plugin.ai.resource.task.ResourceTask; +import plugin.ai.resource.task.ResourceTasks; +import core.game.system.task.Pulse; +import core.game.world.GameWorld; + +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + + +/** + * Package -> org.keldagrim.game.node.entity.player.ai.resource + * Created on -> 9/13/2016 @12:42 PM for 530 + * + * @author Ethan Kyle Millard + */ +public class ResourceAIPManager { + + private long time = 0; + + private Player player; + + private static Map TASKS = new HashMap<>(); + + public ResourceAIPManager init() { + getTasks().put(ResourceTasks.WOODCUTTING.getResourceTask(), 0L); + return this; + } + + public ResourceAIPManager runTask(Player player, String taskName) { + for (Map.Entry entry : getTasks().entrySet()) { + if (entry.getKey().getTaskName().equalsIgnoreCase(taskName)) { + if (entry.getValue() != 0) { + message(player, "You have extended the task " + taskName + "."); + } else { + message(player, "You have activated the task " + taskName + "."); + } + } + entry.getKey().setTaskName(taskName); + entry.setValue(entry.getValue() + 70); + this.player = player; + } + return this; + } + + public void reActivate(String name, long time) { + for (Map.Entry entry : TASKS.entrySet()) { + if (entry.getKey().getTaskName().equalsIgnoreCase(name)) { + entry.setValue(time); + } + } + } + + public ResourceAIPManager load(Player player) { + try { + Statement statement = GameWorld.getDatabaseManager().connections().get("global").createStatement(); + + ResultSet result = statement.executeQuery("SELECT * FROM `members` WHERE username='" + player.getUsername() + "'"); + // Results result = new Results(GameWorld.getDatabaseManager().query("global", "SELECT * FROM `members` WHERE username='" + player.getUsername() + "'")); + + while (result.next()) { + String eventName = result.getString("taskName"); + String eventTime = result.getString("taskTime"); + reActivate(eventName, Long.valueOf(eventTime)); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return this; + } + + public ResourceAIPManager save(Player player) { + /*if (GameWorld.getDatabaseManager().update("global", "DELETE FROM `members` WHERE worldid='" + GameWorld.getSettings().getWorldId() + "'") < 0) + return this;*/ + System.out.println("Saving..."); + Iterator> iterator = getTasks().entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + if (entry.getValue() <= 0) + continue; + StringBuilder query = new StringBuilder(); + query.append("UPDATE `members` SET `taskName`='" + entry.getKey().getTaskName() + "',`taskTime`='" + entry.getValue() + "' WHERE `username`='" + player.getUsername() + "'"); + System.out.println("ResourceAIPManager: " + query.toString()); + GameWorld.getDatabaseManager().update("global", query.toString()); + + } + return this; + } + + public void pulse(Player player) { + GameWorld.getPulser().submit(new Pulse(1) { + @Override + public boolean pulse() { + + time++; + + Iterator> iterator = getTasks().entrySet().iterator(); + + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + if (entry.getValue() > 0) { + entry.setValue(entry.getValue() - 1); + if (entry.getValue() == 50) + message(player, "You have 30 minutes before " + entry.getKey().getTaskName() + " task ends."); + if (entry.getValue() <= 0) { + entry.getKey().setTime(0); + entry.getKey().reward(player, entry.getKey().getTaskName()); + message(player, "The task " + entry.getKey().getTaskName() + " has now ended."); + save(player); + } + if (time == 50) { + entry.getKey().setTime(0); + save(player); + } + } + } + return false; + } + }); + } + + public ResourceAIPManager message(Player player, String message) { + return message(player, message, true, ""); + } + + public ResourceAIPManager message(Player player, String message, boolean tag) { + return message(player, message, tag, ""); + } + + public ResourceAIPManager notify(Player player, String message) { + return message(player, message, true, ""); + } + + public ResourceAIPManager notify(Player player, String message, boolean tag) { + return message(player, message, tag, ""); + } + + + public ResourceAIPManager message(Player player, String message, boolean tag, String color) { + player.getPacketDispatch().sendMessage(color + (tag ? "[Resource Manager] - " : "") + message); + return this; + + } + + public static Map getTasks() { + return TASKS; + } + + private static ResourceAIPManager INSTANCE = new ResourceAIPManager(); + + public static ResourceAIPManager get() { + return INSTANCE; + } + + public Player getPlayer() { + return player; + } + + public void setPlayer(Player player) { + this.player = player; + } +} diff --git a/Server/src/main/java/Server/plugin/ai/resource/task/ResourceTask.java b/Server/src/main/java/Server/plugin/ai/resource/task/ResourceTask.java new file mode 100644 index 000000000..b95917535 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/resource/task/ResourceTask.java @@ -0,0 +1,39 @@ +package plugin.ai.resource.task; + +import core.game.node.entity.player.Player; + +/** + * Package -> org.keldagrim.game.node.entity.player.ai.resource.task + * Created on -> 9/13/2016 @12:44 PM for 530 + * + * @author Ethan Kyle Millard + */ +public abstract class ResourceTask { + + + private String taskName; + private long time; + + public ResourceTask(String taskName, long time) { + this.taskName = taskName; + this.time = time; + } + + public abstract void reward(Player player, String eventName); + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } +} diff --git a/Server/src/main/java/Server/plugin/ai/resource/task/ResourceTasks.java b/Server/src/main/java/Server/plugin/ai/resource/task/ResourceTasks.java new file mode 100644 index 000000000..dfefd2147 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/resource/task/ResourceTasks.java @@ -0,0 +1,49 @@ +package plugin.ai.resource.task; + +import core.game.node.entity.skill.Skills; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.tools.RandomFunction; + +/** + * Package -> org.keldagrim.game.node.entity.player.ai.resource.task + * Created on -> 9/13/2016 @12:43 PM for 530 + * + * @author Ethan Kyle Millard + */ +public enum ResourceTasks { + + WOODCUTTING(new ResourceTask("Willow Logs", 6000) { + + @Override + public void reward(Player player, String eventName) { + if (player.getSkills().getLevel(Skills.WOODCUTTING) < 30) { + player.sendMessage(reqirementMessage()); + return; + } + if (getTime() == 0) { + player.getBank().add(new Item(1519, RandomFunction.random(700, 1000))); + player.getSkills().addExperience(Skills.WOODCUTTING, RandomFunction.random(100000, 150000)); + } + } + }); + + private ResourceTask resourceTask; + + + ResourceTasks(ResourceTask resourceTask) { + this.resourceTask = resourceTask; + } + + public ResourceTask getResourceTask() { + return resourceTask; + } + + public void setResourceTask(ResourceTask resourceTask) { + this.resourceTask = resourceTask; + } + + private static String reqirementMessage() { + return "You do not meet the requirements for this task."; + } +} diff --git a/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBot.java b/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBot.java new file mode 100644 index 000000000..554b249a9 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBot.java @@ -0,0 +1,128 @@ +package plugin.ai.skillingbot; + +import core.game.world.map.Location; + +import java.util.ArrayList; + +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.node.Node; +import plugin.ai.AIPlayer; +import core.game.node.item.Item; +import core.net.packet.in.InteractionPacket; + +public class SkillingBot extends AIPlayer { + + private int tick = 5; + private ArrayList interactNodeIds; + private int fromWhereDoIdrop; + private int skill; + private int interactionRange; + + public SkillingBot(Location l) + { + super(l); + this.fromWhereDoIdrop = 0; + this.interactionRange = 15; + } + + public SkillingBot(Location l, int skill, ArrayList entrys) + { + super(l); + this.skill = skill; + this.fromWhereDoIdrop = 0; + this.interactNodeIds = entrys; + this.interactionRange = 15; + + switch (this.skill) + { + case Skills.MINING: + default: + break; + } + } + + @Override + public void tick() + { + super.tick(); + + //Despawn + if (this.getSkills().getLifepoints() == 0) + AIPlayer.deregister(this.getUid()); + + //Interact with object + if (this.tick <= 0) + { + this.tick = 5; + if (this.skill == Skills.FISHING) + this.tick = 20; + + // Node test = getClosestNodeWithEntry(15, 15503); + Node node; + if (this.skill != Skills.FISHING) + { + node = getClosestNodeWithEntry(interactionRange, interactNodeIds); + } + else + { + node = getClosesCreature(interactionRange, interactNodeIds); +// if (test != null) +// System.out.println("interact with " + test.getName()); + } + + if (node == null) { + System.out.println("SkillingBot.java: Object not found " + this.skill); + return; + } + + //System.out.println("free slots " + this.getInventory().freeSlots()); + + if (this.getInventory().isFull()) + { +// System.out.println(this.getName() + " starts droping from " + fromWhereDoIdrop); + for (int i = fromWhereDoIdrop; i < 28; i++) + { + Item drop = this.getInventory().get(i); + final Option option = drop.getInteraction().get(4); + drop.getInteraction().handleItemOption(this, option, this.getInventory()); +// System.out.println("drop item " + i); + } + } + + int x = node.getLocation().getX(); + int y = node.getLocation().getY(); + if (this.skill != Skills.FISHING) + { + InteractionPacket.handleObjectInteraction(this, 0, x, y, node.getId()); + } + else + { + InteractionPacket.handleNPCInteraction(this, 0, node.getIndex()); + } + } + else + this.tick--; + } + + public int getSkill() + { + return this.skill; + } + + public int getFromWhereToDrop() + { + return this.fromWhereDoIdrop; + } + + public void setFromWhereDoIdrop(int id) + { + this.fromWhereDoIdrop = id; + } + + public void setInteractionRange(int range) + { + this.interactionRange = range; + } + +} diff --git a/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotAssembler.kt b/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotAssembler.kt new file mode 100644 index 000000000..60920e9c5 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotAssembler.kt @@ -0,0 +1,45 @@ +package plugin.ai.skillingbot + +import core.game.node.item.Item +import core.game.world.map.Location +import plugin.ai.AIPlayer + +class SkillingBotAssembler { + fun produce(type: Wealth,loc: Location): AIPlayer{ + return assembleBot(AIPlayer(loc),type) + } + + fun assembleBot(bot: AIPlayer, type: Wealth): AIPlayer{ + return when(type){ + Wealth.POOR -> equipSet(bot,POORSETS.random()) + Wealth.AVERAGE -> equipSet(bot,AVGSETS.random()) + Wealth.RICH -> equipSet(bot,RICHSETS.random()) + } + } + + fun equipSet(bot: AIPlayer,set: List): AIPlayer{ + for(i in set){ + val item = Item(i) + val configs = item.definition.handlers + val slot = configs["equipment_slot"] ?: continue + bot.equipment.add(item, slot as Int, + false,false) + val reqs = configs["requirements"] + if(reqs != null) + for(req in configs["requirements"] as HashMap) + bot.skills.setStaticLevel(req.key, req.value) + } + bot.skills.updateCombatLevel() + return bot + } + + enum class Wealth { + POOR, + AVERAGE, + RICH + } + + val POORSETS = arrayOf(listOf(542,544), listOf(581), listOf(6654,6655,6656), listOf(6654,6656), listOf(636,646), listOf(638,648), listOf(), listOf(), listOf()) + val AVGSETS = arrayOf(listOf(2649,342,344), listOf(2651,542,544), listOf(6654,6655,6656), listOf(6139,6141), listOf(9923,9924,9925), listOf(10400,10402,2649), listOf(10404,10406), listOf(12971,12978)) + val RICHSETS = arrayOf(listOf(10330,10332,2649), listOf(12873,12880,1046), listOf(13858,13861,13864), listOf(13887,13893), listOf(3481,3483), listOf(2653,2655), listOf(2661,2663), listOf(2591,2593), listOf(14490,14492)) +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotsBuilder.java b/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotsBuilder.java new file mode 100644 index 000000000..d89ea0db9 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/skillingbot/SkillingBotsBuilder.java @@ -0,0 +1,209 @@ +package plugin.ai.skillingbot; + +import java.util.ArrayList; + +import core.game.container.impl.EquipmentContainer; +import core.game.content.quest.tutorials.tutorialisland.CharacterDesign; +import core.game.node.entity.skill.Skills; +import plugin.ai.AIPlayer; +import core.game.node.entity.player.link.appearance.Gender; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +public final class SkillingBotsBuilder extends AIPlayer { + + public SkillingBotsBuilder(Location l) { + super(l); + // TODO Auto-generated constructor stub + } + + private static SkillingBot generateMiningBot(Location loc, ArrayList entrys) + { + SkillingBot bot = new SkillingBot(loc, Skills.MINING, entrys); + bot.getAppearance().setGender(RandomFunction.random(3) == 1 ? Gender.FEMALE : Gender.MALE); + + + bot.getEquipment().replace(new Item(1265), EquipmentContainer.SLOT_WEAPON); + return bot; + } + + private static SkillingBot generateWoodcuttingBot(Location loc, ArrayList entrys) + { + SkillingBot bot = new SkillingBot(loc, Skills.WOODCUTTING, entrys); + bot.getAppearance().setGender(RandomFunction.random(3) == 1 ? Gender.FEMALE : Gender.MALE); + + + bot.getEquipment().replace(new Item(1351), EquipmentContainer.SLOT_WEAPON); + return bot; + } + + private static SkillingBot generateFishingBot(Location loc, ArrayList entrys) + { + SkillingBot bot = new SkillingBot(loc, Skills.FISHING, entrys); + bot.getAppearance().setGender(RandomFunction.random(3) == 1 ? Gender.FEMALE : Gender.MALE); + CharacterDesign.randomize(bot, false); + + + return bot; + } + + public static void spawnClayBotVarrock(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(15503); + entrys.add(15505); + + SkillingBot bot = generateMiningBot(loc, entrys); + + bot.getSkills().setLevel(Skills.MINING, 10); + } + + public static void spawnIronBotVarrock(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(11954); + entrys.add(11955); + entrys.add(11956); + + SkillingBot bot = generateMiningBot(loc, entrys); + + bot.getSkills().setLevel(Skills.MINING, 25); + } + + public static void spawnSilverBotVarrock(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(11948); + entrys.add(11949); + entrys.add(11950); + + SkillingBot bot = generateMiningBot(loc, entrys); + + bot.getSkills().setLevel(Skills.MINING, 30); + } + + public static void spawnTinBotVarrock(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(11957); + entrys.add(11959); + entrys.add(11958); + + SkillingBot bot = generateMiningBot(loc, entrys); + + bot.getSkills().setLevel(Skills.MINING, 5); + } + + public static void spawnTinBotLumbridge(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(11933); + entrys.add(11934); + entrys.add(11935); + + SkillingBot bot = generateMiningBot(loc, entrys); + + bot.getSkills().setLevel(Skills.MINING, 5); + } + + public static void spawnCopperBotLumbridge(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(11936); + entrys.add(11937); + entrys.add(11938); + + SkillingBot bot = generateMiningBot(loc, entrys); + + bot.getSkills().setLevel(Skills.MINING, 5); + } + + public static void spawnOakTreeBotLumbridge(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(1281); + entrys.add(1278); + entrys.add(1276); + + SkillingBot bot = generateWoodcuttingBot(loc, entrys); + + bot.getSkills().setLevel(Skills.WOODCUTTING, 25); + bot.setInteractionRange(25); + } + + public static void spawnDeadTreeBotLumbridge(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(1282); + entrys.add(1286); + + SkillingBot bot = generateWoodcuttingBot(loc, entrys); + + bot.getSkills().setLevel(Skills.WOODCUTTING, 25); + bot.setInteractionRange(15); + } + + public static void spawnShrimpFisherLumbridge(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(323); + entrys.add(326); + + SkillingBot bot = generateFishingBot(loc, entrys); + + bot.getInventory().add(new Item(303)); + // don't drop net + bot.setFromWhereDoIdrop(1); + + bot.getSkills().setLevel(Skills.FISHING, 25); + bot.setInteractionRange(25); + } + + public static void spawnTroutLumbridge(Location loc) + { + ArrayList entrys = new ArrayList(); + entrys.add(310); + + SkillingBot bot = generateFishingBot(loc, entrys); + + bot.getInventory().add(new Item(309)); + bot.getInventory().add(new Item(314, 20000)); + // don't drop net + bot.setFromWhereDoIdrop(2); + + bot.getSkills().setLevel(Skills.FISHING, 25); + bot.setInteractionRange(25); + } + + //These bots are disabled because they somehow break pets + public static void immersiveSpawnsSkillingBots() + { + // Varrock Mine + SkillingBotsBuilder.spawnClayBotVarrock(new Location(3181, 3368)); + SkillingBotsBuilder.spawnSilverBotVarrock(new Location(3181, 3368)); + SkillingBotsBuilder.spawnIronBotVarrock(new Location(3181, 3368)); + SkillingBotsBuilder.spawnTinBotVarrock(new Location(3181, 3368)); + + // Lumbridge woodcutting + spawnOakTreeBotLumbridge(new Location(3227, 3243)); + spawnOakTreeBotLumbridge(new Location(3186, 3251)); + spawnOakTreeBotLumbridge(new Location(3188, 3223)); + spawnOakTreeBotLumbridge(new Location(3162, 3222)); + spawnOakTreeBotLumbridge(new Location(3162, 3219)); + spawnOakTreeBotLumbridge(new Location(3152, 3228)); + spawnOakTreeBotLumbridge(new Location(3146, 3244)); + spawnDeadTreeBotLumbridge(new Location(3247, 3240)); + + // Lumbridge mining + spawnTinBotLumbridge(new Location(3224, 3147)); + spawnCopperBotLumbridge(new Location(3224, 3147)); + + // Lumbridge Fishing + spawnShrimpFisherLumbridge(new Location(3242, 3151)); + spawnShrimpFisherLumbridge(new Location(3238, 3148)); + spawnShrimpFisherLumbridge(new Location(3245, 3161)); + spawnTroutLumbridge(new Location(3241, 3242)); + } + +} diff --git a/Server/src/main/java/Server/plugin/ai/system/GlobalAIManager.java b/Server/src/main/java/Server/plugin/ai/system/GlobalAIManager.java new file mode 100644 index 000000000..01b132dea --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/system/GlobalAIManager.java @@ -0,0 +1,32 @@ +package plugin.ai.system; + + +import plugin.ai.AIPlayer; + +import java.util.HashMap; +import java.util.Map; + +public class GlobalAIManager { + + + /** + * The active Artificial intelligent players mapping. + */ + private static final Map BOT_MAPPING = new HashMap<>(); + + + /** + * Constructs a new {@code GlobalAIManager} {@code Object}. + */ + public GlobalAIManager() { + + } + + public static void addBot(int uid, AIPlayer player) { + BOT_MAPPING.put(uid, player); + } + + public static AIPlayer getBot(int uid) { + return BOT_MAPPING.get(uid); + } +} diff --git a/Server/src/main/java/Server/plugin/ai/system/android/CombatDroid.java b/Server/src/main/java/Server/plugin/ai/system/android/CombatDroid.java new file mode 100644 index 000000000..375e389d5 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/system/android/CombatDroid.java @@ -0,0 +1,4 @@ +package plugin.ai.system.android; + +public class CombatDroid { +} diff --git a/Server/src/main/java/Server/plugin/ai/system/android/GatheringDroid.java b/Server/src/main/java/Server/plugin/ai/system/android/GatheringDroid.java new file mode 100644 index 000000000..8a6160f27 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/system/android/GatheringDroid.java @@ -0,0 +1,4 @@ +package plugin.ai.system.android; + +public class GatheringDroid { +} diff --git a/Server/src/main/java/Server/plugin/ai/system/predicate/Predicate.java b/Server/src/main/java/Server/plugin/ai/system/predicate/Predicate.java new file mode 100644 index 000000000..8c922c8b0 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/system/predicate/Predicate.java @@ -0,0 +1,102 @@ +package plugin.ai.system.predicate; + +import javax.security.auth.Destroyable; + +import plugin.ai.system.GlobalAIManager; + +/** + * An android predicate. + * + * @author Viper + * @version 1.0 - 13/07/2016 + */ +public abstract class Predicate implements Cloneable, Runnable, Destroyable { + + protected GlobalAIManager bot; + + /** + * Predicate started. + */ + private boolean started; + + /** + * The predicate priority factor. + */ + private byte priority; + + /** + * The predicate type. + */ + public abstract PredicateType getType(); + + /** + * Constructs a new {@link Predicate} {@code Object}. + * + * @param priority + * The priority of this predicate. + */ + public Predicate(int priority) { + this.priority = (byte) priority; + } + + public Predicate clone() { + final Predicate pred = this; + return new Predicate(priority) { + + @Override + public void run() { + pred.run(); + } + + @Override + public PredicateType getType() { + return pred.getType(); + } + }.setStarted(pred.started); + } + + /** + * @return the priority + */ + public byte getPriority() { + return priority; + } + + /** + * @param priority the priority to set + */ + public void setPriority(byte priority) { + this.priority = priority; + } + + /** + * @return the bot + */ + public GlobalAIManager getBot() { + return bot; + } + + /** + * @param bot the bot to set + */ + public Predicate setBot(GlobalAIManager bot) { + this.bot = bot; + return this; + } + + /** + * @return the started + */ + public boolean hasStarted() { + return started; + } + + /** + * @param started the started to set + */ + public Predicate setStarted(boolean started) { + this.started = started; + return this; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/system/predicate/PredicateType.java b/Server/src/main/java/Server/plugin/ai/system/predicate/PredicateType.java new file mode 100644 index 000000000..6c41cae22 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/system/predicate/PredicateType.java @@ -0,0 +1,13 @@ +package plugin.ai.system.predicate; + +/** + * Types of predicates. + * + * @author Viper + * @version 1.0 - 13/07/2016 + */ +public enum PredicateType { + + BOOT, TRANSCENDING, PARSING, TRIVIAL; + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/system/predicate/impl/AppearancePredicate.java b/Server/src/main/java/Server/plugin/ai/system/predicate/impl/AppearancePredicate.java new file mode 100644 index 000000000..f9b1dd443 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/system/predicate/impl/AppearancePredicate.java @@ -0,0 +1,60 @@ +package plugin.ai.system.predicate.impl; + + +import plugin.ai.system.predicate.Predicate; +import plugin.ai.system.predicate.PredicateType; + +/** + * Generates random appearance for the droid. + * + * @author Viper + * @version 1.0 - 13/07/2016 + */ +public class AppearancePredicate extends Predicate { + + /** + * If the bot is a male. + */ + private boolean male; + + /** + * Constructs a new appearance predicate. + */ + public AppearancePredicate(boolean male) { + super(-1); + this.male = male; + } + + @Override + public PredicateType getType() { + return PredicateType.PARSING; + } + + @Override + public void run() { + if (isMale()) { + /*bot.getAppearence().getBodyStyle()[0] = Utility.random(0, 8); + bot.getAppearence().getBodyStyle()[1] = Utility.random(10, 17); + bot.getAppearence().getBodyStyle()[2] = Utility.random(18, 25); + bot.getAppearence().getBodyStyle()[3] = Utility.random(26, 32); + bot.getAppearence().getBodyStyle()[4] = Utility.random(33, 34); + bot.getAppearence().getBodyStyle()[5] = Utility.random(36, 41); + bot.getAppearence().getBodyStyle()[6] = Utility.random(42, 44); + + bot.getAppearence().getBodyColors()[2] = (byte) Utility.random(0, 127); + bot.getAppearence().getBodyColors()[1] = (byte) Utility.random(0, 127); + bot.getAppearence().getBodyColors()[0] = (byte) Utility.random(0, 24);*/ + } else { + + } +// bot.getAppearence().generateAppearenceData(); + } + + /** + * @return the male + */ + public boolean isMale() { + return male; + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/ai/wilderness/PvPBotsBuilder.java b/Server/src/main/java/Server/plugin/ai/wilderness/PvPBotsBuilder.java new file mode 100644 index 000000000..3812f7eb1 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/wilderness/PvPBotsBuilder.java @@ -0,0 +1,550 @@ +package plugin.ai.wilderness; + +import java.util.ArrayList; + +import core.game.container.impl.EquipmentContainer; +import core.game.node.entity.skill.Skills; +import core.game.node.entity.combat.CombatSpell; +import plugin.ai.AIPlayer; +import plugin.ai.pvmbots.DragonKiller; +import plugin.ai.pvmbots.NoobBot; +import plugin.ai.pvmbots.PvMBots; +import core.game.node.entity.player.link.SpellBookManager; +import core.game.node.entity.player.link.appearance.Gender; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.tools.RandomFunction; + +public final class PvPBotsBuilder{ + + public static WildernessBot create(Location l) + { + return new WildernessBot(l); + } + + public static void generateClass(WildernessBot p) { + int combatType = RandomFunction.getRandom(1); + switch(combatType) { + case 0: + buildMeleeStats(p); + buildMeleeEquipment(p); + correctHitpointsStat(p); + break; + case 1: + //max rune + buildMaxMeleeStats(p); + buildMaxMeleeEquipment(p); + correctHitpointsStat(p); + break; + } + p.getInventory().add(new Item(385, 20)); + p.getProperties().setCombatLevel(126); + + p.getSkills().setLevel(Skills.PRAYER, 98); + p.getSkills().setStaticLevel(Skills.PRAYER, 98); + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + + private static void buildMeleeStats(WildernessBot p) { + int attackLevel = RandomFunction.random(80, 98); + int strengthLevel = RandomFunction.random(attackLevel - 10, attackLevel + 10); + int defenceLevel = RandomFunction.random(60, 98); + + p.getSkills().setLevel(Skills.ATTACK, attackLevel); + p.getSkills().setStaticLevel(Skills.ATTACK, attackLevel); + p.getSkills().setLevel(Skills.STRENGTH, strengthLevel); + p.getSkills().setStaticLevel(Skills.STRENGTH, strengthLevel); + p.getSkills().setLevel(Skills.DEFENCE, defenceLevel); + p.getSkills().setStaticLevel(Skills.DEFENCE, defenceLevel); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + private static void buildMeleeEquipment(WildernessBot p) { + int[] helms = { + 1163, //Rune Full Helm + 3751, //Berserker Helm + 3753, //Warrior Helm + 10828, + 1038, + 4753, + }; + int[] shield = { + 1185, //Rune sq shield + 1201, //Rune kiteshield + 6524, //Obsidian shield + 8850, //Rune defender + 11286, + 14767, + }; + int[] platebody = { + 1113, //Rune chainmail. + 1127, //Rune platebody. + 10551, + 4757, + 11724, + 4720, + }; + int[] platelegs = { + 1079, //Rune platelegs. + 4759, + 11726, + 1075, + }; + + p.getEquipment().replace(new Item(helms[RandomFunction.random(helms.length)]), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(shield[RandomFunction.random(shield.length)]), EquipmentContainer.SLOT_SHIELD); + p.getEquipment().replace(new Item(platebody[RandomFunction.random(platebody.length)]), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(platelegs[RandomFunction.random(platelegs.length)]), EquipmentContainer.SLOT_LEGS); + + Item weapon = new Item(weapons[RandomFunction.random(weapons.length)]); + p.setMainWeapon(weapon.getId()); + p.getEquipment().replace(weapon, EquipmentContainer.SLOT_WEAPON); + + p.getEquipment().replace(new Item(generateNecklace()), EquipmentContainer.SLOT_AMULET); + p.getEquipment().replace(new Item(generateBoots()), EquipmentContainer.SLOT_FEET); + p.getEquipment().replace(new Item(generateCape()), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(generateGloves()), EquipmentContainer.SLOT_HANDS); + } + + public static final int[] weapons = { + 4151, //Whip + 4587, //Dragon Scimitar + + }; + + + private static void buildMaxMeleeStats(AIPlayer p) + { + p.getSkills().setLevel(Skills.ATTACK, 99); + p.getSkills().setStaticLevel(Skills.ATTACK, 99); + p.getSkills().setLevel(Skills.STRENGTH, 99); + p.getSkills().setStaticLevel(Skills.STRENGTH, 99); + p.getSkills().setLevel(Skills.DEFENCE, 99); + p.getSkills().setStaticLevel(Skills.DEFENCE, 99); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + private static void buildMaxMeleeEquipment(AIPlayer p) { + int[] helms = { + 3751, //Berserker Helm + }; + int[] shield = { + 14767, //Dragon defender + }; + int[] platebody = { + 11724, //Bandos chainmail. + }; + int[] platelegs = { + 11726, //Bandos Tassets. + }; + int[] amulets = { + 6585, //fury + }; + int[] boots = { + 3105, //Climbing boots. + }; + int[] cape = { + 6570, //Fire cape. + }; + int[] gloves = { + 7462, //Barrows Gloves. + }; + p.getEquipment().replace(new Item(helms[RandomFunction.random(helms.length)]), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(shield[RandomFunction.random(shield.length)]), EquipmentContainer.SLOT_SHIELD); + p.getEquipment().replace(new Item(platebody[RandomFunction.random(platebody.length)]), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(platelegs[RandomFunction.random(platelegs.length)]), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(weapons2[RandomFunction.random(weapons2.length)]), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(amulets[RandomFunction.random(amulets.length)]), EquipmentContainer.SLOT_AMULET); + p.getEquipment().replace(new Item(boots[RandomFunction.random(boots.length)]), EquipmentContainer.SLOT_FEET); + p.getEquipment().replace(new Item(cape[RandomFunction.random(cape.length)]), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(gloves[RandomFunction.random(gloves.length)]), EquipmentContainer.SLOT_HANDS); + } + + public static final int[] weapons2 = { + 4151, //Whip + }; + + private static int generateCape() { + int[] capes = { + 1052, //Legends Cape + 6570, //Fire cape + }; + return capes[RandomFunction.random(capes.length)]; + } + + private static int generateNecklace() { + int[] amulets = { + 1712, //Glory + 1725, //Strength ammy + 6585, //fury + }; + return amulets[RandomFunction.random(amulets.length)]; + } + + private static int generateGloves() { + int[] gloves = { + 1059, + 7462 + }; + return gloves[RandomFunction.random(gloves.length)]; + } + + private static int generateBoots() { + int[] boots = { + 1061, //Leather boots. + 1837, //Desert boots. + 3105, //Climbing boots. + 3791, //Fremmy boots. + 11732, + }; + return boots[RandomFunction.random(boots.length)]; + } + + public static void generateMinLevels(PvMBots p) + { + //Slayer so they can attack alls monsters + p.getSkills().setLevel(Skills.SLAYER, 99); + p.getSkills().setStaticLevel(Skills.SLAYER, 99); + int combatType = RandomFunction.getRandom(2); + p.getSkills().setLevel(Skills.HITPOINTS, 15); + p.getSkills().setStaticLevel(Skills.HITPOINTS, 15); + p.getInventory().add(new Item(329, 5)); + switch(combatType) + { + case 0: + { + buildArcherStats(p); + buildArcherEquipment(p); + break; + } + case 1: + { + buildMeleeStats(p); + buildMeleeEquipment(p); + break; + } + case 2: + { + buildMageStats(p); + buildMagicEquipment(p); + setupWizard(p); + break; + } + default: + { + buildMeleeStats(p); + buildMeleeEquipment(p); + break; + } + + } + } + + public static void createDragonKiller(DragonKiller p) + { + p.getSkills().setLevel(Skills.SLAYER, 99); + p.getSkills().setStaticLevel(Skills.SLAYER, 99); + int combatType = RandomFunction.getRandom(2); + p.getSkills().setLevel(Skills.HITPOINTS, 55); + p.getSkills().setStaticLevel(Skills.HITPOINTS, 55); + switch(combatType) + { + case 0: + { + buildDragonArcherStats(p); + buildDragonArcherEquipment(p); + break; + } + case 1: + { + buildDragonMeleeStats(p); + buildDragonMeleeEquipment(p); + break; + } + default: + { + buildDragonMeleeStats(p); + buildDragonMeleeEquipment(p); + break; + } + } + } + + public static void createNoob(NoobBot p) + { + p.getSkills().setLevel(Skills.SLAYER, 99); + p.getSkills().setStaticLevel(Skills.SLAYER, 99); + int combatType = RandomFunction.getRandom(3); + p.getSkills().setLevel(Skills.HITPOINTS, 10 + RandomFunction.getRandom(10)); + p.getSkills().setStaticLevel(Skills.HITPOINTS, 10 + RandomFunction.getRandom(10)); + p.getSkills().setLevel(Skills.DEFENCE, 1 + RandomFunction.getRandom(9)); + p.getSkills().setStaticLevel(Skills.DEFENCE, 1 + RandomFunction.getRandom(9)); + p.getInventory().add(new Item(329, 5)); + switch(combatType) + { + case 0: + { + buildNoobArcherStats(p); + buildNoobArcherEquipment(p); + break; + } + case 1: + { + buildNoobMeleeStats(p); + buildNoobMeleeEquipment(p); + break; + } + case 2: + { + buildNoobMageStats(p); + buildNoobMagicEquipment(p); + setupWizard(p); + } + default: + { + buildNoobMeleeStats(p); + buildNoobMeleeEquipment(p); + break; + } + } + } + + private static void buildArcherStats(PvMBots p) + { + p.getSkills().setLevel(Skills.RANGE, 10); + p.getSkills().setStaticLevel(Skills.RANGE, 10); + p.getSkills().setLevel(Skills.DEFENCE, 10); + p.getSkills().setStaticLevel(Skills.DEFENCE, 10); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + private static void buildDragonArcherStats(DragonKiller p) + { + p.getSkills().setLevel(Skills.RANGE, 55); + p.getSkills().setStaticLevel(Skills.RANGE, 55); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + private static void buildNoobArcherStats(NoobBot p) + { + p.getSkills().setLevel(Skills.RANGE, 1 + RandomFunction.getRandom(10)); + p.getSkills().setStaticLevel(Skills.RANGE, 1 + RandomFunction.getRandom(10)); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + public static void buildMeleeStats(PvMBots p) + { + p.getSkills().setLevel(Skills.ATTACK, 10); + p.getSkills().setStaticLevel(Skills.ATTACK, 10); + p.getSkills().setLevel(Skills.STRENGTH, 10); + p.getSkills().setStaticLevel(Skills.STRENGTH, 10); + p.getSkills().setLevel(Skills.DEFENCE, 10); + p.getSkills().setStaticLevel(Skills.DEFENCE, 10); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + public static void buildDragonMeleeStats(DragonKiller p) + { + p.getSkills().setLevel(Skills.ATTACK, 55); + p.getSkills().setStaticLevel(Skills.ATTACK, 55); + p.getSkills().setLevel(Skills.STRENGTH, 55); + p.getSkills().setStaticLevel(Skills.STRENGTH, 55); + p.getSkills().setLevel(Skills.DEFENCE, 45); + p.getSkills().setStaticLevel(Skills.DEFENCE, 45); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + private static void buildNoobMeleeStats(NoobBot p) + { + p.getSkills().setLevel(Skills.ATTACK, 1 + RandomFunction.getRandom(10)); + p.getSkills().setStaticLevel(Skills.ATTACK, 1 + RandomFunction.getRandom(10)); + p.getSkills().setLevel(Skills.STRENGTH, 1 + RandomFunction.getRandom(10)); + p.getSkills().setStaticLevel(Skills.STRENGTH, 1 + RandomFunction.getRandom(10)); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + private static void buildMageStats(PvMBots p) + { + p.getSkills().setLevel(Skills.MAGIC, 10); + p.getSkills().setStaticLevel(Skills.MAGIC, 10); + p.getSkills().setLevel(Skills.DEFENCE, 10); + p.getSkills().setStaticLevel(Skills.DEFENCE, 10); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + private static void buildNoobMageStats(NoobBot p) + { + p.getSkills().setLevel(Skills.MAGIC, 1 + RandomFunction.getRandom(10)); + p.getSkills().setStaticLevel(Skills.MAGIC, 1 + RandomFunction.getRandom(10)); + + p.getSkills().updateCombatLevel(); + p.getAppearance().sync(); + } + + private static void setupWizard(PvMBots p) + { + //final int SPELL_IDS[] = new int[] {1, 4, 6, 8, 10, 14, 17, 20, 24, 27, 33, 38, 45, 48, 52, 55 }; + p.getProperties().setAutocastSpell(((CombatSpell) SpellBookManager.SpellBook.MODERN.getSpell(1))); + p.getInventory().add(new Item(556, 1000)); //Air runes + p.getInventory().add(new Item(558, 1000)); //Mind runes + } + + private static void buildArcherEquipment(PvMBots p) + { + p.getEquipment().replace(new Item(1169), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(1129), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(1095), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(841), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(884, 5000), EquipmentContainer.SLOT_ARROWS); + p.getEquipment().replace(new Item(1007), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(1478), EquipmentContainer.SLOT_AMULET); + } + + private static void buildDragonArcherEquipment(DragonKiller p) + { + p.getEquipment().replace(new Item(1169), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(13483), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(1099), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(9185), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(1540), EquipmentContainer.SLOT_SHIELD); + p.getEquipment().replace(new Item(9140, 500), EquipmentContainer.SLOT_ARROWS); + p.getEquipment().replace(new Item(10498), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(1478), EquipmentContainer.SLOT_AMULET); + } + + private static void buildNoobArcherEquipment(PvMBots p) + { + int hats[] = {1169, 1169, 1139, 1137, 1153, 579}; + int legs[] = {1095, 7366, 1075, 1087, 1095}; + int chest[] = {1129, 1103, 1101, 1129, 1117, 577}; + + p.getEquipment().replace(new Item(hats[RandomFunction.getRandom(hats.length - 1)]), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(chest[RandomFunction.getRandom(chest.length - 1)]), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(legs[RandomFunction.getRandom(legs.length - 1)]), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(841), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(884, 5000), EquipmentContainer.SLOT_ARROWS); + p.getEquipment().replace(new Item(1007), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(1478), EquipmentContainer.SLOT_AMULET); + } + + private static void buildMeleeEquipment(PvMBots p) + { + p.getEquipment().replace(new Item(1153), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(1115), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(1067), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(1309), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(884), EquipmentContainer.SLOT_ARROWS); + p.getEquipment().replace(new Item(1007), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(1725), EquipmentContainer.SLOT_AMULET); + } + + private static void buildDragonMeleeEquipment(DragonKiller p) + { + p.getEquipment().replace(new Item(1163), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(1127), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(1079), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(1333), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(1540), EquipmentContainer.SLOT_SHIELD); + p.getEquipment().replace(new Item(1007), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(1725), EquipmentContainer.SLOT_AMULET); + } + + private static void buildNoobMeleeEquipment(PvMBots p) + { + int hats[] = {1169, 1169, 1139, 1137, 1153, 579}; + int legs[] = {1095, 7366, 1075, 1087, 1095}; + int chest[] = {1129, 1103, 1101, 1129, 1117, 577}; + int weapons[] = {1307, 1321, 1375, 1203, 1239, 1267, 1293, 1323, 1335}; + + p.getEquipment().replace(new Item(hats[RandomFunction.getRandom(hats.length - 1)]), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(chest[RandomFunction.getRandom(chest.length - 1)]), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(legs[RandomFunction.getRandom(legs.length - 1)]), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(weapons[RandomFunction.getRandom(weapons.length - 1)]), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(884), EquipmentContainer.SLOT_ARROWS); + p.getEquipment().replace(new Item(1007), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(1725), EquipmentContainer.SLOT_AMULET); + } + + private static void buildMagicEquipment(PvMBots p) + { + p.getEquipment().replace(new Item(579), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(577), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(1011), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(1389), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(884), EquipmentContainer.SLOT_ARROWS); + p.getEquipment().replace(new Item(1007), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(1727), EquipmentContainer.SLOT_AMULET); + } + + private static void buildNoobMagicEquipment(PvMBots p) + { + int hats[] = {1169, 1169, 1139, 1137, 1153, 579}; + int legs[] = {1095, 7366, 1075, 1087, 1095}; + int chest[] = {1129, 1103, 1101, 1129, 1117, 577}; + int weapons[] = {1379, 1383, 1385, 1387, 1389}; + + p.getEquipment().replace(new Item(hats[RandomFunction.getRandom(hats.length - 1)]), EquipmentContainer.SLOT_HAT); + p.getEquipment().replace(new Item(chest[RandomFunction.getRandom(chest.length - 1)]), EquipmentContainer.SLOT_CHEST); + p.getEquipment().replace(new Item(legs[RandomFunction.getRandom(legs.length - 1)]), EquipmentContainer.SLOT_LEGS); + p.getEquipment().replace(new Item(weapons[RandomFunction.getRandom(weapons.length - 1)]), EquipmentContainer.SLOT_WEAPON); + p.getEquipment().replace(new Item(884), EquipmentContainer.SLOT_ARROWS); + p.getEquipment().replace(new Item(1007), EquipmentContainer.SLOT_CAPE); + p.getEquipment().replace(new Item(1727), EquipmentContainer.SLOT_AMULET); + } + + public static void spawn(Location loc) + { + final WildernessBot bot = PvPBotsBuilder.create(new Location(0, 0)); + bot.teleport(loc); + bot.getAppearance().setGender(RandomFunction.random(3) == 1 ? Gender.FEMALE : Gender.MALE); + + generateClass(bot); + + } + + private static void correctHitpointsStat(AIPlayer player) { + player.getSkills().setLevel(Skills.HITPOINTS, 10); + player.getSkills().setStaticLevel(Skills.HITPOINTS, 10); + player.getSkills().updateCombatLevel(); + int rangedLevel = RandomFunction.random(80, 98); + int defenceLevel = RandomFunction.random(80, 98); + + player.getSkills().setLevel(Skills.HITPOINTS, rangedLevel); + player.getSkills().setStaticLevel(Skills.HITPOINTS, rangedLevel); + player.getSkills().setLevel(Skills.HITPOINTS, defenceLevel); + player.getSkills().setStaticLevel(Skills.HITPOINTS, defenceLevel); + + player.getSkills().updateCombatLevel(); + player.getAppearance().sync(); + } + + public void RandomItem() + { + Item test = null; + ArrayList tests = new ArrayList(); + for (int x = 0; x < 9999; x++) + test = new Item(x); + if (test.getDefinition().getEquipId() != 0) + tests.add(test); + } +} diff --git a/Server/src/main/java/Server/plugin/ai/wilderness/WildernessBot.java b/Server/src/main/java/Server/plugin/ai/wilderness/WildernessBot.java new file mode 100644 index 000000000..66f55b414 --- /dev/null +++ b/Server/src/main/java/Server/plugin/ai/wilderness/WildernessBot.java @@ -0,0 +1,281 @@ +package plugin.ai.wilderness; + +import java.util.ArrayList; +import java.util.List; + +import core.game.container.impl.EquipmentContainer; +import core.game.content.consumable.Consumable; +import core.game.content.consumable.Consumables; +import core.game.content.consumable.Food; +import core.game.content.consumable.effects.HealingEffect; +import core.game.node.entity.skill.Skills; +import core.game.interaction.Option; +import core.game.node.entity.Entity; +import core.game.node.entity.player.Player; +import plugin.ai.AIPlayer; +import core.game.node.entity.player.link.prayer.PrayerType; +import core.game.node.item.Item; +import core.game.world.map.Location; +import core.game.world.map.RegionManager; +import core.tools.RandomFunction; + +public class WildernessBot extends AIPlayer { + + public WildernessBot(Location l) { + super(l); + this.specWeapon = 1215; + this.normalWeapon = 4151; + this.getInventory().add(new Item(specWeapon)); + // TODO Auto-generated constructor stub + } + + public WildernessBot(Location l, int normalWeaponId, int specWeaponId) { + super(l); + this.specWeapon = specWeaponId; + this.normalWeapon = normalWeaponId; + this.getInventory().add(new Item(specWeaponId)); + } + + int tick = 0; + int movetimer = 0; + int agressiveTimer = 2; + int eatdelay = 2; + boolean fleeing = false; + boolean riskIt = false; + int specWeapon;// = new Item(1215); + int normalWeapon;// = new Item(4151); + + Item chest = this.getEquipment().get(EquipmentContainer.SLOT_CHEST); + Item legs = this.getEquipment().get(EquipmentContainer.SLOT_LEGS); + Item helmet = this.getEquipment().get(EquipmentContainer.SLOT_HAT); + Item weapon = this.getEquipment().get(EquipmentContainer.SLOT_WEAPON); + Item shield = this.getEquipment().get(EquipmentContainer.SLOT_SHIELD); + + + public List FindTargets(Entity entity, int radius) { + List targets = new ArrayList<>(); + for (Player player : RegionManager.getLocalPlayers(entity, radius)) { { + if (checkValidTargets(player)) + targets.add(player); + } + } + if (targets.size() == 0) + return null; + return targets; + } + + public boolean checkValidTargets(Player target){ + if (!target.isActive()) + { + return false; + } + if (!target.getProperties().isMultiZone() && target.inCombat()) { + return false; + } + if (target.inCombat()) + { + return false; + } + return true; + } + + public void AttackPlayersInRadius(Player bot, int radius) + { + if (bot.inCombat()) + return; + List players = FindTargets(bot, radius); + if (players == null) + { + return; + } + if (!(players.isEmpty())) + { + if (agressiveTimer <= 0) + bot.attack(players.get(RandomFunction.getRandom((players.size() - 1)))); + return; + } + } + + private Entity getTarget() + { + return this.getProperties().getCombatPulse().getVictim(); + } + + private void checkSpecialAttack() + { + Entity target = getTarget(); + if (target == null) + return; + + if (target.getSkills().getLifepoints() <= 75 && this.getSettings().getSpecialEnergy() >= 25) + { + //System.out.println("try special"); + Item weapon = this.getItemById(specWeapon); + if (weapon != null) + { + //System.out.println("found weapon " + weapon.getName()); + final Option option = weapon.getInteraction().get(1); + if (option == null) + { + System.out.println("Option not found"); + return; + } + weapon.getInteraction().handleItemOption(this, option, this.getInventory()); + this.getSettings().setSpecialToggled(true); + this.attack(target); + } + if (!this.getSettings().isSpecialToggled()) + { + //System.out.println("toggle special"); + this.getSettings().setSpecialToggled(true); + this.attack(target); + } + } + else + { + //System.out.println("try normal again"); + Item weapon = this.getItemById(normalWeapon); + if (weapon != null) + { + //System.out.println("found weapon " + weapon.getName()); + final Option option = weapon.getInteraction().get(1); + if (option == null) + { + System.out.println("Option not found"); + return; + } + weapon.getInteraction().handleItemOption(this, option, this.getInventory()); + this.getSettings().setSpecialToggled(false); + this.attack(target); + } + } + } + + private void checkBarrowsSwitch() + { + System.out.println("WildernessBot: " + this.getSkills().getLifepoints()); + Entity target = getTarget(); + if (target == null) + return; + + if (this.getSkills().getLifepoints() <= 35 && target.isPlayer() && target.getSkills().getLifepoints() <= 60) + { + this.getEquipment().replace(new Item(4720) ,EquipmentContainer.SLOT_CHEST); + this.getEquipment().replace(new Item(4722) ,EquipmentContainer.SLOT_LEGS); + this.getEquipment().replace(new Item(4716) ,EquipmentContainer.SLOT_HAT); + this.getEquipment().replace(new Item(4719) ,EquipmentContainer.SLOT_WEAPON); + this.getEquipment().replace(new Item(-1) ,EquipmentContainer.SLOT_SHIELD); + riskIt = true; + } + else if (riskIt) + { + this.getEquipment().replace(chest, EquipmentContainer.SLOT_CHEST); + this.getEquipment().replace(legs, EquipmentContainer.SLOT_LEGS); + this.getEquipment().replace(helmet, EquipmentContainer.SLOT_HAT); + this.getEquipment().replace(weapon, EquipmentContainer.SLOT_WEAPON); + this.getEquipment().replace(shield, EquipmentContainer.SLOT_SHIELD); + riskIt = false; + } + } + + private void checkPrayer() + { + if (this.inCombat()) + { + if (!(this.getPrayer().getActive().contains(PrayerType.PIETY))) + this.getPrayer().toggle((PrayerType.PIETY)); + } + } + + @Override + public void tick() + { + super.tick(); + //checkBarrowsSwitch(); + checkSpecialAttack(); + checkPrayer(); + //Despawn + if (this.getSkills().getLifepoints() == 0) + //this.teleport(new Location(500, 500)); + //Despawning not being delayed causes 3 errors in the console + AIPlayer.deregister(this.getUid()); + if (agressiveTimer != 0) + { + agressiveTimer--; + } + + //Combat + if (!fleeing) + { + if (tick == 0) + { + if (!this.inCombat()) + AttackPlayersInRadius(this, 5); + this.tick = 10; + } + else + this.tick--; + + if (!this.inCombat()) + { + if (movetimer == 0) + { + //if (this.FindTargets(this, 5) == null) + this.randomWalk(20, 20); + this.movetimer = 10; + } + else + movetimer --; + } + } + this.sendChat("Tik"); + this.checkFlee(385); + this.eat(385); + //this.getPrayer().toggle() + } + + public void checkFlee(int foodId) + { + if (this.getInventory().contains(foodId, 18) == false) + { + //todo: add tp + // if () + this.getProperties().setRetaliating(false); + this.sendChat("Oi"); + walkPos(this.getLocation().getLocalX(), this.getLocation().getLocalY() - 5 - RandomFunction.getRandom(5)); + fleeing = true; + } + } + + public void eat(int foodId) + { + if (riskIt) + return; + + Item foodItem = new Item(foodId); + + if (!(this.getInventory().contains(foodId, 1))) + return; + + if((this.getSkills().getStaticLevel(Skills.HITPOINTS) >= this.getSkills().getLifepoints() * 3) && this.getInventory().containsItem(foodItem)) + { + this.lock(3); + //this.animate(new Animation(829)); + Item food = this.getInventory().getItem(foodItem); + + Consumable consumable = Consumables.getConsumableById(food.getId()); + + if (consumable == null) { + consumable = new Food(new int[] {food.getId()}, new HealingEffect(1)); + } + + consumable .consume(food, this); + this.getProperties().getCombatPulse().delayNextAttack(3); + } + } + + public void setMainWeapon(int weapon) + { + this.normalWeapon = weapon; + } +} diff --git a/Server/src/main/java/Server/plugin/barbtraining/fishing/BarbFishingPulse.kt b/Server/src/main/java/Server/plugin/barbtraining/fishing/BarbFishingPulse.kt new file mode 100644 index 000000000..02b256627 --- /dev/null +++ b/Server/src/main/java/Server/plugin/barbtraining/fishing/BarbFishingPulse.kt @@ -0,0 +1,98 @@ +package plugin.barbtraining.fishing + +import core.game.node.entity.npc.NPC +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.world.update.flag.context.Animation +import core.tools.Items +import core.tools.RandomFunction +import core.game.node.entity.skill.SkillPulse +import core.game.node.entity.skill.Skills +import core.tools.stringtools.colorize + +/** + * Pulse used for barbarian fishing + * @author Ceikry + */ +class BarbFishingPulse(player: Player) : SkillPulse(player,NPC(1176)) { + override fun checkRequirements(): Boolean { + /*if(player.getAttribute("barbtraining:fishing:completed",false) == false){ + player.sendMessage(colorize("%RYou need to complete barbarian fishing training to fish here.")) + return false + }*/ + if(player.skills.getLevel(Skills.FISHING) < 48){ + player.sendMessage(colorize("%RYou need a fishing level of at least 48 to fish here.")) + return false + } + if(player.skills.getLevel(Skills.AGILITY) < 15 || player.skills.getLevel(Skills.STRENGTH) < 15){ + player.sendMessage(colorize("%RYou need a strength and agility level of at least 15 to fish here.")) + return false + } + if(!player.inventory.containsItem(Item(11323))){ + player.sendMessage(colorize("%RYou need a barbarian fishing rod to fish here.")) + return false + } + if(player.inventory.isFull){ + player.sendMessage("You don't have enough space in your inventory.") + return false + } + if(!(player.inventory.containsItem(Item(Items.FEATHER_314)) || player.inventory.containsItem(Item(Items.FISH_OFFCUTS_11334)))){ + player.sendMessage("You don't have any bait with which to fish.") + return false + } + return true + } + + override fun animate() { + player.animator.animate(Animation(622)) + } + + override fun reward(): Boolean { + val stragiXP = arrayOf(5,6,7) + val fishXP = arrayOf(50,70,80) + val reward = getRandomFish() + val success = rollSuccess(when(reward){ + Item(11328) -> 48 + Item(11330) -> 58 + Item(11332) -> 70 + else -> 99 + }) + val index = (when(reward){ + Item(11328) -> 0 + Item(11330) -> 1 + Item(11332) -> 2 + else -> 0 + }) + if(success){ + if(!player.inventory.remove(Item(Items.FISH_OFFCUTS_11334))) { + player.inventory.remove(Item(Items.FEATHER_314)) + } + player.inventory.add(reward) + player.skills.addExperience(Skills.FISHING,fishXP[index].toDouble()) + player.skills.addExperience(Skills.AGILITY,stragiXP[index].toDouble()) + player.skills.addExperience(Skills.STRENGTH,stragiXP[index].toDouble()) + player.sendMessage("You manage to catch a ${reward.name.toLowerCase()}.") + } + super.setDelay(5) + return player.inventory.freeSlots() == 0 + } + + fun rollSuccess(fish: Int): Boolean{ + val level = 1 + player.skills.getLevel(Skills.FISHING) + player.familiarManager.getBoost(Skills.FISHING) + val hostRatio: Double = Math.random() * fish + val clientRatio: Double = Math.random() * (level * 3.0 - fish) + return hostRatio < clientRatio + } + + fun getRandomFish(): Item{ + val fish = arrayOf(11328,11330,11332) + val fishing = player.skills.getLevel(Skills.FISHING) + val strength = player.skills.getLevel(Skills.STRENGTH) + val agility = player.skills.getLevel(Skills.AGILITY) + var possibleIndex = 0 + if(fishing >= 58 && (strength >= 30 && agility >= 30)) possibleIndex++ + if(fishing >= 70 && (strength >= 45 && agility >= 45)) possibleIndex++ + return Item(fish[RandomFunction.random(possibleIndex + 1)]) + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/barbtraining/fishing/FishCuttingPulse.kt b/Server/src/main/java/Server/plugin/barbtraining/fishing/FishCuttingPulse.kt new file mode 100644 index 000000000..bcca5e94e --- /dev/null +++ b/Server/src/main/java/Server/plugin/barbtraining/fishing/FishCuttingPulse.kt @@ -0,0 +1,45 @@ +package plugin.barbtraining.fishing + +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.game.system.task.Pulse +import core.game.world.update.flag.context.Animation +import core.tools.Items +import core.game.node.entity.skill.Skills + +/** + * Pulse used for cutting fish into fish offcuts + * @param player the player running the pulse + * @param fish the fish being cut + * @author Ceikry + */ +class FishCuttingPulse(val player: Player, val fish: Int) : Pulse(0){ + fun checkRequirements(): Boolean { + if(!(player.inventory.freeSlots() >= 2 || (player.inventory.freeSlots() >= 1 && player.inventory.containsItem(Item(Items.FISH_OFFCUTS_11334))))){ + player.sendMessage("You do not have enough space to do that.") + return false + } + return true + } + + override fun pulse(): Boolean { + player.animator.animate(Animation(1248)) + player.inventory.remove(Item(fish)) + + player.inventory.add(Item(Items.FISH_OFFCUTS_11334)) + + player.inventory.add(Item(when(fish){ + 11328, 11330 -> Items.ROE_11324 + 11332 -> Items.CAVIAR_11326 + else -> 0 + })) + + player.skills.addExperience(Skills.COOKING,when(fish){ + 11328,11330 -> 10.0 + 11332 -> 15.0 + else -> 0.0 + }) + + return true + } +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/barbtraining/fishing/KnifeWithFish.kt b/Server/src/main/java/Server/plugin/barbtraining/fishing/KnifeWithFish.kt new file mode 100644 index 000000000..917942a35 --- /dev/null +++ b/Server/src/main/java/Server/plugin/barbtraining/fishing/KnifeWithFish.kt @@ -0,0 +1,26 @@ +package plugin.barbtraining.fishing + +import core.game.interaction.NodeUsageEvent +import core.game.interaction.UseWithHandler +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.Items + +@Initializable +/** + * Handles using a knife with barbarian fishing fish + * @author Ceikry + */ +class KnifeWithFish : UseWithHandler(11328,11330,11332){ + override fun handle(event: NodeUsageEvent?): Boolean { + event?.player ?: return false + event.player.pulseManager.run(FishCuttingPulse(event.player,event.usedItem.id)) + return true + } + + override fun newInstance(arg: Any?): Plugin { + addHandler(Items.KNIFE_946, ITEM_TYPE,this) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/barbtraining/fishing/OptionHandlers.kt b/Server/src/main/java/Server/plugin/barbtraining/fishing/OptionHandlers.kt new file mode 100644 index 000000000..d9fde3385 --- /dev/null +++ b/Server/src/main/java/Server/plugin/barbtraining/fishing/OptionHandlers.kt @@ -0,0 +1,50 @@ +package plugin.barbtraining.fishing + +import core.cache.def.impl.NPCDefinition +import core.cache.def.impl.ObjectDefinition +import core.game.interaction.OptionHandler +import core.game.node.Node +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.plugin.Initializable +import core.plugin.Plugin + +@Initializable +/** + * Option handlers for barbarian fishing. + * @author Ceikry + */ +class OptionHandlers : OptionHandler(){ + override fun handle(player: Player?, node: Node?, option: String?): Boolean { + when(node?.id){ + 25268 -> handleSearch(player).also { return true } + 1176 -> handleFish(player).also{return true} + } + return false + } + + fun handleFish(player: Player?){ + player?.pulseManager?.run(BarbFishingPulse(player)) + player?.sendMessage("You attempt to catch a fish...") + } + + fun handleSearch(player: Player?){ + if(player?.getAttribute("barbtraining:fishing",false) == true){ + if(!player.inventory.containsItem(Item(11323))){ + player.inventory.add(Item(11323)) + player.sendMessage("Under the bed you find a fishing rod.") + } else { + player.sendMessage("You find nothing under the bed") + } + } else { + player?.sendMessage("Maybe I should speak to Otto before looking under his bed.") + } + } + + override fun newInstance(arg: Any?): Plugin { + ObjectDefinition.forId(25268).handlers.put("option:search",this) + NPCDefinition.forId(1176).handlers.put("option:fish",this) + return this + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/barbtraining/fishing/SpotManager.kt b/Server/src/main/java/Server/plugin/barbtraining/fishing/SpotManager.kt new file mode 100644 index 000000000..1b68f878d --- /dev/null +++ b/Server/src/main/java/Server/plugin/barbtraining/fishing/SpotManager.kt @@ -0,0 +1,82 @@ +package plugin.barbtraining.fishing + +import core.game.node.entity.npc.NPC +import core.game.world.map.Location +import core.plugin.Initializable +import core.plugin.Plugin +import core.tools.RandomFunction +import core.plugin.CorePluginTypes.ManagerPlugin +import core.plugin.CorePluginTypes.Managers +import plugin.barbtraining.fishing.SpotManager.Companion.locations +import plugin.barbtraining.fishing.SpotManager.Companion.usedLocations + +@Initializable +/** + * Manages fishing spot spawning and relocation + * @author Ceikry + */ +class SpotManager : ManagerPlugin() { + var ticks = 0 + val spots = ArrayList() + + companion object{ + val usedLocations = arrayListOf() + val locations = listOf( + Location.create(2506, 3494, 0), + Location.create(2504, 3497, 0), + Location.create(2504, 3497, 0), + Location.create(2500, 3506, 0), + Location.create(2500, 3509, 0), + Location.create(2500, 3512, 0), + Location.create(2504, 3516, 0) + ) + } + + override fun tick() { + if(ticks % 50 == 0){ + usedLocations.clear() + for(spot in spots) usedLocations.add(spot.loc ?: Location(0,0,0)) + } + } + + override fun newInstance(arg: Any?): Plugin { + for(i in 0 until 5){ + spots.add(BarbFishingSpot(getNewLoc(), getNewTTL()).also { it.init() }) + } + Managers.register(this) + return this + } +} + +fun getNewTTL(): Int{ + return RandomFunction.random(400,2000) +} + +fun getNewLoc(): Location { + var loc = locations.random() + while(usedLocations.contains(loc)) loc = locations.random() + usedLocations.add(loc) + return loc +} + +class BarbFishingSpot(var loc: Location? = null, var ttl: Int) : NPC(1176){ + init { + location = loc + } + val locations = listOf( + Location.create(2506, 3494, 0), + Location.create(2504, 3497, 0), + Location.create(2504, 3497, 0), + Location.create(2500, 3506, 0), + Location.create(2500, 3509, 0), + Location.create(2500, 3512, 0), + Location.create(2504, 3516, 0) + ) + override fun handleTickActions() { + if(location != loc) properties.teleportLocation = loc.also { ttl = getNewTTL() } + if(ttl-- <= 0){ + loc = getNewLoc() + } + } +} + diff --git a/Server/src/main/java/Server/plugin/creditshop/CreditShop.kt b/Server/src/main/java/Server/plugin/creditshop/CreditShop.kt new file mode 100644 index 000000000..351c535db --- /dev/null +++ b/Server/src/main/java/Server/plugin/creditshop/CreditShop.kt @@ -0,0 +1,102 @@ +package plugin.creditshop + +import core.cache.def.impl.ItemDefinition +import core.game.content.global.shop.Shop +import core.game.content.global.shop.ShopViewer +import core.game.node.entity.player.Player +import core.game.node.item.Item +import core.tools.Items + + +/** + * Shop that sells various things for credits, which can be obtained by voting or contributing code + * @author Ceikry + */ +class CreditShop : Shop("Credit Shop <3", listOf( + Item(Items.CHRISTMAS_CRACKER_962,100), + Item(Items.RED_PARTYHAT_1038,100), + Item(Items.BLUE_PARTYHAT_1042, 100), + Item(Items.GREEN_PARTYHAT_1044, 100), + Item(Items.YELLOW_PARTYHAT_1040, 100), + Item(Items.PURPLE_PARTYHAT_1046,100), + Item(Items.WHITE_PARTYHAT_1048, 100), + Item(Items.RED_HWEEN_MASK_1057,100), + Item(Items.BLUE_HWEEN_MASK_1055, 100), + Item(Items.GREEN_HWEEN_MASK_1053,100), + Item(Items.SANTA_HAT_1050, 100), + Item(Items.SCYTHE_10735,100), + Item(Items.EASTER_RING_7927,100), + Item(Items.BASKET_OF_EGGS_4565,100) +).toTypedArray(),false){ + val prices = hashMapOf( + Items.SANTA_HAT_1050 to 35, + Items.CHRISTMAS_CRACKER_962 to 40, + Items.RED_PARTYHAT_1038 to 50, + Items.BLUE_PARTYHAT_1042 to 50, + Items.GREEN_PARTYHAT_1044 to 50, + Items.YELLOW_PARTYHAT_1040 to 50, + Items.PURPLE_PARTYHAT_1046 to 50, + Items.WHITE_PARTYHAT_1048 to 50, + Items.RED_HWEEN_MASK_1057 to 60, + Items.BLUE_HWEEN_MASK_1055 to 60, + Items.GREEN_HWEEN_MASK_1053 to 60, + 13887 to 100, + 13893 to 100, + 13899 to 100, + 13858 to 100, + 13861 to 100, + 13864 to 100, + 13867 to 100, + 10735 to 200, + 14643 to 125, + Items.EASTER_RING_7927 to 100, + Items.BASKET_OF_EGGS_4565 to 100 + ) + + init { + isPointShop = true + } + + override fun open(player: Player?) { + player ?: return + super.open(player) + val amt = player.details.credits + player.sendMessage("You have $amt credits to spend.") + } + + + override fun getBuyPrice(item: Item?, player: Player?): Int { + return prices.get(item?.id) ?: Integer.MAX_VALUE.also { player?.sendMessage("This item's price hasn't been defined. Please contact us.") } + } + + override fun getPoints(player: Player?): Int { + player ?: return 0 + return player.details.credits + } + + override fun canSell(player: Player?, item: Item?, def: ItemDefinition?): Boolean { + player ?: return false + player.sendMessage("This shop cannot be sold to.") + return false + } + + override fun getPointsName(): String { + return "credit" + } + + override fun value(player: Player?, viewer: ShopViewer?, item: Item?, sell: Boolean) { + item ?: return + player ?: return + var multiple: Boolean + if(sell){ + player.sendMessage("This shop cannot be sold to.").also { return } + } + player.sendMessage("This item costs " + (prices[item.id] ?: Integer.MAX_VALUE).also { multiple = it > 1 } + " " + pointsName + if(multiple) "s." else ".") + } + + override fun decrementPoints(player: Player?, decrement: Int) { + player ?: return + player.details.credits -= decrement + } + +} \ No newline at end of file diff --git a/Server/src/main/java/Server/plugin/drops/DropPlugin.java b/Server/src/main/java/Server/plugin/drops/DropPlugin.java new file mode 100644 index 000000000..0ec6df372 --- /dev/null +++ b/Server/src/main/java/Server/plugin/drops/DropPlugin.java @@ -0,0 +1,26 @@ +package plugin.drops; + +import core.game.node.item.Item; +import core.plugin.Plugin; + +import java.util.List; + +public abstract class DropPlugin implements Plugin { + + //the list of NPCs this plugin can effect, if left blank it effects all NPCs. + public int[] accepted_npcs; + + //allows a super constructor to define the npcs + public DropPlugin(int... accepted_npcs){ + this.accepted_npcs = accepted_npcs; + } + + //necessary for the plugin framework, doesnt need to be changed ever. + @Override + public Object fireEvent(String identifier, Object... args) { + return null; + } + + //defines an abstract method all drop plugins must implement + public abstract List handle(); +} diff --git a/Server/src/main/java/Server/plugin/drops/DropPlugins.java b/Server/src/main/java/Server/plugin/drops/DropPlugins.java new file mode 100644 index 000000000..ba0eb25bc --- /dev/null +++ b/Server/src/main/java/Server/plugin/drops/DropPlugins.java @@ -0,0 +1,42 @@ +package plugin.drops; + +import core.game.node.item.Item; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +public class DropPlugins { + public static HashMap> plugins = new HashMap<>(); + public static List globalPlugins = new ArrayList<>(); + public static List getDrops(int npc_id){ + List drops = new ArrayList<>(); + List toHandle = plugins.get(npc_id); + if(toHandle != null) { + for (DropPlugin plugin : toHandle) { + drops.addAll(plugin.handle()); + } + } + if(!globalPlugins.isEmpty()) { + for (DropPlugin plugin : globalPlugins) { + drops.addAll(plugin.handle()); + } + } + return drops; + } + + public static void register(DropPlugin plugin){ + if(plugin.accepted_npcs.length > 0) { + Arrays.stream(plugin.accepted_npcs).forEach(id -> { + if (plugins.get(id) == null) { + List newlist = new ArrayList<>(); + plugins.putIfAbsent(id, newlist); + } + plugins.get(id).add(plugin); + }); + } else { + globalPlugins.add(plugin); + } + } +} diff --git a/Server/src/main/java/Server/plugin/drops/mystery_box/MysteryBoxDropper.java b/Server/src/main/java/Server/plugin/drops/mystery_box/MysteryBoxDropper.java new file mode 100644 index 000000000..74e81db85 --- /dev/null +++ b/Server/src/main/java/Server/plugin/drops/mystery_box/MysteryBoxDropper.java @@ -0,0 +1,45 @@ +package plugin.drops.mystery_box; + +import core.game.node.item.Item; +import core.plugin.Initializable; +import core.plugin.Plugin; +import core.plugin.PluginManifest; +import core.tools.Items; +import core.tools.RandomFunction; +import plugin.drops.DropPlugin; +import plugin.drops.DropPlugins; + +import java.util.ArrayList; +import java.util.List; + +@Initializable +@PluginManifest(name="MysteryBox") +public class MysteryBoxDropper extends DropPlugin { + + //percentage chance of it dropping, between 1 and 100. + private int chance = 15; + List drops = new ArrayList<>(); //the list of dropped items + + //standard way to initialize a drop plugin + @Override + public Plugin newInstance(Object arg) throws Throwable { + DropPlugins.register(this); + return this; + } + + //default constructor used, called when the plugin manager initializes this plugin. + //super() for a drop plugin simply means all NPCs can use this drop + public MysteryBoxDropper(){ + super(); + } + + @Override + public List handle() { + boolean willDrop = RandomFunction.random(chance) == RandomFunction.random(chance); + drops.clear(); + if(willDrop){ + drops.add(new Item(Items.MYSTERY_BOX_6199)); + } + return drops; + } +} diff --git a/Server/src/main/java/Server/plugin/drops/mystery_box/MysteryBoxPlugin.java b/Server/src/main/java/Server/plugin/drops/mystery_box/MysteryBoxPlugin.java new file mode 100644 index 000000000..d93701832 --- /dev/null +++ b/Server/src/main/java/Server/plugin/drops/mystery_box/MysteryBoxPlugin.java @@ -0,0 +1,84 @@ +package plugin.drops.mystery_box; + +import core.cache.def.impl.ItemDefinition; +import core.game.interaction.OptionHandler; +import core.game.node.Node; +import core.game.node.entity.player.Player; +import core.game.node.item.Item; +import core.game.node.item.WeightedChanceItem; +import core.plugin.Plugin; +import core.plugin.PluginManifest; +import core.tools.Items; +import core.tools.RandomFunction; +import core.plugin.Initializable; +import core.tools.StringUtils; + +/** + * Handles the mystery box item. + * @author Ceikry + */ +@Initializable +@PluginManifest(name="MysteryBox") +public final class MysteryBoxPlugin extends OptionHandler { + + /** + * The rewards recieved from a mystery box. + */ + private static final WeightedChanceItem[] REWARDS = new WeightedChanceItem[] { + + new WeightedChanceItem(Items.UNCUT_DIAMOND_1617,1,10), + new WeightedChanceItem(Items.UNCUT_RUBY_1619,1,50), + new WeightedChanceItem(Items.UNCUT_SAPPHIRE_1623,1,60), + new WeightedChanceItem(Items.UNCUT_JADE_1627,1,150), + new WeightedChanceItem(Items.UNCUT_DRAGONSTONE_1631,1,1), + new WeightedChanceItem(Items.MOLTEN_GLASS_1776,25,5), + new WeightedChanceItem(Items.UNCUT_EMERALD_1621,1,60), + new WeightedChanceItem(Items.COINS_995,25,30), + new WeightedChanceItem(Items.COINS_995,250,50), + new WeightedChanceItem(Items.COINS_995,10,80), + new WeightedChanceItem(0,1,100), + new WeightedChanceItem(Items.UNCUT_OPAL_1625,1,150), + new WeightedChanceItem(Items.VIAL_OF_WATER_228,10,25), + new WeightedChanceItem(Items.VARROCK_TELEPORT_8007,10,5), + new WeightedChanceItem(Items.FALADOR_TELEPORT_8009,10,5) + }; + + @Override + public Plugin newInstance(Object arg) throws Throwable { + ItemDefinition.forId(6199).getHandlers().put("option:open", this); + return this; + } + + @Override + public boolean handle(Player player, Node node, String option) { + final Item item = RandomFunction.rollWeightedChanceTable(REWARDS); + String name = item.getName().toLowerCase(); + if(item.getId() == 0){ + name = "nothing"; + } + final Item box = (Item) node; + if (player.getInventory().remove(box, box.getSlot(), true)) { + String message; + player.lock(1); + if(name.equals("notithing")){ + message = "Inside the box you find nothing :("; + } else { + if(item.getAmount() > 1 && item.getId() != 995){ + name = name + "s"; + } + message = "Inside the box you find " + (item.getAmount() > 1 ? "some" : (StringUtils.isPlusN(name) ? "an" : "a")) + " " + name + "!"; + } + player.sendMessage(message); + if(item.getId() != 0) + player.getInventory().add(item); + } + return true; + } + + + @Override + public boolean isWalk() { + return false; + } + +} diff --git a/Server/src/main/java/Server/plugin/package-info.java b/Server/src/main/java/Server/plugin/package-info.java new file mode 100644 index 000000000..546341052 --- /dev/null +++ b/Server/src/main/java/Server/plugin/package-info.java @@ -0,0 +1,6 @@ +/** + * Holds all the plugin classes. + * + * @author Emperor + */ +package plugin; \ No newline at end of file diff --git a/Server/tableformat.css b/Server/tableformat.css new file mode 100644 index 000000000..101bdb4e1 --- /dev/null +++ b/Server/tableformat.css @@ -0,0 +1,16 @@ +td { + border-right: 1px solid black; + border-bottom: 1px solid black; +} + +tr { + border-bottom: 1px solid black; +} + +th { + border:1px solid black; +} + +#id { + color: #FF0004; +} \ No newline at end of file diff --git a/Server/worldprops/default.json b/Server/worldprops/default.json new file mode 100644 index 000000000..370cfee33 --- /dev/null +++ b/Server/worldprops/default.json @@ -0,0 +1,58 @@ +{ + "name": "2009scape", + + "GameSettings": { + "debug": true, + "dev": true, + "startGui": false, + "worldID":"1", + "countryID": "0", + "activity": "2009scape classic.", + "pvpWorld": false, + "msip": "127.0.0.1", + "default_xp_rate": "5", + "allow_slayer_reroll": false, + "enable_default_clan": true, + "enable_bots": true, + "autostock_ge": true, + "allow_token_purchase": true, + "message_of_the_week_identifier": "0", + "message_of_the_week_text": "Welcome to 2009Scape!
Nowin Technicolor!" + }, + + "ServerSettings": { + "writeLogs": true, + "max_players": "2000", + "max_npcs": "32000", + "new_player_location": "2524,5002,0", + "home_location": "3222,3218,0", + "data_path": "data", + "cache_path": "./data/cache", + "store_path": "./data/store", + "save_path": "./data/players", + "configs_path": "./data/configs", + "grand_exchange_data_path": "./data/eco/", + "rare_drop_table_path": "./data/RDT.xml", + "object_parser_path": "./data/ObjectParser.xml", + "scripts_path": "scripts/", + "dialogue_scripts_path": "scripts/dialogue/", + "logs_path": "data/logs/", + "bot_data_path": "data/botdata/", + "database_name": "global", + "database_username": "root", + "database_password": "", + "database_address": "127.0.0.1", + "database_port": "3306" + }, + + "PluginToggles": { + "Trivia": false, + "RPS": false, + "Boredom": false, + "ShootingStars": true, + "MysteryBox": true, + "PKZone": false, + "ObjectParser": true, + "BlackJack": false + } +} \ No newline at end of file diff --git a/Tools/Drop Table Tool.html b/Tools/Drop Table Tool.html new file mode 100644 index 000000000..5de3bbe1d --- /dev/null +++ b/Tools/Drop Table Tool.html @@ -0,0 +1,334 @@ + + + 💀 Drop Table Tool + + + + + + + +
+
+
+

Import Files

+ +
+
+ +
+ +
+ +
+
+ +
+
+
+ drop_tables.json + YES + NO +
+
+ +
+
+ item_configs.json + YES + NO +
+
+ +
+
+ npc_configs.json + YES + NO +
+
+
+
+
+ +
+
+
+
+
+

Functions

+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+

NPCs

+ +
+
+
+
+

Items

+ +
+
+
+
+ +
+
+

Results    + View JSON +

+
{{ results }}
+
+

Table Description: {{ results.description }}

+
+ +

NPCs using this droptable: +

+

+
+
+
+ + +
+
+ + + + + + + \ No newline at end of file diff --git a/Tools/Frostys Cache Editor/.classpath b/Tools/Frostys Cache Editor/.classpath new file mode 100644 index 000000000..fb5011632 --- /dev/null +++ b/Tools/Frostys Cache Editor/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/Tools/Frostys Cache Editor/.project b/Tools/Frostys Cache Editor/.project new file mode 100644 index 000000000..a3e96d578 --- /dev/null +++ b/Tools/Frostys Cache Editor/.project @@ -0,0 +1,17 @@ + + + Frosty + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/Tools/Frostys Cache Editor/Run - genväg.lnk b/Tools/Frostys Cache Editor/Run - genväg.lnk new file mode 100644 index 000000000..18f58e0a4 Binary files /dev/null and b/Tools/Frostys Cache Editor/Run - genväg.lnk differ diff --git a/Tools/Frostys Cache Editor/Run.bat b/Tools/Frostys Cache Editor/Run.bat new file mode 100644 index 000000000..edb330c5a --- /dev/null +++ b/Tools/Frostys Cache Editor/Run.bat @@ -0,0 +1,4 @@ +@echo off +title Cache editor +java -client -Xmx512m -cp bin;lib/* com.editor.Main +pause \ No newline at end of file diff --git a/Tools/Frostys Cache Editor/bin/com/alex/io/InputStream.class b/Tools/Frostys Cache Editor/bin/com/alex/io/InputStream.class new file mode 100644 index 000000000..5c9e2ca31 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/io/InputStream.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/io/OutputStream.class b/Tools/Frostys Cache Editor/bin/com/alex/io/OutputStream.class new file mode 100644 index 000000000..dd2cbdd25 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/io/OutputStream.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/io/Stream.class b/Tools/Frostys Cache Editor/bin/com/alex/io/Stream.class new file mode 100644 index 000000000..0b9620762 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/io/Stream.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/animations/AnimationDefinitions.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/animations/AnimationDefinitions.class new file mode 100644 index 000000000..116e6c8b3 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/animations/AnimationDefinitions.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/clientscripts/ClientScript.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/clientscripts/ClientScript.class new file mode 100644 index 000000000..61e21618b Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/clientscripts/ClientScript.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/images/IndexedColorImageFile.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/images/IndexedColorImageFile.class new file mode 100644 index 000000000..cdd03941c Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/images/IndexedColorImageFile.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/images/LoaderImageArchive.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/images/LoaderImageArchive.class new file mode 100644 index 000000000..635041fff Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/images/LoaderImageArchive.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/IComponent.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/IComponent.class new file mode 100644 index 000000000..4ac45d136 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/IComponent.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/IComponentSettings.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/IComponentSettings.class new file mode 100644 index 000000000..51794cb09 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/IComponentSettings.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/Interface.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/Interface.class new file mode 100644 index 000000000..263363829 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/Interface.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/InterfaceName.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/InterfaceName.class new file mode 100644 index 000000000..eb42da363 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/interfaces/InterfaceName.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/items/ItemDefinitions.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/items/ItemDefinitions.class new file mode 100644 index 000000000..4ec1eb7f7 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/items/ItemDefinitions.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/npcs/NPCDefinitions.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/npcs/NPCDefinitions.class new file mode 100644 index 000000000..89ac4c4f9 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/npcs/NPCDefinitions.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/loaders/objects/ObjectDefinitions.class b/Tools/Frostys Cache Editor/bin/com/alex/loaders/objects/ObjectDefinitions.class new file mode 100644 index 000000000..057639d01 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/loaders/objects/ObjectDefinitions.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/store/Archive.class b/Tools/Frostys Cache Editor/bin/com/alex/store/Archive.class new file mode 100644 index 000000000..07befe6d4 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/store/Archive.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/store/ArchiveReference.class b/Tools/Frostys Cache Editor/bin/com/alex/store/ArchiveReference.class new file mode 100644 index 000000000..de19e764a Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/store/ArchiveReference.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/store/FileReference.class b/Tools/Frostys Cache Editor/bin/com/alex/store/FileReference.class new file mode 100644 index 000000000..7d410dfba Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/store/FileReference.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/store/Index.class b/Tools/Frostys Cache Editor/bin/com/alex/store/Index.class new file mode 100644 index 000000000..6498408e7 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/store/Index.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/store/MainFile.class b/Tools/Frostys Cache Editor/bin/com/alex/store/MainFile.class new file mode 100644 index 000000000..80ec48a30 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/store/MainFile.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/store/ReferenceTable.class b/Tools/Frostys Cache Editor/bin/com/alex/store/ReferenceTable.class new file mode 100644 index 000000000..34679f406 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/store/ReferenceTable.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/store/Store.class b/Tools/Frostys Cache Editor/bin/com/alex/store/Store.class new file mode 100644 index 000000000..5227f54f1 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/store/Store.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/ArchiveValidation.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/ArchiveValidation.class new file mode 100644 index 000000000..04cd212cf Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/ArchiveValidation.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CacheEditor.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CacheEditor.class new file mode 100644 index 000000000..bfc311799 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CacheEditor.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CacheEditormodels.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CacheEditormodels.class new file mode 100644 index 000000000..3c0e96a7c Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CacheEditormodels.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CheckMap.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CheckMap.class new file mode 100644 index 000000000..01d87d116 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CheckMap.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CopyCache.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CopyCache.class new file mode 100644 index 000000000..fdd1cbfc3 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/CopyCache.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/OriginalXteas.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/OriginalXteas.class new file mode 100644 index 000000000..6d065f3bf Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/OriginalXteas.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/ProtectCache.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/ProtectCache.class new file mode 100644 index 000000000..c8e34e04e Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/ProtectCache.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/RSXteas.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/RSXteas.class new file mode 100644 index 000000000..714a075e9 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/RSXteas.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/SpritesDumper.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/SpritesDumper.class new file mode 100644 index 000000000..901217007 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/SpritesDumper.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/UpdateCache.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/UpdateCache.class new file mode 100644 index 000000000..ca2e44222 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/clientCacheUpdater/UpdateCache.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$1.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$1.class new file mode 100644 index 000000000..b46768d14 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$2.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$2.class new file mode 100644 index 000000000..c051b47c2 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$3.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$3.class new file mode 100644 index 000000000..a116b7f4c Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$4.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$4.class new file mode 100644 index 000000000..ebf9d4b67 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$4.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$5.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$5.class new file mode 100644 index 000000000..ab05db9a7 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$5.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$6.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$6.class new file mode 100644 index 000000000..63033e8b7 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$6.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$7.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$7.class new file mode 100644 index 000000000..3dcf21c13 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$7.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$8.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$8.class new file mode 100644 index 000000000..5ccd6f65b Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$8.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$9.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$9.class new file mode 100644 index 000000000..d18920568 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application$9.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application.class new file mode 100644 index 000000000..6f769deb4 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/Application.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/GeneratedUkeys$1.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/GeneratedUkeys$1.class new file mode 100644 index 000000000..d458a3b14 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/GeneratedUkeys$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/GeneratedUkeys$2.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/GeneratedUkeys$2.class new file mode 100644 index 000000000..adfb9680d Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/GeneratedUkeys$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/GeneratedUkeys.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/GeneratedUkeys.class new file mode 100644 index 000000000..f70c155e4 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/GeneratedUkeys.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/ItemDefsEditor$1.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/ItemDefsEditor$1.class new file mode 100644 index 000000000..71e46fa91 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/ItemDefsEditor$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/ItemDefsEditor$2.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/ItemDefsEditor$2.class new file mode 100644 index 000000000..6ba70291b Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/ItemDefsEditor$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/ItemDefsEditor.class b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/ItemDefsEditor.class new file mode 100644 index 000000000..194c29304 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/tools/itemsDefsEditor/ItemDefsEditor.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/util/bzip2/BZip2BlockEntry.class b/Tools/Frostys Cache Editor/bin/com/alex/util/bzip2/BZip2BlockEntry.class new file mode 100644 index 000000000..aae3631d6 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/util/bzip2/BZip2BlockEntry.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/util/bzip2/BZip2Compressor.class b/Tools/Frostys Cache Editor/bin/com/alex/util/bzip2/BZip2Compressor.class new file mode 100644 index 000000000..1c63dbc0a Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/util/bzip2/BZip2Compressor.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/util/bzip2/BZip2Decompressor.class b/Tools/Frostys Cache Editor/bin/com/alex/util/bzip2/BZip2Decompressor.class new file mode 100644 index 000000000..715d54752 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/util/bzip2/BZip2Decompressor.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/util/crc32/CRC32HGenerator.class b/Tools/Frostys Cache Editor/bin/com/alex/util/crc32/CRC32HGenerator.class new file mode 100644 index 000000000..1f0e80865 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/util/crc32/CRC32HGenerator.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/util/gzip/GZipCompressor.class b/Tools/Frostys Cache Editor/bin/com/alex/util/gzip/GZipCompressor.class new file mode 100644 index 000000000..ae94a3777 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/util/gzip/GZipCompressor.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/util/gzip/GZipDecompressor.class b/Tools/Frostys Cache Editor/bin/com/alex/util/gzip/GZipDecompressor.class new file mode 100644 index 000000000..cb85dcb04 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/util/gzip/GZipDecompressor.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/util/whirlpool/Whirlpool.class b/Tools/Frostys Cache Editor/bin/com/alex/util/whirlpool/Whirlpool.class new file mode 100644 index 000000000..4b4f3464c Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/util/whirlpool/Whirlpool.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/utils/Constants.class b/Tools/Frostys Cache Editor/bin/com/alex/utils/Constants.class new file mode 100644 index 000000000..9c9699718 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/utils/Constants.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/alex/utils/Utils.class b/Tools/Frostys Cache Editor/bin/com/alex/utils/Utils.class new file mode 100644 index 000000000..daba6c7e6 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/alex/utils/Utils.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/Console$1.class b/Tools/Frostys Cache Editor/bin/com/editor/Console$1.class new file mode 100644 index 000000000..5b0a0e58d Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/Console$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/Console$2.class b/Tools/Frostys Cache Editor/bin/com/editor/Console$2.class new file mode 100644 index 000000000..1c37fc975 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/Console$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/Console$3.class b/Tools/Frostys Cache Editor/bin/com/editor/Console$3.class new file mode 100644 index 000000000..43592d29e Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/Console$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/Console$4.class b/Tools/Frostys Cache Editor/bin/com/editor/Console$4.class new file mode 100644 index 000000000..addebd89d Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/Console$4.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/Console$5.class b/Tools/Frostys Cache Editor/bin/com/editor/Console$5.class new file mode 100644 index 000000000..2f9944c6c Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/Console$5.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/Console.class b/Tools/Frostys Cache Editor/bin/com/editor/Console.class new file mode 100644 index 000000000..236d1e4d3 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/Console.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/Main.class b/Tools/Frostys Cache Editor/bin/com/editor/Main.class new file mode 100644 index 000000000..a3fbf2de7 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/Main.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$1.class b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$1.class new file mode 100644 index 000000000..1f593d752 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$2.class b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$2.class new file mode 100644 index 000000000..ee3511602 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$3.class b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$3.class new file mode 100644 index 000000000..8a1046c3d Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$4.class b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$4.class new file mode 100644 index 000000000..c6b4ea64b Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$4.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$5.class b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$5.class new file mode 100644 index 000000000..642ab9351 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$5.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$6.class b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$6.class new file mode 100644 index 000000000..87dcfd1ee Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$6.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$7.class b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$7.class new file mode 100644 index 000000000..ad02a8692 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$7.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$8.class b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$8.class new file mode 100644 index 000000000..afa157a15 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection$8.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection.class b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection.class new file mode 100644 index 000000000..48757ebed Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/ToolSelection.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/Utils.class b/Tools/Frostys Cache Editor/bin/com/editor/Utils.class new file mode 100644 index 000000000..30527e65e Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/Utils.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemDefDump.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemDefDump.class new file mode 100644 index 000000000..65641dd6e Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemDefDump.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$1.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$1.class new file mode 100644 index 000000000..7c4b2a128 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$2.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$2.class new file mode 100644 index 000000000..cc8e12d66 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$3.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$3.class new file mode 100644 index 000000000..203972191 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$4.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$4.class new file mode 100644 index 000000000..b943de850 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$4.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$5.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$5.class new file mode 100644 index 000000000..37a07e7d4 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor$5.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor.class new file mode 100644 index 000000000..2d9c111ba Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemEditor.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemListDumper.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemListDumper.class new file mode 100644 index 000000000..5f9f0426e Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemListDumper.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$1.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$1.class new file mode 100644 index 000000000..e320bc385 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$2.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$2.class new file mode 100644 index 000000000..05e281bfd Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$3.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$3.class new file mode 100644 index 000000000..f3fbe156b Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$4.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$4.class new file mode 100644 index 000000000..a607976db Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$4.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$5.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$5.class new file mode 100644 index 000000000..4730b3a85 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$5.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$6.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$6.class new file mode 100644 index 000000000..5577ae14e Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$6.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$7.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$7.class new file mode 100644 index 000000000..be45e7d0d Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$7.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$8.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$8.class new file mode 100644 index 000000000..4f76d214a Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$8.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$9.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$9.class new file mode 100644 index 000000000..bd50dc077 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection$9.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection.class b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection.class new file mode 100644 index 000000000..5b9e52b6c Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/item/ItemSelection.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/ModelDumper.class b/Tools/Frostys Cache Editor/bin/com/editor/model/ModelDumper.class new file mode 100644 index 000000000..6b4292d94 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/ModelDumper.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$1.class b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$1.class new file mode 100644 index 000000000..e66c4a771 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$2.class b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$2.class new file mode 100644 index 000000000..a3bdd23ef Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$3.class b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$3.class new file mode 100644 index 000000000..b0dfd8afc Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$4.class b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$4.class new file mode 100644 index 000000000..7955c7d2f Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker$4.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker.class b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker.class new file mode 100644 index 000000000..005f46603 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/MultiModelPacker.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper$1.class b/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper$1.class new file mode 100644 index 000000000..3f953c19f Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper$2.class b/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper$2.class new file mode 100644 index 000000000..6be295316 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper$3.class b/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper$3.class new file mode 100644 index 000000000..e5f48e939 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper.class b/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper.class new file mode 100644 index 000000000..577b9da97 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/model/UniModelDumper.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCDefDump.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCDefDump.class new file mode 100644 index 000000000..539231f75 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCDefDump.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$1.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$1.class new file mode 100644 index 000000000..498cdf3e1 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$2.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$2.class new file mode 100644 index 000000000..acf0dcb16 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$3.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$3.class new file mode 100644 index 000000000..44b4a7da1 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$4.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$4.class new file mode 100644 index 000000000..c1b43a792 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$4.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$5.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$5.class new file mode 100644 index 000000000..9fe6b2b01 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$5.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$6.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$6.class new file mode 100644 index 000000000..8b0178a59 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor$6.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor.class new file mode 100644 index 000000000..5c918cf52 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCEditor.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCListDumper.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCListDumper.class new file mode 100644 index 000000000..183063aee Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCListDumper.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$1.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$1.class new file mode 100644 index 000000000..6cbfefdf2 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$2.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$2.class new file mode 100644 index 000000000..e06067314 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$3.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$3.class new file mode 100644 index 000000000..afa5d863a Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$4.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$4.class new file mode 100644 index 000000000..c57d42dd7 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$4.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$5.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$5.class new file mode 100644 index 000000000..835978347 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$5.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$6.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$6.class new file mode 100644 index 000000000..c6532f8b4 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$6.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$7.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$7.class new file mode 100644 index 000000000..50e5a059b Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$7.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$8.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$8.class new file mode 100644 index 000000000..1e56f0a62 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$8.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$9.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$9.class new file mode 100644 index 000000000..15af0762c Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection$9.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection.class b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection.class new file mode 100644 index 000000000..413be842e Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/npc/NPCSelection.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor$1.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor$1.class new file mode 100644 index 000000000..b87ac78c9 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor$2.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor$2.class new file mode 100644 index 000000000..62d356813 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor$3.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor$3.class new file mode 100644 index 000000000..e4892599f Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor.class new file mode 100644 index 000000000..3fbd58ff6 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectEditor.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$1.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$1.class new file mode 100644 index 000000000..6f65b25f0 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$1.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$2.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$2.class new file mode 100644 index 000000000..e575e1d91 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$2.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$3.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$3.class new file mode 100644 index 000000000..0e319f224 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$3.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$4.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$4.class new file mode 100644 index 000000000..9d686ad62 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$4.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$5.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$5.class new file mode 100644 index 000000000..28d2e894c Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$5.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$6.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$6.class new file mode 100644 index 000000000..832e3b5eb Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$6.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$7.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$7.class new file mode 100644 index 000000000..1596f81a7 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$7.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$8.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$8.class new file mode 100644 index 000000000..9ceb088b5 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$8.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$9.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$9.class new file mode 100644 index 000000000..4fea2caa0 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection$9.class differ diff --git a/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection.class b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection.class new file mode 100644 index 000000000..1d5dab7e6 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/com/editor/object/ObjectSelection.class differ diff --git a/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/BZip2Constants.class b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/BZip2Constants.class new file mode 100644 index 000000000..c97e85333 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/BZip2Constants.class differ diff --git a/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CBZip2OutputStream$StackElem.class b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CBZip2OutputStream$StackElem.class new file mode 100644 index 000000000..012546fb9 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CBZip2OutputStream$StackElem.class differ diff --git a/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CBZip2OutputStream$SyntheticClass_1.class b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CBZip2OutputStream$SyntheticClass_1.class new file mode 100644 index 000000000..56aab00c3 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CBZip2OutputStream$SyntheticClass_1.class differ diff --git a/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CBZip2OutputStream.class b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CBZip2OutputStream.class new file mode 100644 index 000000000..73c7e0de0 Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CBZip2OutputStream.class differ diff --git a/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CRC.class b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CRC.class new file mode 100644 index 000000000..746dbbe3c Binary files /dev/null and b/Tools/Frostys Cache Editor/bin/org/apache/tools/bzip2/CRC.class differ diff --git a/Tools/Frostys Cache Editor/clientscripts.txt b/Tools/Frostys Cache Editor/clientscripts.txt new file mode 100644 index 000000000..b7016ab58 --- /dev/null +++ b/Tools/Frostys Cache Editor/clientscripts.txt @@ -0,0 +1,71 @@ +644, 1629 - Longsword Render Animation Id +644,Integer - Render Animation Id +687, 1 enable spec bar +687, 0 disable spec bar +686, 1 staff combat styles +686, 6 scimitar/longsword combat styles +686, 7 two-handed sword combat styles +686, 10 warhammer combat styles +686, 11 whip combat styles +686, 16 shortbow/longbow combat syles +686, 17 crossbow combat styles + +749, (levelId) +750, (level required) + +861,Integer - Quest Id Requirement + + + + +0,Integer - Stab attack bonus +1,Integer - Slash attack bonus +2,Integer - Crush attack bonus +3,Integer - Magic attack bonus +4,Integer - Range attack bonus +5,Integer - Stab defense bonus +6,Integer - Slash defense bonus +7,Integer - Crush defense bonus +8,Integer - Magic defense bonus +9,Integer - Range defense bonus + +11,Integer - Prayer bonus + +14,Integer - Attack speed + +23,Integer - Ranged level requirement ? ( 20<- /40) + +277,Integer - Maxed skill requirement + +417,Integer - Summoning defense bonus + +528,String - Equipment tab Option (ActionButtons2) +529,String - Equipment tab Option (ActionButtons3) +530,String - Equipment tab Option (ActionButtons4) +531,String - Equipment tab Option (ActionButtons5) + +641,Integer - Melee Strength bonus +642,Integer - Magic Strength bonus +643,Integer - Ranged Strength bonus +644,Integer - Render Animation Id + +685,Integer - Magic damage +686,Integer - Attack Styles Tab +687,Integer - Special bar (1) + +749,Integer - Skill Id Requirment +750,Integer - Skill Level Requirment +751,Integer - Skill Id Requirment +752,Integer - Skill Level Requirment +753,Integer - Skill Id Requirment +754,Integer - Skill Level Requirment +755,Integer - Skill Id Requirment +756,Integer - Skill Level Requirment +757,Integer - Skill Id Requirment +758,Integer - Skill Level Requirment + +861,Integer - Quest Id Requirement + +967,Integer - Absorb melee bonus +968,Integer - Absorb range bonus +969,Integer - Absorb magic bonus \ No newline at end of file diff --git a/Tools/Frostys Cache Editor/models.txt b/Tools/Frostys Cache Editor/models.txt new file mode 100644 index 000000000..e69de29bb diff --git a/Tools/Frostys Cache Editor/nullmain_file_cache.dat2 b/Tools/Frostys Cache Editor/nullmain_file_cache.dat2 new file mode 100644 index 000000000..e69de29bb diff --git a/Tools/Frostys Cache Editor/nullmain_file_cache.idx255 b/Tools/Frostys Cache Editor/nullmain_file_cache.idx255 new file mode 100644 index 000000000..e69de29bb diff --git a/Tools/Frostys Cache Editor/src/com/alex/io/InputStream.java b/Tools/Frostys Cache Editor/src/com/alex/io/InputStream.java new file mode 100644 index 000000000..a188d6ce4 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/io/InputStream.java @@ -0,0 +1,257 @@ +package com.alex.io; + +import com.alex.io.Stream; + +public final class InputStream extends Stream { + private static final int[] BIT_MASK = new int[]{0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, '\uffff', 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215, 33554431, 67108863, 134217727, 268435455, 536870911, 1073741823, Integer.MAX_VALUE, -1}; + + public void initBitAccess() { + this.bitPosition = this.offset * 8; + } + + public void finishBitAccess() { + this.offset = (7 + this.bitPosition) / 8; + } + + public int readBits(int bitOffset) { + int bytePos = this.bitPosition >> 1779819011; + int i_8_ = -(7 & this.bitPosition) + 8; + this.bitPosition += bitOffset; + + int value; + for(value = 0; ~bitOffset < ~i_8_; i_8_ = 8) { + value += (BIT_MASK[i_8_] & this.buffer[bytePos++]) << -i_8_ + bitOffset; + bitOffset -= i_8_; + } + + if(~i_8_ == ~bitOffset) { + value += this.buffer[bytePos] & BIT_MASK[i_8_]; + } else { + value += this.buffer[bytePos] >> -bitOffset + i_8_ & BIT_MASK[bitOffset]; + } + + return value; + } + + public InputStream(int capacity) { + this.buffer = new byte[capacity]; + } + + public InputStream(byte[] buffer) { + this.buffer = buffer; + this.length = buffer.length; + } + + public void checkCapacity(int length) { + if(this.offset + length >= this.buffer.length) { + byte[] newBuffer = new byte[(this.offset + length) * 2]; + System.arraycopy(this.buffer, 0, newBuffer, 0, this.buffer.length); + this.buffer = newBuffer; + } + + } + + public void skip(int length) { + this.offset += length; + } + + public void setLength(int length) { + this.length = length; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + public int getRemaining() { + return this.offset < this.length?this.length - this.offset:0; + } + + public void addBytes(byte[] b, int offset, int length) { + this.checkCapacity(length - offset); + System.arraycopy(b, offset, this.buffer, this.offset, length); + this.length += length - offset; + } + + public int readPacket() { + return this.readUnsignedByte(); + } + + public int readByte() { + return this.getRemaining() > 0?this.buffer[this.offset++]:0; + } + + public void readBytes(byte[] buffer, int off, int len) { + for(int k = off; k < len + off; ++k) { + buffer[k] = (byte)this.readByte(); + } + + } + + public void readBytes(byte[] buffer) { + this.readBytes(buffer, 0, buffer.length); + } + + public int readSmart2() { + int i = 0; + + int i_33_; + for(i_33_ = this.readUnsignedSmart(); ~i_33_ == -32768; i += 32767) { + i_33_ = this.readUnsignedSmart(); + } + + i += i_33_; + return i; + } + + public int readUnsignedByte() { + return this.readByte() & 255; + } + + public int readByte128() { + return (byte)(this.readByte() - 128); + } + + public int readByteC() { + return (byte)(-this.readByte()); + } + + public int read128Byte() { + return (byte)(128 - this.readByte()); + } + + public int readUnsignedByte128() { + return this.readUnsignedByte() - 128 & 255; + } + + public int readUnsignedByteC() { + return -this.readUnsignedByte() & 255; + } + + public int readUnsigned128Byte() { + return 128 - this.readUnsignedByte() & 255; + } + + public int readShortLE() { + int i = this.readUnsignedByte() + (this.readUnsignedByte() << 8); + if(i > 32767) { + i -= 65536; + } + + return i; + } + + public int readShort128() { + int i = (this.readUnsignedByte() << 8) + (this.readByte() - 128 & 255); + if(i > 32767) { + i -= 65536; + } + + return i; + } + + public int readShortLE128() { + int i = (this.readByte() - 128 & 255) + (this.readUnsignedByte() << 8); + if(i > 32767) { + i -= 65536; + } + + return i; + } + + public int read128ShortLE() { + int i = (128 - this.readByte() & 255) + (this.readUnsignedByte() << 8); + if(i > 32767) { + i -= 65536; + } + + return i; + } + + public int readShort() { + int i = (this.readUnsignedByte() << 8) + this.readUnsignedByte(); + if(i > 32767) { + i -= 65536; + } + + return i; + } + + public int readUnsignedShortLE() { + return this.readUnsignedByte() + (this.readUnsignedByte() << 8); + } + + public int readUnsignedShort() { + return (this.readUnsignedByte() << 8) + this.readUnsignedByte(); + } + + public int readUnsignedShort128() { + return (this.readUnsignedByte() << 8) + (this.readByte() - 128 & 255); + } + + public int readUnsignedShortLE128() { + return (this.readByte() - 128 & 255) + (this.readUnsignedByte() << 8); + } + + public int readInt() { + return (this.readUnsignedByte() << 24) + (this.readUnsignedByte() << 16) + (this.readUnsignedByte() << 8) + this.readUnsignedByte(); + } + + public int read24BitInt() { + return (this.readUnsignedByte() << 16) + (this.readUnsignedByte() << 8) + this.readUnsignedByte(); + } + + public int readIntV1() { + return (this.readUnsignedByte() << 8) + this.readUnsignedByte() + (this.readUnsignedByte() << 24) + (this.readUnsignedByte() << 16); + } + + public int readIntV2() { + return (this.readUnsignedByte() << 16) + (this.readUnsignedByte() << 24) + this.readUnsignedByte() + (this.readUnsignedByte() << 8); + } + + public int readIntLE() { + return this.readUnsignedByte() + (this.readUnsignedByte() << 8) + (this.readUnsignedByte() << 16) + (this.readUnsignedByte() << 24); + } + + public long readLong() { + long l = (long)this.readInt() & 4294967295L; + long l1 = (long)this.readInt() & 4294967295L; + return (l << 32) + l1; + } + + public String readString() { + String s; + int b; + for(s = ""; (b = this.readByte()) != 0; s = s + (char)b) { + ; + } + + return s; + } + + public String readJagString() { + this.readByte(); + + String s; + int b; + for(s = ""; (b = this.readByte()) != 0; s = s + (char)b) { + ; + } + + return s; + } + + public int readBigSmart() { + if(~this.buffer[this.offset] <= -1) { + int value = this.readUnsignedShort(); + return value == 32767?-1:value; + } else { + return this.readInt() & Integer.MAX_VALUE; + } + } + + public int readUnsignedSmart() { + int i = 255 & this.buffer[this.offset]; + return i >= 128?-32768 + this.readUnsignedShort():this.readUnsignedByte(); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/io/OutputStream.java b/Tools/Frostys Cache Editor/src/com/alex/io/OutputStream.java new file mode 100644 index 000000000..aeaf63809 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/io/OutputStream.java @@ -0,0 +1,331 @@ +package com.alex.io; + +import com.alex.io.Stream; + +import java.math.BigInteger; + +public final class OutputStream extends Stream { + private static final int[] BIT_MASK = new int[32]; + private int opcodeStart = 0; + + static { + for(int i = 0; i < 32; ++i) { + BIT_MASK[i] = (1 << i) - 1; + } + + } + + public OutputStream(int capacity) { + this.setBuffer(new byte[capacity]); + } + + public OutputStream() { + this.setBuffer(new byte[16]); + } + + public OutputStream(byte[] buffer) { + this.setBuffer(buffer); + this.offset = buffer.length; + this.length = buffer.length; + } + + public OutputStream(int[] buffer) { + this.setBuffer(new byte[buffer.length]); + int[] arr$ = buffer; + int len$ = buffer.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int value = arr$[i$]; + this.writeByte(value); + } + + } + + public void checkCapacityPosition(int position) { + if(position >= this.getBuffer().length) { + byte[] newBuffer = new byte[position + 16]; + System.arraycopy(this.getBuffer(), 0, newBuffer, 0, this.getBuffer().length); + this.setBuffer(newBuffer); + } + + } + + public void skip(int length) { + this.setOffset(this.getOffset() + length); + } + + public void setOffset(int offset) { + this.offset = offset; + } + + public void writeBytes(byte[] b, int offset, int length) { + this.checkCapacityPosition(this.getOffset() + length - offset); + System.arraycopy(b, offset, this.getBuffer(), this.getOffset(), length); + this.setOffset(this.getOffset() + (length - offset)); + } + + public void writeBytes(byte[] b) { + byte offset = 0; + int length = b.length; + this.checkCapacityPosition(this.getOffset() + length - offset); + System.arraycopy(b, offset, this.getBuffer(), this.getOffset(), length); + this.setOffset(this.getOffset() + (length - offset)); + } + + public void addBytes128(byte[] data, int offset, int len) { + for(int k = offset; k < len; ++k) { + this.writeByte((byte)(data[k] + 128)); + } + + } + + public void addBytesS(byte[] data, int offset, int len) { + for(int k = offset; k < len; ++k) { + this.writeByte((byte)(-128 + data[k])); + } + + } + + public void addBytes_Reverse(byte[] data, int offset, int len) { + for(int i = len - 1; i >= 0; --i) { + this.writeByte(data[i]); + } + + } + + public void addBytes_Reverse128(byte[] data, int offset, int len) { + for(int i = len - 1; i >= 0; --i) { + this.writeByte((byte)(data[i] + 128)); + } + + } + + public void writeByte(int i) { + this.writeByte(i, this.offset++); + } + + public void writeNegativeByte(int i) { + this.writeByte(-i, this.offset++); + } + + public void writeByte(int i, int position) { + this.checkCapacityPosition(position); + this.getBuffer()[position] = (byte)i; + } + + public void writeByte128(int i) { + this.writeByte(i + 128); + } + + public void writeByteC(int i) { + this.writeByte(-i); + } + + public void write3Byte(int i) { + this.writeByte(i >> 16); + this.writeByte(i >> 8); + this.writeByte(i); + } + + public void write128Byte(int i) { + this.writeByte(128 - i); + } + + public void writeShortLE128(int i) { + this.writeByte(i + 128); + this.writeByte(i >> 8); + } + + public void writeShort128(int i) { + this.writeByte(i >> 8); + this.writeByte(i + 128); + } + + public void writeBigSmart(int i) { + //if(i >= 32767 && i >= 0) { + if(i >= 52767 && i >= 0) { + this.writeInt(i - Integer.MAX_VALUE - 1); + } else { + this.writeShort(i >= 0?i:52767); + //this.writeShort(i >= 0?i:32767); + } + + } + + public void writeSmart(int i) { + if(i >= 128) { + this.writeShort(i); + } else { + this.writeByte(i); + } + + } + + public void writeShort(int i) { + this.writeByte(i >> 8); + this.writeByte(i); + } + + public void writeShortLE(int i) { + this.writeByte(i); + this.writeByte(i >> 8); + } + + public void write24BitInt(int i) { + this.writeByte(i >> 16); + this.writeByte(i >> 8); + this.writeByte(i); + } + + public void writeInt(int i) { + this.writeByte(i >> 24); + this.writeByte(i >> 16); + this.writeByte(i >> 8); + this.writeByte(i); + } + + public void writeIntV1(int i) { + this.writeByte(i >> 8); + this.writeByte(i); + this.writeByte(i >> 24); + this.writeByte(i >> 16); + } + + public void writeIntV2(int i) { + this.writeByte(i >> 16); + this.writeByte(i >> 24); + this.writeByte(i); + this.writeByte(i >> 8); + } + + public void writeIntLE(int i) { + this.writeByte(i); + this.writeByte(i >> 8); + this.writeByte(i >> 16); + this.writeByte(i >> 24); + } + + public void writeLong(long l) { + this.writeByte((int)(l >> 56)); + this.writeByte((int)(l >> 48)); + this.writeByte((int)(l >> 40)); + this.writeByte((int)(l >> 32)); + this.writeByte((int)(l >> 24)); + this.writeByte((int)(l >> 16)); + this.writeByte((int)(l >> 8)); + this.writeByte((int)l); + } + + public void writePSmarts(int i) { + if(i < 128) { + this.writeByte(i); + } else if (i < 32768) { + this.writeShort(32768 + i); + }else { + System.out.println("Error psmarts out of range:"); + } + + } + + public void writeString(String s) { + this.checkCapacityPosition(this.getOffset() + s.length() + 1); + System.arraycopy(s.getBytes(), 0, this.getBuffer(), this.getOffset(), s.length()); + this.setOffset(this.getOffset() + s.length()); + this.writeByte(0); + } + + public void writeGJString(String s) { + this.writeByte(0); + this.writeString(s); + } + + public void putGJString3(String s) { + this.writeByte(0); + this.writeString(s); + this.writeByte(0); + } + + public void writePacket(int id) { + this.writeByte(id); + } + + public void writePacketVarByte(int id) { + this.writePacket(id); + this.writeByte(0); + this.opcodeStart = this.getOffset() - 1; + } + + public void writePacketVarShort(int id) { + this.writePacket(id); + this.writeShort(0); + this.opcodeStart = this.getOffset() - 2; + } + + public void endPacketVarByte() { + this.writeByte(this.getOffset() - (this.opcodeStart + 2) + 1, this.opcodeStart); + } + + public void endPacketVarShort() { + int size = this.getOffset() - (this.opcodeStart + 2); + this.writeByte(size >> 8, this.opcodeStart++); + this.writeByte(size, this.opcodeStart); + } + + public void initBitAccess() { + this.bitPosition = this.getOffset() * 8; + } + + public void finishBitAccess() { + this.setOffset((this.bitPosition + 7) / 8); + } + + public int getBitPos(int i) { + return 8 * i - this.bitPosition; + } + + public void writeBits(int numBits, int value) { + int bytePos = this.bitPosition >> 3; + int bitOffset = 8 - (this.bitPosition & 7); + + byte[] var10000; + for(this.bitPosition += numBits; numBits > bitOffset; bitOffset = 8) { + this.checkCapacityPosition(bytePos); + var10000 = this.getBuffer(); + var10000[bytePos] = (byte)(var10000[bytePos] & ~BIT_MASK[bitOffset]); + var10000 = this.getBuffer(); + int var10001 = bytePos++; + var10000[var10001] = (byte)(var10000[var10001] | value >> numBits - bitOffset & BIT_MASK[bitOffset]); + numBits -= bitOffset; + } + + this.checkCapacityPosition(bytePos); + if(numBits == bitOffset) { + var10000 = this.getBuffer(); + var10000[bytePos] = (byte)(var10000[bytePos] & ~BIT_MASK[bitOffset]); + var10000 = this.getBuffer(); + var10000[bytePos] = (byte)(var10000[bytePos] | value & BIT_MASK[bitOffset]); + } else { + var10000 = this.getBuffer(); + var10000[bytePos] = (byte)(var10000[bytePos] & ~(BIT_MASK[numBits] << bitOffset - numBits)); + var10000 = this.getBuffer(); + var10000[bytePos] = (byte)(var10000[bytePos] | (value & BIT_MASK[numBits]) << bitOffset - numBits); + } + + } + + public void setBuffer(byte[] buffer) { + this.buffer = buffer; + } + + public final void rsaEncode(BigInteger key, BigInteger modulus) { + int length = this.offset; + this.offset = 0; + byte[] data = new byte[length]; + this.getBytes(data, 0, length); + BigInteger biginteger2 = new BigInteger(data); + BigInteger biginteger3 = biginteger2.modPow(key, modulus); + byte[] out = biginteger3.toByteArray(); + this.offset = 0; + this.writeBytes(out, 0, out.length); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/io/Stream.java b/Tools/Frostys Cache Editor/src/com/alex/io/Stream.java new file mode 100644 index 000000000..4f5367fc7 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/io/Stream.java @@ -0,0 +1,91 @@ +package com.alex.io; + +public abstract class Stream { + protected int offset; + protected int length; + protected byte[] buffer; + protected int bitPosition; + + public int getLength() { + return this.length; + } + + public byte[] getBuffer() { + return this.buffer; + } + + public int getOffset() { + return this.offset; + } + + public void decodeXTEA(int[] keys) { + this.decodeXTEA(keys, 5, this.length); + } + + public void decodeXTEA(int[] keys, int start, int end) { + int l = this.offset; + this.offset = start; + int i1 = (end - start) / 8; + + for(int j1 = 0; j1 < i1; ++j1) { + int k1 = this.readInt(); + int l1 = this.readInt(); + int sum = -957401312; + int delta = -1640531527; + + for(int k2 = 32; k2-- > 0; k1 -= (l1 >>> 5 ^ l1 << 4) + l1 ^ keys[sum & 3] + sum) { + l1 -= keys[(sum & 7300) >>> 11] + sum ^ (k1 >>> 5 ^ k1 << 4) + k1; + sum -= delta; + } + + this.offset -= 8; + this.writeInt(k1); + this.writeInt(l1); + } + + this.offset = l; + } + + public final void encodeXTEA(int[] keys, int start, int end) { + int o = this.offset; + int j = (end - start) / 8; + this.offset = start; + + for(int k = 0; k < j; ++k) { + int l = this.readInt(); + int i1 = this.readInt(); + int sum = 0; + int delta = -1640531527; + + for(int l1 = 32; l1-- > 0; i1 += l + (l >>> 5 ^ l << 4) ^ keys[(7916 & sum) >>> 11] + sum) { + l += sum + keys[3 & sum] ^ i1 + (i1 >>> 5 ^ i1 << 4); + sum += delta; + } + + this.offset -= 8; + this.writeInt(l); + this.writeInt(i1); + } + + this.offset = o; + } + + private final int readInt() { + this.offset += 4; + return ((255 & this.buffer[-3 + this.offset]) << 16) + ((255 & this.buffer[-4 + this.offset]) << 24) + ((this.buffer[-2 + this.offset] & 255) << 8) + (this.buffer[-1 + this.offset] & 255); + } + + public void writeInt(int value) { + this.buffer[this.offset++] = (byte)(value >> 24); + this.buffer[this.offset++] = (byte)(value >> 16); + this.buffer[this.offset++] = (byte)(value >> 8); + this.buffer[this.offset++] = (byte)value; + } + + public final void getBytes(byte[] data, int off, int len) { + for(int k = off; k < len + off; ++k) { + data[k] = this.buffer[this.offset++]; + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/animations/AnimationDefinitions.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/animations/AnimationDefinitions.java new file mode 100644 index 000000000..f0b589314 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/animations/AnimationDefinitions.java @@ -0,0 +1,281 @@ +package com.alex.loaders.animations; + +import com.alex.io.InputStream; +import com.alex.store.Store; + +import java.io.IOException; +import java.io.PrintStream; +import java.util.concurrent.ConcurrentHashMap; + +public class AnimationDefinitions { + public static Store cache; + public static int id; + public int loopCycles = 99; + public int anInt2137; + public static int[] frames; + public int anInt2140 = -1; + public boolean aBoolean2141 = false; + public int priority = 5; + public int leftHandEquip = -1; + public int rightHandEquip = -1; + public int anInt2145; + public int[][] handledSounds; + public boolean[] aBooleanArray2149; + public int[] anIntArray2151; + public boolean aBoolean2152 = false; + public static int[] delays; + public int anInt2155 = 2; + public boolean aBoolean2158 = false; + public boolean aBoolean2159 = false; + public int anInt2162 = -1; + public int loopDelay = -1; + public int[] soundMinDelay; + public int[] soundMaxDelay; + public int[] anIntArray1362; + public boolean effect2Sound; + private static final ConcurrentHashMap animDefs = new ConcurrentHashMap(); + + public static void main(String[] args) throws IOException { + cache = new Store("C:/Users/yvonne � christer/Dropbox/Source/data/562cache/"); + + label55: + for(int i = 0; i < 1; ++i) { + System.out.println("Emote ID: " + i); + int k = 0; + + while(true) { + getAnimationDefinitions(i); + PrintStream var10000; + StringBuilder var10001; + if(k >= delays.length) { + k = 0; + + while(true) { + getAnimationDefinitions(i); + if(k >= frames.length) { + System.out.println("loopDelay = " + getAnimationDefinitions(i).loopDelay); + System.out.println("leftHandEquip = " + getAnimationDefinitions(i).leftHandEquip); + System.out.println("priority = " + getAnimationDefinitions(i).priority); + System.out.println("rightHandEquip = " + getAnimationDefinitions(i).rightHandEquip); + System.out.println("loopCycles = " + getAnimationDefinitions(i).loopCycles); + System.out.println("anInt2140 = " + getAnimationDefinitions(i).anInt2140); + System.out.println("anInt2162 = " + getAnimationDefinitions(i).anInt2162); + System.out.println("anInt2155 = " + getAnimationDefinitions(i).anInt2155); + System.out.println("anInt2145 = " + getAnimationDefinitions(i).anInt2145); + + for(k = 0; k < getAnimationDefinitions(i).anIntArray2151.length; ++k) { + System.out.println("anIntArray2151[" + k + "] = " + getAnimationDefinitions(i).anIntArray2151[k]); + } + + for(k = 0; k < getAnimationDefinitions(i).aBooleanArray2149.length; ++k) { + System.out.println("aBooleanArray2149[" + k + "] = " + getAnimationDefinitions(i).aBooleanArray2149[k]); + } + + System.out.println("aBoolean2152 = " + getAnimationDefinitions(i).aBoolean2152); + + for(k = 0; k < getAnimationDefinitions(i).anIntArray1362.length; ++k) { + System.out.println("anIntArray1362[" + k + "] = " + getAnimationDefinitions(i).anIntArray1362[k]); + } + continue label55; + } + + var10000 = System.out; + var10001 = (new StringBuilder()).append("frames[").append(k).append("] = "); + getAnimationDefinitions(i); + var10000.println(var10001.append(frames[k]).toString()); + ++k; + } + } + + var10000 = System.out; + var10001 = (new StringBuilder()).append("delays[").append(k).append("] = "); + getAnimationDefinitions(i); + var10000.println(var10001.append(delays[k]).toString()); + ++k; + } + } + + } + + public static final AnimationDefinitions getAnimationDefinitions(int emoteId) { + try { + AnimationDefinitions var3 = (AnimationDefinitions)animDefs.get(Integer.valueOf(emoteId)); + if(var3 != null) { + return var3; + } else { + byte[] data = cache.getIndexes()[20].getFile(emoteId >>> 7, emoteId & 127); + var3 = new AnimationDefinitions(); + if(data != null) { + var3.readValueLoop(new InputStream(data)); + } + + var3.method2394(); + animDefs.put(Integer.valueOf(emoteId), var3); + id = emoteId; + return var3; + } + } catch (Throwable var31) { + return null; + } + } + + private void readValueLoop(InputStream stream) { + while(true) { + int opcode = stream.readUnsignedByte(); + if(opcode == 0) { + return; + } + + this.readValues(stream, opcode); + } + } + + public int getEmoteTime() { + if(delays == null) { + return 0; + } else { + int ms = 0; + int[] arr$ = delays; + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int i = arr$[i$]; + ms += i; + } + + return ms * 30; + } + } + + public int getEmoteGameTickets() { + return this.getEmoteTime() / 1000; + } + + private void readValues(InputStream stream, int opcode) { + int index; + int i_21_; + if(opcode == 1) { + index = stream.readUnsignedShort(); + delays = new int[index]; + + for(i_21_ = 0; ~index < ~i_21_; ++i_21_) { + delays[i_21_] = stream.readUnsignedShort(); + } + + frames = new int[index]; + + for(i_21_ = 0; ~i_21_ > ~index; ++i_21_) { + frames[i_21_] = stream.readUnsignedShort(); + } + + for(i_21_ = 0; i_21_ < index; ++i_21_) { + frames[i_21_] += stream.readUnsignedShort() << 16; + } + } else if(opcode == 2) { + this.loopDelay = stream.readUnsignedShort(); + } else if(opcode == 3) { + this.aBooleanArray2149 = new boolean[256]; + index = stream.readUnsignedByte(); + + for(i_21_ = 0; i_21_ < index; ++i_21_) { + this.aBooleanArray2149[stream.readUnsignedByte()] = true; + } + } else if(opcode == 4) { + this.aBoolean2152 = true; + } else if(opcode == 5) { + this.priority = stream.readUnsignedByte(); + } else if(opcode == 6) { + this.rightHandEquip = stream.readUnsignedShort(); + } else if(opcode == 7) { + this.leftHandEquip = stream.readUnsignedShort(); + } else if(opcode == 8) { + this.loopCycles = stream.readUnsignedByte(); + } else if(opcode == 9) { + this.anInt2140 = stream.readUnsignedByte(); + } else if(opcode == 10) { + this.anInt2162 = stream.readUnsignedByte(); + } else if(opcode == 11) { + this.anInt2155 = stream.readUnsignedByte(); + } else if(opcode == 12) { + index = stream.readUnsignedByte(); + this.anIntArray2151 = new int[index]; + + for(i_21_ = 0; ~i_21_ > ~index; ++i_21_) { + this.anIntArray2151[i_21_] = stream.readUnsignedShort(); + } + + for(i_21_ = 0; index > i_21_; ++i_21_) { + this.anIntArray2151[i_21_] += stream.readUnsignedShort() << 16; + } + } else if(opcode == 13) { + index = stream.readUnsignedShort(); + this.handledSounds = new int[index][]; + + for(i_21_ = 0; i_21_ < index; ++i_21_) { + int i_22_ = stream.readUnsignedByte(); + if(~i_22_ < -1) { + this.handledSounds[i_21_] = new int[i_22_]; + this.handledSounds[i_21_][0] = stream.read24BitInt(); + + for(int i_23_ = 1; ~i_22_ < ~i_23_; ++i_23_) { + this.handledSounds[i_21_][i_23_] = stream.readUnsignedShort(); + } + } + } + } else if(opcode == 14) { + this.aBoolean2141 = true; + } else if(opcode == 15) { + this.aBoolean2159 = true; + } else if(opcode == 16) { + this.aBoolean2158 = true; + } else if(opcode == 17) { + this.anInt2145 = stream.readUnsignedByte(); + } else if(opcode == 18) { + this.effect2Sound = true; + } else if(opcode == 19) { + if(this.anIntArray1362 == null) { + this.anIntArray1362 = new int[this.handledSounds.length]; + + for(index = 0; index < this.handledSounds.length; ++index) { + this.anIntArray1362[index] = 255; + } + } + + this.anIntArray1362[stream.readUnsignedByte()] = stream.readUnsignedByte(); + } else if(opcode == 20) { + if(this.soundMaxDelay == null || this.soundMinDelay == null) { + this.soundMaxDelay = new int[this.handledSounds.length]; + this.soundMinDelay = new int[this.handledSounds.length]; + + for(index = 0; index < this.handledSounds.length; ++index) { + this.soundMaxDelay[index] = 256; + this.soundMinDelay[index] = 256; + } + } + + index = stream.readUnsignedByte(); + this.soundMaxDelay[index] = stream.readUnsignedShort(); + this.soundMinDelay[index] = stream.readUnsignedShort(); + } + + } + + public void method2394() { + if(this.anInt2140 == -1) { + if(this.aBooleanArray2149 == null) { + this.anInt2140 = 0; + } else { + this.anInt2140 = 2; + } + } + + if(this.anInt2162 == -1) { + if(this.aBooleanArray2149 == null) { + this.anInt2162 = 0; + } else { + this.anInt2162 = 2; + } + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/clientscripts/ClientScript.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/clientscripts/ClientScript.java new file mode 100644 index 000000000..60aae5b61 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/clientscripts/ClientScript.java @@ -0,0 +1,4 @@ +package com.alex.loaders.clientscripts; + +public class ClientScript { +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/images/IndexedColorImageFile.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/images/IndexedColorImageFile.java new file mode 100644 index 000000000..2dcde23e6 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/images/IndexedColorImageFile.java @@ -0,0 +1,341 @@ +package com.alex.loaders.images; + +import com.alex.io.InputStream; +import com.alex.io.OutputStream; +import com.alex.store.Store; + +import java.awt.image.BufferedImage; +import java.util.Arrays; + +public final class IndexedColorImageFile { + private BufferedImage[] images; + private int[] pallete; + private int[][] pixelsIndexes; + private byte[][] alpha; + private boolean[] usesAlpha; + private int biggestWidth; + private int biggestHeight; + + public IndexedColorImageFile(BufferedImage... images) { + this.images = images; + } + + public IndexedColorImageFile(Store cache, int archiveId, int fileId) { + this(cache, 8, archiveId, fileId); + } + + public IndexedColorImageFile(Store cache, int idx, int archiveId, int fileId) { + this.decodeArchive(cache, idx, archiveId, fileId); + } + + public void decodeArchive(Store cache, int idx, int archiveId, int fileId) { + byte[] data = cache.getIndexes()[idx].getFile(archiveId, fileId); + if(data != null) { + InputStream stream = new InputStream(data); + stream.setOffset(data.length - 2); + int count = stream.readUnsignedShort(); + this.images = new BufferedImage[count]; + this.pixelsIndexes = new int[this.images.length][]; + this.alpha = new byte[this.images.length][]; + this.usesAlpha = new boolean[this.images.length]; + int[] imagesMinX = new int[this.images.length]; + int[] imagesMinY = new int[this.images.length]; + int[] imagesWidth = new int[this.images.length]; + int[] imagesHeight = new int[this.images.length]; + stream.setOffset(data.length - 7 - this.images.length * 8); + this.setBiggestWidth(stream.readShort()); + this.setBiggestHeight(stream.readShort()); + int palleteLength = (stream.readUnsignedByte() & 255) + 1; + + int i_20_; + for(i_20_ = 0; i_20_ < this.images.length; ++i_20_) { + imagesMinX[i_20_] = stream.readUnsignedShort(); + } + + for(i_20_ = 0; i_20_ < this.images.length; ++i_20_) { + imagesMinY[i_20_] = stream.readUnsignedShort(); + } + + for(i_20_ = 0; i_20_ < this.images.length; ++i_20_) { + imagesWidth[i_20_] = stream.readUnsignedShort(); + } + + for(i_20_ = 0; i_20_ < this.images.length; ++i_20_) { + imagesHeight[i_20_] = stream.readUnsignedShort(); + } + + stream.setOffset(data.length - 7 - this.images.length * 8 - (palleteLength - 1) * 3); + this.pallete = new int[palleteLength]; + + for(i_20_ = 1; i_20_ < palleteLength; ++i_20_) { + this.pallete[i_20_] = stream.read24BitInt(); + if(this.pallete[i_20_] == 0) { + this.pallete[i_20_] = 1; + } + } + + stream.setOffset(0); + + for(i_20_ = 0; i_20_ < this.images.length; ++i_20_) { + int pixelsIndexesLength = imagesWidth[i_20_] * imagesHeight[i_20_]; + this.pixelsIndexes[i_20_] = new int[pixelsIndexesLength]; + this.alpha[i_20_] = new byte[pixelsIndexesLength]; + int maskData = stream.readUnsignedByte(); + int i_31_; + if((maskData & 2) == 0) { + int var201; + if((maskData & 1) == 0) { + for(var201 = 0; var201 < pixelsIndexesLength; ++var201) { + this.pixelsIndexes[i_20_][var201] = (byte)stream.readByte(); + } + } else { + for(var201 = 0; var201 < imagesWidth[i_20_]; ++var201) { + for(i_31_ = 0; i_31_ < imagesHeight[i_20_]; ++i_31_) { + this.pixelsIndexes[i_20_][var201 + i_31_ * imagesWidth[i_20_]] = (byte)stream.readByte(); + } + } + } + } else { + this.usesAlpha[i_20_] = true; + boolean var20 = false; + if((maskData & 1) == 0) { + for(i_31_ = 0; i_31_ < pixelsIndexesLength; ++i_31_) { + this.pixelsIndexes[i_20_][i_31_] = (byte)stream.readByte(); + } + + for(i_31_ = 0; i_31_ < pixelsIndexesLength; ++i_31_) { + byte var21 = this.alpha[i_20_][i_31_] = (byte)stream.readByte(); + var20 |= var21 != -1; + } + } else { + int var211; + for(i_31_ = 0; i_31_ < imagesWidth[i_20_]; ++i_31_) { + for(var211 = 0; var211 < imagesHeight[i_20_]; ++var211) { + this.pixelsIndexes[i_20_][i_31_ + var211 * imagesWidth[i_20_]] = stream.readByte(); + } + } + + for(i_31_ = 0; i_31_ < imagesWidth[i_20_]; ++i_31_) { + for(var211 = 0; var211 < imagesHeight[i_20_]; ++var211) { + byte i_33_ = this.alpha[i_20_][i_31_ + var211 * imagesWidth[i_20_]] = (byte)stream.readByte(); + var20 |= i_33_ != -1; + } + } + } + + if(!var20) { + this.alpha[i_20_] = null; + } + } + + this.images[i_20_] = this.getBufferedImage(imagesWidth[i_20_], imagesHeight[i_20_], this.pixelsIndexes[i_20_], this.alpha[i_20_], this.usesAlpha[i_20_]); + } + } + + } + + public BufferedImage getBufferedImage(int width, int height, int[] pixelsIndexes, byte[] extraPixels, boolean useExtraPixels) { + if(width > 0 && height > 0) { + BufferedImage image = new BufferedImage(width, height, 6); + int[] rgbArray = new int[width * height]; + int i = 0; + int i_43_ = 0; + int i_46_; + int i_47_; + if(useExtraPixels && extraPixels != null) { + for(i_46_ = 0; i_46_ < height; ++i_46_) { + for(i_47_ = 0; i_47_ < width; ++i_47_) { + rgbArray[i_43_++] = extraPixels[i] << 24 | this.pallete[pixelsIndexes[i] & 255]; + ++i; + } + } + } else { + for(i_46_ = 0; i_46_ < height; ++i_46_) { + for(i_47_ = 0; i_47_ < width; ++i_47_) { + int i_48_ = this.pallete[pixelsIndexes[i++] & 255]; + rgbArray[i_43_++] = i_48_ != 0?-16777216 | i_48_:0; + } + } + } + + image.setRGB(0, 0, width, height, rgbArray, 0, width); + image.flush(); + return image; + } else { + return null; + } + } + + public byte[] encodeFile() { + if(this.pallete == null) { + this.generatePallete(); + } + + OutputStream stream = new OutputStream(); + + int container; + int len$; + int i$; + for(container = 0; container < this.images.length; ++container) { + len$ = 0; + if(this.usesAlpha[container]) { + len$ |= 2; + } + + stream.writeByte(len$); + + for(i$ = 0; i$ < this.pixelsIndexes[container].length; ++i$) { + stream.writeByte(this.pixelsIndexes[container][i$]); + } + + if(this.usesAlpha[container]) { + for(i$ = 0; i$ < this.alpha[container].length; ++i$) { + stream.writeByte(this.alpha[container][i$]); + } + } + } + + for(container = 0; container < this.pallete.length; ++container) { + stream.write24BitInt(this.pallete[container]); + } + + if(this.biggestWidth == 0 && this.biggestHeight == 0) { + BufferedImage[] var7 = this.images; + len$ = var7.length; + + for(i$ = 0; i$ < len$; ++i$) { + BufferedImage image = var7[i$]; + if(image.getWidth() > this.biggestWidth) { + this.biggestWidth = image.getWidth(); + } + + if(image.getHeight() > this.biggestHeight) { + this.biggestHeight = image.getHeight(); + } + } + } + + stream.writeShort(this.biggestWidth); + stream.writeShort(this.biggestHeight); + stream.writeByte(this.pallete.length - 1); + + for(container = 0; container < this.images.length; ++container) { + stream.writeShort(this.images[container].getMinX()); + } + + for(container = 0; container < this.images.length; ++container) { + stream.writeShort(this.images[container].getMinY()); + } + + for(container = 0; container < this.images.length; ++container) { + stream.writeShort(this.images[container].getWidth()); + } + + for(container = 0; container < this.images.length; ++container) { + stream.writeShort(this.images[container].getHeight()); + } + + stream.writeShort(this.images.length); + byte[] var71 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(var71, 0, var71.length); + return var71; + } + + public int getPalleteIndex(int rgb) { + if(this.pallete == null) { + this.pallete = new int[1]; + } + + for(int var3 = 0; var3 < this.pallete.length; ++var3) { + if(this.pallete[var3] == rgb) { + return var3; + } + } + + if(this.pallete.length == 256) { + System.out.println("Pallete to big, please reduce images quality."); + return 0; + } else { + int[] var31 = new int[this.pallete.length + 1]; + System.arraycopy(this.pallete, 0, var31, 0, this.pallete.length); + var31[this.pallete.length] = rgb; + this.pallete = var31; + return this.pallete.length - 1; + } + } + + public int addImage(BufferedImage image) { + BufferedImage[] newImages = (BufferedImage[])Arrays.copyOf(this.images, this.images.length + 1); + newImages[this.images.length] = image; + this.images = newImages; + this.pallete = null; + this.pixelsIndexes = null; + this.alpha = null; + this.usesAlpha = null; + return this.images.length - 1; + } + + public void replaceImage(BufferedImage image, int index) { + this.images[index] = image; + this.pallete = null; + this.pixelsIndexes = null; + this.alpha = null; + this.usesAlpha = null; + } + + public void generatePallete() { + this.pixelsIndexes = new int[this.images.length][]; + this.alpha = new byte[this.images.length][]; + this.usesAlpha = new boolean[this.images.length]; + + for(int index = 0; index < this.images.length; ++index) { + BufferedImage image = this.images[index]; + int[] rgbArray = new int[image.getWidth() * image.getHeight()]; + image.getRGB(0, 0, image.getWidth(), image.getHeight(), rgbArray, 0, image.getWidth()); + this.pixelsIndexes[index] = new int[image.getWidth() * image.getHeight()]; + this.alpha[index] = new byte[image.getWidth() * image.getHeight()]; + + for(int pixel = 0; pixel < this.pixelsIndexes[index].length; ++pixel) { + int rgb = rgbArray[pixel]; + int medintrgb = this.convertToMediumInt(rgb); + int i = this.getPalleteIndex(medintrgb); + this.pixelsIndexes[index][pixel] = i; + if(rgb >> 24 != 0) { + this.alpha[index][pixel] = (byte)(rgb >> 24); + this.usesAlpha[index] = true; + } + } + } + + } + + public int convertToMediumInt(int rgb) { + OutputStream out = new OutputStream(4); + out.writeInt(rgb); + InputStream stream = new InputStream(out.getBuffer()); + stream.setOffset(1); + rgb = stream.read24BitInt(); + return rgb; + } + + public BufferedImage[] getImages() { + return this.images; + } + + public int getBiggestWidth() { + return this.biggestWidth; + } + + public void setBiggestWidth(int biggestWidth) { + this.biggestWidth = biggestWidth; + } + + public int getBiggestHeight() { + return this.biggestHeight; + } + + public void setBiggestHeight(int biggestHeight) { + this.biggestHeight = biggestHeight; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/images/LoaderImageArchive.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/images/LoaderImageArchive.java new file mode 100644 index 000000000..b7d532b97 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/images/LoaderImageArchive.java @@ -0,0 +1,35 @@ +package com.alex.loaders.images; + +import com.alex.store.Store; + +public class LoaderImageArchive { + private byte[] data; + + public LoaderImageArchive(byte[] data) { + this.data = data; + } + + public LoaderImageArchive(Store cache, int archiveId) { + this(cache, 32, archiveId, 0); + } + + private LoaderImageArchive(Store cache, int idx, int archiveId, int fileId) { + this.decodeArchive(cache, idx, archiveId, fileId); + } + + private void decodeArchive(Store cache, int idx, int archiveId, int fileId) { + byte[] data = cache.getIndexes()[idx].getFile(archiveId, fileId); + if(data != null) { + this.data = data; + } + + } + + public Image getImage() { + return Toolkit.getDefaultToolkit().createImage(this.data); + } + + public byte[] getImageData() { + return this.data; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/IComponent.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/IComponent.java new file mode 100644 index 000000000..8c2fe4123 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/IComponent.java @@ -0,0 +1,842 @@ +package com.alex.loaders.interfaces; + +import com.alex.io.InputStream; +import com.alex.loaders.interfaces.IComponentSettings; + +public class IComponent { + public Object[] anObjectArray2296; + public int anInt2297 = 0; + public int anInt2298 = -1; + public int[] anIntArray2299; + public int anInt2300; + public int anInt2301 = 1; + public Object[] anObjectArray2302; + public int anInt2303 = -1; + public int anInt2305 = 0; + public boolean aBoolean2306 = false; + public int anInt2308 = 0; + public int[] anIntArray2310; + public byte aByte2311 = 0; + public int anInt2312 = 0; + public Object[] anObjectArray2313; + public int anInt2314; + public int[] anIntArray2315; + public Object[] anObjectArray2316; + public byte[] aByteArray2317; + public Object[] anObjectArray2318; + public int anInt2319 = 0; + public int anInt2321 = -1; + public int height = 0; + public int[] anIntArray2323; + public int anInt2324 = 0; + public int anInt2325 = 0; + public IComponent[] aClass173Array2326; + public int[][] anIntArrayArray2327; + public Object[] anObjectArray2328; + public String aString2329 = "Ok"; + public String aString2330; + public Object[] anObjectArray2331; + public int anInt2332 = 0; + public int anInt2333 = 0; + public String aString2334 = ""; + public int anInt2335 = 0; + public Object[] anObjectArray2336; + public int[] anIntArray2337; + public int anInt2338 = 0; + public int anInt2340; + public byte aByte2341 = 0; + public boolean aBoolean2342; + public int anInt2343 = 0; + public Object[] anObjectArray2344; + public IComponent aClass173_2345 = null; + public static int anInt2346; + public int anInt2347 = 0; + public Object[] anObjectArray2348; + public int anInt2349 = -1; + public int anInt2350 = -1; + public Object[] anObjectArray2351; + public Object[] anObjectArray2352; + public boolean aBoolean2353 = false; + public boolean useScripts = false; + public byte aByte2356 = 0; + public String aString2357 = ""; + public int modelId; + public int[] anIntArray2360; + public int anInt2361 = -1; + public Object[] anObjectArray2362; + public String[] aStringArray2363; + public int anInt2364 = 0; + public int anInt2365 = -1; + public boolean aBoolean2366 = false; + public boolean aBoolean2367 = false; + public boolean aBoolean2368 = false; + public int anInt2369 = 0; + public Object[] anObjectArray2371; + public String aString2373 = ""; + public int anInt2374 = -1; + public int anInt2375 = -1; + public int imageId = -1; + public int[] anIntArray2379; + public boolean aBoolean2380 = false; + public int anInt2381 = 0; + public int anInt2382; + public short aShort2383 = 0; + public int[] anIntArray2384; + public String[] aStringArray2385; + public int anInt2386 = -1; + public int[] anIntArray2388; + public int anInt2389 = 0; + public int anInt2390 = 0; + public String aString2391 = ""; + public boolean aBoolean2393 = false; + public int anInt2394 = 1; + public Object[] anObjectArray2395; + public int anInt2396 = 0; + public int anInt2397 = 0; + public IComponentSettings settings; + public Object[] anObjectArray2399; + public int[] anIntArray2400; + public boolean aBoolean2401 = false; + public Object[] anObjectArray2402; + public int anInt2403 = 100; + public boolean hidden = false; + public Object[] anObjectArray2405; + public int[] anIntArray2407; + public Object[] anObjectArray2408; + public int anInt2409; + public Object[] anObjectArray2410; + public int anInt2411 = 0; + public int anInt2412 = 0; + public boolean aBoolean2413 = false; + public int anInt2414 = 0; + public int anInt2415 = 0; + public int modelType = 1; + public byte[] aByteArray2417; + public int[] anIntArray2418; + public boolean aBoolean2419; + public short aShort2420 = 3000; + public int anInt2421 = -1; + public boolean aBoolean2422 = false; + public int anInt2423 = 0; + public int anInt2424 = 0; + public Object[] defaultScript; + public int anInt2427 = 0; + public boolean aBoolean2429 = false; + public int[] anIntArray2431; + public int y = 0; + public int borderThickness = 0; + public boolean aBoolean2434 = false; + public int anInt2435 = 0; + public boolean aBoolean2436 = false; + public int anInt2437 = 0; + public int anInt2438 = 1; + public Object[] anObjectArray2439; + public int width = 0; + public int anInt2441 = 0; + public int anInt2442 = 0; + public int anInt2443 = -1; + public int anInt2444 = 0; + public int x = 0; + public Object[] anObjectArray2446; + public Object[] anObjectArray2447; + public int anInt2448 = -1; + public int[] anIntArray2449; + public int anInt2450 = 0; + public int anInt2451 = 0; + public int[] anIntArray2452; + public int anInt2453 = -1; + public Object[] anObjectArray2454; + public int hash = -1; + public int parentId = -1; + public int anInt2457 = -1; + public int anInt2458; + public int anInt2459 = 0; + public int anInt2461 = 0; + public Object[] anObjectArray2462; + public String aString2463 = ""; + public Object[] anObjectArray2464; + public Object[] anObjectArray2465; + public int anInt2467 = 0; + public byte aByte2469 = 0; + public int type; + public int anInt2471 = 1; + public int[] anIntArray2472; + public String aString2473; + public int anInt2474 = 2; + public Object[] anObjectArray2475; + public boolean aBoolean2476 = false; + public int anInt2477 = 0; + public int[] anIntArray2478; + public int anInt2479 = 0; + public int anInt2480 = 0; + public int anInt2481 = 1; + public int anInt2482 = 0; + public Object[] anObjectArray2483; + public int anInt2484 = 0; + public boolean aBoolean4782; + + public void decodeScriptsFormat(InputStream stream) { + this.useScripts = true; + int newInt = stream.readUnsignedByte(); + if(newInt == 255) { + newInt = -1; + } + + this.type = stream.readUnsignedByte(); + if(~(this.type & 128) != -1) { + this.type &= 127; + this.aString2473 = stream.readString(); + } + + this.anInt2441 = stream.readUnsignedShort(); + this.x = stream.readShort(); + this.y = stream.readShort(); + this.width = stream.readUnsignedShort(); + this.height = stream.readUnsignedShort(); + this.aByte2356 = (byte)stream.readByte(); + this.aByte2341 = (byte)stream.readByte(); + this.aByte2469 = (byte)stream.readByte(); + this.aByte2311 = (byte)stream.readByte(); + this.parentId = stream.readUnsignedShort(); + if(~this.parentId != -65536) { + this.parentId += this.hash & -65536; + } else { + this.parentId = -1; + } + + int i_17_ = stream.readUnsignedByte(); + this.hidden = ~(1 & i_17_) != -1; + if(newInt >= 0) { + this.aBoolean2429 = ~(i_17_ & 2) != -1; + } + + if(~this.type == -1) { + this.anInt2444 = stream.readUnsignedShort(); + this.anInt2479 = stream.readUnsignedShort(); + if(~newInt > -1) { + this.aBoolean2429 = stream.readUnsignedByte() == 1; + } + } + + int settingsHash; + if(~this.type == -6) { + this.imageId = stream.readInt(); + this.anInt2381 = stream.readUnsignedShort(); + settingsHash = stream.readUnsignedByte(); + this.aBoolean2422 = ~(2 & settingsHash) != -1; + this.aBoolean2434 = ~(settingsHash & 1) != -1; + this.anInt2369 = stream.readUnsignedByte(); + this.borderThickness = stream.readUnsignedByte(); + this.anInt2325 = stream.readInt(); + this.aBoolean2419 = ~stream.readUnsignedByte() == -2; + this.aBoolean2342 = ~stream.readUnsignedByte() == -2; + this.anInt2467 = stream.readInt(); + if(~newInt <= -4) { + this.aBoolean4782 = ~stream.readUnsignedByte() == -2; + } + } + + if(~this.type == -7) { + this.modelType = 1; + this.modelId = stream.readBigSmart(); + this.anInt2480 = stream.readShort(); + this.anInt2459 = stream.readShort(); + this.anInt2461 = stream.readUnsignedShort(); + this.anInt2482 = stream.readUnsignedShort(); + this.anInt2308 = stream.readUnsignedShort(); + this.anInt2403 = stream.readUnsignedShort(); + this.anInt2443 = stream.readUnsignedShort(); + if(this.anInt2443 == '\uffff') { + this.anInt2443 = -1; + } + + this.aBoolean2476 = stream.readUnsignedByte() == 1; + this.aShort2383 = (short)stream.readUnsignedShort(); + this.aShort2420 = (short)stream.readUnsignedShort(); + this.aBoolean2368 = stream.readUnsignedByte() == 1; + if(~this.aByte2356 != -1) { + this.anInt2423 = stream.readUnsignedShort(); + } + + if(this.aByte2341 != 0) { + this.anInt2397 = stream.readUnsignedShort(); + } + } + + if(this.type == 4) { + this.anInt2375 = stream.readBigSmart(); + if(~this.anInt2375 == -65536) { + this.anInt2375 = -1; + } + + this.aString2357 = stream.readString(); + if(this.aString2357.toLowerCase().contains("ship")) { + System.out.println(this.hash >> 16); + } + + this.anInt2364 = stream.readUnsignedByte(); + this.anInt2312 = stream.readUnsignedByte(); + this.anInt2297 = stream.readUnsignedByte(); + this.aBoolean2366 = ~stream.readUnsignedByte() == -2; + this.anInt2467 = stream.readInt(); + } + + if(this.type == 3) { + this.anInt2467 = stream.readInt(); + this.aBoolean2367 = ~stream.readUnsignedByte() == -2; + this.anInt2369 = stream.readUnsignedByte(); + } + + if(~this.type == -10) { + this.anInt2471 = stream.readUnsignedByte(); + this.anInt2467 = stream.readInt(); + this.aBoolean2306 = ~stream.readUnsignedByte() == -2; + } + + settingsHash = stream.read24BitInt(); + int i_28_ = stream.readUnsignedByte(); + int i_30_; + if(i_28_ != 0) { + this.anIntArray2449 = new int[11]; + this.aByteArray2417 = new byte[11]; + + for(this.aByteArray2317 = new byte[11]; ~i_28_ != -1; i_28_ = stream.readUnsignedByte()) { + i_30_ = -1 + (i_28_ >> 360744868); + i_28_ = i_28_ << -456693784 | stream.readUnsignedByte(); + i_28_ &= 4095; + if(~i_28_ != -4096) { + this.anIntArray2449[i_30_] = i_28_; + } else { + this.anIntArray2449[i_30_] = -1; + } + + this.aByteArray2317[i_30_] = (byte)stream.readByte(); + if(~this.aByteArray2317[i_30_] != -1) { + this.aBoolean2401 = true; + } + + this.aByteArray2417[i_30_] = (byte)stream.readByte(); + } + } + + this.aString2391 = stream.readString(); + i_30_ = stream.readUnsignedByte(); + int i_31_ = i_30_ & 15; + int i_33_; + if(~i_31_ < -1) { + this.aStringArray2385 = new String[i_31_]; + + for(i_33_ = 0; i_31_ > i_33_; ++i_33_) { + this.aStringArray2385[i_33_] = stream.readString(); + } + } + + i_33_ = i_30_ >> -686838332; + int defaultHash; + int i; + if(~i_33_ < -1) { + defaultHash = stream.readUnsignedByte(); + this.anIntArray2315 = new int[1 + defaultHash]; + + for(i = 0; i < this.anIntArray2315.length; ++i) { + this.anIntArray2315[i] = -1; + } + + this.anIntArray2315[defaultHash] = stream.readUnsignedShort(); + } + + if(~i_33_ < -2) { + defaultHash = stream.readUnsignedByte(); + this.anIntArray2315[defaultHash] = stream.readUnsignedShort(); + } + + this.aString2330 = stream.readString(); + if(this.aString2330.equals("")) { + this.aString2330 = null; + } + + this.anInt2335 = stream.readUnsignedByte(); + this.anInt2319 = stream.readUnsignedByte(); + this.aBoolean2436 = ~stream.readUnsignedByte() == -2; + this.aString2463 = stream.readString(); + defaultHash = -1; + if(~method2412(settingsHash) != -1) { + defaultHash = stream.readUnsignedShort(); + if(~defaultHash == -65536) { + defaultHash = -1; + } + + this.anInt2303 = stream.readUnsignedShort(); + if(this.anInt2303 == '\uffff') { + this.anInt2303 = -1; + } + + this.anInt2374 = stream.readUnsignedShort(); + if(this.anInt2374 == '\uffff') { + this.anInt2374 = -1; + } + } + + this.settings = new IComponentSettings(settingsHash, defaultHash); + this.defaultScript = this.decodeScript(stream); + this.anObjectArray2462 = this.decodeScript(stream); + this.anObjectArray2402 = this.decodeScript(stream); + this.anObjectArray2371 = this.decodeScript(stream); + this.anObjectArray2408 = this.decodeScript(stream); + this.anObjectArray2439 = this.decodeScript(stream); + this.anObjectArray2454 = this.decodeScript(stream); + this.anObjectArray2410 = this.decodeScript(stream); + this.anObjectArray2316 = this.decodeScript(stream); + this.anObjectArray2465 = this.decodeScript(stream); + this.anObjectArray2446 = this.decodeScript(stream); + this.anObjectArray2313 = this.decodeScript(stream); + this.anObjectArray2318 = this.decodeScript(stream); + this.anObjectArray2328 = this.decodeScript(stream); + this.anObjectArray2395 = this.decodeScript(stream); + this.anObjectArray2331 = this.decodeScript(stream); + this.anObjectArray2405 = this.decodeScript(stream); + this.anObjectArray2351 = this.decodeScript(stream); + this.anObjectArray2302 = this.decodeScript(stream); + this.anObjectArray2296 = this.decodeScript(stream); + this.anIntArray2452 = this.method2465(stream); + this.anIntArray2472 = this.method2465(stream); + this.anIntArray2360 = this.method2465(stream); + this.anIntArray2388 = this.method2465(stream); + this.anIntArray2299 = this.method2465(stream); + System.out.println("useScripts = " + this.useScripts); + System.out.println("x = " + this.x); + System.out.println("y = " + this.y); + System.out.println("width = " + this.width); + System.out.println("height = " + this.height); + System.out.println("parentId = " + this.parentId); + System.out.println("imageId = " + this.imageId); + System.out.println("modelId = " + this.modelId); + System.out.println("aString2357 = " + this.aString2357); + System.out.println("aString2391 = " + this.aString2391); + + for(i = 0; i < this.aStringArray2385.length; ++i) { + System.out.println("aStringArray2385[" + i + "] = " + this.aStringArray2385[i]); + } + + for(i = 0; i < this.anIntArray2315.length; ++i) { + System.out.println("anIntArray2315[" + i + "] = " + this.anIntArray2315[i]); + } + + System.out.println("aString2330 = " + this.aString2330); + System.out.println("aBoolean2436 = " + this.aBoolean2436); + System.out.println("aString2463 = " + this.aString2463); + System.out.println("anInt2303 = " + this.anInt2303); + System.out.println("anInt2364 = " + this.anInt2364); + + for(i = 0; i < this.anObjectArray2462.length; ++i) { + System.out.println("anObjectArray2462[" + i + "] = " + this.anObjectArray2462[i]); + } + + for(i = 0; i < this.anObjectArray2402.length; ++i) { + System.out.println("anObjectArray2402[" + i + "] = " + this.anObjectArray2402[i]); + } + + for(i = 0; i < this.anObjectArray2371.length; ++i) { + System.out.println("anObjectArray2371[" + i + "] = " + this.anObjectArray2371[i]); + } + + for(i = 0; i < this.anObjectArray2408.length; ++i) { + System.out.println("anObjectArray2408[" + i + "] = " + this.anObjectArray2408[i]); + } + + for(i = 0; i < this.anObjectArray2439.length; ++i) { + System.out.println("anObjectArray2439[" + i + "] = " + this.anObjectArray2439[i]); + } + + for(i = 0; i < this.anObjectArray2454.length; ++i) { + System.out.println("anObjectArray2454[" + i + "] = " + this.anObjectArray2454[i]); + } + + for(i = 0; i < this.anObjectArray2410.length; ++i) { + System.out.println("anObjectArray2410[" + i + "] = " + this.anObjectArray2410[i]); + } + + for(i = 0; i < this.anObjectArray2316.length; ++i) { + System.out.println("anObjectArray2316[" + i + "] = " + this.anObjectArray2316[i]); + } + + for(i = 0; i < this.anObjectArray2465.length; ++i) { + System.out.println("anObjectArray2465[" + i + "] = " + this.anObjectArray2465[i]); + } + + for(i = 0; i < this.anObjectArray2446.length; ++i) { + System.out.println("anObjectArray2446[" + i + "] = " + this.anObjectArray2446[i]); + } + + for(i = 0; i < this.anObjectArray2313.length; ++i) { + System.out.println("anObjectArray2313[" + i + "] = " + this.anObjectArray2313[i]); + } + + for(i = 0; i < this.anObjectArray2318.length; ++i) { + System.out.println("anObjectArray2318[" + i + "] = " + this.anObjectArray2318[i]); + } + + for(i = 0; i < this.anObjectArray2328.length; ++i) { + System.out.println("anObjectArray2328[" + i + "] = " + this.anObjectArray2328[i]); + } + + for(i = 0; i < this.anObjectArray2395.length; ++i) { + System.out.println("anObjectArray2395[" + i + "] = " + this.anObjectArray2395[i]); + } + + for(i = 0; i < this.anObjectArray2331.length; ++i) { + System.out.println("anObjectArray2331[" + i + "] = " + this.anObjectArray2331[i]); + } + + for(i = 0; i < this.anObjectArray2405.length; ++i) { + System.out.println("anObjectArray2405[" + i + "] = " + this.anObjectArray2405[i]); + } + + for(i = 0; i < this.anObjectArray2351.length; ++i) { + System.out.println("anObjectArray2351[" + i + "] = " + this.anObjectArray2351[i]); + } + + for(i = 0; i < this.anObjectArray2302.length; ++i) { + System.out.println("anObjectArray2302[" + i + "] = " + this.anObjectArray2302[i]); + } + + for(i = 0; i < this.anObjectArray2296.length; ++i) { + System.out.println("anObjectArray2296[" + i + "] = " + this.anObjectArray2296[i]); + } + + for(i = 0; i < this.anIntArray2452.length; ++i) { + System.out.println("anIntArray2452[" + i + "] = " + this.anIntArray2452[i]); + } + + for(i = 0; i < this.anIntArray2472.length; ++i) { + System.out.println("anIntArray2472[" + i + "] = " + this.anIntArray2472[i]); + } + + for(i = 0; i < this.anIntArray2360.length; ++i) { + System.out.println("anIntArray2360[" + i + "] = " + this.anIntArray2360[i]); + } + + for(i = 0; i < this.anIntArray2388.length; ++i) { + System.out.println("anIntArray2388[" + i + "] = " + this.anIntArray2388[i]); + } + + for(i = 0; i < this.anIntArray2299.length; ++i) { + System.out.println("anIntArray2299[" + i + "] = " + this.anIntArray2299[i]); + } + + } + + public Object[] decodeScript(InputStream stream) { + int size = stream.readUnsignedByte(); + Object[] objects = new Object[size]; + + for(int index = 0; ~size < ~index; ++index) { + int i_41_ = stream.readUnsignedByte(); + if(~i_41_ == -1) { + objects[index] = new Integer(stream.readInt()); + } else if(i_41_ == 1) { + objects[index] = stream.readString(); + } + } + + this.aBoolean2353 = true; + return objects; + } + + public int[] method2465(InputStream stream) { + int size = stream.readUnsignedByte(); + if(size == 0) { + return null; + } else { + int[] array = new int[size]; + + for(int index = 0; size > index; ++index) { + array[index] = stream.readInt(); + } + + return array; + } + } + + public void decodeNoscriptsFormat(InputStream stream) { + this.useScripts = false; + this.type = stream.readUnsignedByte(); + this.anInt2324 = stream.readUnsignedByte(); + this.anInt2441 = stream.readUnsignedShort(); + this.x = stream.readShort(); + this.y = stream.readShort(); + this.width = stream.readUnsignedShort(); + this.height = stream.readUnsignedShort(); + this.aByte2341 = 0; + this.aByte2356 = 0; + this.aByte2311 = 0; + this.aByte2469 = 0; + this.anInt2369 = stream.readUnsignedByte(); + this.parentId = stream.readUnsignedShort(); + if(~this.parentId == -65536) { + this.parentId = -1; + } else { + this.parentId += this.hash & -65536; + } + + this.anInt2448 = stream.readUnsignedShort(); + if(~this.anInt2448 == -65536) { + this.anInt2448 = -1; + } + + int i = stream.readUnsignedByte(); + int i_1_; + if(~i < -1) { + this.anIntArray2407 = new int[i]; + this.anIntArray2384 = new int[i]; + + for(i_1_ = 0; i > i_1_; ++i_1_) { + this.anIntArray2384[i_1_] = stream.readUnsignedByte(); + this.anIntArray2407[i_1_] = stream.readUnsignedShort(); + } + } + + i_1_ = stream.readUnsignedByte(); + int i_5_; + int is; + int i_13_; + if(~i_1_ < -1) { + this.anIntArrayArray2327 = new int[i_1_][]; + + for(i_5_ = 0; ~i_1_ < ~i_5_; ++i_5_) { + is = stream.readUnsignedShort(); + this.anIntArrayArray2327[i_5_] = new int[is]; + + for(i_13_ = 0; ~is < ~i_13_; ++i_13_) { + this.anIntArrayArray2327[i_5_][i_13_] = stream.readUnsignedShort(); + if(~this.anIntArrayArray2327[i_5_][i_13_] == -65536) { + this.anIntArrayArray2327[i_5_][i_13_] = -1; + } + } + } + } + + if(~this.type == -1) { + this.anInt2479 = stream.readUnsignedShort(); + this.hidden = stream.readUnsignedByte() == 1; + } + + if(this.type == 1) { + stream.readUnsignedShort(); + stream.readUnsignedByte(); + } + + i_5_ = 0; + if(~this.type == -3) { + this.anIntArray2400 = new int[this.height * this.width]; + this.aByte2341 = 3; + this.anIntArray2418 = new int[this.height * this.width]; + this.aByte2356 = 3; + is = stream.readUnsignedByte(); + if(is == 1) { + i_5_ |= 268435456; + } + + i_13_ = stream.readUnsignedByte(); + if(i_13_ == 1) { + i_5_ |= 1073741824; + } + + int var10 = stream.readUnsignedByte(); + stream.readUnsignedByte(); + if(~var10 == -2) { + i_5_ |= Integer.MIN_VALUE; + } + + this.anInt2332 = stream.readUnsignedByte(); + this.anInt2414 = stream.readUnsignedByte(); + this.anIntArray2337 = new int[20]; + this.anIntArray2323 = new int[20]; + this.anIntArray2431 = new int[20]; + + int i_11_; + for(i_11_ = 0; i_11_ < 20; ++i_11_) { + int var12 = stream.readUnsignedByte(); + if(~var12 != -2) { + this.anIntArray2431[i_11_] = -1; + } else { + this.anIntArray2323[i_11_] = stream.readShort(); + this.anIntArray2337[i_11_] = stream.readShort(); + this.anIntArray2431[i_11_] = stream.readInt(); + } + } + + this.aStringArray2363 = new String[5]; + + for(i_11_ = 0; i_11_ < 5; ++i_11_) { + String var121 = stream.readString(); + if(~var121.length() < -1) { + this.aStringArray2363[i_11_] = var121; + i_5_ |= 1 << 23 + i_11_; + } + } + } + + if(~this.type == -4) { + this.aBoolean2367 = ~stream.readUnsignedByte() == -2; + } + + if(~this.type == -5 || this.type == 1) { + this.anInt2312 = stream.readUnsignedByte(); + this.anInt2297 = stream.readUnsignedByte(); + this.anInt2364 = stream.readUnsignedByte(); + this.anInt2375 = stream.readUnsignedShort(); + if(~this.anInt2375 == -65536) { + this.anInt2375 = -1; + } + + this.aBoolean2366 = stream.readUnsignedByte() == 1; + } + + if(~this.type == -5) { + this.aString2357 = stream.readString(); + this.aString2334 = stream.readString(); + } + + if(this.type == 1 || ~this.type == -4 || this.type == 4) { + this.anInt2467 = stream.readInt(); + } + + if(this.type == 3 || this.type == 4) { + this.anInt2424 = stream.readInt(); + this.anInt2451 = stream.readInt(); + this.anInt2477 = stream.readInt(); + } + + if(~this.type == -6) { + this.imageId = stream.readInt(); + this.anInt2349 = stream.readInt(); + } + + if(~this.type == -7) { + this.modelType = 1; + this.modelId = stream.readUnsignedShort(); + this.anInt2301 = 1; + if(this.modelId == '\uffff') { + this.modelId = -1; + } + + this.anInt2386 = stream.readUnsignedShort(); + if(~this.anInt2386 == -65536) { + this.anInt2386 = -1; + } + + this.anInt2443 = stream.readUnsignedShort(); + if(this.anInt2443 == '\uffff') { + this.anInt2443 = -1; + } + + this.anInt2298 = stream.readUnsignedShort(); + if(this.anInt2298 == '\uffff') { + this.anInt2298 = -1; + } + + this.anInt2403 = stream.readUnsignedShort(); + this.anInt2461 = stream.readUnsignedShort(); + this.anInt2482 = stream.readUnsignedShort(); + } + + if(~this.type == -8) { + this.aByte2341 = 3; + this.anIntArray2418 = new int[this.width * this.height]; + this.aByte2356 = 3; + this.anIntArray2400 = new int[this.width * this.height]; + this.anInt2312 = stream.readUnsignedByte(); + this.anInt2375 = stream.readUnsignedShort(); + if(this.anInt2375 == '\uffff') { + this.anInt2375 = -1; + } + + this.aBoolean2366 = stream.readUnsignedByte() == 1; + this.anInt2467 = stream.readInt(); + this.anInt2332 = stream.readShort(); + this.anInt2414 = stream.readShort(); + is = stream.readUnsignedByte(); + if(~is == -2) { + i_5_ |= 1073741824; + } + + this.aStringArray2363 = new String[5]; + + for(i_13_ = 0; i_13_ < 5; ++i_13_) { + String var101 = stream.readString(); + if(var101.length() > 0) { + this.aStringArray2363[i_13_] = var101; + i_5_ |= 1 << i_13_ + 23; + } + } + } + + if(~this.type == -9) { + this.aString2357 = stream.readString(); + } + + if(this.anInt2324 == 2 || ~this.type == -3) { + this.aString2463 = stream.readString(); + this.aString2373 = stream.readString(); + is = 63 & stream.readUnsignedShort(); + i_5_ |= is << -116905845; + } + + if(~this.anInt2324 == -2 || ~this.anInt2324 == -5 || this.anInt2324 == 5 || this.anInt2324 == 6) { + this.aString2329 = stream.readString(); + if(~this.aString2329.length() == -1) { + if(~this.anInt2324 == -2) { + this.aString2329 = "Ok"; + } + + if(~this.anInt2324 == -5) { + this.aString2329 = "Select"; + } + + if(~this.anInt2324 == -6) { + this.aString2329 = "Select"; + } + + if(~this.anInt2324 == -7) { + this.aString2329 = "Continue"; + } + } + } + + if(this.anInt2324 == 1 || this.anInt2324 == 4 || ~this.anInt2324 == -6) { + i_5_ |= 4194304; + } + + if(~this.anInt2324 == -7) { + i_5_ |= 1; + } + + this.settings = new IComponentSettings(i_5_, -1); + System.out.println("useScripts = " + this.useScripts); + System.out.println("type = " + this.type); + System.out.println("anInt2324 = " + this.anInt2324); + System.out.println("anInt2441 = " + this.anInt2441); + System.out.println("x = " + this.x); + System.out.println("y = " + this.y); + System.out.println("width = " + this.width); + System.out.println("height = " + this.height); + System.out.println("anInt2369 = " + this.anInt2369); + System.out.println("parentId = " + this.parentId); + System.out.println("anInt2448 = " + this.anInt2448); + + byte var11; + for(var11 = 0; var11 < this.anIntArray2407.length; ++i) { + System.out.println("anIntArray2407[" + var11 + "] = " + this.anIntArray2407[var11]); + } + + for(var11 = 0; var11 < this.aStringArray2363.length; ++i) { + System.out.println("aStringArray2363[" + var11 + "] = " + this.aStringArray2363[var11]); + } + + } + + public static int method2412(int arg0) { + return 127 & arg0 >> -809958741; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/IComponentSettings.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/IComponentSettings.java new file mode 100644 index 000000000..4070eb65e --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/IComponentSettings.java @@ -0,0 +1,11 @@ +package com.alex.loaders.interfaces; + +public final class IComponentSettings { + public int settingsHash; + public int defaultHash; + + public IComponentSettings(int settingsHash, int defaultHash) { + this.settingsHash = settingsHash; + this.defaultHash = defaultHash; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/Interface.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/Interface.java new file mode 100644 index 000000000..39951151e --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/Interface.java @@ -0,0 +1,77 @@ +package com.alex.loaders.interfaces; + +import com.alex.io.InputStream; +import com.alex.loaders.interfaces.IComponent; +import com.alex.store.Store; +import com.alex.utils.Utils; + +import java.awt.image.FilteredImageSource; +import java.awt.image.ReplicateScaleFilter; +import java.io.IOException; + +public class Interface { + public int id; + public Store cache; + public IComponent[] components; + public JComponent[] jcomponents; + + public static void main(String[] args) throws IOException { + Store rscache = new Store("cache/"); + + for(int i = 0; i < Utils.getInterfaceDefinitionsSize(rscache); ++i) { + try { + new Interface(i, rscache); + } catch (Throwable var4) { + ; + } + } + + } + + public Interface(int id, Store cache) { + this(id, cache, true); + } + + public Interface(int id, Store cache, boolean load) { + this.id = id; + this.cache = cache; + if(load) { + this.getComponents(); + } + + } + + public void draw(JComponent parent) { + } + + public Image resizeImage(Image image, int width, int height, Component c) { + ReplicateScaleFilter replicate = new ReplicateScaleFilter(width, height); + FilteredImageSource prod = new FilteredImageSource(image.getSource(), replicate); + return c.createImage(prod); + } + + public void getComponents() { + if(Utils.getInterfaceDefinitionsSize(this.cache) <= this.id) { + throw new RuntimeException("Invalid interface id."); + } else { + this.components = new IComponent[Utils.getInterfaceDefinitionsComponentsSize(this.cache, this.id)]; + + for(int componentId = 0; componentId < this.components.length; ++componentId) { + this.components[componentId] = new IComponent(); + this.components[componentId].hash = this.id << 16 | componentId; + byte[] data = this.cache.getIndexes()[3].getFile(this.id, componentId); + if(data == null) { + throw new RuntimeException("Interface " + this.id + ", component " + componentId + " data is null."); + } + + System.out.println("Interface: " + this.id + " - ComponentId: " + componentId); + if(data[0] != -1) { + this.components[componentId].decodeNoscriptsFormat(new InputStream(data)); + } else { + this.components[componentId].decodeScriptsFormat(new InputStream(data)); + } + } + + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/InterfaceName.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/InterfaceName.java new file mode 100644 index 000000000..4deff52f3 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/interfaces/InterfaceName.java @@ -0,0 +1,60 @@ +package com.alex.loaders.interfaces; + +import com.alex.store.Store; +import com.alex.utils.Utils; + +import java.io.IOException; + +public class InterfaceName { + public static final char[] VALID_CHARS = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; + + public static void printAllCombinations4Letters() { + } + + public static void main(String[] args) throws IOException { + Store rscache = new Store("C:/Users/yvonne � christer/Dropbox/Source/data/562cache/", false); + int hash = rscache.getIndexes()[3].getTable().getArchives()[884].getNameHash(); + char[] arr$ = VALID_CHARS; + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + char l1 = arr$[i$]; + System.out.println(l1); + char[] arr$1 = VALID_CHARS; + int len$1 = arr$1.length; + + for(int i$1 = 0; i$1 < len$1; ++i$1) { + char l2 = arr$1[i$1]; + char[] arr$2 = VALID_CHARS; + int len$2 = arr$2.length; + + for(int i$2 = 0; i$2 < len$2; ++i$2) { + char l3 = arr$2[i$2]; + char[] arr$3 = VALID_CHARS; + int len$3 = arr$3.length; + + for(int i$3 = 0; i$3 < len$3; ++i$3) { + char l4 = arr$3[i$3]; + char[] arr$4 = VALID_CHARS; + int len$4 = arr$4.length; + + for(int i$4 = 0; i$4 < len$4; ++i$4) { + char l5 = arr$4[i$4]; + char[] arr$5 = VALID_CHARS; + int len$5 = arr$5.length; + + for(int i$5 = 0; i$5 < len$5; ++i$5) { + char l6 = arr$5[i$5]; + String name = new String(new char[]{l1, l2, l3, l4, l5, l6}); + if(Utils.getNameHash(name) == hash) { + System.out.println(name); + } + } + } + } + } + } + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/items/ItemDefinitions.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/items/ItemDefinitions.java new file mode 100644 index 000000000..7ff32f6a0 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/items/ItemDefinitions.java @@ -0,0 +1,1072 @@ +package com.alex.loaders.items; + +import com.alex.io.InputStream; +import com.alex.io.OutputStream; +import com.alex.store.Store; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; + +public class ItemDefinitions implements Cloneable { + public int id; + public boolean loaded; + public int modelId; + public String name; + public int modelZoom; + public int modelRotation1; + public int modelRotation2; + public int modelOffset1; + public int modelOffset2; + public int opcode1; + public int opcode2; + public int opcode4; + public int opcode5; + public int opcode6; + public int opcode7; + public int opcode8; + public int opcode11; + public int opcode12; + public int opcode14; + public int opcode16; + public int opcode22; + public int opcode23; + public int opcode24; + public int opcode25; + public int opcode26; + public int opcode29; + public int opcode30; + public int opcode31; + public int opcode32; + public int opcode33; + public int opcode34; + public int opcode35; + public int opcode36; + public int opcode37; + public int opcode38; + public int opcode39; + public int opcode40; + public int opcode41; + public int opcode42; + public int opcode65; + public int opcode78; + public int opcode79; + public int opcode90; + public int opcode91; + public int opcode92; + public int opcode93; + public int opcode95; + public int opcode96; + public int opcode97; + public int opcode98; + public int opcode100; + public int opcode101; + public int opcode102; + public int opcode103; + public int opcode104; + public int opcode105; + public int opcode106; + public int opcode107; + public int opcode108; + public int opcode109; + public int opcode110; + public int opcode111; + public int opcode112; + public int opcode113; + public int opcode114; + public int opcode115; + public int opcode121; + public int opcode122; + public int opcode125; + public int opcode126; + public int opcode127; + public int opcode128; + public int opcode129; + public int opcode130; + public int opcode132; + public int opcode139; + public int opcode140; + public int opcode191; + public int opcode249; + public int equipSlot; + public int equipType; + public int stackable; + public int value; + public boolean membersOnly; + public int maleEquip1; + public int femaleEquip1; + public int maleEquip2; + public int femaleEquip2; + public int maleEquipModelId3; + public int femaleEquipModelId3; + public String[] groundOptions; + public String[] inventoryOptions; + public int[] originalModelColors; + public int[] modifiedModelColors; + public short[] originalTextureColors; + public short[] modifiedTextureColors; + public byte[] unknownArray1; + public int[] unknownArray2; + public int[] unknownArray4; + public int[] unknownArray5; + public byte[] unknownArray6; + public byte[] unknownArray3; + public boolean unnoted; + public int unknownInt1; + public int unknownInt2; + public int unknownInt3; + public int unknownInt4; + public int unknownInt5; + public int unknownInt6; + public int switchNoteItemId; + public int notedItemId; + public int[] stackIds; + public int[] stackAmounts; + public int unknownInt7; + public int unknownInt8; + public int unknownInt9; + public int unknownInt10; + public int unknownInt11; + public int teamId; + public int switchLendItemId; + public int lendedItemId; + public int unknownInt12; + public int unknownInt13; + public int unknownInt14; + public int unknownInt15; + public int unknownInt16; + public int unknownInt17; + public int unknownInt18; + public int unknownInt19; + public int unknownInt20; + public int unknownInt21; + public int unknownInt22; + public int unknownInt23; + public int unknownValue1; + public int unknownValue2; + private int opcode218; + private int opcode219; + public HashMap clientScriptData; + + public static ItemDefinitions getItemDefinition(Store cache, int itemId) { + return getItemDefinition(cache, itemId, true); + } + + public static ItemDefinitions getItemDefinition(Store cache, int itemId, boolean load) { + return new ItemDefinitions(cache, itemId, load); + } + + public ItemDefinitions(Store cache, int id) { + this(cache, id, true); + } + + public ItemDefinitions(Store cache, int id, boolean load) { + this.id = id; + this.setDefaultsVariableValules(); + this.setDefaultOptions(); + if(load) { + this.loadItemDefinition(cache); + } + + } + + public boolean isLoaded() { + return this.loaded; + } + + public int getValue() { + return this.value; + } + + public int getTeamId() { + return this.teamId; + } + + public int getStackable() { + return this.stackable; + } + + public boolean isUnnoted() { + return this.unnoted; + } + + public int getLendedItemId() { + return this.lendedItemId; + } + + public int getModelRotation1() { + return this.modelRotation1; + } + + public void setModelRotation1(int modelRotation1) { + this.modelRotation1 = modelRotation1; + } + + public int getModelRotation2() { + return this.modelRotation2; + } + + public void setModelRotation2(int modelRotation2) { + this.modelRotation2 = modelRotation2; + } + + public int getModelOffset1() { + return this.modelOffset1; + } + + public void setModelOffset1(int modelOffset1) { + this.modelOffset1 = modelOffset1; + } + + public int getModelOffset2() { + return this.modelOffset2; + } + + public void setModelOffset2(int modelOffset2) { + this.modelOffset2 = modelOffset2; + } + + public int getMaleEquipModelId1() { + return this.maleEquip1; + } + + public void setMaleEquipModelId1(int maleEquipModelId1) { + this.maleEquip1 = maleEquipModelId1; + } + + public int getFemaleEquipModelId1() { + return this.femaleEquip1; + } + + public void setFemaleEquipModelId1(int femaleEquipModelId1) { + this.femaleEquip1 = femaleEquipModelId1; + } + + public int getMaleEquipModelId2() { + return this.maleEquip2; + } + + public void setMaleEquipModelId2(int maleEquipModelId2) { + this.maleEquip2 = maleEquipModelId2; + } + + public int getFemaleEquipModelId2() { + return this.femaleEquip2; + } + + public void setFemaleEquipModelId2(int femaleEquipModelId2) { + this.femaleEquip2 = femaleEquipModelId2; + } + + public int getMaleEquipModelId3() { + return this.maleEquipModelId3; + } + + public void setMaleEquipModelId3(int maleEquipModelId3) { + this.maleEquipModelId3 = maleEquipModelId3; + } + + public int getFemaleEquipModelId3() { + return this.femaleEquipModelId3; + } + + public void setFemaleEquipModelId3(int femaleEquipModelId3) { + this.femaleEquipModelId3 = femaleEquipModelId3; + } + + public int[] getOriginalModelColors() { + return this.originalModelColors; + } + + public void setOriginalModelColors(int[] originalModelColors) { + this.originalModelColors = originalModelColors; + } + + public int[] getModifiedModelColors() { + return this.modifiedModelColors; + } + + public void setModifiedModelColors(int[] modifiedModelColors) { + this.modifiedModelColors = modifiedModelColors; + } + + public int[] getStackAmounts() { + return this.stackAmounts; + } + + public void setStackAmounts(int[] stackAmounts) { + this.stackAmounts = stackAmounts; + } + + public int[] getStackIds() { + return this.stackIds; + } + + public void setStackIds(int[] stackIds) { + this.stackIds = stackIds; + } + + public void setStackable(int stackable) { + this.stackable = stackable; + } + + public void setValue(int value) { + this.value = value; + } + + public void setTeamId(int teamId) { + this.teamId = teamId; + } + + public void setMembersOnly(boolean membersOnly) { + this.membersOnly = membersOnly; + } + + public void setUnnoted(boolean unnoted) { + this.unnoted = unnoted; + } + + public void setEquipSlot(int equipSlot) { + this.equipSlot = equipSlot; + } + + public void setEquipType(int equipType) { + this.equipType = equipType; + } + + public int getSwitchLendItemId() { + return this.switchLendItemId; + } + + public void setSwitchLendItemId(int switchLendItemId) { + this.switchLendItemId = switchLendItemId; + } + + public void setLendedItemId(int lendedItemId) { + this.lendedItemId = lendedItemId; + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public void write(Store store) { + store.getIndexes()[19].putFile(this.getArchiveId(), this.getFileId(), this.encode()); + } + + private void loadItemDefinition(Store cache) { + byte[] data = cache.getIndexes()[19].getFile(this.getArchiveId(), this.getFileId()); + if(data != null) { + try { + this.readOpcodeValues(new InputStream(data)); + } catch (RuntimeException var4) { + var4.printStackTrace(); + } + + if(this.notedItemId != -1) { + this.toNote(cache); + } + + if(this.lendedItemId != -1) { + this.toLend(cache); + } + + this.loaded = true; + } + } + + private void toNote(Store store) { + ItemDefinitions realItem = getItemDefinition(store, this.switchNoteItemId); + this.membersOnly = realItem.membersOnly; + this.value = realItem.value; + this.name = realItem.name; + this.stackable = 1; + } + + private void toLend(Store store) { + ItemDefinitions realItem = getItemDefinition(store, this.switchLendItemId); + this.originalModelColors = realItem.originalModelColors; + this.modifiedModelColors = realItem.modifiedModelColors; + this.teamId = realItem.teamId; + this.value = 0; + this.membersOnly = realItem.membersOnly; + this.name = realItem.name; + this.inventoryOptions = new String[5]; + this.groundOptions = realItem.groundOptions; + if(realItem.inventoryOptions != null) { + for(int optionIndex = 0; optionIndex < 4; ++optionIndex) { + this.inventoryOptions[optionIndex] = realItem.inventoryOptions[optionIndex]; + } + } + + this.inventoryOptions[4] = "Discard"; + this.maleEquip1 = realItem.maleEquip1; + this.maleEquip2 = realItem.maleEquip2; + this.femaleEquip1 = realItem.femaleEquip1; + this.femaleEquip2 = realItem.femaleEquip2; + this.maleEquipModelId3 = realItem.maleEquipModelId3; + this.femaleEquipModelId3 = realItem.femaleEquipModelId3; + this.equipType = realItem.equipType; + this.equipSlot = realItem.equipSlot; + } + + public int getArchiveId() { + return this.id >>> 8; + } + + public int getFileId() { + return 0xff & this.id; + } + + public boolean hasSpecialBar() { + if(this.clientScriptData == null) { + return false; + } else { + Object specialBar = this.clientScriptData.get(Integer.valueOf(686)); + return specialBar != null && specialBar instanceof Integer && ((Integer)specialBar).intValue() == 1; + } + } + + public int getRenderAnimId() { + if(this.clientScriptData == null) { + return 1426; + } else { + Object animId = this.clientScriptData.get(Integer.valueOf(644)); + return animId != null && animId instanceof Integer?((Integer)animId).intValue():1426; + } + } + + public int getQuestId() { + if(this.clientScriptData == null) { + return -1; + } else { + System.out.println(this.clientScriptData.toString()); + Object questId = this.clientScriptData.get(Integer.valueOf(861)); + return questId != null && questId instanceof Integer?((Integer)questId).intValue():-1; + } + } + + public HashMap getWearingSkillRequiriments() { + if(this.clientScriptData == null) { + return null; + } else { + HashMap skills = new HashMap(); + int nextLevel = -1; + int nextSkill = -1; + Iterator var5 = this.clientScriptData.keySet().iterator(); + + while(var5.hasNext()) { + int key = ((Integer)var5.next()).intValue(); + Object value = this.clientScriptData.get(Integer.valueOf(key)); + if(!(value instanceof String)) { + if(key == 23) { + skills.put(Integer.valueOf(4), (Integer)value); + skills.put(Integer.valueOf(11), Integer.valueOf(61)); + } else if(key >= 749 && key < 797) { + if(key % 2 == 0) { + nextLevel = ((Integer)value).intValue(); + } else { + nextSkill = ((Integer)value).intValue(); + } + + if(nextLevel != -1 && nextSkill != -1) { + skills.put(Integer.valueOf(nextSkill), Integer.valueOf(nextLevel)); + nextLevel = -1; + nextSkill = -1; + } + } + } + } + + return skills; + } + } + + public void printClientScriptData() { + Iterator key2 = this.clientScriptData.keySet().iterator(); + + while(key2.hasNext()) { + int requiriments = ((Integer)key2.next()).intValue(); + Object value = this.clientScriptData.get(Integer.valueOf(requiriments)); + System.out.println("KEY: " + requiriments + ", VALUE: " + value); + } + + HashMap requiriments1 = this.getWearingSkillRequiriments(); + if(requiriments1 == null) { + System.out.println("null."); + } else { + System.out.println(requiriments1.keySet().size()); + Iterator value1 = requiriments1.keySet().iterator(); + + while(value1.hasNext()) { + int key21 = ((Integer)value1.next()).intValue(); + Object value2 = requiriments1.get(Integer.valueOf(key21)); + System.out.println("SKILL: " + key21 + ", LEVEL: " + value2); + } + + } + } + + private void setDefaultOptions() { + this.groundOptions = new String[]{null, null, "take", null, null}; + this.inventoryOptions = new String[]{null, null, null, null, "drop"}; + } + + private void setDefaultsVariableValules() { + this.name = "null"; + this.maleEquip1 = -1; + this.maleEquip2 = -1; + this.femaleEquip1 = -1; + this.femaleEquip2 = -1; + this.modelZoom = 2000; + this.switchLendItemId = -1; + this.lendedItemId = -1; + this.switchNoteItemId = -1; + this.notedItemId = -1; + this.unknownInt9 = 128; + this.value = 1; + this.maleEquipModelId3 = -1; + this.femaleEquipModelId3 = -1; + this.teamId = -1; + this.equipType = -1; + this.equipSlot = -1; + } + + public byte[] encode() { + OutputStream stream = new OutputStream(); + stream.writeByte(1); + stream.writeBigSmart(this.modelId); + if(!this.name.equals("null") && this.notedItemId == -1) { + stream.writeByte(2); + stream.writeString(this.name); + } + + if(this.modelZoom != 2000) { + stream.writeByte(4); + stream.writeShort(this.modelZoom); + } + + if(this.modelRotation1 != 0) { + stream.writeByte(5); + stream.writeShort(this.modelRotation1); + } + + if(this.modelRotation2 != 0) { + stream.writeByte(6); + stream.writeShort(this.modelRotation2); + } + + int data; + int value; + if(this.modelOffset1 != 0) { + stream.writeByte(7); + data = this.modelOffset1 >> 0; + this.modelOffset1 = data; + value = data; + if(data < 0) { + value = data + 65536; + } + + stream.writeShort(value); + } + + if(this.modelOffset2 != 0) { + stream.writeByte(8); + data = this.modelOffset2 >> 0; + this.modelOffset2 = data; + value = data; + if(data < 0) { + value = data + 65536; + } + + stream.writeShort(value); + } + + if(this.stackable >= 1 && this.notedItemId == -1) { + stream.writeByte(11); + } + + if(this.value != 1 && this.lendedItemId == -1) { + stream.writeByte(12); + stream.writeInt(this.value); + } + + if(this.equipSlot != -1) { + stream.writeByte(13); + stream.writeByte(this.equipSlot); + } + + if(this.equipType != -1) { + stream.writeByte(14); + stream.writeByte(this.equipType); + } + + if(this.membersOnly && this.notedItemId == -1) { + stream.writeByte(16); + } + + if(this.maleEquip1 != -1) { + stream.writeByte(23); + stream.writeBigSmart(this.maleEquip1); + } + + if(this.maleEquip2 != -1) { + stream.writeByte(24); + stream.writeBigSmart(this.maleEquip2); + } + + if(this.femaleEquip1 != -1) { + stream.writeByte(25); + stream.writeBigSmart(this.femaleEquip1); + } + + if(this.femaleEquip2 != -1) { + stream.writeByte(26); + stream.writeBigSmart(this.femaleEquip2); + } + + for(data = 0; data < 4; ++data) { + if(this.groundOptions[data] != null && (data != 2 || !this.groundOptions[data].equals("take"))) { + stream.writeByte(30 + data); + stream.writeString(this.groundOptions[data]); + } + } + + for(data = 0; data < 4; ++data) { + if(this.inventoryOptions[data] != null && (data != 4 || !this.inventoryOptions[data].equals("drop"))) { + stream.writeByte(35 + data); + stream.writeString(this.inventoryOptions[data]); + } + } + + if(this.originalModelColors != null && this.modifiedModelColors != null) { + stream.writeByte(40); + stream.writeByte(this.originalModelColors.length); + + for(data = 0; data < this.originalModelColors.length; ++data) { + stream.writeShort(this.originalModelColors[data]); + stream.writeShort(this.modifiedModelColors[data]); + } + } + + if(this.originalTextureColors != null && this.modifiedTextureColors != null) { + stream.writeByte(41); + stream.writeByte(this.originalTextureColors.length); + + for(data = 0; data < this.originalTextureColors.length; ++data) { + stream.writeShort(this.originalTextureColors[data]); + stream.writeShort(this.modifiedTextureColors[data]); + } + } + + if(this.unknownArray1 != null) { + stream.writeByte(42); + stream.writeByte(this.unknownArray1.length); + + for(data = 0; data < this.unknownArray1.length; ++data) { + stream.writeByte(this.unknownArray1[data]); + } + } + + if(this.unnoted) { + stream.writeByte(65); + } + + if(this.maleEquipModelId3 != -1) { + stream.writeByte(78); + stream.writeBigSmart(this.maleEquipModelId3); + } + + if(this.femaleEquipModelId3 != -1) { + stream.writeByte(79); + stream.writeBigSmart(this.femaleEquipModelId3); + } + + if(this.switchNoteItemId != -1) { + stream.writeByte(97); + stream.writeShort(this.switchNoteItemId); + } + + if(this.notedItemId != -1) { + stream.writeByte(98); + stream.writeShort(this.notedItemId); + } + + if(this.stackIds != null && this.stackAmounts != null) { + for(data = 0; data < this.stackIds.length; ++data) { + if(this.stackIds[data] != 0 || this.stackAmounts[data] != 0) { + stream.writeByte(100 + data); + stream.writeShort(this.stackIds[data]); + stream.writeShort(this.stackAmounts[data]); + } + } + } + + if(this.teamId != 0) { + stream.writeByte(115); + stream.writeByte(this.teamId); + } + + if(this.switchLendItemId != -1) { + stream.writeByte(121); + stream.writeShort(this.switchLendItemId); + } + + if(this.lendedItemId != -1) { + stream.writeByte(122); + stream.writeShort(this.lendedItemId); + } + + if(this.unknownArray2 != null) { + stream.writeByte(132); + stream.writeByte(this.unknownArray2.length); + + for(data = 0; data < this.unknownArray2.length; ++data) { + stream.writeShort(this.unknownArray2[data]); + } + } + + if(this.clientScriptData != null) { + stream.writeByte(249); + stream.writeByte(this.clientScriptData.size()); + Iterator var5 = this.clientScriptData.keySet().iterator(); + + while(var5.hasNext()) { + data = ((Integer)var5.next()).intValue(); + Object value2 = this.clientScriptData.get(Integer.valueOf(data)); + stream.writeByte(value2 instanceof String?1:0); + stream.write24BitInt(data); + if(value2 instanceof String) { + stream.writeString((String)value2); + } else { + stream.writeInt(((Integer)value2).intValue()); + } + } + } + + stream.writeByte(0); + byte[] var6 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(var6, 0, var6.length); + return var6; + } + + public int getInvModelId() { + return this.modelId; + } + + public void setInvModelId(int modelId) { + this.modelId = modelId; + } + + public int getInvModelZoom() { + return this.modelZoom; + } + + public void setInvModelZoom(int modelZoom) { + this.modelZoom = modelZoom; + } + + private final void readValues(InputStream stream, int opcode) { + if(opcode == 1) { + this.modelId = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 2) { + this.name = stream.readString(); + } else if(opcode == 4) { + this.modelZoom = stream.readUnsignedShort(); + } else if(opcode == 5) { + this.modelRotation1 = stream.readUnsignedShort(); + } else if(opcode == 6) { + this.modelRotation2 = stream.readUnsignedShort(); + } else if(opcode == 7) { + this.modelOffset1 = stream.readUnsignedShort(); + if(this.modelOffset1 > 52767) { + //if(this.modelOffset1 > 32767) { + this.modelOffset1 -= 65536; + } + + this.modelOffset1 <<= 0; + } else if(opcode == 8) { + this.modelOffset2 = stream.readUnsignedShort(); + if(this.modelOffset2 > 52767) { + //if(this.modelOffset2 > 32767) { + this.modelOffset2 -= 65536; + } + + this.modelOffset2 <<= 0; + } else if(opcode == 11) { + this.stackable = 1; + } else if(opcode == 12) { + this.value = stream.readInt(); + } else if(opcode == 13) { + this.equipSlot = stream.readUnsignedByte(); + } else if(opcode == 14) { + this.equipType = stream.readUnsignedByte(); + } else if(opcode == 16) { + this.membersOnly = true; + } else if(opcode == 18) { + stream.readUnsignedShortLE(); + } else if(opcode == 23) { + this.maleEquip1 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 24) { + this.maleEquip2 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 25) { + this.femaleEquip1 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 26) { + this.femaleEquip2 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 27) { + stream.readUnsignedByte(); + } else if(opcode >= 30 && opcode < 35) { + this.groundOptions[opcode - 30] = stream.readString(); + } else if(opcode >= 35 && opcode < 40) { + this.inventoryOptions[opcode - 35] = stream.readString(); + } else { + int length; + int index; + if(opcode == 40) { + length = stream.readUnsignedByte(); + this.originalModelColors = new int[length]; + this.modifiedModelColors = new int[length]; + + for(index = 0; index < length; ++index) { + this.originalModelColors[index] = stream.readUnsignedShort(); + this.modifiedModelColors[index] = stream.readUnsignedShort(); + } + } else if(opcode == 41) { + length = stream.readUnsignedByte(); + this.originalTextureColors = new short[length]; + this.modifiedTextureColors = new short[length]; + + for(index = 0; index < length; ++index) { + this.originalTextureColors[index] = (short)stream.readUnsignedShort(); + this.modifiedTextureColors[index] = (short)stream.readUnsignedShort(); + } + } else if(opcode == 42) { + length = stream.readUnsignedByte(); + this.unknownArray1 = new byte[length]; + + for(index = 0; index < length; ++index) { + this.unknownArray1[index] = (byte)stream.readByte(); + } + } else if(opcode == 65) { + this.unnoted = true; + } else if(opcode == 78) { + this.maleEquipModelId3 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 79) { + this.femaleEquipModelId3 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 90) { + this.unknownInt1 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 91) { + this.unknownInt2 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 92) { + this.unknownInt3 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 93) { + this.unknownInt4 = stream.readUnsignedShort();//stream.readBigSmart(); + } else if(opcode == 95) { + this.unknownInt5 = stream.readUnsignedShort(); + } else if(opcode == 96) { + this.unknownInt6 = stream.readUnsignedByte(); + } else if(opcode == 97) { + this.switchNoteItemId = stream.readUnsignedShort(); + } else if(opcode == 98) { + this.notedItemId = stream.readUnsignedShort(); + } else if(opcode >= 100 && opcode < 110) { + if(this.stackIds == null) { + this.stackIds = new int[10]; + this.stackAmounts = new int[10]; + } + + this.stackIds[opcode - 100] = stream.readUnsignedShort(); + this.stackAmounts[opcode - 100] = stream.readUnsignedShort(); + } else if(opcode == 110) { + this.unknownInt7 = stream.readUnsignedShort(); + } else if(opcode == 111) { + this.unknownInt8 = stream.readUnsignedShort(); + } else if(opcode == 112) { + this.unknownInt9 = stream.readUnsignedShort(); + } else if(opcode == 113) { + this.unknownInt10 = stream.readByte(); + } else if(opcode == 114) { + this.unknownInt11 = stream.readByte() * 5; + } else if(opcode == 115) { + this.teamId = stream.readUnsignedByte(); + } else if(opcode == 121) { + this.switchLendItemId = stream.readUnsignedShort(); + } else if(opcode == 122) { + this.lendedItemId = stream.readUnsignedShort(); + } else if(opcode == 125) { + this.unknownInt12 = stream.readByte() << 0; + this.unknownInt13 = stream.readByte() << 0; + this.unknownInt14 = stream.readByte() << 0; + } else if(opcode == 126) { + this.unknownInt15 = stream.readByte() << 0; + this.unknownInt16 = stream.readByte() << 0; + this.unknownInt17 = stream.readByte() << 0; + } else if(opcode == 127) { + this.unknownInt18 = stream.readUnsignedByte(); + this.unknownInt19 = stream.readUnsignedShort(); + } else if(opcode == 128) { + this.unknownInt20 = stream.readUnsignedByte(); + this.unknownInt21 = stream.readUnsignedShort(); + } else if(opcode == 129) { + this.unknownInt20 = stream.readUnsignedByte(); + this.unknownInt21 = stream.readUnsignedShort(); + } else if(opcode == 130) { + this.unknownInt22 = stream.readUnsignedByte(); + this.unknownInt23 = stream.readUnsignedShort(); + } else if(opcode == 132) { + length = stream.readUnsignedByte(); + this.unknownArray2 = new int[length]; + + for(index = 0; index < length; ++index) { + this.unknownArray2[index] = stream.readUnsignedShort(); + } + } else if(opcode == 134) { + stream.readUnsignedByte(); + } else if(opcode == 139) { + this.unknownValue2 = stream.readUnsignedShort(); + } else if(opcode == 140) { + this.unknownValue1 = stream.readUnsignedShort(); + }else if (opcode == 191) { + return; + //int opcode191 = 0; + }else if (opcode == 218) { + return; + //int opcode218 = 0; + }else if (opcode == 219) { + return; + //int opcode219 = 0; + } else if(opcode == 249) { + length = stream.readUnsignedByte(); + if(this.clientScriptData == null) { + this.clientScriptData = new HashMap(length); + } + + for(index = 0; index < length; ++index) { + boolean stringInstance = stream.readUnsignedByte() == 1; + int key = stream.read24BitInt(); + Object value = stringInstance?stream.readString():Integer.valueOf(stream.readInt()); + this.clientScriptData.put(Integer.valueOf(key), value); + } + //} + } else { + throw new RuntimeException("MISSING OPCODE " + opcode + " FOR ITEM " + this.id); + } + } + + } + + private void readOpcodeValues(InputStream stream) { + while(true) { + int opcode = stream.readUnsignedByte(); + if(opcode == 0) { + return; + } + + this.readValues(stream, opcode); + } + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return this.name; + } + + public void resetTextureColors() { + this.originalTextureColors = null; + this.modifiedTextureColors = null; + } + + public boolean isWearItem() { + return this.equipSlot != -1; + } + + public boolean isMembersOnly() { + return this.membersOnly; + } + + public void changeTextureColor(short originalModelColor, short modifiedModelColor) { + if(this.originalTextureColors != null) { + for(int newOriginalModelColors = 0; newOriginalModelColors < this.originalTextureColors.length; ++newOriginalModelColors) { + if(this.originalTextureColors[newOriginalModelColors] == originalModelColor) { + this.modifiedTextureColors[newOriginalModelColors] = modifiedModelColor; + return; + } + } + + short[] var5 = Arrays.copyOf(this.originalTextureColors, this.originalTextureColors.length + 1); + short[] newModifiedModelColors = Arrays.copyOf(this.modifiedTextureColors, this.modifiedTextureColors.length + 1); + var5[var5.length - 1] = originalModelColor; + newModifiedModelColors[newModifiedModelColors.length - 1] = modifiedModelColor; + this.originalTextureColors = var5; + this.modifiedTextureColors = newModifiedModelColors; + } else { + this.originalTextureColors = new short[]{originalModelColor}; + this.modifiedTextureColors = new short[]{modifiedModelColor}; + } + + } + + public void resetModelColors() { + this.originalModelColors = null; + this.modifiedModelColors = null; + } + + public void changeModelColor(int originalModelColor, int modifiedModelColor) { + if(this.originalModelColors != null) { + for(int newOriginalModelColors = 0; newOriginalModelColors < this.originalModelColors.length; ++newOriginalModelColors) { + if(this.originalModelColors[newOriginalModelColors] == originalModelColor) { + this.modifiedModelColors[newOriginalModelColors] = modifiedModelColor; + return; + } + } + + int[] var5 = Arrays.copyOf(this.originalModelColors, this.originalModelColors.length + 1); + int[] newModifiedModelColors = Arrays.copyOf(this.modifiedModelColors, this.modifiedModelColors.length + 1); + var5[var5.length - 1] = originalModelColor; + newModifiedModelColors[newModifiedModelColors.length - 1] = modifiedModelColor; + this.originalModelColors = var5; + this.modifiedModelColors = newModifiedModelColors; + } else { + this.originalModelColors = new int[]{originalModelColor}; + this.modifiedModelColors = new int[]{modifiedModelColor}; + } + + } + + public String[] getGroundOptions() { + return this.groundOptions; + } + + public String[] getInventoryOptions() { + return this.inventoryOptions; + } + + public int getEquipSlot() { + return this.equipSlot; + } + + public int getEquipType() { + return this.equipType; + } + + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException var2) { + var2.printStackTrace(); + return null; + } + } + + public String toString() { + return String.valueOf(this.id) + " - " + this.name; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/npcs/NPCDefinitions.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/npcs/NPCDefinitions.java new file mode 100644 index 000000000..3cc5a1b49 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/npcs/NPCDefinitions.java @@ -0,0 +1,1252 @@ +package com.alex.loaders.npcs; + +import com.alex.io.InputStream; +import com.alex.io.OutputStream; +import com.alex.store.Store; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; + +public final class NPCDefinitions implements Cloneable { + private static final ConcurrentHashMap npcDefinitions = new ConcurrentHashMap(); + public boolean loaded; + public int id; + //public HashMap parameters; + public int unknownInt13; + public int unknownInt6; + public int unknownInt15; + public byte respawnDirection; + public int size = 1; + public int[][] unknownArray3; + public boolean unknownBoolean2; + public int unknownInt9; + public int unknownInt4; + public int[] unknownArray2; + public int unknownInt7; + public int renderEmote; + public boolean unknownBoolean5 = false; + public int unknownInt20; + public byte unknownByte1; + public boolean unknownBoolean3; + public int unknownInt3; + public byte unknownByte2; + public boolean unknownBoolean6; + public boolean unknownBoolean4; + public int[] originalModelColors; + public int combatLevel; + public byte[] unknownArray1; + public short unknownShort1; + public boolean unknownBoolean1; + public int npcHeight; + public String name; + public int[] modifiedTextureColors; + public byte walkMask; + public int[] modelIds; + public int unknownInt1; + public int unknownInt21; + public int unknownInt11; + public int unknownInt17; + public int unknownInt14; + public int unknownInt12; + public int unknownInt8; + public int headIcons; + public int unknownInt19; + public int[] originalTextureColors; + public int[][] anIntArrayArray882; + public int unknownInt10; + public int[] unknownArray4; + public int unknownInt5; + public int unknownInt16; + public boolean isVisibleOnMap; + public int[] npcChatHeads; + public short unknownShort2; + public String[] options; + public int[] modifiedModelColors; + public int unknownInt2; + public int npcWidth; + public int npcId; + public int unknownInt18; + public boolean unknownBoolean7; + public int[] unknownArray5; + public HashMap clientScriptData; + public int anInt833; + public int anInt836; + public int anInt837; + public int[][] anIntArrayArray840; + public boolean aBoolean841; + public int anInt842; + public int bConfig; + public int[] transformTo; + public int anInt846; + public boolean aBoolean849 = false; + public int anInt850; + public byte aByte851; + public boolean aBoolean852; + public int anInt853; + public byte aByte854; + public boolean aBoolean856; + public boolean aBoolean857; + public short[] aShortArray859; + public byte[] aByteArray861; + public short aShort862; + public boolean aBoolean863; + public int anInt864; + public short[] aShortArray866; + public int anInt869; + public int anInt870; + public int anInt871; + public int anInt872; + public int anInt874; + public int anInt875; + public int anInt876; + public int anInt879; + public short[] aShortArray880; + public int anInt884; + public int[] anIntArray885; + public int config; + public int anInt889; + public int[] anIntArray892; + public short aShort894; + public short[] aShortArray896; + public int anInt897; + public int anInt899; + public int anInt901; + public boolean aBoolean3190; + private byte[] aByteArray1293; + private byte[] aByteArray12930; + private int[] anIntArray2930; + + public static final NPCDefinitions getNPCDefinitions(int id, Store store) { + NPCDefinitions def = (NPCDefinitions)npcDefinitions.get(Integer.valueOf(id)); + if(def == null) { + def = new NPCDefinitions(id); + def.method694(); + byte[] data = store.getIndexes()[18].getFile(id >>> 134238215, id & 127); + if(data != null) { + def.readValueLoop(new InputStream(data)); + } + + npcDefinitions.put(Integer.valueOf(id), def); + } + + return def; + } + + public static NPCDefinitions getNPCDefinition(Store cache, int npcId) { + return getNPCDefinition(cache, npcId, true); + } + + public static NPCDefinitions getNPCDefinition(Store cache, int npcId, boolean load) { + return new NPCDefinitions(cache, npcId, load); + } + + public NPCDefinitions(Store cache, int id, boolean load) { + this.id = id; + this.setDefaultVariableValues(); + this.setDefaultOptions(); + if(load) { + this.loadNPCDefinition(cache); + } + + } + + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException var2) { + var2.printStackTrace(); + return null; + } + } + + private void setDefaultOptions() { + this.options = new String[]{"Talk-to", null, null, null, null}; + } + + private void setDefaultVariableValues() { + this.name = "null"; + this.combatLevel = 0; + this.isVisibleOnMap = true; + this.renderEmote = -1; + this.respawnDirection = 7; + //this.size = 1; + this.unknownInt9 = -1; + this.unknownInt4 = -1; + this.unknownInt15 = -1; + this.unknownInt7 = -1; + this.unknownInt3 = 32; + this.unknownInt6 = -1; + this.unknownInt1 = 0; + this.walkMask = 0; + this.unknownInt20 = 255; + this.unknownInt11 = -1; + this.unknownBoolean3 = true; + this.unknownShort1 = 0; + this.unknownInt8 = -1; + this.unknownByte1 = -96; + this.unknownInt12 = 0; + this.unknownInt17 = -1; + this.unknownBoolean4 = true; + this.unknownInt21 = -1; + this.unknownInt14 = -1; + this.unknownInt13 = -1; + this.npcHeight = 128; + this.headIcons = -1; + this.unknownBoolean6 = false; + this.unknownInt5 = -1; + this.unknownByte2 = -16; + this.unknownBoolean1 = false; + this.unknownInt16 = -1; + this.unknownInt10 = -1; + this.unknownBoolean2 = true; + this.unknownInt19 = -1; + this.npcWidth = 128; + this.unknownShort2 = 0; + this.unknownInt2 = 0; + this.unknownInt18 = -1; + } + + private void loadNPCDefinition(Store cache) { + byte[] data = cache.getIndexes()[18].getFile(this.getArchiveId(), this.getFileId()); + if(data != null) { + try { + this.readOpcodeValues(new InputStream(data)); + } catch (RuntimeException var4) { + var4.printStackTrace(); + } + + this.loaded = true; + } + + } + + private void readOpcodeValues(InputStream stream) { + while(true) { + int opcode = stream.readUnsignedByte(); + if(opcode == 0) { + return; + } + + this.readValues(stream, opcode); + } + } + + public int getArchiveId() { + return this.id >>> 134238215; + } + + public int getFileId() { + return 127 & this.id; + } + + public void write(Store store) { + store.getIndexes()[18].putFile(this.getArchiveId(), this.getFileId(), this.encode()); + } + + public void method694() { + if(this.modelIds == null) { + this.modelIds = new int[0]; + } + + } + + private void readValueLoop(InputStream stream) { + while(true) { + int opcode = stream.readUnsignedByte(); + if(opcode == 0) { + return; + } + + this.readValues2(stream, opcode); + } + } + + private void readValues2(InputStream stream, int opcode) { + if (opcode != 1) { + if (opcode == 2) + name = stream.readString(); + else if ((opcode ^ 0xffffffff) != -13) { + if (opcode >= 30 && (opcode ^ 0xffffffff) > -36) { + options[opcode - 30] = stream.readString(); + if (options[-30 + opcode].equalsIgnoreCase("Hidden")) + options[-30 + opcode] = null; + } else if ((opcode ^ 0xffffffff) != -41) { + if (opcode == 41) { + int i = stream.readUnsignedByte(); + aShortArray880 = new short[i]; + aShortArray866 = new short[i]; + for (int i_54_ = 0; (i_54_ ^ 0xffffffff) > (i ^ 0xffffffff); i_54_++) { + aShortArray880[i_54_] = (short) stream.readUnsignedShort(); + aShortArray866[i_54_] = (short) stream.readUnsignedShort(); + } + } else if (opcode == 44) { + int i_24_ = (short) stream.readUnsignedShort(); + int i_25_ = 0; + for (int i_26_ = i_24_; i_26_ > 0; i_26_ >>= 1) + i_25_++; + // aByteArray12930 = new byte[i_25_]; + byte i_27_ = 0; + for (int i_28_ = 0; i_28_ < i_25_; i_28_++) { + if ((i_24_ & 1 << i_28_) > 0) { + // aByteArray12930[i_28_] = i_27_; + i_27_++; + } + // aByteArray12930[i_28_] = (byte) -1; + } + } else if (45 == opcode) { + int i_29_ = (short) stream.readUnsignedShort(); + int i_30_ = 0; + for (int i_31_ = i_29_; i_31_ > 0; i_31_ >>= 1) + i_30_++; + // aByteArray1293 = new byte[i_30_]; + byte i_32_ = 0; + for (int i_33_ = 0; i_33_ < i_30_; i_33_++) { + if ((i_29_ & 1 << i_33_) > 0) { + // aByteArray1293[i_33_] = i_32_; + i_32_++; + } + // aByteArray1293[i_33_] = (byte) -1; + } + } else if ((opcode ^ 0xffffffff) == -43) { + int i = stream.readUnsignedByte(); + aByteArray861 = new byte[i]; + for (int i_55_ = 0; i > i_55_; i_55_++) + aByteArray861[i_55_] = (byte) stream.readByte(); + } else if ((opcode ^ 0xffffffff) != -61) { + if (opcode == 93) + isVisibleOnMap = false; + else if ((opcode ^ 0xffffffff) == -96) + combatLevel = stream.readUnsignedShort(); + else if (opcode != 97) { + if ((opcode ^ 0xffffffff) == -99) + anInt899 = stream.readUnsignedShort(); + else if ((opcode ^ 0xffffffff) == -100) + aBoolean863 = true; + else if (opcode == 100) + anInt869 = stream.readByte(); + else if ((opcode ^ 0xffffffff) == -102) + anInt897 = stream.readByte() * 5; + else if ((opcode ^ 0xffffffff) == -103) + headIcons = stream.readUnsignedShort(); + else if (opcode != 103) { + if (opcode == 106 || opcode == 118) { + bConfig = stream.readUnsignedShort(); + if (bConfig == 65535) + bConfig = -1; + config = stream.readUnsignedShort(); + if (config == 65535) + config = -1; + int i = -1; + if ((opcode ^ 0xffffffff) == -119) { + i = stream.readUnsignedShort(); + if ((i ^ 0xffffffff) == -65536) + i = -1; + } + int i_56_ = stream.readUnsignedByte(); + transformTo = new int[2 + i_56_]; + for (int i_57_ = 0; i_56_ >= i_57_; i_57_++) { + transformTo[i_57_] = stream.readUnsignedShort(); + if (transformTo[i_57_] == 65535) + transformTo[i_57_] = -1; + } + transformTo[i_56_ - -1] = i; + } else if ((opcode ^ 0xffffffff) != -108) { + if ((opcode ^ 0xffffffff) == -110) + aBoolean852 = false; + else if ((opcode ^ 0xffffffff) != -112) { + if (opcode != 113) { + if (opcode == 114) { + aByte851 = (byte) (stream.readByte()); + aByte854 = (byte) (stream.readByte()); + } else if (opcode == 115) { + stream.readUnsignedByte(); + stream.readUnsignedByte(); + } else if ((opcode ^ 0xffffffff) != -120) { + if (opcode != 121) { + if ((opcode ^ 0xffffffff) != -123) { + if (opcode == 123) + anInt846 = (stream.readUnsignedShort()); + else if (opcode != 125) { + if (opcode == 127) + renderEmote = (stream.readUnsignedShort()); + else if ((opcode ^ 0xffffffff) == -129) + stream.readUnsignedByte(); + else if (opcode != 134) { + if (opcode == 135) { + anInt833 = stream.readUnsignedByte(); + anInt874 = stream.readUnsignedShort(); + } else if (opcode != 136) { + if (opcode != 137) { + if (opcode != 138) { + if ((opcode ^ 0xffffffff) != -140) { + if (opcode == 140) + anInt850 = stream.readUnsignedByte(); + else if (opcode == 141) + aBoolean849 = true; + else if ((opcode ^ 0xffffffff) != -143) { + if (opcode == 143) + aBoolean856 = true; + else if ((opcode ^ 0xffffffff) <= -151 && opcode < 155) { + options[opcode - 150] = stream.readString(); + if (options[opcode - 150].equalsIgnoreCase("Hidden")) + options[opcode + -150] = null; + } else if ((opcode ^ 0xffffffff) == -161) { + int i = stream.readUnsignedByte(); + anIntArray885 = new int[i]; + for (int i_58_ = 0; i > i_58_; i_58_++) + anIntArray885[i_58_] = stream.readUnsignedShort(); + + // all + // added + // after + // here + } else if (opcode == 155) { + int aByte821 = stream.readByte(); + int aByte824 = stream.readByte(); + int aByte843 = stream.readByte(); + int aByte855 = stream.readByte(); + } else if (opcode == 158) { + byte aByte833 = (byte) 1; + } else if (opcode == 159) { + byte aByte833 = (byte) 0; + } else if (opcode == 162) { // added + // opcode + // aBoolean3190 + // = + // true; + } else if (opcode == 163) { // added + // opcode + int anInt864 = stream.readUnsignedByte(); + } else if (opcode == 164) { + int anInt848 = stream.readUnsignedShort(); + int anInt837 = stream.readUnsignedShort(); + } else if (opcode == 165) { + int anInt847 = stream.readUnsignedByte(); + } else if (opcode == 168) { + int anInt828 = stream.readUnsignedByte(); + } else if (opcode >= 170 && opcode < 176) { + // if + // (null + // == + // anIntArray2930) + // { + // anIntArray2930 + // = + // new + // int[6]; + // Arrays.fill(anIntArray2930, + // -1); + // } + int i_44_ = (short) stream.readUnsignedShort(); + if (i_44_ == 65535) + i_44_ = -1; + // anIntArray2930[opcode + // - + // 170] + // = + // i_44_; + } else if (opcode == 12) { + size = stream.readUnsignedByte(); + } else if (opcode == 249) { + int i = stream.readUnsignedByte(); + if (clientScriptData == null) { + clientScriptData = new HashMap(i); + } + for (int i_60_ = 0; i > i_60_; i_60_++) { + boolean stringInstance = stream.readUnsignedByte() == 1; + int key = stream.read24BitInt(); + Object value; + if (stringInstance) + value = stream.readString(); + else + value = stream.readInt(); + clientScriptData.put(key, value); + } + } + } else + anInt870 = stream.readUnsignedShort(); + } else + anInt879 = stream.readBigSmart(); + } else + anInt901 = stream.readBigSmart(); + } else + anInt872 = stream.readUnsignedShort(); + } else { + anInt837 = stream.readUnsignedByte(); + anInt889 = stream.readUnsignedShort(); + } + } else { + anInt876 = (stream.readUnsignedShort()); + if (anInt876 == 65535) + anInt876 = -1; + anInt842 = (stream.readUnsignedShort()); + if (anInt842 == 65535) + anInt842 = -1; + anInt884 = (stream.readUnsignedShort()); + if ((anInt884 ^ 0xffffffff) == -65536) + anInt884 = -1; + anInt871 = (stream.readUnsignedShort()); + if ((anInt871 ^ 0xffffffff) == -65536) + anInt871 = -1; + anInt875 = (stream.readUnsignedByte()); + } + } else + respawnDirection = (byte) (stream.readByte()); + } else + anInt836 = (stream.readBigSmart()); + } else { + anIntArrayArray840 = (new int[modelIds.length][]); + int i = (stream.readUnsignedByte()); + for (int i_62_ = 0; ((i_62_ ^ 0xffffffff) > (i ^ 0xffffffff)); i_62_++) { + int i_63_ = (stream.readUnsignedByte()); + int[] is = (anIntArrayArray840[i_63_] = (new int[3])); + is[0] = (stream.readByte()); + is[1] = (stream.readByte()); + is[2] = (stream.readByte()); + } + } + } else + walkMask = (byte) (stream.readByte()); + } else { + aShort862 = (short) (stream.readUnsignedShort()); + aShort894 = (short) (stream.readUnsignedShort()); + } + } else + aBoolean857 = false; + } else + aBoolean841 = false; + } else + anInt853 = stream.readUnsignedShort(); + } else + anInt864 = stream.readUnsignedShort(); + } else { + int i = stream.readUnsignedByte(); + anIntArray892 = new int[i]; + for (int i_64_ = 0; (i_64_ ^ 0xffffffff) > (i ^ 0xffffffff); i_64_++) + anIntArray892[i_64_] = stream.readBigSmart(); + } + } else { + int i = stream.readUnsignedByte(); + aShortArray859 = new short[i]; + aShortArray896 = new short[i]; + for (int i_65_ = 0; (i ^ 0xffffffff) < (i_65_ ^ 0xffffffff); i_65_++) { + aShortArray896[i_65_] = (short) stream.readUnsignedShort(); + aShortArray859[i_65_] = (short) stream.readUnsignedShort(); + } + } + //} else + //size = stream.readUnsignedByte(); + } else { + int i = stream.readUnsignedByte(); + modelIds = new int[i]; + for (int i_66_ = 0; i_66_ < i; i_66_++) { + modelIds[i_66_] = stream.readBigSmart(); + if ((modelIds[i_66_] ^ 0xffffffff) == -65536) + modelIds[i_66_] = -1; + } + } + } + } + + private void readValues(InputStream stream, int opcode) { + int i; + int i_66_; + if(opcode != 1) { + if(opcode == 2) { + this.name = stream.readString(); + } else if(~opcode != -13) { + if(opcode >= 30 && ~opcode > -36) { + this.options[opcode - 30] = stream.readString(); + if(this.options[-30 + opcode].equalsIgnoreCase("Hidden")) { + this.options[-30 + opcode] = null; + } + } else if(~opcode != -41) { + if(opcode == 41) { + i = stream.readUnsignedByte(); + this.aShortArray880 = new short[i]; + this.aShortArray866 = new short[i]; + + for(i_66_ = 0; ~i_66_ > ~i; ++i_66_) { + this.aShortArray880[i_66_] = (short)stream.readUnsignedShort(); + this.aShortArray866[i_66_] = (short)stream.readUnsignedShort(); + } + } else { + int i_63_; + int is; + short var8; + byte var9; + if(opcode == 44) { + var8 = (short)stream.readUnsignedShort(); + i_66_ = 0; + + for(i_63_ = var8; i_63_ > 0; i_63_ >>= 1) { + ++i_66_; + } + + this.aByteArray12930 = new byte[i_66_]; + var9 = 0; + + for(is = 0; is < i_66_; ++is) { + if((var8 & 1 << is) > 0) { + this.aByteArray12930[is] = var9++; + } else { + this.aByteArray12930[is] = -1; + } + } + } else if(45 == opcode) { + var8 = (short)stream.readUnsignedShort(); + i_66_ = 0; + + for(i_63_ = var8; i_63_ > 0; i_63_ >>= 1) { + ++i_66_; + } + + this.aByteArray1293 = new byte[i_66_]; + var9 = 0; + + for(is = 0; is < i_66_; ++is) { + if((var8 & 1 << is) > 0) { + this.aByteArray1293[is] = var9++; + } else { + this.aByteArray1293[is] = -1; + } + } + } else if(~opcode == -43) { + i = stream.readUnsignedByte(); + this.aByteArray861 = new byte[i]; + + for(i_66_ = 0; i > i_66_; ++i_66_) { + this.aByteArray861[i_66_] = (byte)stream.readByte(); + } + } else if(~opcode != -61) { + if(opcode == 93) { + this.isVisibleOnMap = false; + } else if(~opcode == -96) { + this.combatLevel = stream.readUnsignedShort(); + } else if(opcode != 97) { + if(~opcode == -99) { + this.anInt899 = stream.readUnsignedShort(); + } else if(~opcode == -100) { + this.aBoolean863 = true; + } else if(opcode == 100) { + this.anInt869 = stream.readByte(); + } else if(~opcode == -102) { + this.anInt897 = stream.readByte() * 5; + } else if(~opcode == -103) { + this.headIcons = stream.readUnsignedShort(); + } else if(opcode != 103) { + if(opcode != 106 && opcode != 118) { + if(~opcode != -108) { + if(~opcode == -110) { + this.aBoolean852 = false; + } else if(~opcode != -112) { + if(opcode != 113) { + if(opcode == 114) { + this.aByte851 = (byte)stream.readByte(); + this.aByte854 = (byte)stream.readByte(); + } else if(opcode == 115) { + stream.readUnsignedByte(); + stream.readUnsignedByte(); + } else if(~opcode != -120) { + if(opcode != 121) { + if(~opcode != -123) { + if(opcode == 123) { + this.anInt846 = stream.readUnsignedShort(); + } else if(opcode != 125) { + if(opcode == 127) { + this.renderEmote = stream.readUnsignedShort(); + } else if(~opcode == -129) { + stream.readUnsignedByte(); + } else if(opcode != 134) { + if(opcode == 135) { + this.anInt833 = stream.readUnsignedByte(); + this.anInt874 = stream.readUnsignedShort(); + } else if(opcode != 136) { + if(opcode != 137) { + if(opcode != 138) { + if(~opcode != -140) { + if(opcode == 140) { + this.anInt850 = stream.readUnsignedByte(); + } else if(opcode == 141) { + this.aBoolean849 = true; + } else if(~opcode != -143) { + if(opcode == 143) { + this.aBoolean856 = true; + } else if(~opcode <= -151 && opcode < 155) { + this.options[opcode - 150] = stream.readString(); + if(this.options[opcode - 150].equalsIgnoreCase("Hidden")) { + this.options[opcode + -150] = null; + } + } else if(~opcode == -161) { + i = stream.readUnsignedByte(); + this.anIntArray885 = new int[i]; + + for(i_66_ = 0; i > i_66_; ++i_66_) { + this.anIntArray885[i_66_] = stream.readUnsignedShort(); + } + } else if(opcode == 155) { + i = stream.readByte(); + i_66_ = stream.readByte(); + i_63_ = stream.readByte(); + is = stream.readByte(); + } else { + boolean var10; + if(opcode == 158) { + var10 = true; + } else if(opcode == 159) { + var10 = false; + } else if(opcode == 162) { + this.aBoolean3190 = true; + } else if(opcode == 163) { + i = stream.readUnsignedByte(); + } else if(opcode == 164) { + i = stream.readUnsignedShort(); + i_66_ = stream.readUnsignedShort(); + } else if(opcode == 165) { + i = stream.readUnsignedByte(); + } else if(opcode == 168) { + i = stream.readUnsignedByte(); + } else if(opcode >= 170 && opcode < 176) { + if(this.anIntArray2930 == null) { + this.anIntArray2930 = new int[6]; + Arrays.fill(this.anIntArray2930, -1); + } + + var8 = (short)stream.readUnsignedShort(); + if(var8 == '\uffff') { + var8 = -1; + } + + this.anIntArray2930[opcode - 170] = var8; + } else if(opcode == 249) { + i = stream.readUnsignedByte(); + if(this.clientScriptData == null) { + this.clientScriptData = new HashMap(i); + } + + for(i_66_ = 0; i > i_66_; ++i_66_) { + boolean var12 = stream.readUnsignedByte() == 1; + is = stream.read24BitInt(); + Object value; + if(var12) { + value = stream.readString(); + } else { + value = Integer.valueOf(stream.readInt()); + } + + this.clientScriptData.put(Integer.valueOf(is), value); + } + } + } + } else { + this.anInt870 = stream.readUnsignedShort(); + } + } else { + this.anInt879 = stream.readBigSmart(); + } + } else { + this.anInt901 = stream.readBigSmart(); + } + } else { + this.anInt872 = stream.readUnsignedShort(); + } + } else { + this.anInt837 = stream.readUnsignedByte(); + this.anInt889 = stream.readUnsignedShort(); + } + } else { + this.anInt876 = stream.readUnsignedShort(); + if(this.anInt876 == '\uffff') { + this.anInt876 = -1; + } + + this.anInt842 = stream.readUnsignedShort(); + if(this.anInt842 == '\uffff') { + this.anInt842 = -1; + } + + this.anInt884 = stream.readUnsignedShort(); + if(~this.anInt884 == -65536) { + this.anInt884 = -1; + } + + this.anInt871 = stream.readUnsignedShort(); + if(~this.anInt871 == -65536) { + this.anInt871 = -1; + } + + this.anInt875 = stream.readUnsignedByte(); + } + } else { + this.respawnDirection = (byte)stream.readByte(); + } + } else { + this.anInt836 = stream.readBigSmart(); + } + } else { + this.anIntArrayArray840 = new int[this.modelIds.length][]; + i = stream.readUnsignedByte(); + + for(i_66_ = 0; ~i_66_ > ~i; ++i_66_) { + i_63_ = stream.readUnsignedByte(); + int[] var11 = this.anIntArrayArray840[i_63_] = new int[3]; + var11[0] = stream.readByte(); + var11[1] = stream.readByte(); + var11[2] = stream.readByte(); + } + } + } else { + this.walkMask = (byte)stream.readByte(); + } + } else { + this.aShort862 = (short)stream.readUnsignedShort(); + this.aShort894 = (short)stream.readUnsignedShort(); + } + } else { + this.aBoolean857 = false; + } + } else { + this.aBoolean841 = false; + } + } else { + this.bConfig = stream.readUnsignedShort(); + if(this.bConfig == '\uffff') { + this.bConfig = -1; + } + + this.config = stream.readUnsignedShort(); + if(this.config == '\uffff') { + this.config = -1; + } + + i = -1; + if(~opcode == -119) { + i = stream.readUnsignedShort(); + if(~i == -65536) { + i = -1; + } + } + + i_66_ = stream.readUnsignedByte(); + this.transformTo = new int[2 + i_66_]; + + for(i_63_ = 0; i_66_ >= i_63_; ++i_63_) { + this.transformTo[i_63_] = stream.readUnsignedShort(); + if(this.transformTo[i_63_] == '\uffff') { + this.transformTo[i_63_] = -1; + } + } + + this.transformTo[i_66_ - -1] = i; + } + } else { + this.anInt853 = stream.readUnsignedShort(); + } + } else { + this.anInt864 = stream.readUnsignedShort(); + } + } else { + i = stream.readUnsignedByte(); + this.anIntArray892 = new int[i]; + + for(i_66_ = 0; ~i_66_ > ~i; ++i_66_) { + this.anIntArray892[i_66_] = stream.readBigSmart(); + } + } + } + } else { + i = stream.readUnsignedByte(); + this.aShortArray859 = new short[i]; + this.aShortArray896 = new short[i]; + + for(i_66_ = 0; ~i < ~i_66_; ++i_66_) { + this.aShortArray896[i_66_] = (short)stream.readUnsignedShort(); + this.aShortArray859[i_66_] = (short)stream.readUnsignedShort(); + } + } + } else { + this.size = stream.readUnsignedByte(); + } + } else { + int i1 = stream.readUnsignedByte(); + modelIds = new int[i1]; + for (int i_69_ = 0; i_69_ < i1; i_69_++) { + modelIds[i_69_] = stream.readUnsignedShort(); + if ((modelIds[i_69_] ^ 0xffffffff) == -65536) + modelIds[i_69_] = -1; + } + } + + } + + public static final void clearNPCDefinitions() { + npcDefinitions.clear(); + } + + public NPCDefinitions(int id) { + this.id = id; + this.anInt842 = -1; + this.bConfig = -1; + this.anInt837 = -1; + this.anInt846 = -1; + this.anInt853 = 32; + this.combatLevel = -1; + this.anInt836 = -1; + this.name = "null"; + this.anInt869 = 0; + this.walkMask = 0; + this.anInt850 = 255; + this.anInt871 = -1; + this.aBoolean852 = true; + this.aShort862 = 0; + this.anInt876 = -1; + this.aByte851 = -96; + this.anInt875 = 0; + this.anInt872 = -1; + this.renderEmote = -1; + this.respawnDirection = 7; + this.aBoolean857 = true; + this.anInt870 = -1; + this.anInt874 = -1; + this.anInt833 = -1; + this.anInt864 = 128; + this.headIcons = -1; + this.aBoolean856 = false; + this.config = -1; + this.aByte854 = -16; + this.aBoolean863 = false; + this.isVisibleOnMap = true; + this.anInt889 = -1; + this.anInt884 = -1; + this.aBoolean841 = true; + this.anInt879 = -1; + this.anInt899 = 128; + this.aShort894 = 0; + this.options = new String[5]; + this.anInt897 = 0; + this.anInt901 = -1; + } + + public String toString() { + return this.id + " - " + this.name; + } + + public boolean hasMarkOption() { + String[] var4 = this.options; + int var3 = this.options.length; + + for(int var2 = 0; var2 < var3; ++var2) { + String option = var4[var2]; + if(option != null && option.equalsIgnoreCase("mark")) { + return true; + } + } + + return false; + } + + public boolean hasOption(String op) { + String[] var5 = this.options; + int var4 = this.options.length; + + for(int var3 = 0; var3 < var4; ++var3) { + String option = var5[var3]; + if(option != null && option.equalsIgnoreCase(op)) { + return true; + } + } + + return false; + } + + public byte getRespawnDirection() { + return this.respawnDirection; + } + + public void setRespawnDirection(byte respawnDirection) { + this.respawnDirection = respawnDirection; + } + + public int getSize() { + return this.size; + } + + public void setSize(int size) { + this.size = size; + } + + public int getRenderEmote() { + return this.renderEmote; + } + + public void setRenderEmote(int renderEmote) { + this.renderEmote = renderEmote; + } + + public boolean isVisibleOnMap() { + return this.isVisibleOnMap; + } + + public void setVisibleOnMap(boolean isVisibleOnMap) { + this.isVisibleOnMap = isVisibleOnMap; + } + + public String[] getOptions() { + return this.options; + } + + public void setOptions(String[] options) { + this.options = options; + } + + public int getNpcId() { + return this.npcId; + } + + public void setNpcId(int npcId) { + this.npcId = npcId; + } + + public boolean hasAttackOption() { + if(this.id == 14899) { + return true; + } else { + String[] var4 = this.options; + int var3 = this.options.length; + + for(int var2 = 0; var2 < var3; ++var2) { + String option = var4[var2]; + if(option != null && option.equalsIgnoreCase("attack")) { + return true; + } + } + + return false; + } + } + + public byte[] encode() { + OutputStream stream = new OutputStream(); + stream.writeByte(1); + stream.writeByte(this.modelIds.length); + + int data; + for(data = 0; data < this.modelIds.length; ++data) { + stream.writeBigSmart(this.modelIds[data]); + } + + if(!this.name.equals("null")) { + stream.writeByte(2); + stream.writeString(this.name); + } + + //if(this.size != 1) { + if(this.size > 1) { + stream.writeByte(12); + stream.writeByte(this.size); + } + + for(data = 0; data < this.options.length; ++data) { + if(this.options[data] != null && this.options[data] != "Hidden") { + stream.writeByte(30 + data); + stream.writeString(this.options[data]); + } + } + + if(this.originalModelColors != null && this.modifiedModelColors != null) { + stream.writeByte(40); + stream.writeByte(this.originalModelColors.length); + + for(data = 0; data < this.originalModelColors.length; ++data) { + stream.writeShort(this.originalModelColors[data]); + stream.writeShort(this.modifiedModelColors[data]); + } + } + + if(this.originalTextureColors != null && this.modifiedTextureColors != null) { + stream.writeByte(41); + stream.writeByte(this.originalTextureColors.length); + + for(data = 0; data < this.originalTextureColors.length; ++data) { + stream.writeShort(this.originalTextureColors[data]); + stream.writeShort(this.modifiedTextureColors[data]); + } + } + + if(this.unknownArray1 != null) { + stream.writeByte(42); + stream.writeByte(this.unknownArray1.length); + + for(data = 0; data < this.unknownArray1.length; ++data) { + stream.writeByte(this.unknownArray1[data]); + } + } + + if(this.npcChatHeads != null) { + stream.writeByte(60); + stream.writeByte(this.npcChatHeads.length); + + for(data = 0; data < this.npcChatHeads.length; ++data) { + stream.writeBigSmart(this.npcChatHeads[data]); + } + } + + if(!this.isVisibleOnMap) { + stream.writeByte(93); + } + + //if(this.combatLevel != 0) { + if(this.combatLevel > -1) { + stream.writeByte(95); + stream.writeShort(this.combatLevel); + } + + if(this.npcHeight != 0) { + stream.writeByte(97); + stream.writeShort(this.npcHeight); + } + + if(this.npcWidth != 0) { + stream.writeByte(98); + stream.writeShort(this.npcWidth); + } + + if(this.unknownBoolean1) { + stream.writeByte(99); + } + + if(this.unknownInt1 != 0) { + stream.writeByte(100); + stream.writeByte(this.unknownInt1); + } + + if(this.unknownInt2 != 0) { + stream.writeByte(101); + stream.writeByte(this.unknownInt2 / 5); + } + + if(this.headIcons != 0) { + stream.writeByte(102); + stream.writeShort(this.headIcons); + } + + if(this.walkMask != -1) { + stream.writeByte(119); + stream.writeByte(this.walkMask); + } + + if(this.respawnDirection != 7) { + stream.writeByte(125); + stream.writeByte(this.respawnDirection); + } + + if(this.renderEmote != -1) { + stream.writeByte(127); + stream.writeShort(this.renderEmote); + } + + if(this.clientScriptData != null) { + stream.writeByte(249); + stream.writeByte(this.clientScriptData.size()); + Iterator var6 = this.clientScriptData.keySet().iterator(); + + while(var6.hasNext()) { + int key = ((Integer)var6.next()).intValue(); + Object value = this.clientScriptData.get(Integer.valueOf(key)); + stream.writeByte(value instanceof String?1:0); + stream.write24BitInt(key); + if(value instanceof String) { + stream.writeString((String)value); + } else { + stream.writeInt(((Integer)value).intValue()); + } + } + } + + stream.writeByte(0); + byte[] var61 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(var61, 0, var61.length); + return var61; + } + + public int getCombatLevel() { + return this.combatLevel; + } + + public void setCombatLevel(int combatLevel) { + this.combatLevel = combatLevel; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public int getId() { + return this.id; + } + + public void setId(int id) { + this.id = id; + } + + public void resetTextureColors() { + this.originalTextureColors = null; + this.modifiedTextureColors = null; + } + + public void changeTextureColor(int originalModelColor, int modifiedModelColor) { + if(this.originalTextureColors != null) { + for(int var5 = 0; var5 < this.originalTextureColors.length; ++var5) { + if(this.originalTextureColors[var5] == originalModelColor) { + this.modifiedTextureColors[var5] = modifiedModelColor; + return; + } + } + + int[] var51 = Arrays.copyOf(this.originalTextureColors, this.originalTextureColors.length + 1); + int[] newModifiedModelColors = Arrays.copyOf(this.modifiedTextureColors, this.modifiedTextureColors.length + 1); + var51[var51.length - 1] = originalModelColor; + newModifiedModelColors[newModifiedModelColors.length - 1] = modifiedModelColor; + this.originalTextureColors = var51; + this.modifiedTextureColors = newModifiedModelColors; + } else { + this.originalTextureColors = new int[]{originalModelColor}; + this.modifiedTextureColors = new int[]{modifiedModelColor}; + } + + } + + public void resetModelColors() { + this.originalModelColors = null; + this.modifiedModelColors = null; + } + + public void changeModelColor(int originalModelColor, int modifiedModelColor) { + if(this.originalModelColors != null) { + for(int var5 = 0; var5 < this.originalModelColors.length; ++var5) { + if(this.originalModelColors[var5] == originalModelColor) { + this.modifiedModelColors[var5] = modifiedModelColor; + return; + } + } + + int[] var51 = Arrays.copyOf(this.originalModelColors, this.originalModelColors.length + 1); + int[] newModifiedModelColors = Arrays.copyOf(this.modifiedModelColors, this.modifiedModelColors.length + 1); + var51[var51.length - 1] = originalModelColor; + newModifiedModelColors[newModifiedModelColors.length - 1] = modifiedModelColor; + this.originalModelColors = var51; + this.modifiedModelColors = newModifiedModelColors; + } else { + this.originalModelColors = new int[]{originalModelColor}; + this.modifiedModelColors = new int[]{modifiedModelColor}; + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/loaders/objects/ObjectDefinitions.java b/Tools/Frostys Cache Editor/src/com/alex/loaders/objects/ObjectDefinitions.java new file mode 100644 index 000000000..00803edae --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/loaders/objects/ObjectDefinitions.java @@ -0,0 +1,908 @@ +package com.alex.loaders.objects; + +import com.alex.io.InputStream; +import com.alex.io.OutputStream; +import com.alex.store.Store; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; + +public class ObjectDefinitions { + private static final ConcurrentHashMap objectDefinitions = new ConcurrentHashMap(); + private short[] originalColors; + int[] toObjectIds; + static int anInt3832; + int[] anIntArray3833 = null; + public int anInt3834; + int anInt3835; + static int anInt3836; + public byte aByte3837; + int anInt3838 = -1; + boolean aBoolean3839; + public int anInt3840; + public int anInt3841; + static int anInt3842; + static int anInt3843; + int anInt3844; + boolean aBoolean3845; + public byte aByte3847; + public boolean ignoreClipOnAlternativeRoute; + int[] animations = null; + private byte[] possibleTypes; + private int[] anIntArray4534; + private byte[] unknownArray4; + private byte[] unknownArray3; + private int cflag; + public byte aByte3849; + int anInt3850; + int anInt3851; + public boolean secondBool; + public boolean aBoolean3853; + int anInt3855; + public boolean notCliped; + int anInt3857; + private byte[] aByteArray3858; + int[] anIntArray3859; + int anInt3860; + public String[] options; + int configFileId; + private short[] modifiedColors; + int anInt3865; + boolean aBoolean3866; + boolean aBoolean3867; + private int[] anIntArray3869; + boolean aBoolean3870; + public int sizeY; + boolean aBoolean3872; + boolean aBoolean3873; + public int thirdInt; + public int anInt3875; + public int objectAnimation; + public int anInt3877; + public int anInt3878; + public int clipType; + public int anInt3881; + public int anInt3882; + public int anInt3883; + Object loader; + public int anInt3889; + public int sizeX; + public boolean aBoolean3891; + int anInt3892; + public int secondInt; + boolean aBoolean3894; + boolean aBoolean3895; + int anInt3896; + int configId; + private byte[] aByteArray3899; + int anInt3900; + public String name; + public int anInt3902; + int anInt3904; + int anInt3905; + boolean aBoolean3906; + int[] anIntArray3908; + public byte aByte3912; + int anInt3913; + public byte aByte3914; + public int anInt3915; + public int[][] modelIds; + public int anInt3917; + public boolean loaded; + private short[] aShortArray3919; + private short[] aShortArray3920; + int anInt3921; + private HashMap parameters; + boolean aBoolean3923; + boolean aBoolean3924; + int anInt3925; + public int id; + public boolean aBool6886; + static int anInt3846; + public boolean projectileCliped; + + public ObjectDefinitions() { + this.anInt3835 = -1; + this.anInt3860 = -1; + this.configFileId = -1; + this.aBoolean3866 = false; + this.anInt3851 = -1; + this.anInt3865 = 255; + this.aBoolean3845 = false; + this.aBoolean3867 = false; + this.anInt3850 = 0; + this.anInt3844 = -1; + this.anInt3881 = 0; + this.anInt3857 = -1; + this.aBoolean3872 = true; + this.anInt3882 = -1; + this.anInt3834 = 0; + this.options = new String[5]; + this.anInt3875 = 0; + this.aBoolean3839 = false; + this.anIntArray3869 = null; + this.sizeY = 1; + this.thirdInt = -1; + this.anInt3883 = 0; + this.aBoolean3895 = true; + this.anInt3840 = 0; + this.aBoolean3870 = false; + this.anInt3889 = 0; + this.aBoolean3853 = true; + this.secondBool = false; + this.clipType = 2; + this.projectileCliped = true; + this.ignoreClipOnAlternativeRoute = false; + this.anInt3855 = -1; + this.anInt3878 = 0; + this.anInt3904 = 0; + this.sizeX = 1; + this.objectAnimation = -1; + this.aBoolean3891 = false; + this.anInt3905 = 0; + this.name = "null"; + this.anInt3913 = -1; + this.aBoolean3906 = false; + this.aBoolean3873 = false; + this.aByte3914 = 0; + this.anInt3915 = 0; + this.anInt3900 = 0; + this.secondInt = -1; + this.aBoolean3894 = false; + this.aByte3912 = 0; + this.anInt3921 = 0; + this.anInt3902 = 128; + this.configId = -1; + this.anInt3877 = 0; + this.anInt3925 = 0; + this.anInt3892 = 64; + this.aBoolean3923 = false; + this.aBoolean3924 = false; + this.anInt3841 = 128; + this.anInt3917 = 128; + } + + public String getFirstOption() { + return this.options != null && this.options.length >= 1?this.options[0]:""; + } + + public String getSecondOption() { + return this.options != null && this.options.length >= 2?this.options[1]:""; + } + + public String getOption(int option) { + return this.options != null && this.options.length >= option && option != 0?this.options[option - 1]:""; + } + + public String getThirdOption() { + return this.options != null && this.options.length >= 3?this.options[2]:""; + } + + private static int getArchiveId(int i_0_) { + return i_0_ >>> -1135990488; + } + + public int getSizeX() { + return this.sizeX; + } + + public int getSizeY() { + return this.sizeY; + } + + private Object getValue(Field field) throws Throwable { + field.setAccessible(true); + Class type = field.getType(); + return type == int[][].class?Arrays.toString((int[][])field.get(this)):(type == int[].class?Arrays.toString((int[])field.get(this)):(type == byte[].class?Arrays.toString((byte[])field.get(this)):(type == short[].class?Arrays.toString((short[])field.get(this)):(type == double[].class?Arrays.toString((double[])field.get(this)):(type == float[].class?Arrays.toString((float[])field.get(this)):(type == Object[].class?Arrays.toString((Object[])field.get(this)):field.get(this))))))); + } + + public boolean isProjectileCliped() { + return this.projectileCliped; + } + + public boolean containsOption(int i, String option) { + return this.options != null && this.options[i] != null && this.options.length > i?this.options[i].equals(option):false; + } + + public boolean containsOption(String o) { + if(this.options == null) { + return false; + } else { + String[] var5 = this.options; + int var4 = this.options.length; + + for(int var3 = 0; var3 < var4; ++var3) { + String option = var5[var3]; + if(option != null && option.equalsIgnoreCase(o)) { + return true; + } + } + + return false; + } + } + + final void method3287() { + if(this.secondInt == -1) { + this.secondInt = 0; + if(this.possibleTypes != null && this.possibleTypes.length == 1 && this.possibleTypes[0] == 10) { + this.secondInt = 1; + } + + for(int i_13_ = 0; i_13_ < 5; ++i_13_) { + if(this.options[i_13_] != null) { + this.secondInt = 1; + break; + } + } + } + + if(this.anInt3855 == -1) { + this.anInt3855 = this.clipType != 0?1:0; + } + + } + + public int getAccessBlockFlag() { + return this.cflag; + } + + private void readValues(InputStream stream, int opcode) { + boolean aBoolean1162; + int i_73_; + int i_74_; + int i_75_; + if(opcode != 1 && opcode != 5) { + if(opcode != 2) { + if(opcode != 14) { + if(opcode != 15) { + if(opcode == 17) { + this.projectileCliped = false; + this.clipType = 0; + } else if(opcode != 18) { + if(opcode == 19) { + this.secondInt = stream.readUnsignedByte(); + } else if(opcode == 21) { + this.aByte3912 = 1; + } else if(opcode != 22) { + if(opcode != 23) { + if(opcode != 24) { + if(opcode == 27) { + this.clipType = 1; + } else if(opcode == 28) { + this.anInt3892 = stream.readUnsignedByte() << 2; + } else if(opcode != 29) { + if(opcode != 39) { + if(opcode >= 30 && opcode < 35) { + this.options[-30 + opcode] = stream.readString(); + } else { + int var8; + if(opcode == 40) { + var8 = stream.readUnsignedByte(); + this.originalColors = new short[var8]; + this.modifiedColors = new short[var8]; + + for(i_73_ = 0; var8 > i_73_; ++i_73_) { + this.originalColors[i_73_] = (short)stream.readUnsignedShort(); + this.modifiedColors[i_73_] = (short)stream.readUnsignedShort(); + } + } else { + short var9; + byte var10; + if(44 == opcode) { + var9 = (short)stream.readUnsignedShort(); + i_73_ = 0; + + for(i_74_ = var9; i_74_ > 0; i_74_ >>= 1) { + ++i_73_; + } + + this.unknownArray3 = new byte[i_73_]; + var10 = 0; + + for(i_75_ = 0; i_75_ < i_73_; ++i_75_) { + if((var9 & 1 << i_75_) > 0) { + this.unknownArray3[i_75_] = var10++; + } else { + this.unknownArray3[i_75_] = -1; + } + } + } else if(opcode == 45) { + var9 = (short)stream.readUnsignedShort(); + i_73_ = 0; + + for(i_74_ = var9; i_74_ > 0; i_74_ >>= 1) { + ++i_73_; + } + + this.unknownArray4 = new byte[i_73_]; + var10 = 0; + + for(i_75_ = 0; i_75_ < i_73_; ++i_75_) { + if((var9 & 1 << i_75_) > 0) { + this.unknownArray4[i_75_] = var10++; + } else { + this.unknownArray4[i_75_] = -1; + } + } + } else if(opcode != 41) { + if(opcode != 42) { + if(opcode != 62) { + if(opcode != 64) { + if(opcode == 65) { + this.anInt3902 = stream.readUnsignedShort(); + } else if(opcode != 66) { + if(opcode != 67) { + if(opcode == 69) { + this.cflag = stream.readUnsignedByte(); + } else if(opcode != 70) { + if(opcode == 71) { + this.anInt3889 = stream.readShort() << 2; + } else if(opcode != 72) { + if(opcode == 73) { + this.secondBool = true; + } else if(opcode == 74) { + this.ignoreClipOnAlternativeRoute = true; + } else if(opcode != 75) { + if(opcode != 77 && opcode != 92) { + if(opcode == 78) { + this.anInt3860 = stream.readUnsignedShort(); + this.anInt3904 = stream.readUnsignedByte(); + } else if(opcode != 79) { + if(opcode == 81) { + this.aByte3912 = 2; + this.anInt3882 = 256 * stream.readUnsignedByte(); + } else if(opcode != 82) { + if(opcode == 88) { + this.aBoolean3853 = false; + } else if(opcode != 89) { + if(opcode == 90) { + this.aBoolean3870 = true; + } else if(opcode != 91) { + if(opcode != 93) { + if(opcode == 94) { + this.aByte3912 = 4; + } else if(opcode != 95) { + if(opcode != 96) { + if(opcode == 97) { + this.aBoolean3866 = true; + } else if(opcode == 98) { + this.aBoolean3923 = true; + } else if(opcode == 99) { + this.anInt3857 = stream.readUnsignedByte(); + this.anInt3835 = stream.readUnsignedShort(); + } else if(opcode == 100) { + this.anInt3844 = stream.readUnsignedByte(); + this.anInt3913 = stream.readUnsignedShort(); + } else if(opcode != 101) { + if(opcode == 102) { + this.anInt3838 = stream.readUnsignedShort(); + } else if(opcode == 103) { + this.thirdInt = 0; + } else if(opcode != 104) { + if(opcode == 105) { + this.aBoolean3906 = true; + } else if(opcode == 106) { + var8 = stream.readUnsignedByte(); + this.anIntArray3869 = new int[var8]; + this.animations = new int[var8]; + + for(i_73_ = 0; i_73_ < var8; ++i_73_) { + this.animations[i_73_] = stream.readBigSmart(); + i_74_ = stream.readUnsignedByte(); + this.anIntArray3869[i_73_] = i_74_; + this.anInt3881 += i_74_; + } + } else if(opcode == 107) { + this.anInt3851 = stream.readUnsignedShort(); + } else if(opcode >= 150 && opcode < 155) { + this.options[opcode + -150] = stream.readString(); + } else if(opcode != 160) { + if(opcode == 162) { + this.aByte3912 = 3; + this.anInt3882 = stream.readInt(); + } else if(opcode == 163) { + this.aByte3847 = (byte)stream.readByte(); + this.aByte3849 = (byte)stream.readByte(); + this.aByte3837 = (byte)stream.readByte(); + this.aByte3914 = (byte)stream.readByte(); + } else if(opcode != 164) { + if(opcode != 165) { + if(opcode != 166) { + if(opcode == 167) { + this.anInt3921 = stream.readUnsignedShort(); + } else if(opcode != 168) { + if(opcode == 169) { + this.aBoolean3845 = true; + } else if(opcode == 170) { + var8 = stream.readUnsignedSmart(); + } else if(opcode == 171) { + var8 = stream.readUnsignedSmart(); + } else if(opcode == 173) { + var8 = stream.readUnsignedShort(); + i_73_ = stream.readUnsignedShort(); + } else if(opcode == 177) { + aBoolean1162 = true; + } else if(opcode == 178) { + var8 = stream.readUnsignedByte(); + } else if(opcode == 189) { + aBoolean1162 = true; + } else if(opcode >= 190 && opcode < 196) { + if(this.anIntArray4534 == null) { + this.anIntArray4534 = new int[6]; + Arrays.fill(this.anIntArray4534, -1); + } + + this.anIntArray4534[opcode - 190] = stream.readUnsignedShort(); + } else if(opcode == 249) { + var8 = stream.readUnsignedByte(); + if(this.parameters == null) { + this.parameters = new HashMap(var8); + } + + for(i_73_ = 0; i_73_ < var8; ++i_73_) { + boolean var11 = stream.readUnsignedByte() == 1; + i_75_ = stream.read24BitInt(); + if(!var11) { + this.parameters.put(Integer.valueOf(i_75_), Integer.valueOf(stream.readInt())); + } else { + this.parameters.put(Integer.valueOf(i_75_), stream.readString()); + } + } + } + } else { + this.aBoolean3894 = true; + } + } else { + this.anInt3877 = stream.readShort(); + } + } else { + this.anInt3875 = stream.readShort(); + } + } else { + this.anInt3834 = stream.readShort(); + } + } else { + var8 = stream.readUnsignedByte(); + this.anIntArray3908 = new int[var8]; + + for(i_73_ = 0; var8 > i_73_; ++i_73_) { + this.anIntArray3908[i_73_] = stream.readUnsignedShort(); + } + } + } else { + this.anInt3865 = stream.readUnsignedByte(); + } + } else { + this.anInt3850 = stream.readUnsignedByte(); + } + } else { + this.aBoolean3924 = true; + } + } else { + this.aByte3912 = 5; + this.anInt3882 = stream.readShort(); + } + } else { + this.aByte3912 = 3; + this.anInt3882 = stream.readUnsignedShort(); + } + } else { + this.aBoolean3873 = true; + } + } else { + this.aBoolean3895 = false; + } + } else { + this.aBoolean3891 = true; + } + } else { + this.anInt3900 = stream.readUnsignedShort(); + this.anInt3905 = stream.readUnsignedShort(); + this.anInt3904 = stream.readUnsignedByte(); + var8 = stream.readUnsignedByte(); + this.anIntArray3859 = new int[var8]; + + for(i_73_ = 0; i_73_ < var8; ++i_73_) { + this.anIntArray3859[i_73_] = stream.readUnsignedShort(); + } + } + } else { + this.configFileId = stream.readUnsignedShort(); + if(this.configFileId == '\uffff') { + this.configFileId = -1; + } + + this.configId = stream.readUnsignedShort(); + if(this.configId == '\uffff') { + this.configId = -1; + } + + var8 = -1; + if(opcode == 92) { + var8 = stream.readBigSmart(); + } + + i_73_ = stream.readUnsignedByte(); + this.toObjectIds = new int[i_73_ - -2]; + + for(i_74_ = 0; i_73_ >= i_74_; ++i_74_) { + this.toObjectIds[i_74_] = stream.readBigSmart(); + } + + this.toObjectIds[i_73_ + 1] = var8; + } + } else { + this.anInt3855 = stream.readUnsignedByte(); + } + } else { + this.anInt3915 = stream.readShort() << 2; + } + } else { + this.anInt3883 = stream.readShort() << 2; + } + } else { + this.anInt3917 = stream.readUnsignedShort(); + } + } else { + this.anInt3841 = stream.readUnsignedShort(); + } + } else { + this.aBoolean3872 = false; + } + } else { + this.aBoolean3839 = true; + } + } else { + var8 = stream.readUnsignedByte(); + this.aByteArray3858 = new byte[var8]; + + for(i_73_ = 0; i_73_ < var8; ++i_73_) { + this.aByteArray3858[i_73_] = (byte)stream.readByte(); + } + } + } else { + var8 = stream.readUnsignedByte(); + this.aShortArray3920 = new short[var8]; + this.aShortArray3919 = new short[var8]; + + for(i_73_ = 0; var8 > i_73_; ++i_73_) { + this.aShortArray3920[i_73_] = (short)stream.readUnsignedShort(); + this.aShortArray3919[i_73_] = (short)stream.readUnsignedShort(); + } + } + } + } + } else { + this.anInt3840 = stream.readByte() * 5; + } + } else { + this.anInt3878 = stream.readByte(); + } + } else { + this.objectAnimation = stream.readBigSmart(); + } + } else { + this.thirdInt = 1; + } + } else { + this.aBoolean3867 = true; + } + } else { + this.projectileCliped = false; + } + } else { + this.sizeY = stream.readUnsignedByte(); + } + } else { + this.sizeX = stream.readUnsignedByte(); + } + } else { + this.name = stream.readString(); + } + } else { + aBoolean1162 = false; + if(opcode == 5 && aBoolean1162) { + this.skipReadModelIds(stream); + } + + i_73_ = stream.readUnsignedByte(); + this.modelIds = new int[i_73_][]; + this.possibleTypes = new byte[i_73_]; + + for(i_74_ = 0; i_74_ < i_73_; ++i_74_) { + this.possibleTypes[i_74_] = (byte)stream.readByte(); + i_75_ = stream.readUnsignedByte(); + this.modelIds[i_74_] = new int[i_75_]; + + for(int i_76_ = 0; i_75_ > i_76_; ++i_76_) { + this.modelIds[i_74_][i_76_] = stream.readIntLE(); //fix + } + } + + if(opcode == 5 && !aBoolean1162) { + this.skipReadModelIds(stream); + } + } + + } + + private void skipReadModelIds(InputStream stream) { + int length = stream.readUnsignedByte(); + + for(int index = 0; index < length; ++index) { + stream.skip(1); + int length2 = stream.readUnsignedByte(); + + for(int i = 0; i < length2; ++i) { + stream.readBigSmart(); + } + } + + } + + private void readValueLoop(InputStream stream) { + while(true) { + int opcode = stream.readUnsignedByte(); + if(opcode == 0) { + return; + } + + this.readValues(stream, opcode); + } + } + + public ObjectDefinitions(Store cache, int i) { + this.anInt3835 = -1; + this.anInt3860 = -1; + this.configFileId = -1; + this.aBoolean3866 = false; + this.anInt3851 = -1; + this.anInt3865 = 255; + this.aBoolean3845 = false; + this.aBoolean3867 = false; + this.anInt3850 = 0; + this.anInt3844 = -1; + this.anInt3881 = 0; + this.anInt3857 = -1; + this.aBoolean3872 = true; + this.anInt3882 = -1; + this.anInt3834 = 0; + this.options = new String[5]; + this.anInt3875 = 0; + this.aBoolean3839 = false; + this.anIntArray3869 = null; + this.sizeY = 1; + this.thirdInt = -1; + this.anInt3883 = 0; + this.aBoolean3895 = true; + this.anInt3840 = 0; + this.aBoolean3870 = false; + this.anInt3889 = 0; + this.aBoolean3853 = true; + this.secondBool = false; + this.clipType = 2; + this.projectileCliped = true; + this.notCliped = false; + this.anInt3855 = -1; + this.anInt3878 = 0; + this.anInt3904 = 0; + this.sizeX = 1; + this.objectAnimation = -1; + this.aBoolean3891 = false; + this.anInt3905 = 0; + this.name = "null"; + this.anInt3913 = -1; + this.aBoolean3906 = false; + this.aBoolean3873 = false; + this.aByte3914 = 0; + this.anInt3915 = 0; + this.anInt3900 = 0; + this.secondInt = -1; + this.aBoolean3894 = false; + this.aByte3912 = 0; + this.anInt3921 = 0; + this.anInt3902 = 128; + this.configId = -1; + this.anInt3877 = 0; + this.anInt3925 = 0; + this.anInt3892 = 64; + this.aBoolean3923 = false; + this.aBoolean3924 = false; + this.anInt3841 = 128; + this.anInt3917 = 128; + } + + public int getArchiveId() { + return this.id >>> -1135990488; + } + + public int getFileId() { + return 0xff & this.id; + } + + public static ObjectDefinitions getObjectDefinitions(int id, Store store) { + ObjectDefinitions def = (ObjectDefinitions)objectDefinitions.get(Integer.valueOf(id)); + if(def == null) { + def = new ObjectDefinitions(); + def.id = id; + byte[] data = store.getIndexes()[16].getFile(getArchiveId(id), id & 0xff); + if(data != null) { + def.readValueLoop(new InputStream(data)); + } + + def.method3287(); + objectDefinitions.put(Integer.valueOf(id), def); + } + + return def; + } + + private void loadObjectDefinition(Store store) { + byte[] data = store.getIndexes()[16].getFile(this.id >>> -1135990488, this.id & 0xff); + if(data == null) { + System.out.println("FAILED LOADING OBJECT " + this.id); + } else { + try { + this.readOpcodeValues(new InputStream(data)); + } catch (RuntimeException var4) { + var4.printStackTrace(); + } + + this.loaded = true; + } + + } + + private void readOpcodeValues(InputStream stream) { + while(true) { + int opcode = stream.readUnsignedByte(); + if(opcode == 0) { + return; + } + + this.readValues(stream, opcode); + } + } + + public static ObjectDefinitions getObjectDefinition(Store cache, int itemId) { + return getObjectDefinition(cache, itemId, true); + } + + public static ObjectDefinitions getObjectDefinition(Store cache, int itemId, boolean load) { + return new ObjectDefinitions(cache, itemId, load); + } + + public ObjectDefinitions(Store cache, int id, boolean load) { + this.id = id; + this.setDefaultVariableValues(); + this.setDefaultOptions(); + if(load) { + this.loadObjectDefinition(cache); + } + + } + + private void setDefaultOptions() { + this.options = new String[5]; + } + + private void setDefaultVariableValues() { + this.name = name; + this.sizeX = 1; + this.sizeY = 1; + this.projectileCliped = true; + this.clipType = 2; + this.objectAnimation = -1; + } + + public int getClipType() { + return this.clipType; + } + + public static void clearObjectDefinitions() { + objectDefinitions.clear(); + } + + public void printFields() { + Field[] arr$ = this.getClass().getDeclaredFields(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + Field field = arr$[i$]; + if((field.getModifiers() & 8) == 0) { + try { + System.out.println(field.getName() + ": " + this.getValue(field)); + } catch (Throwable var6) { + var6.printStackTrace(); + } + } + } + + System.out.println("-- end of " + this.getClass().getSimpleName() + " fields --"); + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return this.name; + } + + public byte[] encode() { + OutputStream stream = new OutputStream(); + stream.writeByte(1); + int i_73_ = this.modelIds.length; + this.modelIds = new int[i_73_][]; + this.aByteArray3899 = new byte[i_73_]; + + int data; + for(data = 0; data < i_73_; ++data) { + stream.write128Byte(this.aByteArray3899[data]); + int var6 = this.modelIds[data].length; + this.modelIds[data] = new int[var6]; + + for(int i_76_ = 0; var6 > i_76_; ++i_76_) { + stream.writeBigSmart(this.modelIds[data][i_76_]); + } + } + + if(!this.name.equals("null")) { + stream.writeByte(2); + stream.writeString(this.name); + } + + if(this.sizeX != 1) { + stream.writeByte(14); + stream.write128Byte(this.sizeX); + } + + if(this.sizeY != 1) { + stream.writeByte(15); + stream.writeByte(this.sizeY); + } + + if(this.objectAnimation != -1) { + stream.writeByte(24); + stream.writeBigSmart(this.objectAnimation); + } + + for(data = 0; data < this.options.length; ++data) { + if(this.options[data] != null && this.options[data] != "Hidden") { + stream.writeByte(30 + data); + stream.writeString(this.options[data]); + } + } + + if(this.originalColors != null && this.modifiedColors != null) { + stream.writeByte(40); + stream.writeByte(this.originalColors.length); + + for(data = 0; data < this.originalColors.length; ++data) { + stream.writeShort(this.originalColors[data]); + stream.writeShort(this.modifiedColors[data]); + } + } + + if(this.clipType == 0 && this.projectileCliped) { + stream.writeByte(17); + } + + if(this.projectileCliped) { + stream.writeByte(18); + } + + if(this.clipType == 1 || this.clipType == 2) { + stream.writeByte(27); + } + + stream.writeByte(0); + byte[] var61 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(var61, 0, var61.length); + return var61; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/store/Archive.java b/Tools/Frostys Cache Editor/src/com/alex/store/Archive.java new file mode 100644 index 000000000..e5ab567b0 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/store/Archive.java @@ -0,0 +1,166 @@ +package com.alex.store; + +import com.alex.io.InputStream; +import com.alex.io.OutputStream; +import com.alex.store.MainFile; +import com.alex.util.bzip2.BZip2Compressor; +import com.alex.util.bzip2.BZip2Decompressor; +import com.alex.util.crc32.CRC32HGenerator; +import com.alex.util.gzip.GZipCompressor; +import com.alex.util.gzip.GZipDecompressor; +import com.alex.util.whirlpool.Whirlpool; + +public class Archive { + private int id; + private int revision; + private int compression; + private byte[] data; + private int[] keys; + + protected Archive(int id, byte[] archive, int[] keys) { + this.id = id; + this.keys = keys; + this.decompress(archive); + } + + public Archive(int id, int compression, int revision, byte[] data) { + this.id = id; + this.compression = compression; + this.revision = revision; + this.data = data; + } + + public byte[] compress() { + OutputStream stream = new OutputStream(); + stream.writeByte(this.compression); + byte[] compressedData1; + switch(this.compression) { + case 0: + compressedData1 = this.data; + stream.writeInt(this.data.length); + break; + case 1: + Object compressed = null; + compressedData1 = BZip2Compressor.compress(this.data); + stream.writeInt(compressedData1.length); + stream.writeInt(this.data.length); + default: + compressedData1 = GZipCompressor.compress(this.data); + stream.writeInt(compressedData1.length); + stream.writeInt(this.data.length); + } + + stream.writeBytes(compressedData1); + if(this.keys != null && this.keys.length == 4) { + stream.encodeXTEA(this.keys, 5, stream.getOffset()); + } + + if(this.revision != -1) { + stream.writeShort(this.revision); + } + + byte[] compressed1 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(compressed1, 0, compressed1.length); + return compressed1; + } + + private void decompress(byte[] archive) { + InputStream stream = new InputStream(archive); + if(this.keys != null && this.keys.length == 4) { + stream.decodeXTEA(this.keys); + } + + this.compression = stream.readUnsignedByte(); + int compressedLength = stream.readInt(); + if(compressedLength >= 0 && compressedLength <= 1000000) { + int length; + switch(this.compression) { + case 0: + this.data = new byte[compressedLength]; + this.checkRevision(compressedLength, archive, stream.getOffset()); + stream.readBytes(this.data, 0, compressedLength); + break; + case 1: + length = stream.readInt(); + if(length <= 0) { + this.data = null; + } else { + this.data = new byte[length]; + this.checkRevision(compressedLength, archive, stream.getOffset()); + BZip2Decompressor.decompress(this.data, archive, compressedLength, 9); + } + break; + default: + length = stream.readInt(); + if(length > 0 && length <= 1000000000) { + this.data = new byte[length]; + this.checkRevision(compressedLength, archive, stream.getOffset()); + if(!GZipDecompressor.decompress(stream, this.data)) { + this.data = null; + } + } else { + this.data = null; + } + } + + } else { + throw new RuntimeException("INVALID ARCHIVE HEADER"); + } + } + + private void checkRevision(int compressedLength, byte[] archive, int o) { + InputStream stream = new InputStream(archive); + int offset = stream.getOffset(); + if(stream.getLength() - (compressedLength + o) >= 2) { + stream.setOffset(stream.getLength() - 2); + this.revision = stream.readUnsignedShort(); + stream.setOffset(offset); + } else { + this.revision = -1; + } + + } + + public Object[] editNoRevision(byte[] data, MainFile mainFile) { + this.data = data; + if(this.compression == 1) { + this.compression = 2; + } + + byte[] compressed = this.compress(); + return !mainFile.putArchiveData(this.id, compressed)?null:new Object[]{Integer.valueOf(CRC32HGenerator.getHash(compressed)), Whirlpool.getHash(compressed, 0, compressed.length)}; + } + + public int getId() { + return this.id; + } + + public byte[] getData() { + return this.data; + } + + public int getDecompressedLength() { + return this.data.length; + } + + public int getRevision() { + return this.revision; + } + + public void setRevision(int revision) { + this.revision = revision; + } + + public int getCompression() { + return this.compression; + } + + public int[] getKeys() { + return this.keys; + } + + public void setKeys(int[] keys) { + this.keys = keys; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/store/ArchiveReference.java b/Tools/Frostys Cache Editor/src/com/alex/store/ArchiveReference.java new file mode 100644 index 000000000..aaa59f833 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/store/ArchiveReference.java @@ -0,0 +1,138 @@ +package com.alex.store; + +import com.alex.store.FileReference; + +import java.util.Arrays; + +public class ArchiveReference { + private int nameHash; + private byte[] whirpool; + private int crc; + private int revision; + private FileReference[] files; + private int[] validFileIds; + private boolean needsFilesSort; + private boolean updatedRevision; + + public void updateRevision() { + if(!this.updatedRevision) { + ++this.revision; + this.updatedRevision = true; + } + + } + + public int getNameHash() { + return this.nameHash; + } + + public void setNameHash(int nameHash) { + this.nameHash = nameHash; + } + + public byte[] getWhirpool() { + return this.whirpool; + } + + public void setWhirpool(byte[] whirpool) { + this.whirpool = whirpool; + } + + public int getCRC() { + return this.crc; + } + + public void setCrc(int crc) { + this.crc = crc; + } + + public int getRevision() { + return this.revision; + } + + public FileReference[] getFiles() { + return this.files; + } + + public void setFiles(FileReference[] files) { + this.files = files; + } + + public void setRevision(int revision) { + this.revision = revision; + } + + public int[] getValidFileIds() { + return this.validFileIds; + } + + public void setValidFileIds(int[] validFileIds) { + this.validFileIds = validFileIds; + } + + public boolean isNeedsFilesSort() { + return this.needsFilesSort; + } + + public void setNeedsFilesSort(boolean needsFilesSort) { + this.needsFilesSort = needsFilesSort; + } + + public void removeFileReference(int fileId) { + int[] newValidFileIds = new int[this.validFileIds.length - 1]; + int count = 0; + int[] arr$ = this.validFileIds; + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int id = arr$[i$]; + if(id != fileId) { + newValidFileIds[count++] = id; + } + } + + this.validFileIds = newValidFileIds; + this.files[fileId] = null; + } + + public void addEmptyFileReference(int fileId) { + this.needsFilesSort = true; + int[] newValidFileIds = Arrays.copyOf(this.validFileIds, this.validFileIds.length + 1); + newValidFileIds[newValidFileIds.length - 1] = fileId; + this.validFileIds = newValidFileIds; + if(this.files.length <= fileId) { + FileReference[] newFiles = (FileReference[])Arrays.copyOf(this.files, fileId + 1); + newFiles[fileId] = new FileReference(); + this.files = newFiles; + } else { + this.files[fileId] = new FileReference(); + } + + } + + public void sortFiles() { + Arrays.sort(this.validFileIds); + this.needsFilesSort = false; + } + + public void reset() { + this.whirpool = null; + this.updatedRevision = true; + this.revision = 0; + this.nameHash = 0; + this.crc = 0; + this.files = new FileReference[0]; + this.validFileIds = new int[0]; + this.needsFilesSort = false; + } + + public void copyHeader(ArchiveReference fromReference) { + this.setCrc(fromReference.getCRC()); + this.setNameHash(fromReference.getNameHash()); + this.setWhirpool(fromReference.getWhirpool()); + int[] validFiles = fromReference.getValidFileIds(); + this.setValidFileIds(Arrays.copyOf(validFiles, validFiles.length)); + FileReference[] files = fromReference.getFiles(); + this.setFiles((FileReference[])Arrays.copyOf(files, files.length)); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/store/FileReference.java b/Tools/Frostys Cache Editor/src/com/alex/store/FileReference.java new file mode 100644 index 000000000..db5968058 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/store/FileReference.java @@ -0,0 +1,13 @@ +package com.alex.store; + +public class FileReference { + private int nameHash; + + public int getNameHash() { + return this.nameHash; + } + + public void setNameHash(int nameHash) { + this.nameHash = nameHash; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/store/Index.java b/Tools/Frostys Cache Editor/src/com/alex/store/Index.java new file mode 100644 index 000000000..f7905e13c --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/store/Index.java @@ -0,0 +1,504 @@ +package com.alex.store; + +import com.alex.io.InputStream; +import com.alex.io.OutputStream; +import com.alex.store.*; +import com.alex.util.crc32.CRC32HGenerator; +import com.alex.util.whirlpool.Whirlpool; +import com.alex.utils.Utils; + +public final class Index { + private MainFile mainFile; + private MainFile index255; + private ReferenceTable table; + private byte[][][] cachedFiles; + private int crc; + private byte[] whirlpool; + + protected Index(MainFile index255, MainFile mainFile, int[] keys) { + this.mainFile = mainFile; + this.index255 = index255; + byte[] archiveData = index255.getArchiveData(this.getId()); + if(archiveData != null) { + this.crc = CRC32HGenerator.getHash(archiveData); + this.whirlpool = Whirlpool.getHash(archiveData, 0, archiveData.length); + Archive archive = new Archive(this.getId(), archiveData, keys); + this.table = new ReferenceTable(archive); + this.resetCachedFiles(); + } + + } + + public void resetCachedFiles() { + this.cachedFiles = new byte[this.getLastArchiveId() + 1][][]; + } + + public int getLastFileId(int archiveId) { + return !this.archiveExists(archiveId)?-1:this.table.getArchives()[archiveId].getFiles().length - 1; + } + + public int getLastArchiveId() { + return this.table.getArchives().length - 1; + } + + public int getValidArchivesCount() { + return this.table.getValidArchiveIds().length; + } + + public int getValidFilesCount(int archiveId) { + return !this.archiveExists(archiveId)?-1:this.table.getArchives()[archiveId].getValidFileIds().length; + } + + public boolean archiveExists(int archiveId) { + if(archiveId < 0) { + return false; + } else { + ArchiveReference[] archives = this.table.getArchives(); + return archives.length > archiveId && archives[archiveId] != null; + } + } + + public boolean fileExists(int archiveId, int fileId) { + if(!this.archiveExists(archiveId)) { + return false; + } else { + FileReference[] files = this.table.getArchives()[archiveId].getFiles(); + return files.length > fileId && files[fileId] != null; + } + } + + public int getArchiveId(String name) { + int nameHash = Utils.getNameHash(name); + ArchiveReference[] archives = this.table.getArchives(); + int[] validArchiveIds = this.table.getValidArchiveIds(); + int[] arr$ = validArchiveIds; + int len$ = validArchiveIds.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int archiveId = arr$[i$]; + if(archives[archiveId].getNameHash() == nameHash) { + return archiveId; + } + } + + return -1; + } + + public int getFileId(int archiveId, String name) { + if(!this.archiveExists(archiveId)) { + return -1; + } else { + int nameHash = Utils.getNameHash(name); + FileReference[] files = this.table.getArchives()[archiveId].getFiles(); + int[] validFileIds = this.table.getArchives()[archiveId].getValidFileIds(); + + for(int index = 0; index < validFileIds.length; ++index) { + int fileId = validFileIds[index]; + if(files[fileId].getNameHash() == nameHash) { + return fileId; + } + } + + return -1; + } + } + + public byte[] getFile(int archiveId) { + return !this.archiveExists(archiveId)?null:this.getFile(archiveId, this.table.getArchives()[archiveId].getValidFileIds()[0]); + } + + public byte[] getFile(int archiveId, int fileId) { + return this.getFile(archiveId, fileId, (int[])null); + } + + public byte[] getFile(int archiveId, int fileId, int[] keys) { + try { + if(!this.fileExists(archiveId, fileId)) { + return null; + } else { + if(this.cachedFiles[archiveId] == null || this.cachedFiles[archiveId][fileId] == null) { + this.cacheArchiveFiles(archiveId, keys); + } + + byte[] var5 = this.cachedFiles[archiveId][fileId]; + this.cachedFiles[archiveId][fileId] = null; + return var5; + } + } catch (Throwable var51) { + var51.printStackTrace(); + return null; + } + } + + public boolean packIndex(Store originalStore) { + return this.packIndex(originalStore, false); + } + + public boolean packIndex(Store originalStore, boolean checkCRC) { + try { + return this.packIndex(this.getId(), originalStore, checkCRC); + } catch (Exception var4) { + return this.packIndex(this.getId(), originalStore, checkCRC); + } + } + + public boolean packIndex(int id, Store originalStore, boolean checkCRC) { + try { + Index var9 = originalStore.getIndexes()[id]; + int[] arr$ = var9.table.getValidArchiveIds(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int archiveId = arr$[i$]; + if((!checkCRC || !this.archiveExists(archiveId) || var9.table.getArchives()[archiveId].getCRC() != this.table.getArchives()[archiveId].getCRC()) && !this.putArchive(id, archiveId, originalStore, false, false)) { + return false; + } + } + + if(!this.rewriteTable()) { + return false; + } else { + this.resetCachedFiles(); + return true; + } + } catch (Exception var91) { + return true; + } + } + + public boolean putArchive(int archiveId, Store originalStore) { + return this.putArchive(this.getId(), archiveId, originalStore, true, true); + } + + public boolean putArchive(int archiveId, Store originalStore, boolean rewriteTable, boolean resetCache) { + return this.putArchive(this.getId(), archiveId, originalStore, rewriteTable, resetCache); + } + + public boolean putArchive(int id, int archiveId, Store originalStore, boolean rewriteTable, boolean resetCache) { + try { + Index var11 = originalStore.getIndexes()[id]; + byte[] data = var11.getMainFile().getArchiveData(archiveId); + if(data == null) { + return false; + } else { + if(!this.archiveExists(archiveId)) { + this.table.addEmptyArchiveReference(archiveId); + } + + ArchiveReference reference = this.table.getArchives()[archiveId]; + reference.updateRevision(); + ArchiveReference originalReference = var11.table.getArchives()[archiveId]; + reference.copyHeader(originalReference); + int revision = reference.getRevision(); + data[data.length - 2] = (byte)(revision >> 8); + data[data.length - 1] = (byte)revision; + if(!this.mainFile.putArchiveData(archiveId, data)) { + return false; + } else if(rewriteTable && !this.rewriteTable()) { + return false; + } else { + if(resetCache) { + this.resetCachedFiles(); + } + + return true; + } + } + } catch (Exception var111) { + return true; + } + } + + public boolean putFile(int archiveId, int fileId, byte[] data) { + return this.putFile(archiveId, fileId, 2, data, (int[])null, true, true, -1, -1); + } + + public boolean removeFile(int archiveId, int fileId) { + return this.removeFile(archiveId, fileId, 2, (int[])null); + } + + public boolean removeFile(int archiveId, int fileId, int compression, int[] keys) { + if(!this.fileExists(archiveId, fileId)) { + return false; + } else { + this.cacheArchiveFiles(archiveId, keys); + ArchiveReference reference = this.table.getArchives()[archiveId]; + reference.removeFileReference(fileId); + int filesCount = this.getValidFilesCount(archiveId); + byte[] archiveData; + if(filesCount == 1) { + archiveData = this.getFile(archiveId, reference.getValidFileIds()[0], keys); + } else { + int[] var13 = new int[filesCount]; + OutputStream var14 = new OutputStream(); + + int index; + int offset; + for(index = 0; index < filesCount; ++index) { + offset = reference.getValidFileIds()[index]; + byte[] fileData = this.getFile(archiveId, offset, keys); + var13[index] = fileData.length; + var14.writeBytes(fileData); + } + + for(index = 0; index < var13.length; ++index) { + offset = var13[index]; + if(index != 0) { + offset -= var13[index - 1]; + } + + var14.writeInt(offset); + } + + var14.writeByte(1); + archiveData = new byte[var14.getOffset()]; + var14.setOffset(0); + var14.getBytes(archiveData, 0, archiveData.length); + } + + reference.updateRevision(); + Archive var131 = new Archive(archiveId, compression, reference.getRevision(), archiveData); + byte[] var141 = var131.compress(); + reference.setCrc(CRC32HGenerator.getHash(var141, 0, var141.length - 2)); + reference.setWhirpool(Whirlpool.getHash(var141, 0, var141.length - 2)); + if(!this.mainFile.putArchiveData(archiveId, var141)) { + return false; + } else if(!this.rewriteTable()) { + return false; + } else { + this.resetCachedFiles(); + return true; + } + } + } + + public boolean putFile(int archiveId, int fileId, int compression, byte[] data, int[] keys, boolean rewriteTable, boolean resetCache, int archiveName, int fileName) { + if(!this.archiveExists(archiveId)) { + this.table.addEmptyArchiveReference(archiveId); + this.resetCachedFiles(); + this.cachedFiles[archiveId] = new byte[1][]; + } else { + this.cacheArchiveFiles(archiveId, keys); + } + + ArchiveReference reference = this.table.getArchives()[archiveId]; + if(!this.fileExists(archiveId, fileId)) { + reference.addEmptyFileReference(fileId); + } + + reference.sortFiles(); + int filesCount = this.getValidFilesCount(archiveId); + byte[] archiveData; + if(filesCount == 1) { + archiveData = data; + } else { + int[] var18 = new int[filesCount]; + OutputStream var19 = new OutputStream(); + + int index; + int offset; + for(index = 0; index < filesCount; ++index) { + offset = reference.getValidFileIds()[index]; + byte[] fileData; + if(offset == fileId) { + fileData = data; + } else { + fileData = this.getFile(archiveId, offset, keys); + } + + var18[index] = fileData.length; + var19.writeBytes(fileData); + } + + for(index = 0; index < filesCount; ++index) { + offset = var18[index]; + if(index != 0) { + offset -= var18[index - 1]; + } + + var19.writeInt(offset); + } + + var19.writeByte(1); + archiveData = new byte[var19.getOffset()]; + var19.setOffset(0); + var19.getBytes(archiveData, 0, archiveData.length); + } + + reference.updateRevision(); + Archive var181 = new Archive(archiveId, compression, reference.getRevision(), archiveData); + byte[] var191 = var181.compress(); + reference.setCrc(CRC32HGenerator.getHash(var191, 0, var191.length - 2)); + reference.setWhirpool(Whirlpool.getHash(var191, 0, var191.length - 2)); + if(archiveName != -1) { + reference.setNameHash(archiveName); + } + + if(fileName != -1) { + reference.getFiles()[fileId].setNameHash(fileName); + } + + if(!this.mainFile.putArchiveData(archiveId, var191)) { + return false; + } else if(rewriteTable && !this.rewriteTable()) { + return false; + } else { + if(resetCache) { + this.resetCachedFiles(); + } + + return true; + } + } + + public boolean encryptArchive(int archiveId, int[] keys) { + return this.encryptArchive(archiveId, (int[])null, keys, true, true); + } + + public boolean encryptArchive(int archiveId, int[] oldKeys, int[] keys, boolean rewriteTable, boolean resetCache) { + if(!this.archiveExists(archiveId)) { + return false; + } else { + Archive archive = this.mainFile.getArchive(archiveId, oldKeys); + if(archive == null) { + return false; + } else { + ArchiveReference reference = this.table.getArchives()[archiveId]; + if(reference.getRevision() != archive.getRevision()) { + throw new RuntimeException("ERROR REVISION"); + } else { + reference.updateRevision(); + archive.setRevision(reference.getRevision()); + archive.setKeys(keys); + byte[] closedArchive = archive.compress(); + reference.setCrc(CRC32HGenerator.getHash(closedArchive, 0, closedArchive.length - 2)); + reference.setWhirpool(Whirlpool.getHash(closedArchive, 0, closedArchive.length - 2)); + if(!this.mainFile.putArchiveData(archiveId, closedArchive)) { + return false; + } else if(rewriteTable && !this.rewriteTable()) { + return false; + } else { + if(resetCache) { + this.resetCachedFiles(); + } + + return true; + } + } + } + } + } + + public boolean rewriteTable() { + this.table.updateRevision(); + this.table.sortTable(); + Object[] hashes = this.table.encodeHeader(this.index255); + if(hashes == null) { + return false; + } else { + this.whirlpool = (byte[])hashes[1]; + return true; + } + } + + public void setKeys(int[] keys) { + this.table.setKeys(keys); + } + + public int[] getKeys() { + return this.table.getKeys(); + } + + private void cacheArchiveFiles(int archiveId, int[] keys) { + Archive archive = this.getArchive(archiveId, keys); + int lastFileId = this.getLastFileId(archiveId); + this.cachedFiles[archiveId] = new byte[lastFileId + 1][]; + if(archive != null) { + byte[] data = archive.getData(); + if(data != null) { + int filesCount = this.getValidFilesCount(archiveId); + if(filesCount == 1) { + this.cachedFiles[archiveId][lastFileId] = data; + } else { + int readPosition = data.length; + --readPosition; + int amtOfLoops = data[readPosition] & 255; + readPosition -= amtOfLoops * filesCount * 4; + InputStream stream = new InputStream(data); + stream.setOffset(readPosition); + int[] filesSize = new int[filesCount]; + + int sourceOffset; + int count; + for(int var18 = 0; var18 < amtOfLoops; ++var18) { + sourceOffset = 0; + + for(count = 0; count < filesCount; ++count) { + filesSize[count] += sourceOffset += stream.readInt(); + } + } + + byte[][] var181 = new byte[filesCount][]; + + for(sourceOffset = 0; sourceOffset < filesCount; ++sourceOffset) { + var181[sourceOffset] = new byte[filesSize[sourceOffset]]; + filesSize[sourceOffset] = 0; + } + + stream.setOffset(readPosition); + sourceOffset = 0; + + int len$; + for(count = 0; count < amtOfLoops; ++count) { + int var19 = 0; + + for(len$ = 0; len$ < filesCount; ++len$) { + var19 += stream.readInt(); + System.arraycopy(data, sourceOffset, var181[len$], filesSize[len$], var19); + sourceOffset += var19; + filesSize[len$] += var19; + } + } + + count = 0; + int[] var191 = this.table.getArchives()[archiveId].getValidFileIds(); + len$ = var191.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int fileId = var191[i$]; + this.cachedFiles[archiveId][fileId] = var181[count++]; + } + } + } + } + + } + + public int getId() { + return this.mainFile.getId(); + } + + public ReferenceTable getTable() { + return this.table; + } + + public MainFile getMainFile() { + return this.mainFile; + } + + public Archive getArchive(int id) { + return this.mainFile.getArchive(id, (int[])null); + } + + public Archive getArchive(int id, int[] keys) { + return this.mainFile.getArchive(id, keys); + } + + public int getCRC() { + return this.crc; + } + + public byte[] getWhirlpool() { + return this.whirlpool; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/store/MainFile.java b/Tools/Frostys Cache Editor/src/com/alex/store/MainFile.java new file mode 100644 index 000000000..48bbcb35a --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/store/MainFile.java @@ -0,0 +1,277 @@ +package com.alex.store; + +import com.alex.store.Archive; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; + +public final class MainFile { + public static final int IDX_BLOCK_LEN = 6; + public static final int HEADER_LEN = 8; + public static final int EXPANDED_HEADER_LEN = 10; + public static final int BLOCK_LEN = 512; + public static final int EXPANDED_BLOCK_LEN = 510; + public static final int TOTAL_BLOCK_LEN = 520; + private static final ByteBuffer tempBuffer = ByteBuffer.allocateDirect(520); + private int id; + private FileChannel index; + private FileChannel data; + private boolean newProtocol; + + protected MainFile(int id, RandomAccessFile data, RandomAccessFile index, boolean newProtocol) throws IOException { + this.id = id; + this.data = data.getChannel(); + this.index = index.getChannel(); + this.newProtocol = newProtocol; + } + + public Archive getArchive(int id) { + return this.getArchive(id, (int[])null); + } + + public Archive getArchive(int id, int[] keys) { + byte[] data = this.getArchiveData(id); + return data == null?null:new Archive(id, data, keys); + } + + public byte[] getArchiveData(int archiveId) { + FileChannel var2 = this.data; + FileChannel var3 = this.data; + synchronized(this.data) { + try { + tempBuffer.position(0).limit(6); + this.index.read(tempBuffer, (long)(archiveId * 6)); + tempBuffer.flip(); + int var16 = getMediumInt(tempBuffer); + int block = getMediumInt(tempBuffer); + Object var10000; + byte[] var100001; + if(var16 < 0) { + var10000 = null; + var100001 = (byte[])var10000; + return var100001; + } else if(block <= 0 || (long)block > this.data.size() / 520L) { + var10000 = null; + var100001 = (byte[])var10000; + return var100001; + } else { + ByteBuffer fileBuffer = ByteBuffer.allocate(var16); + int remaining = var16; + int chunk = 0; + int blockLen = this.newProtocol && archiveId > '\uffff'?510:512; + int headerLen = this.newProtocol && archiveId > '\uffff'?10:8; + + while(remaining > 0) { + if(block == 0) { + System.out.println(archiveId + ", " + this.newProtocol); + var10000 = null; + var100001 = (byte[])var10000; + return var100001; + } + + int blockSize = remaining > blockLen?blockLen:remaining; + tempBuffer.position(0).limit(blockSize + headerLen); + this.data.read(tempBuffer, (long)(block * 520)); + tempBuffer.flip(); + int currentFile; + int currentChunk; + int nextBlock; + int currentIndex; + if(this.newProtocol && archiveId > '\uffff') { + currentFile = tempBuffer.getInt(); + currentChunk = tempBuffer.getShort() & '\uffff'; + nextBlock = getMediumInt(tempBuffer); + currentIndex = tempBuffer.get() & 255; + } else { + currentFile = tempBuffer.getShort() & '\uffff'; + currentChunk = tempBuffer.getShort() & '\uffff'; + nextBlock = getMediumInt(tempBuffer); + currentIndex = tempBuffer.get() & 255; + } + + if((archiveId == currentFile || archiveId > '\uffff') && chunk == currentChunk && this.id == currentIndex) { + if(nextBlock >= 0 && (long)nextBlock <= this.data.size() / 520L) { + fileBuffer.put(tempBuffer); + remaining -= blockSize; + block = nextBlock; + ++chunk; + continue; + } + + var10000 = null; + var100001 = (byte[])var10000; + return var100001; + } + + var10000 = null; + var100001 = (byte[])var10000; + return var100001; + } + + byte[] var18 = (byte[])fileBuffer.flip().array(); + return var18; + } + } catch (Exception var181) { + return null; + } + } + } + + private static int getMediumInt(ByteBuffer buffer) { + return (buffer.get() & 255) << 16 | (buffer.get() & 255) << 8 | buffer.get() & 255; + } + + private static void putMediumInt(ByteBuffer buffer, int val) { + buffer.put((byte)(val >> 16)); + buffer.put((byte)(val >> 8)); + buffer.put((byte)val); + } + + public boolean putArchive(Archive archive) { + return this.putArchiveData(archive.getId(), archive.getData()); + } + + public boolean putArchiveData(int id, byte[] archive) { + ByteBuffer buffer = ByteBuffer.wrap(archive); + boolean done = this.putArchiveData(id, buffer, archive.length, true); + if(!done) { + done = this.putArchiveData(id, buffer, archive.length, false); + } + + return done; + } + + public boolean putArchiveData(int archiveId, ByteBuffer archive, int size, boolean exists) { + FileChannel var5 = this.data; + FileChannel var6 = this.data; + synchronized(this.data) { + try { + boolean var10000; + int var16; + boolean var100001; + if(exists) { + if((long)(archiveId * 6 + 6) > this.index.size()) { + var10000 = false; + var100001 = var10000; + return var100001; + } + + tempBuffer.position(0).limit(6); + this.index.read(tempBuffer, (long)(archiveId * 6)); + tempBuffer.flip().position(3); + var16 = getMediumInt(tempBuffer); + if(var16 <= 0 || (long)var16 > this.data.size() / 520L) { + var10000 = false; + var100001 = var10000; + return var100001; + } + } else { + var16 = (int)(this.data.size() + 520L - 1L) / 520; + if(var16 == 0) { + var16 = 1; + } + } + + tempBuffer.position(0); + putMediumInt(tempBuffer, size); + putMediumInt(tempBuffer, var16); + tempBuffer.flip(); + this.index.write(tempBuffer, (long)(archiveId * 6)); + int remaining = size; + int chunk = 0; + int blockLen = this.newProtocol && archiveId > '\uffff'?510:512; + + for(int headerLen = this.newProtocol && archiveId > '\uffff'?10:8; remaining > 0; ++chunk) { + int nextBlock = 0; + int blockSize; + if(exists) { + tempBuffer.position(0).limit(headerLen); + this.data.read(tempBuffer, (long)(var16 * 520)); + tempBuffer.flip(); + int currentChunk; + int currentIndex; + if(this.newProtocol && archiveId > '\uffff') { + blockSize = tempBuffer.getInt(); + currentChunk = tempBuffer.getShort() & '\uffff'; + nextBlock = getMediumInt(tempBuffer); + currentIndex = tempBuffer.get() & 255; + } else { + blockSize = tempBuffer.getShort() & '\uffff'; + currentChunk = tempBuffer.getShort() & '\uffff'; + nextBlock = getMediumInt(tempBuffer); + currentIndex = tempBuffer.get() & 255; + } + + if(archiveId != blockSize && archiveId <= '\uffff' || chunk != currentChunk || this.id != currentIndex) { + var10000 = false; + var100001 = var10000; + return var100001; + } + + if(nextBlock < 0 || (long)nextBlock > this.data.size() / 520L) { + var10000 = false; + var100001 = var10000; + return var100001; + } + } + + if(nextBlock == 0) { + exists = false; + nextBlock = (int)((this.data.size() + 520L - 1L) / 520L); + if(nextBlock == 0) { + nextBlock = 1; + } + + if(nextBlock == var16) { + ++nextBlock; + } + } + + if(remaining <= blockLen) { + nextBlock = 0; + } + + tempBuffer.position(0).limit(520); + if(this.newProtocol && archiveId > '\uffff') { + tempBuffer.putInt(archiveId); + tempBuffer.putShort((short)chunk); + putMediumInt(tempBuffer, nextBlock); + tempBuffer.put((byte)this.id); + } else { + tempBuffer.putShort((short)archiveId); + tempBuffer.putShort((short)chunk); + putMediumInt(tempBuffer, nextBlock); + tempBuffer.put((byte)this.id); + } + + blockSize = remaining > blockLen?blockLen:remaining; + archive.limit(archive.position() + blockSize); + tempBuffer.put(archive); + tempBuffer.flip(); + this.data.write(tempBuffer, (long)(var16 * 520)); + remaining -= blockSize; + var16 = nextBlock; + } + + var10000 = true; + return var10000; + } catch (Exception var17) { + return false; + } + } + } + + public int getId() { + return this.id; + } + + public int getArchivesCount() throws IOException { + FileChannel var1 = this.index; + FileChannel var2 = this.index; + synchronized(this.index) { + return (int)(this.index.size() / 6L); + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/store/ReferenceTable.java b/Tools/Frostys Cache Editor/src/com/alex/store/ReferenceTable.java new file mode 100644 index 000000000..ec351e1e7 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/store/ReferenceTable.java @@ -0,0 +1,317 @@ +package com.alex.store; + +import com.alex.io.InputStream; +import com.alex.io.OutputStream; +import com.alex.store.Archive; +import com.alex.store.ArchiveReference; +import com.alex.store.FileReference; +import com.alex.store.MainFile; + +import java.util.Arrays; + +public final class ReferenceTable { + private Archive archive; + private int revision; + private boolean named; + private boolean usesWhirpool; + private ArchiveReference[] archives; + private int[] validArchiveIds; + private boolean updatedRevision; + private boolean needsArchivesSort; + + protected ReferenceTable(Archive archive) { + this.archive = archive; + this.decodeHeader(); + } + + public void setKeys(int[] keys) { + this.archive.setKeys(keys); + } + + public int[] getKeys() { + return this.archive.getKeys(); + } + + public void sortArchives() { + Arrays.sort(this.validArchiveIds); + this.needsArchivesSort = false; + } + + public void addEmptyArchiveReference(int archiveId) { + this.needsArchivesSort = true; + int[] newValidArchiveIds = Arrays.copyOf(this.validArchiveIds, this.validArchiveIds.length + 1); + newValidArchiveIds[newValidArchiveIds.length - 1] = archiveId; + this.validArchiveIds = newValidArchiveIds; + ArchiveReference reference; + if(this.archives.length <= archiveId) { + ArchiveReference[] newArchives = (ArchiveReference[])Arrays.copyOf(this.archives, archiveId + 1); + reference = newArchives[archiveId] = new ArchiveReference(); + this.archives = newArchives; + } else { + reference = this.archives[archiveId] = new ArchiveReference(); + } + + reference.reset(); + } + + public void sortTable() { + if(this.needsArchivesSort) { + this.sortArchives(); + } + + for(int index = 0; index < this.validArchiveIds.length; ++index) { + ArchiveReference archive = this.archives[this.validArchiveIds[index]]; + if(archive.isNeedsFilesSort()) { + archive.sortFiles(); + } + } + + } + + public Object[] encodeHeader(MainFile mainFile) { + OutputStream stream = new OutputStream(); + int protocol = this.getProtocol(); + stream.writeByte(protocol); + if(protocol >= 6) { + stream.writeInt(this.revision); + } + + stream.writeByte((this.named?1:0) | (this.usesWhirpool?2:0)); + if(protocol >= 7) { + stream.writeBigSmart(this.validArchiveIds.length); + } else { + stream.writeShort(this.validArchiveIds.length); + } + + int data; + int archive; + for(data = 0; data < this.validArchiveIds.length; ++data) { + archive = this.validArchiveIds[data]; + if(data != 0) { + archive -= this.validArchiveIds[data - 1]; + } + + if(protocol >= 7) { + stream.writeBigSmart(archive); + } else { + stream.writeShort(archive); + } + } + + if(this.named) { + for(data = 0; data < this.validArchiveIds.length; ++data) { + stream.writeInt(this.archives[this.validArchiveIds[data]].getNameHash()); + } + } + + if(this.usesWhirpool) { + for(data = 0; data < this.validArchiveIds.length; ++data) { + stream.writeBytes(this.archives[this.validArchiveIds[data]].getWhirpool()); + } + } + + for(data = 0; data < this.validArchiveIds.length; ++data) { + stream.writeInt(this.archives[this.validArchiveIds[data]].getCRC()); + } + + for(data = 0; data < this.validArchiveIds.length; ++data) { + stream.writeInt(this.archives[this.validArchiveIds[data]].getRevision()); + } + + for(data = 0; data < this.validArchiveIds.length; ++data) { + archive = this.archives[this.validArchiveIds[data]].getValidFileIds().length; + if(protocol >= 7) { + stream.writeBigSmart(archive); + } else { + stream.writeShort(archive); + } + } + + int index2; + ArchiveReference var8; + for(data = 0; data < this.validArchiveIds.length; ++data) { + var8 = this.archives[this.validArchiveIds[data]]; + + for(index2 = 0; index2 < var8.getValidFileIds().length; ++index2) { + int var9 = var8.getValidFileIds()[index2]; + if(index2 != 0) { + var9 -= var8.getValidFileIds()[index2 - 1]; + } + + if(protocol >= 7) { + stream.writeBigSmart(var9); + } else { + stream.writeShort(var9); + } + } + } + + if(this.named) { + for(data = 0; data < this.validArchiveIds.length; ++data) { + var8 = this.archives[this.validArchiveIds[data]]; + + for(index2 = 0; index2 < var8.getValidFileIds().length; ++index2) { + stream.writeInt(var8.getFiles()[var8.getValidFileIds()[index2]].getNameHash()); + } + } + } + + byte[] var91 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(var91, 0, var91.length); + return this.archive.editNoRevision(var91, mainFile); + } + + public int getProtocol() { + if(this.archives.length > '\uffff') { + return 7; + } else { + for(int index = 0; index < this.validArchiveIds.length; ++index) { + if(index > 0 && this.validArchiveIds[index] - this.validArchiveIds[index - 1] > '\uffff') { + return 7; + } + + if(this.archives[this.validArchiveIds[index]].getValidFileIds().length > '\uffff') { + return 7; + } + } + + return this.revision == 0?5:6; + } + } + + public void setRevision(int revision) { + this.updatedRevision = true; + this.revision = revision; + } + + public void updateRevision() { + if(!this.updatedRevision) { + ++this.revision; + this.updatedRevision = true; + } + + } + + private void decodeHeader() { + InputStream stream = new InputStream(this.archive.getData()); + int protocol = stream.readUnsignedByte(); + if(protocol >= 5 && protocol <= 7) { + if(protocol >= 6) { + this.revision = stream.readInt(); + } + + int hash = stream.readUnsignedByte(); + this.named = (1 & hash) != 0; + this.usesWhirpool = (2 & hash) != 0; + int validArchivesCount = protocol >= 7?stream.readBigSmart():stream.readUnsignedShort(); + this.validArchiveIds = new int[validArchivesCount]; + int lastArchiveId = 0; + int biggestArchiveId = 0; + + int index; + int archive; + for(index = 0; index < validArchivesCount; ++index) { + archive = lastArchiveId += protocol >= 7?stream.readBigSmart():stream.readUnsignedShort(); + if(archive > biggestArchiveId) { + biggestArchiveId = archive; + } + + this.validArchiveIds[index] = archive; + } + + this.archives = new ArchiveReference[biggestArchiveId + 1]; + + for(index = 0; index < validArchivesCount; ++index) { + this.archives[this.validArchiveIds[index]] = new ArchiveReference(); + } + + if(this.named) { + for(index = 0; index < validArchivesCount; ++index) { + this.archives[this.validArchiveIds[index]].setNameHash(stream.readInt()); + } + } + + if(this.usesWhirpool) { + for(index = 0; index < validArchivesCount; ++index) { + byte[] index2 = new byte[64]; + stream.getBytes(index2, 0, 64); + this.archives[this.validArchiveIds[index]].setWhirpool(index2); + } + } + + for(index = 0; index < validArchivesCount; ++index) { + this.archives[this.validArchiveIds[index]].setCrc(stream.readInt()); + } + + for(index = 0; index < validArchivesCount; ++index) { + this.archives[this.validArchiveIds[index]].setRevision(stream.readInt()); + } + + for(index = 0; index < validArchivesCount; ++index) { + this.archives[this.validArchiveIds[index]].setValidFileIds(new int[protocol >= 7?stream.readBigSmart():stream.readUnsignedShort()]); + } + + ArchiveReference var14; + int var13; + for(index = 0; index < validArchivesCount; ++index) { + archive = 0; + var13 = 0; + var14 = this.archives[this.validArchiveIds[index]]; + + int index21; + for(index21 = 0; index21 < var14.getValidFileIds().length; ++index21) { + int fileId = archive += protocol >= 7?stream.readBigSmart():stream.readUnsignedShort(); + if(fileId > var13) { + var13 = fileId; + } + + var14.getValidFileIds()[index21] = fileId; + } + + var14.setFiles(new FileReference[var13 + 1]); + + for(index21 = 0; index21 < var14.getValidFileIds().length; ++index21) { + var14.getFiles()[var14.getValidFileIds()[index21]] = new FileReference(); + } + } + + if(this.named) { + for(index = 0; index < validArchivesCount; ++index) { + var14 = this.archives[this.validArchiveIds[index]]; + + for(var13 = 0; var13 < var14.getValidFileIds().length; ++var13) { + var14.getFiles()[var14.getValidFileIds()[var13]].setNameHash(stream.readInt()); + } + } + } + + } else { + throw new RuntimeException("INVALID PROTOCOL"); + } + } + + public int getRevision() { + return this.revision; + } + + public ArchiveReference[] getArchives() { + return this.archives; + } + + public int[] getValidArchiveIds() { + return this.validArchiveIds; + } + + public boolean isNamed() { + return this.named; + } + + public boolean usesWhirpool() { + return this.usesWhirpool; + } + + public int getCompression() { + return this.archive.getCompression(); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/store/Store.java b/Tools/Frostys Cache Editor/src/com/alex/store/Store.java new file mode 100644 index 000000000..22e8ee134 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/store/Store.java @@ -0,0 +1,152 @@ +package com.alex.store; + +import com.alex.io.OutputStream; +import com.alex.store.Archive; +import com.alex.store.Index; +import com.alex.store.MainFile; +import com.alex.util.whirlpool.Whirlpool; +import com.alex.utils.Utils; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.math.BigInteger; +import java.util.Arrays; + +public final class Store { + private Index[] indexes; + private MainFile index255; + private String path; + private RandomAccessFile data; + private boolean newProtocol; + + public Store(String path) throws IOException { + this(path, true); + } + + public Store(String path, boolean newProtocol) throws IOException { + this(path, newProtocol, (int[][])null); + } + + public Store(String path, boolean newProtocol, int[][] keys) throws IOException { + this.path = path; + this.newProtocol = newProtocol; + this.data = new RandomAccessFile(path + "main_file_cache.dat2", "rw"); + this.index255 = new MainFile(255, this.data, new RandomAccessFile(path + "main_file_cache.idx255", "rw"), newProtocol); + int idxsCount = this.index255.getArchivesCount(); + this.indexes = new Index[idxsCount]; + + for(int id = 0; id < idxsCount; ++id) { + Index index = new Index(this.index255, new MainFile(id, this.data, new RandomAccessFile(path + "main_file_cache.idx" + id, "rw"), newProtocol), keys == null?null:keys[id]); + if(index.getTable() != null) { + this.indexes[id] = index; + } + } + + } + + public final byte[] generateIndex255Archive255Current(BigInteger grab_server_private_exponent, BigInteger grab_server_modulus) { + OutputStream stream = new OutputStream(); + stream.writeByte(this.getIndexes().length); + + for(int var9 = 0; var9 < this.getIndexes().length; ++var9) { + if(this.getIndexes()[var9] == null) { + stream.writeInt(0); + stream.writeInt(0); + stream.writeBytes(new byte[64]); + } else { + stream.writeInt(this.getIndexes()[var9].getCRC()); + stream.writeInt(this.getIndexes()[var9].getTable().getRevision()); + stream.writeBytes(this.getIndexes()[var9].getWhirlpool()); + if(this.getIndexes()[var9].getKeys() != null) { + int[] var10 = this.getIndexes()[var9].getKeys(); + int var12 = var10.length; + + for(int i$ = 0; i$ < var12; ++i$) { + int key = var10[i$]; + stream.writeInt(key); + } + } else { + for(int var11 = 0; var11 < 4; ++var11) { + stream.writeInt(0); + } + } + } + } + + byte[] var91 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(var91, 0, var91.length); + OutputStream var111 = new OutputStream(65); + var111.writeByte(0); + var111.writeBytes(Whirlpool.getHash(var91, 0, var91.length)); + byte[] var121 = new byte[var111.getOffset()]; + var111.setOffset(0); + var111.getBytes(var121, 0, var121.length); + if(grab_server_private_exponent != null && grab_server_modulus != null) { + var121 = Utils.cryptRSA(var121, grab_server_private_exponent, grab_server_modulus); + } + + stream.writeBytes(var121); + var91 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(var91, 0, var91.length); + return var91; + } + + public byte[] generateIndex255Archive255() { + return this.generateIndex255Archive255Current((BigInteger)null, (BigInteger)null); + } + + public byte[] generateIndex255Archive255Outdated() { + OutputStream stream = new OutputStream(this.indexes.length * 8); + + for(int var3 = 0; var3 < this.indexes.length; ++var3) { + if(this.indexes[var3] == null) { + stream.writeInt(0); + stream.writeInt(0); + } else { + stream.writeInt(this.indexes[var3].getCRC()); + stream.writeInt(this.indexes[var3].getTable().getRevision()); + } + } + + byte[] var31 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(var31, 0, var31.length); + return var31; + } + + public Index[] getIndexes() { + return this.indexes; + } + + public MainFile getIndex255() { + return this.index255; + } + + public int addIndex(boolean named, boolean usesWhirpool, int tableCompression) throws IOException { + int id = this.indexes.length; + Index[] newIndexes = (Index[])Arrays.copyOf(this.indexes, this.indexes.length + 1); + this.resetIndex(id, newIndexes, named, usesWhirpool, tableCompression); + this.indexes = newIndexes; + return id; + } + + public void resetIndex(int id, boolean named, boolean usesWhirpool, int tableCompression) throws FileNotFoundException, IOException { + this.resetIndex(id, this.indexes, named, usesWhirpool, tableCompression); + } + + public void resetIndex(int id, Index[] indexes, boolean named, boolean usesWhirpool, int tableCompression) throws FileNotFoundException, IOException { + OutputStream stream = new OutputStream(4); + stream.writeByte(5); + stream.writeByte((named?1:0) | (usesWhirpool?2:0)); + stream.writeShort(0); + byte[] archiveData = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(archiveData, 0, archiveData.length); + Archive archive = new Archive(id, tableCompression, -1, archiveData); + this.index255.putArchiveData(id, archive.compress()); + indexes[id] = new Index(this.index255, new MainFile(id, this.data, new RandomAccessFile(this.path + "main_file_cache.idx" + id, "rw"), this.newProtocol), (int[])null); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/ArchiveValidation.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/ArchiveValidation.java new file mode 100644 index 000000000..6c99c0109 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/ArchiveValidation.java @@ -0,0 +1,48 @@ +package com.alex.tools.clientCacheUpdater; + +import com.alex.store.Archive; +import com.alex.store.ArchiveReference; +import com.alex.store.Index; +import com.alex.store.Store; + +import java.io.IOException; +import java.util.Random; + +public class ArchiveValidation { + public static void main(String[] args) throws IOException { + Store rscache = new Store("718/cache/"); + + for(int i = 0; i < rscache.getIndexes().length; ++i) { + if(i != 5) { + Index index = rscache.getIndexes()[i]; + System.out.println("checking index: " + i); + int[] arr$ = index.getTable().getValidArchiveIds(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int archiveId = arr$[i$]; + Archive archive = index.getArchive(archiveId); + if(archive == null) { + System.out.println("Missing:: " + i + ", " + archiveId); + } else { + ArchiveReference reference = index.getTable().getArchives()[archiveId]; + if(archive.getRevision() != reference.getRevision()) { + System.out.println("corrupted: " + i + ", " + archiveId); + } + } + } + } + } + + } + + public static int[] generateKeys() { + int[] keys = new int[4]; + + for(int index = 0; index < keys.length; ++index) { + keys[index] = (new Random()).nextInt(); + } + + return keys; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CacheEditor.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CacheEditor.java new file mode 100644 index 000000000..58ae0686c --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CacheEditor.java @@ -0,0 +1,192 @@ +package com.alex.tools.clientCacheUpdater; + +import com.alex.loaders.items.ItemDefinitions; +import com.alex.store.Index; +import com.alex.store.Store; +import com.alex.tools.clientCacheUpdater.RSXteas; +import com.alex.utils.Utils; + +import javax.imageio.ImageIO; +import javax.imageio.stream.ImageOutputStream; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class CacheEditor { + public static byte[] getBytesFromFile(File file) throws IOException { + FileInputStream is = new FileInputStream(file); + long length = file.length(); + if(length > 2147483647L) { + ; + } + + byte[] bytes = new byte[(int)length]; + int offset = 0; + + int numRead1; + for(boolean numRead = false; offset < bytes.length && (numRead1 = is.read(bytes, offset, bytes.length - offset)) >= 0; offset += numRead1) { + ; + } + + if(offset < bytes.length) { + throw new IOException("Could not completely read file " + file.getName()); + } else { + is.close(); + return bytes; + } + } + + public static int packCustomModel(Store cache, byte[] data) { + int archiveId = cache.getIndexes()[7].getLastArchiveId() + 1; + if(cache.getIndexes()[7].putFile(archiveId, 0, data)) { + return archiveId; + } else { + System.out.println("Failing packing model " + archiveId); + return -1; + } + } + + public static void packCustomItem(Store cache, int id, ItemDefinitions def) { + cache.getIndexes()[19].putFile(id >>> 8, 255 & id, def.encode()); + } + + public static void divideBackgrounds() throws IOException { + BufferedImage background = ImageIO.read(new File("718/sprites/bg.jpg")); + int id = 4139; + int sx = background.getWidth() / 4; + int sy = background.getHeight() / 2; + + int y; + for(int var8 = 0; var8 < 2; ++var8) { + for(y = 0; y < 4; ++y) { + BufferedImage var9 = background.getSubimage(y * sx, var8 * sy, sx, sy); + ImageIO.write(var9, "gif", new File("718/sprites/bg/" + id++ + ".gif")); + } + } + + BufferedImage var81 = ImageIO.read(new File("718/sprites/load.png")); + id = 3769; + sx = var81.getWidth() / 2; + sy = var81.getHeight() / 2; + + for(y = 0; y < 2; ++y) { + for(int var91 = 0; var91 < 2; ++var91) { + BufferedImage part = var81.getSubimage(var91 * sx, y * sy, sx, sy); + ImageIO.write(part, "png", new File("718/sprites/load/" + id + ".png")); + ImageIO.write(part, "gif", new File("718/sprites/load/" + id++ + ".gif")); + } + } + + } + + public static byte[] getImage(File file) throws IOException { + ImageOutputStream stream = ImageIO.createImageOutputStream(file); + byte[] data = new byte[(int)stream.length()]; + stream.read(data); + return data; + } + + public static void main(String[] args) throws IOException { + boolean beta = false; + boolean addNewItemDefinitions = false; + boolean divideBackgrounds = false; + if(divideBackgrounds) { + divideBackgrounds(); + } + + Store rscache = new Store(beta?"718/rsCacheBeta/":"718/rscache/"); + Store cache = new Store(beta?"718/cacheBeta/":"718/cache/"); + cache.resetIndex(7, false, false, 2); + + boolean result; + int regionId; + for(regionId = 0; regionId < cache.getIndexes().length; ++regionId) { + if(regionId != 3 && regionId != 5 && regionId != 12) { + result = cache.getIndexes()[regionId].packIndex(rscache, true); + System.out.println("Packed index archives: " + regionId + ", " + result); + } + } + + int regionY; + if(addNewItemDefinitions) { + System.out.println("Packing old item definitions..."); + Store var14 = new Store("cache667/", false); + short var15 = 30000; + regionY = Utils.getItemDefinitionsSize(var14); + + for(int data = var15; data < var15 + regionY; ++data) { + int var16 = data - var15; + cache.getIndexes()[19].putFile(data >>> 8, 255 & data, 2, var14.getIndexes()[19].getFile(var16 >>> 8, 255 & var16), (int[])null, false, false, -1, -1); + } + + result = cache.getIndexes()[19].rewriteTable(); + System.out.println("Packed old item definitions: " + result); + } + + System.out.println("Adding new interfaces..."); + + for(regionId = cache.getIndexes()[3].getLastArchiveId() + 1; regionId <= rscache.getIndexes()[3].getLastArchiveId(); ++regionId) { + if(regionId != 548 && regionId != 746 && rscache.getIndexes()[3].archiveExists(regionId)) { + cache.getIndexes()[3].putArchive(regionId, rscache, false, false); + } + } + + result = cache.getIndexes()[3].rewriteTable(); + System.out.println("Packed new interfaces: " + result); + RSXteas.loadUnpackedXteas("old"); + System.out.println("Updating Maps."); + + for(regionId = 0; regionId < 30000; ++regionId) { + int var13 = (regionId >> 8) * 64; + regionY = (regionId & 255) * 64; + String var141 = "m" + (var13 >> 3) / 8 + "_" + (regionY >> 3) / 8; + byte[] var151 = rscache.getIndexes()[5].getFile(rscache.getIndexes()[5].getArchiveId(var141)); + if(var151 != null) { + result = addMapFile(cache.getIndexes()[5], var141, var151); + System.out.println(var141 + ", " + result); + } + + var141 = "um" + (var13 >> 3) / 8 + "_" + (regionY >> 3) / 8; + var151 = rscache.getIndexes()[5].getFile(rscache.getIndexes()[5].getArchiveId(var141)); + if(var151 != null) { + result = addMapFile(cache.getIndexes()[5], var141, var151); + System.out.println(var141 + ", " + result); + } + + int[] var161 = RSXteas.getXteas(regionId); + var141 = "l" + (var13 >> 3) / 8 + "_" + (regionY >> 3) / 8; + var151 = rscache.getIndexes()[5].getFile(rscache.getIndexes()[5].getArchiveId(var141), 0, var161); + if(var151 != null) { + result = addMapFile(cache.getIndexes()[5], var141, var151); + System.out.println(var141 + ", " + result); + } + + var141 = "ul" + (var13 >> 3) / 8 + "_" + (regionY >> 3) / 8; + var151 = rscache.getIndexes()[5].getFile(rscache.getIndexes()[5].getArchiveId(var141), 0, var161); + if(var151 != null) { + result = addMapFile(cache.getIndexes()[5], var141, var151); + System.out.println(var141 + ", " + result); + } + + var141 = "n" + (var13 >> 3) / 8 + "_" + (regionY >> 3) / 8; + var151 = rscache.getIndexes()[5].getFile(rscache.getIndexes()[5].getArchiveId(var141), 0); + if(var151 != null) { + result = addMapFile(cache.getIndexes()[5], var141, var151); + System.out.println(var141 + ", " + result); + } + } + + result = cache.getIndexes()[5].rewriteTable(); + System.out.println("Updated maps: " + result); + } + + public static boolean addMapFile(Index index, String name, byte[] data) { + int archiveId = index.getArchiveId(name); + if(archiveId == -1) { + archiveId = index.getTable().getValidArchiveIds().length; + } + + return index.putFile(archiveId, 0, 2, data, (int[])null, false, false, Utils.getNameHash(name), -1); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CacheEditormodels.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CacheEditormodels.java new file mode 100644 index 000000000..05b516de6 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CacheEditormodels.java @@ -0,0 +1,135 @@ +package com.alex.tools.clientCacheUpdater; + +import com.alex.loaders.items.ItemDefinitions; +import com.alex.store.Store; +import com.alex.utils.Utils; + +import javax.imageio.ImageIO; +import javax.imageio.stream.ImageOutputStream; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class CacheEditormodels { + public static byte[] getBytesFromFile(File file) throws IOException { + FileInputStream is = new FileInputStream(file); + long length = file.length(); + if(length > 2147483647L) { + ; + } + + byte[] bytes = new byte[(int)length]; + int offset = 0; + + int numRead1; + for(boolean numRead = false; offset < bytes.length && (numRead1 = is.read(bytes, offset, bytes.length - offset)) >= 0; offset += numRead1) { + ; + } + + if(offset < bytes.length) { + throw new IOException("Could not completely read file " + file.getName()); + } else { + is.close(); + return bytes; + } + } + + public static int packCustomModel(Store cache, byte[] data) { + int archiveId = cache.getIndexes()[7].getLastArchiveId() + 1; + if(cache.getIndexes()[7].putFile(archiveId, 0, data)) { + return archiveId; + } else { + System.out.println("Failing packing model " + archiveId); + return -1; + } + } + + public static void packCustomItems(Store cache) throws IOException { + int modelID = packCustomModel(cache, getBytesFromFile(new File("pkcapefinalb.dat"))); + ItemDefinitions pkCape = ItemDefinitions.getItemDefinition(cache, 9747); + pkCape.setName("PK Cape"); + pkCape.femaleEquip1 = modelID; + pkCape.maleEquip1 = modelID; + pkCape.modelId = modelID; + pkCape.resetModelColors(); + packCustomItem(cache, 30000, pkCape); + } + + public static void packCustomItem(Store cache, int id, ItemDefinitions def) { + cache.getIndexes()[19].putFile(id >>> 8, 255 & id, def.encode()); + } + + public static void divideBackgrounds() throws IOException { + BufferedImage background = ImageIO.read(new File("718/sprites/bg.jpg")); + int id = 4139; + int sx = background.getWidth() / 4; + int sy = background.getHeight() / 2; + + int y; + for(int var8 = 0; var8 < 2; ++var8) { + for(y = 0; y < 4; ++y) { + BufferedImage var9 = background.getSubimage(y * sx, var8 * sy, sx, sy); + ImageIO.write(var9, "gif", new File("718/sprites/bg/" + id++ + ".gif")); + } + } + + BufferedImage var81 = ImageIO.read(new File("718/sprites/load.png")); + id = 3769; + sx = var81.getWidth() / 2; + sy = var81.getHeight() / 2; + + for(y = 0; y < 2; ++y) { + for(int var91 = 0; var91 < 2; ++var91) { + BufferedImage part = var81.getSubimage(var91 * sx, y * sy, sx, sy); + ImageIO.write(part, "png", new File("718/sprites/load/" + id + ".png")); + ImageIO.write(part, "gif", new File("718/sprites/load/" + id++ + ".gif")); + } + } + + } + + public static byte[] getImage(File file) throws IOException { + ImageOutputStream stream = ImageIO.createImageOutputStream(file); + byte[] data = new byte[(int)stream.length()]; + stream.read(data); + return data; + } + + public static void main(String[] args) throws IOException { + boolean beta = false; + boolean addNewItemDefinitions = false; + boolean divideBackgrounds = false; + if(divideBackgrounds) { + divideBackgrounds(); + } + + Store rscache = new Store(beta?"718/rsCacheBeta/":"718/rscache/"); + Store cache = new Store(beta?"718/cacheBeta/":"718/cache/"); + cache.resetIndex(7, false, false, 2); + + boolean result; + for(int var13 = 0; var13 < cache.getIndexes().length; ++var13) { + if(var13 != 3 && var13 != 5 && var13 != 12) { + result = cache.getIndexes()[var13].packIndex(rscache, true); + System.out.println("Packed index archives: " + var13 + ", " + result); + } + } + + if(addNewItemDefinitions) { + System.out.println("Packing old item definitions..."); + Store var12 = new Store("cache667/", false); + short currentSize = 30000; + int oldSize = Utils.getItemDefinitionsSize(var12); + + for(int i = currentSize; i < currentSize + oldSize; ++i) { + int oldItemId = i - currentSize; + cache.getIndexes()[19].putFile(i >>> 8, 255 & i, 2, var12.getIndexes()[19].getFile(oldItemId >>> 8, 255 & oldItemId), (int[])null, false, false, -1, -1); + } + + result = cache.getIndexes()[19].rewriteTable(); + System.out.println("Packed old item definitions: " + result); + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CheckMap.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CheckMap.java new file mode 100644 index 000000000..7deec6266 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CheckMap.java @@ -0,0 +1,96 @@ +package com.alex.tools.clientCacheUpdater; + +import com.alex.store.Store; +import com.alex.utils.Utils; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Arrays; +import java.util.Random; + +public class CheckMap { + public static void main(String[] args) throws IOException { + Store cache = new Store("C:/Users/yvonne � christer/Dropbox/Source/data/562cache/", false, (int[][])null); + double land = 0.0D; + double map = 0.0D; + + for(int var11 = 0; var11 < 30000; ++var11) { + int regionX = (var11 >> 8) * 64; + int regionY = (var11 & 255) * 64; + String name1 = "l" + (regionX >> 3) / 8 + "_" + (regionY >> 3) / 8; + String name2 = "m" + (regionX >> 3) / 8 + "_" + (regionY >> 3) / 8; + if(cache.getIndexes()[5].getArchiveId(name1) != -1) { + ++land; + } + + if(cache.getIndexes()[5].getArchiveId(name2) != -1) { + ++map; + } + } + + System.out.println("land: " + land + ", newMaps: " + map); + double var111 = land * 100.0D / map; + System.out.println(var111 + "% complete!"); + } + + public static boolean passArchive(int regionId, Store store1, Store store2, String nameHash, int i, int[] keys1, int[] keys2) { + if(keys2 != null) { + System.out.println(keys2); + } + + int archiveId = store1.getIndexes()[i].getArchiveId(nameHash); + if(archiveId == -1) { + return false; + } else { + int oldArchiveId = store2.getIndexes()[i].getArchiveId(nameHash); + if(oldArchiveId == -1) { + oldArchiveId = store2.getIndexes()[i].getLastArchiveId() + 1; + } + + byte[] data = store1.getIndexes()[i].getFile(archiveId, 0, keys1); + if(data == null) { + return false; + } else { + try { + boolean var13 = store2.getIndexes()[i].putFile(oldArchiveId, 0, 2, data, keys2, false, false, Utils.getNameHash(nameHash), -1); + if(!var13) { + return false; + } else { + int[] keys = writeKeys(regionId); + return store2.getIndexes()[i].encryptArchive(oldArchiveId, keys2, keys, false, false); + } + } catch (Error var12) { + return false; + } catch (Exception var131) { + var131.printStackTrace(); + return false; + } + } + } + } + + public static int[] generateKeys() { + int[] keys = new int[4]; + + for(int index = 0; index < keys.length; ++index) { + keys[index] = (new Random()).nextInt(); + } + + return keys; + } + + public static int[] writeKeys(int regionId) throws IOException { + BufferedWriter writer = new BufferedWriter(new FileWriter("C:/Users/yvonne � christer/Desktop/LS/Xteas/xteas/742/" + regionId + ".txt")); + int[] keys = generateKeys(); + + for(int index = 0; index < keys.length; ++index) { + writer.write("" + keys[index]); + writer.newLine(); + writer.flush(); + } + + System.out.println("Region: " + regionId + ", " + Arrays.toString(keys)); + return keys; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CopyCache.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CopyCache.java new file mode 100644 index 000000000..090d56249 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/CopyCache.java @@ -0,0 +1,22 @@ +package com.alex.tools.clientCacheUpdater; + +import com.alex.store.Index; +import com.alex.store.Store; + +import java.io.IOException; + +public class CopyCache { + public static void main(String[] args) throws IOException { + Store cache = new Store("718/cache/"); + Store newCache = new Store("718/cacheCleaned/"); + + for(int i = 0; i < cache.getIndexes().length; ++i) { + Index index = cache.getIndexes()[i]; + newCache.addIndex(index.getTable().isNamed(), index.getTable().usesWhirpool(), 2); + newCache.getIndexes()[i].packIndex(cache); + newCache.getIndexes()[i].getTable().setRevision(cache.getIndexes()[i].getTable().getRevision()); + newCache.getIndexes()[i].rewriteTable(); + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/OriginalXteas.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/OriginalXteas.java new file mode 100644 index 000000000..d919dc5d1 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/OriginalXteas.java @@ -0,0 +1,57 @@ +package com.alex.tools.clientCacheUpdater; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; + +public final class OriginalXteas { + public static final HashMap mapContainersXteas = new HashMap(); + + public static final int[] getXteas(int regionId) { + return (int[])mapContainersXteas.get(Integer.valueOf(regionId)); + } + + public static void init() { + loadUnpackedXteas(); + } + + public static final void delete() { + } + + public static final void loadUnpackedXteas() { + try { + File var11 = new File("cache667_protected/keys"); + File[] xteasFiles = var11.listFiles(); + File[] arr$ = xteasFiles; + int len$ = xteasFiles.length; + + for(int i$ = 0; i$ < len$; ++i$) { + File region = arr$[i$]; + String name = region.getName(); + if(!name.contains(".txt")) { + region.delete(); + } else { + short regionId = Short.parseShort(name.replace(".txt", "")); + if(regionId <= 0) { + region.delete(); + } else { + BufferedReader in = new BufferedReader(new FileReader(region)); + int[] xteas = new int[4]; + + for(int index = 0; index < 4; ++index) { + xteas[index] = Integer.parseInt(in.readLine()); + } + + mapContainersXteas.put(Integer.valueOf(regionId), xteas); + in.close(); + } + } + } + } catch (IOException var111) { + var111.printStackTrace(); + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/ProtectCache.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/ProtectCache.java new file mode 100644 index 000000000..5b81b9319 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/ProtectCache.java @@ -0,0 +1,99 @@ +package com.alex.tools.clientCacheUpdater; + +import com.alex.store.Index; +import com.alex.store.Store; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Arrays; +import java.util.Random; + +public class ProtectCache { + public static void main(String[] args) throws IOException { + boolean encryptMaps = true; + boolean encryptTables = false; + Store cache = new Store("718/cacheEncrypted/"); + if(encryptMaps) { + Store var13 = new Store("718/rscache/"); + Index var14 = cache.getIndexes()[5]; + Index rsIndex = var13.getIndexes()[5]; + + for(int regionId = 0; regionId < 25000; ++regionId) { + int regionX = (regionId >> 8) * 64; + int regionY = (regionId & 255) * 64; + int[] keys1 = null; + String name = "l" + (regionX >> 3) / 8 + "_" + (regionY >> 3) / 8; + int archiveId; + if(rsIndex.getFile(rsIndex.getArchiveId(name), 0) == null) { + archiveId = var14.getArchiveId(name); + if(archiveId != -1) { + keys1 = writeKeys(regionId); + if(!var14.encryptArchive(archiveId, (int[])null, keys1, false, false)) { + throw new RuntimeException("FAIL"); + } + } + } + + name = "ul" + (regionX >> 3) / 8 + "_" + (regionY >> 3) / 8; + if(rsIndex.getFile(rsIndex.getArchiveId(name), 0) == null) { + archiveId = var14.getArchiveId(name); + if(archiveId != -1) { + if(keys1 == null) { + keys1 = writeKeys(regionId); + } + + if(!var14.encryptArchive(archiveId, (int[])null, keys1, false, false)) { + throw new RuntimeException("FAIL"); + } + } + } + } + + var14.rewriteTable(); + } + + if(encryptTables) { + int[][] var131 = new int[cache.getIndexes().length][]; + + int var141; + for(var141 = 0; var141 < var131.length; ++var141) { + var131[var141] = generateKeys(); + if(cache.getIndexes()[var141] != null) { + System.out.println("encrypting idx table: " + var141); + cache.getIndexes()[var141].setKeys(var131[var141]); + cache.getIndexes()[var141].rewriteTable(); + } + } + + for(var141 = 0; var141 < var131.length; ++var141) { + System.out.println(Arrays.toString(var131[var141])); + } + } + + } + + public static int[] generateKeys() { + int[] keys = new int[4]; + + for(int index = 0; index < keys.length; ++index) { + keys[index] = (new Random()).nextInt(); + } + + return keys; + } + + public static int[] writeKeys(int regionId) throws IOException { + BufferedWriter writer = new BufferedWriter(new FileWriter("718/maps/unpacked/" + regionId + ".txt")); + int[] keys = generateKeys(); + + for(int index = 0; index < keys.length; ++index) { + writer.write("" + keys[index]); + writer.newLine(); + writer.flush(); + } + + System.out.println("Region: " + regionId + ", " + Arrays.toString(keys)); + return keys; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/RSXteas.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/RSXteas.java new file mode 100644 index 000000000..f293f78c3 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/RSXteas.java @@ -0,0 +1,49 @@ +package com.alex.tools.clientCacheUpdater; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.HashMap; + +public final class RSXteas { + public static final HashMap mapContainersXteas = new HashMap(); + + public static final int[] getXteas(int regionId) { + return (int[])mapContainersXteas.get(Integer.valueOf(regionId)); + } + + public static final void loadUnpackedXteas(String location) { + try { + File var12 = new File(location); + File[] xteasFiles = var12.listFiles(); + File[] arr$ = xteasFiles; + int len$ = xteasFiles.length; + + for(int i$ = 0; i$ < len$; ++i$) { + File region = arr$[i$]; + String name = region.getName(); + if(!name.contains(".txt")) { + region.delete(); + } else { + short regionId = Short.parseShort(name.replace(".txt", "")); + if(regionId <= 0) { + region.delete(); + } else { + BufferedReader in = new BufferedReader(new FileReader(region)); + int[] xteas = new int[4]; + + for(int index = 0; index < 4; ++index) { + xteas[index] = Integer.parseInt(in.readLine()); + } + + mapContainersXteas.put(Integer.valueOf(regionId), xteas); + in.close(); + } + } + } + } catch (Exception var121) { + var121.printStackTrace(); + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/SpritesDumper.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/SpritesDumper.java new file mode 100644 index 000000000..7e21c0226 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/SpritesDumper.java @@ -0,0 +1,116 @@ +package com.alex.tools.clientCacheUpdater; + +import com.alex.store.Index; +import com.alex.store.Store; +import com.alex.tools.clientCacheUpdater.UpdateCache; + +import javax.imageio.ImageIO; +import javax.imageio.stream.ImageOutputStream; +import java.awt.image.BufferedImage; +import java.awt.image.ImageObserver; +import java.io.File; +import java.io.IOException; + +public class SpritesDumper { + public static void main2(String[] args) throws IOException { + BufferedImage background = ImageIO.read(new File("bg/matrix.jpg")); + int id = 3769; + int sx = background.getWidth() / 2; + int sy = background.getHeight() / 2; + + for(int y = 0; y < 2; ++y) { + for(int x = 0; x < 2; ++x) { + System.out.println("id " + id); + BufferedImage part = background.getSubimage(x * sx, y * sy, sx, sy); + ImageIO.write(part, "gif", new File("bg/" + id++ + ".gif")); + } + } + + } + + public static void main3(String[] args) throws IOException { + Store cache = new Store("cache667_2/", false); + UpdateCache.packLogo(cache); + System.out.println("Adding donator icon..."); + UpdateCache.packDonatorIcon(cache); + System.out.println("Adding Matrix icon..."); + UpdateCache.packMatrixIcon(cache); + } + + public static byte[] getImage(File file) throws IOException { + ImageOutputStream stream = ImageIO.createImageOutputStream(file); + byte[] data = new byte[(int)stream.length()]; + stream.read(data); + return data; + } + + public static void main(String[] args) throws IOException { + Store cache = new Store("718/rscache/"); + Index sprites = cache.getIndexes()[32]; + int[] arr$ = sprites.getTable().getValidArchiveIds(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int archiveId = arr$[i$]; + int[] arr$1 = sprites.getTable().getArchives()[archiveId].getValidFileIds(); + int len$1 = arr$1.length; + + for(int i$1 = 0; i$1 < len$1; ++i$1) { + int fileId = arr$1[i$1]; + byte[] data = sprites.getFile(archiveId, fileId); + Image image = Toolkit.getDefaultToolkit().createImage(data); + String name = "sprites32/" + archiveId + "_" + fileId; + BufferedImage bi = toBufferedImage(image); + if(bi == null) { + System.out.println("failed " + name); + } else { + ImageIO.write(bi, "png", new File(name + ".png")); + } + } + } + + } + + public static BufferedImage toBufferedImage(Image image) { + if(image instanceof BufferedImage) { + return (BufferedImage)image; + } else { + image = (new ImageIcon(image)).getImage(); + boolean hasAlpha = true; + BufferedImage bimage = null; + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + + byte g; + try { + g = 1; + if(hasAlpha) { + g = 2; + } + + GraphicsDevice g1 = ge.getDefaultScreenDevice(); + GraphicsConfiguration gc = g1.getDefaultConfiguration(); + if(image.getWidth((ImageObserver)null) < 0 || image.getHeight((ImageObserver)null) < 0) { + return null; + } + + bimage = gc.createCompatibleImage(image.getWidth((ImageObserver)null), image.getHeight((ImageObserver)null), g); + } catch (HeadlessException var7) { + ; + } + + if(bimage == null) { + g = 1; + if(hasAlpha) { + g = 2; + } + + bimage = new BufferedImage(image.getWidth((ImageObserver)null), image.getHeight((ImageObserver)null), g); + } + + Graphics2D g11 = bimage.createGraphics(); + g11.drawImage(image, 0, 0, (ImageObserver)null); + g11.dispose(); + return bimage; + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/UpdateCache.java b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/UpdateCache.java new file mode 100644 index 000000000..a277ea2b6 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/clientCacheUpdater/UpdateCache.java @@ -0,0 +1,357 @@ +package com.alex.tools.clientCacheUpdater; + +import com.alex.loaders.images.IndexedColorImageFile; +import com.alex.loaders.items.ItemDefinitions; +import com.alex.store.Index; +import com.alex.store.Store; +import com.alex.tools.clientCacheUpdater.RSXteas; +import com.alex.tools.clientCacheUpdater.SpritesDumper; +import com.alex.utils.Utils; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class UpdateCache { + public static byte[] getBytesFromFile(File file) throws IOException { + FileInputStream is = new FileInputStream(file); + long length = file.length(); + if(length > 2147483647L) { + ; + } + + byte[] bytes = new byte[(int)length]; + int offset = 0; + + int numRead1; + for(boolean numRead = false; offset < bytes.length && (numRead1 = is.read(bytes, offset, bytes.length - offset)) >= 0; offset += numRead1) { + ; + } + + if(offset < bytes.length) { + throw new IOException("Could not completely read file " + file.getName()); + } else { + is.close(); + return bytes; + } + } + + public static void main6(String[] args) throws IOException { + Store cache = new Store("cache667_2/", false); + cache.getIndexes()[6].putFile(0, 0, getBytesFromFile(new File("0"))); + } + + public static void main5(String[] args) throws IOException { + Store rscache = new Store("cache697/"); + Store cache = new Store("cache667_2/", false); + boolean result = false; + result = cache.getIndexes()[3].putArchive(320, rscache, false, false); + System.out.println("Packed skill interface: 320, " + result); + result = cache.getIndexes()[3].putArchive(679, rscache, false, false); + System.out.println("Packed skill interface: 679, " + result); + cache.getIndexes()[3].rewriteTable(); + } + + public static void main555(String[] args) throws IOException { + Store cache = new Store("cache667_2/", false); + Store originalCache = new Store("rscache/", false); + cache.addIndex(false, false, 2); + int[] arr$ = originalCache.getIndexes()[19].getTable().getValidArchiveIds(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int i = arr$[i$]; + System.out.println(i); + int[] arr$1 = originalCache.getIndexes()[19].getTable().getArchives()[i].getValidFileIds(); + int len$1 = arr$1.length; + + for(int i$1 = 0; i$1 < len$1; ++i$1) { + int i2 = arr$1[i$1]; + + try { + cache.getIndexes()[37].putFile(i, i2, 2, originalCache.getIndexes()[19].getFile(i, i2), (int[])null, false, false, -1, -1); + } catch (Throwable var12) { + var12.printStackTrace(); + } + } + } + + cache.getIndexes()[37].rewriteTable(); + } + + public static void main77(String[] args) throws IOException { + Store originalCache = new Store("cache667/", false); + Store cache = new Store("cache667_2/", false); + + for(int i = 1610; i < 1616; ++i) { + cache.getIndexes()[17].putFile(i >>> 8, i & 255, originalCache.getIndexes()[17].getFile(i >>> 8, i & 255)); + } + + } + + public static void packLogo(Store cache) throws IOException { + short id = 2498; + IndexedColorImageFile f = null; + + try { + f = new IndexedColorImageFile(new BufferedImage[]{ImageIO.read(new File("bg/logo.png"))}); + } catch (IOException var81) { + var81.printStackTrace(); + } + + byte[] data = f.encodeFile(); + cache.getIndexes()[8].putFile(id, 0, data); + + int i; + for(i = 4139; i <= 4146; ++i) { + try { + cache.getIndexes()[8].putFile(i, 0, (new IndexedColorImageFile(new BufferedImage[]{ImageIO.read(new File("bg/" + i + ".gif"))})).encodeFile()); + } catch (IOException var7) { + var7.printStackTrace(); + } + } + + for(i = 0; i < 4; ++i) { + int realid = 3769 + i; + int var8 = 3769 + i; + cache.getIndexes()[8].putFile(var8, 0, (new IndexedColorImageFile(new BufferedImage[]{ImageIO.read(new File("bg/" + realid + ".gif"))})).encodeFile()); + var8 = 3779 + i; + cache.getIndexes()[8].putFile(var8, 0, (new IndexedColorImageFile(new BufferedImage[]{ImageIO.read(new File("bg/" + realid + ".gif"))})).encodeFile()); + var8 = 3783 + (i >= 2?i - 2:i + 2); + cache.getIndexes()[8].putFile(var8, 0, (new IndexedColorImageFile(new BufferedImage[]{ImageIO.read(new File("bg/" + realid + ".gif"))})).encodeFile()); + var8 = 3769 + i; + cache.getIndexes()[34].putFile(var8, 0, (new IndexedColorImageFile(new BufferedImage[]{ImageIO.read(new File("bg/" + realid + ".gif"))})).encodeFile()); + var8 = 3779 + i; + cache.getIndexes()[34].putFile(var8, 0, (new IndexedColorImageFile(new BufferedImage[]{ImageIO.read(new File("bg/" + realid + ".gif"))})).encodeFile()); + var8 = 3783 + (i >= 2?i - 2:i + 2); + cache.getIndexes()[34].putFile(var8, 0, (new IndexedColorImageFile(new BufferedImage[]{ImageIO.read(new File("bg/" + realid + ".gif"))})).encodeFile()); + var8 = 3769 + i; + cache.getIndexes()[32].putFile(var8, 0, SpritesDumper.getImage(new File("bg/" + realid + ".png"))); + var8 = 3779 + i; + cache.getIndexes()[32].putFile(var8, 0, SpritesDumper.getImage(new File("bg/" + realid + ".png"))); + var8 = 3783 + (i >= 2?i - 2:i + 2); + cache.getIndexes()[32].putFile(var8, 0, SpritesDumper.getImage(new File("bg/" + realid + ".png"))); + System.out.println("added file: " + i); + } + + } + + public static void packDonatorIcon(Store cache) { + short id = 1455; + IndexedColorImageFile f = null; + + try { + f = new IndexedColorImageFile(cache, id, 0); + BufferedImage var7 = ImageIO.read(new File("1455.png")); + System.out.println("Added icon: " + f.addImage(var7) + "."); + BufferedImage icon2 = ImageIO.read(new File("1455f.png")); + System.out.println("Added icon2: " + f.addImage(icon2) + "."); + BufferedImage icon3 = ImageIO.read(new File("crown_green.gif")); + System.out.println("Added icon3: " + f.addImage(icon3) + "."); + BufferedImage icon4 = ImageIO.read(new File("1455_11.png")); + System.out.println("Added icon4: " + f.addImage(icon4) + "."); + } catch (IOException var71) { + var71.printStackTrace(); + } + + cache.getIndexes()[8].putFile(id, 0, f.encodeFile()); + } + + public static void packMatrixIcon(Store cache) { + short id = 2173; + IndexedColorImageFile f = null; + + try { + f = new IndexedColorImageFile(new BufferedImage[]{ImageIO.read(new File("2173.png"))}); + } catch (IOException var4) { + var4.printStackTrace(); + } + + byte[] data = f.encodeFile(); + cache.getIndexes()[8].putFile(id, 0, data); + } + + public static int packCustomModel(Store cache, byte[] data) { + int archiveId = cache.getIndexes()[7].getLastArchiveId() + 1; + if(cache.getIndexes()[7].putFile(archiveId, 0, data)) { + return archiveId; + } else { + System.out.println("Failing packing model " + archiveId); + return -1; + } + } + + public static void packCustomItems(Store cache) throws IOException { + int modelID = packCustomModel(cache, getBytesFromFile(new File("donatorCape.dat"))); + System.out.println("model id " + modelID); + ItemDefinitions donatorCape = ItemDefinitions.getItemDefinition(cache, 9747); + donatorCape.setName("Donator cape"); + donatorCape.femaleEquip1 = modelID; + donatorCape.maleEquip1 = modelID; + donatorCape.modelId = modelID; + donatorCape.resetModelColors(); + short newId = 29999; + System.out.println(cache.getIndexes()[19].putFile(newId >>> 8, 255 & newId, donatorCape.encode())); + } + + public static void main(String[] args) throws IOException { + boolean updateJustMaps = false; + boolean addOldItems = true; + Store rscache = new Store("cache697/"); + Store cache = new Store("cache667_2/", false); + Store originalCache = new Store("cache667/", false); + if(addOldItems) { + cache.resetIndex(19, false, false, 2); + } + + cache.resetIndex(7, false, false, 2); + cache.getIndexes()[7].packIndex(originalCache); + int regionId; + int regionX; + int regionY; + boolean var20; + int[] xteas; + if(!updateJustMaps) { + int var19; + for(var19 = 0; var19 < cache.getIndexes().length; ++var19) { + if(var19 != 3 && var19 != 5 && var19 != 12 && var19 != 33 && var19 != 30) { + boolean var21 = cache.getIndexes()[var19].packIndex(rscache, true); + System.out.println("Packed index archives: " + var19 + ", " + var21); + } + } + + System.out.println("Adding logo..."); + packLogo(cache); + System.out.println("Adding donator icon..."); + packDonatorIcon(cache); + System.out.println("Adding Matrix icon..."); + packMatrixIcon(cache); + System.out.println("Adding Custom items..."); + packCustomItems(cache); + int var22; + int var17; + if(addOldItems) { + System.out.println("Adding back old item definitions..."); + short var24 = 30000; + System.out.println(var24); + var22 = Utils.getItemDefinitionsSize(originalCache); + + for(var17 = var24; var17 < var24 + var22; ++var17) { + regionId = var17 - var24; + cache.getIndexes()[19].putFile(var17 >>> 8, 255 & var17, 2, originalCache.getIndexes()[19].getFile(regionId >>> 8, 255 & regionId), (int[])null, false, false, -1, -1); + } + + cache.getIndexes()[19].rewriteTable(); + } + + System.out.println("Recovering Client Script Maps..."); + int[] var211 = originalCache.getIndexes()[17].getTable().getValidArchiveIds(); + var22 = var211.length; + + for(var17 = 0; var17 < var22; ++var17) { + int data = var211[var17]; + xteas = originalCache.getIndexes()[17].getTable().getArchives()[data].getValidFileIds(); + regionX = xteas.length; + + for(regionY = 0; regionY < regionX; ++regionY) { + int name = xteas[regionY]; + if(!cache.getIndexes()[17].fileExists(data, name) || cache.getIndexes()[17].getFile(data, name).length == 1) { + cache.getIndexes()[17].putFile(data, name, originalCache.getIndexes()[17].getFile(data, name)); + } + } + } + + System.out.println("Recovering Bank Client Script Maps..."); + + for(var19 = 1610; var19 < 1616; ++var19) { + cache.getIndexes()[17].putFile(var19 >>> 8, var19 & 255, originalCache.getIndexes()[17].getFile(var19 >>> 8, var19 & 255)); + } + + System.out.println("Adding new interfaces..."); + + for(var19 = cache.getIndexes()[3].getLastArchiveId() + 1; var19 <= rscache.getIndexes()[3].getLastArchiveId(); ++var19) { + if(rscache.getIndexes()[3].archiveExists(var19)) { + cache.getIndexes()[3].putArchive(var19, rscache, false, false); + } + } + + cache.getIndexes()[3].putArchive(320, rscache, false, false); + cache.getIndexes()[3].putArchive(751, rscache, false, false); + cache.getIndexes()[3].putArchive(1092, rscache, false, false); + var20 = cache.getIndexes()[3].rewriteTable(); + cache.getIndexes()[8].rewriteTable(); + System.out.println("Packed new interfaces: " + var20); + } + + Index var18 = cache.getIndexes()[5]; + Index var191 = rscache.getIndexes()[5]; + Index var201 = originalCache.getIndexes()[5]; + RSXteas.loadUnpackedXteas("old"); + System.out.println("Updating Maps."); + + for(regionId = 0; regionId < 30000; ++regionId) { + regionX = (regionId >> 8) * 64; + regionY = (regionId & 255) * 64; + String var221 = "m" + (regionX >> 3) / 8 + "_" + (regionY >> 3) / 8; + byte[] var23 = var191.getFile(var191.getArchiveId(var221)); + if(var23 == null) { + var23 = var201.getFile(var201.getArchiveId(var221)); + } + + if(var23 != null) { + var20 = addMapFile(var18, var221, var23); + System.out.println(var221 + ", " + var20); + } + + var221 = "um" + (regionX >> 3) / 8 + "_" + (regionY >> 3) / 8; + var23 = var191.getFile(var191.getArchiveId(var221)); + if(var23 == null) { + var23 = var201.getFile(var201.getArchiveId(var221)); + } + + if(var23 != null) { + var20 = addMapFile(var18, var221, var23); + System.out.println(var221 + ", " + var20); + } + + xteas = RSXteas.getXteas(regionId); + var221 = "l" + (regionX >> 3) / 8 + "_" + (regionY >> 3) / 8; + var23 = var191.getFile(var191.getArchiveId(var221), 0, xteas); + if(var23 != null) { + var20 = addMapFile(var18, var221, var23); + System.out.println(var221 + ", " + var20); + } + + var221 = "ul" + (regionX >> 3) / 8 + "_" + (regionY >> 3) / 8; + var23 = var191.getFile(var191.getArchiveId(var221), 0, xteas); + if(var23 != null) { + var20 = addMapFile(var18, var221, var23); + System.out.println(var221 + ", " + var20); + } + + var221 = "n" + (regionX >> 3) / 8 + "_" + (regionY >> 3) / 8; + var23 = var191.getFile(var191.getArchiveId(var221), 0); + if(var23 == null) { + var23 = var201.getFile(var201.getArchiveId(var221), 0); + } + + if(var23 != null) { + var20 = addMapFile(var18, var221, var23); + System.out.println(var221 + ", " + var20); + } + } + + var18.rewriteTable(); + } + + public static boolean addMapFile(Index index, String name, byte[] data) { + int archiveId = index.getArchiveId(name); + if(archiveId == -1) { + archiveId = index.getTable().getValidArchiveIds().length; + } + + return index.putFile(archiveId, 0, 2, data, (int[])null, false, false, Utils.getNameHash(name), -1); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/itemsDefsEditor/Application.java b/Tools/Frostys Cache Editor/src/com/alex/tools/itemsDefsEditor/Application.java new file mode 100644 index 000000000..e52a09a54 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/itemsDefsEditor/Application.java @@ -0,0 +1,197 @@ +package com.alex.tools.itemsDefsEditor; + +import com.alex.loaders.items.ItemDefinitions; +import com.alex.store.Store; +import com.alex.tools.itemsDefsEditor.GeneratedUkeys; +import com.alex.tools.itemsDefsEditor.ItemDefsEditor; +import com.alex.utils.Utils; + +import javax.swing.UIManager.LookAndFeelInfo; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; + +public class Application { + public static Store STORE; + private JFrame frmCacheEditorV; + private JList itemsList; + private DefaultListModel itemsListmodel; + + public static void main(String[] args) throws IOException { + STORE = new Store("cache/", false); + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + Application var2 = new Application(); + var2.frmCacheEditorV.setVisible(true); + } catch (Exception var21) { + var21.printStackTrace(); + } + + } + }); + } + + public Application() { + this.initialize(); + } + + private void setLook() { + boolean found = false; + LookAndFeelInfo[] e = UIManager.getInstalledLookAndFeels(); + int len$ = e.length; + + for(int var7 = 0; var7 < len$; ++var7) { + LookAndFeelInfo info = e[var7]; + if(info.getName().equals("Nimbus")) { + try { + UIManager.setLookAndFeel(info.getClassName()); + found = true; + } catch (Exception var8) { + var8.printStackTrace(); + } + } + } + + if(!found) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception var71) { + var71.printStackTrace(); + } + } + + } + + private void initialize() { + this.setLook(); + this.frmCacheEditorV = new JFrame(); + this.frmCacheEditorV.setTitle("Cache Editor V0.1"); + this.frmCacheEditorV.setBounds(100, 100, 352, 435); + this.frmCacheEditorV.setDefaultCloseOperation(3); + JTabbedPane tabbedPane = new JTabbedPane(1); + this.frmCacheEditorV.getContentPane().add(tabbedPane, "Center"); + JPanel panel = new JPanel(); + tabbedPane.addTab("Main", (Icon)null, panel, (String)null); + panel.setLayout((LayoutManager)null); + JButton btnGenerateUkeys = new JButton("Generate Ukeys (614- Client Builts)"); + btnGenerateUkeys.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + byte[] ukeys = Utils.getArchivePacketData(255, 255, Application.STORE.generateIndex255Archive255Outdated()); + new GeneratedUkeys(Application.this.getFrame(), ukeys); + } + }); + btnGenerateUkeys.setBounds(33, 64, 257, 28); + panel.add(btnGenerateUkeys); + JLabel lblCreatedByAlexalso = new JLabel("Created By Alex(Also named Dragonkk)"); + lblCreatedByAlexalso.setFont(new Font("Tekton Pro Ext", 0, 15)); + lblCreatedByAlexalso.setBounds(6, 290, 322, 46); + panel.add(lblCreatedByAlexalso); + JPanel panel_1 = new JPanel(); + tabbedPane.addTab("Items", (Icon)null, panel_1, (String)null); + panel_1.setLayout((LayoutManager)null); + this.itemsListmodel = new DefaultListModel(); + this.itemsList = new JList(this.itemsListmodel); + this.itemsList.setSelectionMode(1); + this.itemsList.setLayoutOrientation(0); + this.itemsList.setVisibleRowCount(-1); + JScrollPane itemListscrollPane = new JScrollPane(this.itemsList); + itemListscrollPane.setBounds(34, 49, 155, 254); + panel_1.add(itemListscrollPane); + JButton btnEdit = new JButton("Edit"); + btnEdit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ItemDefinitions defs = (ItemDefinitions)Application.this.itemsList.getSelectedValue(); + if(defs != null) { + new ItemDefsEditor(Application.this, defs); + } + + } + }); + btnEdit.setBounds(201, 48, 90, 28); + panel_1.add(btnEdit); + JButton btnAdd = new JButton("Add"); + btnAdd.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new ItemDefsEditor(Application.this, new ItemDefinitions(Application.STORE, Utils.getItemDefinitionsSize(Application.STORE), false)); + } + }); + btnAdd.setBounds(201, 88, 90, 28); + panel_1.add(btnAdd); + JButton btnRemove = new JButton("Remove"); + btnRemove.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ItemDefinitions defs = (ItemDefinitions)Application.this.itemsList.getSelectedValue(); + if(defs != null) { + Application.STORE.getIndexes()[19].removeFile(defs.getArchiveId(), defs.getFileId()); + Application.this.removeItemDefs(defs); + } + + } + }); + btnRemove.setBounds(201, 128, 90, 28); + panel_1.add(btnRemove); + JLabel label = new JLabel("Cached Items:"); + label.setFont(new Font("Comic Sans MS", 0, 18)); + label.setBounds(34, 18, 155, 21); + panel_1.add(label); + JButton btnDuplicate = new JButton("Clone"); + btnDuplicate.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ItemDefinitions defs = (ItemDefinitions)Application.this.itemsList.getSelectedValue(); + if(defs != null) { + defs = (ItemDefinitions)defs.clone(); + if(defs != null) { + defs.id = Utils.getItemDefinitionsSize(Application.STORE); + new ItemDefsEditor(Application.this, defs); + } + } + + } + }); + btnDuplicate.setBounds(201, 168, 90, 28); + panel_1.add(btnDuplicate); + this.addAllItems(); + } + + public void addAllItems() { + for(int id = 0; id < Utils.getItemDefinitionsSize(STORE) - 22314; ++id) { + this.addItemDefs(ItemDefinitions.getItemDefinition(STORE, id)); + } + + } + + public void addItemDefs(final ItemDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + Application.this.itemsListmodel.addElement(defs); + } + }); + } + + public void updateItemDefs(final ItemDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + int index = Application.this.itemsListmodel.indexOf(defs); + if(index == -1) { + Application.this.itemsListmodel.addElement(defs); + } else { + Application.this.itemsListmodel.setElementAt(defs, index); + } + + } + }); + } + + public void removeItemDefs(final ItemDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + Application.this.itemsListmodel.removeElement(defs); + } + }); + } + + public JFrame getFrame() { + return this.frmCacheEditorV; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/itemsDefsEditor/GeneratedUkeys.java b/Tools/Frostys Cache Editor/src/com/alex/tools/itemsDefsEditor/GeneratedUkeys.java new file mode 100644 index 000000000..923d4ef42 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/itemsDefsEditor/GeneratedUkeys.java @@ -0,0 +1,39 @@ +package com.alex.tools.itemsDefsEditor; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Arrays; + +public class GeneratedUkeys extends JDialog { + private static final long serialVersionUID = -4163755150981048484L; + + public GeneratedUkeys(JFrame frame, byte[] ukeys) { + super(frame, "Ukeys", true); + this.setBounds(100, 100, 450, 300); + this.getContentPane().setLayout((LayoutManager)null); + final JEditorPane editorPane = new JEditorPane(); + editorPane.setText(Arrays.toString(ukeys)); + editorPane.setBounds(6, 6, 420, 213); + this.getContentPane().add(editorPane); + JButton btnClose = new JButton("Close"); + btnClose.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + GeneratedUkeys.this.dispose(); + } + }); + btnClose.setBounds(101, 221, 90, 28); + this.getContentPane().add(btnClose); + JButton btnCopy = new JButton("Copy"); + btnCopy.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ActionEvent nev = new ActionEvent(editorPane, 1001, "copy"); + editorPane.selectAll(); + editorPane.getActionMap().get(nev.getActionCommand()).actionPerformed(nev); + } + }); + btnCopy.setBounds(6, 221, 90, 28); + this.getContentPane().add(btnCopy); + this.setDefaultCloseOperation(2); + this.setVisible(true); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/tools/itemsDefsEditor/ItemDefsEditor.java b/Tools/Frostys Cache Editor/src/com/alex/tools/itemsDefsEditor/ItemDefsEditor.java new file mode 100644 index 000000000..f408c6330 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/tools/itemsDefsEditor/ItemDefsEditor.java @@ -0,0 +1,351 @@ +package com.alex.tools.itemsDefsEditor; + +import com.alex.loaders.items.ItemDefinitions; +import com.alex.tools.itemsDefsEditor.Application; + +import javax.swing.border.EmptyBorder; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ItemDefsEditor extends JDialog { + private static final long serialVersionUID = 779623426244652906L; + private final JPanel contentPanel = new JPanel(); + private ItemDefinitions defs; + private Application application; + private JTextField modelIDField; + private JTextField nameField; + private JTextField modelZoomField; + private JTextField groundOptionsField; + private JTextField inventoryOptionsField; + private JTextField femaleModelId2Field; + private JTextField maleModelId1Field; + private JTextField maleModelId2Field; + private JTextField maleModelId3Field; + private JTextField femaleModelId1Field; + private JTextField femaleModelId3Field; + private JTextField teamIdField; + private JTextField notedItemIdField; + private JTextField switchNotedItemField; + private JTextField lendedItemIdField; + private JTextField switchLendedItemField; + private JTextField changedModelColorsField; + private JTextField changedTextureColorsField; + private JCheckBox membersOnlyCheck; + private JTextField price; + + public void save() { + this.defs.setInvModelId(Integer.valueOf(this.modelIDField.getText()).intValue()); + this.defs.setName(this.nameField.getText()); + this.defs.setInvModelZoom(Integer.valueOf(this.modelZoomField.getText()).intValue()); + String[] groundOptions = this.groundOptionsField.getText().split(";"); + + for(int var9 = 0; var9 < this.defs.getGroundOptions().length; ++var9) { + this.defs.getGroundOptions()[var9] = groundOptions[var9].equals("null")?null:groundOptions[var9]; + } + + String[] var91 = this.inventoryOptionsField.getText().split(";"); + + for(int t = 0; t < this.defs.getInventoryOptions().length; ++t) { + this.defs.getInventoryOptions()[t] = var91[t].equals("null")?null:var91[t]; + } + + this.defs.maleEquip1 = Integer.valueOf(this.maleModelId1Field.getText()).intValue(); + this.defs.maleEquip2 = Integer.valueOf(this.maleModelId2Field.getText()).intValue(); + this.defs.maleEquipModelId3 = Integer.valueOf(this.maleModelId3Field.getText()).intValue(); + this.defs.femaleEquip1 = Integer.valueOf(this.femaleModelId1Field.getText()).intValue(); + this.defs.femaleEquip2 = Integer.valueOf(this.femaleModelId2Field.getText()).intValue(); + this.defs.femaleEquipModelId3 = Integer.valueOf(this.femaleModelId3Field.getText()).intValue(); + this.defs.teamId = Integer.valueOf(this.teamIdField.getText()).intValue(); + this.defs.notedItemId = Integer.valueOf(this.notedItemIdField.getText()).intValue(); + this.defs.switchNoteItemId = Integer.valueOf(this.switchNotedItemField.getText()).intValue(); + this.defs.lendedItemId = Integer.valueOf(this.lendedItemIdField.getText()).intValue(); + this.defs.switchLendItemId = Integer.valueOf(this.switchLendedItemField.getText()).intValue(); + this.defs.resetModelColors(); + int var5; + int var6; + String[] var7; + String[] editedColor; + String[] var10; + String var101; + if(!this.changedModelColorsField.getText().equals("")) { + var10 = this.changedModelColorsField.getText().split(";"); + var7 = var10; + var6 = var10.length; + + for(var5 = 0; var5 < var6; ++var5) { + var101 = var7[var5]; + editedColor = var101.split("="); + this.defs.changeModelColor(Integer.valueOf(editedColor[0]).intValue(), Integer.valueOf(editedColor[1]).intValue()); + } + } + + this.defs.resetTextureColors(); + if(!this.changedTextureColorsField.getText().equals("")) { + var10 = this.changedTextureColorsField.getText().split(";"); + var7 = var10; + var6 = var10.length; + + for(var5 = 0; var5 < var6; ++var5) { + var101 = var7[var5]; + editedColor = var101.split("="); + this.defs.changeTextureColor(Short.valueOf(editedColor[0]).shortValue(), Short.valueOf(editedColor[1]).shortValue()); + } + } + + this.defs.membersOnly = this.membersOnlyCheck.isSelected(); + this.defs.value = Integer.valueOf(this.price.getText()).intValue(); + this.defs.equipType = Integer.valueOf(this.modelIDField.getText()).intValue(); + this.defs.equipSlot = Integer.valueOf(this.modelIDField.getText()).intValue(); + this.defs.write(Application.STORE); + this.application.updateItemDefs(this.defs); + } + + public ItemDefsEditor(Application application, ItemDefinitions defs) { + super(application.getFrame(), "Item Definitions Editor", true); + this.defs = defs; + this.application = application; + this.setBounds(100, 100, 912, 354); + this.getContentPane().setLayout(new BorderLayout()); + this.contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); + this.getContentPane().add(this.contentPanel, "Center"); + this.contentPanel.setLayout((LayoutManager)null); + JLabel lblNewLabel = new JLabel("Model ID:"); + lblNewLabel.setFont(new Font("Comic Sans MS", 0, 14)); + lblNewLabel.setBounds(6, 43, 81, 21); + this.contentPanel.add(lblNewLabel); + this.modelIDField = new JTextField(); + this.modelIDField.setBounds(139, 40, 122, 28); + this.contentPanel.add(this.modelIDField); + this.modelIDField.setColumns(10); + this.modelIDField.setText("" + defs.getInvModelId()); + JLabel label = new JLabel("Name:"); + label.setFont(new Font("Comic Sans MS", 0, 14)); + label.setBounds(6, 76, 81, 21); + this.contentPanel.add(label); + this.nameField = new JTextField(); + this.nameField.setBounds(139, 73, 122, 28); + this.contentPanel.add(this.nameField); + this.nameField.setColumns(10); + this.nameField.setText(defs.getName()); + label = new JLabel("Model Zoom:"); + label.setFont(new Font("Comic Sans MS", 0, 14)); + label.setBounds(6, 109, 95, 21); + this.contentPanel.add(label); + this.modelZoomField = new JTextField(); + this.modelZoomField.setBounds(139, 106, 122, 28); + this.contentPanel.add(this.modelZoomField); + this.modelZoomField.setColumns(10); + this.modelZoomField.setText("" + defs.getInvModelZoom()); + label = new JLabel("Ground Options:"); + label.setFont(new Font("Comic Sans MS", 0, 14)); + label.setBounds(6, 142, 108, 21); + this.contentPanel.add(label); + this.groundOptionsField = new JTextField(); + this.groundOptionsField.setBounds(139, 139, 122, 28); + this.contentPanel.add(this.groundOptionsField); + this.groundOptionsField.setColumns(10); + String var14 = ""; + String[] label_1 = defs.getGroundOptions(); + int label_2 = label_1.length; + + int label_3; + String label_4; + for(label_3 = 0; label_3 < label_2; ++label_3) { + label_4 = label_1[label_3]; + var14 = var14 + (label_4 == null?"null":label_4) + ";"; + } + + this.groundOptionsField.setText(var14); + label = new JLabel("Inventory Options:"); + label.setFont(new Font("Comic Sans MS", 0, 14)); + label.setBounds(6, 175, 139, 21); + this.contentPanel.add(label); + this.inventoryOptionsField = new JTextField(); + this.inventoryOptionsField.setBounds(139, 172, 122, 28); + this.contentPanel.add(this.inventoryOptionsField); + this.inventoryOptionsField.setColumns(10); + var14 = ""; + label_1 = defs.getInventoryOptions(); + label_2 = label_1.length; + + for(label_3 = 0; label_3 < label_2; ++label_3) { + label_4 = label_1[label_3]; + var14 = var14 + (label_4 == null?"null":label_4) + ";"; + } + + this.inventoryOptionsField.setText(var14); + JButton var16 = new JButton("Save"); + var16.setBounds(6, 265, 55, 28); + this.contentPanel.add(var16); + var16.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ItemDefsEditor.this.save(); + ItemDefsEditor.this.dispose(); + } + }); + this.getRootPane().setDefaultButton(var16); + var16 = new JButton("Cancel"); + var16.setBounds(73, 265, 67, 28); + this.contentPanel.add(var16); + var16.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ItemDefsEditor.this.dispose(); + } + }); + var16.setActionCommand("Cancel"); + label = new JLabel("Interface / Droped"); + label.setFont(new Font("Comic Sans MS", 0, 18)); + label.setBounds(6, 6, 205, 21); + this.contentPanel.add(label); + JLabel var15 = new JLabel("Wearing"); + var15.setFont(new Font("Comic Sans MS", 0, 18)); + var15.setBounds(273, 6, 205, 21); + this.contentPanel.add(var15); + JLabel var17 = new JLabel("Male Model ID 1:"); + var17.setFont(new Font("Comic Sans MS", 0, 14)); + var17.setBounds(273, 43, 131, 21); + this.contentPanel.add(var17); + JLabel var18 = new JLabel("Male Model ID 2:"); + var18.setFont(new Font("Comic Sans MS", 0, 14)); + var18.setBounds(273, 76, 131, 21); + this.contentPanel.add(var18); + JLabel var19 = new JLabel("Male Model ID 3:"); + var19.setFont(new Font("Comic Sans MS", 0, 14)); + var19.setBounds(273, 112, 131, 21); + this.contentPanel.add(var19); + JLabel label_5 = new JLabel("Female Model ID 1:"); + label_5.setFont(new Font("Comic Sans MS", 0, 14)); + label_5.setBounds(273, 145, 131, 21); + this.contentPanel.add(label_5); + JLabel label_6 = new JLabel("Female Model ID 2:"); + label_6.setFont(new Font("Comic Sans MS", 0, 14)); + label_6.setBounds(273, 175, 131, 21); + this.contentPanel.add(label_6); + JLabel label_7 = new JLabel("Female Model ID 3:"); + label_7.setFont(new Font("Comic Sans MS", 0, 14)); + label_7.setBounds(273, 208, 131, 21); + this.contentPanel.add(label_7); + this.femaleModelId2Field = new JTextField(); + this.femaleModelId2Field.setBounds(411, 172, 122, 28); + this.contentPanel.add(this.femaleModelId2Field); + this.femaleModelId2Field.setColumns(10); + this.femaleModelId2Field.setText("" + defs.femaleEquip2); + this.maleModelId1Field = new JTextField(); + this.maleModelId1Field.setBounds(411, 40, 122, 28); + this.contentPanel.add(this.maleModelId1Field); + this.maleModelId1Field.setColumns(10); + this.maleModelId1Field.setText("" + defs.maleEquip1); + this.maleModelId2Field = new JTextField(); + this.maleModelId2Field.setBounds(411, 73, 122, 28); + this.contentPanel.add(this.maleModelId2Field); + this.maleModelId2Field.setColumns(10); + this.maleModelId2Field.setText("" + defs.maleEquip2); + this.maleModelId3Field = new JTextField(); + this.maleModelId3Field.setBounds(411, 106, 122, 28); + this.contentPanel.add(this.maleModelId3Field); + this.maleModelId3Field.setColumns(10); + this.maleModelId3Field.setText("" + defs.maleEquipModelId3); + this.femaleModelId1Field = new JTextField(); + this.femaleModelId1Field.setBounds(411, 139, 122, 28); + this.contentPanel.add(this.femaleModelId1Field); + this.femaleModelId1Field.setColumns(10); + this.femaleModelId1Field.setText("" + defs.femaleEquip1); + this.femaleModelId3Field = new JTextField(); + this.femaleModelId3Field.setBounds(411, 205, 122, 28); + this.contentPanel.add(this.femaleModelId3Field); + this.femaleModelId3Field.setColumns(10); + this.femaleModelId3Field.setText("" + defs.femaleEquipModelId3); + JLabel buttonPane = new JLabel("Team ID:"); + buttonPane.setFont(new Font("Comic Sans MS", 0, 14)); + buttonPane.setBounds(273, 241, 131, 21); + this.contentPanel.add(buttonPane); + this.teamIdField = new JTextField(); + this.teamIdField.setBounds(411, 238, 122, 28); + this.contentPanel.add(this.teamIdField); + this.teamIdField.setColumns(10); + this.teamIdField.setText("" + defs.teamId); + buttonPane = new JLabel("Others"); + buttonPane.setFont(new Font("Comic Sans MS", 0, 18)); + buttonPane.setBounds(539, 6, 205, 21); + this.contentPanel.add(buttonPane); + buttonPane = new JLabel("Noted Item ID:"); + buttonPane.setFont(new Font("Comic Sans MS", 0, 14)); + buttonPane.setBounds(545, 43, 131, 21); + this.contentPanel.add(buttonPane); + buttonPane = new JLabel("Switch Noted Item Id:"); + buttonPane.setFont(new Font("Comic Sans MS", 0, 14)); + buttonPane.setBounds(545, 76, 160, 21); + this.contentPanel.add(buttonPane); + buttonPane = new JLabel("Lended Item ID:"); + buttonPane.setFont(new Font("Comic Sans MS", 0, 14)); + buttonPane.setBounds(545, 109, 160, 21); + this.contentPanel.add(buttonPane); + buttonPane = new JLabel("Switch Lended Item Id:"); + buttonPane.setFont(new Font("Comic Sans MS", 0, 14)); + buttonPane.setBounds(545, 145, 160, 21); + this.contentPanel.add(buttonPane); + this.notedItemIdField = new JTextField(); + this.notedItemIdField.setBounds(707, 39, 122, 28); + this.contentPanel.add(this.notedItemIdField); + this.notedItemIdField.setColumns(10); + this.notedItemIdField.setText("" + defs.notedItemId); + this.switchNotedItemField = new JTextField(); + this.switchNotedItemField.setBounds(707, 73, 122, 28); + this.contentPanel.add(this.switchNotedItemField); + this.switchNotedItemField.setColumns(10); + this.switchNotedItemField.setText("" + defs.switchNoteItemId); + this.lendedItemIdField = new JTextField(); + this.lendedItemIdField.setBounds(707, 106, 122, 28); + this.contentPanel.add(this.lendedItemIdField); + this.lendedItemIdField.setColumns(10); + this.lendedItemIdField.setText("" + defs.lendedItemId); + this.switchLendedItemField = new JTextField(); + this.switchLendedItemField.setBounds(707, 139, 122, 28); + this.contentPanel.add(this.switchLendedItemField); + this.switchLendedItemField.setColumns(10); + this.switchLendedItemField.setText("" + defs.switchLendItemId); + buttonPane = new JLabel("Changed Model Colors:"); + buttonPane.setFont(new Font("Comic Sans MS", 0, 14)); + buttonPane.setBounds(545, 175, 160, 21); + this.contentPanel.add(buttonPane); + this.changedModelColorsField = new JTextField(); + this.changedModelColorsField.setBounds(707, 172, 122, 28); + this.contentPanel.add(this.changedModelColorsField); + this.changedModelColorsField.setColumns(10); + String var20 = ""; + int i; + if(defs.originalModelColors != null) { + for(i = 0; i < defs.originalModelColors.length; ++i) { + var20 = var20 + defs.originalModelColors[i] + "=" + defs.modifiedModelColors[i] + ";"; + } + } + + this.changedModelColorsField.setText(var20); + buttonPane = new JLabel("Changed Texture Colors:"); + buttonPane.setFont(new Font("Comic Sans MS", 0, 14)); + buttonPane.setBounds(545, 205, 160, 21); + this.contentPanel.add(buttonPane); + this.changedTextureColorsField = new JTextField(); + this.changedTextureColorsField.setBounds(707, 205, 122, 28); + this.contentPanel.add(this.changedTextureColorsField); + this.changedTextureColorsField.setColumns(10); + var20 = ""; + if(defs.originalTextureColors != null) { + for(i = 0; i < defs.originalTextureColors.length; ++i) { + var20 = var20 + defs.originalTextureColors[i] + "=" + defs.modifiedTextureColors[i] + ";"; + } + } + + this.changedTextureColorsField.setText(var20); + this.membersOnlyCheck = new JCheckBox("Members Only"); + this.membersOnlyCheck.setFont(new Font("Comic Sans MS", 0, 14)); + this.membersOnlyCheck.setBounds(545, 243, 131, 18); + this.membersOnlyCheck.setSelected(defs.membersOnly); + this.contentPanel.add(this.membersOnlyCheck); + JPanel var21 = new JPanel(); + var21.setLayout(new FlowLayout(2)); + this.getContentPane().add(var21, "South"); + this.setDefaultCloseOperation(2); + this.setVisible(true); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/util/bzip2/BZip2BlockEntry.java b/Tools/Frostys Cache Editor/src/com/alex/util/bzip2/BZip2BlockEntry.java new file mode 100644 index 000000000..20478b127 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/util/bzip2/BZip2BlockEntry.java @@ -0,0 +1,36 @@ +package com.alex.util.bzip2; + +public class BZip2BlockEntry { + boolean[] aBooleanArray2205 = new boolean[16]; + boolean[] aBooleanArray2213 = new boolean[256]; + byte aByte2201; + byte[] aByteArray2204 = new byte[4096]; + byte[] aByteArray2211 = new byte[256]; + byte[] aByteArray2212; + byte[] aByteArray2214 = new byte[18002]; + byte[] aByteArray2219 = new byte[18002]; + byte[] aByteArray2224; + byte[][] aByteArrayArray2229 = new byte[6][258]; + int anInt2202; + int anInt2203 = 0; + int anInt2206; + int anInt2207; + int anInt2208; + int anInt2209 = 0; + int anInt2215; + int anInt2216; + int anInt2217; + int anInt2221; + int anInt2222; + int anInt2223; + int anInt2225; + int anInt2227; + int anInt2232; + int[] anIntArray2200 = new int[6]; + int[] anIntArray2220 = new int[257]; + int[] anIntArray2226 = new int[16]; + int[] anIntArray2228 = new int[256]; + int[][] anIntArrayArray2210 = new int[6][258]; + int[][] anIntArrayArray2218 = new int[6][258]; + int[][] anIntArrayArray2230 = new int[6][258]; +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/util/bzip2/BZip2Compressor.java b/Tools/Frostys Cache Editor/src/com/alex/util/bzip2/BZip2Compressor.java new file mode 100644 index 000000000..95dea2713 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/util/bzip2/BZip2Compressor.java @@ -0,0 +1,22 @@ +package com.alex.util.bzip2; + +import org.apache.tools.bzip2.CBZip2OutputStream; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +public class BZip2Compressor { + public static final byte[] compress(byte[] data) { + ByteArrayOutputStream compressedBytes = new ByteArrayOutputStream(); + + try { + CBZip2OutputStream var3 = new CBZip2OutputStream(compressedBytes); + var3.write(data); + var3.close(); + return compressedBytes.toByteArray(); + } catch (IOException var31) { + var31.printStackTrace(); + return null; + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/util/bzip2/BZip2Decompressor.java b/Tools/Frostys Cache Editor/src/com/alex/util/bzip2/BZip2Decompressor.java new file mode 100644 index 000000000..745ab4126 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/util/bzip2/BZip2Decompressor.java @@ -0,0 +1,584 @@ +package com.alex.util.bzip2; + +import com.alex.util.bzip2.BZip2BlockEntry; + +public class BZip2Decompressor { + private static int[] anIntArray257; + private static BZip2BlockEntry entryInstance = new BZip2BlockEntry(); + + public static final void decompress(byte[] decompressedData, byte[] packedData, int containerSize, int blockSize) { + BZip2BlockEntry var4 = entryInstance; + BZip2BlockEntry var5 = entryInstance; + synchronized(entryInstance) { + entryInstance.aByteArray2224 = packedData; + entryInstance.anInt2209 = blockSize; + entryInstance.aByteArray2212 = decompressedData; + entryInstance.anInt2203 = 0; + entryInstance.anInt2206 = decompressedData.length; + entryInstance.anInt2232 = 0; + entryInstance.anInt2207 = 0; + entryInstance.anInt2217 = 0; + entryInstance.anInt2216 = 0; + method1793(entryInstance); + entryInstance.aByteArray2224 = null; + entryInstance.aByteArray2212 = null; + } + } + + private static final void method1785(BZip2BlockEntry entry) { + entry.anInt2215 = 0; + + for(int i = 0; i < 256; ++i) { + if(entry.aBooleanArray2213[i]) { + entry.aByteArray2211[entry.anInt2215] = (byte)i; + ++entry.anInt2215; + } + } + + } + + private static final void method1786(int[] ai, int[] ai1, int[] ai2, byte[] abyte0, int i, int j, int k) { + int l = 0; + + int i3; + int k2; + for(i3 = i; i3 <= j; ++i3) { + for(k2 = 0; k2 < k; ++k2) { + if(abyte0[k2] == i3) { + ai2[l] = k2; + ++l; + } + } + } + + for(i3 = 0; i3 < 23; ++i3) { + ai1[i3] = 0; + } + + for(i3 = 0; i3 < k; ++i3) { + ++ai1[abyte0[i3] + 1]; + } + + for(i3 = 1; i3 < 23; ++i3) { + ai1[i3] += ai1[i3 - 1]; + } + + for(i3 = 0; i3 < 23; ++i3) { + ai[i3] = 0; + } + + i3 = 0; + + for(k2 = i; k2 <= j; ++k2) { + i3 += ai1[k2 + 1] - ai1[k2]; + ai[k2] = i3 - 1; + i3 <<= 1; + } + + for(k2 = i + 1; k2 <= j; ++k2) { + ai1[k2] = (ai[k2 - 1] + 1 << 1) - ai1[k2]; + } + + } + + private static final void method1787(BZip2BlockEntry entry) { + byte byte4 = entry.aByte2201; + int i = entry.anInt2222; + int j = entry.anInt2227; + int k = entry.anInt2221; + int[] ai = anIntArray257; + int l = entry.anInt2208; + byte[] abyte0 = entry.aByteArray2212; + int i1 = entry.anInt2203; + int j1 = entry.anInt2206; + int l1 = entry.anInt2225 + 1; + + label63: + while(true) { + if(i > 0) { + while(true) { + if(j1 == 0) { + break label63; + } + + if(i == 1) { + if(j1 == 0) { + i = 1; + break label63; + } + + abyte0[i1] = byte4; + ++i1; + --j1; + break; + } + + abyte0[i1] = byte4; + --i; + ++i1; + --j1; + } + } + + boolean flag = true; + + byte byte1; + while(flag) { + flag = false; + if(j == l1) { + i = 0; + break label63; + } + + byte4 = (byte)k; + l = ai[l]; + byte1 = (byte)(l & 255); + l >>= 8; + ++j; + if(byte1 != k) { + k = byte1; + if(j1 == 0) { + i = 1; + break label63; + } + + abyte0[i1] = byte4; + ++i1; + --j1; + flag = true; + } else if(j == l1) { + if(j1 == 0) { + i = 1; + break label63; + } + + abyte0[i1] = byte4; + ++i1; + --j1; + flag = true; + } + } + + i = 2; + l = ai[l]; + byte1 = (byte)(l & 255); + l >>= 8; + ++j; + if(j != l1) { + if(byte1 != k) { + k = byte1; + } else { + i = 3; + l = ai[l]; + byte byte2 = (byte)(l & 255); + l >>= 8; + ++j; + if(j != l1) { + if(byte2 != k) { + k = byte2; + } else { + l = ai[l]; + byte byte3 = (byte)(l & 255); + l >>= 8; + ++j; + i = (byte3 & 255) + 4; + l = ai[l]; + k = (byte)(l & 255); + l >>= 8; + ++j; + } + } + } + } + } + + entry.anInt2216 += j1 - j1; + entry.aByte2201 = byte4; + entry.anInt2222 = i; + entry.anInt2227 = j; + entry.anInt2221 = k; + anIntArray257 = ai; + entry.anInt2208 = l; + entry.aByteArray2212 = abyte0; + entry.anInt2203 = i1; + entry.anInt2206 = j1; + } + + private static final byte method1788(BZip2BlockEntry entry) { + return (byte)method1790(1, entry); + } + + private static final byte method1789(BZip2BlockEntry entry) { + return (byte)method1790(8, entry); + } + + private static final int method1790(int i, BZip2BlockEntry entry) { + while(entry.anInt2232 < i) { + entry.anInt2207 = entry.anInt2207 << 8 | entry.aByteArray2224[entry.anInt2209] & 255; + entry.anInt2232 += 8; + ++entry.anInt2209; + ++entry.anInt2217; + } + + int k = entry.anInt2207 >> entry.anInt2232 - i & (1 << i) - 1; + entry.anInt2232 -= i; + return k; + } + + public static void clearBlockEntryInstance() { + entryInstance = null; + } + + private static final void method1793(BZip2BlockEntry entry) { + int j8 = 0; + int[] ai = null; + int[] ai1 = null; + int[] ai2 = null; + entry.anInt2202 = 1; + if(anIntArray257 == null) { + anIntArray257 = new int[entry.anInt2202 * 100000]; + } + + boolean flag18 = true; + + while(true) { + while(flag18) { + byte byte0 = method1789(entry); + if(byte0 == 23) { + return; + } + + byte0 = method1789(entry); + byte0 = method1789(entry); + byte0 = method1789(entry); + byte0 = method1789(entry); + byte0 = method1789(entry); + byte0 = method1789(entry); + byte0 = method1789(entry); + byte0 = method1789(entry); + byte0 = method1789(entry); + byte0 = method1788(entry); + entry.anInt2223 = 0; + byte0 = method1789(entry); + entry.anInt2223 = entry.anInt2223 << 8 | byte0 & 255; + byte0 = method1789(entry); + entry.anInt2223 = entry.anInt2223 << 8 | byte0 & 255; + byte0 = method1789(entry); + entry.anInt2223 = entry.anInt2223 << 8 | byte0 & 255; + + int i4; + for(i4 = 0; i4 < 16; ++i4) { + byte var28 = method1788(entry); + if(var28 == 1) { + entry.aBooleanArray2205[i4] = true; + } else { + entry.aBooleanArray2205[i4] = false; + } + } + + for(i4 = 0; i4 < 256; ++i4) { + entry.aBooleanArray2213[i4] = false; + } + + int var341; + for(i4 = 0; i4 < 16; ++i4) { + if(entry.aBooleanArray2205[i4]) { + for(var341 = 0; var341 < 16; ++var341) { + byte var29 = method1788(entry); + if(var29 == 1) { + entry.aBooleanArray2213[i4 * 16 + var341] = true; + } + } + } + } + + method1785(entry); + i4 = entry.anInt2215 + 2; + var341 = method1790(3, entry); + int var351 = method1790(15, entry); + + int l4; + byte i5; + for(int abyte0 = 0; abyte0 < var351; ++abyte0) { + l4 = 0; + + while(true) { + i5 = method1788(entry); + if(i5 == 0) { + entry.aByteArray2214[abyte0] = (byte)l4; + break; + } + + ++l4; + } + } + + byte[] var30 = new byte[6]; + + byte j5; + for(j5 = 0; j5 < var341; var30[j5] = j5++) { + ; + } + + for(l4 = 0; l4 < var351; ++l4) { + i5 = entry.aByteArray2214[l4]; + + for(j5 = var30[i5]; i5 > 0; --i5) { + var30[i5] = var30[i5 - 1]; + } + + var30[0] = j5; + entry.aByteArray2219[l4] = j5; + } + + int var32; + int var33; + for(l4 = 0; l4 < var341; ++l4) { + var32 = method1790(5, entry); + + for(var33 = 0; var33 < i4; ++var33) { + while(true) { + byte var35 = method1788(entry); + if(var35 == 0) { + entry.aByteArrayArray2229[l4][var33] = (byte)var32; + break; + } + + var35 = method1788(entry); + if(var35 == 0) { + ++var32; + } else { + --var32; + } + } + } + } + + int var36; + for(l4 = 0; l4 < var341; ++l4) { + i5 = 32; + j5 = 0; + + for(var36 = 0; var36 < i4; ++var36) { + if(entry.aByteArrayArray2229[l4][var36] > j5) { + j5 = entry.aByteArrayArray2229[l4][var36]; + } + + if(entry.aByteArrayArray2229[l4][var36] < i5) { + i5 = entry.aByteArrayArray2229[l4][var36]; + } + } + + method1786(entry.anIntArrayArray2230[l4], entry.anIntArrayArray2218[l4], entry.anIntArrayArray2210[l4], entry.aByteArrayArray2229[l4], i5, j5, i4); + entry.anIntArray2200[l4] = i5; + } + + l4 = entry.anInt2215 + 1; + var32 = -1; + byte var34 = 0; + + for(var36 = 0; var36 <= 255; ++var36) { + entry.anIntArray2228[var36] = 0; + } + + var36 = 4095; + + int l5; + int l6; + for(l5 = 15; l5 >= 0; --l5) { + for(l6 = 15; l6 >= 0; --l6) { + entry.aByteArray2204[var36] = (byte)(l5 * 16 + l6); + --var36; + } + + entry.anIntArray2226[l5] = var36 + 1; + } + + l5 = 0; + if(var34 == 0) { + ++var32; + var34 = 50; + byte k7 = entry.aByteArray2219[var32]; + j8 = entry.anIntArray2200[k7]; + ai = entry.anIntArrayArray2230[k7]; + ai2 = entry.anIntArrayArray2210[k7]; + ai1 = entry.anIntArrayArray2218[k7]; + } + + var33 = var34 - 1; + l6 = j8; + + byte byte9; + int var37; + for(var37 = method1790(j8, entry); var37 > ai[l6]; var37 = var37 << 1 | byte9) { + ++l6; + byte9 = method1788(entry); + } + + int l2 = ai2[var37 - ai1[l6]]; + + while(true) { + while(l2 != l4) { + int var39; + byte j7; + int i8; + byte byte11; + int var38; + if(l2 != 0 && l2 != 1) { + var39 = l2 - 1; + byte var391; + if(var39 < 16) { + var38 = entry.anIntArray2226[0]; + + for(var391 = entry.aByteArray2204[var38 + var39]; var39 > 3; var39 -= 4) { + i8 = var38 + var39; + entry.aByteArray2204[i8] = entry.aByteArray2204[i8 - 1]; + entry.aByteArray2204[i8 - 1] = entry.aByteArray2204[i8 - 2]; + entry.aByteArray2204[i8 - 2] = entry.aByteArray2204[i8 - 3]; + entry.aByteArray2204[i8 - 3] = entry.aByteArray2204[i8 - 4]; + } + + while(var39 > 0) { + entry.aByteArray2204[var38 + var39] = entry.aByteArray2204[var38 + var39 - 1]; + --var39; + } + + entry.aByteArray2204[var38] = var391; + } else { + var38 = var39 / 16; + i8 = var39 % 16; + int var40 = entry.anIntArray2226[var38] + i8; + + for(var391 = entry.aByteArray2204[var40]; var40 > entry.anIntArray2226[var38]; --var40) { + entry.aByteArray2204[var40] = entry.aByteArray2204[var40 - 1]; + } + + ++entry.anIntArray2226[var38]; + + while(var38 > 0) { + --entry.anIntArray2226[var38]; + entry.aByteArray2204[entry.anIntArray2226[var38]] = entry.aByteArray2204[entry.anIntArray2226[var38 - 1] + 16 - 1]; + --var38; + } + + --entry.anIntArray2226[0]; + entry.aByteArray2204[entry.anIntArray2226[0]] = var391; + if(entry.anIntArray2226[0] == 0) { + int l9 = 4095; + + for(int j9 = 15; j9 >= 0; --j9) { + for(int k9 = 15; k9 >= 0; --k9) { + entry.aByteArray2204[l9] = entry.aByteArray2204[entry.anIntArray2226[j9] + k9]; + --l9; + } + + entry.anIntArray2226[j9] = l9 + 1; + } + } + } + + ++entry.anIntArray2228[entry.aByteArray2211[var391 & 255] & 255]; + anIntArray257[l5] = entry.aByteArray2211[var391 & 255] & 255; + ++l5; + if(var33 == 0) { + ++var32; + var33 = 50; + j7 = entry.aByteArray2219[var32]; + j8 = entry.anIntArray2200[j7]; + ai = entry.anIntArrayArray2230[j7]; + ai2 = entry.anIntArrayArray2210[j7]; + ai1 = entry.anIntArrayArray2218[j7]; + } + + --var33; + var38 = j8; + + for(i8 = method1790(j8, entry); i8 > ai[var38]; i8 = i8 << 1 | byte11) { + ++var38; + byte11 = method1788(entry); + } + + l2 = ai2[i8 - ai1[var38]]; + } else { + var39 = -1; + int byte6 = 1; + + do { + if(l2 == 0) { + var39 += byte6; + } else if(l2 == 1) { + var39 += 2 * byte6; + } + + byte6 *= 2; + if(var33 == 0) { + ++var32; + var33 = 50; + j7 = entry.aByteArray2219[var32]; + j8 = entry.anIntArray2200[j7]; + ai = entry.anIntArrayArray2230[j7]; + ai2 = entry.anIntArrayArray2210[j7]; + ai1 = entry.anIntArrayArray2218[j7]; + } + + --var33; + var38 = j8; + + for(i8 = method1790(j8, entry); i8 > ai[var38]; i8 = i8 << 1 | byte11) { + ++var38; + byte11 = method1788(entry); + } + + l2 = ai2[i8 - ai1[var38]]; + } while(l2 == 0 || l2 == 1); + + ++var39; + j7 = entry.aByteArray2211[entry.aByteArray2204[entry.anIntArray2226[0]] & 255]; + + for(entry.anIntArray2228[j7 & 255] += var39; var39 > 0; --var39) { + anIntArray257[l5] = j7 & 255; + ++l5; + } + } + } + + entry.anInt2222 = 0; + entry.aByte2201 = 0; + entry.anIntArray2220[0] = 0; + + for(l2 = 1; l2 <= 256; ++l2) { + entry.anIntArray2220[l2] = entry.anIntArray2228[l2 - 1]; + } + + for(l2 = 1; l2 <= 256; ++l2) { + entry.anIntArray2220[l2] += entry.anIntArray2220[l2 - 1]; + } + + for(l2 = 0; l2 < l5; ++l2) { + byte var381 = (byte)(anIntArray257[l2] & 255); + anIntArray257[entry.anIntArray2220[var381 & 255]] |= l2 << 8; + ++entry.anIntArray2220[var381 & 255]; + } + + entry.anInt2208 = anIntArray257[entry.anInt2223] >> 8; + entry.anInt2227 = 0; + entry.anInt2208 = anIntArray257[entry.anInt2208]; + entry.anInt2221 = (byte)(entry.anInt2208 & 255); + entry.anInt2208 >>= 8; + ++entry.anInt2227; + entry.anInt2225 = l5; + method1787(entry); + if(entry.anInt2227 == entry.anInt2225 + 1 && entry.anInt2222 == 0) { + flag18 = true; + break; + } + + flag18 = false; + break; + } + } + + return; + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/util/crc32/CRC32HGenerator.java b/Tools/Frostys Cache Editor/src/com/alex/util/crc32/CRC32HGenerator.java new file mode 100644 index 000000000..323d01c92 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/util/crc32/CRC32HGenerator.java @@ -0,0 +1,22 @@ +package com.alex.util.crc32; + +import java.util.zip.CRC32; + +public final class CRC32HGenerator { + public static final CRC32 CRC32Instance = new CRC32(); + + public static int getHash(byte[] data) { + return getHash(data, 0, data.length); + } + + public static int getHash(byte[] data, int offset, int length) { + CRC32 var3 = CRC32Instance; + CRC32 var4 = CRC32Instance; + synchronized(CRC32Instance) { + CRC32Instance.update(data, offset, length); + int hash = (int)CRC32Instance.getValue(); + CRC32Instance.reset(); + return hash; + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/util/gzip/GZipCompressor.java b/Tools/Frostys Cache Editor/src/com/alex/util/gzip/GZipCompressor.java new file mode 100644 index 000000000..5c92949b1 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/util/gzip/GZipCompressor.java @@ -0,0 +1,22 @@ +package com.alex.util.gzip; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.GZIPOutputStream; + +public class GZipCompressor { + public static final byte[] compress(byte[] data) { + ByteArrayOutputStream compressedBytes = new ByteArrayOutputStream(); + + try { + GZIPOutputStream var3 = new GZIPOutputStream(compressedBytes); + var3.write(data); + var3.finish(); + var3.close(); + return compressedBytes.toByteArray(); + } catch (IOException var31) { + var31.printStackTrace(); + return null; + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/util/gzip/GZipDecompressor.java b/Tools/Frostys Cache Editor/src/com/alex/util/gzip/GZipDecompressor.java new file mode 100644 index 000000000..2100504dc --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/util/gzip/GZipDecompressor.java @@ -0,0 +1,30 @@ +package com.alex.util.gzip; + +import com.alex.io.Stream; + +import java.util.zip.Inflater; + +public class GZipDecompressor { + private static final Inflater inflaterInstance = new Inflater(true); + + public static final boolean decompress(Stream stream, byte[] data) { + Inflater var2 = inflaterInstance; + Inflater var3 = inflaterInstance; + synchronized(inflaterInstance) { + if(stream.getBuffer()[stream.getOffset()] == 31 && stream.getBuffer()[stream.getOffset() + 1] == -117) { + try { + inflaterInstance.setInput(stream.getBuffer(), stream.getOffset() + 10, -stream.getOffset() - 18 + stream.getBuffer().length); + inflaterInstance.inflate(data); + } catch (Exception var5) { + inflaterInstance.reset(); + return false; + } + + inflaterInstance.reset(); + return true; + } else { + return false; + } + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/util/whirlpool/Whirlpool.java b/Tools/Frostys Cache Editor/src/com/alex/util/whirlpool/Whirlpool.java new file mode 100644 index 000000000..4cc3d9d0e --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/util/whirlpool/Whirlpool.java @@ -0,0 +1,250 @@ +package com.alex.util.whirlpool; + +import java.util.Arrays; + +public class Whirlpool { + public static final int DIGESTBITS = 512; + public static final int DIGESTBYTES = 64; + protected static final int R = 10; + private static final String sbox = "ᠣ웨螸Å�㚦틵祯酒悼鮎ꌌ笵ᷠퟂ\u2e4b﹗ᕷ㟥\u9ff0䫚壉⤊놠殅ëµ�ჴ쬾է\ue427䆋ê�½é—˜ï¯®ç±¦\udd17äžžì¨\u00ad뼇굚茳挂ꩱ젙䧙\uf2e3守騦㊰\ue90fí–€ë»�㑈コé�Ÿ\u2068\u1aae둔錢擱猒䀈ì�¬\udba1贽需켫皂혛떯æ©�䗳ワ㽕ꋪ斺⿀\ude1c\ufd4d鉵ڊ닦ฟ拔ꢖ暈╙葲㥌幸㢌톥\ue261댡鰞ä�‡ï°„写æ´�\ufadf縤㮫츑轎럫ã²�铷뤓ⳓ\ue76eì�ƒå™„義⪻셓\udc0b鵬ㅴ\uf646겉ᓡᘺ椉炶íƒ\u00ad챂颤⡜\uf886"; + private static long[][] C = new long[8][256]; + private static long[] rc = new long[11]; + protected byte[] bitLength = new byte[32]; + protected byte[] buffer = new byte[64]; + protected int bufferBits = 0; + protected int bufferPos = 0; + protected long[] hash = new long[8]; + protected long[] K = new long[8]; + protected long[] L = new long[8]; + protected long[] block = new long[8]; + protected long[] state = new long[8]; + + static { + int r; + for(r = 0; r < 256; ++r) { + char var15 = "ᠣ웨螸Å�㚦틵祯酒悼鮎ꌌ笵ᷠퟂ\u2e4b﹗ᕷ㟥\u9ff0䫚壉⤊놠殅ëµ�ჴ쬾է\ue427䆋ê�½é—˜ï¯®ç±¦\udd17äžžì¨\u00ad뼇굚茳挂ꩱ젙䧙\uf2e3守騦㊰\ue90fí–€ë»�㑈コé�Ÿ\u2068\u1aae둔錢擱猒䀈ì�¬\udba1贽需켫皂혛떯æ©�䗳ワ㽕ꋪ斺⿀\ude1c\ufd4d鉵ڊ닦ฟ拔ꢖ暈╙葲㥌幸㢌톥\ue261댡鰞ä�‡ï°„写æ´�\ufadf縤㮫츑轎럫ã²�铷뤓ⳓ\ue76eì�ƒå™„義⪻셓\udc0b鵬ㅴ\uf646겉ᓡᘺ椉炶íƒ\u00ad챂颤⡜\uf886".charAt(r / 2); + long v1 = (r & 1) == 0?(long)(var15 >>> 8):(long)(var15 & 255); + long v2 = v1 << 1; + if(v2 >= 256L) { + v2 ^= 285L; + } + + long v4 = v2 << 1; + if(v4 >= 256L) { + v4 ^= 285L; + } + + long v5 = v4 ^ v1; + long v8 = v4 << 1; + if(v8 >= 256L) { + v8 ^= 285L; + } + + long v9 = v8 ^ v1; + C[0][r] = v1 << 56 | v1 << 48 | v4 << 40 | v1 << 32 | v8 << 24 | v5 << 16 | v2 << 8 | v9; + + for(int t = 1; t < 8; ++t) { + C[t][r] = C[t - 1][r] >>> 8 | C[t - 1][r] << 56; + } + } + + rc[0] = 0L; + + for(r = 1; r <= 10; ++r) { + int var151 = 8 * (r - 1); + rc[r] = C[0][var151] & -72057594037927936L ^ C[1][var151 + 1] & 71776119061217280L ^ C[2][var151 + 2] & 280375465082880L ^ C[3][var151 + 3] & 1095216660480L ^ C[4][var151 + 4] & 4278190080L ^ C[5][var151 + 5] & 16711680L ^ C[6][var151 + 6] & 65280L ^ C[7][var151 + 7] & 255L; + } + + } + + public static byte[] getHash(byte[] data, int off, int len) { + byte[] source; + if(off <= 0) { + source = data; + } else { + source = new byte[len]; + + for(int var6 = 0; var6 < len; ++var6) { + source[var6] = data[off + var6]; + } + } + + Whirlpool var61 = new Whirlpool(); + var61.NESSIEinit(); + var61.NESSIEadd(source, (long)(len * 8)); + byte[] digest = new byte[64]; + var61.NESSIEfinalize(digest); + return digest; + } + + protected void processBuffer() { + int i = 0; + + int i1; + for(i1 = 0; i < 8; i1 += 8) { + this.block[i] = (long)this.buffer[i1] << 56 ^ ((long)this.buffer[i1 + 1] & 255L) << 48 ^ ((long)this.buffer[i1 + 2] & 255L) << 40 ^ ((long)this.buffer[i1 + 3] & 255L) << 32 ^ ((long)this.buffer[i1 + 4] & 255L) << 24 ^ ((long)this.buffer[i1 + 5] & 255L) << 16 ^ ((long)this.buffer[i1 + 6] & 255L) << 8 ^ (long)this.buffer[i1 + 7] & 255L; + ++i; + } + + for(i = 0; i < 8; ++i) { + this.state[i] = this.block[i] ^ (this.K[i] = this.hash[i]); + } + + for(i = 1; i <= 10; ++i) { + int t; + int s; + for(i1 = 0; i1 < 8; ++i1) { + this.L[i1] = 0L; + t = 0; + + for(s = 56; t < 8; s -= 8) { + this.L[i1] ^= C[t][(int)(this.K[i1 - t & 7] >>> s) & 255]; + ++t; + } + } + + for(i1 = 0; i1 < 8; ++i1) { + this.K[i1] = this.L[i1]; + } + + this.K[0] ^= rc[i]; + + for(i1 = 0; i1 < 8; ++i1) { + this.L[i1] = this.K[i1]; + t = 0; + + for(s = 56; t < 8; s -= 8) { + this.L[i1] ^= C[t][(int)(this.state[i1 - t & 7] >>> s) & 255]; + ++t; + } + } + + for(i1 = 0; i1 < 8; ++i1) { + this.state[i1] = this.L[i1]; + } + } + + for(i = 0; i < 8; ++i) { + this.hash[i] ^= this.state[i] ^ this.block[i]; + } + + } + + public void NESSIEinit() { + Arrays.fill(this.bitLength, (byte)0); + this.bufferBits = this.bufferPos = 0; + this.buffer[0] = 0; + Arrays.fill(this.hash, 0L); + } + + public void NESSIEadd(byte[] source, long sourceBits) { + int sourcePos = 0; + int sourceGap = 8 - ((int)sourceBits & 7) & 7; + int bufferRem = this.bufferBits & 7; + long value = sourceBits; + int i = 31; + + int b; + for(b = 0; i >= 0; --i) { + b += (this.bitLength[i] & 255) + ((int)value & 255); + this.bitLength[i] = (byte)b; + b >>>= 8; + value >>>= 8; + } + + while(sourceBits > 8L) { + b = source[sourcePos] << sourceGap & 255 | (source[sourcePos + 1] & 255) >>> 8 - sourceGap; + if(b < 0 || b >= 256) { + throw new RuntimeException("LOGIC ERROR"); + } + + byte[] var10000 = this.buffer; + int var10001 = this.bufferPos++; + var10000[var10001] = (byte)(var10000[var10001] | b >>> bufferRem); + this.bufferBits += 8 - bufferRem; + if(this.bufferBits == 512) { + this.processBuffer(); + this.bufferBits = this.bufferPos = 0; + } + + this.buffer[this.bufferPos] = (byte)(b << 8 - bufferRem & 255); + this.bufferBits += bufferRem; + sourceBits -= 8L; + ++sourcePos; + } + + if(sourceBits > 0L) { + b = source[sourcePos] << sourceGap & 255; + this.buffer[this.bufferPos] = (byte)(this.buffer[this.bufferPos] | b >>> bufferRem); + } else { + b = 0; + } + + if((long)bufferRem + sourceBits < 8L) { + this.bufferBits = (int)((long)this.bufferBits + sourceBits); + } else { + ++this.bufferPos; + this.bufferBits += 8 - bufferRem; + sourceBits -= (long)(8 - bufferRem); + if(this.bufferBits == 512) { + this.processBuffer(); + this.bufferBits = this.bufferPos = 0; + } + + this.buffer[this.bufferPos] = (byte)(b << 8 - bufferRem & 255); + this.bufferBits += (int)sourceBits; + } + + } + + public void NESSIEfinalize(byte[] digest) { + this.buffer[this.bufferPos] = (byte)(this.buffer[this.bufferPos] | 128 >>> (this.bufferBits & 7)); + ++this.bufferPos; + if(this.bufferPos > 32) { + while(true) { + if(this.bufferPos >= 64) { + this.processBuffer(); + this.bufferPos = 0; + break; + } + + this.buffer[this.bufferPos++] = 0; + } + } + + while(this.bufferPos < 32) { + this.buffer[this.bufferPos++] = 0; + } + + System.arraycopy(this.bitLength, 0, this.buffer, 32, 32); + this.processBuffer(); + int i = 0; + + for(int j = 0; i < 8; j += 8) { + long h = this.hash[i]; + digest[j] = (byte)((int)(h >>> 56)); + digest[j + 1] = (byte)((int)(h >>> 48)); + digest[j + 2] = (byte)((int)(h >>> 40)); + digest[j + 3] = (byte)((int)(h >>> 32)); + digest[j + 4] = (byte)((int)(h >>> 24)); + digest[j + 5] = (byte)((int)(h >>> 16)); + digest[j + 6] = (byte)((int)(h >>> 8)); + digest[j + 7] = (byte)((int)h); + ++i; + } + + } + + public void NESSIEadd(String source) { + if(source.length() > 0) { + byte[] data = new byte[source.length()]; + + for(int i = 0; i < source.length(); ++i) { + data[i] = (byte)source.charAt(i); + } + + this.NESSIEadd(data, (long)(8 * data.length)); + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/utils/Constants.java b/Tools/Frostys Cache Editor/src/com/alex/utils/Constants.java new file mode 100644 index 000000000..c7b0ddc58 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/utils/Constants.java @@ -0,0 +1,20 @@ +package com.alex.utils; + +public final class Constants { + public static final int NO_COMPRESSION = 0; + public static final int BZIP2_COMPRESSION = 1; + public static final int GZIP_COMPRESSION = 2; + public static final int MAX_VALID_ARCHIVE_LENGTH = 1000000; + public static final int INTERFACE_DEFINITIONS_INDEX = 3; + public static final int MAPS_INDEX = 5; + public static final int MODELS_INDEX = 7; + public static final int SPRITES_INDEX = 8; + public static final int INDEXED_IMAGES_INDEX = 8; + public static final int OBJECTS_DEFINITIONS_INDEX = 18; + public static final int ITEM_DEFINITIONS_INDEX = 19; + public static final int LOADER_IMAGES_INDEX = 32; + public static final int LOADER_INDEXED_IMAGES_INDEX = 34; + public static final int CLIENT_BUILD = 562; + public static final boolean ENCRYPTED_CACHE = true; + public static final int NPC_DEFINITIONS_INDEX = 18; +} diff --git a/Tools/Frostys Cache Editor/src/com/alex/utils/Utils.java b/Tools/Frostys Cache Editor/src/com/alex/utils/Utils.java new file mode 100644 index 000000000..5a37d9723 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/alex/utils/Utils.java @@ -0,0 +1,73 @@ +package com.alex.utils; + +import com.alex.io.OutputStream; +import com.alex.store.Store; + +import java.math.BigInteger; + +public final class Utils { + public static byte[] cryptRSA(byte[] data, BigInteger exponent, BigInteger modulus) { + return (new BigInteger(data)).modPow(exponent, modulus).toByteArray(); + } + + public static byte[] getArchivePacketData(int indexId, int archiveId, byte[] archive) { + OutputStream stream = new OutputStream(archive.length + 4); + stream.writeByte(indexId); + stream.writeShort(archiveId); + stream.writeByte(0); + stream.writeInt(archive.length); + int offset = 8; + + for(int var6 = 0; var6 < archive.length; ++var6) { + if(offset == 512) { + stream.writeByte(-1); + offset = 1; + } + + stream.writeByte(archive[var6]); + ++offset; + } + + byte[] var61 = new byte[stream.getOffset()]; + stream.setOffset(0); + stream.getBytes(var61, 0, var61.length); + return var61; + } + + public static int getNameHash(String name) { + return name.toLowerCase().hashCode(); + } + + public static final int getInterfaceDefinitionsSize(Store store) { + return store.getIndexes()[3].getLastArchiveId() + 1; + } + + public static final int getInterfaceDefinitionsComponentsSize(Store store, int interfaceId) { + return store.getIndexes()[3].getLastFileId(interfaceId) + 1; + } + + public static final int getAnimationDefinitionsSize(Store store) { + int lastArchiveId = store.getIndexes()[20].getLastArchiveId(); + return lastArchiveId * 128 + store.getIndexes()[20].getValidFilesCount(lastArchiveId); + } + + public static final int getItemDefinitionsSize(Store store) { + int lastArchiveId = store.getIndexes()[19].getLastArchiveId(); + return lastArchiveId * 256 + store.getIndexes()[19].getValidFilesCount(lastArchiveId); + } + + public static int getNPCDefinitionsSize(Store store) { + int lastArchiveId = store.getIndexes()[18].getLastArchiveId(); + return lastArchiveId * 128 + store.getIndexes()[18].getValidFilesCount(lastArchiveId); + } + + public static final int getObjectDefinitionsSize(Store store) { + int lastArchiveId = store.getIndexes()[16].getLastArchiveId(); + return lastArchiveId * 256 + store.getIndexes()[16].getValidFilesCount(lastArchiveId); + } + + public static final int getGraphicDefinitionsSize(Store store) { + int lastArchiveId = store.getIndexes()[21].getLastArchiveId(); + return lastArchiveId * 256 + store.getIndexes()[21].getValidFilesCount(lastArchiveId); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/Console.java b/Tools/Frostys Cache Editor/src/com/editor/Console.java new file mode 100644 index 000000000..c165abf1f --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/Console.java @@ -0,0 +1,108 @@ +package com.editor; + +import com.editor.Main; + +import javax.swing.GroupLayout.Alignment; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; + +public class Console extends JFrame { + private static final long serialVersionUID = -4693540915136770583L; + private JMenu jMenu1; + private JMenuBar jMenuBar1; + private JMenuItem jMenuItem1; + private JMenuItem jMenuItem2; + private JScrollPane jScrollPane1; + public static JTextArea output; + + public Console() { + this.setTitle("Console"); + this.setResizable(false); + this.setDefaultCloseOperation(0); + this.setLocationRelativeTo((Component)null); + this.initComponents(); + Main.log("Console", "Console Started."); + } + + private void initComponents() { + this.jScrollPane1 = new JScrollPane(); + output = new JTextArea(); + this.jMenuBar1 = new JMenuBar(); + this.jMenu1 = new JMenu(); + this.jMenuItem1 = new JMenuItem(); + this.jMenuItem2 = new JMenuItem(); + this.setDefaultCloseOperation(3); + output.setEditable(false); + output.setColumns(20); + output.setLineWrap(true); + output.setRows(5); + this.jScrollPane1.setViewportView(output); + this.jMenu1.setText("File"); + this.jMenuItem1.setText("Close Console"); + this.jMenuItem1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + Console.this.jMenuItem1ActionPerformed(evt); + } + }); + this.jMenu1.add(this.jMenuItem1); + this.jMenuItem2.setText("Exit Program"); + this.jMenuItem2.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + Console.this.jMenuItem2ActionPerformed(evt); + } + }); + this.jMenu1.add(this.jMenuItem2); + this.jMenuBar1.add(this.jMenu1); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(this.jScrollPane1, -1, 618, 32767)); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(this.jScrollPane1, -1, 240, 32767)); + this.pack(); + } + + private void jMenuItem2ActionPerformed(ActionEvent evt) { + System.exit(0); + } + + private void jMenuItem1ActionPerformed(ActionEvent evt) { + this.dispose(); + } + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + (new Console()).setVisible(true); + } + }); + } + + private static void updateTextArea(final String text) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + Console.output.append(text); + } + }); + } + + public static void redirectSystemStreams() { + OutputStream out = new OutputStream() { + public void write(int b) throws IOException { + Console.updateTextArea(String.valueOf((char)b)); + } + + public void write(byte[] b, int off, int len) throws IOException { + Console.updateTextArea(new String(b, off, len)); + } + + public void write(byte[] b) throws IOException { + this.write(b, 0, b.length); + } + }; + System.setOut(new PrintStream(out, true)); + System.setErr(new PrintStream(out, true)); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/Main.java b/Tools/Frostys Cache Editor/src/com/editor/Main.java new file mode 100644 index 000000000..890c0bc20 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/Main.java @@ -0,0 +1,52 @@ +package com.editor; + +import com.editor.Console; +import com.editor.ToolSelection; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Date; + +public class Main { + public static void main(String[] args) { + Console.redirectSystemStreams(); + (new Console()).setVisible(true); + (new ToolSelection()).setVisible(true); + log("Main", "Frosty's Cache Editor"); + log("Main", "Edited to support the #562 revision by Jens."); + } + + public static void log(String className, String message) { + System.out.println("[" + className + "]: " + message); + printDebug(className, message); + } + + private static void printDebug(String className, String message) { + File f = new File(System.getProperty("user.home") + "/FCE/logs/"); + File f1 = new File(System.getProperty("user.home") + "/FCE/logs/" + 2 + 5 + 1 + 11 + ".txt"); + f.mkdirs(); + + try { + f1.createNewFile(); + } catch (IOException var10) { + log("Main", "Could not create log file."); + } + + String strFilePath = System.getProperty("user.home") + "/FCE/logs/" + 2 + 5 + 1 + 11 + ".txt"; + + try { + FileOutputStream var9 = new FileOutputStream(strFilePath, true); + String strContent = new Date() + ": [" + className + "]: " + message; + String lineSep = System.getProperty("line.separator"); + var9.write(strContent.getBytes()); + var9.write(lineSep.getBytes()); + } catch (FileNotFoundException var8) { + log("Main", "FileNotFoundException : " + var8); + } catch (IOException var91) { + log("Main", "IOException : " + var91); + } + + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/ToolSelection.java b/Tools/Frostys Cache Editor/src/com/editor/ToolSelection.java new file mode 100644 index 000000000..cee14599b --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/ToolSelection.java @@ -0,0 +1,167 @@ +package com.editor; + +import com.editor.Main; +import com.editor.item.ItemDefDump; +import com.editor.item.ItemSelection; +import com.editor.model.MultiModelPacker; +import com.editor.model.UniModelDumper; +import com.editor.npc.NPCDefDump; +import com.editor.npc.NPCSelection; +import com.editor.object.ObjectSelection; + +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; + +public class ToolSelection extends JFrame { + private static final long serialVersionUID = 2024943190858205332L; + private String cache; + private JLabel jLabel1; + private JMenu jMenu1; + private JMenuBar jMenuBar1; + private JMenuItem loadCacheButton; + private JMenuItem exitButton; + private JComboBox selectionBox; + private JButton submitButton; + + public ToolSelection() { + this.setTitle("Tool Selection"); + this.setResizable(false); + this.setDefaultCloseOperation(3); + this.setLocationRelativeTo((Component)null); + this.initComponents(); + Main.log("Main", "ToolSelection Started"); + } + + private void initComponents() { + this.jLabel1 = new JLabel(); + this.selectionBox = new JComboBox(); + this.submitButton = new JButton(); + this.jMenuBar1 = new JMenuBar(); + this.jMenu1 = new JMenu(); + this.loadCacheButton = new JMenuItem(); + this.exitButton = new JMenuItem(); + this.setDefaultCloseOperation(3); + this.jLabel1.setText("Select Your Editor:"); + this.selectionBox.setModel(new DefaultComboBoxModel(new String[]{"Items", "NPCs", "Objects", "ItemDefDump", "NPCDefDump", "MultiModelPacker", "MultiItemPacker", "MultiNPCPacker", "UniModelDumper"})); + this.submitButton.setText("Submit"); + this.submitButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ToolSelection.this.submitButtonActionPerformed(evt); + } + }); + this.jMenu1.setText("File"); + this.loadCacheButton.setText("Load Cache"); + this.loadCacheButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ToolSelection.this.jMenuItem1ActionPerformed(evt); + } + }); + this.jMenu1.add(this.loadCacheButton); + this.exitButton.setText("Exit Program"); + this.exitButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ToolSelection.this.exitButtonActionPerformed(evt); + } + }); + this.jMenu1.add(this.exitButton); + this.jMenuBar1.add(this.jMenu1); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(77, 77, 77).addGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(this.submitButton).addComponent(this.selectionBox, -2, -1, -2)).addContainerGap(-1, 32767)).addGroup(Alignment.TRAILING, layout.createSequentialGroup().addContainerGap(62, 32767).addComponent(this.jLabel1).addGap(58, 58, 58))); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap(50, 32767).addComponent(this.jLabel1).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.selectionBox, -2, -1, -2).addGap(44, 44, 44).addComponent(this.submitButton).addGap(38, 38, 38))); + this.pack(); + } + + private void submitButtonActionPerformed(ActionEvent evt) { + if(this.selectionBox.getSelectedIndex() == 0) { + try { + (new ItemSelection(this.cache)).setVisible(true); + Main.log("ToolSelection", "ItemSelection Started"); + } catch (IOException var4) { + Main.log("ToolSelection", "No Cache Set!"); + } + } else if(this.selectionBox.getSelectedIndex() == 1) { + try { + (new NPCSelection(this.cache)).setVisible(true); + Main.log("ToolSelection", "NPCSelection Started"); + } catch (IOException var3) { + Main.log("ToolSelection", "No Cache Set!"); + } + } else if(this.selectionBox.getSelectedIndex() == 2) { + try { + (new ObjectSelection(this.cache)).setVisible(true); + Main.log("ToolSelection", "ObjectSelection Started"); + } catch (IOException var2) { + Main.log("ToolSelection", "No Cache Set!"); + } + } else if(this.selectionBox.getSelectedIndex() == 3) { + Main.log("ToolSelection", "Item Def Dumping Started"); + EventQueue.invokeLater(new Runnable() { + public void run() { + ItemDefDump.editorDump(ToolSelection.this.cache); + } + }); + } else if(this.selectionBox.getSelectedIndex() == 4) { + Main.log("ToolSelection", "NPC Def Dumping Started"); + EventQueue.invokeLater(new Runnable() { + public void run() { + NPCDefDump.editorDump(ToolSelection.this.cache); + } + }); + } else if(this.selectionBox.getSelectedIndex() == 5) { + Main.log("ToolSelection", "MultiModelPacker Started"); + EventQueue.invokeLater(new Runnable() { + public void run() { + new MultiModelPacker(ToolSelection.this.cache); + } + }); + } else if(this.selectionBox.getSelectedIndex() == 6) { + Main.log("ToolSelection", "MultiNPCPacker is not working at the moment."); + } else if(this.selectionBox.getSelectedIndex() == 8) { + Main.log("ToolSelection", "UniModelDumper Started"); + EventQueue.invokeLater(new Runnable() { + public void run() { + new UniModelDumper(ToolSelection.this.cache); + } + }); + } else { + Main.log("ToolSelection", "No Tool Selected!"); + } + + } + + private void jMenuItem1ActionPerformed(ActionEvent evt) { + JFileChooser fc = new JFileChooser(); + fc.setFileSelectionMode(1); + if(evt.getSource() == this.loadCacheButton) { + int returnVal = fc.showOpenDialog(this); + if(returnVal == 0) { + File file = fc.getSelectedFile(); + this.cache = file.getPath() + "/"; + } + } + + } + + private void exitButtonActionPerformed(ActionEvent evt) { + JDialog.setDefaultLookAndFeelDecorated(true); + int response = JOptionPane.showConfirmDialog((Component)null, "Do you want to continue?", "Confirm", 0, 3); + if(response == 0) { + System.exit(0); + } + + } + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + (new ToolSelection()).setVisible(true); + } + }); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/Utils.java b/Tools/Frostys Cache Editor/src/com/editor/Utils.java new file mode 100644 index 000000000..e803588af --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/Utils.java @@ -0,0 +1,51 @@ +package com.editor; + +import com.alex.store.Store; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class Utils { + public static byte[] getBytesFromFile(File file) throws IOException { + FileInputStream is = new FileInputStream(file); + long length = file.length(); + if(length > 2147483647L) { + ; + } + + byte[] bytes = new byte[(int)length]; + int offset = 0; + + int numRead1; + for(boolean numRead = false; offset < bytes.length && (numRead1 = is.read(bytes, offset, bytes.length - offset)) >= 0; offset += numRead1) { + ; + } + + if(offset < bytes.length) { + throw new IOException("Could not completely read file " + file.getName()); + } else { + is.close(); + return bytes; + } + } + + public static int packCustomModel(Store cache, byte[] data) { + int archiveId = cache.getIndexes()[7].getLastArchiveId() + 1; + if(cache.getIndexes()[7].putFile(archiveId, 0, data)) { + return archiveId; + } else { + System.out.println("Failed packing model " + archiveId); + return -1; + } + } + + public static int packCustomModel(Store cache, byte[] data, int modelId) { + if(cache.getIndexes()[7].putFile(modelId, 0, data)) { + return modelId; + } else { + System.out.println("Failed packing model " + modelId); + return -1; + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/item/ItemDefDump.java b/Tools/Frostys Cache Editor/src/com/editor/item/ItemDefDump.java new file mode 100644 index 000000000..aace0f30c --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/item/ItemDefDump.java @@ -0,0 +1,418 @@ +package com.editor.item; + +import com.alex.loaders.items.ItemDefinitions; +import com.alex.store.Store; +import com.alex.utils.Utils; +import com.editor.Main; + +import java.util.Iterator; + +public class ItemDefDump { + private static ItemDefinitions defs; + private static Store STORE; + + public static void main(String[] args) { + try { + STORE = new Store("C:/Users/yvonne å christer/Dropbox/FCE/ItemDefDump/"); + } catch (IOException var2) { + System.out.println("Cannot find cache location"); + } + + int id; + if(Utils.getItemDefinitionsSize(STORE) > 30000) { + for(id = 0; id < Utils.getItemDefinitionsSize(STORE) - 22314; ++id) { + defs = ItemDefinitions.getItemDefinition(STORE, id); + dump(); + Main.log("ItemDefDump", "Dumping Item " + defs.id); + } + } else { + for(id = 0; id < Utils.getItemDefinitionsSize(STORE); ++id) { + defs = ItemDefinitions.getItemDefinition(STORE, id); + dump(); + Main.log("ItemDefDump", "Dumping Item " + defs.id); + } + } + + } + + public static void editorDump(String cache) { + try { + STORE = new Store(cache); + } catch (IOException var2) { + Main.log("ItemDefDump", "Cannot find cache location"); + } + + int id; + if(Utils.getItemDefinitionsSize(STORE) > 30000) { + for(id = 0; id < Utils.getItemDefinitionsSize(STORE) - 22314; ++id) { + defs = ItemDefinitions.getItemDefinition(STORE, id); + dump(); + Main.log("ItemDefDump", "Dumping Item " + defs.id); + } + } else { + for(id = 0; id < Utils.getItemDefinitionsSize(STORE); ++id) { + defs = ItemDefinitions.getItemDefinition(STORE, id); + dump(); + Main.log("ItemDefDump", "Dumping Item " + defs.id); + } + } + + } + + public static void dump() { + File f = new File(System.getProperty("user.home") + "/FCE/items/"); + f.mkdirs(); + String lineSep = System.getProperty("line.separator"); + BufferedWriter writer = null; + + try { + writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(System.getProperty("user.home") + "/FCE/items/" + defs.id + ".txt"), "utf-8")); + writer.write("name = " + defs.getName()); + writer.write(lineSep); + writer.write("value = " + defs.getValue()); + writer.write(lineSep); + writer.write("team id = " + defs.getTeamId()); + writer.write(lineSep); + writer.write("members only = " + String.valueOf(defs.isMembersOnly())); + writer.write(lineSep); + writer.write("equip slot = " + defs.getEquipSlot()); + writer.write(lineSep); + writer.write("equip type = " + defs.getEquipType()); + writer.write(lineSep); + writer.write("stack ids = " + getStackIDs()); + writer.write(lineSep); + writer.write("stack amounts = " + getStackAmts()); + writer.write(lineSep); + writer.write("stackable = " + defs.getStackable()); + writer.write(lineSep); + writer.write("inv model zoom = " + defs.getInvModelZoom()); + writer.write(lineSep); + writer.write("model rotation 1 = " + defs.getModelRotation1()); + writer.write(lineSep); + writer.write("model rotation 2 = " + defs.getModelRotation2()); + writer.write(lineSep); + writer.write("model offset 1 = " + defs.getModelOffset1()); + writer.write(lineSep); + writer.write("model offset 2 = " + defs.getModelOffset2()); + writer.write(lineSep); + writer.write("inv model id = " + defs.getInvModelId()); + writer.write(lineSep); + writer.write("male equip model id 1 = " + defs.getMaleEquipModelId1()); + writer.write(lineSep); + writer.write("female equip model id 1 = " + defs.getFemaleEquipModelId1()); + writer.write(lineSep); + writer.write("male equip model id 2 = " + defs.getMaleEquipModelId2()); + writer.write(lineSep); + writer.write("female equip model id 2 = " + defs.getFemaleEquipModelId2()); + writer.write(lineSep); + writer.write("male equip model id 3 = " + defs.getMaleEquipModelId3()); + writer.write(lineSep); + writer.write("female equip model id 3 = " + defs.getFemaleEquipModelId3()); + writer.write(lineSep); + writer.write("inventory options = " + getInventoryOpts()); + writer.write(lineSep); + writer.write("ground options = " + getGroundOpts()); + writer.write(lineSep); + writer.write("changed model colors = " + getChangedModelColors()); + writer.write(lineSep); + writer.write("changed texture colors = " + getChangedTextureColors()); + writer.write(lineSep); + writer.write("switch note item id = " + defs.switchNoteItemId); + writer.write(lineSep); + writer.write("noted item id = " + defs.notedItemId); + writer.write(lineSep); + writer.write("unnoted = " + String.valueOf(defs.isUnnoted())); + writer.write(lineSep); + writer.write("switch lend item id = " + defs.getSwitchLendItemId()); + writer.write(lineSep); + writer.write("lended item id = " + defs.getLendedItemId()); + writer.write(lineSep); + writer.write("unknownArray1 = " + getUnknownArray1()); + writer.write(lineSep); + writer.write("unknownArray2 = " + getUnknownArray2()); + writer.write(lineSep); + writer.write("unknownArray3 = " + getUnknownArray3()); + writer.write(lineSep); + writer.write("unknownArray4 = " + getUnknownArray4()); + writer.write(lineSep); + writer.write("unknownArray5 = " + getUnknownArray5()); + writer.write(lineSep); + writer.write("unknownArray6 = " + getUnknownArray6()); + writer.write(lineSep); + writer.write("unknownInt1 = " + defs.unknownInt1); + writer.write(lineSep); + writer.write("unknownInt2 = " + defs.unknownInt2); + writer.write(lineSep); + writer.write("unknownInt3 = " + defs.unknownInt3); + writer.write(lineSep); + writer.write("unknownInt4 = " + defs.unknownInt4); + writer.write(lineSep); + writer.write("unknownInt5 = " + defs.unknownInt5); + writer.write(lineSep); + writer.write("unknownInt6 = " + defs.unknownInt6); + writer.write(lineSep); + writer.write("unknownInt7 = " + defs.unknownInt7); + writer.write(lineSep); + writer.write("unknownInt8 = " + defs.unknownInt8); + writer.write(lineSep); + writer.write("unknownInt9 = " + defs.unknownInt9); + writer.write(lineSep); + writer.write("unknownInt10 = " + defs.unknownInt10); + writer.write(lineSep); + writer.write("unknownInt11 = " + defs.unknownInt11); + writer.write(lineSep); + writer.write("unknownInt12 = " + defs.unknownInt12); + writer.write(lineSep); + writer.write("unknownInt13 = " + defs.unknownInt13); + writer.write(lineSep); + writer.write("unknownInt14 = " + defs.unknownInt14); + writer.write(lineSep); + writer.write("unknownInt15 = " + defs.unknownInt15); + writer.write(lineSep); + writer.write("unknownInt16 = " + defs.unknownInt16); + writer.write(lineSep); + writer.write("unknownInt17 = " + defs.unknownInt17); + writer.write(lineSep); + writer.write("unknownInt18 = " + defs.unknownInt18); + writer.write(lineSep); + writer.write("unknownInt19 = " + defs.unknownInt19); + writer.write(lineSep); + writer.write("unknownInt20 = " + defs.unknownInt20); + writer.write(lineSep); + writer.write("unknownInt21 = " + defs.unknownInt21); + writer.write(lineSep); + writer.write("unknownInt22 = " + defs.unknownInt22); + writer.write(lineSep); + writer.write("unknownInt23 = " + defs.unknownInt23); + writer.write(lineSep); + writer.write("Clientscripts"); + writer.write(lineSep); + if(defs.clientScriptData != null) { + Iterator var14 = defs.clientScriptData.keySet().iterator(); + + while(var14.hasNext()) { + int key = ((Integer)var14.next()).intValue(); + Object value = defs.clientScriptData.get(Integer.valueOf(key)); + writer.write("KEY: " + key + ", VALUE: " + value); + writer.write(lineSep); + } + } + } catch (IOException var141) { + Main.log("ItemEditor", "Failed to export Item Defs to .txt"); + } finally { + try { + writer.close(); + } catch (Exception var13) { + ; + } + + } + + } + + public static String getInventoryOpts() { + String text = ""; + String[] arr$ = defs.getInventoryOptions(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + String option = arr$[i$]; + text = text + (option == null?"null":option) + ";"; + } + + return text; + } + + public static String getGroundOpts() { + String text = ""; + String[] arr$ = defs.getGroundOptions(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + String option = arr$[i$]; + text = text + (option == null?"null":option) + ";"; + } + + return text; + } + + public static String getChangedModelColors() { + String text = ""; + if(defs.originalModelColors != null) { + for(int i = 0; i < defs.originalModelColors.length; ++i) { + text = text + defs.originalModelColors[i] + "=" + defs.modifiedModelColors[i] + ";"; + } + } + + return text; + } + + public static String getChangedTextureColors() { + String text = ""; + if(defs.originalTextureColors != null) { + for(int i = 0; i < defs.originalTextureColors.length; ++i) { + text = text + defs.originalTextureColors[i] + "=" + defs.modifiedTextureColors[i] + ";"; + } + } + + return text; + } + + public static String getStackIDs() { + String text = ""; + + try { + int[] e = defs.getStackIds(); + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getClientScripts() { + String text = ""; + String lineSep = System.getProperty("line.separator"); + if(defs.clientScriptData != null) { + for(Iterator i$ = defs.clientScriptData.keySet().iterator(); i$.hasNext(); text = text + lineSep) { + int key = ((Integer)i$.next()).intValue(); + Object value = defs.clientScriptData.get(Integer.valueOf(key)); + text = text + "KEY: " + key + ", VALUE: " + value; + } + } + + return text; + } + + public static String getStackAmts() { + String text = ""; + + try { + int[] e = defs.getStackAmounts(); + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray1() { + String text = ""; + + try { + byte[] e = defs.unknownArray1; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + byte index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray2() { + String text = ""; + + try { + int[] e = defs.unknownArray2; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray3() { + String text = ""; + + try { + byte[] e = defs.unknownArray3; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + byte index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray4() { + String text = ""; + + try { + int[] e = defs.unknownArray4; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray5() { + String text = ""; + + try { + int[] e = defs.unknownArray5; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray6() { + String text = ""; + + try { + byte[] e = defs.unknownArray6; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + byte index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/item/ItemEditor.java b/Tools/Frostys Cache Editor/src/com/editor/item/ItemEditor.java new file mode 100644 index 000000000..e0014d4d5 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/item/ItemEditor.java @@ -0,0 +1,1259 @@ +package com.editor.item; + +import com.alex.loaders.items.ItemDefinitions; +import com.editor.Main; +import com.editor.Utils; +import com.editor.item.ItemSelection; + +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Iterator; + +public class ItemEditor extends JFrame { + private static final long serialVersionUID = -3870086097297420720L; + private ItemDefinitions defs; + private ItemSelection is; + private JTextField ModelOffset1; + private JTextField ModelRot2; + private JMenuItem addModelMenuBtn; + private JTextField array1; + private JTextField array2; + private JTextField array3; + private JTextField array4; + private JTextField array5; + private JTextField array6; + private JTextArea clientScriptOutput; + private JTextField csk1; + private JTextField csk2; + private JTextField csk3; + private JTextField csk4; + private JTextField csk5; + private JTextField csk6; + private JTextField csk7; + private JTextField csv1; + private JTextField csv2; + private JTextField csv3; + private JTextField csv4; + private JTextField csv5; + private JTextField csv6; + private JTextField csv7; + private JLabel currentViewLabel; + private JTextField equipSlot; + private JTextField equipType; + private JMenuItem exitMenuBtn; + private JMenuItem exportMenuBtn; + private JTextField femaleEquip1; + private JTextField femaleEquip2; + private JTextField femaleEquip3; + private JTextField groundOptions; + private JTextField int1; + private JTextField int10; + private JTextField int11; + private JTextField int12; + private JTextField int13; + private JTextField int14; + private JTextField int15; + private JTextField int16; + private JTextField int17; + private JTextField int18; + private JTextField int19; + private JTextField int2; + private JTextField int20; + private JTextField int21; + private JTextField int22; + private JTextField int23; + private JTextField int3; + private JTextField int4; + private JTextField int5; + private JTextField int6; + private JTextField int7; + private JTextField int8; + private JTextField int9; + private JTextField invModel; + private JTextField invModelZoom; + private JTextField invOptions; + private JTextField itemName; + private JLabel jLabel1; + private JLabel jLabel10; + private JLabel jLabel11; + private JLabel jLabel12; + private JLabel jLabel13; + private JLabel jLabel14; + private JLabel jLabel15; + private JLabel jLabel16; + private JLabel jLabel17; + private JLabel jLabel18; + private JLabel jLabel19; + private JLabel jLabel2; + private JLabel jLabel20; + private JLabel jLabel21; + private JLabel jLabel22; + private JLabel jLabel23; + private JLabel jLabel24; + private JLabel jLabel25; + private JLabel jLabel26; + private JLabel jLabel27; + private JLabel jLabel28; + private JLabel jLabel29; + private JLabel jLabel3; + private JLabel jLabel30; + private JLabel jLabel31; + private JLabel jLabel32; + private JLabel jLabel33; + private JLabel jLabel34; + private JLabel jLabel35; + private JLabel jLabel36; + private JLabel jLabel37; + private JLabel jLabel38; + private JLabel jLabel39; + private JLabel jLabel4; + private JLabel jLabel40; + private JLabel jLabel41; + private JLabel jLabel42; + private JLabel jLabel43; + private JLabel jLabel44; + private JLabel jLabel45; + private JLabel jLabel46; + private JLabel jLabel47; + private JLabel jLabel48; + private JLabel jLabel49; + private JLabel jLabel5; + private JLabel jLabel50; + private JLabel jLabel51; + private JLabel jLabel52; + private JLabel jLabel53; + private JLabel jLabel54; + private JLabel jLabel55; + private JLabel jLabel56; + private JLabel jLabel57; + private JLabel jLabel58; + private JLabel jLabel59; + private JLabel jLabel6; + private JLabel jLabel60; + private JLabel jLabel61; + private JLabel jLabel7; + private JLabel jLabel8; + private JLabel jLabel9; + private JMenu jMenu1; + private JMenuBar jMenuBar1; + private JPanel jPanel1; + private JPanel jPanel2; + private JPanel jPanel3; + private JPanel jPanel5; + private JPanel jPanel6; + private JPanel jPanel7; + private JScrollPane jScrollPane1; + private JTabbedPane jTabbedPane1; + private JTextField lend; + private JTextField maleEquip1; + private JTextField maleEquip2; + private JTextField maleEquip3; + private JCheckBox membersOnly; + private JTextField modelColors; + private JTextField modelOffset2; + private JTextField modelRot1; + private JTextField note; + private JMenuItem reloadMenuBtn; + private JMenuItem saveMenuBtn; + private JTextField stackAmts; + private JTextField stackIDs; + private JTextField stackable; + public JTextField switchLend; + public JTextField switchNote; + public JTextField teamId; + public JTextField textureColors; + public JCheckBox unnoted; + public JTextField value; + + public ItemEditor(ItemSelection is, ItemDefinitions defs) { + this.defs = defs; + this.is = is; + this.initComponents(); + this.setResizable(false); + this.setTitle("Item Editor"); + this.setDefaultCloseOperation(1); + this.setLocationRelativeTo((Component)null); + this.setVisible(true); + } + + private void initComponents() { + this.jTabbedPane1 = new JTabbedPane(); + this.jPanel1 = new JPanel(); + this.jLabel1 = new JLabel(); + this.itemName = new JTextField(); + this.jLabel2 = new JLabel(); + this.value = new JTextField(); + this.teamId = new JTextField(); + this.jLabel3 = new JLabel(); + this.membersOnly = new JCheckBox(); + this.jLabel20 = new JLabel(); + this.equipSlot = new JTextField(); + this.jLabel21 = new JLabel(); + this.equipType = new JTextField(); + this.jLabel22 = new JLabel(); + this.stackIDs = new JTextField(); + this.jLabel23 = new JLabel(); + this.stackAmts = new JTextField(); + this.jLabel24 = new JLabel(); + this.stackable = new JTextField(); + this.jLabel58 = new JLabel(); + this.switchNote = new JTextField(); + this.jLabel59 = new JLabel(); + this.note = new JTextField(); + this.unnoted = new JCheckBox(); + this.jLabel60 = new JLabel(); + this.jLabel61 = new JLabel(); + this.switchLend = new JTextField(); + this.lend = new JTextField(); + this.jPanel2 = new JPanel(); + this.jLabel4 = new JLabel(); + this.invModelZoom = new JTextField(); + this.jLabel5 = new JLabel(); + this.modelRot1 = new JTextField(); + this.jLabel6 = new JLabel(); + this.ModelRot2 = new JTextField(); + this.jLabel7 = new JLabel(); + this.ModelOffset1 = new JTextField(); + this.jLabel8 = new JLabel(); + this.modelOffset2 = new JTextField(); + this.jLabel9 = new JLabel(); + this.invModel = new JTextField(); + this.jLabel10 = new JLabel(); + this.maleEquip1 = new JTextField(); + this.jLabel11 = new JLabel(); + this.femaleEquip1 = new JTextField(); + this.jLabel12 = new JLabel(); + this.maleEquip2 = new JTextField(); + this.jLabel13 = new JLabel(); + this.femaleEquip2 = new JTextField(); + this.jLabel14 = new JLabel(); + this.maleEquip3 = new JTextField(); + this.jLabel15 = new JLabel(); + this.femaleEquip3 = new JTextField(); + this.jPanel3 = new JPanel(); + this.jLabel16 = new JLabel(); + this.invOptions = new JTextField(); + this.jLabel17 = new JLabel(); + this.groundOptions = new JTextField(); + this.jLabel18 = new JLabel(); + this.modelColors = new JTextField(); + this.jLabel19 = new JLabel(); + this.textureColors = new JTextField(); + this.jPanel5 = new JPanel(); + this.jLabel25 = new JLabel(); + this.array1 = new JTextField(); + this.jLabel27 = new JLabel(); + this.jLabel28 = new JLabel(); + this.jLabel29 = new JLabel(); + this.jLabel30 = new JLabel(); + this.jLabel31 = new JLabel(); + this.array2 = new JTextField(); + this.array3 = new JTextField(); + this.array4 = new JTextField(); + this.array5 = new JTextField(); + this.array6 = new JTextField(); + this.jLabel32 = new JLabel(); + this.int1 = new JTextField(); + this.int2 = new JTextField(); + this.jLabel33 = new JLabel(); + this.jLabel34 = new JLabel(); + this.int3 = new JTextField(); + this.jLabel35 = new JLabel(); + this.int4 = new JTextField(); + this.jLabel36 = new JLabel(); + this.int5 = new JTextField(); + this.jLabel37 = new JLabel(); + this.int6 = new JTextField(); + this.jLabel38 = new JLabel(); + this.int7 = new JTextField(); + this.jLabel39 = new JLabel(); + this.int8 = new JTextField(); + this.jLabel40 = new JLabel(); + this.int9 = new JTextField(); + this.jLabel41 = new JLabel(); + this.int10 = new JTextField(); + this.jLabel42 = new JLabel(); + this.int11 = new JTextField(); + this.jLabel43 = new JLabel(); + this.int12 = new JTextField(); + this.jLabel44 = new JLabel(); + this.int13 = new JTextField(); + this.jLabel45 = new JLabel(); + this.int14 = new JTextField(); + this.jPanel6 = new JPanel(); + this.jLabel46 = new JLabel(); + this.int15 = new JTextField(); + this.jLabel47 = new JLabel(); + this.int16 = new JTextField(); + this.jLabel48 = new JLabel(); + this.int17 = new JTextField(); + this.jLabel49 = new JLabel(); + this.int18 = new JTextField(); + this.jLabel50 = new JLabel(); + this.int19 = new JTextField(); + this.jLabel51 = new JLabel(); + this.int20 = new JTextField(); + this.jLabel52 = new JLabel(); + this.int21 = new JTextField(); + this.jLabel53 = new JLabel(); + this.int22 = new JTextField(); + this.jLabel54 = new JLabel(); + this.int23 = new JTextField(); + this.jPanel7 = new JPanel(); + this.jScrollPane1 = new JScrollPane(); + this.clientScriptOutput = new JTextArea(); + this.jLabel26 = new JLabel(); + this.jLabel55 = new JLabel(); + this.jLabel56 = new JLabel(); + this.jLabel57 = new JLabel(); + this.csk1 = new JTextField(); + this.csk2 = new JTextField(); + this.csk3 = new JTextField(); + this.csk4 = new JTextField(); + this.csk5 = new JTextField(); + this.csk6 = new JTextField(); + this.csk7 = new JTextField(); + this.csv1 = new JTextField(); + this.csv2 = new JTextField(); + this.csv3 = new JTextField(); + this.csv4 = new JTextField(); + this.csv5 = new JTextField(); + this.csv6 = new JTextField(); + this.csv7 = new JTextField(); + this.currentViewLabel = new JLabel(); + this.jMenuBar1 = new JMenuBar(); + this.jMenu1 = new JMenu(); + this.reloadMenuBtn = new JMenuItem(); + this.saveMenuBtn = new JMenuItem(); + this.addModelMenuBtn = new JMenuItem(); + this.exportMenuBtn = new JMenuItem(); + this.exitMenuBtn = new JMenuItem(); + this.setDefaultCloseOperation(3); + this.jLabel1.setText("Name"); + this.itemName.setText(this.defs.getName()); + this.jLabel2.setText("Value"); + this.value.setText("" + this.defs.getValue()); + this.teamId.setText("" + this.defs.getTeamId()); + this.jLabel3.setText("Team"); + this.membersOnly.setSelected(this.defs.isMembersOnly()); + this.membersOnly.setText("Members Only"); + this.jLabel20.setText("Equip Slot"); + this.equipSlot.setText("" + this.defs.getEquipSlot()); + this.jLabel21.setText("Equip Type"); + this.equipType.setText("" + this.defs.getEquipType()); + this.jLabel22.setText("Stack IDs"); + this.stackIDs.setText(this.getStackIDs()); + this.jLabel23.setText("Stack Amounts"); + this.stackAmts.setText(this.getStackAmts()); + this.jLabel24.setText("Stackable"); + this.stackable.setText("" + this.defs.getStackable()); + this.jLabel58.setText("Switch Note Item ID"); + this.switchNote.setText("" + this.defs.switchNoteItemId); + this.jLabel59.setText("Noted Item ID"); + this.note.setText("" + this.defs.notedItemId); + this.unnoted.setSelected(this.defs.isUnnoted()); + this.unnoted.setText("Unnoted"); + this.jLabel60.setText("Switch Lend Item ID"); + this.jLabel61.setText("Lent Item ID"); + this.switchLend.setText("" + this.defs.getSwitchLendItemId()); + this.lend.setText("" + this.defs.getLendedItemId()); + GroupLayout jPanel1Layout = new GroupLayout(this.jPanel1); + this.jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.unnoted).addComponent(this.membersOnly).addGroup(jPanel1Layout.createSequentialGroup().addComponent(this.jLabel20).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.equipSlot, -2, 100, -2)).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addComponent(this.jLabel1).addGap(18, 18, 18).addComponent(this.itemName, -2, 100, -2)).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel2).addComponent(this.jLabel3)).addGap(18, 18, 18).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.teamId, -2, 100, -2).addComponent(this.value, -2, 100, -2))).addGroup(jPanel1Layout.createSequentialGroup().addComponent(this.jLabel24).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.stackable, -2, 100, -2))).addGap(126, 126, 126).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.stackAmts, -2, 300, -2).addComponent(this.stackIDs, -2, 300, -2).addComponent(this.jLabel22).addComponent(this.jLabel23))).addGroup(jPanel1Layout.createSequentialGroup().addComponent(this.jLabel21).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.equipType, -2, 100, -2)).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel58).addComponent(this.jLabel59)).addPreferredGap(ComponentPlacement.UNRELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.switchNote, -1, 100, 32767).addComponent(this.note)).addGap(18, 18, 18).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel60).addComponent(this.jLabel61)).addPreferredGap(ComponentPlacement.UNRELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.switchLend, -1, 100, 32767).addComponent(this.lend)))).addContainerGap(36, 32767))); + jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel1).addComponent(this.itemName, -2, -1, -2).addComponent(this.jLabel22)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.value, -2, -1, -2).addComponent(this.jLabel2)).addComponent(this.stackIDs, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.teamId, -2, -1, -2).addComponent(this.jLabel3).addComponent(this.jLabel23)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.stackAmts, -2, -1, -2).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel24).addComponent(this.stackable, -2, -1, -2))).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.membersOnly).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel20).addComponent(this.equipSlot, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel21).addComponent(this.equipType, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel58).addComponent(this.switchNote, -2, -1, -2).addComponent(this.jLabel60).addComponent(this.switchLend, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel59).addComponent(this.note, -2, -1, -2).addComponent(this.jLabel61).addComponent(this.lend, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unnoted).addContainerGap(13, 32767))); + this.jTabbedPane1.addTab("General", this.jPanel1); + this.jLabel4.setText("Inventory Model Zoom"); + this.invModelZoom.setText("" + this.defs.getInvModelZoom()); + this.jLabel5.setText("Model Rotation 1"); + this.modelRot1.setText("" + this.defs.getModelRotation1()); + this.jLabel6.setText("Model Rotation 2"); + this.ModelRot2.setText("" + this.defs.getModelRotation2()); + this.jLabel7.setText("Model Offset 1"); + this.ModelOffset1.setText("" + this.defs.getModelOffset1()); + this.jLabel8.setText("Model Offset 2"); + this.modelOffset2.setText("" + this.defs.getModelOffset2()); + this.jLabel9.setText("Inventory Model"); + this.invModel.setText("" + this.defs.getInvModelId()); + this.jLabel10.setText("Male Equip 1"); + this.maleEquip1.setText("" + this.defs.getMaleEquipModelId1()); + this.jLabel11.setText("Female Equip 1"); + this.femaleEquip1.setText("" + this.defs.getFemaleEquipModelId1()); + this.jLabel12.setText("Male Equip 2"); + this.maleEquip2.setText("" + this.defs.getMaleEquipModelId2()); + this.jLabel13.setText("Female Equip 2"); + this.femaleEquip2.setText("" + this.defs.getFemaleEquipModelId2()); + this.jLabel14.setText("Male Equip 3"); + this.maleEquip3.setText("" + this.defs.getMaleEquipModelId3()); + this.jLabel15.setText("Female Equip 3"); + this.femaleEquip3.setText("" + this.defs.getFemaleEquipModelId3()); + GroupLayout jPanel2Layout = new GroupLayout(this.jPanel2); + this.jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING, false).addGroup(jPanel2Layout.createSequentialGroup().addComponent(this.jLabel7).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.ModelOffset1, -2, 100, -2)).addGroup(jPanel2Layout.createSequentialGroup().addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel4).addComponent(this.jLabel5).addComponent(this.jLabel6)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.ModelRot2, -2, 100, -2).addComponent(this.modelRot1, -2, 100, -2).addComponent(this.invModelZoom, -2, 100, -2))).addGroup(Alignment.TRAILING, jPanel2Layout.createSequentialGroup().addComponent(this.jLabel8).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.modelOffset2, -2, 100, -2))).addGap(114, 114, 114).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addComponent(this.jLabel15).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.femaleEquip3, -2, 100, -2)).addGroup(jPanel2Layout.createSequentialGroup().addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel9).addComponent(this.jLabel10)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.maleEquip1, -2, 100, -2).addComponent(this.invModel, -2, 100, -2))).addGroup(jPanel2Layout.createSequentialGroup().addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel11).addComponent(this.jLabel12)).addPreferredGap(ComponentPlacement.UNRELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.maleEquip2, -2, 100, -2).addComponent(this.femaleEquip1, -2, 100, -2))).addGroup(jPanel2Layout.createParallelGroup(Alignment.TRAILING, false).addGroup(jPanel2Layout.createSequentialGroup().addComponent(this.jLabel14).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.maleEquip3, -2, 100, -2)).addGroup(jPanel2Layout.createSequentialGroup().addComponent(this.jLabel13).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.femaleEquip2, -2, 100, -2)))).addContainerGap(103, 32767))); + jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel4).addComponent(this.invModelZoom, -2, -1, -2).addComponent(this.jLabel9).addComponent(this.invModel, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel5).addComponent(this.modelRot1, -2, -1, -2).addComponent(this.jLabel10).addComponent(this.maleEquip1, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel6).addComponent(this.ModelRot2, -2, -1, -2).addComponent(this.jLabel11).addComponent(this.femaleEquip1, -2, -1, -2)).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addGap(9, 9, 9).addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel7).addComponent(this.ModelOffset1, -2, -1, -2).addComponent(this.jLabel12)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.TRAILING).addComponent(this.jLabel8).addComponent(this.modelOffset2, -2, -1, -2).addGroup(Alignment.LEADING, jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel13).addComponent(this.femaleEquip2, -2, -1, -2)))).addGroup(jPanel2Layout.createSequentialGroup().addPreferredGap(ComponentPlacement.RELATED).addComponent(this.maleEquip2, -2, -1, -2))).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel14).addComponent(this.maleEquip3, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel15).addComponent(this.femaleEquip3, -2, -1, -2)).addContainerGap(82, 32767))); + this.jTabbedPane1.addTab("Model", this.jPanel2); + this.jLabel16.setText("Inventory Options"); + this.invOptions.setText(this.getInventoryOpts()); + this.jLabel17.setText("Ground Options"); + this.groundOptions.setText(this.getGroundOpts()); + this.jLabel18.setText("Model Colors"); + this.modelColors.setText(this.getChangedModelColors()); + this.jLabel19.setText("Texture Colors"); + this.textureColors.setText(this.getChangedTextureColors()); + GroupLayout jPanel3Layout = new GroupLayout(this.jPanel3); + this.jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup(jPanel3Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addContainerGap().addGroup(jPanel3Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel16).addComponent(this.invOptions, -2, 300, -2).addComponent(this.jLabel17).addComponent(this.groundOptions, -2, 300, -2).addComponent(this.jLabel18).addComponent(this.modelColors, -2, 300, -2).addComponent(this.jLabel19).addComponent(this.textureColors, -2, 300, -2)).addContainerGap(312, 32767))); + jPanel3Layout.setVerticalGroup(jPanel3Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addContainerGap().addComponent(this.jLabel16).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.invOptions, -2, -1, -2).addGap(18, 18, 18).addComponent(this.jLabel17).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.groundOptions, -2, -1, -2).addGap(18, 18, 18).addComponent(this.jLabel18).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.modelColors, -2, -1, -2).addGap(18, 18, 18).addComponent(this.jLabel19).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.textureColors, -2, -1, -2).addContainerGap(47, 32767))); + this.jTabbedPane1.addTab("Options", this.jPanel3); + this.jLabel25.setText("unknownArray1"); + this.array1.setText(this.getUnknownArray1()); + this.jLabel27.setText("unknownArray2"); + this.jLabel28.setText("unknownArray3"); + this.jLabel29.setText("unknownArray4"); + this.jLabel30.setText("unknownArray5"); + this.jLabel31.setText("unknownArray6"); + this.array2.setText(this.getUnknownArray2()); + this.array3.setText(this.getUnknownArray3()); + this.array4.setText(this.getUnknownArray4()); + this.array5.setText(this.getUnknownArray5()); + this.array6.setText(this.getUnknownArray6()); + this.jLabel32.setText("unknownInt1"); + this.int1.setText("" + this.defs.unknownInt1); + this.int2.setText("" + this.defs.unknownInt2); + this.jLabel33.setText("unknownInt2"); + this.jLabel34.setText("unknownInt3"); + this.int3.setText("" + this.defs.unknownInt3); + this.jLabel35.setText("unknownInt4"); + this.int4.setText("" + this.defs.unknownInt4); + this.jLabel36.setText("unknownInt5"); + this.int5.setText("" + this.defs.unknownInt5); + this.jLabel37.setText("unknownInt6"); + this.int6.setText("" + this.defs.unknownInt6); + this.jLabel38.setText("unknownInt7"); + this.int7.setText("" + this.defs.unknownInt7); + this.jLabel39.setText("unknownInt8"); + this.int8.setText("" + this.defs.unknownInt8); + this.jLabel40.setText("unknownInt9"); + this.int9.setText("" + this.defs.unknownInt9); + this.jLabel41.setText("unknownInt10"); + this.int10.setText("" + this.defs.unknownInt10); + this.jLabel42.setText("unknownInt11"); + this.int11.setText("" + this.defs.unknownInt11); + this.jLabel43.setText("unknownInt12"); + this.int12.setText("" + this.defs.unknownInt12); + this.jLabel44.setText("unknownInt13"); + this.int13.setText("" + this.defs.unknownInt13); + this.jLabel45.setText("unknownInt14"); + this.int14.setText("" + this.defs.unknownInt14); + GroupLayout jPanel5Layout = new GroupLayout(this.jPanel5); + this.jPanel5.setLayout(jPanel5Layout); + jPanel5Layout.setHorizontalGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel5Layout.createSequentialGroup().addContainerGap().addGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING, false).addGroup(jPanel5Layout.createSequentialGroup().addGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel31).addComponent(this.jLabel32).addComponent(this.jLabel33).addComponent(this.jLabel34).addComponent(this.jLabel35)).addGap(18, 18, 18).addGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.array6, -2, 200, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel41).addGap(18, 18, 18).addComponent(this.int10, -2, 100, -2)).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.int1, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel42).addGap(18, 18, 18).addComponent(this.int11, -2, 100, -2)).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.int4, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel45).addGap(18, 18, 18).addComponent(this.int14, -2, 100, -2)).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.int2, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel43).addGap(18, 18, 18).addComponent(this.int12, -2, 100, -2)).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.int3, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel44).addGap(18, 18, 18).addComponent(this.int13, -2, 100, -2)))).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.jLabel30).addGap(18, 18, 18).addComponent(this.array5, -2, 200, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel40).addGap(18, 18, 18).addComponent(this.int9, -2, 100, -2)).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.jLabel29).addGap(18, 18, 18).addComponent(this.array4, -2, 200, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel39).addGap(18, 18, 18).addComponent(this.int8, -2, 100, -2)).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.jLabel28).addGap(18, 18, 18).addComponent(this.array3, -2, 200, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel38).addGap(18, 18, 18).addComponent(this.int7, -2, 100, -2)).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.jLabel27).addGap(18, 18, 18).addComponent(this.array2, -2, 200, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel37).addGap(18, 18, 18).addComponent(this.int6, -2, 100, -2)).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.jLabel25).addGap(18, 18, 18).addComponent(this.array1, -2, 200, -2).addGap(73, 73, 73).addComponent(this.jLabel36).addGap(18, 18, 18).addComponent(this.int5, -2, 100, -2))).addContainerGap(64, 32767))); + jPanel5Layout.setVerticalGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel5Layout.createSequentialGroup().addContainerGap().addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel25).addComponent(this.array1, -2, -1, -2).addComponent(this.jLabel36).addComponent(this.int5, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel27).addComponent(this.array2, -2, -1, -2).addComponent(this.jLabel37).addComponent(this.int6, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel28).addComponent(this.array3, -2, -1, -2).addComponent(this.jLabel38).addComponent(this.int7, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel29).addComponent(this.array4, -2, -1, -2).addComponent(this.jLabel39).addComponent(this.int8, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel30).addComponent(this.array5, -2, -1, -2).addComponent(this.jLabel40).addComponent(this.int9, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel31).addComponent(this.array6, -2, -1, -2).addComponent(this.jLabel41).addComponent(this.int10, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel32).addComponent(this.int1, -2, -1, -2).addComponent(this.jLabel42).addComponent(this.int11, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel33).addComponent(this.int2, -2, -1, -2).addComponent(this.jLabel43).addComponent(this.int12, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel34).addComponent(this.int3, -2, -1, -2).addComponent(this.jLabel44).addComponent(this.int13, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel45).addComponent(this.int14, -2, -1, -2)).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel35).addComponent(this.int4, -2, -1, -2))).addContainerGap(-1, 32767))); + this.jTabbedPane1.addTab("Unknown Definitions", this.jPanel5); + this.jLabel46.setText("unknownInt15"); + this.int15.setText("" + this.defs.unknownInt15); + this.jLabel47.setText("unknownInt16"); + this.int16.setText("" + this.defs.unknownInt16); + this.jLabel48.setText("unknownInt17"); + this.int17.setText("" + this.defs.unknownInt17); + this.jLabel49.setText("unknownInt18"); + this.int18.setText("" + this.defs.unknownInt18); + this.jLabel50.setText("unknownInt19"); + this.int19.setText("" + this.defs.unknownInt19); + this.jLabel51.setText("unknownInt20"); + this.int20.setText("" + this.defs.unknownInt20); + this.jLabel52.setText("unknownInt21"); + this.int21.setText("" + this.defs.unknownInt21); + this.jLabel53.setText("unknownInt22"); + this.int22.setText("" + this.defs.unknownInt22); + this.jLabel54.setText("unknownInt23"); + this.int23.setText("" + this.defs.unknownInt23); + GroupLayout jPanel6Layout = new GroupLayout(this.jPanel6); + this.jPanel6.setLayout(jPanel6Layout); + jPanel6Layout.setHorizontalGroup(jPanel6Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel6Layout.createSequentialGroup().addContainerGap().addGroup(jPanel6Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel6Layout.createSequentialGroup().addComponent(this.jLabel46).addGap(18, 18, 18).addComponent(this.int15, -2, 100, -2)).addGroup(jPanel6Layout.createSequentialGroup().addComponent(this.jLabel47).addGap(18, 18, 18).addComponent(this.int16, -2, 100, -2)).addGroup(jPanel6Layout.createSequentialGroup().addComponent(this.jLabel48).addGap(18, 18, 18).addComponent(this.int17, -2, 100, -2)).addGroup(jPanel6Layout.createSequentialGroup().addComponent(this.jLabel49).addGap(18, 18, 18).addComponent(this.int18, -2, 100, -2)).addGroup(jPanel6Layout.createSequentialGroup().addComponent(this.jLabel50).addGap(18, 18, 18).addComponent(this.int19, -2, 100, -2)).addGroup(jPanel6Layout.createSequentialGroup().addComponent(this.jLabel51).addGap(18, 18, 18).addComponent(this.int20, -2, 100, -2)).addGroup(jPanel6Layout.createSequentialGroup().addComponent(this.jLabel52).addGap(18, 18, 18).addComponent(this.int21, -2, 100, -2)).addGroup(jPanel6Layout.createSequentialGroup().addComponent(this.jLabel53).addGap(18, 18, 18).addComponent(this.int22, -2, 100, -2)).addGroup(jPanel6Layout.createSequentialGroup().addComponent(this.jLabel54).addGap(18, 18, 18).addComponent(this.int23, -2, 100, -2))).addContainerGap(425, 32767))); + jPanel6Layout.setVerticalGroup(jPanel6Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel6Layout.createSequentialGroup().addContainerGap().addGroup(jPanel6Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel46).addComponent(this.int15, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel6Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel47).addComponent(this.int16, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel6Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel48).addComponent(this.int17, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel6Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel49).addComponent(this.int18, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel6Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel50).addComponent(this.int19, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel6Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel51).addComponent(this.int20, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel6Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel52).addComponent(this.int21, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel6Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel53).addComponent(this.int22, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel6Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel54).addComponent(this.int23, -2, -1, -2)).addContainerGap(33, 32767))); + this.jTabbedPane1.addTab("Unknown Definitions(2)", this.jPanel6); + this.clientScriptOutput.setColumns(20); + this.clientScriptOutput.setRows(5); + this.clientScriptOutput.setText(this.getClientScripts()); + this.jScrollPane1.setViewportView(this.clientScriptOutput); + this.jLabel26.setText("KEY"); + this.jLabel55.setText("VALUE"); + this.jLabel56.setText("Add the keys to the left to the boxes to edit them."); + this.jLabel57.setText("Add new keys in the boxes to give the item new clientscripts."); + GroupLayout jPanel7Layout = new GroupLayout(this.jPanel7); + this.jPanel7.setLayout(jPanel7Layout); + jPanel7Layout.setHorizontalGroup(jPanel7Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel7Layout.createSequentialGroup().addContainerGap().addComponent(this.jScrollPane1, -2, 305, -2).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel7Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel57).addGroup(jPanel7Layout.createParallelGroup(Alignment.TRAILING).addGroup(jPanel7Layout.createSequentialGroup().addGroup(jPanel7Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel7Layout.createParallelGroup(Alignment.TRAILING).addComponent(this.csk2, -2, 75, -2).addComponent(this.csk1, -2, 75, -2).addComponent(this.csk3, -2, 75, -2).addComponent(this.csk4, -2, 75, -2).addComponent(this.csk5, -2, 75, -2).addComponent(this.csk6, -2, 75, -2).addComponent(this.csk7, -2, 75, -2)).addComponent(this.jLabel26)).addGap(58, 58, 58).addGroup(jPanel7Layout.createParallelGroup(Alignment.LEADING).addComponent(this.csv1, -2, 75, -2).addComponent(this.csv2, -2, 75, -2).addComponent(this.csv3, -2, 75, -2).addComponent(this.csv4, -2, 75, -2).addComponent(this.csv5, -2, 75, -2).addComponent(this.csv6, -2, 75, -2).addComponent(this.csv7, -2, 75, -2).addComponent(this.jLabel55))).addComponent(this.jLabel56))).addContainerGap(-1, 32767))); + jPanel7Layout.setVerticalGroup(jPanel7Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel7Layout.createSequentialGroup().addContainerGap().addGroup(jPanel7Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel7Layout.createSequentialGroup().addGroup(jPanel7Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel26).addComponent(this.jLabel55)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel7Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk1, -2, -1, -2).addComponent(this.csv1, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel7Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk2, -2, -1, -2).addComponent(this.csv2, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel7Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk3, -2, -1, -2).addComponent(this.csv3, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel7Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk4, -2, -1, -2).addComponent(this.csv4, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel7Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk5, -2, -1, -2).addComponent(this.csv5, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel7Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk6, -2, -1, -2).addComponent(this.csv6, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel7Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk7, -2, -1, -2).addComponent(this.csv7, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED, 20, 32767).addComponent(this.jLabel56).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.jLabel57)).addComponent(this.jScrollPane1)).addContainerGap())); + this.jTabbedPane1.addTab("Clientscripts", this.jPanel7); + this.currentViewLabel.setText("Currently Viewing Definitions of Item: " + this.defs.getId() + " - " + this.defs.getName()); + this.jMenu1.setText("File"); + this.reloadMenuBtn.setText("Reload"); + this.reloadMenuBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ItemEditor.this.reloadMenuBtnActionPerformed(evt); + } + }); + this.jMenu1.add(this.reloadMenuBtn); + this.saveMenuBtn.setText("Save"); + this.saveMenuBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ItemEditor.this.saveMenuBtnActionPerformed(evt); + } + }); + this.jMenu1.add(this.saveMenuBtn); + this.addModelMenuBtn.setText("Add Model"); + this.addModelMenuBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ItemEditor.this.addModelMenuBtnActionPerformed(evt); + } + }); + this.jMenu1.add(this.addModelMenuBtn); + this.exportMenuBtn.setText("Export to .txt"); + this.exportMenuBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ItemEditor.this.exportMenuBtnActionPerformed(evt); + } + }); + this.jMenu1.add(this.exportMenuBtn); + this.exitMenuBtn.setText("Exit"); + this.exitMenuBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ItemEditor.this.exitMenuBtnActionPerformed(evt); + } + }); + this.jMenu1.add(this.exitMenuBtn); + this.jMenuBar1.add(this.jMenu1); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(this.jTabbedPane1).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(this.currentViewLabel).addContainerGap(-1, 32767))); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(Alignment.TRAILING, layout.createSequentialGroup().addGap(0, 11, 32767).addComponent(this.currentViewLabel).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.jTabbedPane1, -2, 300, -2))); + this.pack(); + } + + private void exitMenuBtnActionPerformed(ActionEvent evt) { + this.dispose(); + } + + private void exportMenuBtnActionPerformed(ActionEvent evt) { + this.export(); + } + + private void addModelMenuBtnActionPerformed(ActionEvent evt) { + this.addModel(); + } + + private void saveMenuBtnActionPerformed(ActionEvent evt) { + this.save(); + } + + private void reloadMenuBtnActionPerformed(ActionEvent evt) { + this.itemName.setText(this.defs.getName()); + this.value.setText("" + this.defs.getValue()); + this.teamId.setText("" + this.defs.getTeamId()); + this.membersOnly.setSelected(this.defs.isMembersOnly()); + this.equipSlot.setText("" + this.defs.getEquipSlot()); + this.equipType.setText("" + this.defs.getEquipType()); + this.stackIDs.setText(this.getStackIDs()); + this.stackAmts.setText(this.getStackAmts()); + this.stackable.setText("" + this.defs.getStackable()); + this.invModelZoom.setText("" + this.defs.getInvModelZoom()); + this.modelRot1.setText("" + this.defs.getModelRotation1()); + this.ModelRot2.setText("" + this.defs.getModelRotation2()); + this.ModelOffset1.setText("" + this.defs.getModelOffset1()); + this.modelOffset2.setText("" + this.defs.getModelOffset2()); + this.invModel.setText("" + this.defs.getInvModelId()); + this.maleEquip1.setText("" + this.defs.getMaleEquipModelId1()); + this.femaleEquip1.setText("" + this.defs.getFemaleEquipModelId1()); + this.maleEquip2.setText("" + this.defs.getMaleEquipModelId2()); + this.femaleEquip2.setText("" + this.defs.getFemaleEquipModelId2()); + this.maleEquip3.setText("" + this.defs.getMaleEquipModelId3()); + this.femaleEquip3.setText("" + this.defs.getFemaleEquipModelId3()); + this.invOptions.setText(this.getInventoryOpts()); + this.groundOptions.setText(this.getGroundOpts()); + this.modelColors.setText(this.getChangedModelColors()); + this.textureColors.setText(this.getChangedTextureColors()); + this.switchNote.setText("" + this.defs.switchNoteItemId); + this.note.setText("" + this.defs.notedItemId); + this.unnoted.setSelected(this.defs.isUnnoted()); + this.switchLend.setText("" + this.defs.getSwitchLendItemId()); + this.lend.setText("" + this.defs.getLendedItemId()); + this.array1.setText(this.getUnknownArray1()); + this.array2.setText(this.getUnknownArray2()); + this.array3.setText(this.getUnknownArray3()); + this.array4.setText(this.getUnknownArray4()); + this.array5.setText(this.getUnknownArray5()); + this.array6.setText(this.getUnknownArray6()); + this.int1.setText("" + this.defs.unknownInt1); + this.int2.setText("" + this.defs.unknownInt2); + this.int3.setText("" + this.defs.unknownInt3); + this.int4.setText("" + this.defs.unknownInt4); + this.int5.setText("" + this.defs.unknownInt5); + this.int6.setText("" + this.defs.unknownInt6); + this.int7.setText("" + this.defs.unknownInt7); + this.int8.setText("" + this.defs.unknownInt8); + this.int9.setText("" + this.defs.unknownInt9); + this.int10.setText("" + this.defs.unknownInt10); + this.int11.setText("" + this.defs.unknownInt11); + this.int12.setText("" + this.defs.unknownInt12); + this.int13.setText("" + this.defs.unknownInt13); + this.int14.setText("" + this.defs.unknownInt14); + this.int15.setText("" + this.defs.unknownInt15); + this.int16.setText("" + this.defs.unknownInt16); + this.int17.setText("" + this.defs.unknownInt17); + this.int18.setText("" + this.defs.unknownInt18); + this.int19.setText("" + this.defs.unknownInt19); + this.int20.setText("" + this.defs.unknownInt20); + this.int21.setText("" + this.defs.unknownInt21); + this.int22.setText("" + this.defs.unknownInt22); + this.int23.setText("" + this.defs.unknownInt23); + this.clientScriptOutput.setText(this.getClientScripts()); + } + + private void export() { + File f = new File(System.getProperty("user.home") + "/FCE/items/"); + f.mkdirs(); + String lineSep = System.getProperty("line.separator"); + BufferedWriter writer = null; + + try { + writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(System.getProperty("user.home") + "/FCE/items/" + this.defs.id + ".txt"), "utf-8")); + writer.write("name = " + this.defs.getName()); + writer.write(lineSep); + writer.write("value = " + this.defs.getValue()); + writer.write(lineSep); + writer.write("team id = " + this.defs.getTeamId()); + writer.write(lineSep); + writer.write("members only = " + String.valueOf(this.defs.isMembersOnly())); + writer.write(lineSep); + writer.write("equip slot = " + this.defs.getEquipSlot()); + writer.write(lineSep); + writer.write("equip type = " + this.defs.getEquipType()); + writer.write(lineSep); + writer.write("stack ids = " + this.getStackIDs()); + writer.write(lineSep); + writer.write("stack amounts = " + this.getStackAmts()); + writer.write(lineSep); + writer.write("stackable = " + this.defs.getStackable()); + writer.write(lineSep); + writer.write("inv model zoom = " + this.defs.getInvModelZoom()); + writer.write(lineSep); + writer.write("model rotation 1 = " + this.defs.getModelRotation1()); + writer.write(lineSep); + writer.write("model rotation 2 = " + this.defs.getModelRotation2()); + writer.write(lineSep); + writer.write("model offset 1 = " + this.defs.getModelOffset1()); + writer.write(lineSep); + writer.write("model offset 2 = " + this.defs.getModelOffset2()); + writer.write(lineSep); + writer.write("inv model id = " + this.defs.getInvModelId()); + writer.write(lineSep); + writer.write("male equip model id 1 = " + this.defs.getMaleEquipModelId1()); + writer.write(lineSep); + writer.write("female equip model id 1 = " + this.defs.getFemaleEquipModelId1()); + writer.write(lineSep); + writer.write("male equip model id 2 = " + this.defs.getMaleEquipModelId2()); + writer.write(lineSep); + writer.write("female equip model id 2 = " + this.defs.getFemaleEquipModelId2()); + writer.write(lineSep); + writer.write("male equip model id 3 = " + this.defs.getMaleEquipModelId3()); + writer.write(lineSep); + writer.write("female equip model id 3 = " + this.defs.getFemaleEquipModelId3()); + writer.write(lineSep); + writer.write("inventory options = " + this.getInventoryOpts()); + writer.write(lineSep); + writer.write("ground options = " + this.getGroundOpts()); + writer.write(lineSep); + writer.write("changed model colors = " + this.getChangedModelColors()); + writer.write(lineSep); + writer.write("changed texture colors = " + this.getChangedTextureColors()); + writer.write(lineSep); + writer.write("switch note item id = " + this.defs.switchNoteItemId); + writer.write(lineSep); + writer.write("noted item id = " + this.defs.notedItemId); + writer.write(lineSep); + writer.write("unnoted = " + String.valueOf(this.defs.isUnnoted())); + writer.write(lineSep); + writer.write("switch lend item id = " + this.defs.getSwitchLendItemId()); + writer.write(lineSep); + writer.write("lended item id = " + this.defs.getLendedItemId()); + writer.write(lineSep); + writer.write("unknownArray1 = " + this.getUnknownArray1()); + writer.write(lineSep); + writer.write("unknownArray2 = " + this.getUnknownArray2()); + writer.write(lineSep); + writer.write("unknownArray3 = " + this.getUnknownArray3()); + writer.write(lineSep); + writer.write("unknownArray4 = " + this.getUnknownArray4()); + writer.write(lineSep); + writer.write("unknownArray5 = " + this.getUnknownArray5()); + writer.write(lineSep); + writer.write("unknownArray6 = " + this.getUnknownArray6()); + writer.write(lineSep); + writer.write("unknownInt1 = " + this.defs.unknownInt1); + writer.write(lineSep); + writer.write("unknownInt2 = " + this.defs.unknownInt2); + writer.write(lineSep); + writer.write("unknownInt3 = " + this.defs.unknownInt3); + writer.write(lineSep); + writer.write("unknownInt4 = " + this.defs.unknownInt4); + writer.write(lineSep); + writer.write("unknownInt5 = " + this.defs.unknownInt5); + writer.write(lineSep); + writer.write("unknownInt6 = " + this.defs.unknownInt6); + writer.write(lineSep); + writer.write("unknownInt7 = " + this.defs.unknownInt7); + writer.write(lineSep); + writer.write("unknownInt8 = " + this.defs.unknownInt8); + writer.write(lineSep); + writer.write("unknownInt9 = " + this.defs.unknownInt9); + writer.write(lineSep); + writer.write("unknownInt10 = " + this.defs.unknownInt10); + writer.write(lineSep); + writer.write("unknownInt11 = " + this.defs.unknownInt11); + writer.write(lineSep); + writer.write("unknownInt12 = " + this.defs.unknownInt12); + writer.write(lineSep); + writer.write("unknownInt13 = " + this.defs.unknownInt13); + writer.write(lineSep); + writer.write("unknownInt14 = " + this.defs.unknownInt14); + writer.write(lineSep); + writer.write("unknownInt15 = " + this.defs.unknownInt15); + writer.write(lineSep); + writer.write("unknownInt16 = " + this.defs.unknownInt16); + writer.write(lineSep); + writer.write("unknownInt17 = " + this.defs.unknownInt17); + writer.write(lineSep); + writer.write("unknownInt18 = " + this.defs.unknownInt18); + writer.write(lineSep); + writer.write("unknownInt19 = " + this.defs.unknownInt19); + writer.write(lineSep); + writer.write("unknownInt20 = " + this.defs.unknownInt20); + writer.write(lineSep); + writer.write("unknownInt21 = " + this.defs.unknownInt21); + writer.write(lineSep); + writer.write("unknownInt22 = " + this.defs.unknownInt22); + writer.write(lineSep); + writer.write("unknownInt23 = " + this.defs.unknownInt23); + writer.write(lineSep); + writer.write("Clientscripts"); + writer.write(lineSep); + if(this.defs.clientScriptData != null) { + Iterator var15 = this.defs.clientScriptData.keySet().iterator(); + + while(var15.hasNext()) { + int key = ((Integer)var15.next()).intValue(); + Object value = this.defs.clientScriptData.get(Integer.valueOf(key)); + writer.write("KEY: " + key + ", VALUE: " + value); + writer.write(lineSep); + } + } + } catch (IOException var151) { + Main.log("ItemEditor", "Failed to export Item Defs to .txt"); + } finally { + try { + writer.close(); + } catch (Exception var14) { + ; + } + + } + + } + + private void save() { + try { + this.defs.setName(this.itemName.getText().toString()); + this.defs.setValue(Integer.parseInt(this.value.getText().toString())); + this.defs.setTeamId(Integer.parseInt(this.teamId.getText().toString())); + this.defs.setMembersOnly(this.membersOnly.isSelected()); + this.defs.setEquipSlot(Integer.parseInt(this.equipSlot.getText().toString())); + this.defs.setEquipType(Integer.parseInt(this.equipType.getText().toString())); + String[] var17; + int invOpts; + if(!this.stackIDs.getText().equals("")) { + var17 = this.stackIDs.getText().split(";"); + + for(invOpts = 0; invOpts < this.defs.getStackIds().length; ++invOpts) { + this.defs.getStackIds()[invOpts] = Integer.parseInt(var17[invOpts]); + } + } + + if(!this.stackAmts.getText().equals("")) { + var17 = this.stackAmts.getText().split(";"); + + for(invOpts = 0; invOpts < this.defs.getStackAmounts().length; ++invOpts) { + this.defs.getStackAmounts()[invOpts] = Integer.parseInt(var17[invOpts]); + } + } + + this.defs.setStackable(Integer.parseInt(this.stackable.getText().toString())); + this.defs.setInvModelZoom(Integer.parseInt(this.invModelZoom.getText().toString())); + this.defs.setModelRotation1(Integer.parseInt(this.modelRot1.getText().toString())); + this.defs.setModelRotation2(Integer.parseInt(this.ModelRot2.getText().toString())); + this.defs.setModelOffset1(Integer.parseInt(this.ModelOffset1.getText().toString())); + this.defs.setModelOffset2(Integer.parseInt(this.modelOffset2.getText().toString())); + this.defs.setInvModelId(Integer.parseInt(this.invModel.getText().toString())); + this.defs.maleEquip1 = Integer.parseInt(this.maleEquip1.getText().toString()); + this.defs.maleEquip2 = Integer.parseInt(this.maleEquip2.getText().toString()); + this.defs.maleEquipModelId3 = Integer.parseInt(this.maleEquip3.getText().toString()); + this.defs.femaleEquip1 = Integer.parseInt(this.femaleEquip1.getText().toString()); + this.defs.femaleEquip2 = Integer.parseInt(this.femaleEquip2.getText().toString()); + this.defs.femaleEquipModelId3 = Integer.parseInt(this.femaleEquip3.getText().toString()); + var17 = this.groundOptions.getText().split(";"); + + for(invOpts = 0; invOpts < this.defs.getGroundOptions().length; ++invOpts) { + this.defs.getGroundOptions()[invOpts] = var17[invOpts].equals("null")?null:var17[invOpts]; + } + + String[] var19 = this.invOptions.getText().split(";"); + + for(int i = 0; i < this.defs.getInventoryOptions().length; ++i) { + this.defs.getInventoryOptions()[i] = var19[i].equals("null")?null:var19[i]; + } + + this.defs.resetModelColors(); + int len$; + int i$; + String t; + String[] editedColor; + String[] var18; + String[] var21; + if(!this.modelColors.getText().equals("")) { + var18 = this.modelColors.getText().split(";"); + var21 = var18; + len$ = var18.length; + + for(i$ = 0; i$ < len$; ++i$) { + t = var21[i$]; + editedColor = t.split("="); + this.defs.changeModelColor(Integer.valueOf(editedColor[0]).intValue(), Integer.valueOf(editedColor[1]).intValue()); + } + } + + this.defs.resetTextureColors(); + if(!this.textureColors.getText().equals("")) { + var18 = this.textureColors.getText().split(";"); + var21 = var18; + len$ = var18.length; + + for(i$ = 0; i$ < len$; ++i$) { + t = var21[i$]; + editedColor = t.split("="); + this.defs.changeTextureColor(Short.valueOf(editedColor[0]).shortValue(), Short.valueOf(editedColor[1]).shortValue()); + } + } + + this.defs.notedItemId = Integer.valueOf(this.note.getText()).intValue(); + this.defs.switchNoteItemId = Integer.valueOf(this.switchNote.getText()).intValue(); + this.defs.lendedItemId = Integer.valueOf(this.lend.getText()).intValue(); + this.defs.switchLendItemId = Integer.valueOf(this.switchLend.getText()).intValue(); + this.defs.setUnnoted(this.unnoted.isSelected()); + int var20; + if(!this.array1.getText().equals("")) { + var18 = this.array1.getText().split(";"); + + for(var20 = 0; var20 < this.defs.unknownArray1.length; ++var20) { + this.defs.unknownArray1[var20] = (byte)Integer.parseInt(var18[var20]); + } + } + + if(!this.array2.getText().equals("")) { + var18 = this.array2.getText().split(";"); + + for(var20 = 0; var20 < this.defs.unknownArray2.length; ++var20) { + this.defs.unknownArray2[var20] = Integer.parseInt(var18[var20]); + } + } + + if(!this.array3.getText().equals("")) { + var18 = this.array3.getText().split(";"); + + for(var20 = 0; var20 < this.defs.unknownArray3.length; ++var20) { + this.defs.unknownArray3[var20] = (byte)Integer.parseInt(var18[var20]); + } + } + + if(!this.array4.getText().equals("")) { + var18 = this.array4.getText().split(";"); + + for(var20 = 0; var20 < this.defs.unknownArray4.length; ++var20) { + this.defs.unknownArray4[var20] = Integer.parseInt(var18[var20]); + } + } + + if(!this.array5.getText().equals("")) { + var18 = this.array5.getText().split(";"); + + for(var20 = 0; var20 < this.defs.unknownArray5.length; ++var20) { + this.defs.unknownArray5[var20] = Integer.parseInt(var18[var20]); + } + } + + if(!this.array6.getText().equals("")) { + var18 = this.array6.getText().split(";"); + + for(var20 = 0; var20 < this.defs.unknownArray6.length; ++var20) { + this.defs.unknownArray6[var20] = (byte)Integer.parseInt(var18[var20]); + } + } + + this.defs.unknownInt1 = Integer.parseInt(this.int1.getText()); + this.defs.unknownInt2 = Integer.parseInt(this.int2.getText()); + this.defs.unknownInt3 = Integer.parseInt(this.int3.getText()); + this.defs.unknownInt4 = Integer.parseInt(this.int4.getText()); + this.defs.unknownInt5 = Integer.parseInt(this.int5.getText()); + this.defs.unknownInt6 = Integer.parseInt(this.int6.getText()); + this.defs.unknownInt7 = Integer.parseInt(this.int7.getText()); + this.defs.unknownInt8 = Integer.parseInt(this.int8.getText()); + this.defs.unknownInt9 = Integer.parseInt(this.int9.getText()); + this.defs.unknownInt10 = Integer.parseInt(this.int10.getText()); + this.defs.unknownInt11 = Integer.parseInt(this.int11.getText()); + this.defs.unknownInt12 = Integer.parseInt(this.int12.getText()); + this.defs.unknownInt13 = Integer.parseInt(this.int13.getText()); + this.defs.unknownInt14 = Integer.parseInt(this.int14.getText()); + this.defs.unknownInt15 = Integer.parseInt(this.int15.getText()); + this.defs.unknownInt16 = Integer.parseInt(this.int16.getText()); + this.defs.unknownInt17 = Integer.parseInt(this.int17.getText()); + this.defs.unknownInt18 = Integer.parseInt(this.int18.getText()); + this.defs.unknownInt19 = Integer.parseInt(this.int19.getText()); + this.defs.unknownInt20 = Integer.parseInt(this.int20.getText()); + this.defs.unknownInt21 = Integer.parseInt(this.int21.getText()); + this.defs.unknownInt22 = Integer.parseInt(this.int22.getText()); + this.defs.unknownInt23 = Integer.parseInt(this.int23.getText()); + + try { + if(!this.csk1.getText().equals("") && !this.csv1.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk1); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk1.getText())), Integer.valueOf(Integer.parseInt(this.csv1.getText()))); + } catch (Exception var181) { + this.defs.clientScriptData.remove(this.csk1); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk1.getText())), this.csv1.getText().toString()); + } + } + + if(!this.csk2.getText().equals("") && !this.csv2.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk2); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk2.getText())), Integer.valueOf(Integer.parseInt(this.csv2.getText()))); + } catch (Exception var171) { + this.defs.clientScriptData.remove(this.csk2); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk2.getText())), this.csv2.getText().toString()); + } + } + + if(!this.csk3.getText().equals("") && !this.csv3.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk3); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk3.getText())), Integer.valueOf(Integer.parseInt(this.csv3.getText()))); + } catch (Exception var16) { + this.defs.clientScriptData.remove(this.csk3); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk3.getText())), this.csv3.getText().toString()); + } + } + + if(!this.csk4.getText().equals("") && !this.csv4.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk4); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk4.getText())), Integer.valueOf(Integer.parseInt(this.csv4.getText()))); + } catch (Exception var15) { + this.defs.clientScriptData.remove(this.csk4); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk4.getText())), this.csv4.getText().toString()); + } + } + + if(!this.csk5.getText().equals("") && !this.csv5.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk5); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk5.getText())), Integer.valueOf(Integer.parseInt(this.csv5.getText()))); + } catch (Exception var14) { + this.defs.clientScriptData.remove(this.csk5); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk5.getText())), this.csv5.getText().toString()); + } + } + + if(!this.csk6.getText().equals("") && !this.csv6.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk6); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk6.getText())), Integer.valueOf(Integer.parseInt(this.csv6.getText()))); + } catch (Exception var13) { + this.defs.clientScriptData.remove(this.csk6); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk6.getText())), this.csv6.getText().toString()); + } + } + + if(!this.csk7.getText().equals("") && !this.csv7.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk7); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk7.getText())), Integer.valueOf(Integer.parseInt(this.csv7.getText()))); + } catch (Exception var12) { + this.defs.clientScriptData.remove(this.csk7); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk7.getText())), this.csv7.getText().toString()); + } + } + } catch (Exception var191) { + this.defs.clientScriptData = new HashMap(1); + } + + ItemSelection var10001 = this.is; + this.defs.write(ItemSelection.STORE); + this.is.updateItemDefs(this.defs); + } catch (Exception var201) { + Main.log("ItemEditor", "Cannot save. Please check for mistypes."); + } + + } + + private void addModel() { + JFrame frame = new JFrame(); + int result = JOptionPane.showConfirmDialog(frame, "Do you want to specify a model ID?"); + StringBuilder var10001; + ItemSelection var10002; + if(result == 0) { + JFrame fc1 = new JFrame(); + String returnVal1 = JOptionPane.showInputDialog(fc1, "Enter new model ID:"); + if(Integer.parseInt(returnVal1.toString()) != -1) { + JFileChooser file2 = new JFileChooser(); + file2.setFileSelectionMode(0); + int var9 = file2.showOpenDialog(this); + if(var9 == 0) { + File file1 = file2.getSelectedFile(); + + try { + var10001 = (new StringBuilder()).append("The model ID of the recently packed model is: "); + var10002 = this.is; + Main.log("ItemEditor", var10001.append(Utils.packCustomModel(ItemSelection.STORE, Utils.getBytesFromFile(new File(file1.getPath().toString())), Integer.parseInt(returnVal1.toString()))).toString()); + } catch (IOException var12) { + Main.log("ItemEditor", "There was an error packing the model."); + } + } + } + } else if(result == 1) { + JFileChooser fc11 = new JFileChooser(); + fc11.setFileSelectionMode(0); + int returnVal11 = fc11.showOpenDialog(this); + if(returnVal11 == 0) { + File file21 = fc11.getSelectedFile(); + + try { + var10001 = (new StringBuilder()).append("The model ID of the recently packed model is: "); + var10002 = this.is; + Main.log("ItemEditor", var10001.append(Utils.packCustomModel(ItemSelection.STORE, Utils.getBytesFromFile(new File(file21.getPath().toString())))).toString()); + } catch (IOException var11) { + Main.log("ItemEditor", "There was an error packing the model."); + } + } + } + + } + + public String getInventoryOpts() { + String text = ""; + String[] arr$ = this.defs.getInventoryOptions(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + String option = arr$[i$]; + text = text + (option == null?"null":option) + ";"; + } + + return text; + } + + public String getGroundOpts() { + String text = ""; + String[] arr$ = this.defs.getGroundOptions(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + String option = arr$[i$]; + text = text + (option == null?"null":option) + ";"; + } + + return text; + } + + public String getChangedModelColors() { + String text = ""; + if(this.defs.originalModelColors != null) { + for(int i = 0; i < this.defs.originalModelColors.length; ++i) { + text = text + this.defs.originalModelColors[i] + "=" + this.defs.modifiedModelColors[i] + ";"; + } + } + + return text; + } + + public String getChangedTextureColors() { + String text = ""; + if(this.defs.originalTextureColors != null) { + for(int i = 0; i < this.defs.originalTextureColors.length; ++i) { + text = text + this.defs.originalTextureColors[i] + "=" + this.defs.modifiedTextureColors[i] + ";"; + } + } + + return text; + } + + public String getStackIDs() { + String text = ""; + + try { + int[] e = this.defs.getStackIds(); + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getClientScripts() { + String text = ""; + String lineSep = System.getProperty("line.separator"); + if(this.defs.clientScriptData != null) { + for(Iterator i$ = this.defs.clientScriptData.keySet().iterator(); i$.hasNext(); text = text + lineSep) { + int key = ((Integer)i$.next()).intValue(); + Object value = this.defs.clientScriptData.get(Integer.valueOf(key)); + text = text + "KEY: " + key + ", VALUE: " + value; + } + } + + return text; + } + + public String getStackAmts() { + String text = ""; + + try { + int[] e = this.defs.getStackAmounts(); + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray1() { + String text = ""; + + try { + byte[] e = this.defs.unknownArray1; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + byte index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray2() { + String text = ""; + + try { + int[] e = this.defs.unknownArray2; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray3() { + String text = ""; + + try { + byte[] e = this.defs.unknownArray3; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + byte index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray4() { + String text = ""; + + try { + int[] e = this.defs.unknownArray4; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray5() { + String text = ""; + + try { + int[] e = this.defs.unknownArray5; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray6() { + String text = ""; + + try { + byte[] e = this.defs.unknownArray6; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + byte index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/item/ItemListDumper.java b/Tools/Frostys Cache Editor/src/com/editor/item/ItemListDumper.java new file mode 100644 index 000000000..fef7b593b --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/item/ItemListDumper.java @@ -0,0 +1,57 @@ +package com.editor.item; + +import com.alex.loaders.items.ItemDefinitions; +import com.alex.store.Store; +import com.alex.utils.Utils; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class ItemListDumper { + private static Store STORE; + + public static void main(String[] args) { + try { + STORE = new Store("C:/Users/Travis/Documents/rscd/data/"); + new ItemListDumper(); + } catch (IOException var2) { + var2.printStackTrace(); + } + + } + + public ItemListDumper() throws IOException { + File file = new File("C:/Users/Travis/Documents/781 ItemList.txt"); + if(file.exists()) { + file.delete(); + } else { + file.createNewFile(); + } + + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.append("//Version = 781\n"); + writer.flush(); + + for(int id = 0; id < Utils.getItemDefinitionsSize(STORE); ++id) { + ItemDefinitions def = ItemDefinitions.getItemDefinition(STORE, id); + if(!def.getName().equals("null")) { + writer.append(id + " - " + def.getName()); + writer.newLine(); + writer.flush(); + } + } + + writer.close(); + } + + public static int convertInt(String str) { + try { + int var2 = Integer.parseInt(str); + return var2; + } catch (NumberFormatException var21) { + return 0; + } + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/item/ItemSelection.java b/Tools/Frostys Cache Editor/src/com/editor/item/ItemSelection.java new file mode 100644 index 000000000..df50c82b8 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/item/ItemSelection.java @@ -0,0 +1,198 @@ +package com.editor.item; + +import com.alex.loaders.items.ItemDefinitions; +import com.alex.store.Store; +import com.alex.utils.Utils; +import com.editor.Main; +import com.editor.item.ItemEditor; + +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; + +public class ItemSelection extends JFrame { + private static final long serialVersionUID = -3059309913196024742L; + public static Store STORE; + private JButton addButton; + private JButton duplicateButton; + private JButton editButton; + private DefaultListModel itemsListmodel; + private JList itemsList; + private JMenu jMenu1; + private JMenuBar jMenuBar1; + private JMenuItem exitButton; + private JButton deleteButton; + + public ItemSelection(String cache) throws IOException { + STORE = new Store(cache); + this.setTitle("Item Selection"); + this.setResizable(false); + this.setDefaultCloseOperation(1); + this.setLocationRelativeTo((Component)null); + this.initComponents(); + } + + public ItemSelection() { + this.initComponents(); + } + + private void initComponents() { + this.editButton = new JButton(); + this.addButton = new JButton(); + this.duplicateButton = new JButton(); + this.deleteButton = new JButton(); + this.jMenuBar1 = new JMenuBar(); + this.jMenu1 = new JMenu(); + this.exitButton = new JMenuItem(); + this.setDefaultCloseOperation(1); + this.itemsListmodel = new DefaultListModel(); + this.itemsList = new JList(this.itemsListmodel); + this.itemsList.setSelectionMode(1); + this.itemsList.setLayoutOrientation(0); + this.itemsList.setVisibleRowCount(-1); + JScrollPane jScrollPane1 = new JScrollPane(this.itemsList); + this.editButton.setText("Edit"); + this.editButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ItemDefinitions defs = (ItemDefinitions)ItemSelection.this.itemsList.getSelectedValue(); + if(defs != null) { + new ItemEditor(ItemSelection.this, defs); + } + + } + }); + this.addButton.setText("Add New"); + this.addButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ItemDefinitions defs = new ItemDefinitions(ItemSelection.STORE, ItemSelection.this.getNewItemID(), false); + if(defs != null && defs.id != -1) { + new ItemEditor(ItemSelection.this, defs); + } + + } + }); + this.duplicateButton.setText("Duplicate"); + this.duplicateButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ItemDefinitions defs = (ItemDefinitions)ItemSelection.this.itemsList.getSelectedValue(); + if(defs != null) { + defs = (ItemDefinitions)defs.clone(); + if(defs != null) { + defs.id = ItemSelection.this.getNewItemID(); + if(defs.id != -1) { + new ItemEditor(ItemSelection.this, defs); + } + } + } + + } + }); + this.deleteButton.setText("Delete"); + this.deleteButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ItemDefinitions defs = (ItemDefinitions)ItemSelection.this.itemsList.getSelectedValue(); + JFrame frame = new JFrame(); + int result = JOptionPane.showConfirmDialog(frame, "Do you really want to delete item " + defs.id); + if(result == 0) { + if(defs == null) { + return; + } + + ItemSelection.STORE.getIndexes()[19].removeFile(defs.getArchiveId(), defs.getFileId()); + ItemSelection.this.removeItemDefs(defs); + Main.log("ItemSelection", "Item " + defs.id + " removed."); + } + + } + }); + this.jMenu1.setText("File"); + this.exitButton.setText("Close"); + this.exitButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ItemSelection.this.exitButtonActionPerformed(evt); + } + }); + this.jMenu1.add(this.exitButton); + this.jMenuBar1.add(this.jMenu1); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(Alignment.LEADING, false).addComponent(jScrollPane1, -2, 200, -2).addGroup(layout.createSequentialGroup().addComponent(this.editButton).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.addButton))).addGap(0, 0, 32767)).addGroup(layout.createSequentialGroup().addComponent(this.duplicateButton).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.deleteButton))).addContainerGap(-1, 32767))); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(jScrollPane1, -2, 279, -2).addPreferredGap(ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(this.editButton).addComponent(this.addButton)).addPreferredGap(ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(this.duplicateButton).addComponent(this.deleteButton)).addContainerGap(-1, 32767))); + this.pack(); + this.addAllItems(); + } + + public static void main(String[] args) throws IOException { + STORE = new Store("cache/", false); + EventQueue.invokeLater(new Runnable() { + public void run() { + (new ItemSelection()).setVisible(true); + } + }); + } + + private void exitButtonActionPerformed(ActionEvent evt) { + this.dispose(); + } + + public int getNewItemID() { + try { + JFrame var3 = new JFrame(); + String parent1 = JOptionPane.showInputDialog(var3, "Enter new Item ID:"); + return Integer.parseInt(parent1.toString()); + } catch (Exception var31) { + JFrame parent = new JFrame(); + JOptionPane.showMessageDialog(parent, "Please enter a valid integer!"); + Main.log("ItemSelection", "Non-valid character entered for new Item ID"); + return -1; + } + } + + public void addAllItems() { + int id; + if(Utils.getItemDefinitionsSize(STORE) > 30000) { + for(id = 0; id < Utils.getItemDefinitionsSize(STORE) - 22314; ++id) { + this.addItemDefs(ItemDefinitions.getItemDefinition(STORE, id)); + } + } else { + for(id = 0; id < Utils.getItemDefinitionsSize(STORE); ++id) { + this.addItemDefs(ItemDefinitions.getItemDefinition(STORE, id)); + } + } + + Main.log("ItemSelection", "All Items Loaded"); + } + + public void addItemDefs(final ItemDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + ItemSelection.this.itemsListmodel.addElement(defs); + } + }); + } + + public void updateItemDefs(final ItemDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + int index = ItemSelection.this.itemsListmodel.indexOf(defs); + if(index == -1) { + ItemSelection.this.itemsListmodel.addElement(defs); + } else { + ItemSelection.this.itemsListmodel.setElementAt(defs, index); + } + + } + }); + } + + public void removeItemDefs(final ItemDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + ItemSelection.this.itemsListmodel.removeElement(defs); + } + }); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/model/ModelDumper.java b/Tools/Frostys Cache Editor/src/com/editor/model/ModelDumper.java new file mode 100644 index 000000000..8232c05a0 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/model/ModelDumper.java @@ -0,0 +1,36 @@ +package com.editor.model; + +import com.alex.store.Index; +import com.alex.store.Store; + +import java.io.FileOutputStream; +import java.io.IOException; + +public class ModelDumper { + private static Store STORE; + + public static void main(String[] args) throws IOException { + try { + STORE = new Store("C:/Users/Travis/Documents/rscd/data/"); + } catch (Exception var4) { + ; + } + + Index index = STORE.getIndexes()[7]; + System.out.println(index.getLastArchiveId()); + + for(int i = 0; i < index.getLastArchiveId(); ++i) { + byte[] data = index.getFile(i); + if(data != null) { + writeFile(data, "C:/Users/Travis/Documents/781 Models/" + i + ".dat"); + } + } + + } + + public static void writeFile(byte[] data, String fileName) throws IOException { + FileOutputStream out = new FileOutputStream(fileName); + out.write(data); + out.close(); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/model/MultiModelPacker.java b/Tools/Frostys Cache Editor/src/com/editor/model/MultiModelPacker.java new file mode 100644 index 000000000..85eda8c90 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/model/MultiModelPacker.java @@ -0,0 +1,182 @@ +package com.editor.model; + +import com.alex.store.Store; +import com.editor.Main; +import com.editor.Utils; + +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager.LookAndFeelInfo; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class MultiModelPacker extends JFrame { + private static final long serialVersionUID = -1984870962939167633L; + private static Store STORE; + private JMenuItem exit; + private JLabel jLabel1; + private JLabel jLabel2; + private JMenu jMenu1; + private JMenuBar jMenuBar1; + private JMenuItem modelDir; + private JTextField modelDirField; + private JCheckBox sameId; + private JButton submit; + + public MultiModelPacker() { + this.initComponents(); + } + + public MultiModelPacker(String cache) { + try { + STORE = new Store(cache); + } catch (Exception var3) { + Main.log("MultiModelPacker", "Cannot find cache directory"); + } + + this.initComponents(); + this.setResizable(false); + this.setTitle("MultiModelPacker"); + this.setDefaultCloseOperation(1); + this.setLocationRelativeTo((Component)null); + this.setVisible(true); + } + + private void initComponents() { + this.jLabel1 = new JLabel(); + this.jLabel2 = new JLabel(); + this.modelDirField = new JTextField(); + this.sameId = new JCheckBox(); + this.submit = new JButton(); + this.jMenuBar1 = new JMenuBar(); + this.jMenu1 = new JMenu(); + this.modelDir = new JMenuItem(); + this.exit = new JMenuItem(); + this.setDefaultCloseOperation(3); + this.jLabel1.setText("Multiple Model Packer"); + this.jLabel2.setText("Models Directory"); + this.sameId.setText("Keep Same ID"); + this.sameId.setToolTipText("Keeps same ID as named"); + this.submit.setText("Submit"); + this.submit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + MultiModelPacker.this.submitActionPerformed(evt); + } + }); + this.jMenu1.setText("File"); + this.modelDir.setText("Choose Model Dir"); + this.modelDir.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + MultiModelPacker.this.modelDirActionPerformed(evt); + } + }); + this.jMenu1.add(this.modelDir); + this.exit.setText("Exit"); + this.exit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + MultiModelPacker.this.exitActionPerformed(evt); + } + }); + this.jMenu1.add(this.exit); + this.jMenuBar1.add(this.jMenu1); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(this.modelDirField).addContainerGap()).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addPreferredGap(ComponentPlacement.RELATED, 4, -2).addComponent(this.jLabel2)).addComponent(this.sameId))).addGroup(layout.createSequentialGroup().addGap(77, 77, 77).addComponent(this.jLabel1)).addGroup(layout.createSequentialGroup().addGap(101, 101, 101).addComponent(this.submit))).addGap(0, 76, 32767))); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(this.jLabel1).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.jLabel2).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.modelDirField, -2, -1, -2).addGap(18, 18, 18).addComponent(this.sameId).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.submit).addContainerGap(20, 32767))); + this.pack(); + } + + private void submitActionPerformed(ActionEvent evt) { + String directory = this.modelDirField.getText(); + boolean keepID = this.sameId.isSelected(); + String fileName; + if(keepID) { + fileName = ""; + String var12 = ""; + File var13 = new File(directory); + File[] var14 = var13.listFiles(); + + for(int var10 = 0; var10 < var14.length; ++var10) { + if(var14[var10].isFile()) { + System.out.println(var14[var10]); + fileName = var14[var10].getName(); + var12 = var14[var10].getName().replace(".dat", ""); + + try { + Main.log("MultiModelPacker", "The model ID of " + fileName + " is: " + Utils.packCustomModel(STORE, Utils.getBytesFromFile(var14[var10]), Integer.parseInt(var12))); + } catch (IOException var11) { + Main.log("MultiModelPacker", "There was an error packing the model."); + } + } + } + } else { + fileName = ""; + File var121 = new File(directory); + File[] var131 = var121.listFiles(); + + for(int var141 = 0; var141 < var131.length; ++var141) { + if(var131[var141].isFile()) { + fileName = var131[var141].getName(); + + try { + Main.log("MultiModelPacker", "The model ID of " + fileName + " is: " + Utils.packCustomModel(STORE, Utils.getBytesFromFile(var131[var141]))); + } catch (IOException var101) { + Main.log("MultiModelPacker", "There was an error packing the model."); + } + } + } + } + + } + + private void modelDirActionPerformed(ActionEvent evt) { + JFileChooser fc = new JFileChooser(); + fc.setFileSelectionMode(1); + if(evt.getSource() == this.modelDir) { + int returnVal = fc.showOpenDialog(this); + if(returnVal == 0) { + File file = fc.getSelectedFile(); + this.modelDirField.setText(file.getPath() + "/"); + } + } + + } + + private void exitActionPerformed(ActionEvent evt) { + this.dispose(); + } + + public static void main(String[] args) { + try { + LookAndFeelInfo[] var8 = UIManager.getInstalledLookAndFeels(); + int len$ = var8.length; + + for(int i$ = 0; i$ < len$; ++i$) { + LookAndFeelInfo info = var8[i$]; + if("Nimbus".equals(info.getName())) { + UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException var5) { + Logger.getLogger(MultiModelPacker.class.getName()).log(Level.SEVERE, (String)null, var5); + } catch (InstantiationException var6) { + Logger.getLogger(MultiModelPacker.class.getName()).log(Level.SEVERE, (String)null, var6); + } catch (IllegalAccessException var7) { + Logger.getLogger(MultiModelPacker.class.getName()).log(Level.SEVERE, (String)null, var7); + } catch (UnsupportedLookAndFeelException var81) { + Logger.getLogger(MultiModelPacker.class.getName()).log(Level.SEVERE, (String)null, var81); + } + + EventQueue.invokeLater(new Runnable() { + public void run() { + (new MultiModelPacker()).setVisible(true); + } + }); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/model/UniModelDumper.java b/Tools/Frostys Cache Editor/src/com/editor/model/UniModelDumper.java new file mode 100644 index 000000000..ce4b96b39 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/model/UniModelDumper.java @@ -0,0 +1,133 @@ +package com.editor.model; + +import com.alex.store.Index; +import com.alex.store.Store; +import com.editor.Main; + +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager.LookAndFeelInfo; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class UniModelDumper extends JFrame { + private static final long serialVersionUID = 433437706015594462L; + private static Store STORE; + private JMenu exit; + private JLabel jLabel1; + private JMenuBar jMenuBar1; + private JMenuItem jMenuItem1; + private JTextField modelID; + private JButton submit; + + public UniModelDumper() { + this.initComponents(); + } + + public UniModelDumper(String cache) { + try { + STORE = new Store(cache); + } catch (Exception var3) { + Main.log("UniModelDumper", "Cannot find cache directory"); + } + + this.initComponents(); + this.setResizable(false); + this.setTitle("UniModelDumper"); + this.setDefaultCloseOperation(1); + this.setLocationRelativeTo((Component)null); + this.setVisible(true); + } + + private void initComponents() { + this.jLabel1 = new JLabel(); + this.modelID = new JTextField(); + this.submit = new JButton(); + this.jMenuBar1 = new JMenuBar(); + this.exit = new JMenu(); + this.jMenuItem1 = new JMenuItem(); + this.setDefaultCloseOperation(3); + this.jLabel1.setText("Model ID To Dump:"); + this.submit.setText("Submit"); + this.submit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + UniModelDumper.this.submitActionPerformed(evt); + } + }); + this.exit.setText("File"); + this.exit.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + UniModelDumper.this.exitActionPerformed(evt); + } + }); + this.jMenuItem1.setText("Exit"); + this.exit.add(this.jMenuItem1); + this.jMenuBar1.add(this.exit); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(10, 10, 10).addComponent(this.modelID, -2, 100, -2)).addComponent(this.jLabel1))).addGroup(layout.createSequentialGroup().addGap(32, 32, 32).addComponent(this.submit))).addContainerGap(22, 32767))); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(this.jLabel1).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.modelID, -2, -1, -2).addGap(33, 33, 33).addComponent(this.submit).addContainerGap(20, 32767))); + this.pack(); + } + + private void exitActionPerformed(ActionEvent evt) { + this.dispose(); + } + + private void submitActionPerformed(ActionEvent evt) { + File f = new File(System.getProperty("user.home") + "/FCE/models/"); + f.mkdirs(); + Index index = STORE.getIndexes()[7]; + int modelId = Integer.parseInt(this.modelID.getText()); + + try { + byte[] var6 = index.getFile(modelId); + writeFile(var6, System.getProperty("user.home") + "/FCE/models/" + modelId + ".dat"); + Main.log("UniModelDumper", "Dumped Model ID: " + modelId + " to: " + System.getProperty("user.home") + "/FCE/models/" + modelId + ".dat"); + } catch (IOException var61) { + Main.log("UniModelDumper", "Cannot Dump Model"); + } + + } + + public static void writeFile(byte[] data, String fileName) throws IOException { + FileOutputStream out = new FileOutputStream(fileName); + out.write(data); + out.close(); + } + + public static void main(String[] args) { + try { + LookAndFeelInfo[] var8 = UIManager.getInstalledLookAndFeels(); + int len$ = var8.length; + + for(int i$ = 0; i$ < len$; ++i$) { + LookAndFeelInfo info = var8[i$]; + if("Nimbus".equals(info.getName())) { + UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (ClassNotFoundException var5) { + Logger.getLogger(UniModelDumper.class.getName()).log(Level.SEVERE, (String)null, var5); + } catch (InstantiationException var6) { + Logger.getLogger(UniModelDumper.class.getName()).log(Level.SEVERE, (String)null, var6); + } catch (IllegalAccessException var7) { + Logger.getLogger(UniModelDumper.class.getName()).log(Level.SEVERE, (String)null, var7); + } catch (UnsupportedLookAndFeelException var81) { + Logger.getLogger(UniModelDumper.class.getName()).log(Level.SEVERE, (String)null, var81); + } + + EventQueue.invokeLater(new Runnable() { + public void run() { + (new UniModelDumper()).setVisible(true); + } + }); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/npc/NPCDefDump.java b/Tools/Frostys Cache Editor/src/com/editor/npc/NPCDefDump.java new file mode 100644 index 000000000..7e868a72a --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/npc/NPCDefDump.java @@ -0,0 +1,361 @@ +package com.editor.npc; + +import com.alex.loaders.npcs.NPCDefinitions; +import com.alex.store.Store; +import com.alex.utils.Utils; +import com.editor.Main; + +import java.util.Iterator; + +public class NPCDefDump { + private static NPCDefinitions defs; + private static Store STORE; + + public static void main(String[] args) { + try { + STORE = new Store("C:/Users/Travis/Documents/rscd/data/"); + } catch (IOException var2) { + System.out.println("Cannot find cache location"); + } + + int id; + if(Utils.getNPCDefinitionsSize(STORE) > 30000) { + for(id = 0; id < Utils.getNPCDefinitionsSize(STORE) - 18433; ++id) { + defs = NPCDefinitions.getNPCDefinition(STORE, id); + dump(); + Main.log("NPCDefDump", "Dumping NPC " + defs.id); + } + } else { + for(id = 0; id < Utils.getNPCDefinitionsSize(STORE); ++id) { + defs = NPCDefinitions.getNPCDefinition(STORE, id); + dump(); + Main.log("NPCDefDump", "Dumping NPC " + defs.id); + } + } + + } + + public static void editorDump(String cache) { + try { + STORE = new Store(cache); + } catch (IOException var2) { + Main.log("NPCDefDump", "Cannot find cache location"); + } + + int id; + if(Utils.getNPCDefinitionsSize(STORE) > 30000) { + for(id = 0; id < Utils.getNPCDefinitionsSize(STORE) - 15615; ++id) { + defs = NPCDefinitions.getNPCDefinition(STORE, id); + dump(); + Main.log("NPCDefDump", "Dumping NPC " + defs.id); + } + } else { + for(id = 0; id < Utils.getNPCDefinitionsSize(STORE); ++id) { + defs = NPCDefinitions.getNPCDefinition(STORE, id); + dump(); + Main.log("NPCDefDump", "Dumping NPC " + defs.id); + } + } + + } + + private static void dump() { + File f = new File(System.getProperty("user.home") + "/FCE/npcs/"); + f.mkdirs(); + String lineSep = System.getProperty("line.separator"); + BufferedWriter writer = null; + + try { + writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(System.getProperty("user.home") + "/FCE/npcs/" + defs.id + ".txt"), "utf-8")); + writer.write("name = " + defs.getName()); + writer.write(lineSep); + writer.write("combat level = " + defs.getCombatLevel()); + writer.write(lineSep); + writer.write("isVisibleOnMap = " + defs.isVisibleOnMap); + writer.write(lineSep); + writer.write("height = " + defs.npcHeight); + writer.write(lineSep); + writer.write("width = " + defs.npcWidth); + writer.write(lineSep); + writer.write("walk mask = " + defs.walkMask); + writer.write(lineSep); + writer.write("respawn direction = " + defs.respawnDirection); + writer.write(lineSep); + writer.write("render emote = " + defs.renderEmote); + writer.write(lineSep); + writer.write("model ids = " + getModelIds()); + writer.write(lineSep); + writer.write("chat head model ids = " + getChatHeads()); + writer.write(lineSep); + writer.write("options = " + getOpts()); + writer.write(lineSep); + writer.write("model colors = " + getChangedModelColors()); + writer.write(lineSep); + writer.write("texture colors = " + getChangedTextureColors()); + writer.write(lineSep); + writer.write("unknown array1 = " + getUnknownArray1()); + writer.write(lineSep); + writer.write("unknown array2 = " + getUnknownArray2()); + writer.write(lineSep); + writer.write("unknown array3 = " + getUnknownArray3()); + writer.write(lineSep); + writer.write("unknown array4 = " + getUnknownArray4()); + writer.write(lineSep); + writer.write("unknown array5 = " + getUnknownArray5()); + writer.write(lineSep); + writer.write("unknownBoolean1 = " + defs.unknownBoolean1); + writer.write(lineSep); + writer.write("unknwonBoolean2 = " + defs.unknownBoolean2); + writer.write(lineSep); + writer.write("unknownBoolean3 = " + defs.unknownBoolean3); + writer.write(lineSep); + writer.write("unknownBoolean4 = " + defs.unknownBoolean5); + writer.write(lineSep); + writer.write("unknownBoolean5 = " + defs.unknownBoolean4); + writer.write(lineSep); + writer.write("unknownBoolean6 = " + defs.unknownBoolean6); + writer.write(lineSep); + writer.write("unknownBoolean7 = " + defs.unknownBoolean7); + writer.write(lineSep); + writer.write("unknown int1 = " + defs.unknownInt1); + writer.write(lineSep); + writer.write("unknown int2 = " + defs.unknownInt2); + writer.write(lineSep); + writer.write("unknown int3 = " + defs.unknownInt3); + writer.write(lineSep); + writer.write("unknown int4 = " + defs.unknownInt4); + writer.write(lineSep); + writer.write("unknown int5 = " + defs.unknownInt5); + writer.write(lineSep); + writer.write("unknown int6 = " + defs.unknownInt6); + writer.write(lineSep); + writer.write("unknown int7 = " + defs.unknownInt7); + writer.write(lineSep); + writer.write("unknown int8 = " + defs.unknownInt8); + writer.write(lineSep); + writer.write("unknown int9 = " + defs.unknownInt9); + writer.write(lineSep); + writer.write("unknown int10 = " + defs.unknownInt10); + writer.write(lineSep); + writer.write("unknown int11 = " + defs.unknownInt11); + writer.write(lineSep); + writer.write("unknown int12 = " + defs.unknownInt12); + writer.write(lineSep); + writer.write("unknown int13 = " + defs.unknownInt13); + writer.write(lineSep); + writer.write("unknown int14 = " + defs.unknownInt14); + writer.write(lineSep); + writer.write("unknown int15 = " + defs.unknownInt15); + writer.write(lineSep); + writer.write("unknown int16 = " + defs.unknownInt16); + writer.write(lineSep); + writer.write("unknown int17 = " + defs.unknownInt17); + writer.write(lineSep); + writer.write("unknown int18 = " + defs.unknownInt18); + writer.write(lineSep); + writer.write("unknown int19 = " + defs.unknownInt19); + writer.write(lineSep); + writer.write("unknown int20 = " + defs.unknownInt20); + writer.write(lineSep); + writer.write("unknown int21 = " + defs.unknownInt21); + writer.write(lineSep); + writer.write("Clientscripts"); + writer.write(lineSep); + if(defs.clientScriptData != null) { + Iterator var14 = defs.clientScriptData.keySet().iterator(); + + while(var14.hasNext()) { + int key = ((Integer)var14.next()).intValue(); + Object value = defs.clientScriptData.get(Integer.valueOf(key)); + writer.write("KEY: " + key + ", VALUE: " + value); + writer.write(lineSep); + } + } + } catch (IOException var141) { + Main.log("NPCDefDump", "Failed to export NPC Defs to .txt"); + } finally { + try { + writer.close(); + } catch (Exception var13) { + ; + } + + } + + } + + public static String getClientScripts() { + String text = ""; + String lineSep = System.getProperty("line.separator"); + if(defs.clientScriptData != null) { + for(Iterator i$ = defs.clientScriptData.keySet().iterator(); i$.hasNext(); text = text + lineSep) { + int key = ((Integer)i$.next()).intValue(); + Object value = defs.clientScriptData.get(Integer.valueOf(key)); + text = text + "KEY: " + key + ", VALUE: " + value; + } + } + + return text; + } + + public static String getModelIds() { + String text = ""; + + try { + int[] e = defs.modelIds; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getOpts() { + String text = ""; + String[] arr$ = defs.getOptions(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + String option = arr$[i$]; + text = text + (option == null?"null":option) + ";"; + } + + return text; + } + + public static String getChangedModelColors() { + String text = ""; + if(defs.originalModelColors != null) { + for(int i = 0; i < defs.originalModelColors.length; ++i) { + text = text + defs.originalModelColors[i] + "=" + defs.modifiedModelColors[i] + ";"; + } + } + + return text; + } + + public static String getChangedTextureColors() { + String text = ""; + if(defs.originalTextureColors != null) { + for(int i = 0; i < defs.originalTextureColors.length; ++i) { + text = text + defs.originalTextureColors[i] + "=" + defs.modifiedTextureColors[i] + ";"; + } + } + + return text; + } + + public static String getChatHeads() { + String text = ""; + + try { + int[] e = defs.npcChatHeads; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int id = e[i$]; + text = text + id + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray1() { + String text = ""; + + try { + byte[] e = defs.unknownArray1; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + byte index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray2() { + String text = ""; + + try { + int[] e = defs.unknownArray2; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray3() { + String text = ""; + + try { + int[] e = defs.unknownArray3[0]; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray4() { + String text = ""; + + try { + int[] e = defs.unknownArray4; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } + + public static String getUnknownArray5() { + String text = ""; + + try { + int[] e = defs.unknownArray5; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var5) { + ; + } + + return text; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/npc/NPCEditor.java b/Tools/Frostys Cache Editor/src/com/editor/npc/NPCEditor.java new file mode 100644 index 000000000..e5b443c83 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/npc/NPCEditor.java @@ -0,0 +1,1138 @@ +package com.editor.npc; + +import com.alex.loaders.npcs.NPCDefinitions; +import com.editor.Main; +import com.editor.Utils; +import com.editor.npc.NPCSelection; + +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Iterator; + +public class NPCEditor extends JFrame { + private static final long serialVersionUID = -8143046599523114860L; + private NPCDefinitions defs; + private NPCSelection ns; + private JMenuItem addModelButton; + private JTextArea clientScriptOutput; + private JTextField combatLevel; + private JTextField csk1; + private JTextField csk2; + private JTextField csk3; + private JTextField csk4; + private JTextField csk5; + private JTextField csk6; + private JTextField csv1; + private JTextField csv2; + private JTextField csv3; + private JTextField csv4; + private JTextField csv5; + private JTextField csv6; + private JMenuItem exitButton; + private JMenuItem exportButton; + private JLabel jLabel1; + private JLabel jLabel10; + private JLabel jLabel11; + private JLabel jLabel12; + private JLabel jLabel13; + private JLabel jLabel14; + private JLabel jLabel15; + private JLabel jLabel16; + private JLabel jLabel17; + private JLabel jLabel18; + private JLabel jLabel19; + private JLabel jLabel2; + private JLabel jLabel20; + private JLabel jLabel21; + private JLabel jLabel22; + private JLabel jLabel23; + private JLabel jLabel24; + private JLabel jLabel25; + private JLabel jLabel26; + private JLabel jLabel27; + private JLabel jLabel28; + private JLabel jLabel29; + private JLabel jLabel3; + private JLabel jLabel30; + private JLabel jLabel31; + private JLabel jLabel32; + private JLabel jLabel33; + private JLabel jLabel34; + private JLabel jLabel35; + private JLabel jLabel36; + private JLabel jLabel37; + private JLabel jLabel38; + private JLabel jLabel39; + private JLabel jLabel4; + private JLabel jLabel40; + private JLabel jLabel41; + private JLabel jLabel42; + private JLabel jLabel43; + private JLabel jLabel44; + private JLabel jLabel5; + private JLabel jLabel6; + private JLabel jLabel7; + private JLabel jLabel8; + private JLabel jLabel9; + private JMenu jMenu1; + private JMenuBar jMenuBar1; + private JPanel jPanel1; + private JPanel jPanel2; + private JPanel jPanel3; + private JPanel jPanel4; + private JPanel jPanel5; + private JScrollPane jScrollPane1; + private JTabbedPane jTabbedPane1; + private JTextField jTextField2; + private JTextField modelColorField; + private JTextField modelIds; + private JTextField name; + private JTextField npcHeight; + private JTextField npcSize; + private JTextField npcWidth; + private JTextField optionsField; + private JMenuItem reloadButton; + private JTextField renderEmote; + private JTextField respawnDirection; + private JMenuItem saveButton; + private JTextField textureColorField; + private JTextField unknownArray1; + private JTextField unknownArray2; + private JTextField unknownArray3; + private JTextField unknownArray4; + private JTextField unknownArray5; + private JCheckBox unknownBoolean1; + private JCheckBox unknownBoolean2; + private JCheckBox unknownBoolean3; + private JCheckBox unknownBoolean4; + private JCheckBox unknownBoolean5; + private JCheckBox unknownBoolean6; + private JCheckBox unknownBoolean7; + private JTextField unknownInt1; + private JTextField unknownInt10; + private JTextField unknownInt11; + private JTextField unknownInt12; + private JTextField unknownInt13; + private JTextField unknownInt14; + private JTextField unknownInt15; + private JTextField unknownInt16; + private JTextField unknownInt17; + private JTextField unknownInt18; + private JTextField unknownInt19; + private JTextField unknownInt2; + private JTextField unknownInt20; + private JTextField unknownInt21; + private JTextField unknownInt3; + private JTextField unknownInt4; + private JTextField unknownInt5; + private JTextField unknownInt6; + private JTextField unknownInt7; + private JTextField unknownInt8; + private JTextField unknownInt9; + private JCheckBox visibleOnMap; + private JTextField walkMask; + + public NPCEditor(NPCSelection ns, NPCDefinitions defs) { + this.defs = defs; + this.ns = ns; + this.initComponents(); + this.setResizable(false); + this.setTitle("NPC Editor"); + this.setDefaultCloseOperation(1); + this.setLocationRelativeTo((Component)null); + this.setVisible(true); + } + + public NPCEditor() { + this.initComponents(); + } + + private void initComponents() { + this.jTabbedPane1 = new JTabbedPane(); + this.jPanel1 = new JPanel(); + this.jLabel1 = new JLabel(); + this.name = new JTextField(); + this.jLabel4 = new JLabel(); + this.combatLevel = new JTextField(); + this.jLabel5 = new JLabel(); + this.npcSize = new JTextField(); + this.visibleOnMap = new JCheckBox(); + this.jLabel10 = new JLabel(); + this.npcHeight = new JTextField(); + this.jLabel11 = new JLabel(); + this.npcWidth = new JTextField(); + this.jLabel12 = new JLabel(); + this.walkMask = new JTextField(); + this.jLabel13 = new JLabel(); + this.respawnDirection = new JTextField(); + this.jLabel14 = new JLabel(); + this.renderEmote = new JTextField(); + this.jPanel2 = new JPanel(); + this.jLabel3 = new JLabel(); + this.modelIds = new JTextField(); + this.jLabel6 = new JLabel(); + this.jTextField2 = new JTextField(); + this.jPanel3 = new JPanel(); + this.jLabel7 = new JLabel(); + this.optionsField = new JTextField(); + this.jLabel8 = new JLabel(); + this.modelColorField = new JTextField(); + this.jLabel9 = new JLabel(); + this.textureColorField = new JTextField(); + this.jPanel4 = new JPanel(); + this.jLabel15 = new JLabel(); + this.unknownArray1 = new JTextField(); + this.jLabel16 = new JLabel(); + this.unknownArray2 = new JTextField(); + this.jLabel17 = new JLabel(); + this.unknownArray3 = new JTextField(); + this.jLabel18 = new JLabel(); + this.unknownArray4 = new JTextField(); + this.jLabel19 = new JLabel(); + this.unknownArray5 = new JTextField(); + this.unknownBoolean1 = new JCheckBox(); + this.unknownBoolean2 = new JCheckBox(); + this.unknownBoolean3 = new JCheckBox(); + this.unknownBoolean5 = new JCheckBox(); + this.unknownBoolean4 = new JCheckBox(); + this.unknownBoolean6 = new JCheckBox(); + this.unknownBoolean7 = new JCheckBox(); + this.jLabel20 = new JLabel(); + this.unknownInt1 = new JTextField(); + this.jLabel21 = new JLabel(); + this.unknownInt2 = new JTextField(); + this.jLabel22 = new JLabel(); + this.unknownInt3 = new JTextField(); + this.jLabel23 = new JLabel(); + this.unknownInt4 = new JTextField(); + this.jLabel24 = new JLabel(); + this.unknownInt5 = new JTextField(); + this.jLabel25 = new JLabel(); + this.unknownInt6 = new JTextField(); + this.jLabel26 = new JLabel(); + this.unknownInt7 = new JTextField(); + this.jLabel27 = new JLabel(); + this.unknownInt8 = new JTextField(); + this.jLabel28 = new JLabel(); + this.unknownInt9 = new JTextField(); + this.jLabel29 = new JLabel(); + this.unknownInt10 = new JTextField(); + this.jLabel30 = new JLabel(); + this.unknownInt11 = new JTextField(); + this.jLabel31 = new JLabel(); + this.unknownInt12 = new JTextField(); + this.jLabel32 = new JLabel(); + this.unknownInt13 = new JTextField(); + this.jLabel33 = new JLabel(); + this.unknownInt14 = new JTextField(); + this.jLabel34 = new JLabel(); + this.unknownInt15 = new JTextField(); + this.jLabel35 = new JLabel(); + this.unknownInt16 = new JTextField(); + this.jLabel36 = new JLabel(); + this.unknownInt17 = new JTextField(); + this.jLabel37 = new JLabel(); + this.unknownInt18 = new JTextField(); + this.jLabel38 = new JLabel(); + this.unknownInt19 = new JTextField(); + this.jLabel39 = new JLabel(); + this.unknownInt20 = new JTextField(); + this.jLabel40 = new JLabel(); + this.unknownInt21 = new JTextField(); + this.jPanel5 = new JPanel(); + this.jScrollPane1 = new JScrollPane(); + this.clientScriptOutput = new JTextArea(); + this.jLabel41 = new JLabel(); + this.jLabel42 = new JLabel(); + this.csk1 = new JTextField(); + this.csk2 = new JTextField(); + this.csk3 = new JTextField(); + this.csk4 = new JTextField(); + this.csk5 = new JTextField(); + this.csk6 = new JTextField(); + this.csv1 = new JTextField(); + this.csv2 = new JTextField(); + this.csv3 = new JTextField(); + this.csv4 = new JTextField(); + this.csv5 = new JTextField(); + this.csv6 = new JTextField(); + this.jLabel43 = new JLabel(); + this.jLabel44 = new JLabel(); + this.jLabel2 = new JLabel(); + this.jMenuBar1 = new JMenuBar(); + this.jMenu1 = new JMenu(); + this.reloadButton = new JMenuItem(); + this.saveButton = new JMenuItem(); + this.addModelButton = new JMenuItem(); + this.exportButton = new JMenuItem(); + this.exitButton = new JMenuItem(); + this.setDefaultCloseOperation(3); + this.jLabel1.setText("Name"); + this.name.setText(this.defs.getName()); + this.jLabel4.setText("Combat Level"); + this.combatLevel.setText("" + this.defs.getCombatLevel()); + this.jLabel5.setText("NPC Size"); + this.npcSize.setText("" + this.defs.getSize()); + this.visibleOnMap.setSelected(this.defs.isVisibleOnMap); + this.visibleOnMap.setText("Visible On Map"); + this.jLabel10.setText("NPC Height"); + this.npcHeight.setText("" + this.defs.npcHeight); + this.jLabel11.setText("NPC Width"); + this.npcWidth.setText("" + this.defs.npcWidth); + this.jLabel12.setText("Walk Mask"); + this.walkMask.setText("" + this.defs.walkMask); + this.jLabel13.setText("Respawn Direction"); + this.respawnDirection.setText("" + this.defs.respawnDirection); + this.jLabel14.setText("Render Animation"); + this.renderEmote.setText("" + this.defs.renderEmote); + GroupLayout jPanel1Layout = new GroupLayout(this.jPanel1); + this.jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.visibleOnMap).addGroup(jPanel1Layout.createParallelGroup(Alignment.TRAILING, false).addGroup(Alignment.LEADING, jPanel1Layout.createSequentialGroup().addComponent(this.jLabel1).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.name, -2, 100, -2)).addGroup(Alignment.LEADING, jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel4).addComponent(this.jLabel5)).addGap(18, 18, 18).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.npcSize, -2, 100, -2).addComponent(this.combatLevel, -2, 100, -2))).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel10).addComponent(this.jLabel11).addComponent(this.jLabel12)).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.npcHeight, -1, 100, 32767).addComponent(this.npcWidth).addComponent(this.walkMask)))).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel13).addComponent(this.jLabel14)).addPreferredGap(ComponentPlacement.UNRELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.respawnDirection, -1, 100, 32767).addComponent(this.renderEmote)))).addContainerGap(455, 32767))); + jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel1).addComponent(this.name, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel4).addComponent(this.combatLevel, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel5).addComponent(this.npcSize, -2, 20, -2)).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.visibleOnMap).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel10).addComponent(this.npcHeight, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel11).addComponent(this.npcWidth, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel12).addComponent(this.walkMask, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel13).addComponent(this.respawnDirection, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel14).addComponent(this.renderEmote, -2, -1, -2)).addContainerGap(134, 32767))); + this.jTabbedPane1.addTab("General", this.jPanel1); + this.jLabel3.setText("Model IDs"); + this.modelIds.setText(this.getModelIds()); + this.jLabel6.setText("Chat Heads"); + this.jTextField2.setText(this.getChatHeads()); + GroupLayout jPanel2Layout = new GroupLayout(this.jPanel2); + this.jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.jLabel3).addComponent(this.modelIds, -1, 275, 32767).addComponent(this.jLabel6).addComponent(this.jTextField2)).addContainerGap(379, 32767))); + jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addComponent(this.jLabel3).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.modelIds, -2, -1, -2).addGap(18, 18, 18).addComponent(this.jLabel6).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.jTextField2, -2, -1, -2).addContainerGap(259, 32767))); + this.jTabbedPane1.addTab("Model", this.jPanel2); + this.jLabel7.setText("Options"); + this.optionsField.setText(this.getOpts()); + this.jLabel8.setText("Model Colors"); + this.modelColorField.setText(this.getChangedModelColors()); + this.jLabel9.setText("Texture Colors"); + this.textureColorField.setText(this.getChangedTextureColors()); + GroupLayout jPanel3Layout = new GroupLayout(this.jPanel3); + this.jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup(jPanel3Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addContainerGap().addGroup(jPanel3Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.jLabel7).addComponent(this.optionsField, -1, 275, 32767).addComponent(this.jLabel8).addComponent(this.modelColorField).addComponent(this.jLabel9).addComponent(this.textureColorField)).addContainerGap(379, 32767))); + jPanel3Layout.setVerticalGroup(jPanel3Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addContainerGap().addComponent(this.jLabel7).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.optionsField, -2, -1, -2).addGap(18, 18, 18).addComponent(this.jLabel8).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.modelColorField, -2, -1, -2).addGap(18, 18, 18).addComponent(this.jLabel9).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.textureColorField, -2, -1, -2).addContainerGap(201, 32767))); + this.jTabbedPane1.addTab("Options", this.jPanel3); + this.jLabel15.setText("unknownArray1"); + this.unknownArray1.setText(this.getUnknownArray1()); + this.jLabel16.setText("unknownArray2"); + this.unknownArray2.setText(this.getUnknownArray2()); + this.jLabel17.setText("unknownArray3"); + this.unknownArray3.setText(this.getUnknownArray3()); + this.jLabel18.setText("unknownArray4"); + this.unknownArray4.setText(this.getUnknownArray4()); + this.jLabel19.setText("unknownArray5"); + this.unknownArray5.setText(this.getUnknownArray5()); + this.unknownBoolean1.setSelected(this.defs.unknownBoolean1); + this.unknownBoolean1.setText("unknownBoolean1"); + this.unknownBoolean2.setSelected(this.defs.unknownBoolean2); + this.unknownBoolean2.setText("unknownBoolean2"); + this.unknownBoolean3.setSelected(this.defs.unknownBoolean3); + this.unknownBoolean3.setText("unknownBoolean3"); + this.unknownBoolean5.setSelected(this.defs.unknownBoolean5); + this.unknownBoolean5.setText("unknownBoolean5"); + this.unknownBoolean4.setSelected(this.defs.unknownBoolean4); + this.unknownBoolean4.setText("unknownBoolean4"); + this.unknownBoolean6.setSelected(this.defs.unknownBoolean6); + this.unknownBoolean6.setText("unknownBoolean6"); + this.unknownBoolean7.setSelected(this.defs.unknownBoolean7); + this.unknownBoolean7.setText("unknownBoolean7"); + this.jLabel20.setText("unknownInt1"); + this.unknownInt1.setText("" + this.defs.unknownInt1); + this.jLabel21.setText("unknownInt2"); + this.unknownInt2.setText("" + this.defs.unknownInt2); + this.jLabel22.setText("unknownInt3"); + this.unknownInt3.setText("" + this.defs.unknownInt3); + this.jLabel23.setText("unknownInt4"); + this.unknownInt4.setText("" + this.defs.unknownInt4); + this.jLabel24.setText("unknownInt5"); + this.unknownInt5.setText("" + this.defs.unknownInt5); + this.jLabel25.setText("unknownInt6"); + this.unknownInt6.setText("" + this.defs.unknownInt6); + this.jLabel26.setText("unknownInt7"); + this.unknownInt7.setText("" + this.defs.unknownInt7); + this.jLabel27.setText("unknownInt8"); + this.unknownInt8.setText("" + this.defs.unknownInt8); + this.jLabel28.setText("unknownInt9"); + this.unknownInt9.setText("" + this.defs.unknownInt9); + this.jLabel29.setText("unknownInt10"); + this.unknownInt10.setText("" + this.defs.unknownInt10); + this.jLabel30.setText("unknownInt11"); + this.unknownInt11.setText("" + this.defs.unknownInt11); + this.jLabel31.setText("unknownInt12"); + this.unknownInt12.setText("" + this.defs.unknownInt12); + this.jLabel32.setText("unknownInt13"); + this.unknownInt13.setText("" + this.defs.unknownInt13); + this.jLabel33.setText("unknownInt14"); + this.unknownInt14.setText("" + this.defs.unknownInt14); + this.jLabel34.setText("unknownInt15"); + this.unknownInt15.setText("" + this.defs.unknownInt15); + this.jLabel35.setText("unknownInt16"); + this.unknownInt16.setText("" + this.defs.unknownInt16); + this.jLabel36.setText("unknownInt17"); + this.unknownInt17.setText("" + this.defs.unknownInt17); + this.jLabel37.setText("unknownInt18"); + this.unknownInt18.setText("" + this.defs.unknownInt18); + this.jLabel38.setText("unknownInt19"); + this.unknownInt19.setText("" + this.defs.unknownInt19); + this.jLabel39.setText("unknownInt20"); + this.unknownInt20.setText("" + this.defs.unknownInt20); + this.jLabel40.setText("unknownInt21"); + this.unknownInt21.setText("" + this.defs.unknownInt21); + GroupLayout jPanel4Layout = new GroupLayout(this.jPanel4); + this.jPanel4.setLayout(jPanel4Layout); + jPanel4Layout.setHorizontalGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addContainerGap().addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addComponent(this.unknownArray2, -2, 175, -2).addComponent(this.jLabel15).addComponent(this.unknownArray1, -2, 175, -2).addComponent(this.jLabel16).addComponent(this.jLabel17)).addGap(18, 18, 18).addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel20).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt1, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, 33, 32767).addComponent(this.jLabel32).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt13, -2, 100, -2)).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel21).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt2, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel33).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt14, -2, 100, -2)).addGroup(Alignment.TRAILING, jPanel4Layout.createSequentialGroup().addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addComponent(this.unknownBoolean5).addComponent(this.unknownBoolean6).addComponent(this.unknownBoolean7)).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel31).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt12, -2, 100, -2)).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel30).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt11, -2, 100, -2)).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel29).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt10, -2, 100, -2)))))).addGroup(jPanel4Layout.createSequentialGroup().addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addComponent(this.unknownArray3, -2, 175, -2).addComponent(this.jLabel18)).addGap(18, 18, 18).addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel23).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt4, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel35).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt16, -2, 100, -2)).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel22).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt3, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel34).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt15, -2, 100, -2)))).addGroup(jPanel4Layout.createSequentialGroup().addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addComponent(this.unknownBoolean4).addComponent(this.unknownBoolean3)).addGap(0, 0, 32767)).addGroup(jPanel4Layout.createSequentialGroup().addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addComponent(this.unknownArray4, -2, 175, -2).addComponent(this.jLabel19)).addGap(18, 18, 18).addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel25).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt6, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel37).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt18, -2, 100, -2)).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel24).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt5, -2, 100, -2).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel36).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt17, -2, 100, -2)))).addGroup(jPanel4Layout.createSequentialGroup().addGroup(jPanel4Layout.createParallelGroup(Alignment.TRAILING, false).addGroup(Alignment.LEADING, jPanel4Layout.createSequentialGroup().addComponent(this.unknownArray5, -2, 175, -2).addGap(18, 18, 18).addComponent(this.jLabel26).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt7, -2, 100, -2)).addGroup(jPanel4Layout.createSequentialGroup().addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.unknownBoolean1).addPreferredGap(ComponentPlacement.RELATED, -1, 32767)).addGroup(Alignment.TRAILING, jPanel4Layout.createSequentialGroup().addComponent(this.unknownBoolean2).addGap(80, 80, 80))).addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel28).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt9, -2, 100, -2)).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel27).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt8, -2, 100, -2))))).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(Alignment.TRAILING, jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel38).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt19, -2, 100, -2)).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel39).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt20, -2, 100, -2))).addGroup(Alignment.TRAILING, jPanel4Layout.createSequentialGroup().addComponent(this.jLabel40).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownInt21, -2, 100, -2))))).addGap(88, 88, 88))); + jPanel4Layout.setVerticalGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel4Layout.createSequentialGroup().addContainerGap().addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING, false).addGroup(jPanel4Layout.createSequentialGroup().addComponent(this.jLabel15).addGap(4, 4, 4).addComponent(this.unknownArray1, -2, -1, -2).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.jLabel16).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownArray2, -2, -1, -2)).addGroup(jPanel4Layout.createSequentialGroup().addGroup(jPanel4Layout.createParallelGroup(Alignment.TRAILING).addGroup(jPanel4Layout.createSequentialGroup().addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.unknownBoolean5).addComponent(this.jLabel29).addComponent(this.unknownInt10, -2, -1, -2)).addGap(22, 22, 22)).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.unknownBoolean6).addComponent(this.jLabel30).addComponent(this.unknownInt11, -2, -1, -2))).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.unknownBoolean7).addComponent(this.jLabel31).addComponent(this.unknownInt12, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel20).addComponent(this.unknownInt1, -2, -1, -2).addComponent(this.jLabel32).addComponent(this.unknownInt13, -2, -1, -2)))).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel17).addComponent(this.jLabel21).addComponent(this.unknownInt2, -2, -1, -2).addComponent(this.jLabel33).addComponent(this.unknownInt14, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.unknownArray3, -2, -1, -2).addComponent(this.jLabel22).addComponent(this.unknownInt3, -2, -1, -2).addComponent(this.jLabel34).addComponent(this.unknownInt15, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel18).addComponent(this.jLabel23).addComponent(this.unknownInt4, -2, -1, -2).addComponent(this.jLabel35).addComponent(this.unknownInt16, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.unknownArray4, -2, -1, -2).addComponent(this.jLabel24).addComponent(this.unknownInt5, -2, -1, -2).addComponent(this.jLabel36).addComponent(this.unknownInt17, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel4Layout.createParallelGroup(Alignment.LEADING).addComponent(this.unknownInt6, -2, 20, -2).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel19).addComponent(this.jLabel25).addComponent(this.jLabel37).addComponent(this.unknownInt18, -2, -1, -2))).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.unknownArray5, -2, -1, -2).addComponent(this.jLabel26).addComponent(this.unknownInt7, -2, -1, -2).addComponent(this.jLabel38).addComponent(this.unknownInt19, -2, -1, -2)).addPreferredGap(ComponentPlacement.UNRELATED).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.unknownBoolean1).addComponent(this.jLabel27).addComponent(this.unknownInt8, -2, -1, -2).addComponent(this.jLabel39).addComponent(this.unknownInt20, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel4Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.unknownBoolean2).addComponent(this.jLabel28).addComponent(this.unknownInt9, -2, -1, -2).addComponent(this.jLabel40).addComponent(this.unknownInt21, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownBoolean3).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unknownBoolean4).addContainerGap(-1, 32767))); + this.jTabbedPane1.addTab("Unknown Definitions", this.jPanel4); + this.clientScriptOutput.setColumns(20); + this.clientScriptOutput.setRows(5); + this.clientScriptOutput.setText(this.getClientScripts()); + this.jScrollPane1.setViewportView(this.clientScriptOutput); + this.jLabel41.setText("KEY"); + this.jLabel42.setText("VALUE"); + this.jLabel43.setText("Add keys into the boxes on the left to edit or add them."); + this.jLabel44.setText("Add values on the right to match the keys."); + GroupLayout jPanel5Layout = new GroupLayout(this.jPanel5); + this.jPanel5.setLayout(jPanel5Layout); + jPanel5Layout.setHorizontalGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel5Layout.createSequentialGroup().addContainerGap().addComponent(this.jScrollPane1, -2, 325, -2).addGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel5Layout.createSequentialGroup().addGap(72, 72, 72).addComponent(this.jLabel41).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel42).addGap(81, 81, 81)).addGroup(jPanel5Layout.createSequentialGroup().addGap(18, 18, 18).addGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel44).addComponent(this.jLabel43)).addContainerGap(43, 32767)).addGroup(jPanel5Layout.createSequentialGroup().addGap(53, 53, 53).addGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.csk4, Alignment.TRAILING).addComponent(this.csk5, Alignment.TRAILING).addComponent(this.csk6, Alignment.TRAILING).addComponent(this.csk1, -1, 80, 32767).addComponent(this.csk2).addComponent(this.csk3)).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.csv1, -2, 80, -2).addComponent(this.csv2, -1, 81, 32767).addComponent(this.csv3).addComponent(this.csv4).addComponent(this.csv5).addComponent(this.csv6)).addGap(0, 0, 32767))))); + jPanel5Layout.setVerticalGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel5Layout.createSequentialGroup().addContainerGap().addGroup(jPanel5Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel5Layout.createSequentialGroup().addComponent(this.jScrollPane1, -1, 346, 32767).addContainerGap()).addGroup(jPanel5Layout.createSequentialGroup().addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel41).addComponent(this.jLabel42)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk1, -2, -1, -2).addComponent(this.csv1, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk2, -2, -1, -2).addComponent(this.csv2, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk3, -2, -1, -2).addComponent(this.csv3, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk4, -2, -1, -2).addComponent(this.csv4, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk5, -2, -1, -2).addComponent(this.csv5, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel5Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.csk6, -2, -1, -2).addComponent(this.csv6, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.jLabel43).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.jLabel44).addGap(45, 45, 45))))); + this.jTabbedPane1.addTab("Clientscripts", this.jPanel5); + this.jLabel2.setText("Currently Viewing Definitions of NPC: " + this.defs.getId() + " - " + this.defs.getName()); + this.jMenu1.setText("File"); + this.reloadButton.setText("Reload"); + this.reloadButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + NPCEditor.this.reloadButtonActionPerformed(evt); + } + }); + this.jMenu1.add(this.reloadButton); + this.saveButton.setText("Save"); + this.saveButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + NPCEditor.this.saveButtonActionPerformed(evt); + } + }); + this.jMenu1.add(this.saveButton); + this.addModelButton.setText("Add Model"); + this.addModelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + NPCEditor.this.addModelButtonActionPerformed(evt); + } + }); + this.jMenu1.add(this.addModelButton); + this.exportButton.setText("Export to .txt"); + this.exportButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + NPCEditor.this.exportButtonActionPerformed(evt); + } + }); + this.jMenu1.add(this.exportButton); + this.exitButton.setText("Exit"); + this.exitButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + NPCEditor.this.exitButtonActionPerformed(evt); + } + }); + this.jMenu1.add(this.exitButton); + this.jMenuBar1.add(this.jMenu1); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(this.jTabbedPane1).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(this.jLabel2).addContainerGap(-1, 32767))); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(Alignment.TRAILING, layout.createSequentialGroup().addGap(0, 16, 32767).addComponent(this.jLabel2).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.jTabbedPane1, -2, 396, -2))); + this.pack(); + } + + private void reloadButtonActionPerformed(ActionEvent evt) { + this.reload(); + } + + private void saveButtonActionPerformed(ActionEvent evt) { + this.save(); + } + + private void addModelButtonActionPerformed(ActionEvent evt) { + this.addModel(); + } + + private void exportButtonActionPerformed(ActionEvent evt) { + this.export(); + } + + private void exitButtonActionPerformed(ActionEvent evt) { + this.dispose(); + } + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + (new NPCEditor()).setVisible(true); + } + }); + } + + private void reload() { + this.name.setText(this.defs.getName()); + this.combatLevel.setText("" + this.defs.getCombatLevel()); + this.visibleOnMap.setSelected(this.defs.isVisibleOnMap); + this.npcHeight.setText("" + this.defs.npcHeight); + this.npcWidth.setText("" + this.defs.npcWidth); + this.walkMask.setText("" + this.defs.walkMask); + this.respawnDirection.setText("" + this.defs.respawnDirection); + this.renderEmote.setText("" + this.defs.renderEmote); + this.modelIds.setText(this.getModelIds()); + this.jTextField2.setText(this.getChatHeads()); + this.optionsField.setText(this.getOpts()); + this.modelColorField.setText(this.getChangedModelColors()); + this.textureColorField.setText(this.getChangedTextureColors()); + this.unknownArray1.setText(this.getUnknownArray1()); + this.unknownArray2.setText(this.getUnknownArray2()); + this.unknownArray3.setText(this.getUnknownArray3()); + this.unknownArray4.setText(this.getUnknownArray4()); + this.unknownArray5.setText(this.getUnknownArray5()); + this.unknownBoolean1.setSelected(this.defs.unknownBoolean1); + this.unknownBoolean2.setSelected(this.defs.unknownBoolean2); + this.unknownBoolean3.setSelected(this.defs.unknownBoolean3); + this.unknownBoolean5.setSelected(this.defs.unknownBoolean5); + this.unknownBoolean4.setSelected(this.defs.unknownBoolean4); + this.unknownBoolean6.setSelected(this.defs.unknownBoolean6); + this.unknownBoolean7.setSelected(this.defs.unknownBoolean7); + this.unknownInt1.setText("" + this.defs.unknownInt1); + this.unknownInt2.setText("" + this.defs.unknownInt2); + this.unknownInt3.setText("" + this.defs.unknownInt3); + this.unknownInt4.setText("" + this.defs.unknownInt4); + this.unknownInt5.setText("" + this.defs.unknownInt5); + this.unknownInt6.setText("" + this.defs.unknownInt6); + this.unknownInt7.setText("" + this.defs.unknownInt7); + this.unknownInt8.setText("" + this.defs.unknownInt8); + this.unknownInt9.setText("" + this.defs.unknownInt9); + this.unknownInt10.setText("" + this.defs.unknownInt10); + this.unknownInt11.setText("" + this.defs.unknownInt11); + this.unknownInt12.setText("" + this.defs.unknownInt12); + this.unknownInt13.setText("" + this.defs.unknownInt13); + this.unknownInt14.setText("" + this.defs.unknownInt14); + this.unknownInt15.setText("" + this.defs.unknownInt15); + this.unknownInt16.setText("" + this.defs.unknownInt16); + this.unknownInt17.setText("" + this.defs.unknownInt17); + this.unknownInt18.setText("" + this.defs.unknownInt18); + this.unknownInt19.setText("" + this.defs.unknownInt19); + this.unknownInt20.setText("" + this.defs.unknownInt20); + this.unknownInt21.setText("" + this.defs.unknownInt21); + this.clientScriptOutput.setText(this.getClientScripts()); + } + + private void save() { + try { + this.defs.name = this.name.getText(); + this.defs.combatLevel = Integer.parseInt(this.combatLevel.getText()); + this.defs.isVisibleOnMap = this.visibleOnMap.isSelected(); + this.defs.npcHeight = Integer.parseInt(this.npcHeight.getText()); + this.defs.npcWidth = Integer.parseInt(this.npcWidth.getText()); + this.defs.walkMask = (byte)Integer.parseInt(this.walkMask.getText()); + this.defs.respawnDirection = (byte)Integer.parseInt(this.respawnDirection.getText()); + this.defs.renderEmote = Integer.parseInt(this.renderEmote.getText()); + String[] var15; + int e1; + if(!this.modelIds.getText().equals("")) { + var15 = this.modelIds.getText().split(";"); + + for(e1 = 0; e1 < this.defs.modelIds.length; ++e1) { + this.defs.modelIds[e1] = Integer.parseInt(var15[e1]); + } + } + + if(!this.jTextField2.getText().equals("")) { + var15 = this.jTextField2.getText().split(";"); + + for(e1 = 0; e1 < this.defs.npcChatHeads.length; ++e1) { + this.defs.npcChatHeads[e1] = Integer.parseInt(var15[e1]); + } + } + + var15 = this.optionsField.getText().split(";"); + + for(e1 = 0; e1 < this.defs.options.length; ++e1) { + this.defs.options[e1] = var15[e1].equals("null")?null:var15[e1]; + } + + this.defs.resetModelColors(); + String[] var17; + String[] i; + int len$; + int i$; + String t; + String[] editedColor; + if(!this.modelColorField.getText().equals("")) { + var17 = this.modelColorField.getText().split(";"); + i = var17; + len$ = var17.length; + + for(i$ = 0; i$ < len$; ++i$) { + t = i[i$]; + editedColor = t.split("="); + this.defs.changeModelColor(Integer.valueOf(editedColor[0]).intValue(), Integer.valueOf(editedColor[1]).intValue()); + } + } + + this.defs.resetTextureColors(); + if(!this.textureColorField.getText().equals("")) { + var17 = this.textureColorField.getText().split(";"); + i = var17; + len$ = var17.length; + + for(i$ = 0; i$ < len$; ++i$) { + t = i[i$]; + editedColor = t.split("="); + this.defs.changeTextureColor(Integer.valueOf(editedColor[0]).intValue(), Integer.valueOf(editedColor[1]).intValue()); + } + } + + int var16; + if(!this.unknownArray1.getText().equals("")) { + var17 = this.unknownArray1.getText().split(";"); + + for(var16 = 0; var16 < this.defs.unknownArray1.length; ++var16) { + this.defs.unknownArray1[var16] = (byte)Integer.parseInt(var17[var16]); + } + } + + if(!this.unknownArray2.getText().equals("")) { + var17 = this.unknownArray2.getText().split(";"); + + for(var16 = 0; var16 < this.defs.unknownArray2.length; ++var16) { + this.defs.unknownArray2[var16] = Integer.parseInt(var17[var16]); + } + } + + if(!this.unknownArray3.getText().equals("")) { + var17 = this.unknownArray3.getText().split(";"); + + for(var16 = 0; var16 < this.defs.unknownArray3.length; ++var16) { + this.defs.unknownArray3[0][var16] = Integer.parseInt(var17[var16]); + } + } + + if(!this.unknownArray4.getText().equals("")) { + var17 = this.unknownArray4.getText().split(";"); + + for(var16 = 0; var16 < this.defs.unknownArray4.length; ++var16) { + this.defs.unknownArray4[var16] = Integer.parseInt(var17[var16]); + } + } + + if(!this.unknownArray5.getText().equals("")) { + var17 = this.unknownArray5.getText().split(";"); + + for(var16 = 0; var16 < this.defs.unknownArray5.length; ++var16) { + this.defs.unknownArray5[var16] = Integer.parseInt(var17[var16]); + } + } + + this.defs.unknownBoolean1 = this.unknownBoolean1.isSelected(); + this.defs.unknownBoolean2 = this.unknownBoolean2.isSelected(); + this.defs.unknownBoolean3 = this.unknownBoolean3.isSelected(); + this.defs.unknownBoolean4 = this.unknownBoolean4.isSelected(); + this.defs.unknownBoolean5 = this.unknownBoolean5.isSelected(); + this.defs.unknownBoolean6 = this.unknownBoolean6.isSelected(); + this.defs.unknownBoolean7 = this.unknownBoolean7.isSelected(); + if(!this.unknownInt1.getText().equals("")) { + this.defs.unknownInt1 = Integer.parseInt(this.unknownInt1.getText()); + } + + if(!this.unknownInt2.getText().equals("")) { + this.defs.unknownInt2 = Integer.parseInt(this.unknownInt2.getText()); + } + + if(!this.unknownInt3.getText().equals("")) { + this.defs.unknownInt3 = Integer.parseInt(this.unknownInt3.getText()); + } + + if(!this.unknownInt4.getText().equals("")) { + this.defs.unknownInt4 = Integer.parseInt(this.unknownInt4.getText()); + } + + if(!this.unknownInt5.getText().equals("")) { + this.defs.unknownInt5 = Integer.parseInt(this.unknownInt5.getText()); + } + + if(!this.unknownInt6.getText().equals("")) { + this.defs.unknownInt6 = Integer.parseInt(this.unknownInt6.getText()); + } + + if(!this.unknownInt7.getText().equals("")) { + this.defs.unknownInt7 = Integer.parseInt(this.unknownInt7.getText()); + } + + if(!this.unknownInt8.getText().equals("")) { + this.defs.unknownInt8 = Integer.parseInt(this.unknownInt8.getText()); + } + + if(!this.unknownInt9.getText().equals("")) { + this.defs.unknownInt9 = Integer.parseInt(this.unknownInt9.getText()); + } + + if(!this.unknownInt10.getText().equals("")) { + this.defs.unknownInt10 = Integer.parseInt(this.unknownInt10.getText()); + } + + if(!this.unknownInt11.getText().equals("")) { + this.defs.unknownInt11 = Integer.parseInt(this.unknownInt11.getText()); + } + + if(!this.unknownInt12.getText().equals("")) { + this.defs.unknownInt12 = Integer.parseInt(this.unknownInt12.getText()); + } + + if(!this.unknownInt13.getText().equals("")) { + this.defs.unknownInt13 = Integer.parseInt(this.unknownInt13.getText()); + } + + if(!this.unknownInt14.getText().equals("")) { + this.defs.unknownInt14 = Integer.parseInt(this.unknownInt14.getText()); + } + + if(!this.unknownInt15.getText().equals("")) { + this.defs.unknownInt15 = Integer.parseInt(this.unknownInt15.getText()); + } + + if(!this.unknownInt16.getText().equals("")) { + this.defs.unknownInt16 = Integer.parseInt(this.unknownInt16.getText()); + } + + if(!this.unknownInt17.getText().equals("")) { + this.defs.unknownInt17 = Integer.parseInt(this.unknownInt17.getText()); + } + + if(!this.unknownInt18.getText().equals("")) { + this.defs.unknownInt18 = Integer.parseInt(this.unknownInt18.getText()); + } + + if(!this.unknownInt19.getText().equals("")) { + this.defs.unknownInt19 = Integer.parseInt(this.unknownInt19.getText()); + } + + if(!this.unknownInt20.getText().equals("")) { + this.defs.unknownInt20 = Integer.parseInt(this.unknownInt20.getText()); + } + + if(!this.unknownInt21.getText().equals("")) { + this.defs.unknownInt21 = Integer.parseInt(this.unknownInt21.getText()); + } + + try { + if(!this.csk1.getText().equals("") && !this.csv1.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk1); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk1.getText())), Integer.valueOf(Integer.parseInt(this.csv1.getText()))); + } catch (Exception var161) { + this.defs.clientScriptData.remove(this.csk1); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk1.getText())), this.csv1.getText().toString()); + } + } + + if(!this.csk2.getText().equals("") && !this.csv2.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk2); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk2.getText())), Integer.valueOf(Integer.parseInt(this.csv2.getText()))); + } catch (Exception var151) { + this.defs.clientScriptData.remove(this.csk2); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk2.getText())), this.csv2.getText().toString()); + } + } + + if(!this.csk3.getText().equals("") && !this.csv3.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk3); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk3.getText())), Integer.valueOf(Integer.parseInt(this.csv3.getText()))); + } catch (Exception var14) { + this.defs.clientScriptData.remove(this.csk3); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk3.getText())), this.csv3.getText().toString()); + } + } + + if(!this.csk4.getText().equals("") && !this.csv4.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk4); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk4.getText())), Integer.valueOf(Integer.parseInt(this.csv4.getText()))); + } catch (Exception var13) { + this.defs.clientScriptData.remove(this.csk4); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk4.getText())), this.csv4.getText().toString()); + } + } + + if(!this.csk5.getText().equals("") && !this.csv5.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk5); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk5.getText())), Integer.valueOf(Integer.parseInt(this.csv5.getText()))); + } catch (Exception var12) { + this.defs.clientScriptData.remove(this.csk5); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk5.getText())), this.csv5.getText().toString()); + } + } + + if(!this.csk6.getText().equals("") && !this.csv6.getText().equals("")) { + try { + this.defs.clientScriptData.remove(this.csk6); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk6.getText())), Integer.valueOf(Integer.parseInt(this.csv6.getText()))); + } catch (Exception var11) { + this.defs.clientScriptData.remove(this.csk6); + this.defs.clientScriptData.put(Integer.valueOf(Integer.parseInt(this.csk6.getText())), this.csv6.getText().toString()); + } + } + } catch (Exception var171) { + this.defs.clientScriptData = new HashMap(1); + } + + NPCSelection var10001 = this.ns; + this.defs.write(NPCSelection.STORE); + this.ns.updateNPCDefs(this.defs); + } catch (Exception var18) { + Main.log("NPCEditor", "Cannot save. Please check for mistypes."); + System.out.println(var18); + } + + } + + private void addModel() { + JFrame frame = new JFrame(); + int result = JOptionPane.showConfirmDialog(frame, "Do you want to specify a model ID?"); + StringBuilder var10001; + NPCSelection var10002; + if(result == 0) { + JFrame fc1 = new JFrame(); + String returnVal1 = JOptionPane.showInputDialog(fc1, "Enter new model ID:"); + if(Integer.parseInt(returnVal1.toString()) != -1) { + JFileChooser file2 = new JFileChooser(); + file2.setFileSelectionMode(0); + int var9 = file2.showOpenDialog(this); + if(var9 == 0) { + File file1 = file2.getSelectedFile(); + + try { + var10001 = (new StringBuilder()).append("The model ID of the recently packed model is: "); + var10002 = this.ns; + Main.log("NPCEditor", var10001.append(Utils.packCustomModel(NPCSelection.STORE, Utils.getBytesFromFile(new File(file1.getPath().toString())), Integer.parseInt(returnVal1.toString()))).toString()); + } catch (IOException var12) { + Main.log("NPCEditor", "There was an error packing the model."); + } + } + } + } else if(result == 1) { + JFileChooser fc11 = new JFileChooser(); + fc11.setFileSelectionMode(0); + int returnVal11 = fc11.showOpenDialog(this); + if(returnVal11 == 0) { + File file21 = fc11.getSelectedFile(); + + try { + var10001 = (new StringBuilder()).append("The model ID of the recently packed model is: "); + var10002 = this.ns; + Main.log("NPCEditor", var10001.append(Utils.packCustomModel(NPCSelection.STORE, Utils.getBytesFromFile(new File(file21.getPath().toString())))).toString()); + } catch (IOException var11) { + Main.log("NPCEditor", "There was an error packing the model."); + } + } + } + + } + + private void export() { + File f = new File(System.getProperty("user.home") + "/FCE/npcs/"); + f.mkdirs(); + String lineSep = System.getProperty("line.separator"); + BufferedWriter writer = null; + + try { + writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(System.getProperty("user.home") + "/FCE/npcs/" + this.defs.id + ".txt"), "utf-8")); + writer.write("name = " + this.defs.getName()); + writer.write(lineSep); + writer.write("combat level = " + this.defs.getCombatLevel()); + writer.write(lineSep); + writer.write("isVisibleOnMap = " + this.defs.isVisibleOnMap); + writer.write(lineSep); + writer.write("height = " + this.defs.npcHeight); + writer.write(lineSep); + writer.write("width = " + this.defs.npcWidth); + writer.write(lineSep); + writer.write("walk mask = " + this.defs.walkMask); + writer.write(lineSep); + writer.write("respawn direction = " + this.defs.respawnDirection); + writer.write(lineSep); + writer.write("render emote = " + this.defs.renderEmote); + writer.write(lineSep); + writer.write("model ids = " + this.getModelIds()); + writer.write(lineSep); + writer.write("chat head model ids = " + this.getChatHeads()); + writer.write(lineSep); + writer.write("options = " + this.getOpts()); + writer.write(lineSep); + writer.write("model colors = " + this.getChangedModelColors()); + writer.write(lineSep); + writer.write("texture colors = " + this.getChangedTextureColors()); + writer.write(lineSep); + writer.write("unknown array1 = " + this.getUnknownArray1()); + writer.write(lineSep); + writer.write("unknown array2 = " + this.getUnknownArray2()); + writer.write(lineSep); + writer.write("unknown array3 = " + this.getUnknownArray3()); + writer.write(lineSep); + writer.write("unknown array4 = " + this.getUnknownArray4()); + writer.write(lineSep); + writer.write("unknown array5 = " + this.getUnknownArray5()); + writer.write(lineSep); + writer.write("unknownBoolean1 = " + this.defs.unknownBoolean1); + writer.write(lineSep); + writer.write("unknwonBoolean2 = " + this.defs.unknownBoolean2); + writer.write(lineSep); + writer.write("unknownBoolean3 = " + this.defs.unknownBoolean3); + writer.write(lineSep); + writer.write("unknownBoolean4 = " + this.defs.unknownBoolean5); + writer.write(lineSep); + writer.write("unknownBoolean5 = " + this.defs.unknownBoolean4); + writer.write(lineSep); + writer.write("unknownBoolean6 = " + this.defs.unknownBoolean6); + writer.write(lineSep); + writer.write("unknownBoolean7 = " + this.defs.unknownBoolean7); + writer.write(lineSep); + writer.write("unknown int1 = " + this.defs.unknownInt1); + writer.write(lineSep); + writer.write("unknown int2 = " + this.defs.unknownInt2); + writer.write(lineSep); + writer.write("unknown int3 = " + this.defs.unknownInt3); + writer.write(lineSep); + writer.write("unknown int4 = " + this.defs.unknownInt4); + writer.write(lineSep); + writer.write("unknown int5 = " + this.defs.unknownInt5); + writer.write(lineSep); + writer.write("unknown int6 = " + this.defs.unknownInt6); + writer.write(lineSep); + writer.write("unknown int7 = " + this.defs.unknownInt7); + writer.write(lineSep); + writer.write("unknown int8 = " + this.defs.unknownInt8); + writer.write(lineSep); + writer.write("unknown int9 = " + this.defs.unknownInt9); + writer.write(lineSep); + writer.write("unknown int10 = " + this.defs.unknownInt10); + writer.write(lineSep); + writer.write("unknown int11 = " + this.defs.unknownInt11); + writer.write(lineSep); + writer.write("unknown int12 = " + this.defs.unknownInt12); + writer.write(lineSep); + writer.write("unknown int13 = " + this.defs.unknownInt13); + writer.write(lineSep); + writer.write("unknown int14 = " + this.defs.unknownInt14); + writer.write(lineSep); + writer.write("unknown int15 = " + this.defs.unknownInt15); + writer.write(lineSep); + writer.write("unknown int16 = " + this.defs.unknownInt16); + writer.write(lineSep); + writer.write("unknown int17 = " + this.defs.unknownInt17); + writer.write(lineSep); + writer.write("unknown int18 = " + this.defs.unknownInt18); + writer.write(lineSep); + writer.write("unknown int19 = " + this.defs.unknownInt19); + writer.write(lineSep); + writer.write("unknown int20 = " + this.defs.unknownInt20); + writer.write(lineSep); + writer.write("unknown int21 = " + this.defs.unknownInt21); + writer.write(lineSep); + writer.write("Clientscripts"); + writer.write(lineSep); + if(this.defs.clientScriptData != null) { + Iterator var15 = this.defs.clientScriptData.keySet().iterator(); + + while(var15.hasNext()) { + int key = ((Integer)var15.next()).intValue(); + Object value = this.defs.clientScriptData.get(Integer.valueOf(key)); + writer.write("KEY: " + key + ", VALUE: " + value); + writer.write(lineSep); + } + } + } catch (IOException var151) { + Main.log("NPCEditor", "Failed to export NPC Defs to .txt"); + } finally { + try { + writer.close(); + } catch (Exception var14) { + ; + } + + } + + } + + public String getClientScripts() { + String text = ""; + String lineSep = System.getProperty("line.separator"); + if(this.defs.clientScriptData != null) { + for(Iterator i$ = this.defs.clientScriptData.keySet().iterator(); i$.hasNext(); text = text + lineSep) { + int key = ((Integer)i$.next()).intValue(); + Object value = this.defs.clientScriptData.get(Integer.valueOf(key)); + text = text + "KEY: " + key + ", VALUE: " + value; + } + } + + return text; + } + + public String getModelIds() { + String text = ""; + + try { + int[] e = this.defs.modelIds; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getOpts() { + String text = ""; + String[] arr$ = this.defs.getOptions(); + int len$ = arr$.length; + + for(int i$ = 0; i$ < len$; ++i$) { + String option = arr$[i$]; + text = text + (option == null?"null":option) + ";"; + } + + return text; + } + + public String getChangedModelColors() { + String text = ""; + if(this.defs.originalModelColors != null) { + for(int i = 0; i < this.defs.originalModelColors.length; ++i) { + text = text + this.defs.originalModelColors[i] + "=" + this.defs.modifiedModelColors[i] + ";"; + } + } + + return text; + } + + public String getChangedTextureColors() { + String text = ""; + if(this.defs.originalTextureColors != null) { + for(int i = 0; i < this.defs.originalTextureColors.length; ++i) { + text = text + this.defs.originalTextureColors[i] + "=" + this.defs.modifiedTextureColors[i] + ";"; + } + } + + return text; + } + + public String getChatHeads() { + String text = ""; + + try { + int[] e = this.defs.npcChatHeads; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int id = e[i$]; + text = text + id + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray1() { + String text = ""; + + try { + byte[] e = this.defs.unknownArray1; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + byte index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray2() { + String text = ""; + + try { + int[] e = this.defs.unknownArray2; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray3() { + String text = ""; + + try { + int[] e = this.defs.unknownArray3[0]; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray4() { + String text = ""; + + try { + int[] e = this.defs.unknownArray4; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } + + public String getUnknownArray5() { + String text = ""; + + try { + int[] e = this.defs.unknownArray5; + int len$ = e.length; + + for(int i$ = 0; i$ < len$; ++i$) { + int index = e[i$]; + text = text + index + ";"; + } + } catch (Exception var6) { + ; + } + + return text; + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/npc/NPCListDumper.java b/Tools/Frostys Cache Editor/src/com/editor/npc/NPCListDumper.java new file mode 100644 index 000000000..f1dbc3a73 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/npc/NPCListDumper.java @@ -0,0 +1,38 @@ +package com.editor.npc; + +import com.alex.loaders.npcs.NPCDefinitions; +import com.alex.store.Store; +import com.alex.utils.Utils; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class NPCListDumper { + private static Store STORE; + + public static void main(String[] args) throws IOException { + STORE = new Store("C:/Users/Travis/Documents/rscd/data/"); + File file = new File("C:/Users/Travis/Documents/781 NPCList.txt"); + if(file.exists()) { + file.delete(); + } else { + file.createNewFile(); + } + + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.append("//Version = 781\n"); + writer.flush(); + + for(int id = 0; id < Utils.getNPCDefinitionsSize(STORE) - 18433; ++id) { + NPCDefinitions def = NPCDefinitions.getNPCDefinition(STORE, id); + writer.append(id + " - " + def.name); + writer.newLine(); + System.out.println(id + " - " + def.name); + writer.flush(); + } + + writer.close(); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/npc/NPCSelection.java b/Tools/Frostys Cache Editor/src/com/editor/npc/NPCSelection.java new file mode 100644 index 000000000..891cf0b1a --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/npc/NPCSelection.java @@ -0,0 +1,191 @@ +package com.editor.npc; + +import com.alex.loaders.npcs.NPCDefinitions; +import com.alex.store.Store; +import com.alex.utils.Utils; +import com.editor.Main; +import com.editor.npc.NPCEditor; + +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; + +public class NPCSelection extends JFrame { + private static final long serialVersionUID = -3068337441331467664L; + public static Store STORE; + private JButton addButton; + private JButton duplicateButton; + private JButton editButton; + private DefaultListModel npcsListmodel; + private JList npcsList; + private JMenu jMenu1; + private JMenuBar jMenuBar1; + private JMenuItem exitButton; + private JButton deleteButton; + + public NPCSelection(String cache) throws IOException { + STORE = new Store(cache); + this.setTitle("NPC Selection"); + this.setResizable(false); + this.setDefaultCloseOperation(1); + this.setLocationRelativeTo((Component)null); + this.initComponents(); + } + + public NPCSelection() { + this.initComponents(); + } + + private void initComponents() { + this.editButton = new JButton(); + this.addButton = new JButton(); + this.duplicateButton = new JButton(); + this.deleteButton = new JButton(); + this.jMenuBar1 = new JMenuBar(); + this.jMenu1 = new JMenu(); + this.exitButton = new JMenuItem(); + this.setDefaultCloseOperation(1); + this.npcsListmodel = new DefaultListModel(); + this.npcsList = new JList(this.npcsListmodel); + this.npcsList.setSelectionMode(1); + this.npcsList.setLayoutOrientation(0); + this.npcsList.setVisibleRowCount(-1); + JScrollPane jScrollPane1 = new JScrollPane(this.npcsList); + this.editButton.setText("Edit"); + this.editButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + NPCDefinitions defs = (NPCDefinitions)NPCSelection.this.npcsList.getSelectedValue(); + if(defs != null) { + new NPCEditor(NPCSelection.this, defs); + } + + } + }); + this.addButton.setText("Add New"); + this.addButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + NPCDefinitions defs = new NPCDefinitions(NPCSelection.STORE, NPCSelection.this.getNewNPCID(), false); + if(defs != null && defs.id != -1) { + new NPCEditor(NPCSelection.this, defs); + } + + } + }); + this.duplicateButton.setText("Duplicate"); + this.duplicateButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + NPCDefinitions defs = (NPCDefinitions)NPCSelection.this.npcsList.getSelectedValue(); + if(defs != null) { + defs = (NPCDefinitions)defs.clone(); + if(defs != null) { + defs.id = NPCSelection.this.getNewNPCID(); + if(defs.id != -1) { + new NPCEditor(NPCSelection.this, defs); + } + } + } + + } + }); + this.deleteButton.setText("Delete"); + this.deleteButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + NPCDefinitions defs = (NPCDefinitions)NPCSelection.this.npcsList.getSelectedValue(); + JFrame frame = new JFrame(); + int result = JOptionPane.showConfirmDialog(frame, "Do you really want to delete item " + defs.id); + if(result == 0) { + if(defs == null) { + return; + } + + NPCSelection.STORE.getIndexes()[19].removeFile(defs.getArchiveId(), defs.getFileId()); + NPCSelection.this.removeNPCDefs(defs); + Main.log("ItemSelection", "Item " + defs.id + " removed."); + } + + } + }); + this.jMenu1.setText("File"); + this.exitButton.setText("Close"); + this.exitButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + NPCSelection.this.exitButtonActionPerformed(evt); + } + }); + this.jMenu1.add(this.exitButton); + this.jMenuBar1.add(this.jMenu1); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(Alignment.LEADING, false).addComponent(jScrollPane1, -2, 200, -2).addGroup(layout.createSequentialGroup().addComponent(this.editButton).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.addButton))).addGap(0, 0, 32767)).addGroup(layout.createSequentialGroup().addComponent(this.duplicateButton).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.deleteButton))).addContainerGap(-1, 32767))); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(jScrollPane1, -2, 279, -2).addPreferredGap(ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(this.editButton).addComponent(this.addButton)).addPreferredGap(ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(this.duplicateButton).addComponent(this.deleteButton)).addContainerGap(-1, 32767))); + this.pack(); + this.addAllNPCs(); + } + + public static void main(String[] args) throws IOException { + STORE = new Store("cache/", false); + EventQueue.invokeLater(new Runnable() { + public void run() { + (new NPCSelection()).setVisible(true); + } + }); + } + + private void exitButtonActionPerformed(ActionEvent evt) { + this.dispose(); + } + + public int getNewNPCID() { + try { + JFrame var3 = new JFrame(); + String parent1 = JOptionPane.showInputDialog(var3, "Enter new NPC ID:"); + return Integer.parseInt(parent1.toString()); + } catch (Exception var31) { + JFrame parent = new JFrame(); + JOptionPane.showMessageDialog(parent, "Please enter a valid integer!"); + Main.log("NPCSelection", "Non-valid character entered for new NPC ID"); + return -1; + } + } + + public void addAllNPCs() { + for(int id = 0; id < Utils.getNPCDefinitionsSize(STORE)/* - 15615*/; ++id) { + this.addNPCDefs(NPCDefinitions.getNPCDefinition(STORE, id)); + } + + Main.log("NPCSelection", "All NPCs Loaded"); + } + + public void addNPCDefs(final NPCDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + NPCSelection.this.npcsListmodel.addElement(defs); + } + }); + } + + public void updateNPCDefs(final NPCDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + int index = NPCSelection.this.npcsListmodel.indexOf(defs); + if(index == -1) { + NPCSelection.this.npcsListmodel.addElement(defs); + } else { + NPCSelection.this.npcsListmodel.setElementAt(defs, index); + } + + } + }); + } + + public void removeNPCDefs(final NPCDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + NPCSelection.this.npcsListmodel.removeElement(defs); + } + }); + } +} diff --git a/Tools/Frostys Cache Editor/src/com/editor/object/ObjectEditor.java b/Tools/Frostys Cache Editor/src/com/editor/object/ObjectEditor.java new file mode 100644 index 000000000..e36524c5f --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/object/ObjectEditor.java @@ -0,0 +1,457 @@ +package com.editor.object; + +import com.alex.loaders.objects.ObjectDefinitions; +import com.editor.Main; +import com.editor.object.ObjectSelection; + +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ObjectEditor extends JFrame { + private ObjectDefinitions defs; + private ObjectSelection os; + private JTextField ModelOffset1; + private JTextField ModelRot2; + private JMenuItem addModelMenuBtn; + private JTextField array1; + private JTextField array2; + private JTextField array3; + private JTextField array4; + private JTextField array5; + private JTextField array6; + private JTextField csk1; + private JTextField csk2; + private JTextField csk3; + private JTextField csk4; + private JTextField csk5; + private JTextField csk6; + private JTextField csk7; + private JTextField csv1; + private JTextField csv2; + private JTextField csv3; + private JTextField csv4; + private JTextField csv5; + private JTextField csv6; + private JTextField csv7; + private JLabel currentViewLabel; + private JTextField equipSlot; + private JTextField equipType; + private JMenuItem exitMenuBtn; + private JMenuItem exportMenuBtn; + private JTextField femaleEquip1; + private JTextField femaleEquip2; + private JTextField femaleEquip3; + private JTextField groundOptions; + private JTextField int1; + private JTextField int10; + private JTextField int11; + private JTextField int12; + private JTextField int13; + private JTextField int14; + private JTextField int15; + private JTextField int16; + private JTextField int17; + private JTextField int18; + private JTextField int19; + private JTextField int2; + private JTextField int20; + private JTextField int21; + private JTextField int22; + private JTextField int23; + private JTextField int3; + private JTextField int4; + private JTextField int5; + private JTextField int6; + private JTextField int7; + private JTextField int8; + private JTextField int9; + private JTextField invModel; + private JTextField invModelZoom; + private JTextField invOptions; + private JTextField objectName; + private JLabel jLabel1; + private JLabel jLabel10; + private JLabel jLabel11; + private JLabel jLabel12; + private JLabel jLabel13; + private JLabel jLabel14; + private JLabel jLabel15; + private JLabel jLabel16; + private JLabel jLabel17; + private JLabel jLabel18; + private JLabel jLabel19; + private JLabel jLabel2; + private JLabel jLabel20; + private JLabel jLabel21; + private JLabel jLabel22; + private JLabel jLabel23; + private JLabel jLabel24; + private JLabel jLabel25; + private JLabel jLabel26; + private JLabel jLabel27; + private JLabel jLabel28; + private JLabel jLabel29; + private JLabel jLabel3; + private JLabel jLabel30; + private JLabel jLabel31; + private JLabel jLabel32; + private JLabel jLabel33; + private JLabel jLabel34; + private JLabel jLabel35; + private JLabel jLabel36; + private JLabel jLabel37; + private JLabel jLabel38; + private JLabel jLabel39; + private JLabel jLabel4; + private JLabel jLabel40; + private JLabel jLabel41; + private JLabel jLabel42; + private JLabel jLabel43; + private JLabel jLabel44; + private JLabel jLabel45; + private JLabel jLabel46; + private JLabel jLabel47; + private JLabel jLabel48; + private JLabel jLabel49; + private JLabel jLabel5; + private JLabel jLabel50; + private JLabel jLabel51; + private JLabel jLabel52; + private JLabel jLabel53; + private JLabel jLabel54; + private JLabel jLabel55; + private JLabel jLabel56; + private JLabel jLabel57; + private JLabel jLabel58; + private JLabel jLabel59; + private JLabel jLabel6; + private JLabel jLabel60; + private JLabel jLabel61; + private JLabel jLabel7; + private JLabel jLabel8; + private JLabel jLabel9; + private JMenu jMenu1; + private JMenuBar jMenuBar1; + private JPanel jPanel1; + private JPanel jPanel2; + private JPanel jPanel3; + private JPanel jPanel5; + private JPanel jPanel6; + private JPanel jPanel7; + private JScrollPane jScrollPane1; + private JTabbedPane jTabbedPane1; + private JTextField lend; + private JTextField maleEquip1; + private JTextField maleEquip2; + private JTextField maleEquip3; + private JCheckBox membersOnly; + private JTextField modelColors; + private JTextField modelOffset2; + private JTextField modelRot1; + private JTextField note; + private JMenuItem reloadMenuBtn; + private JMenuItem saveMenuBtn; + private JTextField stackAmts; + private JTextField stackIDs; + private JTextField stackable; + public JTextField switchLend; + public JTextField switchNote; + public JTextField sizeY; + public JTextField textureColors; + public JCheckBox unnoted; + public JTextField sizeX; + + + public ObjectEditor(ObjectSelection os, ObjectDefinitions defs) { + this.defs = defs; + this.os = os; + this.initComponents(); + this.setResizable(false); + this.setTitle("Object Editor"); + this.setDefaultCloseOperation(1); + this.setLocationRelativeTo((Component)null); + this.setVisible(true); + } + + private void initComponents() { + this.jTabbedPane1 = new JTabbedPane(); + this.jPanel1 = new JPanel(); + this.jLabel1 = new JLabel(); + this.objectName = new JTextField(); + this.jLabel2 = new JLabel(); + this.sizeX = new JTextField(); + this.sizeY = new JTextField(); + this.jLabel3 = new JLabel(); + this.membersOnly = new JCheckBox(); + this.jLabel20 = new JLabel(); + this.equipSlot = new JTextField(); + this.jLabel21 = new JLabel(); + this.equipType = new JTextField(); + this.jLabel22 = new JLabel(); + this.stackIDs = new JTextField(); + this.jLabel23 = new JLabel(); + this.stackAmts = new JTextField(); + this.jLabel24 = new JLabel(); + this.stackable = new JTextField(); + this.jLabel58 = new JLabel(); + this.switchNote = new JTextField(); + this.jLabel59 = new JLabel(); + this.note = new JTextField(); + this.unnoted = new JCheckBox(); + this.jLabel60 = new JLabel(); + this.jLabel61 = new JLabel(); + this.switchLend = new JTextField(); + this.lend = new JTextField(); + this.jPanel2 = new JPanel(); + this.jLabel4 = new JLabel(); + this.invModelZoom = new JTextField(); + this.jLabel5 = new JLabel(); + this.modelRot1 = new JTextField(); + this.jLabel6 = new JLabel(); + this.ModelRot2 = new JTextField(); + this.jLabel7 = new JLabel(); + this.ModelOffset1 = new JTextField(); + this.jLabel8 = new JLabel(); + this.modelOffset2 = new JTextField(); + this.jLabel9 = new JLabel(); + this.invModel = new JTextField(); + this.jLabel10 = new JLabel(); + this.maleEquip1 = new JTextField(); + this.jLabel11 = new JLabel(); + this.femaleEquip1 = new JTextField(); + this.jLabel12 = new JLabel(); + this.maleEquip2 = new JTextField(); + this.jLabel13 = new JLabel(); + this.femaleEquip2 = new JTextField(); + this.jLabel14 = new JLabel(); + this.maleEquip3 = new JTextField(); + this.jLabel15 = new JLabel(); + this.femaleEquip3 = new JTextField(); + this.jPanel3 = new JPanel(); + this.jLabel16 = new JLabel(); + this.invOptions = new JTextField(); + this.jLabel17 = new JLabel(); + this.groundOptions = new JTextField(); + this.jLabel18 = new JLabel(); + this.modelColors = new JTextField(); + this.jLabel19 = new JLabel(); + this.textureColors = new JTextField(); + this.jPanel5 = new JPanel(); + this.jLabel25 = new JLabel(); + this.array1 = new JTextField(); + this.jLabel27 = new JLabel(); + this.jLabel28 = new JLabel(); + this.jLabel29 = new JLabel(); + this.jLabel30 = new JLabel(); + this.jLabel31 = new JLabel(); + this.array2 = new JTextField(); + this.array3 = new JTextField(); + this.array4 = new JTextField(); + this.array5 = new JTextField(); + this.array6 = new JTextField(); + this.jLabel32 = new JLabel(); + this.int1 = new JTextField(); + this.int2 = new JTextField(); + this.jLabel33 = new JLabel(); + this.jLabel34 = new JLabel(); + this.int3 = new JTextField(); + this.jLabel35 = new JLabel(); + this.int4 = new JTextField(); + this.jLabel36 = new JLabel(); + this.int5 = new JTextField(); + this.jLabel37 = new JLabel(); + this.int6 = new JTextField(); + this.jLabel38 = new JLabel(); + this.int7 = new JTextField(); + this.jLabel39 = new JLabel(); + this.int8 = new JTextField(); + this.jLabel40 = new JLabel(); + this.int9 = new JTextField(); + this.jLabel41 = new JLabel(); + this.int10 = new JTextField(); + this.jLabel42 = new JLabel(); + this.int11 = new JTextField(); + this.jLabel43 = new JLabel(); + this.int12 = new JTextField(); + this.jLabel44 = new JLabel(); + this.int13 = new JTextField(); + this.jLabel45 = new JLabel(); + this.int14 = new JTextField(); + this.jPanel6 = new JPanel(); + this.jLabel46 = new JLabel(); + this.int15 = new JTextField(); + this.jLabel47 = new JLabel(); + this.int16 = new JTextField(); + this.jLabel48 = new JLabel(); + this.int17 = new JTextField(); + this.jLabel49 = new JLabel(); + this.int18 = new JTextField(); + this.jLabel50 = new JLabel(); + this.int19 = new JTextField(); + this.jLabel51 = new JLabel(); + this.int20 = new JTextField(); + this.jLabel52 = new JLabel(); + this.int21 = new JTextField(); + this.jLabel53 = new JLabel(); + this.int22 = new JTextField(); + this.jLabel54 = new JLabel(); + this.int23 = new JTextField(); + this.jPanel7 = new JPanel(); + this.jScrollPane1 = new JScrollPane(); + this.jLabel26 = new JLabel(); + this.jLabel55 = new JLabel(); + this.jLabel56 = new JLabel(); + this.jLabel57 = new JLabel(); + this.csk1 = new JTextField(); + this.csk2 = new JTextField(); + this.csk3 = new JTextField(); + this.csk4 = new JTextField(); + this.csk5 = new JTextField(); + this.csk6 = new JTextField(); + this.csk7 = new JTextField(); + this.csv1 = new JTextField(); + this.csv2 = new JTextField(); + this.csv3 = new JTextField(); + this.csv4 = new JTextField(); + this.csv5 = new JTextField(); + this.csv6 = new JTextField(); + this.csv7 = new JTextField(); + this.currentViewLabel = new JLabel(); + this.jMenuBar1 = new JMenuBar(); + this.jMenu1 = new JMenu(); + this.reloadMenuBtn = new JMenuItem(); + this.saveMenuBtn = new JMenuItem(); + this.addModelMenuBtn = new JMenuItem(); + this.exportMenuBtn = new JMenuItem(); + this.exitMenuBtn = new JMenuItem(); + this.setDefaultCloseOperation(3); + this.jLabel1.setText("Name"); + this.objectName.setText("" + this.defs.name); + this.jLabel2.setText("Size X"); + this.sizeX.setText("" + this.defs.sizeX); + this.sizeY.setText("" + this.defs.sizeY); + this.jLabel3.setText("Size Y"); + this.membersOnly.setSelected(true); + this.membersOnly.setText("Projectile Clipped"); + this.jLabel20.setText("Animation"); + this.equipSlot.setText(""); + this.jLabel21.setText("Equip Type"); + this.equipType.setText(""); + this.jLabel22.setText("ConfigFileID"); + this.stackIDs.setText(""); + this.jLabel23.setText("ConfigID"); + this.stackAmts.setText(""); + this.jLabel24.setText("Clip Type"); + this.stackable.setText(""); + this.jLabel58.setText("Switch Note Item ID"); + this.switchNote.setText(""); + this.jLabel59.setText("Noted Item ID"); + this.note.setText(""); + this.unnoted.setSelected(true); + this.unnoted.setText("Unnoted"); + this.jLabel60.setText("Switch Lend Item ID"); + this.jLabel61.setText("Lent Item ID"); + this.switchLend.setText(""); + this.lend.setText(""); + GroupLayout jPanel1Layout = new GroupLayout(this.jPanel1); + this.jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.unnoted).addComponent(this.membersOnly).addGroup(jPanel1Layout.createSequentialGroup().addComponent(this.jLabel20).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.equipSlot, -2, 100, -2)).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addComponent(this.jLabel1).addGap(18, 18, 18).addComponent(this.objectName, -2, 100, -2)).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel2).addComponent(this.jLabel3)).addGap(18, 18, 18).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.sizeY, -2, 100, -2).addComponent(this.sizeX, -2, 100, -2))).addGroup(jPanel1Layout.createSequentialGroup().addComponent(this.jLabel24).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.stackable, -2, 100, -2))).addGap(126, 126, 126).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.stackAmts, -2, 300, -2).addComponent(this.stackIDs, -2, 300, -2).addComponent(this.jLabel22).addComponent(this.jLabel23))).addGroup(jPanel1Layout.createSequentialGroup().addComponent(this.jLabel21).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.equipType, -2, 100, -2)).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel58).addComponent(this.jLabel59)).addPreferredGap(ComponentPlacement.UNRELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.switchNote, -1, 100, 32767).addComponent(this.note)).addGap(18, 18, 18).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel60).addComponent(this.jLabel61)).addPreferredGap(ComponentPlacement.UNRELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING, false).addComponent(this.switchLend, -1, 100, 32767).addComponent(this.lend)))).addContainerGap(36, 32767))); + jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel1).addComponent(this.objectName, -2, -1, -2).addComponent(this.jLabel22)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.sizeX, -2, -1, -2).addComponent(this.jLabel2)).addComponent(this.stackIDs, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.sizeY, -2, -1, -2).addComponent(this.jLabel3).addComponent(this.jLabel23)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.LEADING).addComponent(this.stackAmts, -2, -1, -2).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel24).addComponent(this.stackable, -2, -1, -2))).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.membersOnly).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel20).addComponent(this.equipSlot, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel21).addComponent(this.equipType, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel58).addComponent(this.switchNote, -2, -1, -2).addComponent(this.jLabel60).addComponent(this.switchLend, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel1Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel59).addComponent(this.note, -2, -1, -2).addComponent(this.jLabel61).addComponent(this.lend, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.unnoted).addContainerGap(13, 32767))); + this.jTabbedPane1.addTab("General", this.jPanel1); + this.jLabel4.setText("Inventory Model Zoom"); + this.invModelZoom.setText(""); + this.jLabel5.setText("Model Rotation 1"); + this.modelRot1.setText(""); + this.jLabel6.setText("Model Rotation 2"); + this.ModelRot2.setText(""); + this.jLabel7.setText("Model Offset 1"); + this.ModelOffset1.setText(""); + this.jLabel8.setText("Model Offset 2"); + this.modelOffset2.setText(""); + this.jLabel9.setText("Inventory Model"); + this.invModel.setText(""); + this.jLabel10.setText("Male Equip 1"); + this.maleEquip1.setText(""); + this.jLabel11.setText("Female Equip 1"); + this.femaleEquip1.setText(""); + this.jLabel12.setText("Male Equip 2"); + this.maleEquip2.setText(""); + this.jLabel13.setText("Female Equip 2"); + this.femaleEquip2.setText(""); + this.jLabel14.setText("Male Equip 3"); + this.maleEquip3.setText(""); + this.jLabel15.setText("Female Equip 3"); + this.femaleEquip3.setText(""); + GroupLayout jPanel2Layout = new GroupLayout(this.jPanel2); + this.jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING, false).addGroup(jPanel2Layout.createSequentialGroup().addComponent(this.jLabel7).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.ModelOffset1, -2, 100, -2)).addGroup(jPanel2Layout.createSequentialGroup().addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel4).addComponent(this.jLabel5).addComponent(this.jLabel6)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.ModelRot2, -2, 100, -2).addComponent(this.modelRot1, -2, 100, -2).addComponent(this.invModelZoom, -2, 100, -2))).addGroup(Alignment.TRAILING, jPanel2Layout.createSequentialGroup().addComponent(this.jLabel8).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.modelOffset2, -2, 100, -2))).addGap(114, 114, 114).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addComponent(this.jLabel15).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.femaleEquip3, -2, 100, -2)).addGroup(jPanel2Layout.createSequentialGroup().addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel9).addComponent(this.jLabel10)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.maleEquip1, -2, 100, -2).addComponent(this.invModel, -2, 100, -2))).addGroup(jPanel2Layout.createSequentialGroup().addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel11).addComponent(this.jLabel12)).addPreferredGap(ComponentPlacement.UNRELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.maleEquip2, -2, 100, -2).addComponent(this.femaleEquip1, -2, 100, -2))).addGroup(jPanel2Layout.createParallelGroup(Alignment.TRAILING, false).addGroup(jPanel2Layout.createSequentialGroup().addComponent(this.jLabel14).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.maleEquip3, -2, 100, -2)).addGroup(jPanel2Layout.createSequentialGroup().addComponent(this.jLabel13).addPreferredGap(ComponentPlacement.UNRELATED).addComponent(this.femaleEquip2, -2, 100, -2)))).addContainerGap(103, 32767))); + jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel4).addComponent(this.invModelZoom, -2, -1, -2).addComponent(this.jLabel9).addComponent(this.invModel, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel5).addComponent(this.modelRot1, -2, -1, -2).addComponent(this.jLabel10).addComponent(this.maleEquip1, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel6).addComponent(this.ModelRot2, -2, -1, -2).addComponent(this.jLabel11).addComponent(this.femaleEquip1, -2, -1, -2)).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addGap(9, 9, 9).addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel7).addComponent(this.ModelOffset1, -2, -1, -2).addComponent(this.jLabel12)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.TRAILING).addComponent(this.jLabel8).addComponent(this.modelOffset2, -2, -1, -2).addGroup(Alignment.LEADING, jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel13).addComponent(this.femaleEquip2, -2, -1, -2)))).addGroup(jPanel2Layout.createSequentialGroup().addPreferredGap(ComponentPlacement.RELATED).addComponent(this.maleEquip2, -2, -1, -2))).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE).addComponent(this.jLabel14).addComponent(this.maleEquip3, -2, -1, -2)).addPreferredGap(ComponentPlacement.RELATED).addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel15).addComponent(this.femaleEquip3, -2, -1, -2)).addContainerGap(82, 32767))); + this.jTabbedPane1.addTab("Model", this.jPanel2); + this.jLabel16.setText("Inventory Options"); + this.invOptions.setText("riggg"); + this.jLabel17.setText("Ground Options"); + this.groundOptions.setText("44"); + this.jLabel18.setText("Model Colors"); + this.modelColors.setText("1"); + this.jLabel19.setText("Texture Colors"); + this.textureColors.setText("2"); + GroupLayout jPanel3Layout = new GroupLayout(this.jPanel3); + this.jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup(jPanel3Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addContainerGap().addGroup(jPanel3Layout.createParallelGroup(Alignment.LEADING).addComponent(this.jLabel16).addComponent(this.invOptions, -2, 300, -2).addComponent(this.jLabel17).addComponent(this.groundOptions, -2, 300, -2).addComponent(this.jLabel18).addComponent(this.modelColors, -2, 300, -2).addComponent(this.jLabel19).addComponent(this.textureColors, -2, 300, -2)).addContainerGap(312, 32767))); + jPanel3Layout.setVerticalGroup(jPanel3Layout.createParallelGroup(Alignment.LEADING).addGroup(jPanel3Layout.createSequentialGroup().addContainerGap().addComponent(this.jLabel16).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.invOptions, -2, -1, -2).addGap(18, 18, 18).addComponent(this.jLabel17).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.groundOptions, -2, -1, -2).addGap(18, 18, 18).addComponent(this.jLabel18).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.modelColors, -2, -1, -2).addGap(18, 18, 18).addComponent(this.jLabel19).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.textureColors, -2, -1, -2).addContainerGap(47, 32767))); + this.jTabbedPane1.addTab("Options", this.jPanel3); + this.currentViewLabel.setText("Currently Viewing Definitions of Object: " + this.defs.id + " - " + defs.name); + this.jMenu1.setText("File"); + this.reloadMenuBtn.setText("Reload"); + this.reloadMenuBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ObjectEditor.this.reloadMenuBtnActionPerformed(evt); + } + }); + this.jMenu1.add(this.reloadMenuBtn); + this.saveMenuBtn.setText("Save"); + this.saveMenuBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ObjectEditor.this.saveMenuBtnActionPerformed(evt); + } + }); + this.jMenu1.add(this.saveMenuBtn); + this.exitMenuBtn.setText("Exit"); + this.exitMenuBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ObjectEditor.this.exitMenuBtnActionPerformed(evt); + } + }); + this.jMenu1.add(this.exitMenuBtn); + this.jMenuBar1.add(this.jMenu1); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addComponent(this.jTabbedPane1).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(this.currentViewLabel).addContainerGap(-1, 32767))); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(Alignment.TRAILING, layout.createSequentialGroup().addGap(0, 11, 32767).addComponent(this.currentViewLabel).addPreferredGap(ComponentPlacement.RELATED).addComponent(this.jTabbedPane1, -2, 300, -2))); + this.pack(); + } + + private void save() { + try { + this.defs.setName(this.objectName.getText().toString()); + } catch (Exception var201) { + Main.log("ObjectEditor", "Cannot save. Please check for mistypes."); + } + } + + private void saveMenuBtnActionPerformed(ActionEvent evt) { + this.save(); + } + + private void reloadMenuBtnActionPerformed(ActionEvent evt) { + this.objectName.setText(this.defs.getName()); + this.sizeX.setText("" + this.defs.sizeX); + } + + private void exitMenuBtnActionPerformed(ActionEvent evt) { + this.dispose(); + } + } diff --git a/Tools/Frostys Cache Editor/src/com/editor/object/ObjectSelection.java b/Tools/Frostys Cache Editor/src/com/editor/object/ObjectSelection.java new file mode 100644 index 000000000..fa6e92ec4 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/com/editor/object/ObjectSelection.java @@ -0,0 +1,205 @@ +package com.editor.object; + +import com.alex.loaders.objects.ObjectDefinitions; +import com.alex.store.Store; +import com.editor.Main; +import com.editor.object.ObjectEditor; + +import javax.swing.GroupLayout.Alignment; +import javax.swing.LayoutStyle.ComponentPlacement; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; + +public class ObjectSelection extends JFrame { + private static final long serialVersionUID = -3068337441331467664L; + public static Store STORE; + private JButton addButton; + private JButton duplicateButton; + private JButton editButton; + private DefaultListModel objectsListmodel; + private JList objectsList; + private JMenu jMenu1; + private JMenuBar jMenuBar1; + private JMenuItem exitButton; + private JButton deleteButton; + + public ObjectSelection(String cache) throws IOException { + STORE = new Store(cache); + this.setTitle("Object Selection"); + this.setResizable(false); + this.setDefaultCloseOperation(1); + this.setLocationRelativeTo((Component)null); + this.initComponents(); + } + + public ObjectSelection() { + this.initComponents(); + } + + private void initComponents() { + this.editButton = new JButton(); + this.addButton = new JButton(); + this.duplicateButton = new JButton(); + this.deleteButton = new JButton(); + this.jMenuBar1 = new JMenuBar(); + this.jMenu1 = new JMenu(); + this.exitButton = new JMenuItem(); + this.setDefaultCloseOperation(1); + this.objectsListmodel = new DefaultListModel(); + this.objectsList = new JList(this.objectsListmodel); + this.objectsList.setSelectionMode(1); + this.objectsList.setLayoutOrientation(0); + this.objectsList.setVisibleRowCount(-1); + JScrollPane jScrollPane1 = new JScrollPane(this.objectsList); + this.editButton.setText("Edit"); + this.editButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ObjectDefinitions defs = (ObjectDefinitions)ObjectSelection.this.objectsList.getSelectedValue(); + if(defs != null) { + new ObjectEditor(ObjectSelection.this, defs); + } + + } + }); + this.addButton.setText("Add New"); + this.addButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ObjectDefinitions defs = new ObjectDefinitions(ObjectSelection.STORE, ObjectSelection.this.getNewObjectID(), false); + if(defs != null && defs.id != -1) { + new ObjectEditor(ObjectSelection.this, defs); + } + + } + }); + this.duplicateButton.setText("Duplicate"); + this.duplicateButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ObjectDefinitions defs = (ObjectDefinitions)ObjectSelection.this.objectsList.getSelectedValue(); + if(defs != null) { + // defs = (ObjectDefinitions)defs.clone(); + if(defs != null) { + defs.id = ObjectSelection.this.getNewObjectID(); + if(defs.id != -1) { + new ObjectEditor(ObjectSelection.this, defs); + } + } + } + + } + }); + this.deleteButton.setText("Delete"); + this.deleteButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ObjectDefinitions defs = (ObjectDefinitions)ObjectSelection.this.objectsList.getSelectedValue(); + JFrame frame = new JFrame(); + int result = JOptionPane.showConfirmDialog(frame, "Do you really want to delete Object " + defs.id); + if(result == 0) { + if(defs == null) { + return; + } + + ObjectSelection.STORE.getIndexes()[19].removeFile(defs.getArchiveId(), defs.getFileId()); + ObjectSelection.this.removeObjectDefs(defs); + Main.log("ObjectSelection", "Object " + defs.id + " removed."); + } + + } + }); + this.jMenu1.setText("File"); + this.exitButton.setText("Close"); + this.exitButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + ObjectSelection.this.exitButtonActionPerformed(evt); + } + }); + this.jMenu1.add(this.exitButton); + this.jMenuBar1.add(this.jMenu1); + this.setJMenuBar(this.jMenuBar1); + GroupLayout layout = new GroupLayout(this.getContentPane()); + this.getContentPane().setLayout(layout); + layout.setHorizontalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addGroup(layout.createParallelGroup(Alignment.LEADING, false).addComponent(jScrollPane1, -2, 200, -2).addGroup(layout.createSequentialGroup().addComponent(this.editButton).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.addButton))).addGap(0, 0, 32767)).addGroup(layout.createSequentialGroup().addComponent(this.duplicateButton).addPreferredGap(ComponentPlacement.RELATED, -1, 32767).addComponent(this.deleteButton))).addContainerGap(-1, 32767))); + layout.setVerticalGroup(layout.createParallelGroup(Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(jScrollPane1, -2, 279, -2).addPreferredGap(ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(this.editButton).addComponent(this.addButton)).addPreferredGap(ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(Alignment.BASELINE).addComponent(this.duplicateButton).addComponent(this.deleteButton)).addContainerGap(-1, 32767))); + this.pack(); + this.addAllObjects(); + } + + public static void main(String[] args) throws IOException { + STORE = new Store("cache/", false); + EventQueue.invokeLater(new Runnable() { + public void run() { + (new ObjectSelection()).setVisible(true); + } + }); + } + + private void exitButtonActionPerformed(ActionEvent evt) { + this.dispose(); + } + + public int getNewObjectID() { + try { + JFrame var3 = new JFrame(); + String parent1 = JOptionPane.showInputDialog(var3, "Enter new Object ID:"); + return Integer.parseInt(parent1.toString()); + } catch (Exception var31) { + JFrame parent = new JFrame(); + JOptionPane.showMessageDialog(parent, "Please enter a valid integer!"); + Main.log("ObjectSelection", "Non-valid character entered for new Object ID"); + return -1; + } + } + + public void addAllObjects() { + for(int id = 36770; id < /*Utils.getObjectDefinitionsSize(STORE)*/36773; ++id) { + addObjectDefs(ObjectDefinitions.getObjectDefinition(STORE, id)); + } + + Main.log("ObjectSelection", "All Objects Loaded"); + } + + /*public void addAllObjects() { + int id; + if(Utils.getObjectDefinitionsSize(STORE) > 30000) { + for(id = 0; id < Utils.getObjectDefinitionsSize(STORE) - 22314; ++id) { + this.addObjectDefs(ObjectDefinitions.getObjectDefinition(STORE, id)); + } + } else { + for(id = 0; id < Utils.getObjectDefinitionsSize(STORE); ++id) { + this.addObjectDefs(ObjectDefinitions.getObjectDefinition(STORE, id)); + } + } + + Main.log("ObjectSelection", "All Objects Loaded"); + }*/ + + public void addObjectDefs(final ObjectDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + ObjectSelection.this.objectsListmodel.addElement(defs); + } + }); + } + + public void updateObjectDefs(final ObjectDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + int index = ObjectSelection.this.objectsListmodel.indexOf(defs); + if(index == -1) { + ObjectSelection.this.objectsListmodel.addElement(defs); + } else { + ObjectSelection.this.objectsListmodel.setElementAt(defs, index); + } + + } + }); + } + + public void removeObjectDefs(final ObjectDefinitions defs) { + EventQueue.invokeLater(new Runnable() { + public void run() { + ObjectSelection.this.objectsListmodel.removeElement(defs); + } + }); + } +} diff --git a/Tools/Frostys Cache Editor/src/org/apache/tools/bzip2/BZip2Constants.java b/Tools/Frostys Cache Editor/src/org/apache/tools/bzip2/BZip2Constants.java new file mode 100644 index 000000000..56f0e60c6 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/org/apache/tools/bzip2/BZip2Constants.java @@ -0,0 +1,15 @@ +package org.apache.tools.bzip2; + +public interface BZip2Constants { + int baseBlockSize = 100000; + int MAX_ALPHA_SIZE = 258; + int MAX_CODE_LEN = 23; + int RUNA = 0; + int RUNB = 1; + int N_GROUPS = 6; + int G_SIZE = 50; + int N_ITERS = 4; + int MAX_SELECTORS = 18002; + int NUM_OVERSHOOT_BYTES = 20; + int[] rNums = new int[]{619, 720, 127, 481, 931, 816, 813, 233, 566, 247, 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, 936, 638}; +} diff --git a/Tools/Frostys Cache Editor/src/org/apache/tools/bzip2/CBZip2OutputStream.java b/Tools/Frostys Cache Editor/src/org/apache/tools/bzip2/CBZip2OutputStream.java new file mode 100644 index 000000000..b56924d0c --- /dev/null +++ b/Tools/Frostys Cache Editor/src/org/apache/tools/bzip2/CBZip2OutputStream.java @@ -0,0 +1,1494 @@ +package org.apache.tools.bzip2; + +import org.apache.tools.bzip2.BZip2Constants; +import org.apache.tools.bzip2.CRC; + +import java.io.IOException; +import java.io.OutputStream; + +public class CBZip2OutputStream extends OutputStream implements BZip2Constants { + protected static final int SETMASK = 2097152; + protected static final int CLEARMASK = -2097153; + protected static final int GREATER_ICOST = 15; + protected static final int LESSER_ICOST = 0; + protected static final int SMALL_THRESH = 20; + protected static final int DEPTH_THRESH = 10; + protected static final int QSORT_STACK_SIZE = 1000; + int last; + int origPtr; + int blockSize100k; + boolean blockRandomised; + int bytesOut; + int bsBuff; + int bsLive; + CRC mCrc; + private boolean[] inUse; + private int nInUse; + private char[] seqToUnseq; + private char[] unseqToSeq; + private char[] selector; + private char[] selectorMtf; + private char[] block; + private int[] quadrant; + private int[] zptr; + private short[] szptr; + private int[] ftab; + private int nMTF; + private int[] mtfFreq; + private int workFactor; + private int workDone; + private int workLimit; + private boolean firstAttempt; + private int nBlocksRandomised; + private int currentChar; + private int runLength; + boolean closed; + private int blockCRC; + private int combinedCRC; + private int allowableBlockSize; + private OutputStream bsStream; + private int[] incs; + + private static void panic() { + System.out.println("panic"); + } + + private void makeMaps() { + this.nInUse = 0; + + for(int i = 0; i < 256; ++i) { + if(this.inUse[i]) { + this.seqToUnseq[this.nInUse] = (char)i; + this.unseqToSeq[i] = (char)this.nInUse; + ++this.nInUse; + } + } + + } + + protected static void hbMakeCodeLengths(char[] len, int[] freq, int alphaSize, int maxLen) { + int[] heap = new int[260]; + int[] weight = new int[516]; + int[] parent = new int[516]; + + int i; + for(i = 0; i < alphaSize; ++i) { + weight[i + 1] = (freq[i] == 0?1:freq[i]) << 8; + } + + while(true) { + int nNodes = alphaSize; + int nHeap = 0; + heap[0] = 0; + weight[0] = 0; + parent[0] = -2; + + int zz; + int tmp; + for(i = 1; i <= alphaSize; ++i) { + parent[i] = -1; + ++nHeap; + heap[nHeap] = i; + zz = nHeap; + + for(tmp = heap[nHeap]; weight[tmp] < weight[heap[zz >> 1]]; zz >>= 1) { + heap[zz] = heap[zz >> 1]; + } + + heap[zz] = tmp; + } + + if(nHeap >= 260) { + panic(); + } + + while(nHeap > 1) { + int tooLong = heap[1]; + heap[1] = heap[nHeap]; + --nHeap; + boolean j = false; + boolean k = false; + boolean tmp1 = false; + zz = 1; + int var20 = heap[zz]; + + while(true) { + tmp = zz << 1; + if(tmp > nHeap) { + break; + } + + if(tmp < nHeap && weight[heap[tmp + 1]] < weight[heap[tmp]]) { + ++tmp; + } + + if(weight[var20] < weight[heap[tmp]]) { + break; + } + + heap[zz] = heap[tmp]; + zz = tmp; + } + + heap[zz] = var20; + int n2 = heap[1]; + heap[1] = heap[nHeap]; + --nHeap; + j = false; + k = false; + tmp1 = false; + zz = 1; + var20 = heap[zz]; + + while(true) { + tmp = zz << 1; + if(tmp > nHeap) { + break; + } + + if(tmp < nHeap && weight[heap[tmp + 1]] < weight[heap[tmp]]) { + ++tmp; + } + + if(weight[var20] < weight[heap[tmp]]) { + break; + } + + heap[zz] = heap[tmp]; + zz = tmp; + } + + heap[zz] = var20; + ++nNodes; + parent[tooLong] = parent[n2] = nNodes; + weight[nNodes] = (weight[tooLong] & -256) + (weight[n2] & -256) | 1 + ((weight[tooLong] & 255) > (weight[n2] & 255)?weight[tooLong] & 255:weight[n2] & 255); + parent[nNodes] = -1; + ++nHeap; + heap[nHeap] = nNodes; + j = false; + k = false; + zz = nHeap; + + for(tmp = heap[nHeap]; weight[tmp] < weight[heap[zz >> 1]]; zz >>= 1) { + heap[zz] = heap[zz >> 1]; + } + + heap[zz] = tmp; + } + + if(nNodes >= 516) { + panic(); + } + + boolean var18 = false; + + int var19; + for(i = 1; i <= alphaSize; ++i) { + var19 = 0; + + for(int var201 = i; parent[var201] >= 0; ++var19) { + var201 = parent[var201]; + } + + len[i - 1] = (char)var19; + if(var19 > maxLen) { + var18 = true; + } + } + + if(!var18) { + return; + } + + for(i = 1; i < alphaSize; ++i) { + var19 = weight[i] >> 8; + var19 = 1 + var19 / 2; + weight[i] = var19 << 8; + } + } + } + + public CBZip2OutputStream(OutputStream inStream) throws IOException { + this(inStream, 9); + } + + public CBZip2OutputStream(OutputStream inStream, int inBlockSize) throws IOException { + this.mCrc = new CRC(); + this.inUse = new boolean[256]; + this.seqToUnseq = new char[256]; + this.unseqToSeq = new char[256]; + this.selector = new char[18002]; + this.selectorMtf = new char[18002]; + this.mtfFreq = new int[258]; + this.currentChar = -1; + this.runLength = 0; + this.closed = false; + this.incs = new int[]{1, 4, 13, 40, 121, 364, 1093, 3280, 9841, 29524, 88573, 265720, 797161, 2391484}; + this.block = null; + this.quadrant = null; + this.zptr = null; + this.ftab = null; + this.bsSetStream(inStream); + this.workFactor = 50; + if(inBlockSize > 9) { + inBlockSize = 9; + } + + if(inBlockSize < 1) { + inBlockSize = 1; + } + + this.blockSize100k = inBlockSize; + this.allocateCompressStructures(); + this.initialize(); + this.initBlock(); + } + + public void write(int bv) throws IOException { + int b = (256 + bv) % 256; + if(this.currentChar != -1) { + if(this.currentChar == b) { + ++this.runLength; + if(this.runLength > 254) { + this.writeRun(); + this.currentChar = -1; + this.runLength = 0; + } + } else { + this.writeRun(); + this.runLength = 1; + this.currentChar = b; + } + } else { + this.currentChar = b; + ++this.runLength; + } + + } + + private void writeRun() throws IOException { + if(this.last < this.allowableBlockSize) { + this.inUse[this.currentChar] = true; + + for(int i = 0; i < this.runLength; ++i) { + this.mCrc.updateCRC((char)this.currentChar); + } + + switch(this.runLength) { + case 1: + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + break; + case 2: + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + break; + case 3: + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + break; + default: + this.inUse[this.runLength - 4] = true; + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + ++this.last; + this.block[this.last + 1] = (char)this.currentChar; + ++this.last; + this.block[this.last + 1] = (char)(this.runLength - 4); + } + } else { + this.endBlock(); + this.initBlock(); + this.writeRun(); + } + + } + + protected void finalize() throws Throwable { + this.close(); + super.finalize(); + } + + public void close() throws IOException { + if(!this.closed) { + if(this.runLength > 0) { + this.writeRun(); + } + + this.currentChar = -1; + this.endBlock(); + this.endCompression(); + this.closed = true; + super.close(); + this.bsStream.close(); + } + + } + + public void flush() throws IOException { + super.flush(); + this.bsStream.flush(); + } + + private void initialize() throws IOException { + this.bytesOut = 0; + this.setnBlocksRandomised(0); + this.bsPutUChar(104); + this.bsPutUChar(48 + this.blockSize100k); + this.combinedCRC = 0; + } + + private void initBlock() { + this.mCrc.initialiseCRC(); + this.last = -1; + + for(int i = 0; i < 256; ++i) { + this.inUse[i] = false; + } + + this.allowableBlockSize = 100000 * this.blockSize100k - 20; + } + + private void endBlock() throws IOException { + this.blockCRC = this.mCrc.getFinalCRC(); + this.combinedCRC = this.combinedCRC << 1 | this.combinedCRC >>> 31; + this.combinedCRC ^= this.blockCRC; + this.doReversibleTransformation(); + this.bsPutUChar(49); + this.bsPutUChar(65); + this.bsPutUChar(89); + this.bsPutUChar(38); + this.bsPutUChar(83); + this.bsPutUChar(89); + this.bsPutint(this.blockCRC); + if(this.blockRandomised) { + this.bsW(1, 1); + this.setnBlocksRandomised(this.getnBlocksRandomised() + 1); + } else { + this.bsW(1, 0); + } + + this.moveToFrontCodeAndSend(); + } + + private void endCompression() throws IOException { + this.bsPutUChar(23); + this.bsPutUChar(114); + this.bsPutUChar(69); + this.bsPutUChar(56); + this.bsPutUChar(80); + this.bsPutUChar(144); + this.bsPutint(this.combinedCRC); + this.bsFinishedWithStream(); + } + + private void hbAssignCodes(int[] code, char[] length, int minLen, int maxLen, int alphaSize) { + int vec = 0; + + for(int n = minLen; n <= maxLen; ++n) { + for(int i = 0; i < alphaSize; ++i) { + if(length[i] == n) { + code[i] = vec++; + } + } + + vec <<= 1; + } + + } + + private void bsSetStream(OutputStream f) { + this.bsStream = f; + this.bsLive = 0; + this.bsBuff = 0; + this.bytesOut = 0; + } + + private void bsFinishedWithStream() throws IOException { + while(this.bsLive > 0) { + int ch = this.bsBuff >> 24; + + try { + this.bsStream.write(ch); + } catch (IOException var3) { + throw var3; + } + + this.bsBuff <<= 8; + this.bsLive -= 8; + ++this.bytesOut; + } + + } + + private void bsW(int n, int v) throws IOException { + while(this.bsLive >= 8) { + int ch = this.bsBuff >> 24; + + try { + this.bsStream.write(ch); + } catch (IOException var5) { + throw var5; + } + + this.bsBuff <<= 8; + this.bsLive -= 8; + ++this.bytesOut; + } + + this.bsBuff |= v << 32 - this.bsLive - n; + this.bsLive += n; + } + + private void bsPutUChar(int c) throws IOException { + this.bsW(8, c); + } + + private void bsPutint(int u) throws IOException { + this.bsW(8, u >> 24 & 255); + this.bsW(8, u >> 16 & 255); + this.bsW(8, u >> 8 & 255); + this.bsW(8, u & 255); + } + + private void bsPutIntVS(int numBits, int c) throws IOException { + this.bsW(numBits, c); + } + + private void sendMTFValues() throws IOException { + char[][] len = new char[6][258]; + int nSelectors = 0; + int alphaSize = this.nInUse + 2; + + int v; + int t; + for(t = 0; t < 6; ++t) { + for(v = 0; v < alphaSize; ++v) { + len[t][v] = 15; + } + } + + if(this.nMTF <= 0) { + panic(); + } + + byte nGroups; + if(this.nMTF < 200) { + nGroups = 2; + } else if(this.nMTF < 600) { + nGroups = 3; + } else if(this.nMTF < 1200) { + nGroups = 4; + } else if(this.nMTF < 2400) { + nGroups = 5; + } else { + nGroups = 6; + } + + int rfreq = nGroups; + int fave = this.nMTF; + + int gs; + int ge; + int code; + for(gs = 0; rfreq > 0; fave -= code) { + int var29 = fave / rfreq; + ge = gs - 1; + + for(code = 0; code < var29 && ge < alphaSize - 1; code += this.mtfFreq[ge]) { + ++ge; + } + + if(ge > gs && rfreq != nGroups && rfreq != 1 && (nGroups - rfreq) % 2 == 1) { + code -= this.mtfFreq[ge]; + --ge; + } + + for(v = 0; v < alphaSize; ++v) { + if(v >= gs && v <= ge) { + len[rfreq - 1][v] = 0; + } else { + len[rfreq - 1][v] = 15; + } + } + + --rfreq; + gs = ge + 1; + } + + int[][] var25 = new int[6][258]; + int[] var30 = new int[6]; + short[] var32 = new short[6]; + + int i; + int var291; + for(int var31 = 0; var31 < 4; ++var31) { + for(t = 0; t < nGroups; ++t) { + var30[t] = 0; + } + + for(t = 0; t < nGroups; ++t) { + for(v = 0; v < alphaSize; ++v) { + var25[t][v] = 0; + } + } + + nSelectors = 0; + int var33 = 0; + + for(gs = 0; gs < this.nMTF; gs = ge + 1) { + ge = gs + 50 - 1; + if(ge >= this.nMTF) { + ge = this.nMTF - 1; + } + + for(t = 0; t < nGroups; ++t) { + var32[t] = 0; + } + + short var37; + if(nGroups == 6) { + short j = 0; + short var39 = 0; + short var36 = 0; + short nBytes = 0; + short selCtr = 0; + var37 = 0; + + for(i = gs; i <= ge; ++i) { + short icv = this.szptr[i]; + var37 = (short)(var37 + len[0][icv]); + selCtr = (short)(selCtr + len[1][icv]); + nBytes = (short)(nBytes + len[2][icv]); + var36 = (short)(var36 + len[3][icv]); + var39 = (short)(var39 + len[4][icv]); + j = (short)(j + len[5][icv]); + } + + var32[0] = var37; + var32[1] = selCtr; + var32[2] = nBytes; + var32[3] = var36; + var32[4] = var39; + var32[5] = j; + } else { + for(i = gs; i <= ge; ++i) { + var37 = this.szptr[i]; + + for(t = 0; t < nGroups; ++t) { + var32[t] = (short)(var32[t] + len[t][var37]); + } + } + } + + var291 = 999999999; + int var301 = -1; + + for(t = 0; t < nGroups; ++t) { + if(var32[t] < var291) { + var291 = var32[t]; + var301 = t; + } + } + + var33 += var291; + ++var30[var301]; + this.selector[nSelectors] = (char)var301; + ++nSelectors; + + for(i = gs; i <= ge; ++i) { + ++var25[var301][this.szptr[i]]; + } + } + + for(t = 0; t < nGroups; ++t) { + hbMakeCodeLengths(len[t], var25[t], alphaSize, 20); + } + } + + var25 = (int[][])null; + Object var26 = null; + Object var27 = null; + if(nGroups >= 8) { + panic(); + } + + if(nSelectors >= 32768 || nSelectors > 18002) { + panic(); + } + + char[] var28 = new char[6]; + + for(i = 0; i < nGroups; ++i) { + var28[i] = (char)i; + } + + char var331; + char var34; + for(i = 0; i < nSelectors; ++i) { + char var311 = this.selector[i]; + var291 = 0; + + for(var34 = var28[var291]; var311 != var34; var28[var291] = var331) { + ++var291; + var331 = var34; + var34 = var28[var291]; + } + + var28[0] = var34; + this.selectorMtf[i] = (char)var291; + } + + int[][] var321 = new int[6][258]; + + for(t = 0; t < nGroups; ++t) { + var331 = 32; + var34 = 0; + + for(i = 0; i < alphaSize; ++i) { + if(len[t][i] > var34) { + var34 = len[t][i]; + } + + if(len[t][i] < var331) { + var331 = len[t][i]; + } + } + + if(var34 > 20) { + panic(); + } + + if(var331 < 1) { + panic(); + } + + this.hbAssignCodes(var321[t], len[t], var331, var34, alphaSize); + } + + boolean[] var35 = new boolean[16]; + + for(i = 0; i < 16; ++i) { + var35[i] = false; + + for(var291 = 0; var291 < 16; ++var291) { + if(this.inUse[i * 16 + var291]) { + var35[i] = true; + } + } + } + + int var371 = this.bytesOut; + + for(i = 0; i < 16; ++i) { + if(var35[i]) { + this.bsW(1, 1); + } else { + this.bsW(1, 0); + } + } + + for(i = 0; i < 16; ++i) { + if(var35[i]) { + for(var291 = 0; var291 < 16; ++var291) { + if(this.inUse[i * 16 + var291]) { + this.bsW(1, 1); + } else { + this.bsW(1, 0); + } + } + } + } + + var371 = this.bytesOut; + this.bsW(3, nGroups); + this.bsW(15, nSelectors); + + for(i = 0; i < nSelectors; ++i) { + for(var291 = 0; var291 < this.selectorMtf[i]; ++var291) { + this.bsW(1, 1); + } + + this.bsW(1, 0); + } + + var371 = this.bytesOut; + + int var361; + for(t = 0; t < nGroups; ++t) { + var361 = len[t][0]; + this.bsW(5, var361); + + for(i = 0; i < alphaSize; ++i) { + while(var361 < len[t][i]) { + this.bsW(2, 2); + ++var361; + } + + while(var361 > len[t][i]) { + this.bsW(2, 3); + --var361; + } + + this.bsW(1, 0); + } + } + + var371 = this.bytesOut; + var361 = 0; + + for(gs = 0; gs < this.nMTF; ++var361) { + ge = gs + 50 - 1; + if(ge >= this.nMTF) { + ge = this.nMTF - 1; + } + + for(i = gs; i <= ge; ++i) { + this.bsW(len[this.selector[var361]][this.szptr[i]], var321[this.selector[var361]][this.szptr[i]]); + } + + gs = ge + 1; + } + + if(var361 != nSelectors) { + panic(); + } + + } + + private void moveToFrontCodeAndSend() throws IOException { + this.bsPutIntVS(24, this.origPtr); + this.generateMTFValues(); + this.sendMTFValues(); + } + + private void simpleSort(int lo, int hi, int d) { + int bigN = hi - lo + 1; + if(bigN >= 2) { + int hp; + for(hp = 0; this.incs[hp] < bigN; ++hp) { + ; + } + + --hp; + + for(; hp >= 0; --hp) { + int h = this.incs[hp]; + int i = lo + h; + + while(i <= hi) { + int v = this.zptr[i]; + int j = i; + + while(this.fullGtU(this.zptr[j - h] + d, v + d)) { + this.zptr[j] = this.zptr[j - h]; + j -= h; + if(j <= lo + h - 1) { + break; + } + } + + this.zptr[j] = v; + ++i; + if(i > hi) { + break; + } + + v = this.zptr[i]; + j = i; + + while(this.fullGtU(this.zptr[j - h] + d, v + d)) { + this.zptr[j] = this.zptr[j - h]; + j -= h; + if(j <= lo + h - 1) { + break; + } + } + + this.zptr[j] = v; + ++i; + if(i > hi) { + break; + } + + v = this.zptr[i]; + j = i; + + while(this.fullGtU(this.zptr[j - h] + d, v + d)) { + this.zptr[j] = this.zptr[j - h]; + j -= h; + if(j <= lo + h - 1) { + break; + } + } + + this.zptr[j] = v; + ++i; + if(this.workDone > this.workLimit && this.firstAttempt) { + return; + } + } + } + } + + } + + private void vswap(int p1, int p2, int n) { + for(boolean temp = false; n > 0; --n) { + int var5 = this.zptr[p1]; + this.zptr[p1] = this.zptr[p2]; + this.zptr[p2] = var5; + ++p1; + ++p2; + } + + } + + private char med3(char a, char b, char c) { + if(a > b) { + char t = a; + a = b; + b = t; + } + + if(b > c) { + b = c; + } + + if(a > b) { + b = a; + } + + return b; + } + + private void qSort3(int loSt, int hiSt, int dSt) { + CBZip2OutputStream.StackElem[] stack = new CBZip2OutputStream.StackElem[1000]; + + int temp; + for(temp = 0; temp < 1000; ++temp) { + stack[temp] = new CBZip2OutputStream.StackElem((CBZip2OutputStream.StackElem)null); + } + + byte sp = 0; + stack[sp].ll = loSt; + stack[sp].hh = hiSt; + stack[sp].dd = dSt; + int var17 = sp + 1; + + while(true) { + label55: + while(var17 > 0) { + if(var17 >= 1000) { + panic(); + } + + --var17; + int lo = stack[var17].ll; + int hi = stack[var17].hh; + int d = stack[var17].dd; + if(hi - lo >= 20 && d <= 10) { + char med = this.med3(this.block[this.zptr[lo] + d + 1], this.block[this.zptr[hi] + d + 1], this.block[this.zptr[lo + hi >> 1] + d + 1]); + int ltLo = lo; + int unLo = lo; + int gtHi = hi; + int unHi = hi; + + while(true) { + while(true) { + int n; + boolean var18; + if(unLo <= unHi) { + n = this.block[this.zptr[unLo] + d + 1] - med; + if(n == 0) { + var18 = false; + temp = this.zptr[unLo]; + this.zptr[unLo] = this.zptr[ltLo]; + this.zptr[ltLo] = temp; + ++ltLo; + ++unLo; + continue; + } + + if(n <= 0) { + ++unLo; + continue; + } + } + + while(unLo <= unHi) { + n = this.block[this.zptr[unHi] + d + 1] - med; + if(n == 0) { + var18 = false; + temp = this.zptr[unHi]; + this.zptr[unHi] = this.zptr[gtHi]; + this.zptr[gtHi] = temp; + --gtHi; + --unHi; + } else { + if(n < 0) { + break; + } + + --unHi; + } + } + + if(unLo > unHi) { + if(gtHi < ltLo) { + stack[var17].ll = lo; + stack[var17].hh = hi; + stack[var17].dd = d + 1; + ++var17; + } else { + n = ltLo - lo < unLo - ltLo?ltLo - lo:unLo - ltLo; + this.vswap(lo, unLo - n, n); + int m = hi - gtHi < gtHi - unHi?hi - gtHi:gtHi - unHi; + this.vswap(unLo, hi - m + 1, m); + n = lo + unLo - ltLo - 1; + m = hi - (gtHi - unHi) + 1; + stack[var17].ll = lo; + stack[var17].hh = n; + stack[var17].dd = d; + ++var17; + stack[var17].ll = n + 1; + stack[var17].hh = m - 1; + stack[var17].dd = d + 1; + ++var17; + stack[var17].ll = m; + stack[var17].hh = hi; + stack[var17].dd = d; + ++var17; + } + continue label55; + } + + var18 = false; + temp = this.zptr[unLo]; + this.zptr[unLo] = this.zptr[unHi]; + this.zptr[unHi] = temp; + ++unLo; + --unHi; + } + } + } else { + this.simpleSort(lo, hi, d); + if(this.workDone > this.workLimit && this.firstAttempt) { + return; + } + } + } + + return; + } + } + + private void mainSort() { + int[] runningOrder = new int[256]; + int[] copy = new int[256]; + boolean[] bigDone = new boolean[256]; + + int i; + for(i = 0; i < 20; ++i) { + this.block[this.last + i + 2] = this.block[i % (this.last + 1) + 1]; + } + + for(i = 0; i <= this.last + 20; ++i) { + this.quadrant[i] = 0; + } + + this.block[0] = this.block[this.last + 1]; + if(this.last < 4000) { + for(i = 0; i <= this.last; this.zptr[i] = i++) { + ; + } + + this.firstAttempt = false; + this.workDone = this.workLimit = 0; + this.simpleSort(0, this.last, 0); + } else { + int numQSorted = 0; + + for(i = 0; i <= 255; ++i) { + bigDone[i] = false; + } + + for(i = 0; i <= 65536; ++i) { + this.ftab[i] = 0; + } + + char c1 = this.block[0]; + + char c2; + for(i = 0; i <= this.last; ++i) { + c2 = this.block[i + 1]; + ++this.ftab[(c1 << 8) + c2]; + c1 = c2; + } + + for(i = 1; i <= 65536; ++i) { + this.ftab[i] += this.ftab[i - 1]; + } + + c1 = this.block[1]; + + int j; + for(i = 0; i < this.last; this.zptr[this.ftab[j]] = i++) { + c2 = this.block[i + 2]; + j = (c1 << 8) + c2; + c1 = c2; + --this.ftab[j]; + } + + j = (this.block[this.last + 1] << 8) + this.block[1]; + --this.ftab[j]; + this.zptr[this.ftab[j]] = this.last; + + for(i = 0; i <= 255; runningOrder[i] = i++) { + ; + } + + int bbSize = 1; + + do { + bbSize = 3 * bbSize + 1; + } while(bbSize <= 256); + + int bbStart; + do { + bbSize /= 3; + + for(i = bbSize; i <= 255; ++i) { + bbStart = runningOrder[i]; + j = i; + + while(this.ftab[runningOrder[j - bbSize] + 1 << 8] - this.ftab[runningOrder[j - bbSize] << 8] > this.ftab[bbStart + 1 << 8] - this.ftab[bbStart << 8]) { + runningOrder[j] = runningOrder[j - bbSize]; + j -= bbSize; + if(j <= bbSize - 1) { + break; + } + } + + runningOrder[j] = bbStart; + } + } while(bbSize != 1); + + for(i = 0; i <= 255; ++i) { + int ss = runningOrder[i]; + + int shifts; + for(j = 0; j <= 255; ++j) { + shifts = (ss << 8) + j; + if((this.ftab[shifts] & 2097152) != 2097152) { + bbStart = this.ftab[shifts] & -2097153; + bbSize = (this.ftab[shifts + 1] & -2097153) - 1; + if(bbSize > bbStart) { + this.qSort3(bbStart, bbSize, 2); + numQSorted += bbSize - bbStart + 1; + if(this.workDone > this.workLimit && this.firstAttempt) { + return; + } + } + + this.ftab[shifts] |= 2097152; + } + } + + bigDone[ss] = true; + if(i < 255) { + bbStart = this.ftab[ss << 8] & -2097153; + bbSize = (this.ftab[ss + 1 << 8] & -2097153) - bbStart; + + for(shifts = 0; bbSize >> shifts > '\ufffe'; ++shifts) { + ; + } + + for(j = 0; j < bbSize; ++j) { + int a2update = this.zptr[bbStart + j]; + int qVal = j >> shifts; + this.quadrant[a2update] = qVal; + if(a2update < 20) { + this.quadrant[a2update + this.last + 1] = qVal; + } + } + + if(bbSize - 1 >> shifts > '\uffff') { + panic(); + } + } + + for(j = 0; j <= 255; ++j) { + copy[j] = this.ftab[(j << 8) + ss] & -2097153; + } + + for(j = this.ftab[ss << 8] & -2097153; j < (this.ftab[ss + 1 << 8] & -2097153); ++j) { + c1 = this.block[this.zptr[j]]; + if(!bigDone[c1]) { + this.zptr[copy[c1]] = this.zptr[j] == 0?this.last:this.zptr[j] - 1; + ++copy[c1]; + } + } + + for(j = 0; j <= 255; ++j) { + this.ftab[(j << 8) + ss] |= 2097152; + } + } + } + + } + + private void randomiseBlock() { + int rNToGo = 0; + int rTPos = 0; + + int i; + for(i = 0; i < 256; ++i) { + this.inUse[i] = false; + } + + for(i = 0; i <= this.last; ++i) { + if(rNToGo == 0) { + rNToGo = (char)rNums[rTPos]; + ++rTPos; + if(rTPos == 512) { + rTPos = 0; + } + } + + --rNToGo; + this.block[i + 1] = (char)(this.block[i + 1] ^ (rNToGo == 1?1:0)); + this.block[i + 1] = (char)(this.block[i + 1] & 255); + this.inUse[this.block[i + 1]] = true; + } + + } + + private void doReversibleTransformation() { + this.workLimit = this.workFactor * this.last; + this.workDone = 0; + this.blockRandomised = false; + this.firstAttempt = true; + this.mainSort(); + if(this.workDone > this.workLimit && this.firstAttempt) { + this.randomiseBlock(); + this.workLimit = this.workDone = 0; + this.blockRandomised = true; + this.firstAttempt = false; + this.mainSort(); + } + + this.origPtr = -1; + + for(int i = 0; i <= this.last; ++i) { + if(this.zptr[i] == 0) { + this.origPtr = i; + break; + } + } + + if(this.origPtr == -1) { + panic(); + } + + } + + private boolean fullGtU(int i1, int i2) { + char c1 = this.block[i1 + 1]; + char c2 = this.block[i2 + 1]; + if(c1 != c2) { + return c1 > c2; + } else { + ++i1; + ++i2; + c1 = this.block[i1 + 1]; + c2 = this.block[i2 + 1]; + if(c1 != c2) { + return c1 > c2; + } else { + ++i1; + ++i2; + c1 = this.block[i1 + 1]; + c2 = this.block[i2 + 1]; + if(c1 != c2) { + return c1 > c2; + } else { + ++i1; + ++i2; + c1 = this.block[i1 + 1]; + c2 = this.block[i2 + 1]; + if(c1 != c2) { + return c1 > c2; + } else { + ++i1; + ++i2; + c1 = this.block[i1 + 1]; + c2 = this.block[i2 + 1]; + if(c1 != c2) { + return c1 > c2; + } else { + ++i1; + ++i2; + c1 = this.block[i1 + 1]; + c2 = this.block[i2 + 1]; + if(c1 != c2) { + return c1 > c2; + } else { + ++i1; + ++i2; + int k = this.last + 1; + + do { + c1 = this.block[i1 + 1]; + c2 = this.block[i2 + 1]; + if(c1 != c2) { + return c1 > c2; + } + + int s1 = this.quadrant[i1]; + int s2 = this.quadrant[i2]; + if(s1 != s2) { + if(s1 > s2) { + return true; + } + + return false; + } + + ++i1; + ++i2; + c1 = this.block[i1 + 1]; + c2 = this.block[i2 + 1]; + if(c1 != c2) { + if(c1 > c2) { + return true; + } + + return false; + } + + s1 = this.quadrant[i1]; + s2 = this.quadrant[i2]; + if(s1 != s2) { + if(s1 > s2) { + return true; + } + + return false; + } + + ++i1; + ++i2; + c1 = this.block[i1 + 1]; + c2 = this.block[i2 + 1]; + if(c1 != c2) { + if(c1 > c2) { + return true; + } + + return false; + } + + s1 = this.quadrant[i1]; + s2 = this.quadrant[i2]; + if(s1 != s2) { + if(s1 > s2) { + return true; + } + + return false; + } + + ++i1; + ++i2; + c1 = this.block[i1 + 1]; + c2 = this.block[i2 + 1]; + if(c1 != c2) { + if(c1 > c2) { + return true; + } + + return false; + } + + s1 = this.quadrant[i1]; + s2 = this.quadrant[i2]; + if(s1 != s2) { + if(s1 > s2) { + return true; + } + + return false; + } + + ++i1; + ++i2; + if(i1 > this.last) { + i1 -= this.last; + --i1; + } + + if(i2 > this.last) { + i2 -= this.last; + --i2; + } + + k -= 4; + ++this.workDone; + } while(k >= 0); + + return false; + } + } + } + } + } + } + } + + private void allocateCompressStructures() { + int n = 100000 * this.blockSize100k; + this.block = new char[n + 1 + 20]; + this.quadrant = new int[n + 20]; + this.zptr = new int[n]; + this.ftab = new int[65537]; + if(this.block != null && this.quadrant != null && this.zptr != null && this.ftab == null) { + ; + } + + this.szptr = new short[2 * n]; + } + + private void generateMTFValues() { + char[] yy = new char[256]; + this.makeMaps(); + int EOB = this.nInUse + 1; + + int i; + for(i = 0; i <= EOB; ++i) { + this.mtfFreq[i] = 0; + } + + int wr = 0; + int zPend = 0; + + for(i = 0; i < this.nInUse; ++i) { + yy[i] = (char)i; + } + + for(i = 0; i <= this.last; ++i) { + char ll_i = this.unseqToSeq[this.block[this.zptr[i]]]; + int j = 0; + + char tmp; + char tmp2; + for(tmp = yy[j]; ll_i != tmp; yy[j] = tmp2) { + ++j; + tmp2 = tmp; + tmp = yy[j]; + } + + yy[0] = tmp; + if(j == 0) { + ++zPend; + } else { + if(zPend > 0) { + --zPend; + + while(true) { + switch(zPend % 2) { + case 0: + this.szptr[wr] = 0; + ++wr; + ++this.mtfFreq[0]; + break; + case 1: + this.szptr[wr] = 1; + ++wr; + ++this.mtfFreq[1]; + } + + if(zPend < 2) { + zPend = 0; + break; + } + + zPend = (zPend - 2) / 2; + } + } + + this.szptr[wr] = (short)(j + 1); + ++wr; + ++this.mtfFreq[j + 1]; + } + } + + if(zPend > 0) { + --zPend; + + while(true) { + switch(zPend % 2) { + case 0: + this.szptr[wr] = 0; + ++wr; + ++this.mtfFreq[0]; + break; + case 1: + this.szptr[wr] = 1; + ++wr; + ++this.mtfFreq[1]; + } + + if(zPend < 2) { + break; + } + + zPend = (zPend - 2) / 2; + } + } + + this.szptr[wr] = (short)EOB; + ++wr; + ++this.mtfFreq[EOB]; + this.nMTF = wr; + } + + public int getnBlocksRandomised() { + return this.nBlocksRandomised; + } + + public void setnBlocksRandomised(int nBlocksRandomised) { + this.nBlocksRandomised = nBlocksRandomised; + } + + private static class StackElem { + int ll; + int hh; + int dd; + + private StackElem() { + } + + StackElem(CBZip2OutputStream.SyntheticClass_1 x0) { + this(); + } + + // $FF: synthetic method + StackElem(CBZip2OutputStream.StackElem var1) { + this(); + } + } + + static class SyntheticClass_1 { + } +} diff --git a/Tools/Frostys Cache Editor/src/org/apache/tools/bzip2/CRC.java b/Tools/Frostys Cache Editor/src/org/apache/tools/bzip2/CRC.java new file mode 100644 index 000000000..d00698e33 --- /dev/null +++ b/Tools/Frostys Cache Editor/src/org/apache/tools/bzip2/CRC.java @@ -0,0 +1,35 @@ +package org.apache.tools.bzip2; + +class CRC { + public static int[] crc32Table = new int[]{0, 79764919, 159529838, 222504665, 319059676, 398814059, 445009330, 507990021, 638119352, 583659535, 797628118, 726387553, 890018660, 835552979, 1015980042, 944750013, 1276238704, 1221641927, 1167319070, 1095957929, 1595256236, 1540665371, 1452775106, 1381403509, 1780037320, 1859660671, 1671105958, 1733955601, 2031960084, 2111593891, 1889500026, 1952343757, -1742489888, -1662866601, -1851683442, -1788833735, -1960329156, -1880695413, -2103051438, -2040207643, -1104454824, -1159051537, -1213636554, -1284997759, -1389417084, -1444007885, -1532160278, -1603531939, -734892656, -789352409, -575645954, -646886583, -952755380, -1007220997, -827056094, -898286187, -231047128, -151282273, -71779514, -8804623, -515967244, -436212925, -390279782, -327299027, 881225847, 809987520, 1023691545, 969234094, 662832811, 591600412, 771767749, 717299826, 311336399, 374308984, 453813921, 533576470, 25881363, 88864420, 134795389, 214552010, 2023205639, 2086057648, 1897238633, 1976864222, 1804852699, 1867694188, 1645340341, 1724971778, 1587496639, 1516133128, 1461550545, 1406951526, 1302016099, 1230646740, 1142491917, 1087903418, -1398421865, -1469785312, -1524105735, -1578704818, -1079922613, -1151291908, -1239184603, -1293773166, -1968362705, -1905510760, -2094067647, -2014441994, -1716953613, -1654112188, -1876203875, -1796572374, -525066777, -462094256, -382327159, -302564546, -206542021, -143559028, -97365931, -17609246, -960696225, -1031934488, -817968335, -872425850, -709327229, -780559564, -600130067, -654598054, 1762451694, 1842216281, 1619975040, 1682949687, 2047383090, 2127137669, 1938468188, 2001449195, 1325665622, 1271206113, 1183200824, 1111960463, 1543535498, 1489069629, 1434599652, 1363369299, 622672798, 568075817, 748617968, 677256519, 907627842, 853037301, 1067152940, 995781531, 51762726, 131386257, 177728840, 240578815, 269590778, 349224269, 429104020, 491947555, -248556018, -168932423, -122852000, -60002089, -500490030, -420856475, -341238852, -278395381, -685261898, -739858943, -559578920, -630940305, -1004286614, -1058877219, -845023740, -916395085, -1119974018, -1174433591, -1262701040, -1333941337, -1371866206, -1426332139, -1481064244, -1552294533, -1690935098, -1611170447, -1833673816, -1770699233, -2009983462, -1930228819, -2119160460, -2056179517, 1569362073, 1498123566, 1409854455, 1355396672, 1317987909, 1246755826, 1192025387, 1137557660, 2072149281, 2135122070, 1912620623, 1992383480, 1753615357, 1816598090, 1627664531, 1707420964, 295390185, 358241886, 404320391, 483945776, 43990325, 106832002, 186451547, 266083308, 932423249, 861060070, 1041341759, 986742920, 613929101, 542559546, 756411363, 701822548, -978770311, -1050133554, -869589737, -924188512, -693284699, -764654318, -550540341, -605129092, -475935807, -413084042, -366743377, -287118056, -257573603, -194731862, -114850189, -35218492, -1984365303, -1921392450, -2143631769, -2063868976, -1698919467, -1635936670, -1824608069, -1744851700, -1347415887, -1418654458, -1506661409, -1561119128, -1129027987, -1200260134, -1254728445, -1309196108}; + int globalCrc; + + public CRC() { + this.initialiseCRC(); + } + + void initialiseCRC() { + this.globalCrc = -1; + } + + int getFinalCRC() { + return ~this.globalCrc; + } + + int getGlobalCRC() { + return this.globalCrc; + } + + void setGlobalCRC(int newCrc) { + this.globalCrc = newCrc; + } + + void updateCRC(int inCh) { + int temp = this.globalCrc >> 24 ^ inCh; + if(temp < 0) { + temp += 256; + } + + this.globalCrc = this.globalCrc << 8 ^ crc32Table[temp]; + } +} diff --git a/Tools/GE Tool.html b/Tools/GE Tool.html new file mode 100644 index 000000000..971c4e62b --- /dev/null +++ b/Tools/GE Tool.html @@ -0,0 +1,151 @@ + + + 💰 GE Tool + + + + + + + +
+
+
+

Import Files

+ +
+
+ +
+ +
+ +
+
+ +
+
+
+ item_configs.json + YES + NO +
+
+ +
+
+ offer_dispatch.json + YES + NO +
+
+
+
+
+ +
+
+
+

Offers

+
+
+ + +
+
+ + + + + + + + + + + + + + + + + +
Item IDNamePriceAmount
{{ itemId }}{{ offer.name }}{{ offer.value }} gp{{ offer.amount }}
+
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/Tools/RSDataSuite v1.2.2.jar b/Tools/RSDataSuite v1.2.2.jar new file mode 100644 index 000000000..3d9cbff4d Binary files /dev/null and b/Tools/RSDataSuite v1.2.2.jar differ diff --git a/Tools/diff_json_simple.py b/Tools/diff_json_simple.py new file mode 100644 index 000000000..6d012e33b --- /dev/null +++ b/Tools/diff_json_simple.py @@ -0,0 +1,137 @@ +import json +import code +from pprint import pprint +import argparse +import collections +from weakref import proxy +#code.interact(local=dict(globals(), **locals())) + +class Link(object): + __slots__ = 'prev', 'next', 'key', '__weakref__' + +class OrderedSet(collections.MutableSet): + 'Set the remembers the order elements were added' + # Big-O running times for all methods are the same as for regular sets. + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # The prev/next links are weakref proxies (to prevent circular references). + # Individual links are kept alive by the hard reference in self.__map. + # Those hard references disappear when a key is deleted from an OrderedSet. + + def __init__(self, iterable=None): + self.__root = root = Link() # sentinel node for doubly linked list + root.prev = root.next = root + self.__map = {} # key --> link + if iterable is not None: + self |= iterable + + def __len__(self): + return len(self.__map) + + def __contains__(self, key): + return key in self.__map + + def add(self, key): + # Store new key in a new link at the end of the linked list + if key not in self.__map: + self.__map[key] = link = Link() + root = self.__root + last = root.prev + link.prev, link.next, link.key = last, root, key + last.next = root.prev = proxy(link) + + def discard(self, key): + # Remove an existing item using self.__map to find the link which is + # then removed by updating the links in the predecessor and successors. + if key in self.__map: + link = self.__map.pop(key) + link.prev.next = link.next + link.next.prev = link.prev + + def __iter__(self): + # Traverse the linked list in order. + root = self.__root + curr = root.next + while curr is not root: + yield curr.key + curr = curr.next + + def __reversed__(self): + # Traverse the linked list in reverse order. + root = self.__root + curr = root.prev + while curr is not root: + yield curr.key + curr = curr.prev + + def pop(self, last=True): + if not self: + raise KeyError('set is empty') + key = next(reversed(self)) if last else next(iter(self)) + self.discard(key) + return key + + def __repr__(self): + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, list(self)) + + def __eq__(self, other): + if isinstance(other, OrderedSet): + return len(self) == len(other) and list(self) == list(other) + return not self.isdisjoint(other) + + +def datalist(f): + with open(f) as jsonFile: + d = json.load(jsonFile) + if (isinstance(d, dict) and len(d.keys()) == 1): + d = d[list(d.keys())[0]] + return d + +def compareby(l1, l2, field): + idx1 = [record[field] for record in l1] + idx2 = [record[field] for record in l2] + + idx1Uniques = OrderedSet(idx1) - idx2 + idx2Uniques = OrderedSet(idx2) - idx1 + + print('') + print('[%s] not in LEFT:' % field) + pprint(idx2Uniques) + print('') + print('[%s] not in RIGHT:' % field) + pprint(idx1Uniques) + print('') + + idxCommon = (OrderedSet(idx1) | OrderedSet(idx2)) - idx1Uniques - idx2Uniques + idxCommonList = list(idxCommon) + + dict1 = {record[field] : {i:record[i] for i in record if i!=field} for record in l1} + dict2 = {record[field] : {i:record[i] for i in record if i!=field} for record in l2} + + for idx in idxCommonList: + if (dict1[idx] != dict2[idx]): + print('records do not match for [%s]=%s' % (field, idx)) + print(' LEFT: ' + str(dict1[idx])) + print(' RIGHT: ' + str(dict2[idx])) + print('') + + #code.interact(local=dict(globals(), **locals())) + + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Show delta to get from LEFT file to RIGHT file') + parser.add_argument('f1', type=str, help='LEFT file') + parser.add_argument('f2', type=str, help='RIGHT file') + parser.add_argument('field', type=str, help='FIELD to compare by') + args = parser.parse_args() + + d1 = datalist(args.f1) + d2 = datalist(args.f2) + compareby(d1, d2, args.field) + + #code.interact(local=dict(globals(), **locals())) + \ No newline at end of file diff --git a/build-singleplayer.bat b/build-singleplayer.bat new file mode 100644 index 000000000..853633470 --- /dev/null +++ b/build-singleplayer.bat @@ -0,0 +1,40 @@ +@echo off + +mkdir Single-Player + +echo Building Client... +cd Client +call gradle jar +cd .. +copy /Y "Client\build\libs\client-1.0.0.jar" "Single-Player\client.jar" +echo. + +echo Building Management-Server... +cd Management-Server +call gradle jar +cd .. +copy /Y "Management-Server\build\libs\managementserver-1.0.0.jar" "Single-Player\ms.jar" +echo. + +echo Building Server... +cd Server +call gradle jar +cd .. +copy /Y "Server\build\libs\server-1.0.0.jar" "Single-Player\server.jar" +echo. + +echo Copying server data... +del /S /Q "Single-Player/data" +xcopy /E /I /Y "Server\data" "Single-Player\data" +xcopy /E /I /Y "Server\db_exports\*.sql" "Single-Player\data" +del /S /Q "Single-Player/worldprops" +xcopy /E /I /Y "Server\worldprops" "Single-Player\worldprops" +: Set Debug/Dev mode to false on single player server config +powershell -Command "(gc Single-Player\worldprops\default.json) -replace '\"debug\": true', '\"debug\": false' -replace '\"dev\": true', '\"dev\": false' | Out-File -Encoding Default Single-Player\worldprops\default.json" + +: Replace Live server addresses with localhost +powershell -Command "(gc Client\config.json) -replace 'play.2009scape.org', 'localhost' | Out-File -Encoding Default Single-Player\config.json" +echo. + +echo Done! +pause \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 000000000..6d70f374b --- /dev/null +++ b/build.gradle @@ -0,0 +1,32 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.4.10' + id 'com.github.johnrengelman.shadow' version '6.0.0' +} + +allprojects { + apply plugin: 'idea' + apply plugin: 'java' + apply plugin: 'org.jetbrains.kotlin.jvm' + apply plugin: 'com.github.johnrengelman.shadow' + + group = 'org.2009scape' + version = '1.0.0' + + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + + repositories { + mavenCentral() + maven { url 'https://jitpack.io' } + } + + dependencies { + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10' + } + + compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + } + } +} \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 000000000..4881fd9e7 --- /dev/null +++ b/build.sh @@ -0,0 +1,54 @@ +#!/bin/sh +origDir=$(pwd) +if [ $# -eq 0 ]; then + echo "Usage: $0 type" + echo "Available types: client, server, ms, all" + exit +else type=$1 +fi + +build_server() { + echo "Building server..." + cd Server/ || exit + gradle build || exit + cd "$origDir" || exit + tar xvf Server/build/distributions/Server.tar || exit +} +build_client() { + echo "Building client..." + echo "Change IP from 127.0.0.1?(y/N)" + read -r changeIP + if [ "$changeIP" = "y" ]; then + echo "Enter desired IP address:" + read -r newIP + echo "target_ip_addr:$newIP" > Client/src/main/resources/client.conf + fi + cd Client/ || exit + gradle build || exit + cd "$origDir" || exit + tar xvf Client/build/distributions/Client.tar || exit + cp Client/build/libs/client-1.0.0.jar Client/bin/2009scape.jar || exit + echo "Client jarfile can be found at Client/bin/2009scape.jar" +} +build_ms() { + echo "Building management server..." + cd Management-Server/ || exit + gradle build || exit + cd "$origDir" || exit + tar xvf Management-Server/build/distributions/Management-Server.tar || exit +} + + +if [ "$type" = "client" ]; then + build_client +elif [ "$type" = "server" ]; then + build_server +elif [ "$type" = "ms" ]; then + build_ms +elif [ "$type" = "all" ]; then + build_ms + build_server + build_client +else echo "Invalid type. Should be one of: client, server, ms, all" +fi + diff --git a/dumps/498/498_clothing_dump.txt b/dumps/498/498_clothing_dump.txt new file mode 100644 index 000000000..6a6c97323 --- /dev/null +++ b/dumps/498/498_clothing_dump.txt @@ -0,0 +1,171 @@ +[2014-04-26 04:20:29][Arios]: Initializing cache... +Definition size: 169. +Clothing 0: 0, false, [230], [63, -1, -1, -1, -1] +Clothing 1: 0, false, [210], [49, -1, -1, -1, -1] +Clothing 2: 0, false, [214], [52, -1, -1, -1, -1] +Clothing 3: 0, false, [217], [55, -1, -1, -1, -1] +Clothing 4: 0, false, [223], [59, -1, -1, -1, -1] +Clothing 5: 0, false, [215], [53, -1, -1, -1, -1] +Clothing 6: 0, false, [235], [67, -1, -1, -1, -1] +Clothing 7: 0, false, [206], [46, -1, -1, -1, -1] +Clothing 8: 0, false, [203], [45, -1, -1, -1, -1] +Clothing 9: 0, true, [203], [45, -1, -1, -1, -1] +Clothing 10: 1, false, [249], [81, -1, -1, -1, -1] +Clothing 11: 1, false, [250], [82, -1, -1, -1, -1] +Clothing 12: 1, false, [251], [83, -1, -1, -1, -1] +Clothing 13: 1, false, [247], [79, -1, -1, -1, -1] +Clothing 14: 1, false, [246], [-1, -1, -1, -1, -1] +Clothing 15: 1, false, [248], [80, -1, -1, -1, -1] +Clothing 16: 1, false, [253], [85, -1, -1, -1, -1] +Clothing 17: 1, false, [252], [84, -1, -1, -1, -1] +Clothing 18: 2, false, [292], [-1, -1, -1, -1, -1] +Clothing 19: 2, false, [292, 322], [-1, -1, -1, -1, -1] +Clothing 20: 2, false, [292, 326], [-1, -1, -1, -1, -1] +Clothing 21: 2, false, [292, 320], [-1, -1, -1, -1, -1] +Clothing 22: 2, false, [292, 327], [-1, -1, -1, -1, -1] +Clothing 23: 2, false, [292, 324], [-1, -1, -1, -1, -1] +Clothing 24: 2, false, [310], [-1, -1, -1, -1, -1] +Clothing 25: 2, false, [297], [-1, -1, -1, -1, -1] +Clothing 26: 3, false, [151], [-1, -1, -1, -1, -1] +Clothing 27: 3, false, [167], [-1, -1, -1, -1, -1] +Clothing 28: 3, false, [170], [-1, -1, -1, -1, -1] +Clothing 29: 3, false, [162], [-1, -1, -1, -1, -1] +Clothing 30: 3, false, [163], [-1, -1, -1, -1, -1] +Clothing 31: 3, false, [158], [-1, -1, -1, -1, -1] +Clothing 32: 3, true, [158], [-1, -1, -1, -1, -1] +Clothing 33: 4, false, [176], [-1, -1, -1, -1, -1] +Clothing 34: 4, false, [176], [-1, -1, -1, -1, -1] +Clothing 35: 4, true, [176], [-1, -1, -1, -1, -1] +Clothing 36: 5, false, [254], [-1, -1, -1, -1, -1] +Clothing 37: 5, false, [271], [-1, -1, -1, -1, -1] +Clothing 38: 5, false, [267], [-1, -1, -1, -1, -1] +Clothing 39: 5, false, [274], [-1, -1, -1, -1, -1] +Clothing 40: 5, false, [275], [-1, -1, -1, -1, -1] +Clothing 41: 5, true, [275], [-1, -1, -1, -1, -1] +Clothing 42: 6, false, [181], [-1, -1, -1, -1, -1] +Clothing 43: 6, false, [183], [-1, -1, -1, -1, -1] +Clothing 44: 6, true, [183], [-1, -1, -1, -1, -1] +Clothing 45: 7, false, [403], [120, -1, -1, -1, -1] +Clothing 46: 7, false, [378], [103, -1, -1, -1, -1] +Clothing 47: 7, false, [387], [110, -1, -1, -1, -1] +Clothing 48: 7, false, [390], [113, -1, -1, -1, -1] +Clothing 49: 7, false, [393], [115, -1, -1, -1, -1] +Clothing 50: 7, false, [399], [118, -1, -1, -1, -1] +Clothing 51: 7, false, [391], [114, -1, -1, -1, -1] +Clothing 52: 7, false, [408], [125, -1, -1, -1, -1] +Clothing 53: 7, false, [382], [105, -1, -1, -1, -1] +Clothing 54: 7, false, [379], [104, -1, -1, -1, -1] +Clothing 55: 7, true, [379], [104, -1, -1, -1, -1] +Clothing 56: 9, false, [456], [-1, -1, -1, -1, -1] +Clothing 57: 9, false, [469], [-1, -1, -1, -1, -1] +Clothing 58: 9, false, [470], [-1, -1, -1, -1, -1] +Clothing 59: 9, false, [471], [-1, -1, -1, -1, -1] +Clothing 60: 9, false, [474], [-1, -1, -1, -1, -1] +Clothing 61: 10, false, [332], [-1, -1, -1, -1, -1] +Clothing 62: 10, false, [351], [-1, -1, -1, -1, -1] +Clothing 63: 10, false, [346], [-1, -1, -1, -1, -1] +Clothing 64: 10, false, [348], [-1, -1, -1, -1, -1] +Clothing 65: 10, false, [343], [-1, -1, -1, -1, -1] +Clothing 66: 10, true, [343], [-1, -1, -1, -1, -1] +Clothing 67: 11, false, [353], [-1, -1, -1, -1, -1] +Clothing 68: 11, false, [353], [-1, -1, -1, -1, -1] +Clothing 69: 11, true, [353], [-1, -1, -1, -1, -1] +Clothing 70: 12, false, [419], [-1, -1, -1, -1, -1] +Clothing 71: 12, false, [433], [-1, -1, -1, -1, -1] +Clothing 72: 12, false, [431], [-1, -1, -1, -1, -1] +Clothing 73: 12, false, [428], [-1, -1, -1, -1, -1] +Clothing 74: 12, false, [421], [-1, -1, -1, -1, -1] +Clothing 75: 12, false, [438], [-1, -1, -1, -1, -1] +Clothing 76: 12, false, [437], [-1, -1, -1, -1, -1] +Clothing 77: 12, false, [429], [-1, -1, -1, -1, -1] +Clothing 78: 12, true, [429], [-1, -1, -1, -1, -1] +Clothing 79: 13, false, [358], [-1, -1, -1, -1, -1] +Clothing 80: 13, false, [360], [-1, -1, -1, -1, -1] +Clothing 81: 13, true, [360], [-1, -1, -1, -1, -1] +Clothing 82: 6, true, [7117], [-1, -1, -1, -1, -1] +Clothing 83: 13, true, [7118], [-1, -1, -1, -1, -1] +Clothing 84: 4, false, [176], [-1, -1, -1, -1, -1] +Clothing 85: 5, false, [27626], [-1, -1, -1, -1, -1] +Clothing 86: 5, false, [27623], [-1, -1, -1, -1, -1] +Clothing 87: 5, false, [27624], [-1, -1, -1, -1, -1] +Clothing 88: 5, false, [27621], [-1, -1, -1, -1, -1] +Clothing 89: 5, false, [27622], [-1, -1, -1, -1, -1] +Clothing 90: 5, false, [27625], [-1, -1, -1, -1, -1] +Clothing 91: 0, false, [27633], [27680, -1, -1, -1, -1] +Clothing 92: 0, false, [27627], [27677, -1, -1, -1, -1] +Clothing 93: 0, false, [27630], [27679, -1, -1, -1, -1] +Clothing 94: 0, false, [27628], [27682, -1, -1, -1, -1] +Clothing 95: 0, false, [27631], [27683, -1, -1, -1, -1] +Clothing 96: 0, false, [27629], [27681, -1, -1, -1, -1] +Clothing 97: 0, false, [27632], [27678, -1, -1, -1, -1] +Clothing 98: 1, false, [27645], [27685, -1, -1, -1, -1] +Clothing 99: 1, false, [27644], [27688, -1, -1, -1, -1] +Clothing 100: 1, false, [27646], [27687, -1, -1, -1, -1] +Clothing 101: 1, false, [27642], [27689, -1, -1, -1, -1] +Clothing 102: 1, false, [27640], [27684, -1, -1, -1, -1] +Clothing 103: 1, false, [27643], [27690, -1, -1, -1, -1] +Clothing 104: 1, false, [27641], [27686, -1, -1, -1, -1] +Clothing 105: 3, false, [27634], [-1, -1, -1, -1, -1] +Clothing 106: 3, false, [27635], [-1, -1, -1, -1, -1] +Clothing 107: 3, false, [27638], [-1, -1, -1, -1, -1] +Clothing 108: 3, false, [27639], [-1, -1, -1, -1, -1] +Clothing 109: 3, false, [27636], [-1, -1, -1, -1, -1] +Clothing 110: 3, false, [27637], [-1, -1, -1, -1, -1] +Clothing 111: 2, false, [27648], [-1, -1, -1, -1, -1] +Clothing 112: 2, false, [27563], [-1, -1, -1, -1, -1] +Clothing 113: 2, false, [27647], [-1, -1, -1, -1, -1] +Clothing 114: 2, false, [25864], [-1, -1, -1, -1, -1] +Clothing 115: 2, false, [27650], [-1, -1, -1, -1, -1] +Clothing 116: 2, false, [27649], [-1, -1, -1, -1, -1] +Clothing 117: 4, false, [24553], [-1, -1, -1, -1, -1] +Clothing 118: 4, false, [24553], [-1, -1, -1, -1, -1] +Clothing 119: 4, false, [24554], [-1, -1, -1, -1, -1] +Clothing 120: 4, false, [24554], [-1, -1, -1, -1, -1] +Clothing 121: 4, false, [24555], [-1, -1, -1, -1, -1] +Clothing 122: 4, false, [24555], [-1, -1, -1, -1, -1] +Clothing 123: 4, false, [24556], [-1, -1, -1, -1, -1] +Clothing 124: 4, false, [24556], [-1, -1, -1, -1, -1] +Clothing 125: 4, false, [24557], [-1, -1, -1, -1, -1] +Clothing 126: 4, false, [24557], [-1, -1, -1, -1, -1] +Clothing 127: 11, false, [353], [-1, -1, -1, -1, -1] +Clothing 128: 12, false, [27655], [-1, -1, -1, -1, -1] +Clothing 129: 12, false, [27657], [-1, -1, -1, -1, -1] +Clothing 130: 12, false, [27654], [-1, -1, -1, -1, -1] +Clothing 131: 12, false, [27653], [-1, -1, -1, -1, -1] +Clothing 132: 12, false, [27656], [-1, -1, -1, -1, -1] +Clothing 133: 12, false, [27651], [-1, -1, -1, -1, -1] +Clothing 134: 12, false, [27652], [-1, -1, -1, -1, -1] +Clothing 135: 7, false, [16458], [16446, -1, -1, -1, -1] +Clothing 136: 7, false, [16453], [16441, -1, -1, -1, -1] +Clothing 137: 7, false, [16460], [16448, -1, -1, -1, -1] +Clothing 138: 7, false, [16457], [16470, -1, -1, -1, -1] +Clothing 139: 7, false, [27664], [27695, -1, -1, -1, -1] +Clothing 140: 7, false, [27660], [16439, -1, -1, -1, -1] +Clothing 141: 7, false, [27662], [27692, -1, -1, -1, -1] +Clothing 142: 7, false, [16454], [16442, -1, -1, -1, -1] +Clothing 143: 7, false, [27663], [27696, -1, -1, -1, -1] +Clothing 144: 7, false, [27661], [27694, -1, -1, -1, -1] +Clothing 145: 7, false, [27658], [27693, -1, -1, -1, -1] +Clothing 146: 7, false, [27659], [27691, -1, -1, -1, -1] +Clothing 147: 10, false, [27670], [-1, -1, -1, -1, -1] +Clothing 148: 10, false, [27666], [-1, -1, -1, -1, -1] +Clothing 149: 10, false, [27665], [-1, -1, -1, -1, -1] +Clothing 150: 10, false, [27668], [-1, -1, -1, -1, -1] +Clothing 151: 10, false, [27669], [-1, -1, -1, -1, -1] +Clothing 152: 10, false, [27667], [-1, -1, -1, -1, -1] +Clothing 153: 9, false, [27673], [-1, -1, -1, -1, -1] +Clothing 154: 9, false, [27675], [-1, -1, -1, -1, -1] +Clothing 155: 9, false, [27672], [-1, -1, -1, -1, -1] +Clothing 156: 9, false, [27674], [-1, -1, -1, -1, -1] +Clothing 157: 9, false, [27671], [-1, -1, -1, -1, -1] +Clothing 158: 9, false, [27676], [-1, -1, -1, -1, -1] +Clothing 159: 11, false, [24559], [-1, -1, -1, -1, -1] +Clothing 160: 11, false, [24559], [-1, -1, -1, -1, -1] +Clothing 161: 11, false, [24560], [-1, -1, -1, -1, -1] +Clothing 162: 11, false, [24560], [-1, -1, -1, -1, -1] +Clothing 163: 11, false, [24561], [-1, -1, -1, -1, -1] +Clothing 164: 11, false, [24561], [-1, -1, -1, -1, -1] +Clothing 165: 11, false, [24562], [-1, -1, -1, -1, -1] +Clothing 166: 11, false, [24562], [-1, -1, -1, -1, -1] +Clothing 167: 11, false, [24563], [-1, -1, -1, -1, -1] +Clothing 168: 11, false, [24563], [-1, -1, -1, -1, -1] diff --git a/dumps/498/498_hidden_child_dump.txt b/dumps/498/498_hidden_child_dump.txt new file mode 100644 index 000000000..e6a3a4e64 --- /dev/null +++ b/dumps/498/498_hidden_child_dump.txt @@ -0,0 +1,1116 @@ +RSInterface 0 has hidden child 10 +RSInterface 0 has hidden child 12 +RSInterface 0 has hidden child 14 +RSInterface 0 has hidden child 16 +RSInterface 0 has hidden child 18 +RSInterface 1 has hidden child 7 +RSInterface 1 has hidden child 8 +RSInterface 1 has hidden child 9 +RSInterface 1 has hidden child 10 +RSInterface 1 has hidden child 11 +RSInterface 1 has hidden child 12 +RSInterface 3 has hidden child 7 +RSInterface 3 has hidden child 8 +RSInterface 3 has hidden child 9 +RSInterface 3 has hidden child 10 +RSInterface 3 has hidden child 11 +RSInterface 3 has hidden child 12 +RSInterface 11 has hidden child 64 +RSInterface 12 has hidden child 103 +RSInterface 14 has hidden child 87 +RSInterface 26 has hidden child 4 +RSInterface 26 has hidden child 6 +RSInterface 26 has hidden child 8 +RSInterface 26 has hidden child 10 +RSInterface 26 has hidden child 12 +RSInterface 26 has hidden child 14 +RSInterface 26 has hidden child 16 +RSInterface 26 has hidden child 18 +RSInterface 26 has hidden child 20 +RSInterface 26 has hidden child 22 +RSInterface 26 has hidden child 24 +RSInterface 26 has hidden child 26 +RSInterface 26 has hidden child 28 +RSInterface 26 has hidden child 30 +RSInterface 26 has hidden child 32 +RSInterface 26 has hidden child 34 +RSInterface 26 has hidden child 36 +RSInterface 26 has hidden child 38 +RSInterface 26 has hidden child 40 +RSInterface 26 has hidden child 42 +RSInterface 26 has hidden child 44 +RSInterface 26 has hidden child 46 +RSInterface 26 has hidden child 48 +RSInterface 26 has hidden child 50 +RSInterface 26 has hidden child 52 +RSInterface 26 has hidden child 54 +RSInterface 26 has hidden child 56 +RSInterface 26 has hidden child 58 +RSInterface 26 has hidden child 60 +RSInterface 26 has hidden child 62 +RSInterface 26 has hidden child 72 +RSInterface 27 has hidden child 10 +RSInterface 27 has hidden child 12 +RSInterface 27 has hidden child 14 +RSInterface 27 has hidden child 16 +RSInterface 27 has hidden child 18 +RSInterface 27 has hidden child 20 +RSInterface 27 has hidden child 22 +RSInterface 27 has hidden child 24 +RSInterface 27 has hidden child 26 +RSInterface 27 has hidden child 28 +RSInterface 27 has hidden child 30 +RSInterface 27 has hidden child 32 +RSInterface 27 has hidden child 34 +RSInterface 27 has hidden child 36 +RSInterface 27 has hidden child 38 +RSInterface 27 has hidden child 70 +RSInterface 27 has hidden child 72 +RSInterface 27 has hidden child 74 +RSInterface 27 has hidden child 76 +RSInterface 27 has hidden child 78 +RSInterface 27 has hidden child 80 +RSInterface 27 has hidden child 82 +RSInterface 27 has hidden child 84 +RSInterface 27 has hidden child 86 +RSInterface 27 has hidden child 88 +RSInterface 27 has hidden child 90 +RSInterface 27 has hidden child 92 +RSInterface 27 has hidden child 94 +RSInterface 27 has hidden child 96 +RSInterface 27 has hidden child 98 +RSInterface 28 has hidden child 117 +RSInterface 33 has hidden child 115 +RSInterface 36 has hidden child 124 +RSInterface 37 has hidden child 115 +RSInterface 40 has hidden child 116 +RSInterface 41 has hidden child 115 +RSInterface 44 has hidden child 150 +RSInterface 45 has hidden child 115 +RSInterface 49 has hidden child 39 +RSInterface 49 has hidden child 41 +RSInterface 49 has hidden child 43 +RSInterface 49 has hidden child 45 +RSInterface 49 has hidden child 47 +RSInterface 49 has hidden child 49 +RSInterface 49 has hidden child 51 +RSInterface 49 has hidden child 53 +RSInterface 49 has hidden child 55 +RSInterface 49 has hidden child 57 +RSInterface 49 has hidden child 59 +RSInterface 49 has hidden child 61 +RSInterface 49 has hidden child 63 +RSInterface 49 has hidden child 65 +RSInterface 49 has hidden child 67 +RSInterface 49 has hidden child 69 +RSInterface 49 has hidden child 71 +RSInterface 49 has hidden child 73 +RSInterface 49 has hidden child 75 +RSInterface 49 has hidden child 77 +RSInterface 49 has hidden child 79 +RSInterface 49 has hidden child 81 +RSInterface 51 has hidden child 28 +RSInterface 51 has hidden child 29 +RSInterface 52 has hidden child 3 +RSInterface 52 has hidden child 6 +RSInterface 52 has hidden child 13 +RSInterface 53 has hidden child 22 +RSInterface 53 has hidden child 23 +RSInterface 53 has hidden child 24 +RSInterface 53 has hidden child 36 +RSInterface 53 has hidden child 40 +RSInterface 53 has hidden child 41 +RSInterface 53 has hidden child 44 +RSInterface 53 has hidden child 47 +RSInterface 53 has hidden child 50 +RSInterface 75 has hidden child 12 +RSInterface 76 has hidden child 10 +RSInterface 77 has hidden child 10 +RSInterface 78 has hidden child 12 +RSInterface 79 has hidden child 10 +RSInterface 81 has hidden child 12 +RSInterface 82 has hidden child 12 +RSInterface 83 has hidden child 12 +RSInterface 84 has hidden child 10 +RSInterface 85 has hidden child 10 +RSInterface 87 has hidden child 12 +RSInterface 88 has hidden child 12 +RSInterface 89 has hidden child 12 +RSInterface 90 has hidden child 13 +RSInterface 90 has hidden child 15 +RSInterface 90 has hidden child 17 +RSInterface 90 has hidden child 19 +RSInterface 90 has hidden child 21 +RSInterface 90 has hidden child 23 +RSInterface 90 has hidden child 25 +RSInterface 90 has hidden child 27 +RSInterface 90 has hidden child 29 +RSInterface 90 has hidden child 31 +RSInterface 90 has hidden child 33 +RSInterface 90 has hidden child 35 +RSInterface 90 has hidden child 37 +RSInterface 90 has hidden child 39 +RSInterface 90 has hidden child 41 +RSInterface 90 has hidden child 43 +RSInterface 90 has hidden child 45 +RSInterface 90 has hidden child 47 +RSInterface 90 has hidden child 49 +RSInterface 90 has hidden child 51 +RSInterface 90 has hidden child 53 +RSInterface 90 has hidden child 55 +RSInterface 90 has hidden child 57 +RSInterface 90 has hidden child 59 +RSInterface 90 has hidden child 61 +RSInterface 90 has hidden child 63 +RSInterface 90 has hidden child 65 +RSInterface 90 has hidden child 67 +RSInterface 90 has hidden child 69 +RSInterface 90 has hidden child 71 +RSInterface 90 has hidden child 73 +RSInterface 90 has hidden child 75 +RSInterface 90 has hidden child 77 +RSInterface 90 has hidden child 79 +RSInterface 90 has hidden child 81 +RSInterface 90 has hidden child 87 +RSInterface 90 has hidden child 113 +RSInterface 90 has hidden child 115 +RSInterface 90 has hidden child 117 +RSInterface 90 has hidden child 119 +RSInterface 90 has hidden child 121 +RSInterface 90 has hidden child 123 +RSInterface 90 has hidden child 125 +RSInterface 90 has hidden child 127 +RSInterface 90 has hidden child 129 +RSInterface 90 has hidden child 131 +RSInterface 90 has hidden child 133 +RSInterface 90 has hidden child 135 +RSInterface 90 has hidden child 137 +RSInterface 90 has hidden child 139 +RSInterface 90 has hidden child 141 +RSInterface 90 has hidden child 143 +RSInterface 90 has hidden child 145 +RSInterface 90 has hidden child 147 +RSInterface 90 has hidden child 149 +RSInterface 90 has hidden child 151 +RSInterface 90 has hidden child 153 +RSInterface 90 has hidden child 155 +RSInterface 90 has hidden child 157 +RSInterface 90 has hidden child 159 +RSInterface 90 has hidden child 161 +RSInterface 90 has hidden child 163 +RSInterface 90 has hidden child 165 +RSInterface 90 has hidden child 167 +RSInterface 90 has hidden child 169 +RSInterface 90 has hidden child 171 +RSInterface 90 has hidden child 173 +RSInterface 90 has hidden child 175 +RSInterface 90 has hidden child 177 +RSInterface 90 has hidden child 179 +RSInterface 90 has hidden child 181 +RSInterface 91 has hidden child 10 +RSInterface 92 has hidden child 10 +RSInterface 93 has hidden child 10 +RSInterface 99 has hidden child 27 +RSInterface 99 has hidden child 29 +RSInterface 102 has hidden child 29 +RSInterface 103 has hidden child 7 +RSInterface 105 has hidden child 19 +RSInterface 105 has hidden child 35 +RSInterface 105 has hidden child 51 +RSInterface 105 has hidden child 66 +RSInterface 105 has hidden child 70 +RSInterface 105 has hidden child 85 +RSInterface 105 has hidden child 89 +RSInterface 105 has hidden child 104 +RSInterface 105 has hidden child 108 +RSInterface 105 has hidden child 123 +RSInterface 105 has hidden child 126 +RSInterface 105 has hidden child 156 +RSInterface 105 has hidden child 192 +RSInterface 105 has hidden child 197 +RSInterface 105 has hidden child 200 +RSInterface 106 has hidden child 19 +RSInterface 106 has hidden child 33 +RSInterface 106 has hidden child 47 +RSInterface 106 has hidden child 60 +RSInterface 106 has hidden child 64 +RSInterface 106 has hidden child 77 +RSInterface 106 has hidden child 81 +RSInterface 106 has hidden child 94 +RSInterface 106 has hidden child 98 +RSInterface 106 has hidden child 111 +RSInterface 106 has hidden child 126 +RSInterface 106 has hidden child 131 +RSInterface 106 has hidden child 140 +RSInterface 111 has hidden child 1 +RSInterface 111 has hidden child 41 +RSInterface 111 has hidden child 43 +RSInterface 111 has hidden child 45 +RSInterface 111 has hidden child 47 +RSInterface 111 has hidden child 49 +RSInterface 111 has hidden child 51 +RSInterface 111 has hidden child 53 +RSInterface 111 has hidden child 55 +RSInterface 111 has hidden child 57 +RSInterface 111 has hidden child 59 +RSInterface 111 has hidden child 61 +RSInterface 111 has hidden child 63 +RSInterface 111 has hidden child 65 +RSInterface 111 has hidden child 67 +RSInterface 111 has hidden child 69 +RSInterface 111 has hidden child 71 +RSInterface 111 has hidden child 73 +RSInterface 111 has hidden child 75 +RSInterface 111 has hidden child 77 +RSInterface 111 has hidden child 79 +RSInterface 111 has hidden child 81 +RSInterface 111 has hidden child 83 +RSInterface 112 has hidden child 10 +RSInterface 113 has hidden child 16 +RSInterface 127 has hidden child 21 +RSInterface 127 has hidden child 23 +RSInterface 127 has hidden child 25 +RSInterface 127 has hidden child 27 +RSInterface 128 has hidden child 18 +RSInterface 128 has hidden child 20 +RSInterface 128 has hidden child 22 +RSInterface 128 has hidden child 24 +RSInterface 128 has hidden child 26 +RSInterface 128 has hidden child 28 +RSInterface 128 has hidden child 30 +RSInterface 128 has hidden child 32 +RSInterface 129 has hidden child 26 +RSInterface 129 has hidden child 28 +RSInterface 129 has hidden child 30 +RSInterface 129 has hidden child 32 +RSInterface 129 has hidden child 34 +RSInterface 129 has hidden child 36 +RSInterface 129 has hidden child 38 +RSInterface 129 has hidden child 40 +RSInterface 129 has hidden child 42 +RSInterface 129 has hidden child 44 +RSInterface 129 has hidden child 46 +RSInterface 129 has hidden child 48 +RSInterface 130 has hidden child 40 +RSInterface 130 has hidden child 42 +RSInterface 130 has hidden child 44 +RSInterface 130 has hidden child 46 +RSInterface 130 has hidden child 48 +RSInterface 130 has hidden child 50 +RSInterface 130 has hidden child 52 +RSInterface 130 has hidden child 54 +RSInterface 130 has hidden child 56 +RSInterface 130 has hidden child 58 +RSInterface 130 has hidden child 60 +RSInterface 130 has hidden child 62 +RSInterface 130 has hidden child 64 +RSInterface 130 has hidden child 66 +RSInterface 130 has hidden child 68 +RSInterface 130 has hidden child 70 +RSInterface 130 has hidden child 72 +RSInterface 130 has hidden child 74 +RSInterface 130 has hidden child 76 +RSInterface 138 has hidden child 20 +RSInterface 138 has hidden child 21 +RSInterface 138 has hidden child 22 +RSInterface 138 has hidden child 23 +RSInterface 138 has hidden child 24 +RSInterface 138 has hidden child 25 +RSInterface 144 has hidden child 245 +RSInterface 144 has hidden child 259 +RSInterface 144 has hidden child 278 +RSInterface 144 has hidden child 298 +RSInterface 144 has hidden child 309 +RSInterface 144 has hidden child 321 +RSInterface 144 has hidden child 341 +RSInterface 144 has hidden child 355 +RSInterface 151 has hidden child 0 +RSInterface 151 has hidden child 1 +RSInterface 151 has hidden child 2 +RSInterface 151 has hidden child 3 +RSInterface 151 has hidden child 4 +RSInterface 151 has hidden child 5 +RSInterface 151 has hidden child 6 +RSInterface 151 has hidden child 7 +RSInterface 151 has hidden child 8 +RSInterface 152 has hidden child 0 +RSInterface 152 has hidden child 1 +RSInterface 152 has hidden child 2 +RSInterface 152 has hidden child 3 +RSInterface 152 has hidden child 4 +RSInterface 152 has hidden child 5 +RSInterface 152 has hidden child 6 +RSInterface 181 has hidden child 7 +RSInterface 181 has hidden child 8 +RSInterface 181 has hidden child 9 +RSInterface 181 has hidden child 10 +RSInterface 181 has hidden child 11 +RSInterface 181 has hidden child 12 +RSInterface 183 has hidden child 15 +RSInterface 183 has hidden child 16 +RSInterface 183 has hidden child 39 +RSInterface 183 has hidden child 43 +RSInterface 183 has hidden child 47 +RSInterface 183 has hidden child 50 +RSInterface 194 has hidden child 14 +RSInterface 194 has hidden child 15 +RSInterface 194 has hidden child 16 +RSInterface 194 has hidden child 17 +RSInterface 194 has hidden child 18 +RSInterface 195 has hidden child 4 +RSInterface 195 has hidden child 5 +RSInterface 195 has hidden child 6 +RSInterface 195 has hidden child 7 +RSInterface 208 has hidden child 0 +RSInterface 221 has hidden child 1 +RSInterface 232 has hidden child 8 +RSInterface 233 has hidden child 8 +RSInterface 234 has hidden child 9 +RSInterface 235 has hidden child 9 +RSInterface 236 has hidden child 6 +RSInterface 237 has hidden child 8 +RSInterface 238 has hidden child 9 +RSInterface 240 has hidden child 7 +RSInterface 240 has hidden child 12 +RSInterface 240 has hidden child 17 +RSInterface 240 has hidden child 22 +RSInterface 240 has hidden child 26 +RSInterface 252 has hidden child 2 +RSInterface 253 has hidden child 2 +RSInterface 255 has hidden child 2 +RSInterface 261 has hidden child 52 +RSInterface 261 has hidden child 54 +RSInterface 261 has hidden child 56 +RSInterface 261 has hidden child 58 +RSInterface 262 has hidden child 8 +RSInterface 262 has hidden child 10 +RSInterface 262 has hidden child 12 +RSInterface 262 has hidden child 14 +RSInterface 262 has hidden child 16 +RSInterface 262 has hidden child 18 +RSInterface 262 has hidden child 20 +RSInterface 262 has hidden child 22 +RSInterface 262 has hidden child 24 +RSInterface 262 has hidden child 26 +RSInterface 262 has hidden child 28 +RSInterface 262 has hidden child 30 +RSInterface 262 has hidden child 32 +RSInterface 262 has hidden child 34 +RSInterface 262 has hidden child 36 +RSInterface 267 has hidden child 4 +RSInterface 270 has hidden child 60 +RSInterface 275 has hidden child 176 +RSInterface 281 has hidden child 7 +RSInterface 287 has hidden child 0 +RSInterface 292 has hidden child 31 +RSInterface 292 has hidden child 32 +RSInterface 292 has hidden child 33 +RSInterface 292 has hidden child 34 +RSInterface 292 has hidden child 35 +RSInterface 292 has hidden child 36 +RSInterface 292 has hidden child 37 +RSInterface 292 has hidden child 38 +RSInterface 292 has hidden child 39 +RSInterface 292 has hidden child 40 +RSInterface 292 has hidden child 41 +RSInterface 292 has hidden child 42 +RSInterface 292 has hidden child 43 +RSInterface 292 has hidden child 44 +RSInterface 292 has hidden child 45 +RSInterface 292 has hidden child 46 +RSInterface 292 has hidden child 47 +RSInterface 292 has hidden child 48 +RSInterface 297 has hidden child 11 +RSInterface 297 has hidden child 13 +RSInterface 299 has hidden child 51 +RSInterface 300 has hidden child 66 +RSInterface 300 has hidden child 82 +RSInterface 300 has hidden child 90 +RSInterface 300 has hidden child 98 +RSInterface 300 has hidden child 162 +RSInterface 300 has hidden child 170 +RSInterface 300 has hidden child 210 +RSInterface 300 has hidden child 250 +RSInterface 300 has hidden child 267 +RSInterface 301 has hidden child 13 +RSInterface 301 has hidden child 18 +RSInterface 301 has hidden child 23 +RSInterface 301 has hidden child 28 +RSInterface 301 has hidden child 33 +RSInterface 301 has hidden child 38 +RSInterface 301 has hidden child 43 +RSInterface 301 has hidden child 48 +RSInterface 301 has hidden child 53 +RSInterface 316 has hidden child 0 +RSInterface 324 has hidden child 91 +RSInterface 325 has hidden child 90 +RSInterface 329 has hidden child 4 +RSInterface 329 has hidden child 23 +RSInterface 329 has hidden child 27 +RSInterface 329 has hidden child 31 +RSInterface 332 has hidden child 90 +RSInterface 334 has hidden child 17 +RSInterface 334 has hidden child 19 +RSInterface 334 has hidden child 37 +RSInterface 334 has hidden child 38 +RSInterface 334 has hidden child 39 +RSInterface 334 has hidden child 40 +RSInterface 334 has hidden child 41 +RSInterface 334 has hidden child 42 +RSInterface 334 has hidden child 43 +RSInterface 334 has hidden child 45 +RSInterface 335 has hidden child 13 +RSInterface 335 has hidden child 14 +RSInterface 335 has hidden child 39 +RSInterface 335 has hidden child 40 +RSInterface 335 has hidden child 41 +RSInterface 337 has hidden child 3 +RSInterface 339 has hidden child 2 +RSInterface 340 has hidden child 2 +RSInterface 341 has hidden child 2 +RSInterface 342 has hidden child 2 +RSInterface 358 has hidden child 52 +RSInterface 360 has hidden child 77 +RSInterface 363 has hidden child 5 +RSInterface 369 has hidden child 59 +RSInterface 383 has hidden child 6 +RSInterface 383 has hidden child 9 +RSInterface 383 has hidden child 12 +RSInterface 383 has hidden child 15 +RSInterface 383 has hidden child 18 +RSInterface 389 has hidden child 0 +RSInterface 390 has hidden child 2 +RSInterface 391 has hidden child 139 +RSInterface 391 has hidden child 141 +RSInterface 415 has hidden child 7 +RSInterface 415 has hidden child 9 +RSInterface 415 has hidden child 11 +RSInterface 415 has hidden child 22 +RSInterface 415 has hidden child 24 +RSInterface 415 has hidden child 26 +RSInterface 415 has hidden child 28 +RSInterface 415 has hidden child 30 +RSInterface 415 has hidden child 32 +RSInterface 415 has hidden child 34 +RSInterface 415 has hidden child 36 +RSInterface 415 has hidden child 38 +RSInterface 415 has hidden child 40 +RSInterface 415 has hidden child 48 +RSInterface 415 has hidden child 50 +RSInterface 415 has hidden child 52 +RSInterface 415 has hidden child 54 +RSInterface 415 has hidden child 56 +RSInterface 416 has hidden child 9 +RSInterface 416 has hidden child 12 +RSInterface 416 has hidden child 15 +RSInterface 424 has hidden child 3 +RSInterface 429 has hidden child 98 +RSInterface 429 has hidden child 99 +RSInterface 429 has hidden child 100 +RSInterface 429 has hidden child 101 +RSInterface 429 has hidden child 102 +RSInterface 429 has hidden child 103 +RSInterface 429 has hidden child 104 +RSInterface 429 has hidden child 105 +RSInterface 429 has hidden child 106 +RSInterface 429 has hidden child 107 +RSInterface 429 has hidden child 108 +RSInterface 429 has hidden child 109 +RSInterface 429 has hidden child 111 +RSInterface 434 has hidden child 101 +RSInterface 434 has hidden child 112 +RSInterface 434 has hidden child 121 +RSInterface 434 has hidden child 134 +RSInterface 434 has hidden child 141 +RSInterface 435 has hidden child 99 +RSInterface 435 has hidden child 108 +RSInterface 435 has hidden child 121 +RSInterface 435 has hidden child 128 +RSInterface 436 has hidden child 103 +RSInterface 436 has hidden child 110 +RSInterface 436 has hidden child 119 +RSInterface 436 has hidden child 128 +RSInterface 436 has hidden child 137 +RSInterface 436 has hidden child 148 +RSInterface 436 has hidden child 161 +RSInterface 437 has hidden child 97 +RSInterface 437 has hidden child 104 +RSInterface 437 has hidden child 113 +RSInterface 437 has hidden child 120 +RSInterface 443 has hidden child 6 +RSInterface 445 has hidden child 35 +RSInterface 447 has hidden child 96 +RSInterface 451 has hidden child 7 +RSInterface 460 has hidden child 1 +RSInterface 460 has hidden child 3 +RSInterface 460 has hidden child 5 +RSInterface 460 has hidden child 7 +RSInterface 460 has hidden child 11 +RSInterface 460 has hidden child 12 +RSInterface 460 has hidden child 14 +RSInterface 460 has hidden child 16 +RSInterface 460 has hidden child 18 +RSInterface 461 has hidden child 10 +RSInterface 461 has hidden child 11 +RSInterface 461 has hidden child 12 +RSInterface 461 has hidden child 13 +RSInterface 463 has hidden child 5 +RSInterface 467 has hidden child 163 +RSInterface 467 has hidden child 166 +RSInterface 467 has hidden child 168 +RSInterface 467 has hidden child 170 +RSInterface 467 has hidden child 172 +RSInterface 467 has hidden child 174 +RSInterface 467 has hidden child 176 +RSInterface 467 has hidden child 178 +RSInterface 467 has hidden child 180 +RSInterface 467 has hidden child 182 +RSInterface 467 has hidden child 184 +RSInterface 467 has hidden child 186 +RSInterface 467 has hidden child 188 +RSInterface 467 has hidden child 190 +RSInterface 467 has hidden child 192 +RSInterface 467 has hidden child 194 +RSInterface 467 has hidden child 196 +RSInterface 467 has hidden child 198 +RSInterface 467 has hidden child 200 +RSInterface 467 has hidden child 202 +RSInterface 467 has hidden child 204 +RSInterface 467 has hidden child 206 +RSInterface 467 has hidden child 208 +RSInterface 467 has hidden child 210 +RSInterface 467 has hidden child 212 +RSInterface 467 has hidden child 214 +RSInterface 467 has hidden child 216 +RSInterface 467 has hidden child 218 +RSInterface 467 has hidden child 220 +RSInterface 467 has hidden child 222 +RSInterface 467 has hidden child 224 +RSInterface 468 has hidden child 6 +RSInterface 469 has hidden child 15 +RSInterface 469 has hidden child 24 +RSInterface 469 has hidden child 26 +RSInterface 469 has hidden child 27 +RSInterface 469 has hidden child 29 +RSInterface 469 has hidden child 31 +RSInterface 469 has hidden child 34 +RSInterface 473 has hidden child 10 +RSInterface 474 has hidden child 10 +RSInterface 475 has hidden child 10 +RSInterface 476 has hidden child 10 +RSInterface 480 has hidden child 4 +RSInterface 480 has hidden child 50 +RSInterface 480 has hidden child 51 +RSInterface 480 has hidden child 52 +RSInterface 480 has hidden child 53 +RSInterface 480 has hidden child 54 +RSInterface 480 has hidden child 55 +RSInterface 480 has hidden child 56 +RSInterface 480 has hidden child 57 +RSInterface 484 has hidden child 29 +RSInterface 488 has hidden child 12 +RSInterface 488 has hidden child 16 +RSInterface 488 has hidden child 22 +RSInterface 488 has hidden child 28 +RSInterface 489 has hidden child 16 +RSInterface 489 has hidden child 17 +RSInterface 489 has hidden child 18 +RSInterface 489 has hidden child 19 +RSInterface 491 has hidden child 209 +RSInterface 492 has hidden child 49 +RSInterface 492 has hidden child 51 +RSInterface 493 has hidden child 17 +RSInterface 493 has hidden child 40 +RSInterface 493 has hidden child 42 +RSInterface 493 has hidden child 44 +RSInterface 493 has hidden child 46 +RSInterface 493 has hidden child 48 +RSInterface 493 has hidden child 50 +RSInterface 496 has hidden child 15 +RSInterface 497 has hidden child 60 +RSInterface 497 has hidden child 61 +RSInterface 497 has hidden child 75 +RSInterface 501 has hidden child 13 +RSInterface 501 has hidden child 16 +RSInterface 501 has hidden child 19 +RSInterface 501 has hidden child 22 +RSInterface 501 has hidden child 25 +RSInterface 502 has hidden child 13 +RSInterface 502 has hidden child 16 +RSInterface 502 has hidden child 19 +RSInterface 502 has hidden child 22 +RSInterface 502 has hidden child 25 +RSInterface 503 has hidden child 6 +RSInterface 508 has hidden child 9 +RSInterface 508 has hidden child 11 +RSInterface 508 has hidden child 13 +RSInterface 508 has hidden child 15 +RSInterface 508 has hidden child 17 +RSInterface 508 has hidden child 19 +RSInterface 508 has hidden child 21 +RSInterface 508 has hidden child 23 +RSInterface 508 has hidden child 25 +RSInterface 508 has hidden child 27 +RSInterface 508 has hidden child 29 +RSInterface 508 has hidden child 31 +RSInterface 508 has hidden child 33 +RSInterface 508 has hidden child 35 +RSInterface 509 has hidden child 3 +RSInterface 509 has hidden child 5 +RSInterface 509 has hidden child 15 +RSInterface 509 has hidden child 20 +RSInterface 509 has hidden child 27 +RSInterface 509 has hidden child 30 +RSInterface 509 has hidden child 33 +RSInterface 509 has hidden child 42 +RSInterface 509 has hidden child 45 +RSInterface 509 has hidden child 50 +RSInterface 509 has hidden child 53 +RSInterface 510 has hidden child 7 +RSInterface 510 has hidden child 13 +RSInterface 510 has hidden child 41 +RSInterface 510 has hidden child 44 +RSInterface 510 has hidden child 47 +RSInterface 510 has hidden child 50 +RSInterface 510 has hidden child 53 +RSInterface 510 has hidden child 56 +RSInterface 510 has hidden child 58 +RSInterface 510 has hidden child 61 +RSInterface 510 has hidden child 63 +RSInterface 510 has hidden child 66 +RSInterface 510 has hidden child 68 +RSInterface 510 has hidden child 71 +RSInterface 510 has hidden child 73 +RSInterface 510 has hidden child 78 +RSInterface 510 has hidden child 81 +RSInterface 510 has hidden child 83 +RSInterface 510 has hidden child 86 +RSInterface 510 has hidden child 89 +RSInterface 510 has hidden child 94 +RSInterface 510 has hidden child 101 +RSInterface 510 has hidden child 104 +RSInterface 510 has hidden child 108 +RSInterface 510 has hidden child 111 +RSInterface 510 has hidden child 118 +RSInterface 510 has hidden child 120 +RSInterface 510 has hidden child 122 +RSInterface 510 has hidden child 124 +RSInterface 510 has hidden child 126 +RSInterface 510 has hidden child 130 +RSInterface 510 has hidden child 139 +RSInterface 510 has hidden child 141 +RSInterface 510 has hidden child 147 +RSInterface 510 has hidden child 149 +RSInterface 511 has hidden child 16 +RSInterface 511 has hidden child 19 +RSInterface 511 has hidden child 23 +RSInterface 511 has hidden child 27 +RSInterface 511 has hidden child 31 +RSInterface 520 has hidden child 0 +RSInterface 520 has hidden child 2 +RSInterface 520 has hidden child 4 +RSInterface 520 has hidden child 6 +RSInterface 520 has hidden child 8 +RSInterface 520 has hidden child 10 +RSInterface 520 has hidden child 12 +RSInterface 520 has hidden child 14 +RSInterface 520 has hidden child 16 +RSInterface 520 has hidden child 18 +RSInterface 521 has hidden child 15 +RSInterface 521 has hidden child 72 +RSInterface 521 has hidden child 74 +RSInterface 521 has hidden child 76 +RSInterface 523 has hidden child 101 +RSInterface 527 has hidden child 3 +RSInterface 527 has hidden child 6 +RSInterface 527 has hidden child 9 +RSInterface 527 has hidden child 12 +RSInterface 527 has hidden child 15 +RSInterface 527 has hidden child 18 +RSInterface 527 has hidden child 21 +RSInterface 527 has hidden child 24 +RSInterface 527 has hidden child 27 +RSInterface 527 has hidden child 30 +RSInterface 527 has hidden child 33 +RSInterface 527 has hidden child 39 +RSInterface 527 has hidden child 64 +RSInterface 527 has hidden child 66 +RSInterface 527 has hidden child 68 +RSInterface 527 has hidden child 70 +RSInterface 527 has hidden child 72 +RSInterface 527 has hidden child 74 +RSInterface 527 has hidden child 76 +RSInterface 527 has hidden child 78 +RSInterface 527 has hidden child 80 +RSInterface 527 has hidden child 82 +RSInterface 527 has hidden child 84 +RSInterface 527 has hidden child 86 +RSInterface 527 has hidden child 88 +RSInterface 527 has hidden child 90 +RSInterface 527 has hidden child 92 +RSInterface 527 has hidden child 94 +RSInterface 527 has hidden child 96 +RSInterface 527 has hidden child 98 +RSInterface 527 has hidden child 100 +RSInterface 527 has hidden child 102 +RSInterface 527 has hidden child 104 +RSInterface 527 has hidden child 106 +RSInterface 527 has hidden child 107 +RSInterface 527 has hidden child 114 +RSInterface 527 has hidden child 117 +RSInterface 527 has hidden child 120 +RSInterface 527 has hidden child 123 +RSInterface 527 has hidden child 126 +RSInterface 527 has hidden child 129 +RSInterface 527 has hidden child 132 +RSInterface 527 has hidden child 135 +RSInterface 527 has hidden child 138 +RSInterface 527 has hidden child 141 +RSInterface 527 has hidden child 144 +RSInterface 527 has hidden child 149 +RSInterface 527 has hidden child 151 +RSInterface 527 has hidden child 155 +RSInterface 527 has hidden child 158 +RSInterface 527 has hidden child 161 +RSInterface 527 has hidden child 164 +RSInterface 527 has hidden child 167 +RSInterface 527 has hidden child 170 +RSInterface 527 has hidden child 173 +RSInterface 527 has hidden child 176 +RSInterface 527 has hidden child 179 +RSInterface 527 has hidden child 182 +RSInterface 527 has hidden child 185 +RSInterface 527 has hidden child 188 +RSInterface 527 has hidden child 191 +RSInterface 527 has hidden child 194 +RSInterface 527 has hidden child 196 +RSInterface 530 has hidden child 5 +RSInterface 533 has hidden child 26 +RSInterface 533 has hidden child 27 +RSInterface 534 has hidden child 64 +RSInterface 535 has hidden child 2 +RSInterface 535 has hidden child 22 +RSInterface 535 has hidden child 24 +RSInterface 540 has hidden child 92 +RSInterface 540 has hidden child 127 +RSInterface 553 has hidden child 16 +RSInterface 559 has hidden child 7 +RSInterface 559 has hidden child 71 +RSInterface 591 has hidden child 64 +RSInterface 591 has hidden child 67 +RSInterface 591 has hidden child 70 +RSInterface 591 has hidden child 73 +RSInterface 591 has hidden child 76 +RSInterface 591 has hidden child 79 +RSInterface 591 has hidden child 82 +RSInterface 591 has hidden child 85 +RSInterface 591 has hidden child 88 +RSInterface 591 has hidden child 91 +RSInterface 591 has hidden child 94 +RSInterface 591 has hidden child 97 +RSInterface 591 has hidden child 100 +RSInterface 591 has hidden child 103 +RSInterface 591 has hidden child 106 +RSInterface 591 has hidden child 109 +RSInterface 591 has hidden child 112 +RSInterface 591 has hidden child 115 +RSInterface 591 has hidden child 118 +RSInterface 591 has hidden child 121 +RSInterface 591 has hidden child 124 +RSInterface 591 has hidden child 127 +RSInterface 591 has hidden child 130 +RSInterface 591 has hidden child 133 +RSInterface 591 has hidden child 136 +RSInterface 591 has hidden child 139 +RSInterface 591 has hidden child 142 +RSInterface 591 has hidden child 145 +RSInterface 591 has hidden child 148 +RSInterface 591 has hidden child 151 +RSInterface 591 has hidden child 154 +RSInterface 591 has hidden child 157 +RSInterface 591 has hidden child 160 +RSInterface 591 has hidden child 163 +RSInterface 591 has hidden child 166 +RSInterface 591 has hidden child 169 +RSInterface 591 has hidden child 172 +RSInterface 591 has hidden child 175 +RSInterface 591 has hidden child 176 +RSInterface 591 has hidden child 177 +RSInterface 591 has hidden child 178 +RSInterface 592 has hidden child 67 +RSInterface 592 has hidden child 70 +RSInterface 592 has hidden child 73 +RSInterface 592 has hidden child 76 +RSInterface 592 has hidden child 79 +RSInterface 592 has hidden child 82 +RSInterface 592 has hidden child 85 +RSInterface 592 has hidden child 88 +RSInterface 592 has hidden child 91 +RSInterface 592 has hidden child 94 +RSInterface 592 has hidden child 97 +RSInterface 592 has hidden child 100 +RSInterface 592 has hidden child 103 +RSInterface 592 has hidden child 106 +RSInterface 592 has hidden child 109 +RSInterface 592 has hidden child 112 +RSInterface 592 has hidden child 115 +RSInterface 592 has hidden child 118 +RSInterface 592 has hidden child 121 +RSInterface 592 has hidden child 124 +RSInterface 592 has hidden child 127 +RSInterface 592 has hidden child 130 +RSInterface 593 has hidden child 75 +RSInterface 593 has hidden child 78 +RSInterface 593 has hidden child 81 +RSInterface 593 has hidden child 84 +RSInterface 593 has hidden child 87 +RSInterface 593 has hidden child 90 +RSInterface 593 has hidden child 93 +RSInterface 593 has hidden child 96 +RSInterface 593 has hidden child 99 +RSInterface 593 has hidden child 102 +RSInterface 593 has hidden child 105 +RSInterface 593 has hidden child 108 +RSInterface 593 has hidden child 111 +RSInterface 593 has hidden child 114 +RSInterface 593 has hidden child 116 +RSInterface 594 has hidden child 64 +RSInterface 594 has hidden child 66 +RSInterface 594 has hidden child 70 +RSInterface 594 has hidden child 73 +RSInterface 594 has hidden child 76 +RSInterface 594 has hidden child 79 +RSInterface 594 has hidden child 82 +RSInterface 594 has hidden child 85 +RSInterface 594 has hidden child 88 +RSInterface 594 has hidden child 91 +RSInterface 594 has hidden child 94 +RSInterface 594 has hidden child 97 +RSInterface 594 has hidden child 100 +RSInterface 594 has hidden child 103 +RSInterface 594 has hidden child 106 +RSInterface 594 has hidden child 109 +RSInterface 594 has hidden child 112 +RSInterface 594 has hidden child 115 +RSInterface 594 has hidden child 118 +RSInterface 594 has hidden child 121 +RSInterface 594 has hidden child 124 +RSInterface 594 has hidden child 127 +RSInterface 594 has hidden child 130 +RSInterface 594 has hidden child 133 +RSInterface 594 has hidden child 136 +RSInterface 594 has hidden child 139 +RSInterface 594 has hidden child 142 +RSInterface 594 has hidden child 145 +RSInterface 594 has hidden child 148 +RSInterface 594 has hidden child 151 +RSInterface 594 has hidden child 154 +RSInterface 594 has hidden child 157 +RSInterface 594 has hidden child 160 +RSInterface 594 has hidden child 163 +RSInterface 594 has hidden child 166 +RSInterface 594 has hidden child 169 +RSInterface 594 has hidden child 172 +RSInterface 594 has hidden child 175 +RSInterface 594 has hidden child 176 +RSInterface 594 has hidden child 177 +RSInterface 594 has hidden child 178 +RSInterface 595 has hidden child 75 +RSInterface 595 has hidden child 78 +RSInterface 595 has hidden child 81 +RSInterface 595 has hidden child 84 +RSInterface 595 has hidden child 87 +RSInterface 595 has hidden child 90 +RSInterface 595 has hidden child 93 +RSInterface 595 has hidden child 96 +RSInterface 595 has hidden child 99 +RSInterface 595 has hidden child 102 +RSInterface 595 has hidden child 105 +RSInterface 595 has hidden child 108 +RSInterface 595 has hidden child 111 +RSInterface 595 has hidden child 114 +RSInterface 595 has hidden child 116 +RSInterface 596 has hidden child 67 +RSInterface 596 has hidden child 70 +RSInterface 596 has hidden child 73 +RSInterface 596 has hidden child 76 +RSInterface 596 has hidden child 79 +RSInterface 596 has hidden child 82 +RSInterface 596 has hidden child 85 +RSInterface 596 has hidden child 88 +RSInterface 596 has hidden child 91 +RSInterface 596 has hidden child 94 +RSInterface 596 has hidden child 97 +RSInterface 596 has hidden child 100 +RSInterface 596 has hidden child 103 +RSInterface 596 has hidden child 106 +RSInterface 596 has hidden child 109 +RSInterface 596 has hidden child 112 +RSInterface 596 has hidden child 115 +RSInterface 596 has hidden child 118 +RSInterface 596 has hidden child 121 +RSInterface 596 has hidden child 124 +RSInterface 596 has hidden child 127 +RSInterface 596 has hidden child 130 +RSInterface 596 has hidden child 133 +RSInterface 596 has hidden child 136 +RSInterface 596 has hidden child 139 +RSInterface 596 has hidden child 142 +RSInterface 596 has hidden child 145 +RSInterface 596 has hidden child 148 +RSInterface 596 has hidden child 151 +RSInterface 596 has hidden child 154 +RSInterface 596 has hidden child 157 +RSInterface 596 has hidden child 159 +RSInterface 596 has hidden child 166 +RSInterface 613 has hidden child 16 +RSInterface 619 has hidden child 45 +RSInterface 619 has hidden child 46 +RSInterface 619 has hidden child 47 +RSInterface 619 has hidden child 48 +RSInterface 619 has hidden child 49 +RSInterface 619 has hidden child 50 +RSInterface 619 has hidden child 51 +RSInterface 619 has hidden child 52 +RSInterface 619 has hidden child 53 +RSInterface 619 has hidden child 54 +RSInterface 619 has hidden child 55 +RSInterface 619 has hidden child 56 +RSInterface 619 has hidden child 57 +RSInterface 619 has hidden child 58 +RSInterface 620 has hidden child 25 +RSInterface 620 has hidden child 27 +RSInterface 624 has hidden child 35 +RSInterface 624 has hidden child 37 +RSInterface 624 has hidden child 39 +RSInterface 624 has hidden child 48 +RSInterface 624 has hidden child 50 +RSInterface 624 has hidden child 52 +RSInterface 624 has hidden child 54 +RSInterface 624 has hidden child 56 +RSInterface 624 has hidden child 58 +RSInterface 633 has hidden child 31 +RSInterface 634 has hidden child 32 +RSInterface 635 has hidden child 1 +RSInterface 635 has hidden child 2 +RSInterface 635 has hidden child 3 +RSInterface 635 has hidden child 4 +RSInterface 635 has hidden child 5 +RSInterface 635 has hidden child 6 +RSInterface 635 has hidden child 7 +RSInterface 635 has hidden child 8 +RSInterface 635 has hidden child 9 +RSInterface 635 has hidden child 10 +RSInterface 641 has hidden child 2 +RSInterface 641 has hidden child 3 +RSInterface 641 has hidden child 4 +RSInterface 641 has hidden child 5 +RSInterface 641 has hidden child 6 +RSInterface 641 has hidden child 7 +RSInterface 641 has hidden child 8 +RSInterface 641 has hidden child 9 +RSInterface 641 has hidden child 10 +RSInterface 641 has hidden child 11 +RSInterface 641 has hidden child 26 +RSInterface 653 has hidden child 8 +RSInterface 653 has hidden child 11 +RSInterface 656 has hidden child 8 +RSInterface 664 has hidden child 14 +RSInterface 680 has hidden child 10 +RSInterface 681 has hidden child 11 +RSInterface 681 has hidden child 18 +RSInterface 681 has hidden child 19 +RSInterface 681 has hidden child 20 +RSInterface 681 has hidden child 21 +RSInterface 681 has hidden child 22 +RSInterface 681 has hidden child 23 +RSInterface 681 has hidden child 24 +RSInterface 681 has hidden child 25 +RSInterface 681 has hidden child 26 +RSInterface 681 has hidden child 27 +RSInterface 681 has hidden child 28 +RSInterface 681 has hidden child 29 +RSInterface 681 has hidden child 30 +RSInterface 681 has hidden child 31 +RSInterface 681 has hidden child 32 +RSInterface 681 has hidden child 33 +RSInterface 681 has hidden child 34 +RSInterface 681 has hidden child 35 +RSInterface 681 has hidden child 36 +RSInterface 681 has hidden child 37 +RSInterface 681 has hidden child 39 +RSInterface 681 has hidden child 40 +RSInterface 681 has hidden child 41 +RSInterface 681 has hidden child 42 +RSInterface 681 has hidden child 43 +RSInterface 681 has hidden child 44 +RSInterface 681 has hidden child 45 +RSInterface 681 has hidden child 46 +RSInterface 681 has hidden child 47 +RSInterface 681 has hidden child 48 +RSInterface 681 has hidden child 49 +RSInterface 681 has hidden child 50 +RSInterface 681 has hidden child 51 +RSInterface 681 has hidden child 52 +RSInterface 681 has hidden child 53 +RSInterface 681 has hidden child 54 +RSInterface 681 has hidden child 55 +RSInterface 681 has hidden child 56 +RSInterface 681 has hidden child 57 +RSInterface 681 has hidden child 110 +RSInterface 681 has hidden child 111 +RSInterface 681 has hidden child 112 +RSInterface 682 has hidden child 29 +RSInterface 682 has hidden child 31 +RSInterface 683 has hidden child 24 +RSInterface 683 has hidden child 25 +RSInterface 683 has hidden child 26 +RSInterface 683 has hidden child 27 +RSInterface 683 has hidden child 28 +RSInterface 683 has hidden child 29 +RSInterface 683 has hidden child 30 +RSInterface 683 has hidden child 31 +RSInterface 683 has hidden child 32 +RSInterface 683 has hidden child 33 +RSInterface 683 has hidden child 43 +RSInterface 693 has hidden child 3 +RSInterface 694 has hidden child 20 +RSInterface 694 has hidden child 31 +RSInterface 694 has hidden child 34 +RSInterface 696 has hidden child 20 +RSInterface 696 has hidden child 31 +RSInterface 696 has hidden child 34 +RSInterface 697 has hidden child 26 +RSInterface 697 has hidden child 37 +RSInterface 697 has hidden child 40 +RSInterface 697 has hidden child 43 +RSInterface 699 has hidden child 20 +RSInterface 699 has hidden child 31 +RSInterface 699 has hidden child 34 +RSInterface 704 has hidden child 26 +RSInterface 704 has hidden child 37 +RSInterface 704 has hidden child 40 +RSInterface 704 has hidden child 43 +RSInterface 705 has hidden child 26 +RSInterface 705 has hidden child 37 +RSInterface 705 has hidden child 40 +RSInterface 705 has hidden child 43 +RSInterface 707 has hidden child 20 +RSInterface 707 has hidden child 31 +RSInterface 707 has hidden child 35 +RSInterface 708 has hidden child 20 +RSInterface 708 has hidden child 31 +RSInterface 708 has hidden child 34 +RSInterface 710 has hidden child 20 +RSInterface 710 has hidden child 31 +RSInterface 710 has hidden child 34 +RSInterface 714 has hidden child 0 +RSInterface 714 has hidden child 2 +RSInterface 714 has hidden child 4 +RSInterface 714 has hidden child 6 +RSInterface 716 has hidden child 39 +RSInterface 717 has hidden child 21 +RSInterface 717 has hidden child 33 +RSInterface 717 has hidden child 35 +RSInterface 730 has hidden child 23 +RSInterface 734 has hidden child 22 diff --git a/dumps/498/498_interface_configs.txt b/dumps/498/498_interface_configs.txt new file mode 100644 index 000000000..0497d9251 --- /dev/null +++ b/dumps/498/498_interface_configs.txt @@ -0,0 +1,2017 @@ +s suppInterface 4 child 1 config: [449, 7] +Interface 4 child 2 config: [449, 7] +Interface 4 child 3 config: [449, 7] +Interface 4 child 4 config: [449, 7] +Interface 4 child 5 config: [449, 7] +Interface 4 child 6 config: [449, 7] +Interface 4 child 7 config: [449, 7] +Interface 4 child 8 config: [449, 7] +Interface 4 child 9 config: [449, 7] +Interface 4 child 10 config: [449, 7] +Interface 4 child 12 config: [449, 12] +Interface 4 child 13 config: [449, 12] +Interface 4 child 14 config: [449, 12] +Interface 4 child 15 config: [449, 12] +Interface 4 child 17 config: [449, 12] +Interface 4 child 16 config: [449, 12] +Interface 4 child 19 config: [449, 12] +Interface 4 child 18 config: [449, 12] +Interface 4 child 21 config: [449, 12] +Interface 4 child 20 config: [449, 12] +Interface 4 child 25 config: [449, 12] +Interface 5 child 0 config: [309, 2] +Interface 5 child 1 config: [309, 2] +Interface 9 child 27 config: [0, 0] +Interface 9 child 29 config: [0, 0] +Interface 12 child 93 config: [115, 0] +Interface 12 child 92 config: [115, 0] +Interface 12 child 98 config: [304, 0] +Interface 12 child 99 config: [304, 0] +Interface 24 child 0 config: [453, 17] +Interface 28 child 77 config: [545, 0] +Interface 28 child 75 config: [545, 8] +Interface 28 child 102 config: [546, 0] +Interface 28 child 103 config: [546, 8] +Interface 28 child 100 config: [545, 16] +Interface 28 child 101 config: [545, 24] +Interface 28 child 110 config: [545, 16] +Interface 28 child 111 config: [545, 24] +Interface 28 child 108 config: [545, 0] +Interface 28 child 109 config: [545, 8] +Interface 28 child 106 config: [549, 8] +Interface 28 child 107 config: [547, 0], [543, 12] +Interface 28 child 104 config: [546, 24] +Interface 28 child 105 config: [546, 16] +Interface 28 child 116 config: [549, 8] +Interface 28 child 115 config: [546, 16] +Interface 28 child 114 config: [546, 24] +Interface 28 child 113 config: [546, 8] +Interface 28 child 112 config: [546, 0] +Interface 31 child 76 config: [261, 0] +Interface 31 child 77 config: [261, 0] +Interface 31 child 84 config: [261, 0] +Interface 31 child 87 config: [261, 0] +Interface 33 child 76 config: [355, 0] +Interface 33 child 78 config: [355, 0] +Interface 33 child 79 config: [355, 0] +Interface 33 child 86 config: [355, 2] +Interface 33 child 80 config: [355, 0] +Interface 33 child 102 config: [355, 2] +Interface 33 child 103 config: [355, 2] +Interface 33 child 100 config: [355, 2] +Interface 33 child 101 config: [355, 2] +Interface 33 child 110 config: [355, 2] +Interface 33 child 108 config: [355, 2] +Interface 33 child 109 config: [355, 2] +Interface 33 child 106 config: [355, 2] +Interface 33 child 107 config: [355, 2] +Interface 33 child 104 config: [355, 2] +Interface 33 child 105 config: [355, 2] +Interface 33 child 112 config: [356, 15] +Interface 37 child 76 config: [355, 0] +Interface 37 child 78 config: [355, 0] +Interface 37 child 79 config: [355, 0] +Interface 37 child 86 config: [355, 2] +Interface 37 child 80 config: [355, 0] +Interface 37 child 102 config: [355, 2] +Interface 37 child 103 config: [355, 2] +Interface 37 child 100 config: [355, 2] +Interface 37 child 101 config: [355, 2] +Interface 37 child 110 config: [355, 2] +Interface 37 child 108 config: [355, 2] +Interface 37 child 109 config: [355, 2] +Interface 37 child 106 config: [355, 2] +Interface 37 child 107 config: [355, 2] +Interface 37 child 104 config: [355, 2] +Interface 37 child 105 config: [355, 2] +Interface 37 child 112 config: [356, 15] +Interface 40 child 137 config: [644, 9] +Interface 40 child 136 config: [644, 8] +Interface 40 child 139 config: [644, 11] +Interface 40 child 138 config: [644, 10] +Interface 40 child 141 config: [644, 13] +Interface 40 child 140 config: [644, 12] +Interface 40 child 143 config: [644, 15] +Interface 40 child 142 config: [644, 14] +Interface 40 child 129 config: [644, 1] +Interface 40 child 128 config: [644, 0] +Interface 40 child 131 config: [644, 3] +Interface 40 child 130 config: [644, 2] +Interface 40 child 133 config: [644, 5] +Interface 40 child 132 config: [644, 4] +Interface 40 child 135 config: [644, 7] +Interface 40 child 134 config: [644, 6] +Interface 40 child 152 config: [644, 24] +Interface 40 child 153 config: [644, 25] +Interface 40 child 154 config: [644, 26] +Interface 40 child 155 config: [644, 27] +Interface 40 child 156 config: [644, 28] +Interface 40 child 157 config: [644, 29] +Interface 40 child 158 config: [644, 30] +Interface 40 child 159 config: [644, 31] +Interface 40 child 144 config: [644, 16] +Interface 40 child 145 config: [644, 17] +Interface 40 child 146 config: [644, 18] +Interface 40 child 147 config: [644, 19] +Interface 40 child 148 config: [644, 20] +Interface 40 child 149 config: [644, 21] +Interface 40 child 150 config: [644, 22] +Interface 40 child 151 config: [644, 23] +Interface 40 child 171 config: [645, 11] +Interface 40 child 170 config: [645, 10] +Interface 40 child 169 config: [645, 9] +Interface 40 child 168 config: [645, 8] +Interface 40 child 175 config: [645, 15] +Interface 40 child 174 config: [645, 14] +Interface 40 child 173 config: [645, 13] +Interface 40 child 172 config: [645, 12] +Interface 40 child 163 config: [645, 3] +Interface 40 child 162 config: [645, 2] +Interface 40 child 161 config: [645, 1] +Interface 40 child 160 config: [645, 0] +Interface 40 child 167 config: [645, 7] +Interface 40 child 166 config: [645, 6] +Interface 40 child 165 config: [645, 5] +Interface 40 child 164 config: [645, 4] +Interface 40 child 186 config: [646, 2] +Interface 40 child 187 config: [646, 3] +Interface 40 child 184 config: [646, 0] +Interface 40 child 185 config: [646, 1] +Interface 40 child 190 config: [646, 6] +Interface 40 child 191 config: [646, 7] +Interface 40 child 188 config: [646, 4] +Interface 40 child 189 config: [646, 5] +Interface 40 child 178 config: [645, 18] +Interface 40 child 179 config: [645, 19] +Interface 40 child 176 config: [645, 16] +Interface 40 child 177 config: [645, 17] +Interface 40 child 182 config: [645, 22] +Interface 40 child 183 config: [645, 23] +Interface 40 child 180 config: [645, 20] +Interface 40 child 181 config: [645, 21] +Interface 40 child 205 config: [646, 21] +Interface 40 child 204 config: [646, 20] +Interface 40 child 207 config: [646, 23] +Interface 40 child 206 config: [646, 22] +Interface 40 child 201 config: [646, 17] +Interface 40 child 200 config: [646, 16] +Interface 40 child 203 config: [646, 19] +Interface 40 child 202 config: [646, 18] +Interface 40 child 197 config: [646, 13] +Interface 40 child 196 config: [646, 12] +Interface 40 child 199 config: [646, 15] +Interface 40 child 198 config: [646, 14] +Interface 40 child 193 config: [646, 9] +Interface 40 child 192 config: [646, 8] +Interface 40 child 195 config: [646, 11] +Interface 40 child 194 config: [646, 10] +Interface 40 child 220 config: [647, 4] +Interface 40 child 221 config: [647, 5] +Interface 40 child 222 config: [647, 6] +Interface 40 child 223 config: [647, 7] +Interface 40 child 216 config: [647, 0] +Interface 40 child 217 config: [647, 1] +Interface 40 child 218 config: [647, 2] +Interface 40 child 219 config: [647, 3] +Interface 40 child 212 config: [646, 28] +Interface 40 child 213 config: [646, 29] +Interface 40 child 214 config: [646, 30] +Interface 40 child 215 config: [646, 31] +Interface 40 child 208 config: [646, 24] +Interface 40 child 209 config: [646, 25] +Interface 40 child 210 config: [646, 26] +Interface 40 child 211 config: [646, 27] +Interface 40 child 239 config: [647, 23] +Interface 40 child 238 config: [647, 22] +Interface 40 child 237 config: [647, 21] +Interface 40 child 236 config: [647, 20] +Interface 40 child 235 config: [647, 19] +Interface 40 child 234 config: [647, 18] +Interface 40 child 233 config: [647, 17] +Interface 40 child 232 config: [647, 16] +Interface 40 child 231 config: [647, 15] +Interface 40 child 230 config: [647, 14] +Interface 40 child 229 config: [647, 13] +Interface 40 child 228 config: [647, 12] +Interface 40 child 227 config: [647, 11] +Interface 40 child 226 config: [647, 10] +Interface 40 child 225 config: [647, 9] +Interface 40 child 224 config: [647, 8] +Interface 40 child 305 config: [644, 12] +Interface 40 child 304 config: [644, 11] +Interface 40 child 307 config: [644, 14] +Interface 40 child 306 config: [644, 13] +Interface 40 child 309 config: [644, 16] +Interface 40 child 308 config: [644, 15] +Interface 40 child 311 config: [644, 18] +Interface 40 child 310 config: [644, 17] +Interface 40 child 313 config: [644, 20] +Interface 40 child 312 config: [644, 19] +Interface 40 child 315 config: [644, 22] +Interface 40 child 314 config: [644, 21] +Interface 40 child 317 config: [644, 24] +Interface 40 child 316 config: [644, 23] +Interface 40 child 319 config: [644, 26] +Interface 40 child 318 config: [644, 25] +Interface 40 child 293 config: [644, 0] +Interface 40 child 294 config: [644, 1] +Interface 40 child 295 config: [644, 2] +Interface 40 child 296 config: [644, 3] +Interface 40 child 297 config: [644, 4] +Interface 40 child 298 config: [644, 5] +Interface 40 child 299 config: [644, 6] +Interface 40 child 300 config: [644, 7] +Interface 40 child 301 config: [644, 8] +Interface 40 child 302 config: [644, 9] +Interface 40 child 303 config: [644, 10] +Interface 40 child 343 config: [645, 18] +Interface 40 child 342 config: [645, 17] +Interface 40 child 341 config: [645, 16] +Interface 40 child 340 config: [645, 15] +Interface 40 child 339 config: [645, 14] +Interface 40 child 338 config: [645, 13] +Interface 40 child 337 config: [645, 12] +Interface 40 child 336 config: [645, 11] +Interface 40 child 351 config: [646, 2] +Interface 40 child 350 config: [646, 1] +Interface 40 child 349 config: [646, 0] +Interface 40 child 348 config: [645, 23] +Interface 40 child 347 config: [645, 22] +Interface 40 child 346 config: [645, 21] +Interface 40 child 345 config: [645, 20] +Interface 40 child 344 config: [645, 19] +Interface 40 child 326 config: [645, 1] +Interface 40 child 327 config: [645, 2] +Interface 40 child 324 config: [644, 31] +Interface 40 child 325 config: [645, 0] +Interface 40 child 322 config: [644, 29] +Interface 40 child 323 config: [644, 30] +Interface 40 child 320 config: [644, 27] +Interface 40 child 321 config: [644, 28] +Interface 40 child 334 config: [645, 9] +Interface 40 child 335 config: [645, 10] +Interface 40 child 332 config: [645, 7] +Interface 40 child 333 config: [645, 8] +Interface 40 child 330 config: [645, 5] +Interface 40 child 331 config: [645, 6] +Interface 40 child 328 config: [645, 3] +Interface 40 child 329 config: [645, 4] +Interface 40 child 373 config: [646, 24] +Interface 40 child 372 config: [646, 23] +Interface 40 child 375 config: [646, 26] +Interface 40 child 374 config: [646, 25] +Interface 40 child 369 config: [646, 20] +Interface 40 child 368 config: [646, 19] +Interface 40 child 371 config: [646, 22] +Interface 40 child 370 config: [646, 21] +Interface 40 child 381 config: [647, 0] +Interface 40 child 380 config: [646, 31] +Interface 40 child 383 config: [647, 2] +Interface 40 child 382 config: [647, 1] +Interface 40 child 377 config: [646, 28] +Interface 40 child 376 config: [646, 27] +Interface 40 child 379 config: [646, 30] +Interface 40 child 378 config: [646, 29] +Interface 40 child 356 config: [646, 7] +Interface 40 child 357 config: [646, 8] +Interface 40 child 358 config: [646, 9] +Interface 40 child 359 config: [646, 10] +Interface 40 child 352 config: [646, 3] +Interface 40 child 353 config: [646, 4] +Interface 40 child 354 config: [646, 5] +Interface 40 child 355 config: [646, 6] +Interface 40 child 364 config: [646, 15] +Interface 40 child 365 config: [646, 16] +Interface 40 child 366 config: [646, 17] +Interface 40 child 367 config: [646, 18] +Interface 40 child 360 config: [646, 11] +Interface 40 child 361 config: [646, 12] +Interface 40 child 362 config: [646, 13] +Interface 40 child 363 config: [646, 14] +Interface 40 child 402 config: [647, 21] +Interface 40 child 403 config: [647, 22] +Interface 40 child 400 config: [647, 19] +Interface 40 child 401 config: [647, 20] +Interface 40 child 404 config: [647, 23] +Interface 40 child 395 config: [647, 14] +Interface 40 child 394 config: [647, 13] +Interface 40 child 393 config: [647, 12] +Interface 40 child 392 config: [647, 11] +Interface 40 child 399 config: [647, 18] +Interface 40 child 398 config: [647, 17] +Interface 40 child 397 config: [647, 16] +Interface 40 child 396 config: [647, 15] +Interface 40 child 387 config: [647, 6] +Interface 40 child 386 config: [647, 5] +Interface 40 child 385 config: [647, 4] +Interface 40 child 384 config: [647, 3] +Interface 40 child 391 config: [647, 10] +Interface 40 child 390 config: [647, 9] +Interface 40 child 389 config: [647, 8] +Interface 40 child 388 config: [647, 7] +Interface 41 child 76 config: [355, 0] +Interface 41 child 78 config: [355, 0] +Interface 41 child 79 config: [355, 0] +Interface 41 child 86 config: [355, 2] +Interface 41 child 80 config: [355, 0] +Interface 41 child 102 config: [355, 2] +Interface 41 child 103 config: [355, 2] +Interface 41 child 100 config: [355, 2] +Interface 41 child 101 config: [355, 2] +Interface 41 child 110 config: [355, 2] +Interface 41 child 108 config: [355, 2] +Interface 41 child 109 config: [355, 2] +Interface 41 child 106 config: [355, 2] +Interface 41 child 107 config: [355, 2] +Interface 41 child 104 config: [355, 2] +Interface 41 child 105 config: [355, 2] +Interface 41 child 112 config: [356, 15] +Interface 43 child 110 config: [644, 4] +Interface 43 child 111 config: [644, 5] +Interface 43 child 108 config: [644, 2] +Interface 43 child 109 config: [644, 3] +Interface 43 child 106 config: [644, 0] +Interface 43 child 107 config: [644, 1] +Interface 43 child 119 config: [644, 13] +Interface 43 child 118 config: [644, 12] +Interface 43 child 117 config: [644, 11] +Interface 43 child 116 config: [644, 10] +Interface 43 child 115 config: [644, 9] +Interface 43 child 114 config: [644, 8] +Interface 43 child 113 config: [644, 7] +Interface 43 child 112 config: [644, 6] +Interface 43 child 127 config: [644, 21] +Interface 43 child 126 config: [644, 20] +Interface 43 child 125 config: [644, 19] +Interface 43 child 124 config: [644, 18] +Interface 43 child 123 config: [644, 17] +Interface 43 child 122 config: [644, 16] +Interface 43 child 121 config: [644, 15] +Interface 43 child 120 config: [644, 14] +Interface 43 child 137 config: [644, 31] +Interface 43 child 136 config: [644, 30] +Interface 43 child 139 config: [645, 1] +Interface 43 child 138 config: [645, 0] +Interface 43 child 141 config: [645, 3] +Interface 43 child 140 config: [645, 2] +Interface 43 child 143 config: [645, 5] +Interface 43 child 142 config: [645, 4] +Interface 43 child 129 config: [644, 23] +Interface 43 child 128 config: [644, 22] +Interface 43 child 131 config: [644, 25] +Interface 43 child 130 config: [644, 24] +Interface 43 child 133 config: [644, 27] +Interface 43 child 132 config: [644, 26] +Interface 43 child 135 config: [644, 29] +Interface 43 child 134 config: [644, 28] +Interface 43 child 152 config: [645, 14] +Interface 43 child 153 config: [645, 15] +Interface 43 child 154 config: [645, 16] +Interface 43 child 155 config: [645, 17] +Interface 43 child 156 config: [645, 18] +Interface 43 child 157 config: [645, 19] +Interface 43 child 158 config: [645, 20] +Interface 43 child 159 config: [645, 21] +Interface 43 child 144 config: [645, 6] +Interface 43 child 145 config: [645, 7] +Interface 43 child 146 config: [645, 8] +Interface 43 child 147 config: [645, 9] +Interface 43 child 148 config: [645, 10] +Interface 43 child 149 config: [645, 11] +Interface 43 child 150 config: [645, 12] +Interface 43 child 151 config: [645, 13] +Interface 43 child 171 config: [646, 9] +Interface 43 child 170 config: [646, 8] +Interface 43 child 169 config: [646, 7] +Interface 43 child 168 config: [646, 6] +Interface 43 child 175 config: [646, 13] +Interface 43 child 174 config: [646, 12] +Interface 43 child 173 config: [646, 11] +Interface 43 child 172 config: [646, 10] +Interface 43 child 163 config: [646, 1] +Interface 43 child 162 config: [646, 0] +Interface 43 child 161 config: [645, 23] +Interface 43 child 160 config: [645, 22] +Interface 43 child 167 config: [646, 5] +Interface 43 child 166 config: [646, 4] +Interface 43 child 165 config: [646, 3] +Interface 43 child 164 config: [646, 2] +Interface 43 child 186 config: [646, 24] +Interface 43 child 187 config: [646, 25] +Interface 43 child 184 config: [646, 22] +Interface 43 child 185 config: [646, 23] +Interface 43 child 190 config: [646, 28] +Interface 43 child 191 config: [646, 29] +Interface 43 child 188 config: [646, 26] +Interface 43 child 189 config: [646, 27] +Interface 43 child 178 config: [646, 16] +Interface 43 child 179 config: [646, 17] +Interface 43 child 176 config: [646, 14] +Interface 43 child 177 config: [646, 15] +Interface 43 child 182 config: [646, 20] +Interface 43 child 183 config: [646, 21] +Interface 43 child 180 config: [646, 18] +Interface 43 child 181 config: [646, 19] +Interface 43 child 205 config: [647, 11] +Interface 43 child 204 config: [647, 10] +Interface 43 child 207 config: [647, 13] +Interface 43 child 206 config: [647, 12] +Interface 43 child 201 config: [647, 7] +Interface 43 child 200 config: [647, 6] +Interface 43 child 203 config: [647, 9] +Interface 43 child 202 config: [647, 8] +Interface 43 child 197 config: [647, 3] +Interface 43 child 196 config: [647, 2] +Interface 43 child 199 config: [647, 5] +Interface 43 child 198 config: [647, 4] +Interface 43 child 193 config: [646, 31] +Interface 43 child 192 config: [646, 30] +Interface 43 child 195 config: [647, 1] +Interface 43 child 194 config: [647, 0] +Interface 43 child 216 config: [647, 22] +Interface 43 child 217 config: [647, 23] +Interface 43 child 212 config: [647, 18] +Interface 43 child 213 config: [647, 19] +Interface 43 child 214 config: [647, 20] +Interface 43 child 215 config: [647, 21] +Interface 43 child 208 config: [647, 14] +Interface 43 child 209 config: [647, 15] +Interface 43 child 210 config: [647, 16] +Interface 43 child 211 config: [647, 17] +Interface 45 child 76 config: [355, 0] +Interface 45 child 78 config: [355, 0] +Interface 45 child 79 config: [355, 0] +Interface 45 child 86 config: [355, 2] +Interface 45 child 80 config: [355, 0] +Interface 45 child 102 config: [355, 2] +Interface 45 child 103 config: [355, 2] +Interface 45 child 100 config: [355, 2] +Interface 45 child 101 config: [355, 2] +Interface 45 child 110 config: [355, 2] +Interface 45 child 108 config: [355, 2] +Interface 45 child 109 config: [355, 2] +Interface 45 child 106 config: [355, 2] +Interface 45 child 107 config: [355, 2] +Interface 45 child 104 config: [355, 2] +Interface 45 child 105 config: [355, 2] +Interface 45 child 112 config: [356, 15] +Interface 48 child 7 config: [261, 0] +Interface 48 child 8 config: [261, 0] +Interface 58 child 0 config: [377, 24] +Interface 58 child 1 config: [378, 24] +Interface 58 child 4 config: [378, 21] +Interface 58 child 5 config: [377, 21] +Interface 58 child 7 config: [378, 0] +Interface 58 child 8 config: [380, 0] +Interface 58 child 11 config: [378, 7] +Interface 58 child 13 config: [378, 8] +Interface 58 child 15 config: [378, 9] +Interface 58 child 17 config: [378, 10] +Interface 58 child 19 config: [378, 21] +Interface 58 child 18 config: [378, 21] +Interface 58 child 21 config: [377, 21] +Interface 58 child 20 config: [377, 21] +Interface 59 child 0 config: [377, 24] +Interface 59 child 1 config: [378, 24] +Interface 59 child 4 config: [378, 21] +Interface 59 child 5 config: [377, 21] +Interface 59 child 7 config: [377, 0] +Interface 59 child 8 config: [380, 0] +Interface 59 child 11 config: [377, 7] +Interface 59 child 13 config: [377, 8] +Interface 59 child 15 config: [377, 9] +Interface 59 child 17 config: [377, 10] +Interface 59 child 19 config: [378, 21] +Interface 59 child 18 config: [378, 21] +Interface 59 child 21 config: [377, 21] +Interface 59 child 20 config: [377, 21] +Interface 63 child 6 config: [621, 0] +Interface 63 child 7 config: [620, 0] +Interface 75 child 2 config: [43, 0] +Interface 75 child 3 config: [43, 0] +Interface 75 child 4 config: [43, 0] +Interface 75 child 5 config: [43, 0] +Interface 75 child 14 config: [300, 0] +Interface 75 child 15 config: [300, 0] +Interface 75 child 17 config: [300, 0] +Interface 75 child 16 config: [300, 0] +Interface 75 child 19 config: [300, 0] +Interface 75 child 18 config: [300, 0] +Interface 75 child 21 config: [300, 0] +Interface 75 child 20 config: [300, 0] +Interface 75 child 23 config: [300, 0] +Interface 75 child 22 config: [300, 0] +Interface 75 child 24 config: [301, 0] +Interface 75 child 26 config: [172, 0] +Interface 75 child 30 config: [172, 0] +Interface 76 child 2 config: [43, 0] +Interface 76 child 3 config: [43, 0] +Interface 76 child 4 config: [43, 0] +Interface 76 child 12 config: [300, 0] +Interface 76 child 13 config: [300, 0] +Interface 76 child 14 config: [300, 0] +Interface 76 child 15 config: [300, 0] +Interface 76 child 17 config: [300, 0] +Interface 76 child 16 config: [300, 0] +Interface 76 child 19 config: [300, 0] +Interface 76 child 18 config: [300, 0] +Interface 76 child 21 config: [300, 0] +Interface 76 child 20 config: [300, 0] +Interface 76 child 22 config: [301, 0] +Interface 76 child 24 config: [172, 0] +Interface 76 child 28 config: [172, 0] +Interface 77 child 2 config: [43, 0] +Interface 77 child 3 config: [43, 0] +Interface 77 child 4 config: [43, 0] +Interface 77 child 12 config: [300, 0] +Interface 77 child 13 config: [300, 0] +Interface 77 child 14 config: [300, 0] +Interface 77 child 15 config: [300, 0] +Interface 77 child 17 config: [300, 0] +Interface 77 child 16 config: [300, 0] +Interface 77 child 19 config: [300, 0] +Interface 77 child 18 config: [300, 0] +Interface 77 child 21 config: [300, 0] +Interface 77 child 20 config: [300, 0] +Interface 77 child 22 config: [301, 0] +Interface 77 child 24 config: [172, 0] +Interface 77 child 28 config: [172, 0] +Interface 78 child 2 config: [43, 0] +Interface 78 child 3 config: [43, 0] +Interface 78 child 4 config: [43, 0] +Interface 78 child 5 config: [43, 0] +Interface 78 child 14 config: [300, 0] +Interface 78 child 15 config: [300, 0] +Interface 78 child 17 config: [300, 0] +Interface 78 child 16 config: [300, 0] +Interface 78 child 19 config: [300, 0] +Interface 78 child 18 config: [300, 0] +Interface 78 child 21 config: [300, 0] +Interface 78 child 20 config: [300, 0] +Interface 78 child 23 config: [300, 0] +Interface 78 child 22 config: [300, 0] +Interface 78 child 24 config: [301, 0] +Interface 78 child 26 config: [172, 0] +Interface 78 child 31 config: [172, 0] +Interface 79 child 2 config: [43, 0] +Interface 79 child 3 config: [43, 0] +Interface 79 child 4 config: [43, 0] +Interface 79 child 12 config: [300, 0] +Interface 79 child 13 config: [300, 0] +Interface 79 child 14 config: [300, 0] +Interface 79 child 15 config: [300, 0] +Interface 79 child 17 config: [300, 0] +Interface 79 child 16 config: [300, 0] +Interface 79 child 19 config: [300, 0] +Interface 79 child 18 config: [300, 0] +Interface 79 child 21 config: [300, 0] +Interface 79 child 20 config: [300, 0] +Interface 79 child 22 config: [301, 0] +Interface 79 child 24 config: [172, 0] +Interface 79 child 28 config: [172, 0] +Interface 80 child 2 config: [43, 0] +Interface 80 child 3 config: [43, 0] +Interface 80 child 7 config: [172, 0] +Interface 80 child 10 config: [172, 0] +Interface 81 child 2 config: [43, 0] +Interface 81 child 3 config: [43, 0] +Interface 81 child 4 config: [43, 0] +Interface 81 child 5 config: [43, 0] +Interface 81 child 14 config: [300, 0] +Interface 81 child 15 config: [300, 0] +Interface 81 child 17 config: [300, 0] +Interface 81 child 16 config: [300, 0] +Interface 81 child 19 config: [300, 0] +Interface 81 child 18 config: [300, 0] +Interface 81 child 21 config: [300, 0] +Interface 81 child 20 config: [300, 0] +Interface 81 child 23 config: [300, 0] +Interface 81 child 22 config: [300, 0] +Interface 81 child 24 config: [301, 0] +Interface 81 child 26 config: [172, 0] +Interface 81 child 31 config: [172, 0] +Interface 82 child 2 config: [43, 0] +Interface 82 child 3 config: [43, 0] +Interface 82 child 4 config: [43, 0] +Interface 82 child 5 config: [43, 0] +Interface 82 child 14 config: [300, 0] +Interface 82 child 15 config: [300, 0] +Interface 82 child 17 config: [300, 0] +Interface 82 child 16 config: [300, 0] +Interface 82 child 19 config: [300, 0] +Interface 82 child 18 config: [300, 0] +Interface 82 child 21 config: [300, 0] +Interface 82 child 20 config: [300, 0] +Interface 82 child 23 config: [300, 0] +Interface 82 child 22 config: [300, 0] +Interface 82 child 24 config: [301, 0] +Interface 82 child 26 config: [172, 0] +Interface 82 child 31 config: [172, 0] +Interface 83 child 2 config: [43, 0] +Interface 83 child 3 config: [43, 0] +Interface 83 child 4 config: [43, 0] +Interface 83 child 5 config: [43, 0] +Interface 83 child 14 config: [300, 0] +Interface 83 child 15 config: [300, 0] +Interface 83 child 17 config: [300, 0] +Interface 83 child 16 config: [300, 0] +Interface 83 child 19 config: [300, 0] +Interface 83 child 18 config: [300, 0] +Interface 83 child 21 config: [300, 0] +Interface 83 child 20 config: [300, 0] +Interface 83 child 23 config: [300, 0] +Interface 83 child 22 config: [300, 0] +Interface 83 child 24 config: [301, 0] +Interface 83 child 26 config: [172, 0] +Interface 83 child 31 config: [172, 0] +Interface 84 child 2 config: [43, 0] +Interface 84 child 3 config: [43, 0] +Interface 84 child 4 config: [43, 0] +Interface 84 child 12 config: [300, 0] +Interface 84 child 13 config: [300, 0] +Interface 84 child 14 config: [300, 0] +Interface 84 child 15 config: [300, 0] +Interface 84 child 17 config: [300, 0] +Interface 84 child 16 config: [300, 0] +Interface 84 child 19 config: [300, 0] +Interface 84 child 18 config: [300, 0] +Interface 84 child 21 config: [300, 0] +Interface 84 child 20 config: [300, 0] +Interface 84 child 22 config: [301, 0] +Interface 84 child 24 config: [172, 0] +Interface 84 child 28 config: [172, 0] +Interface 85 child 2 config: [43, 0] +Interface 85 child 3 config: [43, 0] +Interface 85 child 4 config: [43, 0] +Interface 85 child 12 config: [300, 0] +Interface 85 child 13 config: [300, 0] +Interface 85 child 14 config: [300, 0] +Interface 85 child 15 config: [300, 0] +Interface 85 child 17 config: [300, 0] +Interface 85 child 16 config: [300, 0] +Interface 85 child 19 config: [300, 0] +Interface 85 child 18 config: [300, 0] +Interface 85 child 21 config: [300, 0] +Interface 85 child 20 config: [300, 0] +Interface 85 child 22 config: [301, 0] +Interface 85 child 24 config: [172, 0] +Interface 85 child 28 config: [172, 0] +Interface 86 child 2 config: [43, 0] +Interface 86 child 3 config: [43, 0] +Interface 86 child 4 config: [43, 0] +Interface 86 child 5 config: [43, 0] +Interface 86 child 11 config: [172, 0] +Interface 86 child 16 config: [172, 0] +Interface 87 child 2 config: [43, 0] +Interface 87 child 3 config: [43, 0] +Interface 87 child 4 config: [43, 0] +Interface 87 child 5 config: [43, 0] +Interface 87 child 14 config: [300, 0] +Interface 87 child 15 config: [300, 0] +Interface 87 child 17 config: [300, 0] +Interface 87 child 16 config: [300, 0] +Interface 87 child 19 config: [300, 0] +Interface 87 child 18 config: [300, 0] +Interface 87 child 21 config: [300, 0] +Interface 87 child 20 config: [300, 0] +Interface 87 child 23 config: [300, 0] +Interface 87 child 22 config: [300, 0] +Interface 87 child 24 config: [301, 0] +Interface 87 child 26 config: [172, 0] +Interface 87 child 31 config: [172, 0] +Interface 88 child 2 config: [43, 0] +Interface 88 child 3 config: [43, 0] +Interface 88 child 4 config: [43, 0] +Interface 88 child 5 config: [43, 0] +Interface 88 child 14 config: [300, 0] +Interface 88 child 15 config: [300, 0] +Interface 88 child 17 config: [300, 0] +Interface 88 child 16 config: [300, 0] +Interface 88 child 19 config: [300, 0] +Interface 88 child 18 config: [300, 0] +Interface 88 child 21 config: [300, 0] +Interface 88 child 20 config: [300, 0] +Interface 88 child 23 config: [300, 0] +Interface 88 child 22 config: [300, 0] +Interface 88 child 24 config: [301, 0] +Interface 88 child 26 config: [172, 0] +Interface 88 child 31 config: [172, 0] +Interface 89 child 2 config: [43, 0] +Interface 89 child 3 config: [43, 0] +Interface 89 child 4 config: [43, 0] +Interface 89 child 5 config: [43, 0] +Interface 89 child 14 config: [300, 0] +Interface 89 child 15 config: [300, 0] +Interface 89 child 17 config: [300, 0] +Interface 89 child 16 config: [300, 0] +Interface 89 child 19 config: [300, 0] +Interface 89 child 18 config: [300, 0] +Interface 89 child 21 config: [300, 0] +Interface 89 child 20 config: [300, 0] +Interface 89 child 23 config: [300, 0] +Interface 89 child 22 config: [300, 0] +Interface 89 child 24 config: [301, 0] +Interface 89 child 26 config: [172, 0] +Interface 89 child 31 config: [172, 0] +Interface 90 child 1 config: [43, 0] +Interface 90 child 2 config: [43, 0] +Interface 90 child 3 config: [43, 0] +Interface 90 child 4 config: [439, 8] +Interface 90 child 5 config: [43, 0], [439, 8] +Interface 90 child 9 config: [172, 0] +Interface 90 child 10 config: [172, 0] +Interface 90 child 93 config: [300, 0] +Interface 90 child 92 config: [300, 0] +Interface 90 child 95 config: [300, 0] +Interface 90 child 94 config: [300, 0] +Interface 90 child 89 config: [300, 0] +Interface 90 child 91 config: [300, 0] +Interface 90 child 90 config: [300, 0] +Interface 90 child 98 config: [300, 0] +Interface 90 child 99 config: [301, 0] +Interface 90 child 96 config: [300, 0] +Interface 90 child 97 config: [300, 0] +Interface 91 child 2 config: [43, 0] +Interface 91 child 3 config: [43, 0] +Interface 91 child 4 config: [43, 0] +Interface 91 child 12 config: [300, 0] +Interface 91 child 13 config: [300, 0] +Interface 91 child 14 config: [300, 0] +Interface 91 child 15 config: [300, 0] +Interface 91 child 17 config: [300, 0] +Interface 91 child 16 config: [300, 0] +Interface 91 child 19 config: [300, 0] +Interface 91 child 18 config: [300, 0] +Interface 91 child 21 config: [300, 0] +Interface 91 child 20 config: [300, 0] +Interface 91 child 22 config: [301, 0] +Interface 91 child 24 config: [172, 0] +Interface 91 child 28 config: [172, 0] +Interface 92 child 2 config: [43, 0] +Interface 92 child 3 config: [43, 0] +Interface 92 child 4 config: [43, 0] +Interface 92 child 12 config: [300, 0] +Interface 92 child 13 config: [300, 0] +Interface 92 child 14 config: [300, 0] +Interface 92 child 15 config: [300, 0] +Interface 92 child 17 config: [300, 0] +Interface 92 child 16 config: [300, 0] +Interface 92 child 19 config: [300, 0] +Interface 92 child 18 config: [300, 0] +Interface 92 child 21 config: [300, 0] +Interface 92 child 20 config: [300, 0] +Interface 92 child 22 config: [301, 0] +Interface 92 child 24 config: [172, 0] +Interface 92 child 28 config: [172, 0] +Interface 93 child 2 config: [43, 0] +Interface 93 child 3 config: [43, 0] +Interface 93 child 4 config: [43, 0] +Interface 93 child 12 config: [300, 0] +Interface 93 child 13 config: [300, 0] +Interface 93 child 14 config: [300, 0] +Interface 93 child 15 config: [300, 0] +Interface 93 child 17 config: [300, 0] +Interface 93 child 16 config: [300, 0] +Interface 93 child 19 config: [300, 0] +Interface 93 child 18 config: [300, 0] +Interface 93 child 21 config: [300, 0] +Interface 93 child 20 config: [300, 0] +Interface 93 child 22 config: [301, 0] +Interface 93 child 24 config: [172, 0] +Interface 93 child 28 config: [172, 0] +Interface 99 child 7 config: [261, 0] +Interface 99 child 8 config: [261, 0] +Interface 99 child 9 config: [261, 0] +Interface 99 child 10 config: [261, 0] +Interface 99 child 11 config: [261, 0] +Interface 99 child 12 config: [261, 0] +Interface 99 child 13 config: [261, 0] +Interface 99 child 14 config: [261, 0] +Interface 99 child 15 config: [261, 0] +Interface 99 child 17 config: [262, 0] +Interface 99 child 16 config: [261, 0] +Interface 99 child 19 config: [262, 0] +Interface 99 child 18 config: [262, 0] +Interface 99 child 21 config: [262, 0] +Interface 99 child 20 config: [262, 0] +Interface 99 child 23 config: [262, 0] +Interface 99 child 22 config: [262, 0] +Interface 99 child 25 config: [262, 0] +Interface 99 child 24 config: [262, 0] +Interface 99 child 26 config: [262, 0] +Interface 114 child 25 config: [262, 0] +Interface 114 child 24 config: [261, 0] +Interface 114 child 27 config: [264, 0] +Interface 114 child 26 config: [263, 0] +Interface 114 child 29 config: [266, 0] +Interface 114 child 28 config: [265, 0] +Interface 125 child 70 config: [615, 0] +Interface 125 child 71 config: [615, 0] +Interface 125 child 76 config: [615, 3] +Interface 125 child 77 config: [615, 3] +Interface 125 child 78 config: [615, 4] +Interface 125 child 79 config: [615, 4] +Interface 125 child 72 config: [615, 1] +Interface 125 child 73 config: [615, 1] +Interface 125 child 74 config: [615, 2] +Interface 125 child 75 config: [615, 2] +Interface 125 child 85 config: [615, 14] +Interface 125 child 84 config: [615, 14] +Interface 125 child 87 config: [615, 22] +Interface 125 child 86 config: [615, 22] +Interface 125 child 81 config: [615, 8] +Interface 125 child 80 config: [615, 8] +Interface 125 child 83 config: [615, 9] +Interface 125 child 82 config: [615, 9] +Interface 128 child 0 config: [524, 0] +Interface 128 child 1 config: [524, 0] +Interface 128 child 2 config: [524, 2] +Interface 128 child 3 config: [524, 2] +Interface 128 child 4 config: [524, 4] +Interface 128 child 5 config: [524, 4] +Interface 128 child 6 config: [524, 6] +Interface 128 child 7 config: [524, 6] +Interface 128 child 8 config: [524, 8] +Interface 128 child 9 config: [524, 8] +Interface 128 child 10 config: [524, 10] +Interface 128 child 11 config: [524, 10] +Interface 128 child 12 config: [524, 12] +Interface 128 child 13 config: [524, 12] +Interface 128 child 14 config: [524, 14] +Interface 128 child 15 config: [524, 14] +Interface 128 child 19 config: [524, 0] +Interface 128 child 21 config: [524, 2] +Interface 128 child 23 config: [524, 4] +Interface 128 child 25 config: [524, 6] +Interface 128 child 27 config: [524, 8] +Interface 128 child 29 config: [524, 10] +Interface 128 child 31 config: [524, 12] +Interface 128 child 33 config: [524, 14] +Interface 128 child 44 config: [525, 6] +Interface 128 child 45 config: [525, 14] +Interface 129 child 0 config: [524, 0] +Interface 129 child 1 config: [524, 0] +Interface 129 child 2 config: [524, 2] +Interface 129 child 3 config: [524, 2] +Interface 129 child 4 config: [524, 4] +Interface 129 child 5 config: [524, 4] +Interface 129 child 6 config: [524, 6] +Interface 129 child 7 config: [524, 6] +Interface 129 child 8 config: [524, 8] +Interface 129 child 9 config: [524, 8] +Interface 129 child 10 config: [524, 10] +Interface 129 child 11 config: [524, 10] +Interface 129 child 12 config: [524, 12] +Interface 129 child 13 config: [524, 12] +Interface 129 child 14 config: [524, 14] +Interface 129 child 15 config: [524, 14] +Interface 129 child 17 config: [524, 16] +Interface 129 child 16 config: [524, 16] +Interface 129 child 19 config: [524, 18] +Interface 129 child 18 config: [524, 18] +Interface 129 child 21 config: [524, 20] +Interface 129 child 20 config: [524, 20] +Interface 129 child 23 config: [524, 22] +Interface 129 child 22 config: [524, 22] +Interface 129 child 27 config: [524, 0] +Interface 129 child 29 config: [524, 2] +Interface 129 child 31 config: [524, 4] +Interface 129 child 35 config: [524, 8] +Interface 129 child 33 config: [524, 6] +Interface 129 child 39 config: [524, 12] +Interface 129 child 37 config: [524, 10] +Interface 129 child 43 config: [524, 16] +Interface 129 child 41 config: [524, 14] +Interface 129 child 47 config: [524, 20] +Interface 129 child 45 config: [524, 18] +Interface 129 child 49 config: [524, 22] +Interface 129 child 64 config: [525, 6] +Interface 129 child 65 config: [525, 14] +Interface 130 child 0 config: [524, 0] +Interface 130 child 1 config: [524, 0] +Interface 130 child 2 config: [524, 2] +Interface 130 child 3 config: [524, 2] +Interface 130 child 4 config: [524, 4] +Interface 130 child 5 config: [524, 4] +Interface 130 child 6 config: [524, 6] +Interface 130 child 7 config: [524, 6] +Interface 130 child 8 config: [524, 8] +Interface 130 child 9 config: [524, 8] +Interface 130 child 10 config: [524, 10] +Interface 130 child 11 config: [524, 10] +Interface 130 child 12 config: [524, 12] +Interface 130 child 13 config: [524, 12] +Interface 130 child 14 config: [524, 14] +Interface 130 child 15 config: [524, 14] +Interface 130 child 17 config: [524, 16] +Interface 130 child 16 config: [524, 16] +Interface 130 child 19 config: [524, 18] +Interface 130 child 18 config: [524, 18] +Interface 130 child 21 config: [524, 20] +Interface 130 child 20 config: [524, 20] +Interface 130 child 23 config: [524, 22] +Interface 130 child 22 config: [524, 22] +Interface 130 child 25 config: [524, 24] +Interface 130 child 24 config: [524, 24] +Interface 130 child 27 config: [524, 26] +Interface 130 child 26 config: [524, 26] +Interface 130 child 29 config: [524, 28] +Interface 130 child 28 config: [524, 28] +Interface 130 child 31 config: [524, 30] +Interface 130 child 30 config: [524, 30] +Interface 130 child 34 config: [525, 2] +Interface 130 child 35 config: [525, 2] +Interface 130 child 32 config: [525, 0] +Interface 130 child 33 config: [525, 0] +Interface 130 child 36 config: [525, 4] +Interface 130 child 37 config: [525, 4] +Interface 130 child 43 config: [524, 2] +Interface 130 child 41 config: [524, 0] +Interface 130 child 47 config: [524, 6] +Interface 130 child 45 config: [524, 4] +Interface 130 child 51 config: [524, 10] +Interface 130 child 49 config: [524, 8] +Interface 130 child 55 config: [524, 14] +Interface 130 child 53 config: [524, 12] +Interface 130 child 59 config: [524, 18] +Interface 130 child 57 config: [524, 16] +Interface 130 child 63 config: [524, 22] +Interface 130 child 61 config: [524, 20] +Interface 130 child 69 config: [524, 28] +Interface 130 child 71 config: [524, 30] +Interface 130 child 65 config: [524, 24] +Interface 130 child 67 config: [524, 26] +Interface 130 child 77 config: [525, 4] +Interface 130 child 73 config: [525, 0] +Interface 130 child 75 config: [525, 2] +Interface 130 child 100 config: [525, 6] +Interface 130 child 99 config: [525, 14] +Interface 138 child 34 config: [153, 0] +Interface 138 child 35 config: [153, 0] +Interface 138 child 32 config: [153, 0] +Interface 138 child 33 config: [153, 0] +Interface 138 child 38 config: [153, 0] +Interface 138 child 39 config: [153, 0] +Interface 138 child 36 config: [153, 0] +Interface 138 child 37 config: [153, 0] +Interface 138 child 42 config: [153, 0] +Interface 138 child 40 config: [153, 0] +Interface 138 child 41 config: [153, 0] +Interface 144 child 220 config: [383, 0] +Interface 144 child 221 config: [383, 13] +Interface 144 child 212 config: [383, 5] +Interface 144 child 213 config: [383, 6] +Interface 144 child 214 config: [383, 7] +Interface 144 child 215 config: [383, 8] +Interface 144 child 208 config: [383, 1] +Interface 144 child 209 config: [383, 2] +Interface 144 child 210 config: [383, 3] +Interface 144 child 211 config: [383, 4] +Interface 144 child 277 config: [383, 14] +Interface 144 child 258 config: [383, 15] +Interface 144 child 308 config: [383, 17] +Interface 144 child 297 config: [383, 16] +Interface 144 child 320 config: [383, 18] +Interface 144 child 369 config: [383, 13] +Interface 144 child 368 config: [383, 13] +Interface 144 child 354 config: [383, 19] +Interface 144 child 367 config: [383, 20] +Interface 189 child 9 config: [531, 0] +Interface 189 child 10 config: [531, 0] +Interface 189 child 11 config: [531, 0] +Interface 189 child 12 config: [531, 0] +Interface 189 child 13 config: [531, 0] +Interface 189 child 14 config: [531, 0] +Interface 199 child 119 config: [261, 0] +Interface 199 child 127 config: [262, 0] +Interface 199 child 126 config: [261, 0] +Interface 199 child 125 config: [261, 0] +Interface 199 child 124 config: [261, 0] +Interface 199 child 123 config: [261, 0] +Interface 199 child 122 config: [261, 0] +Interface 199 child 121 config: [261, 0] +Interface 199 child 120 config: [261, 0] +Interface 199 child 137 config: [262, 0] +Interface 199 child 136 config: [262, 0] +Interface 199 child 139 config: [261, 0] +Interface 199 child 138 config: [262, 0] +Interface 199 child 141 config: [261, 0] +Interface 199 child 140 config: [261, 0] +Interface 199 child 143 config: [261, 0] +Interface 199 child 142 config: [261, 0] +Interface 199 child 129 config: [262, 0] +Interface 199 child 128 config: [262, 0] +Interface 199 child 131 config: [262, 0] +Interface 199 child 130 config: [262, 0] +Interface 199 child 133 config: [262, 0] +Interface 199 child 132 config: [262, 0] +Interface 199 child 135 config: [262, 0] +Interface 199 child 134 config: [262, 0] +Interface 199 child 144 config: [261, 0] +Interface 199 child 145 config: [261, 0] +Interface 199 child 146 config: [261, 0] +Interface 200 child 100 config: [261, 0] +Interface 200 child 101 config: [261, 0] +Interface 200 child 98 config: [261, 0] +Interface 200 child 99 config: [261, 0] +Interface 200 child 96 config: [261, 0] +Interface 200 child 97 config: [261, 0] +Interface 201 child 93 config: [263, 0] +Interface 201 child 92 config: [263, 0] +Interface 201 child 95 config: [263, 0] +Interface 201 child 94 config: [263, 0] +Interface 201 child 91 config: [263, 0] +Interface 201 child 90 config: [263, 0] +Interface 201 child 102 config: [263, 0] +Interface 201 child 103 config: [263, 0] +Interface 201 child 100 config: [263, 0] +Interface 201 child 101 config: [263, 0] +Interface 201 child 98 config: [263, 0] +Interface 201 child 99 config: [263, 0] +Interface 201 child 96 config: [263, 0] +Interface 201 child 97 config: [263, 0] +Interface 201 child 110 config: [263, 0] +Interface 201 child 111 config: [263, 0] +Interface 201 child 108 config: [263, 0] +Interface 201 child 109 config: [263, 0] +Interface 201 child 107 config: [263, 0] +Interface 201 child 104 config: [263, 0] +Interface 201 child 105 config: [263, 0] +Interface 201 child 119 config: [263, 0] +Interface 201 child 118 config: [263, 0] +Interface 201 child 117 config: [263, 0] +Interface 201 child 116 config: [263, 0] +Interface 201 child 115 config: [263, 0] +Interface 201 child 114 config: [263, 0] +Interface 201 child 113 config: [263, 0] +Interface 201 child 112 config: [263, 0] +Interface 201 child 122 config: [263, 0] +Interface 201 child 121 config: [263, 0] +Interface 201 child 120 config: [263, 0] +Interface 201 child 137 config: [261, 0] +Interface 201 child 136 config: [261, 0] +Interface 201 child 139 config: [261, 0] +Interface 201 child 138 config: [261, 0] +Interface 201 child 141 config: [261, 0] +Interface 201 child 140 config: [261, 0] +Interface 201 child 143 config: [261, 0] +Interface 201 child 142 config: [261, 0] +Interface 201 child 131 config: [261, 0] +Interface 201 child 133 config: [261, 0] +Interface 201 child 132 config: [261, 0] +Interface 201 child 135 config: [261, 0] +Interface 201 child 134 config: [261, 0] +Interface 201 child 144 config: [261, 0] +Interface 202 child 93 config: [263, 0] +Interface 202 child 92 config: [263, 0] +Interface 202 child 95 config: [263, 0] +Interface 202 child 94 config: [263, 0] +Interface 202 child 91 config: [263, 0] +Interface 202 child 90 config: [263, 0] +Interface 202 child 102 config: [263, 0] +Interface 202 child 103 config: [263, 0] +Interface 202 child 100 config: [263, 0] +Interface 202 child 101 config: [263, 0] +Interface 202 child 98 config: [263, 0] +Interface 202 child 99 config: [263, 0] +Interface 202 child 96 config: [263, 0] +Interface 202 child 97 config: [263, 0] +Interface 202 child 110 config: [263, 0] +Interface 202 child 111 config: [263, 0] +Interface 202 child 108 config: [263, 0] +Interface 202 child 109 config: [263, 0] +Interface 202 child 107 config: [263, 0] +Interface 202 child 104 config: [263, 0] +Interface 202 child 105 config: [263, 0] +Interface 202 child 119 config: [263, 0] +Interface 202 child 118 config: [263, 0] +Interface 202 child 117 config: [263, 0] +Interface 202 child 116 config: [263, 0] +Interface 202 child 115 config: [263, 0] +Interface 202 child 114 config: [263, 0] +Interface 202 child 113 config: [263, 0] +Interface 202 child 112 config: [263, 0] +Interface 202 child 122 config: [263, 0] +Interface 202 child 121 config: [263, 0] +Interface 202 child 120 config: [263, 0] +Interface 202 child 152 config: [262, 0] +Interface 202 child 153 config: [262, 0] +Interface 202 child 154 config: [262, 0] +Interface 202 child 155 config: [262, 0] +Interface 202 child 146 config: [261, 0] +Interface 202 child 147 config: [261, 0] +Interface 202 child 148 config: [261, 0] +Interface 202 child 149 config: [261, 0] +Interface 202 child 150 config: [261, 0] +Interface 202 child 151 config: [262, 0] +Interface 203 child 119 config: [261, 0] +Interface 203 child 118 config: [261, 0] +Interface 203 child 117 config: [261, 0] +Interface 203 child 116 config: [261, 0] +Interface 203 child 115 config: [261, 0] +Interface 203 child 114 config: [261, 0] +Interface 203 child 127 config: [262, 0] +Interface 203 child 126 config: [262, 0] +Interface 203 child 125 config: [262, 0] +Interface 203 child 124 config: [262, 0] +Interface 203 child 123 config: [261, 0] +Interface 203 child 122 config: [261, 0] +Interface 203 child 121 config: [261, 0] +Interface 203 child 120 config: [261, 0] +Interface 203 child 137 config: [261, 0] +Interface 203 child 136 config: [261, 0] +Interface 203 child 139 config: [261, 0] +Interface 203 child 138 config: [261, 0] +Interface 203 child 141 config: [261, 0] +Interface 203 child 140 config: [261, 0] +Interface 203 child 143 config: [261, 0] +Interface 203 child 142 config: [261, 0] +Interface 203 child 129 config: [262, 0] +Interface 203 child 128 config: [262, 0] +Interface 203 child 131 config: [262, 0] +Interface 203 child 130 config: [262, 0] +Interface 203 child 133 config: [262, 0] +Interface 203 child 132 config: [262, 0] +Interface 203 child 135 config: [262, 0] +Interface 203 child 134 config: [262, 0] +Interface 203 child 144 config: [261, 0] +Interface 203 child 145 config: [261, 0] +Interface 204 child 119 config: [261, 0] +Interface 204 child 118 config: [261, 0] +Interface 204 child 117 config: [261, 0] +Interface 204 child 116 config: [261, 0] +Interface 204 child 115 config: [261, 0] +Interface 204 child 114 config: [261, 0] +Interface 204 child 113 config: [261, 0] +Interface 204 child 127 config: [262, 0] +Interface 204 child 126 config: [262, 0] +Interface 204 child 125 config: [262, 0] +Interface 204 child 124 config: [262, 0] +Interface 204 child 123 config: [262, 0] +Interface 204 child 122 config: [262, 0] +Interface 204 child 121 config: [261, 0] +Interface 204 child 120 config: [261, 0] +Interface 204 child 137 config: [261, 0] +Interface 204 child 136 config: [261, 0] +Interface 204 child 139 config: [261, 0] +Interface 204 child 138 config: [261, 0] +Interface 204 child 141 config: [261, 0] +Interface 204 child 140 config: [261, 0] +Interface 204 child 142 config: [261, 0] +Interface 204 child 129 config: [262, 0] +Interface 204 child 128 config: [262, 0] +Interface 204 child 131 config: [262, 0] +Interface 204 child 130 config: [262, 0] +Interface 204 child 133 config: [262, 0] +Interface 204 child 132 config: [262, 0] +Interface 204 child 135 config: [261, 0] +Interface 204 child 134 config: [261, 0] +Interface 205 child 93 config: [262, 0] +Interface 205 child 95 config: [262, 0] +Interface 205 child 94 config: [262, 0] +Interface 205 child 103 config: [261, 0] +Interface 205 child 100 config: [262, 0] +Interface 205 child 101 config: [261, 0] +Interface 205 child 98 config: [262, 0] +Interface 205 child 99 config: [262, 0] +Interface 205 child 96 config: [262, 0] +Interface 205 child 97 config: [262, 0] +Interface 205 child 110 config: [262, 0] +Interface 205 child 111 config: [262, 0] +Interface 205 child 108 config: [262, 0] +Interface 205 child 109 config: [262, 0] +Interface 205 child 106 config: [262, 0] +Interface 205 child 107 config: [262, 0] +Interface 205 child 104 config: [262, 0] +Interface 205 child 105 config: [262, 0] +Interface 205 child 113 config: [261, 0] +Interface 205 child 112 config: [261, 0] +Interface 206 child 93 config: [263, 0] +Interface 206 child 92 config: [263, 0] +Interface 206 child 95 config: [263, 0] +Interface 206 child 94 config: [263, 0] +Interface 206 child 91 config: [263, 0] +Interface 206 child 90 config: [263, 0] +Interface 206 child 102 config: [263, 0] +Interface 206 child 103 config: [263, 0] +Interface 206 child 100 config: [263, 0] +Interface 206 child 101 config: [263, 0] +Interface 206 child 98 config: [263, 0] +Interface 206 child 99 config: [263, 0] +Interface 206 child 96 config: [263, 0] +Interface 206 child 97 config: [263, 0] +Interface 206 child 110 config: [263, 0] +Interface 206 child 111 config: [263, 0] +Interface 206 child 108 config: [263, 0] +Interface 206 child 109 config: [263, 0] +Interface 206 child 107 config: [263, 0] +Interface 206 child 104 config: [263, 0] +Interface 206 child 105 config: [263, 0] +Interface 206 child 119 config: [263, 0] +Interface 206 child 118 config: [263, 0] +Interface 206 child 117 config: [263, 0] +Interface 206 child 116 config: [263, 0] +Interface 206 child 115 config: [263, 0] +Interface 206 child 114 config: [263, 0] +Interface 206 child 113 config: [263, 0] +Interface 206 child 112 config: [263, 0] +Interface 206 child 122 config: [263, 0] +Interface 206 child 121 config: [263, 0] +Interface 206 child 120 config: [263, 0] +Interface 206 child 129 config: [261, 0] +Interface 206 child 128 config: [261, 0] +Interface 206 child 131 config: [261, 0] +Interface 206 child 130 config: [261, 0] +Interface 206 child 133 config: [261, 0] +Interface 206 child 132 config: [261, 0] +Interface 206 child 135 config: [261, 0] +Interface 206 child 134 config: [261, 0] +Interface 207 child 93 config: [263, 0] +Interface 207 child 92 config: [263, 0] +Interface 207 child 95 config: [263, 0] +Interface 207 child 94 config: [263, 0] +Interface 207 child 91 config: [263, 0] +Interface 207 child 90 config: [263, 0] +Interface 207 child 102 config: [263, 0] +Interface 207 child 103 config: [263, 0] +Interface 207 child 100 config: [263, 0] +Interface 207 child 101 config: [263, 0] +Interface 207 child 98 config: [263, 0] +Interface 207 child 99 config: [263, 0] +Interface 207 child 96 config: [263, 0] +Interface 207 child 97 config: [263, 0] +Interface 207 child 110 config: [263, 0] +Interface 207 child 111 config: [263, 0] +Interface 207 child 108 config: [263, 0] +Interface 207 child 109 config: [263, 0] +Interface 207 child 107 config: [263, 0] +Interface 207 child 104 config: [263, 0] +Interface 207 child 105 config: [263, 0] +Interface 207 child 119 config: [263, 0] +Interface 207 child 118 config: [263, 0] +Interface 207 child 117 config: [263, 0] +Interface 207 child 116 config: [263, 0] +Interface 207 child 115 config: [263, 0] +Interface 207 child 114 config: [263, 0] +Interface 207 child 113 config: [263, 0] +Interface 207 child 112 config: [263, 0] +Interface 207 child 122 config: [263, 0] +Interface 207 child 121 config: [263, 0] +Interface 207 child 120 config: [263, 0] +Interface 207 child 157 config: [261, 0] +Interface 207 child 158 config: [261, 0] +Interface 207 child 159 config: [261, 0] +Interface 207 child 169 config: [262, 0] +Interface 207 child 168 config: [262, 0] +Interface 207 child 163 config: [261, 0] +Interface 207 child 162 config: [261, 0] +Interface 207 child 161 config: [261, 0] +Interface 207 child 160 config: [261, 0] +Interface 207 child 167 config: [262, 0] +Interface 207 child 166 config: [262, 0] +Interface 207 child 165 config: [262, 0] +Interface 207 child 164 config: [262, 0] +Interface 209 child 2 config: [531, 0] +Interface 261 child 0 config: [173, 0] +Interface 261 child 1 config: [171, 0] +Interface 261 child 2 config: [287, 0] +Interface 261 child 3 config: [170, 0] +Interface 261 child 4 config: [427, 0] +Interface 261 child 7 config: [166, 0] +Interface 261 child 8 config: [166, 0] +Interface 261 child 9 config: [166, 0] +Interface 261 child 10 config: [166, 0] +Interface 261 child 11 config: [168, 0] +Interface 261 child 12 config: [168, 0] +Interface 261 child 13 config: [168, 0] +Interface 261 child 14 config: [168, 0] +Interface 261 child 15 config: [168, 0] +Interface 261 child 17 config: [169, 0] +Interface 261 child 16 config: [169, 0] +Interface 261 child 19 config: [169, 0] +Interface 261 child 18 config: [169, 0] +Interface 261 child 20 config: [169, 0] +Interface 261 child 25 config: [168, 0] +Interface 261 child 26 config: [169, 0] +Interface 261 child 29 config: [872, 0] +Interface 261 child 31 config: [872, 0] +Interface 261 child 30 config: [872, 0] +Interface 261 child 34 config: [872, 0] +Interface 261 child 32 config: [872, 0] +Interface 261 child 33 config: [872, 0] +Interface 262 child 1 config: [262, 0] +Interface 262 child 2 config: [262, 0] +Interface 262 child 3 config: [262, 0] +Interface 262 child 13 config: [896, 16], [896, 20], [896, 24] +Interface 262 child 15 config: [896, 16], [896, 20], [896, 24] +Interface 262 child 38 config: [261, 0] +Interface 262 child 39 config: [261, 0] +Interface 262 child 37 config: [261, 0] +Interface 262 child 42 config: [261, 0] +Interface 262 child 40 config: [261, 0] +Interface 262 child 41 config: [261, 0] +Interface 270 child 5 config: [106, 0] +Interface 270 child 6 config: [106, 0] +Interface 270 child 7 config: [106, 0] +Interface 270 child 8 config: [106, 0] +Interface 270 child 9 config: [106, 0] +Interface 270 child 10 config: [106, 0] +Interface 270 child 11 config: [106, 0] +Interface 270 child 12 config: [106, 0] +Interface 270 child 13 config: [106, 0] +Interface 270 child 14 config: [106, 0] +Interface 270 child 15 config: [106, 0] +Interface 270 child 17 config: [106, 0] +Interface 270 child 16 config: [106, 0] +Interface 270 child 19 config: [106, 0] +Interface 270 child 18 config: [106, 0] +Interface 270 child 21 config: [106, 0] +Interface 270 child 20 config: [106, 0] +Interface 270 child 23 config: [106, 0] +Interface 270 child 22 config: [106, 0] +Interface 270 child 25 config: [106, 0] +Interface 270 child 24 config: [106, 0] +Interface 270 child 27 config: [106, 0] +Interface 270 child 26 config: [106, 0] +Interface 270 child 29 config: [106, 0] +Interface 270 child 28 config: [106, 0] +Interface 270 child 31 config: [106, 0] +Interface 270 child 30 config: [106, 0] +Interface 270 child 34 config: [106, 0] +Interface 270 child 35 config: [106, 0] +Interface 270 child 32 config: [106, 0] +Interface 270 child 33 config: [106, 0] +Interface 270 child 38 config: [106, 0] +Interface 270 child 39 config: [106, 0] +Interface 270 child 36 config: [106, 0] +Interface 270 child 37 config: [106, 0] +Interface 270 child 42 config: [106, 0] +Interface 270 child 43 config: [106, 0] +Interface 270 child 40 config: [106, 0] +Interface 270 child 41 config: [106, 0] +Interface 270 child 46 config: [106, 0] +Interface 270 child 44 config: [106, 0] +Interface 270 child 45 config: [106, 0] +Interface 276 child 5 config: [101, 0] +Interface 277 child 5 config: [101, 0] +Interface 282 child 11 config: [607, 19] +Interface 282 child 12 config: [607, 13] +Interface 282 child 13 config: [607, 13] +Interface 282 child 14 config: [607, 13] +Interface 282 child 15 config: [607, 13] +Interface 282 child 17 config: [607, 13] +Interface 282 child 16 config: [607, 13] +Interface 282 child 19 config: [607, 13] +Interface 282 child 18 config: [607, 13] +Interface 286 child 93 config: [331, 0] +Interface 286 child 95 config: [331, 2] +Interface 286 child 94 config: [331, 1] +Interface 286 child 102 config: [331, 9] +Interface 286 child 103 config: [331, 10] +Interface 286 child 100 config: [331, 7] +Interface 286 child 101 config: [331, 8] +Interface 286 child 98 config: [331, 5] +Interface 286 child 99 config: [331, 6] +Interface 286 child 96 config: [331, 3] +Interface 286 child 97 config: [331, 4] +Interface 286 child 110 config: [331, 17] +Interface 286 child 111 config: [331, 18] +Interface 286 child 108 config: [331, 15] +Interface 286 child 109 config: [331, 16] +Interface 286 child 106 config: [331, 13] +Interface 286 child 107 config: [331, 14] +Interface 286 child 104 config: [331, 11] +Interface 286 child 105 config: [331, 12] +Interface 286 child 118 config: [331, 25] +Interface 286 child 117 config: [331, 24] +Interface 286 child 116 config: [331, 23] +Interface 286 child 115 config: [331, 22] +Interface 286 child 114 config: [331, 21] +Interface 286 child 113 config: [331, 20] +Interface 286 child 112 config: [331, 19] +Interface 286 child 126 config: [331, 31] +Interface 286 child 125 config: [331, 30] +Interface 286 child 124 config: [331, 29] +Interface 286 child 123 config: [331, 28] +Interface 286 child 122 config: [331, 27] +Interface 286 child 121 config: [331, 26] +Interface 286 child 137 config: [330, 0] +Interface 286 child 136 config: [330, 0] +Interface 286 child 139 config: [330, 0] +Interface 286 child 138 config: [330, 0] +Interface 286 child 141 config: [330, 0] +Interface 286 child 140 config: [330, 0] +Interface 286 child 143 config: [330, 0] +Interface 286 child 142 config: [330, 0] +Interface 286 child 133 config: [330, 0] +Interface 286 child 132 config: [330, 0] +Interface 286 child 135 config: [330, 0] +Interface 286 child 134 config: [330, 0] +Interface 286 child 152 config: [330, 0] +Interface 286 child 153 config: [330, 0] +Interface 286 child 154 config: [330, 0] +Interface 286 child 155 config: [330, 0] +Interface 286 child 156 config: [330, 0] +Interface 286 child 144 config: [330, 0] +Interface 286 child 145 config: [330, 0] +Interface 286 child 146 config: [330, 0] +Interface 286 child 147 config: [330, 0] +Interface 286 child 148 config: [330, 0] +Interface 286 child 149 config: [330, 0] +Interface 286 child 150 config: [330, 0] +Interface 286 child 151 config: [330, 0] +Interface 287 child 0 config: [261, 0] +Interface 289 child 43 config: [261, 0] +Interface 289 child 46 config: [261, 0] +Interface 289 child 47 config: [261, 0] +Interface 289 child 44 config: [261, 0] +Interface 289 child 50 config: [261, 0] +Interface 289 child 49 config: [261, 0] +Interface 289 child 55 config: [261, 0] +Interface 289 child 53 config: [261, 0] +Interface 289 child 52 config: [261, 0] +Interface 289 child 56 config: [261, 0] +Interface 291 child 6 config: [493, 18] +Interface 291 child 7 config: [493, 18] +Interface 291 child 8 config: [493, 18] +Interface 291 child 9 config: [493, 18] +Interface 291 child 10 config: [493, 18] +Interface 299 child 27 config: [75, 0] +Interface 299 child 26 config: [75, 0] +Interface 299 child 29 config: [75, 0] +Interface 299 child 28 config: [75, 0] +Interface 299 child 31 config: [75, 0] +Interface 299 child 30 config: [75, 0] +Interface 299 child 34 config: [75, 0] +Interface 299 child 35 config: [75, 0] +Interface 299 child 32 config: [75, 0] +Interface 299 child 33 config: [75, 0] +Interface 299 child 38 config: [75, 0] +Interface 299 child 39 config: [75, 0] +Interface 299 child 36 config: [75, 0] +Interface 299 child 37 config: [75, 0] +Interface 299 child 42 config: [75, 0] +Interface 299 child 40 config: [75, 0] +Interface 299 child 41 config: [75, 0] +Interface 325 child 92 config: [158, 0] +Interface 325 child 95 config: [158, 0] +Interface 325 child 94 config: [156, 0] +Interface 325 child 102 config: [158, 0] +Interface 325 child 103 config: [158, 0] +Interface 325 child 100 config: [158, 0] +Interface 325 child 101 config: [158, 0] +Interface 325 child 98 config: [158, 0] +Interface 325 child 99 config: [158, 0] +Interface 325 child 96 config: [158, 0] +Interface 325 child 97 config: [158, 0] +Interface 325 child 107 config: [157, 0] +Interface 325 child 104 config: [158, 0] +Interface 325 child 119 config: [156, 0] +Interface 325 child 118 config: [156, 0] +Interface 325 child 117 config: [156, 0] +Interface 325 child 116 config: [156, 0] +Interface 325 child 115 config: [156, 0] +Interface 325 child 113 config: [156, 0] +Interface 325 child 122 config: [156, 0] +Interface 325 child 121 config: [156, 0] +Interface 325 child 120 config: [156, 0] +Interface 328 child 1 config: [343, 0] +Interface 328 child 3 config: [344, 0] +Interface 328 child 5 config: [345, 0] +Interface 329 child 34 config: [700, 19] +Interface 329 child 35 config: [700, 19] +Interface 329 child 38 config: [700, 19] +Interface 329 child 39 config: [700, 19] +Interface 329 child 36 config: [700, 19] +Interface 329 child 37 config: [700, 19] +Interface 329 child 42 config: [700, 19] +Interface 329 child 43 config: [700, 19] +Interface 329 child 40 config: [700, 19] +Interface 329 child 41 config: [700, 19] +Interface 329 child 46 config: [700, 19] +Interface 329 child 47 config: [700, 19] +Interface 329 child 44 config: [700, 19] +Interface 329 child 45 config: [700, 19] +Interface 329 child 51 config: [700, 19] +Interface 329 child 50 config: [700, 19] +Interface 329 child 49 config: [700, 19] +Interface 329 child 48 config: [700, 19] +Interface 329 child 55 config: [700, 19] +Interface 329 child 54 config: [700, 19] +Interface 329 child 53 config: [700, 19] +Interface 329 child 52 config: [700, 19] +Interface 329 child 58 config: [700, 19] +Interface 329 child 57 config: [700, 19] +Interface 329 child 56 config: [700, 19] +Interface 330 child 3 config: [261, 0] +Interface 330 child 4 config: [261, 0] +Interface 330 child 5 config: [261, 0] +Interface 330 child 6 config: [261, 0] +Interface 330 child 7 config: [261, 0] +Interface 330 child 8 config: [261, 0] +Interface 330 child 9 config: [261, 0] +Interface 330 child 10 config: [261, 0] +Interface 330 child 11 config: [261, 0] +Interface 363 child 5 config: [261, 0] +Interface 366 child 0 config: [391, 0] +Interface 366 child 1 config: [391, 0] +Interface 366 child 2 config: [391, 0] +Interface 366 child 3 config: [391, 0] +Interface 366 child 4 config: [391, 0] +Interface 366 child 5 config: [391, 0] +Interface 366 child 6 config: [391, 0] +Interface 366 child 7 config: [391, 0] +Interface 366 child 8 config: [391, 0] +Interface 366 child 9 config: [391, 0] +Interface 366 child 10 config: [391, 0] +Interface 366 child 11 config: [391, 0] +Interface 366 child 12 config: [391, 0] +Interface 366 child 13 config: [391, 0] +Interface 366 child 14 config: [391, 0] +Interface 366 child 15 config: [391, 0] +Interface 366 child 17 config: [391, 0] +Interface 366 child 16 config: [391, 0] +Interface 366 child 19 config: [391, 0] +Interface 366 child 18 config: [391, 0] +Interface 371 child 0 config: [406, 0] +Interface 371 child 1 config: [406, 0] +Interface 371 child 2 config: [406, 0] +Interface 371 child 3 config: [406, 0] +Interface 371 child 4 config: [406, 0] +Interface 371 child 5 config: [406, 0] +Interface 371 child 6 config: [406, 0] +Interface 371 child 7 config: [406, 0] +Interface 371 child 8 config: [406, 0] +Interface 371 child 9 config: [406, 0] +Interface 371 child 10 config: [406, 0] +Interface 371 child 11 config: [406, 0] +Interface 371 child 12 config: [406, 0] +Interface 371 child 13 config: [406, 0] +Interface 371 child 14 config: [406, 0] +Interface 371 child 15 config: [406, 0] +Interface 371 child 17 config: [406, 0] +Interface 371 child 16 config: [406, 0] +Interface 371 child 19 config: [406, 0] +Interface 371 child 18 config: [406, 0] +Interface 377 child 2 config: [535, 2] +Interface 391 child 12 config: [363, 12] +Interface 391 child 13 config: [363, 12] +Interface 391 child 14 config: [363, 12] +Interface 391 child 15 config: [363, 12] +Interface 391 child 17 config: [363, 12] +Interface 391 child 16 config: [363, 12] +Interface 391 child 19 config: [363, 12] +Interface 391 child 18 config: [363, 12] +Interface 391 child 21 config: [363, 12] +Interface 391 child 20 config: [363, 12] +Interface 391 child 29 config: [363, 0] +Interface 391 child 31 config: [363, 0] +Interface 391 child 30 config: [363, 0] +Interface 391 child 34 config: [363, 0] +Interface 391 child 35 config: [363, 0] +Interface 391 child 32 config: [363, 0] +Interface 391 child 33 config: [363, 0] +Interface 391 child 38 config: [363, 0] +Interface 391 child 36 config: [363, 0] +Interface 391 child 45 config: [363, 0] +Interface 391 child 51 config: [363, 4] +Interface 391 child 50 config: [363, 4] +Interface 391 child 49 config: [363, 4] +Interface 391 child 55 config: [363, 4] +Interface 391 child 54 config: [363, 4] +Interface 391 child 53 config: [363, 4] +Interface 391 child 52 config: [363, 4] +Interface 391 child 58 config: [363, 4] +Interface 391 child 57 config: [363, 4] +Interface 391 child 56 config: [363, 4] +Interface 391 child 68 config: [363, 8] +Interface 391 child 69 config: [363, 8] +Interface 391 child 70 config: [363, 8] +Interface 391 child 71 config: [363, 8] +Interface 391 child 64 config: [363, 8] +Interface 391 child 65 config: [363, 8] +Interface 391 child 66 config: [363, 8] +Interface 391 child 76 config: [261, 0] +Interface 391 child 77 config: [261, 0] +Interface 391 child 78 config: [261, 0] +Interface 391 child 72 config: [363, 8] +Interface 391 child 73 config: [363, 8] +Interface 391 child 74 config: [363, 8] +Interface 391 child 75 config: [261, 0] +Interface 391 child 85 config: [261, 0] +Interface 391 child 84 config: [261, 0] +Interface 391 child 87 config: [261, 0] +Interface 391 child 86 config: [261, 0] +Interface 391 child 83 config: [261, 0] +Interface 391 child 82 config: [261, 0] +Interface 391 child 92 config: [261, 0] +Interface 391 child 89 config: [261, 0] +Interface 391 child 88 config: [261, 0] +Interface 391 child 91 config: [261, 0] +Interface 391 child 90 config: [261, 0] +Interface 391 child 102 config: [262, 0] +Interface 391 child 103 config: [262, 0] +Interface 391 child 101 config: [262, 0] +Interface 391 child 110 config: [262, 0] +Interface 391 child 108 config: [262, 0] +Interface 391 child 109 config: [262, 0] +Interface 391 child 106 config: [262, 0] +Interface 391 child 107 config: [262, 0] +Interface 391 child 104 config: [262, 0] +Interface 391 child 105 config: [262, 0] +Interface 391 child 119 config: [729, 0] +Interface 391 child 118 config: [729, 0] +Interface 391 child 112 config: [362, 27] +Interface 391 child 127 config: [729, 0] +Interface 391 child 126 config: [729, 0] +Interface 391 child 125 config: [729, 0] +Interface 391 child 124 config: [729, 0] +Interface 391 child 123 config: [729, 0] +Interface 391 child 122 config: [729, 0] +Interface 391 child 121 config: [729, 0] +Interface 391 child 120 config: [729, 0] +Interface 391 child 129 config: [729, 8] +Interface 391 child 128 config: [729, 8] +Interface 391 child 130 config: [729, 8] +Interface 391 child 152 config: [729, 4] +Interface 391 child 153 config: [729, 4] +Interface 391 child 154 config: [729, 4] +Interface 391 child 155 config: [729, 10] +Interface 391 child 157 config: [729, 10] +Interface 391 child 145 config: [729, 4] +Interface 391 child 146 config: [729, 4] +Interface 391 child 147 config: [729, 4] +Interface 391 child 148 config: [729, 4] +Interface 391 child 149 config: [729, 4] +Interface 391 child 150 config: [729, 4] +Interface 391 child 151 config: [729, 4] +Interface 394 child 108 config: [262, 0] +Interface 394 child 109 config: [263, 0] +Interface 394 child 107 config: [261, 0] +Interface 396 child 137 config: [261, 5] +Interface 396 child 136 config: [261, 4] +Interface 396 child 139 config: [261, 7] +Interface 396 child 138 config: [261, 6] +Interface 396 child 133 config: [261, 1] +Interface 396 child 135 config: [261, 3] +Interface 396 child 134 config: [261, 2] +Interface 398 child 1 config: [261, 0] +Interface 398 child 14 config: [261, 0] +Interface 398 child 20 config: [262, 0] +Interface 400 child 2 config: [261, 0] +Interface 400 child 3 config: [262, 0] +Interface 400 child 4 config: [262, 0] +Interface 400 child 5 config: [261, 0] +Interface 400 child 6 config: [262, 0] +Interface 400 child 7 config: [262, 0] +Interface 400 child 8 config: [262, 0] +Interface 400 child 9 config: [262, 0] +Interface 400 child 10 config: [262, 0] +Interface 400 child 12 config: [261, 0] +Interface 400 child 13 config: [261, 0] +Interface 400 child 14 config: [261, 0] +Interface 400 child 16 config: [261, 0] +Interface 402 child 139 config: [261, 0] +Interface 402 child 138 config: [261, 0] +Interface 402 child 141 config: [261, 0] +Interface 402 child 140 config: [261, 0] +Interface 402 child 143 config: [261, 0] +Interface 402 child 142 config: [261, 0] +Interface 402 child 152 config: [261, 0] +Interface 402 child 153 config: [261, 0] +Interface 402 child 154 config: [261, 0] +Interface 402 child 155 config: [261, 0] +Interface 402 child 156 config: [261, 0] +Interface 402 child 157 config: [261, 0] +Interface 402 child 159 config: [261, 0] +Interface 402 child 144 config: [261, 0] +Interface 402 child 145 config: [261, 0] +Interface 402 child 146 config: [261, 0] +Interface 402 child 147 config: [261, 0] +Interface 402 child 148 config: [261, 0] +Interface 402 child 149 config: [261, 0] +Interface 402 child 150 config: [261, 0] +Interface 402 child 151 config: [261, 0] +Interface 408 child 7 config: [719, 28] +Interface 408 child 8 config: [719, 29] +Interface 408 child 9 config: [719, 30] +Interface 408 child 10 config: [719, 31] +Interface 409 child 1 config: [1, 0] +Interface 409 child 2 config: [1, 1] +Interface 409 child 3 config: [1, 2] +Interface 411 child 9 config: [788, 0] +Interface 411 child 10 config: [788, 0] +Interface 411 child 11 config: [788, 0] +Interface 411 child 12 config: [788, 0] +Interface 422 child 0 config: [425, 1] +Interface 428 child 1 config: [822, 9], [822, 0] +Interface 428 child 2 config: [821, 22] +Interface 428 child 3 config: [821, 22] +Interface 428 child 4 config: [821, 22] +Interface 428 child 5 config: [821, 22] +Interface 428 child 6 config: [821, 22] +Interface 428 child 7 config: [821, 22] +Interface 428 child 8 config: [821, 22] +Interface 428 child 9 config: [821, 22] +Interface 428 child 10 config: [821, 22] +Interface 428 child 11 config: [821, 22] +Interface 428 child 12 config: [821, 22] +Interface 428 child 13 config: [821, 22] +Interface 428 child 14 config: [821, 22] +Interface 428 child 15 config: [821, 22] +Interface 428 child 17 config: [821, 22] +Interface 428 child 16 config: [821, 22] +Interface 428 child 19 config: [821, 22] +Interface 428 child 18 config: [821, 22] +Interface 428 child 21 config: [821, 22] +Interface 428 child 20 config: [821, 22] +Interface 428 child 23 config: [821, 22] +Interface 428 child 22 config: [821, 22] +Interface 428 child 25 config: [821, 22] +Interface 428 child 24 config: [821, 22] +Interface 428 child 27 config: [821, 22] +Interface 428 child 26 config: [821, 22] +Interface 428 child 29 config: [821, 22] +Interface 428 child 31 config: [821, 22] +Interface 428 child 30 config: [821, 22] +Interface 428 child 34 config: [821, 22] +Interface 428 child 35 config: [821, 22] +Interface 428 child 32 config: [821, 22] +Interface 428 child 33 config: [821, 22] +Interface 428 child 38 config: [821, 22] +Interface 428 child 39 config: [821, 22] +Interface 428 child 36 config: [821, 22] +Interface 428 child 37 config: [821, 22] +Interface 428 child 42 config: [821, 22] +Interface 428 child 43 config: [821, 22] +Interface 428 child 40 config: [821, 22] +Interface 428 child 41 config: [821, 22] +Interface 428 child 46 config: [821, 22] +Interface 428 child 47 config: [821, 22] +Interface 428 child 44 config: [821, 22] +Interface 428 child 45 config: [821, 22] +Interface 428 child 51 config: [821, 22] +Interface 428 child 50 config: [821, 22] +Interface 428 child 49 config: [821, 22] +Interface 428 child 48 config: [821, 22] +Interface 428 child 54 config: [821, 22] +Interface 428 child 53 config: [821, 22] +Interface 428 child 52 config: [821, 22] +Interface 433 child 21 config: [834, 8] +Interface 433 child 20 config: [834, 0] +Interface 433 child 23 config: [835, 8] +Interface 433 child 22 config: [835, 0] +Interface 445 child 3 config: [846, 0] +Interface 445 child 4 config: [846, 0] +Interface 445 child 5 config: [846, 0] +Interface 445 child 6 config: [846, 0] +Interface 445 child 7 config: [846, 0] +Interface 445 child 8 config: [846, 0] +Interface 445 child 9 config: [846, 0] +Interface 445 child 10 config: [846, 0] +Interface 445 child 11 config: [846, 0] +Interface 445 child 12 config: [846, 0] +Interface 445 child 13 config: [846, 4] +Interface 445 child 14 config: [846, 4] +Interface 445 child 15 config: [846, 4] +Interface 445 child 17 config: [846, 4] +Interface 445 child 16 config: [846, 4] +Interface 445 child 19 config: [846, 4] +Interface 445 child 18 config: [846, 4] +Interface 445 child 21 config: [846, 4] +Interface 445 child 20 config: [846, 4] +Interface 445 child 23 config: [847, 10] +Interface 445 child 22 config: [846, 4] +Interface 445 child 25 config: [847, 12] +Interface 445 child 24 config: [847, 8] +Interface 445 child 27 config: [847, 8] +Interface 445 child 26 config: [847, 12] +Interface 445 child 28 config: [847, 10] +Interface 447 child 2 config: [846, 12] +Interface 447 child 3 config: [846, 12] +Interface 447 child 4 config: [846, 12] +Interface 447 child 5 config: [846, 12] +Interface 447 child 6 config: [846, 12] +Interface 447 child 7 config: [846, 12] +Interface 447 child 8 config: [846, 12] +Interface 447 child 9 config: [846, 12] +Interface 447 child 10 config: [846, 12] +Interface 447 child 11 config: [846, 12] +Interface 447 child 12 config: [846, 8] +Interface 447 child 13 config: [846, 8] +Interface 447 child 14 config: [846, 8] +Interface 447 child 15 config: [846, 8] +Interface 447 child 17 config: [846, 8] +Interface 447 child 16 config: [846, 8] +Interface 447 child 19 config: [846, 8] +Interface 447 child 18 config: [846, 8] +Interface 447 child 21 config: [846, 8] +Interface 447 child 20 config: [846, 8] +Interface 447 child 23 config: [846, 20] +Interface 447 child 22 config: [846, 20] +Interface 447 child 25 config: [846, 20] +Interface 447 child 24 config: [846, 20] +Interface 447 child 27 config: [846, 20] +Interface 447 child 26 config: [846, 20] +Interface 447 child 29 config: [846, 20] +Interface 447 child 28 config: [846, 20] +Interface 447 child 31 config: [846, 20] +Interface 447 child 30 config: [846, 20] +Interface 447 child 34 config: [846, 16] +Interface 447 child 35 config: [846, 16] +Interface 447 child 32 config: [846, 16] +Interface 447 child 33 config: [846, 16] +Interface 447 child 38 config: [846, 16] +Interface 447 child 39 config: [846, 16] +Interface 447 child 36 config: [846, 16] +Interface 447 child 37 config: [846, 16] +Interface 447 child 42 config: [846, 28] +Interface 447 child 43 config: [846, 28] +Interface 447 child 40 config: [846, 16] +Interface 447 child 41 config: [846, 16] +Interface 447 child 46 config: [846, 28] +Interface 447 child 47 config: [846, 28] +Interface 447 child 44 config: [846, 28] +Interface 447 child 45 config: [846, 28] +Interface 447 child 51 config: [846, 28] +Interface 447 child 50 config: [846, 28] +Interface 447 child 49 config: [846, 28] +Interface 447 child 48 config: [846, 28] +Interface 447 child 55 config: [846, 24] +Interface 447 child 54 config: [846, 24] +Interface 447 child 53 config: [846, 24] +Interface 447 child 52 config: [846, 24] +Interface 447 child 59 config: [846, 24] +Interface 447 child 58 config: [846, 24] +Interface 447 child 57 config: [846, 24] +Interface 447 child 56 config: [846, 24] +Interface 447 child 63 config: [847, 14] +Interface 447 child 62 config: [847, 16] +Interface 447 child 61 config: [846, 24] +Interface 447 child 60 config: [846, 24] +Interface 447 child 68 config: [847, 22] +Interface 447 child 69 config: [847, 20] +Interface 447 child 70 config: [847, 24] +Interface 447 child 71 config: [847, 24] +Interface 447 child 64 config: [847, 18] +Interface 447 child 65 config: [847, 18] +Interface 447 child 66 config: [847, 14] +Interface 447 child 67 config: [847, 16] +Interface 447 child 76 config: [847, 30] +Interface 447 child 77 config: [847, 30] +Interface 447 child 78 config: [847, 26] +Interface 447 child 79 config: [847, 28] +Interface 447 child 72 config: [847, 20] +Interface 447 child 73 config: [847, 22] +Interface 447 child 74 config: [847, 28] +Interface 447 child 75 config: [847, 26] +Interface 462 child 23 config: [262, 0] +Interface 462 child 22 config: [261, 0] +Interface 462 child 25 config: [264, 0] +Interface 462 child 24 config: [263, 0] +Interface 462 child 27 config: [266, 0] +Interface 462 child 26 config: [265, 0] +Interface 471 child 7 config: [913, 0] +Interface 471 child 8 config: [913, 4] +Interface 473 child 2 config: [43, 0] +Interface 473 child 3 config: [43, 0] +Interface 473 child 4 config: [43, 0] +Interface 473 child 12 config: [300, 0] +Interface 473 child 13 config: [300, 0] +Interface 473 child 14 config: [300, 0] +Interface 473 child 15 config: [300, 0] +Interface 473 child 17 config: [300, 0] +Interface 473 child 16 config: [300, 0] +Interface 473 child 19 config: [300, 0] +Interface 473 child 18 config: [300, 0] +Interface 473 child 21 config: [300, 0] +Interface 473 child 20 config: [300, 0] +Interface 473 child 22 config: [301, 0] +Interface 473 child 25 config: [172, 0] +Interface 473 child 24 config: [172, 0] +Interface 474 child 2 config: [43, 0] +Interface 474 child 3 config: [43, 0] +Interface 474 child 4 config: [43, 0] +Interface 474 child 12 config: [300, 0] +Interface 474 child 13 config: [300, 0] +Interface 474 child 14 config: [300, 0] +Interface 474 child 15 config: [300, 0] +Interface 474 child 17 config: [300, 0] +Interface 474 child 16 config: [300, 0] +Interface 474 child 19 config: [300, 0] +Interface 474 child 18 config: [300, 0] +Interface 474 child 21 config: [300, 0] +Interface 474 child 20 config: [300, 0] +Interface 474 child 22 config: [301, 0] +Interface 474 child 24 config: [172, 0] +Interface 474 child 28 config: [172, 0] +Interface 475 child 2 config: [43, 0] +Interface 475 child 3 config: [43, 0] +Interface 475 child 4 config: [43, 0] +Interface 475 child 12 config: [300, 0] +Interface 475 child 13 config: [300, 0] +Interface 475 child 14 config: [300, 0] +Interface 475 child 15 config: [300, 0] +Interface 475 child 17 config: [300, 0] +Interface 475 child 16 config: [300, 0] +Interface 475 child 19 config: [300, 0] +Interface 475 child 18 config: [300, 0] +Interface 475 child 21 config: [300, 0] +Interface 475 child 20 config: [300, 0] +Interface 475 child 22 config: [301, 0] +Interface 475 child 24 config: [172, 0] +Interface 475 child 28 config: [172, 0] +Interface 476 child 2 config: [43, 0] +Interface 476 child 3 config: [43, 0] +Interface 476 child 4 config: [43, 0] +Interface 476 child 12 config: [300, 0] +Interface 476 child 13 config: [300, 0] +Interface 476 child 14 config: [300, 0] +Interface 476 child 15 config: [300, 0] +Interface 476 child 17 config: [300, 0] +Interface 476 child 16 config: [300, 0] +Interface 476 child 19 config: [300, 0] +Interface 476 child 18 config: [300, 0] +Interface 476 child 21 config: [300, 0] +Interface 476 child 20 config: [300, 0] +Interface 476 child 22 config: [301, 0] +Interface 476 child 24 config: [172, 0] +Interface 476 child 28 config: [172, 0] +Interface 491 child 85 config: [261, 0] +Interface 491 child 83 config: [261, 0] +Interface 491 child 92 config: [261, 0] +Interface 491 child 94 config: [261, 0] +Interface 491 child 101 config: [261, 0] +Interface 491 child 99 config: [261, 0] +Interface 491 child 108 config: [261, 0] +Interface 491 child 106 config: [261, 0] +Interface 491 child 115 config: [261, 0] +Interface 491 child 113 config: [261, 0] +Interface 491 child 127 config: [261, 0] +Interface 491 child 122 config: [261, 0] +Interface 491 child 120 config: [261, 0] +Interface 491 child 136 config: [261, 0] +Interface 491 child 141 config: [261, 0] +Interface 491 child 143 config: [261, 0] +Interface 491 child 129 config: [261, 0] +Interface 491 child 134 config: [261, 0] +Interface 491 child 155 config: [261, 0] +Interface 491 child 157 config: [261, 0] +Interface 491 child 148 config: [261, 0] +Interface 491 child 150 config: [261, 0] +Interface 491 child 171 config: [261, 0] +Interface 491 child 169 config: [261, 0] +Interface 491 child 162 config: [261, 0] +Interface 491 child 164 config: [261, 0] +Interface 491 child 185 config: [261, 0] +Interface 491 child 190 config: [261, 0] +Interface 491 child 178 config: [261, 0] +Interface 491 child 176 config: [261, 0] +Interface 491 child 183 config: [261, 0] +Interface 491 child 192 config: [261, 0] +Interface 491 child 223 config: [261, 0] +Interface 491 child 229 config: [261, 0] +Interface 491 child 228 config: [261, 0] +Interface 491 child 227 config: [261, 0] +Interface 491 child 226 config: [261, 0] +Interface 491 child 225 config: [261, 0] +Interface 491 child 224 config: [261, 0] +Interface 518 child 84 config: [984, 8] +Interface 518 child 87 config: [984, 12] +Interface 518 child 80 config: [986, 28] +Interface 518 child 83 config: [984, 4] +Interface 518 child 82 config: [984, 0] +Interface 518 child 93 config: [985, 4] +Interface 518 child 92 config: [985, 0] +Interface 518 child 95 config: [985, 12] +Interface 518 child 94 config: [985, 8] +Interface 518 child 89 config: [984, 20] +Interface 518 child 88 config: [984, 16] +Interface 518 child 91 config: [984, 28] +Interface 518 child 90 config: [984, 24] +Interface 518 child 102 config: [986, 8] +Interface 518 child 100 config: [986, 0] +Interface 518 child 101 config: [986, 4] +Interface 518 child 98 config: [985, 24] +Interface 518 child 99 config: [985, 28] +Interface 518 child 96 config: [985, 16] +Interface 518 child 97 config: [985, 20] +Interface 540 child 117 config: [1018, 18] +Interface 540 child 114 config: [1018, 18] +Interface 540 child 123 config: [1018, 18] +Interface 540 child 120 config: [1018, 18] +Interface 559 child 55 config: [1037, 1] +Interface 559 child 59 config: [1037, 5] +Interface 559 child 58 config: [1037, 4] +Interface 559 child 57 config: [1037, 3] +Interface 559 child 56 config: [1037, 2] +Interface 559 child 63 config: [1037, 9] +Interface 559 child 62 config: [1037, 8] +Interface 559 child 61 config: [1037, 7] +Interface 559 child 60 config: [1037, 6] +Interface 559 child 68 config: [1037, 14] +Interface 559 child 69 config: [1037, 0] +Interface 559 child 64 config: [1037, 10] +Interface 559 child 65 config: [1037, 11] +Interface 559 child 66 config: [1037, 12] +Interface 559 child 67 config: [1037, 13] diff --git a/dumps/498/498_interface_containers.txt b/dumps/498/498_interface_containers.txt new file mode 100644 index 000000000..f29e47224 --- /dev/null +++ b/dumps/498/498_interface_containers.txt @@ -0,0 +1,80 @@ +Interface 2 has container childs: [48] +Interface 11 has container childs: [61] +Interface 12 has container childs: [89] +Interface 15 has container childs: [0] (no components) +Interface 32 has container childs: [113] +Interface 35 has container childs: [92] +Interface 36 has container childs: [110] +Interface 39 has container childs: [90] +Interface 40 has container childs: [127] +Interface 43 has container childs: [105] +Interface 44 has container childs: [161] +Interface 47 has container childs: [138] +Interface 56 has container childs: [0] (no components) +Interface 57 has container childs: [0] (no components) +Interface 60 has container childs: [89, 90] +Interface 94 has container childs: [0] +Interface 96 has container childs: [0] (no components) +Interface 97 has container childs: [0] (no components) +Interface 98 has container childs: [0] (no components) +Interface 100 has container childs: [0] (no components) +Interface 115 has container childs: [0] (no components) +Interface 117 has container childs: [0] (no components) +Interface 118 has container childs: [0] (no components) +Interface 125 has container childs: [68, 69] +Interface 126 has container childs: [0, 1] +Interface 145 has container childs: [10] +Interface 146 has container childs: [0] (no components) +Interface 149 has container childs: [0] (no components) +Interface 155 has container childs: [0] (no components) +Interface 179 has container childs: [0] (no components) +Interface 180 has container childs: [0] (no components) +Interface 215 has container childs: [0] (no components) +Interface 226 has container childs: [0] (no components) +Interface 257 has container childs: [0] (no components) +Interface 278 has container childs: [89] +Interface 284 has container childs: [0] (no components) +Interface 287 has container childs: [2] +Interface 288 has container childs: [131] +Interface 289 has container childs: [62] +Interface 290 has container childs: [8] +Interface 296 has container childs: [0] (no components) +Interface 311 has container childs: [3] +Interface 317 has container childs: [0] (no components) +Interface 323 has container childs: [2] +Interface 333 has container childs: [0] (no components) +Interface 336 has container childs: [0] (no components) +Interface 363 has container childs: [1, 7] +Interface 364 has container childs: [1] +Interface 367 has container childs: [75] +Interface 385 has container childs: [0] (no components) +Interface 386 has container childs: [0] (no components) +Interface 387 has container childs: [28] +Interface 392 has container childs: [3] +Interface 394 has container childs: [106] +Interface 396 has container childs: [132] +Interface 404 has container childs: [0] (no components) +Interface 413 has container childs: [0] (no components) +Interface 442 has container childs: [2, 4] +Interface 449 has container childs: [0] (no components) +Interface 467 has container childs: [164] +Interface 477 has container childs: [75] +Interface 478 has container childs: [61] +Interface 483 has container childs: [0] (no components) +Interface 504 has container childs: [0] (no components) +Interface 512 has container childs: [0] (no components) +Interface 513 has container childs: [0] (no components) +Interface 516 has container childs: [0] (no components) +Interface 517 has container childs: [0] (no components) +Interface 518 has container childs: [78] +Interface 539 has container childs: [0] (no components) +Interface 545 has container childs: [0] (no components) +Interface 602 has container childs: [0] (no components) +Interface 610 has container childs: [0] (no components) +Interface 621 has container childs: [0] (no components) +Interface 628 has container childs: [0] (no components) +Interface 644 has container childs: [0] (no components) +Interface 648 has container childs: [0] (no components) +Interface 665 has container childs: [0] (no components) +Interface 670 has container childs: [0] (no components) +Interface 713 has container childs: [0] (no components) diff --git a/dumps/498/498_interface_dump.txt b/dumps/498/498_interface_dump.txt new file mode 100644 index 000000000..bce0ff37a --- /dev/null +++ b/dumps/498/498_interface_dump.txt @@ -0,0 +1,4769 @@ +RSInterface 4 - [22: Water Collected] +RSInterface 4 - [23: Time Left] +RSInterface 4 - [25: %1] +RSInterface 6 - [90: Brimhaven Agility Arena Ticket Exchange] +RSInterface 6 - [91: Toadflax] +RSInterface 6 - [92: Pirate's hook] +RSInterface 6 - [94: Experience (1)] +RSInterface 6 - [100: Snapdragon] +RSInterface 6 - [101: Experience (10)] +RSInterface 6 - [102: Experience (25)] +RSInterface 6 - [103: Experience (100)] +RSInterface 6 - [104: Experience (1000)] +RSInterface 8 - [3: 8-East] +RSInterface 8 - [4: 6-South] +RSInterface 8 - [5: 2-North] +RSInterface 8 - [6: 4-East] +RSInterface 8 - [7: 22-South] +RSInterface 8 - [8: X marks the start!] +RSInterface 8 - [9: Dragontooth Island] +RSInterface 9 - [2: Rune-Draw] +RSInterface 9 - [3: Your Score] +RSInterface 9 - [4: Opponent's Score] +RSInterface 9 - [5: Draw] +RSInterface 9 - [6: Hold] +RSInterface 9 - [27: DEATH] +RSInterface 9 - [28: Text] +RSInterface 9 - [29: DEATH] +RSInterface 9 - [30: Text] +RSInterface 10 - [1: Windspeed:] +RSInterface 11 - [60: The Bank of RuneScape - Deposit Box] +RSInterface 12 - [90: The Bank of RuneScape] +RSInterface 12 - [94: Withdraw as:] +RSInterface 12 - [95: Item] +RSInterface 12 - [96: Rearrange mode:] +RSInterface 12 - [97: Note] +RSInterface 12 - [100: Insert] +RSInterface 12 - [101: Swap] +RSInterface 13 - [11: 0] +RSInterface 13 - [12: 0] +RSInterface 13 - [13: 0] +RSInterface 13 - [14: 0] +RSInterface 13 - [15: 0] +RSInterface 13 - [16: 0] +RSInterface 13 - [17: 0] +RSInterface 13 - [18: 0] +RSInterface 13 - [19: 0] +RSInterface 13 - [20: 0] +RSInterface 13 - [28: Please enter your FOUR DIGIT PIN using the buttons below.] +RSInterface 13 - [30: Exit] +RSInterface 13 - [31: YOUR PIN WILL BE DELETED IN X DAYS] +RSInterface 14 - [40: Bank PIN Settings] +RSInterface 14 - [41: Messages] +RSInterface 14 - [60: Set a PIN] +RSInterface 14 - [61: Change your recovery delay] +RSInterface 14 - [62: Change your PIN] +RSInterface 14 - [63: Delete your PIN] +RSInterface 14 - [64: Change your recovery delay] +RSInterface 14 - [65: Cancel the PIN that's pending] +RSInterface 14 - [68: Your Bank PIN status:] +RSInterface 14 - [69: Unknown] +RSInterface 14 - [70: Recovery delay:] +RSInterface 14 - [71: X days] +RSInterface 14 - [73: Do you really wish to do that?] +RSInterface 14 - [86: Use the buttons below to change your PIN settings] +RSInterface 14 - [89: Yes, I really want to do that.] +RSInterface 17 - [2: Message of the week] +RSInterface 18 - [2: Message of the week] +RSInterface 19 - [2: Message of the week] +RSInterface 20 - [2: Message of the week] +RSInterface 21 - [2: Message of the week] +RSInterface 22 - [2: Message of the week] +RSInterface 23 - [2: Message of the week] +RSInterface 24 - [0: Kill Count: %1] +RSInterface 25 - [5: Which is the next shape in the above sequence?] +RSInterface 25 - [9: 1.] +RSInterface 25 - [10: 2.] +RSInterface 25 - [11: 3.] +RSInterface 25 - [12: 4.] +RSInterface 26 - [3: title] +RSInterface 26 - [68: page%1] +RSInterface 26 - [69: page%2] +RSInterface 26 - [73: line2] +RSInterface 26 - [74: line3] +RSInterface 26 - [75: line4] +RSInterface 26 - [76: line5] +RSInterface 26 - [77: line6] +RSInterface 26 - [78: line7] +RSInterface 26 - [79: line8] +RSInterface 26 - [80: line9] +RSInterface 26 - [81: line10] +RSInterface 26 - [82: line11] +RSInterface 26 - [83: line12] +RSInterface 26 - [84: line13] +RSInterface 26 - [85: line14] +RSInterface 26 - [86: line15] +RSInterface 26 - [87: line16] +RSInterface 26 - [88: line17] +RSInterface 26 - [89: line18] +RSInterface 26 - [90: line19] +RSInterface 26 - [91: line20] +RSInterface 26 - [92: line21] +RSInterface 26 - [93: line22] +RSInterface 26 - [94: line23] +RSInterface 26 - [95: line24] +RSInterface 26 - [96: line25] +RSInterface 26 - [97: line26] +RSInterface 26 - [98: line27] +RSInterface 26 - [99: line28] +RSInterface 26 - [100: line28] +RSInterface 26 - [101: line29] +RSInterface 27 - [6: page%1] +RSInterface 27 - [7: page%2] +RSInterface 27 - [39: line1] +RSInterface 27 - [40: line2] +RSInterface 27 - [41: line3] +RSInterface 27 - [42: line4] +RSInterface 27 - [43: line5] +RSInterface 27 - [44: line6] +RSInterface 27 - [45: line7] +RSInterface 27 - [46: line8] +RSInterface 27 - [47: line9] +RSInterface 27 - [48: line10] +RSInterface 27 - [49: line11] +RSInterface 27 - [50: line12] +RSInterface 27 - [51: line13] +RSInterface 27 - [52: line14] +RSInterface 27 - [53: line15] +RSInterface 27 - [54: line16] +RSInterface 27 - [55: line17] +RSInterface 27 - [56: line18] +RSInterface 27 - [57: line19] +RSInterface 27 - [58: line20] +RSInterface 27 - [59: line21] +RSInterface 27 - [60: line22] +RSInterface 27 - [61: line23] +RSInterface 27 - [62: line24] +RSInterface 27 - [63: line25] +RSInterface 27 - [64: line26] +RSInterface 27 - [65: line27] +RSInterface 27 - [66: line28] +RSInterface 27 - [67: line28] +RSInterface 27 - [68: line29] +RSInterface 27 - [160: Index] +RSInterface 28 - [75: Iron: %1] +RSInterface 28 - [76: Blast Furnace Bar Stock] +RSInterface 28 - [77: Bronze: %1] +RSInterface 28 - [100: Steel: %1] +RSInterface 28 - [101: Mithril: %1] +RSInterface 28 - [102: Adamantite: %1] +RSInterface 28 - [103: Runite: %1] +RSInterface 28 - [104: Silver: %1] +RSInterface 28 - [105: Gold: %1] +RSInterface 28 - [106: Perfect gold: %1] +RSInterface 28 - [107: Coal to add: %2] +RSInterface 28 - [108: (All)] +RSInterface 28 - [109: (All)] +RSInterface 28 - [110: (All)] +RSInterface 28 - [111: (All)] +RSInterface 28 - [112: (All)] +RSInterface 28 - [113: (All)] +RSInterface 28 - [114: (All)] +RSInterface 28 - [115: (All)] +RSInterface 28 - [116: (All)] +RSInterface 29 - [2: Blast Furnace Plan] +RSInterface 29 - [3: Stove] +RSInterface 29 - [4: Air Pump] +RSInterface 29 - [5: Temp Gauge] +RSInterface 29 - [6: Furnace] +RSInterface 29 - [7: Dispenser] +RSInterface 29 - [8: Conveyor
Belt] +RSInterface 29 - [9: Cogs] +RSInterface 29 - [10: Pipes] +RSInterface 29 - [11: Coke] +RSInterface 30 - [0: Blast Furnace Temp Gauge] +RSInterface 31 - [66: Challenge: Select Game] +RSInterface 31 - [68: Select] +RSInterface 31 - [78: Draughts] +RSInterface 31 - [79: Runelink] +RSInterface 31 - [80: 100 vs 100] +RSInterface 31 - [81: 100 vs 100] +RSInterface 31 - [82: Game:] +RSInterface 31 - [83: Ranks (mine vs opponents):] +RSInterface 31 - [85: Runesquares] +RSInterface 31 - [86: 100 vs 100] +RSInterface 31 - [88: Runeversi] +RSInterface 31 - [89: 100 vs 100] +RSInterface 32 - [67: Insert a very long name here!] +RSInterface 32 - [75: vs] +RSInterface 32 - [76: Insert a very long name here!] +RSInterface 32 - [88: Turn:] +RSInterface 32 - [91: Draughts] +RSInterface 32 - [93: Resign] +RSInterface 32 - [95: Offer draw] +RSInterface 32 - [98: A very long name] +RSInterface 32 - [111: Blah blah blah blah blah blah blah!] +RSInterface 32 - [118: Blah blah blah blah blah blah blah!] +RSInterface 32 - [119: Blah blah blah blah blah!] +RSInterface 33 - [66: Draughts: Options] +RSInterface 33 - [68: Challenge] +RSInterface 33 - [75: 30 seconds] +RSInterface 33 - [81: 1 minute] +RSInterface 33 - [82: 2 minutes] +RSInterface 33 - [83: 15 seconds] +RSInterface 33 - [84: Time per move:] +RSInterface 33 - [88: Choose piece:] +RSInterface 33 - [111: Ranked] +RSInterface 34 - [1: Draughts] +RSInterface 35 - [67: Insert a very long name here!] +RSInterface 35 - [75: vs] +RSInterface 35 - [76: Insert a very long name here!] +RSInterface 35 - [88: Draughts] +RSInterface 35 - [96: Blah blah blah blah blah!] +RSInterface 35 - [98: Close] +RSInterface 35 - [107: Blah blah blah blah blah blah blah!] +RSInterface 36 - [66: Insert a very long name here!] +RSInterface 36 - [73: vs] +RSInterface 36 - [74: Insert a very long name here!] +RSInterface 36 - [86: Turn:] +RSInterface 36 - [90: Runelink] +RSInterface 36 - [92: Resign] +RSInterface 36 - [94: Offer draw] +RSInterface 36 - [97: A very long name] +RSInterface 36 - [111: Blah blah blah blah blah blah blah!] +RSInterface 36 - [115: Blah blah blah blah blah blah blah!] +RSInterface 36 - [123: Blah blah blah blah blah!] +RSInterface 36 - [126: Close] +RSInterface 37 - [66: Runelink: Options] +RSInterface 37 - [68: Challenge] +RSInterface 37 - [75: 30 seconds] +RSInterface 37 - [81: 1 minute] +RSInterface 37 - [82: 2 minutes] +RSInterface 37 - [83: 15 seconds] +RSInterface 37 - [84: Time per move:] +RSInterface 37 - [88: Choose piece:] +RSInterface 37 - [111: Ranked] +RSInterface 38 - [1: Runelink] +RSInterface 39 - [67: Insert a very long name here!] +RSInterface 39 - [75: vs] +RSInterface 39 - [76: Insert a very long name here!] +RSInterface 39 - [88: Runelink] +RSInterface 39 - [95: Blah blah blah blah blah!] +RSInterface 39 - [97: Close] +RSInterface 39 - [106: Blah blah blah blah blah blah blah!] +RSInterface 40 - [67: Insert a very long name here!] +RSInterface 40 - [75: vs] +RSInterface 40 - [76: Insert a very long name here!] +RSInterface 40 - [88: Turn:] +RSInterface 40 - [92: Runesquares] +RSInterface 40 - [94: Resign] +RSInterface 40 - [96: Offer draw] +RSInterface 40 - [99: A very long name] +RSInterface 40 - [110: Blah blah blah blah blah blah blah!] +RSInterface 40 - [114: Blah blah blah blah blah blah blah!] +RSInterface 40 - [115: Blah blah blah blah blah!] +RSInterface 40 - [118: Close] +RSInterface 41 - [66: Runesquares: Options] +RSInterface 41 - [68: Challenge] +RSInterface 41 - [75: 30 seconds] +RSInterface 41 - [81: 1 minute] +RSInterface 41 - [82: 2 minutes] +RSInterface 41 - [83: 15 seconds] +RSInterface 41 - [84: Time per move:] +RSInterface 41 - [88: Choose piece:] +RSInterface 41 - [111: Ranked] +RSInterface 42 - [1: Runesquares] +RSInterface 43 - [67: Insert a very long name here!] +RSInterface 43 - [75: vs] +RSInterface 43 - [76: Insert a very long name here!] +RSInterface 43 - [88: Blah blah blah blah blah blah blah!] +RSInterface 43 - [92: Blah blah blah blah blah blah blah!] +RSInterface 43 - [93: Blah blah blah blah blah!] +RSInterface 43 - [96: Close] +RSInterface 44 - [67: Insert a very long name here!] +RSInterface 44 - [75: vs] +RSInterface 44 - [76: Insert a very long name here!] +RSInterface 44 - [88: Turn:] +RSInterface 44 - [92: Runeversi] +RSInterface 44 - [94: Resign] +RSInterface 44 - [96: Offer draw] +RSInterface 44 - [100: A very long name] +RSInterface 44 - [142: Blah blah blah blah blah blah blah!] +RSInterface 44 - [148: Blah blah blah blah blah blah blah!] +RSInterface 44 - [149: Blah blah blah blah blah!] +RSInterface 44 - [152: Close] +RSInterface 45 - [66: Runeversi: Options] +RSInterface 45 - [68: Challenge] +RSInterface 45 - [75: 30 seconds] +RSInterface 45 - [81: 1 minute] +RSInterface 45 - [82: 2 minutes] +RSInterface 45 - [83: 15 seconds] +RSInterface 45 - [84: Time per move:] +RSInterface 45 - [88: Choose piece:] +RSInterface 45 - [111: Ranked] +RSInterface 46 - [1: Runeversi] +RSInterface 47 - [67: Insert a very long name here!] +RSInterface 47 - [75: vs] +RSInterface 47 - [76: Insert a very long name here!] +RSInterface 47 - [88: Runeversi] +RSInterface 47 - [89: Blah blah blah blah blah blah blah!] +RSInterface 47 - [93: Blah blah blah blah blah blah blah!] +RSInterface 47 - [94: Blah blah blah blah blah!] +RSInterface 47 - [129: Close] +RSInterface 49 - [38: book title] +RSInterface 49 - [87: line1] +RSInterface 49 - [88: line2] +RSInterface 49 - [89: line3] +RSInterface 49 - [90: line4] +RSInterface 49 - [91: line5] +RSInterface 49 - [92: line6] +RSInterface 49 - [93: line7] +RSInterface 49 - [94: line8] +RSInterface 49 - [95: line9] +RSInterface 49 - [96: line10] +RSInterface 49 - [97: line11] +RSInterface 49 - [98: line12] +RSInterface 49 - [99: line13] +RSInterface 49 - [100: line14] +RSInterface 49 - [101: line15] +RSInterface 49 - [102: line16] +RSInterface 49 - [103: line17] +RSInterface 49 - [104: line18] +RSInterface 49 - [105: line19] +RSInterface 49 - [106: line20] +RSInterface 49 - [107: line21] +RSInterface 49 - [108: line22] +RSInterface 49 - [109: Page%1] +RSInterface 49 - [110: Page%2] +RSInterface 50 - [76: Brooch] +RSInterface 51 - [11: Canifis] +RSInterface 51 - [12: Mort Myre
Swamp] +RSInterface 51 - [13: Hollows] +RSInterface 51 - [14: Mort'ton] +RSInterface 51 - [15: Graveyard] +RSInterface 51 - [16: Temple] +RSInterface 51 - [20: Route 1] +RSInterface 51 - [21: Route 1] +RSInterface 51 - [23: Route 2] +RSInterface 51 - [24: Route 2] +RSInterface 51 - [26: Route 1:

Take the route through
Canifis.

Shorter but potentially
more dangerous.] +RSInterface 51 - [27: Route 2:

Take the route through
Mort Myre Swamp.

Longer but less likely
to be attacked.] +RSInterface 51 - [31: Burgh de
Rott] +RSInterface 51 - [32: Choose your path] +RSInterface 52 - [16: A Stable Dugout.] +RSInterface 52 - [17: A Waka.] +RSInterface 52 - [18: A Dugout.] +RSInterface 52 - [19: A Log.] +RSInterface 52 - [20: WHAT SORT OF CANOE WOULD YOU LIKE TO MAKE ?] +RSInterface 53 - [25: Lumbridge] +RSInterface 53 - [26: Champions
Guild] +RSInterface 53 - [27: Barbarian
Village] +RSInterface 53 - [28: Edgeville] +RSInterface 53 - [29: Wilderness Pond -
No canoe trees here.] +RSInterface 53 - [37: You are here] +RSInterface 53 - [42: Wilderness Pond -
No canoe trees here.] +RSInterface 53 - [46: You are here] +RSInterface 53 - [49: You are here] +RSInterface 53 - [52: You are here] +RSInterface 53 - [55: Please Select
Your Destination] +RSInterface 54 - [88: Catapult Controls] +RSInterface 54 - [157: Fire Catapult] +RSInterface 55 - [0: Total Wins This Season!] +RSInterface 55 - [1: Saradomin: 0] +RSInterface 55 - [2: Zamorak: 0] +RSInterface 58 - [0: Zamorak = %1] +RSInterface 58 - [1: %1 = Saradomin] +RSInterface 58 - [7: Health %1%] +RSInterface 58 - [8: %1 Min] +RSInterface 58 - [11: Locked] +RSInterface 58 - [13: Collapsed] +RSInterface 58 - [15: Collapsed] +RSInterface 58 - [17: Operational] +RSInterface 59 - [0: Zamorak = %1] +RSInterface 59 - [1: %1 = Saradomin] +RSInterface 59 - [7: Health %1%] +RSInterface 59 - [8: %1 Min] +RSInterface 59 - [11: Locked] +RSInterface 59 - [13: Collapsed] +RSInterface 59 - [15: Collapsed] +RSInterface 59 - [17: Operational] +RSInterface 60 - [88: Castle Wars Ticket Exchange] +RSInterface 61 - [10: A] +RSInterface 61 - [11: A] +RSInterface 61 - [12: A] +RSInterface 61 - [13: A] +RSInterface 61 - [14: A] +RSInterface 61 - [15: A] +RSInterface 61 - [30: Name Your Cat] +RSInterface 61 - [32: E N T E R] +RSInterface 63 - [1: Congratulations!] +RSInterface 63 - [2: Well done, you defeated the Champion!] +RSInterface 63 - [5: You are awarded:] +RSInterface 63 - [6: %1 Slayer Xp] +RSInterface 63 - [7: %1 Hitpoint Xp] +RSInterface 64 - [1: Name] +RSInterface 64 - [2: Line1] +RSInterface 65 - [1: Name] +RSInterface 65 - [2: Line1] +RSInterface 65 - [3: Line2] +RSInterface 66 - [1: Name] +RSInterface 66 - [2: Line1] +RSInterface 66 - [3: Line2] +RSInterface 66 - [4: Line3] +RSInterface 67 - [1: Name] +RSInterface 67 - [2: Line1] +RSInterface 67 - [3: Line2] +RSInterface 67 - [4: Line3] +RSInterface 67 - [5: Line4] +RSInterface 68 - [1: Name] +RSInterface 69 - [1: Name] +RSInterface 69 - [2: Line1] +RSInterface 70 - [1: Name] +RSInterface 70 - [2: Line1] +RSInterface 70 - [3: Line2] +RSInterface 71 - [1: Name] +RSInterface 71 - [2: Line1] +RSInterface 71 - [3: Line2] +RSInterface 71 - [4: Line3] +RSInterface 72 - [6: What would you like to make in the churn?] +RSInterface 73 - [10: What would you like to make in the churn?] +RSInterface 73 - [11: Churn Butter] +RSInterface 74 - [14: What would you like to make?] +RSInterface 74 - [15: Churn Cream] +RSInterface 74 - [16: Churn Butter] +RSInterface 75 - [0: %1] +RSInterface 75 - [24: S P E C I A L A T T A C K] +RSInterface 75 - [25: Combat Lvl: %1] +RSInterface 75 - [27: Chop] +RSInterface 75 - [28: Hack] +RSInterface 75 - [29: Smash] +RSInterface 75 - [30: Auto Retaliate
(Off)] +RSInterface 75 - [31: Block] +RSInterface 75 - [32: (Aggressive)
(Slash)
(Strength XP)] +RSInterface 75 - [33: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 75 - [34: (Defensive)
(Slash)
(Defence XP)] +RSInterface 75 - [35: (Accurate)
(Slash)
(Attack XP)] +RSInterface 75 - [36: When active your player
will automatically fight
back if attacked] +RSInterface 76 - [0: %1] +RSInterface 76 - [22: S P E C I A L A T T A C K] +RSInterface 76 - [23: Combat Lvl: %1] +RSInterface 76 - [25: Block] +RSInterface 76 - [26: Pound] +RSInterface 76 - [27: Pummel] +RSInterface 76 - [28: Auto Retaliate
(Off)] +RSInterface 76 - [29: (Accurate)
(Crush)
(Attack XP)] +RSInterface 76 - [30: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 76 - [31: (Defensive)
(Crush)
(Defence XP)] +RSInterface 76 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 77 - [0: %1] +RSInterface 77 - [22: S P E C I A L A T T A C K] +RSInterface 77 - [23: Combat Lvl: %1] +RSInterface 77 - [25: Longrange] +RSInterface 77 - [26: Accurate] +RSInterface 77 - [27: Rapid] +RSInterface 77 - [28: Auto Retaliate
(Off)] +RSInterface 77 - [29: (Accurate)
(Ranged XP)] +RSInterface 77 - [30: (Rapid)
(Ranged XP)] +RSInterface 77 - [31: (Longrange)
(Ranged XP)
(Defence XP)] +RSInterface 77 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 78 - [0: %1] +RSInterface 78 - [24: S P E C I A L A T T A C K] +RSInterface 78 - [25: Combat Lvl: %1] +RSInterface 78 - [27: Chop] +RSInterface 78 - [28: Slash] +RSInterface 78 - [29: Lunge] +RSInterface 78 - [30: Block] +RSInterface 78 - [31: Auto Retaliate
(Off)] +RSInterface 78 - [32: (Accurate)
(Slash)
(Attack XP)] +RSInterface 78 - [33: (Aggressive)
(Slash)
(Strength XP)] +RSInterface 78 - [34: (Controlled)
(Stab)
(Shared XP)] +RSInterface 78 - [35: (Defensive)
(Slash)
(Defence XP)] +RSInterface 78 - [36: When active your player
will automatically fight
back if attacked] +RSInterface 79 - [0: %1] +RSInterface 79 - [22: S P E C I A L A T T A C K] +RSInterface 79 - [23: Combat Lvl: %1] +RSInterface 79 - [25: Accurate] +RSInterface 79 - [26: Rapid] +RSInterface 79 - [27: Longrange] +RSInterface 79 - [28: Auto Retaliate
(Off)] +RSInterface 79 - [29: (Accurate)
(Ranged XP)] +RSInterface 79 - [30: (Rapid)
(Ranged XP)] +RSInterface 79 - [31: (Longrange)
(Ranged XP)
(Defence XP)] +RSInterface 79 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 80 - [0: %1] +RSInterface 80 - [6: Combat Lvl: %1] +RSInterface 80 - [8: Aim and Fire] +RSInterface 80 - [9: Kick] +RSInterface 80 - [10: Auto Retaliate
(Off)] +RSInterface 80 - [11: Aim and Fire] +RSInterface 80 - [12: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 81 - [0: %1] +RSInterface 81 - [24: S P E C I A L A T T A C K] +RSInterface 81 - [25: Combat Lvl: %1] +RSInterface 81 - [27: Chop] +RSInterface 81 - [28: Slash] +RSInterface 81 - [29: Lunge] +RSInterface 81 - [30: Block] +RSInterface 81 - [31: Auto Retaliate
(Off)] +RSInterface 81 - [32: (Accurate)
(Slash)
(Attack XP)] +RSInterface 81 - [33: (Aggressive)
(Slash)
(Strength XP)] +RSInterface 81 - [34: (Controlled)
(Stab)
(Shared XP)] +RSInterface 81 - [35: (Defensive)
(Slash)
(Defence XP)] +RSInterface 81 - [36: When active your player
will automatically fight
back if attacked] +RSInterface 82 - [0: %1] +RSInterface 82 - [24: S P E C I A L A T T A C K] +RSInterface 82 - [25: Combat Lvl: %1] +RSInterface 82 - [27: Chop] +RSInterface 82 - [28: Slash] +RSInterface 82 - [29: Smash] +RSInterface 82 - [30: Block] +RSInterface 82 - [31: Auto Retaliate
(Off)] +RSInterface 82 - [32: (Accurate)
(Slash)
(Attack XP)] +RSInterface 82 - [33: (Aggressive)
(Slash)
(Strength XP)] +RSInterface 82 - [34: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 82 - [35: (Defensive)
(Slash)
(Defence XP)] +RSInterface 82 - [36: When active your player
will automatically fight
back if attacked] +RSInterface 83 - [0: %1] +RSInterface 83 - [24: S P E C I A L A T T A C K] +RSInterface 83 - [25: Combat Lvl: %1] +RSInterface 83 - [27: Spike] +RSInterface 83 - [28: Impale] +RSInterface 83 - [29: Smash] +RSInterface 83 - [30: Block] +RSInterface 83 - [31: Auto Retaliate
(Off)] +RSInterface 83 - [32: (Accurate)
(Stab)
(Attack XP)] +RSInterface 83 - [33: (Aggressive)
(Stab)
(Strength XP)] +RSInterface 83 - [34: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 83 - [35: (Defensive)
(Stab)
(Defence XP)] +RSInterface 83 - [36: When active your player
will automatically fight
back if attacked] +RSInterface 84 - [0: %1] +RSInterface 84 - [22: S P E C I A L A T T A C K] +RSInterface 84 - [23: Combat Lvl: %1] +RSInterface 84 - [25: Jab] +RSInterface 84 - [26: Swipe] +RSInterface 84 - [27: Fend] +RSInterface 84 - [28: Auto Retaliate
(Off)] +RSInterface 84 - [29: (Controlled)
(Stab)
(Shared XP)] +RSInterface 84 - [30: (Aggressive)
(Slash)
(Strength XP)] +RSInterface 84 - [31: (Defensive)
(Stab)
(Defence XP)] +RSInterface 84 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 85 - [0: %1] +RSInterface 85 - [22: S P E C I A L A T T A C K] +RSInterface 85 - [23: Combat Lvl: %1] +RSInterface 85 - [25: Bash] +RSInterface 85 - [26: Pound] +RSInterface 85 - [27: Block] +RSInterface 85 - [28: Auto Retaliate
(Off)] +RSInterface 85 - [29: (Accurate)
(Crush)
(Attack XP)] +RSInterface 85 - [30: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 85 - [31: (Defensive)
(Crush)
(Defence XP)] +RSInterface 85 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 86 - [0: %1] +RSInterface 86 - [10: Combat Lvl: %1] +RSInterface 86 - [12: Reap] +RSInterface 86 - [13: Chop] +RSInterface 86 - [14: Jab] +RSInterface 86 - [15: Block] +RSInterface 86 - [16: Auto Retaliate
(Off)] +RSInterface 86 - [17: (Accurate)
(Slash)
(Attack XP)] +RSInterface 86 - [18: (Aggressive)
(Stab)
(Strength XP)] +RSInterface 86 - [19: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 86 - [20: (Defensive)
(Slash)
(Defence XP)] +RSInterface 87 - [0: %1] +RSInterface 87 - [24: S P E C I A L A T T A C K] +RSInterface 87 - [25: Combat Lvl: %1] +RSInterface 87 - [27: Lunge] +RSInterface 87 - [28: Swipe] +RSInterface 87 - [29: Pound] +RSInterface 87 - [30: Block] +RSInterface 87 - [31: Auto Retaliate
(Off)] +RSInterface 87 - [32: (Controlled)
(Stab)
(Shared XP)] +RSInterface 87 - [33: (Controlled)
(Slash)
(Shared XP)] +RSInterface 87 - [34: (Controlled)
(Crush)
(Shared XP)] +RSInterface 87 - [35: (Defensive)
(Stab)
(Defence XP)] +RSInterface 87 - [36: When active your player
will automatically fight
back if attacked] +RSInterface 88 - [0: %1] +RSInterface 88 - [24: S P E C I A L A T T A C K] +RSInterface 88 - [25: Combat Lvl: %1] +RSInterface 88 - [27: Pound] +RSInterface 88 - [28: Pummel] +RSInterface 88 - [29: Spike] +RSInterface 88 - [30: Block] +RSInterface 88 - [31: Auto Retaliate
(Off)] +RSInterface 88 - [32: (Accurate)
(Crush)
(Attack XP)] +RSInterface 88 - [33: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 88 - [34: (Controlled)
(Stab)
(Shared XP)] +RSInterface 88 - [35: (Defensive)
(Crush)
(Defence XP)] +RSInterface 88 - [36: When active your player
will automatically fight
back if attacked] +RSInterface 89 - [0: %1] +RSInterface 89 - [24: S P E C I A L A T T A C K] +RSInterface 89 - [25: Combat Lvl: %1] +RSInterface 89 - [27: Stab] +RSInterface 89 - [28: Lunge] +RSInterface 89 - [29: Slash] +RSInterface 89 - [30: Block] +RSInterface 89 - [31: Auto Retaliate
(Off)] +RSInterface 89 - [32: (Accurate)
(Stab)
(Attack XP)] +RSInterface 89 - [33: (Aggressive)
(Stab)
(Strength XP)] +RSInterface 89 - [34: (Aggressive)
(Slash)
(Strength XP)] +RSInterface 89 - [35: (Defensive)
(Stab)
(Defence XP)] +RSInterface 89 - [36: When active your player
will automatically fight
back if attacked] +RSInterface 90 - [0: %1] +RSInterface 90 - [10: Auto Retaliate
(Off)] +RSInterface 90 - [11: Spell] +RSInterface 90 - [99: S P E C I A L A T T A C K] +RSInterface 90 - [100: Combat Lvl: %1] +RSInterface 90 - [101: Bash] +RSInterface 90 - [102: Pound] +RSInterface 90 - [103: Focus] +RSInterface 90 - [105: (Accurate)
(Crush)
(Attack XP)] +RSInterface 90 - [106: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 90 - [107: (Defensive)
(Crush)
(Defence XP)] +RSInterface 90 - [108: (Attack with
a spell)
(Magic XP)
(Defence XP)] +RSInterface 90 - [109: (Attack with
a spell)
(Magic XP)] +RSInterface 90 - [110: Select to perform
a special attack] +RSInterface 90 - [111: When active your player
will automatically fight
back if attacked] +RSInterface 90 - [112: Spell] +RSInterface 90 - [185: Smoke rush
(Magic XP)] +RSInterface 90 - [186: Shadow rush
(Magic XP)] +RSInterface 90 - [187: Blood rush
(Magic XP)] +RSInterface 90 - [188: Ice rush
(Magic XP)] +RSInterface 90 - [189: Smoke burst
(Magic XP)] +RSInterface 90 - [190: Shadow burst
(Magic XP)] +RSInterface 90 - [191: Blood Burst
(Magic XP)] +RSInterface 90 - [192: Ice burst
(Magic XP)] +RSInterface 90 - [193: Smoke blitz
(Magic XP)] +RSInterface 90 - [194: Blood blitz
(Magic XP)] +RSInterface 90 - [195: Ice blitz
(Magic XP)] +RSInterface 90 - [196: Smoke barrage
(Magic XP)] +RSInterface 90 - [197: Shadow
barrage
(Magic XP)] +RSInterface 90 - [198: Blood barrage
(Magic XP)] +RSInterface 90 - [199: Ice barrage
(Magic XP)] +RSInterface 90 - [200: Wind strike
(Magic XP)] +RSInterface 90 - [201: Water strike
(Magic XP)] +RSInterface 90 - [202: Earth strike
(Magic XP)] +RSInterface 90 - [203: Fire strike
(Magic XP)] +RSInterface 90 - [204: Wind bolt
(Magic XP)] +RSInterface 90 - [205: Water bolt
(Magic XP)] +RSInterface 90 - [206: Earth bolt
(Magic XP)] +RSInterface 90 - [207: Fire bolt
(Magic XP)] +RSInterface 90 - [208: Wind blast
(Magic XP)] +RSInterface 90 - [209: Water blast
(Magic XP)] +RSInterface 90 - [210: Earth blast
(Magic XP)] +RSInterface 90 - [211: Fire blast
(Magic XP)] +RSInterface 90 - [212: Wind wave
(Magic XP)] +RSInterface 90 - [213: Water wave
(Magic XP)] +RSInterface 90 - [214: Earth wave
(Magic XP)] +RSInterface 90 - [215: Fire wave
(Magic XP)] +RSInterface 90 - [216: Crumble undead
(Magic XP)] +RSInterface 90 - [217: Magic dart
(Magic XP)] +RSInterface 90 - [218: Claws of Guthix
(Magic XP)] +RSInterface 90 - [219: Earth wave
(Magic XP)
(Defence XP)] +RSInterface 90 - [220: Smoke barrage
(Magic XP)
(Defence XP)] +RSInterface 90 - [221: Shadow rush
(Magic XP)
(Defence XP)] +RSInterface 90 - [222: Wind wave
(Magic XP)
(Defence XP)] +RSInterface 90 - [223: Wind bolt
(Magic XP)
(Defence XP)] +RSInterface 90 - [224: Blood rush
(Magic XP)
(Defence XP)] +RSInterface 90 - [225: Shadow
barrage
(Magic XP)
(Defence XP)] +RSInterface 90 - [226: Water blast
(Magic XP)
(Defence XP)] +RSInterface 90 - [227: Ice rush
(Magic XP)
(Defence XP)] +RSInterface 90 - [228: Claws of Guthix
(Magic XP)
(Defence XP)] +RSInterface 90 - [229: Blood barrage
(Magic XP)
(Defence XP)] +RSInterface 90 - [230: Smoke burst
(Magic XP)
(Defence XP)] +RSInterface 90 - [231: Water bolt
(Magic XP)
(Defence XP)] +RSInterface 90 - [232: Crumble undead
(Magic XP)
(Defence XP)] +RSInterface 90 - [233: Shadow burst
(Magic XP)
(Defence XP)] +RSInterface 90 - [234: Ice barrage
(Magic XP)
(Defence XP)] +RSInterface 90 - [235: Earth blast
(Magic XP)
(Defence XP)] +RSInterface 90 - [236: Blood Burst
(Magic XP)
(Defence XP)] +RSInterface 90 - [237: Earth bolt
(Magic XP)
(Defence XP)] +RSInterface 90 - [238: Wind strike
(Magic XP)
(Defence XP)] +RSInterface 90 - [239: Ice burst
(Magic XP)
(Defence XP)] +RSInterface 90 - [240: Water wave
(Magic XP)
(Defence XP)] +RSInterface 90 - [241: Fire wave
(Magic XP)
(Defence XP)] +RSInterface 90 - [242: Water strike
(Magic XP)
(Defence XP)] +RSInterface 90 - [243: Fire bolt
(Magic XP)
(Defence XP)] +RSInterface 90 - [244: Smoke blitz
(Magic XP)
(Defence XP)] +RSInterface 90 - [245: Fire blast
(Magic XP)
(Defence XP)] +RSInterface 90 - [246: Earth strike
(Magic XP)
(Defence XP)] +RSInterface 90 - [247: Blood blitz
(Magic XP)
(Defence XP)] +RSInterface 90 - [248: Magic dart
(Magic XP)
(Defence XP)] +RSInterface 90 - [249: Wind blast
(Magic XP)
(Defence XP)] +RSInterface 90 - [250: Ice blitz
(Magic XP)
(Defence XP)] +RSInterface 90 - [251: Fire strike
(Magic XP)
(Defence XP)] +RSInterface 91 - [0: %1] +RSInterface 91 - [22: S P E C I A L A T T A C K] +RSInterface 91 - [23: Combat Lvl: %1] +RSInterface 91 - [25: Accurate] +RSInterface 91 - [26: Rapid] +RSInterface 91 - [27: Longrange] +RSInterface 91 - [28: Auto Retaliate
(Off)] +RSInterface 91 - [29: (Accurate)
(Ranged XP)] +RSInterface 91 - [30: (Rapid)
(Ranged XP)] +RSInterface 91 - [31: (Longrange)
(Ranged XP)
(Defence XP)] +RSInterface 91 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 92 - [0: %1] +RSInterface 92 - [22: S P E C I A L A T T A C K] +RSInterface 92 - [23: Combat Lvl: %1] +RSInterface 92 - [25: Punch] +RSInterface 92 - [26: Kick] +RSInterface 92 - [27: Block] +RSInterface 92 - [28: Auto Retaliate
(Off)] +RSInterface 92 - [29: (Accurate)
(Crush)
(Attack XP)] +RSInterface 92 - [30: (Aggressive)
(Crush)
(Strength XP)] +RSInterface 92 - [31: (Defensive)
(Crush)
(Defence XP)] +RSInterface 92 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 93 - [0: %1] +RSInterface 93 - [22: S P E C I A L A T T A C K] +RSInterface 93 - [23: Combat Lvl: %1] +RSInterface 93 - [25: Flick] +RSInterface 93 - [26: Lash] +RSInterface 93 - [27: Deflect] +RSInterface 93 - [28: Auto Retaliate
(Off)] +RSInterface 93 - [29: (Accurate)
(Slash)
(Attack XP)] +RSInterface 93 - [30: (Controlled)
(Slash)
(Shared XP)] +RSInterface 93 - [31: (Defensive)
(Slash)
(Defence XP)] +RSInterface 93 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 94 - [3: Are you sure you want to destroy this object?] +RSInterface 94 - [4: Yes.] +RSInterface 94 - [5: No.] +RSInterface 94 - [10: Single_Line_Text] +RSInterface 94 - [11: Multi_line_text_1] +RSInterface 94 - [12: Multi_line_text_2] +RSInterface 95 - [12: Port Tyras] +RSInterface 95 - [13: Port Phasmatys] +RSInterface 95 - [14: Catherby] +RSInterface 95 - [15: Shipyard] +RSInterface 95 - [16: Karamja] +RSInterface 95 - [17: Brimhaven] +RSInterface 95 - [18: Port Khazard] +RSInterface 95 - [19: Port Sarim] +RSInterface 95 - [20: Mos Le'Harmless] +RSInterface 95 - [21: Crandor] +RSInterface 95 - [22: Oo'glog] +RSInterface 99 - [5: Harold] +RSInterface 99 - [6: Player] +RSInterface 99 - [28: Roll Dice!] +RSInterface 99 - [30: Continue...] +RSInterface 99 - [31: 0] +RSInterface 99 - [32: 0] +RSInterface 99 - [33: You win!] +RSInterface 102 - [15: Items Kept on Death] +RSInterface 102 - [17: Items you will keep on death if not skulled:] +RSInterface 102 - [20: Items you will lose on death if not skulled:] +RSInterface 102 - [25: Information:] +RSInterface 102 - [27: This is where the information goes, This is where the information goes, This is where the information goes, This is where the information goes, This is where the information goes, This is where the information goes] +RSInterface 102 - [28: put information in here,put information in here,put information in] +RSInterface 103 - [11: What comes next?] +RSInterface 104 - [19: Aquarius] +RSInterface 104 - [20: Aries] +RSInterface 104 - [21: Cancer] +RSInterface 104 - [22: Capricorn] +RSInterface 104 - [23: Gemini] +RSInterface 104 - [24: Leo] +RSInterface 104 - [25: Libra] +RSInterface 104 - [26: Pisces] +RSInterface 104 - [27: Sagittarius] +RSInterface 104 - [28: Scorpio] +RSInterface 104 - [29: Taurus] +RSInterface 104 - [30: Virgo] +RSInterface 104 - [31: Star Chart Viewer] +RSInterface 105 - [14: Grand Exchange] +RSInterface 105 - [17: Shown below is a summary of all your current offers.] +RSInterface 105 - [133: Buy Offer] +RSInterface 105 - [141: Choose an item to exchange] +RSInterface 105 - [146: Quantity:] +RSInterface 105 - [150: 1] +RSInterface 105 - [151: Price per item:] +RSInterface 105 - [155: 1 gp] +RSInterface 105 - [162: 1] +RSInterface 105 - [164: 10] +RSInterface 105 - [166: 100] +RSInterface 105 - [168: 1000] +RSInterface 105 - [170: ...] +RSInterface 105 - [185: ...] +RSInterface 105 - [191: Confirm Offer] +RSInterface 105 - [196: Click the icon to the left to search for items.] +RSInterface 105 - [199: Select an item in your inventory to sell.] +RSInterface 106 - [14: Grand Exchange] +RSInterface 106 - [17: Shown below is a summary of all your current offers.] +RSInterface 106 - [124: Jetzt ist Ihr Angebot eingegangen! Sie k?nnen jederzeit darauf klicken, um sich die Einzelheiten anzuschauen. Unten wird der Fortschritt mit einem Balken angezeigt. ] +RSInterface 108 - [14: Grand Exchange] +RSInterface 108 - [22: Buy Offer] +RSInterface 108 - [28: 1,281 gp] +RSInterface 108 - [29: Choose an item to exchange] +RSInterface 108 - [30: Quantity:] +RSInterface 108 - [34: 2] +RSInterface 108 - [35: Price per item:] +RSInterface 108 - [39: 1,281 gp] +RSInterface 108 - [43: 1] +RSInterface 108 - [45: 10] +RSInterface 108 - [47: 100] +RSInterface 108 - [49: 500] +RSInterface 108 - [51: ...] +RSInterface 108 - [64: ...] +RSInterface 108 - [68: 2,562 gp] +RSInterface 108 - [71: Confirm Offer] +RSInterface 108 - [94: Jetzt ist Ihr Angebot eingegangen! Sie k?nnen jederzeit darauf klicken, um sich die Einzelheiten anzuschauen. Unten wird der Fortschritt mit einem Balken angezeigt. ] +RSInterface 109 - [15: Grand Exchange - Collection Box] +RSInterface 110 - [14: Grand Exchange] +RSInterface 110 - [22: Buy Offer] +RSInterface 110 - [27: N/A] +RSInterface 110 - [28: Choose an item to exchange] +RSInterface 110 - [29: Quantity:] +RSInterface 110 - [33: 1] +RSInterface 110 - [34: Price per item:] +RSInterface 110 - [38: 1 gp] +RSInterface 110 - [42: 1] +RSInterface 110 - [44: 10] +RSInterface 110 - [46: 100] +RSInterface 110 - [48: 500] +RSInterface 110 - [50: ...] +RSInterface 110 - [63: ...] +RSInterface 110 - [69: Confirm Offer] +RSInterface 110 - [70: 1 gp] +RSInterface 110 - [89: Jetzt ist Ihr Angebot eingegangen! Sie k?nnen jederzeit darauf klicken, um sich die Einzelheiten anzuschauen. Unten wird der Fortschritt mit einem Balken angezeigt. ] +RSInterface 111 - [40: %1] +RSInterface 111 - [89: line1] +RSInterface 111 - [90: line2] +RSInterface 111 - [91: line3] +RSInterface 111 - [92: line4] +RSInterface 111 - [93: line5] +RSInterface 111 - [94: line6] +RSInterface 111 - [95: line7] +RSInterface 111 - [96: line8] +RSInterface 111 - [97: line9] +RSInterface 111 - [98: line10] +RSInterface 111 - [99: line11] +RSInterface 111 - [100: line12] +RSInterface 111 - [101: line13] +RSInterface 111 - [102: line14] +RSInterface 111 - [103: line15] +RSInterface 111 - [104: line16] +RSInterface 111 - [105: line17] +RSInterface 111 - [106: line18] +RSInterface 111 - [107: line19] +RSInterface 111 - [108: line20] +RSInterface 111 - [109: line21] +RSInterface 111 - [110: line22] +RSInterface 112 - [4: Name] +RSInterface 112 - [5: Line1] +RSInterface 112 - [7: Line1] +RSInterface 113 - [17: That's it, it all makes sense now! If you were a dwarf, that is...] +RSInterface 114 - [20: Schematic 1] +RSInterface 114 - [21: Schematic 2] +RSInterface 114 - [22: Schematic 3] +RSInterface 114 - [23: Show/Select] +RSInterface 116 - [4: Title] +RSInterface 123 - [2: Certificate of Advanced Healing] +RSInterface 123 - [3: From PoxStead College.] +RSInterface 123 - [4: Signed Dr Foster-MMD, PRD
Head Of
Magical Healing.] +RSInterface 124 - [1: List of Fairy Queen's Symptoms.] +RSInterface 124 - [3: Extremely weak
Slow discorporation of ethereal body
Drifting in and out of coma
Shallow breath
Fading magical energy
High fever] +RSInterface 125 - [67: Amazing Farming Equipment Store] +RSInterface 125 - [70: Farming rake] +RSInterface 125 - [71: %1/1] +RSInterface 125 - [72: Seed dibber] +RSInterface 125 - [73: %1/1] +RSInterface 125 - [74: All-purpose spade] +RSInterface 125 - [75: %1/1] +RSInterface 125 - [76: Secateurs] +RSInterface 125 - [77: %1/1] +RSInterface 125 - [78: Watering Can] +RSInterface 125 - [79: 0/1] +RSInterface 125 - [80: Gardening trowel] +RSInterface 125 - [81: %1/1] +RSInterface 125 - [82: Empty buckets] +RSInterface 125 - [83: %1/31] +RSInterface 125 - [84: Normal Compost] +RSInterface 125 - [85: %1/255] +RSInterface 125 - [86: Super Compost] +RSInterface 125 - [87: %1/255] +RSInterface 126 - [2: Rake] +RSInterface 126 - [3: %1] +RSInterface 126 - [4: Dibber] +RSInterface 126 - [5: %1] +RSInterface 126 - [6: Spade] +RSInterface 126 - [7: %1] +RSInterface 126 - [8: Secateurs] +RSInterface 126 - [9: %1] +RSInterface 126 - [10: Watering Can] +RSInterface 126 - [11: %1] +RSInterface 126 - [12: Trowel] +RSInterface 126 - [13: %1] +RSInterface 126 - [14: Buckets] +RSInterface 126 - [15: %1] +RSInterface 126 - [16: Compost] +RSInterface 126 - [17: %1] +RSInterface 126 - [18: Super Compost] +RSInterface 127 - [11: **********] +RSInterface 127 - [12: ************************] +RSInterface 127 - [17: Remove this key] +RSInterface 127 - [18: ***************] +RSInterface 127 - [20: Remove this key] +RSInterface 128 - [44: x%1] +RSInterface 128 - [45: x%1] +RSInterface 129 - [64: x%1] +RSInterface 129 - [65: x%1] +RSInterface 130 - [99: x%1] +RSInterface 130 - [100: x%1] +RSInterface 131 - [1: Line1] +RSInterface 132 - [1: lj1] +RSInterface 132 - [2: lj2] +RSInterface 132 - [3: lj3] +RSInterface 132 - [4: lj4] +RSInterface 132 - [5: lj5] +RSInterface 132 - [6: lj6] +RSInterface 132 - [7: lj7] +RSInterface 132 - [8: lj8] +RSInterface 132 - [9: lj9] +RSInterface 132 - [10: lj10] +RSInterface 132 - [11: lj11] +RSInterface 132 - [13: >>>] +RSInterface 132 - [14: <<<] +RSInterface 132 - [16: >>>] +RSInterface 132 - [17: <<<] +RSInterface 132 - [19: >>>] +RSInterface 132 - [20: <<<] +RSInterface 132 - [22: >>>] +RSInterface 132 - [23: <<<] +RSInterface 132 - [25: >>>] +RSInterface 132 - [26: <<<] +RSInterface 132 - [28: >>>] +RSInterface 132 - [29: <<<] +RSInterface 132 - [31: >>>] +RSInterface 132 - [32: <<<] +RSInterface 132 - [34: >>>] +RSInterface 132 - [35: <<<] +RSInterface 132 - [37: >>>] +RSInterface 132 - [38: <<<] +RSInterface 132 - [40: >>>] +RSInterface 132 - [41: <<<] +RSInterface 132 - [43: >>>] +RSInterface 132 - [44: <<<] +RSInterface 132 - [45: Items I need to get for King Roald's garden:] +RSInterface 133 - [0: option1] +RSInterface 133 - [1: option1] +RSInterface 133 - [2: option3] +RSInterface 133 - [3: [A]] +RSInterface 133 - [4: [B]] +RSInterface 133 - [5: [C]] +RSInterface 134 - [2: Choose the stat you wish to be advanced!] +RSInterface 134 - [27: Confirm] +RSInterface 135 - [2: To the NORTH] +RSInterface 135 - [3: To the NORTH] +RSInterface 135 - [6: To the EAST] +RSInterface 135 - [7: To the SOUTH] +RSInterface 135 - [8: To the EAST] +RSInterface 135 - [9: To the SOUTH] +RSInterface 135 - [11: To the WEST] +RSInterface 135 - [12: To the WEST] +RSInterface 136 - [1: Both] +RSInterface 136 - [2: Argh!] +RSInterface 138 - [7: Ta Quir Priw] +RSInterface 138 - [8: Lemanto Andra] +RSInterface 138 - [9: Sindarpos] +RSInterface 138 - [10: Gandius] +RSInterface 138 - [11: Kar-Hewo] +RSInterface 138 - [12: Lemantolly] +RSInterface 138 - [13: Undri] +RSInterface 139 - [1: Gnomeball] +RSInterface 139 - [2: Score] +RSInterface 140 - [4: Select an Option] +RSInterface 144 - [88: Points Settings] +RSInterface 144 - [205: < To Lift] +RSInterface 144 - [207: Controls] +RSInterface 144 - [221: START] +RSInterface 144 - [223: Controls] +RSInterface 144 - [224: You are
here] +RSInterface 144 - [233: A] +RSInterface 144 - [234: B] +RSInterface 144 - [235: C] +RSInterface 144 - [236: D] +RSInterface 144 - [237: E] +RSInterface 144 - [238: F] +RSInterface 144 - [239: G] +RSInterface 144 - [240: H] +RSInterface 144 - [241: I] +RSInterface 144 - [242: J] +RSInterface 144 - [243: K] +RSInterface 145 - [2: Dwarf] +RSInterface 145 - [3: Wartface & Bentnoze] +RSInterface 145 - [4: Pirate Pete] +RSInterface 145 - [5: Lumbridge Guide] +RSInterface 145 - [6: Evil Dave] +RSInterface 145 - [7: Sir Amik Varze] +RSInterface 145 - [8: Skrach 'Bone Cruncher' Uglogwee] +RSInterface 145 - [9: Monkey Ambassador] +RSInterface 145 - [12: Recipe for Disaster] +RSInterface 145 - [13: This quest is comprised of the 8 mini quests highlighted below] +RSInterface 148 - [7: Select an Option] +RSInterface 151 - [9: Five hundred years have passed since the rule of King Alvis,] +RSInterface 151 - [10: saviour of Keldagrim, victim of his own inventions.] +RSInterface 151 - [11: Founder of the Consortium, the gathering of mining companies] +RSInterface 151 - [12: that were to serve the monarchy, eventually the monarchy came] +RSInterface 151 - [13: to serve the Consortium.] +RSInterface 151 - [14: By the time of his death, the monarchy was all but abolished.] +RSInterface 151 - [15: By now, the Kings of Keldagrim are but a distant memory...] +RSInterface 151 - [16: with only the statue of King Alvis to remind the people of the] +RSInterface 152 - [7: The Giant
Dwarf] +RSInterface 152 - [8: Keldagrim] +RSInterface 152 - [9: Grand Capital
of the Dwarven realm] +RSInterface 152 - [10: Rise of the
Red Axe] +RSInterface 152 - [11: Part 1] +RSInterface 152 - [12: Keldagrim
Palace] +RSInterface 152 - [13: Consortium
Meeting] +RSInterface 152 - [14: A little while later] +RSInterface 152 - [15: Rise of the
Red Axe] +RSInterface 152 - [16: Part II] +RSInterface 153 - [88: Oh dear, you're dead, but don't despair!] +RSInterface 153 - [89: Never show me this again] +RSInterface 153 - [98: You can buy a new tinderbox from the general store.] +RSInterface 153 - [99: You can buy a new axe from Bob's Axe shop in south Lumbridge.] +RSInterface 153 - [100: You can pick up a pickaxe above the gates of Lumbridge Castle or buy one from Bob's Axe shop in south Lumbridge.] +RSInterface 153 - [101: You can get a new net from the Fishing Tutor in Lumbridge Swamps.] +RSInterface 153 - [102: You can get new combat equipment from the combat tutors north of Lumbridge Castle.] +RSInterface 153 - [103: You can buy a new hammer from the general store.] +RSInterface 153 - [104: If you need more gold, kill goblins for a short while or try a quest.] +RSInterface 153 - [105: Tutors can help you with skills and give you basic equipment. Look for this icon on your mini map.] +RSInterface 153 - [106: More information is available in the manual on our website.] +RSInterface 154 - [13: What would you like to make?] +RSInterface 154 - [15: Armour] +RSInterface 154 - [17: Gloves] +RSInterface 154 - [19: Boots] +RSInterface 154 - [21: Vambraces] +RSInterface 154 - [23: Chaps] +RSInterface 154 - [25: Coif] +RSInterface 154 - [27: Cowl] +RSInterface 156 - [2: lj_title] +RSInterface 156 - [4: lj1] +RSInterface 156 - [5: lj2] +RSInterface 156 - [6: lj3] +RSInterface 156 - [7: lj4] +RSInterface 156 - [8: lj5] +RSInterface 156 - [9: lj6] +RSInterface 156 - [10: lj7] +RSInterface 156 - [11: lj8] +RSInterface 156 - [12: lj9] +RSInterface 156 - [13: lj10] +RSInterface 156 - [14: lj11] +RSInterface 156 - [15: lj12] +RSInterface 156 - [16: lj13] +RSInterface 156 - [17: lj14] +RSInterface 156 - [18: lj15] +RSInterface 156 - [19: lj16] +RSInterface 156 - [20: lj17] +RSInterface 156 - [21: lj18] +RSInterface 156 - [22: lj19] +RSInterface 156 - [23: lj20] +RSInterface 156 - [24: lj21] +RSInterface 156 - [25: lj22] +RSInterface 156 - [26: lj23] +RSInterface 156 - [27: lj24] +RSInterface 156 - [28: lj25] +RSInterface 156 - [29: lj26] +RSInterface 156 - [30: lj27] +RSInterface 156 - [31: lj28] +RSInterface 156 - [32: lj29] +RSInterface 156 - [33: lj30] +RSInterface 156 - [34: lj31] +RSInterface 156 - [35: lj32] +RSInterface 156 - [36: lj33] +RSInterface 156 - [37: lj34] +RSInterface 156 - [38: lj35] +RSInterface 156 - [39: lj36] +RSInterface 156 - [40: lj37] +RSInterface 156 - [41: lj38] +RSInterface 156 - [42: lj39] +RSInterface 156 - [43: lj40] +RSInterface 156 - [44: lj41] +RSInterface 156 - [45: lj42] +RSInterface 156 - [46: lj43] +RSInterface 156 - [47: lj44] +RSInterface 156 - [48: lj45] +RSInterface 156 - [49: lj46] +RSInterface 156 - [50: lj47] +RSInterface 156 - [51: lj48] +RSInterface 156 - [52: lj49] +RSInterface 156 - [53: lj50] +RSInterface 156 - [54: lj51] +RSInterface 156 - [55: lj52] +RSInterface 156 - [56: lj53] +RSInterface 156 - [57: lj54] +RSInterface 156 - [58: lj55] +RSInterface 156 - [59: lj56] +RSInterface 156 - [60: lj57] +RSInterface 156 - [61: lj58] +RSInterface 156 - [62: lj59] +RSInterface 156 - [63: lj60] +RSInterface 156 - [64: lj61] +RSInterface 156 - [65: lj62] +RSInterface 156 - [66: lj63] +RSInterface 156 - [67: lj64] +RSInterface 156 - [68: lj65] +RSInterface 156 - [69: lj66] +RSInterface 156 - [70: lj67] +RSInterface 156 - [71: lj68] +RSInterface 156 - [72: lj69] +RSInterface 156 - [73: lj70] +RSInterface 156 - [74: lj71] +RSInterface 156 - [75: lj72] +RSInterface 156 - [76: lj73] +RSInterface 156 - [77: lj74] +RSInterface 156 - [78: lj75] +RSInterface 156 - [79: lj76] +RSInterface 156 - [80: lj77] +RSInterface 156 - [81: lj78] +RSInterface 156 - [82: lj79] +RSInterface 156 - [83: lj80] +RSInterface 156 - [84: lj81] +RSInterface 156 - [85: lj82] +RSInterface 156 - [86: lj83] +RSInterface 156 - [87: lj84] +RSInterface 156 - [88: lj85] +RSInterface 156 - [89: lj86] +RSInterface 156 - [90: lj87] +RSInterface 156 - [91: lj88] +RSInterface 156 - [92: lj89] +RSInterface 156 - [93: lj90] +RSInterface 156 - [94: lj91] +RSInterface 156 - [95: lj92] +RSInterface 156 - [96: lj93] +RSInterface 156 - [97: lj94] +RSInterface 156 - [98: lj95] +RSInterface 156 - [99: lj96] +RSInterface 156 - [100: lj97] +RSInterface 156 - [101: lj98] +RSInterface 156 - [102: lj99] +RSInterface 156 - [103: lj100] +RSInterface 157 - [0: Line1] +RSInterface 157 - [1: Line2] +RSInterface 157 - [2: Click here to continue] +RSInterface 158 - [0: Line1] +RSInterface 158 - [1: Line2] +RSInterface 158 - [2: Click here to continue] +RSInterface 159 - [0: Line1] +RSInterface 159 - [1: Line2] +RSInterface 159 - [2: Click here to continue] +RSInterface 160 - [0: Line1] +RSInterface 160 - [1: Line2] +RSInterface 160 - [2: Click here to continue] +RSInterface 161 - [0: Line1] +RSInterface 161 - [1: Line2] +RSInterface 161 - [2: Click here to continue] +RSInterface 162 - [0: Line1] +RSInterface 162 - [1: Line2] +RSInterface 162 - [2: Click here to continue] +RSInterface 163 - [0: Line1] +RSInterface 163 - [1: Line2] +RSInterface 163 - [2: Click here to continue] +RSInterface 164 - [0: Line1] +RSInterface 164 - [1: Line2] +RSInterface 164 - [2: Click here to continue] +RSInterface 165 - [0: Line1] +RSInterface 165 - [1: Line2] +RSInterface 165 - [2: Click here to continue] +RSInterface 166 - [0: Line1] +RSInterface 166 - [1: Line2] +RSInterface 166 - [2: Click here to continue] +RSInterface 167 - [0: Line1] +RSInterface 167 - [1: Line2] +RSInterface 167 - [2: Click here to continue] +RSInterface 168 - [0: Line1] +RSInterface 168 - [1: Line2] +RSInterface 168 - [2: Click here to continue] +RSInterface 169 - [0: Line1] +RSInterface 169 - [1: Line2] +RSInterface 169 - [2: Click here to continue] +RSInterface 170 - [0: Line1] +RSInterface 170 - [1: Line2] +RSInterface 170 - [2: Click here to continue] +RSInterface 171 - [0: Line1] +RSInterface 171 - [1: Line2] +RSInterface 171 - [2: Click here to continue] +RSInterface 172 - [0: Line1] +RSInterface 172 - [1: Line2] +RSInterface 172 - [2: Click here to continue] +RSInterface 173 - [0: Line1] +RSInterface 173 - [1: Line2] +RSInterface 173 - [2: Click here to continue] +RSInterface 174 - [0: Line1] +RSInterface 174 - [1: Line2] +RSInterface 174 - [2: Click here to continue] +RSInterface 175 - [0: Line1] +RSInterface 175 - [1: Line2] +RSInterface 175 - [2: Click here to continue] +RSInterface 176 - [0: Line1] +RSInterface 176 - [1: Line2] +RSInterface 176 - [2: Click here to continue] +RSInterface 177 - [0: Line1] +RSInterface 177 - [1: Line2] +RSInterface 177 - [2: Click here to continue] +RSInterface 178 - [6: Click arrow buttons to move taper.] +RSInterface 178 - [7: Press the Light button to light the candles.] +RSInterface 181 - [16: Rotate mirror.] +RSInterface 182 - [0: When you have finished playing
RuneScape, always use the
button below to logout safely.] +RSInterface 183 - [21: -Drogokishuun-
Goblins of the
Fierce Blades] +RSInterface 183 - [22: -Huzamogaarb-
Live-Flesh Eaters
of the Chaos God] +RSInterface 183 - [23: -Saragorgak-
Footsoldiers of
Holy Wrath] +RSInterface 183 - [24: -Dorgeshuun-
Goblins of the
Strong Spears] +RSInterface 183 - [25: -Horogothgar-
Eaters of
Manflesh] +RSInterface 183 - [26: -Yurkolgokh-
The Flatulent] +RSInterface 183 - [27: -Thorobshuun-
Goblins of the
Hills] +RSInterface 183 - [28: -Garagorshuun-
Goblins of the
Sea] +RSInterface 183 - [29: -Rekeshuun-
Goblins of the
North] +RSInterface 183 - [30: -Ekeleshuun-
Goblins of the
East] +RSInterface 183 - [31: -Idithuun-
Goblins of the
South] +RSInterface 183 - [32: -Narogoshuun-
Goblins of the
West] +RSInterface 183 - [33: A History of the Goblin Race] +RSInterface 183 - [35: Goblin tradition holds that
their race was created by
a war-god in order to
fight a war against other
gods.] +RSInterface 183 - [36: (They never name their
god, so whether it is the
same as any of the gods
worshipped by the other
races is unknown.)] +RSInterface 183 - [37: The legends also speak
of goblins fighting
against goblins during
the wars, so it is likely
that gods other than
their creators used
them as footsoldiers.] +RSInterface 183 - [38: Although goblins are still
warlike, it is probable
that in earlier ages
they were more
organised than they
are now,] +RSInterface 183 - [40: especially if they were
under the direct
command of one or
more gods.] +RSInterface 183 - [41: This is corroborated
by finds unearthed
at various
archaeological sites,
including the large
excavation east of
Varrock.] +RSInterface 183 - [42: Armour and weapons
have been found,
obviously made to fit
goblins but far more
well-made than their
current equipment.] +RSInterface 183 - [44: Almost every piece of
ancient goblin equipment
has one of a number
of symbols on it,
and by correlating these
symbols with the
sketchy records that
survive from the
Third Age it has been
possible to identify
twelve distinct goblin tribes
or regiments.] +RSInterface 183 - [45: The separate identities of
the tribes have long
since dissolved and
no goblins remember the
symbols, although their
generals may still
recognize the ancient
tribal names.] +RSInterface 183 - [46: In the following pages
I present a list of
the tribes and their
symbols.] +RSInterface 184 - [1: A....a lemming] +RSInterface 184 - [2: B....a fryingpan] +RSInterface 184 - [3: C....the disenfrachaised youth of 1940's Columbia] +RSInterface 184 - [4: Is this:] +RSInterface 185 - [15: DIAMOND] +RSInterface 185 - [16: COINS] +RSInterface 185 - [17: RING] +RSInterface 185 - [18: U N L O C K] +RSInterface 186 - [0: Watch the statue! Fish here!] +RSInterface 187 - [14: Playing.............................] +RSInterface 188 - [2: Think] +RSInterface 188 - [3: Cry] +RSInterface 188 - [4: Laugh] +RSInterface 188 - [5: Dance] +RSInterface 188 - [6: Climb Rope] +RSInterface 188 - [7: Lean on air] +RSInterface 188 - [8: Glass Box] +RSInterface 190 - [6: Which shape is blue?] +RSInterface 190 - [10: Shape1] +RSInterface 190 - [11: Shape2] +RSInterface 190 - [12: Shape3] +RSInterface 194 - [1: Alchemy] +RSInterface 194 - [2: Pizazz Points:] +RSInterface 194 - [3: 9999] +RSInterface 194 - [4: Leather Boots:] +RSInterface 194 - [5: Adamant Kiteshield:] +RSInterface 194 - [6: Adamant Helm:] +RSInterface 194 - [7: Emerald:] +RSInterface 194 - [8: Rune Longsword:] +RSInterface 194 - [9: 999] +RSInterface 194 - [10: 999] +RSInterface 194 - [11: 999] +RSInterface 194 - [12: 999] +RSInterface 194 - [13: 999] +RSInterface 195 - [1: Enchantment] +RSInterface 195 - [2: Pizazz Points:] +RSInterface 195 - [3: 9999] +RSInterface 196 - [1: Graveyard] +RSInterface 196 - [2: Pizazz Points:] +RSInterface 196 - [3: 9999] +RSInterface 196 - [8: 4] +RSInterface 196 - [9: 3] +RSInterface 196 - [10: 2] +RSInterface 197 - [3: Magic Training Arena Shop] +RSInterface 197 - [4: Telekinetic Pizazz Points] +RSInterface 197 - [5: Enchantment Pizazz Points] +RSInterface 197 - [6: Graveyard Pizazz Points] +RSInterface 197 - [7: Alchemist Pizazz Points] +RSInterface 197 - [8: 99999] +RSInterface 197 - [9: 99999] +RSInterface 197 - [10: 99999] +RSInterface 197 - [11: 99999] +RSInterface 197 - [12: (Upgrade)] +RSInterface 197 - [13: (Upgrade)] +RSInterface 197 - [14: (Upgrade)] +RSInterface 198 - [1: Telekinetic] +RSInterface 198 - [2: Pizazz Points:] +RSInterface 198 - [3: 999999] +RSInterface 198 - [5: 999] +RSInterface 199 - [75: Hairdresser's Salon] +RSInterface 199 - [104: CONFIRM] +RSInterface 199 - [118: Please select colour] +RSInterface 200 - [88: Yrsa's Shoe Store] +RSInterface 200 - [89: CONFIRM (500 GOLD)] +RSInterface 201 - [88: Thessalia's Makeovers (Legs)] +RSInterface 201 - [106: CONFIRM (500 gold)] +RSInterface 201 - [123: Select colour] +RSInterface 201 - [145: Select leg style] +RSInterface 202 - [88: Thessalia's Makeovers (Torso)] +RSInterface 202 - [106: CONFIRM (500 gold)] +RSInterface 202 - [123: Select body style] +RSInterface 202 - [124: Select arms style] +RSInterface 202 - [125: Select colour] +RSInterface 203 - [76: Hairdresser's Salon] +RSInterface 203 - [99: CONFIRM] +RSInterface 203 - [113: Please select colour] +RSInterface 204 - [75: Hairdresser's Salon] +RSInterface 204 - [98: CONFIRM] +RSInterface 204 - [112: Please select colour] +RSInterface 205 - [88: CONFIRM (3000 Gold)] +RSInterface 205 - [101: MALE] +RSInterface 205 - [102: Select skin colour and gender] +RSInterface 205 - [103: FEMALE] +RSInterface 206 - [88: Thessalia's Makeovers (Legs)] +RSInterface 206 - [106: CONFIRM (500 gold)] +RSInterface 206 - [123: Select colour] +RSInterface 206 - [136: Select leg style] +RSInterface 207 - [88: Thessalia's Makeovers (Torso)] +RSInterface 207 - [106: CONFIRM (500 gold)] +RSInterface 207 - [123: Select body style] +RSInterface 207 - [124: Select arms style] +RSInterface 207 - [125: Select colour] +RSInterface 209 - [0: Complete the Maze as fast as possible!] +RSInterface 209 - [1: There is...] +RSInterface 209 - [2: %1%] +RSInterface 209 - [3: ... of the Reward left!] +RSInterface 210 - [0: Line1] +RSInterface 211 - [0: Line1] +RSInterface 211 - [1: Line2] +RSInterface 212 - [0: Line1] +RSInterface 212 - [1: Line2] +RSInterface 212 - [2: Line3] +RSInterface 213 - [0: Line1] +RSInterface 213 - [1: Line2] +RSInterface 213 - [2: Line3] +RSInterface 213 - [3: Line4] +RSInterface 214 - [0: Line1] +RSInterface 214 - [1: Line2] +RSInterface 214 - [2: Line3] +RSInterface 214 - [3: Line4] +RSInterface 214 - [4: Line5] +RSInterface 216 - [0: Line1] +RSInterface 217 - [0: Line1] +RSInterface 217 - [1: Line2] +RSInterface 218 - [0: Line1] +RSInterface 218 - [1: Line2] +RSInterface 218 - [2: Line3] +RSInterface 219 - [0: Line1] +RSInterface 219 - [1: Line2] +RSInterface 219 - [2: Line3] +RSInterface 219 - [3: Line4] +RSInterface 223 - [9: Shiver] +RSInterface 223 - [10: Spin] +RSInterface 223 - [11: Clap] +RSInterface 223 - [12: Bow] +RSInterface 223 - [13: Cheer] +RSInterface 223 - [14: Wave] +RSInterface 223 - [15: Preen] +RSInterface 224 - [2: Waterbirth Island] +RSInterface 224 - [3: Miscellania] +RSInterface 224 - [4: Etceteria] +RSInterface 224 - [5: Rellekka] +RSInterface 224 - [6: Neitiznot & Jatizso] +RSInterface 227 - [2: List of needed items:] +RSInterface 227 - [3: mourning_deathalter_item1] +RSInterface 227 - [5: mourning_deathalter_item2] +RSInterface 227 - [6: mourning_deathalter_item3] +RSInterface 227 - [7: mourning_deathalter_item4] +RSInterface 227 - [8: mourning_deathalter_item5] +RSInterface 227 - [9: mourning_deathalter_item6] +RSInterface 227 - [10: mourning_deathalter_item7] +RSInterface 227 - [11: mourning_deathalter_item8] +RSInterface 227 - [12: mourning_deathalter_item9] +RSInterface 227 - [13: mourning_deathalter_item10] +RSInterface 227 - [14: mourning_deathalter_item11] +RSInterface 227 - [15: mourning_deathalter_item12] +RSInterface 227 - [16: mourning_deathalter_item13] +RSInterface 227 - [17: mourning_deathalter_item14] +RSInterface 227 - [18: mourning_deathalter_item15] +RSInterface 227 - [19: mourning_deathalter_item16] +RSInterface 227 - [20: mourning_deathalter_item17] +RSInterface 227 - [21: mourning_deathalter_item18] +RSInterface 227 - [22: mourning_deathalter_item19] +RSInterface 227 - [23: mourning_deathalter_item20] +RSInterface 227 - [24: mourning_deathalter_item21] +RSInterface 227 - [25: mourning_deathalter_item22] +RSInterface 227 - [26: mourning_deathalter_item23] +RSInterface 227 - [27: mourning_deathalter_item24] +RSInterface 227 - [28: mourning_deathalter_item25] +RSInterface 227 - [29: mourning_deathalter_item26] +RSInterface 227 - [30: mourning_deathalter_item27] +RSInterface 227 - [31: mourning_deathalter_item28] +RSInterface 227 - [32: mourning_deathalter_item29] +RSInterface 227 - [33: mourning_deathalter_item30] +RSInterface 227 - [34: mourning_deathalter_item31] +RSInterface 227 - [35: mourning_deathalter_item32] +RSInterface 227 - [36: mourning_deathalter_item33] +RSInterface 227 - [37: mourning_deathalter_item34] +RSInterface 227 - [38: mourning_deathalter_item35] +RSInterface 227 - [39: mourning_deathalter_item36] +RSInterface 227 - [40: mourning_deathalter_item37] +RSInterface 227 - [41: mourning_deathalter_item38] +RSInterface 227 - [42: mourning_deathalter_item39] +RSInterface 227 - [43: mourning_deathalter_item40] +RSInterface 227 - [44: mourning_deathalter_item41] +RSInterface 227 - [45: mourning_deathalter_item42] +RSInterface 227 - [46: mourning_deathalter_item43] +RSInterface 227 - [47: mourning_deathalter_item44] +RSInterface 227 - [48: mourning_deathalter_item45] +RSInterface 227 - [49: mourning_deathalter_item46] +RSInterface 227 - [50: mourning_deathalter_item47] +RSInterface 227 - [51: mourning_deathalter_item48] +RSInterface 227 - [52: mourning_deathalter_item49] +RSInterface 227 - [53: mourning_deathalter_item50] +RSInterface 228 - [0: Select an Option] +RSInterface 228 - [1: option1] +RSInterface 228 - [2: option2] +RSInterface 229 - [0: Select an Option] +RSInterface 229 - [1: option1] +RSInterface 229 - [2: option2] +RSInterface 230 - [0: Select an Option] +RSInterface 230 - [1: option1] +RSInterface 230 - [2: option2] +RSInterface 230 - [3: option3] +RSInterface 231 - [0: Select an Option] +RSInterface 231 - [1: option1] +RSInterface 231 - [2: option2] +RSInterface 231 - [3: option3] +RSInterface 232 - [0: Select an Option] +RSInterface 232 - [1: option1] +RSInterface 232 - [2: option2] +RSInterface 232 - [3: option3] +RSInterface 232 - [4: option4] +RSInterface 233 - [0: Select an Option] +RSInterface 233 - [1: option1] +RSInterface 233 - [2: option2] +RSInterface 233 - [3: option3] +RSInterface 233 - [4: option4] +RSInterface 234 - [0: Select an Option] +RSInterface 234 - [1: option1] +RSInterface 234 - [2: option2] +RSInterface 234 - [3: option3] +RSInterface 234 - [4: option4] +RSInterface 234 - [5: option5] +RSInterface 235 - [0: Select an Option] +RSInterface 235 - [1: option1] +RSInterface 235 - [2: option2] +RSInterface 235 - [3: option3] +RSInterface 235 - [4: option4] +RSInterface 235 - [5: option5] +RSInterface 236 - [0: Select an Option] +RSInterface 236 - [1: option1] +RSInterface 236 - [2: option2] +RSInterface 237 - [0: Select an Option] +RSInterface 237 - [1: option1] +RSInterface 237 - [2: option2] +RSInterface 237 - [3: option3] +RSInterface 237 - [4: option4] +RSInterface 238 - [0: Select an Option] +RSInterface 238 - [1: option1] +RSInterface 238 - [2: option2] +RSInterface 238 - [3: option3] +RSInterface 238 - [4: option4] +RSInterface 238 - [5: option5] +RSInterface 239 - [1: To: Engineer Claus Mousetrap] +RSInterface 239 - [2: This morning I received a complaint about your inability to repair the Camp Tyras catapult, arriving without the tools and materials required. To avoid further delay, I'll repeat your instructions:] +RSInterface 239 - [3: *The replacement wooden parts must be made from MAHOGANY planks and at least MITHRIL nails.
*You will need METAL PARTS, which have been ordered from Rolad, the dwarf scholar.
The pride of the King's Engineers is at stake, Claus.] +RSInterface 239 - [4: SORT THIS MESS OUT!] +RSInterface 239 - [5: Chief Engineer, Commander Measures] +RSInterface 240 - [27: Tries = 3] +RSInterface 241 - [1: Name] +RSInterface 241 - [2: Line1] +RSInterface 242 - [1: Name] +RSInterface 242 - [2: Line1] +RSInterface 242 - [3: Line2] +RSInterface 243 - [1: Name] +RSInterface 243 - [2: Line1] +RSInterface 243 - [3: Line2] +RSInterface 243 - [4: Line3] +RSInterface 244 - [1: Name] +RSInterface 244 - [2: Line1] +RSInterface 244 - [3: Line2] +RSInterface 244 - [4: Line3] +RSInterface 244 - [5: Line4] +RSInterface 245 - [1: Name] +RSInterface 246 - [1: Name] +RSInterface 246 - [2: Line1] +RSInterface 247 - [1: Name] +RSInterface 247 - [2: Line1] +RSInterface 247 - [3: Line2] +RSInterface 248 - [1: Name] +RSInterface 248 - [2: Line1] +RSInterface 248 - [3: Line2] +RSInterface 248 - [4: Line3] +RSInterface 249 - [2: Surok Magis,] +RSInterface 249 - [4: Your actions are being watched. We know what you are trying to do and the VPSG will stop you! Do not attempt to leave the palace or you will be arrested on sight. We will not hesitate to kill you if you disobey King Roald's orders. Rat Burgiss] +RSInterface 250 - [2: To My Business Partner,] +RSInterface 250 - [4: All is well here, my friend. I will continue with my work. You do not need worry. They suspect nothing, the fools! In three days there will be a new King in Varrock! Surok Magis] +RSInterface 251 - [2: Instructions for Beacon Ring] +RSInterface 251 - [4: Use this ring when you are ready to summon me to your aid. It is a daunting task, yet you must battle the king to allow me to remove the spell from him. When the king is almost dead, use this ring and I will teleport to your aid. Be warned - Though I am skilled with magic, I am no fighter! Should you summon me too early I will have to teleport us out of danger! When our mission is completed, I will remove the summon ability from this ring, but you may keep it for protection. Zaff] +RSInterface 256 - [4: Current team] +RSInterface 256 - [5: -----] +RSInterface 256 - [6: -----] +RSInterface 256 - [7: -----] +RSInterface 256 - [8: -----] +RSInterface 256 - [9: -----] +RSInterface 256 - [10: Leader:] +RSInterface 256 - [11: Player 1:] +RSInterface 256 - [12: Player 2:] +RSInterface 256 - [13: Player 3:] +RSInterface 256 - [14: Player 4:] +RSInterface 259 - [11: Achievement Diary] +RSInterface 259 - [13: Karamja] +RSInterface 259 - [14: Varrock] +RSInterface 260 - [41: Cyrisus's Bank] +RSInterface 260 - [43: Chest] +RSInterface 261 - [27: %1%] +RSInterface 261 - [36: Adjust Screen Brightness] +RSInterface 261 - [37: Adjust Music Volume] +RSInterface 261 - [38: Adjust Sound Effect Volume] +RSInterface 261 - [39: Adjust Area Sound Volume] +RSInterface 261 - [40: Run (on) Energy %1%] +RSInterface 261 - [41: Chat Effects
(currently on)] +RSInterface 261 - [42: Split Private Chat
(currently on)] +RSInterface 261 - [43: Mouse buttons
(currently 2)] +RSInterface 261 - [44: Accept Aid (currently on)] +RSInterface 261 - [45: House Options] +RSInterface 261 - [46: Run (off) Energy %1%] +RSInterface 261 - [47: Chat Effects
(currently off)] +RSInterface 261 - [48: Split Private Chat
(currently off)] +RSInterface 261 - [49: Mouse buttons
(currently 1)] +RSInterface 261 - [50: Accept Aid (currently off)] +RSInterface 265 - [2: Clan A's name] +RSInterface 265 - [3: Players remaining:] +RSInterface 265 - [4: Opposing clan] +RSInterface 265 - [5: Players remaining:] +RSInterface 265 - [6: 0] +RSInterface 265 - [7: 0] +RSInterface 265 - [8: Time till start] +RSInterface 267 - [12: Attack] +RSInterface 267 - [13: Strength] +RSInterface 267 - [14: Defence] +RSInterface 267 - [15: Ranged] +RSInterface 267 - [16: Magic] +RSInterface 267 - [17: Hitpoints] +RSInterface 267 - [18: Prayer] +RSInterface 267 - [30: Void Knight Mace] +RSInterface 267 - [31: Void Knight Top] +RSInterface 267 - [32: Void Knight Robes] +RSInterface 267 - [33: Void Knight Gloves] +RSInterface 267 - [34: Herb Pack] +RSInterface 267 - [35: Seed Pack] +RSInterface 267 - [36: (1 Pt)] +RSInterface 267 - [37: (1 Pt)] +RSInterface 267 - [38: (1 Pt)] +RSInterface 267 - [39: (1 Pt)] +RSInterface 267 - [40: (1 Pt)] +RSInterface 267 - [41: (1 Pt)] +RSInterface 267 - [42: (1 Pt)] +RSInterface 267 - [43: (250 Pts)] +RSInterface 267 - [44: (250 Pts)] +RSInterface 267 - [45: (250 Pts)] +RSInterface 267 - [46: (150 Pts)] +RSInterface 267 - [47: (30 Pts)] +RSInterface 267 - [48: (15 Pts)] +RSInterface 267 - [49: Mineral Pack] +RSInterface 267 - [50: (15 Pts)] +RSInterface 267 - [51: (10 Pts)] +RSInterface 267 - [52: (10 Pts)] +RSInterface 267 - [53: (10 Pts)] +RSInterface 267 - [54: (10 Pts)] +RSInterface 267 - [55: (10 Pts)] +RSInterface 267 - [56: (10 Pts)] +RSInterface 267 - [57: (10 Pts)] +RSInterface 267 - [58: (100 Pts)] +RSInterface 267 - [59: (100 Pts)] +RSInterface 267 - [60: (100 Pts)] +RSInterface 267 - [61: (100 Pts)] +RSInterface 267 - [62: (100 Pts)] +RSInterface 267 - [63: (100 Pts)] +RSInterface 267 - [64: (100 Pts)] +RSInterface 267 - [65: Void Knight Mage Helm] +RSInterface 267 - [66: Void Knight Ranger Helm] +RSInterface 267 - [67: Void Knight Melee Helm] +RSInterface 267 - [68: Void Knight Seal] +RSInterface 267 - [69: (200 Pts)] +RSInterface 267 - [70: (200 Pts)] +RSInterface 267 - [71: (200 Pts)] +RSInterface 267 - [72: (10 Pts)] +RSInterface 267 - [73: Spinner Charm] +RSInterface 267 - [74: Ravager Charm] +RSInterface 267 - [75: Shifter Charm] +RSInterface 267 - [76: Torcher Charm] +RSInterface 267 - [77: (2 Pts)] +RSInterface 267 - [78: (28 Pts)] +RSInterface 267 - [79: (56 Pts)] +RSInterface 267 - [80: (28 Pts)] +RSInterface 267 - [81: (56 Pts)] +RSInterface 267 - [82: (28 Pts)] +RSInterface 267 - [83: (56 Pts)] +RSInterface 267 - [84: (28 Pts)] +RSInterface 267 - [85: (56 Pts)] +RSInterface 267 - [86: (2 Pts)] +RSInterface 267 - [87: (2 Pts)] +RSInterface 267 - [88: (2 Pts)] +RSInterface 267 - [96: Void Knights' Reward Options] +RSInterface 267 - [106: Confirm:] +RSInterface 270 - [3: Misthalin & Asgarnia] +RSInterface 270 - [47: Lumbridge] +RSInterface 270 - [48: Draynor] +RSInterface 270 - [49: Varrock] +RSInterface 270 - [50: Falador] +RSInterface 270 - [51: Port] +RSInterface 270 - [52: Sarim] +RSInterface 270 - [53: Rimmington] +RSInterface 270 - [54: Edgeville] +RSInterface 270 - [55: Al Kharid] +RSInterface 270 - [62: Show Tutors] +RSInterface 272 - [16: Grave Monument] +RSInterface 272 - [17: Saradomin

lights my way

through

the darkness of life] +RSInterface 273 - [1: Pop the correct balloon animal to find a key] +RSInterface 274 - [10: Quest Points: 0] +RSInterface 274 - [13: Free Quests] +RSInterface 274 - [14: Black Knights' Fortress] +RSInterface 274 - [15: Cook's Assistant] +RSInterface 274 - [16: Demon Slayer] +RSInterface 274 - [17: Doric's Quest] +RSInterface 274 - [18: Dragon Slayer] +RSInterface 274 - [19: Ernest the Chicken] +RSInterface 274 - [20: Goblin Diplomacy] +RSInterface 274 - [21: Imp Catcher] +RSInterface 274 - [22: The Knight's Sword] +RSInterface 274 - [23: Pirate's Treasure] +RSInterface 274 - [24: Prince Ali Rescue] +RSInterface 274 - [25: The Restless Ghost] +RSInterface 274 - [26: Romeo & Juliet] +RSInterface 274 - [27: Rune Mysteries] +RSInterface 274 - [28: Sheep Shearer] +RSInterface 274 - [29: Shield of Arrav] +RSInterface 274 - [30: Vampire Slayer] +RSInterface 274 - [31: Witch's Potion] +RSInterface 274 - [32: Members' Quests] +RSInterface 274 - [33: Animal Magnetism] +RSInterface 274 - [34: Between a Rock...] +RSInterface 274 - [35: Big Chompy Bird Hunting] +RSInterface 274 - [36: Biohazard] +RSInterface 274 - [37: Cabin Fever] +RSInterface 274 - [38: Clock Tower] +RSInterface 274 - [39: Contact!] +RSInterface 274 - [40: Zogre Flesh Eaters] +RSInterface 274 - [41: Creature of Fenkenstrain] +RSInterface 274 - [42: Darkness of Hallowvale] +RSInterface 274 - [43: Death to the Dorgeshuun] +RSInterface 274 - [44: Death Plateau] +RSInterface 274 - [45: Desert Treasure] +RSInterface 274 - [46: Devious Minds] +RSInterface 274 - [47: The Dig Site] +RSInterface 274 - [48: Druidic Ritual] +RSInterface 274 - [49: Dwarf Cannon] +RSInterface 274 - [50: Eadgar's Ruse] +RSInterface 274 - [51: Eagles' Peak] +RSInterface 274 - [52: Elemental Workshop I] +RSInterface 274 - [53: Elemental Workshop II] +RSInterface 274 - [54: Enakhra's Lament] +RSInterface 274 - [55: Enlightened Journey] +RSInterface 274 - [56: The Eyes of Glouphrie] +RSInterface 274 - [57: Fairytale I - Growing Pains] +RSInterface 274 - [58: Fairytale II - Cure a Queen] +RSInterface 274 - [59: Family Crest] +RSInterface 274 - [60: The Feud] +RSInterface 274 - [61: Fight Arena] +RSInterface 274 - [62: Fishing Contest] +RSInterface 274 - [63: Forgettable Tale...] +RSInterface 274 - [64: The Fremennik Trials] +RSInterface 274 - [65: Waterfall Quest] +RSInterface 274 - [66: Garden of Tranquillity] +RSInterface 274 - [67: Gertrude's Cat] +RSInterface 274 - [68: Ghosts Ahoy] +RSInterface 274 - [69: The Giant Dwarf] +RSInterface 274 - [70: The Golem] +RSInterface 274 - [71: The Grand Tree] +RSInterface 274 - [72: The Hand in the Sand] +RSInterface 274 - [73: Haunted Mine] +RSInterface 274 - [74: Hazeel Cult] +RSInterface 274 - [75: Heroes' Quest] +RSInterface 274 - [76: Holy Grail] +RSInterface 274 - [77: Horror from the Deep] +RSInterface 274 - [78: Icthlarin's Little Helper] +RSInterface 274 - [79: In Aid of the Myreque] +RSInterface 274 - [80: In Search of the Myreque] +RSInterface 274 - [81: Jungle Potion] +RSInterface 274 - [82: Legends' Quest] +RSInterface 274 - [83: Lost City] +RSInterface 274 - [84: The Lost Tribe] +RSInterface 274 - [85: Lunar Diplomacy] +RSInterface 274 - [86: Making History] +RSInterface 274 - [87: Merlin's Crystal] +RSInterface 274 - [88: Monkey Madness] +RSInterface 274 - [89: Monk's Friend] +RSInterface 274 - [90: Mountain Daughter] +RSInterface 274 - [91: Mourning's Ends Part I] +RSInterface 274 - [92: Mourning's Ends Part II] +RSInterface 274 - [93: Murder Mystery] +RSInterface 274 - [94: My Arm's Big Adventure] +RSInterface 274 - [95: Nature Spirit] +RSInterface 274 - [96: Observatory Quest] +RSInterface 274 - [97: One Small Favour] +RSInterface 274 - [98: Plague City] +RSInterface 274 - [99: Priest in Peril] +RSInterface 274 - [100: Rag and Bone Man] +RSInterface 274 - [101: Ratcatchers] +RSInterface 274 - [102: Recipe for Disaster] +RSInterface 274 - [103: Recruitment Drive] +RSInterface 274 - [104: Regicide] +RSInterface 274 - [105: Roving Elves] +RSInterface 274 - [106: Royal Trouble] +RSInterface 274 - [107: Rum Deal] +RSInterface 274 - [108: Scorpion Catcher] +RSInterface 274 - [109: Sea Slug] +RSInterface 274 - [110: The Slug Menace] +RSInterface 274 - [111: Shades of Mort'ton] +RSInterface 274 - [112: Shadow of the Storm] +RSInterface 274 - [113: Sheep Herder] +RSInterface 274 - [114: Shilo Village] +RSInterface 274 - [115: A Soul's Bane] +RSInterface 274 - [116: Spirits of the Elid] +RSInterface 274 - [117: Swan Song] +RSInterface 274 - [118: Tai Bwo Wannai Trio] +RSInterface 274 - [119: A Tail of Two Cats] +RSInterface 274 - [120: Tears of Guthix] +RSInterface 274 - [121: Temple of Ikov] +RSInterface 274 - [122: Throne of Miscellania] +RSInterface 274 - [123: The Tourist Trap] +RSInterface 274 - [124: Witch's House] +RSInterface 274 - [125: Tree Gnome Village] +RSInterface 274 - [126: Tribal Totem] +RSInterface 274 - [127: Troll Romance] +RSInterface 274 - [128: Troll Stronghold] +RSInterface 274 - [129: Underground Pass] +RSInterface 274 - [130: Wanted!] +RSInterface 274 - [131: Watchtower] +RSInterface 274 - [132: Cold War] +RSInterface 274 - [133: The Fremennik Isles] +RSInterface 274 - [134: Tower of Life] +RSInterface 274 - [135: The Great Brain Robbery] +RSInterface 274 - [136: What Lies Below] +RSInterface 274 - [137: Olaf's Quest] +RSInterface 274 - [138: Another Slice of H.A.M.] +RSInterface 274 - [139: Dream Mentor] +RSInterface 274 - [140: Grim Tales] +RSInterface 274 - [141: King's Ransom] +RSInterface 274 - [142: The Path of Glouphrie] +RSInterface 274 - [143: Back to my Roots] +RSInterface 274 - [144: Land of the Goblins] +RSInterface 274 - [145: Dealing with Scabaras] +RSInterface 274 - [146: Wolf Whistle] +RSInterface 274 - [147: As a First Resort...] +RSInterface 274 - [148: Catapult Construction] +RSInterface 274 - [149: Kennith's Concerns] +RSInterface 274 - [150: Legacy of Seergaze] +RSInterface 274 - [151: Perils of Ice Mountain] +RSInterface 275 - [2: ifquestname] +RSInterface 275 - [4: qj1] +RSInterface 275 - [5: qj2] +RSInterface 275 - [6: qj3] +RSInterface 275 - [7: qj4] +RSInterface 275 - [8: qj5] +RSInterface 275 - [9: qj6] +RSInterface 275 - [10: qj7] +RSInterface 275 - [11: qj8] +RSInterface 275 - [12: qj9] +RSInterface 275 - [13: qj10] +RSInterface 275 - [14: qj11] +RSInterface 275 - [15: qj12] +RSInterface 275 - [16: qj13] +RSInterface 275 - [17: qj14] +RSInterface 275 - [18: qj15] +RSInterface 275 - [19: qj16] +RSInterface 275 - [20: qj17] +RSInterface 275 - [21: qj18] +RSInterface 275 - [22: qj19] +RSInterface 275 - [23: qj20] +RSInterface 275 - [24: qj21] +RSInterface 275 - [25: qj22] +RSInterface 275 - [26: qj23] +RSInterface 275 - [27: qj24] +RSInterface 275 - [28: qj25] +RSInterface 275 - [29: qj26] +RSInterface 275 - [30: qj27] +RSInterface 275 - [31: qj28] +RSInterface 275 - [32: qj29] +RSInterface 275 - [33: qj30] +RSInterface 275 - [34: qj31] +RSInterface 275 - [35: qj32] +RSInterface 275 - [36: qj33] +RSInterface 275 - [37: qj34] +RSInterface 275 - [38: qj35] +RSInterface 275 - [39: qj36] +RSInterface 275 - [40: qj37] +RSInterface 275 - [41: qj38] +RSInterface 275 - [42: qj39] +RSInterface 275 - [43: qj40] +RSInterface 275 - [44: qj41] +RSInterface 275 - [45: qj42] +RSInterface 275 - [46: qj43] +RSInterface 275 - [47: qj44] +RSInterface 275 - [48: qj45] +RSInterface 275 - [49: qj46] +RSInterface 275 - [50: qj47] +RSInterface 275 - [51: qj48] +RSInterface 275 - [52: qj49] +RSInterface 275 - [53: qj50] +RSInterface 275 - [54: qj51] +RSInterface 275 - [55: qj52] +RSInterface 275 - [56: qj53] +RSInterface 275 - [57: qj54] +RSInterface 275 - [58: qj55] +RSInterface 275 - [59: qj56] +RSInterface 275 - [60: qj57] +RSInterface 275 - [61: qj58] +RSInterface 275 - [62: qj59] +RSInterface 275 - [63: qj60] +RSInterface 275 - [64: qj61] +RSInterface 275 - [65: qj62] +RSInterface 275 - [66: qj63] +RSInterface 275 - [67: qj64] +RSInterface 275 - [68: qj65] +RSInterface 275 - [69: qj66] +RSInterface 275 - [70: qj67] +RSInterface 275 - [71: qj68] +RSInterface 275 - [72: qj69] +RSInterface 275 - [73: qj70] +RSInterface 275 - [74: qj71] +RSInterface 275 - [75: qj72] +RSInterface 275 - [76: qj73] +RSInterface 275 - [77: qj74] +RSInterface 275 - [78: qj75] +RSInterface 275 - [79: qj76] +RSInterface 275 - [80: qj77] +RSInterface 275 - [81: qj78] +RSInterface 275 - [82: qj79] +RSInterface 275 - [83: qj80] +RSInterface 275 - [84: qj81] +RSInterface 275 - [85: qj82] +RSInterface 275 - [86: qj83] +RSInterface 275 - [87: qj84] +RSInterface 275 - [88: qj85] +RSInterface 275 - [89: qj86] +RSInterface 275 - [90: qj87] +RSInterface 275 - [91: qj88] +RSInterface 275 - [92: qj89] +RSInterface 275 - [93: qj90] +RSInterface 275 - [94: qj91] +RSInterface 275 - [95: qj92] +RSInterface 275 - [96: qj93] +RSInterface 275 - [97: qj94] +RSInterface 275 - [98: qj95] +RSInterface 275 - [99: qj96] +RSInterface 275 - [100: qj97] +RSInterface 275 - [101: qj98] +RSInterface 275 - [102: qj99] +RSInterface 275 - [103: qj100] +RSInterface 275 - [104: qj101] +RSInterface 275 - [105: qj102] +RSInterface 275 - [106: qj103] +RSInterface 275 - [107: qj104] +RSInterface 275 - [108: qj105] +RSInterface 275 - [109: qj106] +RSInterface 275 - [110: qj107] +RSInterface 275 - [111: qj108] +RSInterface 275 - [112: qj109] +RSInterface 275 - [113: qj110] +RSInterface 275 - [114: qj111] +RSInterface 275 - [115: qj112] +RSInterface 275 - [116: qj113] +RSInterface 275 - [117: qj114] +RSInterface 275 - [118: qj115] +RSInterface 275 - [119: qj116] +RSInterface 275 - [120: qj117] +RSInterface 275 - [121: qj118] +RSInterface 275 - [122: qj119] +RSInterface 275 - [123: qj120] +RSInterface 275 - [124: qj121] +RSInterface 275 - [125: qj122] +RSInterface 275 - [126: qj123] +RSInterface 275 - [127: qj124] +RSInterface 275 - [128: qj125] +RSInterface 275 - [129: qj126] +RSInterface 275 - [130: qj127] +RSInterface 275 - [131: qj128] +RSInterface 275 - [132: qj129] +RSInterface 275 - [133: qj130] +RSInterface 275 - [134: qj131] +RSInterface 275 - [135: qj132] +RSInterface 275 - [136: qj133] +RSInterface 275 - [137: qj134] +RSInterface 275 - [138: qj135] +RSInterface 275 - [139: qj136] +RSInterface 275 - [140: qj137] +RSInterface 275 - [141: qj138] +RSInterface 275 - [142: qj139] +RSInterface 275 - [143: qj140] +RSInterface 275 - [144: qj141] +RSInterface 275 - [145: qj142] +RSInterface 275 - [146: qj143] +RSInterface 275 - [147: qj144] +RSInterface 275 - [148: qj145] +RSInterface 275 - [149: qj146] +RSInterface 275 - [150: qj147] +RSInterface 275 - [151: qj148] +RSInterface 275 - [152: qj149] +RSInterface 275 - [153: qj150] +RSInterface 275 - [154: qj151] +RSInterface 275 - [155: qj152] +RSInterface 275 - [156: qj153] +RSInterface 275 - [157: qj154] +RSInterface 275 - [158: qj155] +RSInterface 275 - [159: qj156] +RSInterface 275 - [160: qj157] +RSInterface 275 - [161: qj158] +RSInterface 275 - [162: qj159] +RSInterface 275 - [163: qj160] +RSInterface 275 - [164: qj161] +RSInterface 275 - [165: qj162] +RSInterface 275 - [166: qj163] +RSInterface 275 - [167: qj164] +RSInterface 275 - [168: qj165] +RSInterface 275 - [169: qj166] +RSInterface 275 - [170: qj167] +RSInterface 275 - [171: qj168] +RSInterface 275 - [172: qj169] +RSInterface 275 - [173: qj170] +RSInterface 275 - [177: qj171] +RSInterface 275 - [178: qj172] +RSInterface 275 - [179: qj173] +RSInterface 275 - [180: qj174] +RSInterface 275 - [181: qj175] +RSInterface 275 - [182: qj176] +RSInterface 275 - [183: qj177] +RSInterface 275 - [184: qj178] +RSInterface 275 - [185: qj179] +RSInterface 275 - [186: qj180] +RSInterface 275 - [187: qj181] +RSInterface 275 - [188: qj182] +RSInterface 275 - [189: qj183] +RSInterface 275 - [190: qj184] +RSInterface 275 - [191: qj185] +RSInterface 275 - [192: qj186] +RSInterface 275 - [193: qj187] +RSInterface 275 - [194: qj188] +RSInterface 275 - [195: qj189] +RSInterface 275 - [196: qj190] +RSInterface 275 - [197: qj191] +RSInterface 275 - [198: qj192] +RSInterface 275 - [199: qj193] +RSInterface 275 - [200: qj194] +RSInterface 275 - [201: qj195] +RSInterface 275 - [202: qj196] +RSInterface 275 - [203: qj197] +RSInterface 275 - [204: qj198] +RSInterface 275 - [205: qj199] +RSInterface 275 - [206: qj200] +RSInterface 275 - [207: qj201] +RSInterface 275 - [208: qj202] +RSInterface 275 - [209: qj203] +RSInterface 275 - [210: qj204] +RSInterface 275 - [211: qj205] +RSInterface 275 - [212: qj206] +RSInterface 275 - [213: qj207] +RSInterface 275 - [214: qj208] +RSInterface 275 - [215: qj209] +RSInterface 275 - [216: qj210] +RSInterface 275 - [217: qj211] +RSInterface 275 - [218: qj212] +RSInterface 275 - [219: qj213] +RSInterface 275 - [220: qj214] +RSInterface 275 - [221: qj215] +RSInterface 275 - [222: qj216] +RSInterface 275 - [223: qj217] +RSInterface 275 - [224: qj218] +RSInterface 275 - [225: qj219] +RSInterface 275 - [226: qj220] +RSInterface 275 - [227: qj221] +RSInterface 275 - [228: qj222] +RSInterface 275 - [229: qj223] +RSInterface 275 - [230: qj224] +RSInterface 275 - [231: qj225] +RSInterface 275 - [232: qj226] +RSInterface 275 - [233: qj227] +RSInterface 275 - [234: qj228] +RSInterface 275 - [235: qj229] +RSInterface 275 - [236: qj230] +RSInterface 275 - [237: qj231] +RSInterface 275 - [238: qj232] +RSInterface 275 - [239: qj233] +RSInterface 275 - [240: qj234] +RSInterface 275 - [241: qj235] +RSInterface 275 - [242: qj236] +RSInterface 275 - [243: qj237] +RSInterface 275 - [244: qj238] +RSInterface 275 - [245: qj239] +RSInterface 275 - [246: qj240] +RSInterface 275 - [247: qj241] +RSInterface 275 - [248: qj242] +RSInterface 275 - [249: qj243] +RSInterface 275 - [250: qj244] +RSInterface 275 - [251: qj215] +RSInterface 275 - [252: qj246] +RSInterface 275 - [253: qj247] +RSInterface 275 - [254: qj248] +RSInterface 275 - [255: qj249] +RSInterface 276 - [1: Congratulations!] +RSInterface 276 - [4: Total Points:] +RSInterface 276 - [5: %1] +RSInterface 276 - [7: You are awarded] +RSInterface 276 - [8: 0] +RSInterface 276 - [9: Quest points.] +RSInterface 277 - [1: Congratulations!] +RSInterface 277 - [2: You have completed Death Plateau!] +RSInterface 277 - [4: Quest Points:] +RSInterface 277 - [5: %1] +RSInterface 277 - [7: You are awarded:] +RSInterface 277 - [8: Line 1] +RSInterface 277 - [9: Line 2] +RSInterface 277 - [10: Line 3 ] +RSInterface 277 - [11: Line 4] +RSInterface 277 - [12: Line 5] +RSInterface 277 - [13: Line 6] +RSInterface 277 - [14: Line 7] +RSInterface 278 - [88: Ranging Guild Ticket Exchange] +RSInterface 279 - [8: Player's Cat] +RSInterface 279 - [9: Opponent's Cat] +RSInterface 279 - [10: Vs] +RSInterface 279 - [11: ACCEPT] +RSInterface 279 - [12: DECLINE] +RSInterface 279 - [13: Amount] +RSInterface 279 - [14: Amount] +RSInterface 279 - [15: 0] +RSInterface 279 - [16: 0] +RSInterface 279 - [23: Your Limit:] +RSInterface 279 - [24: Their Limit:] +RSInterface 279 - [25: 1000] +RSInterface 280 - [3: YES] +RSInterface 280 - [4: NO] +RSInterface 281 - [0: Text] +RSInterface 281 - [1: Text] +RSInterface 281 - [4: 10] +RSInterface 281 - [5: 10] +RSInterface 281 - [9: Your cat has been] +RSInterface 282 - [10: Page 1 of 8] +RSInterface 282 - [20: PLAY] +RSInterface 285 - [43: A] +RSInterface 285 - [44: A] +RSInterface 285 - [45: A] +RSInterface 285 - [46: A] +RSInterface 285 - [55: Combination Lock Door] +RSInterface 285 - [57: E N T E R] +RSInterface 286 - [88: Fractional still] +RSInterface 286 - [90: Heat] +RSInterface 286 - [92: Pressure] +RSInterface 286 - [120: Add Coal] +RSInterface 286 - [157: Tar regulator] +RSInterface 286 - [158: Pressure valve] +RSInterface 286 - [160: Total distilled] +RSInterface 288 - [9: open casket] +RSInterface 289 - [41: open casket] +RSInterface 294 - [4: Rum] +RSInterface 295 - [1: Rum] +RSInterface 297 - [8: Choose your refreshment from the sandwich tray] +RSInterface 297 - [12: Key] +RSInterface 297 - [23: Meat Pie] +RSInterface 297 - [24: Kebab] +RSInterface 297 - [25: Chocolate Bar] +RSInterface 297 - [26: Baguette] +RSInterface 297 - [27: Triangle Sandwich] +RSInterface 297 - [28: Square Sandwich] +RSInterface 297 - [29: back] +RSInterface 297 - [30: Roll] +RSInterface 298 - [43: A] +RSInterface 298 - [44: A] +RSInterface 298 - [45: A] +RSInterface 298 - [46: A] +RSInterface 298 - [55: Combination Lock Door] +RSInterface 298 - [57: E N T E R] +RSInterface 299 - [2: Ape] +RSInterface 299 - [3: Asgarnia] +RSInterface 299 - [4: Karamja] +RSInterface 299 - [5: Crandor] +RSInterface 299 - [6: Entrana] +RSInterface 299 - [7: Port] +RSInterface 299 - [8: Sarim] +RSInterface 299 - [13: Port] +RSInterface 299 - [14: Khazard] +RSInterface 299 - [15: Ship] +RSInterface 299 - [16: Yard] +RSInterface 299 - [19: Cairn] +RSInterface 299 - [20: Isle] +RSInterface 299 - [22: Brimhaven] +RSInterface 299 - [23: Ardougne] +RSInterface 299 - [25: You Journey on the ship....] +RSInterface 299 - [44: Atoll] +RSInterface 299 - [47: Feldip] +RSInterface 299 - [48: Hills] +RSInterface 299 - [49: The ogres follow the scent of the chompy.... ] +RSInterface 299 - [50: The ogres travel back with the goods] +RSInterface 300 - [15: Smithing] +RSInterface 300 - [20: Dagger] +RSInterface 300 - [21: 1 Bar] +RSInterface 300 - [28: Axe] +RSInterface 300 - [29: 1 Bar] +RSInterface 300 - [36: Mace] +RSInterface 300 - [37: 1 Bar] +RSInterface 300 - [44: Medium helm] +RSInterface 300 - [45: 1 Bar] +RSInterface 300 - [52: Crossbow bolts] +RSInterface 300 - [53: 1 Bar] +RSInterface 300 - [60: Sword] +RSInterface 300 - [61: 1 Bar] +RSInterface 300 - [68: Dart tips] +RSInterface 300 - [69: 1 Bar] +RSInterface 300 - [76: Nails] +RSInterface 300 - [77: 1 Bar] +RSInterface 300 - [84: Bronze wire] +RSInterface 300 - [85: 1 Bar] +RSInterface 300 - [92: Spit iron] +RSInterface 300 - [93: 1 Bar] +RSInterface 300 - [100: Studs] +RSInterface 300 - [101: 1 Bar] +RSInterface 300 - [108: Arrow tips] +RSInterface 300 - [109: 1 Bar] +RSInterface 300 - [116: Scimitar] +RSInterface 300 - [117: 2 Bars] +RSInterface 300 - [124: Crossbow limbs] +RSInterface 300 - [125: 1 Bar] +RSInterface 300 - [132: Longsword] +RSInterface 300 - [133: 2 Bars] +RSInterface 300 - [140: Throwing knife] +RSInterface 300 - [141: 1 Bar] +RSInterface 300 - [148: Full helm] +RSInterface 300 - [149: 2 Bars] +RSInterface 300 - [156: Square shield] +RSInterface 300 - [157: 2 Bars] +RSInterface 300 - [164: Bullseye lantern] +RSInterface 300 - [165: 1 Bar] +RSInterface 300 - [172: Grapple tip] +RSInterface 300 - [173: 1 Bar] +RSInterface 300 - [180: Warhammer] +RSInterface 300 - [181: 3 Bars] +RSInterface 300 - [188: Battleaxe] +RSInterface 300 - [189: 3 Bars] +RSInterface 300 - [196: Chainbody] +RSInterface 300 - [197: 3 Bars] +RSInterface 300 - [204: Kiteshield] +RSInterface 300 - [205: 3 Bars] +RSInterface 300 - [212: Claws] +RSInterface 300 - [213: 2 Bars] +RSInterface 300 - [220: 2-h sword] +RSInterface 300 - [221: 3 Bars] +RSInterface 300 - [228: Plateskirt] +RSInterface 300 - [229: 3 Bars] +RSInterface 300 - [236: Platelegs] +RSInterface 300 - [237: 3 Bars] +RSInterface 300 - [244: Platebody] +RSInterface 300 - [245: 5 Bars] +RSInterface 300 - [253: Crossbow bolts] +RSInterface 300 - [254: 1 Bar] +RSInterface 300 - [261: Crossbow limbs] +RSInterface 300 - [262: 1 Bar] +RSInterface 300 - [269: Pickaxe] +RSInterface 300 - [270: 2 Bars] +RSInterface 301 - [10: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] +RSInterface 301 - [70: Runecrafting XP] +RSInterface 301 - [71: XP] +RSInterface 301 - [72: Crafting XP] +RSInterface 301 - [73: XP] +RSInterface 301 - [74: Fletching XP] +RSInterface 301 - [75: XP] +RSInterface 301 - [76: Construction XP] +RSInterface 301 - [77: XP] +RSInterface 301 - [78: Farming XP] +RSInterface 301 - [79: XP] +RSInterface 301 - [80: Magic XP] +RSInterface 301 - [81: XP ] +RSInterface 301 - [82: Smithing XP] +RSInterface 301 - [83: XP ] +RSInterface 301 - [84: Cooking XP] +RSInterface 301 - [85: XP ] +RSInterface 301 - [86: Herblore XP] +RSInterface 301 - [87: XP ] +RSInterface 301 - [98: Total XP earned] +RSInterface 301 - [99: XP ] +RSInterface 310 - [6: Cancel] +RSInterface 311 - [2: What would you like to smelt?] +RSInterface 311 - [16:



Bronze] +RSInterface 311 - [20:



Blurite] +RSInterface 311 - [24:



Iron] +RSInterface 311 - [28:



Silver] +RSInterface 311 - [32:



Steel] +RSInterface 311 - [36:



Gold] +RSInterface 311 - [40:



Mithril] +RSInterface 311 - [44:



Adamant] +RSInterface 312 - [1: This sneaky gublinch wanted to set up a webcam conversation with a player! The player refused and sensibly used the Report Abuse button to enable us to catch him.] +RSInterface 319 - [16: Cancel] +RSInterface 323 - [3: Tai Bwo Wannai Parcel Service] +RSInterface 324 - [88: What hides would you like tanning?] +RSInterface 324 - [108: Hide] +RSInterface 324 - [109: Hide] +RSInterface 324 - [110: Hide] +RSInterface 324 - [111: Hide] +RSInterface 324 - [112: Hide] +RSInterface 324 - [113: Hide] +RSInterface 324 - [114: Hide] +RSInterface 324 - [115: Hide] +RSInterface 324 - [116: Cost] +RSInterface 324 - [117: Cost] +RSInterface 324 - [118: Cost] +RSInterface 324 - [119: Cost] +RSInterface 324 - [120: Cost] +RSInterface 324 - [121: Cost] +RSInterface 324 - [122: Cost] +RSInterface 324 - [123: Cost] +RSInterface 325 - [93: Target View] +RSInterface 325 - [105: Shots] +RSInterface 325 - [106: Score:] +RSInterface 325 - [107: %1] +RSInterface 325 - [108: Left:] +RSInterface 325 - [109: 10] +RSInterface 325 - [110: 20] +RSInterface 325 - [111: 30] +RSInterface 325 - [112: 50] +RSInterface 325 - [114: 100] +RSInterface 326 - [88: Teleport Option] +RSInterface 326 - [89: %1] +RSInterface 326 - [90: ...wants to teleport you to...] +RSInterface 326 - [91: %2] +RSInterface 326 - [92: Do you accept?] +RSInterface 326 - [98: Accept] +RSInterface 326 - [100: Decline] +RSInterface 327 - [13: Warning!] +RSInterface 327 - [14: This area is so cold that you will experience
a constant, slow drain of your stats while
you remain within it.] +RSInterface 327 - [17: Don't show me this again] +RSInterface 328 - [0: Repair State :] +RSInterface 328 - [1: %1%] +RSInterface 328 - [2: Resources :] +RSInterface 328 - [3: %1%] +RSInterface 328 - [4: Sanctity:] +RSInterface 328 - [5: %1%] +RSInterface 328 - [6: * Temple Repair *] +RSInterface 329 - [5: Burgh DeRott] +RSInterface 329 - [6: Mort'ton] +RSInterface 329 - [7: Canifis] +RSInterface 329 - [8: Mort] +RSInterface 329 - [9: Myre] +RSInterface 329 - [10: Swamp] +RSInterface 329 - [11: The Hollows] +RSInterface 329 - [19: Choose a route] +RSInterface 329 - [21: Route One] +RSInterface 329 - [22: Route One] +RSInterface 329 - [25: Route Two] +RSInterface 329 - [26: Route Two] +RSInterface 329 - [29: Route Three] +RSInterface 329 - [30: Route Three] +RSInterface 329 - [33: Temple] +RSInterface 329 - [59: Slow plod,
can evade
encounters.] +RSInterface 329 - [60: Leisurely walk,
harder to evade
encounters.] +RSInterface 331 - [2: Whatever text you need goes here!] +RSInterface 331 - [3: Combi for lock] +RSInterface 331 - [4: Text] +RSInterface 331 - [5: Text] +RSInterface 331 - [6: Text] +RSInterface 332 - [91: Water Battlestaff] +RSInterface 332 - [92: Air Battlestaff] +RSInterface 332 - [93: Earth Battlestaff] +RSInterface 332 - [94: Fire Battlestaff] +RSInterface 332 - [95: What would you like to enchant?] +RSInterface 332 - [96: Lava Battlestaff] +RSInterface 332 - [97: Mud Battlestaff] +RSInterface 332 - [98: Steam Battlestaff] +RSInterface 334 - [31: You are about to give:] +RSInterface 334 - [32: In return you will receive:] +RSInterface 334 - [33: Are you sure you want to make this trade?] +RSInterface 334 - [34: There is NO WAY to reverse a trade if you change your mind.] +RSInterface 334 - [35: Accept] +RSInterface 334 - [36: Decline] +RSInterface 334 - [37: Item] +RSInterface 334 - [38: Item] +RSInterface 334 - [39: Item] +RSInterface 334 - [40: Item] +RSInterface 334 - [41: Item] +RSInterface 334 - [42: Item] +RSInterface 334 - [44: Trading with:
Unknown] +RSInterface 334 - [45: Trade modified] +RSInterface 335 - [17: Trading With: Unknown] +RSInterface 335 - [19: Accept] +RSInterface 335 - [21: Decline] +RSInterface 335 - [23: Name] +RSInterface 335 - [36: Trader's Offer] +RSInterface 335 - [37: Your Offer] +RSInterface 335 - [38: Waiting for other player] +RSInterface 335 - [40: Trade modified] +RSInterface 335 - [41: Trade modified] +RSInterface 335 - [42: Limit: 3000] +RSInterface 335 - [43: Wealth transfer] +RSInterface 335 - [44: Limit: 3000] +RSInterface 337 - [82: 1S] +RSInterface 339 - [27: 3N] +RSInterface 339 - [28: 2E] +RSInterface 340 - [27: 2N] +RSInterface 340 - [28: 3W] +RSInterface 340 - [29: 3N] +RSInterface 340 - [30: 2W] +RSInterface 340 - [31: 3N] +RSInterface 341 - [112: 8N] +RSInterface 341 - [113: 6W] +RSInterface 345 - [1: The quick brown fox jumped over the ] +RSInterface 345 - [2: The quick brown fox jumped over the ] +RSInterface 345 - [3: The quick brown fox jumped over the ] +RSInterface 345 - [4: The quick brown fox jumped over the ] +RSInterface 345 - [5: The quick brown fox jumped over the ] +RSInterface 345 - [6: The quick brown fox jumped over the ] +RSInterface 345 - [7: The quick brown fox jumped over the ] +RSInterface 345 - [8: The quick brown fox jumped over the ] +RSInterface 346 - [32: 2E] +RSInterface 347 - [21: 1N] +RSInterface 347 - [22: 6E] +RSInterface 347 - [23: 2W] +RSInterface 347 - [24: 6N] +RSInterface 348 - [36: 2W] +RSInterface 348 - [37: 4S] +RSInterface 348 - [38: 3E] +RSInterface 348 - [39: 3S] +RSInterface 349 - [37: 3E] +RSInterface 349 - [38: 3N] +RSInterface 349 - [39: 1E] +RSInterface 349 - [40: 2N] +RSInterface 363 - [3: Hint] +RSInterface 365 - [11: Get Location] +RSInterface 366 - [21: Water:] +RSInterface 366 - [22: Net:] +RSInterface 366 - [23: Catch:] +RSInterface 366 - [24: Time left:] +RSInterface 366 - [26: Okay] +RSInterface 366 - [27: Ripped!] +RSInterface 366 - [28: Nothing] +RSInterface 367 - [76: Trawler Catch] +RSInterface 367 - [77: Dump Items] +RSInterface 367 - [78: Click Dump Items to close the window and discard remaining items.] +RSInterface 368 - [4: Use rope to repair the Trawler's nets.] +RSInterface 368 - [5: Use Swamp Paste to repair leaks in the Ship's hull.] +RSInterface 368 - [6: If all else fails you can always try and bail the water out as well!] +RSInterface 368 - [7: How to play:] +RSInterface 369 - [42: A] +RSInterface 369 - [43: A] +RSInterface 369 - [44: A] +RSInterface 369 - [45: A] +RSInterface 369 - [54: Combination Lock Door] +RSInterface 369 - [56: Enter] +RSInterface 371 - [21: % Done] +RSInterface 371 - [22: Tutorial Island Progress] +RSInterface 372 - [0: Title] +RSInterface 372 - [1: Line1] +RSInterface 372 - [2: Line2] +RSInterface 372 - [3: Line3] +RSInterface 373 - [0: Current Champion: TzHaar-Xil-Huz] +RSInterface 373 - [1: Foes Remaining:] +RSInterface 374 - [5: Stop Viewing] +RSInterface 374 - [11: Centre] +RSInterface 374 - [12: North-West] +RSInterface 374 - [13: North-East] +RSInterface 374 - [14: South-East] +RSInterface 377 - [2: %1 %] +RSInterface 378 - [12: Welcome to RuneScape] +RSInterface 378 - [15: Jagex Staff will NEVER email you. We use the message centre on this website instead.] +RSInterface 378 - [18: CLICK HERE TO PLAY] +RSInterface 378 - [20: To view your messages:
1) Logout and return to the frontpage of this website.
2) Choose 'Read your messages from Jagex'.] +RSInterface 379 - [3: Time] +RSInterface 379 - [4: 4:17] +RSInterface 379 - [5: 300] +RSInterface 379 - [6: XP score] +RSInterface 380 - [1: Level: %1] +RSInterface 382 - [22: WARNING!] +RSInterface 382 - [23: If you go any further you will enter the Wilderness. This is a very dangerous area, haunted by ghosts! The further north you go, the more dangerous it becomes.] +RSInterface 382 - [24: Enter Wilderness] +RSInterface 382 - [25: Don't go] +RSInterface 382 - [26: Don't ask me this again] +RSInterface 383 - [26: Pick a colour] +RSInterface 384 - [1: wom1] +RSInterface 384 - [2: wom2] +RSInterface 384 - [3: wom3] +RSInterface 384 - [4: wom4] +RSInterface 384 - [5: wom5] +RSInterface 384 - [6: wom6] +RSInterface 384 - [7: wom7] +RSInterface 384 - [8: wom8] +RSInterface 384 - [9: wom9] +RSInterface 384 - [10: wom10] +RSInterface 384 - [11: wom11] +RSInterface 384 - [12: wom12] +RSInterface 384 - [13: wom13] +RSInterface 384 - [14: wom14] +RSInterface 384 - [15: wom15] +RSInterface 384 - [16: wom16] +RSInterface 387 - [58: Show Equipment Stats] +RSInterface 388 - [16: Cancel] +RSInterface 389 - [7: To search for an item, start by typing part of its name.
Then, simply select the item you want from the results on display.] +RSInterface 390 - [8: Show riddle] +RSInterface 391 - [1: Kingdom of Miscellania] +RSInterface 391 - [4: Mining] +RSInterface 391 - [10: Herbs] +RSInterface 391 - [25: Coffers:] +RSInterface 391 - [41: Wood] +RSInterface 391 - [60: Fishing] +RSInterface 391 - [80: Idle] +RSInterface 391 - [93: 500,000] +RSInterface 391 - [94: Deposit] +RSInterface 391 - [95: Withdraw] +RSInterface 391 - [100: Help] +RSInterface 391 - [111: Cooked] +RSInterface 391 - [131: Mahogany] +RSInterface 391 - [132: Teak] +RSInterface 391 - [133: Both] +RSInterface 391 - [134: Hardwood] +RSInterface 391 - [142: Farm] +RSInterface 391 - [156: Herbs] +RSInterface 391 - [158: Flax] +RSInterface 392 - [2: Resources Collected] +RSInterface 393 - [0: A] +RSInterface 393 - [1: B] +RSInterface 393 - [2: C] +RSInterface 393 - [3: D] +RSInterface 393 - [4: E] +RSInterface 393 - [5: F] +RSInterface 393 - [6: G] +RSInterface 393 - [7: H] +RSInterface 393 - [8: I] +RSInterface 393 - [9: J] +RSInterface 393 - [10: K] +RSInterface 393 - [11: L] +RSInterface 393 - [12: M] +RSInterface 393 - [13: N] +RSInterface 393 - [14: O] +RSInterface 393 - [15: P] +RSInterface 393 - [16: Q] +RSInterface 393 - [17: R] +RSInterface 393 - [18: S] +RSInterface 393 - [19: T] +RSInterface 393 - [20: U] +RSInterface 393 - [21: V] +RSInterface 393 - [22: W] +RSInterface 393 - [23: X] +RSInterface 393 - [24: Y] +RSInterface 393 - [25: Z] +RSInterface 393 - [27: GUESS] +RSInterface 393 - [29: __________] +RSInterface 393 - [30: Enter up to five letters in any order then click 'guess' again.] +RSInterface 394 - [89: Furniture Creation Menu] +RSInterface 394 - [90: Select a piece of furniture to build.] +RSInterface 394 - [91: Wooden Chair] +RSInterface 394 - [92: 5 Wood] +RSInterface 394 - [93: 2 Oak] +RSInterface 394 - [94: 2 Oak] +RSInterface 394 - [95: 2 Oak] +RSInterface 394 - [96: Wooden Chair] +RSInterface 394 - [97: 5 Wood] +RSInterface 394 - [98: 2 Oak] +RSInterface 394 - [99: 2 Oak] +RSInterface 394 - [100: 2 Oak] +RSInterface 394 - [101: Wooden Chair] +RSInterface 394 - [102: 5 Wood] +RSInterface 394 - [103: 2 Oak] +RSInterface 394 - [104: 2 Oak] +RSInterface 394 - [105: 2 Oak] +RSInterface 394 - [110: Level] +RSInterface 394 - [111: Level] +RSInterface 394 - [112: Level] +RSInterface 395 - [0: Line1] +RSInterface 395 - [1: Line2] +RSInterface 395 - [2: Click here to continue] +RSInterface 396 - [95: Select a piece of furniture to build. ] +RSInterface 396 - [97: Wooden Chair] +RSInterface 396 - [98: 5 Wood] +RSInterface 396 - [99: 2 Oak] +RSInterface 396 - [100: 2 Oak] +RSInterface 396 - [101: 2 Oak] +RSInterface 396 - [102: Wooden Chair] +RSInterface 396 - [103: 5 Wood] +RSInterface 396 - [104: 2 Oak] +RSInterface 396 - [105: 2 Oak] +RSInterface 396 - [106: 2 Oak] +RSInterface 396 - [107: Wooden Chair] +RSInterface 396 - [108: 5 Wood] +RSInterface 396 - [109: 2 Oak] +RSInterface 396 - [110: 2 Oak] +RSInterface 396 - [111: 2 Oak] +RSInterface 396 - [112: Wooden Chair] +RSInterface 396 - [113: 5 Wood] +RSInterface 396 - [114: 2 Oak] +RSInterface 396 - [115: 2 Oak] +RSInterface 396 - [116: 2 Oak] +RSInterface 396 - [117: Wooden Chair] +RSInterface 396 - [118: 5 Wood] +RSInterface 396 - [119: 2 Oak] +RSInterface 396 - [120: 2 Oak] +RSInterface 396 - [121: 2 Oak] +RSInterface 396 - [122: Wooden Chair] +RSInterface 396 - [123: 5 Wood] +RSInterface 396 - [124: 2 Oak] +RSInterface 396 - [125: 2 Oak] +RSInterface 396 - [126: 2 Oak] +RSInterface 396 - [127: Wooden Chair] +RSInterface 396 - [128: 5 Wood] +RSInterface 396 - [129: 2 Oak] +RSInterface 396 - [130: 2 Oak] +RSInterface 396 - [131: 2 Oak] +RSInterface 396 - [140: Level] +RSInterface 396 - [141: Level] +RSInterface 396 - [142: Level] +RSInterface 396 - [143: Level] +RSInterface 396 - [144: Level] +RSInterface 396 - [145: Level] +RSInterface 396 - [146: Level] +RSInterface 397 - [88: Armchairs] +RSInterface 397 - [89: Bookcases] +RSInterface 397 - [90: Beer Barrels] +RSInterface 397 - [91: Kitchen Tables] +RSInterface 397 - [92: Dining Tables] +RSInterface 397 - [93: Dining Benches] +RSInterface 397 - [94: Beds] +RSInterface 397 - [95: Dressers] +RSInterface 397 - [96: Wardrobes] +RSInterface 397 - [97: Clocks] +RSInterface 397 - [98: Cape Racks] +RSInterface 397 - [99: Magic Wardrobes] +RSInterface 397 - [100: Armour cases ] +RSInterface 397 - [101: Treasure trail chests] +RSInterface 397 - [102: Fancy dress boxes ] +RSInterface 397 - [103: Toy boxes ] +RSInterface 397 - [128: Select a piece of furniture to build] +RSInterface 397 - [133: Furniture Creation Menu] +RSInterface 398 - [2: Off] +RSInterface 398 - [7: House Options] +RSInterface 398 - [16: Leave House] +RSInterface 398 - [17: Building Mode] +RSInterface 398 - [18: Expel Guests] +RSInterface 398 - [19: On] +RSInterface 398 - [20: Number Of Rooms: %1] +RSInterface 399 - [1: There's no place like home...] +RSInterface 401 - [3: PLAYER ] +RSInterface 401 - [4: SHOTS] +RSInterface 401 - [5: SCORE] +RSInterface 401 - [6: -] +RSInterface 401 - [7: -] +RSInterface 401 - [8: -] +RSInterface 401 - [9: -] +RSInterface 401 - [10: -] +RSInterface 401 - [11: -] +RSInterface 401 - [12: -] +RSInterface 401 - [13: -] +RSInterface 401 - [14: -] +RSInterface 401 - [15: -] +RSInterface 401 - [16: -] +RSInterface 401 - [17: -] +RSInterface 402 - [67: Room Creation Menu] +RSInterface 402 - [108: Parlour: Lvl 1] +RSInterface 402 - [109: Garden: Lvl 1] +RSInterface 402 - [110: Kitchen: Lvl 5] +RSInterface 402 - [111: Dining room: Lvl 10] +RSInterface 402 - [112: Workshop: Lvl 15] +RSInterface 402 - [113: Bedroom: Lvl 20] +RSInterface 402 - [114: Hall - Skill trophies: Lvl 25] +RSInterface 402 - [115: Games room: Lvl 30] +RSInterface 402 - [116: Combat room: Lvl 32] +RSInterface 402 - [117: Hall - Quest trophies: Lvl 35] +RSInterface 402 - [118: Study: Lvl 40] +RSInterface 402 - [119: Costume room: Lvl 42] +RSInterface 402 - [120: Chapel: Lvl 45] +RSInterface 402 - [121: Portal chamber: Lvl 50] +RSInterface 402 - [122: Formal garden: Lvl 55] +RSInterface 402 - [123: Throne room: Lvl 60] +RSInterface 402 - [124: Oubliette: Lvl 65] +RSInterface 402 - [125: Dungeon - Corridor: Lvl 70] +RSInterface 402 - [126: Dungeon - Junction: Lvl 70] +RSInterface 402 - [127: Dungeon - Stairs: Lvl 70] +RSInterface 402 - [137: Select a room to build] +RSInterface 402 - [138: 1000 coins] +RSInterface 402 - [139: 1000 coins] +RSInterface 402 - [140: 5000 coins] +RSInterface 402 - [141: 5000 coins] +RSInterface 402 - [142: 10000 coins] +RSInterface 402 - [143: 10000 coins] +RSInterface 402 - [144: 15000 coins] +RSInterface 402 - [145: 25000 coins] +RSInterface 402 - [146: 25000 coins] +RSInterface 402 - [147: 25000 coins] +RSInterface 402 - [148: 50000 coins] +RSInterface 402 - [149: 50000 coins] +RSInterface 402 - [150: 50000 coins] +RSInterface 402 - [151: 100000 coins] +RSInterface 402 - [152: 75000 coins] +RSInterface 402 - [153: 150000 coins] +RSInterface 402 - [154: 150000 coins] +RSInterface 402 - [155: 7500 coins] +RSInterface 402 - [156: 7500 coins] +RSInterface 402 - [157: 7500 coins] +RSInterface 402 - [158: Treasure room: Lvl 75] +RSInterface 402 - [159: 250000 coins] +RSInterface 403 - [88: What wood do you want converting to planks?] +RSInterface 403 - [97: Wood
Cost = 100] +RSInterface 403 - [98: Oak
Cost = 250 ] +RSInterface 403 - [99: Teak
Cost = 500] +RSInterface 403 - [100: Mahogany
Cost = 1500] +RSInterface 405 - [2: Message of the week] +RSInterface 406 - [6: Cancel] +RSInterface 407 - [11: Next Departure: 5 min] +RSInterface 407 - [12: Players Ready: 5] +RSInterface 407 - [13: (Need 5 to 25 players)] +RSInterface 407 - [14: Points:pest_points] +RSInterface 408 - [0: %1 Min] +RSInterface 408 - [1: %100] +RSInterface 408 - [11: 0] +RSInterface 408 - [13: 100] +RSInterface 408 - [14: 100] +RSInterface 408 - [15: 100] +RSInterface 408 - [16: 100] +RSInterface 408 - [25: W] +RSInterface 408 - [26: E] +RSInterface 408 - [27: SE] +RSInterface 409 - [6: Choose a tool to use on each of the moving parts.] +RSInterface 410 - [5: Spiky ball. Use stab defence.] +RSInterface 410 - [6: Anvil. Use blunt defence.] +RSInterface 410 - [7: Slashing blades. Use slash defence.] +RSInterface 410 - [8: Magic missile. Use magic defence.] +RSInterface 410 - [9: Catapult Defence Game Key] +RSInterface 411 - [9: Use stab defence] +RSInterface 411 - [10: Use blunt defence] +RSInterface 411 - [11: Use slash defence] +RSInterface 411 - [12: Use magic defence] +RSInterface 412 - [1: Attack Dummy Key] +RSInterface 412 - [9: Accurate] +RSInterface 412 - [10: Slash] +RSInterface 412 - [11: Aggressive] +RSInterface 412 - [12: Controlled] +RSInterface 412 - [13: Crush] +RSInterface 412 - [14: Stab] +RSInterface 412 - [15: Defensive ] +RSInterface 412 - [16:

These are the types
of attack to use on
each of the dummies
that pop up from
the floor.

You will find that you
need more than one
weapon to be
successful.] +RSInterface 414 - [19: Congratulations! Your team won!] +RSInterface 414 - [20: The final score was:] +RSInterface 414 - [21: You were awarded 999 Pieces of Eight!] +RSInterface 414 - [22: 99] +RSInterface 414 - [23: 99] +RSInterface 414 - [24: :] +RSInterface 415 - [4: 0] +RSInterface 415 - [5: 0] +RSInterface 415 - [6: 0] +RSInterface 415 - [44: 0] +RSInterface 415 - [45: 0] +RSInterface 415 - [58: 0] +RSInterface 415 - [59: 0] +RSInterface 415 - [60: 0] +RSInterface 415 - [61: 0] +RSInterface 415 - [62: 0] +RSInterface 415 - [63: 0] +RSInterface 415 - [64: 0] +RSInterface 415 - [65: 0] +RSInterface 415 - [66: Current Score] +RSInterface 416 - [11: Bridge Section] +RSInterface 416 - [14: Pipe Section] +RSInterface 416 - [17: Wooden Planks] +RSInterface 417 - [12: Bamboo pipe] +RSInterface 417 - [13: Bridge section] +RSInterface 417 - [14: Bucket] +RSInterface 417 - [15: Torch] +RSInterface 417 - [16: Lumber patch] +RSInterface 417 - [17: Bowl] +RSInterface 417 - [18: Tinderbox] +RSInterface 417 - [19: Meat] +RSInterface 417 - [20: Knife] +RSInterface 417 - [21: Axe] +RSInterface 417 - [22: 0] +RSInterface 417 - [23: 0] +RSInterface 417 - [24: 0] +RSInterface 418 - [2: 0] +RSInterface 418 - [3: 0] +RSInterface 418 - [4: Next Game In :] +RSInterface 419 - [1: Ahoy, what would ye like to be sewn together matey?] +RSInterface 419 - [18: Blue
Bandana] +RSInterface 419 - [19: Brown
Bandana] +RSInterface 419 - [20: Hat & Patch] +RSInterface 419 - [21: Hook & Claw] +RSInterface 419 - [22: Red
Bandana] +RSInterface 419 - [23: White
Bandana] +RSInterface 419 - [24: Cavalier & Highwayman Mask] +RSInterface 419 - [25: Beret & Mime Mask] +RSInterface 420 - [23: EXAMPLE] +RSInterface 421 - [1: Line1] +RSInterface 421 - [2: Line2] +RSInterface 421 - [3: Line3] +RSInterface 421 - [4: Line4] +RSInterface 421 - [5: Line5] +RSInterface 421 - [6: Line6] +RSInterface 421 - [7: Line7] +RSInterface 421 - [8: Line8] +RSInterface 421 - [9: Line9] +RSInterface 421 - [10: Line10] +RSInterface 421 - [11: Line11] +RSInterface 423 - [1: Certificate of Advanced Healing] +RSInterface 423 - [2: From PoxStead College.] +RSInterface 423 - [3: Signed Dr Foster-MMD, PRD
Head of
Magical Healing.] +RSInterface 425 - [1: COSMIC
RUNEe
ALTAR] +RSInterface 427 - [1: I (insert full name here) do hereby swear fealty ] +RSInterface 427 - [2: and indebtedness to the Fairy Godfather until] +RSInterface 427 - [3: such time as he releases me from my bond.] +RSInterface 427 - [5: Signed] +RSInterface 427 - [7: (insert full name and date here)] +RSInterface 428 - [1: Room %1 of 8
Thieving level required: %2] +RSInterface 429 - [86: Honest
Jimmy] +RSInterface 429 - [87: Bert the
Sandman] +RSInterface 429 - [88: Advisor
Ghrim] +RSInterface 429 - [89: Turael] +RSInterface 429 - [90: Lanthus] +RSInterface 429 - [91: Mazchna] +RSInterface 429 - [92: Duradel] +RSInterface 429 - [93: Vannaka] +RSInterface 429 - [94: Murphy] +RSInterface 429 - [95: Chaeldar] +RSInterface 429 - [96: Cyrisus] +RSInterface 429 - [97: Random] +RSInterface 431 - [2: Pirates'
Cove] +RSInterface 431 - [3: Moonclan
Island] +RSInterface 432 - [13: Enchant Crossbow Bolt] +RSInterface 432 - [15: Magic 4] +RSInterface 432 - [16: Opal] +RSInterface 432 - [19: Jade] +RSInterface 432 - [20: Magic 14] +RSInterface 432 - [23: Pearl] +RSInterface 432 - [24: Magic 24] +RSInterface 432 - [27: Magic 29] +RSInterface 432 - [30: Magic 7] +RSInterface 432 - [33: Magic 27] +RSInterface 432 - [36: Magic 49] +RSInterface 432 - [39: Magic 57] +RSInterface 432 - [42: Magic 68] +RSInterface 432 - [45: Magic 87] +RSInterface 432 - [47: %1/1] +RSInterface 432 - [49: %1/1] +RSInterface 432 - [51: %1/1] +RSInterface 432 - [53: %1/1] +RSInterface 432 - [55: %1/1] +RSInterface 432 - [57: %1/1] +RSInterface 432 - [59: %1/1] +RSInterface 432 - [61: %1/1] +RSInterface 432 - [63: %1/1] +RSInterface 432 - [65: %1/1] +RSInterface 432 - [68: %1/2] +RSInterface 432 - [70: %1/15] +RSInterface 432 - [72: %1/2] +RSInterface 432 - [74: %1/2] +RSInterface 432 - [76: %1/2] +RSInterface 432 - [78: %1/1] +RSInterface 432 - [80: %1/1] +RSInterface 432 - [82: %1/1] +RSInterface 432 - [84: %1/5] +RSInterface 432 - [86: %1/3] +RSInterface 432 - [88: %1/2] +RSInterface 432 - [90: %1/1] +RSInterface 432 - [92: %1/1] +RSInterface 432 - [94: %1/1] +RSInterface 432 - [95: Click on the bolts to enchant a maximum of 10.] +RSInterface 432 - [96: Red Topaz] +RSInterface 432 - [97: Sapphire] +RSInterface 432 - [98: Emerald] +RSInterface 432 - [99: Ruby] +RSInterface 432 - [100: Diamond] +RSInterface 432 - [101: Dragonstone] +RSInterface 432 - [102: Onyx] +RSInterface 432 - [104: %1/10] +RSInterface 433 - [20: %1] +RSInterface 433 - [21: %1] +RSInterface 433 - [22: %1] +RSInterface 433 - [23: %1] +RSInterface 433 - [24: 0] +RSInterface 433 - [25: Text] +RSInterface 433 - [26: Text] +RSInterface 433 - [27: Text] +RSInterface 433 - [28: Text] +RSInterface 433 - [29: Text] +RSInterface 433 - [30: Crossbow Bolt Pouch] +RSInterface 433 - [31: Current Ammo] +RSInterface 434 - [90: Gnome Battas] +RSInterface 434 - [96: %1/4] +RSInterface 434 - [97: %1/1] +RSInterface 434 - [98: %1/1] +RSInterface 434 - [99: %1/1] +RSInterface 434 - [100: Fruit Batta] +RSInterface 434 - [107: %1/1] +RSInterface 434 - [108: %1/1] +RSInterface 434 - [109: %1/1] +RSInterface 434 - [110: %1/1] +RSInterface 434 - [111: Toad Batta] +RSInterface 434 - [117: %1/1] +RSInterface 434 - [118: %1/1] +RSInterface 434 - [119: %1/1] +RSInterface 434 - [120: Worm Batta] +RSInterface 434 - [128: %1/2] +RSInterface 434 - [129: %1/1] +RSInterface 434 - [130: %1/1] +RSInterface 434 - [131: %1/1] +RSInterface 434 - [132: %1/1] +RSInterface 434 - [133: Vegetable Batta] +RSInterface 434 - [138: %1/1] +RSInterface 434 - [139: %1/1] +RSInterface 434 - [140: Cheese And Tomato Batta] +RSInterface 434 - [142: level 25] +RSInterface 434 - [143: level 26] +RSInterface 434 - [144: level 27] +RSInterface 434 - [145: level 29] +RSInterface 434 - [146: level 28] +RSInterface 434 - [147: Fruit Batta] +RSInterface 434 - [148: Toad Batta] +RSInterface 434 - [149: Worm Batta] +RSInterface 434 - [150: Vegetable Batta] +RSInterface 434 - [151: Cheese & tomato Batta] +RSInterface 435 - [90: Gnome Bowls] +RSInterface 435 - [95: %1/4] +RSInterface 435 - [96: %1/2] +RSInterface 435 - [97: %1/1] +RSInterface 435 - [98: Worm Hole] +RSInterface 435 - [104: %1/2] +RSInterface 435 - [105: %1/2] +RSInterface 435 - [106: %1/1] +RSInterface 435 - [107: Vegetable Ball] +RSInterface 435 - [115: %1/4] +RSInterface 435 - [116: %1/2] +RSInterface 435 - [117: %1/2] +RSInterface 435 - [118: %1/1] +RSInterface 435 - [119: %1/1] +RSInterface 435 - [120: Tangled Toads Legs] +RSInterface 435 - [125: %1/4] +RSInterface 435 - [126: %1/1] +RSInterface 435 - [127: Chocolate Bomb] +RSInterface 435 - [129: level 30] +RSInterface 435 - [130: level 35] +RSInterface 435 - [131: level 40] +RSInterface 435 - [132: level 42] +RSInterface 435 - [133: Worm hole] +RSInterface 435 - [134: Vegetable ball] +RSInterface 435 - [135: Tangled Toads Legs] +RSInterface 435 - [136: Chocolate Bomb] +RSInterface 436 - [90: Gnome Cocktails] +RSInterface 436 - [97: %1/2] +RSInterface 436 - [98: %1/1] +RSInterface 436 - [99: %1/1] +RSInterface 436 - [100: %1/1] +RSInterface 436 - [101: %1/1] +RSInterface 436 - [102: Wizard Blizzard] +RSInterface 436 - [107: %1/1] +RSInterface 436 - [108: %1/3] +RSInterface 436 - [109: Short Green Guy] +RSInterface 436 - [115: %1/1] +RSInterface 436 - [116: %1/1] +RSInterface 436 - [117: %1/1] +RSInterface 436 - [118: Fruit Blast] +RSInterface 436 - [124: %1/2] +RSInterface 436 - [125: %1/1] +RSInterface 436 - [126: %1/1] +RSInterface 436 - [127: Pineapple Punch] +RSInterface 436 - [133: %1/1] +RSInterface 436 - [134: %1/1] +RSInterface 436 - [135: %1/1] +RSInterface 436 - [136: Drunk Dragon] +RSInterface 436 - [143: %1/1] +RSInterface 436 - [144: %1/1] +RSInterface 436 - [145: %1/1] +RSInterface 436 - [146: %1/1] +RSInterface 436 - [147: Chocolate Saturday] +RSInterface 436 - [155: %1/1] +RSInterface 436 - [156: %1/1] +RSInterface 436 - [157: %1/1] +RSInterface 436 - [158: %1/1] +RSInterface 436 - [159: Blurberry Special] +RSInterface 436 - [160: %1/2] +RSInterface 436 - [162: level 6] +RSInterface 436 - [163: level 8] +RSInterface 436 - [164: level 18] +RSInterface 436 - [165: level 20] +RSInterface 436 - [166: level 33] +RSInterface 436 - [167: level 37] +RSInterface 436 - [168: level 32] +RSInterface 436 - [169: Wizard Blizzard] +RSInterface 436 - [170: Short Green Guy] +RSInterface 436 - [171: Fruit Blast] +RSInterface 436 - [172: Pineapple Punch] +RSInterface 436 - [173: Drunk Dragon] +RSInterface 436 - [174: Chocolate Saturday] +RSInterface 436 - [175: Blurberry Special] +RSInterface 437 - [90: Gnome Crunchies] +RSInterface 437 - [94: %1/2] +RSInterface 437 - [95: %1/1] +RSInterface 437 - [96: Toad Crunchies] +RSInterface 437 - [101: %1/1] +RSInterface 437 - [102: %1/2] +RSInterface 437 - [103: Spice Crunchies] +RSInterface 437 - [109: %1/1] +RSInterface 437 - [110: %1/2] +RSInterface 437 - [111: %1/1] +RSInterface 437 - [112: Worm Crunchies] +RSInterface 437 - [117: %1/2] +RSInterface 437 - [118: %1/1] +RSInterface 437 - [119: Chocolate Chip Crunchies] +RSInterface 437 - [121: level 10] +RSInterface 437 - [122: level 12] +RSInterface 437 - [123: level 14] +RSInterface 437 - [124: level 16] +RSInterface 437 - [125: Toad crunchies] +RSInterface 437 - [126: Spice crunchies] +RSInterface 437 - [127: Worm crunchies] +RSInterface 437 - [128: Choc chip crunchies] +RSInterface 440 - [3: Certificate of Qualification] +RSInterface 440 - [4: Earth Sciences Level 1
This is to certify that] +RSInterface 440 - [5: ] +RSInterface 440 - [6: has passed the Level 1
Earth Sciences exam.] +RSInterface 441 - [3: Certificate of Qualification] +RSInterface 441 - [4: Earth Sciences Level 2
This is to certify that] +RSInterface 441 - [5: ] +RSInterface 441 - [6: has passed the Level 2
Earth Sciences exam.] +RSInterface 444 - [3: Certificate of Qualification] +RSInterface 444 - [4: Earth Sciences Level 3
This is to certify that] +RSInterface 444 - [5: ] +RSInterface 444 - [6: has passed the Level 3
Earth Sciences exam.] +RSInterface 451 - [0: Select an Option] +RSInterface 451 - [1: option1] +RSInterface 451 - [2: option2] +RSInterface 451 - [3: option3] +RSInterface 458 - [0: Select an Option] +RSInterface 458 - [1: option1] +RSInterface 458 - [2: option2] +RSInterface 458 - [3: option3] +RSInterface 461 - [7: Island] +RSInterface 461 - [8: Witchaven] +RSInterface 461 - [9: Fishing Platform] +RSInterface 462 - [18: Piece 1] +RSInterface 462 - [19: Piece 2] +RSInterface 462 - [20: Piece 3] +RSInterface 462 - [21: Show/Select] +RSInterface 465 - [2: Varrock Herald] +RSInterface 465 - [3: Covering all of Misthalin and beyond.] +RSInterface 465 - [4: 1 gp] +RSInterface 465 - [5: Oo'glog Ogresses Open Health Spa!] +RSInterface 468 - [7: Diango Item Return] +RSInterface 469 - [3: Castle] +RSInterface 469 - [4: Wars] +RSInterface 469 - [5: Grand] +RSInterface 469 - [6: Tree] +RSInterface 469 - [7: Varrock] +RSInterface 469 - [8: Entrana] +RSInterface 469 - [9: Taverley] +RSInterface 469 - [10: Crafting] +RSInterface 469 - [11: Guild] +RSInterface 469 - [22: Crafting] +RSInterface 469 - [23: Guild] +RSInterface 469 - [25: Varrock] +RSInterface 469 - [28: Taverley] +RSInterface 469 - [30: Entrana] +RSInterface 469 - [32: Grand] +RSInterface 469 - [33: Tree] +RSInterface 469 - [35: Castle] +RSInterface 469 - [36: Wars] +RSInterface 471 - [5: X] +RSInterface 471 - [6: X] +RSInterface 471 - [7: %1] +RSInterface 471 - [8: %1] +RSInterface 471 - [10: Relax] +RSInterface 471 - [24: Balloon Controls] +RSInterface 471 - [25: Bail ] +RSInterface 471 - [27: Move down.] +RSInterface 471 - [28: Move down more.] +RSInterface 471 - [29: Sandbags left.] +RSInterface 471 - [30: Logs left.] +RSInterface 471 - [31: Move up.] +RSInterface 471 - [32: Move up more.] +RSInterface 471 - [33: We're doomed.] +RSInterface 473 - [0: %1] +RSInterface 473 - [22: S P E C I A L A T T A C K] +RSInterface 473 - [23: Combat Lvl: %1] +RSInterface 473 - [25: Auto Retaliate
(Off)] +RSInterface 473 - [26: Short fuse] +RSInterface 473 - [27: Medium fuse] +RSInterface 473 - [28: Long fuse] +RSInterface 473 - [29: (Short fuse)
(Ranged XP)] +RSInterface 473 - [30: (Medium fuse)
(Ranged XP)] +RSInterface 473 - [31: (Long fuse)
(Ranged XP)
(Defence XP)] +RSInterface 473 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 474 - [0: %1] +RSInterface 474 - [22: S P E C I A L A T T A C K] +RSInterface 474 - [23: Combat Lvl: %1] +RSInterface 474 - [25: Scorch] +RSInterface 474 - [26: Flare] +RSInterface 474 - [27: Blaze] +RSInterface 474 - [28: Auto Retaliate
(Off)] +RSInterface 474 - [29: (Aggressive)
(Slash)
(Strength XP)] +RSInterface 474 - [30: (Accurate)
(Ranged)
(Ranged XP)] +RSInterface 474 - [31: (Defensive)
(Magic)
(Magic XP)] +RSInterface 474 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 475 - [0: %1] +RSInterface 475 - [22: S P E C I A L A T T A C K] +RSInterface 475 - [23: Combat Lvl: %1] +RSInterface 475 - [25: Short fuse] +RSInterface 475 - [26: Medium fuse] +RSInterface 475 - [27: Long fuse] +RSInterface 475 - [28: Auto Retaliate
(Off)] +RSInterface 475 - [29: (Short fuse)
(Ranged XP)] +RSInterface 475 - [30: (Medium fuse)
(Ranged XP)] +RSInterface 475 - [31: (Long fuse)
(Ranged XP)
(Defence XP)] +RSInterface 475 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 476 - [0: %1] +RSInterface 476 - [22: S P E C I A L A T T A C K] +RSInterface 476 - [23: Combat Lvl: %1] +RSInterface 476 - [25: Melee] +RSInterface 476 - [26: Ranged] +RSInterface 476 - [27: Magic] +RSInterface 476 - [28: Auto Retaliate
(Off)] +RSInterface 476 - [29: (Melee)
(Attack XP)] +RSInterface 476 - [30: (Ranged)
(Attack XP)] +RSInterface 476 - [31: (Magic)
(Defence XP)] +RSInterface 476 - [32: When active your player
will automatically fight
back if attacked] +RSInterface 477 - [76: Custom Fur Clothing] +RSInterface 477 - [77: Right-click an item in the shop to have it made for you.] +RSInterface 477 - [91: Larupia] +RSInterface 477 - [92: Graahk] +RSInterface 477 - [93: Kyatt ] +RSInterface 477 - [94: Polar kebbit] +RSInterface 477 - [95: Common kebbit] +RSInterface 477 - [96: Feldip weasel] +RSInterface 477 - [97: Desert devil] +RSInterface 477 - [98: Dark kebbit] +RSInterface 477 - [99: Spotted kebbit] +RSInterface 477 - [100: Dashing kebbit] +RSInterface 478 - [60: Imp Release Negotiation Form] +RSInterface 478 - [62: Select an item or stack of items to deposit.
You can deposit up to 2 items or stacks.] +RSInterface 484 - [1: Attacker :] +RSInterface 484 - [2: Defender :] +RSInterface 484 - [3: Collector :] +RSInterface 484 - [4: Healer :] +RSInterface 484 - [5: ----------------------] +RSInterface 484 - [6: ----------------------] +RSInterface 484 - [7: ----------------------] +RSInterface 484 - [8: ----------------------] +RSInterface 484 - [13: Red] +RSInterface 484 - [14: Green] +RSInterface 484 - [15: Blue] +RSInterface 484 - [16: Controlled/Bronze/Wind] +RSInterface 484 - [17: Accurate/Iron/Water] +RSInterface 484 - [18: Aggressive/Steel/Earth] +RSInterface 484 - [19: Defensive/Mithril/Fire] +RSInterface 484 - [20: Tofu] +RSInterface 484 - [21: Worms] +RSInterface 484 - [22: Crackers] +RSInterface 484 - [23: Poison tofu] +RSInterface 484 - [24: Poison worms] +RSInterface 484 - [25: Poison meat] +RSInterface 484 - [26: Horn of Glory] +RSInterface 485 - [1: Wave 1] +RSInterface 485 - [3: Controlled/] +RSInterface 485 - [4: Bronze/Wind] +RSInterface 485 - [6: Green eggs] +RSInterface 486 - [1: Wave 1] +RSInterface 486 - [3: Red eggs] +RSInterface 486 - [5: Style 1] +RSInterface 487 - [1: Wave 1] +RSInterface 487 - [3: Tofu] +RSInterface 487 - [5: Poison meat] +RSInterface 488 - [1: Wave 1] +RSInterface 488 - [3: Poison tofu] +RSInterface 488 - [5: Tofu] +RSInterface 488 - [7: Defender] +RSInterface 488 - [10: Alex] +RSInterface 488 - [11: HP 50/78] +RSInterface 488 - [18: Tim] +RSInterface 488 - [19: HP 88/88] +RSInterface 488 - [24: Matt] +RSInterface 488 - [25: HP 24/54] +RSInterface 488 - [30: Martin] +RSInterface 488 - [31: HP 61/62] +RSInterface 489 - [0: # Players in room:] +RSInterface 489 - [1: Attackers:] +RSInterface 489 - [2: Defenders:] +RSInterface 489 - [3: Collectors:] +RSInterface 489 - [4: Healers:] +RSInterface 489 - [5: Any:] +RSInterface 489 - [6: 0] +RSInterface 489 - [7: 0] +RSInterface 489 - [8: 0] +RSInterface 489 - [9: 0] +RSInterface 489 - [10: 0] +RSInterface 490 - [2: Player status for:] +RSInterface 490 - [3: Role] +RSInterface 490 - [4: Current honour points] +RSInterface 490 - [5: Attacker] +RSInterface 490 - [6: Healer] +RSInterface 490 - [7: Defender] +RSInterface 490 - [8: Collector] +RSInterface 490 - [9: Points for next level] +RSInterface 490 - [10: 0] +RSInterface 490 - [11: 0] +RSInterface 490 - [12: 0] +RSInterface 490 - [13: 0] +RSInterface 490 - [14: Level] +RSInterface 490 - [15: 0] +RSInterface 490 - [16: 0] +RSInterface 490 - [17: 0] +RSInterface 490 - [18: 0] +RSInterface 490 - [19: null] +RSInterface 490 - [20: 0] +RSInterface 490 - [21: 0] +RSInterface 490 - [22: 0] +RSInterface 490 - [23: 0] +RSInterface 490 - [24: Current wave :] +RSInterface 490 - [25: 0] +RSInterface 490 - [26: Reward next level] +RSInterface 490 - [27: -----------] +RSInterface 490 - [28: -----------] +RSInterface 490 - [29: -----------] +RSInterface 490 - [30: -----------] +RSInterface 491 - [78: Barbarian Assault Reward Shop] +RSInterface 491 - [82: Attacker level up to 2] +RSInterface 491 - [83: 100 Attacker points] +RSInterface 491 - [85: +2 bonus damage] +RSInterface 491 - [91: Collector level up to 2] +RSInterface 491 - [92: 100 Collector points] +RSInterface 491 - [94: Bag stores 4] +RSInterface 491 - [98: Defender level up to 2] +RSInterface 491 - [99: 100 Defender points] +RSInterface 491 - [101: Lure range 5] +RSInterface 491 - [105: Defender level up to 2] +RSInterface 491 - [106: 100 Healer points] +RSInterface 491 - [108: Class 2 healing] +RSInterface 491 - [112: Penance Fighter hat] +RSInterface 491 - [113: 275 points in each role] +RSInterface 491 - [115: Requires Defence 45] +RSInterface 491 - [119: Penance Ranger hat] +RSInterface 491 - [120: 275 points in each role] +RSInterface 491 - [122: Requires Defence 45] +RSInterface 491 - [126: Penance Runner hat] +RSInterface 491 - [127: 275 points in each role] +RSInterface 491 - [129: Requires Defence 45] +RSInterface 491 - [133: Penance Healer hat] +RSInterface 491 - [134: 275 points in each role] +RSInterface 491 - [136: Requires Defence 45] +RSInterface 491 - [140: Penance torso] +RSInterface 491 - [141: 375 points in each role] +RSInterface 491 - [143: Requires Defence 40] +RSInterface 491 - [147: Penance skirt] +RSInterface 491 - [148: 375 points in each role] +RSInterface 491 - [150: Requires Defence 40] +RSInterface 491 - [154: Penance boots] +RSInterface 491 - [155: 100 points in each role] +RSInterface 491 - [157: Requires Defence 40] +RSInterface 491 - [161: Penance gloves] +RSInterface 491 - [162: 150 points in each role] +RSInterface 491 - [164: Requires Defence 40] +RSInterface 491 - [168: Granite body] +RSInterface 491 - [169: 95,000 coins] +RSInterface 491 - [171: Requires Defence 50] +RSInterface 491 - [175: Gamble points - low items] +RSInterface 491 - [176: 200 points (any role)] +RSInterface 491 - [178: Receive a random item] +RSInterface 491 - [182: Gamble points - medium items] +RSInterface 491 - [183: 400 points (any role)] +RSInterface 491 - [185: Receive a random item] +RSInterface 491 - [189: Gamble points - high items] +RSInterface 491 - [190: 500 points (any role)] +RSInterface 491 - [192: Receive a random item] +RSInterface 491 - [210: Select your reward] +RSInterface 491 - [213: Accept] +RSInterface 491 - [215: Attacker Honour Points:] +RSInterface 491 - [216: Defender Honour Points:] +RSInterface 491 - [217: Collector Honour Points:] +RSInterface 491 - [218: Healer Honour Points:] +RSInterface 491 - [219: 999] +RSInterface 491 - [220: 999] +RSInterface 491 - [221: 999] +RSInterface 491 - [222: 999] +RSInterface 491 - [223: Kill Queen] +RSInterface 491 - [224: Kill Queen] +RSInterface 491 - [225: Kill Queen] +RSInterface 491 - [226: Kill Queen] +RSInterface 491 - [227: Kill Queen] +RSInterface 491 - [228: Kill Queen] +RSInterface 491 - [229: Kill Queen] +RSInterface 492 - [2: Player 1 Interface Screen] +RSInterface 492 - [3: Decline] +RSInterface 492 - [5: Accept] +RSInterface 492 - [6: Player 2 selected role:] +RSInterface 492 - [7: Waiting ...] +RSInterface 492 - [8: The team:] +RSInterface 492 - [9: Name] +RSInterface 492 - [10: Role] +RSInterface 492 - [11: 1] +RSInterface 492 - [12: 2] +RSInterface 492 - [13: 3] +RSInterface 492 - [14: 4] +RSInterface 492 - [15: 5] +RSInterface 492 - [16: none set] +RSInterface 492 - [17: none set] +RSInterface 492 - [18: none set] +RSInterface 492 - [19: none set] +RSInterface 492 - [20: none set] +RSInterface 492 - [21: none set] +RSInterface 492 - [22: none set] +RSInterface 492 - [23: none set] +RSInterface 492 - [24: none set] +RSInterface 492 - [25: none set] +RSInterface 492 - [26: Wave] +RSInterface 492 - [27: 0] +RSInterface 492 - [31: Remove?] +RSInterface 492 - [32: 0] +RSInterface 492 - [33: 0] +RSInterface 492 - [34: 0] +RSInterface 492 - [35: 0] +RSInterface 492 - [46: Level in role:] +RSInterface 492 - [47: Waiting ...] +RSInterface 493 - [2: Player 2 Interface Screen] +RSInterface 493 - [3: Decline] +RSInterface 493 - [5: Attacker] +RSInterface 493 - [7: Defender] +RSInterface 493 - [8: Collector] +RSInterface 493 - [11: Healer] +RSInterface 493 - [13: Accept] +RSInterface 493 - [15: None] +RSInterface 493 - [16: Waiting for player 1 to accept...] +RSInterface 493 - [18: The team:] +RSInterface 493 - [19: Name] +RSInterface 493 - [20: Role] +RSInterface 493 - [21: --- Leader ---] +RSInterface 493 - [22: --- Followers ---] +RSInterface 493 - [23: none set] +RSInterface 493 - [24: none set] +RSInterface 493 - [25: none set] +RSInterface 493 - [26: none set] +RSInterface 493 - [27: none set] +RSInterface 493 - [28: none set] +RSInterface 493 - [29: none set] +RSInterface 493 - [30: none set] +RSInterface 493 - [31: none set] +RSInterface 493 - [32: none set] +RSInterface 493 - [33: Wave] +RSInterface 493 - [34: 0] +RSInterface 493 - [35: 0] +RSInterface 493 - [36: 0] +RSInterface 493 - [37: 0] +RSInterface 493 - [38: 0] +RSInterface 493 - [39: Please select a role!
Current Role:] +RSInterface 493 - [52: Name] +RSInterface 493 - [53: Role] +RSInterface 493 - [54: Name] +RSInterface 493 - [55: Role] +RSInterface 493 - [56: Name] +RSInterface 493 - [57: Role] +RSInterface 493 - [58: Name] +RSInterface 494 - [0: XX] +RSInterface 494 - [1: Time until next wave:] +RSInterface 495 - [4: Poison] +RSInterface 495 - [5: Explosive] +RSInterface 495 - [6: Stun] +RSInterface 495 - [11: Poison] +RSInterface 495 - [12: Explosive] +RSInterface 495 - [13: Stun] +RSInterface 495 - [18: Poison] +RSInterface 495 - [19: Explosive] +RSInterface 495 - [20: Stun] +RSInterface 495 - [25: Poison] +RSInterface 495 - [26: Explosive] +RSInterface 495 - [27: Stun] +RSInterface 495 - [30: Omega] +RSInterface 495 - [31: ##] +RSInterface 495 - [32: ##] +RSInterface 495 - [33: ##] +RSInterface 495 - [34: ##] +RSInterface 495 - [35: ##] +RSInterface 495 - [36: ##] +RSInterface 495 - [37: ##] +RSInterface 495 - [38: ##] +RSInterface 495 - [39: ##] +RSInterface 495 - [40: ##] +RSInterface 495 - [41: ##] +RSInterface 495 - [42: ##] +RSInterface 496 - [2: Tutorial Progress] +RSInterface 496 - [3: Introduction to the Arena] +RSInterface 496 - [4: Getting Started] +RSInterface 496 - [5: Playing the Game] +RSInterface 496 - [6: The Attacker Role] +RSInterface 496 - [7: The Defender Role] +RSInterface 496 - [8: The Collector Role] +RSInterface 496 - [9: The Healer Role] +RSInterface 496 - [10: Extra Information] +RSInterface 496 - [11: The Final Battle] +RSInterface 496 - [12: Rewards] +RSInterface 497 - [4: Wave Complete!] +RSInterface 497 - [5: Reward: ] +RSInterface 497 - [6: Runners that got past] +RSInterface 497 - [7: Rangers killed] +RSInterface 497 - [8: Fighters killed] +RSInterface 497 - [9: Healers killed] +RSInterface 497 - [10: Runners killed] +RSInterface 497 - [11: Player hitpoints replenished] +RSInterface 497 - [12: Wrong poison packs used] +RSInterface 497 - [13: Eggs collected (min. exploded)] +RSInterface 497 - [14: Failed Attacker attacks] +RSInterface 497 - [15: 0] +RSInterface 497 - [16: 0] +RSInterface 497 - [17: 0] +RSInterface 497 - [18: 0] +RSInterface 497 - [19: 0] +RSInterface 497 - [20: 0] +RSInterface 497 - [21: 0] +RSInterface 497 - [22: 0] +RSInterface 497 - [23: 0] +RSInterface 497 - [24: Total] +RSInterface 497 - [25: 0] +RSInterface 497 - [26: 0] +RSInterface 497 - [27: 0] +RSInterface 497 - [28: 0] +RSInterface 497 - [29: 0] +RSInterface 497 - [30: 0] +RSInterface 497 - [31: 0] +RSInterface 497 - [32: 0] +RSInterface 497 - [33: 0] +RSInterface 497 - [34: 0] +RSInterface 497 - [35: #] +RSInterface 497 - [36: Team Honour Points] +RSInterface 497 - [37: Role:] +RSInterface 497 - [38: None] +RSInterface 497 - [39: 0] +RSInterface 497 - [40: 0] +RSInterface 497 - [41: 0] +RSInterface 497 - [42: 0] +RSInterface 497 - [43: 0] +RSInterface 497 - [44: 0] +RSInterface 497 - [45: 0] +RSInterface 497 - [46: 0] +RSInterface 497 - [47: 0] +RSInterface 497 - [48: 0] +RSInterface 497 - [49: Honour Points reward :] +RSInterface 497 - [50: 0] +RSInterface 497 - [51: -] +RSInterface 497 - [52: -] +RSInterface 497 - [53: -] +RSInterface 497 - [54: -] +RSInterface 497 - [55: -] +RSInterface 497 - [56: -] +RSInterface 497 - [57: Total Honour Points in role:] +RSInterface 497 - [58: 0] +RSInterface 497 - [59: Individual Honour Points] +RSInterface 497 - [62: The Queen is dead!] +RSInterface 497 - [63: Reward:] +RSInterface 497 - [64: --Points output--] +RSInterface 497 - [65: -Role-] +RSInterface 497 - [66: Simple breakdown] +RSInterface 497 - [67: Honour Points Reward:] +RSInterface 497 - [68: 0] +RSInterface 497 - [69: 0] +RSInterface 497 - [71: Advanced Breakdown] +RSInterface 497 - [72: Total Honour Points in role:] +RSInterface 497 - [77: Level
up] +RSInterface 497 - [80: Level
up] +RSInterface 498 - [1: Kaleef

Your mission is to contact our agent inside Menaphos.
Use the tunnels beneath the temple of lesser gods.
Be vigilant of traps and the hostile natives.
They're about as welcoming as the Menaphites only slightly better looking.

Os] +RSInterface 499 - [6: Skill] +RSInterface 499 - [9: Description] +RSInterface 501 - [15: Cannon barrel] +RSInterface 501 - [18: Fuse] +RSInterface 501 - [21: Ramrod] +RSInterface 501 - [24: Cannonball] +RSInterface 501 - [27: Cannon cannister] +RSInterface 502 - [15: Rope] +RSInterface 502 - [18: Hammer] +RSInterface 502 - [21: Tack] +RSInterface 502 - [24: Plank] +RSInterface 502 - [27: Swamp paste] +RSInterface 503 - [3: Clockwork Toys - A Clockwork Mechanism, Chapter 1.0] +RSInterface 503 - [7: Making a clockwork toy is very simple and a good place to start for new crafters. Simply create a clockwork mechanism on your Crafting table, then use it and a wood plank to make a toy soldier or a doll. Wind them up and watch them go!] +RSInterface 503 - [8: Multi-rotation head for lifelike simulation] +RSInterface 503 - [9: A well-hidden clockwork system] +RSInterface 503 - [11: The clockwork mechanism.] +RSInterface 503 - [13: It would be simple to alter the design by adding a piece of silk to the wooden frame and clockwork mechanism. You could make a suit that could be controlled from the inside.] +RSInterface 505 - [3: Waterbirth
Island] +RSInterface 505 - [4: Miscellania] +RSInterface 505 - [5: Etceteria] +RSInterface 505 - [6: Rellekka] +RSInterface 505 - [7: Neitiznot & Jatizso] +RSInterface 506 - [5: Talk to puppet] +RSInterface 506 - [6: Jester Controls] +RSInterface 506 - [9: Dance] +RSInterface 506 - [12: Juggle] +RSInterface 506 - [15: Skip] +RSInterface 506 - [18: Pie] +RSInterface 506 - [21: Jig] +RSInterface 507 - [0: A] +RSInterface 507 - [1: B] +RSInterface 507 - [2: C] +RSInterface 507 - [3: D] +RSInterface 507 - [4: E] +RSInterface 507 - [5: F] +RSInterface 507 - [6: G] +RSInterface 507 - [7: H] +RSInterface 507 - [8: I] +RSInterface 507 - [9: J] +RSInterface 507 - [10: K] +RSInterface 507 - [11: L] +RSInterface 507 - [12: M] +RSInterface 507 - [13: N] +RSInterface 507 - [14: O] +RSInterface 507 - [15: P] +RSInterface 507 - [16: Q] +RSInterface 507 - [17: R] +RSInterface 507 - [18: S] +RSInterface 507 - [19: T] +RSInterface 507 - [20: U] +RSInterface 507 - [21: V] +RSInterface 507 - [22: W] +RSInterface 507 - [23: X] +RSInterface 507 - [24: Y] +RSInterface 507 - [25: Z] +RSInterface 507 - [26: ?] +RSInterface 507 - [27: ?] +RSInterface 507 - [28: ?] +RSInterface 507 - [29: ?] +RSInterface 507 - [31: GUESS] +RSInterface 507 - [33: __________] +RSInterface 507 - [34: Enter up to five letters in any order then click 'guess' again.] +RSInterface 508 - [7: The World of Magic] +RSInterface 508 - [8: The World of Logic] +RSInterface 509 - [36: Place bar] +RSInterface 509 - [47: Horizontal] +RSInterface 509 - [48: Vertical] +RSInterface 509 - [56: 1] +RSInterface 510 - [151: 1] +RSInterface 510 - [152: 2] +RSInterface 510 - [153: 3] +RSInterface 510 - [154: 4] +RSInterface 510 - [155: Use the valves] +RSInterface 510 - [156: and the levers to] +RSInterface 510 - [157: get the balls in] +RSInterface 510 - [158: the holes, and ] +RSInterface 510 - [159: then increase the] +RSInterface 510 - [160: pressure to fill] +RSInterface 518 - [79: Follower Inv] +RSInterface 518 - [80: %1] +RSInterface 518 - [81: Npc spaces left.] +RSInterface 518 - [82: %1] +RSInterface 518 - [83: %1] +RSInterface 518 - [84: %1] +RSInterface 518 - [87: %1] +RSInterface 518 - [88: %1] +RSInterface 518 - [89: %1] +RSInterface 518 - [90: %1] +RSInterface 518 - [91: %1] +RSInterface 518 - [92: %1] +RSInterface 518 - [93: %1] +RSInterface 518 - [94: %1] +RSInterface 518 - [95: %1] +RSInterface 518 - [96: %1] +RSInterface 518 - [97: %1] +RSInterface 518 - [98: %1] +RSInterface 518 - [99: %1] +RSInterface 518 - [100: %1] +RSInterface 518 - [101: %1] +RSInterface 518 - [102: %1] +RSInterface 518 - [118: Right click on items in your inventory to add them here, then click close.] +RSInterface 521 - [14: Guidance System] +RSInterface 521 - [31: 100%] +RSInterface 521 - [32: Health - ] +RSInterface 521 - [46: 100%] +RSInterface 521 - [47: Spirit - ] +RSInterface 521 - [57: 100%] +RSInterface 521 - [58: Armament - ] +RSInterface 521 - [79: --- Stat ---] +RSInterface 521 - [80: Information...] +RSInterface 522 - [0: Monster name] +RSInterface 522 - [1: Line1] +RSInterface 522 - [2: Line2] +RSInterface 522 - [3: Line3] +RSInterface 522 - [4: Line4] +RSInterface 523 - [1: 00] +RSInterface 523 - [2: 00] +RSInterface 523 - [3: /] +RSInterface 523 - [5: 00] +RSInterface 523 - [6: 00] +RSInterface 523 - [7: /] +RSInterface 523 - [9: 00] +RSInterface 523 - [10: 00] +RSInterface 523 - [11: /] +RSInterface 523 - [13: 00] +RSInterface 523 - [14: 00] +RSInterface 523 - [15: /] +RSInterface 523 - [17: 00] +RSInterface 523 - [18: 00] +RSInterface 523 - [19: /] +RSInterface 523 - [21: 00] +RSInterface 523 - [22: 00] +RSInterface 523 - [23: /] +RSInterface 523 - [25: 00] +RSInterface 523 - [26: 00] +RSInterface 523 - [27: /] +RSInterface 523 - [29: 00] +RSInterface 523 - [30: 00] +RSInterface 523 - [31: /] +RSInterface 523 - [33: 00] +RSInterface 523 - [34: 00] +RSInterface 523 - [35: /] +RSInterface 523 - [37: 00] +RSInterface 523 - [38: 00] +RSInterface 523 - [39: /] +RSInterface 523 - [41: 00] +RSInterface 523 - [42: 00] +RSInterface 523 - [43: /] +RSInterface 523 - [45: 00] +RSInterface 523 - [46: 00] +RSInterface 523 - [47: /] +RSInterface 523 - [49: 00] +RSInterface 523 - [50: 00] +RSInterface 523 - [51: /] +RSInterface 523 - [53: 00] +RSInterface 523 - [54: 00] +RSInterface 523 - [55: /] +RSInterface 523 - [57: 00] +RSInterface 523 - [58: 00] +RSInterface 523 - [59: /] +RSInterface 523 - [61: 00] +RSInterface 523 - [62: 00] +RSInterface 523 - [63: /] +RSInterface 523 - [65: 00] +RSInterface 523 - [66: 00] +RSInterface 523 - [67: /] +RSInterface 523 - [69: 00] +RSInterface 523 - [70: 00] +RSInterface 523 - [71: /] +RSInterface 523 - [73: 00] +RSInterface 523 - [74: 00] +RSInterface 523 - [75: /] +RSInterface 523 - [77: 00] +RSInterface 523 - [78: 00] +RSInterface 523 - [79: /] +RSInterface 523 - [81: 00] +RSInterface 523 - [82: 00] +RSInterface 523 - [83: /] +RSInterface 523 - [85: 00] +RSInterface 523 - [86: 00] +RSInterface 523 - [87: /] +RSInterface 523 - [89: 00] +RSInterface 523 - [90: 00] +RSInterface 523 - [91: /] +RSInterface 523 - [93: 00] +RSInterface 523 - [94: 00] +RSInterface 523 - [95: /] +RSInterface 523 - [98: Player :] +RSInterface 523 - [99: Player ~ Name] +RSInterface 524 - [1: Text] +RSInterface 525 - [2: This is an interface type test.] +RSInterface 526 - [2: This is an interface type test.] +RSInterface 527 - [4: Arrowheads display] +RSInterface 527 - [7: Saranthium coin display] +RSInterface 527 - [10: Senntisten coin display] +RSInterface 527 - [13: Jewellery display] +RSInterface 527 - [16: Pottery display] +RSInterface 527 - [19: Ancient Saradomin symbol display] +RSInterface 527 - [22: Old Saradomin symbol display] +RSInterface 527 - [25: Zaros tablet display] +RSInterface 527 - [28: Ancient talisman display] +RSInterface 527 - [31: Vase display] +RSInterface 527 - [34: Soil layers display] +RSInterface 527 - [35: Stairs to
Natural History
exhibit] +RSInterface 527 - [36: Stairs to
Timeline
exhibit] +RSInterface 527 - [37: Dig Site cleaning area] +RSInterface 527 - [38: Level up] +RSInterface 527 - [65: 1st-2nd Ages] +RSInterface 527 - [67: End of
2nd Age] +RSInterface 527 - [69: 3rd Age
4000 years long] +RSInterface 527 - [71: 3rd Age
yr 3000-4000] +RSInterface 527 - [73: 4th Age
2000 yrs long] +RSInterface 527 - [75: 4th Age
yr 1-200] +RSInterface 527 - [77: 4th Age
yr 500-900] +RSInterface 527 - [79: 4th Age
yr 1-100] +RSInterface 527 - [81: 4th Age
yr 31-60] +RSInterface 527 - [83: 4th Age
yr 1100-1200] +RSInterface 527 - [85: 4th Age
yr 700-800] +RSInterface 527 - [87: 4th Age
yr 1777] +RSInterface 527 - [89: 4th Age
yr 1937] +RSInterface 527 - [91: 5th Age
currently 169 years old] +RSInterface 527 - [93: 5th Age
yr 8] +RSInterface 527 - [95: 5th Age
yr 9] +RSInterface 527 - [97: 5th Age
yr 12] +RSInterface 527 - [99: 5th Age
yr 20] +RSInterface 527 - [101: 5th Age
yr 23] +RSInterface 527 - [103: 5th Age
yr 42-62] +RSInterface 527 - [105: 5th Age
yr 47] +RSInterface 527 - [108: 5th Age
yr 7] +RSInterface 527 - [109: 5th Age
yr 62] +RSInterface 527 - [110: Stairs to
Dig Site
exhibit] +RSInterface 527 - [111: Stairs to
Timeline
exhibit] +RSInterface 527 - [112: Level up] +RSInterface 527 - [113: Level down] +RSInterface 527 - [118: 5th Age
yr 136] +RSInterface 527 - [121: 5th Age
yr 70] +RSInterface 527 - [124: 5th Age
yr 132] +RSInterface 527 - [127: 5th Age
yr 154] +RSInterface 527 - [130: 5th Age
yr 169] +RSInterface 527 - [133: 5th Age
yr 169] +RSInterface 527 - [136: 5th Age
yr 143] +RSInterface 527 - [139: 5th Age
yr 162-163] +RSInterface 527 - [142: 5th Age
yr 20] +RSInterface 527 - [145: 5th Age
yr 98] +RSInterface 527 - [146: Level down] +RSInterface 527 - [147: Stairs to
Timeline
exhibit] +RSInterface 527 - [150: 5th Age
yr 70] +RSInterface 527 - [156: Terrorbird display] +RSInterface 527 - [159: Kalphite Queen
display] +RSInterface 527 - [162: Mole
display] +RSInterface 527 - [165: Penguin
display] +RSInterface 527 - [168: Camel
display] +RSInterface 527 - [171: Leech
display] +RSInterface 527 - [174: Monkey
display] +RSInterface 527 - [177: Sea slug
display] +RSInterface 527 - [180: Snail
display] +RSInterface 527 - [183: Snake
display] +RSInterface 527 - [186: Lizard
display] +RSInterface 527 - [189: Battle tortoise
display] +RSInterface 527 - [192: Dragon
display] +RSInterface 527 - [195: Wyvern
display] +RSInterface 527 - [197: Level down] +RSInterface 527 - [198: Level up] +RSInterface 528 - [2: Text] +RSInterface 528 - [15: Display number] +RSInterface 529 - [2: This is an interface type test.] +RSInterface 530 - [2: Text] +RSInterface 530 - [4: Text] +RSInterface 530 - [6: This is an interface type test.] +RSInterface 530 - [7: This is an interface type test.] +RSInterface 532 - [0: Museum Kudos:] +RSInterface 533 - [1: Text] +RSInterface 533 - [24: Display number] +RSInterface 533 - [25: 03] +RSInterface 533 - [28: Text] +RSInterface 533 - [29: Text] +RSInterface 533 - [30: Text] +RSInterface 533 - [31: Text] +RSInterface 534 - [2: Text] +RSInterface 534 - [58: Asgarnia] +RSInterface 534 - [59: Misthalin] +RSInterface 534 - [60: Avarrocka] +RSInterface 534 - [61: Ghost Town] +RSInterface 534 - [62: Karamja] +RSInterface 534 - [63: Entrana] +RSInterface 534 - [83: Display number] +RSInterface 536 - [4: Shrink-Me-Quick Recipe] +RSInterface 536 - [5: 1x leaf of tarromin, 1x shrunken ogleroot. Mix the tarromin in a vial of water, then add the shrunken ogleroot. Drink when standing within an area prepared with glyphs for this potion to have full effect. Take one dose only, for a new perspective on the world...] +RSInterface 537 - [14: E] +RSInterface 537 - [15: F] +RSInterface 537 - [16: E] +RSInterface 537 - [17: D] +RSInterface 537 - [18: C] +RSInterface 537 - [19: A] +RSInterface 537 - [20: E] +RSInterface 537 - [21: G] +RSInterface 537 - [22: A] +RSInterface 537 - [24: C] +RSInterface 537 - [25: D] +RSInterface 537 - [26: E] +RSInterface 537 - [27: F] +RSInterface 537 - [28: G] +RSInterface 537 - [29: A] +RSInterface 537 - [30: B] +RSInterface 537 - [31: D] +RSInterface 537 - [32: C] +RSInterface 537 - [33: E] +RSInterface 537 - [34: F] +RSInterface 537 - [35: G] +RSInterface 537 - [36: A] +RSInterface 537 - [37: B] +RSInterface 537 - [38: UPPER] +RSInterface 537 - [39: LOWER] +RSInterface 538 - [4: Things to do:] +RSInterface 538 - [5: Take out the rubbish
Buy a new record for the gramophone
Check shrunken ogleroot supply
Feed ogleroots to my darlings
Wash the bedsheets
Hang out the washing
Practise the piano
Terrorise the little brat with the ball again
Trim hedges in the garden
Floss warts
Plot revenge on Fritz's murderer] +RSInterface 540 - [75: Elnock's Exchange] +RSInterface 540 - [76: Make your selection and press confirm] +RSInterface 540 - [94: x3] +RSInterface 540 - [96: x2] +RSInterface 540 - [98: x1] +RSInterface 540 - [100: x3] +RSInterface 540 - [102: x2] +RSInterface 540 - [104: x1] +RSInterface 540 - [106: x3] +RSInterface 540 - [108: x2] +RSInterface 540 - [110: x1] +RSInterface 540 - [112: x1 of any impling type] +RSInterface 540 - [115: x1] +RSInterface 540 - [118: x1] +RSInterface 540 - [121: x1] +RSInterface 540 - [124: x3] +RSInterface 540 - [128: Text] +RSInterface 540 - [129: Baby impling] +RSInterface 540 - [130: Young impling] +RSInterface 540 - [131: Gourmet impling] +RSInterface 540 - [132: Gourmet impling] +RSInterface 540 - [133: Essence impling] +RSInterface 540 - [134: Essence impling] +RSInterface 540 - [135: Earth impling] +RSInterface 540 - [136: Eclectic impling] +RSInterface 540 - [137: Nature impling] +RSInterface 540 - [138: Imp repellant] +RSInterface 540 - [139: Magic butterfly net] +RSInterface 540 - [140: Jar generator] +RSInterface 541 - [11: %1] +RSInterface 541 - [12: %1] +RSInterface 541 - [13: %1] +RSInterface 541 - [14: %1] +RSInterface 541 - [15: %1] +RSInterface 541 - [16: %1] +RSInterface 541 - [17: %1] +RSInterface 541 - [18: %1] +RSInterface 541 - [19: %1] +RSInterface 541 - [20: %1] +RSInterface 550 - [3: Friends List - RuneScape XXX] +RSInterface 550 - [6: Add Friend] +RSInterface 550 - [7: Del Friend] +RSInterface 551 - [3: Ignore List] +RSInterface 551 - [6: Add Name] +RSInterface 551 - [7: Del Name] +RSInterface 553 - [11: Report abuse] +RSInterface 553 - [12: This form is for reporting players who are breaking our rules.
Using it sends a snapshot of the last 60 secs of activity to us.] +RSInterface 553 - [13: If you misuse this form, you will be banned.] +RSInterface 553 - [14: First please enter the name of the offending player below:] +RSInterface 553 - [15: *] +RSInterface 553 - [16: Moderator option: Mute player for 48 hours: OFF] +RSInterface 553 - [17: Then click below to indicate which of our 13 rules is being broken.
For a detailed explanation of each rule please read the manual on our website.] +RSInterface 553 - [18: 1: Offensive language] +RSInterface 553 - [19: 2: Item scamming] +RSInterface 553 - [20: 3: Password scamming] +RSInterface 553 - [21: 4: Bug abuse] +RSInterface 553 - [22: 5: Jagex staff impersonation] +RSInterface 553 - [23: 6: Account sharing/trading] +RSInterface 553 - [24: 7: Macroing] +RSInterface 553 - [25: 8: Multiple logging in] +RSInterface 553 - [26: 9: Encouraging others to break rules] +RSInterface 553 - [27: 10: Misuse of customer support] +RSInterface 553 - [28: 11: Advertising / website] +RSInterface 553 - [29: 12: Real world item trading] +RSInterface 553 - [30: 13: Asking for personal details] +RSInterface 557 - [0: Select an Option] +RSInterface 557 - [1: option1] +RSInterface 557 - [2: option2] +RSInterface 558 - [28: What would you like to make?] +RSInterface 559 - [72: Text for testing, remove at will. Text for testing, remove at will. Text for testing, remove at will. Text for testing, remove at will. Text for testing, remove at will. Text for testing, remove at will. ] +RSInterface 560 - [13: Warning!] +RSInterface 560 - [14: Warning! Low level players beware. Goblins have taken over and there are poisonous spiders!] +RSInterface 560 - [17: Proceed regardless] +RSInterface 560 - [18: Stay out] +RSInterface 560 - [19: Don't ask me this again] +RSInterface 561 - [13: Warning!] +RSInterface 561 - [14: If you climb down this rope you will be attacked by
the Kalphite Queen, one of the most deadly creatures in RuneScape.] +RSInterface 561 - [17: That's what I came here for] +RSInterface 561 - [18: I think I'll stay out] +RSInterface 561 - [19: Don't ask me this again] +RSInterface 562 - [13: Warning!] +RSInterface 562 - [14: This area is very dark. Do not extinguish your light source!] +RSInterface 562 - [17: Proceed] +RSInterface 562 - [18: Stay out] +RSInterface 562 - [19: Don't ask me this again] +RSInterface 563 - [13: Warning!] +RSInterface 563 - [14: Entering building mode will destroy
any items that are on the ground. Do you want to continue?] +RSInterface 563 - [17: Yes, I do not mind losing any items that are on the ground.] +RSInterface 563 - [18: No, I want to look around and pick things up first.] +RSInterface 563 - [19: Don't ask me this again] +RSInterface 564 - [13: Warning!] +RSInterface 564 - [14: Warning! At the top of this tower you will be attacked
by archers, who will shoot you without mercy!] +RSInterface 564 - [17: I'll be okay - they can't hurt me] +RSInterface 564 - [18: I'll stay down here] +RSInterface 564 - [19: Don't ask me this again] +RSInterface 565 - [13: Warning!] +RSInterface 565 - [14: The desert is a VERY dangerous place. Do not
enter if you are afraid of dying. Beware of high temperatures, sandstorms, robbers and slavers.
No responsibility is taken by Shantay if anything
bad should happen to you, in any circumstances whatsoever.] +RSInterface 565 - [17: Proceed regardless] +RSInterface 565 - [18: Stay out] +RSInterface 565 - [19: Don't ask me this again] +RSInterface 566 - [13: Warning!] +RSInterface 566 - [14: Do you need to collect any dropped
items?] +RSInterface 566 - [17: Yes - I need to collect some stuff
before I leave] +RSInterface 566 - [18: No - I haven't left any valuables on the floor] +RSInterface 566 - [19: Don't ask me this again] +RSInterface 567 - [13: Warning!] +RSInterface 567 - [14: It's very dark in there. Are you sure you want to
go in without a light source?] +RSInterface 567 - [17: Yes I am sure.] +RSInterface 567 - [18: No, I am not properly equipped.] +RSInterface 567 - [19: Don't ask me this again] +RSInterface 568 - [13: Warning!] +RSInterface 568 - [14: This area is very dark. Do not extinquish your light source!] +RSInterface 568 - [17: Proceed regardless] +RSInterface 568 - [18: Stay out] +RSInterface 568 - [19: Don't ask me this again] +RSInterface 569 - [13: Warning!] +RSInterface 569 - [14: It's very dark in there. Are you sure you want to go in without a light source?] +RSInterface 569 - [17: Yes I am sure.] +RSInterface 569 - [18: No, I am not properly equipped..] +RSInterface 569 - [19: Don't ask me this again] +RSInterface 570 - [13: Warning!] +RSInterface 570 - [14: The cave is very dark and you don't have a light
source. Are you sure you want to go down?] +RSInterface 570 - [17: I'm NOT scared of the dark] +RSInterface 570 - [18: I AM scared of the dark] +RSInterface 570 - [19: Don't ask me this again] +RSInterface 571 - [13: Warning!] +RSInterface 571 - [14: The tunnel is very dark. Are you sure you want
to go down without a light source?] +RSInterface 571 - [17: Yes I am sure.] +RSInterface 571 - [18: No, I am not properly equipped.] +RSInterface 571 - [19: Don't ask me this again] +RSInterface 572 - [13: Warning!] +RSInterface 572 - [14: If your light source goes out down there you'll
be in trouble! Are you sure you want to go in without
a tinderbox?] +RSInterface 572 - [17: I'm NOT scared of the dark] +RSInterface 572 - [18: I AM scared of the dark] +RSInterface 572 - [19: Don't ask me this again] +RSInterface 573 - [13: Warning!] +RSInterface 573 - [14: You can run past, but keep in mind that a
dangerous area follows!] +RSInterface 573 - [17: I'm not scared] +RSInterface 573 - [18: I think I'll stay here] +RSInterface 573 - [19: Don't ask me this again] +RSInterface 574 - [13: Warning!] +RSInterface 574 - [14: This area is very dangerous, are you sure you want to continue?] +RSInterface 574 - [17: Go in - I don't mind dying] +RSInterface 574 - [18: No - I'm holding too much stuff] +RSInterface 574 - [19: Don't ask me this again] +RSInterface 575 - [13: Warning!] +RSInterface 575 - [14: If you pull this lever you will be attacked by the King Black Dragon, one of the most deadly creatures in RuneScape.] +RSInterface 575 - [17: That's what I came here for] +RSInterface 575 - [18: I think I'll stay out] +RSInterface 575 - [19: Don't ask me this again] +RSInterface 576 - [13: Warning!] +RSInterface 576 - [14: This way leads into the Wilderness and is only
one way! Are you sure you want to go down here?] +RSInterface 576 - [17: Yes - I'm fearless] +RSInterface 576 - [18: No - That doesn't seem like a sensible
thing to do] +RSInterface 576 - [19: Don't ask me this again] +RSInterface 577 - [13: Warning!] +RSInterface 577 - [14: The tunnel is very dark. Are you sure you want to
go down without a light source?] +RSInterface 577 - [17: Yes I am sure.] +RSInterface 577 - [18: No, I am not properly equipped.] +RSInterface 577 - [19: Don't ask me this again] +RSInterface 578 - [13: Warning!] +RSInterface 578 - [14: This fairy ring code leads to a dark area. Are you
sure you want to go there without a light source?] +RSInterface 578 - [17: Yes I am sure.] +RSInterface 578 - [18: No, I am not properly equipped.] +RSInterface 578 - [19: Don't ask me this again] +RSInterface 579 - [13: Warning!] +RSInterface 579 - [14: Are you sure you want to climb down?] +RSInterface 579 - [17: Yes - I know that it may be
dangerous down there] +RSInterface 579 - [18: No thanks - I don't want to die] +RSInterface 579 - [19: Don't ask me this again] +RSInterface 580 - [13: Warning!] +RSInterface 580 - [14: Mort Myre is a dangerous ghast-infested swamp.
Do not enter if you value your life.] +RSInterface 580 - [17: Enter the swamp.] +RSInterface 580 - [18: Stay out] +RSInterface 580 - [19: Don't ask me this again] +RSInterface 581 - [13: Warning!] +RSInterface 581 - [14: Danger! Death Plateau is not named that for
a joke! If you continue down this path you will
be assailed by trolls! If you are not prepared
for that you should turn back now!] +RSInterface 581 - [17: Don't show me this again] +RSInterface 583 - [14: Reset Warning Messages] +RSInterface 583 - [15: Body Text] +RSInterface 583 - [46: Dagannoth Kings' Ladder] +RSInterface 583 - [47: Lumbridge Swamp Cave Rope] +RSInterface 583 - [48: Stronghold of Security Ladders] +RSInterface 583 - [49: Falador Mole Lair] +RSInterface 583 - [50: Dropped Items in Random Events] +RSInterface 583 - [51: Player-Owned Houses] +RSInterface 583 - [52: Contact Dungeon Ladder] +RSInterface 583 - [53: Icy Path Area] +RSInterface 583 - [54: H.A.M. Tunnel from Mill] +RSInterface 583 - [55: Fairy Ring to Dorgesh-Kaan] +RSInterface 583 - [56: Lumbridge Cellar] +RSInterface 583 - [57: Mort Myre] +RSInterface 583 - [58: Observatory Stairs] +RSInterface 583 - [59: Shantay Pass] +RSInterface 583 - [60: Elid Genie Cave] +RSInterface 583 - [61: Watchtower Shaman Cave] +RSInterface 583 - [62: Trollheim Wilderness Entrance] +RSInterface 583 - [63: Wilderness Ditch] +RSInterface 583 - [64: Dorgesh-Kaan City Exit] +RSInterface 583 - [65: Dorgesh-Kaan Tunnel to Kalphites] +RSInterface 583 - [66: Ranging Guild Tower] +RSInterface 583 - [67: Death Plateau] +RSInterface 583 - [68: God Wars Wilderness Agility Route] +RSInterface 583 - [69: Duel Arena] +RSInterface 583 - [70: Bounty Hunter] +RSInterface 583 - [71: Chaos Tunnels (East)] +RSInterface 583 - [72: Chaos Tunnels (Central)] +RSInterface 586 - [2: Change of address form for the citizens of Seers' Village.] +RSInterface 587 - [2: Meet at Camel We'll storm She'll ensure w The servants silence.] +RSInterface 588 - [3: Correct tumbler and height] +RSInterface 588 - [4: Correct height, wrong tumbler] +RSInterface 588 - [5: Wrong height, wrong tumbler] +RSInterface 588 - [6: Selected tumbler height] +RSInterface 588 - [7: 0/5] +RSInterface 588 - [8: Tumbler] +RSInterface 588 - [9: Guess] +RSInterface 588 - [14: Try Lock] +RSInterface 588 - [15: 1] +RSInterface 588 - [16: 2] +RSInterface 588 - [17: 3] +RSInterface 588 - [18: 4] +RSInterface 588 - [19: Select a tumbler] +RSInterface 588 - [20: 1] +RSInterface 588 - [21: 2] +RSInterface 588 - [22: 3] +RSInterface 588 - [23: 4] +RSInterface 589 - [0: Talking in: Not in chat] +RSInterface 589 - [1: Owner: None] +RSInterface 589 - [7: Clan Chat] +RSInterface 589 - [8: Join Chat] +RSInterface 589 - [9: Clan Setup] +RSInterface 591 - [61: Thessalia's Makeovers] +RSInterface 591 - [62: Striped sweater] +RSInterface 591 - [65: Woollen vest] +RSInterface 591 - [68: Princely vest] +RSInterface 591 - [71: Tattered waistcoat] +RSInterface 591 - [74: Fine shirt] +RSInterface 591 - [77: Waistcoat] +RSInterface 591 - [80: Plain top] +RSInterface 591 - [83: Light buttons] +RSInterface 591 - [86: Dark buttons] +RSInterface 591 - [89: Jacket] +RSInterface 591 - [92: Shirt] +RSInterface 591 - [95: Stitching] +RSInterface 591 - [98: Ragged top] +RSInterface 591 - [101: Two-toned] +RSInterface 591 - [104: Striped arms] +RSInterface 591 - [107: Princely sleeves] +RSInterface 591 - [110: Fine cuffs] +RSInterface 591 - [113: Woollen sleeves] +RSInterface 591 - [116: Ragged arms] +RSInterface 591 - [119: Tattered sleeves] +RSInterface 591 - [122: Loose sleeved] +RSInterface 591 - [125: Regular] +RSInterface 591 - [128: Musclebound] +RSInterface 591 - [131: Large cuffed] +RSInterface 591 - [134: Thin sleeved] +RSInterface 591 - [137: Shoulder pads] +RSInterface 591 - [140: Plain trousers] +RSInterface 591 - [143: Princely breeches] +RSInterface 591 - [146: Shorts] +RSInterface 591 - [149: Ragged breeches] +RSInterface 591 - [152: Tattered breeches] +RSInterface 591 - [155: Torn trousers] +RSInterface 591 - [158: Breeches] +RSInterface 591 - [161: Striped trousers] +RSInterface 591 - [164: Turn-ups] +RSInterface 591 - [167: Flares] +RSInterface 591 - [170: Fine breeches] +RSInterface 591 - [179: 1,000 Coins] +RSInterface 592 - [64: Hairdresser's Salon] +RSInterface 592 - [65: Bald] +RSInterface 592 - [68: Bun] +RSInterface 592 - [71: Dreadlocks] +RSInterface 592 - [74: Long] +RSInterface 592 - [77: Short] +RSInterface 592 - [80: Pigtails] +RSInterface 592 - [83: Crew cut] +RSInterface 592 - [86: Close-cropped] +RSInterface 592 - [89: Wild spikes] +RSInterface 592 - [92: Spikes] +RSInterface 592 - [95: Side ponytail] +RSInterface 592 - [98: Curls] +RSInterface 592 - [101: Wind braids] +RSInterface 592 - [104: Ponytail] +RSInterface 592 - [107: Braids] +RSInterface 592 - [110: Four ponies] +RSInterface 592 - [113: Bob] +RSInterface 592 - [116: Layered] +RSInterface 592 - [119: Straight] +RSInterface 592 - [122: Long braids] +RSInterface 592 - [125: Curtains] +RSInterface 592 - [128: Earmuffs] +RSInterface 592 - [133: 2,000 Coins] +RSInterface 593 - [72: Reinald's Smithing Emporium] +RSInterface 593 - [73: Bare arms] +RSInterface 593 - [76: Silver wristguards] +RSInterface 593 - [79: Silver clasps] +RSInterface 593 - [82: Silver bangles] +RSInterface 593 - [85: Silver banding] +RSInterface 593 - [88: Silver bands] +RSInterface 593 - [91: Silver armguards] +RSInterface 593 - [94: Bare arms] +RSInterface 593 - [97: Gold wristguards] +RSInterface 593 - [100: Gold clasps] +RSInterface 593 - [103: Gold bangles] +RSInterface 593 - [106: Gold banding] +RSInterface 593 - [109: Gold bands] +RSInterface 593 - [112: Gold armguards] +RSInterface 593 - [118: 500 Coins] +RSInterface 594 - [61: Thessalia's Makeovers] +RSInterface 594 - [62: Striped sweater] +RSInterface 594 - [67: Woollen vest] +RSInterface 594 - [68: Frilled blouse] +RSInterface 594 - [71: Bodice] +RSInterface 594 - [74: Fine shirt] +RSInterface 594 - [77: Ragged top] +RSInterface 594 - [80: Plain top] +RSInterface 594 - [83: Crop-top] +RSInterface 594 - [86: Simple] +RSInterface 594 - [89: Polo neck] +RSInterface 594 - [92: Torn] +RSInterface 594 - [95: Striped arms] +RSInterface 594 - [98: Frilled sleeves] +RSInterface 594 - [101: Fine cuffs] +RSInterface 594 - [104: Woollen arms] +RSInterface 594 - [107: Ragged sleeves] +RSInterface 594 - [110: Tattered sleeves] +RSInterface 594 - [113: Long sleeves] +RSInterface 594 - [116: Short sleeves] +RSInterface 594 - [119: Muscly] +RSInterface 594 - [122: Large cuffs] +RSInterface 594 - [125: Bare arms] +RSInterface 594 - [128: Fine skirt] +RSInterface 594 - [131: Frilled skirt] +RSInterface 594 - [134: Layered skirt] +RSInterface 594 - [137: Long, narrow skirt] +RSInterface 594 - [140: Ragged skirt] +RSInterface 594 - [143: Tattered skirt] +RSInterface 594 - [146: Short skirt] +RSInterface 594 - [149: Sashed skirt] +RSInterface 594 - [152: Fitted skirt] +RSInterface 594 - [155: Torn trousers] +RSInterface 594 - [158: Long skirt] +RSInterface 594 - [161: Turn-ups] +RSInterface 594 - [164: Flares] +RSInterface 594 - [167: Plain trousers] +RSInterface 594 - [170: Shorts] +RSInterface 594 - [180: 1,000 Coins] +RSInterface 595 - [72: Reinald's Smithing Emporium] +RSInterface 595 - [73: Bare arms] +RSInterface 595 - [76: Silver wristguards] +RSInterface 595 - [79: Silver clasps] +RSInterface 595 - [82: Silver bangles] +RSInterface 595 - [85: Silver banding] +RSInterface 595 - [88: Silver bands] +RSInterface 595 - [91: Silver armguards] +RSInterface 595 - [94: Bare arms] +RSInterface 595 - [97: Gold wristguards] +RSInterface 595 - [100: Gold clasps] +RSInterface 595 - [103: Gold bangles] +RSInterface 595 - [106: Gold banding] +RSInterface 595 - [109: Gold bands] +RSInterface 595 - [112: Gold armguards] +RSInterface 595 - [118: 500 Coins] +RSInterface 596 - [64: Hairdresser's Salon] +RSInterface 596 - [65: Bald] +RSInterface 596 - [68: Dreadlocks] +RSInterface 596 - [71: Long hair] +RSInterface 596 - [74: Medium hair] +RSInterface 596 - [77: Monk] +RSInterface 596 - [80: Short] +RSInterface 596 - [83: Close-cropped] +RSInterface 596 - [86: Wild spikes] +RSInterface 596 - [89: Spikes] +RSInterface 596 - [92: Mohawk] +RSInterface 596 - [95: Wind braids] +RSInterface 596 - [98: Quiff] +RSInterface 596 - [101: Samurai] +RSInterface 596 - [104: Prince] +RSInterface 596 - [107: Curtains] +RSInterface 596 - [110: Long curtains] +RSInterface 596 - [113: Goatee] +RSInterface 596 - [116: Long beard] +RSInterface 596 - [119: Medium beard] +RSInterface 596 - [122: Moustache] +RSInterface 596 - [125: Clean shaven] +RSInterface 596 - [128: Short beard] +RSInterface 596 - [131: Short full] +RSInterface 596 - [134: Split] +RSInterface 596 - [137: Handlebar] +RSInterface 596 - [140: Mutton] +RSInterface 596 - [143: Full mutton] +RSInterface 596 - [146: Full moustache] +RSInterface 596 - [149: Waxed] +RSInterface 596 - [152: Dali] +RSInterface 596 - [155: Vizier] +RSInterface 596 - [161: 2,000 Coins] +RSInterface 597 - [2: NPC Killcount] +RSInterface 597 - [3: Armadyl kills] +RSInterface 597 - [4: Bandos kills] +RSInterface 597 - [5: Saradomin kills] +RSInterface 597 - [6: Zamorak kills] +RSInterface 597 - [7: 0] +RSInterface 597 - [8: 0] +RSInterface 597 - [9: 0] +RSInterface 598 - [2: NPC Killcount] +RSInterface 598 - [3: Armadyl kills] +RSInterface 598 - [4: Bandos kills] +RSInterface 598 - [5: Saradomin kills] +RSInterface 598 - [6: Zamorak kills] +RSInterface 598 - [7: 0] +RSInterface 598 - [8: 0] +RSInterface 598 - [9: 0] +RSInterface 599 - [2: NPC Killcount] +RSInterface 599 - [3: Armadyl kills] +RSInterface 599 - [4: Bandos kills] +RSInterface 599 - [5: Saradomin kills] +RSInterface 599 - [6: Zamorak kills] +RSInterface 599 - [7: 0] +RSInterface 599 - [8: 0] +RSInterface 599 - [9: 0] +RSInterface 600 - [13: Warning!] +RSInterface 600 - [14: This way leads into the Wilderness and is only
one way! Are you sure you want to go down here?] +RSInterface 600 - [17: Yes, I'm fearless] +RSInterface 600 - [18: Nope, that doesn't seem like a sensible
thing to do] +RSInterface 600 - [19: Don't ask me this again] +RSInterface 601 - [1: NPC Killcount] +RSInterface 601 - [2: Armadyl kills] +RSInterface 601 - [3: Bandos kills] +RSInterface 601 - [4: Saradomin kills] +RSInterface 601 - [5: Zamorak kills] +RSInterface 601 - [6: 0] +RSInterface 601 - [7: 0] +RSInterface 601 - [8: 0] +RSInterface 617 - [7: Bolrie's Diary] +RSInterface 617 - [8: Chapter 1. Bad advice] +RSInterface 617 - [9: In which Bolrie is advised by] +RSInterface 617 - [10: a mysterious stranger, and] +RSInterface 617 - [11: ambition is fed.] +RSInterface 617 - [13: Chapter 2. The King is dead] +RSInterface 617 - [14: In which a great king dies] +RSInterface 617 - [15: and the search for a new] +RSInterface 617 - [16: one begins.] +RSInterface 617 - [19: Chapter 3. Eyes opened] +RSInterface 617 - [20: In which a secret is revealed,] +RSInterface 617 - [21: an old foe reappears and] +RSInterface 617 - [22: ambitions end.] +RSInterface 617 - [24: Finally, I understand my] +RSInterface 617 - [25: failings and my true enemies.] +RSInterface 617 - [26: I dedicate the rest of my] +RSInterface 617 - [27: shattered life to the task of] +RSInterface 617 - [28: eradicating them both.] +RSInterface 619 - [43: Pay Bank Charge With...] +RSInterface 620 - [19: Player Stock] +RSInterface 620 - [21: Main Stock] +RSInterface 620 - [22: Lowe's Archery Emporium] +RSInterface 620 - [28: Right-click on an item in the shop or your inventory to see the available options.
Compare the prices between the Main and Player Stock to find the best deals!] +RSInterface 620 - [31: Player Stock] +RSInterface 620 - [32: Main Stock] +RSInterface 623 - [4: Message of the week] +RSInterface 624 - [46: Fairy Ring Power Relay] +RSInterface 624 - [47: Assign power to each ring in proportion to its area:] +RSInterface 624 - [68: Confirm] +RSInterface 624 - [70: 0] +RSInterface 624 - [71: 0] +RSInterface 625 - [45: Please select your goblin from the options below:] +RSInterface 625 - [67: Select your Goblin] +RSInterface 625 - [68: Goblin 1] +RSInterface 625 - [71: Goblin 2] +RSInterface 625 - [74: Goblin 3] +RSInterface 625 - [77: Goblin 4] +RSInterface 625 - [80: Goblin 5] +RSInterface 625 - [83: Goblin 6] +RSInterface 625 - [105: Confirm] +RSInterface 626 - [20: Are you sure you want to fight this duel?] +RSInterface 626 - [23: You are about to stake:] +RSInterface 626 - [24: Your opponent will stake:] +RSInterface 626 - [25: Absolutely nothing!] +RSInterface 626 - [26: Absolutely nothing!] +RSInterface 626 - [27: Before the duel starts:] +RSInterface 626 - [28: There will be obstacles in the arena.] +RSInterface 626 - [29: There will be obstacles in the arena.] +RSInterface 626 - [30: There will be obstacles in the arena.] +RSInterface 626 - [31: There will be obstacles in the arena.] +RSInterface 626 - [32: During the duel:] +RSInterface 626 - [33: There will be obstacles in the arena.] +RSInterface 626 - [34: There will be obstacles in the arena.] +RSInterface 626 - [35: There will be obstacles in the arena.] +RSInterface 626 - [36: There will be obstacles in the arena.] +RSInterface 626 - [37: There will be obstacles in the arena.] +RSInterface 626 - [38: There will be obstacles in the arena.] +RSInterface 626 - [39: There will be obstacles in the arena.] +RSInterface 626 - [40: There will be obstacles in the arena.] +RSInterface 626 - [41: Lots of y's and g's] +RSInterface 626 - [42: There will be obstacles in the arena.] +RSInterface 626 - [43: There will be obstacles in the arena.] +RSInterface 626 - [44: There will be obstacles in the arena.] +RSInterface 626 - [45: Waiting for other player...] +RSInterface 626 - [53: Accept] +RSInterface 627 - [13: Warning!] +RSInterface 627 - [14: Duelling is an honourable pastime. Anyone leaving a duel or tournament by ANY means, accidentally or deliberately, will lose their duel and their stake. No exceptions.] +RSInterface 627 - [17: Don't show me this again] +RSInterface 629 - [11: Tournament Value:] +RSInterface 629 - [12: 0] +RSInterface 629 - [40: Rank Required:] +RSInterface 629 - [41: Entry Fee:] +RSInterface 629 - [42: Potions:] +RSInterface 629 - [43: Food:] +RSInterface 629 - [44: Prayer:] +RSInterface 629 - [45: Special Attacks:] +RSInterface 629 - [46: Obstacles:] +RSInterface 629 - [47: Ranged:] +RSInterface 629 - [48: Melee:] +RSInterface 629 - [49: Magic:] +RSInterface 629 - [50: Heal Between Rounds:] +RSInterface 629 - [51: Weapon Slots Only:] +RSInterface 629 - [52: Summoning:] +RSInterface 629 - [53: rank] +RSInterface 629 - [54: fee] +RSInterface 629 - [55: fee] +RSInterface 629 - [56: fee] +RSInterface 629 - [57: fee] +RSInterface 629 - [58: spec] +RSInterface 629 - [59: obstacles] +RSInterface 629 - [60: ranged] +RSInterface 629 - [61: melee] +RSInterface 629 - [62: magic] +RSInterface 629 - [63: heal] +RSInterface 629 - [64: weapon] +RSInterface 629 - [65: summon] +RSInterface 629 - [67: Join] +RSInterface 629 - [68: Join] +RSInterface 629 - [69: Join] +RSInterface 629 - [70: Join] +RSInterface 629 - [71: Join] +RSInterface 629 - [72: Resign] +RSInterface 630 - [0: Line1] +RSInterface 630 - [1: Line2] +RSInterface 630 - [2: Click here to continue] +RSInterface 631 - [24: Opponent:] +RSInterface 631 - [25: namehhhhhhhh] +RSInterface 631 - [26: Opponent's Level:] +RSInterface 631 - [27: 126] +RSInterface 631 - [28: AAAAAAAAAAAAAAAA] +RSInterface 631 - [29: No Ranged] +RSInterface 631 - [31: No Melee] +RSInterface 631 - [33: No Magic] +RSInterface 631 - [35: Fun Weapons] +RSInterface 631 - [37: No Forfeit] +RSInterface 631 - [39: No Drinks] +RSInterface 631 - [41: No Food] +RSInterface 631 - [43: No Prayer] +RSInterface 631 - [45: No Movement] +RSInterface 631 - [47: Obstacles] +RSInterface 631 - [50: No Special Attacks] +RSInterface 631 - [52: Enable Summoning] +RSInterface 631 - [92: 0] +RSInterface 631 - [93: 0] +RSInterface 631 - [94: Max Stake:] +RSInterface 631 - [95: Max Stake:] +RSInterface 631 - [96: Your stake:] +RSInterface 631 - [97: Opponent's stake:] +RSInterface 631 - [101: Accept] +RSInterface 631 - [106: VS] +RSInterface 632 - [13: Last fifty duels on this world:] +RSInterface 632 - [14: Duel Scoreboard] +RSInterface 632 - [16: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [17: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [18: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [19: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [20: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [21: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [22: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [23: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [24: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [25: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [26: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [27: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [28: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [29: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [30: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [31: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [32: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [33: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [34: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [35: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [36: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [37: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [38: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [39: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [40: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [41: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [42: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [43: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [44: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [45: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [46: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [47: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [48: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [49: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [50: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [51: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [52: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [53: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [54: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [55: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [56: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [57: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [58: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [59: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [60: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [61: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [62: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [63: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [64: Crunchy (126) beat Crunchy2 (126)] +RSInterface 632 - [65: Crunchy (126) beat Crunchy2 (126)] +RSInterface 633 - [15: You are Victorious!] +RSInterface 633 - [17: Close] +RSInterface 633 - [18: The Defeated:] +RSInterface 633 - [19: Name:] +RSInterface 633 - [20: Combat Level:] +RSInterface 633 - [21: 126] +RSInterface 633 - [22: Crunchy] +RSInterface 634 - [15: You are Victorious!] +RSInterface 634 - [17: Claim!] +RSInterface 634 - [18: The Spoils:] +RSInterface 634 - [19: The Defeated:] +RSInterface 634 - [20: Name:] +RSInterface 634 - [21: Combat Level:] +RSInterface 634 - [22: 126] +RSInterface 634 - [23: Crunchy] +RSInterface 635 - [12: Style:] +RSInterface 635 - [13: Options:] +RSInterface 635 - [28: Registrar:] +RSInterface 635 - [30: Tourn. Rank:] +RSInterface 635 - [32: Tourn. Value:] +RSInterface 635 - [34: Entry Fee:] +RSInterface 635 - [36: Time left:] +RSInterface 636 - [11: Upcoming Tournament Rules: Registrar #] +RSInterface 636 - [41: Tournament Value:] +RSInterface 636 - [42: Rank Required:] +RSInterface 636 - [43: Entry Fee:] +RSInterface 636 - [44: Potions:] +RSInterface 636 - [45: Food:] +RSInterface 636 - [46: Prayer:] +RSInterface 636 - [47: Special Attacks:] +RSInterface 636 - [48: Obstacles:] +RSInterface 636 - [49: Ranged:] +RSInterface 636 - [50: Melee:] +RSInterface 636 - [51: Magic:] +RSInterface 636 - [52: Heal Between Rounds:] +RSInterface 636 - [53: Weapon Slots Only:] +RSInterface 636 - [54: Summoning:] +RSInterface 636 - [55: 0] +RSInterface 636 - [56: rank] +RSInterface 636 - [57: fee] +RSInterface 636 - [58: fee] +RSInterface 636 - [59: fee] +RSInterface 636 - [60: fee] +RSInterface 636 - [61: spec] +RSInterface 636 - [62: obstacles] +RSInterface 636 - [63: ranged] +RSInterface 636 - [64: melee] +RSInterface 636 - [65: magic] +RSInterface 636 - [66: heal] +RSInterface 636 - [67: weapon] +RSInterface 637 - [15: Duelling with:] +RSInterface 637 - [16: name] +RSInterface 637 - [17: Their Combat Level:] +RSInterface 637 - [18: 126] +RSInterface 637 - [19: No Ranged] +RSInterface 637 - [21: No Melee] +RSInterface 637 - [23: No Magic] +RSInterface 637 - [25: Fun Weapons] +RSInterface 637 - [27: No Forfeit] +RSInterface 637 - [29: No Drinks] +RSInterface 637 - [31: No Food] +RSInterface 637 - [33: No Prayer] +RSInterface 637 - [35: No Movement] +RSInterface 637 - [37: Obstacles] +RSInterface 637 - [39: Enable Summoning] +RSInterface 637 - [41: No Special Attacks] +RSInterface 637 - [45: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA] +RSInterface 637 - [82: Accept] +RSInterface 637 - [85: Decline] +RSInterface 639 - [14: Are you sure you want to fight this duel?] +RSInterface 639 - [15: Before the duel starts:] +RSInterface 639 - [16: Lots of y's and g's] +RSInterface 639 - [17: There will be obstacles in the arena.] +RSInterface 639 - [18: There will be obstacles in the arena.] +RSInterface 639 - [19: There will be obstacles in the arena.] +RSInterface 639 - [20: There will be obstacles in the arena.] +RSInterface 639 - [21: During the duel:] +RSInterface 639 - [22: There will be obstacles in the arena.] +RSInterface 639 - [23: There will be obstacles in the arena.] +RSInterface 639 - [24: There will be obstacles in the arena.] +RSInterface 639 - [25: There will be obstacles in the arena.] +RSInterface 639 - [26: There will be obstacles in the arena.] +RSInterface 639 - [27: There will be obstacles in the arena.] +RSInterface 639 - [28: There will be obstacles in the arena.] +RSInterface 639 - [29: There will be obstacles in the arena.] +RSInterface 639 - [30: There will be obstacles in the arena.] +RSInterface 639 - [31: There will be obstacles in the arena.] +RSInterface 639 - [32: There will be obstacles in the arena.] +RSInterface 639 - [33: Waiting for other player...] +RSInterface 639 - [35: Accept] +RSInterface 640 - [18: Friendly Duel] +RSInterface 640 - [19: Staked Duel] +RSInterface 640 - [20: Challenge!] +RSInterface 641 - [13: Style:] +RSInterface 641 - [14: Options:] +RSInterface 641 - [28: Tourn. Size:] +RSInterface 641 - [29: 0] +RSInterface 641 - [30: Round Time:] +RSInterface 641 - [32: Tourn. Value:] +RSInterface 641 - [34: Opponent:] +RSInterface 641 - [36: Tourn. Rank:] +RSInterface 641 - [37: 0] +RSInterface 643 - [19: Item Back History] +RSInterface 643 - [21: Offer type] +RSInterface 643 - [22: Item name] +RSInterface 643 - [23: Quantity] +RSInterface 643 - [24: Price] +RSInterface 643 - [25: xxxxxxxxxxxxx] +RSInterface 643 - [26: xxxxxxxxxxxxx] +RSInterface 643 - [27: xxxxxxxxxxxxx] +RSInterface 643 - [28: xxxxxxxxxxxxx] +RSInterface 643 - [29: xxxxxxxxxxxxx] +RSInterface 643 - [30: 2,000,000,000] +RSInterface 643 - [31: 2,000,000,000] +RSInterface 643 - [32: 2,000,000,000] +RSInterface 643 - [33: 2,000,000,000] +RSInterface 643 - [34: 2,000,000,000] +RSInterface 643 - [35: name name name name name] +RSInterface 643 - [36: name name name name name] +RSInterface 643 - [37: name name name name name] +RSInterface 643 - [38: name name name name name] +RSInterface 643 - [39: name name name name name] +RSInterface 643 - [40: 2,000,000,000 gp] +RSInterface 643 - [41: 2,000,000,000 gp] +RSInterface 643 - [42: 2,000,000,000 gp] +RSInterface 643 - [43: 2,000,000,000 gp] +RSInterface 643 - [44: 2,000,000,000 gp] +RSInterface 645 - [15: Grand Exchange Item Sets] +RSInterface 645 - [17: Click on a set you wish to purchase here
or click on a set in your inventory that you wish to sell.] +RSInterface 646 - [11: Step 4 : With your items placed on the Grand Exchange system, just wait a while and we will let you know when your items are traded.] +RSInterface 647 - [19: Items being dropped] +RSInterface 647 - [20: Items ready to be dropped] +RSInterface 647 - [24: 00] +RSInterface 647 - [26: Accept] +RSInterface 649 - [5: Stop viewing] +RSInterface 649 - [11: Centre] +RSInterface 649 - [12: North-west] +RSInterface 649 - [13: North-east] +RSInterface 649 - [14: South-east] +RSInterface 650 - [3: Defeat!] +RSInterface 650 - [4: Your clan has been defeated.] +RSInterface 651 - [3: Victory!] +RSInterface 651 - [4: Your clan is victorious!] +RSInterface 652 - [28: Gravestones] +RSInterface 653 - [6: Target:] +RSInterface 653 - [7: None] +RSInterface 653 - [9: Pickup penalty:] +RSInterface 653 - [10: 100 Sec] +RSInterface 653 - [12: Can't leave for:] +RSInterface 654 - [3: Bounty Hunters] +RSInterface 654 - [4: Players who hunt and kill assigned targets] +RSInterface 654 - [5: 1)] +RSInterface 654 - [6: 2)] +RSInterface 654 - [7: 3)] +RSInterface 654 - [8: 4)] +RSInterface 654 - [9: 5)] +RSInterface 654 - [10: 6)] +RSInterface 654 - [11: 7)] +RSInterface 654 - [12: 8)] +RSInterface 654 - [13: 9)] +RSInterface 654 - [14: 10)] +RSInterface 654 - [15: Nobody yet] +RSInterface 654 - [16: Nobody yet] +RSInterface 654 - [17: Nobody yet] +RSInterface 654 - [18: Nobody yet] +RSInterface 654 - [19: Nobody yet] +RSInterface 654 - [20: Nobody yet] +RSInterface 654 - [21: Nobody yet] +RSInterface 654 - [22: Nobody yet] +RSInterface 654 - [23: Nobody yet] +RSInterface 654 - [24: Nobody yet] +RSInterface 654 - [25: 0] +RSInterface 654 - [26: 0] +RSInterface 654 - [27: 0] +RSInterface 654 - [28: 0] +RSInterface 654 - [29: 0] +RSInterface 654 - [30: 0] +RSInterface 654 - [31: 0] +RSInterface 654 - [32: 0] +RSInterface 654 - [33: 0] +RSInterface 654 - [34: 0] +RSInterface 655 - [3: Rogues] +RSInterface 655 - [4: Players who hunt and kill anyone] +RSInterface 655 - [5: 1)] +RSInterface 655 - [6: 2)] +RSInterface 655 - [7: 3)] +RSInterface 655 - [8: 4)] +RSInterface 655 - [9: 5)] +RSInterface 655 - [10: 6)] +RSInterface 655 - [11: 7)] +RSInterface 655 - [12: 8)] +RSInterface 655 - [13: 9)] +RSInterface 655 - [14: 10)] +RSInterface 655 - [15: Nobody yet] +RSInterface 655 - [16: Nobody yet] +RSInterface 655 - [17: Nobody yet] +RSInterface 655 - [18: Nobody yet] +RSInterface 655 - [19: Nobody yet] +RSInterface 655 - [20: Nobody yet] +RSInterface 655 - [21: Nobody yet] +RSInterface 655 - [22: Nobody yet] +RSInterface 655 - [23: Nobody yet] +RSInterface 655 - [24: Nobody yet] +RSInterface 655 - [25: 0] +RSInterface 655 - [26: 0] +RSInterface 655 - [27: 0] +RSInterface 655 - [28: 0] +RSInterface 655 - [29: 0] +RSInterface 655 - [30: 0] +RSInterface 655 - [31: 0] +RSInterface 655 - [32: 0] +RSInterface 655 - [33: 0] +RSInterface 655 - [34: 0] +RSInterface 656 - [6: Players waiting (need X):] +RSInterface 656 - [7: 0] +RSInterface 656 - [9: Game starting in:] +RSInterface 657 - [22: WARNING!] +RSInterface 657 - [23: You are about to enter the Bounty Hunter minigame.

This is not a safe area - it involves player versus player combat and, if you die, you will lose all the items you are carrying!

If you kill players that are not your target, you will not be able to use the Protect Item prayer. Also you cannot drop items on the floor worth over 1000 gp.] +RSInterface 657 - [24: Enter
Crater] +RSInterface 657 - [25: Don't go] +RSInterface 657 - [26: Don't ask me this again] +RSInterface 660 - [98: Welcome to RuneScape
Use the buttons below to design your player] +RSInterface 660 - [101: Accept] +RSInterface 660 - [106: Design] +RSInterface 660 - [121: Head
Jaw
Torso
Arms
Hands
Legs
Feet] +RSInterface 660 - [122: Colour] +RSInterface 660 - [133: Hair
Torso
Legs
Feet
Skin] +RSInterface 660 - [136: Gender] +RSInterface 660 - [139: Male] +RSInterface 661 - [1: The runes must be in sets of three, I think, but I have had no luck in completing this conundrum. Perhaps, if my Thieving skills were greater, I could in some way interfere with the mechanism. May those who follow have more luck in this accursed place.
-Toralis of Menaphos] +RSInterface 663 - [17: 100%] +RSInterface 663 - [19: 9999] +RSInterface 664 - [0: %1] +RSInterface 664 - [8: Summon] +RSInterface 664 - [10: Auto-retaliate
(Off)] +RSInterface 664 - [26: S P E C I A L A T T A C K] +RSInterface 664 - [27: Combat Lvl: %1] +RSInterface 664 - [28: Bash] +RSInterface 664 - [29: Pound] +RSInterface 664 - [30: Focus] +RSInterface 666 - [14: Scroll Creation ] +RSInterface 667 - [1: Equip Your Character...] +RSInterface 667 - [22: Attack bonus] +RSInterface 667 - [23: Defence bonus] +RSInterface 667 - [24: Stab: +120] +RSInterface 667 - [25: Slash:+120] +RSInterface 667 - [26: Crush:+120] +RSInterface 667 - [27: Magic: +120] +RSInterface 667 - [28: Range: +120] +RSInterface 667 - [29: Stab: +120] +RSInterface 667 - [30: Slash: +120] +RSInterface 667 - [31: Crush: +120] +RSInterface 667 - [32: Magic: +120] +RSInterface 667 - [33: Range: +120] +RSInterface 667 - [34: Summoning: +120] +RSInterface 667 - [35: Other bonuses] +RSInterface 667 - [36: Strength: +120] +RSInterface 667 - [37: Prayer: +120] +RSInterface 667 - [38: %1kg] +RSInterface 668 - [0: Pick a Puppy] +RSInterface 669 - [14: Summoning Pouch Creation ] +RSInterface 671 - [14: Familiar Inventory] +RSInterface 672 - [14: Summoning Pouch Creation ] +RSInterface 673 - [14: Scroll Creation ] +RSInterface 676 - [13: Warning!] +RSInterface 676 - [14: This area is dangerous and death is more than a possibility! Are you sure you want to go down there?] +RSInterface 676 - [17: Proceed regardless] +RSInterface 676 - [18: Stay out] +RSInterface 676 - [19: Don't ask me this again] +RSInterface 677 - [13: Warning!] +RSInterface 677 - [14: This area is dangerous and death is more than a possibility! Are you sure you want to go down there?] +RSInterface 677 - [17: Proceed regardless] +RSInterface 677 - [18: Stay out] +RSInterface 677 - [19: Don't ask me this again] +RSInterface 678 - [13: Warning!] +RSInterface 678 - [14: This area is dangerous and death is more than a possibility! Are you sure you want to go down there?] +RSInterface 678 - [17: Proceed regardless] +RSInterface 678 - [18: Stay out] +RSInterface 678 - [19: Don't ask me this again] +RSInterface 679 - [2: Message of the week] +RSInterface 681 - [115: Close] +RSInterface 681 - [116: Repairs Complete] +RSInterface 681 - [117: You finish repairing the catapult. The Guard looks rather impressed.] +RSInterface 682 - [36: COUNTERWEIGHT] +RSInterface 682 - [37: DIRECTION] +RSInterface 683 - [46: Yes, Restart] +RSInterface 683 - [47: No, Cancel] +RSInterface 683 - [48: Are you sure you want to restart the puzzle?] +RSInterface 684 - [3: Watch out for rabbits wandering around the farmyard. They are hungry and will look for flags, as they often mean hidden food! If a rabbit eats the seed under a flag, you will not get any points for it and will lose the flag. ] +RSInterface 684 - [4: You can improve your Hunter skill by finding ogleroots in the farmyard and feeding them to the rabbits. Ogleroots are magical vegetables and will cause the rabbit to disappear for a short amount of time.] +RSInterface 685 - [14: Farmer Blinkin's Vinesweeper Instructions] +RSInterface 685 - [15: 1. Speak to either Mrs. Winkin in the barn or Farmer Blinkin outside to buy some flags.] +RSInterface 685 - [16: 2. When you have some flags, head out into the farmyard area over any of the 4 stiles.] +RSInterface 685 - [17: 3. Use your spade to dig up any of the holes around the farmyard. This will uncover what was in that hole. The aim is to place your flags in holes where you believe seeds are planted.] +RSInterface 685 - [18: 4. If the hole has nothing in it, then it will uncover a radius of 2 holes in all directions] +RSInterface 685 - [19: 5. If you uncover a number from 1-8, this means that there are that many seeds planted in the 8 holes surrounding the one that you have dug up.] +RSInterface 685 - [20: 6. When you have a square that you are certain contains a seed, either right-click and select the 'Flag' option or use a flag on the hole.] +RSInterface 685 - [21: 7. When a farmer sees a flag, he will come over to check beneath it. He will collect the flag and give points out if there was a seed there. If you have successfully found a seed, you will be able to get the flag back for free from either Mrs. Winkin or Farmer Blinkin.] +RSInterface 687 - [3: Use a spade to dig in the farmer's field and try to work out where the seeds have been planted. Try not to dig up the seeds, as this will lose you points! Usually, when you dig a square, you will uncover a number, which shows how many seeds are in the holes next to it.] +RSInterface 687 - [4: Plant your flags in holes where you think that seeds may be found. If you are correct, you will get lots of points, but if you are wrong, you will lose the flag. If you are close to other players, you might get some points if they find seeds, too!"] +RSInterface 688 - [3: While you are in the area, you will be able to see your points total in the top-right corner of your screen. Your points are saved, so you can leave if you wish and return another time to pick up from where you left off.] +RSInterface 688 - [4: You can trade your points in for prizes or Farming experience by speaking to Mrs. Winkin in the Winkin shop.] +RSInterface 688 - [8: Points] +RSInterface 688 - [9: 234,567] +RSInterface 688 - [11: XP] +RSInterface 689 - [7: Points] +RSInterface 689 - [8: None] +RSInterface 690 - [3: Farmers wander the area looking for seeds that have been dug up by mistake. They will also collect any flags you have placed, resetting the nearby area and giving you points if the flag is in the right place.] +RSInterface 690 - [4: If you place a flag over a seed, you will be able to get the flag back from Mrs. Winkin or Farmer Blinkin. If you placed a flag wrongly, you will have to pay 500gp for a new one.] +RSInterface 693 - [4: Congratulations] +RSInterface 693 - [5: Congratulations] +RSInterface 693 - [6: you have] +RSInterface 693 - [7: you have] +RSInterface 693 - [8: slain bork!] +RSInterface 694 - [5: Question:] +RSInterface 694 - [6: Player Safety Test] +RSInterface 694 - [8: A friend you met playing RuneScape has asked to meet you in real life. What should you do?] +RSInterface 694 - [9: Meet them. They've been a friend in-game for a while now and they're really nice] +RSInterface 694 - [10: Say no and do not meet them] +RSInterface 694 - [32: Correct!] +RSInterface 694 - [33: Be polite and say no, but if the other player is persistent you can use the report abuse button and ignore functions, which can both be found at the bottom of your game window. If you are at all concerned, speak to a parent, friend or adult that you trust.] +RSInterface 694 - [35: Incorrect!] +RSInterface 694 - [36: However nice your friend is in RuneScape, they are still a stranger to you in real life. We would suggest that you have fun and enjoy the player's company in-game, but leave it there. If you are at all concerned, speak to a parent, friend or adult that you trust.] +RSInterface 695 - [1: This naughty gublinchette gave a player her email address. The wise player hit the Report Abuse button straight away, allowing us to catch her!] +RSInterface 696 - [5: Question:] +RSInterface 696 - [6: Player Safety Test] +RSInterface 696 - [8: A player has started to ask you personal questions that make you feel uncomfortable and you'd rather not answer. What should you do? ] +RSInterface 696 - [9: Answer them anyway] +RSInterface 696 - [10: Do not answer any questions and report the player using the Report Abuse button at the bottom of the game screen.] +RSInterface 696 - [32: Correct!] +RSInterface 696 - [33: If you are at all concerned, speak to a parent, friend or adult that you trust.] +RSInterface 696 - [35: Incorrect!] +RSInterface 696 - [36: If another player makes you feel uncomfortable by asking lots of personal questions, you can report them using the Report Abuse button. You can also use the ignore function, which can be found at the bottom of your game window.] +RSInterface 697 - [6: Question:] +RSInterface 697 - [7: Player Safety Test] +RSInterface 697 - [9: A player has just asked you for your personal details, including your phone number, home address and email address. What should you do?] +RSInterface 697 - [10: Give them my personal details] +RSInterface 697 - [11: Say "No" or ignore them] +RSInterface 697 - [12: Say "No" and ask for their details instead] +RSInterface 697 - [38: Correct!] +RSInterface 697 - [39: Be polite and say no, but if the other player is persistent you can also use the report abuse button and ignore functions, which can both be found at the bottom of your game window. If you are at all concerned, speak to a parent, friend or adult that you trust.] +RSInterface 697 - [41: Incorrect!] +RSInterface 697 - [42: Giving out personal information to another player is dangerous, as you can never be sure who you are talking to. It's best to keep your personal details to yourself.] +RSInterface 697 - [44: Incorrect!] +RSInterface 697 - [45: Asking for another player's personal details is against the RuneScape Rules of Conduct. Doing so would put your account at risk of being banned.] +RSInterface 698 - [1: This cheeky gublinch claimed to be a Jagex Moderator! He was reported straight away and dealt with.] +RSInterface 699 - [5: Question:] +RSInterface 699 - [6: Player Safety Test] +RSInterface 699 - [8: Where should you go in order to read about playing RuneScape safely?] +RSInterface 699 - [9: There is nowhere to go] +RSInterface 699 - [10: To the 'Safety & Security' section of the RuneScape homepage] +RSInterface 699 - [32: Correct!] +RSInterface 699 - [33: Head to the 'Safety & Security' section of the RuneScape Knowledge Base for more information.] +RSInterface 699 - [35: Incorrect!] +RSInterface 699 - [36: Actually, there is! A "Play Safely" article can be found in the Safety & Security Guidelines section of the Knowledge Base! We also have pages on player safety, keeping healthy, responsible gaming and account security. If you would like more information, please go to the RuneScape Knowledge Base.] +RSInterface 700 - [11: Report abuse] +RSInterface 700 - [12: This form is for reporting players who are breaking our rules.
Using it sends a snapshot of the last 60 secs of activity to us.] +RSInterface 700 - [13: If you misuse this form, you will be banned.] +RSInterface 700 - [14: First please enter the name of the offending player below:] +RSInterface 700 - [15: **************] +RSInterface 700 - [16: Then click below to indicate which of our 13 rules is being broken.
For a detailed explanation of each rule please read the manual on our website.] +RSInterface 700 - [17: 1: Offensive language] +RSInterface 700 - [18: 2: Item scamming] +RSInterface 700 - [19: 3: Password scamming] +RSInterface 700 - [20: 4: Bug abuse] +RSInterface 700 - [21: 5: Jagex staff impersonation] +RSInterface 700 - [22: 6: Account sharing/trading] +RSInterface 700 - [23: 7: Macroing] +RSInterface 700 - [24: 8: Multiple logging in] +RSInterface 700 - [25: 9: Encouraging others to break rules] +RSInterface 700 - [26: 10: Misuse of customer support] +RSInterface 700 - [27: 11: Advertising / website] +RSInterface 700 - [28: 12: Real world item trading] +RSInterface 700 - [29: 13: Asking for personal details] +RSInterface 701 - [1: This wretched gublinch was asking a player for his telephone number. The player helped us catch him by refusing to give their information away and reporting the gublinch straight away!] +RSInterface 702 - [1: This foul-mouthed gublinch was flaming and insulting other players. They used the Report Abuse button and he was instantly apprehended.] +RSInterface 703 - [1: This vile gublinchette was asking a player for his home address. The clever player didn't give her their address, but used the Report Abuse button to report her instead.] +RSInterface 704 - [3: Question:] +RSInterface 704 - [4: Player Safety Test] +RSInterface 704 - [6: How do you report a player for breaking the Rules?] +RSInterface 704 - [7: By using the Report Abuse button at the bottom of my gaming screen] +RSInterface 704 - [8: I'm not a tell-tale, so I don't report players] +RSInterface 704 - [9: Find a Moderator and get them to report the player] +RSInterface 704 - [38: Correct!] +RSInterface 704 - [39: You can use the Report Abuse button at the bottom of the game screen, but make sure you only report players who break the rules.] +RSInterface 704 - [41: Incorrect!] +RSInterface 704 - [42: Reporting players who break the Rules allows us to ensure that RuneScape remains a positive and enjoyable environment for everyone. To find out everything you need to know about reporting rulebreakers in RuneScape, please take some time to read the Rules of Conduct and then see our guides on reporting abuse. This can be accessed by clicking on the link: 'Customer Support' on our homepage and then 'Reporting Abuse'. ] +RSInterface 704 - [44: Incorrect!] +RSInterface 704 - [45: Incorrect. By waiting to find a Moderator, you run the risk of losing the ability to report the player.] +RSInterface 705 - [3: Question:] +RSInterface 705 - [4: Player Safety Test] +RSInterface 705 - [6: A player that you do not know sends you a private message that is offensive. What should you do?] +RSInterface 705 - [7: Nothing. I can't report anything that is said in private chat] +RSInterface 705 - [8: Send the player an offensive message back] +RSInterface 705 - [9: Use the Report Abuse button to report the player and then add them to my Ignore List] +RSInterface 705 - [38: Correct!] +RSInterface 705 - [39: Correct! You can use the Report Abuse button to report any chat that you find offensive, whether it is said in Public or Private Chat. Adding a player to your Ignore List will prevent them from sending you any further messages.] +RSInterface 705 - [41: Incorrect!] +RSInterface 705 - [42: Wrong. You can use the Report Abuse button to report any chat that you find offensive, whether it is said in Public or Private Chat.] +RSInterface 705 - [44: Incorrect!] +RSInterface 705 - [45: Wrong. Retaliating may cause you to get in trouble and be reported yourself!] +RSInterface 706 - [1: This sly gublinch wanted to meet one of his player friends in the real world. The player obviously refused and reported him straight away.] +RSInterface 707 - [5: Question:] +RSInterface 707 - [6: Player Safety Test] +RSInterface 707 - [8: You are approached in the game by a player named JagMod999. This player claims to be a member of Jagex and asks for your personal details. What should you do?] +RSInterface 707 - [9: Do not answer any questions and report the player using the Report Abuse button at the bottom of the game screen] +RSInterface 707 - [10: Give them my details; they are a member of Jagex after all] +RSInterface 707 - [32: Correct!] +RSInterface 707 - [33: Correct! A real Jagex Moderator would never ask for a player's personal details. You can always tell who an official moderator is as a gold crown will appear before anything they say in the chat window. You can report any player who claims to be a member of Jagex Staff by using the Report Abuse button. You can also use the ignore function, which can be found at the bottom of your game window. If you are at all ] +RSInterface 707 - [34: concerned about the incident, speak to a parent, friend or adult that you trust.] +RSInterface 707 - [36: Incorrect!] +RSInterface 707 - [37: A real Jagex Moderator would never ask for any of your personal details, so we would advise you keep them to yourself. You can report any player who claims to be a Jagex Moderator by using the Report Abuse button.] +RSInterface 708 - [5: Question:] +RSInterface 708 - [6: Player Safety Test] +RSInterface 708 - [8: How long should you play RuneScape for at any one time?] +RSInterface 708 - [9: As long as I like. I'm having fun and don't want to stop] +RSInterface 708 - [10: I should take regular breaks in order to stay healthy] +RSInterface 708 - [32: Correct!] +RSInterface 708 - [33: It's very important to remain healthy by taking regular breaks and spending time doing other activities. ] +RSInterface 708 - [35: Incorrect!] +RSInterface 708 - [36: Spending too much time on the computer can be harmful to your health. It's very important to take breaks, exercise and eat properly in order to stay healthy. While it's great to play RuneScape, it's also important to maintain a balanced lifestyle by socialising and spending time away from your computer. For more information, please look at our Responsible Gaming Policy on the RuneScape Knowledge Base.] +RSInterface 709 - [14: End of Exam] +RSInterface 709 - [15: Player Safety Exam 101] +RSInterface 709 - [17: Congratulations! You have completed the Player Safety exam!] +RSInterface 710 - [3: Question:] +RSInterface 710 - [4: Player Safety Test] +RSInterface 710 - [6: You are asked for your full name and date of birth by a player that you have been chatting with for a short while. Should you give them these details?] +RSInterface 710 - [7: No. The player could use my information to steal my identity. I don't want anyone pretending to be me] +RSInterface 710 - [8: Yes. There's no harm in telling someone my full name and my birthday. Maybe they want to buy me a birthday present!] +RSInterface 710 - [32: Correct!] +RSInterface 710 - [33: Correct! Personal details given out while chatting could be used by someone who wishes to pretend to be you. Use the Report Abuse button to report anyone asking for your personal details.] +RSInterface 710 - [35: Incorrect!] +RSInterface 710 - [36: Wrong. Never give out personal details, such as your full name and date of birth, to other players. Personal details that you give out while chatting could be used by someone so that they can pretend to be you. Use the Report Abuse button to report anyone asking for your personal details.] +RSInterface 711 - [1: This evil gublinch asked a younger player where she went to school. The player was smart enough to not tell the gublinch and report him instead.] +RSInterface 712 - [1: Dear friend,] +RSInterface 712 - [2: Come and meet me at the entrance to the Legends' Guild as soon as possible. There are things I would like to discuss with you, but it is difficult to talk in Witchaven...] +RSInterface 712 - [3: ~Kent] +RSInterface 715 - [4: Message of the week] +RSInterface 716 - [33: Chocatrice] +RSInterface 716 - [34: Waiting] +RSInterface 717 - [20: Temperature reached!

New target
temperature set.] +RSInterface 718 - [0: Select an Option] +RSInterface 718 - [1: option1] +RSInterface 718 - [2: option2] +RSInterface 719 - [3: COAL AND WATER SUPPLIES:
For your convenience, the incubator has a coal scuttle and water tank, which can hold up to twelve buckets of coal or water respectively. Simply use a bucket of coal or water on the coal scuttle or water tank to add to the supplies.

ADJUSTING THE INCUBATOR TEMPERATURE:
The control panel to the left of the incubator allows you to use the coal and water supplies you have added to the incubator to heat or cool it.

INCUBATING AN EGG:
> Place a suitable egg inside the incubation chamber.
> Add supplies to the water tank and coal scuttle
> Using the incubator controls, adjust the temperature. The temperature gauge has a needle which shows the current temperature. The top of the temperature gauge also has an arrow showing the temperature needed to reach the next phase of incubation.
> Some eggs may require you to reach several different temperatures before they hatch.

The very best of luck with hatching your eggs!] +RSInterface 723 - [5: ~ What is this? ~] +RSInterface 724 - [18: Runesquares] +RSInterface 724 - [20: vs] +RSInterface 724 - [22: Close] +RSInterface 725 - [18: Runelink] +RSInterface 725 - [21: vs] +RSInterface 725 - [23: Close] +RSInterface 726 - [114: Runeversi] +RSInterface 726 - [116: vs] +RSInterface 726 - [118: Close] +RSInterface 727 - [18: Draughts] +RSInterface 727 - [22: vs] +RSInterface 727 - [24: Close] +RSInterface 730 - [15: Please pick up a stone!] +RSInterface 730 - [17: Charge:] +RSInterface 730 - [18: Name] +RSInterface 730 - [20: Hunting:] +RSInterface 730 - [22: Hunted by:] +RSInterface 730 - [24: Time left:] +RSInterface 731 - [7: Rating] +RSInterface 731 - [16: Text] +RSInterface 731 - [25: The following item is not allowed in the arena:] +RSInterface 733 - [2: Ivandis Flail] +RSInterface 733 - [3: Ivandis flail requires silvthril chain to connect blessed silver sickle to. However, to increase charges for the flail, need to add an emerald to the sickle before chain is attached. ] +RSInterface 733 - [4: Find it difficult to make big hole for emerald to fit in sickle and am just frustrated. More effort to make this work is just crazy, why won't it just work?? ] +RSInterface 734 - [20: Choose a combination] +RSInterface 734 - [21: Teleport to this location] +RSInterface 734 - [22: Teleport to this location] +RSInterface 735 - [11: Travel Log] +RSInterface 737 - [0: Pick a Kitten] +RSInterface 738 - [1: Tok-Xil-Im] +RSInterface 738 - [2: Tok-Ket-Hurt] +RSInterface 738 - [3: TokJal-Hurt] +RSInterface 738 - [4: a] +RSInterface 738 - [5: ah] +RSInterface 738 - [6: ac] diff --git a/dumps/498/498_interface_scripts.txt b/dumps/498/498_interface_scripts.txt new file mode 100644 index 000000000..ff527257f --- /dev/null +++ b/dumps/498/498_interface_scripts.txt @@ -0,0 +1,4357 @@ +Interface 13 child 1 (script default): [184745984, 4521984, 0, null, 184549376, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 2 (script default): [201523200, 4521984, 0, null, 201326592, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 3 (script default): [218300416, 4521984, 0, null, 218103808, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 4 (script default): [235077632, 4521984, 0, null, 234881024, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 5 (script default): [251854848, 4521984, 0, null, 251658240, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 6 (script default): [268632064, 4521984, 0, null, 268435456, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 7 (script default): [285409280, 4521984, 0, null, 285212672, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 8 (script default): [302186496, 4521984, 0, null, 301989888, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 9 (script default): [318963712, 4521984, 0, null, 318767104, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 10 (script default): [335740928, 4521984, 0, null, 335544320, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 11 (script 2): [null, -2147483645] +Interface 13 child 11 (script 7): [700, -2147483645] +Interface 13 child 12 (script 2): [null, -2147483645] +Interface 13 child 12 (script 7): [700, -2147483645] +Interface 13 child 13 (script 2): [null, -2147483645] +Interface 13 child 13 (script 7): [700, -2147483645] +Interface 13 child 14 (script 2): [null, -2147483645] +Interface 13 child 14 (script 7): [700, -2147483645] +Interface 13 child 15 (script 2): [null, -2147483645] +Interface 13 child 15 (script 7): [700, -2147483645] +Interface 13 child 16 (script 2): [null, -2147483645] +Interface 13 child 16 (script 7): [700, -2147483645] +Interface 13 child 17 (script 2): [null, -2147483645] +Interface 13 child 17 (script 7): [700, -2147483645] +Interface 13 child 18 (script 2): [null, -2147483645] +Interface 13 child 18 (script 7): [700, -2147483645] +Interface 13 child 19 (script 2): [null, -2147483645] +Interface 13 child 19 (script 7): [700, -2147483645] +Interface 13 child 20 (script 2): [null, -2147483645] +Interface 13 child 20 (script 7): [700, -2147483645] +Interface 13 child 21 (script 2): [null, -2147483645] +Interface 13 child 21 (script 7): [3] +Interface 13 child 21 (script 11): [null, -2147483645] +Interface 13 child 21 (script 16): [0] +Interface 13 child 22 (script 2): [null, -2147483645] +Interface 13 child 22 (script 7): [3, 697] +Interface 13 child 22 (script 9): [196608, 131072, 0, 0, , 36896768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 23 (script 2): [null, -2147483645] +Interface 13 child 23 (script 7): [3, 697, -2147483645] +Interface 13 child 23 (script 12): [0, 0, 65536] +Interface 13 child 23 (script 13): [null, 0] +Interface 13 child 24 (script 2): [null, -2147483645] +Interface 13 child 24 (script 7): [3, 697, -2147483645, 4] +Interface 13 child 29 (script 2): [null, -2147483645] +Interface 13 child 29 (script 3): [45, -2147483645, 14784543] +Interface 13 child 29 (script 4): [45, -2147483645, 12547357] +Interface 13 child 29 (script 7): [699, -2147483645] +Interface 13 child 30 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 13 child 32 (script 3): [698, -2147483645] +Interface 13 child 32 (script 16): [144128] +Interface 14 child 3 (script 1): [536, null, 44] +Interface 14 child 3 (script 3): [196608, 35061760, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 14 child 60 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 14 child 61 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 14 child 62 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 14 child 63 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 14 child 64 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 14 child 65 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 14 child 89 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 8 (script 1): [1065, null, 44] +Interface 27 child 8 (script 3): [196608, 69730304, 1, 517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 101 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 103 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 105 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 107 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 109 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 111 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 113 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 115 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 117 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 119 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 121 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 123 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 125 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 127 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 129 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 131 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 133 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 135 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 137 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 139 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 141 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 143 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 145 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 147 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 149 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 151 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 153 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 155 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 157 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 27 child 159 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 61 child 29 (script 1): [486539264, null, null, null, 44, 3997725, 539, 0, 256, 7424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 23 (script 3): [6225921, 17359, null, 67, 6225921, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 24 (script 3): [6225922, 17359, null, 67, 6225922, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 25 (script 3): [6225923, 17359, null, 67, 6225923, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 26 (script 3): [6225924, 17359, null, 67, 6225924, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 27 (script 3): [6225925, 17359, null, 67, 6225925, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 28 (script 3): [6225926, 17359, null, 67, 6225926, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 29 (script 3): [6225927, 17359, null, 67, 6225927, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 30 (script 3): [6225928, 17359, null, 67, 6225928, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 31 (script 3): [6225929, 17359, null, 67, 6225929, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 32 (script 3): [6225930, 17359, null, 67, 6225930, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 95 child 33 (script 3): [6225931, 17359, null, 67, 6225931, 17360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 102 child 13 (script 1): [832, null, 44] +Interface 102 child 13 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 19 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 20 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 21 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 22 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 23 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 24 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 25 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 26 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 27 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 28 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 29 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 30 (script 3): [-2147483645, 16696461, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 104 child 38 (script 1): [832, null, 44] +Interface 104 child 38 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 13 (script 1): [832, null, 44] +Interface 105 child 13 (script 3): [196608, 54460416, 1, 29, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 14 (script 2): [null, 1] +Interface 105 child 14 (script 6): [null, 0] +Interface 105 child 14 (script 14): [283904, 72876032, null, null, 284160] +Interface 105 child 14 (script 16): [null, 0, 0, 0] +Interface 105 child 30 (script 2): [null, 6881309] +Interface 105 child 30 (script 3): [637, 6881309] +Interface 105 child 30 (script 11): [647, -2147483645, 6881313, Buy, 25, 100] +Interface 105 child 30 (script 12): [40, 6881313] +Interface 105 child 31 (script 2): [null, 6881308] +Interface 105 child 31 (script 3): [641, 6881308] +Interface 105 child 31 (script 11): [647, -2147483645, 6881313, Sell, 25, 100] +Interface 105 child 31 (script 12): [40, 6881313] +Interface 105 child 46 (script 2): [null, 6881325] +Interface 105 child 46 (script 3): [637, 6881325] +Interface 105 child 46 (script 11): [647, -2147483645, 6881329, Buy, 25, 100] +Interface 105 child 46 (script 12): [40, 6881329] +Interface 105 child 47 (script 2): [null, 6881324] +Interface 105 child 47 (script 3): [641, 6881324] +Interface 105 child 47 (script 11): [647, -2147483645, 6881329, Sell, 25, 100] +Interface 105 child 47 (script 12): [40, 6881329] +Interface 105 child 62 (script 2): [null, 6881341] +Interface 105 child 62 (script 3): [637, 6881341] +Interface 105 child 62 (script 11): [647, -2147483645, 6881345, Buy, 25, 100] +Interface 105 child 62 (script 12): [40, 6881345] +Interface 105 child 63 (script 2): [null, 6881340] +Interface 105 child 63 (script 3): [641, 6881340] +Interface 105 child 63 (script 11): [647, -2147483645, 6881345, Sell, 25, 100] +Interface 105 child 63 (script 12): [40, 6881345] +Interface 105 child 81 (script 2): [null, 6881360] +Interface 105 child 81 (script 3): [637, 6881360] +Interface 105 child 81 (script 11): [647, -2147483645, 6881364, Buy, 25, 100] +Interface 105 child 81 (script 12): [40, 6881364] +Interface 105 child 82 (script 2): [null, 6881359] +Interface 105 child 82 (script 3): [641, 6881359] +Interface 105 child 82 (script 11): [647, -2147483645, 6881364, Sell, 25, 100] +Interface 105 child 82 (script 12): [40, 6881364] +Interface 105 child 100 (script 2): [null, 6881379] +Interface 105 child 100 (script 3): [637, 6881379] +Interface 105 child 100 (script 11): [647, -2147483645, 6881383, Buy, 25, 100] +Interface 105 child 100 (script 12): [40, 6881383] +Interface 105 child 101 (script 2): [null, 6881378] +Interface 105 child 101 (script 3): [641, 6881378] +Interface 105 child 101 (script 11): [647, -2147483645, 6881383, Sell, 25, 100] +Interface 105 child 101 (script 12): [40, 6881383] +Interface 105 child 119 (script 2): [null, 6881398] +Interface 105 child 119 (script 3): [637, 6881398] +Interface 105 child 119 (script 11): [647, -2147483645, 6881402, Buy, 25, 100] +Interface 105 child 119 (script 12): [40, 6881402] +Interface 105 child 120 (script 2): [null, 6881397] +Interface 105 child 120 (script 3): [641, 6881397] +Interface 105 child 120 (script 11): [647, -2147483645, 6881402, Sell, 25, 100] +Interface 105 child 120 (script 12): [40, 6881402] +Interface 105 child 127 (script default): [null, 616, -2147483645] +Interface 105 child 127 (script 7): [591] +Interface 105 child 127 (script 8): [649, -2147483645, 6881493, Back to offer summary, 25, 300] +Interface 105 child 129 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 131 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 140 (script default): [40, 6881493] +Interface 105 child 140 (script 8): [38, -2147483645, 6881493, Current item Market Price, 25, 300] +Interface 105 child 145 (script default): [40, 6881493] +Interface 105 child 145 (script 8): [38, -2147483645, 6881493, Current item price range (Minimum/Maximum Price), 25, 300] +Interface 105 child 157 (script default): [40, 6881493] +Interface 105 child 157 (script 7): [596] +Interface 105 child 157 (script 8): [649, -2147483645, 6881493, Decrease quantity by 1, 25, 300] +Interface 105 child 158 (script default): [197120, 157184, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 159 (script 3): [6881493, 0, 16777216, null, null, null, 649, -2147483645, 6881493, Increase quantity by 1, 25, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 160 (script default): [197120, 156672, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 161 (script default): [197120, 165120, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 162 (script default): [40, 6881493] +Interface 105 child 162 (script 7): [598] +Interface 105 child 163 (script default): [197120, 165120, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 164 (script default): [40, 6881493] +Interface 105 child 164 (script 7): [599] +Interface 105 child 165 (script default): [197120, 165120, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 166 (script default): [40, 6881493] +Interface 105 child 166 (script 7): [600] +Interface 105 child 167 (script default): [197120, 165120, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 168 (script default): [40, 6881493] +Interface 105 child 168 (script 7): [865] +Interface 105 child 169 (script default): [197120, 165120, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 170 (script default): [40, 6881493] +Interface 105 child 170 (script 8): [649, -2147483645, 6881493, Enter custom quantity, 25, 300] +Interface 105 child 171 (script default): [40, 6881493] +Interface 105 child 171 (script 7): [604] +Interface 105 child 171 (script 8): [649, -2147483645, 6881493, Decrease price by 1, 25, 300] +Interface 105 child 172 (script default): [197120, 157184, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 173 (script default): [40, 6881493] +Interface 105 child 173 (script 7): [605] +Interface 105 child 173 (script 8): [649, -2147483645, 6881493, Increase price by 1, 25, 300] +Interface 105 child 174 (script default): [197120, 156672, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 175 (script default): [197120, 165120, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 177 (script default): [40, 6881493] +Interface 105 child 177 (script 7): [606] +Interface 105 child 177 (script 8): [649, -2147483645, 6881493, Set price to item's Minimum Price, 25, 300] +Interface 105 child 178 (script default): [197120, 165120, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 180 (script default): [40, 6881493] +Interface 105 child 180 (script 7): [607] +Interface 105 child 180 (script 8): [649, -2147483645, 6881493, Set price to item's Market Price, 25, 300] +Interface 105 child 181 (script default): [197120, 165120, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 183 (script default): [40, 6881493] +Interface 105 child 183 (script 7): [608] +Interface 105 child 183 (script 8): [649, -2147483645, 6881493, Set price to item's Maximum Price, 25, 300] +Interface 105 child 184 (script default): [197120, 165120, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 185 (script default): [40, 6881493] +Interface 105 child 185 (script 8): [649, -2147483645, 6881493, Enter custom price, 25, 300] +Interface 105 child 189 (script default): [40, 6881493] +Interface 105 child 190 (script 3): [-2147483645, null, 97, -2147483645, null, 653, -2147483645, 0, 393216, 42532992, 196608, null, -721337489, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 193 (script default): [40, 6881493] +Interface 105 child 193 (script 8): [649, -2147483645, 6881493, Click here to search for an item to buy, 25, 300] +Interface 105 child 194 (script 2): [null, 6881416] +Interface 105 child 194 (script 4): [null, null, null, null, 665, 6881416, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 198 (script default): [40, 6881493] +Interface 105 child 198 (script 8): [649, -2147483645, 6881493, Use your inventory to select an item to sell here, 25, 300] +Interface 105 child 203 (script 2): [null, -2147483645] +Interface 105 child 203 (script 10): [649, -2147483645, 6881493, Abort offer, 25, 100] +Interface 105 child 203 (script 11): [618, -2147483645] +Interface 105 child 208 (script default): [196863, null, null, null, null, 665, -2147483645, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 105 child 210 (script default): [196863, null, null, null, null, 665, -2147483645, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 106 child 13 (script 1): [832, null, 44] +Interface 106 child 13 (script 3): [196608, 54460416, 1, 29, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 106 child 14 (script 2): [null, 0] +Interface 106 child 125 (script default): [1175, null, 44] +Interface 106 child 125 (script 2): [196608, 76939264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 108 child 13 (script 1): [832, null, 44] +Interface 108 child 13 (script 3): [196608, 54460416, 1, 29, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 108 child 18 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 108 child 20 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 108 child 70 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 108 child 95 (script 1): [1175, null, 44] +Interface 108 child 95 (script 3): [196608, 76939264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 109 child 13 (script 1): [832, null, 44] +Interface 109 child 13 (script 3): [196608, 54460416, 1, 29, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 109 child 15 (script 2): [null, 0] +Interface 109 child 15 (script 3): [656] +Interface 109 child 15 (script 16): [133888, 34340864, null, null, 134656, 34537472] +Interface 109 child 15 (script 17): [null, 0] +Interface 109 child 17 (script 2): [null, -2147483645] +Interface 109 child 22 (script 2): [null, -2147483645] +Interface 109 child 27 (script 2): [null, -2147483645] +Interface 109 child 35 (script 2): [null, -2147483645] +Interface 109 child 43 (script 2): [null, -2147483645] +Interface 109 child 51 (script 2): [null, -2147483645] +Interface 110 child 13 (script 1): [832, null, 44] +Interface 110 child 13 (script 3): [196608, 54460416, 1, 29, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 110 child 18 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 110 child 20 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 110 child 68 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 110 child 90 (script default): [1175, null, 44] +Interface 110 child 90 (script 2): [196608, 76939264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 134 child 3 (script 2): [789, -2147483645] +Interface 134 child 4 (script default): [789, -2147483645] +Interface 134 child 5 (script 2): [789, -2147483645] +Interface 134 child 6 (script 1): [789, -2147483645] +Interface 134 child 7 (script 3): [null, -2147483645, 0] +Interface 134 child 8 (script 1): [789, -2147483645] +Interface 134 child 9 (script 2): [789, -2147483645] +Interface 134 child 10 (script 3): [null, -2147483645, 0] +Interface 134 child 11 (script default): [789, -2147483645] +Interface 134 child 12 (script default): [789, -2147483645] +Interface 134 child 13 (script default): [789, -2147483645] +Interface 134 child 14 (script default): [789, -2147483645] +Interface 134 child 15 (script 2): [789, -2147483645] +Interface 134 child 16 (script default): [789, -2147483645] +Interface 134 child 17 (script 3): [null, -2147483645, 0] +Interface 134 child 18 (script 3): [null, -2147483645, 0] +Interface 134 child 19 (script 2): [789, -2147483645] +Interface 134 child 20 (script 3): [null, -2147483645, 0] +Interface 134 child 21 (script 1): [789, -2147483645] +Interface 134 child 22 (script 2): [789, -2147483645] +Interface 134 child 23 (script 3): [null, -2147483645, 0] +Interface 134 child 24 (script default): [789, -2147483645] +Interface 134 child 25 (script 2): [789, -2147483645] +Interface 134 child 26 (script 1): [789, -2147483645] +Interface 134 child 27 (script 3): [8781851, 16777215, null, 45, 8781851, 6710886, 65536, 51773440, 0, 0, , 17104896, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 1 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 3 (script 3): [-2147483645, 8978434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 4 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 5 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 6 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 7 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 8 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 9 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 10 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 11 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 12 (script 13): [86, -2147483644, event_opbase] +Interface 137 child 13 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 14 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 15 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 16 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 17 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 18 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 19 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 20 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 21 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 22 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 23 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 24 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 25 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 26 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 27 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 28 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 29 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 30 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 31 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 32 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 33 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 34 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 35 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 36 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 37 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 38 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 39 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 40 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 41 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 42 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 43 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 44 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 45 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 46 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 47 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 48 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 49 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 50 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 51 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 52 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 53 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 54 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 55 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 56 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 57 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 58 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 59 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 60 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 61 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 62 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 63 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 64 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 65 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 66 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 67 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 68 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 69 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 70 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 71 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 72 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 73 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 74 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 75 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 76 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 77 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 78 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 79 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 80 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 81 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 82 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 83 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 84 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 85 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 86 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 87 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 88 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 89 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 90 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 91 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 92 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 93 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 94 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 95 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 96 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 97 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 98 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 99 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 100 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 101 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 137 child 102 (script default): [0, 0, 3, 86, -2147483644, event_opbase, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 140 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 140 child 3 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 154 child 12 (script 1): [832, null, 44] +Interface 154 child 12 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 154 child 15 (script 2): [null, -2147483645] +Interface 154 child 15 (script 7): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 154 child 17 (script 2): [null, -2147483645] +Interface 154 child 17 (script 7): [0] +Interface 154 child 19 (script 2): [null, -2147483645] +Interface 154 child 19 (script 7): [0, 0, 0, 0, 0, 0, 0] +Interface 154 child 21 (script 2): [null, -2147483645] +Interface 154 child 21 (script 7): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 154 child 23 (script 2): [null, -2147483645] +Interface 154 child 23 (script 7): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 154 child 25 (script 2): [null, -2147483645] +Interface 154 child 25 (script 7): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 154 child 27 (script 2): [null, -2147483645] +Interface 154 child 27 (script 7): [0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 154 child 28 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 154 child 29 (script 3): [0] +Interface 157 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 158 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 159 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 160 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 161 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 162 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 163 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 164 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 165 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 166 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 167 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 168 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 169 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 170 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 171 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 172 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 173 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 174 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 175 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 176 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 177 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 187 child 1 (script 3): [832] +Interface 187 child 1 (script 16): [5120, 1376256, 369098752, null, 6144, 1638400, *, 20381696, Z, 27131904, ?, 39190528, null, null, 184576, 59375616, null, null, 282624, 74448896] +Interface 187 child 1 (script 17): [null, 307712, 0, 0] +Interface 187 child 11 (script 1): [65536, 54722560, 65536, 54788352, 213504, 0, null, 4864, 30539776, ), 0, 0, 0, 0, 0] +Interface 188 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 8816303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 188 child 3 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 8816303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 188 child 4 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 8816303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 188 child 5 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 8816303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 188 child 6 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 8816303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 188 child 7 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 8816303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 188 child 8 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 8816303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 0 (script default): [1056964608, d, 103936, 1, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22177137, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 16777215, null, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 1 (script 1): [12582975, 15, 65] +Interface 192 child 1 (script 6): [Wind Strike] +Interface 192 child 1 (script 7): [null] +Interface 192 child 1 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 1, 558, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 2 (script 1): [12582975, 16, 66] +Interface 192 child 2 (script 6): [Confuse, Reduces your opponent's attack by 5%, 555] +Interface 192 child 2 (script 11): [557, 2, 559] +Interface 192 child 2 (script 16): [-1] +Interface 192 child 3 (script default): [1056964608, f, 104448, 1025, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21850478, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 16777215, null, 0, -1, 0, -1, 0, -1, 0, 16, 6, -2147483645, 12582975, 358, 408, 4, Enchant Crossbow Bolt, Minimum level 4 Magic Multiple other requirements, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 4 (script 1): [12582975, 17, 67] +Interface 192 child 4 (script 6): [Water Strike, A basic Water missile, 555, 1, 556] +Interface 192 child 4 (script 11): [558] +Interface 192 child 4 (script 16): [-1] +Interface 192 child 5 (script 1): [12582975, 18, 68] +Interface 192 child 5 (script 6): [Lvl-1 Enchant, For use on sapphire jewellery, 555, 1, 564, 1, -1] +Interface 192 child 5 (script 13): [null, null, null, 0, 16, 6, -2147483645, 12582975, 18, 68, 7, Lvl-1 Enchant, For use on sapphire jewellery, 555, 1, 564, 1, -1, 0, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 6 (script 1): [12582975, 19, 69] +Interface 192 child 6 (script 6): [Earth Strike, A basic Earth missile, 557, 2, 556, 1, 558, 1, -1] +Interface 192 child 7 (script 1): [12582975, 20, 70] +Interface 192 child 7 (script 6): [Weaken, Reduces your opponent's
strength by 5%, 555, 3, 557, 2, 559, 1, -1, 0, 0] +Interface 192 child 8 (script 1): [12582975, 21, 71] +Interface 192 child 8 (script 6): [Fire Strike, A basic Fire missile, 554, 3, 556, 2, 558, 1, -1, 0, 0, 0, 0] +Interface 192 child 9 (script default): [1056964608, 369098752, 1207959552, 251740783, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21194849, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 555, 2, 561, 1, -1, 0, 16, 6, -2147483645, 12582975, 22, 72, 15, Bones to Bananas, Changes all held bones into bananas, 557, 2, 555, 2, 561, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 10 (script 1): [12582975, 23, 73] +Interface 192 child 10 (script 6): [Wind Bolt, A low level Air missile, 556, 2, 562, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 11 (script 1): [12582975, 24, 74] +Interface 192 child 11 (script 6): [Curse, Reduces your opponent's
defence by 5%, 555, 2, 557, 3, 559, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 12 (script 1): [12582975, 319, 369] +Interface 192 child 12 (script 6): [Bind, Holds your opponent for 5 seconds, 557, 3, 555, 3, 561, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 13 (script 1): [12582975, 25, 75] +Interface 192 child 13 (script 6): [Low Level Alchemy, Converts an item into gold, 554, 3, 561, 1, -1, 0, -1, 0, 16, 6, -2147483645, 12582975, 25, 75, 21, Low Level Alchemy, Converts an item into gold, 554, 3] +Interface 192 child 13 (script 10): [null, 1] +Interface 192 child 13 (script 12): [null, null, null, 0, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 14 (script 1): [12582975, 26, 76] +Interface 192 child 14 (script 6): [Water Bolt, A low level Water missile, 555, 2, 556, 2, 562, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 15 (script default): [1056964608, 452984832, 1291845632, 419518049, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 1, 556, 3, 563, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 16 (script 1): [12582975, 28, 78] +Interface 192 child 16 (script 6): [Lvl-2 Enchant, For use on emerald jewellery, 556, 3, 564, 1, -1, 0, -1, 0, 16, 6, -2147483645, 12582975, 28, 78, 27, Lvl-2 Enchant, For use on emerald jewellery, 556, 3, 564, 1, -1, 0, -1, 0] +Interface 192 child 16 (script 19): [279552] +Interface 192 child 17 (script 1): [12582975, 29, 79] +Interface 192 child 17 (script 6): [Earth Bolt, A low level Earth missile, 557, 3, 556, 2, 562, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 18 (script default): [1056964608, 503316480, 1342177280, 520178805, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 1, 556, 3, 563, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 19 (script 1): [12582975, 31, 81] +Interface 192 child 19 (script 6): [Telekinetic Grab, Take an item you can see but can't reach, 556, 1, 563, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 20 (script 1): [12582975, 32, 82] +Interface 192 child 20 (script 6): [Fire Bolt, A low level Fire missile, 554, 4, 556, 3, 562, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 21 (script default): [1056964608, 553648128, 1392508928, 620840545, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 1, 556, 3, 563, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 22 (script 1): [12582975, 34, 84] +Interface 192 child 22 (script 6): [Crumble Undead, Hits skeletons, ghosts, shades & zombies hard, 557, 2, 556, 2, 562, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 23 (script default): [1056964608, c, 103680, 10241, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 1, 556, 1, 557, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 24 (script 1): [12582975, 35, 85] +Interface 192 child 24 (script 6): [Wind Blast, A medium level Air missile, 556, 3, 560, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 25 (script 1): [12582975, 36, 86] +Interface 192 child 25 (script 6): [Superheat Item, Smelt ore without a furnace, 554, 4, 561, 1, -1, 0, -1, 0, 16, 6, -2147483645, 12582975, 36, 86, 43, Superheat Item, Smelt ore without a furnace, 554, 4, 561, 1, -1, 0, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 26 (script default): [1056964608, 620756992, 1459617792, 755057505, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 5, 563, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 27 (script 1): [12582975, 38, 88] +Interface 192 child 27 (script 6): [Water Blast, A medium level Water missile, 555, 3, 556, 3, 560, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 28 (script 1): [12582975, 39, 89] +Interface 192 child 28 (script 6): [Lvl-3 Enchant, For use on ruby jewellery, 554, 5, 564, 1, -1, 0, -1, 0, 16, 6, -2147483645, 12582975, 39, 89, 49, Lvl-3 Enchant, For use on ruby jewellery, 554, 5, 564, 1, -1, 0, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 29 (script 1): [12582975, 53, 103] +Interface 192 child 29 (script 6): [Iban Blast, Summons the wrath of Iban, 554, 5, 560, 1, 1409, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 30 (script 1): [12582975, 320, 370] +Interface 192 child 30 (script 6): [Snare, Holds your opponent for 10 seconds, 557, 4, 555, 4, 561, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 31 (script 1): [12582975, 324, 374] +Interface 192 child 31 (script 6): [Magic Dart, A magic dart of slaying, 4170, 1, 560, 1, 558, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 32 (script default): [1056964608, 905969664, 1744830464, 855720306, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 563, 2, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 33 (script 1): [12582975, 40, 90] +Interface 192 child 33 (script 6): [Earth Blast, A medium level Earth missile, 557, 4, 556, 3, 560, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 34 (script 1): [12582975, 41, 91] +Interface 192 child 34 (script 6): [High Level Alchemy, Converts an item into more gold, 554, 5, 561, 1, -1, 0, -1, 0, 16, 6, -2147483645, 12582975, 41, 91, 55, High Level Alchemy, Converts an item into more gold, 554, 5, 561, 1, -1, 0, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 35 (script 1): [12582975, 42, 92] +Interface 192 child 35 (script 6): [Charge Water Orb, Needs to be cast on a water obelisk, 555, 30, 564, 3, 567, 1, -1, 0, 16, 6, -2147483645, 12582975, 42, 92, 56, Charge Water Orb, Needs to be cast on a water obelisk, 555, 30, 564, 3, 567, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 36 (script 1): [12582975, 43, 93] +Interface 192 child 36 (script 6): [Lvl-4 Enchant, For use on diamond jewellery, 557, 10, 564, 1, -1, 0, -1, 0, 16, 6, -2147483645, 12582975, 43, 93, 57, Lvl-4 Enchant, For use on diamond jewellery, 557, 10, 564, 1, -1, 0, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 37 (script default): [1056964608, 922746880, 1761607680, 973166433, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 563, 2, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 38 (script 1): [12582975, 44, 94] +Interface 192 child 38 (script 6): [Fire Blast, A medium level Fire missile, 554, 5, 556, 4, 560, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 39 (script 1): [12582975, 45, 95] +Interface 192 child 39 (script 6): [Charge Earth Orb, Needs to be cast on an earth obelisk, 557, 30, 564, 3, 567, 1, -1, 0, 16, 6, -2147483645, 12582975, 45, 95, 60, Charge Earth Orb, Needs to be cast on an earth obelisk, 557, 30, 564, 3, 567, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 40 (script default): [1056964608, b, 103424, 15361, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22312306, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 555, 4, 557, 4, -1, 0, 16, 6, -2147483645, 12582975, 354, 404, 60, Bones to Peaches, Turns Bones into Peaches, 561, 2, 555, 4, 557, 4, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 41 (script 1): [12582975, 61, 111] +Interface 192 child 41 (script 6): [Saradomin strike, Summons the power of Saradomin, 554, 2, 565, 2, 556, 4, 2415, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 42 (script 1): [12582975, 60, 110] +Interface 192 child 42 (script 6): [Claws of Guthix, Summons the power of Guthix, 554, 1, 565, 2, 556, 4, 8843, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 43 (script 1): [12582975, 59, 109] +Interface 192 child 43 (script 6): [Flames of Zamorak, Summons the power of Zamorak, 554, 4, 565, 2, 556, 1, 2417, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 44 (script default): [1056964608, C, 95488, 15617, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 563, 2, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 45 (script 1): [12582975, 46, 96] +Interface 192 child 45 (script 6): [Wind Wave, A high level Air missile, 556, 5, 565, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 46 (script 1): [12582975, 47, 97] +Interface 192 child 46 (script 6): [Charge Fire Orb, Needs to be cast on a fire obelisk, 554, 30, 564, 3, 567, 1, -1, 0, 16, 6, -2147483645, 12582975, 47, 97, 63, Charge Fire Orb, Needs to be cast on a fire obelisk, 554, 30, 564, 3, 567, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 47 (script default): [1056964608, e, 104192, 16385, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 555, 2, 563, 2, 1963, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 48 (script 1): [12582975, 48, 98] +Interface 192 child 48 (script 6): [Water Wave, A high level Water missile, 555, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 49 (script 1): [12582975, 49, 99] +Interface 192 child 49 (script 6): [Charge Air Orb, Needs to be cast on an air obelisk, 556, 30, 564, 3, 567, 1, -1, 0, 16, 6, -2147483645, 12582975, 49, 99, 66, Charge Air Orb, Needs to be cast on an air obelisk, 556, 30, 564, 3, 567, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 50 (script 1): [12582975, 56, 106] +Interface 192 child 50 (script 6): [Vulnerability, Reduces your opponent's defence by 10%, 557, 5, 555, 5, 566, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 51 (script 1): [12582975, 50, 100] +Interface 192 child 51 (script 6): [Lvl-5 Enchant, For use on dragonstone jewellery, 555, 15, 557, 15, 564, 1, -1, 0, 16, 6, -2147483645, 12582975, 50, 100, 68, Lvl-5 Enchant, For use on dragonstone jewellery, 555, 15, 557, 15, 564, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 52 (script 1): [12582975, 51, 101] +Interface 192 child 52 (script 6): [Earth Wave, A high level Earth missile, 557, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 53 (script 1): [12582975, 57, 107] +Interface 192 child 53 (script 6): [Enfeeble, Reduces your opponent's strength by 10%, 557, 8, 555, 8, 566, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 54 (script 1): [12582975, 349, 399] +Interface 192 child 54 (script 6): [Teleother Lumbridge, Teleports target to Lumbridge, 566, 1, 563, 1, 557, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 55 (script 1): [12582975, 52, 102] +Interface 192 child 55 (script 6): [Fire Wave, A high level Fire missile, 554, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 56 (script 1): [12582975, 321, 371] +Interface 192 child 56 (script 6): [Entangle, Holds your opponent for 15 seconds, 557, 5, 555, 5, 561, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 57 (script 1): [12582975, 58, 108] +Interface 192 child 57 (script 6): [Stun, Reduces your opponent's attack by 10%, 557, 12, 555, 12, 566, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 58 (script default): [1056964608, B, 95232, 20481, null, null, null, null, null, null, 22308205, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 3, 565, 3, 556, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 59 (script 1): [12582975, 350, 400] +Interface 192 child 59 (script 6): [Teleother Falador, Teleports target to Falador, 566, 1, 555, 1, 563, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 60 (script default): [1056964608, `, 102912, 8193, null, null, null, null, null, null, null, null, null, null, null, null, null, 22308204, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 1, 554, 1, 563, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 61 (script 1): [12582975, 353, 403] +Interface 192 child 61 (script 6): [Lvl-6 Enchant, For use on onyx jewellery, 557, 20, 554, 20, 564, 1, -1, 0, 16, 6, -2147483645, 12582975, 353, 403, 87, Lvl-6 Enchant, For use on onyx jewellery, 557, 20, 554, 20, 564, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 192 child 62 (script 1): [12582975, 351, 401] +Interface 192 child 62 (script 6): [Teleother Camelot, Teleports target to Camelot, 566, 2, 563, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 0 (script 1): [12648473, 325, 375] +Interface 193 child 0 (script 6): [Ice Rush, A single target ice attack, 562, 2, 560, 2, 555, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 1 (script 1): [12648473, 327, 377] +Interface 193 child 1 (script 6): [Ice Blitz, A single target strong ice attack, 560, 2, 565, 2, 555, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 2 (script 1): [12648473, 326, 376] +Interface 193 child 2 (script 6): [Ice Burst, A multi-target ice attack, 562, 4, 560, 2, 555, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 3 (script 1): [12648473, 328, 378] +Interface 193 child 3 (script 6): [Ice Barrage, A multi-target strong ice attack, 560, 4, 565, 2, 555, 6, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 4 (script 1): [12648473, 333, 383] +Interface 193 child 4 (script 6): [Blood Rush, A single target blood attack, 562, 2, 560, 2, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 5 (script 1): [12648473, 335, 385] +Interface 193 child 5 (script 6): [Blood Blitz, A single target strong blood attack, 560, 2, 565, 4, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 6 (script 1): [12648473, 334, 384] +Interface 193 child 6 (script 6): [Blood Burst, A multi-target blood attack, 562, 4, 560, 2, 565, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 7 (script 1): [12648473, 336, 386] +Interface 193 child 7 (script 6): [Blood Barrage, A multi-target strong blood attack, 560, 4, 565, 4, 566, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 8 (script 1): [12648473, 329, 379] +Interface 193 child 8 (script 6): [Smoke Rush, A single target smoke attack, 562, 2, 560, 2, 554, 1, 556, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 9 (script 1): [12648473, 331, 381] +Interface 193 child 9 (script 6): [Smoke Blitz, A single target strong smoke attack, 560, 2, 565, 2, 554, 2, 556, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 10 (script 1): [12648473, 330, 380] +Interface 193 child 10 (script 6): [Smoke Burst, A multi-target smoke attack, 562, 4, 560, 2, 554, 2, 556, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 11 (script 1): [12648473, 332, 382] +Interface 193 child 11 (script 6): [Smoke Barrage, A multi-target strong smoke attack, 560, 4, 565, 2, 554, 4, 556, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 12 (script 1): [12648473, 337, 387] +Interface 193 child 12 (script 6): [Shadow Rush, A single target shadow attack, 562, 2, 560, 2, 556, 1, 566, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 13 (script 1): [12648473, 339, 389] +Interface 193 child 13 (script 6): [Shadow Blitz, A single target strong shadow attack, 560, 2, 565, 2, 556, 2, 566, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 14 (script 1): [12648473, 338, 388] +Interface 193 child 14 (script 6): [Shadow Burst, A multi-target shadow attack, 562, 4, 560, 2, 556, 1, 566, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 15 (script 1): [12648473, 340, 390] +Interface 193 child 15 (script 6): [Shadow Barrage, A multi-target strong shadow attack, 560, 4, 565, 2, 556, 4, 566, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 16 (script default): [419430400, U, 100096, 13825, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045364, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 554, 1, 556, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 17 (script default): [419430400, V, 100352, 15361, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045364, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 566, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 18 (script default): [419430400, W, 100608, 16897, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045364, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 565, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 19 (script default): [419430400, X, 100864, 18433, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045364, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 555, 4, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 20 (script default): [419430400, Y, 101120, 19969, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045364, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 554, 3, 556, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 21 (script default): [419430400, Z, 101376, 21505, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045364, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 566, 2, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 22 (script default): [419430400, [, 101632, 23041, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045364, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 565, 2, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 23 (script default): [419430400, \, 101888, 24577, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045364, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 555, 8, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 193 child 24 (script default): [419430400, d, 103936, 1, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22177137, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 16777215, null, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 197 child 15 (script 1): [540, null, 44] +Interface 197 child 15 (script 3): [196608, 35323904, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 239 child 6 (script 1): [538, null, 44] +Interface 239 child 6 (script 3): [196608, 35192832, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 252 child 1 (script 1): [538] +Interface 252 child 1 (script 2): [44, 16515073, 537] +Interface 252 child 1 (script 11): [29] +Interface 253 child 1 (script 1): [16777216, null, null, null, 44, 16580609, 537, 0, 256, 7424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 254 child 2 (script 1): [33554432, null, null, null, 44, 16646146, 537, 0, 256, 7424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 255 child 1 (script 1): [16777216, null, null, null, 44, 16711681, 537, 0, 256, 7424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 259 child 0 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 259 child 13 (script 3): [16973837, 16777215, null, 59, 0, 65536, 3801088, 0, 0, null, 256000, 65601536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 259 child 14 (script 3): [16973838, 16777215, null, 59, 1, 65536, 3801088, 0, 0, null, 274176, 70254592, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 260 child 42 (script 4): [60] +Interface 260 child 42 (script 17): [131584] +Interface 260 child 45 (script 4): [61] +Interface 260 child 45 (script 17): [131840] +Interface 260 child 46 (script 1): [832, null, 44] +Interface 260 child 46 (script 3): [196608, 54460416, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 265 child 0 (script default): [null, 1] +Interface 265 child 0 (script 4): [null, 0] +Interface 265 child 0 (script 12): [293632] +Interface 266 child 0 (script 2): [null, 17432577] +Interface 266 child 0 (script 4): [null] +Interface 266 child 0 (script 6): [3, 663] +Interface 266 child 0 (script 8): [null] +Interface 266 child 0 (script 10): [17432578] +Interface 267 child 100 (script 1): [832, null, 44, 17498212, 831, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 269 child 0 (script 2): [null, 1] +Interface 269 child 0 (script 6): [null, 0] +Interface 269 child 0 (script 14): [297728] +Interface 269 child 1 (script default): [742] +Interface 269 child 1 (script 13): [297984] +Interface 269 child 44 (script 1): [542, null, 44] +Interface 269 child 44 (script 3): [196608, 35454976, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 0 (script 3): [1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 14 (script 3): [17956878, 16777215, null, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 15 (script default): [null, null, 538976256, null, null, null, 538976256, null, null, null, 538976256, 0, null, 45, 17956879, 16777215, null, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 16 (script default): [null, null, null, 538976288, 538976288, 538976288, 538976288, 538976288, 0, 50331648, 754974994, 268435711, null, null, null, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 17 (script default): [null, null, null, null, 538976288, null, 538976288, null, 538976288, null, 538976288, null, 538976288, null, 0, 50331648, 754974994, 285212927, null, null, null, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 18 (script default): [null, null, null, null, null, 538976288, null, null, 538976288, null, null, 538976288, null, null, 538976288, null, null, 538976288, null, null, 0, 50331648, 754974994, 301990143, null, null, null, 8, 4, 0, 0, 0] +Interface 274 child 19 (script default): [null, null, null, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 0, 50331648] +Interface 274 child 19 (script 2): [17956883, 16777215, null, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 20 (script default): [null, null, null, null, null, null, null, 538976288, null, null, null, null, 538976288, null, null, null, null, 538976288, null, null, null, null, 538976288, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 20 (script 2): [null, null, null, null, null, null, null, 0, 50331648, 754974994, 335544575, null, null, null, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 21 (script default): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, 538976288, null, null, null, null, null, 538976288, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 21 (script 2): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, 0, 50331648, 754974994, 352321791, null, null, null, 8, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 22 (script default): [null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, 538976288, null] +Interface 274 child 22 (script 1): [null, null, null, null, 538976288, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, 0, 50331648, 754974994, 369099007, null, null, null, 8, 8, 0, 0, 0, 0, 0] +Interface 274 child 23 (script default): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 23 (script 1): [null, 538976288, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, 0, 50331648, 754974994, 385876223, null, null, null] +Interface 274 child 23 (script 6): [9, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 24 (script default): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 24 (script 1): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 24 (script 8): [45, 17956888, 16777215] +Interface 274 child 24 (script 9): [8, 10] +Interface 274 child 25 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 25 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 25 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 419430655, null, null, null, 8, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 26 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 26 (script 1): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 26 (script 2): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 436207871, null, null, null, 8, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 27 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 27 (script 1): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 27 (script 2): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 452985087, null, null, null, 8, 13, 0, 0, 0] +Interface 274 child 28 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 28 (script 1): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 28 (script 2): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 469762303, null] +Interface 274 child 28 (script 3): [null, 8, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 29 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null] +Interface 274 child 29 (script 1): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 29 (script 2): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 29 (script 3): [null, 0, 50331648, 754974994, 486539519, null, null, null, 8, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 30 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 30 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 30 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 30 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 503316735, null, null, null, 8, 16, 0, 0, 0, 0, 0, 0] +Interface 274 child 31 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 31 (script 1): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 31 (script 2): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 31 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 520093951, null, null, null, 8, 17, 0, 0, 0, 0, 0] +Interface 274 child 32 (script default): [null, null, null, 538976288, 538976288, 538976288, 538976288, 538976288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 33 (script 3): [17956897, 16777215, null, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 34 (script default): [null, null, null, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 538976288, null, null, null, 0, 50331648] +Interface 274 child 34 (script 2): [17956898, 16777215, null, 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 35 (script default): [null, null, null, null, null, null, null, 538976288, null, null, null, null, 538976288, null, null, null, null, 538976288, null, null, null, null, 538976288, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 35 (script 2): [null, null, null, null, null, null, null, 0, 50331648, 754974994, 587202815, null, null, null, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 36 (script default): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, 538976288, null, null, null, null, null, 538976288, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 36 (script 2): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, 0, 50331648, 754974994, 603980031, null, null, null, 9, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 37 (script default): [null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, 538976288, null] +Interface 274 child 37 (script 1): [null, null, null, null, 538976288, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, 0, 50331648, 754974994, 620757247, null, null, null, 9, 4, 0, 0, 0, 0, 0] +Interface 274 child 38 (script default): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 38 (script 1): [null, 538976288, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, 0, 50331648, 754974994, 637534463, null, null, null] +Interface 274 child 38 (script 6): [5, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 39 (script default): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 39 (script 1): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 39 (script 8): [45, 17956903, 16777215] +Interface 274 child 39 (script 9): [9, 6] +Interface 274 child 40 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 40 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 40 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 671088895, null, null, null, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 41 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 41 (script 1): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 41 (script 2): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 687866111, null, null, null, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 42 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 42 (script 1): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 42 (script 2): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 704643327, null, null, null, 9, 9, 0, 0, 0] +Interface 274 child 43 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 43 (script 1): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 43 (script 2): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 721420543, null] +Interface 274 child 43 (script 3): [null, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 44 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null] +Interface 274 child 44 (script 1): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 44 (script 2): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 44 (script 3): [null, 0, 50331648, 754974994, 738197759, null, null, null, 9, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 45 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 45 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 45 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 45 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 754974975, null, null, null, 9, 12, 0, 0, 0, 0, 0, 0] +Interface 274 child 46 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 46 (script 1): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 46 (script 2): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 46 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 771752191, null, null, null, 9, 13, 0, 0, 0, 0, 0] +Interface 274 child 47 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 47 (script 1): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 47 (script 2): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 47 (script 3): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 788529407, null, null, null, 9, 14, 0] +Interface 274 child 48 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 48 (script 1): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 48 (script 2): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 48 (script 3): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994] +Interface 274 child 48 (script 5): [16777215, null, 9, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 49 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 49 (script 1): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 49 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288] +Interface 274 child 49 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 49 (script 4): [null, null, null, 0, 50331648, 754974994, 822083839, null, null, null, 9, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 50 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 50 (script 1): [null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 50 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 50 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 50 (script 4): [null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 838861055, null, null, null, 9, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 51 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 51 (script 1): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 51 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 51 (script 4): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 51 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 855638271, null, null, null, 9, 18] +Interface 274 child 52 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 52 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 52 (script 2): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 52 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 52 (script 4): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 872415487, null, null, null, 9] +Interface 274 child 52 (script 9): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 53 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 53 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 53 (script 2): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 53 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 53 (script 4): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0] +Interface 274 child 53 (script 6): [45, 17956917, 16777215] +Interface 274 child 53 (script 7): [9, 20] +Interface 274 child 54 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 54 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 54 (script 2): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 54 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 54 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 54 (script 6): [null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 905969919, null, null, null, 9, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 55 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 55 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 55 (script 2): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 55 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 55 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 55 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 922747135, null, null, null, 9, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 56 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 56 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 56 (script 2): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 56 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 56 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 56 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 939524351, null, null, null, 9, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 57 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 57 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 57 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 57 (script 3): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 57 (script 4): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 57 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 956301567, null, null, null, 9, 24, 0, 0, 0, 0] +Interface 274 child 58 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 58 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 58 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 58 (script 3): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 58 (script 4): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 58 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994] +Interface 274 child 58 (script 8): [16777215, null, 9, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 59 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null] +Interface 274 child 59 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 59 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 59 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 59 (script 4): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 59 (script 5): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 59 (script 6): [0, 50331648, 754974994, 989855999, null, null, null, 9, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 60 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288] +Interface 274 child 60 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 60 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 60 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 60 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 60 (script 5): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 60 (script 6): [null, null, null, null, null, null, null, 0, 50331648, 754974994, 1006633215, null, null, null, 9, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 61 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 61 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 61 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 61 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 61 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 61 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 61 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 61 (script 19): [45, 17956925, 16777215] +Interface 274 child 62 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 62 (script 1): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288] +Interface 274 child 62 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 62 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 62 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 62 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 62 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1040187647, null, null, null, 9, 29, 0, 0] +Interface 274 child 63 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 63 (script 1): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 63 (script 2): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 63 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 63 (script 5): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 63 (script 6): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 63 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 63 (script 9): [null, 0, 50331648, 754974994, 1056964863, null, null, null, 9, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 64 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 64 (script 1): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 64 (script 2): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 64 (script 3): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 64 (script 4): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 64 (script 5): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 64 (script 6): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 64 (script 7): [null, null, 0, 50331648, 754974994, 1073742079, null, null, null, 9, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 65 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 65 (script 1): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 65 (script 2): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 65 (script 3): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 65 (script 4): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 65 (script 5): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 65 (script 6): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 65 (script 7): [null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1090519295, null, null, null, 9, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 66 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 66 (script 1): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 66 (script 2): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 66 (script 3): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 66 (script 4): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 66 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 66 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 66 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1107296511, null, null, null, 9, 33, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 67 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 67 (script 1): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 67 (script 2): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 67 (script 3): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 67 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 67 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 67 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 67 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1124073727, null, null, null, 9, 34] +Interface 274 child 68 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 68 (script 1): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 68 (script 2): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 68 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 68 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 68 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 68 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 68 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648] +Interface 274 child 68 (script 9): [17956932, 16777215, null, 9, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 69 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 69 (script 1): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 69 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 69 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 69 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 69 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 69 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 69 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 69 (script 9): [null, null, null, null, null, null, null, 0, 50331648, 754974994, 1157628159, null, null, null, 9, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 70 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 70 (script 1): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 70 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 70 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 70 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 70 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 70 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 70 (script 8): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 70 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1174405375, null, null, null, 9, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 71 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 71 (script 1): [null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 71 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 71 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 71 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null] +Interface 274 child 71 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 71 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 71 (script 7): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 71 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1191182591, null, null, null, 9, 38, 0, 0, 0, 0, 0] +Interface 274 child 72 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 72 (script 1): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 72 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 72 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 72 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 72 (script 5): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 72 (script 6): [null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 72 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 72 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1207959807, null, null, null] +Interface 274 child 72 (script 13): [39, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 73 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 73 (script 1): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 73 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 73 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 73 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 73 (script 5): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 73 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 73 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 73 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 73 (script 15): [45, 17956937, 16777215] +Interface 274 child 73 (script 16): [9, 40] +Interface 274 child 74 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 74 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 74 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 74 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 74 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 74 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 74 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 74 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 74 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 74 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1241514239, null, null, null, 9, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 75 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 75 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 75 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 75 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 75 (script 4): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 75 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 75 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 75 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 75 (script 8): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 75 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1258291455, null, null, null, 9, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 76 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 76 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 76 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 76 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 76 (script 4): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 76 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 76 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 76 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 76 (script 8): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 76 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1275068671, null, null, null, 9, 43, 0, 0, 0] +Interface 274 child 77 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 77 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 77 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 77 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 77 (script 4): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 77 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 77 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 77 (script 7): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 77 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 77 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1291845887, null] +Interface 274 child 77 (script 10): [null, 9, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 78 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 78 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 78 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null] +Interface 274 child 78 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 78 (script 4): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 78 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 78 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 78 (script 7): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 78 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 78 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 78 (script 10): [null, 0, 50331648, 754974994, 1308623103, null, null, null, 9, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 79 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 79 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1325400319, null, null, null, 9, 46, 0, 0, 0, 0, 0, 0] +Interface 274 child 80 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 3): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 6): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 80 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1342177535, null, null, null, 9, 47, 0, 0, 0, 0, 0] +Interface 274 child 81 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 81 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1358954751, null, null, null, 9, 48, 0] +Interface 274 child 82 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 82 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 82 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 82 (script 3): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 82 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 82 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 82 (script 6): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 82 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 82 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 82 (script 9): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 82 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994] +Interface 274 child 82 (script 12): [16777215, null, 9, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 83 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 83 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 83 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 83 (script 3): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 83 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 83 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 83 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 83 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288] +Interface 274 child 83 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 83 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 83 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 83 (script 11): [null, null, null, 0, 50331648, 754974994, 1392509183, null, null, null, 9, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 84 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 3): [null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 84 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 8): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 84 (script 11): [null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1409286399, null, null, null, 9, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 85 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 3): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 9): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 85 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1426063615, null, null, null, 9, 52] +Interface 274 child 86 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 86 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 86 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 86 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 86 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 86 (script 5): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 86 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 86 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 86 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 86 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 86 (script 10): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 86 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1442840831, null, null, null, 9] +Interface 274 child 86 (script 16): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 87 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 87 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 87 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 87 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 87 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 87 (script 5): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 87 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 87 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 87 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 87 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 87 (script 10): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 87 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0] +Interface 274 child 87 (script 13): [45, 17956951, 16777215] +Interface 274 child 87 (script 14): [9, 54] +Interface 274 child 88 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 88 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 5): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 88 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 88 (script 13): [null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1476395263, null, null, null, 9, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 89 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 89 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 5): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 7): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 89 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 89 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1493172479, null, null, null, 9, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 90 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 90 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 7): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 9): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 90 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 90 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1509949695, null, null, null, 9, 57, 0, 0, 0, 0] +Interface 274 child 91 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 91 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 7): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 91 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994] +Interface 274 child 91 (script 15): [16777215, null, 9, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 92 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null] +Interface 274 child 92 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 92 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 9): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 11): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 92 (script 13): [0, 50331648, 754974994, 1543504127, null, null, null, 9, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 93 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288] +Interface 274 child 93 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 93 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 11): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 93 (script 13): [null, null, null, null, null, null, null, 0, 50331648, 754974994, 1560281343, null, null, null, 9, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 94 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 94 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script 2): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288] +Interface 274 child 95 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 95 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 95 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 95 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 95 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1593835775, null, null, null, 9, 62, 0, 0] +Interface 274 child 96 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 2): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 4): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 9): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 11): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 96 (script 16): [null, 0, 50331648, 754974994, 1610612991, null, null, null, 9, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 97 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 2): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 4): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 6): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 8): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 10): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 12): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 97 (script 14): [null, null, 0, 50331648, 754974994, 1627390207, null, null, null, 9, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 98 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 2): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 4): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 6): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 8): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 10): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 12): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 98 (script 14): [null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1644167423, null, null, null, 9, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 99 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 2): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 4): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 6): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 8): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 99 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1660944639, null, null, null, 9, 66, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 100 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 2): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 4): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 6): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 100 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1677721855, null, null, null, 9, 67] +Interface 274 child 101 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 2): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 4): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 101 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 101 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648] +Interface 274 child 101 (script 16): [17956965, 16777215, null, 9, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 102 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 2): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 102 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 102 (script 16): [null, null, null, null, null, null, null, 0, 50331648, 754974994, 1711276287, null, null, null, 9, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 103 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 2): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 103 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 14): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 103 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1728053503, null, null, null, 9, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 104 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 2): [null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null] +Interface 274 child 104 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 11): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 13): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 104 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1744830719, null, null, null, 9, 71, 0, 0, 0, 0, 0] +Interface 274 child 105 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 2): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 105 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 9): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 11): [null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 105 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1761607935, null, null, null] +Interface 274 child 106 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 2): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 106 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 106 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 107 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1795162367, null, null, null, 9, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 108 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 108 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 7): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 108 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 14): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 108 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1811939583, null, null, null, 9, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 109 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 109 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 7): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 109 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 14): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 109 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1828716799, null, null, null, 9, 76, 0, 0, 0] +Interface 274 child 110 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 110 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 7): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 12): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 110 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1845494015, null] +Interface 274 child 110 (script 17): [null, 9, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 111 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null] +Interface 274 child 111 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 7): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 111 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 111 (script 17): [null, 0, 50331648, 754974994, 1862271231, null, null, null, 9, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 112 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 112 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 5): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 10): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 113 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1895825663, null, null, null, 9, 80, 0, 0, 0, 0, 0] +Interface 274 child 114 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 5): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 10): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 15): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 114 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1912602879, null, null, null, 9, 81, 0] +Interface 274 child 115 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 5): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 10): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 115 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 15): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 115 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994] +Interface 274 child 115 (script 19): [16777215, null, 9, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 116 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 5): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 116 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288] +Interface 274 child 116 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 116 (script 18): [null, null, null, 0, 50331648, 754974994, 1946157311, null, null, null, 9, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 117 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 5): [null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 117 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 13): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 117 (script 18): [null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1962934527, null, null, null, 9, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 118 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 5): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 14): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 118 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 119 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 8): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null] +Interface 274 child 119 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 16): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 119 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 1996488959, null, null, null, 9] +Interface 274 child 120 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 120 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 8): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 120 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 16): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 120 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0] +Interface 274 child 121 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 121 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 8): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 121 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 121 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 122 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 8): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 11): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 122 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 122 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 2046820607, null, null, null, 9, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 274 child 123 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null] +Interface 274 child 123 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 11): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 14): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null] +Interface 274 child 123 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 123 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, 50331648, 754974994, 2063597823, null, null, null, 9, 90, 0, 0, 0, 0] +Interface 274 child 124 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 124 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 11): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 14): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 124 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null] +Interface 274 child 125 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 125 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 14): [null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 17): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 125 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288] +Interface 274 child 126 (script 3): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 126 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 17): [null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 126 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 127 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 3): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288] +Interface 274 child 128 (script 6): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null] +Interface 274 child 128 (script 9): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null] +Interface 274 child 128 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null] +Interface 274 child 128 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 128 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 3): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 6): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 12): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 13): [null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 15): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 16): [538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 129 (script 18): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 3): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 6): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 9): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 12): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 15): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 18): [null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 130 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 131 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 132 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 133 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 134 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 135 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 136 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 137 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 138 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 139 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 140 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 141 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 142 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 143 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 144 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 145 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 146 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 147 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 148 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 149 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 150 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script default): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 2): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 3): [null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 4): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 6): [null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 7): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 8): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 9): [null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 10): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 11): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 12): [null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 13): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 14): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 15): [null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 16): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 17): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 18): [null, null, null, null, null, null, null, null, 538976288, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 274 child 151 (script 19): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 300 child 14 (script 1): [832, null, 44] +Interface 300 child 14 (script 3): [196608, 54460416, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 300 child 17 (script default): [196609, null, 268435456, null, null, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 301 child 11 (script 5): [529, -2147483645] +Interface 301 child 12 (script 5): [529, -2147483645] +Interface 301 child 15 (script 2): [null, 0] +Interface 301 child 15 (script 4): [null] +Interface 301 child 15 (script 6): [-1, null, 526, 1, 19726349, 19726353, 0, 131072, 34668672, 197888, 135936, -, null] +Interface 301 child 15 (script 11): [1103, 19726350, 33554432, null, null, 19726353, null, 533, 19726353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 301 child 20 (script 2): [null, 0] +Interface 301 child 20 (script 4): [null] +Interface 301 child 20 (script 6): [-1, null, 526, 1, 19726354, 19726358, 0, 131072, 34668672, 197888, 135936, -, null, 207, 1095, 19726355, 33554432, null] +Interface 301 child 20 (script 7): [19726358, null, 533, 19726358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 301 child 25 (script 2): [null, 0] +Interface 301 child 25 (script 4): [null] +Interface 301 child 25 (script 6): [-1, null, 526, 1, 19726359, 19726363, 0, 131072, 34668672, 197888, 135936, -, null, 208, 1096, 19726360, 33554432, null, null, 19726363, null, 533, 19726363] +Interface 301 child 30 (script 2): [null, 0] +Interface 301 child 30 (script 4): [null] +Interface 301 child 30 (script 6): [-1, null, 526, 1, 19726364, 19726368, 0, 131072, 34668672, 197888, 135936, -, null, 221, 1109, 19726365, 33554432, null, null, 19726368, null, 533, 19726368, 0, 0, 0, 0, 0] +Interface 301 child 35 (script 2): [null, 0] +Interface 301 child 35 (script 4): [null] +Interface 301 child 35 (script 6): [-1, null, 526, 1, 19726369, 19726373, 0, 131072, 34668672, 197888, 135936, -, null, 217, 1105, 19726370, 33554432, null, null, 19726373, null, 533, 19726373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 301 child 40 (script 2): [null, 0] +Interface 301 child 40 (script 4): [null] +Interface 301 child 40 (script 6): [-1, null, 526, 1, 19726374, 19726378, 0, 131072, 34668672, 197888, 135936, -, null, 202, 1090, 19726375, 33554432, null, null, 19726378, null, 533, 19726378, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 301 child 45 (script 2): [null, 0] +Interface 301 child 45 (script 4): [null] +Interface 301 child 45 (script 6): [-1, null, 526, 1, 19726379, 19726383, 0, 131072, 34668672, 197888, 135936, -, null, 210, 1098, 19726380, 33554432, null, null, 19726383, null, 533, 19726383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 301 child 50 (script 2): [null, 0] +Interface 301 child 50 (script 4): [null] +Interface 301 child 50 (script 6): [-1, null, 526, 1, 19726384, 19726388, 0, 131072, 34668672, 197888, 135936, -, null, 212, 1100, 19726385, 33554432, null, null, 19726388, null, 533, 19726388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 301 child 55 (script 2): [null, 0] +Interface 301 child 55 (script 4): [null] +Interface 301 child 55 (script 6): [-1, null, 526, 1, 19726389, 19726393, 0, 131072, 34668672, 197888, 135936, -, null, 205, 1093, 19726390, 33554432, null, null, 19726393, null, 533, 19726393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 301 child 58 (script 1): [832, null, 44] +Interface 301 child 58 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 301 child 70 (script 3): [524, -2147483645, 19726407] +Interface 301 child 70 (script 16): [278528, 71237632] +Interface 301 child 71 (script 2): [null, 0] +Interface 301 child 71 (script 4): [522, -2147483645, 20] +Interface 301 child 71 (script 17): [5120] +Interface 301 child 72 (script 3): [524, -2147483645, 19726409] +Interface 301 child 72 (script 16): [278528, 71237632] +Interface 301 child 73 (script 5): [522, -2147483645, 12] +Interface 301 child 73 (script 18): [3072] +Interface 301 child 74 (script 3): [524, -2147483645, 19726411] +Interface 301 child 74 (script 16): [278528, 71237632] +Interface 301 child 75 (script 2): [522, -2147483645, 9] +Interface 301 child 75 (script 15): [2304] +Interface 301 child 76 (script 3): [524, -2147483645, 19726413] +Interface 301 child 76 (script 16): [278528, 71237632] +Interface 301 child 77 (script 5): [522, -2147483645, 22] +Interface 301 child 77 (script 18): [5632] +Interface 301 child 78 (script 3): [524, -2147483645, 19726415] +Interface 301 child 78 (script 16): [278528, 71237632] +Interface 301 child 79 (script 2): [522, -2147483645, 19] +Interface 301 child 79 (script 15): [4864] +Interface 301 child 80 (script 3): [524, -2147483645, 19726417] +Interface 301 child 80 (script 16): [278528, 71237632] +Interface 301 child 81 (script 2): [null, 0] +Interface 301 child 81 (script 4): [522, -2147483645, 6] +Interface 301 child 81 (script 17): [1536] +Interface 301 child 82 (script 3): [524, -2147483645, 19726419] +Interface 301 child 82 (script 16): [278528, 71237632] +Interface 301 child 83 (script 2): [null, 0] +Interface 301 child 83 (script 4): [522, -2147483645, 13] +Interface 301 child 83 (script 17): [3328] +Interface 301 child 84 (script 3): [524, -2147483645, 19726421] +Interface 301 child 84 (script 16): [278528, 71237632] +Interface 301 child 85 (script 2): [null, 0] +Interface 301 child 85 (script 4): [522, -2147483645, 7] +Interface 301 child 85 (script 17): [1792] +Interface 301 child 86 (script 3): [524, -2147483645, 19726423] +Interface 301 child 86 (script 16): [278528, 71237632] +Interface 301 child 87 (script 2): [522, -2147483645, 15] +Interface 301 child 87 (script 15): [3840] +Interface 301 child 88 (script 3): [527] +Interface 301 child 88 (script 16): [278272] +Interface 301 child 98 (script 3): [524, -2147483645, 19726435] +Interface 301 child 98 (script 16): [278528] +Interface 301 child 99 (script 3): [535, -2147483645] +Interface 301 child 99 (script 16): [278528] +Interface 301 child 100 (script default): [40, 19726436] +Interface 310 child 0 (script default): [117440512, 570425344, 1409286144, 654394226, null, null, null, null, null, null, null, null, null, null, null, null, 21522804, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 310 child 0 (script 1): [null, null, null, null, 2, null, 2, 556, 2, 562, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 310 child 1 (script default): [117440512, D, 95744, 12801, null, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 16, null, 1, 560, 1, 558, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 310 child 2 (script default): [117440512, 771751936, 1610612736, 1040275305, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 5, 565, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 310 child 3 (script default): [117440512, 805306368, 1644167168, 1090606945, null, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 310 child 4 (script default): [117440512, 855638016, 1694498816, 1174488417, null, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 310 child 5 (script default): [117440512, 872415232, 1711276032, 1258374761, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 310 child 6 (script 3): [-2147483645, 13158600, null, 45, -2147483645, 8421504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 314 child 5 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 314 child 6 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 314 child 7 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 0 (script default): [285212672, 251658240, 1090519040, 16865129, null, null, null, null, null, null, null, null, null, 21045346, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 1, 558, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 1 (script default): [285212672, 285212672, 1124073472, 83973985, null, null, null, null, null, null, null, null, null, null, 21045346, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 1, 556, 1, 558, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 2 (script default): [285212672, 318767104, 1157627904, 151078241, null, null, null, null, null, null, null, null, null, null, 21045346, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 556, 1, 558, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 3 (script default): [285212672, 352321536, 1191182336, 218187369, null, null, null, null, null, null, null, null, null, 21045346, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 3, 556, 2, 558, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 4 (script default): [285212672, 385875968, 1224736768, 285300585, null, null, null, null, null, null, null, 21045356, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 562, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 5 (script default): [285212672, 436207616, 1275068416, 385963873, null, null, null, null, null, null, null, null, 21045356, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 556, 2, 562, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 6 (script default): [285212672, 486539264, 1325400064, 486622561, null, null, null, null, null, null, null, null, 21045356, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 3, 556, 2, 562, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 7 (script default): [285212672, 536870912, 1375731712, 587286121, null, null, null, null, null, null, null, 21045356, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 556, 3, 562, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 8 (script default): [285212672, 587202560, 1426063360, 687953769, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 3, 560, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 9 (script default): [285212672, 637534208, 1476395008, 788617057, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 3, 556, 3, 560, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 10 (script default): [285212672, 671088640, 1509949440, 889275745, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 556, 3, 560, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 11 (script default): [285212672, 738197504, 1577058304, 989939305, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 5, 556, 4, 560, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 12 (script default): [285212672, 771751936, 1610612736, 1040275305, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 5, 565, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 13 (script default): [285212672, 805306368, 1644167168, 1090606945, null, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 14 (script default): [285212672, 855638016, 1694498816, 1174488417, null, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 15 (script default): [285212672, 872415232, 1711276032, 1258374761, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 319 child 16 (script 3): [-2147483645, 13158600, null, 45, -2147483645, 8421504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 4 (script 5): [544, -2147483645] +Interface 320 child 77 (script 5): [525, -2147483645, 0] +Interface 320 child 77 (script 18): [0] +Interface 320 child 78 (script 5): [532, -2147483645, 0] +Interface 320 child 78 (script 18): [0] +Interface 320 child 79 (script 5): [525, -2147483645, 2] +Interface 320 child 79 (script 18): [512] +Interface 320 child 80 (script 5): [532, -2147483645, 2] +Interface 320 child 80 (script 18): [512] +Interface 320 child 81 (script 5): [525, -2147483645, 1] +Interface 320 child 81 (script 18): [256] +Interface 320 child 82 (script 5): [532, -2147483645, 1] +Interface 320 child 82 (script 18): [256] +Interface 320 child 83 (script 5): [525, -2147483645, 4] +Interface 320 child 83 (script 18): [1024] +Interface 320 child 84 (script 5): [532, -2147483645, 4] +Interface 320 child 84 (script 18): [1024] +Interface 320 child 85 (script 5): [525, -2147483645, 5] +Interface 320 child 85 (script 18): [1280] +Interface 320 child 86 (script 5): [532, -2147483645, 5] +Interface 320 child 86 (script 18): [1280] +Interface 320 child 87 (script 5): [525, -2147483645, 6] +Interface 320 child 87 (script 18): [1536] +Interface 320 child 88 (script 5): [532, -2147483645, 6] +Interface 320 child 88 (script 18): [1536] +Interface 320 child 89 (script 5): [525, -2147483645, 20] +Interface 320 child 89 (script 18): [5120] +Interface 320 child 90 (script 5): [532, -2147483645, 20] +Interface 320 child 90 (script 18): [5120] +Interface 320 child 91 (script 5): [525, -2147483645, 22] +Interface 320 child 91 (script 18): [5632] +Interface 320 child 92 (script 5): [532, -2147483645, 22] +Interface 320 child 92 (script 18): [5632] +Interface 320 child 93 (script 5): [525, -2147483645, 3] +Interface 320 child 93 (script 18): [768] +Interface 320 child 94 (script 5): [532, -2147483645, 3] +Interface 320 child 94 (script 18): [768] +Interface 320 child 95 (script 5): [525, -2147483645, 16] +Interface 320 child 95 (script 18): [4096] +Interface 320 child 96 (script 5): [532, -2147483645, 16] +Interface 320 child 96 (script 18): [4096] +Interface 320 child 97 (script 5): [525, -2147483645, 15] +Interface 320 child 97 (script 18): [3840] +Interface 320 child 98 (script 5): [532, -2147483645, 15] +Interface 320 child 98 (script 18): [3840] +Interface 320 child 99 (script 5): [525, -2147483645, 17] +Interface 320 child 99 (script 18): [4352] +Interface 320 child 100 (script 5): [532, -2147483645, 17] +Interface 320 child 100 (script 18): [4352] +Interface 320 child 101 (script 5): [525, -2147483645, 12] +Interface 320 child 101 (script 18): [3072] +Interface 320 child 102 (script 5): [532, -2147483645, 12] +Interface 320 child 102 (script 18): [3072] +Interface 320 child 103 (script 5): [525, -2147483645, 9] +Interface 320 child 103 (script 18): [2304] +Interface 320 child 104 (script 5): [532, -2147483645, 9] +Interface 320 child 104 (script 18): [2304] +Interface 320 child 105 (script 5): [525, -2147483645, 18] +Interface 320 child 105 (script 18): [4608] +Interface 320 child 106 (script 2): [532, -2147483645, 18] +Interface 320 child 106 (script 15): [4608] +Interface 320 child 107 (script 5): [525, -2147483645, 21] +Interface 320 child 107 (script 18): [5376] +Interface 320 child 108 (script 5): [532, -2147483645, 21] +Interface 320 child 108 (script 18): [5376] +Interface 320 child 109 (script 5): [525, -2147483645, 14] +Interface 320 child 109 (script 18): [3584] +Interface 320 child 110 (script 5): [532, -2147483645, 14] +Interface 320 child 110 (script 18): [3584] +Interface 320 child 111 (script 5): [525, -2147483645, 13] +Interface 320 child 111 (script 18): [3328] +Interface 320 child 112 (script 5): [532, -2147483645, 13] +Interface 320 child 112 (script 18): [3328] +Interface 320 child 113 (script 5): [525, -2147483645, 10] +Interface 320 child 113 (script 18): [2560] +Interface 320 child 114 (script 5): [532, -2147483645, 10] +Interface 320 child 114 (script 18): [2560] +Interface 320 child 115 (script 5): [525, -2147483645, 7] +Interface 320 child 115 (script 18): [1792] +Interface 320 child 116 (script 5): [532, -2147483645, 7] +Interface 320 child 116 (script 18): [1792] +Interface 320 child 117 (script 5): [525, -2147483645, 11] +Interface 320 child 117 (script 18): [2816] +Interface 320 child 118 (script 5): [532, -2147483645, 11] +Interface 320 child 118 (script 18): [2816] +Interface 320 child 119 (script 5): [525, -2147483645, 8] +Interface 320 child 119 (script 18): [2048] +Interface 320 child 120 (script 5): [532, -2147483645, 8] +Interface 320 child 120 (script 18): [2048] +Interface 320 child 121 (script 5): [525, -2147483645, 19] +Interface 320 child 121 (script 18): [4864] +Interface 320 child 122 (script 5): [532, -2147483645, 19] +Interface 320 child 122 (script 18): [4864] +Interface 320 child 123 (script 5): [525, -2147483645, 23] +Interface 320 child 123 (script 18): [5888] +Interface 320 child 124 (script 5): [532, -2147483645, 23] +Interface 320 child 124 (script 18): [5888] +Interface 320 child 125 (script 1): [null, -2147483645] +Interface 320 child 125 (script 8): [null] +Interface 320 child 125 (script 10): [null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 126 (script 2): [null, -2147483645] +Interface 320 child 126 (script 7): [20971671, null] +Interface 320 child 126 (script 11): [null, 20971671] +Interface 320 child 127 (script 2): [null, -2147483645] +Interface 320 child 127 (script 7): [20971671] +Interface 320 child 127 (script 8): [546, 20971671] +Interface 320 child 128 (script 2): [null, -2147483645] +Interface 320 child 128 (script 7): [20971671, null, 546, 20971671] +Interface 320 child 129 (script 2): [null, -2147483645] +Interface 320 child 129 (script 7): [20971671, null, 546, 20971671, 0] +Interface 320 child 130 (script 2): [null, -2147483645] +Interface 320 child 130 (script 7): [20971671, null, 546, 20971671, 0, 0] +Interface 320 child 131 (script 2): [null, -2147483645] +Interface 320 child 131 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 132 (script 2): [null, -2147483645] +Interface 320 child 132 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 133 (script 2): [null, -2147483645] +Interface 320 child 133 (script 7): [20971671, null, 546] +Interface 320 child 133 (script 9): [null] +Interface 320 child 133 (script 11): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 134 (script 2): [null, -2147483645] +Interface 320 child 134 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 135 (script 2): [null, -2147483645] +Interface 320 child 135 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 136 (script 2): [null, -2147483645] +Interface 320 child 136 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 137 (script 2): [null, -2147483645] +Interface 320 child 137 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 138 (script 2): [null, -2147483645] +Interface 320 child 138 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0] +Interface 320 child 139 (script 2): [null, -2147483645] +Interface 320 child 139 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 140 (script 2): [null, -2147483645] +Interface 320 child 140 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 141 (script 2): [null, -2147483645] +Interface 320 child 141 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 142 (script 2): [null, -2147483645] +Interface 320 child 142 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 143 (script 2): [null, -2147483645] +Interface 320 child 143 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0] +Interface 320 child 144 (script 2): [null, -2147483645] +Interface 320 child 144 (script 7): [20971671, null, 546, 20971671, 0, 0, 0] +Interface 320 child 145 (script 2): [null, -2147483645] +Interface 320 child 145 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 146 (script 2): [null, -2147483645] +Interface 320 child 146 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0] +Interface 320 child 147 (script 2): [null, -2147483645] +Interface 320 child 147 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 148 (script 2): [null, -2147483645] +Interface 320 child 148 (script 7): [20971671, null, 546, 20971671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 320 child 150 (script default): [null, -2147483645, 20971669] +Interface 320 child 150 (script 4): [null, 789, 790] +Interface 320 child 150 (script 8): [null, 773, 788] +Interface 327 child 12 (script 1): [832, null, 44, 21430284, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 327 child 18 (script 1): [21430290, 11, 0, null, 163, 21430290, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 334 child 6 (script 1): [832, null, 44] +Interface 334 child 6 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 334 child 44 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 335 child 12 (script 1): [832, null, 44] +Interface 335 child 12 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 335 child 17 (script 3): [141] +Interface 335 child 17 (script 16): [266752, 68354048] +Interface 335 child 18 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 335 child 20 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 335 child 31 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 335 child 42 (script default): [40, 21954639] +Interface 335 child 43 (script default): [40, 21954639] +Interface 335 child 44 (script default): [40, 21954639] +Interface 335 child 75 (script 1): [21954639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 335 child 76 (script 1): [21954639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 335 child 77 (script 1): [21954639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 335 child 78 (script 1): [21954639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 373 child 1 (script 3): [70] +Interface 373 child 1 (script 16): [143360] +Interface 374 child 5 (script 1): [45, -2147483645, 16776960] +Interface 374 child 5 (script 2): [45, -2147483645, 16777215] +Interface 374 child 11 (script 1): [45, -2147483645, 16777215] +Interface 374 child 11 (script 2): [45, -2147483645, 16750623] +Interface 374 child 12 (script 1): [45, -2147483645, 16777215] +Interface 374 child 12 (script 2): [45, -2147483645, 16750623] +Interface 374 child 13 (script 1): [45, -2147483645, 16777215] +Interface 374 child 13 (script 2): [45, -2147483645, 16750623] +Interface 374 child 14 (script 1): [45, -2147483645, 16777215] +Interface 374 child 14 (script 2): [45, -2147483645, 16750623] +Interface 380 child 1 (script 6): [54] +Interface 381 child 1 (script 6): [54] +Interface 382 child 13 (script 1): [832, null, 44] +Interface 382 child 13 (script 3): [196608, 54460416, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 382 child 18 (script 2): [834, null, 44] +Interface 382 child 18 (script 4): [196608, 54591488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 382 child 19 (script 1): [834, null, 44] +Interface 382 child 19 (script 3): [196608, 54591488, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 382 child 27 (script 1): [25034779, 7, 0, null, 163, 25034779, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 0 (script default): [285212672, I, 97024, 12801, null, null, null, null, null, null, null, null, null, null, 21045363, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 560, 2, 554, 1, 556, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 1 (script default): [285212672, Q, 99072, 13313, null, null, null, null, null, null, null, null, null, null, null, 21045363, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 560, 2, 556, 1, 566, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 2 (script default): [285212672, M, 98048, 14337, null, null, null, null, null, null, null, null, null, null, 21045363, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 560, 2, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 3 (script default): [285212672, E, 96000, 14849, null, null, null, null, null, null, null, null, 21045363, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 560, 2, 555, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 4 (script default): [285212672, J, 97280, 15873, null, null, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 560, 2, 554, 2, 556, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 5 (script default): [285212672, R, 99328, 16385, null, null, null, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 560, 2, 556, 1, 566, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 6 (script default): [285212672, N, 98304, 17409, null, null, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 560, 2, 565, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 7 (script default): [285212672, F, 96256, 17921, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 560, 2, 555, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 8 (script default): [285212672, K, 97536, 18945, null, null, null, null, null, null, null, null, null, null, null, 21045363, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 565, 2, 554, 2, 556, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 9 (script default): [285212672, S, 99584, 19457, null, null, null, null, null, null, null, null, null, null, null, null, 21045363, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 565, 2, 556, 2, 566, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 10 (script default): [285212672, O, 98560, 20481, null, null, null, null, null, null, null, null, null, null, null, 21045363, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 565, 4, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 11 (script default): [285212672, G, 96512, 20993, null, null, null, null, null, null, null, null, null, 21045363, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 565, 2, 555, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 12 (script default): [285212672, L, 97792, 22017, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 565, 2, 554, 4, 556, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 13 (script default): [285212672, T, 99840, 22529, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 565, 2, 556, 4, 566, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 14 (script default): [285212672, P, 98816, 23553, null, null, null, null, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 565, 4, 566, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 15 (script default): [285212672, H, 96768, 24065, null, null, null, null, null, null, null, null, null, null, null, 21045357, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 4, 565, 2, 555, 6, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 388 child 16 (script 3): [-2147483645, 13158600, null, 45, -2147483645, 8421504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 389 child 10 (script 1): [832, null, 44] +Interface 389 child 10 (script 3): [196608, 54460416, 1, 571, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 390 child 8 (script default): [45, -2147483645, 13811300] +Interface 390 child 8 (script 8): [45, -2147483645, 14784543] +Interface 390 child 16 (script 9): [67, 25559041, 27494] +Interface 395 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 406 child 0 (script default): [117440512, 570425344, 1409286144, 654394226, null, null, null, null, null, null, null, null, null, null, null, null, 21522804, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 2, 556, 2, 562, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 406 child 1 (script default): [117440512, 1006632960, 1845493760, 1006715756, null, null, null, null, null, null, null, null, null, null, null, null, null, 22246765, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 1, 565, 2, 556, 4, 8843, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 406 child 2 (script default): [117440512, 771751936, 1610612736, 1040275305, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 5, 565, 1, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 406 child 3 (script default): [117440512, 805306368, 1644167168, 1090606945, null, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 406 child 4 (script default): [117440512, 855638016, 1694498816, 1174488417, null, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 406 child 5 (script default): [117440512, 872415232, 1711276032, 1258374761, null, null, null, null, null, null, null, 21045352, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 2, null, 7, 556, 5, 565, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 406 child 6 (script 3): [-2147483645, 13158600, null, 45, -2147483645, 8421504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 10 (script 1): [27459606, 16777215, null, 45, 27459606, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 11 (script 1): [27459607, 16777215, null, 45, 27459607, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 12 (script 1): [27459602, 16777215, null, 45, 27459602, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 13 (script 1): [27459603, 16777215, null, 45, 27459603, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 14 (script 1): [27459604, 16777215, null, 45, 27459604, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 15 (script 1): [27459605, 16777215, null, 45, 27459605, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 16 (script 1): [27459608, 16777215, null, 45, 27459608, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 17 (script 1): [27459609, 16777215, null, 45, 27459609, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 18 (script 3): [27459602, 16777215, null, 45, 27459602, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 19 (script 3): [27459603, 16777215, null, 45, 27459603, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 20 (script 3): [27459604, 16777215, null, 45, 27459604, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 21 (script 3): [27459605, 16777215, null, 45, 27459605, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 22 (script 3): [27459606, 16777215, null, 45, 27459606, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 23 (script 3): [27459607, 16777215, null, 45, 27459607, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 24 (script 3): [27459608, 16777215, null, 45, 27459608, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 419 child 25 (script 3): [27459609, 16777215, null, 45, 27459609, 13421772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 86 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 87 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 88 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 89 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 90 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 91 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 92 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 93 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 94 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 95 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 96 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 97 (script 3): [-2147483645, 15840880, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 429 child 110 (script 1): [536, null, 44] +Interface 429 child 110 (script 3): [196608, 35061760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 0 (script default): [671088640, null, null, 597, 75, Barbarian Teleport, Teleports you to the Barbarian Outpost, 9075, 2, 563, 2, 554, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 1 (script 1): [28180520, 559, 609] +Interface 430 child 1 (script 6): [Cure Other, Cure poisoned players, 9075, 1, 563, 1, 557, 10, -1, 0, 16, 6, -2147483645, 28180520, 559, 609, 68, Cure Other, Cure poisoned players, 9075, 1, 563, 1, 557, 10, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 2 (script 1): [28180520, 553, 603] +Interface 430 child 2 (script 6): [Fertile Soil, Fertilise a farming patch with super compost, 9075, 3, 561, 2, 557, 15, -1, 0, 16, 6, -2147483645, 28180520, 553, 603, 83, Fertile Soil, Fertilise a farming patch with super compost, 9075, 3, 561, 2, 557, 15, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 3 (script default): [671088640, null, null, 615, 74, Cure Group, Cure poison on players, 9075, 2, 564, 2, 563, 2, -1, 0, 16, 6, -2147483645, 28180520, 565, 615, 74, Cure Group, Cure poison on players, 9075, 2, 564, 2, 563, 2, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 4 (script default): [671088640, null, null, 618, 67, NPC Contact, Speak with varied NPCs, 9075, 1, 564, 1, 556, 2, -1, 0, 16, 6, -2147483645, 28180520, 568, 618, 67, NPC Contact, Speak with varied NPCs, 9075, 1, 564, 1, 556, 2, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 5 (script 1): [28180520, 558, 608] +Interface 430 child 5 (script 6): [Energy Transfer, Spend hitpoints and SA energy to give another SA and run energy, 9075, 3, 563, 2, 561, 1, -1, 0, 16, 6, -2147483645, 28180520, 558, 608, 91, Energy Transfer, Spend hitpoints and SA energy to give another SA and run energy, 9075, 3, 563, 2, 561, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 6 (script 1): [28180520, 577, 627] +Interface 430 child 6 (script 6): [Monster Examine, Detect the combat statistics of a monster, 9075, 1, 564, 1, 558, 1, -1, 0, 16, 6, -2147483645, 28180520, 577, 627, 66, Monster Examine, Detect the combat statistics of a monster, 9075, 1, 564, 1, 558, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 7 (script default): [671088640, null, null, 628, 68, Humidify, Fills certain vessels with water, 9075, 1, 555, 3, 554, 1, -1, 0, 16, 6, -2147483645, 28180520, 578, 628, 68, Humidify, Fills certain vessels with water, 9075, 1, 555, 3, 554, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 8 (script 3): [null, 71] +Interface 430 child 8 (script 4): [null] +Interface 430 child 8 (script 5): [null, null, null, null, null, null, null, null, 21456244, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 35, null, 2, 557, 2, -1, 0, -1, 0, 16, 6, -2147483645, 28180520, 579, 629, 71, Hunter Kit, Get a kit of hunter gear, 9075, 2, 557, 2, -1, 0, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 9 (script 1): [28180520, 576, 626] +Interface 430 child 9 (script 6): [Stat Spy, Cast on another player to see their skill levels, 9075, 2, 564, 2, 559, 5, -1, 0, 16, 6, -2147483645, 28180520, 576, 626, 75, Stat Spy, Cast on another player to see their skill levels, 9075, 2, 564, 2, 559, 5, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 10 (script 3): [null, 79] +Interface 430 child 10 (script 4): [null] +Interface 430 child 10 (script 5): [null, null, null, 22307179, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 35, null, 2, 564, 1, 559, 5, -1, 0, 16, 6, -2147483645, 28180520, 580, 630, 79, Dream, Take a rest and restore hitpoints 3 times faster, 9075, 2, 564, 1, 559, 5, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 11 (script 1): [28180520, 581, 631] +Interface 430 child 11 (script 6): [Plank Make, Turn logs into planks, 9075, 2, 557, 15, 561, 1, -1, 0, 16, 6, -2147483645, 28180520, 581, 631, 86, Plank Make, Turn logs into planks, 9075, 2, 557, 15, 561, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 12 (script 3): [null, 96] +Interface 430 child 12 (script 4): [null] +Interface 430 child 12 (script 5): [null, null, null, null, null, null, null, null, null, null, null, null, 21194849, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 35, null, 3, 564, 2, 563, 1, -1, 0, 16, 6, -2147483645, 28180520, 582, 632, 96, Spellbook Swap, Change to another spellbook for 1 spell cast, 9075, 3, 564, 2, 563, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 13 (script default): [671088640, null, null, 602, 82, Magic Imbue, Combine runes without a talisman, 9075, 2, 554, 7, 555, 7, -1, 0, 16, 6, -2147483645, 28180520, 552, 602, 82, Magic Imbue, Combine runes without a talisman, 9075, 2, 554, 7, 555, 7, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 14 (script default): [671088640, null, null, 614, 94, Vengeance, Rebound damage to an opponent, 9075, 4, 560, 2, 557, 10, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 15 (script default): [671088640, null, null, 593, 65, Bake Pie, Bake pies without a stove, 9075, 1, 554, 5, 555, 4, -1, 0, 16, 6, -2147483645, 28180520, 543, 593, 65, Bake Pie, Bake pies without a stove, 9075, 1, 554, 5, 555, 4, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 16 (script default): [671088640, d, 103936, 1, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 22177137, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 16777215, null, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 17 (script default): [671088640, null, null, 605, 85, Fishing Guild Teleport, Teleports you to the Fishing Guild, 9075, 3, 563, 3, 555, 10, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 18 (script default): [671088640, null, null, 599, 78, Khazard Teleport, Teleports you to Port Khazard, 9075, 2, 563, 2, 555, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 19 (script default): [28180520, 561, 611] +Interface 430 child 19 (script 5): [Vengeance Other, Allows another player to rebound damage to an opponent, 9075, 3, 560, 2, 557, 10, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 20 (script default): [671088640, null, null, 594, 69, Moonclan Teleport, Teleports you to Moonclan Island, 9075, 2, 563, 1, 557, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 21 (script default): [671088640, null, null, 606, 87, Catherby Teleport, Teleports you to Catherby, 9075, 3, 563, 3, 555, 10, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 22 (script default): [671088640, null, null, 600, 80, String Jewellery, String amulets without wool, 9075, 2, 557, 10, 555, 5, -1, 0, 16, 6, -2147483645, 28180520, 550, 600, 80, String Jewellery, String amulets without wool, 9075, 2, 557, 10, 555, 5, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 23 (script default): [671088640, null, null, 612, 71, Cure Me, Cure Poison, 9075, 2, 564, 2, 563, 1, -1, 0, 16, 6, -2147483645, 28180520, 562, 612, 71, Cure Me, Cure Poison, 9075, 2, 564, 2, 563, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 24 (script default): [671088640, null, null, 595, 72, Waterbirth Teleport, Teleports you to Waterbirth Island, 9075, 2, 563, 1, 555, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 25 (script default): [671088640, null, null, 598, 77, Superglass Make, Make glass without a furnace, 9075, 2, 554, 6, 556, 10, -1, 0, 16, 6, -2147483645, 28180520, 548, 598, 77, Superglass Make, Make glass without a furnace, 9075, 2, 554, 6, 556, 10, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 26 (script 1): [28180520, 551, 601] +Interface 430 child 26 (script 6): [Boost Potion Share, Shares a potion with up to 4 nearby players, 9075, 3, 557, 12, 555, 10, -1, 0, 16, 6, -2147483645, 28180520, 551, 601, 84, Boost Potion Share, Shares a potion with up to 4 nearby players, 9075, 3, 557, 12, 555, 10, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 27 (script 1): [28180520, 554, 604] +Interface 430 child 27 (script 6): [Stat Restore Pot Share, Shares a potion with up to 4 nearby players, 9075, 2, 557, 10, 555, 10, -1, 0, 16, 6, -2147483645, 28180520, 554, 604, 81, Stat Restore Pot Share, Shares a potion with up to 4 nearby players, 9075, 2, 557, 10, 555, 10, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 28 (script default): [671088640, null, null, 607, 89, Ice Plateau Teleport, Teleports you to Ice Plateau, 9075, 3, 563, 3, 555, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 29 (script 1): [28180520, 560, 610] +Interface 430 child 29 (script 6): [Heal Other, Transfers up to 75% of hitpoints to another player, 9075, 3, 563, 3, 565, 1, -1, 0, 16, 6, -2147483645, 28180520, 560, 610, 92, Heal Other, Transfers up to 75% of hitpoints to another player, 9075, 3, 563, 3, 565, 1, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 30 (script default): [671088640, null, null, 616, 95, Heal Group, Transfers up to 75% of hitpoints to a group, 9075, 4, 565, 3, 563, 6, -1, 0, 16, 6, -2147483645, 28180520, 566, 616, 95, Heal Group, Transfers up to 75% of hitpoints to a group, 9075, 4, 565, 3, 563, 6, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 31 (script default): [671088640, null, null, 633, 71, Ourania Teleport, Teleports you to Ourania rune altar, 9075, 2, 563, 1, 557, 6, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 32 (script 1): [28180520, 567, 617] +Interface 430 child 32 (script 6): [Cure Plant, Cures disease on farming patch, 9075, 1, 557, 8, -1, 0, -1, 0, 16, 6, -2147483645, 28180520, 567, 617, 66, Cure Plant, Cures disease on farming patch, 9075, 1, 557, 8, -1, 0, -1, 0, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 33 (script default): [671088640, null, null, 619, 70, Tele Group Moonclan, Teleports players to Moonclan Island, 9075, 2, 563, 1, 557, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 34 (script default): [671088640, null, null, 620, 73, Tele Group Waterbirth, Teleports players to Waterbirth Island, 9075, 2, 563, 1, 555, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 35 (script default): [671088640, null, null, 621, 76, Tele Group Barbarian, Teleports players to the Barbarian Outpost, 9075, 2, 563, 2, 554, 6, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 36 (script default): [671088640, null, null, 622, 79, Tele Group Khazard, Teleports players to Port Khazard, 9075, 2, 563, 2, 555, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 37 (script default): [671088640, null, null, 623, 86, Tele Group Fishing Guild, Teleports players to the Fishing Guild, 9075, 3, 563, 3, 555, 14, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 38 (script default): [671088640, null, null, 624, 88, Tele Group Catherby, Teleports players to Catherby, 9075, 3, 563, 3, 555, 15, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 430 child 39 (script default): [671088640, null, null, 625, 90, Tele Group Ice Plateau, Teleports players to Ice Plateau, 9075, 3, 563, 3, 555, 16, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 12 (script 1): [832, null, 44] +Interface 432 child 12 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 15 (script 2): [null, -2147483645] +Interface 432 child 15 (script 7): [3, 540, -2147483645, 4] +Interface 432 child 16 (script 2): [null, -2147483645] +Interface 432 child 16 (script 6): [null, 0, 0] +Interface 432 child 19 (script 2): [null, -2147483645] +Interface 432 child 19 (script 6): [null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 20 (script 2): [null, -2147483645] +Interface 432 child 20 (script 7): [3, 540, -2147483645, 14, 0, 0, 65536, null, null, 0, 0, 0, 0, 0] +Interface 432 child 23 (script 2): [null, -2147483645] +Interface 432 child 23 (script 6): [null, 0, 0] +Interface 432 child 24 (script 2): [null, -2147483645] +Interface 432 child 24 (script 7): [3, 540, -2147483645, 24, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 27 (script 2): [null, -2147483645] +Interface 432 child 27 (script 7): [3, 540, -2147483645, 29, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 30 (script 2): [null, -2147483645] +Interface 432 child 30 (script 7): [3, 540, -2147483645, 7, 0, 0, 65536] +Interface 432 child 30 (script 8): [null, 0, 0, 0] +Interface 432 child 33 (script 2): [null, -2147483645] +Interface 432 child 33 (script 7): [3, 540, -2147483645, 27, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 36 (script 2): [null, -2147483645] +Interface 432 child 36 (script 7): [3, 540, -2147483645, 49, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 39 (script 2): [null, -2147483645] +Interface 432 child 39 (script 7): [3, 540, -2147483645, 57, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 42 (script 2): [null, -2147483645] +Interface 432 child 42 (script 7): [3, 540, -2147483645, 68, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 45 (script 2): [null, -2147483645] +Interface 432 child 45 (script 7): [3, 540, -2147483645, 87, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 47 (script 2): [null, -2147483645] +Interface 432 child 47 (script 6): [null, 1] +Interface 432 child 49 (script 2): [null, -2147483645] +Interface 432 child 49 (script 6): [null, 1] +Interface 432 child 51 (script 2): [null, -2147483645] +Interface 432 child 51 (script 6): [null, 1] +Interface 432 child 53 (script 2): [null, -2147483645] +Interface 432 child 53 (script 6): [null, 1] +Interface 432 child 55 (script 2): [null, -2147483645] +Interface 432 child 55 (script 6): [null, 1] +Interface 432 child 57 (script 2): [null, -2147483645] +Interface 432 child 57 (script 6): [null, 1] +Interface 432 child 59 (script 2): [null, -2147483645] +Interface 432 child 59 (script 6): [null, 1] +Interface 432 child 61 (script 2): [null, -2147483645] +Interface 432 child 61 (script 6): [null, 1] +Interface 432 child 63 (script 2): [null, -2147483645] +Interface 432 child 63 (script 6): [null, 1] +Interface 432 child 65 (script 2): [null, -2147483645] +Interface 432 child 65 (script 6): [null, 1] +Interface 432 child 68 (script 2): [null, -2147483645] +Interface 432 child 68 (script 6): [null, 2] +Interface 432 child 70 (script 2): [null, -2147483645] +Interface 432 child 70 (script 6): [null, 15] +Interface 432 child 72 (script 2): [null, -2147483645] +Interface 432 child 72 (script 6): [null, 2] +Interface 432 child 74 (script 2): [null, -2147483645] +Interface 432 child 74 (script 6): [null, 2] +Interface 432 child 76 (script 2): [null, -2147483645] +Interface 432 child 76 (script 6): [null, 2] +Interface 432 child 78 (script 2): [null, -2147483645] +Interface 432 child 78 (script 6): [null, 1] +Interface 432 child 80 (script 2): [null, -2147483645] +Interface 432 child 80 (script 6): [null, 1] +Interface 432 child 82 (script 2): [null, -2147483645] +Interface 432 child 82 (script 6): [null, 1] +Interface 432 child 84 (script 2): [null, -2147483645] +Interface 432 child 84 (script 6): [null, 5] +Interface 432 child 86 (script 2): [null, -2147483645] +Interface 432 child 86 (script 6): [null, 3] +Interface 432 child 88 (script 2): [null, -2147483645] +Interface 432 child 88 (script 6): [null, 2] +Interface 432 child 90 (script 2): [null, -2147483645] +Interface 432 child 90 (script 6): [null, 1] +Interface 432 child 92 (script 2): [null, -2147483645] +Interface 432 child 92 (script 6): [null, 1] +Interface 432 child 94 (script 2): [null, -2147483645] +Interface 432 child 94 (script 6): [null, 1] +Interface 432 child 96 (script 2): [null, -2147483645] +Interface 432 child 96 (script 6): [null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 97 (script 2): [null, -2147483645] +Interface 432 child 97 (script 6): [null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 98 (script 2): [null, -2147483645] +Interface 432 child 98 (script 6): [null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 99 (script 2): [null, -2147483645] +Interface 432 child 99 (script 6): [null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 100 (script 2): [null, -2147483645] +Interface 432 child 100 (script 6): [null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 101 (script 2): [null, -2147483645] +Interface 432 child 101 (script 6): [null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 102 (script 2): [null, -2147483645] +Interface 432 child 102 (script 6): [null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 432 child 104 (script 2): [null, -2147483645] +Interface 432 child 104 (script 6): [null, 10] +Interface 464 child 1 (script 3): [30408704, 30408705, 1, 838, 0, 0, 262144, 9, 30474240, null, null, 277760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 2 (script default): [0, 393216, 2490496, 196609, null, 721508709, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 3 (script default): [721420288, 6, 38, -2147483645, 30408747, No, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 4 (script default): [0, 393216, 2490496, 196609, null, 721502831, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 5 (script default): [721420288, 6, 38, -2147483645, 30408747, Angry, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 6 (script default): [721420288, 6, 38, -2147483645, 30408747, Think, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 7 (script 1): [0, 393216, 2490496, 196609, null, 721508193, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 8 (script default): [721420288, 6, 38, -2147483645, 30408747, Shrug, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 9 (script default): [721420288, 6, 38, -2147483645, 30408747, Cheer, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 10 (script default): [721420288, 6, 38, -2147483645, 30408747, Beckon, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 11 (script default): [721420288, 6, 38, -2147483645, 30408747, Laugh, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 12 (script 1): [0, 393216, 2490496, 196609, null, 721504885, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 13 (script 1): [0, 393216, 2490496, 196609, null, 721508705, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 14 (script default): [721420288, 6, 38, -2147483645, 30408747, Dance, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 15 (script default): [0, 393216, 2490496, 196609, null, 721504873, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 16 (script 1): [0, 393216, 2490496, 196609, null, 721507184, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 17 (script 1): [0, 393216, 2490496, 196609, null, 721504357, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 18 (script default): [0, 393216, 2490496, 196609, null, 721503090, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 19 (script default): [721420288, 6, 38, -2147483645, 30408747, Blow Kiss, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 20 (script default): [721420288, 6, 38, -2147483645, 30408747, Panic, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 21 (script default): [721420288, 6, 38, -2147483645, 30408747, Raspberry, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 22 (script 1): [0, 393216, 2490496, 196609, null, 721503084, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 23 (script default): [721420288, 6, 38, -2147483645, 30408747, Salute, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 24 (script default): [721420288, 6, 38, -2147483645, 30408747, Goblin Bow, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 25 (script default): [721420288, 6, 38, -2147483645, 30408747, Goblin Salute, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 26 (script default): [721420288, 6, 38, -2147483645, 30408747, Glass Box, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 27 (script 1): [30408747, 0, 393216, 2490496, 196609, null, 721503084, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 28 (script 1): [0, 393216, 2490496, 196609, null, 721505381, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 29 (script default): [721420288, 6, 38, -2147483645, 30408747, Glass Wall, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 30 (script default): [721420288, 6, 38, -2147483645, 30408747, Slap Head, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 31 (script default): [721420288, 6, 38, -2147483645, 30408747, Stomp, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 32 (script 1): [0, 393216, 2490496, 196609, null, 721503852, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 33 (script 1): [0, 393216, 2490496, 196609, null, 721504612, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 34 (script default): [0, 393216, 2490496, 196609, null, 721508975, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 35 (script 1): [0, 393216, 2490496, 196609, null, 721508975, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 36 (script default): [0, 393216, 2490496, 196609, null, 721508975, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 37 (script default): [721420288, 6, 38, -2147483645, 30408747, Scared, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 38 (script default): [721420288, 6, 38, -2147483645, 30408747, Bunny-hop, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 39 (script default): [721420288, 6, 38, -2147483645, 30408747, Skillcape, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 40 (script default): [721420288, 6, 38, -2147483645, 30408747, Snowman Dance, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 41 (script default): [721420288, 6, 38, -2147483645, 30408747, Air Guitar, 50, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 464 child 42 (script 1): [0, 393216, 2490496, 196609, null, 721507169, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 465 child 2 (script 2): [null, 0, 0] +Interface 465 child 3 (script 2): [null, 0, 0] +Interface 465 child 4 (script 2): [null, 0, 0] +Interface 465 child 5 (script 2): [null, 0, 0] +Interface 499 child 7 (script 3): [1, 23, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 10 (script 3): [32702474, 6574120, null, 45, 32702474, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 11 (script 3): [32702475, 6574120, null, 45, 32702475, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 12 (script 3): [32702476, 6574120, null, 45, 32702476, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 13 (script 3): [32702477, 6574120, null, 45, 32702477, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 14 (script 3): [32702478, 6574120, null, 45, 32702478, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 15 (script 3): [32702479, 6574120, null, 45, 32702479, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 16 (script 3): [32702480, 6574120, null, 45, 32702480, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 17 (script 3): [32702481, 6574120, null, 45, 32702481, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 18 (script 3): [32702482, 6574120, null, 45, 32702482, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 19 (script 3): [32702483, 6574120, null, 45, 32702483, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 20 (script 3): [32702484, 6574120, null, 45, 32702484, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 21 (script 3): [32702485, 6574120, null, 45, 32702485, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 22 (script 3): [32702486, 6574120, null, 45, 32702486, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 499 child 23 (script 3): [32702487, 6574120, null, 45, 32702487, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 510 child 128 (script 1): [542, null, 44] +Interface 510 child 128 (script 3): [196608, 35454976, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 521 child 13 (script 1): [832, null, 44] +Interface 521 child 13 (script 3): [196608, 54460416, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 521 child 32 (script 3): [-2147483645, 16168038, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 521 child 47 (script 3): [-2147483645, 16168038, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 521 child 58 (script 3): [-2147483645, 16168038, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 522 child 6 (script 1): [832, null, 44] +Interface 522 child 6 (script 3): [196608, 54460416, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 523 child 97 (script 3): [-2147483645, 34275424, 792, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 523 child 100 (script 1): [832, null, 44] +Interface 523 child 100 (script 3): [196608, 54460416, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 2 (script 1): [0, 34537475, null, 69, 1, 34537475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 5 (script 1): [0, 34537478, null, 69, 1, 34537478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 8 (script 1): [0, 34537481, null, 69, 1, 34537481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 11 (script 1): [0, 34537484, null, 69, 1, 34537484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 14 (script 1): [0, 34537487, null, 69, 1, 34537487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 17 (script 1): [0, 34537490, null, 69, 1, 34537490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 20 (script 1): [0, 34537493, null, 69, 1, 34537493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 23 (script 1): [0, 34537496, null, 69, 1, 34537496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 26 (script 1): [0, 34537499, null, 69, 1, 34537499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 29 (script 1): [0, 34537502, null, 69, 1, 34537502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 32 (script 1): [0, 34537505, null, 69, 1, 34537505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 35 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 36 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 38 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 40 (script 2): [1, 34537475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 41 (script 1): [0, 34537536, null, 69, 1, 34537536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 42 (script 1): [0, 34537538, null, 69, 1, 34537538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 43 (script 1): [0, 34537540, null, 69, 1, 34537540, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 44 (script 1): [0, 34537542, null, 69, 1, 34537542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 45 (script 1): [0, 34537544, null, 69, 1, 34537544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 46 (script 1): [0, 34537546, null, 69, 1, 34537546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 47 (script 1): [0, 34537548, null, 69, 1, 34537548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 48 (script 1): [0, 34537550, null, 69, 1, 34537550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 49 (script 1): [0, 34537552, null, 69, 1, 34537552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 50 (script 1): [0, 34537554, null, 69, 1, 34537554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 51 (script 1): [0, 34537556, null, 69, 1, 34537556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 52 (script 1): [0, 34537558, null, 69, 1, 34537558, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 53 (script 1): [0, 34537560, null, 69, 1, 34537560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 54 (script 1): [0, 34537562, null, 69, 1, 34537562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 55 (script 1): [0, 34537564, null, 69, 1, 34537564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 56 (script 1): [0, 34537566, null, 69, 1, 34537566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 57 (script 1): [0, 34537568, null, 69, 1, 34537568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 58 (script 1): [0, 34537570, null, 69, 1, 34537570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 59 (script 1): [0, 34537572, null, 69, 1, 34537572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 60 (script 1): [0, 34537574, null, 69, 1, 34537574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 61 (script 1): [0, 34537576, null, 69, 1, 34537576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 62 (script 1): [0, 34537578, null, 69, 1, 34537578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 63 (script 1): [0, 34537579, null, 69, 1, 34537579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 110 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 111 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 112 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 113 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 116 (script 1): [0, 34537589, null, 69, 1, 34537589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 119 (script 1): [0, 34537592, null, 69, 1, 34537592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 122 (script 1): [0, 34537595, null, 69, 1, 34537595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 125 (script 1): [0, 34537598, null, 69, 1, 34537598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 128 (script 1): [0, 34537601, null, 69, 1, 34537601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 131 (script 1): [0, 34537604, null, 69, 1, 34537604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 134 (script 1): [0, 34537607, null, 69, 1, 34537607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 137 (script 1): [0, 34537610, null, 69, 1, 34537610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 140 (script 1): [0, 34537613, null, 69, 1, 34537613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 143 (script 1): [0, 34537616, null, 69, 1, 34537616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 146 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 147 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 148 (script 1): [0, 34537621, null, 69, 1, 34537621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 152 (script 1): [538, null, 44] +Interface 527 child 152 (script 3): [196608, 35192832, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 154 (script 1): [0, 34537627, null, 69, 1, 34537627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 157 (script 1): [0, 34537630, null, 69, 1, 34537630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 160 (script 1): [0, 34537633, null, 69, 1, 34537633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 163 (script 1): [0, 34537636, null, 69, 1, 34537636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 166 (script 1): [0, 34537639, null, 69, 1, 34537639, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 169 (script 1): [0, 34537642, null, 69, 1, 34537642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 172 (script 1): [0, 34537645, null, 69, 1, 34537645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 175 (script 1): [0, 34537648, null, 69, 1, 34537648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 178 (script 1): [0, 34537651, null, 69, 1, 34537651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 181 (script 1): [0, 34537654, null, 69, 1, 34537654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 184 (script 1): [0, 34537657, null, 69, 1, 34537657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 187 (script 1): [0, 34537660, null, 69, 1, 34537660, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 190 (script 1): [0, 34537663, null, 69, 1, 34537663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 193 (script 1): [0, 34537666, null, 69, 1, 34537666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 197 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 527 child 198 (script 3): [-2147483645, 14784543, null, 45, -2147483645, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 528 child 1 (script 1): [540, null, 44] +Interface 528 child 1 (script 3): [196608, 35323904, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 534 child 1 (script 1): [540, null, 44] +Interface 534 child 1 (script 3): [196608, 35323904, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 20 (script 1): [540, null, 44] +Interface 535 child 20 (script 3): [196608, 35323904, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 26 (script 3): [35061765, 25902, null, 67, 35061765, 25892, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 27 (script 3): [35061766, 25904, null, 67, 35061766, 25903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 28 (script 3): [35061767, 25906, null, 67, 35061767, 25905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 29 (script 3): [35061769, 25908, null, 67, 35061769, 25907, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 30 (script 3): [35061768, 25910, null, 67, 35061768, 25909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 31 (script 3): [35061770, 25912, null, 67, 35061770, 25911, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 32 (script 3): [35061773, 25914, null, 67, 35061773, 25913, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 33 (script 3): [35061772, 25916, null, 67, 35061772, 25915, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 34 (script 3): [35061771, 25918, null, 67, 35061771, 25917, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 35 (script 3): [35061778, 25891, null, 67, 35061778, 25893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 36 (script 3): [35061777, 25894, null, 67, 35061777, 25895, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 37 (script 3): [35061776, 25896, null, 67, 35061776, 25897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 535 child 38 (script 3): [35061775, 25898, null, 67, 35061775, 25899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 536 child 6 (script 1): [541, null, 44, 35127302, 542, 0] +Interface 536 child 6 (script 5): [29] +Interface 550 child 1 (script 3): [36044801, 36044802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 550 child 4 (script default): [103] +Interface 550 child 5 (script 4): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 551 child 2 (script 3): [36110338, 36110337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 551 child 4 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 551 child 5 (script 2): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 10 (script default): [196608, 35128064, 11264, null, 196608, 35061760, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 16 (script 9): [134] +Interface 553 child 18 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 19 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 20 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 21 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 1024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 22 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 23 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 1536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 24 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 1792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 25 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 2048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 26 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 2304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 27 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 2560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 28 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 2816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 29 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 3072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 553 child 30 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 16777215, 0, 512, 34560, 3328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 554 child 6 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 554 child 7 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 554 child 8 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 554 child 9 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 555 child 8 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 555 child 9 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 555 child 10 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 555 child 11 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 555 child 12 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 555 child 13 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 556 child 9 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 556 child 10 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 556 child 11 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 556 child 12 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 556 child 13 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 556 child 14 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 556 child 15 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 560 child 12 (script 1): [832, null, 44, 36700172, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 560 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 560 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 560 child 20 (script 1): [36700180, 9, 0, null, 163, 36700180, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 561 child 12 (script 1): [832, null, 44, 36765708, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 561 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 561 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 561 child 20 (script 1): [36765716, 21, 0, null, 163, 36765716, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 562 child 12 (script 1): [832, null, 44, 36831244, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 562 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 562 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 562 child 20 (script 1): [36831252, 2, 0, null, 163, 36831252, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 563 child 12 (script 1): [832, null, 44, 36896780, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 563 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 563 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 563 child 20 (script 1): [36896788, 5, 0, null, 163, 36896788, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 564 child 12 (script 1): [832, null, 44, 36962316, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 564 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 564 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 564 child 20 (script 1): [36962324, 23, 0, null, 163, 36962324, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 565 child 12 (script 1): [832, null, 44, 37027852, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 565 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 565 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 565 child 20 (script 1): [37027860, 10, 0, null, 163, 37027860, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 566 child 12 (script 1): [832, null, 44, 37093388, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 566 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 566 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 566 child 20 (script 1): [37093396, 6, 0, null, 163, 37093396, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 567 child 12 (script 1): [832, null, 44, 37158924, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 567 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 567 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 567 child 20 (script 1): [37158932, 14, 0, null, 163, 37158932, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 568 child 12 (script 1): [832, null, 44, 37224460, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 568 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 568 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 568 child 20 (script 1): [37224468, 3, 0, null, 163, 37224468, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 569 child 12 (script 1): [832, null, 44, 37289996, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 569 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 569 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 569 child 20 (script 1): [37290004, 16, 0, null, 163, 37290004, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 570 child 12 (script 1): [832, null, 44, 37355532, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 570 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 570 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 570 child 20 (script 1): [37355540, 17, 0, null, 163, 37355540, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 571 child 12 (script 1): [832, null, 44, 37421068, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 571 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 571 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 571 child 20 (script 1): [37421076, 19, 0, null, 163, 37421076, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 572 child 12 (script 1): [832, null, 44, 37486604, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 572 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 572 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 572 child 20 (script 1): [37486612, 13, 0, null, 163, 37486612, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 573 child 12 (script 1): [832, null, 44, 37552140, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 573 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 573 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 573 child 20 (script 1): [37552148, 12, 0, null, 163, 37552148, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 574 child 12 (script 1): [832, null, 44, 37617676, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 574 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 574 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 574 child 20 (script 1): [37617684, 1, 0, null, 163, 37617684, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 575 child 12 (script 1): [832, null, 44, 37683212, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 575 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 575 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 575 child 20 (script 1): [37683220, 22, 0, null, 163, 37683220, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 576 child 12 (script 1): [832, null, 44, 37748748, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 576 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 576 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 576 child 20 (script 1): [37748756, 8, 0, null, 163, 37748756, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 577 child 12 (script 1): [832, null, 44, 37814284, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 577 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 577 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 577 child 20 (script 1): [37814292, 18, 0, null, 163, 37814292, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 578 child 12 (script 1): [832, null, 44, 37879820, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 578 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 578 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 578 child 20 (script 1): [37879828, 15, 0, null, 163, 37879828, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 579 child 12 (script 1): [832, null, 44, 37945356, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 579 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 579 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 579 child 20 (script 1): [37945364, 4, 0, null, 163, 37945364, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 580 child 12 (script 1): [832, null, 44, 38010892, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 580 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 580 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 580 child 20 (script 1): [38010900, 20, 0, null, 163, 38010900, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 581 child 12 (script 1): [832, null, 44, 38076428, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 581 child 18 (script 1): [38076434, 24, 0, null, 163, 38076434, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 13 (script 1): [832, null, 44, 38207501, 831, 0, 16777216, 486539264, 0, 0, 0, 0, 0] +Interface 583 child 17 (script default): [196610, null, 268435456, null, null, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 18 (script 3): [-2147483645, 1, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 19 (script 3): [-2147483645, 13, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 20 (script 3): [-2147483645, 4, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 21 (script 3): [-2147483645, 3, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 22 (script 3): [-2147483645, 6, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 23 (script 3): [-2147483645, 5, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 24 (script 3): [-2147483645, 2, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 25 (script 3): [-2147483645, 11, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 26 (script 3): [-2147483645, 14, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 27 (script 3): [-2147483645, 15, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 28 (script 3): [-2147483645, 16, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 29 (script 3): [-2147483645, 20, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 30 (script 3): [-2147483645, 9, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 31 (script 3): [-2147483645, 17, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 32 (script 3): [-2147483645, 10, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 33 (script 3): [-2147483645, 12, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 34 (script 1): [-2147483645, 8, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 35 (script 3): [-2147483645, 7, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 36 (script 3): [-2147483645, 19, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 37 (script 3): [-2147483645, 18, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 38 (script 3): [-2147483645, 23, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 39 (script 3): [-2147483645, 24, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 40 (script 3): [-2147483645, 25, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 41 (script 3): [-2147483645, 26, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 42 (script 3): [-2147483645, 21, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 43 (script 3): [-2147483645, 27, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 44 (script 3): [-2147483645, 28, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 583 child 45 (script 3): [-2147483645, 29, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 588 child 2 (script 1): [542, null, 44] +Interface 588 child 2 (script 3): [196608, 35454976, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 588 child 7 (script 3): [170] +Interface 588 child 7 (script 16): [269056] +Interface 588 child 14 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 6574110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 588 child 20 (script 3): [-2147483645, 16777215, null, 169, 1, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 588 child 21 (script 3): [-2147483645, 16777215, null, 169, 2, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 588 child 22 (script 3): [-2147483645, 16777215, null, 169, 3, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 588 child 23 (script 3): [-2147483645, 16777215, null, 169, 4, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 589 child 2 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 589 child 3 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 589 child 5 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 589 child 8 (script 7): [194, -2147483644] +Interface 591 child 174 (script 2): [null] +Interface 591 child 176 (script 2): [null] +Interface 591 child 178 (script 2): [null] +Interface 591 child 180 (script default): [1050, null, 299] +Interface 591 child 180 (script 2): [null, +] +Interface 591 child 180 (script 3): [196608, 69337088, 0, null, 38, -2147483645, 38732075, Confirm Purchase, 25, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 182 (script default): [+, 0, 100663296, 637566976, 50332239, +Show Torso Selections, 25, 80, , 110848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 183 (script default): [+, 0, 100663296, 637566976, 50332239, +Show Arms Selections, 25, 80, , 111104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 184 (script default): [+, 0, 100663296, 637566976, 50332239, +Show Legs Selections, 25, 80, , 111360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 185 (script 9): [436] +Interface 591 child 186 (script 9): [437] +Interface 591 child 187 (script 9): [438] +Interface 591 child 188 (script 9): [439] +Interface 591 child 189 (script 9): [440] +Interface 591 child 190 (script 9): [441] +Interface 591 child 191 (script 9): [442] +Interface 591 child 192 (script 9): [443] +Interface 591 child 193 (script 9): [444] +Interface 591 child 194 (script 9): [445] +Interface 591 child 195 (script 9): [446] +Interface 591 child 196 (script 9): [447] +Interface 591 child 197 (script 9): [448] +Interface 591 child 198 (script 9): [449] +Interface 591 child 199 (script 9): [450] +Interface 591 child 200 (script 9): [451] +Interface 591 child 201 (script 9): [452] +Interface 591 child 202 (script 9): [453] +Interface 591 child 203 (script 9): [454] +Interface 591 child 204 (script 9): [455] +Interface 591 child 205 (script 9): [456] +Interface 591 child 206 (script 9): [457] +Interface 591 child 207 (script 9): [458] +Interface 591 child 208 (script 9): [459] +Interface 591 child 209 (script 9): [460] +Interface 591 child 210 (script 9): [461] +Interface 591 child 211 (script 9): [462] +Interface 591 child 212 (script 9): [463] +Interface 591 child 213 (script 9): [464] +Interface 591 child 214 (script 9): [465] +Interface 591 child 215 (script 9): [466] +Interface 591 child 216 (script 9): [467] +Interface 591 child 217 (script 9): [468] +Interface 591 child 218 (script 9): [469] +Interface 591 child 219 (script 9): [470] +Interface 591 child 220 (script 9): [471] +Interface 591 child 221 (script 9): [472] +Interface 591 child 252 (script 2): [1042, null, 299] +Interface 591 child 252 (script 4): [null, +] +Interface 591 child 252 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Burgundy, 25, 40, , 121088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 253 (script 2): [1042, null, 299] +Interface 591 child 253 (script 4): [null, +] +Interface 591 child 253 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Red, 25, 40, , 121344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 254 (script 2): [1042, null, 299] +Interface 591 child 254 (script 4): [null, +] +Interface 591 child 254 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Dark Red, 25, 40, , 121600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 255 (script 2): [1042, null, 299] +Interface 591 child 255 (script 4): [null, +] +Interface 591 child 255 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Pink, 25, 40, , 121856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 256 (script 2): [1042, null, 299] +Interface 591 child 256 (script 4): [null, +] +Interface 591 child 256 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Dark Pink, 25, 40, , 122112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 257 (script 2): [1042, null, 299] +Interface 591 child 257 (script 4): [null, +] +Interface 591 child 257 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Orange, 25, 40, , 122368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 258 (script 2): [1042, null, 299] +Interface 591 child 258 (script 4): [null, +] +Interface 591 child 258 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Burnt Orange, 25, 40, , 122624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 259 (script 2): [1042, null, 299] +Interface 591 child 259 (script 4): [null, +] +Interface 591 child 259 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Peach, 25, 40, , 122880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 260 (script 2): [1042, null, 299] +Interface 591 child 260 (script 4): [null, +] +Interface 591 child 260 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Light Khaki, 25, 40, , 123136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 261 (script 2): [1042, null, 299] +Interface 591 child 261 (script 4): [null, +] +Interface 591 child 261 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Khaki, 25, 40, , 123392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 262 (script 2): [1042, null, 299] +Interface 591 child 262 (script 4): [null, +] +Interface 591 child 262 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Gold, 25, 40, , 123648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 263 (script 2): [1042, null, 299] +Interface 591 child 263 (script 4): [null, +] +Interface 591 child 263 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Moss Green, 25, 40, , 123904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 264 (script 2): [1042, null, 299] +Interface 591 child 264 (script 4): [null, +] +Interface 591 child 264 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Mint Green, 25, 40, , 124160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 265 (script 2): [1042, null, 299] +Interface 591 child 265 (script 4): [null, +] +Interface 591 child 265 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Sea Green, 25, 40, , 124416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 266 (script 2): [1042, null, 299] +Interface 591 child 266 (script 4): [null, +] +Interface 591 child 266 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Forest Green, 25, 40, , 124672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 267 (script 2): [1042, null, 299] +Interface 591 child 267 (script 4): [null, +] +Interface 591 child 267 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Dark Green, 25, 40, , 124928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 268 (script 2): [1042, null, 299] +Interface 591 child 268 (script 4): [null, +] +Interface 591 child 268 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Royal Blue, 25, 40, , 125184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 269 (script 2): [1042, null, 299] +Interface 591 child 269 (script 4): [null, +] +Interface 591 child 269 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Dark Blue, 25, 40, , 125440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 270 (script 2): [1042, null, 299] +Interface 591 child 270 (script 4): [null, +] +Interface 591 child 270 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Light Blue, 25, 40, , 125696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 271 (script 2): [1042, null, 299] +Interface 591 child 271 (script 4): [null, +] +Interface 591 child 271 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Pale Blue, 25, 40, , 125952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 272 (script 2): [1042, null, 299] +Interface 591 child 272 (script 4): [null, +] +Interface 591 child 272 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Mauve, 25, 40, , 126208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 273 (script 2): [1042, null, 299] +Interface 591 child 273 (script 4): [null, +] +Interface 591 child 273 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Violet, 25, 40, , 126464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 274 (script 2): [1042, null, 299] +Interface 591 child 274 (script 4): [null, +] +Interface 591 child 274 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Indigo, 25, 40, , 126720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 275 (script 2): [1042, null, 299] +Interface 591 child 275 (script 4): [null, +] +Interface 591 child 275 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Navy Blue, 25, 40, , 126976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 276 (script 2): [1042, null, 299] +Interface 591 child 276 (script 4): [null, +] +Interface 591 child 276 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Beige, 25, 40, , 127232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 277 (script 2): [1042, null, 299] +Interface 591 child 277 (script 4): [null, +] +Interface 591 child 277 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Light Grey, 25, 40, , 127488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 278 (script 2): [1042, null, 299] +Interface 591 child 278 (script 4): [null, +] +Interface 591 child 278 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Taupe, 25, 40, , 127744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 279 (script 2): [1042, null, 299] +Interface 591 child 279 (script 4): [null, +] +Interface 591 child 279 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Dark Grey, 25, 40, , 128000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 280 (script 2): [1042, null, 299] +Interface 591 child 280 (script 4): [null, +] +Interface 591 child 280 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38732075, Black, 25, 40, , 128256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 281 (script 1): [832, null, 44] +Interface 591 child 281 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 591 child 297 (script 3): [38731956, 1050, null, 299, 38732075, 38731956, 1058, 0, 393216, 2490496, 196610, null, +Confirm Purchase, 25, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 132 (script default): [1050, null, 299] +Interface 592 child 132 (script 2): [null, -402620416] +Interface 592 child 132 (script 4): [1058, 0, 393216] +Interface 592 child 132 (script 7): [-2147483645, 38797544, Confirm Purchase, 25, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 135 (script 1): [0, 393216, 2490496, 196610, null, -402566296, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 136 (script 2): [null] +Interface 592 child 137 (script 9): [318] +Interface 592 child 138 (script 9): [319] +Interface 592 child 139 (script 9): [320] +Interface 592 child 140 (script 9): [321] +Interface 592 child 141 (script 9): [322] +Interface 592 child 142 (script 9): [323] +Interface 592 child 143 (script 9): [324] +Interface 592 child 144 (script 9): [325] +Interface 592 child 145 (script 9): [326] +Interface 592 child 146 (script 9): [327] +Interface 592 child 147 (script 9): [328] +Interface 592 child 148 (script 9): [329] +Interface 592 child 149 (script 9): [330] +Interface 592 child 150 (script 9): [331] +Interface 592 child 151 (script 9): [332] +Interface 592 child 152 (script 9): [333] +Interface 592 child 153 (script 9): [334] +Interface 592 child 154 (script 9): [335] +Interface 592 child 155 (script 9): [336] +Interface 592 child 156 (script 9): [337] +Interface 592 child 157 (script 9): [338] +Interface 592 child 158 (script 9): [339] +Interface 592 child 185 (script 2): [1042, null, 299] +Interface 592 child 185 (script 4): [null, -402620416] +Interface 592 child 185 (script 6): [1041, 0, 393216] +Interface 592 child 185 (script 9): [-2147483645, 38797544, Burgundy, 25, 40, , 87040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 186 (script 2): [1042, null, 299] +Interface 592 child 186 (script 4): [null, -402620416] +Interface 592 child 186 (script 6): [1041, 0, 393216] +Interface 592 child 186 (script 9): [-2147483645, 38797544, Red, 25, 40, , 87296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 187 (script 2): [1042, null, 299] +Interface 592 child 187 (script 4): [null, -402620416] +Interface 592 child 187 (script 6): [1041, 0, 393216] +Interface 592 child 187 (script 9): [-2147483645, 38797544, Vermillion, 25, 40, , 87552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 188 (script 2): [1042, null, 299] +Interface 592 child 188 (script 4): [null, -402620416] +Interface 592 child 188 (script 6): [1041, 0, 393216] +Interface 592 child 188 (script 9): [-2147483645, 38797544, Pink, 25, 40, , 87808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 189 (script 2): [1042, null, 299] +Interface 592 child 189 (script 4): [null, -402620416] +Interface 592 child 189 (script 6): [1041, 0, 393216] +Interface 592 child 189 (script 9): [-2147483645, 38797544, Orange, 25, 40, , 88064, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 190 (script 2): [1042, null, 299] +Interface 592 child 190 (script 4): [null, -402620416] +Interface 592 child 190 (script 6): [1041, 0, 393216] +Interface 592 child 190 (script 9): [-2147483645, 38797544, Yellow, 25, 40, , 88320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 191 (script 2): [1042, null, 299] +Interface 592 child 191 (script 4): [null, -402620416] +Interface 592 child 191 (script 6): [1041, 0, 393216] +Interface 592 child 191 (script 9): [-2147483645, 38797544, Peach, 25, 40, , 88576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 192 (script 2): [1042, null, 299] +Interface 592 child 192 (script 4): [null, -402620416] +Interface 592 child 192 (script 6): [1041, 0, 393216] +Interface 592 child 192 (script 9): [-2147483645, 38797544, Brown, 25, 40, , 88832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 193 (script 2): [1042, null, 299] +Interface 592 child 193 (script 4): [null, -402620416] +Interface 592 child 193 (script 6): [1041, 0, 393216] +Interface 592 child 193 (script 9): [-2147483645, 38797544, Dark Brown, 25, 40, , 89088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 194 (script 2): [1042, null, 299] +Interface 592 child 194 (script 4): [null, -402620416] +Interface 592 child 194 (script 6): [1041, 0, 393216] +Interface 592 child 194 (script 9): [-2147483645, 38797544, Light Brown, 25, 40, , 89344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 195 (script 2): [1042, null, 299] +Interface 592 child 195 (script 4): [null, -402620416] +Interface 592 child 195 (script 6): [1041, 0, 393216] +Interface 592 child 195 (script 9): [-2147483645, 38797544, Mint Green, 25, 40, , 89600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 196 (script 2): [1042, null, 299] +Interface 592 child 196 (script 4): [null, -402620416] +Interface 592 child 196 (script 6): [1041, 0, 393216] +Interface 592 child 196 (script 9): [-2147483645, 38797544, Green, 25, 40, , 89856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 197 (script 2): [1042, null, 299] +Interface 592 child 197 (script 4): [null, -402620416] +Interface 592 child 197 (script 6): [1041, 0, 393216] +Interface 592 child 197 (script 9): [-2147483645, 38797544, Dark Green, 25, 40, , 90112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 198 (script 2): [1042, null, 299] +Interface 592 child 198 (script 4): [null, -402620416] +Interface 592 child 198 (script 6): [1041, 0, 393216] +Interface 592 child 198 (script 9): [-2147483645, 38797544, Dark Blue, 25, 40, , 90368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 199 (script 2): [1042, null, 299] +Interface 592 child 199 (script 4): [null, -402620416] +Interface 592 child 199 (script 6): [1041, 0, 393216] +Interface 592 child 199 (script 9): [-2147483645, 38797544, Turquoise, 25, 40, , 90624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 200 (script 2): [1042, null, 299] +Interface 592 child 200 (script 4): [null, -402620416] +Interface 592 child 200 (script 6): [1041, 0, 393216] +Interface 592 child 200 (script 9): [-2147483645, 38797544, Cyan, 25, 40, , 90880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 201 (script 2): [1042, null, 299] +Interface 592 child 201 (script 4): [null, -402620416] +Interface 592 child 201 (script 6): [1041, 0, 393216] +Interface 592 child 201 (script 9): [-2147483645, 38797544, Purple, 25, 40, , 91136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 202 (script 2): [1042, null, 299] +Interface 592 child 202 (script 4): [null, -402620416] +Interface 592 child 202 (script 6): [1041, 0, 393216] +Interface 592 child 202 (script 9): [-2147483645, 38797544, Violet, 25, 40, , 91392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 203 (script 2): [1042, null, 299] +Interface 592 child 203 (script 4): [null, -402620416] +Interface 592 child 203 (script 6): [1041, 0, 393216] +Interface 592 child 203 (script 9): [-2147483645, 38797544, Indigo, 25, 40, , 91648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 204 (script 2): [1042, null, 299] +Interface 592 child 204 (script 4): [null, -402620416] +Interface 592 child 204 (script 6): [1041, 0, 393216] +Interface 592 child 204 (script 9): [-2147483645, 38797544, Dark Grey, 25, 40, , 91904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 205 (script 2): [1042, null, 299] +Interface 592 child 205 (script 4): [null, -402620416] +Interface 592 child 205 (script 6): [1041, 0, 393216] +Interface 592 child 205 (script 9): [-2147483645, 38797544, Military Grey, 25, 40, , 92160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 206 (script 2): [1042, null, 299] +Interface 592 child 206 (script 4): [null, -402620416] +Interface 592 child 206 (script 6): [1041, 0, 393216] +Interface 592 child 206 (script 9): [-2147483645, 38797544, White, 25, 40, , 92416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 207 (script 2): [1042, null, 299] +Interface 592 child 207 (script 4): [null, -402620416] +Interface 592 child 207 (script 6): [1041, 0, 393216] +Interface 592 child 207 (script 9): [-2147483645, 38797544, Light Grey, 25, 40, , 92672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 208 (script 2): [1042, null, 299] +Interface 592 child 208 (script 4): [null, -402620416] +Interface 592 child 208 (script 6): [1041, 0, 393216] +Interface 592 child 208 (script 9): [-2147483645, 38797544, Taupe, 25, 40, , 92928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 209 (script 2): [1042, null, 299] +Interface 592 child 209 (script 4): [null, -402620416] +Interface 592 child 209 (script 6): [1041, 0, 393216] +Interface 592 child 209 (script 9): [-2147483645, 38797544, Black, 25, 40, , 93184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 210 (script 1): [832, null, 44] +Interface 592 child 210 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 592 child 230 (script 3): [38797444, 1050, null, 299, 38797544, 38797444, 1058, 0, 393216, 2490496, 196610, null, -402570385, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 593 child 117 (script default): [1050, null, 299] +Interface 593 child 117 (script 2): [null, -1744797696] +Interface 593 child 117 (script 4): [1058, 0, 393216] +Interface 593 child 117 (script 7): [-2147483645, 38863000, Confirm Purchase, 25, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 593 child 120 (script default): [-1744830464, 6, 38, -2147483645, 38863000, Show Silver Selections, 25, 80, , 76800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 593 child 121 (script default): [-1744830464, 6, 38, -2147483645, 38863000, Show Gold Selections, 25, 80, , 77056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 593 child 122 (script 9): [302] +Interface 593 child 123 (script 9): [303] +Interface 593 child 124 (script 9): [304] +Interface 593 child 125 (script 9): [305] +Interface 593 child 126 (script 9): [306] +Interface 593 child 127 (script 9): [307] +Interface 593 child 128 (script 9): [308] +Interface 593 child 129 (script 9): [309] +Interface 593 child 130 (script 9): [310] +Interface 593 child 131 (script 9): [311] +Interface 593 child 132 (script 9): [312] +Interface 593 child 133 (script 9): [313] +Interface 593 child 134 (script 9): [314] +Interface 593 child 135 (script 9): [315] +Interface 593 child 136 (script 1): [832, null, 44] +Interface 593 child 136 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 593 child 150 (script 3): [38862965, 1050, null, 299, 38863000, 38862965, 1058, 0, 393216, 2490496, 196610, null, -1744747665, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 174 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 176 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 178 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 181 (script default): [1050, null, 299] +Interface 594 child 181 (script 2): [null, ,] +Interface 594 child 181 (script 3): [196608, 69337088, 0, null, 38, -2147483645, 38928684, Confirm Purchase, 25, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 183 (script default): [,, 0, 100663296, 637566976, 50332242, ,Show Torso Selections, 25, 80, , 58368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 184 (script default): [,, 0, 100663296, 637566976, 50332242, ,Show Arms Selections, 25, 80, , 58624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 185 (script default): [,, 0, 100663296, 637566976, 50332242, ,Show Legs Selections, 25, 80, , 58880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 186 (script 9): [231] +Interface 594 child 187 (script 9): [232] +Interface 594 child 188 (script 9): [233] +Interface 594 child 189 (script 9): [234] +Interface 594 child 190 (script 9): [235] +Interface 594 child 191 (script 9): [236] +Interface 594 child 192 (script 9): [237] +Interface 594 child 193 (script 9): [238] +Interface 594 child 194 (script 9): [239] +Interface 594 child 195 (script 9): [240] +Interface 594 child 196 (script 9): [241] +Interface 594 child 197 (script 9): [242] +Interface 594 child 198 (script 9): [243] +Interface 594 child 199 (script 9): [245] +Interface 594 child 200 (script 9): [244] +Interface 594 child 201 (script 9): [246] +Interface 594 child 202 (script 9): [247] +Interface 594 child 203 (script 9): [248] +Interface 594 child 204 (script 9): [249] +Interface 594 child 205 (script 9): [250] +Interface 594 child 206 (script 9): [251] +Interface 594 child 207 (script 9): [252] +Interface 594 child 208 (script 9): [253] +Interface 594 child 209 (script 9): [254] +Interface 594 child 210 (script 9): [255] +Interface 594 child 211 (script 9): [256] +Interface 594 child 212 (script 9): [257] +Interface 594 child 213 (script 9): [258] +Interface 594 child 214 (script 9): [259] +Interface 594 child 215 (script 9): [260] +Interface 594 child 216 (script 9): [261] +Interface 594 child 217 (script 9): [262] +Interface 594 child 218 (script 9): [263] +Interface 594 child 219 (script 9): [264] +Interface 594 child 220 (script 9): [265] +Interface 594 child 221 (script 9): [266] +Interface 594 child 222 (script 9): [267] +Interface 594 child 253 (script 2): [1042, null, 299] +Interface 594 child 253 (script 4): [null, ,] +Interface 594 child 253 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Burgundy, 25, 40, , 68608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 254 (script 2): [1042, null, 299] +Interface 594 child 254 (script 4): [null, ,] +Interface 594 child 254 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Red, 25, 40, , 68864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 255 (script 2): [1042, null, 299] +Interface 594 child 255 (script 4): [null, ,] +Interface 594 child 255 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Dark Red, 25, 40, , 69120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 256 (script 2): [1042, null, 299] +Interface 594 child 256 (script 4): [null, ,] +Interface 594 child 256 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Pink, 25, 40, , 69376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 257 (script 2): [1042, null, 299] +Interface 594 child 257 (script 4): [null, ,] +Interface 594 child 257 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Dark Pink, 25, 40, , 69632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 258 (script 2): [1042, null, 299] +Interface 594 child 258 (script 4): [null, ,] +Interface 594 child 258 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Orange, 25, 40, , 69888, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 259 (script 2): [1042, null, 299] +Interface 594 child 259 (script 4): [null, ,] +Interface 594 child 259 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Burnt Orange, 25, 40, , 70144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 260 (script 2): [1042, null, 299] +Interface 594 child 260 (script 4): [null, ,] +Interface 594 child 260 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Peach, 25, 40, , 70400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 261 (script 2): [1042, null, 299] +Interface 594 child 261 (script 4): [null, ,] +Interface 594 child 261 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Light Khaki, 25, 40, , 70656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 262 (script 2): [1042, null, 299] +Interface 594 child 262 (script 4): [null, ,] +Interface 594 child 262 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Khaki, 25, 40, , 70912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 263 (script 2): [1042, null, 299] +Interface 594 child 263 (script 4): [null, ,] +Interface 594 child 263 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Gold, 25, 40, , 71168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 264 (script 2): [1042, null, 299] +Interface 594 child 264 (script 4): [null, ,] +Interface 594 child 264 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Moss Green, 25, 40, , 71424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 265 (script 2): [1042, null, 299] +Interface 594 child 265 (script 4): [null, ,] +Interface 594 child 265 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Mint Green, 25, 40, , 71680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 266 (script 2): [1042, null, 299] +Interface 594 child 266 (script 4): [null, ,] +Interface 594 child 266 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Sea Green, 25, 40, , 71936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 267 (script 2): [1042, null, 299] +Interface 594 child 267 (script 4): [null, ,] +Interface 594 child 267 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Forest Green, 25, 40, , 72192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 268 (script 2): [1042, null, 299] +Interface 594 child 268 (script 4): [null, ,] +Interface 594 child 268 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Dark Green, 25, 40, , 72448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 269 (script 2): [1042, null, 299] +Interface 594 child 269 (script 4): [null, ,] +Interface 594 child 269 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Royal Blue, 25, 40, , 72704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 270 (script 2): [1042, null, 299] +Interface 594 child 270 (script 4): [null, ,] +Interface 594 child 270 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Dark Blue, 25, 40, , 72960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 271 (script 2): [1042, null, 299] +Interface 594 child 271 (script 4): [null, ,] +Interface 594 child 271 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Light Blue, 25, 40, , 73216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 272 (script 2): [1042, null, 299] +Interface 594 child 272 (script 4): [null, ,] +Interface 594 child 272 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Pale Blue, 25, 40, , 73472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 273 (script 2): [1042, null, 299] +Interface 594 child 273 (script 4): [null, ,] +Interface 594 child 273 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Mauve, 25, 40, , 73728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 274 (script 2): [1042, null, 299] +Interface 594 child 274 (script 4): [null, ,] +Interface 594 child 274 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Violet, 25, 40, , 73984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 275 (script 2): [1042, null, 299] +Interface 594 child 275 (script 4): [null, ,] +Interface 594 child 275 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Indigo, 25, 40, , 74240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 276 (script 2): [1042, null, 299] +Interface 594 child 276 (script 4): [null, ,] +Interface 594 child 276 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Navy Blue, 25, 40, , 74496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 277 (script 2): [1042, null, 299] +Interface 594 child 277 (script 4): [null, ,] +Interface 594 child 277 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Beige, 25, 40, , 74752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 278 (script 2): [1042, null, 299] +Interface 594 child 278 (script 4): [null, ,] +Interface 594 child 278 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Light Grey, 25, 40, , 75008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 279 (script 2): [1042, null, 299] +Interface 594 child 279 (script 4): [null, ,] +Interface 594 child 279 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Taupe, 25, 40, , 75264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 280 (script 2): [1042, null, 299] +Interface 594 child 280 (script 4): [null, ,] +Interface 594 child 280 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Dark Grey, 25, 40, , 75520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 281 (script 2): [1042, null, 299] +Interface 594 child 281 (script 4): [null, ,] +Interface 594 child 281 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 38928684, Black, 25, 40, , 75776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 282 (script 1): [832, null, 44] +Interface 594 child 282 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 594 child 298 (script 3): [38928565, 1050, null, 299, 38928684, 38928565, 1058, 0, 393216, 2490496, 196610, null, ,Confirm Purchase, 25, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 595 child 117 (script default): [1050, null, 299] +Interface 595 child 117 (script 2): [null, -1744797696] +Interface 595 child 117 (script 4): [1058, 0, 393216] +Interface 595 child 117 (script 7): [-2147483645, 38994072, Confirm Purchase, 25, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 595 child 120 (script default): [-1744830464, 6, 38, -2147483645, 38994072, Show Silver Selections, 25, 80, , 53248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 595 child 121 (script default): [-1744830464, 6, 38, -2147483645, 38994072, Show Gold Selections, 25, 80, , 53504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 595 child 122 (script 9): [210] +Interface 595 child 123 (script 9): [211] +Interface 595 child 124 (script 9): [212] +Interface 595 child 125 (script 9): [213] +Interface 595 child 126 (script 9): [214] +Interface 595 child 127 (script 9): [215] +Interface 595 child 128 (script 9): [216] +Interface 595 child 129 (script 9): [217] +Interface 595 child 130 (script 9): [218] +Interface 595 child 131 (script 9): [219] +Interface 595 child 132 (script 9): [220] +Interface 595 child 133 (script 9): [221] +Interface 595 child 134 (script 9): [222] +Interface 595 child 135 (script 9): [223] +Interface 595 child 136 (script 1): [832, null, 44] +Interface 595 child 136 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 595 child 150 (script 3): [38994037, 1050, null, 299, 38994072, 38994037, 1058, 0, 393216, 2490496, 196610, null, -1744747665, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 160 (script default): [1050, null, 299] +Interface 596 child 160 (script 2): [null, ] +Interface 596 child 160 (script 3): [196608, 69337088, 0, null, 38, -2147483645, 39059727, Confirm Purchase, 25, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 163 (script default): [null] +Interface 596 child 163 (script 8): [38, -2147483645, 39059727, Show Hair Selections, 25, 80] +Interface 596 child 163 (script 9): [369] +Interface 596 child 164 (script default): [, 0, 100663296, 637566976, 50332244, Show Beard Selections, 25, 80, , 94720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 165 (script 2): [null] +Interface 596 child 166 (script 2): [null] +Interface 596 child 167 (script 9): [371] +Interface 596 child 168 (script 9): [372] +Interface 596 child 169 (script 9): [373] +Interface 596 child 170 (script 9): [374] +Interface 596 child 171 (script 9): [375] +Interface 596 child 172 (script 9): [376] +Interface 596 child 173 (script 9): [377] +Interface 596 child 174 (script 9): [378] +Interface 596 child 175 (script 9): [379] +Interface 596 child 176 (script 9): [380] +Interface 596 child 177 (script 9): [381] +Interface 596 child 178 (script 9): [382] +Interface 596 child 179 (script 9): [383] +Interface 596 child 180 (script 9): [384] +Interface 596 child 181 (script 9): [385] +Interface 596 child 182 (script 9): [386] +Interface 596 child 183 (script 9): [387] +Interface 596 child 184 (script 9): [388] +Interface 596 child 185 (script 9): [389] +Interface 596 child 186 (script 9): [390] +Interface 596 child 187 (script 9): [391] +Interface 596 child 188 (script 9): [392] +Interface 596 child 189 (script 9): [393] +Interface 596 child 190 (script 9): [394] +Interface 596 child 191 (script 9): [395] +Interface 596 child 192 (script 9): [396] +Interface 596 child 193 (script 9): [397] +Interface 596 child 194 (script 9): [398] +Interface 596 child 195 (script 9): [399] +Interface 596 child 196 (script 9): [400] +Interface 596 child 197 (script 9): [401] +Interface 596 child 224 (script 2): [1042, null, 299] +Interface 596 child 224 (script 4): [null, ] +Interface 596 child 224 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Burgundy, 25, 40, , 102912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 225 (script 2): [1042, null, 299] +Interface 596 child 225 (script 4): [null, ] +Interface 596 child 225 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Red, 25, 40, , 103168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 226 (script 2): [1042, null, 299] +Interface 596 child 226 (script 4): [null, ] +Interface 596 child 226 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Vermillion, 25, 40, , 103424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 227 (script 2): [1042, null, 299] +Interface 596 child 227 (script 4): [null, ] +Interface 596 child 227 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Pink, 25, 40, , 103680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 228 (script 2): [1042, null, 299] +Interface 596 child 228 (script 4): [null, ] +Interface 596 child 228 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Orange, 25, 40, , 103936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 229 (script 2): [1042, null, 299] +Interface 596 child 229 (script 4): [null, ] +Interface 596 child 229 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Yellow, 25, 40, , 104192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 230 (script 2): [1042, null, 299] +Interface 596 child 230 (script 4): [null, ] +Interface 596 child 230 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Peach, 25, 40, , 104448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 231 (script 2): [1042, null, 299] +Interface 596 child 231 (script 4): [null, ] +Interface 596 child 231 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Brown, 25, 40, , 104704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 232 (script 2): [1042, null, 299] +Interface 596 child 232 (script 4): [null, ] +Interface 596 child 232 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Dark Brown, 25, 40, , 104960, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 233 (script 2): [1042, null, 299] +Interface 596 child 233 (script 4): [null, ] +Interface 596 child 233 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Light Brown, 25, 40, , 105216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 234 (script 2): [1042, null, 299] +Interface 596 child 234 (script 4): [null, ] +Interface 596 child 234 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Mint Green, 25, 40, , 105472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 235 (script 2): [1042, null, 299] +Interface 596 child 235 (script 4): [null, ] +Interface 596 child 235 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Green, 25, 40, , 105728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 236 (script 2): [1042, null, 299] +Interface 596 child 236 (script 4): [null, ] +Interface 596 child 236 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Dark Green, 25, 40, , 105984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 237 (script 2): [1042, null, 299] +Interface 596 child 237 (script 4): [null, ] +Interface 596 child 237 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Dark Blue, 25, 40, , 106240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 238 (script 2): [1042, null, 299] +Interface 596 child 238 (script 4): [null, ] +Interface 596 child 238 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Turquoise, 25, 40, , 106496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 239 (script 2): [1042, null, 299] +Interface 596 child 239 (script 4): [null, ] +Interface 596 child 239 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Cyan, 25, 40, , 106752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 240 (script 2): [1042, null, 299] +Interface 596 child 240 (script 4): [null, ] +Interface 596 child 240 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Purple, 25, 40, , 107008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 241 (script 2): [1042, null, 299] +Interface 596 child 241 (script 4): [null, ] +Interface 596 child 241 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Violet, 25, 40, , 107264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 242 (script 2): [1042, null, 299] +Interface 596 child 242 (script 4): [null, ] +Interface 596 child 242 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Indigo, 25, 40, , 107520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 243 (script 2): [1042, null, 299] +Interface 596 child 243 (script 4): [null, ] +Interface 596 child 243 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Dark Grey, 25, 40, , 107776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 244 (script 2): [1042, null, 299] +Interface 596 child 244 (script 4): [null, ] +Interface 596 child 244 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Military Grey, 25, 40, , 108032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 245 (script 2): [1042, null, 299] +Interface 596 child 245 (script 4): [null, ] +Interface 596 child 245 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, White, 25, 40, , 108288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 246 (script 2): [1042, null, 299] +Interface 596 child 246 (script 4): [null, ] +Interface 596 child 246 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Light Grey, 25, 40, , 108544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 247 (script 2): [1042, null, 299] +Interface 596 child 247 (script 4): [null, ] +Interface 596 child 247 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Taupe, 25, 40, , 108800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 248 (script 2): [1042, null, 299] +Interface 596 child 248 (script 4): [null, ] +Interface 596 child 248 (script 5): [196608, 68222976, 0, null, 38, -2147483645, 39059727, Black, 25, 40, , 109056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 249 (script 1): [832, null, 44] +Interface 596 child 249 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 596 child 269 (script 3): [39059616, 1050, null, 299, 39059727, 39059616, 1058, 0, 393216, 2490496, 196610, null, Confirm Purchase, 25, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 600 child 12 (script 1): [832, null, 44, 39321612, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 600 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 600 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 600 child 20 (script 1): [39321620, 25, 0, null, 163, 39321620, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 605 child 0 (script 6): [511] +Interface 608 child 2 (script 3): [66, 0, 1, 0, -2147483645] +Interface 613 child 11 (script default): [null, 352321536] +Interface 613 child 11 (script 5): [509, -2147483645] +Interface 613 child 12 (script default): [null, 352321536] +Interface 613 child 12 (script 5): [509, -2147483645] +Interface 613 child 13 (script default): [null, 352321536] +Interface 613 child 13 (script 5): [509, -2147483645] +Interface 613 child 15 (script 1): [540, null, 44] +Interface 613 child 15 (script 3): [196608, 35323904, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 613 child 17 (script default): [null, 335544320] +Interface 613 child 17 (script 5): [136, -2147483645] +Interface 613 child 18 (script default): [null, 335544320] +Interface 613 child 18 (script 5): [136, -2147483645] +Interface 613 child 19 (script 1): [40173588, 0, 131072, 8913024, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 615 child 2 (script 6): [516] +Interface 617 child 6 (script 1): [1065, null, 44] +Interface 617 child 6 (script 3): [196608, 69730304, 1, 517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 617 child 8 (script 2): [-2147483645, 9200660, null, 45, -2147483645, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 617 child 13 (script 2): [-2147483645, 9200660, null, 45, -2147483645, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 617 child 19 (script 2): [-2147483645, 9200660, null, 45, -2147483645, 4600330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 7 (script 1): [832, null, 44] +Interface 619 child 7 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 28 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989938025, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 29 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989941097, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 30 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989943649, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 31 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989939041, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 32 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989939305, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 33 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989938287, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 34 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989938543, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 35 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989938536, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 36 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989938035, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 37 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989940833, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 38 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989938789, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 39 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989938284, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 40 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989941345, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 619 child 41 (script 1): [40566843, 0, 393216, 2490496, 196610, null, 989942639, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 620 child 7 (script 1): [832, null, 44] +Interface 620 child 7 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 624 child 7 (script 1): [832, null, 44] +Interface 624 child 7 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 624 child 21 (script 3): [0, 40894499, null, 69, 1, 40894499, 65536, 36372480, 16777216, null, null, 0, 256, 71696384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 624 child 22 (script 3): [0, 40894499, null, 69, 1, 40894499, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 624 child 23 (script 3): [0, 40894501, null, 69, 1, 40894501, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 624 child 24 (script 3): [0, 40894501, null, 69, 1, 40894501, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 624 child 25 (script 3): [0, 40894503, null, 69, 1, 40894503, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 624 child 26 (script 3): [0, 40894503, null, 69, 1, 40894503, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 625 child 39 (script default): [557] +Interface 625 child 39 (script 13): [280320] +Interface 625 child 70 (script 7): [556, 1] +Interface 625 child 73 (script 7): [556, 2] +Interface 625 child 76 (script 7): [556, 3] +Interface 625 child 79 (script 7): [556, 4] +Interface 625 child 82 (script 7): [556, 5] +Interface 625 child 85 (script 7): [556, 6] +Interface 625 child 87 (script 2): [null] +Interface 625 child 88 (script 1): [832, null, 44] +Interface 625 child 88 (script 3): [196608, 54460416, 1, 29, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 626 child 7 (script 1): [832, null, 44] +Interface 626 child 7 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 626 child 48 (script 4): [206] +Interface 626 child 48 (script 17): [34304] +Interface 626 child 49 (script 4): [206] +Interface 626 child 49 (script 17): [34304] +Interface 626 child 50 (script 3): [-2147483645, 41025584, 792, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 626 child 51 (script 3): [-2147483645, 41025585, 792, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 626 child 52 (script default): [197120, 24064, null, 197120, 23552, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 626 child 53 (script 1): [null, 45, -2147483645] +Interface 626 child 53 (script 5): [50331648, 755007488, 50331648, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 626 child 54 (script default): [197120, 24064, null, 197120, 23552, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 627 child 12 (script 1): [832, null, 44, 41091084, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 627 child 18 (script 1): [41091090, 26, 0, null, 163, 41091090, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 13 (script 1): [832, null, 44] +Interface 629 child 13 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 14 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 15 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 16 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 17 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 18 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 19 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 20 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 21 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 22 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 23 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 24 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 25 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 26 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 27 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 28 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 29 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 30 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 31 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 32 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 33 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 34 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 35 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 36 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 37 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 38 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 39 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 66 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 67 (script 2): [-2147483645, 16777215, null, 45, -2147483645, 39168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 68 (script 2): [-2147483645, 16777215, null, 45, -2147483645, 39168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 69 (script 2): [-2147483645, 16777215, null, 45, -2147483645, 39168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 70 (script 2): [-2147483645, 16777215, null, 45, -2147483645, 39168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 71 (script 2): [-2147483645, 16777215, null, 45, -2147483645, 39168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 629 child 72 (script default): [196608, null, 196608, 2949248, 196608, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 630 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 23 (script 1): [832, null, 44] +Interface 631 child 23 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 29 (script 3): [41353244, Neither player is allowed to use ranged attacks., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 30 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 31 (script 3): [41353244, Neither player is allowed to use melee attacks., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 32 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 33 (script 3): [41353244, Neither player is allowed to use Magic attacks., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 34 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 35 (script 3): [41353244, Both players will use a 'fun weapon', such as: rubber chicken., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 36 (script default): [469844591, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 37 (script 3): [41353244, Neither player is allowed to forfeit the duel., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 38 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 39 (script 3): [41353244, Neither player will be allowed to use drinks, such as: Strength potion., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 40 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 41 (script 3): [41353244, Neither player will be allowed to use food., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 42 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 43 (script 3): [41353244, Neither player will be allowed to use prayers., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 44 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 45 (script 3): [41353244, Players stand next to each other and aren't allowed to move or use holding spells., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 46 (script default): [469848172, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 47 (script 3): [41353244, The duel will be in an arena with obstacles., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 48 (script default): [469849192, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 50 (script 3): [41353244, Neither player will be allowed to use special attacks., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 51 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 52 (script 3): [41353244, Players can summon animals during the duel., null, 68, 41353244, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 53 (script default): [469848172, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 56 (script 3): [567] +Interface 631 child 56 (script 16): [73216] +Interface 631 child 57 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 58 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 59 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 60 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 61 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 62 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 63 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 64 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 65 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 66 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 67 (script default): [469847653, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 79 (script default): [null, 469847653] +Interface 631 child 79 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 80 (script default): [null, 469847653] +Interface 631 child 80 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 81 (script default): [null, 469847653] +Interface 631 child 81 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 82 (script default): [null, 469847653] +Interface 631 child 82 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 83 (script default): [null, 469847653] +Interface 631 child 83 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 84 (script default): [null, 469847653] +Interface 631 child 84 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 85 (script default): [null, 469847653] +Interface 631 child 85 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 86 (script default): [null, 469847653] +Interface 631 child 86 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 87 (script default): [null, 469847653] +Interface 631 child 87 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 88 (script default): [null, 469847653] +Interface 631 child 88 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 89 (script default): [null, 469847653] +Interface 631 child 89 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851319, 469827584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 90 (script 3): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 100 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 101 (script 3): [-2147483645, 43776, null, 45, -2147483645, 52224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 631 child 103 (script 2): [null, 0] +Interface 631 child 103 (script 3): [99] +Interface 631 child 103 (script 16): [34304] +Interface 631 child 108 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 632 child 66 (script 3): [-2147483645, 41418767, 792, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 633 child 17 (script 3): [-2147483645, 43776, null, 45, -2147483645, 32768, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 633 child 30 (script 1): [832, null, 44] +Interface 633 child 30 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 634 child 17 (script 3): [-2147483645, 43776, null, 45, -2147483645, 32768, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 634 child 31 (script 1): [832, null, 44] +Interface 634 child 31 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 14 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402739311, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 15 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402736751, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 16 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402739314, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 17 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402740080, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 18 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402740085, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 19 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402737253, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 20 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402741093, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 21 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402739809, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 22 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402738533, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 23 (script 1): [41615384, 0, 393216, 2490496, 196610, null, 402738529, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 635 child 24 (script 2): [null, 1] +Interface 635 child 24 (script 6): [null, 0] +Interface 635 child 24 (script 14): [73216] +Interface 635 child 31 (script 3): [564, -2147483645] +Interface 635 child 31 (script 16): [282880] +Interface 636 child 12 (script 1): [832, null, 44] +Interface 636 child 12 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 13 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 14 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 15 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 16 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 17 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 18 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 19 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 20 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 21 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 22 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 23 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 24 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 25 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 26 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 27 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 28 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 29 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 30 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 31 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 32 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 33 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 34 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 35 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 36 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 37 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 38 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 39 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 636 child 40 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 14 (script 1): [832, null, 44] +Interface 637 child 14 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 19 (script 3): [41746477, Neither player is allowed to use Ranged attacks., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 20 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 21 (script 3): [41746477, Neither player is allowed to use melee attacks., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 22 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 23 (script 3): [41746477, Neither player is allowed to use Magic attacks., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 24 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 25 (script 3): [41746477, Both players will use a 'fun weapon', such as: rubber chicken., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 26 (script default): [755057263, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 27 (script 3): [41746477, Neither player is allowed to forfeit the duel., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 28 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 29 (script 3): [41746477, Neither player will be allowed to use drinks, such as: strength potion., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 30 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 31 (script 3): [41746477, Neither player will be allowed to use food., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 32 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 33 (script 3): [41746477, Neither player will be allowed to use prayer., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 34 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 35 (script 3): [41746477, Players stand next to each other and aren't allowed to move or use holding spells., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 36 (script default): [755060844, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 37 (script 3): [41746477, The duel will be in an arena with obstacles., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 38 (script default): [755061864, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 39 (script 3): [41746477, Players can summon animals during the duel., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 40 (script default): [755060844, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 41 (script 3): [41746477, Neither player will be allowed to use special attacks., null, 68, 41746477, , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 42 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 44 (script 2): [null, 1, 566] +Interface 637 child 44 (script 15): [73216] +Interface 637 child 46 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 47 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 48 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 49 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 50 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 51 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 52 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 53 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 54 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 55 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 56 (script default): [755060325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 68 (script default): [null, 755060325] +Interface 637 child 68 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 69 (script default): [null, 755060325] +Interface 637 child 69 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 70 (script default): [null, 755060325] +Interface 637 child 70 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 71 (script default): [null, 755060325] +Interface 637 child 71 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 72 (script default): [null, 755060325] +Interface 637 child 72 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 73 (script default): [null, 755060325] +Interface 637 child 73 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 74 (script default): [null, 755060325] +Interface 637 child 74 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 75 (script default): [null, 755060325] +Interface 637 child 75 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 76 (script default): [null, 755060325] +Interface 637 child 76 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 77 (script default): [null, 755060325] +Interface 637 child 77 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 78 (script default): [null, 755060325] +Interface 637 child 78 (script 1): [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 50331648, 1140851325, 755040256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 79 (script 2): [null, 0] +Interface 637 child 81 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 82 (script 3): [-2147483645, 43776, null, 45, -2147483645, 52224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 84 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 637 child 85 (script 3): [-2147483645, 11206656, null, 45, -2147483645, 13369344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 639 child 10 (script 1): [832, null, 44] +Interface 639 child 10 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 639 child 34 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 639 child 35 (script 3): [-2147483645, null, 45, -2147483645, 43776, null, 45, -2147483645, 52224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 639 child 36 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 640 child 18 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 16750623, 65536, 36765696, 0, 0, , 18546688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 640 child 19 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 640 child 20 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 16750623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 640 child 23 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 16 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654397551, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 17 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654394991, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 18 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654397554, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 19 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654398320, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 20 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654398325, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 21 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654395493, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 22 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654399333, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 23 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654398049, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 24 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654396773, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 25 (script 1): [42008615, 0, 393216, 2490496, 196610, null, 654396769, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 641 child 37 (script 3): [564, -2147483645] +Interface 641 child 37 (script 16): [282880] +Interface 643 child 7 (script 1): [832, null, 44] +Interface 643 child 7 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 645 child 7 (script 1): [832, null, 44] +Interface 645 child 7 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 645 child 18 (script 3): [-2147483645, 42270736, 792, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 646 child 12 (script default): [1175, null, 44] +Interface 646 child 12 (script 2): [196608, 76939264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 647 child 7 (script 1): [832, null, 44] +Interface 647 child 7 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 647 child 21 (script 2): [null, 0] +Interface 647 child 24 (script 3): [677] +Interface 647 child 24 (script 16): [290560] +Interface 647 child 25 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 649 child 5 (script 1): [45, -2147483645, 16776960] +Interface 649 child 5 (script 2): [45, -2147483645, 16777215] +Interface 649 child 11 (script 1): [45, -2147483645, 16777215] +Interface 649 child 11 (script 2): [45, -2147483645, 16750623] +Interface 649 child 12 (script 1): [45, -2147483645, 16777215] +Interface 649 child 12 (script 2): [45, -2147483645, 16750623] +Interface 649 child 13 (script 1): [45, -2147483645, 16777215] +Interface 649 child 13 (script 2): [45, -2147483645, 16750623] +Interface 649 child 14 (script 1): [45, -2147483645, 16777215] +Interface 649 child 14 (script 2): [45, -2147483645, 16750623] +Interface 652 child 31 (script 2): [null, -2147483645] +Interface 652 child 31 (script 4): [null, 536871564] +Interface 652 child 31 (script 6): [42729507, 42729501, 42729502, 7, 681, -2147483645, 42729504, 42729506, 42729507, 42729501, 42729502, 0, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 652 child 35 (script 3): [42729507, 14784543, null, 45, 42729507, 12547357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 657 child 13 (script 1): [832, null, 44] +Interface 657 child 13 (script 3): [196608, 54460416, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 657 child 18 (script 1): [834, null, 44] +Interface 657 child 18 (script 3): [196608, 54591488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 657 child 19 (script 1): [834, null, 44] +Interface 657 child 19 (script 3): [196608, 54591488, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 657 child 27 (script 1): [43057179, 21, 0, null, 163, 43057179, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 659 child 1 (script 1): [542, null, 44] +Interface 659 child 1 (script 3): [196608, 35454976, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 660 child 97 (script 2): [null, 0] +Interface 660 child 107 (script 3): [null, 0] +Interface 660 child 108 (script 2): [null, 0] +Interface 660 child 109 (script default): [712] +Interface 660 child 110 (script 3): [null, 0] +Interface 660 child 111 (script default): [716] +Interface 660 child 112 (script 3): [null, 0] +Interface 660 child 113 (script 3): [null, 0] +Interface 660 child 114 (script 3): [null, 0] +Interface 660 child 115 (script 2): [null, 0] +Interface 660 child 116 (script default): [711] +Interface 660 child 117 (script 3): [null, 0] +Interface 660 child 118 (script default): [715] +Interface 660 child 119 (script 3): [null, 0] +Interface 660 child 120 (script 3): [null, 0] +Interface 660 child 123 (script 2): [null, 0] +Interface 660 child 124 (script 3): [null, 0] +Interface 660 child 125 (script 2): [null, 0] +Interface 660 child 126 (script 2): [null, 0] +Interface 660 child 127 (script 2): [null, 0] +Interface 660 child 128 (script 2): [null, 0] +Interface 660 child 129 (script 3): [null, 0] +Interface 660 child 130 (script 2): [null, 0] +Interface 660 child 131 (script 2): [null, 0] +Interface 660 child 132 (script 2): [null, 0] +Interface 660 child 137 (script 2): [null, 0] +Interface 660 child 138 (script default): [732] +Interface 663 child 3 (script 2): [null, 0, 0] +Interface 663 child 3 (script 5): [300544] +Interface 663 child 16 (script 1): [43450394, 0, 393216, 2490496, 196610, null, 436293733, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 663 child 17 (script default): [40, 43450394] +Interface 663 child 17 (script 3): [820] +Interface 663 child 17 (script 8): [38, -2147483645, 43450394, Pet Size Percentage, 25, 300] +Interface 663 child 17 (script 16): [300800] +Interface 663 child 18 (script 1): [43450394, 0, 393216, 2490496, 196610, null, 436293733, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 663 child 19 (script default): [40, 43450394] +Interface 663 child 19 (script 8): [38, -2147483645, 43450394, Pet Hunger Percentage, 25, 300] +Interface 663 child 20 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 663 child 21 (script 1): [0, 393216, 2490496, 196610, null, 436290401, null, null, null, null, null, null, null, null, null, 0, null, 300, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 663 child 22 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 663 child 23 (script default): [0, 393216, 2490496, 196610, null, 436290665, null, null, null, null, null, null, null, null, null, null, null, null, 0, null, 300, 0, 0, 0, 0, 0] +Interface 664 child 1 (script default): [745] +Interface 664 child 3 (script 1): [746] +Interface 664 child 5 (script 1): [747] +Interface 664 child 9 (script 2): [748, 43515913, 43515916] +Interface 664 child 27 (script 3): [749] +Interface 664 child 27 (script 6): [743] +Interface 664 child 27 (script 16): [11008, 11272192] +Interface 666 child 7 (script 1): [832, null, 44, 43646983, 831, 0, 16777216] +Interface 666 child 7 (script 3): [16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 666 child 16 (script 3): [-2147483645, 43646991, 792, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 666 child 17 (script default): [369098752, 6, 779, -2147483645, 43646998, 43646998, 1, Swap between creating animal pouches and scrolls, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 667 child 3 (script 1): [536, null, 44] +Interface 667 child 3 (script 3): [196608, 35061760, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 667 child 20 (script 4): [787] +Interface 667 child 20 (script 17): [24064] +Interface 668 child 3 (script 2): [43778058, 0, 393216, 2490496, 196610, null, 167854709, null, null, null, null, null, 0, null, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 668 child 4 (script 2): [43778058, 0, 393216, 2490496, 196610, null, 167855201, null, null, null, null, null, null, null, 0, null, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 668 child 5 (script 2): [43778058, 0, 393216, 2490496, 196610, null, 167855986, null, null, null, null, null, null, null, 0, null, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 668 child 6 (script 2): [43778058, 0, 393216, 2490496, 196610, null, 167859301, null, null, null, null, null, 0, null, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 668 child 7 (script 2): [43778058, 0, 393216, 2490496, 196610, null, 167859048, null, null, null, null, null, null, 0, null, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 668 child 8 (script 2): [43778058, 0, 393216, 2490496, 196610, null, 167857249, null, null, null, null, null, null, 0, null, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 669 child 7 (script 1): [832, null, 44, 43843591, 831, 0, 16777216] +Interface 669 child 7 (script 3): [16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 669 child 17 (script 3): [-2147483645, 43843599, 792, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 669 child 18 (script default): [385875968, 6, 779, -2147483645, 43843607, 43843607, 1, Swap between creating pouches and scrolls, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 671 child 13 (script 1): [832, null, 44] +Interface 671 child 13 (script 3): [196608, 54460416, 1, 29, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 671 child 29 (script 1): [0, 393216, 2490496, 196610, null, 503403617, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null] +Interface 671 child 29 (script 2): [0, null, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 672 child 7 (script 1): [832, null, 44, 44040199, 831, 0, 16777216] +Interface 672 child 7 (script 3): [16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 672 child 17 (script 3): [-2147483645, 44040207, 792, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 672 child 18 (script default): [385875968, 6, 779, -2147483645, 44040215, 44040215, 1, Swap between creating animal pouches and scrolls, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 673 child 7 (script 1): [832, null, 44, 44105735, 831, 0, 16777216] +Interface 673 child 7 (script 3): [16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 673 child 16 (script 3): [-2147483645, 44105743, 792, 789, 790, 791, 773, 788, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 673 child 17 (script default): [369098752, 6, 779, -2147483645, 44105750, 44105750, 1, Swap between creating pouches and scrolls, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 676 child 12 (script 1): [832, null, 44, 44302348, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 676 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 676 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 676 child 20 (script 1): [44302356, 27, 0, null, 163, 44302356, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 677 child 12 (script 1): [832, null, 44, 44367884, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 677 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 677 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 677 child 20 (script 1): [44367892, 28, 0, null, 163, 44367892, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 678 child 12 (script 1): [832, null, 44, 44433420, 831, 0, 16777216, 486539264, 0, 0, 0, 0] +Interface 678 child 17 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 678 child 18 (script 3): [-2147483645, 65280, null, 167, -2147483645, 16711680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 678 child 20 (script 1): [44433428, 29, 0, null, 163, 44433428, 0, 16777220, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 681 child 115 (script 7): [29] +Interface 681 child 120 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 681 child 121 (script default): [40, 44630145] +Interface 681 child 121 (script 7): [840] +Interface 681 child 121 (script 8): [38, -2147483645, 44630145, View right side of the catapult., 50, 180] +Interface 681 child 124 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 681 child 125 (script default): [40, 44630145] +Interface 681 child 125 (script 7): [840] +Interface 681 child 125 (script 8): [38, -2147483645, 44630145, View left side of the catapult., 50, 180] +Interface 681 child 126 (script 1): [832, null, 44] +Interface 681 child 126 (script 3): [196608, 54460416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 682 child 3 (script 3): [-2147483645, 14936, null, 67, -2147483645, 14938, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 682 child 4 (script default): [40, 44695590] +Interface 682 child 4 (script 8): [38, -2147483645, 44695590, Fire the catapult., 25, 180] +Interface 682 child 9 (script default): [196608, 2107638528, 17152, null, 196608, 2109997056, 1, 858, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 682 child 10 (script default): [40, 44695590] +Interface 682 child 10 (script 8): [38, -2147483645, 44695590, Aim the catapult left., 25, 180] +Interface 682 child 11 (script 1): [-2147483645, 32160, null, 67, -2147483645, 32196, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 682 child 12 (script default): [40, 44695590] +Interface 682 child 12 (script 8): [38, -2147483645, 44695590, Aim the catapult right., 25, 180] +Interface 682 child 13 (script default): [40, 44695590] +Interface 682 child 13 (script 8): [38, -2147483645, 44695590, Increase counterweight., 25, 180] +Interface 682 child 14 (script default): [40, 44695590] +Interface 682 child 14 (script 8): [38, -2147483645, 44695590, Decrease counterweight., 25, 180] +Interface 682 child 24 (script 1): [null, null, 44, -2147483645] +Interface 682 child 24 (script 5): [null, 0, 0, 0] +Interface 682 child 25 (script 1): [null, null, 44, -2147483645] +Interface 682 child 25 (script 5): [null, 0, 0, 0] +Interface 683 child 34 (script 1): [null, null, 44, -2147483645] +Interface 683 child 34 (script 5): [null, 0, 16777216, null] +Interface 683 child 34 (script 6): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 683 child 35 (script default): [1231, null, 44] +Interface 683 child 35 (script 2): [196608, 80609280, 1, 848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 683 child 36 (script 1): [1225, null, 44, 44761124, 1224, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 683 child 37 (script 1): [null, null, 44, -2147483645] +Interface 683 child 37 (script 5): [null, 0, 0, 0] +Interface 683 child 38 (script 2): [-2147483645, 32160, null, 67, -2147483645, 32196, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 683 child 39 (script 1): [-2147483645, 32160, null, 67, -2147483645, 32196, 0, 16777216, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 683 child 40 (script default): [196608, 2107638528, 17152, null, 196608, 2109997056, 1, 844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 683 child 41 (script default): [196608, 2107638528, 17152, null, 196608, 2109997056, 1, 843, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 683 child 44 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 683 child 45 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 683 child 50 (script default): [40, 44761137] +Interface 683 child 50 (script 8): [38, -2147483645, 44761137, Move piece right., 50, 180] +Interface 683 child 52 (script default): [40, 44761137] +Interface 683 child 52 (script 8): [38, -2147483645, 44761137, Move piece up., 50, 180] +Interface 683 child 53 (script default): [40, 44761137] +Interface 683 child 53 (script 8): [38, -2147483645, 44761137, Move piece down., 50, 180] +Interface 683 child 54 (script default): [40, 44761137] +Interface 683 child 54 (script 8): [38, -2147483645, 44761137, Move piece left., 50, 180] +Interface 683 child 55 (script default): [40, 44761137] +Interface 683 child 55 (script 8): [38, -2147483645, 44761137, Rotate piece counter-clockwise., 25, 180] +Interface 683 child 56 (script default): [40, 44761137] +Interface 683 child 56 (script 8): [38, -2147483645, 44761137, Rotate piece clockwise., 25, 180] +Interface 683 child 57 (script default): [40, 44761137] +Interface 683 child 57 (script 8): [38, -2147483645, 44761137, View the other side of the catapult., 25, 180] +Interface 685 child 7 (script 1): [832, null, 44] +Interface 685 child 7 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 688 child 9 (script 2): [null, 1, 862] +Interface 688 child 9 (script 15): [305920] +Interface 689 child 8 (script 2): [null, 1, 862] +Interface 689 child 8 (script 15): [305920] +Interface 694 child 3 (script 1): [32408, null, 67] +Interface 694 child 3 (script 3): [196863, null, null, null, 0, 512, 224000, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 694 child 4 (script 1): [32408, null, 67] +Interface 694 child 4 (script 3): [196863, null, null, null, 0, 512, 224256, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 694 child 7 (script 1): [537, null, 44] +Interface 694 child 7 (script 3): [196608, 35258368, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 694 child 38 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 696 child 3 (script 1): [32408, null, 67] +Interface 696 child 3 (script 3): [196863, null, null, null, 0, 512, 224512, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 696 child 4 (script 1): [32408, null, 67] +Interface 696 child 4 (script 3): [196863, null, null, null, 0, 512, 224768, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 696 child 7 (script 1): [537, null, 44] +Interface 696 child 7 (script 3): [196608, 35258368, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 696 child 38 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 697 child 3 (script 1): [32408, null, 67] +Interface 697 child 3 (script 3): [196863, null, null, null, 0, 512, 223232, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 697 child 4 (script 1): [32408, null, 67] +Interface 697 child 4 (script 3): [196863, null, null, null, 0, 512, 223488, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 697 child 5 (script 1): [32408, null, 67] +Interface 697 child 5 (script 3): [196863, null, null, null, 0, 512, 223744, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 697 child 8 (script 1): [537, null, 44] +Interface 697 child 8 (script 3): [196608, 35258368, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 697 child 47 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 699 child 3 (script 1): [32408, null, 67] +Interface 699 child 3 (script 3): [196863, null, null, null, 0, 512, 225536, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 699 child 4 (script 1): [32408, null, 67] +Interface 699 child 4 (script 3): [196863, null, null, null, 0, 512, 225792, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 699 child 7 (script 1): [537, null, 44] +Interface 699 child 7 (script 3): [196608, 35258368, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 699 child 38 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 704 child 5 (script 1): [537, null, 44] +Interface 704 child 5 (script 3): [196608, 35258368, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 704 child 10 (script 1): [32408, null, 67] +Interface 704 child 10 (script 3): [196863, null, null, null, 0, 512, 226560, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 704 child 11 (script 1): [32408, null, 67] +Interface 704 child 11 (script 3): [196863, null, null, null, 0, 512, 226816, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 704 child 12 (script 1): [32408, null, 67] +Interface 704 child 12 (script 3): [196863, null, null, null, 0, 512, 227072, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 704 child 47 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 705 child 5 (script 1): [537, null, 44] +Interface 705 child 5 (script 3): [196608, 35258368, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 705 child 10 (script 1): [32408, null, 67] +Interface 705 child 10 (script 3): [196863, null, null, null, 0, 512, 227328, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 705 child 11 (script 1): [32408, null, 67] +Interface 705 child 11 (script 3): [196863, null, null, null, 0, 512, 227584, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 705 child 12 (script 1): [32408, null, 67] +Interface 705 child 12 (script 3): [196863, null, null, null, 0, 512, 227840, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 705 child 47 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 707 child 3 (script 1): [32408, null, 67] +Interface 707 child 3 (script 3): [196863, null, null, null, 0, 512, 225024, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 707 child 4 (script 1): [32408, null, 67] +Interface 707 child 4 (script 3): [196863, null, null, null, 0, 512, 225280, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 707 child 7 (script 1): [537, null, 44] +Interface 707 child 7 (script 3): [196608, 35258368, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 707 child 39 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 708 child 3 (script 1): [32408, null, 67] +Interface 708 child 3 (script 3): [196863, null, null, null, 0, 512, 226048, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 708 child 4 (script 1): [32408, null, 67] +Interface 708 child 4 (script 3): [196863, null, null, null, 0, 512, 226304, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 708 child 7 (script 1): [537, null, 44] +Interface 708 child 7 (script 3): [196608, 35258368, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 708 child 38 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 709 child 16 (script 1): [832, null, 44] +Interface 709 child 16 (script 3): [196608, 54460416, 0, 16777216, 486539264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 710 child 5 (script 1): [537, null, 44] +Interface 710 child 5 (script 3): [196608, 35258368, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 710 child 9 (script 1): [32408, null, 67] +Interface 710 child 9 (script 3): [196863, null, null, null, 0, 512, 228096, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 710 child 10 (script 1): [32408, null, 67] +Interface 710 child 10 (script 3): [196863, null, null, null, 0, 512, 228352, null, 196608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 710 child 38 (script 3): [-2147483645, null, 97, -2147483645, null, 93, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 712 child 4 (script 1): [538, null, 44] +Interface 712 child 4 (script 3): [196608, 35192832, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 716 child 17 (script 3): [-2147483645, null, 94, -2147483645, null, 92, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 716 child 32 (script default): [908] +Interface 716 child 32 (script 1): [909] +Interface 716 child 32 (script 2): [907] +Interface 716 child 32 (script 3): [906] +Interface 716 child 32 (script 7): [910] +Interface 716 child 35 (script default): [40, 46923813] +Interface 716 child 35 (script 8): [38, -2147483645, 46923813, Target the chocatrice on a creature., 25, 180] +Interface 716 child 36 (script default): [40, 46923813] +Interface 716 child 36 (script 8): [38, -2147483645, 46923813, Calls the chocatrice to you if you get separated., 25, 180] +Interface 717 child 1 (script 2): [null, 0, 0] +Interface 717 child 3 (script 3): [893] +Interface 717 child 4 (script 3): [893] +Interface 717 child 7 (script 3): [895] +Interface 717 child 7 (script 16): [308480] +Interface 717 child 8 (script 3): [894] +Interface 717 child 8 (script 16): [308480] +Interface 717 child 13 (script default): [null, , 230400] +Interface 717 child 13 (script 8): [903] +Interface 717 child 13 (script 10): [904] +Interface 717 child 14 (script default): [null, , 229888] +Interface 717 child 14 (script 8): [901] +Interface 717 child 14 (script 10): [902] +Interface 717 child 16 (script default): [40, 46989342] +Interface 717 child 16 (script 8): [38, -2147483645, 46989342, Add water to cool the incubator., 50, 180] +Interface 717 child 18 (script default): [40, 46989342] +Interface 717 child 18 (script 8): [38, -2147483645, 46989342, Add coal to heat the incubator., 50, 180] +Interface 717 child 26 (script 1): [832, null, 44] +Interface 717 child 26 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 717 child 27 (script default): [40, 46989342] +Interface 717 child 27 (script 8): [38, -2147483645, 46989342, Add water to cool the incubator., 25, 180] +Interface 717 child 28 (script default): [40, 46989342] +Interface 717 child 28 (script 8): [38, -2147483645, 46989342, Add coal to heat the incubator., 25, 180] +Interface 718 child 1 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 718 child 2 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 719 child 2 (script 1): [542, null, 44] +Interface 719 child 2 (script 3): [196608, 35454976, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 719 child 5 (script 3): [47120388, 47120389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 720 child 1 (script 1): [832, null, 44] +Interface 720 child 1 (script 3): [196608, 54460416, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 723 child 6 (script 2): [null, -2147483645, 47382535] +Interface 723 child 6 (script 4): [null, 167772883] +Interface 723 child 6 (script 6): [47382537, 0, 0, 0, 0, 0, 0, 0] +Interface 724 child 17 (script 7): [29] +Interface 724 child 22 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 8388608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 724 child 27 (script 2): [null, 1, 930] +Interface 724 child 27 (script 15): [308992] +Interface 725 child 17 (script 7): [29] +Interface 725 child 19 (script 3): [926] +Interface 725 child 19 (script 16): [308992] +Interface 725 child 23 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 8388608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 726 child 17 (script 7): [29] +Interface 726 child 116 (script 2): [null, 1, 948] +Interface 726 child 116 (script 15): [308992] +Interface 726 child 118 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 8388608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 727 child 17 (script 7): [29] +Interface 727 child 24 (script 3): [-2147483645, 16711680, null, 45, -2147483645, 8388608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 728 child 1 (script default): [null, -2147483645, 47710235] +Interface 728 child 1 (script 2): [null, 335545048] +Interface 728 child 1 (script 4): [47710230, 47710231, 0, 524288, 60162176, 196610, null, 452984832, 728, 335545048, 352322264, 369099480, 385875968, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 728 child 4 (script 3): [776, -2147483645] +Interface 728 child 4 (script 16): [308992] +Interface 728 child 5 (script 3): [776, -2147483645] +Interface 728 child 5 (script 16): [308992] +Interface 728 child 6 (script 3): [776, -2147483645] +Interface 728 child 6 (script 16): [308992] +Interface 728 child 7 (script 3): [776, -2147483645] +Interface 728 child 7 (script 16): [308992] +Interface 728 child 8 (script 3): [776, -2147483645] +Interface 728 child 8 (script 16): [308992] +Interface 728 child 9 (script 3): [776, -2147483645] +Interface 728 child 9 (script 16): [308992] +Interface 728 child 10 (script 3): [776, -2147483645] +Interface 728 child 10 (script 16): [308992] +Interface 728 child 11 (script 3): [776, -2147483645] +Interface 728 child 11 (script 16): [308992] +Interface 728 child 12 (script 3): [776, -2147483645] +Interface 728 child 12 (script 16): [308992] +Interface 728 child 13 (script 3): [776, -2147483645] +Interface 728 child 13 (script 16): [308992] +Interface 728 child 14 (script 3): [912, -2147483645] +Interface 728 child 14 (script 16): [308992] +Interface 728 child 17 (script 2): [47710233, 131072, 60489856, 196608, 33554432, null, null, -2147483645, null, 917, -2147483645, 47710233, 0, 65536, null, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 728 child 18 (script 1): [null, null, 299] +Interface 728 child 18 (script 3): [null, 419463168] +Interface 728 child 18 (script 5): [783, 0, 33554432] +Interface 728 child 18 (script 6): [null, -2147483645, null] +Interface 728 child 18 (script 10): [null, -2147483645, 47710233] +Interface 728 child 19 (script 3): [-2147483645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 728 child 20 (script 2): [786, null, 299] +Interface 728 child 20 (script 4): [null, 419463168] +Interface 728 child 20 (script 6): [785, 0, 16777216] +Interface 728 child 20 (script 7): [null, null, 917] +Interface 728 child 20 (script 9): [196610, null, 419430400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 728 child 21 (script 1): [1173, null, 299] +Interface 728 child 21 (script 3): [null, 419463168] +Interface 728 child 21 (script 5): [1172, 0, 16777216] +Interface 728 child 21 (script 6): [null, null, 917] +Interface 728 child 21 (script 8): [196610, null, 419430400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 728 child 22 (script 1): [1175, null, 299] +Interface 728 child 22 (script 3): [null, 419463168] +Interface 728 child 22 (script 5): [1174, 0, 16777216] +Interface 728 child 22 (script 6): [null, null, 917] +Interface 728 child 22 (script 8): [196610, null, 419430400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 728 child 23 (script 1): [801, null, 299] +Interface 728 child 23 (script 3): [null, 419463168] +Interface 728 child 23 (script 5): [787, 0, 16777216] +Interface 728 child 23 (script 6): [null, null, 917] +Interface 728 child 23 (script 8): [196610, null, 419430400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 730 child 19 (script 1): [955] +Interface 730 child 19 (script 14): [23808] +Interface 730 child 25 (script 3): [954] +Interface 730 child 25 (script 16): [311040] +Interface 734 child 0 (script 3): [964] +Interface 734 child 0 (script 6): [965, 48103425, 48103426, 48103427, 48103428, 48103429, 48103430, 48103431, 48103432, 48103433, 48103434, 48103435, 48103436, 48103437, 48103438, 48103439, 48103445, 48103446] +Interface 734 child 0 (script 16): [208896] +Interface 734 child 19 (script 1): [540, null, 44] +Interface 734 child 19 (script 3): [196608, 35323904, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 734 child 21 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 4202496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 734 child 22 (script 3): [-2147483645, 16777215, null, 45, -2147483645, 4202496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +Interface 734 child 23 (script 7): [962, 48103425] +Interface 734 child 24 (script 7): [963, 48103425] +Interface 734 child 25 (script 7): [962, 48103430] +Interface 734 child 26 (script 7): [963, 48103430] +Interface 734 child 27 (script 7): [962, 48103435] +Interface 735 child 12 (script default): [null, 961, -2147483645] +Interface 735 child 12 (script 7): [958, 48168973, 48169039, 48168972] +Interface 735 child 13 (script 2): [null, -2147483645, 48169039] +Interface 735 child 13 (script 4): [null, 201326592] +Interface 735 child 13 (script 6): [957, -2147483645, 48169039, 48168972] +Interface 735 child 13 (script 19): [208896] diff --git a/dumps/498/498_item_dump.txt b/dumps/498/498_item_dump.txt new file mode 100644 index 000000000..efff5efba --- /dev/null +++ b/dumps/498/498_item_dump.txt @@ -0,0 +1,13248 @@ + +item=Dwarf remains, id=0, option=[null, null, null, null, Destroy] +item=Toolkit, id=1, option=[null, null, null, null, Destroy] +item=Cannonball, id=2, option=[null, null, null, null, drop] +item=Nulodion's notes, id=3, option=[Read, null, null, null, Destroy] +item=Ammo mould, id=4, option=[null, null, null, null, drop] +item=Instruction manual, id=5, option=[Read, null, null, null, drop] +item=Cannon base, id=6, option=[Set-up, null, null, null, drop] +item=Cannon base, id=7, option=[null, null, null, null, drop] +item=Cannon stand, id=8, option=[null, null, null, null, drop] +item=Cannon stand, id=9, option=[null, null, null, null, drop] +item=Cannon barrels, id=10, option=[null, null, null, null, drop] +item=Cannon barrels, id=11, option=[null, null, null, null, drop] +item=Cannon furnace, id=12, option=[null, null, null, null, drop] +item=Cannon furnace, id=13, option=[null, null, null, null, drop] +item=Railing, id=14, option=[null, null, null, null, drop] +item=Holy table napkin, id=15, option=[null, null, null, null, drop] +item=Magic whistle, id=16, option=[Blow, null, null, null, drop] +item=Grail bell, id=17, option=[Ring, null, null, null, drop] +item=Magic gold feather, id=18, option=[Blow-on, null, null, null, drop] +item=Holy grail, id=19, option=[null, null, null, null, Destroy] +item=White cog, id=20, option=[null, null, null, null, drop] +item=Black cog, id=21, option=[null, null, null, null, drop] +item=Blue cog, id=22, option=[null, null, null, null, drop] +item=Red cog, id=23, option=[null, null, null, null, drop] +item=Rat poison, id=24, option=[null, null, null, null, drop] +item=Red vine worm, id=25, option=[null, null, null, null, drop] +item=Fishing trophy, id=26, option=[null, null, null, null, drop] +item=Fishing pass, id=27, option=[null, null, null, null, drop] +item=Insect repellent, id=28, option=[null, null, null, null, drop] +item=Whoopsie, id=29, option=[null, null, null, null, drop] +item=Bucket of wax, id=30, option=[null, null, null, null, drop] +item=Whoopsie, id=31, option=[null, null, null, null, drop] +item=Lit black candle, id=32, option=[Extinguish, null, null, null, drop] +item=Lit candle, id=33, option=[Extinguish, null, null, null, drop] +item=Lit candle, id=34, option=[Extinguish, null, null, null, drop] +item=Excalibur, id=35, option=[null, Wield, null, null, drop] +item=Candle, id=36, option=[null, null, null, null, drop] +item=Candle, id=37, option=[null, null, null, null, drop] +item=Black candle, id=38, option=[null, null, null, null, drop] +item=Bronze arrowtips, id=39, option=[null, null, null, null, drop] +item=Iron arrowtips, id=40, option=[null, null, null, null, drop] +item=Steel arrowtips, id=41, option=[null, null, null, null, drop] +item=Mithril arrowtips, id=42, option=[null, null, null, null, drop] +item=Adamant arrowtips, id=43, option=[null, null, null, null, drop] +item=Rune arrowtips, id=44, option=[null, null, null, null, drop] +item=Opal bolt tips, id=45, option=[null, null, null, null, drop] +item=Pearl bolt tips, id=46, option=[null, null, null, null, drop] +item=Barb bolttips, id=47, option=[null, null, null, null, drop] +item=Longbow (u), id=48, option=[null, null, null, null, drop] +item=Longbow (u), id=49, option=[null, null, null, null, drop] +item=Shortbow (u), id=50, option=[null, null, null, null, drop] +item=Shortbow (u), id=51, option=[null, null, null, null, drop] +item=Arrow shaft, id=52, option=[null, null, null, null, drop] +item=Headless arrow, id=53, option=[null, null, null, null, drop] +item=Oak shortbow (u), id=54, option=[null, null, null, null, drop] +item=Oak shortbow (u), id=55, option=[null, null, null, null, drop] +item=Oak longbow (u), id=56, option=[null, null, null, null, drop] +item=Oak longbow (u), id=57, option=[null, null, null, null, drop] +item=Willow longbow (u), id=58, option=[null, null, null, null, drop] +item=Willow longbow (u), id=59, option=[null, null, null, null, drop] +item=Willow shortbow (u), id=60, option=[null, null, null, null, drop] +item=Willow shortbow (u), id=61, option=[null, null, null, null, drop] +item=Maple longbow (u), id=62, option=[null, null, null, null, drop] +item=Maple longbow (u), id=63, option=[null, null, null, null, drop] +item=Maple shortbow (u), id=64, option=[null, null, null, null, drop] +item=Maple shortbow (u), id=65, option=[null, null, null, null, drop] +item=Yew longbow (u), id=66, option=[null, null, null, null, drop] +item=Yew longbow (u), id=67, option=[null, null, null, null, drop] +item=Yew shortbow (u), id=68, option=[null, null, null, null, drop] +item=Yew shortbow (u), id=69, option=[null, null, null, null, drop] +item=Magic longbow (u), id=70, option=[null, null, null, null, drop] +item=Magic longbow (u), id=71, option=[null, null, null, null, drop] +item=Magic shortbow (u), id=72, option=[null, null, null, null, drop] +item=Magic shortbow (u), id=73, option=[null, null, null, null, drop] +item=Khazard helmet, id=74, option=[null, Wear, null, null, drop] +item=Khazard armour, id=75, option=[null, Wear, null, null, drop] +item=Khazard cell keys, id=76, option=[null, null, null, null, drop] +item=Khali brew, id=77, option=[null, null, null, null, drop] +item=Ice arrows, id=78, option=[null, Wield, null, null, drop] +item=null, id=79, option=[null, null, null, null, drop] +item=null, id=80, option=[null, null, null, null, drop] +item=null, id=81, option=[null, null, null, null, drop] +item=null, id=82, option=[null, null, null, null, drop] +item=Lever, id=83, option=[null, null, null, null, drop] +item=Staff of armadyl, id=84, option=[null, null, null, null, drop] +item=Shiny key, id=85, option=[null, null, null, null, drop] +item=Pendant of lucien, id=86, option=[null, Wear, null, null, drop] +item=Armadyl pendant, id=87, option=[null, Wear, null, null, drop] +item=Boots of lightness, id=88, option=[null, Wear, null, null, drop] +item=Boots of lightness, id=89, option=[null, Wear, null, null, drop] +item=Child's blanket, id=90, option=[null, null, null, null, drop] +item=Guam potion(unf), id=91, option=[null, null, null, Empty, drop] +item=Guam potion(unf), id=92, option=[null, null, null, null, drop] +item=Marrentill potion(unf), id=93, option=[null, null, null, Empty, drop] +item=Marrentill potion(unf), id=94, option=[null, null, null, null, drop] +item=Tarromin potion(unf), id=95, option=[null, null, null, Empty, drop] +item=Tarromin potion(unf), id=96, option=[null, null, null, null, drop] +item=Harralander potion(unf), id=97, option=[null, null, null, Empty, drop] +item=Harralander potion(unf), id=98, option=[null, null, null, null, drop] +item=Ranarr potion(unf), id=99, option=[null, null, null, Empty, drop] +item=Ranarr potion(unf), id=100, option=[null, null, null, null, drop] +item=Irit potion(unf), id=101, option=[null, null, null, Empty, drop] +item=Irit potion(unf), id=102, option=[null, null, null, null, drop] +item=Avantoe potion(unf), id=103, option=[null, null, null, Empty, drop] +item=Avantoe potion(unf), id=104, option=[null, null, null, null, drop] +item=Kwuarm potion(unf), id=105, option=[null, null, null, Empty, drop] +item=Kwuarm potion(unf), id=106, option=[null, null, null, null, drop] +item=Cadantine potion(unf), id=107, option=[null, null, null, Empty, drop] +item=Cadantine potion(unf), id=108, option=[null, null, null, null, drop] +item=Dwarf weed potion(unf), id=109, option=[null, null, null, Empty, drop] +item=Dwarf weed potion(unf), id=110, option=[null, null, null, null, drop] +item=Torstol potion(unf), id=111, option=[null, null, null, Empty, drop] +item=Torstol potion(unf), id=112, option=[null, null, null, null, drop] +item=Strength potion(4), id=113, option=[Drink, null, null, Empty, drop] +item=Strength potion(4), id=114, option=[null, null, null, null, drop] +item=Strength potion(3), id=115, option=[Drink, null, null, Empty, drop] +item=Strength potion(3), id=116, option=[null, null, null, null, drop] +item=Strength potion(2), id=117, option=[Drink, null, null, Empty, drop] +item=Strength potion(2), id=118, option=[null, null, null, null, drop] +item=Strength potion(1), id=119, option=[Drink, null, null, Empty, drop] +item=Strength potion(1), id=120, option=[null, null, null, null, drop] +item=Attack potion(3), id=121, option=[Drink, null, null, Empty, drop] +item=Attack potion(3), id=122, option=[null, null, null, null, drop] +item=Attack potion(2), id=123, option=[Drink, null, null, Empty, drop] +item=Attack potion(2), id=124, option=[null, null, null, null, drop] +item=Attack potion(1), id=125, option=[Drink, null, null, Empty, drop] +item=Attack potion(1), id=126, option=[null, null, null, null, drop] +item=Restore potion(3), id=127, option=[Drink, null, null, Empty, drop] +item=Restore potion(3), id=128, option=[null, null, null, null, drop] +item=Restore potion(2), id=129, option=[Drink, null, null, Empty, drop] +item=Restore potion(2), id=130, option=[null, null, null, null, drop] +item=Restore potion(1), id=131, option=[Drink, null, null, Empty, drop] +item=Restore potion(1), id=132, option=[null, null, null, null, drop] +item=Defence potion(3), id=133, option=[Drink, null, null, Empty, drop] +item=Defence potion(3), id=134, option=[null, null, null, null, drop] +item=Defence potion(2), id=135, option=[Drink, null, null, Empty, drop] +item=Defence potion(2), id=136, option=[null, null, null, null, drop] +item=Defence potion(1), id=137, option=[Drink, null, null, Empty, drop] +item=Defence potion(1), id=138, option=[null, null, null, null, drop] +item=Prayer potion(3), id=139, option=[Drink, null, null, Empty, drop] +item=Prayer potion(3), id=140, option=[null, null, null, null, drop] +item=Prayer potion(2), id=141, option=[Drink, null, null, Empty, drop] +item=Prayer potion(2), id=142, option=[null, null, null, null, drop] +item=Prayer potion(1), id=143, option=[Drink, null, null, Empty, drop] +item=Prayer potion(1), id=144, option=[null, null, null, null, drop] +item=Super attack(3), id=145, option=[Drink, null, null, Empty, drop] +item=Super attack(3), id=146, option=[null, null, null, null, drop] +item=Super attack(2), id=147, option=[Drink, null, null, Empty, drop] +item=Super attack(2), id=148, option=[null, null, null, null, drop] +item=Super attack(1), id=149, option=[Drink, null, null, Empty, drop] +item=Super attack(1), id=150, option=[null, null, null, null, drop] +item=Fishing potion(3), id=151, option=[Drink, null, null, Empty, drop] +item=Fishing potion(3), id=152, option=[null, null, null, null, drop] +item=Fishing potion(2), id=153, option=[Drink, null, null, Empty, drop] +item=Fishing potion(2), id=154, option=[null, null, null, null, drop] +item=Fishing potion(1), id=155, option=[Drink, null, null, Empty, drop] +item=Fishing potion(1), id=156, option=[null, null, null, null, drop] +item=Super strength(3), id=157, option=[Drink, null, null, Empty, drop] +item=Super strength(3), id=158, option=[null, null, null, null, drop] +item=Super strength(2), id=159, option=[Drink, null, null, Empty, drop] +item=Super strength(2), id=160, option=[null, null, null, null, drop] +item=Super strength(1), id=161, option=[Drink, null, null, Empty, drop] +item=Super strength(1), id=162, option=[null, null, null, null, drop] +item=Super defence(3), id=163, option=[Drink, null, null, Empty, drop] +item=Super defence(3), id=164, option=[null, null, null, null, drop] +item=Super defence(2), id=165, option=[Drink, null, null, Empty, drop] +item=Super defence(2), id=166, option=[null, null, null, null, drop] +item=Super defence(1), id=167, option=[Drink, null, null, Empty, drop] +item=Super defence(1), id=168, option=[null, null, null, null, drop] +item=Ranging potion(3), id=169, option=[Drink, null, null, Empty, drop] +item=Ranging potion(3), id=170, option=[null, null, null, null, drop] +item=Ranging potion(2), id=171, option=[Drink, null, null, Empty, drop] +item=Ranging potion(2), id=172, option=[null, null, null, null, drop] +item=Ranging potion(1), id=173, option=[Drink, null, null, Empty, drop] +item=Ranging potion(1), id=174, option=[null, null, null, null, drop] +item=Antipoison(3), id=175, option=[Drink, null, null, Empty, drop] +item=Antipoison(3), id=176, option=[null, null, null, null, drop] +item=Antipoison(2), id=177, option=[Drink, null, null, Empty, drop] +item=Antipoison(2), id=178, option=[null, null, null, null, drop] +item=Antipoison(1), id=179, option=[Drink, null, null, Empty, drop] +item=Antipoison(1), id=180, option=[null, null, null, null, drop] +item=Super antipoison(3), id=181, option=[Drink, null, null, Empty, drop] +item=Super antipoison(3), id=182, option=[null, null, null, null, drop] +item=Super antipoison(2), id=183, option=[Drink, null, null, Empty, drop] +item=Super antipoison(2), id=184, option=[null, null, null, null, drop] +item=Super antipoison(1), id=185, option=[Drink, null, null, Empty, drop] +item=Super antipoison(1), id=186, option=[null, null, null, null, drop] +item=Weapon poison, id=187, option=[null, null, null, Empty, drop] +item=Weapon poison, id=188, option=[null, null, null, null, drop] +item=Zamorak brew(3), id=189, option=[Drink, null, null, Empty, drop] +item=Zamorak brew(3), id=190, option=[null, null, null, null, drop] +item=Zamorak brew(2), id=191, option=[Drink, null, null, Empty, drop] +item=Zamorak brew(2), id=192, option=[null, null, null, null, drop] +item=Zamorak brew(1), id=193, option=[Drink, null, null, Empty, drop] +item=Zamorak brew(1), id=194, option=[null, null, null, null, drop] +item=Potion, id=195, option=[null, null, null, null, drop] +item=Potion, id=196, option=[null, null, null, null, drop] +item=Poison chalice, id=197, option=[Drink, null, null, null, drop] +item=Poison chalice, id=198, option=[null, null, null, null, drop] +item=Grimy guam, id=199, option=[Clean, null, null, null, drop] +item=Grimy guam, id=200, option=[null, null, null, null, drop] +item=Grimy marrentill, id=201, option=[Clean, null, null, null, drop] +item=Grimy marrentill, id=202, option=[null, null, null, null, drop] +item=Grimy tarromin, id=203, option=[Clean, null, null, null, drop] +item=Grimy tarromin, id=204, option=[null, null, null, null, drop] +item=Grimy harralander, id=205, option=[Clean, null, null, null, drop] +item=Grimy harralander, id=206, option=[null, null, null, null, drop] +item=Grimy ranarr, id=207, option=[Clean, null, null, null, drop] +item=Grimy ranarr, id=208, option=[null, null, null, null, drop] +item=Grimy irit, id=209, option=[Clean, null, null, null, drop] +item=Grimy irit, id=210, option=[null, null, null, null, drop] +item=Grimy avantoe, id=211, option=[Clean, null, null, null, drop] +item=Grimy avantoe, id=212, option=[null, null, null, null, drop] +item=Grimy kwuarm, id=213, option=[Clean, null, null, null, drop] +item=Grimy kwuarm, id=214, option=[null, null, null, null, drop] +item=Grimy cadantine, id=215, option=[Clean, null, null, null, drop] +item=Grimy cadantine, id=216, option=[null, null, null, null, drop] +item=Grimy dwarf weed, id=217, option=[Clean, null, null, null, drop] +item=Grimy dwarf weed, id=218, option=[null, null, null, null, drop] +item=Grimy torstol, id=219, option=[Clean, null, null, null, drop] +item=Grimy torstol, id=220, option=[null, null, null, null, drop] +item=Eye of newt, id=221, option=[null, null, null, null, drop] +item=Eye of newt, id=222, option=[null, null, null, null, drop] +item=Red spiders' eggs, id=223, option=[null, null, null, null, drop] +item=Red spiders' eggs, id=224, option=[null, null, null, null, drop] +item=Limpwurt root, id=225, option=[null, null, null, null, drop] +item=Limpwurt root, id=226, option=[null, null, null, null, drop] +item=Vial of water, id=227, option=[null, null, null, Empty, drop] +item=Vial of water, id=228, option=[null, null, null, null, drop] +item=Vial, id=229, option=[null, null, null, null, drop] +item=Vial, id=230, option=[null, null, null, null, drop] +item=Snape grass, id=231, option=[null, null, null, null, drop] +item=Snape grass, id=232, option=[null, null, null, null, drop] +item=Pestle and mortar, id=233, option=[null, null, null, null, drop] +item=Pestle and mortar, id=234, option=[null, null, null, null, drop] +item=Unicorn horn dust, id=235, option=[null, null, null, null, drop] +item=Unicorn horn dust, id=236, option=[null, null, null, null, drop] +item=Unicorn horn, id=237, option=[null, null, null, null, drop] +item=Unicorn horn, id=238, option=[null, null, null, null, drop] +item=White berries, id=239, option=[null, null, null, null, drop] +item=White berries, id=240, option=[null, null, null, null, drop] +item=Dragon scale dust, id=241, option=[null, null, null, null, drop] +item=Dragon scale dust, id=242, option=[null, null, null, null, drop] +item=Blue dragon scale, id=243, option=[null, null, null, null, drop] +item=Blue dragon scale, id=244, option=[null, null, null, null, drop] +item=Wine of zamorak, id=245, option=[null, null, null, null, drop] +item=Wine of zamorak, id=246, option=[null, null, null, null, drop] +item=Jangerberries, id=247, option=[Eat, null, null, null, drop] +item=Jangerberries, id=248, option=[null, null, null, null, drop] +item=Clean guam, id=249, option=[null, null, null, null, drop] +item=Clean guam, id=250, option=[null, null, null, null, drop] +item=Clean marrentill, id=251, option=[null, null, null, null, drop] +item=Clean marrentill, id=252, option=[null, null, null, null, drop] +item=Clean tarromin, id=253, option=[null, null, null, null, drop] +item=Clean tarromin, id=254, option=[null, null, null, null, drop] +item=Clean harralander, id=255, option=[null, null, null, null, drop] +item=Clean harralander, id=256, option=[null, null, null, null, drop] +item=Clean ranarr, id=257, option=[null, null, null, null, drop] +item=Clean ranarr, id=258, option=[null, null, null, null, drop] +item=Clean irit, id=259, option=[null, null, null, null, drop] +item=Clean irit, id=260, option=[null, null, null, null, drop] +item=Clean avantoe, id=261, option=[null, null, null, null, drop] +item=Clean avantoe, id=262, option=[null, null, null, null, drop] +item=Clean kwuarm, id=263, option=[null, null, null, null, drop] +item=Clean kwuarm, id=264, option=[null, null, null, null, drop] +item=Clean cadantine, id=265, option=[null, null, null, null, drop] +item=Clean cadantine, id=266, option=[null, null, null, null, drop] +item=Clean dwarf weed, id=267, option=[null, null, null, null, drop] +item=Clean dwarf weed, id=268, option=[null, null, null, null, drop] +item=Clean torstol, id=269, option=[null, null, null, null, drop] +item=Clean torstol, id=270, option=[null, null, null, null, drop] +item=Pressure gauge, id=271, option=[null, null, null, null, drop] +item=Fish food, id=272, option=[null, null, null, null, drop] +item=Poison, id=273, option=[null, null, null, null, drop] +item=Poisoned fish food, id=274, option=[null, null, null, null, drop] +item=Key, id=275, option=[null, null, null, null, drop] +item=Rubber tube, id=276, option=[null, null, null, null, drop] +item=Oil can, id=277, option=[null, null, null, null, drop] +item=Cattleprod, id=278, option=[null, Equip, null, null, drop] +item=Sheep feed, id=279, option=[null, null, null, null, drop] +item=Sheep bones (1), id=280, option=[null, null, null, null, drop] +item=Sheep bones (2), id=281, option=[null, null, null, null, drop] +item=Sheep bones (3), id=282, option=[null, null, null, null, drop] +item=Sheep bones (4), id=283, option=[null, null, null, null, drop] +item=Plague jacket, id=284, option=[null, Wear, null, null, drop] +item=Plague trousers, id=285, option=[null, Wear, null, null, drop] +item=Orange goblin mail, id=286, option=[null, Wear, null, null, drop] +item=Blue goblin mail, id=287, option=[null, Wear, null, null, drop] +item=Goblin mail, id=288, option=[null, Wear, null, null, drop] +item=Goblin mail, id=289, option=[null, null, null, null, drop] +item=Research package, id=290, option=[null, null, null, null, drop] +item=Notes, id=291, option=[null, null, null, null, drop] +item=Book on baxtorian, id=292, option=[Read, null, null, null, drop] +item=A key, id=293, option=[null, null, null, null, drop] +item=Glarial's pebble, id=294, option=[null, null, null, null, drop] +item=Glarial's amulet, id=295, option=[null, Wear, null, null, drop] +item=Glarial's urn, id=296, option=[null, null, null, null, drop] +item=Glarial's urn, id=297, option=[null, null, null, null, drop] +item=A key, id=298, option=[null, null, null, null, drop] +item=Mithril seeds, id=299, option=[Plant, null, null, null, drop] +item=Rat's tail, id=300, option=[null, null, null, null, drop] +item=Lobster pot, id=301, option=[null, null, null, null, drop] +item=Lobster pot, id=302, option=[null, null, null, null, drop] +item=Small fishing net, id=303, option=[null, null, null, null, drop] +item=Small fishing net, id=304, option=[null, null, null, null, drop] +item=Big fishing net, id=305, option=[null, null, null, null, drop] +item=Big fishing net, id=306, option=[null, null, null, null, drop] +item=Fishing rod, id=307, option=[null, null, null, null, drop] +item=Fishing rod, id=308, option=[null, null, null, null, drop] +item=Fly fishing rod, id=309, option=[null, null, null, null, drop] +item=Fly fishing rod, id=310, option=[null, null, null, null, drop] +item=Harpoon, id=311, option=[null, null, null, null, drop] +item=Harpoon, id=312, option=[null, null, null, null, drop] +item=Fishing bait, id=313, option=[null, null, null, null, drop] +item=Feather, id=314, option=[null, null, null, null, drop] +item=Shrimps, id=315, option=[Eat, null, null, null, drop] +item=Shrimps, id=316, option=[null, null, null, null, drop] +item=Raw shrimps, id=317, option=[null, null, null, null, drop] +item=Raw shrimps, id=318, option=[null, null, null, null, drop] +item=Anchovies, id=319, option=[Eat, null, null, null, drop] +item=Anchovies, id=320, option=[null, null, null, null, drop] +item=Raw anchovies, id=321, option=[null, null, null, null, drop] +item=Raw anchovies, id=322, option=[null, null, null, null, drop] +item=Burnt fish, id=323, option=[null, null, null, null, drop] +item=Burnt fish, id=324, option=[null, null, null, null, drop] +item=Sardine, id=325, option=[Eat, null, null, null, drop] +item=Sardine, id=326, option=[null, null, null, null, drop] +item=Raw sardine, id=327, option=[null, null, null, null, drop] +item=Raw sardine, id=328, option=[null, null, null, null, drop] +item=Salmon, id=329, option=[Eat, null, null, null, drop] +item=Salmon, id=330, option=[null, null, null, null, drop] +item=Raw salmon, id=331, option=[null, null, null, null, drop] +item=Raw salmon, id=332, option=[null, null, null, null, drop] +item=Trout, id=333, option=[Eat, null, null, null, drop] +item=Trout, id=334, option=[null, null, null, null, drop] +item=Raw trout, id=335, option=[null, null, null, null, drop] +item=Raw trout, id=336, option=[null, null, null, null, drop] +item=Giant carp, id=337, option=[Eat, null, null, null, drop] +item=Raw giant carp, id=338, option=[null, null, null, null, drop] +item=Cod, id=339, option=[Eat, null, null, null, drop] +item=Cod, id=340, option=[null, null, null, null, drop] +item=Raw cod, id=341, option=[null, null, null, null, drop] +item=Raw cod, id=342, option=[null, null, null, null, drop] +item=Burnt fish, id=343, option=[null, null, null, null, drop] +item=Burnt fish, id=344, option=[null, null, null, null, drop] +item=Raw herring, id=345, option=[null, null, null, null, drop] +item=Raw herring, id=346, option=[null, null, null, null, drop] +item=Herring, id=347, option=[Eat, null, null, null, drop] +item=Herring, id=348, option=[null, null, null, null, drop] +item=Raw pike, id=349, option=[null, null, null, null, drop] +item=Raw pike, id=350, option=[null, null, null, null, drop] +item=Pike, id=351, option=[Eat, null, null, null, drop] +item=Pike, id=352, option=[null, null, null, null, drop] +item=Raw mackerel, id=353, option=[null, null, null, null, drop] +item=Raw mackerel, id=354, option=[null, null, null, null, drop] +item=Mackerel, id=355, option=[Eat, null, null, null, drop] +item=Mackerel, id=356, option=[null, null, null, null, drop] +item=Burnt fish, id=357, option=[null, null, null, null, drop] +item=Burnt fish, id=358, option=[null, null, null, null, drop] +item=Raw tuna, id=359, option=[null, null, null, null, drop] +item=Raw tuna, id=360, option=[null, null, null, null, drop] +item=Tuna, id=361, option=[Eat, null, null, null, drop] +item=Tuna, id=362, option=[null, null, null, null, drop] +item=Raw bass, id=363, option=[null, null, null, null, drop] +item=Raw bass, id=364, option=[null, null, null, null, drop] +item=Bass, id=365, option=[Eat, null, null, null, drop] +item=Bass, id=366, option=[null, null, null, null, drop] +item=Burnt fish, id=367, option=[null, null, null, null, drop] +item=Burnt fish, id=368, option=[null, null, null, null, drop] +item=Burnt fish, id=369, option=[null, null, null, null, drop] +item=Burnt fish, id=370, option=[null, null, null, null, drop] +item=Raw swordfish, id=371, option=[null, null, null, null, drop] +item=Raw swordfish, id=372, option=[null, null, null, null, drop] +item=Swordfish, id=373, option=[Eat, null, null, null, drop] +item=Swordfish, id=374, option=[null, null, null, null, drop] +item=Burnt swordfish, id=375, option=[null, null, null, null, drop] +item=Burnt swordfish, id=376, option=[null, null, null, null, drop] +item=Raw lobster, id=377, option=[null, null, null, null, drop] +item=Raw lobster, id=378, option=[null, null, null, null, drop] +item=Lobster, id=379, option=[Eat, null, null, null, drop] +item=Lobster, id=380, option=[null, null, null, null, drop] +item=Burnt lobster, id=381, option=[null, null, null, null, drop] +item=Burnt lobster, id=382, option=[null, null, null, null, drop] +item=Raw shark, id=383, option=[null, null, null, null, drop] +item=Raw shark, id=384, option=[null, null, null, null, drop] +item=Shark, id=385, option=[Eat, null, null, null, drop] +item=Shark, id=386, option=[null, null, null, null, drop] +item=Burnt shark, id=387, option=[null, null, null, null, drop] +item=Burnt shark, id=388, option=[null, null, null, null, drop] +item=Raw manta ray, id=389, option=[null, null, null, null, drop] +item=Raw manta ray, id=390, option=[null, null, null, null, drop] +item=Manta ray, id=391, option=[Eat, null, null, null, drop] +item=Manta ray, id=392, option=[null, null, null, null, drop] +item=Burnt manta ray, id=393, option=[null, null, null, null, drop] +item=Burnt manta ray, id=394, option=[null, null, null, null, drop] +item=Raw sea turtle, id=395, option=[null, null, null, null, drop] +item=Raw sea turtle, id=396, option=[null, null, null, null, drop] +item=Sea turtle, id=397, option=[Eat, null, null, null, drop] +item=Sea turtle, id=398, option=[null, null, null, null, drop] +item=Burnt sea turtle, id=399, option=[null, null, null, null, drop] +item=Burnt sea turtle, id=400, option=[null, null, null, null, drop] +item=Seaweed, id=401, option=[null, null, null, null, drop] +item=Seaweed, id=402, option=[null, null, null, null, drop] +item=Edible seaweed, id=403, option=[Eat, null, null, null, drop] +item=Edible seaweed, id=404, option=[null, null, null, null, drop] +item=Casket, id=405, option=[Open, null, null, null, drop] +item=Casket, id=406, option=[null, null, null, null, drop] +item=Oyster, id=407, option=[Open, null, null, null, drop] +item=Oyster, id=408, option=[null, null, null, null, drop] +item=Empty oyster, id=409, option=[null, null, null, null, drop] +item=Empty oyster, id=410, option=[null, null, null, null, drop] +item=Oyster pearl, id=411, option=[null, null, null, null, drop] +item=Oyster pearl, id=412, option=[null, null, null, null, drop] +item=Oyster pearls, id=413, option=[null, null, null, null, drop] +item=Oyster pearls, id=414, option=[null, null, null, null, drop] +item=Ethenea, id=415, option=[null, null, null, null, drop] +item=Liquid honey, id=416, option=[null, null, null, null, drop] +item=Sulphuric broline, id=417, option=[null, null, null, null, drop] +item=Plague sample, id=418, option=[null, null, null, null, drop] +item=Touch paper, id=419, option=[null, null, null, null, drop] +item=Distillator, id=420, option=[null, null, null, null, drop] +item=Lathas' amulet, id=421, option=[null, Wear, null, null, drop] +item=Bird feed, id=422, option=[null, null, null, null, drop] +item=Key, id=423, option=[null, null, null, null, drop] +item=Pigeon cage, id=424, option=[Open, null, null, null, drop] +item=Pigeon cage, id=425, option=[null, null, null, null, drop] +item=Priest gown, id=426, option=[null, Wear, null, null, drop] +item=Priest gown, id=427, option=[null, null, null, null, drop] +item=Priest gown, id=428, option=[null, Wear, null, null, drop] +item=Priest gown, id=429, option=[null, null, null, null, drop] +item=Doctors' gown, id=430, option=[null, Wear, null, null, drop] +item=Karamjan rum, id=431, option=[null, null, null, Drink, drop] +item=Chest key, id=432, option=[null, null, null, null, drop] +item=Pirate message, id=433, option=[Read, null, null, null, drop] +item=Clay, id=434, option=[null, null, null, null, drop] +item=Clay, id=435, option=[null, null, null, null, drop] +item=Copper ore, id=436, option=[null, null, null, null, drop] +item=Copper ore, id=437, option=[null, null, null, null, drop] +item=Tin ore, id=438, option=[null, null, null, null, drop] +item=Tin ore, id=439, option=[null, null, null, null, drop] +item=Iron ore, id=440, option=[null, null, null, null, drop] +item=Iron ore, id=441, option=[null, null, null, null, drop] +item=Silver ore, id=442, option=[null, null, null, null, drop] +item=Silver ore, id=443, option=[null, null, null, null, drop] +item=Gold ore, id=444, option=[null, null, null, null, drop] +item=Gold ore, id=445, option=[null, null, null, null, drop] +item='perfect' gold ore, id=446, option=[null, null, null, null, drop] +item=Mithril ore, id=447, option=[null, null, null, null, drop] +item=Mithril ore, id=448, option=[null, null, null, null, drop] +item=Adamantite ore, id=449, option=[null, null, null, null, drop] +item=Adamantite ore, id=450, option=[null, null, null, null, drop] +item=Runite ore, id=451, option=[null, null, null, null, drop] +item=Runite ore, id=452, option=[null, null, null, null, drop] +item=Coal, id=453, option=[null, null, null, null, drop] +item=Coal, id=454, option=[null, null, null, null, drop] +item=Barcrawl card, id=455, option=[Read, null, null, null, drop] +item=Scorpion cage, id=456, option=[null, null, null, null, Destroy] +item=Scorpion cage, id=457, option=[null, null, null, null, Destroy] +item=Scorpion cage, id=458, option=[null, null, null, null, Destroy] +item=Scorpion cage, id=459, option=[null, null, null, null, Destroy] +item=Scorpion cage, id=460, option=[null, null, null, null, Destroy] +item=Scorpion cage, id=461, option=[null, null, null, null, Destroy] +item=Scorpion cage, id=462, option=[null, null, null, null, Destroy] +item=Scorpion cage, id=463, option=[null, null, null, null, Destroy] +item=Strange fruit, id=464, option=[Eat, null, null, null, drop] +item=Strange fruit, id=465, option=[null, null, null, null, drop] +item=Pickaxe handle, id=466, option=[null, Wield, null, null, drop] +item=Pickaxe handle, id=467, option=[null, null, null, null, drop] +item=Broken pickaxe, id=468, option=[null, null, null, null, drop] +item=Broken pickaxe, id=469, option=[null, null, null, null, drop] +item=Broken pickaxe, id=470, option=[null, null, null, null, drop] +item=Broken pickaxe, id=471, option=[null, null, null, null, drop] +item=Broken pickaxe, id=472, option=[null, null, null, null, drop] +item=Broken pickaxe, id=473, option=[null, null, null, null, drop] +item=Broken pickaxe, id=474, option=[null, null, null, null, drop] +item=Broken pickaxe, id=475, option=[null, null, null, null, drop] +item=Broken pickaxe, id=476, option=[null, null, null, null, drop] +item=Broken pickaxe, id=477, option=[null, null, null, null, drop] +item=Broken pickaxe, id=478, option=[null, null, null, null, drop] +item=Broken pickaxe, id=479, option=[null, null, null, null, drop] +item=Bronze pick head, id=480, option=[null, null, null, null, drop] +item=Bronze pick head, id=481, option=[null, null, null, null, drop] +item=Iron pick head, id=482, option=[null, null, null, null, drop] +item=Iron pick head, id=483, option=[null, null, null, null, drop] +item=Steel pick head, id=484, option=[null, null, null, null, drop] +item=Steel pick head, id=485, option=[null, null, null, null, drop] +item=Mithril pick head, id=486, option=[null, null, null, null, drop] +item=Mithril pick head, id=487, option=[null, null, null, null, drop] +item=Adamant pick head, id=488, option=[null, null, null, null, drop] +item=Adamant pick head, id=489, option=[null, null, null, null, drop] +item=Rune pick head, id=490, option=[null, null, null, null, drop] +item=Rune pick head, id=491, option=[null, null, null, null, drop] +item=Axe handle, id=492, option=[null, Wield, null, null, drop] +item=Axe handle, id=493, option=[null, null, null, null, drop] +item=Broken axe, id=494, option=[null, null, null, null, drop] +item=Broken axe, id=495, option=[null, null, null, null, drop] +item=Broken axe, id=496, option=[null, null, null, null, drop] +item=Broken axe, id=497, option=[null, null, null, null, drop] +item=Broken axe, id=498, option=[null, null, null, null, drop] +item=Broken axe, id=499, option=[null, null, null, null, drop] +item=Broken axe, id=500, option=[null, null, null, null, drop] +item=Broken axe, id=501, option=[null, null, null, null, drop] +item=Broken axe, id=502, option=[null, null, null, null, drop] +item=Broken axe, id=503, option=[null, null, null, null, drop] +item=Broken axe, id=504, option=[null, null, null, null, drop] +item=Broken axe, id=505, option=[null, null, null, null, drop] +item=Broken axe, id=506, option=[null, null, null, null, drop] +item=Broken axe, id=507, option=[null, null, null, null, drop] +item=Bronze axe head, id=508, option=[null, null, null, null, drop] +item=Bronze axe head, id=509, option=[null, null, null, null, drop] +item=Iron axe head, id=510, option=[null, null, null, null, drop] +item=Iron axe head, id=511, option=[null, null, null, null, drop] +item=Steel axe head, id=512, option=[null, null, null, null, drop] +item=Steel axe head, id=513, option=[null, null, null, null, drop] +item=Black axe head, id=514, option=[null, null, null, null, drop] +item=Black axe head, id=515, option=[null, null, null, null, drop] +item=Mithril axe head, id=516, option=[null, null, null, null, drop] +item=Mithril axe head, id=517, option=[null, null, null, null, drop] +item=Adamant axe head, id=518, option=[null, null, null, null, drop] +item=Adamant axe head, id=519, option=[null, null, null, null, drop] +item=Rune axe head, id=520, option=[null, null, null, null, drop] +item=Rune axe head, id=521, option=[null, null, null, null, drop] +item=Enchanted beef, id=522, option=[null, null, null, null, drop] +item=Enchanted rat meat, id=523, option=[null, null, null, null, drop] +item=Enchanted bear meat, id=524, option=[null, null, null, null, drop] +item=Enchanted chicken, id=525, option=[null, null, null, null, drop] +item=Bones, id=526, option=[Bury, null, null, null, drop] +item=Bones, id=527, option=[null, null, null, null, drop] +item=Burnt bones, id=528, option=[Bury, null, null, null, drop] +item=Burnt bones, id=529, option=[null, null, null, null, drop] +item=Bat bones, id=530, option=[Bury, null, null, null, drop] +item=Bat bones, id=531, option=[null, null, null, null, drop] +item=Big bones, id=532, option=[Bury, null, null, null, drop] +item=Big bones, id=533, option=[null, null, null, null, drop] +item=Babydragon bones, id=534, option=[Bury, null, null, null, drop] +item=Babydragon bones, id=535, option=[null, null, null, null, drop] +item=Dragon bones, id=536, option=[Bury, null, null, null, drop] +item=Dragon bones, id=537, option=[null, null, null, null, drop] +item=Druid's robe, id=538, option=[null, Wear, null, null, drop] +item=Druid's robe, id=539, option=[null, null, null, null, drop] +item=Druid's robe, id=540, option=[null, Wear, null, null, drop] +item=Druid's robe, id=541, option=[null, null, null, null, drop] +item=Monk's robe, id=542, option=[null, Wear, null, null, drop] +item=Monk's robe, id=543, option=[null, null, null, null, drop] +item=Monk's robe, id=544, option=[null, Wear, null, null, drop] +item=Monk's robe, id=545, option=[null, null, null, null, drop] +item=Shade robe, id=546, option=[null, Wear, null, null, drop] +item=Whoopsie, id=547, option=[null, null, null, null, drop] +item=Shade robe, id=548, option=[null, Wear, null, null, drop] +item=Whoopsie, id=549, option=[null, null, null, null, drop] +item=Newcomer map, id=550, option=[Read, null, null, null, drop] +item=Newcomer map, id=551, option=[null, null, null, null, drop] +item=Ghostspeak amulet, id=552, option=[null, Wear, null, null, drop] +item=Ghost's skull, id=553, option=[null, null, null, null, drop] +item=Fire rune, id=554, option=[null, null, null, null, drop] +item=Water rune, id=555, option=[null, null, null, null, drop] +item=Air rune, id=556, option=[null, null, null, null, drop] +item=Earth rune, id=557, option=[null, null, null, null, drop] +item=Mind rune, id=558, option=[null, null, null, null, drop] +item=Body rune, id=559, option=[null, null, null, null, drop] +item=Death rune, id=560, option=[null, null, null, null, drop] +item=Nature rune, id=561, option=[null, null, null, null, drop] +item=Chaos rune, id=562, option=[null, null, null, null, drop] +item=Law rune, id=563, option=[null, null, null, null, drop] +item=Cosmic rune, id=564, option=[null, null, null, null, drop] +item=Blood rune, id=565, option=[null, null, null, null, drop] +item=Soul rune, id=566, option=[null, null, null, null, drop] +item=Unpowered orb, id=567, option=[null, null, null, null, drop] +item=Unpowered orb, id=568, option=[null, null, null, null, drop] +item=Fire orb, id=569, option=[null, null, null, null, drop] +item=Fire orb, id=570, option=[null, null, null, null, drop] +item=Water orb, id=571, option=[null, null, null, null, drop] +item=Water orb, id=572, option=[null, null, null, null, drop] +item=Air orb, id=573, option=[null, null, null, null, drop] +item=Air orb, id=574, option=[null, null, null, null, drop] +item=Earth orb, id=575, option=[null, null, null, null, drop] +item=Earth orb, id=576, option=[null, null, null, null, drop] +item=Wizard robe, id=577, option=[null, Wear, null, null, drop] +item=Wizard robe, id=578, option=[null, null, null, null, drop] +item=Wizard hat, id=579, option=[null, Wear, null, null, drop] +item=Wizard hat, id=580, option=[null, null, null, null, drop] +item=Black robe, id=581, option=[null, Wear, null, null, drop] +item=Black robe, id=582, option=[null, null, null, null, drop] +item=Bailing bucket, id=583, option=[Bail-with, null, null, null, drop] +item=Bailing bucket, id=584, option=[null, null, null, null, drop] +item=Bailing bucket, id=585, option=[Empty, null, null, null, drop] +item=Bailing bucket, id=586, option=[null, null, null, null, drop] +item=Orb of protection, id=587, option=[null, null, null, null, drop] +item=Orbs of protection, id=588, option=[null, null, null, null, drop] +item=Gnome amulet, id=589, option=[null, Wear, null, null, drop] +item=Tinderbox, id=590, option=[null, null, null, null, drop] +item=Tinderbox, id=591, option=[null, null, null, null, drop] +item=Ashes, id=592, option=[null, null, null, null, drop] +item=Ashes, id=593, option=[null, null, null, null, drop] +item=Lit torch, id=594, option=[Extinguish, null, null, null, drop] +item=Torch, id=595, option=[Extinguish, null, null, null, drop] +item=Unlit torch, id=596, option=[null, null, null, null, drop] +item=Unlit torch, id=597, option=[null, null, null, null, drop] +item=Bronze fire arrows, id=598, option=[null, Wield, null, null, drop] +item=Double helix, id=599, option=[Wear, null, null, null, drop] +item=Astronomy book, id=600, option=[Read, null, null, null, drop] +item=Goblin kitchen key, id=601, option=[null, null, null, null, Destroy] +item=Lens mould, id=602, option=[null, null, null, null, Destroy] +item=Observatory lens, id=603, option=[null, null, null, null, Destroy] +item=Bone shard, id=604, option=[Inspect, null, null, null, drop] +item=Bone key, id=605, option=[null, null, null, null, drop] +item=Stone-plaque, id=606, option=[Read, null, null, null, drop] +item=Tattered scroll, id=607, option=[Read, null, null, null, drop] +item=Crumpled scroll, id=608, option=[Read, null, null, null, drop] +item=Rashiliyia corpse, id=609, option=[null, null, null, null, drop] +item=Zadimus corpse, id=610, option=[Bury, null, null, null, drop] +item=Locating crystal, id=611, option=[Activate, null, null, null, drop] +item=Locating crystal, id=612, option=[null, null, null, null, drop] +item=Locating crystal, id=613, option=[null, null, null, null, drop] +item=Locating crystal, id=614, option=[null, null, null, null, drop] +item=Locating crystal, id=615, option=[null, null, null, null, drop] +item=Beads of the dead, id=616, option=[null, Wear, null, null, Destroy] +item=Coins, id=617, option=[null, null, null, null, drop] +item=Bone beads, id=618, option=[null, null, null, null, drop] +item=Paramaya ticket, id=619, option=[null, null, null, null, drop] +item=Paramaya ticket, id=620, option=[null, null, null, null, drop] +item=Ship ticket, id=621, option=[null, null, null, null, drop] +item=Whoopsie, id=622, option=[null, null, null, null, drop] +item=Sword pommel, id=623, option=[null, null, null, null, drop] +item=Bervirius notes, id=624, option=[Read, null, null, null, drop] +item=Wampum belt, id=625, option=[null, null, null, null, drop] +item=Boots, id=626, option=[null, Wear, null, null, drop] +item=Boots, id=627, option=[null, null, null, null, drop] +item=Boots, id=628, option=[null, Wear, null, null, drop] +item=Boots, id=629, option=[null, null, null, null, drop] +item=Boots, id=630, option=[null, Wear, null, null, drop] +item=Boots, id=631, option=[null, null, null, null, drop] +item=Boots, id=632, option=[null, Wear, null, null, drop] +item=Boots, id=633, option=[null, null, null, null, drop] +item=Boots, id=634, option=[null, Wear, null, null, drop] +item=Boots, id=635, option=[null, null, null, null, drop] +item=Robe top, id=636, option=[null, Wear, null, null, drop] +item=Robe top, id=637, option=[null, null, null, null, drop] +item=Robe top, id=638, option=[null, Wear, null, null, drop] +item=Robe top, id=639, option=[null, null, null, null, drop] +item=Robe top, id=640, option=[null, Wear, null, null, drop] +item=Robe top, id=641, option=[null, null, null, null, drop] +item=Robe top, id=642, option=[null, Wear, null, null, drop] +item=Robe top, id=643, option=[null, null, null, null, drop] +item=Robe top, id=644, option=[null, Wear, null, null, drop] +item=Robe top, id=645, option=[null, null, null, null, drop] +item=Robe bottoms, id=646, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=647, option=[null, null, null, null, drop] +item=Robe bottoms, id=648, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=649, option=[null, null, null, null, drop] +item=Robe bottoms, id=650, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=651, option=[null, null, null, null, drop] +item=Robe bottoms, id=652, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=653, option=[null, null, null, null, drop] +item=Robe bottoms, id=654, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=655, option=[null, null, null, null, drop] +item=Hat, id=656, option=[null, Wear, null, null, drop] +item=Hat, id=657, option=[null, null, null, null, drop] +item=Hat, id=658, option=[null, Wear, null, null, drop] +item=Hat, id=659, option=[null, null, null, null, drop] +item=Hat, id=660, option=[null, Wear, null, null, drop] +item=Hat, id=661, option=[null, null, null, null, drop] +item=Hat, id=662, option=[null, Wear, null, null, drop] +item=Hat, id=663, option=[null, null, null, null, drop] +item=Hat, id=664, option=[null, Wear, null, null, drop] +item=Hat, id=665, option=[null, null, null, null, drop] +item=Portrait, id=666, option=[null, null, null, null, drop] +item=Blurite sword, id=667, option=[null, Wield, null, null, drop] +item=Blurite ore, id=668, option=[null, null, null, null, drop] +item=Specimen jar, id=669, option=[null, null, null, null, drop] +item=Specimen brush, id=670, option=[null, null, null, null, drop] +item=Animal skull, id=671, option=[null, null, null, null, Destroy] +item=Special cup, id=672, option=[null, null, null, null, Destroy] +item=Teddy, id=673, option=[null, null, null, null, Destroy] +item=Cracked sample, id=674, option=[null, null, null, null, drop] +item=Rock pick, id=675, option=[null, null, null, null, drop] +item=Trowel, id=676, option=[null, null, null, null, drop] +item=Panning tray, id=677, option=[null, null, null, Search, drop] +item=Panning tray, id=678, option=[null, Search, null, null, drop] +item=Panning tray, id=679, option=[null, Search, null, null, drop] +item=Nuggets, id=680, option=[null, null, null, null, drop] +item=Ancient talisman, id=681, option=[null, null, null, null, drop] +item=Unstamped letter, id=682, option=[null, null, null, null, drop] +item=Sealed letter, id=683, option=[null, null, null, null, drop] +item=Belt buckle, id=684, option=[null, null, null, null, drop] +item=Old boot, id=685, option=[null, null, null, null, drop] +item=Rusty sword, id=686, option=[null, null, null, null, drop] +item=Broken arrow, id=687, option=[null, null, null, null, drop] +item=Buttons, id=688, option=[null, Polish, null, null, drop] +item=Broken staff, id=689, option=[null, null, null, null, drop] +item=Broken glass, id=690, option=[null, null, null, null, drop] +item=Level 1 certificate, id=691, option=[Look-at, null, null, null, drop] +item=Level 2 certificate, id=692, option=[Look-at, null, null, null, drop] +item=Level 3 certificate, id=693, option=[Look-at, null, null, null, drop] +item=Ceramic remains, id=694, option=[null, null, null, null, drop] +item=Old tooth, id=695, option=[null, null, null, null, drop] +item=Invitation letter, id=696, option=[null, Read, null, null, drop] +item=Damaged armour, id=697, option=[null, null, null, null, drop] +item=Broken armour, id=698, option=[null, null, null, null, drop] +item=Stone tablet, id=699, option=[null, Read, null, null, drop] +item=Chemical powder, id=700, option=[null, null, null, null, drop] +item=Ammonium nitrate, id=701, option=[null, null, null, null, drop] +item=Unidentified liquid, id=702, option=[null, Empty, null, null, drop] +item=Nitroglycerin, id=703, option=[null, null, null, null, drop] +item=Ground charcoal, id=704, option=[null, null, null, null, drop] +item=Mixed chemicals, id=705, option=[null, null, null, null, drop] +item=Mixed chemicals, id=706, option=[null, null, null, null, drop] +item=Chemical compound, id=707, option=[null, null, null, null, drop] +item=Arcenia root, id=708, option=[null, null, null, null, drop] +item=Chest key, id=709, option=[null, null, null, null, drop] +item=Vase, id=710, option=[null, null, null, null, drop] +item=Book on chemicals, id=711, option=[null, Read, null, null, drop] +item=Cup of tea, id=712, option=[Drink, null, null, null, drop] +item=Enjifern, id=713, option=[Wear, null, null, null, drop] +item=Radimus notes, id=714, option=[Read, Complete, null, null, drop] +item=Radimus notes, id=715, option=[Read, null, null, null, drop] +item=Bull roarer, id=716, option=[Swing, null, null, null, drop] +item=Scrawled note, id=717, option=[Read, null, null, null, drop] +item=A scribbled note, id=718, option=[Read, null, null, null, drop] +item=Scrumpled note, id=719, option=[Read, null, null, null, drop] +item=Sketch, id=720, option=[Look, null, null, null, drop] +item=Gold bowl, id=721, option=[null, null, null, null, drop] +item=Blessed gold bowl, id=722, option=[null, null, null, null, drop] +item=Golden bowl, id=723, option=[null, null, null, Empty, drop] +item=Golden bowl, id=724, option=[null, null, null, Empty, drop] +item=Golden bowl, id=725, option=[null, null, null, Empty, drop] +item=Golden bowl, id=726, option=[null, null, null, Empty, drop] +item=Hollow reed, id=727, option=[null, null, null, null, drop] +item=Hollow reed, id=728, option=[null, null, null, null, drop] +item=Shamans tome, id=729, option=[Read, null, null, null, drop] +item=Binding book, id=730, option=[Read, Enchant-Vials, null, null, drop] +item=Enchanted vial, id=731, option=[null, null, null, null, drop] +item=Holy water, id=732, option=[null, Wield, null, null, drop] +item=Smashed glass, id=733, option=[null, null, null, null, drop] +item=Whoopsie, id=734, option=[null, null, null, null, drop] +item=Yommi tree seeds, id=735, option=[Look, null, null, null, drop] +item=Yommi tree seeds, id=736, option=[Look, null, null, null, drop] +item=Snakeweed mixture, id=737, option=[null, null, null, null, drop] +item=Ardrigal mixture, id=738, option=[null, null, null, null, drop] +item=Bravery potion, id=739, option=[Drink, null, null, null, drop] +item=Blue hat, id=740, option=[null, Wear, null, null, drop] +item=Chunk of crystal, id=741, option=[null, null, null, null, drop] +item=Hunk of crystal, id=742, option=[null, null, null, null, drop] +item=Lump of crystal, id=743, option=[null, null, null, null, drop] +item=Heart crystal, id=744, option=[Look-at, null, null, null, drop] +item=Heart crystal, id=745, option=[Look-at, null, null, null, drop] +item=Dark dagger, id=746, option=[null, Wield, null, null, drop] +item=Glowing dagger, id=747, option=[null, Wield, null, null, drop] +item=Holy force, id=748, option=[Cast Spell, null, null, null, drop] +item=Yommi totem, id=749, option=[null, null, null, null, drop] +item=Gilded totem, id=750, option=[Look-at, null, null, null, drop] +item=Gnomeball, id=751, option=[null, Hold, null, null, drop] +item=Gnomeball, id=752, option=[null, null, null, null, drop] +item=Cadava berries, id=753, option=[null, null, null, null, drop] +item=Cadava berries, id=754, option=[null, null, null, null, drop] +item=Message, id=755, option=[null, null, null, null, drop] +item=Cadava potion, id=756, option=[Look-at, Drink, null, null, drop] +item=Book, id=757, option=[Read, null, null, null, drop] +item=Phoenix hq key, id=758, option=[null, null, null, null, drop] +item=Weapon store key, id=759, option=[null, null, null, null, drop] +item=Weapon store key, id=760, option=[null, null, null, null, drop] +item=Intel report, id=761, option=[Read, null, null, null, Destroy] +item=Whoopsie, id=762, option=[Wear, null, null, null, drop] +item=Broken shield, id=763, option=[null, null, null, null, Destroy] +item=Whoopsie, id=764, option=[Wear, null, null, null, drop] +item=Broken shield, id=765, option=[null, null, null, null, Destroy] +item=Whoopsie, id=766, option=[Wear, null, null, null, drop] +item=Phoenix crossbow, id=767, option=[null, Wield, null, null, drop] +item=Phoenix crossbow, id=768, option=[null, null, null, null, drop] +item=Certificate, id=769, option=[Read, null, null, null, Destroy] +item=Whoopsie, id=770, option=[Wear, null, null, null, drop] +item=Dramen branch, id=771, option=[null, null, null, null, drop] +item=Dramen staff, id=772, option=[null, Wield, null, null, drop] +item='perfect' ring, id=773, option=[null, Wear, null, null, drop] +item='perfect' necklace, id=774, option=[null, Wear, null, null, drop] +item=Cooking gauntlets, id=775, option=[null, Wear, null, null, Destroy] +item=Goldsmith gauntlets, id=776, option=[null, Wear, null, null, Destroy] +item=Chaos gauntlets, id=777, option=[null, Wear, null, null, Destroy] +item=Family gauntlets, id=778, option=[null, Wear, null, null, Destroy] +item=Crest part, id=779, option=[null, null, null, null, drop] +item=Crest part, id=780, option=[null, null, null, null, drop] +item=Crest part, id=781, option=[null, null, null, null, drop] +item=Family crest, id=782, option=[null, null, null, null, drop] +item=Bark sample, id=783, option=[null, null, null, null, drop] +item=Translation book, id=784, option=[Read, null, null, null, drop] +item=Glough's journal, id=785, option=[Read, null, null, null, drop] +item=Hazelmere's scroll, id=786, option=[Read, null, null, null, drop] +item=Lumber order, id=787, option=[Read, null, null, null, drop] +item=Glough's key, id=788, option=[null, null, null, null, drop] +item=Twigs, id=789, option=[null, null, null, null, drop] +item=Twigs, id=790, option=[null, null, null, null, drop] +item=Twigs, id=791, option=[null, null, null, null, drop] +item=Twigs, id=792, option=[null, null, null, null, drop] +item=Daconia rock, id=793, option=[null, null, null, null, drop] +item=Invasion plans, id=794, option=[Read, null, null, null, drop] +item=War ship, id=795, option=[null, null, null, null, drop] +item=Exploding vial, id=796, option=[null, null, null, null, drop] +item=Herb bowl, id=797, option=[null, null, null, null, drop] +item=Grinder, id=798, option=[null, null, null, null, drop] +item=null, id=799, option=[null, null, null, null, drop] +item=Bronze thrownaxe, id=800, option=[null, Wield, null, null, drop] +item=Iron thrownaxe, id=801, option=[null, Wield, null, null, drop] +item=Steel thrownaxe, id=802, option=[null, Wield, null, null, drop] +item=Mithril thrownaxe, id=803, option=[null, Wield, null, null, drop] +item=Addy thrownaxe, id=804, option=[null, Wield, null, null, drop] +item=Rune thrownaxe, id=805, option=[null, Wield, null, null, drop] +item=Bronze dart, id=806, option=[null, Wield, null, null, drop] +item=Iron dart, id=807, option=[null, Wield, null, null, drop] +item=Steel dart, id=808, option=[null, Wield, null, null, drop] +item=Mithril dart, id=809, option=[null, Wield, null, null, drop] +item=Adamant dart, id=810, option=[null, Wield, null, null, drop] +item=Rune dart, id=811, option=[null, Wield, null, null, drop] +item=Bronze dart(p), id=812, option=[null, Wield, null, null, drop] +item=Iron dart(p), id=813, option=[null, Wield, null, null, drop] +item=Steel dart(p), id=814, option=[null, Wield, null, null, drop] +item=Mithril dart(p), id=815, option=[null, Wield, null, null, drop] +item=Adamant dart(p), id=816, option=[null, Wield, null, null, drop] +item=Rune dart(p), id=817, option=[null, Wield, null, null, drop] +item=Poisoned dart(p), id=818, option=[null, Wield, null, null, drop] +item=Bronze dart tip, id=819, option=[null, null, null, null, drop] +item=Iron dart tip, id=820, option=[null, null, null, null, drop] +item=Steel dart tip, id=821, option=[null, null, null, null, drop] +item=Mithril dart tip, id=822, option=[null, null, null, null, drop] +item=Adamant dart tip, id=823, option=[null, null, null, null, drop] +item=Rune dart tip, id=824, option=[null, null, null, null, drop] +item=Bronze javelin, id=825, option=[null, Wield, null, null, drop] +item=Iron javelin, id=826, option=[null, Wield, null, null, drop] +item=Steel javelin, id=827, option=[null, Wield, null, null, drop] +item=Mithril javelin, id=828, option=[null, Wield, null, null, drop] +item=Adamant javelin, id=829, option=[null, Wield, null, null, drop] +item=Rune javelin, id=830, option=[null, Wield, null, null, drop] +item=Bronze javelin(p), id=831, option=[null, Wield, null, null, drop] +item=Iron javelin(p), id=832, option=[null, Wield, null, null, drop] +item=Steel javelin(p), id=833, option=[null, Wield, null, null, drop] +item=Mithril javelin(p), id=834, option=[null, Wield, null, null, drop] +item=Adamant javelin(p), id=835, option=[null, Wield, null, null, drop] +item=Rune javelin(p), id=836, option=[null, Wield, null, null, drop] +item=Crossbow, id=837, option=[null, Wield, null, null, drop] +item=Crossbow, id=838, option=[null, null, null, null, drop] +item=Longbow, id=839, option=[null, Wield, null, null, drop] +item=Longbow, id=840, option=[null, null, null, null, drop] +item=Shortbow, id=841, option=[null, Wield, null, null, drop] +item=Shortbow, id=842, option=[null, null, null, null, drop] +item=Oak shortbow, id=843, option=[null, Wield, null, null, drop] +item=Oak shortbow, id=844, option=[null, null, null, null, drop] +item=Oak longbow, id=845, option=[null, Wield, null, null, drop] +item=Oak longbow, id=846, option=[null, null, null, null, drop] +item=Willow longbow, id=847, option=[null, Wield, null, null, drop] +item=Willow longbow, id=848, option=[null, null, null, null, drop] +item=Willow shortbow, id=849, option=[null, Wield, null, null, drop] +item=Willow shortbow, id=850, option=[null, null, null, null, drop] +item=Maple longbow, id=851, option=[null, Wield, null, null, drop] +item=Maple longbow, id=852, option=[null, null, null, null, drop] +item=Maple shortbow, id=853, option=[null, Wield, null, null, drop] +item=Maple shortbow, id=854, option=[null, null, null, null, drop] +item=Yew longbow, id=855, option=[null, Wield, null, null, drop] +item=Yew longbow, id=856, option=[null, null, null, null, drop] +item=Yew shortbow, id=857, option=[null, Wield, null, null, drop] +item=Yew shortbow, id=858, option=[null, null, null, null, drop] +item=Magic longbow, id=859, option=[null, Wield, null, null, drop] +item=Magic longbow, id=860, option=[null, null, null, null, drop] +item=Magic shortbow, id=861, option=[null, Wield, null, null, drop] +item=Magic shortbow, id=862, option=[null, null, null, null, drop] +item=Iron knife, id=863, option=[null, Wield, null, null, drop] +item=Bronze knife, id=864, option=[null, Wield, null, null, drop] +item=Steel knife, id=865, option=[null, Wield, null, null, drop] +item=Mithril knife, id=866, option=[null, Wield, null, null, drop] +item=Adamant knife, id=867, option=[null, Wield, null, null, drop] +item=Rune knife, id=868, option=[null, Wield, null, null, drop] +item=Black knife, id=869, option=[null, Wield, null, null, drop] +item=Bronze knife(p), id=870, option=[null, Wield, null, null, drop] +item=Iron knife(p), id=871, option=[null, Wield, null, null, drop] +item=Steel knife(p), id=872, option=[null, Wield, null, null, drop] +item=Mithril knife(p), id=873, option=[null, Wield, null, null, drop] +item=Black knife(p), id=874, option=[null, Wield, null, null, drop] +item=Adamant knife(p), id=875, option=[null, Wield, null, null, drop] +item=Rune knife(p), id=876, option=[null, Wield, null, null, drop] +item=Bronze bolts, id=877, option=[null, Wield, null, null, drop] +item=Bronze bolts(p), id=878, option=[null, Wield, null, null, drop] +item=Opal bolts, id=879, option=[null, Wield, null, null, drop] +item=Pearl bolts, id=880, option=[null, Wield, null, null, drop] +item=Barbed bolts, id=881, option=[null, Wield, null, null, drop] +item=Bronze arrow, id=882, option=[null, Wield, null, null, drop] +item=Bronze arrow(p), id=883, option=[null, Wield, null, null, drop] +item=Iron arrow, id=884, option=[null, Wield, null, null, drop] +item=Iron arrow(p), id=885, option=[null, Wield, null, null, drop] +item=Steel arrow, id=886, option=[null, Wield, null, null, drop] +item=Steel arrow(p), id=887, option=[null, Wield, null, null, drop] +item=Mithril arrow, id=888, option=[null, Wield, null, null, drop] +item=Mithril arrow(p), id=889, option=[null, Wield, null, null, drop] +item=Adamant arrow, id=890, option=[null, Wield, null, null, drop] +item=Adamant arrow(p), id=891, option=[null, Wield, null, null, drop] +item=Rune arrow, id=892, option=[null, Wield, null, null, drop] +item=Rune arrow(p), id=893, option=[null, Wield, null, null, drop] +item=null, id=894, option=[null, null, null, null, drop] +item=null, id=895, option=[null, null, null, null, drop] +item=null, id=896, option=[null, null, null, null, drop] +item=null, id=897, option=[null, null, null, null, drop] +item=null, id=898, option=[null, null, null, null, drop] +item=null, id=899, option=[null, null, null, null, drop] +item=null, id=900, option=[null, null, null, null, drop] +item=null, id=901, option=[null, null, null, null, drop] +item=null, id=902, option=[null, null, null, null, drop] +item=null, id=903, option=[null, null, null, null, drop] +item=null, id=904, option=[null, null, null, null, drop] +item=null, id=905, option=[null, null, null, null, drop] +item=null, id=906, option=[null, null, null, null, drop] +item=null, id=907, option=[null, null, null, null, drop] +item=null, id=908, option=[null, null, null, null, drop] +item=null, id=909, option=[null, null, null, null, drop] +item=null, id=910, option=[null, null, null, null, drop] +item=null, id=911, option=[null, null, null, null, drop] +item=null, id=912, option=[null, null, null, null, drop] +item=null, id=913, option=[null, null, null, null, drop] +item=null, id=914, option=[null, null, null, null, drop] +item=null, id=915, option=[null, null, null, null, drop] +item=null, id=916, option=[null, null, null, null, drop] +item=null, id=917, option=[null, null, null, null, drop] +item=null, id=918, option=[null, null, null, null, drop] +item=null, id=919, option=[null, null, null, null, drop] +item=null, id=920, option=[null, null, null, null, drop] +item=null, id=921, option=[null, null, null, null, drop] +item=null, id=922, option=[null, null, null, null, drop] +item=null, id=923, option=[null, null, null, null, drop] +item=null, id=924, option=[null, null, null, null, drop] +item=null, id=925, option=[null, null, null, null, drop] +item=null, id=926, option=[null, null, null, null, drop] +item=null, id=927, option=[null, null, null, null, drop] +item=null, id=928, option=[null, null, null, null, drop] +item=null, id=929, option=[null, null, null, null, drop] +item=null, id=930, option=[null, null, null, null, drop] +item=null, id=931, option=[null, null, null, null, drop] +item=null, id=932, option=[null, null, null, null, drop] +item=null, id=933, option=[null, null, null, null, drop] +item=null, id=934, option=[null, null, null, null, drop] +item=null, id=935, option=[null, null, null, null, drop] +item=null, id=936, option=[null, null, null, null, drop] +item=null, id=937, option=[null, null, null, null, drop] +item=null, id=938, option=[null, null, null, null, drop] +item=null, id=939, option=[null, null, null, null, drop] +item=null, id=940, option=[null, null, null, null, drop] +item=null, id=941, option=[null, null, null, null, drop] +item=Bronze fire arrows, id=942, option=[null, Wield, null, null, drop] +item=Worm, id=943, option=[null, null, null, null, drop] +item=Worm, id=944, option=[null, null, null, null, drop] +item=Throwing rope, id=945, option=[null, null, null, null, drop] +item=Knife, id=946, option=[null, null, null, null, drop] +item=Knife, id=947, option=[null, null, null, null, drop] +item=Bear fur, id=948, option=[null, null, null, null, drop] +item=Bear fur, id=949, option=[null, null, null, null, drop] +item=Silk, id=950, option=[null, null, null, null, drop] +item=Silk, id=951, option=[null, null, null, null, drop] +item=Spade, id=952, option=[Dig, null, null, null, drop] +item=Spade, id=953, option=[null, null, null, null, drop] +item=Rope, id=954, option=[null, null, null, null, drop] +item=Rope, id=955, option=[null, null, null, null, drop] +item=Flier, id=956, option=[null, null, null, null, drop] +item=Whoopsie, id=957, option=[null, null, null, null, drop] +item=Grey wolf fur, id=958, option=[null, null, null, null, drop] +item=Grey wolf fur, id=959, option=[null, null, null, null, drop] +item=Plank, id=960, option=[null, null, null, null, drop] +item=Plank, id=961, option=[null, null, null, null, drop] +item=Christmas cracker, id=962, option=[null, null, null, null, drop] +item=Christmas cracker, id=963, option=[null, null, null, null, drop] +item=Skull, id=964, option=[null, null, null, null, drop] +item=Skull, id=965, option=[null, null, null, null, drop] +item=Tile, id=966, option=[null, null, null, null, drop] +item=Whoopsie, id=967, option=[null, null, null, null, drop] +item=Rock, id=968, option=[null, null, null, null, drop] +item=Whoopsie, id=969, option=[null, null, null, null, drop] +item=Papyrus, id=970, option=[null, null, null, null, drop] +item=Papyrus, id=971, option=[null, null, null, null, drop] +item=Papyrus, id=972, option=[null, null, null, null, drop] +item=Charcoal, id=973, option=[null, null, null, null, drop] +item=Charcoal, id=974, option=[null, null, null, null, drop] +item=Machete, id=975, option=[null, Wield, null, null, drop] +item=Machete, id=976, option=[null, null, null, null, drop] +item=Cooking pot, id=977, option=[null, null, null, null, drop] +item=Cooking pot, id=978, option=[null, null, null, null, drop] +item=null, id=979, option=[null, null, null, null, drop] +item=Whoopsie, id=980, option=[Wear, null, null, null, drop] +item=Disk of returning, id=981, option=[null, null, null, null, drop] +item=Disk of returning, id=982, option=[null, null, null, null, drop] +item=Brass key, id=983, option=[null, null, null, null, drop] +item=Brass key, id=984, option=[null, null, null, null, drop] +item=Tooth half of a key, id=985, option=[null, null, null, null, drop] +item=Tooth half of a key, id=986, option=[null, null, null, null, drop] +item=Loop half of a key, id=987, option=[null, null, null, null, drop] +item=Loop half of a key, id=988, option=[null, null, null, null, drop] +item=Crystal key, id=989, option=[null, null, null, null, drop] +item=Crystal key, id=990, option=[null, null, null, null, drop] +item=Muddy key, id=991, option=[null, null, null, null, drop] +item=Muddy key, id=992, option=[null, null, null, null, drop] +item=Sinister key, id=993, option=[null, null, null, null, drop] +item=Sinister key, id=994, option=[null, null, null, null, drop] +item=Coins, id=995, option=[null, null, null, null, drop] +item=null, id=996, option=[null, null, null, null, drop] +item=null, id=997, option=[null, null, null, null, drop] +item=null, id=998, option=[null, null, null, null, drop] +item=null, id=999, option=[null, null, null, null, drop] +item=null, id=1000, option=[null, null, null, null, drop] +item=null, id=1001, option=[null, null, null, null, drop] +item=null, id=1002, option=[null, null, null, null, drop] +item=null, id=1003, option=[null, null, null, null, drop] +item=null, id=1004, option=[null, null, null, null, drop] +item=White apron, id=1005, option=[null, Wear, null, null, drop] +item=White apron, id=1006, option=[null, null, null, null, drop] +item=Cape, id=1007, option=[null, Wear, null, null, drop] +item=Cape, id=1008, option=[null, null, null, null, drop] +item=Brass necklace, id=1009, option=[null, Wear, null, null, drop] +item=Brass necklace, id=1010, option=[null, null, null, null, drop] +item=Blue skirt, id=1011, option=[null, Wear, null, null, drop] +item=Blue skirt, id=1012, option=[null, null, null, null, drop] +item=Pink skirt, id=1013, option=[null, Wear, null, null, drop] +item=Pink skirt, id=1014, option=[null, null, null, null, drop] +item=Black skirt, id=1015, option=[null, Wear, null, null, drop] +item=Black skirt, id=1016, option=[null, null, null, null, drop] +item=Wizard hat, id=1017, option=[null, Wear, null, null, drop] +item=Wizard hat, id=1018, option=[null, null, null, null, drop] +item=Cape, id=1019, option=[null, Wear, null, null, drop] +item=Cape, id=1020, option=[null, null, null, null, drop] +item=Cape, id=1021, option=[null, Wear, null, null, drop] +item=Cape, id=1022, option=[null, null, null, null, drop] +item=Cape, id=1023, option=[null, Wear, null, null, drop] +item=Cape, id=1024, option=[null, null, null, null, drop] +item=Eye patch, id=1025, option=[null, Wear, null, null, drop] +item=Eye patch, id=1026, option=[null, null, null, null, drop] +item=Cape, id=1027, option=[null, Wear, null, null, drop] +item=Cape, id=1028, option=[null, null, null, null, drop] +item=Cape, id=1029, option=[null, Wear, null, null, drop] +item=Cape, id=1030, option=[null, null, null, null, drop] +item=Cape, id=1031, option=[null, Wear, null, null, drop] +item=Cape, id=1032, option=[null, null, null, null, drop] +item=Zamorak robe, id=1033, option=[null, Wear, null, null, drop] +item=Zamorak robe, id=1034, option=[null, null, null, null, drop] +item=Zamorak robe, id=1035, option=[null, Wear, null, null, drop] +item=Zamorak robe, id=1036, option=[null, null, null, null, drop] +item=Bunny ears, id=1037, option=[null, Wear, null, null, drop] +item=Red partyhat, id=1038, option=[null, Wear, null, null, drop] +item=Red partyhat, id=1039, option=[null, null, null, null, drop] +item=Yellow partyhat, id=1040, option=[null, Wear, null, null, drop] +item=Yellow partyhat, id=1041, option=[null, null, null, null, drop] +item=Blue partyhat, id=1042, option=[null, Wear, null, null, drop] +item=Blue partyhat, id=1043, option=[null, null, null, null, drop] +item=Green partyhat, id=1044, option=[null, Wear, null, null, drop] +item=Green partyhat, id=1045, option=[null, null, null, null, drop] +item=Purple partyhat, id=1046, option=[null, Wear, null, null, drop] +item=Purple partyhat, id=1047, option=[null, null, null, null, drop] +item=White partyhat, id=1048, option=[null, Wear, null, null, drop] +item=White partyhat, id=1049, option=[null, null, null, null, drop] +item=Santa hat, id=1050, option=[null, Wear, null, null, drop] +item=Santa hat, id=1051, option=[null, null, null, null, drop] +item=Cape of legends, id=1052, option=[null, Wear, null, null, drop] +item=Green h'ween mask, id=1053, option=[null, Wear, null, null, drop] +item=Green h'ween mask, id=1054, option=[null, null, null, null, drop] +item=Blue h'ween mask, id=1055, option=[null, Wear, null, null, drop] +item=Blue h'ween mask, id=1056, option=[null, null, null, null, drop] +item=Red h'ween mask, id=1057, option=[null, Wear, null, null, drop] +item=Red h'ween mask, id=1058, option=[null, null, null, null, drop] +item=Leather gloves, id=1059, option=[null, Wear, null, null, drop] +item=Leather gloves, id=1060, option=[null, null, null, null, drop] +item=Leather boots, id=1061, option=[null, Wear, null, null, drop] +item=Leather boots, id=1062, option=[null, null, null, null, drop] +item=Leather vambraces, id=1063, option=[null, Wear, null, null, drop] +item=Leather vambraces, id=1064, option=[null, null, null, null, drop] +item=Green d'hide vamb, id=1065, option=[null, Wear, null, null, drop] +item=Green d'hide vamb, id=1066, option=[null, null, null, null, drop] +item=Iron platelegs, id=1067, option=[null, Wear, null, null, drop] +item=Iron platelegs, id=1068, option=[null, null, null, null, drop] +item=Steel platelegs, id=1069, option=[null, Wear, null, null, drop] +item=Steel platelegs, id=1070, option=[null, null, null, null, drop] +item=Mithril platelegs, id=1071, option=[null, Wear, null, null, drop] +item=Mithril platelegs, id=1072, option=[null, null, null, null, drop] +item=Adamant platelegs, id=1073, option=[null, Wear, null, null, drop] +item=Adamant platelegs, id=1074, option=[null, null, null, null, drop] +item=Bronze platelegs, id=1075, option=[null, Wear, null, null, drop] +item=Bronze platelegs, id=1076, option=[null, null, null, null, drop] +item=Black platelegs, id=1077, option=[null, Wear, null, null, drop] +item=Black platelegs, id=1078, option=[null, null, null, null, drop] +item=Rune platelegs, id=1079, option=[null, Wear, null, null, drop] +item=Rune platelegs, id=1080, option=[null, null, null, null, drop] +item=Iron plateskirt, id=1081, option=[null, Wear, null, null, drop] +item=Iron plateskirt, id=1082, option=[null, null, null, null, drop] +item=Steel plateskirt, id=1083, option=[null, Wear, null, null, drop] +item=Steel plateskirt, id=1084, option=[null, null, null, null, drop] +item=Mithril plateskirt, id=1085, option=[null, Wear, null, null, drop] +item=Mithril plateskirt, id=1086, option=[null, null, null, null, drop] +item=Bronze plateskirt, id=1087, option=[null, Wear, null, null, drop] +item=Bronze plateskirt, id=1088, option=[null, null, null, null, drop] +item=Black plateskirt, id=1089, option=[null, Wear, null, null, drop] +item=Black plateskirt, id=1090, option=[null, null, null, null, drop] +item=Adamant plateskirt, id=1091, option=[null, Wear, null, null, drop] +item=Adamant plateskirt, id=1092, option=[null, null, null, null, drop] +item=Rune plateskirt, id=1093, option=[null, Wear, null, null, drop] +item=Rune plateskirt, id=1094, option=[null, null, null, null, drop] +item=Leather chaps, id=1095, option=[null, Wear, null, null, drop] +item=Leather chaps, id=1096, option=[null, null, null, null, drop] +item=Studded chaps, id=1097, option=[null, Wear, null, null, drop] +item=Studded chaps, id=1098, option=[null, null, null, null, drop] +item=Green d'hide chaps, id=1099, option=[null, Wear, null, null, drop] +item=Green d'hide chaps, id=1100, option=[null, null, null, null, drop] +item=Iron chainbody, id=1101, option=[null, Wear, null, null, drop] +item=Iron chainbody, id=1102, option=[null, null, null, null, drop] +item=Bronze chainbody, id=1103, option=[null, Wear, null, null, drop] +item=Bronze chainbody, id=1104, option=[null, null, null, null, drop] +item=Steel chainbody, id=1105, option=[null, Wear, null, null, drop] +item=Steel chainbody, id=1106, option=[null, null, null, null, drop] +item=Black chainbody, id=1107, option=[null, Wear, null, null, drop] +item=Black chainbody, id=1108, option=[null, null, null, null, drop] +item=Mithril chainbody, id=1109, option=[null, Wear, null, null, drop] +item=Mithril chainbody, id=1110, option=[null, null, null, null, drop] +item=Adamant chainbody, id=1111, option=[null, Wear, null, null, drop] +item=Adamant chainbody, id=1112, option=[null, null, null, null, drop] +item=Rune chainbody, id=1113, option=[null, Wear, null, null, drop] +item=Rune chainbody, id=1114, option=[null, null, null, null, drop] +item=Iron platebody, id=1115, option=[null, Wear, null, null, drop] +item=Iron platebody, id=1116, option=[null, null, null, null, drop] +item=Bronze platebody, id=1117, option=[null, Wear, null, null, drop] +item=Bronze platebody, id=1118, option=[null, null, null, null, drop] +item=Steel platebody, id=1119, option=[null, Wear, null, null, drop] +item=Steel platebody, id=1120, option=[null, null, null, null, drop] +item=Mithril platebody, id=1121, option=[null, Wear, null, null, drop] +item=Mithril platebody, id=1122, option=[null, null, null, null, drop] +item=Adamant platebody, id=1123, option=[null, Wear, null, null, drop] +item=Adamant platebody, id=1124, option=[null, null, null, null, drop] +item=Black platebody, id=1125, option=[null, Wear, null, null, drop] +item=Black platebody, id=1126, option=[null, null, null, null, drop] +item=Rune platebody, id=1127, option=[null, Wear, null, null, drop] +item=Rune platebody, id=1128, option=[null, null, null, null, drop] +item=Leather body, id=1129, option=[null, Wear, null, null, drop] +item=Leather body, id=1130, option=[null, null, null, null, drop] +item=Hardleather body, id=1131, option=[null, Wear, null, null, drop] +item=Hardleather body, id=1132, option=[null, null, null, null, drop] +item=Studded body, id=1133, option=[null, Wear, null, null, drop] +item=Studded body, id=1134, option=[null, null, null, null, drop] +item=Green d'hide body, id=1135, option=[null, Wear, null, null, drop] +item=Green d'hide body, id=1136, option=[null, null, null, null, drop] +item=Iron med helm, id=1137, option=[null, Wear, null, null, drop] +item=Iron med helm, id=1138, option=[null, null, null, null, drop] +item=Bronze med helm, id=1139, option=[null, Wear, null, null, drop] +item=Bronze med helm, id=1140, option=[null, null, null, null, drop] +item=Steel med helm, id=1141, option=[null, Wear, null, null, drop] +item=Steel med helm, id=1142, option=[null, null, null, null, drop] +item=Mithril med helm, id=1143, option=[null, Wear, null, null, drop] +item=Mithril med helm, id=1144, option=[null, null, null, null, drop] +item=Adamant med helm, id=1145, option=[null, Wear, null, null, drop] +item=Adamant med helm, id=1146, option=[null, null, null, null, drop] +item=Rune med helm, id=1147, option=[null, Wear, null, null, drop] +item=Rune med helm, id=1148, option=[null, null, null, null, drop] +item=Dragon med helm, id=1149, option=[null, Wear, null, null, drop] +item=Dragon med helm, id=1150, option=[null, null, null, null, drop] +item=Black med helm, id=1151, option=[null, Wear, null, null, drop] +item=Black med helm, id=1152, option=[null, null, null, null, drop] +item=Iron full helm, id=1153, option=[null, Wear, null, null, drop] +item=Iron full helm, id=1154, option=[null, null, null, null, drop] +item=Bronze full helm, id=1155, option=[null, Wear, null, null, drop] +item=Bronze full helm, id=1156, option=[null, null, null, null, drop] +item=Steel full helm, id=1157, option=[null, Wear, null, null, drop] +item=Steel full helm, id=1158, option=[null, null, null, null, drop] +item=Mithril full helm, id=1159, option=[null, Wear, null, null, drop] +item=Mithril full helm, id=1160, option=[null, null, null, null, drop] +item=Adamant full helm, id=1161, option=[null, Wear, null, null, drop] +item=Adamant full helm, id=1162, option=[null, null, null, null, drop] +item=Rune full helm, id=1163, option=[null, Wear, null, null, drop] +item=Rune full helm, id=1164, option=[null, null, null, null, drop] +item=Black full helm, id=1165, option=[null, Wear, null, null, drop] +item=Black full helm, id=1166, option=[null, null, null, null, drop] +item=Leather cowl, id=1167, option=[null, Wear, null, null, drop] +item=Leather cowl, id=1168, option=[null, null, null, null, drop] +item=Coif, id=1169, option=[null, Wear, null, null, drop] +item=Coif, id=1170, option=[null, null, null, null, drop] +item=Wooden shield, id=1171, option=[null, Wield, null, null, drop] +item=Wooden shield, id=1172, option=[null, null, null, null, drop] +item=Bronze sq shield, id=1173, option=[null, Wield, null, null, drop] +item=Bronze sq shield, id=1174, option=[null, null, null, null, drop] +item=Iron sq shield, id=1175, option=[null, Wield, null, null, drop] +item=Iron sq shield, id=1176, option=[null, null, null, null, drop] +item=Steel sq shield, id=1177, option=[null, Wield, null, null, drop] +item=Steel sq shield, id=1178, option=[null, null, null, null, drop] +item=Black sq shield, id=1179, option=[null, Wield, null, null, drop] +item=Black sq shield, id=1180, option=[null, null, null, null, drop] +item=Mithril sq shield, id=1181, option=[null, Wield, null, null, drop] +item=Mithril sq shield, id=1182, option=[null, null, null, null, drop] +item=Adamant sq shield, id=1183, option=[null, Wield, null, null, drop] +item=Adamant sq shield, id=1184, option=[null, null, null, null, drop] +item=Rune sq shield, id=1185, option=[null, Wield, null, null, drop] +item=Rune sq shield, id=1186, option=[null, null, null, null, drop] +item=Dragon sq shield, id=1187, option=[null, Wield, null, null, drop] +item=Dragon sq shield, id=1188, option=[null, null, null, null, drop] +item=Bronze kiteshield, id=1189, option=[null, Wear, null, null, drop] +item=Bronze kiteshield, id=1190, option=[null, null, null, null, drop] +item=Iron kiteshield, id=1191, option=[null, Wear, null, null, drop] +item=Iron kiteshield, id=1192, option=[null, null, null, null, drop] +item=Steel kiteshield, id=1193, option=[null, Wear, null, null, drop] +item=Steel kiteshield, id=1194, option=[null, null, null, null, drop] +item=Black kiteshield, id=1195, option=[null, Wear, null, null, drop] +item=Black kiteshield, id=1196, option=[null, null, null, null, drop] +item=Mithril kiteshield, id=1197, option=[null, Wear, null, null, drop] +item=Mithril kiteshield, id=1198, option=[null, null, null, null, drop] +item=Adamant kiteshield, id=1199, option=[null, Wear, null, null, drop] +item=Adamant kiteshield, id=1200, option=[null, null, null, null, drop] +item=Rune kiteshield, id=1201, option=[null, Wear, null, null, drop] +item=Rune kiteshield, id=1202, option=[null, null, null, null, drop] +item=Iron dagger, id=1203, option=[null, Wield, null, null, drop] +item=Iron dagger, id=1204, option=[null, null, null, null, drop] +item=Bronze dagger, id=1205, option=[null, Wield, null, null, drop] +item=Bronze dagger, id=1206, option=[null, null, null, null, drop] +item=Steel dagger, id=1207, option=[null, Wield, null, null, drop] +item=Steel dagger, id=1208, option=[null, null, null, null, drop] +item=Mithril dagger, id=1209, option=[null, Wield, null, null, drop] +item=Mithril dagger, id=1210, option=[null, null, null, null, drop] +item=Adamant dagger, id=1211, option=[null, Wield, null, null, drop] +item=Adamant dagger, id=1212, option=[null, null, null, null, drop] +item=Rune dagger, id=1213, option=[null, Wield, null, null, drop] +item=Rune dagger, id=1214, option=[null, null, null, null, drop] +item=Dragon dagger, id=1215, option=[null, Wield, null, null, drop] +item=Dragon dagger, id=1216, option=[null, null, null, null, drop] +item=Black dagger, id=1217, option=[null, Wield, null, null, drop] +item=Black dagger, id=1218, option=[null, null, null, null, drop] +item=Iron dagger(p), id=1219, option=[null, Wield, null, null, drop] +item=Iron dagger(p), id=1220, option=[null, null, null, null, drop] +item=Bronze dagger(p), id=1221, option=[null, Wield, null, null, drop] +item=Bronze dagger(p), id=1222, option=[null, null, null, null, drop] +item=Steel dagger(p), id=1223, option=[null, Wield, null, null, drop] +item=Steel dagger(p), id=1224, option=[null, null, null, null, drop] +item=Mithril dagger(p), id=1225, option=[null, Wield, null, null, drop] +item=Mithril dagger(p), id=1226, option=[null, null, null, null, drop] +item=Adamant dagger(p), id=1227, option=[null, Wield, null, null, drop] +item=Adamant dagger(p), id=1228, option=[null, null, null, null, drop] +item=Rune dagger(p), id=1229, option=[null, Wield, null, null, drop] +item=Rune dagger(p), id=1230, option=[null, null, null, null, drop] +item=Dragon dagger(p), id=1231, option=[null, Wield, null, null, drop] +item=Dragon dagger(p), id=1232, option=[null, null, null, null, drop] +item=Black dagger(p), id=1233, option=[null, Wield, null, null, drop] +item=Black dagger(p), id=1234, option=[null, null, null, null, drop] +item=Poisoned dagger(p), id=1235, option=[null, Wield, null, null, drop] +item=Poisoned dagger(p), id=1236, option=[null, null, null, null, drop] +item=Bronze spear, id=1237, option=[null, Wield, null, null, drop] +item=Bronze spear, id=1238, option=[null, null, null, null, drop] +item=Iron spear, id=1239, option=[null, Wield, null, null, drop] +item=Iron spear, id=1240, option=[null, null, null, null, drop] +item=Steel spear, id=1241, option=[null, Wield, null, null, drop] +item=Steel spear, id=1242, option=[null, null, null, null, drop] +item=Mithril spear, id=1243, option=[null, Wield, null, null, drop] +item=Mithril spear, id=1244, option=[null, null, null, null, drop] +item=Adamant spear, id=1245, option=[null, Wield, null, null, drop] +item=Adamant spear, id=1246, option=[null, null, null, null, drop] +item=Rune spear, id=1247, option=[null, Wield, null, null, drop] +item=Rune spear, id=1248, option=[null, null, null, null, drop] +item=Dragon spear, id=1249, option=[null, Wield, null, null, drop] +item=Dragon spear, id=1250, option=[null, null, null, null, drop] +item=Bronze spear(p), id=1251, option=[null, Wield, null, null, drop] +item=Bronze spear(p), id=1252, option=[null, null, null, null, drop] +item=Iron spear(p), id=1253, option=[null, Wield, null, null, drop] +item=Iron spear(p), id=1254, option=[null, null, null, null, drop] +item=Steel spear(p), id=1255, option=[null, Wield, null, null, drop] +item=Steel spear(p), id=1256, option=[null, null, null, null, drop] +item=Mithril spear(p), id=1257, option=[null, Wield, null, null, drop] +item=Mithril spear(p), id=1258, option=[null, null, null, null, drop] +item=Adamant spear(p), id=1259, option=[null, Wield, null, null, drop] +item=Adamant spear(p), id=1260, option=[null, null, null, null, drop] +item=Rune spear(p), id=1261, option=[null, Wield, null, null, drop] +item=Rune spear(p), id=1262, option=[null, null, null, null, drop] +item=Dragon spear(p), id=1263, option=[null, Wield, null, null, drop] +item=Dragon spear(p), id=1264, option=[null, null, null, null, drop] +item=Bronze pickaxe, id=1265, option=[null, Wield, null, null, drop] +item=Bronze pickaxe, id=1266, option=[null, null, null, null, drop] +item=Iron pickaxe, id=1267, option=[null, Wield, null, null, drop] +item=Iron pickaxe, id=1268, option=[null, null, null, null, drop] +item=Steel pickaxe, id=1269, option=[null, Wield, null, null, drop] +item=Steel pickaxe, id=1270, option=[null, null, null, null, drop] +item=Adamant pickaxe, id=1271, option=[null, Wield, null, null, drop] +item=Adamant pickaxe, id=1272, option=[null, null, null, null, drop] +item=Mithril pickaxe, id=1273, option=[null, Wield, null, null, drop] +item=Mithril pickaxe, id=1274, option=[null, null, null, null, drop] +item=Rune pickaxe, id=1275, option=[null, Wield, null, null, drop] +item=Rune pickaxe, id=1276, option=[null, null, null, null, drop] +item=Bronze sword, id=1277, option=[null, Wield, null, null, drop] +item=Bronze sword, id=1278, option=[null, null, null, null, drop] +item=Iron sword, id=1279, option=[null, Wield, null, null, drop] +item=Iron sword, id=1280, option=[null, null, null, null, drop] +item=Steel sword, id=1281, option=[null, Wield, null, null, drop] +item=Steel sword, id=1282, option=[null, null, null, null, drop] +item=Black sword, id=1283, option=[null, Wield, null, null, drop] +item=Black sword, id=1284, option=[null, null, null, null, drop] +item=Mithril sword, id=1285, option=[null, Wield, null, null, drop] +item=Mithril sword, id=1286, option=[null, null, null, null, drop] +item=Adamant sword, id=1287, option=[null, Wield, null, null, drop] +item=Adamant sword, id=1288, option=[null, null, null, null, drop] +item=Rune sword, id=1289, option=[null, Wield, null, null, drop] +item=Rune sword, id=1290, option=[null, null, null, null, drop] +item=Bronze longsword, id=1291, option=[null, Wield, null, null, drop] +item=Bronze longsword, id=1292, option=[null, null, null, null, drop] +item=Iron longsword, id=1293, option=[null, Wield, null, null, drop] +item=Iron longsword, id=1294, option=[null, null, null, null, drop] +item=Steel longsword, id=1295, option=[null, Wield, null, null, drop] +item=Steel longsword, id=1296, option=[null, null, null, null, drop] +item=Black longsword, id=1297, option=[null, Wield, null, null, drop] +item=Black longsword, id=1298, option=[null, null, null, null, drop] +item=Mithril longsword, id=1299, option=[null, Wield, null, null, drop] +item=Mithril longsword, id=1300, option=[null, null, null, null, drop] +item=Adamant longsword, id=1301, option=[null, Wield, null, null, drop] +item=Adamant longsword, id=1302, option=[null, null, null, null, drop] +item=Rune longsword, id=1303, option=[null, Wield, null, null, drop] +item=Rune longsword, id=1304, option=[null, null, null, null, drop] +item=Dragon longsword, id=1305, option=[null, Wield, null, null, drop] +item=Dragon longsword, id=1306, option=[null, null, null, null, drop] +item=Bronze 2h sword, id=1307, option=[null, Wield, null, null, drop] +item=Bronze 2h sword, id=1308, option=[null, null, null, null, drop] +item=Iron 2h sword, id=1309, option=[null, Wield, null, null, drop] +item=Iron 2h sword, id=1310, option=[null, null, null, null, drop] +item=Steel 2h sword, id=1311, option=[null, Wield, null, null, drop] +item=Steel 2h sword, id=1312, option=[null, null, null, null, drop] +item=Black 2h sword, id=1313, option=[null, Wield, null, null, drop] +item=Black 2h sword, id=1314, option=[null, null, null, null, drop] +item=Mithril 2h sword, id=1315, option=[null, Wield, null, null, drop] +item=Mithril 2h sword, id=1316, option=[null, null, null, null, drop] +item=Adamant 2h sword, id=1317, option=[null, Wield, null, null, drop] +item=Adamant 2h sword, id=1318, option=[null, null, null, null, drop] +item=Rune 2h sword, id=1319, option=[null, Wield, null, null, drop] +item=Rune 2h sword, id=1320, option=[null, null, null, null, drop] +item=Bronze scimitar, id=1321, option=[null, Wield, null, null, drop] +item=Bronze scimitar, id=1322, option=[null, null, null, null, drop] +item=Iron scimitar, id=1323, option=[null, Wield, null, null, drop] +item=Iron scimitar, id=1324, option=[null, null, null, null, drop] +item=Steel scimitar, id=1325, option=[null, Wield, null, null, drop] +item=Steel scimitar, id=1326, option=[null, null, null, null, drop] +item=Black scimitar, id=1327, option=[null, Wield, null, null, drop] +item=Black scimitar, id=1328, option=[null, null, null, null, drop] +item=Mithril scimitar, id=1329, option=[null, Wield, null, null, drop] +item=Mithril scimitar, id=1330, option=[null, null, null, null, drop] +item=Adamant scimitar, id=1331, option=[null, Wield, null, null, drop] +item=Adamant scimitar, id=1332, option=[null, null, null, null, drop] +item=Rune scimitar, id=1333, option=[null, Wield, null, null, drop] +item=Rune scimitar, id=1334, option=[null, null, null, null, drop] +item=Iron warhammer, id=1335, option=[null, Wield, null, null, drop] +item=Iron warhammer, id=1336, option=[null, null, null, null, drop] +item=Bronze warhammer, id=1337, option=[null, Wield, null, null, drop] +item=Bronze warhammer, id=1338, option=[null, null, null, null, drop] +item=Steel warhammer, id=1339, option=[null, Wield, null, null, drop] +item=Steel warhammer, id=1340, option=[null, null, null, null, drop] +item=Black warhammer, id=1341, option=[null, Wield, null, null, drop] +item=Black warhammer, id=1342, option=[null, null, null, null, drop] +item=Mithril warhammer, id=1343, option=[null, Wield, null, null, drop] +item=Mithril warhammer, id=1344, option=[null, null, null, null, drop] +item=Addy warhammer, id=1345, option=[null, Wield, null, null, drop] +item=Addy warhammer, id=1346, option=[null, null, null, null, drop] +item=Rune warhammer, id=1347, option=[null, Wield, null, null, drop] +item=Rune warhammer, id=1348, option=[null, null, null, null, drop] +item=Iron axe, id=1349, option=[null, Wield, null, null, drop] +item=Iron axe, id=1350, option=[null, null, null, null, drop] +item=Bronze axe, id=1351, option=[null, Wield, null, null, drop] +item=Bronze axe, id=1352, option=[null, null, null, null, drop] +item=Steel axe, id=1353, option=[null, Wield, null, null, drop] +item=Steel axe, id=1354, option=[null, null, null, null, drop] +item=Mithril axe, id=1355, option=[null, Wield, null, null, drop] +item=Mithril axe, id=1356, option=[null, null, null, null, drop] +item=Adamant axe, id=1357, option=[null, Wield, null, null, drop] +item=Adamant axe, id=1358, option=[null, null, null, null, drop] +item=Rune axe, id=1359, option=[null, Wield, null, null, drop] +item=Rune axe, id=1360, option=[null, null, null, null, drop] +item=Black axe, id=1361, option=[null, Wield, null, null, drop] +item=Black axe, id=1362, option=[null, null, null, null, drop] +item=Iron battleaxe, id=1363, option=[null, Wield, null, null, drop] +item=Iron battleaxe, id=1364, option=[null, null, null, null, drop] +item=Steel battleaxe, id=1365, option=[null, Wield, null, null, drop] +item=Steel battleaxe, id=1366, option=[null, null, null, null, drop] +item=Black battleaxe, id=1367, option=[null, Wield, null, null, drop] +item=Black battleaxe, id=1368, option=[null, null, null, null, drop] +item=Mithril battleaxe, id=1369, option=[null, Wield, null, null, drop] +item=Mithril battleaxe, id=1370, option=[null, null, null, null, drop] +item=Adamant battleaxe, id=1371, option=[null, Wield, null, null, drop] +item=Adamant battleaxe, id=1372, option=[null, null, null, null, drop] +item=Rune battleaxe, id=1373, option=[null, Wield, null, null, drop] +item=Rune battleaxe, id=1374, option=[null, null, null, null, drop] +item=Bronze battleaxe, id=1375, option=[null, Wield, null, null, drop] +item=Bronze battleaxe, id=1376, option=[null, null, null, null, drop] +item=Dragon battleaxe, id=1377, option=[null, Wield, null, null, drop] +item=Dragon battleaxe, id=1378, option=[null, null, null, null, drop] +item=Staff, id=1379, option=[null, Wield, null, null, drop] +item=Staff, id=1380, option=[null, null, null, null, drop] +item=Staff of air, id=1381, option=[null, Wield, null, null, drop] +item=Staff of air, id=1382, option=[null, null, null, null, drop] +item=Staff of water, id=1383, option=[null, Wield, null, null, drop] +item=Staff of water, id=1384, option=[null, null, null, null, drop] +item=Staff of earth, id=1385, option=[null, Wield, null, null, drop] +item=Staff of earth, id=1386, option=[null, null, null, null, drop] +item=Staff of fire, id=1387, option=[null, Wield, null, null, drop] +item=Staff of fire, id=1388, option=[null, null, null, null, drop] +item=Magic staff, id=1389, option=[null, Wield, null, null, drop] +item=Magic staff, id=1390, option=[null, null, null, null, drop] +item=Battlestaff, id=1391, option=[null, Wield, null, null, drop] +item=Battlestaff, id=1392, option=[null, null, null, null, drop] +item=Fire battlestaff, id=1393, option=[null, Wield, null, null, drop] +item=Fire battlestaff, id=1394, option=[null, null, null, null, drop] +item=Water battlestaff, id=1395, option=[null, Wield, null, null, drop] +item=Water battlestaff, id=1396, option=[null, null, null, null, drop] +item=Air battlestaff, id=1397, option=[null, Wield, null, null, drop] +item=Air battlestaff, id=1398, option=[null, null, null, null, drop] +item=Earth battlestaff, id=1399, option=[null, Wield, null, null, drop] +item=Earth battlestaff, id=1400, option=[null, null, null, null, drop] +item=Mystic fire staff, id=1401, option=[null, Wield, null, null, drop] +item=Mystic fire staff, id=1402, option=[null, null, null, null, drop] +item=Mystic water staff, id=1403, option=[null, Wield, null, null, drop] +item=Mystic water staff, id=1404, option=[null, null, null, null, drop] +item=Mystic air staff, id=1405, option=[null, Wield, null, null, drop] +item=Mystic air staff, id=1406, option=[null, null, null, null, drop] +item=Mystic earth staff, id=1407, option=[null, Wield, null, null, drop] +item=Mystic earth staff, id=1408, option=[null, null, null, null, drop] +item=Iban's staff, id=1409, option=[null, Wield, null, Check, drop] +item=Iban's staff, id=1410, option=[null, null, null, null, drop] +item=Farmer's fork, id=1411, option=[null, null, null, null, drop] +item=Farmer's fork, id=1412, option=[null, null, null, null, drop] +item=Halberd, id=1413, option=[null, null, null, null, drop] +item=Halberd, id=1414, option=[null, null, null, null, drop] +item=Warhammer, id=1415, option=[null, null, null, null, drop] +item=Warhammer, id=1416, option=[null, null, null, null, drop] +item=Javelin, id=1417, option=[null, null, null, null, drop] +item=Javelin, id=1418, option=[null, null, null, null, drop] +item=Scythe, id=1419, option=[null, Wield, null, null, drop] +item=Iron mace, id=1420, option=[null, Wield, null, null, drop] +item=Iron mace, id=1421, option=[null, null, null, null, drop] +item=Bronze mace, id=1422, option=[null, Wield, null, null, drop] +item=Bronze mace, id=1423, option=[null, null, null, null, drop] +item=Steel mace, id=1424, option=[null, Wield, null, null, drop] +item=Steel mace, id=1425, option=[null, null, null, null, drop] +item=Black mace, id=1426, option=[null, Wield, null, null, drop] +item=Black mace, id=1427, option=[null, null, null, null, drop] +item=Mithril mace, id=1428, option=[null, Wield, null, null, drop] +item=Mithril mace, id=1429, option=[null, null, null, null, drop] +item=Adamant mace, id=1430, option=[null, Wield, null, null, drop] +item=Adamant mace, id=1431, option=[null, null, null, null, drop] +item=Rune mace, id=1432, option=[null, Wield, null, null, drop] +item=Rune mace, id=1433, option=[null, null, null, null, drop] +item=Dragon mace, id=1434, option=[null, Wield, null, null, drop] +item=Dragon mace, id=1435, option=[null, null, null, null, drop] +item=Rune essence, id=1436, option=[null, null, null, null, drop] +item=Rune essence, id=1437, option=[null, null, null, null, drop] +item=Air talisman, id=1438, option=[null, null, null, Locate, drop] +item=Air talisman, id=1439, option=[null, null, null, null, drop] +item=Earth talisman, id=1440, option=[null, null, null, Locate, drop] +item=Earth talisman, id=1441, option=[null, null, null, null, drop] +item=Fire talisman, id=1442, option=[null, null, null, Locate, drop] +item=Fire talisman, id=1443, option=[null, null, null, null, drop] +item=Water talisman, id=1444, option=[null, null, null, Locate, drop] +item=Water talisman, id=1445, option=[null, null, null, null, drop] +item=Body talisman, id=1446, option=[null, null, null, Locate, drop] +item=Body talisman, id=1447, option=[null, null, null, null, drop] +item=Mind talisman, id=1448, option=[null, null, null, Locate, drop] +item=Mind talisman, id=1449, option=[null, null, null, null, drop] +item=Blood talisman, id=1450, option=[null, null, null, Locate, drop] +item=Blood talisman, id=1451, option=[null, null, null, null, drop] +item=Chaos talisman, id=1452, option=[null, null, null, Locate, drop] +item=Chaos talisman, id=1453, option=[null, null, null, null, drop] +item=Cosmic talisman, id=1454, option=[null, null, null, Locate, drop] +item=Cosmic talisman, id=1455, option=[null, null, null, null, drop] +item=Death talisman, id=1456, option=[null, null, null, Locate, drop] +item=Death talisman, id=1457, option=[null, null, null, null, drop] +item=Law talisman, id=1458, option=[null, null, null, Locate, drop] +item=Law talisman, id=1459, option=[null, null, null, null, drop] +item=Soul talisman, id=1460, option=[null, null, null, Locate, drop] +item=Soul talisman, id=1461, option=[null, null, null, null, drop] +item=Nature talisman, id=1462, option=[null, null, null, Locate, drop] +item=Nature talisman, id=1463, option=[null, null, null, null, drop] +item=Archery ticket, id=1464, option=[null, null, null, null, drop] +item=Weapon poison, id=1465, option=[null, null, null, null, drop] +item=Sea slug, id=1466, option=[null, null, null, null, drop] +item=Damp sticks, id=1467, option=[null, null, null, null, drop] +item=Dry sticks, id=1468, option=[Rub-together, null, null, null, drop] +item=Broken glass, id=1469, option=[null, null, null, null, drop] +item=Red bead, id=1470, option=[null, null, null, null, drop] +item=Red bead, id=1471, option=[null, null, null, null, drop] +item=Yellow bead, id=1472, option=[null, null, null, null, drop] +item=Yellow bead, id=1473, option=[null, null, null, null, drop] +item=Black bead, id=1474, option=[null, null, null, null, drop] +item=Black bead, id=1475, option=[null, null, null, null, drop] +item=White bead, id=1476, option=[null, null, null, null, drop] +item=White bead, id=1477, option=[null, null, null, null, drop] +item=Amulet of accuracy, id=1478, option=[null, Wear, null, null, drop] +item=Amulet of accuracy, id=1479, option=[null, null, null, null, drop] +item=Rock, id=1480, option=[null, null, null, null, drop] +item=Orb of light, id=1481, option=[null, null, null, null, drop] +item=Orb of light, id=1482, option=[null, null, null, null, drop] +item=Orb of light, id=1483, option=[null, null, null, null, drop] +item=Orb of light, id=1484, option=[null, null, null, null, drop] +item=Damp cloth, id=1485, option=[null, null, null, null, drop] +item=Piece of railing, id=1486, option=[null, null, null, null, drop] +item=Unicorn horn, id=1487, option=[null, null, null, null, drop] +item=Paladin's badge, id=1488, option=[null, null, null, null, drop] +item=Paladin's badge, id=1489, option=[null, null, null, null, drop] +item=Paladin's badge, id=1490, option=[null, null, null, null, drop] +item=Witch's cat, id=1491, option=[null, null, null, null, drop] +item=Doll of iban, id=1492, option=[Search, null, null, null, drop] +item=Old journal, id=1493, option=[Read, null, null, null, drop] +item=History of iban, id=1494, option=[Read, null, null, null, drop] +item=Klank's gauntlets, id=1495, option=[null, Wear, null, null, drop] +item=Iban's dove, id=1496, option=[null, null, null, null, drop] +item=Amulet of othanian, id=1497, option=[null, null, null, null, drop] +item=Amulet of doomion, id=1498, option=[null, null, null, null, drop] +item=Amulet of holthion, id=1499, option=[null, null, null, null, drop] +item=Iban's shadow, id=1500, option=[null, null, null, null, drop] +item=Dwarf brew, id=1501, option=[null, null, null, null, drop] +item=Iban's ashes, id=1502, option=[null, null, null, null, drop] +item=Warrant, id=1503, option=[null, null, null, null, drop] +item=Hangover cure, id=1504, option=[null, null, null, null, drop] +item=A magic scroll, id=1505, option=[Read, null, null, null, drop] +item=Gas mask, id=1506, option=[null, Wear, null, null, drop] +item=A small key, id=1507, option=[null, null, null, null, drop] +item=A scruffy note, id=1508, option=[Read, null, null, null, drop] +item=Book, id=1509, option=[null, null, null, null, drop] +item=Picture, id=1510, option=[null, null, null, null, drop] +item=Logs, id=1511, option=[null, null, null, null, drop] +item=Logs, id=1512, option=[null, null, null, null, drop] +item=Magic logs, id=1513, option=[null, null, null, null, drop] +item=Magic logs, id=1514, option=[null, null, null, null, drop] +item=Yew logs, id=1515, option=[null, null, null, null, drop] +item=Yew logs, id=1516, option=[null, null, null, null, drop] +item=Maple logs, id=1517, option=[null, null, null, null, drop] +item=Maple logs, id=1518, option=[null, null, null, null, drop] +item=Willow logs, id=1519, option=[null, null, null, null, drop] +item=Willow logs, id=1520, option=[null, null, null, null, drop] +item=Oak logs, id=1521, option=[null, null, null, null, drop] +item=Oak logs, id=1522, option=[null, null, null, null, drop] +item=Lockpick, id=1523, option=[null, null, null, null, drop] +item=Lockpick, id=1524, option=[null, null, null, null, drop] +item=Grimy snake weed, id=1525, option=[Clean, null, null, null, drop] +item=Clean snake weed, id=1526, option=[null, null, null, null, drop] +item=Grimy ardrigal, id=1527, option=[Clean, null, null, null, drop] +item=Clean ardrigal, id=1528, option=[null, null, null, null, drop] +item=Grimy sito foil, id=1529, option=[Clean, null, null, null, drop] +item=Clean sito foil, id=1530, option=[null, null, null, null, drop] +item=Grimy volencia moss, id=1531, option=[Clean, null, null, null, drop] +item=Clean volencia moss, id=1532, option=[null, null, null, null, drop] +item=Grimy rogue's purse, id=1533, option=[Clean, null, null, null, drop] +item=Clean rogue's purse, id=1534, option=[null, null, null, null, drop] +item=Map part, id=1535, option=[Study, null, null, null, drop] +item=Map part, id=1536, option=[Study, null, null, null, drop] +item=Map part, id=1537, option=[Study, null, null, null, drop] +item=Crandor map, id=1538, option=[Study, null, null, null, drop] +item=Steel nails, id=1539, option=[null, null, null, null, drop] +item=Anti-dragon shield, id=1540, option=[null, Wear, null, null, drop] +item=Anti-dragon shield, id=1541, option=[null, null, null, null, drop] +item=Maze key, id=1542, option=[null, null, null, null, drop] +item=Key, id=1543, option=[null, null, null, null, drop] +item=Key, id=1544, option=[null, null, null, null, drop] +item=Key, id=1545, option=[null, null, null, null, drop] +item=Key, id=1546, option=[null, null, null, null, drop] +item=Key, id=1547, option=[null, null, null, null, drop] +item=Key, id=1548, option=[null, null, null, null, drop] +item=Stake, id=1549, option=[null, null, null, null, drop] +item=Garlic, id=1550, option=[null, null, null, null, drop] +item=Garlic, id=1551, option=[null, null, null, null, drop] +item=Doogle sardine, id=1552, option=[null, null, null, null, drop] +item=Whoopsie, id=1553, option=[null, null, null, null, drop] +item=null, id=0, option=[null, null, null, null, drop] +item=Pet kitten, id=1555, option=[null, null, null, null, drop] +item=Pet kitten, id=1556, option=[null, null, null, null, drop] +item=Pet kitten, id=1557, option=[null, null, null, null, drop] +item=Pet kitten, id=1558, option=[null, null, null, null, drop] +item=Pet kitten, id=1559, option=[null, null, null, null, drop] +item=Pet kitten, id=1560, option=[null, null, null, null, drop] +item=Pet cat, id=1561, option=[null, null, null, null, drop] +item=Pet cat, id=1562, option=[null, null, null, null, drop] +item=Pet cat, id=1563, option=[null, null, null, null, drop] +item=Pet cat, id=1564, option=[null, null, null, null, drop] +item=Pet cat, id=1565, option=[null, null, null, null, drop] +item=Pet cat, id=1566, option=[null, null, null, null, drop] +item=Overgrown cat, id=1567, option=[null, null, null, null, drop] +item=Overgrown cat, id=1568, option=[null, null, null, null, drop] +item=Overgrown cat, id=1569, option=[null, null, null, null, drop] +item=Overgrown cat, id=1570, option=[null, null, null, null, drop] +item=Overgrown cat, id=1571, option=[null, null, null, null, drop] +item=Overgrown cat, id=1572, option=[null, null, null, null, drop] +item=Doogle leaves, id=1573, option=[null, null, null, null, drop] +item=Whoopsie, id=1574, option=[null, null, null, null, drop] +item=Cat training medal, id=1575, option=[null, Wear, null, null, drop] +item=Whoopsie, id=1576, option=[null, null, null, null, drop] +item=Pete's candlestick, id=1577, option=[null, null, null, null, drop] +item=Pete's candlestick, id=1578, option=[null, null, null, null, drop] +item=Thieves' armband, id=1579, option=[null, null, null, null, drop] +item=Ice gloves, id=1580, option=[null, Wear, null, null, drop] +item=Blamish snail slime, id=1581, option=[null, null, null, null, drop] +item=Blamish oil, id=1582, option=[Drink, null, null, null, drop] +item=Fire feather, id=1583, option=[null, null, null, null, drop] +item=Id papers, id=1584, option=[null, null, null, null, drop] +item=Oily fishing rod, id=1585, option=[null, null, null, null, drop] +item=Miscellaneous key, id=1586, option=[null, null, null, null, drop] +item=Miscellaneous key, id=1587, option=[null, null, null, null, drop] +item=Grips' keyring, id=1588, option=[null, null, null, null, drop] +item=Pretty girl, id=1589, option=[Wear, null, null, null, drop] +item=Dusty key, id=1590, option=[null, null, null, null, drop] +item=Jail key, id=1591, option=[null, null, null, null, drop] +item=Ring mould, id=1592, option=[null, null, null, null, drop] +item=Ring mould, id=1593, option=[null, null, null, null, drop] +item=Unholy mould, id=1594, option=[null, null, null, null, drop] +item=Amulet mould, id=1595, option=[null, null, null, null, drop] +item=Amulet mould, id=1596, option=[null, null, null, null, drop] +item=Necklace mould, id=1597, option=[null, null, null, null, drop] +item=Necklace mould, id=1598, option=[null, null, null, null, drop] +item=Holy mould, id=1599, option=[null, null, null, null, drop] +item=Holy mould, id=1600, option=[null, null, null, null, drop] +item=Diamond, id=1601, option=[null, null, null, null, drop] +item=Diamond, id=1602, option=[null, null, null, null, drop] +item=Ruby, id=1603, option=[null, null, null, null, drop] +item=Ruby, id=1604, option=[null, null, null, null, drop] +item=Emerald, id=1605, option=[null, null, null, null, drop] +item=Emerald, id=1606, option=[null, null, null, null, drop] +item=Sapphire, id=1607, option=[null, null, null, null, drop] +item=Sapphire, id=1608, option=[null, null, null, null, drop] +item=Opal, id=1609, option=[null, null, null, null, drop] +item=Opal, id=1610, option=[null, null, null, null, drop] +item=Jade, id=1611, option=[null, null, null, null, drop] +item=Jade, id=1612, option=[null, null, null, null, drop] +item=Red topaz, id=1613, option=[null, null, null, null, drop] +item=Red topaz, id=1614, option=[null, null, null, null, drop] +item=Dragonstone, id=1615, option=[null, null, null, null, drop] +item=Dragonstone, id=1616, option=[null, null, null, null, drop] +item=Uncut diamond, id=1617, option=[null, null, null, null, drop] +item=Uncut diamond, id=1618, option=[null, null, null, null, drop] +item=Uncut ruby, id=1619, option=[null, null, null, null, drop] +item=Uncut ruby, id=1620, option=[null, null, null, null, drop] +item=Uncut emerald, id=1621, option=[null, null, null, null, drop] +item=Uncut emerald, id=1622, option=[null, null, null, null, drop] +item=Uncut sapphire, id=1623, option=[null, null, null, null, drop] +item=Uncut sapphire, id=1624, option=[null, null, null, null, drop] +item=Uncut opal, id=1625, option=[null, null, null, null, drop] +item=Uncut opal, id=1626, option=[null, null, null, null, drop] +item=Uncut jade, id=1627, option=[null, null, null, null, drop] +item=Uncut jade, id=1628, option=[null, null, null, null, drop] +item=Uncut red topaz, id=1629, option=[null, null, null, null, drop] +item=Uncut red topaz, id=1630, option=[null, null, null, null, drop] +item=Uncut dragonstone, id=1631, option=[null, null, null, null, drop] +item=Uncut dragonstone, id=1632, option=[null, null, null, null, drop] +item=Crushed gem, id=1633, option=[null, null, null, null, drop] +item=Crushed gem, id=1634, option=[null, null, null, null, drop] +item=Gold ring, id=1635, option=[null, Wear, null, null, drop] +item=Gold ring, id=1636, option=[null, null, null, null, drop] +item=Sapphire ring, id=1637, option=[null, Wear, null, null, drop] +item=Sapphire ring, id=1638, option=[null, null, null, null, drop] +item=Emerald ring, id=1639, option=[null, Wear, null, null, drop] +item=Emerald ring, id=1640, option=[null, null, null, null, drop] +item=Ruby ring, id=1641, option=[null, Wear, null, null, drop] +item=Ruby ring, id=1642, option=[null, null, null, null, drop] +item=Diamond ring, id=1643, option=[null, Wear, null, null, drop] +item=Diamond ring, id=1644, option=[null, null, null, null, drop] +item=Dragonstone ring, id=1645, option=[null, Wear, null, null, drop] +item=Dragonstone ring, id=1646, option=[null, null, null, null, drop] +item=null, id=1647, option=[null, null, null, null, drop] +item=Whoopsie, id=1648, option=[Wear, null, null, null, drop] +item=Sapphire ring, id=1649, option=[null, null, null, null, drop] +item=Emerald ring, id=1650, option=[null, null, null, null, drop] +item=Ruby ring, id=1651, option=[null, null, null, null, drop] +item=Diamond ring, id=1652, option=[null, null, null, null, drop] +item=Dragonstone ring, id=1653, option=[null, null, null, null, drop] +item=Gold necklace, id=1654, option=[null, Wear, null, null, drop] +item=Gold necklace, id=1655, option=[null, null, null, null, drop] +item=Sapphire necklace, id=1656, option=[null, Wear, null, null, drop] +item=Sapphire necklace, id=1657, option=[null, null, null, null, drop] +item=Emerald necklace, id=1658, option=[null, Wear, null, null, drop] +item=Emerald necklace, id=1659, option=[null, null, null, null, drop] +item=Ruby necklace, id=1660, option=[null, Wear, null, null, drop] +item=Ruby necklace, id=1661, option=[null, null, null, null, drop] +item=Diamond necklace, id=1662, option=[null, Wear, null, null, drop] +item=Diamond necklace, id=1663, option=[null, null, null, null, drop] +item=Dragon necklace, id=1664, option=[null, Wear, null, null, drop] +item=Dragon necklace, id=1665, option=[null, null, null, null, drop] +item=null, id=1666, option=[null, null, null, null, drop] +item=Whoopsie, id=1667, option=[Wear, null, null, null, drop] +item=Sapphire necklace, id=1668, option=[null, null, null, null, drop] +item=Emerald necklace, id=1669, option=[null, null, null, null, drop] +item=Ruby necklace, id=1670, option=[null, null, null, null, drop] +item=Diamond necklace, id=1671, option=[null, null, null, null, drop] +item=Dragon necklace, id=1672, option=[null, null, null, null, drop] +item=Gold amulet, id=1673, option=[null, null, null, null, drop] +item=Gold amulet, id=1674, option=[null, null, null, null, drop] +item=Sapphire amulet, id=1675, option=[null, null, null, null, drop] +item=Sapphire amulet, id=1676, option=[null, null, null, null, drop] +item=Emerald amulet, id=1677, option=[null, null, null, null, drop] +item=Emerald amulet, id=1678, option=[null, null, null, null, drop] +item=Ruby amulet, id=1679, option=[null, null, null, null, drop] +item=Ruby amulet, id=1680, option=[null, null, null, null, drop] +item=Diamond amulet, id=1681, option=[null, null, null, null, drop] +item=Diamond amulet, id=1682, option=[null, null, null, null, drop] +item=Dragonstone ammy, id=1683, option=[null, null, null, null, drop] +item=Dragonstone ammy, id=1684, option=[null, null, null, null, drop] +item=null, id=1685, option=[null, null, null, null, drop] +item=Whoopsie, id=1686, option=[Wear, null, null, null, drop] +item=Sapphire amulet, id=1687, option=[null, null, null, null, drop] +item=Emerald amulet, id=1688, option=[null, null, null, null, drop] +item=Ruby amulet, id=1689, option=[null, null, null, null, drop] +item=Diamond amulet, id=1690, option=[null, null, null, null, drop] +item=Dragonstone ammy, id=1691, option=[null, null, null, null, drop] +item=Gold amulet, id=1692, option=[null, Wear, null, null, drop] +item=Gold amulet, id=1693, option=[null, null, null, null, drop] +item=Sapphire amulet, id=1694, option=[null, Wear, null, null, drop] +item=Sapphire amulet, id=1695, option=[null, null, null, null, drop] +item=Emerald amulet, id=1696, option=[null, Wear, null, null, drop] +item=Emerald amulet, id=1697, option=[null, null, null, null, drop] +item=Ruby amulet, id=1698, option=[null, Wear, null, null, drop] +item=Ruby amulet, id=1699, option=[null, null, null, null, drop] +item=Diamond amulet, id=1700, option=[null, Wear, null, null, drop] +item=Diamond amulet, id=1701, option=[null, null, null, null, drop] +item=Dragonstone ammy, id=1702, option=[null, Wear, null, null, drop] +item=Dragonstone ammy, id=1703, option=[null, null, null, null, drop] +item=Amulet of glory, id=1704, option=[null, Wear, null, Rub, drop] +item=Amulet of glory, id=1705, option=[null, null, null, null, drop] +item=Amulet of glory(1), id=1706, option=[null, Wear, null, Rub, drop] +item=Amulet of glory(1), id=1707, option=[null, null, null, null, drop] +item=Amulet of glory(2), id=1708, option=[null, Wear, null, Rub, drop] +item=Amulet of glory(2), id=1709, option=[null, null, null, null, drop] +item=Amulet of glory(3), id=1710, option=[null, Wear, null, Rub, drop] +item=Amulet of glory(3), id=1711, option=[null, null, null, null, drop] +item=Amulet of glory(4), id=1712, option=[null, Wear, null, Rub, drop] +item=Amulet of glory(4), id=1713, option=[null, null, null, null, drop] +item=Unstrung symbol, id=1714, option=[null, null, null, null, drop] +item=Unstrung symbol, id=1715, option=[null, null, null, null, drop] +item=Unblessed symbol, id=1716, option=[null, Wear, null, null, drop] +item=Unblessed symbol, id=1717, option=[null, null, null, null, drop] +item=Holy symbol, id=1718, option=[null, Wear, null, null, drop] +item=Holy symbol, id=1719, option=[null, null, null, null, drop] +item=Unstrung emblem, id=1720, option=[null, null, null, null, drop] +item=Unstrung emblem, id=1721, option=[null, null, null, null, drop] +item=Unpowered symbol, id=1722, option=[null, Wear, null, null, drop] +item=Unpowered symbol, id=1723, option=[null, null, null, null, drop] +item=Unholy symbol, id=1724, option=[null, Wear, null, null, drop] +item=Amulet of strength, id=1725, option=[null, Wear, null, null, drop] +item=Amulet of strength, id=1726, option=[null, null, null, null, drop] +item=Amulet of magic, id=1727, option=[null, Wear, null, null, drop] +item=Amulet of magic, id=1728, option=[null, null, null, null, drop] +item=Amulet of defence, id=1729, option=[null, Wear, null, null, drop] +item=Amulet of defence, id=1730, option=[null, null, null, null, drop] +item=Amulet of power, id=1731, option=[null, Wear, null, null, drop] +item=Amulet of power, id=1732, option=[null, null, null, null, drop] +item=Needle, id=1733, option=[null, null, null, null, drop] +item=Thread, id=1734, option=[null, null, null, null, drop] +item=Shears, id=1735, option=[null, null, null, null, drop] +item=Shears, id=1736, option=[null, null, null, null, drop] +item=Wool, id=1737, option=[null, null, null, null, drop] +item=Wool, id=1738, option=[null, null, null, null, drop] +item=Cowhide, id=1739, option=[null, null, null, null, drop] +item=Cowhide, id=1740, option=[null, null, null, null, drop] +item=Leather, id=1741, option=[null, null, null, null, drop] +item=Leather, id=1742, option=[null, null, null, null, drop] +item=Hard leather, id=1743, option=[null, null, null, null, drop] +item=Hard leather, id=1744, option=[null, null, null, null, drop] +item=Green d-leather, id=1745, option=[null, null, null, null, drop] +item=Green d-leather, id=1746, option=[null, null, null, null, drop] +item=Black dragonhide, id=1747, option=[null, null, null, null, drop] +item=Black dragonhide, id=1748, option=[null, null, null, null, drop] +item=Red dragonhide, id=1749, option=[null, null, null, null, drop] +item=Red dragonhide, id=1750, option=[null, null, null, null, drop] +item=Blue dragonhide, id=1751, option=[null, null, null, null, drop] +item=Blue dragonhide, id=1752, option=[null, null, null, null, drop] +item=Green dragonhide, id=1753, option=[null, null, null, null, drop] +item=Green dragonhide, id=1754, option=[null, null, null, null, drop] +item=Chisel, id=1755, option=[null, null, null, null, drop] +item=Chisel, id=1756, option=[null, null, null, null, drop] +item=Brown apron, id=1757, option=[null, Wear, null, null, drop] +item=Brown apron, id=1758, option=[null, null, null, null, drop] +item=Ball of wool, id=1759, option=[null, null, null, null, drop] +item=Ball of wool, id=1760, option=[null, null, null, null, drop] +item=Soft clay, id=1761, option=[null, null, null, null, drop] +item=Soft clay, id=1762, option=[null, null, null, null, drop] +item=Red dye, id=1763, option=[null, null, null, null, drop] +item=Red dye, id=1764, option=[null, null, null, null, drop] +item=Yellow dye, id=1765, option=[null, null, null, null, drop] +item=Yellow dye, id=1766, option=[null, null, null, null, drop] +item=Blue dye, id=1767, option=[null, null, null, null, drop] +item=Blue dye, id=1768, option=[null, null, null, null, drop] +item=Orange dye, id=1769, option=[null, null, null, null, drop] +item=Orange dye, id=1770, option=[null, null, null, null, drop] +item=Green dye, id=1771, option=[null, null, null, null, drop] +item=Green dye, id=1772, option=[null, null, null, null, drop] +item=Purple dye, id=1773, option=[null, null, null, null, drop] +item=Purple dye, id=1774, option=[null, null, null, null, drop] +item=Molten glass, id=1775, option=[null, null, null, null, drop] +item=Molten glass, id=1776, option=[null, null, null, null, drop] +item=Bow string, id=1777, option=[null, null, null, null, drop] +item=Bow string, id=1778, option=[null, null, null, null, drop] +item=Flax, id=1779, option=[null, null, null, null, drop] +item=Flax, id=1780, option=[null, null, null, null, drop] +item=Soda ash, id=1781, option=[null, null, null, null, drop] +item=Soda ash, id=1782, option=[null, null, null, null, drop] +item=Bucket of sand, id=1783, option=[null, null, null, Empty, drop] +item=Bucket of sand, id=1784, option=[null, null, null, null, drop] +item=Glassblowing pipe, id=1785, option=[null, null, null, null, drop] +item=Glassblowing pipe, id=1786, option=[null, null, null, null, drop] +item=Unfired pot, id=1787, option=[null, null, null, null, drop] +item=Unfired pot, id=1788, option=[null, null, null, null, drop] +item=Unfired pie dish, id=1789, option=[null, null, null, null, drop] +item=Unfired pie dish, id=1790, option=[null, null, null, null, drop] +item=Unfired bowl, id=1791, option=[null, null, null, null, drop] +item=Unfired bowl, id=1792, option=[null, null, null, null, drop] +item=Woad leaf, id=1793, option=[null, null, null, null, drop] +item=Bronze wire, id=1794, option=[null, null, null, null, drop] +item=Bronze wire, id=1795, option=[null, null, null, null, drop] +item=Silver necklace, id=1796, option=[null, Wear, null, null, drop] +item=Silver necklace, id=1797, option=[null, Wear, null, null, drop] +item=Silver cup, id=1798, option=[null, null, null, null, drop] +item=Silver cup, id=1799, option=[null, null, null, null, drop] +item=Silver bottle, id=1800, option=[null, null, null, null, drop] +item=Silver bottle, id=1801, option=[null, null, null, null, drop] +item=Silver book, id=1802, option=[null, null, null, null, drop] +item=Silver book, id=1803, option=[null, null, null, null, drop] +item=Silver needle, id=1804, option=[null, null, null, null, drop] +item=Silver needle, id=1805, option=[null, null, null, null, drop] +item=Silver pot, id=1806, option=[null, null, null, null, drop] +item=Silver pot, id=1807, option=[null, null, null, null, drop] +item=Criminal's thread, id=1808, option=[null, null, null, null, drop] +item=Criminal's thread, id=1809, option=[null, null, null, null, drop] +item=Criminal's thread, id=1810, option=[null, null, null, null, drop] +item=Flypaper, id=1811, option=[null, null, null, null, drop] +item=Pungent pot, id=1812, option=[null, null, null, null, drop] +item=Criminal's dagger, id=1813, option=[null, null, null, null, drop] +item=Criminal's dagger, id=1814, option=[null, null, null, null, drop] +item=Killer's print, id=1815, option=[null, null, null, null, drop] +item=Anna's print, id=1816, option=[null, null, null, null, drop] +item=Bob's print, id=1817, option=[null, null, null, null, drop] +item=Carol's print, id=1818, option=[null, null, null, null, drop] +item=David's print, id=1819, option=[null, null, null, null, drop] +item=Elizabeth's print, id=1820, option=[null, null, null, null, drop] +item=Frank's print, id=1821, option=[null, null, null, null, drop] +item=Unknown print, id=1822, option=[null, null, null, null, drop] +item=Waterskin(4), id=1823, option=[null, null, null, null, drop] +item=Waterskin(4), id=1824, option=[null, null, null, null, drop] +item=Waterskin(3), id=1825, option=[null, null, null, null, drop] +item=Waterskin(3), id=1826, option=[null, null, null, null, drop] +item=Waterskin(2), id=1827, option=[null, null, null, null, drop] +item=Waterskin(2), id=1828, option=[null, null, null, null, drop] +item=Waterskin(1), id=1829, option=[null, null, null, null, drop] +item=Waterskin(1), id=1830, option=[null, null, null, null, drop] +item=Waterskin(0), id=1831, option=[null, null, null, null, drop] +item=Waterskin(0), id=1832, option=[null, null, null, null, drop] +item=Desert shirt, id=1833, option=[null, Wear, null, null, drop] +item=Desert shirt, id=1834, option=[null, null, null, null, drop] +item=Desert robe, id=1835, option=[null, Wear, null, null, drop] +item=Desert robe, id=1836, option=[null, null, null, null, drop] +item=Desert boots, id=1837, option=[null, Wear, null, null, drop] +item=Desert boots, id=1838, option=[null, null, null, null, drop] +item=Metal key, id=1839, option=[null, null, null, null, drop] +item=Cell door key, id=1840, option=[null, null, null, null, drop] +item=Barrel, id=1841, option=[null, null, null, null, drop] +item=Ana in a barrel, id=1842, option=[Look, null, null, null, drop] +item=Wrought iron key, id=1843, option=[null, null, null, null, drop] +item=Slave shirt, id=1844, option=[null, Wear, null, null, drop] +item=Slave robe, id=1845, option=[null, Wear, null, null, drop] +item=Slave boots, id=1846, option=[null, Wear, null, null, drop] +item=Scrumpled paper, id=1847, option=[Read, null, null, null, drop] +item=Shantay disclaimer, id=1848, option=[Read, null, null, null, drop] +item=Prototype dart, id=1849, option=[null, null, null, null, drop] +item=Technical plans, id=1850, option=[Read, null, null, null, drop] +item=Tenti pineapple, id=1851, option=[Eat, null, null, null, drop] +item=Bedabin key, id=1852, option=[null, null, null, null, drop] +item=Prototype dart tip, id=1853, option=[null, null, null, null, drop] +item=Shantay pass, id=1854, option=[null, null, null, null, drop] +item=Rock, id=1855, option=[null, null, null, null, drop] +item=Guide book, id=1856, option=[Read, null, null, null, drop] +item=Totem, id=1857, option=[null, null, null, null, drop] +item=Address label, id=1858, option=[null, null, null, null, drop] +item=Raw ugthanki meat, id=1859, option=[null, null, null, null, drop] +item=Raw ugthanki meat, id=1860, option=[null, null, null, null, drop] +item=Ugthanki meat, id=1861, option=[Eat, null, null, null, drop] +item=Ugthanki meat, id=1862, option=[null, null, null, null, drop] +item=Pitta dough, id=1863, option=[null, null, null, null, drop] +item=Pitta dough, id=1864, option=[null, null, null, null, drop] +item=Pitta bread, id=1865, option=[null, null, null, null, drop] +item=Pitta bread, id=1866, option=[null, null, null, null, drop] +item=Burnt pitta bread, id=1867, option=[null, null, null, null, drop] +item=Burnt pitta bread, id=1868, option=[null, null, null, null, drop] +item=Chopped tomato, id=1869, option=[Eat, null, null, null, drop] +item=Chopped tomato, id=1870, option=[null, null, null, null, drop] +item=Chopped onion, id=1871, option=[Eat, null, null, null, drop] +item=Chopped onion, id=1872, option=[null, null, null, null, drop] +item=Chopped ugthanki, id=1873, option=[null, null, null, null, drop] +item=Chopped ugthanki, id=1874, option=[null, null, null, null, drop] +item=Onion & tomato, id=1875, option=[Eat, null, null, null, drop] +item=Onion & tomato, id=1876, option=[null, null, null, null, drop] +item=Ugthanki & onion, id=1877, option=[null, null, null, null, drop] +item=Ugthanki & onion, id=1878, option=[null, null, null, null, drop] +item=Ugthanki & tomato, id=1879, option=[null, null, null, null, drop] +item=Ugthanki & tomato, id=1880, option=[null, null, null, null, drop] +item=Kebab mix, id=1881, option=[null, null, null, null, drop] +item=Kebab mix, id=1882, option=[null, null, null, null, drop] +item=Ugthanki kebab, id=1883, option=[Eat, null, null, null, drop] +item=Ugthanki kebab, id=1884, option=[null, null, null, null, drop] +item=Ugthanki kebab, id=1885, option=[Eat, null, null, null, drop] +item=Ugthanki kebab, id=1886, option=[null, null, null, null, drop] +item=Cake tin, id=1887, option=[null, null, null, null, drop] +item=Cake tin, id=1888, option=[null, null, null, null, drop] +item=Uncooked cake, id=1889, option=[null, null, null, null, drop] +item=Uncooked cake, id=1890, option=[null, null, null, null, drop] +item=Cake, id=1891, option=[Eat, null, null, null, drop] +item=Cake, id=1892, option=[null, null, null, null, drop] +item=2/3 cake, id=1893, option=[Eat, null, null, null, drop] +item=2/3 cake, id=1894, option=[null, null, null, null, drop] +item=Slice of cake, id=1895, option=[Eat, null, null, null, drop] +item=Slice of cake, id=1896, option=[null, null, null, null, drop] +item=Chocolate cake, id=1897, option=[Eat, null, null, null, drop] +item=Chocolate cake, id=1898, option=[null, null, null, null, drop] +item=2/3 chocolate cake, id=1899, option=[Eat, null, null, null, drop] +item=2/3 chocolate cake, id=1900, option=[null, null, null, null, drop] +item=Chocolate slice, id=1901, option=[Eat, null, null, null, drop] +item=Chocolate slice, id=1902, option=[null, null, null, null, drop] +item=Burnt cake, id=1903, option=[null, null, null, null, drop] +item=Burnt cake, id=1904, option=[null, null, null, null, drop] +item=Asgarnian ale, id=1905, option=[Drink, null, null, null, drop] +item=Asgarnian ale, id=1906, option=[null, null, null, null, drop] +item=Wizard's mind bomb, id=1907, option=[Drink, null, null, null, drop] +item=Wizard's mind bomb, id=1908, option=[null, null, null, null, drop] +item=Greenman's ale, id=1909, option=[Drink, null, null, null, drop] +item=Greenman's ale, id=1910, option=[null, null, null, null, drop] +item=Dragon bitter, id=1911, option=[Drink, null, null, null, drop] +item=Dragon bitter, id=1912, option=[null, null, null, null, drop] +item=Dwarven stout, id=1913, option=[Drink, null, null, null, drop] +item=Dwarven stout, id=1914, option=[null, null, null, null, drop] +item=Grog, id=1915, option=[Drink, null, null, null, drop] +item=Grog, id=1916, option=[null, null, null, null, drop] +item=Beer, id=1917, option=[Drink, null, null, null, drop] +item=Beer, id=1918, option=[null, null, null, null, drop] +item=Beer glass, id=1919, option=[null, null, null, null, drop] +item=Beer glass, id=1920, option=[null, null, null, null, drop] +item=Bowl of water, id=1921, option=[null, null, null, Empty, drop] +item=Bowl of water, id=1922, option=[null, null, null, null, drop] +item=Bowl, id=1923, option=[null, null, null, null, drop] +item=Bowl, id=1924, option=[null, null, null, null, drop] +item=Bucket, id=1925, option=[null, null, null, null, drop] +item=Bucket, id=1926, option=[null, null, null, null, drop] +item=Bucket of milk, id=1927, option=[null, null, null, Empty, drop] +item=Bucket of milk, id=1928, option=[null, null, null, null, drop] +item=Bucket of water, id=1929, option=[null, null, null, Empty, drop] +item=Bucket of water, id=1930, option=[null, null, null, null, drop] +item=Empty pot, id=1931, option=[null, null, null, null, drop] +item=Empty pot, id=1932, option=[null, null, null, null, drop] +item=Pot of flour, id=1933, option=[null, null, null, Empty, drop] +item=Pot of flour, id=1934, option=[null, null, null, null, drop] +item=Jug, id=1935, option=[null, null, null, null, drop] +item=Jug, id=1936, option=[null, null, null, null, drop] +item=Jug of water, id=1937, option=[null, null, null, Empty, drop] +item=Jug of water, id=1938, option=[null, null, null, null, drop] +item=Swamp tar, id=1939, option=[null, null, null, null, drop] +item=Raw swamp paste, id=1940, option=[null, null, null, null, drop] +item=Swamp paste, id=1941, option=[null, null, null, null, drop] +item=Potato, id=1942, option=[Eat, null, null, null, drop] +item=Potato, id=1943, option=[null, null, null, null, drop] +item=Egg, id=1944, option=[null, null, null, null, drop] +item=Egg, id=1945, option=[null, null, null, null, drop] +item=Flour, id=1946, option=[null, null, null, null, drop] +item=Grain, id=1947, option=[null, null, null, null, drop] +item=Grain, id=1948, option=[null, null, null, null, drop] +item=Chef's hat, id=1949, option=[null, Wear, null, null, drop] +item=Chef's hat, id=1950, option=[null, null, null, null, drop] +item=Redberries, id=1951, option=[null, null, null, null, drop] +item=Redberries, id=1952, option=[null, null, null, null, drop] +item=Pastry dough, id=1953, option=[null, null, null, null, drop] +item=Pastry dough, id=1954, option=[null, null, null, null, drop] +item=Cooking apple, id=1955, option=[null, null, null, null, drop] +item=Cooking apple, id=1956, option=[null, null, null, null, drop] +item=Onion, id=1957, option=[Eat, null, null, null, drop] +item=Onion, id=1958, option=[null, null, null, null, drop] +item=Pumpkin, id=1959, option=[Eat, null, null, null, drop] +item=Pumpkin, id=1960, option=[null, null, null, null, drop] +item=Easter egg, id=1961, option=[Eat, null, null, null, drop] +item=Easter egg, id=1962, option=[null, null, null, null, drop] +item=Banana, id=1963, option=[Eat, null, null, null, drop] +item=Banana, id=1964, option=[null, null, null, null, drop] +item=Cabbage, id=1965, option=[Eat, null, null, null, drop] +item=Cabbage, id=1966, option=[null, null, null, null, drop] +item=Cabbage, id=1967, option=[Eat, null, null, null, drop] +item=Cabbage, id=1968, option=[null, null, null, null, drop] +item=Spinach roll, id=1969, option=[Eat, null, null, null, drop] +item=Whoopsie, id=1970, option=[null, null, null, null, drop] +item=Kebab, id=1971, option=[Eat, null, null, null, drop] +item=Kebab, id=1972, option=[null, null, null, null, drop] +item=Chocolate bar, id=1973, option=[Eat, null, null, null, drop] +item=Chocolate bar, id=1974, option=[null, null, null, null, drop] +item=Chocolate dust, id=1975, option=[null, null, null, null, drop] +item=Chocolate dust, id=1976, option=[null, null, null, null, drop] +item=Chocolatey milk, id=1977, option=[Drink, null, null, null, drop] +item=Cup of tea, id=1978, option=[Drink, null, null, null, drop] +item=Cup of tea, id=1979, option=[null, null, null, null, drop] +item=Empty cup, id=1980, option=[null, null, null, null, drop] +item=Empty cup, id=1981, option=[null, null, null, null, drop] +item=Tomato, id=1982, option=[Eat, null, null, null, drop] +item=Tomato, id=1983, option=[null, null, null, null, drop] +item=Rotten apple, id=1984, option=[Eat, null, null, null, drop] +item=Cheese, id=1985, option=[Eat, null, null, null, drop] +item=Cheese, id=1986, option=[null, null, null, null, drop] +item=Grapes, id=1987, option=[null, null, null, null, drop] +item=Grapes, id=1988, option=[null, null, null, null, drop] +item=Half full wine jug, id=1989, option=[Drink, null, null, null, drop] +item=Half full wine jug, id=1990, option=[null, null, null, null, drop] +item=Jug of bad wine, id=1991, option=[Drink, null, null, null, drop] +item=Jug of bad wine, id=1992, option=[Drink, null, null, null, drop] +item=Jug of wine, id=1993, option=[Drink, null, null, null, drop] +item=Jug of wine, id=1994, option=[null, null, null, null, drop] +item=Unfermented wine, id=1995, option=[null, null, null, null, drop] +item=Unfermented wine, id=1996, option=[null, null, null, null, drop] +item=Incomplete stew, id=1997, option=[null, null, null, null, drop] +item=Incomplete stew, id=1998, option=[null, null, null, null, drop] +item=Incomplete stew, id=1999, option=[null, null, null, null, drop] +item=Incomplete stew, id=2000, option=[null, null, null, null, drop] +item=Uncooked stew, id=2001, option=[null, null, null, null, drop] +item=Uncooked stew, id=2002, option=[null, null, null, null, drop] +item=Stew, id=2003, option=[Eat, null, null, null, drop] +item=Stew, id=2004, option=[null, null, null, null, drop] +item=Burnt stew, id=2005, option=[Empty Bowl, null, null, null, drop] +item=Burnt stew, id=2006, option=[null, null, null, null, drop] +item=Spice, id=2007, option=[null, null, null, null, drop] +item=Spice, id=2008, option=[null, null, null, null, drop] +item=Uncooked curry, id=2009, option=[null, null, null, null, drop] +item=Uncooked curry, id=2010, option=[null, null, null, null, drop] +item=Curry, id=2011, option=[Eat, null, null, null, drop] +item=Curry, id=2012, option=[null, null, null, null, drop] +item=Burnt curry, id=2013, option=[Empty Bowl, null, null, null, drop] +item=Burnt curry, id=2014, option=[null, null, null, null, drop] +item=Vodka, id=2015, option=[Drink, null, null, null, drop] +item=Vodka, id=2016, option=[null, null, null, null, drop] +item=Whisky, id=2017, option=[Drink, null, null, null, drop] +item=Whisky, id=2018, option=[null, null, null, null, drop] +item=Gin, id=2019, option=[Drink, null, null, null, drop] +item=Gin, id=2020, option=[null, null, null, null, drop] +item=Brandy, id=2021, option=[Drink, null, null, null, drop] +item=Brandy, id=2022, option=[null, null, null, null, drop] +item=Cocktail guide, id=2023, option=[Read, null, null, null, drop] +item=Cocktail guide, id=2024, option=[null, null, null, null, drop] +item=Cocktail shaker, id=2025, option=[Mix-cocktail, null, null, null, drop] +item=Cocktail glass, id=2026, option=[null, null, null, null, drop] +item=Cocktail glass, id=2027, option=[null, null, null, null, drop] +item=Premade blurb' sp., id=2028, option=[Drink, null, null, null, drop] +item=Premade blurb' sp., id=2029, option=[null, null, null, null, drop] +item=Premade choc s'dy, id=2030, option=[Drink, null, null, null, drop] +item=Premade choc s'dy, id=2031, option=[null, null, null, null, drop] +item=Premade dr' dragon, id=2032, option=[Drink, null, null, null, drop] +item=Premade dr' dragon, id=2033, option=[null, null, null, null, drop] +item=Premade fr' blast, id=2034, option=[Drink, null, null, null, drop] +item=Premade fr' blast, id=2035, option=[null, null, null, null, drop] +item=Premade p' punch, id=2036, option=[Drink, null, null, null, drop] +item=Premade p' punch, id=2037, option=[null, null, null, null, drop] +item=Premade sgg, id=2038, option=[Drink, null, null, null, drop] +item=Premade sgg, id=2039, option=[null, null, null, null, drop] +item=Premade wiz blz'd, id=2040, option=[Drink, null, null, null, drop] +item=Premade wiz blz'd, id=2041, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2042, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2043, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2044, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2045, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2046, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2047, option=[null, null, null, null, drop] +item=Pineapple punch, id=2048, option=[Drink, null, null, null, drop] +item=Pineapple punch, id=2049, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2050, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2051, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2052, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2053, option=[null, null, null, null, drop] +item=Wizard blizzard, id=2054, option=[Drink, null, null, null, drop] +item=Wizard blizzard, id=2055, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2056, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2057, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2058, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2059, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2060, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2061, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2062, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2063, option=[null, null, null, null, drop] +item=Blurberry special, id=2064, option=[Drink, null, null, null, drop] +item=Blurberry special, id=2065, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2066, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2067, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2068, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2069, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2070, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2071, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2072, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2073, option=[null, null, null, null, drop] +item=Choc saturday, id=2074, option=[Drink, null, null, null, drop] +item=Choc saturday, id=2075, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2076, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2077, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2078, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2079, option=[null, null, null, null, drop] +item=Short green guy, id=2080, option=[Drink, null, null, null, drop] +item=Short green guy, id=2081, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2082, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2083, option=[null, null, null, null, drop] +item=Fruit blast, id=2084, option=[Drink, null, null, null, drop] +item=Fruit blast, id=2085, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2086, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2087, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2088, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2089, option=[null, null, null, null, drop] +item=Unfinished cocktail, id=2090, option=[Drink, null, null, null, drop] +item=Unfinished cocktail, id=2091, option=[null, null, null, null, drop] +item=Drunk dragon, id=2092, option=[Drink, null, null, null, drop] +item=Drunk dragon, id=2093, option=[null, null, null, null, drop] +item=Odd cocktail, id=2094, option=[Empty, null, Drink, null, drop] +item=Odd cocktail, id=2095, option=[null, null, null, null, drop] +item=Odd cocktail, id=2096, option=[Empty, null, Drink, null, drop] +item=Odd cocktail, id=2097, option=[null, null, null, null, drop] +item=Odd cocktail, id=2098, option=[Empty, null, Drink, null, drop] +item=Odd cocktail, id=2099, option=[null, null, null, null, drop] +item=Odd cocktail, id=2100, option=[Empty, null, Drink, null, drop] +item=Odd cocktail, id=2101, option=[null, null, null, null, drop] +item=Lemon, id=2102, option=[Eat, null, null, null, drop] +item=Lemon, id=2103, option=[null, null, null, null, drop] +item=Lemon chunks, id=2104, option=[Eat, null, null, null, drop] +item=Lemon chunks, id=2105, option=[null, null, null, null, drop] +item=Lemon slices, id=2106, option=[Eat, null, null, null, drop] +item=Lemon slices, id=2107, option=[null, null, null, null, drop] +item=Orange, id=2108, option=[Eat, null, null, null, drop] +item=Orange, id=2109, option=[null, null, null, null, drop] +item=Orange chunks, id=2110, option=[Eat, null, null, null, drop] +item=Orange chunks, id=2111, option=[null, null, null, null, drop] +item=Orange slices, id=2112, option=[Eat, null, null, null, drop] +item=Orange slices, id=2113, option=[null, null, null, null, drop] +item=Pineapple, id=2114, option=[Eat, null, null, null, drop] +item=Pineapple, id=2115, option=[null, null, null, null, drop] +item=Pineapple chunks, id=2116, option=[Eat, null, null, null, drop] +item=Pineapple chunks, id=2117, option=[null, null, null, null, drop] +item=Pineapple ring, id=2118, option=[Eat, null, null, null, drop] +item=Pineapple ring, id=2119, option=[null, null, null, null, drop] +item=Lime, id=2120, option=[Eat, null, null, null, drop] +item=Lime, id=2121, option=[null, null, null, null, drop] +item=Lime chunks, id=2122, option=[Eat, null, null, null, drop] +item=Lime chunks, id=2123, option=[null, null, null, null, drop] +item=Lime slices, id=2124, option=[Eat, null, null, null, drop] +item=Lime slices, id=2125, option=[null, null, null, null, drop] +item=Dwellberries, id=2126, option=[Eat, null, null, null, drop] +item=Dwellberries, id=2127, option=[null, null, null, null, drop] +item=Equa leaves, id=2128, option=[Eat, null, null, null, drop] +item=Equa leaves, id=2129, option=[null, null, null, null, drop] +item=Pot of cream, id=2130, option=[Eat, null, null, null, drop] +item=Pot of cream, id=2131, option=[null, null, null, null, drop] +item=Raw beef, id=2132, option=[null, null, null, null, drop] +item=Raw beef, id=2133, option=[null, null, null, null, drop] +item=Raw rat meat, id=2134, option=[null, null, null, null, drop] +item=Raw rat meat, id=2135, option=[null, null, null, null, drop] +item=Raw bear meat, id=2136, option=[null, null, null, null, drop] +item=Raw bear meat, id=2137, option=[null, null, null, null, drop] +item=Raw chicken, id=2138, option=[null, null, null, null, drop] +item=Raw chicken, id=2139, option=[null, null, null, null, drop] +item=Cooked chicken, id=2140, option=[Eat, null, null, null, drop] +item=Cooked chicken, id=2141, option=[null, null, null, null, drop] +item=Cooked meat, id=2142, option=[Eat, null, null, null, drop] +item=Cooked meat, id=2143, option=[null, null, null, null, drop] +item=Burnt chicken, id=2144, option=[null, null, null, null, drop] +item=Burnt chicken, id=2145, option=[null, null, null, null, drop] +item=Burnt meat, id=2146, option=[null, null, null, null, drop] +item=Burnt meat, id=2147, option=[null, null, null, null, drop] +item=Raw lava eel, id=2148, option=[null, null, null, null, drop] +item=Lava eel, id=2149, option=[Eat, null, null, null, drop] +item=Swamp toad, id=2150, option=[Remove-legs, null, null, null, drop] +item=Swamp toad, id=2151, option=[null, null, null, null, drop] +item=Toad's legs, id=2152, option=[Eat, null, null, null, drop] +item=Toad's legs, id=2153, option=[null, null, null, null, drop] +item=Equa toad's legs, id=2154, option=[Eat, null, null, null, drop] +item=Equa toad's legs, id=2155, option=[null, null, null, null, drop] +item=Spicy toad's legs, id=2156, option=[Eat, null, null, null, drop] +item=Spicy toad's legs, id=2157, option=[null, null, null, null, drop] +item=Seasoned legs, id=2158, option=[Eat, null, null, null, drop] +item=Seasoned legs, id=2159, option=[null, null, null, null, drop] +item=Spicy worm, id=2160, option=[Eat, null, null, null, drop] +item=Spicy worm, id=2161, option=[null, null, null, null, drop] +item=King worm, id=2162, option=[Eat, null, null, null, drop] +item=King worm, id=2163, option=[null, null, null, null, drop] +item=Batta tin, id=2164, option=[null, null, null, null, drop] +item=Crunchy tray, id=2165, option=[null, null, null, null, drop] +item=Gnomebowl mould, id=2166, option=[null, null, null, null, drop] +item=Gianne's cook book, id=2167, option=[Read, null, null, null, drop] +item=Gianne's cook book, id=2168, option=[null, null, null, null, drop] +item=Gnome spice, id=2169, option=[null, null, null, null, drop] +item=Gnome spice, id=2170, option=[null, null, null, null, drop] +item=Gianne dough, id=2171, option=[null, null, null, null, drop] +item=Gianne dough, id=2172, option=[null, null, null, null, drop] +item=Odd gnomebowl, id=2173, option=[Eat, null, null, null, drop] +item=Odd gnomebowl, id=2174, option=[null, null, null, null, drop] +item=Burnt gnomebowl, id=2175, option=[Empty Bowl, null, null, null, drop] +item=Burnt gnomebowl, id=2176, option=[null, null, null, null, drop] +item=Half baked bowl, id=2177, option=[Prepare, null, null, null, drop] +item=Raw gnomebowl, id=2178, option=[null, null, null, null, drop] +item=Unfinished bowl, id=2179, option=[Eat, null, null, null, drop] +item=Unfinished bowl, id=2180, option=[null, null, null, null, drop] +item=Unfinished bowl, id=2181, option=[Eat, null, null, null, drop] +item=Unfinished bowl, id=2182, option=[null, null, null, null, drop] +item=Unfinished bowl, id=2183, option=[Eat, null, null, null, drop] +item=Unfinished bowl, id=2184, option=[null, null, null, null, drop] +item=Chocolate bomb, id=2185, option=[Eat, null, null, null, drop] +item=Chocolate bomb, id=2186, option=[null, null, null, null, drop] +item=Tangled toads' legs, id=2187, option=[Eat, null, null, null, drop] +item=Tangled toads' legs, id=2188, option=[null, null, null, null, drop] +item=Unfinished bowl, id=2189, option=[Eat, null, null, null, drop] +item=Unfinished bowl, id=2190, option=[null, null, null, null, drop] +item=Worm hole, id=2191, option=[Eat, null, null, null, drop] +item=Worm hole, id=2192, option=[null, null, null, null, drop] +item=Unfinished bowl, id=2193, option=[Eat, null, null, null, drop] +item=Unfinished bowl, id=2194, option=[null, null, null, null, drop] +item=Veg ball, id=2195, option=[Eat, null, null, null, drop] +item=Veg ball, id=2196, option=[null, null, null, null, drop] +item=Odd crunchies, id=2197, option=[Eat, null, null, null, drop] +item=Odd crunchies, id=2198, option=[null, null, null, null, drop] +item=Burnt crunchies, id=2199, option=[Empty Tray, null, null, null, drop] +item=Burnt crunchies, id=2200, option=[null, null, null, null, drop] +item=Half baked crunchy, id=2201, option=[Prepare, null, null, null, drop] +item=Raw crunchies, id=2202, option=[null, null, null, null, drop] +item=Unfinished crunchy, id=2203, option=[Eat, null, null, null, drop] +item=Unfinished crunchy, id=2204, option=[null, null, null, null, drop] +item=Worm crunchies, id=2205, option=[Eat, null, null, null, drop] +item=Worm crunchies, id=2206, option=[null, null, null, null, drop] +item=Unfinished crunchy, id=2207, option=[Eat, null, null, null, drop] +item=Unfinished crunchy, id=2208, option=[null, null, null, null, drop] +item=Chocchip crunchies, id=2209, option=[Eat, null, null, null, drop] +item=Chocchip crunchies, id=2210, option=[null, null, null, null, drop] +item=Unfinished crunchy, id=2211, option=[Eat, null, null, null, drop] +item=Unfinished crunchy, id=2212, option=[null, null, null, null, drop] +item=Spicy crunchies, id=2213, option=[Eat, null, null, null, drop] +item=Spicy crunchies, id=2214, option=[null, null, null, null, drop] +item=Unfinished crunchy, id=2215, option=[Eat, null, null, null, drop] +item=Unfinished crunchy, id=2216, option=[null, null, null, null, drop] +item=Toad crunchies, id=2217, option=[Eat, null, null, null, drop] +item=Toad crunchies, id=2218, option=[null, null, null, null, drop] +item=Premade w'm batta, id=2219, option=[Eat, null, null, null, drop] +item=Premade w'm batta, id=2220, option=[null, null, null, null, drop] +item=Premade t'd batta, id=2221, option=[Eat, null, null, null, drop] +item=Premade t'd batta, id=2222, option=[null, null, null, null, drop] +item=Premade c+t batta, id=2223, option=[Eat, null, null, null, drop] +item=Premade c+t batta, id=2224, option=[null, null, null, null, drop] +item=Premade fr't batta, id=2225, option=[Eat, null, null, null, drop] +item=Premade fr't batta, id=2226, option=[null, null, null, null, drop] +item=Premade veg batta, id=2227, option=[Eat, null, null, null, drop] +item=Premade veg batta, id=2228, option=[null, null, null, null, drop] +item=Premade choc bomb, id=2229, option=[Eat, null, null, null, drop] +item=Premade choc bomb, id=2230, option=[null, null, null, null, drop] +item=Premade ttl, id=2231, option=[Eat, null, null, null, drop] +item=Premade ttl, id=2232, option=[null, null, null, null, drop] +item=Premade worm hole, id=2233, option=[Eat, null, null, null, drop] +item=Premade worm hole, id=2234, option=[null, null, null, null, drop] +item=Premade veg ball, id=2235, option=[Eat, null, null, null, drop] +item=Premade veg ball, id=2236, option=[null, null, null, null, drop] +item=Premade w'm crun', id=2237, option=[Eat, null, null, null, drop] +item=Premade w'm crun', id=2238, option=[null, null, null, null, drop] +item=Premade ch' crunch, id=2239, option=[Eat, null, null, null, drop] +item=Premade ch' crunch, id=2240, option=[null, null, null, null, drop] +item=Premade s'y crunch, id=2241, option=[Eat, null, null, null, drop] +item=Premade s'y crunch, id=2242, option=[null, null, null, null, drop] +item=Premade t'd crunch, id=2243, option=[Eat, null, null, null, drop] +item=Premade t'd crunch, id=2244, option=[null, null, null, null, drop] +item=Odd batta, id=2245, option=[Eat, null, null, null, drop] +item=Odd batta, id=2246, option=[null, null, null, null, drop] +item=Burnt batta, id=2247, option=[Empty Tin, null, null, null, drop] +item=Burnt batta, id=2248, option=[null, null, null, null, drop] +item=Half baked batta, id=2249, option=[Prepare, null, null, null, drop] +item=Raw batta, id=2250, option=[null, null, null, null, drop] +item=Unfinished batta, id=2251, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2252, option=[null, null, null, null, drop] +item=Worm batta, id=2253, option=[Eat, null, null, null, drop] +item=Worm batta, id=2254, option=[null, null, null, null, drop] +item=Toad batta, id=2255, option=[Eat, null, null, null, drop] +item=Toad batta, id=2256, option=[null, null, null, null, drop] +item=Unfinished batta, id=2257, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2258, option=[null, null, null, null, drop] +item=Cheese+tom batta, id=2259, option=[Eat, null, null, null, drop] +item=Cheese+tom batta, id=2260, option=[null, null, null, null, drop] +item=Unfinished batta, id=2261, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2262, option=[null, null, null, null, drop] +item=Unfinished batta, id=2263, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2264, option=[null, null, null, null, drop] +item=Unfinished batta, id=2265, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2266, option=[null, null, null, null, drop] +item=Unfinished batta, id=2267, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2268, option=[null, null, null, null, drop] +item=Unfinished batta, id=2269, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2270, option=[null, null, null, null, drop] +item=Unfinished batta, id=2271, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2272, option=[null, null, null, null, drop] +item=Unfinished batta, id=2273, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2274, option=[null, null, null, null, drop] +item=Unfinished batta, id=2275, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2276, option=[null, null, null, null, drop] +item=Fruit batta, id=2277, option=[Eat, null, null, null, drop] +item=Fruit batta, id=2278, option=[null, null, null, null, drop] +item=Unfinished batta, id=2279, option=[Eat, null, null, null, drop] +item=Unfinished batta, id=2280, option=[null, null, null, null, drop] +item=Vegetable batta, id=2281, option=[Eat, null, null, null, drop] +item=Vegetable batta, id=2282, option=[null, null, null, null, drop] +item=Pizza base, id=2283, option=[null, null, null, null, drop] +item=Pizza base, id=2284, option=[null, null, null, null, drop] +item=Incomplete pizza, id=2285, option=[null, null, null, null, drop] +item=Incomplete pizza, id=2286, option=[null, null, null, null, drop] +item=Uncooked pizza, id=2287, option=[null, null, null, null, drop] +item=Uncooked pizza, id=2288, option=[null, null, null, null, drop] +item=Plain pizza, id=2289, option=[Eat, null, null, null, drop] +item=Plain pizza, id=2290, option=[null, null, null, null, drop] +item=1/2 plain pizza, id=2291, option=[Eat, null, null, null, drop] +item=1/2 plain pizza, id=2292, option=[null, null, null, null, drop] +item=Meat pizza, id=2293, option=[Eat, null, null, null, drop] +item=Meat pizza, id=2294, option=[null, null, null, null, drop] +item=1/2 meat pizza, id=2295, option=[Eat, null, null, null, drop] +item=1/2 meat pizza, id=2296, option=[null, null, null, null, drop] +item=Anchovy pizza, id=2297, option=[Eat, null, null, null, drop] +item=Anchovy pizza, id=2298, option=[null, null, null, null, drop] +item=1/2 anchovy pizza, id=2299, option=[Eat, null, null, null, drop] +item=1/2 anchovy pizza, id=2300, option=[null, null, null, null, drop] +item=Pineapple pizza, id=2301, option=[Eat, null, null, null, drop] +item=Pineapple pizza, id=2302, option=[null, null, null, null, drop] +item=1/2 p'apple pizza, id=2303, option=[Eat, null, null, null, drop] +item=1/2 p'apple pizza, id=2304, option=[null, null, null, null, drop] +item=Burnt pizza, id=2305, option=[null, null, null, null, drop] +item=Burnt pizza, id=2306, option=[null, null, null, null, drop] +item=Bread dough, id=2307, option=[null, null, null, null, drop] +item=Bread dough, id=2308, option=[null, null, null, null, drop] +item=Bread, id=2309, option=[Eat, null, null, null, drop] +item=Bread, id=2310, option=[null, null, null, null, drop] +item=Burnt bread, id=2311, option=[null, null, null, null, drop] +item=Burnt bread, id=2312, option=[null, null, null, null, drop] +item=Pie dish, id=2313, option=[null, null, null, null, drop] +item=Pie dish, id=2314, option=[null, null, null, null, drop] +item=Pie shell, id=2315, option=[null, null, null, null, drop] +item=Pie shell, id=2316, option=[null, null, null, null, drop] +item=Uncooked apple pie, id=2317, option=[null, null, null, null, drop] +item=Uncooked apple pie, id=2318, option=[null, null, null, null, drop] +item=Uncooked meat pie, id=2319, option=[null, null, null, null, drop] +item=Uncooked meat pie, id=2320, option=[null, null, null, null, drop] +item=Uncooked berry pie, id=2321, option=[null, null, null, null, drop] +item=Uncooked berry pie, id=2322, option=[null, null, null, null, drop] +item=Apple pie, id=2323, option=[Eat, null, null, null, drop] +item=Apple pie, id=2324, option=[null, null, null, null, drop] +item=Redberry pie, id=2325, option=[Eat, null, null, null, drop] +item=Redberry pie, id=2326, option=[null, null, null, null, drop] +item=Meat pie, id=2327, option=[Eat, null, null, null, drop] +item=Meat pie, id=2328, option=[null, null, null, null, drop] +item=Burnt pie, id=2329, option=[Empty Dish, null, null, null, drop] +item=Burnt pie, id=2330, option=[null, null, null, null, drop] +item=Half a meat pie, id=2331, option=[Eat, null, null, null, drop] +item=Half a meat pie, id=2332, option=[null, null, null, null, drop] +item=Half a redberry pie, id=2333, option=[Eat, null, null, null, drop] +item=Half a redberry pie, id=2334, option=[null, null, null, null, drop] +item=Half an apple pie, id=2335, option=[Eat, null, null, null, drop] +item=Half an apple pie, id=2336, option=[null, null, null, null, drop] +item=Raw oomlie, id=2337, option=[null, null, null, null, drop] +item=Raw oomlie, id=2338, option=[null, null, null, null, drop] +item=Palm leaf, id=2339, option=[null, null, null, null, drop] +item=Palm leaf, id=2340, option=[null, null, null, null, drop] +item=Wrapped oomlie, id=2341, option=[null, null, null, null, drop] +item=Wrapped oomlie, id=2342, option=[null, null, null, null, drop] +item=Cooked oomlie wrap, id=2343, option=[Eat, null, null, null, drop] +item=Cooked oomlie wrap, id=2344, option=[null, null, null, null, drop] +item=Burnt oomlie wrap, id=2345, option=[null, null, null, null, drop] +item=Burnt oomlie wrap, id=2346, option=[null, null, null, null, drop] +item=Hammer, id=2347, option=[null, null, null, null, drop] +item=Hammer, id=2348, option=[null, null, null, null, drop] +item=Bronze bar, id=2349, option=[null, null, null, null, drop] +item=Bronze bar, id=2350, option=[null, null, null, null, drop] +item=Iron bar, id=2351, option=[null, null, null, null, drop] +item=Iron bar, id=2352, option=[null, null, null, null, drop] +item=Steel bar, id=2353, option=[null, null, null, null, drop] +item=Steel bar, id=2354, option=[null, null, null, null, drop] +item=Silver bar, id=2355, option=[null, null, null, null, drop] +item=Silver bar, id=2356, option=[null, null, null, null, drop] +item=Gold bar, id=2357, option=[null, null, null, null, drop] +item=Gold bar, id=2358, option=[null, null, null, null, drop] +item=Mithril bar, id=2359, option=[null, null, null, null, drop] +item=Mithril bar, id=2360, option=[null, null, null, null, drop] +item=Adamantite bar, id=2361, option=[null, null, null, null, drop] +item=Adamantite bar, id=2362, option=[null, null, null, null, drop] +item=Runite bar, id=2363, option=[null, null, null, null, drop] +item=Runite bar, id=2364, option=[null, null, null, null, drop] +item='perfect' gold bar, id=2365, option=[null, null, null, null, drop] +item=Shield left half, id=2366, option=[null, null, null, null, drop] +item=Shield left half, id=2367, option=[null, null, null, null, drop] +item=Shield right half, id=2368, option=[null, null, null, null, drop] +item=Shield right half, id=2369, option=[null, null, null, null, drop] +item=Steel studs, id=2370, option=[null, null, null, null, drop] +item=Steel studs, id=2371, option=[null, null, null, null, drop] +item=Ogre relic, id=2372, option=[null, null, null, null, Destroy] +item=Relic part 1, id=2373, option=[null, null, null, null, Destroy] +item=Relic part 2, id=2374, option=[null, null, null, null, Destroy] +item=Relic part 3, id=2375, option=[null, null, null, null, Destroy] +item=Skavid map, id=2376, option=[Read, null, null, null, Destroy] +item=Ogre tooth, id=2377, option=[null, null, null, null, Destroy] +item=Toban's key, id=2378, option=[null, null, null, null, Destroy] +item=Rock cake, id=2379, option=[null, Eat, null, null, Destroy] +item=Crystal, id=2380, option=[null, null, null, null, Destroy] +item=Crystal, id=2381, option=[null, null, null, null, Destroy] +item=Crystal, id=2382, option=[null, null, null, null, Destroy] +item=Crystal, id=2383, option=[null, null, null, null, Destroy] +item=Fingernails, id=2384, option=[null, null, null, null, Destroy] +item=Old robe, id=2385, option=[null, null, null, null, drop] +item=Unusual armour, id=2386, option=[null, null, null, null, drop] +item=Damaged dagger, id=2387, option=[null, null, null, null, drop] +item=Tattered eye patch, id=2388, option=[null, null, null, null, drop] +item=Vial, id=2389, option=[null, null, null, null, Destroy] +item=Vial, id=2390, option=[null, null, null, null, Destroy] +item=Ground bat bones, id=2391, option=[null, null, null, null, drop] +item=Ground bat bones, id=2392, option=[null, null, null, null, drop] +item=Toban's gold, id=2393, option=[null, null, null, null, Destroy] +item=Potion, id=2394, option=[null, null, null, null, drop] +item=Magic ogre potion, id=2395, option=[null, null, null, null, drop] +item=Spell scroll, id=2396, option=[Read, null, null, null, drop] +item=Shaman robe, id=2397, option=[Search, null, null, null, drop] +item=Cave nightshade, id=2398, option=[null, null, null, Eat, drop] +item=Silverlight key, id=2399, option=[null, null, null, null, Destroy] +item=Silverlight key, id=2400, option=[null, null, null, null, Destroy] +item=Silverlight key, id=2401, option=[null, null, null, null, Destroy] +item=Silverlight, id=2402, option=[null, Wield, null, null, drop] +item=Hazeel scroll, id=2403, option=[null, null, null, null, drop] +item=Chest key, id=2404, option=[null, null, null, null, drop] +item=Carnillean armour, id=2405, option=[null, Wear, null, null, drop] +item=Hazeel's mark, id=2406, option=[null, Wear, null, null, drop] +item=Ball, id=2407, option=[null, null, null, null, drop] +item=Diary, id=2408, option=[Read, null, null, null, drop] +item=Door key, id=2409, option=[null, null, null, null, drop] +item=Magnet, id=2410, option=[null, null, null, null, drop] +item=Key, id=2411, option=[null, null, null, null, drop] +item=Saradomin cape, id=2412, option=[null, Wear, null, null, drop] +item=Guthix cape, id=2413, option=[null, Wear, null, null, drop] +item=Zamorak cape, id=2414, option=[null, Wear, null, null, drop] +item=Saradomin staff, id=2415, option=[null, Wield, null, null, drop] +item=Guthix staff, id=2416, option=[null, Wield, null, null, drop] +item=Zamorak staff, id=2417, option=[null, Wield, null, null, drop] +item=Bronze key, id=2418, option=[null, null, null, null, drop] +item=Wig, id=2419, option=[null, null, null, null, drop] +item=Brass monkey, id=2420, option=[Wear, null, null, null, drop] +item=Wig, id=2421, option=[null, null, null, null, drop] +item=Blue partyhat, id=2422, option=[null, Wear, null, null, drop] +item=Key print, id=2423, option=[null, null, null, null, drop] +item=Paste, id=2424, option=[null, null, null, null, drop] +item=Orbital knife, id=2425, option=[Wear, null, null, null, drop] +item=Burnt oomlie, id=2426, option=[null, null, null, null, drop] +item=Burnt oomlie, id=2427, option=[null, null, null, null, drop] +item=Attack potion(4), id=2428, option=[Drink, null, null, Empty, drop] +item=Attack potion(4), id=2429, option=[null, null, null, null, drop] +item=Restore potion(4), id=2430, option=[Drink, null, null, Empty, drop] +item=Restore potion(4), id=2431, option=[null, null, null, null, drop] +item=Defence potion(4), id=2432, option=[Drink, null, null, Empty, drop] +item=Defence potion(4), id=2433, option=[null, null, null, null, drop] +item=Prayer potion(4), id=2434, option=[Drink, null, null, Empty, drop] +item=Prayer potion(4), id=2435, option=[null, null, null, null, drop] +item=Super attack(4), id=2436, option=[Drink, null, null, Empty, drop] +item=Super attack(4), id=2437, option=[null, null, null, null, drop] +item=Fishing potion(4), id=2438, option=[Drink, null, null, Empty, drop] +item=Fishing potion(4), id=2439, option=[null, null, null, null, drop] +item=Super strength(4), id=2440, option=[Drink, null, null, Empty, drop] +item=Super strength(4), id=2441, option=[null, null, null, null, drop] +item=Super defence(4), id=2442, option=[Drink, null, null, Empty, drop] +item=Super defence(4), id=2443, option=[null, null, null, null, drop] +item=Ranging potion(4), id=2444, option=[Drink, null, null, Empty, drop] +item=Ranging potion(4), id=2445, option=[null, null, null, null, drop] +item=Antipoison(4), id=2446, option=[Drink, null, null, Empty, drop] +item=Antipoison(4), id=2447, option=[null, null, null, null, drop] +item=Super antipoison(4), id=2448, option=[Drink, null, null, Empty, drop] +item=Super antipoison(4), id=2449, option=[null, null, null, null, drop] +item=Zamorak brew(4), id=2450, option=[Drink, null, null, Empty, drop] +item=Zamorak brew(4), id=2451, option=[null, null, null, null, drop] +item=Antifire potion(4), id=2452, option=[Drink, null, null, Empty, drop] +item=Antifire potion(4), id=2453, option=[null, null, null, null, drop] +item=Antifire potion(3), id=2454, option=[Drink, null, null, Empty, drop] +item=Antifire potion(3), id=2455, option=[null, null, null, null, drop] +item=Antifire potion(2), id=2456, option=[Drink, null, null, Empty, drop] +item=Antifire potion(2), id=2457, option=[null, null, null, null, drop] +item=Antifire potion(1), id=2458, option=[Drink, null, null, Empty, drop] +item=Antifire potion(1), id=2459, option=[null, null, null, null, drop] +item=Flowers, id=2460, option=[null, Wield, null, null, drop] +item=Flowers, id=2461, option=[null, null, null, null, drop] +item=Flowers, id=2462, option=[null, Wield, null, null, drop] +item=Flowers, id=2463, option=[null, null, null, null, drop] +item=Flowers, id=2464, option=[null, Wield, null, null, drop] +item=Flowers, id=2465, option=[null, null, null, null, drop] +item=Flowers, id=2466, option=[null, Wield, null, null, drop] +item=Flowers, id=2467, option=[null, null, null, null, drop] +item=Flowers, id=2468, option=[null, Wield, null, null, drop] +item=Flowers, id=2469, option=[null, null, null, null, drop] +item=Flowers, id=2470, option=[null, Wield, null, null, drop] +item=Flowers, id=2471, option=[null, null, null, null, drop] +item=Flowers, id=2472, option=[null, Wield, null, null, drop] +item=Flowers, id=2473, option=[null, null, null, null, drop] +item=Flowers, id=2474, option=[null, Wield, null, null, drop] +item=Flowers, id=2475, option=[null, null, null, null, drop] +item=Flowers, id=2476, option=[null, Wield, null, null, drop] +item=Flowers, id=2477, option=[null, null, null, null, drop] +item=Whoopsie, id=2478, option=[null, null, null, null, drop] +item=Whoopsie, id=2479, option=[null, null, null, null, drop] +item=Firestarter, id=2480, option=[Wear, null, null, null, drop] +item=Clean lantadyme, id=2481, option=[null, null, null, null, drop] +item=Clean lantadyme, id=2482, option=[null, null, null, null, drop] +item=Lantadyme potion(unf), id=2483, option=[null, null, null, Empty, drop] +item=Lantadyme potion(unf), id=2484, option=[null, null, null, null, drop] +item=Grimy lantadyme, id=2485, option=[Clean, null, null, null, drop] +item=Grimy lantadyme, id=2486, option=[null, null, null, null, drop] +item=Blue d'hide vamb, id=2487, option=[null, Wear, null, null, drop] +item=Blue d'hide vamb, id=2488, option=[null, null, null, null, drop] +item=Red d'hide vamb, id=2489, option=[null, Wear, null, null, drop] +item=Red d'hide vamb, id=2490, option=[null, null, null, null, drop] +item=Black d'hide vamb, id=2491, option=[null, Wear, null, null, drop] +item=Black d'hide vamb, id=2492, option=[null, null, null, null, drop] +item=Blue d'hide chaps, id=2493, option=[null, Wear, null, null, drop] +item=Blue d'hide chaps, id=2494, option=[null, null, null, null, drop] +item=Red d'hide chaps, id=2495, option=[null, Wear, null, null, drop] +item=Red d'hide chaps, id=2496, option=[null, null, null, null, drop] +item=Black d'hide chaps, id=2497, option=[null, Wear, null, null, drop] +item=Black d'hide chaps, id=2498, option=[null, null, null, null, drop] +item=Blue d'hide body, id=2499, option=[null, Wear, null, null, drop] +item=Blue d'hide body, id=2500, option=[null, null, null, null, drop] +item=Red d'hide body, id=2501, option=[null, Wear, null, null, drop] +item=Red d'hide body, id=2502, option=[null, null, null, null, drop] +item=Black d'hide body, id=2503, option=[null, Wear, null, null, drop] +item=Black d'hide body, id=2504, option=[null, null, null, null, drop] +item=Blue d-leather, id=2505, option=[null, null, null, null, drop] +item=Blue d-leather, id=2506, option=[null, null, null, null, drop] +item=Red dragon leather, id=2507, option=[null, null, null, null, drop] +item=Red dragon leather, id=2508, option=[null, null, null, null, drop] +item=Black d-leather, id=2509, option=[null, null, null, null, drop] +item=Black d-leather, id=2510, option=[null, null, null, null, drop] +item=Logs, id=2511, option=[null, null, null, null, drop] +item=Box of delights, id=2512, option=[Wear, null, null, null, drop] +item=Dragon chainbody, id=2513, option=[Wear, null, null, null, drop] +item=Raw shrimps, id=2514, option=[null, null, null, null, drop] +item=Raw shrimps, id=2515, option=[null, null, null, null, drop] +item=Pot of flour, id=2516, option=[null, null, null, null, drop] +item=Pot of flour, id=2517, option=[null, null, null, null, drop] +item=Rotten tomato, id=2518, option=[null, null, null, null, drop] +item=Rotten tomato, id=2519, option=[null, null, null, null, drop] +item=Toy horsey, id=2520, option=[Play-with, null, null, null, drop] +item=Toy horsey, id=2521, option=[null, null, null, null, drop] +item=Toy horsey, id=2522, option=[Play-with, null, null, null, drop] +item=Toy horsey, id=2523, option=[null, null, null, null, drop] +item=Toy horsey, id=2524, option=[Play-with, null, null, null, drop] +item=Toy horsey, id=2525, option=[null, null, null, null, drop] +item=Toy horsey, id=2526, option=[Play-with, null, null, null, drop] +item=Toy horsey, id=2527, option=[null, null, null, null, drop] +item=Lamp, id=2528, option=[Rub, null, null, null, drop] +item=Orb of light, id=2529, option=[null, null, null, null, drop] +item=Bones, id=2530, option=[Bury, null, null, null, drop] +item=Bones, id=2531, option=[null, null, null, null, drop] +item=Iron fire arrows, id=2532, option=[null, Wield, null, null, drop] +item=Iron fire arrows, id=2533, option=[null, Wield, null, null, drop] +item=Steel fire arrows, id=2534, option=[null, Wield, null, null, drop] +item=Steel fire arrows, id=2535, option=[null, Wield, null, null, drop] +item=Mithril fire arrows, id=2536, option=[null, Wield, null, null, drop] +item=Mithril fire arrows, id=2537, option=[null, Wield, null, null, drop] +item=Addy fire arrows, id=2538, option=[null, Wield, null, null, drop] +item=Addy fire arrows, id=2539, option=[null, Wield, null, null, drop] +item=Rune fire arrows, id=2540, option=[null, Wield, null, null, drop] +item=Rune fire arrows, id=2541, option=[null, Wield, null, null, drop] +item=null, id=2542, option=[null, null, null, null, drop] +item=null, id=2543, option=[null, null, null, null, drop] +item=null, id=2544, option=[null, null, null, null, drop] +item=null, id=2545, option=[null, null, null, null, drop] +item=null, id=2546, option=[null, null, null, null, drop] +item=null, id=2547, option=[null, null, null, null, drop] +item=null, id=2548, option=[null, null, null, null, drop] +item=null, id=2549, option=[null, null, null, null, drop] +item=Ring of recoil, id=2550, option=[null, Wear, null, null, drop] +item=Ring of recoil, id=2551, option=[null, null, null, null, drop] +item=Ring of duelling(8), id=2552, option=[null, Wear, null, Rub, drop] +item=Ring of duelling(8), id=2553, option=[null, null, null, null, drop] +item=Ring of duelling(7), id=2554, option=[null, Wear, null, Rub, drop] +item=Ring of duelling(7), id=2555, option=[null, null, null, null, drop] +item=Ring of duelling(6), id=2556, option=[null, Wear, null, Rub, drop] +item=Ring of duelling(6), id=2557, option=[null, null, null, null, drop] +item=Ring of duelling(5), id=2558, option=[null, Wear, null, Rub, drop] +item=Ring of duelling(5), id=2559, option=[null, null, null, null, drop] +item=Ring of duelling(4), id=2560, option=[null, Wear, null, Rub, drop] +item=Ring of duelling(4), id=2561, option=[null, null, null, null, drop] +item=Ring of duelling(3), id=2562, option=[null, Wear, null, Rub, drop] +item=Ring of duelling(3), id=2563, option=[null, null, null, null, drop] +item=Ring of duelling(2), id=2564, option=[null, Wear, null, Rub, drop] +item=Ring of duelling(2), id=2565, option=[null, null, null, null, drop] +item=Ring of duelling(1), id=2566, option=[null, Wear, null, Rub, drop] +item=Ring of duelling(1), id=2567, option=[null, null, null, null, drop] +item=Ring of forging, id=2568, option=[null, Wear, null, null, drop] +item=Ring of forging, id=2569, option=[null, null, null, null, drop] +item=Ring of life, id=2570, option=[null, Wear, null, null, drop] +item=Ring of life, id=2571, option=[null, null, null, null, drop] +item=Ring of wealth, id=2572, option=[null, Wear, null, null, drop] +item=Ring of wealth, id=2573, option=[null, null, null, null, drop] +item=Sextant, id=2574, option=[Look through, null, null, null, drop] +item=Watch, id=2575, option=[null, null, null, null, drop] +item=Chart, id=2576, option=[null, null, null, null, drop] +item=Ranger boots, id=2577, option=[null, Wear, null, null, drop] +item=Ranger boots, id=2578, option=[null, null, null, null, drop] +item=Wizard boots, id=2579, option=[null, Wear, null, null, drop] +item=Wizard boots, id=2580, option=[null, null, null, null, drop] +item=Robin hood hat, id=2581, option=[null, Wear, null, null, drop] +item=Robin hood hat, id=2582, option=[null, null, null, null, drop] +item=Black platebody (t), id=2583, option=[null, Wear, null, null, drop] +item=Black platebody (t), id=2584, option=[null, null, null, null, drop] +item=Black platelegs (t), id=2585, option=[null, Wear, null, null, drop] +item=Black platelegs (t), id=2586, option=[null, null, null, null, drop] +item=Black full helm(t), id=2587, option=[null, Wear, null, null, drop] +item=Black full helm(t), id=2588, option=[null, null, null, null, drop] +item=Black kiteshield (t), id=2589, option=[null, Wear, null, null, drop] +item=Black kiteshield (t), id=2590, option=[null, null, null, null, drop] +item=Black platebody (g), id=2591, option=[null, Wear, null, null, drop] +item=Black platebody (g), id=2592, option=[null, null, null, null, drop] +item=Black platelegs (g), id=2593, option=[null, Wear, null, null, drop] +item=Black platelegs (g), id=2594, option=[null, null, null, null, drop] +item=Black full helm(g), id=2595, option=[null, Wear, null, null, drop] +item=Black full helm(g), id=2596, option=[null, null, null, null, drop] +item=Black kiteshield (g), id=2597, option=[null, Wear, null, null, drop] +item=Black kiteshield (g), id=2598, option=[null, null, null, null, drop] +item=Adam platebody (t), id=2599, option=[null, Wear, null, null, drop] +item=Adam platebody (t), id=2600, option=[null, null, null, null, drop] +item=Adam platelegs (t), id=2601, option=[null, Wear, null, null, drop] +item=Adam platelegs (t), id=2602, option=[null, null, null, null, drop] +item=Adam kiteshield (t), id=2603, option=[null, Wear, null, null, drop] +item=Adam kiteshield (t), id=2604, option=[null, null, null, null, drop] +item=Adam full helm(t), id=2605, option=[null, Wear, null, null, drop] +item=Adam full helm(t), id=2606, option=[null, null, null, null, drop] +item=Adam platebody (g), id=2607, option=[null, Wear, null, null, drop] +item=Adam platebody (g), id=2608, option=[null, null, null, null, drop] +item=Adam platelegs (g), id=2609, option=[null, Wear, null, null, drop] +item=Adam platelegs (g), id=2610, option=[null, null, null, null, drop] +item=Adam kiteshield (g), id=2611, option=[null, Wear, null, null, drop] +item=Adam kiteshield (g), id=2612, option=[null, null, null, null, drop] +item=Adam full helm(g), id=2613, option=[null, Wear, null, null, drop] +item=Adam full helm(g), id=2614, option=[null, null, null, null, drop] +item=Rune platebody (g), id=2615, option=[null, Wear, null, null, drop] +item=Rune platebody (g), id=2616, option=[null, null, null, null, drop] +item=Rune platelegs (g), id=2617, option=[null, Wear, null, null, drop] +item=Rune platelegs (g), id=2618, option=[null, null, null, null, drop] +item=Rune full helm(g), id=2619, option=[null, Wear, null, null, drop] +item=Rune full helm(g), id=2620, option=[null, null, null, null, drop] +item=Rune kiteshield (g), id=2621, option=[null, Wear, null, null, drop] +item=Rune kiteshield (g), id=2622, option=[null, null, null, null, drop] +item=Rune platebody (t), id=2623, option=[null, Wear, null, null, drop] +item=Rune platebody (t), id=2624, option=[null, null, null, null, drop] +item=Rune platelegs (t), id=2625, option=[null, Wear, null, null, drop] +item=Rune platelegs (t), id=2626, option=[null, null, null, null, drop] +item=Rune full helm (t), id=2627, option=[null, Wear, null, null, drop] +item=Rune full helm (t), id=2628, option=[null, null, null, null, drop] +item=Rune kiteshield (t), id=2629, option=[null, Wear, null, null, drop] +item=Rune kiteshield (t), id=2630, option=[null, null, null, null, drop] +item=Highwayman mask, id=2631, option=[null, Wear, null, null, drop] +item=Highwayman mask, id=2632, option=[null, null, null, null, drop] +item=Blue beret, id=2633, option=[null, Wear, null, null, drop] +item=Blue beret, id=2634, option=[null, null, null, null, drop] +item=Black beret, id=2635, option=[null, Wear, null, null, drop] +item=Black beret, id=2636, option=[null, null, null, null, drop] +item=White beret, id=2637, option=[null, Wear, null, null, drop] +item=White beret, id=2638, option=[null, null, null, null, drop] +item=Tan cavalier, id=2639, option=[null, Wear, null, null, drop] +item=Tan cavalier, id=2640, option=[null, null, null, null, drop] +item=Dark cavalier, id=2641, option=[null, Wear, null, null, drop] +item=Dark cavalier, id=2642, option=[null, null, null, null, drop] +item=Black cavalier, id=2643, option=[null, Wear, null, null, drop] +item=Black cavalier, id=2644, option=[null, null, null, null, drop] +item=Red headband, id=2645, option=[null, Wear, null, null, drop] +item=Red headband, id=2646, option=[null, null, null, null, drop] +item=Black headband, id=2647, option=[null, Wear, null, null, drop] +item=Black headband, id=2648, option=[null, null, null, null, drop] +item=Brown headband, id=2649, option=[null, Wear, null, null, drop] +item=Brown headband, id=2650, option=[null, null, null, null, drop] +item=Pirate's hat, id=2651, option=[null, Wear, null, null, drop] +item=Pirate's hat, id=2652, option=[null, null, null, null, drop] +item=Zamorak platebody, id=2653, option=[null, Wear, null, null, drop] +item=Zamorak platebody, id=2654, option=[null, null, null, null, drop] +item=Zamorak platelegs, id=2655, option=[null, Wear, null, null, drop] +item=Zamorak platelegs, id=2656, option=[null, null, null, null, drop] +item=Zamorak full helm, id=2657, option=[null, Wear, null, null, drop] +item=Zamorak full helm, id=2658, option=[null, null, null, null, drop] +item=Zamorak kiteshield, id=2659, option=[null, Wear, null, null, drop] +item=Zamorak kiteshield, id=2660, option=[null, null, null, null, drop] +item=Saradomin plate, id=2661, option=[null, Wear, null, null, drop] +item=Saradomin plate, id=2662, option=[null, null, null, null, drop] +item=Saradomin legs, id=2663, option=[null, Wear, null, null, drop] +item=Saradomin legs, id=2664, option=[null, null, null, null, drop] +item=Saradomin full helm, id=2665, option=[null, Wear, null, null, drop] +item=Saradomin full helm, id=2666, option=[null, null, null, null, drop] +item=Saradomin kite, id=2667, option=[null, Wear, null, null, drop] +item=Saradomin kite, id=2668, option=[null, null, null, null, drop] +item=Guthix platebody, id=2669, option=[null, Wear, null, null, drop] +item=Guthix platebody, id=2670, option=[null, null, null, null, drop] +item=Guthix platelegs, id=2671, option=[null, Wear, null, null, drop] +item=Guthix platelegs, id=2672, option=[null, null, null, null, drop] +item=Guthix full helm, id=2673, option=[null, Wear, null, null, drop] +item=Guthix full helm, id=2674, option=[null, null, null, null, drop] +item=Guthix kiteshield, id=2675, option=[null, Wear, null, null, drop] +item=Guthix kiteshield, id=2676, option=[null, null, null, null, drop] +item=Clue scroll, id=2677, option=[Read, null, null, null, drop] +item=Clue scroll, id=2678, option=[Read, null, null, null, drop] +item=Clue scroll, id=2679, option=[Read, null, null, null, drop] +item=Clue scroll, id=2680, option=[Read, null, null, null, drop] +item=Clue scroll, id=2681, option=[Read, null, null, null, drop] +item=Clue scroll, id=2682, option=[Read, null, null, null, drop] +item=Clue scroll, id=2683, option=[Read, null, null, null, drop] +item=Clue scroll, id=2684, option=[Read, null, null, null, drop] +item=Clue scroll, id=2685, option=[Read, null, null, null, drop] +item=Clue scroll, id=2686, option=[Read, null, null, null, drop] +item=Clue scroll, id=2687, option=[Read, null, null, null, drop] +item=Clue scroll, id=2688, option=[Read, null, null, null, drop] +item=Clue scroll, id=2689, option=[Read, null, null, null, drop] +item=Clue scroll, id=2690, option=[Read, null, null, null, drop] +item=Clue scroll, id=2691, option=[Read, null, null, null, drop] +item=Clue scroll, id=2692, option=[Read, null, null, null, drop] +item=Clue scroll, id=2693, option=[Read, null, null, null, drop] +item=Clue scroll, id=2694, option=[Read, null, null, null, drop] +item=Clue scroll, id=2695, option=[Read, null, null, null, drop] +item=Clue scroll, id=2696, option=[Read, null, null, null, drop] +item=Clue scroll, id=2697, option=[Read, null, null, null, drop] +item=Clue scroll, id=2698, option=[Read, null, null, null, drop] +item=Clue scroll, id=2699, option=[Read, null, null, null, drop] +item=Clue scroll, id=2700, option=[Read, null, null, null, drop] +item=Clue scroll, id=2701, option=[Read, null, null, null, drop] +item=Clue scroll, id=2702, option=[Read, null, null, null, drop] +item=Clue scroll, id=2703, option=[Read, null, null, null, drop] +item=Clue scroll, id=2704, option=[Read, null, null, null, drop] +item=Clue scroll, id=2705, option=[Read, null, null, null, drop] +item=Clue scroll, id=2706, option=[Read, null, null, null, drop] +item=Clue scroll, id=2707, option=[Read, null, null, null, drop] +item=Clue scroll, id=2708, option=[Read, null, null, null, drop] +item=Clue scroll, id=2709, option=[Read, null, null, null, drop] +item=Clue scroll, id=2710, option=[Read, null, null, null, drop] +item=Clue scroll, id=2711, option=[Read, null, null, null, drop] +item=Clue scroll, id=2712, option=[Read, null, null, null, drop] +item=Clue scroll, id=2713, option=[Read, null, null, null, drop] +item=Casket, id=2714, option=[Open, null, null, null, drop] +item=Casket, id=2715, option=[Open, null, null, null, drop] +item=Clue scroll, id=2716, option=[Read, null, null, null, drop] +item=Casket, id=2717, option=[Open, null, null, null, drop] +item=Casket, id=2718, option=[Open, null, null, null, drop] +item=Clue scroll, id=2719, option=[Read, null, null, null, drop] +item=Casket, id=2720, option=[Open, null, null, null, drop] +item=Casket, id=2721, option=[Open, null, null, null, drop] +item=Clue scroll, id=2722, option=[Read, null, null, null, drop] +item=Clue scroll, id=2723, option=[Read, null, null, null, drop] +item=Casket, id=2724, option=[Open, null, null, null, drop] +item=Clue scroll, id=2725, option=[Read, null, null, null, drop] +item=Casket, id=2726, option=[Open, null, null, null, drop] +item=Clue scroll, id=2727, option=[Read, null, null, null, drop] +item=Casket, id=2728, option=[Open, null, null, null, drop] +item=Clue scroll, id=2729, option=[Read, null, null, null, drop] +item=Casket, id=2730, option=[Open, null, null, null, drop] +item=Clue scroll, id=2731, option=[Read, null, null, null, drop] +item=Casket, id=2732, option=[Open, null, null, null, drop] +item=Clue scroll, id=2733, option=[Read, null, null, null, drop] +item=Casket, id=2734, option=[Open, null, null, null, drop] +item=Clue scroll, id=2735, option=[Read, null, null, null, drop] +item=Casket, id=2736, option=[Open, null, null, null, drop] +item=Clue scroll, id=2737, option=[Read, null, null, null, drop] +item=Casket, id=2738, option=[Open, null, null, null, drop] +item=Clue scroll, id=2739, option=[Read, null, null, null, drop] +item=Casket, id=2740, option=[Open, null, null, null, drop] +item=Clue scroll, id=2741, option=[Read, null, null, null, drop] +item=Casket, id=2742, option=[Open, null, null, null, drop] +item=Clue scroll, id=2743, option=[Read, null, null, null, drop] +item=Casket, id=2744, option=[Open, null, null, null, drop] +item=Clue scroll, id=2745, option=[Read, null, null, null, drop] +item=Casket, id=2746, option=[Open, null, null, null, drop] +item=Clue scroll, id=2747, option=[Read, null, null, null, drop] +item=Casket, id=2748, option=[Open, null, null, null, drop] +item=Sliding piece, id=2749, option=[null, null, null, null, Move] +item=Sliding piece, id=2750, option=[null, null, null, null, Move] +item=Sliding piece, id=2751, option=[null, null, null, null, Move] +item=Sliding piece, id=2752, option=[null, null, null, null, Move] +item=Sliding piece, id=2753, option=[null, null, null, null, Move] +item=Sliding piece, id=2754, option=[null, null, null, null, Move] +item=Sliding piece, id=2755, option=[null, null, null, null, Move] +item=Sliding piece, id=2756, option=[null, null, null, null, Move] +item=Sliding piece, id=2757, option=[null, null, null, null, Move] +item=Sliding piece, id=2758, option=[null, null, null, null, Move] +item=Sliding piece, id=2759, option=[null, null, null, null, Move] +item=Sliding piece, id=2760, option=[null, null, null, null, Move] +item=Sliding piece, id=2761, option=[null, null, null, null, Move] +item=Sliding piece, id=2762, option=[null, null, null, null, Move] +item=Sliding piece, id=2763, option=[null, null, null, null, Move] +item=Sliding piece, id=2764, option=[null, null, null, null, Move] +item=Sliding piece, id=2765, option=[null, null, null, null, Move] +item=Sliding piece, id=2766, option=[null, null, null, null, Move] +item=Sliding piece, id=2767, option=[null, null, null, null, Move] +item=Sliding piece, id=2768, option=[null, null, null, null, Move] +item=Sliding piece, id=2769, option=[null, null, null, null, Move] +item=Sliding piece, id=2770, option=[null, null, null, null, Move] +item=Sliding piece, id=2771, option=[null, null, null, null, Move] +item=Sliding piece, id=2772, option=[null, null, null, null, Move] +item=Clue scroll, id=2773, option=[Read, null, null, null, drop] +item=Clue scroll, id=2774, option=[Read, null, null, null, drop] +item=Casket, id=2775, option=[Open, null, null, null, drop] +item=Clue scroll, id=2776, option=[Read, null, null, null, drop] +item=Casket, id=2777, option=[Open, null, null, null, drop] +item=Clue scroll, id=2778, option=[Read, null, null, null, drop] +item=Casket, id=2779, option=[Open, null, null, null, drop] +item=Clue scroll, id=2780, option=[Read, null, null, null, drop] +item=Casket, id=2781, option=[Open, null, null, null, drop] +item=Clue scroll, id=2782, option=[Read, null, null, null, drop] +item=Clue scroll, id=2783, option=[Read, null, null, null, drop] +item=Casket, id=2784, option=[Open, null, null, null, drop] +item=Clue scroll, id=2785, option=[Read, null, null, null, drop] +item=Clue scroll, id=2786, option=[Read, null, null, null, drop] +item=Casket, id=2787, option=[Open, null, null, null, drop] +item=Clue scroll, id=2788, option=[Read, null, null, null, drop] +item=Casket, id=2789, option=[Open, null, null, null, drop] +item=Clue scroll, id=2790, option=[Read, null, null, null, drop] +item=Casket, id=2791, option=[Open, null, null, null, drop] +item=Clue scroll, id=2792, option=[Read, null, null, null, drop] +item=Clue scroll, id=2793, option=[Read, null, null, null, drop] +item=Clue scroll, id=2794, option=[Read, null, null, null, drop] +item=Puzzle box, id=2795, option=[Open, null, null, null, drop] +item=Clue scroll, id=2796, option=[Read, null, null, null, drop] +item=Clue scroll, id=2797, option=[Read, null, null, null, drop] +item=Puzzle box, id=2798, option=[Open, null, null, null, drop] +item=Clue scroll, id=2799, option=[Read, null, null, null, drop] +item=Puzzle box, id=2800, option=[Open, null, null, null, drop] +item=Clue scroll, id=2801, option=[Read, null, null, null, drop] +item=Casket, id=2802, option=[Open, null, null, null, drop] +item=Clue scroll, id=2803, option=[Read, null, null, null, drop] +item=Casket, id=2804, option=[Open, null, null, null, drop] +item=Clue scroll, id=2805, option=[Read, null, null, null, drop] +item=Casket, id=2806, option=[Open, null, null, null, drop] +item=Clue scroll, id=2807, option=[Read, null, null, null, drop] +item=Casket, id=2808, option=[Open, null, null, null, drop] +item=Clue scroll, id=2809, option=[Read, null, null, null, drop] +item=Casket, id=2810, option=[Open, null, null, null, drop] +item=Clue scroll, id=2811, option=[Read, null, null, null, drop] +item=Casket, id=2812, option=[Open, null, null, null, drop] +item=Clue scroll, id=2813, option=[Read, null, null, null, drop] +item=Casket, id=2814, option=[Open, null, null, null, drop] +item=Clue scroll, id=2815, option=[Read, null, null, null, drop] +item=Casket, id=2816, option=[Open, null, null, null, drop] +item=Clue scroll, id=2817, option=[Read, null, null, null, drop] +item=Casket, id=2818, option=[Open, null, null, null, drop] +item=Clue scroll, id=2819, option=[Read, null, null, null, drop] +item=Casket, id=2820, option=[Open, null, null, null, drop] +item=Clue scroll, id=2821, option=[Read, null, null, null, drop] +item=Casket, id=2822, option=[Open, null, null, null, drop] +item=Clue scroll, id=2823, option=[Read, null, null, null, drop] +item=Casket, id=2824, option=[Open, null, null, null, drop] +item=Clue scroll, id=2825, option=[Read, null, null, null, drop] +item=Casket, id=2826, option=[Open, null, null, null, drop] +item=Clue scroll, id=2827, option=[Read, null, null, null, drop] +item=Casket, id=2828, option=[Open, null, null, null, drop] +item=Clue scroll, id=2829, option=[Read, null, null, null, drop] +item=Casket, id=2830, option=[Open, null, null, null, drop] +item=Clue scroll, id=2831, option=[Read, null, null, null, drop] +item=Key, id=2832, option=[null, null, null, null, drop] +item=Clue scroll, id=2833, option=[Read, null, null, null, drop] +item=Key, id=2834, option=[null, null, null, null, drop] +item=Clue scroll, id=2835, option=[Read, null, null, null, drop] +item=Key, id=2836, option=[null, null, null, null, drop] +item=Clue scroll, id=2837, option=[Read, null, null, null, drop] +item=Key, id=2838, option=[null, null, null, null, drop] +item=Clue scroll, id=2839, option=[Read, null, null, null, drop] +item=Key, id=2840, option=[null, null, null, null, drop] +item=Clue scroll, id=2841, option=[Read, null, null, null, drop] +item=Challenge scroll, id=2842, option=[Read, null, null, null, drop] +item=Clue scroll, id=2843, option=[Read, null, null, null, drop] +item=Challenge scroll, id=2844, option=[Read, null, null, null, drop] +item=Clue scroll, id=2845, option=[Read, null, null, null, drop] +item=Challenge scroll, id=2846, option=[Read, null, null, null, drop] +item=Clue scroll, id=2847, option=[Read, null, null, null, drop] +item=Clue scroll, id=2848, option=[Read, null, null, null, drop] +item=Clue scroll, id=2849, option=[Read, null, null, null, drop] +item=Challenge scroll, id=2850, option=[Read, null, null, null, drop] +item=Clue scroll, id=2851, option=[Read, null, null, null, drop] +item=Challenge scroll, id=2852, option=[Read, null, null, null, drop] +item=Clue scroll, id=2853, option=[Read, null, null, null, drop] +item=Challenge scroll, id=2854, option=[Read, null, null, null, drop] +item=Clue scroll, id=2855, option=[Read, null, null, null, drop] +item=Clue scroll, id=2856, option=[Read, null, null, null, drop] +item=Clue scroll, id=2857, option=[Read, null, null, null, drop] +item=Clue scroll, id=2858, option=[Read, null, null, null, drop] +item=Wolf bones, id=2859, option=[Bury, null, null, null, drop] +item=Wolf bones, id=2860, option=[null, null, null, null, drop] +item=Wolfbone arrowtips, id=2861, option=[null, null, null, null, drop] +item=Achey tree logs, id=2862, option=[null, null, null, null, drop] +item=Achey tree logs, id=2863, option=[null, null, null, null, drop] +item=Ogre arrow shaft, id=2864, option=[null, null, null, null, drop] +item=Flighted ogre arrow, id=2865, option=[null, null, null, null, drop] +item=Ogre arrow, id=2866, option=[null, Wield, null, null, drop] +item=null, id=2867, option=[null, null, null, null, drop] +item=null, id=2868, option=[null, null, null, null, drop] +item=null, id=2869, option=[null, null, null, null, drop] +item=null, id=2870, option=[null, null, null, null, drop] +item=Ogre bellows, id=2871, option=[null, null, null, null, drop] +item=Ogre bellows (3), id=2872, option=[null, null, null, null, drop] +item=Ogre bellows (2), id=2873, option=[null, null, null, null, drop] +item=Ogre bellows (1), id=2874, option=[null, null, null, null, drop] +item=Bloated toad, id=2875, option=[Drop, null, null, Release All, Release] +item=Raw chompy, id=2876, option=[null, null, null, null, drop] +item=Raw chompy, id=2877, option=[null, null, null, null, drop] +item=Cooked chompy, id=2878, option=[Eat, null, null, null, drop] +item=Cooked chompy, id=2879, option=[null, null, null, null, drop] +item=Ruined chompy, id=2880, option=[null, null, null, null, drop] +item=Ruined chompy, id=2881, option=[null, null, null, null, drop] +item=Seasoned chompy, id=2882, option=[null, null, null, null, drop] +item=Ogre bow, id=2883, option=[null, Wield, Check kills, null, drop] +item=null, id=2884, option=[null, null, null, null, drop] +item=Whoopsie, id=2885, option=[Wear, null, null, null, drop] +item=Battered book, id=2886, option=[Read, null, null, null, drop] +item=Battered key, id=2887, option=[null, null, null, null, drop] +item=A stone bowl, id=2888, option=[null, null, null, null, drop] +item=A stone bowl, id=2889, option=[null, null, null, null, drop] +item=Elemental shield, id=2890, option=[null, Wield, null, null, drop] +item=Elemental shield, id=2891, option=[null, null, null, null, drop] +item=Elemental ore, id=2892, option=[null, null, null, null, drop] +item=Elemental metal, id=2893, option=[null, null, null, null, drop] +item=Boots, id=2894, option=[null, Wear, null, null, drop] +item=Boots, id=2895, option=[null, null, null, null, drop] +item=Robe top, id=2896, option=[null, Wear, null, null, drop] +item=Robe top, id=2897, option=[null, null, null, null, drop] +item=Robe bottoms, id=2898, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=2899, option=[null, null, null, null, drop] +item=Hat, id=2900, option=[null, Wear, null, null, drop] +item=Hat, id=2901, option=[null, null, null, null, drop] +item=Gloves, id=2902, option=[null, Wear, null, null, drop] +item=Gloves, id=2903, option=[null, null, null, null, drop] +item=Boots, id=2904, option=[null, Wear, null, null, drop] +item=Boots, id=2905, option=[null, null, null, null, drop] +item=Robe top, id=2906, option=[null, Wear, null, null, drop] +item=Robe top, id=2907, option=[null, null, null, null, drop] +item=Robe bottoms, id=2908, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=2909, option=[null, null, null, null, drop] +item=Hat, id=2910, option=[null, Wear, null, null, drop] +item=Hat, id=2911, option=[null, null, null, null, drop] +item=Gloves, id=2912, option=[null, Wear, null, null, drop] +item=Gloves, id=2913, option=[null, null, null, null, drop] +item=Boots, id=2914, option=[null, Wear, null, null, drop] +item=Boots, id=2915, option=[null, null, null, null, drop] +item=Robe top, id=2916, option=[null, Wear, null, null, drop] +item=Robe top, id=2917, option=[null, null, null, null, drop] +item=Robe bottoms, id=2918, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=2919, option=[null, null, null, null, drop] +item=Hat, id=2920, option=[null, Wear, null, null, drop] +item=Hat, id=2921, option=[null, null, null, null, drop] +item=Gloves, id=2922, option=[null, Wear, null, null, drop] +item=Gloves, id=2923, option=[null, null, null, null, drop] +item=Boots, id=2924, option=[null, Wear, null, null, drop] +item=Boots, id=2925, option=[null, null, null, null, drop] +item=Robe top, id=2926, option=[null, Wear, null, null, drop] +item=Robe top, id=2927, option=[null, null, null, null, drop] +item=Robe bottoms, id=2928, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=2929, option=[null, null, null, null, drop] +item=Hat, id=2930, option=[null, Wear, null, null, drop] +item=Hat, id=2931, option=[null, null, null, null, drop] +item=Gloves, id=2932, option=[null, Wear, null, null, drop] +item=Gloves, id=2933, option=[null, null, null, null, drop] +item=Boots, id=2934, option=[null, Wear, null, null, drop] +item=Boots, id=2935, option=[null, null, null, null, drop] +item=Robe top, id=2936, option=[null, Wear, null, null, drop] +item=Robe top, id=2937, option=[null, null, null, null, drop] +item=Robe bottoms, id=2938, option=[null, Wear, null, null, drop] +item=Robe bottoms, id=2939, option=[null, null, null, null, drop] +item=Hat, id=2940, option=[null, Wear, null, null, drop] +item=Hat, id=2941, option=[null, null, null, null, drop] +item=Gloves, id=2942, option=[null, Wear, null, null, drop] +item=Gloves, id=2943, option=[null, null, null, null, drop] +item=Golden key, id=2944, option=[null, null, null, null, drop] +item=Iron key, id=2945, option=[null, null, null, null, drop] +item=Golden tinderbox, id=2946, option=[null, null, null, null, drop] +item=Golden candle, id=2947, option=[null, null, null, null, drop] +item=Golden pot, id=2948, option=[null, null, null, null, drop] +item=Golden hammer, id=2949, option=[null, null, null, null, drop] +item=Golden feather, id=2950, option=[null, null, null, null, drop] +item=Golden needle, id=2951, option=[null, null, null, null, drop] +item=Wolfbane, id=2952, option=[null, Wield, null, null, drop] +item=Bucket of water, id=2953, option=[null, null, null, null, drop] +item=Bucket of water, id=2954, option=[null, null, null, null, drop] +item=Moonlight mead, id=2955, option=[Drink, null, null, null, drop] +item=Moonlight mead, id=2956, option=[null, null, null, null, drop] +item=Druid pouch, id=2957, option=[Fill, null, null, null, drop] +item=Druid pouch, id=2958, option=[Fill, null, null, null, drop] +item=Rotten food, id=2959, option=[null, null, null, null, drop] +item=Rotten food, id=2960, option=[null, null, null, null, drop] +item=Silver sickle, id=2961, option=[null, Wield, null, null, drop] +item=Silver sickle, id=2962, option=[null, null, null, null, drop] +item=Silver sickle(b), id=2963, option=[null, Wield, Cast Bloom, null, drop] +item=Washing bowl, id=2964, option=[null, null, null, null, drop] +item=Whoopsie, id=2965, option=[null, null, null, null, drop] +item=Mirror, id=2966, option=[null, null, null, null, drop] +item=Journal, id=2967, option=[Read, null, null, null, drop] +item=Druidic spell, id=2968, option=[Cast, null, null, null, drop] +item=A used spell, id=2969, option=[null, null, null, null, drop] +item=Mort myre fungus, id=2970, option=[null, null, null, null, drop] +item=Mort myre fungus, id=2971, option=[null, null, null, null, drop] +item=Mort myre stem, id=2972, option=[null, null, null, null, drop] +item=Mort myre stem, id=2973, option=[null, null, null, null, drop] +item=Mort myre pear, id=2974, option=[null, null, null, null, drop] +item=Mort myre pear, id=2975, option=[null, null, null, null, drop] +item=Sickle mould, id=2976, option=[null, null, null, null, drop] +item=Sickle mould, id=2977, option=[null, null, null, null, drop] +item=Chompy bird hat, id=2978, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2979, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2980, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2981, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2982, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2983, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2984, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2985, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2986, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2987, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2988, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2989, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2990, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2991, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2992, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2993, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2994, option=[null, Wear, null, null, drop] +item=Chompy bird hat, id=2995, option=[null, Wear, null, null, drop] +item=Agility arena ticket, id=2996, option=[null, null, null, null, drop] +item=Pirate's hook, id=2997, option=[null, Wear, null, null, drop] +item=Clean toadflax, id=2998, option=[null, null, null, null, drop] +item=Clean toadflax, id=2999, option=[null, null, null, null, drop] +item=Clean snapdragon, id=3000, option=[null, null, null, null, drop] +item=Clean snapdragon, id=3001, option=[null, null, null, null, drop] +item=Toadflax potion(unf), id=3002, option=[null, null, null, Empty, drop] +item=Toadflax potion(unf), id=3003, option=[null, null, null, null, drop] +item=Snapdragon potion(unf), id=3004, option=[null, null, null, Empty, drop] +item=Snapdragon potion(unf), id=3005, option=[null, null, null, null, drop] +item=Firework, id=3006, option=[null, null, null, Empty, drop] +item=Firework, id=3007, option=[null, null, null, null, drop] +item=Energy potion(4), id=3008, option=[Drink, null, null, Empty, drop] +item=Energy potion(4), id=3009, option=[null, null, null, null, drop] +item=Energy potion(3), id=3010, option=[Drink, null, null, Empty, drop] +item=Energy potion(3), id=3011, option=[null, null, null, null, drop] +item=Energy potion(2), id=3012, option=[Drink, null, null, Empty, drop] +item=Energy potion(2), id=3013, option=[null, null, null, null, drop] +item=Energy potion(1), id=3014, option=[Drink, null, null, Empty, drop] +item=Energy potion(1), id=3015, option=[null, null, null, null, drop] +item=Super energy(4), id=3016, option=[Drink, null, null, Empty, drop] +item=Super energy(4), id=3017, option=[null, null, null, null, drop] +item=Super energy(3), id=3018, option=[Drink, null, null, Empty, drop] +item=Super energy(3), id=3019, option=[null, null, null, null, drop] +item=Super energy(2), id=3020, option=[Drink, null, null, Empty, drop] +item=Super energy(2), id=3021, option=[null, null, null, null, drop] +item=Super energy(1), id=3022, option=[Drink, null, null, Empty, drop] +item=Super energy(1), id=3023, option=[null, null, null, null, drop] +item=Super restore(4), id=3024, option=[Drink, null, null, Empty, drop] +item=Super restore(4), id=3025, option=[null, null, null, null, drop] +item=Super restore(3), id=3026, option=[Drink, null, null, Empty, drop] +item=Super restore(3), id=3027, option=[null, null, null, null, drop] +item=Super restore(2), id=3028, option=[Drink, null, null, Empty, drop] +item=Super restore(2), id=3029, option=[null, null, null, null, drop] +item=Super restore(1), id=3030, option=[Drink, null, null, Empty, drop] +item=Super restore(1), id=3031, option=[null, null, null, null, drop] +item=Agility potion(4), id=3032, option=[Drink, null, null, Empty, drop] +item=Agility potion(4), id=3033, option=[null, null, null, null, drop] +item=Agility potion(3), id=3034, option=[Drink, null, null, Empty, drop] +item=Agility potion(3), id=3035, option=[null, null, null, null, drop] +item=Agility potion(2), id=3036, option=[Drink, null, null, Empty, drop] +item=Agility potion(2), id=3037, option=[null, null, null, null, drop] +item=Agility potion(1), id=3038, option=[Drink, null, null, Empty, drop] +item=Agility potion(1), id=3039, option=[null, null, null, null, drop] +item=Magic potion(4), id=3040, option=[Drink, null, null, Empty, drop] +item=Magic potion(4), id=3041, option=[null, null, null, null, drop] +item=Magic potion(3), id=3042, option=[Drink, null, null, Empty, drop] +item=Magic potion(3), id=3043, option=[null, null, null, null, drop] +item=Magic potion(2), id=3044, option=[Drink, null, null, Empty, drop] +item=Magic potion(2), id=3045, option=[null, null, null, null, drop] +item=Magic potion(1), id=3046, option=[Drink, null, null, Empty, drop] +item=Magic potion(1), id=3047, option=[null, null, null, null, drop] +item=Pirate's hook, id=3048, option=[null, null, null, null, drop] +item=Grimy toadflax, id=3049, option=[Clean, null, null, null, drop] +item=Grimy toadflax, id=3050, option=[null, null, null, null, drop] +item=Grimy snapdragon, id=3051, option=[Clean, null, null, null, drop] +item=Grimy snapdragon, id=3052, option=[null, null, null, null, drop] +item=Lava battlestaff, id=3053, option=[null, Wield, null, null, drop] +item=Mystic lava staff, id=3054, option=[null, Wield, null, null, drop] +item=Lava battlestaff, id=3055, option=[null, null, null, null, drop] +item=Mystic lava staff, id=3056, option=[null, null, null, null, drop] +item=Mime mask, id=3057, option=[null, Wear, null, null, drop] +item=Mime top, id=3058, option=[null, Wear, null, null, drop] +item=Mime legs, id=3059, option=[null, Wear, null, null, drop] +item=Mime gloves, id=3060, option=[null, Wear, null, null, drop] +item=Mime boots, id=3061, option=[null, Wear, null, null, drop] +item=Strange box, id=3062, option=[Open, null, null, null, drop] +item=null, id=3063, option=[null, null, null, null, drop] +item=Whoopsie, id=3064, option=[Wear, null, null, null, drop] +item=null, id=3065, option=[null, null, null, null, drop] +item=Whoopsie, id=3066, option=[Wear, null, null, null, drop] +item=null, id=3067, option=[null, null, null, null, drop] +item=Whoopsie, id=3068, option=[Wear, null, null, null, drop] +item=null, id=3069, option=[null, null, null, null, drop] +item=Whoopsie, id=3070, option=[Wear, null, null, null, drop] +item=null, id=3071, option=[null, null, null, null, drop] +item=Whoopsie, id=3072, option=[Wear, null, null, null, drop] +item=null, id=3073, option=[null, null, null, null, drop] +item=Whoopsie, id=3074, option=[Wear, null, null, null, drop] +item=null, id=3075, option=[null, null, null, null, drop] +item=Whoopsie, id=3076, option=[Wear, null, null, null, drop] +item=null, id=3077, option=[null, null, null, null, drop] +item=Whoopsie, id=3078, option=[Wear, null, null, null, drop] +item=null, id=3079, option=[null, null, null, null, drop] +item=Whoopsie, id=3080, option=[Wear, null, null, null, drop] +item=null, id=3081, option=[null, null, null, null, drop] +item=Whoopsie, id=3082, option=[Wear, null, null, null, drop] +item=null, id=3083, option=[null, null, null, null, drop] +item=Whoopsie, id=3084, option=[Wear, null, null, null, drop] +item=null, id=3085, option=[null, null, null, null, drop] +item=Whoopsie, id=3086, option=[Wear, null, null, null, drop] +item=null, id=3087, option=[null, null, null, null, drop] +item=Whoopsie, id=3088, option=[Wear, null, null, null, drop] +item=null, id=3089, option=[null, null, null, null, drop] +item=Whoopsie, id=3090, option=[Wear, null, null, null, drop] +item=null, id=3091, option=[null, null, null, null, drop] +item=Whoopsie, id=3092, option=[Wear, null, null, null, drop] +item=Black dart, id=3093, option=[null, Wield, null, null, drop] +item=Black dart(p), id=3094, option=[null, Wield, null, null, drop] +item=Bronze claws, id=3095, option=[null, Wear, null, null, drop] +item=Iron claws, id=3096, option=[null, Wear, null, null, drop] +item=Steel claws, id=3097, option=[null, Wear, null, null, drop] +item=Black claws, id=3098, option=[null, Wear, null, null, drop] +item=Mithril claws, id=3099, option=[null, Wear, null, null, drop] +item=Adamant claws, id=3100, option=[null, Wear, null, null, drop] +item=Rune claws, id=3101, option=[null, Wear, null, null, drop] +item=Combination, id=3102, option=[Read, null, null, null, drop] +item=Iou, id=3103, option=[Read, null, null, null, drop] +item=Secret way map, id=3104, option=[null, null, null, null, drop] +item=Climbing boots, id=3105, option=[null, Wear, null, null, drop] +item=Climbing boots, id=3106, option=[null, null, null, null, drop] +item=Spiked boots, id=3107, option=[null, Wear, null, null, drop] +item=Whoopsie, id=3108, option=[null, null, null, null, drop] +item=Stone ball, id=3109, option=[null, null, null, null, drop] +item=Stone ball, id=3110, option=[null, null, null, null, drop] +item=Stone ball, id=3111, option=[null, null, null, null, drop] +item=Stone ball, id=3112, option=[null, null, null, null, drop] +item=Stone ball, id=3113, option=[null, null, null, null, drop] +item=Certificate, id=3114, option=[null, null, null, null, drop] +item=Bronze claws, id=3115, option=[null, null, null, null, drop] +item=Iron claws, id=3116, option=[null, null, null, null, drop] +item=Steel claws, id=3117, option=[null, null, null, null, drop] +item=Black claws, id=3118, option=[null, null, null, null, drop] +item=Mithril claws, id=3119, option=[null, null, null, null, drop] +item=Adamant claws, id=3120, option=[null, null, null, null, drop] +item=Rune claws, id=3121, option=[null, null, null, null, drop] +item=Granite shield, id=3122, option=[null, Wear, null, null, drop] +item=Shaikahan bones, id=3123, option=[Bury, null, null, null, drop] +item=Shaikahan bones, id=3124, option=[null, null, null, null, drop] +item=Jogre bones, id=3125, option=[Bury, null, null, null, drop] +item=Jogre bones, id=3126, option=[null, null, null, null, drop] +item=Burnt jogre bones, id=3127, option=[Bury, null, null, null, drop] +item=Pasty jogre bones, id=3128, option=[Bury, null, null, null, drop] +item=Pasty jogre bones, id=3129, option=[Bury, null, null, null, drop] +item=Marinated j' bones, id=3130, option=[Bury, null, null, null, drop] +item=Pasty jogre bones, id=3131, option=[Bury, null, null, null, drop] +item=Pasty jogre bones, id=3132, option=[Bury, null, null, null, drop] +item=Marinated j' bones, id=3133, option=[Bury, null, null, null, drop] +item=Granite shield, id=3134, option=[null, null, null, null, drop] +item=Prison key, id=3135, option=[null, null, null, null, drop] +item=Cell key 1, id=3136, option=[null, null, null, null, drop] +item=Cell key 2, id=3137, option=[null, null, null, null, drop] +item=Potato cactus, id=3138, option=[null, null, null, null, drop] +item=Potato cactus, id=3139, option=[null, null, null, null, drop] +item=Dragon chainbody, id=3140, option=[null, Wear, null, null, drop] +item=Dragon chainbody, id=3141, option=[null, null, null, null, drop] +item=Raw karambwan, id=3142, option=[null, null, null, null, drop] +item=Raw karambwan, id=3143, option=[null, null, null, null, drop] +item=Cooked karambwan, id=3144, option=[Eat, null, null, null, drop] +item=Cooked karambwan, id=3145, option=[null, null, null, null, drop] +item=Poison karambwan, id=3146, option=[Eat, null, null, null, drop] +item=Cooked karambwan, id=3147, option=[null, null, null, null, drop] +item=Burnt karambwan, id=3148, option=[null, null, null, null, drop] +item=Burnt karambwan, id=3149, option=[null, null, null, null, drop] +item=Raw karambwanji, id=3150, option=[null, null, null, null, drop] +item=Karambwanji, id=3151, option=[Eat, null, null, null, drop] +item=Karambwan paste, id=3152, option=[null, null, null, null, drop] +item=Karambwan paste, id=3153, option=[null, null, null, null, drop] +item=Karambwan paste, id=3154, option=[null, null, null, null, drop] +item=Karambwanji paste, id=3155, option=[null, null, null, null, drop] +item=Karambwanji paste, id=3156, option=[null, null, null, null, drop] +item=Karambwan vessel, id=3157, option=[null, null, null, null, drop] +item=Karambwan vessel, id=3158, option=[null, null, null, null, drop] +item=Karambwan vessel, id=3159, option=[null, null, null, null, drop] +item=Karambwan vessel, id=3160, option=[null, null, null, null, drop] +item=Crafting manual, id=3161, option=[null, null, null, null, drop] +item=Sliced banana, id=3162, option=[Eat, null, null, null, drop] +item=Sliced banana, id=3163, option=[null, null, null, null, drop] +item=Karamjan rum, id=3164, option=[null, null, null, null, drop] +item=Karamjan rum, id=3165, option=[null, null, null, null, drop] +item=Monkey corpse, id=3166, option=[null, null, null, null, drop] +item=Monkey skin, id=3167, option=[null, null, null, null, drop] +item=Seaweed sandwich, id=3168, option=[Eat, null, null, null, drop] +item=Stuffed monkey, id=3169, option=[null, null, null, null, drop] +item=Bronze spear(kp), id=3170, option=[null, Wield, null, null, drop] +item=Iron spear(kp), id=3171, option=[null, Wield, null, null, drop] +item=Steel spear(kp), id=3172, option=[null, Wield, null, null, drop] +item=Mithril spear(kp), id=3173, option=[null, Wield, null, null, drop] +item=Adamant spear(kp), id=3174, option=[null, Wield, null, null, drop] +item=Rune spear(kp), id=3175, option=[null, Wield, null, null, drop] +item=Dragon spear(kp), id=3176, option=[null, Wield, null, null, drop] +item=Banana left, id=3177, option=[Eat, null, null, null, drop] +item=Banana left, id=3178, option=[null, null, null, null, drop] +item=Monkey bones, id=3179, option=[Bury, null, null, null, drop] +item=Monkey bones, id=3180, option=[Bury, null, null, null, drop] +item=Monkey bones, id=3181, option=[Bury, null, null, null, drop] +item=Monkey bones, id=3182, option=[Bury, null, null, null, drop] +item=Monkey bones, id=3183, option=[Bury, null, null, null, drop] +item=Monkey bones, id=3184, option=[null, null, null, null, drop] +item=Monkey bones, id=3185, option=[Bury, null, null, null, drop] +item=Monkey bones, id=3186, option=[Bury, null, null, null, drop] +item=Bones, id=3187, option=[Bury, null, null, null, drop] +item=Cleaning cloth, id=3188, option=[null, null, null, null, drop] +item=Cleaning cloth, id=3189, option=[null, null, null, null, drop] +item=Bronze halberd, id=3190, option=[null, Wield, null, null, drop] +item=Bronze halberd, id=3191, option=[null, null, null, null, drop] +item=Iron halberd, id=3192, option=[null, Wield, null, null, drop] +item=Iron halberd, id=3193, option=[null, null, null, null, drop] +item=Steel halberd, id=3194, option=[null, Wield, null, null, drop] +item=Steel halberd, id=3195, option=[null, null, null, null, drop] +item=Black halberd, id=3196, option=[null, Wield, null, null, drop] +item=Black halberd, id=3197, option=[null, null, null, null, drop] +item=Mithril halberd, id=3198, option=[null, Wield, null, null, drop] +item=Mithril halberd, id=3199, option=[null, null, null, null, drop] +item=Adamant halberd, id=3200, option=[null, Wield, null, null, drop] +item=Adamant halberd, id=3201, option=[null, null, null, null, drop] +item=Rune halberd, id=3202, option=[null, Wield, null, null, drop] +item=Rune halberd, id=3203, option=[null, null, null, null, drop] +item=Dragon halberd, id=3204, option=[null, Wield, null, null, drop] +item=Dragon halberd, id=3205, option=[null, null, null, null, drop] +item=King's message, id=3206, option=[Read, null, null, null, drop] +item=Iorwerths message, id=3207, option=[Read, null, null, null, drop] +item=Crystal pendant, id=3208, option=[null, Wear, null, null, drop] +item=Sulphur, id=3209, option=[null, null, null, null, drop] +item=Whoopsie, id=3210, option=[null, null, null, null, drop] +item=Limestone, id=3211, option=[null, null, null, null, drop] +item=Limestone, id=3212, option=[null, null, null, null, drop] +item=Quicklime, id=3213, option=[null, null, null, null, drop] +item=Pot of quicklime, id=3214, option=[null, null, null, null, drop] +item=Ground sulphur, id=3215, option=[null, null, null, null, drop] +item=Barrel, id=3216, option=[null, null, null, null, drop] +item=Barrel, id=3217, option=[null, null, null, null, drop] +item=Barrel bomb, id=3218, option=[null, null, null, null, drop] +item=Barrel bomb, id=3219, option=[null, null, null, null, drop] +item=Barrel of coal-tar, id=3220, option=[null, null, null, null, drop] +item=Barrel of naphtha, id=3221, option=[null, null, null, null, drop] +item=Naphtha mix, id=3222, option=[null, null, null, null, drop] +item=Naphtha mix, id=3223, option=[null, null, null, null, drop] +item=Strip of cloth, id=3224, option=[null, null, null, null, drop] +item=Whoopsie, id=3225, option=[null, null, null, null, drop] +item=Raw rabbit, id=3226, option=[null, null, null, null, drop] +item=Raw rabbit, id=3227, option=[null, null, null, null, drop] +item=Cooked rabbit, id=3228, option=[Eat, null, null, null, drop] +item=Cooked rabbit, id=3229, option=[null, null, null, null, drop] +item=Big book of bangs, id=3230, option=[Read, null, null, null, drop] +item=Symbol1, id=3231, option=[null, null, null, null, drop] +item=Symbol1, id=3232, option=[null, null, null, null, drop] +item=Symbol2, id=3233, option=[null, null, null, null, drop] +item=Symbol2, id=3234, option=[null, null, null, null, drop] +item=Symbol3, id=3235, option=[null, null, null, null, drop] +item=Symbol3, id=3236, option=[null, null, null, null, drop] +item=Symbol4, id=3237, option=[null, null, null, null, drop] +item=Symbol4, id=3238, option=[null, null, null, null, drop] +item=Bark, id=3239, option=[null, null, null, null, drop] +item=Bark, id=3240, option=[null, null, null, null, drop] +item=Man, id=3241, option=[null, null, null, null, drop] +item=Whoopsie, id=3242, option=[Wear, null, null, null, drop] +item=Farmer, id=3243, option=[null, null, null, null, drop] +item=Whoopsie, id=3244, option=[Wear, null, null, null, drop] +item=Warrior woman, id=3245, option=[null, null, null, null, drop] +item=Whoopsie, id=3246, option=[Wear, null, null, null, drop] +item=Rogue, id=3247, option=[null, null, null, null, drop] +item=Whoopsie, id=3248, option=[Wear, null, null, null, drop] +item=Guard, id=3249, option=[null, null, null, null, drop] +item=Whoopsie, id=3250, option=[Wear, null, null, null, drop] +item=Knight of ardougne, id=3251, option=[null, null, null, null, drop] +item=Whoopsie, id=3252, option=[Wear, null, null, null, drop] +item=Watchman, id=3253, option=[null, null, null, null, drop] +item=Whoopsie, id=3254, option=[Wear, null, null, null, drop] +item=Paladin, id=3255, option=[null, null, null, null, drop] +item=Whoopsie, id=3256, option=[Wear, null, null, null, drop] +item=Gnome, id=3257, option=[null, null, null, null, drop] +item=Whoopsie, id=3258, option=[Wear, null, null, null, drop] +item=Hero, id=3259, option=[null, null, null, null, drop] +item=Whoopsie, id=3260, option=[Wear, null, null, null, drop] +item=Goutweed, id=3261, option=[null, null, null, null, drop] +item=Troll thistle, id=3262, option=[null, null, null, null, drop] +item=Dried thistle, id=3263, option=[null, null, null, null, drop] +item=Ground thistle, id=3264, option=[null, null, null, null, drop] +item=Troll potion, id=3265, option=[null, null, null, null, drop] +item=Drunk parrot, id=3266, option=[null, null, null, null, drop] +item=Dirty robe, id=3267, option=[null, null, null, null, drop] +item=Fake man, id=3268, option=[null, null, null, null, drop] +item=Storeroom key, id=3269, option=[null, null, null, null, drop] +item=Alco-chunks, id=3270, option=[null, null, null, null, drop] +item=null, id=3271, option=[null, null, null, null, drop] +item=Whoopsie, id=3272, option=[Wear, null, null, null, drop] +item=null, id=3273, option=[null, null, null, null, drop] +item=null, id=3274, option=[null, null, null, null, drop] +item=null, id=3275, option=[null, null, null, null, drop] +item=null, id=3276, option=[null, null, null, null, drop] +item=null, id=3277, option=[null, null, null, null, drop] +item=null, id=3278, option=[null, null, null, null, drop] +item=null, id=3279, option=[null, null, null, null, drop] +item=null, id=3280, option=[null, null, null, null, drop] +item=null, id=3281, option=[null, null, null, null, drop] +item=null, id=3282, option=[null, null, null, null, drop] +item=null, id=3283, option=[null, null, null, null, drop] +item=null, id=3284, option=[null, null, null, null, drop] +item=null, id=3285, option=[null, null, null, null, drop] +item=null, id=3286, option=[null, null, null, null, drop] +item=null, id=3287, option=[null, null, null, null, drop] +item=null, id=3288, option=[null, null, null, null, drop] +item=null, id=3289, option=[null, null, null, null, drop] +item=null, id=3290, option=[null, null, null, null, drop] +item=null, id=3291, option=[null, null, null, null, drop] +item=null, id=3292, option=[null, null, null, null, drop] +item=null, id=3293, option=[null, null, null, null, drop] +item=null, id=3294, option=[null, null, null, null, drop] +item=null, id=3295, option=[null, null, null, null, drop] +item=null, id=3296, option=[null, null, null, null, drop] +item=null, id=3297, option=[null, null, null, null, drop] +item=null, id=3298, option=[null, null, null, null, drop] +item=null, id=3299, option=[null, null, null, null, drop] +item=null, id=3300, option=[null, null, null, null, drop] +item=null, id=3301, option=[null, null, null, null, drop] +item=null, id=3302, option=[null, null, null, null, drop] +item=null, id=3303, option=[null, null, null, null, drop] +item=null, id=3304, option=[null, null, null, null, drop] +item=null, id=3305, option=[null, null, null, null, drop] +item=null, id=3306, option=[null, null, null, null, drop] +item=null, id=3307, option=[null, null, null, null, drop] +item=null, id=3308, option=[null, null, null, null, drop] +item=null, id=3309, option=[null, null, null, null, drop] +item=null, id=3310, option=[null, null, null, null, drop] +item=null, id=3311, option=[null, null, null, null, drop] +item=null, id=3312, option=[null, null, null, null, drop] +item=null, id=3313, option=[null, null, null, null, drop] +item=null, id=3314, option=[null, null, null, null, drop] +item=null, id=3315, option=[null, null, null, null, drop] +item=null, id=3316, option=[null, null, null, null, drop] +item=null, id=3317, option=[null, null, null, null, drop] +item=null, id=3318, option=[null, null, null, null, drop] +item=null, id=3319, option=[null, null, null, null, drop] +item=null, id=3320, option=[null, null, null, null, drop] +item=null, id=3321, option=[null, null, null, null, drop] +item=null, id=3322, option=[null, null, null, null, drop] +item=null, id=3323, option=[null, null, null, null, drop] +item=null, id=3324, option=[null, null, null, null, drop] +item=Vampire dust, id=3325, option=[null, null, null, null, drop] +item=Vampire dust, id=3326, option=[null, null, null, null, drop] +item=Myre snelm, id=3327, option=[null, Wear, null, null, drop] +item=Myre snelm, id=3328, option=[null, null, null, null, drop] +item=Blood'n'tar snelm, id=3329, option=[null, Wear, null, null, drop] +item=Blood'n'tar snelm, id=3330, option=[null, null, null, null, drop] +item=Ochre snelm, id=3331, option=[null, Wear, null, null, drop] +item=Ochre snelm, id=3332, option=[null, null, null, null, drop] +item=Bruise blue snelm, id=3333, option=[null, Wear, null, null, drop] +item=Bruise blue snelm, id=3334, option=[null, null, null, null, drop] +item=Broken bark snelm, id=3335, option=[null, Wear, null, null, drop] +item=Broken bark snelm, id=3336, option=[null, null, null, null, drop] +item=Myre snelm, id=3337, option=[null, Wear, null, null, drop] +item=Myre snelm, id=3338, option=[null, null, null, null, drop] +item=Blood'n'tar snelm, id=3339, option=[null, Wear, null, null, drop] +item=Blood'n'tar snelm, id=3340, option=[null, null, null, null, drop] +item=Ochre snelm, id=3341, option=[null, Wear, null, null, drop] +item=Ochre snelm, id=3342, option=[null, null, null, null, drop] +item=Bruise blue snelm, id=3343, option=[null, Wear, null, null, drop] +item=Bruise blue snelm, id=3344, option=[null, null, null, null, drop] +item=Blamish myre shell, id=3345, option=[null, null, null, null, drop] +item=Blamish myre shell, id=3346, option=[null, null, null, null, drop] +item=Blamish red shell, id=3347, option=[null, null, null, null, drop] +item=Blamish red shell, id=3348, option=[null, null, null, null, drop] +item=Blamish ochre shell, id=3349, option=[null, null, null, null, drop] +item=Blamish ochre shell, id=3350, option=[null, null, null, null, drop] +item=Blamish blue shell, id=3351, option=[null, null, null, null, drop] +item=Blamish blue shell, id=3352, option=[null, null, null, null, drop] +item=Blamish bark shell, id=3353, option=[null, null, null, null, drop] +item=Blamish bark shell, id=3354, option=[null, null, null, null, drop] +item=Blamish myre shell, id=3355, option=[null, null, null, null, drop] +item=Blamish myre shell, id=3356, option=[null, null, null, null, drop] +item=Blamish red shell, id=3357, option=[null, null, null, null, drop] +item=Blamish red shell, id=3358, option=[null, null, null, null, drop] +item=Blamish ochre shell, id=3359, option=[null, null, null, null, drop] +item=Blamish ochre shell, id=3360, option=[null, null, null, null, drop] +item=Blamish blue shell, id=3361, option=[null, null, null, null, drop] +item=Blamish blue shell, id=3362, option=[null, null, null, null, drop] +item=Thin snail, id=3363, option=[null, null, null, null, drop] +item=Thin snail, id=3364, option=[null, null, null, null, drop] +item=Lean snail, id=3365, option=[null, null, null, null, drop] +item=Lean snail, id=3366, option=[null, null, null, null, drop] +item=Fat snail, id=3367, option=[null, null, null, null, drop] +item=Fat snail, id=3368, option=[null, null, null, null, drop] +item=Thin snail meat, id=3369, option=[Eat, null, null, null, drop] +item=Thin snail meat, id=3370, option=[null, null, null, null, drop] +item=Lean snail meat, id=3371, option=[Eat, null, null, null, drop] +item=Lean snail meat, id=3372, option=[null, null, null, null, drop] +item=Fat snail meat, id=3373, option=[Eat, null, null, null, drop] +item=Fat snail meat, id=3374, option=[null, null, null, null, drop] +item=Burnt snail, id=3375, option=[null, null, null, null, drop] +item=Burnt snail, id=3376, option=[null, null, null, null, drop] +item=Sample bottle, id=3377, option=[null, null, null, null, drop] +item=Sample bottle, id=3378, option=[null, null, null, null, drop] +item=Slimy eel, id=3379, option=[null, null, null, null, drop] +item=Slimy eel, id=3380, option=[null, null, null, null, drop] +item=Cooked slimy eel, id=3381, option=[Eat, null, null, null, drop] +item=Cooked slimy eel, id=3382, option=[null, null, null, null, drop] +item=Burnt eel, id=3383, option=[null, null, null, null, drop] +item=Whoopsie, id=3384, option=[null, null, null, null, drop] +item=Splitbark helm, id=3385, option=[null, Wear, null, null, drop] +item=Splitbark helm, id=3386, option=[null, null, null, null, drop] +item=Splitbark body, id=3387, option=[null, Wear, null, null, drop] +item=Splitbark body, id=3388, option=[null, null, null, null, drop] +item=Splitbark legs, id=3389, option=[null, Wear, null, null, drop] +item=Splitbark legs, id=3390, option=[null, null, null, null, drop] +item=Splitbark gauntlets, id=3391, option=[null, Wear, null, null, drop] +item=Splitbark gauntlets, id=3392, option=[null, null, null, null, drop] +item=Splitbark boots, id=3393, option=[null, Wear, null, null, drop] +item=Splitbark boots, id=3394, option=[null, null, null, null, drop] +item=Diary, id=3395, option=[Read, null, null, null, drop] +item=Loar remains, id=3396, option=[null, null, null, null, drop] +item=Loar remains, id=3397, option=[null, null, null, null, drop] +item=Phrin remains, id=3398, option=[null, null, null, null, drop] +item=Phrin remains, id=3399, option=[null, null, null, null, drop] +item=Riyl remains, id=3400, option=[null, null, null, null, drop] +item=Riyl remains, id=3401, option=[null, null, null, null, drop] +item=Asyn remains, id=3402, option=[null, null, null, null, drop] +item=Asyn remains, id=3403, option=[null, null, null, null, drop] +item=Fiyr remains, id=3404, option=[null, null, null, null, drop] +item=Fiyr remains, id=3405, option=[null, null, null, null, drop] +item=Ash potion(unf), id=3406, option=[null, null, null, null, drop] +item=Ash potion(unf), id=3407, option=[null, null, null, null, drop] +item=Serum 207 (4), id=3408, option=[null, null, null, Empty, drop] +item=Whoopsie, id=3409, option=[null, null, null, null, drop] +item=Serum 207 (3), id=3410, option=[null, null, null, Empty, drop] +item=Whoopsie, id=3411, option=[null, null, null, null, drop] +item=Serum 207 (2), id=3412, option=[null, null, null, Empty, drop] +item=Whoopsie, id=3413, option=[null, null, null, null, drop] +item=Serum 207 (1), id=3414, option=[null, null, null, Empty, drop] +item=Whoopsie, id=3415, option=[null, null, null, null, drop] +item=Serum 208 (4), id=3416, option=[null, null, null, Empty, drop] +item=Serum 208 (3), id=3417, option=[null, null, null, Empty, drop] +item=Serum 208 (2), id=3418, option=[null, null, null, Empty, drop] +item=Serum 208 (1), id=3419, option=[null, null, null, Empty, drop] +item=Limestone brick, id=3420, option=[null, null, null, null, drop] +item=Limestone brick, id=3421, option=[null, null, null, null, drop] +item=Olive oil(4), id=3422, option=[null, null, null, Empty, drop] +item=Olive oil(4), id=3423, option=[null, null, null, null, drop] +item=Olive oil(3), id=3424, option=[null, null, null, Empty, drop] +item=Olive oil(3), id=3425, option=[null, null, null, null, drop] +item=Olive oil(2), id=3426, option=[null, null, null, Empty, drop] +item=Olive oil(2), id=3427, option=[null, null, null, null, drop] +item=Olive oil(1), id=3428, option=[null, null, null, Empty, drop] +item=Olive oil(1), id=3429, option=[null, null, null, null, drop] +item=Sacred oil(4), id=3430, option=[null, null, null, Empty, drop] +item=Sacred oil(4), id=3431, option=[null, null, null, null, drop] +item=Sacred oil(3), id=3432, option=[null, null, null, Empty, drop] +item=Sacred oil(3), id=3433, option=[null, null, null, null, drop] +item=Sacred oil(2), id=3434, option=[null, null, null, Empty, drop] +item=Sacred oil(2), id=3435, option=[null, null, null, null, drop] +item=Sacred oil(1), id=3436, option=[null, null, null, Empty, drop] +item=Sacred oil(1), id=3437, option=[null, null, null, null, drop] +item=Pyre logs, id=3438, option=[null, null, null, null, drop] +item=Pyre logs, id=3439, option=[null, null, null, null, drop] +item=Oak pyre logs, id=3440, option=[null, null, null, null, drop] +item=Oak pyre logs, id=3441, option=[null, null, null, null, drop] +item=Willow pyre logs, id=3442, option=[null, null, null, null, drop] +item=Willow pyre logs, id=3443, option=[null, null, null, null, drop] +item=Maple pyre logs, id=3444, option=[null, null, null, null, drop] +item=Maple pyre logs, id=3445, option=[null, null, null, null, drop] +item=Yew pyre logs, id=3446, option=[null, null, null, null, drop] +item=Yew pyre logs, id=3447, option=[null, null, null, null, drop] +item=Magic pyre logs, id=3448, option=[null, null, null, null, drop] +item=Magic pyre logs, id=3449, option=[null, null, null, null, drop] +item=Bronze key red, id=3450, option=[null, null, null, null, drop] +item=Bronze key brown, id=3451, option=[null, null, null, null, drop] +item=Bronze key crimson, id=3452, option=[null, null, null, null, drop] +item=Bronze key black, id=3453, option=[null, null, null, null, drop] +item=Bronze key purple, id=3454, option=[null, null, null, null, drop] +item=Steel key red, id=3455, option=[null, null, null, null, drop] +item=Steel key brown, id=3456, option=[null, null, null, null, drop] +item=Steel key crimson, id=3457, option=[null, null, null, null, drop] +item=Steel key black, id=3458, option=[null, null, null, null, drop] +item=Steel key purple, id=3459, option=[null, null, null, null, drop] +item=Black key red, id=3460, option=[null, null, null, null, drop] +item=Black key brown, id=3461, option=[null, null, null, null, drop] +item=Black key crimson, id=3462, option=[null, null, null, null, drop] +item=Black key black, id=3463, option=[null, null, null, null, drop] +item=Black key purple, id=3464, option=[null, null, null, null, drop] +item=Silver key red, id=3465, option=[null, null, null, null, drop] +item=Silver key brown, id=3466, option=[null, null, null, null, drop] +item=Silver key crimson, id=3467, option=[null, null, null, null, drop] +item=Silver key black, id=3468, option=[null, null, null, null, drop] +item=Silver key purple, id=3469, option=[null, null, null, null, drop] +item=Fine cloth, id=3470, option=[null, null, null, null, drop] +item=Fine cloth, id=3471, option=[null, null, null, null, drop] +item=Black plateskirt (t), id=3472, option=[null, Wear, null, null, drop] +item=Black plateskirt (g), id=3473, option=[null, Wear, null, null, drop] +item=Adam plateskirt (t), id=3474, option=[null, Wear, null, null, drop] +item=Adam plateskirt (g), id=3475, option=[null, Wear, null, null, drop] +item=Rune plateskirt (g), id=3476, option=[null, Wear, null, null, drop] +item=Rune plateskirt (t), id=3477, option=[null, Wear, null, null, drop] +item=Zamorak plateskirt, id=3478, option=[null, Wear, null, null, drop] +item=Saradomin skirt, id=3479, option=[null, Wear, null, null, drop] +item=Guthix plateskirt, id=3480, option=[null, Wear, null, null, drop] +item=Gilded platebody, id=3481, option=[null, Wear, null, null, drop] +item=Gilded platebody, id=3482, option=[null, null, null, null, drop] +item=Gilded platelegs, id=3483, option=[null, Wear, null, null, drop] +item=Gilded platelegs, id=3484, option=[null, null, null, null, drop] +item=Gilded plateskirt, id=3485, option=[null, Wear, null, null, drop] +item=Gilded full helm, id=3486, option=[null, Wear, null, null, drop] +item=Gilded full helm, id=3487, option=[null, null, null, null, drop] +item=Gilded kiteshield, id=3488, option=[null, Wear, null, null, drop] +item=Gilded kiteshield, id=3489, option=[null, null, null, null, drop] +item=Clue scroll, id=3490, option=[Read, null, null, null, drop] +item=Clue scroll, id=3491, option=[Read, null, null, null, drop] +item=Clue scroll, id=3492, option=[Read, null, null, null, drop] +item=Clue scroll, id=3493, option=[Read, null, null, null, drop] +item=Clue scroll, id=3494, option=[Read, null, null, null, drop] +item=Clue scroll, id=3495, option=[Read, null, null, null, drop] +item=Clue scroll, id=3496, option=[Read, null, null, null, drop] +item=Clue scroll, id=3497, option=[Read, null, null, null, drop] +item=Clue scroll, id=3498, option=[Read, null, null, null, drop] +item=Clue scroll, id=3499, option=[Read, null, null, null, drop] +item=Clue scroll, id=3500, option=[Read, null, null, null, drop] +item=Clue scroll, id=3501, option=[Read, null, null, null, drop] +item=Clue scroll, id=3502, option=[Read, null, null, null, drop] +item=Clue scroll, id=3503, option=[Read, null, null, null, drop] +item=Clue scroll, id=3504, option=[Read, null, null, null, drop] +item=Clue scroll, id=3505, option=[Read, null, null, null, drop] +item=Clue scroll, id=3506, option=[Read, null, null, null, drop] +item=Clue scroll, id=3507, option=[Read, null, null, null, drop] +item=Clue scroll, id=3508, option=[Read, null, null, null, drop] +item=Clue scroll, id=3509, option=[Read, null, null, null, drop] +item=Clue scroll, id=3510, option=[Read, null, null, null, drop] +item=Casket, id=3511, option=[Open, null, null, null, drop] +item=Clue scroll, id=3512, option=[Read, null, null, null, drop] +item=Clue scroll, id=3513, option=[Read, null, null, null, drop] +item=Clue scroll, id=3514, option=[Read, null, null, null, drop] +item=Clue scroll, id=3515, option=[Read, null, null, null, drop] +item=Clue scroll, id=3516, option=[Read, null, null, null, drop] +item=Casket, id=3517, option=[Open, null, null, null, drop] +item=Clue scroll, id=3518, option=[Read, null, null, null, drop] +item=Casket, id=3519, option=[Open, null, null, null, drop] +item=Clue scroll, id=3520, option=[Read, null, null, null, drop] +item=Casket, id=3521, option=[Open, null, null, null, drop] +item=Clue scroll, id=3522, option=[Read, null, null, null, drop] +item=Casket, id=3523, option=[Open, null, null, null, drop] +item=Clue scroll, id=3524, option=[Read, null, null, null, drop] +item=Clue scroll, id=3525, option=[Read, null, null, null, drop] +item=Clue scroll, id=3526, option=[Read, null, null, null, drop] +item=Casket, id=3527, option=[Open, null, null, null, drop] +item=Clue scroll, id=3528, option=[Read, null, null, null, drop] +item=Casket, id=3529, option=[Open, null, null, null, drop] +item=Clue scroll, id=3530, option=[Read, null, null, null, drop] +item=Casket, id=3531, option=[Open, null, null, null, drop] +item=Clue scroll, id=3532, option=[Read, null, null, null, drop] +item=Casket, id=3533, option=[Open, null, null, null, drop] +item=Clue scroll, id=3534, option=[Read, null, null, null, drop] +item=Casket, id=3535, option=[Open, null, null, null, drop] +item=Clue scroll, id=3536, option=[Read, null, null, null, drop] +item=Casket, id=3537, option=[Open, null, null, null, drop] +item=Clue scroll, id=3538, option=[Read, null, null, null, drop] +item=Casket, id=3539, option=[Open, null, null, null, drop] +item=Clue scroll, id=3540, option=[Read, null, null, null, drop] +item=Casket, id=3541, option=[Open, null, null, null, drop] +item=Clue scroll, id=3542, option=[Read, null, null, null, drop] +item=Casket, id=3543, option=[Open, null, null, null, drop] +item=Clue scroll, id=3544, option=[Read, null, null, null, drop] +item=Casket, id=3545, option=[Open, null, null, null, drop] +item=Clue scroll, id=3546, option=[Read, null, null, null, drop] +item=Casket, id=3547, option=[Open, null, null, null, drop] +item=Clue scroll, id=3548, option=[Read, null, null, null, drop] +item=Casket, id=3549, option=[Open, null, null, null, drop] +item=Clue scroll, id=3550, option=[Read, null, null, null, drop] +item=Casket, id=3551, option=[Open, null, null, null, drop] +item=Clue scroll, id=3552, option=[Read, null, null, null, drop] +item=Casket, id=3553, option=[Open, null, null, null, drop] +item=Clue scroll, id=3554, option=[Read, null, null, null, drop] +item=Casket, id=3555, option=[Open, null, null, null, drop] +item=Clue scroll, id=3556, option=[Read, null, null, null, drop] +item=Casket, id=3557, option=[Open, null, null, null, drop] +item=Clue scroll, id=3558, option=[Read, null, null, null, drop] +item=Casket, id=3559, option=[Open, null, null, null, drop] +item=Clue scroll, id=3560, option=[Read, null, null, null, drop] +item=Casket, id=3561, option=[Open, null, null, null, drop] +item=Clue scroll, id=3562, option=[Read, null, null, null, drop] +item=Casket, id=3563, option=[Open, null, null, null, drop] +item=Clue scroll, id=3564, option=[Read, null, null, null, drop] +item=Puzzle box, id=3565, option=[Open, null, null, null, drop] +item=Clue scroll, id=3566, option=[Read, null, null, null, drop] +item=Puzzle box, id=3567, option=[Open, null, null, null, drop] +item=Clue scroll, id=3568, option=[Read, null, null, null, drop] +item=Puzzle box, id=3569, option=[Open, null, null, null, drop] +item=Clue scroll, id=3570, option=[Read, null, null, null, drop] +item=Puzzle box, id=3571, option=[Open, null, null, null, drop] +item=Clue scroll, id=3572, option=[Read, null, null, null, drop] +item=Clue scroll, id=3573, option=[Read, null, null, null, drop] +item=Clue scroll, id=3574, option=[Read, null, null, null, drop] +item=Clue scroll, id=3575, option=[Read, null, null, null, drop] +item=Puzzle box, id=3576, option=[Open, null, null, null, drop] +item=Clue scroll, id=3577, option=[Read, null, null, null, drop] +item=Puzzle box, id=3578, option=[Open, null, null, null, drop] +item=Clue scroll, id=3579, option=[Read, null, null, null, drop] +item=Clue scroll, id=3580, option=[Read, null, null, null, drop] +item=Casket, id=3581, option=[Open, null, null, null, drop] +item=Clue scroll, id=3582, option=[Read, null, null, null, drop] +item=Casket, id=3583, option=[Open, null, null, null, drop] +item=Clue scroll, id=3584, option=[Read, null, null, null, drop] +item=Casket, id=3585, option=[Open, null, null, null, drop] +item=Clue scroll, id=3586, option=[Read, null, null, null, drop] +item=Casket, id=3587, option=[Open, null, null, null, drop] +item=Clue scroll, id=3588, option=[Read, null, null, null, drop] +item=Casket, id=3589, option=[Open, null, null, null, drop] +item=Clue scroll, id=3590, option=[Read, null, null, null, drop] +item=Casket, id=3591, option=[Open, null, null, null, drop] +item=Clue scroll, id=3592, option=[Read, null, null, null, drop] +item=Casket, id=3593, option=[Open, null, null, null, drop] +item=Clue scroll, id=3594, option=[Read, null, null, null, drop] +item=Casket, id=3595, option=[Open, null, null, null, drop] +item=Clue scroll, id=3596, option=[Read, null, null, null, drop] +item=Casket, id=3597, option=[Open, null, null, null, drop] +item=Clue scroll, id=3598, option=[Read, null, null, null, drop] +item=Clue scroll, id=3599, option=[Read, null, null, null, drop] +item=Casket, id=3600, option=[Open, null, null, null, drop] +item=Clue scroll, id=3601, option=[Read, null, null, null, drop] +item=Clue scroll, id=3602, option=[Read, null, null, null, drop] +item=Casket, id=3603, option=[Open, null, null, null, drop] +item=Clue scroll, id=3604, option=[Read, null, null, null, drop] +item=Clue scroll, id=3605, option=[Read, null, null, null, drop] +item=Key, id=3606, option=[null, null, null, null, drop] +item=Clue scroll, id=3607, option=[Read, null, null, null, drop] +item=Key, id=3608, option=[null, null, null, null, drop] +item=Clue scroll, id=3609, option=[Read, null, null, null, drop] +item=Clue scroll, id=3610, option=[Read, null, null, null, drop] +item=Clue scroll, id=3611, option=[Read, null, null, null, drop] +item=Clue scroll, id=3612, option=[Read, null, null, null, drop] +item=Clue scroll, id=3613, option=[Read, null, null, null, drop] +item=Clue scroll, id=3614, option=[Read, null, null, null, drop] +item=Clue scroll, id=3615, option=[Read, null, null, null, drop] +item=Clue scroll, id=3616, option=[Read, null, null, null, drop] +item=Clue scroll, id=3617, option=[Read, null, null, null, drop] +item=Clue scroll, id=3618, option=[Read, null, null, null, drop] +item=Sliding piece, id=3619, option=[null, null, null, null, Move] +item=Sliding piece, id=3620, option=[null, null, null, null, Move] +item=Sliding piece, id=3621, option=[null, null, null, null, Move] +item=Sliding piece, id=3622, option=[null, null, null, null, Move] +item=Sliding piece, id=3623, option=[null, null, null, null, Move] +item=Sliding piece, id=3624, option=[null, null, null, null, Move] +item=Sliding piece, id=3625, option=[null, null, null, null, Move] +item=Sliding piece, id=3626, option=[null, null, null, null, Move] +item=Sliding piece, id=3627, option=[null, null, null, null, Move] +item=Sliding piece, id=3628, option=[null, null, null, null, Move] +item=Sliding piece, id=3629, option=[null, null, null, null, Move] +item=Sliding piece, id=3630, option=[null, null, null, null, Move] +item=Sliding piece, id=3631, option=[null, null, null, null, Move] +item=Sliding piece, id=3632, option=[null, null, null, null, Move] +item=Sliding piece, id=3633, option=[null, null, null, null, Move] +item=Sliding piece, id=3634, option=[null, null, null, null, Move] +item=Sliding piece, id=3635, option=[null, null, null, null, Move] +item=Sliding piece, id=3636, option=[null, null, null, null, Move] +item=Sliding piece, id=3637, option=[null, null, null, null, Move] +item=Sliding piece, id=3638, option=[null, null, null, null, Move] +item=Sliding piece, id=3639, option=[null, null, null, null, Move] +item=Sliding piece, id=3640, option=[null, null, null, null, Move] +item=Sliding piece, id=3641, option=[null, null, null, null, Move] +item=Sliding piece, id=3642, option=[null, null, null, null, Move] +item=Sliding piece, id=3643, option=[null, null, null, null, Move] +item=Sliding piece, id=3644, option=[null, null, null, null, Move] +item=Sliding piece, id=3645, option=[null, null, null, null, Move] +item=Sliding piece, id=3646, option=[null, null, null, null, Move] +item=Sliding piece, id=3647, option=[null, null, null, null, Move] +item=Sliding piece, id=3648, option=[null, null, null, null, Move] +item=Sliding piece, id=3649, option=[null, null, null, null, Move] +item=Sliding piece, id=3650, option=[null, null, null, null, Move] +item=Sliding piece, id=3651, option=[null, null, null, null, Move] +item=Sliding piece, id=3652, option=[null, null, null, null, Move] +item=Sliding piece, id=3653, option=[null, null, null, null, Move] +item=Sliding piece, id=3654, option=[null, null, null, null, Move] +item=Sliding piece, id=3655, option=[null, null, null, null, Move] +item=Sliding piece, id=3656, option=[null, null, null, null, Move] +item=Sliding piece, id=3657, option=[null, null, null, null, Move] +item=Sliding piece, id=3658, option=[null, null, null, null, Move] +item=Sliding piece, id=3659, option=[null, null, null, null, Move] +item=Sliding piece, id=3660, option=[null, null, null, null, Move] +item=Sliding piece, id=3661, option=[null, null, null, null, Move] +item=Sliding piece, id=3662, option=[null, null, null, null, Move] +item=Sliding piece, id=3663, option=[null, null, null, null, Move] +item=Sliding piece, id=3664, option=[null, null, null, null, Move] +item=Sliding piece, id=3665, option=[null, null, null, null, Move] +item=Sliding piece, id=3666, option=[null, null, null, null, Move] +item=Lifeboat, id=3667, option=[Wear, null, null, null, drop] +item=Black plateskirt (t), id=3668, option=[null, null, null, null, drop] +item=Black plateskirt (g), id=3669, option=[null, null, null, null, drop] +item=Adam plateskirt (t), id=3670, option=[null, null, null, null, drop] +item=Adam plateskirt (g), id=3671, option=[null, null, null, null, drop] +item=Rune plateskirt (g), id=3672, option=[null, null, null, null, drop] +item=Rune plateskirt (t), id=3673, option=[null, null, null, null, drop] +item=Zamorak plateskirt, id=3674, option=[null, null, null, null, drop] +item=Saradomin skirt, id=3675, option=[null, null, null, null, drop] +item=Guthix plateskirt, id=3676, option=[null, null, null, null, drop] +item=Gilded plateskirt, id=3677, option=[null, null, null, null, drop] +item=Flamtaer hammer, id=3678, option=[null, null, null, null, drop] +item=Whoopsie, id=3679, option=[null, null, null, null, drop] +item=Shoe, id=3680, option=[null, null, null, null, drop] +item=Shoe, id=3681, option=[null, null, null, null, drop] +item=Shoe, id=3682, option=[null, null, null, null, drop] +item=Shoe, id=3683, option=[null, null, null, null, drop] +item=Shoe, id=3684, option=[null, null, null, null, drop] +item=Shoe., id=3685, option=[null, null, null, null, drop] +item=Fremennik, id=3686, option=[null, null, null, null, drop] +item=Whoopsie, id=3687, option=[Wear, null, null, null, drop] +item=Unstrung lyre, id=3688, option=[null, null, null, null, drop] +item=Lyre, id=3689, option=[Play, null, null, null, drop] +item=Enchanted lyre, id=3690, option=[Play, null, null, null, drop] +item=Enchanted lyre(1), id=3691, option=[Play, null, null, null, drop] +item=Branch, id=3692, option=[null, null, null, null, drop] +item=Golden fleece, id=3693, option=[null, null, null, null, drop] +item=Golden wool, id=3694, option=[null, null, null, null, drop] +item=Pet rock, id=3695, option=[Interact, Wield, null, null, drop] +item=Hunters' talisman, id=3696, option=[Locate, null, null, null, drop] +item=Hunters' talisman, id=3697, option=[Locate, null, null, null, drop] +item=Exotic flower, id=3698, option=[null, null, null, null, Destroy] +item=Fremennik ballad, id=3699, option=[null, null, null, null, drop] +item=Sturdy boots, id=3700, option=[null, null, null, null, drop] +item=Tracking map, id=3701, option=[null, null, null, null, drop] +item=Custom bow string, id=3702, option=[null, null, null, null, drop] +item=Unusual fish, id=3703, option=[null, null, null, null, drop] +item=Sea fishing map, id=3704, option=[null, null, null, null, drop] +item=Weather forecast, id=3705, option=[null, null, null, null, drop] +item=Champions token, id=3706, option=[null, null, null, null, drop] +item=Legendary cocktail, id=3707, option=[null, null, null, null, drop] +item=Fiscal statement, id=3708, option=[null, null, null, null, drop] +item=Promissory note, id=3709, option=[null, null, null, null, drop] +item=Warriors' contract, id=3710, option=[null, null, null, null, drop] +item=Keg of beer, id=3711, option=[null, null, null, null, drop] +item=Low alcohol keg, id=3712, option=[null, null, null, null, drop] +item=Strange object, id=3713, option=[null, null, null, null, drop] +item=Lit strange object, id=3714, option=[null, null, null, null, drop] +item=Red disk, id=3715, option=[null, null, null, null, drop] +item=Red disk, id=3716, option=[null, null, null, null, drop] +item=null, id=3717, option=[null, null, null, null, drop] +item=Magnet, id=3718, option=[null, null, null, null, drop] +item=Blue thread, id=3719, option=[null, null, null, null, drop] +item=Small pick, id=3720, option=[null, null, null, null, drop] +item=Toy ship, id=3721, option=[null, null, null, null, drop] +item=Full bucket, id=3722, option=[null, null, null, null, Destroy] +item=4/5ths full bucket, id=3723, option=[null, null, null, null, Destroy] +item=3/5ths full bucket, id=3724, option=[null, null, null, null, Destroy] +item=2/5ths full bucket, id=3725, option=[null, null, null, null, Destroy] +item=1/5ths full bucket, id=3726, option=[null, null, null, null, Destroy] +item=Empty bucket, id=3727, option=[null, null, null, null, Destroy] +item=Frozen bucket, id=3728, option=[null, null, null, null, Destroy] +item=Full jug, id=3729, option=[null, null, null, null, Destroy] +item=2/3rds full jug, id=3730, option=[null, null, null, null, Destroy] +item=1/3rds full jug, id=3731, option=[null, null, null, null, Destroy] +item=Empty jug, id=3732, option=[null, null, null, null, Destroy] +item=Frozen jug, id=3733, option=[null, null, null, null, Destroy] +item=Vase, id=3734, option=[Shake, null, null, null, drop] +item=Vase of water, id=3735, option=[Shake, null, null, null, drop] +item=Frozen vase, id=3736, option=[Shake, null, null, null, drop] +item=Vase lid, id=3737, option=[null, null, null, null, drop] +item=Sealed vase, id=3738, option=[Remove-lid, null, null, null, drop] +item=Sealed vase, id=3739, option=[Remove-lid, null, null, null, drop] +item=Sealed vase, id=3740, option=[Remove-lid, null, null, null, drop] +item=Frozen key, id=3741, option=[null, null, null, null, drop] +item=Red herring, id=3742, option=[null, null, null, null, drop] +item=Red disk, id=3743, option=[null, null, null, null, drop] +item=Wooden disk, id=3744, option=[null, null, null, null, drop] +item=Seer's key, id=3745, option=[null, null, null, null, drop] +item=Sticky red goop, id=3746, option=[null, null, null, null, drop] +item=Sticky red goop, id=3747, option=[null, null, null, null, drop] +item=Fremennik helm, id=3748, option=[null, Wear, null, null, drop] +item=Archer helm, id=3749, option=[null, Wear, null, null, drop] +item=Archer helm, id=3750, option=[null, null, null, null, drop] +item=Berserker helm, id=3751, option=[null, Wear, null, null, drop] +item=Berserker helm, id=3752, option=[null, null, null, null, drop] +item=Warrior helm, id=3753, option=[null, Wear, null, null, drop] +item=Warrior helm, id=3754, option=[null, null, null, null, drop] +item=Farseer helm, id=3755, option=[null, Wear, null, null, drop] +item=Farseer helm, id=3756, option=[null, null, null, null, drop] +item=Fremennik blade, id=3757, option=[null, Wield, null, null, drop] +item=Fremennik shield, id=3758, option=[null, Wield, null, null, drop] +item=Fremennik cloak, id=3759, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3760, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3761, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3762, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3763, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3764, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3765, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3766, option=[null, null, null, null, drop] +item=Fremennik shirt, id=3767, option=[null, Wear, null, null, drop] +item=Fremennik shirt, id=3768, option=[null, null, null, null, drop] +item=Fremennik shirt, id=3769, option=[null, Wear, null, null, drop] +item=Fremennik shirt, id=3770, option=[null, null, null, null, drop] +item=Fremennik shirt, id=3771, option=[null, Wear, null, null, drop] +item=Fremennik shirt, id=3772, option=[null, null, null, null, drop] +item=Fremennik shirt, id=3773, option=[null, Wear, null, null, drop] +item=Fremennik shirt, id=3774, option=[null, null, null, null, drop] +item=Fremennik shirt, id=3775, option=[null, Wear, null, null, drop] +item=Fremennik shirt, id=3776, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3777, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3778, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3779, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3780, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3781, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3782, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3783, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3784, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3785, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3786, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3787, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3788, option=[null, null, null, null, drop] +item=Fremennik cloak, id=3789, option=[null, Wear, null, null, drop] +item=Fremennik cloak, id=3790, option=[null, null, null, null, drop] +item=Fremennik boots, id=3791, option=[null, Wear, null, null, drop] +item=Fremennik boots, id=3792, option=[null, null, null, null, drop] +item=Fremennik robe, id=3793, option=[null, Wear, null, null, drop] +item=Fremennik robe, id=3794, option=[null, null, null, null, drop] +item=Fremennik skirt, id=3795, option=[null, Wear, null, null, drop] +item=Fremennik skirt, id=3796, option=[null, null, null, null, drop] +item=Fremennik hat, id=3797, option=[null, Wear, null, null, drop] +item=Fremennik hat, id=3798, option=[null, null, null, null, drop] +item=Gloves, id=3799, option=[null, Wear, null, null, drop] +item=Gloves, id=3800, option=[null, null, null, null, drop] +item=Keg of beer, id=3801, option=[Drink, null, null, null, drop] +item=Keg of beer, id=3802, option=[null, null, null, null, drop] +item=Beer, id=3803, option=[Drink, null, null, null, drop] +item=Beer, id=3804, option=[null, null, null, null, drop] +item=Tankard, id=3805, option=[null, null, null, null, drop] +item=Tankard, id=3806, option=[null, null, null, null, drop] +item=null, id=3807, option=[null, null, null, null, drop] +item=null, id=3808, option=[null, null, null, null, drop] +item=null, id=3809, option=[null, null, null, null, drop] +item=null, id=3810, option=[null, null, null, null, drop] +item=null, id=3811, option=[null, null, null, null, drop] +item=null, id=3812, option=[null, null, null, null, drop] +item=null, id=3813, option=[null, null, null, null, drop] +item=null, id=3814, option=[null, null, null, null, drop] +item=null, id=3815, option=[null, null, null, null, drop] +item=null, id=3816, option=[null, null, null, null, drop] +item=null, id=3817, option=[null, null, null, null, drop] +item=null, id=3818, option=[null, null, null, null, drop] +item=null, id=3819, option=[null, null, null, null, drop] +item=null, id=3820, option=[null, null, null, null, drop] +item=null, id=3821, option=[null, null, null, null, drop] +item=null, id=3822, option=[null, null, null, null, drop] +item=null, id=3823, option=[null, null, null, null, drop] +item=null, id=3824, option=[null, null, null, null, drop] +item=null, id=3825, option=[null, null, null, null, drop] +item=null, id=3826, option=[null, null, null, null, drop] +item=Saradomin page 1, id=3827, option=[null, null, null, null, drop] +item=Saradomin page 2, id=3828, option=[null, null, null, null, drop] +item=Saradomin page 3, id=3829, option=[null, null, null, null, drop] +item=Saradomin page 4, id=3830, option=[null, null, null, null, drop] +item=Zamorak page 1, id=3831, option=[null, null, null, null, drop] +item=Zamorak page 2, id=3832, option=[null, null, null, null, drop] +item=Zamorak page 3, id=3833, option=[null, null, null, null, drop] +item=Zamorak page 4, id=3834, option=[null, null, null, null, drop] +item=Guthix page 1, id=3835, option=[null, null, null, null, drop] +item=Guthix page 2, id=3836, option=[null, null, null, null, drop] +item=Guthix page 3, id=3837, option=[null, null, null, null, drop] +item=Guthix page 4, id=3838, option=[null, null, null, null, drop] +item=Damaged book, id=3839, option=[null, Wield, Check, null, drop] +item=Holy book, id=3840, option=[null, Wield, Preach, null, drop] +item=Damaged book, id=3841, option=[null, Wield, Check, null, drop] +item=Unholy book, id=3842, option=[null, Wield, Preach, null, drop] +item=Damaged book, id=3843, option=[null, Wield, Check, null, drop] +item=Book of balance, id=3844, option=[null, Wield, Preach, null, drop] +item=Journal, id=3845, option=[Read, null, null, null, drop] +item=Diary, id=3846, option=[Read, null, null, null, drop] +item=Manual, id=3847, option=[Read, null, null, null, drop] +item=Lighthouse key, id=3848, option=[null, null, null, null, drop] +item=Rusty casket, id=3849, option=[null, null, null, null, drop] +item=null, id=3850, option=[null, null, null, null, drop] +item=Whoopsie, id=3851, option=[Wear, null, null, null, drop] +item=Unholy symbol, id=3852, option=[null, null, null, null, drop] +item=Games necklace(8), id=3853, option=[null, Wear, null, Rub, drop] +item=Games necklace(8), id=3854, option=[null, null, null, null, drop] +item=Games necklace(7), id=3855, option=[null, Wear, null, Rub, drop] +item=Games necklace(7), id=3856, option=[null, null, null, null, drop] +item=Games necklace(6), id=3857, option=[null, Wear, null, Rub, drop] +item=Games necklace(6), id=3858, option=[null, null, null, null, drop] +item=Games necklace(5), id=3859, option=[null, Wear, null, Rub, drop] +item=Games necklace(5), id=3860, option=[null, null, null, null, drop] +item=Games necklace(4), id=3861, option=[null, Wear, null, Rub, drop] +item=Games necklace(4), id=3862, option=[null, null, null, null, drop] +item=Games necklace(3), id=3863, option=[null, Wear, null, Rub, drop] +item=Games necklace(3), id=3864, option=[null, null, null, null, drop] +item=Games necklace(2), id=3865, option=[null, Wear, null, Rub, drop] +item=Games necklace(2), id=3866, option=[null, null, null, null, drop] +item=Games necklace(1), id=3867, option=[null, Wear, null, Rub, drop] +item=Games necklace(1), id=3868, option=[null, null, null, null, drop] +item=Board game piece, id=3869, option=[null, null, null, null, drop] +item=Board game piece, id=3870, option=[null, null, null, null, drop] +item=Board game piece, id=3871, option=[null, null, null, null, drop] +item=Board game piece, id=3872, option=[null, null, null, null, drop] +item=Board game piece, id=3873, option=[null, null, null, null, drop] +item=Board game piece, id=3874, option=[null, null, null, null, drop] +item=Board game piece, id=3875, option=[null, null, null, null, drop] +item=Board game piece, id=3876, option=[null, null, null, null, drop] +item=Board game piece, id=3877, option=[null, null, null, null, drop] +item=Board game piece, id=3878, option=[null, null, null, null, drop] +item=Board game piece, id=3879, option=[null, null, null, null, drop] +item=Board game piece, id=3880, option=[null, null, null, null, drop] +item=Board game piece, id=3881, option=[null, null, null, null, drop] +item=Board game piece, id=3882, option=[null, null, null, null, drop] +item=Board game piece, id=3883, option=[null, null, null, null, drop] +item=Board game piece, id=3884, option=[null, null, null, null, drop] +item=Board game piece, id=3885, option=[null, null, null, null, drop] +item=Board game piece, id=3886, option=[null, null, null, null, drop] +item=Board game piece, id=3887, option=[null, null, null, null, drop] +item=Board game piece, id=3888, option=[null, null, null, null, drop] +item=Board game piece, id=3889, option=[null, null, null, null, drop] +item=Board game piece, id=3890, option=[null, null, null, null, drop] +item=Board game piece, id=3891, option=[null, null, null, null, drop] +item=Board game piece, id=3892, option=[null, null, null, null, drop] +item=Stool, id=3893, option=[null, null, null, null, drop] +item=Awful anthem, id=3894, option=[null, null, null, null, drop] +item=Good anthem, id=3895, option=[null, null, null, null, drop] +item=Treaty, id=3896, option=[null, null, null, null, drop] +item=Giant nib, id=3897, option=[null, null, null, null, drop] +item=Giant pen, id=3898, option=[null, null, null, null, drop] +item=Iron sickle, id=3899, option=[null, Wield, null, null, drop] +item=Whoopsie, id=3900, option=[null, null, null, null, drop] +item=Ghrim's book, id=3901, option=[Read, null, null, null, drop] +item=Sliding button, id=3902, option=[Open, null, null, null, drop] +item=Whoopsie, id=3903, option=[null, null, null, null, drop] +item=Sliding button, id=3904, option=[null, null, null, null, Move] +item=Whoopsie, id=3905, option=[Wear, null, null, null, drop] +item=Sliding button, id=3906, option=[null, null, null, null, Move] +item=Whoopsie, id=3907, option=[Wear, null, null, null, drop] +item=Sliding button, id=3908, option=[null, null, null, null, Move] +item=Whoopsie, id=3909, option=[Wear, null, null, null, drop] +item=Sliding button, id=3910, option=[null, null, null, null, Move] +item=Whoopsie, id=3911, option=[Wear, null, null, null, drop] +item=Sliding button, id=3912, option=[null, null, null, null, Move] +item=Whoopsie, id=3913, option=[Wear, null, null, null, drop] +item=Sliding button, id=3914, option=[null, null, null, null, Move] +item=Whoopsie, id=3915, option=[Wear, null, null, null, drop] +item=Sliding button, id=3916, option=[null, null, null, null, Move] +item=Whoopsie, id=3917, option=[Wear, null, null, null, drop] +item=Sliding button, id=3918, option=[null, null, null, null, Move] +item=Whoopsie, id=3919, option=[Wear, null, null, null, drop] +item=Sliding button, id=3920, option=[null, null, null, null, Move] +item=Whoopsie, id=3921, option=[Wear, null, null, null, drop] +item=Sliding button, id=3922, option=[null, null, null, null, Move] +item=Whoopsie, id=3923, option=[Wear, null, null, null, drop] +item=Sliding button, id=3924, option=[null, null, null, null, Move] +item=Whoopsie, id=3925, option=[Wear, null, null, null, drop] +item=Sliding button, id=3926, option=[null, null, null, null, Move] +item=Whoopsie, id=3927, option=[Wear, null, null, null, drop] +item=Sliding button, id=3928, option=[null, null, null, null, Move] +item=Whoopsie, id=3929, option=[Wear, null, null, null, drop] +item=Sliding button, id=3930, option=[null, null, null, null, Move] +item=Whoopsie, id=3931, option=[Wear, null, null, null, drop] +item=Sliding button, id=3932, option=[null, null, null, null, Move] +item=Whoopsie, id=3933, option=[Wear, null, null, null, drop] +item=Sliding button, id=3934, option=[null, null, null, null, Move] +item=Whoopsie, id=3935, option=[Wear, null, null, null, drop] +item=Sliding button, id=3936, option=[null, null, null, null, Move] +item=Whoopsie, id=3937, option=[Wear, null, null, null, drop] +item=Sliding button, id=3938, option=[null, null, null, null, Move] +item=Whoopsie, id=3939, option=[Wear, null, null, null, drop] +item=Sliding button, id=3940, option=[null, null, null, null, Move] +item=Whoopsie, id=3941, option=[Wear, null, null, null, drop] +item=Sliding button, id=3942, option=[null, null, null, null, Move] +item=Whoopsie, id=3943, option=[Wear, null, null, null, drop] +item=Sliding button, id=3944, option=[null, null, null, null, Move] +item=Whoopsie, id=3945, option=[Wear, null, null, null, drop] +item=Sliding button, id=3946, option=[null, null, null, null, Move] +item=Whoopsie, id=3947, option=[Wear, null, null, null, drop] +item=Sliding button, id=3948, option=[null, null, null, null, Move] +item=Whoopsie, id=3949, option=[Wear, null, null, null, drop] +item=Sliding button, id=3950, option=[null, null, null, null, Move] +item=Whoopsie, id=3951, option=[Wear, null, null, null, drop] +item=Sliding button, id=3952, option=[null, null, null, null, Move] +item=Whoopsie, id=3953, option=[Wear, null, null, null, drop] +item=Sliding button, id=3954, option=[null, null, null, null, Move] +item=Whoopsie, id=3955, option=[Wear, null, null, null, drop] +item=Sliding button, id=3956, option=[null, null, null, null, Move] +item=Whoopsie, id=3957, option=[Wear, null, null, null, drop] +item=Sliding button, id=3958, option=[null, null, null, null, Move] +item=Whoopsie, id=3959, option=[Wear, null, null, null, drop] +item=Sliding button, id=3960, option=[null, null, null, null, Move] +item=Whoopsie, id=3961, option=[Wear, null, null, null, drop] +item=Sliding button, id=3962, option=[null, null, null, null, Move] +item=Whoopsie, id=3963, option=[Wear, null, null, null, drop] +item=Sliding button, id=3964, option=[null, null, null, null, Move] +item=Whoopsie, id=3965, option=[Wear, null, null, null, drop] +item=Sliding button, id=3966, option=[null, null, null, null, Move] +item=Whoopsie, id=3967, option=[Wear, null, null, null, drop] +item=Sliding button, id=3968, option=[null, null, null, null, Move] +item=Whoopsie, id=3969, option=[Wear, null, null, null, drop] +item=Sliding button, id=3970, option=[null, null, null, null, Move] +item=Whoopsie, id=3971, option=[Wear, null, null, null, drop] +item=Sliding button, id=3972, option=[null, null, null, null, Move] +item=Whoopsie, id=3973, option=[Wear, null, null, null, drop] +item=Sliding button, id=3974, option=[null, null, null, null, Move] +item=Whoopsie, id=3975, option=[Wear, null, null, null, drop] +item=Sliding button, id=3976, option=[null, null, null, null, Move] +item=Whoopsie, id=3977, option=[Wear, null, null, null, drop] +item=Sliding button, id=3978, option=[null, null, null, null, Move] +item=Whoopsie, id=3979, option=[Wear, null, null, null, drop] +item=Sliding button, id=3980, option=[null, null, null, null, Move] +item=Whoopsie, id=3981, option=[Wear, null, null, null, drop] +item=Sliding button, id=3982, option=[null, null, null, null, Move] +item=Whoopsie, id=3983, option=[Wear, null, null, null, drop] +item=Sliding button, id=3984, option=[null, null, null, null, Move] +item=Whoopsie, id=3985, option=[Wear, null, null, null, drop] +item=Sliding button, id=3986, option=[null, null, null, null, Move] +item=Whoopsie, id=3987, option=[Wear, null, null, null, drop] +item=Sliding button, id=3988, option=[null, null, null, null, Move] +item=Whoopsie, id=3989, option=[Wear, null, null, null, drop] +item=Sliding button, id=3990, option=[null, null, null, null, Move] +item=Whoopsie, id=3991, option=[Wear, null, null, null, drop] +item=Sliding button, id=3992, option=[null, null, null, null, Move] +item=Whoopsie, id=3993, option=[Wear, null, null, null, drop] +item=Sliding button, id=3994, option=[null, null, null, null, Move] +item=Whoopsie, id=3995, option=[Wear, null, null, null, drop] +item=Sliding button, id=3996, option=[null, null, null, null, Move] +item=Whoopsie, id=3997, option=[Wear, null, null, null, drop] +item=Sliding button, id=3998, option=[null, null, null, null, Move] +item=Whoopsie, id=3999, option=[Wear, null, null, null, drop] +item=Iodine, id=4000, option=[Wear, null, null, null, drop] +item=Hardy gout tuber, id=4001, option=[null, null, null, null, drop] +item=Spare controls, id=4002, option=[View, null, null, null, drop] +item=Whoopsie, id=4003, option=[null, null, null, null, drop] +item=Gnome royal seal, id=4004, option=[null, null, null, null, drop] +item=Narnode's orders, id=4005, option=[null, null, null, null, drop] +item=Monkey dentures, id=4006, option=[null, null, null, Listen, drop] +item=Enchanted bar, id=4007, option=[null, null, null, Listen, drop] +item=Eye of gnome, id=4008, option=[null, null, null, null, drop] +item=Eye of gnome, id=4009, option=[null, null, null, null, drop] +item=Monkey magic, id=4010, option=[null, null, null, null, drop] +item=Whoopsie, id=4011, option=[null, null, null, null, drop] +item=Monkey nuts, id=4012, option=[Eat, null, null, null, drop] +item=Whoopsie, id=4013, option=[null, null, null, null, drop] +item=Monkey bar, id=4014, option=[Eat, null, null, null, drop] +item=Whoopsie, id=4015, option=[null, null, null, null, drop] +item=Banana stew, id=4016, option=[Eat, null, null, null, drop] +item=Whoopsie, id=4017, option=[null, null, null, null, drop] +item=Monkey wrench, id=4018, option=[null, null, null, null, drop] +item=Whoopsie, id=4019, option=[null, null, null, null, drop] +item=M'amulet mould, id=4020, option=[null, null, null, null, drop] +item=M'speak amulet, id=4021, option=[null, Wear, null, null, drop] +item=M'speak amulet, id=4022, option=[null, null, null, null, drop] +item=Monkey talisman, id=4023, option=[null, Hold, null, null, drop] +item=Monkey greegree, id=4024, option=[null, Hold, null, null, drop] +item=Monkey greegree, id=4025, option=[null, Hold, null, null, drop] +item=Monkey greegree, id=4026, option=[null, Hold, null, null, drop] +item=Monkey greegree, id=4027, option=[null, Hold, null, null, drop] +item=Monkey greegree, id=4028, option=[null, Hold, null, null, drop] +item=Monkey greegree, id=4029, option=[null, Hold, null, null, drop] +item=Monkey greegree, id=4030, option=[null, Hold, null, null, drop] +item=Monkey greegree, id=4031, option=[null, Hold, null, null, drop] +item=Dummy, id=4032, option=[null, null, null, null, drop] +item=Monkey, id=4033, option=[Poke, null, null, null, drop] +item=Monkey skull, id=4034, option=[null, null, null, null, drop] +item=10th squad sigil, id=4035, option=[null, Wear, null, null, drop] +item=Whoopsie, id=4036, option=[Wear, null, null, null, drop] +item=Saradomin banner, id=4037, option=[null, Wield, null, null, drop] +item=Saradomin banner, id=4038, option=[null, null, null, null, drop] +item=Zamorak banner, id=4039, option=[null, Wield, null, null, drop] +item=Zamorak banner, id=4040, option=[null, null, null, null, drop] +item=Hooded cloak, id=4041, option=[null, Wear, null, null, drop] +item=Hooded cloak, id=4042, option=[null, Wear, null, null, drop] +item=Rock, id=4043, option=[null, null, null, null, drop] +item=Rock, id=4044, option=[null, null, null, null, drop] +item=Explosive potion, id=4045, option=[null, null, null, null, drop] +item=Explosive potion, id=4046, option=[null, null, null, null, drop] +item=Climbing rope, id=4047, option=[null, null, null, null, drop] +item=Climbing rope, id=4048, option=[null, null, null, null, drop] +item=Bandages, id=4049, option=[Heal, null, null, null, drop] +item=Bandages, id=4050, option=[null, null, null, null, drop] +item=Toolkit, id=4051, option=[null, null, null, null, drop] +item=Toolkit, id=4052, option=[null, null, null, null, drop] +item=Barricade, id=4053, option=[Set-up, null, null, null, drop] +item=Barricade, id=4054, option=[null, null, null, null, drop] +item=Castlewars manual, id=4055, option=[Read, null, null, null, drop] +item=null, id=4056, option=[null, null, null, null, drop] +item=null, id=4057, option=[null, null, null, null, drop] +item=null, id=4058, option=[null, null, null, null, drop] +item=null, id=4059, option=[null, null, null, null, drop] +item=null, id=4060, option=[null, null, null, null, drop] +item=null, id=4061, option=[null, null, null, null, drop] +item=null, id=4062, option=[null, null, null, null, drop] +item=null, id=4063, option=[null, null, null, null, drop] +item=null, id=4064, option=[null, null, null, null, drop] +item=null, id=4065, option=[null, null, null, null, drop] +item=null, id=4066, option=[null, null, null, null, drop] +item=Castle wars ticket, id=4067, option=[null, null, null, null, drop] +item=Decorative sword, id=4068, option=[null, Wield, null, null, drop] +item=Decorative armour, id=4069, option=[null, Wear, null, null, drop] +item=Decorative armour, id=4070, option=[null, Wear, null, null, drop] +item=Decorative helm, id=4071, option=[null, Wear, null, null, drop] +item=Decorative shield, id=4072, option=[null, Wear, null, null, drop] +item=Damp tinderbox, id=4073, option=[null, null, null, null, drop] +item=Damp tinderbox, id=4074, option=[null, null, null, null, drop] +item=Glowing fungus, id=4075, option=[null, null, null, null, drop] +item=Nezikchened's mum, id=4076, option=[Wear, null, null, null, drop] +item=Crystal-mine key, id=4077, option=[null, null, null, null, drop] +item=Zealot's key, id=4078, option=[null, null, null, null, drop] +item=Yo-yo, id=4079, option=[Play, Loop, Walk, Crazy, drop] +item=null, id=4080, option=[null, null, null, null, drop] +item=Salve amulet, id=4081, option=[null, Wear, null, null, drop] +item=Salve shard, id=4082, option=[null, null, null, null, drop] +item=Sled, id=4083, option=[null, null, null, null, drop] +item=Sled, id=4084, option=[null, Ride, null, null, drop] +item=Wax, id=4085, option=[null, null, null, null, drop] +item=Trollweiss, id=4086, option=[null, Wield, null, null, drop] +item=Dragon platelegs, id=4087, option=[null, Wear, null, null, drop] +item=Dragon platelegs, id=4088, option=[null, null, null, null, drop] +item=Mystic hat, id=4089, option=[null, Wear, null, null, drop] +item=Mystic hat, id=4090, option=[null, null, null, null, drop] +item=Mystic robe top, id=4091, option=[null, Wear, null, null, drop] +item=Mystic robe top, id=4092, option=[null, null, null, null, drop] +item=Mystic robe bottom, id=4093, option=[null, Wear, null, null, drop] +item=Mystic robe bottom, id=4094, option=[null, null, null, null, drop] +item=Mystic gloves, id=4095, option=[null, Wear, null, null, drop] +item=Mystic gloves, id=4096, option=[null, null, null, null, drop] +item=Mystic boots, id=4097, option=[null, Wear, null, null, drop] +item=Mystic boots, id=4098, option=[null, null, null, null, drop] +item=Mystic hat, id=4099, option=[null, Wear, null, null, drop] +item=Mystic hat, id=4100, option=[null, null, null, null, drop] +item=Mystic robe top, id=4101, option=[null, Wear, null, null, drop] +item=Mystic robe top, id=4102, option=[null, null, null, null, drop] +item=Mystic robe bottom, id=4103, option=[null, Wear, null, null, drop] +item=Mystic robe bottom, id=4104, option=[null, null, null, null, drop] +item=Mystic gloves, id=4105, option=[null, Wear, null, null, drop] +item=Mystic gloves, id=4106, option=[null, null, null, null, drop] +item=Mystic boots, id=4107, option=[null, Wear, null, null, drop] +item=Mystic boots, id=4108, option=[null, null, null, null, drop] +item=Mystic hat, id=4109, option=[null, Wear, null, null, drop] +item=Mystic hat, id=4110, option=[null, null, null, null, drop] +item=Mystic robe top, id=4111, option=[null, Wear, null, null, drop] +item=Mystic robe top, id=4112, option=[null, null, null, null, drop] +item=Mystic robe bottom, id=4113, option=[null, Wear, null, null, drop] +item=Mystic robe bottom, id=4114, option=[null, null, null, null, drop] +item=Mystic gloves, id=4115, option=[null, Wear, null, null, drop] +item=Mystic gloves, id=4116, option=[null, null, null, null, drop] +item=Mystic boots, id=4117, option=[null, Wear, null, null, drop] +item=Mystic boots, id=4118, option=[null, null, null, null, drop] +item=Bronze boots, id=4119, option=[null, Wear, null, null, drop] +item=Bronze boots, id=4120, option=[null, null, null, null, drop] +item=Iron boots, id=4121, option=[null, Wear, null, null, drop] +item=Iron boots, id=4122, option=[null, null, null, null, drop] +item=Steel boots, id=4123, option=[null, Wear, null, null, drop] +item=Steel boots, id=4124, option=[null, null, null, null, drop] +item=Black boots, id=4125, option=[null, Wear, null, null, drop] +item=Black boots, id=4126, option=[null, null, null, null, drop] +item=Mithril boots, id=4127, option=[null, Wear, null, null, drop] +item=Mithril boots, id=4128, option=[null, null, null, null, drop] +item=Adamant boots, id=4129, option=[null, Wear, null, null, drop] +item=Adamant boots, id=4130, option=[null, null, null, null, drop] +item=Rune boots, id=4131, option=[null, Wear, null, null, drop] +item=Rune boots, id=4132, option=[null, null, null, null, drop] +item=Crawling hand, id=4133, option=[null, null, null, null, drop] +item=Cave crawler, id=4134, option=[null, null, null, null, drop] +item=Banshee, id=4135, option=[null, null, null, null, drop] +item=Rockslug, id=4136, option=[null, null, null, null, drop] +item=Cockatrice, id=4137, option=[null, null, null, null, drop] +item=Pyrefiend, id=4138, option=[null, null, null, null, drop] +item=Basilisk, id=4139, option=[null, null, null, null, drop] +item=Infernal mage, id=4140, option=[null, null, null, null, drop] +item=Bloodveld, id=4141, option=[null, null, null, null, drop] +item=Jelly, id=4142, option=[null, null, null, null, drop] +item=Turoth, id=4143, option=[null, null, null, null, drop] +item=Aberrant spectre, id=4144, option=[null, null, null, null, drop] +item=Dust devil, id=4145, option=[null, null, null, null, drop] +item=Kurask, id=4146, option=[null, null, null, null, drop] +item=Gargoyle, id=4147, option=[null, null, null, null, drop] +item=Nechryael, id=4148, option=[null, null, null, null, drop] +item=Abyssal demon, id=4149, option=[null, null, null, null, drop] +item=Broad arrows, id=4150, option=[null, null, null, null, drop] +item=Abyssal whip, id=4151, option=[null, Wield, null, null, drop] +item=Abyssal whip, id=4152, option=[null, null, null, null, drop] +item=Granite maul, id=4153, option=[null, Wield, null, null, drop] +item=Granite maul, id=4154, option=[null, null, null, null, drop] +item=Enchanted gem, id=4155, option=[Activate, null, null, null, drop] +item=Mirror shield, id=4156, option=[null, Wield, null, null, drop] +item=Mirror shield, id=4157, option=[null, null, null, null, drop] +item=Leaf-bladed spear, id=4158, option=[null, Wield, null, null, drop] +item=Leaf-bladed spear, id=4159, option=[null, Wield, null, null, drop] +item=Broad arrow, id=4160, option=[null, Wield, null, null, drop] +item=Bag of salt, id=4161, option=[null, null, null, null, drop] +item=Rock hammer, id=4162, option=[null, null, null, null, drop] +item=Rock hammer, id=4163, option=[null, null, null, null, drop] +item=Facemask, id=4164, option=[null, Wear, null, null, drop] +item=Facemask, id=4165, option=[null, null, null, null, drop] +item=Earmuffs, id=4166, option=[null, Wear, null, null, drop] +item=Earmuffs, id=4167, option=[null, null, null, null, drop] +item=Nose peg, id=4168, option=[null, Wear, null, null, drop] +item=Nose peg, id=4169, option=[null, null, null, null, drop] +item=Slayer's staff, id=4170, option=[null, Wield, null, null, drop] +item=Slayer's staff, id=4171, option=[null, null, null, null, drop] +item=Broad arrows, id=4172, option=[null, Wield, null, null, drop] +item=Broad arrows, id=4173, option=[null, Wield, null, null, drop] +item=Broad arrows, id=4174, option=[null, Wield, null, null, drop] +item=Broad arrows, id=4175, option=[null, Wield, null, null, drop] +item=null, id=4176, option=[null, null, null, null, drop] +item=Wolfbane lever, id=4177, option=[Push, Pull, Abuse, Pluck, drop] +item=Abyssal whip, id=4178, option=[null, Wield, null, null, drop] +item=Stick, id=4179, option=[null, null, null, null, drop] +item=Dragon platelegs, id=4180, option=[null, Wear, null, null, drop] +item=Mouth grip, id=4181, option=[null, Wear, null, null, drop] +item=Goutweed, id=4182, option=[null, null, null, null, drop] +item=Star amulet, id=4183, option=[null, null, null, null, drop] +item=Cavern key, id=4184, option=[null, null, null, null, drop] +item=Tower key, id=4185, option=[null, null, null, null, drop] +item=Shed key, id=4186, option=[null, null, null, null, drop] +item=Marble amulet, id=4187, option=[null, null, null, null, drop] +item=Obsidian amulet, id=4188, option=[null, null, null, null, drop] +item=Garden cane, id=4189, option=[null, null, null, null, drop] +item=Garden brush, id=4190, option=[null, null, null, null, drop] +item=Extended brush, id=4191, option=[null, null, null, null, drop] +item=Extended brush, id=4192, option=[null, null, null, null, drop] +item=Extended brush, id=4193, option=[null, null, null, null, drop] +item=Torso, id=4194, option=[null, null, null, null, drop] +item=Arms, id=4195, option=[null, null, null, null, drop] +item=Legs, id=4196, option=[null, null, null, null, drop] +item=Decapitated head, id=4197, option=[null, null, null, null, drop] +item=Decapitated head, id=4198, option=[null, null, null, null, drop] +item=Pickled brain, id=4199, option=[null, null, null, null, drop] +item=Conductor mould, id=4200, option=[null, null, null, null, drop] +item=Conductor, id=4201, option=[null, null, null, null, drop] +item=Ring of charos, id=4202, option=[null, Wear, null, null, drop] +item=Journal, id=4203, option=[null, null, null, null, drop] +item=Letter, id=4204, option=[Read, null, null, null, drop] +item=Consecration seed, id=4205, option=[null, null, null, null, drop] +item=Consecration seed, id=4206, option=[Plant, null, null, null, drop] +item=Crystal seed, id=4207, option=[null, null, null, null, drop] +item=Crystal seed, id=4208, option=[null, null, null, null, drop] +item=Cadarn lineage, id=4209, option=[Read, null, null, null, drop] +item=Whoopsie, id=4210, option=[null, null, null, null, drop] +item=Elf crystal, id=4211, option=[null, null, null, null, drop] +item=New crystal bow, id=4212, option=[null, Wield, null, null, drop] +item=New crystal bow, id=4213, option=[null, null, null, null, drop] +item=Crystal bow full, id=4214, option=[null, Wield, null, null, drop] +item=Crystal bow 9/10, id=4215, option=[null, Wield, null, null, drop] +item=Crystal bow 8/10, id=4216, option=[null, Wield, null, null, drop] +item=Crystal bow 7/10, id=4217, option=[null, Wield, null, null, drop] +item=Crystal bow 6/10, id=4218, option=[null, Wield, null, null, drop] +item=Crystal bow 5/10, id=4219, option=[null, Wield, null, null, drop] +item=Crystal bow 4/10, id=4220, option=[null, Wield, null, null, drop] +item=Crystal bow 3/10, id=4221, option=[null, Wield, null, null, drop] +item=Crystal bow 2/10, id=4222, option=[null, Wield, null, null, drop] +item=Crystal bow 1/10, id=4223, option=[null, Wield, null, null, drop] +item=New crystal shield, id=4224, option=[null, Wield, null, null, drop] +item=Crystal shield full, id=4225, option=[null, Wield, null, null, drop] +item=Crystal shield 9/10, id=4226, option=[null, Wield, null, null, drop] +item=Crystal shield 8/10, id=4227, option=[null, Wield, null, null, drop] +item=Crystal shield 7/10, id=4228, option=[null, Wield, null, null, drop] +item=Crystal shield 6/10, id=4229, option=[null, Wield, null, null, drop] +item=Crystal shield 5/10, id=4230, option=[null, Wield, null, null, drop] +item=Crystal shield 4/10, id=4231, option=[null, Wield, null, null, drop] +item=Crystal shield 3/10, id=4232, option=[null, Wield, null, null, drop] +item=Crystal shield 2/10, id=4233, option=[null, Wield, null, null, drop] +item=Crystal shield 1/10, id=4234, option=[null, Wield, null, null, drop] +item=New crystal shield, id=4235, option=[null, null, null, null, drop] +item=Signed oak bow, id=4236, option=[null, Wield, null, null, drop] +item=Nettle-water, id=4237, option=[null, Drink, Empty, null, drop] +item=Puddle of slime, id=4238, option=[null, null, null, null, drop] +item=Nettle tea, id=4239, option=[null, Drink, Empty, null, drop] +item=Nettle tea, id=4240, option=[null, Drink, Empty, null, drop] +item=Nettles, id=4241, option=[null, null, null, null, drop] +item=Cup of tea, id=4242, option=[null, Drink, Empty, null, drop] +item=Cup of tea, id=4243, option=[null, Drink, Empty, null, drop] +item=Porcelain cup, id=4244, option=[null, null, null, null, drop] +item=Cup of tea, id=4245, option=[null, Drink, Empty, null, drop] +item=Cup of tea, id=4246, option=[null, Drink, Empty, null, drop] +item=Mystical robes, id=4247, option=[null, null, null, null, drop] +item=Book of haricanto, id=4248, option=[null, null, null, null, drop] +item=Translation manual, id=4249, option=[null, null, null, null, drop] +item=Ghostspeak amulet, id=4250, option=[null, Wear, null, null, drop] +item=Ectophial, id=4251, option=[Empty, null, null, null, drop] +item=Ectophial, id=4252, option=[null, null, null, null, drop] +item=Model ship, id=4253, option=[Repair, null, null, null, drop] +item=Model ship, id=4254, option=[Inspect, null, null, null, drop] +item=Bonemeal, id=4255, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4256, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4257, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4258, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4259, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4260, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4261, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4262, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4263, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4264, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4265, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4266, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4267, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4268, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4269, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4270, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4271, option=[null, Empty, null, null, drop] +item=Bone key, id=4272, option=[null, null, null, null, drop] +item=Chest key, id=4273, option=[null, null, null, null, drop] +item=Map scrap, id=4274, option=[null, null, null, null, drop] +item=Map scrap, id=4275, option=[null, null, null, null, drop] +item=Map scrap, id=4276, option=[null, null, null, null, drop] +item=Treasure map, id=4277, option=[Read, Follow, null, null, drop] +item=Ecto-token, id=4278, option=[null, null, null, null, drop] +item=null, id=4279, option=[null, null, null, null, drop] +item=Whoopsie, id=4280, option=[Wear, null, null, null, drop] +item=null, id=4281, option=[null, null, null, null, drop] +item=Whoopsie, id=4282, option=[Wear, null, null, null, drop] +item=Petition form, id=4283, option=[Count, null, null, null, drop] +item=Bedsheet, id=4284, option=[null, Wear, null, null, drop] +item=Bedsheet, id=4285, option=[null, Wear, null, null, drop] +item=Bucket of slime, id=4286, option=[null, null, null, Empty, drop] +item=Raw beef, id=4287, option=[null, null, null, null, drop] +item=Raw beef, id=4288, option=[null, null, null, null, drop] +item=Raw chicken, id=4289, option=[null, null, null, null, drop] +item=Raw chicken, id=4290, option=[null, null, null, null, drop] +item=Cooked chicken, id=4291, option=[Eat, null, null, null, drop] +item=Cooked chicken, id=4292, option=[null, null, null, null, drop] +item=Cooked meat, id=4293, option=[Eat, null, null, null, drop] +item=Cooked meat, id=4294, option=[null, null, null, null, drop] +item=Female h.a.m., id=4295, option=[null, null, null, null, drop] +item=Whoopsie, id=4296, option=[Wear, null, null, null, drop] +item=Male h.a.m., id=4297, option=[null, null, null, null, drop] +item=Ham shirt, id=4298, option=[null, Wear, null, null, drop] +item=Ham shirt, id=4299, option=[null, null, null, null, drop] +item=Ham robe, id=4300, option=[null, Wear, null, null, drop] +item=Ham robe, id=4301, option=[null, null, null, null, drop] +item=Ham hood, id=4302, option=[null, Wear, null, null, drop] +item=Ham hood, id=4303, option=[null, null, null, null, drop] +item=Ham cloak, id=4304, option=[null, Wear, null, null, drop] +item=Ham cloak, id=4305, option=[null, null, null, null, drop] +item=H.a.m logo, id=4306, option=[null, Wear, null, null, drop] +item=H.a.m logo, id=4307, option=[null, null, null, null, drop] +item=Gloves, id=4308, option=[null, Wear, null, null, drop] +item=Gloves, id=4309, option=[null, null, null, null, drop] +item=Boots, id=4310, option=[null, Wear, null, null, drop] +item=Boots, id=4311, option=[null, null, null, null, drop] +item=Whoopsie, id=4312, option=[Wear, null, null, null, drop] +item=Crystal of seren, id=4313, option=[Read, null, null, null, drop] +item=Whoopsie, id=4314, option=[null, null, null, null, drop] +item=Team-1 cape, id=4315, option=[null, Wear, null, null, drop] +item=Team-1 cape, id=4316, option=[null, null, null, null, drop] +item=Team-2 cape, id=4317, option=[null, Wear, null, null, drop] +item=Team-2 cape, id=4318, option=[null, null, null, null, drop] +item=Team-3 cape, id=4319, option=[null, Wear, null, null, drop] +item=Team-3 cape, id=4320, option=[null, null, null, null, drop] +item=Team-4 cape, id=4321, option=[null, Wear, null, null, drop] +item=Team-4 cape, id=4322, option=[null, null, null, null, drop] +item=Team-5 cape, id=4323, option=[null, Wear, null, null, drop] +item=Team-5 cape, id=4324, option=[null, null, null, null, drop] +item=Team-6 cape, id=4325, option=[null, Wear, null, null, drop] +item=Team-6 cape, id=4326, option=[null, null, null, null, drop] +item=Team-7 cape, id=4327, option=[null, Wear, null, null, drop] +item=Team-7 cape, id=4328, option=[null, null, null, null, drop] +item=Team-8 cape, id=4329, option=[null, Wear, null, null, drop] +item=Team-8 cape, id=4330, option=[null, null, null, null, drop] +item=Team-9 cape, id=4331, option=[null, Wear, null, null, drop] +item=Team-9 cape, id=4332, option=[null, null, null, null, drop] +item=Team-10 cape, id=4333, option=[null, Wear, null, null, drop] +item=Team-10 cape, id=4334, option=[null, null, null, null, drop] +item=Team-11 cape, id=4335, option=[null, Wear, null, null, drop] +item=Team-11 cape, id=4336, option=[null, null, null, null, drop] +item=Team-12 cape, id=4337, option=[null, Wear, null, null, drop] +item=Team-12 cape, id=4338, option=[null, null, null, null, drop] +item=Team-13 cape, id=4339, option=[null, Wear, null, null, drop] +item=Team-13 cape, id=4340, option=[null, null, null, null, drop] +item=Team-14 cape, id=4341, option=[null, Wear, null, null, drop] +item=Team-14 cape, id=4342, option=[null, null, null, null, drop] +item=Team-15 cape, id=4343, option=[null, Wear, null, null, drop] +item=Team-15 cape, id=4344, option=[null, null, null, null, drop] +item=Team-16 cape, id=4345, option=[null, Wear, null, null, drop] +item=Team-16 cape, id=4346, option=[null, null, null, null, drop] +item=Team-17 cape, id=4347, option=[null, Wear, null, null, drop] +item=Team-17 cape, id=4348, option=[null, null, null, null, drop] +item=Team-18 cape, id=4349, option=[null, Wear, null, null, drop] +item=Team-18 cape, id=4350, option=[null, null, null, null, drop] +item=Team-19 cape, id=4351, option=[null, Wear, null, null, drop] +item=Team-19 cape, id=4352, option=[null, null, null, null, drop] +item=Team-20 cape, id=4353, option=[null, Wear, null, null, drop] +item=Team-20 cape, id=4354, option=[null, null, null, null, drop] +item=Team-21 cape, id=4355, option=[null, Wear, null, null, drop] +item=Team-21 cape, id=4356, option=[null, null, null, null, drop] +item=Team-22 cape, id=4357, option=[null, Wear, null, null, drop] +item=Team-22 cape, id=4358, option=[null, null, null, null, drop] +item=Team-23 cape, id=4359, option=[null, Wear, null, null, drop] +item=Team-23 cape, id=4360, option=[null, null, null, null, drop] +item=Team-24 cape, id=4361, option=[null, Wear, null, null, drop] +item=Team-24 cape, id=4362, option=[null, null, null, null, drop] +item=Team-25 cape, id=4363, option=[null, Wear, null, null, drop] +item=Team-25 cape, id=4364, option=[null, null, null, null, drop] +item=Team-26 cape, id=4365, option=[null, Wear, null, null, drop] +item=Team-26 cape, id=4366, option=[null, null, null, null, drop] +item=Team-27 cape, id=4367, option=[null, Wear, null, null, drop] +item=Team-27 cape, id=4368, option=[null, null, null, null, drop] +item=Team-28 cape, id=4369, option=[null, Wear, null, null, drop] +item=Team-28 cape, id=4370, option=[null, null, null, null, drop] +item=Team-29 cape, id=4371, option=[null, Wear, null, null, drop] +item=Team-29 cape, id=4372, option=[null, null, null, null, drop] +item=Team-30 cape, id=4373, option=[null, Wear, null, null, drop] +item=Team-30 cape, id=4374, option=[null, null, null, null, drop] +item=Team-31 cape, id=4375, option=[null, Wear, null, null, drop] +item=Team-31 cape, id=4376, option=[null, null, null, null, drop] +item=Team-32 cape, id=4377, option=[null, Wear, null, null, drop] +item=Team-32 cape, id=4378, option=[null, null, null, null, drop] +item=Team-33 cape, id=4379, option=[null, Wear, null, null, drop] +item=Team-33 cape, id=4380, option=[null, null, null, null, drop] +item=Team-34 cape, id=4381, option=[null, Wear, null, null, drop] +item=Team-34 cape, id=4382, option=[null, null, null, null, drop] +item=Team-35 cape, id=4383, option=[null, Wear, null, null, drop] +item=Team-35 cape, id=4384, option=[null, null, null, null, drop] +item=Team-36 cape, id=4385, option=[null, Wear, null, null, drop] +item=Team-36 cape, id=4386, option=[null, null, null, null, drop] +item=Team-37 cape, id=4387, option=[null, Wear, null, null, drop] +item=Team-37 cape, id=4388, option=[null, null, null, null, drop] +item=Team-38 cape, id=4389, option=[null, Wear, null, null, drop] +item=Team-38 cape, id=4390, option=[null, null, null, null, drop] +item=Team-39 cape, id=4391, option=[null, Wear, null, null, drop] +item=Team-39 cape, id=4392, option=[null, null, null, null, drop] +item=Team-40 cape, id=4393, option=[null, Wear, null, null, drop] +item=Team-40 cape, id=4394, option=[null, null, null, null, drop] +item=Team-41 cape, id=4395, option=[null, Wear, null, null, drop] +item=Team-41 cape, id=4396, option=[null, null, null, null, drop] +item=Team-42 cape, id=4397, option=[null, Wear, null, null, drop] +item=Team-42 cape, id=4398, option=[null, null, null, null, drop] +item=Team-43 cape, id=4399, option=[null, Wear, null, null, drop] +item=Team-43 cape, id=4400, option=[null, null, null, null, drop] +item=Team-44 cape, id=4401, option=[null, Wear, null, null, drop] +item=Team-44 cape, id=4402, option=[null, null, null, null, drop] +item=Team-45 cape, id=4403, option=[null, Wear, null, null, drop] +item=Team-45 cape, id=4404, option=[null, null, null, null, drop] +item=Team-46 cape, id=4405, option=[null, Wear, null, null, drop] +item=Team-46 cape, id=4406, option=[null, null, null, null, drop] +item=Team-47 cape, id=4407, option=[null, Wear, null, null, drop] +item=Team-47 cape, id=4408, option=[null, null, null, null, drop] +item=Team-48 cape, id=4409, option=[null, Wear, null, null, drop] +item=Team-48 cape, id=4410, option=[null, null, null, null, drop] +item=Team-49 cape, id=4411, option=[null, Wear, null, null, drop] +item=Team-49 cape, id=4412, option=[null, null, null, null, drop] +item=Team-50 cape, id=4413, option=[null, Wear, null, null, drop] +item=Team-50 cape, id=4414, option=[null, null, null, null, drop] +item=Blunt axe, id=4415, option=[null, null, null, null, drop] +item=Herbal tincture, id=4416, option=[null, null, null, null, drop] +item=Guthix rest(4), id=4417, option=[Drink, null, null, Empty, drop] +item=Guthix rest(4), id=4418, option=[null, null, null, null, drop] +item=Guthix rest(3), id=4419, option=[Drink, null, null, Empty, drop] +item=Guthix rest(3), id=4420, option=[null, null, null, null, drop] +item=Guthix rest(2), id=4421, option=[Drink, null, null, Empty, drop] +item=Guthix rest(2), id=4422, option=[null, null, null, null, drop] +item=Guthix rest(1), id=4423, option=[Drink, null, null, Empty, drop] +item=Guthix rest(1), id=4424, option=[null, null, null, null, drop] +item=Stodgy mattress, id=4425, option=[null, null, null, null, drop] +item=Comfy mattress, id=4426, option=[null, null, null, null, drop] +item=Iron oxide, id=4427, option=[null, null, null, null, drop] +item=Animate rock scroll, id=4428, option=[Read, null, null, null, drop] +item=Broken vane part, id=4429, option=[null, null, null, null, drop] +item=Directionals, id=4430, option=[null, null, null, null, drop] +item=Broken vane part, id=4431, option=[null, null, null, null, drop] +item=Ornament, id=4432, option=[null, null, null, null, drop] +item=Broken vane part, id=4433, option=[null, null, null, null, drop] +item=Weathervane pillar, id=4434, option=[null, null, null, null, drop] +item=Weather report, id=4435, option=[Read, null, null, null, drop] +item=Airtight pot, id=4436, option=[Open, null, null, null, drop] +item=Airtight pot, id=4437, option=[null, null, null, null, drop] +item=Unfired pot lid, id=4438, option=[null, null, null, null, drop] +item=Unfired pot lid, id=4439, option=[null, null, null, null, drop] +item=Pot lid, id=4440, option=[null, null, null, null, drop] +item=Pot lid, id=4441, option=[null, null, null, null, drop] +item=Breathing salts, id=4442, option=[null, null, null, null, drop] +item=Chicken cage, id=4443, option=[null, null, null, null, drop] +item=Sharpened axe, id=4444, option=[null, null, null, null, drop] +item=Red mahogany log, id=4445, option=[null, null, null, null, drop] +item=Steel key ring, id=4446, option=[Check-keys, null, null, null, Destroy] +item=Antique lamp, id=4447, option=[Rub, null, null, null, drop] +item=null, id=4448, option=[null, null, null, null, drop] +item=Whoopsie, id=4449, option=[Wear, null, null, null, drop] +item=null, id=4450, option=[null, null, null, null, drop] +item=Whoopsie, id=4451, option=[Wear, null, null, null, drop] +item=null, id=4452, option=[null, null, null, null, drop] +item=Whoopsie, id=4453, option=[Wear, null, null, null, drop] +item=null, id=4454, option=[null, null, null, null, drop] +item=Whoopsie, id=4455, option=[Wear, null, null, null, drop] +item=Bowl of hot water, id=4456, option=[null, null, null, Empty, drop] +item=Bowl of hot water, id=4457, option=[null, null, null, null, drop] +item=Cup of water, id=4458, option=[null, null, null, Empty, drop] +item=Cup of water, id=4459, option=[null, null, null, null, drop] +item=Cup of hot water, id=4460, option=[null, null, null, Empty, drop] +item=Cup of hot water, id=4461, option=[null, null, null, null, drop] +item=Ruined herb tea, id=4462, option=[null, null, null, Empty, drop] +item=Ruined herb tea, id=4463, option=[null, null, null, null, drop] +item=Herb tea mix, id=4464, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4465, option=[null, null, null, null, drop] +item=Herb tea mix, id=4466, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4467, option=[null, null, null, null, drop] +item=Herb tea mix, id=4468, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4469, option=[null, null, null, null, drop] +item=Herb tea mix, id=4470, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4471, option=[null, null, null, null, drop] +item=Herb tea mix, id=4472, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4473, option=[null, null, null, null, drop] +item=Herb tea mix, id=4474, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4475, option=[null, null, null, null, drop] +item=Herb tea mix, id=4476, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4477, option=[null, null, null, null, drop] +item=Herb tea mix, id=4478, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4479, option=[null, null, null, null, drop] +item=Herb tea mix, id=4480, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4481, option=[null, null, null, null, drop] +item=Herb tea mix, id=4482, option=[null, null, null, Empty, drop] +item=Herb tea mix, id=4483, option=[null, null, null, null, drop] +item=Safety guarantee, id=4484, option=[null, null, null, null, drop] +item=White pearl, id=4485, option=[null, null, Eat, null, drop] +item=White pearl seed, id=4486, option=[null, null, null, null, drop] +item=Half a rock, id=4487, option=[null, null, null, null, drop] +item=Corpse of woman, id=4488, option=[null, null, Bury, null, drop] +item=Asleif's necklace, id=4489, option=[null, null, null, null, drop] +item=Mud, id=4490, option=[null, null, null, null, drop] +item=Whoopsie, id=4491, option=[null, null, null, null, drop] +item=Muddy rock, id=4492, option=[null, null, null, null, drop] +item=Whoopsie, id=4493, option=[null, null, null, null, drop] +item=Pole, id=4494, option=[null, null, null, null, drop] +item=Pole, id=4495, option=[null, null, null, null, drop] +item=Broken pole, id=4496, option=[null, null, null, null, drop] +item=Whoopsie, id=4497, option=[null, null, null, null, drop] +item=Rope, id=4498, option=[null, null, null, null, drop] +item=Rope, id=4499, option=[null, null, null, null, drop] +item=Pole, id=4500, option=[null, null, null, null, drop] +item=Pole, id=4501, option=[null, null, null, null, drop] +item=Bearhead, id=4502, option=[null, Wear, null, null, Destroy] +item=Decorative sword, id=4503, option=[null, Wield, null, null, drop] +item=Decorative armour, id=4504, option=[null, Wear, null, null, drop] +item=Decorative armour, id=4505, option=[null, Wear, null, null, drop] +item=Decorative helm, id=4506, option=[null, Wear, null, null, drop] +item=Decorative shield, id=4507, option=[null, Wear, null, null, drop] +item=Decorative sword, id=4508, option=[null, Wield, null, null, drop] +item=Decorative armour, id=4509, option=[null, Wear, null, null, drop] +item=Decorative armour, id=4510, option=[null, Wear, null, null, drop] +item=Decorative helm, id=4511, option=[null, Wear, null, null, drop] +item=Decorative shield, id=4512, option=[null, Wear, null, null, drop] +item=Castlewars hood, id=4513, option=[null, Wear, null, null, drop] +item=Castlewars cloak, id=4514, option=[null, Wear, null, null, drop] +item=Castlewars hood, id=4515, option=[null, Wear, null, null, drop] +item=Castlewars cloak, id=4516, option=[null, Wear, null, null, drop] +item=Giant frog legs, id=4517, option=[Eat, null, null, null, drop] +item=Giant frog legs, id=4518, option=[null, null, null, null, drop] +item=Swamp wallbeast, id=4519, option=[null, null, null, null, drop] +item=Swamp cave slime, id=4520, option=[null, null, null, null, drop] +item=Swamp cave bug, id=4521, option=[null, null, null, null, drop] +item=Oil lamp, id=4522, option=[null, null, null, null, drop] +item=Oil lamp, id=4523, option=[null, null, null, null, drop] +item=Oil lamp, id=4524, option=[null, Extinguish, null, null, drop] +item=Oil lamp, id=4525, option=[null, null, null, null, drop] +item=Oil lamp, id=4526, option=[null, null, null, null, drop] +item=Candle lantern, id=4527, option=[null, null, null, null, drop] +item=Candle lantern, id=4528, option=[null, null, null, null, drop] +item=Candle lantern, id=4529, option=[null, null, null, null, drop] +item=Candle lantern, id=4530, option=[null, null, null, null, drop] +item=Candle lantern, id=4531, option=[null, Extinguish, null, null, drop] +item=Candle lantern, id=4532, option=[null, null, null, null, drop] +item=Candle lantern, id=4533, option=[null, null, null, null, drop] +item=Candle lantern, id=4534, option=[null, Extinguish, null, null, drop] +item=Oil lantern, id=4535, option=[null, null, null, null, drop] +item=Oil lantern, id=4536, option=[null, null, null, null, drop] +item=Oil lantern, id=4537, option=[null, null, null, null, drop] +item=Oil lantern, id=4538, option=[null, null, null, null, drop] +item=Oil lantern, id=4539, option=[null, Extinguish, null, null, drop] +item=Oil lantern frame, id=4540, option=[null, null, null, null, drop] +item=Oil lantern frame, id=4541, option=[null, null, null, null, drop] +item=Lantern lens, id=4542, option=[null, null, null, null, drop] +item=Lantern lens, id=4543, option=[null, null, null, null, drop] +item=Bullseye lantern, id=4544, option=[null, null, null, null, drop] +item=Bullseye lantern, id=4545, option=[null, null, null, null, drop] +item=Bullseye lantern, id=4546, option=[null, null, null, null, drop] +item=Bullseye lantern, id=4547, option=[null, null, null, null, drop] +item=Bullseye lantern, id=4548, option=[null, null, null, null, drop] +item=Bullseye lantern, id=4549, option=[null, null, null, null, drop] +item=Bullseye lantern, id=4550, option=[null, Extinguish, null, null, drop] +item=Spiny helmet, id=4551, option=[null, Wear, null, null, drop] +item=Spiny helmet, id=4552, option=[null, null, null, null, drop] +item=null, id=4553, option=[null, null, null, null, drop] +item=null, id=4554, option=[null, null, null, null, drop] +item=null, id=4555, option=[null, null, null, null, drop] +item=null, id=4556, option=[null, null, null, null, drop] +item=null, id=4557, option=[null, null, null, null, drop] +item=Blue sweets, id=4558, option=[Eat, null, null, null, drop] +item=Deep blue sweets, id=4559, option=[Eat, null, null, null, drop] +item=White sweets, id=4560, option=[Eat, null, null, null, drop] +item=Purple sweets, id=4561, option=[Eat, null, null, null, drop] +item=Red sweets, id=4562, option=[Eat, null, null, null, drop] +item=Green sweets, id=4563, option=[Eat, null, null, null, drop] +item=Pink sweets, id=4564, option=[Eat, null, null, null, drop] +item=Basket of eggs, id=4565, option=[null, Wield, null, null, drop] +item=Rubber chicken, id=4566, option=[null, Wield, Dance, null, drop] +item=Gold helmet, id=4567, option=[null, Wear, null, null, drop] +item=Dwarven lore, id=4568, option=[Read, null, null, null, drop] +item=Book page 1, id=4569, option=[null, null, null, null, drop] +item=Book page 2, id=4570, option=[null, null, null, null, drop] +item=Book page 3, id=4571, option=[null, null, null, null, drop] +item=Pages, id=4572, option=[null, null, null, null, drop] +item=Pages, id=4573, option=[null, null, null, null, drop] +item=Base schematics, id=4574, option=[Assemble, null, null, null, drop] +item=Schematic, id=4575, option=[Assemble, null, null, null, drop] +item=Schematics, id=4576, option=[Assemble, null, null, null, drop] +item=Schematics, id=4577, option=[Assemble, null, null, null, drop] +item=Schematic, id=4578, option=[null, null, null, null, drop] +item=Cannon ball, id=4579, option=[null, null, null, null, drop] +item=Black spear, id=4580, option=[null, Wield, null, null, drop] +item=Black spear, id=4581, option=[null, null, null, null, drop] +item=Black spear(p), id=4582, option=[null, Wield, null, null, drop] +item=Black spear(p), id=4583, option=[null, null, null, null, drop] +item=Black spear(kp), id=4584, option=[null, Wield, null, null, drop] +item=Dragon plateskirt, id=4585, option=[null, Wear, null, null, drop] +item=Dragon plateskirt, id=4586, option=[null, null, null, null, drop] +item=Dragon scimitar, id=4587, option=[null, Wield, null, null, drop] +item=Dragon scimitar, id=4588, option=[null, null, null, null, drop] +item=Keys, id=4589, option=[null, null, null, null, drop] +item=Jewels, id=4590, option=[null, null, null, null, drop] +item=Karidian headpiece, id=4591, option=[null, null, null, null, drop] +item=Whoopsie, id=4592, option=[null, null, null, null, drop] +item=Fake beard, id=4593, option=[null, null, null, null, drop] +item=Whoopsie, id=4594, option=[null, null, null, null, drop] +item=Karidian disguise, id=4595, option=[null, null, null, null, drop] +item=Whoopsie, id=4596, option=[null, null, null, null, drop] +item=Note, id=4597, option=[Read, null, null, null, drop] +item=Note, id=4598, option=[Read, null, null, null, drop] +item=Oak-blackjack, id=4599, option=[null, Wield, null, null, drop] +item=Willow-blackjack, id=4600, option=[null, Wield, null, null, drop] +item=Ugthanki dung, id=4601, option=[null, null, null, Empty, drop] +item=Ugthanki dung, id=4602, option=[null, null, null, Empty, drop] +item=Receipt, id=4603, option=[null, null, null, null, drop] +item=Hag's poison, id=4604, option=[null, null, null, null, drop] +item=Snake charm, id=4605, option=[Play, null, null, null, drop] +item=Snake basket, id=4606, option=[null, null, null, null, drop] +item=Snake basket full, id=4607, option=[null, null, null, null, drop] +item=Super kebab, id=4608, option=[Eat, null, null, null, drop] +item=Super kebab, id=4609, option=[null, null, null, null, drop] +item=Red hot sauce, id=4610, option=[null, null, null, null, drop] +item=Desert disguise, id=4611, option=[null, Wear, null, null, drop] +item=Willow-blackjack, id=4612, option=[null, null, null, null, drop] +item=Spinning plate, id=4613, option=[Spin, null, null, null, drop] +item=Broken plate, id=4614, option=[null, null, null, null, drop] +item=Letter, id=4615, option=[Read, null, null, null, drop] +item=Varmen's notes, id=4616, option=[Read, null, null, null, drop] +item=Display cabinet key, id=4617, option=[null, null, null, null, drop] +item=Statuette, id=4618, option=[null, null, null, null, drop] +item=Strange implement, id=4619, option=[null, null, null, null, drop] +item=Black mushroom, id=4620, option=[Eat, null, null, null, drop] +item=Phoenix feather, id=4621, option=[null, null, null, null, drop] +item=Black mushroom ink, id=4622, option=[null, null, null, Empty, drop] +item=Phoenix quill pen, id=4623, option=[null, null, null, null, drop] +item=Golem program, id=4624, option=[null, null, null, null, drop] +item=Bandit, id=4625, option=[null, null, null, null, drop] +item=Whoopsie, id=4626, option=[Wear, null, null, null, drop] +item=Bandit's brew, id=4627, option=[Drink, null, null, null, drop] +item=Bandit's brew, id=4628, option=[null, null, null, null, drop] +item=null, id=4629, option=[null, null, null, null, drop] +item=null, id=4630, option=[null, null, null, null, drop] +item=null, id=4631, option=[null, null, null, null, drop] +item=null, id=4632, option=[null, null, null, null, drop] +item=null, id=4633, option=[null, null, null, null, drop] +item=null, id=4634, option=[null, null, null, null, drop] +item=null, id=4635, option=[null, null, null, null, drop] +item=null, id=4636, option=[null, null, null, null, drop] +item=null, id=4637, option=[null, null, null, null, drop] +item=null, id=4638, option=[null, null, null, null, drop] +item=null, id=4639, option=[null, null, null, null, drop] +item=null, id=4640, option=[null, null, null, null, drop] +item=null, id=4641, option=[null, null, null, null, drop] +item=null, id=4642, option=[null, null, null, null, drop] +item=null, id=4643, option=[null, null, null, null, drop] +item=null, id=4644, option=[null, null, null, null, drop] +item=null, id=4645, option=[null, null, null, null, drop] +item=null, id=4646, option=[null, null, null, null, drop] +item=null, id=4647, option=[null, null, null, null, drop] +item=null, id=4648, option=[null, null, null, null, drop] +item=null, id=4649, option=[null, null, null, null, drop] +item=null, id=4650, option=[null, null, null, null, drop] +item=null, id=4651, option=[null, null, null, null, drop] +item=null, id=4652, option=[null, null, null, null, drop] +item=Fire, id=4653, option=[null, null, null, null, drop] +item=Etchings, id=4654, option=[null, null, null, null, drop] +item=Translation, id=4655, option=[Read, null, null, null, drop] +item=Warm key, id=4656, option=[null, null, null, null, drop] +item=Ring of visibility, id=4657, option=[null, Wear, null, null, drop] +item=Silver pot, id=4658, option=[null, null, null, null, drop] +item=Blessed pot, id=4659, option=[null, null, null, null, drop] +item=Silver pot, id=4660, option=[null, null, null, null, drop] +item=Blessed pot, id=4661, option=[null, null, null, null, drop] +item=Silver pot, id=4662, option=[null, null, null, null, drop] +item=Blessed pot, id=4663, option=[null, null, null, null, drop] +item=Silver pot, id=4664, option=[null, null, null, null, drop] +item=Blessed pot, id=4665, option=[null, null, null, null, drop] +item=Silver pot, id=4666, option=[null, null, null, null, drop] +item=Blessed pot, id=4667, option=[null, null, null, null, drop] +item=Garlic powder, id=4668, option=[null, null, null, null, drop] +item=Whoopsie, id=4669, option=[null, null, null, null, drop] +item=Blood diamond, id=4670, option=[null, null, null, null, drop] +item=Ice diamond, id=4671, option=[null, null, null, null, drop] +item=Smoke diamond, id=4672, option=[null, null, null, null, drop] +item=Shadow diamond, id=4673, option=[null, null, null, null, drop] +item=Gilded cross, id=4674, option=[null, null, null, null, drop] +item=Ancient staff, id=4675, option=[null, Wield, null, null, drop] +item=Ancient staff, id=4676, option=[null, null, null, null, drop] +item=Catspeak amulet, id=4677, option=[null, Wear, null, null, drop] +item=Canopic jar, id=4678, option=[null, null, null, null, drop] +item=Canopic jar, id=4679, option=[null, null, null, null, drop] +item=Canopic jar, id=4680, option=[null, null, null, null, drop] +item=Canopic jar, id=4681, option=[null, null, null, null, drop] +item=Holy symbol, id=4682, option=[null, null, null, null, drop] +item=Unholy symbol, id=4683, option=[null, null, null, null, drop] +item=Linen, id=4684, option=[null, null, null, null, drop] +item=Whoopsie, id=4685, option=[null, null, null, null, drop] +item=Embalming manual, id=4686, option=[Read, null, null, null, drop] +item=Bucket of sap, id=4687, option=[null, null, null, Empty, drop] +item=Whoopsie, id=4688, option=[null, null, null, null, drop] +item=Pile of salt, id=4689, option=[null, null, null, null, drop] +item=Whoopsie, id=4690, option=[null, null, null, null, drop] +item=Sphinx's token, id=4691, option=[null, null, null, null, drop] +item=Gold leaf, id=4692, option=[null, null, null, null, drop] +item=Full bucket, id=4693, option=[null, null, null, Empty, drop] +item=Steam rune, id=4694, option=[null, null, null, null, drop] +item=Mist rune, id=4695, option=[null, null, null, null, drop] +item=Dust rune, id=4696, option=[null, null, null, null, drop] +item=Smoke rune, id=4697, option=[null, null, null, null, drop] +item=Mud rune, id=4698, option=[null, null, null, null, drop] +item=Lava rune, id=4699, option=[null, null, null, null, drop] +item=Sapphire lantern, id=4700, option=[null, null, null, null, drop] +item=Sapphire lantern, id=4701, option=[null, null, null, null, drop] +item=Sapphire lantern, id=4702, option=[Extinguish, null, null, null, drop] +item=Magic stone, id=4703, option=[null, null, null, null, drop] +item=Stone bowl, id=4704, option=[null, null, null, null, drop] +item=null, id=4705, option=[null, null, null, null, drop] +item=Whoopsie, id=4706, option=[Wear, null, null, null, drop] +item=Crumbling tome, id=4707, option=[Read, null, null, null, drop] +item=Ahrim's hood, id=4708, option=[null, Wear, null, null, drop] +item=Ahrim's hood, id=4709, option=[null, null, null, null, drop] +item=Ahrim's staff, id=4710, option=[null, Wield, null, null, drop] +item=Ahrim's staff, id=4711, option=[null, null, null, null, drop] +item=Ahrim's robetop, id=4712, option=[null, Wear, null, null, drop] +item=Ahrim's robetop, id=4713, option=[null, null, null, null, drop] +item=Ahrim's robeskirt, id=4714, option=[null, Wear, null, null, drop] +item=Ahrim's robeskirt, id=4715, option=[null, null, null, null, drop] +item=Dharok's helm, id=4716, option=[null, Wear, null, null, drop] +item=Dharok's helm, id=4717, option=[null, null, null, null, drop] +item=Dharok's greataxe, id=4718, option=[null, Wield, null, null, drop] +item=Dharok's greataxe, id=4719, option=[null, null, null, null, drop] +item=Dharok's platebody, id=4720, option=[null, Wear, null, null, drop] +item=Dharok's platebody, id=4721, option=[null, null, null, null, drop] +item=Dharok's platelegs, id=4722, option=[null, Wear, null, null, drop] +item=Dharok's platelegs, id=4723, option=[null, null, null, null, drop] +item=Guthan's helm, id=4724, option=[null, Wear, null, null, drop] +item=Guthan's helm, id=4725, option=[null, null, null, null, drop] +item=Guthan's warspear, id=4726, option=[null, Wield, null, null, drop] +item=Guthan's warspear, id=4727, option=[null, null, null, null, drop] +item=Guthan's platebody, id=4728, option=[null, Wear, null, null, drop] +item=Guthan's platebody, id=4729, option=[null, null, null, null, drop] +item=Guthan's chainskirt, id=4730, option=[null, Wear, null, null, drop] +item=Guthan's chainskirt, id=4731, option=[null, null, null, null, drop] +item=Karil's coif, id=4732, option=[null, Wear, null, null, drop] +item=Karil's coif, id=4733, option=[null, null, null, null, drop] +item=Karil's crossbow, id=4734, option=[null, Wield, null, null, drop] +item=Karil's crossbow, id=4735, option=[null, null, null, null, drop] +item=Karil's leathertop, id=4736, option=[null, Wear, null, null, drop] +item=Karil's leathertop, id=4737, option=[null, null, null, null, drop] +item=Karil's leatherskirt, id=4738, option=[null, Wear, null, null, drop] +item=Karil's leatherskirt, id=4739, option=[null, null, null, null, drop] +item=Bolt rack, id=4740, option=[null, Wield, null, null, drop] +item=null, id=4741, option=[null, null, null, null, drop] +item=null, id=4742, option=[null, null, null, null, drop] +item=null, id=4743, option=[null, null, null, null, drop] +item=null, id=4744, option=[null, null, null, null, drop] +item=Torag's helm, id=4745, option=[null, Wear, null, null, drop] +item=Torag's helm, id=4746, option=[null, null, null, null, drop] +item=Torag's hammers, id=4747, option=[null, Wield, null, null, drop] +item=Torag's hammers, id=4748, option=[null, null, null, null, drop] +item=Torag's platebody, id=4749, option=[null, Wear, null, null, drop] +item=Torag's platebody, id=4750, option=[null, null, null, null, drop] +item=Torag's platelegs, id=4751, option=[null, Wear, null, null, drop] +item=Torag's platelegs, id=4752, option=[null, null, null, null, drop] +item=Verac's helm, id=4753, option=[null, Wear, null, null, drop] +item=Verac's helm, id=4754, option=[null, null, null, null, drop] +item=Verac's flail, id=4755, option=[null, Wield, null, null, drop] +item=Verac's flail, id=4756, option=[null, null, null, null, drop] +item=Verac's brassard, id=4757, option=[null, Wear, null, null, drop] +item=Verac's brassard, id=4758, option=[null, null, null, null, drop] +item=Verac's plateskirt, id=4759, option=[null, Wear, null, null, drop] +item=Verac's plateskirt, id=4760, option=[null, null, null, null, drop] +item=null, id=4761, option=[null, null, null, null, drop] +item=null, id=4762, option=[null, null, null, null, drop] +item=null, id=4763, option=[null, null, null, null, drop] +item=null, id=4764, option=[null, null, null, null, drop] +item=null, id=4765, option=[null, null, null, null, drop] +item=null, id=4766, option=[null, null, null, null, drop] +item=null, id=4767, option=[null, null, null, null, drop] +item=null, id=4768, option=[null, null, null, null, drop] +item=null, id=4769, option=[null, null, null, null, drop] +item=null, id=4770, option=[null, null, null, null, drop] +item=null, id=4771, option=[null, null, null, null, drop] +item=null, id=4772, option=[null, null, null, null, drop] +item=Bronze brutal, id=4773, option=[null, Wield, null, null, drop] +item=null, id=4774, option=[null, null, null, null, drop] +item=null, id=4775, option=[null, null, null, null, drop] +item=null, id=4776, option=[null, null, null, null, drop] +item=null, id=4777, option=[null, null, null, null, drop] +item=Iron brutal, id=4778, option=[null, Wield, null, null, drop] +item=null, id=4779, option=[null, null, null, null, drop] +item=null, id=4780, option=[null, null, null, null, drop] +item=null, id=4781, option=[null, null, null, null, drop] +item=null, id=4782, option=[null, null, null, null, drop] +item=Steel brutal, id=4783, option=[null, Wield, null, null, drop] +item=null, id=4784, option=[null, null, null, null, drop] +item=null, id=4785, option=[null, null, null, null, drop] +item=null, id=4786, option=[null, null, null, null, drop] +item=null, id=4787, option=[null, null, null, null, drop] +item=Black brutal, id=4788, option=[null, Wield, null, null, drop] +item=null, id=4789, option=[null, null, null, null, drop] +item=null, id=4790, option=[null, null, null, null, drop] +item=null, id=4791, option=[null, null, null, null, drop] +item=null, id=4792, option=[null, null, null, null, drop] +item=Mithril brutal, id=4793, option=[null, Wield, null, null, drop] +item=null, id=4794, option=[null, null, null, null, drop] +item=null, id=4795, option=[null, null, null, null, drop] +item=null, id=4796, option=[null, null, null, null, drop] +item=null, id=4797, option=[null, null, null, null, drop] +item=Adamant brutal, id=4798, option=[null, Wield, null, null, drop] +item=null, id=4799, option=[null, null, null, null, drop] +item=null, id=4800, option=[null, null, null, null, drop] +item=null, id=4801, option=[null, null, null, null, drop] +item=null, id=4802, option=[null, null, null, null, drop] +item=Rune brutal, id=4803, option=[null, Wield, null, null, drop] +item=null, id=4804, option=[null, null, null, null, drop] +item=null, id=4805, option=[null, null, null, null, drop] +item=null, id=4806, option=[null, null, null, null, drop] +item=null, id=4807, option=[null, null, null, null, drop] +item=Black prism, id=4808, option=[Look-at, null, null, null, drop] +item=Torn page, id=4809, option=[Read, null, null, null, drop] +item=Ruined backpack, id=4810, option=[Open, null, null, null, drop] +item=Dragon inn tankard, id=4811, option=[Look-at, null, null, null, drop] +item=Zogre bones, id=4812, option=[Bury, null, null, null, drop] +item=Zogre bones, id=4813, option=[null, null, null, null, drop] +item=Sithik portrait, id=4814, option=[null, null, null, null, drop] +item=Sithik portrait, id=4815, option=[null, null, null, null, drop] +item=Signed portrait, id=4816, option=[Look-at, null, null, null, drop] +item=Book of portraiture, id=4817, option=[Read, null, null, null, drop] +item=Ogre artefact, id=4818, option=[null, null, null, null, drop] +item=Bronze nails, id=4819, option=[null, null, null, null, drop] +item=Iron nails, id=4820, option=[null, null, null, null, drop] +item=Black nails, id=4821, option=[null, null, null, null, drop] +item=Mithril nails, id=4822, option=[null, null, null, null, drop] +item=Adamantite nails, id=4823, option=[null, null, null, null, drop] +item=Rune nails, id=4824, option=[null, null, null, null, drop] +item=Unstrung comp bow, id=4825, option=[null, null, null, null, drop] +item=Unstrung comp bow, id=4826, option=[null, null, null, null, drop] +item=Comp ogre bow, id=4827, option=[null, Wield, Check kills, null, drop] +item=Comp ogre bow, id=4828, option=[null, null, null, null, drop] +item=Book of 'h.a.m', id=4829, option=[Read, null, null, null, drop] +item=Fayrg bones, id=4830, option=[Bury, null, null, null, drop] +item=Fayrg bones, id=4831, option=[null, null, null, null, drop] +item=Raurg bones, id=4832, option=[Bury, null, null, null, drop] +item=Raurg bones, id=4833, option=[null, null, null, null, drop] +item=Ourg bones, id=4834, option=[Bury, null, null, null, drop] +item=Ourg bones, id=4835, option=[null, null, null, null, drop] +item=Strange potion, id=4836, option=[null, null, null, null, drop] +item=Necromancy book, id=4837, option=[Read, null, null, null, drop] +item=Cup of tea, id=4838, option=[null, null, null, null, drop] +item=Ogre gate key, id=4839, option=[null, null, null, null, drop] +item=Rogue's purse potion(unf), id=4840, option=[null, null, null, Empty, drop] +item=Rogue's purse potion(unf), id=4841, option=[null, null, null, null, drop] +item=Relicym's balm(4), id=4842, option=[Drink, null, null, Empty, drop] +item=Relicym's balm(4), id=4843, option=[null, null, null, null, drop] +item=Relicym's balm(3), id=4844, option=[Drink, null, null, Empty, drop] +item=Relicym's balm(3), id=4845, option=[null, null, null, null, drop] +item=Relicym's balm(2), id=4846, option=[Drink, null, null, Empty, drop] +item=Relicym's balm(2), id=4847, option=[null, null, null, null, drop] +item=Relicym's balm(1), id=4848, option=[Drink, null, null, Empty, drop] +item=Relicym's balm(1), id=4849, option=[null, null, null, null, drop] +item=Ogre coffin key, id=4850, option=[null, null, null, null, drop] +item=Ogre coffin key, id=4851, option=[null, null, null, null, drop] +item=Bonemeal, id=4852, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4853, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4854, option=[null, Empty, null, null, drop] +item=Bonemeal, id=4855, option=[null, Empty, null, null, drop] +item=Ahrim's hood 100, id=4856, option=[null, Wear, null, null, drop] +item=Ahrim's hood 75, id=4857, option=[null, Wear, null, null, drop] +item=Ahrim's hood 50, id=4858, option=[null, Wear, null, null, drop] +item=Ahrim's hood 25, id=4859, option=[null, Wear, null, null, drop] +item=Ahrim's hood 0, id=4860, option=[null, null, null, null, drop] +item=Ahrim's hood 0, id=4861, option=[null, null, null, null, drop] +item=Ahrim's staff 100, id=4862, option=[null, Wield, null, null, drop] +item=Ahrim's staff 75, id=4863, option=[null, Wield, null, null, drop] +item=Ahrim's staff 50, id=4864, option=[null, Wield, null, null, drop] +item=Ahrim's staff 25, id=4865, option=[null, Wield, null, null, drop] +item=Ahrim's staff 0, id=4866, option=[null, null, null, null, drop] +item=Ahrim's staff 0, id=4867, option=[null, null, null, null, drop] +item=Ahrim's top 100, id=4868, option=[null, Wear, null, null, drop] +item=Ahrim's top 75, id=4869, option=[null, Wear, null, null, drop] +item=Ahrim's top 50, id=4870, option=[null, Wear, null, null, drop] +item=Ahrim's top 25, id=4871, option=[null, Wear, null, null, drop] +item=Ahrim's top 0, id=4872, option=[null, null, null, null, drop] +item=Ahrim's top 0, id=4873, option=[null, null, null, null, drop] +item=Ahrim's skirt 100, id=4874, option=[null, Wear, null, null, drop] +item=Ahrim's skirt 75, id=4875, option=[null, Wear, null, null, drop] +item=Ahrim's skirt 50, id=4876, option=[null, Wear, null, null, drop] +item=Ahrim's skirt 25, id=4877, option=[null, Wear, null, null, drop] +item=Ahrim's skirt 0, id=4878, option=[null, null, null, null, drop] +item=Ahrim's skirt 0, id=4879, option=[null, null, null, null, drop] +item=Dharok's helm 100, id=4880, option=[null, Wear, null, null, drop] +item=Dharok's helm 75, id=4881, option=[null, Wear, null, null, drop] +item=Dharok's helm 50, id=4882, option=[null, Wear, null, null, drop] +item=Dharok's helm 25, id=4883, option=[null, Wear, null, null, drop] +item=Dharok's helm 0, id=4884, option=[null, null, null, null, drop] +item=Dharok's helm 0, id=4885, option=[null, null, null, null, drop] +item=Dharok's axe 100, id=4886, option=[null, Wield, null, null, drop] +item=Dharok's axe 75, id=4887, option=[null, Wield, null, null, drop] +item=Dharok's axe 50, id=4888, option=[null, Wield, null, null, drop] +item=Dharok's axe 25, id=4889, option=[null, Wield, null, null, drop] +item=Dharok's axe 0, id=4890, option=[null, null, null, null, drop] +item=Dharok's axe 0, id=4891, option=[null, null, null, null, drop] +item=Dharok's body 100, id=4892, option=[null, Wear, null, null, drop] +item=Dharok's body 75, id=4893, option=[null, Wear, null, null, drop] +item=Dharok's body 50, id=4894, option=[null, Wear, null, null, drop] +item=Dharok's body 25, id=4895, option=[null, Wear, null, null, drop] +item=Dharok's body 0, id=4896, option=[null, null, null, null, drop] +item=Dharok's body 0, id=4897, option=[null, null, null, null, drop] +item=Dharok's legs 100, id=4898, option=[null, Wear, null, null, drop] +item=Dharok's legs 75, id=4899, option=[null, Wear, null, null, drop] +item=Dharok's legs 50, id=4900, option=[null, Wear, null, null, drop] +item=Dharok's legs 25, id=4901, option=[null, Wear, null, null, drop] +item=Dharok's legs 0, id=4902, option=[null, null, null, null, drop] +item=Dharok's legs 0, id=4903, option=[null, null, null, null, drop] +item=Guthan's helm 100, id=4904, option=[null, Wear, null, null, drop] +item=Guthan's helm 75, id=4905, option=[null, Wear, null, null, drop] +item=Guthan's helm 50, id=4906, option=[null, Wear, null, null, drop] +item=Guthan's helm 25, id=4907, option=[null, Wear, null, null, drop] +item=Guthan's helm 0, id=4908, option=[null, null, null, null, drop] +item=Guthan's helm 0, id=4909, option=[null, null, null, null, drop] +item=Guthan's spear 100, id=4910, option=[null, Wield, null, null, drop] +item=Guthan's spear 75, id=4911, option=[null, Wield, null, null, drop] +item=Guthan's spear 50, id=4912, option=[null, Wield, null, null, drop] +item=Guthan's spear 25, id=4913, option=[null, Wield, null, null, drop] +item=Guthan's spear 0, id=4914, option=[null, null, null, null, drop] +item=Guthan's spear 0, id=4915, option=[null, null, null, null, drop] +item=Guthan's body 100, id=4916, option=[null, Wear, null, null, drop] +item=Guthan's body 75, id=4917, option=[null, Wear, null, null, drop] +item=Guthan's body 50, id=4918, option=[null, Wear, null, null, drop] +item=Guthan's body 25, id=4919, option=[null, Wear, null, null, drop] +item=Guthan's body 0, id=4920, option=[null, null, null, null, drop] +item=Guthan's body 0, id=4921, option=[null, null, null, null, drop] +item=Guthan's skirt 100, id=4922, option=[null, Wear, null, null, drop] +item=Guthan's skirt 75, id=4923, option=[null, Wear, null, null, drop] +item=Guthan's skirt 50, id=4924, option=[null, Wear, null, null, drop] +item=Guthan's skirt 25, id=4925, option=[null, Wear, null, null, drop] +item=Guthan's skirt 0, id=4926, option=[null, null, null, null, drop] +item=Guthan's skirt 0, id=4927, option=[null, null, null, null, drop] +item=Karil's coif 100, id=4928, option=[null, Wear, null, null, drop] +item=Karil's coif 75, id=4929, option=[null, Wear, null, null, drop] +item=Karil's coif 50, id=4930, option=[null, Wear, null, null, drop] +item=Karil's coif 25, id=4931, option=[null, Wear, null, null, drop] +item=Karil's coif 0, id=4932, option=[null, null, null, null, drop] +item=Karil's coif 0, id=4933, option=[null, null, null, null, drop] +item=Karil's x-bow 100, id=4934, option=[null, Wield, null, null, drop] +item=Karil's x-bow 75, id=4935, option=[null, Wield, null, null, drop] +item=Karil's x-bow 50, id=4936, option=[null, Wield, null, null, drop] +item=Karil's x-bow 25, id=4937, option=[null, Wield, null, null, drop] +item=Karil's x-bow 0, id=4938, option=[null, null, null, null, drop] +item=Karil's x-bow 0, id=4939, option=[null, null, null, null, drop] +item=Karil's top 100, id=4940, option=[null, Wear, null, null, drop] +item=Karil's top 75, id=4941, option=[null, Wear, null, null, drop] +item=Karil's top 50, id=4942, option=[null, Wear, null, null, drop] +item=Karil's top 25, id=4943, option=[null, Wear, null, null, drop] +item=Karil's top 0, id=4944, option=[null, null, null, null, drop] +item=Karil's top 0, id=4945, option=[null, null, null, null, drop] +item=Karil's skirt 100, id=4946, option=[null, Wear, null, null, drop] +item=Karil's skirt 75, id=4947, option=[null, Wear, null, null, drop] +item=Karil's skirt 50, id=4948, option=[null, Wear, null, null, drop] +item=Karil's skirt 25, id=4949, option=[null, Wear, null, null, drop] +item=Karil's skirt 0, id=4950, option=[null, null, null, null, drop] +item=Karil's skirt 0, id=4951, option=[null, null, null, null, drop] +item=Torag's helm 100, id=4952, option=[null, Wear, null, null, drop] +item=Torag's helm 75, id=4953, option=[null, Wear, null, null, drop] +item=Torag's helm 50, id=4954, option=[null, Wear, null, null, drop] +item=Torag's helm 25, id=4955, option=[null, Wear, null, null, drop] +item=Torag's helm 0, id=4956, option=[null, null, null, null, drop] +item=Torag's helm 0, id=4957, option=[null, null, null, null, drop] +item=Torag's hammer 100, id=4958, option=[null, Wield, null, null, drop] +item=Torag's hammer 75, id=4959, option=[null, Wield, null, null, drop] +item=Torag's hammer 50, id=4960, option=[null, Wield, null, null, drop] +item=Torag's hammer 25, id=4961, option=[null, Wield, null, null, drop] +item=Torag's hammer 0, id=4962, option=[null, null, null, null, drop] +item=Torag's hammer 0, id=4963, option=[null, null, null, null, drop] +item=Torag's body 100, id=4964, option=[null, Wear, null, null, drop] +item=Torag's body 75, id=4965, option=[null, Wear, null, null, drop] +item=Torag's body 50, id=4966, option=[null, Wear, null, null, drop] +item=Torag's body 25, id=4967, option=[null, Wear, null, null, drop] +item=Torag's body 0, id=4968, option=[null, null, null, null, drop] +item=Torag's body 0, id=4969, option=[null, null, null, null, drop] +item=Torag's legs 100, id=4970, option=[null, Wear, null, null, drop] +item=Torag's legs 75, id=4971, option=[null, Wear, null, null, drop] +item=Torag's legs 50, id=4972, option=[null, Wear, null, null, drop] +item=Torag's legs 25, id=4973, option=[null, Wear, null, null, drop] +item=Torag's legs 0, id=4974, option=[null, null, null, null, drop] +item=Torag's legs 0, id=4975, option=[null, null, null, null, drop] +item=Verac's helm 100, id=4976, option=[null, Wear, null, null, drop] +item=Verac's helm 75, id=4977, option=[null, Wear, null, null, drop] +item=Verac's helm 50, id=4978, option=[null, Wear, null, null, drop] +item=Verac's helm 25, id=4979, option=[null, Wear, null, null, drop] +item=Verac's helm 0, id=4980, option=[null, null, null, null, drop] +item=Verac's helm 0, id=4981, option=[null, null, null, null, drop] +item=Verac's flail 100, id=4982, option=[null, Wield, null, null, drop] +item=Verac's flail 75, id=4983, option=[null, Wield, null, null, drop] +item=Verac's flail 50, id=4984, option=[null, Wield, null, null, drop] +item=Verac's flail 25, id=4985, option=[null, Wield, null, null, drop] +item=Verac's flail 0, id=4986, option=[null, null, null, null, drop] +item=Verac's flail 0, id=4987, option=[null, null, null, null, drop] +item=Verac's top 100, id=4988, option=[null, Wear, null, null, drop] +item=Verac's top 75, id=4989, option=[null, Wear, null, null, drop] +item=Verac's top 50, id=4990, option=[null, Wear, null, null, drop] +item=Verac's top 25, id=4991, option=[null, Wear, null, null, drop] +item=Verac's top 0, id=4992, option=[null, null, null, null, drop] +item=Verac's top 0, id=4993, option=[null, null, null, null, drop] +item=Verac's skirt 100, id=4994, option=[null, Wear, null, null, drop] +item=Verac's skirt 75, id=4995, option=[null, Wear, null, null, drop] +item=Verac's skirt 50, id=4996, option=[null, Wear, null, null, drop] +item=Verac's skirt 25, id=4997, option=[null, Wear, null, null, drop] +item=Verac's skirt 0, id=4998, option=[null, null, null, null, drop] +item=Verac's skirt 0, id=4999, option=[null, null, null, null, drop] +item=null, id=5000, option=[null, null, null, null, drop] +item=Raw cave eel, id=5001, option=[null, null, null, null, drop] +item=Burnt cave eel, id=5002, option=[null, null, null, null, drop] +item=Cave eel, id=5003, option=[Eat, null, null, null, drop] +item=Frog spawn, id=5004, option=[Eat, null, null, null, drop] +item=Raw cave eel, id=5005, option=[null, null, null, null, drop] +item=Burnt cave eel, id=5006, option=[null, null, null, null, drop] +item=Cave eel, id=5007, option=[null, null, null, null, drop] +item=Brooch, id=5008, option=[Look-at, null, null, null, drop] +item=Goblin symbol book, id=5009, option=[Read, null, null, null, drop] +item=Key, id=5010, option=[null, null, null, null, drop] +item=Silverware, id=5011, option=[null, null, null, null, drop] +item=Peace treaty, id=5012, option=[null, null, null, null, drop] +item=Mining helmet, id=5013, option=[null, Wear, Extinguish, null, drop] +item=Mining helmet, id=5014, option=[null, Wear, null, null, drop] +item=Mining helmet, id=5015, option=[null, null, null, null, drop] +item=Bone spear, id=5016, option=[null, Wield, null, null, drop] +item=Bone spear, id=5017, option=[null, null, null, null, drop] +item=Bone club, id=5018, option=[null, Wield, null, null, drop] +item=Bone club, id=5019, option=[null, null, null, null, drop] +item=Minecart ticket, id=5020, option=[null, null, null, null, drop] +item=Minecart ticket, id=5021, option=[null, null, null, null, drop] +item=Minecart ticket, id=5022, option=[null, null, null, null, drop] +item=Minecart ticket, id=5023, option=[null, null, null, null, drop] +item=Woven top, id=5024, option=[null, Wear, null, null, drop] +item=Woven top, id=5025, option=[null, null, null, null, drop] +item=Woven top, id=5026, option=[null, Wear, null, null, drop] +item=Woven top, id=5027, option=[null, null, null, null, drop] +item=Woven top, id=5028, option=[null, Wear, null, null, drop] +item=Woven top, id=5029, option=[null, null, null, null, drop] +item=Shirt, id=5030, option=[null, Wear, null, null, drop] +item=Shirt, id=5031, option=[null, null, null, null, drop] +item=Shirt, id=5032, option=[null, Wear, null, null, drop] +item=Shirt, id=5033, option=[null, null, null, null, drop] +item=Shirt, id=5034, option=[null, Wear, null, null, drop] +item=Shirt, id=5035, option=[null, null, null, null, drop] +item=Trousers, id=5036, option=[null, Wear, null, null, drop] +item=Trousers, id=5037, option=[null, null, null, null, drop] +item=Trousers, id=5038, option=[null, Wear, null, null, drop] +item=Trousers, id=5039, option=[null, null, null, null, drop] +item=Trousers, id=5040, option=[null, Wear, null, null, drop] +item=Trousers, id=5041, option=[null, null, null, null, drop] +item=Shorts, id=5042, option=[null, Wear, null, null, drop] +item=Shorts, id=5043, option=[null, null, null, null, drop] +item=Shorts, id=5044, option=[null, Wear, null, null, drop] +item=Shorts, id=5045, option=[null, null, null, null, drop] +item=Shorts, id=5046, option=[null, Wear, null, null, drop] +item=Shorts, id=5047, option=[null, null, null, null, drop] +item=Skirt, id=5048, option=[null, Wear, null, null, drop] +item=Skirt, id=5049, option=[null, null, null, null, drop] +item=Skirt, id=5050, option=[null, Wear, null, null, drop] +item=Skirt, id=5051, option=[null, null, null, null, drop] +item=Skirt, id=5052, option=[null, Wear, null, null, drop] +item=Skirt, id=5053, option=[null, null, null, null, drop] +item=Dwarf, id=5054, option=[null, null, null, null, drop] +item=Dwarf, id=5055, option=[null, null, null, null, drop] +item=Dwarven battleaxe, id=5056, option=[Wield, null, null, null, drop] +item=Dwarven battleaxe, id=5057, option=[Wield, null, null, null, drop] +item=Dwarven battleaxe, id=5058, option=[Wield, null, null, null, drop] +item=Dwarven battleaxe, id=5059, option=[Wield, null, null, null, drop] +item=Dwarven battleaxe, id=5060, option=[null, null, null, null, drop] +item=Dwarven battleaxe, id=5061, option=[null, null, null, null, drop] +item=Left boot, id=5062, option=[Wear, null, null, null, drop] +item=Right boot, id=5063, option=[Wear, null, null, null, drop] +item=Exquisite boots, id=5064, option=[Wear, null, null, null, drop] +item=Book on costumes, id=5065, option=[null, null, null, null, drop] +item=Meeting notes, id=5066, option=[Read, null, null, null, drop] +item=Exquisite clothes, id=5067, option=[Wear, null, null, null, drop] +item=Master farmer, id=5068, option=[null, null, null, null, drop] +item=Whoopsie, id=5069, option=[Wear, null, null, null, drop] +item=Bird's nest, id=5070, option=[Search, null, null, null, drop] +item=Bird's nest, id=5071, option=[Search, null, null, null, drop] +item=Bird's nest, id=5072, option=[Search, null, null, null, drop] +item=Bird's nest, id=5073, option=[Search, null, null, null, drop] +item=Bird's nest, id=5074, option=[Search, null, null, null, drop] +item=Bird's nest, id=5075, option=[null, null, null, null, drop] +item=Bird's egg, id=5076, option=[null, null, null, null, drop] +item=Bird's egg, id=5077, option=[null, null, null, null, drop] +item=Bird's egg, id=5078, option=[null, null, null, null, drop] +item=null, id=5079, option=[null, null, null, null, drop] +item=null, id=5080, option=[null, null, null, null, drop] +item=Whoopsie, id=5081, option=[Wear, null, null, null, drop] +item=null, id=5082, option=[null, null, null, null, drop] +item=Whoopsie, id=5083, option=[Wear, null, null, null, drop] +item=null, id=5084, option=[null, null, null, null, drop] +item=Whoopsie, id=5085, option=[Wear, null, null, null, drop] +item=null, id=5086, option=[null, null, null, null, drop] +item=Whoopsie, id=5087, option=[Wear, null, null, null, drop] +item=null, id=5088, option=[null, null, null, null, drop] +item=Whoopsie, id=5089, option=[Wear, null, null, null, drop] +item=null, id=5090, option=[null, null, null, null, drop] +item=Whoopsie, id=5091, option=[Wear, null, null, null, drop] +item=null, id=5092, option=[null, null, null, null, drop] +item=Whoopsie, id=5093, option=[Wear, null, null, null, drop] +item=null, id=5094, option=[null, null, null, null, drop] +item=Whoopsie, id=5095, option=[Wear, null, null, null, drop] +item=Marigold seed, id=5096, option=[null, null, null, null, drop] +item=Rosemary seed, id=5097, option=[null, null, null, null, drop] +item=Nasturtium seed, id=5098, option=[null, null, null, null, drop] +item=Woad seed, id=5099, option=[null, null, null, null, drop] +item=Limpwurt seed, id=5100, option=[null, null, null, null, drop] +item=Redberry seed, id=5101, option=[null, null, null, null, drop] +item=Cadavaberry seed, id=5102, option=[null, null, null, null, drop] +item=Dwellberry seed, id=5103, option=[null, null, null, null, drop] +item=Jangerberry seed, id=5104, option=[null, null, null, null, drop] +item=Whiteberry seed, id=5105, option=[null, null, null, null, drop] +item=Poison ivy seed, id=5106, option=[null, null, null, null, drop] +item=null, id=5107, option=[null, null, null, null, drop] +item=null, id=5108, option=[null, null, null, null, drop] +item=null, id=5109, option=[null, null, null, null, drop] +item=null, id=5110, option=[null, null, null, null, drop] +item=null, id=5111, option=[null, null, null, null, drop] +item=null, id=5112, option=[null, null, null, null, drop] +item=null, id=5113, option=[null, null, null, null, drop] +item=null, id=5114, option=[null, null, null, null, drop] +item=null, id=5115, option=[null, null, null, null, drop] +item=null, id=5116, option=[null, null, null, null, drop] +item=null, id=5117, option=[null, null, null, null, drop] +item=null, id=5118, option=[null, null, null, null, drop] +item=null, id=5119, option=[null, null, null, null, drop] +item=null, id=5120, option=[null, null, null, null, drop] +item=null, id=5121, option=[null, null, null, null, drop] +item=null, id=5122, option=[null, null, null, null, drop] +item=null, id=5123, option=[null, null, null, null, drop] +item=null, id=5124, option=[null, null, null, null, drop] +item=null, id=5125, option=[null, null, null, null, drop] +item=null, id=5126, option=[null, null, null, null, drop] +item=null, id=5127, option=[null, null, null, null, drop] +item=null, id=5128, option=[null, null, null, null, drop] +item=null, id=5129, option=[null, null, null, null, drop] +item=null, id=5130, option=[null, null, null, null, drop] +item=null, id=5131, option=[null, null, null, null, drop] +item=null, id=5132, option=[null, null, null, null, drop] +item=null, id=5133, option=[null, null, null, null, drop] +item=null, id=5134, option=[null, null, null, null, drop] +item=null, id=5135, option=[null, null, null, null, drop] +item=null, id=5136, option=[null, null, null, null, drop] +item=null, id=5137, option=[null, null, null, null, drop] +item=null, id=5138, option=[null, null, null, null, drop] +item=null, id=5139, option=[null, null, null, null, drop] +item=null, id=5140, option=[null, null, null, null, drop] +item=null, id=5141, option=[null, null, null, null, drop] +item=null, id=5142, option=[null, null, null, null, drop] +item=null, id=5143, option=[null, null, null, null, drop] +item=null, id=5144, option=[null, null, null, null, drop] +item=null, id=5145, option=[null, null, null, null, drop] +item=null, id=5146, option=[null, null, null, null, drop] +item=null, id=5147, option=[null, null, null, null, drop] +item=null, id=5148, option=[null, null, null, null, drop] +item=null, id=5149, option=[null, null, null, null, drop] +item=null, id=5150, option=[null, null, null, null, drop] +item=null, id=5151, option=[null, null, null, null, drop] +item=null, id=5152, option=[null, null, null, null, drop] +item=null, id=5153, option=[null, null, null, null, drop] +item=null, id=5154, option=[null, null, null, null, drop] +item=null, id=5155, option=[null, null, null, null, drop] +item=null, id=5156, option=[null, null, null, null, drop] +item=null, id=5157, option=[null, null, null, null, drop] +item=null, id=5158, option=[null, null, null, null, drop] +item=null, id=5159, option=[null, null, null, null, drop] +item=null, id=5160, option=[null, null, null, null, drop] +item=null, id=5161, option=[null, null, null, null, drop] +item=null, id=5162, option=[null, null, null, null, drop] +item=null, id=5163, option=[null, null, null, null, drop] +item=null, id=5164, option=[null, null, null, null, drop] +item=null, id=5165, option=[null, null, null, null, drop] +item=null, id=5166, option=[null, null, null, null, drop] +item=null, id=5167, option=[null, null, null, null, drop] +item=null, id=5168, option=[null, null, null, null, drop] +item=null, id=5169, option=[null, null, null, null, drop] +item=null, id=5170, option=[null, null, null, null, drop] +item=Seeds, id=5171, option=[null, null, null, null, drop] +item=null, id=5172, option=[null, null, null, null, drop] +item=null, id=5173, option=[null, null, null, null, drop] +item=null, id=5174, option=[null, null, null, null, drop] +item=null, id=5175, option=[null, null, null, null, drop] +item=null, id=5176, option=[null, null, null, null, drop] +item=null, id=5177, option=[null, null, null, null, drop] +item=null, id=5178, option=[null, null, null, null, drop] +item=null, id=5179, option=[null, null, null, null, drop] +item=null, id=5180, option=[null, null, null, null, drop] +item=null, id=5181, option=[null, null, null, null, drop] +item=null, id=5182, option=[null, null, null, null, drop] +item=null, id=5183, option=[null, null, null, null, drop] +item=null, id=5184, option=[null, null, null, null, drop] +item=null, id=5185, option=[null, null, null, null, drop] +item=null, id=5186, option=[null, null, null, null, drop] +item=null, id=5187, option=[null, null, null, null, drop] +item=null, id=5188, option=[null, null, null, null, drop] +item=null, id=5189, option=[null, null, null, null, drop] +item=null, id=5190, option=[null, null, null, null, drop] +item=null, id=5191, option=[null, null, null, null, drop] +item=null, id=5192, option=[null, null, null, null, drop] +item=null, id=5193, option=[null, null, null, null, drop] +item=null, id=5194, option=[null, null, null, null, drop] +item=null, id=5195, option=[null, null, null, null, drop] +item=null, id=5196, option=[null, null, null, null, drop] +item=null, id=5197, option=[null, null, null, null, drop] +item=null, id=5198, option=[null, null, null, null, drop] +item=null, id=5199, option=[null, null, null, null, drop] +item=null, id=5200, option=[null, null, null, null, drop] +item=null, id=5201, option=[null, null, null, null, drop] +item=null, id=5202, option=[null, null, null, null, drop] +item=null, id=5203, option=[null, null, null, null, drop] +item=null, id=5204, option=[null, null, null, null, drop] +item=null, id=5205, option=[null, null, null, null, drop] +item=null, id=5206, option=[null, null, null, null, drop] +item=null, id=5207, option=[null, null, null, null, drop] +item=null, id=5208, option=[null, null, null, null, drop] +item=null, id=5209, option=[null, null, null, null, drop] +item=null, id=5210, option=[null, null, null, null, drop] +item=null, id=5211, option=[null, null, null, null, drop] +item=null, id=5212, option=[null, null, null, null, drop] +item=null, id=5213, option=[null, null, null, null, drop] +item=null, id=5214, option=[null, null, null, null, drop] +item=null, id=5215, option=[null, null, null, null, drop] +item=null, id=5216, option=[null, null, null, null, drop] +item=null, id=5217, option=[null, null, null, null, drop] +item=null, id=5218, option=[null, null, null, null, drop] +item=null, id=5219, option=[null, null, null, null, drop] +item=null, id=5220, option=[null, null, null, null, drop] +item=null, id=5221, option=[null, null, null, null, drop] +item=null, id=5222, option=[null, null, null, null, drop] +item=null, id=5223, option=[null, null, null, null, drop] +item=null, id=5224, option=[null, null, null, null, drop] +item=null, id=5225, option=[null, null, null, null, drop] +item=null, id=5226, option=[null, null, null, null, drop] +item=null, id=5227, option=[null, null, null, null, drop] +item=null, id=5228, option=[null, null, null, null, drop] +item=null, id=5229, option=[null, null, null, null, drop] +item=null, id=5230, option=[null, null, null, null, drop] +item=null, id=5231, option=[null, null, null, null, drop] +item=null, id=5232, option=[null, null, null, null, drop] +item=null, id=5233, option=[null, null, null, null, drop] +item=null, id=5234, option=[null, null, null, null, drop] +item=null, id=5235, option=[null, null, null, null, drop] +item=null, id=5236, option=[null, null, null, null, drop] +item=null, id=5237, option=[null, null, null, null, drop] +item=null, id=5238, option=[null, null, null, null, drop] +item=null, id=5239, option=[null, null, null, null, drop] +item=null, id=5240, option=[null, null, null, null, drop] +item=null, id=5241, option=[null, null, null, null, drop] +item=null, id=5242, option=[null, null, null, null, drop] +item=null, id=5243, option=[null, null, null, null, drop] +item=null, id=5244, option=[null, null, null, null, drop] +item=null, id=5245, option=[null, null, null, null, drop] +item=null, id=5246, option=[null, null, null, null, drop] +item=null, id=5247, option=[null, null, null, null, drop] +item=null, id=5248, option=[null, null, null, null, drop] +item=null, id=5249, option=[null, null, null, null, drop] +item=null, id=5250, option=[null, null, null, null, drop] +item=null, id=5251, option=[null, null, null, null, drop] +item=null, id=5252, option=[null, null, null, null, drop] +item=null, id=5253, option=[null, null, null, null, drop] +item=null, id=5254, option=[null, null, null, null, drop] +item=null, id=5255, option=[null, null, null, null, drop] +item=null, id=5256, option=[null, null, null, null, drop] +item=null, id=5257, option=[null, null, null, null, drop] +item=null, id=5258, option=[null, null, null, null, drop] +item=null, id=5259, option=[null, null, null, null, drop] +item=null, id=5260, option=[null, null, null, null, drop] +item=null, id=5261, option=[null, null, null, null, drop] +item=null, id=5262, option=[null, null, null, null, drop] +item=null, id=5263, option=[null, null, null, null, drop] +item=null, id=5264, option=[null, null, null, null, drop] +item=null, id=5265, option=[null, null, null, null, drop] +item=null, id=5266, option=[null, null, null, null, drop] +item=null, id=5267, option=[null, null, null, null, drop] +item=null, id=5268, option=[null, null, null, null, drop] +item=null, id=5269, option=[null, null, null, null, drop] +item=null, id=5270, option=[null, null, null, null, drop] +item=null, id=5271, option=[null, null, null, null, drop] +item=null, id=5272, option=[null, null, null, null, drop] +item=null, id=5273, option=[null, null, null, null, drop] +item=null, id=5274, option=[null, null, null, null, drop] +item=null, id=5275, option=[null, null, null, null, drop] +item=null, id=5276, option=[null, null, null, null, drop] +item=null, id=5277, option=[null, null, null, null, drop] +item=null, id=5278, option=[null, null, null, null, drop] +item=null, id=5279, option=[null, null, null, null, drop] +item=Cactus seed, id=5280, option=[null, null, null, null, drop] +item=Belladonna seed, id=5281, option=[null, null, null, null, drop] +item=Mushroom spore, id=5282, option=[null, null, null, null, drop] +item=Apple tree seed, id=5283, option=[null, null, null, null, drop] +item=Banana tree seed, id=5284, option=[null, null, null, null, drop] +item=Orange tree seed, id=5285, option=[null, null, null, null, drop] +item=Curry tree seed, id=5286, option=[null, null, null, null, drop] +item=Pineapple seed, id=5287, option=[null, null, null, null, drop] +item=Papaya tree seed, id=5288, option=[null, null, null, null, drop] +item=Palm tree seed, id=5289, option=[null, null, null, null, drop] +item=Calquat tree seed, id=5290, option=[null, null, null, null, drop] +item=Guam seed, id=5291, option=[null, null, null, null, drop] +item=Marrentill seed, id=5292, option=[null, null, null, null, drop] +item=Tarromin seed, id=5293, option=[null, null, null, null, drop] +item=Harralander seed, id=5294, option=[null, null, null, null, drop] +item=Ranarr seed, id=5295, option=[null, null, null, null, drop] +item=Toadflax seed, id=5296, option=[null, null, null, null, drop] +item=Irit seed, id=5297, option=[null, null, null, null, drop] +item=Avantoe seed, id=5298, option=[null, null, null, null, drop] +item=Kwuarm seed, id=5299, option=[null, null, null, null, drop] +item=Snapdragon seed, id=5300, option=[null, null, null, null, drop] +item=Cadantine seed, id=5301, option=[null, null, null, null, drop] +item=Lantadyme seed, id=5302, option=[null, null, null, null, drop] +item=Dwarf weed seed, id=5303, option=[null, null, null, null, drop] +item=Torstol seed, id=5304, option=[null, null, null, null, drop] +item=Barley seed, id=5305, option=[null, null, null, null, drop] +item=Jute seed, id=5306, option=[null, null, null, null, drop] +item=Hammerstone seed, id=5307, option=[null, null, null, null, drop] +item=Asgarnian seed, id=5308, option=[null, null, null, null, drop] +item=Yanillian seed, id=5309, option=[null, null, null, null, drop] +item=Krandorian seed, id=5310, option=[null, null, null, null, drop] +item=Wildblood seed, id=5311, option=[null, null, null, null, drop] +item=Acorn, id=5312, option=[null, null, null, null, drop] +item=Willow seed, id=5313, option=[null, null, null, null, drop] +item=Maple seed, id=5314, option=[null, null, null, null, drop] +item=Yew seed, id=5315, option=[null, null, null, null, drop] +item=Magic seed, id=5316, option=[null, null, null, null, drop] +item=Spirit seed, id=5317, option=[null, null, null, null, drop] +item=Potato seed, id=5318, option=[null, null, null, null, drop] +item=Onion seed, id=5319, option=[null, null, null, null, drop] +item=Sweetcorn seed, id=5320, option=[null, null, null, null, drop] +item=Watermelon seed, id=5321, option=[null, null, null, null, drop] +item=Tomato seed, id=5322, option=[null, null, null, null, drop] +item=Strawberry seed, id=5323, option=[null, null, null, null, drop] +item=Cabbage seed, id=5324, option=[null, null, null, null, drop] +item=Gardening trowel, id=5325, option=[null, null, null, null, drop] +item=Gardening trowel, id=5326, option=[null, null, null, null, drop] +item=Spade handle, id=5327, option=[null, null, null, null, drop] +item=Spade head, id=5328, option=[null, null, null, null, drop] +item=Secateurs, id=5329, option=[null, null, null, null, drop] +item=Secateurs, id=5330, option=[null, null, null, null, drop] +item=Watering can, id=5331, option=[null, null, null, null, drop] +item=Watering can, id=5332, option=[null, null, null, null, drop] +item=Watering can(1), id=5333, option=[null, null, null, null, drop] +item=Watering can(2), id=5334, option=[null, null, null, null, drop] +item=Watering can(3), id=5335, option=[null, null, null, null, drop] +item=Watering can(4), id=5336, option=[null, null, null, null, drop] +item=Watering can(5), id=5337, option=[null, null, null, null, drop] +item=Watering can(6), id=5338, option=[null, null, null, null, drop] +item=Watering can(7), id=5339, option=[null, null, null, null, drop] +item=Watering can(8), id=5340, option=[null, null, null, null, drop] +item=Rake, id=5341, option=[null, null, null, null, drop] +item=Rake, id=5342, option=[null, null, null, null, drop] +item=Seed dibber, id=5343, option=[null, null, null, null, drop] +item=Seed dibber, id=5344, option=[null, null, null, null, drop] +item=Gardening boots, id=5345, option=[null, Wear, null, null, drop] +item=Gardening boots, id=5346, option=[null, null, null, null, drop] +item=Rake handle, id=5347, option=[null, null, null, null, drop] +item=Rake head, id=5348, option=[null, null, null, null, drop] +item=Whoopsie, id=5349, option=[Wear, null, null, null, drop] +item=Plant pot, id=5350, option=[null, null, null, null, drop] +item=Plant pot, id=5351, option=[null, null, null, null, drop] +item=Unfired plant pot, id=5352, option=[null, null, null, null, drop] +item=Unfired plant pot, id=5353, option=[null, null, null, null, drop] +item=Plant pot, id=5354, option=[null, null, null, null, drop] +item=Plant pot, id=5355, option=[null, null, null, null, drop] +item=Plant pot, id=5356, option=[null, null, null, null, drop] +item=Plant pot, id=5357, option=[null, null, null, null, drop] +item=Oak seedling, id=5358, option=[null, null, null, null, drop] +item=Willow seedling, id=5359, option=[null, null, null, null, drop] +item=Maple seedling, id=5360, option=[null, null, null, null, drop] +item=Yew seedling, id=5361, option=[null, null, null, null, drop] +item=Magic seedling, id=5362, option=[null, null, null, null, drop] +item=Spirit seedling, id=5363, option=[null, null, null, null, drop] +item=Oak seedling, id=5364, option=[null, null, null, null, drop] +item=Willow seedling, id=5365, option=[null, null, null, null, drop] +item=Maple seedling, id=5366, option=[null, null, null, null, drop] +item=Yew seedling, id=5367, option=[null, null, null, null, drop] +item=Magic seedling, id=5368, option=[null, null, null, null, drop] +item=Spirit seedling, id=5369, option=[null, null, null, null, drop] +item=Oak sapling, id=5370, option=[null, null, null, null, drop] +item=Willow sapling, id=5371, option=[null, null, null, null, drop] +item=Maple sapling, id=5372, option=[null, null, null, null, drop] +item=Yew sapling, id=5373, option=[null, null, null, null, drop] +item=Magic sapling, id=5374, option=[null, null, null, null, drop] +item=Spirit sapling, id=5375, option=[null, null, null, null, drop] +item=Basket, id=5376, option=[Fill, null, null, null, drop] +item=Basket, id=5377, option=[null, null, null, null, drop] +item=Apples(1), id=5378, option=[Fill, Remove-one, null, null, drop] +item=Apples(1), id=5379, option=[null, null, null, null, drop] +item=Apples(2), id=5380, option=[Fill, Remove-one, Empty, null, drop] +item=Apples(2), id=5381, option=[null, null, null, null, drop] +item=Apples(3), id=5382, option=[Fill, Remove-one, Empty, null, drop] +item=Apples(3), id=5383, option=[null, null, null, null, drop] +item=Apples(4), id=5384, option=[Fill, Remove-one, Empty, null, drop] +item=Apples(4), id=5385, option=[null, null, null, null, drop] +item=Apples(5), id=5386, option=[Fill, Remove-one, Empty, null, drop] +item=Apples(5), id=5387, option=[null, null, null, null, drop] +item=Oranges(1), id=5388, option=[Fill, Remove-one, null, null, drop] +item=Oranges(1), id=5389, option=[null, null, null, null, drop] +item=Oranges(2), id=5390, option=[Fill, Remove-one, Empty, null, drop] +item=Oranges(2), id=5391, option=[null, null, null, null, drop] +item=Oranges(3), id=5392, option=[Fill, Remove-one, Empty, null, drop] +item=Oranges(3), id=5393, option=[null, null, null, null, drop] +item=Oranges(4), id=5394, option=[Fill, Remove-one, Empty, null, drop] +item=Oranges(4), id=5395, option=[null, null, null, null, drop] +item=Oranges(5), id=5396, option=[Fill, Remove-one, Empty, null, drop] +item=Oranges(5), id=5397, option=[null, null, null, null, drop] +item=Strawberries(1), id=5398, option=[Fill, Remove-one, null, null, drop] +item=Strawberries(1), id=5399, option=[null, null, null, null, drop] +item=Strawberries(2), id=5400, option=[Fill, Remove-one, Empty, null, drop] +item=Strawberries(2), id=5401, option=[null, null, null, null, drop] +item=Strawberries(3), id=5402, option=[Fill, Remove-one, Empty, null, drop] +item=Strawberries(3), id=5403, option=[null, null, null, null, drop] +item=Strawberries(4), id=5404, option=[Fill, Remove-one, Empty, null, drop] +item=Strawberries(4), id=5405, option=[null, null, null, null, drop] +item=Strawberries(5), id=5406, option=[Fill, Remove-one, Empty, null, drop] +item=Strawberries(5), id=5407, option=[null, null, null, null, drop] +item=Bananas(1), id=5408, option=[Fill, Remove-one, null, null, drop] +item=Bananas(1), id=5409, option=[null, null, null, null, drop] +item=Bananas(2), id=5410, option=[Fill, Remove-one, Empty, null, drop] +item=Bananas(2), id=5411, option=[null, null, null, null, drop] +item=Bananas(3), id=5412, option=[Fill, Remove-one, Empty, null, drop] +item=Bananas(3), id=5413, option=[null, null, null, null, drop] +item=Bananas(4), id=5414, option=[Fill, Remove-one, Empty, null, drop] +item=Bananas(4), id=5415, option=[null, null, null, null, drop] +item=Bananas(5), id=5416, option=[Fill, Remove-one, Empty, null, drop] +item=Bananas(5), id=5417, option=[null, null, null, null, drop] +item=Empty sack, id=5418, option=[Fill, null, null, null, drop] +item=Empty sack, id=5419, option=[null, null, null, null, drop] +item=Potatoes(1), id=5420, option=[Fill, Remove-one, null, null, drop] +item=Potatoes(1), id=5421, option=[null, null, null, null, drop] +item=Potatoes(2), id=5422, option=[Fill, Remove-one, Empty, null, drop] +item=Potatoes(2), id=5423, option=[null, null, null, null, drop] +item=Potatoes(3), id=5424, option=[Fill, Remove-one, Empty, null, drop] +item=Potatoes(3), id=5425, option=[null, null, null, null, drop] +item=Potatoes(4), id=5426, option=[Fill, Remove-one, Empty, null, drop] +item=Potatoes(4), id=5427, option=[null, null, null, null, drop] +item=Potatoes(5), id=5428, option=[Fill, Remove-one, Empty, null, drop] +item=Potatoes(5), id=5429, option=[null, null, null, null, drop] +item=Potatoes(6), id=5430, option=[Fill, Remove-one, Empty, null, drop] +item=Potatoes(6), id=5431, option=[null, null, null, null, drop] +item=Potatoes(7), id=5432, option=[Fill, Remove-one, Empty, null, drop] +item=Potatoes(7), id=5433, option=[null, null, null, null, drop] +item=Potatoes(8), id=5434, option=[Fill, Remove-one, Empty, null, drop] +item=Potatoes(8), id=5435, option=[null, null, null, null, drop] +item=Potatoes(9), id=5436, option=[Fill, Remove-one, Empty, null, drop] +item=Potatoes(9), id=5437, option=[null, null, null, null, drop] +item=Potatoes(10), id=5438, option=[Fill, Remove-one, Empty, null, drop] +item=Potatoes(10), id=5439, option=[null, null, null, null, drop] +item=Onions(1), id=5440, option=[Fill, Remove-one, null, null, drop] +item=Onions(1), id=5441, option=[null, null, null, null, drop] +item=Onions(2), id=5442, option=[Fill, Remove-one, Empty, null, drop] +item=Onions(2), id=5443, option=[null, null, null, null, drop] +item=Onions(3), id=5444, option=[Fill, Remove-one, Empty, null, drop] +item=Onions(3), id=5445, option=[null, null, null, null, drop] +item=Onions(4), id=5446, option=[Fill, Remove-one, Empty, null, drop] +item=Onions(4), id=5447, option=[null, null, null, null, drop] +item=Onions(5), id=5448, option=[Fill, Remove-one, Empty, null, drop] +item=Onions(5), id=5449, option=[null, null, null, null, drop] +item=Onions(6), id=5450, option=[Fill, Remove-one, Empty, null, drop] +item=Onions(6), id=5451, option=[null, null, null, null, drop] +item=Onions(7), id=5452, option=[Fill, Remove-one, Empty, null, drop] +item=Onions(7), id=5453, option=[null, null, null, null, drop] +item=Onions(8), id=5454, option=[Fill, Remove-one, Empty, null, drop] +item=Onions(8), id=5455, option=[null, null, null, null, drop] +item=Onions(9), id=5456, option=[Fill, Remove-one, Empty, null, drop] +item=Onions(9), id=5457, option=[null, null, null, null, drop] +item=Onions(10), id=5458, option=[Fill, Remove-one, Empty, null, drop] +item=Onions(10), id=5459, option=[null, null, null, null, drop] +item=Cabbages(1), id=5460, option=[Fill, Remove-one, null, null, drop] +item=Cabbages(1), id=5461, option=[null, null, null, null, drop] +item=Cabbages(2), id=5462, option=[Fill, Remove-one, Empty, null, drop] +item=Cabbages(2), id=5463, option=[null, null, null, null, drop] +item=Cabbages(3), id=5464, option=[Fill, Remove-one, Empty, null, drop] +item=Cabbages(3), id=5465, option=[null, null, null, null, drop] +item=Cabbages(4), id=5466, option=[Fill, Remove-one, Empty, null, drop] +item=Cabbages(4), id=5467, option=[null, null, null, null, drop] +item=Cabbages(5), id=5468, option=[Fill, Remove-one, Empty, null, drop] +item=Cabbages(5), id=5469, option=[null, null, null, null, drop] +item=Cabbages(6), id=5470, option=[Fill, Remove-one, Empty, null, drop] +item=Cabbages(6), id=5471, option=[null, null, null, null, drop] +item=Cabbages(7), id=5472, option=[Fill, Remove-one, Empty, null, drop] +item=Cabbages(7), id=5473, option=[null, null, null, null, drop] +item=Cabbages(8), id=5474, option=[Fill, Remove-one, Empty, null, drop] +item=Cabbages(8), id=5475, option=[null, null, null, null, drop] +item=Cabbages(9), id=5476, option=[Fill, Remove-one, Empty, null, drop] +item=Cabbages(9), id=5477, option=[null, null, null, null, drop] +item=Cabbages(10), id=5478, option=[Fill, Remove-one, Empty, null, drop] +item=Cabbages(10), id=5479, option=[null, null, null, null, drop] +item=Apple seedling, id=5480, option=[null, null, null, null, drop] +item=Banana seedling, id=5481, option=[null, null, null, null, drop] +item=Orange seedling, id=5482, option=[null, null, null, null, drop] +item=Curry seedling, id=5483, option=[null, null, null, null, drop] +item=Pineapple seedling, id=5484, option=[null, null, null, null, drop] +item=Papaya seedling, id=5485, option=[null, null, null, null, drop] +item=Palm seedling, id=5486, option=[null, null, null, null, drop] +item=Calquat seedling, id=5487, option=[null, null, null, null, drop] +item=Apple seedling, id=5488, option=[null, null, null, null, drop] +item=Banana seedling, id=5489, option=[null, null, null, null, drop] +item=Orange seedling, id=5490, option=[null, null, null, null, drop] +item=Curry seedling, id=5491, option=[null, null, null, null, drop] +item=Pineapple seedling, id=5492, option=[null, null, null, null, drop] +item=Papaya seedling, id=5493, option=[null, null, null, null, drop] +item=Palm seedling, id=5494, option=[null, null, null, null, drop] +item=Calquat seedling, id=5495, option=[null, null, null, null, drop] +item=Apple sapling, id=5496, option=[null, null, null, null, drop] +item=Banana sapling, id=5497, option=[null, null, null, null, drop] +item=Orange sapling, id=5498, option=[null, null, null, null, drop] +item=Curry sapling, id=5499, option=[null, null, null, null, drop] +item=Pineapple sapling, id=5500, option=[null, null, null, null, drop] +item=Papaya sapling, id=5501, option=[null, null, null, null, drop] +item=Palm sapling, id=5502, option=[null, null, null, null, drop] +item=Calquat sapling, id=5503, option=[null, null, null, null, drop] +item=Strawberry, id=5504, option=[Eat, null, null, null, drop] +item=Strawberry, id=5505, option=[null, null, null, null, drop] +item=Old man's message, id=5506, option=[Read, null, null, null, drop] +item=Strange book, id=5507, option=[Read, null, null, null, drop] +item=Book of folklore, id=5508, option=[Read, null, null, null, drop] +item=Small pouch, id=5509, option=[Fill, Empty, Check, null, drop] +item=Medium pouch, id=5510, option=[Fill, Empty, Check, null, drop] +item=Medium pouch, id=5511, option=[Fill, Empty, Check, null, drop] +item=Large pouch, id=5512, option=[Fill, Empty, Check, null, drop] +item=Large pouch, id=5513, option=[Fill, Empty, Check, null, drop] +item=Giant pouch, id=5514, option=[Fill, Empty, Check, null, drop] +item=Giant pouch, id=5515, option=[Fill, Empty, Check, null, drop] +item=Elemental talisman, id=5516, option=[null, null, null, Locate, drop] +item=Elemental talisman, id=5517, option=[null, null, null, null, drop] +item=Scrying orb, id=5518, option=[null, null, null, null, drop] +item=Scrying orb, id=5519, option=[null, null, null, null, drop] +item=Abyssal book, id=5520, option=[Read, null, null, null, drop] +item=Binding necklace, id=5521, option=[null, Wear, null, null, drop] +item=Binding necklace, id=5522, option=[null, null, null, null, drop] +item=Tiara mould, id=5523, option=[null, null, null, null, drop] +item=Tiara mould, id=5524, option=[null, null, null, null, drop] +item=Tiara, id=5525, option=[null, Wear, null, null, drop] +item=Tiara, id=5526, option=[null, null, null, null, drop] +item=Air tiara, id=5527, option=[null, Wear, null, null, drop] +item=Air tiara, id=5528, option=[null, null, null, null, drop] +item=Mind tiara, id=5529, option=[null, Wear, null, null, drop] +item=Mind tiara, id=5530, option=[null, null, null, null, drop] +item=Water tiara, id=5531, option=[null, Wear, null, null, drop] +item=Water tiara, id=5532, option=[null, null, null, null, drop] +item=Body tiara, id=5533, option=[null, Wear, null, null, drop] +item=Body tiara, id=5534, option=[null, null, null, null, drop] +item=Earth tiara, id=5535, option=[null, Wear, null, null, drop] +item=Earth tiara, id=5536, option=[null, null, null, null, drop] +item=Fire tiara, id=5537, option=[null, Wear, null, null, drop] +item=Fire tiara, id=5538, option=[null, null, null, null, drop] +item=Cosmic tiara, id=5539, option=[null, Wear, null, null, drop] +item=Cosmic tiara, id=5540, option=[null, null, null, null, drop] +item=Nature tiara, id=5541, option=[null, Wear, null, null, drop] +item=Nature tiara, id=5542, option=[null, null, null, null, drop] +item=Chaos tiara, id=5543, option=[null, Wear, null, null, drop] +item=Chaos tiara, id=5544, option=[null, null, null, null, drop] +item=Law tiara, id=5545, option=[null, Wear, null, null, drop] +item=Law tiara, id=5546, option=[null, null, null, null, drop] +item=Death tiara, id=5547, option=[null, Wear, null, null, drop] +item=Death tiara, id=5548, option=[null, null, null, null, drop] +item=Blood tiara, id=5549, option=[null, Wear, null, null, drop] +item=Blood tiara, id=5550, option=[null, null, null, null, drop] +item=Soul tiara, id=5551, option=[null, Wear, null, null, drop] +item=Soul tiara, id=5552, option=[null, null, null, null, drop] +item=Rogue top, id=5553, option=[null, Wear, null, null, drop] +item=Rogue mask, id=5554, option=[null, Wear, null, null, drop] +item=Rogue trousers, id=5555, option=[null, Wear, null, null, drop] +item=Rogue gloves, id=5556, option=[null, Wear, null, null, drop] +item=Rogue boots, id=5557, option=[null, Wear, null, null, drop] +item=Rogue kit, id=5558, option=[Build, null, null, null, drop] +item=Flash powder, id=5559, option=[null, null, null, null, drop] +item=Stethoscope, id=5560, option=[null, null, null, null, drop] +item=Mystic jewel, id=5561, option=[Activate, null, null, null, drop] +item=Gear, id=5562, option=[null, null, null, null, drop] +item=Gear, id=5563, option=[null, null, null, null, drop] +item=Gear, id=5564, option=[null, null, null, null, drop] +item=Gear, id=5565, option=[null, null, null, null, drop] +item=Gear, id=5566, option=[null, null, null, null, drop] +item=Gear, id=5567, option=[null, null, null, null, drop] +item=Tile, id=5568, option=[null, null, null, null, drop] +item=Tiles, id=5569, option=[null, null, null, null, drop] +item=Tiles, id=5570, option=[null, null, null, null, drop] +item=Tiles, id=5571, option=[null, null, null, null, drop] +item=Dial, id=5572, option=[null, null, null, null, drop] +item=Whoopsie, id=5573, option=[Wear, null, null, null, drop] +item=Initiate sallet, id=5574, option=[null, Wear, null, null, drop] +item=Initiate hauberk, id=5575, option=[null, Wear, null, null, drop] +item=Initiate cuisse, id=5576, option=[null, Wear, null, null, drop] +item=Cupric sulfate, id=5577, option=[null, null, null, null, drop] +item=Acetic acid, id=5578, option=[null, null, null, null, drop] +item=Gypsum, id=5579, option=[null, null, null, null, drop] +item=Sodium chloride, id=5580, option=[null, null, null, null, drop] +item=Nitrous oxide, id=5581, option=[Open, null, null, null, drop] +item=Vial of liquid, id=5582, option=[null, null, null, null, drop] +item=Tin ore powder, id=5583, option=[null, null, null, null, drop] +item=Cupric ore powder, id=5584, option=[null, null, null, null, drop] +item=Bronze key, id=5585, option=[null, null, null, null, drop] +item=Metal spade, id=5586, option=[null, null, null, null, drop] +item=Metal spade, id=5587, option=[null, null, null, null, drop] +item=Alchemical notes, id=5588, option=[Read, null, null, null, drop] +item=??? mixture, id=5589, option=[null, null, null, null, drop] +item=??? mixture, id=5590, option=[null, null, null, null, drop] +item=??? mixture, id=5591, option=[null, null, null, null, drop] +item=Tin, id=5592, option=[null, null, null, null, drop] +item=Tin, id=5593, option=[null, null, null, null, drop] +item=Tin, id=5594, option=[null, null, null, null, drop] +item=Tin, id=5595, option=[null, null, null, null, drop] +item=Tin, id=5596, option=[null, null, null, null, drop] +item=Tin, id=5597, option=[null, null, null, null, drop] +item=Tin, id=5598, option=[null, null, null, null, drop] +item=Tin, id=5599, option=[null, null, null, null, drop] +item=Tin, id=5600, option=[null, null, null, null, drop] +item=Chisel, id=5601, option=[null, null, null, null, drop] +item=Bronze wire, id=5602, option=[null, null, null, null, drop] +item=Shears, id=5603, option=[null, null, null, null, drop] +item=Magnet, id=5604, option=[null, null, null, null, drop] +item=Knife, id=5605, option=[null, null, null, null, drop] +item=Makeover voucher, id=5606, option=[null, null, null, null, drop] +item=Grain, id=5607, option=[null, Wear, null, null, drop] +item=Fox, id=5608, option=[null, Wear, null, null, drop] +item=Chicken, id=5609, option=[null, Wear, null, null, drop] +item=Hourglass, id=5610, option=[null, null, null, null, drop] +item=Initiate sallet, id=5611, option=[null, null, null, null, drop] +item=Initiate hauberk, id=5612, option=[null, null, null, null, drop] +item=Initiate cuisse, id=5613, option=[null, null, null, null, drop] +item=Magic carpet, id=5614, option=[null, null, null, null, drop] +item=Bonemeal, id=5615, option=[null, Empty, null, null, drop] +item=Bronze arrow(p+), id=5616, option=[null, Wield, null, null, drop] +item=Iron arrow(p+), id=5617, option=[null, Wield, null, null, drop] +item=Steel arrow(p+), id=5618, option=[null, Wield, null, null, drop] +item=Mithril arrow(p+), id=5619, option=[null, Wield, null, null, drop] +item=Adamant arrow(p+), id=5620, option=[null, Wield, null, null, drop] +item=Rune arrow(p+), id=5621, option=[null, Wield, null, null, drop] +item=Bronze arrow(p++), id=5622, option=[null, Wield, null, null, drop] +item=Iron arrow(p++), id=5623, option=[null, Wield, null, null, drop] +item=Steel arrow(p++), id=5624, option=[null, Wield, null, null, drop] +item=Mithril arrow(p++), id=5625, option=[null, Wield, null, null, drop] +item=Adam arrow(p++), id=5626, option=[null, Wield, null, null, drop] +item=Rune arrow(p++), id=5627, option=[null, Wield, null, null, drop] +item=Bronze dart(p+), id=5628, option=[null, Wield, null, null, drop] +item=Iron dart(p+), id=5629, option=[null, Wield, null, null, drop] +item=Steel dart(p+), id=5630, option=[null, Wield, null, null, drop] +item=Black dart(p+), id=5631, option=[null, Wield, null, null, drop] +item=Mithril dart(p+), id=5632, option=[null, Wield, null, null, drop] +item=Adamant dart(p+), id=5633, option=[null, Wield, null, null, drop] +item=Rune dart(p+), id=5634, option=[null, Wield, null, null, drop] +item=Bronze dart(p++), id=5635, option=[null, Wield, null, null, drop] +item=Iron dart(p++), id=5636, option=[null, Wield, null, null, drop] +item=Steel dart(p++), id=5637, option=[null, Wield, null, null, drop] +item=Black dart(p++), id=5638, option=[null, Wield, null, null, drop] +item=Mithril dart(p++), id=5639, option=[null, Wield, null, null, drop] +item=Adamant dart(p++), id=5640, option=[null, Wield, null, null, drop] +item=Rune dart(p++), id=5641, option=[null, Wield, null, null, drop] +item=Bronze javelin(p+), id=5642, option=[null, Wield, null, null, drop] +item=Iron javelin(p+), id=5643, option=[null, Wield, null, null, drop] +item=Steel javelin(p+), id=5644, option=[null, Wield, null, null, drop] +item=Mithril javelin(p+), id=5645, option=[null, Wield, null, null, drop] +item=Addy javelin(p+), id=5646, option=[null, Wield, null, null, drop] +item=Rune javelin(p+), id=5647, option=[null, Wield, null, null, drop] +item=Bronze jav'n(p++), id=5648, option=[null, Wield, null, null, drop] +item=Iron javelin(p++), id=5649, option=[null, Wield, null, null, drop] +item=Steel javelin(p++), id=5650, option=[null, Wield, null, null, drop] +item=Mithril javelin(p++), id=5651, option=[null, Wield, null, null, drop] +item=Addy javelin(p++), id=5652, option=[null, Wield, null, null, drop] +item=Rune javelin(p++), id=5653, option=[null, Wield, null, null, drop] +item=Bronze knife(p+), id=5654, option=[null, Wield, null, null, drop] +item=Iron knife(p+), id=5655, option=[null, Wield, null, null, drop] +item=Steel knife(p+), id=5656, option=[null, Wield, null, null, drop] +item=Mithril knife(p+), id=5657, option=[null, Wield, null, null, drop] +item=Black knife(p+), id=5658, option=[null, Wield, null, null, drop] +item=Adamant knife(p+), id=5659, option=[null, Wield, null, null, drop] +item=Rune knife(p+), id=5660, option=[null, Wield, null, null, drop] +item=Bronze knife(p++), id=5661, option=[null, Wield, null, null, drop] +item=Iron knife(p++), id=5662, option=[null, Wield, null, null, drop] +item=Steel knife(p++), id=5663, option=[null, Wield, null, null, drop] +item=Mithril knife(p++), id=5664, option=[null, Wield, null, null, drop] +item=Black knife(p++), id=5665, option=[null, Wield, null, null, drop] +item=Addy knife(p++), id=5666, option=[null, Wield, null, null, drop] +item=Rune knife(p++), id=5667, option=[null, Wield, null, null, drop] +item=Iron dagger(p+), id=5668, option=[null, Wield, null, null, drop] +item=Iron dagger(p+), id=5669, option=[null, null, null, null, drop] +item=Bronze dagger(p+), id=5670, option=[null, Wield, null, null, drop] +item=Bronze dagger(p+), id=5671, option=[null, null, null, null, drop] +item=Steel dagger(p+), id=5672, option=[null, Wield, null, null, drop] +item=Steel dagger(p+), id=5673, option=[null, null, null, null, drop] +item=Mithril dagger(p+), id=5674, option=[null, Wield, null, null, drop] +item=Mithril dagger(p+), id=5675, option=[null, null, null, null, drop] +item=Adam dagger(p+), id=5676, option=[null, Wield, null, null, drop] +item=Adam dagger(p+), id=5677, option=[null, null, null, null, drop] +item=Rune dagger(p+), id=5678, option=[null, Wield, null, null, drop] +item=Rune dagger(p+), id=5679, option=[null, null, null, null, drop] +item=Dragon dagger(p+), id=5680, option=[null, Wield, null, null, drop] +item=Dragon dagger(p+), id=5681, option=[null, null, null, null, drop] +item=Black dagger(p+), id=5682, option=[null, Wield, null, null, drop] +item=Black dagger(p+), id=5683, option=[null, null, null, null, drop] +item=Poison dagger(p+), id=5684, option=[null, Wield, null, null, drop] +item=Poison dagger(p+), id=5685, option=[null, null, null, null, drop] +item=Iron dagger(p++), id=5686, option=[null, Wield, null, null, drop] +item=Iron dagger(p++), id=5687, option=[null, null, null, null, drop] +item=Br'ze dagger(p++), id=5688, option=[null, Wield, null, null, drop] +item=Br'ze dagger(p++), id=5689, option=[null, null, null, null, drop] +item=Steel dagger(p++), id=5690, option=[null, Wield, null, null, drop] +item=Steel dagger(p++), id=5691, option=[null, null, null, null, drop] +item=Mithril dagger(p++), id=5692, option=[null, Wield, null, null, drop] +item=Mithril dagger(p++), id=5693, option=[null, null, null, null, drop] +item=Adam dagger(p++), id=5694, option=[null, Wield, null, null, drop] +item=Adam dagger(p++), id=5695, option=[null, null, null, null, drop] +item=Rune dagger(p++), id=5696, option=[null, Wield, null, null, drop] +item=Rune dagger(p++), id=5697, option=[null, null, null, null, drop] +item=Drag dagger(p++), id=5698, option=[null, Wield, null, null, drop] +item=Drag dagger(p++), id=5699, option=[null, null, null, null, drop] +item=Black dagger(p++), id=5700, option=[null, Wield, null, null, drop] +item=Black dagger(p++), id=5701, option=[null, null, null, null, drop] +item=Poison dagger(p++), id=5702, option=[null, Wield, null, null, drop] +item=Poison dagger(p++), id=5703, option=[null, null, null, null, drop] +item=Bronze spear(p+), id=5704, option=[null, Wield, null, null, drop] +item=Bronze spear(p+), id=5705, option=[null, null, null, null, drop] +item=Iron spear(p+), id=5706, option=[null, Wield, null, null, drop] +item=Iron spear(p+), id=5707, option=[null, null, null, null, drop] +item=Steel spear(p+), id=5708, option=[null, Wield, null, null, drop] +item=Steel spear(p+), id=5709, option=[null, null, null, null, drop] +item=Mithril spear(p+), id=5710, option=[null, Wield, null, null, drop] +item=Mithril spear(p+), id=5711, option=[null, null, null, null, drop] +item=Adamant spear(p+), id=5712, option=[null, Wield, null, null, drop] +item=Adamant spear(p+), id=5713, option=[null, null, null, null, drop] +item=Rune spear(p+), id=5714, option=[null, Wield, null, null, drop] +item=Rune spear(p+), id=5715, option=[null, null, null, null, drop] +item=Dragon spear(p+), id=5716, option=[null, Wield, null, null, drop] +item=Dragon spear(p+), id=5717, option=[null, null, null, null, drop] +item=Bronze spear(p++), id=5718, option=[null, Wield, null, null, drop] +item=Bronze spear(p++), id=5719, option=[null, null, null, null, drop] +item=Iron spear(p++), id=5720, option=[null, Wield, null, null, drop] +item=Iron spear(p++), id=5721, option=[null, null, null, null, drop] +item=Steel spear(p++), id=5722, option=[null, Wield, null, null, drop] +item=Steel spear(p++), id=5723, option=[null, null, null, null, drop] +item=Mithril spear(p++), id=5724, option=[null, Wield, null, null, drop] +item=Mithril spear(p++), id=5725, option=[null, null, null, null, drop] +item=Adam spear(p++), id=5726, option=[null, Wield, null, null, drop] +item=Adam spear(p++), id=5727, option=[null, null, null, null, drop] +item=Rune spear(p++), id=5728, option=[null, Wield, null, null, drop] +item=Rune spear(p++), id=5729, option=[null, null, null, null, drop] +item=Dragon spear(p++), id=5730, option=[null, Wield, null, null, drop] +item=Dragon spear(p++), id=5731, option=[null, null, null, null, drop] +item=Stool, id=5732, option=[null, null, null, null, drop] +item=Rotten potato, id=5733, option=[Eat, Slice, Peel, Mash, drop] +item=Black spear(p+), id=5734, option=[null, Wield, null, null, drop] +item=Black spear(p+), id=5735, option=[null, null, null, null, drop] +item=Black spear(p++), id=5736, option=[null, Wield, null, null, drop] +item=Black spear(p++), id=5737, option=[null, null, null, null, drop] +item=Woad leaf, id=5738, option=[null, null, null, null, drop] +item=Asgarnian ale(m), id=5739, option=[Drink, null, null, null, drop] +item=Asgarnian ale(m), id=5740, option=[null, null, null, null, drop] +item=Mature wmb, id=5741, option=[Drink, null, null, null, drop] +item=Mature wmb, id=5742, option=[null, null, null, null, drop] +item=Greenman's ale(m), id=5743, option=[Drink, null, null, null, drop] +item=Greenman's ale(m), id=5744, option=[null, null, null, null, drop] +item=Dragon bitter(m), id=5745, option=[Drink, null, null, null, drop] +item=Dragon bitter(m), id=5746, option=[null, null, null, null, drop] +item=Dwarven stout(m), id=5747, option=[Drink, null, null, null, drop] +item=Dwarven stout(m), id=5748, option=[null, null, null, null, drop] +item=Moonlight mead(m), id=5749, option=[Drink, null, null, null, drop] +item=Moonlight mead(m), id=5750, option=[null, null, null, null, drop] +item=Axeman's folly, id=5751, option=[Drink, null, null, null, drop] +item=Axeman's folly, id=5752, option=[null, null, null, null, drop] +item=Axeman's folly(m), id=5753, option=[Drink, null, null, null, drop] +item=Axeman's folly(m), id=5754, option=[null, null, null, null, drop] +item=Chef's delight, id=5755, option=[Drink, null, null, null, drop] +item=Chef's delight, id=5756, option=[null, null, null, null, drop] +item=Chef's delight(m), id=5757, option=[Drink, null, null, null, drop] +item=Chef's delight(m), id=5758, option=[null, null, null, null, drop] +item=Slayer's respite, id=5759, option=[Drink, null, null, null, drop] +item=Slayer's respite, id=5760, option=[null, null, null, null, drop] +item=Slayer's respite(m), id=5761, option=[Drink, null, null, null, drop] +item=Slayer's respite(m), id=5762, option=[null, null, null, null, drop] +item=Cider, id=5763, option=[Drink, null, null, null, drop] +item=Cider, id=5764, option=[null, null, null, null, drop] +item=Mature cider, id=5765, option=[Drink, null, null, null, drop] +item=Mature cider, id=5766, option=[null, null, null, null, drop] +item=Ale yeast, id=5767, option=[null, null, null, null, drop] +item=Ale yeast, id=5768, option=[null, null, null, null, drop] +item=Calquat keg, id=5769, option=[null, null, null, null, drop] +item=Calquat keg, id=5770, option=[null, null, null, null, drop] +item=Dwarven stout(1), id=5771, option=[Drink, null, null, null, drop] +item=Dwarven stout(1), id=5772, option=[null, null, null, null, drop] +item=Dwarven stout(2), id=5773, option=[Drink, null, null, null, drop] +item=Dwarven stout(2), id=5774, option=[null, null, null, null, drop] +item=Dwarven stout(3), id=5775, option=[Drink, null, null, null, drop] +item=Dwarven stout(3), id=5776, option=[null, null, null, null, drop] +item=Dwarven stout(4), id=5777, option=[Drink, null, null, null, drop] +item=Dwarven stout(4), id=5778, option=[null, null, null, null, drop] +item=Asgarnian ale(1), id=5779, option=[Drink, null, null, null, drop] +item=Asgarnian ale(1), id=5780, option=[null, null, null, null, drop] +item=Asgarnian ale(2), id=5781, option=[Drink, null, null, null, drop] +item=Asgarnian ale(2), id=5782, option=[null, null, null, null, drop] +item=Asgarnian ale(3), id=5783, option=[Drink, null, null, null, drop] +item=Asgarnian ale(3), id=5784, option=[null, null, null, null, drop] +item=Asgarnian ale(4), id=5785, option=[Drink, null, null, null, drop] +item=Asgarnian ale(4), id=5786, option=[null, null, null, null, drop] +item=Greenmans ale(1), id=5787, option=[Drink, null, null, null, drop] +item=Greenmans ale(1), id=5788, option=[null, null, null, null, drop] +item=Greenmans ale(2), id=5789, option=[Drink, null, null, null, drop] +item=Greenmans ale(2), id=5790, option=[null, null, null, null, drop] +item=Greenmans ale(3), id=5791, option=[Drink, null, null, null, drop] +item=Greenmans ale(3), id=5792, option=[null, null, null, null, drop] +item=Greenmans ale(4), id=5793, option=[Drink, null, null, null, drop] +item=Greenmans ale(4), id=5794, option=[null, null, null, null, drop] +item=Mind bomb(1), id=5795, option=[Drink, null, null, null, drop] +item=Mind bomb(1), id=5796, option=[null, null, null, null, drop] +item=Mind bomb(2), id=5797, option=[Drink, null, null, null, drop] +item=Mind bomb(2), id=5798, option=[null, null, null, null, drop] +item=Mind bomb(3), id=5799, option=[Drink, null, null, null, drop] +item=Mind bomb(3), id=5800, option=[null, null, null, null, drop] +item=Mind bomb(4), id=5801, option=[Drink, null, null, null, drop] +item=Mind bomb(4), id=5802, option=[null, null, null, null, drop] +item=Dragon bitter(1), id=5803, option=[Drink, null, null, null, drop] +item=Dragon bitter(1), id=5804, option=[null, null, null, null, drop] +item=Dragon bitter(2), id=5805, option=[Drink, null, null, null, drop] +item=Dragon bitter(2), id=5806, option=[null, null, null, null, drop] +item=Dragon bitter(3), id=5807, option=[Drink, null, null, null, drop] +item=Dragon bitter(3), id=5808, option=[null, null, null, null, drop] +item=Dragon bitter(4), id=5809, option=[Drink, null, null, null, drop] +item=Dragon bitter(4), id=5810, option=[null, null, null, null, drop] +item=Moonlight mead(1), id=5811, option=[Drink, null, null, null, drop] +item=Moonlight mead(1), id=5812, option=[null, null, null, null, drop] +item=Moonlight mead(2), id=5813, option=[Drink, null, null, null, drop] +item=Moonlight mead(2), id=5814, option=[null, null, null, null, drop] +item=Moonlight mead(3), id=5815, option=[Drink, null, null, null, drop] +item=Moonlight mead(3), id=5816, option=[null, null, null, null, drop] +item=Moonlight mead(4), id=5817, option=[Drink, null, null, null, drop] +item=Moonlight mead(4), id=5818, option=[null, null, null, null, drop] +item=Axeman's folly(1), id=5819, option=[Drink, null, null, null, drop] +item=Axeman's folly(1), id=5820, option=[null, null, null, null, drop] +item=Axeman's folly(2), id=5821, option=[Drink, null, null, null, drop] +item=Axeman's folly(2), id=5822, option=[null, null, null, null, drop] +item=Axeman's folly(3), id=5823, option=[Drink, null, null, null, drop] +item=Axeman's folly(3), id=5824, option=[null, null, null, null, drop] +item=Axeman's folly(4), id=5825, option=[Drink, null, null, null, drop] +item=Axeman's folly(4), id=5826, option=[null, null, null, null, drop] +item=Chef's delight(1), id=5827, option=[Drink, null, null, null, drop] +item=Chef's delight(1), id=5828, option=[null, null, null, null, drop] +item=Chef's delight(2), id=5829, option=[Drink, null, null, null, drop] +item=Chef's delight(2), id=5830, option=[null, null, null, null, drop] +item=Chef's delight(3), id=5831, option=[Drink, null, null, null, drop] +item=Chef's delight(3), id=5832, option=[null, null, null, null, drop] +item=Chef's delight(4), id=5833, option=[Drink, null, null, null, drop] +item=Chef's delight(4), id=5834, option=[null, null, null, null, drop] +item=Slayer's respite(1), id=5835, option=[Drink, null, null, null, drop] +item=Slayer's respite(1), id=5836, option=[null, null, null, null, drop] +item=Slayer's respite(2), id=5837, option=[Drink, null, null, null, drop] +item=Slayer's respite(2), id=5838, option=[null, null, null, null, drop] +item=Slayer's respite(3), id=5839, option=[Drink, null, null, null, drop] +item=Slayer's respite(3), id=5840, option=[null, null, null, null, drop] +item=Slayer's respite(4), id=5841, option=[Drink, null, null, null, drop] +item=Slayer's respite(4), id=5842, option=[null, null, null, null, drop] +item=Cider(1), id=5843, option=[Drink, null, null, null, drop] +item=Cider(1), id=5844, option=[null, null, null, null, drop] +item=Cider(2), id=5845, option=[Drink, null, null, null, drop] +item=Cider(2), id=5846, option=[null, null, null, null, drop] +item=Cider(3), id=5847, option=[Drink, null, null, null, drop] +item=Cider(3), id=5848, option=[null, null, null, null, drop] +item=Cider(4), id=5849, option=[Drink, null, null, null, drop] +item=Cider(4), id=5850, option=[null, null, null, null, drop] +item=Dwarven stout(m1), id=5851, option=[Drink, null, null, null, drop] +item=Dwarven stout(m1), id=5852, option=[null, null, null, null, drop] +item=Dwarven stout(m2), id=5853, option=[Drink, null, null, null, drop] +item=Dwarven stout(m2), id=5854, option=[null, null, null, null, drop] +item=Dwarven stout(m3), id=5855, option=[Drink, null, null, null, drop] +item=Dwarven stout(m3), id=5856, option=[null, null, null, null, drop] +item=Dwarven stout(m4), id=5857, option=[Drink, null, null, null, drop] +item=Dwarven stout(m4), id=5858, option=[null, null, null, null, drop] +item=Asgarnian ale(m1), id=5859, option=[Drink, null, null, null, drop] +item=Asgarnian ale(m1), id=5860, option=[null, null, null, null, drop] +item=Asgarnian ale(m2), id=5861, option=[Drink, null, null, null, drop] +item=Asgarnian ale(m2), id=5862, option=[null, null, null, null, drop] +item=Asgarnian ale(m3), id=5863, option=[Drink, null, null, null, drop] +item=Asgarnian ale(m3), id=5864, option=[null, null, null, null, drop] +item=Asgarnian ale(m4), id=5865, option=[Drink, null, null, null, drop] +item=Asgarnian ale(m4), id=5866, option=[null, null, null, null, drop] +item=Greenmans ale(m1), id=5867, option=[Drink, null, null, null, drop] +item=Greenmans ale(m1), id=5868, option=[null, null, null, null, drop] +item=Greenmans ale(m2), id=5869, option=[Drink, null, null, null, drop] +item=Greenmans ale(m2), id=5870, option=[null, null, null, null, drop] +item=Greenmans ale(m3), id=5871, option=[Drink, null, null, null, drop] +item=Greenmans ale(m3), id=5872, option=[null, null, null, null, drop] +item=Greenmans ale(m4), id=5873, option=[Drink, null, null, null, drop] +item=Greenmans ale(m4), id=5874, option=[null, null, null, null, drop] +item=Mind bomb(m1), id=5875, option=[Drink, null, null, null, drop] +item=Mind bomb(m1), id=5876, option=[null, null, null, null, drop] +item=Mind bomb(m2), id=5877, option=[Drink, null, null, null, drop] +item=Mind bomb(m2), id=5878, option=[null, null, null, null, drop] +item=Mind bomb(m3), id=5879, option=[Drink, null, null, null, drop] +item=Mind bomb(m3), id=5880, option=[null, null, null, null, drop] +item=Mind bomb(m4), id=5881, option=[Drink, null, null, null, drop] +item=Mind bomb(m4), id=5882, option=[null, null, null, null, drop] +item=Dragon bitter(m1), id=5883, option=[Drink, null, null, null, drop] +item=Dragon bitter(m1), id=5884, option=[null, null, null, null, drop] +item=Dragon bitter(m2), id=5885, option=[Drink, null, null, null, drop] +item=Dragon bitter(m2), id=5886, option=[null, null, null, null, drop] +item=Dragon bitter(m3), id=5887, option=[Drink, null, null, null, drop] +item=Dragon bitter(m3), id=5888, option=[null, null, null, null, drop] +item=Dragon bitter(m4), id=5889, option=[Drink, null, null, null, drop] +item=Dragon bitter(m4), id=5890, option=[null, null, null, null, drop] +item=M'light mead(m1), id=5891, option=[Drink, null, null, null, drop] +item=M'light mead(m1), id=5892, option=[null, null, null, null, drop] +item=M'light mead(m2), id=5893, option=[Drink, null, null, null, drop] +item=M'light mead(m2), id=5894, option=[null, null, null, null, drop] +item=M'light mead(m3), id=5895, option=[Drink, null, null, null, drop] +item=M'light mead(m3), id=5896, option=[null, null, null, null, drop] +item=M'light mead(m4), id=5897, option=[Drink, null, null, null, drop] +item=M'light mead(m4), id=5898, option=[null, null, null, null, drop] +item=Axeman's folly(m1), id=5899, option=[Drink, null, null, null, drop] +item=Axeman's folly(m1), id=5900, option=[null, null, null, null, drop] +item=Axeman's folly(m2), id=5901, option=[Drink, null, null, null, drop] +item=Axeman's folly(m2), id=5902, option=[null, null, null, null, drop] +item=Axeman's folly(m3), id=5903, option=[Drink, null, null, null, drop] +item=Axeman's folly(m3), id=5904, option=[null, null, null, null, drop] +item=Axeman's folly(m4), id=5905, option=[Drink, null, null, null, drop] +item=Axeman's folly(m4), id=5906, option=[null, null, null, null, drop] +item=Chef's delight(m1), id=5907, option=[Drink, null, null, null, drop] +item=Chef's delight(m1), id=5908, option=[null, null, null, null, drop] +item=Chef's delight(m2), id=5909, option=[Drink, null, null, null, drop] +item=Chef's delight(m2), id=5910, option=[null, null, null, null, drop] +item=Chef's delight(m3), id=5911, option=[Drink, null, null, null, drop] +item=Chef's delight(m3), id=5912, option=[null, null, null, null, drop] +item=Chef's delight(m4), id=5913, option=[Drink, null, null, null, drop] +item=Chef's delight(m4), id=5914, option=[null, null, null, null, drop] +item=Slayer respite(m1), id=5915, option=[Drink, null, null, null, drop] +item=Slayer respite(m1), id=5916, option=[null, null, null, null, drop] +item=Slayer respite(m2), id=5917, option=[Drink, null, null, null, drop] +item=Slayer respite(m2), id=5918, option=[null, null, null, null, drop] +item=Slayer respite(m3), id=5919, option=[Drink, null, null, null, drop] +item=Slayer respite(m3), id=5920, option=[null, null, null, null, drop] +item=Slayer respite(m4), id=5921, option=[Drink, null, null, null, drop] +item=Slayer respite(m4), id=5922, option=[null, null, null, null, drop] +item=Cider(m1), id=5923, option=[Drink, null, null, null, drop] +item=Cider(m1), id=5924, option=[null, null, null, null, drop] +item=Cider(m2), id=5925, option=[Drink, null, null, null, drop] +item=Cider(m2), id=5926, option=[null, null, null, null, drop] +item=Cider(m3), id=5927, option=[Drink, null, null, null, drop] +item=Cider(m3), id=5928, option=[null, null, null, null, drop] +item=Cider(m4), id=5929, option=[Drink, null, null, null, drop] +item=Cider(m4), id=5930, option=[null, null, null, null, drop] +item=Jute fibre, id=5931, option=[null, null, null, null, drop] +item=Jute fibre, id=5932, option=[null, null, null, null, drop] +item=Willow branch, id=5933, option=[null, null, null, null, drop] +item=Willow branch, id=5934, option=[null, null, null, null, drop] +item=Coconut milk, id=5935, option=[null, null, null, Empty, drop] +item=Weapon poison+(unf), id=5936, option=[null, null, null, Empty, drop] +item=Weapon poison+, id=5937, option=[null, null, null, Empty, drop] +item=Weapon poison+, id=5938, option=[null, null, null, null, drop] +item=Weapon poison++(unf), id=5939, option=[null, null, null, Empty, drop] +item=Weapon poison++, id=5940, option=[null, null, null, Empty, drop] +item=Weapon poison++, id=5941, option=[null, null, null, null, drop] +item=Antipoison+(unf), id=5942, option=[null, null, null, Empty, drop] +item=Antipoison+(4), id=5943, option=[Drink, null, null, Empty, drop] +item=Antipoison+(4), id=5944, option=[null, null, null, null, drop] +item=Antipoison+(3), id=5945, option=[Drink, null, null, Empty, drop] +item=Antipoison+(3), id=5946, option=[null, null, null, null, drop] +item=Antipoison+(2), id=5947, option=[Drink, null, null, Empty, drop] +item=Antipoison+(2), id=5948, option=[null, null, null, null, drop] +item=Antipoison+(1), id=5949, option=[Drink, null, null, Empty, drop] +item=Antipoison+(1), id=5950, option=[null, null, null, null, drop] +item=Antipoison++(unf), id=5951, option=[null, null, null, Empty, drop] +item=Antipoison++(4), id=5952, option=[Drink, null, null, Empty, drop] +item=Antipoison++(4), id=5953, option=[null, null, null, null, drop] +item=Antipoison++(3), id=5954, option=[Drink, null, null, Empty, drop] +item=Antipoison++(3), id=5955, option=[null, null, null, null, drop] +item=Antipoison++(2), id=5956, option=[Drink, null, null, Empty, drop] +item=Antipoison++(2), id=5957, option=[null, null, null, null, drop] +item=Antipoison++(1), id=5958, option=[Drink, null, null, Empty, drop] +item=Antipoison++(1), id=5959, option=[null, null, null, null, drop] +item=Tomatoes(1), id=5960, option=[Fill, Remove-one, null, null, drop] +item=Tomatoes(1), id=5961, option=[null, null, null, null, drop] +item=Tomatoes(2), id=5962, option=[Fill, Remove-one, Empty, null, drop] +item=Tomatoes(2), id=5963, option=[null, null, null, null, drop] +item=Tomatoes(3), id=5964, option=[Fill, Remove-one, Empty, null, drop] +item=Tomatoes(3), id=5965, option=[null, null, null, null, drop] +item=Tomatoes(4), id=5966, option=[Fill, Remove-one, Empty, null, drop] +item=Tomatoes(4), id=5967, option=[null, null, null, null, drop] +item=Tomatoes(5), id=5968, option=[Fill, Remove-one, Empty, null, drop] +item=Tomatoes(5), id=5969, option=[null, null, null, null, drop] +item=Curry leaf, id=5970, option=[null, null, null, null, drop] +item=Curry leaf, id=5971, option=[null, null, null, null, drop] +item=Papaya fruit, id=5972, option=[Eat, null, null, null, drop] +item=Papaya fruit, id=5973, option=[null, null, null, null, drop] +item=Coconut, id=5974, option=[null, null, null, null, drop] +item=Coconut, id=5975, option=[null, null, null, null, drop] +item=Coconut, id=5976, option=[null, null, null, null, drop] +item=Coconut, id=5977, option=[null, null, null, null, drop] +item=Coconut shell, id=5978, option=[null, null, null, null, drop] +item=Coconut shell, id=5979, option=[null, null, null, null, drop] +item=Calquat fruit, id=5980, option=[null, null, null, null, drop] +item=Calquat fruit, id=5981, option=[null, null, null, null, drop] +item=Watermelon, id=5982, option=[Eat, null, null, null, drop] +item=Watermelon, id=5983, option=[null, null, null, null, drop] +item=Watermelon slice, id=5984, option=[Eat, null, null, null, drop] +item=Watermelon slice, id=5985, option=[null, null, null, null, drop] +item=Sweetcorn, id=5986, option=[null, null, null, null, drop] +item=Sweetcorn, id=5987, option=[null, null, null, null, drop] +item=Cooked sweetcorn, id=5988, option=[Eat, null, null, null, drop] +item=Cooked sweetcorn, id=5989, option=[null, null, null, null, drop] +item=Burnt sweetcorn, id=5990, option=[null, null, null, null, drop] +item=Burnt sweetcorn, id=5991, option=[null, null, null, null, drop] +item=Apple mush, id=5992, option=[null, null, null, Empty, drop] +item=Apple mush, id=5993, option=[null, null, null, null, drop] +item=Hammerstone hops, id=5994, option=[null, null, null, null, drop] +item=Hammerstone hops, id=5995, option=[null, null, null, null, drop] +item=Asgarnian hops, id=5996, option=[null, null, null, null, drop] +item=Asgarnian hops, id=5997, option=[null, null, null, null, drop] +item=Yanillian hops, id=5998, option=[null, null, null, null, drop] +item=Yanillian hops, id=5999, option=[null, null, null, null, drop] +item=Krandorian hops, id=6000, option=[null, null, null, null, drop] +item=Krandorian hops, id=6001, option=[null, null, null, null, drop] +item=Wildblood hops, id=6002, option=[null, null, null, null, drop] +item=Wildblood hops, id=6003, option=[null, null, null, null, drop] +item=Mushroom, id=6004, option=[null, null, null, null, drop] +item=Mushroom, id=6005, option=[null, null, null, null, drop] +item=Barley, id=6006, option=[null, null, null, null, drop] +item=Barley, id=6007, option=[null, null, null, null, drop] +item=Barley malt, id=6008, option=[null, null, null, null, drop] +item=Barley malt, id=6009, option=[null, null, null, null, drop] +item=Marigolds, id=6010, option=[null, null, null, null, drop] +item=Marigolds, id=6011, option=[null, null, null, null, drop] +item=Nasturtiums, id=6012, option=[null, null, null, null, drop] +item=Nasturtiums, id=6013, option=[null, null, null, null, drop] +item=Rosemary, id=6014, option=[null, null, null, null, drop] +item=Rosemary, id=6015, option=[null, null, null, null, drop] +item=Cactus spine, id=6016, option=[null, null, null, null, drop] +item=Cactus spine, id=6017, option=[null, null, null, null, drop] +item=Poison ivy berries, id=6018, option=[null, null, null, null, drop] +item=Poison ivy berries, id=6019, option=[null, null, null, null, drop] +item=Leaves, id=6020, option=[null, null, null, null, drop] +item=Leaves, id=6021, option=[null, null, null, null, drop] +item=Leaves, id=6022, option=[null, null, null, null, drop] +item=Leaves, id=6023, option=[null, null, null, null, drop] +item=Leaves, id=6024, option=[null, null, null, null, drop] +item=Leaves, id=6025, option=[null, null, null, null, drop] +item=Leaves, id=6026, option=[null, null, null, null, drop] +item=Leaves, id=6027, option=[null, null, null, null, drop] +item=Leaves, id=6028, option=[null, null, null, null, drop] +item=Leaves, id=6029, option=[null, null, null, null, drop] +item=Leaves, id=6030, option=[null, null, null, null, drop] +item=Leaves, id=6031, option=[null, null, null, null, drop] +item=Compost, id=6032, option=[null, null, null, Empty, drop] +item=Compost, id=6033, option=[null, null, null, null, drop] +item=Supercompost, id=6034, option=[null, null, null, Empty, drop] +item=Supercompost, id=6035, option=[null, null, null, null, drop] +item=Plant cure, id=6036, option=[null, null, null, Empty, drop] +item=Plant cure, id=6037, option=[null, null, null, null, drop] +item=Magic string, id=6038, option=[null, null, null, null, drop] +item=Magic string, id=6039, option=[null, null, null, null, drop] +item=Amulet of nature, id=6040, option=[Rub, Wear, Teleport, Contact-farmer, Destroy] +item=Pre-nature amulet, id=6041, option=[null, Wear, null, null, drop] +item=Pre-nature amulet, id=6042, option=[null, null, null, null, drop] +item=Oak roots, id=6043, option=[null, null, null, null, drop] +item=Oak roots, id=6044, option=[null, null, null, null, drop] +item=Willow roots, id=6045, option=[null, null, null, null, drop] +item=Willow roots, id=6046, option=[null, null, null, null, drop] +item=Maple roots, id=6047, option=[null, null, null, null, drop] +item=Maple roots, id=6048, option=[null, null, null, null, drop] +item=Yew roots, id=6049, option=[null, null, null, null, drop] +item=Yew roots, id=6050, option=[null, null, null, null, drop] +item=Magic roots, id=6051, option=[null, null, null, null, drop] +item=Magic roots, id=6052, option=[null, null, null, null, drop] +item=Spirit roots, id=6053, option=[null, null, null, null, drop] +item=Spirit roots, id=6054, option=[null, null, null, null, drop] +item=Weeds, id=6055, option=[null, null, null, null, drop] +item=Weeds, id=6056, option=[null, null, null, null, drop] +item=Hay sack, id=6057, option=[null, null, null, null, drop] +item=Hay sack, id=6058, option=[null, null, null, null, drop] +item=Scarecrow, id=6059, option=[null, null, null, null, drop] +item=Stool, id=6060, option=[null, null, null, null, drop] +item=Bronze bolts(p+), id=6061, option=[null, Wield, null, null, drop] +item=Bronze bolts(p++), id=6062, option=[null, Wield, null, null, drop] +item=Spirit tree, id=6063, option=[null, null, null, null, drop] +item=Bloody mourner top, id=6064, option=[null, null, null, null, drop] +item=Mourner top, id=6065, option=[null, Wear, null, null, drop] +item=Mourner trousers, id=6066, option=[null, null, null, null, drop] +item=Mourner trousers, id=6067, option=[null, Wear, null, null, drop] +item=Mourner gloves, id=6068, option=[null, Wear, null, null, drop] +item=Mourner boots, id=6069, option=[null, Wear, null, null, drop] +item=Mourner cloak, id=6070, option=[null, Wear, null, null, drop] +item=Mourner letter, id=6071, option=[Read, null, null, null, drop] +item=Tegid's soap, id=6072, option=[null, null, null, null, drop] +item=Prifddinas' history, id=6073, option=[Read, null, null, null, drop] +item=Whoopsie, id=6074, option=[null, null, null, null, drop] +item=Eastern discovery, id=6075, option=[Read, null, null, null, drop] +item=Whoopsie, id=6076, option=[null, null, null, null, drop] +item=Eastern settlement, id=6077, option=[Read, null, null, null, drop] +item=Whoopsie, id=6078, option=[null, null, null, null, drop] +item=The great divide, id=6079, option=[Read, null, null, null, drop] +item=Whoopsie, id=6080, option=[null, null, null, null, drop] +item=Broken device, id=6081, option=[null, null, null, null, drop] +item=Fixed device, id=6082, option=[Empty, Wield, null, null, drop] +item=Tarnished key, id=6083, option=[null, null, null, null, drop] +item=Worn key, id=6084, option=[null, null, null, null, drop] +item=Red dye bellows, id=6085, option=[null, null, null, null, drop] +item=Blue dye bellows, id=6086, option=[null, null, null, null, drop] +item=Yellow dye bellows, id=6087, option=[null, null, null, null, drop] +item=Green dye bellows, id=6088, option=[null, null, null, null, drop] +item=Blue toad, id=6089, option=[null, null, null, null, drop] +item=Red toad, id=6090, option=[null, null, null, null, drop] +item=Yellow toad, id=6091, option=[null, null, null, null, drop] +item=Green toad, id=6092, option=[null, null, null, null, drop] +item=Rotten apples, id=6093, option=[null, null, null, null, drop] +item=Apple barrel, id=6094, option=[null, null, null, null, drop] +item=Naphtha apple mix, id=6095, option=[null, null, null, null, drop] +item=Toxic naphtha, id=6096, option=[null, null, null, null, drop] +item=Sieve, id=6097, option=[null, null, null, null, drop] +item=Toxic powder, id=6098, option=[null, null, null, null, drop] +item=Teleport crystal (4), id=6099, option=[Activate, null, null, null, drop] +item=Teleport crystal (3), id=6100, option=[Activate, null, null, null, drop] +item=Teleport crystal (2), id=6101, option=[Activate, null, null, null, drop] +item=Teleport crystal (1), id=6102, option=[Activate, null, null, null, drop] +item=Tiny elf crystal, id=6103, option=[null, null, null, null, drop] +item=New key, id=6104, option=[null, null, null, null, Drop] +item=Elf, id=6105, option=[null, null, null, null, drop] +item=Ghostly boots, id=6106, option=[null, Wear, null, null, drop] +item=Ghostly robe, id=6107, option=[null, Wear, null, null, drop] +item=Ghostly robe, id=6108, option=[null, Wear, null, null, drop] +item=Ghostly hood, id=6109, option=[null, Wear, null, null, drop] +item=Ghostly gloves, id=6110, option=[null, Wear, null, null, drop] +item=Ghostly cloak, id=6111, option=[null, Wear, null, null, drop] +item=Kelda seed, id=6112, option=[null, null, null, null, Destroy] +item=Kelda hops, id=6113, option=[null, null, null, null, Destroy] +item=null, id=6114, option=[null, null, null, null, drop] +item=null, id=6115, option=[null, null, null, null, drop] +item=null, id=6116, option=[null, null, null, null, drop] +item=null, id=6117, option=[null, null, null, null, drop] +item=Kelda stout, id=6118, option=[Drink, null, null, null, Destroy] +item=Square stone, id=6119, option=[null, null, null, null, drop] +item=Square stone, id=6120, option=[null, null, null, null, drop] +item=Letter, id=6121, option=[Read, null, null, null, drop] +item=A chair, id=6122, option=[null, null, null, null, drop] +item=Beer glass, id=6123, option=[null, null, null, null, drop] +item=Coconut milk, id=6124, option=[null, null, null, null, drop] +item=Enchanted lyre(2), id=6125, option=[Play, null, null, null, drop] +item=Enchanted lyre(3), id=6126, option=[Play, null, null, null, drop] +item=Enchanted lyre(4), id=6127, option=[Play, null, null, null, drop] +item=Rock-shell helm, id=6128, option=[null, Wear, null, null, drop] +item=Rock-shell plate, id=6129, option=[null, Wear, null, null, drop] +item=Rock-shell legs, id=6130, option=[null, Wear, null, null, drop] +item=Spined helm, id=6131, option=[null, Wear, null, null, drop] +item=Spined helm, id=6132, option=[null, null, null, null, drop] +item=Spined body, id=6133, option=[null, Wear, null, null, drop] +item=Spined body, id=6134, option=[null, null, null, null, drop] +item=Spined chaps, id=6135, option=[null, Wear, null, null, drop] +item=Spined chaps, id=6136, option=[null, null, null, null, drop] +item=Skeletal helm, id=6137, option=[null, Wear, null, null, drop] +item=Skeletal helm, id=6138, option=[null, null, null, null, drop] +item=Skeletal top, id=6139, option=[null, Wear, null, null, drop] +item=Skeletal top, id=6140, option=[null, null, null, null, drop] +item=Skeletal bottoms, id=6141, option=[null, Wear, null, null, drop] +item=Skeletal bottoms, id=6142, option=[null, null, null, null, drop] +item=Spined boots, id=6143, option=[null, Wear, null, null, drop] +item=Spined boots, id=6144, option=[null, null, null, null, drop] +item=Rock-shell boots, id=6145, option=[null, Wear, null, null, drop] +item=Rock-shell boots, id=6146, option=[null, null, null, null, drop] +item=Skeletal boots, id=6147, option=[null, Wear, null, null, drop] +item=Skeletal boots, id=6148, option=[null, null, null, null, drop] +item=Spined gloves, id=6149, option=[null, Wear, null, null, drop] +item=Spined gloves, id=6150, option=[null, null, null, null, drop] +item=Rock-shell gloves, id=6151, option=[null, Wear, null, null, drop] +item=Rock-shell gloves, id=6152, option=[null, null, null, null, drop] +item=Skeletal gloves, id=6153, option=[null, Wear, null, null, drop] +item=Skeletal gloves, id=6154, option=[null, null, null, null, drop] +item=Dagannoth hide, id=6155, option=[null, null, null, null, drop] +item=Dagannoth hide, id=6156, option=[null, null, null, null, drop] +item=Rock-shell chunk, id=6157, option=[null, null, null, null, drop] +item=Rock-shell chunk, id=6158, option=[null, null, null, null, drop] +item=Rock-shell shard, id=6159, option=[null, null, null, null, drop] +item=Rock-shell shard, id=6160, option=[null, null, null, null, drop] +item=Rock-shell splinter, id=6161, option=[null, null, null, null, drop] +item=Rock-shell splinter, id=6162, option=[null, null, null, null, drop] +item=Skull piece, id=6163, option=[null, null, null, null, drop] +item=Skull piece, id=6164, option=[null, null, null, null, drop] +item=Ribcage piece, id=6165, option=[null, null, null, null, drop] +item=Ribcage piece, id=6166, option=[null, null, null, null, drop] +item=Fibula piece, id=6167, option=[null, null, null, null, drop] +item=Fibula piece, id=6168, option=[null, null, null, null, drop] +item=Circular hide, id=6169, option=[null, null, null, null, drop] +item=Circular hide, id=6170, option=[null, null, null, null, drop] +item=Flattened hide, id=6171, option=[null, null, null, null, drop] +item=Flattened hide, id=6172, option=[null, null, null, null, drop] +item=Stretched hide, id=6173, option=[null, null, null, null, drop] +item=Stretched hide, id=6174, option=[null, null, null, null, drop] +item=Rock-shell helm, id=6175, option=[null, null, null, null, drop] +item=Rock-shell plate, id=6176, option=[null, null, null, null, drop] +item=Rock-shell legs, id=6177, option=[null, null, null, null, drop] +item=Raw pheasant, id=6178, option=[null, null, null, null, drop] +item=Raw pheasant, id=6179, option=[null, null, null, null, drop] +item=Lederhosen top, id=6180, option=[null, Wear, null, null, drop] +item=Lederhosen shorts, id=6181, option=[null, Wear, null, null, drop] +item=Lederhosen hat, id=6182, option=[null, Wear, null, null, drop] +item=Frog token, id=6183, option=[null, null, null, null, drop] +item=Prince tunic, id=6184, option=[null, Wear, null, null, drop] +item=Prince leggings, id=6185, option=[null, Wear, null, null, drop] +item=Princess blouse, id=6186, option=[null, Wear, null, null, drop] +item=Princess skirt, id=6187, option=[null, Wear, null, null, drop] +item=Frog mask, id=6188, option=[null, Wear, null, null, drop] +item=null, id=6189, option=[null, null, null, null, drop] +item=null, id=6190, option=[null, null, null, null, drop] +item=null, id=6191, option=[null, null, null, null, drop] +item=null, id=6192, option=[null, null, null, null, drop] +item=null, id=6193, option=[null, null, null, null, drop] +item=null, id=6194, option=[null, null, null, null, drop] +item=null, id=6195, option=[null, null, null, null, drop] +item=null, id=6196, option=[null, null, null, null, drop] +item=null, id=6197, option=[null, null, null, null, drop] +item=null, id=6198, option=[null, null, null, null, drop] +item=Mystery box, id=6199, option=[Open, null, null, null, drop] +item=Raw fishlike thing, id=6200, option=[null, null, null, null, drop] +item=Fishmonger, id=6201, option=[Wear, null, null, null, drop] +item=Fishlike thing, id=6202, option=[Eat, null, null, null, drop] +item=Sine wave, id=6203, option=[Wear, null, null, null, drop] +item=Raw fishlike thing, id=6204, option=[null, null, null, null, drop] +item=9mm revolver, id=6205, option=[Wear, null, null, null, drop] +item=Fishlike thing, id=6206, option=[Eat, null, null, null, drop] +item=Mobile phone, id=6207, option=[Wear, null, null, null, drop] +item=Man speak amulet, id=6208, option=[null, Wear, null, null, drop] +item=Small fishing net, id=6209, option=[null, null, null, null, drop] +item=Sphinx baby, id=6210, option=[Wear, null, null, null, drop] +item=Teak pyre logs, id=6211, option=[null, null, null, null, drop] +item=Teak pyre logs, id=6212, option=[null, null, null, null, drop] +item=Mahogany pyre log, id=6213, option=[null, null, null, null, drop] +item=Mahogany pyre log, id=6214, option=[null, null, null, null, drop] +item=Broodoo shield (10), id=6215, option=[null, Wield, null, null, drop] +item=Broodoo shield (10), id=6216, option=[null, null, null, null, drop] +item=Broodoo shield (9), id=6217, option=[null, Wield, null, null, drop] +item=Broodoo shield (9), id=6218, option=[null, null, null, null, drop] +item=Broodoo shield (8), id=6219, option=[null, Wield, null, null, drop] +item=Broodoo shield (8), id=6220, option=[null, null, null, null, drop] +item=Broodoo shield (7), id=6221, option=[null, Wield, null, null, drop] +item=Broodoo shield (7), id=6222, option=[null, null, null, null, drop] +item=Broodoo shield (6), id=6223, option=[null, Wield, null, null, drop] +item=Broodoo shield (6), id=6224, option=[null, null, null, null, drop] +item=Broodoo shield (5), id=6225, option=[null, Wield, null, null, drop] +item=Broodoo shield (5), id=6226, option=[null, null, null, null, drop] +item=Broodoo shield (4), id=6227, option=[null, Wield, null, null, drop] +item=Broodoo shield (4), id=6228, option=[null, null, null, null, drop] +item=Broodoo shield (3), id=6229, option=[null, Wield, null, null, drop] +item=Broodoo shield (3), id=6230, option=[null, null, null, null, drop] +item=Broodoo shield (2), id=6231, option=[null, Wield, null, null, drop] +item=Broodoo shield (2), id=6232, option=[null, null, null, null, drop] +item=Broodoo shield (1), id=6233, option=[null, Wield, null, null, drop] +item=Broodoo shield (1), id=6234, option=[null, null, null, null, drop] +item=Broodoo shield, id=6235, option=[null, Wield, null, null, drop] +item=Broodoo shield, id=6236, option=[null, null, null, null, drop] +item=Broodoo shield (10), id=6237, option=[null, Wield, null, null, drop] +item=Broodoo shield (10), id=6238, option=[null, null, null, null, drop] +item=Broodoo shield (9), id=6239, option=[null, Wield, null, null, drop] +item=Broodoo shield (9), id=6240, option=[null, null, null, null, drop] +item=Broodoo shield (8), id=6241, option=[null, Wield, null, null, drop] +item=Broodoo shield (8), id=6242, option=[null, null, null, null, drop] +item=Broodoo shield (7), id=6243, option=[null, Wield, null, null, drop] +item=Broodoo shield (7), id=6244, option=[null, null, null, null, drop] +item=Broodoo shield (6), id=6245, option=[null, Wield, null, null, drop] +item=Broodoo shield (6), id=6246, option=[null, null, null, null, drop] +item=Broodoo shield (5), id=6247, option=[null, Wield, null, null, drop] +item=Broodoo shield (5), id=6248, option=[null, null, null, null, drop] +item=Broodoo shield (4), id=6249, option=[null, Wield, null, null, drop] +item=Broodoo shield (4), id=6250, option=[null, null, null, null, drop] +item=Broodoo shield (3), id=6251, option=[null, Wield, null, null, drop] +item=Broodoo shield (3), id=6252, option=[null, null, null, null, drop] +item=Broodoo shield (2), id=6253, option=[null, Wield, null, null, drop] +item=Broodoo shield (2), id=6254, option=[null, null, null, null, drop] +item=Broodoo shield (1), id=6255, option=[null, Wield, null, null, drop] +item=Broodoo shield (1), id=6256, option=[null, null, null, null, drop] +item=Broodoo shield, id=6257, option=[null, Wield, null, null, drop] +item=Broodoo shield, id=6258, option=[null, null, null, null, drop] +item=Broodoo shield (10), id=6259, option=[null, Wield, null, null, drop] +item=Broodoo shield (10), id=6260, option=[null, null, null, null, drop] +item=Broodoo shield (9), id=6261, option=[null, Wield, null, null, drop] +item=Broodoo shield (9), id=6262, option=[null, null, null, null, drop] +item=Broodoo shield (8), id=6263, option=[null, Wield, null, null, drop] +item=Broodoo shield (8), id=6264, option=[null, null, null, null, drop] +item=Broodoo shield (7), id=6265, option=[null, Wield, null, null, drop] +item=Broodoo shield (7), id=6266, option=[null, null, null, null, drop] +item=Broodoo shield (6), id=6267, option=[null, Wield, null, null, drop] +item=Broodoo shield (6), id=6268, option=[null, null, null, null, drop] +item=Broodoo shield (5), id=6269, option=[null, Wield, null, null, drop] +item=Broodoo shield (5), id=6270, option=[null, null, null, null, drop] +item=Broodoo shield (4), id=6271, option=[null, Wield, null, null, drop] +item=Broodoo shield (4), id=6272, option=[null, null, null, null, drop] +item=Broodoo shield (3), id=6273, option=[null, Wield, null, null, drop] +item=Broodoo shield (3), id=6274, option=[null, null, null, null, drop] +item=Broodoo shield (2), id=6275, option=[null, Wield, null, null, drop] +item=Broodoo shield (2), id=6276, option=[null, null, null, null, drop] +item=Broodoo shield (1), id=6277, option=[null, Wield, null, null, drop] +item=Broodoo shield (1), id=6278, option=[null, null, null, null, drop] +item=Broodoo shield, id=6279, option=[null, Wield, null, null, drop] +item=Broodoo shield, id=6280, option=[null, null, null, null, drop] +item=Thatch spar light, id=6281, option=[null, null, null, null, drop] +item=Thatch spar light, id=6282, option=[null, null, null, null, drop] +item=Thatch spar med, id=6283, option=[null, null, null, null, drop] +item=Thatch spar med, id=6284, option=[null, null, null, null, drop] +item=Thatch spar dense, id=6285, option=[null, null, null, null, drop] +item=Thatch spar dense, id=6286, option=[null, null, null, null, drop] +item=Snake hide, id=6287, option=[null, null, null, null, drop] +item=Snake hide, id=6288, option=[null, null, null, null, drop] +item=Snakeskin, id=6289, option=[null, null, null, null, drop] +item=Snakeskin, id=6290, option=[null, null, null, null, drop] +item=Spider carcass, id=6291, option=[null, null, null, null, drop] +item=Spider carcass, id=6292, option=[null, null, null, null, drop] +item=Spider on stick, id=6293, option=[null, null, null, null, drop] +item=Spider on stick, id=6294, option=[null, null, null, null, drop] +item=Spider on shaft, id=6295, option=[null, null, null, null, drop] +item=Spider on shaft, id=6296, option=[null, null, null, null, drop] +item=Spider on stick, id=6297, option=[Eat, null, null, null, drop] +item=Spider on stick, id=6298, option=[null, null, null, null, drop] +item=Spider on shaft, id=6299, option=[Eat, null, null, null, drop] +item=Spider on shaft, id=6300, option=[null, null, null, null, drop] +item=Burnt spider, id=6301, option=[null, null, null, null, drop] +item=Burnt spider, id=6302, option=[null, null, null, null, drop] +item=Spider on shaft, id=6303, option=[null, null, null, null, drop] +item=Spider on shaft, id=6304, option=[null, null, null, null, drop] +item=Skewer stick, id=6305, option=[null, null, null, null, drop] +item=Trading sticks, id=6306, option=[null, null, null, null, drop] +item=null, id=6307, option=[null, null, null, null, drop] +item=null, id=6308, option=[null, null, null, null, drop] +item=null, id=6309, option=[null, null, null, null, drop] +item=null, id=6310, option=[null, null, null, null, drop] +item=Gout tuber, id=6311, option=[Eat, null, null, null, drop] +item=Gout tuber, id=6312, option=[null, null, null, null, drop] +item=Opal machete, id=6313, option=[null, Wield, null, null, drop] +item=Opal machete, id=6314, option=[null, null, null, null, drop] +item=Jade machete, id=6315, option=[null, Wield, null, null, drop] +item=Jade machete, id=6316, option=[null, null, null, null, drop] +item=Red topaz machete, id=6317, option=[null, Wield, null, null, drop] +item=Red topaz machete, id=6318, option=[null, null, null, null, drop] +item=Proboscis, id=6319, option=[null, null, null, null, drop] +item=null, id=6320, option=[null, null, null, null, drop] +item=null, id=6321, option=[null, null, null, null, drop] +item=Snakeskin body, id=6322, option=[null, Wear, null, null, drop] +item=Snakeskin body, id=6323, option=[null, null, null, null, drop] +item=Snakeskin chaps, id=6324, option=[null, Wear, null, null, drop] +item=Snakeskin chaps, id=6325, option=[null, null, null, null, drop] +item=Snakeskin bandana, id=6326, option=[null, Wear, null, null, drop] +item=Snakeskin bandana, id=6327, option=[null, null, null, null, drop] +item=Snakeskin boots, id=6328, option=[null, Wear, null, null, drop] +item=Snakeskin boots, id=6329, option=[null, null, null, null, drop] +item=Snakeskin v'brace, id=6330, option=[null, Wear, null, null, drop] +item=Snakeskin v'brace, id=6331, option=[null, null, null, null, drop] +item=Mahogany logs, id=6332, option=[null, null, null, null, drop] +item=Teak logs, id=6333, option=[null, null, null, null, drop] +item=Teak logs, id=6334, option=[null, null, null, null, drop] +item=Tribal mask, id=6335, option=[null, Wear, null, null, drop] +item=Tribal mask, id=6336, option=[null, null, null, null, drop] +item=Tribal mask, id=6337, option=[null, Wear, null, null, drop] +item=Tribal mask, id=6338, option=[null, null, null, null, drop] +item=Tribal mask, id=6339, option=[null, Wear, null, null, drop] +item=Tribal mask, id=6340, option=[null, null, null, null, drop] +item=Tribal top, id=6341, option=[null, Wear, null, null, drop] +item=Tribal top, id=6342, option=[null, null, null, null, drop] +item=Villager robe, id=6343, option=[null, Wear, null, null, drop] +item=Villager robe, id=6344, option=[null, null, null, null, drop] +item=Villager hat, id=6345, option=[null, Wear, null, null, drop] +item=Villager hat, id=6346, option=[null, null, null, null, drop] +item=Villager armband, id=6347, option=[null, Wear, null, null, drop] +item=Villager armband, id=6348, option=[null, null, null, null, drop] +item=Villager sandals, id=6349, option=[null, Wear, null, null, drop] +item=Villager sandals, id=6350, option=[null, null, null, null, drop] +item=Tribal top, id=6351, option=[null, Wear, null, null, drop] +item=Tribal top, id=6352, option=[null, null, null, null, drop] +item=Villager robe, id=6353, option=[null, Wear, null, null, drop] +item=Villager robe, id=6354, option=[null, null, null, null, drop] +item=Villager hat, id=6355, option=[null, Wear, null, null, drop] +item=Villager hat, id=6356, option=[null, null, null, null, drop] +item=Villager sandals, id=6357, option=[null, Wear, null, null, drop] +item=Villager sandals, id=6358, option=[null, null, null, null, drop] +item=Villager armband, id=6359, option=[null, Wear, null, null, drop] +item=Villager armband, id=6360, option=[null, null, null, null, drop] +item=Tribal top, id=6361, option=[null, Wear, null, null, drop] +item=Tribal top, id=6362, option=[null, null, null, null, drop] +item=Villager robe, id=6363, option=[null, Wear, null, null, drop] +item=Villager robe, id=6364, option=[null, null, null, null, drop] +item=Villager hat, id=6365, option=[null, Wear, null, null, drop] +item=Villager hat, id=6366, option=[null, null, null, null, drop] +item=Villager sandals, id=6367, option=[null, Wear, null, null, drop] +item=Villager sandals, id=6368, option=[null, null, null, null, drop] +item=Villager armband, id=6369, option=[null, Wear, null, null, drop] +item=Villager armband, id=6370, option=[null, null, null, null, drop] +item=Tribal top, id=6371, option=[null, Wear, null, null, drop] +item=Tribal top, id=6372, option=[null, null, null, null, drop] +item=Villager robe, id=6373, option=[null, Wear, null, null, drop] +item=Villager robe, id=6374, option=[null, null, null, null, drop] +item=Villager hat, id=6375, option=[null, Wear, null, null, drop] +item=Villager hat, id=6376, option=[null, null, null, null, drop] +item=Villager sandals, id=6377, option=[null, Wear, null, null, drop] +item=Villager sandals, id=6378, option=[null, null, null, null, drop] +item=Villager armband, id=6379, option=[null, Wear, null, null, drop] +item=Villager armband, id=6380, option=[null, null, null, null, drop] +item=Tax relief, id=6381, option=[Wear, null, null, null, drop] +item=Fez, id=6382, option=[null, Wear, null, null, drop] +item=Fez, id=6383, option=[null, null, null, null, drop] +item=Desert top, id=6384, option=[null, Wear, null, null, drop] +item=Desert top, id=6385, option=[null, null, null, null, drop] +item=Desert robes, id=6386, option=[null, Wear, null, null, drop] +item=Desert robes, id=6387, option=[null, null, null, null, drop] +item=Desert top, id=6388, option=[null, Wear, null, null, drop] +item=Desert top, id=6389, option=[null, null, null, null, drop] +item=Desert legs, id=6390, option=[null, Wear, null, null, drop] +item=Desert legs, id=6391, option=[null, null, null, null, drop] +item=Menap headgear, id=6392, option=[null, Wear, null, null, drop] +item=Menap headgear, id=6393, option=[null, null, null, null, drop] +item=Menaphite top, id=6394, option=[null, Wear, null, null, drop] +item=Menaphite top, id=6395, option=[null, null, null, null, drop] +item=Menaphite robe, id=6396, option=[null, Wear, null, null, drop] +item=Menaphite robe, id=6397, option=[null, null, null, null, drop] +item=Menap action kilt, id=6398, option=[null, Wear, null, null, drop] +item=Menap action kilt, id=6399, option=[null, null, null, null, drop] +item=Menap headgear, id=6400, option=[null, Wear, null, null, drop] +item=Menap headgear, id=6401, option=[null, null, null, null, drop] +item=Menaphite top, id=6402, option=[null, Wear, null, null, drop] +item=Menaphite top, id=6403, option=[null, null, null, null, drop] +item=Menaphite robe, id=6404, option=[null, Wear, null, null, drop] +item=Menaphite robe, id=6405, option=[null, null, null, null, drop] +item=Menap action kilt, id=6406, option=[null, Wear, null, null, drop] +item=Menap action kilt, id=6407, option=[null, null, null, null, drop] +item=Oak blackjack(o), id=6408, option=[null, Wield, null, null, drop] +item=Oak blackjack(o), id=6409, option=[null, null, null, null, drop] +item=Oak blackjack(d), id=6410, option=[null, Wield, null, null, drop] +item=Oak blackjack(d), id=6411, option=[null, null, null, null, drop] +item=Willow blackjack(o), id=6412, option=[null, Wield, null, null, drop] +item=Willow blackjack(o), id=6413, option=[null, null, null, null, drop] +item=Willow blackjack(d), id=6414, option=[null, Wield, null, null, drop] +item=Willow blackjack(d), id=6415, option=[null, null, null, null, drop] +item=Maple blackjack, id=6416, option=[null, Wield, null, null, drop] +item=Maple blackjack, id=6417, option=[null, null, null, null, drop] +item=Maple blackjack(o), id=6418, option=[null, Wield, null, null, drop] +item=Maple blackjack(o), id=6419, option=[null, null, null, null, drop] +item=Maple blackjack(d), id=6420, option=[null, Wield, null, null, drop] +item=Maple blackjack(d), id=6421, option=[null, null, null, null, drop] +item=Air rune, id=6422, option=[null, null, null, null, drop] +item=Air rune, id=6423, option=[null, null, null, null, drop] +item=Water rune, id=6424, option=[null, null, null, null, drop] +item=Water rune, id=6425, option=[null, null, null, null, drop] +item=Earth rune, id=6426, option=[null, null, null, null, drop] +item=Earth rune, id=6427, option=[null, null, null, null, drop] +item=Fire rune, id=6428, option=[null, null, null, null, drop] +item=Fire rune, id=6429, option=[null, null, null, null, drop] +item=Chaos rune, id=6430, option=[null, null, null, null, drop] +item=Chaos rune, id=6431, option=[null, null, null, null, drop] +item=Death rune, id=6432, option=[null, null, null, null, drop] +item=Death rune, id=6433, option=[null, null, null, null, drop] +item=Law rune, id=6434, option=[null, null, null, null, drop] +item=Law rune, id=6435, option=[null, null, null, null, drop] +item=Mind rune, id=6436, option=[null, null, null, null, drop] +item=Mind rune, id=6437, option=[null, null, null, null, drop] +item=Body rune, id=6438, option=[null, null, null, null, drop] +item=Body rune, id=6439, option=[null, null, null, null, drop] +item=null, id=6440, option=[null, null, null, null, drop] +item=null, id=6441, option=[null, null, null, null, drop] +item=null, id=6442, option=[null, null, null, null, drop] +item=null, id=6443, option=[null, null, null, null, drop] +item=null, id=6444, option=[null, null, null, null, drop] +item=null, id=6445, option=[null, null, null, null, drop] +item=null, id=6446, option=[null, null, null, null, drop] +item=null, id=6447, option=[null, null, null, null, drop] +item=Spadeful of coke, id=6448, option=[Empty, null, null, null, drop] +item=null, id=6449, option=[null, null, null, null, drop] +item=Whoopsie, id=6450, option=[Wear, null, null, null, drop] +item=null, id=6451, option=[null, null, null, null, drop] +item=Whoopsie, id=6452, option=[Wear, null, null, null, drop] +item=White rose seed, id=6453, option=[null, null, null, null, Destroy] +item=Red rose seed, id=6454, option=[null, null, null, null, Destroy] +item=Pink rose seed, id=6455, option=[null, null, null, null, Destroy] +item=Vine seed, id=6456, option=[null, null, null, null, Destroy] +item=Delphinium seed, id=6457, option=[null, null, null, null, Destroy] +item=Orchid seed, id=6458, option=[null, null, null, null, Destroy] +item=Orchid seed, id=6459, option=[null, null, null, null, Destroy] +item=Snowdrop seed, id=6460, option=[null, null, null, null, Destroy] +item=White tree shoot, id=6461, option=[null, null, null, null, Destroy] +item=White tree shoot, id=6462, option=[null, null, null, null, Destroy] +item=White tree shoot, id=6463, option=[null, null, null, null, Destroy] +item=White tree sapling, id=6464, option=[null, null, null, null, Destroy] +item=Ring of charos(a), id=6465, option=[null, Wear, null, null, Destroy] +item=Rune shards, id=6466, option=[null, null, null, null, drop] +item=Rune dust, id=6467, option=[null, null, null, null, drop] +item=Plant cure, id=6468, option=[null, null, null, null, drop] +item=White tree fruit, id=6469, option=[Eat, null, null, null, drop] +item=Compost potion(4), id=6470, option=[null, null, null, Empty, drop] +item=Compost potion(4), id=6471, option=[null, null, null, null, drop] +item=Compost potion(3), id=6472, option=[null, null, null, Empty, drop] +item=Compost potion(3), id=6473, option=[null, null, null, null, drop] +item=Compost potion(2), id=6474, option=[null, null, null, Empty, drop] +item=Compost potion(2), id=6475, option=[null, null, null, null, drop] +item=Compost potion(1), id=6476, option=[null, null, null, Empty, drop] +item=Compost potion(1), id=6477, option=[null, null, null, null, drop] +item=Trolley, id=6478, option=[null, null, null, null, Destroy] +item=List, id=6479, option=[Read, null, null, null, Destroy] +item=null, id=6480, option=[null, null, null, null, drop] +item=null, id=6481, option=[null, null, null, null, drop] +item=null, id=6482, option=[null, null, null, null, drop] +item=null, id=6483, option=[null, null, null, null, drop] +item=null, id=6484, option=[null, null, null, null, drop] +item=null, id=6485, option=[null, null, null, null, drop] +item=null, id=6486, option=[null, null, null, null, drop] +item=null, id=6487, option=[null, null, null, null, drop] +item=null, id=6488, option=[null, null, null, null, drop] +item=null, id=6489, option=[null, null, null, null, drop] +item=null, id=6490, option=[null, null, null, null, drop] +item=null, id=6491, option=[null, null, null, null, drop] +item=null, id=6492, option=[null, null, null, null, drop] +item=null, id=6493, option=[null, null, null, null, drop] +item=null, id=6494, option=[null, null, null, null, drop] +item=null, id=6495, option=[null, null, null, null, drop] +item=null, id=6496, option=[null, null, null, null, drop] +item=null, id=6497, option=[null, null, null, null, drop] +item=null, id=6498, option=[null, null, null, null, drop] +item=null, id=6499, option=[null, null, null, null, drop] +item=null, id=6500, option=[null, null, null, null, drop] +item=null, id=6501, option=[null, null, null, null, drop] +item=null, id=6502, option=[null, null, null, null, drop] +item=null, id=6503, option=[null, null, null, null, drop] +item=null, id=6504, option=[null, null, null, null, drop] +item=null, id=6505, option=[null, null, null, null, drop] +item=null, id=6506, option=[null, null, null, null, drop] +item=null, id=6507, option=[null, null, null, null, drop] +item=null, id=6508, option=[null, null, null, null, drop] +item=null, id=6509, option=[null, null, null, null, drop] +item=null, id=6510, option=[null, null, null, null, drop] +item=null, id=6511, option=[null, null, null, null, drop] +item=null, id=6512, option=[null, null, null, null, drop] +item=null, id=6513, option=[null, null, null, null, drop] +item=Agility jump, id=6514, option=[null, null, null, null, drop] +item=Agility balance, id=6515, option=[null, null, null, null, drop] +item=Agility contortion, id=6516, option=[null, null, null, null, drop] +item=Agility climb, id=6517, option=[null, null, null, null, drop] +item=Agility jump, id=6518, option=[null, null, null, null, drop] +item=Agility balance, id=6519, option=[null, null, null, null, drop] +item=Agility contortion, id=6520, option=[null, null, null, null, drop] +item=Agility climb, id=6521, option=[null, null, null, null, drop] +item=Toktz-xil-ul, id=6522, option=[null, Wield, null, null, drop] +item=Toktz-xil-ak, id=6523, option=[null, Wield, null, null, drop] +item=Toktz-ket-xil, id=6524, option=[null, Wield, null, null, drop] +item=Toktz-xil-ek, id=6525, option=[null, Wield, null, null, drop] +item=Toktz-mej-tal, id=6526, option=[null, Wield, null, null, drop] +item=Tzhaar-ket-em, id=6527, option=[null, Wield, null, null, drop] +item=Tzhaar-ket-om, id=6528, option=[null, Wield, null, null, drop] +item=Tokkul, id=6529, option=[null, null, null, null, drop] +item=null, id=6530, option=[null, null, null, null, drop] +item=null, id=6531, option=[null, null, null, null, drop] +item=null, id=6532, option=[null, null, null, null, drop] +item=null, id=6533, option=[null, null, null, null, drop] +item=null, id=6534, option=[null, null, null, null, drop] +item=Toktz-xil-ak, id=6535, option=[null, null, null, null, drop] +item=Toktz-ket-xil, id=6536, option=[null, null, null, null, drop] +item=Toktz-xil-ek, id=6537, option=[null, null, null, null, drop] +item=Toktz-mej-tal, id=6538, option=[null, null, null, null, drop] +item=Tzhaar-ket-em, id=6539, option=[null, null, null, null, drop] +item=Tzhaar-ket-om, id=6540, option=[null, null, null, null, drop] +item=Mouse toy, id=6541, option=[null, Wield, null, null, Destroy] +item=Present, id=6542, option=[Open, null, null, null, Destroy] +item=Antique lamp, id=6543, option=[Rub, null, null, null, Destroy] +item=Catspeak amulet(e), id=6544, option=[null, Wear, Open, null, Destroy] +item=Chores, id=6545, option=[Read, null, null, null, Destroy] +item=Recipe, id=6546, option=[Read, null, null, null, Destroy] +item=Doctors hat, id=6547, option=[null, Wear, null, null, Destroy] +item=Nurse hat, id=6548, option=[null, Wear, null, null, Destroy] +item=Lazy cat, id=6549, option=[null, null, null, null, drop] +item=Lazy cat, id=6550, option=[null, null, null, null, drop] +item=Lazy cat, id=6551, option=[null, null, null, null, drop] +item=Lazy cat, id=6552, option=[null, null, null, null, drop] +item=Lazy cat, id=6553, option=[null, null, null, null, drop] +item=Lazy cat, id=6554, option=[null, null, null, null, drop] +item=Wily cat, id=6555, option=[null, null, null, null, drop] +item=Wily cat, id=6556, option=[null, null, null, null, drop] +item=Wily cat, id=6557, option=[null, null, null, null, drop] +item=Wily cat, id=6558, option=[null, null, null, null, drop] +item=Wily cat, id=6559, option=[null, null, null, null, drop] +item=Wily cat, id=6560, option=[null, null, null, null, drop] +item=Ahab's beer, id=6561, option=[null, null, null, null, drop] +item=Mud battlestaff, id=6562, option=[null, Wield, null, null, drop] +item=Mystic mud staff, id=6563, option=[null, Wield, null, null, drop] +item=Onyx ring, id=6564, option=[null, null, null, null, drop] +item=Onyx necklace, id=6565, option=[null, null, null, null, drop] +item=Onyx amulet, id=6566, option=[null, null, null, null, drop] +item=null, id=6567, option=[null, null, null, null, drop] +item=Obsidian cape, id=6568, option=[null, Wear, null, null, drop] +item=Obsidian cape, id=6569, option=[null, null, null, null, drop] +item=Fire cape, id=6570, option=[null, Wear, null, null, drop] +item=Uncut onyx, id=6571, option=[null, null, null, null, drop] +item=Uncut onyx, id=6572, option=[null, null, null, null, drop] +item=Onyx, id=6573, option=[null, null, null, null, drop] +item=Onyx, id=6574, option=[null, null, null, null, drop] +item=Onyx ring, id=6575, option=[null, Wear, null, null, drop] +item=Onyx ring, id=6576, option=[null, null, null, null, drop] +item=Onyx necklace, id=6577, option=[null, Wear, null, null, drop] +item=Onyx necklace, id=6578, option=[null, null, null, null, drop] +item=Onyx amulet, id=6579, option=[null, null, null, null, drop] +item=Onyx amulet, id=6580, option=[null, null, null, null, drop] +item=Onyx amulet, id=6581, option=[null, Wear, null, null, drop] +item=Onyx amulet, id=6582, option=[null, null, null, null, drop] +item=Ring of stone, id=6583, option=[null, Wear, null, null, drop] +item=Ring of stone, id=6584, option=[null, null, null, null, drop] +item=Amulet of fury, id=6585, option=[null, Wear, null, null, drop] +item=Amulet of fury, id=6586, option=[null, null, null, null, drop] +item=White claws, id=6587, option=[null, Wear, null, null, drop] +item=White claws, id=6588, option=[null, null, null, null, drop] +item=White battleaxe, id=6589, option=[null, Wield, null, null, drop] +item=White battleaxe, id=6590, option=[null, null, null, null, drop] +item=White dagger, id=6591, option=[null, Wield, null, null, drop] +item=White dagger, id=6592, option=[null, null, null, null, drop] +item=White dagger(p), id=6593, option=[null, Wield, null, null, drop] +item=White dagger(p), id=6594, option=[null, null, null, null, drop] +item=White dagger(p+), id=6595, option=[null, Wield, null, null, drop] +item=White dagger(p+), id=6596, option=[null, null, null, null, drop] +item=White dagger(p++), id=6597, option=[null, Wield, null, null, drop] +item=White dagger(p++), id=6598, option=[null, null, null, null, drop] +item=White halberd, id=6599, option=[null, Wield, null, null, drop] +item=White halberd, id=6600, option=[null, null, null, null, drop] +item=White mace, id=6601, option=[null, Wield, null, null, drop] +item=White mace, id=6602, option=[null, null, null, null, drop] +item=White magic staff, id=6603, option=[null, Wield, null, null, drop] +item=White magic staff, id=6604, option=[null, null, null, null, drop] +item=White sword, id=6605, option=[null, Wield, null, null, drop] +item=White sword, id=6606, option=[null, null, null, null, drop] +item=White longsword, id=6607, option=[null, Wield, null, null, drop] +item=White longsword, id=6608, option=[null, null, null, null, drop] +item=White 2h sword, id=6609, option=[null, Wield, null, null, drop] +item=White 2h sword, id=6610, option=[null, null, null, null, drop] +item=White scimitar, id=6611, option=[null, Wield, null, null, drop] +item=White scimitar, id=6612, option=[null, null, null, null, drop] +item=White warhammer, id=6613, option=[null, Wield, null, null, drop] +item=White warhammer, id=6614, option=[null, null, null, null, drop] +item=White chainbody, id=6615, option=[null, Wear, null, null, drop] +item=White chainbody, id=6616, option=[null, null, null, null, drop] +item=White platebody, id=6617, option=[null, Wear, null, null, drop] +item=White platebody, id=6618, option=[null, null, null, null, drop] +item=White boots, id=6619, option=[null, Wear, null, null, drop] +item=White boots, id=6620, option=[null, null, null, null, drop] +item=White med helm, id=6621, option=[null, Wear, null, null, drop] +item=White med helm, id=6622, option=[null, null, null, null, drop] +item=White full helm, id=6623, option=[null, Wear, null, null, drop] +item=White full helm, id=6624, option=[null, null, null, null, drop] +item=White platelegs, id=6625, option=[null, Wear, null, null, drop] +item=White platelegs, id=6626, option=[null, null, null, null, drop] +item=White plateskirt, id=6627, option=[null, Wear, null, null, drop] +item=White plateskirt, id=6628, option=[null, null, null, null, drop] +item=White gloves, id=6629, option=[null, Wear, null, null, drop] +item=White gloves, id=6630, option=[null, null, null, null, drop] +item=White sq shield, id=6631, option=[null, Wield, null, null, drop] +item=White sq shield, id=6632, option=[null, null, null, null, drop] +item=White kiteshield, id=6633, option=[null, Wear, null, null, drop] +item=White kiteshield, id=6634, option=[null, null, null, null, drop] +item=Commorb, id=6635, option=[Scan, Contact, null, Playback, Destroy] +item=Solus's hat, id=6636, option=[null, null, null, null, drop] +item=Dark beast, id=6637, option=[null, null, null, null, drop] +item=Colour wheel, id=6638, option=[null, null, null, null, drop] +item=Hand mirror, id=6639, option=[null, null, null, null, Destroy] +item=Red crystal, id=6640, option=[null, null, null, null, Destroy] +item=Yellow crystal, id=6641, option=[null, null, null, null, Destroy] +item=Green crystal, id=6642, option=[null, null, null, null, Destroy] +item=Cyan crystal, id=6643, option=[null, null, null, null, Destroy] +item=Blue crystal, id=6644, option=[null, null, null, null, Destroy] +item=Magenta crystal, id=6645, option=[null, null, null, null, Destroy] +item=Fractured crystal, id=6646, option=[null, null, null, null, Destroy] +item=Fractured crystal, id=6647, option=[null, null, null, null, Destroy] +item=Item list, id=6648, option=[Read, null, null, null, Destroy] +item=Edern's journal, id=6649, option=[Read, null, null, null, drop] +item=Blackened crystal, id=6650, option=[null, null, null, null, drop] +item=Newly made crystal, id=6651, option=[null, null, null, null, drop] +item=Newly made crystal, id=6652, option=[null, null, null, null, drop] +item=Crystal trinket, id=6653, option=[null, null, null, null, Destroy] +item=Camo top, id=6654, option=[null, Wear, null, null, drop] +item=Camo bottoms, id=6655, option=[null, Wear, null, null, drop] +item=Camo helmet, id=6656, option=[null, Wear, null, null, drop] +item=Camo top, id=6657, option=[null, null, null, null, drop] +item=Camo bottoms, id=6658, option=[null, null, null, null, drop] +item=Camo helmet, id=6659, option=[null, null, null, null, drop] +item=Fishing explosive, id=6660, option=[null, null, null, null, drop] +item=Mogre, id=6661, option=[null, null, null, null, drop] +item=Broken fishing rod, id=6662, option=[null, null, null, null, drop] +item=Forlorn boot, id=6663, option=[null, null, null, null, drop] +item=Fishing explosive, id=6664, option=[null, null, null, null, drop] +item=Mudskipper hat, id=6665, option=[null, Wear, null, null, drop] +item=Flippers, id=6666, option=[null, Wear, null, null, drop] +item=Fishbowl, id=6667, option=[null, null, null, null, drop] +item=Fishbowl, id=6668, option=[null, null, Empty, null, drop] +item=Fishbowl, id=6669, option=[null, null, Empty, null, drop] +item=Fishbowl, id=6670, option=[Talk-At, Play-With, Feed, null, drop] +item=Fishbowl, id=6671, option=[Talk-At, Play-With, Feed, null, drop] +item=Fishbowl, id=6672, option=[Talk-At, Play-With, Feed, null, drop] +item=Fishbowl and net, id=6673, option=[null, Untangle, null, null, drop] +item=Tiny net, id=6674, option=[null, null, null, null, drop] +item=An empty box, id=6675, option=[null, null, null, null, drop] +item=Whoopsie, id=6676, option=[null, null, null, null, drop] +item=Guam in a box, id=6677, option=[null, null, null, null, drop] +item=Guam in a box?, id=6678, option=[null, null, null, null, drop] +item=Seaweed in a box, id=6679, option=[null, null, null, null, drop] +item=Seaweed in a box?, id=6680, option=[null, null, null, null, drop] +item=Ground guam, id=6681, option=[null, null, null, null, drop] +item=Ground guam, id=6682, option=[null, null, null, null, drop] +item=Ground seaweed, id=6683, option=[null, null, null, null, drop] +item=Ground seaweed, id=6684, option=[null, null, null, null, drop] +item=Saradomin brew(4), id=6685, option=[Drink, null, null, Empty, drop] +item=Saradomin brew(4), id=6686, option=[null, null, null, null, drop] +item=Saradomin brew(3), id=6687, option=[Drink, null, null, Empty, drop] +item=Saradomin brew(3), id=6688, option=[null, null, null, null, drop] +item=Saradomin brew(2), id=6689, option=[Drink, null, null, Empty, drop] +item=Saradomin brew(2), id=6690, option=[null, null, null, null, drop] +item=Saradomin brew(1), id=6691, option=[Drink, null, null, Empty, drop] +item=Saradomin brew(1), id=6692, option=[null, null, null, null, drop] +item=Crushed nest, id=6693, option=[null, null, null, null, drop] +item=Crushed nest, id=6694, option=[null, null, null, null, drop] +item=Desert lizard, id=6695, option=[null, null, null, null, drop] +item=Ice cooler, id=6696, option=[null, null, null, null, drop] +item=Pat of butter, id=6697, option=[null, null, null, null, drop] +item=Pat of butter, id=6698, option=[null, null, null, null, drop] +item=Burnt potato, id=6699, option=[null, null, null, null, drop] +item=Burnt potato, id=6700, option=[null, null, null, null, drop] +item=Baked potato, id=6701, option=[Eat, null, null, null, drop] +item=Baked potato, id=6702, option=[null, null, null, null, drop] +item=Potato with butter, id=6703, option=[Eat, null, null, null, drop] +item=Potato with butter, id=6704, option=[null, null, null, null, drop] +item=Potato with cheese, id=6705, option=[Eat, null, null, null, drop] +item=Potato with cheese, id=6706, option=[null, null, null, null, drop] +item=Camulet, id=6707, option=[null, Wear, Check-charge, Rub, drop] +item=Slayer gloves, id=6708, option=[null, null, null, null, drop] +item=Fever spider, id=6709, option=[null, null, null, null, drop] +item=Blindweed seed, id=6710, option=[null, null, null, null, drop] +item=Blindweed, id=6711, option=[null, null, null, null, drop] +item=Bucket of water, id=6712, option=[null, null, null, Empty, drop] +item=Wrench, id=6713, option=[null, null, null, null, drop] +item=Holy wrench, id=6714, option=[null, null, null, null, drop] +item=Sluglings, id=6715, option=[null, null, null, null, drop] +item=Karamthulhu, id=6716, option=[null, null, null, null, drop] +item=Karamthulhu, id=6717, option=[null, null, null, null, drop] +item=Fever spider body, id=6718, option=[null, null, null, null, drop] +item=Unsanitary swill, id=6719, option=[null, null, null, null, drop] +item=Slayer gloves, id=6720, option=[null, Wear, null, null, drop] +item=Rusty scimitar, id=6721, option=[null, null, null, null, drop] +item=Zombie head, id=6722, option=[Talk-At, Display, Question, null, drop] +item=Fishbowl, id=6723, option=[null, null, null, null, drop] +item=Seercull, id=6724, option=[null, Wield, null, null, drop] +item=Seercull, id=6725, option=[null, null, null, null, drop] +item=Mud battlestaff, id=6726, option=[null, null, null, null, drop] +item=Mystic mud staff, id=6727, option=[null, null, null, null, drop] +item=Bonemeal, id=6728, option=[null, Empty, null, null, drop] +item=Dagannoth bones, id=6729, option=[Bury, null, null, null, drop] +item=Dagannoth bones, id=6730, option=[null, null, null, null, drop] +item=Seers ring, id=6731, option=[null, Wear, null, null, drop] +item=Seers ring, id=6732, option=[null, null, null, null, drop] +item=Archers ring, id=6733, option=[null, Wear, null, null, drop] +item=Archers ring, id=6734, option=[null, null, null, null, drop] +item=Warrior ring, id=6735, option=[null, Wear, null, null, drop] +item=Warrior ring, id=6736, option=[null, null, null, null, drop] +item=Berserker ring, id=6737, option=[null, Wear, null, null, drop] +item=Berserker ring, id=6738, option=[null, null, null, null, drop] +item=Dragon axe, id=6739, option=[null, Wield, null, null, drop] +item=Dragon axe, id=6740, option=[null, null, null, null, drop] +item=Broken axe, id=6741, option=[null, null, null, null, drop] +item=Broken axe, id=6742, option=[null, null, null, null, drop] +item=Dragon axe head, id=6743, option=[null, null, null, null, drop] +item=Dragon axe head, id=6744, option=[null, null, null, null, drop] +item=Silverlight, id=6745, option=[null, Wield, null, null, drop] +item=Darklight, id=6746, option=[null, Wield, null, null, drop] +item=Demonic sigil mould, id=6747, option=[null, null, null, null, drop] +item=Demonic sigil, id=6748, option=[Chant, null, null, null, drop] +item=Demonic tome, id=6749, option=[Read, null, null, null, drop] +item=Black desert shirt, id=6750, option=[null, Wear, null, null, drop] +item=Whoopsie, id=6751, option=[null, null, null, null, drop] +item=Black desert robe, id=6752, option=[null, Wear, null, null, drop] +item=Whoopsie, id=6753, option=[null, null, null, null, drop] +item=Enchanted key, id=6754, option=[Feel, null, null, null, Destroy] +item=Journal, id=6755, option=[Read, null, null, null, Destroy] +item=Letter, id=6756, option=[null, null, null, null, Destroy] +item=Letter, id=6757, option=[null, null, null, null, Destroy] +item=Scroll, id=6758, option=[Read, null, null, null, Destroy] +item=Chest, id=6759, option=[null, null, null, null, Destroy] +item=Guthix mjolnir, id=6760, option=[null, Wield, null, null, drop] +item=Guthix mjolnir, id=6761, option=[null, null, null, null, drop] +item=Saradomin mjolnir, id=6762, option=[null, Wield, null, null, drop] +item=Saradomin mjolnir, id=6763, option=[null, null, null, null, drop] +item=Zamorak mjolnir, id=6764, option=[null, Wield, null, null, drop] +item=Zamorak mjolnir, id=6765, option=[null, null, null, null, drop] +item=Cat antipoison, id=6766, option=[null, null, null, Empty, drop] +item=Book, id=6767, option=[Read, null, null, null, drop] +item=Poisoned cheese, id=6768, option=[Eat, null, null, null, drop] +item=Music scroll, id=6769, option=[Read, null, null, null, Destroy] +item=Directions, id=6770, option=[Read, null, null, null, Destroy] +item=Pot of weeds, id=6771, option=[null, null, null, null, drop] +item=Smouldering pot, id=6772, option=[null, null, null, null, drop] +item=Rat pole, id=6773, option=[null, Wield, null, null, drop] +item=Rat pole, id=6774, option=[Remove-rat, Wield, null, null, drop] +item=Rat pole, id=6775, option=[Remove-rat, Wield, null, null, drop] +item=Rat pole, id=6776, option=[Remove-rat, Wield, null, null, drop] +item=Rat pole, id=6777, option=[Remove-rat, Wield, null, null, drop] +item=Rat pole, id=6778, option=[Remove-rat, Wield, null, null, drop] +item=Rat pole, id=6779, option=[Remove-rat, Wield, null, null, drop] +item=Menaphite thug, id=6780, option=[null, null, null, null, drop] +item=Bandit, id=6781, option=[null, null, null, null, drop] +item=Bandit, id=6782, option=[null, null, null, null, drop] +item=null, id=6783, option=[null, null, null, null, drop] +item=Whoopsie, id=6784, option=[Wear, null, null, null, drop] +item=Statuette, id=6785, option=[null, null, null, null, drop] +item=Robe of elidinis, id=6786, option=[null, Wear, null, null, drop] +item=Robe of elidinis, id=6787, option=[null, Wear, null, null, drop] +item=Torn robe, id=6788, option=[null, Wear, null, null, drop] +item=Torn robe, id=6789, option=[null, Wear, null, null, drop] +item=Shoes, id=6790, option=[null, Wear, null, null, drop] +item=Sole, id=6791, option=[null, null, null, null, drop] +item=Ancestral key, id=6792, option=[null, null, null, null, drop] +item=Ballad, id=6793, option=[Read, null, null, null, drop] +item=Choc-ice, id=6794, option=[Eat, null, null, null, drop] +item=Choc-ice, id=6795, option=[null, null, null, null, drop] +item=Lamp, id=6796, option=[null, null, null, null, drop] +item=Watering can, id=6797, option=[null, null, null, null, drop] +item=Champion scroll, id=6798, option=[Read, null, null, null, drop] +item=Champion scroll, id=6799, option=[Read, null, null, null, drop] +item=Champion scroll, id=6800, option=[Read, null, null, null, drop] +item=Champion scroll, id=6801, option=[Read, null, null, null, drop] +item=Champion scroll, id=6802, option=[Read, null, null, null, drop] +item=Champion scroll, id=6803, option=[Read, null, null, null, drop] +item=Champion scroll, id=6804, option=[Read, null, null, null, drop] +item=Champion scroll, id=6805, option=[Read, null, null, null, drop] +item=Champion scroll, id=6806, option=[Read, null, null, null, drop] +item=Champion scroll, id=6807, option=[Read, null, null, null, drop] +item=Champion scroll, id=6808, option=[Read, null, null, null, drop] +item=Granite legs, id=6809, option=[null, Wear, null, null, drop] +item=Bonemeal, id=6810, option=[null, Empty, null, null, drop] +item=Skeletal wyvern, id=6811, option=[null, null, null, null, drop] +item=Wyvern bones, id=6812, option=[Bury, null, null, null, drop] +item=Granite legs, id=6813, option=[null, null, null, null, drop] +item=Fur, id=6814, option=[null, null, null, null, drop] +item=Fur, id=6815, option=[null, null, null, null, drop] +item=Wyvern bones, id=6816, option=[null, null, null, null, drop] +item=Slender blade, id=6817, option=[null, null, null, null, Destroy] +item=Bow-sword, id=6818, option=[null, Wield, null, null, Destroy] +item=Large pouch, id=6819, option=[Fill, Empty, Check, null, Destroy] +item=Relic, id=6820, option=[null, null, null, null, Destroy] +item=Orb, id=6821, option=[null, null, null, null, Destroy] +item=Star bauble, id=6822, option=[null, null, null, null, drop] +item=Star bauble, id=6823, option=[null, null, null, null, drop] +item=Star bauble, id=6824, option=[null, null, null, null, drop] +item=Star bauble, id=6825, option=[null, null, null, null, drop] +item=Star bauble, id=6826, option=[null, null, null, null, drop] +item=Star bauble, id=6827, option=[null, null, null, null, drop] +item=Box bauble, id=6828, option=[null, null, null, null, drop] +item=Box bauble, id=6829, option=[null, null, null, null, drop] +item=Box bauble, id=6830, option=[null, null, null, null, drop] +item=Box bauble, id=6831, option=[null, null, null, null, drop] +item=Box bauble, id=6832, option=[null, null, null, null, drop] +item=Box bauble, id=6833, option=[null, null, null, null, drop] +item=Diamond bauble, id=6834, option=[null, null, null, null, drop] +item=Diamond bauble, id=6835, option=[null, null, null, null, drop] +item=Diamond bauble, id=6836, option=[null, null, null, null, drop] +item=Diamond bauble, id=6837, option=[null, null, null, null, drop] +item=Diamond bauble, id=6838, option=[null, null, null, null, drop] +item=Diamond bauble, id=6839, option=[null, null, null, null, drop] +item=Tree bauble, id=6840, option=[null, null, null, null, drop] +item=Tree bauble, id=6841, option=[null, null, null, null, drop] +item=Tree bauble, id=6842, option=[null, null, null, null, drop] +item=Tree bauble, id=6843, option=[null, null, null, null, drop] +item=Tree bauble, id=6844, option=[null, null, null, null, drop] +item=Tree bauble, id=6845, option=[null, null, null, null, drop] +item=Bell bauble, id=6846, option=[null, null, null, null, drop] +item=Bell bauble, id=6847, option=[null, null, null, null, drop] +item=Bell bauble, id=6848, option=[null, null, null, null, drop] +item=Bell bauble, id=6849, option=[null, null, null, null, drop] +item=Bell bauble, id=6850, option=[null, null, null, null, drop] +item=Bell bauble, id=6851, option=[null, null, null, null, drop] +item=Puppet box, id=6852, option=[Examine-closer, null, null, null, drop] +item=Bauble box, id=6853, option=[Examine-closer, null, null, null, drop] +item=Puppet box, id=6854, option=[null, null, null, null, Destroy] +item=Bauble box, id=6855, option=[null, null, null, null, Destroy] +item=Bobble hat, id=6856, option=[null, Wear, null, null, Destroy] +item=Bobble scarf, id=6857, option=[null, Wear, null, null, Destroy] +item=Jester hat, id=6858, option=[null, Wear, null, null, Destroy] +item=Jester scarf, id=6859, option=[null, Wear, null, null, Destroy] +item=Tri-jester hat, id=6860, option=[null, Wear, null, null, Destroy] +item=Tri-jester scarf, id=6861, option=[null, Wear, null, null, Destroy] +item=Woolly hat, id=6862, option=[null, Wear, null, null, Destroy] +item=Woolly scarf, id=6863, option=[null, Wear, null, null, Destroy] +item=Marionette handle, id=6864, option=[null, Wear, null, null, drop] +item=Blue marionette, id=6865, option=[Jump, Walk, Bow, Dance, Destroy] +item=Green marionette, id=6866, option=[Jump, Walk, Bow, Dance, Destroy] +item=Red marionette, id=6867, option=[Jump, Walk, Bow, Dance, Destroy] +item=Blue marionette, id=6868, option=[null, null, null, null, drop] +item=Green marionette, id=6869, option=[null, null, null, null, drop] +item=Red marionette, id=6870, option=[null, null, null, null, drop] +item=Red marionette, id=6871, option=[null, null, null, null, drop] +item=Red marionette, id=6872, option=[null, null, null, null, drop] +item=Red marionette, id=6873, option=[null, null, null, null, drop] +item=Red marionette, id=6874, option=[null, null, null, null, drop] +item=Blue marionette, id=6875, option=[null, null, null, null, drop] +item=Blue marionette, id=6876, option=[null, null, null, null, drop] +item=Blue marionette, id=6877, option=[null, null, null, null, drop] +item=Blue marionette, id=6878, option=[null, null, null, null, drop] +item=Green marionette, id=6879, option=[null, null, null, null, drop] +item=Green marionette, id=6880, option=[null, null, null, null, drop] +item=Green marionette, id=6881, option=[null, null, null, null, drop] +item=Green marionette, id=6882, option=[null, null, null, null, drop] +item=Peach, id=6883, option=[Eat, null, null, null, drop] +item=null, id=6884, option=[null, null, null, null, drop] +item=Progress hat, id=6885, option=[Talk-to, Wear, null, null, Destroy] +item=Progress hat, id=6886, option=[Talk-to, Wear, null, null, Destroy] +item=Progress hat, id=6887, option=[Talk-to, Wear, null, null, Destroy] +item=Guardian statue, id=6888, option=[null, null, null, null, drop] +item=Mage's book, id=6889, option=[null, Wield, null, null, drop] +item=Mage's book, id=6890, option=[null, null, null, null, drop] +item=Arena book, id=6891, option=[Read, null, null, null, drop] +item=Whoopsie, id=6892, option=[null, null, null, null, drop] +item=Leather boots, id=6893, option=[null, Wear, null, null, drop] +item=Adamant kiteshield, id=6894, option=[null, Wear, null, null, drop] +item=Adamant med helm, id=6895, option=[null, Wear, null, null, drop] +item=Emerald, id=6896, option=[null, null, null, null, drop] +item=Rune longsword, id=6897, option=[null, Wield, null, null, drop] +item=Cylinder, id=6898, option=[null, null, null, null, drop] +item=Cube, id=6899, option=[null, null, null, null, drop] +item=Icosahedron, id=6900, option=[null, null, null, null, drop] +item=Pentamid, id=6901, option=[null, null, null, null, drop] +item=Orb, id=6902, option=[null, null, null, null, drop] +item=Dragonstone, id=6903, option=[null, null, null, null, drop] +item=Animals' bones, id=6904, option=[null, null, null, null, drop] +item=Animals' bones, id=6905, option=[null, null, null, null, drop] +item=Animals' bones, id=6906, option=[null, null, null, null, drop] +item=Animals' bones, id=6907, option=[null, null, null, null, drop] +item=Beginner wand, id=6908, option=[null, Wield, null, null, drop] +item=Beginner wand, id=6909, option=[null, null, null, null, drop] +item=Apprentice wand, id=6910, option=[null, Wield, null, null, drop] +item=Apprentice wand, id=6911, option=[null, null, null, null, drop] +item=Teacher wand, id=6912, option=[null, Wield, null, null, drop] +item=Teacher wand, id=6913, option=[null, null, null, null, drop] +item=Master wand, id=6914, option=[null, Wield, null, null, drop] +item=Master wand, id=6915, option=[null, null, null, null, drop] +item=Infinity top, id=6916, option=[null, Wear, null, null, drop] +item=Infinity top, id=6917, option=[null, null, null, null, drop] +item=Infinity hat, id=6918, option=[null, Wear, null, null, drop] +item=Infinity hat, id=6919, option=[null, null, null, null, drop] +item=Infinity boots, id=6920, option=[null, Wear, null, null, drop] +item=Infinity boots, id=6921, option=[null, null, null, null, drop] +item=Infinity gloves, id=6922, option=[null, Wear, null, null, drop] +item=Infinity gloves, id=6923, option=[null, null, null, null, drop] +item=Infinity bottoms, id=6924, option=[null, Wear, null, null, drop] +item=Infinity bottoms, id=6925, option=[null, null, null, null, drop] +item=Bones to peaches, id=6926, option=[null, null, null, null, drop] +item=null, id=6927, option=[null, null, null, null, drop] +item=null, id=6928, option=[null, null, null, null, drop] +item=null, id=6929, option=[null, null, null, null, drop] +item=null, id=6930, option=[null, null, null, null, drop] +item=null, id=6931, option=[null, null, null, null, drop] +item=null, id=6932, option=[null, null, null, null, drop] +item=null, id=6933, option=[null, null, null, null, drop] +item=null, id=6934, option=[null, null, null, null, drop] +item=null, id=6935, option=[null, null, null, null, drop] +item=null, id=6936, option=[null, null, null, null, drop] +item=null, id=6937, option=[null, null, null, null, drop] +item=null, id=6938, option=[null, null, null, null, drop] +item=null, id=6939, option=[null, null, null, null, drop] +item=null, id=6940, option=[null, null, null, null, drop] +item=null, id=6941, option=[null, null, null, null, drop] +item=null, id=6942, option=[null, null, null, null, drop] +item=null, id=6943, option=[null, null, null, null, drop] +item=null, id=6944, option=[null, null, null, null, drop] +item=Sandy hand, id=6945, option=[null, null, null, null, Destroy] +item=Beer-soaked hand, id=6946, option=[null, null, null, null, Destroy] +item=Bert's rota, id=6947, option=[Read, null, null, null, Destroy] +item=Sandy's rota, id=6948, option=[Read, null, null, null, Destroy] +item=A magic scroll, id=6949, option=[null, null, null, null, Destroy] +item=Magical orb, id=6950, option=[Activate, null, null, null, Destroy] +item=Magical orb (a), id=6951, option=[null, null, null, null, Destroy] +item=Truth serum, id=6952, option=[null, null, null, null, Destroy] +item=Bottled water, id=6953, option=[null, null, null, null, Destroy] +item=Redberry juice, id=6954, option=[null, null, null, null, Destroy] +item=Pink dye, id=6955, option=[null, null, null, null, Destroy] +item=Rose-tinted lens, id=6956, option=[null, null, null, null, Destroy] +item=Wizard's head, id=6957, option=[null, null, null, null, Destroy] +item=Sand, id=6958, option=[null, null, null, null, Destroy] +item=Cape, id=6959, option=[null, Wear, null, null, drop] +item=Cape, id=6960, option=[null, null, null, null, drop] +item=Baguette, id=6961, option=[Eat, null, null, null, drop] +item=Triangle sandwich, id=6962, option=[Eat, null, null, null, drop] +item=Roll, id=6963, option=[Eat, null, null, null, drop] +item=Coins, id=6964, option=[null, null, null, null, drop] +item=Square sandwich, id=6965, option=[Eat, null, null, null, drop] +item=Prison key, id=6966, option=[Return, null, null, null, drop] +item=Dragon med helm, id=6967, option=[null, Wear, null, null, drop] +item=Triangle sandwich, id=6968, option=[null, null, null, null, drop] +item=Shark, id=6969, option=[Eat, null, null, null, drop] +item=Pyramid top, id=6970, option=[null, null, null, null, drop] +item=Sandstone (1kg), id=6971, option=[null, null, null, null, drop] +item=Sandstone (1kg), id=6972, option=[null, null, null, null, drop] +item=Sandstone (2kg), id=6973, option=[null, null, null, null, drop] +item=Sandstone (2kg), id=6974, option=[null, null, null, null, drop] +item=Sandstone (5kg), id=6975, option=[null, null, null, null, drop] +item=Sandstone (5kg), id=6976, option=[null, null, null, null, drop] +item=Sandstone (10kg), id=6977, option=[null, null, null, null, drop] +item=Sandstone (10kg), id=6978, option=[null, null, null, null, drop] +item=Granite (500g), id=6979, option=[null, null, null, null, drop] +item=Granite (500g), id=6980, option=[null, null, null, null, drop] +item=Granite (2kg), id=6981, option=[null, null, null, null, drop] +item=Granite (2kg), id=6982, option=[null, null, null, null, drop] +item=Granite (5kg), id=6983, option=[null, null, null, null, drop] +item=Granite (5kg), id=6984, option=[null, null, null, null, drop] +item=Sandstone (20kg), id=6985, option=[null, null, null, null, Destroy] +item=Sandstone (32kg), id=6986, option=[null, null, null, null, Destroy] +item=Sandstone body, id=6987, option=[null, null, null, null, Destroy] +item=Sandstone base, id=6988, option=[null, null, null, null, Destroy] +item=Stone head, id=6989, option=[null, null, null, null, Destroy] +item=Stone head, id=6990, option=[null, null, null, null, Destroy] +item=Stone head, id=6991, option=[null, null, null, null, Destroy] +item=Stone head, id=6992, option=[null, null, null, null, Destroy] +item=Z sigil, id=6993, option=[null, null, null, null, Destroy] +item=M sigil, id=6994, option=[null, null, null, null, Destroy] +item=R sigil, id=6995, option=[null, null, null, null, Destroy] +item=K sigil, id=6996, option=[null, null, null, null, Destroy] +item=Stone left arm, id=6997, option=[null, null, null, null, Destroy] +item=Stone right arm, id=6998, option=[null, null, null, null, Destroy] +item=Stone left leg, id=6999, option=[null, null, null, null, Destroy] +item=Stone right leg, id=7000, option=[null, null, null, null, Destroy] +item=Camel mould (p), id=7001, option=[null, null, null, null, Destroy] +item=Stone head, id=7002, option=[null, null, null, null, Destroy] +item=Camel mask, id=7003, option=[null, Wear, null, null, drop] +item=Chisel, id=7004, option=[null, null, null, null, drop] +item=null, id=7005, option=[null, null, null, null, drop] +item=null, id=7006, option=[null, null, null, null, drop] +item=null, id=7007, option=[null, null, null, null, drop] +item=null, id=7008, option=[null, null, null, null, drop] +item=null, id=7009, option=[null, null, null, null, drop] +item=null, id=7010, option=[null, null, null, null, drop] +item=null, id=7011, option=[null, null, null, null, drop] +item=null, id=7012, option=[null, null, null, null, drop] +item=null, id=7013, option=[null, null, null, null, drop] +item=null, id=7014, option=[null, null, null, null, drop] +item=null, id=7015, option=[null, null, null, null, drop] +item=null, id=7016, option=[null, null, null, null, drop] +item=null, id=7017, option=[null, null, null, null, drop] +item=null, id=7018, option=[null, null, null, null, drop] +item=null, id=7019, option=[null, null, null, null, drop] +item=null, id=7020, option=[null, null, null, null, drop] +item=null, id=7021, option=[null, null, null, null, drop] +item=null, id=7022, option=[null, null, null, null, drop] +item=null, id=7023, option=[null, null, null, null, drop] +item=null, id=7024, option=[null, null, null, null, drop] +item=null, id=7025, option=[null, null, null, null, drop] +item=null, id=7026, option=[null, null, null, null, drop] +item=null, id=7027, option=[null, null, null, null, drop] +item=null, id=7028, option=[null, null, null, null, drop] +item=null, id=7029, option=[null, null, null, null, drop] +item=null, id=7030, option=[null, null, null, null, drop] +item=null, id=7031, option=[null, null, null, null, drop] +item=null, id=7032, option=[null, null, null, null, drop] +item=null, id=7033, option=[null, null, null, null, drop] +item=null, id=7034, option=[null, null, null, null, drop] +item=null, id=7035, option=[null, null, null, null, drop] +item=null, id=7036, option=[null, null, null, null, drop] +item=null, id=7037, option=[null, null, null, null, drop] +item=null, id=7038, option=[null, null, null, null, drop] +item=null, id=7039, option=[null, null, null, null, drop] +item=null, id=7040, option=[null, null, null, null, drop] +item=null, id=7041, option=[null, null, null, null, drop] +item=null, id=7042, option=[null, null, null, null, drop] +item=null, id=7043, option=[null, null, null, null, drop] +item=null, id=7044, option=[null, null, null, null, drop] +item=null, id=7045, option=[null, null, null, null, drop] +item=null, id=7046, option=[null, null, null, null, drop] +item=null, id=7047, option=[null, null, null, null, drop] +item=null, id=7048, option=[null, null, null, null, drop] +item=null, id=7049, option=[null, null, null, null, drop] +item=Swarm, id=7050, option=[null, null, null, null, drop] +item=Unlit bug lantern, id=7051, option=[null, Wield, null, null, drop] +item=Unlit bug lantern, id=7052, option=[null, null, null, null, drop] +item=Lit bug lantern, id=7053, option=[null, Wield, Extinguish, null, drop] +item=Chilli potato, id=7054, option=[Eat, null, null, null, drop] +item=Chilli potato, id=7055, option=[null, null, null, null, drop] +item=Egg potato, id=7056, option=[Eat, null, null, null, drop] +item=Egg potato, id=7057, option=[null, null, null, null, drop] +item=Mushroom potato, id=7058, option=[Eat, null, null, null, drop] +item=Mushroom potato, id=7059, option=[null, null, null, null, drop] +item=Tuna potato, id=7060, option=[Eat, null, null, null, drop] +item=Tuna potato, id=7061, option=[null, null, null, null, drop] +item=Chilli con carne, id=7062, option=[Eat, null, null, null, drop] +item=Chilli con carne, id=7063, option=[null, null, null, null, drop] +item=Egg and tomato, id=7064, option=[Eat, null, null, null, drop] +item=Egg and tomato, id=7065, option=[null, null, null, null, drop] +item=Mushroom & onion, id=7066, option=[Eat, null, null, null, drop] +item=Mushroom & onion, id=7067, option=[null, null, null, null, drop] +item=Tuna and corn, id=7068, option=[Eat, null, null, null, drop] +item=Tuna and corn, id=7069, option=[null, null, null, null, drop] +item=Minced meat, id=7070, option=[Eat, null, null, null, drop] +item=Minced meat, id=7071, option=[null, null, null, null, drop] +item=Spicy sauce, id=7072, option=[Eat, null, null, null, drop] +item=Spicy sauce, id=7073, option=[null, null, null, null, drop] +item=Chopped garlic, id=7074, option=[null, null, null, null, drop] +item=Chopped garlic, id=7075, option=[null, null, null, null, drop] +item=Uncooked egg, id=7076, option=[null, null, null, null, drop] +item=Uncooked egg, id=7077, option=[null, null, null, null, drop] +item=Scrambled egg, id=7078, option=[Eat, null, null, null, drop] +item=Scrambled egg, id=7079, option=[null, null, null, null, drop] +item=Sliced mushrooms, id=7080, option=[null, null, null, null, drop] +item=Sliced mushrooms, id=7081, option=[null, null, null, null, drop] +item=Fried mushrooms, id=7082, option=[Eat, null, null, null, drop] +item=Fried mushrooms, id=7083, option=[null, null, null, null, drop] +item=Fried onions, id=7084, option=[Eat, null, null, null, drop] +item=Fried onions, id=7085, option=[null, null, null, null, drop] +item=Chopped tuna, id=7086, option=[Eat, null, null, null, drop] +item=Chopped tuna, id=7087, option=[null, null, null, null, drop] +item=Sweetcorn, id=7088, option=[Eat, null, null, null, drop] +item=Sweetcorn, id=7089, option=[null, null, null, null, drop] +item=Burnt egg, id=7090, option=[Empty, null, null, null, drop] +item=Burnt egg, id=7091, option=[null, null, null, null, drop] +item=Burnt onion, id=7092, option=[Empty, null, null, null, drop] +item=Burnt onion, id=7093, option=[null, null, null, null, drop] +item=Burnt mushroom, id=7094, option=[Empty, null, null, null, drop] +item=Burnt mushroom, id=7095, option=[null, null, null, null, drop] +item=Board game piece, id=7096, option=[null, null, null, null, drop] +item=Board game piece, id=7097, option=[null, null, null, null, drop] +item=Board game piece, id=7098, option=[null, null, null, null, drop] +item=Board game piece, id=7099, option=[null, null, null, null, drop] +item=Board game piece, id=7100, option=[null, null, null, null, drop] +item=Board game piece, id=7101, option=[null, null, null, null, drop] +item=Board game piece, id=7102, option=[null, null, null, null, drop] +item=Board game piece, id=7103, option=[null, null, null, null, drop] +item=Board game piece, id=7104, option=[null, null, null, null, drop] +item=Board game piece, id=7105, option=[null, null, null, null, drop] +item=Board game piece, id=7106, option=[null, null, null, null, drop] +item=Board game piece, id=7107, option=[null, null, null, null, drop] +item=Gunpowder, id=7108, option=[null, null, null, null, drop] +item=Fuse, id=7109, option=[null, null, null, null, drop] +item=Stripy pirate shirt, id=7110, option=[null, Wear, null, null, drop] +item=Stripy pirate shirt, id=7111, option=[null, null, null, null, drop] +item=Pirate bandana, id=7112, option=[null, Wear, null, null, drop] +item=Pirate bandana, id=7113, option=[null, null, null, null, drop] +item=Pirate boots, id=7114, option=[null, Wear, null, null, drop] +item=Pirate boots, id=7115, option=[null, null, null, null, drop] +item=Pirate leggings, id=7116, option=[null, Wear, null, null, drop] +item=Pirate leggings, id=7117, option=[null, null, null, null, drop] +item=Canister, id=7118, option=[null, null, null, null, drop] +item=Cannon ball, id=7119, option=[null, null, null, null, drop] +item=Ramrod, id=7120, option=[null, null, null, null, drop] +item=Repair plank, id=7121, option=[null, null, null, null, drop] +item=Stripy pirate shirt, id=7122, option=[null, Wear, null, null, drop] +item=Stripy pirate shirt, id=7123, option=[null, null, null, null, drop] +item=Pirate bandana, id=7124, option=[null, Wear, null, null, drop] +item=Pirate bandana, id=7125, option=[null, null, null, null, drop] +item=Pirate leggings, id=7126, option=[null, Wear, null, null, drop] +item=Pirate leggings, id=7127, option=[null, null, null, null, drop] +item=Stripy pirate shirt, id=7128, option=[null, Wear, null, null, drop] +item=Stripy pirate shirt, id=7129, option=[null, null, null, null, drop] +item=Pirate bandana, id=7130, option=[null, Wear, null, null, drop] +item=Pirate bandana, id=7131, option=[null, null, null, null, drop] +item=Pirate leggings, id=7132, option=[null, Wear, null, null, drop] +item=Pirate leggings, id=7133, option=[null, null, null, null, drop] +item=Stripy pirate shirt, id=7134, option=[null, Wear, null, null, drop] +item=Stripy pirate shirt, id=7135, option=[null, null, null, null, drop] +item=Pirate bandana, id=7136, option=[null, Wear, null, null, drop] +item=Pirate bandana, id=7137, option=[null, null, null, null, drop] +item=Pirate leggings, id=7138, option=[null, Wear, null, null, drop] +item=Pirate leggings, id=7139, option=[null, null, null, null, drop] +item=Lucky cutlass, id=7140, option=[null, Wield, null, null, drop] +item=Harry's cutlass, id=7141, option=[null, Wield, null, null, drop] +item=Rapier, id=7142, option=[null, Wield, null, null, drop] +item=Plunder, id=7143, option=[null, null, null, null, drop] +item=Book o' piracy, id=7144, option=[Read, null, null, null, drop] +item=Cannon barrel, id=7145, option=[null, null, null, null, drop] +item=Broken cannon, id=7146, option=[null, null, null, null, drop] +item=Cannon balls, id=7147, option=[null, null, null, null, drop] +item=Repair plank, id=7148, option=[null, null, null, null, drop] +item=Canister, id=7149, option=[null, null, null, null, drop] +item=Tacks, id=7150, option=[null, null, null, null, drop] +item=null, id=7151, option=[null, null, null, null, drop] +item=null, id=7152, option=[null, null, null, null, drop] +item=null, id=7153, option=[null, null, null, null, drop] +item=null, id=7154, option=[null, null, null, null, drop] +item=Rope, id=7155, option=[null, null, null, null, drop] +item=Tinderbox, id=7156, option=[null, null, null, null, drop] +item=Braindeath 'rum', id=7157, option=[Drink, null, null, null, drop] +item=Dragon 2h sword, id=7158, option=[null, Wield, null, null, drop] +item=Insulated boots, id=7159, option=[null, Wear, null, null, drop] +item=Killerwatt, id=7160, option=[null, null, null, null, drop] +item=Insulated boots, id=7161, option=[null, null, null, null, drop] +item=Pie recipe book, id=7162, option=[Read, null, null, null, drop] +item=Pie recipe book, id=7163, option=[null, null, null, null, drop] +item=Part mud pie, id=7164, option=[null, null, null, null, drop] +item=Part mud pie, id=7165, option=[null, null, null, null, drop] +item=Part mud pie, id=7166, option=[null, null, null, null, drop] +item=Part mud pie, id=7167, option=[null, null, null, null, drop] +item=Raw mud pie, id=7168, option=[null, null, null, null, drop] +item=Raw mud pie, id=7169, option=[null, null, null, null, drop] +item=Mud pie, id=7170, option=[null, Wield, null, null, drop] +item=Mud pie, id=7171, option=[null, null, null, null, drop] +item=Part garden pie, id=7172, option=[null, null, null, null, drop] +item=Part garden pie, id=7173, option=[null, null, null, null, drop] +item=Part garden pie, id=7174, option=[null, null, null, null, drop] +item=Part garden pie, id=7175, option=[null, null, null, null, drop] +item=Raw garden pie, id=7176, option=[null, null, null, null, drop] +item=Raw garden pie, id=7177, option=[null, null, null, null, drop] +item=Garden pie, id=7178, option=[Eat, null, null, null, drop] +item=Garden pie, id=7179, option=[null, null, null, null, drop] +item=Half a garden pie, id=7180, option=[Eat, null, null, null, drop] +item=Half a garden pie, id=7181, option=[null, null, null, null, drop] +item=Part fish pie, id=7182, option=[null, null, null, null, drop] +item=Part fish pie, id=7183, option=[null, null, null, null, drop] +item=Part fish pie, id=7184, option=[null, null, null, null, drop] +item=Part fish pie, id=7185, option=[null, null, null, null, drop] +item=Raw fish pie, id=7186, option=[null, null, null, null, drop] +item=Raw fish pie, id=7187, option=[null, null, null, null, drop] +item=Fish pie, id=7188, option=[Eat, null, null, null, drop] +item=Fish pie, id=7189, option=[null, null, null, null, drop] +item=Half a fish pie, id=7190, option=[Eat, null, null, null, drop] +item=Half a fish pie, id=7191, option=[null, null, null, null, drop] +item=Part admiral pie, id=7192, option=[null, null, null, null, drop] +item=Part admiral pie, id=7193, option=[null, null, null, null, drop] +item=Part admiral pie, id=7194, option=[null, null, null, null, drop] +item=Part admiral pie, id=7195, option=[null, null, null, null, drop] +item=Raw admiral pie, id=7196, option=[null, null, null, null, drop] +item=Raw admiral pie, id=7197, option=[null, null, null, null, drop] +item=Admiral pie, id=7198, option=[Eat, null, null, null, drop] +item=Admiral pie, id=7199, option=[null, null, null, null, drop] +item=Half an admiral pie, id=7200, option=[Eat, null, null, null, drop] +item=Half an admiral pie, id=7201, option=[null, null, null, null, drop] +item=Part wild pie, id=7202, option=[null, null, null, null, drop] +item=Part wild pie, id=7203, option=[null, null, null, null, drop] +item=Part wild pie, id=7204, option=[null, null, null, null, drop] +item=Part wild pie, id=7205, option=[null, null, null, null, drop] +item=Raw wild pie, id=7206, option=[null, null, null, null, drop] +item=Raw wild pie, id=7207, option=[null, null, null, null, drop] +item=Wild pie, id=7208, option=[Eat, null, null, null, drop] +item=Wild pie, id=7209, option=[null, null, null, null, drop] +item=Half a wild pie, id=7210, option=[Eat, null, null, null, drop] +item=Half a wild pie, id=7211, option=[null, null, null, null, drop] +item=Part summer pie, id=7212, option=[null, null, null, null, drop] +item=Part summer pie, id=7213, option=[null, null, null, null, drop] +item=Part summer pie, id=7214, option=[null, null, null, null, drop] +item=Part summer pie, id=7215, option=[null, null, null, null, drop] +item=Raw summer pie, id=7216, option=[null, null, null, null, drop] +item=Raw summer pie, id=7217, option=[null, null, null, null, drop] +item=Summer pie, id=7218, option=[Eat, null, null, null, drop] +item=Summer pie, id=7219, option=[null, null, null, null, drop] +item=Half a summer pie, id=7220, option=[Eat, null, null, null, drop] +item=Half a summer pie, id=7221, option=[null, null, null, null, drop] +item=Burnt rabbit, id=7222, option=[null, null, null, null, drop] +item=Roast rabbit, id=7223, option=[Eat, null, null, null, drop] +item=Skewered rabbit, id=7224, option=[null, null, null, null, drop] +item=Iron spit, id=7225, option=[null, null, null, null, drop] +item=Burnt chompy, id=7226, option=[null, null, null, null, drop] +item=Burnt chompy, id=7227, option=[null, null, null, null, drop] +item=Cooked chompy, id=7228, option=[Eat, null, null, null, drop] +item=Cooked chompy, id=7229, option=[null, null, null, null, drop] +item=Skewered chompy, id=7230, option=[null, null, null, null, drop] +item=Burnt rabbit, id=7231, option=[null, null, null, null, drop] +item=Roast rabbit, id=7232, option=[null, null, null, null, drop] +item=Skewered rabbit, id=7233, option=[null, null, null, null, drop] +item=Iron spit, id=7234, option=[null, null, null, null, drop] +item=Skewered chompy, id=7235, option=[null, null, null, null, drop] +item=Clue scroll, id=7236, option=[Read, null, null, null, drop] +item=Casket, id=7237, option=[Open, null, null, null, drop] +item=Clue scroll, id=7238, option=[Read, null, null, null, drop] +item=Clue scroll, id=7239, option=[Read, null, null, null, drop] +item=Casket, id=7240, option=[Open, null, null, null, drop] +item=Clue scroll, id=7241, option=[Read, null, null, null, drop] +item=Casket, id=7242, option=[Open, null, null, null, drop] +item=Clue scroll, id=7243, option=[Read, null, null, null, drop] +item=Casket, id=7244, option=[Open, null, null, null, drop] +item=Clue scroll, id=7245, option=[Read, null, null, null, drop] +item=Casket, id=7246, option=[Open, null, null, null, drop] +item=Clue scroll, id=7247, option=[Read, null, null, null, drop] +item=Clue scroll, id=7248, option=[Read, null, null, null, drop] +item=Clue scroll, id=7249, option=[Read, null, null, null, drop] +item=Clue scroll, id=7250, option=[Read, null, null, null, drop] +item=Clue scroll, id=7251, option=[Read, null, null, null, drop] +item=Clue scroll, id=7252, option=[Read, null, null, null, drop] +item=Clue scroll, id=7253, option=[Read, null, null, null, drop] +item=Clue scroll, id=7254, option=[Read, null, null, null, drop] +item=Clue scroll, id=7255, option=[Read, null, null, null, drop] +item=Clue scroll, id=7256, option=[Read, null, null, null, drop] +item=Casket, id=7257, option=[Open, null, null, null, drop] +item=Clue scroll, id=7258, option=[Read, null, null, null, drop] +item=Casket, id=7259, option=[Open, null, null, null, drop] +item=Clue scroll, id=7260, option=[Read, null, null, null, drop] +item=Casket, id=7261, option=[Open, null, null, null, drop] +item=Clue scroll, id=7262, option=[Read, null, null, null, drop] +item=Casket, id=7263, option=[Open, null, null, null, drop] +item=Clue scroll, id=7264, option=[Read, null, null, null, drop] +item=Casket, id=7265, option=[Open, null, null, null, drop] +item=Clue scroll, id=7266, option=[Read, null, null, null, drop] +item=Casket, id=7267, option=[Open, null, null, null, drop] +item=Clue scroll, id=7268, option=[Read, null, null, null, drop] +item=Challenge scroll, id=7269, option=[Read, null, null, null, drop] +item=Clue scroll, id=7270, option=[Read, null, null, null, drop] +item=Challenge scroll, id=7271, option=[Read, null, null, null, drop] +item=Clue scroll, id=7272, option=[Read, null, null, null, drop] +item=Challenge scroll, id=7273, option=[Read, null, null, null, drop] +item=Clue scroll, id=7274, option=[Read, null, null, null, drop] +item=Challenge scroll, id=7275, option=[Read, null, null, null, drop] +item=Clue scroll, id=7276, option=[Read, null, null, null, drop] +item=Challenge scroll, id=7277, option=[Read, null, null, null, drop] +item=Clue scroll, id=7278, option=[Read, null, null, null, drop] +item=Challenge scroll, id=7279, option=[Read, null, null, null, drop] +item=Clue scroll, id=7280, option=[Read, null, null, null, drop] +item=Challenge scroll, id=7281, option=[Read, null, null, null, drop] +item=Clue scroll, id=7282, option=[Read, null, null, null, drop] +item=Challenge scroll, id=7283, option=[Read, null, null, null, drop] +item=Clue scroll, id=7284, option=[Read, null, null, null, drop] +item=Challenge scroll, id=7285, option=[Read, null, null, null, drop] +item=Clue scroll, id=7286, option=[Read, null, null, null, drop] +item=Casket, id=7287, option=[Open, null, null, null, drop] +item=Clue scroll, id=7288, option=[Read, null, null, null, drop] +item=Casket, id=7289, option=[Open, null, null, null, drop] +item=Clue scroll, id=7290, option=[Read, null, null, null, drop] +item=Casket, id=7291, option=[Open, null, null, null, drop] +item=Clue scroll, id=7292, option=[Read, null, null, null, drop] +item=Casket, id=7293, option=[Open, null, null, null, drop] +item=Clue scroll, id=7294, option=[Read, null, null, null, drop] +item=Casket, id=7295, option=[Open, null, null, null, drop] +item=Clue scroll, id=7296, option=[Read, null, null, null, drop] +item=Key, id=7297, option=[null, null, null, null, drop] +item=Clue scroll, id=7298, option=[Read, null, null, null, drop] +item=Key, id=7299, option=[null, null, null, null, drop] +item=Clue scroll, id=7300, option=[Read, null, null, null, drop] +item=Clue scroll, id=7301, option=[Read, null, null, null, drop] +item=Key, id=7302, option=[null, null, null, null, drop] +item=Clue scroll, id=7303, option=[Read, null, null, null, drop] +item=Clue scroll, id=7304, option=[Read, null, null, null, drop] +item=Clue scroll, id=7305, option=[Read, null, null, null, drop] +item=Casket, id=7306, option=[Open, null, null, null, drop] +item=Clue scroll, id=7307, option=[Read, null, null, null, drop] +item=Casket, id=7308, option=[Open, null, null, null, drop] +item=Clue scroll, id=7309, option=[Read, null, null, null, drop] +item=Casket, id=7310, option=[Open, null, null, null, drop] +item=Clue scroll, id=7311, option=[Read, null, null, null, drop] +item=Casket, id=7312, option=[Open, null, null, null, drop] +item=Clue scroll, id=7313, option=[Read, null, null, null, drop] +item=Casket, id=7314, option=[Open, null, null, null, drop] +item=Clue scroll, id=7315, option=[Read, null, null, null, drop] +item=Casket, id=7316, option=[Open, null, null, null, drop] +item=Clue scroll, id=7317, option=[Read, null, null, null, drop] +item=Casket, id=7318, option=[Open, null, null, null, drop] +item=Red boater, id=7319, option=[null, Wear, null, null, drop] +item=Red boater, id=7320, option=[null, null, null, null, drop] +item=Orange boater, id=7321, option=[null, Wear, null, null, drop] +item=Orange boater, id=7322, option=[null, null, null, null, drop] +item=Green boater, id=7323, option=[null, Wear, null, null, drop] +item=Green boater, id=7324, option=[null, null, null, null, drop] +item=Blue boater, id=7325, option=[null, Wear, null, null, drop] +item=Blue boater, id=7326, option=[null, null, null, null, drop] +item=Black boater, id=7327, option=[null, Wear, null, null, drop] +item=Black boater, id=7328, option=[null, null, null, null, drop] +item=Red firelighter, id=7329, option=[null, null, null, null, drop] +item=Green firelighter, id=7330, option=[null, null, null, null, drop] +item=Blue firelighter, id=7331, option=[null, null, null, null, drop] +item=Black shield(h1), id=7332, option=[null, Wear, null, null, drop] +item=Black shield(h1), id=7333, option=[null, null, null, null, drop] +item=Adamant shield(h1), id=7334, option=[null, Wear, null, null, drop] +item=Adamant shield(h1), id=7335, option=[null, null, null, null, drop] +item=Rune shield(h1), id=7336, option=[null, Wear, null, null, drop] +item=Rune shield(h1), id=7337, option=[null, null, null, null, drop] +item=Black shield(h2), id=7338, option=[null, Wear, null, null, drop] +item=Black shield(h2), id=7339, option=[null, null, null, null, drop] +item=Adamant shield(h2), id=7340, option=[null, Wear, null, null, drop] +item=Adamant shield(h2), id=7341, option=[null, null, null, null, drop] +item=Rune shield(h2), id=7342, option=[null, Wear, null, null, drop] +item=Rune shield(h2), id=7343, option=[null, null, null, null, drop] +item=Black shield(h3), id=7344, option=[null, Wear, null, null, drop] +item=Black shield(h3), id=7345, option=[null, null, null, null, drop] +item=Adamant shield(h3), id=7346, option=[null, Wear, null, null, drop] +item=Adamant shield(h3), id=7347, option=[null, null, null, null, drop] +item=Rune shield(h3), id=7348, option=[null, Wear, null, null, drop] +item=Rune shield(h3), id=7349, option=[null, null, null, null, drop] +item=Black shield(h4), id=7350, option=[null, Wear, null, null, drop] +item=Black shield(h4), id=7351, option=[null, null, null, null, drop] +item=Adamant shield(h4), id=7352, option=[null, Wear, null, null, drop] +item=Adamant shield(h4), id=7353, option=[null, null, null, null, drop] +item=Rune shield(h4), id=7354, option=[null, Wear, null, null, drop] +item=Rune shield(h4), id=7355, option=[null, null, null, null, drop] +item=Black shield(h5), id=7356, option=[null, Wear, null, null, drop] +item=Black shield(h5), id=7357, option=[null, null, null, null, drop] +item=Adamant shield(h5), id=7358, option=[null, Wear, null, null, drop] +item=Adamant shield(h5), id=7359, option=[null, null, null, null, drop] +item=Rune shield(h5), id=7360, option=[null, Wear, null, null, drop] +item=Rune shield(h5), id=7361, option=[null, null, null, null, drop] +item=Studded body (g), id=7362, option=[null, Wear, null, null, drop] +item=Studded body (g), id=7363, option=[null, null, null, null, drop] +item=Studded body (t), id=7364, option=[null, Wear, null, null, drop] +item=Studded body (t), id=7365, option=[null, null, null, null, drop] +item=Studded chaps (g), id=7366, option=[null, Wear, null, null, drop] +item=Studded chaps (g), id=7367, option=[null, null, null, null, drop] +item=Studded chaps (t), id=7368, option=[null, Wear, null, null, drop] +item=Studded chaps (t), id=7369, option=[null, null, null, null, drop] +item=D'hide body(g), id=7370, option=[null, Wear, null, null, drop] +item=D'hide body(g), id=7371, option=[null, null, null, null, drop] +item=D'hide body (t), id=7372, option=[null, Wear, null, null, drop] +item=D'hide body (t), id=7373, option=[null, null, null, null, drop] +item=D'hide body (g), id=7374, option=[null, Wear, null, null, drop] +item=D'hide body (g), id=7375, option=[null, null, null, null, drop] +item=D'hide body (t), id=7376, option=[null, Wear, null, null, drop] +item=D'hide body (t), id=7377, option=[null, null, null, null, drop] +item=D'hide chaps (g), id=7378, option=[null, Wear, null, null, drop] +item=D'hide chaps (g), id=7379, option=[null, null, null, null, drop] +item=D'hide chaps (t), id=7380, option=[null, Wear, null, null, drop] +item=D'hide chaps (t), id=7381, option=[null, null, null, null, drop] +item=D'hide chaps (g), id=7382, option=[null, Wear, null, null, drop] +item=D'hide chaps (g), id=7383, option=[null, null, null, null, drop] +item=D'hide chaps (t), id=7384, option=[null, Wear, null, null, drop] +item=D'hide chaps (t), id=7385, option=[null, null, null, null, drop] +item=Blue skirt (g), id=7386, option=[null, Wear, null, null, drop] +item=Blue skirt (g), id=7387, option=[null, null, null, null, drop] +item=Blue skirt (t), id=7388, option=[null, Wear, null, null, drop] +item=Blue skirt (t), id=7389, option=[null, null, null, null, drop] +item=Wizard robe (g), id=7390, option=[null, Wear, null, null, drop] +item=Wizard robe (g), id=7391, option=[null, null, null, null, drop] +item=Wizard robe (t), id=7392, option=[null, Wear, null, null, drop] +item=Wizard robe (t), id=7393, option=[null, null, null, null, drop] +item=Wizard hat (g), id=7394, option=[null, Wear, null, null, drop] +item=Wizard hat (g), id=7395, option=[null, null, null, null, drop] +item=Wizard hat (t), id=7396, option=[null, Wear, null, null, drop] +item=Wizard hat (t), id=7397, option=[null, null, null, null, drop] +item=Enchanted robe, id=7398, option=[null, Wear, null, null, drop] +item=Enchanted top, id=7399, option=[null, Wear, null, null, drop] +item=Enchanted hat, id=7400, option=[null, Wear, null, null, drop] +item=Enchanted robe, id=7401, option=[null, null, null, null, drop] +item=Enchanted top, id=7402, option=[null, null, null, null, drop] +item=Enchanted hat, id=7403, option=[null, null, null, null, drop] +item=Red logs, id=7404, option=[null, null, null, null, drop] +item=Green logs, id=7405, option=[null, null, null, null, drop] +item=Blue logs, id=7406, option=[null, null, null, null, drop] +item=Dragon 2h sword, id=7407, option=[null, null, null, null, drop] +item=Draynor skull, id=7408, option=[null, null, null, null, Destroy] +item=Magic secateurs, id=7409, option=[null, Wield, null, null, Destroy] +item=Queen's secateurs, id=7410, option=[null, null, null, null, Destroy] +item=Symptoms list, id=7411, option=[Read, null, null, null, Destroy] +item=null, id=7412, option=[null, null, null, null, drop] +item=Bird's nest, id=7413, option=[Search, null, null, null, drop] +item=Paddle, id=7414, option=[null, Wield, null, null, drop] +item=Paddle, id=7415, option=[null, null, null, null, drop] +item=Mole claw, id=7416, option=[null, null, null, null, drop] +item=Mole claw, id=7417, option=[null, null, null, null, drop] +item=Mole skin, id=7418, option=[null, null, null, null, drop] +item=Mole skin, id=7419, option=[null, null, null, null, drop] +item=Mutated zygomite, id=7420, option=[null, null, null, null, drop] +item=Fungicide spray 10, id=7421, option=[null, null, null, null, drop] +item=Fungicide spray 9, id=7422, option=[null, null, null, null, drop] +item=Fungicide spray 8, id=7423, option=[null, null, null, null, drop] +item=Fungicide spray 7, id=7424, option=[null, null, null, null, drop] +item=Fungicide spray 6, id=7425, option=[null, null, null, null, drop] +item=Fungicide spray 5, id=7426, option=[null, null, null, null, drop] +item=Fungicide spray 4, id=7427, option=[null, null, null, null, drop] +item=Fungicide spray 3, id=7428, option=[null, null, null, null, drop] +item=Fungicide spray 2, id=7429, option=[null, null, null, null, drop] +item=Fungicide spray 1, id=7430, option=[null, null, null, null, drop] +item=Fungicide spray 0, id=7431, option=[null, null, null, null, drop] +item=Fungicide, id=7432, option=[null, null, null, null, drop] +item=Wooden spoon, id=7433, option=[null, Wield, null, null, drop] +item=Wooden spoon, id=7434, option=[null, null, null, null, drop] +item=Egg whisk, id=7435, option=[null, Wield, null, null, drop] +item=Egg whisk, id=7436, option=[null, null, null, null, drop] +item=Spork, id=7437, option=[null, Wield, null, null, drop] +item=Spork, id=7438, option=[null, null, null, null, drop] +item=Spatula, id=7439, option=[null, Wield, null, null, drop] +item=Spatula, id=7440, option=[null, null, null, null, drop] +item=Frying pan, id=7441, option=[null, Wield, null, null, drop] +item=Frying pan, id=7442, option=[null, null, null, null, drop] +item=Skewer, id=7443, option=[null, Wield, null, null, drop] +item=Skewer, id=7444, option=[null, null, null, null, drop] +item=Rolling pin, id=7445, option=[null, Wield, null, null, drop] +item=Rolling pin, id=7446, option=[null, null, null, null, drop] +item=Kitchen knife, id=7447, option=[null, Wield, null, null, drop] +item=Kitchen knife, id=7448, option=[null, null, null, null, drop] +item=Meat tenderiser, id=7449, option=[null, Wield, null, null, drop] +item=Meat tenderiser, id=7450, option=[null, null, null, null, drop] +item=Cleaver, id=7451, option=[null, Wield, null, null, drop] +item=Cleaver, id=7452, option=[null, null, null, null, drop] +item=Gloves, id=7453, option=[null, Wear, null, null, drop] +item=Gloves, id=7454, option=[null, Wear, null, null, drop] +item=Gloves, id=7455, option=[null, Wear, null, null, drop] +item=Gloves, id=7456, option=[null, Wear, null, null, drop] +item=Gloves, id=7457, option=[null, Wear, null, null, drop] +item=Gloves, id=7458, option=[null, Wear, null, null, drop] +item=Gloves, id=7459, option=[null, Wear, null, null, drop] +item=Gloves, id=7460, option=[null, Wear, null, null, drop] +item=Gloves, id=7461, option=[null, Wear, null, null, drop] +item=Gloves, id=7462, option=[null, Wear, null, null, drop] +item=Cornflour, id=7463, option=[null, null, null, null, drop] +item=Book on chickens, id=7464, option=[Read, null, null, null, drop] +item=Vanilla pod, id=7465, option=[null, null, null, null, drop] +item=Cornflour, id=7466, option=[null, null, null, null, drop] +item=Whoopsie, id=7467, option=[null, null, null, null, drop] +item=Pot of cornflour, id=7468, option=[null, null, null, Empty, drop] +item=Whoopsie, id=7469, option=[null, null, null, null, drop] +item=Cornflour mixture, id=7470, option=[null, null, null, Empty, Destroy] +item=Milky mixture, id=7471, option=[null, null, null, Empty, Destroy] +item=Cinnamon, id=7472, option=[null, null, null, null, drop] +item=Brulee, id=7473, option=[null, null, null, Empty, Destroy] +item=Brulee, id=7474, option=[null, null, null, Empty, Destroy] +item=Brulee, id=7475, option=[null, null, null, Empty, Destroy] +item=Brulee supreme, id=7476, option=[null, null, null, Empty, Destroy] +item=Evil chicken's egg, id=7477, option=[null, null, null, null, Destroy] +item=Dragon token, id=7478, option=[Rub, null, null, null, Destroy] +item=Spicy stew, id=7479, option=[Eat, Smell, null, null, Destroy] +item=Red spice (4), id=7480, option=[null, null, null, null, drop] +item=Red spice (3), id=7481, option=[null, null, null, null, drop] +item=Red spice (2), id=7482, option=[null, null, null, null, drop] +item=Red spice (1), id=7483, option=[null, null, null, null, drop] +item=Orange spice (4), id=7484, option=[null, null, null, null, drop] +item=Orange spice (3), id=7485, option=[null, null, null, null, drop] +item=Orange spice (2), id=7486, option=[null, null, null, null, drop] +item=Orange spice (1), id=7487, option=[null, null, null, null, drop] +item=Brown spice (4), id=7488, option=[null, null, null, null, drop] +item=Brown spice (3), id=7489, option=[null, null, null, null, drop] +item=Brown spice (2), id=7490, option=[null, null, null, null, drop] +item=Brown spice (1), id=7491, option=[null, null, null, null, drop] +item=Yellow spice (4), id=7492, option=[null, null, null, null, drop] +item=Yellow spice (3), id=7493, option=[null, null, null, null, drop] +item=Yellow spice (2), id=7494, option=[null, null, null, null, drop] +item=Yellow spice (1), id=7495, option=[null, null, null, null, drop] +item=Empty spice shaker, id=7496, option=[null, null, null, null, drop] +item=Dirty blast, id=7497, option=[Drink, null, null, null, drop] +item=Antique lamp, id=7498, option=[Rub, null, null, null, Destroy] +item=Evil dave, id=7499, option=[null, null, null, null, drop] +item=Dwarf, id=7500, option=[null, null, null, null, drop] +item=Goblins, id=7501, option=[null, null, null, null, drop] +item=Lumbridge guide, id=7502, option=[null, null, null, null, drop] +item=Monkey, id=7503, option=[null, null, null, null, drop] +item=Osman, id=7504, option=[null, null, null, null, drop] +item=Pirate pete, id=7505, option=[null, null, null, null, drop] +item=Sir amik varze, id=7506, option=[null, null, null, null, drop] +item=Skrach, id=7507, option=[null, null, null, null, drop] +item=Asgoldian ale, id=7508, option=[Drink, null, null, null, drop] +item=Dwarven rock cake, id=7509, option=[Eat, null, null, null, drop] +item=Dwarven rock cake, id=7510, option=[Eat, null, null, null, drop] +item=Slop of compromise, id=7511, option=[null, null, null, null, drop] +item=Soggy bread, id=7512, option=[null, null, null, null, drop] +item=Spicy maggots, id=7513, option=[null, null, null, null, drop] +item=Dyed orange, id=7514, option=[null, null, null, null, drop] +item=Breadcrumbs, id=7515, option=[null, null, null, null, drop] +item=Kelp, id=7516, option=[null, null, null, null, drop] +item=Ground kelp, id=7517, option=[null, null, null, null, drop] +item=Crab meat, id=7518, option=[null, null, null, null, drop] +item=Crab meat, id=7519, option=[null, null, null, null, drop] +item=Burnt crab meat, id=7520, option=[null, null, null, null, drop] +item=Cooked crab meat, id=7521, option=[Eat, null, null, null, drop] +item=Cooked crab meat, id=7522, option=[null, null, null, null, drop] +item=Cooked crab meat, id=7523, option=[Eat, null, null, null, drop] +item=Cooked crab meat, id=7524, option=[Eat, null, null, null, drop] +item=Cooked crab meat, id=7525, option=[Eat, null, null, null, drop] +item=Cooked crab meat, id=7526, option=[Eat, null, null, null, drop] +item=Ground crab meat, id=7527, option=[null, null, null, null, drop] +item=Ground cod, id=7528, option=[null, null, null, null, drop] +item=Raw fishcake, id=7529, option=[null, null, null, null, drop] +item=Cooked fishcake, id=7530, option=[Eat, null, null, null, drop] +item=Burnt fishcake, id=7531, option=[null, null, null, null, drop] +item=Mudskipper hide, id=7532, option=[null, null, null, null, drop] +item=Rock, id=7533, option=[null, null, null, null, drop] +item=Fishbowl helmet, id=7534, option=[null, Wear, null, null, drop] +item=Diving apparatus, id=7535, option=[null, Wear, null, null, drop] +item=Fresh crab claw, id=7536, option=[null, null, null, null, drop] +item=Crab claw, id=7537, option=[null, Wear, null, null, drop] +item=Fresh crab shell, id=7538, option=[null, null, null, null, drop] +item=Crab helmet, id=7539, option=[null, Wear, null, null, drop] +item=Broken crab claw, id=7540, option=[null, null, null, null, drop] +item=Broken crab shell, id=7541, option=[null, null, null, null, drop] +item=Cake of guidance, id=7542, option=[null, null, null, null, Destroy] +item=Raw guide cake, id=7543, option=[null, null, null, null, Destroy] +item=Enchanted egg, id=7544, option=[null, null, null, null, Destroy] +item=Enchanted milk, id=7545, option=[null, null, null, null, Destroy] +item=Enchanted flour, id=7546, option=[null, null, null, null, Destroy] +item=Druid pouch, id=7547, option=[null, null, null, null, drop] +item=Potato seed, id=7548, option=[null, null, null, null, drop] +item=Potato seed, id=7549, option=[null, null, null, null, drop] +item=Onion seed, id=7550, option=[null, null, null, null, drop] +item=Onion seed, id=7551, option=[null, null, null, null, drop] +item=Mithril arrow, id=7552, option=[null, null, null, null, drop] +item=Mithril arrow, id=7553, option=[null, null, null, null, drop] +item=Fire rune, id=7554, option=[null, null, null, null, drop] +item=Fire rune, id=7555, option=[null, null, null, null, drop] +item=Water rune, id=7556, option=[null, null, null, null, drop] +item=Water rune, id=7557, option=[null, null, null, null, drop] +item=Air rune, id=7558, option=[null, null, null, null, drop] +item=Air rune, id=7559, option=[null, null, null, null, drop] +item=Chaos rune, id=7560, option=[null, null, null, null, drop] +item=Chaos rune, id=7561, option=[null, null, null, null, drop] +item=Tomato seed, id=7562, option=[null, null, null, null, drop] +item=Tomato seed, id=7563, option=[null, null, null, null, drop] +item=Balloon toad, id=7564, option=[Drop, null, null, Release-all, Release] +item=Balloon toad, id=7565, option=[Drop, null, null, Release-all, Release] +item=Raw jubbly, id=7566, option=[null, null, null, null, drop] +item=Raw jubbly, id=7567, option=[null, null, null, null, drop] +item=Cooked jubbly, id=7568, option=[Eat, null, null, null, drop] +item=Cooked jubbly, id=7569, option=[null, null, null, null, drop] +item=Burnt jubbly, id=7570, option=[null, null, null, null, drop] +item=Burnt jubbly, id=7571, option=[null, null, null, null, drop] +item=Red banana, id=7572, option=[Eat, null, null, null, drop] +item=Tchiki monkey nuts, id=7573, option=[Eat, null, null, null, drop] +item=Sliced red banana, id=7574, option=[Eat, null, null, null, drop] +item=Tchiki nut paste, id=7575, option=[Eat, null, null, null, drop] +item=Snake corpse, id=7576, option=[null, null, null, null, drop] +item=Raw stuffed snake, id=7577, option=[null, null, null, null, drop] +item=Odd stuffed snake, id=7578, option=[null, null, null, null, drop] +item=Stuffed snake, id=7579, option=[Eat, null, null, null, drop] +item=Snake over-cooked, id=7580, option=[null, null, null, null, drop] +item=Overgrown hellcat, id=7581, option=[null, null, null, null, drop] +item=Hell cat, id=7582, option=[null, null, null, null, drop] +item=Hell-kitten, id=7583, option=[null, null, null, null, drop] +item=Lazy hell cat, id=7584, option=[null, null, null, null, drop] +item=Wily hellcat, id=7585, option=[null, null, null, null, drop] +item=Dummy, id=7586, option=[null, null, null, null, drop] +item=Coffin, id=7587, option=[Check, null, null, null, drop] +item=Coffin, id=7588, option=[Check, null, null, null, drop] +item=Coffin, id=7589, option=[Check, null, null, null, drop] +item=Coffin, id=7590, option=[Check, null, null, null, drop] +item=Coffin, id=7591, option=[Check, null, null, null, drop] +item=Zombie shirt, id=7592, option=[null, Wear, null, null, drop] +item=Zombie trousers, id=7593, option=[null, Wear, null, null, drop] +item=Zombie mask, id=7594, option=[null, Wear, null, null, drop] +item=Zombie gloves, id=7595, option=[null, Wear, null, null, drop] +item=Zombie boots, id=7596, option=[null, Wear, null, null, drop] +item=Item, id=7597, option=[null, null, null, null, drop] +item=Item, id=7598, option=[null, null, null, null, drop] +item=Item, id=7599, option=[null, null, null, null, drop] +item=Item, id=7600, option=[null, null, null, null, drop] +item=Item, id=7601, option=[null, null, null, null, drop] +item=Item, id=7602, option=[null, null, null, null, drop] +item=Item, id=7603, option=[null, null, null, null, drop] +item=Item, id=7604, option=[null, null, null, null, drop] +item=Item, id=7605, option=[null, null, null, null, drop] +item=Item, id=7606, option=[null, null, null, null, drop] +item=Item, id=7607, option=[null, null, null, null, drop] +item=Item, id=7608, option=[null, null, null, null, drop] +item=Item, id=7609, option=[null, null, null, null, drop] +item=Item, id=7610, option=[null, null, null, null, drop] +item=Item, id=7611, option=[null, null, null, null, drop] +item=Item, id=7612, option=[null, null, null, null, drop] +item=Item, id=7613, option=[null, null, null, null, drop] +item=Item, id=7614, option=[null, null, null, null, drop] +item=Item, id=7615, option=[null, null, null, null, drop] +item=Item, id=7616, option=[null, null, null, null, drop] +item=Item, id=7617, option=[null, null, null, null, drop] +item=Item, id=7618, option=[null, null, null, null, drop] +item=null, id=7619, option=[null, null, null, null, drop] +item=Silvthrill rod, id=7620, option=[null, null, null, null, drop] +item=null, id=7621, option=[null, null, null, null, drop] +item=Bucket of rubble, id=7622, option=[null, null, null, Empty, drop] +item=Whoopsie, id=7623, option=[null, null, null, null, drop] +item=Bucket of rubble, id=7624, option=[null, null, null, Empty, drop] +item=Whoopsie, id=7625, option=[null, null, null, null, drop] +item=Bucket of rubble, id=7626, option=[null, null, null, Empty, drop] +item=Whoopsie, id=7627, option=[null, null, null, null, drop] +item=Plaster fragment, id=7628, option=[Read, null, null, null, Destroy] +item=Dusty scroll, id=7629, option=[Read, null, null, null, Destroy] +item=Crate, id=7630, option=[Search, null, null, null, Destroy] +item=Whoopsie, id=7631, option=[null, null, null, null, drop] +item=Temple library key, id=7632, option=[null, null, null, null, Destroy] +item=Ancient book, id=7633, option=[Read, null, null, null, Destroy] +item=Battered tome, id=7634, option=[Read, null, null, null, Destroy] +item=Leather book, id=7635, option=[Read, null, null, null, Destroy] +item=Rod dust, id=7636, option=[null, null, null, null, drop] +item=Silvthrill rod, id=7637, option=[Look-at, null, null, null, drop] +item=Silvthrill rod, id=7638, option=[Look-at, null, null, null, drop] +item=Rod of ivandis(10), id=7639, option=[null, Wield, null, null, drop] +item=Rod of ivandis(9), id=7640, option=[null, Wield, null, null, drop] +item=Rod of ivandis(8), id=7641, option=[null, Wield, null, null, drop] +item=Rod of ivandis(7), id=7642, option=[null, Wield, null, null, drop] +item=Rod of ivandis(6), id=7643, option=[null, Wield, null, null, drop] +item=Rod of ivandis(5), id=7644, option=[null, Wield, null, null, drop] +item=Rod of ivandis(4), id=7645, option=[null, Wield, null, null, drop] +item=Rod of ivandis(3), id=7646, option=[null, Wield, null, null, drop] +item=Rod of ivandis(2), id=7647, option=[null, Wield, null, null, drop] +item=Rod of ivandis(1), id=7648, option=[null, Wield, null, null, drop] +item=Rod clay mould, id=7649, option=[null, null, null, null, Destroy] +item=Silver dust, id=7650, option=[null, null, null, null, drop] +item=Silver dust, id=7651, option=[null, null, null, null, drop] +item=Guthix balance(unf), id=7652, option=[null, null, null, Empty, drop] +item=Guthix balance(unf), id=7653, option=[null, null, null, null, drop] +item=Guthix balance(unf), id=7654, option=[null, null, null, Empty, drop] +item=Guthix balance(unf), id=7655, option=[null, null, null, null, drop] +item=Guthix balance(unf), id=7656, option=[null, null, null, Empty, drop] +item=Guthix balance(unf), id=7657, option=[null, null, null, null, drop] +item=Guthix balance(unf), id=7658, option=[null, null, null, Empty, drop] +item=Guthix balance(unf), id=7659, option=[null, null, null, null, drop] +item=Guthix balance(4), id=7660, option=[null, null, null, Empty, drop] +item=Guthix balance(4), id=7661, option=[null, null, null, null, drop] +item=Guthix balance(3), id=7662, option=[null, null, null, Empty, drop] +item=Guthix balance(3), id=7663, option=[null, null, null, null, drop] +item=Guthix balance(2), id=7664, option=[null, null, null, Empty, drop] +item=Guthix balance(2), id=7665, option=[null, null, null, null, drop] +item=Guthix balance(1), id=7666, option=[null, null, null, Empty, drop] +item=Guthix balance(1), id=7667, option=[null, null, null, null, drop] +item=Gadderhammer, id=7668, option=[null, Wield, null, null, drop] +item=Gadderhammer, id=7669, option=[null, null, null, null, drop] +item=null, id=7670, option=[null, null, null, null, drop] +item=Boxing gloves, id=7671, option=[null, Wear, null, null, drop] +item=Whoopsie, id=7672, option=[Wear, null, null, null, drop] +item=Boxing gloves, id=7673, option=[null, Wear, null, null, drop] +item=Whoopsie, id=7674, option=[Wear, null, null, null, drop] +item=Wooden sword, id=7675, option=[null, Wield, null, null, drop] +item=Wooden shield, id=7676, option=[null, Wield, null, null, drop] +item=Treasure stone, id=7677, option=[Feel, null, null, null, drop] +item=Prize key, id=7678, option=[null, null, null, null, drop] +item=Pugel, id=7679, option=[null, null, null, null, drop] +item=Pugel, id=7680, option=[null, null, null, null, drop] +item=Game book, id=7681, option=[Read, null, null, null, drop] +item=Hoop, id=7682, option=[null, null, null, null, drop] +item=Hoop, id=7683, option=[null, null, null, null, drop] +item=Dart, id=7684, option=[null, null, null, null, drop] +item=Dart, id=7685, option=[null, null, null, null, drop] +item=Bow and arrow, id=7686, option=[null, null, null, null, drop] +item=Bow and arrow, id=7687, option=[null, null, null, null, drop] +item=Kettle, id=7688, option=[null, null, null, null, drop] +item=Kettle, id=7689, option=[null, null, null, null, drop] +item=Full kettle, id=7690, option=[null, null, null, null, drop] +item=Hot kettle, id=7691, option=[null, null, null, null, drop] +item=Pot of tea (4), id=7692, option=[null, null, null, Empty, drop] +item=Pot of tea (4), id=7693, option=[null, null, null, null, drop] +item=Pot of tea (3), id=7694, option=[null, null, null, Empty, drop] +item=Pot of tea (3), id=7695, option=[null, null, null, null, drop] +item=Pot of tea (2), id=7696, option=[null, null, null, Empty, drop] +item=Pot of tea (2), id=7697, option=[null, null, null, null, drop] +item=Pot of tea (1), id=7698, option=[null, null, null, Empty, drop] +item=Pot of tea (1), id=7699, option=[null, null, null, null, drop] +item=Teapot with leaves, id=7700, option=[null, null, null, null, drop] +item=Teapot with leaves, id=7701, option=[null, null, null, null, drop] +item=Teapot, id=7702, option=[null, null, null, null, drop] +item=Teapot, id=7703, option=[null, null, null, null, drop] +item=Pot of tea (4), id=7704, option=[null, null, null, Empty, drop] +item=Pot of tea (4), id=7705, option=[null, null, null, null, drop] +item=Pot of tea (3), id=7706, option=[null, null, null, Empty, drop] +item=Pot of tea (3), id=7707, option=[null, null, null, null, drop] +item=Pot of tea (2), id=7708, option=[null, null, null, Empty, drop] +item=Pot of tea (2), id=7709, option=[null, null, null, null, drop] +item=Pot of tea (1), id=7710, option=[null, null, null, Empty, drop] +item=Pot of tea (1), id=7711, option=[null, null, null, null, drop] +item=Teapot with leaves, id=7712, option=[null, null, null, null, drop] +item=Teapot with leaves, id=7713, option=[null, null, null, null, drop] +item=Teapot, id=7714, option=[null, null, null, null, drop] +item=Teapot, id=7715, option=[null, null, null, null, drop] +item=Pot of tea (4), id=7716, option=[null, null, null, Empty, drop] +item=Pot of tea (4), id=7717, option=[null, null, null, null, drop] +item=Pot of tea (3), id=7718, option=[null, null, null, Empty, drop] +item=Pot of tea (3), id=7719, option=[null, null, null, null, drop] +item=Pot of tea (2), id=7720, option=[null, null, null, Empty, drop] +item=Pot of tea (2), id=7721, option=[null, null, null, null, drop] +item=Pot of tea (1), id=7722, option=[null, null, null, Empty, drop] +item=Pot of tea (1), id=7723, option=[null, null, null, null, drop] +item=Teapot with leaves, id=7724, option=[null, null, null, null, drop] +item=Teapot with leaves, id=7725, option=[null, null, null, null, drop] +item=Teapot, id=7726, option=[null, null, null, null, drop] +item=Teapot, id=7727, option=[null, null, null, null, drop] +item=Empty cup, id=7728, option=[null, null, null, null, drop] +item=Empty cup, id=7729, option=[null, null, null, null, drop] +item=Cup of tea, id=7730, option=[null, Drink, Empty, null, drop] +item=Cup of tea, id=7731, option=[null, Drink, Empty, null, drop] +item=Porcelain cup, id=7732, option=[null, null, null, null, drop] +item=Cup of tea, id=7733, option=[null, Drink, Empty, null, drop] +item=Cup of tea, id=7734, option=[null, Drink, Empty, null, drop] +item=Porcelain cup, id=7735, option=[null, null, null, null, drop] +item=Cup of tea, id=7736, option=[null, Drink, Empty, null, drop] +item=Cup of tea, id=7737, option=[null, Drink, Empty, null, drop] +item=Tea leaves, id=7738, option=[null, null, null, null, drop] +item=Tea leaves, id=7739, option=[null, null, null, null, drop] +item=Beer, id=7740, option=[Drink, null, null, null, drop] +item=Beer, id=7741, option=[null, null, null, null, drop] +item=Beer glass, id=7742, option=[null, null, null, null, drop] +item=Beer glass, id=7743, option=[null, null, null, null, drop] +item=Asgarnian ale, id=7744, option=[Drink, null, null, null, drop] +item=Asgarnian ale, id=7745, option=[null, null, null, null, drop] +item=Greenman's ale, id=7746, option=[Drink, null, null, null, drop] +item=Greenman's ale, id=7747, option=[null, null, null, null, drop] +item=Dragon bitter, id=7748, option=[Drink, null, null, null, drop] +item=Dragon bitter, id=7749, option=[null, null, null, null, drop] +item=Moonlight mead, id=7750, option=[Drink, null, null, null, drop] +item=Moonlight mead, id=7751, option=[null, null, null, null, drop] +item=Cider, id=7752, option=[Drink, null, null, null, drop] +item=Cider, id=7753, option=[null, null, null, null, drop] +item=Chef's delight, id=7754, option=[Drink, null, null, null, drop] +item=Chef's delight, id=7755, option=[null, null, null, null, drop] +item=Paintbrush, id=7756, option=[null, null, null, null, drop] +item=Paintbrush, id=7757, option=[null, null, null, null, drop] +item=Rusty sword, id=7758, option=[null, null, null, null, drop] +item=Toy soldier, id=7759, option=[Wind, null, null, null, drop] +item=Toy soldier, id=7760, option=[null, null, null, null, drop] +item=Toy soldier (wound), id=7761, option=[null, null, null, null, Release] +item=Toy soldier (wound), id=7762, option=[null, null, null, null, drop] +item=Toy doll, id=7763, option=[Wind, null, null, null, drop] +item=Toy doll, id=7764, option=[null, null, null, null, drop] +item=Toy doll (wound), id=7765, option=[null, null, null, null, Release] +item=Toy doll (wound), id=7766, option=[null, null, null, null, drop] +item=Toy mouse, id=7767, option=[Wind, null, null, null, drop] +item=Toy mouse, id=7768, option=[null, null, null, null, drop] +item=Toy mouse (wound), id=7769, option=[null, null, null, null, Release] +item=Toy mouse (wound), id=7770, option=[null, null, null, null, drop] +item=Clockwork cat, id=7771, option=[null, null, null, null, Release] +item=Clockwork cat, id=7772, option=[null, null, null, null, drop] +item=Branch, id=7773, option=[null, null, null, null, drop] +item=Reward token, id=7774, option=[Look-at, null, null, null, Destroy] +item=Reward token, id=7775, option=[Look-at, null, null, null, Destroy] +item=Reward token, id=7776, option=[Look-at, null, null, null, Destroy] +item=Long vine, id=7777, option=[null, null, null, null, drop] +item=Short vine, id=7778, option=[null, null, null, null, drop] +item=Fishing tome, id=7779, option=[Read, null, null, null, drop] +item=Fishing tome, id=7780, option=[Read, null, null, null, drop] +item=Fishing tome, id=7781, option=[Read, null, null, null, drop] +item=Agility tome, id=7782, option=[Read, null, null, null, drop] +item=Agility tome, id=7783, option=[Read, null, null, null, drop] +item=Agility tome, id=7784, option=[Read, null, null, null, drop] +item=Thieving tome, id=7785, option=[Read, null, null, null, drop] +item=Thieving tome, id=7786, option=[Read, null, null, null, drop] +item=Thieving tome, id=7787, option=[Read, null, null, null, drop] +item=Slayer tome, id=7788, option=[Read, null, null, null, drop] +item=Slayer tome, id=7789, option=[Read, null, null, null, drop] +item=Slayer tome, id=7790, option=[Read, null, null, null, drop] +item=Mining tome, id=7791, option=[Read, null, null, null, drop] +item=Mining tome, id=7792, option=[Read, null, null, null, drop] +item=Mining tome, id=7793, option=[Read, null, null, null, drop] +item=Firemaking tome, id=7794, option=[Read, null, null, null, drop] +item=Firemaking tome, id=7795, option=[Read, null, null, null, drop] +item=Firemaking tome, id=7796, option=[Read, null, null, null, drop] +item=Woodcutting tome, id=7797, option=[Read, null, null, null, drop] +item=Woodcutting tome, id=7798, option=[Read, null, null, null, drop] +item=Woodcutting tome, id=7799, option=[Read, null, null, null, drop] +item=Snail shell, id=7800, option=[null, null, null, null, drop] +item=Snake hide, id=7801, option=[null, null, null, null, drop] +item=Snake hide, id=7802, option=[null, null, null, null, drop] +item=Yin yang amulet, id=7803, option=[null, Wear, null, null, drop] +item=Zaros mjolnir, id=7804, option=[null, Wield, null, null, drop] +item=Zaros mjolnir, id=7805, option=[null, null, null, null, drop] +item=Anger sword, id=7806, option=[null, Wield, null, null, drop] +item=Anger battleaxe, id=7807, option=[null, Wield, null, null, drop] +item=Anger mace, id=7808, option=[null, Wield, null, null, drop] +item=Anger spear, id=7809, option=[null, Wield, null, null, drop] +item=Jug of vinegar, id=7810, option=[null, null, null, Empty, drop] +item=Pot of vinegar, id=7811, option=[null, null, null, Empty, drop] +item=Goblin skull, id=7812, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7813, option=[null, null, null, Empty, drop] +item=Goblin skull, id=7814, option=[null, null, null, null, drop] +item=Bear ribs, id=7815, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7816, option=[null, null, null, Empty, drop] +item=Bear ribs, id=7817, option=[null, null, null, null, drop] +item=Ram skull, id=7818, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7819, option=[null, null, null, Empty, drop] +item=Ram skull, id=7820, option=[null, null, null, null, drop] +item=Unicorn bone, id=7821, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7822, option=[null, null, null, Empty, drop] +item=Unicorn bone, id=7823, option=[null, null, null, null, drop] +item=Giant rat bone, id=7824, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7825, option=[null, null, null, Empty, drop] +item=Giant rat bone, id=7826, option=[null, null, null, null, drop] +item=Giant bat wing, id=7827, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7828, option=[null, null, null, Empty, drop] +item=Giant bat wing, id=7829, option=[null, null, null, null, drop] +item=Wolf bone, id=7830, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7831, option=[null, null, null, Empty, drop] +item=Wolf bone, id=7832, option=[null, null, null, null, drop] +item=Bat wing, id=7833, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7834, option=[null, null, null, Empty, drop] +item=Bat wing, id=7835, option=[null, null, null, null, drop] +item=Rat bone, id=7836, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7837, option=[null, null, null, Empty, drop] +item=Rat bone, id=7838, option=[null, null, null, null, drop] +item=Baby dragon bone, id=7839, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7840, option=[null, null, null, Empty, drop] +item=Baby dragon bone, id=7841, option=[null, null, null, null, drop] +item=Ogre ribs, id=7842, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7843, option=[null, null, null, Empty, drop] +item=Ogre ribs, id=7844, option=[null, null, null, null, drop] +item=Jogre bone, id=7845, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7846, option=[null, null, null, Empty, drop] +item=Jogre bone, id=7847, option=[null, null, null, null, drop] +item=Zogre bone, id=7848, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7849, option=[null, null, null, Empty, drop] +item=Zogre bone, id=7850, option=[null, null, null, null, drop] +item=Mogre bone, id=7851, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7852, option=[null, null, null, Empty, drop] +item=Mogre bone, id=7853, option=[null, null, null, null, drop] +item=Monkey paw, id=7854, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7855, option=[null, null, null, Empty, drop] +item=Monkey paw, id=7856, option=[null, null, null, null, drop] +item=Dagannoth ribs, id=7857, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7858, option=[null, null, null, Empty, drop] +item=Dagannoth ribs, id=7859, option=[null, null, null, null, drop] +item=Snake spine, id=7860, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7861, option=[null, null, null, Empty, drop] +item=Snake spine, id=7862, option=[null, null, null, null, drop] +item=Zombie bone, id=7863, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7864, option=[null, null, null, Empty, drop] +item=Zombie bone, id=7865, option=[null, null, null, null, drop] +item=Werewolf bone, id=7866, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7867, option=[null, null, null, Empty, drop] +item=Werewolf bone, id=7868, option=[null, null, null, null, drop] +item=Moss giant bone, id=7869, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7870, option=[null, null, null, Empty, drop] +item=Moss giant bone, id=7871, option=[null, null, null, null, drop] +item=Fire giant bone, id=7872, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7873, option=[null, null, null, Empty, drop] +item=Fire giant bone, id=7874, option=[null, null, null, null, drop] +item=Ice giant ribs, id=7875, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7876, option=[null, null, null, Empty, drop] +item=Ice giant ribs, id=7877, option=[null, null, null, null, drop] +item=Terrorbird wing, id=7878, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7879, option=[null, null, null, Empty, drop] +item=Terrorbird wing, id=7880, option=[null, null, null, null, drop] +item=Ghoul bone, id=7881, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7882, option=[null, null, null, Empty, drop] +item=Ghoul bone, id=7883, option=[null, null, null, null, drop] +item=Troll bone, id=7884, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7885, option=[null, null, null, Empty, drop] +item=Troll bone, id=7886, option=[null, null, null, null, drop] +item=Seagull wing, id=7887, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7888, option=[null, null, null, Empty, drop] +item=Seagull wing, id=7889, option=[null, null, null, null, drop] +item=Undead cow ribs, id=7890, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7891, option=[null, null, null, Empty, drop] +item=Undead cow ribs, id=7892, option=[null, null, null, null, drop] +item=Experiment bone, id=7893, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7894, option=[null, null, null, Empty, drop] +item=Experiment bone, id=7895, option=[null, null, null, null, drop] +item=Rabbit bone, id=7896, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7897, option=[null, null, null, Empty, drop] +item=Rabbit bone, id=7898, option=[null, null, null, null, drop] +item=Basilisk bone, id=7899, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7900, option=[null, null, null, Empty, drop] +item=Basilisk bone, id=7901, option=[null, null, null, null, drop] +item=Desert lizard bone, id=7902, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7903, option=[null, null, null, Empty, drop] +item=Desert lizard bone, id=7904, option=[null, null, null, null, drop] +item=Cave goblin skull, id=7905, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7906, option=[null, null, null, Empty, drop] +item=Cave goblin skull, id=7907, option=[null, null, null, null, drop] +item=Big frog leg, id=7908, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7909, option=[null, null, null, Empty, drop] +item=Big frog leg, id=7910, option=[null, null, null, null, drop] +item=Vulture wing, id=7911, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7912, option=[null, null, null, Empty, drop] +item=Vulture wing, id=7913, option=[null, null, null, null, drop] +item=Jackal bone, id=7914, option=[null, null, null, null, drop] +item=Bone in vinegar, id=7915, option=[null, null, null, Empty, drop] +item=Jackal bone, id=7916, option=[null, null, null, null, drop] +item=Ram skull helm, id=7917, option=[null, Wear, null, null, drop] +item=Bonesack, id=7918, option=[null, Wear, null, null, drop] +item=Bottle of wine, id=7919, option=[Drink, null, null, null, drop] +item=Bottle of wine, id=7920, option=[null, null, null, null, drop] +item=Empty wine bottle, id=7921, option=[null, null, null, null, drop] +item=Al kharid flyer, id=7922, option=[Read, null, null, null, drop] +item=null, id=7923, option=[null, null, null, null, drop] +item=null, id=7924, option=[null, null, null, null, drop] +item=null, id=7925, option=[null, null, null, null, drop] +item=null, id=7926, option=[null, null, null, null, drop] +item=Easter ring, id=7927, option=[null, Wear, null, null, drop] +item=Easter egg, id=7928, option=[Eat, null, null, null, drop] +item=Easter egg, id=7929, option=[Eat, null, null, null, drop] +item=Easter egg, id=7930, option=[Eat, null, null, null, drop] +item=Easter egg, id=7931, option=[Eat, null, null, null, drop] +item=Easter egg, id=7932, option=[Eat, null, null, null, drop] +item=Easter egg, id=7933, option=[Eat, null, null, null, drop] +item=Field ration, id=7934, option=[Eat, null, null, null, drop] +item=Field ration, id=7935, option=[null, null, null, null, drop] +item=Pure essence, id=7936, option=[null, null, null, null, drop] +item=Pure essence, id=7937, option=[null, null, null, null, drop] +item=Bob, id=7938, option=[null, null, null, null, drop] +item=Tortoise shell, id=7939, option=[null, null, null, null, drop] +item=Tortoise shell, id=7940, option=[null, null, null, null, drop] +item=Iron sheet, id=7941, option=[null, null, null, null, drop] +item=Fresh monkfish, id=7942, option=[null, null, null, null, drop] +item=Fresh monkfish, id=7943, option=[Eat, null, null, null, drop] +item=Raw monkfish, id=7944, option=[null, null, null, null, drop] +item=Raw monkfish, id=7945, option=[null, null, null, null, drop] +item=Monkfish, id=7946, option=[Eat, null, null, null, drop] +item=Monkfish, id=7947, option=[null, null, null, null, drop] +item=Burnt monkfish, id=7948, option=[null, null, null, null, drop] +item=Burnt monkfish, id=7949, option=[null, null, null, null, drop] +item=Bone seeds, id=7950, option=[null, null, null, Open, drop] +item=Herman's book, id=7951, option=[Read, null, null, null, drop] +item=Axe handle, id=7952, option=[null, Wield, null, null, drop] +item=Axe handle, id=7953, option=[null, null, null, null, drop] +item=Burnt shrimp, id=7954, option=[null, null, null, null, drop] +item=Burnt shrimp, id=7955, option=[null, null, null, null, drop] +item=Casket, id=7956, option=[Open, null, null, null, drop] +item=White apron, id=7957, option=[null, null, null, null, drop] +item=Mining prop, id=7958, option=[null, null, null, null, Destroy] +item=Heavy box, id=7959, option=[null, null, null, null, Destroy] +item=Empty box, id=7960, option=[null, null, null, null, drop] +item=Burnt diary, id=7961, option=[Read, null, null, null, drop] +item=Burnt diary, id=7962, option=[Read, null, null, null, drop] +item=Burnt diary, id=7963, option=[Read, null, null, null, drop] +item=Burnt diary, id=7964, option=[Read, null, null, null, drop] +item=Burnt diary, id=7965, option=[Read, null, null, null, drop] +item=Letter, id=7966, option=[Read, null, null, null, Destroy] +item=Engine, id=7967, option=[null, null, null, null, drop] +item=Scroll, id=7968, option=[Read, null, null, null, Destroy] +item=Pulley beam, id=7969, option=[null, null, null, null, drop] +item=Long pulley beam, id=7970, option=[null, null, null, null, drop] +item=Longer pulley beam, id=7971, option=[null, null, null, null, drop] +item=Lift manual, id=7972, option=[Read, null, null, null, drop] +item=Beam, id=7973, option=[null, null, null, null, drop] +item=Servant bell, id=7974, option=[Ring, null, null, null, drop] +item=Crawling hand, id=7975, option=[null, null, null, null, drop] +item=Cockatrice head, id=7976, option=[null, null, null, null, drop] +item=Basilisk head, id=7977, option=[null, null, null, null, drop] +item=Kurask head, id=7978, option=[null, null, null, null, drop] +item=Abyssal head, id=7979, option=[null, null, null, null, drop] +item=Kbd heads, id=7980, option=[null, null, null, null, drop] +item=Kq head, id=7981, option=[null, null, null, null, drop] +item=Crawling hand, id=7982, option=[null, null, null, null, drop] +item=Cockatrice head, id=7983, option=[null, null, null, null, drop] +item=Basilisk head, id=7984, option=[null, null, null, null, drop] +item=Kurask head, id=7985, option=[null, null, null, null, drop] +item=Abyssal head, id=7986, option=[null, null, null, null, drop] +item=Kbd heads, id=7987, option=[null, null, null, null, drop] +item=Kq head, id=7988, option=[null, null, null, null, drop] +item=Big bass, id=7989, option=[null, null, null, null, drop] +item=Big bass, id=7990, option=[null, null, null, null, drop] +item=Big swordfish, id=7991, option=[null, null, null, null, drop] +item=Big swordfish, id=7992, option=[null, null, null, null, drop] +item=Big shark, id=7993, option=[null, null, null, null, drop] +item=Big shark, id=7994, option=[null, null, null, null, drop] +item=Arthur portrait, id=7995, option=[null, null, null, null, drop] +item=Elena portrait, id=7996, option=[null, null, null, null, drop] +item=Keldagrim portrait, id=7997, option=[null, null, null, null, drop] +item=Misc. portrait, id=7998, option=[null, null, null, null, drop] +item=Desert painting, id=7999, option=[null, null, null, null, drop] +item=Isafdar painting, id=8000, option=[null, null, null, null, drop] +item=Karamja painting, id=8001, option=[null, null, null, null, drop] +item=Lumbridge painting, id=8002, option=[null, null, null, null, drop] +item=Morytania painting, id=8003, option=[null, null, null, null, drop] +item=Small map, id=8004, option=[null, null, null, null, drop] +item=Medium map, id=8005, option=[null, null, null, null, drop] +item=Large map, id=8006, option=[null, null, null, null, drop] +item=Varrock teleport, id=8007, option=[Break, null, null, null, drop] +item=Lumbridge teleport, id=8008, option=[Break, null, null, null, drop] +item=Falador teleport, id=8009, option=[Break, null, null, null, drop] +item=Camelot teleport, id=8010, option=[Break, null, null, null, drop] +item=Ardougne teleport, id=8011, option=[Break, null, null, null, drop] +item=Watchtower t'port, id=8012, option=[Break, null, null, null, drop] +item=Teleport to house, id=8013, option=[Break, null, null, null, drop] +item=Bones to bananas, id=8014, option=[Break, null, null, null, drop] +item=Bones to peaches, id=8015, option=[Break, null, null, null, drop] +item=Enchant sapphire, id=8016, option=[Break, null, null, null, drop] +item=Enchant emerald, id=8017, option=[Break, null, null, null, drop] +item=Enchant ruby, id=8018, option=[Break, null, null, null, drop] +item=Enchant diamond, id=8019, option=[Break, null, null, null, drop] +item=Enchant dragonstn., id=8020, option=[Break, null, null, null, drop] +item=Enchant onyx, id=8021, option=[Break, null, null, null, drop] +item=Telekinetic grab, id=8022, option=[Break, null, null, null, drop] +item=Boxing ring, id=8023, option=[null, null, null, null, drop] +item=Fencing ring, id=8024, option=[null, null, null, null, drop] +item=Combat ring, id=8025, option=[null, null, null, null, drop] +item=Ranging pedestals, id=8026, option=[null, null, null, null, drop] +item=Balance beam, id=8027, option=[null, null, null, null, drop] +item=Glove rack, id=8028, option=[null, null, null, null, drop] +item=Weapons rack, id=8029, option=[null, null, null, null, drop] +item=Extra weapons rack, id=8030, option=[null, null, null, null, drop] +item=Wooden bed, id=8031, option=[null, null, null, null, drop] +item=Oak bed, id=8032, option=[null, null, null, null, drop] +item=Large oak bed, id=8033, option=[null, null, null, null, drop] +item=Teak bed, id=8034, option=[null, null, null, null, drop] +item=Large teak bed, id=8035, option=[null, null, null, null, drop] +item=4-poster, id=8036, option=[null, null, null, null, drop] +item=Gilded 4-poster, id=8037, option=[null, null, null, null, drop] +item=Shoe box, id=8038, option=[null, null, null, null, drop] +item=Oak drawers, id=8039, option=[null, null, null, null, drop] +item=Oak wardrobe, id=8040, option=[null, null, null, null, drop] +item=Teak drawers, id=8041, option=[null, null, null, null, drop] +item=Teak wardrobe, id=8042, option=[null, null, null, null, drop] +item=Mahogany 'drobe, id=8043, option=[null, null, null, null, drop] +item=Gilded wardrobe, id=8044, option=[null, null, null, null, drop] +item=Shaving stand, id=8045, option=[null, null, null, null, drop] +item=Oak shaving stand, id=8046, option=[null, null, null, null, drop] +item=Oak dresser, id=8047, option=[null, null, null, null, drop] +item=Teak dresser, id=8048, option=[null, null, null, null, drop] +item=Fancy teak dresser, id=8049, option=[null, null, null, null, drop] +item=Mahogany dresser, id=8050, option=[null, null, null, null, drop] +item=Gilded dresser, id=8051, option=[null, null, null, null, drop] +item=Oak clock, id=8052, option=[null, null, null, null, drop] +item=Teak clock, id=8053, option=[null, null, null, null, drop] +item=Gilded clock, id=8054, option=[null, null, null, null, drop] +item=Saradomin symbol, id=8055, option=[null, null, null, null, drop] +item=Zamorak symbol, id=8056, option=[null, null, null, null, drop] +item=Guthix symbol, id=8057, option=[null, null, null, null, drop] +item=Saradomin icon, id=8058, option=[null, null, null, null, drop] +item=Zamorak icon, id=8059, option=[null, null, null, null, drop] +item=Guthix icon, id=8060, option=[null, null, null, null, drop] +item=Icon of bob, id=8061, option=[null, null, null, null, drop] +item=Oak altar, id=8062, option=[null, null, null, null, drop] +item=Teak altar, id=8063, option=[null, null, null, null, drop] +item=Cloth-cover'd altar, id=8064, option=[null, null, null, null, drop] +item=Mahogany altar, id=8065, option=[null, null, null, null, drop] +item=Limestone altar, id=8066, option=[null, null, null, null, drop] +item=Marble altar, id=8067, option=[null, null, null, null, drop] +item=Gilded altar, id=8068, option=[null, null, null, null, drop] +item=Wooden torches, id=8069, option=[null, null, null, null, drop] +item=Steel torches, id=8070, option=[null, null, null, null, drop] +item=Steel candlesticks, id=8071, option=[null, null, null, null, drop] +item=Gold candlesticks, id=8072, option=[null, null, null, null, drop] +item=Incense burners, id=8073, option=[null, null, null, null, drop] +item=Mahogany burners, id=8074, option=[null, null, null, null, drop] +item=Marble burners, id=8075, option=[null, null, null, null, drop] +item=Shuttered window, id=8076, option=[null, null, null, null, drop] +item=Decorative window, id=8077, option=[null, null, null, null, drop] +item=Stained glass, id=8078, option=[null, null, null, null, drop] +item=Windchimes, id=8079, option=[null, null, null, null, drop] +item=Bells, id=8080, option=[null, null, null, null, drop] +item=Organ, id=8081, option=[null, null, null, null, drop] +item=Small statues, id=8082, option=[null, null, null, null, drop] +item=Medium statues, id=8083, option=[null, null, null, null, drop] +item=Large statues, id=8084, option=[null, null, null, null, drop] +item=Suit of armour, id=8085, option=[null, null, null, null, drop] +item=Small portrait, id=8086, option=[null, null, null, null, drop] +item=Minor head, id=8087, option=[null, null, null, null, drop] +item=Medium head, id=8088, option=[null, null, null, null, drop] +item=Major head, id=8089, option=[null, null, null, null, drop] +item=Mounted sword, id=8090, option=[null, null, null, null, drop] +item=Small landscape, id=8091, option=[null, null, null, null, drop] +item=Guild trophy, id=8092, option=[null, null, null, null, drop] +item=Large portrait, id=8093, option=[null, null, null, null, drop] +item=Large landscape, id=8094, option=[null, null, null, null, drop] +item=Rune display case, id=8095, option=[null, null, null, null, drop] +item=Low-level plants, id=8096, option=[null, null, null, null, drop] +item=Mid-level plants, id=8097, option=[null, null, null, null, drop] +item=High-level plants, id=8098, option=[null, null, null, null, drop] +item=Rope bell-pull, id=8099, option=[null, null, null, null, drop] +item=Bell-pull, id=8100, option=[null, null, null, null, drop] +item=Posh bell-pull, id=8101, option=[null, null, null, null, drop] +item=Oak decoration, id=8102, option=[null, null, null, null, drop] +item=Teak decoration, id=8103, option=[null, null, null, null, drop] +item=Gilded decoration, id=8104, option=[null, null, null, null, drop] +item=Round shield, id=8105, option=[null, null, null, null, drop] +item=Square shield, id=8106, option=[null, null, null, null, drop] +item=Kite shield, id=8107, option=[null, null, null, null, drop] +item=Wooden bench, id=8108, option=[null, null, null, null, drop] +item=Oak bench, id=8109, option=[null, null, null, null, drop] +item=Carved oak bench, id=8110, option=[null, null, null, null, drop] +item=Teak dining bench, id=8111, option=[null, null, null, null, drop] +item=Carved teak bench, id=8112, option=[null, null, null, null, drop] +item=Mahogany bench, id=8113, option=[null, null, null, null, drop] +item=Gilded bench, id=8114, option=[null, null, null, null, drop] +item=Wood dining table, id=8115, option=[null, null, null, null, drop] +item=Oak dining table, id=8116, option=[null, null, null, null, drop] +item=Carved oak table, id=8117, option=[null, null, null, null, drop] +item=Teak table, id=8118, option=[null, null, null, null, drop] +item=Carved teak table, id=8119, option=[null, null, null, null, drop] +item=Mahogany table, id=8120, option=[null, null, null, null, drop] +item=Opulent table, id=8121, option=[null, null, null, null, drop] +item=Oak door, id=8122, option=[null, null, null, null, drop] +item=Steel-plated door, id=8123, option=[null, null, null, null, drop] +item=Marble door, id=8124, option=[null, null, null, null, drop] +item=Decorative blood, id=8125, option=[null, null, null, null, drop] +item=Decorative pipe, id=8126, option=[null, null, null, null, drop] +item=Hanging skeleton, id=8127, option=[null, null, null, null, drop] +item=Candles, id=8128, option=[null, null, null, null, drop] +item=Torches, id=8129, option=[null, null, null, null, drop] +item=Skull torches, id=8130, option=[null, null, null, null, drop] +item=Skeleton guard, id=8131, option=[null, null, null, null, drop] +item=Guard dog, id=8132, option=[null, null, null, null, drop] +item=Hobgoblin guard, id=8133, option=[null, null, null, null, drop] +item=Baby red dragon, id=8134, option=[null, null, null, null, drop] +item=Huge spider, id=8135, option=[null, null, null, null, drop] +item=Troll guard, id=8136, option=[null, null, null, null, drop] +item=Hellhound, id=8137, option=[null, null, null, null, drop] +item=Demon, id=8138, option=[null, null, null, null, drop] +item=Kalphite soldier, id=8139, option=[null, null, null, null, drop] +item=Tok-xil, id=8140, option=[null, null, null, null, drop] +item=Dagannoth, id=8141, option=[null, null, null, null, drop] +item=Steel dragon, id=8142, option=[null, null, null, null, drop] +item=Spike trap, id=8143, option=[null, null, null, null, drop] +item=Man trap, id=8144, option=[null, null, null, null, drop] +item=Tangle vine, id=8145, option=[null, null, null, null, drop] +item=Marble trap, id=8146, option=[null, null, null, null, drop] +item=Teleport trap, id=8147, option=[null, null, null, null, drop] +item=Wooden crate, id=8148, option=[null, null, null, null, drop] +item=Oak chest, id=8149, option=[null, null, null, null, drop] +item=Teak chest, id=8150, option=[null, null, null, null, drop] +item=Mahogany chest, id=8151, option=[null, null, null, null, drop] +item=Magic chest, id=8152, option=[null, null, null, null, drop] +item=Clay attack stone, id=8153, option=[null, null, null, null, drop] +item=Attack stone, id=8154, option=[null, null, null, null, drop] +item=Marble att. stone, id=8155, option=[null, null, null, null, drop] +item=Magical balance 1, id=8156, option=[null, null, null, null, drop] +item=Magical balance 2, id=8157, option=[null, null, null, null, drop] +item=Magical balance 3, id=8158, option=[null, null, null, null, drop] +item=Jester, id=8159, option=[null, null, null, null, drop] +item=Treasure hunt, id=8160, option=[null, null, null, null, drop] +item=Hangman game, id=8161, option=[null, null, null, null, drop] +item=Hoop and stick, id=8162, option=[null, null, null, null, drop] +item=Dartboard, id=8163, option=[null, null, null, null, drop] +item=Archery target, id=8164, option=[null, null, null, null, drop] +item=Oak prize chest, id=8165, option=[null, null, null, null, drop] +item=Teak prize chest, id=8166, option=[null, null, null, null, drop] +item=Mahogany chest, id=8167, option=[null, null, null, null, drop] +item=Exit portal, id=8168, option=[null, null, null, null, drop] +item=Decorative rock, id=8169, option=[null, null, null, null, drop] +item=Pond, id=8170, option=[null, null, null, null, drop] +item=Imp statue, id=8171, option=[null, null, null, null, drop] +item=Dungeon entrance, id=8172, option=[null, null, null, null, drop] +item=Tree, id=8173, option=[null, null, null, null, drop] +item=Nice tree, id=8174, option=[null, null, null, null, drop] +item=Oak tree, id=8175, option=[null, null, null, null, drop] +item=Willow tree, id=8176, option=[null, null, null, null, drop] +item=Maple tree, id=8177, option=[null, null, null, null, drop] +item=Yew tree, id=8178, option=[null, null, null, null, drop] +item=Magic tree, id=8179, option=[null, null, null, null, drop] +item=Plant, id=8180, option=[null, null, null, null, drop] +item=Small fern, id=8181, option=[null, null, null, null, drop] +item=Fern, id=8182, option=[null, null, null, null, drop] +item=Dock leaf, id=8183, option=[null, null, null, null, drop] +item=Thistle, id=8184, option=[null, null, null, null, drop] +item=Reeds, id=8185, option=[null, null, null, null, drop] +item=Fern, id=8186, option=[null, null, null, null, drop] +item=Bush, id=8187, option=[null, null, null, null, drop] +item=Tall plant, id=8188, option=[null, null, null, null, drop] +item=Short plant, id=8189, option=[null, null, null, null, drop] +item=Large-leaf plant, id=8190, option=[null, null, null, null, drop] +item=Huge plant, id=8191, option=[null, null, null, null, drop] +item=Gazebo, id=8192, option=[null, null, null, null, drop] +item=Small fountain, id=8193, option=[null, null, null, null, drop] +item=Large fountain, id=8194, option=[null, null, null, null, drop] +item=Posh fountain, id=8195, option=[null, null, null, null, drop] +item=Boundary stones, id=8196, option=[null, null, null, null, drop] +item=Wooden fence, id=8197, option=[null, null, null, null, drop] +item=Stone wall, id=8198, option=[null, null, null, null, drop] +item=Iron railings, id=8199, option=[null, null, null, null, drop] +item=Picket fence, id=8200, option=[null, null, null, null, drop] +item=Garden fence, id=8201, option=[null, null, null, null, drop] +item=Marble wall, id=8202, option=[null, null, null, null, drop] +item=Thorny hedge, id=8203, option=[null, null, null, null, drop] +item=Nice hedge, id=8204, option=[null, null, null, null, drop] +item=Small box hedge, id=8205, option=[null, null, null, null, drop] +item=Topiary hedge, id=8206, option=[null, null, null, null, drop] +item=Fancy hedge, id=8207, option=[null, null, null, null, drop] +item=Tall fancy hedge, id=8208, option=[null, null, null, null, drop] +item=Tall box hedge, id=8209, option=[null, null, null, null, drop] +item=Rosemary, id=8210, option=[null, null, null, null, drop] +item=Daffodils, id=8211, option=[null, null, null, null, drop] +item=Bluebells, id=8212, option=[null, null, null, null, drop] +item=Sunflower, id=8213, option=[null, null, null, null, drop] +item=Marigolds, id=8214, option=[null, null, null, null, drop] +item=Roses, id=8215, option=[null, null, null, null, drop] +item=Firepit, id=8216, option=[null, null, null, null, drop] +item=Firepit with hook, id=8217, option=[null, null, null, null, drop] +item=Firepit with pot, id=8218, option=[null, null, null, null, drop] +item=Small oven, id=8219, option=[null, null, null, null, drop] +item=Large oven, id=8220, option=[null, null, null, null, drop] +item=Steel range, id=8221, option=[null, null, null, null, drop] +item=Fancy range, id=8222, option=[null, null, null, null, drop] +item=Wooden shelves 1, id=8223, option=[null, null, null, null, drop] +item=Wooden shelves 2, id=8224, option=[null, null, null, null, drop] +item=Wooden shelves 3, id=8225, option=[null, null, null, null, drop] +item=Oak shelves 1, id=8226, option=[null, null, null, null, drop] +item=Oak shelves 2, id=8227, option=[null, null, null, null, drop] +item=Teak shelves 1, id=8228, option=[null, null, null, null, drop] +item=Teak shelves 2, id=8229, option=[null, null, null, null, drop] +item=Pump and drain, id=8230, option=[null, null, null, null, drop] +item=Pump and tub, id=8231, option=[null, null, null, null, drop] +item=Sink, id=8232, option=[null, null, null, null, drop] +item=Wooden larder, id=8233, option=[null, null, null, null, drop] +item=Oak larder, id=8234, option=[null, null, null, null, drop] +item=Teak larder, id=8235, option=[null, null, null, null, drop] +item=Cat blanket, id=8236, option=[null, null, null, null, drop] +item=Cat basket, id=8237, option=[null, null, null, null, drop] +item=Cushioned basket, id=8238, option=[null, null, null, null, drop] +item=Beer barrel, id=8239, option=[null, null, null, null, drop] +item=Cider barrel, id=8240, option=[null, null, null, null, drop] +item=Asgarnian ale, id=8241, option=[null, null, null, null, drop] +item=Greenman's ale, id=8242, option=[null, null, null, null, drop] +item=Dragon bitter, id=8243, option=[null, null, null, null, drop] +item=Chef's delight, id=8244, option=[null, null, null, null, drop] +item=Blank poh entity, id=8245, option=[null, null, null, null, drop] +item=Wood kitchen table, id=8246, option=[null, null, null, null, drop] +item=Oak kitchen table, id=8247, option=[null, null, null, null, drop] +item=Teak kitchen table, id=8248, option=[null, null, null, null, drop] +item=Oak staircase, id=8249, option=[null, null, null, null, drop] +item=Oak staircase, id=8250, option=[null, null, null, null, drop] +item=Oak staircase, id=8251, option=[null, null, null, null, drop] +item=Teak staircase, id=8252, option=[null, null, null, null, drop] +item=Teak staircase, id=8253, option=[null, null, null, null, drop] +item=Teak staircase, id=8254, option=[null, null, null, null, drop] +item=Marble staircase, id=8255, option=[null, null, null, null, drop] +item=Marble staircase, id=8256, option=[null, null, null, null, drop] +item=Marble staircase, id=8257, option=[null, null, null, null, drop] +item=Spiral staircase, id=8258, option=[null, null, null, null, drop] +item=Marble spiral, id=8259, option=[null, null, null, null, drop] +item=Crawling hand, id=8260, option=[null, null, null, null, drop] +item=Cockatrice head, id=8261, option=[null, null, null, null, drop] +item=Basilisk head, id=8262, option=[null, null, null, null, drop] +item=Kurask head, id=8263, option=[null, null, null, null, drop] +item=Abyssal head, id=8264, option=[null, null, null, null, drop] +item=Kbd heads, id=8265, option=[null, null, null, null, drop] +item=Kq head, id=8266, option=[null, null, null, null, drop] +item=Mounted bass, id=8267, option=[null, null, null, null, drop] +item=Mounted swordfish, id=8268, option=[null, null, null, null, drop] +item=Mounted shark, id=8269, option=[null, null, null, null, drop] +item=Mithril armour, id=8270, option=[null, null, null, null, drop] +item=Adamantite armour, id=8271, option=[null, null, null, null, drop] +item=Runite armour, id=8272, option=[null, null, null, null, drop] +item=Cw armour 1, id=8273, option=[null, null, null, null, drop] +item=Cw armour 2, id=8274, option=[null, null, null, null, drop] +item=Cw armour 3, id=8275, option=[null, null, null, null, drop] +item=Rune case 1, id=8276, option=[null, null, null, null, drop] +item=Rune case 2, id=8277, option=[null, null, null, null, drop] +item=Rune case 3, id=8278, option=[null, null, null, null, drop] +item=Silverlight, id=8279, option=[null, null, null, null, drop] +item=Excalibur, id=8280, option=[null, null, null, null, drop] +item=Darklight, id=8281, option=[null, null, null, null, drop] +item=Anti-dragon shield, id=8282, option=[null, null, null, null, drop] +item=Amulet of glory, id=8283, option=[null, null, null, null, drop] +item=Cape of legends, id=8284, option=[null, null, null, null, drop] +item=King arthur, id=8285, option=[null, null, null, null, drop] +item=Elena, id=8286, option=[null, null, null, null, drop] +item=Giant dwarf, id=8287, option=[null, null, null, null, drop] +item=Miscellanians, id=8288, option=[null, null, null, null, drop] +item=Lumbridge, id=8289, option=[null, null, null, null, drop] +item=The desert, id=8290, option=[null, null, null, null, drop] +item=Morytania, id=8291, option=[null, null, null, null, drop] +item=Karamja, id=8292, option=[null, null, null, null, drop] +item=Isafdar, id=8293, option=[null, null, null, null, drop] +item=Small map, id=8294, option=[null, null, null, null, drop] +item=Medium map, id=8295, option=[null, null, null, null, drop] +item=Large map, id=8296, option=[null, null, null, null, drop] +item=Oak cage, id=8297, option=[null, null, null, null, drop] +item=Oak and steel cage, id=8298, option=[null, null, null, null, drop] +item=Steel cage, id=8299, option=[null, null, null, null, drop] +item=Spiked cage, id=8300, option=[null, null, null, null, drop] +item=Bone cage, id=8301, option=[null, null, null, null, drop] +item=Spikes, id=8302, option=[null, null, null, null, drop] +item=Tentacle pool, id=8303, option=[null, null, null, null, drop] +item=Flame pit, id=8304, option=[null, null, null, null, drop] +item=Rocnar, id=8305, option=[null, null, null, null, drop] +item=Oak ladder, id=8306, option=[null, null, null, null, drop] +item=Teak ladder, id=8307, option=[null, null, null, null, drop] +item=Mahogany ladder, id=8308, option=[null, null, null, null, drop] +item=Crude wooden chair, id=8309, option=[null, null, null, null, drop] +item=Wooden chair, id=8310, option=[null, null, null, null, drop] +item=Rocking chair, id=8311, option=[null, null, null, null, drop] +item=Oak chair, id=8312, option=[null, null, null, null, drop] +item=Oak armchair, id=8313, option=[null, null, null, null, drop] +item=Teak armchair, id=8314, option=[null, null, null, null, drop] +item=Mahogany armchair, id=8315, option=[null, null, null, null, drop] +item=Brown rug, id=8316, option=[null, null, null, null, drop] +item=Rug, id=8317, option=[null, null, null, null, drop] +item=Opulent rug, id=8318, option=[null, null, null, null, drop] +item=Wooden bookcase, id=8319, option=[null, null, null, null, drop] +item=Oak bookcase, id=8320, option=[null, null, null, null, drop] +item=Mahogany b'kcase, id=8321, option=[null, null, null, null, drop] +item=Torn curtains, id=8322, option=[null, null, null, null, drop] +item=Curtains, id=8323, option=[null, null, null, null, drop] +item=Opulent curtains, id=8324, option=[null, null, null, null, drop] +item=Clay fireplace, id=8325, option=[null, null, null, null, drop] +item=Stone fireplace, id=8326, option=[null, null, null, null, drop] +item=Marble fireplace, id=8327, option=[null, null, null, null, drop] +item=Teak portal, id=8328, option=[null, null, null, null, drop] +item=Mahogany portal, id=8329, option=[null, null, null, null, drop] +item=Marble portal, id=8330, option=[null, null, null, null, drop] +item=Teleport focus, id=8331, option=[null, null, null, null, drop] +item=Greater focus, id=8332, option=[null, null, null, null, drop] +item=Scrying pool, id=8333, option=[null, null, null, null, drop] +item=Oak lectern, id=8334, option=[null, null, null, null, drop] +item=Eagle lectern, id=8335, option=[null, null, null, null, drop] +item=Demon lectern, id=8336, option=[null, null, null, null, drop] +item=Teak eagle lectern, id=8337, option=[null, null, null, null, drop] +item=Teak demon lectern, id=8338, option=[null, null, null, null, drop] +item=Mahogany eagle, id=8339, option=[null, null, null, null, drop] +item=Mahogany demon, id=8340, option=[null, null, null, null, drop] +item=Globe, id=8341, option=[null, null, null, null, drop] +item=Ornamental globe, id=8342, option=[null, null, null, null, drop] +item=Lunar globe, id=8343, option=[null, null, null, null, drop] +item=Celestial globe, id=8344, option=[null, null, null, null, drop] +item=Armillary sphere, id=8345, option=[null, null, null, null, drop] +item=Small orrery, id=8346, option=[null, null, null, null, drop] +item=Large orrery, id=8347, option=[null, null, null, null, drop] +item=Wooden telescope, id=8348, option=[null, null, null, null, drop] +item=Teak telescope, id=8349, option=[null, null, null, null, drop] +item=Mahogany 'scope, id=8350, option=[null, null, null, null, drop] +item=Crystal ball, id=8351, option=[null, null, null, null, drop] +item=Elemental sphere, id=8352, option=[null, null, null, null, drop] +item=Crystal of power, id=8353, option=[null, null, null, null, drop] +item=Alchemical chart, id=8354, option=[null, null, null, null, drop] +item=Astronomical chart, id=8355, option=[null, null, null, null, drop] +item=Infernal chart, id=8356, option=[null, null, null, null, drop] +item=Oak throne, id=8357, option=[null, null, null, null, drop] +item=Teak throne, id=8358, option=[null, null, null, null, drop] +item=Mahogany throne, id=8359, option=[null, null, null, null, drop] +item=Gilded throne, id=8360, option=[null, null, null, null, drop] +item=Skeleton throne, id=8361, option=[null, null, null, null, drop] +item=Crystal throne, id=8362, option=[null, null, null, null, drop] +item=Demonic throne, id=8363, option=[null, null, null, null, drop] +item=Oak lever, id=8364, option=[null, null, null, null, drop] +item=Teak lever, id=8365, option=[null, null, null, null, drop] +item=Mahogany lever, id=8366, option=[null, null, null, null, drop] +item=Trapdoor, id=8367, option=[null, null, null, null, drop] +item=Trapdoor, id=8368, option=[null, null, null, null, drop] +item=Trapdoor, id=8369, option=[null, null, null, null, drop] +item=Floor decoration, id=8370, option=[null, null, null, null, drop] +item=Steel cage, id=8371, option=[null, null, null, null, drop] +item=Trapdoor, id=8372, option=[null, null, null, null, drop] +item=Lesser magic cage, id=8373, option=[null, null, null, null, drop] +item=Greater magic cage, id=8374, option=[null, null, null, null, drop] +item=Wooden workbench, id=8375, option=[null, null, null, null, drop] +item=Oak workbench, id=8376, option=[null, null, null, null, drop] +item=Steel framed bench, id=8377, option=[null, null, null, null, drop] +item=Bench with vice, id=8378, option=[null, null, null, null, drop] +item=Bench with lathe, id=8379, option=[null, null, null, null, drop] +item=Crafting table 1, id=8380, option=[null, null, null, null, drop] +item=Crafting table 2, id=8381, option=[null, null, null, null, drop] +item=Crafting table 3, id=8382, option=[null, null, null, null, drop] +item=Crafting table 4, id=8383, option=[null, null, null, null, drop] +item=Tool store 1, id=8384, option=[null, null, null, null, drop] +item=Tool store 2, id=8385, option=[null, null, null, null, drop] +item=Tool store 3, id=8386, option=[null, null, null, null, drop] +item=Tool store 4, id=8387, option=[null, null, null, null, drop] +item=Tool store 5, id=8388, option=[null, null, null, null, drop] +item=Repair bench, id=8389, option=[null, null, null, null, drop] +item=Whetstone, id=8390, option=[null, null, null, null, drop] +item=Armour stand, id=8391, option=[null, null, null, null, drop] +item=Pluming stand, id=8392, option=[null, null, null, null, drop] +item=Shield easel, id=8393, option=[null, null, null, null, drop] +item=Banner easel, id=8394, option=[null, null, null, null, drop] +item=Parlour, id=8395, option=[null, null, null, null, drop] +item=Kitchen, id=8396, option=[null, null, null, null, drop] +item=Dining room, id=8397, option=[null, null, null, null, drop] +item=Bedroom, id=8398, option=[null, null, null, null, drop] +item=Games room, id=8399, option=[null, null, null, null, drop] +item=Combat room, id=8400, option=[null, null, null, null, drop] +item=Hall, id=8401, option=[null, null, null, null, drop] +item=Hall, id=8402, option=[null, null, null, null, drop] +item=Hall, id=8403, option=[null, null, null, null, drop] +item=Hall, id=8404, option=[null, null, null, null, drop] +item=Chapel, id=8405, option=[null, null, null, null, drop] +item=Workshop, id=8406, option=[null, null, null, null, drop] +item=Study, id=8407, option=[null, null, null, null, drop] +item=Portal chamber, id=8408, option=[null, null, null, null, drop] +item=Throne room, id=8409, option=[null, null, null, null, drop] +item=Oubliette, id=8410, option=[null, null, null, null, drop] +item=Dungeon corridor, id=8411, option=[null, null, null, null, drop] +item=Dungeon cross, id=8412, option=[null, null, null, null, drop] +item=Dungeon stairs, id=8413, option=[null, null, null, null, drop] +item=Treasure room, id=8414, option=[null, null, null, null, drop] +item=Garden, id=8415, option=[null, null, null, null, drop] +item=Formal garden, id=8416, option=[null, null, null, null, drop] +item=Bagged dead tree, id=8417, option=[null, null, null, null, drop] +item=Bagged dead tree, id=8418, option=[null, null, null, null, drop] +item=Bagged nice tree, id=8419, option=[null, null, null, null, drop] +item=Bagged nice tree, id=8420, option=[null, null, null, null, drop] +item=Bagged oak tree, id=8421, option=[null, null, null, null, drop] +item=Bagged oak tree, id=8422, option=[null, null, null, null, drop] +item=Bagged willow tree, id=8423, option=[null, null, null, null, drop] +item=Bagged willow tree, id=8424, option=[null, null, null, null, drop] +item=Bagged maple tree, id=8425, option=[null, null, null, null, drop] +item=Bagged maple tree, id=8426, option=[null, null, null, null, drop] +item=Bagged yew tree, id=8427, option=[null, null, null, null, drop] +item=Bagged yew tree, id=8428, option=[null, null, null, null, drop] +item=Bagged magic tree, id=8429, option=[null, null, null, null, drop] +item=Bagged magic tree, id=8430, option=[null, null, null, null, drop] +item=Bagged plant 1, id=8431, option=[null, null, null, null, drop] +item=Bagged plant 1, id=8432, option=[null, null, null, null, drop] +item=Bagged plant 2, id=8433, option=[null, null, null, null, drop] +item=Bagged plant 2, id=8434, option=[null, null, null, null, drop] +item=Bagged plant 3, id=8435, option=[null, null, null, null, drop] +item=Bagged plant 3, id=8436, option=[null, null, null, null, drop] +item=Thorny hedge, id=8437, option=[null, null, null, null, drop] +item=Thorny hedge, id=8438, option=[null, null, null, null, drop] +item=Nice hedge, id=8439, option=[null, null, null, null, drop] +item=Nice hedge, id=8440, option=[null, null, null, null, drop] +item=Small box hedge, id=8441, option=[null, null, null, null, drop] +item=Small box hedge, id=8442, option=[null, null, null, null, drop] +item=Topiary hedge, id=8443, option=[null, null, null, null, drop] +item=Topiary hedge, id=8444, option=[null, null, null, null, drop] +item=Fancy hedge, id=8445, option=[null, null, null, null, drop] +item=Fancy hedge, id=8446, option=[null, null, null, null, drop] +item=Tall fancy hedge, id=8447, option=[null, null, null, null, drop] +item=Tall fancy hedge, id=8448, option=[null, null, null, null, drop] +item=Tall box hedge, id=8449, option=[null, null, null, null, drop] +item=Tall box hedge, id=8450, option=[null, null, null, null, drop] +item=Bagged rosemary, id=8451, option=[null, null, null, null, drop] +item=Bagged rosemary, id=8452, option=[null, null, null, null, drop] +item=Bagged daffodils, id=8453, option=[null, null, null, null, drop] +item=Bagged daffodils, id=8454, option=[null, null, null, null, drop] +item=Bagged bluebells, id=8455, option=[null, null, null, null, drop] +item=Bagged bluebells, id=8456, option=[null, null, null, null, drop] +item=Bagged sunflower, id=8457, option=[null, null, null, null, drop] +item=Bagged sunflower, id=8458, option=[null, null, null, null, drop] +item=Bagged marigolds, id=8459, option=[null, null, null, null, drop] +item=Bagged marigolds, id=8460, option=[null, null, null, null, drop] +item=Bagged roses, id=8461, option=[null, null, null, null, drop] +item=Bagged roses, id=8462, option=[null, null, null, null, drop] +item=Construction guide, id=8463, option=[Read, null, null, null, drop] +item=Rune heraldic helm, id=8464, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8465, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8466, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8467, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8468, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8469, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8470, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8471, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8472, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8473, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8474, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8475, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8476, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8477, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8478, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8479, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8480, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8481, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8482, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8483, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8484, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8485, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8486, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8487, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8488, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8489, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8490, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8491, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8492, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8493, option=[Wear, null, null, null, drop] +item=Rune heraldic helm, id=8494, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8495, option=[Wear, null, null, null, drop] +item=Crude wooden chair, id=8496, option=[null, null, null, null, drop] +item=Crude wooden chair, id=8497, option=[null, null, null, null, drop] +item=Wooden chair, id=8498, option=[null, null, null, null, drop] +item=Wooden chair, id=8499, option=[null, null, null, null, drop] +item=Rocking chair, id=8500, option=[null, null, null, null, drop] +item=Rocking chair, id=8501, option=[null, null, null, null, drop] +item=Oak chair, id=8502, option=[null, null, null, null, drop] +item=Oak chair, id=8503, option=[null, null, null, null, drop] +item=Oak armchair, id=8504, option=[null, null, null, null, drop] +item=Oak armchair, id=8505, option=[null, null, null, null, drop] +item=Teak armchair, id=8506, option=[null, null, null, null, drop] +item=Teak armchair, id=8507, option=[null, null, null, null, drop] +item=Mahogany armchair, id=8508, option=[null, null, null, null, drop] +item=Mahogany armchair, id=8509, option=[null, null, null, null, drop] +item=Wooden bookcase, id=8510, option=[null, null, null, null, drop] +item=Wooden bookcase, id=8511, option=[null, null, null, null, drop] +item=Oak bookcase, id=8512, option=[null, null, null, null, drop] +item=Oak bookcase, id=8513, option=[null, null, null, null, drop] +item=Mahogany b'kcase, id=8514, option=[null, null, null, null, drop] +item=Mahogany b'kcase, id=8515, option=[null, null, null, null, drop] +item=Beer barrel, id=8516, option=[null, null, null, null, drop] +item=Beer barrel, id=8517, option=[null, null, null, null, drop] +item=Cider barrel, id=8518, option=[null, null, null, null, drop] +item=Cider barrel, id=8519, option=[null, null, null, null, drop] +item=Asgarnian ale, id=8520, option=[null, null, null, null, drop] +item=Asgarnian ale, id=8521, option=[null, null, null, null, drop] +item=Greenman's ale, id=8522, option=[null, null, null, null, drop] +item=Greenman's ale, id=8523, option=[null, null, null, null, drop] +item=Dragon bitter, id=8524, option=[null, null, null, null, drop] +item=Dragon bitter, id=8525, option=[null, null, null, null, drop] +item=Chef's delight, id=8526, option=[null, null, null, null, drop] +item=Chef's delight, id=8527, option=[null, null, null, null, drop] +item=Wood kitchen table, id=8528, option=[null, null, null, null, drop] +item=Wood kitchen table, id=8529, option=[null, null, null, null, drop] +item=Oak kitchen table, id=8530, option=[null, null, null, null, drop] +item=Oak kitchen table, id=8531, option=[null, null, null, null, drop] +item=Teak kitchen table, id=8532, option=[null, null, null, null, drop] +item=Teak kitchen table, id=8533, option=[null, null, null, null, drop] +item=Oak lectern, id=8534, option=[null, null, null, null, drop] +item=Oak lectern, id=8535, option=[null, null, null, null, drop] +item=Eagle lectern, id=8536, option=[null, null, null, null, drop] +item=Eagle lectern, id=8537, option=[null, null, null, null, drop] +item=Demon lectern, id=8538, option=[null, null, null, null, drop] +item=Demon lectern, id=8539, option=[null, null, null, null, drop] +item=Teak eagle lectern, id=8540, option=[null, null, null, null, drop] +item=Teak eagle lectern, id=8541, option=[null, null, null, null, drop] +item=Teak demon lectern, id=8542, option=[null, null, null, null, drop] +item=Teak demon lectern, id=8543, option=[null, null, null, null, drop] +item=Mahogany eagle, id=8544, option=[null, null, null, null, drop] +item=Mahogany eagle, id=8545, option=[null, null, null, null, drop] +item=Mahogany demon, id=8546, option=[null, null, null, null, drop] +item=Mahogany demon, id=8547, option=[null, null, null, null, drop] +item=Wood dining table, id=8548, option=[null, null, null, null, drop] +item=Wood dining table, id=8549, option=[null, null, null, null, drop] +item=Oak dining table, id=8550, option=[null, null, null, null, drop] +item=Oak dining table, id=8551, option=[null, null, null, null, drop] +item=Carved oak table, id=8552, option=[null, null, null, null, drop] +item=Carved oak table, id=8553, option=[null, null, null, null, drop] +item=Teak table, id=8554, option=[null, null, null, null, drop] +item=Teak table, id=8555, option=[null, null, null, null, drop] +item=Carved teak table, id=8556, option=[null, null, null, null, drop] +item=Carved teak table, id=8557, option=[null, null, null, null, drop] +item=Mahogany table, id=8558, option=[null, null, null, null, drop] +item=Mahogany table, id=8559, option=[null, null, null, null, drop] +item=Opulent table, id=8560, option=[null, null, null, null, drop] +item=Opulent table, id=8561, option=[null, null, null, null, drop] +item=Wooden bench, id=8562, option=[null, null, null, null, drop] +item=Wooden bench, id=8563, option=[null, null, null, null, drop] +item=Oak bench, id=8564, option=[null, null, null, null, drop] +item=Oak bench, id=8565, option=[null, null, null, null, drop] +item=Carved oak bench, id=8566, option=[null, null, null, null, drop] +item=Carved oak bench, id=8567, option=[null, null, null, null, drop] +item=Teak dining bench, id=8568, option=[null, null, null, null, drop] +item=Teak dining bench, id=8569, option=[null, null, null, null, drop] +item=Carved teak bench, id=8570, option=[null, null, null, null, drop] +item=Carved teak bench, id=8571, option=[null, null, null, null, drop] +item=Mahogany bench, id=8572, option=[null, null, null, null, drop] +item=Mahogany bench, id=8573, option=[null, null, null, null, drop] +item=Gilded bench, id=8574, option=[null, null, null, null, drop] +item=Gilded bench, id=8575, option=[null, null, null, null, drop] +item=Wooden bed, id=8576, option=[null, null, null, null, drop] +item=Wooden bed, id=8577, option=[null, null, null, null, drop] +item=Oak bed, id=8578, option=[null, null, null, null, drop] +item=Oak bed, id=8579, option=[null, null, null, null, drop] +item=Large oak bed, id=8580, option=[null, null, null, null, drop] +item=Large oak bed, id=8581, option=[null, null, null, null, drop] +item=Teak bed, id=8582, option=[null, null, null, null, drop] +item=Teak bed, id=8583, option=[null, null, null, null, drop] +item=Large teak bed, id=8584, option=[null, null, null, null, drop] +item=Large teak bed, id=8585, option=[null, null, null, null, drop] +item=4-poster, id=8586, option=[null, null, null, null, drop] +item=4-poster, id=8587, option=[null, null, null, null, drop] +item=Gilded 4-poster, id=8588, option=[null, null, null, null, drop] +item=Gilded 4-poster, id=8589, option=[null, null, null, null, drop] +item=Oak clock, id=8590, option=[null, null, null, null, drop] +item=Oak clock, id=8591, option=[null, null, null, null, drop] +item=Teak clock, id=8592, option=[null, null, null, null, drop] +item=Teak clock, id=8593, option=[null, null, null, null, drop] +item=Gilded clock, id=8594, option=[null, null, null, null, drop] +item=Gilded clock, id=8595, option=[null, null, null, null, drop] +item=Shaving stand, id=8596, option=[null, null, null, null, drop] +item=Shaving stand, id=8597, option=[null, null, null, null, drop] +item=Oak shaving stand, id=8598, option=[null, null, null, null, drop] +item=Oak shaving stand, id=8599, option=[null, null, null, null, drop] +item=Oak dresser, id=8600, option=[null, null, null, null, drop] +item=Oak dresser, id=8601, option=[null, null, null, null, drop] +item=Teak dresser, id=8602, option=[null, null, null, null, drop] +item=Teak dresser, id=8603, option=[null, null, null, null, drop] +item=Fancy teak dresser, id=8604, option=[null, null, null, null, drop] +item=Fancy teak dresser, id=8605, option=[null, null, null, null, drop] +item=Mahogany dresser, id=8606, option=[null, null, null, null, drop] +item=Mahogany dresser, id=8607, option=[null, null, null, null, drop] +item=Gilded dresser, id=8608, option=[null, null, null, null, drop] +item=Gilded dresser, id=8609, option=[null, null, null, null, drop] +item=Shoe box, id=8610, option=[null, null, null, null, drop] +item=Shoe box, id=8611, option=[null, null, null, null, drop] +item=Oak drawers, id=8612, option=[null, null, null, null, drop] +item=Oak drawers, id=8613, option=[null, null, null, null, drop] +item=Oak wardrobe, id=8614, option=[null, null, null, null, drop] +item=Oak wardrobe, id=8615, option=[null, null, null, null, drop] +item=Teak drawers, id=8616, option=[null, null, null, null, drop] +item=Teak drawers, id=8617, option=[null, null, null, null, drop] +item=Teak wardrobe, id=8618, option=[null, null, null, null, drop] +item=Teak wardrobe, id=8619, option=[null, null, null, null, drop] +item=Mahogany 'drobe, id=8620, option=[null, null, null, null, drop] +item=Mahogany 'drobe, id=8621, option=[null, null, null, null, drop] +item=Gilded wardrobe, id=8622, option=[null, null, null, null, drop] +item=Gilded wardrobe, id=8623, option=[null, null, null, null, drop] +item=Crystal ball, id=8624, option=[null, null, null, null, drop] +item=Crystal ball, id=8625, option=[null, null, null, null, drop] +item=Elemental sphere, id=8626, option=[null, null, null, null, drop] +item=Elemental sphere, id=8627, option=[null, null, null, null, drop] +item=Crystal of power, id=8628, option=[null, null, null, null, drop] +item=Crystal of power, id=8629, option=[null, null, null, null, drop] +item=Globe, id=8630, option=[null, null, null, null, drop] +item=Globe, id=8631, option=[null, null, null, null, drop] +item=Ornamental globe, id=8632, option=[null, null, null, null, drop] +item=Ornamental globe, id=8633, option=[null, null, null, null, drop] +item=Lunar globe, id=8634, option=[null, null, null, null, drop] +item=Lunar globe, id=8635, option=[null, null, null, null, drop] +item=Celestial globe, id=8636, option=[null, null, null, null, drop] +item=Celestial globe, id=8637, option=[null, null, null, null, drop] +item=Armillary sphere, id=8638, option=[null, null, null, null, drop] +item=Armillary sphere, id=8639, option=[null, null, null, null, drop] +item=Small orrery, id=8640, option=[null, null, null, null, drop] +item=Small orrery, id=8641, option=[null, null, null, null, drop] +item=Large orrery, id=8642, option=[null, null, null, null, drop] +item=Large orrery, id=8643, option=[null, null, null, null, drop] +item=Wooden telescope, id=8644, option=[null, null, null, null, drop] +item=Wooden telescope, id=8645, option=[null, null, null, null, drop] +item=Teak telescope, id=8646, option=[null, null, null, null, drop] +item=Teak telescope, id=8647, option=[null, null, null, null, drop] +item=Mahogany 'scope, id=8648, option=[null, null, null, null, drop] +item=Mahogany 'scope, id=8649, option=[null, null, null, null, drop] +item=Banner, id=8650, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8651, option=[Wear, null, null, null, drop] +item=Banner, id=8652, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8653, option=[Wear, null, null, null, drop] +item=Banner, id=8654, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8655, option=[Wear, null, null, null, drop] +item=Banner, id=8656, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8657, option=[Wear, null, null, null, drop] +item=Banner, id=8658, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8659, option=[Wear, null, null, null, drop] +item=Banner, id=8660, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8661, option=[Wear, null, null, null, drop] +item=Banner, id=8662, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8663, option=[Wear, null, null, null, drop] +item=Banner, id=8664, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8665, option=[Wear, null, null, null, drop] +item=Banner, id=8666, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8667, option=[Wear, null, null, null, drop] +item=Banner, id=8668, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8669, option=[Wear, null, null, null, drop] +item=Banner, id=8670, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8671, option=[Wear, null, null, null, drop] +item=Banner, id=8672, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8673, option=[Wear, null, null, null, drop] +item=Banner, id=8674, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8675, option=[Wear, null, null, null, drop] +item=Banner, id=8676, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8677, option=[Wear, null, null, null, drop] +item=Banner, id=8678, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8679, option=[Wear, null, null, null, drop] +item=Banner, id=8680, option=[null, Wield, null, null, drop] +item=Whoopsie, id=8681, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8682, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8683, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8684, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8685, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8686, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8687, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8688, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8689, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8690, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8691, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8692, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8693, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8694, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8695, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8696, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8697, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8698, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8699, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8700, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8701, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8702, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8703, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8704, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8705, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8706, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8707, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8708, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8709, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8710, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8711, option=[Wear, null, null, null, drop] +item=Steel heraldic helm, id=8712, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8713, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8714, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8715, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8716, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8717, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8718, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8719, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8720, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8721, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8722, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8723, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8724, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8725, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8726, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8727, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8728, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8729, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8730, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8731, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8732, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8733, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8734, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8735, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8736, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8737, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8738, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8739, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8740, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8741, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8742, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8743, option=[Wear, null, null, null, drop] +item=Rune kiteshield, id=8744, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8745, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8746, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8747, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8748, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8749, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8750, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8751, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8752, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8753, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8754, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8755, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8756, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8757, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8758, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8759, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8760, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8761, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8762, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8763, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8764, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8765, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8766, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8767, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8768, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8769, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8770, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8771, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8772, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8773, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8774, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8775, option=[Wear, null, null, null, drop] +item=Steel kiteshield, id=8776, option=[null, Wear, null, null, drop] +item=Whoopsie, id=8777, option=[Wear, null, null, null, drop] +item=Oak plank, id=8778, option=[null, null, null, null, drop] +item=Oak plank, id=8779, option=[null, null, null, null, drop] +item=Teak plank, id=8780, option=[null, null, null, null, drop] +item=Teak plank, id=8781, option=[null, null, null, null, drop] +item=Mahogany plank, id=8782, option=[null, null, null, null, drop] +item=Mahogany plank, id=8783, option=[null, null, null, null, drop] +item=Gold leaf, id=8784, option=[null, null, null, null, drop] +item=Gold leaf, id=8785, option=[null, null, null, null, drop] +item=Marble block, id=8786, option=[null, null, null, null, drop] +item=Marble block, id=8787, option=[null, null, null, null, drop] +item=Magic stone, id=8788, option=[null, null, null, null, drop] +item=Magic stone, id=8789, option=[null, null, null, null, drop] +item=Bolt of cloth, id=8790, option=[null, null, null, null, drop] +item=Bolt of cloth, id=8791, option=[null, null, null, null, drop] +item=Clockwork, id=8792, option=[null, null, null, null, drop] +item=Clockwork, id=8793, option=[null, null, null, null, drop] +item=Saw, id=8794, option=[null, null, null, null, drop] +item=Saw, id=8795, option=[null, null, null, null, drop] +item=Thing, id=8796, option=[null, null, null, null, drop] +item=Cheat, id=8797, option=[null, null, null, null, drop] +item=null, id=8798, option=[null, null, null, null, drop] +item=null, id=8799, option=[null, null, null, null, drop] +item=null, id=8800, option=[null, null, null, null, drop] +item=null, id=8801, option=[null, null, null, null, drop] +item=null, id=8802, option=[null, null, null, null, drop] +item=null, id=8803, option=[null, null, null, null, drop] +item=null, id=8804, option=[null, null, null, null, drop] +item=null, id=8805, option=[null, null, null, null, drop] +item=null, id=8806, option=[null, null, null, null, drop] +item=null, id=8807, option=[null, null, null, null, drop] +item=null, id=8808, option=[null, null, null, null, drop] +item=null, id=8809, option=[null, null, null, null, drop] +item=null, id=8810, option=[null, null, null, null, drop] +item=null, id=8811, option=[null, null, null, null, drop] +item=null, id=8812, option=[null, null, null, null, drop] +item=null, id=8813, option=[null, null, null, null, drop] +item=null, id=8814, option=[null, null, null, null, drop] +item=null, id=8815, option=[null, null, null, null, drop] +item=null, id=8816, option=[null, null, null, null, drop] +item=null, id=8817, option=[null, null, null, null, drop] +item=null, id=8818, option=[null, null, null, null, drop] +item=null, id=8819, option=[null, null, null, null, drop] +item=null, id=8820, option=[null, null, null, null, drop] +item=null, id=8821, option=[null, null, null, null, drop] +item=null, id=8822, option=[null, null, null, null, drop] +item=null, id=8823, option=[null, null, null, null, drop] +item=null, id=8824, option=[null, null, null, null, drop] +item=null, id=8825, option=[null, null, null, null, drop] +item=null, id=8826, option=[null, null, null, null, drop] +item=null, id=8827, option=[null, null, null, null, drop] +item=null, id=8828, option=[null, null, null, null, drop] +item=null, id=8829, option=[null, null, null, null, drop] +item=null, id=8830, option=[null, null, null, null, drop] +item=null, id=8831, option=[null, null, null, null, drop] +item=null, id=8832, option=[null, null, null, null, drop] +item=null, id=8833, option=[null, null, null, null, drop] +item=null, id=8834, option=[null, null, null, null, drop] +item=null, id=8835, option=[null, null, null, null, drop] +item=Mahogany logs, id=8836, option=[null, null, null, null, drop] +item=Timber beam, id=8837, option=[null, null, null, null, drop] +item=Timber beam, id=8838, option=[null, null, null, null, drop] +item=Void knight top, id=8839, option=[null, Wear, null, null, drop] +item=Void knight robe, id=8840, option=[null, Wear, null, null, drop] +item=Void knight mace, id=8841, option=[null, Wield, null, null, drop] +item=Void knight gloves, id=8842, option=[null, Wear, null, null, drop] +item=null, id=8843, option=[null, null, null, null, drop] +item=Bronze defender, id=8844, option=[null, Wield, null, null, drop] +item=Iron defender, id=8845, option=[null, Wield, null, null, drop] +item=Steel defender, id=8846, option=[null, Wield, null, null, drop] +item=Black defender, id=8847, option=[null, Wield, null, null, drop] +item=Mithril defender, id=8848, option=[null, Wield, null, null, drop] +item=Adamant defender, id=8849, option=[null, Wield, null, null, drop] +item=Rune defender, id=8850, option=[null, Wield, null, null, drop] +item=Warrior guild token, id=8851, option=[null, null, null, null, drop] +item=null, id=8852, option=[null, null, null, null, drop] +item=null, id=8853, option=[null, null, null, null, drop] +item=null, id=8854, option=[null, null, null, null, drop] +item=null, id=8855, option=[null, null, null, null, drop] +item=Defensive shield, id=8856, option=[null, Wield, null, null, drop] +item=Shot, id=8857, option=[null, null, null, null, drop] +item=18lb shot, id=8858, option=[null, null, null, null, drop] +item=22lb shot, id=8859, option=[null, null, null, null, drop] +item=One barrel, id=8860, option=[null, null, null, null, drop] +item=Two barrels, id=8861, option=[null, null, null, null, drop] +item=Three barrels, id=8862, option=[null, null, null, null, drop] +item=Four barrels, id=8863, option=[null, null, null, null, drop] +item=Five barrels, id=8864, option=[null, null, null, null, drop] +item=Ground ashes, id=8865, option=[Dust-hands, null, null, null, drop] +item=Steel key, id=8866, option=[null, null, null, null, drop] +item=Bronze key, id=8867, option=[null, null, null, null, drop] +item=Silver key, id=8868, option=[null, null, null, null, drop] +item=Iron key, id=8869, option=[null, null, null, null, drop] +item=Zanik, id=8870, option=[null, null, null, null, drop] +item=Crate with zanik, id=8871, option=[null, Wield, null, null, drop] +item=Bone dagger, id=8872, option=[null, Wield, null, null, drop] +item=Bone dagger, id=8873, option=[null, null, null, null, drop] +item=Bone dagger (p), id=8874, option=[null, Wield, null, null, drop] +item=Bone dagger (p), id=8875, option=[null, null, null, null, drop] +item=Bone dagger (p+), id=8876, option=[null, Wield, null, null, drop] +item=Bone dagger (p+), id=8877, option=[null, null, null, null, drop] +item=Bone dagger (p++), id=8878, option=[null, Wield, null, null, drop] +item=Bone dagger (p++), id=8879, option=[null, null, null, null, drop] +item=Dorgeshuun c'bow, id=8880, option=[null, Wield, null, null, drop] +item=Dorgeshuun c'bow, id=8881, option=[null, null, null, null, drop] +item=Bone bolts, id=8882, option=[null, Wield, null, null, drop] +item=null, id=8883, option=[null, null, null, null, drop] +item=null, id=8884, option=[null, null, null, null, drop] +item=null, id=8885, option=[null, null, null, null, drop] +item=null, id=8886, option=[null, null, null, null, drop] +item=Zanik, id=8887, option=[null, null, null, null, drop] +item=Zanik (ham), id=8888, option=[null, null, null, null, drop] +item=Zanik (showdown), id=8889, option=[null, null, null, null, drop] +item=Coins, id=8890, option=[null, null, null, null, drop] +item=null, id=8891, option=[null, null, null, null, drop] +item=null, id=8892, option=[null, null, null, null, drop] +item=null, id=8893, option=[null, null, null, null, drop] +item=null, id=8894, option=[null, null, null, null, drop] +item=null, id=8895, option=[null, null, null, null, drop] +item=null, id=8896, option=[null, null, null, null, drop] +item=null, id=8897, option=[null, null, null, null, drop] +item=null, id=8898, option=[null, null, null, null, drop] +item=null, id=8899, option=[null, null, null, null, drop] +item=Cave horror, id=8900, option=[null, null, null, null, drop] +item=Black mask (10), id=8901, option=[null, Wear, null, null, drop] +item=Black mask (10), id=8902, option=[null, null, null, null, drop] +item=Black mask (9), id=8903, option=[null, Wear, null, null, drop] +item=Black mask (9), id=8904, option=[null, null, null, null, drop] +item=Black mask (8), id=8905, option=[null, Wear, null, null, drop] +item=Black mask (8), id=8906, option=[null, null, null, null, drop] +item=Black mask (7), id=8907, option=[null, Wear, null, null, drop] +item=Black mask (7), id=8908, option=[null, null, null, null, drop] +item=Black mask (6), id=8909, option=[null, Wear, null, null, drop] +item=Black mask (6), id=8910, option=[null, null, null, null, drop] +item=Black mask (5), id=8911, option=[null, Wear, null, null, drop] +item=Black mask (5), id=8912, option=[null, null, null, null, drop] +item=Black mask (4), id=8913, option=[null, Wear, null, null, drop] +item=Black mask (4), id=8914, option=[null, null, null, null, drop] +item=Black mask (3), id=8915, option=[null, Wear, null, null, drop] +item=Black mask (3), id=8916, option=[null, null, null, null, drop] +item=Black mask (2), id=8917, option=[null, Wear, null, null, drop] +item=Black mask (2), id=8918, option=[null, null, null, null, drop] +item=Black mask (1), id=8919, option=[null, Wear, null, null, drop] +item=Black mask (1), id=8920, option=[null, null, null, null, drop] +item=Black mask, id=8921, option=[null, Wear, null, null, drop] +item=Black mask, id=8922, option=[null, null, null, null, drop] +item=Witchwood icon, id=8923, option=[null, Wear, null, null, drop] +item=Bandana eyepatch, id=8924, option=[null, Wear, null, null, drop] +item=Bandana eyepatch, id=8925, option=[null, Wear, null, null, drop] +item=Bandana eyepatch, id=8926, option=[null, Wear, null, null, drop] +item=Bandana eyepatch, id=8927, option=[null, Wear, null, null, drop] +item=Hat eyepatch, id=8928, option=[null, Wear, null, null, drop] +item=Crabclaw hook, id=8929, option=[null, Wear, null, null, drop] +item=Pipe section, id=8930, option=[null, null, null, null, drop] +item=Pipe section, id=8931, option=[null, null, null, null, drop] +item=Lumber patch, id=8932, option=[null, null, null, null, drop] +item=Lumber patch, id=8933, option=[null, null, null, null, drop] +item=Scrapey tree logs, id=8934, option=[null, null, null, null, drop] +item=Scrapey tree logs, id=8935, option=[null, null, null, null, drop] +item=Blue flowers, id=8936, option=[null, null, null, null, drop] +item=Blue flowers, id=8937, option=[null, null, null, null, drop] +item=Red flowers, id=8938, option=[null, null, null, null, drop] +item=Red flowers, id=8939, option=[null, null, null, null, drop] +item=Rum, id=8940, option=[Drink, null, null, null, drop] +item=Rum, id=8941, option=[Drink, null, null, null, drop] +item=Monkey, id=8942, option=[null, null, null, Talk-To, drop] +item=Blue monkey, id=8943, option=[null, null, null, Talk-To, drop] +item=Blue monkey, id=8944, option=[null, null, null, Talk-To, drop] +item=Blue monkey, id=8945, option=[null, null, null, Talk-To, drop] +item=Red monkey, id=8946, option=[null, null, null, Talk-To, drop] +item=Red monkey, id=8947, option=[null, null, null, Talk-To, drop] +item=Red monkey, id=8948, option=[null, null, null, Talk-To, drop] +item=Pirate bandana, id=8949, option=[null, Wear, null, null, drop] +item=Pirate hat, id=8950, option=[null, Wear, null, null, drop] +item=Pieces of eight, id=8951, option=[null, null, null, null, drop] +item=Blue naval shirt, id=8952, option=[null, Wear, null, null, drop] +item=Green naval shirt, id=8953, option=[null, Wear, null, null, drop] +item=Red naval shirt, id=8954, option=[null, Wear, null, null, drop] +item=Brown naval shirt, id=8955, option=[null, Wear, null, null, drop] +item=Black naval shirt, id=8956, option=[null, Wear, null, null, drop] +item=Purple naval shirt, id=8957, option=[null, Wear, null, null, drop] +item=Grey naval shirt, id=8958, option=[null, Wear, null, null, drop] +item=Blue tricorn hat, id=8959, option=[null, Wear, null, null, drop] +item=Green tricorn hat, id=8960, option=[null, Wear, null, null, drop] +item=Red tricorn hat, id=8961, option=[null, Wear, null, null, drop] +item=Brown tricorn hat, id=8962, option=[null, Wear, null, null, drop] +item=Black tricorn hat, id=8963, option=[null, Wear, null, null, drop] +item=Purple tricorn hat, id=8964, option=[null, Wear, null, null, drop] +item=Grey tricorn hat, id=8965, option=[null, Wear, null, null, drop] +item=Cutthroat flag, id=8966, option=[null, Wield, null, null, drop] +item=Guilded smile flag, id=8967, option=[null, Wield, null, null, drop] +item=Bronze fist flag, id=8968, option=[null, Wield, null, null, drop] +item=Lucky shot flag, id=8969, option=[null, Wield, null, null, drop] +item=Treasure flag, id=8970, option=[null, Wield, null, null, drop] +item=Phasmatys flag, id=8971, option=[null, Wield, null, null, drop] +item=Bowl of red water, id=8972, option=[null, null, null, null, drop] +item=Bowl of red water, id=8973, option=[null, null, null, null, drop] +item=Bowl of blue water, id=8974, option=[null, null, null, null, drop] +item=Bowl of blue water, id=8975, option=[null, null, null, null, drop] +item=Bitternut, id=8976, option=[null, null, null, null, drop] +item=Scrapey bark, id=8977, option=[null, null, null, null, drop] +item=Scrapey bark, id=8978, option=[null, null, null, null, drop] +item=Bridge section, id=8979, option=[null, null, null, null, drop] +item=Bridge section, id=8980, option=[null, null, null, null, drop] +item=Sweetgrubs, id=8981, option=[null, null, null, null, drop] +item=Sweetgrubs, id=8982, option=[null, null, null, null, drop] +item=null, id=8983, option=[null, null, null, null, drop] +item=null, id=8984, option=[null, null, null, null, drop] +item=null, id=8985, option=[null, null, null, null, drop] +item=Bucket, id=8986, option=[null, null, null, null, drop] +item=Torch, id=8987, option=[null, null, null, null, drop] +item=The stuff, id=8988, option=[null, null, null, null, drop] +item=Brewin' guide, id=8989, option=[Read, null, null, null, drop] +item=Brewin' guide, id=8990, option=[null, null, null, null, drop] +item=Blue navy slacks, id=8991, option=[null, Wear, null, null, drop] +item=Green navy slacks, id=8992, option=[null, Wear, null, null, drop] +item=Red navy slacks, id=8993, option=[null, Wear, null, null, drop] +item=Brown navy slacks, id=8994, option=[null, Wear, null, null, drop] +item=Black navy slacks, id=8995, option=[null, Wear, null, null, drop] +item=Purple navy slacks, id=8996, option=[null, Wear, null, null, drop] +item=Grey navy slacks, id=8997, option=[null, Wear, null, null, drop] +item=Bandana eyepatch, id=8998, option=[null, null, null, null, drop] +item=Bandana eyepatch, id=8999, option=[null, null, null, null, drop] +item=Bandana eyepatch, id=9000, option=[null, null, null, null, drop] +item=Bandana eyepatch, id=9001, option=[null, null, null, null, drop] +item=Hat eyepatch, id=9002, option=[null, null, null, null, drop] +item=Security book, id=9003, option=[Read, null, null, null, drop] +item=Stronghold notes, id=9004, option=[Read, null, null, null, drop] +item=Fancy boots, id=9005, option=[null, Wear, null, null, Destroy] +item=Fighting boots, id=9006, option=[null, Wear, null, null, Destroy] +item=Right skull half, id=9007, option=[null, null, null, null, drop] +item=Left skull half, id=9008, option=[null, null, null, null, drop] +item=Strange skull, id=9009, option=[null, null, null, null, drop] +item=Top of sceptre, id=9010, option=[null, null, null, null, drop] +item=Bottom of sceptre, id=9011, option=[null, null, null, null, drop] +item=Runed sceptre, id=9012, option=[null, null, null, null, drop] +item=Skull sceptre, id=9013, option=[null, Wield, Invoke, Divine, Destroy] +item=Security book, id=9014, option=[null, null, null, null, drop] +item=Stronghold notes, id=9015, option=[null, null, null, null, drop] +item=Gorak claws, id=9016, option=[null, null, null, null, drop] +item=Star flower, id=9017, option=[null, null, null, null, drop] +item=Gorak claw powder, id=9018, option=[null, null, null, null, drop] +item=Magic essence(unf), id=9019, option=[null, null, null, Empty, drop] +item=Queen's secateurs, id=9020, option=[null, null, null, null, drop] +item=Magic essence(4), id=9021, option=[Drink, null, null, Empty, drop] +item=Magic essence(3), id=9022, option=[Drink, null, null, Empty, drop] +item=Magic essence(2), id=9023, option=[Drink, null, null, Empty, drop] +item=Magic essence(1), id=9024, option=[Drink, null, null, Empty, drop] +item=Nuff's certificate, id=9025, option=[Read, Study, null, null, Destroy] +item=Ivory comb, id=9026, option=[null, null, null, null, drop] +item=Ivory comb, id=9027, option=[null, null, null, null, drop] +item=Golden scarab, id=9028, option=[null, null, null, null, drop] +item=Golden scarab, id=9029, option=[null, null, null, null, drop] +item=Stone scarab, id=9030, option=[null, null, null, null, drop] +item=Stone scarab, id=9031, option=[null, null, null, null, drop] +item=Pottery scarab, id=9032, option=[null, null, null, null, drop] +item=Pottery scarab, id=9033, option=[null, null, null, null, drop] +item=Golden statuette, id=9034, option=[null, null, null, null, drop] +item=Golden statuette, id=9035, option=[null, null, null, null, drop] +item=Pottery statuette, id=9036, option=[null, null, null, null, drop] +item=Pottery statuette, id=9037, option=[null, null, null, null, drop] +item=Stone statuette, id=9038, option=[null, null, null, null, drop] +item=Stone statuette, id=9039, option=[null, null, null, null, drop] +item=Gold seal, id=9040, option=[null, null, null, null, drop] +item=Gold seal, id=9041, option=[null, null, null, null, drop] +item=Stone seal, id=9042, option=[null, null, null, null, drop] +item=Stone seal, id=9043, option=[null, null, null, null, drop] +item=Pharaoh's sceptre, id=9044, option=[Teleport, Wield, null, null, drop] +item=Pharaoh's sceptre, id=9045, option=[null, null, null, null, drop] +item=Pharaoh's sceptre, id=9046, option=[Teleport, Wield, null, null, drop] +item=Pharaoh's sceptre, id=9047, option=[null, null, null, null, drop] +item=Pharaoh's sceptre, id=9048, option=[Teleport, Wield, null, null, drop] +item=Pharaoh's sceptre, id=9049, option=[null, null, null, null, drop] +item=Pharaoh's sceptre, id=9050, option=[Teleport, Wield, null, null, drop] +item=Pharaoh's sceptre, id=9051, option=[null, null, null, null, drop] +item=Locust meat, id=9052, option=[Eat, null, null, null, drop] +item=Locust meat, id=9053, option=[null, null, null, null, drop] +item=Red goblin mail, id=9054, option=[null, Wear, null, null, drop] +item=Black goblin mail, id=9055, option=[null, Wear, null, null, drop] +item=Yellow goblin mail, id=9056, option=[null, Wear, null, null, drop] +item=Green goblin mail, id=9057, option=[null, Wear, null, null, drop] +item=Purple goblin mail, id=9058, option=[null, Wear, null, null, drop] +item=Pink goblin mail, id=9059, option=[null, Wear, null, null, drop] +item=null, id=9060, option=[null, null, null, null, drop] +item=null, id=9061, option=[null, null, null, null, drop] +item=null, id=9062, option=[null, null, null, null, drop] +item=null, id=9063, option=[null, null, null, null, drop] +item=Emerald lantern, id=9064, option=[null, null, null, null, drop] +item=Emerald lantern, id=9065, option=[null, null, Extinguish, null, drop] +item=Emerald lens, id=9066, option=[null, null, null, null, drop] +item=Dream log, id=9067, option=[null, null, null, null, drop] +item=Moonclan helm, id=9068, option=[null, Wear, null, null, drop] +item=Moonclan hat, id=9069, option=[null, Wear, null, null, drop] +item=Moonclan armour, id=9070, option=[null, Wear, null, null, drop] +item=Moonclan skirt, id=9071, option=[null, Wear, null, null, drop] +item=Moonclan gloves, id=9072, option=[null, Wear, null, null, drop] +item=Moonclan boots, id=9073, option=[null, Wear, null, null, drop] +item=Moonclan cape, id=9074, option=[null, Wear, null, null, drop] +item=Astral rune, id=9075, option=[null, null, null, null, drop] +item=Lunar ore, id=9076, option=[null, null, null, null, Destroy] +item=Lunar bar, id=9077, option=[null, null, null, null, Destroy] +item=Moonclan manual, id=9078, option=[Read, null, null, null, drop] +item=Suqah tooth, id=9079, option=[null, null, null, null, drop] +item=Suqah hide, id=9080, option=[null, null, null, null, drop] +item=Suqah leather, id=9081, option=[null, null, null, null, drop] +item=Ground tooth, id=9082, option=[null, null, null, null, drop] +item=Seal of passage, id=9083, option=[null, Wear, null, null, Destroy] +item=Lunar staff, id=9084, option=[null, Wield, null, null, Destroy] +item=Empty vial, id=9085, option=[null, null, null, null, Destroy] +item=Vial of water, id=9086, option=[null, null, null, null, Destroy] +item=Waking sleep vial, id=9087, option=[null, null, null, null, Destroy] +item=Guam vial, id=9088, option=[null, null, null, null, Destroy] +item=Marr vial, id=9089, option=[null, null, null, null, Destroy] +item=Guam-marr vial, id=9090, option=[null, null, null, null, Destroy] +item=Lunar staff - pt1, id=9091, option=[null, Wield, null, null, Destroy] +item=Lunar staff - pt2, id=9092, option=[null, Wield, null, null, Destroy] +item=Lunar staff - pt3, id=9093, option=[null, Wield, null, null, Destroy] +item=Kindling, id=9094, option=[null, null, null, null, drop] +item=Soaked kindling, id=9095, option=[null, null, null, null, drop] +item=Lunar helm, id=9096, option=[null, Wear, null, null, Destroy] +item=Lunar torso, id=9097, option=[null, Wear, null, null, Destroy] +item=Lunar legs, id=9098, option=[null, Wear, null, null, Destroy] +item=Lunar gloves, id=9099, option=[null, Wear, null, null, Destroy] +item=Lunar boots, id=9100, option=[null, Wear, null, null, Destroy] +item=Lunar cape, id=9101, option=[null, Wear, null, null, Destroy] +item=Lunar amulet, id=9102, option=[null, Wear, null, null, Destroy] +item=A special tiara, id=9103, option=[null, null, null, null, Destroy] +item=Lunar ring, id=9104, option=[null, Wear, null, null, Destroy] +item=Suqah monster, id=9105, option=[null, null, null, null, drop] +item=Astral tiara, id=9106, option=[null, Wear, null, null, drop] +item=null, id=9107, option=[null, null, null, null, drop] +item=null, id=9108, option=[null, null, null, null, drop] +item=null, id=9109, option=[null, null, null, null, drop] +item=null, id=9110, option=[null, null, null, null, drop] +item=null, id=9111, option=[null, null, null, null, drop] +item=null, id=9112, option=[null, null, null, null, drop] +item=null, id=9113, option=[null, null, null, null, drop] +item=null, id=9114, option=[null, null, null, null, drop] +item=null, id=9115, option=[null, null, null, null, drop] +item=null, id=9116, option=[null, null, null, null, drop] +item=null, id=9117, option=[null, null, null, null, drop] +item=null, id=9118, option=[null, null, null, null, drop] +item=null, id=9119, option=[null, null, null, null, drop] +item=null, id=9120, option=[null, null, null, null, drop] +item=null, id=9121, option=[null, null, null, null, drop] +item=null, id=9122, option=[null, null, null, null, drop] +item=null, id=9123, option=[null, null, null, null, drop] +item=null, id=9124, option=[null, null, null, null, drop] +item=null, id=9125, option=[null, null, null, null, drop] +item=null, id=9126, option=[null, null, null, null, drop] +item=null, id=9127, option=[null, null, null, null, drop] +item=null, id=9128, option=[null, null, null, null, drop] +item=null, id=9129, option=[null, null, null, null, drop] +item=null, id=9130, option=[null, null, null, null, drop] +item=null, id=9131, option=[null, null, null, null, drop] +item=null, id=9132, option=[null, null, null, null, drop] +item=null, id=9133, option=[null, null, null, null, drop] +item=null, id=9134, option=[null, null, null, null, drop] +item=null, id=9135, option=[null, null, null, null, drop] +item=null, id=9136, option=[null, null, null, null, drop] +item=null, id=9137, option=[null, null, null, null, drop] +item=null, id=9138, option=[null, null, null, null, drop] +item=Blurite bolts, id=9139, option=[null, Wield, null, null, drop] +item=Iron bolts, id=9140, option=[null, Wield, null, null, drop] +item=Steel bolts, id=9141, option=[null, Wield, null, null, drop] +item=Mithril bolts, id=9142, option=[null, Wield, null, null, drop] +item=Adamant bolts, id=9143, option=[null, Wield, null, null, drop] +item=Runite bolts, id=9144, option=[null, Wield, null, null, drop] +item=Silver bolts, id=9145, option=[null, Wield, null, null, drop] +item=null, id=9146, option=[null, null, null, null, drop] +item=null, id=9147, option=[null, null, null, null, drop] +item=null, id=9148, option=[null, null, null, null, drop] +item=null, id=9149, option=[null, null, null, null, drop] +item=null, id=9150, option=[null, null, null, null, drop] +item=null, id=9151, option=[null, null, null, null, drop] +item=null, id=9152, option=[null, null, null, null, drop] +item=null, id=9153, option=[null, null, null, null, drop] +item=null, id=9154, option=[null, null, null, null, drop] +item=null, id=9155, option=[null, null, null, null, drop] +item=null, id=9156, option=[null, null, null, null, drop] +item=null, id=9157, option=[null, null, null, null, drop] +item=null, id=9158, option=[null, null, null, null, drop] +item=null, id=9159, option=[null, null, null, null, drop] +item=null, id=9160, option=[null, null, null, null, drop] +item=null, id=9161, option=[null, null, null, null, drop] +item=null, id=9162, option=[null, null, null, null, drop] +item=null, id=9163, option=[null, null, null, null, drop] +item=null, id=9164, option=[null, null, null, null, drop] +item=null, id=9165, option=[null, null, null, null, drop] +item=null, id=9166, option=[null, null, null, null, drop] +item=null, id=9167, option=[null, null, null, null, drop] +item=null, id=9168, option=[null, null, null, null, drop] +item=null, id=9169, option=[null, null, null, null, drop] +item=null, id=9170, option=[null, null, null, null, drop] +item=null, id=9171, option=[null, null, null, null, drop] +item=null, id=9172, option=[null, null, null, null, drop] +item=null, id=9173, option=[null, null, null, null, drop] +item=Bronze c'bow, id=9174, option=[null, Wield, null, null, drop] +item=Bronze c'bow, id=9175, option=[null, null, null, null, drop] +item=Blurite c'bow, id=9176, option=[null, Wield, null, null, drop] +item=Iron c'bow, id=9177, option=[null, Wield, null, null, drop] +item=Iron c'bow, id=9178, option=[null, null, null, null, drop] +item=Steel c'bow, id=9179, option=[null, Wield, null, null, drop] +item=Steel c'bow, id=9180, option=[null, null, null, null, drop] +item=Mith c'bow, id=9181, option=[null, Wield, null, null, drop] +item=Mith c'bow, id=9182, option=[null, null, null, null, drop] +item=Adamant c'bow, id=9183, option=[null, Wield, null, null, drop] +item=Adamant c'bow, id=9184, option=[null, null, null, null, drop] +item=Rune c'bow, id=9185, option=[null, Wield, null, null, drop] +item=Rune c'bow, id=9186, option=[null, null, null, null, drop] +item=Jade bolt tips, id=9187, option=[null, null, null, null, drop] +item=Topaz bolt tips, id=9188, option=[null, null, null, null, drop] +item=Sapphire bolt tips, id=9189, option=[null, null, null, null, drop] +item=Emerald bolt tips, id=9190, option=[null, null, null, null, drop] +item=Ruby bolt tips, id=9191, option=[null, null, null, null, drop] +item=Diamond bolt tips, id=9192, option=[null, null, null, null, drop] +item=Dragon bolt tips, id=9193, option=[null, null, null, null, drop] +item=Onyx bolt tips, id=9194, option=[null, null, null, null, drop] +item=null, id=9195, option=[null, null, null, null, drop] +item=null, id=9196, option=[null, null, null, null, drop] +item=null, id=9197, option=[null, null, null, null, drop] +item=null, id=9198, option=[null, null, null, null, drop] +item=null, id=9199, option=[null, null, null, null, drop] +item=null, id=9200, option=[null, null, null, null, drop] +item=null, id=9201, option=[null, null, null, null, drop] +item=null, id=9202, option=[null, null, null, null, drop] +item=null, id=9203, option=[null, null, null, null, drop] +item=null, id=9204, option=[null, null, null, null, drop] +item=null, id=9205, option=[null, null, null, null, drop] +item=null, id=9206, option=[null, null, null, null, drop] +item=null, id=9207, option=[null, null, null, null, drop] +item=null, id=9208, option=[null, null, null, null, drop] +item=null, id=9209, option=[null, null, null, null, drop] +item=null, id=9210, option=[null, null, null, null, drop] +item=null, id=9211, option=[null, null, null, null, drop] +item=null, id=9212, option=[null, null, null, null, drop] +item=null, id=9213, option=[null, null, null, null, drop] +item=null, id=9214, option=[null, null, null, null, drop] +item=null, id=9215, option=[null, null, null, null, drop] +item=null, id=9216, option=[null, null, null, null, drop] +item=null, id=9217, option=[null, null, null, null, drop] +item=null, id=9218, option=[null, null, null, null, drop] +item=null, id=9219, option=[null, null, null, null, drop] +item=null, id=9220, option=[null, null, null, null, drop] +item=null, id=9221, option=[null, null, null, null, drop] +item=null, id=9222, option=[null, null, null, null, drop] +item=null, id=9223, option=[null, null, null, null, drop] +item=null, id=9224, option=[null, null, null, null, drop] +item=null, id=9225, option=[null, null, null, null, drop] +item=null, id=9226, option=[null, null, null, null, drop] +item=null, id=9227, option=[null, null, null, null, drop] +item=null, id=9228, option=[null, null, null, null, drop] +item=null, id=9229, option=[null, null, null, null, drop] +item=null, id=9230, option=[null, null, null, null, drop] +item=null, id=9231, option=[null, null, null, null, drop] +item=null, id=9232, option=[null, null, null, null, drop] +item=null, id=9233, option=[null, null, null, null, drop] +item=null, id=9234, option=[null, null, null, null, drop] +item=null, id=9235, option=[null, null, null, null, drop] +item=Opal bolts (e), id=9236, option=[null, Wield, null, null, drop] +item=Jade bolts (e), id=9237, option=[null, Wield, null, null, drop] +item=Pearl bolts (e), id=9238, option=[null, Wield, null, null, drop] +item=Topaz bolts (e), id=9239, option=[null, Wield, null, null, drop] +item=Sapphire bolts (e), id=9240, option=[null, Wield, null, null, drop] +item=Emerald bolts (e), id=9241, option=[null, Wield, null, null, drop] +item=Ruby bolts (e), id=9242, option=[null, Wield, null, null, drop] +item=Diamond bolts (e), id=9243, option=[null, Wield, null, null, drop] +item=Dragon bolts (e), id=9244, option=[null, Wield, null, null, drop] +item=Onyx bolts (e), id=9245, option=[null, Wield, null, null, drop] +item=null, id=9246, option=[null, null, null, null, drop] +item=null, id=9247, option=[null, null, null, null, drop] +item=null, id=9248, option=[null, null, null, null, drop] +item=null, id=9249, option=[null, null, null, null, drop] +item=null, id=9250, option=[null, null, null, null, drop] +item=null, id=9251, option=[null, null, null, null, drop] +item=null, id=9252, option=[null, null, null, null, drop] +item=null, id=9253, option=[null, null, null, null, drop] +item=null, id=9254, option=[null, null, null, null, drop] +item=null, id=9255, option=[null, null, null, null, drop] +item=null, id=9256, option=[null, null, null, null, drop] +item=null, id=9257, option=[null, null, null, null, drop] +item=null, id=9258, option=[null, null, null, null, drop] +item=null, id=9259, option=[null, null, null, null, drop] +item=null, id=9260, option=[null, null, null, null, drop] +item=null, id=9261, option=[null, null, null, null, drop] +item=null, id=9262, option=[null, null, null, null, drop] +item=null, id=9263, option=[null, null, null, null, drop] +item=null, id=9264, option=[null, null, null, null, drop] +item=null, id=9265, option=[null, null, null, null, drop] +item=null, id=9266, option=[null, null, null, null, drop] +item=null, id=9267, option=[null, null, null, null, drop] +item=null, id=9268, option=[null, null, null, null, drop] +item=null, id=9269, option=[null, null, null, null, drop] +item=null, id=9270, option=[null, null, null, null, drop] +item=null, id=9271, option=[null, null, null, null, drop] +item=null, id=9272, option=[null, null, null, null, drop] +item=null, id=9273, option=[null, null, null, null, drop] +item=null, id=9274, option=[null, null, null, null, drop] +item=null, id=9275, option=[null, null, null, null, drop] +item=null, id=9276, option=[null, null, null, null, drop] +item=null, id=9277, option=[null, null, null, null, drop] +item=null, id=9278, option=[null, null, null, null, drop] +item=null, id=9279, option=[null, null, null, null, drop] +item=null, id=9280, option=[null, null, null, null, drop] +item=null, id=9281, option=[null, null, null, null, drop] +item=null, id=9282, option=[null, null, null, null, drop] +item=null, id=9283, option=[null, null, null, null, drop] +item=null, id=9284, option=[null, null, null, null, drop] +item=null, id=9285, option=[null, null, null, null, drop] +item=Blurite bolts(p), id=9286, option=[null, Wield, null, null, drop] +item=Iron bolts (p), id=9287, option=[null, Wield, null, null, drop] +item=Steel bolts (p), id=9288, option=[null, Wield, null, null, drop] +item=Mithril bolts (p), id=9289, option=[null, Wield, null, null, drop] +item=Addy bolts (p), id=9290, option=[null, Wield, null, null, drop] +item=Runite bolts (p), id=9291, option=[null, Wield, null, null, drop] +item=Silver bolts (p), id=9292, option=[null, Wield, null, null, drop] +item=Blurite bolts(p+), id=9293, option=[null, Wield, null, null, drop] +item=Iron bolts(p+), id=9294, option=[null, Wield, null, null, drop] +item=Steel bolts(p+), id=9295, option=[null, Wield, null, null, drop] +item=Mithril bolts(p+), id=9296, option=[null, Wield, null, null, drop] +item=Addy bolts(p+), id=9297, option=[null, Wield, null, null, drop] +item=Runite bolts(p+), id=9298, option=[null, Wield, null, null, drop] +item=Silver bolts(p+), id=9299, option=[null, Wield, null, null, drop] +item=Blurite bolts(p++), id=9300, option=[null, Wield, null, null, drop] +item=Iron bolts(p++), id=9301, option=[null, Wield, null, null, drop] +item=Steel bolts(p++), id=9302, option=[null, Wield, null, null, drop] +item=Mithril bolts(p++), id=9303, option=[null, Wield, null, null, drop] +item=Addy bolts(p++), id=9304, option=[null, Wield, null, null, drop] +item=Runite bolts(p++), id=9305, option=[null, Wield, null, null, drop] +item=Silver bolts(p++), id=9306, option=[null, Wield, null, null, drop] +item=null, id=9307, option=[null, null, null, null, drop] +item=null, id=9308, option=[null, null, null, null, drop] +item=null, id=9309, option=[null, null, null, null, drop] +item=null, id=9310, option=[null, null, null, null, drop] +item=null, id=9311, option=[null, null, null, null, drop] +item=null, id=9312, option=[null, null, null, null, drop] +item=null, id=9313, option=[null, null, null, null, drop] +item=null, id=9314, option=[null, null, null, null, drop] +item=null, id=9315, option=[null, null, null, null, drop] +item=null, id=9316, option=[null, null, null, null, drop] +item=null, id=9317, option=[null, null, null, null, drop] +item=null, id=9318, option=[null, null, null, null, drop] +item=null, id=9319, option=[null, null, null, null, drop] +item=null, id=9320, option=[null, null, null, null, drop] +item=null, id=9321, option=[null, null, null, null, drop] +item=null, id=9322, option=[null, null, null, null, drop] +item=null, id=9323, option=[null, null, null, null, drop] +item=null, id=9324, option=[null, null, null, null, drop] +item=null, id=9325, option=[null, null, null, null, drop] +item=null, id=9326, option=[null, null, null, null, drop] +item=null, id=9327, option=[null, null, null, null, drop] +item=null, id=9328, option=[null, null, null, null, drop] +item=null, id=9329, option=[null, null, null, null, drop] +item=null, id=9330, option=[null, null, null, null, drop] +item=null, id=9331, option=[null, null, null, null, drop] +item=null, id=9332, option=[null, null, null, null, drop] +item=null, id=9333, option=[null, null, null, null, drop] +item=null, id=9334, option=[null, null, null, null, drop] +item=Jade bolts, id=9335, option=[null, Wield, null, null, drop] +item=Topaz bolts, id=9336, option=[null, Wield, null, null, drop] +item=Sapphire bolts, id=9337, option=[null, Wield, null, null, drop] +item=Emerald bolts, id=9338, option=[null, Wield, null, null, drop] +item=Ruby bolts, id=9339, option=[null, Wield, null, null, drop] +item=Diamond bolts, id=9340, option=[null, Wield, null, null, drop] +item=Dragon bolts, id=9341, option=[null, Wield, null, null, drop] +item=Onyx bolts, id=9342, option=[null, Wield, null, null, drop] +item=null, id=9343, option=[null, null, null, null, drop] +item=null, id=9344, option=[null, null, null, null, drop] +item=null, id=9345, option=[null, null, null, null, drop] +item=null, id=9346, option=[null, null, null, null, drop] +item=null, id=9347, option=[null, null, null, null, drop] +item=null, id=9348, option=[null, null, null, null, drop] +item=null, id=9349, option=[null, null, null, null, drop] +item=null, id=9350, option=[null, null, null, null, drop] +item=null, id=9351, option=[null, null, null, null, drop] +item=null, id=9352, option=[null, null, null, null, drop] +item=null, id=9353, option=[null, null, null, null, drop] +item=null, id=9354, option=[null, null, null, null, drop] +item=null, id=9355, option=[null, null, null, null, drop] +item=null, id=9356, option=[null, null, null, null, drop] +item=null, id=9357, option=[null, null, null, null, drop] +item=null, id=9358, option=[null, null, null, null, drop] +item=null, id=9359, option=[null, null, null, null, drop] +item=null, id=9360, option=[null, null, null, null, drop] +item=null, id=9361, option=[null, null, null, null, drop] +item=null, id=9362, option=[null, null, null, null, drop] +item=null, id=9363, option=[null, null, null, null, drop] +item=null, id=9364, option=[null, null, null, null, drop] +item=null, id=9365, option=[null, null, null, null, drop] +item=null, id=9366, option=[null, null, null, null, drop] +item=null, id=9367, option=[null, null, null, null, drop] +item=null, id=9368, option=[null, null, null, null, drop] +item=null, id=9369, option=[null, null, null, null, drop] +item=null, id=9370, option=[null, null, null, null, drop] +item=null, id=9371, option=[null, null, null, null, drop] +item=null, id=9372, option=[null, null, null, null, drop] +item=null, id=9373, option=[null, null, null, null, drop] +item=null, id=9374, option=[null, null, null, null, drop] +item=Bronze bolts (unf), id=9375, option=[null, null, null, null, drop] +item=Blurite bolts (unf), id=9376, option=[null, null, null, null, drop] +item=Iron bolts (unf), id=9377, option=[null, null, null, null, drop] +item=Steel bolts (unf), id=9378, option=[null, null, null, null, drop] +item=Mithril bolts (unf), id=9379, option=[null, null, null, null, drop] +item=Adamant bolts(unf), id=9380, option=[null, null, null, null, drop] +item=Runite bolts (unf), id=9381, option=[null, null, null, null, drop] +item=Silver bolts (unf), id=9382, option=[null, null, null, null, drop] +item=null, id=9383, option=[null, null, null, null, drop] +item=null, id=9384, option=[null, null, null, null, drop] +item=null, id=9385, option=[null, null, null, null, drop] +item=null, id=9386, option=[null, null, null, null, drop] +item=null, id=9387, option=[null, null, null, null, drop] +item=null, id=9388, option=[null, null, null, null, drop] +item=null, id=9389, option=[null, null, null, null, drop] +item=null, id=9390, option=[null, null, null, null, drop] +item=null, id=9391, option=[null, null, null, null, drop] +item=null, id=9392, option=[null, null, null, null, drop] +item=null, id=9393, option=[null, null, null, null, drop] +item=null, id=9394, option=[null, null, null, null, drop] +item=null, id=9395, option=[null, null, null, null, drop] +item=null, id=9396, option=[null, null, null, null, drop] +item=null, id=9397, option=[null, null, null, null, drop] +item=null, id=9398, option=[null, null, null, null, drop] +item=null, id=9399, option=[null, null, null, null, drop] +item=null, id=9400, option=[null, null, null, null, drop] +item=null, id=9401, option=[null, null, null, null, drop] +item=null, id=9402, option=[null, null, null, null, drop] +item=null, id=9403, option=[null, null, null, null, drop] +item=null, id=9404, option=[null, null, null, null, drop] +item=null, id=9405, option=[null, null, null, null, drop] +item=null, id=9406, option=[null, null, null, null, drop] +item=null, id=9407, option=[null, null, null, null, drop] +item=null, id=9408, option=[null, null, null, null, drop] +item=null, id=9409, option=[null, null, null, null, drop] +item=null, id=9410, option=[null, null, null, null, drop] +item=null, id=9411, option=[null, null, null, null, drop] +item=null, id=9412, option=[null, null, null, null, drop] +item=null, id=9413, option=[null, null, null, null, drop] +item=null, id=9414, option=[null, null, null, null, drop] +item=Grapple, id=9415, option=[null, null, null, null, drop] +item=Mith grapple tip, id=9416, option=[null, null, null, null, drop] +item=Mith grapple tip, id=9417, option=[null, null, null, null, drop] +item=Mith grapple, id=9418, option=[null, null, null, null, drop] +item=Mith grapple, id=9419, option=[null, Wield, null, null, drop] +item=Bronze limbs, id=9420, option=[null, null, null, null, drop] +item=Bronze limbs, id=9421, option=[null, null, null, null, drop] +item=Blurite limbs, id=9422, option=[null, null, null, null, drop] +item=Iron limbs, id=9423, option=[null, null, null, null, drop] +item=Iron limbs, id=9424, option=[null, null, null, null, drop] +item=Steel limbs, id=9425, option=[null, null, null, null, drop] +item=Steel limbs, id=9426, option=[null, null, null, null, drop] +item=Mithril limbs, id=9427, option=[null, null, null, null, drop] +item=Mithril limbs, id=9428, option=[null, null, null, null, drop] +item=Adamantite limbs, id=9429, option=[null, null, null, null, drop] +item=Adamantite limbs, id=9430, option=[null, null, null, null, drop] +item=Runite limbs, id=9431, option=[null, null, null, null, drop] +item=Runite limbs, id=9432, option=[null, null, null, null, drop] +item=Bolt pouch, id=9433, option=[Open, null, null, null, Destroy] +item=Bolt mould, id=9434, option=[null, null, null, null, drop] +item=Bolt mould, id=9435, option=[null, null, null, null, drop] +item=Sinew, id=9436, option=[null, null, null, null, drop] +item=Sinew, id=9437, option=[null, null, null, null, drop] +item=Crossbow string, id=9438, option=[null, null, null, null, drop] +item=Crossbow string, id=9439, option=[null, null, null, null, drop] +item=Wooden stock, id=9440, option=[null, null, null, null, drop] +item=Wooden stock, id=9441, option=[null, null, null, null, drop] +item=Oak stock, id=9442, option=[null, null, null, null, drop] +item=Oak stock, id=9443, option=[null, null, null, null, drop] +item=Willow stock, id=9444, option=[null, null, null, null, drop] +item=Willow stock, id=9445, option=[null, null, null, null, drop] +item=Teak stock, id=9446, option=[null, null, null, null, drop] +item=Teak stock, id=9447, option=[null, null, null, null, drop] +item=Maple stock, id=9448, option=[null, null, null, null, drop] +item=Maple stock, id=9449, option=[null, null, null, null, drop] +item=Mahogany stock, id=9450, option=[null, null, null, null, drop] +item=Mahogany stock, id=9451, option=[null, null, null, null, drop] +item=Yew stock, id=9452, option=[null, null, null, null, drop] +item=Yew stock, id=9453, option=[null, null, null, null, drop] +item=Bronze c'bow (u), id=9454, option=[null, null, null, null, drop] +item=Bronze c'bow (u), id=9455, option=[null, null, null, null, drop] +item=Blurite c'bow (u), id=9456, option=[null, null, null, null, drop] +item=Iron c'bow (u), id=9457, option=[null, null, null, null, drop] +item=Iron c'bow (u), id=9458, option=[null, null, null, null, drop] +item=Steel c'bow (u), id=9459, option=[null, null, null, null, drop] +item=Steel c'bow (u), id=9460, option=[null, null, null, null, drop] +item=Mithril c'bow (u), id=9461, option=[null, null, null, null, drop] +item=Mithril c'bow (u), id=9462, option=[null, null, null, null, drop] +item=Adamant c'bow (u), id=9463, option=[null, null, null, null, drop] +item=Adamant c'bow (u), id=9464, option=[null, null, null, null, drop] +item=Runite c'bow (u), id=9465, option=[null, null, null, null, drop] +item=Runite c'bow (u), id=9466, option=[null, null, null, null, drop] +item=Blurite bar, id=9467, option=[null, null, null, null, drop] +item=Sawdust, id=9468, option=[null, null, null, null, drop] +item=Grand seed pod, id=9469, option=[Launch, null, Squash, null, drop] +item=Gnome scarf, id=9470, option=[null, Wear, null, null, drop] +item=Gnome scarf, id=9471, option=[null, null, null, null, drop] +item=Gnome goggles, id=9472, option=[null, Wear, null, null, drop] +item=Gnome goggles, id=9473, option=[null, null, null, null, drop] +item=Reward token, id=9474, option=[Check, null, Activate, null, Destroy] +item=Mint cake, id=9475, option=[Eat, null, null, null, drop] +item=Mint cake, id=9476, option=[null, null, null, null, drop] +item=Aluft aloft box, id=9477, option=[Check, null, null, null, drop] +item=Half made batta, id=9478, option=[null, null, null, null, drop] +item=Unfinished batta, id=9479, option=[null, null, null, null, drop] +item=Half made batta, id=9480, option=[null, null, null, null, drop] +item=Unfinished batta, id=9481, option=[null, null, null, null, drop] +item=Half made batta, id=9482, option=[null, null, null, null, drop] +item=Half made batta, id=9483, option=[null, null, null, null, drop] +item=Unfinished batta, id=9484, option=[null, null, null, null, drop] +item=Half made batta, id=9485, option=[null, null, null, null, drop] +item=Unfinished batta, id=9486, option=[null, null, null, null, drop] +item=Wizard blizzard, id=9487, option=[null, null, null, null, drop] +item=Wizard blizzard, id=9488, option=[null, null, null, null, drop] +item=Wizard blizzard, id=9489, option=[null, null, null, null, drop] +item=Cheat, id=9490, option=[null, null, null, null, drop] +item=null, id=9491, option=[null, null, null, null, drop] +item=null, id=9492, option=[null, null, null, null, drop] +item=null, id=9493, option=[null, null, null, null, drop] +item=null, id=9494, option=[null, null, null, null, drop] +item=null, id=9495, option=[null, null, null, null, drop] +item=null, id=9496, option=[null, null, null, null, drop] +item=null, id=9497, option=[null, null, null, null, drop] +item=null, id=9498, option=[null, null, null, null, drop] +item=null, id=9499, option=[null, null, null, null, drop] +item=null, id=9500, option=[null, null, null, null, drop] +item=null, id=9501, option=[null, null, null, null, drop] +item=null, id=9502, option=[null, null, null, null, drop] +item=null, id=9503, option=[null, null, null, null, drop] +item=null, id=9504, option=[null, null, null, null, drop] +item=null, id=9505, option=[null, null, null, null, drop] +item=null, id=9506, option=[null, null, null, null, drop] +item=null, id=9507, option=[null, null, null, null, drop] +item=Wizard blizzard, id=9508, option=[Drink, Empty, null, null, drop] +item=Wizard blizzard, id=9509, option=[null, null, null, null, drop] +item=Short green guy, id=9510, option=[Drink, Empty, null, null, drop] +item=Short green guy, id=9511, option=[null, null, null, null, drop] +item=Pineapple punch, id=9512, option=[Drink, Empty, null, null, drop] +item=Pineapple punch, id=9513, option=[null, null, null, null, drop] +item=Fruit blast, id=9514, option=[Drink, Empty, null, null, drop] +item=Fruit blast, id=9515, option=[null, null, null, null, drop] +item=Drunk dragon, id=9516, option=[Drink, Empty, null, null, drop] +item=Drunk dragon, id=9517, option=[null, null, null, null, drop] +item=Choc saturday, id=9518, option=[Drink, Empty, null, null, drop] +item=Choc saturday, id=9519, option=[null, null, null, null, drop] +item=Blurberry special, id=9520, option=[Drink, Empty, null, null, drop] +item=Blurberry special, id=9521, option=[null, null, null, null, drop] +item=Batta tin, id=9522, option=[null, null, null, null, drop] +item=Batta tin, id=9523, option=[null, null, null, null, drop] +item=Batta tin, id=9524, option=[null, null, null, null, drop] +item=Batta tin, id=9525, option=[null, null, null, null, drop] +item=null, id=9526, option=[null, null, null, null, drop] +item=Fruit batta, id=9527, option=[Eat, null, null, null, drop] +item=Fruit batta, id=9528, option=[null, null, null, null, drop] +item=Toad batta, id=9529, option=[Eat, null, null, null, drop] +item=Toad batta, id=9530, option=[null, null, null, null, drop] +item=Worm batta, id=9531, option=[Eat, null, null, null, drop] +item=Worm batta, id=9532, option=[null, null, null, null, drop] +item=Vegetable batta, id=9533, option=[Eat, null, null, null, drop] +item=Vegetable batta, id=9534, option=[null, null, null, null, drop] +item=Cheese+tom batta, id=9535, option=[Eat, null, null, null, drop] +item=Cheese+tom batta, id=9536, option=[null, null, null, null, drop] +item=null, id=9537, option=[null, null, null, null, drop] +item=Toad crunchies, id=9538, option=[Eat, null, null, null, drop] +item=Toad crunchies, id=9539, option=[null, null, null, null, drop] +item=Spicy crunchies, id=9540, option=[Eat, null, null, null, drop] +item=Spicy crunchies, id=9541, option=[null, null, null, null, drop] +item=Worm crunchies, id=9542, option=[Eat, null, null, null, drop] +item=Worm crunchies, id=9543, option=[null, null, null, null, drop] +item=Chocchip crunchies, id=9544, option=[Eat, null, null, null, drop] +item=Chocchip crunchies, id=9545, option=[null, null, null, null, drop] +item=null, id=9546, option=[null, null, null, null, drop] +item=Worm hole, id=9547, option=[Eat, null, null, null, drop] +item=Worm hole, id=9548, option=[null, null, null, null, drop] +item=Veg ball, id=9549, option=[Eat, null, null, null, drop] +item=Veg ball, id=9550, option=[null, null, null, null, drop] +item=Tangled toads' legs, id=9551, option=[Eat, null, null, null, drop] +item=Tangled toads' legs, id=9552, option=[null, null, null, null, drop] +item=Chocolate bomb, id=9553, option=[Eat, null, null, null, drop] +item=Chocolate bomb, id=9554, option=[null, null, null, null, drop] +item=null, id=9555, option=[null, null, null, null, drop] +item=null, id=9556, option=[null, null, null, null, drop] +item=null, id=9557, option=[null, null, null, null, drop] +item=Half made bowl, id=9558, option=[null, null, null, null, drop] +item=Half made bowl, id=9559, option=[null, null, null, null, drop] +item=Unfinished bowl, id=9560, option=[null, null, null, null, drop] +item=Half made bowl, id=9561, option=[null, null, null, null, drop] +item=Unfinished bowl, id=9562, option=[null, null, null, null, drop] +item=Half made bowl, id=9563, option=[null, null, null, null, drop] +item=Unfinished bowl, id=9564, option=[null, null, null, null, drop] +item=Cocktail shaker, id=9565, option=[null, null, null, null, drop] +item=Mixed blizzard, id=9566, option=[Pour, null, null, null, drop] +item=Mixed sgg, id=9567, option=[Pour, null, null, null, drop] +item=Mixed blast, id=9568, option=[Pour, null, null, null, drop] +item=Mixed punch, id=9569, option=[Pour, null, null, null, drop] +item=Mixed blurberry special, id=9570, option=[Pour, null, null, null, drop] +item=Mixed saturday, id=9571, option=[Pour, null, null, null, drop] +item=Mixed saturday, id=9572, option=[null, null, null, null, drop] +item=Mixed saturday, id=9573, option=[Add-ingreds, null, null, null, drop] +item=Mixed dragon, id=9574, option=[Pour, null, null, null, drop] +item=Mixed dragon, id=9575, option=[Add-ingreds, null, null, null, drop] +item=Mixed dragon, id=9576, option=[null, null, null, null, drop] +item=Half made crunchy, id=9577, option=[null, null, null, null, drop] +item=Unfinished crunchy, id=9578, option=[null, null, null, null, drop] +item=Half made crunchy, id=9579, option=[null, null, null, null, drop] +item=Unfinished crunchy, id=9580, option=[null, null, null, null, drop] +item=Half made crunchy, id=9581, option=[null, null, null, null, drop] +item=Unfinished crunchy, id=9582, option=[null, null, null, null, drop] +item=Half made crunchy, id=9583, option=[null, null, null, null, drop] +item=Unfinished crunchy, id=9584, option=[null, null, null, null, drop] +item=Batta tin, id=9585, option=[null, null, null, null, drop] +item=Crunchy tray, id=9586, option=[null, null, null, null, drop] +item=Gnomebowl mould, id=9587, option=[null, null, null, null, drop] +item=Raw crunchies, id=9588, option=[null, null, null, null, drop] +item=Dossier, id=9589, option=[Read, null, null, null, Destroy] +item=Dossier, id=9590, option=[null, null, null, null, drop] +item=Broken cauldron, id=9591, option=[null, null, null, null, drop] +item=Magic glue, id=9592, option=[null, null, null, Empty, drop] +item=Weird gloop, id=9593, option=[null, null, null, Empty, drop] +item=Ground mud runes, id=9594, option=[null, null, null, null, drop] +item=Hazelmere's book, id=9595, option=[Read, null, null, null, drop] +item=Eyeglo null, id=9596, option=[null, null, null, null, drop] +item=Red circle, id=9597, option=[null, null, null, null, drop] +item=Red triangle, id=9598, option=[null, null, null, null, drop] +item=Red square, id=9599, option=[null, null, null, null, drop] +item=Red pentagon, id=9600, option=[null, null, null, null, drop] +item=Orange circle, id=9601, option=[null, null, null, null, drop] +item=Orange triangle, id=9602, option=[null, null, null, null, drop] +item=Orange square, id=9603, option=[null, null, null, null, drop] +item=Orange pentagon, id=9604, option=[null, null, null, null, drop] +item=Yellow circle, id=9605, option=[null, null, null, null, drop] +item=Yellow triangle, id=9606, option=[null, null, null, null, drop] +item=Yellow square, id=9607, option=[null, null, null, null, drop] +item=Yellow pentagon, id=9608, option=[null, null, null, null, drop] +item=Green circle, id=9609, option=[null, null, null, null, drop] +item=Green triangle, id=9610, option=[null, null, null, null, drop] +item=Green square, id=9611, option=[null, null, null, null, drop] +item=Green pentagon, id=9612, option=[null, null, null, null, drop] +item=Blue circle, id=9613, option=[null, null, null, null, drop] +item=Blue triangle, id=9614, option=[null, null, null, null, drop] +item=Blue square, id=9615, option=[null, null, null, null, drop] +item=Blue pentagon, id=9616, option=[null, null, null, null, drop] +item=Indigo circle, id=9617, option=[null, null, null, null, drop] +item=Indigo triangle, id=9618, option=[null, null, null, null, drop] +item=Indigo square, id=9619, option=[null, null, null, null, drop] +item=Indigo pentagon, id=9620, option=[null, null, null, null, drop] +item=Violet circle, id=9621, option=[null, null, null, null, drop] +item=Violet triangle, id=9622, option=[null, null, null, null, drop] +item=Violet square, id=9623, option=[null, null, null, null, drop] +item=Violet pentagon, id=9624, option=[null, null, null, null, drop] +item=Crystal saw, id=9625, option=[null, null, null, Check-charges, Destroy] +item=Small crystal seed, id=9626, option=[null, null, null, null, Destroy] +item=A handwritten book, id=9627, option=[Read, null, null, null, drop] +item=null, id=9628, option=[null, null, null, null, drop] +item=Tyras helm, id=9629, option=[null, Wear, null, null, drop] +item=Tyras helm, id=9630, option=[null, null, null, null, drop] +item=null, id=9631, option=[null, null, null, null, drop] +item=Daeyalt ore, id=9632, option=[null, null, null, null, drop] +item=Message, id=9633, option=[Read, null, null, null, Destroy] +item=Vyrewatch top, id=9634, option=[null, Wear, null, null, drop] +item=Vyrewatch top, id=9635, option=[null, null, null, null, drop] +item=Vyrewatch legs, id=9636, option=[null, Wear, null, null, drop] +item=Vyrewatch legs, id=9637, option=[null, null, null, null, drop] +item=Vyrewatch shoes, id=9638, option=[null, Wear, null, null, drop] +item=Vyrewatch shoes, id=9639, option=[null, null, null, null, drop] +item=Citizen top, id=9640, option=[null, Wear, null, null, drop] +item=Citizen top, id=9641, option=[null, null, null, null, drop] +item=Citizen trousers, id=9642, option=[null, Wear, null, null, drop] +item=Citizen trousers, id=9643, option=[null, null, null, null, drop] +item=Citizen shoes, id=9644, option=[null, Wear, null, null, drop] +item=Citizen shoes, id=9645, option=[null, null, null, null, drop] +item=Castle sketch 1, id=9646, option=[null, Look-at, null, null, Destroy] +item=Castle sketch 2, id=9647, option=[null, Look-at, null, null, Destroy] +item=Castle sketch 3, id=9648, option=[null, Look-at, null, null, Destroy] +item=Message, id=9649, option=[Read, null, null, null, Destroy] +item=Blood tithe pouch, id=9650, option=[null, null, null, null, drop] +item=Large ornate key, id=9651, option=[null, null, null, null, Destroy] +item=Haemalchemy, id=9652, option=[Read, null, null, null, Destroy] +item=Sealed message, id=9653, option=[Read, null, null, null, Destroy] +item=Door key, id=9654, option=[null, null, null, null, Destroy] +item=Ladder top, id=9655, option=[null, null, null, null, Destroy] +item=Tome of xp (3), id=9656, option=[Read, null, null, null, Destroy] +item=Tome of xp (2), id=9657, option=[Read, null, null, null, Destroy] +item=Tome of xp (1), id=9658, option=[Read, null, null, null, Destroy] +item=Bucket of water, id=9659, option=[null, null, null, Empty, Destroy] +item=Bucket, id=9660, option=[null, null, null, null, Destroy] +item=null, id=9661, option=[null, null, null, null, drop] +item=Shortcut key, id=9662, option=[null, null, null, null, Destroy] +item=null, id=9663, option=[null, null, null, null, drop] +item=null, id=9664, option=[null, null, null, null, drop] +item=Torch, id=9665, option=[null, Wield, null, null, drop] +item=Pros'yte harness m, id=9666, option=[Unpack, null, null, null, drop] +item=Pros'yte harness m, id=9667, option=[null, null, null, null, drop] +item=Initiate harness m, id=9668, option=[Unpack, null, null, null, drop] +item=Initiate harness m, id=9669, option=[null, null, null, null, drop] +item=Pros'yte harness f, id=9670, option=[Unpack, null, null, null, drop] +item=Pros'yte harness f, id=9671, option=[null, null, null, null, drop] +item=Proselyte sallet, id=9672, option=[null, Wear, null, null, drop] +item=Proselyte sallet, id=9673, option=[null, null, null, null, drop] +item=Proselyte hauberk, id=9674, option=[null, Wear, null, null, drop] +item=Proselyte hauberk, id=9675, option=[null, null, null, null, drop] +item=Proselyte cuisse, id=9676, option=[null, Wear, null, null, drop] +item=Proselyte cuisse, id=9677, option=[null, null, null, null, drop] +item=Proselyte tasset, id=9678, option=[null, Wear, null, null, drop] +item=Proselyte tasset, id=9679, option=[null, null, null, null, drop] +item=Sea slug glue, id=9680, option=[null, null, null, null, drop] +item=Commorb v2, id=9681, option=[Scan, Contact, null, Playback, drop] +item=Door transcription, id=9682, option=[null, null, null, null, Destroy] +item=Dead sea slug, id=9683, option=[null, null, null, null, drop] +item=Page 1, id=9684, option=[Read, Shape-Earth, Shape-Air, null, Destroy] +item=Page 2, id=9685, option=[Read, Shape-Fire, Shape-Water, null, Destroy] +item=Page 3, id=9686, option=[Read, Shape-Mind, null, null, Destroy] +item=Fragment 1, id=9687, option=[null, null, null, null, Destroy] +item=Fragment 2, id=9688, option=[null, null, null, null, Destroy] +item=Fragment 3, id=9689, option=[null, null, null, null, Destroy] +item=Blank water rune, id=9690, option=[null, null, null, null, Destroy] +item=Water rune, id=9691, option=[null, null, null, null, Destroy] +item=Blank air rune, id=9692, option=[null, null, null, null, Destroy] +item=Air rune, id=9693, option=[null, null, null, null, Destroy] +item=Blank earth rune, id=9694, option=[null, null, null, null, Destroy] +item=Earth rune, id=9695, option=[null, null, null, null, Destroy] +item=Blank mind rune, id=9696, option=[null, null, null, null, Destroy] +item=Mind rune, id=9697, option=[null, null, null, null, Destroy] +item=Blank fire rune, id=9698, option=[null, null, null, null, Destroy] +item=Fire rune, id=9699, option=[null, null, null, null, Destroy] +item=Qc dummy, id=9700, option=[null, null, null, null, drop] +item=Torch, id=9701, option=[null, null, null, null, drop] +item=Stick, id=9702, option=[null, Wield, null, null, Destroy] +item=Training sword, id=9703, option=[null, Wield, null, null, Destroy] +item=Training shield, id=9704, option=[null, Wear, null, null, Destroy] +item=Training bow, id=9705, option=[null, Wield, null, null, Destroy] +item=Training arrows, id=9706, option=[null, Wield, null, null, Destroy] +item=null, id=9707, option=[null, null, null, null, drop] +item=null, id=9708, option=[null, null, null, null, drop] +item=null, id=9709, option=[null, null, null, null, drop] +item=null, id=9710, option=[null, null, null, null, drop] +item=null, id=9711, option=[null, null, null, null, drop] +item=null, id=9712, option=[null, null, null, null, drop] +item=null, id=9713, option=[null, null, null, null, drop] +item=null, id=9714, option=[null, null, null, null, drop] +item=Slashed book, id=9715, option=[Read, null, null, null, drop] +item=Rock, id=9716, option=[null, null, null, null, drop] +item=Beaten book, id=9717, option=[Read, null, null, null, drop] +item=Crane schematic, id=9718, option=[Read, null, null, null, drop] +item=Lever schematic, id=9719, option=[Read, null, null, null, drop] +item=Crane claw, id=9720, option=[null, null, null, null, drop] +item=Scroll, id=9721, option=[Read, null, null, null, drop] +item=Key, id=9722, option=[null, null, null, null, drop] +item=Pipe, id=9723, option=[null, null, null, null, drop] +item=Large cog, id=9724, option=[null, null, null, null, drop] +item=Medium cog, id=9725, option=[null, null, null, null, drop] +item=Small cog, id=9726, option=[null, null, null, null, drop] +item=Primed bar, id=9727, option=[null, null, null, null, drop] +item=Elemental mind bar, id=9728, option=[null, null, null, null, drop] +item=Elemental helmet, id=9729, option=[null, Equip, null, null, drop] +item=Elemental helmet, id=9730, option=[null, null, null, null, drop] +item=Mind shield, id=9731, option=[null, Wield, null, null, drop] +item=Mind shield, id=9732, option=[null, null, null, null, drop] +item=Mind helmet, id=9733, option=[null, Equip, null, null, drop] +item=Mind helmet, id=9734, option=[null, null, null, null, drop] +item=Desert goat horn, id=9735, option=[null, null, null, null, drop] +item=Goat horn dust, id=9736, option=[null, null, null, null, drop] +item=Goat horn dust, id=9737, option=[null, null, null, null, drop] +item=Desert goat horn, id=9738, option=[null, null, null, null, drop] +item=Combat potion(4), id=9739, option=[Drink, null, null, Empty, drop] +item=Combat potion(4), id=9740, option=[null, null, null, null, drop] +item=Combat potion(3), id=9741, option=[Drink, null, null, Empty, drop] +item=Combat potion(3), id=9742, option=[null, null, null, null, drop] +item=Combat potion(2), id=9743, option=[Drink, null, null, Empty, drop] +item=Combat potion(2), id=9744, option=[null, null, null, null, drop] +item=Combat potion(1), id=9745, option=[Drink, null, null, Empty, drop] +item=Combat potion(1), id=9746, option=[null, null, null, null, drop] +item=Attack cape, id=9747, option=[null, Wear, null, null, drop] +item=Attack cape(t), id=9748, option=[null, Wear, null, null, drop] +item=Attack hood, id=9749, option=[null, Wear, null, null, drop] +item=Strength cape, id=9750, option=[null, Wear, null, null, drop] +item=Strength cape(t), id=9751, option=[null, Wear, null, null, drop] +item=Strength hood, id=9752, option=[null, Wear, null, null, drop] +item=Defence cape, id=9753, option=[null, Wear, null, null, drop] +item=Defence cape(t), id=9754, option=[null, Wear, null, null, drop] +item=Defence hood, id=9755, option=[null, Wear, null, null, drop] +item=Ranging cape, id=9756, option=[null, Wear, null, null, drop] +item=Ranging cape(t), id=9757, option=[null, Wear, null, null, drop] +item=Ranging hood, id=9758, option=[null, Wear, null, null, drop] +item=Prayer cape, id=9759, option=[null, Wear, null, null, drop] +item=Prayer cape(t), id=9760, option=[null, Wear, null, null, drop] +item=Prayer hood, id=9761, option=[null, Wear, null, null, drop] +item=Magic cape, id=9762, option=[null, Wear, null, null, drop] +item=Magic cape(t), id=9763, option=[null, Wear, null, null, drop] +item=Magic hood, id=9764, option=[null, Wear, null, null, drop] +item=Runecraft cape, id=9765, option=[null, Wear, null, null, drop] +item=Runecraft cape(t), id=9766, option=[null, Wear, null, null, drop] +item=Runecrafting hood, id=9767, option=[null, Wear, null, null, drop] +item=Hitpoints cape, id=9768, option=[null, Wear, null, null, drop] +item=Hitpoints cape(t), id=9769, option=[null, Wear, null, null, drop] +item=Hitpoints hood, id=9770, option=[null, Wear, null, null, drop] +item=Agility cape, id=9771, option=[null, Wear, null, null, drop] +item=Agility cape(t), id=9772, option=[null, Wear, null, null, drop] +item=Agility hood, id=9773, option=[null, Wear, null, null, drop] +item=Herblore cape, id=9774, option=[null, Wear, null, null, drop] +item=Herblore cape(t), id=9775, option=[null, Wear, null, null, drop] +item=Herblore hood, id=9776, option=[null, Wear, null, null, drop] +item=Thieving cape, id=9777, option=[null, Wear, null, null, drop] +item=Thieving cape(t), id=9778, option=[null, Wear, null, null, drop] +item=Thieving hood, id=9779, option=[null, Wear, null, null, drop] +item=Crafting cape, id=9780, option=[null, Wear, null, null, drop] +item=Crafting cape(t), id=9781, option=[null, Wear, null, null, drop] +item=Crafting hood, id=9782, option=[null, Wear, null, null, drop] +item=Fletching cape, id=9783, option=[null, Wear, null, null, drop] +item=Fletching cape(t), id=9784, option=[null, Wear, null, null, drop] +item=Fletching hood, id=9785, option=[null, Wear, null, null, drop] +item=Slayer cape, id=9786, option=[null, Wear, null, null, drop] +item=Slayer cape(t), id=9787, option=[null, Wear, null, null, drop] +item=Slayer hood, id=9788, option=[null, Wear, null, null, drop] +item=Construct. cape, id=9789, option=[null, Wear, null, null, drop] +item=Construct. cape(t), id=9790, option=[null, Wear, null, null, drop] +item=Construct. hood, id=9791, option=[null, Wear, null, null, drop] +item=Mining cape, id=9792, option=[null, Wear, null, null, drop] +item=Mining cape(t), id=9793, option=[null, Wear, null, null, drop] +item=Mining hood, id=9794, option=[null, Wear, null, null, drop] +item=Smithing cape, id=9795, option=[null, Wear, null, null, drop] +item=Smithing cape(t), id=9796, option=[null, Wear, null, null, drop] +item=Smithing hood, id=9797, option=[null, Wear, null, null, drop] +item=Fishing cape, id=9798, option=[null, Wear, null, null, drop] +item=Fishing cape(t), id=9799, option=[null, Wear, null, null, drop] +item=Fishing hood, id=9800, option=[null, Wear, null, null, drop] +item=Cooking cape, id=9801, option=[null, Wear, null, null, drop] +item=Cooking cape(t), id=9802, option=[null, Wear, null, null, drop] +item=Cooking hood, id=9803, option=[null, Wear, null, null, drop] +item=Firemaking cape, id=9804, option=[null, Wear, null, null, drop] +item=Firemaking cape(t), id=9805, option=[null, Wear, null, null, drop] +item=Firemaking hood, id=9806, option=[null, Wear, null, null, drop] +item=Woodcutting cape, id=9807, option=[null, Wear, null, null, drop] +item=Woodcut. cape(t), id=9808, option=[null, Wear, null, null, drop] +item=Woodcutting hood, id=9809, option=[null, Wear, null, null, drop] +item=Farming cape, id=9810, option=[null, Wear, null, null, drop] +item=Farming cape(t), id=9811, option=[null, Wear, null, null, drop] +item=Farming hood, id=9812, option=[null, Wear, null, null, drop] +item=Quest point cape, id=9813, option=[null, Wear, null, null, drop] +item=Quest point hood, id=9814, option=[null, Wear, null, null, drop] +item=Bobble hat, id=9815, option=[null, null, null, null, drop] +item=Bobble scarf, id=9816, option=[null, null, null, null, drop] +item=Oak cape rack, id=9817, option=[null, null, null, null, drop] +item=Teak cape rack, id=9818, option=[null, null, null, null, drop] +item=M'gany cape rack, id=9819, option=[null, null, null, null, drop] +item=Gilded cape rack, id=9820, option=[null, null, null, null, drop] +item=Marble cape rack, id=9821, option=[null, null, null, null, drop] +item=Magical cape rack, id=9822, option=[null, null, null, null, drop] +item=Oak costume box, id=9823, option=[null, null, null, null, drop] +item=Teak costume box, id=9824, option=[null, null, null, null, drop] +item=Mahogany cos box, id=9825, option=[null, null, null, null, drop] +item=Oak armour case, id=9826, option=[null, null, null, null, drop] +item=Teak armour case, id=9827, option=[null, null, null, null, drop] +item=M'gany arm'r case, id=9828, option=[null, null, null, null, drop] +item=Oak magic wardrobe, id=9829, option=[null, null, null, null, drop] +item=Carved oak magic wardrobe, id=9830, option=[null, null, null, null, drop] +item=Teak magic wardrobe, id=9831, option=[null, null, null, null, drop] +item=Carved teak magic wardrobe, id=9832, option=[null, null, null, null, drop] +item=Mahogany magic wardrobe, id=9833, option=[null, null, null, null, drop] +item=Gilded magic wardrobe, id=9834, option=[null, null, null, null, drop] +item=Marble magic wardrobe, id=9835, option=[null, null, null, null, drop] +item=Oak toy box, id=9836, option=[null, null, null, null, drop] +item=Teak toy box, id=9837, option=[null, null, null, null, drop] +item=Mahogany toy box, id=9838, option=[null, null, null, null, drop] +item=Oak treasure chest, id=9839, option=[null, null, null, null, drop] +item=Teak treas' chest, id=9840, option=[null, null, null, null, drop] +item=M'gany treas' chest, id=9841, option=[null, null, null, null, drop] +item=Costume room, id=9842, option=[null, null, null, null, drop] +item=Oak cape rack, id=9843, option=[null, null, null, null, drop] +item=Teak cape rack, id=9844, option=[null, null, null, null, drop] +item=M'gany cape rack, id=9845, option=[null, null, null, null, drop] +item=Gilded cape rack, id=9846, option=[null, null, null, null, drop] +item=Marble cape rack, id=9847, option=[null, null, null, null, drop] +item=Magical cape rack, id=9848, option=[null, null, null, null, drop] +item=Oak toy box, id=9849, option=[null, null, null, null, drop] +item=Teak toy box, id=9850, option=[null, null, null, null, drop] +item=Mahogany toy box, id=9851, option=[null, null, null, null, drop] +item=Oak magic wardrobe, id=9852, option=[null, null, null, null, drop] +item=Carved oak magic wardrobe, id=9853, option=[null, null, null, null, drop] +item=Teak magic wardrobe, id=9854, option=[null, null, null, null, drop] +item=Carved teak magic wardrobe, id=9855, option=[null, null, null, null, drop] +item=Mahogany magic wardrobe, id=9856, option=[null, null, null, null, drop] +item=Gilded magic wardrobe, id=9857, option=[null, null, null, null, drop] +item=Marble magic wardrobe, id=9858, option=[null, null, null, null, drop] +item=Oak armour case, id=9859, option=[null, null, null, null, drop] +item=Teak armour case, id=9860, option=[null, null, null, null, drop] +item=M'gany arm'r case, id=9861, option=[null, null, null, null, drop] +item=Oak treasure chest, id=9862, option=[null, null, null, null, drop] +item=Teak treas' chest, id=9863, option=[null, null, null, null, drop] +item=M'gany treas' chest, id=9864, option=[null, null, null, null, drop] +item=Oak costume box, id=9865, option=[null, null, null, null, drop] +item=Teak costume box, id=9866, option=[null, null, null, null, drop] +item=Mahogany cos box, id=9867, option=[null, null, null, null, drop] +item=Oak cape rack, id=9868, option=[null, null, null, null, drop] +item=Teak cape rack, id=9869, option=[null, null, null, null, drop] +item=M'gany cape rack, id=9870, option=[null, null, null, null, drop] +item=Gilded cape rack, id=9871, option=[null, null, null, null, drop] +item=Marble cape rack, id=9872, option=[null, null, null, null, drop] +item=Magical cape rack, id=9873, option=[null, null, null, null, drop] +item=Oak toy box, id=9874, option=[null, null, null, null, drop] +item=Teak toy box, id=9875, option=[null, null, null, null, drop] +item=Mahogany toy box, id=9876, option=[null, null, null, null, drop] +item=Oak magic wardrobe, id=9877, option=[null, null, null, null, drop] +item=Carved oak magic wardrobe, id=9878, option=[null, null, null, null, drop] +item=Teak magic wardrobe, id=9879, option=[null, null, null, null, drop] +item=Carved teak magic wardrobe, id=9880, option=[null, null, null, null, drop] +item=Mahogany magic wardrobe, id=9881, option=[null, null, null, null, drop] +item=Gilded magic wardrobe, id=9882, option=[null, null, null, null, drop] +item=Marble magic wardrobe, id=9883, option=[null, null, null, null, drop] +item=Oak armour case, id=9884, option=[null, null, null, null, drop] +item=Teak armour case, id=9885, option=[null, null, null, null, drop] +item=M'gany arm'r case, id=9886, option=[null, null, null, null, drop] +item=Oak treasure chest, id=9887, option=[null, null, null, null, drop] +item=Teak treas' chest, id=9888, option=[null, null, null, null, drop] +item=M'gany treas' chest, id=9889, option=[null, null, null, null, drop] +item=Oak costume box, id=9890, option=[null, null, null, null, drop] +item=Teak costume box, id=9891, option=[null, null, null, null, drop] +item=Mahogany cos box, id=9892, option=[null, null, null, null, drop] +item=null, id=9893, option=[null, null, null, null, drop] +item=null, id=9894, option=[null, null, null, null, drop] +item=null, id=9895, option=[null, null, null, null, drop] +item=null, id=9896, option=[null, null, null, null, drop] +item=null, id=9897, option=[null, null, null, null, drop] +item=null, id=9898, option=[null, null, null, null, drop] +item=null, id=9899, option=[null, null, null, null, drop] +item=null, id=9900, option=[null, null, null, null, drop] +item=Goutweedy lump, id=9901, option=[null, null, null, null, Destroy] +item=Hardy gout tubers, id=9902, option=[null, null, null, null, Destroy] +item=Farming manual, id=9903, option=[Read, null, null, null, Destroy] +item=Sailing book, id=9904, option=[null, null, null, null, drop] +item=null, id=9905, option=[null, null, null, null, drop] +item=Ghost buster 500, id=9906, option=[null, Wield, Empty, null, Destroy] +item=Ghost buster 500, id=9907, option=[null, Wield, Empty, null, Destroy] +item=Ghost buster 500, id=9908, option=[null, Wield, Empty, null, Destroy] +item=Ghost buster 500, id=9909, option=[null, Wield, Empty, null, Destroy] +item=Ghost buster 500, id=9910, option=[null, Wield, Empty, null, Destroy] +item=Ghost buster 500, id=9911, option=[null, Wield, Empty, null, Destroy] +item=Ghost buster 500, id=9912, option=[null, null, null, null, Destroy] +item=White destabiliser, id=9913, option=[null, null, null, Load, Destroy] +item=Red destabiliser, id=9914, option=[null, null, null, Load, Destroy] +item=Blue destabiliser, id=9915, option=[null, null, null, Load, Destroy] +item=Green destabiliser, id=9916, option=[null, null, null, Load, Destroy] +item=Yellow destabiliser, id=9917, option=[null, null, null, Load, Destroy] +item=Black destabiliser, id=9918, option=[null, null, null, Load, Destroy] +item=Evil root, id=9919, option=[null, null, null, null, Destroy] +item=Jack lantern mask, id=9920, option=[null, Wear, null, null, Destroy] +item=Skeleton boots, id=9921, option=[null, Wear, null, null, Destroy] +item=Skeleton gloves, id=9922, option=[null, Wear, null, null, Destroy] +item=Skeleton leggings, id=9923, option=[null, Wear, null, null, Destroy] +item=Skeleton shirt, id=9924, option=[null, Wear, null, null, Destroy] +item=Skeleton mask, id=9925, option=[null, Wear, null, null, Destroy] +item=null, id=9926, option=[null, null, null, null, drop] +item=null, id=9927, option=[null, null, null, null, drop] +item=null, id=9928, option=[null, null, null, null, drop] +item=null, id=9929, option=[null, null, null, null, drop] +item=null, id=9930, option=[null, null, null, null, drop] +item=null, id=9931, option=[null, null, null, null, drop] +item=Auguste's sapling, id=9932, option=[null, null, null, null, Destroy] +item=Balloon structure, id=9933, option=[null, null, null, null, drop] +item=Origami balloon, id=9934, option=[null, null, null, null, drop] +item=Yellow balloon, id=9935, option=[null, null, null, null, drop] +item=Blue balloon, id=9936, option=[null, null, null, null, drop] +item=Red balloon, id=9937, option=[null, null, null, null, drop] +item=Orange balloon, id=9938, option=[null, null, null, null, drop] +item=Green balloon, id=9939, option=[null, null, null, null, drop] +item=Purple balloon, id=9940, option=[null, null, null, null, drop] +item=Pink balloon, id=9941, option=[null, null, null, null, drop] +item=Black balloon, id=9942, option=[null, null, null, null, drop] +item=Sandbag, id=9943, option=[null, null, null, Empty, drop] +item=Bomber jacket, id=9944, option=[null, Wear, null, null, Destroy] +item=Bomber cap, id=9945, option=[null, Wear, null, null, Destroy] +item=Cap and goggles, id=9946, option=[null, Wear, null, Split, drop] +item=Old red disk, id=9947, option=[null, null, null, null, Destroy] +item=Hunter cape, id=9948, option=[null, Wear, null, null, drop] +item=Hunter cape(t), id=9949, option=[null, Wear, null, null, drop] +item=Hunter hood, id=9950, option=[null, Wear, null, null, drop] +item=Footprint, id=9951, option=[null, null, null, null, drop] +item=Imp, id=9952, option=[null, null, null, null, drop] +item=Kebbit, id=9953, option=[null, null, null, null, drop] +item=Kebbit, id=9954, option=[null, null, null, null, drop] +item=Kebbit, id=9955, option=[null, null, null, null, drop] +item=Kebbit, id=9956, option=[null, null, null, null, drop] +item=Kebbit, id=9957, option=[null, null, null, null, drop] +item=Kebbit, id=9958, option=[null, null, null, null, drop] +item=Kebbit, id=9959, option=[null, null, null, null, drop] +item=Kebbit, id=9960, option=[null, null, null, null, drop] +item=Kebbit, id=9961, option=[null, null, null, null, drop] +item=Kebbit, id=9962, option=[null, null, null, null, drop] +item=Kebbit, id=9963, option=[null, null, null, null, drop] +item=Kebbit, id=9964, option=[null, null, null, null, drop] +item=Crimson swift, id=9965, option=[null, null, null, null, drop] +item=Copper longtail, id=9966, option=[null, null, null, null, drop] +item=Cerulean twitch, id=9967, option=[null, null, null, null, drop] +item=Golden warbler, id=9968, option=[null, null, null, null, drop] +item=Tropical wagtail, id=9969, option=[null, null, null, null, drop] +item=Butterfly, id=9970, option=[null, null, null, null, drop] +item=Butterfly, id=9971, option=[null, null, null, null, drop] +item=Butterfly, id=9972, option=[null, null, null, null, drop] +item=Butterfly, id=9973, option=[null, null, null, null, drop] +item=Giant eagle, id=9974, option=[null, null, null, null, drop] +item=Rabbit, id=9975, option=[null, null, null, null, drop] +item=Chinchompa, id=9976, option=[null, null, null, null, drop] +item=Red chinchompa, id=9977, option=[null, null, null, null, drop] +item=Raw bird meat, id=9978, option=[null, null, null, null, drop] +item=Raw bird meat, id=9979, option=[null, null, null, null, drop] +item=Roast bird meat, id=9980, option=[Eat, null, null, null, drop] +item=Roast bird meat, id=9981, option=[null, null, null, null, drop] +item=Burnt bird meat, id=9982, option=[null, null, null, null, drop] +item=Burnt bird meat, id=9983, option=[null, null, null, null, drop] +item=Skewered bird meat, id=9984, option=[null, null, null, null, drop] +item=Skewered bird meat, id=9985, option=[null, null, null, null, drop] +item=Raw beast meat, id=9986, option=[null, null, null, null, drop] +item=Raw beast meat, id=9987, option=[null, null, null, null, drop] +item=Roast beast meat, id=9988, option=[Eat, null, null, null, drop] +item=Roast beast meat, id=9989, option=[null, null, null, null, drop] +item=Burnt beast meat, id=9990, option=[null, null, null, null, drop] +item=Burnt beast meat, id=9991, option=[null, null, null, null, drop] +item=Skewered beast, id=9992, option=[null, null, null, null, drop] +item=Skewered beast, id=9993, option=[null, null, null, null, drop] +item=Spicy tomato, id=9994, option=[Eat, null, null, null, drop] +item=Spicy tomato, id=9995, option=[null, null, null, null, drop] +item=Spicy minced meat, id=9996, option=[Eat, null, null, null, drop] +item=Spicy minced meat, id=9997, option=[null, null, null, null, drop] +item=Hunter potion(4), id=9998, option=[Drink, null, null, Empty, drop] +item=Hunter potion(4), id=9999, option=[null, null, null, null, drop] +item=Hunter potion(3), id=10000, option=[Drink, null, null, Empty, drop] +item=Hunter potion(3), id=10001, option=[null, null, null, null, drop] +item=Hunter potion(2), id=10002, option=[Drink, null, null, Empty, drop] +item=Hunter potion(2), id=10003, option=[null, null, null, null, drop] +item=Hunter potion(1), id=10004, option=[Drink, null, null, Empty, drop] +item=Hunter potion(1), id=10005, option=[null, null, null, null, drop] +item=Bird snare, id=10006, option=[Lay, null, null, null, drop] +item=Bird snare, id=10007, option=[null, null, null, null, drop] +item=Box trap, id=10008, option=[Lay, null, null, null, drop] +item=Box trap, id=10009, option=[null, null, null, null, drop] +item=Butterfly net, id=10010, option=[null, Wield, null, null, drop] +item=Butterfly net, id=10011, option=[null, null, null, null, drop] +item=Butterfly jar, id=10012, option=[null, null, null, null, drop] +item=Butterfly jar, id=10013, option=[null, null, null, null, drop] +item=Black warlock, id=10014, option=[null, null, null, Release, drop] +item=Black warlock, id=10015, option=[null, null, null, null, drop] +item=Snowy knight, id=10016, option=[null, null, null, Release, drop] +item=Snowy knight, id=10017, option=[null, null, null, null, drop] +item=Sapphire glacialis, id=10018, option=[null, null, null, Release, drop] +item=Sapphire glacialis, id=10019, option=[null, null, null, null, drop] +item=Ruby harvest, id=10020, option=[null, null, null, Release, drop] +item=Ruby harvest, id=10021, option=[null, null, null, null, drop] +item=null, id=10022, option=[null, null, null, null, drop] +item=Falconer's glove, id=10023, option=[null, Wear, null, null, drop] +item=Falconer's glove, id=10024, option=[null, Wear, null, null, drop] +item=Magic box, id=10025, option=[Activate, null, null, null, drop] +item=Magic box, id=10026, option=[null, null, null, null, drop] +item=Imp-in-a-box(2), id=10027, option=[Talk-to, Bank, null, null, drop] +item=Imp-in-a-box(1), id=10028, option=[Talk-to, Bank, null, null, drop] +item=Teasing stick, id=10029, option=[null, null, null, null, drop] +item=Teasing stick, id=10030, option=[null, null, null, null, drop] +item=Rabbit snare, id=10031, option=[Lay, null, null, null, drop] +item=Rabbit snare, id=10032, option=[null, null, null, null, drop] +item=Chinchompa, id=10033, option=[null, Wield, null, null, Release] +item=Red chinchompa, id=10034, option=[null, Wield, null, null, Release] +item=Kyatt legs, id=10035, option=[null, Wear, null, null, drop] +item=Kyatt legs, id=10036, option=[null, null, null, null, drop] +item=Kyatt top, id=10037, option=[null, Wear, null, null, drop] +item=Kyatt top, id=10038, option=[null, null, null, null, drop] +item=Kyatt hat, id=10039, option=[null, Wear, null, null, drop] +item=Kyatt hat, id=10040, option=[null, null, null, null, drop] +item=Larupia legs, id=10041, option=[null, Wear, null, null, drop] +item=Larupia legs, id=10042, option=[null, null, null, null, drop] +item=Larupia top, id=10043, option=[null, Wear, null, null, drop] +item=Larupia top, id=10044, option=[null, null, null, null, drop] +item=Larupia hat, id=10045, option=[null, Wear, null, null, drop] +item=Larupia hat, id=10046, option=[null, null, null, null, drop] +item=Graahk legs, id=10047, option=[null, Wear, null, null, drop] +item=Graahk legs, id=10048, option=[null, null, null, null, drop] +item=Graahk top, id=10049, option=[null, Wear, null, null, drop] +item=Graahk top, id=10050, option=[null, null, null, null, drop] +item=Graahk headdress, id=10051, option=[null, Wear, null, null, drop] +item=Graahk headdress, id=10052, option=[null, null, null, null, drop] +item=Wood camo top, id=10053, option=[null, Wear, null, null, drop] +item=Wood camo top, id=10054, option=[null, null, null, null, drop] +item=Wood camo legs, id=10055, option=[null, Wear, null, null, drop] +item=Wood camo legs, id=10056, option=[null, null, null, null, drop] +item=Jungle camo top, id=10057, option=[null, Wear, null, null, drop] +item=Jungle camo top, id=10058, option=[null, null, null, null, drop] +item=Jungle camo legs, id=10059, option=[null, Wear, null, null, drop] +item=Jungle camo legs, id=10060, option=[null, null, null, null, drop] +item=Desert camo top, id=10061, option=[null, Wear, null, null, drop] +item=Desert camo top, id=10062, option=[null, null, null, null, drop] +item=Desert camo legs, id=10063, option=[null, Wear, null, null, drop] +item=Desert camo legs, id=10064, option=[null, null, null, null, drop] +item=Polar camo top, id=10065, option=[null, Wear, null, null, drop] +item=Polar camo top, id=10066, option=[null, null, null, null, drop] +item=Polar camo legs, id=10067, option=[null, Wear, null, null, drop] +item=Polar camo legs, id=10068, option=[null, null, null, null, drop] +item=Spotted cape, id=10069, option=[null, Wear, null, null, drop] +item=Spotted cape, id=10070, option=[null, null, null, null, drop] +item=Spottier cape, id=10071, option=[null, Wear, null, null, drop] +item=Spottier cape, id=10072, option=[null, null, null, null, drop] +item=Spotted cape, id=10073, option=[null, Wear, null, null, drop] +item=Spottier cape, id=10074, option=[null, Wear, null, null, drop] +item=Gloves of silence, id=10075, option=[null, Wear, Check, null, drop] +item=Gloves of silence, id=10076, option=[null, null, null, null, drop] +item=Spiky vambraces, id=10077, option=[null, Wear, null, null, drop] +item=Spiky vambraces, id=10078, option=[null, null, null, null, drop] +item=Green spiky vambs, id=10079, option=[null, Wear, null, null, drop] +item=Green spiky vambs, id=10080, option=[null, null, null, null, drop] +item=Blue spiky vambs, id=10081, option=[null, Wear, null, null, drop] +item=Blue spiky vambs, id=10082, option=[null, null, null, null, drop] +item=Red spiky vambs, id=10083, option=[null, Wear, null, null, drop] +item=Red spiky vambs, id=10084, option=[null, null, null, null, drop] +item=Black spiky vambs, id=10085, option=[null, Wear, null, null, drop] +item=Black spiky vambs, id=10086, option=[null, null, null, null, drop] +item=Stripy feather, id=10087, option=[null, null, null, null, drop] +item=Red feather, id=10088, option=[null, null, null, null, drop] +item=Blue feather, id=10089, option=[null, null, null, null, drop] +item=Yellow feather, id=10090, option=[null, null, null, null, drop] +item=Orange feather, id=10091, option=[null, null, null, null, drop] +item=Ferret, id=10092, option=[null, null, null, null, Release] +item=Tatty larupia fur, id=10093, option=[null, null, null, null, drop] +item=Tatty larupia fur, id=10094, option=[null, null, null, null, drop] +item=Larupia fur, id=10095, option=[null, null, null, null, drop] +item=Larupia fur, id=10096, option=[null, null, null, null, drop] +item=Tatty graahk fur, id=10097, option=[null, null, null, null, drop] +item=Tatty graahk fur, id=10098, option=[null, null, null, null, drop] +item=Graahk fur, id=10099, option=[null, null, null, null, drop] +item=Graahk fur, id=10100, option=[null, null, null, null, drop] +item=Tatty kyatt fur, id=10101, option=[null, null, null, null, drop] +item=Tatty kyatt fur, id=10102, option=[null, null, null, null, drop] +item=Kyatt fur, id=10103, option=[null, null, null, null, drop] +item=Kyatt fur, id=10104, option=[null, null, null, null, drop] +item=Kebbit spike, id=10105, option=[null, null, null, null, drop] +item=Kebbit spike, id=10106, option=[null, null, null, null, drop] +item=Long kebbit spike, id=10107, option=[null, null, null, null, drop] +item=Long kebbit spike, id=10108, option=[null, null, null, null, drop] +item=Kebbit teeth, id=10109, option=[null, null, null, null, drop] +item=Kebbit teeth, id=10110, option=[null, null, null, null, drop] +item=Kebbit teeth dust, id=10111, option=[null, null, null, null, drop] +item=Kebbit teeth dust, id=10112, option=[null, null, null, null, drop] +item=Kebbit claws, id=10113, option=[null, null, null, null, drop] +item=Kebbit claws, id=10114, option=[null, null, null, null, drop] +item=Dark kebbit fur, id=10115, option=[null, null, null, null, drop] +item=Dark kebbit fur, id=10116, option=[null, null, null, null, drop] +item=Polar kebbit fur, id=10117, option=[null, null, null, null, drop] +item=Polar kebbit fur, id=10118, option=[null, null, null, null, drop] +item=Feldip weasel fur, id=10119, option=[null, null, null, null, drop] +item=Feldip weasel fur, id=10120, option=[null, null, null, null, drop] +item=Common kebbit fur, id=10121, option=[null, null, null, null, drop] +item=Common kebbit fur, id=10122, option=[null, null, null, null, drop] +item=Desert devil fur, id=10123, option=[null, null, null, null, drop] +item=Desert devil fur, id=10124, option=[null, null, null, null, drop] +item=Spotted kebbit fur, id=10125, option=[null, null, null, null, drop] +item=Spotted kebbit fur, id=10126, option=[null, null, null, null, drop] +item=Dashing kebbit fur, id=10127, option=[null, null, null, null, drop] +item=Dashing kebbit fur, id=10128, option=[null, null, null, null, drop] +item=Barb-tail harpoon, id=10129, option=[null, Wield, null, null, drop] +item=Barb-tail harpoon, id=10130, option=[null, null, null, null, drop] +item=null, id=10131, option=[null, null, null, null, drop] +item=Strung rabbit foot, id=10132, option=[null, Wear, null, null, drop] +item=Strung rabbit foot, id=10133, option=[null, null, null, null, drop] +item=Rabbit foot, id=10134, option=[null, null, null, null, drop] +item=Rabbit foot, id=10135, option=[null, null, null, null, drop] +item=Rainbow fish, id=10136, option=[Eat, null, null, null, drop] +item=Rainbow fish, id=10137, option=[null, null, null, null, drop] +item=Raw rainbow fish, id=10138, option=[null, null, null, null, drop] +item=Raw rainbow fish, id=10139, option=[null, null, null, null, drop] +item=Burnt rainbow fish, id=10140, option=[null, null, null, null, drop] +item=Burnt rainbow fish, id=10141, option=[null, null, null, null, drop] +item=Guam tar, id=10142, option=[null, Wield, null, null, drop] +item=Marrentill tar, id=10143, option=[null, Wield, null, null, drop] +item=Tarromin tar, id=10144, option=[null, Wield, null, null, drop] +item=Harralander tar, id=10145, option=[null, Wield, null, null, drop] +item=Orange salamander, id=10146, option=[null, Wield, null, null, Release] +item=Red salamander, id=10147, option=[null, Wield, null, null, Release] +item=Black salamander, id=10148, option=[null, Wield, null, null, Release] +item=Swamp lizard, id=10149, option=[null, Wield, null, null, Release] +item=Noose wand, id=10150, option=[null, Wield, null, null, drop] +item=Noose wand, id=10151, option=[null, null, null, null, drop] +item=null, id=10152, option=[null, null, null, null, drop] +item=null, id=10153, option=[null, null, null, null, drop] +item=null, id=10154, option=[null, null, null, null, drop] +item=null, id=10155, option=[null, null, null, null, drop] +item=Hunters' crossbow, id=10156, option=[null, Wield, null, null, drop] +item=Hunters' crossbow, id=10157, option=[null, null, null, null, drop] +item=Kebbit bolts, id=10158, option=[null, Wield, null, null, drop] +item=Long kebbit bolts, id=10159, option=[null, Wield, null, null, drop] +item=Orange salamander, id=10160, option=[null, null, null, null, drop] +item=Red salamander, id=10161, option=[null, null, null, null, drop] +item=Black salamander, id=10162, option=[null, null, null, null, drop] +item=Swamp lizard, id=10163, option=[null, null, null, null, drop] +item=null, id=10164, option=[null, null, null, null, drop] +item=More..., id=10165, option=[null, null, null, null, drop] +item=Back..., id=10166, option=[null, null, null, null, drop] +item=Eagle feather, id=10167, option=[null, null, null, null, drop] +item=null, id=10168, option=[null, null, null, null, drop] +item=null, id=10169, option=[null, null, null, null, drop] +item=null, id=10170, option=[null, null, null, null, drop] +item=Eagle cape, id=10171, option=[null, Wear, null, null, drop] +item=Fake beak, id=10172, option=[null, Wear, null, null, drop] +item=Bird book, id=10173, option=[Read, null, null, null, drop] +item=Metal feather, id=10174, option=[null, null, null, null, Destroy] +item=Golden feather, id=10175, option=[null, null, null, null, Destroy] +item=Silver feather, id=10176, option=[null, null, null, null, Destroy] +item=Bronze feather, id=10177, option=[null, null, null, null, Destroy] +item=Odd bird seed, id=10178, option=[null, null, null, null, drop] +item=Feathered journal, id=10179, option=[Read, null, null, null, drop] +item=Clue scroll, id=10180, option=[Read, null, null, null, drop] +item=Casket, id=10181, option=[Open, null, null, null, drop] +item=Clue scroll, id=10182, option=[Read, null, null, null, drop] +item=Casket, id=10183, option=[Open, null, null, null, drop] +item=Clue scroll, id=10184, option=[Read, null, null, null, drop] +item=Casket, id=10185, option=[Open, null, null, null, drop] +item=Clue scroll, id=10186, option=[Read, null, null, null, drop] +item=Casket, id=10187, option=[Open, null, null, null, drop] +item=Clue scroll, id=10188, option=[Read, null, null, null, drop] +item=Casket, id=10189, option=[Open, null, null, null, drop] +item=Clue scroll, id=10190, option=[Read, null, null, null, drop] +item=Casket, id=10191, option=[Open, null, null, null, drop] +item=Clue scroll, id=10192, option=[Read, null, null, null, drop] +item=Casket, id=10193, option=[Open, null, null, null, drop] +item=Clue scroll, id=10194, option=[Read, null, null, null, drop] +item=Casket, id=10195, option=[Open, null, null, null, drop] +item=Clue scroll, id=10196, option=[Read, null, null, null, drop] +item=Casket, id=10197, option=[Open, null, null, null, drop] +item=Clue scroll, id=10198, option=[Read, null, null, null, drop] +item=Casket, id=10199, option=[Open, null, null, null, drop] +item=Clue scroll, id=10200, option=[Read, null, null, null, drop] +item=Casket, id=10201, option=[Open, null, null, null, drop] +item=Clue scroll, id=10202, option=[Read, null, null, null, drop] +item=Casket, id=10203, option=[Open, null, null, null, drop] +item=Clue scroll, id=10204, option=[Read, null, null, null, drop] +item=Casket, id=10205, option=[Open, null, null, null, drop] +item=Clue scroll, id=10206, option=[Read, null, null, null, drop] +item=Casket, id=10207, option=[Open, null, null, null, drop] +item=Clue scroll, id=10208, option=[Read, null, null, null, drop] +item=Casket, id=10209, option=[Open, null, null, null, drop] +item=Clue scroll, id=10210, option=[Read, null, null, null, drop] +item=Casket, id=10211, option=[Open, null, null, null, drop] +item=Clue scroll, id=10212, option=[Read, null, null, null, drop] +item=Casket, id=10213, option=[Open, null, null, null, drop] +item=Clue scroll, id=10214, option=[Read, null, null, null, drop] +item=Casket, id=10215, option=[Open, null, null, null, drop] +item=Clue scroll, id=10216, option=[Read, null, null, null, drop] +item=Casket, id=10217, option=[Open, null, null, null, drop] +item=Clue scroll, id=10218, option=[Read, null, null, null, drop] +item=Casket, id=10219, option=[Open, null, null, null, drop] +item=Clue scroll, id=10220, option=[Read, null, null, null, drop] +item=Casket, id=10221, option=[Open, null, null, null, drop] +item=Clue scroll, id=10222, option=[Read, null, null, null, drop] +item=Casket, id=10223, option=[Open, null, null, null, drop] +item=Clue scroll, id=10224, option=[Read, null, null, null, drop] +item=Casket, id=10225, option=[Open, null, null, null, drop] +item=Clue scroll, id=10226, option=[Read, null, null, null, drop] +item=Casket, id=10227, option=[Open, null, null, null, drop] +item=Clue scroll, id=10228, option=[Read, null, null, null, drop] +item=Casket, id=10229, option=[Open, null, null, null, drop] +item=Clue scroll, id=10230, option=[Read, null, null, null, drop] +item=Casket, id=10231, option=[Open, null, null, null, drop] +item=Clue scroll, id=10232, option=[Read, null, null, null, drop] +item=Casket, id=10233, option=[Open, null, null, null, drop] +item=Clue scroll, id=10234, option=[Read, null, null, null, drop] +item=Casket, id=10235, option=[Open, null, null, null, drop] +item=Clue scroll, id=10236, option=[Read, null, null, null, drop] +item=Casket, id=10237, option=[Open, null, null, null, drop] +item=Clue scroll, id=10238, option=[Read, null, null, null, drop] +item=Casket, id=10239, option=[Open, null, null, null, drop] +item=Clue scroll, id=10240, option=[Read, null, null, null, drop] +item=Casket, id=10241, option=[Open, null, null, null, drop] +item=Clue scroll, id=10242, option=[Read, null, null, null, drop] +item=Casket, id=10243, option=[Open, null, null, null, drop] +item=Clue scroll, id=10244, option=[Read, null, null, null, drop] +item=Casket, id=10245, option=[Open, null, null, null, drop] +item=Clue scroll, id=10246, option=[Read, null, null, null, drop] +item=Casket, id=10247, option=[Open, null, null, null, drop] +item=Clue scroll, id=10248, option=[Read, null, null, null, drop] +item=Casket, id=10249, option=[Open, null, null, null, drop] +item=Clue scroll, id=10250, option=[Read, null, null, null, drop] +item=Casket, id=10251, option=[Open, null, null, null, drop] +item=Clue scroll, id=10252, option=[Read, null, null, null, drop] +item=Casket, id=10253, option=[Open, null, null, null, drop] +item=Clue scroll, id=10254, option=[Read, null, null, null, drop] +item=Casket, id=10255, option=[Open, null, null, null, drop] +item=Clue scroll, id=10256, option=[Read, null, null, null, drop] +item=Casket, id=10257, option=[Open, null, null, null, drop] +item=Clue scroll, id=10258, option=[Read, null, null, null, drop] +item=Casket, id=10259, option=[Open, null, null, null, drop] +item=Clue scroll, id=10260, option=[Read, null, null, null, drop] +item=Casket, id=10261, option=[Open, null, null, null, drop] +item=Clue scroll, id=10262, option=[Read, null, null, null, drop] +item=Casket, id=10263, option=[Open, null, null, null, drop] +item=Clue scroll, id=10264, option=[Read, null, null, null, drop] +item=Casket, id=10265, option=[Open, null, null, null, drop] +item=Clue scroll, id=10266, option=[Read, null, null, null, drop] +item=Casket, id=10267, option=[Open, null, null, null, drop] +item=Clue scroll, id=10268, option=[Read, null, null, null, drop] +item=Casket, id=10269, option=[Open, null, null, null, drop] +item=Clue scroll, id=10270, option=[Read, null, null, null, drop] +item=Casket, id=10271, option=[Open, null, null, null, drop] +item=Clue scroll, id=10272, option=[Read, null, null, null, drop] +item=Casket, id=10273, option=[Open, null, null, null, drop] +item=Clue scroll, id=10274, option=[Read, null, null, null, drop] +item=Casket, id=10275, option=[Open, null, null, null, drop] +item=Clue scroll, id=10276, option=[Read, null, null, null, drop] +item=Casket, id=10277, option=[Open, null, null, null, drop] +item=Clue scroll, id=10278, option=[Read, null, null, null, drop] +item=Casket, id=10279, option=[Open, null, null, null, drop] +item=Willow comp bow, id=10280, option=[null, Wield, null, null, drop] +item=Willow comp bow, id=10281, option=[null, null, null, null, drop] +item=Yew comp bow, id=10282, option=[null, Wield, null, null, drop] +item=Yew comp bow, id=10283, option=[null, null, null, null, drop] +item=Magic comp bow, id=10284, option=[null, Wield, null, null, drop] +item=Magic comp bow, id=10285, option=[null, null, null, null, drop] +item=Rune helm (h1), id=10286, option=[null, Wear, null, null, drop] +item=Rune helm (h1), id=10287, option=[null, null, null, null, drop] +item=Rune helm (h2), id=10288, option=[null, Wear, null, null, drop] +item=Rune helm (h2), id=10289, option=[null, null, null, null, drop] +item=Rune helm (h3), id=10290, option=[null, Wear, null, null, drop] +item=Rune helm (h3), id=10291, option=[null, null, null, null, drop] +item=Rune helm (h4), id=10292, option=[null, Wear, null, null, drop] +item=Rune helm (h4), id=10293, option=[null, null, null, null, drop] +item=Rune helm (h5), id=10294, option=[null, Wear, null, null, drop] +item=Rune helm (h5), id=10295, option=[null, null, null, null, drop] +item=Adamant helm (h1), id=10296, option=[null, Wear, null, null, drop] +item=Adamant helm (h1), id=10297, option=[null, null, null, null, drop] +item=Adamant helm (h2), id=10298, option=[null, Wear, null, null, drop] +item=Adamant helm (h2), id=10299, option=[null, null, null, null, drop] +item=Adamant helm (h3), id=10300, option=[null, Wear, null, null, drop] +item=Adamant helm (h3), id=10301, option=[null, null, null, null, drop] +item=Adamant helm (h4), id=10302, option=[null, Wear, null, null, drop] +item=Adamant helm (h4), id=10303, option=[null, null, null, null, drop] +item=Adamant helm (h5), id=10304, option=[null, Wear, null, null, drop] +item=Adamant helm (h5), id=10305, option=[null, null, null, null, drop] +item=Black helm (h1), id=10306, option=[null, Wear, null, null, drop] +item=Black helm (h1), id=10307, option=[null, null, null, null, drop] +item=Black helm (h2), id=10308, option=[null, Wear, null, null, drop] +item=Black helm (h2), id=10309, option=[null, null, null, null, drop] +item=Black helm (h3), id=10310, option=[null, Wear, null, null, drop] +item=Black helm (h3), id=10311, option=[null, null, null, null, drop] +item=Black helm (h4), id=10312, option=[null, Wear, null, null, drop] +item=Black helm (h4), id=10313, option=[null, null, null, null, drop] +item=Black helm (h5), id=10314, option=[null, Wear, null, null, drop] +item=Black helm (h5), id=10315, option=[null, null, null, null, drop] +item=Bob shirt, id=10316, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10317, option=[null, null, null, null, drop] +item=Bob shirt, id=10318, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10319, option=[null, null, null, null, drop] +item=Bob shirt, id=10320, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10321, option=[null, null, null, null, drop] +item=Bob shirt, id=10322, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10323, option=[null, null, null, null, drop] +item=Bob shirt, id=10324, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10325, option=[null, null, null, null, drop] +item=Purple firelighter, id=10326, option=[null, null, null, null, drop] +item=White firelighter, id=10327, option=[null, null, null, null, drop] +item=White logs, id=10328, option=[null, null, null, null, drop] +item=Purple logs, id=10329, option=[null, null, null, null, drop] +item=3rd age range top, id=10330, option=[null, Wear, null, null, drop] +item=3rd age range top, id=10331, option=[null, null, null, null, drop] +item=3rd age range legs, id=10332, option=[null, Wear, null, null, drop] +item=3rd age range legs, id=10333, option=[null, null, null, null, drop] +item=3rd age range coif, id=10334, option=[null, Wear, null, null, drop] +item=3rd age range coif, id=10335, option=[null, null, null, null, drop] +item=3rd age vambraces, id=10336, option=[null, Wear, null, null, drop] +item=3rd age vambraces, id=10337, option=[null, null, null, null, drop] +item=3rd age robe top, id=10338, option=[null, Wear, null, null, drop] +item=3rd age robe top, id=10339, option=[null, null, null, null, drop] +item=3rd age robe, id=10340, option=[null, Wear, null, null, drop] +item=3rd age robe, id=10341, option=[null, null, null, null, drop] +item=3rd age mage hat, id=10342, option=[null, Wear, null, null, drop] +item=3rd age mage hat, id=10343, option=[null, null, null, null, drop] +item=3rd age amulet, id=10344, option=[null, Wear, null, null, drop] +item=3rd age amulet, id=10345, option=[null, null, null, null, drop] +item=3rd age platelegs, id=10346, option=[null, Wear, null, null, drop] +item=3rd age platelegs, id=10347, option=[null, null, null, null, drop] +item=3rd age platebody, id=10348, option=[null, Wear, null, null, drop] +item=3rd age platebody, id=10349, option=[null, null, null, null, drop] +item=3rd age full helmet, id=10350, option=[null, Wear, null, null, drop] +item=3rd age full helmet, id=10351, option=[null, null, null, null, drop] +item=3rd age kiteshield, id=10352, option=[null, Wield, null, null, drop] +item=3rd age kiteshield, id=10353, option=[null, null, null, null, drop] +item=Amulet of glory(t4), id=10354, option=[null, Wear, null, Rub, drop] +item=Amulet of glory(t4), id=10355, option=[null, null, null, null, drop] +item=Amulet of glory(t3), id=10356, option=[null, Wear, null, Rub, drop] +item=Amulet of glory(t3), id=10357, option=[null, null, null, null, drop] +item=Amulet of glory(t2), id=10358, option=[null, Wear, null, Rub, drop] +item=Amulet of glory(t2), id=10359, option=[null, null, null, null, drop] +item=Amulet of glory(t1), id=10360, option=[null, Wear, null, Rub, drop] +item=Amulet of glory(t1), id=10361, option=[null, null, null, null, drop] +item=Amulet of glory(t), id=10362, option=[null, Wear, null, Rub, drop] +item=Amulet of glory(t), id=10363, option=[null, null, null, null, drop] +item=Strength amulet(t), id=10364, option=[null, Wear, null, null, drop] +item=Strength amulet(t), id=10365, option=[null, null, null, null, drop] +item=Amulet of magic(t), id=10366, option=[null, Wear, null, null, drop] +item=Amulet of magic(t), id=10367, option=[null, null, null, null, drop] +item=Zamorak bracers, id=10368, option=[null, Wear, null, null, drop] +item=Zamorak bracers, id=10369, option=[null, null, null, null, drop] +item=Zamorak d'hide, id=10370, option=[null, Wear, null, null, drop] +item=Zamorak d'hide, id=10371, option=[null, null, null, null, drop] +item=Zamorak chaps, id=10372, option=[null, Wear, null, null, drop] +item=Zamorak chaps, id=10373, option=[null, null, null, null, drop] +item=Zamorak coif, id=10374, option=[null, Wear, null, null, drop] +item=Zamorak coif, id=10375, option=[null, null, null, null, drop] +item=Guthix bracers, id=10376, option=[null, Wear, null, null, drop] +item=Guthix bracers, id=10377, option=[null, null, null, null, drop] +item=Guthix dragonhide, id=10378, option=[null, Wear, null, null, drop] +item=Guthix dragonhide, id=10379, option=[null, null, null, null, drop] +item=Guthix chaps, id=10380, option=[null, Wear, null, null, drop] +item=Guthix chaps, id=10381, option=[null, null, null, null, drop] +item=Guthix coif, id=10382, option=[null, Wear, null, null, drop] +item=Guthix coif, id=10383, option=[null, null, null, null, drop] +item=Saradomin bracers, id=10384, option=[null, Wear, null, null, drop] +item=Saradomin bracers, id=10385, option=[null, null, null, null, drop] +item=Saradomin d'hide, id=10386, option=[null, Wear, null, null, drop] +item=Saradomin d'hide, id=10387, option=[null, null, null, null, drop] +item=Saradomin chaps, id=10388, option=[null, Wear, null, null, drop] +item=Saradomin chaps, id=10389, option=[null, null, null, null, drop] +item=Saradomin coif, id=10390, option=[null, Wear, null, null, drop] +item=Saradomin coif, id=10391, option=[null, null, null, null, drop] +item=A powdered wig, id=10392, option=[null, Wear, null, null, drop] +item=A powdered wig, id=10393, option=[null, null, null, null, drop] +item=Flared trousers, id=10394, option=[null, Wear, null, null, drop] +item=Flared trousers, id=10395, option=[null, null, null, null, drop] +item=Pantaloons, id=10396, option=[null, Wear, null, null, drop] +item=Pantaloons, id=10397, option=[null, null, null, null, drop] +item=Sleeping cap, id=10398, option=[null, Wear, null, null, drop] +item=Sleeping cap, id=10399, option=[null, null, null, null, drop] +item=Black ele' shirt, id=10400, option=[null, Wear, null, null, drop] +item=Black ele' shirt, id=10401, option=[null, null, null, null, drop] +item=Black ele' legs, id=10402, option=[null, Wear, null, null, drop] +item=Black ele' legs, id=10403, option=[null, null, null, null, drop] +item=Red ele' shirt, id=10404, option=[null, Wear, null, null, drop] +item=Red ele' shirt, id=10405, option=[null, null, null, null, drop] +item=Red ele' legs, id=10406, option=[null, Wear, null, null, drop] +item=Red ele' legs, id=10407, option=[null, null, null, null, drop] +item=Blue ele' shirt, id=10408, option=[null, Wear, null, null, drop] +item=Blue ele' shirt, id=10409, option=[null, null, null, null, drop] +item=Blue ele' legs, id=10410, option=[null, Wear, null, null, drop] +item=Blue ele' legs, id=10411, option=[null, null, null, null, drop] +item=Green ele' shirt, id=10412, option=[null, Wear, null, null, drop] +item=Green ele' shirt, id=10413, option=[null, null, null, null, drop] +item=Green ele' legs, id=10414, option=[null, Wear, null, null, drop] +item=Green ele' legs, id=10415, option=[null, null, null, null, drop] +item=Purple ele' shirt, id=10416, option=[null, Wear, null, null, drop] +item=Purple ele' shirt, id=10417, option=[null, null, null, null, drop] +item=Purple ele' legs, id=10418, option=[null, Wear, null, null, drop] +item=Purple ele' legs, id=10419, option=[null, null, null, null, drop] +item=White ele' blouse, id=10420, option=[null, Wear, null, null, drop] +item=White ele' blouse, id=10421, option=[null, null, null, null, drop] +item=White ele' skirt, id=10422, option=[null, Wear, null, null, drop] +item=White ele' skirt, id=10423, option=[null, null, null, null, drop] +item=Red ele' blouse, id=10424, option=[null, Wear, null, null, drop] +item=Red ele' blouse, id=10425, option=[null, null, null, null, drop] +item=Red ele' skirt, id=10426, option=[null, Wear, null, null, drop] +item=Red ele' skirt, id=10427, option=[null, null, null, null, drop] +item=Blue ele' blouse, id=10428, option=[null, Wear, null, null, drop] +item=Blue ele' blouse, id=10429, option=[null, null, null, null, drop] +item=Blue ele' skirt, id=10430, option=[null, Wear, null, null, drop] +item=Blue ele' skirt, id=10431, option=[null, null, null, null, drop] +item=Green ele' blouse, id=10432, option=[null, Wear, null, null, drop] +item=Green ele' blouse, id=10433, option=[null, null, null, null, drop] +item=Green ele' skirt, id=10434, option=[null, Wear, null, null, drop] +item=Green ele' skirt, id=10435, option=[null, null, null, null, drop] +item=Purple ele' blouse, id=10436, option=[null, Wear, null, null, drop] +item=Purple ele' blouse, id=10437, option=[null, null, null, null, drop] +item=Purple ele' skirt, id=10438, option=[null, Wear, null, null, drop] +item=Purple ele' skirt, id=10439, option=[null, null, null, null, drop] +item=Saradomin crozier, id=10440, option=[null, Wield, null, null, drop] +item=Saradomin crozier, id=10441, option=[null, null, null, null, drop] +item=Guthix crozier, id=10442, option=[null, Wield, null, null, drop] +item=Guthix crozier, id=10443, option=[null, null, null, null, drop] +item=Zamorak crozier, id=10444, option=[null, Wield, null, null, drop] +item=Zamorak crozier, id=10445, option=[null, null, null, null, drop] +item=Saradomin cloak, id=10446, option=[null, Wear, null, null, drop] +item=Saradomin cloak, id=10447, option=[null, null, null, null, drop] +item=Guthix cloak, id=10448, option=[null, Wear, null, null, drop] +item=Guthix cloak, id=10449, option=[null, null, null, null, drop] +item=Zamorak cloak, id=10450, option=[null, Wear, null, null, drop] +item=Zamorak cloak, id=10451, option=[null, null, null, null, drop] +item=Saradomin mitre, id=10452, option=[null, Wear, null, null, drop] +item=Saradomin mitre, id=10453, option=[null, null, null, null, drop] +item=Guthix mitre, id=10454, option=[null, Wear, null, null, drop] +item=Guthix mitre, id=10455, option=[null, null, null, null, drop] +item=Zamorak mitre, id=10456, option=[null, Wear, null, null, drop] +item=Zamorak mitre, id=10457, option=[null, null, null, null, drop] +item=Saradomin robe top, id=10458, option=[null, Wear, null, null, drop] +item=Saradomin robe top, id=10459, option=[null, null, null, null, drop] +item=Zamorak robe top, id=10460, option=[null, Wear, null, null, drop] +item=Zamorak robe top, id=10461, option=[null, null, null, null, drop] +item=Guthix robe top, id=10462, option=[null, Wear, null, null, drop] +item=Guthix robe top, id=10463, option=[null, null, null, null, drop] +item=Saradomin robe legs, id=10464, option=[null, Wear, null, null, drop] +item=Saradomin robe legs, id=10465, option=[null, null, null, null, drop] +item=Guthix robe legs, id=10466, option=[null, Wear, null, null, drop] +item=Guthix robe legs, id=10467, option=[null, null, null, null, drop] +item=Zamorak robe legs, id=10468, option=[null, Wear, null, null, drop] +item=Zamorak robe legs, id=10469, option=[null, null, null, null, drop] +item=Saradomin stole, id=10470, option=[null, Wear, null, null, drop] +item=Saradomin stole, id=10471, option=[null, null, null, null, drop] +item=Guthix stole, id=10472, option=[null, Wear, null, null, drop] +item=Guthix stole, id=10473, option=[null, null, null, null, drop] +item=Zamorak stole, id=10474, option=[null, Wear, null, null, drop] +item=Zamorak stole, id=10475, option=[null, null, null, null, drop] +item=Purple sweets, id=10476, option=[Eat, null, null, null, drop] +item=null, id=10477, option=[null, null, null, null, drop] +item=null, id=10478, option=[null, null, null, null, drop] +item=null, id=10479, option=[null, null, null, null, drop] +item=null, id=10480, option=[null, null, null, null, drop] +item=null, id=10481, option=[null, null, null, null, drop] +item=null, id=10482, option=[null, null, null, null, drop] +item=null, id=10483, option=[null, null, null, null, drop] +item=null, id=10484, option=[null, null, null, null, drop] +item=Scroll, id=10485, option=[null, null, null, null, drop] +item=Empty sack, id=10486, option=[null, null, null, null, drop] +item=Undead chicken, id=10487, option=[null, Wield, null, null, Destroy] +item=Selected iron, id=10488, option=[null, null, null, null, Destroy] +item=Bar magnet, id=10489, option=[null, null, null, null, Destroy] +item=Undead twigs, id=10490, option=[null, null, null, null, Destroy] +item=Blessed axe, id=10491, option=[null, Wield, null, null, Destroy] +item=Research notes, id=10492, option=[Translate, null, null, null, Destroy] +item=Translated notes, id=10493, option=[null, null, null, null, Destroy] +item=A pattern, id=10494, option=[null, null, null, null, Destroy] +item=A container, id=10495, option=[null, null, null, null, Destroy] +item=Polished buttons, id=10496, option=[null, null, null, null, drop] +item=Whoopsie, id=10497, option=[null, null, null, null, drop] +item=Ava's attractor, id=10498, option=[null, Wear, null, null, Destroy] +item=Ava's accumulator, id=10499, option=[null, Wear, null, null, Destroy] +item=Crone-made amulet, id=10500, option=[null, Wear, null, null, Destroy] +item=Snowball, id=10501, option=[null, Wield, null, null, drop] +item=null, id=10502, option=[null, null, null, null, drop] +item=null, id=10503, option=[null, null, null, null, drop] +item=null, id=10504, option=[null, null, null, null, drop] +item=null, id=10505, option=[null, null, null, null, drop] +item=Gublinch shards, id=10506, option=[null, null, null, null, drop] +item=Reindeer hat, id=10507, option=[null, Wear, null, null, Destroy] +item=Wintumber tree, id=10508, option=[Plant, null, null, null, Destroy] +item=Snowball, id=10509, option=[null, null, null, null, drop] +item=Snowball, id=10510, option=[null, null, null, null, drop] +item=Zanaris choir, id=10511, option=[null, null, null, null, drop] +item=Scroll, id=10512, option=[Read, null, Write-Role, Clear, Destroy] +item=Crackers, id=10513, option=[Drop, null, null, null, Destroy] +item=Tofu, id=10514, option=[Drop, null, null, null, Destroy] +item=Worms, id=10515, option=[Drop, null, null, null, Destroy] +item=Attacker horn, id=10516, option=[Tell-red, Tell-green, Tell-blue, Medic, drop] +item=Attacker horn, id=10517, option=[Tell-red, Tell-green, Tell-blue, Medic, drop] +item=Attacker horn, id=10518, option=[Tell-red, Tell-green, Tell-blue, Medic, drop] +item=Attacker horn, id=10519, option=[Tell-red, Tell-green, Tell-blue, Medic, drop] +item=Attacker horn, id=10520, option=[Tell-red, Tell-green, Tell-blue, Medic, drop] +item=Collection bag, id=10521, option=[Look-in, Empty, null, null, drop] +item=Collection bag, id=10522, option=[Look-in, Empty, null, null, drop] +item=Collection bag, id=10523, option=[Look-in, Empty, null, null, drop] +item=Collection bag, id=10524, option=[Look-in, Empty, null, null, drop] +item=Collection bag, id=10525, option=[Look-in, Empty, null, null, drop] +item=Healer horn, id=10526, option=[Tell-tofu, Tell-crackers, Tell-worms, Medic, drop] +item=Healer horn, id=10527, option=[Tell-tofu, Tell-crackers, Tell-worms, Medic, drop] +item=Healer horn, id=10528, option=[Tell-tofu, Tell-crackers, Tell-worms, Medic, drop] +item=Healer horn, id=10529, option=[Tell-tofu, Tell-crackers, Tell-worms, Medic, drop] +item=Healer horn, id=10530, option=[Tell-tofu, Tell-crackers, Tell-worms, Medic, drop] +item=Green egg, id=10531, option=[null, null, null, null, Destroy] +item=Red egg, id=10532, option=[null, null, null, null, Destroy] +item=Blue egg, id=10533, option=[null, null, null, null, Destroy] +item=Yellow egg, id=10534, option=[null, null, null, null, drop] +item=Poisoned egg, id=10535, option=[null, null, null, null, drop] +item=Spiked/pois. egg, id=10536, option=[null, null, null, null, drop] +item=Omega egg, id=10537, option=[null, null, null, null, drop] +item=Defender horn, id=10538, option=[Tell-tofu, Tell-worms, Tell-meat, Medic, drop] +item=Poisoned tofu, id=10539, option=[null, null, null, null, Destroy] +item=Poisoned worms, id=10540, option=[null, null, null, null, Destroy] +item=Poisoned meat, id=10541, option=[null, null, null, null, Destroy] +item=Healing vial(4), id=10542, option=[null, null, null, null, Destroy] +item=Healing vial(3), id=10543, option=[null, null, null, null, Destroy] +item=Healing vial(2), id=10544, option=[null, null, null, null, Destroy] +item=Healing vial(1), id=10545, option=[null, null, null, null, Destroy] +item=Healing vial, id=10546, option=[null, null, null, null, Destroy] +item=Healer hat, id=10547, option=[null, Wear, null, null, Destroy] +item=Fighter hat, id=10548, option=[null, Wear, null, null, Destroy] +item=Runner hat, id=10549, option=[null, Wear, null, null, Destroy] +item=Ranger hat, id=10550, option=[null, Wear, null, null, Destroy] +item=Fighter torso, id=10551, option=[null, Wear, null, null, Destroy] +item=Runner boots, id=10552, option=[null, Wear, null, null, Destroy] +item=Penance gloves, id=10553, option=[null, Wear, null, null, Destroy] +item=Penance gloves, id=10554, option=[null, Wear, null, null, Destroy] +item=Penance skirt, id=10555, option=[null, Wear, null, null, Destroy] +item=Attacker icon, id=10556, option=[null, Wear, null, null, drop] +item=Collector icon, id=10557, option=[null, Wear, null, null, drop] +item=Defender icon, id=10558, option=[null, Wear, null, null, drop] +item=Healer icon, id=10559, option=[null, Wear, null, null, drop] +item=Collector horn, id=10560, option=[Tell-style1, Tell-style2, Tell-style3, Tell-style4, Medic] +item=Spikes, id=10561, option=[null, null, null, null, drop] +item=Queen help book, id=10562, option=[Read, null, null, null, Destroy] +item=No eggs, id=10563, option=[null, null, null, null, drop] +item=Granite body, id=10564, option=[null, Wear, null, null, drop] +item=Granite body, id=10565, option=[null, null, null, null, drop] +item=Fire cape, id=10566, option=[null, Wear, null, null, drop] +item=Thingy, id=10567, option=[null, Wear, null, null, drop] +item=Thingy, id=10568, option=[null, null, null, null, drop] +item=Thingy, id=10569, option=[null, Wear, null, null, drop] +item=Thingy, id=10570, option=[null, null, null, null, drop] +item=Thingy, id=10571, option=[null, Wear, null, null, drop] +item=Thingy, id=10572, option=[null, null, null, null, drop] +item=Thingy, id=10573, option=[null, Wear, null, null, drop] +item=Thingy, id=10574, option=[null, null, null, null, drop] +item=Thingy, id=10575, option=[null, Wear, null, null, drop] +item=Thingy, id=10576, option=[null, null, null, null, drop] +item=Thingy, id=10577, option=[null, Wear, null, null, drop] +item=Thingy, id=10578, option=[null, null, null, null, drop] +item=Thingy, id=10579, option=[null, Wear, null, null, drop] +item=Thingy, id=10580, option=[null, null, null, null, drop] +item=Keris, id=10581, option=[null, Wield, null, null, Destroy] +item=Keris(p), id=10582, option=[null, Wield, null, null, Destroy] +item=Keris(p+), id=10583, option=[null, Wield, null, null, Destroy] +item=Keris(p++), id=10584, option=[null, Wield, null, null, Destroy] +item=Parchment, id=10585, option=[Read, null, null, null, Destroy] +item=Combat lamp, id=10586, option=[Rub, null, null, null, Destroy] +item=Tarn's diary, id=10587, option=[null, Read, null, null, Destroy] +item=Salve amulet(e), id=10588, option=[null, Wear, null, null, drop] +item=Granite helm, id=10589, option=[null, Wear, null, null, drop] +item=Granite helm, id=10590, option=[null, null, null, null, drop] +item=Terror dog, id=10591, option=[null, null, null, null, drop] +item=Penguin bongos, id=10592, option=[Play, null, null, null, drop] +item=Cowbells, id=10593, option=[Play, null, null, null, drop] +item=Clockwork book, id=10594, option=[Read, null, null, null, drop] +item=Clockwork suit, id=10595, option=[Wind, null, null, null, Destroy] +item=Clockwork suit, id=10596, option=[null, null, null, Release, Destroy] +item=Mission report, id=10597, option=[Read, null, null, null, drop] +item=Mission report, id=10598, option=[Read, null, null, null, drop] +item=Mission report, id=10599, option=[Read, null, null, null, drop] +item=Kgp id card, id=10600, option=[null, null, null, null, drop] +item=Mystic hat, id=10601, option=[null, Wear, null, null, drop] +item=Mystic hat, id=10602, option=[null, Wear, null, null, drop] +item=Mystic hat, id=10603, option=[null, Wear, null, null, drop] +item=Skeletal helm, id=10604, option=[null, Wear, null, null, drop] +item=Infinity top, id=10605, option=[null, Wear, null, null, drop] +item=Splitbark helm, id=10606, option=[null, Wear, null, null, drop] +item=Ghostly boots, id=10607, option=[null, Wear, null, null, drop] +item=Moonclan hat, id=10608, option=[null, Wear, null, null, drop] +item=Lunar helm, id=10609, option=[null, Wear, null, null, Destroy] +item=Decorative armour, id=10610, option=[null, Wear, null, null, drop] +item=Void knight top, id=10611, option=[null, Wear, null, null, drop] +item=Rogue mask, id=10612, option=[null, Wear, null, null, drop] +item=Rock-shell helm, id=10613, option=[null, Wear, null, null, drop] +item=Spined helm, id=10614, option=[null, Wear, null, null, drop] +item=Tribal mask, id=10615, option=[null, Wear, null, null, drop] +item=Tribal mask, id=10616, option=[null, Wear, null, null, drop] +item=Tribal mask, id=10617, option=[null, Wear, null, null, drop] +item=White platebody, id=10618, option=[null, Wear, null, null, drop] +item=Initiate hauberk, id=10619, option=[null, Wear, null, null, drop] +item=Proselyte hauberk, id=10620, option=[null, Wear, null, null, drop] +item=Mourner top, id=10621, option=[null, Wear, null, null, drop] +item=Kyatt top, id=10622, option=[null, Wear, null, null, drop] +item=Larupia top, id=10623, option=[null, Wear, null, null, drop] +item=Graahk top, id=10624, option=[null, Wear, null, null, drop] +item=Wood camo top, id=10625, option=[null, Wear, null, null, drop] +item=Jungle camo top, id=10626, option=[null, Wear, null, null, drop] +item=Desert camo top, id=10627, option=[null, Wear, null, null, drop] +item=Polar camo top, id=10628, option=[null, Wear, null, null, drop] +item=Mime mask, id=10629, option=[null, Wear, null, null, drop] +item=Princess blouse, id=10630, option=[null, Wear, null, null, drop] +item=Zombie shirt, id=10631, option=[null, Wear, null, null, drop] +item=Camo top, id=10632, option=[null, Wear, null, null, drop] +item=Lederhosen top, id=10633, option=[null, Wear, null, null, drop] +item=Shade robe, id=10634, option=[null, Wear, null, null, drop] +item=Cape of legends, id=10635, option=[null, Wear, null, null, drop] +item=Obsidian cape, id=10636, option=[null, Wear, null, null, drop] +item=Fire cape, id=10637, option=[null, Wear, null, null, drop] +item=Team-1 cape, id=10638, option=[null, Wear, null, null, drop] +item=Attack cape, id=10639, option=[null, Wear, null, null, drop] +item=Strength cape, id=10640, option=[null, Wear, null, null, drop] +item=Defence cape, id=10641, option=[null, Wear, null, null, drop] +item=Ranging cape, id=10642, option=[null, Wear, null, null, drop] +item=Prayer cape, id=10643, option=[null, Wear, null, null, drop] +item=Magic cape, id=10644, option=[null, Wear, null, null, drop] +item=Runecraft cape, id=10645, option=[null, Wear, null, null, drop] +item=Hunter cape, id=10646, option=[null, Wear, null, null, drop] +item=Hitpoints cape, id=10647, option=[null, Wear, null, null, drop] +item=Agility cape, id=10648, option=[null, Wear, null, null, drop] +item=Herblore cape, id=10649, option=[null, Wear, null, null, drop] +item=Thieving cape, id=10650, option=[null, Wear, null, null, drop] +item=Crafting cape, id=10651, option=[null, Wear, null, null, drop] +item=Fletching cape, id=10652, option=[null, Wear, null, null, drop] +item=Slayer cape, id=10653, option=[null, Wear, null, null, drop] +item=Construct. cape, id=10654, option=[null, Wear, null, null, drop] +item=Mining cape, id=10655, option=[null, Wear, null, null, drop] +item=Smithing cape, id=10656, option=[null, Wear, null, null, drop] +item=Fishing cape, id=10657, option=[null, Wear, null, null, drop] +item=Cooking cape, id=10658, option=[null, Wear, null, null, drop] +item=Firemaking cape, id=10659, option=[null, Wear, null, null, drop] +item=Woodcutting cape, id=10660, option=[null, Wear, null, null, drop] +item=Farming cape, id=10661, option=[null, Wear, null, null, drop] +item=Quest point cape, id=10662, option=[null, Wear, null, null, drop] +item=Spotted cape, id=10663, option=[null, Wear, null, null, drop] +item=Spottier cape, id=10664, option=[null, Wear, null, null, drop] +item=Black shield(h1), id=10665, option=[null, Wear, null, null, drop] +item=Adamant shield(h1), id=10666, option=[null, Wear, null, null, drop] +item=Rune shield(h1), id=10667, option=[null, Wear, null, null, drop] +item=Black shield(h2), id=10668, option=[null, Wear, null, null, drop] +item=Adamant shield(h2), id=10669, option=[null, Wear, null, null, drop] +item=Rune shield(h2), id=10670, option=[null, Wear, null, null, drop] +item=Black shield(h3), id=10671, option=[null, Wear, null, null, drop] +item=Adamant shield(h3), id=10672, option=[null, Wear, null, null, drop] +item=Rune shield(h3), id=10673, option=[null, Wear, null, null, drop] +item=Black shield(h4), id=10674, option=[null, Wear, null, null, drop] +item=Adamant shield(h4), id=10675, option=[null, Wear, null, null, drop] +item=Rune shield(h4), id=10676, option=[null, Wear, null, null, drop] +item=Black shield(h5), id=10677, option=[null, Wear, null, null, drop] +item=Adamant shield(h5), id=10678, option=[null, Wear, null, null, drop] +item=Rune shield(h5), id=10679, option=[null, Wear, null, null, drop] +item=Studded body (g), id=10680, option=[null, Wear, null, null, drop] +item=Studded body (t), id=10681, option=[null, Wear, null, null, drop] +item=D'hide body(g), id=10682, option=[null, Wear, null, null, drop] +item=D'hide body (t), id=10683, option=[null, Wear, null, null, drop] +item=D'hide body (g), id=10684, option=[null, Wear, null, null, drop] +item=D'hide body (t), id=10685, option=[null, Wear, null, null, drop] +item=Wizard robe (g), id=10686, option=[null, Wear, null, null, drop] +item=Wizard robe (t), id=10687, option=[null, Wear, null, null, drop] +item=Enchanted top, id=10688, option=[null, Wear, null, null, drop] +item=Wizard boots, id=10689, option=[null, Wear, null, null, drop] +item=Black platebody (t), id=10690, option=[null, Wear, null, null, drop] +item=Black platebody (g), id=10691, option=[null, Wear, null, null, drop] +item=Highwayman mask, id=10692, option=[null, Wear, null, null, drop] +item=Blue beret, id=10693, option=[null, Wear, null, null, drop] +item=Black beret, id=10694, option=[null, Wear, null, null, drop] +item=White beret, id=10695, option=[null, Wear, null, null, drop] +item=Ranger boots, id=10696, option=[null, Wear, null, null, drop] +item=Adam platebody (t), id=10697, option=[null, Wear, null, null, drop] +item=Adam platebody (g), id=10698, option=[null, Wear, null, null, drop] +item=Black helm (h1), id=10699, option=[null, Wear, null, null, drop] +item=Black helm (h2), id=10700, option=[null, Wear, null, null, drop] +item=Black helm (h3), id=10701, option=[null, Wear, null, null, drop] +item=Black helm (h4), id=10702, option=[null, Wear, null, null, drop] +item=Black helm (h5), id=10703, option=[null, Wear, null, null, drop] +item=Rune helm (h1), id=10704, option=[null, Wear, null, null, drop] +item=Rune helm (h2), id=10705, option=[null, Wear, null, null, drop] +item=Rune helm (h3), id=10706, option=[null, Wear, null, null, drop] +item=Rune helm (h4), id=10707, option=[null, Wear, null, null, drop] +item=Rune helm (h5), id=10708, option=[null, Wear, null, null, drop] +item=Adamant helm (h1), id=10709, option=[null, Wear, null, null, drop] +item=Adamant helm (h2), id=10710, option=[null, Wear, null, null, drop] +item=Adamant helm (h3), id=10711, option=[null, Wear, null, null, drop] +item=Adamant helm (h4), id=10712, option=[null, Wear, null, null, drop] +item=Adamant helm (h5), id=10713, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10714, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10715, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10716, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10717, option=[null, Wear, null, null, drop] +item=Bob shirt, id=10718, option=[null, Wear, null, null, drop] +item=Amulet of glory(t), id=10719, option=[null, Wear, null, Rub, drop] +item=Guthix cape, id=10720, option=[null, Wear, null, null, drop] +item=Frog mask, id=10721, option=[null, Wear, null, null, drop] +item=Reindeer hat, id=10722, option=[null, Wear, null, null, Destroy] +item=Jack lantern mask, id=10723, option=[null, Wear, null, null, Destroy] +item=Skeleton boots, id=10724, option=[null, Wear, null, null, Destroy] +item=Skeleton gloves, id=10725, option=[null, Wear, null, null, Destroy] +item=Skeleton leggings, id=10726, option=[null, Wear, null, null, Destroy] +item=Skeleton shirt, id=10727, option=[null, Wear, null, null, Destroy] +item=Skeleton mask, id=10728, option=[null, Wear, null, null, Destroy] +item=Easter ring, id=10729, option=[null, Wear, null, null, drop] +item=Blue marionette, id=10730, option=[Jump, Walk, Bow, Dance, Destroy] +item=Zombie head, id=10731, option=[Talk-At, Display, Question, null, drop] +item=Rubber chicken, id=10732, option=[null, Wield, Dance, null, drop] +item=Yo-yo, id=10733, option=[Play, Loop, Walk, Crazy, drop] +item=Bunny ears, id=10734, option=[null, Wear, null, null, drop] +item=Scythe, id=10735, option=[null, Wield, null, null, drop] +item=Strength amulet(t), id=10736, option=[null, Wear, null, null, drop] +item=Cheat, id=10737, option=[null, null, null, null, drop] +item=Amulet of magic(t), id=10738, option=[null, Wear, null, null, drop] +item=Cheat, id=10739, option=[null, null, null, null, drop] +item=A powdered wig, id=10740, option=[null, Wear, null, null, drop] +item=Cheat, id=10741, option=[null, null, null, null, drop] +item=Flared trousers, id=10742, option=[null, Wear, null, null, drop] +item=Cheat, id=10743, option=[null, null, null, null, drop] +item=Pantaloons, id=10744, option=[null, Wear, null, null, drop] +item=Cheat, id=10745, option=[null, null, null, null, drop] +item=Sleeping cap, id=10746, option=[null, Wear, null, null, drop] +item=Cheat, id=10747, option=[null, null, null, null, drop] +item=Elegant shirt, id=10748, option=[null, Wear, null, null, drop] +item=Cheat, id=10749, option=[null, null, null, null, drop] +item=Elegant shirt, id=10750, option=[null, Wear, null, null, drop] +item=Cheat, id=10751, option=[null, null, null, null, drop] +item=Elegant shirt, id=10752, option=[null, Wear, null, null, drop] +item=Cheat, id=10753, option=[null, null, null, null, drop] +item=Elegant shirt, id=10754, option=[null, Wear, null, null, drop] +item=Cheat, id=10755, option=[null, null, null, null, drop] +item=Elegant shirt, id=10756, option=[null, Wear, null, null, drop] +item=Cheat, id=10757, option=[null, null, null, null, drop] +item=Red boater, id=10758, option=[null, Wear, null, null, drop] +item=Cheat, id=10759, option=[null, null, null, null, drop] +item=Orange boater, id=10760, option=[null, Wear, null, null, drop] +item=Cheat, id=10761, option=[null, null, null, null, drop] +item=Green boater, id=10762, option=[null, Wear, null, null, drop] +item=Cheat, id=10763, option=[null, null, null, null, drop] +item=Blue boater, id=10764, option=[null, Wear, null, null, drop] +item=Cheat, id=10765, option=[null, null, null, null, drop] +item=Black boater, id=10766, option=[null, Wear, null, null, drop] +item=Cheat, id=10767, option=[null, null, null, null, drop] +item=Red headband, id=10768, option=[null, Wear, null, null, drop] +item=Cheat, id=10769, option=[null, null, null, null, drop] +item=Black headband, id=10770, option=[null, Wear, null, null, drop] +item=Cheat, id=10771, option=[null, null, null, null, drop] +item=Brown headband, id=10772, option=[null, Wear, null, null, drop] +item=Cheat, id=10773, option=[null, null, null, null, drop] +item=Pirate's hat, id=10774, option=[null, Wear, null, null, drop] +item=Cheat, id=10775, option=[null, null, null, null, drop] +item=Zamorak platebody, id=10776, option=[null, Wear, null, null, drop] +item=Cheat, id=10777, option=[null, null, null, null, drop] +item=Saradomin plate, id=10778, option=[null, Wear, null, null, drop] +item=Cheat, id=10779, option=[null, null, null, null, drop] +item=Guthix platebody, id=10780, option=[null, Wear, null, null, drop] +item=Cheat, id=10781, option=[null, null, null, null, drop] +item=Gilded platebody, id=10782, option=[null, Wear, null, null, drop] +item=Cheat, id=10783, option=[null, null, null, null, drop] +item=Saradomin robe top, id=10784, option=[null, Wear, null, null, drop] +item=Cheat, id=10785, option=[null, null, null, null, drop] +item=Zamorak robe top, id=10786, option=[null, Wear, null, null, drop] +item=Cheat, id=10787, option=[null, null, null, null, drop] +item=Guthix robe top, id=10788, option=[null, Wear, null, null, drop] +item=Cheat, id=10789, option=[null, null, null, null, drop] +item=Zamorak d'hide, id=10790, option=[null, Wear, null, null, drop] +item=Cheat, id=10791, option=[null, null, null, null, drop] +item=Saradomin d'hide, id=10792, option=[null, Wear, null, null, drop] +item=Cheat, id=10793, option=[null, null, null, null, drop] +item=Guthix dragonhide, id=10794, option=[null, Wear, null, null, drop] +item=Cheat, id=10795, option=[null, null, null, null, drop] +item=Robin hood hat, id=10796, option=[null, Wear, null, null, drop] +item=Cheat, id=10797, option=[null, null, null, null, drop] +item=Rune platebody (g), id=10798, option=[null, Wear, null, null, drop] +item=Cheat, id=10799, option=[null, null, null, null, drop] +item=Rune platebody (t), id=10800, option=[null, Wear, null, null, drop] +item=Cheat, id=10801, option=[null, null, null, null, drop] +item=Tan cavalier, id=10802, option=[null, Wear, null, null, drop] +item=Cheat, id=10803, option=[null, null, null, null, drop] +item=Dark cavalier, id=10804, option=[null, Wear, null, null, drop] +item=Cheat, id=10805, option=[null, null, null, null, drop] +item=Black cavalier, id=10806, option=[null, Wear, null, null, drop] +item=Cheat, id=10807, option=[null, null, null, null, drop] +item=Arctic pyre logs, id=10808, option=[null, null, null, null, drop] +item=Arctic pyre logs, id=10809, option=[null, null, null, null, drop] +item=Arctic pine logs, id=10810, option=[null, null, null, null, drop] +item=Arctic pine logs, id=10811, option=[null, null, null, null, drop] +item=Split log, id=10812, option=[null, null, null, null, drop] +item=Split log, id=10813, option=[null, null, null, null, drop] +item=Hair, id=10814, option=[null, null, null, null, drop] +item=Hair, id=10815, option=[null, null, null, null, drop] +item=Raw yak meat, id=10816, option=[null, null, null, null, drop] +item=Raw yak meat, id=10817, option=[null, null, null, null, drop] +item=Yak-hide, id=10818, option=[null, null, null, null, drop] +item=Yak-hide, id=10819, option=[null, null, null, null, drop] +item=Cured yak-hide, id=10820, option=[null, null, null, null, drop] +item=Cured yak-hide, id=10821, option=[null, null, null, null, drop] +item=Yak-hide armour, id=10822, option=[null, Wear, null, null, drop] +item=Yak-hide armour, id=10823, option=[null, null, null, null, drop] +item=Yak-hide armour, id=10824, option=[null, Wear, null, null, drop] +item=Yak-hide armour, id=10825, option=[null, null, null, null, drop] +item=Fremennik shield, id=10826, option=[null, Wield, null, null, drop] +item=Fremennik shield, id=10827, option=[null, null, null, null, drop] +item=Helm of neitiznot, id=10828, option=[null, Wear, null, null, drop] +item=Documents, id=10829, option=[Open note, null, null, null, Destroy] +item=Royal decree, id=10830, option=[null, null, null, null, Destroy] +item=Empty tax bag, id=10831, option=[Check tax, null, null, null, Destroy] +item=Light tax bag, id=10832, option=[Check tax, null, null, null, Destroy] +item=Normal tax bag, id=10833, option=[Check tax, null, null, null, Destroy] +item=Hefty tax bag, id=10834, option=[Check tax, null, null, null, Destroy] +item=Bulging taxbag, id=10835, option=[Check taxes, null, null, null, Destroy] +item=Silly jester hat, id=10836, option=[null, Wear, null, null, Destroy] +item=Silly jester top, id=10837, option=[null, Wear, null, null, Destroy] +item=Silly jester tights, id=10838, option=[null, Wear, null, null, Destroy] +item=Silly jester boots, id=10839, option=[null, Wear, null, null, Destroy] +item=A jester stick, id=10840, option=[null, Wield, null, null, drop] +item=Apricot cream pie, id=10841, option=[null, null, null, null, drop] +item=Decapitated head, id=10842, option=[null, null, null, null, Destroy] +item=Helm of neitiznot, id=10843, option=[null, null, null, null, drop] +item=Spring sq'irk, id=10844, option=[null, null, null, null, drop] +item=Summer sq'irk, id=10845, option=[null, null, null, null, drop] +item=Autumn sq'irk, id=10846, option=[null, null, null, null, drop] +item=Winter sq'irk, id=10847, option=[null, null, null, null, drop] +item=Spring sq'irkjuice, id=10848, option=[Drink, null, null, null, drop] +item=Summer sq'irkjuice, id=10849, option=[Drink, null, null, null, drop] +item=Autumn sq'irkjuice, id=10850, option=[Drink, null, null, null, drop] +item=Winter sq'irkjuice, id=10851, option=[Drink, null, null, null, drop] +item=Summer garden, id=10852, option=[null, null, null, null, drop] +item=Spring garden, id=10853, option=[null, null, null, null, drop] +item=Autumn garden, id=10854, option=[null, null, null, null, drop] +item=Winter garden, id=10855, option=[null, null, null, null, drop] +item=Sin seer's note, id=10856, option=[null, null, null, null, Destroy] +item=Severed leg, id=10857, option=[null, null, null, null, Destroy] +item=Shadow sword, id=10858, option=[null, Wield, null, null, Destroy] +item=Tea flask, id=10859, option=[Drink, Look-in, null, null, drop] +item=Tea flask, id=10860, option=[null, Use, null, null, drop] +item=Tea flask, id=10861, option=[null, Use, null, null, drop] +item=Hard hat, id=10862, option=[null, Wear, null, null, Destroy] +item=Builder's shirt, id=10863, option=[null, Wear, null, null, Destroy] +item=Builder's trousers, id=10864, option=[null, Wear, null, null, Destroy] +item=Builder's boots, id=10865, option=[null, Wear, null, null, Destroy] +item=Rivets, id=10866, option=[null, null, null, null, drop] +item=null, id=10867, option=[null, null, null, null, drop] +item=null, id=10868, option=[null, null, null, null, drop] +item=null, id=10869, option=[null, null, null, null, drop] +item=Binding fluid, id=10870, option=[null, null, null, null, drop] +item=Pipe, id=10871, option=[null, null, null, null, drop] +item=Pipe ring, id=10872, option=[null, null, null, null, drop] +item=Metal sheet, id=10873, option=[null, null, null, null, drop] +item=Coloured ball, id=10874, option=[null, null, null, null, drop] +item=Valve wheel, id=10875, option=[null, null, null, null, drop] +item=Metal bar, id=10876, option=[null, null, null, null, drop] +item=Plain satchel, id=10877, option=[Inspect, Wear, null, Empty, drop] +item=Green satchel, id=10878, option=[Inspect, Wear, null, Empty, drop] +item=Red satchel, id=10879, option=[Inspect, Wear, null, Empty, drop] +item=Black satchel, id=10880, option=[Inspect, Wear, null, Empty, drop] +item=Gold satchel, id=10881, option=[Inspect, Wear, null, Empty, drop] +item=Rune satchel, id=10882, option=[Inspect, Wear, null, Empty, drop] +item=Hard hat, id=10883, option=[null, Wear, null, null, Destroy] +item=Fuse, id=10884, option=[null, null, null, null, drop] +item=Keg, id=10885, option=[null, null, null, null, drop] +item=Prayer book, id=10886, option=[null, null, null, null, drop] +item=Barrelchest anchor, id=10887, option=[null, Wield, null, null, Destroy] +item=Barrelchest anchor, id=10888, option=[null, null, null, null, drop] +item=Blessed lamp, id=10889, option=[Pray-over, null, null, null, Destroy] +item=Prayer book, id=10890, option=[Read, Recite-prayer, null, null, Destroy] +item=Wooden cat, id=10891, option=[null, null, null, null, drop] +item=Wooden cat, id=10892, option=[null, null, null, null, drop] +item=Cranial clamp, id=10893, option=[null, null, null, null, drop] +item=Brain tongs, id=10894, option=[null, null, null, null, drop] +item=Bell jar, id=10895, option=[null, null, null, null, drop] +item=Wolf whistle, id=10896, option=[Blow, null, null, null, drop] +item=Shipping order, id=10897, option=[null, null, null, null, drop] +item=Keg, id=10898, option=[null, null, null, null, drop] +item=Crate part, id=10899, option=[null, null, null, null, drop] +item=null, id=10900, option=[null, null, null, null, drop] +item=null, id=10901, option=[null, null, null, null, drop] +item=null, id=10902, option=[null, null, null, null, drop] +item=null, id=10903, option=[null, null, null, null, drop] +item=Skull staple, id=10904, option=[null, null, null, null, drop] +item=null, id=10905, option=[null, null, null, null, drop] +item=null, id=10906, option=[null, null, null, null, drop] +item=null, id=10907, option=[null, null, null, null, drop] +item=null, id=10908, option=[null, null, null, null, drop] +item=Mixture - step 1(4), id=10909, option=[null, null, null, Empty, drop] +item=Mixture - step 1(4), id=10910, option=[null, null, null, null, drop] +item=Mixture - step 1(3), id=10911, option=[null, null, null, Empty, drop] +item=Mixture - step 1(3), id=10912, option=[null, null, null, null, drop] +item=Mixture - step 1(2), id=10913, option=[null, null, null, Empty, drop] +item=Mixture - step 1(2), id=10914, option=[null, null, null, null, drop] +item=Mixture - step 1(1), id=10915, option=[null, null, null, Empty, drop] +item=Mixture - step 1(1), id=10916, option=[null, null, null, null, drop] +item=Mixture - step 2(4), id=10917, option=[null, null, null, Empty, drop] +item=Mixture - step 2(4), id=10918, option=[null, null, null, null, drop] +item=Mixture - step 2(3), id=10919, option=[null, null, null, Empty, drop] +item=Mixture - step 2(3), id=10920, option=[null, null, null, null, drop] +item=Mixture - step 2(2), id=10921, option=[null, null, null, Empty, drop] +item=Mixture - step 2(2), id=10922, option=[null, null, null, null, drop] +item=Mixture - step 2(1), id=10923, option=[null, null, null, Empty, drop] +item=Mixture - step 2(1), id=10924, option=[null, null, null, null, drop] +item=Sanfew serum(4), id=10925, option=[Drink, null, null, Empty, drop] +item=Sanfew serum(4), id=10926, option=[null, null, null, null, drop] +item=Sanfew serum(3), id=10927, option=[Drink, null, null, Empty, drop] +item=Sanfew serum(3), id=10928, option=[null, null, null, null, drop] +item=Sanfew serum(2), id=10929, option=[Drink, null, null, Empty, drop] +item=Sanfew serum(2), id=10930, option=[null, null, null, null, drop] +item=Sanfew serum(1), id=10931, option=[Drink, null, null, Empty, drop] +item=Sanfew serum(1), id=10932, option=[null, null, null, null, drop] +item=Lumberjack boots, id=10933, option=[null, Wear, null, null, drop] +item=Reward token, id=10934, option=[Look-at, null, null, null, Destroy] +item=Reward token, id=10935, option=[Look-at, null, null, null, Destroy] +item=Reward token, id=10936, option=[Look-at, null, null, null, Destroy] +item=Nail beast nails, id=10937, option=[null, null, null, null, drop] +item=Nail beast nails, id=10938, option=[null, null, null, null, drop] +item=Lumberjack top, id=10939, option=[null, Wear, null, null, drop] +item=Lumberjack legs, id=10940, option=[null, Wear, null, null, drop] +item=Lumberjack hat, id=10941, option=[null, Wear, null, null, drop] +item=Reward token, id=10942, option=[Look-at, null, null, null, Destroy] +item=Reward token, id=10943, option=[Look-at, null, null, null, Destroy] +item=Reward token, id=10944, option=[Look-at, null, null, null, Destroy] +item=Lumberjack top, id=10945, option=[null, Wear, null, null, drop] +item=Pushup, id=10946, option=[null, null, null, null, drop] +item=Run, id=10947, option=[null, null, null, null, drop] +item=Situp, id=10948, option=[null, null, null, null, drop] +item=Starjump, id=10949, option=[null, null, null, null, drop] +item=Skull staples, id=10950, option=[null, null, null, null, drop] +item=Skull staples, id=10951, option=[null, null, null, null, drop] +item=Slayer bell, id=10952, option=[Ring, null, null, null, drop] +item=Slayer bell, id=10953, option=[null, null, null, null, drop] +item=Frog-leather body, id=10954, option=[null, Wear, null, null, drop] +item=Frog-leather body, id=10955, option=[null, null, null, null, drop] +item=Frog-leather chaps, id=10956, option=[null, Wear, null, null, drop] +item=Frog-leather chaps, id=10957, option=[null, null, null, null, drop] +item=Frog-leather boots, id=10958, option=[null, Wear, null, null, drop] +item=Frog-leather boots, id=10959, option=[null, null, null, null, drop] +item=Green gloop soup, id=10960, option=[Eat, null, null, null, drop] +item=Frogspawn gumbo, id=10961, option=[Eat, null, null, null, drop] +item=Frogburger, id=10962, option=[Eat, null, null, null, drop] +item=Coated frogs' legs, id=10963, option=[Eat, null, null, null, drop] +item=Bat shish, id=10964, option=[Eat, null, null, null, drop] +item=Fingers, id=10965, option=[Eat, null, null, null, drop] +item=Grubs ? la mode, id=10966, option=[Eat, null, null, null, drop] +item=Roast frog, id=10967, option=[Eat, null, null, null, drop] +item=Mushrooms, id=10968, option=[Eat, null, null, null, drop] +item=Fillets, id=10969, option=[Eat, null, null, null, drop] +item=Loach, id=10970, option=[Eat, null, null, null, drop] +item=Eel sushi, id=10971, option=[Eat, null, null, null, drop] +item=Dorgesh-kaan sphere, id=10972, option=[Break, null, null, null, drop] +item=Light orb, id=10973, option=[null, null, null, null, drop] +item=Light orb, id=10974, option=[null, null, null, null, drop] +item=Spanner, id=10975, option=[null, null, null, null, drop] +item=Long bone, id=10976, option=[Bury, null, null, null, drop] +item=Curved bone, id=10977, option=[Bury, null, null, null, drop] +item=Swamp weed, id=10978, option=[null, null, null, null, drop] +item=Swamp weed, id=10979, option=[null, null, null, null, drop] +item=Empty light orb, id=10980, option=[null, null, null, null, drop] +item=Cave goblin wire, id=10981, option=[null, null, null, null, drop] +item=Cave goblin wire, id=10982, option=[null, null, null, null, drop] +item=Cog, id=10983, option=[null, null, null, null, Destroy] +item=Cog, id=10984, option=[null, null, null, null, Destroy] +item=Fuse, id=10985, option=[null, null, null, null, Destroy] +item=Fuse, id=10986, option=[null, null, null, null, Destroy] +item=Meter, id=10987, option=[null, null, null, null, Destroy] +item=Meter, id=10988, option=[null, null, null, null, Destroy] +item=Capacitor, id=10989, option=[null, null, null, null, Destroy] +item=Capacitor, id=10990, option=[null, null, null, null, Destroy] +item=Lever, id=10991, option=[null, null, null, null, Destroy] +item=Lever, id=10992, option=[null, null, null, null, Destroy] +item=Powerbox, id=10993, option=[null, null, null, null, Destroy] +item=Powerbox, id=10994, option=[null, null, null, null, Destroy] +item=Perfect shell, id=10995, option=[null, null, null, null, drop] +item=Perfect snail shell, id=10996, option=[null, null, null, null, drop] +item=Molanisk, id=10997, option=[null, null, null, null, drop] +item=Cave goblin, id=10998, option=[null, null, null, null, drop] +item=Goblin book, id=10999, option=[Read, null, null, null, drop] +item=Whoopsie, id=11000, option=[null, null, null, null, drop] +item=Dagon'hai history, id=11001, option=[Read, null, null, null, Destroy] +item=Sin'keth's diary, id=11002, option=[Read, null, null, null, Destroy] +item=An empty folder, id=11003, option=[Read, null, null, null, Destroy] +item=null, id=11004, option=[null, null, null, null, drop] +item=null, id=11005, option=[null, null, null, null, drop] +item=Used folder, id=11006, option=[Read, null, null, null, Destroy] +item=Full folder, id=11007, option=[Read, null, null, null, Destroy] +item=Rat's paper, id=11008, option=[Read, null, null, null, Destroy] +item=Rat's letter, id=11009, option=[Read, null, null, null, Destroy] +item=Surok's letter, id=11010, option=[Read, null, null, null, Destroy] +item=Zaff's instructions, id=11011, option=[Read, null, null, null, drop] +item=Wand, id=11012, option=[null, null, null, null, Destroy] +item=Infused wand, id=11013, option=[null, null, null, null, Destroy] +item=Beacon ring, id=11014, option=[null, Wear, Operate, null, Destroy] +item=Chicken head, id=11015, option=[null, null, null, null, drop] +item=Chicken feet, id=11016, option=[null, null, null, null, drop] +item=Chicken wings, id=11017, option=[null, null, null, null, drop] +item=Chicken legs, id=11018, option=[null, null, null, null, drop] +item=Chicken feet, id=11019, option=[null, Wear, null, null, Destroy] +item=Chicken wings, id=11020, option=[null, Wear, null, null, Destroy] +item=Chicken head, id=11021, option=[null, Wear, null, null, Destroy] +item=Chicken legs, id=11022, option=[null, Wear, null, null, Destroy] +item=Magic egg, id=11023, option=[Eat, null, null, null, Destroy] +item=Rabbit mould, id=11024, option=[null, null, null, null, Destroy] +item=Chocolate chunks, id=11025, option=[null, null, null, null, drop] +item=Chocolate kebbit, id=11026, option=[Eat, null, null, null, Drop] +item=Easter egg, id=11027, option=[Release, null, null, null, Destroy] +item=Easter egg, id=11028, option=[Release, null, null, null, Destroy] +item=Easter egg, id=11029, option=[Release, null, null, null, Destroy] +item=Easter egg, id=11030, option=[Release, null, null, null, Destroy] +item=Damp planks, id=11031, option=[null, null, null, null, Destroy] +item=Crude carving, id=11032, option=[null, null, null, null, Destroy] +item=Cruder carving, id=11033, option=[null, null, null, null, Destroy] +item=Sven's last map, id=11034, option=[Read, null, null, null, Destroy] +item=Windswept logs, id=11035, option=[null, null, null, null, Destroy] +item=Parchment, id=11036, option=[Read, null, null, null, Destroy] +item=Brine sabre, id=11037, option=[null, Wield, null, null, drop] +item=Brine sabre, id=11038, option=[null, null, null, null, drop] +item=Key, id=11039, option=[null, null, null, null, Destroy] +item=Key, id=11040, option=[null, null, null, null, Destroy] +item=Key, id=11041, option=[null, null, null, null, Destroy] +item=Key, id=11042, option=[null, null, null, null, Destroy] +item=Key, id=11043, option=[null, null, null, null, Destroy] +item=Rotten barrel, id=11044, option=[null, null, null, null, drop] +item=Rotten barrel, id=11045, option=[null, null, null, null, Destroy] +item=Rope, id=11046, option=[null, null, null, null, drop] +item=Brine rat, id=11047, option=[null, null, null, null, drop] +item=Armour shard, id=11048, option=[null, null, null, null, drop] +item=Artefact, id=11049, option=[null, null, null, null, drop] +item=Axe head, id=11050, option=[null, null, null, null, drop] +item=Artefact, id=11051, option=[null, null, null, null, drop] +item=Helmet fragment, id=11052, option=[null, null, null, null, drop] +item=Artefact, id=11053, option=[null, null, null, null, drop] +item=Shield fragment, id=11054, option=[null, null, null, null, drop] +item=Artefact, id=11055, option=[null, null, null, null, drop] +item=Sword fragment, id=11056, option=[null, null, null, null, drop] +item=Artefact, id=11057, option=[null, null, null, null, drop] +item=Mace, id=11058, option=[null, null, null, null, drop] +item=Artefact, id=11059, option=[null, null, null, null, drop] +item=Goblin village sphere, id=11060, option=[Break, null, null, null, drop] +item=Ancient mace, id=11061, option=[null, Wield, null, null, drop] +item=Zanik (slice), id=11062, option=[null, null, null, null, drop] +item=null, id=11063, option=[null, null, null, null, drop] +item=Ancient mace, id=11064, option=[null, null, null, null, drop] +item=Bracelet mould, id=11065, option=[null, null, null, null, drop] +item=Bracelet mould, id=11066, option=[null, null, null, null, drop] +item=null, id=11067, option=[null, null, null, null, drop] +item=null, id=11068, option=[null, Wear, null, null, drop] +item=Gold bracelet, id=11069, option=[null, Wear, null, null, drop] +item=Gold bracelet, id=11070, option=[null, null, null, null, drop] +item=null, id=11071, option=[null, Wear, null, null, drop] +item=Sapphire bracelet, id=11072, option=[null, Wear, null, null, drop] +item=Sapphire bracelet, id=11073, option=[null, null, null, null, drop] +item=Bracelet of clay, id=11074, option=[null, Wear, null, null, drop] +item=Bracelet of clay, id=11075, option=[null, null, null, null, drop] +item=Emerald bracelet, id=11076, option=[null, Wear, null, null, drop] +item=Emerald bracelet, id=11077, option=[null, null, null, null, drop] +item=null, id=11078, option=[null, Wear, null, null, drop] +item=Castlewar brace(3), id=11079, option=[null, Wear, null, null, drop] +item=Castlewar brace(3), id=11080, option=[null, null, null, null, drop] +item=Castlewar brace(2), id=11081, option=[null, Wear, null, null, drop] +item=Castlewar brace(2), id=11082, option=[null, null, null, null, drop] +item=Castlewar brace(1), id=11083, option=[null, Wear, null, null, drop] +item=Castlewar brace(1), id=11084, option=[null, null, null, null, drop] +item=Ruby bracelet, id=11085, option=[null, Wear, null, null, drop] +item=Ruby bracelet, id=11086, option=[null, null, null, null, drop] +item=null, id=11087, option=[null, Wear, null, null, drop] +item=Inoculation brace, id=11088, option=[null, Wear, null, null, drop] +item=Inoculation brace, id=11089, option=[null, null, null, null, drop] +item=Phoenix necklace, id=11090, option=[null, Wear, null, null, drop] +item=Phoenix necklace, id=11091, option=[null, null, null, null, drop] +item=Diamond bracelet, id=11092, option=[null, Wear, null, null, drop] +item=Diamond bracelet, id=11093, option=[null, null, null, null, drop] +item=null, id=11094, option=[null, Wear, null, null, drop] +item=Forinthry brace(5), id=11095, option=[null, Wear, null, null, drop] +item=Forinthry brace(5), id=11096, option=[null, null, null, null, drop] +item=Forinthry brace(4), id=11097, option=[null, Wear, null, null, drop] +item=Forinthry brace(4), id=11098, option=[null, null, null, null, drop] +item=Forinthry brace(3), id=11099, option=[null, Wear, null, null, drop] +item=Forinthry brace(3), id=11100, option=[null, null, null, null, drop] +item=Forinthry brace(2), id=11101, option=[null, Wear, null, null, drop] +item=Forinthry brace(2), id=11102, option=[null, null, null, null, drop] +item=Forinthry brace(1), id=11103, option=[null, Wear, null, null, drop] +item=Forinthry brace(1), id=11104, option=[null, null, null, null, drop] +item=Skills necklace(4), id=11105, option=[null, Wear, null, Rub, drop] +item=Skills necklace(4), id=11106, option=[null, null, null, null, drop] +item=Skills necklace(3), id=11107, option=[null, Wear, null, Rub, drop] +item=Skills necklace(3), id=11108, option=[null, null, null, null, drop] +item=Skills necklace(2), id=11109, option=[null, Wear, null, Rub, drop] +item=Skills necklace(2), id=11110, option=[null, null, null, null, drop] +item=Skills necklace(1), id=11111, option=[null, Wear, null, Rub, drop] +item=Skills necklace(1), id=11112, option=[null, null, null, null, drop] +item=Skills necklace, id=11113, option=[null, Wear, null, Rub, drop] +item=Skills necklace, id=11114, option=[null, null, null, null, drop] +item=Dragon bracelet, id=11115, option=[null, Wear, null, null, drop] +item=Dragon bracelet, id=11116, option=[null, null, null, null, drop] +item=null, id=11117, option=[null, Wear, null, null, drop] +item=Combat bracelet(4), id=11118, option=[null, Wear, null, Rub, drop] +item=Combat bracelet(4), id=11119, option=[null, null, null, null, drop] +item=Combat bracelet(3), id=11120, option=[null, Wear, null, Rub, drop] +item=Combat bracelet(3), id=11121, option=[null, null, null, null, drop] +item=Combat bracelet(2), id=11122, option=[null, Wear, null, Rub, drop] +item=Combat bracelet(2), id=11123, option=[null, null, null, null, drop] +item=Combat bracelet(1), id=11124, option=[null, Wear, null, Rub, drop] +item=Combat bracelet(1), id=11125, option=[null, null, null, null, drop] +item=Combat bracelet, id=11126, option=[null, Wear, null, Rub, drop] +item=Combat bracelet, id=11127, option=[null, null, null, null, drop] +item=Berserker necklace, id=11128, option=[null, Wear, null, null, drop] +item=Berserker necklace, id=11129, option=[null, null, null, null, drop] +item=Onyx bracelet, id=11130, option=[null, Wear, null, null, drop] +item=Onyx bracelet, id=11131, option=[null, null, null, null, drop] +item=null, id=11132, option=[null, Wear, null, null, drop] +item=Regen bracelet, id=11133, option=[null, Wear, null, null, drop] +item=Regen bracelet, id=11134, option=[null, null, null, null, drop] +item=Bomber jacket, id=11135, option=[null, null, null, null, drop] +item=Karamja gloves 1, id=11136, option=[null, Wear, null, null, Destroy] +item=Antique lamp, id=11137, option=[Rub, null, null, null, Destroy] +item=Karamja gloves 2, id=11138, option=[null, Wear, null, null, Destroy] +item=Antique lamp, id=11139, option=[Rub, null, null, null, Destroy] +item=Karamja gloves 3, id=11140, option=[null, Wear, Activate, null, Destroy] +item=Antique lamp, id=11141, option=[Rub, null, null, null, Destroy] +item=null, id=11142, option=[null, null, null, null, drop] +item=null, id=11143, option=[null, null, null, null, drop] +item=null, id=11144, option=[null, null, null, null, drop] +item=null, id=11145, option=[null, null, null, null, drop] +item=null, id=11146, option=[null, null, null, null, drop] +item=null, id=11147, option=[null, null, null, null, drop] +item=null, id=11148, option=[null, null, null, null, drop] +item=null, id=11149, option=[null, null, null, null, drop] +item=null, id=11150, option=[null, null, null, null, drop] +item=Dream vial (empty), id=11151, option=[null, null, null, null, Destroy] +item=Dream vial (water), id=11152, option=[null, null, null, null, Destroy] +item=Dream vial (herb), id=11153, option=[null, null, null, null, Destroy] +item=Dream potion, id=11154, option=[null, null, null, null, Destroy] +item=Ground astral rune, id=11155, option=[null, null, null, null, Destroy] +item=Astral rune shards, id=11156, option=[null, null, null, null, Destroy] +item=Dreamy lamp, id=11157, option=[Rub, null, null, null, Destroy] +item=Cyrisus's chest, id=11158, option=[Look-in, null, null, null, Destroy] +item=Hunter kit, id=11159, option=[Open, null, null, null, Destroy] +item=null, id=11160, option=[null, null, null, null, drop] +item=null, id=11161, option=[null, null, null, null, drop] +item=null, id=11162, option=[null, null, null, null, drop] +item=null, id=11163, option=[null, null, null, null, drop] +item=Restored shield, id=11164, option=[null, null, null, null, drop] +item=Phoenix crossbow, id=11165, option=[null, Wield, null, null, drop] +item=Phoenix crossbow, id=11166, option=[null, null, null, null, drop] +item=Phoenix crossbow, id=11167, option=[null, Wield, null, null, drop] +item=Phoenix crossbow, id=11168, option=[null, null, null, null, drop] +item=Newspaper, id=11169, option=[Read, null, null, null, drop] +item=Newspaper, id=11170, option=[null, null, null, null, drop] +item=Newspaper, id=11171, option=[Read, null, null, null, drop] +item=Newspaper, id=11172, option=[null, null, null, null, drop] +item=Half certificate, id=11173, option=[Read, null, null, null, Destroy] +item=Half certificate, id=11174, option=[Read, null, null, null, Destroy] +item=Uncleaned find, id=11175, option=[null, null, null, null, Destroy] +item=Arrowheads, id=11176, option=[null, null, null, null, drop] +item=Jewellery, id=11177, option=[null, null, null, null, drop] +item=Pottery, id=11178, option=[null, null, null, null, drop] +item=Old coin, id=11179, option=[null, null, null, null, drop] +item=Ancient coin, id=11180, option=[null, null, null, null, drop] +item=Ancient symbol, id=11181, option=[null, null, null, null, drop] +item=Old symbol, id=11182, option=[null, null, null, null, drop] +item=Old chipped vase, id=11183, option=[null, null, null, null, drop] +item=Museum map, id=11184, option=[Look-at, null, null, null, drop] +item=Antique lamp, id=11185, option=[Rub, null, null, null, Destroy] +item=Antique lamp, id=11186, option=[Rub, null, null, null, Destroy] +item=Antique lamp, id=11187, option=[Rub, null, null, null, Destroy] +item=Antique lamp, id=11188, option=[Rub, null, null, null, Destroy] +item=Antique lamp, id=11189, option=[Rub, null, null, null, Destroy] +item=Digsite pendant (1), id=11190, option=[null, Wear, null, Rub, drop] +item=Digsite pendant (2), id=11191, option=[null, Wear, null, Rub, drop] +item=Digsite pendant (3), id=11192, option=[null, Wear, null, Rub, drop] +item=Digsite pendant (4), id=11193, option=[null, Wear, null, Rub, drop] +item=Digsite pendant (5), id=11194, option=[null, Wear, null, Rub, drop] +item=Clean necklace, id=11195, option=[null, Wear, null, null, drop] +item=Griffin feather, id=11196, option=[null, null, null, null, Destroy] +item=Miazrqa's pendant, id=11197, option=[null, null, null, null, Destroy] +item=Music sheet, id=11198, option=[Read, null, null, null, Destroy] +item=Rupert's helmet, id=11199, option=[null, null, null, null, Destroy] +item=Dwarven helmet, id=11200, option=[null, Wear, null, null, Drop] +item=Dwarven helmet, id=11201, option=[null, null, null, null, drop] +item=Shrinking recipe, id=11202, option=[Read, null, null, null, Destroy] +item=To-do list, id=11203, option=[Read, null, null, null, Destroy] +item=Shrink-me-quick, id=11204, option=[Drink, null, null, Empty, Destroy] +item=Shrunk ogleroot, id=11205, option=[null, null, null, Eat, drop] +item=null, id=11206, option=[null, null, null, null, drop] +item=null, id=11207, option=[null, null, null, null, drop] +item=null, id=11208, option=[null, null, null, null, drop] +item=null, id=11209, option=[null, null, null, null, drop] +item=Golden goblin, id=11210, option=[null, null, null, null, Destroy] +item=Magic beans, id=11211, option=[null, null, null, null, Destroy] +item=Dragon arrow, id=11212, option=[null, Wield, null, null, drop] +item=null, id=11213, option=[null, null, null, null, drop] +item=null, id=11214, option=[null, null, null, null, drop] +item=null, id=11215, option=[null, null, null, null, drop] +item=null, id=11216, option=[null, null, null, null, drop] +item=Dragon fire arrows, id=11217, option=[null, Wield, null, null, drop] +item=null, id=11218, option=[null, null, null, null, drop] +item=null, id=11219, option=[null, null, null, null, drop] +item=null, id=11220, option=[null, null, null, null, drop] +item=null, id=11221, option=[null, null, null, null, drop] +item=Dragon fire arrows, id=11222, option=[null, Wield, null, null, drop] +item=null, id=11223, option=[null, null, null, null, drop] +item=null, id=11224, option=[null, null, null, null, drop] +item=null, id=11225, option=[null, null, null, null, drop] +item=null, id=11226, option=[null, null, null, null, drop] +item=Dragon arrow(p), id=11227, option=[null, Wield, null, null, drop] +item=Dragon arrow(p+), id=11228, option=[null, Wield, null, null, drop] +item=Dragon arrow(p++), id=11229, option=[null, Wield, null, null, drop] +item=Dragon dart, id=11230, option=[null, Wield, null, null, drop] +item=Dragon dart(p), id=11231, option=[null, Wield, null, null, drop] +item=Dragon dart tip, id=11232, option=[null, null, null, null, drop] +item=Dragon dart(p+), id=11233, option=[null, Wield, null, null, drop] +item=Dragon dart(p++), id=11234, option=[null, Wield, null, null, drop] +item=Dark bow, id=11235, option=[null, Wield, null, null, drop] +item=Dark bow, id=11236, option=[null, null, null, null, drop] +item=Dragon arrowtips, id=11237, option=[null, null, null, null, drop] +item=Baby impling jar, id=11238, option=[null, null, Loot, null, Destroy] +item=Baby impling jar, id=11239, option=[null, null, null, null, drop] +item=Young impling jar, id=11240, option=[null, null, Loot, null, Destroy] +item=Young impling jar, id=11241, option=[null, null, null, null, drop] +item=Gourm' impling jar, id=11242, option=[null, null, Loot, null, Destroy] +item=Gourm' impling jar, id=11243, option=[null, null, null, null, drop] +item=Earth impling jar, id=11244, option=[null, null, Loot, null, Destroy] +item=Earth impling jar, id=11245, option=[null, null, null, null, drop] +item=Ess' impling jar, id=11246, option=[null, null, Loot, null, Destroy] +item=Ess' impling jar, id=11247, option=[null, null, null, null, drop] +item=Eclectic impling jar, id=11248, option=[null, null, Loot, null, Destroy] +item=Eclectic impling jar, id=11249, option=[null, null, null, null, drop] +item=Nature impling jar, id=11250, option=[null, null, Loot, null, Destroy] +item=Nature impling jar, id=11251, option=[null, null, null, null, drop] +item=Magpie impling jar, id=11252, option=[null, null, Loot, null, Destroy] +item=Magpie impling jar, id=11253, option=[null, null, null, null, drop] +item=Ninja impling jar, id=11254, option=[null, null, Loot, null, Destroy] +item=Ninja impling jar, id=11255, option=[null, null, null, null, drop] +item=Dragon impling jar, id=11256, option=[null, null, Loot, null, Destroy] +item=Dragon impling jar, id=11257, option=[null, null, null, null, drop] +item=Jar generator, id=11258, option=[Butterfly-jar, null, Impling-jar, Check, Destroy] +item=Magic butterfly net, id=11259, option=[null, Wield, null, null, Destroy] +item=Impling jar, id=11260, option=[null, null, null, null, drop] +item=Impling jar, id=11261, option=[null, null, null, null, drop] +item=Imp repellent, id=11262, option=[null, null, null, Empty, drop] +item=Imp repellent, id=11263, option=[null, null, null, null, drop] +item=Anchovy oil, id=11264, option=[null, null, null, Empty, drop] +item=Anchovy oil, id=11265, option=[null, null, null, null, drop] +item=Anchovy paste, id=11266, option=[null, null, null, null, drop] +item=Dummy, id=11267, option=[null, null, null, null, drop] +item=Dummy, id=11268, option=[null, null, null, null, drop] +item=Dummy, id=11269, option=[null, null, null, null, drop] +item=Dummy, id=11270, option=[null, null, null, null, drop] +item=Dummy, id=11271, option=[null, null, null, Empty, drop] +item=Dummy, id=11272, option=[null, null, null, null, drop] +item=Impling scroll, id=11273, option=[Toggle-view, null, null, null, Destroy] +item=Ham shirt, id=11274, option=[null, Wear, null, null, drop] +item=Mith grapple, id=11275, option=[null, null, null, null, drop] +item=Mith grapple, id=11276, option=[null, null, null, null, drop] +item=Cavalier mask, id=11277, option=[null, Wear, null, null, drop] +item=Beret mask, id=11278, option=[null, Wear, null, null, drop] +item=Elvarg's head, id=11279, option=[null, null, null, null, Destroy] +item=Cavalier mask, id=11280, option=[null, Wear, null, null, drop] +item=Cavalier mask, id=11281, option=[null, null, null, null, drop] +item=Beret mask, id=11282, option=[null, Wear, null, null, drop] +item=Dragonfire shield, id=11283, option=[null, Wield, Inspect, Empty, drop] +item=Dragonfire shield, id=11284, option=[null, Wield, Inspect, null, drop] +item=Dragonfire shield, id=11285, option=[null, null, null, null, drop] +item=Draconic visage, id=11286, option=[null, null, null, null, drop] +item=Draconic visage, id=11287, option=[null, null, null, null, drop] +item=null, id=11288, option=[null, null, null, Empty, drop] +item=null, id=11289, option=[null, null, null, Empty, drop] +item=null, id=11290, option=[null, null, null, Empty, drop] +item=null, id=11291, option=[null, null, null, Empty, drop] +item=null, id=11292, option=[null, null, null, Empty, drop] +item=null, id=11293, option=[null, null, null, Empty, drop] +item=null, id=11294, option=[null, null, null, Empty, drop] +item=null, id=11295, option=[null, null, null, Empty, drop] +item=null, id=11296, option=[null, null, null, Empty, drop] +item=null, id=11297, option=[null, null, null, Empty, drop] +item=null, id=11298, option=[null, null, null, Empty, drop] +item=null, id=11299, option=[null, null, null, Empty, drop] +item=null, id=11300, option=[null, null, null, Empty, drop] +item=null, id=11301, option=[null, null, null, Empty, drop] +item=null, id=11302, option=[null, null, null, Empty, drop] +item=null, id=11303, option=[null, null, null, Empty, drop] +item=null, id=11304, option=[null, null, null, Empty, drop] +item=null, id=11305, option=[null, null, null, Empty, drop] +item=null, id=11306, option=[null, null, null, null, drop] +item=null, id=11307, option=[null, null, null, null, drop] +item=null, id=11308, option=[null, null, null, null, drop] +item=null, id=11309, option=[null, null, null, null, drop] +item=null, id=11310, option=[null, null, null, null, drop] +item=null, id=11311, option=[null, null, null, null, drop] +item=null, id=11312, option=[null, null, null, null, drop] +item=null, id=11313, option=[null, null, null, null, drop] +item=null, id=11314, option=[null, null, null, null, drop] +item=null, id=11315, option=[null, null, null, null, drop] +item=null, id=11316, option=[null, null, null, null, drop] +item=null, id=11317, option=[null, null, null, null, drop] +item=null, id=11318, option=[null, null, null, null, drop] +item=null, id=11319, option=[null, null, null, null, drop] +item=null, id=11320, option=[null, null, null, null, drop] +item=null, id=11321, option=[null, null, null, null, drop] +item=null, id=11322, option=[null, null, null, null, drop] +item=Barbarian rod, id=11323, option=[null, null, null, null, drop] +item=Roe, id=11324, option=[Eat, null, null, null, drop] +item=Roe, id=11325, option=[null, null, null, null, drop] +item=Caviar, id=11326, option=[Eat, null, null, null, drop] +item=Caviar, id=11327, option=[null, null, null, null, drop] +item=Leaping trout, id=11328, option=[null, null, null, null, drop] +item=Leaping trout, id=11329, option=[null, null, null, null, drop] +item=Leaping salmon, id=11330, option=[null, null, null, null, drop] +item=Leaping salmon, id=11331, option=[null, null, null, null, drop] +item=Leaping sturgeon, id=11332, option=[null, null, null, null, drop] +item=Leaping sturgeon, id=11333, option=[null, null, null, null, drop] +item=Fish offcuts, id=11334, option=[null, null, null, null, drop] +item=Dragon full helm, id=11335, option=[null, Wear, null, null, drop] +item=Dragon full helm, id=11336, option=[null, null, null, null, drop] +item=Mangled bones, id=11337, option=[null, null, null, null, Destroy] +item=Chewed bones, id=11338, option=[null, null, null, null, Destroy] +item=My notes, id=11339, option=[Read, null, null, null, Destroy] +item=Barbarian skills, id=11340, option=[Read, null, null, null, Destroy] +item=Ancient page, id=11341, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11342, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11343, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11344, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11345, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11346, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11347, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11348, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11349, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11350, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11351, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11352, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11353, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11354, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11355, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11356, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11357, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11358, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11359, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11360, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11361, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11362, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11363, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11364, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11365, option=[Copy to log, null, null, null, Destroy] +item=Ancient page, id=11366, option=[Copy to log, null, null, null, Destroy] +item=Bronze hasta, id=11367, option=[null, Wield, null, null, drop] +item=Bronze hasta, id=11368, option=[null, null, null, null, drop] +item=Iron hasta, id=11369, option=[null, Wield, null, null, drop] +item=Iron hasta, id=11370, option=[null, null, null, null, drop] +item=Steel hasta, id=11371, option=[null, Wield, null, null, drop] +item=Steel hasta, id=11372, option=[null, null, null, null, drop] +item=Mithril hasta, id=11373, option=[null, Wield, null, null, drop] +item=Mithril hasta, id=11374, option=[null, null, null, null, drop] +item=Adamant hasta, id=11375, option=[null, Wield, null, null, drop] +item=Adamant hasta, id=11376, option=[null, null, null, null, drop] +item=Rune hasta, id=11377, option=[null, Wield, null, null, drop] +item=Rune hasta, id=11378, option=[null, null, null, null, drop] +item=Bronze hasta(p), id=11379, option=[null, Wield, null, null, drop] +item=Bronze hasta(p), id=11380, option=[null, null, null, null, drop] +item=Bronze hasta(kp), id=11381, option=[null, Wield, null, null, drop] +item=Bronze hasta(p+), id=11382, option=[null, Wield, null, null, drop] +item=Bronze hasta(p+), id=11383, option=[null, null, null, null, drop] +item=Bronze hasta(p++), id=11384, option=[null, Wield, null, null, drop] +item=Bronze hasta(p++), id=11385, option=[null, null, null, null, drop] +item=Iron hasta(p), id=11386, option=[null, Wield, null, null, drop] +item=Iron hasta(p), id=11387, option=[null, null, null, null, drop] +item=Iron hasta(kp), id=11388, option=[null, Wield, null, null, drop] +item=Iron hasta(p+), id=11389, option=[null, Wield, null, null, drop] +item=Iron hasta(p+), id=11390, option=[null, null, null, null, drop] +item=Iron hasta(p++), id=11391, option=[null, Wield, null, null, drop] +item=Iron hasta(p++), id=11392, option=[null, null, null, null, drop] +item=Steel hasta(p), id=11393, option=[null, Wield, null, null, drop] +item=Steel hasta(p), id=11394, option=[null, null, null, null, drop] +item=Steel hasta(kp), id=11395, option=[null, Wield, null, null, drop] +item=Steel hasta(p+), id=11396, option=[null, Wield, null, null, drop] +item=Steel hasta(p+), id=11397, option=[null, null, null, null, drop] +item=Steel hasta(p++), id=11398, option=[null, Wield, null, null, drop] +item=Steel hasta(p++), id=11399, option=[null, null, null, null, drop] +item=Mithril hasta(p), id=11400, option=[null, Wield, null, null, drop] +item=Mithril hasta(p), id=11401, option=[null, null, null, null, drop] +item=Mithril hasta(kp), id=11402, option=[null, Wield, null, null, drop] +item=Mithril hasta(p+), id=11403, option=[null, Wield, null, null, drop] +item=Mithril hasta(p+), id=11404, option=[null, null, null, null, drop] +item=Mithril hasta(p++), id=11405, option=[null, Wield, null, null, drop] +item=Mithril hasta(p++), id=11406, option=[null, null, null, null, drop] +item=Adamant hasta(p), id=11407, option=[null, Wield, null, null, drop] +item=Adamant hasta(p), id=11408, option=[null, null, null, null, drop] +item=Adamant hasta(kp), id=11409, option=[null, Wield, null, null, drop] +item=Adamant hasta(p+), id=11410, option=[null, Wield, null, null, drop] +item=Adamant hasta(p+), id=11411, option=[null, null, null, null, drop] +item=Addy hasta(p++), id=11412, option=[null, Wield, null, null, drop] +item=Addy hasta(p++), id=11413, option=[null, null, null, null, drop] +item=Rune hasta(p), id=11414, option=[null, Wield, null, null, drop] +item=Rune hasta(p), id=11415, option=[null, null, null, null, drop] +item=Rune hasta(kp), id=11416, option=[null, Wield, null, null, drop] +item=Rune hasta(p+), id=11417, option=[null, Wield, null, null, drop] +item=Rune hasta(p+), id=11418, option=[null, null, null, null, drop] +item=Rune hasta(p++), id=11419, option=[null, Wield, null, null, drop] +item=Rune hasta(p++), id=11420, option=[null, null, null, null, drop] +item=null, id=11421, option=[null, null, null, null, drop] +item=null, id=11422, option=[null, null, null, null, drop] +item=null, id=11423, option=[null, null, null, null, drop] +item=null, id=11424, option=[null, null, null, null, drop] +item=null, id=11425, option=[null, null, null, null, drop] +item=null, id=11426, option=[null, null, null, null, drop] +item=Fish vial, id=11427, option=[null, null, null, null, drop] +item=Fish vial, id=11428, option=[null, null, null, null, drop] +item=Attack mix(2), id=11429, option=[Drink, null, null, Empty, drop] +item=Attack mix(2), id=11430, option=[null, null, null, null, drop] +item=Attack mix(1), id=11431, option=[Drink, null, null, Empty, drop] +item=Attack mix(1), id=11432, option=[null, null, null, null, drop] +item=Antipoison mix(2), id=11433, option=[Drink, null, null, Empty, drop] +item=Antipoison mix(2), id=11434, option=[null, null, null, null, drop] +item=Antipoison mix(1), id=11435, option=[Drink, null, null, Empty, drop] +item=Antipoison mix(1), id=11436, option=[null, null, null, null, drop] +item=Relicym's mix(2), id=11437, option=[Drink, null, null, Empty, drop] +item=Relicym's mix(2), id=11438, option=[null, null, null, null, drop] +item=Relicym's mix(1), id=11439, option=[Drink, null, null, Empty, drop] +item=Relicym's mix(1), id=11440, option=[null, null, null, null, drop] +item=Strength mix(1), id=11441, option=[Drink, null, null, Empty, drop] +item=Strength mix(1), id=11442, option=[null, null, null, null, drop] +item=Strength mix(2), id=11443, option=[Drink, null, null, Empty, drop] +item=Strength mix(2), id=11444, option=[null, null, null, null, drop] +item=Combat mix(2), id=11445, option=[Drink, null, null, Empty, drop] +item=Combat mix(2), id=11446, option=[null, null, null, null, drop] +item=Combat mix(1), id=11447, option=[Drink, null, null, Empty, drop] +item=Combat mix(1), id=11448, option=[null, null, null, null, drop] +item=Restore mix(2), id=11449, option=[Drink, null, null, Empty, drop] +item=Restore mix(2), id=11450, option=[null, null, null, null, drop] +item=Restore mix(1), id=11451, option=[Drink, null, null, Empty, drop] +item=Restore mix(1), id=11452, option=[null, null, null, null, drop] +item=Energy mix(2), id=11453, option=[Drink, null, null, Empty, drop] +item=Energy mix(2), id=11454, option=[null, null, null, null, drop] +item=Energy mix(1), id=11455, option=[Drink, null, null, Empty, drop] +item=Energy mix(1), id=11456, option=[null, null, null, null, drop] +item=Defence mix(2), id=11457, option=[Drink, null, null, Empty, drop] +item=Defence mix(2), id=11458, option=[null, null, null, null, drop] +item=Defence mix(1), id=11459, option=[Drink, null, null, Empty, drop] +item=Defence mix(1), id=11460, option=[null, null, null, null, drop] +item=Agility mix(2), id=11461, option=[Drink, null, null, Empty, drop] +item=Agility mix(2), id=11462, option=[null, null, null, null, drop] +item=Agility mix(1), id=11463, option=[Drink, null, null, Empty, drop] +item=Agility mix(1), id=11464, option=[null, null, null, null, drop] +item=Prayer mix(2), id=11465, option=[Drink, null, null, Empty, drop] +item=Prayer mix(2), id=11466, option=[null, null, null, null, drop] +item=Prayer mix(1), id=11467, option=[Drink, null, null, Empty, drop] +item=Prayer mix(1), id=11468, option=[null, null, null, null, drop] +item=Superattack mix(2), id=11469, option=[Drink, null, null, Empty, drop] +item=Superattack mix(2), id=11470, option=[null, null, null, null, drop] +item=Superattack mix(1), id=11471, option=[Drink, null, null, Empty, drop] +item=Superattack mix(1), id=11472, option=[null, null, null, null, drop] +item=Anti-p supermix(2), id=11473, option=[Drink, null, null, Empty, drop] +item=Anti-p supermix(2), id=11474, option=[null, null, null, null, drop] +item=Anti-p supermix(1), id=11475, option=[Drink, null, null, Empty, drop] +item=Anti-p supermix(1), id=11476, option=[null, null, null, null, drop] +item=Fishing mix(2), id=11477, option=[Drink, null, null, Empty, drop] +item=Fishing mix(2), id=11478, option=[null, null, null, null, drop] +item=Fishing mix(1), id=11479, option=[Drink, null, null, Empty, drop] +item=Fishing mix(1), id=11480, option=[null, null, null, null, drop] +item=Sup. energy mix(2), id=11481, option=[Drink, null, null, Empty, drop] +item=Sup. energy mix(2), id=11482, option=[null, null, null, null, drop] +item=Sup. energy mix(1), id=11483, option=[Drink, null, null, Empty, drop] +item=Sup. energy mix(1), id=11484, option=[null, null, null, null, drop] +item=Sup. str. mix(2), id=11485, option=[Drink, null, null, Empty, drop] +item=Sup. str. mix(2), id=11486, option=[null, null, null, null, drop] +item=Sup. str. mix(1), id=11487, option=[Drink, null, null, Empty, drop] +item=Sup. str. mix(1), id=11488, option=[null, null, null, null, drop] +item=Magic ess. mix(2), id=11489, option=[Drink, null, null, Empty, drop] +item=Magic ess. mix(2), id=11490, option=[null, null, null, null, drop] +item=Magic ess. mix(1), id=11491, option=[Drink, null, null, Empty, drop] +item=Magic ess. mix(1), id=11492, option=[null, null, null, null, drop] +item=Sup. restore mix(2), id=11493, option=[Drink, null, null, Empty, drop] +item=Sup. restore mix(2), id=11494, option=[null, null, null, null, drop] +item=Sup. restore mix(1), id=11495, option=[Drink, null, null, Empty, drop] +item=Sup. restore mix(1), id=11496, option=[null, null, null, null, drop] +item=Sup. def. mix(2), id=11497, option=[Drink, null, null, Empty, drop] +item=Sup. def. mix(2), id=11498, option=[null, null, null, null, drop] +item=Sup. def. mix(1), id=11499, option=[Drink, null, null, Empty, drop] +item=Sup. def. mix(1), id=11500, option=[null, null, null, null, drop] +item=Antidote+ mix(2), id=11501, option=[Drink, null, null, Empty, drop] +item=Antidote+ mix(2), id=11502, option=[null, null, null, null, drop] +item=Antidote+ mix(1), id=11503, option=[Drink, null, null, Empty, drop] +item=Antidote+ mix(1), id=11504, option=[null, null, null, null, drop] +item=Antifire mix(2), id=11505, option=[Drink, null, null, Empty, drop] +item=Antifire mix(2), id=11506, option=[null, null, null, null, drop] +item=Antifire mix(1), id=11507, option=[Drink, null, null, Empty, drop] +item=Antifire mix(1), id=11508, option=[null, null, null, null, drop] +item=Ranging mix(2), id=11509, option=[Drink, null, null, Empty, drop] +item=Ranging mix(2), id=11510, option=[null, null, null, null, drop] +item=Ranging mix(1), id=11511, option=[Drink, null, null, Empty, drop] +item=Ranging mix(1), id=11512, option=[null, null, null, null, drop] +item=Magic mix(2), id=11513, option=[Drink, null, null, Empty, drop] +item=Magic mix(2), id=11514, option=[null, null, null, null, drop] +item=Magic mix(1), id=11515, option=[Drink, null, null, Empty, drop] +item=Magic mix(1), id=11516, option=[null, null, null, null, drop] +item=Hunting mix(2), id=11517, option=[Drink, null, null, Empty, drop] +item=Hunting mix(2), id=11518, option=[null, null, null, null, drop] +item=Hunting mix(1), id=11519, option=[Drink, null, null, Empty, drop] +item=Hunting mix(1), id=11520, option=[null, null, null, null, drop] +item=Zamorak mix(2), id=11521, option=[Drink, null, null, Empty, drop] +item=Zamorak mix(2), id=11522, option=[null, null, null, null, drop] +item=Zamorak mix(1), id=11523, option=[Drink, null, null, Empty, drop] +item=Zamorak mix(1), id=11524, option=[null, null, null, null, drop] +item=Wimpy feather, id=11525, option=[null, null, null, null, drop] +item=null, id=11526, option=[null, null, null, null, drop] +item=null, id=11527, option=[null, null, null, null, drop] +item=null, id=11528, option=[null, null, null, null, drop] +item=null, id=11529, option=[null, null, null, null, drop] +item=null, id=11530, option=[null, null, null, null, drop] +item=null, id=11531, option=[null, null, null, null, drop] +item=null, id=11532, option=[null, null, null, null, drop] +item=null, id=11533, option=[null, null, null, null, drop] +item=null, id=11534, option=[null, null, null, null, drop] +item=null, id=11535, option=[null, null, null, null, drop] +item=null, id=11536, option=[null, null, null, null, drop] +item=null, id=11537, option=[null, null, null, null, drop] +item=null, id=11538, option=[null, null, null, null, drop] +item=null, id=11539, option=[null, null, null, null, drop] +item=null, id=11540, option=[null, null, null, null, drop] +item=null, id=11541, option=[null, null, null, null, drop] +item=null, id=11542, option=[null, null, null, null, drop] +item=null, id=11543, option=[null, null, null, null, drop] +item=null, id=11544, option=[null, null, null, null, drop] +item=null, id=11545, option=[null, null, null, null, drop] +item=null, id=11546, option=[null, null, null, null, drop] +item=null, id=11547, option=[null, null, null, null, drop] +item=null, id=11548, option=[null, null, null, null, drop] +item=null, id=11549, option=[null, null, null, null, drop] +item=null, id=11550, option=[null, null, null, null, drop] +item=null, id=11551, option=[null, null, null, null, drop] +item=null, id=11552, option=[null, null, null, null, drop] +item=null, id=11553, option=[null, null, null, null, drop] +item=null, id=11554, option=[null, null, null, null, drop] +item=null, id=11555, option=[null, null, null, null, drop] +item=null, id=11556, option=[null, null, null, null, drop] +item=null, id=11557, option=[null, null, null, null, drop] +item=null, id=11558, option=[null, null, null, null, drop] +item=null, id=11559, option=[null, null, null, null, drop] +item=null, id=11560, option=[null, null, null, null, drop] +item=null, id=11561, option=[null, null, null, null, drop] +item=null, id=11562, option=[null, null, null, null, drop] +item=null, id=11563, option=[null, null, null, null, drop] +item=null, id=11564, option=[null, null, null, null, drop] +item=null, id=11565, option=[null, null, null, null, drop] +item=null, id=11566, option=[null, null, null, null, drop] +item=null, id=11567, option=[null, null, null, null, drop] +item=null, id=11568, option=[null, null, null, null, drop] +item=null, id=11569, option=[null, null, null, null, drop] +item=null, id=11570, option=[null, null, null, null, drop] +item=null, id=11571, option=[null, null, null, null, drop] +item=null, id=11572, option=[null, null, null, null, drop] +item=null, id=11573, option=[null, null, null, null, drop] +item=null, id=11574, option=[null, null, null, null, drop] +item=null, id=11575, option=[null, null, null, null, drop] +item=null, id=11576, option=[null, null, null, null, drop] +item=null, id=11577, option=[null, null, null, null, drop] +item=null, id=11578, option=[null, null, null, null, drop] +item=null, id=11579, option=[null, null, null, null, drop] +item=null, id=11580, option=[null, null, null, null, drop] +item=null, id=11581, option=[null, null, null, null, drop] +item=null, id=11582, option=[null, null, null, null, drop] +item=null, id=11583, option=[null, null, null, null, drop] +item=null, id=11584, option=[null, null, null, null, drop] +item=null, id=11585, option=[null, null, null, null, drop] +item=null, id=11586, option=[null, null, null, null, drop] +item=null, id=11587, option=[null, null, null, null, drop] +item=null, id=11588, option=[null, null, null, null, drop] +item=null, id=11589, option=[null, null, null, null, drop] +item=null, id=11590, option=[null, null, null, null, drop] +item=null, id=11591, option=[null, null, null, null, drop] +item=null, id=11592, option=[null, null, null, null, drop] +item=null, id=11593, option=[null, null, null, null, drop] +item=null, id=11594, option=[null, null, null, null, drop] +item=null, id=11595, option=[null, null, null, null, drop] +item=null, id=11596, option=[null, null, null, null, drop] +item=null, id=11597, option=[null, null, null, null, drop] +item=null, id=11598, option=[null, null, null, null, drop] +item=null, id=11599, option=[null, null, null, null, drop] +item=null, id=11600, option=[null, null, null, null, drop] +item=null, id=11601, option=[null, null, null, null, drop] +item=null, id=11602, option=[null, null, null, null, drop] +item=null, id=11603, option=[null, null, null, null, drop] +item=null, id=11604, option=[null, null, null, null, drop] +item=null, id=11605, option=[null, null, null, null, drop] +item=null, id=11606, option=[null, null, null, null, drop] +item=null, id=11607, option=[null, null, null, null, drop] +item=null, id=11608, option=[null, null, null, null, drop] +item=null, id=11609, option=[null, null, null, null, drop] +item=null, id=11610, option=[null, null, null, null, drop] +item=null, id=11611, option=[null, null, null, null, drop] +item=null, id=11612, option=[null, null, null, null, drop] +item=null, id=11613, option=[null, null, null, null, drop] +item=null, id=11614, option=[null, null, null, null, drop] +item=null, id=11615, option=[null, null, null, null, drop] +item=null, id=11616, option=[null, null, null, null, drop] +item=null, id=11617, option=[null, null, null, null, drop] +item=null, id=11618, option=[null, null, null, null, drop] +item=null, id=11619, option=[null, null, null, null, drop] +item=null, id=11620, option=[null, null, null, null, drop] +item=null, id=11621, option=[null, null, null, null, drop] +item=null, id=11622, option=[null, null, null, null, drop] +item=null, id=11623, option=[null, null, null, null, drop] +item=null, id=11624, option=[null, null, null, null, drop] +item=null, id=11625, option=[null, null, null, null, drop] +item=null, id=11626, option=[null, null, null, null, drop] +item=null, id=11627, option=[null, null, null, null, drop] +item=null, id=11628, option=[null, null, null, null, drop] +item=null, id=11629, option=[null, null, null, null, drop] +item=null, id=11630, option=[null, null, null, null, drop] +item=null, id=11631, option=[null, null, null, null, drop] +item=null, id=11632, option=[null, null, null, null, drop] +item=null, id=11633, option=[null, null, null, null, drop] +item=null, id=11634, option=[null, null, null, null, drop] +item=null, id=11635, option=[null, null, null, null, drop] +item=null, id=11636, option=[null, null, null, null, drop] +item=null, id=11637, option=[null, null, null, null, drop] +item=null, id=11638, option=[null, null, null, null, drop] +item=null, id=11639, option=[null, null, null, null, drop] +item=Book of knowledge, id=11640, option=[Read, null, null, null, Destroy] +item=null, id=11641, option=[null, null, null, null, drop] +item=null, id=11642, option=[null, null, null, null, drop] +item=null, id=11643, option=[null, null, null, null, drop] +item=null, id=11644, option=[null, null, null, null, drop] +item=null, id=11645, option=[null, null, null, null, drop] +item=null, id=11646, option=[null, null, null, null, drop] +item=null, id=11647, option=[null, null, null, null, drop] +item=null, id=11648, option=[null, null, null, null, drop] +item=null, id=11649, option=[null, null, null, null, drop] +item=null, id=11650, option=[null, null, null, null, drop] +item=null, id=11651, option=[null, null, null, null, drop] +item=null, id=11652, option=[null, null, null, null, drop] +item=null, id=11653, option=[null, null, null, null, drop] +item=null, id=11654, option=[null, null, null, null, drop] +item=Astronomy book, id=11655, option=[null, null, null, null, drop] +item=Glassblowing book, id=11656, option=[Read, null, null, null, drop] +item=Glassblowing book, id=11657, option=[null, null, null, null, drop] +item=null, id=11658, option=[null, null, null, null, drop] +item=null, id=11659, option=[null, null, null, null, drop] +item=null, id=11660, option=[null, null, null, null, drop] +item=null, id=11661, option=[null, null, null, null, drop] +item=null, id=11662, option=[null, null, null, null, drop] +item=Void mage helm, id=11663, option=[null, Wear, null, null, drop] +item=Void ranger helm, id=11664, option=[null, Wear, null, null, drop] +item=Void melee helm, id=11665, option=[null, Wear, null, null, drop] +item=Void seal(8), id=11666, option=[null, Wear, null, Rub, drop] +item=Void seal(7), id=11667, option=[null, Wear, null, Rub, drop] +item=Void seal(6), id=11668, option=[null, Wear, null, Rub, drop] +item=Void seal(5), id=11669, option=[null, Wear, null, Rub, drop] +item=Void seal(4), id=11670, option=[null, Wear, null, Rub, drop] +item=Void seal(3), id=11671, option=[null, Wear, null, Rub, drop] +item=Void seal(2), id=11672, option=[null, Wear, null, Rub, drop] +item=Void seal(1), id=11673, option=[null, Wear, null, Rub, drop] +item=Void mage helm, id=11674, option=[null, Wear, null, null, drop] +item=Void ranger helm, id=11675, option=[null, Wear, null, null, drop] +item=Void melee helm, id=11676, option=[null, Wear, null, null, drop] +item=Explorer's notes, id=11677, option=[Read, null, null, null, Destroy] +item=Black knight helm, id=11678, option=[null, null, null, null, Destroy] +item=Antique lamp, id=11679, option=[Rub, null, null, null, Destroy] +item=Address form, id=11680, option=[Read, null, null, null, Destroy] +item=Scrap paper, id=11681, option=[Read, null, null, null, Destroy] +item=Hair clip, id=11682, option=[null, null, null, null, drop] +item=null, id=11683, option=[null, null, null, null, drop] +item=null, id=11684, option=[null, null, null, null, drop] +item=null, id=11685, option=[null, null, null, null, drop] +item=Godsword shards, id=11686, option=[null, null, null, null, drop] +item=Godsword shards, id=11687, option=[null, null, null, null, drop] +item=Godsword shards, id=11688, option=[null, null, null, null, drop] +item=Godsword shards, id=11689, option=[null, null, null, null, drop] +item=Godsword blade, id=11690, option=[null, null, null, null, drop] +item=Godsword blade, id=11691, option=[null, null, null, null, drop] +item=Godsword shards, id=11692, option=[null, null, null, null, drop] +item=Godsword shards, id=11693, option=[null, null, null, null, drop] +item=Armadyl godsword, id=11694, option=[null, Wield, Dismantle, null, drop] +item=Armadyl godsword, id=11695, option=[null, null, null, null, drop] +item=Bandos godsword, id=11696, option=[null, Wield, Dismantle, null, drop] +item=Bandos godsword, id=11697, option=[null, null, null, null, drop] +item=Saradomin godsword, id=11698, option=[null, Wield, Dismantle, null, drop] +item=Saradomin godsword, id=11699, option=[null, null, null, null, drop] +item=Zamorak godsword, id=11700, option=[null, Wield, Dismantle, null, drop] +item=Zamorak godsword, id=11701, option=[null, null, null, null, drop] +item=Armadyl hilt, id=11702, option=[null, null, null, null, drop] +item=Armadyl hilt, id=11703, option=[null, null, null, null, drop] +item=Bandos hilt, id=11704, option=[null, null, null, null, drop] +item=Bandos hilt, id=11705, option=[null, null, null, null, drop] +item=Saradomin hilt, id=11706, option=[null, null, null, null, drop] +item=Saradomin hilt, id=11707, option=[null, null, null, null, drop] +item=Zamorak hilt, id=11708, option=[null, null, null, null, drop] +item=Zamorak hilt, id=11709, option=[null, null, null, null, drop] +item=Godsword shard 1, id=11710, option=[null, null, null, null, drop] +item=Godsword shard 1, id=11711, option=[null, null, null, null, drop] +item=Godsword shard 2, id=11712, option=[null, null, null, null, drop] +item=Godsword shard 2, id=11713, option=[null, null, null, null, drop] +item=Godsword shard 3, id=11714, option=[null, null, null, null, drop] +item=Godsword shard 3, id=11715, option=[null, null, null, null, drop] +item=Zamorakian spear, id=11716, option=[null, Wield, null, null, drop] +item=Zamorakian spear, id=11717, option=[null, null, null, null, drop] +item=Armadyl helmet, id=11718, option=[null, Wear, null, null, drop] +item=Armadyl helmet, id=11719, option=[null, null, null, null, drop] +item=Armadyl chestplate, id=11720, option=[null, Wear, null, null, drop] +item=Armadyl chestplate, id=11721, option=[null, null, null, null, drop] +item=Armadyl plateskirt, id=11722, option=[null, Wear, null, null, drop] +item=Armadyl plateskirt, id=11723, option=[null, null, null, null, drop] +item=Bandos chestplate, id=11724, option=[null, Wear, null, null, drop] +item=Bandos chestplate, id=11725, option=[null, null, null, null, drop] +item=Bandos tassets, id=11726, option=[null, Wear, null, null, drop] +item=Bandos tassets, id=11727, option=[null, null, null, null, drop] +item=Bandos boots, id=11728, option=[null, Wear, null, null, drop] +item=Bandos boots, id=11729, option=[null, null, null, null, drop] +item=Saradomin sword, id=11730, option=[null, Wield, null, null, drop] +item=Saradomin sword, id=11731, option=[null, null, null, null, drop] +item=Dragon boots, id=11732, option=[null, Wear, null, null, drop] +item=Dragon boots, id=11733, option=[null, null, null, null, drop] +item=Knight's notes, id=11734, option=[Read, null, null, null, Destroy] +item=Knight's notes, id=11735, option=[Read, null, null, null, Destroy] +item=Steam battlestaff, id=11736, option=[null, Wield, null, null, drop] +item=Steam battlestaff, id=11737, option=[null, null, null, null, drop] +item=Mystic steam staff, id=11738, option=[null, Wield, null, null, drop] +item=Mystic steam staff, id=11739, option=[null, null, null, null, drop] +item=God wars mage, id=11740, option=[null, null, null, null, drop] +item=God wars mage, id=11741, option=[null, null, null, null, drop] +item=God wars ranger, id=11742, option=[null, null, null, null, drop] +item=God wars ranger, id=11743, option=[null, null, null, null, drop] +item=God wars warrior, id=11744, option=[null, null, null, null, drop] +item=God wars warrior, id=11745, option=[null, null, null, null, drop] +item=Agility jump, id=11746, option=[null, null, null, null, drop] +item=A key to a chest, id=11747, option=[null, null, null, null, Destroy] +item=Strongroom key, id=11748, option=[null, null, null, null, Destroy] +item=Crystal chime, id=11749, option=[null, null, null, Ring, Destroy] +item=Yewnock's notes, id=11750, option=[Read, null, null, null, Destroy] +item=null, id=11751, option=[null, null, null, null, drop] +item=null, id=11752, option=[null, null, null, null, drop] +item=Antique lamp, id=11753, option=[Rub, null, null, null, Destroy] +item=Antique lamp, id=11754, option=[Rub, null, null, null, Destroy] +item=Antique lamp, id=11755, option=[Rub, null, null, null, Destroy] +item=Varrock armour 1, id=11756, option=[null, Wear, null, null, Destroy] +item=Varrock armour 2, id=11757, option=[null, Wear, null, null, Destroy] +item=Varrock armour 3, id=11758, option=[null, Wear, null, null, Destroy] +item=null, id=11759, option=[null, null, null, null, drop] +item=Logs, id=11760, option=[null, null, null, null, drop] +item=Locked diary, id=11761, option=[Unlock, null, null, null, Destroy] +item=Unlocked diary, id=11762, option=[Read, null, null, null, Destroy] +item=Hand, id=11763, option=[null, null, null, null, Destroy] +item=Foot, id=11764, option=[null, null, null, null, Destroy] +item=Torso, id=11765, option=[null, null, null, null, Destroy] +item=Left arm, id=11766, option=[null, null, null, null, Destroy] +item=Right arm, id=11767, option=[null, null, null, null, Destroy] +item=Left leg, id=11768, option=[null, null, null, null, Destroy] +item=Right leg, id=11769, option=[null, null, null, null, Destroy] +item=Root cutting, id=11770, option=[null, null, null, null, drop] +item=Root cutting, id=11771, option=[null, null, null, null, drop] +item=Root cutting, id=11772, option=[null, null, null, null, drop] +item=Root cutting, id=11773, option=[null, null, null, null, drop] +item=Root cutting, id=11774, option=[null, null, null, null, drop] +item=Wilted cutting, id=11775, option=[null, null, null, null, drop] +item=Potted root, id=11776, option=[null, null, null, null, drop] +item=Sealed pot, id=11777, option=[null, null, null, null, Destroy] +item=Jade vine seed, id=11778, option=[null, null, null, null, Destroy] +item=null, id=11779, option=[null, null, null, null, drop] +item=The grim reaper's diary, id=11780, option=[Read, null, null, null, Destroy] +item=Grim's robe, id=11781, option=[null, null, null, null, Destroy] +item=Last will and testament, id=11782, option=[null, null, null, null, Destroy] +item=Human bones, id=11783, option=[null, null, null, null, Destroy] +item=Servant's skull, id=11784, option=[null, null, null, null, Destroy] +item=Hourglass, id=11785, option=[null, null, null, null, Destroy] +item=Scythe sharpener, id=11786, option=[null, null, null, null, Destroy] +item=Human eye, id=11787, option=[null, null, null, null, Destroy] +item='voice of doom' potion, id=11788, option=[null, null, null, null, Destroy] +item=Grim reaper hood, id=11789, option=[null, Wear, null, null, Destroy] +item=Grim reaper hood, id=11790, option=[null, Wear, null, null, Destroy] +item=White goblin mail, id=11791, option=[null, Wear, null, null, drop] +item=Grubfoot, id=11792, option=[null, null, null, null, drop] +item=Zanik, id=11793, option=[null, null, null, null, drop] +item=Plain of mud sphere, id=11794, option=[Break, null, null, null, drop] +item=Ekeleshuun key, id=11795, option=[null, null, null, null, Destroy] +item=Narogoshuun key, id=11796, option=[null, null, null, null, Destroy] +item=Huzamogaarb key, id=11797, option=[null, null, null, null, Destroy] +item=Saragorgak key, id=11798, option=[null, null, null, null, Destroy] +item=Horogothgar key, id=11799, option=[null, null, null, null, Destroy] +item=Yurkolgokh key, id=11800, option=[null, null, null, null, Destroy] +item=null, id=11801, option=[null, null, null, null, drop] +item=Snothead's bone, id=11802, option=[Bury, null, null, null, drop] +item=Snailfeet's bone, id=11803, option=[Bury, null, null, null, drop] +item=Mosschin's bone, id=11804, option=[Bury, null, null, null, drop] +item=Redeyes's bone, id=11805, option=[Bury, null, null, null, drop] +item=Strongbones's bone, id=11806, option=[Bury, null, null, null, drop] +item=Pharmakos berries, id=11807, option=[null, null, null, null, drop] +item=Whitefish, id=11808, option=[null, null, null, null, drop] +item=Goblin potion (4), id=11809, option=[Drink, null, null, Empty, drop] +item=Goblin potion (3), id=11810, option=[Drink, null, null, Empty, drop] +item=Goblin potion (2), id=11811, option=[Drink, null, null, Empty, drop] +item=Goblin potion (1), id=11812, option=[Drink, null, null, Empty, drop] +item=Whoopsie, id=11813, option=[null, null, null, null, drop] +item=Bronze armour set (l), id=11814, option=[null, null, null, null, drop] +item=Bronze armour set (l), id=11815, option=[null, null, null, null, drop] +item=Bronze armour set (sk), id=11816, option=[null, null, null, null, drop] +item=Bronze armour set (sk), id=11817, option=[null, null, null, null, drop] +item=Iron armour set (l), id=11818, option=[null, null, null, null, drop] +item=Iron armour set (l), id=11819, option=[null, null, null, null, drop] +item=Iron armour set (sk), id=11820, option=[null, null, null, null, drop] +item=Iron armour set (sk), id=11821, option=[null, null, null, null, drop] +item=Steel armour set (l), id=11822, option=[null, null, null, null, drop] +item=Steel armour set (l), id=11823, option=[null, null, null, null, drop] +item=Steel armour set (sk), id=11824, option=[null, null, null, null, drop] +item=Steel armour set (sk), id=11825, option=[null, null, null, null, drop] +item=Black armour set (l), id=11826, option=[null, null, null, null, drop] +item=Black armour set (l), id=11827, option=[null, null, null, null, drop] +item=Black armour set (sk), id=11828, option=[null, null, null, null, drop] +item=Black armour set (sk), id=11829, option=[null, null, null, null, drop] +item=Mithril armour set (l), id=11830, option=[null, null, null, null, drop] +item=Mithril armour set (l), id=11831, option=[null, null, null, null, drop] +item=Mithril armour set (sk), id=11832, option=[null, null, null, null, drop] +item=Mithril armour set (sk), id=11833, option=[null, null, null, null, drop] +item=Adamant armour set (l), id=11834, option=[null, null, null, null, drop] +item=Adamant armour set (l), id=11835, option=[null, null, null, null, drop] +item=Adamant armour set (sk), id=11836, option=[null, null, null, null, drop] +item=Adamant armour set (sk), id=11837, option=[null, null, null, null, drop] +item=Rune armour set (l), id=11838, option=[null, null, null, null, drop] +item=Rune armour set (l), id=11839, option=[null, null, null, null, drop] +item=Rune armour set (sk), id=11840, option=[null, null, null, null, drop] +item=Rune armour set (sk), id=11841, option=[null, null, null, null, drop] +item=Dragon armour set (l), id=11842, option=[null, null, null, null, drop] +item=Dragon armour set (l), id=11843, option=[null, null, null, null, drop] +item=Dragon armour set (sk), id=11844, option=[null, null, null, null, drop] +item=Dragon armour set (sk), id=11845, option=[null, null, null, null, drop] +item=Barrows - ahrim's set, id=11846, option=[null, null, null, null, drop] +item=Barrows - ahrim's set, id=11847, option=[null, null, null, null, drop] +item=Barrows - dharok's set, id=11848, option=[null, null, null, null, drop] +item=Barrows - dharok's set, id=11849, option=[null, null, null, null, drop] +item=Barrows - guthan's set, id=11850, option=[null, null, null, null, drop] +item=Barrows - guthan's set, id=11851, option=[null, null, null, null, drop] +item=Barrows - karil's set, id=11852, option=[null, null, null, null, drop] +item=Barrows - karil's set, id=11853, option=[null, null, null, null, drop] +item=Barrows - torag's set, id=11854, option=[null, null, null, null, drop] +item=Barrows - torag's set, id=11855, option=[null, null, null, null, drop] +item=Barrows - verac's set, id=11856, option=[null, null, null, null, drop] +item=Barrows - verac's set, id=11857, option=[null, null, null, null, drop] +item=Third age melee set, id=11858, option=[null, null, null, null, drop] +item=Third age melee set, id=11859, option=[null, null, null, null, drop] +item=Third age ranger set, id=11860, option=[null, null, null, null, drop] +item=Third age ranger set, id=11861, option=[null, null, null, null, drop] +item=Third age mage set, id=11862, option=[null, null, null, null, drop] +item=Third age mage set, id=11863, option=[null, null, null, null, drop] +item=Green dragonhide set, id=11864, option=[null, null, null, null, drop] +item=Green dragonhide set, id=11865, option=[null, null, null, null, drop] +item=Blue dragonhide set, id=11866, option=[null, null, null, null, drop] +item=Blue dragonhide set, id=11867, option=[null, null, null, null, drop] +item=Red dragonhide set, id=11868, option=[null, null, null, null, drop] +item=Red dragonhide set, id=11869, option=[null, null, null, null, drop] +item=Black dragonhide set, id=11870, option=[null, null, null, null, drop] +item=Black dragonhide set, id=11871, option=[null, null, null, null, drop] +item=Mystic robes set, id=11872, option=[null, null, null, null, drop] +item=Mystic robes set, id=11873, option=[null, null, null, null, drop] +item=Infinity robes set, id=11874, option=[null, null, null, null, drop] +item=Infinity robes set, id=11875, option=[null, null, null, null, drop] +item=Splitbark armour set, id=11876, option=[null, null, null, null, drop] +item=Splitbark armour set, id=11877, option=[null, null, null, null, drop] +item=Black trimmed armour set (l), id=11878, option=[null, null, null, null, drop] +item=Black trimmed armour set (l), id=11879, option=[null, null, null, null, drop] +item=Black trimmed armour set (sk), id=11880, option=[null, null, null, null, drop] +item=Black trimmed armour set (sk), id=11881, option=[null, null, null, null, drop] +item=Black gold-trimmed armour set (l), id=11882, option=[null, null, null, null, drop] +item=Black gold-trimmed armour set (l), id=11883, option=[null, null, null, null, drop] +item=Black gold-trimmed armour set (sk), id=11884, option=[null, null, null, null, drop] +item=Black gold-trimmed armour set (sk), id=11885, option=[null, null, null, null, drop] +item=Adamant trimmed armour set (l), id=11886, option=[null, null, null, null, drop] +item=Adamant trimmed armour set (l), id=11887, option=[null, null, null, null, drop] +item=Adamant trimmed armour set (sk), id=11888, option=[null, null, null, null, drop] +item=Adamant trimmed armour set (sk), id=11889, option=[null, null, null, null, drop] +item=Adamant gold-trimmed armour set (l), id=11890, option=[null, null, null, null, drop] +item=Adamant gold-trimmed armour set (l), id=11891, option=[null, null, null, null, drop] +item=Adamant gold-trimmed armour set (sk), id=11892, option=[null, null, null, null, drop] +item=Adamant gold-trimmed armour set (sk), id=11893, option=[null, null, null, null, drop] +item=Rune trimmed armour set (l), id=11894, option=[null, null, null, null, drop] +item=Rune trimmed armour set (l), id=11895, option=[null, null, null, null, drop] +item=Rune trimmed armour set (sk), id=11896, option=[null, null, null, null, drop] +item=Rune trimmed armour set (sk), id=11897, option=[null, null, null, null, drop] +item=Rune gold-trimmed armour set (l), id=11898, option=[null, null, null, null, drop] +item=Rune gold-trimmed armour set (l), id=11899, option=[null, null, null, null, drop] +item=Rune gold-trimmed armour set (sk), id=11900, option=[null, null, null, null, drop] +item=Rune gold-trimmed armour set (sk), id=11901, option=[null, null, null, null, drop] +item=Enchanted set, id=11902, option=[null, null, null, null, drop] +item=Enchanted set, id=11903, option=[null, null, null, null, drop] +item=Trimmed blue wizard set, id=11904, option=[null, null, null, null, drop] +item=Trimmed blue wizard set, id=11905, option=[null, null, null, null, drop] +item=Gold-trimmed blue wizard set, id=11906, option=[null, null, null, null, drop] +item=Gold-trimmed blue wizard set, id=11907, option=[null, null, null, null, drop] +item=Trimmed leather armour set, id=11908, option=[null, null, null, null, drop] +item=Trimmed leather armour set, id=11909, option=[null, null, null, null, drop] +item=Gold-trimmed leather armour set, id=11910, option=[null, null, null, null, drop] +item=Gold-trimmed leather armour set, id=11911, option=[null, null, null, null, drop] +item=Green d'hide trimmed set, id=11912, option=[null, null, null, null, drop] +item=Green d'hide trimmed set, id=11913, option=[null, null, null, null, drop] +item=Green d'hide gold-trimmed set, id=11914, option=[null, null, null, null, drop] +item=Green d'hide gold-trimmed set, id=11915, option=[null, null, null, null, drop] +item=Blue d'hide trimmed set, id=11916, option=[null, null, null, null, drop] +item=Blue d'hide trimmed set, id=11917, option=[null, null, null, null, drop] +item=Blue d'hide gold-trimmed set, id=11918, option=[null, null, null, null, drop] +item=Blue d'hide gold-trimmed set, id=11919, option=[null, null, null, null, drop] +item=Green d'hide blessed set, id=11920, option=[null, null, null, null, drop] +item=Green d'hide blessed set, id=11921, option=[null, null, null, null, drop] +item=Blue d'hide blessed set, id=11922, option=[null, null, null, null, drop] +item=Blue d'hide blessed set, id=11923, option=[null, null, null, null, drop] +item=Red d'hide blessed set, id=11924, option=[null, null, null, null, drop] +item=Red d'hide blessed set, id=11925, option=[null, null, null, null, drop] +item=Guthix armour set (l), id=11926, option=[null, null, null, null, drop] +item=Guthix armour set (l), id=11927, option=[null, null, null, null, drop] +item=Saradomin armour set (l), id=11928, option=[null, null, null, null, drop] +item=Saradomin armour set (l), id=11929, option=[null, null, null, null, drop] +item=Zamorak armour set (l), id=11930, option=[null, null, null, null, drop] +item=Zamorak armour set (l), id=11931, option=[null, null, null, null, drop] +item=Guthix armour set (sk), id=11932, option=[null, null, null, null, drop] +item=Guthix armour set (sk), id=11933, option=[null, null, null, null, drop] +item=Saradomin armour set (sk), id=11934, option=[null, null, null, null, drop] +item=Saradomin armour set (sk), id=11935, option=[null, null, null, null, drop] +item=Zamorak armour set (sk), id=11936, option=[null, null, null, null, drop] +item=Zamorak armour set (sk), id=11937, option=[null, null, null, null, drop] +item=Gilded armour set (l), id=11938, option=[null, null, null, null, drop] +item=Gilded armour set (l), id=11939, option=[null, null, null, null, drop] +item=Gilded armour set (sk), id=11940, option=[null, null, null, null, drop] +item=Gilded armour set (sk), id=11941, option=[null, null, null, null, drop] +item=Rockshell armour set, id=11942, option=[null, null, null, null, drop] +item=Rockshell armour set, id=11943, option=[null, null, null, null, drop] +item=Spined armour set, id=11944, option=[null, null, null, null, drop] +item=Spined armour set, id=11945, option=[null, null, null, null, drop] +item=Skeletal armour set, id=11946, option=[null, null, null, null, drop] +item=Skeletal armour set, id=11947, option=[null, null, null, null, drop] +item=null, id=11948, option=[null, null, null, null, drop] +item=Snow globe, id=11949, option=[Shake, null, null, null, Destroy] +item=Snow globe, id=11950, option=[Shake, null, null, null, Destroy] +item=Snowball, id=11951, option=[null, Wield, null, null, drop] +item=Ice sword, id=11952, option=[null, null, null, null, Destroy] +item=Winter staff, id=11953, option=[null, null, null, null, Destroy] +item=Holly bow, id=11954, option=[null, null, null, null, Destroy] +item=Barbarian snowman hat, id=11955, option=[null, null, null, null, Destroy] +item=Dragon snowman hat, id=11956, option=[null, null, null, null, Destroy] +item=Dwarf snowman hat, id=11957, option=[null, null, null, null, Destroy] +item=Pirate snowman hat, id=11958, option=[null, null, null, null, Destroy] +item=Snowman top hat, id=11959, option=[null, null, null, null, Destroy] +item=Light mystic robes set, id=11960, option=[null, null, null, null, drop] +item=Light mystic robes set, id=11961, option=[null, null, null, null, drop] +item=Dark mystic robes set, id=11962, option=[null, null, null, null, drop] +item=Dark mystic robes set, id=11963, option=[null, null, null, null, drop] +item=Raven egg, id=11964, option=[null, null, null, null, drop] +item=Vulture egg, id=11965, option=[null, null, null, null, drop] +item=Bird's nest, id=11966, option=[Search, null, null, null, drop] +item=Dwarf cannon set, id=11967, option=[null, null, null, null, drop] +item=Dwarf cannon set, id=11968, option=[null, null, null, null, drop] +item=Enchanted water tiara, id=11969, option=[null, Wear, null, Check-charges, Destroy] +item=Smelly crate, id=11970, option=[null, null, null, null, Destroy] +item=Full crate, id=11971, option=[Empty, null, null, null, Destroy] +item=Empty crate, id=11972, option=[null, null, null, null, Destroy] +item=Scabaras research, id=11973, option=[Read, null, null, null, Destroy] +item=Artefact receipt, id=11974, option=[null, null, null, null, Destroy] +item=Scabarite notes, id=11975, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11976, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11977, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11978, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11979, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11980, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11981, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11982, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11983, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11984, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11985, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11986, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11987, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11988, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11989, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11990, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11991, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11992, option=[Copy to log, null, null, null, Destroy] +item=Scabarite notes, id=11993, option=[Copy to log, null, null, null, Destroy] +item=Scabarite key, id=11994, option=[null, null, null, null, Destroy] +item=Oxidised dagger, id=11995, option=[null, null, null, null, Destroy] +item=Oxidised medium helm, id=11996, option=[null, null, null, null, Destroy] +item=Oxidised sword, id=11997, option=[null, null, null, null, Destroy] +item=Oxidised scimitar, id=11998, option=[null, null, null, null, Destroy] +item=Oxidised longsword, id=11999, option=[null, null, null, null, Destroy] +item=Oxidised full helm, id=12000, option=[null, null, null, null, Destroy] +item=Oxidised square shield, id=12001, option=[null, null, null, null, Destroy] +item=Oxidised chainbody, id=12002, option=[null, null, null, null, Destroy] +item=Oxidised kiteshield, id=12003, option=[null, null, null, null, Destroy] +item=Oxidised two-handed sword, id=12004, option=[null, null, null, null, Destroy] +item=Oxidised platelegs, id=12005, option=[null, null, null, null, Destroy] +item=Oxidised plateskirt, id=12006, option=[null, null, null, null, Destroy] +item=Spirit terrorbird pouch, id=12007, option=[null, null, null, Summon, drop] +item=Spirit terrorbird pouch, id=12008, option=[null, null, null, null, drop] +item=Granite crab pouch, id=12009, option=[null, null, null, Summon, drop] +item=Granite crab pouch, id=12010, option=[null, null, null, null, drop] +item=Praying mantis pouch, id=12011, option=[null, null, null, Summon, drop] +item=Praying mantis pouch, id=12012, option=[null, null, null, null, drop] +item=Giant ent pouch, id=12013, option=[null, null, null, Summon, drop] +item=Giant ent pouch, id=12014, option=[null, null, null, null, drop] +item=Spirit cobra pouch, id=12015, option=[null, null, null, Summon, drop] +item=Spirit cobra pouch, id=12016, option=[null, null, null, null, drop] +item=Spirit dagannoth pouch, id=12017, option=[null, null, null, Summon, drop] +item=Spirit dagannoth pouch, id=12018, option=[null, null, null, null, drop] +item=Thorny snail pouch, id=12019, option=[null, null, null, Summon, drop] +item=Thorny snail pouch, id=12020, option=[null, null, null, null, drop] +item=Beaver pouch, id=12021, option=[null, null, null, Summon, drop] +item=Beaver pouch, id=12022, option=[null, null, null, null, drop] +item=Karam. overlord pouch, id=12023, option=[null, null, null, Summon, drop] +item=Karam. overlord pouch, id=12024, option=[null, null, null, null, drop] +item=Hydra pouch, id=12025, option=[null, null, null, Summon, drop] +item=Hydra pouch, id=12026, option=[null, null, null, null, drop] +item=Spirit jelly pouch, id=12027, option=[null, null, null, Summon, drop] +item=Spirit jelly pouch, id=12028, option=[null, null, null, null, drop] +item=Bunyip pouch, id=12029, option=[null, null, null, Summon, drop] +item=Bunyip pouch, id=12030, option=[null, null, null, null, drop] +item=War tortoise pouch, id=12031, option=[null, null, null, Summon, drop] +item=War tortoise pouch, id=12032, option=[null, null, null, null, drop] +item=Fruit bat pouch, id=12033, option=[null, null, null, Summon, drop] +item=Fruit bat pouch, id=12034, option=[null, null, null, null, drop] +item=Abyssal parasite pouch, id=12035, option=[null, null, null, Summon, drop] +item=Abyssal parasite pouch, id=12036, option=[null, null, null, null, drop] +item=Abyssal lurker pouch, id=12037, option=[null, null, null, Summon, drop] +item=Abyssal lurker pouch, id=12038, option=[null, null, null, null, drop] +item=Unicorn stallion pouch, id=12039, option=[null, null, null, Summon, drop] +item=Unicorn stallion pouch, id=12040, option=[null, null, null, null, drop] +item=Magpie pouch, id=12041, option=[null, null, null, Summon, drop] +item=Magpie pouch, id=12042, option=[null, null, null, null, drop] +item=Dreadfowl pouch, id=12043, option=[null, null, null, Summon, drop] +item=Dreadfowl pouch, id=12044, option=[null, null, null, null, drop] +item=Stranger plant pouch, id=12045, option=[null, null, null, Summon, drop] +item=Stranger plant pouch, id=12046, option=[null, null, null, null, drop] +item=Spirit wolf pouch, id=12047, option=[null, null, null, Summon, drop] +item=Spirit wolf pouch, id=12048, option=[null, null, null, null, drop] +item=Desert wyrm pouch, id=12049, option=[null, null, null, Summon, drop] +item=Desert wyrm pouch, id=12050, option=[null, null, null, null, drop] +item=Evil turnip pouch, id=12051, option=[null, null, null, Summon, drop] +item=Evil turnip pouch, id=12052, option=[null, null, null, null, drop] +item=Vampire bat pouch, id=12053, option=[null, null, null, Summon, drop] +item=Vampire bat pouch, id=12054, option=[null, null, null, null, drop] +item=Spirit scorpion pouch, id=12055, option=[null, null, null, Summon, drop] +item=Spirit scorpion pouch, id=12056, option=[null, null, null, null, drop] +item=Arctic bear pouch, id=12057, option=[null, null, null, Summon, drop] +item=Arctic bear pouch, id=12058, option=[null, null, null, null, drop] +item=Spirit spider pouch, id=12059, option=[null, null, null, Summon, drop] +item=Spirit spider pouch, id=12060, option=[null, null, null, null, drop] +item=Bloated leech pouch, id=12061, option=[null, null, null, Summon, drop] +item=Bloated leech pouch, id=12062, option=[null, null, null, null, drop] +item=Spirit kalphite pouch, id=12063, option=[null, null, null, Summon, drop] +item=Spirit kalphite pouch, id=12064, option=[null, null, null, null, drop] +item=Honey badger pouch, id=12065, option=[null, null, null, Summon, drop] +item=Honey badger pouch, id=12066, option=[null, null, null, null, drop] +item=Albino rat pouch, id=12067, option=[null, null, null, Summon, drop] +item=Albino rat pouch, id=12068, option=[null, null, null, null, drop] +item=Granite lobster pouch, id=12069, option=[null, null, null, Summon, drop] +item=Granite lobster pouch, id=12070, option=[null, null, null, null, drop] +item=Macaw pouch, id=12071, option=[null, null, null, Summon, drop] +item=Macaw pouch, id=12072, option=[null, null, null, null, drop] +item=Bronze minotaur pouch, id=12073, option=[null, null, null, Summon, drop] +item=Bronze minotaur pouch, id=12074, option=[null, null, null, null, drop] +item=Iron minotaur pouch, id=12075, option=[null, null, null, Summon, drop] +item=Iron minotaur pouch, id=12076, option=[null, null, null, null, drop] +item=Steel minotaur pouch, id=12077, option=[null, null, null, Summon, drop] +item=Steel minotaur pouch, id=12078, option=[null, null, null, null, drop] +item=Mithril minotaur pouch, id=12079, option=[null, null, null, Summon, drop] +item=Mithril minotaur pouch, id=12080, option=[null, null, null, null, drop] +item=Adamant minotaur pouch, id=12081, option=[null, null, null, Summon, drop] +item=Adamant minotaur pouch, id=12082, option=[null, null, null, null, drop] +item=Rune minotaur pouch, id=12083, option=[null, null, null, Summon, drop] +item=Rune minotaur pouch, id=12084, option=[null, null, null, null, drop] +item=Smoke devil pouch, id=12085, option=[null, null, null, Summon, drop] +item=Smoke devil pouch, id=12086, option=[null, null, null, null, drop] +item=Bull ant pouch, id=12087, option=[null, null, null, Summon, drop] +item=Bull ant pouch, id=12088, option=[null, null, null, null, drop] +item=Wolpertinger pouch, id=12089, option=[null, null, null, Summon, drop] +item=Wolpertinger pouch, id=12090, option=[null, null, null, null, drop] +item=Compost mound pouch, id=12091, option=[null, null, null, Summon, drop] +item=Compost mound pouch, id=12092, option=[null, null, null, null, drop] +item=Pack yak pouch, id=12093, option=[null, null, null, Summon, drop] +item=Pack yak pouch, id=12094, option=[null, null, null, null, drop] +item=Sp. cockatrice pouch, id=12095, option=[null, null, null, Summon, drop] +item=Sp. cockatrice pouch, id=12096, option=[null, null, null, null, drop] +item=Sp. guthatrice pouch, id=12097, option=[null, null, null, Summon, drop] +item=Sp. guthatrice pouch, id=12098, option=[null, null, null, null, drop] +item=Sp. saratrice pouch, id=12099, option=[null, null, null, Summon, drop] +item=Sp. saratrice pouch, id=12100, option=[null, null, null, null, drop] +item=Sp. zamatrice pouch, id=12101, option=[null, null, null, Summon, drop] +item=Sp. zamatrice pouch, id=12102, option=[null, null, null, null, drop] +item=Sp. pengatrice pouch, id=12103, option=[null, null, null, Summon, drop] +item=Sp. pengatrice pouch, id=12104, option=[null, null, null, null, drop] +item=Sp. coraxatrice pouch, id=12105, option=[null, null, null, Summon, drop] +item=Sp. coraxatrice pouch, id=12106, option=[null, null, null, null, drop] +item=Sp. vulatrice pouch, id=12107, option=[null, null, null, Summon, drop] +item=Sp. vulatrice pouch, id=12108, option=[null, null, null, null, drop] +item=Cockatrice egg, id=12109, option=[null, null, null, null, drop] +item=Cockatrice egg, id=12110, option=[null, null, null, null, drop] +item=Guthatrice egg, id=12111, option=[null, null, null, null, drop] +item=Guthatrice egg, id=12112, option=[null, null, null, null, drop] +item=Saratrice egg, id=12113, option=[null, null, null, null, drop] +item=Saratrice egg, id=12114, option=[null, null, null, null, drop] +item=Zamatrice egg, id=12115, option=[null, null, null, null, drop] +item=Zamatrice egg, id=12116, option=[null, null, null, null, drop] +item=Pengatrice egg, id=12117, option=[null, null, null, null, drop] +item=Pengatrice egg, id=12118, option=[null, null, null, null, drop] +item=Coraxatrice egg, id=12119, option=[null, null, null, null, drop] +item=Coraxatrice egg, id=12120, option=[null, null, null, null, drop] +item=Vulatrice egg, id=12121, option=[null, null, null, null, drop] +item=Vulatrice egg, id=12122, option=[null, null, null, null, drop] +item=Barker toad pouch, id=12123, option=[null, null, null, Summon, drop] +item=Barker toad pouch, id=12124, option=[null, null, null, null, drop] +item=Flies, id=12125, option=[null, null, null, null, drop] +item=Flies, id=12126, option=[null, null, null, null, drop] +item=Beetle bits, id=12127, option=[null, null, null, null, drop] +item=Beetle bits, id=12128, option=[null, null, null, null, drop] +item=Ground fishing bait, id=12129, option=[null, null, null, null, drop] +item=Nuts, id=12130, option=[null, null, null, null, drop] +item=Nuts, id=12131, option=[null, null, null, null, drop] +item=Truffle, id=12132, option=[Eat, null, null, null, drop] +item=Truffle, id=12133, option=[null, null, null, null, drop] +item=Evil turnip, id=12134, option=[Eat, null, null, null, drop] +item=Evil turnip, id=12135, option=[null, null, null, null, drop] +item=2/3 evil turnip, id=12136, option=[Eat, null, null, null, drop] +item=2/3 evil turnip, id=12137, option=[null, null, null, null, drop] +item=1/3 evil turnip, id=12138, option=[Eat, null, null, null, drop] +item=1/3 evil turnip, id=12139, option=[null, null, null, null, drop] +item=Summoning potion(4), id=12140, option=[Drink, null, null, Empty, drop] +item=Summoning potion(4), id=12141, option=[null, null, null, null, drop] +item=Summoning potion(3), id=12142, option=[Drink, null, null, Empty, drop] +item=Summoning potion(3), id=12143, option=[null, null, null, null, drop] +item=Summoning potion(2), id=12144, option=[Drink, null, null, Empty, drop] +item=Summoning potion(2), id=12145, option=[null, null, null, null, drop] +item=Summoning potion(1), id=12146, option=[Drink, null, null, Empty, drop] +item=Summoning potion(1), id=12147, option=[null, null, null, null, drop] +item=Evil turnip seed, id=12148, option=[null, null, null, null, drop] +item=null, id=12149, option=[null, null, null, null, drop] +item=null, id=12150, option=[null, null, null, null, drop] +item=null, id=12151, option=[null, null, null, null, drop] +item=null, id=12152, option=[null, null, null, null, drop] +item=Carved evil turnip, id=12153, option=[null, null, null, null, drop] +item=Carved evil turnip, id=12154, option=[null, null, null, null, drop] +item=Pouch, id=12155, option=[null, null, null, null, drop] +item=Honeycomb, id=12156, option=[null, null, null, null, drop] +item=Honeycomb, id=12157, option=[null, null, null, null, drop] +item=Gold charm, id=12158, option=[null, null, null, null, drop] +item=Green charm, id=12159, option=[null, null, null, null, drop] +item=Crimson charm, id=12160, option=[null, null, null, null, drop] +item=Abyssal charm, id=12161, option=[null, null, null, null, drop] +item=Talon beast charm, id=12162, option=[null, null, null, null, drop] +item=Blue charm, id=12163, option=[null, null, null, null, drop] +item=Ravager charm, id=12164, option=[null, null, null, null, drop] +item=Shifter charm, id=12165, option=[null, null, null, null, drop] +item=Spinner charm, id=12166, option=[null, null, null, null, drop] +item=Torcher charm, id=12167, option=[null, null, null, null, drop] +item=Obsidian charm, id=12168, option=[null, null, null, null, drop] +item=Summoning skillcape, id=12169, option=[null, Wear, null, null, drop] +item=Summoning skillcape(t), id=12170, option=[null, Wear, null, null, drop] +item=Summoning hood, id=12171, option=[null, Wear, null, null, drop] +item=Clean spirit weed, id=12172, option=[null, null, null, null, drop] +item=Clean spirit weed, id=12173, option=[null, null, null, null, drop] +item=Grimy spirit weed, id=12174, option=[Clean, null, null, null, drop] +item=Grimy spirit weed, id=12175, option=[null, null, null, null, drop] +item=Spirit weed seed, id=12176, option=[null, null, null, null, drop] +item=null, id=12177, option=[null, null, null, null, drop] +item=null, id=12178, option=[null, null, null, null, drop] +item=null, id=12179, option=[null, null, null, null, drop] +item=null, id=12180, option=[null, null, null, null, drop] +item=Spirit weed potion(unf), id=12181, option=[null, null, null, Empty, drop] +item=Spirit weed potion(unf), id=12182, option=[null, null, null, null, drop] +item=Spirit shards, id=12183, option=[null, null, null, null, drop] +item=Gecko, id=12184, option=[null, null, null, null, drop] +item=Saradomin owl, id=12185, option=[null, null, null, null, drop] +item=Zamorak hawk, id=12186, option=[null, null, null, null, drop] +item=Guthix raptor, id=12187, option=[null, null, null, null, drop] +item=Penguin, id=12188, option=[null, null, null, null, drop] +item=Bird, id=12189, option=[null, null, null, null, drop] +item=Vulture, id=12190, option=[null, null, null, null, drop] +item=Terrier puppy, id=12191, option=[null, null, null, null, drop] +item=Greyhound puppy, id=12192, option=[null, null, null, null, drop] +item=Labrador puppy, id=12193, option=[null, null, null, null, drop] +item=Dalmatian puppy, id=12194, option=[null, null, null, null, drop] +item=Sheepdog puppy, id=12195, option=[null, null, null, null, drop] +item=Bulldog puppy, id=12196, option=[null, null, null, null, drop] +item=Dragon hatchling, id=12197, option=[null, null, null, null, drop] +item=Baby giant crab, id=12198, option=[null, null, null, null, drop] +item=Baby raccoon, id=12199, option=[null, null, null, null, drop] +item=Squirrel, id=12200, option=[null, null, null, null, drop] +item=Monkey, id=12201, option=[null, null, null, null, drop] +item=null, id=0, option=[null, null, null, null, drop] +item=Chameleon, id=12203, option=[null, null, null, null, drop] +item=Antlers, id=12204, option=[null, Wear, null, null, drop] +item=Antlers, id=12205, option=[null, null, null, null, drop] +item=Antlers (charged), id=12206, option=[null, Wear, Commune, Uncharge, drop] +item=Lizard skull, id=12207, option=[null, Wear, null, null, drop] +item=Lizard skull, id=12208, option=[null, null, null, null, drop] +item=Lizard skull (charged), id=12209, option=[null, Wear, Commune, Uncharge, drop] +item=Feather headdress, id=12210, option=[null, Wear, null, null, drop] +item=Feather headdress, id=12211, option=[null, null, null, null, drop] +item=Feather headdress (charged), id=12212, option=[null, Wear, Commune, Uncharge, drop] +item=Feather headdress, id=12213, option=[null, Wear, null, null, drop] +item=Feather headdress, id=12214, option=[null, null, null, null, drop] +item=Feather headdress (charged), id=12215, option=[null, Wear, Commune, Uncharge, drop] +item=Feather headdress, id=12216, option=[null, Wear, null, null, drop] +item=Feather headdress, id=12217, option=[null, null, null, null, drop] +item=Feather headdress (charged), id=12218, option=[null, Wear, Commune, Uncharge, drop] +item=Feather headdress, id=12219, option=[null, Wear, null, null, drop] +item=Feather headdress, id=12220, option=[null, null, null, null, drop] +item=Feather headdress (charged), id=12221, option=[null, Wear, Commune, Uncharge, drop] +item=Feather headdress, id=12222, option=[null, Wear, null, null, drop] +item=Feather headdress, id=12223, option=[null, null, null, null, drop] +item=Feather headdress (charged), id=12224, option=[null, Wear, Commune, Uncharge, drop] +item=Pouch, id=12225, option=[null, null, null, null, drop] +item=Pouch, id=12226, option=[null, null, null, null, drop] +item=Pouch, id=12227, option=[null, null, null, null, drop] +item=Pouch, id=12228, option=[null, null, null, null, drop] +item=Pouch, id=12229, option=[null, null, null, null, drop] +item=Pouch, id=12230, option=[null, null, null, null, drop] +item=Pouch, id=12231, option=[null, null, null, null, drop] +item=Pouch, id=12232, option=[null, null, null, null, drop] +item=Pouch, id=12233, option=[null, null, null, null, drop] +item=Pouch, id=12234, option=[null, null, null, null, drop] +item=Pouch, id=12235, option=[null, null, null, null, drop] +item=Pouch, id=12236, option=[null, null, null, null, drop] +item=Pouch, id=12237, option=[null, null, null, null, drop] +item=Pouch, id=12238, option=[null, null, null, null, drop] +item=Pouch, id=12239, option=[null, null, null, null, drop] +item=Pouch, id=12240, option=[null, null, null, null, drop] +item=Pouch, id=12241, option=[null, null, null, null, drop] +item=Pouch, id=12242, option=[null, null, null, null, drop] +item=Pouch, id=12243, option=[null, null, null, null, drop] +item=Pouch, id=12244, option=[null, null, null, null, drop] +item=Pouch, id=12245, option=[null, null, null, null, drop] +item=Pouch, id=12246, option=[null, null, null, null, drop] +item=Pouch, id=12247, option=[null, null, null, null, drop] +item=Pouch, id=12248, option=[null, null, null, null, drop] +item=Pouch, id=12249, option=[null, null, null, null, drop] +item=Pouch, id=12250, option=[null, null, null, null, drop] +item=Pouch, id=12251, option=[null, null, null, null, drop] +item=Pouch, id=12252, option=[null, null, null, null, drop] +item=Pouch, id=12253, option=[null, null, null, null, drop] +item=Pouch, id=12254, option=[null, null, null, null, drop] +item=Pouch, id=12255, option=[null, null, null, null, drop] +item=Pouch, id=12256, option=[null, null, null, null, drop] +item=Pouch, id=12257, option=[null, null, null, null, drop] +item=Pouch, id=12258, option=[null, null, null, null, drop] +item=Pouch, id=12259, option=[null, null, null, null, drop] +item=Pouch, id=12260, option=[null, null, null, null, drop] +item=Pouch, id=12261, option=[null, null, null, null, drop] +item=Pouch, id=12262, option=[null, null, null, null, drop] +item=Pouch, id=12263, option=[null, null, null, null, drop] +item=Pouch, id=12264, option=[null, null, null, null, drop] +item=Pouch, id=12265, option=[null, null, null, null, drop] +item=Pouch, id=12266, option=[null, null, null, null, drop] +item=Pouch, id=12267, option=[null, null, null, null, drop] +item=Pouch, id=12268, option=[null, null, null, null, drop] +item=Pouch, id=12269, option=[null, null, null, null, drop] +item=Pouch, id=12270, option=[null, null, null, null, drop] +item=Pouch, id=12271, option=[null, null, null, null, drop] +item=Pouch, id=12272, option=[null, null, null, null, drop] +item=Pouch, id=12273, option=[null, null, null, null, drop] +item=Pouch, id=12274, option=[null, null, null, null, drop] +item=Pouch, id=12275, option=[null, null, null, null, drop] +item=Pouch, id=12276, option=[null, null, null, null, drop] +item=Pouch, id=12277, option=[null, null, null, null, drop] +item=Pouch, id=12278, option=[null, null, null, null, drop] +item=Pouch, id=12279, option=[null, null, null, null, drop] +item=Pouch, id=12280, option=[null, null, null, null, drop] +item=Pouch, id=12281, option=[null, null, null, null, drop] +item=Pouch, id=12282, option=[null, null, null, null, drop] +item=Pouch, id=12283, option=[null, null, null, null, drop] +item=Pouch, id=12284, option=[null, null, null, null, drop] +item=Pouch, id=12285, option=[null, null, null, null, drop] +item=Pouch, id=12286, option=[null, null, null, null, drop] +item=Pouch, id=12287, option=[null, null, null, null, drop] +item=Pouch, id=12288, option=[null, null, null, null, drop] +item=Pouch, id=12289, option=[null, null, null, null, drop] +item=Pouch, id=12290, option=[null, null, null, null, drop] +item=Pouch, id=12291, option=[null, null, null, null, drop] +item=Pouch, id=12292, option=[null, null, null, null, drop] +item=Pouch, id=12293, option=[null, null, null, null, drop] +item=Pouch, id=12294, option=[null, null, null, null, drop] +item=Pouch, id=12295, option=[null, null, null, null, drop] +item=Pouch, id=12296, option=[null, null, null, null, drop] +item=Pouch, id=12297, option=[null, null, null, null, drop] +item=Pouch, id=12298, option=[null, null, null, null, drop] +item=Pouch, id=12299, option=[null, null, null, null, drop] +item=Pouch, id=12300, option=[null, null, null, null, drop] +item=Pouch, id=12301, option=[null, null, null, null, drop] +item=Pouch, id=12302, option=[null, null, null, null, drop] +item=Pouch, id=12303, option=[null, null, null, null, drop] +item=Pouch, id=12304, option=[null, null, null, null, drop] +item=Pouch, id=12305, option=[null, null, null, null, drop] +item=Pouch, id=12306, option=[null, null, null, null, drop] +item=Pouch, id=12307, option=[null, null, null, null, drop] +item=Pouch, id=12308, option=[null, null, null, null, drop] +item=Pouch, id=12309, option=[null, null, null, null, drop] +item=Pouch, id=12310, option=[null, null, null, null, drop] +item=Pouch, id=12311, option=[null, null, null, null, drop] +item=Pouch, id=12312, option=[null, null, null, null, drop] +item=Pouch, id=12313, option=[null, null, null, null, drop] +item=Pouch, id=12314, option=[null, null, null, null, drop] +item=Pouch, id=12315, option=[null, null, null, null, drop] +item=Pouch, id=12316, option=[null, null, null, null, drop] +item=Pouch, id=12317, option=[null, null, null, null, drop] +item=Pouch, id=12318, option=[null, null, null, null, drop] +item=Pouch, id=12319, option=[null, null, null, null, drop] +item=Pouch, id=12320, option=[null, null, null, null, drop] +item=Pouch, id=12321, option=[null, null, null, null, drop] +item=Pouch, id=12322, option=[null, null, null, null, drop] +item=Pouch, id=12323, option=[null, null, null, null, drop] +item=Pouch, id=12324, option=[null, null, null, null, drop] +item=Pouch, id=12325, option=[null, null, null, null, drop] +item=Pouch, id=12326, option=[null, null, null, null, drop] +item=Pouch, id=12327, option=[null, null, null, null, drop] +item=Pouch, id=12328, option=[null, null, null, null, drop] +item=Pouch, id=12329, option=[null, null, null, null, drop] +item=Pouch, id=12330, option=[null, null, null, null, drop] +item=Pouch, id=12331, option=[null, null, null, null, drop] +item=Pouch, id=12332, option=[null, null, null, null, drop] +item=Pouch, id=12333, option=[null, null, null, null, drop] +item=Pouch, id=12334, option=[null, null, null, null, drop] +item=Pouch, id=12335, option=[null, null, null, null, drop] +item=Pouch, id=12336, option=[null, null, null, null, drop] +item=Pouch, id=12337, option=[null, null, null, null, drop] +item=Pouch, id=12338, option=[null, null, null, null, drop] +item=Pouch, id=12339, option=[null, null, null, null, drop] +item=Pouch, id=12340, option=[null, null, null, null, drop] +item=Pouch, id=12341, option=[null, null, null, null, drop] +item=Pouch, id=12342, option=[null, null, null, null, drop] +item=Pouch, id=12343, option=[null, null, null, null, drop] +item=Pouch, id=12344, option=[null, null, null, null, drop] +item=Pouch, id=12345, option=[null, null, null, null, drop] +item=Pouch, id=12346, option=[null, null, null, null, drop] +item=Pouch, id=12347, option=[null, null, null, null, drop] +item=Pouch, id=12348, option=[null, null, null, null, drop] +item=Pouch, id=12349, option=[null, null, null, null, drop] +item=Pouch, id=12350, option=[null, null, null, null, drop] +item=Pouch, id=12351, option=[null, null, null, null, drop] +item=Pouch, id=12352, option=[null, null, null, null, drop] +item=Pouch, id=12353, option=[null, null, null, null, drop] +item=Pouch, id=12354, option=[null, null, null, null, drop] +item=Pouch, id=12355, option=[null, null, null, null, drop] +item=Pouch, id=12356, option=[null, null, null, null, drop] +item=Pouch, id=12357, option=[null, null, null, null, drop] +item=Pouch, id=12358, option=[null, null, null, null, drop] +item=Pouch, id=12359, option=[null, null, null, null, drop] +item=Pouch, id=12360, option=[null, null, null, null, drop] +item=Pouch, id=12361, option=[null, null, null, null, drop] +item=Pouch, id=12362, option=[null, null, null, null, drop] +item=Pouch, id=12363, option=[null, null, null, null, drop] +item=Pouch, id=12364, option=[null, null, null, null, drop] +item=Pouch, id=12365, option=[null, null, null, null, drop] +item=Pouch, id=12366, option=[null, null, null, null, drop] +item=Pouch, id=12367, option=[null, null, null, null, drop] +item=Pouch, id=12368, option=[null, null, null, null, drop] +item=Pouch, id=12369, option=[null, null, null, null, drop] +item=Pouch, id=12370, option=[null, null, null, null, drop] +item=Pouch, id=12371, option=[null, null, null, null, drop] +item=Pouch, id=12372, option=[null, null, null, null, drop] +item=Pouch, id=12373, option=[null, null, null, null, drop] +item=Pouch, id=12374, option=[null, null, null, null, drop] +item=Pouch, id=12375, option=[null, null, null, null, drop] +item=Pouch, id=12376, option=[null, null, null, null, drop] +item=Pouch, id=12377, option=[null, null, null, null, drop] +item=Pouch, id=12378, option=[null, null, null, null, drop] +item=Pouch, id=12379, option=[null, null, null, null, drop] +item=Pouch, id=12380, option=[null, null, null, null, drop] +item=Pouch, id=12381, option=[null, null, null, null, drop] +item=Pouch, id=12382, option=[null, null, null, null, drop] +item=Pouch, id=12383, option=[null, null, null, null, drop] +item=Pouch, id=12384, option=[null, null, null, null, drop] +item=Pouch, id=12385, option=[null, null, null, null, drop] +item=Pouch, id=12386, option=[null, null, null, null, drop] +item=Pouch, id=12387, option=[null, null, null, null, drop] +item=Pouch, id=12388, option=[null, null, null, null, drop] +item=Pouch, id=12389, option=[null, null, null, null, drop] +item=Pouch, id=12390, option=[null, null, null, null, drop] +item=Pouch, id=12391, option=[null, null, null, null, drop] +item=Pouch, id=12392, option=[null, null, null, null, drop] +item=Pouch, id=12393, option=[null, null, null, null, drop] +item=Pouch, id=12394, option=[null, null, null, null, drop] +item=Pouch, id=12395, option=[null, null, null, null, drop] +item=Pouch, id=12396, option=[null, null, null, null, drop] +item=Pouch, id=12397, option=[null, null, null, null, drop] +item=Pouch, id=12398, option=[null, null, null, null, drop] +item=Pouch, id=12399, option=[null, null, null, null, drop] +item=Pouch, id=12400, option=[null, null, null, null, drop] +item=Pouch, id=12401, option=[null, null, null, null, drop] +item=Pouch, id=12402, option=[null, null, null, null, drop] +item=Pouch, id=12403, option=[null, null, null, null, drop] +item=Pouch, id=12404, option=[null, null, null, null, drop] +item=Pouch, id=12405, option=[null, null, null, null, drop] +item=Pouch, id=12406, option=[null, null, null, null, drop] +item=Pouch, id=12407, option=[null, null, null, null, drop] +item=Pouch, id=12408, option=[null, null, null, null, drop] +item=Pouch, id=12409, option=[null, null, null, null, drop] +item=Pouch, id=12410, option=[null, null, null, null, drop] +item=Pouch, id=12411, option=[null, null, null, null, drop] +item=Pouch, id=12412, option=[null, null, null, null, drop] +item=Pouch, id=12413, option=[null, null, null, null, drop] +item=Pouch, id=12414, option=[null, null, null, null, drop] +item=Pouch, id=12415, option=[null, null, null, null, drop] +item=Pouch, id=12416, option=[null, null, null, null, drop] +item=Pouch, id=12417, option=[null, null, null, null, drop] +item=Pouch, id=12418, option=[null, null, null, null, drop] +item=Pouch, id=12419, option=[null, null, null, null, drop] +item=Pouch, id=12420, option=[null, null, null, null, drop] +item=Scroll, id=12421, option=[null, null, null, null, drop] +item=Herbcall scroll, id=12422, option=[null, null, null, null, drop] +item=Fruitfall scroll, id=12423, option=[null, null, null, null, drop] +item=Fish rain scroll, id=12424, option=[null, null, null, null, drop] +item=Howl scroll, id=12425, option=[null, null, null, null, drop] +item=Thieving fingers scroll, id=12426, option=[null, null, null, null, drop] +item=Abyssal stealth scroll, id=12427, option=[null, null, null, null, drop] +item=Egg spawn scroll, id=12428, option=[null, null, null, null, drop] +item=Multichop scroll, id=12429, option=[null, null, null, null, drop] +item=Cheese feast scroll, id=12430, option=[null, null, null, null, drop] +item=Unburden scroll, id=12431, option=[null, null, null, null, drop] +item=Venom shot scroll, id=12432, option=[null, null, null, null, drop] +item=Insane ferocity scroll, id=12433, option=[null, null, null, null, drop] +item=Healing aura scroll, id=12434, option=[null, null, null, null, drop] +item=Winter storage scroll, id=12435, option=[null, null, null, null, drop] +item=Oph. incubation scroll, id=12436, option=[null, null, null, null, drop] +item=Magic focus scroll, id=12437, option=[null, null, null, null, drop] +item=Swallow whole scroll, id=12438, option=[null, null, null, null, drop] +item=Testudo scroll, id=12439, option=[null, null, null, null, drop] +item=Generate compost scroll, id=12440, option=[null, null, null, null, drop] +item=Tireless run scroll, id=12441, option=[null, null, null, null, drop] +item=Regrowth scroll, id=12442, option=[null, null, null, null, drop] +item=Call to arms scroll, id=12443, option=[null, null, null, null, drop] +item=Blood drain scroll, id=12444, option=[null, null, null, null, drop] +item=Dreadfowl strike scroll, id=12445, option=[null, null, null, null, drop] +item=Sandstorm scroll, id=12446, option=[null, null, null, null, drop] +item=Vampire touch scroll, id=12447, option=[null, null, null, null, drop] +item=Evil flames scroll, id=12448, option=[null, null, null, null, drop] +item=Crushing claw scroll, id=12449, option=[null, null, null, null, drop] +item=Mantis strike scroll, id=12450, option=[null, null, null, null, drop] +item=Arctic blast scroll, id=12451, option=[null, null, null, null, drop] +item=Toad bark scroll, id=12452, option=[null, null, null, null, drop] +item=Dissolve scroll, id=12453, option=[null, null, null, null, drop] +item=Abyssal drain scroll, id=12454, option=[null, null, null, null, drop] +item=Doomsphere scroll, id=12455, option=[null, null, null, null, drop] +item=Spike shot scroll, id=12456, option=[null, null, null, null, drop] +item=Acorn missile scroll, id=12457, option=[null, null, null, null, drop] +item=Petrifying gaze scroll, id=12458, option=[null, null, null, null, drop] +item=Slime spray scroll, id=12459, option=[null, null, null, null, drop] +item=Electric lash scroll, id=12460, option=[null, null, null, null, drop] +item=Bronze bull rush scroll, id=12461, option=[null, null, null, null, drop] +item=Iron bull rush scroll, id=12462, option=[null, null, null, null, drop] +item=Steel bull rush scroll, id=12463, option=[null, null, null, null, drop] +item=Mith bull rush scroll, id=12464, option=[null, null, null, null, drop] +item=Addy bull rush scroll, id=12465, option=[null, null, null, null, drop] +item=Rune bull rush scroll, id=12466, option=[null, null, null, null, drop] +item=Poisonous blast scroll, id=12467, option=[null, null, null, null, drop] +item=Dust cloud scroll, id=12468, option=[null, null, null, null, drop] +item=Hatchling dragon, id=12469, option=[null, null, null, null, drop] +item=Baby dragon, id=12470, option=[null, null, null, null, drop] +item=Hatchling dragon, id=12471, option=[null, null, null, null, drop] +item=Baby dragon, id=12472, option=[null, null, null, null, drop] +item=Hatchling dragon, id=12473, option=[null, null, null, null, drop] +item=Baby dragon, id=12474, option=[null, null, null, null, drop] +item=Hatchling dragon, id=12475, option=[null, null, null, null, drop] +item=Baby dragon, id=12476, option=[null, null, null, null, drop] +item=Red dragon egg, id=12477, option=[null, null, null, null, drop] +item=Blue dragon egg, id=12478, option=[null, null, null, null, drop] +item=Green dragon egg, id=12479, option=[null, null, null, null, drop] +item=Black dragon egg, id=12480, option=[null, null, null, null, drop] +item=Baby penguin, id=12481, option=[null, null, null, null, drop] +item=Penguin, id=12482, option=[null, null, null, null, drop] +item=Penguin egg, id=12483, option=[null, null, null, null, drop] +item=Raven chick, id=12484, option=[null, null, null, null, drop] +item=Raven, id=12485, option=[null, null, null, null, drop] +item=Baby raccoon, id=12486, option=[null, null, null, null, drop] +item=Raccoon, id=12487, option=[null, null, null, null, drop] +item=Baby gecko, id=12488, option=[null, null, null, null, drop] +item=Gecko, id=12489, option=[null, null, null, null, drop] +item=Baby squirrel, id=12490, option=[null, null, null, null, drop] +item=Squirrel, id=12491, option=[null, null, null, null, drop] +item=Baby chameleon, id=12492, option=[null, null, null, null, drop] +item=Chameleon, id=12493, option=[null, null, null, null, drop] +item=Chameleon egg, id=12494, option=[null, null, null, null, drop] +item=Chameleon egg, id=12495, option=[null, null, null, null, drop] +item=Baby monkey, id=12496, option=[null, null, null, null, drop] +item=Monkey, id=12497, option=[null, null, null, null, drop] +item=Vulture chick, id=12498, option=[null, null, null, null, drop] +item=Vulture, id=12499, option=[null, null, null, null, drop] +item=Baby giant crab, id=12500, option=[null, null, null, null, drop] +item=Giant crab, id=12501, option=[null, null, null, null, drop] +item=Crunchy claw token, id=12502, option=[null, null, null, null, drop] +item=Saradomin chick, id=12503, option=[null, null, null, null, drop] +item=Saradomin bird, id=12504, option=[null, null, null, null, drop] +item=Saradomin owl, id=12505, option=[null, null, null, null, drop] +item=Zamorak chick, id=12506, option=[null, null, null, null, drop] +item=Zamorak bird, id=12507, option=[null, null, null, null, drop] +item=Zamorak hawk, id=12508, option=[null, null, null, null, drop] +item=Guthix chick, id=12509, option=[null, null, null, null, drop] +item=Guthix bird, id=12510, option=[null, null, null, null, drop] +item=Guthix raptor, id=12511, option=[null, null, null, null, drop] +item=Terrier puppy, id=12512, option=[null, null, null, null, drop] +item=Terrier, id=12513, option=[null, null, null, null, drop] +item=Greyhound puppy, id=12514, option=[null, null, null, null, drop] +item=Greyhound, id=12515, option=[null, null, null, null, drop] +item=Labrador puppy, id=12516, option=[null, null, null, null, drop] +item=Labrador, id=12517, option=[null, null, null, null, drop] +item=Dalmatian puppy, id=12518, option=[null, null, null, null, drop] +item=Dalmatian, id=12519, option=[null, null, null, null, drop] +item=Sheepdog puppy, id=12520, option=[null, null, null, null, drop] +item=Sheepdog, id=12521, option=[null, null, null, null, drop] +item=Bulldog puppy, id=12522, option=[null, null, null, null, drop] +item=Bulldog, id=12523, option=[null, null, null, null, drop] +item=Summoning cape, id=12524, option=[null, Wear, null, null, drop] +item=Pouch, id=12525, option=[null, null, null, null, Destroy] +item=Spirit wolf pouch, id=12526, option=[null, null, null, Summon, Destroy] +item=Gold charm, id=12527, option=[null, null, null, null, Destroy] +item=Trapdoor key, id=12528, option=[null, null, null, null, Destroy] +item=Howl scroll, id=12529, option=[null, null, null, null, Destroy] +item=Spirit shards, id=12530, option=[null, null, null, null, Destroy] +item=Ibis pouch, id=12531, option=[null, null, null, Summon, drop] +item=Ibis pouch, id=12532, option=[null, null, null, null, drop] +item=Stony shell scroll, id=12533, option=[null, null, null, null, drop] +item=null, id=0, option=[null, null, null, null, drop] +item=Raw pawya meat, id=12535, option=[null, null, null, null, drop] +item=Raw pawya meat, id=12536, option=[null, null, null, null, drop] +item=Grenwall, id=12537, option=[null, null, null, null, drop] +item=Grenwall, id=12538, option=[null, null, null, null, drop] +item=Grenwall spikes, id=12539, option=[null, null, null, null, drop] +item=null, id=12540, option=[null, null, null, null, drop] +item=null, id=12541, option=[null, null, null, null, drop] +item=null, id=12542, option=[null, null, null, null, drop] +item=null, id=12543, option=[null, null, null, null, drop] +item=Pawya, id=12544, option=[null, null, null, null, drop] +item=Pawya, id=12545, option=[null, null, null, null, drop] +item=Enchanted pawya meat, id=12546, option=[null, null, null, null, drop] +item=Platypus, id=12547, option=[null, null, null, null, drop] +item=Platypus, id=12548, option=[null, null, null, null, drop] +item=Platypus, id=12549, option=[null, null, null, null, drop] +item=Platypus, id=12550, option=[null, null, null, null, drop] +item=Baby platypus, id=12551, option=[null, null, null, null, drop] +item=Baby platypus, id=12552, option=[null, null, null, null, drop] +item=Baby platypus, id=12553, option=[null, null, null, null, drop] +item=Patrick, id=12554, option=[null, null, null, null, Release] +item=Penelope, id=12555, option=[null, null, null, null, Release] +item=Peter, id=12556, option=[null, null, null, null, Release] +item=Peanut, id=12557, option=[null, null, null, null, Release] +item=Mud, id=12558, option=[null, Apply, null, null, drop] +item=Ogre wig, id=12559, option=[null, Wear, null, null, drop] +item=Ogre wig, id=12560, option=[null, null, null, null, drop] +item=Ogre kilt, id=12561, option=[null, Wear, null, null, drop] +item=Ogre kilt, id=12562, option=[null, null, null, null, drop] +item=Ogre top, id=12563, option=[null, Wear, null, null, drop] +item=Ogre top, id=12564, option=[null, null, null, null, drop] +item=Ogre boots, id=12565, option=[null, Wear, null, null, drop] +item=Ogre boots, id=12566, option=[null, null, null, null, drop] +item=Diseased kebbit fur, id=12567, option=[null, null, null, null, drop] +item=Davy kebbit hat, id=12568, option=[null, Wear, null, null, drop] +item=Davy kebbit hat, id=12569, option=[null, null, null, null, drop] +item=Ogre club, id=12570, option=[null, Wield, null, null, drop] +item=Ogre club, id=12571, option=[null, null, null, null, drop] +item=Lavender, id=12572, option=[null, null, null, null, drop] +item=Lavender, id=12573, option=[null, null, null, null, drop] +item=Fever grass, id=12574, option=[null, null, null, null, drop] +item=Fever grass, id=12575, option=[null, null, null, null, drop] +item=Tansymum, id=12576, option=[null, null, null, null, drop] +item=Tansymum, id=12577, option=[null, null, null, null, drop] +item=Smouldering fever grass, id=12578, option=[null, Wield, null, Extinguish, drop] +item=Smouldering lavender, id=12579, option=[null, Wield, null, Extinguish, drop] +item=Smouldering tansymum, id=12580, option=[null, Wield, null, Extinguish, drop] +item=Eucalyptus logs, id=12581, option=[null, null, null, null, drop] +item=Eucalyptus logs, id=12582, option=[null, null, null, null, drop] +item=Eucalyptus pyre logs, id=12583, option=[null, null, null, null, drop] +item=Eucalyptus pyre logs, id=12584, option=[null, null, null, null, drop] +item=null, id=12585, option=[null, null, null, null, drop] +item=null, id=12586, option=[null, null, null, null, drop] +item=null, id=12587, option=[null, null, null, null, drop] +item=Primweed, id=12588, option=[null, null, null, null, drop] +item=Primweed, id=12589, option=[null, null, null, null, drop] +item=Stinkbloom, id=12590, option=[null, null, null, null, drop] +item=Stinkbloom, id=12591, option=[null, null, null, null, drop] +item=Diseased kebbit fur, id=12592, option=[null, null, null, null, drop] +item=Catapult schematics, id=12593, option=[Read, null, null, null, Destroy] +item=Engineer's letter, id=12594, option=[Read, null, null, null, Destroy] +item=Sailor's hat, id=12595, option=[null, Wear, null, null, Destroy] +item=Metal catapult parts, id=12596, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12597, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12598, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12599, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12600, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12601, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12602, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12603, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12604, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12605, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12606, option=[null, null, null, null, Destroy] +item=Mahogany catapult part, id=12607, option=[null, Wield, null, null, drop] +item=Amulet of farming(1), id=12608, option=[Rub, Wear, null, null, drop] +item=Amulet of farming(1), id=12609, option=[null, null, null, null, drop] +item=Amulet of farming(2), id=12610, option=[Rub, Wear, null, null, drop] +item=Amulet of farming(2), id=12611, option=[null, null, null, null, drop] +item=Amulet of farming(3), id=12612, option=[Rub, Wear, null, null, drop] +item=Amulet of farming(3), id=12613, option=[null, null, null, null, drop] +item=Amulet of farming(4), id=12614, option=[Rub, Wear, null, null, drop] +item=Amulet of farming(4), id=12615, option=[null, null, null, null, drop] +item=Amulet of farming(5), id=12616, option=[Rub, Wear, null, null, drop] +item=Amulet of farming(5), id=12617, option=[null, null, null, null, drop] +item=Amulet of farming(6), id=12618, option=[Rub, Wear, null, null, drop] +item=Amulet of farming(6), id=12619, option=[null, null, null, null, drop] +item=Amulet of farming(7), id=12620, option=[Rub, Wear, null, null, drop] +item=Amulet of farming(7), id=12621, option=[null, null, null, null, drop] +item=Amulet of farming(8), id=12622, option=[Rub, Wear, null, null, drop] +item=Amulet of farming(8), id=12623, option=[null, null, null, null, drop] +item=Ogleroot, id=12624, option=[null, null, null, null, drop] +item=Flag, id=12625, option=[null, null, null, null, Destroy] +item=Test paper, id=12626, option=[Take Exam, null, null, null, Destroy] +item=Antique lamp, id=12627, option=[Rub, null, null, null, Destroy] +item=Antique lamp, id=12628, option=[Rub, null, null, null, Destroy] +item=Safety gloves, id=12629, option=[null, Wear, null, null, Destroy] +item=Rubium, id=12630, option=[null, null, null, null, Destroy] +item=Toy train, id=12631, option=[null, null, null, null, Destroy] +item=Note, id=12632, option=[Read, null, null, null, Destroy] +item=Super fishing explosive, id=12633, option=[null, null, null, null, drop] +item=Chocatrice cape, id=12634, option=[null, Wear, null, null, Destroy] +item=Easter egg, id=12635, option=[Eat, null, null, null, Destroy] +item=Easter egg, id=12636, option=[Eat, null, null, null, Destroy] +item=Easter egg, id=12637, option=[Eat, null, null, null, Destroy] +item=Easter egg, id=12638, option=[Eat, null, null, null, Destroy] +item=Easter egg, id=12639, option=[Eat, null, null, null, Destroy] +item=Easter egg, id=12640, option=[Eat, null, null, null, Destroy] +item=Easter egg, id=12641, option=[Eat, null, null, null, Destroy] +item=Easter egg, id=12642, option=[Eat, null, null, null, Destroy] +item=Easter egg, id=12643, option=[Eat, null, null, null, Destroy] +item=Easter egg, id=12644, option=[Eat, null, null, null, Destroy] +item=Chocatrice cape, id=12645, option=[null, Wear, null, null, Destroy] +item=Chocolate egg, id=12646, option=[Eat, null, null, null, drop] +item=Chocolate egg, id=12647, option=[Eat, null, null, null, drop] +item=Chocolate egg, id=12648, option=[Eat, null, null, null, drop] +item=Bucket, id=12649, option=[null, null, null, null, drop] +item=Bucket of water, id=12650, option=[null, null, Empty, null, drop] +item=Bucket of water, id=12651, option=[null, null, Empty, null, drop] +item=Bucket of coal, id=12652, option=[null, null, Empty, null, drop] +item=Bucket of coal, id=12653, option=[null, null, Empty, null, drop] +item=Cockatrice egg, id=12654, option=[null, null, null, null, Destroy] +item=Chocatrice egg, id=12655, option=[null, null, null, null, Destroy] +item=Chocatrice object, id=12656, option=[null, null, null, null, drop] +item=Chocolate chunks, id=12657, option=[null, null, null, null, Destroy] +item=Adamant full helm (e), id=12658, option=[null, Wear, null, null, drop] +item=Adamant full helm (charged), id=12659, option=[null, Wear, Commune, Uncharge, drop] +item=Snakeskin bandana (e), id=12660, option=[null, Wear, null, null, drop] +item=Snakeskin bandana (charged), id=12661, option=[null, Wear, Commune, Uncharge, drop] +item=Splitbark helm (e), id=12662, option=[null, Wear, null, null, drop] +item=Splitbark helm (charged), id=12663, option=[null, Wear, Commune, Uncharge, drop] +item=Rune full helm (e), id=12664, option=[null, Wear, null, null, drop] +item=Rune full helm (charged), id=12665, option=[null, Wear, Commune, Uncharge, drop] +item=Dragon med helm (e), id=12666, option=[null, Wear, null, null, drop] +item=Dragon med helm (charged), id=12667, option=[null, Wear, Commune, Uncharge, drop] +item=Lunar helm (e), id=12668, option=[null, Wear, null, null, Destroy] +item=Lunar helm (charged), id=12669, option=[null, Wear, Commune, Uncharge, Destroy] +item=Armadyl helmet (e), id=12670, option=[null, Wear, null, null, drop] +item=Armadyl helmet (charged), id=12671, option=[null, Wear, Commune, Uncharge, drop] +item=Archer helm (e), id=12672, option=[null, Wear, null, null, drop] +item=Archer helm (charged), id=12673, option=[null, Wear, Commune, Uncharge, drop] +item=Berserker helm (e), id=12674, option=[null, Wear, null, null, drop] +item=Berserker helm (charged), id=12675, option=[null, Wear, Commune, Uncharge, drop] +item=Warrior helm (e), id=12676, option=[null, Wear, null, null, drop] +item=Warrior helm (charged), id=12677, option=[null, Wear, Commune, Uncharge, drop] +item=Farseer helm (e), id=12678, option=[null, Wear, null, null, drop] +item=Farseer helm (charged), id=12679, option=[null, Wear, Commune, Uncharge, drop] +item=Helm of neitiznot (e), id=12680, option=[null, Wear, null, null, drop] +item=Helm of neitiznot (charged), id=12681, option=[null, Wear, Commune, Uncharge, drop] +item=Baby monkey, id=12682, option=[null, null, null, null, drop] +item=Monkey, id=12683, option=[null, null, null, null, drop] +item=Baby monkey, id=12684, option=[null, null, null, null, drop] +item=Monkey, id=12685, option=[null, null, null, null, drop] +item=Baby monkey, id=12686, option=[null, null, null, null, drop] +item=Monkey, id=12687, option=[null, null, null, null, drop] +item=Baby monkey, id=12688, option=[null, null, null, null, drop] +item=Monkey, id=12689, option=[null, null, null, null, drop] +item=Baby monkey, id=12690, option=[null, null, null, null, drop] +item=Monkey, id=12691, option=[null, null, null, null, drop] +item=Baby monkey, id=12692, option=[null, null, null, null, drop] +item=Monkey, id=12693, option=[null, null, null, null, drop] +item=Baby monkey, id=12694, option=[null, null, null, null, drop] +item=Monkey, id=12695, option=[null, null, null, null, drop] +item=Baby monkey, id=12696, option=[null, null, null, null, drop] +item=Monkey, id=12697, option=[null, null, null, null, drop] +item=Baby monkey, id=12698, option=[null, null, null, null, drop] +item=Monkey, id=12699, option=[null, null, null, null, drop] +item=Terrier puppy, id=12700, option=[null, null, null, null, drop] +item=Terrier, id=12701, option=[null, null, null, null, drop] +item=Terrier puppy, id=12702, option=[null, null, null, null, drop] +item=Terrier, id=12703, option=[null, null, null, null, drop] +item=Greyhound puppy, id=12704, option=[null, null, null, null, drop] +item=Greyhound, id=12705, option=[null, null, null, null, drop] +item=Greyhound puppy, id=12706, option=[null, null, null, null, drop] +item=Greyhound, id=12707, option=[null, null, null, null, drop] +item=Labrador puppy, id=12708, option=[null, null, null, null, drop] +item=Labrador, id=12709, option=[null, null, null, null, drop] +item=Labrador puppy, id=12710, option=[null, null, null, null, drop] +item=Labrador, id=12711, option=[null, null, null, null, drop] +item=Dalmatian puppy, id=12712, option=[null, null, null, null, drop] +item=Dalmatian, id=12713, option=[null, null, null, null, drop] +item=Dalmatian puppy, id=12714, option=[null, null, null, null, drop] +item=Dalmatian, id=12715, option=[null, null, null, null, drop] +item=Sheepdog puppy, id=12716, option=[null, null, null, null, drop] +item=Sheepdog, id=12717, option=[null, null, null, null, drop] +item=Sheepdog puppy, id=12718, option=[null, null, null, null, drop] +item=Sheepdog, id=12719, option=[null, null, null, null, drop] +item=Bulldog puppy, id=12720, option=[null, null, null, null, drop] +item=Bulldog, id=12721, option=[null, null, null, null, drop] +item=Bulldog puppy, id=12722, option=[null, null, null, null, drop] +item=Bulldog, id=12723, option=[null, null, null, null, drop] +item=Raven chick, id=12724, option=[null, null, null, null, drop] +item=Raven, id=12725, option=[null, null, null, null, drop] +item=Raven chick, id=12726, option=[null, null, null, null, drop] +item=Raven, id=12727, option=[null, null, null, null, drop] +item=Raven chick, id=12728, option=[null, null, null, null, drop] +item=Raven, id=12729, option=[null, null, null, null, drop] +item=Raven chick, id=12730, option=[null, null, null, null, drop] +item=Raven, id=12731, option=[null, null, null, null, drop] +item=Raven chick, id=12732, option=[null, null, null, null, drop] +item=Raven, id=12733, option=[null, null, null, null, drop] +item=Baby raccoon, id=12734, option=[null, null, null, null, drop] +item=Raccoon, id=12735, option=[null, null, null, null, drop] +item=Baby raccoon, id=12736, option=[null, null, null, null, drop] +item=Raccoon, id=12737, option=[null, null, null, null, drop] +item=Baby gecko, id=12738, option=[null, null, null, null, drop] +item=Baby gecko, id=12739, option=[null, null, null, null, drop] +item=Baby gecko, id=12740, option=[null, null, null, null, drop] +item=Baby gecko, id=12741, option=[null, null, null, null, drop] +item=Gecko, id=12742, option=[null, null, null, null, drop] +item=Gecko, id=12743, option=[null, null, null, null, drop] +item=Gecko, id=12744, option=[null, null, null, null, drop] +item=Gecko, id=12745, option=[null, null, null, null, drop] +item=Baby giant crab, id=12746, option=[null, null, null, null, drop] +item=Giant crab, id=12747, option=[null, null, null, null, drop] +item=Baby giant crab, id=12748, option=[null, null, null, null, drop] +item=Giant crab, id=12749, option=[null, null, null, null, drop] +item=Baby giant crab, id=12750, option=[null, null, null, null, drop] +item=Giant crab, id=12751, option=[null, null, null, null, drop] +item=Baby giant crab, id=12752, option=[null, null, null, null, drop] +item=Giant crab, id=12753, option=[null, null, null, null, drop] +item=Baby squirrel, id=12754, option=[null, null, null, null, drop] +item=Squirrel, id=12755, option=[null, null, null, null, drop] +item=Baby squirrel, id=12756, option=[null, null, null, null, drop] +item=Squirrel, id=12757, option=[null, null, null, null, drop] +item=Baby squirrel, id=12758, option=[null, null, null, null, drop] +item=Squirrel, id=12759, option=[null, null, null, null, drop] +item=Baby squirrel, id=12760, option=[null, null, null, null, drop] +item=Squirrel, id=12761, option=[null, null, null, null, drop] +item=Penguin, id=12762, option=[null, null, null, null, drop] +item=Baby penguin, id=12763, option=[null, null, null, null, drop] +item=Penguin, id=12764, option=[null, null, null, null, drop] +item=Baby penguin, id=12765, option=[null, null, null, null, drop] +item=Vulture chick, id=12766, option=[null, null, null, null, drop] +item=Vulture, id=12767, option=[null, null, null, null, drop] +item=Vulture chick, id=12768, option=[null, null, null, null, drop] +item=Vulture, id=12769, option=[null, null, null, null, drop] +item=Vulture chick, id=12770, option=[null, null, null, null, drop] +item=Vulture, id=12771, option=[null, null, null, null, drop] +item=Vulture chick, id=12772, option=[null, null, null, null, drop] +item=Vulture, id=12773, option=[null, null, null, null, drop] +item=Vulture chick, id=12774, option=[null, null, null, null, drop] +item=Vulture, id=12775, option=[null, null, null, null, drop] +item=Swamp titan pouch, id=12776, option=[null, null, null, Summon, drop] +item=Swamp titan pouch, id=12777, option=[null, null, null, null, drop] +item=Spirit mosquito pouch, id=12778, option=[null, null, null, Summon, drop] +item=Spirit mosquito pouch, id=12779, option=[null, null, null, null, drop] +item=Void spinner pouch, id=12780, option=[null, null, null, Summon, drop] +item=Void spinner pouch, id=12781, option=[null, null, null, null, drop] +item=Forge regent pouch, id=12782, option=[null, null, null, Summon, drop] +item=Forge regent pouch, id=12783, option=[null, null, null, null, drop] +item=Spirit larupia pouch, id=12784, option=[null, null, null, Summon, drop] +item=Spirit larupia pouch, id=12785, option=[null, null, null, null, drop] +item=Geyser titan pouch, id=12786, option=[null, null, null, Summon, drop] +item=Geyser titan pouch, id=12787, option=[null, null, null, null, drop] +item=Lava titan pouch, id=12788, option=[null, null, null, Summon, drop] +item=Lava titan pouch, id=12789, option=[null, null, null, null, drop] +item=Steel titan pouch, id=12790, option=[null, null, null, Summon, drop] +item=Steel titan pouch, id=12791, option=[null, null, null, null, drop] +item=Obsidian golem pouch, id=12792, option=[null, null, null, Summon, drop] +item=Obsidian golem pouch, id=12793, option=[null, null, null, null, drop] +item=Talon beast pouch, id=12794, option=[null, null, null, Summon, drop] +item=Talon beast pouch, id=12795, option=[null, null, null, null, drop] +item=Abyssal titan pouch, id=12796, option=[null, null, null, Summon, drop] +item=Abyssal titan pouch, id=12797, option=[null, null, null, null, drop] +item=Void torcher pouch, id=12798, option=[null, null, null, Summon, drop] +item=Void torcher pouch, id=12799, option=[null, null, null, null, drop] +item=Giant chinchompa pouch, id=12800, option=[null, null, null, Summon, drop] +item=Giant chinchompa pouch, id=12801, option=[null, null, null, null, drop] +item=Fire titan pouch, id=12802, option=[null, null, null, Summon, drop] +item=Fire titan pouch, id=12803, option=[null, null, null, null, drop] +item=Moss titan pouch, id=12804, option=[null, null, null, Summon, drop] +item=Moss titan pouch, id=12805, option=[null, null, null, null, drop] +item=Ice titan pouch, id=12806, option=[null, null, null, Summon, drop] +item=Ice titan pouch, id=12807, option=[null, null, null, null, drop] +item=Spirit tz-kih pouch, id=12808, option=[null, null, null, Summon, drop] +item=Spirit tz-kih pouch, id=12809, option=[null, null, null, null, drop] +item=Spirit graahk pouch, id=12810, option=[null, null, null, Summon, drop] +item=Spirit graahk pouch, id=12811, option=[null, null, null, null, drop] +item=Spirit kyatt pouch, id=12812, option=[null, null, null, Summon, drop] +item=Spirit kyatt pouch, id=12813, option=[null, null, null, null, drop] +item=Void shifter pouch, id=12814, option=[null, null, null, Summon, drop] +item=Void shifter pouch, id=12815, option=[null, null, null, null, drop] +item=Pyrelord pouch, id=12816, option=[null, null, null, Summon, drop] +item=Pyrelord pouch, id=12817, option=[null, null, null, null, drop] +item=Void ravager pouch, id=12818, option=[null, null, null, Summon, drop] +item=Void ravager pouch, id=12819, option=[null, null, null, null, drop] +item=Ravenous locust pouch, id=12820, option=[null, null, null, Summon, drop] +item=Ravenous locust pouch, id=12821, option=[null, null, null, null, drop] +item=Iron titan pouch, id=12822, option=[null, null, null, Summon, drop] +item=Iron titan pouch, id=12823, option=[null, null, null, null, drop] +item=Titan's con. scroll, id=12824, option=[null, null, null, null, drop] +item=Steel of legends scroll, id=12825, option=[null, null, null, null, drop] +item=Volcanic str. scroll, id=12826, option=[null, null, null, null, drop] +item=Essence shipment scroll, id=12827, option=[null, null, null, null, drop] +item=Iron within scroll, id=12828, option=[null, null, null, null, drop] +item=Immense heat scroll, id=12829, option=[null, null, null, null, drop] +item=Famine scroll, id=12830, option=[null, null, null, null, drop] +item=Deadly claw scroll, id=12831, option=[null, null, null, null, drop] +item=Swamp plague scroll, id=12832, option=[null, null, null, null, drop] +item=Boil scroll, id=12833, option=[null, null, null, null, drop] +item=Explode scroll, id=12834, option=[null, null, null, null, drop] +item=Goad scroll, id=12835, option=[null, null, null, null, drop] +item=Ambush scroll, id=12836, option=[null, null, null, null, drop] +item=Ebon thunder scroll, id=12837, option=[null, null, null, null, drop] +item=Pester scroll, id=12838, option=[null, null, null, null, drop] +item=Fireball assault scroll, id=12839, option=[null, null, null, null, drop] +item=Rending scroll, id=12840, option=[null, null, null, null, drop] +item=Inferno scroll, id=12841, option=[null, null, null, null, drop] +item=Gnomecopter, id=12842, option=[null, Ride, null, null, drop] +item=Gnomecopter ticket, id=12843, option=[Read, null, null, null, Destroy] +item=Toy kite, id=12844, option=[Fly, Wield, null, null, drop] +item=Stone of power, id=12845, option=[null, Wield, null, null, Destroy] +item=Stone of power, id=12846, option=[null, Wield, null, null, Destroy] +item=Stone of power, id=12847, option=[null, Wield, null, null, Destroy] +item=Stone of power, id=12848, option=[null, Wield, null, null, Destroy] +item=Stone of power, id=12849, option=[null, Wield, null, null, Destroy] +item=Elemental rune, id=12850, option=[null, null, null, null, Destroy] +item=Catalytic rune, id=12851, option=[null, null, null, null, Destroy] +item=Fist of guthix token, id=12852, option=[null, null, null, null, drop] +item=Bandages, id=12853, option=[Heal, null, null, null, Destroy] +item=null, id=12854, option=[null, null, null, null, drop] +item=Tele-orb, id=12855, option=[Teleport, null, null, null, Destroy] +item=Irit gloves, id=12856, option=[null, Wear, Inspect, null, Destroy] +item=Avantoe gloves, id=12857, option=[null, Wear, Inspect, null, Destroy] +item=Kwuarm gloves, id=12858, option=[null, Wear, Inspect, null, Destroy] +item=Cadantine gloves, id=12859, option=[null, Wear, Inspect, null, Destroy] +item=Swordfish gloves, id=12860, option=[null, Wear, Inspect, null, Destroy] +item=Shark gloves, id=12861, option=[null, Wear, Inspect, null, Destroy] +item=Dragon slayer gloves, id=12862, option=[null, Wear, Inspect, null, Destroy] +item=Air runecrafting gloves, id=12863, option=[null, Wear, Inspect, null, Destroy] +item=Water runecrafting gloves, id=12864, option=[null, Wear, Inspect, null, Destroy] +item=Earth runecrafting gloves, id=12865, option=[null, Wear, Inspect, null, Destroy] +item=Battle hood 100, id=12866, option=[null, Wear, null, null, drop] +item=Battle hood 80, id=12867, option=[null, Wear, null, null, drop] +item=Battle hood 60, id=12868, option=[null, Wear, null, null, drop] +item=Battle hood 40, id=12869, option=[null, Wear, null, null, drop] +item=Battle hood 20, id=12870, option=[null, Wear, null, null, drop] +item=Battle hood 0, id=12871, option=[null, Wear, null, null, drop] +item=Battle hood 0, id=12872, option=[null, null, null, null, drop] +item=Battle robe top 100, id=12873, option=[null, Wear, null, null, drop] +item=Battle robe top 80, id=12874, option=[null, Wear, null, null, drop] +item=Battle robe top 60, id=12875, option=[null, Wear, null, null, drop] +item=Battle robe top 40, id=12876, option=[null, Wear, null, null, drop] +item=Battle robe top 20, id=12877, option=[null, Wear, null, null, drop] +item=Battle robe top 0, id=12878, option=[null, Wear, null, null, drop] +item=Battle robe top 0, id=12879, option=[null, null, null, null, drop] +item=Battle robe bottom 100, id=12880, option=[null, Wear, null, null, drop] +item=Battle robe bottom 80, id=12881, option=[null, Wear, null, null, drop] +item=Battle robe bottom 60, id=12882, option=[null, Wear, null, null, drop] +item=Battle robe bottom 40, id=12883, option=[null, Wear, null, null, drop] +item=Battle robe bottom 20, id=12884, option=[null, Wear, null, null, drop] +item=Battle robe bottom 0, id=12885, option=[null, Wear, null, null, drop] +item=Battle robe bottom 0, id=12886, option=[null, null, null, null, drop] +item=Druidic mage hood 100, id=12887, option=[null, Wear, null, null, drop] +item=Druidic mage hood 80, id=12888, option=[null, Wear, null, null, drop] +item=Druidic mage hood 60, id=12889, option=[null, Wear, null, null, drop] +item=Druidic mage hood 40, id=12890, option=[null, Wear, null, null, drop] +item=Druidic mage hood 20, id=12891, option=[null, Wear, null, null, drop] +item=Druidic mage hood 0, id=12892, option=[null, Wear, null, null, drop] +item=Druidic mage hood 0, id=12893, option=[null, null, null, null, drop] +item=Druidic mage top 100, id=12894, option=[null, Wear, null, null, drop] +item=Druidic mage top 80, id=12895, option=[null, Wear, null, null, drop] +item=Druidic mage top 60, id=12896, option=[null, Wear, null, null, drop] +item=Druidic mage top 40, id=12897, option=[null, Wear, null, null, drop] +item=Druidic mage top 20, id=12898, option=[null, Wear, null, null, drop] +item=Druidic mage top 0, id=12899, option=[null, Wear, null, null, drop] +item=Druidic mage top 0, id=12900, option=[null, null, null, null, drop] +item=Druidic mage bottom 100, id=12901, option=[null, Wear, null, null, drop] +item=Druidic mage bottom 80, id=12902, option=[null, Wear, null, null, drop] +item=Druidic mage bottom 60, id=12903, option=[null, Wear, null, null, drop] +item=Druidic mage bottom 40, id=12904, option=[null, Wear, null, null, drop] +item=Druidic mage bottom 20, id=12905, option=[null, Wear, null, null, drop] +item=Druidic mage bottom 0, id=12906, option=[null, Wear, null, null, drop] +item=Druidic mage bottom 0, id=12907, option=[null, null, null, null, drop] +item=Adamant spikeshield 100, id=12908, option=[null, Wield, null, null, drop] +item=Adamant spikeshield 80, id=12909, option=[null, Wield, null, null, drop] +item=Adamant spikeshield 60, id=12910, option=[null, Wield, null, null, drop] +item=Adamant spikeshield 40, id=12911, option=[null, Wield, null, null, drop] +item=Adamant spikeshield 20, id=12912, option=[null, Wield, null, null, drop] +item=Adamant spikeshield 0, id=12913, option=[null, Wield, null, null, drop] +item=Adamant spikeshield 0, id=12914, option=[null, null, null, null, drop] +item=Adamant berserker shield 100, id=12915, option=[null, Wear, null, null, drop] +item=Adamant berserker shield 80, id=12916, option=[null, Wear, null, null, drop] +item=Adamant berserker shield 60, id=12917, option=[null, Wear, null, null, drop] +item=Adamant berserker shield 40, id=12918, option=[null, Wear, null, null, drop] +item=Adamant berserker shield 20, id=12919, option=[null, Wear, null, null, drop] +item=Adamant berserker shield 0, id=12920, option=[null, Wear, null, null, drop] +item=Adamant berserker shield 0, id=12921, option=[null, null, null, null, drop] +item=Rune spikeshield 100, id=12922, option=[null, Wield, null, null, drop] +item=Rune spikeshield 80, id=12923, option=[null, Wield, null, null, drop] +item=Rune spikeshield 60, id=12924, option=[null, Wield, null, null, drop] +item=Rune spikeshield 40, id=12925, option=[null, Wield, null, null, drop] +item=Rune spikeshield 20, id=12926, option=[null, Wield, null, null, drop] +item=Rune spikeshield 0, id=12927, option=[null, Wield, null, null, drop] +item=Rune spikeshield 0, id=12928, option=[null, null, null, null, drop] +item=Rune berserker shield 100, id=12929, option=[null, Wear, null, null, drop] +item=Rune berserker shield 80, id=12930, option=[null, Wear, null, null, drop] +item=Rune berserker shield 60, id=12931, option=[null, Wear, null, null, drop] +item=Rune berserker shield 40, id=12932, option=[null, Wear, null, null, drop] +item=Rune berserker shield 20, id=12933, option=[null, Wear, null, null, drop] +item=Rune berserker shield 0, id=12934, option=[null, Wear, null, null, drop] +item=Rune berserker shield 0, id=12935, option=[null, null, null, null, drop] +item=Green d'hide coif 100, id=12936, option=[null, Wear, null, null, drop] +item=Green d'hide coif 80, id=12937, option=[null, Wear, null, null, drop] +item=Green d'hide coif 60, id=12938, option=[null, Wear, null, null, drop] +item=Green d'hide coif 40, id=12939, option=[null, Wear, null, null, drop] +item=Green d'hide coif 20, id=12940, option=[null, Wear, null, null, drop] +item=Green d'hide coif 0, id=12941, option=[null, Wear, null, null, drop] +item=Green d'hide coif 0, id=12942, option=[null, null, null, null, drop] +item=Blue d'hide coif 100, id=12943, option=[null, Wear, null, null, drop] +item=Blue d'hide coif 80, id=12944, option=[null, Wear, null, null, drop] +item=Blue d'hide coif 60, id=12945, option=[null, Wear, null, null, drop] +item=Blue d'hide coif 40, id=12946, option=[null, Wear, null, null, drop] +item=Blue d'hide coif 20, id=12947, option=[null, Wear, null, null, drop] +item=Blue d'hide coif 0, id=12948, option=[null, Wear, null, null, drop] +item=Blue d'hide coif 0, id=12949, option=[null, null, null, null, drop] +item=Red d'hide coif 100, id=12950, option=[null, Wear, null, null, drop] +item=Red d'hide coif 80, id=12951, option=[null, Wear, null, null, drop] +item=Red d'hide coif 60, id=12952, option=[null, Wear, null, null, drop] +item=Red d'hide coif 40, id=12953, option=[null, Wear, null, null, drop] +item=Red d'hide coif 20, id=12954, option=[null, Wear, null, null, drop] +item=Red d'hide coif 0, id=12955, option=[null, Wear, null, null, drop] +item=Red d'hide coif 0, id=12956, option=[null, null, null, null, drop] +item=Black d'hide coif 100, id=12957, option=[null, Wear, null, null, drop] +item=Black d'hide coif 80, id=12958, option=[null, Wear, null, null, drop] +item=Black d'hide coif 60, id=12959, option=[null, Wear, null, null, drop] +item=Black d'hide coif 40, id=12960, option=[null, Wear, null, null, drop] +item=Black d'hide coif 20, id=12961, option=[null, Wear, null, null, drop] +item=Black d'hide coif 0, id=12962, option=[null, Wear, null, null, drop] +item=Black d'hide coif 0, id=12963, option=[null, null, null, null, drop] +item=Combat hood 100, id=12964, option=[null, Wear, null, null, drop] +item=Combat hood 80, id=12965, option=[null, Wear, null, null, drop] +item=Combat hood 60, id=12966, option=[null, Wear, null, null, drop] +item=Combat hood 40, id=12967, option=[null, Wear, null, null, drop] +item=Combat hood 20, id=12968, option=[null, Wear, null, null, drop] +item=Combat hood 0, id=12969, option=[null, Wear, null, null, drop] +item=Combat hood 0, id=12970, option=[null, null, null, null, drop] +item=Combat robe top 100, id=12971, option=[null, Wear, null, null, drop] +item=Combat robe top 80, id=12972, option=[null, Wear, null, null, drop] +item=Combat robe top 60, id=12973, option=[null, Wear, null, null, drop] +item=Combat robe top 40, id=12974, option=[null, Wear, null, null, drop] +item=Combat robe top 20, id=12975, option=[null, Wear, null, null, drop] +item=Combat robe top 0, id=12976, option=[null, Wear, null, null, drop] +item=Combat robe top 0, id=12977, option=[null, null, null, null, drop] +item=Combat robe bottom 100, id=12978, option=[null, Wear, null, null, drop] +item=Combat robe bottom 80, id=12979, option=[null, Wear, null, null, drop] +item=Combat robe bottom 60, id=12980, option=[null, Wear, null, null, drop] +item=Combat robe bottom 40, id=12981, option=[null, Wear, null, null, drop] +item=Combat robe bottom 20, id=12982, option=[null, Wear, null, null, drop] +item=Combat robe bottom 0, id=12983, option=[null, Wear, null, null, drop] +item=Combat robe bottom 0, id=12984, option=[null, null, null, null, drop] +item=Bronze gauntlets, id=12985, option=[null, Wear, null, null, drop] +item=Worn-out bronze gauntlets, id=12986, option=[null, Wear, null, null, drop] +item=Worn-out bronze gauntlets, id=12987, option=[null, null, null, null, drop] +item=Iron gauntlets, id=12988, option=[null, Wear, null, null, drop] +item=Worn-out iron gauntlets, id=12989, option=[null, Wear, null, null, drop] +item=Worn-out iron gauntlets, id=12990, option=[null, null, null, null, drop] +item=Steel gauntlets, id=12991, option=[null, Wear, null, null, drop] +item=Worn-out steel gauntlets, id=12992, option=[null, Wear, null, null, drop] +item=Worn-out steel gauntlets, id=12993, option=[null, null, null, null, drop] +item=Black gauntlets, id=12994, option=[null, Wear, null, null, drop] +item=Worn-out black gauntlets, id=12995, option=[null, Wear, null, null, drop] +item=Worn-out black gauntlets, id=12996, option=[null, null, null, null, drop] +item=Mithril gauntlets, id=12997, option=[null, Wear, null, null, drop] +item=Worn-out mithril gauntlets, id=12998, option=[null, Wear, null, null, drop] +item=Worn-out mithril gauntlets, id=12999, option=[null, null, null, null, drop] +item=Adamant gauntlets, id=13000, option=[null, Wear, null, null, drop] +item=Worn-out adamant gauntlets, id=13001, option=[null, Wear, null, null, drop] +item=Worn-out adamant gauntlets, id=13002, option=[null, null, null, null, drop] +item=Rune gauntlets, id=13003, option=[null, Wear, null, null, drop] +item=Worn-out rune gauntlets, id=13004, option=[null, Wear, null, null, drop] +item=Worn-out rune gauntlets, id=13005, option=[null, null, null, null, drop] +item=Dragon gauntlets, id=13006, option=[null, Wear, null, null, drop] +item=Worn-out dragon gauntlets, id=13007, option=[null, Wear, null, null, drop] +item=Worn-out dragon gauntlets, id=13008, option=[null, null, null, null, drop] +item=null, id=13009, option=[null, null, null, null, drop] +item=Clue scroll, id=13010, option=[Read, null, null, null, drop] +item=Puzzle box, id=13011, option=[Open, null, null, null, drop] +item=Clue scroll, id=13012, option=[Read, null, null, null, drop] +item=Puzzle box, id=13013, option=[Open, null, null, null, drop] +item=Clue scroll, id=13014, option=[Read, null, null, null, drop] +item=Puzzle box, id=13015, option=[Open, null, null, null, drop] +item=Clue scroll, id=13016, option=[Read, null, null, null, drop] +item=Puzzle box, id=13017, option=[Open, null, null, null, drop] +item=Clue scroll, id=13018, option=[Read, null, null, null, drop] +item=Puzzle box, id=13019, option=[Open, null, null, null, drop] +item=Clue scroll, id=13020, option=[Read, null, null, null, drop] +item=Puzzle box, id=13021, option=[Open, null, null, null, drop] +item=Clue scroll, id=13022, option=[Read, null, null, null, drop] +item=Puzzle box, id=13023, option=[Open, null, null, null, drop] +item=Clue scroll, id=13024, option=[Read, null, null, null, drop] +item=Puzzle box, id=13025, option=[Open, null, null, null, drop] +item=Clue scroll, id=13026, option=[Read, null, null, null, drop] +item=Puzzle box, id=13027, option=[Open, null, null, null, drop] +item=Clue scroll, id=13028, option=[Read, null, null, null, drop] +item=Puzzle box, id=13029, option=[Open, null, null, null, drop] +item=Clue scroll, id=13030, option=[Read, null, null, null, drop] +item=Puzzle box, id=13031, option=[Open, null, null, null, drop] +item=Clue scroll, id=13032, option=[Read, null, null, null, drop] +item=Puzzle box, id=13033, option=[Open, null, null, null, drop] +item=Clue scroll, id=13034, option=[Read, null, null, null, drop] +item=Puzzle box, id=13035, option=[Open, null, null, null, drop] +item=Clue scroll, id=13036, option=[Read, null, null, null, drop] +item=Casket, id=13037, option=[Open, null, null, null, drop] +item=Clue scroll, id=13038, option=[Read, null, null, null, drop] +item=Casket, id=13039, option=[Open, null, null, null, drop] +item=Clue scroll, id=13040, option=[Read, null, null, null, drop] +item=Clue scroll, id=13041, option=[Read, null, null, null, drop] +item=Clue scroll, id=13042, option=[Read, null, null, null, drop] +item=Casket, id=13043, option=[Open, null, null, null, drop] +item=Clue scroll, id=13044, option=[Read, null, null, null, drop] +item=Casket, id=13045, option=[Open, null, null, null, drop] +item=Clue scroll, id=13046, option=[Read, null, null, null, drop] +item=Casket, id=13047, option=[Open, null, null, null, drop] +item=Clue scroll, id=13048, option=[Read, null, null, null, drop] +item=Clue scroll, id=13049, option=[Read, null, null, null, drop] +item=Clue scroll, id=13050, option=[Read, null, null, null, drop] +item=Clue scroll, id=13051, option=[Read, null, null, null, drop] +item=Casket, id=13052, option=[Open, null, null, null, drop] +item=Clue scroll, id=13053, option=[Read, null, null, null, drop] +item=Casket, id=13054, option=[Open, null, null, null, drop] +item=Clue scroll, id=13055, option=[Read, null, null, null, drop] +item=Clue scroll, id=13056, option=[Read, null, null, null, drop] +item=Casket, id=13057, option=[Open, null, null, null, drop] +item=Clue scroll, id=13058, option=[Read, null, null, null, drop] +item=Casket, id=13059, option=[Open, null, null, null, drop] +item=Clue scroll, id=13060, option=[Read, null, null, null, drop] +item=Clue scroll, id=13061, option=[Read, null, null, null, drop] +item=Casket, id=13062, option=[Open, null, null, null, drop] +item=Clue scroll, id=13063, option=[Read, null, null, null, drop] +item=Casket, id=13064, option=[Open, null, null, null, drop] +item=Clue scroll, id=13065, option=[Read, null, null, null, drop] +item=Casket, id=13066, option=[Open, null, null, null, drop] +item=Clue scroll, id=13067, option=[Read, null, null, null, drop] +item=Clue scroll, id=13068, option=[Read, null, null, null, drop] +item=Clue scroll, id=13069, option=[Read, null, null, null, drop] +item=Clue scroll, id=13070, option=[Read, null, null, null, drop] +item=Clue scroll, id=13071, option=[Read, null, null, null, drop] +item=Clue scroll, id=13072, option=[Read, null, null, null, drop] +item=Key, id=13073, option=[null, null, null, null, drop] +item=Clue scroll, id=13074, option=[Read, null, null, null, drop] +item=Clue scroll, id=13075, option=[Read, null, null, null, drop] +item=Clue scroll, id=13076, option=[Read, null, null, null, drop] +item=Casket, id=13077, option=[Open, null, null, null, drop] +item=Clue scroll, id=13078, option=[Read, null, null, null, drop] +item=Clue scroll, id=13079, option=[Read, null, null, null, drop] +item=Clue scroll, id=13080, option=[Read, null, null, null, drop] +item=Black crossbow, id=13081, option=[null, Wield, null, null, drop] +item=Black crossbow, id=13082, option=[null, null, null, null, drop] +item=Black bolts, id=13083, option=[null, Wield, null, null, drop] +item=Black bolts(p), id=13084, option=[null, Wield, null, null, drop] +item=Black bolts(p+), id=13085, option=[null, Wield, null, null, drop] +item=Black bolts(p++), id=13086, option=[null, Wield, null, null, drop] +item=null, id=13087, option=[null, null, null, null, drop] +item=null, id=13088, option=[null, null, null, null, drop] +item=null, id=13089, option=[null, null, null, null, drop] +item=null, id=13090, option=[null, null, null, null, drop] +item=null, id=13091, option=[null, null, null, null, drop] +item=null, id=13092, option=[null, null, null, null, drop] +item=null, id=13093, option=[null, null, null, null, drop] +item=null, id=13094, option=[null, null, null, null, drop] +item=Black cane, id=13095, option=[null, Wield, null, null, drop] +item=Black cane, id=13096, option=[null, null, null, null, drop] +item=Adamant cane, id=13097, option=[null, Wield, null, null, drop] +item=Adamant cane, id=13098, option=[null, null, null, null, drop] +item=Rune cane, id=13099, option=[null, Wield, null, null, drop] +item=Rune cane, id=13100, option=[null, null, null, null, drop] +item=Top hat, id=13101, option=[null, Wear, null, null, drop] +item=Top hat, id=13102, option=[null, null, null, null, drop] +item=Pith helmet, id=13103, option=[null, Wear, null, null, drop] +item=Pith helmet, id=13104, option=[null, null, null, null, drop] +item=Spiked helmet, id=13105, option=[null, Wear, null, null, drop] +item=Spiked helmet, id=13106, option=[null, null, null, null, drop] +item=Sheep mask, id=13107, option=[null, Wear, null, null, drop] +item=Sheep mask, id=13108, option=[null, null, null, null, drop] +item=Penguin mask, id=13109, option=[null, Wear, null, null, drop] +item=Penguin mask, id=13110, option=[null, null, null, null, drop] +item=Bat mask, id=13111, option=[null, Wear, null, null, drop] +item=Bat mask, id=13112, option=[null, null, null, null, drop] +item=Cat mask, id=13113, option=[null, Wear, null, null, drop] +item=Cat mask, id=13114, option=[null, null, null, null, drop] +item=Wolf mask, id=13115, option=[null, Wear, null, null, drop] +item=Wolf mask, id=13116, option=[null, null, null, null, drop] +item=Ivandis flail (30), id=13117, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (29), id=13118, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail(28), id=13119, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (27), id=13120, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (26), id=13121, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (25), id=13122, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (24), id=13123, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (23), id=13124, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (22), id=13125, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (21), id=13126, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (20), id=13127, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (19), id=13128, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (18), id=13129, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (17), id=13130, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (16), id=13131, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (15), id=13132, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (14), id=13133, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (13), id=13134, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (12), id=13135, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (11), id=13136, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (10), id=13137, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (9), id=13138, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (8), id=13139, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (7), id=13140, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (6), id=13141, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (5), id=13142, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (4), id=13143, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (3), id=13144, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (2), id=13145, option=[null, Wield, Cast Bloom, null, drop] +item=Ivandis flail (1), id=13146, option=[null, Wield, Cast Bloom, null, drop] +item=Flail dust, id=13147, option=[null, null, null, null, drop] +item=Glove, id=13148, option=[Inspect, null, null, null, Destroy] +item=Book page, id=13149, option=[Inspect, null, null, null, Destroy] +item=Crate, id=13150, option=[Inspect, null, null, null, Destroy] +item=Combat book, id=13151, option=[Read, null, null, null, Destroy] +item=null, id=13152, option=[null, null, null, null, drop] +item=Chain link mould, id=13153, option=[null, null, null, null, drop] +item=Silvthril chain, id=13154, option=[null, null, null, null, drop] +item=Silver sickle emerald(b), id=13155, option=[null, Wield, Cast Bloom, null, drop] +item=Enchanted sickle emerald(b), id=13156, option=[null, Wield, Cast Bloom, null, drop] +item=Vyre corpse, id=13157, option=[null, null, null, null, drop] +item=Columbarium key, id=13158, option=[null, null, null, null, drop] +item=Ornate tomb key, id=13159, option=[null, null, null, null, Destroy] +item=Tome of xp 2nd ed (3), id=13160, option=[Read, null, null, null, Destroy] +item=Tome of xp 2nd ed (2), id=13161, option=[Read, null, null, null, Destroy] +item=Tome of xp 2nd ed (1), id=13162, option=[Read, null, null, null, Destroy] +item=Black cane, id=13163, option=[null, Wield, null, null, drop] +item=Adamant cane, id=13164, option=[null, Wield, null, null, drop] +item=Rune cane, id=13165, option=[null, Wield, null, null, drop] +item=Top hat, id=13166, option=[null, Wear, null, null, drop] +item=Pith helmet, id=13167, option=[null, Wear, null, null, drop] +item=Spiked helmet, id=13168, option=[null, Wear, null, null, drop] +item=Sheep mask, id=13169, option=[null, Wear, null, null, drop] +item=Penguin mask, id=13170, option=[null, Wear, null, null, drop] +item=Bat mask, id=13171, option=[null, Wear, null, null, drop] +item=Cat mask, id=13172, option=[null, Wear, null, null, drop] +item=Wolf mask, id=13173, option=[null, Wear, null, null, drop] +item=Blue navy slacks, id=13174, option=[null, Wear, null, null, drop] +item=Green navy slacks, id=13175, option=[null, Wear, null, null, drop] +item=Red navy slacks, id=13176, option=[null, Wear, null, null, drop] +item=Brown navy slacks, id=13177, option=[null, Wear, null, null, drop] +item=Black navy slacks, id=13178, option=[null, Wear, null, null, drop] +item=Purple navy slacks, id=13179, option=[null, Wear, null, null, drop] +item=Grey navy slacks, id=13180, option=[null, Wear, null, null, drop] +item=Blue naval shirt, id=13181, option=[null, Wear, null, null, drop] +item=Green naval shirt, id=13182, option=[null, Wear, null, null, drop] +item=Red naval shirt, id=13183, option=[null, Wear, null, null, drop] +item=Brown naval shirt, id=13184, option=[null, Wear, null, null, drop] +item=Black naval shirt, id=13185, option=[null, Wear, null, null, drop] +item=Purple naval shirt, id=13186, option=[null, Wear, null, null, drop] +item=Grey naval shirt, id=13187, option=[null, Wear, null, null, drop] +item=Blue tricorn hat, id=13188, option=[null, Wear, null, null, drop] +item=Green tricorn hat, id=13189, option=[null, Wear, null, null, drop] +item=Red tricorn hat, id=13190, option=[null, Wear, null, null, drop] +item=Brown tricorn hat, id=13191, option=[null, Wear, null, null, drop] +item=Black tricorn hat, id=13192, option=[null, Wear, null, null, drop] +item=Purple tricorn hat, id=13193, option=[null, Wear, null, null, drop] +item=Grey tricorn hat, id=13194, option=[null, Wear, null, null, drop] +item=null, id=13195, option=[null, null, null, null, drop] +item=null, id=13196, option=[null, null, null, null, drop] +item=null, id=13197, option=[null, null, null, null, drop] +item=null, id=13198, option=[null, null, null, null, drop] +item=null, id=13199, option=[null, null, null, null, drop] +item=null, id=13200, option=[null, null, null, null, drop] +item=null, id=13201, option=[null, null, null, null, drop] +item=null, id=13202, option=[null, null, null, null, drop] +item=null, id=13203, option=[null, null, null, null, drop] +item=null, id=13204, option=[null, null, null, null, drop] +item=null, id=13205, option=[null, null, null, null, drop] +item=null, id=13206, option=[null, null, null, null, drop] +item=null, id=13207, option=[null, null, null, null, drop] +item=null, id=13208, option=[null, null, null, null, drop] +item=null, id=13209, option=[null, null, null, null, drop] +item=null, id=13210, option=[null, null, null, null, drop] +item=null, id=13211, option=[null, null, null, null, drop] +item=null, id=13212, option=[null, null, null, null, drop] +item=null, id=13213, option=[null, null, null, null, drop] +item=null, id=13214, option=[null, null, null, null, drop] +item=null, id=13215, option=[null, null, null, null, drop] +item=null, id=13216, option=[null, null, null, null, drop] +item=null, id=13217, option=[null, null, null, null, drop] +item=null, id=13218, option=[null, null, null, null, drop] +item=null, id=13219, option=[null, null, null, null, drop] +item=null, id=13220, option=[null, null, null, null, drop] +item=null, id=13221, option=[null, null, null, null, drop] +item=null, id=13222, option=[null, null, null, null, drop] +item=null, id=13223, option=[null, null, null, null, drop] +item=null, id=13224, option=[null, null, null, null, drop] +item=null, id=13225, option=[null, null, null, null, drop] +item=null, id=13226, option=[null, null, null, null, drop] +item=Mysterious lamp, id=13227, option=[Rub, null, null, null, Destroy] +item=Crate, id=13228, option=[Look-inside, null, null, null, Destroy] +item=Letter, id=13229, option=[Read, null, null, null, Destroy] +item=Icefiend net, id=13230, option=[null, Wield, null, null, Destroy] +item=Baby icefiend, id=13231, option=[null, null, null, null, Release] +item=Tent, id=13232, option=[null, null, null, null, Destroy] +item=Plans, id=13233, option=[Read, null, null, null, Destroy] +item=Dwarven key, id=13234, option=[null, null, null, null, Destroy] +item=null, id=0, option=[null, null, null, null, drop] +item=Three little kittens, id=13236, option=[null, null, null, null, drop] +item=null, id=0, option=[null, null, null, null, drop] +item=Treated oak plank, id=13238, option=[null, null, null, null, drop] +item=Chisel, id=13239, option=[null, null, null, null, drop] +item=Chisel, id=13240, option=[null, null, null, null, drop] +item=Treated plank, id=13241, option=[null, null, null, null, drop] +item=Treated plank, id=13242, option=[null, null, null, null, drop] +item=Stone tablet, id=13243, option=[Read, null, null, null, drop] +item=Tzhaar tourist guide, id=13244, option=[Read, null, null, null, drop] +item=Stone slab, id=13245, option=[null, null, null, null, Destroy] +item=Pillar, id=13246, option=[null, null, null, null, Destroy] \ No newline at end of file diff --git a/dumps/498/498_npc_configs.txt b/dumps/498/498_npc_configs.txt new file mode 100644 index 000000000..cd7cb0690 --- /dev/null +++ b/dumps/498/498_npc_configs.txt @@ -0,0 +1,505 @@ +NPC config [id=152, name=Tree, config=939, shift=0, childs=[5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, 5207, -1, -1, 5207, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1]]. +NPC config [id=226, name=Sinister Stranger, config=12, shift=4, childs=[3677, 3678, -1]]. +NPC config [id=292, name=Sick-looking sheep (1), config=518, shift=13, childs=[2345, 2377, -1]]. +NPC config [id=293, name=Sick-looking sheep (2), config=518, shift=15, childs=[2346, 2378, -1]]. +NPC config [id=294, name=Sick-looking sheep (3), config=518, shift=12, childs=[2347, 2379, -1]]. +NPC config [id=295, name=Sick-looking sheep (4), config=518, shift=14, childs=[2348, 2380, -1]]. +NPC config [id=335, name=null, config=667, shift=1, childs=[-1, 3209, -1]]. +NPC config [id=381, name=Captain Barnaby, config=905, shift=27, childs=[4974, -1]]. +NPC config [id=431, name='Bird's-Eye' Jack, config=1003, shift=0, childs=[4544, -1, 4544, -1, 4544, -1, 4544, -1, 4544, -1, 4544, -1, 4544, -1, 4544, -1]]. +NPC config [id=697, name=Kennith, config=159, shift=-1, childs=[4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, -1]]. +NPC config [id=647, name=Reldo, config=568, shift=26, childs=[2661, 2660, -1]]. +NPC config [id=748, name=Cabin boy Jenkins, config=176, shift=-1, childs=[6085, 6085, 6085, 6085, 6085, 6085, 6085, 6085, -1]]. +NPC config [id=759, name=null, config=180, shift=-1, childs=[-1, -1, 7742, 7742, 7742, -1]]. +NPC config [id=715, name=Elena, config=667, shift=1, childs=[3215, -1]]. +NPC config [id=829, name=Gublinch, config=941, shift=0, childs=[5017, 5018, 5019, -1]]. +NPC config [id=844, name=Wizard Cromperty, config=1077, shift=8, childs=[2328, -1]]. +NPC config [id=1048, name=null, config=1218, shift=10, childs=[-1, 7664, -1]]. +NPC config [id=1047, name=Drezel, config=869, shift=27, childs=[7707, -1]]. +NPC config [id=1207, name=null, config=1190, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7117, -1, -1, -1, -1, 7117, -1, -1, -1, -1, 7117, -1, -1, -1, -1, 7117, -1, -1, -1, -1, 7117, -1, -1, -1, -1, 7117, -1, -1, -1, -1, 7117, -1, -1, -1, -1, 7117, -1]]. +NPC config [id=1205, name=null, config=1190, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7116, -1]]. +NPC config [id=1520, name=null, config=983, shift=0, childs=[-1, 1513, -1]]. +NPC config [id=1517, name=null, config=983, shift=0, childs=[-1, 1510, -1]]. +NPC config [id=1516, name=null, config=983, shift=0, childs=[-1, 1509, -1]]. +NPC config [id=1519, name=null, config=983, shift=0, childs=[-1, 1512, -1]]. +NPC config [id=1518, name=null, config=983, shift=0, childs=[-1, 1511, -1]]. +NPC config [id=1515, name=null, config=983, shift=0, childs=[-1, 1508, -1]]. +NPC config [id=1732, name=null, config=709, shift=31, childs=[-1, 5462, -1]]. +NPC config [id=1669, name=null, config=399, shift=-1, childs=[-1, -1, -1, -1, -1, -1, -1, -1, 1670, -1]]. +NPC config [id=1668, name=Dr Fenkenstrain, config=399, shift=-1, childs=[1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, -1]]. +NPC config [id=1671, name=Fenkenstrain's Monster, config=399, shift=-1, childs=[1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, -1]]. +NPC config [id=1667, name=Gardener Ghost, config=400, shift=31, childs=[1675, -1]]. +NPC config [id=1666, name=null, config=400, shift=31, childs=[-1, 1675, -1]]. +NPC config [id=1672, name=null, config=399, shift=-1, childs=[-1, -1, -1, -1, -1, -1, -1, -1, 1674, 1674, -1]]. +NPC config [id=1687, name=null, config=408, shift=28, childs=[-1, -1, -1, -1, 1688, 1688, 1688, 1688, 1688, -1]]. +NPC config [id=1907, name=Broken clay golem, config=437, shift=7, childs=[1908, 1908, 1909, 1909, 1910, -1]]. +NPC config [id=1899, name=null, config=435, shift=6, childs=[-1, 1901, -1]]. +NPC config [id=1900, name=null, config=435, shift=7, childs=[-1, 1901, -1]]. +NPC config [id=1903, name=Menaphite Thug, config=435, shift=11, childs=[1904, 1904, 1905, -1]]. +NPC config [id=1891, name=Villager, config=435, shift=11, childs=[1892, 1893, 1894, -1]]. +NPC config [id=1895, name=Villager, config=435, shift=11, childs=[1896, 1897, 1898, -1]]. +NPC config [id=1887, name=Villager, config=435, shift=11, childs=[1888, 1889, 1890, -1]]. +NPC config [id=1879, name=Bandit, config=435, shift=11, childs=[1880, 1880, 1881, -1]]. +NPC config [id=1877, name=null, config=435, shift=9, childs=[-1, 1878, -1]]. +NPC config [id=1876, name=null, config=435, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2548, -1]]. +NPC config [id=1869, name=Ali the Mayor, config=435, shift=18, childs=[1870, -1]]. +NPC config [id=1845, name=null, config=433, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1846, -1]]. +NPC config [id=1836, name=Dondakan the Dwarf, config=433, shift=0, childs=[1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1838, -1]]. +NPC config [id=1811, name=The Kendal, config=423, shift=25, childs=[1812, -1]]. +NPC config [id=2020, name=Vanstrom Klause, config=388, shift=25, childs=[1577, 1576, -1]]. +NPC config [id=2002, name=Wanderer, config=443, shift=26, childs=[2006, -1]]. +NPC config [id=2003, name=null, config=443, shift=26, childs=[-1, -1, 2006, -1]]. +NPC config [id=2004, name=null, config=443, shift=26, childs=[-1, -1, -1, 2006, -1]]. +NPC config [id=2011, name=null, config=445, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2012, -1]]. +NPC config [id=2013, name=null, config=446, shift=4, childs=[-1, 2014, -1]]. +NPC config [id=1987, name=null, config=445, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1988, 1988, 1988, 1988, 1988, 1988, 1988, -1]]. +NPC config [id=1985, name=High Priest, config=443, shift=14, childs=[1986, -1]]. +NPC config [id=1984, name=null, config=445, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1986, 1986, 1986, 1986, 1986, 1986, -1]]. +NPC config [id=1970, name=null, config=440, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1971, 1971, -1]]. +NPC config [id=1943, name=Ice block, config=442, shift=17, childs=[1944, 1948, -1]]. +NPC config [id=1949, name=null, config=442, shift=19, childs=[-1, -1, -1, -1, 1950, 1950, -1]]. +NPC config [id=1947, name=null, config=442, shift=19, childs=[-1, -1, -1, -1, 1948, 1948, -1]]. +NPC config [id=1945, name=Ice block, config=442, shift=18, childs=[1946, 1950, -1]]. +NPC config [id=1924, name=null, config=440, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1925, 1925, 1925, 1925, 1925, 1925, -1]]. +NPC config [id=1922, name=Eblis, config=440, shift=0, childs=[1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, -1]]. +NPC config [id=1932, name=Troll child, config=442, shift=19, childs=[1934, 1933, 1933, 1933, 1933, 1933, -1]]. +NPC config [id=2202, name=Drunken Dwarf, config=470, shift=0, childs=[2203, 2204, -1]]. +NPC config [id=2231, name=null, config=482, shift=23, childs=[-1, 2232, -1]]. +NPC config [id=2260, name=null, config=492, shift=-1, childs=[-1, 2261, 2261, 2261, 2261, -1]]. +NPC config [id=2257, name=Mage of Zamorak, config=492, shift=-1, childs=[2258, 2258, 2258, 2258, 2259, -1]]. +NPC config [id=2302, name=null, config=443, shift=20, childs=[-1, 2301, -1]]. +NPC config [id=2303, name=null, config=437, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2301, -1]]. +NPC config [id=2299, name=null, config=443, shift=20, childs=[-1, 2300, -1]]. +NPC config [id=2297, name=null, config=443, shift=20, childs=[-1, 2298, -1]]. +NPC config [id=2295, name=null, config=437, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2296, -1]]. +NPC config [id=2079, name=Sigmund, config=465, shift=0, childs=[2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, -1]]. +NPC config [id=2080, name=null, config=465, shift=21, childs=[-1, 2082, -1]]. +NPC config [id=2081, name=null, config=465, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2083, 2083, -1]]. +NPC config [id=2085, name=null, config=465, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, 2086, 2086, 2086, -1]]. +NPC config [id=2142, name=Riki the sculptor's model, config=482, shift=11, childs=[2143, 2144, 2145, 2147, 2146, 2148, 2149, 2150, -1]]. +NPC config [id=2125, name=Trader, config=482, shift=25, childs=[2126, -1]]. +NPC config [id=2123, name=Trader, config=482, shift=25, childs=[2124, -1]]. +NPC config [id=2435, name=Jarvald, config=520, shift=13, childs=[2436, 2437, -1]]. +NPC config [id=2488, name=null, config=320, shift=-1, childs=[-1, -1, -1, -1, -1, -1, 1167, -1]]. +NPC config [id=2483, name=Tiadeche, config=320, shift=-1, childs=[1163, 1163, 1163, 1163, 1163, 1163, -1]]. +NPC config [id=2484, name=null, config=320, shift=-1, childs=[-1, -1, -1, -1, -1, -1, 1164, -1]]. +NPC config [id=2485, name=Tinsay, config=320, shift=-1, childs=[1165, 1165, 1165, 1165, 1165, 1165, -1]]. +NPC config [id=2486, name=null, config=320, shift=-1, childs=[-1, -1, -1, -1, -1, -1, 1166, -1]]. +NPC config [id=2487, name=Tamayu, config=320, shift=-1, childs=[1167, 1167, 1167, 1167, 1167, 1167, -1]]. +NPC config [id=2510, name=null, config=534, shift=6, childs=[-1, 2511, 2512, 2512, 2512, 2512, 2512, 2512, -1]]. +NPC config [id=2507, name=null, config=534, shift=3, childs=[-1, 2508, 2509, 2509, 2509, 2509, 2509, 2509, -1]]. +NPC config [id=2504, name=null, config=534, shift=0, childs=[-1, 2505, 2506, 2506, 2506, 2506, 2506, 2506, -1]]. +NPC config [id=2525, name=null, config=534, shift=21, childs=[-1, 2526, 2527, 2527, 2527, 2527, 2527, 2527, -1]]. +NPC config [id=2522, name=null, config=534, shift=18, childs=[-1, 2523, 2524, 2524, 2524, 2524, 2524, 2524, -1]]. +NPC config [id=2519, name=null, config=534, shift=15, childs=[-1, 2520, 2521, 2521, 2521, 2521, 2521, 2521, -1]]. +NPC config [id=2516, name=null, config=534, shift=12, childs=[-1, 2517, 2518, 2518, 2518, 2518, 2518, 2518, -1]]. +NPC config [id=2513, name=null, config=534, shift=9, childs=[-1, 2514, 2515, 2515, 2515, 2515, 2515, 2515, -1]]. +NPC config [id=2528, name=null, config=534, shift=24, childs=[-1, 2529, 2530, 2530, 2530, 2530, 2530, 2530, -1]]. +NPC config [id=2531, name=null, config=534, shift=27, childs=[-1, 2532, 2533, 2533, 2533, 2533, 2533, 2533, -1]]. +NPC config [id=2375, name=null, config=518, shift=0, childs=[-1, 2376, -1]]. +NPC config [id=2370, name=null, config=518, shift=8, childs=[-1, -1, -1, -1, -1, -1, -1, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, -1]]. +NPC config [id=2382, name=null, config=440, shift=21, childs=[-1, 2397, -1]]. +NPC config [id=2383, name=null, config=440, shift=21, childs=[-1, 2397, -1]]. +NPC config [id=2381, name=null, config=440, shift=21, childs=[-1, 2399, -1]]. +NPC config [id=2391, name=null, config=440, shift=21, childs=[-1, 2401, -1]]. +NPC config [id=2390, name=null, config=440, shift=21, childs=[-1, 2400, -1]]. +NPC config [id=2389, name=null, config=440, shift=21, childs=[-1, 2400, -1]]. +NPC config [id=2388, name=null, config=440, shift=21, childs=[-1, 2400, -1]]. +NPC config [id=2387, name=null, config=440, shift=21, childs=[-1, 2398, -1]]. +NPC config [id=2386, name=null, config=440, shift=21, childs=[-1, 2398, -1]]. +NPC config [id=2385, name=null, config=440, shift=21, childs=[-1, 2398, -1]]. +NPC config [id=2384, name=null, config=440, shift=21, childs=[-1, 2397, -1]]. +NPC config [id=2396, name=null, config=440, shift=21, childs=[-1, 2402, -1]]. +NPC config [id=2395, name=null, config=440, shift=21, childs=[-1, 2402, -1]]. +NPC config [id=2394, name=null, config=440, shift=21, childs=[-1, 2402, -1]]. +NPC config [id=2393, name=null, config=440, shift=21, childs=[-1, 2401, -1]]. +NPC config [id=2392, name=null, config=440, shift=21, childs=[-1, 2401, -1]]. +NPC config [id=2404, name=Red Axe Director, config=482, shift=26, childs=[2107, -1]]. +NPC config [id=2405, name=Red Axe Cat, config=482, shift=26, childs=[2108, -1]]. +NPC config [id=2406, name=Gnome emissary, config=482, shift=26, childs=[2137, -1]]. +NPC config [id=2407, name=Gnome traveller, config=482, shift=26, childs=[2138, -1]]. +NPC config [id=2403, name=Red Axe Secretary, config=482, shift=26, childs=[2099, -1]]. +NPC config [id=2408, name=Gnome traveller, config=482, shift=26, childs=[2139, -1]]. +NPC config [id=2813, name=Camel, config=599, shift=31, childs=[80, 2814, -1]]. +NPC config [id=2795, name=Skippy, config=597, shift=0, childs=[2796, 2797, 2798, 2799, -1]]. +NPC config [id=2788, name=null, config=594, shift=25, childs=[-1, 2789, -1]]. +NPC config [id=2768, name=null, config=572, shift=10, childs=[-1, 2747, -1]]. +NPC config [id=2769, name=null, config=572, shift=12, childs=[-1, 2747, -1]]. +NPC config [id=2770, name=null, config=572, shift=14, childs=[-1, 2747, -1]]. +NPC config [id=2771, name=null, config=572, shift=16, childs=[-1, 2747, -1]]. +NPC config [id=2772, name=null, config=572, shift=18, childs=[-1, 2747, -1]]. +NPC config [id=2773, name=null, config=572, shift=20, childs=[-1, 2747, -1]]. +NPC config [id=2774, name=null, config=572, shift=22, childs=[-1, 2747, -1]]. +NPC config [id=2775, name=null, config=571, shift=22, childs=[-1, 2776, -1]]. +NPC config [id=2761, name=null, config=571, shift=28, childs=[-1, 2747, -1]]. +NPC config [id=2760, name=null, config=571, shift=26, childs=[-1, 2747, -1]]. +NPC config [id=2763, name=null, config=572, shift=0, childs=[-1, 2747, -1]]. +NPC config [id=2762, name=null, config=571, shift=30, childs=[-1, 2747, -1]]. +NPC config [id=2765, name=null, config=572, shift=4, childs=[-1, 2747, -1]]. +NPC config [id=2764, name=null, config=572, shift=2, childs=[-1, 2747, -1]]. +NPC config [id=2767, name=null, config=572, shift=8, childs=[-1, 2747, -1]]. +NPC config [id=2766, name=null, config=572, shift=6, childs=[-1, 2747, -1]]. +NPC config [id=2757, name=null, config=571, shift=20, childs=[-1, 2747, -1]]. +NPC config [id=2756, name=null, config=571, shift=18, childs=[-1, 2747, -1]]. +NPC config [id=2759, name=null, config=571, shift=24, childs=[-1, 2747, -1]]. +NPC config [id=2758, name=null, config=571, shift=22, childs=[-1, 2747, -1]]. +NPC config [id=2585, name=Trolley, config=553, shift=11, childs=[2584, 2582, 2583, -1]]. +NPC config [id=2652, name=null, config=568, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2653, -1, -1, -1, -1, 2653, -1, -1, -1, -1, 2653, -1]]. +NPC config [id=2654, name=Unferth, config=568, shift=13, childs=[2655, 2656, 2657, 2658, 2659, 2658, 2657, 2656, 2655, -1]]. +NPC config [id=2977, name=Rat, config=609, shift=10, childs=[2980, -1]]. +NPC config [id=2976, name=Rat, config=609, shift=9, childs=[2980, -1]]. +NPC config [id=2979, name=Rat, config=609, shift=12, childs=[2980, -1]]. +NPC config [id=2978, name=Rat, config=609, shift=11, childs=[2980, -1]]. +NPC config [id=2974, name=Rat, config=609, shift=7, childs=[2980, -1]]. +NPC config [id=2975, name=Rat, config=609, shift=8, childs=[2980, -1]]. +NPC config [id=3049, name=Target, config=616, shift=16, childs=[3047, 3048, -1]]. +NPC config [id=2818, name=null, config=599, shift=31, childs=[-1, 2822, -1]]. +NPC config [id=2819, name=null, config=599, shift=31, childs=[-1, 2823, -1]]. +NPC config [id=2816, name=null, config=599, shift=31, childs=[-1, 2820, -1]]. +NPC config [id=2817, name=null, config=599, shift=31, childs=[-1, 2821, -1]]. +NPC config [id=2920, name=null, config=602, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2921, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2921, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2921, -1]]. +NPC config [id=2922, name=null, config=602, shift=26, childs=[-1, 2910, -1]]. +NPC config [id=2923, name=null, config=602, shift=26, childs=[-1, -1, 2910, -1]]. +NPC config [id=2924, name=null, config=602, shift=28, childs=[-1, -1, 2902, -1]]. +NPC config [id=2925, name=null, config=602, shift=30, childs=[-1, -1, 2899, -1]]. +NPC config [id=2926, name=null, config=437, shift=7, childs=[-1, -1, -1, -1, -1, 1910, -1]]. +NPC config [id=2929, name=null, config=602, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2915, -1]]. +NPC config [id=2930, name=null, config=602, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2931, -1]]. +NPC config [id=2933, name=Melina, config=604, shift=13, childs=[2935, -1]]. +NPC config [id=2936, name=Droalak, config=604, shift=14, childs=[2938, -1]]. +NPC config [id=2898, name=null, config=602, shift=30, childs=[-1, 2899, -1]]. +NPC config [id=2897, name=Father Reen, config=602, shift=0, childs=[2899, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2899, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2899, -1]]. +NPC config [id=2901, name=null, config=602, shift=28, childs=[-1, 2902, -1]]. +NPC config [id=2908, name=null, config=602, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2910, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2910, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2910, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2910, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2910, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2910, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2910, -1]]. +NPC config [id=3289, name=null, config=32, shift=-1, childs=[-1, -1, -1, 287, -1]]. +NPC config [id=3290, name=Chicken, config=32, shift=-1, childs=[288, 288, 288, -1]]. +NPC config [id=3318, name=null, config=671, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3321, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3321, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3321, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3321, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3321, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3321, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3321, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3321, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3321, -1]]. +NPC config [id=3316, name=null, config=671, shift=24, childs=[-1, 3305, 3305, -1]]. +NPC config [id=3317, name=null, config=671, shift=24, childs=[-1, 3306, 3306, -1]]. +NPC config [id=3314, name=Fairy Queen, config=671, shift=22, childs=[653, -1]]. +NPC config [id=3315, name=null, config=671, shift=24, childs=[-1, 3304, 4433, -1]]. +NPC config [id=3323, name=Juliet, config=673, shift=0, childs=[637, -1, 637, -1]]. +NPC config [id=3213, name=Edmond, config=667, shift=0, childs=[714, -1]]. +NPC config [id=3214, name=null, config=667, shift=0, childs=[-1, 714, -1]]. +NPC config [id=3152, name=Boneguard, config=643, shift=6, childs=[3140, 3141, 3142, -1]]. +NPC config [id=3144, name=null, config=643, shift=0, childs=[-1, 3147, -1]]. +NPC config [id=3145, name=null, config=643, shift=0, childs=[-1, -1, 3147, -1]]. +NPC config [id=3146, name=null, config=643, shift=0, childs=[-1, -1, -1, 3147, -1]]. +NPC config [id=3143, name=Lazim, config=643, shift=0, childs=[3147, -1]]. +NPC config [id=3136, name=Enakhra, config=643, shift=4, childs=[3137, 3138, -1]]. +NPC config [id=3139, name=Boneguard, config=643, shift=6, childs=[3140, 3141, 3142, -1]]. +NPC config [id=3074, name=Monk, config=622, shift=27, childs=[3075, -1]]. +NPC config [id=3076, name=null, config=622, shift=27, childs=[-1, 3077, -1]]. +NPC config [id=3128, name=Boneguard, config=641, shift=0, childs=[3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3130, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3130, -1, -1, -1, -1, 3130, -1, -1, -1, -1, 3130, -1]]. +NPC config [id=3134, name=Furnace grate, config=642, shift=2, childs=[3135, -1]]. +NPC config [id=3132, name=Crust of ice, config=642, shift=1, childs=[3133, -1]]. +NPC config [id=3110, name=Sandy, config=636, shift=0, childs=[3112, -1]]. +NPC config [id=3111, name=null, config=636, shift=0, childs=[-1, 3113, -1]]. +NPC config [id=3567, name=null, config=704, shift=19, childs=[-1, 3569, -1]]. +NPC config [id=3566, name=Cornelius, config=704, shift=19, childs=[3568, -1]]. +NPC config [id=3462, name=null, config=679, shift=5, childs=[-1, 3463, 3464, -1]]. +NPC config [id=3465, name=null, config=684, shift=11, childs=[-1, 3466, -1]]. +NPC config [id=3470, name=null, config=684, shift=17, childs=[-1, 3471, -1]]. +NPC config [id=3469, name=null, config=684, shift=17, childs=[-1, 3472, -1]]. +NPC config [id=3479, name=null, config=679, shift=7, childs=[-1, 3480, 3478, -1]]. +NPC config [id=3510, name=null, config=704, shift=23, childs=[-1, 3511, 3539, -1]]. +NPC config [id=3512, name=null, config=704, shift=23, childs=[-1, 3514, -1]]. +NPC config [id=3513, name=null, config=704, shift=23, childs=[-1, 3515, -1]]. +NPC config [id=3516, name=null, config=704, shift=23, childs=[-1, 3517, -1]]. +NPC config [id=3404, name=null, config=680, shift=28, childs=[-1, -1, 3405, -1]]. +NPC config [id=3401, name=An old Dwarf, config=680, shift=28, childs=[3402, 3403, -1]]. +NPC config [id=3399, name=null, config=678, shift=0, childs=[-1, -1, -1, 3400, 3400, -1]]. +NPC config [id=3417, name=null, config=679, shift=2, childs=[-1, 3418, 3416, -1]]. +NPC config [id=3450, name=null, config=679, shift=3, childs=[-1, 3451, 3449, -1]]. +NPC config [id=3373, name=null, config=679, shift=6, childs=[-1, 3374, 3372, -1]]. +NPC config [id=3384, name=null, config=678, shift=0, childs=[-1, -1, -1, -1, 3385, -1]]. +NPC config [id=3379, name=Evil Dave, config=679, shift=4, childs=[3380, 3380, 3380, 3380, 3380, -1]]. +NPC config [id=3383, name=null, config=678, shift=0, childs=[-1, -1, -1, 3385, 3385, -1]]. +NPC config [id=3828, name=Devin Mendelberg, config=723, shift=0, childs=[3825, -1, -1, -1, -1, 3825, -1, -1, -1, -1, 3825, -1, -1, -1, -1, 3825, -1, -1, -1, -1, 3825, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3825, -1]]. +NPC config [id=3829, name=Kathy Corkat, config=723, shift=0, childs=[3830, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1]]. +NPC config [id=3834, name=null, config=723, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3821, -1]]. +NPC config [id=3832, name=Herman Caranos, config=723, shift=0, childs=[3822, -1, -1, -1, -1, 3822, -1, -1, -1, -1, 3822, -1, -1, -1, -1, 3822, -1, -1, -1, -1, 3822, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, 2567, -1]]. +NPC config [id=3833, name=null, config=723, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1]]. +NPC config [id=3820, name=Wise Old Man, config=723, shift=0, childs=[2253, -1, -1, -1, -1, 2253, -1, -1, -1, -1, 2253, -1, -1, -1, -1, 2253, -1, -1, -1, -1, 2253, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2253, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2253, -1]]. +NPC config [id=3778, name=null, config=1049, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 251, -1, -1, -1, -1, 3779, -1]]. +NPC config [id=3780, name=null, config=1049, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 249, -1, -1, -1, -1, 249, -1, -1, -1, -1, 249, -1]]. +NPC config [id=3638, name=Launa, config=710, shift=0, childs=[3639, -1]]. +NPC config [id=3633, name=null, config=700, shift=0, childs=[-1, 3634, -1]]. +NPC config [id=3631, name=null, config=700, shift=0, childs=[-1, 3632, -1]]. +NPC config [id=3629, name=null, config=700, shift=0, childs=[-1, 3630, -1]]. +NPC config [id=3627, name=null, config=700, shift=0, childs=[-1, 3628, -1]]. +NPC config [id=3625, name=null, config=700, shift=0, childs=[-1, 3626, -1]]. +NPC config [id=3623, name=null, config=700, shift=0, childs=[-1, 3624, -1]]. +NPC config [id=4453, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4442, -1]]. +NPC config [id=4454, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4437, -1]]. +NPC config [id=4436, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4437, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4437, -1]]. +NPC config [id=4435, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4442, -1, -1, -1, -1, 4442, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4442, -1, -1, -1, -1, 4442, -1, -1, -1, -1, 4442, -1, 4442, 4442, -1, 4442, -1, -1, -1, -1, 4442, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4442, -1]]. +NPC config [id=4432, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4434, -1, -1, -1, -1, 4434, -1, -1, -1, -1, 4434, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4434, -1, -1, -1, -1, 4434, -1, -1, -1, -1, 4434, -1, 4434, 4434, -1, 4434, -1, -1, -1, -1, 4434, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4434, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4434, -1]]. +NPC config [id=4423, name=Fairy, config=810, shift=0, childs=[57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1]]. +NPC config [id=4422, name=Fairy, config=810, shift=0, childs=[57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1]]. +NPC config [id=4431, name=Fairy Nuff, config=810, shift=14, childs=[4434, -1]]. +NPC config [id=4430, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4445, -1, -1, -1, -1, 4445, -1, -1, -1, -1, 4445, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4445, -1, -1, -1, -1, 4445, -1, -1, -1, -1, 4445, -1, 4445, 4445, -1, 4445, -1, -1, -1, -1, 4445, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4445, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4445, -1]]. +NPC config [id=4429, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4446, -1, -1, -1, -1, 4446, -1, -1, -1, -1, 4446, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4446, -1, -1, -1, -1, 4446, -1, -1, -1, -1, 4446, -1, 4446, 4446, -1, 4446, -1, -1, -1, -1, 4446, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4446, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4446, -1]]. +NPC config [id=4428, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4444, -1, -1, -1, -1, 4444, -1, -1, -1, -1, 4444, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4444, -1, -1, -1, -1, 4444, -1, -1, -1, -1, 4444, -1, 4444, 4444, -1, 4444, -1, -1, -1, -1, 4444, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4444, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4444, -1]]. +NPC config [id=4427, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4443, -1, -1, -1, -1, 4443, -1, -1, -1, -1, 4443, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4443, -1, -1, -1, -1, 4443, -1, -1, -1, -1, 4443, -1, 4443, 4443, -1, 4443, -1, -1, -1, -1, 4443, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4443, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4443, -1]]. +NPC config [id=4426, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, 57, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, 57, -1, -1, -1, -1, 57, -1, 57, 57, -1, 57, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1]]. +NPC config [id=4425, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4458, -1, -1, -1, -1, 4458, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4458, -1, -1, -1, -1, 4458, -1, -1, -1, -1, 4458, -1, 4458, 4458, -1, 4458, -1, -1, -1, -1, 4458, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4458, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4458, -1]]. +NPC config [id=4424, name=null, config=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4456, -1, -1, -1, -1, 4456, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4456, -1, -1, -1, -1, 4456, -1, -1, -1, -1, 4456, -1, 4456, 4456, -1, 4456, -1, -1, -1, -1, 4456, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4456, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4456, -1]]. +NPC config [id=4538, name=Cabin boy, config=823, shift=0, childs=[4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, 4539, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, 4539, -1, 4539, -1, 4539, -1, 4539, -1, 4539, -1, -1, -1, -1, 4539, -1]]. +NPC config [id=4495, name=Grubfoot, config=62, shift=0, childs=[4496, 4496, 4496, 4496, 4497, 4498, 4496, -1]]. +NPC config [id=4256, name=null, config=61, shift=10, childs=[-1, 2348, -1]]. +NPC config [id=4236, name=Rick, config=738, shift=16, childs=[4235, -1, 4235, 4235, 4235, 4235, 4235, 4235, 4235, -1]]. +NPC config [id=4238, name=Maid, config=738, shift=16, childs=[4237, 4237, 4237, -1, 4237, 4237, 4237, 4237, 4237, -1]]. +NPC config [id=4253, name=null, config=61, shift=1, childs=[-1, 2345, -1]]. +NPC config [id=4255, name=null, config=61, shift=7, childs=[-1, 2347, -1]]. +NPC config [id=4254, name=null, config=61, shift=4, childs=[-1, 2346, -1]]. +NPC config [id=4240, name=Cook, config=738, shift=16, childs=[4239, 4239, 4239, 4239, 4239, -1, 4239, 4239, 4239, -1]]. +NPC config [id=4242, name=Butler, config=738, shift=16, childs=[4241, 4241, 4241, 4241, 4241, 4241, -1, 4241, 4241, -1]]. +NPC config [id=4244, name=Demon butler, config=738, shift=16, childs=[4243, 4243, 4243, 4243, 4243, 4243, 4243, 4243, -1]]. +NPC config [id=4321, name=null, config=794, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4320, -1]]. +NPC config [id=4338, name=null, config=794, shift=16, childs=[-1, 4337, -1]]. +NPC config [id=4317, name=null, config=794, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, 4318, 4318, 4318, -1]]. +NPC config [id=4319, name=null, config=794, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, 4320, 4320, 4320, -1]]. +NPC config [id=4313, name=null, config=794, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4314, -1]]. +NPC config [id=4315, name=null, config=794, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, 4316, 4316, 4316, -1]]. +NPC config [id=4882, name=null, config=874, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, 4888, 4888, 4888, 4888, 4888, 4888, -1]]. +NPC config [id=4880, name=null, config=874, shift=0, childs=[-1, 4884, 4884, 4884, 4884, 4884, 4884, 4884, 4884, 4884, 4884, 4884, 4884, 4884, 4884, -1]]. +NPC config [id=4881, name=null, config=874, shift=0, childs=[-1, -1, -1, -1, -1, 4886, 4886, 4886, 4886, 4886, 4886, 4886, 4886, 4886, 4886, -1]]. +NPC config [id=4891, name=null, config=874, shift=11, childs=[-1, 4892, -1]]. +NPC config [id=4871, name=Holgart, config=874, shift=11, childs=[699, 4896, -1]]. +NPC config [id=4869, name=null, config=159, shift=-1, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 701, 701, -1]]. +NPC config [id=4865, name=null, config=159, shift=-1, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4864, 4864, -1]]. +NPC config [id=4912, name=Jig cart, config=896, shift=9, childs=[4913, 4914, 4915, 4916, 4917, 4918, -1]]. +NPC config [id=4950, name=null, config=905, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1]]. +NPC config [id=4951, name=null, config=905, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4948, -1]]. +NPC config [id=4954, name=null, config=905, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4948, -1]]. +NPC config [id=4955, name=null, config=905, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1]]. +NPC config [id=4952, name=null, config=905, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4948, -1]]. +NPC config [id=4953, name=null, config=905, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1]]. +NPC config [id=4956, name=null, config=905, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, -1]]. +NPC config [id=4984, name=Ana, config=907, shift=7, childs=[822, -1]]. +NPC config [id=4985, name=Male slave, config=907, shift=4, childs=[825, 826, -1]]. +NPC config [id=4986, name=Irena, config=907, shift=10, childs=[835, -1]]. +NPC config [id=4987, name=null, config=907, shift=10, childs=[-1, 4988, -1]]. +NPC config [id=4961, name=null, config=905, shift=27, childs=[-1, 4962, -1]]. +NPC config [id=4966, name=null, config=435, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4967, -1]]. +NPC config [id=4970, name=null, config=905, shift=20, childs=[-1, 4969, -1]]. +NPC config [id=5022, name=null, config=942, shift=21, childs=[-1, 5025, -1]]. +NPC config [id=5021, name=null, config=942, shift=21, childs=[-1, 5024, -1]]. +NPC config [id=5020, name=null, config=942, shift=21, childs=[-1, 5023, -1]]. +NPC config [id=5016, name=Gublinch, config=941, shift=28, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5015, name=Gublinch, config=941, shift=26, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5014, name=Gublinch, config=941, shift=24, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5013, name=Gublinch, config=941, shift=22, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5012, name=Gublinch, config=941, shift=20, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5011, name=Gublinch, config=941, shift=18, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5010, name=Gublinch, config=941, shift=16, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5009, name=Gublinch, config=941, shift=14, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5008, name=Gublinch, config=941, shift=12, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5006, name=Gublinch, config=941, shift=8, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5007, name=Gublinch, config=941, shift=10, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5004, name=Gublinch, config=941, shift=4, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5005, name=Gublinch, config=941, shift=6, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5003, name=Gublinch, config=941, shift=2, childs=[5017, 5018, 5019, -1]]. +NPC config [id=5078, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5077, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5066, name=null, config=912, shift=15, childs=[-1, 5053, -1]]. +NPC config [id=5064, name=null, config=912, shift=13, childs=[-1, 5056, -1]]. +NPC config [id=5065, name=null, config=912, shift=14, childs=[-1, 5054, -1]]. +NPC config [id=5070, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5071, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5062, name=null, config=912, shift=10, childs=[-1, 5049, 5057, -1]]. +NPC config [id=5063, name=null, config=912, shift=12, childs=[-1, 5055, -1]]. +NPC config [id=5119, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5118, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5107, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5106, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5108, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5101, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5102, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5090, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=5091, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=4613, name=Cute creature, config=844, shift=13, childs=[4614, 4615, 1957, -1]]. +NPC config [id=4622, name=Cute creature, config=844, shift=19, childs=[4623, 4624, 1957, -1]]. +NPC config [id=4616, name=Cute creature, config=844, shift=15, childs=[4617, 4618, 1957, -1]]. +NPC config [id=4619, name=Cute creature, config=844, shift=17, childs=[4620, 4621, 1957, -1]]. +NPC config [id=4628, name=Cute creature, config=844, shift=23, childs=[4629, 4630, 1957, -1]]. +NPC config [id=4625, name=Cute creature, config=844, shift=21, childs=[4626, 4627, 1957, -1]]. +NPC config [id=4711, name=null, config=870, shift=12, childs=[-1, 4713, -1]]. +NPC config [id=4714, name=null, config=870, shift=15, childs=[-1, 4715, -1]]. +NPC config [id=4712, name=null, config=870, shift=12, childs=[-1, -1, 4713, -1]]. +NPC config [id=4859, name=Witchaven villager, config=874, shift=0, childs=[4887, 4887, 4887, 4887, 4887, 4887, 4887, 4887, 4887, -1]]. +NPC config [id=4858, name=Witchaven villager, config=874, shift=0, childs=[4885, 4885, 4885, 4885, 4885, -1]]. +NPC config [id=4857, name=Witchaven villager, config=874, shift=0, childs=[4883, -1]]. +NPC config [id=4860, name=Jeb, config=874, shift=0, childs=[4895, 4895, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, -1]]. +NPC config [id=4855, name=Brother Maledict, config=874, shift=0, childs=[4878, 4878, 4878, 4878, 4878, 4878, 4878, 4878, 4879, 4879, 4879, 4879, 4879, 4879, -1]]. +NPC config [id=4854, name=Mayor Hobb, config=874, shift=0, childs=[4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4875, 4875, -1]]. +NPC config [id=4853, name=Col. O'Niall, config=874, shift=0, childs=[4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4873, 4873, 4873, 4873, -1]]. +NPC config [id=5443, name=null, config=968, shift=14, childs=[-1, 5444, -1]]. +NPC config [id=5440, name=KGP Agent, config=968, shift=14, childs=[5441, 5441, -1]]. +NPC config [id=5439, name=null, config=968, shift=14, childs=[-1, 5441, -1]]. +NPC config [id=5427, name=Penguin, config=968, shift=8, childs=[5428, 5428, 5428, -1]]. +NPC config [id=5423, name=null, config=968, shift=13, childs=[-1, 5424, -1]]. +NPC config [id=5606, name=null, config=980, shift=-1, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1670, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1670, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1670, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1670, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1670, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1670, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1670, -1]]. +NPC config [id=5600, name=null, config=978, shift=9, childs=[-1, 5581, -1]]. +NPC config [id=5601, name='Transmute' The Alchemist, config=977, shift=0, childs=[5585, -1, 5585, 5585, 5585, -1, 5585, -1, 5585, -1, -1, 5585, 5585, -1, 5585, -1, 5585, -1]]. +NPC config [id=5602, name='Currency' The Alchemist, config=977, shift=0, childs=[5587, -1, 5587, 5587, 5587, -1, 5587, -1, 5587, -1, -1, 5587, 5587, -1, 5587, -1, 5587, -1]]. +NPC config [id=5599, name=null, config=977, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5583, -1, 5583, -1, 5583, -1]]. +NPC config [id=5598, name=Effigy, config=977, shift=0, childs=[5578, -1, 5578, 5578, 5578, -1, 5578, -1, 5578, -1, -1, 5578, 5578, -1, 5578, -1, 5578, -1]]. +NPC config [id=5574, name=null, config=440, shift=21, childs=[-1, 5567, -1]]. +NPC config [id=5575, name=null, config=440, shift=21, childs=[-1, 5568, -1]]. +NPC config [id=5573, name=null, config=440, shift=21, childs=[-1, 5566, -1]]. +NPC config [id=5576, name=null, config=440, shift=21, childs=[-1, 5569, -1]]. +NPC config [id=5577, name=null, config=440, shift=21, childs=[-1, 5570, -1]]. +NPC config [id=5530, name=Mawnis Burowgar, config=970, shift=21, childs=[5503, 5504, -1]]. +NPC config [id=5199, name=null, config=32, shift=-1, childs=[-1, -1, -1, 5198, -1]]. +NPC config [id=5192, name=Ogre shaman, config=936, shift=27, childs=[5193, 5194, -1]]. +NPC config [id=5189, name=Ogre shaman, config=936, shift=26, childs=[5190, 5191, -1]]. +NPC config [id=5186, name=Ogre shaman, config=936, shift=25, childs=[5187, 5188, -1]]. +NPC config [id=5206, name=Alice's husband, config=939, shift=0, childs=[5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, 5202, -1, -1, 5202, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1]]. +NPC config [id=5201, name=null, config=32, shift=-1, childs=[-1, -1, -1, 5200, -1]]. +NPC config [id=5183, name=Ogre shaman, config=936, shift=24, childs=[5184, 5185, -1]]. +NPC config [id=5180, name=Ogre shaman, config=936, shift=23, childs=[5181, 5182, -1]]. +NPC config [id=5175, name=Ogre shaman, config=936, shift=22, childs=[5176, 5179, -1]]. +NPC config [id=5135, name=null, config=934, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5131, -1]]. +NPC config [id=5134, name=null, config=934, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5130, -1]]. +NPC config [id=5125, name=Nickolaus, config=934, shift=0, childs=[5128, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5128, -1, -1, -1, -1, 5128, -1, -1, -1, -1, 5128, -1, -1, -1, -1, 5128, -1]]. +NPC config [id=5124, name=null, config=934, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5127, -1, -1, -1, -1, 5128, -1, -1, -1, -1, 5129, -1]]. +NPC config [id=5136, name=null, config=934, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5132, -1]]. +NPC config [id=5139, name=null, config=934, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5081, -1]]. +NPC config [id=5282, name=Osman, config=964, shift=14, childs=[924, 924, 5284, -1]]. +NPC config [id=5283, name=null, config=964, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 924, -1, -1, -1, -1, -1, -1, -1, -1, -1, 924, -1]]. +NPC config [id=5280, name=Maisa, config=964, shift=19, childs=[5281, -1]]. +NPC config [id=5257, name=null, config=964, shift=9, childs=[-1, 5258, -1]]. +NPC config [id=5259, name=null, config=964, shift=9, childs=[-1, 5260, -1]]. +NPC config [id=5261, name=null, config=964, shift=8, childs=[-1, 5262, -1]]. +NPC config [id=5263, name=null, config=964, shift=8, childs=[-1, 5264, -1]]. +NPC config [id=5265, name=null, config=964, shift=8, childs=[-1, 5266, -1]]. +NPC config [id=5267, name=null, config=964, shift=8, childs=[-1, 5268, -1]]. +NPC config [id=5269, name=null, config=964, shift=8, childs=[-1, 5270, -1]]. +NPC config [id=5271, name=null, config=964, shift=8, childs=[-1, 5272, -1]]. +NPC config [id=5273, name=null, config=964, shift=8, childs=[-1, 5274, -1]]. +NPC config [id=5275, name=null, config=964, shift=8, childs=[-1, 5276, -1]]. +NPC config [id=6000, name=Rupert the Beard, config=1017, shift=11, childs=[5992, 6001, -1]]. +NPC config [id=5997, name=Grimgnash, config=1017, shift=20, childs=[5989, -1]]. +NPC config [id=5998, name=Rupert the Beard, config=1016, shift=31, childs=[5990, 5999, -1]]. +NPC config [id=5901, name=null, config=1003, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5898, -1, 5898, -1, 5898, -1, 5898, -1, 5898, -1, 5898, -1, 5898, -1]]. +NPC config [id=5900, name=null, config=1005, shift=8, childs=[-1, -1, -1, -1, 5896, 5897, 5895, -1]]. +NPC config [id=5899, name=null, config=1005, shift=8, childs=[-1, 5896, 5897, 5895, -1]]. +NPC config [id=5892, name=null, config=997, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, 5872, -1]]. +NPC config [id=5891, name=null, config=997, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, 5871, -1]]. +NPC config [id=5890, name=null, config=997, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, 5872, 5872, -1]]. +NPC config [id=5889, name=null, config=997, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, 5871, 5871, -1]]. +NPC config [id=5888, name=null, config=997, shift=23, childs=[-1, 5870, -1]]. +NPC config [id=6082, name=null, config=176, shift=-1, childs=[-1, -1, -1, -1, -1, -1, -1, 918, 918, 918, 918, -1]]. +NPC config [id=6083, name=null, config=176, shift=-1, childs=[-1, -1, -1, -1, -1, -1, -1, -1, 918, 918, 918, -1]]. +NPC config [id=6119, name=Observatory professor, config=112, shift=-1, childs=[488, 488, 488, 488, 488, 488, -1]]. +NPC config [id=6120, name=null, config=112, shift=-1, childs=[-1, -1, -1, -1, -1, -1, 488, 488, 488, -1]]. +NPC config [id=6077, name=null, config=907, shift=14, childs=[-1, 822, -1]]. +NPC config [id=6076, name=null, config=728, shift=3, childs=[-1, 1685, -1]]. +NPC config [id=6075, name=Gravingas, config=728, shift=3, childs=[1685, -1]]. +NPC config [id=5677, name=Brother Tranquility, config=982, shift=27, childs=[5618, -1]]. +NPC config [id=5676, name=Monk, config=982, shift=27, childs=[5622, -1]]. +NPC config [id=5675, name=Monk, config=982, shift=27, childs=[5621, -1]]. +NPC config [id=5674, name=Monk, config=982, shift=27, childs=[5620, -1]]. +NPC config [id=5673, name=Monk, config=982, shift=27, childs=[5619, -1]]. +NPC config [id=5672, name=Zombie monk, config=982, shift=27, childs=[5626, 5611, -1]]. +NPC config [id=5671, name=Zombie monk, config=982, shift=27, childs=[5625, 5610, -1]]. +NPC config [id=5670, name=Zombie monk, config=982, shift=27, childs=[5624, 5609, -1]]. +NPC config [id=5669, name=Zombie monk, config=982, shift=27, childs=[5623, 5608, -1]]. +NPC config [id=5668, name=Brother Tranquility, config=980, shift=-1, childs=[5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1]]. +NPC config [id=5667, name=Brother Tranquility, config=980, shift=-1, childs=[5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1]]. +NPC config [id=5830, name=null, config=987, shift=1, childs=[-1, 5825, -1]]. +NPC config [id=5831, name=null, config=987, shift=1, childs=[-1, 5826, -1]]. +NPC config [id=5832, name=Ambassador Alvijar, config=997, shift=0, childs=[5863, 5863, 5863, 5863, 5863, 5863, 5863, 5863, 5863, 5863, 5863, -1]]. +NPC config [id=5853, name=Surok Magis, config=1181, shift=11, childs=[5834, 5835, 7000, -1]]. +NPC config [id=5869, name=null, config=997, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5868, -1]]. +NPC config [id=5887, name=null, config=997, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5863, -1]]. +NPC config [id=5787, name=Oldak, config=1094, shift=0, childs=[6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, -1, -1, 6392, -1]]. +NPC config [id=5802, name=null, config=988, shift=8, childs=[-1, 3712, -1]]. +NPC config [id=6400, name=null, config=1094, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6392, 6392, -1]]. +NPC config [id=6505, name=null, config=440, shift=21, childs=[-1, 6504, -1]]. +NPC config [id=6480, name=null, config=1094, shift=5, childs=[-1, 6479, -1]]. +NPC config [id=6333, name=null, config=1064, shift=30, childs=[-1, 6311, 6312, -1]]. +NPC config [id=6310, name=Cute creature, config=844, shift=13, childs=[6311, 6312, 1957, -1]]. +NPC config [id=6398, name=null, config=1094, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6393, 6393, -1]]. +NPC config [id=6396, name=null, config=1094, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, 6393, 6393, -1]]. +NPC config [id=6394, name=null, config=1094, shift=6, childs=[-1, 6393, -1]]. +NPC config [id=6387, name=null, config=934, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6385, -1]]. +NPC config [id=6386, name=null, config=1077, shift=8, childs=[-1, 6375, -1]]. +NPC config [id=6194, name=Carol, config=1049, shift=0, childs=[816, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 816, -1]]. +NPC config [id=6195, name=David, config=1049, shift=0, childs=[817, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 817, -1]]. +NPC config [id=6192, name=Anna, config=1049, shift=0, childs=[814, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 814, -1]]. +NPC config [id=6193, name=Bob, config=1049, shift=0, childs=[815, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 815, -1]]. +NPC config [id=6199, name=null, config=1049, shift=0, childs=[-1, -1, -1, -1, -1, 6178, -1, -1, -1, -1, 6178, -1, -1, -1, -1, 6178, -1, -1, -1, -1, 6178, -1, -1, -1, -1, 6178, -1, -1, -1, -1, 6178, -1, -1, -1, -1, 6178, -1, -1, -1, -1, 6178, -1]]. +NPC config [id=6196, name=Elizabeth, config=1049, shift=0, childs=[818, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 818, -1]]. +NPC config [id=6197, name=Frank, config=1049, shift=0, childs=[819, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 819, -1]]. +NPC config [id=6202, name=Knight, config=1048, shift=4, childs=[6201, -1]]. +NPC config [id=6186, name=null, config=1051, shift=19, childs=[-1, 806, 807, 808, 809, 810, 811, -1]]. +NPC config [id=6191, name=Guard, config=1049, shift=0, childs=[812, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 812, -1]]. +NPC config [id=7055, name=Chargurr, config=1185, shift=31, childs=[7053, -1]]. +NPC config [id=7042, name=Diseased kebbit, config=1185, shift=15, childs=[7039, 7083, -1]]. +NPC config [id=7043, name=Diseased kebbit, config=1185, shift=16, childs=[7039, 7083, -1]]. +NPC config [id=7040, name=Diseased kebbit, config=1185, shift=13, childs=[7039, 7083, -1]]. +NPC config [id=7041, name=Diseased kebbit, config=1185, shift=14, childs=[7039, 7083, -1]]. +NPC config [id=7066, name=null, config=1185, shift=31, childs=[-1, 4651, -1]]. +NPC config [id=7065, name=null, config=1185, shift=31, childs=[-1, 4654, -1]]. +NPC config [id=7056, name=null, config=1185, shift=31, childs=[-1, 7054, -1]]. +NPC config [id=7101, name=Thump, config=1185, shift=31, childs=[7061, -1]]. +NPC config [id=7100, name=Massage table, config=1185, shift=31, childs=[7060, 7059, -1]]. +NPC config [id=7103, name=null, config=1185, shift=31, childs=[-1, 7064, -1]]. +NPC config [id=7102, name=null, config=1185, shift=31, childs=[-1, 7063, -1]]. +NPC config [id=7097, name=null, config=1185, shift=11, childs=[-1, 7029, -1]]. +NPC config [id=7096, name=null, config=1185, shift=10, childs=[-1, 7028, -1]]. +NPC config [id=7099, name=Kringk, config=1185, shift=31, childs=[7058, -1]]. +NPC config [id=7098, name=null, config=1185, shift=12, childs=[-1, 7030, -1]]. +NPC config [id=7093, name=Peter, config=1185, shift=7, childs=[7029, 7083, -1]]. +NPC config [id=7092, name=Penelope, config=1185, shift=6, childs=[7028, 7083, -1]]. +NPC config [id=7095, name=null, config=1185, shift=9, childs=[-1, 7027, -1]]. +NPC config [id=7094, name=Peanut, config=1185, shift=8, childs=[7030, 7083, -1]]. +NPC config [id=7091, name=Patrick, config=1185, shift=5, childs=[7027, 7083, -1]]. +NPC config [id=7119, name=null, config=1190, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7118, -1, -1, -1, -1, 7118, 7118, -1, 7118, 7118, 7118, -1, -1, -1, -1, 7118, -1, -1, -1, -1, 7118, -1, -1, -1, -1, 7118, -1]]. +NPC config [id=7163, name=Caroline, config=1204, shift=0, childs=[696, -1]]. +NPC config [id=6989, name=null, config=1178, shift=1, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6970, -1]]. +NPC config [id=6988, name=Pikkupstix, config=1178, shift=1, childs=[6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1]]. +NPC config [id=7006, name=null, config=1181, shift=17, childs=[-1, 7001, -1]]. +NPC config [id=7007, name=null, config=1181, shift=17, childs=[-1, 7001, -1]]. +NPC config [id=7009, name=null, config=1181, shift=9, childs=[-1, 7002, -1]]. +NPC config [id=7008, name=null, config=1181, shift=17, childs=[-1, 7001, -1]]. +NPC config [id=7032, name=Wimpy bird, config=1185, shift=0, childs=[7031, 7083, -1]]. +NPC config [id=7033, name=Wimpy bird, config=1185, shift=1, childs=[7031, 7083, -1]]. +NPC config [id=7034, name=Wimpy bird, config=1185, shift=2, childs=[7031, 7083, -1]]. +NPC config [id=7035, name=Wimpy bird, config=1185, shift=3, childs=[7031, 7083, -1]]. +NPC config [id=7036, name=Wimpy bird, config=1185, shift=4, childs=[7031, 7083, -1]]. +NPC config [id=7037, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=7038, name=null, config=925, shift=31, childs=[-1, 1, -1]]. +NPC config [id=6793, name=null, config=1165, shift=22, childs=[-1, 6782, -1]]. +NPC config [id=7478, name=Bandit, config=435, shift=11, childs=[6174, 6174, 6388, -1]]. +NPC config [id=7192, name=null, config=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7168, -1]]. +NPC config [id=7193, name=null, config=1204, shift=18, childs=[-1, 7171, -1]]. +NPC config [id=7194, name=null, config=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7171, -1]]. +NPC config [id=7195, name=null, config=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7189, -1]]. +NPC config [id=7190, name=Ezekial Lovecraft, config=1204, shift=0, childs=[4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4856, -1]]. +NPC config [id=7191, name=Kimberly, config=1204, shift=0, childs=[7168, -1, -1, -1, -1, 7168, -1, -1, -1, -1, 7168, -1, -1, -1, -1, 7168, -1, -1, -1, -1, 7168, -1, -1, -1, -1, 7168, -1, 7168, -1, -1, 7168, -1, -1, -1, -1, 7168, -1]]. +NPC config [id=7177, name=null, config=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 701, 701, -1, -1, -1, 701, -1, -1, -1, -1, 701, 701, -1, -1, -1, 701, -1, -1, -1, -1, 701, -1, 701, -1, -1, 701, -1, -1, -1, -1, 701, -1]]. +NPC config [id=7176, name=null, config=1204, shift=19, childs=[-1, 701, -1]]. +NPC config [id=7179, name=null, config=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 696, -1]]. +NPC config [id=7178, name=null, config=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 701, -1, 701, -1, -1, 701, -1]]. +NPC config [id=7181, name=null, config=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 696, -1]]. +NPC config [id=7180, name=null, config=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 696, -1, 696, -1]]. +NPC config [id=7182, name=null, config=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 696, 696, -1, -1, -1, 696, -1, -1, -1, -1, 696, 696, -1, -1, -1, 696, -1, -1, -1, -1, 696, -1, 696, -1, -1, 696, -1, -1, -1, -1, 696, -1]]. +NPC config [id=7744, name=null, config=180, shift=-1, childs=[-1, -1, -1, -1, -1, 7742, 7742, -1]]. +NPC config [id=7708, name=null, config=1218, shift=15, childs=[-1, 7664, 7665, -1]]. +NPC config [id=7709, name=null, config=1218, shift=15, childs=[-1, -1, -1, 7665, -1]]. +NPC config [id=7710, name=Flaygian Screwte, config=1218, shift=29, childs=[7672, -1]]. +NPC config [id=7689, name=null, config=1219, shift=4, childs=[-1, 7675, -1]]. +NPC config [id=7688, name=null, config=1219, shift=1, childs=[-1, 7674, -1]]. +NPC config [id=7734, name=Baby icefiend, config=1225, shift=13, childs=[7736, 7713, -1]]. +NPC config [id=7735, name=Baby icefiend, config=1225, shift=15, childs=[7736, 7713, -1]]. +NPC config [id=7732, name=Baby icefiend, config=1225, shift=9, childs=[7736, 7713, -1]]. +NPC config [id=7733, name=Baby icefiend, config=1225, shift=11, childs=[7736, 7713, -1]]. +NPC config [id=7730, name=Brother Bordiss, config=1225, shift=0, childs=[7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, 7724, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, 7724, -1, -1, -1, 7724, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1]]. +NPC config [id=7731, name=null, config=1225, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7725, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7725, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7725, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7725, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7725, -1]]. +NPC config [id=7728, name=Lakki the delivery dwarf, config=1225, shift=8, childs=[7722, -1]]. +NPC config [id=7729, name=Drorkar, config=1225, shift=0, childs=[7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, 7723, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, 7723, -1, -1, -1, 7723, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1]]. +NPC config [id=7716, name=Icefiend, config=1225, shift=0, childs=[7714, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7714, -1, -1, -1, -1, 7714, -1, -1, -1, -1, 7714, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7714, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7714, -1, -1, -1, -1, 7714, -1, -1, -1, 7714, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7714, -1]]. diff --git a/dumps/498/498_npc_dump.txt b/dumps/498/498_npc_dump.txt new file mode 100644 index 000000000..dee9b2deb --- /dev/null +++ b/dumps/498/498_npc_dump.txt @@ -0,0 +1,7775 @@ +NPC id=0, name=Hans, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=2, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=4, name=Woman, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=5, name=Woman, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=6, name=Woman, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=7, name=Farmer, level=7, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=8, name=Thief, level=16, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=9, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=10, name=Schoolgirl, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7165]. +NPC id=11, name=Tramp, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=12, name=Barbarian, level=7, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=13, name=Wizard, level=9, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=14, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=15, name=Warrior woman, level=24, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=16, name=Man, level=2, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=17, name=Schoolgirl, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7165]. +NPC id=18, name=Al-Kharid warrior, level=9, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=19, name=White Knight, level=36, option=[null, Attack, null, null, null], anims=[7047, -1]. +NPC id=20, name=Paladin, level=62, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=21, name=Hero, level=69, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=22, name=Forester, level=15, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=23, name=Knight of Ardougne, level=46, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=24, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=25, name=Woman, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=26, name=Knight of Ardougne, level=46, option=[null, Attack, Pickpocket, null, null], anims=[-1, -1]. +NPC id=27, name=Archer, level=37, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=28, name=Zoo keeper, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +--#82FA58 +NPC id=29, name=Chuck, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=30, name=Barman, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=31, name=Priest, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=32, name=Guard, level=20, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=33, name=Door man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=34, name=Watchman, level=33, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=35, name=Soldier, level=28, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=36, name=Wyson the gardener, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=37, name=Sigbert the Adventurer, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=38, name=Shipyard worker, level=11, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=39, name=Shipyard worker, level=11, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=40, name=Shark, level=0, option=[null, null, null, null, null], anims=[-1, 10]. +NPC id=41, name=Chicken, level=1, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=42, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=43, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5335, 5334]. +NPC id=44, name=Banker, level=0, option=[Talk-to, Bank, null, Collect, null], anims=[808, 808]. +NPC id=45, name=Banker, level=0, option=[Talk-to, Bank, null, Collect, null], anims=[808, 808]. +NPC id=46, name=Duck, level=1, option=[null, Attack, null, null, null], anims=[6818, 6817]. +NPC id=47, name=Rat, level=1, option=[null, Attack, null, null, null], anims=[2704, 2703]. +NPC id=48, name=Oomlie bird, level=46, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=49, name=Hellhound, level=122, option=[null, Attack, null, null, null], anims=[6561, 6583]. +NPC id=50, name=King Black Dragon, level=276, option=[null, Attack, null, null, null], anims=[90, 4635]. +NPC id=51, name=Baby dragon, level=48, option=[null, Attack, null, null, null], anims=[27, 21]. +NPC id=52, name=Baby blue dragon, level=48, option=[null, Attack, null, null, null], anims=[27, 21]. +NPC id=53, name=Red dragon, level=152, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=54, name=Black dragon, level=227, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=55, name=Blue dragon, level=111, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=56, name=Dryad, level=1, option=[null, null, null, null, null], anims=[96, 93]. +NPC id=57, name=Fairy, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=58, name=Shadow spider, level=52, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=59, name=Giant spider, level=2, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=60, name=Giant spider, level=27, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=61, name=Spider, level=1, option=[null, Attack, null, null, null], anims=[6247, 6248]. +NPC id=62, name=Jungle spider, level=44, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=63, name=Deadly red spider, level=34, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=64, name=Ice spider, level=61, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=65, name=Leprechaun, level=12, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=66, name=Gnome, level=1, option=[Talk-to, Attack, Pickpocket, null, null], anims=[195, 189]. +NPC id=67, name=Gnome, level=1, option=[Talk-to, Attack, Pickpocket, null, null], anims=[195, 189]. +NPC id=68, name=Gnome, level=1, option=[Talk-to, Attack, Pickpocket, null, null], anims=[195, 189]. +NPC id=69, name=Lizard man, level=22, option=[null, Attack, null, null, null], anims=[179, 176]. +NPC id=70, name=Turael, level=0, option=[Talk-to, null, null, Trade, null], anims=[813, -1]. +NPC id=71, name=Orc, level=20, option=[Talk-to, null, null, null, null], anims=[232, 229]. +NPC id=72, name=Troll, level=69, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=73, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=74, name=Zombie, level=18, option=[null, Attack, null, null, null], anims=[5576, -1]. +NPC id=75, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=76, name=Zombie, level=25, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=77, name=Summoned Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=78, name=Giant bat, level=27, option=[null, Attack, null, null, null], anims=[4914, 4913]. +NPC id=79, name=Death wing, level=83, option=[null, Attack, null, null, null], anims=[4914, 4913]. +NPC id=80, name=Camel, level=0, option=[Talk-to, null, null, null, null], anims=[51, 45]. +NPC id=81, name=Cow, level=2, option=[null, Attack, null, null, null], anims=[5852, 5848]. +NPC id=82, name=Lesser demon, level=82, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=83, name=Greater demon, level=92, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=84, name=Black demon, level=172, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=85, name=Golem, level=55, option=[null, Attack, null, null, null], anims=[155, 152]. +NPC id=86, name=Giant rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=87, name=Giant rat, level=6, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=88, name=Dungeon rat, level=12, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=89, name=Unicorn, level=15, option=[null, Attack, null, null, null], anims=[6374, 6373]. +NPC id=90, name=Skeleton, level=22, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=91, name=Skeleton, level=21, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=92, name=Skeleton, level=25, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=93, name=Skeleton, level=45, option=[null, Attack, null, null, null], anims=[5493, 5497]. +NPC id=94, name=Skeleton Mage, level=16, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=95, name=Wolf, level=64, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=96, name=White wolf, level=25, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=97, name=White wolf, level=38, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=98, name=Dog, level=0, option=[null, null, null, null, null], anims=[6561, 6560]. +NPC id=99, name=Guard dog, level=44, option=[null, Attack, null, null, null], anims=[6561, 6560]. +NPC id=100, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=101, name=Goblin, level=5, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=102, name=Goblin, level=13, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=103, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5538, 5539]. +NPC id=104, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=105, name=Grizzly bear, level=21, option=[null, Attack, null, null, null], anims=[4919, 4923]. +NPC id=106, name=Black bear, level=19, option=[null, Attack, null, null, null], anims=[4919, 4923]. +NPC id=107, name=Scorpion, level=14, option=[null, Attack, null, null, null], anims=[6252, 6253]. +NPC id=108, name=Poison Scorpion, level=20, option=[null, Attack, null, null, null], anims=[6252, 6253]. +NPC id=109, name=Pit Scorpion, level=28, option=[null, Attack, null, null, null], anims=[6258, 6257]. +NPC id=110, name=Fire giant, level=86, option=[null, Attack, null, null, null], anims=[4662, 4660]. +NPC id=111, name=Ice giant, level=53, option=[null, Attack, null, null, null], anims=[4670, 4669]. +NPC id=112, name=Moss giant, level=42, option=[null, Attack, null, null, null], anims=[4656, 4654]. +NPC id=113, name=Jogre, level=53, option=[null, Attack, null, null, null], anims=[130, 127]. +NPC id=114, name=Ogre, level=53, option=[null, Attack, null, null, null], anims=[357, 358]. +NPC id=115, name=Ogre, level=53, option=[null, Attack, null, null, null], anims=[357, 358]. +NPC id=116, name=Cyclops, level=56, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=117, name=Hill Giant, level=28, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=118, name=Dwarf, level=10, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=119, name=Chaos dwarf, level=48, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=120, name=Dwarf, level=20, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=121, name=Dwarf, level=9, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=122, name=Hobgoblin, level=28, option=[null, Attack, null, null, null], anims=[166, 162]. +NPC id=123, name=Hobgoblin, level=42, option=[null, Attack, null, null, null], anims=[166, 162]. +NPC id=124, name=Earth warrior, level=51, option=[null, Attack, null, null, null], anims=[808, 841]. +NPC id=125, name=Ice warrior, level=57, option=[null, Attack, null, null, null], anims=[842, 841]. +NPC id=126, name=Otherworldly being, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=127, name=Magic axe, level=42, option=[null, Attack, null, null, null], anims=[187, 181]. +NPC id=128, name=Snake, level=5, option=[null, Attack, null, null, null], anims=[277, 274]. +NPC id=129, name=Skavid, level=2, option=[null, Attack, null, null, null], anims=[257, 254]. +NPC id=130, name=Yeti, level=58, option=[null, Attack, null, null, null], anims=[296, 293]. +NPC id=131, name=Penguin, level=2, option=[null, Attack, null, null, null], anims=[5668, 5666]. +NPC id=132, name=Monkey, level=3, option=[null, Attack, null, null, null], anims=[222, 219]. +NPC id=133, name=Black unicorn, level=27, option=[null, Attack, null, null, null], anims=[6374, 6373]. +NPC id=134, name=Poison spider, level=64, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=135, name=Mammoth, level=41, option=[null, Attack, null, null, null], anims=[306, 303]. +NPC id=136, name=Mounted terrorchick gnome, level=0, option=[Talk-to, null, null, null, null], anims=[6798, 6799]. +NPC id=137, name=Terrorchick gnome, level=0, option=[null, null, null, null, null], anims=[6798, 6799]. +NPC id=138, name=Terrorbird, level=28, option=[null, Attack, null, null, null], anims=[1008, 1007]. +NPC id=139, name=Terrorbird, level=28, option=[null, Attack, null, null, null], anims=[1008, 1007]. +NPC id=140, name=Souless, level=18, option=[null, Attack, null, null, null], anims=[337, 336]. +NPC id=141, name=Big Wolf, level=73, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=142, name=Wolf, level=25, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=143, name=Jungle Wolf, level=64, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=144, name=King Scorpion, level=32, option=[null, Attack, null, null, null], anims=[6252, 6253]. +NPC id=145, name=Ice warrior, level=57, option=[null, Attack, null, null, null], anims=[842, 841]. +NPC id=146, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=147, name=Cormorant, level=0, option=[null, null, null, null, null], anims=[6772, 6774]. +NPC id=148, name=Pelican, level=0, option=[null, null, null, null, null], anims=[6772, 6774]. +NPC id=149, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=150, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=151, name=Fly trap, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=152, child npcs=[5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, 5207, -1, -1, 5207, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5207, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5208, -1]. +NPC id=153, name=Butterfly, level=0, option=[null, null, null, null, null], anims=[362, 362]. +NPC id=154, name=Butterfly, level=0, option=[null, null, null, null, null], anims=[362, 362]. +NPC id=155, name=Butterfly, level=0, option=[null, null, null, null, null], anims=[362, 362]. +NPC id=156, name=Butterfly, level=0, option=[null, null, null, null, null], anims=[362, 362]. +NPC id=157, name=Butterfly, level=0, option=[null, null, null, null, null], anims=[362, 362]. +NPC id=158, name=Shadow warrior, level=48, option=[null, Attack, null, null, null], anims=[842, 841]. +NPC id=159, name=Gnome child, level=1, option=[Talk-to, Attack, Pickpocket, null, null], anims=[195, 189]. +NPC id=160, name=Gnome child, level=1, option=[Talk-to, Attack, Pickpocket, null, null], anims=[195, 189]. +NPC id=161, name=Gnome child, level=1, option=[Talk-to, Attack, Pickpocket, null, null], anims=[195, 189]. +NPC id=162, name=Gnome trainer, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=163, name=Gnome guard, level=23, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=164, name=Gnome guard, level=23, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=165, name=Gnome shop keeper, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=166, name=Gnome banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[195, 195]. +NPC id=167, name=Gnome baller, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=168, name=Gnome woman, level=1, option=[Talk-to, Attack, Pickpocket, null, null], anims=[195, 189]. +NPC id=169, name=Gnome woman, level=1, option=[Talk-to, Attack, Pickpocket, null, null], anims=[195, 189]. +NPC id=170, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[813, -1]. +NPC id=171, name=Brimstail, level=0, option=[Talk-to, null, Teleport, null, null], anims=[195, 189]. +NPC id=172, name=Dark wizard, level=20, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=173, name=Invrigar the Necromancer, level=20, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=174, name=Dark wizard, level=7, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=175, name=Mugger, level=6, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=176, name=Witch, level=25, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=177, name=Witch, level=25, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=178, name=Black Knight, level=33, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=179, name=Black Knight, level=33, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=180, name=Highwayman, level=5, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=181, name=Chaos druid, level=13, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=182, name=Pirate, level=23, option=[Talk-to, Attack, null, null, null], anims=[7188, -1]. +NPC id=183, name=Pirate, level=23, option=[Talk-to, Attack, null, null, null], anims=[7188, -1]. +NPC id=184, name=Pirate, level=26, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=185, name=Pirate, level=23, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=186, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=187, name=Rogue, level=15, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=188, name=Monk of Zamorak, level=22, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=189, name=Monk of Zamorak, level=17, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=190, name=Monk of Zamorak, level=45, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=191, name=Tribesman, level=32, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=192, name=Dark warrior, level=8, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=193, name=Chaos druid warrior, level=37, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=194, name=Necromancer, level=26, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=195, name=Bandit, level=22, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=196, name=Guard Bandit, level=22, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=197, name=Barbarian guard, level=8, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=198, name=Guildmaster, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=199, name=Gunthor the Brave, level=29, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=200, name=Lord Daquarius, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=201, name=Jailer, level=47, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=202, name=Black Heather, level=34, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=203, name=Donny the Lad, level=34, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=204, name=Speedy Keith, level=34, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=205, name=Salarin the Twisted, level=70, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=206, name=Guard, level=10, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=207, name=Lollk, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=208, name=Captain Lawgof, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=209, name=Nulodion, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=210, name=Grail Maiden, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=211, name=Sir Percival, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=212, name=King Percival, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=213, name=Merlin, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=214, name=Peasant, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=215, name=Peasant, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=216, name=High Priest, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=217, name=Crone, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=218, name=Galahad, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=219, name=Fisherman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=220, name=The Fisher King, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=221, name=Black Knight Titan, level=120, option=[Talk-to, Attack, null, null, null], anims=[130, 127]. +NPC id=222, name=Monk, level=5, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=223, name=Brother Kojo, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=224, name=Dungeon rat, level=12, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=225, name=Bonzo, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC (wrapper) id=226, child npcs=[3677, 3678, -1]. +NPC id=227, name=Morris, level=0, option=[Talk-to, null, null, null, null], anims=[3845, -1]. +NPC id=228, name=Big Dave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=229, name=Joshua, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=230, name=Grandpa Jack, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=231, name=Forester, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=232, name=Austri, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=233, name=Fishing spot, level=0, option=[Bait, null, null, null, null], anims=[447, 448]. +NPC id=234, name=Fishing spot, level=0, option=[Bait, null, null, null, null], anims=[447, 448]. +NPC id=235, name=Fishing spot, level=0, option=[Bait, null, null, null, null], anims=[447, 448]. +NPC id=236, name=Fishing spot, level=0, option=[Bait, null, null, null, null], anims=[447, 448]. +NPC id=237, name=Renegade Knight, level=37, option=[null, Attack, null, null, null], anims=[6927, 6928]. +NPC id=238, name=Thrantax the Mighty, level=92, option=[null, Attack, null, null, null], anims=[5538, 5539]. +NPC id=239, name=Sir Lancelot, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=240, name=Sir Gawain, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=241, name=Sir Kay, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=242, name=Sir Bedivere, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=243, name=Sir Tristram, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=244, name=Sir Pelleas, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=245, name=Sir Lucan, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=246, name=Teapotspout, level=94, option=[null, null, Walk here, Follow, Trade], anims=[8943, 8943]. +NPC id=247, name=Sir Mordred, level=39, option=[Talk-to, Attack, null, null, null], anims=[6487, 6486]. +NPC id=248, name=Morgan Le Faye, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=249, name=Merlin, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=250, name=The Lady of the Lake, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=251, name=King Arthur, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=252, name=Beggar, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=253, name=Khazard Guard, level=23, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=254, name=Khazard Guard, level=23, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=255, name=Khazard Guard, level=23, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=256, name=Khazard Guard, level=23, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=257, name=Khazard Guard, level=25, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=258, name=General Khazard, level=112, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=259, name=Khazard barman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=260, name=Kelvin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=261, name=Joe, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=262, name=Fightslave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=263, name=Hengrad, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=264, name=Lady Servil, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=265, name=Jeremy Servil, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=266, name=Jeremy Servil, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=267, name=Justin Servil, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=268, name=Local, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=269, name=Bouncer, level=137, option=[null, Attack, null, null, null], anims=[6580, 6582]. +NPC id=270, name=Khazard Ogre, level=63, option=[null, Attack, null, null, null], anims=[357, 358]. +NPC id=271, name=Khazard Scorpion, level=44, option=[null, Attack, null, null, null], anims=[6252, 6262]. +NPC id=272, name=Lucien, level=14, option=[Talk-to, Attack, null, null, null], anims=[6469, 6468]. +NPC id=273, name=Lucien, level=0, option=[Talk-to, null, null, null, null], anims=[6469, 6468]. +NPC id=274, name=Guardian of Armadyl, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=275, name=Guardian of Armadyl, level=43, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=276, name=Winelda, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=277, name=Fire Warrior of Lesarkus, level=84, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=278, name=Cook, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=279, name=Brother Omad, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=280, name=Brother Cedric, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=281, name=Monk, level=3, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=282, name=Thief, level=14, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=283, name=Head Thief, level=26, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=284, name=Doric, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=285, name=Veronica, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=286, name=Professor Oddenstein, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=287, name=Ernest, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=288, name=Chicken, level=0, option=[null, null, null, null, null], anims=[2298, 2297]. +NPC id=289, name=Councillor Halgrive, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=290, name=Doctor Orbon, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=291, name=Farmer Brumty, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=292, child npcs=[2345, 2377, -1]. +NPC (wrapper) id=293, child npcs=[2346, 2378, -1]. +NPC (wrapper) id=294, child npcs=[2347, 2379, -1]. +NPC (wrapper) id=295, child npcs=[2348, 2380, -1]. +NPC id=296, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[7222, 7223]. +NPC id=297, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[7222, 7224]. +NPC id=298, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[7222, 7223]. +NPC id=299, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[7217, 7216]. +NPC id=300, name=Sedridor, level=0, option=[Talk-to, null, Teleport, null, null], anims=[813, -1]. +NPC id=301, name=Twig, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=302, name=Hadley, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=303, name=Gerald, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=304, name=Almera, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=305, name=Hudon, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=306, name=Golrie, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=307, name=Hetty, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=308, name=Master fisher, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=309, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=310, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=311, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=312, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=313, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=314, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=315, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=316, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=317, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=318, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=319, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=320, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=321, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=322, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=323, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=324, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=325, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=326, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=327, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=328, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=329, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=330, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=331, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=332, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=333, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=334, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=335, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=336, name=Da Vinci, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=337, name=Da Vinci, level=0, option=[Talk-to, null, null, null, null], anims=[1322, -1]. +NPC id=338, name=Chancy, level=0, option=[Talk-to, null, null, null, null], anims=[2713, -1]. +NPC id=339, name=Chancy, level=0, option=[Talk-to, null, null, null, null], anims=[1322, -1]. +NPC id=340, name=Hops, level=0, option=[Talk-to, null, null, null, null], anims=[2712, -1]. +NPC id=341, name=Hops, level=0, option=[Talk-to, null, null, null, null], anims=[1322, -1]. +NPC id=342, name=Guidor's wife, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=343, name=Guidor, level=0, option=[Talk-to, null, null, null, null], anims=[4780, -1]. +NPC id=344, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=345, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[4591, -1]. +NPC id=346, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[4591, -1]. +NPC id=347, name=Mourner, level=11, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=348, name=Mourner, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=349, name=Kilron, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=350, name=Omart, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=351, name=Man, level=4, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=352, name=Woman, level=3, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=353, name=Woman, level=4, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=354, name=Woman, level=3, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=355, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=356, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=357, name=Mourner, level=18, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=358, name=Priest, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=359, name=Man, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=360, name=Woman, level=4, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=361, name=Woman, level=12, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=362, name=Woman, level=3, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=363, name=Woman, level=14, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=364, name=King Lathas, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=365, name=Paladin, level=59, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=366, name=Jerico, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=367, name=Chemist, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=368, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=369, name=Mourner, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=370, name=Mourner, level=13, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=371, name=Mourner, level=12, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=372, name=Mourner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=373, name=Nurse Sarah, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=374, name=Ogre, level=63, option=[null, Attack, null, null, null], anims=[357, 358]. +NPC id=375, name=Redbeard Frank, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=376, name=Captain Tobias, level=0, option=[Talk-to, null, Pay-fare, null, null], anims=[808, -1]. +NPC id=377, name=Seaman Lorris, level=0, option=[Talk-to, null, Pay-fare, null, null], anims=[808, -1]. +NPC id=378, name=Seaman Thresnor, level=0, option=[Talk-to, null, Pay-fare, null, null], anims=[808, -1]. +NPC id=379, name=Luthas, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=380, name=Customs officer, level=0, option=[Talk-to, null, Pay-Fare, null, null], anims=[808, -1]. +NPC (wrapper) id=381, child npcs=[4974, -1]. +NPC id=382, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=383, name=Stankers, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=384, name=Barbarian guard, level=0, option=[Talk-to, null, null, null, null], anims=[2065, 2064]. +NPC id=385, name=Kharid Scorpion, level=0, option=[Pick-up, null, null, null, null], anims=[6258, 6257]. +NPC id=386, name=Kharid Scorpion, level=0, option=[Pick-up, null, null, null, null], anims=[6258, 6257]. +NPC id=387, name=Kharid Scorpion, level=0, option=[Pick-up, null, null, null, null], anims=[6258, 6257]. +NPC id=388, name=Seer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=389, name=Thormac, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=390, name=Big fish, level=0, option=[null, null, null, null, null], anims=[4, -1]. +NPC id=391, name=River troll, level=14, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=392, name=River troll, level=29, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=393, name=River troll, level=49, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=394, name=River troll, level=79, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=395, name=River troll, level=120, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=396, name=River troll, level=159, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=397, name=Cow, level=2, option=[null, Attack, null, null, null], anims=[5852, 5848]. +NPC id=398, name=Legends guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=399, name=Legends guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=400, name=Radimus Erkle, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=401, name=Jungle forester, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=402, name=Jungle forester, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=403, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[456, -1]. +NPC id=404, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[456, -1]. +NPC id=405, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[456, -1]. +NPC id=406, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[456, -1]. +NPC id=407, name=Strange plant, level=0, option=[Pick, null, null, null, null], anims=[349, -1]. +NPC id=408, name=Strange plant, level=0, option=[null, Attack, null, null, null], anims=[352, 356]. +NPC id=409, name=Genie, level=0, option=[Talk-to, null, null, null, null], anims=[792, 792]. +NPC id=410, name=Mysterious Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=411, name=Swarm, level=0, option=[null, null, null, null, null], anims=[0, 0]. +NPC id=412, name=Bat, level=6, option=[null, Attack, null, null, null], anims=[4914, 4913]. +NPC id=413, name=Rock Golem, level=14, option=[null, Attack, null, null, null], anims=[155, 152]. +NPC id=414, name=Rock Golem, level=29, option=[null, Attack, null, null, null], anims=[155, 152]. +NPC id=415, name=Rock Golem, level=49, option=[null, Attack, null, null, null], anims=[155, 152]. +NPC id=416, name=Rock Golem, level=79, option=[null, Attack, null, null, null], anims=[155, 152]. +NPC id=417, name=Rock Golem, level=120, option=[null, Attack, null, null, null], anims=[155, 152]. +NPC id=418, name=Rock Golem, level=159, option=[null, Attack, null, null, null], anims=[155, 152]. +NPC id=419, name=Zombie, level=14, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=420, name=Zombie, level=29, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=421, name=Zombie, level=49, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=422, name=Zombie, level=79, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=423, name=Zombie, level=120, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=424, name=Zombie, level=159, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=425, name=Shade, level=14, option=[null, Attack, null, null, null], anims=[15, 13]. +NPC id=426, name=Shade, level=29, option=[null, Attack, null, null, null], anims=[15, 13]. +NPC id=427, name=Shade, level=49, option=[null, Attack, null, null, null], anims=[15, 13]. +NPC id=428, name=Shade, level=79, option=[null, Attack, null, null, null], anims=[15, 13]. +NPC id=429, name=Shade, level=120, option=[null, Attack, null, null, null], anims=[15, 13]. +NPC id=430, name=Shade, level=159, option=[null, Attack, null, null, null], anims=[15, 13]. +NPC (wrapper) id=431, child npcs=[4544, -1, 4544, -1, 4544, -1, 4544, -1, 4544, -1, 4544, -1, 4544, -1, 4544, -1]. +NPC id=432, name=Cyrisus, level=138, option=[null, hidden, null, null, null], anims=[808, -1]. +NPC id=433, name=Cyrisus, level=138, option=[null, hidden, null, null, null], anims=[808, -1]. +NPC id=434, name=Cyrisus, level=138, option=[null, hidden, null, null, null], anims=[808, -1]. +NPC id=435, name=Fallen Man, level=0, option=[Talk-to, null, Inspect, null, null], anims=[6280, 6280]. +NPC id=436, name=Fallen Man, level=0, option=[Talk-to, null, Inspect, null, null], anims=[6282, 6282]. +NPC id=437, name=Cap'n Izzy No-Beard, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=438, name=Tree spirit, level=14, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=439, name=Tree spirit, level=29, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=440, name=Tree spirit, level=49, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=441, name=Tree spirit, level=79, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=442, name=Tree spirit, level=120, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=443, name=Tree spirit, level=159, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=444, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6181, 6180]. +NPC id=445, name=Goblin, level=5, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=446, name=Giant rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=447, name=Jail guard, level=26, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=448, name=Jail guard, level=26, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=449, name=Jail guard, level=26, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=450, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=451, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=452, name=Seth Groats, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=453, name=Suit of armour, level=19, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=454, name=Sanfew, level=0, option=[Talk-to, null, null, null, null], anims=[8528, 8527]. +NPC id=455, name=Kaqemeex, level=0, option=[Talk-to, null, null, null, null], anims=[8528, 8527]. +NPC id=456, name=Father Aereck, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=457, name=Restless ghost, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=458, name=Father Urhney, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=459, name=Skeleton, level=13, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=460, name=Wizard Frumscone, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=461, name=Magic Store owner, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=462, name=Wizard Distentor, level=0, option=[Talk-to, null, Teleport, null, null], anims=[813, -1]. +NPC id=463, name=Murphy, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=464, name=Murphy, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=465, name=Murphy, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=466, name=Murphy, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=467, name=Shark, level=0, option=[null, null, null, null, null], anims=[10, 10]. +NPC id=468, name=Shark, level=0, option=[null, null, null, null, null], anims=[10, 10]. +NPC id=469, name=King Bolren, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=470, name=Commander Montai, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=471, name=Bolkoy, level=0, option=[Talk-to, null, Trade, null, null], anims=[195, 189]. +NPC id=472, name=Remsai, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=473, name=Elkoy, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=474, name=Elkoy, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=475, name=Khazard trooper, level=19, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=476, name=Khazard trooper, level=19, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=477, name=Khazard warlord, level=112, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=478, name=Khazard commander, level=48, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=479, name=Gnome troop, level=1, option=[Talk-to, Attack, null, null, null], anims=[195, 189]. +NPC id=480, name=Gnome troop, level=1, option=[Talk-to, Attack, null, null, null], anims=[195, 189]. +NPC id=481, name=Tracker gnome 1, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=482, name=Tracker gnome 2, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=483, name=Tracker gnome 3, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=484, name=Local Gnome, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=485, name=Local Gnome, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=486, name=Kalron, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=487, name=Giant, level=0, option=[null, null, null, null, null], anims=[6857, -1]. +NPC id=488, name=Observatory professor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=489, name=Goblin guard, level=42, option=[null, Attack, null, null, null], anims=[6200, 6201]. +NPC id=490, name=Mummy, level=0, option=[null, null, null, null, null], anims=[6856, -1]. +NPC id=491, name=Ghost, level=24, option=[Talk-to, Attack, null, null, null], anims=[5538, 5539]. +NPC id=492, name=Spirit of Scorpius, level=0, option=[Talk-to, null, null, null, null], anims=[5538, 5539]. +NPC id=493, name=Grave scorpion, level=12, option=[null, Attack, null, null, null], anims=[6258, 6257]. +NPC id=494, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=495, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=496, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=497, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=498, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[112, 112]. +NPC id=499, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=500, name=Mosol Rei, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=501, name=Spirit of Zadimus, level=0, option=[Talk-to, null, null, null, null], anims=[5530, 5531]. +NPC id=502, name=Undead one, level=68, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=503, name=Undead one, level=61, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=504, name=Undead one, level=68, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=505, name=Undead one, level=73, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=506, name=Rashiliyia, level=0, option=[Talk-to, null, null, null, null], anims=[5530, 5531]. +NPC id=507, name=Nazastarool, level=91, option=[null, Attack, null, null, null], anims=[5572, 5582]. +NPC id=508, name=Nazastarool, level=68, option=[null, Attack, null, null, null], anims=[5505, 5506]. +NPC id=509, name=Nazastarool, level=93, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=510, name=Hajedy, level=0, option=[Talk-to, null, Pay-fare, null, null], anims=[808, -1]. +NPC id=511, name=Vigroy, level=0, option=[Talk-to, null, Pay-fare, null, null], anims=[808, -1]. +NPC id=512, name=Kaleb Paramaya, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=513, name=Yohnus, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=514, name=Seravel, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=515, name=Yanni Salika, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=516, name=Obli, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=517, name=Fernahei, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=518, name=Captain Shanks, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=519, name=Bob, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=520, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=521, name=Shop assistant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=522, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=523, name=Shop assistant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=524, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=525, name=Shop assistant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=526, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=527, name=Shop assistant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=528, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=529, name=Shop assistant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=530, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=531, name=Shop assistant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=532, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=533, name=Shop assistant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=534, name=Fairy shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[112, 106]. +NPC id=535, name=Fairy shop assistant, level=0, option=[Talk-to, null, Trade, null, null], anims=[112, 106]. +NPC id=536, name=Valaine, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=537, name=Scavvo, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=538, name=Peksa, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=539, name=Silk trader, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=540, name=Gem trader, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=541, name=Zeke, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=542, name=Louie Legs, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=543, name=Karim, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=544, name=Ranael, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=545, name=Dommik, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=546, name=Zaff, level=0, option=[Talk-to, null, Trade, Buy-battlestaves, null], anims=[813, -1]. +NPC id=547, name=Baraek, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=548, name=Thessalia, level=0, option=[Talk-to, null, Trade, Change-clothes, null], anims=[808, -1]. +NPC id=549, name=Horvik, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=550, name=Lowe, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=551, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=552, name=Shop assistant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=553, name=Aubury, level=0, option=[Talk-to, null, Trade, Teleport, null], anims=[808, -1]. +NPC id=554, name=Fancy-dress shop owner, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=555, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=556, name=Grum, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=557, name=Wydin, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=558, name=Gerrant, level=0, option=[Talk-to, null, Trade, null, null], anims=[813, -1]. +NPC id=559, name=Brian, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=560, name=Jiminua, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=561, name=Shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=562, name=Candle-maker, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=563, name=Arhein, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=564, name=Jukat, level=0, option=[Talk-to, null, Trade, null, null], anims=[112, 106]. +NPC id=565, name=Lunderwin, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=566, name=Irksol, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=567, name=Fairy, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=568, name=Zambo, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=569, name=Silver merchant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=570, name=Gem merchant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=571, name=Baker, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=572, name=Spice seller, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=573, name=Fur trader, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=574, name=Silk merchant, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=575, name=Hickton, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=576, name=Harry, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=577, name=Cassie, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=578, name=Frincos, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=579, name=Drogo dwarf, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=580, name=Flynn, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=581, name=Wayne, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=582, name=Dwarf, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=583, name=Betty, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=584, name=Herquin, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=585, name=Rommik, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=586, name=Gaius, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=587, name=Jatix, level=0, option=[Talk-to, null, Trade, null, null], anims=[8528, 8527]. +NPC id=588, name=Davon, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=589, name=Zenesha, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=590, name=Aemad, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=591, name=Kortan, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=592, name=Roachey, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=593, name=Frenita, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=594, name=Nurmof, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=595, name=Tea seller, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=596, name=Fat Tony, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=597, name=Noterazzo, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=598, name=Hairdresser, level=0, option=[Talk-to, null, Hair-cut, null, null], anims=[808, -1]. +NPC id=599, name=Make-over Mage, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=600, name=Hudo, level=0, option=[Talk-to, null, Trade, null, null], anims=[195, 189]. +NPC id=601, name=Rometti, level=0, option=[Talk-to, null, Trade, null, null], anims=[195, 189]. +NPC id=602, name=Gulluck, level=0, option=[Talk-to, null, Trade, null, null], anims=[195, 189]. +NPC id=603, name=Heckel Funch, level=0, option=[Talk-to, null, Trade, null, null], anims=[195, 189]. +NPC id=604, name=Thurgo, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=605, name=Sir Vyvin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=606, name=Squire, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=607, name=Gunnjorn, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=608, name=Sir Amik Varze, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=609, name=Fortress Guard, level=20, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=610, name=Black Knight Captain, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=611, name=Witch, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=612, name=Greldo, level=0, option=[null, null, null, null, null], anims=[6200, 6201]. +NPC id=613, name=Digsite workman, level=0, option=[Talk-to, null, Steal-from, null, null], anims=[808, -1]. +NPC id=614, name=Doug Deeping, level=0, option=[Talk-to, null, Steal-from, null, null], anims=[808, -1]. +NPC id=615, name=Student, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=616, name=Student, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=617, name=Student, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=618, name=Examiner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=619, name=Archaeological expert, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=620, name=Panning guide, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=621, name=Gnome baller, level=0, option=[Tackle, null, null, null, null], anims=[195, 189]. +NPC id=622, name=Gnome baller, level=0, option=[Tackle, null, null, null, null], anims=[195, 189]. +NPC id=623, name=Gnome baller, level=0, option=[null, null, null, null, null], anims=[205, 205]. +NPC id=624, name=Gnome baller, level=0, option=[null, null, null, null, null], anims=[208, 208]. +NPC id=625, name=Gnome baller, level=0, option=[Tackle, null, null, null, null], anims=[195, 189]. +NPC id=626, name=Gnome baller, level=0, option=[Tackle, null, null, null, null], anims=[195, 189]. +NPC id=627, name=Gnome baller, level=0, option=[null, null, null, null, null], anims=[205, 205]. +NPC id=628, name=Gnome baller, level=0, option=[null, null, null, null, null], anims=[208, 208]. +NPC id=629, name=Gnome baller, level=0, option=[Tackle, null, null, null, null], anims=[195, 189]. +NPC id=630, name=Gnome baller, level=0, option=[Tackle, null, null, null, null], anims=[195, 189]. +NPC id=631, name=Gnome baller, level=0, option=[null, null, null, null, null], anims=[205, 205]. +NPC id=632, name=Gnome baller, level=0, option=[null, null, null, null, null], anims=[208, 208]. +NPC id=633, name=Gnome winger, level=0, option=[Pass-to, null, null, null, null], anims=[195, 189]. +NPC id=634, name=Gnome winger, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=635, name=Gnome ball referee, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=636, name=Cheerleader, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=637, name=Juliet, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=638, name=Apothecary, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=639, name=Romeo, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=640, name=Father Lawrence, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=641, name=Charlie the Tramp, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=642, name=Katrine, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=643, name=Weaponsmaster, level=23, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=644, name=Straven, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=645, name=Jonny the beard, level=2, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=646, name=Curator Haig Halen, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC (wrapper) id=647, child npcs=[2661, 2660, -1]. +NPC id=648, name=King Roald, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=649, name=Archer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=650, name=Warrior, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=651, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=652, name=Wizard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=653, name=Fairy Queen, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=654, name=Shamus, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=655, name=Tree spirit, level=101, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=656, name=Cave monk, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=657, name=Monk of Entrana, level=0, option=[Talk-to, null, Take-boat, null, null], anims=[808, -1]. +NPC id=658, name=Monk of Entrana, level=0, option=[Talk-to, null, Take-boat, null, null], anims=[808, -1]. +NPC id=659, name=Party Pete, level=0, option=[Talk-to, null, null, null, null], anims=[9227, -1]. +NPC id=660, name=Knight, level=0, option=[Talk-to, null, null, null, null], anims=[784, -1]. +NPC id=661, name=Megan, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=662, name=Lucy, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=663, name=Man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=664, name=Dimintheis, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=665, name=Boot, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=666, name=Caleb, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=667, name=Chronozon, level=170, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=668, name=Johnathon, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=669, name=Hazelmere, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=670, name=King Narnode Shareen, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=671, name=Glough, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=672, name=Anita, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=673, name=Charlie, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=674, name=Foreman, level=23, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=675, name=Shipyard worker, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=676, name=Femi, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=677, name=Black demon, level=172, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=678, name=Guard, level=37, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=679, name=Ranging Guild Doorman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=680, name=Leatherworker, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=681, name=Held vampyre juvinate, level=59, option=[null, Attack, null, null, null], anims=[3551, -1]. +NPC id=682, name=Armour salesman, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=683, name=Bow and Arrow salesman, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=684, name=Tower Advisor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=685, name=Tower Advisor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=686, name=Tower Advisor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=687, name=Tower Advisor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=688, name=Tower Archer, level=19, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=689, name=Tower Archer, level=34, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=690, name=Tower Archer, level=49, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=691, name=Tower Archer, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=692, name=Tribal Weapon Salesman, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=693, name=Competition Judge, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=694, name=Ticket Merchant, level=0, option=[Trade, null, null, null, null], anims=[808, -1]. +NPC id=695, name=Bailey, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=696, name=Caroline, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=697, child npcs=[4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, 4864, -1]. +NPC id=698, name=Holgart, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=699, name=Holgart, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=700, name=Holgart, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=701, name=Kent, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=702, name=Fisherman, level=0, option=[Talk-to, null, null, null, null], anims=[4825, 4779]. +NPC id=703, name=Fisherman, level=0, option=[Talk-to, null, null, null, null], anims=[4825, 4779]. +NPC id=704, name=Fisherman, level=0, option=[Talk-to, null, null, null, null], anims=[4825, 4779]. +NPC id=705, name=Melee combat tutor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=706, name=Wizard Mizgog, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=707, name=Wizard Grayzag, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=708, name=Imp, level=2, option=[null, Attack, null, null, null], anims=[171, 168]. +NPC id=709, name=Imp, level=3, option=[null, Attack, null, null, null], anims=[171, 168]. +NPC id=710, name=Alrena, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=711, name=Bravek, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=712, name=Carla, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=713, name=Clerk, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=714, name=Edmond, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC (wrapper) id=715, child npcs=[3215, -1]. +NPC id=716, name=Head mourner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=717, name=Mourner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=718, name=Mourner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=719, name=Mourner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=720, name=Recruiter, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=721, name=Ted Rehnison, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=722, name=Martha Rehnison, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=723, name=Billy Rehnison, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=724, name=Milli Rehnison, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=725, name=Jethick, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=726, name=Man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=727, name=Man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=728, name=Man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=729, name=Man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=730, name=Man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=731, name=Bartender, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=732, name=Bartender, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=733, name=Bartender, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=734, name=Bartender, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=735, name=Bartender, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=736, name=Emily, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=737, name=Bartender, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=738, name=Bartender, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=739, name=Bartender, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=740, name=Trufitus, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=741, name=Duke Horacio, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=742, name=Elvarg, level=83, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=743, name=Ned, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=744, name=Klarense, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=745, name=Wormbrain, level=2, option=[Talk-to, Attack, null, null, null], anims=[6181, 6180]. +NPC id=746, name=Oracle, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=747, name=Oziach, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC (wrapper) id=748, child npcs=[6085, 6085, 6085, 6085, 6085, 6085, 6085, 6085, -1]. +NPC id=749, name=Angry barbarian spirit, level=166, option=[null, Attack, null, null, null], anims=[6729, 6730]. +NPC id=750, name=Enraged barbarian spirit, level=166, option=[null, Attack, null, null, null], anims=[6729, 6730]. +NPC id=751, name=Berserk barbarian spirit, level=166, option=[null, Attack, null, null, null], anims=[6729, 6730]. +NPC id=752, name=Ferocious barbarian spirit, level=166, option=[null, Attack, null, null, null], anims=[6729, 6730]. +NPC id=753, name=Melzar the Mad, level=43, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=754, name=Peaceful barbarian spirit, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=755, name=Morgan, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=756, name=Dr Harlow, level=0, option=[Talk-to, null, null, null, null], anims=[3040, -1]. +NPC id=757, name=Count Draynor, level=34, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=758, name=Fred the Farmer, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=759, name=null, level=1, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=760, name=Kittens, level=0, option=[null, null, null, null, null], anims=[9208, 9210]. +NPC id=761, name=Kitten, level=0, option=[Pick-up, Hidden, Talk-to, Interact-with, null], anims=[9158, 9156]. +NPC id=762, name=Kitten, level=0, option=[Pick-up, Hidden, Talk-to, Interact-with, null], anims=[9158, 9156]. +NPC id=763, name=Kitten, level=0, option=[Pick-up, Hidden, Talk-to, Interact-with, null], anims=[9158, 9156]. +NPC id=764, name=Kitten, level=0, option=[Pick-up, Hidden, Talk-to, Interact-with, null], anims=[9158, 9156]. +NPC id=765, name=Kitten, level=0, option=[Pick-up, Hidden, Talk-to, Interact-with, null], anims=[9158, 9156]. +NPC id=766, name=Kitten, level=0, option=[Pick-up, Hidden, Talk-to, Interact-with, null], anims=[9158, 9156]. +NPC id=767, name=Crate, level=0, option=[Search, null, null, null, null], anims=[-1, -1]. +NPC id=768, name=Cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=769, name=Cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=770, name=Cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=771, name=Cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=772, name=Cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=773, name=Cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=774, name=Overgrown cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=775, name=Overgrown cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=776, name=Overgrown cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=777, name=Overgrown cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=778, name=Overgrown cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=779, name=Overgrown cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=780, name=Gertrude, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=781, name=Shilop, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=782, name=Philop, level=0, option=[Talk-to, null, null, null, null], anims=[7163, -1]. +NPC id=783, name=Wilough, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=784, name=Kanel, level=0, option=[Talk-to, null, null, null, null], anims=[7164, -1]. +NPC id=785, name=Civilian, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=786, name=Civilian, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=787, name=Civilian, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=788, name=Garv, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=789, name=Grubor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=790, name=Letham, level=111, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=791, name=Seth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=792, name=Grip, level=22, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=793, name=Alfonse the waiter, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=794, name=Charlie the cook, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=795, name=Ice Queen, level=111, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=796, name=Achietties, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=797, name=Helemos, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=798, name=Velrak the explorer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=799, name=Pirate Guard, level=19, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=800, name=Fishing spot, level=0, option=[Bait, null, hidden, null, null], anims=[525, 525]. +NPC id=801, name=Abbot Langley, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=802, name=Brother Jered, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=803, name=Monk, level=5, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=804, name=Tanner, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=805, name=Master Crafter, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=806, name=Donovan the Family Handyman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=807, name=Pierre, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=808, name=Hobbes, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=809, name=Louisa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=810, name=Mary, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=811, name=Stanford, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=812, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=813, name=Gossip, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=814, name=Anna, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=815, name=Bob, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=816, name=Carol, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=817, name=David, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=818, name=Elizabeth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=819, name=Frank, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=820, name=Poison Salesman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=821, name=Sinclair Guard dog, level=0, option=[null, null, null, null, null], anims=[6561, 6560]. +NPC id=822, name=Ana, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=823, name=Ana, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=824, name=Female slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=825, name=Male slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=826, name=Escaping slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=827, name=Rowdy slave, level=10, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=828, name=Shanty Claws, level=0, option=[Talk-to, null, null, null, null], anims=[4738, 4740]. +NPC (wrapper) id=829, child npcs=[5017, 5018, 5019, -1]. +NPC id=830, name=Mercenary Captain, level=47, option=[Talk-to, Attack, Watch, null, null], anims=[808, -1]. +NPC id=831, name=Captain Siad, level=0, option=[Talk-to, null, null, null, null], anims=[1953, -1]. +NPC id=832, name=Al Shabim, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=833, name=Bedabin Nomad, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=834, name=Bedabin Nomad Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=835, name=Irena, level=0, option=[Talk-to, null, null, null, null], anims=[2702, -1]. +NPC id=836, name=Shantay, level=0, option=[Talk-to, null, Trade, Buy-pass, null], anims=[808, -1]. +NPC id=837, name=Shantay Guard, level=22, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=838, name=Shantay Guard, level=22, option=[Talk-to, null, Bribe, null, null], anims=[808, -1]. +NPC id=839, name=Desert Wolf, level=27, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=840, name=Ugthanki, level=42, option=[Talk-to, Attack, null, null, null], anims=[51, 45]. +NPC id=841, name=Mine cart driver, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=842, name=Rowdy Guard, level=43, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=843, name=RPDT employee, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=844, child npcs=[2328, -1]. +NPC id=845, name=Horacio, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=846, name=Kangai Mau, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=847, name=Head chef, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=848, name=Blurberry, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=849, name=Barman, level=0, option=[Talk-to, null, Trade, null, null], anims=[195, 189]. +NPC id=850, name=Aluft Gianne snr., level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=851, name=Gnome Waiter, level=0, option=[Talk-to, null, Trade, null, null], anims=[195, 189]. +NPC id=852, name=Ogre chieftain, level=81, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=853, name=Og, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=854, name=Grew, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=855, name=Toban, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=856, name=Gorad, level=68, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=857, name=Ogre guard, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=858, name=Ogre guard, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=859, name=Ogre guard, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=860, name=Ogre guard, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=861, name=Ogre guard, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=862, name=City guard, level=83, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=863, name=Scared skavid, level=0, option=[Talk-to, null, null, null, null], anims=[257, 254]. +NPC id=864, name=Mad skavid, level=0, option=[Talk-to, null, null, null, null], anims=[257, 254]. +NPC id=865, name=Skavid, level=0, option=[Talk-to, null, null, null, null], anims=[257, 254]. +NPC id=866, name=Skavid, level=0, option=[Talk-to, null, null, null, null], anims=[257, 254]. +NPC id=867, name=Skavid, level=0, option=[Talk-to, null, null, null, null], anims=[257, 254]. +NPC id=868, name=Skavid, level=0, option=[Talk-to, null, null, null, null], anims=[257, 254]. +NPC id=869, name=Skavid, level=0, option=[Talk-to, null, null, null, null], anims=[257, 254]. +NPC id=870, name=Enclave guard, level=83, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=871, name=Ogre shaman, level=113, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=872, name=Watchtower Wizard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=873, name=Ogre trader, level=0, option=[Talk-to, null, Trade, null, null], anims=[357, 358]. +NPC id=874, name=Ogre merchant, level=0, option=[Talk-to, null, Trade, null, null], anims=[357, 358]. +NPC id=875, name=Ogre trader, level=0, option=[Talk-to, null, Trade, null, null], anims=[357, 358]. +NPC id=876, name=Ogre trader, level=0, option=[Talk-to, null, Trade, null, null], anims=[357, 358]. +NPC id=877, name=Tower guard, level=28, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=878, name=Colonel Radick, level=38, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=879, name=Delrith, level=27, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=880, name=Weakened Delrith, level=1, option=[Banish, null, null, null, null], anims=[4619, 63]. +NPC id=881, name=Traiborn, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=882, name=Gypsy Aris, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=883, name=Sir Prysin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=884, name=Captain Rovin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=885, name=Ceril Carnillean, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=886, name=Claus the chef, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=887, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=888, name=Philipe Carnillean, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=889, name=Henryeta Carnillean, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=890, name=Butler Jones, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=891, name=Alomone, level=13, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=892, name=Hazeel, level=296, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=893, name=Clivet, level=13, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=894, name=Hazeel Cultist, level=13, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=895, name=Boy, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=896, name=Nora T. Hagg, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=897, name=Witch's experiment, level=19, option=[null, Attack, null, null, null], anims=[257, 254]. +NPC id=898, name=Witch's experiment (second form), level=30, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=899, name=Witch's experiment (third form), level=42, option=[null, Attack, null, null, null], anims=[4919, 4923]. +NPC id=900, name=Witch's experiment (fourth form), level=53, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=901, name=Mouse, level=0, option=[null, null, null, null, null], anims=[242, 239]. +NPC id=902, name=Gundai, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=903, name=Lundail, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=904, name=Chamber guardian, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=905, name=Kolodion, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=906, name=Kolodion, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=907, name=Kolodion, level=0, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=908, name=Kolodion, level=0, option=[null, Attack, null, null, null], anims=[130, 127]. +NPC id=909, name=Kolodion, level=0, option=[null, Attack, null, null, null], anims=[5318, 5317]. +NPC id=910, name=Kolodion, level=0, option=[null, Attack, null, null, null], anims=[842, 841]. +NPC id=911, name=Kolodion, level=112, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=912, name=Battle mage, level=54, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=913, name=Battle mage, level=54, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=914, name=Battle mage, level=54, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=915, name=Leela, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=916, name=Joe, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=917, name=Jail guard, level=26, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=918, name=Ned, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=919, name=Lady Keli, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=920, name=Prince Ali, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=921, name=Prince Ali, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=922, name=Aggie, level=0, option=[Talk-to, null, Make-dyes, null, null], anims=[808, -1]. +NPC id=923, name=Hassan, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=924, name=Osman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=925, name=Border Guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=926, name=Border Guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=927, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=928, name=Gujuo, level=0, option=[Talk-to, Hidden, null, null, null], anims=[813, -1]. +NPC id=929, name=Ungadulu, level=70, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=930, name=Ungadulu, level=169, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=931, name=Jungle savage, level=90, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=932, name=Fionella, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=933, name=Siegfried Erkle, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=934, name=Nezikchened, level=187, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=935, name=Viyeldi, level=79, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=936, name=San Tojalon, level=106, option=[Talk-to, Attack, null, null, null], anims=[5483, 5481]. +NPC id=937, name=Irvig Senay, level=100, option=[Talk-to, Attack, null, null, null], anims=[5483, 5481]. +NPC id=938, name=Ranalph Devere, level=92, option=[Talk-to, Attack, null, null, null], anims=[5483, 5481]. +NPC id=939, name=Boulder, level=0, option=[Push, null, null, null, null], anims=[-1, 6]. +NPC id=940, name=Echned Zekin, level=187, option=[Talk-to, null, null, null, null], anims=[5538, 5539]. +NPC id=941, name=Green dragon, level=79, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=942, name=Master Chef, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=943, name=Survival Expert, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=944, name=Combat Instructor, level=146, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=945, name=RuneScape Guide, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=946, name=Magic Instructor, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=947, name=Financial Advisor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=948, name=Mining Instructor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=949, name=Quest Guide, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=950, name=Giant rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=951, name=Chicken, level=3, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=952, name=Fishing spot, level=0, option=[Net, null, hidden, null, null], anims=[447, 448]. +NPC id=953, name=Banker, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=954, name=Brother Brace, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=955, name=Cow, level=2, option=[null, Attack, null, null, null], anims=[5852, 5848]. +NPC id=956, name=Drunken Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[900, 104]. +NPC id=957, name=Mubariz, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=958, name=Fadli, level=0, option=[Talk-to, null, Bank, Collect, Buy], anims=[808, -1]. +NPC id=959, name=A'abla, level=0, option=[Talk-to, null, Heal, null, null], anims=[808, -1]. +NPC id=960, name=Sabreen, level=0, option=[Talk-to, null, Heal, null, null], anims=[808, -1]. +NPC id=961, name=Surgeon General Tafani, level=0, option=[Talk-to, null, Heal, null, null], anims=[808, -1]. +NPC id=962, name=Jaraah, level=0, option=[Talk-to, null, Heal, null, null], anims=[808, -1]. +NPC id=963, name=Zahwa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=964, name=Ima, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=965, name=Sabeil, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=966, name=Jadid, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=967, name=Dalal, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=968, name=Afrah, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=969, name=Jeed, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=970, name=Diango, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=971, name=Chadwell, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=972, name=Koftik, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=973, name=Koftik, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=974, name=Koftik, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=975, name=Koftik, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=976, name=Koftik, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=977, name=Blessed spider, level=39, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=978, name=Blessed giant rat, level=9, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=979, name=Slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=980, name=Slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=981, name=Slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=982, name=Slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=983, name=Slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=984, name=Slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=985, name=Slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=986, name=Boulder, level=0, option=[Push, null, null, null, null], anims=[-1, 6]. +NPC id=987, name=Unicorn, level=15, option=[null, null, null, null, null], anims=[291, 288]. +NPC id=988, name=Sir Jerro, level=62, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=989, name=Sir Carl, level=62, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=990, name=Sir Harry, level=62, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=991, name=Half-soulless, level=1, option=[null, null, null, null, null], anims=[800, 800]. +NPC id=992, name=Kardia, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=993, name=Witch's cat, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[9158, 9157]. +NPC id=994, name=Niloof, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=995, name=Klank, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=996, name=Kamen, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=997, name=Kalrag, level=89, option=[null, Attack, null, null, null], anims=[5318, 5317]. +NPC id=998, name=Othainian, level=91, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=999, name=Doomion, level=91, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=1000, name=Holthion, level=91, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=1001, name=Dark mage, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1002, name=Disciple of Iban, level=13, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1003, name=Lord Iban, level=0, option=[null, null, null, null, null], anims=[346, -1]. +NPC id=1004, name=Spider, level=1, option=[null, Attack, null, null, null], anims=[6247, 6248]. +NPC id=1005, name=Giant bat, level=0, option=[null, null, null, null, null], anims=[4914, 4913]. +NPC id=1006, name=Sea slug, level=0, option=[Take, null, null, null, null], anims=[932, 933]. +NPC id=1007, name=Zamorak wizard, level=65, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1008, name=Hamid, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1009, name=Poison spider, level=31, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=1010, name=Rantz, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=1011, name=Fycie, level=0, option=[Talk, null, null, null, null], anims=[357, 358]. +NPC id=1012, name=Bugs, level=0, option=[Talk, null, null, null, null], anims=[357, 358]. +NPC id=1013, name=Swamp toad, level=0, option=[null, null, null, null, null], anims=[1018, 1021]. +NPC id=1014, name=Bloated Toad, level=0, option=[null, null, null, null, null], anims=[1020, 1020]. +NPC id=1015, name=Iron pickaxe, level=0, option=[Take, null, null, null, null], anims=[1445, 181]. +NPC id=1016, name=Chompy bird, level=0, option=[null, null, null, Pluck, null], anims=[6768, 6768]. +NPC id=1017, name=Chicken, level=1, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=1018, name=Rooster, level=3, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=1019, name=Fire elemental, level=35, option=[null, Attack, null, null, null], anims=[1027, 1028]. +NPC id=1020, name=Earth elemental, level=35, option=[null, Attack, null, null, null], anims=[4866, 4867]. +NPC id=1021, name=Air elemental, level=34, option=[null, Attack, null, null, null], anims=[1039, 1039]. +NPC id=1022, name=Water elemental, level=34, option=[null, Attack, null, null, null], anims=[1045, 1047]. +NPC id=1023, name=Vampire, level=72, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1024, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1025, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1026, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1027, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1028, name=Baby impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=1029, name=Young impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=1030, name=Gourmet impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=1031, name=Earth impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=1032, name=Essence impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=1033, name=Eclectic impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=1034, name=Nature impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=1035, name=Magpie impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=1036, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=1037, name=Prissy Scilla, level=0, option=[Talk-to, null, Pay, null, null], anims=[195, 189]. +NPC id=1038, name=Rufus, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1039, name=Barker, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1040, name=Fidelio, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1041, name=Sbott, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1042, name=Roavar, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1043, name=Will o' the wisp, level=0, option=[null, null, null, null, null], anims=[1071, 1071]. +NPC id=1044, name=Monk of Zamorak, level=22, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1045, name=Monk of Zamorak, level=17, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1046, name=Monk of Zamorak, level=30, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC (wrapper) id=1047, child npcs=[7707, -1]. +NPC id=1048, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1049, name=Drezel, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1050, name=Filliman Tarlock, level=0, option=[Talk-to, null, null, null, null], anims=[842, 841]. +NPC id=1051, name=Nature Spirit, level=0, option=[Talk-to, null, null, null, null], anims=[842, 841]. +NPC id=1052, name=Ghast, level=0, option=[null, null, null, null, null], anims=[1092, 1091]. +NPC id=1053, name=Ghast, level=30, option=[null, Attack, null, null, null], anims=[1086, 1085]. +NPC id=1054, name=Ulizius, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1055, name=Pirate Jackie the Fruit, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1056, name=Mime, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1057, name=Strange watcher, level=0, option=[null, null, null, null, null], anims=[1137, -1]. +NPC id=1058, name=Strange watcher, level=0, option=[null, null, null, null, null], anims=[1137, -1]. +NPC id=1059, name=Strange watcher, level=0, option=[null, null, null, null, null], anims=[1137, -1]. +NPC id=1060, name=Denulth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1061, name=Sergeant, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1062, name=Sergeant, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1063, name=Soldier, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1064, name=Soldier, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1065, name=Soldier, level=48, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1066, name=Soldier, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=1067, name=Soldier, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=1068, name=Soldier, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=1069, name=Soldier, level=0, option=[Talk-to, null, null, null, null], anims=[1147, -1]. +NPC id=1070, name=Saba, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1071, name=Tenzing, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1072, name=Eadburg, level=4, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1073, name=Archer, level=42, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1074, name=Archer, level=42, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1075, name=Archer, level=42, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1076, name=Guard, level=37, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1077, name=Guard, level=37, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1078, name=Harold, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1079, name=Tostig, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1080, name=Eohric, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1081, name=Servant, level=5, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1082, name=Dunstan, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1083, name=Wistan, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1084, name=Breoca, level=5, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1085, name=Ocga, level=5, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1086, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[813, -1]. +NPC id=1087, name=Penda, level=5, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1088, name=Hygd, level=4, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1089, name=Ceolburg, level=4, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1090, name=Hild, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1091, name=Bob, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=1092, name=White Knight, level=36, option=[Talk-to, Attack, null, null, null], anims=[7047, -1]. +NPC id=1093, name=Billy, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=1094, name=Mountain goat, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=1095, name=Rock, level=111, option=[null, Attack, null, null, null], anims=[927, 1141]. +NPC id=1096, name=Stick, level=104, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1097, name=Pee Hat, level=91, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1098, name=Kraka, level=91, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1099, name=Dung, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1100, name=Ash, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1101, name=Thrower Troll, level=67, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1102, name=Thrower Troll, level=67, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1103, name=Thrower Troll, level=67, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1104, name=Thrower Troll, level=67, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1105, name=Thrower Troll, level=67, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1106, name=Mountain troll, level=69, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1107, name=Mountain troll, level=69, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1108, name=Mountain troll, level=69, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1109, name=Mountain troll, level=69, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1110, name=Mountain troll, level=69, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1111, name=Mountain troll, level=69, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1112, name=Mountain troll, level=69, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1113, name=Eadgar, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1114, name=Godric, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1115, name=Troll general, level=113, option=[null, Attack, null, null, null], anims=[927, 1141]. +NPC id=1116, name=Troll general, level=113, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1117, name=Troll general, level=113, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1118, name=Troll spectator, level=71, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1119, name=Troll spectator, level=71, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1120, name=Troll spectator, level=71, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1121, name=Troll spectator, level=71, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1122, name=Troll spectator, level=71, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1123, name=Troll spectator, level=71, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1124, name=Troll spectator, level=71, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1125, name=Dad, level=101, option=[Talk-to, Attack, null, null, null], anims=[925, 1140]. +NPC id=1126, name=Twig, level=71, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1127, name=Berry, level=71, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1128, name=Twig, level=71, option=[null, Attack, Pickpocket, null, null], anims=[1159, 283]. +NPC id=1129, name=Berry, level=71, option=[null, Attack, Pickpocket, null, null], anims=[1159, 283]. +NPC id=1130, name=Thrower troll, level=68, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1131, name=Thrower troll, level=68, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1132, name=Thrower troll, level=68, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1133, name=Thrower troll, level=68, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1134, name=Thrower troll, level=68, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1135, name=Cook, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1136, name=Cook, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1137, name=Cook, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1138, name=Mountain troll, level=71, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1139, name=Mushroom, level=0, option=[null, null, null, null, null], anims=[1159, 283]. +NPC id=1140, name=Mountain goat, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=1141, name=Mountain goat, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=1142, name=Guard, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1143, name=Guard, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1144, name=Guard, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1145, name=Guard, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1146, name=Guard, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1147, name=Guard, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1148, name=Guard, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1149, name=Guard, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1150, name=Guard, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1151, name=Burntmeat, level=0, option=[Talk-to, null, null, null, null], anims=[286, 283]. +NPC id=1152, name=Weird Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1153, name=Kalphite Worker, level=28, option=[null, Attack, null, null, null], anims=[6218, 6220]. +NPC id=1154, name=Kalphite Soldier, level=85, option=[null, Attack, null, null, null], anims=[6218, 6220]. +NPC id=1155, name=Kalphite Guardian, level=141, option=[null, Attack, null, null, null], anims=[6219, 6222]. +NPC id=1156, name=Kalphite Worker, level=28, option=[null, Attack, null, null, null], anims=[6218, 6220]. +NPC id=1157, name=Kalphite Guardian, level=141, option=[null, Attack, null, null, null], anims=[6219, 6222]. +NPC id=1158, name=Kalphite Queen, level=333, option=[null, Attack, null, null, null], anims=[6239, 6238]. +NPC id=1159, name=Kalphite Queen, level=333, option=[null, null, null, null, null], anims=[1183, 1189]. +NPC id=1160, name=Kalphite Queen, level=333, option=[null, Attack, null, null, null], anims=[6236, 6236]. +NPC id=1161, name=Kalphite Larva, level=0, option=[null, null, null, null, null], anims=[6218, 6221]. +NPC id=1162, name=Timfraku, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1163, name=Tiadeche, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1164, name=Tiadeche, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1165, name=Tinsay, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1166, name=Tinsay, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1167, name=Tamayu, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1168, name=Tamayu, level=0, option=[Talk-to, null, Trade, null, null], anims=[813, -1]. +NPC id=1169, name=Tamayu, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=1170, name=Tamayu, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=1171, name=Lubufu, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1172, name=The Shaikahan, level=83, option=[null, Attack, null, null, null], anims=[1198, 1197]. +NPC id=1173, name=The Shaikahan, level=83, option=[null, null, null, null, null], anims=[1198, 1197]. +NPC id=1174, name=Fishing spot, level=0, option=[Net, null, null, hidden, null], anims=[447, 448]. +NPC id=1175, name=Fishing spot, level=0, option=[Net, null, null, hidden, null], anims=[447, 448]. +NPC id=1176, name=Fishing spot, level=0, option=[Fish, null, null, null, null], anims=[447, 448]. +NPC id=1177, name=Fishing spot, level=0, option=[Fish, null, null, null, null], anims=[447, 448]. +NPC id=1178, name=Fishing spot, level=0, option=[Fish, null, null, null, null], anims=[447, 448]. +NPC id=1179, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=1180, name=Cormorant, level=0, option=[null, null, null, null, null], anims=[6772, 6774]. +NPC id=1181, name=Pelican, level=0, option=[null, null, null, null, null], anims=[6772, 6774]. +NPC id=1182, name=Lord Iorwerth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1183, name=Elf warrior, level=90, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1184, name=Elf warrior, level=108, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1185, name=Elven city guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1186, name=Idris, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1187, name=Essyllt, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1188, name=Morvran, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1189, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=1190, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=1191, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=1192, name=Rabbit, level=2, option=[null, Attack, null, null, null], anims=[6089, 6088]. +NPC id=1193, name=Rabbit, level=2, option=[null, Attack, null, null, null], anims=[6089, 6088]. +NPC id=1194, name=Rabbit, level=2, option=[null, Attack, null, null, null], anims=[6089, 6088]. +NPC id=1195, name=Grizzly bear, level=42, option=[null, Attack, null, null, null], anims=[4919, 4923]. +NPC id=1196, name=Grizzly bear cub, level=33, option=[null, Attack, null, null, null], anims=[4920, 4924]. +NPC id=1197, name=Grizzly bear cub, level=36, option=[null, Attack, null, null, null], anims=[4920, 4924]. +NPC id=1198, name=Dire Wolf, level=88, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1199, name=Elf Tracker, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1200, name=Tyras guard, level=110, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1201, name=Elf warrior, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1202, name=Arianwyn, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1203, name=Tyras guard, level=110, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=1204, name=Tyras guard, level=110, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=1205, name=null, level=1, option=[null, null, null, null, null], anims=[8705, 2769]. +NPC id=1206, name=Tyras guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1207, name=null, level=1, option=[null, null, null, null, null], anims=[8707, 2769]. +NPC id=1208, name=Quartermaster, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1209, name=Koftik, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1210, name=Kings messenger, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1211, name=Will o' the wisp, level=0, option=[null, null, null, null, null], anims=[1071, 1071]. +NPC id=1212, name=Will o' the wisp, level=0, option=[null, null, null, null, null], anims=[1071, 1071]. +NPC id=1213, name=Tegid, level=0, option=[Talk-to, null, null, null, null], anims=[8501, -1]. +NPC id=1214, name=Thistle, level=0, option=[Pick, null, null, null, null], anims=[-1, -1]. +NPC id=1215, name=Parrots, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1216, name=Parroty Pete, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1217, name=Gardener, level=4, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1218, name=Ghoul, level=42, option=[null, Attack, null, null, null], anims=[1275, -1]. +NPC id=1219, name=Leech, level=52, option=[null, Attack, null, null, null], anims=[1270, 1269]. +NPC id=1220, name=Vampire, level=72, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1221, name=Spider, level=0, option=[null, null, null, null, null], anims=[6247, 6248]. +NPC id=1222, name=Mist, level=1, option=[null, null, null, null, null], anims=[1261, 1261]. +NPC id=1223, name=Vampire, level=61, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1224, name=Vampyric hound, level=1, option=[null, null, null, null, null], anims=[6580, 6556]. +NPC id=1225, name=Vampire, level=25, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1226, name=Tree, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1227, name=Myre Blamish Snail, level=9, option=[null, Attack, null, null, null], anims=[1276, 1274]. +NPC id=1228, name=Blood Blamish Snail, level=20, option=[null, Attack, null, null, null], anims=[1276, 1274]. +NPC id=1229, name=Ochre Blamish Snail, level=10, option=[null, Attack, null, null, null], anims=[1276, 1274]. +NPC id=1230, name=Bruise Blamish Snail, level=20, option=[null, Attack, null, null, null], anims=[1276, 1274]. +NPC id=1231, name=Bark Blamish Snail, level=15, option=[null, Attack, null, null, null], anims=[1276, 1274]. +NPC id=1232, name=Myre Blamish Snail, level=10, option=[null, Attack, null, null, null], anims=[1276, 1274]. +NPC id=1233, name=Blood Blamish Snail, level=20, option=[null, Attack, null, null, null], anims=[1276, 1274]. +NPC id=1234, name=Ochre Blamish Snail, level=15, option=[null, Attack, null, null, null], anims=[1276, 1274]. +NPC id=1235, name=Bruise Blamish Snail, level=20, option=[null, Attack, null, null, null], anims=[1276, 1274]. +NPC id=1236, name=Fishing spot, level=0, option=[Bait, null, hidden, null, hidden], anims=[447, 448]. +NPC id=1237, name=Fishing spot, level=0, option=[Bait, null, hidden, null, hidden], anims=[447, 448]. +NPC id=1238, name=Fishing spot, level=0, option=[Bait, null, hidden, null, hidden], anims=[447, 448]. +NPC id=1239, name=Bedabin Nomad Fighter, level=56, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1240, name=Loar Shadow, level=40, option=[null, Attack, null, null, null], anims=[1290, 1289]. +NPC id=1241, name=Loar Shade, level=40, option=[null, Attack, null, null, null], anims=[1282, 1281]. +NPC id=1242, name=Shade Spirit, level=0, option=[null, null, null, null, null], anims=[1308, 1308]. +NPC id=1243, name=Phrin Shadow, level=60, option=[null, Attack, null, null, null], anims=[1290, 1289]. +NPC id=1244, name=Phrin Shade, level=60, option=[null, Attack, null, null, null], anims=[1282, 1281]. +NPC id=1245, name=Riyl Shadow, level=80, option=[null, Attack, null, null, null], anims=[1290, 1289]. +NPC id=1246, name=Riyl Shade, level=80, option=[null, Attack, null, null, null], anims=[1282, 1281]. +NPC id=1247, name=Asyn Shadow, level=100, option=[null, Attack, null, null, null], anims=[1290, 1289]. +NPC id=1248, name=Asyn Shade, level=100, option=[null, Attack, null, null, null], anims=[1282, 1281]. +NPC id=1249, name=Fiyr Shadow, level=120, option=[null, Attack, null, null, null], anims=[1290, 1289]. +NPC id=1250, name=Fiyr Shade, level=120, option=[null, Attack, null, null, null], anims=[1282, 1281]. +NPC id=1251, name=Afflicted(Ulsquire), level=0, option=[Talk-to, null, null, null, null], anims=[808, 1306]. +NPC id=1252, name=Ulsquire Shauncy, level=0, option=[Talk-to, null, null, null, null], anims=[808, 819]. +NPC id=1253, name=Afflicted(Razmire), level=0, option=[Talk-to, null, null, null, null], anims=[808, 1306]. +NPC id=1254, name=Razmire Keelgan, level=0, option=[Talk-to, null, Trade-General-Store, Trade-Builders-Store, null], anims=[808, 819]. +NPC id=1255, name=Mort'ton Local, level=0, option=[Talk-to, null, null, null, null], anims=[808, 819]. +NPC id=1256, name=Mort'ton Local, level=0, option=[Talk-to, null, null, null, null], anims=[808, 819]. +NPC id=1257, name=Afflicted, level=37, option=[Talk-to, Attack, null, null, null], anims=[808, 1306]. +NPC id=1258, name=Afflicted, level=34, option=[Talk-to, Attack, null, null, null], anims=[808, 1306]. +NPC id=1259, name=Mort'ton local, level=0, option=[Talk-to, null, null, null, null], anims=[808, 819]. +NPC id=1260, name=Mort'ton local, level=0, option=[Talk-to, null, null, null, null], anims=[808, 819]. +NPC id=1261, name=Afflicted, level=32, option=[Talk-to, Attack, null, null, null], anims=[808, 1306]. +NPC id=1262, name=Afflicted, level=30, option=[Talk-to, Attack, null, null, null], anims=[808, 1306]. +NPC id=1263, name=Wizard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1264, name=Saradomin wizard, level=108, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1265, name=Rock Crab, level=13, option=[null, Attack, null, null, null], anims=[1310, 1311]. +NPC id=1266, name=Rocks, level=0, option=[null, null, null, null, null], anims=[1315, 1311]. +NPC id=1267, name=Rock Crab, level=13, option=[null, Attack, null, null, null], anims=[1310, 1311]. +NPC id=1268, name=Rocks, level=0, option=[null, null, null, null, null], anims=[1315, 1311]. +NPC id=1269, name=Olaf the Bard, level=0, option=[Talk-to, null, null, null, null], anims=[1318, -1]. +NPC id=1270, name=Lalli, level=0, option=[Talk-to, null, null, null, null], anims=[286, 283]. +NPC id=1271, name=Golden sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=1272, name=Golden sheep, level=0, option=[null, null, null, null, null], anims=[5345, 5344]. +NPC id=1273, name=Fossegrimen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1274, name=Ospak, level=0, option=[Talk-to, null, null, null, null], anims=[1137, -1]. +NPC id=1275, name=Styrmir, level=0, option=[Talk-to, null, null, null, null], anims=[1137, -1]. +NPC id=1276, name=Torbrund, level=0, option=[Talk-to, null, null, null, null], anims=[1137, -1]. +NPC id=1277, name=Fridgeir, level=0, option=[Talk-to, null, null, null, null], anims=[1137, -1]. +NPC id=1278, name=Longhall Bouncer, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1279, name=The Draugen, level=69, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1280, name=Butterfly, level=0, option=[null, null, null, null, null], anims=[362, 362]. +NPC id=1281, name=Sigli the Huntsman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1282, name=Sigmund The Merchant, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1283, name=Swensen the Navigator, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1284, name=Bjorn, level=0, option=[Talk-to, null, null, null, null], anims=[1322, -1]. +NPC id=1285, name=Eldgrim, level=0, option=[Talk-to, null, null, null, null], anims=[1322, -1]. +NPC id=1286, name=Manni the Reveller, level=0, option=[Talk-to, null, null, null, null], anims=[1322, -1]. +NPC id=1287, name=Council workman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1288, name=Peer the Seer, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1289, name=Thorvald the Warrior, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1290, name=Koschei the deathless, level=0, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1291, name=Koschei the deathless, level=0, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1292, name=Koschei the deathless, level=0, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1293, name=Koschei the deathless, level=0, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1294, name=Brundt the Chieftain, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1295, name=Askeladden, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=1296, name=Guard, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=1297, name=Guard, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=1298, name=Town Guard, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=1299, name=Town Guard, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=1300, name=Thora the Barkeep, level=0, option=[Talk to, null, Trade, null, null], anims=[808, -1]. +NPC id=1301, name=Yrsa, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1302, name=Fisherman, level=0, option=[Talk-to, null, null, null, null], anims=[623, -1]. +NPC id=1303, name=Skulgrimen, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1304, name=Sailor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1305, name=Agnar, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=1306, name=Freidir, level=48, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=1307, name=Borrokar, level=48, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=1308, name=Lanzig, level=48, option=[Talk-to, Attack, Pickpocket, null, null], anims=[813, -1]. +NPC id=1309, name=Pontak, level=48, option=[Talk-to, null, Pickpocket, null, null], anims=[813, -1]. +NPC id=1310, name=Freygerd, level=48, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=1311, name=Lensa, level=48, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=1312, name=Jennella, level=48, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=1313, name=Sassilik, level=48, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=1314, name=Inga, level=48, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=1315, name=Fish monger, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1316, name=Fur trader, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1317, name=Market Guard, level=48, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1318, name=Warrior, level=48, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1319, name=Fox, level=0, option=[null, null, null, null, null], anims=[6561, 6560]. +NPC id=1320, name=Bunny, level=2, option=[null, Attack, null, null, null], anims=[1242, 1243]. +NPC id=1321, name=Bunny, level=2, option=[null, Attack, null, null, null], anims=[1242, 1243]. +NPC id=1322, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=1323, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=1324, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=1325, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=1326, name=Bear Cub, level=15, option=[null, Attack, null, null, null], anims=[4920, 4924]. +NPC id=1327, name=Bear Cub, level=15, option=[null, Attack, null, null, null], anims=[4920, 4924]. +NPC id=1328, name=Unicorn Foal, level=12, option=[null, Attack, null, null, null], anims=[6374, 6373]. +NPC id=1329, name=Black unicorn Foal, level=22, option=[null, Attack, null, null, null], anims=[6374, 6373]. +NPC id=1330, name=Wolf, level=64, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1331, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=1332, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=1333, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=1334, name=Jossik, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1335, name=Jossik, level=0, option=[Talk-to, null, null, null, null], anims=[1147, -1]. +NPC id=1336, name=Larrissa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1337, name=Larrissa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1338, name=Dagannoth, level=74, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1339, name=Dagannoth, level=74, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1340, name=Dagannoth, level=74, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1341, name=Dagannoth, level=92, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1342, name=Dagannoth, level=92, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1343, name=Dagannoth, level=92, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1344, name=Dagannoth, level=100, option=[null, null, null, null, null], anims=[1344, 1344]. +NPC id=1345, name=Dagannoth, level=100, option=[null, null, null, null, null], anims=[1345, 1345]. +NPC id=1346, name=Dagannoth, level=100, option=[null, null, null, null, null], anims=[1346, 1346]. +NPC id=1347, name=Dagannoth, level=100, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1348, name=Dagannoth mother, level=100, option=[null, null, null, null, null], anims=[1344, 1344]. +NPC id=1349, name=Dagannoth mother, level=100, option=[null, null, null, null, null], anims=[1345, 1345]. +NPC id=1350, name=Dagannoth mother, level=100, option=[null, null, null, null, null], anims=[1346, 1346]. +NPC id=1351, name=Dagannoth mother, level=100, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1352, name=Dagannoth mother, level=100, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1353, name=Dagannoth mother, level=100, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1354, name=Dagannoth mother, level=100, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1355, name=Dagannoth mother, level=100, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1356, name=Dagannoth mother, level=100, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=1357, name=Sam, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1358, name=Rachael, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1359, name=Queen Sigrid, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1360, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=1361, name=Arnor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1362, name=Haming, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1363, name=Moldof, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1364, name=Helga, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1365, name=Matilda, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1366, name=Ashild, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1367, name=Skraeling, level=2, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1368, name=Skraeling, level=2, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1369, name=Fishmonger, level=0, option=[Talk-to, null, Trade, null, null], anims=[813, -1]. +NPC id=1370, name=Greengrocer, level=0, option=[Talk-to, null, Trade, null, null], anims=[813, -1]. +NPC id=1371, name=Prince Brand, level=0, option=[Talk-to, null, null, null, null], anims=[1321, -1]. +NPC id=1372, name=Princess Astrid, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1373, name=King Vargas, level=0, option=[Talk-to, null, null, null, null], anims=[296, 293]. +NPC id=1374, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1375, name=Advisor Ghrim, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1376, name=Derrik, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1377, name=Farmer, level=0, option=[null, null, null, null, null], anims=[440, -1]. +NPC id=1378, name=Flower Girl, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1379, name=Ragnar, level=1, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1380, name=Einar, level=1, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1381, name=Alrik, level=1, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1382, name=Thorhild, level=1, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1383, name=Halla, level=1, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1384, name=Yrsa, level=1, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1385, name=Sailor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1386, name=Rannveig, level=2, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1387, name=Thora, level=2, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1388, name=Valgerd, level=2, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1389, name=Skraeling, level=2, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1390, name=Broddi, level=2, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1391, name=Skraeling, level=2, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1392, name=Ragnvald, level=2, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=1393, name=Fishmonger, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1394, name=Greengrocer, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1395, name=Lumberjack Leif, level=0, option=[Talk-to, null, null, null, null], anims=[1365, -1]. +NPC id=1396, name=Miner Magnus, level=0, option=[Talk-to, null, null, null, null], anims=[6935, -1]. +NPC id=1397, name=Fisherman Frodi, level=0, option=[Talk-to, null, null, null, null], anims=[7261, -1]. +NPC id=1398, name=Gardener Gunnhild, level=0, option=[Talk-to, null, null, null, null], anims=[2273, -1]. +NPC id=1399, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=1400, name=Gull, level=0, option=[null, Attack, null, null, null], anims=[6771, 6773]. +NPC id=1401, name=Chicken, level=1, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=1402, name=Chicken, level=1, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=1403, name=Rooster, level=2, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=1404, name=Rabbit, level=2, option=[null, Attack, null, null, null], anims=[6089, 6088]. +NPC id=1405, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=1406, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=1407, name=Daero, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1408, name=Waydar, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1409, name=Waydar, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1410, name=Waydar, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1411, name=Garkor, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1412, name=Garkor, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1413, name=Lumo, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1414, name=Lumo, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=1415, name=Bunkdo, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1416, name=Bunkdo, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=1417, name=Carado, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1418, name=Carado, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=1419, name=Lumdo, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1420, name=Karam, level=0, option=[Talk-to, null, null, null, null], anims=[1412, 189]. +NPC id=1421, name=Karam, level=0, option=[null, null, null, null, null], anims=[1412, 189]. +NPC id=1422, name=Karam, level=0, option=[Talk-to, null, null, null, null], anims=[1412, 189]. +NPC id=1423, name=Bunkwicket, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1424, name=Waymottin, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1425, name=Zooknock, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1426, name=Zooknock, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1427, name=G.L.O. Caranock, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1428, name=G.L.O. Caranock, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1429, name=Dugopul, level=0, option=[Talk-to, null, null, null, null], anims=[1386, 1380]. +NPC id=1430, name=Salenab, level=0, option=[Talk-to, null, null, null, null], anims=[222, 219]. +NPC id=1431, name=Trefaji, level=0, option=[Talk-to, null, null, null, null], anims=[1401, 1399]. +NPC id=1432, name=Aberab, level=0, option=[Talk-to, null, null, null, null], anims=[1401, 1399]. +NPC id=1433, name=Solihib, level=0, option=[Talk-to, null, Trade, null, null], anims=[1386, 1380]. +NPC id=1434, name=Daga, level=0, option=[Talk-to, null, Trade, null, null], anims=[1386, 1380]. +NPC id=1435, name=Tutab, level=0, option=[Talk-to, null, Trade, null, null], anims=[1386, 1380]. +NPC id=1436, name=Ifaba, level=0, option=[Talk-to, null, Trade, null, null], anims=[1386, 1380]. +NPC id=1437, name=Hamab, level=0, option=[Talk-to, null, Trade, null, null], anims=[1386, 1380]. +NPC id=1438, name=Hafuba, level=0, option=[Talk-to, null, null, null, null], anims=[1401, 1399]. +NPC id=1439, name=Denadu, level=0, option=[Talk-to, null, null, null, null], anims=[1387, 1380]. +NPC id=1440, name=Lofu, level=0, option=[Talk-to, null, null, null, null], anims=[1387, 1380]. +NPC id=1441, name=Kruk, level=149, option=[Talk-to, null, null, null, null], anims=[1386, 1385]. +NPC id=1442, name=Duke, level=149, option=[null, Attack, null, null, null], anims=[1386, 1385]. +NPC id=1443, name=Oipuis, level=149, option=[null, Attack, null, null, null], anims=[1386, 1385]. +NPC id=1444, name=Uyoro, level=149, option=[null, Attack, null, null, null], anims=[1386, 1385]. +NPC id=1445, name=Ouhai, level=149, option=[null, Attack, null, null, null], anims=[1386, 1385]. +NPC id=1446, name=Uodai, level=149, option=[null, Attack, null, null, null], anims=[1386, 1385]. +NPC id=1447, name=Padulah, level=149, option=[Talk-to, Attack, null, null, null], anims=[1386, 1380]. +NPC id=1448, name=Awowogei, level=0, option=[Talk-to, null, null, null, null], anims=[1386, 1380]. +NPC id=1449, name=Uwogo, level=0, option=[Talk-to, null, null, null, null], anims=[1386, 1380]. +NPC id=1450, name=Muruwoi, level=0, option=[Talk-to, null, null, null, null], anims=[1386, 1380]. +NPC id=1451, name=Sleeping Monkey, level=0, option=[Talk-to, null, null, null, null], anims=[1388, 1380]. +NPC id=1452, name=Monkey Child, level=0, option=[Talk-to, null, null, null, null], anims=[1386, 1380]. +NPC id=1453, name=The Monkey's Uncle, level=0, option=[Talk-to, null, null, null, null], anims=[1386, 1380]. +NPC id=1454, name=The Monkey's Aunt, level=0, option=[Talk-to, null, null, null, null], anims=[1386, 1380]. +NPC id=1455, name=Monkey Guard, level=149, option=[null, Attack, null, null, null], anims=[1386, 1380]. +NPC id=1456, name=Monkey Archer, level=86, option=[null, Attack, null, null, null], anims=[1386, 1380]. +NPC id=1457, name=Monkey Archer, level=86, option=[null, Attack, null, null, null], anims=[1386, 1380]. +NPC id=1458, name=Monkey Archer, level=86, option=[null, Attack, null, null, null], anims=[1386, 1380]. +NPC id=1459, name=Monkey Guard, level=167, option=[null, Attack, null, null, null], anims=[1401, 1399]. +NPC id=1460, name=Monkey Guard, level=167, option=[null, Attack, null, null, null], anims=[1401, 1399]. +NPC id=1461, name=Elder Guard, level=0, option=[Talk-to, null, null, null, null], anims=[1401, 1399]. +NPC id=1462, name=Elder Guard, level=0, option=[Talk-to, null, null, null, null], anims=[1401, 1399]. +NPC id=1463, name=Monkey, level=3, option=[Talk-to, null, null, null, null], anims=[222, 219]. +NPC id=1464, name=Monkey, level=3, option=[Talk-to, null, null, null, null], anims=[222, 219]. +NPC id=1465, name=Monkey Zombie, level=98, option=[null, Attack, null, null, null], anims=[1386, 1382]. +NPC id=1466, name=Monkey Zombie, level=129, option=[null, Attack, null, null, null], anims=[1386, 1382]. +NPC id=1467, name=Monkey Zombie, level=82, option=[null, Attack, null, null, null], anims=[1386, 1382]. +NPC id=1468, name=Bonzara, level=0, option=[Talk-to, null, null, null, null], anims=[1387, 1380]. +NPC id=1469, name=Monkey minder, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1470, name=Foreman, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1471, name=Skeleton, level=142, option=[null, Attack, null, null, null], anims=[5517, 5518]. +NPC id=1472, name=Jungle demon, level=195, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=1473, name=Spider, level=1, option=[null, Attack, null, null, null], anims=[6247, 6248]. +NPC id=1474, name=Spider, level=0, option=[null, null, null, null, null], anims=[6247, 6248]. +NPC id=1475, name=Bird, level=11, option=[null, Attack, null, null, null], anims=[6772, 6774]. +NPC id=1476, name=Bird, level=5, option=[null, Attack, null, null, null], anims=[6771, 6773]. +NPC id=1477, name=Scorpion, level=38, option=[null, Attack, null, null, null], anims=[6252, 6257]. +NPC id=1478, name=Jungle spider, level=37, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=1479, name=Snake, level=24, option=[null, Attack, null, null, null], anims=[-1, 274]. +NPC id=1480, name=Small ninja monkey, level=1, option=[null, null, null, null, null], anims=[1386, 1380]. +NPC id=1481, name=Medium ninja monkey, level=1, option=[null, null, null, null, null], anims=[1386, 1380]. +NPC id=1482, name=Gorilla, level=1, option=[null, null, null, null, null], anims=[1401, 1399]. +NPC id=1483, name=Bearded gorilla, level=1, option=[null, null, null, null, null], anims=[1401, 1399]. +NPC id=1484, name=Ancient monkey, level=1, option=[null, null, null, null, null], anims=[1401, 1399]. +NPC id=1485, name=Small zombie monkey, level=1, option=[null, null, null, null, null], anims=[1386, 1382]. +NPC id=1486, name=Large zombie monkey, level=1, option=[null, null, null, null, null], anims=[1386, 1382]. +NPC id=1487, name=Monkey, level=1, option=[null, null, null, null, null], anims=[222, 219]. +NPC id=1488, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1489, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1490, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1491, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1492, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1493, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1494, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1495, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1496, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1497, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1498, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1499, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1500, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1501, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1502, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1503, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1504, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1505, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1506, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1507, name=Dummy, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1508, name=Forester, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1509, name=Woman-at-arms, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1510, name=Apprentice, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1511, name=Ranger, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1512, name=Adventurer, level=0, option=[Talk-to, null, null, null, null], anims=[7047, -1]. +NPC id=1513, name=Mage, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=1514, name=Hiylik Myna, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1515, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1516, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1517, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=1518, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1519, name=null, level=1, option=[null, null, null, null, null], anims=[7047, -1]. +NPC id=1520, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=1521, name=Nail beast, level=69, option=[null, Attack, null, null, null], anims=[5986, 5987]. +NPC id=1522, name=Nail beast, level=98, option=[null, Attack, null, null, null], anims=[5986, 5987]. +NPC id=1523, name=Nail beast, level=141, option=[null, Attack, null, null, null], anims=[5986, 5987]. +NPC id=1524, name=Undead Lumberjack, level=30, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=1525, name=Undead Lumberjack, level=30, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=1526, name=Lanthus, level=0, option=[Talk-to, null, null, Trade-with, null], anims=[808, -1]. +NPC id=1527, name=Mine cart, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1528, name=Zealot, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=1529, name=Sheep, level=1, option=[null, null, null, null, null], anims=[5335, 5334]. +NPC id=1530, name=Rabbit, level=1, option=[null, null, null, null, null], anims=[6089, 6088]. +NPC id=1531, name=Imp, level=1, option=[null, null, null, null, null], anims=[171, 168]. +NPC id=1532, name=Barricade, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=1533, name=Barricade, level=0, option=[null, Attack, null, null, null], anims=[475, -1]. +NPC id=1534, name=Barricade, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=1535, name=Barricade, level=0, option=[null, Attack, null, null, null], anims=[475, -1]. +NPC id=1536, name=Possessed pickaxe, level=50, option=[null, Attack, null, null, null], anims=[187, 181]. +NPC id=1537, name=Haze, level=0, option=[null, null, null, null, null], anims=[5543, 5543]. +NPC id=1538, name=Corpse, level=0, option=[null, null, null, null, null], anims=[1442, 5479]. +NPC id=1539, name=Skeletal miner, level=42, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=1540, name=Treus Dayth, level=95, option=[null, Attack, null, null, null], anims=[5538, 5539]. +NPC id=1541, name=Ghost, level=95, option=[null, null, null, null, null], anims=[5543, 5543]. +NPC id=1542, name=Loading crane, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1543, name=Innocent-looking key, level=0, option=[Take, null, null, null, null], anims=[1450, 1451]. +NPC id=1544, name=Mine cart, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1545, name=Mine cart, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1546, name=Mine cart, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1547, name=Mine cart, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1548, name=Mine cart, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1549, name=Ghost, level=29, option=[null, Attack, null, null, null], anims=[5538, 5539]. +NPC id=1550, name=Chompy bird, level=6, option=[null, null, null, null, Attack], anims=[6764, 6765]. +NPC id=1551, name=Mischievous ghost, level=0, option=[null, null, null, null, null], anims=[5530, 5531]. +NPC id=1552, name=Santa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1553, name=Ug, level=0, option=[Talk-to, null, null, null, null], anims=[1474, 283]. +NPC id=1554, name=Aga, level=0, option=[Talk-to, null, null, null, null], anims=[286, 283]. +NPC id=1555, name=Arrg, level=113, option=[Talk-to, null, null, null, null], anims=[286, 283]. +NPC id=1556, name=Arrg, level=113, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1557, name=Ug, level=1, option=[Talk-to, null, null, null, null], anims=[1480, 283]. +NPC id=1558, name=Ice wolf, level=96, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1559, name=Ice wolf, level=132, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1560, name=Ice Troll, level=124, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1561, name=Ice Troll, level=123, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1562, name=Ice Troll, level=120, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1563, name=Ice Troll, level=121, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1564, name=Ice Troll, level=120, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1565, name=Ice Troll, level=120, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1566, name=Ice Troll, level=121, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1567, name=Cyreg Paddlehorn, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=1568, name=Curpile Fyod, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1569, name=Veliaf Hurtz, level=0, option=[Talk-to, null, hidden, null, null], anims=[808, -1]. +NPC id=1570, name=Sani Piliu, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1571, name=Harold Evans, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1572, name=Radigad Ponfit, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1573, name=Polmafi Ferdygris, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1574, name=Ivan Strom, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1575, name=Skeleton Hellhound, level=97, option=[null, Attack, null, null, null], anims=[6580, 6577]. +NPC id=1576, name=Stranger, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=1577, name=Vanstrom Klause, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=1578, name=Mist, level=0, option=[null, null, null, null, null], anims=[1261, 1261]. +NPC id=1579, name=Vanstrom Klause, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1580, name=Vanstrom Klause, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1581, name=Vanstrom Klause, level=0, option=[Talk-to, null, null, null, null], anims=[1501, 1501]. +NPC id=1582, name=Fire giant, level=86, option=[null, Attack, null, null, null], anims=[4662, 4660]. +NPC id=1583, name=Fire giant, level=86, option=[null, Attack, null, null, null], anims=[4663, 4661]. +NPC id=1584, name=Fire giant, level=86, option=[null, Attack, null, null, null], anims=[4663, 4661]. +NPC id=1585, name=Fire giant, level=86, option=[null, Attack, null, null, null], anims=[4663, 4661]. +NPC id=1586, name=Fire giant, level=86, option=[null, Attack, null, null, null], anims=[4663, 4661]. +NPC id=1587, name=Moss giant, level=42, option=[null, Attack, null, null, null], anims=[4656, 4654]. +NPC id=1588, name=Moss giant, level=42, option=[null, Attack, null, null, null], anims=[4656, 4654]. +NPC id=1589, name=Baby red dragon, level=48, option=[null, Attack, null, null, null], anims=[27, 21]. +NPC id=1590, name=Bronze dragon, level=131, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=1591, name=Iron dragon, level=189, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=1592, name=Steel dragon, level=246, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=1593, name=Wild dog, level=63, option=[null, Attack, null, null, null], anims=[6561, 6560]. +NPC id=1594, name=Wild dog, level=63, option=[null, Attack, null, null, null], anims=[6561, 6560]. +NPC id=1595, name=Saniboch, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=1596, name=Mazchna, level=0, option=[Talk-to, null, null, Trade, null], anims=[808, -1]. +NPC id=1597, name=Vannaka, level=0, option=[Talk-to, null, null, Trade, null], anims=[2561, -1]. +NPC id=1598, name=Chaeldar, level=0, option=[Talk-to, null, null, Trade, null], anims=[112, 106]. +NPC id=1599, name=Duradel, level=0, option=[Talk-to, null, null, Trade, null], anims=[808, -1]. +NPC id=1600, name=Cave crawler, level=23, option=[null, Attack, null, null, null], anims=[226, 225]. +NPC id=1601, name=Cave crawler, level=23, option=[null, Attack, null, null, null], anims=[226, 225]. +NPC id=1602, name=Cave crawler, level=23, option=[null, Attack, null, null, null], anims=[226, 225]. +NPC id=1603, name=Cave crawler, level=23, option=[null, Attack, null, null, null], anims=[226, 225]. +NPC id=1604, name=Aberrant spectre, level=96, option=[null, Attack, null, null, null], anims=[1506, 1505]. +NPC id=1605, name=Aberrant spectre, level=96, option=[null, Attack, null, null, null], anims=[1506, 1505]. +NPC id=1606, name=Aberrant spectre, level=96, option=[null, Attack, null, null, null], anims=[1506, 1505]. +NPC id=1607, name=Aberrant spectre, level=96, option=[null, Attack, null, null, null], anims=[1506, 1505]. +NPC id=1608, name=Kurask, level=106, option=[null, Attack, null, null, null], anims=[1511, 1510]. +NPC id=1609, name=Kurask, level=106, option=[null, Attack, null, null, null], anims=[1511, 1510]. +NPC id=1610, name=Gargoyle, level=111, option=[null, Attack, null, null, null], anims=[1516, 1515]. +NPC id=1611, name=Gargoyle, level=111, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=1612, name=Banshee, level=23, option=[null, Attack, null, null, null], anims=[1522, 1521]. +NPC id=1613, name=Nechryael, level=115, option=[null, Attack, null, null, null], anims=[1527, 1526]. +NPC id=1614, name=Death spawn, level=46, option=[null, Attack, null, null, null], anims=[1539, 1539]. +NPC id=1615, name=Abyssal demon, level=124, option=[null, Attack, null, null, null], anims=[1536, 1534]. +NPC id=1616, name=Basilisk, level=61, option=[null, Attack, null, null, null], anims=[1545, 1544]. +NPC id=1617, name=Basilisk, level=61, option=[null, Attack, null, null, null], anims=[1545, 1544]. +NPC id=1618, name=Bloodveld, level=76, option=[null, Attack, null, null, null], anims=[1551, 1549]. +NPC id=1619, name=Bloodveld, level=76, option=[null, Attack, null, null, null], anims=[1551, 1549]. +NPC id=1620, name=Cockatrice, level=37, option=[null, Attack, null, null, null], anims=[1561, 1559]. +NPC id=1621, name=Cockatrice, level=37, option=[null, Attack, null, null, null], anims=[1561, 1559]. +NPC id=1622, name=Rockslug, level=29, option=[null, Attack, null, null, null], anims=[1566, 1564]. +NPC id=1623, name=Rockslug, level=29, option=[null, Attack, null, null, null], anims=[1566, 1564]. +NPC id=1624, name=Dust devil, level=93, option=[null, Attack, null, null, null], anims=[1556, 1554]. +NPC id=1625, name=Smokedevil, level=93, option=[null, Attack, null, null, null], anims=[1556, 1554]. +NPC id=1626, name=Turoth, level=86, option=[null, Attack, null, null, null], anims=[1594, 1593]. +NPC id=1627, name=Turoth, level=89, option=[null, Attack, null, null, null], anims=[1594, 1593]. +NPC id=1628, name=Turoth, level=87, option=[null, Attack, null, null, null], anims=[1594, 1593]. +NPC id=1629, name=Turoth, level=85, option=[null, Attack, null, null, null], anims=[1594, 1593]. +NPC id=1630, name=Turoth, level=83, option=[null, Attack, null, null, null], anims=[1594, 1593]. +NPC id=1631, name=Turoth, level=88, option=[null, Attack, null, null, null], anims=[1594, 1593]. +NPC id=1632, name=Turoth, level=88, option=[null, Attack, null, null, null], anims=[1594, 1593]. +NPC id=1633, name=Pyrefiend, level=43, option=[null, Attack, null, null, null], anims=[1578, 1579]. +NPC id=1634, name=Pyrefiend, level=43, option=[null, Attack, null, null, null], anims=[1578, 1579]. +NPC id=1635, name=Pyrefiend, level=43, option=[null, Attack, null, null, null], anims=[1578, 1579]. +NPC id=1636, name=Pyrefiend, level=43, option=[null, Attack, null, null, null], anims=[1578, 1579]. +NPC id=1637, name=Jelly, level=78, option=[null, Attack, null, null, null], anims=[1583, 1584]. +NPC id=1638, name=Jelly, level=78, option=[null, Attack, null, null, null], anims=[1583, 1584]. +NPC id=1639, name=Jelly, level=78, option=[null, Attack, null, null, null], anims=[1583, 1584]. +NPC id=1640, name=Jelly, level=78, option=[null, Attack, null, null, null], anims=[1583, 1584]. +NPC id=1641, name=Jelly, level=78, option=[null, Attack, null, null, null], anims=[1583, 1584]. +NPC id=1642, name=Jelly, level=78, option=[null, Attack, null, null, null], anims=[1583, 1584]. +NPC id=1643, name=Infernal Mage, level=66, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1644, name=Infernal Mage, level=66, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1645, name=Infernal Mage, level=66, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1646, name=Infernal Mage, level=66, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1647, name=Infernal Mage, level=66, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=1648, name=Crawling Hand, level=8, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1649, name=Crawling Hand, level=8, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1650, name=Crawling Hand, level=7, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1651, name=Crawling Hand, level=8, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1652, name=Crawling Hand, level=8, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1653, name=Crawling Hand, level=12, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1654, name=Crawling Hand, level=12, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1655, name=Crawling Hand, level=11, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1656, name=Crawling Hand, level=12, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1657, name=Crawling Hand, level=12, option=[null, Attack, null, null, null], anims=[1588, 1589]. +NPC id=1658, name=Robe Store owner, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1659, name=Skullball, level=0, option=[Tap, null, Kick, Shoot, Show-Goal], anims=[1607, 1608]. +NPC id=1660, name=Skullball Boss, level=0, option=[Talk-To, null, null, null, null], anims=[6539, 6541]. +NPC id=1661, name=Agility Boss, level=0, option=[Talk-To, null, null, null, null], anims=[6539, 6548]. +NPC id=1662, name=Skullball Trainer, level=0, option=[Talk-To, null, null, null, null], anims=[6539, 6541]. +NPC id=1663, name=Agility Trainer, level=0, option=[null, null, null, null, null], anims=[6539, 6541]. +NPC id=1664, name=Agility Trainer, level=0, option=[Give-Stick, null, null, null, null], anims=[6539, 6541]. +NPC id=1665, name=Werewolf, level=0, option=[Talk-To, null, null, null, null], anims=[6539, 6541]. +NPC id=1666, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=1667, child npcs=[1675, -1]. +NPC (wrapper) id=1668, child npcs=[1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, -1]. +NPC id=1669, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1670, name=Dr Fenkenstrain, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[-1, -1]. +NPC (wrapper) id=1671, child npcs=[1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, -1]. +NPC id=1672, name=null, level=1, option=[null, null, null, null, null], anims=[1623, 1622]. +NPC id=1673, name=Fenkenstrain's Monster, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=1674, name=Lord Rologarth, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=1675, name=Gardener Ghost, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1676, name=Experiment, level=51, option=[null, Attack, null, null, null], anims=[1625, 1624]. +NPC id=1677, name=Experiment, level=25, option=[null, Attack, null, null, null], anims=[1614, 1615]. +NPC id=1678, name=Experiment, level=25, option=[null, Attack, null, null, null], anims=[1609, 1610]. +NPC id=1679, name=Eluned, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1680, name=Islwyn, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1681, name=Moss giant, level=84, option=[null, Attack, null, null, null], anims=[4656, 4654]. +NPC id=1682, name=Golrie, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1683, name=Velorina, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1684, name=Necrovarus, level=0, option=[Talk-To, null, null, null, null], anims=[813, -1]. +NPC id=1685, name=Gravingas, level=0, option=[Talk-To, null, null, null, null], anims=[1421, -1]. +NPC id=1686, name=Ghost disciple, level=0, option=[Talk-To, null, null, null, null], anims=[813, -1]. +NPC id=1687, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1688, name=Ak-Haranu, level=0, option=[Talk-To, null, Trade, null, null], anims=[-1, -1]. +NPC id=1689, name=null, level=0, option=[null, null, null, null, null], anims=[1644, 1645]. +NPC id=1690, name=null, level=0, option=[null, null, null, null, null], anims=[1646, 1647]. +NPC id=1691, name=Undead cow, level=2, option=[null, Attack, null, null, null], anims=[5852, 5848]. +NPC id=1692, name=Undead chicken, level=1, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=1693, name=Giant lobster, level=32, option=[null, Attack, null, null, null], anims=[6263, 6264]. +NPC id=1694, name=Robin, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1695, name=Old crone, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1696, name=Old man, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1697, name=Ghost villager, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1698, name=Tortured soul, level=59, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1699, name=Ghost shopkeeper, level=0, option=[Talk-To, null, Trade, null, null], anims=[808, -1]. +NPC id=1700, name=Ghost innkeeper, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1701, name=Ghost farmer, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1702, name=Ghost banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=1703, name=Ghost sailor, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1704, name=Ghost captain, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1705, name=Ghost captain, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1706, name=Ghost guard, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=1707, name=Ghost (?), level=1, option=[null, null, null, null, null], anims=[1639, 1640]. +NPC id=1708, name=Ghost (?), level=1, option=[null, null, null, null, null], anims=[1639, 1640]. +NPC id=1709, name=Johanhus Ulsbrecht, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1710, name=H.A.M. Guard, level=12, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1711, name=H.A.M. Guard, level=18, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1712, name=H.A.M. Guard, level=22, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1713, name=H.A.M. Deacon, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1714, name=H.A.M. Member, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=1715, name=H.A.M. Member, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=1716, name=H.A.M. Member, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=1717, name=H.A.M. Member, level=0, option=[Talk-to, null, null, null, null], anims=[1673, -1]. +NPC id=1718, name=Jimmy the Chisel, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1719, name=Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1720, name=Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1721, name=Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1722, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1723, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1724, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5751, 5751]. +NPC id=1725, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1726, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1727, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1728, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1729, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1730, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1731, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1732, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1733, name=Dramen tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1734, name=Magic tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1735, name=Maple tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1736, name=Willow, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1737, name=Willow, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1738, name=Willow, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1739, name=Oak, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1740, name=Yew, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1741, name=Evergreen, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1742, name=Evergreen, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1743, name=Evergreen, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1744, name=Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1745, name=Dead tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5751, 5751]. +NPC id=1746, name=Achey Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1747, name=Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1748, name=Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=1749, name=Hollow tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5751, 5751]. +NPC id=1750, name=Hollow tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5751, 5751]. +NPC id=1751, name=Terrorbird, level=28, option=[null, Attack, null, null, null], anims=[1008, 1007]. +NPC id=1752, name=Mounted terrorbird gnome, level=31, option=[null, Attack, null, null, null], anims=[6793, 6796]. +NPC id=1753, name=Mounted terrorbird gnome, level=49, option=[null, Attack, null, null, null], anims=[6793, 6796]. +NPC id=1754, name=Crow, level=0, option=[null, null, null, null, null], anims=[6785, 6784]. +NPC id=1755, name=Crow, level=0, option=[null, null, null, null, null], anims=[6786, 6784]. +NPC id=1756, name=Crow, level=0, option=[null, null, null, null, null], anims=[6787, 6784]. +NPC id=1757, name=Farmer, level=7, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=1758, name=Farmer, level=7, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=1759, name=Farmer, level=0, option=[null, null, null, null, null], anims=[1728, -1]. +NPC id=1760, name=Farmer, level=0, option=[null, null, null, null, null], anims=[1728, -1]. +NPC id=1761, name=Farmer, level=0, option=[null, null, null, null, null], anims=[1728, -1]. +NPC id=1762, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=1763, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5335, 5334]. +NPC id=1764, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=1765, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5335, 5334]. +NPC id=1766, name=Cow calf, level=2, option=[null, Attack, null, null, null], anims=[5852, 5856]. +NPC id=1767, name=Cow, level=2, option=[null, Attack, null, null, null], anims=[5852, 5848]. +NPC id=1768, name=Cow calf, level=2, option=[null, Attack, null, null, null], anims=[5852, 5856]. +NPC id=1769, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=1770, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=1771, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=1772, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=1773, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=1774, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=1775, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=1776, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=1777, name=Ilfeen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1778, name=William, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1779, name=Ian, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1780, name=Larry, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1781, name=Darren, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1782, name=Edward, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1783, name=Richard, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1784, name=Neil, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1785, name=Edmond, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1786, name=Simon, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1787, name=Sam, level=0, option=[Talk-to, null, Trade, null, null], anims=[1740, 1739]. +NPC id=1788, name=Lumdo, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=1789, name=Bunkwicket, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=1790, name=Waymottin, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=1791, name=Jungle Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5751, 5751]. +NPC id=1792, name=Jungle Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5751, 5751]. +NPC id=1793, name=Tassie Slipcast, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1794, name=Hammerspike Stoutbeard, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=1795, name=Dwarf gang member, level=44, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=1796, name=Dwarf gang member, level=48, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=1797, name=Dwarf gang member, level=49, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=1798, name=Phantuwti Fanstuwi Farsight, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1799, name=Tindel Marchant, level=0, option=[Talk-to, null, Give-Sword, null, null], anims=[808, -1]. +NPC id=1800, name=Gnormadium Avlafrim, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=1801, name=Petra Fiyed, level=1, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1802, name=Slagilith, level=92, option=[null, Attack, null, null, null], anims=[1749, 1748]. +NPC id=1803, name=Rock pile, level=0, option=[null, null, null, null, null], anims=[1754, 1754]. +NPC id=1804, name=Slagilith, level=0, option=[null, null, null, null, null], anims=[1753, -1]. +NPC id=1805, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1806, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1807, name=Hamal the Chieftain, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1808, name=Ragnar, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1809, name=Svidi, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1810, name=Jokul, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=1811, child npcs=[1812, -1]. +NPC id=1812, name=The Kendal, level=70, option=[Talk-to, Attack, null, null, null], anims=[1756, 1757]. +NPC id=1813, name=The Kendal, level=70, option=[null, Attack, null, null, null], anims=[1756, 1757]. +NPC id=1814, name=Camp dweller, level=31, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1815, name=Camp dweller, level=31, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1816, name=Camp dweller, level=31, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1817, name=Camp dweller, level=31, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1818, name=Camp dweller, level=25, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=1819, name=Mountain Goat, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=1820, name=Mountain Goat, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=1821, name=Bald Headed Eagle, level=0, option=[null, null, null, null, null], anims=[1773, 1773]. +NPC id=1822, name=Cave goblin, level=3, option=[Talk-to, Attack, null, null, null], anims=[6040, 6041]. +NPC id=1823, name=Cave goblin, level=3, option=[Talk-to, Attack, null, null, null], anims=[6040, 6041]. +NPC id=1824, name=Cave goblin, level=3, option=[Talk-to, Attack, null, null, null], anims=[6040, 6041]. +NPC id=1825, name=Cave goblin, level=3, option=[Talk-to, Attack, null, null, null], anims=[6040, 6041]. +NPC id=1826, name=Hole in the wall, level=0, option=[null, null, null, null, null], anims=[1798, -1]. +NPC id=1827, name=Wall beast, level=49, option=[null, Attack, null, null, null], anims=[1799, -1]. +NPC id=1828, name=Giant frog, level=99, option=[null, Attack, null, null, null], anims=[1796, 1797]. +NPC id=1829, name=Big frog, level=24, option=[null, Attack, null, null, null], anims=[1796, 1797]. +NPC id=1830, name=Frog, level=0, option=[null, null, null, null, null], anims=[1796, 1797]. +NPC id=1831, name=Cave slime, level=23, option=[null, Attack, null, null, null], anims=[1790, 1788]. +NPC id=1832, name=Cave bug, level=6, option=[null, Attack, null, null, null], anims=[6078, 6077]. +NPC id=1833, name=Cave bug larva, level=0, option=[null, null, null, null, null], anims=[1782, 1781]. +NPC id=1834, name=Candle seller, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1835, name=Easter Bunny, level=0, option=[Talk-to, null, null, null, null], anims=[3852, 3851]. +NPC (wrapper) id=1836, child npcs=[1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1837, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1838, -1]. +NPC id=1837, name=Dondakan the Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=1838, name=Dondakan the Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=1839, name=Dondakan the Dwarf, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=1840, name=Dwarven Engineer, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=1841, name=Rolad, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=1842, name=Khorvak, a dwarven engineer, level=0, option=[Talk-to, null, null, null, null], anims=[900, 104]. +NPC id=1843, name=Dwarven Ferryman, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=1844, name=Dwarven Ferryman, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=1845, name=null, level=1, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=1846, name=Dwarven Boatman, level=0, option=[Talk-to, null, Deliver-gold, null, null], anims=[101, 98]. +NPC id=1847, name=Miodvetnir, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=1848, name=Dernu, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=1849, name=Derni, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=1850, name=Arzinian Avatar of Strength, level=0, option=[null, Attack, null, null, null], anims=[1838, 1839]. +NPC id=1851, name=Arzinian Avatar of Strength, level=125, option=[null, Attack, null, null, null], anims=[1838, 1839]. +NPC id=1852, name=Arzinian Avatar of Strength, level=75, option=[null, Attack, null, null, null], anims=[1838, 1839]. +NPC id=1853, name=Arzinian Avatar of Ranging, level=0, option=[null, Attack, null, null, null], anims=[1838, 1839]. +NPC id=1854, name=Arzinian Avatar of Ranging, level=125, option=[null, Attack, null, null, null], anims=[1838, 1839]. +NPC id=1855, name=Arzinian Avatar of Ranging, level=75, option=[null, Attack, null, null, null], anims=[1838, 1839]. +NPC id=1856, name=Arzinian Avatar of Magic, level=0, option=[null, Attack, null, null, null], anims=[1838, 1839]. +NPC id=1857, name=Arzinian Avatar of Magic, level=125, option=[null, Attack, null, null, null], anims=[1838, 1839]. +NPC id=1858, name=Arzinian Avatar of Magic, level=75, option=[null, Attack, null, null, null], anims=[1838, 1839]. +NPC id=1859, name=Arzinian Being of Bordanzan, level=781, option=[Talk-to, null, null, null, null], anims=[1838, 1839]. +NPC id=1860, name=Brian, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1861, name=Ranged combat tutor, level=0, option=[Talk-to, null, Claim, null, null], anims=[808, -1]. +NPC id=1862, name=Ali Morrisane, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1863, name=Drunken Ali, level=0, option=[Talk-to, null, null, null, null], anims=[1322, -1]. +NPC id=1864, name=Ali The barman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1865, name=Ali the Kebab seller, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1866, name=Market seller, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1867, name=Ali the Camel Man, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1868, name=Street urchin, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC (wrapper) id=1869, child npcs=[1870, -1]. +NPC id=1870, name=Ali the Mayor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1871, name=Ali the Hag, level=0, option=[Talk-to, null, null, null, null], anims=[808, 1146]. +NPC id=1872, name=Ali the Snake Charmer, level=0, option=[Talk-to, null, null, null, null], anims=[1879, -1]. +NPC id=1873, name=Ali the Camel, level=0, option=[null, null, Pet, null, null], anims=[51, 45]. +NPC id=1874, name=Desert snake, level=5, option=[null, Attack, null, null, null], anims=[277, 274]. +NPC id=1875, name=Snake, level=0, option=[null, null, null, null, null], anims=[1900, 274]. +NPC id=1876, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1877, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1878, name=Bandit Leader, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=1879, child npcs=[1880, 1880, 1881, -1]. +NPC id=1880, name=Bandit, level=56, option=[Talk-to, Attack, Pickpocket, null, null], anims=[-1, -1]. +NPC id=1881, name=Bandit, level=56, option=[Talk-to, Attack, Pickpocket, Lure, Knock-Out], anims=[-1, -1]. +NPC id=1882, name=Sir Palomedes, level=118, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=1883, name=Sir Palomedes, level=118, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1884, name=Trobert, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1885, name=Bandit champion, level=70, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1886, name=Cowardly Bandit, level=56, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=1887, child npcs=[1888, 1889, 1890, -1]. +NPC id=1888, name=Villager, level=3, option=[Talk-to, null, Pickpocket, null, null], anims=[-1, -1]. +NPC id=1889, name=Villager, level=3, option=[Talk-to, null, Pickpocket, Lure, null], anims=[-1, -1]. +NPC id=1890, name=Villager, level=3, option=[Talk-to, null, Pickpocket, Lure, Knock-Out], anims=[-1, -1]. +NPC (wrapper) id=1891, child npcs=[1892, 1893, 1894, -1]. +NPC id=1892, name=Villager, level=3, option=[Talk-to, null, Pickpocket, null, null], anims=[-1, -1]. +NPC id=1893, name=Villager, level=3, option=[Talk-to, null, Pickpocket, Lure, null], anims=[-1, -1]. +NPC id=1894, name=Villager, level=3, option=[Talk-to, null, Pickpocket, Lure, Knock-Out], anims=[-1, -1]. +NPC (wrapper) id=1895, child npcs=[1896, 1897, 1898, -1]. +NPC id=1896, name=Villager, level=3, option=[Talk-to, null, Pickpocket, null, null], anims=[-1, -1]. +NPC id=1897, name=Villager, level=3, option=[Talk-to, null, Pickpocket, Lure, null], anims=[-1, -1]. +NPC id=1898, name=Villager, level=3, option=[Talk-to, null, Pickpocket, Lure, Knock-Out], anims=[-1, -1]. +NPC id=1899, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1900, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1901, name=Menaphite Leader, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=1902, name=Ali the Operator, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=1903, child npcs=[1904, 1904, 1905, -1]. +NPC id=1904, name=Menaphite Thug, level=55, option=[Talk-to, Attack, null, null, null], anims=[-1, -1]. +NPC id=1905, name=Menaphite Thug, level=55, option=[Talk-to, Attack, Pickpocket, Lure, Knock-Out], anims=[808, -1]. +NPC id=1906, name=Tough Guy, level=75, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC (wrapper) id=1907, child npcs=[1908, 1908, 1909, 1909, 1910, -1]. +NPC id=1908, name=Broken clay golem, level=0, option=[Talk-to, null, null, null, null], anims=[1913, 1912]. +NPC id=1909, name=Damaged clay golem, level=0, option=[Talk-to, null, null, null, null], anims=[1913, 1912]. +NPC id=1910, name=Clay golem, level=0, option=[Talk-to, null, null, null, null], anims=[1913, 1912]. +NPC id=1911, name=Desert Phoenix, level=0, option=[null, null, Grab-feather, null, null], anims=[6809, 6808]. +NPC id=1912, name=Elissa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1913, name=Kamil, level=154, option=[null, Attack, null, null, null], anims=[842, 841]. +NPC id=1914, name=Dessous, level=139, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1915, name=Dessous, level=139, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1916, name=Ruantun, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1917, name=Bandit shopkeeper, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1918, name=Archaeologist, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1919, name=Stranger, level=95, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1920, name=Malak, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1921, name=Bartender, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC (wrapper) id=1922, child npcs=[1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, -1]. +NPC id=1923, name=Eblis, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1924, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1925, name=Eblis, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1926, name=Bandit, level=74, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=1927, name=Bandit, level=0, option=[Talk-to, null, null, null, null], anims=[1955, -1]. +NPC id=1928, name=Bandit, level=0, option=[Talk-to, null, null, null, null], anims=[1953, -1]. +NPC id=1929, name=Bandit, level=0, option=[Talk-to, null, null, null, null], anims=[1952, -1]. +NPC id=1930, name=Bandit, level=0, option=[Talk-to, null, null, null, null], anims=[1954, -1]. +NPC id=1931, name=Bandit, level=57, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC (wrapper) id=1932, child npcs=[1934, 1933, 1933, 1933, 1933, 1933, -1]. +NPC id=1933, name=Troll child, level=0, option=[Talk-to, null, null, null, null], anims=[286, 283]. +NPC id=1934, name=Troll child, level=0, option=[Talk-to, null, null, null, null], anims=[1476, 283]. +NPC id=1935, name=Ice troll, level=0, option=[Talk-to, null, null, null, null], anims=[286, 283]. +NPC id=1936, name=Ice troll, level=124, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1937, name=Ice troll, level=123, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1938, name=Ice troll, level=120, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1939, name=Ice troll, level=121, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1940, name=Ice troll, level=120, option=[null, Attack, null, null, null], anims=[926, 1139]. +NPC id=1941, name=Ice troll, level=120, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=1942, name=Ice troll, level=121, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC (wrapper) id=1943, child npcs=[1944, 1948, -1]. +NPC id=1944, name=Ice block, level=0, option=[Talk-to, Smash-ice, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=1945, child npcs=[1946, 1950, -1]. +NPC id=1946, name=Ice block, level=0, option=[Talk-to, Smash-ice, null, null, null], anims=[-1, -1]. +NPC id=1947, name=null, level=1, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1948, name=Troll father, level=0, option=[Talk-to, null, null, null, null], anims=[286, 283]. +NPC id=1949, name=null, level=1, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=1950, name=Troll mother, level=0, option=[Talk-to, null, null, null, null], anims=[286, 283]. +NPC id=1951, name=Ice wolf, level=132, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1952, name=Ice wolf, level=132, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1953, name=Ice wolf, level=132, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1954, name=Ice wolf, level=132, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1955, name=Ice wolf, level=132, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1956, name=Ice wolf, level=132, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=1957, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=1958, name=Mummy, level=96, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1959, name=Mummy, level=98, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1960, name=Mummy ashes, level=96, option=[null, null, null, null, null], anims=[5563, 5563]. +NPC id=1961, name=Mummy, level=103, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1962, name=Mummy, level=103, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1963, name=Mummy, level=103, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1964, name=Mummy, level=103, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1965, name=Mummy, level=103, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1966, name=Mummy, level=103, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1967, name=Mummy, level=103, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1968, name=Mummy, level=103, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=1969, name=Scarabs, level=92, option=[null, Attack, null, null, null], anims=[1947, 1945]. +NPC id=1970, name=null, level=0, option=[null, null, null, null, null], anims=[125, 119]. +NPC id=1971, name=Azzanadra, level=0, option=[Talk-to, null, null, null, null], anims=[125, 119]. +NPC id=1972, name=Rasolo, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1973, name=Giant skeleton, level=80, option=[null, Attack, null, null, null], anims=[5493, 5497]. +NPC id=1974, name=Damis, level=103, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1975, name=Damis, level=174, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1976, name=Shadow Hound, level=63, option=[null, Attack, null, null, null], anims=[6561, 6560]. +NPC id=1977, name=Fareed, level=167, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1978, name=Slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1979, name=Slave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1980, name=Embalmer, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1981, name=Carpenter, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=1982, name=Raetul, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1983, name=Siamun, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1984, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=1985, child npcs=[1986, -1]. +NPC id=1986, name=High Priest, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1987, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=1988, name=Priest, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1989, name=Priest, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=1990, name=Sphinx, level=0, option=[Talk-to, null, null, null, null], anims=[2028, 2027]. +NPC id=1991, name=Possessed Priest, level=91, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=1992, name=Neite, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=1993, name=Crocodile, level=63, option=[null, Attack, null, null, null], anims=[7589, 7587]. +NPC id=1994, name=Jackal, level=21, option=[null, Attack, null, null, null], anims=[6561, 6560]. +NPC id=1995, name=Locust, level=18, option=[null, Attack, null, null, null], anims=[2012, 2011]. +NPC id=1996, name=Vulture, level=31, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=1997, name=Plague frog, level=11, option=[null, Attack, null, null, null], anims=[1018, 1021]. +NPC id=1998, name=Plague cow, level=0, option=[Pet, null, null, null, null], anims=[5852, 5848]. +NPC id=1999, name=Plague cow, level=0, option=[Pet, null, null, null, null], anims=[5852, 5848]. +NPC id=2000, name=Plague cow, level=0, option=[Pet, null, null, null, null], anims=[5852, 5848]. +NPC id=2001, name=Scarab swarm, level=98, option=[null, Attack, null, null, null], anims=[1947, 1945]. +NPC (wrapper) id=2002, child npcs=[2006, -1]. +NPC id=2003, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2004, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2005, name=Wanderer, level=0, option=[Talk-to, null, null, null, null], anims=[808, 1146]. +NPC id=2006, name=Wanderer, level=0, option=[Talk-to, null, null, null, null], anims=[808, 1146]. +NPC id=2007, name=Het, level=81, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2008, name=Apmeken, level=75, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2009, name=Scabaras, level=75, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2010, name=Crondis, level=75, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2011, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2012, name=Icthlarin, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2013, name=null, level=1, option=[null, null, null, null, null], anims=[5538, 5539]. +NPC id=2014, name=Klenter, level=0, option=[Talk-to, null, null, null, null], anims=[5538, 5539]. +NPC id=2015, name=Mummy, level=84, option=[null, Attack, null, null, null], anims=[5551, 5553]. +NPC id=2016, name=Mummy, level=84, option=[null, Attack, null, null, null], anims=[5551, 5553]. +NPC id=2017, name=Mummy, level=84, option=[null, Attack, null, null, null], anims=[5551, 5553]. +NPC id=2018, name=Mummy, level=84, option=[null, Attack, null, null, null], anims=[5551, 5553]. +NPC id=2019, name=Mummy, level=84, option=[null, Attack, null, null, null], anims=[5551, 5553]. +NPC (wrapper) id=2020, child npcs=[1577, 1576, -1]. +NPC id=2021, name=Light creature, level=0, option=[null, null, null, null, null], anims=[2051, 2051]. +NPC id=2022, name=Light creature, level=0, option=[null, null, null, null, null], anims=[2051, 2051]. +NPC id=2023, name=Juna, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2024, name=Strange Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[1728, -1]. +NPC id=2025, name=Ahrim the Blighted, level=98, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2026, name=Dharok the Wretched, level=115, option=[null, Attack, null, null, null], anims=[2065, 2064]. +NPC id=2027, name=Guthan the Infested, level=115, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2028, name=Karil the Tainted, level=98, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2029, name=Torag the Corrupted, level=115, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2030, name=Verac the Defiled, level=115, option=[null, Attack, null, null, null], anims=[2061, 2060]. +NPC id=2031, name=Bloodworm, level=52, option=[null, Attack, null, null, null], anims=[2071, 2069]. +NPC id=2032, name=Crypt rat, level=43, option=[null, Attack, null, null, null], anims=[242, 239]. +NPC id=2033, name=Giant crypt rat, level=76, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=2034, name=Crypt spider, level=56, option=[null, Attack, null, null, null], anims=[6247, 6248]. +NPC id=2035, name=Giant crypt spider, level=79, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=2036, name=Skeleton, level=77, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=2037, name=Skeleton, level=77, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=2038, name=Grish, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=2039, name=Uglug Nar, level=0, option=[Talk-to, null, Trade, null, null], anims=[357, 358]. +NPC id=2040, name=Pilg, level=0, option=[Talk-to, null, null, null, null], anims=[2088, -1]. +NPC id=2041, name=Grug, level=0, option=[Talk-to, null, null, null, null], anims=[2089, -1]. +NPC id=2042, name=Ogre guard, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=2043, name=Ogre guard, level=76, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=2044, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[357, 2104]. +NPC id=2045, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[357, 2104]. +NPC id=2046, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[357, 2104]. +NPC id=2047, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[357, 2104]. +NPC id=2048, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[357, 2104]. +NPC id=2049, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[357, 2104]. +NPC id=2050, name=Skogre, level=44, option=[null, Attack, null, null, null], anims=[2099, 358]. +NPC id=2051, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[2099, 2104]. +NPC id=2052, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[2099, 2104]. +NPC id=2053, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[2099, 2104]. +NPC id=2054, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[2099, 2104]. +NPC id=2055, name=Zogre, level=44, option=[null, Attack, null, null, null], anims=[2100, 2100]. +NPC id=2056, name=Skogre, level=44, option=[null, Attack, null, null, null], anims=[2100, 2100]. +NPC id=2057, name=Skogre, level=44, option=[null, Attack, null, null, null], anims=[357, 358]. +NPC id=2058, name=Zombie, level=39, option=[Talk-to, Attack, null, null, null], anims=[301, 298]. +NPC id=2059, name=Zavistic Rarve, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2060, name=Slash Bash, level=111, option=[null, Attack, null, null, null], anims=[357, 358]. +NPC id=2061, name=Sithik Ints, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2062, name=Sithik Ints, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2063, name=Gargh, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=2064, name=Scarg, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=2065, name=Gruh, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=2066, name=Irwin Feaselbaum, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2067, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[2126, 2126]. +NPC id=2068, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[2126, 2126]. +NPC id=2069, name=Cave goblin miner, level=11, option=[Talk-to, Attack, null, null, null], anims=[6006, 6005]. +NPC id=2070, name=Cave goblin miner, level=11, option=[Talk-to, Attack, null, null, null], anims=[6006, 6005]. +NPC id=2071, name=Cave goblin miner, level=11, option=[Talk-to, Attack, null, null, null], anims=[6006, 6005]. +NPC id=2072, name=Cave goblin miner, level=11, option=[Talk-to, Attack, null, null, null], anims=[6006, 6005]. +NPC id=2073, name=Cave goblin guard, level=26, option=[Talk-to, Attack, null, null, null], anims=[6006, 6005]. +NPC id=2074, name=Cave goblin guard, level=24, option=[Talk-to, Attack, null, null, null], anims=[6006, 6005]. +NPC id=2075, name=Cave goblin miner, level=11, option=[Talk-to, Attack, null, null, null], anims=[6004, 6005]. +NPC id=2076, name=Cave goblin miner, level=11, option=[Talk-to, Attack, null, null, null], anims=[6004, 6005]. +NPC id=2077, name=Cave goblin miner, level=11, option=[Talk-to, Attack, null, null, null], anims=[6004, 6005]. +NPC id=2078, name=Cave goblin miner, level=11, option=[Talk-to, Attack, null, null, null], anims=[6004, 6005]. +NPC (wrapper) id=2079, child npcs=[2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082, -1]. +NPC id=2080, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2081, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2082, name=Sigmund, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=2083, name=Sigmund, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2084, name=Mistag, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=2085, name=null, level=1, option=[null, null, null, null, null], anims=[6006, 6005]. +NPC id=2086, name=Kazgar, level=0, option=[Talk-to, null, null, null, null], anims=[6006, 6005]. +NPC id=2087, name=Ur-tag, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=2088, name=Duke Horacio, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2089, name=Mistag, level=0, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=2090, name=Sigmund, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2091, name=Secretary, level=0, option=[Talk-to, null, null, null, null], anims=[2157, 2156]. +NPC id=2092, name=Purple Pewter Secretary, level=0, option=[Talk-to, null, null, null, null], anims=[2157, 2156]. +NPC id=2093, name=Yellow Fortune Secretary, level=0, option=[Talk-to, null, null, null, null], anims=[2157, 2156]. +NPC id=2094, name=Blue Opal Secretary, level=0, option=[Talk-to, null, null, null, null], anims=[2158, -1]. +NPC id=2095, name=Green Gemstone Secretary, level=0, option=[Talk-to, null, null, null, null], anims=[2158, -1]. +NPC id=2096, name=White Chisel Secretary, level=0, option=[Talk-to, null, null, null, null], anims=[2158, -1]. +NPC id=2097, name=Silver Cog Secretary, level=0, option=[Talk-to, null, null, null, null], anims=[2158, -1]. +NPC id=2098, name=Brown Engine Secretary, level=0, option=[Talk-to, null, null, null, null], anims=[2158, -1]. +NPC id=2099, name=Red Axe Secretary, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2100, name=Purple Pewter Director, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2101, name=Blue Opal Director, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2102, name=Yellow Fortune Director, level=0, option=[Talk-to, null, null, null, null], anims=[2157, 2156]. +NPC id=2103, name=Green Gemstone Director, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2104, name=White Chisel Director, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2105, name=Silver Cog Director, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2106, name=Brown Engine Director, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2107, name=Red Axe Director, level=0, option=[Talk-to, null, null, null, null], anims=[2155, 2154]. +NPC id=2108, name=Red Axe Cat, level=0, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=2109, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2110, name=Trader, level=0, option=[null, null, null, null, null], anims=[2157, 2156]. +NPC id=2111, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2112, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2113, name=Trader, level=0, option=[null, null, null, null, null], anims=[2157, 2156]. +NPC id=2114, name=Trader, level=0, option=[null, null, null, null, null], anims=[2157, 2156]. +NPC id=2115, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2116, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2117, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2118, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2119, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2120, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2121, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2122, name=Trader, level=0, option=[null, null, null, null, null], anims=[2157, 2156]. +NPC (wrapper) id=2123, child npcs=[2124, -1]. +NPC id=2124, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC (wrapper) id=2125, child npcs=[2126, -1]. +NPC id=2126, name=Trader, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2127, name=Trade Referee, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2128, name=Supreme Commander, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2129, name=Commander Veldaban, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2130, name=Black Guard, level=48, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=2131, name=Black Guard, level=48, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=2132, name=Black Guard, level=48, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=2133, name=Black Guard, level=48, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=2134, name=Black Guard Berserker, level=66, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=2135, name=Black Guard Berserker, level=66, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=2136, name=Black Guard Berserker, level=66, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=2137, name=Gnome emissary, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2138, name=Gnome traveller, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2139, name=Gnome traveller, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2140, name=Dromund's cat, level=0, option=[Talk-to, null, null, null, null], anims=[9171, -1]. +NPC id=2141, name=Blasidar the sculptor, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC (wrapper) id=2142, child npcs=[2143, 2144, 2145, 2147, 2146, 2148, 2149, 2150, -1]. +NPC id=2143, name=Riki the sculptor's model, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2144, name=Riki the sculptor's model, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2145, name=Riki the sculptor's model, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2146, name=Riki the sculptor's model, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2147, name=Riki the sculptor's model, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2148, name=Riki the sculptor's model, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2149, name=Riki the sculptor's model, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2150, name=Riki the sculptor's model, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2151, name=Vigr, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2152, name=Santiri, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2153, name=Saro, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2154, name=Gunslik, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2155, name=Wemund, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2156, name=Randivor, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2157, name=Hervi, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2158, name=Nolar, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2159, name=Gulldamar, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2160, name=Tati, level=0, option=[Talk-to, null, Trade, null, null], anims=[2155, 2154]. +NPC id=2161, name=Agmundi, level=0, option=[Talk-to, null, Trade, null, null], anims=[2157, 2156]. +NPC id=2162, name=Vermundi, level=0, option=[Talk-to, null, Trade, null, null], anims=[2157, 2156]. +NPC id=2163, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[2157, 2157]. +NPC id=2164, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[101, 101]. +NPC id=2165, name=Librarian, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2166, name=Assistant, level=0, option=[Talk-to, null, null, null, null], anims=[2157, 2156]. +NPC id=2167, name=Customer, level=0, option=[Talk-to, null, null, null, null], anims=[2157, 2156]. +NPC id=2168, name=Customer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2169, name=Dromund, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2170, name=Rind the gardener, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2171, name=Factory Manager, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2172, name=Factory Worker, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2173, name=Factory Worker, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2174, name=Factory Worker, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2175, name=Factory Worker, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2176, name=Inn Keeper, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2177, name=Inn Keeper, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2178, name=Barmaid, level=0, option=[Talk-to, null, null, null, null], anims=[2157, 2156]. +NPC id=2179, name=Barman, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2180, name=Cart conductor, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2181, name=Cart conductor, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2182, name=Cart conductor, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2183, name=Cart conductor, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2184, name=Cart conductor, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2185, name=Cart conductor, level=0, option=[Talk-to, null, null, null, null], anims=[900, 104]. +NPC id=2186, name=Cart conductor, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2187, name=Rowdy dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 104]. +NPC id=2188, name=Hegir, level=0, option=[Talk-to, null, null, null, null], anims=[2155, 2154]. +NPC id=2189, name=Haera, level=0, option=[Talk-to, null, null, null, null], anims=[2157, 2156]. +NPC id=2190, name=Runvastr, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2191, name=Sune, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2192, name=Bentamir, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2193, name=Ulifed, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2194, name=Reinald, level=0, option=[Talk-to, null, Change-armguards, null, null], anims=[101, 98]. +NPC id=2195, name=Karl, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2196, name=Gauss, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2197, name=Myndill, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2198, name=Kjut, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2199, name=Tombar, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2200, name=Odmar, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2201, name=Audmann, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC (wrapper) id=2202, child npcs=[2203, 2204, -1]. +NPC id=2203, name=Drunken Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[900, 104]. +NPC id=2204, name=Drunken Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[900, 104]. +NPC id=2205, name=Dwarven Boatman, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2206, name=Dwarven Boatman, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2207, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[2150, 2150]. +NPC id=2208, name=Dwarven Miner, level=0, option=[Talk-to, null, null, null, null], anims=[2150, 2150]. +NPC id=2209, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2210, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2211, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[2150, 2150]. +NPC id=2212, name=Dwarven Miner, level=0, option=[Talk-to, null, null, null, null], anims=[2150, 2150]. +NPC id=2213, name=Dwarven Miner, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2214, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2215, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[2150, 2150]. +NPC id=2216, name=Dwarven Miner, level=0, option=[Talk-to, null, null, null, null], anims=[2150, 2150]. +NPC id=2217, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2218, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2219, name=Purple Pewter Director, level=0, option=[null, null, null, null, null], anims=[2151, 98]. +NPC id=2220, name=Purple Pewter Director, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2221, name=Blue Opal Director, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2222, name=Yellow Fortune Director, level=0, option=[null, null, null, null, null], anims=[2153, 2156]. +NPC id=2223, name=Green Gemstone Director, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2224, name=White Chisel Director, level=0, option=[null, null, null, null, null], anims=[2152, 98]. +NPC id=2225, name=Silver Cog Director, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2226, name=Brown Engine Director, level=0, option=[null, null, null, null, null], anims=[2152, 98]. +NPC id=2227, name=Red Axe Director, level=0, option=[null, null, null, null, null], anims=[2155, 2154]. +NPC id=2228, name=Commander Veldaban, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2229, name=Red Axe Cat, level=0, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=2230, name=Red Axe Cat, level=0, option=[null, null, null, null, null], anims=[9169, 9157]. +NPC id=2231, name=null, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2232, name=Black Guard Berserker, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2233, name=Olivia, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2234, name=Master Farmer, level=0, option=[null, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=2235, name=Master Farmer, level=0, option=[null, null, Pickpocket, null, null], anims=[2163, 2164]. +NPC id=2236, name=Market Guard, level=20, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2237, name=Gee, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2238, name=Donie, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2239, name=Pig, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2240, name=Pig, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2241, name=Piglet, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2242, name=Piglet, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2243, name=Piglet, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2244, name=Lumbridge Guide, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2245, name=Khazard trooper, level=19, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2246, name=Khazard trooper, level=19, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2247, name=Gnome troop, level=3, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=2248, name=Gnome troop, level=3, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=2249, name=Gnome, level=3, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=2250, name=Gnome, level=1, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=2251, name=Gnome, level=3, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=2252, name=Crow, level=0, option=[null, null, null, null, null], anims=[6785, 6784]. +NPC id=2253, name=Wise Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2254, name=Bed, level=0, option=[Kick, null, null, null, null], anims=[2170, -1]. +NPC id=2255, name=Thing under the bed, level=0, option=[null, Attack, null, null, null], anims=[2170, -1]. +NPC id=2256, name=Paladin, level=62, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC (wrapper) id=2257, child npcs=[2258, 2258, 2258, 2258, 2259, -1]. +NPC id=2258, name=Mage of Zamorak, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2259, name=Mage of Zamorak, level=0, option=[Talk-to, null, Trade, Teleport, null], anims=[808, -1]. +NPC id=2260, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2261, name=Mage of Zamorak, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2262, name=Dark mage, level=0, option=[Talk-to, null, Repair-pouches, null, null], anims=[2149, 2149]. +NPC id=2263, name=Abyssal leech, level=41, option=[null, Attack, null, null, null], anims=[2180, 2179]. +NPC id=2264, name=Abyssal guardian, level=59, option=[null, Attack, null, null, null], anims=[2185, 2184]. +NPC id=2265, name=Abyssal walker, level=81, option=[null, Attack, null, null, null], anims=[2191, 2190]. +NPC id=2266, name=Brian O'Richard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2267, name=Rogue Guard, level=0, option=[null, null, hidden, null, null], anims=[808, -1]. +NPC id=2268, name=Rogue Guard, level=0, option=[null, null, hidden, null, null], anims=[808, -1]. +NPC id=2269, name=Rogue Guard, level=0, option=[null, null, hidden, null, null], anims=[808, -1]. +NPC id=2270, name=Martin Thwait, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2271, name=Emerald Benedict, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=2272, name=Spin Blades, level=0, option=[null, null, null, null, null], anims=[-1, 2212]. +NPC id=2273, name=Spin Blades, level=0, option=[null, null, null, null, null], anims=[-1, 2212]. +NPC id=2274, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2275, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2276, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2277, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2278, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2279, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2280, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2281, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2282, name=Sir Spishyus, level=0, option=[Talk-to, null, null, null, null], anims=[2253, -1]. +NPC id=2283, name=Lady Table, level=0, option=[Talk-to, null, null, null, null], anims=[2256, -1]. +NPC id=2284, name=Sir Kuam Ferentse, level=0, option=[Talk-to, null, null, null, null], anims=[2253, -1]. +NPC id=2285, name=Sir Leye, level=20, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=2286, name=Sir Tinley, level=0, option=[Talk-to, null, null, null, null], anims=[2253, -1]. +NPC id=2287, name=Sir Ren Itchood, level=0, option=[Talk-to, null, null, null, null], anims=[1321, -1]. +NPC id=2288, name=Miss Cheevers, level=0, option=[Talk-to, null, null, null, null], anims=[2256, -1]. +NPC id=2289, name=Ms. Hynn Terprett, level=0, option=[Talk-to, null, null, null, null], anims=[2255, -1]. +NPC id=2290, name=Sir Tiffy Cashien, level=0, option=[Talk-to, null, null, null, null], anims=[4838, -1]. +NPC id=2291, name=Rug Merchant, level=0, option=[Talk-to, null, Travel, null, null], anims=[808, -1]. +NPC id=2292, name=Rug Merchant, level=0, option=[Talk-to, null, Travel, null, null], anims=[808, -1]. +NPC id=2293, name=Rug Merchant, level=0, option=[Talk-to, null, Travel, null, null], anims=[808, -1]. +NPC id=2294, name=Rug Merchant, level=0, option=[Talk-to, null, Travel, null, null], anims=[1144, -1]. +NPC id=2295, name=null, level=1, option=[Talk-to, null, Travel, null, null], anims=[1144, -1]. +NPC id=2296, name=Rug Merchant, level=0, option=[Talk-to, null, Travel, null, null], anims=[1144, -1]. +NPC id=2297, name=null, level=0, option=[Talk-to, null, Travel, null, null], anims=[808, -1]. +NPC id=2298, name=Rug Merchant, level=0, option=[Talk-to, null, Travel, null, null], anims=[808, -1]. +NPC id=2299, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2300, name=Rug Station Attendant, level=0, option=[Talk-to, null, Travel, null, null], anims=[808, -1]. +NPC id=2301, name=Monkey, level=0, option=[Talk-to, null, null, null, null], anims=[222, 219]. +NPC id=2302, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[222, 219]. +NPC id=2303, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[222, 219]. +NPC id=2304, name=Sarah, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2305, name=Vanessa, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2306, name=Richard, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2307, name=Alice, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2308, name=Capt' Arnav, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=2309, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2310, name=Cow calf, level=2, option=[null, Attack, null, null, null], anims=[5852, 5856]. +NPC id=2311, name=Sheepdog, level=0, option=[null, null, null, null, null], anims=[2268, -1]. +NPC id=2312, name=Rooster, level=0, option=[null, null, null, null, null], anims=[2298, 2297]. +NPC id=2313, name=Chicken, level=1, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=2314, name=Chicken, level=1, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=2315, name=Chicken, level=1, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=2316, name=Pig, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2317, name=Pig, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2318, name=Piglet, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2319, name=Piglet, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2320, name=Piglet, level=0, option=[null, null, null, null, null], anims=[2166, 2165]. +NPC id=2321, name=Blandebir, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2322, name=Metarialus, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2323, name=Elstan, level=0, option=[Talk-to, null, Pay (North-west), Pay (South-east), null], anims=[2163, 2164]. +NPC id=2324, name=Dantaera, level=0, option=[Talk-to, null, Pay (North), Pay (South), null], anims=[808, -1]. +NPC id=2325, name=Kragen, level=0, option=[Talk-to, null, Pay (North), Pay (South), null], anims=[2163, 2164]. +NPC id=2326, name=Lyra, level=0, option=[Talk-to, null, Pay (North-west), Pay (South-east), null], anims=[808, -1]. +NPC id=2327, name=Francis, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2328, name=Wizard Cromperty, level=0, option=[Talk-to, null, Teleport, null, null], anims=[-1, -1]. +NPC id=2329, name=Muncher, level=0, option=[Interact, null, null, null, null], anims=[6580, 6577]. +NPC id=2330, name=Garth, level=0, option=[Talk-to, null, Pay, null, null], anims=[2163, 2164]. +NPC id=2331, name=Ellena, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2332, name=Selena, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2333, name=Vasquen, level=0, option=[Talk-to, null, Pay, null, null], anims=[2163, 2164]. +NPC id=2334, name=Rhonen, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2335, name=Dreven, level=0, option=[Talk-to, null, Pay, null, null], anims=[2163, 2164]. +NPC id=2336, name=Taria, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2337, name=Rhazien, level=0, option=[Talk-to, null, Pay, null, null], anims=[2163, 2164]. +NPC id=2338, name=Torrell, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2339, name=Alain, level=0, option=[Talk-to, null, Pay, null, null], anims=[8528, 8527]. +NPC id=2340, name=Heskel, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2341, name=Treznor, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2342, name=Fayeth, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2343, name=Bolongo, level=0, option=[Talk-to, null, Pay, null, null], anims=[195, 189]. +NPC id=2344, name=Gileth, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2345, name=Sick-looking sheep (1), level=0, option=[Prod, null, null, null, null], anims=[5335, 5334]. +NPC id=2346, name=Sick-looking sheep (2), level=0, option=[Prod, null, null, null, null], anims=[5335, 5334]. +NPC id=2347, name=Sick-looking sheep (3), level=0, option=[Prod, null, null, null, null], anims=[5335, 5334]. +NPC id=2348, name=Sick-looking sheep (4), level=0, option=[Prod, null, null, null, null], anims=[5335, 5334]. +NPC id=2349, name=Mourner, level=11, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2350, name=Mourner, level=11, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2351, name=Mourner, level=11, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2352, name=Eudav, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2353, name=Oronwen, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2354, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=2355, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=2356, name=Dalldav, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2357, name=Gethin, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2358, name=Arianwyn, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2359, name=Elf warrior, level=108, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2360, name=Elf warrior, level=108, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2361, name=Elf warrior, level=90, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2362, name=Elf warrior, level=90, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2363, name=Goreu, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=2364, name=Ysgawyn, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=2365, name=Arvel, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=2366, name=Mawrth, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=2367, name=Kelyn, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=2368, name=Eoin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2369, name=Iona, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2370, name=null, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=2371, name=Gnome, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2372, name=Head mourner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2373, name=Mourner, level=108, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2374, name=Mourner, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2375, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2376, name=Eluned, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2377, name=Sick-looking sheep (1), level=0, option=[null, null, null, null, null], anims=[5335, 5334]. +NPC id=2378, name=Sick-looking sheep (2), level=0, option=[null, null, null, null, null], anims=[5335, 5334]. +NPC id=2379, name=Sick-looking sheep (3), level=0, option=[null, null, null, null, null], anims=[5335, 5334]. +NPC id=2380, name=Sick-looking sheep (4), level=0, option=[null, null, null, null, null], anims=[5335, 5334]. +NPC id=2381, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2382, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2383, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2384, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2385, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2386, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2387, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2388, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2389, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2390, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2391, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2392, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2393, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2394, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2395, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2396, name=null, level=1, option=[null, null, null, null, null], anims=[2334, 2333]. +NPC id=2397, name=Mysterious ghost, level=0, option=[Talk-To, null, null, null, null], anims=[2334, 2333]. +NPC id=2398, name=Mysterious ghost, level=0, option=[Talk-To, null, null, null, null], anims=[2334, 2333]. +NPC id=2399, name=Mysterious ghost, level=0, option=[Talk-To, null, null, null, null], anims=[2334, 2333]. +NPC id=2400, name=Mysterious ghost, level=0, option=[Talk-To, null, null, null, null], anims=[2334, 2333]. +NPC id=2401, name=Mysterious ghost, level=0, option=[Talk-To, null, null, null, null], anims=[2334, 2333]. +NPC id=2402, name=Mysterious ghost, level=0, option=[Talk-To, null, null, null, null], anims=[2334, 2333]. +NPC (wrapper) id=2403, child npcs=[2099, -1]. +NPC (wrapper) id=2404, child npcs=[2107, -1]. +NPC (wrapper) id=2405, child npcs=[2108, -1]. +NPC (wrapper) id=2406, child npcs=[2137, -1]. +NPC (wrapper) id=2407, child npcs=[2138, -1]. +NPC (wrapper) id=2408, child npcs=[2139, -1]. +NPC id=2409, name=Cart conductor, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2410, name=Red Axe Director, level=0, option=[null, null, null, null, null], anims=[2155, 2154]. +NPC id=2411, name=Red Axe Director, level=0, option=[Listen-to, null, null, null, null], anims=[2155, 2154]. +NPC id=2412, name=Red Axe Henchman, level=0, option=[null, null, null, null, null], anims=[2336, 2335]. +NPC id=2413, name=Red Axe Henchman, level=0, option=[Listen-to, null, null, null, null], anims=[2336, 2335]. +NPC id=2414, name=Red Axe Henchman, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2415, name=Colonel Grimsson, level=0, option=[null, null, null, null, null], anims=[2336, 2335]. +NPC id=2416, name=Colonel Grimsson, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2417, name=Ogre shaman, level=0, option=[null, null, null, null, null], anims=[357, 358]. +NPC id=2418, name=Ogre shaman, level=0, option=[Listen-to, null, null, null, null], anims=[357, 358]. +NPC id=2419, name=Grunsh, level=0, option=[null, null, null, null, null], anims=[357, 358]. +NPC id=2420, name=Gnome emissary, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=2421, name=Gnome companion, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=2422, name=Gnome companion, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=2423, name=Chaos dwarf, level=48, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2424, name=Gunslik, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2425, name=Nolar, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2426, name=Factory Worker, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2427, name=Cart conductor, level=0, option=[null, null, null, null, null], anims=[900, 104]. +NPC id=2428, name=Gauss, level=0, option=[null, null, null, null, null], anims=[2337, 104]. +NPC id=2429, name=Drunken Dwarf, level=0, option=[null, null, null, null, null], anims=[900, 104]. +NPC id=2430, name=Rowdy dwarf, level=0, option=[null, null, null, null, null], anims=[101, 104]. +NPC id=2431, name=Ulifed, level=0, option=[Talk-to, null, null, null, null], anims=[2337, 98]. +NPC id=2432, name=Red Axe Henchman, level=1, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2433, name=Red Axe Henchman, level=1, option=[Talk-to, null, null, null, null], anims=[2341, 2335]. +NPC id=2434, name=Ogre shaman, level=1, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC (wrapper) id=2435, child npcs=[2436, 2437, -1]. +NPC id=2436, name=Jarvald, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2437, name=Jarvald, level=0, option=[Talk-to, null, Travel, null, null], anims=[813, -1]. +NPC id=2438, name=Jarvald, level=0, option=[Talk-to, null, Travel, null, null], anims=[813, -1]. +NPC id=2439, name=Askeladden, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=2440, name=Door-support, level=0, option=[null, Destroy, null, null, null], anims=[-1, -1]. +NPC id=2441, name=Door, level=0, option=[null, null, null, null, null], anims=[2351, -1]. +NPC id=2442, name=Door, level=0, option=[null, null, null, null, null], anims=[2352, -1]. +NPC id=2443, name=Door-support, level=0, option=[null, Destroy, null, null, null], anims=[2354, -1]. +NPC id=2444, name=Door, level=0, option=[null, null, null, null, null], anims=[2353, -1]. +NPC id=2445, name=Door, level=0, option=[null, null, null, null, null], anims=[2355, -1]. +NPC id=2446, name=Door-support, level=0, option=[null, Destroy, null, null, null], anims=[2357, -1]. +NPC id=2447, name=Door, level=0, option=[null, null, null, null, null], anims=[2356, -1]. +NPC id=2448, name=Door, level=0, option=[null, null, null, null, null], anims=[2358, -1]. +NPC id=2449, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2450, name=Egg, level=0, option=[null, null, null, null, null], anims=[2362, 2362]. +NPC id=2451, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2452, name=Giant Rock Crab, level=137, option=[null, Attack, null, null, null], anims=[1310, 1311]. +NPC id=2453, name=Boulder, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2454, name=Dagannoth spawn, level=42, option=[null, Attack, null, null, null], anims=[1338, 2361]. +NPC id=2455, name=Dagannoth, level=90, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=2456, name=Dagannoth, level=88, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=2457, name=Wallasalki, level=98, option=[null, Attack, null, null, null], anims=[2364, 2363]. +NPC id=2458, name=Freaky Forester, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2459, name=Pheasant, level=3, option=[null, Attack, null, null, null], anims=[2370, 2369]. +NPC id=2460, name=Pheasant, level=3, option=[null, Attack, null, null, null], anims=[2370, 2369]. +NPC id=2461, name=Pheasant, level=3, option=[null, Attack, null, null, null], anims=[2370, 2369]. +NPC id=2462, name=Pheasant, level=3, option=[null, Attack, null, null, null], anims=[2370, 2369]. +NPC id=2463, name=Evil Chicken, level=19, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=2464, name=Evil Chicken, level=38, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=2465, name=Evil Chicken, level=69, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=2466, name=Evil Chicken, level=81, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=2467, name=Evil Chicken, level=121, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=2468, name=Evil Chicken, level=159, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=2469, name=Frog, level=0, option=[Talk-to, null, null, null, null], anims=[1796, 1797]. +NPC id=2470, name=Frog, level=0, option=[Talk-to, null, null, null, null], anims=[1796, 1797]. +NPC id=2471, name=Frog, level=0, option=[Talk-to, null, null, null, null], anims=[1796, 1797]. +NPC id=2472, name=Frog, level=0, option=[Talk-to, null, null, null, null], anims=[1796, 1797]. +NPC id=2473, name=Frog, level=0, option=[null, null, null, null, null], anims=[1796, 1797]. +NPC id=2474, name=Frog prince, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2475, name=Frog princess, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2476, name=Rick Turpentine, level=0, option=[Talk-to, null, null, null, null], anims=[4591, -1]. +NPC id=2477, name=Quiz Master, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2478, name=Evil Bob, level=0, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=2479, name=Evil Bob, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=2480, name=Servant, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2481, name=Servant, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2482, name=Giant bat, level=0, option=[null, null, null, null, null], anims=[4914, 4913]. +NPC (wrapper) id=2483, child npcs=[1163, 1163, 1163, 1163, 1163, 1163, -1]. +NPC id=2484, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=2485, child npcs=[1165, 1165, 1165, 1165, 1165, 1165, -1]. +NPC id=2486, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=2487, child npcs=[1167, 1167, 1167, 1167, 1167, 1167, -1]. +NPC id=2488, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2489, name=Bush snake, level=35, option=[null, Attack, null, null, null], anims=[277, 274]. +NPC id=2490, name=Bush snake, level=35, option=[null, Attack, null, null, null], anims=[277, 2392]. +NPC id=2491, name=Jungle spider, level=44, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=2492, name=Jungle spider, level=44, option=[null, Attack, null, null, null], anims=[5326, 5333]. +NPC id=2493, name=Large mosquito, level=13, option=[null, Attack, null, null, null], anims=[2395, 2396]. +NPC id=2494, name=Mosquito swarm, level=17, option=[null, Attack, null, null, null], anims=[2395, 2396]. +NPC id=2495, name=Mosquito swarm, level=20, option=[null, Attack, null, null, null], anims=[2395, 2396]. +NPC id=2496, name=Tribesman, level=32, option=[null, null, null, null, null], anims=[2400, -1]. +NPC id=2497, name=Tribesman, level=32, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2498, name=Broodoo victim, level=1, option=[null, null, null, null, null], anims=[2400, -1]. +NPC id=2499, name=Broodoo victim, level=60, option=[null, Attack, null, null, null], anims=[2401, -1]. +NPC id=2500, name=Broodoo victim, level=1, option=[null, null, null, null, null], anims=[2400, -1]. +NPC id=2501, name=Broodoo victim, level=60, option=[null, Attack, null, null, null], anims=[2401, -1]. +NPC id=2502, name=Broodoo victim, level=1, option=[null, null, null, null, null], anims=[2400, -1]. +NPC id=2503, name=Broodoo victim, level=60, option=[null, Attack, null, null, null], anims=[2401, -1]. +NPC id=2504, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2505, name=Sharimika, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2506, name=Sharimika, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2507, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2508, name=Mamma Bufetta, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2509, name=Mamma Bufetta, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2510, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2511, name=Layleen, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2512, name=Layleen, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2513, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2514, name=Karaday, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2515, name=Karaday, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2516, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2517, name=Safta Doc, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2518, name=Safta Doc, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2519, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2520, name=Gabooty, level=0, option=[Talk-to, null, Trade-Co-op, Trade-Drinks, null], anims=[-1, -1]. +NPC id=2521, name=Gabooty, level=0, option=[Talk-to, null, Trade-Co-op, Trade-Drinks, null], anims=[-1, -1]. +NPC id=2522, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2523, name=Fanellaman, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2524, name=Fanellaman, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2525, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2526, name=Jagbakoba, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2527, name=Jagbakoba, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2528, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2529, name=Murcaily, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2530, name=Murcaily, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=2531, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2532, name=Rionasta, level=0, option=[Talk-to, null, Send-parcel, null, null], anims=[813, -1]. +NPC id=2533, name=Rionasta, level=0, option=[Talk-to, null, Send-parcel, null, null], anims=[813, -1]. +NPC id=2534, name=Mahogany, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=2535, name=Teak, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=2536, name=Niles, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2537, name=Miles, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2538, name=Giles, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2539, name=Cap'n Hand, level=0, option=[Talk-to, null, null, null, null], anims=[7199, -1]. +NPC id=2540, name=Dr Jekyll, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2541, name=Mr Hyde, level=14, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2542, name=Mr Hyde, level=29, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2543, name=Mr Hyde, level=49, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2544, name=Mr Hyde, level=79, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2545, name=Mr Hyde, level=120, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2546, name=Mr Hyde, level=159, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2547, name=Chaos druid, level=13, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=2548, name=Blackjack seller, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2549, name=Ali the dyer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2550, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2551, name=Dwarven Miner, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2552, name=Dwarven Miner, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2553, name=Blast Furnace Foreman, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2554, name=Tin ore, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2555, name=Copper ore, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2556, name=Iron ore, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2557, name=Mithril ore, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2558, name=Adamantite ore, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2559, name=Runite ore, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2560, name=Silver ore, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2561, name=Gold ore, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2562, name=Coal, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2563, name=Perfect gold ore, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2564, name=Ordan, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2565, name=Jorzik, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=2566, name=Wise Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2567, name=Wise Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2568, name=Banker, level=0, option=[Talk-to, null, Bank, null, null], anims=[808, -1]. +NPC id=2569, name=Banker, level=0, option=[Talk-to, null, Bank, null, null], anims=[808, -1]. +NPC id=2570, name=Banker, level=0, option=[Talk-to, null, Bank, null, null], anims=[808, -1]. +NPC id=2571, name=Market Guard, level=20, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2572, name=Olivia, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2573, name=Pillory Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2574, name=Bank guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2575, name=Purepker895, level=52, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=2576, name=Qutiedoll, level=16, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=2577, name=1337sp34kr, level=63, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=2578, name=Elfinlocks, level=87, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=2579, name=Cool Mom227, level=27, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=2580, name=Bernald, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2581, name=Ellamaria, level=0, option=[Talk-to, null, null, null, null], anims=[2578, -1]. +NPC id=2582, name=Trolley, level=0, option=[Push, null, Pull, Big-push, Place], anims=[-1, 2571]. +NPC id=2583, name=Trolley, level=0, option=[Push, null, Pull, Big-push, Place], anims=[-1, -1]. +NPC id=2584, name=Trolley, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=2585, child npcs=[2584, 2582, 2583, -1]. +NPC id=2586, name=Billy, a guard of Falador, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2587, name=Bob, another guard of Falador, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2588, name=Brother Althric, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2589, name=PKMaster0036, level=87, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2590, name=King Roald, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2591, name=TzHaar-Mej, level=103, option=[null, Attack, null, null, null], anims=[9294, 9295]. +NPC id=2592, name=TzHaar-Mej, level=103, option=[null, Attack, null, null, null], anims=[9294, 9295]. +NPC id=2593, name=TzHaar-Mej, level=103, option=[null, Attack, null, null, null], anims=[9294, 9295]. +NPC id=2594, name=TzHaar-Mej, level=103, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2595, name=TzHaar-Mej, level=103, option=[null, Attack, null, null, null], anims=[9294, 9295]. +NPC id=2596, name=TzHaar-Mej, level=103, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2597, name=TzHaar-Mej, level=103, option=[null, Attack, null, null, null], anims=[9294, 9295]. +NPC id=2598, name=TzHaar-Hur, level=74, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2599, name=TzHaar-Hur, level=74, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2600, name=TzHaar-Hur, level=74, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2601, name=TzHaar-Hur, level=74, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2602, name=TzHaar-Hur, level=74, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2603, name=TzHaar-Hur, level=74, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2604, name=TzHaar-Xil, level=133, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2605, name=TzHaar-Xil, level=133, option=[null, Attack, null, null, null], anims=[9281, 9296]. +NPC id=2606, name=TzHaar-Xil, level=133, option=[null, Attack, null, null, null], anims=[9298, 9297]. +NPC id=2607, name=TzHaar-Xil, level=133, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2608, name=TzHaar-Xil, level=133, option=[null, Attack, null, null, null], anims=[9281, 9296]. +NPC id=2609, name=TzHaar-Xil, level=133, option=[null, Attack, null, null, null], anims=[9298, 9297]. +NPC id=2610, name=TzHaar-Ket, level=149, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2611, name=TzHaar-Ket, level=149, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2612, name=TzHaar-Ket, level=149, option=[null, Attack, null, null, null], anims=[9281, 9296]. +NPC id=2613, name=TzHaar-Ket, level=149, option=[null, Attack, null, null, null], anims=[9281, 9296]. +NPC id=2614, name=TzHaar-Ket, level=149, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2615, name=TzHaar-Ket, level=149, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2616, name=TzHaar-Ket, level=149, option=[null, Attack, null, null, null], anims=[9281, 9280]. +NPC id=2617, name=TzHaar-Mej-Jal, level=0, option=[Talk-to, null, null, null, null], anims=[9294, 9295]. +NPC id=2618, name=TzHaar-Mej-Kah, level=0, option=[Talk-to, null, null, null, null], anims=[9294, 9295]. +NPC id=2619, name=TzHaar-Ket-Zuh, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[9294, 9295]. +NPC id=2620, name=TzHaar-Hur-Tel, level=0, option=[Talk-to, null, Trade, null, null], anims=[9294, 9295]. +NPC id=2621, name=Olaf Hradson, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2622, name=TzHaar-Hur-Lek, level=0, option=[Talk-to, null, Trade, null, null], anims=[9294, 9295]. +NPC id=2623, name=TzHaar-Mej-Roh, level=0, option=[Talk-to, null, Trade, null, null], anims=[9294, 9295]. +NPC id=2624, name=TzHaar-Ket, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9296]. +NPC id=2625, name=TzHaar-Ket, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9296]. +NPC id=2626, name=Rocks, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2627, name=Tz-Kih, level=22, option=[null, Attack, null, null, null], anims=[9228, 9229]. +NPC id=2628, name=Tz-Kih, level=22, option=[null, Attack, null, null, null], anims=[9228, 9229]. +NPC id=2629, name=Tz-Kek, level=45, option=[null, Attack, null, null, null], anims=[9236, 9237]. +NPC id=2630, name=Tz-Kek, level=45, option=[null, Attack, null, null, null], anims=[9236, 9237]. +NPC id=2631, name=Tok-Xil, level=90, option=[null, Attack, null, null, null], anims=[9241, 9240]. +NPC id=2632, name=Tok-Xil, level=90, option=[null, Attack, null, null, null], anims=[9241, 9240]. +NPC id=2633, name=Wise Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2634, name=Miss Schism, level=0, option=[Talk-to, null, null, null, null], anims=[1673, -1]. +NPC id=2635, name=Bob, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=2636, name=Bob, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=2637, name=Sphinx, level=0, option=[Talk-to, null, null, null, null], anims=[2028, 2027]. +NPC id=2638, name=Neite, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=2639, name=Robert the Strong, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2640, name=Odysseus, level=0, option=[Talk-to, null, null, null, null], anims=[2668, 2667]. +NPC id=2641, name=Dragonkin, level=0, option=[null, null, null, null, null], anims=[2688, 2689]. +NPC id=2642, name=King Black Dragon, level=0, option=[null, null, null, null, null], anims=[90, 4635]. +NPC id=2643, name=R4ng3rNo0b889, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2644, name=Love Cats, level=0, option=[null, null, null, null, null], anims=[9196, 9197]. +NPC id=2645, name=Love Cats, level=0, option=[null, null, null, null, null], anims=[9194, -1]. +NPC id=2646, name=Neite, level=0, option=[Talk-to, null, null, null, null], anims=[9165, 9165]. +NPC id=2647, name=Bob, level=0, option=[Talk-to, null, null, null, null], anims=[9165, 9165]. +NPC id=2648, name=Beite, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9156]. +NPC id=2649, name=Gnome, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2650, name=Gnome, level=0, option=[Talk-to, null, null, null, null], anims=[2691, 189]. +NPC id=2651, name=Odysseus, level=0, option=[Talk-to, null, null, null, null], anims=[2666, 2666]. +NPC id=2652, name=null, level=1, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=2653, name=Neite, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC (wrapper) id=2654, child npcs=[2655, 2656, 2657, 2658, 2659, 2658, 2657, 2656, 2655, -1]. +NPC id=2655, name=Unferth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2656, name=Unferth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2657, name=Unferth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2658, name=Unferth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2659, name=Unferth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2660, name=Reldo, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2661, name=Reldo, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2662, name=Lazy cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2663, name=Lazy cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2664, name=Lazy cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2665, name=Lazy cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2666, name=Lazy cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2667, name=Lazy cat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2668, name=Wily cat, level=0, option=[Pick-up, hidden, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2669, name=Wily cat, level=0, option=[Pick-up, hidden, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2670, name=Wily cat, level=0, option=[Pick-up, hidden, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2671, name=Wily cat, level=0, option=[Pick-up, hidden, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2672, name=Wily cat, level=0, option=[Pick-up, hidden, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2673, name=Wily cat, level=0, option=[Pick-up, hidden, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=2674, name=Thief, level=16, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2675, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[813, -1]. +NPC id=2676, name=Make-over Mage, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2677, name=Highwayman, level=5, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2678, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2679, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2680, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2681, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=2682, name=Rat, level=1, option=[null, Attack, null, null, null], anims=[2704, 2703]. +NPC id=2683, name=Hengel, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=2684, name=Anja, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=2685, name=Hobgoblin, level=28, option=[null, Attack, null, null, null], anims=[166, 162]. +NPC id=2686, name=Hobgoblin, level=28, option=[null, Attack, null, null, null], anims=[166, 162]. +NPC id=2687, name=Hobgoblin, level=28, option=[null, Attack, null, null, null], anims=[166, 162]. +NPC id=2688, name=Hobgoblin, level=28, option=[null, Attack, null, null, null], anims=[166, 162]. +NPC id=2689, name=Frog, level=0, option=[null, null, null, null, null], anims=[1796, 1797]. +NPC id=2690, name=Jack Seagull, level=0, option=[Talk-to, null, null, null, null], anims=[1322, -1]. +NPC id=2691, name=Longbow Ben, level=0, option=[Talk-to, null, null, null, null], anims=[1322, -1]. +NPC id=2692, name=Ahab, level=0, option=[Talk-to, null, null, null, null], anims=[1137, -1]. +NPC id=2693, name=Duck, level=1, option=[null, Attack, null, null, null], anims=[6818, 6817]. +NPC id=2694, name=Duckling, level=1, option=[null, Attack, null, null, null], anims=[6818, 6817]. +NPC id=2695, name=Pirate, level=23, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=2696, name=Thief, level=16, option=[null, Attack, null, null, null], anims=[2702, -1]. +NPC id=2697, name=Mugger, level=6, option=[null, Attack, null, null, null], anims=[2701, -1]. +NPC id=2698, name=Black knight, level=33, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2699, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=2700, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=2701, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=2702, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=2703, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=2704, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[2700, -1]. +NPC id=2705, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2706, name=Crab, level=0, option=[null, null, null, null, null], anims=[1310, 1311]. +NPC id=2707, name=Seagull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=2708, name=Seagull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=2709, name=Fire wizard, level=13, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2710, name=Water wizard, level=13, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2711, name=Earth wizard, level=13, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2712, name=Air wizard, level=13, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2713, name=Malignius Mortifer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2714, name=Zombie, level=0, option=[null, null, null, null, null], anims=[5572, 5570]. +NPC id=2715, name=Skeleton, level=0, option=[null, null, null, null, null], anims=[5483, 5479]. +NPC id=2716, name=Ghost, level=0, option=[null, null, null, null, null], anims=[5530, 5531]. +NPC id=2717, name=Skeleton mage, level=0, option=[null, null, null, null, null], anims=[5483, 5479]. +NPC id=2718, name=Betty, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2719, name=Grum, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2720, name=Gerrant, level=0, option=[Talk-to, null, Trade, null, null], anims=[813, -1]. +NPC id=2721, name=Wydin, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2722, name=Fishing spot, level=0, option=[Use-rod, null, null, hidden, null], anims=[447, 448]. +NPC id=2723, name=Fishing spot, level=0, option=[Use-rod, null, null, hidden, null], anims=[456, -1]. +NPC id=2724, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=2725, name=Otto Godblessed, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2726, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=2727, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=2728, name=Monk of Entrana, level=0, option=[Talk-to, null, Take-boat, null, null], anims=[808, -1]. +NPC id=2729, name=Monk of Entrana, level=0, option=[Talk-to, null, Take-boat, null, null], anims=[813, -1]. +NPC id=2730, name=Monk of Entrana, level=0, option=[Talk-to, null, Take-boat, null, null], anims=[808, -1]. +NPC id=2731, name=Monk of Entrana, level=0, option=[Talk-to, null, Take-boat, null, null], anims=[813, -1]. +NPC id=2732, name=Master Crafter, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2733, name=Master Crafter, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2734, name=Tz-Kih, level=22, option=[null, Attack, null, null, null], anims=[9228, 9229]. +NPC id=2735, name=Tz-Kih, level=22, option=[null, Attack, null, null, null], anims=[9228, 9229]. +NPC id=2736, name=Tz-Kek, level=45, option=[null, Attack, null, null, null], anims=[9236, 9237]. +NPC id=2737, name=Tz-Kek, level=45, option=[null, Attack, null, null, null], anims=[9236, 9237]. +NPC id=2738, name=Tz-Kek, level=22, option=[null, Attack, null, null, null], anims=[9236, 9238]. +NPC id=2739, name=Tok-Xil, level=90, option=[null, Attack, null, null, null], anims=[9241, 9240]. +NPC id=2740, name=Tok-Xil, level=90, option=[null, Attack, null, null, null], anims=[9241, 9240]. +NPC id=2741, name=Yt-MejKot, level=180, option=[null, Attack, null, null, null], anims=[9250, 9251]. +NPC id=2742, name=Yt-MejKot, level=180, option=[null, Attack, null, null, null], anims=[9250, 9251]. +NPC id=2743, name=Ket-Zek, level=360, option=[null, Attack, null, null, null], anims=[9267, 9264]. +NPC id=2744, name=Ket-Zek, level=360, option=[null, Attack, null, null, null], anims=[9267, 9264]. +NPC id=2745, name=TzTok-Jad, level=702, option=[null, Attack, null, null, null], anims=[9274, 9273]. +NPC id=2746, name=Yt-HurKot, level=108, option=[null, Attack, null, null, null], anims=[9255, 9256]. +NPC id=2747, name=Solus Dellagar, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2748, name=Savant, level=0, option=[Talk-to, null, null, null, null], anims=[2256, -1]. +NPC id=2749, name=Lord Daquarius, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2750, name=Solus Dellagar, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2751, name=Black Knight, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2752, name=Lord Daquarius, level=0, option=[null, null, null, null, null], anims=[2724, -1]. +NPC id=2753, name=Mage of Zamorak, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2754, name=Mage of Zamorak, level=0, option=[null, null, null, null, null], anims=[2726, -1]. +NPC id=2755, name=Mage of Zamorak, level=0, option=[null, null, null, null, null], anims=[2727, -1]. +NPC id=2756, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2757, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2758, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2759, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2760, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2761, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2762, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2763, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2764, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2765, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2766, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2767, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2768, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2769, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2770, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2771, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2772, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2773, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2774, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2775, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2776, name=Woman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2777, name=Black Knight, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=2778, name=Black Knight, level=32, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2779, name=Ranger, level=0, option=[null, Attack, null, null, null], anims=[2728, -1]. +NPC id=2780, name=Solus Dellagar, level=0, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=2781, name=Gnome guard, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=2782, name=Shadow, level=73, option=[null, Attack, null, null, null], anims=[2740, 2737]. +NPC id=2783, name=Dark beast, level=182, option=[null, Attack, null, null, null], anims=[2730, 2729]. +NPC id=2784, name=Mourner, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2785, name=Slave, level=0, option=[null, null, null, null, null], anims=[1728, -1]. +NPC id=2786, name=Slave, level=0, option=[null, null, null, null, null], anims=[830, -1]. +NPC id=2787, name=Slave, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2788, name=null, level=1, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=2789, name=Thorgel, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2790, name=Sergeant Damien, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2791, name=Pillory Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2792, name=Tramp, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2793, name=Tramp, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2794, name=Tramp, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=2795, child npcs=[2796, 2797, 2798, 2799, -1]. +NPC id=2796, name=Skippy, level=0, option=[Talk-To, null, Sober-Up, null, null], anims=[-1, -1]. +NPC id=2797, name=Skippy, level=0, option=[Talk-To, null, Sober-Up, null, null], anims=[-1, -1]. +NPC id=2798, name=Skippy, level=0, option=[Talk-To, null, Sober-Up, null, null], anims=[-1, -1]. +NPC id=2799, name=Skippy, level=0, option=[Talk-To, null, Sober-Up, null, null], anims=[-1, -1]. +NPC id=2800, name=A pile of broken glass, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2801, name=Mogre, level=60, option=[null, Attack, null, null, null], anims=[357, 358]. +NPC id=2802, name=Gnome Coach, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2803, name=Lizard, level=42, option=[null, Attack, null, null, null], anims=[2774, 2775]. +NPC id=2804, name=Desert Lizard, level=24, option=[null, Attack, null, null, null], anims=[2774, 2775]. +NPC id=2805, name=Desert Lizard, level=24, option=[null, Attack, null, null, null], anims=[2774, 2775]. +NPC id=2806, name=Desert Lizard, level=24, option=[null, Attack, null, null, null], anims=[2774, 2775]. +NPC id=2807, name=Small Lizard, level=12, option=[null, Attack, null, null, null], anims=[2774, 2775]. +NPC id=2808, name=Small Lizard, level=12, option=[null, Attack, null, null, null], anims=[2774, 2775]. +NPC id=2809, name=Al the Camel, level=0, option=[Talk-to, null, null, null, null], anims=[51, 45]. +NPC id=2810, name=Elly the Camel, level=0, option=[Talk-to, null, null, null, null], anims=[51, 45]. +NPC id=2811, name=Ollie the Camel, level=0, option=[Talk-to, null, null, null, null], anims=[51, 45]. +NPC id=2812, name=Cam the Camel, level=0, option=[Talk-to, null, null, null, null], anims=[51, 45]. +NPC (wrapper) id=2813, child npcs=[80, 2814, -1]. +NPC id=2814, name=Alice the Camel, level=0, option=[Talk-to, null, null, null, null], anims=[51, 45]. +NPC id=2815, name=Neferti the Camel, level=0, option=[Talk-to, null, null, null, null], anims=[51, 45]. +NPC id=2816, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2817, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2818, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2819, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2820, name=Ali the Smith, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2821, name=Ali the Farmer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2822, name=Ali the Tailor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2823, name=Ali the Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2824, name=Ellis, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=2825, name=Pirate Pete, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=2826, name=Pirate Pete, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=2827, name=Captain Braindeath, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=2828, name=50% Luke, level=0, option=[Talk-to, null, null, null, null], anims=[5586, 5585]. +NPC id=2829, name=Davey, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=2830, name=Captain Donnie, level=0, option=[Talk-to, null, null, null, null], anims=[5656, 5655]. +NPC id=2831, name=Zombie protester, level=0, option=[Talk-to, null, null, null, null], anims=[5584, 5583]. +NPC id=2832, name=Zombie protester, level=0, option=[Talk-to, null, null, null, null], anims=[5584, 5583]. +NPC id=2833, name=Zombie protester, level=0, option=[Talk-to, null, null, null, null], anims=[5584, 5583]. +NPC id=2834, name=Zombie protester, level=0, option=[Talk-to, null, null, null, null], anims=[5584, 5583]. +NPC id=2835, name=Zombie protester, level=0, option=[Talk-to, null, null, null, null], anims=[5584, 5583]. +NPC id=2836, name=Zombie protester, level=0, option=[Talk-to, null, null, null, null], anims=[5584, 5583]. +NPC id=2837, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=2838, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5650, 5652]. +NPC id=2839, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5650, 5652]. +NPC id=2840, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5650, 5652]. +NPC id=2841, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=2842, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=2843, name=Zombie swab, level=55, option=[Talk-to, Attack, Intimidate, null, null], anims=[5646, 5645]. +NPC id=2844, name=Zombie swab, level=55, option=[Talk-to, Attack, Intimidate, null, null], anims=[5646, 5645]. +NPC id=2845, name=Zombie swab, level=55, option=[Talk-to, Attack, Intimidate, null, null], anims=[5650, 5652]. +NPC id=2846, name=Zombie swab, level=55, option=[Talk-to, Attack, Intimidate, null, null], anims=[5650, 5652]. +NPC id=2847, name=Zombie swab, level=55, option=[Talk-to, Attack, Intimidate, null, null], anims=[5646, 5645]. +NPC id=2848, name=Zombie swab, level=55, option=[Talk-to, Attack, Intimidate, null, null], anims=[5646, 5645]. +NPC id=2849, name=Evil spirit, level=150, option=[null, Attack, null, null, null], anims=[2803, 2802]. +NPC id=2850, name=Fever spider, level=49, option=[null, Attack, null, null, null], anims=[5318, 5317]. +NPC id=2851, name=Brewer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2852, name=Brewer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2853, name=Brewer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2854, name=Brewer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2855, name=Brewer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2856, name=Brewer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2857, name=Brewer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2858, name=Brewer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2859, name=Fishing spot, level=0, option=[Fish, null, null, hidden, hidden], anims=[447, 448]. +NPC id=2860, name=Amaethwr, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=2861, name=Teclyn, level=0, option=[Talk-to, null, Exchange, Teleport, null], anims=[808, -1]. +NPC id=2862, name=Death, level=0, option=[null, null, null, null, null], anims=[847, -1]. +NPC id=2863, name=Zombie, level=0, option=[Talk-To, null, Call-Over, null, null], anims=[808, -1]. +NPC id=2864, name=Most of a Zombie, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=2865, name=Most of a Zombie, level=0, option=[Talk-To, null, null, null, null], anims=[2816, 2815]. +NPC id=2866, name=Zombie, level=0, option=[Talk-To, null, Insult, null, null], anims=[808, -1]. +NPC id=2867, name=Most of a Zombie, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=2868, name=Zombie Head, level=0, option=[Catch, Talk-To, null, null, null], anims=[2818, 2818]. +NPC id=2869, name=Zombie, level=0, option=[Talk-To, null, Scare, null, null], anims=[808, -1]. +NPC id=2870, name=Half-Zombie, level=0, option=[Talk-To, null, null, null, null], anims=[2825, 2823]. +NPC id=2871, name=Other Half-Zombie, level=0, option=[Talk-To, null, null, null, null], anims=[2826, 2824]. +NPC id=2872, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2873, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2874, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2875, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2876, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2877, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=2878, name=Zombie, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2879, name=Bardur, level=94, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=2880, name=Dagannoth fledgeling, level=70, option=[null, Attack, null, null, null], anims=[2774, 2775]. +NPC id=2881, name=Dagannoth Supreme, level=303, option=[null, Attack, null, null, null], anims=[2850, 2849]. +NPC id=2882, name=Dagannoth Prime, level=303, option=[null, Attack, null, null, null], anims=[2850, 2849]. +NPC id=2883, name=Dagannoth Rex, level=303, option=[null, Attack, null, null, null], anims=[2850, 2849]. +NPC id=2884, name=Wallasalki, level=98, option=[null, Attack, null, null, null], anims=[2364, 2363]. +NPC id=2885, name=Giant Rock Crab, level=137, option=[null, Attack, null, null, null], anims=[1310, 1311]. +NPC id=2886, name=Boulder, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2887, name=Dagannoth, level=88, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=2888, name=Dagannoth, level=90, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=2889, name=Rock lobster, level=127, option=[null, Attack, null, null, null], anims=[2858, 2857]. +NPC id=2890, name=Rock, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2891, name=Suspicious water, level=34, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2892, name=Spinolyp, level=76, option=[null, Attack, null, null, null], anims=[2867, 2863]. +NPC id=2893, name=Suspicious water, level=34, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2894, name=Spinolyp, level=76, option=[null, Attack, null, null, null], anims=[2867, 2863]. +NPC id=2895, name=Suspicious water, level=34, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2896, name=Spinolyp, level=76, option=[null, Attack, null, null, null], anims=[2867, 2863]. +NPC (wrapper) id=2897, child npcs=[2899, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2899, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2899, -1]. +NPC id=2898, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2899, name=Father Reen, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2900, name=Father Reen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2901, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2902, name=Father Badden, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2903, name=Father Badden, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2904, name=Denath, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2905, name=Denath, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2906, name=Eric, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2907, name=Eric, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2908, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2909, name=Evil Dave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2910, name=Evil Dave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2911, name=Matthew, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2912, name=Matthew, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2913, name=Jennifer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2914, name=Jennifer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2915, name=Tanya, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2916, name=Tanya, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2917, name=Patrick, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2918, name=Patrick, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2919, name=Agrith Naar, level=100, option=[null, Attack, null, null, null], anims=[4675, 4674]. +NPC id=2920, name=null, level=1, option=[null, null, null, null, null], anims=[2882, 2882]. +NPC id=2921, name=Sand storm, level=0, option=[null, null, null, null, null], anims=[2882, 2882]. +NPC id=2922, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2923, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2924, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2925, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=2926, name=null, level=1, option=[null, null, null, null, null], anims=[1913, 1912]. +NPC id=2927, name=Clay golem, level=0, option=[Talk-to, null, null, null, null], anims=[1913, 1912]. +NPC id=2928, name=Clay golem, level=0, option=[Talk-to, null, null, null, null], anims=[1913, 1912]. +NPC id=2929, name=null, level=2, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=2930, name=null, level=0, option=[null, null, null, null, null], anims=[-1, 5531]. +NPC id=2931, name=Ghost, level=0, option=[null, null, null, null, null], anims=[5530, 5531]. +NPC id=2932, name=Jorral, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=2933, child npcs=[2935, -1]. +NPC id=2934, name=Melina, level=0, option=[null, null, null, null, null], anims=[2893, -1]. +NPC id=2935, name=Melina, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=2936, child npcs=[2938, -1]. +NPC id=2937, name=Droalak, level=0, option=[null, null, null, null, null], anims=[2893, -1]. +NPC id=2938, name=Droalak, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=2939, name=Dron, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2940, name=Blanin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2941, name=The Beast, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=2942, name=Bellemorde, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=2943, name=Pox, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=2944, name=Pox, level=0, option=[null, hidden, null, null, null], anims=[9158, 9157]. +NPC id=2945, name=Bones, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9156]. +NPC id=2946, name=Grimesquit, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2947, name=Phingspet, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2948, name=Hooknosed Jack, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2949, name=Jimmy Dazzler, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2950, name=The Face, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2951, name=Felkrash, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=2952, name=Smokin' Joe, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2953, name=Ceril Carnillean, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2954, name=Councillor Halgrive, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2955, name=Spice seller, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2956, name=Fur trader, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2957, name=Gem merchant, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2958, name=Silver merchant, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2959, name=Silk merchant, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2960, name=Zenesha, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2961, name=Ali Morrisane, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2962, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2963, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2964, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2965, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2966, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2967, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2968, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2969, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2970, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2971, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2972, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=2973, name=Guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=2974, child npcs=[2980, -1]. +NPC (wrapper) id=2975, child npcs=[2980, -1]. +NPC (wrapper) id=2976, child npcs=[2980, -1]. +NPC (wrapper) id=2977, child npcs=[2980, -1]. +NPC (wrapper) id=2978, child npcs=[2980, -1]. +NPC (wrapper) id=2979, child npcs=[2980, -1]. +NPC id=2980, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[-1, -1]. +NPC id=2981, name=Rat, level=0, option=[null, Attack, null, null, null], anims=[2704, 2703]. +NPC id=2982, name=King rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=2983, name=Turbogroomer, level=0, option=[null, hidden, null, null, null], anims=[9158, 9157]. +NPC id=2984, name=Pusskins, level=0, option=[null, hidden, null, null, null], anims=[9158, 9157]. +NPC id=2985, name=Loki, level=0, option=[null, Hidden, null, null, null], anims=[9158, 9157]. +NPC id=2986, name=Captain Tom, level=0, option=[null, hidden, null, null, null], anims=[9158, 9157]. +NPC id=2987, name=Treacle, level=0, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=2988, name=Mittens, level=0, option=[null, Hidden, null, null, null], anims=[9158, 9157]. +NPC id=2989, name=Claude, level=0, option=[null, Hidden, null, null, null], anims=[9158, 9156]. +NPC id=2990, name=Topsy, level=0, option=[null, Hidden, null, null, null], anims=[9158, 9156]. +NPC id=2991, name=Rauborn, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2992, name=Vaeringk, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2993, name=Oxi, level=0, option=[Talk-to, null, null, null, null], anims=[2155, 2154]. +NPC id=2994, name=Fior, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2995, name=Sagira, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2996, name=Anleif, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=2997, name=Gertrude's cat, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=2998, name=Gambler, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=2999, name=Gambler, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3000, name=Barman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3001, name=Gambler, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3002, name=Gambler, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3003, name=Gambler, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3004, name=Gambler, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3005, name=Gambler, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3006, name=Gambler, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3007, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3008, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3009, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3010, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3011, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3012, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3013, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3014, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3015, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3016, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3017, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3018, name=Rat, level=0, option=[null, Hidden, null, null, null], anims=[2704, 2703]. +NPC id=3019, name=Fishing spot, level=0, option=[Lure, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=3020, name=Rug Merchant, level=0, option=[Talk-to, null, Travel, null, null], anims=[808, -1]. +NPC id=3021, name=Tool leprechaun, level=0, option=[Talk-to, null, Exchange, Teleport, null], anims=[2904, 189]. +NPC id=3022, name=Genie, level=0, option=[Talk-to, null, null, null, null], anims=[792, -1]. +NPC id=3023, name=Nirrie, level=0, option=[Talk-to, null, null, null, null], anims=[2906, 2907]. +NPC id=3024, name=Tirrie, level=0, option=[Talk-to, null, null, null, null], anims=[2908, 2907]. +NPC id=3025, name=Hallak, level=0, option=[Talk-to, null, null, null, null], anims=[2906, 2907]. +NPC id=3026, name=Black golem, level=75, option=[null, Attack, null, null, null], anims=[1913, 1912]. +NPC id=3027, name=White golem, level=75, option=[null, Attack, null, null, null], anims=[1913, 1912]. +NPC id=3028, name=Grey golem, level=75, option=[null, Attack, null, null, null], anims=[1913, 1912]. +NPC id=3029, name=Ghaslor the Elder, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3030, name=Ali the Carter, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3031, name=Usi, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3032, name=Nkuku, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3033, name=Garai, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3034, name=Habibah, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3035, name=Meskhenet, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3036, name=Zahra, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3037, name=Zahur, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3038, name=Seddu, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3039, name=Kazemde, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3040, name=Awusah the Mayor, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3041, name=Tarik, level=21, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=3042, name=Poltenip, level=21, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=3043, name=Radat, level=21, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=3044, name=Shiratti the Custodian, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3045, name=Rokuh, level=0, option=[Talk-to, null, Trade, null, null], anims=[2911, 2912]. +NPC id=3046, name=Nardah Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=3047, name=Target, level=0, option=[null, Shoot, null, null, null], anims=[-1, -1]. +NPC id=3048, name=Target, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=3049, child npcs=[3047, 3048, -1]. +NPC id=3050, name=Larxus, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3051, name=Mystery figure, level=0, option=[null, null, null, null, null], anims=[2939, -1]. +NPC id=3052, name=Mystery figure, level=0, option=[null, null, null, null, null], anims=[2942, -1]. +NPC id=3053, name=Mystery figure, level=0, option=[null, null, null, null, null], anims=[2943, 189]. +NPC id=3054, name=Mystery figure, level=0, option=[null, null, null, null, null], anims=[9299, 9299]. +NPC id=3055, name=Mystery figure, level=0, option=[null, null, null, null, null], anims=[6542, -1]. +NPC id=3056, name=Mystery figure, level=0, option=[null, null, null, null, null], anims=[2940, -1]. +NPC id=3057, name=Earth Warrior Champion, level=102, option=[null, Attack, null, null, null], anims=[2945, -1]. +NPC id=3058, name=Giant Champion, level=56, option=[null, Attack, null, null, null], anims=[6371, 6372]. +NPC id=3059, name=Ghoul Champion, level=85, option=[null, Attack, null, null, null], anims=[1275, -1]. +NPC id=3060, name=Goblin Champion, level=24, option=[null, Attack, null, null, null], anims=[6139, 6138]. +NPC id=3061, name=Hobgoblin Champion, level=56, option=[null, Attack, null, null, null], anims=[2958, 162]. +NPC id=3062, name=Imp Champion, level=14, option=[null, Attack, null, null, null], anims=[171, 168]. +NPC id=3063, name=Jogre Champion, level=107, option=[null, Attack, null, null, null], anims=[2931, 2932]. +NPC id=3064, name=Lesser Demon Champion, level=162, option=[null, Attack, null, null, null], anims=[4675, 4674]. +NPC id=3065, name=Skeleton Champion, level=40, option=[null, Attack, null, null, null], anims=[5510, 5511]. +NPC id=3066, name=Zombies Champion, level=51, option=[null, Attack, null, null, null], anims=[5573, 5582]. +NPC id=3067, name=Leon d'Cour, level=141, option=[null, Attack, null, null, null], anims=[2561, -1]. +NPC id=3068, name=Skeletal Wyvern, level=140, option=[null, Attack, null, null, null], anims=[2984, 2982]. +NPC id=3069, name=Skeletal Wyvern, level=140, option=[null, Attack, null, null, null], anims=[2984, 2982]. +NPC id=3070, name=Skeletal Wyvern, level=140, option=[null, Attack, null, null, null], anims=[2984, 2982]. +NPC id=3071, name=Skeletal Wyvern, level=140, option=[null, Attack, null, null, null], anims=[2984, 2982]. +NPC id=3072, name=Ice giant, level=53, option=[null, Attack, null, null, null], anims=[4670, 4669]. +NPC id=3073, name=Ice warrior, level=57, option=[null, Attack, null, null, null], anims=[842, 841]. +NPC (wrapper) id=3074, child npcs=[3075, -1]. +NPC id=3075, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3076, name=null, level=1, option=[null, null, null, null, null], anims=[2995, -1]. +NPC id=3077, name=Dead Monk, level=0, option=[Search, null, null, null, null], anims=[-1, -1]. +NPC id=3078, name=High Priest, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3079, name=Monk, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=3080, name=Monk, level=0, option=[null, null, null, null, null], anims=[2993, 2994]. +NPC id=3081, name=Assassin, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=3082, name=Rosie, level=0, option=[Talk-to, null, null, null, null], anims=[3008, 3012]. +NPC id=3083, name=Sorcha, level=0, option=[Talk-to, null, null, null, null], anims=[3008, 3012]. +NPC id=3084, name=Cait, level=0, option=[Talk-to, null, null, null, null], anims=[3008, 3012]. +NPC id=3085, name=Cormac, level=0, option=[Talk-to, null, null, null, null], anims=[3008, 3012]. +NPC id=3086, name=Fionn, level=0, option=[Talk-to, null, null, null, null], anims=[3008, 3012]. +NPC id=3087, name=Donnacha, level=0, option=[Talk-to, null, null, null, null], anims=[3008, 3012]. +NPC id=3088, name=Ronan, level=0, option=[Talk-to, null, null, null, null], anims=[3008, 3012]. +NPC id=3089, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3090, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3091, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3092, name=Hooded Stranger, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3093, name=null, level=0, option=[null, null, null, null, null], anims=[663, 663]. +NPC id=3094, name=Flying Book, level=0, option=[null, null, null, null, null], anims=[3023, 3023]. +NPC id=3095, name=Flying Book, level=0, option=[null, null, null, null, null], anims=[3023, 3023]. +NPC id=3096, name=Pizzaz Hat, level=1, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3097, name=Entrance Guardian, level=0, option=[Talk-to, null, null, null, null], anims=[3033, 3034]. +NPC id=3098, name=Telekinetic Guardian, level=0, option=[Talk-to, null, null, null, null], anims=[3033, 3034]. +NPC id=3099, name=Alchemy Guardian, level=0, option=[Talk-to, null, null, null, null], anims=[3033, 3035]. +NPC id=3100, name=Enchantment Guardian, level=0, option=[Talk-to, null, null, null, null], anims=[3033, 3034]. +NPC id=3101, name=Graveyard Guardian, level=0, option=[Talk-to, null, null, null, null], anims=[3033, 3035]. +NPC id=3102, name=Maze Guardian, level=0, option=[Talk-to, null, null, null, null], anims=[3033, 3034]. +NPC id=3103, name=Rewards Guardian, level=0, option=[Talk-to, null, null, Trade-with, null], anims=[3033, 3035]. +NPC id=3104, name=Charmed Warrior, level=0, option=[Talk-to, null, null, null, null], anims=[3026, 3027]. +NPC id=3105, name=Charmed Warrior, level=0, option=[Talk-to, null, null, null, null], anims=[3026, 3027]. +NPC id=3106, name=Charmed Warrior, level=0, option=[Talk-to, null, null, null, null], anims=[3026, 3027]. +NPC id=3107, name=Charmed Warrior, level=0, option=[Talk-to, null, null, null, null], anims=[3026, 3027]. +NPC id=3108, name=Bert, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3109, name=Guard Captain, level=0, option=[Talk-to, null, null, null, null], anims=[3040, -1]. +NPC (wrapper) id=3110, child npcs=[3112, -1]. +NPC id=3111, name=null, level=1, option=[null, null, null, null, null], anims=[3036, -1]. +NPC id=3112, name=Sandy, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=3113, name=Sandy, level=0, option=[null, null, null, null, null], anims=[3036, -1]. +NPC id=3114, name=Mazion, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3115, name=Blaec, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3116, name=Reeso, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3117, name=Sandwich lady, level=0, option=[Talk-to, null, null, null, null], anims=[3043, 3042]. +NPC id=3118, name=Prison Pete, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3119, name=Balloon Animal, level=0, option=[Pop, null, null, null, null], anims=[3049, 3048]. +NPC id=3120, name=Balloon Animal, level=0, option=[Pop, null, null, null, null], anims=[3049, 3050]. +NPC id=3121, name=Balloon Animal, level=0, option=[Pop, null, null, null, null], anims=[3049, 3048]. +NPC id=3122, name=Balloon Animal, level=0, option=[Pop, null, null, null, null], anims=[3049, 3048]. +NPC id=3123, name=Simon Templeton, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3124, name=Pyramid block, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3125, name=Pyramid block, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3126, name=Pentyn, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3127, name=Aristarchus, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=3128, child npcs=[3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3129, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3130, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3130, -1, -1, -1, -1, 3130, -1, -1, -1, -1, 3130, -1]. +NPC id=3129, name=Boneguard, level=0, option=[null, Talk-to, null, null, null], anims=[3073, 3078]. +NPC id=3130, name=Pile of bones, level=0, option=[Climb-over, null, null, null, null], anims=[-1, -1]. +NPC id=3131, name=Desert Spirit, level=0, option=[Talk-to, null, null, null, null], anims=[2334, 2333]. +NPC (wrapper) id=3132, child npcs=[3133, -1]. +NPC id=3133, name=Crust of ice, level=0, option=[null, Melt, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=3134, child npcs=[3135, -1]. +NPC id=3135, name=Furnace grate, level=0, option=[null, Clear, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=3136, child npcs=[3137, 3138, -1]. +NPC id=3137, name=Enakhra, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3138, name=Enakhra, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=3139, child npcs=[3140, 3141, 3142, -1]. +NPC id=3140, name=Boneguard, level=0, option=[Talk-to, null, null, null, null], anims=[3073, 3078]. +NPC id=3141, name=Akthanakos, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3142, name=Akthanakos, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=3143, child npcs=[3147, -1]. +NPC id=3144, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=3145, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=3146, name=null, level=1, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=3147, name=Lazim, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3148, name=Enakhra, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3149, name=Akthanakos, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3150, name=Knight, level=0, option=[null, null, null, null, null], anims=[2561, -1]. +NPC id=3151, name=Skeleton, level=1, option=[null, null, null, null, null], anims=[5483, 5479]. +NPC (wrapper) id=3152, child npcs=[3140, 3141, 3142, -1]. +NPC id=3153, name=Harpie Bug Swarm, level=46, option=[null, Attack, null, null, null], anims=[3108, 3108]. +NPC id=3154, name=Count Draynor, level=34, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3155, name=Bill Teach, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3156, name=Bill Teach, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3157, name=Bill Teach, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3158, name=Bill Teach, level=0, option=[Talk-to, null, Return-Home, null, null], anims=[7188, -1]. +NPC id=3159, name=Bill Teach, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3160, name=Bill Teach, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3161, name=Charley, level=0, option=[Talk-to, null, Trade, null, null], anims=[7188, -1]. +NPC id=3162, name=Smith, level=0, option=[Talk-to, null, Trade, null, null], anims=[7188, -1]. +NPC id=3163, name=Joe, level=0, option=[Talk-to, null, Trade, null, null], anims=[7188, -1]. +NPC id=3164, name=Mama, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3165, name=Mama, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3166, name=Mike, level=0, option=[Talk-to, null, Trade, null, null], anims=[7188, -1]. +NPC id=3167, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3168, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3169, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3170, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3171, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3172, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3173, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3174, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3175, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3176, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3177, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3178, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3179, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3180, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3181, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3182, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3183, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3184, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3185, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3186, name=Pirate, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=3187, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3188, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3189, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3190, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3191, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3192, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3193, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3194, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3195, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3196, name=Pirate, level=57, option=[Talk-To, Attack, null, null, null], anims=[7188, -1]. +NPC id=3197, name=Gull, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=3198, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=3199, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=3200, name=Chaos Elemental, level=305, option=[null, Attack, null, null, null], anims=[3144, 3145]. +NPC id=3201, name=Killerwatt, level=55, option=[null, Attack, null, null, null], anims=[3160, 3161]. +NPC id=3202, name=Killerwatt, level=55, option=[null, Attack, null, null, null], anims=[3159, 3159]. +NPC id=3203, name=Storm Cloud, level=0, option=[null, null, null, null, null], anims=[3169, 3169]. +NPC id=3204, name=Storm Cloud, level=0, option=[null, null, null, null, null], anims=[3168, 3167]. +NPC id=3205, name=Romily Weaklax, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3206, name=Priest, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3207, name=Pious Pete, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3208, name=Taper, level=0, option=[null, null, null, null, null], anims=[3183, 3183]. +NPC id=3209, name=Elena, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3210, name=Alrena, level=0, option=[Talk-to, null, null, null, null], anims=[3185, -1]. +NPC id=3211, name=Alrena, level=0, option=[Talk-to, null, null, null, null], anims=[364, -1]. +NPC id=3212, name=Bravek, level=0, option=[Talk-to, null, null, null, null], anims=[3186, -1]. +NPC (wrapper) id=3213, child npcs=[714, -1]. +NPC id=3214, name=null, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=3215, name=Elena, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3216, name=Mourner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3217, name=Kaylee, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3218, name=Tina, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3219, name=Dwarf, level=11, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3220, name=Dwarf, level=11, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3221, name=Dwarf, level=10, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3222, name=Drunken man, level=3, option=[Talk-to, Attack, Pickpocket, null, null], anims=[2770, 2769]. +NPC id=3223, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3224, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3225, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[813, -1]. +NPC id=3226, name=Woman, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3227, name=Woman, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3228, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3229, name=Guard, level=22, option=[null, Attack, Pickpocket, null, null], anims=[4591, -1]. +NPC id=3230, name=Guard, level=19, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3231, name=Guard, level=22, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3232, name=Guard, level=22, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3233, name=Guard, level=22, option=[null, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3234, name=Gardener, level=3, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=3235, name=Apprentice workman, level=0, option=[Talk-to, null, null, null, null], anims=[808, 819]. +NPC id=3236, name=Workman, level=0, option=[Talk-to, null, null, null, null], anims=[808, 819]. +NPC id=3237, name=Cuffs, level=3, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3238, name=Narf, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3239, name=Rusty, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3240, name=Jeff, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3241, name=Guard, level=19, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3242, name=Dark wizard, level=23, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3243, name=Dark wizard, level=22, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3244, name=Dark wizard, level=11, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3245, name=Dark wizard, level=11, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3246, name=Barbarian, level=17, option=[Talk-to, Attack, null, null, null], anims=[2065, 2064]. +NPC id=3247, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[2561, -1]. +NPC id=3248, name=Barbarian, level=17, option=[Talk-to, Attack, null, null, null], anims=[2065, 2064]. +NPC id=3249, name=Barbarian, level=17, option=[Talk-to, Attack, null, null, null], anims=[2561, -1]. +NPC id=3250, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[2065, 2064]. +NPC id=3251, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[2561, -1]. +NPC id=3252, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[2065, 2064]. +NPC id=3253, name=Barbarian, level=17, option=[Talk-to, Attack, null, null, null], anims=[2561, -1]. +NPC id=3254, name=Hunding, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3255, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[2561, -1]. +NPC id=3256, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[2561, -1]. +NPC id=3257, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[2065, 2064]. +NPC id=3258, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[2561, -1]. +NPC id=3259, name=Barbarian, level=15, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=3260, name=Barbarian, level=17, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=3261, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=3262, name=Barbarian, level=10, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=3263, name=Barbarian, level=9, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=3264, name=Goblin, level=5, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=3265, name=Goblin, level=5, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=3266, name=Goblin, level=5, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=3267, name=Goblin, level=5, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=3268, name=Dwarf, level=11, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3269, name=Dwarf, level=11, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3270, name=Dwarf, level=11, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3271, name=Dwarf, level=11, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3272, name=Dwarf, level=10, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3273, name=Dwarf, level=11, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3274, name=Dwarf, level=11, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3275, name=Dwarf, level=7, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3276, name=Black Guard, level=25, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3277, name=Black Guard, level=25, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3278, name=Black Guard, level=25, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3279, name=Black Guard, level=25, option=[null, Attack, null, null, null], anims=[101, 98]. +NPC id=3280, name=Engineering assistant, level=0, option=[null, null, null, null, null], anims=[3208, 3207]. +NPC id=3281, name=Engineering assistant, level=0, option=[null, null, null, null, null], anims=[3208, 3207]. +NPC id=3282, name=Engineer, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=3283, name=Squirrel, level=0, option=[null, null, null, null, null], anims=[3211, 3210]. +NPC id=3284, name=Squirrel, level=0, option=[null, null, null, null, null], anims=[3212, 3210]. +NPC id=3285, name=Squirrel, level=0, option=[null, null, null, null, null], anims=[3212, 3210]. +NPC id=3286, name=Raccoon, level=0, option=[null, null, null, null, null], anims=[7718, 7719]. +NPC id=3287, name=Raccoon, level=0, option=[null, null, null, null, null], anims=[7718, 7719]. +NPC id=3288, name=Raccoon, level=0, option=[null, null, null, null, null], anims=[7718, 7719]. +NPC id=3289, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=3290, child npcs=[288, 288, 288, -1]. +NPC id=3291, name=Skeleton, level=22, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=3292, name=Witch, level=25, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3293, name=null, level=0, option=[null, null, null, null, null], anims=[-1, 3220]. +NPC id=3294, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=3295, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=3296, name=Swan, level=0, option=[null, null, null, null, null], anims=[3242, 3241]. +NPC id=3297, name=Black swan, level=0, option=[null, null, null, null, null], anims=[3242, 3241]. +NPC id=3298, name=Sweeper, level=0, option=[null, null, null, null, null], anims=[3244, 3245]. +NPC id=3299, name=Martin the Master Gardener, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=3300, name=Frog, level=0, option=[Talk-to, null, null, null, null], anims=[1796, 1797]. +NPC id=3301, name=Storm cloud, level=0, option=[null, null, null, null, null], anims=[3169, 3169]. +NPC id=3302, name=Co-ordinator, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=3303, name=Fairy Nuff, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=3304, name=Fairy Godfather, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3305, name=Slim Louie, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3306, name=Fat Rocco, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3307, name=Gatekeeper, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3308, name=Zandar Horfyre, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3309, name=Cow, level=2, option=[Talk-to, Attack, null, null, null], anims=[5852, 5848]. +NPC id=3310, name=Sheep, level=0, option=[Talk-to, null, null, null, null], anims=[5335, 5334]. +NPC id=3311, name=Sheep, level=0, option=[Talk-to, null, null, null, null], anims=[5339, 5340]. +NPC id=3312, name=Zanaris choir, level=0, option=[Talk-to, null, null, null, null], anims=[3252, 3253]. +NPC id=3313, name=Tanglefoot, level=111, option=[null, Attack, null, null, null], anims=[3259, 3261]. +NPC (wrapper) id=3314, child npcs=[653, -1]. +NPC id=3315, name=null, level=1, option=[null, null, null, null, null], anims=[3248, 3249]. +NPC id=3316, name=null, level=1, option=[null, null, null, null, null], anims=[3248, 3249]. +NPC id=3317, name=null, level=1, option=[null, null, null, null, null], anims=[3248, 3249]. +NPC id=3318, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3319, name=Baby tanglefoot, level=45, option=[null, Attack, null, null, null], anims=[3259, 3261]. +NPC id=3320, name=Baby tanglefoot, level=45, option=[null, Attack, null, null, null], anims=[3259, 3261]. +NPC id=3321, name=Gatekeeper, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3322, name=Fairy chef, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC (wrapper) id=3323, child npcs=[637, -1, 637, -1]. +NPC id=3324, name=Draul Leptoc, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3325, name=Phillipa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3326, name=Martina Scorsby, level=0, option=[null, null, null, null, null], anims=[3281, -1]. +NPC id=3327, name=Jeremy Clerksin, level=0, option=[null, null, null, null, null], anims=[3282, -1]. +NPC id=3328, name=Tarquin, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=3329, name=Sigurd, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=3330, name=Hari, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=3331, name=Barfy Bill, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=3332, name=Trees, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3333, name=Trees, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3334, name=Cavemouth, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3335, name=Bullrush, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3336, name=Bullrush, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3337, name=Cave Scenery, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3338, name=Cave Scenery, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3339, name=Cave Scenery, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3340, name=Giant Mole, level=230, option=[null, Attack, null, null, null], anims=[3309, 3313]. +NPC id=3341, name=Baby Mole, level=0, option=[null, null, null, null, null], anims=[3309, 3313]. +NPC id=3342, name=Baby Mole, level=0, option=[null, null, null, null, null], anims=[3309, 3313]. +NPC id=3343, name=Baby Mole, level=0, option=[null, null, null, null, null], anims=[3309, 3313]. +NPC id=3344, name=Fungi, level=74, option=[Pick, null, Hidden, null, null], anims=[3328, 3328]. +NPC id=3345, name=Fungi, level=86, option=[Pick, null, Hidden, null, null], anims=[3328, 3328]. +NPC id=3346, name=Zygomite, level=74, option=[null, Attack, Hidden, null, null], anims=[3324, 3323]. +NPC id=3347, name=Zygomite, level=86, option=[null, Attack, Hidden, null, null], anims=[3324, 3322]. +NPC id=3348, name=White Knight, level=38, option=[null, Attack, null, null, null], anims=[7047, -1]. +NPC id=3349, name=White Knight, level=39, option=[null, Attack, null, null, null], anims=[7047, -1]. +NPC id=3350, name=White Knight, level=42, option=[null, Attack, null, null, null], anims=[7047, -1]. +NPC id=3351, name=Genie, level=0, option=[Talk-to, null, null, null, null], anims=[792, 792]. +NPC id=3352, name=Mysterious Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3353, name=Swarm, level=0, option=[null, null, null, null, null], anims=[0, 0]. +NPC id=3354, name=Cap'n Hand, level=0, option=[Talk-to, null, null, null, null], anims=[7199, -1]. +NPC id=3355, name=Rick Turpentine, level=0, option=[Talk-to, null, null, null, null], anims=[4591, -1]. +NPC id=3356, name=Niles, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3357, name=Miles, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3358, name=Giles, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3359, name=Dr Jekyll, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3360, name=Mr Hyde, level=14, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3361, name=Mr Hyde, level=29, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3362, name=Mr Hyde, level=49, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3363, name=Mr Hyde, level=79, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3364, name=Mr Hyde, level=120, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3365, name=Mr Hyde, level=159, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3366, name=Evil Chicken, level=19, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=3367, name=Evil Chicken, level=38, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=3368, name=Evil Chicken, level=69, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=3369, name=Evil Chicken, level=81, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=3370, name=Evil Chicken, level=121, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=3371, name=Evil Chicken, level=159, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=3372, name=Sir Amik Varze, level=0, option=[Talk-to, null, null, null, null], anims=[3396, 3396]. +NPC id=3373, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3374, name=Sir Amik Varze, level=0, option=[Inspect, null, null, null, null], anims=[3371, 3371]. +NPC id=3375, name=Evil Chicken, level=159, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC id=3376, name=Baby black dragon, level=83, option=[null, Attack, null, null, null], anims=[27, 21]. +NPC id=3377, name=K'klik, level=0, option=[null, null, null, null, null], anims=[3346, -1]. +NPC id=3378, name=Evil Dave, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=3379, child npcs=[3380, 3380, 3380, 3380, 3380, -1]. +NPC id=3380, name=Evil Dave, level=0, option=[Inspect, null, null, null, null], anims=[3396, 3396]. +NPC id=3381, name=Doris, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3382, name=Hell-Rat, level=0, option=[null, null, null, null, null], anims=[2704, 2703]. +NPC id=3383, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3384, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3385, name=Gypsy, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3386, name=Gypsy, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3387, name=Culinaromancer, level=0, option=[null, null, null, null, null], anims=[3365, 3365]. +NPC id=3388, name=Osman, level=0, option=[null, null, null, null, null], anims=[3396, 3396]. +NPC id=3389, name=Pirate Pete, level=0, option=[null, null, null, null, null], anims=[3396, 3396]. +NPC id=3390, name=Mountain Dwarf, level=0, option=[null, null, null, null, null], anims=[3379, 3379]. +NPC id=3391, name=General Wartface, level=0, option=[null, null, null, null, null], anims=[3390, 3390]. +NPC id=3392, name=General Bentnoze, level=0, option=[null, null, null, null, null], anims=[7262, 7262]. +NPC id=3393, name=Lumbridge Guide, level=0, option=[null, null, null, null, null], anims=[3396, 3396]. +NPC id=3394, name=Evil Dave, level=0, option=[null, null, null, null, null], anims=[3396, 3396]. +NPC id=3395, name=Sir Amik Varze, level=0, option=[null, null, null, null, null], anims=[3396, 3396]. +NPC id=3396, name=Awowogei, level=0, option=[null, null, null, null, null], anims=[3395, 3395]. +NPC id=3397, name=Awowogei, level=0, option=[null, null, null, null, null], anims=[1386, 1380]. +NPC id=3398, name=Skrach Uglogwee, level=0, option=[null, null, null, null, null], anims=[3383, 3383]. +NPC id=3399, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3400, name=Culinaromancer, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=3401, child npcs=[3402, 3403, -1]. +NPC id=3402, name=An old Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3403, name=Rohak, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3404, name=null, level=1, option=[null, null, null, null, null], anims=[900, 104]. +NPC id=3405, name=Rohak, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3406, name=Icefiend, level=18, option=[null, Attack, null, null, null], anims=[8077, 8076]. +NPC id=3407, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[7222, 7223]. +NPC id=3408, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[7217, 7216]. +NPC id=3409, name=Wild jade vine, level=167, option=[null, Attack, null, null, null], anims=[7245, -1]. +NPC id=3410, name=Wild jade vine, level=167, option=[null, Attack, null, null, null], anims=[7245, -1]. +NPC id=3411, name=Wild jade vine, level=167, option=[null, Attack, null, null, null], anims=[7245, -1]. +NPC id=3412, name=Wild jade vine, level=167, option=[null, Attack, null, null, null], anims=[7245, -1]. +NPC id=3413, name=Goblin Cook, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=3414, name=Goblin Cook, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=3415, name=Goblin Cook, level=0, option=[null, null, null, null, null], anims=[3401, 3401]. +NPC id=3416, name=Pirate Pete, level=0, option=[Talk-to, null, null, null, null], anims=[3396, 3396]. +NPC id=3417, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3418, name=Pirate Pete, level=0, option=[Inspect, null, null, null, null], anims=[3374, 3374]. +NPC id=3419, name=Mogre Guard, level=0, option=[Talk-to, null, null, null, null], anims=[3436, 3437]. +NPC id=3420, name=Nung, level=0, option=[Talk-to, null, null, null, null], anims=[3436, 3437]. +NPC id=3421, name=Crab, level=23, option=[null, Attack, null, null, null], anims=[3424, 3426]. +NPC id=3422, name=Mudskipper, level=30, option=[null, Attack, null, null, null], anims=[3431, 3432]. +NPC id=3423, name=Mudskipper, level=31, option=[null, Attack, null, null, null], anims=[3431, 3432]. +NPC id=3424, name=Crab, level=21, option=[null, Attack, null, null, null], anims=[3424, 3426]. +NPC id=3425, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3426, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3427, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3428, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3429, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3430, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3431, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3432, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3433, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3434, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3435, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3436, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3437, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3438, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3439, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3440, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3441, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3442, name=Fish, level=0, option=[null, null, null, null, null], anims=[3442, 3441]. +NPC id=3443, name=Fish, level=0, option=[null, null, null, null, null], anims=[3444, 3443]. +NPC id=3444, name=Fish, level=0, option=[null, null, null, null, null], anims=[3444, 3443]. +NPC id=3445, name=Fish, level=0, option=[null, null, null, null, null], anims=[3444, 3443]. +NPC id=3446, name=Fish, level=0, option=[null, null, null, null, null], anims=[3444, 3443]. +NPC id=3447, name=Fish, level=0, option=[null, null, null, null, null], anims=[3444, 3443]. +NPC id=3448, name=Fish, level=0, option=[null, null, null, null, null], anims=[3444, 3443]. +NPC id=3449, name=Lumbridge Guide, level=0, option=[Talk-to, null, null, null, null], anims=[3396, 3396]. +NPC id=3450, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3451, name=Lumbridge Guide, level=0, option=[Inspect, null, null, null, null], anims=[3362, 3362]. +NPC id=3452, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3453, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3454, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3455, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3456, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3457, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3458, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3459, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3460, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3461, name=? ? ? ?, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3462, name=null, level=0, option=[null, null, null, null, null], anims=[357, 358]. +NPC id=3463, name=Skrach Uglogwee, level=0, option=[Inspect, null, null, null, null], anims=[357, 358]. +NPC id=3464, name=Skrach Uglogwee, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=3465, name=null, level=1, option=[null, null, null, null, null], anims=[357, 358]. +NPC id=3466, name=Rantz, level=0, option=[Talk-to, null, null, null, null], anims=[357, 358]. +NPC id=3467, name=Rantz, level=1, option=[Talk-to, null, null, null, null], anims=[3460, 3460]. +NPC id=3468, name=Rantz, level=1, option=[Talk-to, null, null, null, null], anims=[3462, 3462]. +NPC id=3469, name=null, level=1, option=[null, null, null, null, null], anims=[3473, 3474]. +NPC id=3470, name=null, level=1, option=[null, null, null, null, null], anims=[3473, 3474]. +NPC id=3471, name=Ogre boat, level=0, option=[Board, null, null, null, null], anims=[3473, 3474]. +NPC id=3472, name=Ogre boat, level=0, option=[Board, null, null, null, null], anims=[3473, 3474]. +NPC id=3473, name=Balloon Toad, level=0, option=[null, null, null, null, null], anims=[3469, 3469]. +NPC id=3474, name=Balloon Toad, level=0, option=[null, null, null, null, null], anims=[3469, 3469]. +NPC id=3475, name=Balloon Toad, level=0, option=[null, null, null, null, null], anims=[3472, 3472]. +NPC id=3476, name=Jubbly bird, level=9, option=[null, null, null, null, Attack], anims=[6803, 6804]. +NPC id=3477, name=Jubbly bird, level=0, option=[null, null, null, Pluck, null], anims=[6807, 6807]. +NPC id=3478, name=King Awowogei, level=0, option=[Talk-to, null, null, null, null], anims=[1386, 1380]. +NPC id=3479, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3480, name=King Awowogei, level=0, option=[Inspect, null, null, null, null], anims=[1386, 1380]. +NPC id=3481, name=Mizaru, level=0, option=[Talk-to, null, null, null, null], anims=[3525, -1]. +NPC id=3482, name=Kikazaru, level=0, option=[Talk-to, null, null, null, null], anims=[3523, -1]. +NPC id=3483, name=Iwazaru, level=0, option=[Talk-to, null, null, null, null], anims=[3524, -1]. +NPC id=3484, name=Big Snake, level=84, option=[null, Attack, null, null, null], anims=[3535, 3537]. +NPC id=3485, name=Culinaromancer, level=0, option=[null, null, null, null, null], anims=[3846, -1]. +NPC id=3486, name=Culinaromancer, level=0, option=[null, null, null, null, null], anims=[3846, -1]. +NPC id=3487, name=Culinaromancer, level=0, option=[null, null, null, null, null], anims=[3846, -1]. +NPC id=3488, name=Culinaromancer, level=0, option=[null, null, null, null, null], anims=[3846, -1]. +NPC id=3489, name=Culinaromancer, level=0, option=[null, null, null, null, null], anims=[3846, -1]. +NPC id=3490, name=Culinaromancer, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3491, name=Culinaromancer, level=75, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3492, name=Culinaromancer, level=0, option=[null, null, null, null, null], anims=[3357, -1]. +NPC id=3493, name=Agrith-Na-Na, level=146, option=[null, Attack, null, null, null], anims=[3498, 3499]. +NPC id=3494, name=Flambeed, level=149, option=[null, Attack, null, null, null], anims=[1749, 1748]. +NPC id=3495, name=Karamel, level=136, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3496, name=Dessourt, level=121, option=[null, Attack, null, null, null], anims=[3504, 3506]. +NPC id=3497, name=Gelatinnoth Mother, level=130, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=3498, name=Gelatinnoth Mother, level=130, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=3499, name=Gelatinnoth Mother, level=130, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=3500, name=Gelatinnoth Mother, level=130, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=3501, name=Gelatinnoth Mother, level=130, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=3502, name=Gelatinnoth Mother, level=130, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=3503, name=Overgrown hellcat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=3504, name=Hellcat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=3505, name=Hell-kitten, level=0, option=[Pick-up, Hidden, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=3506, name=Lazy hellcat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=3507, name=Wily hellcat, level=0, option=[Pick-up, null, Talk-to, Interact-with, null], anims=[9158, 9157]. +NPC id=3508, name=Leo, level=0, option=[Talk-to, null, null, null, null], anims=[2561, 2562]. +NPC id=3509, name=Sorin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3510, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3511, name=Wiskit, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3512, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3513, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3514, name=Vampyre Juvinate, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3515, name=Vampyre Juvinate, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3516, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3517, name=Gadderanks, level=0, option=[Talk-to, null, null, null, null], anims=[2065, 2064]. +NPC id=3518, name=Gadderanks, level=35, option=[Talk-to, Attack, null, null, null], anims=[2065, 2064]. +NPC id=3519, name=Gadderanks, level=0, option=[Talk-to, null, null, null, null], anims=[3563, -1]. +NPC id=3520, name=Vampyre Juvinate, level=50, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3521, name=Vampyre Juvinate, level=54, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3522, name=Vampyre Juvinate, level=54, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3523, name=Vampyre Juvinate, level=54, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3524, name=Vampyre Juvinate, level=54, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3525, name=Vampyre Juvinate, level=54, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3526, name=Vampyre Juvinate, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3527, name=Held Vampyre Juvinate, level=54, option=[null, Attack, null, null, null], anims=[3551, -1]. +NPC id=3528, name=Vampyre Juvinate, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3529, name=Vampyre Juvinate, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3530, name=Mist, level=0, option=[null, null, null, null, null], anims=[1261, 1261]. +NPC id=3531, name=Vampyre Juvenile, level=45, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3532, name=Vampyre Juvenile, level=45, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3533, name=Vampyre Juvenile, level=45, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3534, name=Held Vampyre Juvenile, level=45, option=[null, Attack, null, null, null], anims=[3551, -1]. +NPC id=3535, name=Ivan Strom, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3536, name=Ivan Strom, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3537, name=Vampyre Juvinate, level=75, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3538, name=Vampyre Juvinate, level=50, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3539, name=Veliaf Hurtz, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3540, name=Elisabeta, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3541, name=Aurel, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3542, name=Sorin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3543, name=Luscion, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3544, name=Sergiu, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3545, name=Radu, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3546, name=Grigore, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3547, name=Ileana, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3548, name=Valeria, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3549, name=Emilia, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3550, name=Florin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3551, name=Catalina, level=0, option=[Talk-to, null, null, null, null], anims=[7298, 7297]. +NPC id=3552, name=Ivan, level=0, option=[Talk-to, null, null, null, null], anims=[7298, 7297]. +NPC id=3553, name=Victor, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=3554, name=Helena, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=3555, name=Teodor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3556, name=Marius, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3557, name=Gabriela, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3558, name=Vladimir, level=0, option=[Talk-to, null, null, null, null], anims=[1147, -1]. +NPC id=3559, name=Calin, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=3560, name=Mihail, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=3561, name=Nicoleta, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=3562, name=Simona, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=3563, name=Vasile, level=0, option=[Talk-to, null, null, null, null], anims=[3557, -1]. +NPC id=3564, name=Razvan, level=0, option=[Talk-to, null, null, null, null], anims=[3557, -1]. +NPC id=3565, name=Luminata, level=0, option=[Talk-to, null, null, null, null], anims=[3557, -1]. +NPC (wrapper) id=3566, child npcs=[3568, -1]. +NPC id=3567, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3568, name=Cornelius, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3569, name=Cornelius, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3570, name=Benjamin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3571, name=Liam, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3572, name=Miala, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3573, name=Verak, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3574, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=3575, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=3576, name=Juvinate, level=59, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3577, name=Juvinate, level=90, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3578, name=Juvinate, level=119, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3579, name=Sheep, level=0, option=[Shear, null, Talk-to, null, null], anims=[3569, 3568]. +NPC id=3580, name=Tentacle, level=0, option=[null, null, null, null, null], anims=[3617, 3617]. +NPC id=3581, name=Skeleton, level=22, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=3582, name=Guard dog, level=44, option=[null, Attack, null, null, null], anims=[6561, 6560]. +NPC id=3583, name=Hobgoblin, level=54, option=[null, Attack, null, null, null], anims=[166, 162]. +NPC id=3584, name=Troll, level=91, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=3585, name=Huge spider, level=81, option=[null, Attack, null, null, null], anims=[5318, 5317]. +NPC id=3586, name=Hellhound, level=122, option=[null, Attack, null, null, null], anims=[6561, 6583]. +NPC id=3587, name=Ogre, level=53, option=[null, Attack, null, null, null], anims=[357, 358]. +NPC id=3588, name=Baby red dragon, level=65, option=[null, Attack, null, null, null], anims=[27, 21]. +NPC id=3589, name=Kalphite Soldier, level=85, option=[null, Attack, null, null, null], anims=[6218, 6220]. +NPC id=3590, name=Steel dragon, level=246, option=[null, Attack, null, null, null], anims=[6496, 79]. +NPC id=3591, name=Dagannoth, level=135, option=[null, Attack, null, null, null], anims=[1338, 1339]. +NPC id=3592, name=Tok-Xil, level=135, option=[null, Attack, null, null, null], anims=[9241, 9240]. +NPC id=3593, name=Demon, level=82, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=3594, name=Rocnar, level=97, option=[null, Attack, null, null, null], anims=[3707, 3708]. +NPC id=3595, name=Toy Soldier, level=0, option=[Pick-up, null, null, null, null], anims=[3712, 3713]. +NPC id=3596, name=Toy Doll, level=0, option=[Pick-up, null, null, null, null], anims=[3716, 3717]. +NPC id=3597, name=Toy Mouse, level=0, option=[Pick-up, null, null, null, null], anims=[3718, 3718]. +NPC id=3598, name=Clockwork cat, level=0, option=[Pick-up, null, null, null, Shoo], anims=[9158, 9157]. +NPC id=3599, name=Swamp snake, level=80, option=[null, Attack, null, null, null], anims=[3535, -1]. +NPC id=3600, name=Swamp snake, level=109, option=[null, Attack, null, null, null], anims=[3535, -1]. +NPC id=3601, name=Swamp snake, level=139, option=[null, Attack, null, null, null], anims=[3535, -1]. +NPC id=3602, name=Swamp snake, level=0, option=[null, Skin, null, null, null], anims=[3535, 3537]. +NPC id=3603, name=Dead swamp snake, level=0, option=[null, null, null, null, null], anims=[3738, -1]. +NPC id=3604, name=Dead swamp snake, level=0, option=[null, null, null, null, null], anims=[3738, -1]. +NPC id=3605, name=Dead swamp snake, level=0, option=[null, null, null, null, null], anims=[3738, -1]. +NPC id=3606, name=Ghast, level=0, option=[null, null, null, null, null], anims=[1092, 1091]. +NPC id=3607, name=Ghast, level=0, option=[null, null, null, null, null], anims=[1092, 1091]. +NPC id=3608, name=Ghast, level=0, option=[null, null, null, null, null], anims=[1092, 1091]. +NPC id=3609, name=Ghast, level=79, option=[null, Attack, null, null, null], anims=[1086, 1085]. +NPC id=3610, name=Ghast, level=109, option=[null, Attack, null, null, null], anims=[1086, 1085]. +NPC id=3611, name=Ghast, level=139, option=[null, Attack, null, null, null], anims=[1086, 1085]. +NPC id=3612, name=Giant snail, level=80, option=[null, Attack, null, null, null], anims=[3722, 3721]. +NPC id=3613, name=Giant snail, level=109, option=[null, Attack, null, null, null], anims=[3722, 3721]. +NPC id=3614, name=Giant snail, level=139, option=[null, Attack, null, null, null], anims=[3722, 3721]. +NPC id=3615, name=Riyl shadow, level=80, option=[null, Attack, null, null, null], anims=[1282, 1281]. +NPC id=3616, name=Asyn shadow, level=110, option=[null, Attack, null, null, null], anims=[1282, 1281]. +NPC id=3617, name=Shade, level=140, option=[null, Attack, null, null, null], anims=[1282, 1281]. +NPC id=3618, name=Tentacle, level=99, option=[null, Attack, null, null, null], anims=[3617, 3617]. +NPC id=3619, name=Head, level=140, option=[null, Attack, null, null, null], anims=[3730, 3730]. +NPC id=3620, name=Head, level=140, option=[null, Attack, null, null, null], anims=[3728, 3728]. +NPC id=3621, name=Tentacle, level=136, option=[null, Attack, null, null, null], anims=[3729, 3729]. +NPC id=3622, name=Zombie, level=23, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=3623, name=null, level=1, option=[null, null, null, null, null], anims=[7158, 7160]. +NPC id=3624, name=Smiddi Ryak, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=3625, name=null, level=1, option=[null, null, null, null, null], anims=[808, 1146]. +NPC id=3626, name=Rolayne Twickit, level=0, option=[Talk-to, null, null, null, null], anims=[808, 1146]. +NPC id=3627, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3628, name=Jayene Kliyn, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3629, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3630, name=Valantay Eppel, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3631, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3632, name=Dalcian Fang, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3633, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3634, name=Fyiona Fray, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3635, name=Abidor Crank, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3636, name=Spirit tree, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=3637, name=Spirit tree, level=0, option=[Talk-to, null, null, null, null], anims=[332, -1]. +NPC (wrapper) id=3638, child npcs=[3639, -1]. +NPC id=3639, name=Launa, level=0, option=[Talk-to, null, null, null, null], anims=[808, 1146]. +NPC id=3640, name=Launa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3641, name=Brana, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3642, name=Mawnis Burowgar, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3643, name=Tolna, level=0, option=[Talk-to, null, null, null, null], anims=[5752, -1]. +NPC id=3644, name=Tolna, level=0, option=[null, null, null, null, null], anims=[7158, 7160]. +NPC id=3645, name=Angry bear, level=40, option=[null, Attack, null, null, null], anims=[4919, 4923]. +NPC id=3646, name=Angry unicorn, level=45, option=[null, Attack, null, null, null], anims=[6374, 6373]. +NPC id=3647, name=Angry giant rat, level=45, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=3648, name=Angry goblin, level=45, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=3649, name=Fear reaper, level=42, option=[null, Attack, null, null, null], anims=[3810, 3809]. +NPC id=3650, name=Confusion beast, level=43, option=[null, Attack, null, null, null], anims=[3815, 3819]. +NPC id=3651, name=Confusion beast, level=43, option=[null, Attack, null, null, null], anims=[3815, 3819]. +NPC id=3652, name=Confusion beast, level=43, option=[null, Attack, null, null, null], anims=[3815, 3819]. +NPC id=3653, name=Confusion beast, level=43, option=[null, Attack, null, null, null], anims=[3815, 3819]. +NPC id=3654, name=Confusion beast, level=43, option=[null, Attack, null, null, null], anims=[3815, 3819]. +NPC id=3655, name=Hopeless creature, level=40, option=[null, Attack, null, null, null], anims=[3822, 3825]. +NPC id=3656, name=Hopeless creature, level=40, option=[null, Attack, null, null, null], anims=[3822, 3825]. +NPC id=3657, name=Hopeless creature, level=40, option=[null, Attack, null, null, null], anims=[3822, 3825]. +NPC id=3658, name=Tolna, level=46, option=[null, Attack, null, null, null], anims=[3828, 3828]. +NPC id=3659, name=Tolna, level=46, option=[null, Attack, null, null, null], anims=[3828, 3828]. +NPC id=3660, name=Tolna, level=46, option=[null, Attack, null, null, null], anims=[3828, 3828]. +NPC id=3661, name=Angry unicorn, level=47, option=[null, Attack, null, null, null], anims=[6374, 6373]. +NPC id=3662, name=Angry giant rat, level=47, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=3663, name=Angry goblin, level=47, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=3664, name=Angry bear, level=47, option=[null, Attack, null, null, null], anims=[4919, 4923]. +NPC id=3665, name=Fear reaper, level=55, option=[null, Attack, null, null, null], anims=[3810, 3809]. +NPC id=3666, name=Confusion beast, level=63, option=[null, Attack, null, null, null], anims=[3815, 3819]. +NPC id=3667, name=Hopeless creature, level=71, option=[null, Attack, null, null, null], anims=[3822, 3825]. +NPC id=3668, name=Hopeless beast, level=71, option=[null, Attack, null, null, null], anims=[3822, 3825]. +NPC id=3669, name=Hopeless beast, level=71, option=[null, Attack, null, null, null], anims=[3822, 3825]. +NPC id=3670, name=Odd Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[1740, 1739]. +NPC id=3671, name=Fortunato, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3672, name=Ram, level=2, option=[null, Attack, null, null, null], anims=[5339, 5340]. +NPC id=3673, name=Ram, level=2, option=[null, Attack, null, null, null], anims=[5335, 5334]. +NPC id=3674, name=Bones, level=0, option=[null, null, null, null, null], anims=[3840, -1]. +NPC id=3675, name=Vulture, level=31, option=[null, Attack, null, null, null], anims=[2017, 2016]. +NPC id=3676, name=Vulture, level=31, option=[null, Attack, null, null, null], anims=[2024, 2024]. +NPC id=3677, name=Sinister Stranger, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3678, name=Sinister Stranger, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3679, name=Vestri, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=3680, name=Ali the Leaflet Dropper, level=0, option=[Talk-to, null, Take-flyer, null, null], anims=[7158, 7160]. +NPC id=3681, name=Nigel, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3682, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, 3853]. +NPC id=3683, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, 3853]. +NPC id=3684, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, 3853]. +NPC id=3685, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, 3853]. +NPC id=3686, name=Chocolate kebbit, level=0, option=[Grab, null, null, null, null], anims=[5273, 5272]. +NPC id=3687, name=Chocolate kebbit, level=0, option=[null, null, null, null, null], anims=[5273, 5272]. +NPC id=3688, name=Easter Bunny, level=1, option=[null, null, null, null, null], anims=[1829, 1828]. +NPC id=3689, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3690, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3691, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3692, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3693, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3694, name=Egg, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3695, name=Volf Olafson, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3696, name=Ingrid Hradson, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3697, name=Skeleton fremennik, level=40, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3698, name=Skeleton fremennik, level=40, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3699, name=Skeleton fremennik, level=40, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3700, name=Skeleton fremennik, level=50, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3701, name=Skeleton fremennik, level=50, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3702, name=Skeleton fremennik, level=50, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3703, name=Skeleton fremennik, level=60, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3704, name=Skeleton fremennik, level=60, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3705, name=Skeleton fremennik, level=60, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3706, name=Ulfric, level=100, option=[null, Attack, null, null, null], anims=[6113, 6112]. +NPC id=3707, name=Brine rat, level=70, option=[null, Attack, null, null, null], anims=[6127, 6114]. +NPC id=3708, name=Boulder, level=0, option=[Roll, null, null, null, null], anims=[-1, 6120]. +NPC id=3709, name=Boulder, level=0, option=[null, null, null, null, null], anims=[-1, 6120]. +NPC id=3710, name=Ulfric, level=0, option=[null, null, null, null, null], anims=[6126, -1]. +NPC id=3711, name=Giant bat, level=27, option=[null, Attack, null, null, null], anims=[2618, 2619]. +NPC id=3712, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=3713, name=Sigmund, level=64, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3714, name=Zanik, level=41, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=3715, name=Guard, level=22, option=[Attack, null, null, null, null], anims=[808, -1]. +NPC id=3716, name=Sigmund, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3717, name=Sigmund, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3718, name=Sigmund, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3719, name=Sigmund, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3720, name=Sigmund, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3721, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=3722, name=Zanik, level=0, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=3723, name=General Bentnoze, level=0, option=[null, null, null, null, null], anims=[6203, 6202]. +NPC id=3724, name=General Wartface, level=0, option=[null, null, null, null, null], anims=[6203, 6202]. +NPC id=3725, name=Grubfoot, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=3726, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=3727, name=Splatter, level=22, option=[null, Attack, null, null, null], anims=[3886, 3887]. +NPC id=3728, name=Splatter, level=33, option=[null, Attack, null, null, null], anims=[3886, 3887]. +NPC id=3729, name=Splatter, level=44, option=[null, Attack, null, null, null], anims=[3886, 3887]. +NPC id=3730, name=Splatter, level=54, option=[null, Attack, null, null, null], anims=[3886, 3887]. +NPC id=3731, name=Splatter, level=65, option=[null, Attack, null, null, null], anims=[3886, 3887]. +NPC id=3732, name=Shifter, level=38, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3733, name=Shifter, level=38, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3734, name=Shifter, level=57, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3735, name=Shifter, level=57, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3736, name=Shifter, level=76, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3737, name=Shifter, level=76, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3738, name=Shifter, level=90, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3739, name=Shifter, level=90, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3740, name=Shifter, level=104, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3741, name=Shifter, level=104, option=[null, Attack, null, null, null], anims=[3899, 3898]. +NPC id=3742, name=Ravager, level=36, option=[null, Attack, null, null, null], anims=[3913, 3914]. +NPC id=3743, name=Ravager, level=53, option=[null, Attack, null, null, null], anims=[3913, 3914]. +NPC id=3744, name=Ravager, level=71, option=[null, Attack, null, null, null], anims=[3913, 3914]. +NPC id=3745, name=Ravager, level=89, option=[null, Attack, null, null, null], anims=[3913, 3914]. +NPC id=3746, name=Ravager, level=106, option=[null, Attack, null, null, null], anims=[3913, 3914]. +NPC id=3747, name=Spinner, level=36, option=[null, Attack, null, null, null], anims=[3906, 3907]. +NPC id=3748, name=Spinner, level=55, option=[null, Attack, null, null, null], anims=[3906, 3907]. +NPC id=3749, name=Spinner, level=74, option=[null, Attack, null, null, null], anims=[3906, 3907]. +NPC id=3750, name=Spinner, level=92, option=[null, Attack, null, null, null], anims=[3906, 3907]. +NPC id=3751, name=Spinner, level=88, option=[null, Attack, null, null, null], anims=[3906, 3907]. +NPC id=3752, name=Torcher, level=33, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3753, name=Torcher, level=33, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3754, name=Torcher, level=49, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3755, name=Torcher, level=49, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3756, name=Torcher, level=66, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3757, name=Torcher, level=66, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3758, name=Torcher, level=79, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3759, name=Torcher, level=79, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3760, name=Torcher, level=91, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3761, name=Torcher, level=92, option=[null, Attack, null, null, null], anims=[3878, 3879]. +NPC id=3762, name=Defiler, level=33, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3763, name=Defiler, level=33, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3764, name=Defiler, level=50, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3765, name=Defiler, level=50, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3766, name=Defiler, level=66, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3767, name=Defiler, level=67, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3768, name=Defiler, level=80, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3769, name=Defiler, level=80, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3770, name=Defiler, level=97, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3771, name=Defiler, level=97, option=[null, Attack, null, null, null], anims=[3918, 3919]. +NPC id=3772, name=Brawler, level=51, option=[null, Attack, null, null, null], anims=[3893, 3892]. +NPC id=3773, name=Brawler, level=76, option=[null, Attack, null, null, null], anims=[3893, 3892]. +NPC id=3774, name=Brawler, level=101, option=[null, Attack, null, null, null], anims=[3893, 3892]. +NPC id=3775, name=Brawler, level=129, option=[null, Attack, null, null, null], anims=[3893, 3892]. +NPC id=3776, name=Brawler, level=158, option=[null, Attack, null, null, null], anims=[3893, 3892]. +NPC id=3777, name=Doomsayer, level=0, option=[Talk-to, null, Toggle-warnings, null, null], anims=[813, -1]. +NPC id=3778, name=null, level=1, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3779, name=Arthur, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3780, name=null, level=1, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3781, name=Squire, level=0, option=[Talk-to, null, Leave, null, null], anims=[813, -1]. +NPC id=3782, name=Void Knight, level=0, option=[null, hidden, null, null, null], anims=[3926, -1]. +NPC id=3783, name=Frog, level=62, option=[null, Attack, null, null, null], anims=[7258, 7259]. +NPC id=3784, name=Void Knight, level=0, option=[null, hidden, null, null, null], anims=[3926, -1]. +NPC id=3785, name=Void Knight, level=0, option=[null, hidden, null, null, null], anims=[3926, -1]. +NPC id=3786, name=Void Knight, level=0, option=[Talk-to, null, Exchange, null, null], anims=[813, -1]. +NPC id=3787, name=Sir Palomedes, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3788, name=Void Knight, level=0, option=[Talk-to, null, Exchange, null, null], anims=[813, -1]. +NPC id=3789, name=Void Knight, level=0, option=[Talk-to, null, Exchange, null, null], anims=[813, -1]. +NPC id=3790, name=Squire, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3791, name=Squire, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3792, name=Squire, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3793, name=Squire, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3794, name=Squire, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3795, name=Squire, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3796, name=Squire, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3797, name=Squire, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3798, name=Squire, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3799, name=Squire, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3800, name=Squire, level=0, option=[Talk-to, null, Travel, null, null], anims=[813, -1]. +NPC id=3801, name=Squire, level=0, option=[Talk-to, null, Travel, null, null], anims=[813, -1]. +NPC id=3802, name=Squire (Novice), level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3803, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3804, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=3805, name=Postie Pete, level=0, option=[Talk-to, null, null, null, null], anims=[3948, 3947]. +NPC id=3806, name=Millie Miller, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3807, name=Gillie Groats, level=0, option=[Talk-to, null, null, null, null], anims=[3950, 3997]. +NPC id=3808, name=Tortoise, level=92, option=[null, Attack, null, null, null], anims=[3952, 3953]. +NPC id=3809, name=Captain Dalbur, level=0, option=[Talk-to, null, Glider, null, null], anims=[195, 189]. +NPC id=3810, name=Captain Bleemadge, level=0, option=[Talk-to, null, Glider, null, null], anims=[195, 189]. +NPC id=3811, name=Captain Errdo, level=0, option=[Talk-to, null, Glider, null, null], anims=[195, 189]. +NPC id=3812, name=Captain Klemfoodle, level=0, option=[Talk-to, null, Glider, null, null], anims=[195, 189]. +NPC id=3813, name=Captain Wimto, level=0, option=[Talk-to, null, Glider, null, null], anims=[195, 189]. +NPC id=3814, name=Gnome Archer, level=5, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=3815, name=Gnome Driver, level=5, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=3816, name=Gnome Mage, level=5, option=[null, Attack, null, null, null], anims=[195, 189]. +NPC id=3817, name=Lieutenant Schepbur, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=3818, name=Trainer Nacklepen, level=0, option=[Talk-to, null, null, null, null], anims=[3965, 3963]. +NPC id=3819, name=Tortoise, level=79, option=[null, Attack, null, null, null], anims=[3952, 3953]. +NPC (wrapper) id=3820, child npcs=[2253, -1, -1, -1, -1, 2253, -1, -1, -1, -1, 2253, -1, -1, -1, -1, 2253, -1, -1, -1, -1, 2253, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2253, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2253, -1]. +NPC id=3821, name=Wise Old Man, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=3822, name=Herman Caranos, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3823, name=Franklin Caranos, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3824, name=Arnold Lydspor, level=0, option=[Talk-to, null, Trade, Bank, Collect], anims=[808, -1]. +NPC id=3825, name=Devin Mendelberg, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3826, name=George Laxmeister, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3827, name=Ramara du Croissant, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=3828, child npcs=[3825, -1, -1, -1, -1, 3825, -1, -1, -1, -1, 3825, -1, -1, -1, -1, 3825, -1, -1, -1, -1, 3825, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3825, -1]. +NPC (wrapper) id=3829, child npcs=[3830, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3831, -1]. +NPC id=3830, name=Kathy Corkat, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3831, name=Kathy Corkat, level=0, option=[Talk-to, null, Travel, null, null], anims=[808, -1]. +NPC (wrapper) id=3832, child npcs=[3822, -1, -1, -1, -1, 3822, -1, -1, -1, -1, 3822, -1, -1, -1, -1, 3822, -1, -1, -1, -1, 3822, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2567, -1, -1, -1, -1, 2567, -1]. +NPC id=3833, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3834, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3835, name=Kalphite Queen, level=333, option=[null, Attack, null, null, null], anims=[6239, 6238]. +NPC id=3836, name=Kalphite Queen, level=333, option=[null, Attack, null, null, null], anims=[6236, 6236]. +NPC id=3837, name=Drunken Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[900, 104]. +NPC id=3838, name=Wise Old Man, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=3839, name=Wise Old Man, level=0, option=[null, null, null, null, null], anims=[3970, -1]. +NPC id=3840, name=Sea troll, level=79, option=[null, Attack, null, null, null], anims=[3987, 3984]. +NPC id=3841, name=Sea troll, level=65, option=[null, Attack, null, null, null], anims=[3987, 3984]. +NPC id=3842, name=Sea troll, level=87, option=[null, Attack, null, null, null], anims=[3987, 3984]. +NPC id=3843, name=Sea troll, level=101, option=[null, Attack, null, null, null], anims=[3987, 3984]. +NPC id=3844, name=Skeleton Mage, level=64, option=[null, null, null, null, null], anims=[5483, 5479]. +NPC id=3845, name=Sea troll, level=58, option=[null, null, null, null, null], anims=[3987, 3984]. +NPC id=3846, name=Sea Troll General, level=0, option=[null, null, null, null, null], anims=[3978, 3977]. +NPC id=3847, name=Sea Troll Queen, level=170, option=[null, Attack, null, null, null], anims=[3989, -1]. +NPC id=3848, name=Fishing spot, level=0, option=[Harpoon, null, Net, hidden, hidden], anims=[447, 448]. +NPC id=3849, name=Fishing spot, level=0, option=[Harpoon, null, Net, hidden, hidden], anims=[456, -1]. +NPC id=3850, name=Skeleton Mage, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3851, name=Skeleton Mage, level=83, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=3852, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3853, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3854, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3855, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3856, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3857, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3858, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3859, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3860, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3861, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3862, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3863, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3864, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3865, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3866, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3867, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3868, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3869, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3870, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3871, name=Suspect, level=0, option=[Grab, null, null, null, null], anims=[808, -1]. +NPC id=3872, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3873, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3874, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3875, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3876, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3877, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3878, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3879, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3880, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3881, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3882, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3883, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3884, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3885, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3886, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3887, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3888, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3889, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3890, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3891, name=Suspect, level=0, option=[null, null, null, null, null], anims=[3999, 3999]. +NPC id=3892, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3893, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3894, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3895, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3896, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3897, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3898, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3899, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3900, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3901, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3902, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3903, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3904, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3905, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3906, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3907, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3908, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3909, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3910, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3911, name=Molly, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3912, name=Flippa, level=0, option=[Talk-To, null, null, null, null], anims=[4010, 1139]. +NPC id=3913, name=Tilt, level=0, option=[Talk-To, null, null, null, null], anims=[4009, 1139]. +NPC id=3914, name=Gardener, level=4, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=3915, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=3916, name=Carpenter Kjallak, level=0, option=[Talk-to, null, null, null, null], anims=[1365, -1]. +NPC id=3917, name=Farmer Fromund, level=0, option=[Talk-to, null, null, null, null], anims=[2273, -1]. +NPC id=3918, name=Prince Brand, level=0, option=[null, null, null, null, null], anims=[1321, -1]. +NPC id=3919, name=Princess Astrid, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=3920, name=Runa, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3921, name=Halla, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3922, name=Finn, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3923, name=Osvald, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=3924, name=Runolf, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3925, name=Tjorvi, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3926, name=Ingrid, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3927, name=Thora, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3928, name=Signy, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3929, name=Hild, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3930, name=Armod, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3931, name=Beigarth, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3932, name=Reinn, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3933, name=Alviss, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=3934, name=Fullangr, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=3935, name=Jari, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=3936, name=Thorodin, level=0, option=[Talk-to, null, null, null, null], anims=[4021, 98]. +NPC id=3937, name=Ferd, level=0, option=[Talk-to, null, null, null, null], anims=[4021, 98]. +NPC id=3938, name=Donal, level=0, option=[Talk-to, null, null, null, null], anims=[-1, 98]. +NPC id=3939, name=Sea Snake Young, level=90, option=[null, Attack, null, null, null], anims=[3535, 3537]. +NPC id=3940, name=Sea Snake Hatchling, level=62, option=[null, Attack, null, null, null], anims=[3535, 3537]. +NPC id=3941, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3942, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=3943, name=Giant Sea Snake, level=149, option=[null, Attack, null, null, null], anims=[4037, 4037]. +NPC id=3944, name=Hangman game, level=0, option=[Guess-letter, null, Banish, null, null], anims=[-1, -1]. +NPC id=3945, name=Hangman game, level=0, option=[Guess-letter, null, Banish, null, null], anims=[-1, -1]. +NPC id=3946, name=Hangman game, level=0, option=[Guess-letter, null, Banish, null, null], anims=[-1, -1]. +NPC id=3947, name=Hangman game, level=0, option=[Guess-letter, null, Banish, null, null], anims=[-1, -1]. +NPC id=3948, name=Hangman game, level=0, option=[Guess-letter, null, Banish, null, null], anims=[-1, -1]. +NPC id=3949, name=Hangman game, level=0, option=[Guess-letter, null, Banish, null, null], anims=[-1, -1]. +NPC id=3950, name=Hangman game, level=0, option=[Guess-letter, null, Banish, null, null], anims=[-1, -1]. +NPC id=3951, name=Hangman game, level=0, option=[Guess-letter, null, Banish, null, null], anims=[-1, -1]. +NPC id=3952, name=Hangman game, level=0, option=[Guess-letter, null, Banish, null, null], anims=[-1, -1]. +NPC id=3953, name=Hangman game, level=0, option=[Reset, null, Banish, null, null], anims=[-1, -1]. +NPC id=3954, name=Treasure fairy, level=0, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=3955, name=Jacky Jester, level=0, option=[Banish, null, null, null, null], anims=[808, -1]. +NPC id=3956, name=Combat stone, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=3957, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3958, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3959, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3960, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3961, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3962, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3963, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3964, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3965, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3966, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3967, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3968, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3969, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3970, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3971, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3972, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3973, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3974, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3975, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3976, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3977, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3978, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3979, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3980, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3981, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3982, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3983, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3984, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3985, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3986, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3987, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3988, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3989, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3990, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3991, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3992, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3993, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3994, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3995, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3996, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3997, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3998, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=3999, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4000, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4001, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4002, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4003, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4004, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4005, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4006, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4007, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4008, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4009, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4010, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4011, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4012, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4013, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4014, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4015, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4016, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4017, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4018, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4019, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4020, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4021, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4022, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4023, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4024, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4025, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4026, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4027, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4028, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4029, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4030, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4031, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4032, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4033, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4034, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4035, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4036, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4037, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4038, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4039, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4040, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4041, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4042, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4043, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4044, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4045, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4046, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4047, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4048, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4049, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4050, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4051, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4052, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4053, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4054, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4055, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4056, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4057, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4058, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4059, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4060, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4061, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4062, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4063, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4064, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4065, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4066, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4067, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4068, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4069, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4070, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4071, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4072, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4073, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4074, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4075, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4076, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4077, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4078, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4079, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4080, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4081, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4082, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4083, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4084, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4085, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4086, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4087, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4088, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4089, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4090, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4091, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4092, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4093, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4094, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4095, name=Elemental balance, level=0, option=[null, Banish, null, null, null], anims=[3584, -1]. +NPC id=4096, name=Combat stone, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4097, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4098, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4099, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4100, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4101, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4102, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4103, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4104, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4105, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4106, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4107, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4108, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4109, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4110, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4111, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4112, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4113, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4114, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4115, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4116, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4117, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4118, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4119, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4120, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4121, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4122, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4123, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4124, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4125, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4126, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4127, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4128, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4129, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4130, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4131, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4132, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4133, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4134, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4135, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4136, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4137, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4138, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4139, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4140, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4141, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4142, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4143, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4144, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4145, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4146, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4147, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4148, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4149, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4150, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4151, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4152, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4153, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4154, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4155, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4156, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4157, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4158, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4159, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4160, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4161, name=Combat stone, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4162, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4163, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4164, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4165, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4166, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4167, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4168, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4169, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4170, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4171, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4172, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4173, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4174, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4175, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4176, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4177, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4178, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4179, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4180, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4181, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4182, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4183, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4184, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4185, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4186, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4187, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4188, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4189, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4190, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4191, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4192, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4193, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4194, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4195, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4196, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4197, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4198, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4199, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4200, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4201, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4202, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4203, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4204, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4205, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4206, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4207, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4208, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4209, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4210, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4211, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4212, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4213, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4214, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4215, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4216, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4217, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4218, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4219, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4220, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4221, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4222, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4223, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4224, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4225, name=Combat stone, level=0, option=[Hit, null, null, null, null], anims=[-1, -1]. +NPC id=4226, name=Crawling hand, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4227, name=Cockatrice, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4228, name=Basilisk, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4229, name=Kurask, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4230, name=Abyssal demon, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4231, name=Left head, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4232, name=Middle head, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4233, name=Right head, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4234, name=Kalphite Queen, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4235, name=Rick, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=4236, child npcs=[4235, -1, 4235, 4235, 4235, 4235, 4235, 4235, 4235, -1]. +NPC id=4237, name=Maid, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=4238, child npcs=[4237, 4237, 4237, -1, 4237, 4237, 4237, 4237, 4237, -1]. +NPC id=4239, name=Cook, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=4240, child npcs=[4239, 4239, 4239, 4239, 4239, -1, 4239, 4239, 4239, -1]. +NPC id=4241, name=Butler, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=4242, child npcs=[4241, 4241, 4241, 4241, 4241, 4241, -1, 4241, 4241, -1]. +NPC id=4243, name=Demon butler, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=4244, child npcs=[4243, 4243, 4243, 4243, 4243, 4243, 4243, 4243, -1]. +NPC id=4245, name=Chief servant, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4246, name=Taxidermist, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4247, name=Estate agent, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4248, name=Stonemason, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=4249, name=Sir Renitee, level=0, option=[Talk-to, null, null, null, null], anims=[3719, -1]. +NPC id=4250, name=Sawmill operator, level=0, option=[Talk-to, null, Buy-plank, Trade, null], anims=[808, -1]. +NPC id=4251, name=Garden supplier, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=4252, name=Macaroni Penguin, level=0, option=[null, null, null, null, null], anims=[5668, 5666]. +NPC id=4253, name=null, level=1, option=[null, null, null, null, null], anims=[5335, -1]. +NPC id=4254, name=null, level=1, option=[null, null, null, null, null], anims=[5335, -1]. +NPC id=4255, name=null, level=1, option=[null, null, null, null, null], anims=[5335, -1]. +NPC id=4256, name=null, level=1, option=[null, null, null, null, null], anims=[5335, -1]. +NPC id=4257, name=Guard, level=10, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=4258, name=Guard, level=10, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=4259, name=Guard, level=10, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=4260, name=Guard, level=10, option=[Talk-to, Attack, null, null, null], anims=[101, 98]. +NPC id=4261, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4262, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4263, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4264, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4265, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4266, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4267, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4268, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4269, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4270, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4271, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4272, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4273, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4274, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4275, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4276, name=Goblin, level=2, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4277, name=Buinn, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4278, name=Animated Bronze Armour, level=11, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4279, name=Animated Iron Armour, level=23, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4280, name=Animated Steel Armour, level=46, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4281, name=Animated Black Armour, level=69, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4282, name=Animated Mithril Armour, level=92, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4283, name=Animated Adamant Armour, level=113, option=[null, Attack, null, null, null], anims=[2065, 2064]. +NPC id=4284, name=Animated Rune Armour, level=138, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4285, name=Ghommal, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4286, name=Harrallak Menarous, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4287, name=Gamfred, level=0, option=[Talk-to, null, Claim-Tokens, Claim-Shield, null], anims=[101, 98]. +NPC id=4288, name=Ajjat, level=0, option=[Talk-to, null, Claim-Tokens, null, null], anims=[2065, 2064]. +NPC id=4289, name=Kamfreena, level=0, option=[Talk-to, null, Claim-Tokens, null, null], anims=[2065, 2064]. +NPC id=4290, name=Shanomi, level=0, option=[Talk-to, null, Claim-Tokens, null, null], anims=[2561, 2562]. +NPC id=4291, name=Cyclops, level=56, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=4292, name=Cyclops, level=76, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=4293, name=Lidio, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=4294, name=Lilly, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=4295, name=Anton, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=4296, name=Jade, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=4297, name=Sloane, level=0, option=[Talk-to, null, Claim-Tokens, null, null], anims=[808, -1]. +NPC id=4298, name=Jimmy, level=0, option=[Talk-to, null, null, null, null], anims=[2770, 2769]. +NPC id=4299, name=Ref, level=0, option=[Talk-to, null, Claim-Tokens, null, null], anims=[808, -1]. +NPC id=4300, name=Ref, level=0, option=[Talk-to, null, Claim-Tokens, null, null], anims=[808, -1]. +NPC id=4301, name=Guard, level=22, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4302, name=Guard, level=22, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4303, name=Guard, level=22, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4304, name=Guard, level=22, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4305, name=Guard, level=22, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4306, name=Guard, level=22, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4307, name=Guard, level=22, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=4308, name=Guard, level=22, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=4309, name=Guard, level=22, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=4310, name=Guard, level=22, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=4311, name=Guard, level=22, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=4312, name=Nardok, level=0, option=[Talk-to, null, Trade, null, null], anims=[4210, -1]. +NPC id=4313, name=null, level=1, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=4314, name=Dartog, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=4315, name=null, level=1, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=4316, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=4317, name=null, level=1, option=[null, null, null, null, null], anims=[4193, 4194]. +NPC id=4318, name=H.A.M. Member, level=0, option=[Talk-to, null, null, null, null], anims=[4193, 4194]. +NPC id=4319, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4320, name=H.A.M. Member, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4321, name=null, level=1, option=[null, null, null, null, null], anims=[4193, 4194]. +NPC id=4322, name=Zanik, level=0, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=4323, name=Zanik, level=0, option=[null, null, null, null, null], anims=[5994, 5995]. +NPC id=4324, name=Zanik, level=0, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=4325, name=Light creature, level=0, option=[null, null, null, null, null], anims=[2051, 2051]. +NPC id=4326, name=Zanik, level=0, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=4327, name=HAM member, level=22, option=[null, null, null, null, null], anims=[4208, -1]. +NPC id=4328, name=Sigmund, level=0, option=[null, null, null, null, null], anims=[4208, -1]. +NPC id=4329, name=H.A.M. Deacon, level=0, option=[null, null, null, null, null], anims=[4208, -1]. +NPC id=4330, name=Johanhus Ulsbrecht, level=0, option=[null, null, null, null, null], anims=[4208, -1]. +NPC id=4331, name=Sigmund, level=0, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4332, name=Sigmund, level=50, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4333, name=Sigmund, level=50, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4334, name=Sigmund, level=50, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4335, name=Sigmund, level=50, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4336, name=Guard, level=22, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4337, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=4338, name=null, level=1, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=4339, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=4340, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=4341, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, -1]. +NPC id=4342, name=Zanik, level=41, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=4343, name=Snake, level=35, option=[null, Attack, null, null, null], anims=[277, 274]. +NPC id=4344, name=Monkey, level=3, option=[Talk-To, Attack, null, null, null], anims=[222, 219]. +NPC id=4345, name=Albino bat, level=52, option=[null, Attack, null, null, null], anims=[4914, 4913]. +NPC id=4346, name=Crab, level=0, option=[null, null, null, null, null], anims=[3424, 3426]. +NPC id=4347, name=Giant mosquito, level=13, option=[null, Attack, null, null, null], anims=[2395, 2396]. +NPC id=4348, name=Jungle horror, level=70, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4349, name=Jungle horror, level=70, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4350, name=Jungle horror, level=70, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4351, name=Jungle horror, level=70, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4352, name=Jungle horror, level=70, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4353, name=Cave horror, level=80, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4354, name=Cave horror, level=80, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4355, name=Cave horror, level=80, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4356, name=Cave horror, level=80, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4357, name=Cave horror, level=80, option=[null, Attack, null, null, null], anims=[4231, 4236]. +NPC id=4358, name=Cavey Davey, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4359, name=Patchy, level=0, option=[Talk-to, null, Sew, null, null], anims=[808, -1]. +NPC id=4360, name=San Fan, level=0, option=[Talk-To, null, Join-Crew, null, null], anims=[808, -1]. +NPC id=4361, name=Fancy Dan, level=0, option=[Talk-To, null, Join-Crew, null, null], anims=[808, -1]. +NPC id=4362, name=Honest Jimmy, level=0, option=[Talk-To, null, Trade, Join-Team, null], anims=[4257, 4256]. +NPC id=4363, name=Monkey, level=0, option=[Catch, null, Talk-To, null, null], anims=[222, 219]. +NPC id=4364, name=Swarm, level=0, option=[null, null, null, null, null], anims=[0, 0]. +NPC id=4365, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4366, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4367, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4368, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4369, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4370, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4371, name=Blue Monkey, level=1, option=[null, null, null, null, null], anims=[1386, 1380]. +NPC id=4372, name=Red Monkey, level=1, option=[null, null, null, null, null], anims=[1386, 1380]. +NPC id=4373, name=Parrot, level=0, option=[Talk-To, null, null, null, null], anims=[4259, -1]. +NPC id=4374, name=Parrot, level=0, option=[Talk-To, null, null, null, null], anims=[4259, -1]. +NPC id=4375, name=Security Guard, level=0, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4376, name=Litara, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=4377, name=Gate of War, level=1, option=[talk, null, null, null, null], anims=[-1, -1]. +NPC id=4378, name=Ricketty door, level=1, option=[talk, null, null, null, null], anims=[-1, -1]. +NPC id=4379, name=Oozing barrier, level=1, option=[talk, null, null, null, null], anims=[-1, -1]. +NPC id=4380, name=Portal of Death, level=1, option=[talk, null, null, null, null], anims=[-1, -1]. +NPC id=4381, name=Ankou, level=75, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4382, name=Ankou, level=82, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4383, name=Ankou, level=86, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4384, name=Skeleton, level=68, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=4385, name=Skeleton, level=60, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=4386, name=Skeleton, level=85, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=4387, name=Ghost, level=77, option=[null, Attack, null, null, null], anims=[5538, 5539]. +NPC id=4388, name=Ghost, level=76, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=4389, name=Flesh Crawler, level=28, option=[null, Attack, null, null, null], anims=[1183, 1189]. +NPC id=4390, name=Flesh Crawler, level=35, option=[null, Attack, null, null, null], anims=[1183, 1189]. +NPC id=4391, name=Flesh Crawler, level=41, option=[null, Attack, null, null, null], anims=[1183, 1189]. +NPC id=4392, name=Zombie, level=30, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=4393, name=Zombie, level=44, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=4394, name=Zombie, level=53, option=[null, Attack, null, null, null], anims=[5576, -1]. +NPC id=4395, name=Giant rat, level=26, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4396, name=Rat, level=1, option=[null, Attack, null, null, null], anims=[2704, 2703]. +NPC id=4397, name=Catablepon, level=49, option=[null, Attack, null, null, null], anims=[4269, 4268]. +NPC id=4398, name=Catablepon, level=64, option=[null, Attack, null, null, null], anims=[4269, 4268]. +NPC id=4399, name=Catablepon, level=68, option=[null, Attack, null, null, null], anims=[4269, 4268]. +NPC id=4400, name=Giant spider, level=50, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=4401, name=Spider, level=24, option=[null, Attack, null, null, null], anims=[6247, 6248]. +NPC id=4402, name=Scorpion, level=59, option=[null, Attack, null, null, null], anims=[6252, 6253]. +NPC id=4403, name=Scorpion, level=37, option=[null, Attack, null, null, null], anims=[6252, 6253]. +NPC id=4404, name=Minotaur, level=12, option=[null, Attack, null, null, null], anims=[4264, 4263]. +NPC id=4405, name=Minotaur, level=19, option=[null, Attack, null, null, null], anims=[4264, 4263]. +NPC id=4406, name=Minotaur, level=27, option=[null, Attack, null, null, null], anims=[4264, 4263]. +NPC id=4407, name=Goblin, level=5, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4408, name=Goblin, level=13, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4409, name=Goblin, level=11, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4410, name=Goblin, level=16, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4411, name=Goblin, level=25, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4412, name=Goblin, level=16, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4413, name=Wolf, level=14, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=4414, name=Wolf, level=11, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=4415, name=Rat, level=1, option=[null, Attack, null, null, null], anims=[2704, 2703]. +NPC id=4416, name=Bee keeper, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=4417, name=Bees!, level=0, option=[null, null, null, null, null], anims=[0, 0]. +NPC id=4418, name=Gorak, level=145, option=[null, Attack, null, null, null], anims=[4299, 4298]. +NPC id=4419, name=Cosmic Being, level=0, option=[Talk-to, null, null, null, null], anims=[4303, 4304]. +NPC id=4420, name=null, level=0, option=[null, null, null, null, null], anims=[663, 663]. +NPC id=4421, name=null, level=0, option=[null, null, null, null, null], anims=[663, 663]. +NPC (wrapper) id=4422, child npcs=[57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1]. +NPC (wrapper) id=4423, child npcs=[57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1]. +NPC id=4424, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[4318, 4319]. +NPC id=4425, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[4318, 4319]. +NPC id=4426, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=4427, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=4428, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=4429, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=4430, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC (wrapper) id=4431, child npcs=[4434, -1]. +NPC id=4432, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=4433, name=Fairy Godfather, level=0, option=[Talk-to, null, Pick-pocket, null, null], anims=[-1, -1]. +NPC id=4434, name=Fairy Nuff, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=4435, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=4436, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=4437, name=Fairy Queen, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=4438, name=Centaur, level=0, option=[Talk-to, null, null, null, null], anims=[4311, 4310]. +NPC id=4439, name=Centaur, level=0, option=[Talk-to, null, null, null, null], anims=[4311, 4310]. +NPC id=4440, name=Stag, level=15, option=[null, Attack, null, null, null], anims=[6374, 6373]. +NPC id=4441, name=Wood Dryad, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4442, name=Fairy Very Wise, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=4443, name=Fairy, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=4444, name=Fairy, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=4445, name=Fairy, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=4446, name=Fairy, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=4447, name=Rabbit, level=1, option=[null, Attack, null, null, null], anims=[6089, 6088]. +NPC id=4448, name=Rabbit, level=1, option=[null, Attack, null, null, null], anims=[6089, 6088]. +NPC id=4449, name=Butterfly, level=0, option=[null, null, null, null, null], anims=[362, 362]. +NPC id=4450, name=Butterfly, level=0, option=[null, null, null, null, null], anims=[362, 362]. +NPC id=4451, name=Starflower, level=0, option=[null, null, null, null, null], anims=[4314, -1]. +NPC id=4452, name=Starflower, level=0, option=[Pick, null, null, null, null], anims=[4315, -1]. +NPC id=4453, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=4454, name=null, level=1, option=[null, null, null, null, null], anims=[112, 106]. +NPC id=4455, name=Fairy Fixit, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=4456, name=Ork, level=0, option=[Talk-to, null, null, null, null], anims=[4318, 4319]. +NPC id=4457, name=Ork, level=0, option=[Talk-to, null, null, null, null], anims=[4318, 4319]. +NPC id=4458, name=Ork, level=20, option=[Talk-to, null, null, null, null], anims=[4318, 4319]. +NPC id=4459, name=Ork, level=20, option=[Talk-to, null, null, null, null], anims=[4318, 4319]. +NPC id=4460, name=Fake Man, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4461, name=Held vampyre juvinate, level=90, option=[null, Attack, null, null, null], anims=[3551, -1]. +NPC id=4462, name=Held vampyre juvinate, level=119, option=[null, Attack, null, null, null], anims=[3551, -1]. +NPC id=4463, name=Angry juvinate, level=70, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4464, name=Angry juvinate, level=100, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4465, name=Angry juvinate, level=130, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4466, name=Benjamin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4467, name=Liam, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4468, name=Miala, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4469, name=Verak, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4470, name=Tree spirit, level=14, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=4471, name=Tree spirit, level=29, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=4472, name=Tree spirit, level=49, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=4473, name=Tree spirit, level=79, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=4474, name=Tree spirit, level=120, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=4475, name=Tree spirit, level=159, option=[null, Attack, null, null, null], anims=[96, 93]. +NPC id=4476, name=Guardian mummy, level=0, option=[Talk-to, null, Start-minigame, null, null], anims=[5558, 5557]. +NPC id=4477, name=Annoyed guardian mummy, level=0, option=[null, null, null, null, null], anims=[5558, 5557]. +NPC id=4478, name=Tarik, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4479, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4480, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4481, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4482, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6200, 6201]. +NPC id=4483, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4484, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4485, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4486, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4487, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4488, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4489, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6200, 6201]. +NPC id=4490, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4491, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4492, name=Goblin, level=5, option=[Talk-to, Attack, null, null, null], anims=[6186, 6187]. +NPC id=4493, name=General Bentnoze, level=0, option=[Talk-to, null, null, null, null], anims=[6203, 6202]. +NPC id=4494, name=General Wartface, level=0, option=[Talk-to, null, null, null, null], anims=[6203, 6202]. +NPC (wrapper) id=4495, child npcs=[4496, 4496, 4496, 4496, 4497, 4498, 4496, -1]. +NPC id=4496, name=Grubfoot, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=4497, name=Grubfoot, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=4498, name=Grubfoot, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=4499, name=Goblin, level=5, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=4500, name=Scarab swarm, level=98, option=[null, Attack, null, null, null], anims=[1947, 1945]. +NPC id=4501, name=Ethereal Man, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=4502, name=Ethereal Lady, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=4503, name=Ethereal Numerator, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=4504, name=Ethereal Expert, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=4505, name=Ethereal Perceptive, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=4506, name=Ethereal Guide, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=4507, name=Ethereal Fluke, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=4508, name=Ethereal Mimic, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4509, name=Me, level=79, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=4510, name=Me, level=79, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=4511, name=Oneiromancer, level=0, option=[Talk-to, null, null, null, null], anims=[4424, -1]. +NPC id=4512, name=House, level=0, option=[Go-inside, null, null, null, null], anims=[4391, 4390]. +NPC id=4513, name=Baba Yaga, level=0, option=[Talk-to, null, Trade, null, null], anims=[4424, -1]. +NPC id=4514, name=Pauline Polaris, level=0, option=[Talk-to, null, null, null, null], anims=[4424, -1]. +NPC id=4515, name=Meteora, level=0, option=[Talk-to, null, null, null, null], anims=[4424, -1]. +NPC id=4516, name=Melana Moonlander, level=0, option=[Talk-to, null, Trade, null, null], anims=[4424, -1]. +NPC id=4517, name=Selene, level=0, option=[Talk-to, null, null, null, null], anims=[4424, -1]. +NPC id=4518, name=Rimae Sirsalis, level=0, option=[Talk-to, null, Trade, null, null], anims=[4424, -1]. +NPC id=4519, name=Sirsal Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[4424, 4424]. +NPC id=4520, name=Clan Guard, level=0, option=[null, null, null, null, null], anims=[4424, -1]. +NPC id=4521, name=Enchanted Broom, level=0, option=[null, null, null, null, null], anims=[4372, 4372]. +NPC id=4522, name=Enchanted Broom, level=0, option=[null, null, null, null, null], anims=[4372, 4372]. +NPC id=4523, name=Enchanted Broom, level=0, option=[null, null, null, null, null], anims=[4372, 4372]. +NPC id=4524, name=Enchanted Bucket, level=0, option=[null, null, null, null, null], anims=[4374, 4374]. +NPC id=4525, name=Enchanted Bucket, level=0, option=[null, null, null, null, null], anims=[4374, 4374]. +NPC id=4526, name=Bouquet Mac Hyacinth, level=0, option=[Talk-to, null, null, null, null], anims=[4424, -1]. +NPC id=4527, name=Suqah, level=111, option=[null, Attack, null, null, null], anims=[4386, 4383]. +NPC id=4528, name=Suqah, level=111, option=[null, Attack, null, null, null], anims=[4386, 4383]. +NPC id=4529, name=Suqah, level=111, option=[null, Attack, null, null, null], anims=[4386, 4383]. +NPC id=4530, name=Suqah, level=111, option=[null, Attack, null, null, null], anims=[4386, 4383]. +NPC id=4531, name=Suqah, level=111, option=[null, Attack, null, null, null], anims=[4386, 4383]. +NPC id=4532, name=Suqah, level=111, option=[null, Attack, null, null, null], anims=[4386, 4383]. +NPC id=4533, name=Suqah, level=111, option=[null, Attack, null, null, null], anims=[4386, 4383]. +NPC id=4534, name=Moss giant, level=48, option=[null, Attack, null, null, null], anims=[4656, 4655]. +NPC id=4535, name=Parrot, level=1, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=4536, name=Lokar Searunner, level=0, option=[ gTalk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4537, name=Lokar Searunner, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC (wrapper) id=4538, child npcs=[4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, 4539, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4539, -1, 4539, -1, 4539, -1, 4539, -1, 4539, -1, 4539, -1, -1, -1, -1, 4539, -1]. +NPC id=4539, name=Cabin boy, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=4540, name=Captain Bentley, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4541, name='Beefy' Burns, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4542, name='Eagle-eye' Shultz, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4543, name=First mate 'Davey-boy', level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4544, name='Bird's-Eye' Jack, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4545, name='Picarron' Pete, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4546, name=Jake, level=37, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=4547, name=Bedread the bold, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4548, name=Wilson, level=37, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=4549, name=Tommy 2-times, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4550, name=Murky Pat, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4551, name=Jack Sails, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4552, name=Palmer, level=37, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=4553, name='Betty' B.Boppin, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4554, name='Beedy-eye' Jones, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4555, name=Jenny Blade, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4556, name='Lecherous' Lee, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4557, name='Sticky' Sanders, level=0, option=[Talk-to, null, null, null, null], anims=[7188, -1]. +NPC id=4558, name=Hirko, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=4559, name=Holoy, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=4560, name=Frizzy Skernip, level=0, option=[Talk-to, null, Pay, null, null], anims=[195, 189]. +NPC id=4561, name=Yulf Squecks, level=0, option=[Talk-to, null, Pay, null, null], anims=[195, 189]. +NPC id=4562, name=Praistan Ebola, level=0, option=[Talk-to, null, Pay, null, null], anims=[195, 189]. +NPC id=4563, name=Hura, level=0, option=[Talk-to, null, Trade, null, null], anims=[101, 98]. +NPC id=4564, name=Digsite workman, level=0, option=[Talk-to, null, Steal-from, null, null], anims=[808, -1]. +NPC id=4565, name=Digsite workman, level=0, option=[Talk-to, null, Steal-from, null, null], anims=[808, -1]. +NPC id=4566, name=Examiner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4567, name=Examiner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4568, name=Researcher, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4569, name=Nick, level=0, option=[null, null, null, null, null], anims=[4594, -1]. +NPC id=4570, name=Crow, level=0, option=[null, null, null, null, null], anims=[6786, 6784]. +NPC id=4571, name=Crow, level=0, option=[null, null, null, null, null], anims=[6787, 6784]. +NPC id=4572, name=Gianne jnr., level=0, option=[Talk-to, null, null, null, null], anims=[4536, -1]. +NPC id=4573, name=Timble, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4574, name=Tamble, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4575, name=Spang, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4576, name=Brambickle, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4577, name=Wingstone, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4578, name=Penwie, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4579, name=Generic Diplomat, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4580, name=Ambassador Gimblewap, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4581, name=Ambassador Spanfipple, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4582, name=Ambassador Ferrnook, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4583, name=Professor Manglethorp, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4584, name=Damwin, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4585, name=Professor Onglewip, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4586, name=Professor Imblewyn, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4587, name=Perrdur, level=0, option=[Talk-to, null, null, null, null], anims=[4538, -1]. +NPC id=4588, name=Dalila, level=0, option=[Talk-to, null, null, null, null], anims=[4537, -1]. +NPC id=4589, name=Sorrn, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4590, name=Mimm, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4591, name=Eebel, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4592, name=Ermin, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4593, name=Portobello, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4594, name=Captain Ninto, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4595, name=Captain Daerkin, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4596, name=Captain Lamdoo, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4597, name=Meegle, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4598, name=Wurbel, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4599, name=Sarble, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4600, name=Guard Vemmeldo, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4601, name=Burkor, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4602, name=Froono, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=4603, name=Fortress Guard, level=20, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4604, name=Fortress Guard, level=20, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=4605, name=Fortress Guard, level=20, option=[Talk-to, Attack, null, null, null], anims=[813, -1]. +NPC id=4606, name=Fortress Guard, level=20, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4607, name=Black Cat, level=0, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=4608, name=Monk, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4609, name=null, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4610, name=Brimstail, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4611, name=Saboteur, level=0, option=[null, null, null, null, null], anims=[1412, 189]. +NPC id=4612, name=Gnome shop keeper, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC (wrapper) id=4613, child npcs=[4614, 4615, 1957, -1]. +NPC id=4614, name=Cute creature, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4615, name=Evil creature, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=4616, child npcs=[4617, 4618, 1957, -1]. +NPC id=4617, name=Cute creature, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4618, name=Evil creature, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=4619, child npcs=[4620, 4621, 1957, -1]. +NPC id=4620, name=Cute creature, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4621, name=Evil creature, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=4622, child npcs=[4623, 4624, 1957, -1]. +NPC id=4623, name=Cute creature, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4624, name=Evil creature, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=4625, child npcs=[4626, 4627, 1957, -1]. +NPC id=4626, name=Cute creature, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4627, name=Evil creature, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=4628, child npcs=[4629, 4630, 1957, -1]. +NPC id=4629, name=Cute creature, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4630, name=Evil creature, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=4631, name=fluffie, level=0, option=[null, null, null, null, null], anims=[4472, 4473]. +NPC id=4632, name=fluffie, level=0, option=[null, null, null, null, null], anims=[4472, 4473]. +NPC id=4633, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6140, 6141]. +NPC id=4634, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6140, 6141]. +NPC id=4635, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6140, 6141]. +NPC id=4636, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6140, 6141]. +NPC id=4637, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6140, 6141]. +NPC id=4638, name=Gnome soldier, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4639, name=Gnome soldier, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4640, name=Gnome soldier, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4641, name=Gnome soldier, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4642, name=Gnome soldier, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4643, name=Healthorg and tortoise, level=0, option=[null, null, null, null, null], anims=[3952, -1]. +NPC id=4644, name=Oaknock the Engineer, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4645, name=Glouphrie the Untrusted, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4646, name=King Healthorg, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4647, name=Hazelmere, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=4648, name=Nisha, level=0, option=[null, null, null, null, null], anims=[4593, -1]. +NPC id=4649, name=Tyras guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=4650, name=Trader Stan, level=0, option=[Talk-To, null, Trade, Charter, null], anims=[808, -1]. +NPC id=4651, name=Trader Crewmember, level=0, option=[Talk-To, null, Trade, Charter, null], anims=[808, -1]. +NPC id=4652, name=Trader Crewmember, level=0, option=[Talk-To, null, Trade, Charter, null], anims=[808, -1]. +NPC id=4653, name=Trader Crewmember, level=0, option=[Talk-To, null, Trade, Charter, null], anims=[808, -1]. +NPC id=4654, name=Trader Crewmember, level=0, option=[Talk-To, null, Trade, Charter, null], anims=[808, -1]. +NPC id=4655, name=Trader Crewmember, level=0, option=[Talk-To, null, Trade, Charter, null], anims=[808, -1]. +NPC id=4656, name=Trader Crewmember, level=0, option=[Talk-To, null, Trade, Charter, null], anims=[808, -1]. +NPC id=4657, name=Sir Prysin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4658, name=Dark wizard, level=7, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4659, name=Dark wizard, level=7, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4660, name=Dark wizard, level=20, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4661, name=Dark wizard, level=20, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4662, name=Denath, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4663, name=Denath, level=0, option=[null, null, null, null, null], anims=[808, 4626]. +NPC id=4664, name=Wally, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4665, name=Baby blue dragon, level=48, option=[null, Attack, null, null, null], anims=[27, 21]. +NPC id=4666, name=Baby blue dragon, level=48, option=[null, Attack, null, null, null], anims=[27, 21]. +NPC id=4667, name=Baby red dragon, level=48, option=[null, Attack, null, null, null], anims=[27, 21]. +NPC id=4668, name=Baby red dragon, level=48, option=[null, Attack, null, null, null], anims=[27, 21]. +NPC id=4669, name=Red dragon, level=152, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4670, name=Red dragon, level=152, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4671, name=Red dragon, level=152, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4672, name=Red dragon, level=152, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4673, name=Black dragon, level=227, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4674, name=Black dragon, level=227, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4675, name=Black dragon, level=227, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4676, name=Black dragon, level=227, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4677, name=Green dragon, level=79, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4678, name=Green dragon, level=79, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4679, name=Green dragon, level=79, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4680, name=Green dragon, level=79, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4681, name=Blue dragon, level=111, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4682, name=Blue dragon, level=111, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4683, name=Blue dragon, level=111, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4684, name=Blue dragon, level=111, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=4685, name=Ice giant, level=53, option=[null, Attack, null, null, null], anims=[4670, 4669]. +NPC id=4686, name=Ice giant, level=53, option=[null, Attack, null, null, null], anims=[4670, 4669]. +NPC id=4687, name=Ice giant, level=53, option=[null, Attack, null, null, null], anims=[4670, 4669]. +NPC id=4688, name=Moss giant, level=42, option=[null, Attack, null, null, null], anims=[4656, 4655]. +NPC id=4689, name=Hill Giant, level=28, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=4690, name=Hill Giant, level=28, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=4691, name=Hill Giant, level=28, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=4692, name=Hill Giant, level=28, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=4693, name=Hill Giant, level=28, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=4694, name=Lesser demon, level=82, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4695, name=Lesser demon, level=82, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4696, name=Lesser demon, level=82, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4697, name=Lesser demon, level=82, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4698, name=Greater demon, level=92, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4699, name=Greater demon, level=92, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4700, name=Greater demon, level=92, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4701, name=Greater demon, level=92, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4702, name=Black demon, level=172, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4703, name=Black demon, level=172, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4704, name=Black demon, level=172, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4705, name=Black demon, level=172, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=4706, name=Moss giant, level=48, option=[null, Attack, null, null, null], anims=[4656, 4654]. +NPC id=4707, name=Magic combat tutor, level=0, option=[Talk-to, null, Claim, null, null], anims=[813, -1]. +NPC id=4708, name=Old Man Ral, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4709, name=Vertida Sefalatis, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4710, name=Aeonisig Raispher, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4711, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4712, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4713, name=Safalaan, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4714, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4715, name=Sarius Guile, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4716, name=Trader Sven, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4717, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4718, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4719, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4720, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4721, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4722, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4723, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4724, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4725, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4726, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4727, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4728, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4729, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[4712, -1]. +NPC id=4730, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[4712, -1]. +NPC id=4731, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[4712, -1]. +NPC id=4732, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4733, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4734, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4735, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4736, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4737, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4738, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4739, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4740, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4741, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4742, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4743, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4744, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[4712, -1]. +NPC id=4745, name=Meiyerditch citizen, level=0, option=[Talk-to, null, null, null, null], anims=[4712, -1]. +NPC id=4746, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=4747, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7298, 7297]. +NPC id=4748, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=4749, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7298, 7297]. +NPC id=4750, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=4751, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=4752, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=4753, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7298, 7297]. +NPC id=4754, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=4755, name=A Meiyerditch child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=4756, name=Meiyerditch miner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4757, name=Meiyerditch miner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4758, name=Meiyerditch miner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4759, name=Meiyerditch miner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4760, name=Meiyerditch miner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4761, name=Meiyerditch miner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4762, name=Shadowy figure, level=0, option=[null, null, null, null, null], anims=[6539, 6541]. +NPC id=4763, name=Shadowy figure, level=0, option=[null, null, null, null, null], anims=[6539, 6541]. +NPC id=4764, name=Shadowy figure, level=0, option=[null, null, null, null, null], anims=[6545, 6544]. +NPC id=4765, name=null, level=0, option=[null, null, null, null, null], anims=[4753, 4754]. +NPC id=4766, name=Stray dog, level=0, option=[null, null, null, null, null], anims=[4777, 4773]. +NPC id=4767, name=Stray dog, level=0, option=[null, null, null, null, null], anims=[4777, 4773]. +NPC id=4768, name=Cat, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=4769, name=Cat, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=4770, name=Boat, level=0, option=[null, null, null, null, null], anims=[4755, 4756]. +NPC id=4771, name=Boat, level=0, option=[null, null, null, null, null], anims=[4756, 4756]. +NPC id=4772, name=Juvinate guard, level=54, option=[Talk-to, null, null, null, null], anims=[4702, 4699]. +NPC id=4773, name=Juvinate guard, level=54, option=[Talk-to, null, null, null, null], anims=[4702, 4700]. +NPC id=4774, name=Vampyre juvenile, level=45, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4775, name=Vampyre juvenile, level=45, option=[Talk-to, Attack, null, null, null], anims=[4703, 4700]. +NPC id=4776, name=Vampyre juvinate, level=54, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4777, name=Vampyre juvinate, level=54, option=[Talk-to, Attack, null, null, null], anims=[4702, 4700]. +NPC id=4778, name=Held vampyre juvenile, level=54, option=[Talk-to, Attack, null, null, null], anims=[4768, -1]. +NPC id=4779, name=Held vampyre juvenile, level=54, option=[Talk-to, Attack, null, null, null], anims=[4768, -1]. +NPC id=4780, name=Held vampyre juvinate, level=54, option=[Talk-to, Attack, null, null, null], anims=[4768, -1]. +NPC id=4781, name=Held vampyre juvinate, level=54, option=[Talk-to, Attack, null, null, null], anims=[4768, -1]. +NPC id=4782, name=Vampyre juvinate, level=0, option=[null, null, null, null, null], anims=[4711, 4699]. +NPC id=4783, name=Former vampyre, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4784, name=Former vampyre, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4785, name=Former vampyre, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4786, name=Former vampyre, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4787, name=Former vampyre, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4788, name=Former vampyre, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4789, name=Angry vampyre, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4790, name=Angry vampyre, level=64, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=4791, name=Vanstrom Klause, level=0, option=[null, null, null, null, null], anims=[4702, 4699]. +NPC id=4792, name=Vanstrom Klause, level=0, option=[null, null, null, null, null], anims=[4702, 4699]. +NPC id=4793, name=Vanstrom Klause, level=169, option=[null, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4794, name=Vanstrom Klause, level=0, option=[null, null, null, null, null], anims=[4690, 4684]. +NPC id=4795, name=Vanstrom Klause, level=0, option=[null, null, null, null, null], anims=[4707, -1]. +NPC id=4796, name=Vanstrom Klause, level=0, option=[null, null, null, null, null], anims=[4696, -1]. +NPC id=4797, name=Vanescula Drakan, level=0, option=[null, null, null, null, null], anims=[4703, 4699]. +NPC id=4798, name=Vanescula Drakan, level=0, option=[null, null, null, null, null], anims=[4703, 4700]. +NPC id=4799, name=Vanescula Drakan, level=0, option=[null, null, null, null, null], anims=[4690, 4684]. +NPC id=4800, name=Vanescula Drakan, level=0, option=[null, null, null, null, null], anims=[4707, -1]. +NPC id=4801, name=Ranis Drakan, level=0, option=[null, null, null, null, null], anims=[4702, 4699]. +NPC id=4802, name=Ranis Drakan, level=0, option=[null, null, null, null, null], anims=[4702, 4699]. +NPC id=4803, name=Ranis Drakan, level=0, option=[null, null, null, null, null], anims=[4690, 4684]. +NPC id=4804, name=Ranis Drakan, level=0, option=[null, null, null, null, null], anims=[4707, -1]. +NPC id=4805, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4703, 4700]. +NPC id=4806, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4703, 4700]. +NPC id=4807, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4703, 4700]. +NPC id=4808, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4703, 4700]. +NPC id=4809, name=Flying female vampire, level=110, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4810, name=Flying female vampire, level=120, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4811, name=Flying female vampire, level=130, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4812, name=Flying female vampire, level=140, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4813, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4814, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4815, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4816, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4817, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4818, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4819, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4820, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4821, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4822, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4823, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4824, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4825, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4826, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4827, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4828, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4829, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4830, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4831, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4832, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4833, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4834, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4835, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4836, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=4837, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4703, 4700]. +NPC id=4838, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4703, 4700]. +NPC id=4839, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4703, 4700]. +NPC id=4840, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4703, 4700]. +NPC id=4841, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4842, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4843, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4844, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4702, 4699]. +NPC id=4845, name=Flying female vampire, level=110, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4846, name=Flying female vampire, level=120, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4847, name=Flying female vampire, level=130, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4848, name=Flying female vampire, level=140, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4849, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4850, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4851, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC id=4852, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4706, -1]. +NPC (wrapper) id=4853, child npcs=[4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4872, 4873, 4873, 4873, 4873, -1]. +NPC (wrapper) id=4854, child npcs=[4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4874, 4875, 4875, -1]. +NPC (wrapper) id=4855, child npcs=[4878, 4878, 4878, 4878, 4878, 4878, 4878, 4878, 4879, 4879, 4879, 4879, 4879, 4879, -1]. +NPC id=4856, name=Ezekial Lovecraft, level=0, option=[Talk-to, null, null, Shop, null], anims=[808, -1]. +NPC (wrapper) id=4857, child npcs=[4883, -1]. +NPC (wrapper) id=4858, child npcs=[4885, 4885, 4885, 4885, 4885, -1]. +NPC (wrapper) id=4859, child npcs=[4887, 4887, 4887, 4887, 4887, 4887, 4887, 4887, 4887, -1]. +NPC (wrapper) id=4860, child npcs=[4895, 4895, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, -1]. +NPC id=4861, name=Sarius Guile, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4862, name=Vanstrom Klause, level=169, option=[null, null, null, null, null], anims=[4702, 4699]. +NPC id=4863, name=Kennith, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 4789]. +NPC id=4864, name=Kennith, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=4865, name=null, level=1, option=[null, null, null, null, null], anims=[7158, 7160]. +NPC id=4866, name=Holgart, level=0, option=[Talk-to, null, null, null, null], anims=[4788, -1]. +NPC id=4867, name=Holgart, level=0, option=[Talk-to, null, null, null, null], anims=[-1, 4787]. +NPC id=4868, name=Holgart, level=0, option=[Talk-to, null, null, null, null], anims=[-1, 4790]. +NPC id=4869, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4870, name=Fisherman, level=0, option=[Talk-to, null, null, null, null], anims=[4825, 4779]. +NPC (wrapper) id=4871, child npcs=[699, 4896, -1]. +NPC id=4872, name=Col. O'Niall, level=0, option=[Talk-to, null, null, null, null], anims=[4780, -1]. +NPC id=4873, name=Col. O'Niall, level=0, option=[Talk-to, null, null, null, null], anims=[4780, -1]. +NPC id=4874, name=Mayor Hobb, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4875, name=Mayor Hobb, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4876, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4877, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4878, name=Brother Maledict, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4879, name=Brother Maledict, level=0, option=[Talk-to, null, null, null, null], anims=[808, 4779]. +NPC id=4880, name=null, level=1, option=[Talk-to, null, null, null, null], anims=[808, 4779]. +NPC id=4881, name=null, level=1, option=[Talk-to, null, null, null, null], anims=[808, 4779]. +NPC id=4882, name=null, level=1, option=[Talk-to, null, null, null, null], anims=[808, 4779]. +NPC id=4883, name=Witchaven villager, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4884, name=Witchaven villager, level=0, option=[Talk-to, null, null, null, null], anims=[808, 4779]. +NPC id=4885, name=Witchaven villager, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4886, name=Witchaven villager, level=0, option=[Talk-to, null, null, null, null], anims=[808, 4779]. +NPC id=4887, name=Witchaven villager, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4888, name=Witchaven villager, level=0, option=[Talk-to, null, null, null, null], anims=[808, 4779]. +NPC id=4889, name=Mother Mallum, level=0, option=[null, null, null, null, null], anims=[4819, 4820]. +NPC id=4890, name=Slug Prince, level=62, option=[null, Attack, null, null, null], anims=[4828, 4821]. +NPC id=4891, name=null, level=1, option=[null, null, null, null, null], anims=[6263, 6264]. +NPC id=4892, name=Giant lobster, level=0, option=[null, null, null, null, null], anims=[6263, 6264]. +NPC id=4893, name=Giant Lobster, level=45, option=[null, Attack, null, null, null], anims=[6263, 6264]. +NPC id=4894, name=Sea slug, level=0, option=[null, null, null, null, null], anims=[932, 933]. +NPC id=4895, name=Jeb, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4896, name=Jeb, level=0, option=[Talk-to, null, null, null, null], anims=[808, 4824]. +NPC id=4897, name=Sir Tinley, level=0, option=[Talk-to, null, null, null, null], anims=[2253, -1]. +NPC id=4898, name=Hobgoblin, level=28, option=[null, Attack, null, null, null], anims=[166, 162]. +NPC id=4899, name=Cooking tutor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4900, name=Crafting tutor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4901, name=Fishing tutor, level=0, option=[Talk-to, null, null, null, null], anims=[3845, -1]. +NPC id=4902, name=Mining tutor, level=0, option=[Talk-to, null, null, null, null], anims=[2065, 2064]. +NPC id=4903, name=Prayer tutor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4904, name=Smithing apprentice, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4905, name=Master smithing tutor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4906, name=Woodsman tutor, level=0, option=[Talk-to, null, null, null, null], anims=[2065, 2064]. +NPC id=4907, name=Banker tutor, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=4908, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=4909, name=Fritz the Glassblower, level=0, option=[Talk-to, null, null, null, null], anims=[4859, -1]. +NPC id=4910, name=Earth elemental, level=35, option=[null, Attack, null, null, null], anims=[4866, 4867]. +NPC id=4911, name=Elemental rock, level=0, option=[Mine, null, null, null, null], anims=[4864, 4864]. +NPC (wrapper) id=4912, child npcs=[4913, 4914, 4915, 4916, 4917, 4918, -1]. +NPC id=4913, name=Jig cart, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4914, name=Jig cart, level=0, option=[Take-from, null, null, null, null], anims=[-1, -1]. +NPC id=4915, name=Jig cart, level=0, option=[Take-from, null, null, null, null], anims=[-1, -1]. +NPC id=4916, name=Jig cart, level=0, option=[Take-from, null, null, null, null], anims=[-1, -1]. +NPC id=4917, name=Jig cart, level=0, option=[Take-from, null, null, null, null], anims=[-1, -1]. +NPC id=4918, name=Jig cart, level=0, option=[Take-from, null, null, null, null], anims=[-1, -1]. +NPC id=4919, name=Abidor Crank, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=4920, name=Giant crypt rat, level=76, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4921, name=Giant crypt rat, level=76, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4922, name=Giant rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4923, name=Giant rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4924, name=Giant rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4925, name=Giant rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4926, name=Giant rat, level=6, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4927, name=Giant rat, level=6, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4928, name=Dungeon rat, level=12, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4929, name=Dungeon rat, level=12, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4930, name=Goat, level=23, option=[null, Attack, null, null, null], anims=[5339, 5340]. +NPC id=4931, name=Goat, level=23, option=[null, Attack, null, null, null], anims=[5339, 5340]. +NPC id=4932, name=Billy Goat, level=33, option=[null, Attack, null, null, null], anims=[5339, 5340]. +NPC id=4933, name=Goat, level=23, option=[null, Attack, null, null, null], anims=[5339, 5340]. +NPC id=4934, name=Goat, level=23, option=[null, Attack, null, null, null], anims=[5339, 5340]. +NPC id=4935, name=Billy Goat, level=33, option=[null, Attack, null, null, null], anims=[5339, 5340]. +NPC id=4936, name=Dungeon rat, level=12, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4937, name=Dungeon rat, level=12, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4938, name=Angry giant rat, level=45, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4939, name=Angry giant rat, level=45, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4940, name=Angry giant rat, level=47, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4941, name=Blessed giant rat, level=9, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4942, name=Giant rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4943, name=Giant rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4944, name=Giant rat, level=26, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4945, name=Giant rat, level=26, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=4946, name=Ignatius Vulcan, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4947, name=My Arm, level=0, option=[Talk-to, null, null, null, null], anims=[4986, 283]. +NPC id=4948, name=My Arm, level=0, option=[null, null, null, null, null], anims=[4986, 283]. +NPC id=4949, name=My Arm, level=0, option=[Talk-to, null, null, null, null], anims=[4986, 283]. +NPC id=4950, name=null, level=1, option=[null, null, null, null, null], anims=[4986, 283]. +NPC id=4951, name=null, level=1, option=[null, null, null, null, null], anims=[4986, 283]. +NPC id=4952, name=null, level=1, option=[null, null, null, null, null], anims=[4986, 283]. +NPC id=4953, name=null, level=1, option=[null, null, null, null, null], anims=[4986, -1]. +NPC id=4954, name=null, level=1, option=[null, null, null, null, null], anims=[4986, 283]. +NPC id=4955, name=null, level=1, option=[null, null, null, null, null], anims=[4986, -1]. +NPC id=4956, name=null, level=1, option=[null, null, null, null, null], anims=[4986, 283]. +NPC id=4957, name=My Arm, level=0, option=[null, null, null, null, null], anims=[4986, -1]. +NPC id=4958, name=My Arm, level=0, option=[null, null, null, null, null], anims=[4986, -1]. +NPC id=4959, name=My Arm, level=0, option=[null, null, null, null, null], anims=[4986, -1]. +NPC id=4960, name=Adventurer, level=0, option=[null, null, null, null, null], anims=[479, -1]. +NPC id=4961, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4962, name=Captain Barnaby, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4963, name=Murcaily, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=4964, name=Jagbakoba, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=4965, name=Tool Leprechaun, level=0, option=[Talk-to, null, Exchange, Trade, null], anims=[5002, -1]. +NPC id=4966, name=null, level=1, option=[null, null, null, null, null], anims=[0, 0]. +NPC id=4967, name=Flies, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4968, name=Unnamed troll child, level=0, option=[null, null, null, null, null], anims=[286, 283]. +NPC id=4969, name=Drunken dwarf's leg, level=0, option=[Talk-to, null, null, null, null], anims=[286, 283]. +NPC id=4970, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4971, name=Baby Roc, level=75, option=[null, Attack, null, null, null], anims=[5029, 5030]. +NPC id=4972, name=Giant Roc, level=172, option=[null, Attack, null, null, null], anims=[5021, 5022]. +NPC id=4973, name=Shadow, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4974, name=Captain Barnaby, level=0, option=[Talk-to, null, Pay-fare, null, null], anims=[-1, -1]. +NPC id=4975, name=Male slave, level=0, option=[Talk-to, null, null, null, null], anims=[6935, -1]. +NPC id=4976, name=Male slave, level=0, option=[Talk-to, null, null, null, null], anims=[6935, -1]. +NPC id=4977, name=Female slave, level=0, option=[Talk-to, null, null, null, null], anims=[6935, -1]. +NPC id=4978, name=Female slave, level=0, option=[Talk-to, null, null, null, null], anims=[6935, -1]. +NPC id=4979, name=Cart Camel, level=0, option=[Talk-to, null, null, null, null], anims=[5044, -1]. +NPC id=4980, name=Mine Cart, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4981, name=Mine Cart, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=4982, name=Ana, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=4983, name=Mercenary, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC (wrapper) id=4984, child npcs=[822, -1]. +NPC (wrapper) id=4985, child npcs=[825, 826, -1]. +NPC (wrapper) id=4986, child npcs=[835, -1]. +NPC id=4987, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=4988, name=Irena, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=4989, name=Mercenary, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4990, name=Mercenary, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4991, name=Mercenary, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4992, name=Mercenary, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4993, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4994, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4995, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4996, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4997, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4998, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=4999, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=5000, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=5001, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=5002, name=Guard, level=45, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC (wrapper) id=5003, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5004, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5005, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5006, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5007, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5008, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5009, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5010, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5011, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5012, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5013, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5014, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5015, child npcs=[5017, 5018, 5019, -1]. +NPC (wrapper) id=5016, child npcs=[5017, 5018, 5019, -1]. +NPC id=5017, name=Gublinch, level=0, option=[null, Pelt, null, null, null], anims=[5070, 5069]. +NPC id=5018, name=Gublinch, level=0, option=[null, Pelt, null, null, null], anims=[5070, 5069]. +NPC id=5019, name=Gublinch, level=0, option=[null, Pelt, null, null, null], anims=[5070, 5069]. +NPC id=5020, name=null, level=0, option=[null, null, null, null, null], anims=[7158, 7160]. +NPC id=5021, name=null, level=0, option=[null, null, null, null, null], anims=[7158, 7160]. +NPC id=5022, name=null, level=0, option=[null, null, null, null, null], anims=[7158, 7160]. +NPC id=5023, name=Jack, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=5024, name=Jill, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=5025, name=Jeff, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=5026, name=Egg launcher, level=0, option=[null, null, null, null, null], anims=[5424, -1]. +NPC id=5027, name=Egg launcher, level=0, option=[null, null, null, null, null], anims=[5425, -1]. +NPC id=5028, name=Egg launcher, level=0, option=[null, null, null, null, null], anims=[5424, -1]. +NPC id=5029, name=Commander Connad, level=0, option=[Talk-to, null, Get-rewards, null, null], anims=[808, -1]. +NPC id=5030, name=Captain Cain, level=0, option=[Talk-to, null, Tutorial, null, null], anims=[808, -1]. +NPC id=5031, name=Private Paldo, level=0, option=[Talk-to, null, null, null, null], anims=[2065, 2064]. +NPC id=5032, name=Private Pendron, level=0, option=[Talk-to, null, null, null, null], anims=[2561, -1]. +NPC id=5033, name=Private Pierreb, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5034, name=Private Paldon, level=0, option=[Talk-to, null, null, null, null], anims=[2561, -1]. +NPC id=5035, name=Major Attack, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5036, name=Major Collect, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5037, name=Major Defend, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5038, name=Major Heal, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5039, name=Sergeant Sambur, level=0, option=[Talk-to, null, null, null, null], anims=[2065, 2064]. +NPC id=5040, name=Penance Fighter, level=0, option=[null, null, null, null, null], anims=[5094, 5095]. +NPC id=5041, name=Penance Ranger, level=0, option=[null, null, null, null, null], anims=[5393, 5394]. +NPC id=5042, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5043, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5044, name=Penance Fighter, level=30, option=[null, Attack, null, null, null], anims=[5094, 5095]. +NPC id=5045, name=Penance Fighter, level=32, option=[null, Attack, null, null, null], anims=[5094, 5095]. +NPC id=5046, name=Jack, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=5047, name=Jill, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=5048, name=Jeff, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=5049, name=Auguste, level=0, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5050, name=Auguste, level=0, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5051, name=Auguste, level=0, option=[Talk-to, null, null, Fly, null], anims=[773, -1]. +NPC id=5052, name=Auguste, level=0, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5053, name=Assistant Serf, level=0, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5054, name=Assistant Brock, level=0, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5055, name=Assistant Marrow, level=0, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5056, name=Assistant Le Smith, level=0, option=[Talk-to, null, null, Fly, null], anims=[195, 189]. +NPC id=5057, name=Assistant Stan, level=0, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5058, name=Bob, level=0, option=[null, null, null, null, null], anims=[5146, 5150]. +NPC id=5059, name=Curly, level=0, option=[null, null, null, null, null], anims=[5147, 5151]. +NPC id=5060, name=Moe, level=0, option=[null, null, null, null, null], anims=[5148, 5152]. +NPC id=5061, name=Larry, level=0, option=[null, null, null, null, null], anims=[5149, 5153]. +NPC id=5062, name=null, level=1, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5063, name=null, level=1, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5064, name=null, level=1, option=[Talk-to, null, null, Fly, null], anims=[195, 189]. +NPC id=5065, name=null, level=1, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5066, name=null, level=1, option=[Talk-to, null, null, Fly, null], anims=[808, -1]. +NPC id=5067, name=Shark, level=0, option=[null, null, null, null, null], anims=[10, 10]. +NPC id=5068, name=Shark, level=0, option=[null, null, null, null, null], anims=[10, 10]. +NPC id=5069, name=Shark, level=0, option=[null, null, null, null, null], anims=[10, 10]. +NPC id=5070, name=null, level=0, option=[null, null, null, null, hidden], anims=[-1, -1]. +NPC id=5071, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5072, name=Tropical wagtail, level=0, option=[null, null, null, null, hidden], anims=[6771, 6773]. +NPC id=5073, name=Crimson swift, level=0, option=[null, null, null, null, hidden], anims=[6771, 6773]. +NPC id=5074, name=Cerulean twitch, level=0, option=[null, null, null, null, hidden], anims=[6771, 6773]. +NPC id=5075, name=Golden warbler, level=0, option=[null, null, null, null, hidden], anims=[6771, 6773]. +NPC id=5076, name=Copper longtail, level=0, option=[null, null, null, null, hidden], anims=[6771, 6773]. +NPC id=5077, name=null, level=0, option=[null, null, null, null, hidden], anims=[-1, -1]. +NPC id=5078, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5079, name=Chinchompa, level=1, option=[null, Attack, null, null, null], anims=[5182, 5181]. +NPC id=5080, name=Carnivorous chinchompa, level=2, option=[null, Attack, null, null, null], anims=[5182, 5181]. +NPC id=5081, name=Ferret, level=0, option=[null, null, null, null, null], anims=[5188, 5187]. +NPC id=5082, name=Black warlock, level=0, option=[Catch, null, null, null, null], anims=[362, 362]. +NPC id=5083, name=Snowy knight, level=0, option=[Catch, null, null, null, null], anims=[362, 362]. +NPC id=5084, name=Sapphire glacialis, level=0, option=[Catch, null, null, null, null], anims=[362, 362]. +NPC id=5085, name=Ruby harvest, level=0, option=[Catch, null, null, null, null], anims=[362, 362]. +NPC id=5086, name=Prickly kebbit, level=0, option=[null, null, null, null, Hidden], anims=[5273, 5272]. +NPC id=5087, name=Sabre-toothed kebbit, level=0, option=[null, null, null, null, Hidden], anims=[5273, 5272]. +NPC id=5088, name=Barb-tailed kebbit, level=0, option=[null, null, null, null, Hidden], anims=[5273, 5272]. +NPC id=5089, name=Wild kebbit, level=0, option=[null, null, null, null, Hidden], anims=[5273, 5272]. +NPC id=5090, name=null, level=0, option=[null, null, null, null, hidden], anims=[-1, -1]. +NPC id=5091, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5092, name=Matthias, level=0, option=[Talk-to, null, Quick-falconry, null, null], anims=[5160, 5164]. +NPC id=5093, name=Matthias, level=0, option=[Talk-to, null, Quick-falconry, null, null], anims=[5160, 5164]. +NPC id=5094, name=Gyr Falcon, level=0, option=[Retrieve, null, null, null, null], anims=[5202, 5284]. +NPC id=5095, name=Gyr Falcon, level=0, option=[Retrieve, null, null, null, null], anims=[5202, 5284]. +NPC id=5096, name=Gyr Falcon, level=0, option=[Retrieve, null, null, null, null], anims=[5202, 5284]. +NPC id=5097, name=Gyr Falcon, level=0, option=[null, null, null, null, null], anims=[5203, 5284]. +NPC id=5098, name=Spotted kebbit, level=0, option=[Catch, null, null, null, null], anims=[5273, 5272]. +NPC id=5099, name=Dark kebbit, level=0, option=[Catch, null, null, null, null], anims=[5273, 5272]. +NPC id=5100, name=Dashing kebbit, level=0, option=[Catch, null, null, null, null], anims=[5273, 5272]. +NPC id=5101, name=null, level=0, option=[null, null, null, null, hidden], anims=[-1, -1]. +NPC id=5102, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5103, name=Sabre-toothed kyatt, level=60, option=[Tease, null, null, null, null], anims=[5225, 5226]. +NPC id=5104, name=Spined larupia, level=40, option=[Tease, null, null, null, null], anims=[5225, 5226]. +NPC id=5105, name=Horned graahk, level=50, option=[Tease, null, null, null, null], anims=[5225, 5226]. +NPC id=5106, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5107, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5108, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5109, name=Artimeus, level=0, option=[Talk-to, null, null, null, Trade], anims=[808, -1]. +NPC id=5110, name=Aleck, level=0, option=[Talk-to, null, null, null, Trade], anims=[808, -1]. +NPC id=5111, name=Leon, level=0, option=[Talk-to, null, null, null, Trade], anims=[808, -1]. +NPC id=5112, name=Hunting expert, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5113, name=Hunting expert, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5114, name=Orange salamander, level=0, option=[null, null, null, null, null], anims=[5263, 5262]. +NPC id=5115, name=Red salamander, level=0, option=[null, null, null, null, null], anims=[5263, 5262]. +NPC id=5116, name=Black salamander, level=0, option=[null, null, null, null, null], anims=[5263, 5262]. +NPC id=5117, name=Swamp lizard, level=0, option=[null, null, null, null, null], anims=[5263, 5262]. +NPC id=5118, name=null, level=0, option=[null, null, null, null, hidden], anims=[-1, -1]. +NPC id=5119, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5120, name=Eagle, level=0, option=[null, null, null, null, null], anims=[1773, 1773]. +NPC id=5121, name=Eagle, level=0, option=[null, null, null, null, null], anims=[1773, 1773]. +NPC id=5122, name=Eagle, level=0, option=[null, null, null, null, null], anims=[1773, 1773]. +NPC id=5123, name=Eagle, level=0, option=[null, null, null, null, null], anims=[1773, 1773]. +NPC id=5124, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=5125, child npcs=[5128, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5128, -1, -1, -1, -1, 5128, -1, -1, -1, -1, 5128, -1, -1, -1, -1, 5128, -1]. +NPC id=5126, name=Nickolaus, level=0, option=[null, null, null, null, null], anims=[845, 844]. +NPC id=5127, name=Nickolaus, level=0, option=[Shout-to, null, null, null, null], anims=[-1, -1]. +NPC id=5128, name=Nickolaus, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5129, name=Nickolaus, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5130, name=Desert eagle, level=0, option=[null, null, null, null, null], anims=[5280, 5279]. +NPC id=5131, name=Jungle eagle, level=0, option=[null, null, null, null, null], anims=[5280, 5279]. +NPC id=5132, name=Polar eagle, level=0, option=[null, null, null, null, null], anims=[5280, 5279]. +NPC id=5133, name=Eagle, level=0, option=[Walk-past, null, null, null, null], anims=[5280, 5279]. +NPC id=5134, name=null, level=0, option=[null, null, null, null, null], anims=[5280, 5279]. +NPC id=5135, name=null, level=0, option=[null, null, null, null, null], anims=[5280, 5279]. +NPC id=5136, name=null, level=0, option=[null, null, null, null, null], anims=[5280, 5279]. +NPC id=5137, name=Kebbit, level=13, option=[null, Attack, null, null, null], anims=[5302, 5301]. +NPC id=5138, name=Charlie, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5139, name=null, level=0, option=[null, null, null, null, null], anims=[5188, 5187]. +NPC id=5140, name=Boulder, level=0, option=[Push, null, null, null, null], anims=[5310, 5309]. +NPC id=5141, name=Uri, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5142, name=Uri, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5143, name=Uri, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5144, name=Double agent, level=65, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5145, name=Double agent, level=108, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5146, name=Li'l lamb, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5147, name=Lamb, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5148, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5149, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5150, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5151, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5152, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5153, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5154, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5155, name=Sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5156, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5335, 5334]. +NPC id=5157, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5335, 5334]. +NPC id=5158, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5335, 5334]. +NPC id=5159, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5335, 5334]. +NPC id=5160, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5335, 5334]. +NPC id=5161, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5335, 5334]. +NPC id=5162, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5345, 5344]. +NPC id=5163, name=Sheep, level=0, option=[Shear, null, null, null, null], anims=[5345, 5344]. +NPC id=5164, name=Sheep, level=0, option=[Talk-to, null, null, null, null], anims=[5335, 5334]. +NPC id=5165, name=Sheep, level=0, option=[Talk-to, null, null, null, null], anims=[5339, 5340]. +NPC id=5166, name=Mountain Goat, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5167, name=Mountain Goat, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5168, name=Ram, level=2, option=[null, Attack, null, null, null], anims=[5335, 5334]. +NPC id=5169, name=Ram, level=2, option=[null, Attack, null, null, null], anims=[5335, 5334]. +NPC id=5170, name=Ram, level=2, option=[null, Attack, null, null, null], anims=[5345, 5344]. +NPC id=5171, name=Mountain goat, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5172, name=Golden sheep, level=0, option=[null, null, null, null, null], anims=[5339, 5340]. +NPC id=5173, name=Golden sheep, level=0, option=[null, null, null, null, null], anims=[5345, 5344]. +NPC id=5174, name=Ogre chieftain, level=81, option=[null, null, null, null, null], anims=[357, 358]. +NPC (wrapper) id=5175, child npcs=[5176, 5179, -1]. +NPC id=5176, name=Ogre shaman, level=113, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=5177, name=Ogre shaman, level=1, option=[null, null, null, null, null], anims=[357, 358]. +NPC id=5178, name=Blue dragon, level=27, option=[null, null, null, null, null], anims=[90, 79]. +NPC id=5179, name=Ogre shaman, level=113, option=[null, null, null, null, null], anims=[357, 358]. +NPC (wrapper) id=5180, child npcs=[5181, 5182, -1]. +NPC id=5181, name=Ogre shaman, level=113, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=5182, name=Ogre shaman, level=113, option=[null, null, null, null, null], anims=[357, 358]. +NPC (wrapper) id=5183, child npcs=[5184, 5185, -1]. +NPC id=5184, name=Ogre shaman, level=113, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=5185, name=Ogre shaman, level=113, option=[null, null, null, null, null], anims=[357, 358]. +NPC (wrapper) id=5186, child npcs=[5187, 5188, -1]. +NPC id=5187, name=Ogre shaman, level=113, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=5188, name=Ogre shaman, level=113, option=[null, null, null, null, null], anims=[357, 358]. +NPC (wrapper) id=5189, child npcs=[5190, 5191, -1]. +NPC id=5190, name=Ogre shaman, level=113, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=5191, name=Ogre shaman, level=113, option=[null, null, null, null, null], anims=[357, 358]. +NPC (wrapper) id=5192, child npcs=[5193, 5194, -1]. +NPC id=5193, name=Ogre shaman, level=113, option=[Talk-to, Attack, null, null, null], anims=[357, 358]. +NPC id=5194, name=Ogre shaman, level=113, option=[null, null, null, null, null], anims=[357, 358]. +NPC id=5195, name=Wizard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5196, name=Wizard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5197, name=Wizard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5198, name=Ava, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=5199, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5200, name=Witch, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5201, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5202, name=Alice's husband, level=0, option=[Talk-to, null, null, null, null], anims=[5370, 5372]. +NPC id=5203, name=Alice's husband, level=0, option=[Talk-to, null, null, null, null], anims=[5370, 5372]. +NPC id=5204, name=Alice's husband, level=0, option=[null, null, null, null, null], anims=[5370, 5372]. +NPC id=5205, name=Alice's husband, level=0, option=[null, null, null, null, null], anims=[5371, 5373]. +NPC (wrapper) id=5206, child npcs=[5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5202, -1, -1, 5202, -1, -1, 5202, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5203, -1]. +NPC id=5207, name=Tree, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5208, name=Undead tree, level=0, option=[Chop, null, null, null, null], anims=[-1, -1]. +NPC id=5209, name= Sneaky undead fowl, level=1, option=[null, null, null, null, null], anims=[5386, 5385]. +NPC id=5210, name=Cow1337killr, level=123, option=[null, null, null, null, null], anims=[2065, 2064]. +NPC id=5211, name=Undead cow, level=2, option=[null, null, null, null, null], anims=[5852, 5848]. +NPC id=5212, name=Alice, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5213, name=Penance Fighter, level=37, option=[null, Attack, null, null, null], anims=[5094, 5095]. +NPC id=5214, name=Penance Fighter, level=42, option=[null, Attack, null, null, null], anims=[5094, 5095]. +NPC id=5215, name=Penance Fighter, level=47, option=[null, Attack, null, null, null], anims=[5094, 5095]. +NPC id=5216, name=Penance Fighter, level=56, option=[null, Attack, null, null, null], anims=[5094, 5095]. +NPC id=5217, name=Penance Fighter, level=61, option=[null, Attack, null, null, null], anims=[5094, 5095]. +NPC id=5218, name=Penance Fighter, level=68, option=[null, Attack, null, null, null], anims=[5094, 5095]. +NPC id=5219, name=Penance Fighter, level=77, option=[null, Attack, null, null, null], anims=[5094, 5095]. +NPC id=5220, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5221, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5222, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5223, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5224, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5225, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5226, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5227, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5228, name=Penance Runner, level=0, option=[null, null, null, null, null], anims=[5099, 5100]. +NPC id=5229, name=Penance Ranger, level=21, option=[null, Attack, null, null, null], anims=[5393, 5394]. +NPC id=5230, name=Penance Ranger, level=25, option=[null, Attack, null, null, null], anims=[5393, 5394]. +NPC id=5231, name=Penance Ranger, level=32, option=[null, Attack, null, null, null], anims=[5393, 5394]. +NPC id=5232, name=Penance Ranger, level=38, option=[null, Attack, null, null, null], anims=[5393, 5394]. +NPC id=5233, name=Penance Ranger, level=43, option=[null, Attack, null, null, null], anims=[5393, 5394]. +NPC id=5234, name=Penance Ranger, level=51, option=[null, Attack, null, null, null], anims=[5393, 5394]. +NPC id=5235, name=Penance Ranger, level=57, option=[null, Attack, null, null, null], anims=[5393, 5394]. +NPC id=5236, name=Penance Ranger, level=64, option=[null, Attack, null, null, null], anims=[5393, 5394]. +NPC id=5237, name=Penance Ranger, level=72, option=[null, Attack, null, null, null], anims=[5393, 5394]. +NPC id=5238, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5239, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5240, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5241, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5242, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5243, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5244, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5245, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5246, name=Penance Healer, level=0, option=[null, null, null, null, null], anims=[5104, 5107]. +NPC id=5247, name=Penance Queen, level=209, option=[null, Attack, null, null, null], anims=[5410, 5409]. +NPC id=5248, name=Queen spawn, level=63, option=[null, Attack, null, null, null], anims=[5090, 5089]. +NPC id=5249, name=Captain Errdo, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=5250, name=Scarab mage, level=93, option=[null, Attack, null, null, null], anims=[7618, 7619]. +NPC id=5251, name=Locust rider, level=106, option=[null, Attack, null, null, null], anims=[7583, 7582]. +NPC id=5252, name=Locust rider, level=98, option=[null, Attack, null, null, null], anims=[7583, 7582]. +NPC id=5253, name=Giant scarab, level=191, option=[null, Attack, null, null, null], anims=[5455, 5454]. +NPC id=5254, name=Scarab mage, level=66, option=[null, Attack, null, null, null], anims=[7618, 7619]. +NPC id=5255, name=Locust rider, level=68, option=[null, Attack, null, null, null], anims=[7583, 7582]. +NPC id=5256, name=Locust rider, level=68, option=[null, Attack, null, null, null], anims=[7583, 7582]. +NPC id=5257, name=null, level=1, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=5258, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=5259, name=null, level=1, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=5260, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=5261, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5262, name=Stonemason, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5263, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5264, name=Nathifa, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=5265, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5266, name=Urbi, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=5267, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5268, name=Jamila, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=5269, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5270, name=Sophanem guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=5271, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5272, name=Sophanem guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5273, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5274, name=Sophanem guard, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=5275, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5276, name=Sophanem guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5277, name=Menaphite guard, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5278, name=Coenus, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5279, name=Jex, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=5280, child npcs=[5281, -1]. +NPC id=5281, name=Maisa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=5282, child npcs=[924, 924, 5284, -1]. +NPC id=5283, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5284, name=Osman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5285, name=Osman, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5286, name=Osman, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5287, name=Osman, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5288, name=Embalmer, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5289, name=Carpenter, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5290, name=Linen worker, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5291, name=Priest, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5292, name=Giant scarab, level=0, option=[null, null, null, null, null], anims=[5455, 5454]. +NPC id=5293, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5294, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5295, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5296, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5297, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5298, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5299, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5300, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5301, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5302, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5303, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5304, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5305, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5306, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5307, name=Zombie, level=13, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5308, name=Zombie, level=18, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5309, name=Zombie, level=18, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5310, name=Zombie, level=18, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5311, name=Zombie, level=18, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5312, name=Zombie, level=18, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5313, name=Zombie, level=18, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5314, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5315, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5576, -1]. +NPC id=5316, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5317, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5318, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5319, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5320, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5321, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5322, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5576, -1]. +NPC id=5323, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5324, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5325, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5326, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5327, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5328, name=Zombie, level=25, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5329, name=Zombie, level=25, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5330, name=Zombie, level=25, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5331, name=Zombie, level=25, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5332, name=Skeleton, level=22, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5333, name=Skeleton, level=22, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5334, name=Skeleton, level=22, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5335, name=Skeleton, level=21, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5336, name=Skeleton, level=21, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5337, name=Skeleton, level=25, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5338, name=Skeleton, level=25, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5339, name=Skeleton, level=25, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5340, name=Skeleton, level=25, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5341, name=Skeleton, level=45, option=[null, Attack, null, null, null], anims=[5495, 5497]. +NPC id=5342, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5343, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5344, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5345, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5346, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5347, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5348, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5349, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5350, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5351, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5352, name=Ghost, level=19, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5353, name=Undead one, level=68, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5354, name=Undead one, level=61, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5355, name=Undead one, level=68, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5356, name=Undead one, level=68, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5357, name=Undead one, level=73, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5358, name=Undead one, level=73, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5359, name=Giant skeleton, level=80, option=[null, Attack, null, null, null], anims=[5493, 5497]. +NPC id=5360, name=Mummy ashes, level=96, option=[null, null, null, null, null], anims=[5563, 5563]. +NPC id=5361, name=Waterfiend, level=115, option=[null, Attack, null, null, null], anims=[1578, 1579]. +NPC id=5362, name=Brutal green dragon, level=227, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=5363, name=Mithril dragon, level=304, option=[null, Attack, null, null, null], anims=[90, 79]. +NPC id=5364, name=Confused barbarian, level=132, option=[null, Attack, null, null, null], anims=[2065, 2064]. +NPC id=5365, name=Skeleton, level=60, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5366, name=Skeleton, level=60, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5367, name=Skeleton, level=85, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5368, name=Skeleton, level=85, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5369, name=Ghost, level=77, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5370, name=Ghost, level=77, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5371, name=Ghost, level=77, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5372, name=Ghost, level=76, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5373, name=Ghost, level=76, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5374, name=Ghost, level=76, option=[null, Attack, null, null, null], anims=[5530, 5531]. +NPC id=5375, name=Zombie, level=30, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5376, name=Zombie, level=30, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=5377, name=Zombie, level=44, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5378, name=Zombie, level=44, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5379, name=Zombie, level=53, option=[null, Attack, null, null, null], anims=[5576, -1]. +NPC id=5380, name=Zombie, level=53, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=5381, name=Skeleton, level=77, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5382, name=Animated steel armour, level=53, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5383, name=Odovacar, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[5607, 5606]. +NPC id=5384, name=Giant skeleton, level=100, option=[null, Attack, null, null, null], anims=[5493, 5497]. +NPC id=5385, name=Skeleton, level=94, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5386, name=Skeleton, level=77, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5387, name=Skeleton, level=81, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5388, name=Skeleton, level=42, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5389, name=Skeleton, level=59, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5390, name=Skeleton, level=42, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5391, name=Skeleton, level=63, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5392, name=Skeleton, level=40, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5393, name=Zombie, level=40, option=[null, Attack, null, null, null], anims=[5576, 5577]. +NPC id=5394, name=Zombie, level=42, option=[null, Attack, null, null, null], anims=[5576, 5577]. +NPC id=5395, name=Zombie, level=47, option=[null, Attack, null, null, null], anims=[5576, 5577]. +NPC id=5396, name=Zombie, level=50, option=[null, Attack, null, null, null], anims=[5576, 5577]. +NPC id=5397, name=Zombie, level=56, option=[null, Attack, null, null, null], anims=[5576, 5577]. +NPC id=5398, name=Zombie, level=61, option=[null, Attack, null, null, null], anims=[5576, 5577]. +NPC id=5399, name=Zombie, level=67, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5400, name=Zombie, level=70, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5401, name=Zombie, level=72, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5402, name=Zombie, level=76, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5403, name=Zombie, level=80, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5404, name=Zombie, level=85, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5405, name=Zombie, level=86, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5406, name=Zombie, level=90, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5407, name=Zombie, level=95, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5408, name=Zombie, level=98, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5409, name=Zombie, level=100, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5410, name=Zombie, level=81, option=[null, Attack, null, null, null], anims=[5572, 5570]. +NPC id=5411, name=Skeleton, level=72, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=5412, name=Skeleton, level=87, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5413, name=Possessed pickaxe, level=50, option=[null, Attack, null, null, null], anims=[5589, 5593]. +NPC id=5414, name=Animated spade, level=50, option=[null, Attack, null, null, null], anims=[5594, 5595]. +NPC id=5415, name=Terror dog statue, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5416, name=Terror dog statue, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5417, name=Terror dog, level=110, option=[null, Attack, null, null, null], anims=[5623, 5622]. +NPC id=5418, name=Terror dog, level=100, option=[null, Attack, null, null, null], anims=[5623, 5622]. +NPC id=5419, name=Tarn, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5420, name=Tarn, level=69, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5421, name=Mutant tarn, level=69, option=[null, Attack, null, null, null], anims=[5616, 5615]. +NPC id=5422, name=Skeleton, level=77, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=5423, name=null, level=0, option=[Talk-to, null, Tuxedo-time, null, null], anims=[808, -1]. +NPC id=5424, name=Larry, level=0, option=[Talk-to, null, Tuxedo-time, null, null], anims=[808, -1]. +NPC id=5425, name=Larry, level=0, option=[Talk-to, null, null, Travel, null], anims=[808, -1]. +NPC id=5426, name=Larry, level=0, option=[Talk-to, null, Tuxedo-time, Travel, null], anims=[808, -1]. +NPC (wrapper) id=5427, child npcs=[5428, 5428, 5428, -1]. +NPC id=5428, name=Penguin, level=0, option=[null, null, null, null, null], anims=[5668, 5666]. +NPC id=5429, name=Penguin, level=0, option=[Talk-to, null, null, null, null], anims=[5668, 5666]. +NPC id=5430, name=Penguin, level=0, option=[null, null, null, null, null], anims=[5668, 5666]. +NPC id=5431, name=KGP Guard, level=0, option=[null, null, null, null, null], anims=[5668, 5666]. +NPC id=5432, name=Pescaling Pax, level=0, option=[null, null, null, null, null], anims=[5668, 5666]. +NPC id=5433, name=Ping, level=0, option=[null, null, null, null, null], anims=[5673, -1]. +NPC id=5434, name=Ping, level=0, option=[null, null, null, null, null], anims=[5668, -1]. +NPC id=5435, name=Pong, level=0, option=[null, null, null, null, null], anims=[5675, -1]. +NPC id=5436, name=Pong, level=0, option=[null, null, null, null, null], anims=[5668, -1]. +NPC id=5437, name=Ping, level=0, option=[Talk-to, null, null, null, null], anims=[5668, 5666]. +NPC id=5438, name=Pong, level=0, option=[Talk-to, null, null, null, null], anims=[5668, 5666]. +NPC id=5439, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[5668, 5666]. +NPC (wrapper) id=5440, child npcs=[5441, 5441, -1]. +NPC id=5441, name=KGP Agent, level=0, option=[Talk-to, null, null, null, null], anims=[5668, 5666]. +NPC id=5442, name=KGP Agent, level=0, option=[Talk-to, null, null, null, null], anims=[5668, 5666]. +NPC id=5443, name=null, level=1, option=[null, null, null, null, null], anims=[5668, 5666]. +NPC id=5444, name=Noodle, level=0, option=[Talk-to, null, null, null, null], anims=[5668, 5666]. +NPC id=5445, name=Penguin, level=0, option=[Talk-to, null, null, null, null], anims=[5668, 5666]. +NPC id=5446, name=Penguin suit, level=0, option=[Pick-up, null, null, null, null], anims=[5668, 5666]. +NPC id=5447, name=Agility Instructor, level=0, option=[Talk-to, null, null, null, null], anims=[5677, 5676]. +NPC id=5448, name=Army Commander, level=0, option=[Talk-to, null, null, null, null], anims=[5677, 5676]. +NPC id=5449, name=Penguin, level=0, option=[null, null, null, null, null], anims=[5680, -1]. +NPC id=5450, name=Penguin, level=0, option=[null, null, null, null, null], anims=[5682, -1]. +NPC id=5451, name=Penguin, level=0, option=[null, null, null, null, null], anims=[5685, -1]. +NPC id=5452, name=Icelord, level=51, option=[null, Attack, null, null, null], anims=[5722, 5721]. +NPC id=5453, name=Icelord, level=51, option=[null, Attack, null, null, null], anims=[5722, 5721]. +NPC id=5454, name=Icelord, level=51, option=[null, Attack, null, null, null], anims=[5722, 5721]. +NPC id=5455, name=Icelord, level=51, option=[null, Attack, null, null, null], anims=[5722, 5721]. +NPC id=5456, name=Crusher, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5457, name=Crusher, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5458, name=Crusher, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5459, name=Crusher, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5460, name=Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=5461, name=Jungle Tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5751, 5751]. +NPC id=5462, name=Tolna, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5463, name=Honour guard, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=5464, name=Honour guard, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=5465, name=Fridleif Shieldson, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5466, name=Thakkrad Sigmundson, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5467, name=Iceberg, level=0, option=[null, null, null, null, null], anims=[5770, 5770]. +NPC id=5468, name=Iceberg, level=0, option=[null, null, null, null, null], anims=[5770, 5770]. +NPC id=5469, name=Arctic Pine, level=0, option=[Chop down, null, hidden, null, null], anims=[5773, 5773]. +NPC id=5470, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=5471, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=5472, name=Ice Troll King, level=122, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5473, name=Ice troll runt, level=74, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5474, name=Ice troll male, level=82, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5475, name=Ice troll female, level=82, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5476, name=Ice troll grunt, level=102, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5477, name=Bork Sigmundson, level=0, option=[Talk-to, null, Request-supplies, null, null], anims=[808, -1]. +NPC id=5478, name=King Gjuki Sorvott IV, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5479, name=HRH Hrafn, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=5480, name=Thorkel Silkbeard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5481, name=Mord Gunnars, level=0, option=[Talk-to, null, Ferry-Jatizso, null, null], anims=[808, -1]. +NPC id=5482, name=Mord Gunnars, level=0, option=[Talk-to, null, Ferry-Rellekka, null, null], anims=[808, -1]. +NPC id=5483, name=Hring Hring, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=5484, name=Flosi Dalksson, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=5485, name=Raum Urda-Stein, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=5486, name=Skuli Myrka, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=5487, name=Keepa Kettilon, level=0, option=[Talk-to, null, Trade, null, null], anims=[813, -1]. +NPC id=5488, name=Magnus Gram, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=5489, name=Guard, level=0, option=[Talk-to, null, Watch-shouting, null, null], anims=[808, -1]. +NPC id=5490, name=Guard, level=0, option=[Talk-to, null, Watch-shouting, null, null], anims=[813, -1]. +NPC id=5491, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5492, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5493, name=Freygerd, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5494, name=Lensa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5495, name=Vanligga Gastfrihet, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5496, name=Sassilik, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5497, name=Miner, level=0, option=[Talk-to, null, null, null, null], anims=[627, -1]. +NPC id=5498, name=Miner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5499, name=Eric, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5500, name=Gruva Patrull, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5501, name=Brendt, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=5502, name=Grundt, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=5503, name=Mawnis Burowgar, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5504, name=Mawnis Burowgar, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5505, name=Fridleif Shieldson, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5506, name=Thakkrad Sigmundson, level=0, option=[Talk-to, null, Craft-goods, null, null], anims=[808, -1]. +NPC id=5507, name=Maria Gunnars, level=0, option=[Talk-to, null, Ferry-Rellekka, null, null], anims=[808, -1]. +NPC id=5508, name=Maria Gunnars, level=0, option=[Talk-to, null, Ferry-Neitiznot, null, null], anims=[808, -1]. +NPC id=5509, name=Jofridr Mordstatter, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=5510, name=Morten Holdstrom, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5511, name=Gunnar Holdstrom, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5512, name=Anne Isaakson, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5513, name=Lisse Isaakson, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5514, name=Honour guard, level=115, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=5515, name=Honour guard, level=115, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5516, name=Honour guard, level=115, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5517, name=Honour guard, level=115, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5518, name=Kjedelig Uppsen, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=5519, name=Trogen Konungarde, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=5520, name=Slug Hemligssen, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5521, name=Ice troll runt, level=74, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5522, name=Ice troll male, level=82, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5523, name=Ice troll female, level=82, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5524, name=Ice troll grunt, level=100, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5525, name=Ice troll runt, level=74, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5526, name=Ice troll male, level=82, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5527, name=Ice troll female, level=82, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5528, name=Ice troll grunt, level=100, option=[null, Attack, null, null, null], anims=[286, 283]. +NPC id=5529, name=Yak, level=22, option=[null, Attack, null, null, null], anims=[5785, 5781]. +NPC (wrapper) id=5530, child npcs=[5503, 5504, -1]. +NPC id=5531, name=Sorceress, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5532, name=Apprentice, level=0, option=[Talk-to, null, null, Teleport, null], anims=[5800, 5799]. +NPC id=5533, name=Autumn Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5534, name=Autumn Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5535, name=Autumn Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5536, name=Autumn Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5537, name=Autumn Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5538, name=Autumn Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5539, name=Spring Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5540, name=Spring Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5541, name=Spring Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5542, name=Spring Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5543, name=Spring Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5544, name=Spring Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5545, name=Spring Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5546, name=Spring Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5547, name=Summer Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5548, name=Summer Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5549, name=Summer Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5550, name=Summer Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5551, name=Summer Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5552, name=Summer Elemental, level=0, option=[null, null, null, null, null], anims=[5801, 5802]. +NPC id=5553, name=Winter Elemental, level=0, option=[null, null, null, null, null], anims=[5803, 5802]. +NPC id=5554, name=Winter Elemental, level=0, option=[null, null, null, null, null], anims=[5803, 5802]. +NPC id=5555, name=Winter Elemental, level=0, option=[null, null, null, null, null], anims=[5803, 5802]. +NPC id=5556, name=Winter Elemental, level=0, option=[null, null, null, null, null], anims=[5803, 5802]. +NPC id=5557, name=Winter Elemental, level=0, option=[null, null, null, null, null], anims=[5803, 5802]. +NPC id=5558, name=Winter Elemental, level=0, option=[null, null, null, null, null], anims=[5803, 5802]. +NPC id=5559, name=Osman, level=0, option=[Talk-to, null, null, null, null], anims=[3396, 3396]. +NPC id=5560, name=Osman, level=0, option=[Talk-to, null, null, null, null], anims=[3396, 3396]. +NPC id=5561, name=Osman, level=0, option=[Inspect, null, null, null, null], anims=[3359, 3359]. +NPC id=5562, name=null, level=0, option=[null, null, null, null, null], anims=[4753, 4754]. +NPC id=5563, name=Del-Monty, level=0, option=[Talk-to, null, null, null, null], anims=[9158, 9157]. +NPC id=5564, name=Bouncer, level=160, option=[null, Attack, null, null, null], anims=[6580, 6582]. +NPC id=5565, name=Bouncer, level=160, option=[null, Attack, null, null, null], anims=[6580, 6582]. +NPC id=5566, name=General Khazard, level=0, option=[Talk-to, null, null, null, null], anims=[842, 841]. +NPC id=5567, name=Scout, level=0, option=[Talk-to, null, null, null, null], anims=[842, 841]. +NPC id=5568, name=Scout, level=0, option=[Talk-to, null, null, null, null], anims=[842, 841]. +NPC id=5569, name=Scout, level=0, option=[Talk-to, null, null, null, null], anims=[842, 841]. +NPC id=5570, name=Scout, level=0, option=[Talk-to, null, null, null, null], anims=[842, 841]. +NPC id=5571, name=Sin Seer, level=0, option=[Talk-to, null, null, null, null], anims=[5810, 5809]. +NPC id=5572, name=Ghost, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=5573, name=null, level=0, option=[null, null, null, null, null], anims=[842, 841]. +NPC id=5574, name=null, level=0, option=[null, null, null, null, null], anims=[842, 841]. +NPC id=5575, name=null, level=0, option=[null, null, null, null, null], anims=[842, 841]. +NPC id=5576, name=null, level=0, option=[null, null, null, null, null], anims=[842, 841]. +NPC id=5577, name=null, level=0, option=[null, null, null, null, null], anims=[842, 841]. +NPC id=5578, name=Effigy, level=0, option=[Talk-to, null, null, null, null], anims=[808, 5822]. +NPC id=5579, name=Effigy, level=0, option=[null, null, null, null, null], anims=[808, 5822]. +NPC id=5580, name=Bonafido, level=0, option=[Talk-to, null, null, null, null], anims=[5814, -1]. +NPC id=5581, name=Homunculus, level=0, option=[Talk-to, null, null, null, null], anims=[5831, 5832]. +NPC id=5582, name=Homunculus, level=0, option=[Talk-to, null, null, null, null], anims=[5831, -1]. +NPC id=5583, name=Homunculus, level=0, option=[Talk-to, null, null, null, null], anims=[5831, -1]. +NPC id=5584, name=Cage, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5585, name='Transmute' The Alchemist, level=0, option=[Talk-to, null, null, null, null], anims=[5823, 5822]. +NPC id=5586, name='Transmute' The Alchemist, level=0, option=[null, null, null, null, null], anims=[808, 5822]. +NPC id=5587, name='Currency' The Alchemist, level=0, option=[Talk-to, null, null, null, null], anims=[5823, 5822]. +NPC id=5588, name='Currency' The Alchemist, level=0, option=[null, null, null, null, null], anims=[808, 5822]. +NPC id=5589, name='Black-eye', level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[5817, -1]. +NPC id=5590, name='No fingers', level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[5815, -1]. +NPC id=5591, name='Gummy', level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[5816, -1]. +NPC id=5592, name='The Guns', level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[5818, -1]. +NPC id=5593, name=Frogeel, level=103, option=[null, Attack, null, null, null], anims=[5839, 5840]. +NPC id=5594, name=Spidine, level=42, option=[null, Attack, null, null, null], anims=[145, 142]. +NPC id=5595, name=Swordchick, level=46, option=[null, Attack, null, null, null], anims=[5386, 5385]. +NPC id=5596, name=Jubster, level=87, option=[null, Attack, null, null, null], anims=[6803, 6804]. +NPC id=5597, name=Newtroost, level=19, option=[null, Attack, null, null, null], anims=[2298, 2297]. +NPC (wrapper) id=5598, child npcs=[5578, -1, 5578, 5578, 5578, -1, 5578, -1, 5578, -1, -1, 5578, 5578, -1, 5578, -1, 5578, -1]. +NPC id=5599, name=null, level=0, option=[null, null, null, null, null], anims=[5831, -1]. +NPC id=5600, name=null, level=0, option=[null, null, null, null, null], anims=[5831, -1]. +NPC (wrapper) id=5601, child npcs=[5585, -1, 5585, 5585, 5585, -1, 5585, -1, 5585, -1, -1, 5585, 5585, -1, 5585, -1, 5585, -1]. +NPC (wrapper) id=5602, child npcs=[5587, -1, 5587, 5587, 5587, -1, 5587, -1, 5587, -1, -1, 5587, 5587, -1, 5587, -1, 5587, -1]. +NPC id=5603, name=Unicow, level=25, option=[null, Attack, null, null, null], anims=[5852, 5848]. +NPC id=5604, name=Elfinlocks, level=93, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5605, name=Clockwork cat, level=0, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=5606, name=null, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=5607, name=Clockwork cat, level=0, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=5608, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[5877, 5876]. +NPC id=5609, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[5877, 5876]. +NPC id=5610, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[5877, 5876]. +NPC id=5611, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[5877, 5876]. +NPC id=5612, name=Rufus, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5613, name=Mi-Gor, level=0, option=[Confront, null, null, null, null], anims=[5859, 5858]. +NPC id=5614, name=Puffin, level=0, option=[null, null, null, null, null], anims=[5873, 5872]. +NPC id=5615, name=Puffin, level=0, option=[null, null, null, null, null], anims=[5873, -1]. +NPC id=5616, name=Brother Tranquility, level=0, option=[Talk-to, null, Transport, null, null], anims=[5875, 5876]. +NPC id=5617, name=Brother Tranquility, level=0, option=[Talk-to, null, Transport, null, null], anims=[5646, 5645]. +NPC id=5618, name=Brother Tranquility, level=0, option=[Talk-to, null, null, null, null], anims=[5646, 5645]. +NPC id=5619, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[5646, 5645]. +NPC id=5620, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[5646, 5645]. +NPC id=5621, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[5646, 5645]. +NPC id=5622, name=Monk, level=0, option=[Talk-to, null, null, null, null], anims=[5646, 5645]. +NPC id=5623, name=Zombie monk, level=0, option=[Talk-to, null, null, null, null], anims=[5877, 5876]. +NPC id=5624, name=Zombie monk, level=0, option=[Talk-to, null, null, null, null], anims=[5877, 5876]. +NPC id=5625, name=Zombie monk, level=0, option=[Talk-to, null, null, null, null], anims=[5877, 5876]. +NPC id=5626, name=Zombie monk, level=0, option=[Talk-to, null, null, null, null], anims=[5877, 5876]. +NPC id=5627, name=Sorebones, level=57, option=[null, Attack, null, null, null], anims=[5641, 5642]. +NPC id=5628, name=Sorebones, level=57, option=[null, Attack, null, null, null], anims=[5641, 5642]. +NPC id=5629, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=5630, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=5631, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=5632, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=5633, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=5634, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=5635, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=5636, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5646, 5645]. +NPC id=5637, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5650, 5652]. +NPC id=5638, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5650, 5652]. +NPC id=5639, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5650, 5652]. +NPC id=5640, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5650, 5652]. +NPC id=5641, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5650, 5652]. +NPC id=5642, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5879, 5878]. +NPC id=5643, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5879, 5878]. +NPC id=5644, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5879, 5878]. +NPC id=5645, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5879, 5878]. +NPC id=5646, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5879, 5878]. +NPC id=5647, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5883, 5882]. +NPC id=5648, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5883, 5882]. +NPC id=5649, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5883, 5882]. +NPC id=5650, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5883, 5882]. +NPC id=5651, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5883, 5882]. +NPC id=5652, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5883, 5882]. +NPC id=5653, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5883, 5882]. +NPC id=5654, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5883, 5882]. +NPC id=5655, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5883, 5882]. +NPC id=5656, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5657, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5658, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5659, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5660, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5661, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5662, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5663, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5664, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5665, name=Zombie pirate, level=57, option=[null, Attack, null, null, null], anims=[5888, 5887]. +NPC id=5666, name=Barrelchest, level=190, option=[null, Attack, null, null, null], anims=[5893, 5892]. +NPC (wrapper) id=5667, child npcs=[5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1]. +NPC (wrapper) id=5668, child npcs=[5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5616, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5617, -1]. +NPC (wrapper) id=5669, child npcs=[5623, 5608, -1]. +NPC (wrapper) id=5670, child npcs=[5624, 5609, -1]. +NPC (wrapper) id=5671, child npcs=[5625, 5610, -1]. +NPC (wrapper) id=5672, child npcs=[5626, 5611, -1]. +NPC (wrapper) id=5673, child npcs=[5619, -1]. +NPC (wrapper) id=5674, child npcs=[5620, -1]. +NPC (wrapper) id=5675, child npcs=[5621, -1]. +NPC (wrapper) id=5676, child npcs=[5622, -1]. +NPC (wrapper) id=5677, child npcs=[5618, -1]. +NPC id=5678, name=Undead Lumberjack, level=30, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5679, name=Undead Lumberjack, level=30, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5680, name=Undead Lumberjack, level=30, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5681, name=Undead Lumberjack, level=30, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5682, name=Undead Lumberjack, level=30, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5683, name=Undead Lumberjack, level=30, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5684, name=Undead Lumberjack, level=35, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5685, name=Undead Lumberjack, level=35, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5686, name=Undead Lumberjack, level=35, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5687, name=Undead Lumberjack, level=35, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5688, name=Undead Lumberjack, level=35, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5689, name=Undead Lumberjack, level=35, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5690, name=Undead Lumberjack, level=35, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5691, name=Undead Lumberjack, level=35, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5692, name=Undead Lumberjack, level=40, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5693, name=Undead Lumberjack, level=40, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5694, name=Undead Lumberjack, level=40, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5695, name=Undead Lumberjack, level=40, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5696, name=Undead Lumberjack, level=40, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5697, name=Undead Lumberjack, level=40, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5698, name=Undead Lumberjack, level=40, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5699, name=Undead Lumberjack, level=40, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5700, name=Undead Lumberjack, level=45, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5701, name=Undead Lumberjack, level=45, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5702, name=Undead Lumberjack, level=45, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5703, name=Undead Lumberjack, level=45, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5704, name=Undead Lumberjack, level=45, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5705, name=Undead Lumberjack, level=45, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5706, name=Undead Lumberjack, level=45, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5707, name=Undead Lumberjack, level=45, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5708, name=Undead Lumberjack, level=50, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5709, name=Undead Lumberjack, level=50, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5710, name=Undead Lumberjack, level=50, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5711, name=Undead Lumberjack, level=50, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5712, name=Undead Lumberjack, level=50, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5713, name=Undead Lumberjack, level=50, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5714, name=Undead Lumberjack, level=50, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5715, name=Undead Lumberjack, level=50, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5716, name=Undead Lumberjack, level=55, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5717, name=Undead Lumberjack, level=55, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5718, name=Undead Lumberjack, level=55, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5719, name=Undead Lumberjack, level=55, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5720, name=Undead Lumberjack, level=55, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5721, name=Undead Lumberjack, level=55, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5722, name=Undead Lumberjack, level=55, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5723, name=Undead Lumberjack, level=55, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5724, name=Undead Lumberjack, level=60, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5725, name=Undead Lumberjack, level=60, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5726, name=Undead Lumberjack, level=60, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5727, name=Undead Lumberjack, level=60, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5728, name=Undead Lumberjack, level=60, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5729, name=Undead Lumberjack, level=60, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5730, name=Undead Lumberjack, level=60, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5731, name=Undead Lumberjack, level=60, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5732, name=Undead Lumberjack, level=64, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5733, name=Undead Lumberjack, level=64, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5734, name=Undead Lumberjack, level=64, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5735, name=Undead Lumberjack, level=64, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5736, name=Undead Lumberjack, level=64, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5737, name=Undead Lumberjack, level=64, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5738, name=Undead Lumberjack, level=64, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5739, name=Undead Lumberjack, level=64, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5740, name=Undead Lumberjack, level=70, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5741, name=Undead Lumberjack, level=70, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5742, name=Undead Lumberjack, level=70, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5743, name=Undead Lumberjack, level=70, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5744, name=Undead Lumberjack, level=70, option=[null, Attack, null, null, null], anims=[5965, 5965]. +NPC id=5745, name=Undead Lumberjack, level=70, option=[null, Attack, null, null, null], anims=[5966, 5966]. +NPC id=5746, name=Undead Lumberjack, level=70, option=[null, Attack, null, null, null], anims=[5967, 5967]. +NPC id=5747, name=Undead Lumberjack, level=70, option=[null, Attack, null, null, null], anims=[5973, 5969]. +NPC id=5748, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[2126, 2126]. +NPC id=5749, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[2126, 2126]. +NPC id=5750, name=Cave bug, level=96, option=[null, Attack, null, null, null], anims=[6078, 6077]. +NPC id=5751, name=Molanisk, level=51, option=[null, Attack, null, null, null], anims=[6010, 6011]. +NPC id=5752, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5753, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5754, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5755, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5756, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5757, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5758, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5759, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5760, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5761, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5762, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5763, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5764, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5765, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5766, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5767, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5768, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5769, name=Cave goblin, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6040, 6041]. +NPC id=5770, name=Ur-zek, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5771, name=Ur-vass, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5772, name=Ur-taal, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5773, name=Ur-meg, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5774, name=Ur-lun, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5775, name=Ur-pel, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5776, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[6040, 6041]. +NPC id=5777, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[6040, 6041]. +NPC id=5778, name=Bartak, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5779, name=Turgall, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5780, name=Reldak, level=0, option=[Talk-to, null, Trade, null, null], anims=[6040, 6041]. +NPC id=5781, name=Miltog, level=0, option=[Talk-to, null, Trade, null, null], anims=[6040, 6041]. +NPC id=5782, name=Mernik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5783, name=Cave goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5784, name=Crate goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6043, 6044]. +NPC id=5785, name=Cave goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5786, name=Goblin scribe, level=0, option=[Talk-to, null, null, null, null], anims=[6045, 6046]. +NPC (wrapper) id=5787, child npcs=[6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, 6392, -1, -1, 6392, -1]. +NPC id=5788, name=Gourmet, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5789, name=Gourmet, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5790, name=Gourmet, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5791, name=Gourmet, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5792, name=Turgok, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5793, name=Markog, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5794, name=Durgok, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5795, name=Tindar, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5796, name=Gundik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5797, name=Zenkog, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5798, name=Lurgon, level=0, option=[Talk-to, null, Trade, null, null], anims=[6040, 6041]. +NPC id=5799, name=Ur-tag, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5800, name=Guard, level=26, option=[Talk-to, Attack, null, null, null], anims=[6040, 6041]. +NPC id=5801, name=Guard, level=24, option=[Talk-to, Attack, null, null, null], anims=[6040, 6041]. +NPC id=5802, name=null, level=1, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=5803, name=Young 'un, level=0, option=[Talk-to, null, null, null, null], anims=[6058, 6057]. +NPC id=5804, name=Tyke, level=0, option=[Talk-to, null, null, null, null], anims=[6059, 6057]. +NPC id=5805, name=Nipper, level=0, option=[Talk-to, null, null, null, null], anims=[6058, 6057]. +NPC id=5806, name=Nipper, level=0, option=[Talk-to, null, null, null, null], anims=[6059, 6057]. +NPC id=5807, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6042]. +NPC id=5808, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6052, 6053]. +NPC id=5809, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6042]. +NPC id=5810, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6052, 6053]. +NPC id=5811, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6042]. +NPC id=5812, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6052, 6053]. +NPC id=5813, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6042]. +NPC id=5814, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6052, 6053]. +NPC id=5815, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6042]. +NPC id=5816, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6052, 6053]. +NPC id=5817, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6042]. +NPC id=5818, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6052, 6053]. +NPC id=5819, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6042]. +NPC id=5820, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6052, 6053]. +NPC id=5821, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6042]. +NPC id=5822, name=Cave goblin child, level=0, option=[Talk-to, null, null, null, null], anims=[6052, 6053]. +NPC id=5823, name=Spit goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6060, 6041]. +NPC id=5824, name=Goblin fish, level=0, option=[null, null, null, null, null], anims=[6062, 6061]. +NPC id=5825, name=Movario, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6075, 6076]. +NPC id=5826, name=Darve, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5827, name=Moths, level=0, option=[null, null, null, null, null], anims=[6036, 6036]. +NPC id=5828, name=Barlak, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5829, name=Rabbit, level=2, option=[null, Attack, null, null, null], anims=[6089, 6088]. +NPC id=5830, name=null, level=1, option=[null, null, null, null, null], anims=[6075, 6076]. +NPC id=5831, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=5832, child npcs=[5863, 5863, 5863, 5863, 5863, 5863, 5863, 5863, 5863, 5863, 5863, -1]. +NPC id=5833, name=Rat Burgiss, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5834, name=Surok Magis, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5835, name=Surok Magis, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=5836, name=Zaff, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC id=5837, name=Anna Jones, level=0, option=[Talk-To, null, null, null, null], anims=[6106, -1]. +NPC id=5838, name=King Roald, level=47, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5839, name=Mishkal'un Dorn, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=5840, name=Dakh'thoulan Aegis, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=5841, name=Sil'as Dahcsnu, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=5842, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5843, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5844, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5845, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5846, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5847, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5848, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5849, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5850, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5851, name=Outlaw, level=32, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5852, name=Monkey, level=1, option=[null, null, null, null, null], anims=[222, 219]. +NPC (wrapper) id=5853, child npcs=[5834, 5835, 7000, -1]. +NPC id=5854, name=Bench, level=0, option=[null, null, null, null, null], anims=[6106, -1]. +NPC id=5855, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6186, 6187]. +NPC id=5856, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6193]. +NPC id=5857, name=Zanik, level=0, option=[null, null, null, null, null], anims=[6040, 6215]. +NPC id=5858, name=Ur-tag, level=0, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=5859, name=H.A.M. Archer, level=30, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5860, name=H.A.M. Mage, level=30, option=[null, Attack, null, null, null], anims=[813, -1]. +NPC id=5861, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6149, -1]. +NPC id=5862, name=Sigmund and Zanik, level=0, option=[null, null, null, null, null], anims=[6151, 6150]. +NPC id=5863, name=Ambassador Alvijar, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5864, name=Builder, level=0, option=[Talk-to, null, null, null, null], anims=[6205, 98]. +NPC id=5865, name=Builder, level=0, option=[Talk-to, null, null, null, null], anims=[6206, 98]. +NPC id=5866, name=Builder, level=0, option=[Talk-to, null, null, null, null], anims=[6207, 98]. +NPC id=5867, name=Builder, level=0, option=[Talk-to, null, null, null, null], anims=[6208, 98]. +NPC id=5868, name=Tegdak, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5869, name=null, level=1, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=5870, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5871, name=Sergeant Mossfists, level=51, option=[Talk-to, null, null, null, null], anims=[6153, 6152]. +NPC id=5872, name=Sergeant Slimetoes, level=51, option=[Talk-to, null, null, null, null], anims=[6153, 6152]. +NPC id=5873, name=Cave goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5874, name=Cave goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5875, name=Cave goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5876, name=Cave goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5877, name=Cave goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5878, name=Cave goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5879, name=Ticket goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=5880, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=5881, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=5882, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=5883, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=5884, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=5885, name=Dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=5886, name=Ticket dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=5887, name=null, level=1, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=5888, name=null, level=1, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=5889, name=null, level=1, option=[null, null, null, null, null], anims=[6153, 6152]. +NPC id=5890, name=null, level=1, option=[null, null, null, null, null], anims=[6153, 6152]. +NPC id=5891, name=null, level=1, option=[null, null, null, null, null], anims=[6153, 6152]. +NPC id=5892, name=null, level=1, option=[null, null, null, null, null], anims=[6153, 6152]. +NPC id=5893, name=Cyrisus, level=0, option=[Talk-to, null, Inspect, null, null], anims=[6284, 6284]. +NPC id=5894, name=Cyrisus, level=0, option=[Talk-to, null, Inspect, null, null], anims=[808, -1]. +NPC id=5895, name=Cyrisus, level=0, option=[Talk-to, null, Inspect, null, null], anims=[808, -1]. +NPC id=5896, name=Cyrisus, level=0, option=[Talk-to, null, Inspect, null, null], anims=[808, -1]. +NPC id=5897, name=Cyrisus, level=0, option=[Talk-to, null, Inspect, null, null], anims=[808, -1]. +NPC id=5898, name='Bird's-Eye' Jack, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=5899, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5900, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5901, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=5902, name=The Inadequacy, level=343, option=[null, Attack, null, null, null], anims=[6317, 6317]. +NPC id=5903, name=The Everlasting, level=223, option=[null, Attack, null, null, null], anims=[6343, 6344]. +NPC id=5904, name=The Untouchable, level=274, option=[null, Attack, null, null, null], anims=[6328, 6328]. +NPC id=5905, name=The Illusive, level=108, option=[null, Attack, null, null, null], anims=[6338, 6339]. +NPC id=5906, name=A Doubt, level=78, option=[null, Attack, null, null, null], anims=[6311, 6312]. +NPC id=5907, name=The Illusive, level=1, option=[null, null, null, null, null], anims=[6350, 6339]. +NPC id=5908, name=Dying tree, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=5909, name=Barbarian, level=8, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=5910, name=Cook, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5911, name=Cook, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5912, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=5913, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=5914, name=Iffie, level=0, option=[Talk-to, null, null, null, null], anims=[6478, -1]. +NPC id=5915, name=Elsie, level=0, option=[Talk-to, null, null, null, null], anims=[6478, -1]. +NPC id=5916, name=Cleaner, level=0, option=[null, null, null, null, null], anims=[5800, 5799]. +NPC id=5917, name=Stray dog, level=0, option=[null, null, null, null, Shoo-away], anims=[4777, 4773]. +NPC id=5918, name=Stray dog, level=0, option=[null, null, null, null, Shoo-away], anims=[4777, 4773]. +NPC id=5919, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[6487, 6486]. +NPC id=5920, name=Guard, level=21, option=[null, Attack, Pickpocket, null, null], anims=[6487, 6486]. +NPC id=5921, name=Trainee Guard, level=0, option=[null, null, null, null, null], anims=[6487, 6486]. +NPC id=5922, name=Captain, level=0, option=[Talk-to, null, null, null, null], anims=[6487, 6486]. +NPC id=5923, name=Man, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=5924, name=Woman, level=2, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=5925, name=Benny, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5926, name=Thief, level=16, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5927, name=Thief, level=16, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5928, name=Thief, level=16, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5929, name=Thief, level=16, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=5930, name=Art Critic Jacques, level=0, option=[Talk-to, null, null, null, null], anims=[6389, 6388]. +NPC id=5931, name=Historian Minas, level=0, option=[Talk-to, null, null, null, null], anims=[6393, 6395]. +NPC id=5932, name=Barnabus Hurma, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5933, name=Marius Giste, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5934, name=Caden Azro, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5935, name=Thias Leacke, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5936, name=Sinco Doar, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5937, name=Tinse Torpe, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5938, name=Information clerk, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5939, name=Torrcs, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5940, name=Marfet, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=5941, name=Museum guard, level=0, option=[Talk-to, null, null, null, null], anims=[6390, -1]. +NPC id=5942, name=Museum guard, level=0, option=[Talk-to, null, null, null, null], anims=[6464, -1]. +NPC id=5943, name=Museum guard, level=0, option=[Talk-to, null, null, null, null], anims=[6464, -1]. +NPC id=5944, name=Teacher and pupil, level=0, option=[Talk-to, null, null, null, null], anims=[6411, 6410]. +NPC id=5945, name=Schoolboy, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7165]. +NPC id=5946, name=Schoolboy, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7165]. +NPC id=5947, name=Teacher and pupil, level=0, option=[Talk-to, null, null, null, null], anims=[6413, 6412]. +NPC id=5948, name=Teacher and pupil, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5949, name=Schoolboy, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5950, name=Teacher, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5951, name=Schoolgirl, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5952, name=Workman, level=0, option=[null, null, null, null, null], anims=[6415, 6414]. +NPC id=5953, name=Workman, level=0, option=[null, null, null, null, null], anims=[-1, 6418]. +NPC id=5954, name=Workman, level=0, option=[null, null, null, null, null], anims=[6422, 6419]. +NPC id=5955, name=Workman, level=0, option=[null, null, null, null, null], anims=[6423, 6420]. +NPC id=5956, name=Void Knight, level=0, option=[Talk-to, null, Exchange, null, null], anims=[813, -1]. +NPC id=5957, name=Schoolgirl, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7165]. +NPC id=5958, name=Digsite workman, level=0, option=[null, null, null, null, null], anims=[6425, -1]. +NPC id=5959, name=Barge workman, level=0, option=[Talk-to, null, null, null, null], anims=[6454, -1]. +NPC id=5960, name=Barge workman, level=0, option=[Talk-to, null, null, null, null], anims=[6455, -1]. +NPC id=5961, name=Barge workman, level=0, option=[Talk-to, null, null, null, null], anims=[6456, -1]. +NPC id=5962, name=Barge workman, level=0, option=[Talk-to, null, null, null, null], anims=[6457, -1]. +NPC id=5963, name=Barge foreman, level=0, option=[Talk-to, null, null, null, null], anims=[6458, -1]. +NPC id=5964, name=Ed Wood, level=0, option=[Talk-to, null, null, null, null], anims=[2065, 2064]. +NPC id=5965, name=Orlando Smith, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5966, name=Natural historian, level=0, option=[Talk-to, null, null, null, null], anims=[6393, 6395]. +NPC id=5967, name=Natural historian, level=0, option=[Talk-to, null, null, null, null], anims=[6393, 6395]. +NPC id=5968, name=Natural historian, level=0, option=[Talk-to, null, null, null, null], anims=[6393, 6395]. +NPC id=5969, name=Natural historian, level=0, option=[Talk-to, null, null, null, null], anims=[6393, 6395]. +NPC id=5970, name=Natural historian, level=0, option=[null, null, null, null, null], anims=[6393, 6395]. +NPC id=5971, name=Leech display, level=0, option=[null, null, null, null, null], anims=[6429, -1]. +NPC id=5972, name=Sea slugs display, level=0, option=[null, null, null, null, null], anims=[6433, -1]. +NPC id=5973, name=Snail display, level=0, option=[null, null, null, null, null], anims=[6431, -1]. +NPC id=5974, name=Monkey display, level=0, option=[null, null, null, null, null], anims=[6435, -1]. +NPC id=5975, name=Lizard display, level=0, option=[null, null, null, null, null], anims=[6437, -1]. +NPC id=5976, name=Penguin display, level=0, option=[null, null, null, null, null], anims=[6439, -1]. +NPC id=5977, name=Camel display, level=0, option=[null, null, null, null, null], anims=[6441, -1]. +NPC id=5978, name=Terrorbird display, level=0, option=[null, null, null, null, null], anims=[6443, -1]. +NPC id=5979, name=Dragon display, level=0, option=[null, null, null, null, null], anims=[6447, -1]. +NPC id=5980, name=Wyvern display, level=0, option=[null, null, null, null, null], anims=[6445, -1]. +NPC id=5981, name=Battle tortoise display, level=0, option=[null, null, null, null, null], anims=[6449, -1]. +NPC id=5982, name=Mole display, level=0, option=[null, null, null, null, null], anims=[6451, -1]. +NPC id=5983, name=Schoolgirl, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7165]. +NPC id=5984, name=Schoolgirl, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7165]. +NPC id=5985, name=Schoolgirl, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7165]. +NPC id=5986, name=Workman, level=0, option=[null, null, null, null, null], anims=[6422, 6419]. +NPC id=5987, name=Sylas, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5988, name=Miazrqa, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=5989, name=Grimgnash, level=0, option=[Talk-To, null, null, null, null], anims=[6507, -1]. +NPC id=5990, name=Rupert the Beard, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5991, name=Drain pipe, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=5992, name=Rupert the Beard, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=5993, name=Experiment No.2, level=109, option=[null, Attack, null, null, null], anims=[6511, 6510]. +NPC id=5994, name=Mouse, level=95, option=[null, Attack, null, null, null], anims=[6518, 6517]. +NPC id=5995, name=Mouse, level=95, option=[null, Attack, null, null, null], anims=[6518, 6517]. +NPC id=5996, name=Glod, level=138, option=[null, Attack, null, null, null], anims=[6504, 6505]. +NPC (wrapper) id=5997, child npcs=[5989, -1]. +NPC (wrapper) id=5998, child npcs=[5990, 5999, -1]. +NPC id=5999, name=Rupert the Beard, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC (wrapper) id=6000, child npcs=[5992, 6001, -1]. +NPC id=6001, name=Rupert the Beard, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=6002, name=Gnome, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6533, -1]. +NPC id=6003, name=Winkin, level=0, option=[Talk-to, null, null, null, null], anims=[6534, -1]. +NPC id=6004, name=Gnome, level=0, option=[Talk-to, null, null, null, null], anims=[6535, -1]. +NPC id=6005, name=Cage, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6006, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6007, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6008, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6009, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6010, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6011, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6012, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6013, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6014, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6015, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6016, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6017, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6018, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6019, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6020, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6021, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6022, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6023, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6024, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6025, name=Werewolf, level=88, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6026, name=Boris, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6027, name=Imre, level=24, option=[null, Attack, Talk-to, null, null], anims=[808, -1]. +NPC id=6028, name=Yuri, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6029, name=Joseph, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6030, name=Nikolai, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6031, name=Eduard, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6032, name=Lev, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6033, name=Georgy, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6034, name=Svetlana, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6035, name=Irina, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6036, name=Alexis, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6037, name=Milla, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6038, name=Galina, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6039, name=Sofiya, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6040, name=Ksenia, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6041, name=Yadviga, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6042, name=Nikita, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6043, name=Vera, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6044, name=Zoja, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6045, name=Liliya, level=24, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC id=6046, name=Big Wolf, level=73, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=6047, name=Wolf, level=25, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=6048, name=Wolf, level=25, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=6049, name=Wolf, level=25, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=6050, name=Desert Wolf, level=27, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=6051, name=Desert Wolf, level=27, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=6052, name=Ice wolf, level=96, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=6053, name=Ninja impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6054, name=Dragon impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6055, name=Baby impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6056, name=Young impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6057, name=Gourmet impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6058, name=Earth impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6059, name=Essence impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6060, name=Eclectic impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6061, name=Nature impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6062, name=Magpie impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6063, name=Ninja impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6064, name=Dragon impling, level=0, option=[Catch, null, null, null, null], anims=[6613, 6614]. +NPC id=6065, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6066, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6067, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6068, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6069, name=null, level=0, option=[null, null, null, null, null], anims=[171, 168]. +NPC id=6070, name=Elnock Inquisitor, level=0, option=[Talk-to, null, Trade, null, null], anims=[195, 189]. +NPC id=6071, name=Immenizz, level=0, option=[Talk-to, null, null, null, null], anims=[6613, 6614]. +NPC id=6072, name=Fairy Aeryka, level=0, option=[Talk-to, null, null, null, null], anims=[112, 106]. +NPC id=6073, name=Wandering impling, level=0, option=[Talk-to, null, null, null, null], anims=[6613, 6614]. +NPC id=6074, name=Imp defender, level=0, option=[null, null, null, null, null], anims=[171, 168]. +NPC (wrapper) id=6075, child npcs=[1685, -1]. +NPC id=6076, name=null, level=0, option=[Talk-To, null, null, null, null], anims=[1421, -1]. +NPC id=6077, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6078, name=Cyclops, level=56, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=6079, name=Cyclops, level=76, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=6080, name=Cyclops, level=56, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=6081, name=Cyclops, level=76, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=6082, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6083, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6084, name=Captain Ned, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6085, name=Cabin boy Jenkins, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6086, name=Cabin boy Jenkins, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6087, name=Elvarg, level=83, option=[null, null, null, null, null], anims=[90, 79]. +NPC id=6088, name=Zombie rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=6089, name=Zombie rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=6090, name=Zombie rat, level=3, option=[null, Attack, null, null, null], anims=[4932, 4931]. +NPC id=6091, name=Skeleton, level=22, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=6092, name=Skeleton, level=22, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=6093, name=Skeleton, level=22, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=6094, name=Ghost, level=19, option=[Talk-to, Attack, null, null, null], anims=[5538, 5539]. +NPC id=6095, name=Ghost, level=19, option=[Talk-to, Attack, null, null, null], anims=[5530, 5531]. +NPC id=6096, name=Ghost, level=19, option=[Talk-to, Attack, null, null, null], anims=[5530, 5531]. +NPC id=6097, name=Ghost, level=19, option=[Talk-to, Attack, null, null, null], anims=[5530, 5531]. +NPC id=6098, name=Ghost, level=19, option=[Talk-to, Attack, null, null, null], anims=[5530, 5531]. +NPC id=6099, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=6100, name=Zombie, level=24, option=[null, Attack, null, null, null], anims=[5572, -1]. +NPC id=6101, name=Lesser demon, level=82, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=6102, name=Lost barbarian, level=132, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6103, name=Skeleton hero, level=149, option=[null, Attack, null, null, null], anims=[2065, 2064]. +NPC id=6104, name=Skeleton brute, level=132, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6105, name=Skeleton warlord, level=132, option=[null, Attack, null, null, null], anims=[2065, 2064]. +NPC id=6106, name=Skeleton heavy, level=132, option=[null, Attack, null, null, null], anims=[2561, -1]. +NPC id=6107, name=Skeleton thug, level=132, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6108, name=Entrana firebird, level=2, option=[null, Attack, null, null, null], anims=[6809, 6808]. +NPC id=6109, name=Mounted terrorbird gnome, level=49, option=[null, Attack, null, null, null], anims=[6793, 6796]. +NPC id=6110, name=Mounted terrorbird gnome, level=49, option=[null, Attack, null, null, null], anims=[6793, 6796]. +NPC id=6111, name=Mounted terrorbird gnome, level=49, option=[null, Attack, null, null, null], anims=[6793, 6796]. +NPC id=6112, name=Ducklings, level=0, option=[null, null, null, null, null], anims=[6821, 6822]. +NPC id=6113, name=Duck, level=0, option=[null, null, null, null, null], anims=[6813, 6819]. +NPC id=6114, name=Drake, level=0, option=[null, null, null, null, null], anims=[6813, 6819]. +NPC id=6115, name=Seagull, level=2, option=[null, Attack, null, null, null], anims=[6815, 6819]. +NPC id=6116, name=Seagull, level=3, option=[null, Attack, null, null, null], anims=[6815, 6819]. +NPC id=6117, name=Mr. Mordaut, level=0, option=[Talk-to, null, null, null, null], anims=[6825, -1]. +NPC id=6118, name=Observatory assistant, level=0, option=[Talk-to, null, null, null, null], anims=[6841, -1]. +NPC (wrapper) id=6119, child npcs=[488, 488, 488, 488, 488, 488, -1]. +NPC id=6120, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6121, name=Observatory professor, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6122, name=Sleeping guard, level=1, option=[Prod, null, null, null, null], anims=[6828, 6187]. +NPC id=6123, name=Naghead, level=0, option=[null, null, null, null, null], anims=[6834, -1]. +NPC id=6124, name=Wagchin, level=0, option=[null, null, null, null, null], anims=[6835, -1]. +NPC id=6125, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=6126, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=6127, name=Greasycheeks, level=0, option=[Talk-to, null, null, null, null], anims=[6831, -1]. +NPC id=6128, name=Smellytoes, level=0, option=[Talk-to, null, null, null, null], anims=[6829, -1]. +NPC id=6129, name=Creakyknees, level=0, option=[Talk-to, null, null, null, null], anims=[6833, -1]. +NPC id=6130, name=Clothears, level=0, option=[Talk-to, null, null, null, null], anims=[6836, -1]. +NPC id=6131, name=Zombie, level=0, option=[null, null, null, null, null], anims=[6855, -1]. +NPC id=6132, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6858, -1]. +NPC id=6133, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6859, -1]. +NPC id=6134, name=Dunce, level=0, option=[null, null, null, null, null], anims=[6826, -1]. +NPC id=6135, name=Town crier, level=0, option=[Talk-to, null, null, null, null], anims=[6864, 6867]. +NPC id=6136, name=Town crier, level=0, option=[Talk-to, null, null, null, null], anims=[6864, 6867]. +NPC id=6137, name=Town crier, level=0, option=[Talk-to, null, null, null, null], anims=[6864, 6867]. +NPC id=6138, name=Town crier, level=0, option=[Talk-to, null, null, null, null], anims=[6864, 6867]. +NPC id=6139, name=Town crier, level=0, option=[Talk-to, null, null, null, null], anims=[6864, 6867]. +NPC id=6140, name=Squire (Intermediate), level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=6141, name=Squire (Veteran), level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=6142, name=Portal, level=0, option=[hidden, Attack, null, null, null], anims=[3933, 3933]. +NPC id=6143, name=Portal, level=0, option=[hidden, Attack, null, null, null], anims=[3936, 3936]. +NPC id=6144, name=Portal, level=0, option=[hidden, Attack, null, null, null], anims=[3928, 3928]. +NPC id=6145, name=Portal, level=0, option=[hidden, Attack, null, null, null], anims=[3928, 3928]. +NPC id=6146, name=Portal, level=0, option=[hidden, null, null, null, null], anims=[6879, 6879]. +NPC id=6147, name=Portal, level=0, option=[hidden, null, null, null, null], anims=[6880, 6880]. +NPC id=6148, name=Portal, level=0, option=[hidden, null, null, null, null], anims=[6878, 6878]. +NPC id=6149, name=Portal, level=0, option=[hidden, null, null, null, null], anims=[6878, 6878]. +NPC id=6150, name=Portal, level=0, option=[hidden, Attack, null, null, null], anims=[3933, 3933]. +NPC id=6151, name=Portal, level=0, option=[hidden, Attack, null, null, null], anims=[3936, 3936]. +NPC id=6152, name=Portal, level=0, option=[hidden, Attack, null, null, null], anims=[3928, 3928]. +NPC id=6153, name=Portal, level=0, option=[hidden, Attack, null, null, null], anims=[3928, 3928]. +NPC id=6154, name=Portal, level=0, option=[hidden, null, null, null, null], anims=[6879, 6879]. +NPC id=6155, name=Portal, level=0, option=[hidden, null, null, null, null], anims=[6880, 6880]. +NPC id=6156, name=Portal, level=0, option=[hidden, null, null, null, null], anims=[6878, 6878]. +NPC id=6157, name=Portal, level=0, option=[hidden, null, null, null, null], anims=[6878, 6878]. +NPC id=6158, name=Sir Lucan, level=120, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=6159, name=Workman, level=0, option=[null, null, null, null, null], anims=[6423, 6420]. +NPC id=6160, name=Sir Lancelot, level=127, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=6161, name=Sir Bedivere, level=110, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=6162, name=Sir Tristram, level=115, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=6163, name=Sir Pelleas, level=112, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=6164, name=Sir Gawain, level=122, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=6165, name=Sir Kay, level=124, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=6166, name=Sir Pelleas, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6167, name=Sir Gawain, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6168, name=Sir Kay, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6169, name=Squire, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=6170, name=Sir Lancelot, level=127, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6171, name=Sir Kay, level=124, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6172, name=Sir Gawain, level=122, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6173, name=Sir Lucan, level=120, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6174, name=Bandit, level=41, option=[Talk-to, Attack, Pickpocket, null, null], anims=[808, -1]. +NPC id=6175, name=Sir Tristram, level=115, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6176, name=Sir Pelleas, level=112, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6177, name=Sir Bedivere, level=110, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6178, name=Anna, level=0, option=[Talk-to, null, null, null, null], anims=[808, 6926]. +NPC id=6179, name=David, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6180, name=Anna, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6181, name=Court judge, level=0, option=[null, null, null, null, null], anims=[1322, -1]. +NPC id=6182, name=Jury, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6183, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6184, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6185, name=Prosecutor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6186, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6187, name=Morgan Le Faye, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=6188, name=Renegade knight, level=37, option=[null, Hidden, null, null, null], anims=[6927, 6928]. +NPC id=6189, name=Black Knight, level=33, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6190, name=Guard, level=0, option=[null, null, null, null, null], anims=[6918, -1]. +NPC (wrapper) id=6191, child npcs=[812, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 812, -1]. +NPC (wrapper) id=6192, child npcs=[814, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 814, -1]. +NPC (wrapper) id=6193, child npcs=[815, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 815, -1]. +NPC (wrapper) id=6194, child npcs=[816, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 816, -1]. +NPC (wrapper) id=6195, child npcs=[817, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 817, -1]. +NPC (wrapper) id=6196, child npcs=[818, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 818, -1]. +NPC (wrapper) id=6197, child npcs=[819, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 819, -1]. +NPC id=6198, name=Sinclair, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6199, name=null, level=1, option=[Talk-to, null, null, null, null], anims=[808, 6919]. +NPC id=6200, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=6201, name=Knight, level=0, option=[Talk-to, null, null, null, null], anims=[7003, -1]. +NPC (wrapper) id=6202, child npcs=[6201, -1]. +NPC id=6203, name=K'ril Tsutsaroth, level=650, option=[null, Attack, null, null, null], anims=[6943, 6942]. +NPC id=6204, name=Tstanon Karlak, level=145, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=6205, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6206, name=Zakl'n Gritch, level=142, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=6207, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6208, name=Balfrug Kreeyath, level=151, option=[null, Attack, null, null, null], anims=[66, 63]. +NPC id=6209, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6210, name=Hellhound, level=127, option=[null, Attack, null, null, null], anims=[6580, 6582]. +NPC id=6211, name=Imp, level=7, option=[null, Attack, null, null, null], anims=[171, 168]. +NPC id=6212, name=Werewolf, level=93, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6213, name=Werewolf, level=93, option=[null, Attack, null, null, null], anims=[6539, 6541]. +NPC id=6214, name=Vampire, level=77, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6215, name=Bloodveld, level=81, option=[null, Attack, null, null, null], anims=[1551, 1549]. +NPC id=6216, name=Pyrefiend, level=48, option=[null, Attack, null, null, null], anims=[1578, 1579]. +NPC id=6217, name=Icefiend, level=13, option=[null, Attack, null, null, null], anims=[8077, 8076]. +NPC id=6218, name=Gorak, level=149, option=[null, Attack, null, null, null], anims=[4299, 4298]. +NPC id=6219, name=Spiritual warrior, level=115, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6220, name=Spiritual ranger, level=118, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6221, name=Spiritual mage, level=121, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6222, name=Kree'arra, level=580, option=[null, Attack, null, null, null], anims=[6972, 6973]. +NPC id=6223, name=Wingman Skree, level=143, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6224, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6225, name=Flockleader Geerin, level=149, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6226, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6227, name=Flight Kilisa, level=159, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6228, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6229, name=Spiritual warrior, level=123, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6230, name=Spiritual ranger, level=127, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6231, name=Spiritual mage, level=122, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6232, name=Aviansie, level=69, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6233, name=Aviansie, level=79, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6234, name=Aviansie, level=84, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6235, name=Aviansie, level=83, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6236, name=Aviansie, level=92, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6237, name=Aviansie, level=97, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6238, name=Aviansie, level=137, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6239, name=Aviansie, level=148, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6240, name=Aviansie, level=71, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6241, name=Aviansie, level=73, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6242, name=Aviansie, level=79, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6243, name=Aviansie, level=89, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6244, name=Aviansie, level=94, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6245, name=Aviansie, level=97, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6246, name=Aviansie, level=131, option=[null, Attack, null, null, null], anims=[6949, 6950]. +NPC id=6247, name=Commander Zilyana, level=596, option=[null, Attack, null, null, null], anims=[6963, 6962]. +NPC id=6248, name=Starlight, level=149, option=[null, Attack, null, null, null], anims=[6374, 6373]. +NPC id=6249, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6250, name=Growler, level=139, option=[null, Attack, null, null, null], anims=[7014, 7015]. +NPC id=6251, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6252, name=Bree, level=146, option=[null, Attack, null, null, null], anims=[4311, 4310]. +NPC id=6253, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6254, name=Saradomin priest, level=113, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6255, name=Spiritual warrior, level=125, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6256, name=Spiritual ranger, level=122, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6257, name=Spiritual mage, level=120, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6258, name=Knight of Saradomin, level=103, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=6259, name=Knight of Saradomin, level=101, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6260, name=General Graardor, level=624, option=[null, Attack, null, null, null], anims=[7059, 7058]. +NPC id=6261, name=Sergeant Strongstack, level=141, option=[null, Attack, null, null, null], anims=[6153, 6152]. +NPC id=6262, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6263, name=Sergeant Steelwill, level=142, option=[null, Attack, null, null, null], anims=[6153, 6152]. +NPC id=6264, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6265, name=Sergeant Grimspike, level=142, option=[null, Attack, null, null, null], anims=[6153, 6152]. +NPC id=6266, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6267, name=Ogre, level=58, option=[null, Attack, null, null, null], anims=[357, 358]. +NPC id=6268, name=Jogre, level=58, option=[null, Attack, null, null, null], anims=[2931, 2932]. +NPC id=6269, name=Cyclops, level=81, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=6270, name=Cyclops, level=81, option=[null, Attack, null, null, null], anims=[4650, 4649]. +NPC id=6271, name=Ork, level=107, option=[null, Attack, null, null, null], anims=[4318, 4319]. +NPC id=6272, name=Ork, level=107, option=[null, Attack, null, null, null], anims=[4318, 4319]. +NPC id=6273, name=Ork, level=107, option=[null, Attack, null, null, null], anims=[4318, 4319]. +NPC id=6274, name=Ork, level=107, option=[null, Attack, null, null, null], anims=[4318, 4319]. +NPC id=6275, name=Hobgoblin, level=47, option=[null, Attack, null, null, null], anims=[166, 162]. +NPC id=6276, name=Spiritual ranger, level=115, option=[null, Attack, null, null, null], anims=[4318, 4319]. +NPC id=6277, name=Spiritual warrior, level=134, option=[null, Attack, null, null, null], anims=[4318, 4319]. +NPC id=6278, name=Spiritual mage, level=121, option=[null, Attack, null, null, null], anims=[4318, 4319]. +NPC id=6279, name=Goblin, level=17, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=6280, name=Goblin, level=12, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=6281, name=Goblin, level=12, option=[null, Attack, null, null, null], anims=[6139, 6138]. +NPC id=6282, name=Goblin, level=15, option=[null, Attack, null, null, null], anims=[6186, 6187]. +NPC id=6283, name=Goblin, level=13, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=6284, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6285, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6286, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6287, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6288, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6289, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6290, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6291, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6292, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6293, name=Warped terrorbird, level=143, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6294, name=Warped terrorbird, level=143, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6295, name=Warped terrorbird, level=143, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6296, name=Warped tortoise, level=96, option=[null, Attack, null, null, null], anims=[7090, 7089]. +NPC id=6297, name=Warped tortoise, level=96, option=[null, Attack, null, null, null], anims=[7090, 7089]. +NPC id=6298, name=Jeffery, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6299, name=Big monolith, level=0, option=[Push, null, null, null, null], anims=[-1, -1]. +NPC id=6300, name=Small monolith, level=0, option=[Push, null, null, null, null], anims=[-1, -1]. +NPC id=6301, name=Cute creature, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6302, name=Evil creature, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=6303, name=Yewnock the engineer, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=6304, name=Bolrie, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=6305, name=Hazelmere, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=6306, name=Bolrie, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=6307, name=Advisor, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=6308, name=King Argenthorg, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=6309, name=Prince Argenthorg, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC (wrapper) id=6310, child npcs=[6311, 6312, 1957, -1]. +NPC id=6311, name=Cute creature, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6312, name=Evil creature, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=6313, name=Terrorbird servant, level=0, option=[null, null, null, null, null], anims=[7099, 7098]. +NPC id=6314, name=Guard no. 21, level=0, option=[null, null, null, null, null], anims=[7099, 7098]. +NPC id=6315, name=Guard no. 72, level=0, option=[null, null, null, null, null], anims=[7101, 7098]. +NPC id=6316, name=Guard no. 21, level=0, option=[null, null, null, null, null], anims=[7111, 7103]. +NPC id=6317, name=Guard no. 72, level=0, option=[null, null, null, null, null], anims=[7111, 7103]. +NPC id=6318, name=Longramble, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=6319, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6320, name=Spirit tree, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6321, name=Spirit tree, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6322, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6323, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6324, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6325, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6326, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6327, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6328, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6329, name=Warped terrorbird, level=81, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6330, name=Warped terrorbird, level=143, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6331, name=Warped terrorbird, level=143, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6332, name=Warped terrorbird, level=143, option=[null, Attack, null, null, null], anims=[7105, 7106]. +NPC id=6333, name=null, level=0, option=[null, null, null, null, null], anims=[4472, 4473]. +NPC id=6334, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6335, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6336, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6337, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6338, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6339, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6340, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6341, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6342, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6343, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6344, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6345, name=Child, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6346, name=Pirate, level=23, option=[Talk-to, Attack, null, null, null], anims=[7188, -1]. +NPC id=6347, name=Pirate, level=23, option=[Talk-to, Attack, null, null, null], anims=[7188, -1]. +NPC id=6348, name=Pirate, level=23, option=[Talk-to, Attack, null, null, null], anims=[7188, -1]. +NPC id=6349, name=Pirate, level=23, option=[Talk-to, Attack, null, null, null], anims=[7188, -1]. +NPC id=6350, name=Pirate, level=23, option=[Talk-to, Attack, null, null, null], anims=[7188, -1]. +NPC id=6351, name=Pirate, level=26, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=6352, name=Pirate, level=26, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=6353, name=Pirate, level=26, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=6354, name=Pirate, level=26, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=6355, name=Pirate, level=26, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=6356, name=Pirate, level=26, option=[null, Attack, null, null, null], anims=[7188, -1]. +NPC id=6357, name=Street urchin, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6358, name=Street urchin, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6359, name=Street urchin, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6360, name=Street urchin, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6361, name=Street urchin, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=6362, name=Eniola, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[5607, 5606]. +NPC id=6363, name=Zamorak warrior, level=84, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6364, name=Zamorak warrior, level=85, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6365, name=Zamorak ranger, level=81, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6366, name=Zamorak ranger, level=82, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6367, name=Zamorak mage, level=84, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6368, name=Zamorak mage, level=82, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6369, name=Cave lizard, level=37, option=[null, Attack, null, null, null], anims=[7209, 7210]. +NPC id=6370, name=Mage of Zamorak, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6371, name=Zamorak crafter, level=19, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6372, name=Zamorak crafter, level=19, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=6373, name=Kennith, level=0, option=[Talk-to, null, null, null, null], anims=[7166, 7166]. +NPC id=6374, name=Guard dog, level=44, option=[null, null, null, null, null], anims=[7254, 6560]. +NPC id=6375, name=Wizard Cromperty, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6376, name=Jungle spider, level=40, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=6377, name=Jungle spider, level=40, option=[null, Attack, null, null, null], anims=[5326, 5325]. +NPC id=6378, name=Tenacious toucan, level=70, option=[null, Attack, null, null, null], anims=[6772, 6774]. +NPC id=6379, name=Giant ant worker, level=40, option=[null, Attack, null, null, null], anims=[7236, 7235]. +NPC id=6380, name=Giant ant soldier, level=50, option=[null, Attack, null, null, null], anims=[7236, 7235]. +NPC id=6381, name=Giant wasp, level=62, option=[null, Attack, null, null, null], anims=[7241, 7241]. +NPC id=6382, name=Pernicious parrot, level=66, option=[null, Attack, null, null, null], anims=[6771, 6773]. +NPC id=6383, name=Giant wasp, level=62, option=[null, Attack, null, null, null], anims=[7241, 7241]. +NPC id=6384, name=Karamjan Jungle Eagle, level=0, option=[null, null, null, null, null], anims=[1773, 1773]. +NPC id=6385, name=Karamjan Jungle eagle, level=0, option=[null, null, null, null, null], anims=[5280, 5279]. +NPC id=6386, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6387, name=null, level=0, option=[null, null, null, null, null], anims=[5280, 5279]. +NPC id=6388, name=Bandit, level=41, option=[Talk-to, Attack, Pickpocket, Lure, Knock-Out], anims=[808, -1]. +NPC id=6389, name=Gargoyle, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6390, name=Grim Reaper, level=0, option=[Talk-to, null, null, null, null], anims=[7295, -1]. +NPC id=6391, name=Glough, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=6392, name=Oldak, level=0, option=[Talk-to, null, Buy-sphere, null, null], anims=[6040, 6041]. +NPC id=6393, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=6394, name=null, level=1, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=6395, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=6396, name=null, level=1, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=6397, name=Zanik, level=0, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=6398, name=null, level=1, option=[null, null, null, null, null], anims=[6040, 6041]. +NPC id=6399, name=Zanik, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=6400, name=null, level=0, option=[Talk-to, null, Buy-sphere, null, null], anims=[7329, 6041]. +NPC id=6401, name=Oldak, level=0, option=[Talk-to, null, null, null, null], anims=[6040, 6041]. +NPC id=6402, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6403, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6404, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6405, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6406, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6407, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6408, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6409, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6410, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6411, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6412, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6413, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6414, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6415, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6416, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6417, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6418, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6419, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6420, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6421, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6422, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6423, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6424, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6425, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6426, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6427, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6428, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6429, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6430, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6431, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6432, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6433, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6434, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6435, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6436, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6437, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6438, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6439, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6440, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6441, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6442, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6443, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6444, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6445, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6446, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6447, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6448, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6449, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6450, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6451, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6452, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6453, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6454, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6455, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6456, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6457, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6458, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6459, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6460, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6461, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6462, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6463, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6464, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6465, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6466, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6467, name=Goblin, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6468, name=Skoblin, level=15, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=6469, name=Snothead, level=35, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=6470, name=Snailfeet, level=45, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=6471, name=Mosschin, level=55, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=6472, name=Redeyes, level=65, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=6473, name=Strongbones, level=75, option=[null, Attack, null, null, null], anims=[6181, 6180]. +NPC id=6474, name=Snothead, level=0, option=[Talk-to, null, null, null, null], anims=[7325, 7325]. +NPC id=6475, name=Snailfeet, level=0, option=[Talk-to, null, null, null, null], anims=[7325, 7325]. +NPC id=6476, name=Mosschin, level=0, option=[Talk-to, null, null, null, null], anims=[7325, 7325]. +NPC id=6477, name=Redeyes, level=0, option=[Talk-to, null, null, null, null], anims=[7325, 7325]. +NPC id=6478, name=Strongbones, level=0, option=[Talk-to, null, null, null, null], anims=[7325, 7325]. +NPC id=6479, name=Grubfoot, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6480, name=null, level=1, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=6481, name=Grubfoot, level=0, option=[Talk-to, null, null, null, null], anims=[6181, 6180]. +NPC id=6482, name=Priest, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6181, 6180]. +NPC id=6483, name=Priest, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6181, 6180]. +NPC id=6484, name=Priest, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6181, 6180]. +NPC id=6485, name=Priest, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6181, 6180]. +NPC id=6486, name=Priest, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6181, 6180]. +NPC id=6487, name=Priest, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[6181, 6180]. +NPC id=6488, name=Preacher, level=0, option=[null, null, null, null, null], anims=[7315, 6180]. +NPC id=6489, name=High priest, level=0, option=[Talk-to, null, null, null, null], anims=[7333, 7333]. +NPC id=6490, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=6491, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=6492, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=6493, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=6494, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=6495, name=Goblin, level=0, option=[null, null, null, null, null], anims=[6181, 6180]. +NPC id=6496, name=Goblin guard, level=0, option=[Talk-to, null, null, null, null], anims=[6186, 6187]. +NPC id=6497, name=Goblin guard, level=0, option=[Talk-to, null, null, null, null], anims=[6186, 6187]. +NPC id=6498, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[6186, 6187]. +NPC id=6499, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[6186, 6187]. +NPC id=6500, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[6186, 6187]. +NPC id=6501, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[6186, 6187]. +NPC id=6502, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[6186, 6187]. +NPC id=6503, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[6186, 6187]. +NPC id=6504, name=Ghost, level=0, option=[Talk-to, null, null, null, null], anims=[7343, 7342]. +NPC id=6505, name=null, level=1, option=[null, null, null, null, null], anims=[7343, 7342]. +NPC id=6506, name=Registrar 1, level=0, option=[Talk-to, null, null, null, null], anims=[1705, -1]. +NPC id=6507, name=Registrar 2, level=0, option=[Talk-to, null, null, null, null], anims=[1705, -1]. +NPC id=6508, name=Registrar 3, level=0, option=[Talk-to, null, null, null, null], anims=[1705, -1]. +NPC id=6509, name=Registrar 4, level=0, option=[Talk-to, null, null, null, null], anims=[1705, -1]. +NPC id=6510, name=Jury, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6511, name=Jury, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=6512, name=Spectator, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6513, name=Spectator, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6514, name=Spectator, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6515, name=Spectator, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6516, name=Spectator, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6517, name=Spectator, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6518, name=Spectator, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6519, name=Spectator, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6520, name=Head Registrar, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6521, name=Grand Exchange Tutor, level=0, option=[Talk-to, null, null, null, null], anims=[7368, 7368]. +NPC id=6522, name=Brugsen Bursen, level=0, option=[Talk-to, null, null, null, null], anims=[7369, 7369]. +NPC id=6523, name=Farid Morrisane (ores), level=0, option=[Talk-to, null, Info-ores, null, null], anims=[7367, 7367]. +NPC id=6524, name=Bob Barter (herbs), level=0, option=[Talk-to, null, Info-herbs, null, null], anims=[7366, 7366]. +NPC id=6525, name=Murky Matt (runes), level=0, option=[Talk-to, null, Info-runes, null, null], anims=[7365, 7365]. +NPC id=6526, name=Relobo Blinyo (logs), level=0, option=[Talk-to, null, Info-logs, null, null], anims=[7364, 7364]. +NPC id=6527, name=Hofuthand (armour and weapons), level=0, option=[Talk-to, null, Info-combat, null, null], anims=[7370, 7370]. +NPC id=6528, name=Grand Exchange clerk, level=0, option=[Talk-to, null, Exchange, History, Sets], anims=[808, -1]. +NPC id=6529, name=Grand Exchange clerk, level=0, option=[Talk-to, null, Exchange, History, Sets], anims=[808, -1]. +NPC id=6530, name=Grand Exchange clerk, level=0, option=[Talk-to, null, Exchange, History, Sets], anims=[808, -1]. +NPC id=6531, name=Grand Exchange clerk, level=0, option=[Talk-to, null, Exchange, History, Sets], anims=[808, -1]. +NPC id=6532, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=6533, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=6534, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=6535, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, -1]. +NPC id=6536, name=Registrar 5, level=0, option=[Talk-to, null, null, null, null], anims=[1705, -1]. +NPC id=6537, name=Mandrith, level=0, option=[Talk-to, null, null, null, null], anims=[7389, 7390]. +NPC id=6538, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[5607, 5606]. +NPC id=6539, name=Charley the Cleaner, level=0, option=[Talk-to, null, null, null, null], anims=[5800, 5799]. +NPC id=6540, name=Scotty the Cleaner, level=0, option=[Talk-to, null, null, null, null], anims=[5800, 5799]. +NPC id=6541, name=Sanchez the Cleaner, level=0, option=[Talk-to, null, null, null, null], anims=[5800, 5799]. +NPC id=6542, name=Calladin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6543, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6544, name=, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6545, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6546, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6547, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6548, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6549, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6550, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6551, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6552, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6553, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6554, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6555, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6556, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6557, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6558, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6559, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6560, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6561, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6562, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6563, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6564, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6565, name=Grave marker, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6566, name=Broken grave marker, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6567, name=Collapsing grave marker, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6568, name=Grave marker, level=0, option=[Read, null, null, Bless, Demolish], anims=[7375, -1]. +NPC id=6569, name=Broken grave marker, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[7375, -1]. +NPC id=6570, name=Collapsing grave marker, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[7375, -1]. +NPC id=6571, name=Gravestone, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6572, name=Broken gravestone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6573, name=Collapsing gravestone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6574, name=Gravestone, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6575, name=Broken gravestone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6576, name=Collapsing gravestone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6577, name=Gravestone, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6578, name=Broken gravestone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6579, name=Collapsing gravestone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6580, name=Stele, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6581, name=Broken stele, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6582, name=Collapsing stele, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6583, name=Saradomin symbol, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6584, name=Broken Saradomin symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6585, name=Collapsing Saradomin symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6586, name=Zamorak symbol, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6587, name=Broken Zamorak symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6588, name=Collapsing Zamorak symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6589, name=Guthix symbol, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6590, name=Broken Guthix symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6591, name=Collapsing Guthix symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6592, name=Bandos symbol, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6593, name=Broken Bandos symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6594, name=Collapsing Bandos symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6595, name=Armadyl symbol, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6596, name=Broken Armadyl symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6597, name=Collapsing Armadyl symbol, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6598, name=Memorial stone, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6599, name=Broken memorial stone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6600, name=Collapsing memorial stone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6601, name=Memorial stone, level=0, option=[Read, null, null, Bless, Demolish], anims=[-1, -1]. +NPC id=6602, name=Broken memorial stone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6603, name=Collapsing memorial stone, level=0, option=[Read, null, Repair, Bless, Demolish], anims=[-1, -1]. +NPC id=6604, name=Revenant imp, level=7, option=[null, Attack, null, null, null], anims=[7405, 7406]. +NPC id=6605, name=Revenant goblin, level=15, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6606, name=Revenant icefiend, level=45, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6607, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6608, name=Revenant hobgoblin, level=60, option=[null, Attack, null, null, null], anims=[7421, 7422]. +NPC id=6609, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6610, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6611, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6612, name=Revenant goblin, level=30, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6613, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6614, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6615, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6616, name=Revenant goblin, level=15, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6617, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6618, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6619, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6620, name=Revenant goblin, level=22, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6621, name=Revenant icefiend, level=45, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6622, name=Revenant pyrefiend, level=52, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6623, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6624, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6625, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6626, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6627, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6628, name=Revenant icefiend, level=45, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6629, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6630, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6631, name=Revenant pyrefiend, level=52, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6632, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6633, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6634, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6635, name=Revenant imp, level=7, option=[null, Attack, null, null, null], anims=[7405, 7406]. +NPC id=6636, name=Revenant goblin, level=15, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6637, name=Revenant goblin, level=22, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6638, name=Revenant goblin, level=30, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6639, name=Revenant goblin, level=37, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6640, name=Revenant icefiend, level=45, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6641, name=Revenant pyrefiend, level=52, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6642, name=Revenant hobgoblin, level=60, option=[null, Attack, null, null, null], anims=[7421, 7422]. +NPC id=6643, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6644, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6645, name=Revenant cyclops, level=82, option=[null, Attack, null, null, null], anims=[7458, 7459]. +NPC id=6646, name=Revenant hellhound, level=90, option=[null, Attack, null, null, null], anims=[7465, 7466]. +NPC id=6647, name=Revenant demon, level=98, option=[null, Attack, null, null, null], anims=[7479, 7480]. +NPC id=6648, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6649, name=Revenant dark beast, level=120, option=[null, Attack, null, null, null], anims=[7472, 7473]. +NPC id=6650, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6651, name=Revenant goblin, level=22, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6652, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6653, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6654, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6655, name=Revenant imp, level=7, option=[null, Attack, null, null, null], anims=[7405, 7406]. +NPC id=6656, name=Revenant goblin, level=15, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6657, name=Revenant goblin, level=30, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6658, name=Revenant goblin, level=37, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6659, name=Revenant icefiend, level=45, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6660, name=Revenant pyrefiend, level=52, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6661, name=Revenant hobgoblin, level=60, option=[null, Attack, null, null, null], anims=[7421, 7422]. +NPC id=6662, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6663, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6664, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6665, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6666, name=Revenant imp, level=7, option=[null, Attack, null, null, null], anims=[7405, 7406]. +NPC id=6667, name=Revenant goblin, level=30, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6668, name=Revenant pyrefiend, level=52, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6669, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6670, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6671, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6672, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6673, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6674, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6675, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6676, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6677, name=Revenant imp, level=7, option=[null, Attack, null, null, null], anims=[7405, 7406]. +NPC id=6678, name=Revenant goblin, level=15, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6679, name=Revenant goblin, level=22, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6680, name=Revenant goblin, level=30, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6681, name=Revenant goblin, level=37, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6682, name=Revenant icefiend, level=45, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6683, name=Revenant pyrefiend, level=52, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6684, name=Revenant hobgoblin, level=60, option=[null, Attack, null, null, null], anims=[7421, 7422]. +NPC id=6685, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6686, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6687, name=Revenant cyclops, level=82, option=[null, Attack, null, null, null], anims=[7458, 7459]. +NPC id=6688, name=Revenant hellhound, level=90, option=[null, Attack, null, null, null], anims=[7465, 7466]. +NPC id=6689, name=Revenant demon, level=98, option=[null, Attack, null, null, null], anims=[7479, 7480]. +NPC id=6690, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6691, name=Revenant dark beast, level=120, option=[null, Attack, null, null, null], anims=[7472, 7473]. +NPC id=6692, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6693, name=Revenant goblin, level=30, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6694, name=Revenant icefiend, level=45, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6695, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6696, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6697, name=Revenant imp, level=7, option=[null, Attack, null, null, null], anims=[7405, 7406]. +NPC id=6698, name=Revenant goblin, level=22, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6699, name=Revenant goblin, level=37, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6700, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6701, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6702, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6703, name=Revenant imp, level=7, option=[null, Attack, null, null, null], anims=[7405, 7406]. +NPC id=6704, name=Revenant goblin, level=15, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6705, name=Revenant goblin, level=22, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6706, name=Revenant goblin, level=30, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6707, name=Revenant goblin, level=37, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6708, name=Revenant icefiend, level=45, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6709, name=Revenant pyrefiend, level=52, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6710, name=Revenant hobgoblin, level=60, option=[null, Attack, null, null, null], anims=[7421, 7422]. +NPC id=6711, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6712, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6713, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6714, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6715, name=Revenant imp, level=7, option=[null, Attack, null, null, null], anims=[7405, 7406]. +NPC id=6716, name=Revenant goblin, level=15, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6717, name=Revenant goblin, level=22, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6718, name=Revenant goblin, level=30, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6719, name=Revenant goblin, level=37, option=[null, Attack, null, null, null], anims=[7451, 7452]. +NPC id=6720, name=Revenant icefiend, level=45, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6721, name=Revenant pyrefiend, level=52, option=[null, Attack, null, null, null], anims=[7486, 7487]. +NPC id=6722, name=Revenant hobgoblin, level=60, option=[null, Attack, null, null, null], anims=[7421, 7422]. +NPC id=6723, name=Revenant vampire, level=68, option=[null, Attack, null, null, null], anims=[7430, 7431]. +NPC id=6724, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6725, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6726, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6727, name=Revenant hobgoblin, level=60, option=[null, Attack, null, null, null], anims=[7421, 7422]. +NPC id=6728, name=Revenant werewolf, level=75, option=[null, Attack, null, null, null], anims=[7400, 7401]. +NPC id=6729, name=Revenant ork, level=105, option=[null, Attack, null, null, null], anims=[7414, 7415]. +NPC id=6730, name=Revenant knight, level=126, option=[null, Attack, null, null, null], anims=[7444, 7445]. +NPC id=6731, name=Queen of Snow, level=0, option=[Talk-to, null, null, null, null], anims=[7188, 6531]. +NPC id=6732, name=Snow imp, level=0, option=[Talk-to, null, null, null, null], anims=[171, 168]. +NPC id=6733, name=Snow imp, level=0, option=[Talk-to, null, null, null, null], anims=[171, 168]. +NPC id=6734, name=Snow imp, level=0, option=[Talk-to, null, null, null, null], anims=[171, 168]. +NPC id=6735, name=Snow imp, level=0, option=[Talk-to, null, null, null, null], anims=[171, 168]. +NPC id=6736, name=Snow imp, level=0, option=[Talk-to, null, null, null, null], anims=[171, 168]. +NPC id=6737, name=Snow imp, level=0, option=[Talk-to, null, null, null, null], anims=[171, 168]. +NPC id=6738, name=Snow imp, level=0, option=[Talk-to, null, null, null, null], anims=[171, 168]. +NPC id=6739, name=Snow imp, level=0, option=[Talk-to, null, null, null, null], anims=[171, 168]. +NPC id=6740, name=Snow, level=0, option=[null, null, null, null, null], anims=[7543, 7543]. +NPC id=6741, name=Snow, level=0, option=[null, null, null, null, null], anims=[7553, 7553]. +NPC id=6742, name=Barbarian snowman, level=0, option=[Talk-to, null, null, null, null], anims=[7557, 7556]. +NPC id=6743, name=Dragon snowman, level=0, option=[Talk-to, null, null, null, null], anims=[7557, 7556]. +NPC id=6744, name=Dwarf snowman, level=0, option=[Talk-to, null, null, null, null], anims=[7557, 7556]. +NPC id=6745, name=Pirate snowman, level=0, option=[Talk-to, null, null, null, null], anims=[7557, 7556]. +NPC id=6746, name=Snowman, level=0, option=[Talk-to, null, null, null, null], anims=[7557, 7556]. +NPC id=6747, name=Snow ranger, level=29, option=[Pelt, null, Talk-to, null, null], anims=[7557, 7556]. +NPC id=6748, name=Snow warrior, level=29, option=[Pelt, null, Talk-to, null, null], anims=[7557, 7556]. +NPC id=6749, name=Snow mage, level=29, option=[Pelt, null, Talk-to, null, null], anims=[7557, 7556]. +NPC id=6750, name=Pet shop owner, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=6751, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=6752, name=Bulldog, level=0, option=[null, null, null, null, null], anims=[7575, 7576]. +NPC id=6753, name=Mummy, level=125, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=6754, name=Mummy, level=125, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=6755, name=Mummy, level=125, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=6756, name=Mummy, level=125, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=6757, name=Mummy, level=125, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=6758, name=Mummy, level=125, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=6759, name=Mummy, level=125, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=6760, name=Mummy, level=125, option=[null, Attack, null, null, null], anims=[5548, 5552]. +NPC id=6761, name=Dried zombie, level=89, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=6762, name=Dried zombie, level=94, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=6763, name=Dried zombie, level=110, option=[null, Attack, null, null, null], anims=[5565, -1]. +NPC id=6764, name=Skeleton, level=97, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=6765, name=Skeleton, level=108, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=6766, name=Skeleton, level=120, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=6767, name=Skeleton, level=115, option=[null, Attack, null, null, null], anims=[5483, 5481]. +NPC id=6768, name=Skeleton, level=140, option=[null, Attack, null, null, null], anims=[5483, 5479]. +NPC id=6769, name=Doorman, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=6770, name=Giant scarab, level=191, option=[null, Attack, null, null, null], anims=[7593, 7592]. +NPC id=6771, name=Giant scarab, level=206, option=[null, Attack, null, null, null], anims=[7593, 7592]. +NPC id=6772, name=Scarab larva, level=14, option=[null, Attack, null, null, null], anims=[7654, 7653]. +NPC id=6773, name=Scabaras ranger, level=103, option=[null, Attack, null, null, null], anims=[7605, 7606]. +NPC id=6774, name=Scabaras lancer, level=112, option=[null, Attack, null, null, null], anims=[7610, 7611]. +NPC id=6775, name=Scabaras priest, level=1, option=[null, null, null, null, null], anims=[7605, 7606]. +NPC id=6776, name=Scabaras locust, level=106, option=[null, Attack, null, null, null], anims=[7583, 7582]. +NPC id=6777, name=Locust lancer, level=109, option=[null, Attack, null, null, null], anims=[7583, 7582]. +NPC id=6778, name=Locust ranger, level=98, option=[null, Attack, null, null, null], anims=[7583, 7582]. +NPC id=6779, name=Crocodile, level=89, option=[null, Attack, null, null, null], anims=[7589, 7587]. +NPC id=6780, name=Scabaras mage, level=98, option=[null, Attack, null, null, null], anims=[7618, 7619]. +NPC id=6781, name=Scabaras mage, level=88, option=[null, Attack, null, null, null], anims=[7618, 7619]. +NPC id=6782, name=Maisa, level=0, option=[Talk-to, null, null, null, null], anims=[7629, 819]. +NPC id=6783, name=Maisa, level=0, option=[Talk-to, null, null, null, null], anims=[7629, 819]. +NPC id=6784, name=Priest, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6785, name=Clay golem, level=0, option=[Talk-to, null, null, null, null], anims=[1913, 1912]. +NPC id=6786, name=Lead archaeologist Abigail, level=0, option=[Talk-to, null, null, null, null], anims=[7579, -1]. +NPC id=6787, name=Assistant archaeologist Kerner, level=0, option=[Talk-to, null, null, null, null], anims=[7578, -1]. +NPC id=6788, name=High Priest of Scabaras, level=0, option=[Talk-to, null, null, null, null], anims=[7605, 7606]. +NPC id=6789, name=High Priest of Scabaras, level=179, option=[null, Attack, null, null, null], anims=[7610, 7611]. +NPC id=6790, name=High Priest of Scabaras, level=139, option=[null, Attack, null, null, null], anims=[7605, 7606]. +NPC id=6791, name=High Priest of Scabaras, level=148, option=[null, Attack, null, null, null], anims=[7610, 7611]. +NPC id=6792, name=Vulture, level=31, option=[null, Attack, null, null, null], anims=[7659, 7658]. +NPC id=6793, name=null, level=1, option=[Talk-to, null, null, null, null], anims=[7629, -1]. +NPC id=6794, name=Spirit terrorbird, level=0, option=[Interact, null, Store, null, null], anims=[1008, 1007]. +NPC id=6795, name=Spirit terrorbird, level=62, option=[Interact, Attack, Store, null, null], anims=[1008, 1007]. +NPC id=6796, name=Granite crab, level=0, option=[Interact, null, Withdraw, null, null], anims=[8098, 8100]. +NPC id=6797, name=Granite crab, level=26, option=[Interact, Attack, Withdraw, null, null], anims=[8098, 8100]. +NPC id=6798, name=Praying mantis, level=0, option=[Interact, null, null, null, null], anims=[8067, 8072]. +NPC id=6799, name=Praying mantis, level=131, option=[Interact, Attack, null, null, null], anims=[8067, 8072]. +NPC id=6800, name=Giant ent, level=0, option=[Interact, null, Withdraw, null, null], anims=[7849, 7848]. +NPC id=6801, name=Giant ent, level=137, option=[Interact, Attack, Withdraw, null, null], anims=[7849, 7848]. +NPC id=6802, name=Spirit cobra, level=0, option=[Interact, null, null, null, null], anims=[8155, 8158]. +NPC id=6803, name=Spirit cobra, level=105, option=[Interact, Attack, null, null, null], anims=[8155, 8158]. +NPC id=6804, name=Spirit dagannoth, level=0, option=[Interact, null, null, null, null], anims=[7781, 7784]. +NPC id=6805, name=Spirit dagannoth, level=148, option=[Interact, Attack, null, null, null], anims=[7781, 7784]. +NPC id=6806, name=Thorny snail, level=0, option=[Interact, null, Store, null, null], anims=[8146, 8145]. +NPC id=6807, name=Thorny snail, level=26, option=[Interact, Attack, Store, null, null], anims=[8146, 8145]. +NPC id=6808, name=Beaver, level=0, option=[Interact, null, Withdraw, null, null], anims=[7718, 7719]. +NPC id=6809, name=Karamthulhu overlord, level=0, option=[Interact, null, null, null, Drown], anims=[7968, 7961]. +NPC id=6810, name=Karamthulhu overlord, level=95, option=[Interact, Attack, null, null, Drown], anims=[7968, 7961]. +NPC id=6811, name=Hydra, level=0, option=[Interact, null, null, null, null], anims=[7938, 7941]. +NPC id=6812, name=Hydra, level=141, option=[Interact, Attack, null, null, null], anims=[7938, 7941]. +NPC id=6813, name=Bunyip, level=0, option=[Interact, null, null, null, null], anims=[7738, 7735]. +NPC id=6814, name=Bunyip, level=70, option=[Interact, Attack, null, null, null], anims=[7738, 7735]. +NPC id=6815, name=War tortoise, level=0, option=[Interact, null, Store, null, null], anims=[8284, 8281]. +NPC id=6816, name=War tortoise, level=86, option=[Interact, Attack, Store, null, null], anims=[8284, 8281]. +NPC id=6817, name=Fruit bat, level=0, option=[Interact, null, Withdraw, null, null], anims=[8271, 8273]. +NPC id=6818, name=Abyssal parasite, level=0, option=[Interact, null, Store, null, null], anims=[7668, 7667]. +NPC id=6819, name=Abyssal parasite, level=86, option=[Interact, Attack, Store, null, null], anims=[7668, 7667]. +NPC id=6820, name=Abyssal lurker, level=0, option=[Interact, null, Store, null, null], anims=[7677, 7678]. +NPC id=6821, name=Abyssal lurker, level=93, option=[Interact, Attack, Store, null, null], anims=[7677, 7678]. +NPC id=6822, name=Unicorn stallion, level=0, option=[Interact, null, null, null, Cure], anims=[6374, 6373]. +NPC id=6823, name=Unicorn stallion, level=70, option=[Interact, Attack, null, null, Cure], anims=[6374, 6373]. +NPC id=6824, name=Magpie, level=0, option=[Interact, null, Withdraw, null, null], anims=[8008, 8007]. +NPC id=6825, name=Dreadfowl, level=0, option=[Interact, null, null, null, Special], anims=[5386, 7808]. +NPC id=6826, name=Dreadfowl, level=26, option=[Interact, Attack, null, null, Special], anims=[5386, 7808]. +NPC id=6827, name=Stranger plant, level=0, option=[Interact, null, Withdraw, null, null], anims=[8204, 8207]. +NPC id=6828, name=Stranger plant, level=107, option=[Interact, Attack, Withdraw, null, null], anims=[8204, 8207]. +NPC id=6829, name=Spirit wolf, level=0, option=[Interact, null, null, null, null], anims=[8297, 8291]. +NPC id=6830, name=Spirit wolf, level=26, option=[Interact, Attack, null, null, null], anims=[8297, 8291]. +NPC id=6831, name=Desert wyrm, level=0, option=[Interact, null, Burrow, null, null], anims=[7793, 7792]. +NPC id=6832, name=Desert wyrm, level=31, option=[Interact, Attack, Burrow, null, null], anims=[7793, 7792]. +NPC id=6833, name=Evil turnip, level=0, option=[Interact, null, Withdraw, null, null], anims=[8246, 8245]. +NPC id=6834, name=Evil turnip, level=62, option=[Interact, Attack, Withdraw, null, null], anims=[8246, 8245]. +NPC id=6835, name=Vampire bat, level=0, option=[Interact, null, null, null, null], anims=[8271, 8273]. +NPC id=6836, name=Vampire bat, level=44, option=[Interact, Attack, null, null, null], anims=[8271, 8273]. +NPC id=6837, name=Spirit scorpion, level=0, option=[Interact, null, null, null, null], anims=[6252, 6253]. +NPC id=6838, name=Spirit scorpion, level=51, option=[Interact, Attack, null, null, null], anims=[6252, 6253]. +NPC id=6839, name=Arctic bear, level=0, option=[Interact, null, null, null, null], anims=[4919, 4923]. +NPC id=6840, name=Arctic bear, level=122, option=[Interact, Attack, null, null, null], anims=[4919, 4923]. +NPC id=6841, name=Spirit spider, level=0, option=[Interact, null, null, null, null], anims=[5326, 5325]. +NPC id=6842, name=Spirit spider, level=25, option=[Interact, Attack, null, null, null], anims=[5326, 5325]. +NPC id=6843, name=Bloated leech, level=0, option=[Interact, null, null, null, null], anims=[7654, 7653]. +NPC id=6844, name=Bloated leech, level=76, option=[Interact, Attack, null, null, null], anims=[7654, 7653]. +NPC id=6845, name=Honey badger, level=0, option=[Interact, null, null, null, null], anims=[7924, 7923]. +NPC id=6846, name=Honey badger, level=45, option=[Interact, Attack, null, null, null], anims=[7924, 7923]. +NPC id=6847, name=Albino rat, level=0, option=[Interact, null, Withdraw, null, null], anims=[4932, 4931]. +NPC id=6848, name=Albino rat, level=37, option=[Interact, Attack, Withdraw, null, null], anims=[4932, 4931]. +NPC id=6849, name=Granite lobster, level=0, option=[Interact, null, Withdraw, null, null], anims=[8116, 8115]. +NPC id=6850, name=Granite lobster, level=129, option=[Interact, Attack, Withdraw, null, null], anims=[8116, 8115]. +NPC id=6851, name=Macaw, level=0, option=[Interact, null, Withdraw, null, null], anims=[8008, 8007]. +NPC id=6852, name=Macaw, level=0, option=[null, null, null, null, null], anims=[8006, -1]. +NPC id=6853, name=Bronze minotaur, level=0, option=[Interact, null, null, null, null], anims=[8021, 8022]. +NPC id=6854, name=Bronze minotaur, level=50, option=[Interact, Attack, null, null, null], anims=[8021, 8022]. +NPC id=6855, name=Iron minotaur, level=0, option=[Interact, null, null, null, null], anims=[8021, 8022]. +NPC id=6856, name=Iron minotaur, level=70, option=[Interact, Attack, null, null, null], anims=[8021, 8022]. +NPC id=6857, name=Steel minotaur, level=0, option=[Interact, null, null, null, null], anims=[8021, 8022]. +NPC id=6858, name=Steel minotaur, level=90, option=[Interact, Attack, null, null, null], anims=[8021, 8022]. +NPC id=6859, name=Mithril minotaur, level=0, option=[Interact, null, null, null, null], anims=[8021, 8022]. +NPC id=6860, name=Mithril minotaur, level=112, option=[Interact, Attack, null, null, null], anims=[8021, 8022]. +NPC id=6861, name=Adamant minotaur, level=0, option=[Interact, null, null, null, null], anims=[8021, 8022]. +NPC id=6862, name=Adamant minotaur, level=133, option=[Interact, Attack, null, null, null], anims=[8021, 8022]. +NPC id=6863, name=Rune minotaur, level=0, option=[Interact, null, null, null, null], anims=[8021, 8022]. +NPC id=6864, name=Rune minotaur, level=154, option=[Interact, Attack, null, null, null], anims=[8021, 8022]. +NPC id=6865, name=Smoke devil, level=0, option=[Interact, null, null, null, Flames], anims=[7815, 7814]. +NPC id=6866, name=Smoke devil, level=101, option=[Interact, Attack, null, null, Flames], anims=[7815, 7814]. +NPC id=6867, name=Bull ant, level=0, option=[Interact, null, Store, null, null], anims=[7893, 7899]. +NPC id=6868, name=Bull ant, level=58, option=[Interact, Attack, Store, null, null], anims=[7893, 7899]. +NPC id=6869, name=Wolpertinger, level=0, option=[Interact, null, null, null, null], anims=[8301, 8302]. +NPC id=6870, name=Wolpertinger, level=210, option=[Interact, Attack, null, null, null], anims=[8301, 8302]. +NPC id=6871, name=Compost mound, level=0, option=[Interact, null, Withdraw, null, null], anims=[7772, 7768]. +NPC id=6872, name=Compost mound, level=37, option=[Interact, Attack, Withdraw, null, null], anims=[7772, 7768]. +NPC id=6873, name=Pack yak, level=0, option=[Interact, null, Store, null, null], anims=[5785, 5781]. +NPC id=6874, name=Pack yak, level=175, option=[Interact, Attack, Store, null, null], anims=[5785, 5781]. +NPC id=6875, name=Spirit cockatrice, level=0, option=[Interact, null, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6876, name=Spirit cockatrice, level=64, option=[Interact, Attack, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6877, name=Spirit guthatrice, level=0, option=[Interact, null, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6878, name=Spirit guthatrice, level=64, option=[Interact, Attack, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6879, name=Spirit saratrice, level=0, option=[Interact, null, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6880, name=Spirit saratrice, level=64, option=[Interact, Attack, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6881, name=Spirit zamatrice, level=0, option=[Interact, null, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6882, name=Spirit zamatrice, level=64, option=[Interact, Attack, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6883, name=Spirit pengatrice, level=0, option=[Interact, null, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6884, name=Spirit pengatrice, level=64, option=[Interact, Attack, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6885, name=Spirit coraxatrice, level=0, option=[Interact, null, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6886, name=Spirit coraxatrice, level=64, option=[Interact, Attack, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6887, name=Spirit vulatrice, level=0, option=[Interact, null, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6888, name=Spirit vulatrice, level=64, option=[Interact, Attack, Withdraw, null, Drain], anims=[7760, 7759]. +NPC id=6889, name=Barker toad, level=0, option=[Interact, null, null, null, Cannon], anims=[7258, 7259]. +NPC id=6890, name=Barker toad, level=112, option=[Interact, Attack, null, null, Cannon], anims=[7258, 7259]. +NPC id=6891, name=Penguin keeper, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6892, name=Pet shop owner, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=6893, name=Pet shop owner, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=6894, name=Terrier, level=0, option=[null, null, null, null, null], anims=[7575, 8337]. +NPC id=6895, name=Labrador, level=0, option=[null, null, null, null, null], anims=[7575, 8335]. +NPC id=6896, name=Dalmatian, level=0, option=[null, null, null, null, null], anims=[7575, 8331]. +NPC id=6897, name=Bulldog, level=0, option=[null, null, null, null, null], anims=[7575, 7576]. +NPC id=6898, name=Pet shop owner, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=6899, name=Bulldog, level=0, option=[null, null, null, null, null], anims=[7575, 7576]. +NPC id=6900, name=Hatchling dragon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[27, 21]. +NPC id=6901, name=Baby dragon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[27, 21]. +NPC id=6902, name=Hatchling dragon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[27, 21]. +NPC id=6903, name=Baby dragon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[27, 21]. +NPC id=6904, name=Hatchling dragon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[27, 21]. +NPC id=6905, name=Baby dragon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[27, 21]. +NPC id=6906, name=Hatchling dragon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[27, 21]. +NPC id=6907, name=Baby dragon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[27, 21]. +NPC id=6908, name=Baby penguin, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8319, 8318]. +NPC id=6909, name=Penguin, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8315, 8314]. +NPC id=6910, name=Penguin, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8315, 8317]. +NPC id=6911, name=Raven chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=6912, name=Raven, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=6913, name=Baby raccoon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7718, 7719]. +NPC id=6914, name=Raccoon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7718, 7719]. +NPC id=6915, name=Baby gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8358]. +NPC id=6916, name=Gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8357]. +NPC id=6917, name=Baby gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8358]. +NPC id=6918, name=Gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8357]. +NPC id=6919, name=Baby squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=6920, name=Squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=6921, name=Baby squirrel, level=0, option=[null, null, null, null, null], anims=[8324, 8326]. +NPC id=6922, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6923, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6924, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6925, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6926, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6927, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6928, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6929, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6930, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6931, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6932, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6933, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6934, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6935, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6936, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6937, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6938, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6939, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6940, name=Baby chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6941, name=Chameleon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8363, 8365]. +NPC id=6942, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=6943, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=6944, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=6945, name=Vulture chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=6946, name=Vulture, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7659, 7658]. +NPC id=6947, name=Baby giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=6948, name=Giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=6949, name=Saradomin chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=6950, name=Saradomin bird, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=6951, name=Saradomin owl, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=6952, name=Zamorak chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=6953, name=Zamorak bird, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=6954, name=Zamorak hawk, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=6955, name=Guthix chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=6956, name=Guthix bird, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=6957, name=Guthix raptor, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=6958, name=Terrier puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8336]. +NPC id=6959, name=Terrier, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8337]. +NPC id=6960, name=Greyhound puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8332]. +NPC id=6961, name=Greyhound, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8333]. +NPC id=6962, name=Labrador puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8334]. +NPC id=6963, name=Labrador, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8335]. +NPC id=6964, name=Dalmatian puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8330]. +NPC id=6965, name=Dalmatian, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8331]. +NPC id=6966, name=Sheepdog puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8334]. +NPC id=6967, name=Sheepdog, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8335]. +NPC id=6968, name=Bulldog, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 7576]. +NPC id=6969, name=Bulldog puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7575, 8329]. +NPC id=6970, name=Pikkupstix, level=0, option=[Talk-to, null, Trade, Enchant, null], anims=[8528, 8527]. +NPC id=6971, name=Pikkupstix, level=0, option=[Talk-to, null, null, null, null], anims=[8497, 8496]. +NPC id=6972, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[8528, 8529]. +NPC id=6973, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6974, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6975, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[8528, 8529]. +NPC id=6976, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6977, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6978, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6979, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[8528, 8529]. +NPC id=6980, name=Druid, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6981, name=Druidess, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6982, name=Druidess, level=33, option=[null, Attack, null, null, null], anims=[8528, 8529]. +NPC id=6983, name=Druidess, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6984, name=Druidess, level=33, option=[null, Attack, null, null, null], anims=[8528, 8529]. +NPC id=6985, name=Druidess, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6986, name=Druidess, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=6987, name=Druidess, level=33, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC (wrapper) id=6988, child npcs=[6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6971, -1]. +NPC id=6989, name=null, level=0, option=[Talk-to, null, Trade, Enchant, null], anims=[8528, 8527]. +NPC id=6990, name=Giant wolpertinger, level=0, option=[null, null, null, null, null], anims=[8504, 8505]. +NPC id=6991, name=Ibis, level=0, option=[Interact, null, Withdraw, null, null], anims=[8197, 8198]. +NPC id=6992, name=Spirit jelly, level=0, option=[Interact, null, null, null, null], anims=[8572, 8575]. +NPC id=6993, name=Spirit jelly, level=88, option=[Interact, Attack, null, null, null], anims=[8572, 8575]. +NPC id=6994, name=Spirit kalphite, level=0, option=[Interact, null, Store, null, null], anims=[8518, 6220]. +NPC id=6995, name=Spirit kalphite, level=39, option=[Interact, Attack, Store, null, null], anims=[8518, 6220]. +NPC id=6996, name=Bogrog, level=0, option=[Talk-To, null, Trade, Swap, null], anims=[8574, 8573]. +NPC id=6997, name=Baby raccoon, level=0, option=[null, null, null, null, null], anims=[7718, 7719]. +NPC id=6998, name=Revenant dragon, level=135, option=[null, Attack, null, null, null], anims=[8589, 8590]. +NPC id=6999, name=Revenant dragon, level=135, option=[null, Attack, null, null, null], anims=[8589, 8590]. +NPC id=7000, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7001, name=Dark Squall, level=0, option=[null, null, null, null, null], anims=[7188, -1]. +NPC id=7002, name=Surok Magis, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=7003, name=Fire giant, level=86, option=[null, Attack, null, null, null], anims=[4662, 4660]. +NPC id=7004, name=Fire giant, level=86, option=[null, Attack, null, null, null], anims=[4663, 4661]. +NPC id=7005, name=Big wolf, level=73, option=[null, Attack, null, null, null], anims=[6580, 6556]. +NPC id=7006, name=null, level=0, option=[null, null, null, null, null], anims=[7188, -1]. +NPC id=7007, name=null, level=0, option=[null, null, null, null, null], anims=[7188, -1]. +NPC id=7008, name=null, level=0, option=[null, null, null, null, null], anims=[7188, -1]. +NPC id=7009, name=null, level=0, option=[Talk-To, null, null, null, null], anims=[808, -1]. +NPC id=7010, name=Grenwall, level=0, option=[null, null, null, null, null], anims=[8604, 8606]. +NPC id=7011, name=Grenwall, level=0, option=[null, null, null, null, null], anims=[8601, 8606]. +NPC id=7012, name=Pawya, level=0, option=[null, null, null, null, null], anims=[8609, 8608]. +NPC id=7013, name=Earth mound, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7014, name=Pawya, level=0, option=[null, null, null, null, null], anims=[8609, -1]. +NPC id=7015, name=Platypus, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8671, 8672]. +NPC id=7016, name=Platypus, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8671, 8672]. +NPC id=7017, name=Platypus, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8671, 8672]. +NPC id=7018, name=Baby platypus, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8671, 8670]. +NPC id=7019, name=Baby platypus, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8671, 8670]. +NPC id=7020, name=Baby platypus, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8671, 8670]. +NPC id=7021, name=Platypus, level=0, option=[null, null, null, null, null], anims=[8671, 8672]. +NPC id=7022, name=Platypus, level=0, option=[null, null, null, null, null], anims=[8671, 8672]. +NPC id=7023, name=Platypus, level=0, option=[null, null, null, null, null], anims=[8671, 8672]. +NPC id=7024, name=Baby platypus, level=0, option=[null, null, null, null, null], anims=[8671, 8670]. +NPC id=7025, name=Baby platypus, level=0, option=[null, null, null, null, null], anims=[8671, 8670]. +NPC id=7026, name=Baby platypus, level=0, option=[null, null, null, null, null], anims=[8671, 8670]. +NPC id=7027, name=Patrick, level=0, option=[null, null, null, null, null], anims=[8671, 8672]. +NPC id=7028, name=Penelope, level=0, option=[null, null, null, null, null], anims=[8671, 8672]. +NPC id=7029, name=Peter, level=0, option=[null, null, null, null, null], anims=[8671, 8670]. +NPC id=7030, name=Peanut, level=0, option=[null, null, null, null, null], anims=[8671, 8670]. +NPC id=7031, name=Wimpy bird, level=0, option=[null, null, null, null, hidden], anims=[6771, 6773]. +NPC (wrapper) id=7032, child npcs=[7031, 7083, -1]. +NPC (wrapper) id=7033, child npcs=[7031, 7083, -1]. +NPC (wrapper) id=7034, child npcs=[7031, 7083, -1]. +NPC (wrapper) id=7035, child npcs=[7031, 7083, -1]. +NPC (wrapper) id=7036, child npcs=[7031, 7083, -1]. +NPC id=7037, name=null, level=0, option=[null, null, null, null, hidden], anims=[-1, -1]. +NPC id=7038, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7039, name=Diseased kebbit, level=0, option=[null, null, null, null, Hidden], anims=[5273, 5272]. +NPC (wrapper) id=7040, child npcs=[7039, 7083, -1]. +NPC (wrapper) id=7041, child npcs=[7039, 7083, -1]. +NPC (wrapper) id=7042, child npcs=[7039, 7083, -1]. +NPC (wrapper) id=7043, child npcs=[7039, 7083, -1]. +NPC id=7044, name=Fishing spot, level=0, option=[Net, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=7045, name=Fishing spot, level=0, option=[Net, null, Bait, hidden, hidden], anims=[447, 448]. +NPC id=7046, name=Fishing spot, level=0, option=[Cage, null, Harpoon, hidden, hidden], anims=[447, 448]. +NPC id=7047, name=Balnea, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7048, name=Frawd, level=0, option=[Talk-to, null, Trade, null, null], anims=[8620, 8573]. +NPC id=7049, name=Ogress banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[8628, 8573]. +NPC id=7050, name=Ogress banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[8574, 8573]. +NPC id=7051, name=Chief Tess, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8573]. +NPC id=7052, name=Seegud, level=0, option=[Talk-to, null, null, null, null], anims=[8632, 8633]. +NPC id=7053, name=Chargurr, level=0, option=[Talk-to, null, null, null, null], anims=[8655, -1]. +NPC id=7054, name=Chargurr, level=0, option=[Talk-to, null, Trade, null, null], anims=[8650, -1]. +NPC (wrapper) id=7055, child npcs=[7053, -1]. +NPC id=7056, name=null, level=0, option=[Talk-to, null, null, null, null], anims=[8650, -1]. +NPC id=7057, name=Snurgh, level=0, option=[Talk-to, null, null, null, null], anims=[8630, 8631]. +NPC id=7058, name=Kringk, level=0, option=[Talk-to, null, null, null, null], anims=[8574, 8573]. +NPC id=7059, name=Thump, level=0, option=[Talk, null, null, null, null], anims=[8619, -1]. +NPC id=7060, name=Massage table, level=0, option=[null, null, null, null, null], anims=[8619, -1]. +NPC id=7061, name=Thump, level=0, option=[Talk-to, null, null, null, null], anims=[8574, 8573]. +NPC id=7062, name=Muggh, level=0, option=[Talk-to, null, null, null, null], anims=[8574, 8573]. +NPC id=7063, name=Kringk, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=7064, name=Hairdryer, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7065, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7066, name=null, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7067, name=Snert, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7068, name=Tyke, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7069, name=Snarrl, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7070, name=Snarrk, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7071, name=I'rk, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7072, name=Thuddley, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7073, name=Grr'bah, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7074, name=Chomp, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7075, name=Grubb, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7076, name=Grunther, level=0, option=[Talk-to, null, null, null, null], anims=[8627, 8626]. +NPC id=7077, name=Glum, level=0, option=[Talk-To, null, null, null, null], anims=[8627, 8626]. +NPC id=7078, name=Ogress champion, level=99, option=[null, Attack, null, null, null], anims=[8642, 8573]. +NPC id=7079, name=Ogress warrior, level=86, option=[null, Attack, null, null, null], anims=[8634, 8573]. +NPC id=7080, name=Ogress warrior, level=86, option=[null, Attack, null, null, null], anims=[8635, 8643]. +NPC id=7081, name=Ogress, level=69, option=[null, Attack, null, null, null], anims=[8634, 8573]. +NPC id=7082, name=Ogress, level=69, option=[null, Attack, null, null, null], anims=[8642, 8643]. +NPC id=7083, name=Flying bugs, level=0, option=[null, null, null, null, null], anims=[8667, 8667]. +NPC id=7084, name=Eucalyptus ent, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=7085, name=Eucalyptus ent, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=7086, name=Eucalyptus ent, level=0, option=[Chop down, null, hidden, null, null], anims=[5750, 5750]. +NPC id=7087, name=Balnea, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7088, name=Chief Tess, level=0, option=[null, null, null, null, null], anims=[8627, 8573]. +NPC id=7089, name=Chargurr, level=0, option=[null, null, null, null, null], anims=[8574, -1]. +NPC id=7090, name=Wise Old Man, level=0, option=[null, null, null, null, null], anims=[813, -1]. +NPC (wrapper) id=7091, child npcs=[7027, 7083, -1]. +NPC (wrapper) id=7092, child npcs=[7028, 7083, -1]. +NPC (wrapper) id=7093, child npcs=[7029, 7083, -1]. +NPC (wrapper) id=7094, child npcs=[7030, 7083, -1]. +NPC id=7095, name=null, level=0, option=[null, null, null, null, null], anims=[8671, 8672]. +NPC id=7096, name=null, level=0, option=[null, null, null, null, null], anims=[8671, 8672]. +NPC id=7097, name=null, level=0, option=[null, null, null, null, null], anims=[8671, 8672]. +NPC id=7098, name=null, level=0, option=[null, null, null, null, null], anims=[8671, 8672]. +NPC (wrapper) id=7099, child npcs=[7058, -1]. +NPC (wrapper) id=7100, child npcs=[7060, 7059, -1]. +NPC (wrapper) id=7101, child npcs=[7061, -1]. +NPC id=7102, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7103, name=null, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7104, name=Dawg, level=0, option=[Talk-to, null, null, null, null], anims=[5225, 5226]. +NPC id=7105, name=Chaos druid, level=13, option=[null, Attack, null, null, null], anims=[8528, 8527]. +NPC id=7106, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7107, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7108, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7109, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7110, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7111, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7112, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7113, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7114, name=Thug, level=10, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7115, name=Thaki the delivery dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[8706, -1]. +NPC id=7116, name=Drunken sailor, level=0, option=[Talk-to, null, null, null, null], anims=[8707, 2769]. +NPC id=7117, name=Drunken sailor, level=0, option=[Talk-to, null, Search, null, null], anims=[8707, -1]. +NPC id=7118, name=Catapult engineer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7119, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7120, name=Tyras guard, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7121, name=General Hining, level=0, option=[Talk-to, null, null, null, null], anims=[813, -1]. +NPC id=7122, name=Githan, level=0, option=[null, null, null, null, null], anims=[2906, 2907]. +NPC id=7123, name=Amulet of Nature, level=0, option=[null, null, null, null, null], anims=[2906, 2907]. +NPC id=7124, name=Mud, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7125, name=Rabbit, level=0, option=[null, null, Feed, null, null], anims=[8737, 6088]. +NPC id=7126, name=Rabbit, level=0, option=[null, null, Feed, null, null], anims=[8737, 6088]. +NPC id=7127, name=Rabbit, level=0, option=[null, null, Feed, null, null], anims=[8737, 6088]. +NPC id=7128, name=Farmer, level=0, option=[null, null, null, null, null], anims=[8726, 8723]. +NPC id=7129, name=Farmer, level=0, option=[null, null, null, null, null], anims=[8726, 8723]. +NPC id=7130, name=Farmer, level=0, option=[null, null, null, null, null], anims=[8728, 8723]. +NPC id=7131, name=Farmer Blinkin, level=0, option=[Talk-to, null, Buy-flags, Buy-roots, null], anims=[8721, 8722]. +NPC id=7132, name=Mrs. Winkin, level=0, option=[Talk-to, null, Trade, Buy flags, null], anims=[8720, 8719]. +NPC id=7133, name=Bork, level=267, option=[null, Attack, null, null, null], anims=[8753, 8752]. +NPC id=7134, name=Bork, level=267, option=[null, Attack, null, null, null], anims=[8753, 8752]. +NPC id=7135, name=Ork legion, level=70, option=[null, Attack, null, null, null], anims=[8763, 8764]. +NPC id=7136, name=Surok Magis, level=0, option=[Attack, null, null, null, null], anims=[808, -1]. +NPC id=7137, name=Dagon'hai Elite, level=0, option=[Attack, null, null, null, null], anims=[808, -1]. +NPC id=7138, name=Dagon'hai Monk, level=97, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7139, name=Dagon'hai Monk, level=97, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7140, name=Dagon'hai Monk, level=97, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7141, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7142, name=Guard, level=0, option=[Talk-to, null, null, null, null], anims=[8800, 7223]. +NPC id=7143, name=Professor Henry, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7144, name=Gublinch jailmate, level=0, option=[null, null, null, null, null], anims=[8771, -1]. +NPC id=7145, name=Gublinchette jailmate, level=0, option=[null, null, null, null, null], anims=[8772, -1]. +NPC id=7146, name=Gublinchette jailmate, level=0, option=[null, null, null, null, null], anims=[8773, -1]. +NPC id=7147, name=Gublinch jailmate, level=0, option=[null, null, null, null, null], anims=[8774, -1]. +NPC id=7148, name=Gublinch jailmate, level=0, option=[null, null, null, null, null], anims=[8775, -1]. +NPC id=7149, name=Gublinch jailmate, level=0, option=[null, null, null, null, null], anims=[8776, -1]. +NPC id=7150, name=Gublinch jailmate, level=0, option=[null, null, null, null, null], anims=[8777, -1]. +NPC id=7151, name=Student, level=0, option=[Talk-to, null, null, null, null], anims=[8778, -1]. +NPC id=7152, name=Student, level=0, option=[Talk-to, null, null, null, null], anims=[8779, -1]. +NPC id=7153, name=Student, level=0, option=[Talk-to, null, null, null, null], anims=[8780, -1]. +NPC id=7154, name=Student, level=0, option=[Talk-to, null, null, null, null], anims=[8781, -1]. +NPC id=7155, name=Student, level=0, option=[Talk-to, null, null, null, null], anims=[8782, -1]. +NPC id=7156, name=Student, level=0, option=[Talk-to, null, null, null, null], anims=[8783, -1]. +NPC id=7157, name=Student, level=0, option=[Talk-to, null, null, null, null], anims=[8784, -1]. +NPC id=7158, name=Cockroach drone, level=8, option=[null, Attack, null, null, null], anims=[8798, 8794]. +NPC id=7159, name=Cockroach worker, level=56, option=[null, Attack, null, null, null], anims=[8797, 8796]. +NPC id=7160, name=Cockroach soldier, level=83, option=[null, Attack, null, null, null], anims=[8797, 8795]. +NPC id=7161, name=Mugger, level=6, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7162, name=Mugger, level=6, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC (wrapper) id=7163, child npcs=[696, -1]. +NPC id=7164, name=Villager, level=0, option=[null, null, null, null, null], anims=[808, 4779]. +NPC id=7165, name=Villager, level=0, option=[null, null, null, null, null], anims=[8863, 8862]. +NPC id=7166, name=Villager, level=0, option=[null, null, null, null, null], anims=[8878, 8875]. +NPC id=7167, name=Villager, level=0, option=[null, null, null, null, null], anims=[8877, 8862]. +NPC id=7168, name=Kimberly, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7160]. +NPC id=7169, name=Kimberly, level=0, option=[Talk-to, null, null, null, null], anims=[7158, -1]. +NPC id=7170, name=Kimberly, level=0, option=[Talk-to, null, null, null, null], anims=[8816, -1]. +NPC id=7171, name=Kennith, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=7172, name=Kennith, level=0, option=[Talk-to, null, null, null, null], anims=[8807, 8808]. +NPC id=7173, name=Kennith, level=0, option=[null, null, null, null, null], anims=[8807, -1]. +NPC id=7174, name=Kennith, level=0, option=[Talk-to, null, null, null, null], anims=[8811, 8811]. +NPC id=7175, name=Kennith, level=0, option=[null, null, null, null, null], anims=[8852, -1]. +NPC id=7176, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7177, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7178, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7179, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7180, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7181, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7182, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7183, name=Villager, level=0, option=[Talk-to, null, null, null, null], anims=[808, 4779]. +NPC id=7184, name=Ezekial Lovecraft, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7185, name=Clive, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7186, name=Katherine, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7187, name=Katherine, level=0, option=[Talk-to, null, null, null, null], anims=[6935, -1]. +NPC id=7188, name=Clive, level=0, option=[Talk-to, null, null, null, null], anims=[6935, -1]. +NPC id=7189, name=Kent, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=7190, child npcs=[4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, 4856, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4856, -1]. +NPC (wrapper) id=7191, child npcs=[7168, -1, -1, -1, -1, 7168, -1, -1, -1, -1, 7168, -1, -1, -1, -1, 7168, -1, -1, -1, -1, 7168, -1, -1, -1, -1, 7168, -1, 7168, -1, -1, 7168, -1, -1, -1, -1, 7168, -1]. +NPC id=7192, name=null, level=1, option=[null, null, null, null, null], anims=[7158, 7160]. +NPC id=7193, name=null, level=1, option=[null, null, null, null, null], anims=[7158, 7160]. +NPC id=7194, name=null, level=1, option=[null, null, null, null, null], anims=[7158, 7160]. +NPC id=7195, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7196, name=Rabbit hole, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7197, name=Easter Bunny, level=0, option=[Talk-to, null, null, null, null], anims=[3852, 3851]. +NPC id=7198, name=Bunny, level=0, option=[Talk-to, null, null, null, null], anims=[1242, 1243]. +NPC id=7199, name=Bunny, level=0, option=[Talk-to, null, null, null, null], anims=[1242, 1243]. +NPC id=7200, name=Guard bunny, level=0, option=[Talk-to, null, null, null, null], anims=[1242, 1243]. +NPC id=7201, name=Chocatrice, level=0, option=[Interact, null, null, null, null], anims=[7760, 7759]. +NPC id=7202, name=Rat, level=0, option=[null, null, null, null, null], anims=[4932, 4931]. +NPC id=7203, name=Void Knight, level=0, option=[null, hidden, null, null, null], anims=[3926, -1]. +NPC id=7204, name=Rat, level=0, option=[null, null, null, null, null], anims=[4932, 4931]. +NPC id=7205, name=Mouse, level=0, option=[null, null, null, null, null], anims=[6518, 6517]. +NPC id=7206, name=Cockroach, level=0, option=[null, null, null, null, null], anims=[8798, 8794]. +NPC id=7207, name=Spider, level=0, option=[null, null, null, null, null], anims=[5326, 5325]. +NPC id=7208, name=Rabbit, level=0, option=[null, null, null, null, null], anims=[3872, 3871]. +NPC id=7209, name=Snail, level=0, option=[null, null, null, null, null], anims=[8146, 8145]. +NPC id=7210, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=7211, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=7212, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=7213, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=7214, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=7215, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=7216, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=7217, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=7218, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=7219, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=7220, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=7221, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=7222, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=7223, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=7224, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=7225, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=7226, name=Baby monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8346, 8348]. +NPC id=7227, name=Monkey, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8344, 8343]. +NPC id=7228, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=7229, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=7230, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=7231, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=7232, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=7233, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=7234, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=7235, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=7236, name=Baby monkey, level=0, option=[null, null, null, null, null], anims=[8346, 8348]. +NPC id=7237, name=Terrier puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8336]. +NPC id=7238, name=Terrier, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8337]. +NPC id=7239, name=Terrier puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8336]. +NPC id=7240, name=Terrier, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8337]. +NPC id=7241, name=Greyhound puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8332]. +NPC id=7242, name=Greyhound, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8333]. +NPC id=7243, name=Greyhound puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8332]. +NPC id=7244, name=Greyhound, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8333]. +NPC id=7245, name=Labrador puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8334]. +NPC id=7246, name=Labrador, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8335]. +NPC id=7247, name=Labrador puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8334]. +NPC id=7248, name=Labrador, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8335]. +NPC id=7249, name=Dalmatian puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8330]. +NPC id=7250, name=Dalmatian, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8331]. +NPC id=7251, name=Dalmatian puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8330]. +NPC id=7252, name=Dalmatian, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8331]. +NPC id=7253, name=Sheepdog puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8334]. +NPC id=7254, name=Sheepdog, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8335]. +NPC id=7255, name=Sheepdog puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8334]. +NPC id=7256, name=Sheepdog, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8335]. +NPC id=7257, name=Bulldog, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 7576]. +NPC id=7258, name=Bulldog, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 7576]. +NPC id=7259, name=Bulldog puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8338, 8329]. +NPC id=7260, name=Bulldog puppy, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8339, 8329]. +NPC id=7261, name=Raven chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7262, name=Raven, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=7263, name=Raven chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7264, name=Raven, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=7265, name=Raven chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7266, name=Raven, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=7267, name=Raven chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7268, name=Raven, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=7269, name=Raven chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7270, name=Raven, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8008, 8007]. +NPC id=7271, name=Baby raccoon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7718, 7719]. +NPC id=7272, name=Raccoon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7718, 7719]. +NPC id=7273, name=Baby raccoon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7718, 7719]. +NPC id=7274, name=Raccoon, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7718, 7719]. +NPC id=7275, name=Baby Raccoon, level=0, option=[null, null, null, null, null], anims=[7718, 7719]. +NPC id=7276, name=Baby raccoon, level=0, option=[null, null, null, null, null], anims=[7718, 7719]. +NPC id=7277, name=Baby gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8358]. +NPC id=7278, name=Baby gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8358]. +NPC id=7279, name=Baby gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8358]. +NPC id=7280, name=Baby gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8358]. +NPC id=7281, name=Gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8357]. +NPC id=7282, name=Gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8357]. +NPC id=7283, name=Gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8357]. +NPC id=7284, name=Gecko, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8360, 8357]. +NPC id=7285, name=Baby gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8358]. +NPC id=7286, name=Baby gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8358]. +NPC id=7287, name=Baby gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8358]. +NPC id=7288, name=Baby gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8358]. +NPC id=7289, name=Gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8357]. +NPC id=7290, name=Gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8357]. +NPC id=7291, name=Gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8357]. +NPC id=7292, name=Gecko, level=0, option=[null, null, null, null, null], anims=[8360, 8357]. +NPC id=7293, name=Baby giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=7294, name=Giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=7295, name=Baby giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=7296, name=Giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=7297, name=Baby giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=7298, name=Giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=7299, name=Baby giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=7300, name=Giant crab, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8098, 8101]. +NPC id=7301, name=Baby squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=7302, name=Squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=7303, name=Baby squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=7304, name=Squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=7305, name=Baby squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=7306, name=Squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=7307, name=Baby squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=7308, name=Squirrel, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8324, 8326]. +NPC id=7309, name=Baby squirrel, level=0, option=[null, null, null, null, null], anims=[8324, 8326]. +NPC id=7310, name=Baby squirrel, level=0, option=[null, null, null, null, null], anims=[8324, 8326]. +NPC id=7311, name=Baby squirrel, level=0, option=[null, null, null, null, null], anims=[8324, 8326]. +NPC id=7312, name=Baby squirrel, level=0, option=[null, null, null, null, null], anims=[8324, 8326]. +NPC id=7313, name=Baby penguin, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8319, 8318]. +NPC id=7314, name=Penguin, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8315, 8314]. +NPC id=7315, name=Penguin, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8315, 8317]. +NPC id=7316, name=Baby penguin, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8319, 8318]. +NPC id=7317, name=Penguin, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8315, 8314]. +NPC id=7318, name=Penguin, level=0, option=[Pick-up, null, null, Talk-to, null], anims=[8315, 8317]. +NPC id=7319, name=Vulture chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7320, name=Vulture, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7659, 7658]. +NPC id=7321, name=Vulture chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7322, name=Vulture, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7659, 7658]. +NPC id=7323, name=Vulture chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7324, name=Vulture, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7659, 7658]. +NPC id=7325, name=Vulture chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7326, name=Vulture, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7659, 7658]. +NPC id=7327, name=Vulture chick, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[8310, 8312]. +NPC id=7328, name=Vulture, level=0, option=[Pick-up, null, Talk-to, null, null], anims=[7659, 7658]. +NPC id=7329, name=Swamp titan, level=0, option=[Interact, null, null, null, null], anims=[8220, 8219]. +NPC id=7330, name=Swamp titan, level=152, option=[Interact, Attack, null, null, null], anims=[8220, 8219]. +NPC id=7331, name=Spirit mosquito, level=0, option=[Interact, null, null, null, null], anims=[8035, 8038]. +NPC id=7332, name=Spirit mosquito, level=32, option=[Interact, Attack, null, null, null], anims=[8035, 8038]. +NPC id=7333, name=Void spinner, level=0, option=[Interact, null, null, null, null], anims=[8171, 8175]. +NPC id=7334, name=Void spinner, level=40, option=[Interact, Attack, null, null, null], anims=[8171, 8175]. +NPC id=7335, name=Forge regent, level=0, option=[Interact, null, null, null, Fireball], anims=[7867, 7868]. +NPC id=7336, name=Forge regent, level=133, option=[Interact, Attack, null, null, Fireball], anims=[7867, 7868]. +NPC id=7337, name=Spirit larupia, level=0, option=[Interact, null, null, null, null], anims=[5225, 5226]. +NPC id=7338, name=Spirit larupia, level=93, option=[Interact, Attack, null, null, null], anims=[5225, 5226]. +NPC id=7339, name=Geyser titan, level=0, option=[Interact, null, null, null, null], anims=[7876, 7877]. +NPC id=7340, name=Geyser titan, level=200, option=[Interact, Attack, null, null, null], anims=[7876, 7877]. +NPC id=7341, name=Lava titan, level=0, option=[Interact, null, null, null, null], anims=[7978, 7977]. +NPC id=7342, name=Lava titan, level=148, option=[Interact, Attack, null, null, null], anims=[7978, 7977]. +NPC id=7343, name=Steel titan, level=0, option=[Interact, null, null, null, null], anims=[8186, 8189]. +NPC id=7344, name=Steel titan, level=230, option=[Interact, Attack, null, null, null], anims=[8186, 8189]. +NPC id=7345, name=Obsidian golem, level=0, option=[Interact, null, null, null, null], anims=[8047, 8046]. +NPC id=7346, name=Obsidian golem, level=126, option=[Interact, Attack, null, null, null], anims=[8047, 8046]. +NPC id=7347, name=Talon beast, level=0, option=[Interact, null, null, null, null], anims=[5986, 5987]. +NPC id=7348, name=Talon beast, level=135, option=[Interact, Attack, null, null, null], anims=[5986, 5987]. +NPC id=7349, name=Abyssal titan, level=0, option=[Interact, null, Store, null, null], anims=[7690, 7687]. +NPC id=7350, name=Abyssal titan, level=215, option=[Interact, Attack, Store, null, null], anims=[7690, 7687]. +NPC id=7351, name=Void torcher, level=0, option=[Interact, null, null, null, Strike], anims=[8233, 8234]. +NPC id=7352, name=Void torcher, level=46, option=[Interact, Attack, null, null, Strike], anims=[8233, 8234]. +NPC id=7353, name=Giant chinchompa, level=0, option=[Interact, null, null, null, null], anims=[7751, 7750]. +NPC id=7354, name=Giant chinchompa, level=42, option=[Interact, Attack, null, null, null], anims=[7751, 7750]. +NPC id=7355, name=Fire titan, level=0, option=[Interact, null, null, null, null], anims=[7831, 7828]. +NPC id=7356, name=Fire titan, level=139, option=[Interact, Attack, null, null, null], anims=[7831, 7828]. +NPC id=7357, name=Moss titan, level=0, option=[Interact, null, null, null, null], anims=[7841, 7838]. +NPC id=7358, name=Moss titan, level=139, option=[Interact, Attack, null, null, null], anims=[7841, 7838]. +NPC id=7359, name=Ice titan, level=0, option=[Interact, null, null, null, null], anims=[8186, 7847]. +NPC id=7360, name=Ice titan, level=139, option=[Interact, Attack, null, null, null], anims=[8186, 7847]. +NPC id=7361, name=Spirit Tz-Kih, level=0, option=[Interact, null, null, null, Despair], anims=[8255, 8256]. +NPC id=7362, name=Spirit Tz-Kih, level=36, option=[Interact, Attack, null, null, Despair], anims=[8255, 8256]. +NPC id=7363, name=Spirit graahk, level=0, option=[Interact, null, null, null, null], anims=[5225, 5226]. +NPC id=7364, name=Spirit graahk, level=93, option=[Interact, Attack, null, null, null], anims=[5225, 5226]. +NPC id=7365, name=Spirit kyatt, level=0, option=[Interact, null, null, null, null], anims=[5225, 5226]. +NPC id=7366, name=Spirit kyatt, level=93, option=[Interact, Attack, null, null, null], anims=[5225, 5226]. +NPC id=7367, name=Void shifter, level=0, option=[Interact, null, null, null, null], anims=[8129, 8128]. +NPC id=7368, name=Void shifter, level=46, option=[Interact, Attack, null, null, null], anims=[8129, 8128]. +NPC id=7369, name=Void shifter, level=47, option=[Interact, null, null, null, null], anims=[8129, 8128]. +NPC id=7370, name=Void ravager, level=0, option=[Interact, null, Withdraw, null, null], anims=[8089, 8092]. +NPC id=7371, name=Void ravager, level=46, option=[Interact, Attack, Withdraw, null, null], anims=[8089, 8092]. +NPC id=7372, name=Ravenous locust, level=0, option=[Interact, null, null, null, null], anims=[7992, 7991]. +NPC id=7373, name=Ravenous locust, level=120, option=[Interact, Attack, null, null, null], anims=[7992, 7991]. +NPC id=7374, name=Ravenous locust, level=0, option=[null, null, null, null, null], anims=[8001, -1]. +NPC id=7375, name=Iron titan, level=0, option=[Interact, null, null, null, null], anims=[7949, 7952]. +NPC id=7376, name=Iron titan, level=220, option=[Interact, Attack, null, null, null], anims=[7949, 7952]. +NPC id=7377, name=Pyrelord, level=0, option=[Interact, null, null, null, null], anims=[8077, 8076]. +NPC id=7378, name=Pyrelord, level=70, option=[Interact, Attack, null, null, null], anims=[8077, 8076]. +NPC id=7379, name=Elfinlocks, level=93, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7380, name=Missi Sissi, level=98, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7381, name=Missi Sissi, level=98, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7382, name=Uberlass, level=103, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7383, name=Uberlass, level=103, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7384, name=Uberlass, level=103, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7385, name=Uberlass, level=103, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7386, name=Uberlass, level=103, option=[null, null, Walk here, Follow, Trade], anims=[8980, -1]. +NPC id=7387, name=Sannytea, level=108, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7388, name=Sannytea, level=108, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7389, name=Irollsixes, level=113, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7390, name=Irollsixes, level=113, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7391, name=Foxyhunter, level=118, option=[null, null, Walk here, Follow, Trade], anims=[4591, -1]. +NPC id=7392, name=Foxyhunter, level=118, option=[null, null, Walk here, Follow, Trade], anims=[4591, -1]. +NPC id=7393, name=Foxyhunter, level=118, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7394, name=Gabriela, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7395, name=Teodor, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7396, name=Aurel, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=7397, name=Cornelius, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7398, name=Elisabeta, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7399, name=Sorin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7400, name=Luscion, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7401, name=Sergiu, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7402, name=Radu, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7403, name=Grigore, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7404, name=Ileana, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7405, name=Valeria, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7406, name=Emilia, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7407, name=Florin, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7408, name=Catalina, level=0, option=[Talk-to, null, null, null, null], anims=[7167, 7160]. +NPC id=7409, name=Ivan, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=7410, name=Victor, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=7411, name=Helena, level=0, option=[Talk-to, null, null, null, null], anims=[7158, 7160]. +NPC id=7412, name=Mihail, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=7413, name=Nicoleta, level=0, option=[Talk-to, null, null, null, null], anims=[1144, -1]. +NPC id=7414, name=Vasile, level=0, option=[Talk-to, null, null, null, null], anims=[3557, -1]. +NPC id=7415, name=Razvan, level=0, option=[Talk-to, null, null, null, null], anims=[3557, -1]. +NPC id=7416, name=Luminata, level=0, option=[Talk-to, null, null, null, null], anims=[3557, -1]. +NPC id=7417, name=Rat, level=1, option=[Attack, null, null, null, null], anims=[2704, 2703]. +NPC id=7418, name=Juvinate, level=119, option=[Attack, null, null, null, null], anims=[808, -1]. +NPC id=7419, name=Held vampyre juvinate, level=119, option=[Attack, null, null, null, null], anims=[3551, -1]. +NPC id=7420, name=Hieronymus Avlafrim, level=0, option=[Talk-to, null, Trade, null, null], anims=[8977, -1]. +NPC id=7421, name=Sasquine Huburns, level=0, option=[Talk-to, null, null, null, null], anims=[8978, -1]. +NPC id=7422, name=Sasquine Huburns, level=0, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7423, name=Lollery, level=82, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7424, name=Wigglewoo, level=130, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7425, name=Wigglewoo, level=130, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7426, name=Orangeowns, level=72, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7427, name=Orangeowns, level=72, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7428, name=I like m0m, level=95, option=[null, null, Walk here, Follow, Trade], anims=[7047, -1]. +NPC id=7429, name=I like m0m, level=95, option=[null, null, Walk here, Follow, Trade], anims=[7047, -1]. +NPC id=7430, name=Qutiedoll, level=99, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7431, name=Goreu, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=7432, name=Ysgawyn, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=7433, name=Arvel, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=7434, name=Mawrth, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=7435, name=Kelyn, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[808, -1]. +NPC id=7436, name=Eoin, level=0, option=[Talk-to, null, null, null, null], anims=[808, 824]. +NPC id=7437, name=Iona, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7438, name=Elf warrior, level=108, option=[Attack, null, null, null, null], anims=[808, -1]. +NPC id=7439, name=Elf warrior, level=108, option=[Attack, null, null, null, null], anims=[808, -1]. +NPC id=7440, name=Elf warrior, level=90, option=[Attack, null, null, null, null], anims=[808, -1]. +NPC id=7441, name=Elf warrior, level=90, option=[Attack, null, null, null, null], anims=[808, -1]. +NPC id=7442, name=Arianwyn, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7443, name=Eudav, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=7444, name=Oronwen, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=7445, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=7446, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[808, 808]. +NPC id=7447, name=Dalldav, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=7448, name=Gethin, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=7449, name=Amaethwr, level=0, option=[Talk-to, null, Pay, null, null], anims=[808, -1]. +NPC id=7450, name=Teclyn, level=0, option=[Talk-to, null, Exchange, Teleport, null], anims=[808, -1]. +NPC id=7451, name=Butterfly, level=0, option=[null, null, null, null, null], anims=[362, 362]. +NPC id=7452, name=Lapsang, level=130, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7453, name=Lapsang, level=130, option=[null, null, Walk here, Follow, Trade], anims=[8943, 8943]. +NPC id=7454, name=Souchong, level=105, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7455, name=Souchong, level=105, option=[null, null, Walk here, Follow, Trade], anims=[8944, 8944]. +NPC id=7456, name=Earlgrey, level=87, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7457, name=Earlgrey, level=87, option=[null, null, Walk here, Follow, Trade], anims=[8943, 8943]. +NPC id=7458, name=Fairtrade, level=93, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7459, name=Fairtrade, level=93, option=[null, null, Walk here, Follow, Trade], anims=[8944, 8944]. +NPC id=7460, name=Teapotspout, level=94, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7461, name=Rat, level=0, option=[null, null, null, null, null], anims=[4932, 4931]. +NPC id=7462, name=Hotwater, level=81, option=[null, null, Walk here, Follow, Trade], anims=[809, -1]. +NPC id=7463, name=Hotwater, level=81, option=[null, null, Walk here, Follow, Trade], anims=[8944, 8944]. +NPC id=7464, name=Sliceoflemon, level=124, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7465, name=Sliceoflemon, level=124, option=[null, null, Walk here, Follow, Trade], anims=[8943, 8943]. +NPC id=7466, name=Milknosugar, level=127, option=[null, null, Walk here, Follow, Trade], anims=[4591, -1]. +NPC id=7467, name=Milknosugar, level=127, option=[null, null, Walk here, Follow, Trade], anims=[8944, 8944]. +NPC id=7468, name=Randomdood, level=86, option=[null, null, Walk here, Follow, Trade], anims=[8945, -1]. +NPC id=7469, name=Employedman, level=91, option=[null, null, Walk here, Follow, Trade], anims=[8946, -1]. +NPC id=7470, name=Heidiggle, level=98, option=[null, null, Walk here, Follow, Trade], anims=[8954, -1]. +NPC id=7471, name=Dodgy Penny, level=102, option=[null, null, Walk here, Follow, Trade], anims=[8948, -1]. +NPC id=7472, name=Shadydude98, level=98, option=[null, null, Walk here, Follow, Trade], anims=[8949, -1]. +NPC id=7473, name=Madam C, level=73, option=[null, null, Walk here, Follow, Trade], anims=[8952, -1]. +NPC id=7474, name=M0m Online, level=69, option=[null, null, Walk here, Follow, Trade], anims=[8951, -1]. +NPC id=7475, name=Lady Seenit, level=138, option=[null, null, Walk here, Follow, Trade], anims=[8950, -1]. +NPC id=7476, name=Berrybree, level=68, option=[null, null, Walk here, Follow, Trade], anims=[8953, -1]. +NPC id=7477, name=Stuffstuffer, level=69, option=[null, null, Walk here, Follow, Trade], anims=[8947, -1]. +NPC (wrapper) id=7478, child npcs=[6174, 6174, 6388, -1]. +NPC id=7479, name=Learking, level=83, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7480, name=Rachael, level=0, option=[Talk-to, null, Trade, null, null], anims=[808, -1]. +NPC id=7481, name=Cool Mom227, level=83, option=[null, null, Walk here, Follow, Trade], anims=[6604, -1]. +NPC id=7482, name=Purepker895, level=52, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7483, name=Pkmaster0036, level=87, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7484, name=Cow1337killr, level=123, option=[null, null, Walk here, Follow, Trade], anims=[2065, 2064]. +NPC id=7485, name=Mathdude, level=93, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7486, name=Mathdude, level=93, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7487, name=1337sp34kr, level=63, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7488, name=1337sp34kr, level=63, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7489, name=Moglewee, level=103, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7490, name=Moglewee, level=103, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7491, name=Sarah Domin, level=76, option=[null, null, Walk here, Follow, Trade], anims=[5254, -1]. +NPC id=7492, name=Sarah Domin, level=76, option=[null, null, Walk here, Follow, Trade], anims=[5254, -1]. +NPC id=7493, name=Sarah Domin, level=76, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7494, name=Sue Spammers, level=112, option=[null, null, Walk here, Follow, Trade], anims=[1461, -1]. +NPC id=7495, name=Killerwail, level=86, option=[null, null, Walk here, Follow, Trade], anims=[1461, -1]. +NPC id=7496, name=Wise Old Man, level=0, option=[null, null, null, null, null], anims=[1461, -1]. +NPC id=7497, name=Sabre-toothed kyatt, level=60, option=[null, null, null, null, null], anims=[5225, 5226]. +NPC id=7498, name=Snowy knight, level=0, option=[Catch, null, null, null, null], anims=[362, 362]. +NPC id=7499, name=Sapphire glacialis, level=0, option=[Catch, null, null, null, null], anims=[362, 362]. +NPC id=7500, name=Cerulean twitch, level=0, option=[null, null, null, null, null], anims=[6771, 6773]. +NPC id=7501, name=Abone, level=74, option=[null, null, Walk here, Follow, Trade], anims=[4591, 4228]. +NPC id=7502, name=Mythmaster, level=87, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7503, name=Donkey Wrong, level=93, option=[null, null, Walk here, Follow, Trade], anims=[8980, -1]. +NPC id=7504, name=Creapantic, level=101, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7505, name=Frondlike, level=103, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7506, name=Happy Spud, level=112, option=[null, null, Walk here, Follow, Trade], anims=[4591, 4228]. +NPC id=7507, name=Nobodyhere, level=82, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7508, name=Bluehairlass, level=85, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7509, name=Evil Wibbler, level=69, option=[null, null, Walk here, Follow, Trade], anims=[4591, 4228]. +NPC id=7510, name=Ilikekebabs, level=76, option=[null, null, Walk here, Follow, Trade], anims=[4591, 4228]. +NPC id=7511, name=Trunka Lex, level=86, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7512, name=Val Razz, level=72, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7513, name=Abstractclas, level=72, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7514, name=Bigbluebox, level=93, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7515, name=Funorbrox, level=126, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7516, name=Heresjohnny, level=118, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7517, name=Mogglewump, level=105, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7518, name=Morrisnorris, level=83, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7519, name=Matt Blitzer, level=138, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7520, name=Ketchuppl0x, level=108, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7521, name=Renderorder, level=61, option=[null, null, Walk here, Follow, Trade], anims=[1662, -1]. +NPC id=7522, name=Boolean, level=101, option=[null, null, Walk here, Follow, Trade], anims=[7047, -1]. +NPC id=7523, name=Stress Diva, level=79, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7524, name=Treadsoftly, level=106, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7525, name=Helphelphelp, level=76, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7526, name=Doorbellpl0x, level=52, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7527, name=Fixmydoorup, level=91, option=[null, null, Walk here, Follow, Trade], anims=[2065, -1]. +NPC id=7528, name=Redheadmonky, level=81, option=[null, null, Walk here, Follow, Trade], anims=[809, -1]. +NPC id=7529, name=Wallscaler, level=62, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7530, name=2scompany, level=76, option=[null, null, Walk here, Follow, Trade], anims=[1421, -1]. +NPC id=7531, name=2scompany, level=76, option=[null, null, Walk here, Follow, Trade], anims=[809, -1]. +NPC id=7532, name=3sacrowd, level=103, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7533, name=4sjustsilly, level=103, option=[null, null, Walk here, Follow, Trade], anims=[8980, 1210]. +NPC id=7534, name=Roadblocked, level=68, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7535, name=Barricade, level=0, option=[null, Attack, null, null, null], anims=[-1, -1]. +NPC id=7536, name=Barricade, level=0, option=[null, Attack, null, null, null], anims=[475, -1]. +NPC id=7537, name=Yoinker, level=81, option=[null, null, Walk here, Follow, Trade], anims=[1421, -1]. +NPC id=7538, name=Yoinker, level=81, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7539, name=Stopthief, level=76, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7540, name=Stopthief, level=76, option=[null, null, Walk here, Follow, Trade], anims=[1421, -1]. +NPC id=7541, name=Knickknack, level=87, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7542, name=Paddywhack, level=63, option=[null, null, Walk here, Follow, Trade], anims=[7047, -1]. +NPC id=7543, name=Giveadog, level=81, option=[null, null, Walk here, Follow, Trade], anims=[5869, 5868]. +NPC id=7544, name=Spacebadgers, level=53, option=[null, null, Walk here, Follow, Trade], anims=[7047, -1]. +NPC id=7545, name=Freakypeaky, level=31, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7546, name=Rollinghome, level=112, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7547, name=Nullpointer, level=61, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7548, name=Badgerfreak, level=118, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7549, name=Windstrike32, level=91, option=[null, null, Walk here, Follow, Trade], anims=[809, -1]. +NPC id=7550, name=Void Knight, level=0, option=[null, null, null, null, null], anims=[3926, -1]. +NPC id=7551, name=Portal, level=0, option=[Attack, null, null, null, null], anims=[3933, 3933]. +NPC id=7552, name=Portal, level=0, option=[Attack, null, null, null, null], anims=[3936, 3936]. +NPC id=7553, name=Portal, level=0, option=[Attack, null, null, null, null], anims=[3928, 3928]. +NPC id=7554, name=Portal, level=0, option=[Attack, null, null, null, null], anims=[3928, 3928]. +NPC id=7555, name=Portal, level=0, option=[null, null, null, null, null], anims=[6879, 6879]. +NPC id=7556, name=Portal, level=0, option=[null, null, null, null, null], anims=[6880, 6880]. +NPC id=7557, name=Portal, level=0, option=[null, null, null, null, null], anims=[6878, 6878]. +NPC id=7558, name=Portal, level=0, option=[null, null, null, null, null], anims=[6878, 6878]. +NPC id=7559, name=Brawler, level=158, option=[Attack, null, null, null, null], anims=[3893, 3892]. +NPC id=7560, name=Lostme, level=130, option=[null, null, Walk here, Follow, Trade], anims=[7047, -1]. +NPC id=7561, name=Chiercat, level=113, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7562, name=Skydischarge, level=127, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7563, name=Agplus, level=107, option=[null, null, Walk here, Follow, Trade], anims=[8980, -1]. +NPC id=7564, name=Distantthin, level=89, option=[null, null, Walk here, Follow, Trade], anims=[2065, -1]. +NPC id=7565, name=Allmarshes, level=98, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7566, name=Explosive67, level=100, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7567, name=Wraithboss, level=102, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7568, name=What Goudron, level=107, option=[null, null, Walk here, Follow, Trade], anims=[8980, -1]. +NPC id=7569, name=Alpha1beta, level=111, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7570, name=Solltalk, level=122, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7571, name=Hm Val, level=126, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7572, name=Wizzydumped, level=130, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7573, name=Oddskater, level=129, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7574, name=Lvzyoda, level=117, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7575, name=Airstriker, level=107, option=[null, null, Walk here, Follow, Trade], anims=[4591, -1]. +NPC id=7576, name=Droepedoff, level=88, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7577, name=Plzpudding, level=125, option=[null, null, Walk here, Follow, Trade], anims=[808, 1661]. +NPC id=7578, name=Assassin10, level=115, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7579, name=Steallake, level=113, option=[null, null, Walk here, Follow, Trade], anims=[808, -1]. +NPC id=7580, name=Poledragon, level=114, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7581, name=Deepkiwi, level=115, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7582, name=Al Truism, level=116, option=[null, null, Walk here, Follow, Trade], anims=[808, 824]. +NPC id=7583, name=Ohhhhdude, level=117, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7584, name=Bigface Oz, level=118, option=[null, null, Walk here, Follow, Trade], anims=[813, -1]. +NPC id=7585, name=Torcher, level=79, option=[Attack, null, null, null, null], anims=[3878, 3879]. +NPC id=7586, name=Torcher, level=79, option=[Attack, null, null, null, null], anims=[3878, 3879]. +NPC id=7587, name=Torcher, level=91, option=[Attack, null, null, null, null], anims=[3878, 3879]. +NPC id=7588, name=Torcher, level=92, option=[Attack, null, null, null, null], anims=[3878, 3879]. +NPC id=7589, name=Defiler, level=97, option=[Attack, null, null, null, null], anims=[3918, 3919]. +NPC id=7590, name=Defiler, level=97, option=[Attack, null, null, null, null], anims=[3918, 3919]. +NPC id=7591, name=Shifter, level=90, option=[Attack, null, null, null, null], anims=[3899, 3898]. +NPC id=7592, name=Shifter, level=90, option=[Attack, null, null, null, null], anims=[3899, 3898]. +NPC id=7593, name=Shifter, level=104, option=[Attack, null, null, null, null], anims=[3899, 3898]. +NPC id=7594, name=Shifter, level=104, option=[Attack, null, null, null, null], anims=[3899, 3898]. +NPC id=7595, name=Splatter, level=44, option=[Attack, null, null, null, null], anims=[3886, 3887]. +NPC id=7596, name=Splatter, level=54, option=[Attack, null, null, null, null], anims=[3886, 3887]. +NPC id=7597, name=Splatter, level=65, option=[Attack, null, null, null, null], anims=[3886, 3887]. +NPC id=7598, name=Spinner, level=74, option=[Attack, null, null, null, null], anims=[3906, 3907]. +NPC id=7599, name=Ravager, level=106, option=[Attack, null, null, null, null], anims=[3913, 3914]. +NPC id=7600, name=Fiara, level=0, option=[Talk-to, null, null, null, null], anims=[9009, -1]. +NPC id=7601, name=Reggie, level=0, option=[Talk-to, null, Trade, null, null], anims=[8528, 8527]. +NPC id=7602, name=Getorix, level=0, option=[Talk-to, null, null, null, null], anims=[8528, 8527]. +NPC id=7603, name=Pontimer, level=0, option=[Talk-to, null, null, null, null], anims=[8528, 8527]. +NPC id=7604, name=Alran, level=0, option=[Talk-to, null, null, null, null], anims=[8528, 8527]. +NPC id=7605, name=Banker, level=0, option=[Talk-to, null, Bank, Collect, null], anims=[5607, 5606]. +NPC id=7606, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[9118, -1]. +NPC id=7607, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[9118, -1]. +NPC id=7608, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[9118, -1]. +NPC id=7609, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[9118, -1]. +NPC id=7610, name=Flying female vampire, level=110, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7611, name=Flying female vampire, level=120, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7612, name=Flying female vampire, level=130, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7613, name=Flying female vampire, level=140, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7614, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7615, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7616, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7617, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7618, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[9118, -1]. +NPC id=7619, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[9118, -1]. +NPC id=7620, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[9118, -1]. +NPC id=7621, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[9118, -1]. +NPC id=7622, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7623, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7624, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7625, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7626, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7627, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7628, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7629, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7630, name=Vyrewatch, level=85, option=[null, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7631, name=Vyrewatch, level=110, option=[null, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7632, name=Vyrewatch, level=130, option=[null, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7633, name=Vyrewatch, level=85, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7634, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7635, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7636, name=Fishing spot, level=0, option=[null, null, Bait, null, hidden], anims=[2126, 2126]. +NPC id=7637, name=null, level=1, option=[null, null, null, null, null], anims=[9093, 9094]. +NPC id=7638, name=null, level=1, option=[null, null, null, null, null], anims=[9037, 9037]. +NPC id=7639, name=null, level=1, option=[null, null, null, null, null], anims=[9093, 9094]. +NPC id=7640, name=Skeletal hand, level=80, option=[null, Attack, null, null, null], anims=[9128, 9129]. +NPC id=7641, name=Zombie hand, level=90, option=[null, Attack, null, null, null], anims=[9128, 9129]. +NPC id=7642, name=Mutated bloodveld, level=126, option=[null, Attack, null, null, null], anims=[9133, -1]. +NPC id=7643, name=Mutated bloodveld, level=146, option=[null, Attack, null, null, null], anims=[9133, -1]. +NPC id=7644, name=Zaromark Sliver, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7645, name=Zaromark Sliver, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7646, name=Zaromark Sliver, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7647, name=Zaromark Sliver, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7648, name=Zaromark Sliver, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7649, name=Zaromark Sliver, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7650, name=Zaromark Sliver, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7651, name=Zaromark Sliver, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7652, name=Zaromark Sliver, level=0, option=[null, null, null, null, null], anims=[9099, -1]. +NPC id=7653, name=Zaromark Sliver, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7654, name=Fistandantilus, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7655, name=Fistandantilus, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7656, name=Fistandantilus, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7657, name=Fistandantilus, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7658, name=Fistandantilus, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7659, name=Fistandantilus, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7660, name=Fistandantilus, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7661, name=Fistandantilus, level=80, option=[null, Attack, null, null, null], anims=[808, -1]. +NPC id=7662, name=Fistandantilus, level=0, option=[null, null, null, null, null], anims=[9099, -1]. +NPC id=7663, name=Fistandantilus, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7664, name=Mercenary Adventurer, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7665, name=Ivan Strom, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7666, name=Mysterious person, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7667, name=Mysterious person, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7668, name=Mysterious person, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7669, name=Mysterious person, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7670, name=Mysterious person, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7671, name=Mysterious person, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7672, name=Flaygian Screwte, level=0, option=[Talk-to, null, null, null, null], anims=[-1, -1]. +NPC id=7673, name=Mekritus A'hara, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7674, name=Andiess Juip, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7675, name=Kael Forshaw, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7676, name=Andiess Juip, level=0, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=7677, name=Kael Forshaw, level=0, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=7678, name=Safalaan, level=0, option=[Talk-to, Hidden, null, null, null], anims=[808, -1]. +NPC id=7679, name=Andiess Juip, level=0, option=[null, Hidden, null, null, null], anims=[808, -1]. +NPC id=7680, name=Kael Forshaw, level=0, option=[null, Hidden, null, null, null], anims=[808, -1]. +NPC id=7681, name=Safalaan, level=0, option=[null, Hidden, null, null, null], anims=[808, -1]. +NPC id=7682, name=Vyrewatch, level=120, option=[null, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7683, name=Vyrewatch, level=120, option=[null, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7684, name=Vyrewatch, level=1, option=[null, null, null, null, null], anims=[9115, 9114]. +NPC id=7685, name=Vyrewatch, level=1, option=[null, null, null, null, null], anims=[9115, 9114]. +NPC id=7686, name=Safalaan, level=41, option=[Talk-to, hidden, null, null, null], anims=[9069, -1]. +NPC id=7687, name=Spectral Vyrewatch, level=0, option=[null, null, null, null, null], anims=[9028, 9028]. +NPC id=7688, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7689, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7690, name=Drezel, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7691, name=Vyrewatch, level=110, option=[null, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7692, name=Vyrewatch, level=120, option=[null, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7693, name=Vyrewatch, level=130, option=[null, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7694, name=Vyrewatch, level=130, option=[null, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7695, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7696, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7697, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7698, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7699, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7700, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7701, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7702, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[4689, 4683]. +NPC id=7703, name=Vyrewatch, level=110, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7704, name=Vyrewatch, level=120, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7705, name=Vyrewatch, level=130, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7706, name=Vyrewatch, level=140, option=[Talk-to, Attack, null, null, null], anims=[9117, -1]. +NPC id=7707, name=Drezel, level=0, option=[Talk-to, null, null, null, null], anims=[808, -1]. +NPC id=7708, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7709, name=null, level=1, option=[null, null, null, null, null], anims=[808, -1]. +NPC (wrapper) id=7710, child npcs=[7672, -1]. +NPC id=7711, name=Temple guardian, level=30, option=[null, Attack, null, null, null], anims=[6561, 6560]. +NPC id=7712, name=null, level=1, option=[null, null, null, null, null], anims=[-1, -1]. +NPC id=7713, name=Baby icefiend, level=0, option=[Catch, null, null, null, null], anims=[8077, 9153]. +NPC id=7714, name=Icefiend, level=13, option=[null, Attack, null, null, null], anims=[9145, 8076]. +NPC id=7715, name=Icefiend, level=13, option=[null, Attack, null, null, null], anims=[8077, 8076]. +NPC (wrapper) id=7716, child npcs=[7714, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7714, -1, -1, -1, -1, 7714, -1, -1, -1, -1, 7714, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7714, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7714, -1, -1, -1, -1, 7714, -1, -1, -1, 7714, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7715, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7714, -1]. +NPC id=7717, name=Professor Arblenap, level=0, option=[null, null, null, null, null], anims=[195, 189]. +NPC id=7718, name=Brother Bordiss, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=7719, name=Brother Althric, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7720, name=Drorkar, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=7721, name=Nurmof, level=0, option=[null, null, null, null, null], anims=[101, 98]. +NPC id=7722, name=Lakki the delivery dwarf, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=7723, name=Drorkar, level=0, option=[Talk-to, null, Pickpocket, null, null], anims=[101, 98]. +NPC id=7724, name=Brother Bordiss, level=0, option=[Talk-to, null, null, null, null], anims=[101, 98]. +NPC id=7725, name=Professor Arblenap, level=0, option=[Talk-to, null, null, null, null], anims=[195, 189]. +NPC id=7726, name=Assistant, level=0, option=[null, null, null, null, null], anims=[9138, -1]. +NPC id=7727, name=Monk, level=5, option=[Talk-to, Attack, null, null, null], anims=[808, -1]. +NPC (wrapper) id=7728, child npcs=[7722, -1]. +NPC (wrapper) id=7729, child npcs=[7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, 7723, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, 7723, -1, -1, -1, 7723, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7723, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1]. +NPC (wrapper) id=7730, child npcs=[7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, 7724, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, 7724, -1, -1, -1, 7724, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7724, -1]. +NPC id=7731, name=null, level=1, option=[null, null, null, null, null], anims=[195, 189]. +NPC (wrapper) id=7732, child npcs=[7736, 7713, -1]. +NPC (wrapper) id=7733, child npcs=[7736, 7713, -1]. +NPC (wrapper) id=7734, child npcs=[7736, 7713, -1]. +NPC (wrapper) id=7735, child npcs=[7736, 7713, -1]. +NPC id=7736, name=Baby icefiend, level=0, option=[null, null, null, null, null], anims=[9145, 9153]. +NPC id=7737, name=Will, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7738, name=Will, level=0, option=[null, null, null, null, null], anims=[9217, 9216]. +NPC id=7739, name=Phil, level=0, option=[null, null, null, null, null], anims=[808, -1]. +NPC id=7740, name=Jiggling crate, level=0, option=[Search, null, null, null, null], anims=[9198, -1]. +NPC id=7741, name=Three little kittens, level=0, option=[null, null, null, null, null], anims=[9208, 9210]. +NPC id=7742, name=Fluffs, level=0, option=[Pick-up, null, Stroke, Talk-to, null], anims=[9158, 9157]. +NPC id=7743, name=Fluffs, level=0, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=7744, name=null, level=1, option=[null, null, null, null, null], anims=[9158, 9157]. +NPC id=7745, name=Kittens, level=0, option=[null, null, null, null, null], anims=[9208, 9210]. +NPC id=7746, name=TzHaar-Mej-Malk, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9281]. +NPC id=7747, name=TzHaar-Xil-Tog, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9281]. +NPC id=7748, name=TzHaar-Hur-Frok, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9281]. +NPC id=7749, name=TzHaar-Ket-Grol, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9296]. +NPC id=7750, name=TzHaar-Ket-Rok, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9296]. +NPC id=7751, name=TzHaar-Ket-Lurk, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9296]. +NPC id=7752, name=TzHaar-Mej-Lor, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9281]. +NPC id=7753, name=TzHaar-Mej, level=0, option=[Talk-to, null, null, null, null], anims=[9325, 9320]. +NPC id=7754, name=TzHaar-Hur, level=0, option=[Talk-to, null, null, null, null], anims=[9324, 9321]. +NPC id=7755, name=TzHaar-Xil, level=0, option=[Talk-to, null, null, null, null], anims=[9323, 9322]. +NPC id=7756, name=Library assistant, level=0, option=[null, null, null, null, null], anims=[9311, -1]. +NPC id=7757, name=TzHaar-Hur-Brekt, level=0, option=[Talk-to, null, null, null, null], anims=[9326, 9326]. +NPC id=7758, name=TzHaar-Hur-Brekt, level=0, option=[Talk-to, null, null, null, null], anims=[9281, 9281]. +NPC id=7759, name=TzHaar-Ket-Jok, level=0, option=[Talk-to, null, null, null, null], anims=[9314, 9281]. +NPC id=7760, name=TzHaar-Ket-Jok, level=0, option=[Talk-to, null, null, null, null], anims=[9282, 9280]. +NPC id=7761, name=TzHaar-Xil-Mor, level=0, option=[Talk-to, null, null, null, null], anims=[9313, 9281]. +NPC id=7762, name=TzHaar-Xil-Mor, level=0, option=[Talk-to, null, null, null, null], anims=[9283, 9280]. +NPC id=7763, name=TzHaar-Mej-Kol, level=0, option=[Talk-to, null, null, null, null], anims=[9314, 9281]. +NPC id=7764, name=TzHaar-Mej-Kol, level=0, option=[Talk-to, null, null, null, null], anims=[9284, 9280]. +NPC id=7765, name=TzHaar-Hur-Klag, level=0, option=[Talk-to, null, null, null, null], anims=[9313, 9281]. +NPC id=7766, name=TzHaar-Hur-Klag, level=0, option=[Talk-to, null, null, null, null], anims=[9285, 9280]. +NPC id=7767, name=TzHaar-Hur, level=74, option=[Talk-to, Attack, null, null, null], anims=[9281, 9280]. +NPC id=7768, name=TzHaar-Hur, level=74, option=[Talk-to, Attack, null, null, null], anims=[9281, 9280]. +NPC id=7769, name=TzHaar-Hur, level=74, option=[Talk-to, Attack, null, null, null], anims=[9281, 9280]. +NPC id=7770, name=TokTz-Ket-Dill, level=100, option=[null, Attack, null, null, null], anims=[9334, 9333]. +NPC id=7771, name=TokTz-Ket-Dill, level=100, option=[null, Attack, null, null, null], anims=[9334, 9333]. +NPC id=7772, name=Lava monster, level=47, option=[null, Attack, null, null, null], anims=[9339, 9339]. +NPC id=7773, name=Fire monster, level=47, option=[null, Attack, null, null, null], anims=[9343, 9343]. diff --git a/dumps/498/498_object_anims b/dumps/498/498_object_anims new file mode 100644 index 000000000..a0c297800 --- /dev/null +++ b/dumps/498/498_object_anims @@ -0,0 +1,2346 @@ +1 - Crate anim = 3206 +115 - Party Balloon anim = 498 +116 - Party Balloon anim = 498 +117 - Party Balloon anim = 498 +118 - Party Balloon anim = 498 +119 - Party Balloon anim = 498 +120 - Party Balloon anim = 498 +121 - Party Balloon anim = 498 +122 - Party Balloon anim = 498 +123 - Party Balloon anim = 499 +124 - Party Balloon anim = 499 +125 - Party Balloon anim = 499 +126 - Party Balloon anim = 499 +127 - Party Balloon anim = 499 +128 - Party Balloon anim = 499 +129 - Party Balloon anim = 500 +130 - Party Balloon anim = 501 +196 - null anim = 481 +197 - null anim = 481 +198 - null anim = 481 +199 - null anim = 481 +201 - Lamp anim = 467 +206 - null anim = 481 +207 - null anim = 481 +288 - null anim = 526 +289 - null anim = 527 +290 - null anim = 527 +470 - null anim = 907 +515 - null anim = 505 +521 - null anim = 524 +522 - null anim = 524 +672 - Broken barrel anim = 449 +673 - null anim = 523 +674 - null anim = 2709 +675 - null anim = 523 +676 - null anim = 523 +677 - null anim = 523 +683 - Grandfather clock anim = 1726 +684 - Swamp bubbles anim = 480 +685 - Weather vane anim = 488 +692 - Cauldron anim = 479 +704 - null anim = 469 +714 - Fire remains anim = 475 +715 - null anim = 476 +716 - null anim = 476 +724 - Standing torch anim = 473 +725 - null anim = 473 +726 - null anim = 1071 +731 - null anim = 493 +732 - null anim = 494 +735 - Swamp bubbles anim = 480 +740 - null anim = 504 +860 - Flagpole anim = 471 +861 - Flagpole anim = 471 +862 - Flagpole anim = 471 +869 - Flagpole anim = 471 +907 - Charms anim = 468 +955 - Spooky picture anim = 470 +1293 - Spirit tree anim = 332 +1294 - Spirit tree anim = 332 +1295 - Spirit tree anim = 333 +1395 - Fly trap anim = 492 +1778 - Millstones anim = 1731 +1779 - Sails anim = 472 +1784 - null anim = 1731 +1812 - Portal anim = 491 +1887 - null anim = 503 +1914 - null anim = 473 +2016 - null anim = 522 +2017 - null anim = 522 +2018 - null anim = 522 +2019 - Whirlpool anim = 456 +2024 - Cauldron anim = 479 +2043 - Cauldron anim = 479 +2118 - Whirlpool anim = 456 +2119 - Rocks anim = 523 +2120 - Rocks anim = 523 +2121 - Rocks anim = 523 +2122 - Rocks anim = 523 +2123 - Rocks anim = 523 +2124 - Rocks anim = 523 +2125 - Rocks anim = 523 +2126 - Rocks anim = 523 +2127 - Rocks anim = 523 +2128 - Rocks anim = 523 +2129 - Rocks anim = 523 +2130 - Rocks anim = 523 +2131 - Rocks anim = 523 +2132 - Rocks anim = 523 +2133 - Rocks anim = 523 +2134 - Rocks anim = 523 +2135 - Rocks anim = 523 +2136 - Rocks anim = 523 +2137 - Rocks anim = 523 +2138 - Rocks anim = 523 +2139 - Rocks anim = 523 +2140 - Rocks anim = 523 +2141 - Chest anim = 2709 +2142 - Cauldron of Thunder anim = 479 +2167 - Leak anim = 464 +2452 - null anim = 2714 +2453 - null anim = 2714 +2454 - null anim = 2714 +2455 - null anim = 2714 +2456 - null anim = 2714 +2457 - null anim = 2714 +2458 - null anim = 2714 +2459 - null anim = 2714 +2460 - null anim = 2714 +2461 - null anim = 2714 +2462 - null anim = 2714 +2463 - null anim = 2714 +2464 - null anim = 2714 +2465 - Portal anim = 504 +2466 - Portal anim = 504 +2467 - Portal anim = 504 +2468 - Portal anim = 504 +2469 - Portal anim = 504 +2470 - Portal anim = 504 +2471 - Portal anim = 504 +2472 - Portal anim = 504 +2473 - Portal anim = 504 +2474 - Portal anim = 504 +2475 - Portal anim = 504 +2476 - Portal anim = 504 +2477 - Portal anim = 504 +2478 - Altar anim = 503 +2479 - Altar anim = 503 +2480 - Altar anim = 503 +2481 - Altar anim = 503 +2482 - Altar anim = 503 +2483 - Altar anim = 503 +2484 - Altar anim = 503 +2485 - Altar anim = 503 +2486 - Altar anim = 503 +2487 - Altar anim = 503 +2488 - Altar anim = 503 +2489 - Altar anim = 503 +2490 - Altar anim = 503 +2492 - Portal anim = 504 +2498 - Mysterious glow anim = 502 +2499 - Mysterious glow anim = 502 +2500 - Mysterious glow anim = 502 +2501 - Mysterious glow anim = 502 +2502 - Mysterious glow anim = 502 +2586 - Rocks anim = 523 +2607 - Rocks anim = 523 +2608 - Rocks anim = 523 +2630 - Fishing spot anim = 525 +2654 - Sinclair family fountain anim = 6023 +2715 - Hellhound anim = 6561 +2724 - Fireplace anim = 477 +2725 - Fireplace anim = 478 +2726 - Fireplace anim = 478 +2727 - Cooking pot anim = 477 +2732 - Fire anim = 475 +2842 - Magical shield anim = 446 +2908 - Fire Wall anim = 476 +2909 - Fire Wall anim = 476 +2916 - Rocks anim = 523 +2933 - null anim = 449 +2980 - Flowers anim = 912 +2981 - Flowers anim = 912 +2982 - Flowers anim = 912 +2983 - Flowers anim = 912 +2984 - Flowers anim = 912 +2985 - Flowers anim = 912 +2986 - Flowers anim = 912 +2987 - Flowers anim = 912 +2988 - Flowers anim = 912 +3038 - Fire anim = 475 +3108 - Entrance anim = 917 +3109 - Entrance anim = 917 +3111 - Entrance anim = 917 +3112 - Entrance anim = 917 +3113 - Entrance anim = 917 +3114 - Entrance anim = 917 +3240 - Bridge anim = 474 +3263 - Swamp anim = 480 +3357 - null anim = 476 +3358 - null anim = 476 +3405 - null anim = 1051 +3407 - null anim = 1049 +3410 - null anim = 4860 +3411 - null anim = 1052 +3434 - null anim = 1073 +3474 - null anim = 1073 +3493 - Monument anim = 1072 +3494 - Monument anim = 1072 +3495 - Monument anim = 1072 +3496 - Monument anim = 1072 +3497 - Monument anim = 1072 +3498 - Monument anim = 1072 +3499 - Monument anim = 1072 +3509 - Fungi on log anim = 1096 +3511 - Budding branch anim = 1098 +3513 - A golden pear bush anim = 1097 +3567 - Blade anim = 1103 +3577 - Plank anim = 1104 +3581 - Ticket Dispenser anim = 1108 +3582 - Floor spikes anim = 1112 +3609 - null anim = 493 +3634 - Strange shrine anim = 1127 +3637 - null anim = 1138 +3662 - Cooking pot anim = 479 +3680 - Flagpole anim = 471 +3752 - Mysterious glow anim = 502 +3769 - Fire anim = 475 +3775 - Fire anim = 475 +3824 - Troll Stew anim = 479 +3862 - Burning bones anim = 475 +3872 - null anim = 1211 +3878 - null anim = 1212 +3918 - Elven lamp anim = 1212 +3926 - null anim = 1216 +3961 - null anim = 480 +3966 - null anim = 523 +3976 - Catapult anim = 1223 +3987 - Barrel anim = 1233 +3997 - Tent wall anim = 1234 +4004 - Well anim = 1235 +4005 - Well anim = 1235 +4024 - Barrel anim = 1231 +4025 - Barrel anim = 1233 +4046 - null anim = 1260 +4047 - null anim = 1261 +4069 - Temple wall anim = 1293 +4070 - Temple wall anim = 1294 +4071 - Temple wall anim = 1295 +4072 - Temple wall anim = 1296 +4073 - Temple wall anim = 1297 +4074 - Temple wall anim = 1298 +4075 - Temple wall anim = 1299 +4076 - Temple wall anim = 1300 +4077 - Temple wall anim = 1301 +4078 - Temple wall anim = 1302 +4080 - Temple wall anim = 1293 +4081 - Temple wall anim = 1294 +4082 - Temple wall anim = 1295 +4083 - Temple wall anim = 1296 +4084 - Temple wall anim = 1297 +4085 - Temple wall anim = 1298 +4086 - Temple wall anim = 1299 +4087 - Temple wall anim = 1300 +4088 - Temple wall anim = 1301 +4089 - Temple wall anim = 1302 +4090 - Flaming Fire altar anim = 475 +4093 - Funeral Pyre anim = 1303 +4094 - Funeral Pyre anim = 1304 +4095 - Funeral Pyre anim = 1304 +4096 - Funeral Pyre anim = 1304 +4097 - Funeral Pyre anim = 1304 +4098 - Funeral Pyre anim = 1304 +4099 - Funeral Pyre anim = 1304 +4149 - Lalli's Stew anim = 479 +4150 - Portal anim = 504 +4151 - Portal anim = 504 +4152 - Portal anim = 504 +4153 - Portal anim = 504 +4154 - Portal anim = 504 +4155 - Portal anim = 504 +4156 - Portal anim = 504 +4157 - Portal anim = 504 +4192 - null anim = 475 +4265 - Fire anim = 475 +4266 - Fire anim = 475 +4267 - Spit roast anim = 1334 +4387 - Saradomin Portal anim = 504 +4388 - Zamorak Portal anim = 504 +4389 - Portal anim = 504 +4390 - Portal anim = 504 +4406 - Portal anim = 504 +4407 - Portal anim = 504 +4408 - Guthix Portal anim = 504 +4422 - Barricade anim = 475 +4469 - Energy Barrier anim = 1433 +4470 - Energy Barrier anim = 1433 +4517 - null anim = 481 +4587 - Lighting mechanism anim = 1347 +4589 - Lighting mechanism anim = 1349 +4590 - Lighting mechanism anim = 1348 +4618 - Fireplace anim = 475 +4619 - null anim = 1362 +4650 - Fireplace anim = 475 +4668 - null anim = 1355 +4692 - Flagpole anim = 471 +4693 - Flagpole anim = 471 +4694 - null anim = 481 +4765 - Wall of flame anim = 476 +4766 - Wall of flame anim = 476 +4767 - Sacrificial Pyre anim = 1416 +4771 - Awowogei anim = 1398 +4866 - Gnome Glider anim = 1411 +4886 - Floor spikes anim = 1112 +4900 - Saradomin Standard anim = 1430 +4901 - Zamorak Standard anim = 1430 +4902 - Saradomin Standard anim = 1430 +4903 - Zamorak Standard anim = 1430 +4904 - Catapult anim = 1431 +4905 - Catapult anim = 1431 +4906 - null anim = 1430 +4907 - null anim = 1430 +5072 - Pillar anim = 473 +5116 - Statue anim = 1532 +5117 - Statue anim = 1533 +5146 - Goal anim = 1600 +5164 - Signpost anim = 1631 +5165 - Fireplace anim = 1629 +5177 - Lightning conductor anim = 1632 +5178 - Fireplace surround anim = 1630 +5179 - Fireplace surround anim = 1630 +5208 - null anim = 481 +5247 - null anim = 481 +5248 - Crystal growth anim = 1636 +5249 - Fire anim = 475 +5252 - Fire remains anim = 475 +5259 - Energy Barrier anim = 1433 +5282 - Ectofuntus anim = 1657 +5283 - Ectofuntus anim = 1657 +5461 - null anim = 1641 +5462 - null anim = 1642 +5463 - null anim = 1643 +5499 - Fire anim = 475 +5558 - Aggie's Cauldron anim = 479 +5559 - Charms anim = 468 +5589 - Water wheel anim = 1729 +5590 - Water wheel anim = 1729 +5591 - Water wheel anim = 1729 +5593 - null anim = 1729 +5594 - Water wheel anim = 1729 +5597 - Weather vane anim = 1733 +5604 - Rock anim = 1727 +5605 - Rock anim = 1727 +5606 - Rock anim = 1727 +5607 - null anim = 1727 +5608 - Spit roast anim = 1017 +5626 - null anim = 472 +5627 - Standard anim = 1734 +5628 - Standard anim = 1730 +5629 - Standard anim = 1730 +5631 - Fire anim = 1732 +5632 - Fire anim = 1732 +5811 - null anim = 1733 +5815 - Gnome landing light anim = 1747 +5816 - Flashing landing light anim = 1747 +5817 - Flashing landing light anim = 1747 +5818 - Flashing landing light anim = 1747 +5819 - Flashing landing light anim = 1747 +5820 - null anim = 1747 +5821 - null anim = 1747 +5822 - null anim = 1747 +5823 - null anim = 1747 +5826 - Swordshop Sign anim = 1430 +5883 - Mud anim = 480 +5884 - Swamp anim = 480 +5897 - Shining pool anim = 523 +5911 - null anim = 522 +5917 - Gas hole anim = 523 +5918 - Gas hole anim = 523 +5921 - null anim = 1812 +5963 - null anim = 1845 +5964 - Cannonball anim = 1845 +5965 - Gold cannonball anim = 1846 +5977 - Wall of flame anim = 476 +5978 - Wall of flame anim = 476 +5979 - Wall of flame anim = 476 +5980 - Wall of flame anim = 476 +5981 - Fire anim = 1847 +5985 - Rock anim = 1727 +5986 - Small rock anim = 1727 +5987 - Rock anim = 1727 +5988 - null anim = 1727 +6009 - Blue Fire anim = 476 +6093 - Fireplace anim = 1869 +6094 - Fireplace anim = 1869 +6095 - Fireplace anim = 1869 +6096 - Fireplace anim = 1869 +6197 - Table anim = 1868 +6199 - Table anim = 1868 +6201 - Table anim = 1868 +6202 - Lamp anim = 1868 +6203 - Lamp anim = 1868 +6246 - Table anim = 1875 +6254 - null anim = 917 +6257 - Dung anim = 1881 +6259 - Dung anim = 1881 +6282 - Portal anim = 1908 +6363 - Door anim = 1909 +6365 - null anim = 481 +6405 - null anim = 475 +6407 - null anim = 475 +6409 - null anim = 475 +6411 - null anim = 475 +6413 - Standing Torch anim = 475 +6414 - Standing Torch anim = 475 +6415 - Standing Torch anim = 475 +6416 - Standing Torch anim = 475 +6422 - null anim = 1923 +6424 - null anim = 1923 +6425 - Mystical mirror anim = 1923 +6426 - null anim = 1923 +6427 - Mystical mirror anim = 1923 +6428 - null anim = 1923 +6429 - Mystical mirror anim = 1923 +6430 - null anim = 1923 +6431 - Mystical mirror anim = 1923 +6432 - null anim = 1923 +6433 - Mystical mirror anim = 1923 +6438 - Vampire tomb anim = 1915 +6482 - null anim = 1943 +6483 - Obelisk anim = 1943 +6484 - Obelisk anim = 1943 +6485 - null anim = 1943 +6486 - Obelisk anim = 1943 +6487 - Obelisk anim = 1943 +6488 - null anim = 1943 +6489 - Obelisk anim = 1943 +6490 - Obelisk anim = 1943 +6491 - null anim = 1943 +6492 - Obelisk anim = 1943 +6493 - Obelisk anim = 1943 +6495 - null anim = 1940 +6518 - null anim = 1936 +6519 - null anim = 1937 +6520 - null anim = 1938 +6521 - Pitfall anim = 1939 +6522 - null anim = 1939 +6537 - null anim = 481 +6550 - null anim = 504 +6551 - Portal anim = 504 +6629 - Wall Crusher anim = 1944 +6642 - anim = 1998 +6643 - Doorway anim = 1999 +6657 - Juna anim = 2056 +6661 - Blue tears anim = 2054 +6662 - Green tears anim = 2054 +6665 - Blue tears anim = 2054 +6666 - Green tears anim = 2054 +6818 - null anim = 475 +6887 - null anim = 2091 +6895 - null anim = 1017 +6896 - Standing torch anim = 473 +6949 - null anim = 2131 +6967 - null anim = 2133 +6968 - null anim = 2133 +6972 - Bookcase anim = 2136 +6985 - Crusher anim = 2135 +7013 - Plant anim = 2137 +7014 - Plant anim = 2137 +7015 - Plant anim = 2137 +7129 - Fire rift anim = 2178 +7130 - Earth rift anim = 2178 +7131 - Body rift anim = 2178 +7132 - Cosmic rift anim = 2178 +7133 - Nature rift anim = 2178 +7134 - Chaos rift anim = 2178 +7135 - Law rift anim = 2178 +7136 - Death rift anim = 2178 +7137 - Water rift anim = 2178 +7138 - Soul rift anim = 2178 +7139 - Air rift anim = 2178 +7140 - Mind rift anim = 2178 +7141 - Blood rift anim = 2178 +7171 - Abyssal rift anim = 2260 +7181 - null anim = 2174 +7182 - null anim = 2174 +7189 - Tendrils anim = 2173 +7190 - Tendrils anim = 2173 +7191 - Tendrils anim = 2173 +7224 - Spinning blades anim = 2199 +7225 - Wall anim = 2198 +7227 - Floor anim = 1112 +7228 - Wall anim = 2196 +7229 - Wall anim = 2201 +7230 - Floor anim = 2203 +7241 - Pendulum anim = 2204 +7248 - Wall anim = 2209 +7252 - Blade anim = 2210 +7253 - Spin Blades anim = 2212 +7272 - Portal anim = 504 +7273 - Portal anim = 504 +7288 - Portal anim = 504 +7289 - Portal anim = 504 +7315 - Portal anim = 504 +7316 - Portal anim = 504 +7318 - Portal anim = 504 +7319 - Portal anim = 504 +7321 - Portal anim = 504 +7322 - Portal anim = 504 +7324 - Portal anim = 504 +7325 - Portal anim = 504 +7352 - Portal anim = 504 +7353 - Portal anim = 504 +7376 - null anim = 481 +8689 - Dairy cow anim = 5855 +8712 - Fireplace anim = 478 +8725 - Rock anim = 1727 +8726 - Rock anim = 1727 +8727 - Rocks anim = 1727 +8742 - Tree anim = 2313 +8767 - Elven lamp anim = 1212 +8774 - null anim = 1212 +8794 - null anim = 2331 +8796 - An empty rack anim = 2331 +8926 - Viking Boat anim = 2346 +8949 - null anim = 481 +8954 - Flag anim = 2359 +8955 - Flag anim = 2360 +8958 - Door anim = 2349 +8959 - Door anim = 2349 +8960 - Door anim = 2349 +8961 - Door anim = 2350 +8962 - Door anim = 2348 +8963 - Door anim = 2350 +8972 - Portal anim = 504 +8983 - null anim = 2379 +8985 - Uncooking pot anim = 1732 +8987 - Portal anim = 504 +9006 - Funeral Pyre anim = 1304 +9007 - Funeral Pyre anim = 1304 +9010 - Light Jungle anim = 2380 +9011 - Light Jungle anim = 2380 +9012 - Light Jungle anim = 2380 +9013 - Light Jungle anim = 2380 +9014 - Light Jungle anim = 2380 +9015 - Medium Jungle anim = 2380 +9016 - Medium Jungle anim = 2380 +9017 - Medium Jungle anim = 2380 +9018 - Medium Jungle anim = 2380 +9019 - Medium Jungle anim = 2380 +9020 - Dense Jungle anim = 2380 +9021 - Dense Jungle anim = 2380 +9022 - Dense Jungle anim = 2380 +9023 - Dense Jungle anim = 2380 +9024 - Dense Jungle anim = 2380 +9094 - Bar dispenser anim = 2440 +9099 - Smoke anim = 2439 +9100 - Conveyor belt anim = 2437 +9101 - Conveyor belt anim = 2437 +9103 - Drive belt anim = 2451 +9105 - Cogs anim = 2451 +9115 - Smoke anim = 2439 +9117 - Pipes anim = 2439 +9121 - Pipes anim = 2439 +9123 - Smoke anim = 2439 +9145 - Golden lantern anim = 1073 +9159 - Candles anim = 2564 +9160 - Candles anim = 2564 +9161 - Candles anim = 2564 +9294 - Strange floor anim = 1112 +9315 - Stepping stone anim = 3743 +9326 - Strange floor anim = 1112 +9353 - null anim = 2598 +9366 - Open hot vent door anim = 2598 +9367 - Hot vent door anim = 2598 +9368 - Hot vent door anim = 2598 +9369 - Hot vent door anim = 2598 +9375 - null anim = 523 +9376 - null anim = 2599 +9377 - Egg anim = 2600 +9378 - Egg anim = 2600 +9379 - Egg anim = 2600 +9390 - Lava forge anim = 2641 +9391 - Viewing orb anim = 2657 +9392 - null anim = 2657 +9439 - Fireplace anim = 477 +9442 - null anim = 477 +9508 - Hammock anim = 2699 +9515 - Betty's cauldron anim = 479 +9549 - Hot Coals anim = 2708 +9726 - Rocks anim = 523 +9727 - Rocks anim = 523 +9728 - Rocks anim = 523 +9729 - Rocks anim = 523 +9730 - Rocks anim = 523 +9731 - Rocks anim = 523 +9732 - Rocks anim = 523 +9733 - Rocks anim = 523 +9734 - Rocks anim = 523 +9735 - Rocks anim = 523 +9749 - Crystal collector anim = 2734 +9768 - Light door anim = 2746 +9769 - Light door anim = 2746 +9770 - Light door anim = 2746 +9771 - Light door anim = 2746 +9772 - Light door anim = 2746 +9773 - Light door anim = 2746 +9774 - Light door anim = 2746 +9775 - Light door anim = 2746 +9799 - null anim = 2747 +9800 - null anim = 2747 +9801 - null anim = 2747 +9802 - null anim = 2747 +9803 - null anim = 2747 +9804 - null anim = 2747 +9805 - null anim = 2747 +9806 - null anim = 2747 +9807 - null anim = 2747 +9808 - null anim = 2747 +9809 - null anim = 2747 +9810 - null anim = 2747 +9811 - null anim = 2747 +9812 - null anim = 2747 +9813 - null anim = 2742 +9814 - null anim = 2742 +9815 - null anim = 2742 +9816 - null anim = 2742 +9817 - null anim = 2742 +9818 - null anim = 2742 +9819 - null anim = 2742 +9992 - null anim = 2743 +10014 - Crystal anim = 2744 +10034 - Trap anim = 2209 +10041 - Tree anim = 2749 +10057 - Flagpole anim = 471 +10060 - null anim = 2768 +10087 - Ominous Fishing Spot anim = 447 +10088 - Ominous Fishing Spot anim = 447 +10089 - Ominous Fishing Spot anim = 447 +10091 - Aquarium anim = 447 +10104 - null anim = 2807 +10142 - Brewing control anim = 2807 +10143 - Brewing control anim = 2807 +10144 - Brewing control anim = 2807 +10169 - null anim = 480 +10178 - Standing Torch anim = 2870 +10179 - Standing Torch anim = 2870 +10185 - null anim = 481 +10186 - null anim = 2871 +10237 - null anim = 2871 +10251 - Portal anim = 2878 +10252 - Magic circle anim = 2883 +10292 - Rat trap anim = 2897 +10299 - Rat lever anim = 2899 +10300 - Rat barn anim = 2901 +10301 - Rat barrel anim = 2898 +10307 - Lantern anim = 2900 +10310 - Rat barrel anim = 2898 +10311 - Rat lever anim = 2899 +10312 - Rat barn anim = 2901 +10317 - Rat barrel anim = 2898 +10395 - null anim = 2905 +10398 - null anim = 2905 +10401 - null anim = 2905 +10403 - null anim = 2905 +10433 - Fire anim = 475 +10541 - Human Flag anim = 917 +10542 - Human Flag anim = 917 +10543 - Dwarf Flag anim = 917 +10544 - Dwarf Flag anim = 917 +10545 - Elf Flag anim = 917 +10546 - Elf Flag anim = 917 +10547 - Gnome Flag anim = 917 +10548 - Gnome Flag anim = 917 +10549 - Werewolf Flag anim = 917 +10550 - Werewolf Flag anim = 917 +10551 - TzHaar Flag anim = 917 +10552 - TzHaar Flag anim = 917 +10641 - Doric's Whetstone anim = 2997 +10715 - null anim = 3022 +10716 - null anim = 3022 +10717 - null anim = 3022 +10718 - null anim = 3022 +10738 - Statue anim = 3029 +10739 - Statue anim = 3029 +10761 - null anim = 3028 +10778 - Telekinetic Teleport anim = 3030 +10779 - Enchanters Teleport anim = 3030 +10780 - Alchemists Teleport anim = 3030 +10781 - Graveyard Teleport anim = 3030 +10782 - Exit Teleport anim = 3030 +10814 - Sandpit anim = 3038 +10820 - Energy Barrier anim = 1433 +10824 - Fireplace anim = 1629 +10825 - null anim = 1630 +10826 - null anim = 1630 +10875 - Stone block anim = 3070 +10877 - null anim = 3070 +10878 - null anim = 3070 +10879 - null anim = 3070 +10880 - null anim = 3070 +10881 - null anim = 3070 +10962 - Statue anim = 3099 +10963 - Statue anim = 3099 +10964 - Statue anim = 3099 +10965 - Statue anim = 3099 +10966 - Statue anim = 3100 +10967 - Statue anim = 3100 +10968 - Statue anim = 3100 +10969 - Statue anim = 3100 +11005 - Magic barrier anim = 3095 +11010 - Furnace anim = 3106 +11011 - null anim = 3105 +11012 - null anim = 3105 +11013 - null anim = 3105 +11014 - null anim = 3105 +11015 - null anim = 3107 +11016 - null anim = 3105 +11079 - Light anim = 3101 +11129 - null anim = 481 +11141 - Magic spell anim = 3097 +11143 - null anim = 481 +11158 - null anim = 3104 +11166 - Rocks anim = 523 +11167 - Rocks anim = 523 +11168 - Rocks anim = 523 +11169 - Rocks anim = 523 +11170 - Rocks anim = 523 +11171 - Rocks anim = 523 +11172 - Rocks anim = 523 +11173 - Rocks anim = 523 +11174 - Rocks anim = 523 +11175 - Rocks anim = 523 +11176 - Rocks anim = 523 +11177 - Rocks anim = 523 +11178 - Rocks anim = 523 +11179 - Rocks anim = 523 +11180 - Rocks anim = 523 +11181 - Rocks anim = 523 +11182 - Rocks anim = 523 +11192 - Rocks anim = 523 +11193 - Rocks anim = 523 +11194 - Rocks anim = 523 +11195 - Rocks anim = 523 +11208 - Coffin anim = 3113 +11221 - null anim = 464 +11222 - null anim = 464 +11223 - null anim = 464 +11224 - null anim = 464 +11225 - null anim = 464 +11226 - null anim = 464 +11317 - Ship hull anim = 464 +11318 - Ship hull anim = 464 +11354 - Interdimensional rift anim = 3174 +11355 - null anim = 3174 +11356 - Portal Home anim = 3174 +11357 - Portal machine anim = 3173 +11359 - null anim = 3174 +11361 - Raw chompy bird anim = 3180 +11362 - Raw Rabbit anim = 3180 +11363 - Iron spit anim = 3180 +11364 - Decorative Pillar anim = 3107 +11365 - Decorative Pillar anim = 3107 +11366 - Decorative Pillar anim = 3107 +11367 - Decorative Pillar anim = 3107 +11368 - null anim = 3107 +11369 - null anim = 3107 +11370 - null anim = 3107 +11371 - null anim = 3107 +11372 - null anim = 3107 +11373 - null anim = 3107 +11374 - null anim = 3107 +11375 - null anim = 3107 +11376 - null anim = 3107 +11377 - null anim = 3107 +11378 - null anim = 3107 +11397 - Pillar candle flame. anim = 3107 +11398 - Our lives anim = 4354 +11404 - Fire anim = 475 +11405 - Fire anim = 475 +11406 - Fire anim = 475 +11424 - Rocks anim = 523 +11425 - Rocks anim = 523 +11426 - Rocks anim = 523 +11427 - Rocks anim = 523 +11428 - Rocks anim = 523 +11429 - Rocks anim = 523 +11430 - Rocks anim = 523 +11431 - Rocks anim = 523 +11432 - Rocks anim = 523 +11433 - Rocks anim = 523 +11434 - Rocks anim = 523 +11435 - Rocks anim = 523 +11436 - Rocks anim = 523 +11437 - Rocks anim = 523 +11438 - Rocks anim = 523 +11439 - Rocks anim = 523 +11440 - Rocks anim = 523 +11441 - Rocks anim = 523 +11442 - Rocks anim = 523 +11443 - Rocks anim = 523 +11444 - Rocks anim = 523 +11468 - Lantern anim = 1868 +11469 - Spooky picture anim = 470 +11472 - Candles anim = 2564 +11473 - Candles anim = 2564 +11493 - Grandfather clock anim = 1726 +11495 - Gallows anim = 3217 +11496 - Chair anim = 3218 +11497 - Spooky picture anim = 3219 +11548 - Strange machine anim = 3172 +11549 - Strange machine anim = 3172 +11614 - Standard anim = 1730 +11615 - Standard anim = 1730 +11669 - null anim = 4860 +11677 - Treadmill anim = 3230 +11678 - Spinning pole anim = 3231 +11699 - Flagpole anim = 471 +11815 - null anim = 2900 +11816 - null anim = 3107 +11817 - null anim = 481 +11861 - Standard anim = 1730 +11875 - Canary anim = 3237 +11909 - null anim = 475 +11915 - Rocks anim = 523 +11916 - Rocks anim = 523 +11917 - Rocks anim = 523 +11918 - Rocks anim = 523 +11919 - Rocks anim = 523 +11920 - Rocks anim = 523 +11921 - Rocks anim = 523 +11922 - Rocks anim = 523 +11923 - Rocks anim = 523 +11924 - Rocks anim = 523 +11925 - Rocks anim = 523 +11926 - Rocks anim = 523 +11927 - Rocks anim = 523 +11928 - Rocks anim = 523 +11929 - Rocks anim = 523 +12066 - A fairy workbench anim = 3246 +12067 - A fairy workbench anim = 3247 +12093 - Chicken Shrine anim = 3264 +12101 - null anim = 4860 +12111 - Dairy Cow anim = 5855 +12114 - Cow wheel anim = 6094 +12145 - Canoe Station anim = 3304 +12151 - Canoe Station anim = 3304 +12152 - Canoe Station anim = 3304 +12153 - Canoe Station anim = 3304 +12154 - Canoe Station anim = 3304 +12159 - A Sinking Canoe anim = 3305 +12160 - A Sinking Canoe anim = 3305 +12161 - A Sinking Canoe anim = 3305 +12162 - A Sinking Canoe anim = 3305 +12168 - null anim = 3306 +12169 - null anim = 3306 +12170 - null anim = 3306 +12171 - null anim = 3306 +12203 - Light anim = 3101 +12256 - Nest anim = 3343 +12258 - Dragonfire anim = 3347 +12259 - Nest anim = 3343 +12260 - Portal anim = 3174 +12293 - Grandfather clock anim = 3511 +12300 - null anim = 3107 +12301 - Candles anim = 2564 +12302 - Candles anim = 2564 +12312 - Chair anim = 7263 +12313 - Chair anim = 7263 +12351 - Barrier anim = 3349 +12352 - Barrier anim = 3349 +12353 - Barrier anim = 3349 +12354 - null anim = 3351 +12355 - Portal anim = 3351 +12356 - Portal anim = 3351 +12357 - null anim = 3349 +12358 - null anim = 3349 +12359 - null anim = 3349 +12360 - null anim = 3349 +12361 - null anim = 3349 +12362 - null anim = 3349 +12363 - null anim = 3349 +12364 - null anim = 3349 +12365 - null anim = 3352 +12380 - null anim = 3408 +12400 - Cauldron anim = 3405 +12401 - Cauldron anim = 3406 +12402 - Explosion anim = 3407 +12477 - Kelp anim = 3438 +12519 - Coral anim = 3439 +12531 - Bubbles anim = 3440 +12532 - null anim = 3445 +12542 - null anim = 2900 +12551 - Old tree anim = 3459 +12556 - Rock and string anim = 3472 +12557 - Rock and string anim = 3472 +12594 - Snake anim = 3528 +12595 - Snake anim = 3534 +12596 - Snake anim = 3529 +12597 - Hole anim = 3530 +12598 - Snake anim = 3531 +12599 - Snake anim = 3532 +12600 - Snake anim = 3532 +12601 - Rope anim = 3101 +12605 - Light anim = 3101 +12608 - Red Banana Tree anim = 3478 +12654 - null anim = 523 +12701 - null anim = 3542 +12702 - null anim = 3542 +12703 - null anim = 3542 +12704 - null anim = 3542 +12785 - Bucket anim = 3558 +12795 - null anim = 475 +12805 - null anim = 3106 +12809 - Furnace anim = 3106 +12810 - null anim = 3104 +12811 - null anim = 3104 +12934 - null anim = 3107 +12969 - Cooking pot anim = 477 +13052 - null anim = 3107 +13053 - null anim = 3107 +13054 - null anim = 3107 +13113 - null anim = 4477 +13115 - Goblin crowd anim = 4564 +13145 - Magic barrier anim = 3586 +13169 - Clock anim = 3511 +13170 - Clock anim = 3511 +13171 - Clock anim = 3511 +13201 - Torch anim = 3105 +13203 - Torch anim = 3105 +13205 - Torch anim = 3107 +13207 - Torch anim = 3107 +13209 - Incense burner anim = 3573 +13211 - Incense burner anim = 3573 +13213 - Incense burner anim = 3573 +13215 - Bells anim = 3577 +13291 - Magic chest anim = 3117 +13292 - Magic chest anim = 3118 +13337 - Fire anim = 3105 +13341 - Torch anim = 3107 +13342 - Candle anim = 3107 +13343 - Skull anim = 3107 +13366 - Bones anim = 5483 +13367 - Guard dog anim = 6561 +13368 - Hobgoblin anim = 166 +13369 - Troll anim = 286 +13370 - Huge Spider anim = 145 +13373 - Rocnar anim = 3707 +13374 - Kalphite Soldier anim = 6218 +13375 - Steel dragon anim = 6496 +13376 - Dagannoth anim = 1338 +13377 - Tok-Xil anim = 2631 +13390 - Jacky Jester anim = 3587 +13395 - Elemental balance anim = 3582 +13396 - Elemental balance anim = 3582 +13397 - Elemental balance anim = 3582 +13405 - Portal anim = 3174 +13408 - Statue anim = 3647 +13480 - Ornamental fountain anim = 3647 +13528 - Firepit anim = 3105 +13529 - Firepit with hook anim = 3105 +13530 - Firepit with hook anim = 3105 +13531 - Firepit with pot anim = 3105 +13532 - Firepit with pot anim = 3105 +13533 - Small oven anim = 3105 +13534 - Small Oven anim = 3105 +13535 - Small oven anim = 3105 +13536 - Large oven anim = 3105 +13537 - Large oven anim = 3105 +13538 - Large oven anim = 3105 +13560 - Pump and drain anim = 3720 +13562 - Pump and tub anim = 3720 +13564 - Sink anim = 3720 +13610 - Clay fireplace anim = 3105 +13612 - Limestone fireplace anim = 3105 +13614 - Marble fireplace anim = 3105 +13615 - Varrock Portal anim = 3174 +13616 - Lumbridge Portal anim = 3174 +13617 - Falador Portal anim = 3174 +13618 - Camelot Portal anim = 3174 +13619 - Ardougne Portal anim = 3174 +13620 - Yanille Portal anim = 3174 +13621 - Kharyrll Portal anim = 3174 +13622 - Varrock Portal anim = 3174 +13623 - Lumbridge Portal anim = 3174 +13624 - Falador Portal anim = 3174 +13625 - Camelot Portal anim = 3174 +13626 - Ardougne Portal anim = 3174 +13627 - Yanille Portal anim = 3174 +13628 - Kharyrll Portal anim = 3174 +13629 - Varrock Portal anim = 3174 +13630 - Lumbridge Portal anim = 3174 +13631 - Falador Portal anim = 3174 +13632 - Camelot Portal anim = 3174 +13633 - Ardougne Portal anim = 3174 +13634 - Yanille Portal anim = 3174 +13635 - Kharyrll Portal anim = 3174 +13639 - Scrying pool anim = 3644 +13640 - Teleportation focus anim = 3646 +13641 - Greater teleport focus anim = 3648 +13654 - Small orrery anim = 3578 +13655 - Large orrery anim = 3579 +13660 - Elemental sphere anim = 3580 +13661 - Crystal of power anim = 3581 +13682 - Magic circle anim = 3615 +13683 - Greater magic circle anim = 3616 +13726 - Jacky Jester anim = 3587 +13841 - Row boat anim = 3742 +13842 - Ripples anim = 3743 +13858 - null anim = 493 +13859 - null anim = 493 +13860 - null anim = 493 +13880 - null anim = 476 +13881 - Fire anim = 476 +13925 - Hole anim = 3835 +14004 - null anim = 477 +14006 - Pot-boiler anim = 477 +14007 - Pot-boiler anim = 3105 +14008 - Pot-boiler anim = 3105 +14009 - Pot-boiler anim = 3105 +14035 - Fishing Contest Banner anim = 3843 +14172 - null anim = 475 +14174 - Driftwood anim = 3743 +14179 - Light anim = 3101 +14283 - Banner anim = 3927 +14310 - null anim = 3932 +14311 - null anim = 3932 +14312 - null anim = 3932 +14313 - null anim = 3932 +14360 - Cauldron anim = 3939 +14361 - null anim = 481 +14362 - Charms anim = 468 +14428 - Fishing spot anim = 525 +14434 - Gas bubble anim = 523 +14437 - null anim = 524 +14438 - null anim = 524 +14755 - Banner anim = 3940 +14756 - Banner anim = 3940 +14757 - Banner anim = 3940 +14814 - Rock anim = 3943 +14815 - Rock anim = 3943 +14816 - Rock anim = 3943 +14817 - Rock anim = 3943 +14825 - Obelisk anim = 3944 +14835 - Rocks anim = 523 +14836 - Rocks anim = 523 +14837 - Rocks anim = 523 +14838 - Rocks anim = 523 +14839 - Rocks anim = 523 +14840 - Rocks anim = 523 +14841 - Rocks anim = 523 +14842 - Rocks anim = 523 +14843 - Rocks anim = 523 +14844 - Rocks anim = 523 +14845 - Rocks anim = 523 +14846 - Rocks anim = 523 +14847 - Rocks anim = 523 +14848 - Rocks anim = 523 +14849 - Rocks anim = 523 +14883 - Rocks anim = 523 +14884 - Rocks anim = 523 +14885 - Rocks anim = 523 +14886 - Rocks anim = 523 +14887 - Rocks anim = 523 +14888 - Rocks anim = 523 +14889 - Rocks anim = 523 +14890 - Rocks anim = 523 +14955 - null anim = 3976 +14960 - Firebox anim = 3976 +14976 - Evil claw anim = 3998 +14996 - null anim = 3107 +15000 - Pinball Post anim = 4005 +15001 - Pinball Post anim = 4006 +15002 - Pinball Post anim = 4005 +15003 - Pinball Post anim = 4006 +15004 - Pinball Post anim = 4005 +15005 - Pinball Post anim = 4006 +15006 - Pinball Post anim = 4005 +15007 - Pinball Post anim = 4006 +15008 - Pinball Post anim = 4005 +15009 - Pinball Post anim = 4006 +15017 - null anim = 4015 +15018 - null anim = 4013 +15021 - null anim = 4014 +15156 - Fire anim = 475 +15159 - null anim = 475 +15161 - null anim = 481 +15206 - Fire remains anim = 475 +15207 - Fire remains anim = 475 +15208 - Fire remains anim = 475 +15209 - Fire remains anim = 475 +15210 - Fire remains anim = 475 +15214 - Steam Vent anim = 523 +15229 - Lift Engine anim = 4022 +15238 - null anim = 4022 +15253 - Rocks anim = 523 +15254 - Rocks anim = 523 +15255 - Rocks anim = 523 +15466 - Stone crusher anim = 3699 +15468 - Power saw anim = 3698 +15469 - Embalming tube anim = 3700 +15470 - null anim = 3700 +15477 - Portal anim = 3174 +15478 - Portal anim = 3174 +15479 - Portal anim = 3174 +15480 - Portal anim = 3174 +15481 - Portal anim = 3174 +15482 - Portal anim = 3174 +15486 - Pigeon anim = 4133 +15487 - Chimney anim = 4132 +15490 - Kalphite Queen anim = 6477 +15491 - Rocks anim = 523 +15492 - Rocks anim = 523 +15493 - Rocks anim = 523 +15506 - Wheat anim = 6470 +15508 - Wheat anim = 6470 +15538 - null anim = 4126 +15539 - null anim = 4126 +15547 - Clock anim = 3511 +15570 - Rocks anim = 523 +15571 - Rocks anim = 523 +15572 - Rocks anim = 523 +15573 - Rocks anim = 523 +15574 - Rocks anim = 523 +15575 - Rocks anim = 523 +15599 - Crate anim = 3206 +15600 - Crates anim = 3206 +15617 - Catapult anim = 4157 +15618 - Catapult anim = 4157 +15619 - Catapult anim = 4157 +15620 - Catapult anim = 4157 +15621 - Magical Animator anim = 4161 +15624 - Dummy anim = 4163 +15625 - Dummy anim = 4163 +15626 - Dummy anim = 4163 +15627 - Dummy anim = 4163 +15628 - Dummy anim = 4163 +15629 - Dummy anim = 4163 +15630 - Dummy anim = 4163 +15689 - null anim = 3107 +15709 - Zanik anim = 4220 +15710 - null anim = 4220 +15727 - Drip anim = 4217 +15728 - Drips anim = 4218 +15817 - Rock anim = 1727 +15818 - Small rock anim = 1727 +15819 - Rock anim = 1727 +15838 - Bamboo Pipes anim = 4239 +15839 - Bamboo Pipes anim = 4239 +15848 - Hopper anim = 4239 +15849 - Hopper anim = 4239 +15856 - Bridge anim = 4239 +15857 - Bridge anim = 4239 +15864 - Bamboo Pipes anim = 4239 +15865 - Bamboo Pipes anim = 4239 +15874 - Hopper anim = 4239 +15875 - Hopper anim = 4239 +15882 - Bridge anim = 4239 +15883 - Bridge anim = 4239 +15905 - Boiler anim = 4239 +15908 - Boiler anim = 4239 +15911 - Boiler anim = 4239 +15914 - Boiler anim = 4239 +15923 - Bottle machine anim = 4260 +15925 - Conveyor Belt anim = 4241 +15927 - Conveyor Belt anim = 4240 +15929 - Steam Pump anim = 4242 +15937 - Water Pump anim = 4239 +15941 - Red Flowers anim = 4239 +15942 - Blue Flowers anim = 4239 +15944 - Bridge anim = 4239 +15949 - Jungle Tree anim = 4239 +15952 - Jungle Tree anim = 4239 +15955 - Jungle Tree anim = 4239 +15962 - Bitternut Tree anim = 4247 +15963 - Bitternut Tree anim = 4247 +15964 - Bitternut Tree anim = 4246 +15965 - Bitternut Tree anim = 4246 +15966 - Bitternut Tree anim = 4245 +15967 - Bitternut Tree anim = 4245 +15968 - Bitternut Tree anim = 4244 +15969 - Bitternut Tree anim = 4244 +15996 - Portal anim = 3174 +16032 - null anim = 4274 +16042 - null anim = 523 +16043 - Portal of Death anim = 4284 +16044 - Portal of Death anim = 4284 +16050 - Portal anim = 504 +16065 - Rickety door anim = 4284 +16066 - Rickety door anim = 4284 +16082 - Portal anim = 504 +16089 - Oozing barrier anim = 4284 +16090 - Oozing barrier anim = 4284 +16109 - Stinking tendrils anim = 2173 +16110 - Dripping tendrils anim = 2173 +16111 - Tendrils anim = 2173 +16116 - Portal anim = 504 +16119 - null anim = 2379 +16123 - Gate of War anim = 4284 +16124 - Gate of War anim = 4284 +16136 - Rock anim = 1727 +16150 - Portal anim = 504 +16190 - Lightning anim = 4308 +16191 - Lightning anim = 4309 +16213 - Fairy workbench anim = 3246 +16215 - Fairy workbench anim = 3247 +16303 - Small rock anim = 1727 +16356 - null anim = 4323 +16357 - null anim = 4324 +16361 - null anim = 4325 +16362 - null anim = 4325 +16363 - null anim = 4325 +16469 - null anim = 481 +16476 - Tomb Door anim = 4338 +16483 - An anonymous looking door anim = 4339 +16484 - An anonymous looking door anim = 4339 +16485 - An anonymous looking door anim = 4339 +16486 - An anonymous looking door anim = 4339 +16487 - An anonymous looking door anim = 4339 +16488 - An anonymous looking door anim = 4339 +16489 - An anonymous looking door anim = 4339 +16490 - An anonymous looking door anim = 4339 +16491 - An anonymous looking door anim = 4339 +16492 - An anonymous looking door anim = 4339 +16493 - An anonymous looking door anim = 4339 +16494 - An anonymous looking door anim = 4339 +16495 - Sarcophagus anim = 4336 +16496 - Sarcophagus anim = 4336 +16497 - Sarcophagus anim = 4336 +16498 - Sarcophagus anim = 4336 +16499 - Sarcophagus anim = 4336 +16500 - Sarcophagus anim = 4336 +16501 - Urn anim = 4335 +16502 - Urn anim = 4335 +16503 - Urn anim = 4335 +16504 - Urn anim = 4335 +16505 - Urn anim = 4335 +16506 - Urn anim = 4335 +16507 - Urn anim = 4335 +16508 - Urn anim = 4335 +16509 - Urn anim = 4335 +16510 - Urn anim = 4335 +16511 - Urn anim = 4335 +16512 - Urn anim = 4335 +16513 - Urn anim = 4335 +16514 - Urn anim = 4335 +16515 - Urn anim = 4335 +16516 - Urn anim = 4335 +16517 - Speartrap anim = 459 +16538 - null anim = 4338 +16539 - null anim = 4338 +16540 - null anim = 4338 +16541 - null anim = 4338 +16542 - null anim = 4338 +16543 - null anim = 4338 +16544 - null anim = 4338 +16545 - null anim = 4338 +16546 - null anim = 4338 +16568 - Standard anim = 1730 +16569 - Standard anim = 1730 +16576 - Rocks anim = 523 +16577 - Rocks anim = 523 +16578 - Rocks anim = 523 +16579 - Rocks anim = 523 +16580 - Rocks anim = 523 +16581 - Rocks anim = 523 +16582 - Rocks anim = 523 +16583 - Rocks anim = 523 +16584 - Rocks anim = 523 +16599 - My life anim = 4354 +16600 - Hurdle anim = 4357 +16601 - Note anim = 4357 +16602 - Note anim = 4357 +16604 - Dream tree anim = 4355 +16619 - Zero anim = 4356 +16620 - One anim = 4356 +16621 - Two anim = 4356 +16622 - Three anim = 4356 +16623 - Four anim = 4356 +16624 - Five anim = 4356 +16625 - Six anim = 4356 +16626 - Seven anim = 4356 +16627 - Eight anim = 4356 +16628 - Nine anim = 4356 +16632 - Platform anim = 4358 +16633 - Platform anim = 4358 +16634 - Platform anim = 4358 +16635 - Platform anim = 4358 +16636 - Platform anim = 4358 +16637 - Platform anim = 4358 +16650 - null anim = 2871 +16661 - null anim = 481 +16662 - null anim = 2871 +16681 - null anim = 481 +16686 - Portal anim = 504 +16691 - Hat rack anim = 4393 +16692 - Hat rack anim = 4393 +16701 - Light anim = 4392 +16729 - Flowers anim = 4126 +16730 - Flowers anim = 4126 +16731 - Flowers anim = 4126 +16810 - Ceremonial Brazier anim = 4408 +16811 - Ceremonial Brazier anim = 4408 +16812 - Cooker anim = 4394 +16813 - Rack anim = 4395 +16814 - Stool anim = 4396 +16815 - Table anim = 4397 +16816 - null anim = 4398 +16827 - Table anim = 4377 +16828 - Table anim = 4377 +16830 - null anim = 4359 +16832 - null anim = 4359 +16834 - null anim = 4359 +16836 - null anim = 4359 +16838 - null anim = 4359 +16840 - null anim = 4359 +16842 - null anim = 4359 +16849 - Dice anim = 4361 +16850 - Dice anim = 4361 +16851 - Dice anim = 4361 +16852 - Dice anim = 4361 +16853 - Dice anim = 4361 +16854 - Dice anim = 4361 +16855 - Dice anim = 4360 +16856 - Dream puff anim = 4363 +16857 - Dream puff anim = 4364 +16859 - Hanging pirate anim = 4399 +16861 - Hammock anim = 4431 +16901 - Lantern anim = 1073 +17010 - Altar anim = 503 +17025 - null anim = 4408 +17116 - Pool of Slime anim = 493 +17117 - Pool of Slime anim = 493 +17118 - Pool of Slime anim = 493 +17130 - Office table anim = 4535 +17161 - Cauldron anim = 3939 +17162 - Cauldron anim = 3939 +17163 - null anim = 3939 +17196 - Goblin crowd anim = 4564 +17197 - Gnome crowd anim = 4565 +17198 - Gnome crowd anim = 4565 +17199 - Goblin crowd anim = 4566 +17200 - Goblin crowd anim = 4566 +17201 - Gnome crowd anim = 4567 +17202 - Gnome crowd anim = 4567 +17203 - Goblin crowd anim = 4568 +17204 - Goblin crowd anim = 4568 +17205 - Gnome crowd anim = 4569 +17206 - Gnome crowd anim = 4569 +17208 - null anim = 4577 +17235 - Table anim = 4557 +17236 - Hammock anim = 4431 +17237 - Torch anim = 3105 +17238 - Aspidistra plant anim = 4559 +17240 - Oaknock's machine anim = 4560 +17241 - Oaknock's machine anim = 4560 +17242 - Broken cogs anim = 4563 +17243 - Cogs anim = 4563 +17245 - Oaknock's Machine anim = 4561 +17246 - Oaknock's Machine anim = 4561 +17247 - Oaknock's Machine anim = 4561 +17248 - Oaknock's exchanger anim = 4562 +17249 - Oaknock's exchanger anim = 4562 +17274 - Argento anim = 4572 +17279 - Argento anim = 4571 +17280 - null anim = 4560 +17281 - null anim = 4563 +17282 - null anim = 4561 +17283 - null anim = 4562 +17324 - null anim = 4595 +17325 - Limestone fireplace anim = 3105 +17364 - Rock anim = 1727 +17365 - Small rock anim = 1727 +17366 - Rock anim = 1727 +17383 - Rocks anim = 523 +17384 - Rocks anim = 523 +17391 - Rocks anim = 523 +17434 - Wardrobe anim = 4599 +17436 - Stone table anim = 4621 +17437 - Stone table anim = 4622 +17455 - Crystal ball anim = 4627 +17461 - Ornate candle anim = 4628 +17509 - Waste pipes anim = 4746 +17511 - Waste pipes anim = 4747 +17627 - Washing Line anim = 4778 +17632 - null anim = 4744 +18075 - Wall anim = 4744 +18080 - Wall anim = 4745 +18102 - Falling door anim = 4744 +18128 - null anim = 4744 +18131 - null anim = 4745 +18134 - null anim = 4744 +18145 - Decorated wall anim = 4743 +18172 - Hammock anim = 4431 +18186 - Rowboat anim = 3743 +18187 - Rowboat anim = 3743 +18188 - null anim = 3743 +18242 - null anim = 4782 +18315 - null anim = 4126 +18323 - null anim = 4781 +18326 - Crane anim = 4798 +18348 - null anim = 3743 +18349 - null anim = 3743 +18350 - null anim = 3743 +18357 - Wreck anim = 4781 +18358 - null anim = 4783 +18366 - Crow nest anim = 4781 +18367 - Crate anim = 3743 +18368 - Crate anim = 3743 +18402 - null anim = 4781 +18403 - Kennith's ball anim = 3743 +18404 - Bottle anim = 3743 +18500 - null anim = 4860 +18511 - Water wheel anim = 1051 +18512 - Water wheel anim = 1051 +18513 - null anim = 522 +18514 - null anim = 522 +18524 - null anim = 4860 +18642 - Press support anim = 4894 +18652 - Door anim = 4879 +18653 - Door anim = 4880 +18654 - Door anim = 4881 +18655 - Door anim = 4879 +18656 - Door anim = 4880 +18657 - Door anim = 4881 +18658 - Door anim = 4879 +18659 - Door anim = 4880 +18661 - Water Tank anim = 4895 +18668 - Cog anim = 4896 +18672 - Cog anim = 4896 +18674 - Cog anim = 4896 +18677 - Cog anim = 4896 +18681 - Cog anim = 4896 +18683 - Cog anim = 4896 +18689 - null anim = 4899 +18690 - Extractor hat anim = 4883 +18694 - Extractor gun anim = 4897 +18695 - Extractor gun anim = 4897 +18723 - null anim = 4898 +18725 - null anim = 4900 +18760 - Tunnel wall anim = 4901 +18841 - Dolphin anim = 5012 +18842 - Fish anim = 5012 +18844 - null anim = 1881 +18875 - Cactus anim = 5055 +18960 - Cart Camel anim = 5044 +18967 - Rocks anim = 523 +18968 - Rocks anim = 523 +18969 - Rocks anim = 523 +18970 - Rocks anim = 523 +18971 - Rocks anim = 523 +18972 - Rocks anim = 523 +18973 - Rocks anim = 523 +18974 - Rocks anim = 523 +18975 - Rocks anim = 523 +18976 - Rocks anim = 523 +18977 - Rocks anim = 523 +18978 - Rocks anim = 523 +18979 - Rocks anim = 523 +18980 - Rocks anim = 523 +18981 - Rocks anim = 523 +18982 - Rocks anim = 523 +18983 - Rocks anim = 523 +18984 - Rocks anim = 523 +18985 - Rocks anim = 523 +18986 - Rocks anim = 523 +18987 - Rocks anim = 523 +18988 - Rocks anim = 523 +18989 - Rocks anim = 523 +18990 - Rocks anim = 523 +19037 - Cage with gublinch anim = 5073 +19038 - Wintumber tree anim = 5058 +19126 - Plank anim = 3743 +19127 - Candles anim = 2564 +19128 - Basket anim = 5141 +19129 - Basket anim = 5141 +19130 - Air balloon anim = 5141 +19133 - null anim = 5141 +19134 - null anim = 5141 +19135 - null anim = 5141 +19136 - null anim = 5141 +19137 - null anim = 5141 +19138 - null anim = 5141 +19139 - null anim = 5141 +19140 - null anim = 5141 +19141 - null anim = 5141 +19142 - null anim = 5141 +19143 - null anim = 5141 +19144 - null anim = 5141 +19156 - Basket anim = 5109 +19164 - Basket anim = 5109 +19172 - Raw bird anim = 3180 +19173 - Raw hunting beast anim = 3180 +19174 - Bird snare anim = 5170 +19176 - Bird snare anim = 5169 +19177 - Bird snare anim = 5173 +19178 - Bird snare anim = 5174 +19179 - Bird snare anim = 5173 +19180 - Bird snare anim = 5174 +19181 - Bird snare anim = 5173 +19182 - Bird snare anim = 5174 +19183 - Bird snare anim = 5173 +19184 - Bird snare anim = 5174 +19185 - Bird snare anim = 5173 +19186 - Bird snare anim = 5174 +19188 - Box trap anim = 5175 +19189 - Shaking box anim = 5179 +19190 - Shaking box anim = 5179 +19191 - Shaking box anim = 5179 +19192 - Box trap anim = 5180 +19193 - Box trap anim = 5175 +19194 - Box trap anim = 5176 +19195 - Box trap anim = 5177 +19196 - Box trap anim = 5178 +19197 - Box trap anim = 5175 +19198 - Box trap anim = 5176 +19199 - Box trap anim = 5177 +19200 - Box trap anim = 5178 +19201 - Box trap anim = 5175 +19202 - Box trap anim = 5176 +19203 - Box trap anim = 5177 +19204 - Box trap anim = 5178 +19205 - Boulder anim = 5197 +19206 - Deadfall anim = 5193 +19207 - Deadfall anim = 5195 +19208 - Deadfall anim = 5196 +19209 - Deadfall anim = 5195 +19210 - Deadfall anim = 5196 +19211 - Deadfall anim = 5195 +19212 - Deadfall anim = 5196 +19213 - Deadfall anim = 5195 +19214 - Deadfall anim = 5196 +19215 - Boulder anim = 5197 +19216 - Boulder anim = 5197 +19217 - Boulder anim = 5197 +19218 - Boulder anim = 5197 +19219 - Deadfall anim = 5194 +19221 - Occupied perch anim = 5203 +19223 - Magic box anim = 5220 +19224 - Magic box failed anim = 5219 +19225 - Magic box anim = 5222 +19226 - Magic box anim = 5221 +19253 - null anim = 5235 +19254 - null anim = 5235 +19255 - null anim = 5235 +19256 - null anim = 5235 +19257 - null anim = 5235 +19258 - null anim = 5235 +19259 - null anim = 5235 +19260 - null anim = 5235 +19261 - null anim = 5235 +19262 - null anim = 5235 +19263 - null anim = 5235 +19264 - null anim = 5235 +19265 - null anim = 5235 +19266 - null anim = 5235 +19267 - null anim = 5235 +19268 - null anim = 5235 +19334 - Broken snare anim = 5237 +19335 - Rabbit snare anim = 5239 +19336 - Rabbit snare anim = 5239 +19441 - null anim = 5260 +19442 - null anim = 5260 +19443 - null anim = 5260 +19444 - null anim = 5260 +19445 - null anim = 5260 +19446 - null anim = 5260 +19447 - null anim = 5260 +19448 - null anim = 5260 +19449 - null anim = 5260 +19450 - null anim = 5260 +19451 - null anim = 5260 +19452 - null anim = 5260 +19453 - null anim = 5260 +19454 - null anim = 5260 +19455 - null anim = 5260 +19456 - null anim = 5260 +19457 - null anim = 5260 +19458 - null anim = 5260 +19459 - null anim = 5260 +19460 - null anim = 5260 +19461 - null anim = 5260 +19462 - null anim = 5260 +19463 - null anim = 5260 +19464 - null anim = 5260 +19465 - null anim = 5260 +19466 - null anim = 5260 +19467 - null anim = 5260 +19468 - null anim = 5260 +19469 - null anim = 5260 +19470 - null anim = 5260 +19471 - null anim = 5260 +19472 - null anim = 5260 +19473 - null anim = 5260 +19474 - null anim = 5260 +19475 - null anim = 5260 +19476 - null anim = 5260 +19477 - null anim = 5260 +19478 - null anim = 5260 +19479 - null anim = 5260 +19480 - null anim = 5260 +19481 - null anim = 5260 +19482 - null anim = 5260 +19483 - null anim = 5260 +19484 - null anim = 5260 +19485 - null anim = 5260 +19486 - null anim = 5261 +19487 - null anim = 5261 +19488 - null anim = 5260 +19489 - null anim = 5260 +19490 - null anim = 5261 +19491 - null anim = 5261 +19495 - null anim = 5260 +19496 - null anim = 5260 +19497 - null anim = 5260 +19498 - null anim = 5260 +19499 - null anim = 5260 +19500 - null anim = 5260 +19501 - null anim = 5260 +19502 - null anim = 5260 +19503 - null anim = 5260 +19505 - null anim = 5260 +19506 - null anim = 5260 +19508 - null anim = 5260 +19509 - null anim = 5260 +19511 - null anim = 5260 +19512 - null anim = 5260 +19514 - null anim = 5260 +19515 - null anim = 5260 +19517 - null anim = 5260 +19518 - null anim = 5260 +19520 - null anim = 5260 +19521 - null anim = 5260 +19523 - null anim = 5260 +19524 - null anim = 5260 +19526 - null anim = 5260 +19527 - null anim = 5260 +19529 - null anim = 5260 +19530 - null anim = 5260 +19532 - null anim = 5260 +19533 - null anim = 5260 +19535 - null anim = 5260 +19536 - null anim = 5260 +19538 - null anim = 5260 +19539 - null anim = 5260 +19541 - null anim = 5260 +19542 - null anim = 5260 +19544 - null anim = 5260 +19545 - null anim = 5260 +19547 - null anim = 5260 +19548 - null anim = 5260 +19550 - null anim = 5260 +19551 - null anim = 5260 +19554 - null anim = 5260 +19555 - null anim = 5260 +19556 - null anim = 5260 +19557 - null anim = 5260 +19558 - null anim = 5260 +19559 - null anim = 5260 +19560 - null anim = 5260 +19561 - null anim = 5260 +19562 - null anim = 5260 +19564 - null anim = 5260 +19565 - null anim = 5260 +19567 - null anim = 5260 +19568 - null anim = 5260 +19570 - null anim = 5260 +19571 - null anim = 5260 +19573 - null anim = 5260 +19574 - null anim = 5260 +19576 - null anim = 5260 +19577 - null anim = 5260 +19579 - null anim = 5260 +19580 - null anim = 5260 +19582 - null anim = 5260 +19583 - null anim = 5260 +19585 - null anim = 5260 +19586 - null anim = 5260 +19588 - null anim = 5260 +19589 - null anim = 5260 +19591 - null anim = 5260 +19592 - null anim = 5260 +19642 - null anim = 5260 +19643 - null anim = 5260 +19644 - null anim = 5261 +19645 - null anim = 5261 +19646 - null anim = 5260 +19647 - null anim = 5260 +19648 - null anim = 5261 +19649 - null anim = 5261 +19650 - Young tree anim = 5267 +19654 - Net trap anim = 5269 +19655 - Net trap anim = 5268 +19656 - Net trap anim = 5271 +19657 - Net trap anim = 5270 +19658 - Net trap anim = 5268 +19659 - Net trap anim = 5269 +19660 - Net trap anim = 5270 +19661 - Net trap anim = 5271 +19662 - Young tree anim = 5267 +19666 - Net trap anim = 5268 +19667 - Net trap anim = 5269 +19668 - Net trap anim = 5270 +19669 - Net trap anim = 5271 +19670 - Young tree anim = 5267 +19674 - Net trap anim = 5268 +19675 - Net trap anim = 5269 +19676 - Net trap anim = 5270 +19677 - Net trap anim = 5271 +19678 - Young tree anim = 5267 +19686 - null anim = 5278 +19687 - null anim = 5278 +19688 - null anim = 5278 +19689 - null anim = 5278 +19785 - null anim = 475 +19786 - null anim = 475 +19851 - Boulder anim = 5197 +19881 - Campfire anim = 475 +19882 - null anim = 475 +19883 - null anim = 475 +19884 - Campfire anim = 475 +19936 - Bird feeder anim = 5308 +19937 - Bird feeder anim = 5308 +19938 - Bird feeder anim = 5308 +19939 - Bird feeder anim = 5308 +19940 - Bird feeder anim = 5308 +19941 - Bird feeder anim = 5308 +19942 - Bird feeder anim = 5308 +19943 - Bird feeder anim = 5308 +19944 - Bird feeder anim = 5308 +19951 - null anim = 5260 +19952 - null anim = 5260 +19953 - null anim = 5260 +19981 - Pedestal anim = 5295 +19982 - Pedestal anim = 5296 +19983 - Pedestal anim = 5297 +20000 - Fire anim = 475 +20001 - Fire anim = 475 +20022 - Pillar anim = 5350 +20023 - Pillar anim = 5350 +20024 - Pillar anim = 5350 +20026 - Pillar anim = 5350 +20027 - Pillar anim = 5350 +20028 - Pillar anim = 5350 +20030 - Pillar anim = 5350 +20031 - Pillar anim = 5350 +20032 - Pillar anim = 5350 +20034 - Pillar anim = 5350 +20035 - Pillar anim = 5350 +20036 - Pillar anim = 5350 +20040 - Machine anim = 5351 +20066 - null anim = 5360 +20067 - null anim = 5360 +20068 - null anim = 5360 +20069 - null anim = 5360 +20070 - null anim = 5360 +20071 - null anim = 5360 +20072 - null anim = 5360 +20073 - null anim = 5360 +20074 - null anim = 5360 +20075 - null anim = 5360 +20076 - null anim = 5360 +20077 - null anim = 5360 +20078 - null anim = 5360 +20079 - null anim = 5360 +20080 - null anim = 5360 +20081 - null anim = 5360 +20082 - null anim = 5360 +20083 - null anim = 5360 +20100 - Childerkin slaves anim = 5068 +20117 - Childerkin slaves anim = 5068 +20119 - null anim = 5073 +20120 - null anim = 5073 +20121 - null anim = 5073 +20122 - null anim = 5073 +20123 - null anim = 5073 +20124 - null anim = 5073 +20125 - null anim = 5073 +20126 - null anim = 5073 +20127 - null anim = 5073 +20128 - null anim = 5073 +20133 - Egg launcher anim = 5430 +20199 - Door anim = 1433 +20200 - Door anim = 1433 +20201 - Door anim = 1433 +20202 - Door anim = 1433 +20203 - Door anim = 1433 +20204 - Door anim = 1433 +20205 - Door anim = 1433 +20206 - Door anim = 1433 +20207 - Door anim = 1433 +20208 - Door anim = 1433 +20209 - Door anim = 1433 +20232 - Lava crater anim = 5415 +20233 - Poison crater anim = 5415 +20234 - Lava crater anim = 5415 +20235 - Poison crater anim = 5415 +20246 - null anim = 5422 +20247 - Horn of glory anim = 5423 +20248 - Horn of glory anim = 5423 +20259 - Egg launcher anim = 5429 +20260 - Hopper anim = 5431 +20261 - Hopper anim = 5431 +20262 - Hopper anim = 5431 +20263 - Egg launcher anim = 5430 +20264 - Egg hopper anim = 5432 +20265 - Egg hopper anim = 5432 +20266 - Egg hopper anim = 5432 +20271 - Floor anim = 1112 +20273 - Speartrap anim = 459 +20453 - Armour anim = 5603 +20455 - Skeleton anim = 5603 +20457 - Skeleton anim = 5603 +20468 - Passageway anim = 5599 +20469 - Passageway anim = 5601 +20510 - Crate anim = 3743 +20511 - Barrel anim = 3743 +20532 - Bars anim = 5599 +20533 - Bars anim = 5600 +20534 - Bars anim = 5601 +20537 - null anim = 5598 +20538 - null anim = 5598 +20580 - null anim = 5605 +20621 - null anim = 5598 +20622 - null anim = 5598 +20660 - null anim = 5605 +20686 - null anim = 5598 +20687 - null anim = 5598 +20725 - null anim = 5605 +20751 - null anim = 5598 +20752 - null anim = 5598 +20790 - null anim = 5605 +20915 - Floor anim = 1112 +20916 - Floor anim = 1112 +20917 - Floor anim = 1112 +20918 - Floor anim = 1112 +20919 - Floor anim = 1112 +20942 - Wall anim = 5631 +20943 - Wall anim = 5631 +20946 - Wall anim = 5631 +20947 - Wall anim = 5631 +20950 - Wall anim = 5631 +20951 - Wall anim = 5631 +20954 - Wall anim = 5631 +20955 - Wall anim = 5631 +20972 - null anim = 5603 +20973 - null anim = 5603 +20974 - null anim = 5604 +20975 - null anim = 5604 +20976 - null anim = 5604 +20985 - Mummy anim = 5564 +20986 - Mummy anim = 5564 +20995 - Golf-cart anim = 5740 +20996 - Table anim = 5742 +21001 - Interrogation chair anim = 5740 +21002 - Steam generator anim = 5737 +21003 - null anim = 5745 +21008 - Drill anim = 5743 +21009 - Lathe anim = 5744 +21085 - Spinning light anim = 5738 +21089 - null anim = 5728 +21090 - null anim = 5730 +21091 - null anim = 5729 +21092 - Crazy penguin anim = 5728 +21093 - Crazy penguin anim = 5730 +21094 - Crazy penguin anim = 5729 +21099 - null anim = 3743 +21100 - null anim = 3743 +21101 - null anim = 3743 +21108 - null anim = 5739 +21109 - null anim = 5739 +21110 - null anim = 3743 +21111 - null anim = 3743 +21120 - Stepping Stone anim = 3743 +21121 - Stepping Stone anim = 3743 +21122 - Stepping Stone anim = 3743 +21123 - Stepping Stone anim = 3743 +21124 - Stepping Stone anim = 3743 +21146 - null anim = 5741 +21148 - Ice anim = 5734 +21149 - Ice anim = 5734 +21150 - Ice anim = 5734 +21151 - Ice anim = 5734 +21152 - Ice anim = 5734 +21153 - Ice anim = 5734 +21154 - Ice anim = 5734 +21155 - Ice anim = 5734 +21156 - Ice anim = 5734 +21176 - Boat anim = 3742 +21177 - Boat anim = 3742 +21251 - Rocks anim = 523 +21252 - Rocks anim = 523 +21253 - Rocks anim = 523 +21254 - Rocks anim = 523 +21255 - Rocks anim = 523 +21256 - Rocks anim = 523 +21257 - Rocks anim = 523 +21258 - Rocks anim = 523 +21259 - Rocks anim = 523 +21260 - Rocks anim = 523 +21261 - Rocks anim = 523 +21262 - Rocks anim = 523 +21263 - Rocks anim = 523 +21264 - Rocks anim = 523 +21265 - Rocks anim = 523 +21266 - Rocks anim = 523 +21267 - Rocks anim = 523 +21268 - Rocks anim = 523 +21269 - Rocks anim = 523 +21270 - Rocks anim = 523 +21271 - Funeral Pyre anim = 1304 +21273 - Arctic Pine anim = 5773 +21355 - Large Geyser anim = 5771 +21356 - Small Geyser anim = 5772 +21500 - Banner anim = 5768 +21501 - Banner anim = 5768 +21571 - Rock anim = 1727 +21572 - Small rock anim = 1727 +21573 - Rock anim = 1727 +21620 - Fire anim = 475 +21634 - Fremennik boat anim = 3743 +21635 - Standard anim = 1730 +21636 - Standard anim = 1730 +21637 - Standard anim = 1730 +21638 - null anim = 1730 +21764 - Fountain anim = 5797 +21795 - Fireplace anim = 5798 +21832 - null anim = 5828 +21844 - Water pipes anim = 5829 +21846 - Water pipes anim = 5829 +21852 - null anim = 5830 +21856 - null anim = 5830 +21860 - null anim = 5830 +21864 - null anim = 5830 +21893 - Symbol of life anim = 5844 +21894 - Symbol of life anim = 5844 +21918 - Magic table anim = 5824 +21920 - Spinning pipe anim = 5825 +21930 - Cage anim = 5847 +21931 - Cage anim = 5847 +21942 - null anim = 4860 +21945 - Lighting mechanism anim = 1348 +22105 - Wall anim = 5900 +22106 - Wall anim = 5900 +22107 - Wall anim = 5901 +22108 - Wall anim = 5901 +22109 - Collapsed wall anim = 5900 +22110 - Collapsed wall anim = 5901 +22123 - Stand anim = 5906 +22124 - Stand anim = 5906 +22125 - Candle stand anim = 5906 +22155 - Clock anim = 3511 +22338 - null anim = 5874 +22339 - null anim = 5874 +22347 - null anim = 1727 +22348 - null anim = 1727 +22349 - null anim = 1727 +22418 - Sails anim = 5857 +22419 - Millstones anim = 1731 +22423 - null anim = 1731 +22425 - null anim = 472 +22484 - Fuse anim = 5909 +22497 - Marv (sick) anim = 5975 +22498 - Marv (very sick) anim = 5976 +22499 - Marv (ghastly!) anim = 5977 +22500 - Marv (sick) anim = 5983 +22501 - Marv (very sick) anim = 5984 +22502 - Marv (ghastly!) anim = 5985 +22503 - Marv (Well) anim = 5974 +22504 - Hank (sick) anim = 5975 +22505 - Hank (very sick) anim = 5976 +22506 - Hank (ghastly!) anim = 5977 +22507 - Hank (sick) anim = 5983 +22508 - Hank (very sick) anim = 5984 +22509 - Hank (ghastly!) anim = 5985 +22510 - Hank (Well) anim = 5983 +22511 - Wilf (sick) anim = 5975 +22512 - Wilf (very sick) anim = 5976 +22513 - Wilf (ghastly!) anim = 5977 +22514 - Wilf (sick) anim = 5983 +22515 - Wilf (very sick) anim = 5984 +22516 - Wilf (ghastly!) anim = 5985 +22517 - Wilf (Well) anim = 5974 +22518 - Sarah (sick!) anim = 5975 +22519 - Sarah (very sick!) anim = 5976 +22520 - Sarah (ghastly!) anim = 5977 +22521 - Sarah (sick!) anim = 5983 +22522 - Sarah (very sick!) anim = 5984 +22523 - Sarah (ghastly!) anim = 5985 +22524 - Sarah (Well) anim = 5974 +22525 - Rachel (sick) anim = 5975 +22526 - Rachel (very sick) anim = 5976 +22527 - Rachel (ghastly!) anim = 5977 +22528 - Rachel (sick) anim = 5983 +22529 - Rachel (very sick) anim = 5984 +22530 - Rachel (ghastly!) anim = 5985 +22531 - Rachel (Well) anim = 5974 +22545 - Molanisk anim = 6015 +22663 - Pylon anim = 6069 +22715 - Sink anim = 6037 +22727 - Chimney anim = 6038 +22728 - Wire machine anim = 6038 +22729 - Wire machine anim = 6038 +22730 - Wire anim = 6038 +22732 - Cogs anim = 6038 +22733 - Smoke anim = 5745 +22734 - Moths anim = 6036 +22735 - Zapper anim = 6035 +22736 - Zapper anim = 6035 +22737 - Zapper anim = 6034 +22760 - Lamp anim = 6029 +22761 - Lamp anim = 6029 +22762 - Lamp anim = 6029 +22763 - Empty lamp anim = 6031 +22764 - Lamp anim = 6032 +22823 - Thingymajig anim = 6027 +22826 - Magic ball anim = 6028 +22862 - Water anim = 6024 +22863 - Water anim = 6024 +22864 - Water anim = 6024 +22865 - Water anim = 6024 +22875 - null anim = 6025 +22943 - Stairs anim = 6026 +22973 - Fountain anim = 6023 +22974 - Frog spit anim = 6039 +22975 - Smoke anim = 5745 +22976 - Lamp anim = 6029 +22977 - Broken lamp anim = 6029 +22978 - null anim = 6029 +22979 - null anim = 6029 +22980 - null anim = 6029 +22981 - null anim = 6029 +22982 - null anim = 6029 +22983 - null anim = 6029 +22984 - null anim = 6029 +22985 - null anim = 6029 +22986 - null anim = 6029 +22987 - null anim = 6029 +22988 - null anim = 6029 +22989 - null anim = 6029 +22990 - null anim = 6029 +22991 - null anim = 6029 +22992 - null anim = 6029 +22993 - null anim = 6029 +22994 - null anim = 6029 +22995 - null anim = 6029 +22996 - null anim = 6029 +22997 - null anim = 6029 +22998 - null anim = 6029 +22999 - null anim = 6029 +23000 - null anim = 6029 +23001 - null anim = 6029 +23002 - null anim = 6029 +23003 - null anim = 6029 +23004 - null anim = 6029 +23005 - null anim = 6029 +23006 - null anim = 6029 +23007 - null anim = 6029 +23008 - null anim = 6029 +23009 - null anim = 6029 +23010 - null anim = 6029 +23011 - null anim = 6029 +23012 - null anim = 6029 +23013 - null anim = 6029 +23014 - null anim = 6029 +23015 - null anim = 6029 +23016 - null anim = 6029 +23017 - null anim = 6029 +23018 - null anim = 6029 +23019 - null anim = 6029 +23020 - null anim = 6029 +23021 - null anim = 6029 +23022 - null anim = 6029 +23023 - null anim = 6029 +23024 - null anim = 6029 +23025 - null anim = 6029 +23026 - null anim = 6029 +23027 - null anim = 6029 +23028 - null anim = 6029 +23029 - null anim = 6029 +23030 - null anim = 6029 +23031 - null anim = 6029 +23032 - null anim = 6029 +23033 - null anim = 6029 +23034 - null anim = 6029 +23035 - null anim = 6029 +23036 - null anim = 6029 +23037 - null anim = 6029 +23038 - null anim = 6029 +23039 - null anim = 6029 +23040 - null anim = 6029 +23041 - null anim = 6029 +23046 - Fire anim = 3105 +23063 - Camp fire anim = 475 +23093 - Portal anim = 504 +23094 - Floor anim = 504 +23095 - Portal anim = 504 +23098 - null anim = 504 +23118 - Warren exit anim = 3101 +23145 - null anim = 3101 +23165 - Rock anim = 1727 +23172 - Drip anim = 4217 +23173 - Drips anim = 4218 +23215 - null anim = 6123 +23284 - Zanik anim = 6211 +23306 - Goblin crowd anim = 6161 +23307 - Goblin crowd anim = 6162 +23308 - Goblin crowd anim = 6163 +23309 - Goblin crowd anim = 6161 +23310 - Goblin crowd anim = 6162 +23311 - Goblin crowd anim = 6163 +23312 - Goblin crowd anim = 6161 +23313 - Goblin crowd anim = 6162 +23314 - Goblin crowd anim = 6163 +23315 - Crowd of dwarves anim = 6164 +23316 - Crowd of dwarves anim = 6165 +23317 - Crowd of dwarves anim = 6166 +23318 - Council members anim = 6167 +23319 - Cave gobins anim = 6168 +23380 - null anim = 3107 +23492 - null anim = 6170 +23507 - null anim = 1868 +23514 - null anim = 1868 +23526 - Sample table anim = 6196 +23527 - Sample table anim = 6196 +23551 - Chest anim = 2709 +23552 - Chest anim = 2709 +23553 - null anim = 464 +23554 - Rocks anim = 523 +23555 - Rocks anim = 523 +23556 - Rocks anim = 523 +23557 - Rocks anim = 523 +23558 - Rocks anim = 523 +23559 - Rocks anim = 523 +23591 - Kalphite queen legs anim = 6269 +23611 - Cocoon anim = 6274 +23921 - Dummy anim = 6481 +23961 - Lathe anim = 5744 +23962 - Drill anim = 5743 +23963 - Hearth anim = 4130 +23967 - Sign anim = 4128 +23968 - Sign anim = 4128 +23969 - Sign anim = 4128 +23970 - Sign anim = 4128 +23971 - null anim = 4128 +23972 - Sign anim = 4128 +23973 - null anim = 4128 +23974 - Sign anim = 4128 +23975 - null anim = 4128 +23976 - null anim = 4128 +23977 - Sign anim = 4128 +23978 - Sign anim = 4128 +23979 - null anim = 4131 +23980 - Sign anim = 4129 +23981 - null anim = 4128 +23982 - Sign anim = 4128 +24017 - null anim = 6491 +24025 - Lamp anim = 1868 +24026 - Lantern anim = 4127 +24033 - Oil lamp anim = 4125 +24065 - Sails anim = 6495 +24067 - Mill anim = 6493 +24068 - Mill anim = 6494 +24094 - Swings anim = 6466 +24095 - Washing line anim = 6467 +24161 - Fountain anim = 6023 +24170 - Washing Line anim = 4778 +24172 - Washing Line anim = 4778 +24194 - Smoking vent anim = 4132 +24195 - Smoking vent anim = 4132 +24265 - Fountain anim = 6492 +24285 - Fireplace anim = 3105 +24313 - Oven anim = 3105 +24328 - Cooking pot anim = 4124 +24329 - Fireplace anim = 4124 +24348 - Candles anim = 2564 +24414 - null anim = 4125 +24417 - null anim = 6426 +24418 - null anim = 6426 +24552 - null anim = 6461 +24553 - null anim = 6461 +24554 - null anim = 6461 +24569 - Snake anim = 6453 +24570 - null anim = 6439 +24677 - Charms anim = 468 +24724 - Gramophone anim = 6522 +24725 - Gramophone anim = 6522 +24726 - Gramophone anim = 6522 +24727 - Gramophone anim = 6522 +24732 - Beanstalk anim = 6497 +24734 - Beanstalk anim = 6499 +24736 - Beanstalk anim = 6500 +24771 - Rupert anim = 6509 +24773 - null anim = 6509 +24774 - null anim = 6509 +24839 - Grimgnash anim = 6506 +24840 - null anim = 6506 +24843 - Floor anim = 6523 +24844 - Floor anim = 6523 +24845 - Floor anim = 6523 +24846 - Floor anim = 6523 +24847 - Floor anim = 6523 +24882 - null anim = 6522 +24984 - Crop circle anim = 6623 +24985 - Crop circle anim = 6624 +24986 - Crop circle anim = 6625 +24987 - Crop circle anim = 6626 +24988 - Centre of crop circle anim = 6627 +24989 - Magic wheat anim = 6623 +24990 - Magic wheat anim = 6625 +24991 - Centre of crop circle anim = 6627 +25022 - Growing wheat anim = 6597 +25023 - Wilting wheat anim = 6598 +25115 - Magic door anim = 6635 +25116 - Magic door anim = 6637 +25118 - Magic door anim = 6636 +25122 - Candle stand anim = 6638 +25123 - Candle stand anim = 6638 +25136 - Vines anim = 6639 +25155 - Fire anim = 6645 +25156 - Fire anim = 6646 +25157 - Jenkins anim = 6652 +25201 - Flames anim = 6653 +25205 - A flag anim = 6656 +25216 - Aged log anim = 3306 +25267 - funeral pyre anim = 3105 +25274 - Whirlpool anim = 6737 +25275 - Whirlpool anim = 6737 +25276 - Mighty torrent anim = 6732 +25277 - Mighty torrent anim = 6732 +25278 - Mighty torrent anim = 6732 +25279 - Mighty torrent anim = 6732 +25280 - null anim = 6731 +25281 - null anim = 6731 +25282 - null anim = 6731 +25283 - null anim = 6731 +25284 - null anim = 6731 +25285 - null anim = 6731 +25292 - Pyre boat anim = 6733 +25293 - Pyre boat anim = 6734 +25294 - Pyre boat anim = 6735 +25295 - Pyre boat anim = 6736 +25374 - campfire anim = 3105 +25401 - Orrery anim = 3579 +25426 - Rocking unicorn anim = 6854 +25440 - Goblin stove anim = 3105 +25441 - Goblin stove anim = 3105 +25442 - null anim = 3105 +25465 - Fire anim = 6853 +25590 - Rat wheel anim = 3230 +25620 - Novice Flag anim = 6873 +25621 - Intermediate Flag anim = 6873 +25622 - Veteran Flag anim = 6874 +25623 - Novice flag anim = 6874 +25624 - Intermediate Flag anim = 6874 +25625 - Veteran Flag anim = 6874 +25626 - null anim = 6875 +25627 - null anim = 6875 +25628 - null anim = 6875 +25634 - null anim = 6874 +25635 - null anim = 6875 +25648 - Dummy anim = 6481 +25654 - Charms anim = 468 +25659 - null anim = 5598 +25664 - Sir Lucan anim = 6912 +25665 - Sir Palomedes anim = 6913 +25666 - Sir Lancelot anim = 6914 +25667 - Sir Bedivere anim = 6915 +25731 - Grandfather clock anim = 1726 +25762 - Sign anim = 4128 +25763 - Clock anim = 3511 +25889 - Sir Tristram anim = 6925 +25944 - The jury anim = 6900 +25945 - The jury anim = 6901 +25946 - The jury anim = 6902 +25947 - The jury anim = 6903 +25955 - Alan anim = 6917 +25956 - Court judge anim = 6898 +26045 - Citizen anim = 6890 +26046 - Citizen anim = 6891 +26047 - Citizen anim = 6892 +26048 - Citizen anim = 6893 +26049 - Citizen anim = 6894 +26050 - Citizen anim = 6895 +26137 - Fly paper anim = 6931 +26192 - null anim = 478 +26205 - Present anim = 6932 +26291 - Big hole anim = 6982 +26302 - Pillar anim = 6069 +26410 - null anim = 3743 +26411 - null anim = 3743 +26412 - null anim = 3743 +26413 - null anim = 3743 +26414 - Large geyser anim = 5771 +26415 - Snow anim = 6995 +26417 - Snowfall anim = 6996 +26418 - Waterfall anim = 7007 +26419 - Waterfall anim = 7007 +26420 - Waterfall anim = 7007 +26421 - Waterfall anim = 7007 +26422 - Waterfall anim = 7007 +26468 - null anim = 7066 +26471 - null anim = 7066 +26472 - null anim = 7067 +26473 - null anim = 7066 +26476 - null anim = 7066 +26477 - null anim = 7066 +26478 - null anim = 7067 +26479 - null anim = 7066 +26481 - null anim = 7067 +26482 - null anim = 7066 +26483 - null anim = 7066 +26484 - null anim = 3440 +26578 - Gas anim = 7087 +26579 - Gas jet anim = 7087 +26597 - null anim = 7097 +26598 - null anim = 7097 +26599 - null anim = 7097 +26600 - null anim = 7097 +26604 - null anim = 5415 +26605 - null anim = 5415 +26708 - Pipe anim = 7097 +26709 - Pipe anim = 7097 +26710 - Pipe anim = 7097 +26711 - Pipe anim = 7097 +26724 - Tree anim = 6069 +26726 - Healthorg anim = 7118 +26727 - Human food anim = 7115 +26728 - Human food anim = 7117 +26729 - Human food anim = 7117 +26730 - null anim = 7120 +26731 - Spirit tree anim = 7138 +26736 - null anim = 7097 +26740 - null anim = 7144 +26741 - null anim = 7146 +26788 - Yewnock's machine anim = 4560 +26789 - Cogs anim = 4563 +26791 - Yewnock's machine anim = 4561 +26792 - Yewnock's exchanger anim = 4562 +26814 - Furnace anim = 7152 +26829 - null anim = 5415 +26830 - null anim = 5415 +26831 - null anim = 493 +26832 - null anim = 493 +26881 - null anim = 7225 +26882 - null anim = 7226 +26971 - Sign anim = 4128 +27039 - Jade vine anim = 7245 +27050 - null anim = 1726 +27051 - Grandfather clock anim = 1726 +27076 - Wild jade vine anim = 7245 +27077 - Wild jade vine anim = 7245 +27078 - Wild jade vine anim = 7245 +27089 - Tree anim = 7252 +27190 - null anim = 7231 +27196 - null anim = 7245 +27197 - null anim = 7245 +27240 - Pitfall anim = 7291 +27241 - Torch anim = 7286 +27251 - Fireplace anim = 3105 +27253 - Fishtank anim = 7283 +27254 - Dark portal anim = 3174 +27274 - Gargoyle anim = 7284 +27275 - Gargoyle anim = 7284 +27276 - Doorway anim = 7284 +27277 - null anim = 7285 \ No newline at end of file diff --git a/dumps/498/498_object_configs.txt b/dumps/498/498_object_configs.txt new file mode 100644 index 000000000..6e3c08e37 --- /dev/null +++ b/dumps/498/498_object_configs.txt @@ -0,0 +1,1383 @@ +Object config [object id=0, config id=0, shift=-1, childs=[-1, -1, -1, 15596, -1]]. +Object config [object id=137, config id=668, shift=0, childs=[11449, 11450, -1]]. +Object config [object id=139, config id=668, shift=2, childs=[11449, 11450, -1]]. +Object config [object id=138, config id=668, shift=1, childs=[11449, 11450, -1]]. +Object config [object id=141, config id=668, shift=4, childs=[11449, 11450, -1]]. +Object config [object id=140, config id=668, shift=3, childs=[11449, 11450, -1]]. +Object config [object id=143, config id=668, shift=6, childs=[11449, 11450, -1]]. +Object config [object id=142, config id=668, shift=5, childs=[11449, 11450, -1]]. +Object config [object id=144, config id=668, shift=7, childs=[11449, 11450, -1]]. +Object config [object id=145, config id=668, shift=8, childs=[11449, 11450, -1]]. +Object config [object id=146, config id=33, shift=1, childs=[11451, 11452, -1]]. +Object config [object id=147, config id=33, shift=2, childs=[11453, 11454, -1]]. +Object config [object id=148, config id=33, shift=3, childs=[11455, 11456, -1]]. +Object config [object id=149, config id=33, shift=4, childs=[11457, 11458, -1]]. +Object config [object id=150, config id=33, shift=5, childs=[11459, 11460, -1]]. +Object config [object id=151, config id=33, shift=6, childs=[11461, 11462, -1]]. +Object config [object id=954, config id=695, shift=-1, childs=[24069, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, 24070, -1]]. +Object config [object id=1781, config id=695, shift=-1, childs=[5792, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, -1]]. +Object config [object id=2146, config id=728, shift=2, childs=[15050, 15051, -1]]. +Object config [object id=2458, config id=491, shift=6, childs=[7115, 7116, -1]]. +Object config [object id=2459, config id=491, shift=7, childs=[7117, 7118, -1]]. +Object config [object id=2456, config id=491, shift=4, childs=[7111, 7112, -1]]. +Object config [object id=2457, config id=491, shift=5, childs=[7113, 7114, -1]]. +Object config [object id=2462, config id=491, shift=10, childs=[7123, 7124, -1]]. +Object config [object id=2463, config id=491, shift=11, childs=[7125, 7126, -1]]. +Object config [object id=2460, config id=491, shift=8, childs=[7119, 7120, -1]]. +Object config [object id=2461, config id=491, shift=9, childs=[7121, 7122, -1]]. +Object config [object id=2454, config id=491, shift=2, childs=[7107, 7108, -1]]. +Object config [object id=2455, config id=491, shift=3, childs=[7109, 7110, -1]]. +Object config [object id=2452, config id=491, shift=0, childs=[7103, 7104, -1]]. +Object config [object id=2453, config id=491, shift=1, childs=[7105, 7106, -1]]. +Object config [object id=2464, config id=491, shift=12, childs=[30529, 30530, -1]]. +Object config [object id=2490, config id=1218, shift=17, childs=[30492, 30491, -1]]. +Object config [object id=2532, config id=667, shift=2, childs=[11418, 11417, -1]]. +Object config [object id=2359, config id=135, shift=4, childs=[17296, 17297, -1]]. +Object config [object id=2679, config id=907, shift=0, childs=[18869, 18870, -1]]. +Object config [object id=2682, config id=907, shift=12, childs=[18958, 18959, -1]]. +Object config [object id=2870, config id=1017, shift=12, childs=[15518, 15519, -1]]. +Object config [object id=2843, config id=222, shift=21, childs=[17424, 17423, 17423, -1]]. +Object config [object id=3480, config id=1218, shift=18, childs=[30493, 30494, -1]]. +Object config [object id=3489, config id=1218, shift=19, childs=[30498, 30499, 30500, -1]]. +Object config [object id=3490, config id=1218, shift=21, childs=[30504, 30505, 30506, 30507, 30508, 30509, 30510, -1]]. +Object config [object id=3407, config id=299, shift=9, childs=[18516, 18515, -1]]. +Object config [object id=3404, config id=299, shift=3, childs=[18509, 18510, -1]]. +Object config [object id=3405, config id=299, shift=5, childs=[18512, 18511, -1]]. +Object config [object id=3403, config id=299, shift=4, childs=[18509, 18510, -1]]. +Object config [object id=3414, config id=896, shift=28, childs=[18650, 18726, -1]]. +Object config [object id=3413, config id=896, shift=6, childs=[18595, 18596, -1]]. +Object config [object id=3411, config id=299, shift=5, childs=[18587, 18530, -1]]. +Object config [object id=3410, config id=299, shift=7, childs=[18525, 18526, -1]]. +Object config [object id=3429, config id=897, shift=8, childs=[18664, 18667, 18668, 18669, -1]]. +Object config [object id=4039, config id=1178, shift=11, childs=[28675, 28675, 28676, -1]]. +Object config [object id=3978, config id=1193, shift=29, childs=[29443, 29442, 29444, -1]]. +Object config [object id=3977, config id=1193, shift=29, childs=[29440, 29439, 29441, -1]]. +Object config [object id=3976, config id=1193, shift=29, childs=[29437, 29436, 29438, -1]]. +Object config [object id=4099, config id=1185, shift=31, childs=[29087, 29086, -1]]. +Object config [object id=4105, config id=1185, shift=31, childs=[29104, 29103, -1]]. +Object config [object id=5062, config id=1218, shift=25, childs=[30514, 30513, -1]]. +Object config [object id=5063, config id=1218, shift=25, childs=[30516, 30515, -1]]. +Object config [object id=5060, config id=1218, shift=21, childs=[-1, -1, -1, -1, -1, -1, 30519, -1]]. +Object config [object id=5061, config id=1218, shift=25, childs=[30512, 30511, -1]]. +Object config [object id=5492, config id=174, shift=14, childs=[5490, 5491, 5490, 5490, -1]]. +Object config [object id=5182, config id=399, shift=-1, childs=[5180, 5180, 5180, 5181, 5180, 5180, 5180, 5180, 5180, -1]]. +Object config [object id=5963, config id=433, shift=30, childs=[5964, -1]]. +Object config [object id=5908, config id=425, shift=5, childs=[5909, 5910, -1]]. +Object config [object id=5861, config id=423, shift=29, childs=[-1, 5862, 5863, -1]]. +Object config [object id=5811, config id=417, shift=26, childs=[5809, 5810, -1]]. +Object config [object id=5823, config id=417, shift=25, childs=[5815, 5816, -1]]. +Object config [object id=5822, config id=417, shift=25, childs=[5815, 5817, -1]]. +Object config [object id=5821, config id=417, shift=25, childs=[5815, 5819, -1]]. +Object config [object id=5820, config id=417, shift=25, childs=[5815, 5818, -1]]. +Object config [object id=6560, config id=440, shift=21, childs=[-1, 6561, -1]]. +Object config [object id=6550, config id=440, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6551, -1]]. +Object config [object id=6636, config id=443, shift=11, childs=[6637, -1]]. +Object config [object id=6638, config id=443, shift=12, childs=[6639, -1]]. +Object config [object id=6634, config id=443, shift=10, childs=[6635, -1]]. +Object config [object id=6640, config id=443, shift=13, childs=[6641, -1]]. +Object config [object id=6621, config id=443, shift=20, childs=[6622, 6623, -1]]. +Object config [object id=6432, config id=440, shift=20, childs=[1396, 6433, -1]]. +Object config [object id=6440, config id=442, shift=11, childs=[6446, 6445, 6444, 6443, 6442, 6441, 6441, 6441, 6441, 6441, -1]]. +Object config [object id=6407, config id=441, shift=2, childs=[6408, 6414, -1]]. +Object config [object id=6405, config id=441, shift=1, childs=[6406, 6413, -1]]. +Object config [object id=6411, config id=441, shift=4, childs=[6412, 6416, -1]]. +Object config [object id=6409, config id=441, shift=3, childs=[6410, 6415, -1]]. +Object config [object id=6422, config id=440, shift=20, childs=[1396, 6423, -1]]. +Object config [object id=6426, config id=440, shift=20, childs=[1396, 6427, -1]]. +Object config [object id=6424, config id=440, shift=20, childs=[1396, 6425, -1]]. +Object config [object id=6430, config id=440, shift=20, childs=[1396, 6431, -1]]. +Object config [object id=6428, config id=440, shift=20, childs=[1396, 6429, -1]]. +Object config [object id=6485, config id=440, shift=15, childs=[6486, 6487, -1]]. +Object config [object id=6482, config id=440, shift=18, childs=[6483, 6484, -1]]. +Object config [object id=6491, config id=440, shift=16, childs=[6492, 6493, -1]]. +Object config [object id=6488, config id=440, shift=17, childs=[6489, 6490, -1]]. +Object config [object id=6306, config id=437, shift=13, childs=[6309, 6308, 6307, 6309, -1]]. +Object config [object id=6304, config id=437, shift=11, childs=[6307, 6308, -1]]. +Object config [object id=6305, config id=437, shift=12, childs=[6307, 6308, -1]]. +Object config [object id=6310, config id=437, shift=0, childs=[6363, 6363, 6363, 6363, 6363, 6364, 6364, 6364, 6364, 6364, 6364, -1]]. +Object config [object id=6300, config id=437, shift=16, childs=[6301, 6302, -1]]. +Object config [object id=6303, config id=437, shift=10, childs=[6307, 6308, -1]]. +Object config [object id=6293, config id=437, shift=17, childs=[6294, 6295, -1]]. +Object config [object id=7042, config id=482, shift=10, childs=[7043, -1]]. +Object config [object id=7040, config id=482, shift=10, childs=[7041, -1]]. +Object config [object id=7128, config id=1218, shift=29, childs=[-1, 30531, -1]]. +Object config [object id=7127, config id=1218, shift=28, childs=[30522, 30524, -1]]. +Object config [object id=7144, config id=491, shift=18, childs=[7161, 7158, 7156, 7158, 7161, 7165, 7161, 7158, 7154, 7158, 7161, 7165, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7145, config id=491, shift=18, childs=[7165, 7161, 7158, 7156, 7158, 7161, 7165, 7161, 7158, 7154, 7158, 7161, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7146, config id=491, shift=18, childs=[7168, 7165, 7161, 7158, 7156, 7158, 7168, 7165, 7161, 7158, 7154, 7158, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7147, config id=491, shift=18, childs=[7164, 7168, 7165, 7161, 7158, 7156, 7164, 7168, 7165, 7161, 7158, 7154, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7148, config id=491, shift=18, childs=[7154, 7164, 7168, 7165, 7161, 7158, 7156, 7164, 7168, 7165, 7161, 7158, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7149, config id=491, shift=18, childs=[7164, 7154, 7164, 7168, 7165, 7161, 7164, 7156, 7164, 7168, 7165, 7161, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7150, config id=491, shift=18, childs=[7168, 7164, 7154, 7164, 7168, 7165, 7168, 7164, 7156, 7164, 7168, 7165, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7151, config id=491, shift=18, childs=[7165, 7168, 7164, 7154, 7164, 7168, 7165, 7168, 7164, 7156, 7164, 7168, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7142, config id=491, shift=18, childs=[7156, 7158, 7161, 7165, 7168, 7164, 7154, 7164, 7168, 7165, 7161, 7158, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7143, config id=491, shift=18, childs=[7158, 7156, 7158, 7161, 7165, 7168, 7158, 7154, 7158, 7168, 7165, 7161, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7153, config id=491, shift=18, childs=[7158, 7161, 7165, 7168, 7164, 7154, 7158, 7161, 7165, 7168, 7164, 7156, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=7152, config id=491, shift=18, childs=[7161, 7165, 7168, 7164, 7154, 7164, 7161, 7165, 7168, 7164, 7156, 7164, 7159, 7160, 7162, 7163, 7166, 7167, 7169, 7170, -1]]. +Object config [object id=6913, config id=465, shift=19, childs=[6918, -1]]. +Object config [object id=7031, config id=482, shift=15, childs=[7032, 7033, 7034, 7035, 7036, 7037, 7038, 7039, -1]]. +Object config [object id=6843, config id=455, shift=5, childs=[6844, 6844, 6844, 6845, 6845, 6845, -1]]. +Object config [object id=6879, config id=455, shift=16, childs=[6880, 6881, -1]]. +Object config [object id=6878, config id=455, shift=16, childs=[6880, 6882, -1]]. +Object config [object id=6899, config id=465, shift=0, childs=[6909, 6909, 6909, 6909, 6905, 6905, 6905, 6905, 6905, 6905, 6905, 6905, -1]]. +Object config [object id=6898, config id=465, shift=0, childs=[6904, 6903, 6903, 6903, 6905, 6905, 6905, 6905, 6905, 6905, 6905, 6905, -1]]. +Object config [object id=6900, config id=465, shift=0, childs=[-1, 6902, 6902, 6902, 6902, 6902, 6902, 6902, 6902, 6902, 6902, -1]]. +Object config [object id=6895, config id=665, shift=0, childs=[3375, 3372, 3373, 3374, 3382, 3383, 12561, 12562, 12563, -1]]. +Object config [object id=6887, config id=455, shift=14, childs=[6888, 6889, 6888, -1]]. +Object config [object id=6710, config id=452, shift=7, childs=[-1, 6708, -1]]. +Object config [object id=6711, config id=452, shift=8, childs=[-1, 6708, -1]]. +Object config [object id=6709, config id=452, shift=6, childs=[-1, 6708, -1]]. +Object config [object id=6718, config id=452, shift=12, childs=[6714, 6715, -1]]. +Object config [object id=6719, config id=452, shift=13, childs=[6714, 6715, -1]]. +Object config [object id=6716, config id=452, shift=10, childs=[6714, 6715, -1]]. +Object config [object id=6717, config id=452, shift=11, childs=[6714, 6715, -1]]. +Object config [object id=6712, config id=452, shift=9, childs=[-1, 6708, -1]]. +Object config [object id=6736, config id=452, shift=11, childs=[6733, 6734, -1]]. +Object config [object id=6737, config id=452, shift=12, childs=[6733, 6734, -1]]. +Object config [object id=6738, config id=452, shift=13, childs=[6733, 6734, -1]]. +Object config [object id=6739, config id=452, shift=14, childs=[6733, 6734, -1]]. +Object config [object id=6740, config id=452, shift=15, childs=[6733, 6734, -1]]. +Object config [object id=6741, config id=452, shift=16, childs=[6733, 6734, -1]]. +Object config [object id=6742, config id=452, shift=17, childs=[6733, 6734, -1]]. +Object config [object id=6743, config id=452, shift=18, childs=[6733, 6734, -1]]. +Object config [object id=6744, config id=452, shift=19, childs=[6733, 6734, -1]]. +Object config [object id=6745, config id=452, shift=20, childs=[6733, 6734, -1]]. +Object config [object id=6746, config id=452, shift=21, childs=[6733, 6734, -1]]. +Object config [object id=6747, config id=452, shift=22, childs=[6733, 6734, -1]]. +Object config [object id=6748, config id=452, shift=23, childs=[6733, 6734, -1]]. +Object config [object id=6749, config id=452, shift=24, childs=[6733, 6734, -1]]. +Object config [object id=6750, config id=452, shift=25, childs=[6733, 6734, -1]]. +Object config [object id=6751, config id=452, shift=10, childs=[-1, 6807, -1]]. +Object config [object id=6721, config id=452, shift=15, childs=[6714, 6715, -1]]. +Object config [object id=6720, config id=452, shift=14, childs=[6714, 6715, -1]]. +Object config [object id=6723, config id=452, shift=17, childs=[6714, 6715, -1]]. +Object config [object id=6722, config id=452, shift=16, childs=[6714, 6715, -1]]. +Object config [object id=6725, config id=452, shift=19, childs=[6714, 6715, -1]]. +Object config [object id=6724, config id=452, shift=18, childs=[6714, 6715, -1]]. +Object config [object id=6727, config id=452, shift=21, childs=[6714, 6715, -1]]. +Object config [object id=6726, config id=452, shift=20, childs=[6714, 6715, -1]]. +Object config [object id=6729, config id=452, shift=23, childs=[6714, 6715, -1]]. +Object config [object id=6728, config id=452, shift=22, childs=[6714, 6715, -1]]. +Object config [object id=6731, config id=452, shift=25, childs=[6714, 6715, -1]]. +Object config [object id=6730, config id=452, shift=24, childs=[6714, 6715, -1]]. +Object config [object id=6735, config id=452, shift=10, childs=[6733, 6734, -1]]. +Object config [object id=6755, config id=452, shift=14, childs=[-1, 6807, -1]]. +Object config [object id=6754, config id=452, shift=13, childs=[-1, 6807, -1]]. +Object config [object id=6753, config id=452, shift=12, childs=[-1, 6807, -1]]. +Object config [object id=6752, config id=452, shift=11, childs=[-1, 6807, -1]]. +Object config [object id=6759, config id=452, shift=18, childs=[-1, 6807, -1]]. +Object config [object id=6758, config id=452, shift=17, childs=[-1, 6807, -1]]. +Object config [object id=6757, config id=452, shift=16, childs=[-1, 6807, -1]]. +Object config [object id=6756, config id=452, shift=15, childs=[-1, 6807, -1]]. +Object config [object id=6763, config id=452, shift=22, childs=[-1, 6807, -1]]. +Object config [object id=6762, config id=452, shift=21, childs=[-1, 6807, -1]]. +Object config [object id=6761, config id=452, shift=20, childs=[-1, 6807, -1]]. +Object config [object id=6760, config id=452, shift=19, childs=[-1, 6807, -1]]. +Object config [object id=6766, config id=452, shift=25, childs=[-1, 6807, -1]]. +Object config [object id=6765, config id=452, shift=24, childs=[-1, 6807, -1]]. +Object config [object id=6764, config id=452, shift=23, childs=[-1, 6807, -1]]. +Object config [object id=7572, config id=512, shift=16, childs=[7560, 7559, 7558, 7557, 7561, 7562, 7563, 7564, 7565, 7566, 7567, 7568, 7569, 7570, 7571, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, 7560, -1]]. +Object config [object id=7579, config id=509, shift=16, childs=[7576, 7575, 7574, 7573, 7576, 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7699, 7700, 7701, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, 7605, 7606, 7607, 7608, 7609, 7610, 7611, 7612, 7613, 7614, 7615, 7616, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7713, 7714, 7715, 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7725, 7576, 7576, 7576, 7576, 7576, 7576, 7703, 7704, 7705, 7706, 7707, 7576, 7576, 7576, 7576, 7576, 7593, 7594, 7595, 7596, 7597, 7598, 7576, 7576, 7576, 7576, 7576, 7618, 7619, 7620, 7621, 7622, 7623, 7624, 7576, 7576, 7576, 7576, 7576, 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, 7576, 7576, 7576, 7576, 7576, 7727, 7728, 7729, 7730, 7731, 7732, 7733, 7734, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7708, 7709, 7710, 7711, 7712, 7576, 7576, 7576, 7576, 7576, 7599, 7600, 7601, 7602, 7603, 7604, 7576, 7576, 7576, 7576, 7576, 7625, 7626, 7627, 7628, 7629, 7630, 7631, 7576, 7576, 7576, 7576, 7576, 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7576, 7576, 7576, 7576, 7576, 7735, 7736, 7737, 7738, 7739, 7740, 7741, 7742, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, 7670, 7671, 7672, 7673, 7674, 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7684, 7685, 7686, 7687, 7688, 7689, 7690, 7691, 7683, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7702, 7592, 7617, 7645, 7726, 7675, -1]]. +Object config [object id=7578, config id=509, shift=8, childs=[7576, 7575, 7574, 7573, 7576, 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7699, 7700, 7701, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, 7605, 7606, 7607, 7608, 7609, 7610, 7611, 7612, 7613, 7614, 7615, 7616, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7713, 7714, 7715, 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7725, 7576, 7576, 7576, 7576, 7576, 7576, 7703, 7704, 7705, 7706, 7707, 7576, 7576, 7576, 7576, 7576, 7593, 7594, 7595, 7596, 7597, 7598, 7576, 7576, 7576, 7576, 7576, 7618, 7619, 7620, 7621, 7622, 7623, 7624, 7576, 7576, 7576, 7576, 7576, 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, 7576, 7576, 7576, 7576, 7576, 7727, 7728, 7729, 7730, 7731, 7732, 7733, 7734, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7708, 7709, 7710, 7711, 7712, 7576, 7576, 7576, 7576, 7576, 7599, 7600, 7601, 7602, 7603, 7604, 7576, 7576, 7576, 7576, 7576, 7625, 7626, 7627, 7628, 7629, 7630, 7631, 7576, 7576, 7576, 7576, 7576, 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7576, 7576, 7576, 7576, 7576, 7735, 7736, 7737, 7738, 7739, 7740, 7741, 7742, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, 7670, 7671, 7672, 7673, 7674, 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7684, 7685, 7686, 7687, 7688, 7689, 7690, 7691, 7683, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7702, 7592, 7617, 7645, 7726, 7675, -1]]. +Object config [object id=7577, config id=509, shift=0, childs=[7576, 7575, 7574, 7573, 7576, 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7699, 7700, 7701, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, 7605, 7606, 7607, 7608, 7609, 7610, 7611, 7612, 7613, 7614, 7615, 7616, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7713, 7714, 7715, 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7725, 7576, 7576, 7576, 7576, 7576, 7576, 7703, 7704, 7705, 7706, 7707, 7576, 7576, 7576, 7576, 7576, 7593, 7594, 7595, 7596, 7597, 7598, 7576, 7576, 7576, 7576, 7576, 7618, 7619, 7620, 7621, 7622, 7623, 7624, 7576, 7576, 7576, 7576, 7576, 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, 7576, 7576, 7576, 7576, 7576, 7727, 7728, 7729, 7730, 7731, 7732, 7733, 7734, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7708, 7709, 7710, 7711, 7712, 7576, 7576, 7576, 7576, 7576, 7599, 7600, 7601, 7602, 7603, 7604, 7576, 7576, 7576, 7576, 7576, 7625, 7626, 7627, 7628, 7629, 7630, 7631, 7576, 7576, 7576, 7576, 7576, 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7576, 7576, 7576, 7576, 7576, 7735, 7736, 7737, 7738, 7739, 7740, 7741, 7742, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, 7670, 7671, 7672, 7673, 7674, 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7684, 7685, 7686, 7687, 7688, 7689, 7690, 7691, 7683, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7702, 7592, 7617, 7645, 7726, 7675, -1]]. +Object config [object id=7580, config id=509, shift=24, childs=[7576, 7575, 7574, 7573, 7576, 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7699, 7700, 7701, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, 7590, 7591, 7605, 7606, 7607, 7608, 7609, 7610, 7611, 7612, 7613, 7614, 7615, 7616, 7632, 7633, 7634, 7635, 7636, 7637, 7638, 7639, 7640, 7641, 7642, 7643, 7644, 7713, 7714, 7715, 7716, 7717, 7718, 7719, 7720, 7721, 7722, 7723, 7724, 7725, 7576, 7576, 7576, 7576, 7576, 7576, 7703, 7704, 7705, 7706, 7707, 7576, 7576, 7576, 7576, 7576, 7593, 7594, 7595, 7596, 7597, 7598, 7576, 7576, 7576, 7576, 7576, 7618, 7619, 7620, 7621, 7622, 7623, 7624, 7576, 7576, 7576, 7576, 7576, 7646, 7647, 7648, 7649, 7650, 7651, 7652, 7653, 7576, 7576, 7576, 7576, 7576, 7727, 7728, 7729, 7730, 7731, 7732, 7733, 7734, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7708, 7709, 7710, 7711, 7712, 7576, 7576, 7576, 7576, 7576, 7599, 7600, 7601, 7602, 7603, 7604, 7576, 7576, 7576, 7576, 7576, 7625, 7626, 7627, 7628, 7629, 7630, 7631, 7576, 7576, 7576, 7576, 7576, 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7576, 7576, 7576, 7576, 7576, 7735, 7736, 7737, 7738, 7739, 7740, 7741, 7742, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7662, 7663, 7664, 7665, 7666, 7667, 7668, 7669, 7670, 7671, 7672, 7673, 7674, 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7684, 7685, 7686, 7687, 7688, 7689, 7690, 7691, 7683, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7576, 7702, 7592, 7617, 7645, 7726, 7675, -1]]. +Object config [object id=7495, config id=510, shift=8, childs=[7437, 7438, 7441, -1, 7444, 7445, 7446, 7447, 7448, -1, 7449, 7450, 7451, 7452, 7453, -1, 7454, 7455, 7456, 7457, 7458, -1, 7459, 7460, 7461, 7462, 7463, -1, 7464, 7465, 7466, 7467, 7468, -1, 7469, 7470, 7471, 7472, 7473, -1, 7474, 7475, 7476, 7477, 7478, -1, 7479, 7480, 7481, 7482, 7483, -1, 7484, 7485, 7486, 7487, 7488, -1, 7489, 7490, 7491, 7492, 7493, -1, 7439, 7440, -1]]. +Object config [object id=7494, config id=510, shift=0, childs=[7437, 7438, 7441, -1, 7444, 7445, 7446, 7447, 7448, -1, 7449, 7450, 7451, 7452, 7453, -1, 7454, 7455, 7456, 7457, 7458, -1, 7459, 7460, 7461, 7462, 7463, -1, 7464, 7465, 7466, 7467, 7468, -1, 7469, 7470, 7471, 7472, 7473, -1, 7474, 7475, 7476, 7477, 7478, -1, 7479, 7480, 7481, 7482, 7483, -1, 7484, 7485, 7486, 7487, 7488, -1, 7489, 7490, 7491, 7492, 7493, -1, 7439, 7440, -1, -1, 8871, 8872, 8873, 8874, -1]]. +Object config [object id=7432, config id=510, shift=24, childs=[7407, 7408, 7410, -1, 7409, -1, -1, -1, 7411, 7411, 7411, 7411, 7411, 7411, 7411, 7411, 7413, 7413, 7413, 7413, 7413, 7413, 7413, 7413, 7415, 7415, 7415, 7415, 7415, 7415, 7415, 7415, 7417, 7417, 7417, 7417, 7417, 7417, 7417, 7417, 7419, 7419, 7419, 7419, 7419, 7419, 7419, 7419, 7421, 7421, 7421, 7421, 7421, 7421, 7421, 7421, 7423, 7423, 7423, 7423, 7423, 7423, 7423, 7423, 7425, 7425, 7425, 7425, 7425, 7425, 7425, 7425, 7427, 7427, 7427, 7427, 7427, 7427, 7427, 7427, 7429, 7429, 7429, 7429, 7429, 7429, 7429, 7429, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7412, 7412, 7412, 7412, 7412, 7412, 7412, 7412, 7414, 7414, 7414, 7414, 7414, 7414, 7414, 7414, 7416, 7416, 7416, 7416, 7416, 7416, 7416, 7416, 7418, 7418, 7418, 7418, 7418, 7418, 7418, 7418, 7420, 7420, 7420, 7420, 7420, 7420, 7420, 7420, 7422, 7422, 7422, 7422, 7422, 7422, 7422, 7422, 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7426, 7426, 7426, 7426, 7426, 7426, 7426, 7426, 7428, 7428, 7428, 7428, 7428, 7428, 7428, 7428, 7430, 7430, 7430, 7430, 7430, 7430, 7430, 7430, -1]]. +Object config [object id=7431, config id=510, shift=16, childs=[7407, 7408, 7410, 8870, 7409, -1, -1, -1, 7411, 7411, 7411, 7411, 7411, 7411, 7411, 7411, 7413, 7413, 7413, 7413, 7413, 7413, 7413, 7413, 7415, 7415, 7415, 7415, 7415, 7415, 7415, 7415, 7417, 7417, 7417, 7417, 7417, 7417, 7417, 7417, 7419, 7419, 7419, 7419, 7419, 7419, 7419, 7419, 7421, 7421, 7421, 7421, 7421, 7421, 7421, 7421, 7423, 7423, 7423, 7423, 7423, 7423, 7423, 7423, 7425, 7425, 7425, 7425, 7425, 7425, 7425, 7425, 7427, 7427, 7427, 7427, 7427, 7427, 7427, 7427, 7429, 7429, 7429, 7429, 7429, 7429, 7429, 7429, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7412, 7412, 7412, 7412, 7412, 7412, 7412, 7412, 7414, 7414, 7414, 7414, 7414, 7414, 7414, 7414, 7416, 7416, 7416, 7416, 7416, 7416, 7416, 7416, 7418, 7418, 7418, 7418, 7418, 7418, 7418, 7418, 7420, 7420, 7420, 7420, 7420, 7420, 7420, 7420, 7422, 7422, 7422, 7422, 7422, 7422, 7422, 7422, 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7424, 7426, 7426, 7426, 7426, 7426, 7426, 7426, 7426, 7428, 7428, 7428, 7428, 7428, 7428, 7428, 7428, 7430, 7430, 7430, 7430, 7430, 7430, 7430, 7430, -1]]. +Object config [object id=7395, config id=499, shift=-1, childs=[7394, -1]]. +Object config [object id=7342, config id=497, shift=28, childs=[7343, 7344, 7344, 7345, -1]]. +Object config [object id=7296, config id=496, shift=3, childs=[7309, 7312, 7314, 7305, 7303, 7307, 7311, 7303, 7304, 7303, 7309, 7308, -1]]. +Object config [object id=7297, config id=496, shift=3, childs=[7310, 7313, 7312, 7308, 7309, 7309, 7310, 7304, 7312, 7309, 7310, -1, 7312, -1]]. +Object config [object id=7298, config id=496, shift=3, childs=[7311, 7304, 7309, 7304, 7314, 7314, 7307, 7305, 7314, 7311, -1, 7305, 7314, -1]]. +Object config [object id=7299, config id=496, shift=3, childs=[7312, 7307, 7313, 7314, 7310, 7311, 7308, -1, 7310, 7308, 7305, 7311, 7311, -1]]. +Object config [object id=7300, config id=496, shift=3, childs=[7313, 7309, 7303, 7313, 7308, 7308, 7306, 7313, -1, 7305, 7304, 7309, 7313, -1]]. +Object config [object id=7301, config id=496, shift=3, childs=[7314, 7305, 7308, 7310, 7304, 7305, 7305, 7314, 7306, -1, 7303, 7306, 7310, -1]]. +Object config [object id=7294, config id=496, shift=3, childs=[7307, 7310, -1, 7303, 7311, 7312, 7314, 7310, 7309, 7313, 7313, 7313, 7305, -1]]. +Object config [object id=7295, config id=496, shift=3, childs=[7308, -1, 7311, 7307, 7313, 7303, 7313, 7311, 7307, 7306, 7312, 7304, 7308, -1]]. +Object config [object id=7292, config id=496, shift=3, childs=[7305, 7303, 7310, 7309, -1, 7310, 7309, 7308, 7311, 7307, 7308, 7312, 7304, -1]]. +Object config [object id=7293, config id=496, shift=3, childs=[7306, 7314, 7306, -1, 7312, 7313, 7312, 7309, 7303, 7312, 7314, 7314, 7307, -1]]. +Object config [object id=7290, config id=496, shift=3, childs=[7303, 7311, 7304, 7312, 7306, 7306, -1, 7306, 7305, 7304, 7306, 7307, 7303, -1]]. +Object config [object id=7291, config id=496, shift=3, childs=[7304, 7306, 7305, 7311, 7307, -1, 7304, 7307, 7308, 7310, 7307, 7303, 7306, -1]]. +Object config [object id=7282, config id=498, shift=14, childs=[7284, -1, 7285, -1]]. +Object config [object id=7283, config id=498, shift=17, childs=[-1, 7284, -1, 7285, -1]]. +Object config [object id=7280, config id=498, shift=10, childs=[-1, 7281, -1, 7281, -1]]. +Object config [object id=7279, config id=498, shift=7, childs=[7281, -1, 7281, -1]]. +Object config [object id=7276, config id=498, shift=3, childs=[-1, 7277, -1, 7278, -1]]. +Object config [object id=7275, config id=498, shift=0, childs=[7277, -1, 7278, -1]]. +Object config [object id=8151, config id=515, shift=8, childs=[8135, 8134, 8133, 8132, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8147, 8148, 8149, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 9044, 9045, 9046, 9047, 9048, 9048, 9049, 9050, 9051, 9052, 9053, 9054, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8144, 8145, 8146, 8135, 8135, 8135, 8135, 8135, 8135, -1, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, -1]]. +Object config [object id=8150, config id=515, shift=0, childs=[8135, 8134, 8133, 8132, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8147, 8148, 8149, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 9044, 9045, 9046, 9047, 9048, 9048, 9049, 9050, 9051, 9052, 9053, 9054, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8144, 8145, 8146, 8135, 8135, 8135, 8135, 8135, 8135, -1, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, -1]]. +Object config [object id=8153, config id=515, shift=24, childs=[8138, 8137, 8136, 8132, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8147, 8148, 8149, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 9044, 9045, 9046, 9047, 9048, 9048, 9049, 9050, 9051, 9052, 9053, 9054, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8144, 8145, 8146, 8138, 8138, 8138, 8138, 8138, 8138, -1, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, 8138, -1]]. +Object config [object id=8152, config id=515, shift=16, childs=[8135, 8134, 8133, 8132, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8139, 8140, 8141, 8142, 8143, 8143, 8143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8144, 8145, 8146, 8147, 8148, 8149, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 9044, 9045, 9046, 9047, 9048, 9048, 9049, 9050, 9051, 9052, 9053, 9054, 8139, 8140, 8141, 8142, 8143, 8143, 8143, 8144, 8145, 8146, 8135, 8135, 8135, 8135, 8135, 8135, -1, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, 8135, -1]]. +Object config [object id=8173, config id=506, shift=0, childs=[8210, 8209, 8208, 8207, 8177, 8178, 8179, 8180, 8181, 8181, 8181, 8154, 8155, 8156, 8157, 8158, 8159, 8159, 8159, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8294, 8294, 8211, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8218, 8218, 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, 8265, 8265, 8265, 8192, 8193, 8194, 8195, 8196, 8196, 8196, 8238, 8239, 8240, 8241, 8242, 8243, 8243, 8243, 8210, 8210, 8210, 8210, 8182, 8183, 8184, 8185, 8210, 8210, 8210, 8160, 8161, 8162, 8163, 8164, 8210, 8210, 8210, 8295, 8296, 8297, 8298, 8299, 8300, 8210, 8210, 8210, 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8210, 8210, 8210, 8266, 8267, 8268, 8269, 8270, 8271, 8272, 8273, 8210, 8210, 8210, 8197, 8198, 8199, 8200, 8210, 8210, 8210, 8244, 8245, 8246, 8247, 8248, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8186, 8187, 8188, 8210, 8210, 8210, 8210, 8165, 8166, 8167, 8168, 8210, 8210, 8210, 8210, 8301, 8302, 8303, 8304, 8305, 8210, 8210, 8210, 8210, 8226, 8227, 8228, 8229, 8230, 8231, 8210, 8210, 8210, 8210, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8210, 8210, 8210, 8210, 8201, 8202, 8203, 8210, -1, 8210, 8210, 8249, 8250, 8251, 8252, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8189, 8190, 8191, 8210, 8210, 8210, 8210, 8169, 8170, 8171, 8172, 8210, 8210, 8210, 8210, 8306, 8307, 8308, 8309, 8310, 8210, 8210, 8210, 8210, 8232, 8233, 8234, 8235, 8236, 8237, 8210, 8210, 8210, 8210, 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8210, 8210, 8210, 8210, 8204, 8205, 8206, 8210, 8210, 8210, 8210, 8253, 8254, 8255, 8256, 8210, 8210, 8210, -1]]. +Object config [object id=8174, config id=506, shift=8, childs=[8210, 8209, 8208, 8207, 8177, 8178, 8179, 8180, 8181, 8181, 8181, 8154, 8155, 8156, 8157, 8158, 8159, 8159, 8159, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8294, 8294, 8211, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8218, 8218, 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, 8265, 8265, 8265, 8192, 8193, 8194, 8195, 8196, 8196, 8196, 8238, 8239, 8240, 8241, 8242, 8243, 8243, 8243, 8210, 8210, 8210, 8210, 8182, 8183, 8184, 8185, 8210, 8210, 8210, 8160, 8161, 8162, 8163, 8164, 8210, 8210, 8210, 8295, 8296, 8297, 8298, 8299, 8300, 8210, 8210, 8210, 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8210, 8210, 8210, 8266, 8267, 8268, 8269, 8270, 8271, 8272, 8273, 8210, 8210, 8210, 8197, 8198, 8199, 8200, 8210, 8210, 8210, 8244, 8245, 8246, 8247, 8248, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8186, 8187, 8188, 8210, 8210, 8210, 8210, 8165, 8166, 8167, 8168, 8210, 8210, 8210, 8210, 8301, 8302, 8303, 8304, 8305, 8210, 8210, 8210, 8210, 8226, 8227, 8228, 8229, 8230, 8231, 8210, 8210, 8210, 8210, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8210, 8210, 8210, 8210, 8201, 8202, 8203, 8210, -1, 8210, 8210, 8249, 8250, 8251, 8252, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8189, 8190, 8191, 8210, 8210, 8210, 8210, 8169, 8170, 8171, 8172, 8210, 8210, 8210, 8210, 8306, 8307, 8308, 8309, 8310, 8210, 8210, 8210, 8210, 8232, 8233, 8234, 8235, 8236, 8237, 8210, 8210, 8210, 8210, 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8210, 8210, 8210, 8210, 8204, 8205, 8206, 8210, 8210, 8210, 8210, 8253, 8254, 8255, 8256, 8210, 8210, 8210, -1]]. +Object config [object id=8175, config id=506, shift=16, childs=[8210, 8209, 8208, 8207, 8177, 8178, 8179, 8180, 8181, 8181, 8181, 8154, 8155, 8156, 8157, 8158, 8159, 8159, 8159, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8294, 8294, 8211, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8218, 8218, 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, 8265, 8265, 8265, 8192, 8193, 8194, 8195, 8196, 8196, 8196, 8238, 8239, 8240, 8241, 8242, 8243, 8243, 8243, 8210, 8210, 8210, 8210, 8182, 8183, 8184, 8185, 8210, 8210, 8210, 8160, 8161, 8162, 8163, 8164, 8210, 8210, 8210, 8295, 8296, 8297, 8298, 8299, 8300, 8210, 8210, 8210, 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8210, 8210, 8210, 8266, 8267, 8268, 8269, 8270, 8271, 8272, 8273, 8210, 8210, 8210, 8197, 8198, 8199, 8200, 8210, 8210, 8210, 8244, 8245, 8246, 8247, 8248, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8186, 8187, 8188, 8210, 8210, 8210, 8210, 8165, 8166, 8167, 8168, 8210, 8210, 8210, 8210, 8301, 8302, 8303, 8304, 8305, 8210, 8210, 8210, 8210, 8226, 8227, 8228, 8229, 8230, 8231, 8210, 8210, 8210, 8210, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8210, 8210, 8210, 8210, 8201, 8202, 8203, 8210, -1, 8210, 8210, 8249, 8250, 8251, 8252, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8189, 8190, 8191, 8210, 8210, 8210, 8210, 8169, 8170, 8171, 8172, 8210, 8210, 8210, 8210, 8306, 8307, 8308, 8309, 8310, 8210, 8210, 8210, 8210, 8232, 8233, 8234, 8235, 8236, 8237, 8210, 8210, 8210, 8210, 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8210, 8210, 8210, 8210, 8204, 8205, 8206, 8210, 8210, 8210, 8210, 8253, 8254, 8255, 8256, 8210, 8210, 8210, -1]]. +Object config [object id=8176, config id=506, shift=24, childs=[8210, 8209, 8208, 8207, 8177, 8178, 8179, 8180, 8181, 8181, 8181, 8154, 8155, 8156, 8157, 8158, 8159, 8159, 8159, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8294, 8294, 8211, 8212, 8213, 8214, 8215, 8216, 8217, 8218, 8218, 8218, 8257, 8258, 8259, 8260, 8261, 8262, 8263, 8264, 8265, 8265, 8265, 8192, 8193, 8194, 8195, 8196, 8196, 8196, 8238, 8239, 8240, 8241, 8242, 8243, 8243, 8243, 8210, 8210, 8210, 8210, 8182, 8183, 8184, 8185, 8210, 8210, 8210, 8160, 8161, 8162, 8163, 8164, 8210, 8210, 8210, 8295, 8296, 8297, 8298, 8299, 8300, 8210, 8210, 8210, 8219, 8220, 8221, 8222, 8223, 8224, 8225, 8210, 8210, 8210, 8266, 8267, 8268, 8269, 8270, 8271, 8272, 8273, 8210, 8210, 8210, 8197, 8198, 8199, 8200, 8210, 8210, 8210, 8244, 8245, 8246, 8247, 8248, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8186, 8187, 8188, 8210, 8210, 8210, 8210, 8165, 8166, 8167, 8168, 8210, 8210, 8210, 8210, 8301, 8302, 8303, 8304, 8305, 8210, 8210, 8210, 8210, 8226, 8227, 8228, 8229, 8230, 8231, 8210, 8210, 8210, 8210, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8210, 8210, 8210, 8210, 8201, 8202, 8203, 8210, -1, 8210, 8210, 8249, 8250, 8251, 8252, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8210, 8189, 8190, 8191, 8210, 8210, 8210, 8210, 8169, 8170, 8171, 8172, 8210, 8210, 8210, 8210, 8306, 8307, 8308, 8309, 8310, 8210, 8210, 8210, 8210, 8232, 8233, 8234, 8235, 8236, 8237, 8210, 8210, 8210, 8210, 8281, 8282, 8283, 8284, 8285, 8286, 8287, 8210, 8210, 8210, 8210, 8204, 8205, 8206, 8210, 8210, 8210, 8210, 8253, 8254, 8255, 8256, 8210, 8210, 8210, -1]]. +Object config [object id=7964, config id=503, shift=16, childs=[8050, 8049, 8048, 8047, 8050, 8050, 8050, 8050, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947, 7949, 7950, 7951, 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7960, 7961, 7948, 7993, 7994, 7995, 7996, 7997, 7998, 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 7999, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8064, 8020, 8021, 8022, 8023, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032, 8034, 8035, 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8033, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 7966, 7967, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7976, 7977, 7978, 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7979, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, 8117, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8118, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8091, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, -1]]. +Object config [object id=7965, config id=503, shift=24, childs=[8050, 8049, 8048, 8047, 8050, 8050, 8050, 8050, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947, 7949, 7950, 7951, 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7960, 7961, 7948, 7993, 7994, 7995, 7996, 7997, 7998, 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 7999, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8064, 8020, 8021, 8022, 8023, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032, 8034, 8035, 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8033, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 7966, 7967, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7976, 7977, 7978, 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7979, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, 8117, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8118, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8091, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, -1]]. +Object config [object id=7962, config id=503, shift=0, childs=[8050, 8049, 8048, 8047, 8050, 8050, 8050, 8050, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947, 7949, 7950, 7951, 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7960, 7961, 7948, 7993, 7994, 7995, 7996, 7997, 7998, 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 7999, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8064, 8020, 8021, 8022, 8023, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032, 8034, 8035, 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8033, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 7966, 7967, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7976, 7977, 7978, 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7979, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, 8117, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8118, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8091, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, -1]]. +Object config [object id=7963, config id=503, shift=8, childs=[8050, 8049, 8048, 8047, 8050, 8050, 8050, 8050, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947, 7949, 7950, 7951, 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7960, 7961, 7948, 7993, 7994, 7995, 7996, 7997, 7998, 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 7999, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8064, 8020, 8021, 8022, 8023, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032, 8034, 8035, 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8033, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 7966, 7967, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7976, 7977, 7978, 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7979, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, 8117, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8118, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8091, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, -1]]. +Object config [object id=7837, config id=511, shift=8, childs=[7808, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7810, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7815, 7813, 7813, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7812, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7817, -1, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, -1, -1, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7829, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7831, 7813, 7813, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, -1]]. +Object config [object id=7836, config id=511, shift=0, childs=[7808, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7810, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7815, 7813, 7813, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7812, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7817, -1, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, -1, -1, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7829, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7831, 7813, 7813, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, -1]]. +Object config [object id=7839, config id=511, shift=24, childs=[7808, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7809, 7810, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7814, 7815, 7813, 7813, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7811, 7812, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7816, 7817, -1, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, -1, -1, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7828, 7829, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7830, 7831, 7813, 7813, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, 7813, -1]]. +Object config [object id=7838, config id=511, shift=16, childs=[7818, 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7819, 7820, 7824, 7824, 7824, 7824, 7824, 7824, 7824, 7824, 7824, 7824, 7824, 7824, 7824, 7824, 7825, 7823, 7823, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7821, 7822, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7826, 7827, -1, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, -1, -1, 7832, 7832, 7832, 7832, 7832, 7832, 7832, 7832, 7832, 7832, 7832, 7832, 7832, 7832, 7833, 7834, 7834, 7834, 7834, 7834, 7834, 7834, 7834, 7834, 7834, 7834, 7834, 7834, 7834, 7835, 7823, 7823, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, 7823, -1]]. +Object config [object id=7847, config id=508, shift=0, childs=[7843, 7842, 7841, 7840, 7843, 7843, 7843, 7843, 7867, 7868, 7869, 7870, 7871, 7899, 7900, 7901, 7902, 7903, 7883, 7884, 7885, 7886, 7887, 7919, 7920, 7921, 7922, 7923, 7851, 7852, 7853, 7854, 7855, 7918, 7917, 7916, 7915, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7872, 7873, 7874, 7875, 7843, 7904, 7905, 7906, 7907, 7843, 7888, 7889, 7890, 7891, 7843, 7924, 7925, 7926, 7927, 7843, 7856, 7857, 7858, 7859, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7876, 7877, 7878, 7843, 7843, 7908, 7909, 7910, 7843, 7843, 7892, 7893, 7894, 7843, 7843, 7928, 7929, 7930, 7843, 7843, 7860, 7861, 7862, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7879, 7880, 7881, 7882, 7843, 7911, 7912, 7913, 7914, 7843, 7895, 7896, 7897, 7898, 7843, 7931, 7932, 7933, 7934, 7843, 7863, 7864, 7865, 7866, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, -1]]. +Object config [object id=7850, config id=508, shift=24, childs=[7846, 7845, 7844, 7840, 7846, 7846, 7846, 7846, 7867, 7868, 7869, 7870, 7871, 7899, 7900, 7901, 7902, 7903, 7883, 7884, 7885, 7886, 7887, 7919, 7920, 7921, 7922, 7923, 7851, 7852, 7853, 7854, 7855, 9340, 9339, 9338, 7915, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7872, 7873, 7874, 7875, 7846, 7904, 7905, 7906, 7907, 7846, 7888, 7889, 7890, 7891, 7846, 7924, 7925, 7926, 7927, 7846, 7856, 7857, 7858, 7859, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7846, 7876, 7877, 7878, 7846, 7846, 7908, 7909, 7910, 7846, 7846, 7892, 7893, 7894, 7843, 7843, 7928, 7929, 7930, 7843, 7843, 7860, 7861, 7862, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7879, 7880, 7881, 7882, 7843, 7911, 7912, 7913, 7914, 7843, 7895, 7896, 7897, 7898, 7843, 7931, 7932, 7933, 7934, 7843, 7863, 7864, 7865, 7866, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, -1]]. +Object config [object id=7848, config id=508, shift=8, childs=[7843, 7842, 7841, 7840, 7843, 7843, 7843, 7843, 7867, 7868, 7869, 7870, 7871, 7899, 7900, 7901, 7902, 7903, 7883, 7884, 7885, 7886, 7887, 7919, 7920, 7921, 7922, 7923, 7851, 7852, 7853, 7854, 7855, 7918, 7917, 7916, 7915, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7872, 7873, 7874, 7875, 7843, 7904, 7905, 7906, 7907, 7843, 7888, 7889, 7890, 7891, 7843, 7924, 7925, 7926, 7927, 7843, 7856, 7857, 7858, 7859, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7876, 7877, 7878, 7843, 7843, 7908, 7909, 7910, 7843, 7843, 7892, 7893, 7894, 7843, 7843, 7928, 7929, 7930, 7843, 7843, 7860, 7861, 7862, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7879, 7880, 7881, 7882, 7843, 7911, 7912, 7913, 7914, 7843, 7895, 7896, 7897, 7898, 7843, 7931, 7932, 7933, 7934, 7843, 7863, 7864, 7865, 7866, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, -1]]. +Object config [object id=7849, config id=508, shift=16, childs=[7843, 7842, 7841, 7840, 7843, 7843, 7843, 7843, 7867, 7868, 7869, 7870, 7871, 7899, 7900, 7901, 7902, 7903, 7883, 7884, 7885, 7886, 7887, 7919, 7920, 7921, 7922, 7923, 7851, 7852, 7853, 7854, 7855, 7918, 7917, 7916, 7915, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7872, 7873, 7874, 7875, 7843, 7904, 7905, 7906, 7907, 7843, 7888, 7889, 7890, 7891, 7843, 7924, 7925, 7926, 7927, 7843, 7856, 7857, 7858, 7859, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7876, 7877, 7878, 7843, 7843, 7908, 7909, 7910, 7843, 7843, 7892, 7893, 7894, 7843, 7843, 7928, 7929, 7930, 7843, 7843, 7860, 7861, 7862, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7879, 7880, 7881, 7882, 7843, 7911, 7912, 7913, 7914, 7843, 7895, 7896, 7897, 7898, 7843, 7931, 7932, 7933, 7934, 7843, 7863, 7864, 7865, 7866, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, 7843, -1]]. +Object config [object id=7771, config id=512, shift=0, childs=[7746, 7745, 7744, 7743, 7746, 7746, 7746, 7746, 7747, 7748, 7749, 7750, 7751, 7752, 7753, 7754, 7755, 7756, 7757, 7759, 7760, 7761, 7762, 7763, 7764, 7765, 7766, 7767, 7768, 7769, 7770, 7758, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, 7746, -1]]. +Object config [object id=7807, config id=507, shift=24, childs=[7775, 7774, 7773, 7772, 7776, 7777, 7778, 7779, 7780, 7781, 7782, 7783, 7784, 7785, 7786, 7787, 7788, 7789, 7790, 7792, 7793, 7794, 7795, 7796, 7797, 7798, 7799, 7800, 7801, 7802, 7803, 7804, 7805, 7806, 7791, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, 7775, -1]]. +Object config [object id=8794, config id=518, shift=8, childs=[8795, 8795, 8795, 8795, 8795, 8795, 8795, 8796, 8796, 8796, 8796, 8796, 8796, 8796, -1]]. +Object config [object id=8877, config id=521, shift=8, childs=[8864, 8863, 8862, 8861, 8865, 8866, 8867, 8868, 8869, -1]]. +Object config [object id=8885, config id=521, shift=13, childs=[5001, -1]]. +Object config [object id=8860, config id=482, shift=26, childs=[6046, -1]]. +Object config [object id=9057, config id=540, shift=20, childs=[9058, 9059, 9060, 9061, 9062, 9063, -1]]. +Object config [object id=9067, config id=540, shift=2, childs=[9064, 9064, 9064, 9068, 9068, -1]]. +Object config [object id=9065, config id=540, shift=8, childs=[9064, 9064, 9064, 9066, 9066, 9066, -1]]. +Object config [object id=9069, config id=540, shift=5, childs=[9064, 9064, 9064, 9071, 9070, -1]]. +Object config [object id=8996, config id=531, shift=10, childs=[8998, 8999, 9000, 9001, 9002, 9003, 9004, 9005, -1]]. +Object config [object id=8997, config id=531, shift=15, childs=[8998, 8999, 9000, 9001, 9002, 9003, 9004, 9005, -1]]. +Object config [object id=8994, config id=531, shift=0, childs=[8998, 8999, 9000, 9001, 9002, 9003, 9004, 9005, -1]]. +Object config [object id=8995, config id=531, shift=5, childs=[8998, 8999, 9000, 9001, 9002, 9003, 9004, 9005, -1]]. +Object config [object id=9209, config id=554, shift=18, childs=[9213, 9212, 9211, 9210, 9214, 9215, 9216, 9217, 9218, 9219, 9220, 9221, 9222, -1]]. +Object config [object id=9198, config id=554, shift=22, childs=[9203, 9204, -1, -1, 9205, 9206, 9207, 9208, -1]]. +Object config [object id=9197, config id=554, shift=15, childs=[9203, 9204, -1, -1, 9199, 9200, 9201, 9202, -1]]. +Object config [object id=9176, config id=554, shift=6, childs=[9180, 9179, 9178, 9177, 9189, 9190, 9195, 9196, -1]]. +Object config [object id=9174, config id=554, shift=3, childs=[9184, 9183, 9182, 9181, 9189, 9190, 9191, 9192, -1]]. +Object config [object id=9175, config id=554, shift=0, childs=[9188, 9187, 9186, 9185, 9189, 9190, 9193, 9194, -1]]. +Object config [object id=9165, config id=554, shift=9, childs=[9169, 9168, 9167, 9166, 9170, 9171, 9172, 9173, -1]]. +Object config [object id=9092, config id=543, shift=8, childs=[9093, 9094, 9095, 9096, -1]]. +Object config [object id=8391, config id=502, shift=24, childs=[8395, 8394, 8393, 8392, 8395, 8395, 8395, 8395, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8396, 8397, 8398, 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8473, 8474, 8475, -1, 8476, 8395, 8395, 8490, 8491, 8492, 8493, 8494, -1, 8495, 8395, 8395, 8446, 8447, 8448, 8449, 8450, 8451, 8452, -1, 8453, 8395, 8395, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, -1, 8524, 8395, 8395, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, -1, 8422, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8477, 8478, 8479, -1, 8480, 8395, 8395, 8496, 8497, 8498, 8499, 8500, -1, 8501, 8395, 8395, 8454, 8455, 8456, 8457, 8458, 8459, 8460, -1, 8461, 8395, 8395, 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, -1, 8534, 8395, 8395, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, -1, 8434, 8314, 8395, 8488, 8488, 8488, 8488, 8488, 8488, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, -1]]. +Object config [object id=8390, config id=502, shift=16, childs=[8395, 8394, 8393, 8392, 8395, 8395, 8395, 8395, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8396, 8397, 8398, 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8473, 8474, 8475, -1, 8476, 8395, 8395, 8490, 8491, 8492, 8493, 8494, -1, 8495, 8395, 8395, 8446, 8447, 8448, 8449, 8450, 8451, 8452, -1, 8453, 8395, 8395, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, -1, 8524, 8395, 8395, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, -1, 8422, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8477, 8478, 8479, -1, 8480, 8395, 8395, 8496, 8497, 8498, 8499, 8500, -1, 8501, 8395, 8395, 8454, 8455, 8456, 8457, 8458, 8459, 8460, -1, 8461, 8395, 8395, 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, -1, 8534, 8395, 8395, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, -1, 8434, 8314, 8395, 8488, 8488, 8488, 8488, 8488, 8488, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, -1]]. +Object config [object id=8389, config id=502, shift=8, childs=[8395, 8394, 8393, 8392, 8395, 8395, 8395, 8395, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8396, 8397, 8398, 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8473, 8474, 8475, -1, 8476, 8395, 8395, 8490, 8491, 8492, 8493, 8494, -1, 8495, 8395, 8395, 8446, 8447, 8448, 8449, 8450, 8451, 8452, -1, 8453, 8395, 8395, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, -1, 8524, 8395, 8395, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, -1, 8422, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8477, 8478, 8479, -1, 8480, 8395, 8395, 8496, 8497, 8498, 8499, 8500, -1, 8501, 8395, 8395, 8454, 8455, 8456, 8457, 8458, 8459, 8460, -1, 8461, 8395, 8395, 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, -1, 8534, 8395, 8395, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, -1, 8434, 8395, 8395, 8488, 8488, 8488, 8488, 8488, 8488, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, -1]]. +Object config [object id=8388, config id=502, shift=0, childs=[8395, 8394, 8393, 8392, 8395, 8395, 8395, 8395, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8396, 8397, 8398, 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8473, 8474, 8475, -1, 8476, 8395, 8395, 8490, 8491, 8492, 8493, 8494, -1, 8495, 8395, 8395, 8446, 8447, 8448, 8449, 8450, 8451, 8452, -1, 8453, 8395, 8395, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, -1, 8524, 8395, 8395, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, -1, 8422, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8477, 8478, 8479, -1, 8480, 8395, 8395, 8496, 8497, 8498, 8499, 8500, -1, 8501, 8395, 8395, 8454, 8455, 8456, 8457, 8458, 8459, 8460, -1, 8461, 8395, 8395, 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, -1, 8534, 8395, 8395, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, -1, 8434, 8395, 8395, 8488, 8488, 8488, 8488, 8488, 8488, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, -1]]. +Object config [object id=8387, config id=502, shift=24, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8469, 8470, 8470, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8471, -1, 8472, -1]]. +Object config [object id=8386, config id=502, shift=16, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8469, 8470, 8470, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8471, -1, 8472, -1]]. +Object config [object id=8385, config id=502, shift=8, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8469, 8470, 8470, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8471, -1, 8472, -1]]. +Object config [object id=8384, config id=502, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8469, 8470, 8470, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8471, -1, 8472, -1]]. +Object config [object id=8338, config id=507, shift=0, childs=[8342, 8341, 8340, 8339, 8342, 8342, 8342, 8342, 8343, 8344, 8345, 8346, 8347, 8348, 8349, 8350, 8351, 8352, 8353, 8354, 8355, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366, 8367, 8368, 8370, 8371, 8372, 8373, 8374, 8375, 8376, 8377, 8378, 8379, 8380, 8381, 8356, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, -1]]. +Object config [object id=8337, config id=512, shift=8, childs=[8314, 8313, 8312, 8311, 8315, 8316, 8317, 8318, 8319, 8320, 8321, 8322, 8323, 8324, 8325, 8326, 8327, 8328, 8329, 8330, 8331, 8332, 8333, 8334, 8335, 8336, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, 8314, -1]]. +Object config [object id=8382, config id=507, shift=8, childs=[8342, 8341, 8340, 8339, 8342, 8342, 8342, 8342, 8343, 8344, 8345, 8346, 8347, 8348, 8349, 8350, 8351, 8352, 8353, 8354, 8355, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366, 8367, 8368, 8370, 8371, 8372, 8373, 8374, 8375, 8376, 8377, 8378, 8379, 8380, 8381, 8356, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, -1]]. +Object config [object id=8383, config id=507, shift=16, childs=[8342, 8341, 8340, 8339, 8342, 8342, 8342, 8342, 8343, 8344, 8345, 8346, 8347, 8348, 8349, 8350, 8351, 8352, 8353, 8354, 8355, 8358, 8359, 8360, 8361, 8362, 8363, 8364, 8365, 8366, 8367, 8368, 8370, 8371, 8372, 8373, 8374, 8375, 8376, 8377, 8378, 8379, 8380, 8381, 8356, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, 8342, -1]]. +Object config [object id=8550, config id=504, shift=0, childs=[8576, 8575, 8574, 8573, 8576, 8576, 8558, 8559, 8560, 8561, 8562, 8562, 8562, 8580, 8581, 8582, 8583, 8584, 8584, 8584, 8535, 8536, 8537, 8538, 8539, 8539, 8539, 8641, 8642, 8643, 8644, 8645, 8645, 8645, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8624, 8624, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8601, 8601, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8664, 8664, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8563, 8564, 8565, 8566, 8576, 8576, 8576, 8585, 8586, 8587, 8588, 8576, 8576, 8576, 8540, 8541, 8542, 8543, 8576, 8576, 8576, 8646, 8647, 8648, 8649, 8576, 8576, 8576, 8625, 8626, 8627, 8628, 8629, 8630, 8576, 8576, 8576, 8602, 8603, 8604, 8605, 8606, 8607, 8576, 8576, 8576, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8567, 8568, 8569, 8576, 8576, 8576, 8576, 8589, 8590, 8591, 8576, 8576, 8576, 8576, 8544, 8545, 8546, 8576, 8576, 8576, 8576, 8650, 8651, 8652, 8576, 8576, 8576, 8576, 8631, 8632, 8633, 8634, 8635, 8576, 8576, 8576, 8576, 8608, 8609, 8610, 8611, 8612, 8576, 8576, 8576, 8576, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8570, 8571, 8572, 8576, 8576, 8576, 8576, 8592, 8593, 8594, 8576, 8576, 8576, 8576, 8547, 8548, 8549, 8576, 8576, 8576, 8576, 8653, 8654, 8655, 8576, 8576, 8576, 8576, 8636, 8637, 8638, 8639, 8640, 8576, 8576, 8576, 8576, 8613, 8614, 8615, 8616, 8617, 8576, 8576, 8576, 8576, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8576, 8576, 8576, 8576, -1]]. +Object config [object id=8551, config id=504, shift=8, childs=[8576, 8575, 8574, 8573, 8576, 8576, 8558, 8559, 8560, 8561, 8562, 8562, 8562, 8580, 8581, 8582, 8583, 8584, 8584, 8584, 8535, 8536, 8537, 8538, 8539, 8539, 8539, 8641, 8642, 8643, 8644, 8645, 8645, 8645, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8624, 8624, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8601, 8601, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8664, 8664, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8563, 8564, 8565, 8566, 8576, 8576, 8576, 8585, 8586, 8587, 8588, 8576, 8576, 8576, 8540, 8541, 8542, 8543, 8576, 8576, 8576, 8646, 8647, 8648, 8649, 8576, 8576, 8576, 8625, 8626, 8627, 8628, 8629, 8630, 8576, 8576, 8576, 8602, 8603, 8604, 8605, 8606, 8607, 8576, 8576, 8576, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8567, 8568, 8569, 8576, 8576, 8576, 8576, 8589, 8590, 8591, 8576, 8576, 8576, 8576, 8544, 8545, 8546, 8576, 8576, 8576, 8576, 8650, 8651, 8652, 8576, 8576, 8576, 8576, 8631, 8632, 8633, 8634, 8635, 8576, 8576, 8576, 8576, 8608, 8609, 8610, 8611, 8612, 8576, 8576, 8576, 8576, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8570, 8571, 8572, 8576, 8576, 8576, 8576, 8592, 8593, 8594, 8576, 8576, 8576, 8576, 8547, 8548, 8549, 8576, 8576, 8576, 8576, 8653, 8654, 8655, 8576, 8576, 8576, 8576, 8636, 8637, 8638, 8639, 8640, 8576, 8576, 8576, 8576, 8613, 8614, 8615, 8616, 8617, 8576, 8576, 8576, 8576, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8576, 8576, 8576, 8576, -1]]. +Object config [object id=8556, config id=505, shift=16, childs=[8579, 8578, 8577, 8573, 8579, 8579, 8558, 8559, 8560, 8561, 8562, 8562, 8562, 8580, 8581, 8582, 8583, 8584, 8584, 8584, 8535, 8536, 8537, 8538, 8539, 8539, 8539, 8641, 8642, 8643, 8644, 8645, 8645, 8645, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8624, 8624, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8601, 8601, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8664, 8664, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8563, 8564, 8565, 8566, 8579, 8579, 8579, 8585, 8586, 8587, 8588, 8579, 8579, 8579, 8540, 8541, 8542, 8543, 8579, 8579, 8579, 8646, 8647, 8648, 8649, 8579, 8579, 8579, 8625, 8626, 8627, 8628, 8629, 8630, 8579, 8579, 8579, 8602, 8603, 8604, 8605, 8606, 8607, 8579, 8579, 8579, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8567, 8568, 8569, 8579, 8579, 8579, 8579, 8589, 8590, 8591, 8579, 8579, 8579, 8579, 8544, 8545, 8546, 8579, 8579, 8579, 8579, 8650, 8651, 8652, 8579, 8579, 8579, 8579, 8631, 8632, 8633, 8634, 8635, 8579, 8579, 8579, 8579, 8608, 8609, 8610, 8611, 8612, 8579, 8579, 8579, 8579, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8570, 8571, 8572, 8579, 8579, 8579, 8579, 8592, 8593, 8594, 8579, 8579, 8579, 8579, 8547, 8548, 8549, 8579, 8579, 8579, 8579, 8653, 8654, 8655, 8579, 8579, 8579, 8579, 8636, 8637, 8638, 8639, 8640, 8579, 8579, 8579, 8579, 8613, 8614, 8615, 8616, 8617, 8579, 8579, 8579, 8579, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8579, 8579, 8579, 8579, -1]]. +Object config [object id=8557, config id=505, shift=24, childs=[8579, 8578, 8577, 8573, 8579, 8579, 8558, 8559, 8560, 8561, 8562, 8562, 8562, 8580, 8581, 8582, 8583, 8584, 8584, 8584, 8535, 8536, 8537, 8538, 8539, 8539, 8539, 8641, 8642, 8643, 8644, 8645, 8645, 8645, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8624, 8624, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8601, 8601, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8664, 8664, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8563, 8564, 8565, 8566, 8579, 8579, 8579, 8585, 8586, 8587, 8588, 8579, 8579, 8579, 8540, 8541, 8542, 8543, 8579, 8579, 8579, 8646, 8647, 8648, 8649, 8579, 8579, 8579, 8625, 8626, 8627, 8628, 8629, 8630, 8579, 8579, 8579, 8602, 8603, 8604, 8605, 8606, 8607, 8579, 8579, 8579, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8567, 8568, 8569, 8579, 8579, 8579, 8579, 8589, 8590, 8591, 8579, 8579, 8579, 8579, 8544, 8545, 8546, 8579, 8579, 8579, 8579, 8650, 8651, 8652, 8579, 8579, 8579, 8579, 8631, 8632, 8633, 8634, 8635, 8579, 8579, 8579, 8579, 8608, 8609, 8610, 8611, 8612, 8579, 8579, 8579, 8579, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8579, 8570, 8571, 8572, 8579, 8579, 8579, 8579, 8592, 8593, 8594, 8579, 8579, 8579, 8579, 8547, 8548, 8549, 8579, 8579, 8579, 8579, 8653, 8654, 8655, 8579, 8579, 8579, 8579, 8636, 8637, 8638, 8639, 8640, 8579, 8579, 8579, 8579, 8613, 8614, 8615, 8616, 8617, 8579, 8579, 8579, 8579, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8579, 8579, 8579, 8579, -1]]. +Object config [object id=8554, config id=505, shift=0, childs=[8576, 8575, 8574, 8573, 8576, 8576, 8558, 8559, 8560, 8561, 8562, 8562, 8562, 8580, 8581, 8582, 8583, 8584, 8584, 8584, 8535, 8536, 8537, 8538, 8539, 8539, 8539, 8641, 8642, 8643, 8644, 8645, 8645, 8645, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8624, 8624, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8601, 8601, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8664, 8664, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8563, 8564, 8565, 8566, 8576, 8576, 8576, 8585, 8586, 8587, 8588, 8576, 8576, 8576, 8540, 8541, 8542, 8543, 8576, 8576, 8576, 8646, 8647, 8648, 8649, 8576, 8576, 8576, 8625, 8626, 8627, 8628, 8629, 8630, 8576, 8576, 8576, 8602, 8603, 8604, 8605, 8606, 8607, 8576, 8576, 8576, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8567, 8568, 8569, 8576, 8576, 8576, 8576, 8589, 8590, 8591, 8576, 8576, 8576, 8576, 8544, 8545, 8546, 8576, 8576, 8576, 8576, 8650, 8651, 8652, 8576, 8576, 8576, 8576, 8631, 8632, 8633, 8634, 8635, 8576, 8576, 8576, 8576, 8608, 8609, 8610, 8611, 8612, 8576, 8576, 8576, 8576, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8570, 8571, 8572, 8576, 8576, 8576, 8576, 8592, 8593, 8594, 8576, 8576, 8576, 8576, 8547, 8548, 8549, 8576, 8576, 8576, 8576, 8653, 8654, 8655, 8576, 8576, 8576, 8576, 8636, 8637, 8638, 8639, 8640, 8576, 8576, 8576, 8576, 8613, 8614, 8615, 8616, 8617, 8576, 8576, 8576, 8576, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8576, 8576, 8576, 8576, -1]]. +Object config [object id=8555, config id=505, shift=8, childs=[8576, 8575, 8574, 8573, 8576, 8576, 8558, 8559, 8560, 8561, 8562, 8562, 8562, 8580, 8581, 8582, 8583, 8584, 8584, 8584, 8535, 8536, 8537, 8538, 8539, 8539, 8539, 8641, 8642, 8643, 8644, 8645, 8645, 8645, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8624, 8624, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8601, 8601, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8664, 8664, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8563, 8564, 8565, 8566, 8576, 8576, 8576, 8585, 8586, 8587, 8588, 8576, 8576, 8576, 8540, 8541, 8542, 8543, 8576, 8576, 8576, 8646, 8647, 8648, 8649, 8576, 8576, 8576, 8625, 8626, 8627, 8628, 8629, 8630, 8576, 8576, 8576, 8602, 8603, 8604, 8605, 8606, 8607, 8576, 8576, 8576, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8567, 8568, 8569, 8576, 8576, 8576, 8576, 8589, 8590, 8591, 8576, 8576, 8576, 8576, 8544, 8545, 8546, 8576, 8576, 8576, 8576, 8650, 8651, 8652, 8576, 8576, 8576, 8576, 8631, 8632, 8633, 8634, 8635, 8576, 8576, 8576, 8576, 8608, 8609, 8610, 8611, 8612, 8576, 8576, 8576, 8576, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8570, 8571, 8572, 8576, 8576, 8576, 8576, 8592, 8593, 8594, 8576, 8576, 8576, 8576, 8547, 8548, 8549, 8576, 8576, 8576, 8576, 8653, 8654, 8655, 8576, 8576, 8576, 8576, 8636, 8637, 8638, 8639, 8640, 8576, 8576, 8576, 8576, 8613, 8614, 8615, 8616, 8617, 8576, 8576, 8576, 8576, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8576, 8576, 8576, 8576, -1]]. +Object config [object id=8552, config id=504, shift=16, childs=[8576, 8575, 8574, 8573, 8576, 8576, 8558, 8559, 8560, 8561, 8562, 8562, 8562, 8580, 8581, 8582, 8583, 8584, 8584, 8584, 8535, 8536, 8537, 8538, 8539, 8539, 8539, 8641, 8642, 8643, 8644, 8645, 8645, 8645, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8624, 8624, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8601, 8601, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8664, 8664, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8563, 8564, 8565, 8566, 8576, 8576, 8576, 8585, 8586, 8587, 8588, 8576, 8576, 8576, 8540, 8541, 8542, 8543, 8576, 8576, 8576, 8646, 8647, 8648, 8649, 8576, 8576, 8576, 8625, 8626, 8627, 8628, 8629, 8630, 8576, 8576, 8576, 8602, 8603, 8604, 8605, 8606, 8607, 8576, 8576, 8576, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8567, 8568, 8569, 8576, 8576, 8576, 8576, 8589, 8590, 8591, 8576, 8576, 8576, 8576, 8544, 8545, 8546, 8576, 8576, 8576, 8576, 8650, 8651, 8652, 8576, 8576, 8576, 8576, 8631, 8632, 8633, 8634, 8635, 8576, 8576, 8576, 8576, 8608, 8609, 8610, 8611, 8612, 8576, 8576, 8576, 8576, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8570, 8571, 8572, 8576, 8576, 8576, 8576, 8592, 8593, 8594, 8576, 8576, 8576, 8576, 8547, 8548, 8549, 8576, 8576, 8576, 8576, 8653, 8654, 8655, 8576, 8576, 8576, 8576, 8636, 8637, 8638, 8639, 8640, 8576, 8576, 8576, 8576, 8613, 8614, 8615, 8616, 8617, 8576, 8576, 8576, 8576, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8576, 8576, 8576, 8576, -1]]. +Object config [object id=8553, config id=504, shift=24, childs=[8576, 8575, 8574, 8573, 8576, 8576, 8558, 8559, 8560, 8561, 8562, 8562, 8562, 8580, 8581, 8582, 8583, 8584, 8584, 8584, 8535, 8536, 8537, 8538, 8539, 8539, 8539, 8641, 8642, 8643, 8644, 8645, 8645, 8645, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8624, 8624, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8601, 8601, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8664, 8664, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8563, 8564, 8565, 8566, 8576, 8576, 8576, 8585, 8586, 8587, 8588, 8576, 8576, 8576, 8540, 8541, 8542, 8543, 8576, 8576, 8576, 8646, 8647, 8648, 8649, 8576, 8576, 8576, 8625, 8626, 8627, 8628, 8629, 8630, 8576, 8576, 8576, 8602, 8603, 8604, 8605, 8606, 8607, 8576, 8576, 8576, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8567, 8568, 8569, 8576, 8576, 8576, 8576, 8589, 8590, 8591, 8576, 8576, 8576, 8576, 8544, 8545, 8546, 8576, 8576, 8576, 8576, 8650, 8651, 8652, 8576, 8576, 8576, 8576, 8631, 8632, 8633, 8634, 8635, 8576, 8576, 8576, 8576, 8608, 8609, 8610, 8611, 8612, 8576, 8576, 8576, 8576, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8570, 8571, 8572, 8576, 8576, 8576, 8576, 8592, 8593, 8594, 8576, 8576, 8576, 8576, 8547, 8548, 8549, 8576, 8576, 8576, 8576, 8653, 8654, 8655, 8576, 8576, 8576, 8576, 8636, 8637, 8638, 8639, 8640, 8576, 8576, 8576, 8576, 8613, 8614, 8615, 8616, 8617, 8576, 8576, 8576, 8576, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8576, 8576, 8576, 8576, -1]]. +Object config [object id=9788, config id=579, shift=9, childs=[9774, 9775, -1]]. +Object config [object id=9785, config id=579, shift=13, childs=[9772, 9775, -1]]. +Object config [object id=9784, config id=579, shift=12, childs=[9772, 9775, -1]]. +Object config [object id=9787, config id=579, shift=8, childs=[9771, 9775, -1]]. +Object config [object id=9786, config id=579, shift=7, childs=[-1, 9774, -1]]. +Object config [object id=9781, config id=579, shift=6, childs=[9773, 9775, -1]]. +Object config [object id=9780, config id=579, shift=5, childs=[9769, 9775, -1]]. +Object config [object id=9783, config id=579, shift=11, childs=[9773, 9775, -1]]. +Object config [object id=9782, config id=579, shift=10, childs=[9773, 9775, -1]]. +Object config [object id=9777, config id=579, shift=1, childs=[9769, 9775, -1]]. +Object config [object id=9776, config id=579, shift=0, childs=[9769, 9775, -1]]. +Object config [object id=9779, config id=579, shift=4, childs=[9771, 9775, -1]]. +Object config [object id=9778, config id=579, shift=3, childs=[9771, 9775, -1]]. +Object config [object id=9750, config id=594, shift=26, childs=[9751, 9752, -1]]. +Object config [object id=9832, config id=592, shift=16, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9833, config id=591, shift=16, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9834, config id=587, shift=27, childs=[-1, 9821, 9822, 9823, 9824, 9825, 9826, 9820, -1]]. +Object config [object id=9835, config id=591, shift=21, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9836, config id=591, shift=26, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9837, config id=592, shift=0, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9838, config id=585, shift=24, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9839, config id=585, shift=27, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9827, config id=591, shift=0, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9828, config id=591, shift=6, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9829, config id=591, shift=11, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9830, config id=592, shift=6, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9831, config id=592, shift=11, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, 9807, 9808, 9809, 9810, 9811, 9812, 9806, 9821, 9822, 9823, 9824, 9825, 9826, 9820, 9814, 9815, 9816, 9817, 9818, 9819, 9813, -1]]. +Object config [object id=9849, config id=580, shift=24, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9848, config id=580, shift=21, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9851, config id=581, shift=0, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9850, config id=580, shift=27, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9853, config id=581, shift=6, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9852, config id=581, shift=3, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9855, config id=581, shift=12, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9854, config id=581, shift=9, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9841, config id=580, shift=0, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9840, config id=592, shift=21, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9843, config id=580, shift=6, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9842, config id=580, shift=3, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9845, config id=580, shift=12, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9844, config id=580, shift=9, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9847, config id=580, shift=18, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9846, config id=580, shift=15, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9798, config id=585, shift=6, childs=[-1, 9790, 9791, 9792, 9793, 9794, 9795, 9789, -1]]. +Object config [object id=9796, config id=584, shift=12, childs=[-1, 9790, 9791, 9792, 9793, 9794, 9795, 9789, -1]]. +Object config [object id=9797, config id=584, shift=24, childs=[-1, 9790, 9791, 9792, 9793, 9794, 9795, 9789, -1]]. +Object config [object id=9893, config id=585, shift=9, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9892, config id=585, shift=6, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9895, config id=585, shift=15, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9894, config id=585, shift=12, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9889, config id=584, shift=27, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9888, config id=584, shift=24, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9891, config id=585, shift=3, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9890, config id=585, shift=0, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9897, config id=585, shift=21, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9896, config id=585, shift=18, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9863, config id=582, shift=6, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9862, config id=582, shift=3, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9861, config id=582, shift=0, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9860, config id=581, shift=27, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9859, config id=581, shift=24, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9858, config id=581, shift=21, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9857, config id=581, shift=18, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9856, config id=581, shift=15, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9871, config id=582, shift=27, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9870, config id=583, shift=0, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9869, config id=582, shift=24, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9868, config id=582, shift=21, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9867, config id=582, shift=12, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9866, config id=582, shift=18, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9865, config id=582, shift=15, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9864, config id=582, shift=9, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9878, config id=583, shift=24, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9879, config id=583, shift=27, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9876, config id=583, shift=18, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9877, config id=583, shift=21, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9874, config id=583, shift=12, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9875, config id=583, shift=15, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9872, config id=583, shift=3, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9873, config id=583, shift=9, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9886, config id=584, shift=18, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9887, config id=584, shift=21, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9884, config id=584, shift=12, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9885, config id=584, shift=15, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9882, config id=584, shift=6, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9883, config id=584, shift=9, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9880, config id=584, shift=0, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9881, config id=584, shift=3, childs=[-1, 9800, 9801, 9802, 9803, 9804, 9805, 9799, -1]]. +Object config [object id=9953, config id=587, shift=18, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9952, config id=587, shift=15, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9955, config id=587, shift=24, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9954, config id=587, shift=21, childs=[9937, 9907, 9912, 9917, 9922, 9927, 9932, 9902, -1]]. +Object config [object id=9957, config id=588, shift=3, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9956, config id=588, shift=0, childs=[9933, 9903, 9908, 9913, 9918, 9923, 9928, 9898, -1]]. +Object config [object id=9959, config id=588, shift=18, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9958, config id=588, shift=6, childs=[9937, 9907, 9912, 9917, 9922, 9927, 9932, 9902, -1]]. +Object config [object id=9961, config id=588, shift=24, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9960, config id=588, shift=21, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9963, config id=589, shift=0, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9962, config id=588, shift=27, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9965, config id=589, shift=6, childs=[9937, 9907, 9912, 9917, 9922, 9927, 9932, 9902, -1]]. +Object config [object id=9964, config id=589, shift=3, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9967, config id=589, shift=18, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9966, config id=589, shift=12, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9968, config id=589, shift=21, childs=[9937, 9907, 9912, 9917, 9922, 9927, 9932, 9902, -1]]. +Object config [object id=9969, config id=589, shift=24, childs=[9936, 9906, 9911, 9916, 9921, 9926, 9931, 9901, -1]]. +Object config [object id=9970, config id=589, shift=27, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9971, config id=590, shift=3, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9972, config id=590, shift=6, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9974, config id=594, shift=25, childs=[9976, 9975, -1]]. +Object config [object id=9938, config id=584, shift=12, childs=[9937, 9907, 9912, 9917, 9922, 9927, 9932, 9902, -1]]. +Object config [object id=9939, config id=584, shift=24, childs=[9937, 9907, 9912, 9917, 9922, 9927, 9932, 9902, -1]]. +Object config [object id=9942, config id=586, shift=6, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9943, config id=586, shift=12, childs=[9937, 9907, 9912, 9917, 9922, 9927, 9932, 9902, -1]]. +Object config [object id=9940, config id=585, shift=6, childs=[9937, 9907, 9912, 9917, 9922, 9927, 9932, 9902, -1]]. +Object config [object id=9941, config id=586, shift=0, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9946, config id=586, shift=21, childs=[9937, 9907, 9912, 9917, 9922, 9927, 9932, 9902, -1]]. +Object config [object id=9947, config id=586, shift=24, childs=[9936, 9906, 9911, 9916, 9921, 9926, 9931, 9901, -1]]. +Object config [object id=9944, config id=586, shift=15, childs=[9936, 9906, 9911, 9916, 9921, 9926, 9931, 9901, -1]]. +Object config [object id=9945, config id=586, shift=18, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9950, config id=587, shift=6, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9951, config id=587, shift=12, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=9948, config id=586, shift=27, childs=[9935, 9905, 9910, 9915, 9920, 9925, 9930, 9900, -1]]. +Object config [object id=9949, config id=587, shift=0, childs=[9934, 9904, 9909, 9914, 9919, 9924, 9929, 9899, -1]]. +Object config [object id=10040, config id=594, shift=23, childs=[-1, 10038, -1]]. +Object config [object id=10039, config id=594, shift=23, childs=[-1, 10037, -1]]. +Object config [object id=10104, config id=601, shift=5, childs=[10142, 10143, 10144, -1]]. +Object config [object id=10096, config id=601, shift=29, childs=[10097, 10098, 10099, 10100, 10101, 10102, -1]]. +Object config [object id=10069, config id=531, shift=2, childs=[10075, 10072, 10073, 10074, -1]]. +Object config [object id=10068, config id=531, shift=0, childs=[10075, 10072, 10073, 10074, -1]]. +Object config [object id=10071, config id=531, shift=6, childs=[10075, 10072, 10073, 10074, -1]]. +Object config [object id=10070, config id=531, shift=4, childs=[10075, 10072, 10073, 10074, -1]]. +Object config [object id=10164, config id=601, shift=1, childs=[10166, 10166, 10166, 10166, 10166, 10165, -1]]. +Object config [object id=9223, config id=554, shift=12, childs=[9227, 9226, 9225, 9224, 9228, 9229, 9230, 9231, -1]]. +Object config [object id=9232, config id=554, shift=25, childs=[9236, 9235, 9234, 9233, 9237, 9238, 9239, 9240, -1]]. +Object config [object id=9260, config id=1225, shift=0, childs=[30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30807, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30804, -1, -1, -1, -1, 30804, -1, -1, -1, 30804, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30806, -1]]. +Object config [object id=9250, config id=553, shift=7, childs=[9243, 9241, 9241, -1]]. +Object config [object id=9251, config id=553, shift=9, childs=[5789, 9244, 9244, -1]]. +Object config [object id=9252, config id=553, shift=9, childs=[9248, 9248, 9249, 9249, -1]]. +Object config [object id=9253, config id=553, shift=7, childs=[9246, 9246, 9247, 9247, -1]]. +Object config [object id=9254, config id=554, shift=28, childs=[9256, 9256, 9256, 9256, 9255, 9255, -1]]. +Object config [object id=9399, config id=568, shift=17, childs=[9402, 9401, 9400, 9403, 9404, 9405, 9406, 9407, 9408, -1]]. +Object config [object id=9438, config id=568, shift=7, childs=[9437, 9436, -1]]. +Object config [object id=9435, config id=568, shift=10, childs=[9430, 9431, 9432, 9433, 9434, 9431, -1]]. +Object config [object id=9442, config id=568, shift=8, childs=[9440, 9441, 9439, -1]]. +Object config [object id=11006, config id=642, shift=1, childs=[11007, 879, -1]]. +Object config [object id=10987, config id=642, shift=0, childs=[10988, 10988, 10988, 10988, 10988, 10988, 10988, 10988, 10988, 10988, 10988, 10988, 10988, 10988, 10988, 10988, 10989, 10990, 10991, 10994, 10993, 10996, 10998, 11002, 10992, 10995, 10997, 11003, 10999, 11001, 11000, 11004, -1]]. +Object config [object id=10970, config id=642, shift=16, childs=[-1, -1, -1, 10986, -1, -1, -1, 10985, -1, -1, -1, 10984, -1, -1, -1, 10981, -1, -1, -1, 10983, -1, -1, -1, 10980, -1, -1, -1, 10978, -1, -1, -1, 10975, -1, -1, -1, 10982, -1, -1, -1, 10979, -1, -1, -1, 10977, -1, -1, -1, 10974, -1, -1, -1, 10976, -1, -1, -1, 10973, -1, -1, -1, 10972, -1, -1, -1, 10971, -1]]. +Object config [object id=10952, config id=642, shift=13, childs=[10954, 10955, 10956, 10957, 10958, 10959, 10960, 10961, -1, -1, -1, -1, 10962, 10963, 10964, 10965, -1, -1, -1, -1, 10966, 10967, 10968, 10969, -1, -1, -1, -1, 10953, 10953, 10953, 10953, -1]]. +Object config [object id=10881, config id=640, shift=8, childs=[10876, 10875, -1]]. +Object config [object id=10880, config id=640, shift=7, childs=[10876, 10875, -1]]. +Object config [object id=10869, config id=640, shift=9, childs=[10871, 10870, -1]]. +Object config [object id=10873, config id=640, shift=0, childs=[10874, 10874, 10874, -1, 10874, 10874, -1]]. +Object config [object id=10872, config id=640, shift=0, childs=[10874, -1, 10874, 10874, 10874, 10874, -1]]. +Object config [object id=10877, config id=640, shift=4, childs=[10876, 10875, -1]]. +Object config [object id=10879, config id=640, shift=6, childs=[10876, 10875, -1]]. +Object config [object id=10878, config id=640, shift=5, childs=[10876, 10875, -1]]. +Object config [object id=10822, config id=638, shift=5, childs=[10820, 10820, -1]]. +Object config [object id=10823, config id=638, shift=5, childs=[10820, -1]]. +Object config [object id=10821, config id=638, shift=5, childs=[10820, 10820, 10820, -1]]. +Object config [object id=10806, config id=636, shift=2, childs=[10807, 10808, -1]]. +Object config [object id=10812, config id=636, shift=3, childs=[9516, 10813, -1]]. +Object config [object id=11242, config id=657, shift=15, childs=[-1, 11316, -1]]. +Object config [object id=11241, config id=657, shift=14, childs=[-1, 11316, -1]]. +Object config [object id=11233, config id=658, shift=11, childs=[11234, 11235, -1]]. +Object config [object id=11237, config id=657, shift=4, childs=[11238, 11239, 11315, -1]]. +Object config [object id=11213, config id=656, shift=1, childs=[11214, 11215, 11216, 11217, -1]]. +Object config [object id=11224, config id=656, shift=28, childs=[11250, 23553, 23553, 23553, -1]]. +Object config [object id=11225, config id=656, shift=28, childs=[11250, 11250, 23553, 23553, -1]]. +Object config [object id=11226, config id=656, shift=28, childs=[11250, 11250, 11250, 23553, -1]]. +Object config [object id=11227, config id=658, shift=9, childs=[11228, 11229, -1]]. +Object config [object id=11230, config id=658, shift=10, childs=[11231, 11232, -1]]. +Object config [object id=11218, config id=656, shift=27, childs=[11219, 11220, -1]]. +Object config [object id=11221, config id=657, shift=2, childs=[11317, 11318, 11319, -1]]. +Object config [object id=11222, config id=657, shift=6, childs=[11317, 11318, 11319, -1]]. +Object config [object id=11223, config id=657, shift=8, childs=[11317, 11318, 11319, -1]]. +Object config [object id=11046, config id=642, shift=25, childs=[11049, 11050, -1]]. +Object config [object id=11047, config id=642, shift=26, childs=[11049, 11050, -1]]. +Object config [object id=11045, config id=642, shift=24, childs=[11049, 11050, -1]]. +Object config [object id=11048, config id=642, shift=27, childs=[11049, 11050, -1]]. +Object config [object id=11012, config id=642, shift=6, childs=[11017, 11021, -1]]. +Object config [object id=11013, config id=642, shift=7, childs=[11017, 11022, -1]]. +Object config [object id=11014, config id=642, shift=8, childs=[11017, 11023, -1]]. +Object config [object id=11015, config id=642, shift=9, childs=[11019, 11024, -1]]. +Object config [object id=11008, config id=642, shift=2, childs=[11009, 11010, -1]]. +Object config [object id=11011, config id=642, shift=5, childs=[11017, 11020, -1]]. +Object config [object id=11016, config id=642, shift=10, childs=[11018, 11025, -1]]. +Object config [object id=11027, config id=642, shift=28, childs=[11037, 11035, 11033, 11031, 11029, 11039, -1]]. +Object config [object id=11026, config id=642, shift=28, childs=[11036, 11034, 11032, 11030, 11028, 11038, -1]]. +Object config [object id=10394, config id=616, shift=16, childs=[10402, 10404, -1]]. +Object config [object id=10395, config id=616, shift=16, childs=[-1, 10403, -1]]. +Object config [object id=10393, config id=616, shift=16, childs=[10409, 10410, -1]]. +Object config [object id=10398, config id=616, shift=14, childs=[-1, 10403, -1]]. +Object config [object id=10399, config id=616, shift=15, childs=[10407, 10408, -1]]. +Object config [object id=10396, config id=616, shift=14, childs=[10405, 10406, -1]]. +Object config [object id=10397, config id=616, shift=14, childs=[10402, 10404, -1]]. +Object config [object id=10388, config id=616, shift=0, childs=[10437, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10437, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10437, -1, -1, -1, -1, 10437, -1, 10437, -1, -1, 10437, -1, -1, -1, -1, 10437, -1, -1, -1, -1, 10437, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10437, -1, -1, -1, -1, 10437, -1, -1, -1, -1, 10436, -1]]. +Object config [object id=10389, config id=616, shift=0, childs=[10438, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10438, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10438, -1, -1, -1, -1, 10438, -1, 10438, -1, -1, 10438, -1, -1, -1, -1, 10438, -1, -1, -1, -1, 10438, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10438, -1, -1, -1, -1, 10438, -1, -1, -1, -1, 10439, -1]]. +Object config [object id=10401, config id=616, shift=15, childs=[-1, 10403, -1]]. +Object config [object id=10400, config id=616, shift=15, childs=[10402, 10404, -1]]. +Object config [object id=10266, config id=604, shift=20, childs=[10281, 10267, -1]]. +Object config [object id=10270, config id=604, shift=20, childs=[10255, 10271, -1]]. +Object config [object id=10268, config id=604, shift=20, childs=[10282, 10269, -1]]. +Object config [object id=10242, config id=602, shift=0, childs=[6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10246, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6328, -1, -1, -1, 6328, 6328, -1]]. +Object config [object id=10243, config id=602, shift=0, childs=[6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10247, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6329, -1, -1, -1, 6329, 6329, -1]]. +Object config [object id=10244, config id=602, shift=0, childs=[6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10248, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, 6330, 6330, -1]]. +Object config [object id=10245, config id=602, shift=0, childs=[6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10248, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6330, -1, -1, -1, 6330, 6330, -1]]. +Object config [object id=10249, config id=602, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10250, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10250, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10250, -1]]. +Object config [object id=10272, config id=604, shift=20, childs=[10280, 10273, -1]]. +Object config [object id=10277, config id=604, shift=20, childs=[10279, 10278, -1]]. +Object config [object id=10284, config id=453, shift=16, childs=[6774, 6775, -1]]. +Object config [object id=10638, config id=622, shift=22, childs=[409, 10639, 10640, -1]]. +Object config [object id=10667, config id=623, shift=11, childs=[10652, 10653, 10654, 10658, 10659, 10660, -1]]. +Object config [object id=10670, config id=623, shift=11, childs=[10671, 10671, 10671, 10671, 10671, 10672, -1]]. +Object config [object id=10669, config id=623, shift=14, childs=[10664, 10666, 10664, -1]]. +Object config [object id=10668, config id=623, shift=11, childs=[10652, 10653, 10654, 10658, 10659, 10660, -1]]. +Object config [object id=10565, config id=617, shift=1, childs=[-1, 10566, -1]]. +Object config [object id=10567, config id=617, shift=2, childs=[-1, 10568, -1]]. +Object config [object id=10563, config id=617, shift=0, childs=[-1, 10564, -1]]. +Object config [object id=10573, config id=617, shift=5, childs=[-1, 10574, -1]]. +Object config [object id=10575, config id=617, shift=6, childs=[-1, 10576, -1]]. +Object config [object id=10569, config id=617, shift=3, childs=[-1, 10570, -1]]. +Object config [object id=10571, config id=617, shift=4, childs=[-1, 10572, -1]]. +Object config [object id=10581, config id=617, shift=9, childs=[-1, 10582, -1]]. +Object config [object id=10577, config id=617, shift=7, childs=[-1, 10578, -1]]. +Object config [object id=10579, config id=617, shift=8, childs=[-1, 10580, -1]]. +Object config [object id=12001, config id=671, shift=0, childs=[12109, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12043, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12043, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12043, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12043, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12043, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12043, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12043, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12043, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12043, -1]]. +Object config [object id=12000, config id=671, shift=0, childs=[12109, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12042, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12042, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12042, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12042, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12042, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12042, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12042, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12042, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12042, -1]]. +Object config [object id=12002, config id=671, shift=22, childs=[-1, 12090, -1]]. +Object config [object id=11998, config id=671, shift=24, childs=[12091, 12092, 12092, -1]]. +Object config [object id=11999, config id=671, shift=0, childs=[12109, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12041, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12041, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12041, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12041, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12041, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12041, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12041, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12041, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12041, -1]]. +Object config [object id=12165, config id=674, shift=16, childs=[12144, 12147, 12148, 12149, 12150, 12151, 12152, 12153, 12154, 12145, 12146, 12155, 12156, 12157, 12158, -1]]. +Object config [object id=12164, config id=674, shift=8, childs=[12144, 12147, 12148, 12149, 12150, 12151, 12152, 12153, 12154, 12145, 12146, 12155, 12156, 12157, 12158, -1]]. +Object config [object id=12167, config id=675, shift=0, childs=[12170, 12170, 12168, 12169, 12171, -1]]. +Object config [object id=12166, config id=674, shift=24, childs=[12144, 12147, 12148, 12149, 12150, 12151, 12152, 12153, 12154, 12145, 12146, 12155, 12156, 12157, 12158, -1]]. +Object config [object id=12163, config id=674, shift=0, childs=[12144, 12147, 12148, 12149, 12150, 12151, 12152, 12153, 12154, 12145, 12146, 12155, 12156, 12157, 12158, -1]]. +Object config [object id=12261, config id=680, shift=22, childs=[12262, 12263, -1]]. +Object config [object id=12266, config id=680, shift=22, childs=[12267, 12268, -1]]. +Object config [object id=12233, config id=1011, shift=0, childs=[24550, 24547, -1]]. +Object config [object id=12232, config id=1011, shift=1, childs=[24550, 24546, -1]]. +Object config [object id=12234, config id=1011, shift=4, childs=[24550, 24548, -1]]. +Object config [object id=12138, config id=1011, shift=2, childs=[24550, 24540, -1]]. +Object config [object id=12139, config id=1011, shift=6, childs=[24543, 24542, -1]]. +Object config [object id=12137, config id=1011, shift=3, childs=[24550, 24539, -1]]. +Object config [object id=11419, config id=667, shift=4, childs=[-1, 11415, -1]]. +Object config [object id=11422, config id=667, shift=4, childs=[11423, 11423, -1]]. +Object config [object id=11420, config id=667, shift=4, childs=[-1, 11411, -1]]. +Object config [object id=11421, config id=667, shift=4, childs=[-1, 11413, -1]]. +Object config [object id=11359, config id=661, shift=0, childs=[-1, 11354, -1]]. +Object config [object id=11355, config id=661, shift=0, childs=[-1, 11354, -1]]. +Object config [object id=11377, config id=666, shift=19, childs=[11390, 11365, 11391, -1]]. +Object config [object id=11376, config id=666, shift=17, childs=[11393, 11364, 11394, -1]]. +Object config [object id=11378, config id=666, shift=21, childs=[11393, 11364, 11394, -1]]. +Object config [object id=11372, config id=666, shift=9, childs=[11393, 11364, 11394, -1]]. +Object config [object id=11373, config id=666, shift=11, childs=[11384, 11367, 11385, -1]]. +Object config [object id=11374, config id=666, shift=13, childs=[11393, 11364, 11394, -1]]. +Object config [object id=11375, config id=666, shift=15, childs=[11387, 11366, 11388, -1]]. +Object config [object id=11368, config id=666, shift=1, childs=[11393, 11364, 11394, -1]]. +Object config [object id=11369, config id=666, shift=3, childs=[11390, 11365, 11391, -1]]. +Object config [object id=11370, config id=666, shift=5, childs=[11393, 11364, 11394, -1]]. +Object config [object id=11371, config id=666, shift=7, childs=[11387, 11366, 11388, -1]]. +Object config [object id=12805, config id=704, shift=21, childs=[12806, 12807, 12808, 12809, -1]]. +Object config [object id=12803, config id=704, shift=23, childs=[12891, 12804, 12804, 12891, -1]]. +Object config [object id=12810, config id=704, shift=21, childs=[-1, -1, -1, 12811, -1]]. +Object config [object id=12947, config id=870, shift=2, childs=[17956, 17957, -1]]. +Object config [object id=12945, config id=870, shift=3, childs=[-1, 17955, -1]]. +Object config [object id=12944, config id=870, shift=0, childs=[17953, 17954, -1]]. +Object config [object id=12633, config id=678, shift=30, childs=[12634, 12635, 12636, 12637, -1]]. +Object config [object id=12610, config id=685, shift=26, childs=[12606, 12607, 12608, 12609, -1]]. +Object config [object id=12549, config id=684, shift=12, childs=[12550, 12551, 12552, 12553, 12554, 12555, -1]]. +Object config [object id=12558, config id=684, shift=16, childs=[12559, 12560, -1]]. +Object config [object id=12795, config id=704, shift=27, childs=[-1, 12796, -1]]. +Object config [object id=12772, config id=704, shift=26, childs=[12773, 12770, -1]]. +Object config [object id=12760, config id=704, shift=17, childs=[12787, 12786, -1]]. +Object config [object id=12762, config id=704, shift=25, childs=[-1, 12763, -1]]. +Object config [object id=12757, config id=704, shift=27, childs=[12893, 12793, -1]]. +Object config [object id=12756, config id=704, shift=27, childs=[12893, 12792, -1]]. +Object config [object id=12759, config id=704, shift=15, childs=[12799, 12798, -1]]. +Object config [object id=12758, config id=704, shift=27, childs=[12893, 12794, -1]]. +Object config [object id=12753, config id=704, shift=27, childs=[12788, 12789, -1]]. +Object config [object id=12752, config id=704, shift=11, childs=[12787, 12786, -1]]. +Object config [object id=12755, config id=704, shift=27, childs=[12788, 12791, -1]]. +Object config [object id=12754, config id=704, shift=27, childs=[12788, 12790, -1]]. +Object config [object id=12751, config id=704, shift=9, childs=[12782, 12783, -1]]. +Object config [object id=12743, config id=704, shift=3, childs=[12744, 12745, -1]]. +Object config [object id=12738, config id=704, shift=2, childs=[12739, 12740, -1]]. +Object config [object id=12354, config id=678, shift=0, childs=[-1, -1, -1, -1, 12355, -1]]. +Object config [object id=12329, config id=679, shift=0, childs=[12318, 12330, -1]]. +Object config [object id=12331, config id=679, shift=1, childs=[-1, 12332, -1]]. +Object config [object id=12333, config id=679, shift=1, childs=[-1, 12334, -1]]. +Object config [object id=12335, config id=679, shift=1, childs=[12318, 12312, -1]]. +Object config [object id=12336, config id=679, shift=2, childs=[12318, 12337, -1]]. +Object config [object id=12338, config id=679, shift=3, childs=[12318, 12339, -1]]. +Object config [object id=12340, config id=679, shift=4, childs=[12318, 12341, -1]]. +Object config [object id=12342, config id=679, shift=5, childs=[12319, 12343, -1]]. +Object config [object id=12344, config id=679, shift=6, childs=[12318, 12345, -1]]. +Object config [object id=12346, config id=679, shift=7, childs=[12318, 12347, -1]]. +Object config [object id=12308, config id=678, shift=0, childs=[-1, -1, -1, 12309, 12309, 12309, -1]]. +Object config [object id=12416, config id=679, shift=15, childs=[12386, 12387, 12387, -1]]. +Object config [object id=12417, config id=679, shift=15, childs=[12378, 12380, 12379, -1]]. +Object config [object id=14172, config id=995, shift=0, childs=[14169, 14171, -1]]. +Object config [object id=13880, config id=710, shift=5, childs=[13881, -1]]. +Object config [object id=13898, config id=710, shift=9, childs=[13899, 13900, -1]]. +Object config [object id=13912, config id=710, shift=10, childs=[13923, 13924, -1]]. +Object config [object id=13907, config id=709, shift=13, childs=[13913, -1]]. +Object config [object id=13910, config id=709, shift=16, childs=[13919, -1]]. +Object config [object id=13911, config id=709, shift=17, childs=[13921, -1]]. +Object config [object id=13908, config id=709, shift=14, childs=[13915, -1]]. +Object config [object id=13909, config id=709, shift=15, childs=[13917, -1]]. +Object config [object id=13968, config id=710, shift=11, childs=[13969, 13970, -1]]. +Object config [object id=13993, config id=710, shift=6, childs=[13994, 13995, 13996, 13997, 13998, -1]]. +Object config [object id=14004, config id=716, shift=21, childs=[14006, 14005, 14007, 14008, 14009, -1]]. +Object config [object id=14001, config id=710, shift=13, childs=[14003, 14002, -1]]. +Object config [object id=15240, config id=731, shift=3, childs=[15230, 15231, 15231, 15231, 15232, 15232, 15232, 15232, 15232, 15232, -1]]. +Object config [object id=15241, config id=731, shift=3, childs=[15233, 15233, 15235, 15236, 15234, 15234, 15234, 15234, 15234, 15234, -1]]. +Object config [object id=15242, config id=731, shift=3, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, 15237, -1]]. +Object config [object id=15238, config id=731, shift=3, childs=[15226, 15226, 15226, 15226, 15227, 15227, 15228, 15229, 15229, 15229, -1]]. +Object config [object id=15239, config id=731, shift=3, childs=[15222, 15222, 15222, 15222, 15222, 15223, 15224, 15225, -1]]. +Object config [object id=15252, config id=731, shift=7, childs=[15217, 15216, -1]]. +Object config [object id=15193, config id=730, shift=10, childs=[15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15190, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15191, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15191, -1]]. +Object config [object id=15203, config id=730, shift=10, childs=[15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15201, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15202, -1]]. +Object config [object id=15200, config id=730, shift=10, childs=[15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15198, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15199, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15199, -1]]. +Object config [object id=15067, config id=729, shift=11, childs=[15063, 15064, 15065, 15066, -1]]. +Object config [object id=15071, config id=729, shift=13, childs=[15068, 15069, 15070, -1]]. +Object config [object id=15061, config id=728, shift=1, childs=[15052, 15053, -1]]. +Object config [object id=15060, config id=728, shift=0, childs=[15057, -1]]. +Object config [object id=15084, config id=729, shift=18, childs=[15080, 15081, 15082, 15083, -1]]. +Object config [object id=15074, config id=729, shift=15, childs=[15072, 15073, -1]]. +Object config [object id=15079, config id=729, shift=16, childs=[15075, 15076, 15077, 15078, -1]]. +Object config [object id=14934, config id=723, shift=13, childs=[14946, 14949, -1]]. +Object config [object id=14935, config id=723, shift=14, childs=[14947, 14950, -1]]. +Object config [object id=14933, config id=723, shift=12, childs=[14945, 14948, -1]]. +Object config [object id=14939, config id=723, shift=17, childs=[14938, 14938, 14938, 14938, 14938, 14938, -1]]. +Object config [object id=14936, config id=723, shift=15, childs=[14945, 14948, -1]]. +Object config [object id=14937, config id=723, shift=16, childs=[14946, 14949, -1]]. +Object config [object id=14955, config id=723, shift=9, childs=[14958, 14958, 14959, 14960, 14960, -1]]. +Object config [object id=14954, config id=723, shift=9, childs=[14957, 14957, 14957, 14956, 14956, -1]]. +Object config [object id=14908, config id=723, shift=0, childs=[7102, -1, -1, -1, -1, 7102, -1, -1, -1, -1, 7102, -1, -1, -1, -1, 7102, -1, -1, -1, -1, 7102, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7102, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7102, -1]]. +Object config [object id=14909, config id=723, shift=28, childs=[14910, -1]]. +Object config [object id=14911, config id=723, shift=29, childs=[14912, -1]]. +Object config [object id=16316, config id=810, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16305, -1, -1, -1, -1, 16305, -1, -1, -1, -1, 16305, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16305, -1, -1, -1, -1, 16305, -1, -1, -1, -1, 16306, -1, 16305, 16306, -1, 16306, -1, -1, -1, -1, 16304, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16304, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16304, -1]]. +Object config [object id=16315, config id=810, shift=7, childs=[-1, 16224, -1]]. +Object config [object id=16171, config id=160, shift=-1, childs=[16169, 16169, 16170, -1]]. +Object config [object id=16216, config id=810, shift=0, childs=[12060, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12060, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16217, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16217, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16217, -1, -1, -1, -1, 16217, -1, -1, -1, -1, 16217, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16217, -1, -1, -1, -1, 16217, -1, -1, -1, -1, 16217, -1, 16217, 16217, -1, 16217, -1, -1, -1, -1, 16217, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16217, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16217, -1]]. +Object config [object id=16218, config id=810, shift=0, childs=[12061, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12061, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16219, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16219, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16219, -1, -1, -1, -1, 16219, -1, -1, -1, -1, 16219, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16219, -1, -1, -1, -1, 16219, -1, -1, -1, -1, 16219, -1, 16219, 16219, -1, 16219, -1, -1, -1, -1, 16219, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16219, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16219, -1]]. +Object config [object id=16220, config id=810, shift=0, childs=[12062, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12062, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16221, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16221, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16221, -1, -1, -1, -1, 16221, -1, -1, -1, -1, 16221, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16221, -1, -1, -1, -1, 16221, -1, -1, -1, -1, 16221, -1, 16221, 16221, -1, 16221, -1, -1, -1, -1, 16221, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16221, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16221, -1]]. +Object config [object id=16222, config id=810, shift=0, childs=[12063, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12063, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16223, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16223, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16223, -1, -1, -1, -1, 16223, -1, -1, -1, -1, 16223, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16223, -1, -1, -1, -1, 16223, -1, -1, -1, -1, 16223, -1, 16223, 16223, -1, 16223, -1, -1, -1, -1, 16223, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16223, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16223, -1]]. +Object config [object id=16211, config id=810, shift=0, childs=[12064, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12064, -1]]. +Object config [object id=16212, config id=810, shift=0, childs=[12066, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12066, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16213, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16213, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16213, -1, -1, -1, -1, 16213, -1, -1, -1, -1, 16213, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16213, -1, -1, -1, -1, 16213, -1, -1, -1, -1, 16213, -1, 16213, 16213, -1, 16213, -1, -1, -1, -1, 16213, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16213, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16213, -1]]. +Object config [object id=16214, config id=810, shift=0, childs=[12067, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12067, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16215, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16215, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16215, -1, -1, -1, -1, 16215, -1, -1, -1, -1, 16215, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16215, -1, -1, -1, -1, 16215, -1, -1, -1, -1, 16215, -1, 16215, 16215, -1, 16215, -1, -1, -1, -1, 16215, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16215, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16215, -1]]. +Object config [object id=16026, config id=798, shift=3, childs=[15924, 15924, 15926, -1]]. +Object config [object id=16025, config id=798, shift=1, childs=[15924, 15924, 15926, -1]]. +Object config [object id=15763, config id=794, shift=0, childs=[15749, 15749, 15749, 15749, 15749, 15749, 15749, 15749, 15749, 15749, 15749, 15749, 15749, 15748, -1]]. +Object config [object id=15765, config id=794, shift=0, childs=[15752, 15752, 15752, 15752, 15752, 15752, 15752, 15753, 15753, 15753, 15753, 15753, 15753, 15753, 15753, 15753, -1]]. +Object config [object id=15764, config id=794, shift=0, childs=[15751, 15751, 15751, 15751, 15751, 15751, 15751, 15751, 15751, 15751, 15751, 15751, 15751, 15750, -1]]. +Object config [object id=15766, config id=794, shift=22, childs=[15754, 15755, 15756, 15754, -1]]. +Object config [object id=15672, config id=793, shift=4, childs=[15668, -1]]. +Object config [object id=15673, config id=793, shift=0, childs=[15668, -1]]. +Object config [object id=15670, config id=793, shift=2, childs=[15668, -1]]. +Object config [object id=15671, config id=793, shift=3, childs=[15668, -1]]. +Object config [object id=15669, config id=793, shift=1, childs=[15668, -1]]. +Object config [object id=15712, config id=794, shift=24, childs=[-1, 15711, -1]]. +Object config [object id=15710, config id=794, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, 15709, -1]]. +Object config [object id=15701, config id=794, shift=0, childs=[15696, 15696, 15696, 15696, 15696, 15696, 15696, 15695, 15695, 15695, 15695, 15695, 15695, 15695, -1]]. +Object config [object id=15702, config id=794, shift=0, childs=[15698, 15698, 15698, 15698, 15698, 15698, 15698, 15697, 15697, 15697, 15697, 15697, 15697, 15697, -1]]. +Object config [object id=15703, config id=794, shift=0, childs=[15700, 15700, 15700, 15700, 15700, 15700, 15700, 15699, 15699, 15699, 15699, 15699, 15699, 15699, -1]]. +Object config [object id=15590, config id=1, shift=5, childs=[15, 15601, -1]]. +Object config [object id=15591, config id=1, shift=6, childs=[16, 15601, -1]]. +Object config [object id=15585, config id=828, shift=3, childs=[16585, 16586, 16587, 16588, 16589, 16590, 16591, 16592, 16593, 16594, -1]]. +Object config [object id=15586, config id=828, shift=7, childs=[16585, 16586, 16587, 16588, 16589, 16590, 16591, 16592, 16593, 16594, -1]]. +Object config [object id=15587, config id=824, shift=8, childs=[16951, 16952, 16951, -1]]. +Object config [object id=15597, config id=0, shift=-1, childs=[5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, -1]]. +Object config [object id=15592, config id=1, shift=7, childs=[17, 15601, -1]]. +Object config [object id=15593, config id=1, shift=8, childs=[18, 15601, -1]]. +Object config [object id=15594, config id=1, shift=9, childs=[19, 15601, -1]]. +Object config [object id=15595, config id=1, shift=10, childs=[20, 15601, -1]]. +Object config [object id=15484, config id=1011, shift=5, childs=[24550, 24549, -1]]. +Object config [object id=15485, config id=1011, shift=20, childs=[24630, 24631, -1]]. +Object config [object id=17428, config id=222, shift=20, childs=[17425, 17427, -1]]. +Object config [object id=17431, config id=222, shift=21, childs=[17430, 17429, 17430, -1]]. +Object config [object id=17454, config id=222, shift=23, childs=[17435, 17438, -1]]. +Object config [object id=18146, config id=870, shift=9, childs=[18144, 18145, 18145, -1]]. +Object config [object id=18116, config id=870, shift=23, childs=[18068, 18068, 18069, -1]]. +Object config [object id=18119, config id=870, shift=4, childs=[17966, 17967, 17967, 17967, 17967, 17967, 17968, 17968, 17968, 17968, 17968, 17969, 17969, 17969, 17969, 17969, -1]]. +Object config [object id=18115, config id=870, shift=23, childs=[18066, 18067, 18067, -1]]. +Object config [object id=18125, config id=870, shift=17, childs=[18040, 18041, -1]]. +Object config [object id=18124, config id=870, shift=8, childs=[-1, 18036, -1]]. +Object config [object id=18127, config id=870, shift=20, childs=[18045, 18046, -1]]. +Object config [object id=18126, config id=870, shift=18, childs=[18042, 18043, 18044, -1]]. +Object config [object id=18121, config id=870, shift=11, childs=[17988, 17989, -1]]. +Object config [object id=18120, config id=870, shift=9, childs=[17983, 17984, 17985, -1]]. +Object config [object id=18123, config id=870, shift=8, childs=[18035, -1]]. +Object config [object id=18122, config id=870, shift=8, childs=[18033, 18034, -1]]. +Object config [object id=18132, config id=870, shift=27, childs=[-1, -1, 18081, -1]]. +Object config [object id=18133, config id=870, shift=27, childs=[-1, -1, 18082, -1]]. +Object config [object id=18134, config id=870, shift=29, childs=[18101, 18102, -1]]. +Object config [object id=18135, config id=870, shift=29, childs=[-1, -1, 18103, -1]]. +Object config [object id=18128, config id=870, shift=25, childs=[18074, 18075, -1]]. +Object config [object id=18129, config id=870, shift=25, childs=[-1, -1, 18076, -1]]. +Object config [object id=18130, config id=870, shift=25, childs=[-1, -1, 18077, -1]]. +Object config [object id=18131, config id=870, shift=27, childs=[18079, 18080, -1]]. +Object config [object id=18136, config id=870, shift=29, childs=[-1, -1, 18104, -1]]. +Object config [object id=18083, config id=870, shift=21, childs=[18059, 18060, 18061, -1]]. +Object config [object id=18084, config id=870, shift=21, childs=[18062, 18063, 18064, -1]]. +Object config [object id=18323, config id=159, shift=-1, childs=[18187, 18187, 18187, 18186, 18186, 18186, 18186, 18186, 18186, 18186, 18186, 18186, 18186, -1]]. +Object config [object id=18251, config id=159, shift=-1, childs=[18381, 18381, 18381, 18381, 18381, 18381, 18381, 18381, 18381, 18380, 18380, 18380, 18380, -1]]. +Object config [object id=16525, config id=820, shift=14, childs=[16502, 16506, 16510, 16514, -1]]. +Object config [object id=16524, config id=820, shift=12, childs=[16502, 16506, 16510, 16514, -1]]. +Object config [object id=16527, config id=820, shift=18, childs=[16502, 16506, 16510, 16514, -1]]. +Object config [object id=16526, config id=820, shift=16, childs=[16502, 16506, 16510, 16514, -1]]. +Object config [object id=16521, config id=820, shift=6, childs=[16501, 16505, 16509, 16513, -1]]. +Object config [object id=16520, config id=820, shift=4, childs=[16501, 16505, 16509, 16513, -1]]. +Object config [object id=16523, config id=820, shift=10, childs=[16502, 16506, 16510, 16514, -1]]. +Object config [object id=16522, config id=820, shift=8, childs=[16501, 16505, 16509, 16513, -1]]. +Object config [object id=16519, config id=820, shift=2, childs=[16501, 16505, 16509, 16513, -1]]. +Object config [object id=16518, config id=820, shift=0, childs=[16501, 16505, 16509, 16513, -1]]. +Object config [object id=16540, config id=821, shift=10, childs=[16475, 16476, -1]]. +Object config [object id=16541, config id=821, shift=11, childs=[16475, 16476, -1]]. +Object config [object id=16542, config id=821, shift=12, childs=[16475, 16476, -1]]. +Object config [object id=16543, config id=821, shift=14, childs=[16484, 16483, 16485, -1]]. +Object config [object id=16537, config id=821, shift=2, childs=[16473, 16474, -1]]. +Object config [object id=16538, config id=821, shift=9, childs=[16475, 16476, -1]]. +Object config [object id=16539, config id=821, shift=9, childs=[16475, 16476, -1]]. +Object config [object id=16532, config id=820, shift=28, childs=[16503, 16507, 16511, 16515, -1]]. +Object config [object id=16533, config id=821, shift=2, childs=[16473, 16474, -1]]. +Object config [object id=16534, config id=821, shift=0, childs=[16495, 16496, 16497, -1]]. +Object config [object id=16528, config id=820, shift=20, childs=[16503, 16507, 16511, 16515, -1]]. +Object config [object id=16529, config id=820, shift=22, childs=[16503, 16507, 16511, 16515, -1]]. +Object config [object id=16530, config id=820, shift=24, childs=[16503, 16507, 16511, 16515, -1]]. +Object config [object id=16531, config id=820, shift=26, childs=[16503, 16507, 16511, 16515, -1]]. +Object config [object id=16552, config id=704, shift=2, childs=[16504, 16508, 16512, 16516, -1]]. +Object config [object id=16551, config id=704, shift=2, childs=[16503, 16507, 16511, 16515, -1]]. +Object config [object id=16550, config id=704, shift=2, childs=[16502, 16506, 16510, 16514, -1]]. +Object config [object id=16549, config id=820, shift=0, childs=[16501, 16505, 16509, 16513, -1]]. +Object config [object id=16548, config id=704, shift=2, childs=[16498, 16499, 16500, -1]]. +Object config [object id=16547, config id=821, shift=0, childs=[16495, 16496, 16497, -1]]. +Object config [object id=16546, config id=821, shift=20, childs=[16493, 16492, 16494, -1]]. +Object config [object id=16545, config id=821, shift=18, childs=[16490, 16489, 16491, -1]]. +Object config [object id=16544, config id=821, shift=16, childs=[16487, 16486, 16488, -1]]. +Object config [object id=17025, config id=828, shift=21, childs=[16810, 16811, -1]]. +Object config [object id=17024, config id=825, shift=0, childs=[16848, 16843, 16844, 16845, 16846, 16847, 16855, -1]]. +Object config [object id=17015, config id=824, shift=10, childs=[16938, 16953, 16938, -1]]. +Object config [object id=17023, config id=824, shift=26, childs=[16847, 16848, 16843, 16844, 16845, 16846, 16855, -1]]. +Object config [object id=17022, config id=824, shift=22, childs=[16846, 16847, 16848, 16843, 16844, 16845, 16855, -1]]. +Object config [object id=17021, config id=824, shift=18, childs=[16845, 16846, 16847, 16848, 16843, 16844, 16855, -1]]. +Object config [object id=17020, config id=824, shift=14, childs=[16844, 16845, 16846, 16847, 16848, 16843, 16855, -1]]. +Object config [object id=17019, config id=824, shift=10, childs=[16843, 16844, 16845, 16846, 16847, 16848, 16855, -1]]. +Object config [object id=17018, config id=824, shift=16, childs=[16891, 16956, 16891, -1]]. +Object config [object id=17017, config id=824, shift=14, childs=[16975, 16955, 16975, -1]]. +Object config [object id=17016, config id=824, shift=12, childs=[16862, 16954, 16862, -1]]. +Object config [object id=17283, config id=844, shift=10, childs=[17248, 17249, 17248, -1]]. +Object config [object id=17282, config id=844, shift=10, childs=[17247, 17246, 17245, -1]]. +Object config [object id=17281, config id=844, shift=10, childs=[17243, 17242, 17243, -1]]. +Object config [object id=17280, config id=844, shift=10, childs=[17241, 17240, 17241, -1]]. +Object config [object id=17369, config id=135, shift=5, childs=[17367, 17368, -1]]. +Object config [object id=17163, config id=842, shift=0, childs=[17161, 17162, -1]]. +Object config [object id=17269, config id=844, shift=12, childs=[17268, 17267, -1]]. +Object config [object id=17270, config id=844, shift=12, childs=[17268, 17267, -1]]. +Object config [object id=19545, config id=922, shift=18, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19544, config id=922, shift=18, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19547, config id=922, shift=26, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19546, config id=922, shift=26, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19549, config id=922, shift=29, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19548, config id=922, shift=26, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19551, config id=922, shift=26, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19550, config id=922, shift=26, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19537, config id=922, shift=12, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19536, config id=922, shift=9, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19539, config id=922, shift=12, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19538, config id=922, shift=12, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19541, config id=922, shift=15, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19540, config id=922, shift=15, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19543, config id=922, shift=18, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19542, config id=922, shift=15, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19528, config id=922, shift=3, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19529, config id=922, shift=3, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19530, config id=922, shift=3, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19531, config id=922, shift=6, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19532, config id=922, shift=6, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19533, config id=922, shift=6, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19534, config id=922, shift=9, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19535, config id=922, shift=9, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19520, config id=921, shift=24, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19521, config id=921, shift=24, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19522, config id=921, shift=27, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19523, config id=921, shift=27, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19524, config id=921, shift=27, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19525, config id=922, shift=0, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19526, config id=922, shift=0, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19527, config id=922, shift=0, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19579, config id=923, shift=24, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19578, config id=923, shift=24, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19577, config id=923, shift=21, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19576, config id=923, shift=21, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19583, config id=923, shift=27, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19582, config id=923, shift=27, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19581, config id=923, shift=27, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19580, config id=923, shift=24, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19571, config id=923, shift=15, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19570, config id=923, shift=15, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19569, config id=923, shift=15, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19568, config id=923, shift=12, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19575, config id=923, shift=21, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19574, config id=923, shift=18, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19573, config id=923, shift=18, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19572, config id=923, shift=18, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19562, config id=923, shift=6, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19563, config id=923, shift=9, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19560, config id=923, shift=6, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19561, config id=923, shift=6, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19566, config id=923, shift=12, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19567, config id=923, shift=12, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19564, config id=923, shift=9, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19565, config id=923, shift=9, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19554, config id=923, shift=0, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19555, config id=923, shift=0, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19558, config id=923, shift=3, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19559, config id=923, shift=3, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19556, config id=923, shift=0, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19557, config id=923, shift=3, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19481, config id=920, shift=24, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19480, config id=920, shift=24, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19483, config id=920, shift=27, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19482, config id=920, shift=27, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19477, config id=920, shift=18, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19476, config id=920, shift=18, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19479, config id=920, shift=21, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19478, config id=920, shift=21, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19473, config id=920, shift=12, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19472, config id=920, shift=12, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19475, config id=920, shift=15, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19474, config id=920, shift=15, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19468, config id=920, shift=6, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19469, config id=920, shift=6, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19470, config id=920, shift=9, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19471, config id=920, shift=9, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19464, config id=920, shift=0, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19465, config id=920, shift=0, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19466, config id=920, shift=3, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19467, config id=920, shift=3, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19460, config id=919, shift=24, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19461, config id=919, shift=24, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19462, config id=919, shift=27, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19463, config id=919, shift=27, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19456, config id=919, shift=18, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19457, config id=919, shift=18, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19458, config id=919, shift=21, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19459, config id=919, shift=21, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19519, config id=921, shift=24, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19518, config id=921, shift=21, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19517, config id=921, shift=21, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19516, config id=921, shift=21, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19515, config id=921, shift=18, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19514, config id=921, shift=18, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19513, config id=921, shift=18, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19512, config id=921, shift=15, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19511, config id=921, shift=15, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19510, config id=921, shift=15, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19509, config id=921, shift=12, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19508, config id=921, shift=12, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19507, config id=921, shift=12, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19506, config id=921, shift=9, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19505, config id=921, shift=9, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19504, config id=921, shift=9, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19502, config id=921, shift=6, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19503, config id=921, shift=6, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19500, config id=921, shift=3, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19501, config id=921, shift=6, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19498, config id=921, shift=3, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19499, config id=921, shift=3, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19496, config id=921, shift=0, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19497, config id=921, shift=0, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19495, config id=921, shift=0, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19706, config id=919, shift=9, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19707, config id=919, shift=12, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19710, config id=919, shift=21, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19711, config id=919, shift=24, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19708, config id=919, shift=15, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19709, config id=919, shift=18, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19604, config id=924, shift=23, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19605, config id=924, shift=23, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19606, config id=924, shift=23, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19607, config id=924, shift=26, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19600, config id=924, shift=17, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19601, config id=924, shift=20, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19602, config id=924, shift=20, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19603, config id=924, shift=20, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19612, config id=924, shift=29, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19613, config id=925, shift=0, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19614, config id=925, shift=0, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19615, config id=925, shift=0, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19608, config id=924, shift=26, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19609, config id=924, shift=26, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19610, config id=924, shift=29, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19611, config id=924, shift=29, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19589, config id=924, shift=3, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19588, config id=924, shift=3, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19591, config id=924, shift=6, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19590, config id=924, shift=6, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19585, config id=924, shift=0, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19584, config id=924, shift=0, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19587, config id=924, shift=3, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19586, config id=924, shift=0, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19597, config id=924, shift=14, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19596, config id=924, shift=14, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19599, config id=924, shift=17, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19598, config id=924, shift=17, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19592, config id=924, shift=6, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19595, config id=924, shift=14, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19638, config id=925, shift=24, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19639, config id=925, shift=24, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19636, config id=925, shift=21, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19637, config id=925, shift=24, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19634, config id=925, shift=21, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19635, config id=925, shift=21, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19632, config id=925, shift=18, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19633, config id=925, shift=18, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19623, config id=925, shift=9, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19622, config id=925, shift=9, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19621, config id=925, shift=6, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19620, config id=925, shift=6, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19619, config id=925, shift=6, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19618, config id=925, shift=3, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19617, config id=925, shift=3, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19616, config id=925, shift=3, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19631, config id=925, shift=18, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19630, config id=925, shift=15, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19629, config id=925, shift=15, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19628, config id=925, shift=15, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19627, config id=925, shift=12, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19626, config id=925, shift=12, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19625, config id=925, shift=12, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19624, config id=925, shift=9, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19786, config id=934, shift=0, childs=[19882, -1, -1, -1, -1, 19883, -1, -1, -1, -1, 19883, -1, -1, -1, -1, 19883, -1, -1, -1, -1, 19883, -1, -1, -1, -1, 19882, -1, -1, -1, -1, 19882, -1, -1, -1, -1, 19882, -1, -1, -1, -1, 19882, -1]]. +Object config [object id=19787, config id=934, shift=0, childs=[19885, -1, -1, -1, -1, 19886, -1, -1, -1, -1, 19886, -1, -1, -1, -1, 19886, -1, -1, -1, -1, 19886, -1, -1, -1, -1, 19885, -1, -1, -1, -1, 19885, -1, -1, -1, -1, 19885, -1, -1, -1, -1, 19885, -1]]. +Object config [object id=19784, config id=934, shift=0, childs=[19879, -1, -1, -1, -1, 19880, -1, -1, -1, -1, 19880, -1, -1, -1, -1, 19880, -1, -1, -1, -1, 19880, -1, -1, -1, -1, 19879, -1, -1, -1, -1, 19879, -1, -1, -1, -1, 19879, -1, -1, -1, -1, 19879, -1]]. +Object config [object id=19785, config id=934, shift=0, childs=[19881, -1, -1, -1, -1, 19884, -1, -1, -1, -1, 19884, -1, -1, -1, -1, 19884, -1, -1, -1, -1, 19884, -1, -1, -1, -1, 19881, -1, -1, -1, -1, 19881, -1, -1, -1, -1, 19881, -1, -1, -1, -1, 19881, -1]]. +Object config [object id=19790, config id=934, shift=0, childs=[19925, -1, -1, -1, -1, 19925, -1, -1, -1, -1, 19925, -1, -1, -1, -1, 19926, -1, -1, -1, -1, 19926, -1, -1, -1, -1, 19926, -1, -1, -1, -1, 19926, -1, -1, -1, -1, 19926, -1, -1, -1, -1, 19926, -1]]. +Object config [object id=19788, config id=934, shift=0, childs=[19887, -1, -1, -1, -1, 19888, -1, -1, -1, -1, 19888, -1, -1, -1, -1, 19888, -1, -1, -1, -1, 19888, -1, -1, -1, -1, 19887, -1, -1, -1, -1, 19887, -1, -1, -1, -1, 19887, -1, -1, -1, -1, 19887, -1]]. +Object config [object id=19789, config id=934, shift=0, childs=[-1, -1, -1, -1, -1, 19889, -1, -1, -1, -1, 19889, -1, -1, -1, -1, 19889, -1, -1, -1, -1, 19889, -1, -1, -1, -1, 19889, -1, -1, -1, -1, 19889, -1, -1, -1, -1, 19889, -1, -1, -1, -1, 19889, -1]]. +Object config [object id=19726, config id=926, shift=3, childs=[-1, -1, -1, 19642, 19643, 19644, 19645, -1]]. +Object config [object id=19727, config id=926, shift=3, childs=[-1, -1, -1, 19646, 19647, 19648, 19649, -1]]. +Object config [object id=19724, config id=926, shift=0, childs=[-1, -1, -1, 19646, 19647, 19648, 19649, -1]]. +Object config [object id=19725, config id=926, shift=0, childs=[-1, -1, -1, 19647, 19646, 19649, 19648, -1]]. +Object config [object id=19722, config id=920, shift=27, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19723, config id=926, shift=0, childs=[-1, -1, -1, 19642, 19643, 19644, 19645, -1]]. +Object config [object id=19720, config id=920, shift=21, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19721, config id=920, shift=24, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19718, config id=920, shift=15, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19719, config id=920, shift=18, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19716, config id=920, shift=9, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19717, config id=920, shift=12, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19714, config id=920, shift=3, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19715, config id=920, shift=6, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19712, config id=919, shift=27, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19713, config id=920, shift=0, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19743, config id=926, shift=18, childs=[-1, -1, -1, 19647, 19646, 19649, 19648, -1]]. +Object config [object id=19742, config id=926, shift=18, childs=[-1, -1, -1, 19646, 19647, 19648, 19649, -1]]. +Object config [object id=19741, config id=926, shift=18, childs=[-1, -1, -1, 19642, 19643, 19644, 19645, -1]]. +Object config [object id=19740, config id=926, shift=15, childs=[-1, -1, -1, 19647, 19646, 19649, 19648, -1]]. +Object config [object id=19739, config id=926, shift=15, childs=[-1, -1, -1, 19646, 19647, 19648, 19649, -1]]. +Object config [object id=19738, config id=926, shift=15, childs=[-1, -1, -1, 19642, 19643, 19644, 19645, -1]]. +Object config [object id=19737, config id=926, shift=12, childs=[-1, -1, -1, 19647, 19646, 19649, 19648, -1]]. +Object config [object id=19736, config id=926, shift=12, childs=[-1, -1, -1, 19646, 19647, 19648, 19649, -1]]. +Object config [object id=19735, config id=926, shift=12, childs=[-1, -1, -1, 19642, 19643, 19644, 19645, -1]]. +Object config [object id=19734, config id=926, shift=9, childs=[-1, -1, -1, 19647, 19646, 19649, 19648, -1]]. +Object config [object id=19733, config id=926, shift=9, childs=[-1, -1, -1, 19646, 19647, 19648, 19649, -1]]. +Object config [object id=19732, config id=926, shift=9, childs=[-1, -1, -1, 19642, 19643, 19644, 19645, -1]]. +Object config [object id=19731, config id=926, shift=6, childs=[-1, -1, -1, 19647, 19646, 19649, 19648, -1]]. +Object config [object id=19730, config id=926, shift=6, childs=[-1, -1, -1, 19646, 19647, 19648, 19649, -1]]. +Object config [object id=19729, config id=926, shift=6, childs=[-1, -1, -1, 19642, 19643, 19644, 19645, -1]]. +Object config [object id=19728, config id=926, shift=3, childs=[-1, -1, -1, 19647, 19646, 19649, 19648, -1]]. +Object config [object id=19748, config id=926, shift=24, childs=[-1, -1, -1, 19646, 19647, 19648, 19649, -1]]. +Object config [object id=19749, config id=926, shift=24, childs=[-1, -1, -1, 19647, 19646, 19649, 19648, -1]]. +Object config [object id=19744, config id=926, shift=21, childs=[-1, -1, -1, 19642, 19643, 19644, 19645, -1]]. +Object config [object id=19745, config id=926, shift=21, childs=[-1, -1, -1, 19646, 19647, 19648, 19649, -1]]. +Object config [object id=19746, config id=926, shift=21, childs=[-1, -1, -1, 19647, 19646, 19649, 19648, -1]]. +Object config [object id=19747, config id=926, shift=24, childs=[-1, -1, -1, 19642, 19643, 19644, 19645, -1]]. +Object config [object id=19947, config id=934, shift=15, childs=[19877, 19878, -1]]. +Object config [object id=19946, config id=934, shift=14, childs=[19877, 19878, -1]]. +Object config [object id=19949, config id=934, shift=17, childs=[19877, 19878, -1]]. +Object config [object id=19948, config id=934, shift=16, childs=[19877, 19878, -1]]. +Object config [object id=19954, config id=934, shift=23, childs=[-1, 19951, 19951, 19951, 19951, 19951, 19951, -1]]. +Object config [object id=19955, config id=934, shift=23, childs=[-1, 19952, 19952, 19952, 19952, 19952, 19952, -1]]. +Object config [object id=19956, config id=934, shift=23, childs=[-1, 19953, 19953, 19953, 19953, 19953, 19953, -1]]. +Object config [object id=19957, config id=934, shift=23, childs=[-1, -1, 19951, 19951, 19951, 19951, 19951, -1]]. +Object config [object id=19958, config id=934, shift=23, childs=[-1, -1, 19952, 19952, 19952, 19952, 19952, -1]]. +Object config [object id=19959, config id=934, shift=23, childs=[-1, -1, 19953, 19953, 19953, 19953, 19953, -1]]. +Object config [object id=19960, config id=934, shift=23, childs=[-1, -1, -1, 19951, 19951, 19951, 19951, -1]]. +Object config [object id=19961, config id=934, shift=23, childs=[-1, -1, -1, 19952, 19952, 19952, 19952, -1]]. +Object config [object id=19962, config id=934, shift=23, childs=[-1, -1, -1, 19953, 19953, 19953, 19953, -1]]. +Object config [object id=19963, config id=934, shift=23, childs=[-1, -1, -1, -1, 19951, 19951, 19951, -1]]. +Object config [object id=19964, config id=934, shift=23, childs=[-1, -1, -1, -1, 19952, 19952, 19952, -1]]. +Object config [object id=19965, config id=934, shift=23, childs=[-1, -1, -1, -1, 19953, 19953, 19953, -1]]. +Object config [object id=19845, config id=934, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19927, -1, -1, -1, -1, 19927, -1, -1, -1, -1, 19927, -1, -1, -1, -1, 19927, -1, -1, -1, -1, 19927, -1, -1, -1, -1, 19927, -1]]. +Object config [object id=19844, config id=934, shift=0, childs=[19927, -1, -1, -1, -1, 19927, -1, -1, -1, -1, 19927, -1]]. +Object config [object id=19843, config id=934, shift=23, childs=[19914, 19914, 19914, 19914, 19914, 19914, 19915, -1]]. +Object config [object id=20083, config id=135, shift=4, childs=[20081, 20082, -1]]. +Object config [object id=20080, config id=135, shift=4, childs=[20078, 20079, -1]]. +Object config [object id=20077, config id=135, shift=4, childs=[20075, 20076, -1]]. +Object config [object id=20074, config id=135, shift=4, childs=[20072, 20073, -1]]. +Object config [object id=20071, config id=135, shift=4, childs=[20069, 20070, -1]]. +Object config [object id=20068, config id=936, shift=22, childs=[-1, 20066, 20067, -1]]. +Object config [object id=20033, config id=936, shift=18, childs=[20030, 20031, 20032, -1]]. +Object config [object id=20025, config id=936, shift=14, childs=[20022, 20023, 20024, -1]]. +Object config [object id=20029, config id=936, shift=16, childs=[20026, 20027, 20028, -1]]. +Object config [object id=19993, config id=935, shift=0, childs=[19985, 19986, 19987, 19988, -1]]. +Object config [object id=19992, config id=934, shift=30, childs=[19916, 19917, 19917, 19918, -1]]. +Object config [object id=19994, config id=934, shift=0, childs=[19923, -1, -1, -1, -1, 19923, -1, -1, -1, -1, 19923, -1, -1, -1, -1, 19924, -1, -1, -1, -1, 19924, -1, -1, -1, -1, 19924, -1, -1, -1, -1, 19924, -1, -1, -1, -1, 19924, -1, -1, -1, -1, 19924, -1]]. +Object config [object id=19991, config id=934, shift=30, childs=[19916, 19917, 19917, 19918, -1]]. +Object config [object id=19990, config id=934, shift=23, childs=[19914, 19914, 19914, 19914, 19914, 19914, 19915, -1]]. +Object config [object id=20128, config id=942, shift=31, childs=[19036, 19037, -1]]. +Object config [object id=20118, config id=942, shift=6, childs=[19030, 19031, 19033, 19034, 19035, -1]]. +Object config [object id=20119, config id=942, shift=22, childs=[19036, 19037, -1]]. +Object config [object id=20120, config id=942, shift=23, childs=[19036, 19037, -1]]. +Object config [object id=20121, config id=942, shift=24, childs=[19036, 19037, -1]]. +Object config [object id=20122, config id=942, shift=25, childs=[19036, 19037, -1]]. +Object config [object id=20123, config id=942, shift=26, childs=[19036, 19037, -1]]. +Object config [object id=20124, config id=942, shift=27, childs=[19036, 19037, -1]]. +Object config [object id=20125, config id=942, shift=28, childs=[19036, 19037, -1]]. +Object config [object id=20126, config id=942, shift=29, childs=[19036, 19037, -1]]. +Object config [object id=20127, config id=942, shift=30, childs=[19036, 19037, -1]]. +Object config [object id=20098, config id=939, shift=0, childs=[20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, 20096, -1, -1, 20096, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20096, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20097, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20097, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20097, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20097, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20097, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20097, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20097, -1]]. +Object config [object id=20333, config id=964, shift=8, childs=[20349, 20331, -1]]. +Object config [object id=20334, config id=964, shift=8, childs=[20349, 20332, -1]]. +Object config [object id=20267, config id=949, shift=15, childs=[20264, 20265, 20266, -1]]. +Object config [object id=20276, config id=964, shift=8, childs=[20274, 20275, -1]]. +Object config [object id=20249, config id=949, shift=22, childs=[20247, 20248, -1]]. +Object config [object id=18463, config id=874, shift=14, childs=[18430, 18431, -1]]. +Object config [object id=18513, config id=299, shift=5, childs=[-1, 2016, -1]]. +Object config [object id=18514, config id=299, shift=5, childs=[-1, 2018, -1]]. +Object config [object id=18524, config id=299, shift=7, childs=[-1, 11669, -1]]. +Object config [object id=18593, config id=896, shift=5, childs=[3422, 18594, -1]]. +Object config [object id=18724, config id=897, shift=13, childs=[-1, 18688, 18688, -1]]. +Object config [object id=18725, config id=897, shift=15, childs=[18693, 18694, 18695, -1]]. +Object config [object id=18721, config id=897, shift=10, childs=[18666, 18670, 18671, 18672, -1]]. +Object config [object id=18722, config id=897, shift=6, childs=[18665, 18673, 18674, 18675, -1]]. +Object config [object id=18723, config id=897, shift=13, childs=[18686, 18685, 18687, -1]]. +Object config [object id=18816, config id=830, shift=0, childs=[18819, 18820, 18821, 18818, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18822, 18823, 18824, 18825, 18826, 18826, 18826, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18827, 18828, 18829, 18830, 18831, 18832, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 9044, 9045, 9046, 9047, 9048, 9048, 9049, 9050, 9051, 9052, 9053, 9054, 18822, 18823, 18824, 18825, 18826, 18826, 18826, 18827, 18828, 18829, 18819, 18819, 18819, 18819, 18819, 18819, -1, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18819, 18817, -1]]. +Object config [object id=18844, config id=435, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6257, -1]]. +Object config [object id=18868, config id=905, shift=20, childs=[-1, 18865, -1]]. +Object config [object id=18867, config id=905, shift=28, childs=[18845, 18846, 18847, 18848, 18849, 18849, 18850, 18850, 18851, 18851, 18852, 18853, 18854, 18854, 18855, 18855, -1]]. +Object config [object id=18963, config id=907, shift=11, childs=[-1, 18962, -1]]. +Object config [object id=19134, config id=912, shift=8, childs=[-1, -1, 19130, -1]]. +Object config [object id=19135, config id=912, shift=10, childs=[19131, 19129, 19129, -1]]. +Object config [object id=19133, config id=912, shift=8, childs=[19132, 19128, 19128, -1]]. +Object config [object id=19144, config id=912, shift=15, childs=[-1, 19130, -1]]. +Object config [object id=19147, config id=830, shift=11, childs=[8395, 8394, 8393, 8392, 8395, 8395, 8395, 8395, 8462, 8463, 8464, 8465, 8466, 8467, 8468, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, 8489, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 8442, 8443, 8444, 8445, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, 8513, 8514, 8396, 8397, 8398, 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 8410, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8473, 8474, 8475, -1, 8476, 8395, 8395, 8490, 8491, 8492, 8493, 8494, -1, 8495, 8395, 8395, 8446, 8447, 8448, 8449, 8450, 8451, 8452, -1, 8453, 8395, 8395, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, -1, 8524, 8395, 8395, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, -1, 8422, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8477, 8478, 8479, -1, 8480, 8395, 8395, 8496, 8497, 8498, 8499, 8500, -1, 8501, 8395, 8395, 8454, 8455, 8456, 8457, 8458, 8459, 8460, -1, 8461, 8395, 8395, 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, -1, 8534, 8395, 8395, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 8433, -1, 8434, 8395, 8395, 8488, 8488, 8488, 8488, 8488, 8488, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, 8395, -1]]. +Object config [object id=19146, config id=830, shift=11, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8469, 8470, 8470, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8471, -1, 8472, -1]]. +Object config [object id=19141, config id=912, shift=14, childs=[19131, 19129, -1]]. +Object config [object id=19140, config id=912, shift=13, childs=[-1, 19130, -1]]. +Object config [object id=19143, config id=912, shift=15, childs=[19131, 19129, -1]]. +Object config [object id=19142, config id=912, shift=14, childs=[-1, 19130, -1]]. +Object config [object id=19137, config id=912, shift=12, childs=[19131, 19129, -1]]. +Object config [object id=19136, config id=912, shift=10, childs=[-1, 19130, 19130, -1]]. +Object config [object id=19139, config id=912, shift=13, childs=[19131, 19129, -1]]. +Object config [object id=19138, config id=912, shift=12, childs=[-1, 19130, -1]]. +Object config [object id=19253, config id=917, shift=0, childs=[19227, 19228, 19229, 19233, 19236, -1]]. +Object config [object id=19255, config id=917, shift=6, childs=[19227, 19228, 19229, 19233, 19236, -1]]. +Object config [object id=19254, config id=917, shift=3, childs=[19227, 19228, 19229, 19233, 19236, -1]]. +Object config [object id=19257, config id=917, shift=12, childs=[19227, 19228, 19229, 19233, 19236, -1]]. +Object config [object id=19256, config id=917, shift=9, childs=[19227, 19228, 19229, 19233, 19236, -1]]. +Object config [object id=19259, config id=917, shift=18, childs=[19227, 19228, 19229, 19232, 19235, -1]]. +Object config [object id=19258, config id=917, shift=15, childs=[19227, 19228, 19229, 19233, 19236, -1]]. +Object config [object id=19261, config id=917, shift=24, childs=[19227, 19228, 19229, 19232, 19235, -1]]. +Object config [object id=19260, config id=917, shift=21, childs=[19227, 19228, 19229, 19232, 19235, -1]]. +Object config [object id=19263, config id=918, shift=0, childs=[19227, 19228, 19229, 19232, 19235, -1]]. +Object config [object id=19262, config id=917, shift=27, childs=[19227, 19228, 19229, 19232, 19235, -1]]. +Object config [object id=19300, config id=918, shift=15, childs=[-1, 19248, 19240, 19240, 19240, -1]]. +Object config [object id=19301, config id=917, shift=0, childs=[-1, 19250, 19238, 19238, 19238, -1]]. +Object config [object id=19302, config id=917, shift=3, childs=[-1, 19250, 19238, 19238, 19238, -1]]. +Object config [object id=19303, config id=917, shift=6, childs=[-1, 19250, 19238, 19238, 19238, -1]]. +Object config [object id=19296, config id=918, shift=3, childs=[-1, 19248, 19240, 19240, 19240, -1]]. +Object config [object id=19297, config id=918, shift=6, childs=[-1, 19248, 19240, 19240, 19240, -1]]. +Object config [object id=19298, config id=918, shift=9, childs=[-1, 19248, 19240, 19240, 19240, -1]]. +Object config [object id=19299, config id=918, shift=12, childs=[-1, 19248, 19240, 19240, 19240, -1]]. +Object config [object id=19308, config id=917, shift=21, childs=[-1, 19242, 19238, 19238, 19238, -1]]. +Object config [object id=19309, config id=917, shift=24, childs=[-1, 19242, 19238, 19238, 19238, -1]]. +Object config [object id=19310, config id=917, shift=27, childs=[-1, 19242, 19238, 19238, 19238, -1]]. +Object config [object id=19311, config id=918, shift=0, childs=[-1, 19242, 19238, 19238, 19238, -1]]. +Object config [object id=19304, config id=917, shift=9, childs=[-1, 19250, 19238, 19238, 19238, -1]]. +Object config [object id=19305, config id=917, shift=12, childs=[-1, 19250, 19238, 19238, 19238, -1]]. +Object config [object id=19306, config id=917, shift=15, childs=[-1, 19250, 19238, 19238, 19238, -1]]. +Object config [object id=19307, config id=917, shift=18, childs=[-1, 19242, 19238, 19238, 19238, -1]]. +Object config [object id=19317, config id=917, shift=0, childs=[-1, 19249, 19237, 19237, 19237, -1]]. +Object config [object id=19316, config id=918, shift=15, childs=[-1, 19246, 19238, 19238, 19238, -1]]. +Object config [object id=19319, config id=917, shift=6, childs=[-1, 19249, 19237, 19237, 19237, -1]]. +Object config [object id=19318, config id=917, shift=3, childs=[-1, 19249, 19237, 19237, 19237, -1]]. +Object config [object id=19313, config id=918, shift=6, childs=[-1, 19246, 19238, 19238, 19238, -1]]. +Object config [object id=19312, config id=918, shift=3, childs=[-1, 19246, 19238, 19238, 19238, -1]]. +Object config [object id=19315, config id=918, shift=12, childs=[-1, 19246, 19238, 19238, 19238, -1]]. +Object config [object id=19314, config id=918, shift=9, childs=[-1, 19246, 19238, 19238, 19238, -1]]. +Object config [object id=19325, config id=917, shift=24, childs=[-1, 19241, 19237, 19237, 19237, -1]]. +Object config [object id=19324, config id=917, shift=21, childs=[-1, 19241, 19237, 19237, 19237, -1]]. +Object config [object id=19327, config id=918, shift=0, childs=[-1, 19241, 19237, 19237, 19237, -1]]. +Object config [object id=19326, config id=917, shift=27, childs=[-1, 19241, 19237, 19237, 19237, -1]]. +Object config [object id=19321, config id=917, shift=12, childs=[-1, 19249, 19237, 19237, 19237, -1]]. +Object config [object id=19320, config id=917, shift=9, childs=[-1, 19249, 19237, 19237, 19237, -1]]. +Object config [object id=19323, config id=917, shift=18, childs=[-1, 19241, 19237, 19237, 19237, -1]]. +Object config [object id=19322, config id=917, shift=15, childs=[-1, 19249, 19237, 19237, 19237, -1]]. +Object config [object id=19270, config id=917, shift=3, childs=[-1, 19251, 19239, 19239, 19239, -1]]. +Object config [object id=19271, config id=917, shift=6, childs=[-1, 19251, 19239, 19239, 19239, -1]]. +Object config [object id=19268, config id=918, shift=15, childs=[19227, 19228, 19229, 19231, 19234, -1]]. +Object config [object id=19269, config id=917, shift=0, childs=[-1, 19251, 19239, 19239, 19239, -1]]. +Object config [object id=19266, config id=918, shift=9, childs=[19227, 19228, 19229, 19231, 19234, -1]]. +Object config [object id=19267, config id=918, shift=12, childs=[19227, 19228, 19229, 19231, 19234, -1]]. +Object config [object id=19264, config id=918, shift=3, childs=[19227, 19228, 19229, 19231, 19234, -1]]. +Object config [object id=19265, config id=918, shift=6, childs=[19227, 19228, 19229, 19231, 19234, -1]]. +Object config [object id=19278, config id=917, shift=27, childs=[-1, 19243, 19239, 19239, 19239, -1]]. +Object config [object id=19279, config id=918, shift=0, childs=[-1, 19243, 19239, 19239, 19239, -1]]. +Object config [object id=19276, config id=917, shift=21, childs=[-1, 19243, 19239, 19239, 19239, -1]]. +Object config [object id=19277, config id=917, shift=24, childs=[-1, 19243, 19239, 19239, 19239, -1]]. +Object config [object id=19274, config id=917, shift=15, childs=[-1, 19251, 19239, 19239, 19239, -1]]. +Object config [object id=19275, config id=917, shift=18, childs=[-1, 19243, 19239, 19239, 19239, -1]]. +Object config [object id=19272, config id=917, shift=9, childs=[-1, 19251, 19239, 19239, 19239, -1]]. +Object config [object id=19273, config id=917, shift=12, childs=[-1, 19251, 19239, 19239, 19239, -1]]. +Object config [object id=19287, config id=917, shift=6, childs=[-1, 19252, 19240, 19240, 19240, -1]]. +Object config [object id=19286, config id=917, shift=3, childs=[-1, 19252, 19240, 19240, 19240, -1]]. +Object config [object id=19285, config id=917, shift=0, childs=[-1, 19252, 19240, 19240, 19240, -1]]. +Object config [object id=19284, config id=918, shift=15, childs=[-1, 19247, 19239, 19239, 19239, -1]]. +Object config [object id=19283, config id=918, shift=12, childs=[-1, 19247, 19239, 19239, 19239, -1]]. +Object config [object id=19282, config id=918, shift=9, childs=[-1, 19247, 19239, 19239, 19239, -1]]. +Object config [object id=19281, config id=918, shift=6, childs=[-1, 19247, 19239, 19239, 19239, -1]]. +Object config [object id=19280, config id=918, shift=3, childs=[-1, 19247, 19239, 19239, 19239, -1]]. +Object config [object id=19295, config id=918, shift=0, childs=[-1, 19244, 19240, 19240, 19240, -1]]. +Object config [object id=19294, config id=917, shift=27, childs=[-1, 19244, 19240, 19240, 19240, -1]]. +Object config [object id=19293, config id=917, shift=24, childs=[-1, 19244, 19240, 19240, 19240, -1]]. +Object config [object id=19292, config id=917, shift=21, childs=[-1, 19244, 19240, 19240, 19240, -1]]. +Object config [object id=19291, config id=917, shift=18, childs=[-1, 19244, 19240, 19240, 19240, -1]]. +Object config [object id=19290, config id=917, shift=15, childs=[-1, 19252, 19240, 19240, 19240, -1]]. +Object config [object id=19289, config id=917, shift=12, childs=[-1, 19252, 19240, 19240, 19240, -1]]. +Object config [object id=19288, config id=917, shift=9, childs=[-1, 19252, 19240, 19240, 19240, -1]]. +Object config [object id=19331, config id=918, shift=12, childs=[-1, 19245, 19237, 19237, 19237, -1]]. +Object config [object id=19330, config id=918, shift=9, childs=[-1, 19245, 19237, 19237, 19237, -1]]. +Object config [object id=19329, config id=918, shift=6, childs=[-1, 19245, 19237, 19237, 19237, -1]]. +Object config [object id=19328, config id=918, shift=3, childs=[-1, 19245, 19237, 19237, 19237, -1]]. +Object config [object id=19332, config id=918, shift=15, childs=[-1, 19245, 19237, 19237, 19237, -1]]. +Object config [object id=19452, config id=919, shift=12, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19453, config id=919, shift=12, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19454, config id=919, shift=15, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19455, config id=919, shift=15, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19448, config id=919, shift=6, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19449, config id=919, shift=6, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19450, config id=919, shift=9, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19451, config id=919, shift=9, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19444, config id=919, shift=3, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19445, config id=919, shift=3, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19446, config id=919, shift=3, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=19447, config id=919, shift=6, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19441, config id=919, shift=0, childs=[-1, -1, -1, 19484, 19485, 19486, 19487, -1]]. +Object config [object id=19442, config id=919, shift=0, childs=[-1, -1, -1, 19488, 19489, 19490, 19491, -1]]. +Object config [object id=19443, config id=919, shift=0, childs=[-1, -1, -1, 19489, 19488, 19491, 19490, -1]]. +Object config [object id=21941, config id=977, shift=31, childs=[21870, 21869, -1]]. +Object config [object id=21943, config id=977, shift=7, childs=[21880, 21880, 21881, -1]]. +Object config [object id=21950, config id=982, shift=8, childs=[8576, 8575, 8574, 8573, 8576, 8576, 8558, 8559, 8560, 8561, 8562, 8562, 8562, 8580, 8581, 8582, 8583, 8584, 8584, 8584, 8535, 8536, 8537, 8538, 8539, 8539, 8539, 8641, 8642, 8643, 8644, 8645, 8645, 8645, 8618, 8619, 8620, 8621, 8622, 8623, 8624, 8624, 8624, 8595, 8596, 8597, 8598, 8599, 8600, 8601, 8601, 8601, 8656, 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8664, 8664, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8563, 8564, 8565, 8566, 8576, 8576, 8576, 8585, 8586, 8587, 8588, 8576, 8576, 8576, 8540, 8541, 8542, 8543, 8576, 8576, 8576, 8646, 8647, 8648, 8649, 8576, 8576, 8576, 8625, 8626, 8627, 8628, 8629, 8630, 8576, 8576, 8576, 8602, 8603, 8604, 8605, 8606, 8607, 8576, 8576, 8576, 8665, 8666, 8667, 8668, 8669, 8670, 8671, 8672, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8567, 8568, 8569, 8576, 8576, 8576, 8576, 8589, 8590, 8591, 8576, 8576, 8576, 8576, 8544, 8545, 8546, 8576, 8576, 8576, 8576, 8650, 8651, 8652, 8576, 8576, 8576, 8576, 8631, 8632, 8633, 8634, 8635, 8576, 8576, 8576, 8576, 8608, 8609, 8610, 8611, 8612, 8576, 8576, 8576, 8576, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8576, 8570, 8571, 8572, 8576, 8576, 8576, 8576, 8592, 8593, 8594, 8576, 8576, 8576, 8576, 8547, 8548, 8549, 8576, 8576, 8576, 8576, 8653, 8654, 8655, 8576, 8576, 8576, 8576, 8636, 8637, 8638, 8639, 8640, 8576, 8576, 8576, 8576, 8613, 8614, 8615, 8616, 8617, 8576, 8576, 8576, 8576, 8680, 8681, 8682, 8683, 8684, 8685, 8686, 8576, 8576, 8576, 8576, -1]]. +Object config [object id=21944, config id=978, shift=22, childs=[21921, 21922, -1]]. +Object config [object id=21632, config id=970, shift=20, childs=[21510, 21509, -1]]. +Object config [object id=21633, config id=970, shift=20, childs=[21510, 21509, -1]]. +Object config [object id=21630, config id=970, shift=19, childs=[21510, 21509, -1]]. +Object config [object id=21631, config id=970, shift=19, childs=[21510, 21509, -1]]. +Object config [object id=21628, config id=970, shift=18, childs=[21510, 21509, -1]]. +Object config [object id=21629, config id=970, shift=18, childs=[21510, 21509, -1]]. +Object config [object id=21549, config id=936, shift=20, childs=[21546, 21547, 21548, -1]]. +Object config [object id=22493, config id=982, shift=21, childs=[22420, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, 22421, -1]]. +Object config [object id=22492, config id=981, shift=25, childs=[-1, 22483, 22484, -1]]. +Object config [object id=22491, config id=981, shift=23, childs=[-1, 22483, 22484, -1]]. +Object config [object id=22490, config id=981, shift=15, childs=[-1, 22453, -1]]. +Object config [object id=22489, config id=981, shift=12, childs=[-1, 22457, 22453, 22454, 22455, 22456, -1]]. +Object config [object id=22355, config id=982, shift=6, childs=[22353, 22352, 22354, -1]]. +Object config [object id=22370, config id=981, shift=4, childs=[22368, 22369, -1]]. +Object config [object id=22111, config id=981, shift=20, childs=[22105, 22105, 22105, 22105, 22106, 22109, -1]]. +Object config [object id=22100, config id=982, shift=18, childs=[22091, 22092, 22093, -1]]. +Object config [object id=22101, config id=982, shift=18, childs=[22094, 22095, 22096, -1]]. +Object config [object id=22102, config id=982, shift=18, childs=[22097, 22098, 22099, -1]]. +Object config [object id=22119, config id=981, shift=20, childs=[22114, 22113, 22115, 22116, 22117, 22118, -1]]. +Object config [object id=22112, config id=981, shift=20, childs=[22107, 22107, 22107, 22107, 22108, 22110, -1]]. +Object config [object id=20979, config id=382, shift=-1, childs=[20528, 20528, 20528, 20528, 20528, 20528, 20528, 20528, 20528, 20528, 20528, 20527, -1]]. +Object config [object id=21249, config id=968, shift=8, childs=[-1, -1, -1, 21184, -1]]. +Object config [object id=21248, config id=968, shift=8, childs=[-1, -1, -1, 21184, -1]]. +Object config [object id=21247, config id=968, shift=8, childs=[-1, -1, -1, 21183, -1]]. +Object config [object id=21246, config id=968, shift=8, childs=[21179, 21180, 21181, 21182, -1]]. +Object config [object id=21245, config id=968, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21157, -1, -1, -1, -1, 21157, -1]]. +Object config [object id=21091, config id=968, shift=12, childs=[21147, 21094, -1]]. +Object config [object id=21090, config id=968, shift=12, childs=[21093, 21093, -1]]. +Object config [object id=21089, config id=968, shift=11, childs=[21147, 21092, -1]]. +Object config [object id=23586, config id=1002, shift=28, childs=[-1, 23585, -1]]. +Object config [object id=23760, config id=1171, shift=7, childs=[28551, 28552, 28553, 28554, 28555, 28556, -1]]. +Object config [object id=23016, config id=991, shift=6, childs=[22976, 22977, -1]]. +Object config [object id=23017, config id=991, shift=7, childs=[22976, 22977, -1]]. +Object config [object id=23018, config id=991, shift=8, childs=[22976, 22977, -1]]. +Object config [object id=23019, config id=991, shift=9, childs=[22976, 22977, -1]]. +Object config [object id=23020, config id=991, shift=10, childs=[22976, 22977, -1]]. +Object config [object id=23021, config id=991, shift=11, childs=[22976, 22977, -1]]. +Object config [object id=23022, config id=991, shift=12, childs=[22976, 22977, -1]]. +Object config [object id=23023, config id=991, shift=13, childs=[22976, 22977, -1]]. +Object config [object id=23008, config id=990, shift=30, childs=[22976, 22977, -1]]. +Object config [object id=23009, config id=990, shift=31, childs=[22976, 22977, -1]]. +Object config [object id=23010, config id=991, shift=0, childs=[22976, 22977, -1]]. +Object config [object id=23011, config id=991, shift=1, childs=[22976, 22977, -1]]. +Object config [object id=23012, config id=991, shift=2, childs=[22976, 22977, -1]]. +Object config [object id=23013, config id=991, shift=3, childs=[22976, 22977, -1]]. +Object config [object id=23014, config id=991, shift=4, childs=[22976, 22977, -1]]. +Object config [object id=23015, config id=991, shift=5, childs=[22976, 22977, -1]]. +Object config [object id=23033, config id=991, shift=23, childs=[22976, 22977, -1]]. +Object config [object id=23032, config id=991, shift=22, childs=[22976, 22977, -1]]. +Object config [object id=23035, config id=991, shift=25, childs=[22976, 22977, -1]]. +Object config [object id=23034, config id=991, shift=24, childs=[22976, 22977, -1]]. +Object config [object id=23037, config id=991, shift=27, childs=[22976, 22977, -1]]. +Object config [object id=23036, config id=991, shift=26, childs=[22976, 22977, -1]]. +Object config [object id=23039, config id=991, shift=29, childs=[22976, 22977, -1]]. +Object config [object id=23038, config id=991, shift=28, childs=[22976, 22977, -1]]. +Object config [object id=23025, config id=991, shift=15, childs=[22976, 22977, -1]]. +Object config [object id=23024, config id=991, shift=14, childs=[22976, 22977, -1]]. +Object config [object id=23027, config id=991, shift=17, childs=[22976, 22977, -1]]. +Object config [object id=23026, config id=991, shift=16, childs=[22976, 22977, -1]]. +Object config [object id=23029, config id=991, shift=19, childs=[22976, 22977, -1]]. +Object config [object id=23028, config id=991, shift=18, childs=[22976, 22977, -1]]. +Object config [object id=23031, config id=991, shift=21, childs=[22976, 22977, -1]]. +Object config [object id=23030, config id=991, shift=20, childs=[22976, 22977, -1]]. +Object config [object id=22986, config id=990, shift=8, childs=[22976, 22977, -1]]. +Object config [object id=22987, config id=990, shift=9, childs=[22976, 22977, -1]]. +Object config [object id=22984, config id=990, shift=6, childs=[22976, 22977, -1]]. +Object config [object id=22985, config id=990, shift=7, childs=[22976, 22977, -1]]. +Object config [object id=22990, config id=990, shift=12, childs=[22976, 22977, -1]]. +Object config [object id=22991, config id=990, shift=13, childs=[22976, 22977, -1]]. +Object config [object id=22988, config id=990, shift=10, childs=[22976, 22977, -1]]. +Object config [object id=22989, config id=990, shift=11, childs=[22976, 22977, -1]]. +Object config [object id=22978, config id=990, shift=0, childs=[22976, 22977, -1]]. +Object config [object id=22979, config id=990, shift=1, childs=[22976, 22977, -1]]. +Object config [object id=22982, config id=990, shift=4, childs=[22976, 22977, -1]]. +Object config [object id=22983, config id=990, shift=5, childs=[22976, 22977, -1]]. +Object config [object id=22980, config id=990, shift=2, childs=[22976, 22977, -1]]. +Object config [object id=22981, config id=990, shift=3, childs=[22976, 22977, -1]]. +Object config [object id=23003, config id=990, shift=25, childs=[22976, 22977, -1]]. +Object config [object id=23002, config id=990, shift=24, childs=[22976, 22977, -1]]. +Object config [object id=23001, config id=990, shift=23, childs=[22976, 22977, -1]]. +Object config [object id=23000, config id=990, shift=22, childs=[22976, 22977, -1]]. +Object config [object id=23007, config id=990, shift=29, childs=[22976, 22977, -1]]. +Object config [object id=23006, config id=990, shift=28, childs=[22976, 22977, -1]]. +Object config [object id=23005, config id=990, shift=27, childs=[22976, 22977, -1]]. +Object config [object id=23004, config id=990, shift=26, childs=[22976, 22977, -1]]. +Object config [object id=22995, config id=990, shift=17, childs=[22976, 22977, -1]]. +Object config [object id=22994, config id=990, shift=16, childs=[22976, 22977, -1]]. +Object config [object id=22993, config id=990, shift=15, childs=[22976, 22977, -1]]. +Object config [object id=22992, config id=990, shift=14, childs=[22976, 22977, -1]]. +Object config [object id=22999, config id=990, shift=21, childs=[22976, 22977, -1]]. +Object config [object id=22998, config id=990, shift=20, childs=[22976, 22977, -1]]. +Object config [object id=22997, config id=990, shift=19, childs=[22976, 22977, -1]]. +Object config [object id=22996, config id=990, shift=18, childs=[22976, 22977, -1]]. +Object config [object id=23296, config id=997, shift=15, childs=[23294, 23295, 23295, -1]]. +Object config [object id=23301, config id=997, shift=19, childs=[23299, 23300, 23300, -1]]. +Object config [object id=23304, config id=997, shift=21, childs=[23297, 23298, 23298, -1]]. +Object config [object id=23534, config id=997, shift=17, childs=[23302, 23303, 23303, -1]]. +Object config [object id=23535, config id=997, shift=11, childs=[23528, 23529, 23529, -1]]. +Object config [object id=23540, config id=997, shift=21, childs=[23528, 23529, 23529, -1]]. +Object config [object id=23537, config id=997, shift=15, childs=[23528, 23529, 23529, -1]]. +Object config [object id=23536, config id=997, shift=13, childs=[23528, 23529, 23529, -1]]. +Object config [object id=23539, config id=997, shift=19, childs=[23528, 23529, 23529, -1]]. +Object config [object id=23538, config id=997, shift=17, childs=[23528, 23529, 23529, -1]]. +Object config [object id=23041, config id=991, shift=31, childs=[22976, 22977, -1]]. +Object config [object id=23040, config id=991, shift=30, childs=[22976, 22977, -1]]. +Object config [object id=23098, config id=992, shift=15, childs=[23094, 23093, -1]]. +Object config [object id=23096, config id=992, shift=8, childs=[23057, 23058, -1]]. +Object config [object id=23097, config id=992, shift=8, childs=[23059, 23060, -1]]. +Object config [object id=23260, config id=996, shift=4, childs=[23213, 23214, -1]]. +Object config [object id=23257, config id=996, shift=3, childs=[23203, 23204, -1]]. +Object config [object id=23259, config id=996, shift=3, childs=[23213, 23214, -1]]. +Object config [object id=23258, config id=996, shift=4, childs=[23203, 23204, -1]]. +Object config [object id=23293, config id=997, shift=13, childs=[23291, 23292, 23292, -1]]. +Object config [object id=23290, config id=997, shift=11, childs=[23288, 23289, 23289, -1]]. +Object config [object id=23282, config id=997, shift=0, childs=[23280, 23280, 23280, 23280, 23280, 23280, 23280, 23280, 23279, 23279, 23279, 23281, -1]]. +Object config [object id=23278, config id=983, shift=0, childs=[-1, 23276, -1]]. +Object config [object id=23277, config id=700, shift=0, childs=[-1, 23275, -1]]. +Object config [object id=26294, config id=1048, shift=1, childs=[26292, 26297, -1]]. +Object config [object id=26298, config id=1048, shift=2, childs=[26292, 26297, -1]]. +Object config [object id=26342, config id=1048, shift=0, childs=[26340, 26341, -1]]. +Object config [object id=26123, config id=1049, shift=9, childs=[26110, 26111, 26112, -1]]. +Object config [object id=26444, config id=1048, shift=1, childs=[26296, 26295, -1]]. +Object config [object id=26445, config id=1048, shift=2, childs=[26300, 26299, -1]]. +Object config [object id=26446, config id=1048, shift=4, childs=[-1, 26306, -1]]. +Object config [object id=25634, config id=1044, shift=7, childs=[-1, 25623, 25624, 25625, -1]]. +Object config [object id=25635, config id=1044, shift=7, childs=[-1, 25626, 25627, 25628, -1]]. +Object config [object id=25943, config id=1049, shift=0, childs=[25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25942, -1, -1, -1, -1, 25942, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1, -1, -1, -1, 25836, -1]]. +Object config [object id=25591, config id=113, shift=16, childs=[25438, 25439, -1]]. +Object config [object id=25442, config id=113, shift=15, childs=[25440, 25441, -1]]. +Object config [object id=24776, config id=1017, shift=8, childs=[-1, -1, 24767, 24767, -1]]. +Object config [object id=24775, config id=1017, shift=8, childs=[24762, 24762, 24763, 24763, 24762, -1]]. +Object config [object id=24774, config id=1017, shift=8, childs=[24768, 24769, 24771, 24772, 24768, -1]]. +Object config [object id=24773, config id=1017, shift=8, childs=[24770, 24766, 24766, 24766, 24766, -1]]. +Object config [object id=24642, config id=1011, shift=11, childs=[24550, 24643, -1]]. +Object config [object id=24653, config id=1011, shift=14, childs=[24550, 24654, -1]]. +Object config [object id=24662, config id=1011, shift=19, childs=[24550, 24663, -1]]. +Object config [object id=24623, config id=1011, shift=7, childs=[24550, 24624, 24624, -1]]. +Object config [object id=24626, config id=437, shift=17, childs=[24627, 24550, -1]]. +Object config [object id=24636, config id=1011, shift=9, childs=[24550, 24637, 24637, -1]]. +Object config [object id=24638, config id=1011, shift=15, childs=[24551, 24639, -1]]. +Object config [object id=24633, config id=1011, shift=16, childs=[24550, 24634, -1]]. +Object config [object id=25036, config id=177, shift=10, childs=[2589, 25037, -1]]. +Object config [object id=24840, config id=1017, shift=20, childs=[-1, 24839, -1]]. +Object config [object id=24886, config id=1017, shift=24, childs=[24780, 24781, -1]]. +Object config [object id=24885, config id=1017, shift=8, childs=[24778, 24778, 24779, 24779, 24778, -1]]. +Object config [object id=24884, config id=1017, shift=14, childs=[24730, 24731, 24733, 24735, 24738, -1]]. +Object config [object id=24883, config id=1017, shift=26, childs=[24728, 24729, -1]]. +Object config [object id=24882, config id=1016, shift=29, childs=[24724, 24726, 24725, 24727, -1]]. +Object config [object id=24881, config id=1016, shift=27, childs=[24721, 24722, -1]]. +Object config [object id=24879, config id=1017, shift=25, childs=[24878, 24877, -1]]. +Object config [object id=28321, config id=396, shift=18, childs=[28322, 5145, -1]]. +Object config [object id=28352, config id=1160, shift=12, childs=[28336, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, -1]]. +Object config [object id=28479, config id=1165, shift=24, childs=[28475, 28476, 28477, 28478, -1]]. +Object config [object id=28534, config id=1165, shift=27, childs=[28434, 28433, -1]]. +Object config [object id=28494, config id=1165, shift=10, childs=[28487, 28488, -1]]. +Object config [object id=28495, config id=1165, shift=10, childs=[28489, 28490, -1]]. +Object config [object id=28550, config id=1160, shift=1, childs=[28336, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, 28359, -1]]. +Object config [object id=27189, config id=1077, shift=0, childs=[27052, 27052, -1, -1, -1, 27052, -1, -1, -1, -1, 27052, -1, -1, -1, -1, 27052, -1, -1, -1, -1, 27053, -1, -1, -1, -1, 27053, -1, -1, -1, -1, 27052, -1, -1, -1, -1, 27052, -1, -1, -1, -1, 27052, -1, -1, -1, -1, 27052, -1, -1, -1, -1, 27052, -1, -1, -1, -1, 27052, -1, -1, -1, -1, 27052, -1, -1, -1, -1, 27052, -1]]. +Object config [object id=27191, config id=1077, shift=10, childs=[27058, 27059, 27060, -1]]. +Object config [object id=27190, config id=1077, shift=0, childs=[27056, 27056, -1, -1, -1, 27056, -1, -1, -1, -1, 27054, -1, -1, -1, -1, 27055, -1, -1, -1, -1, 27057, -1, -1, -1, -1, 27057, -1, -1, -1, -1, 27056, -1, -1, -1, -1, 27056, -1, -1, -1, -1, 27056, -1, -1, -1, -1, 27056, -1, -1, -1, -1, 27056, -1, -1, -1, -1, 27056, -1, -1, -1, -1, 27056, -1, -1, -1, -1, 27056, -1]]. +Object config [object id=27193, config id=1077, shift=14, childs=[27058, 27059, 27060, -1]]. +Object config [object id=27192, config id=1077, shift=12, childs=[27058, 27059, 27060, -1]]. +Object config [object id=27195, config id=1077, shift=18, childs=[27058, 27059, 27060, -1]]. +Object config [object id=27194, config id=1077, shift=16, childs=[27058, 27059, 27060, -1]]. +Object config [object id=27197, config id=1077, shift=23, childs=[27025, 27024, 27023, 27022, 27026, 27027, 27028, 27029, 27030, 27031, 27033, 27032, 27034, 27035, 27036, 27037, 27038, 27039, 27040, 27041, 27042, 27043, 27044, 27045, 27046, 27047, 27048, 27049, -1]]. +Object config [object id=27196, config id=1077, shift=0, childs=[27063, 27063, -1, -1, -1, 27063, -1, -1, -1, -1, 27063, -1, -1, -1, -1, 27063, -1, -1, -1, -1, 27063, -1, -1, -1, -1, 27063, -1, -1, -1, -1, 27063, -1, -1, -1, -1, 27063, -1, -1, -1, -1, 27061, -1, -1, -1, -1, 27061, -1, -1, -1, -1, 27061, -1, -1, -1, -1, 27062, -1, -1, -1, -1, 27061, -1, -1, -1, -1, 27064, -1]]. +Object config [object id=27331, config id=1094, shift=27, childs=[27567, 27329, 27568, -1]]. +Object config [object id=27312, config id=1094, shift=0, childs=[23049, 23049, 23049, 23049, 23049, 23049, 23049, 23049, 23049, 23049, 23049, 23049, 23049, 23049, 23049, 23049, 27327, 27327, 27327, -1]]. +Object config [object id=27313, config id=1094, shift=0, childs=[23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 27328, 27328, 27328, -1]]. +Object config [object id=27311, config id=1094, shift=0, childs=[23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 23048, 27326, 27326, 27326, -1]]. +Object config [object id=27310, config id=1094, shift=0, childs=[23047, 23047, 23047, 23047, 23047, 23047, 23047, 23047, 23047, 23047, 23047, 23047, 23047, 23047, 23047, 23047, 27325, 27325, 27325, -1]]. +Object config [object id=27279, config id=1085, shift=16, childs=[27257, 27280, -1]]. +Object config [object id=27563, config id=1094, shift=0, childs=[27321, 27321, 27321, 27321, 27321, 27321, 27321, 27321, 27321, 27321, 27321, 27321, 27321, 27321, 27321, 27321, 27320, 27320, 27320, -1]]. +Object config [object id=27566, config id=1094, shift=27, childs=[-1, 27329, -1]]. +Object config [object id=27565, config id=1094, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27324, 27324, 27324, -1]]. +Object config [object id=27564, config id=1094, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27323, 27323, 27323, -1]]. +Object config [object id=26723, config id=1063, shift=14, childs=[26720, 26720, 26720, 26721, 26721, -1]]. +Object config [object id=26805, config id=1064, shift=2, childs=[26804, 26803, -1]]. +Object config [object id=27075, config id=1077, shift=0, childs=[27073, 27073, -1, -1, -1, 27073, -1, -1, -1, -1, 27073, -1, -1, -1, -1, 27073, -1, -1, -1, -1, 27073, -1, -1, -1, -1, 27073, -1, -1, -1, -1, 27073, -1, -1, -1, -1, 27073, -1, -1, -1, -1, 27073, -1, -1, -1, -1, 27073, -1, -1, -1, -1, 27073, -1, -1, -1, -1, 27074, -1, -1, -1, -1, 27074, -1, -1, -1, -1, 27074, -1]]. +Object config [object id=27127, config id=1077, shift=0, childs=[27133, 27133, -1, -1, -1, 27133, -1, -1, -1, -1, 27133, -1, -1, -1, -1, 27133, -1, -1, -1, -1, 27133, -1, -1, -1, -1, 27133, -1, -1, -1, -1, 27133, -1, -1, -1, -1, 27126, -1, -1, -1, -1, 27126, -1, -1, -1, -1, 27126, -1, -1, -1, -1, 27126, -1, -1, -1, -1, 27126, -1, -1, -1, -1, 27126, -1, -1, -1, -1, 27126, -1]]. +Object config [object id=27050, config id=635, shift=16, childs=[683, 683, 683, 27051, 683, -1]]. +Object config [object id=27069, config id=635, shift=27, childs=[27067, 27068, -1]]. +Object config [object id=30621, config id=1218, shift=30, childs=[30532, 30533, -1]]. +Object config [object id=30623, config id=1218, shift=24, childs=[30539, 30540, -1]]. +Object config [object id=30622, config id=1218, shift=31, childs=[30535, 30536, -1]]. +Object config [object id=29877, config id=1205, shift=8, childs=[29826, 29827, 29827, 29827, 29827, 29827, 29827, 29827, 29827, 29827, 29827, 29828, -1]]. +Object config [object id=29879, config id=1205, shift=0, childs=[-1, -1, -1, -1, -1, 29856, -1, -1, -1, -1, 29856, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29856, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29856, -1, -1, 29856, -1, -1, -1, 29856, -1, -1, 29856, -1, -1, -1, -1, 29855, -1, -1, -1, -1, 29855, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29855, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29855, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29855, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29856, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29856, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29856, -1, -1, 29856, -1, -1, 29856, -1, -1, -1, 29856, -1, -1, 29856, -1, -1, 29856, -1, -1, -1, 29856, -1, -1, 29856, -1, -1, 29856, -1, -1, -1, 29856, -1, -1, 29856, -1, -1, 29856, -1, -1, -1, 29856, -1, -1, 29856, -1, -1, 29856, -1, -1, -1, 29856, -1]]. +Object config [object id=29878, config id=1205, shift=0, childs=[-1, -1, -1, -1, -1, 29854, -1, -1, -1, -1, 29854, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29854, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29854, -1, -1, 29854, -1, -1, -1, 29854, -1, -1, 29854, -1, -1, -1, -1, 29853, -1, -1, -1, -1, 29853, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29853, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29853, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29853, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29854, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29854, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29854, -1, -1, 29854, -1, -1, 29854, -1, -1, -1, 29854, -1, -1, 29854, -1, -1, 29854, -1, -1, -1, 29854, -1, -1, 29854, -1, -1, 29854, -1, -1, -1, 29854, -1, -1, 29854, -1, -1, 29854, -1, -1, -1, 29854, -1, -1, 29854, -1, -1, 29854, -1, -1, -1, 29854, -1]]. +Object config [object id=29880, config id=1205, shift=0, childs=[-1, -1, -1, -1, -1, 29857, -1, -1, -1, -1, 29857, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29857, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29857, -1, -1, 29857, -1, -1, -1, 29857, -1, -1, 29857, -1, -1, -1, -1, 29859, -1, -1, -1, -1, 29860, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29861, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29862, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29863, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29857, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29857, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29857, -1, -1, 29857, -1, -1, 29857, -1, -1, -1, 29857, -1, -1, 29857, -1, -1, 29857, -1, -1, -1, 29857, -1, -1, 29857, -1, -1, 29857, -1, -1, -1, 29857, -1, -1, 29857, -1, -1, 29857, -1, -1, -1, 29857, -1, -1, 29857, -1, -1, 29857, -1, -1, -1, 29857, -1]]. +Object config [object id=29842, config id=1205, shift=0, childs=[-1, -1, -1, -1, -1, 29840, -1, -1, -1, -1, 29840, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29840, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29840, -1, -1, 29840, -1, -1, -1, 29840, -1, -1, 29840, -1, -1, -1, -1, 29840, -1, -1, -1, -1, 29840, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29840, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29840, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29840, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29840, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29840, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29840, -1, -1, 29841, -1, -1, 29841, -1, -1, -1, 29841, -1, -1, 29841, -1, -1, 29841, -1, -1, -1, 29841, -1, -1, 29841, -1, -1, 29841, -1, -1, -1, 29841, -1, -1, 29841, -1, -1, 29841, -1, -1, -1, 29841, -1, -1, 29841, -1, -1, 29841, -1, -1, -1, 29841, -1]]. +Object config [object id=29736, config id=1203, shift=26, childs=[29730, 29731, -1]]. +Object config [object id=29735, config id=1203, shift=29, childs=[29585, 29586, -1]]. +Object config [object id=29734, config id=1203, shift=25, childs=[29577, 29578, -1]]. +Object config [object id=29801, config id=1204, shift=0, childs=[18179, -1, -1, -1, -1, 18179, -1, -1, -1, -1, 18179, -1, -1, -1, -1, 18179, -1, -1, -1, -1, 18179, -1, -1, -1, -1, 18179, -1, 18179, -1, -1, 18179, -1, -1, -1, -1, 18179, -1, -1, -1, -1, 29804, -1, -1, -1, -1, 29804, 29804, -1, -1, -1, 29804, -1, -1, -1, -1, 29804, -1, 29804, -1, -1, 29804, 29804, -1, -1, -1, 29804, -1, -1, -1, -1, 29804, 29804, -1, -1, -1, 29804, -1, -1, -1, -1, 29804, -1, 29804, -1, -1, 29804, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18179, -1]]. +Object config [object id=29800, config id=1204, shift=0, childs=[18347, -1, -1, -1, -1, 18347, -1, -1, -1, -1, 18347, -1, -1, -1, -1, 18347, -1, -1, -1, -1, 18347, -1, -1, -1, -1, 18347, -1, 18347, -1, -1, 18347, -1, -1, -1, -1, 18347, -1, -1, -1, -1, 29803, -1, -1, -1, -1, 29803, 29803, -1, -1, -1, 29803, -1, -1, -1, -1, 29803, -1, 29803, -1, -1, 29803, 29803, -1, -1, -1, 29803, -1, -1, -1, -1, 29803, 29803, -1, -1, -1, 29803, -1, -1, -1, -1, 29803, -1, 29803, -1, -1, 29803, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18347, -1]]. +Object config [object id=29802, config id=1204, shift=0, childs=[29806, -1, -1, -1, -1, 29806, -1, -1, -1, -1, 29806, -1, -1, -1, -1, 29806, -1, -1, -1, -1, 29806, -1, -1, -1, -1, 29806, -1, 29806, -1, -1, 29806, -1, -1, -1, -1, 29806, -1, -1, -1, -1, 29805, -1, -1, -1, -1, 29805, 29805, -1, -1, -1, 29805, -1, -1, -1, -1, 29805, -1, 29805, -1, -1, 29805, 29805, -1, -1, -1, 29805, -1, -1, -1, -1, 29805, 29805, -1, -1, -1, 29805, -1, -1, -1, -1, 29805, -1, 29805, -1, -1, 29805, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 18154, -1]]. +Object config [object id=29812, config id=1204, shift=20, childs=[-1, 29808, -1]]. +Object config [object id=29813, config id=1204, shift=20, childs=[-1, -1, 29808, -1]]. +Object config [object id=29814, config id=1204, shift=20, childs=[-1, -1, -1, 29808, -1]]. +Object config [object id=29815, config id=1204, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29808, -1]]. +Object config [object id=29570, config id=1201, shift=2, childs=[29568, 29569, 7082, -1]]. +Object config [object id=29573, config id=1201, shift=16, childs=[29571, 29572, 29546, -1]]. +Object config [object id=29558, config id=1201, shift=6, childs=[29556, 29557, 11701, -1]]. +Object config [object id=29555, config id=1201, shift=8, childs=[29553, 29554, 9668, -1]]. +Object config [object id=29552, config id=1201, shift=4, childs=[29550, 29551, 9625, -1]]. +Object config [object id=29567, config id=1201, shift=14, childs=[29565, 29566, 9519, -1]]. +Object config [object id=29564, config id=1201, shift=12, childs=[29562, 29563, 1018, -1]]. +Object config [object id=29561, config id=1201, shift=10, childs=[29559, 29560, 11662, -1]]. +Object config [object id=29543, config id=1181, shift=19, childs=[-1, 29540, -1]]. +Object config [object id=29542, config id=1181, shift=18, childs=[-1, 29540, -1]]. +Object config [object id=29549, config id=1201, shift=0, childs=[29547, 29548, 444, -1]]. +Object config [object id=29545, config id=1181, shift=16, childs=[29538, 29539, -1]]. +Object config [object id=29544, config id=1181, shift=20, childs=[-1, 29540, -1]]. +Object config [object id=29429, config id=1193, shift=26, childs=[29432, 29434, -1]]. +Object config [object id=29431, config id=1193, shift=28, childs=[29432, 29434, -1]]. +Object config [object id=29430, config id=1193, shift=27, childs=[29432, 29434, -1]]. +Object config [object id=29179, config id=1185, shift=27, childs=[29152, 29154, 29155, 29155, -1]]. +Object config [object id=29178, config id=1185, shift=25, childs=[29152, 29154, 29155, 29155, -1]]. +Object config [object id=29177, config id=1185, shift=23, childs=[29152, 29154, 29155, 29155, -1]]. +Object config [object id=29176, config id=1185, shift=21, childs=[29152, 29154, 29155, 29155, -1]]. +Object config [object id=29180, config id=1185, shift=29, childs=[29152, 29154, 29155, 29155, -1]]. +Object config [object id=29171, config id=1185, shift=21, childs=[28999, 28999, 28999, -1]]. +Object config [object id=29170, config id=1185, shift=21, childs=[28999, 28999, 28999, -1]]. +Object config [object id=29175, config id=1185, shift=29, childs=[28999, 28999, 28999, -1]]. +Object config [object id=29174, config id=1185, shift=27, childs=[28999, 28999, 28999, -1]]. +Object config [object id=29173, config id=1185, shift=25, childs=[28999, 28999, 28999, -1]]. +Object config [object id=29172, config id=1185, shift=23, childs=[28999, 28999, 28999, -1]]. +Object config [object id=29108, config id=1185, shift=31, childs=[29107, 29106, -1]]. +Object config [object id=29098, config id=1185, shift=19, childs=[29096, 29095, 29094, -1]]. +Object config [object id=29097, config id=1185, shift=17, childs=[29090, 29091, 29092, 29093, -1]]. +Object config [object id=28919, config id=830, shift=23, childs=[8050, 8049, 8048, 8047, 8050, 8050, 8050, 8050, 7935, 7936, 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947, 7949, 7950, 7951, 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7960, 7961, 7948, 7993, 7994, 7995, 7996, 7997, 7998, 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 7999, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8051, 8052, 8053, 8054, 8055, 8056, 8057, 8058, 8059, 8060, 8061, 8062, 8063, 8065, 8066, 8067, 8068, 8069, 8070, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8064, 8020, 8021, 8022, 8023, 8024, 8025, 8026, 8027, 8028, 8029, 8030, 8031, 8032, 8034, 8035, 8036, 8037, 8038, 8039, 8040, 8041, 8042, 8043, 8044, 8045, 8046, 8033, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 7966, 7967, 7968, 7969, 7970, 7971, 7972, 7973, 7974, 7975, 7976, 7977, 7978, 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 7992, 7979, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, 8117, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, 8129, 8130, 8131, 8118, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, 8091, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, 8050, -1]]. +Object config [object id=28888, config id=1181, shift=8, childs=[28781, 28780, -1]]. +Object config [object id=31759, config id=222, shift=21, childs=[17424, 17423, 17423, -1]]. +Object config [object id=31277, config id=1227, shift=0, childs=[31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, 31258, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, 31292, -1, -1, 31292, -1, -1, 31292, -1]]. +Object config [object id=31276, config id=1227, shift=0, childs=[31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, 31258, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, -1, -1, -1, 31258, -1, 31292, -1, -1, 31292, -1, -1, 31292, -1]]. +Object config [object id=31278, config id=1227, shift=0, childs=[31258, -1, -1, -1, -1, 31292, -1, -1, -1, -1, 31292, -1, -1, -1, -1, 31292, -1, 31292, -1, -1, 31292, -1, -1, -1, -1, 31292, -1, -1, -1, -1, 31292, -1, -1, -1, -1, 31292, -1, -1, -1, -1, 31292, -1, -1, -1, -1, 31292, -1, -1, -1, -1, 31292, -1, -1, -1, -1, 31292, -1, 31292, -1, -1, 31258, -1, -1, 31258, -1]]. +Object config [object id=31449, config id=1002, shift=28, childs=[31448, -1]]. +Object config [object id=31040, config id=1225, shift=0, childs=[31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, 31007, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, 31007, -1, -1, -1, 31007, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31007, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31006, -1]]. +Object config [object id=31012, config id=1225, shift=0, childs=[31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, 31011, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, 31011, -1, -1, -1, 31011, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31011, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31010, -1]]. +Object config [object id=31031, config id=1225, shift=17, childs=[-1, 31014, -1]]. +Object config [object id=31028, config id=1225, shift=0, childs=[31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, 31026, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, 31026, -1, -1, -1, 31026, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31026, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31027, -1]]. +Object config [object id=31038, config id=1225, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30802, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30802, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30802, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30802, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30802, -1]]. +Object config [object id=31039, config id=1225, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30803, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30803, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30803, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30803, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30803, -1]]. +Object config [object id=31036, config id=1225, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30800, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30800, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30800, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30800, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30800, -1]]. +Object config [object id=31037, config id=1225, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30801, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30801, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30801, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30801, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30801, -1]]. +Object config [object id=31034, config id=1225, shift=0, childs=[30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, 30809, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, 30809, -1, -1, -1, 30809, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30809, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30811, -1]]. +Object config [object id=31035, config id=1225, shift=0, childs=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30799, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30799, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30799, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30799, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30799, -1]]. +Object config [object id=31032, config id=1225, shift=20, childs=[31017, 31015, 31016, -1]]. +Object config [object id=31033, config id=1225, shift=0, childs=[30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, 30808, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, 30808, -1, -1, -1, 30808, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30808, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30810, -1]]. +Object config [object id=30999, config id=1225, shift=0, childs=[30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, 30997, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, 30997, -1, -1, -1, 30997, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30997, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30924, -1]]. +Object config [object id=35088, config id=553, shift=9, childs=[35087, 35087, 35086, 35086, -1]]. +Object config [object id=36309, config id=518, shift=8, childs=[9328, 9328, 9328, 9328, 9328, 9328, 9328, 9329, 9329, 9329, 9329, 9329, 9329, 9329, -1]]. +Object config [object id=36756, config id=553, shift=9, childs=[36752, 36753, 36753, -1]]. +Object config [object id=36755, config id=553, shift=9, childs=[36751, 36754, 36754, -1]]. +Object config [object id=33334, config id=874, shift=14, childs=[33245, 33244, -1]]. +Object config [object id=36880, config id=695, shift=-1, childs=[36879, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, 36878, -1]]. +Object config [object id=36933, config id=553, shift=9, childs=[36752, 36753, -1]]. +Object config [object id=36932, config id=553, shift=9, childs=[36751, 36754, -1]]. diff --git a/dumps/498/498_object_dump.txt b/dumps/498/498_object_dump.txt new file mode 100644 index 000000000..c28dfb219 --- /dev/null +++ b/dumps/498/498_object_dump.txt @@ -0,0 +1,38027 @@ +0 - null - [null, null, null, null, null] +1 - Crate - [Search, null, null, null, null] +2 - Cave Entrance - [Enter, null, null, null, null] +3 - Door - [Open, null, null, null, null] +4 - Door - [Open, null, null, null, null] +5 - Broken multicannon - [Inspect, null, null, null, null] +6 - Dwarf multicannon - [Fire, Pick-up, null, null, null] +7 - Cannon base - [Pick-up, null, null, null, null] +8 - Cannon stand - [Pick-up, null, null, null, null] +9 - Cannon barrels - [Pick-up, null, null, null, null] +10 - Ladder - [Climb-down, null, null, null, null] +11 - Ladder - [Climb-up, null, null, null, null] +12 - Rock pile - [Climb-over, null, null, null, null] +13 - Mud pile - [Climb-over, null, null, null, null] +14 - Railing - [Inspect, null, null, null, null] +15 - Railing - [Inspect, null, null, null, null] +16 - Railing - [Inspect, null, null, null, null] +17 - Railing - [Inspect, null, null, null, null] +18 - Railing - [Inspect, null, null, null, null] +19 - Railing - [Inspect, null, null, null, null] +20 - Railing - [Inspect, null, null, null, null] +21 - Mysterious statue - [null, null, null, null, null] +22 - Door - [Open, null, null, null, null] +23 - Sacks - [Prod, Open, null, null, null] +24 - Door - [Open, null, null, null, null] +25 - Clock spindle - [null, null, null, null, null] +26 - Clock spindle - [null, null, null, null, null] +27 - Clock spindle - [null, null, null, null, null] +28 - Clock spindle - [null, null, null, null, null] +29 - Clock spindle - [null, null, null, null, null] +30 - Clock spindle - [null, null, null, null, null] +31 - Clock spindle - [null, null, null, null, null] +32 - Clock spindle - [null, null, null, null, null] +33 - Lever - [Pull, null, null, null, null] +34 - Lever - [Pull, null, null, null, null] +35 - Lever - [Pull, null, null, null, null] +36 - Lever - [Pull, null, null, null, null] +37 - Gate - [Open, null, null, null, null] +38 - Gate - [Open, null, null, null, null] +39 - Gate - [Go-through, null, null, null, null] +40 - Food trough - [null, null, null, null, null] +41 - Wall Pipe - [Search, null, null, null, null] +42 - Fishing spot - [Fish, null, null, null, null] +43 - Water - [null, null, null, null, null] +44 - Fishing spot - [Fish, null, null, null, null] +45 - Fishing spot - [Fish, null, null, null, null] +46 - Fishing spot - [Fish, null, null, null, null] +47 - Gate - [Open, null, null, null, null] +48 - Gate - [Open, null, null, null, null] +49 - Gate - [null, null, null, null, null] +50 - Gate - [null, null, null, null, null] +51 - Loose Railing - [Squeeze-through, null, null, null, null] +52 - Gate - [Open, null, null, null, null] +53 - Gate - [Open, null, null, null, null] +54 - Stairs - [Climb-up, null, null, null, null] +55 - Stairs - [Climb-down, null, null, null, null] +56 - Stairs - [Climb-up, null, null, null, null] +57 - Stairs - [Climb-down, null, null, null, null] +58 - Vine - [Check, null, null, null, null] +59 - Door - [Open, null, null, null, null] +60 - Ladder - [Climb-up, null, null, null, null] +61 - Chaos altar - [Pray-at, Check, null, null, null] +62 - Giant crystal - [Smash, null, null, null, null] +63 - Crate - [null, Hide-in, null, null, null] +64 - Crate - [null, Hide-in, null, null, null] +65 - Crate wall - [Climb-out, null, null, null, null] +66 - Crate wall - [Climb-out, null, null, null, null] +67 - Crate - [null, Check, null, null, null] +68 - Beehive - [Take-from, Take-honey, null, null, null] +69 - Gangplank - [Cross, null, null, null, null] +70 - Gangplank - [Cross, null, null, null, null] +71 - Large door - [Open, Knock-at, null, null, null] +72 - Large door - [Open, Knock-at, null, null, null] +73 - Large door - [Open, null, null, null, null] +74 - Large door - [Open, null, null, null, null] +75 - Chest - [Open, null, null, null, null] +76 - Chest - [Search, Close, null, null, null] +77 - Door - [null, null, null, null, null] +78 - Door - [null, null, null, null, null] +79 - Prison Door - [Open, null, null, null, null] +80 - Prison Door - [Open, null, null, null, null] +81 - Door - [Open, null, null, null, null] +82 - Door - [Open, null, null, null, null] +83 - null - [null, null, null, null, null] +84 - null - [null, null, null, null, null] +85 - null - [null, null, null, null, null] +86 - Lever bracket - [null, null, null, null, null] +87 - Lever - [Pull, null, null, null, null] +88 - null - [null, null, null, null, null] +89 - Gate - [Open, null, null, null, null] +90 - Gate - [Open, null, null, null, null] +91 - Lever - [Pull, Search for traps, null, null, null] +92 - Door - [Open, null, null, null, null] +93 - Door - [Open, null, null, null, null] +94 - Gate - [Open, null, null, null, null] +95 - Gate - [Open, null, null, null, null] +96 - Stairs - [Climb-up, null, null, null, null] +97 - null - [null, null, null, null, null] +98 - Stairs - [Climb-down, null, null, null, null] +99 - Door - [Open, null, null, null, null] +100 - Trapdoor - [Open, null, null, null, null] +101 - Ladder - [Climb-up, null, null, null, null] +102 - Door - [Open, null, null, null, null] +103 - Closed chest - [Open, null, null, null, null] +104 - Open chest - [Search, Shut, null, null, null] +105 - Trapdoor - [null, null, null, null, null] +106 - Trapdoor - [null, null, null, null, null] +107 - null - [null, null, null, null, null] +108 - null - [null, null, null, null, null] +109 - null - [null, null, null, null, null] +110 - null - [null, null, null, null, null] +111 - null - [null, null, null, null, null] +112 - null - [null, null, null, null, null] +113 - null - [null, null, null, null, null] +114 - Cooking range - [null, null, null, null, null] +115 - Party Balloon - [Burst, null, null, null, null] +116 - Party Balloon - [Burst, null, null, null, null] +117 - Party Balloon - [Burst, null, null, null, null] +118 - Party Balloon - [Burst, null, null, null, null] +119 - Party Balloon - [Burst, null, null, null, null] +120 - Party Balloon - [Burst, null, null, null, null] +121 - Party Balloon - [Burst, null, null, null, null] +122 - Party Balloon - [Burst, null, null, null, null] +123 - Party Balloon - [null, null, null, null, null] +124 - Party Balloon - [null, null, null, null, null] +125 - Party Balloon - [null, null, null, null, null] +126 - Party Balloon - [null, null, null, null, null] +127 - Party Balloon - [null, null, null, null, null] +128 - Party Balloon - [null, null, null, null, null] +129 - Party Balloon - [null, null, null, null, null] +130 - Party Balloon - [null, null, null, null, null] +131 - Door - [Open, null, null, null, null] +132 - Ladder - [Climb-up, null, null, null, null] +133 - Ladder - [Climb-down, null, null, null, null] +134 - Large door - [Open, null, null, null, null] +135 - Large door - [Open, null, null, null, null] +136 - Door - [Open, null, null, null, null] +137 - null - [Open, null, null, null, null] +138 - null - [Open, null, null, null, null] +139 - null - [Open, null, null, null, null] +140 - null - [Open, null, null, null, null] +141 - null - [Open, null, null, null, null] +142 - null - [Open, null, null, null, null] +143 - null - [Open, null, null, null, null] +144 - null - [Open, null, null, null, null] +145 - null - [Open, null, null, null, null] +146 - null - [Pull, Inspect, null, null, null] +147 - null - [Pull, Inspect, null, null, null] +148 - null - [Pull, Inspect, null, null, null] +149 - null - [Pull, Inspect, null, null, null] +150 - null - [Pull, Inspect, null, null, null] +151 - null - [Pull, Inspect, null, null, null] +152 - Compost heap - [Search, null, null, null, null] +153 - Fountain - [Search, null, null, null, null] +154 - Obstacle pipe - [Squeeze-through, null, null, null, null] +155 - Bookcase - [Search, null, null, null, null] +156 - Bookcase - [Search, null, null, null, null] +157 - Bookcase - [null, null, null, null, null] +158 - Wall - [null, null, null, null, null] +159 - Wall - [null, null, null, null, null] +160 - Lever - [Pull, null, null, null, null] +161 - null - [null, null, null, null, null] +162 - Strange machine - [null, null, null, null, null] +163 - Strange machine - [null, null, null, null, null] +164 - Strange machine - [null, null, null, null, null] +165 - Incinerator - [null, null, null, null, null] +166 - Gate - [Open, null, null, null, null] +167 - Gate - [Open, null, null, null, null] +168 - null - [null, null, null, null, null] +169 - null - [null, null, null, null, null] +170 - Closed chest - [Open, null, null, null, null] +171 - Open chest - [null, null, null, null, null] +172 - Closed chest - [Open, null, null, null, null] +173 - Open chest - [null, null, null, null, null] +174 - null - [null, null, null, null, null] +175 - null - [null, null, null, null, null] +176 - null - [null, null, null, null, null] +177 - null - [null, null, null, null, null] +178 - null - [null, null, null, null, null] +179 - null - [null, null, null, null, null] +180 - null - [null, null, null, null, null] +181 - null - [null, null, null, null, null] +182 - null - [null, null, null, null, null] +183 - null - [null, null, null, null, null] +184 - null - [null, null, null, null, null] +185 - null - [null, null, null, null, null] +186 - null - [null, null, null, null, null] +187 - Gnome glider - [null, null, null, null, null] +188 - Crashed glider - [null, null, null, null, null] +189 - Blurberry bar - [null, null, null, null, null] +190 - Gate - [Open, null, null, null, null] +191 - null - [null, null, null, null, null] +192 - null - [null, null, null, null, null] +193 - null - [null, null, null, null, null] +194 - Hollowed rock - [Enter, null, null, null, null] +195 - Ladder - [Climb-up, null, null, null, null] +196 - null - [null, null, null, null, null] +197 - null - [null, null, null, null, null] +198 - null - [null, null, null, null, null] +199 - null - [null, null, null, null, null] +200 - Lamp - [null, null, null, null, null] +201 - Lamp - [null, null, null, null, null] +202 - Candles - [null, null, null, null, null] +203 - Candles - [null, null, null, null, null] +204 - Candles - [null, null, null, null, null] +205 - null - [null, null, null, null, null] +206 - null - [null, null, null, null, null] +207 - null - [null, null, null, null, null] +208 - Candles - [null, null, null, null, null] +209 - Chandelier - [null, null, null, null, null] +210 - Ice Light - [null, null, null, null, null] +211 - Candles - [null, null, null, null, null] +212 - Sail - [null, null, null, null, null] +213 - null - [null, null, null, null, null] +214 - null - [null, null, null, null, null] +215 - null - [null, null, null, null, null] +216 - null - [null, null, null, null, null] +217 - null - [null, null, null, null, null] +218 - Sail - [null, null, null, null, null] +219 - null - [null, null, null, null, null] +220 - null - [null, null, null, null, null] +221 - Figurehead - [null, null, null, null, null] +222 - Figurehead - [null, null, null, null, null] +223 - null - [null, null, null, null, null] +224 - null - [null, null, null, null, null] +225 - Sail - [null, null, null, null, null] +226 - Sail - [null, null, null, null, null] +227 - Pile of rope - [null, null, null, null, null] +228 - null - [null, null, null, null, null] +229 - null - [null, null, null, null, null] +230 - null - [null, null, null, null, null] +231 - null - [null, null, null, null, null] +232 - null - [null, null, null, null, null] +233 - null - [null, null, null, null, null] +234 - null - [null, null, null, null, null] +235 - null - [null, null, null, null, null] +236 - null - [null, null, null, null, null] +237 - null - [null, null, null, null, null] +238 - null - [null, null, null, null, null] +239 - null - [null, null, null, null, null] +240 - null - [null, null, null, null, null] +241 - null - [null, null, null, null, null] +242 - null - [null, null, null, null, null] +243 - null - [null, null, null, null, null] +244 - null - [null, null, null, null, null] +245 - Ship's ladder - [Climb-up, null, null, null, null] +246 - Ship's ladder - [Climb-down, null, null, null, null] +247 - null - [null, null, null, null, null] +248 - null - [null, null, null, null, null] +249 - null - [null, null, null, null, null] +250 - null - [null, null, null, null, null] +251 - null - [null, null, null, null, null] +252 - Ship's wheel - [null, null, null, null, null] +253 - null - [null, null, null, null, null] +254 - Figurehead - [null, null, null, null, null] +255 - Winch - [Operate, null, null, null, null] +256 - null - [null, null, null, null, null] +257 - null - [null, null, null, null, null] +258 - null - [null, null, null, null, null] +259 - null - [null, null, null, null, null] +260 - Figurehead - [null, null, null, null, null] +261 - null - [null, null, null, null, null] +262 - null - [null, null, null, null, null] +263 - null - [null, null, null, null, null] +264 - null - [null, null, null, null, null] +265 - Sail - [null, null, null, null, null] +266 - Sail - [null, null, null, null, null] +267 - Sail - [null, null, null, null, null] +268 - Sail - [null, null, null, null, null] +269 - null - [null, null, null, null, null] +270 - null - [null, null, null, null, null] +271 - Anchor - [null, null, null, null, null] +272 - Ship's ladder - [Climb-up, null, null, null, null] +273 - Ship's ladder - [Climb-down, null, null, null, null] +274 - Hoisted sail - [null, null, null, null, null] +275 - Hoisted sail - [null, null, null, null, null] +276 - Hoisted sail - [null, null, null, null, null] +277 - Hoisted sail - [null, null, null, null, null] +278 - Hoisted sail - [null, null, null, null, null] +279 - Hoisted sail - [null, null, null, null, null] +280 - null - [null, null, null, null, null] +281 - null - [null, null, null, null, null] +282 - null - [null, null, null, null, null] +283 - null - [null, null, null, null, null] +284 - null - [null, null, null, null, null] +285 - null - [null, null, null, null, null] +286 - null - [null, null, null, null, null] +287 - Ladder - [Climb-down, null, null, null, null] +288 - null - [null, null, null, null, null] +289 - null - [null, null, null, null, null] +290 - null - [null, null, null, null, null] +291 - null - [null, null, null, null, null] +292 - null - [null, null, null, null, null] +293 - null - [null, null, null, null, null] +294 - null - [null, null, null, null, null] +295 - null - [null, null, null, null, null] +296 - Plough - [null, null, null, null, null] +297 - Scarecrow - [null, null, null, null, null] +298 - Hay bales - [Search, null, null, null, null] +299 - Hay bales - [Search, null, null, null, null] +300 - Haystack - [Search, null, null, null, null] +301 - Food trough - [null, null, null, null, null] +302 - Eggs - [null, null, null, null, null] +303 - Compost - [null, null, null, null, null] +304 - Hay bale - [Search, null, null, null, null] +305 - Beehive - [null, null, null, null, null] +306 - Broken cart - [null, null, null, null, null] +307 - Cart - [null, null, null, null, null] +308 - Cart - [null, null, null, null, null] +309 - Log pile - [null, null, null, null, null] +310 - Mud patch - [null, null, null, null, null] +311 - Mudpile - [null, null, null, null, null] +312 - Potato - [null, Pick, null, null, null] +313 - Wheat - [null, Pick, null, null, null] +314 - null - [null, null, null, null, null] +315 - null - [null, null, null, null, null] +316 - null - [null, null, null, null, null] +317 - null - [null, null, null, null, null] +318 - null - [null, null, null, null, null] +319 - null - [null, null, null, null, null] +320 - null - [null, null, null, null, null] +321 - null - [null, null, null, null, null] +322 - null - [null, null, null, null, null] +323 - null - [null, null, null, null, null] +324 - null - [null, null, null, null, null] +325 - null - [null, null, null, null, null] +326 - null - [null, null, null, null, null] +327 - Broken cart wheel - [null, null, null, null, null] +328 - null - [null, null, null, null, null] +329 - null - [null, null, null, null, null] +330 - null - [null, null, null, null, null] +331 - null - [null, null, null, null, null] +332 - null - [null, null, null, null, null] +333 - null - [null, null, null, null, null] +334 - null - [null, null, null, null, null] +335 - null - [null, null, null, null, null] +336 - null - [null, null, null, null, null] +337 - null - [null, null, null, null, null] +338 - null - [null, null, null, null, null] +339 - null - [null, null, null, null, null] +340 - null - [null, null, null, null, null] +341 - null - [null, null, null, null, null] +342 - null - [null, null, null, null, null] +343 - null - [null, null, null, null, null] +344 - null - [null, null, null, null, null] +345 - null - [null, null, null, null, null] +346 - Cabinet - [null, null, null, null, null] +347 - Cabinet - [null, null, null, null, null] +348 - Drawers - [Open, null, null, null, null] +349 - Drawers - [null, Search, Shut, null, null] +350 - Drawers - [Open, null, null, null, null] +351 - Drawers - [null, Search, Shut, null, null] +352 - Drawers - [Open, null, null, null, null] +353 - Drawers - [null, Search, Shut, null, null] +354 - Crate - [Search, null, null, null, null] +355 - Crate - [Search, null, null, null, null] +356 - Crate - [Search, null, null, null, null] +357 - Crate - [Search, null, null, null, null] +358 - Crate - [Search, null, null, null, null] +359 - Boxes - [Search, null, null, null, null] +360 - Boxes - [Search, null, null, null, null] +361 - Boxes - [Search, null, null, null, null] +362 - Barrel - [null, null, null, null, null] +363 - Barrel - [null, null, null, null, null] +364 - Barrel - [null, null, null, null, null] +365 - Sacks - [Search, null, null, null, null] +366 - Crate - [Search, null, null, null, null] +367 - Cupboard - [Open, null, null, null, null] +368 - Cupboard - [Open, null, null, null, null] +369 - Large cupboard - [Open, null, null, null, null] +370 - Open Cupboard - [null, Search, Shut, null, null] +371 - Cupboard - [null, Search, Shut, null, null] +372 - Large open cupboard - [null, Search, Close, null, null] +373 - Dresser - [null, null, null, null, null] +374 - Hat stand - [null, null, null, null, null] +375 - Closed chest - [Open, null, null, null, null] +376 - Closed chest - [Open, null, null, null, null] +377 - Closed chest - [Open, null, null, null, null] +378 - Open chest - [null, Search, Shut, null, null] +379 - Open chest - [null, Search, Shut, null, null] +380 - Bookcase - [Search, null, null, null, null] +381 - Bookcase - [Search, null, null, null, null] +382 - Basket - [null, null, null, null, null] +383 - Basket - [null, null, null, null, null] +384 - Basket - [null, null, null, null, null] +385 - Basket - [null, null, null, null, null] +386 - Large urn - [null, null, null, null, null] +387 - Bookshelves - [null, null, null, null, null] +388 - Wardrobe - [Open, null, null, null, null] +389 - Wardrobe - [null, Search, Close, null, null] +390 - Wardrobe - [null, Search, Close, null, null] +391 - null - [null, null, null, null, null] +392 - Full fishing net - [null, null, null, null, null] +393 - Bookcase - [Search, null, null, null, null] +394 - Bookcase - [Search, null, null, null, null] +395 - Pot - [null, null, null, null, null] +396 - Pots - [null, null, null, null, null] +397 - Cabinet - [null, null, null, null, null] +398 - Coffin - [Open, null, null, null, null] +399 - Coffin - [Close, null, null, null, null] +400 - Small gravestone - [null, null, null, null, null] +401 - Grave marker - [null, null, null, null, null] +402 - Tombstone - [null, null, null, null, null] +403 - Large grave stone - [null, null, null, null, null] +404 - Gravestone - [null, null, null, null, null] +405 - Gravestone - [null, null, null, null, null] +406 - Large grave - [null, null, null, null, null] +407 - Henge - [null, null, null, null, null] +408 - Henge - [null, null, null, null, null] +409 - Altar - [Pray-at, null, null, null, null] +410 - Altar of Guthix - [Pray-at, null, null, null, null] +411 - Chaos altar - [Pray-at, null, null, null, null] +412 - Chaos altar - [Pray-at, null, null, null, null] +413 - Dolmen - [null, null, null, null, null] +414 - Coffin - [Open, null, null, null, null] +415 - Coffin - [Open, null, null, null, null] +416 - Church organ - [Play, null, null, null, null] +417 - Bed - [null, null, null, null, null] +418 - Bed - [null, null, null, null, null] +419 - Bed - [null, null, null, null, null] +420 - Bed - [null, null, null, null, null] +421 - Bed - [null, null, null, null, null] +422 - Bed - [null, null, null, null, null] +423 - Bed - [null, null, null, null, null] +424 - Bed - [null, null, null, null, null] +425 - Bed - [null, null, null, null, null] +426 - Bed - [null, null, null, null, null] +427 - Bed - [null, null, null, null, null] +428 - Bed - [null, null, null, null, null] +429 - Bed - [null, null, null, null, null] +430 - Hammock - [null, null, null, null, null] +431 - Chaise lounge - [null, null, null, null, null] +432 - Bed - [null, null, null, null, null] +433 - Bed - [null, null, null, null, null] +434 - Bed - [null, null, null, null, null] +435 - Bed - [null, null, null, null, null] +436 - Rock - [null, null, null, null, null] +437 - Rock - [null, null, null, null, null] +438 - Rock - [null, null, null, null, null] +439 - Rock - [null, null, null, null, null] +440 - Rock - [null, null, null, null, null] +441 - Rock - [null, null, null, null, null] +442 - Rock - [null, null, null, null, null] +443 - null - [null, null, null, null, null] +444 - Boulder - [null, null, null, null, null] +445 - Boulder - [null, null, null, null, null] +446 - Stones - [null, null, null, null, null] +447 - Stones - [null, null, null, null, null] +448 - null - [null, null, null, null, null] +449 - Overhanging rock - [null, null, null, null, null] +450 - Rocks - [Mine, Prospect, hidden, null, null] +451 - Rocks - [Mine, Prospect, hidden, null, null] +452 - Rocks - [Mine, Prospect, hidden, null, null] +453 - Rocks - [Mine, Prospect, hidden, null, null] +454 - Cave rocks - [null, null, null, null, null] +455 - Cave rocks - [null, null, null, null, null] +456 - null - [null, null, null, null, null] +457 - null - [null, null, null, null, null] +458 - null - [null, null, null, null, null] +459 - null - [null, null, null, null, null] +460 - null - [null, null, null, null, null] +461 - null - [null, null, null, null, null] +462 - Mossy rock - [null, null, null, null, null] +463 - Mossy rock - [null, null, null, null, null] +464 - Column - [null, null, null, null, null] +465 - Column - [null, null, null, null, null] +466 - Column - [null, null, null, null, null] +467 - Stalactite - [null, null, null, null, null] +468 - Stalagmites - [null, null, null, null, null] +469 - Stalactite - [null, null, null, null, null] +470 - null - [null, null, null, null, null] +471 - Rockslide - [null, null, null, null, null] +472 - Rockslide - [null, null, null, null, null] +473 - Rockslide - [null, null, null, null, null] +474 - Rockslide - [null, null, null, null, null] +475 - null - [null, null, null, null, null] +476 - null - [null, null, null, null, null] +477 - Mossy rock - [null, null, null, null, null] +478 - Mossy rock - [null, null, null, null, null] +479 - Rockslide - [null, null, null, null, null] +480 - Rockslide - [null, null, null, null, null] +481 - Rockslide - [null, null, null, null, null] +482 - Rockslide - [null, null, null, null, null] +483 - Rockslide - [null, null, null, null, null] +484 - Rockslide - [null, null, null, null, null] +485 - Rockslide - [null, null, null, null, null] +486 - Rockslide - [null, null, null, null, null] +487 - null - [null, null, null, null, null] +488 - null - [null, null, null, null, null] +489 - null - [null, null, null, null, null] +490 - null - [null, null, null, null, null] +491 - null - [null, null, null, null, null] +492 - Rocks - [Climb-down, null, null, null, null] +493 - null - [null, null, null, null, null] +494 - null - [null, null, null, null, null] +495 - null - [null, null, null, null, null] +496 - null - [null, null, null, null, null] +497 - null - [null, null, null, null, null] +498 - null - [null, null, null, null, null] +499 - null - [null, null, null, null, null] +500 - null - [null, null, null, null, null] +501 - null - [null, null, null, null, null] +502 - null - [null, null, null, null, null] +503 - null - [null, null, null, null, null] +504 - null - [null, null, null, null, null] +505 - null - [null, null, null, null, null] +506 - null - [null, null, null, null, null] +507 - Rockslide - [null, null, null, null, null] +508 - Rockslide - [null, null, null, null, null] +509 - Rockslide - [null, null, null, null, null] +510 - Rockslide - [null, null, null, null, null] +511 - Rocks - [null, null, null, null, null] +512 - null - [null, null, null, null, null] +513 - null - [null, null, null, null, null] +514 - null - [null, null, null, null, null] +515 - null - [null, null, null, null, null] +516 - Ice Column - [null, null, null, null, null] +517 - Rockslide - [null, null, null, null, null] +518 - Rockslide - [null, null, null, null, null] +519 - Rockslide - [null, null, null, null, null] +520 - Rockslide - [null, null, null, null, null] +521 - null - [null, null, null, null, null] +522 - null - [null, null, null, null, null] +523 - Column - [null, null, null, null, null] +524 - Column - [null, null, null, null, null] +525 - Column - [null, null, null, null, null] +526 - Column - [null, null, null, null, null] +527 - Column - [null, null, null, null, null] +528 - Column - [null, null, null, null, null] +529 - Stalactite - [null, null, null, null, null] +530 - Stalagmites - [null, null, null, null, null] +531 - Stalactite - [null, null, null, null, null] +532 - Stalagmites - [null, null, null, null, null] +533 - Stalactite - [null, null, null, null, null] +534 - Stalagmite - [null, null, null, null, null] +535 - null - [null, null, null, null, null] +536 - null - [null, null, null, null, null] +537 - null - [null, null, null, null, null] +538 - null - [null, null, null, null, null] +539 - Stalactite - [null, null, null, null, null] +540 - null - [null, null, null, null, null] +541 - Stalagmite - [null, null, null, null, null] +542 - Stalagmite - [null, null, null, null, null] +543 - Stalactite - [null, null, null, null, null] +544 - Stalagmite - [null, null, null, null, null] +545 - Boulder - [null, null, null, null, null] +546 - Eerie statue - [null, null, null, null, null] +547 - null - [null, null, null, null, null] +548 - Rockslide - [null, null, null, null, null] +549 - Rockslide - [null, null, null, null, null] +550 - Rockslide - [null, null, null, null, null] +551 - Rockslide - [null, null, null, null, null] +552 - null - [null, null, null, null, null] +553 - null - [null, null, null, null, null] +554 - Icicle - [null, null, null, null, null] +555 - Icicle - [null, null, null, null, null] +556 - Icicle - [null, null, null, null, null] +557 - Icicle - [null, null, null, null, null] +558 - Cave entrance - [null, null, null, null, null] +559 - null - [null, null, null, null, null] +560 - null - [null, null, null, null, null] +561 - null - [null, null, null, null, null] +562 - Statue of a warrior - [null, null, null, null, null] +563 - Statue of a king - [null, null, null, null, null] +564 - Statue of a queen - [null, null, null, null, null] +565 - Statue of a king - [null, null, null, null, null] +566 - Statue of a warrior - [null, null, null, null, null] +567 - Tribal statue - [null, null, null, null, null] +568 - Dwarf statue - [null, null, null, null, null] +569 - Gnome statue - [null, null, null, null, null] +570 - Gnome statue - [null, null, null, null, null] +571 - Gnome statue - [null, null, null, null, null] +572 - Gnome statue - [null, null, null, null, null] +573 - Gnome statue - [null, null, null, null, null] +574 - Statue - [null, null, null, null, null] +575 - Statue - [null, null, null, null, null] +576 - Statue - [null, null, null, null, null] +577 - null - [null, null, null, null, null] +578 - null - [null, null, null, null, null] +579 - Statue - [null, null, null, null, null] +580 - Statue - [null, null, null, null, null] +581 - Statue - [null, null, null, null, null] +582 - Statue - [null, null, null, null, null] +583 - Vase - [null, null, null, null, null] +584 - Statue - [null, null, null, null, null] +585 - Statue of Saradomin - [null, null, null, null, null] +586 - Statue of Saradomin - [null, null, null, null, null] +587 - Statue of Zamorak - [null, null, null, null, null] +588 - Statue steps - [null, null, null, null, null] +589 - Crystal ball - [null, null, null, null, null] +590 - Bank table - [null, null, null, null, null] +591 - Bank table - [null, null, null, null, null] +592 - Bathroom table - [null, null, null, null, null] +593 - Table - [null, null, null, null, null] +594 - Table - [null, null, null, null, null] +595 - Table - [null, null, null, null, null] +596 - Table - [null, null, null, null, null] +597 - Table - [null, null, null, null, null] +598 - Table - [null, null, null, null, null] +599 - Table - [null, null, null, null, null] +600 - Table - [null, null, null, null, null] +601 - Table - [null, null, null, null, null] +602 - Table - [null, null, null, null, null] +603 - Table - [null, null, null, null, null] +604 - Table - [null, null, null, null, null] +605 - Table - [null, null, null, null, null] +606 - Table - [null, null, null, null, null] +607 - Table - [null, null, null, null, null] +608 - Study desk - [null, null, null, null, null] +609 - Workbench - [null, null, null, null, null] +610 - Workbench - [null, null, null, null, null] +611 - Picnic bench - [null, null, null, null, null] +612 - Counter - [null, null, null, null, null] +613 - Table - [null, null, null, null, null] +614 - Table - [null, null, null, null, null] +615 - Small table - [null, null, null, null, null] +616 - Table - [null, null, null, null, null] +617 - Counter - [null, null, null, null, null] +618 - Chemistry Table - [null, null, null, null, null] +619 - Chemistry Table - [null, null, null, null, null] +620 - Table - [null, null, null, null, null] +621 - Table - [null, null, null, null, null] +622 - Table - [null, null, null, null, null] +623 - Table - [null, null, null, null, null] +624 - Table - [null, null, null, null, null] +625 - null - [null, null, null, null, null] +626 - null - [null, null, null, null, null] +627 - null - [null, null, null, null, null] +628 - Silver stall - [null, null, null, null, null] +629 - Silk stall - [null, null, null, null, null] +630 - Bakery stall - [null, null, null, null, null] +631 - Gem stall - [null, null, null, null, null] +632 - Fur stall - [null, null, null, null, null] +633 - Spice stall - [null, null, null, null, null] +634 - Market stall - [null, null, null, null, null] +635 - Tea stall - [null, Steal-from, null, null, null] +636 - Buffers - [null, null, null, null, null] +637 - Mine cart - [null, null, null, null, null] +638 - null - [null, null, null, null, null] +639 - null - [null, null, null, null, null] +640 - null - [null, null, null, null, null] +641 - null - [null, null, null, null, null] +642 - null - [null, null, null, null, null] +643 - null - [null, null, null, null, null] +644 - null - [null, null, null, null, null] +645 - null - [null, null, null, null, null] +646 - null - [null, null, null, null, null] +647 - Rack - [null, null, null, null, null] +648 - Stocks - [null, null, null, null, null] +649 - Gallows - [null, null, null, null, null] +650 - null - [null, null, null, null, null] +651 - Buried skeleton - [Search, null, null, null, null] +652 - null - [null, null, null, null, null] +653 - null - [null, null, null, null, null] +654 - null - [null, null, null, null, null] +655 - null - [null, null, null, null, null] +656 - null - [null, null, null, null, null] +657 - null - [null, null, null, null, null] +658 - Pile of skulls - [null, null, null, null, null] +659 - Charred bones - [null, null, null, null, null] +660 - Corpse - [null, null, null, null, null] +661 - Corpse - [null, null, null, null, null] +662 - Corpse - [null, null, null, null, null] +663 - Corpse - [null, null, null, null, null] +664 - Corpse - [null, null, null, null, null] +665 - Corpse - [null, null, null, null, null] +666 - Corpse - [null, null, null, null, null] +667 - Corpse - [null, null, null, null, null] +668 - Pile of skulls - [null, null, null, null, null] +669 - null - [null, null, null, null, null] +670 - null - [null, null, null, null, null] +671 - Catapult - [null, null, null, null, null] +672 - Broken barrel - [null, null, null, null, null] +673 - null - [null, null, null, null, null] +674 - null - [null, null, null, null, null] +675 - null - [null, null, null, null, null] +676 - null - [null, null, null, null, null] +677 - null - [null, null, null, null, null] +678 - Fishing spot - [null, null, null, null, null] +679 - Fishing spot - [null, null, null, null, null] +680 - Piano - [null, null, null, null, null] +681 - Piano - [null, null, null, null, null] +682 - Piano stool - [null, null, null, null, null] +683 - Grandfather clock - [null, null, null, null, null] +684 - Swamp bubbles - [null, null, null, null, null] +685 - Weather vane - [null, null, null, null, null] +686 - null - [null, null, null, null, null] +687 - null - [null, null, null, null, null] +688 - null - [null, null, null, null, null] +689 - Mirror - [null, null, null, null, null] +690 - Bath screen - [null, null, null, null, null] +691 - Screen - [null, null, null, null, null] +692 - Cauldron - [null, null, null, null, null] +693 - Broom - [null, null, null, null, null] +694 - Clothes model - [null, null, null, null, null] +695 - Clothes model - [null, null, null, null, null] +696 - Hole - [null, null, null, null, null] +697 - Animal skull - [null, null, null, null, null] +698 - Big egg - [null, null, null, null, null] +699 - Carcass - [null, null, null, null, null] +700 - Curved bone - [null, null, null, null, null] +701 - Curved bone - [null, null, null, null, null] +702 - Large bone - [null, null, null, null, null] +703 - Large bone - [null, null, null, null, null] +704 - null - [null, null, null, null, null] +705 - null - [null, null, null, null, null] +706 - null - [null, null, null, null, null] +707 - Bell - [null, null, null, null, null] +708 - Bell mechanism - [null, null, null, null, null] +709 - Bell rope - [null, null, null, null, null] +710 - Hole in wall - [null, null, null, null, null] +711 - Crystal cluster - [null, null, null, null, null] +712 - Crystal cluster - [null, null, null, null, null] +713 - Crystal cluster - [null, null, null, null, null] +714 - Fire remains - [null, null, null, null, null] +715 - null - [null, null, null, null, null] +716 - null - [null, null, null, null, null] +717 - null - [null, null, null, null, null] +718 - Barrel - [null, null, null, null, null] +719 - null - [null, null, null, null, null] +720 - null - [null, null, null, null, null] +721 - null - [null, null, null, null, null] +722 - null - [null, null, null, null, null] +723 - Buried skeleton - [Search, null, null, null, null] +724 - Standing torch - [null, null, null, null, null] +725 - null - [null, null, null, null, null] +726 - null - [null, null, null, null, null] +727 - Cave web - [null, null, null, null, null] +728 - null - [null, null, null, null, null] +729 - null - [null, null, null, null, null] +730 - null - [null, null, null, null, null] +731 - null - [null, null, null, null, null] +732 - null - [null, null, null, null, null] +733 - Web - [Slash, null, null, null, null] +734 - Slashed web - [null, null, null, null, null] +735 - Swamp bubbles - [null, null, null, null, null] +736 - Animal skull - [null, null, null, null, null] +737 - Carcass - [null, null, null, null, null] +738 - null - [null, null, null, null, null] +739 - null - [null, null, null, null, null] +740 - null - [null, null, null, null, null] +741 - Broken ladder - [null, null, null, null, null] +742 - null - [null, null, null, null, null] +743 - Ladder - [null, null, null, null, null] +744 - Scaffold - [null, null, null, null, null] +745 - null - [null, null, null, null, null] +746 - null - [null, null, null, null, null] +747 - null - [null, null, null, null, null] +748 - Cave entrance - [null, null, null, null, null] +749 - null - [null, null, null, null, null] +750 - null - [null, null, null, null, null] +751 - null - [null, null, null, null, null] +752 - null - [null, null, null, null, null] +753 - null - [null, null, null, null, null] +754 - null - [null, null, null, null, null] +755 - null - [null, null, null, null, null] +756 - null - [null, null, null, null, null] +757 - null - [null, null, null, null, null] +758 - null - [null, null, null, null, null] +759 - null - [null, null, null, null, null] +760 - null - [null, null, null, null, null] +761 - null - [null, null, null, null, null] +762 - null - [null, null, null, null, null] +763 - null - [null, null, null, null, null] +764 - null - [null, null, null, null, null] +765 - null - [null, null, null, null, null] +766 - null - [null, null, null, null, null] +767 - null - [null, null, null, null, null] +768 - null - [null, null, null, null, null] +769 - null - [null, null, null, null, null] +770 - null - [null, null, null, null, null] +771 - null - [null, null, null, null, null] +772 - null - [null, null, null, null, null] +773 - null - [null, null, null, null, null] +774 - null - [null, null, null, null, null] +775 - null - [null, null, null, null, null] +776 - null - [null, null, null, null, null] +777 - null - [null, null, null, null, null] +778 - null - [null, null, null, null, null] +779 - Bamboo Door - [Open, null, null, null, null] +780 - null - [null, null, null, null, null] +781 - null - [null, null, null, null, null] +782 - null - [null, null, null, null, null] +783 - null - [null, null, null, null, null] +784 - null - [null, null, null, null, null] +785 - null - [null, null, null, null, null] +786 - null - [null, null, null, null, null] +787 - Loom - [null, Weave, null, null, null] +788 - City Gate - [Enter, null, null, null, null] +789 - City Gate - [Enter, null, null, null, null] +790 - null - [null, null, null, null, null] +791 - null - [null, null, null, null, null] +792 - null - [null, null, null, null, null] +793 - null - [null, null, null, null, null] +794 - null - [null, null, null, null, null] +795 - null - [null, null, null, null, null] +796 - null - [null, null, null, null, null] +797 - null - [null, null, null, null, null] +798 - null - [null, null, null, null, null] +799 - null - [null, null, null, null, null] +800 - null - [null, null, null, null, null] +801 - null - [null, null, null, null, null] +802 - null - [null, null, null, null, null] +803 - null - [null, null, null, null, null] +804 - null - [null, null, null, null, null] +805 - null - [null, null, null, null, null] +806 - null - [null, null, null, null, null] +807 - null - [null, null, null, null, null] +808 - null - [null, null, null, null, null] +809 - null - [null, null, null, null, null] +810 - null - [null, null, null, null, null] +811 - null - [null, null, null, null, null] +812 - null - [null, null, null, null, null] +813 - null - [null, null, null, null, null] +814 - null - [null, null, null, null, null] +815 - null - [null, null, null, null, null] +816 - null - [null, null, null, null, null] +817 - Suit of armour - [null, null, null, null, null] +818 - Suit of armour - [null, null, null, null, null] +819 - Suit of armour - [null, null, null, null, null] +820 - Suit of armour - [null, null, null, null, null] +821 - Cannon - [null, null, null, null, null] +822 - Cannonballs - [null, null, null, null, null] +823 - Dummy - [null, Attack, null, null, null] +824 - Wooden defence - [null, null, null, null, null] +825 - null - [null, null, null, null, null] +826 - null - [null, null, null, null, null] +827 - null - [null, null, null, null, null] +828 - null - [null, null, null, null, null] +829 - Target - [null, null, null, null, null] +830 - null - [null, null, null, null, null] +831 - null - [null, null, null, null, null] +832 - null - [null, null, null, null, null] +833 - null - [null, null, null, null, null] +834 - Sword cabinet - [null, null, null, null, null] +835 - Sword cabinet - [null, null, null, null, null] +836 - Bow cabinet - [null, null, null, null, null] +837 - Axe cabinet - [null, null, null, null, null] +838 - Axe cabinet - [null, null, null, null, null] +839 - Bow cabinet - [null, null, null, null, null] +840 - null - [null, null, null, null, null] +841 - null - [null, null, null, null, null] +842 - null - [null, null, null, null, null] +843 - null - [null, null, null, null, null] +844 - null - [null, null, null, null, null] +845 - null - [null, null, null, null, null] +846 - null - [null, null, null, null, null] +847 - null - [null, null, null, null, null] +848 - Spear wall - [null, null, null, null, null] +849 - Spear wall - [null, null, null, null, null] +850 - Helmet rack - [null, null, null, null, null] +851 - Standard - [null, null, null, null, null] +852 - Standard - [null, null, null, null, null] +853 - Standard - [null, null, null, null, null] +854 - Standard - [null, null, null, null, null] +855 - Standard - [null, null, null, null, null] +856 - Standard - [null, null, null, null, null] +857 - Standard - [null, null, null, null, null] +858 - Standard - [null, null, null, null, null] +859 - Standard - [null, null, null, null, null] +860 - Flagpole - [null, null, null, null, null] +861 - Flagpole - [null, null, null, null, null] +862 - Flagpole - [null, null, null, null, null] +863 - Standard - [null, null, null, null, null] +864 - Standard - [null, null, null, null, null] +865 - Standard - [null, null, null, null, null] +866 - Standard - [null, null, null, null, null] +867 - Standard - [null, null, null, null, null] +868 - Standard - [null, null, null, null, null] +869 - Flagpole - [null, null, null, null, null] +870 - Totem Pole - [null, null, null, null, null] +871 - Bath pipes - [null, null, null, null, null] +872 - Large sewer pipe - [null, null, null, null, null] +873 - Sink - [null, null, null, null, null] +874 - Sink - [null, null, null, null, null] +875 - Bath - [null, null, null, null, null] +876 - null - [null, null, null, null, null] +877 - null - [null, null, null, null, null] +878 - Well - [null, null, null, null, null] +879 - Fountain - [null, null, null, null, null] +880 - Fountain - [null, null, null, null, null] +881 - Manhole - [Open, null, null, null, null] +882 - Manhole - [Climb-down, Close, null, null, null] +883 - Gate - [Open, null, null, null, null] +884 - Well - [null, null, null, null, null] +885 - Bar pumps - [null, null, null, null, null] +886 - Bar pumps - [null, null, null, null, null] +887 - Portrait - [null, null, null, null, null] +888 - Painting - [null, null, null, null, null] +889 - Painting - [null, null, null, null, null] +890 - Portrait - [null, null, null, null, null] +891 - Landscape - [null, null, null, null, null] +892 - Painting - [null, null, null, null, null] +893 - Painting - [null, null, null, null, null] +894 - Landscape - [null, null, null, null, null] +895 - Painting - [null, null, null, null, null] +896 - Star chart - [null, null, null, null, null] +897 - Star chart - [null, null, null, null, null] +898 - Cross - [null, null, null, null, null] +899 - Hanging banner - [null, null, null, null, null] +900 - Hanging banner - [null, null, null, null, null] +901 - Hanging banner - [null, null, null, null, null] +902 - Hanging banner - [null, null, null, null, null] +903 - Unicorn's head - [null, null, null, null, null] +904 - Dragon's head - [null, null, null, null, null] +905 - Dragon's head - [null, null, null, null, null] +906 - Bull's head - [null, null, null, null, null] +907 - Charms - [null, null, null, null, null] +908 - Magical symbol - [null, null, null, null, null] +909 - Plaque - [null, null, null, null, null] +910 - Evil eye decoration - [null, null, null, null, null] +911 - Glyphs - [null, null, null, null, null] +912 - null - [null, null, null, null, null] +913 - null - [null, null, null, null, null] +914 - null - [null, null, null, null, null] +915 - Font - [null, null, null, null, null] +916 - null - [null, null, null, null, null] +917 - null - [null, null, null, null, null] +918 - null - [null, null, null, null, null] +919 - null - [null, null, null, null, null] +920 - null - [null, null, null, null, null] +921 - null - [null, null, null, null, null] +922 - null - [null, null, null, null, null] +923 - null - [null, null, null, null, null] +924 - null - [null, null, null, null, null] +925 - null - [null, null, null, null, null] +926 - null - [null, null, null, null, null] +927 - null - [null, null, null, null, null] +928 - null - [null, null, null, null, null] +929 - null - [null, null, null, null, null] +930 - null - [null, null, null, null, null] +931 - null - [null, null, null, null, null] +932 - null - [null, null, null, null, null] +933 - null - [null, null, null, null, null] +934 - null - [null, null, null, null, null] +935 - null - [null, null, null, null, null] +936 - null - [null, null, null, null, null] +937 - null - [null, null, null, null, null] +938 - null - [null, null, null, null, null] +939 - null - [null, null, null, null, null] +940 - null - [null, null, null, null, null] +941 - null - [null, null, null, null, null] +942 - null - [null, null, null, null, null] +943 - null - [null, null, null, null, null] +944 - null - [null, null, null, null, null] +945 - null - [null, null, null, null, null] +946 - null - [null, null, null, null, null] +947 - null - [null, null, null, null, null] +948 - null - [null, null, null, null, null] +949 - null - [null, null, null, null, null] +950 - null - [null, null, null, null, null] +951 - null - [null, null, null, null, null] +952 - null - [null, null, null, null, null] +953 - null - [null, null, null, null, null] +954 - null - [null, null, null, null, null] +955 - Spooky picture - [null, null, null, null, null] +956 - null - [null, null, null, null, null] +957 - null - [null, null, null, null, null] +958 - null - [null, null, null, null, null] +959 - Clock face - [null, null, null, null, null] +960 - Clock face - [null, null, null, null, null] +961 - Bank notice board - [null, null, null, null, null] +962 - Noticeboard - [null, null, null, null, null] +963 - Clothes equipment - [null, null, null, null, null] +964 - Stuffed swordfish - [null, null, null, null, null] +965 - Stuffed swordfish - [null, null, null, null, null] +966 - Jolly Roger - [null, null, null, null, null] +967 - Hanging wheel - [null, null, null, null, null] +968 - Pirate map - [null, null, null, null, null] +969 - Fishing net - [null, null, null, null, null] +970 - Plaque - [Read, null, null, null, null] +971 - Bow and Arrow - [null, null, null, null, null] +972 - Arrows - [null, null, null, null, null] +973 - Javelin - [null, null, null, null, null] +974 - Studded Leather - [null, null, null, null, null] +975 - Dragonhide Leather - [null, null, null, null, null] +976 - null - [null, null, null, null, null] +977 - null - [null, null, null, null, null] +978 - null - [null, null, null, null, null] +979 - null - [null, null, null, null, null] +980 - null - [null, null, null, null, null] +981 - null - [null, null, null, null, null] +982 - null - [null, null, null, null, null] +983 - null - [null, null, null, null, null] +984 - null - [null, null, null, null, null] +985 - null - [null, null, null, null, null] +986 - null - [null, null, null, null, null] +987 - null - [null, null, null, null, null] +988 - null - [null, null, null, null, null] +989 - null - [null, null, null, null, null] +990 - null - [null, null, null, null, null] +991 - null - [null, null, null, null, null] +992 - null - [null, null, null, null, null] +993 - Stile - [Climb-over, null, null, null, null] +994 - null - [null, null, null, null, null] +995 - null - [null, null, null, null, null] +996 - null - [null, null, null, null, null] +997 - null - [null, null, null, null, null] +998 - null - [null, null, null, null, null] +999 - null - [null, null, null, null, null] +1000 - null - [null, null, null, null, null] +1001 - null - [null, null, null, null, null] +1002 - null - [null, null, null, null, null] +1003 - null - [null, null, null, null, null] +1004 - Broken Railing - [null, null, null, null, null] +1005 - Broken Railing - [null, null, null, null, null] +1006 - Broken Railing - [null, null, null, null, null] +1007 - null - [null, null, null, null, null] +1008 - null - [null, null, null, null, null] +1009 - null - [null, null, null, null, null] +1010 - Shelves - [null, null, null, null, null] +1011 - Shelves - [null, null, null, null, null] +1012 - Shelves - [null, null, null, null, null] +1013 - Cooking shelves - [null, null, null, null, null] +1014 - Shelves - [null, null, null, null, null] +1015 - Shelves - [null, null, null, null, null] +1016 - Shelves - [null, null, null, null, null] +1017 - Shelves - [null, null, null, null, null] +1018 - Shelves - [null, null, null, null, null] +1019 - Shelf - [null, null, null, null, null] +1020 - Shelf - [null, null, null, null, null] +1021 - Shelf - [null, null, null, null, null] +1022 - null - [null, null, null, null, null] +1023 - null - [null, null, null, null, null] +1024 - Shelves - [null, null, null, null, null] +1025 - Clothing shelves - [null, null, null, null, null] +1026 - null - [null, null, null, null, null] +1027 - Tanning line - [null, null, null, null, null] +1028 - Vat - [null, null, null, null, null] +1029 - Vat - [null, null, null, null, null] +1030 - Mangle - [null, null, null, null, null] +1031 - Mangle - [null, null, null, null, null] +1032 - Danger sign - [null, null, null, null, null] +1033 - Signpost - [null, null, null, null, null] +1034 - Signpost - [null, null, null, null, null] +1035 - Signpost - [null, null, null, null, null] +1036 - null - [null, null, null, null, null] +1037 - null - [null, null, null, null, null] +1038 - null - [null, null, null, null, null] +1039 - null - [null, null, null, null, null] +1040 - null - [null, null, null, null, null] +1041 - null - [null, null, null, null, null] +1042 - null - [null, null, null, null, null] +1043 - null - [null, null, null, null, null] +1044 - null - [null, null, null, null, null] +1045 - null - [null, null, null, null, null] +1046 - null - [null, null, null, null, null] +1047 - null - [null, null, null, null, null] +1048 - null - [null, null, null, null, null] +1049 - null - [null, null, null, null, null] +1050 - null - [null, null, null, null, null] +1051 - null - [null, null, null, null, null] +1052 - null - [null, null, null, null, null] +1053 - null - [null, null, null, null, null] +1054 - null - [null, null, null, null, null] +1055 - null - [null, null, null, null, null] +1056 - null - [null, null, null, null, null] +1057 - Sign - [null, null, null, null, null] +1058 - null - [null, null, null, null, null] +1059 - null - [null, null, null, null, null] +1060 - null - [null, null, null, null, null] +1061 - null - [null, null, null, null, null] +1062 - null - [null, null, null, null, null] +1063 - null - [null, null, null, null, null] +1064 - null - [null, null, null, null, null] +1065 - null - [null, null, null, null, null] +1066 - null - [null, null, null, null, null] +1067 - null - [null, null, null, null, null] +1068 - Sign - [null, null, null, null, null] +1069 - Sign - [null, null, null, null, null] +1070 - Sign - [null, null, null, null, null] +1071 - Sign - [null, null, null, null, null] +1072 - Sign - [null, null, null, null, null] +1073 - Sign - [null, null, null, null, null] +1074 - Sign - [null, null, null, null, null] +1075 - Sign - [null, null, null, null, null] +1076 - Sign - [null, null, null, null, null] +1077 - Sign - [null, null, null, null, null] +1078 - Sign - [null, null, null, null, null] +1079 - Signpost - [null, null, null, null, null] +1080 - Signpost - [null, null, null, null, null] +1081 - Signpost - [null, null, null, null, null] +1082 - Signpost - [null, null, null, null, null] +1083 - Signpost - [null, null, null, null, null] +1084 - Signpost - [null, null, null, null, null] +1085 - Signpost - [null, null, null, null, null] +1086 - Signpost - [null, null, null, null, null] +1087 - Signpost - [null, null, null, null, null] +1088 - Chair - [null, null, null, null, null] +1089 - Smashed chair - [null, null, null, null, null] +1090 - Chair - [null, null, null, null, null] +1091 - Chair - [null, null, null, null, null] +1092 - Chair - [null, null, null, null, null] +1093 - Chair - [null, null, null, null, null] +1094 - Chair - [null, null, null, null, null] +1095 - Stool - [null, null, null, null, null] +1096 - Rocking chair - [null, null, null, null, null] +1097 - Throne - [null, null, null, null, null] +1098 - Throne - [null, null, null, null, null] +1099 - Throne - [null, null, null, null, null] +1100 - Barstool - [null, null, null, null, null] +1101 - Chair - [null, null, null, null, null] +1102 - Stool - [null, null, null, null, null] +1103 - Stool - [null, null, null, null, null] +1104 - Bench - [null, null, null, null, null] +1105 - Throne - [null, null, null, null, null] +1106 - Bench - [null, null, null, null, null] +1107 - null - [null, null, null, null, null] +1108 - Throne - [null, null, null, null, null] +1109 - Throne - [null, null, null, null, null] +1110 - Chair - [null, null, null, null, null] +1111 - Chair - [null, null, null, null, null] +1112 - Pew - [null, null, null, null, null] +1113 - Stool - [null, null, null, null, null] +1114 - Ice Throne - [null, null, null, null, null] +1115 - Chair - [null, null, null, null, null] +1116 - Hedge - [null, null, null, null, null] +1117 - Hedge - [null, null, null, null, null] +1118 - Bush - [null, null, null, null, null] +1119 - Bush - [null, null, null, null, null] +1120 - Bush - [null, null, null, null, null] +1121 - Bush - [null, null, null, null, null] +1122 - Bush - [null, null, null, null, null] +1123 - Bush - [null, null, null, null, null] +1124 - Bush - [null, null, null, null, null] +1125 - Bush - [null, null, null, null, null] +1126 - Rosebush - [null, null, null, null, null] +1127 - null - [null, null, null, null, null] +1128 - null - [null, null, null, null, null] +1129 - null - [null, null, null, null, null] +1130 - null - [null, null, null, null, null] +1131 - null - [null, null, null, null, null] +1132 - null - [null, null, null, null, null] +1133 - null - [null, null, null, null, null] +1134 - null - [null, null, null, null, null] +1135 - null - [null, null, null, null, null] +1136 - null - [null, null, null, null, null] +1137 - null - [null, null, null, null, null] +1138 - null - [null, null, null, null, null] +1139 - null - [null, null, null, null, null] +1140 - null - [null, null, null, null, null] +1141 - null - [null, null, null, null, null] +1142 - null - [null, null, null, null, null] +1143 - null - [null, null, null, null, null] +1144 - null - [null, null, null, null, null] +1145 - null - [null, null, null, null, null] +1146 - null - [null, null, null, null, null] +1147 - Fairy house - [null, null, null, null, null] +1148 - Fairy house - [null, null, null, null, null] +1149 - Fairy house - [null, null, null, null, null] +1150 - Fairy bank - [null, null, null, null, null] +1151 - Fairy market stall - [null, null, null, null, null] +1152 - Potted fern - [null, null, null, null, null] +1153 - Potted fern - [null, null, null, null, null] +1154 - Potted fern - [null, null, null, null, null] +1155 - Potted fern - [null, null, null, null, null] +1156 - Potted flower - [null, null, null, null, null] +1157 - Potted flower - [null, null, null, null, null] +1158 - Potted plant - [null, null, null, null, null] +1159 - null - [null, null, null, null, null] +1160 - Potted plant - [null, null, null, null, null] +1161 - Cabbage - [null, Pick, null, null, null] +1162 - Bullrushes - [null, null, null, null, null] +1163 - Mushroom - [null, null, null, null, null] +1164 - Mushroom - [null, null, null, null, null] +1165 - Mushroom - [null, null, null, null, null] +1166 - Mushrooms - [null, null, null, null, null] +1167 - Mushroom - [null, null, null, null, null] +1168 - Mushrooms - [null, null, null, null, null] +1169 - Mushroom - [null, null, null, null, null] +1170 - Fungus - [null, null, null, null, null] +1171 - Fungus - [null, null, null, null, null] +1172 - Fungus - [null, null, null, null, null] +1173 - Small fern - [null, null, null, null, null] +1174 - Thistle - [null, null, null, null, null] +1175 - Waterlily - [null, null, null, null, null] +1176 - Waterlily - [null, null, null, null, null] +1177 - Waterlily - [null, null, null, null, null] +1178 - Heather - [null, null, null, null, null] +1179 - Heather - [null, null, null, null, null] +1180 - Heather - [null, null, null, null, null] +1181 - Nettles - [Pick, null, null, null, null] +1182 - null - [null, null, null, null, null] +1183 - null - [null, null, null, null, null] +1184 - Creeping plant - [null, null, null, null, null] +1185 - Rockery - [null, null, null, null, null] +1186 - Curling plant - [null, null, null, null, null] +1187 - Flower - [null, null, null, null, null] +1188 - Flower - [null, null, null, null, null] +1189 - Daisies - [null, null, null, null, null] +1190 - Sunflower - [null, null, null, null, null] +1191 - Sunflowers - [null, null, null, null, null] +1192 - Flowers - [null, null, null, null, null] +1193 - Flowers - [null, null, null, null, null] +1194 - Tulips - [null, null, null, null, null] +1195 - Flowers - [null, null, null, null, null] +1196 - Flowers - [null, null, null, null, null] +1197 - Flower - [null, null, null, null, null] +1198 - Flowers - [null, null, null, null, null] +1199 - Flowerbed - [null, null, null, null, null] +1200 - Flowerbed - [null, null, null, null, null] +1201 - Flowerbed - [null, null, null, null, null] +1202 - Jungle flower - [null, null, null, null, null] +1203 - Orchid - [null, null, null, null, null] +1204 - Jungle plant - [null, null, null, null, null] +1205 - Vine - [null, null, null, null, null] +1206 - Vine - [null, null, null, null, null] +1207 - Vine - [null, null, null, null, null] +1208 - Vine - [null, null, null, null, null] +1209 - null - [null, null, null, null, null] +1210 - null - [null, null, null, null, null] +1211 - null - [null, null, null, null, null] +1212 - null - [null, null, null, null, null] +1213 - null - [null, null, null, null, null] +1214 - null - [null, null, null, null, null] +1215 - null - [null, null, null, null, null] +1216 - null - [null, null, null, null, null] +1217 - null - [null, null, null, null, null] +1218 - null - [null, null, null, null, null] +1219 - null - [null, null, null, null, null] +1220 - null - [null, null, null, null, null] +1221 - null - [null, null, null, null, null] +1222 - null - [null, null, null, null, null] +1223 - null - [null, null, null, null, null] +1224 - null - [null, null, null, null, null] +1225 - null - [null, null, null, null, null] +1226 - null - [null, null, null, null, null] +1227 - null - [null, null, null, null, null] +1228 - null - [null, null, null, null, null] +1229 - null - [null, null, null, null, null] +1230 - null - [null, null, null, null, null] +1231 - Vine - [null, null, null, null, null] +1232 - null - [null, null, null, null, null] +1233 - null - [null, null, null, null, null] +1234 - null - [null, null, null, null, null] +1235 - null - [null, null, null, null, null] +1236 - null - [null, null, null, null, null] +1237 - null - [null, null, null, null, null] +1238 - null - [null, null, null, null, null] +1239 - null - [null, null, null, null, null] +1240 - null - [null, null, null, null, null] +1241 - null - [null, null, null, null, null] +1242 - null - [null, null, null, null, null] +1243 - null - [null, null, null, null, null] +1244 - null - [null, null, null, null, null] +1245 - null - [null, null, null, null, null] +1246 - null - [null, null, null, null, null] +1247 - null - [null, null, null, null, null] +1248 - null - [null, null, null, null, null] +1249 - null - [null, null, null, null, null] +1250 - null - [null, null, null, null, null] +1251 - null - [null, null, null, null, null] +1252 - null - [null, null, null, null, null] +1253 - null - [null, null, null, null, null] +1254 - null - [null, null, null, null, null] +1255 - null - [null, null, null, null, null] +1256 - null - [null, null, null, null, null] +1257 - null - [null, null, null, null, null] +1258 - null - [null, null, null, null, null] +1259 - null - [null, null, null, null, null] +1260 - null - [null, null, null, null, null] +1261 - null - [null, null, null, null, null] +1262 - null - [null, null, null, null, null] +1263 - null - [null, null, null, null, null] +1264 - null - [null, null, null, null, null] +1265 - null - [null, null, null, null, null] +1266 - null - [null, null, null, null, null] +1267 - null - [null, null, null, null, null] +1268 - null - [null, null, null, null, null] +1269 - null - [null, null, null, null, null] +1270 - null - [null, null, null, null, null] +1271 - null - [null, null, null, null, null] +1272 - null - [null, null, null, null, null] +1273 - null - [null, null, null, null, null] +1274 - null - [null, null, null, null, null] +1275 - null - [null, null, null, null, null] +1276 - Tree - [Chop down, null, hidden, null, null] +1277 - Tree - [Chop down, null, hidden, null, null] +1278 - Tree - [Chop down, null, hidden, null, null] +1279 - Tree - [Chop down, null, hidden, null, null] +1280 - Tree - [Chop down, null, hidden, null, null] +1281 - Oak - [Chop down, null, hidden, null, null] +1282 - Dead tree - [Chop down, null, hidden, null, null] +1283 - Dead tree - [Chop down, null, hidden, null, null] +1284 - Dead tree - [Chop down, null, hidden, null, null] +1285 - Dead tree - [Chop down, null, hidden, null, null] +1286 - Dead tree - [Chop down, null, hidden, null, null] +1287 - Dead tree - [null, null, null, null, null] +1288 - Dead tree - [null, null, null, null, null] +1289 - Dead tree - [Chop down, null, hidden, null, null] +1290 - Dead tree - [Chop down, null, hidden, null, null] +1291 - Dead tree - [Chop down, null, hidden, null, null] +1292 - Dramen tree - [Chop down, null, hidden, null, null] +1293 - Spirit tree - [Talk-to, Teleport, null, null, null] +1294 - Spirit tree - [Talk-to, Teleport, null, null, null] +1295 - Spirit tree - [Talk-to, Teleport, null, null, null] +1296 - Fallen tree - [null, null, null, null, null] +1297 - Fallen tree - [null, null, null, null, null] +1298 - Fern - [null, null, null, null, null] +1299 - Fern - [null, null, null, null, null] +1300 - Fern - [null, null, null, null, null] +1301 - Tree - [null, null, null, null, null] +1302 - Leafy tree - [null, null, null, null, null] +1303 - Tree - [null, null, null, null, null] +1304 - Tree - [null, null, null, null, null] +1305 - Tree - [null, null, null, null, null] +1306 - Magic tree - [Chop down, null, hidden, null, null] +1307 - Maple tree - [Chop down, null, hidden, null, null] +1308 - Willow - [Chop down, null, hidden, null, null] +1309 - Yew - [Chop down, null, hidden, null, null] +1310 - Tree - [null, null, null, null, null] +1311 - Palm - [null, null, null, null, null] +1312 - Palm - [null, null, null, null, null] +1313 - Plant - [null, null, null, null, null] +1314 - Plant - [null, null, null, null, null] +1315 - Evergreen - [Chop down, null, hidden, null, null] +1316 - Evergreen - [Chop down, null, hidden, null, null] +1317 - Spirit tree - [Talk-to, Teleport, null, null, null] +1318 - Evergreen - [Chop down, null, hidden, null, null] +1319 - Evergreen - [Chop down, null, hidden, null, null] +1320 - Mossy branch - [null, null, null, null, null] +1321 - Mossy branch - [null, null, null, null, null] +1322 - Hollow tree - [null, null, null, null, null] +1323 - Roots - [null, null, null, null, null] +1324 - Roots - [null, null, null, null, null] +1325 - Roots - [null, null, null, null, null] +1326 - Tropical tree - [null, null, null, null, null] +1327 - Tropical tree - [null, null, null, null, null] +1328 - Tropical tree - [null, null, null, null, null] +1329 - Tropical leaves - [null, null, null, null, null] +1330 - Tree - [Chop down, null, hidden, null, null] +1331 - Tree - [Chop down, null, hidden, null, null] +1332 - Tree - [Chop down, null, hidden, null, null] +1333 - Dead tree - [null, null, null, null, null] +1334 - Hollow log - [null, null, null, null, null] +1335 - Hollow log - [null, null, null, null, null] +1336 - Hollow log - [null, null, null, null, null] +1337 - Hollow log - [null, null, null, null, null] +1338 - Hollow log - [null, null, null, null, null] +1339 - Roots - [null, null, null, null, null] +1340 - Roots - [null, null, null, null, null] +1341 - Tree stump - [null, null, null, null, null] +1342 - Tree stump - [null, null, null, null, null] +1343 - Tree stump - [null, null, null, null, null] +1344 - Tree stump - [null, null, null, null, null] +1345 - Tree stump - [null, null, null, null, null] +1346 - Tree stump - [null, null, null, null, null] +1347 - Tree stump - [null, null, null, null, null] +1348 - Tree stump - [null, null, null, null, null] +1349 - Tree stump - [null, null, null, null, null] +1350 - Tree stump - [null, null, null, null, null] +1351 - Tree stump - [null, null, null, null, null] +1352 - Tree stump - [null, null, null, null, null] +1353 - Tree stump - [null, null, null, null, null] +1354 - Tree stump - [null, null, null, null, null] +1355 - Tree stump - [null, null, null, null, null] +1356 - Tree stump - [null, null, null, null, null] +1357 - Tree stump - [null, null, null, null, null] +1358 - Tree stump - [null, null, null, null, null] +1359 - Tree stump - [null, null, null, null, null] +1360 - Tropical tree - [null, null, null, null, null] +1361 - Tropical tree - [null, null, null, null, null] +1362 - Tropical tree - [null, null, null, null, null] +1363 - Roots - [null, null, null, null, null] +1364 - Roots - [null, null, null, null, null] +1365 - Dead tree - [Chop down, null, hidden, null, null] +1366 - Roots - [null, null, null, null, null] +1367 - Roots - [null, null, null, null, null] +1368 - Roots - [null, null, null, null, null] +1369 - Plant - [null, null, null, null, null] +1370 - Hollow log - [null, null, null, null, null] +1371 - Tropical tree - [null, null, null, null, null] +1372 - Tropical tree - [null, null, null, null, null] +1373 - Tropical tree - [null, null, null, null, null] +1374 - Tropical tree - [null, null, null, null, null] +1375 - Tropical tree - [null, null, null, null, null] +1376 - Tropical tree - [null, null, null, null, null] +1377 - Tropical tree - [null, null, null, null, null] +1378 - Hollow log - [null, null, null, null, null] +1379 - Hollow log - [null, null, null, null, null] +1380 - Roots - [null, null, null, null, null] +1381 - Roots - [null, null, null, null, null] +1382 - Roots - [null, null, null, null, null] +1383 - Dead tree - [Chop down, null, hidden, null, null] +1384 - Dead tree - [Chop down, null, hidden, null, null] +1385 - null - [null, null, null, null, null] +1386 - Roots - [null, null, null, null, null] +1387 - Roots - [null, null, null, null, null] +1388 - Roots - [null, null, null, null, null] +1389 - Roots - [null, null, null, null, null] +1390 - Jungle plant - [null, null, null, null, null] +1391 - Plant - [null, null, null, null, null] +1392 - Plant - [null, null, null, null, null] +1393 - Plant - [null, null, null, null, null] +1394 - Plant - [null, null, null, null, null] +1395 - Fly trap - [null, null, null, null, null] +1396 - Cactus - [null, null, null, null, null] +1397 - Cactus - [null, null, null, null, null] +1398 - Jungle plant - [null, null, null, null, null] +1399 - Jungle plant - [null, null, null, null, null] +1400 - Jungle plant - [null, null, null, null, null] +1401 - Jungle plant - [null, null, null, null, null] +1402 - Jungle plant - [null, null, null, null, null] +1403 - Cactus - [null, null, null, null, null] +1404 - Cactus - [null, null, null, null, null] +1405 - Cactus - [null, null, null, null, null] +1406 - Cactus - [null, null, null, null, null] +1407 - Whipping Plant - [null, null, null, null, null] +1408 - Pineapple Plant - [Pick, null, null, null, null] +1409 - Pineapple Plant - [Pick, null, null, null, null] +1410 - Pineapple Plant - [Pick, null, null, null, null] +1411 - Pineapple Plant - [Pick, null, null, null, null] +1412 - Pineapple Plant - [Pick, null, null, null, null] +1413 - Pineapple Plant - [Pick, null, null, null, null] +1414 - null - [null, null, null, null, null] +1415 - null - [null, null, null, null, null] +1416 - null - [null, null, null, null, null] +1417 - null - [null, null, null, null, null] +1418 - null - [null, null, null, null, null] +1419 - null - [null, null, null, null, null] +1420 - null - [null, null, null, null, null] +1421 - null - [null, null, null, null, null] +1422 - null - [null, null, null, null, null] +1423 - null - [null, null, null, null, null] +1424 - null - [null, null, null, null, null] +1425 - null - [null, null, null, null, null] +1426 - null - [null, null, null, null, null] +1427 - null - [null, null, null, null, null] +1428 - null - [null, null, null, null, null] +1429 - null - [null, null, null, null, null] +1430 - null - [null, null, null, null, null] +1431 - null - [null, null, null, null, null] +1432 - null - [null, null, null, null, null] +1433 - null - [null, null, null, null, null] +1434 - null - [null, null, null, null, null] +1435 - null - [null, null, null, null, null] +1436 - null - [null, null, null, null, null] +1437 - null - [null, null, null, null, null] +1438 - null - [null, null, null, null, null] +1439 - null - [null, null, null, null, null] +1440 - null - [null, null, null, null, null] +1441 - null - [null, null, null, null, null] +1442 - null - [null, null, null, null, null] +1443 - null - [null, null, null, null, null] +1444 - null - [null, null, null, null, null] +1445 - null - [null, null, null, null, null] +1446 - null - [null, null, null, null, null] +1447 - null - [null, null, null, null, null] +1448 - null - [null, null, null, null, null] +1449 - null - [null, null, null, null, null] +1450 - null - [null, null, null, null, null] +1451 - null - [null, null, null, null, null] +1452 - null - [null, null, null, null, null] +1453 - null - [null, null, null, null, null] +1454 - null - [null, null, null, null, null] +1455 - null - [null, null, null, null, null] +1456 - null - [null, null, null, null, null] +1457 - null - [null, null, null, null, null] +1458 - null - [null, null, null, null, null] +1459 - null - [null, null, null, null, null] +1460 - null - [null, null, null, null, null] +1461 - null - [null, null, null, null, null] +1462 - null - [null, null, null, null, null] +1463 - null - [null, null, null, null, null] +1464 - null - [null, null, null, null, null] +1465 - null - [null, null, null, null, null] +1466 - null - [null, null, null, null, null] +1467 - null - [null, null, null, null, null] +1468 - null - [null, null, null, null, null] +1469 - null - [null, null, null, null, null] +1470 - null - [null, null, null, null, null] +1471 - null - [null, null, null, null, null] +1472 - null - [null, null, null, null, null] +1473 - null - [null, null, null, null, null] +1474 - null - [null, null, null, null, null] +1475 - null - [null, null, null, null, null] +1476 - null - [null, null, null, null, null] +1477 - null - [null, null, null, null, null] +1478 - null - [null, null, null, null, null] +1479 - null - [null, null, null, null, null] +1480 - null - [null, null, null, null, null] +1481 - null - [null, null, null, null, null] +1482 - null - [null, null, null, null, null] +1483 - null - [null, null, null, null, null] +1484 - null - [null, null, null, null, null] +1485 - null - [null, null, null, null, null] +1486 - null - [null, null, null, null, null] +1487 - null - [null, null, null, null, null] +1488 - null - [null, null, null, null, null] +1489 - null - [null, null, null, null, null] +1490 - null - [null, null, null, null, null] +1491 - null - [null, null, null, null, null] +1492 - null - [null, null, null, null, null] +1493 - null - [null, null, null, null, null] +1494 - null - [null, null, null, null, null] +1495 - null - [null, null, null, null, null] +1496 - null - [null, null, null, null, null] +1497 - null - [null, null, null, null, null] +1498 - null - [null, null, null, null, null] +1499 - null - [null, null, null, null, null] +1500 - null - [null, null, null, null, null] +1501 - null - [null, null, null, null, null] +1502 - null - [null, null, null, null, null] +1503 - null - [null, null, null, null, null] +1504 - Door - [null, null, null, null, null] +1505 - Door - [null, null, null, null, null] +1506 - Large door - [Open, null, null, null, null] +1507 - Large door - [Close, null, null, null, null] +1508 - Large door - [Open, null, null, null, null] +1509 - null - [null, null, null, null, null] +1510 - null - [null, null, null, null, null] +1511 - Large door - [Close, null, null, null, null] +1512 - Large door - [Open, null, null, null, null] +1513 - Large door - [Open, null, null, null, null] +1514 - Large door - [Close, null, null, null, null] +1515 - Large door - [Close, null, null, null, null] +1516 - Large door - [Open, null, null, null, null] +1517 - Large door - [Close, null, null, null, null] +1518 - null - [null, null, null, null, null] +1519 - Large door - [Open, null, null, null, null] +1520 - Large door - [Close, null, null, null, null] +1521 - null - [null, null, null, null, null] +1522 - null - [null, null, null, null, null] +1523 - null - [null, null, null, null, null] +1524 - null - [null, null, null, null, null] +1525 - null - [null, null, null, null, null] +1526 - Curtain - [Open, null, null, null, null] +1527 - null - [null, null, null, null, null] +1528 - Curtain - [Open, null, null, null, null] +1529 - Curtain - [Close, null, null, null, null] +1530 - Door - [Open, null, null, null, null] +1531 - Door - [Close, null, null, null, null] +1532 - null - [null, null, null, null, null] +1533 - Door - [Open, null, null, null, null] +1534 - Door - [Close, null, null, null, null] +1535 - null - [null, null, null, null, null] +1536 - Door - [Open, null, null, null, null] +1537 - Door - [Close, null, null, null, null] +1538 - null - [null, null, null, null, null] +1539 - Door - [Open, null, null, null, null] +1540 - Door - [Close, null, null, null, null] +1541 - null - [null, null, null, null, null] +1542 - Door - [Open, null, null, null, null] +1543 - Door - [Close, null, null, null, null] +1544 - Door - [Open, null, null, null, null] +1545 - Door - [Close, null, null, null, null] +1546 - null - [null, null, null, null, null] +1547 - null - [null, null, null, null, null] +1548 - null - [null, null, null, null, null] +1549 - null - [null, null, null, null, null] +1550 - null - [null, null, null, null, null] +1551 - Gate - [Open, null, null, null, null] +1552 - Gate - [Close, null, null, null, null] +1553 - Gate - [Open, null, null, null, null] +1554 - null - [null, null, null, null, null] +1555 - null - [null, null, null, null, null] +1556 - Gate - [Close, null, null, null, null] +1557 - Gate - [Open, null, null, null, null] +1558 - Gate - [Open, null, null, null, null] +1559 - Gate - [null, null, null, null, null] +1560 - Gate - [Close, null, null, null, null] +1561 - Gate - [Close, null, null, null, null] +1562 - null - [null, null, null, null, null] +1563 - null - [null, null, null, null, null] +1564 - null - [null, null, null, null, null] +1565 - null - [null, null, null, null, null] +1566 - null - [null, null, null, null, null] +1567 - null - [null, null, null, null, null] +1568 - Trapdoor - [Open, null, null, null, null] +1569 - Trapdoor - [Open, null, null, null, null] +1570 - Trapdoor - [Climb-down, Close, null, null, null] +1571 - Trapdoor - [Climb-down, Close, null, null, null] +1572 - Boarded-up door - [null, null, null, null, null] +1573 - Doors - [Open, null, null, null, null] +1574 - Doors - [Close, null, null, null, null] +1575 - Doors - [Open, null, null, null, null] +1576 - Doors - [Close, null, null, null, null] +1577 - Doorway - [null, null, null, null, null] +1578 - Doorway - [null, null, null, null, null] +1579 - Doorway - [null, null, null, null, null] +1580 - Doorway - [null, null, null, null, null] +1581 - Doorway - [null, null, null, null, null] +1582 - null - [null, null, null, null, null] +1583 - Wall - [Push, null, null, null, null] +1584 - Wall - [Push, null, null, null, null] +1585 - null - [null, null, null, null, null] +1586 - Wall - [Push, null, null, null, null] +1587 - Wall - [Push, null, null, null, null] +1588 - null - [null, null, null, null, null] +1589 - Gate - [Open, null, null, null, null] +1590 - Gate - [Open, null, null, null, null] +1591 - Door - [Open, null, null, null, null] +1592 - Odd looking wall - [Push, null, null, null, null] +1593 - null - [null, null, null, null, null] +1594 - Dungeon door - [Open, null, null, null, null] +1595 - Door - [Open, null, null, null, null] +1596 - Gate - [Open, null, null, null, null] +1597 - Gate - [Open, null, null, null, null] +1598 - Gate - [Open, null, null, null, null] +1599 - Gate - [Open, null, null, null, null] +1600 - Magic guild door - [Open, null, null, null, null] +1601 - Magic guild door - [Open, null, null, null, null] +1602 - null - [null, null, null, null, null] +1603 - null - [null, null, null, null, null] +1604 - null - [null, null, null, null, null] +1605 - null - [null, null, null, null, null] +1606 - null - [null, null, null, null, null] +1607 - null - [null, null, null, null, null] +1608 - null - [null, null, null, null, null] +1609 - Scaffold - [null, null, null, null, null] +1610 - Scaffold - [null, null, null, null, null] +1611 - Scaffold - [null, null, null, null, null] +1612 - Scaffold - [null, null, null, null, null] +1613 - Timber - [null, null, null, null, null] +1614 - Timber - [null, null, null, null, null] +1615 - null - [null, null, null, null, null] +1616 - null - [null, null, null, null, null] +1617 - null - [null, null, null, null, null] +1618 - null - [null, null, null, null, null] +1619 - null - [null, null, null, null, null] +1620 - null - [null, null, null, null, null] +1621 - null - [null, null, null, null, null] +1622 - null - [null, null, null, null, null] +1623 - null - [null, null, null, null, null] +1624 - null - [null, null, null, null, null] +1625 - null - [null, null, null, null, null] +1626 - null - [null, null, null, null, null] +1627 - null - [null, null, null, null, null] +1628 - null - [null, null, null, null, null] +1629 - null - [null, null, null, null, null] +1630 - null - [null, null, null, null, null] +1631 - null - [null, null, null, null, null] +1632 - null - [null, null, null, null, null] +1633 - null - [null, null, null, null, null] +1634 - null - [null, null, null, null, null] +1635 - null - [null, null, null, null, null] +1636 - null - [null, null, null, null, null] +1637 - null - [null, null, null, null, null] +1638 - null - [null, null, null, null, null] +1639 - null - [null, null, null, null, null] +1640 - null - [null, null, null, null, null] +1641 - null - [null, null, null, null, null] +1642 - null - [null, null, null, null, null] +1643 - null - [null, null, null, null, null] +1644 - null - [null, null, null, null, null] +1645 - null - [null, null, null, null, null] +1646 - null - [null, null, null, null, null] +1647 - null - [null, null, null, null, null] +1648 - null - [null, null, null, null, null] +1649 - null - [null, null, null, null, null] +1650 - null - [null, null, null, null, null] +1651 - null - [null, null, null, null, null] +1652 - null - [null, null, null, null, null] +1653 - null - [null, null, null, null, null] +1654 - null - [null, null, null, null, null] +1655 - null - [null, null, null, null, null] +1656 - null - [null, null, null, null, null] +1657 - null - [null, null, null, null, null] +1658 - null - [null, null, null, null, null] +1659 - null - [null, null, null, null, null] +1660 - null - [null, null, null, null, null] +1661 - Bricks - [null, null, null, null, null] +1662 - Bricks - [null, null, null, null, null] +1663 - Bricks - [null, null, null, null, null] +1664 - null - [null, null, null, null, null] +1665 - null - [null, null, null, null, null] +1666 - null - [null, null, null, null, null] +1667 - null - [null, null, null, null, null] +1668 - null - [null, null, null, null, null] +1669 - null - [null, null, null, null, null] +1670 - null - [null, null, null, null, null] +1671 - null - [null, null, null, null, null] +1672 - null - [null, null, null, null, null] +1673 - null - [null, null, null, null, null] +1674 - null - [null, null, null, null, null] +1675 - null - [null, null, null, null, null] +1676 - null - [null, null, null, null, null] +1677 - null - [null, null, null, null, null] +1678 - null - [null, null, null, null, null] +1679 - null - [null, null, null, null, null] +1680 - null - [null, null, null, null, null] +1681 - null - [null, null, null, null, null] +1682 - null - [null, null, null, null, null] +1683 - null - [null, null, null, null, null] +1684 - null - [null, null, null, null, null] +1685 - null - [null, null, null, null, null] +1686 - null - [null, null, null, null, null] +1687 - null - [null, null, null, null, null] +1688 - null - [null, null, null, null, null] +1689 - null - [null, null, null, null, null] +1690 - null - [null, null, null, null, null] +1691 - null - [null, null, null, null, null] +1692 - null - [null, null, null, null, null] +1693 - null - [null, null, null, null, null] +1694 - null - [null, null, null, null, null] +1695 - null - [null, null, null, null, null] +1696 - null - [null, null, null, null, null] +1697 - null - [null, null, null, null, null] +1698 - null - [null, null, null, null, null] +1699 - null - [null, null, null, null, null] +1700 - null - [null, null, null, null, null] +1701 - null - [null, null, null, null, null] +1702 - null - [null, null, null, null, null] +1703 - null - [null, null, null, null, null] +1704 - null - [null, null, null, null, null] +1705 - null - [null, null, null, null, null] +1706 - null - [null, null, null, null, null] +1707 - null - [null, null, null, null, null] +1708 - null - [null, null, null, null, null] +1709 - null - [null, null, null, null, null] +1710 - null - [null, null, null, null, null] +1711 - null - [null, null, null, null, null] +1712 - null - [null, null, null, null, null] +1713 - null - [null, null, null, null, null] +1714 - null - [null, null, null, null, null] +1715 - null - [null, null, null, null, null] +1716 - null - [null, null, null, null, null] +1717 - null - [null, null, null, null, null] +1718 - null - [null, null, null, null, null] +1719 - null - [null, null, null, null, null] +1720 - null - [null, null, null, null, null] +1721 - null - [null, null, null, null, null] +1722 - Staircase - [Climb-up, null, null, null, null] +1723 - Staircase - [Climb-down, null, null, null, null] +1724 - Staircase - [Climb-down, null, null, null, null] +1725 - Staircase - [Climb-up, null, null, null, null] +1726 - Staircase - [Climb-down, null, null, null, null] +1727 - Staircase - [Climb-down, null, null, null, null] +1728 - Staircase - [Climb-down, null, null, null, null] +1729 - Staircase - [Climb-up, null, null, null, null] +1730 - Staircase - [Walk-up, null, null, null, null] +1731 - Staircase - [Walk-down, null, null, null, null] +1732 - Staircase - [Climb-down, null, null, null, null] +1733 - Staircase - [Climb-down, null, null, null, null] +1734 - Staircase - [Climb-up, null, null, null, null] +1735 - Staircase - [null, null, null, null, null] +1736 - Staircase - [Climb-down, null, null, null, null] +1737 - Staircase - [Climb-up, null, null, null, null] +1738 - Staircase - [Climb-up, null, null, null, null] +1739 - Staircase - [Climb, Climb-up, Climb-down, null, null] +1740 - Staircase - [Climb-down, null, null, null, null] +1741 - Staircase - [Climb-down, null, null, null, null] +1742 - Staircase - [Climb-up, null, null, null, null] +1743 - Staircase - [Climb, Climb-up, Climb-down, null, null] +1744 - Staircase - [Climb-down, null, null, null, null] +1745 - Staircase - [Climb-down, null, null, null, null] +1746 - Ladder - [Climb-down, null, null, null, null] +1747 - Ladder - [Climb-up, null, null, null, null] +1748 - Ladder - [Climb, Climb-up, Climb-down, null, null] +1749 - Ladder - [Climb-down, null, null, null, null] +1750 - Ladder - [Climb-up, null, null, null, null] +1751 - Ladder - [Climb, Climb-up, Climb-down, null, null] +1752 - Ladder - [Climb-up, null, null, null, null] +1753 - Ladder - [Climb-down, Climb-up, null, null, null] +1754 - Ladder - [Climb-down, null, null, null, null] +1755 - Ladder - [Climb-up, null, null, null, null] +1756 - Ladder - [Climb-down, null, null, null, null] +1757 - Ladder - [Climb-up, null, null, null, null] +1758 - Ladder - [Climb-down, null, null, null, null] +1759 - Ladder - [Climb-Down, null, null, null, null] +1760 - Stepladder - [null, null, null, null, null] +1761 - Steps - [Climb-up, null, null, null, null] +1762 - Climbing rope - [Climb, null, null, null, null] +1763 - Climbing rope - [null, null, null, null, null] +1764 - Climbing rope - [Climb, null, null, null, null] +1765 - Ladder - [Climb-down, null, null, null, null] +1766 - Ladder - [Climb-up, null, null, null, null] +1767 - Ladder - [Climb-down, null, null, null, null] +1768 - Ladder - [Climb-up, null, null, null, null] +1769 - null - [null, null, null, null, null] +1770 - null - [null, null, null, null, null] +1771 - null - [null, null, null, null, null] +1772 - null - [null, null, null, null, null] +1773 - null - [null, null, null, null, null] +1774 - null - [null, null, null, null, null] +1775 - null - [null, null, null, null, null] +1776 - null - [null, null, null, null, null] +1777 - null - [null, null, null, null, null] +1778 - Millstones - [null, null, null, null, null] +1779 - Sails - [null, null, null, null, null] +1780 - Sails - [null, null, null, null, null] +1781 - Flour bin - [Empty, null, null, null, null] +1782 - Flour bin - [Empty, null, null, null, null] +1783 - null - [null, null, null, null, null] +1784 - null - [null, null, null, null, null] +1785 - null - [null, null, null, null, null] +1786 - null - [null, null, null, null, null] +1787 - null - [null, null, null, null, null] +1788 - null - [null, null, null, null, null] +1789 - null - [null, null, null, null, null] +1790 - null - [null, null, null, null, null] +1791 - null - [null, null, null, null, null] +1792 - null - [null, null, null, null, null] +1793 - null - [null, null, null, null, null] +1794 - null - [null, null, null, null, null] +1795 - null - [null, null, null, null, null] +1796 - null - [null, null, null, null, null] +1797 - Waterfall rocks - [null, null, null, null, null] +1798 - null - [null, null, null, null, null] +1799 - null - [null, null, null, null, null] +1800 - null - [null, null, null, null, null] +1801 - null - [null, null, null, null, null] +1802 - null - [null, null, null, null, null] +1803 - null - [null, null, null, null, null] +1804 - Door - [Open, null, null, null, null] +1805 - Door - [Open, null, null, null, null] +1806 - null - [null, null, null, null, null] +1807 - null - [null, null, null, null, null] +1808 - null - [null, null, null, null, null] +1809 - null - [null, null, null, null, null] +1810 - Web - [Slash, null, null, null, null] +1811 - Sliced web - [null, null, null, null, null] +1812 - Portal - [null, null, null, null, null] +1813 - Stone stand - [null, null, null, null, null] +1814 - Lever - [Pull, null, null, null, null] +1815 - Lever - [Pull, null, null, null, null] +1816 - Lever - [Pull, null, null, null, null] +1817 - Lever - [Pull, null, null, null, null] +1818 - null - [null, null, null, null, null] +1819 - null - [null, null, null, null, null] +1820 - null - [null, null, null, null, null] +1821 - null - [null, null, null, null, null] +1822 - null - [null, null, null, null, null] +1823 - null - [null, null, null, null, null] +1824 - null - [null, null, null, null, null] +1825 - null - [null, null, null, null, null] +1826 - null - [null, null, null, null, null] +1827 - null - [null, null, null, null, null] +1828 - null - [null, null, null, null, null] +1829 - null - [null, null, null, null, null] +1830 - null - [null, null, null, null, null] +1831 - null - [null, null, null, null, null] +1832 - null - [null, null, null, null, null] +1833 - null - [null, null, null, null, null] +1834 - null - [null, null, null, null, null] +1835 - null - [null, null, null, null, null] +1836 - null - [null, null, null, null, null] +1837 - null - [null, null, null, null, null] +1838 - null - [null, null, null, null, null] +1839 - null - [null, null, null, null, null] +1840 - null - [null, null, null, null, null] +1841 - null - [null, null, null, null, null] +1842 - null - [null, null, null, null, null] +1843 - null - [null, null, null, null, null] +1844 - null - [null, null, null, null, null] +1845 - null - [null, null, null, null, null] +1846 - null - [null, null, null, null, null] +1847 - null - [null, null, null, null, null] +1848 - null - [null, null, null, null, null] +1849 - null - [null, null, null, null, null] +1850 - null - [null, null, null, null, null] +1851 - null - [null, null, null, null, null] +1852 - Bay window - [null, null, null, null, null] +1853 - null - [null, null, null, null, null] +1854 - null - [null, null, null, null, null] +1855 - null - [null, null, null, null, null] +1856 - null - [null, null, null, null, null] +1857 - null - [null, null, null, null, null] +1858 - null - [null, null, null, null, null] +1859 - null - [null, null, null, null, null] +1860 - null - [null, null, null, null, null] +1861 - null - [null, null, null, null, null] +1862 - null - [null, null, null, null, null] +1863 - null - [null, null, null, null, null] +1864 - Timber defence - [null, null, null, null, null] +1865 - null - [null, null, null, null, null] +1866 - null - [null, null, null, null, null] +1867 - null - [null, null, null, null, null] +1868 - null - [null, null, null, null, null] +1869 - null - [null, null, null, null, null] +1870 - null - [null, null, null, null, null] +1871 - null - [null, null, null, null, null] +1872 - null - [null, null, null, null, null] +1873 - null - [null, null, null, null, null] +1874 - null - [null, null, null, null, null] +1875 - null - [null, null, null, null, null] +1876 - Altar slab - [null, null, null, null, null] +1877 - null - [null, null, null, null, null] +1878 - null - [null, null, null, null, null] +1879 - null - [null, null, null, null, null] +1880 - null - [null, null, null, null, null] +1881 - null - [null, null, null, null, null] +1882 - null - [null, null, null, null, null] +1883 - null - [null, null, null, null, null] +1884 - null - [null, null, null, null, null] +1885 - null - [null, null, null, null, null] +1886 - null - [null, null, null, null, null] +1887 - null - [null, null, null, null, null] +1888 - null - [null, null, null, null, null] +1889 - null - [null, null, null, null, null] +1890 - null - [null, null, null, null, null] +1891 - null - [null, null, null, null, null] +1892 - null - [null, null, null, null, null] +1893 - null - [null, null, null, null, null] +1894 - null - [null, null, null, null, null] +1895 - null - [null, null, null, null, null] +1896 - Throne - [null, null, null, null, null] +1897 - Candlestick holder - [null, null, null, null, null] +1898 - Chair - [null, null, null, null, null] +1899 - Chair - [null, null, null, null, null] +1900 - Suit of armour - [null, null, null, null, null] +1901 - Table - [null, null, null, null, null] +1902 - null - [null, null, null, null, null] +1903 - null - [null, null, null, null, null] +1904 - null - [null, null, null, null, null] +1905 - null - [null, null, null, null, null] +1906 - null - [null, null, null, null, null] +1907 - null - [null, null, null, null, null] +1908 - null - [null, null, null, null, null] +1909 - null - [null, null, null, null, null] +1910 - null - [null, null, null, null, null] +1911 - null - [null, null, null, null, null] +1912 - null - [null, null, null, null, null] +1913 - null - [null, null, null, null, null] +1914 - null - [null, null, null, null, null] +1915 - null - [null, null, null, null, null] +1916 - null - [null, null, null, null, null] +1917 - null - [null, null, null, null, null] +1918 - null - [null, null, null, null, null] +1919 - null - [null, null, null, null, null] +1920 - null - [null, null, null, null, null] +1921 - null - [null, null, null, null, null] +1922 - null - [null, null, null, null, null] +1923 - null - [null, null, null, null, null] +1924 - null - [null, null, null, null, null] +1925 - null - [null, null, null, null, null] +1926 - null - [null, null, null, null, null] +1927 - null - [null, null, null, null, null] +1928 - null - [null, null, null, null, null] +1929 - null - [null, null, null, null, null] +1930 - null - [null, null, null, null, null] +1931 - null - [null, null, null, null, null] +1932 - null - [null, null, null, null, null] +1933 - null - [null, null, null, null, null] +1934 - null - [null, null, null, null, null] +1935 - null - [null, null, null, null, null] +1936 - null - [null, null, null, null, null] +1937 - null - [null, null, null, null, null] +1938 - null - [null, null, null, null, null] +1939 - Tower - [null, null, null, null, null] +1940 - null - [null, null, null, null, null] +1941 - null - [null, null, null, null, null] +1942 - null - [null, null, null, null, null] +1943 - null - [null, null, null, null, null] +1944 - null - [null, null, null, null, null] +1945 - null - [null, null, null, null, null] +1946 - null - [null, null, null, null, null] +1947 - Crumbling wall - [Climb-over, null, null, null, null] +1948 - Crumbling wall - [Climb-over, null, null, null, null] +1949 - Bricks - [null, null, null, null, null] +1950 - Bricks - [null, null, null, null, null] +1951 - Bricks - [null, null, null, null, null] +1952 - null - [null, null, null, null, null] +1953 - null - [null, null, null, null, null] +1954 - null - [null, null, null, null, null] +1955 - null - [null, null, null, null, null] +1956 - null - [null, null, null, null, null] +1957 - null - [null, null, null, null, null] +1958 - null - [null, null, null, null, null] +1959 - null - [null, null, null, null, null] +1960 - null - [null, null, null, null, null] +1961 - null - [null, null, null, null, null] +1962 - null - [null, null, null, null, null] +1963 - null - [null, null, null, null, null] +1964 - null - [null, null, null, null, null] +1965 - null - [null, null, null, null, null] +1966 - null - [null, null, null, null, null] +1967 - Tree Door - [Open, null, null, null, null] +1968 - Tree Door - [Open, null, null, null, null] +1969 - null - [null, null, null, null, null] +1970 - null - [null, null, null, null, null] +1971 - null - [null, null, null, null, null] +1972 - null - [null, null, null, null, null] +1973 - null - [null, null, null, null, null] +1974 - null - [null, null, null, null, null] +1975 - null - [null, null, null, null, null] +1976 - null - [null, null, null, null, null] +1977 - null - [null, null, null, null, null] +1978 - null - [null, null, null, null, null] +1979 - null - [null, null, null, null, null] +1980 - null - [Open, null, null, null, null] +1981 - null - [Open, null, null, null, null] +1982 - null - [null, null, null, null, null] +1983 - null - [null, null, null, null, null] +1984 - null - [null, null, null, null, null] +1985 - Root - [Search, null, null, null, null] +1986 - Root - [Search, null, null, null, null] +1987 - Log raft - [Board, null, null, null, null] +1988 - Broken log raft - [null, null, null, null, null] +1989 - Bookcase - [Search, null, null, null, null] +1990 - Crate - [Search, null, null, null, null] +1991 - Door - [Open, null, null, null, null] +1992 - Glarial's tombstone - [Read, null, null, null, null] +1993 - Glarial's tomb - [Search, null, null, null, null] +1994 - Closed chest - [Open, null, null, null, null] +1995 - Open chest - [Search, Shut, null, null, null] +1996 - Rock - [Swim to, null, null, null, null] +1997 - Rock - [Swim to, null, null, null, null] +1998 - Rope - [null, null, null, null, null] +1999 - Crate - [Search, null, null, null, null] +2000 - Door - [Open, null, null, null, null] +2001 - null - [null, null, null, null, null] +2002 - Door - [Open, null, null, null, null] +2003 - null - [null, null, null, null, null] +2004 - Pillar - [null, null, null, null, null] +2005 - Statue of Baxtorian - [null, null, null, null, null] +2006 - Statue of Glarial - [null, null, null, null, null] +2007 - null - [null, null, null, null, null] +2008 - null - [null, null, null, null, null] +2009 - null - [null, null, null, null, null] +2010 - Ledge - [Open, null, null, null, null] +2011 - Ledge - [Open, null, null, null, null] +2012 - Ledge - [Open, null, null, null, null] +2013 - Vine - [Check, null, null, null, null] +2014 - Chalice of Eternity - [Take treasure, null, null, null, null] +2015 - Chalice of Eternity - [Take treasure, null, null, null, null] +2016 - null - [null, null, null, null, null] +2017 - null - [null, null, null, null, null] +2018 - null - [null, null, null, null, null] +2019 - Whirlpool - [null, null, null, null, null] +2020 - Dead tree - [Climb, null, null, null, null] +2021 - null - [null, null, null, null, null] +2022 - Barrel - [Get in, null, null, null, null] +2023 - Achey Tree - [Chop, null, hidden, null, null] +2024 - Cauldron - [Drink From, null, null, null, null] +2025 - Door - [Open, null, null, null, null] +2026 - Fishing spot - [null, null, null, null, null] +2027 - null - [null, null, null, null, null] +2028 - Fishing spot - [Net, Bait, hidden, hidden, null] +2029 - Fishing spot - [Harpoon, Cage, hidden, hidden, null] +2030 - Fishing spot - [Net, Harpoon, hidden, hidden, null] +2031 - Fishing spot - [Cage, Harpoon, hidden, hidden, null] +2032 - Bedroom door - [Open, null, null, null, null] +2033 - Bedroom door - [null, null, null, null, null] +2034 - Door - [Open, null, null, null, null] +2035 - Door - [null, null, null, null, null] +2036 - Door - [Open, null, null, null, null] +2037 - Door - [null, null, null, null, null] +2038 - Dummy - [Hit, null, null, null, null] +2039 - Gate - [Open, null, null, null, null] +2040 - null - [null, null, null, null, null] +2041 - Gate - [Open, null, null, null, null] +2042 - null - [null, null, null, null, null] +2043 - Cauldron - [null, null, null, null, null] +2044 - Trough - [null, null, null, null, null] +2045 - null - [null, null, null, null, null] +2046 - null - [null, null, null, null, null] +2047 - null - [null, null, null, null, null] +2048 - Door - [Open, null, null, null, null] +2049 - Door - [Open, null, null, null, null] +2050 - Gate - [Open, hidden, null, null, null] +2051 - Gate - [Open, null, null, null, null] +2052 - null - [null, null, null, null, null] +2053 - null - [null, null, null, null, null] +2054 - Door - [Open, null, null, null, null] +2055 - null - [null, null, null, null, null] +2056 - Cupboard - [Open, null, null, null, null] +2057 - Cupboard - [Search, Close, null, null, null] +2058 - Gate - [Open, null, null, null, null] +2059 - null - [null, null, null, null, null] +2060 - Gate - [Open, null, null, null, null] +2061 - null - [null, null, null, null, null] +2062 - Cupboard - [Open, null, null, null, null] +2063 - Cupboard - [Search, Close, null, null, null] +2064 - Crate - [Search, null, null, null, null] +2065 - Rope Ladder - [Investigate, null, null, null, null] +2066 - Wall - [null, null, null, null, null] +2067 - Watchtower - [Investigate, null, null, null, null] +2068 - Fence - [Squeeze-through, null, null, null, null] +2069 - Door - [Open, null, null, null, null] +2070 - null - [null, null, null, null, null] +2071 - Crate - [Search, null, null, null, null] +2072 - Crate - [Search, Fill, null, null, null] +2073 - Banana Tree - [Pick, null, null, null, null] +2074 - Banana Tree - [Pick, null, null, null, null] +2075 - Banana Tree - [Pick, null, null, null, null] +2076 - Banana Tree - [Pick, null, null, null, null] +2077 - Banana Tree - [Pick, null, null, null, null] +2078 - Banana Tree - [Search, null, null, null, null] +2079 - Chest - [Open, null, null, null, null] +2080 - null - [null, null, null, null, null] +2081 - Gangplank - [Cross, null, null, null, null] +2082 - Gangplank - [Cross, null, null, null, null] +2083 - Gangplank - [Cross, null, null, null, null] +2084 - Gangplank - [Cross, null, null, null, null] +2085 - Gangplank - [Cross, null, null, null, null] +2086 - Gangplank - [Cross, null, null, null, null] +2087 - Gangplank - [Cross, null, null, null, null] +2088 - Gangplank - [Cross, null, null, null, null] +2089 - Rockery - [null, null, null, null, null] +2090 - Rocks - [Mine, Prospect, hidden, null, null] +2091 - Rocks - [Mine, Prospect, hidden, null, null] +2092 - Rocks - [Mine, Prospect, hidden, null, null] +2093 - Rocks - [Mine, Prospect, hidden, null, null] +2094 - Rocks - [Mine, Prospect, hidden, null, null] +2095 - Rocks - [Mine, Prospect, hidden, null, null] +2096 - Rocks - [Mine, Prospect, hidden, null, null] +2097 - Rocks - [Mine, Prospect, hidden, null, null] +2098 - Rocks - [Mine, Prospect, hidden, null, null] +2099 - Rocks - [Mine, Prospect, hidden, null, null] +2100 - Rocks - [Mine, Prospect, hidden, null, null] +2101 - Rocks - [Mine, Prospect, hidden, null, null] +2102 - Rocks - [Mine, Prospect, hidden, null, null] +2103 - Rocks - [Mine, Prospect, hidden, null, null] +2104 - Rocks - [Mine, Prospect, hidden, null, null] +2105 - Rocks - [Mine, Prospect, hidden, null, null] +2106 - Rocks - [Mine, Prospect, hidden, null, null] +2107 - Rocks - [Mine, Prospect, hidden, null, null] +2108 - Rocks - [Mine, Prospect, hidden, null, null] +2109 - Rocks - [Mine, Prospect, hidden, null, null] +2110 - Rocks - [Mine, Prospect, hidden, null, null] +2111 - Rocks - [Mine, Prospect, hidden, null, null] +2112 - Door - [Open, null, null, null, null] +2113 - Ladder - [Climb-down, null, null, null, null] +2114 - Coal Truck - [Remove-coal, Investigate, null, null, null] +2115 - Gate - [Open, null, null, null, null] +2116 - Gate - [Open, null, null, null, null] +2117 - Old wall - [Search, null, null, null, null] +2118 - Whirlpool - [null, null, null, null, null] +2119 - Rocks - [Mine, Prospect, hidden, null, null] +2120 - Rocks - [Mine, Prospect, hidden, null, null] +2121 - Rocks - [Mine, Prospect, hidden, null, null] +2122 - Rocks - [Mine, Prospect, hidden, null, null] +2123 - Rocks - [Mine, Prospect, hidden, null, null] +2124 - Rocks - [Mine, Prospect, hidden, null, null] +2125 - Rocks - [Mine, Prospect, hidden, null, null] +2126 - Rocks - [Mine, Prospect, hidden, null, null] +2127 - Rocks - [Mine, Prospect, hidden, null, null] +2128 - Rocks - [Mine, Prospect, hidden, null, null] +2129 - Rocks - [Mine, Prospect, hidden, null, null] +2130 - Rocks - [Mine, Prospect, hidden, null, null] +2131 - Rocks - [Mine, Prospect, hidden, null, null] +2132 - Rocks - [Mine, Prospect, hidden, null, null] +2133 - Rocks - [Mine, Prospect, hidden, null, null] +2134 - Rocks - [Mine, Prospect, hidden, null, null] +2135 - Rocks - [Mine, Prospect, hidden, null, null] +2136 - Rocks - [Mine, Prospect, hidden, null, null] +2137 - Rocks - [Mine, Prospect, hidden, null, null] +2138 - Rocks - [Mine, Prospect, hidden, null, null] +2139 - Rocks - [Mine, Prospect, hidden, null, null] +2140 - Rocks - [Mine, Prospect, hidden, null, null] +2141 - Chest - [null, null, null, null, null] +2142 - Cauldron of Thunder - [null, null, null, null, null] +2143 - Prison door - [Open, null, null, null, null] +2144 - Prison door - [Open, null, null, null, null] +2145 - Coffin - [Open, Search, null, null, null] +2146 - null - [Search, null, null, null, null] +2147 - Ladder - [Climb-down, null, null, null, null] +2148 - Ladder - [Climb-up, null, null, null, null] +2149 - Obelisk - [null, null, null, null, null] +2150 - null - [null, null, null, null, null] +2151 - Obelisk of Water - [null, null, null, null, null] +2152 - Obelisk of Air - [null, null, null, null, null] +2153 - Obelisk of Fire - [null, null, null, null, null] +2154 - Gate - [Open, null, null, null, null] +2155 - Gate - [Open, null, null, null, null] +2156 - Magic Portal - [Enter, null, null, null, null] +2157 - Magic Portal - [Enter, null, null, null, null] +2158 - Magic Portal - [Enter, null, null, null, null] +2159 - Barrel - [Climb-on, null, null, null, null] +2160 - Barrel - [Climb-on, null, null, null, null] +2161 - Barrel - [Climb-on, null, null, null, null] +2162 - Trawler net - [null, null, null, null, null] +2163 - Trawler net - [null, null, null, null, null] +2164 - Trawler net - [Inspect, null, null, null, null] +2165 - Trawler net - [Inspect, null, null, null, null] +2166 - Trawler net - [Inspect, null, null, null, null] +2167 - Leak - [Fill, null, null, null, null] +2168 - Repaired leak - [null, null, null, null, null] +2169 - Spray - [null, null, null, null, null] +2170 - Spray - [null, null, null, null, null] +2171 - null - [null, null, null, null, null] +2172 - Trawler net - [Inspect, null, null, null, null] +2173 - Trawler net - [Inspect, null, null, null, null] +2174 - Ship's ladder - [Climb-up, null, null, null, null] +2175 - Ship's ladder - [Climb-down, null, null, null, null] +2176 - Hole - [null, null, null, null, null] +2177 - Hull - [null, null, null, null, null] +2178 - Gangplank - [Cross, null, null, null, null] +2179 - Gangplank - [Cross, null, null, null, null] +2180 - Catapult - [null, null, null, null, null] +2181 - Ballista - [null, Fire, null, null, null] +2182 - Open chest - [Search, Close, null, null, null] +2183 - Closed chest - [Open, null, null, null, null] +2184 - Door - [Open, null, null, null, null] +2185 - Crumbled wall - [Climb-over, null, null, null, null] +2186 - Loose Railing - [Squeeze-through, null, null, null, null] +2187 - Stairs - [Climb-down, null, null, null, null] +2188 - Door - [Open, null, null, null, null] +2189 - Door - [Open, null, null, null, null] +2190 - Stairs - [Climb-down, null, null, null, null] +2191 - Chest - [Open, null, null, null, null] +2192 - Door - [Open, null, null, null, null] +2193 - Door - [Open, null, null, null, null] +2194 - Chest - [Search, Close, null, null, null] +2195 - null - [null, null, null, null, null] +2196 - null - [null, null, null, null, null] +2197 - null - [null, null, null, null, null] +2198 - null - [null, null, null, null, null] +2199 - Kitchen gate - [Open, null, null, null, null] +2200 - Kitchen gate - [Open, null, null, null, null] +2201 - null - [null, null, null, null, null] +2202 - null - [null, null, null, null, null] +2203 - null - [null, null, null, null, null] +2204 - null - [null, null, null, null, null] +2205 - null - [null, null, null, null, null] +2206 - null - [null, null, null, null, null] +2207 - null - [null, null, null, null, null] +2208 - null - [null, null, null, null, null] +2209 - null - [null, null, null, null, null] +2210 - Telescope - [Use, null, null, null, null] +2211 - Grave of Scorpius - [Read, null, null, null, null] +2212 - Toy corner - [null, null, null, null, null] +2213 - Bank booth - [Use, Use-quickly, Collect, null, null] +2214 - Bank booth - [null, null, null, null, null] +2215 - Closed bank booth - [null, null, null, null, null] +2216 - Broken cart - [Look-at, Search, null, null, null] +2217 - Mound of earth - [Look-at, Search, null, null, null] +2218 - Fissure - [Look-at, Search, null, null, null] +2219 - Fissure - [Look-at, Search, null, null, null] +2220 - Cave in - [null, Search, null, null, null] +2221 - Strange looking stone - [Look-at, Investigate, null, null, null] +2222 - Loose rocks - [null, Search, null, null, null] +2223 - Old sacks - [null, Search, null, null, null] +2224 - Ancient gallows - [Look-at, Search, null, null, null] +2225 - Waterfall rocks - [Look-at, Search, null, null, null] +2226 - Smashed table - [Look-at, Craft, null, null, null] +2227 - Crude raft - [null, Disembark, null, null, null] +2228 - null - [null, null, null, null, null] +2229 - Tribal Statue - [Investigate, null, null, null, null] +2230 - Travel cart - [null, Board, Pay-fare, null, null] +2231 - Rocks - [Climb, null, null, null, null] +2232 - null - [null, null, null, null, null] +2233 - null - [null, null, null, null, null] +2234 - Well stacked rocks - [Investigate, Search, null, null, null] +2235 - Tomb dolmen - [Inspect, Search, null, null, null] +2236 - Climbing rocks - [Climb, null, null, null, null] +2237 - Palm tree - [null, Search, null, null, null] +2238 - Hillside entrance - [Enter, null, null, null, null] +2239 - Hillside entrance - [Enter, null, null, null, null] +2240 - Carved doors - [Open, Search, null, null, null] +2241 - Carved doors - [Open, Search, null, null, null] +2242 - Tomb exit - [Open, Search, null, null, null] +2243 - Tomb exit - [Open, Search, null, null, null] +2244 - Jungle plant - [null, null, null, null, null] +2245 - Jungle plant - [null, null, null, null, null] +2246 - Tomb doors - [Open, Search, null, null, null] +2247 - Tomb doors - [Open, Search, null, null, null] +2248 - Tomb doors - [Open, Search, null, null, null] +2249 - Tomb doors - [Open, Search, null, null, null] +2250 - Tomb doors - [Open, Search, null, null, null] +2251 - null - [null, null, null, null, null] +2252 - null - [null, null, null, null, null] +2253 - Tomb exit - [Open, Search, null, null, null] +2254 - Tomb exit - [Open, Search, null, null, null] +2255 - Ancient metal gate - [Open, Search, null, null, null] +2256 - Ancient metal gate - [Open, Search, null, null, null] +2257 - Rocks - [Climb, null, null, null, null] +2258 - Tomb dolmen - [Look-at, Search, null, null, null] +2259 - Metal gate - [Open, null, null, null, null] +2260 - Metal gate - [Open, null, null, null, null] +2261 - Wooden gate - [Open, null, null, null, null] +2262 - Wooden gate - [Open, null, null, null, null] +2263 - null - [null, null, null, null, null] +2264 - null - [null, null, null, null, null] +2265 - Travel cart - [null, Board, Pay-fare, null, null] +2266 - Blacksmith's door - [Open, null, null, null, null] +2267 - Blacksmith's door - [Open, null, null, null, null] +2268 - Ladder - [Climb-up, null, null, null, null] +2269 - Ladder - [Climb-down, null, null, null, null] +2270 - Plant - [null, null, null, null, null] +2271 - Cupboard - [Open, null, null, null, null] +2272 - Cupboard - [Search, Shut, null, null, null] +2273 - Rope swing - [Swing-on, null, null, null, null] +2274 - Rope swing - [Swing-on, null, null, null, null] +2275 - Rock - [null, null, null, null, null] +2276 - Rock - [null, null, null, null, null] +2277 - Rock - [null, null, null, null, null] +2278 - Rock - [null, null, null, null, null] +2279 - Ropeswing - [null, null, null, null, null] +2280 - Ropeswing - [null, null, null, null, null] +2281 - Ropeswing - [null, null, null, null, null] +2282 - Ropeswing - [Swing-on, null, null, null, null] +2283 - Ropeswing - [Swing-on, null, null, null, null] +2284 - Obstacle net - [Climb-over, null, null, null, null] +2285 - Obstacle net - [Climb-over, null, null, null, null] +2286 - Obstacle net - [Climb-over, null, null, null, null] +2287 - Obstacle pipe - [Squeeze-through, null, null, null, null] +2288 - Obstacle pipe - [Squeeze-through, null, null, null, null] +2289 - Hollow tree - [Chop down, null, hidden, null, null] +2290 - Obstacle pipe - [Squeeze-through, null, null, null, null] +2291 - null - [null, null, null, null, null] +2292 - null - [null, null, null, null, null] +2293 - null - [null, null, null, null, null] +2294 - Log balance - [Walk-across, null, null, null, null] +2295 - Log balance - [Walk-across, null, null, null, null] +2296 - Log balance - [Walk-across, null, null, null, null] +2297 - Log balance - [Walk-across, null, null, null, null] +2298 - Climbing rocks - [Climb-up, null, null, null, null] +2299 - Climbing rocks - [Climb-up, null, null, null, null] +2300 - Climbing rocks - [Climb-up, null, null, null, null] +2301 - Balancing ledge - [Walk-across, null, null, null, null] +2302 - Balancing ledge - [Walk-across, null, null, null, null] +2303 - Balancing ledge - [Walk-across, null, null, null, null] +2304 - Spikes - [null, null, null, null, null] +2305 - Spikes - [null, null, null, null, null] +2306 - null - [null, null, null, null, null] +2307 - Gate - [Open, null, null, null, null] +2308 - Gate - [Open, null, null, null, null] +2309 - Door - [Open, null, null, null, null] +2310 - Tree stump - [null, null, null, null, null] +2311 - Stepping stone - [Cross, null, null, null, null] +2312 - Balancing rope - [Walk-on, null, null, null, null] +2313 - Tree branch - [Climb, null, null, null, null] +2314 - Tree branch - [Climb-down, null, null, null, null] +2315 - Tree branch - [Climb-down, null, null, null, null] +2316 - Staircase - [Climb-up, null, null, null, null] +2317 - Pile of rubble - [Climb-up, null, null, null, null] +2318 - Pile of rubble - [Climb-down, null, null, null, null] +2319 - Monkeybars - [null, null, null, null, null] +2320 - Monkeybars - [Swing across, null, null, null, null] +2321 - Monkeybars - [Swing across, null, null, null, null] +2322 - Ropeswing - [Swing-on, null, null, null, null] +2323 - Ropeswing - [Swing-on, null, null, null, null] +2324 - Ropeswing - [Swing-on, null, null, null, null] +2325 - Ropeswing - [Swing-on, null, null, null, null] +2326 - Branch - [null, null, null, null, null] +2327 - Long branched tree - [null, null, null, null, null] +2328 - Rocks - [Climb, null, null, null, null] +2329 - null - [null, null, null, null, null] +2330 - null - [null, null, null, null, null] +2331 - null - [null, null, null, null, null] +2332 - A wooden log - [Cross, null, null, null, null] +2333 - Stepping stones - [Cross, null, null, null, null] +2334 - Stepping stones - [Cross, null, null, null, null] +2335 - Stepping stones - [Cross, null, null, null, null] +2336 - Hole - [null, null, null, null, null] +2337 - Sturdy door - [Open, null, null, null, null] +2338 - Door - [Open, null, null, null, null] +2339 - Sturdy door - [Open, null, null, null, null] +2340 - null - [null, null, null, null, null] +2341 - Wall - [Push, null, null, null, null] +2342 - Grill - [Listen-at, null, null, null, null] +2343 - Brick - [null, null, null, null, null] +2344 - Brick - [null, null, null, null, null] +2345 - Brick - [null, null, null, null, null] +2346 - Brick - [null, null, null, null, null] +2347 - Brick - [null, null, null, null, null] +2348 - Brick - [null, null, null, null, null] +2349 - Brick - [null, null, null, null, null] +2350 - Winch - [Operate, null, null, null, null] +2351 - Winch - [Operate, null, null, null, null] +2352 - Rope - [Climb-up, null, null, null, null] +2353 - Rope - [Climb-up, null, null, null, null] +2354 - Sacks - [Search, null, null, null, null] +2355 - Sacks - [Search, null, null, null, null] +2356 - Sacks - [Search, null, null, null, null] +2357 - Bush - [Search, null, null, null, null] +2358 - Bush - [Search, null, null, null, null] +2359 - null - [null, null, null, null, null] +2360 - Chest - [Search, Close, null, null, null] +2361 - Chest - [Open, null, null, null, null] +2362 - Brick - [Search, null, null, null, null] +2363 - Panning point - [Pan, null, null, null, null] +2364 - Crate - [null, null, null, null, null] +2365 - Crate - [null, null, null, null, null] +2366 - Signpost - [Read, null, null, null, null] +2367 - Signpost - [Read, null, null, null, null] +2368 - Signpost - [Read, null, null, null, null] +2369 - Signpost - [Read, null, null, null, null] +2370 - Signpost - [Read, null, null, null, null] +2371 - Signpost - [Read, null, null, null, null] +2372 - Bookcase - [Search, null, null, null, null] +2373 - Cupboard - [Open, null, null, null, null] +2374 - Cupboard - [Close, Search, null, null, null] +2375 - Specimen tray - [null, Search, null, null, null] +2376 - Soil - [null, null, null, null, null] +2377 - Soil - [null, null, null, null, null] +2378 - Soil - [null, null, null, null, null] +2379 - Campsite bed - [null, null, null, null, null] +2380 - Chest - [Search, Open, null, null, null] +2381 - Soil - [null, null, null, null, null] +2382 - Soil - [null, null, null, null, null] +2383 - Soil - [null, null, null, null, null] +2384 - null - [null, null, null, null, null] +2385 - null - [null, null, null, null, null] +2386 - null - [null, null, null, null, null] +2387 - null - [null, null, null, null, null] +2388 - null - [null, null, null, null, null] +2389 - null - [null, null, null, null, null] +2390 - null - [null, null, null, null, null] +2391 - Gate - [Open, Search, null, null, null] +2392 - Gate - [Open, Search, null, null, null] +2393 - Gnome goal - [Shoot, null, null, null, null] +2394 - Gate - [Open, null, null, null, null] +2395 - null - [null, null, null, null, null] +2396 - Bed - [null, null, null, null, null] +2397 - Door - [Open, null, null, null, null] +2398 - Door - [Open, null, null, null, null] +2399 - Door - [Open, null, null, null, null] +2400 - Cupboard - [Open, null, null, null, null] +2401 - Cupboard - [Shut, Search, null, null, null] +2402 - Bookcase - [null, Search, null, null, null] +2403 - Chest - [Open, null, null, null, null] +2404 - Chest - [Search, Close, null, null, null] +2405 - Ladder - [Climb-up, null, null, null, null] +2406 - Door - [Open, null, null, null, null] +2407 - Magic door - [Open, null, null, null, null] +2408 - Ladder - [Climb-down, null, null, null, null] +2409 - Tree - [Chop, null, null, null, null] +2410 - Ladder - [Climb-up, null, null, null, null] +2411 - Sturdy door - [Open, null, null, null, null] +2412 - Gangplank - [Cross, null, null, null, null] +2413 - Gangplank - [Cross, null, null, null, null] +2414 - Gangplank - [Cross, null, null, null, null] +2415 - Gangplank - [Cross, null, null, null, null] +2416 - Large door - [Open, null, null, null, null] +2417 - Large door - [Close, null, null, null, null] +2418 - Chest - [null, Deposit, Shut, null, null] +2419 - null - [null, null, null, null, null] +2420 - null - [null, null, null, null, null] +2421 - Lever - [Pull, null, null, null, null] +2422 - Lever - [Pull, null, null, null, null] +2423 - Lever - [Pull, null, null, null, null] +2424 - Lever - [Pull, null, null, null, null] +2425 - Lever - [Pull, null, null, null, null] +2426 - Lever - [Pull, null, null, null, null] +2427 - Door - [Open, null, null, null, null] +2428 - Door - [Open, null, null, null, null] +2429 - Door - [Open, null, null, null, null] +2430 - Door - [Open, null, null, null, null] +2431 - Door - [Open, null, null, null, null] +2432 - Gate - [Open, null, null, null, null] +2433 - Gate - [Open, null, null, null, null] +2434 - Cupboard - [Open, null, null, null, null] +2435 - Cupboard - [null, Search, Close, null, null] +2436 - Closed chest - [Open, null, null, null, null] +2437 - null - [null, null, null, null, null] +2438 - Gate - [Open, null, null, null, null] +2439 - Gate - [Open, null, null, null, null] +2440 - Pillar - [null, null, null, null, null] +2441 - Pillar - [null, null, null, null, null] +2442 - Pillar - [null, null, null, null, null] +2443 - Pillar - [null, null, null, null, null] +2444 - Trapdoor - [Open, null, null, null, null] +2445 - null - [null, null, null, null, null] +2446 - Trap door - [Open, null, null, null, null] +2447 - Tree - [Climb-up, null, null, null, null] +2448 - Tree - [Climb-down, null, null, null, null] +2449 - Daconia rocks - [null, null, null, null, null] +2450 - Daconia rocks - [null, null, null, null, null] +2451 - Roots - [Push, null, null, null, null] +2452 - Mysterious ruins - [Enter, null, null, null, null] +2453 - Mysterious ruins - [Enter, null, null, null, null] +2454 - Mysterious ruins - [Enter, null, null, null, null] +2455 - Mysterious ruins - [Enter, null, null, null, null] +2456 - Mysterious ruins - [Enter, null, null, null, null] +2457 - Mysterious ruins - [Enter, null, null, null, null] +2458 - Mysterious ruins - [Enter, null, null, null, null] +2459 - Mysterious ruins - [Enter, null, null, null, null] +2460 - Mysterious ruins - [Enter, null, null, null, null] +2461 - Mysterious ruins - [Enter, null, null, null, null] +2462 - Mysterious ruins - [Enter, null, null, null, null] +2463 - null - [null, null, null, null, null] +2464 - Strange stones - [Search, null, null, null, null] +2465 - Portal - [Use, null, null, null, null] +2466 - Portal - [Use, null, null, null, null] +2467 - Portal - [Use, null, null, null, null] +2468 - Portal - [Use, null, null, null, null] +2469 - Portal - [Use, null, null, null, null] +2470 - Portal - [Use, null, null, null, null] +2471 - Portal - [Use, null, null, null, null] +2472 - Portal - [Use, null, null, null, null] +2473 - Portal - [Use, null, null, null, null] +2474 - Portal - [Use, null, null, null, null] +2475 - Portal - [Use, null, null, null, null] +2476 - Portal - [Use, null, null, null, null] +2477 - Portal - [Use, null, null, null, null] +2478 - Altar - [Craft-rune, null, null, null, null] +2479 - Altar - [Craft-rune, null, null, null, null] +2480 - Altar - [Craft-rune, null, null, null, null] +2481 - Altar - [Craft-rune, null, null, null, null] +2482 - Altar - [Craft-rune, null, null, null, null] +2483 - Altar - [Craft-rune, null, null, null, null] +2484 - Altar - [Craft-rune, null, null, null, null] +2485 - Altar - [Craft-rune, null, null, null, null] +2486 - Altar - [Craft-rune, null, null, null, null] +2487 - Altar - [Craft-rune, null, null, null, null] +2488 - Altar - [Craft-rune, null, null, null, null] +2489 - Altar - [Craft-rune, null, null, null, null] +2490 - null - [null, null, null, null, null] +2491 - Rune Essence - [Mine, Prospect, hidden, null, null] +2492 - Portal - [Use, null, null, null, null] +2493 - Pillar - [null, null, null, null, null] +2494 - Pillar - [null, null, null, null, null] +2495 - Pillar - [null, null, null, null, null] +2496 - null - [null, null, null, null, null] +2497 - Mysterious stone - [null, null, null, null, null] +2498 - Mysterious glow - [null, null, null, null, null] +2499 - Mysterious glow - [null, null, null, null, null] +2500 - Mysterious glow - [null, null, null, null, null] +2501 - Mysterious glow - [null, null, null, null, null] +2502 - Mysterious glow - [null, null, null, null, null] +2503 - Ruined Pillar - [null, null, null, null, null] +2504 - Ruined Pillar - [null, null, null, null, null] +2505 - Pillar - [null, null, null, null, null] +2506 - Ruined Pillar - [null, null, null, null, null] +2507 - Pillar - [null, null, null, null, null] +2508 - Rubble - [null, null, null, null, null] +2509 - Rubble - [null, null, null, null, null] +2510 - Rubble - [null, null, null, null, null] +2511 - Tower ladder - [Climb-up, null, null, null, null] +2512 - Tower ladder - [Climb-down, null, null, null, null] +2513 - Target - [Fire-at, null, null, null, null] +2514 - Guild door - [Open, null, null, null, null] +2515 - Row boat - [null, null, null, null, null] +2516 - Row boat - [null, null, null, null, null] +2517 - Ladder - [Climb-up, null, null, null, null] +2518 - null - [null, null, null, null, null] +2519 - Crates - [null, null, null, null, null] +2520 - Big door - [Close, null, null, null, null] +2521 - Big door - [Close, null, null, null, null] +2522 - Spooky stairs - [Walk-down, null, null, null, null] +2523 - Spooky stairs - [Walk-up, null, null, null, null] +2524 - Cupboard - [Open, null, null, null, null] +2525 - Cupboard - [Search, Close, null, null, null] +2526 - Door - [Open, null, null, null, null] +2527 - Door - [null, null, null, null, null] +2528 - Door - [Open, null, null, null, null] +2529 - Door - [null, null, null, null, null] +2530 - Barrel - [Search, null, null, null, null] +2531 - Mud patch - [null, null, null, null, null] +2532 - null - [null, null, null, null, null] +2533 - Mud pile - [Climb, null, null, null, null] +2534 - Door - [Open, null, null, null, null] +2535 - Door - [Open, null, null, null, null] +2536 - Door - [null, null, null, null, null] +2537 - Door - [Open, null, null, null, null] +2538 - Door - [null, null, null, null, null] +2539 - Stairs - [Walk-up, null, null, null, null] +2540 - Stairs - [Walk-down, null, null, null, null] +2541 - Sewer pipe - [Open, null, null, null, null] +2542 - Pipe - [Climb-up, null, null, null, null] +2543 - Manhole - [Open, null, null, null, null] +2544 - Manhole - [Climb-down, null, null, null, null] +2545 - Manhole cover - [Close, null, null, null, null] +2546 - Door - [Open, null, null, null, null] +2547 - Door - [Close, null, null, null, null] +2548 - Door - [Open, null, null, null, null] +2549 - Door - [Close, null, null, null, null] +2550 - Door - [Open, Pick-lock, null, null, null] +2551 - Door - [Open, Pick-lock, null, null, null] +2552 - Gate - [Open, Pick-lock, null, null, null] +2553 - Gate - [Open, Pick-lock, null, null, null] +2554 - Door - [Open, Pick-lock, null, null, null] +2555 - Door - [Open, Pick-lock, null, null, null] +2556 - Door - [Open, Pick-lock, null, null, null] +2557 - Door - [Open, Pick-lock, null, null, null] +2558 - Door - [Open, Pick-lock, null, null, null] +2559 - Door - [Open, Pick-lock, null, null, null] +2560 - Silk stall - [null, Steal-from, null, null, null] +2561 - Baker's stall - [null, Steal-from, null, null, null] +2562 - Gem stall - [null, Steal-from, null, null, null] +2563 - Fur stall - [null, Steal-from, null, null, null] +2564 - Spice stall - [null, Steal-from, null, null, null] +2565 - Silver stall - [null, Steal-from, null, null, null] +2566 - Chest - [Open, Search for traps, null, null, null] +2567 - Chest - [Open, Search for traps, null, null, null] +2568 - Chest - [Open, Search for traps, null, null, null] +2569 - Chest - [Open, Search for traps, null, null, null] +2570 - Chest - [Open, Search for traps, null, null, null] +2571 - Chest - [Open, Search for traps, null, null, null] +2572 - Chest - [Open, Search for traps, null, null, null] +2573 - Chest - [Open, Search for traps, null, null, null] +2574 - null - [null, null, null, null, null] +2575 - Marshy jungle vine - [null, Search, hidden, null, null] +2576 - Marshy jungle vine - [null, null, null, null, null] +2577 - Palm tree - [null, Search, null, null, null] +2578 - Palm tree - [null, null, null, null, null] +2579 - Scorched earth - [null, Search, null, null, null] +2580 - Scorched earth - [null, null, null, null, null] +2581 - Rock - [null, Search, null, null, null] +2582 - Rock - [null, null, null, null, null] +2583 - Fungus covered Cavern wall - [null, Search, hidden, null, null] +2584 - Rocks - [null, Search, null, null, null] +2585 - Hand holds - [Climb, null, null, null, null] +2586 - Rocks - [Mine, Prospect, hidden, null, null] +2587 - Chest - [Open, null, null, null, null] +2588 - Chest - [Search, Close, null, null, null] +2589 - Hole - [Repair, null, null, null, null] +2590 - Ladder - [Climb-down, null, null, null, null] +2591 - Ladder - [Climb-down, null, null, null, null] +2592 - Ladder - [Climb-up, null, null, null, null] +2593 - Gangplank - [Cross, null, null, null, null] +2594 - Gangplank - [Cross, null, null, null, null] +2595 - Door - [Open, null, null, null, null] +2596 - Red door - [Open, null, null, null, null] +2597 - Orange door - [Open, null, null, null, null] +2598 - Yellow door - [Open, null, null, null, null] +2599 - Blue door - [Open, null, null, null, null] +2600 - Magenta door - [Open, null, null, null, null] +2601 - Green door - [Open, null, null, null, null] +2602 - Exit door - [Open, null, null, null, null] +2603 - Chest - [Open, null, null, null, null] +2604 - Chest - [Search, Close, null, null, null] +2605 - Ladder - [Climb-down, null, null, null, null] +2606 - Wall - [Open, null, null, null, null] +2607 - Rocks - [Mine, Prospect, hidden, null, null] +2608 - Rocks - [Mine, Prospect, hidden, null, null] +2609 - Rocks - [Mine, Prospect, hidden, null, null] +2610 - Rocks - [Mine, Prospect, hidden, null, null] +2611 - Rocks - [Mine, Prospect, hidden, null, null] +2612 - Cupboard - [Open, null, null, null, null] +2613 - Cupboard - [Search, Close, null, null, null] +2614 - Coffin - [Open, null, null, null, null] +2615 - Coffin - [Search, Close, null, null, null] +2616 - Stairs - [Walk-Down, null, null, null, null] +2617 - Stairs - [Walk-Up, null, null, null, null] +2618 - null - [null, null, null, null, null] +2619 - Barrel - [Search, null, null, null, null] +2620 - Crate - [Search, null, null, null, null] +2621 - Door - [Open, null, null, null, null] +2622 - Door - [Open, null, null, null, null] +2623 - Gate - [Open, null, null, null, null] +2624 - Door - [Open, null, null, null, null] +2625 - Door - [Open, null, null, null, null] +2626 - Door - [Open, null, null, null, null] +2627 - Door - [Open, null, null, null, null] +2628 - Door - [Open, null, null, null, null] +2629 - Wall - [Push, null, null, null, null] +2630 - Fishing spot - [Bait, null, hidden, null, null] +2631 - Door - [Open, null, null, null, null] +2632 - Chest - [Open, null, null, null, null] +2633 - Chest - [Search, Close, null, null, null] +2634 - Rock slide - [Investigate, Mine, null, null, null] +2635 - Cupboard - [Open, null, null, null, null] +2636 - Cupboard - [Search, Shut, null, null, null] +2637 - null - [null, null, null, null, null] +2638 - Fountain of Heroes - [null, null, null, null, null] +2639 - null - [null, null, null, null, null] +2640 - Altar - [Pray-at, null, null, null, null] +2641 - Ladder - [Climb-up, null, null, null, null] +2642 - Potter's Wheel - [null, null, null, null, null] +2643 - Pottery Oven - [Fire, null, null, null, null] +2644 - Spinning wheel - [null, Spin, null, null, null] +2645 - Sand pit - [null, null, null, null, null] +2646 - Flax - [null, Pick, null, null, null] +2647 - Guild Door - [Open, null, null, null, null] +2648 - null - [null, null, null, null, null] +2649 - null - [null, null, null, null, null] +2650 - Table - [Search, null, null, null, null] +2651 - null - [null, null, null, null, null] +2652 - Sinclair mansion drain - [null, Investigate, null, null, null] +2653 - null - [null, null, null, null, null] +2654 - Sinclair family fountain - [null, Investigate, null, null, null] +2655 - Sinclair family crest - [null, Investigate, null, null, null] +2656 - Anna's barrel - [null, Search, null, null, null] +2657 - Bob's barrel - [null, Search, null, null, null] +2658 - Carol's barrel - [null, Search, null, null, null] +2659 - David's barrel - [null, Search, null, null, null] +2660 - Elizabeth's barrel - [null, Search, null, null, null] +2661 - Frank's barrel - [null, Search, null, null, null] +2662 - null - [null, null, null, null, null] +2663 - Sacks - [null, Investigate, null, null, null] +2664 - Sturdy wooden gate - [Investigate, null, null, null, null] +2665 - Sturdy wooden gate - [Investigate, null, null, null, null] +2666 - null - [null, null, null, null, null] +2667 - Winch - [Look at, Use, null, null, null] +2668 - Winch bucket - [Look at, Use, null, null, null] +2669 - null - [null, null, null, null, null] +2670 - Kharidian cactus (Healthy) - [Cut, null, null, null, null] +2671 - Kharidian cactus (Dry) - [null, null, null, null, null] +2672 - An experimental anvil - [Use, null, null, null, null] +2673 - Gate - [Open, Search, null, null, null] +2674 - Gate - [Open, Search, null, null, null] +2675 - Mine door entrance - [Open, Watch, null, null, null] +2676 - Mine door entrance - [Open, Watch, null, null, null] +2677 - Chest - [Open, null, null, null, null] +2678 - Bookcase - [null, Search, null, null, null] +2679 - null - [null, null, null, null, null] +2680 - Barrel - [Look-in, Search, null, null, null] +2681 - Barrel - [Look in, Search, null, null, null] +2682 - null - [null, null, null, null, null] +2683 - Window - [null, Search, null, null, null] +2684 - Mine Cart - [Look at, Search, null, null, null] +2685 - Gate - [Open, Search, null, null, null] +2686 - Gate - [Open, Search, null, null, null] +2687 - Gate - [Open, Search, null, null, null] +2688 - Gate - [Open, Search, null, null, null] +2689 - Prison door - [Open, null, null, null, null] +2690 - Mine door entrance - [Open, null, null, null, null] +2691 - Mine door entrance - [Open, null, null, null, null] +2692 - Prison door - [Open, null, null, null, null] +2693 - Shantay chest - [Open, null, null, null, null] +2694 - Rock - [null, Climb-to, null, null, null] +2695 - Rock - [null, Climb-to, null, null, null] +2696 - Rock - [null, Climb-to, null, null, null] +2697 - Rock - [null, Climb down, null, null, null] +2698 - Mine cave - [Walk through, null, null, null, null] +2699 - Mine cave - [Walk through, null, null, null, null] +2700 - Tent door - [Walk-through, null, null, null, null] +2701 - null - [null, null, null, null, null] +2702 - Tracks - [Look at, Search, null, null, null] +2703 - Tracks - [Look at, Search, null, null, null] +2704 - Rocks - [Mine, Prospect, hidden, null, null] +2705 - Door - [Open, null, null, null, null] +2706 - Door - [Open, null, null, null, null] +2707 - Crate - [null, Investigate, null, null, null] +2708 - Crate - [null, Investigate, null, null, null] +2709 - Chest - [Open, null, null, null, null] +2710 - Chest - [Search, Close, null, null, null] +2711 - Stairs - [Climb-up, Investigate, null, null, null] +2712 - Door - [Open, null, null, null, null] +2713 - Hopper - [null, null, null, null, null] +2714 - Hopper - [null, null, null, null, null] +2715 - Hellhound - [null, null, null, null, Remove] +2716 - Hopper - [null, null, null, null, null] +2717 - Hopper - [null, null, null, null, null] +2718 - Hopper controls - [Operate, null, null, null, null] +2719 - null - [null, null, null, null, null] +2720 - Hopper controls - [Operate, null, null, null, null] +2721 - Hopper controls - [Operate, null, null, null, null] +2722 - Hopper controls - [null, null, null, null, null] +2723 - Kebab - [null, null, null, null, null] +2724 - Fireplace - [null, null, null, null, null] +2725 - Fireplace - [null, null, null, null, null] +2726 - Fireplace - [null, null, null, null, null] +2727 - Cooking pot - [null, null, null, null, null] +2728 - Range - [null, null, null, null, null] +2729 - Range - [null, null, null, null, null] +2730 - Range - [null, null, null, null, null] +2731 - Range - [null, null, null, null, null] +2732 - Fire - [null, null, null, null, null] +2733 - null - [null, null, null, null, null] +2734 - null - [null, null, null, null, null] +2735 - null - [null, null, null, null, null] +2736 - null - [null, null, null, null, null] +2737 - null - [null, null, null, null, null] +2738 - null - [null, null, null, null, null] +2739 - null - [null, null, null, null, null] +2740 - null - [null, null, null, null, null] +2741 - null - [null, null, null, null, null] +2742 - null - [null, null, null, null, null] +2743 - null - [null, null, null, null, null] +2744 - null - [null, null, null, null, null] +2745 - null - [null, null, null, null, null] +2746 - null - [null, null, null, null, null] +2747 - null - [null, null, null, null, null] +2748 - null - [null, null, null, null, null] +2749 - null - [null, null, null, null, null] +2750 - null - [null, null, null, null, null] +2751 - null - [null, null, null, null, null] +2752 - null - [null, null, null, null, null] +2753 - null - [null, null, null, null, null] +2754 - null - [null, null, null, null, null] +2755 - null - [null, null, null, null, null] +2756 - null - [null, null, null, null, null] +2757 - null - [null, null, null, null, null] +2758 - null - [null, null, null, null, null] +2759 - null - [null, null, null, null, null] +2760 - null - [null, null, null, null, null] +2761 - null - [null, null, null, null, null] +2762 - null - [null, null, null, null, null] +2763 - null - [null, null, null, null, null] +2764 - null - [null, null, null, null, null] +2765 - null - [null, null, null, null, null] +2766 - null - [null, null, null, null, null] +2767 - null - [null, null, null, null, null] +2768 - null - [null, null, null, null, null] +2769 - null - [null, null, null, null, null] +2770 - null - [null, null, null, null, null] +2771 - null - [null, null, null, null, null] +2772 - null - [null, null, null, null, null] +2773 - null - [null, null, null, null, null] +2774 - null - [null, null, null, null, null] +2775 - null - [null, null, null, null, null] +2776 - null - [null, null, null, null, null] +2777 - null - [null, null, null, null, null] +2778 - null - [null, null, null, null, null] +2779 - null - [null, null, null, null, null] +2780 - null - [null, null, null, null, null] +2781 - Catapult - [null, null, null, null, null] +2782 - Anvil - [null, null, null, null, null] +2783 - Anvil - [null, null, null, null, null] +2784 - Blacksmith's tools - [null, null, null, null, null] +2785 - null - [null, null, null, null, null] +2786 - City gate - [Open, null, null, null, null] +2787 - City gate - [Open, null, null, null, null] +2788 - City gate - [Open, null, null, null, null] +2789 - City gate - [Open, null, null, null, null] +2790 - Chest - [Open, null, null, null, null] +2791 - Counter - [null, null, null, null, null] +2792 - Counter - [Steal-From, null, null, null, null] +2793 - Counter - [Steal-From, null, null, null, null] +2794 - Lever - [Pull, null, null, null, null] +2795 - Lever - [Pull, null, null, null, null] +2796 - Ladder - [Climb-up, null, null, null, null] +2797 - Ladder - [Climb-down, null, null, null, null] +2798 - Bush - [Search, null, null, null, null] +2799 - Bush - [Search, null, null, null, null] +2800 - Bush - [Search, null, null, null, null] +2801 - Bush - [Search, null, null, null, null] +2802 - Bush - [Search, null, null, null, null] +2803 - Bush - [Search, null, null, null, null] +2804 - Cave entrance - [Enter, null, null, null, null] +2805 - Cave entrance - [Enter, null, null, null, null] +2806 - Cave entrance - [Enter, null, null, null, null] +2807 - Cave entrance - [Enter, null, null, null, null] +2808 - Cave entrance - [Enter, null, null, null, null] +2809 - Cave entrance - [Enter, null, null, null, null] +2810 - Cave entrance - [Enter, null, null, null, null] +2811 - Cave entrance - [Enter, null, null, null, null] +2812 - Ladder - [Climb-down, null, null, null, null] +2813 - Cave entrance - [Enter, null, null, null, null] +2814 - Gate - [Open, null, null, null, null] +2815 - Gate - [Open, null, null, null, null] +2816 - Rock of Dalgroth - [Prospect, Mine, null, null, null] +2817 - Cave exit - [Leave, null, null, null, null] +2818 - Cave exit - [Leave, null, null, null, null] +2819 - Cave exit - [Leave, null, null, null, null] +2820 - Cave exit - [Leave, null, null, null, null] +2821 - Cave exit - [Leave, null, null, null, null] +2822 - Cave exit - [Leave, null, null, null, null] +2823 - Hole - [Climb-down, null, null, null, null] +2824 - Hole - [null, null, null, null, null] +2825 - Climbing rope - [Climb, null, null, null, null] +2826 - Chest - [Open, null, null, null, null] +2827 - Chest - [Open, null, null, null, null] +2828 - null - [Close, null, null, null, null] +2829 - null - [Close, null, null, null, null] +2830 - Gap - [Jump-Over, null, null, null, null] +2831 - Gap - [Jump-Over, null, null, null, null] +2832 - Battlement - [Climb-over, null, null, null, null] +2833 - Ladder - [Climb-up, null, null, null, null] +2834 - Broken Bridge - [Cross, null, null, null, null] +2835 - Rock - [Search, null, null, null, null] +2836 - Rock - [Search, null, null, null, null] +2837 - Rock - [Search, null, null, null, null] +2838 - null - [null, null, null, null, null] +2839 - null - [null, null, null, null, null] +2840 - null - [null, null, null, null, null] +2841 - Bed - [null, null, null, null, null] +2842 - Magical shield - [null, null, null, null, null] +2843 - null - [null, null, null, null, null] +2844 - Sewer valve - [Turn-left, Turn-right, null, null, null] +2845 - Sewer valve - [Turn-left, Turn-right, null, null, null] +2846 - Sewer valve - [Turn-left, Turn-right, null, null, null] +2847 - Sewer valve - [Turn-left, Turn-right, null, null, null] +2848 - Sewer valve - [Turn-left, Turn-right, null, null, null] +2849 - Raft - [Board, null, null, null, null] +2850 - Cupboard - [Open, null, null, null, null] +2851 - Cupboard - [Search, Shut, null, null, null] +2852 - Cave entrance - [Enter, null, null, null, null] +2853 - Stairs - [Climb-up, null, null, null, null] +2854 - Wall - [Knock-at, null, null, null, null] +2855 - null - [null, null, null, null, null] +2856 - Chest - [Open, null, null, null, null] +2857 - Chest - [Search, Close, null, null, null] +2858 - Crate - [Search, null, null, null, null] +2859 - Range - [null, null, null, null, null] +2860 - Hazeel's coffin - [null, null, null, null, null] +2861 - Door - [Open, null, null, null, null] +2862 - Door - [Open, null, null, null, null] +2863 - Door - [Open, null, null, null, null] +2864 - Fountain - [null, Check, null, null, null] +2865 - Gate - [Open, null, null, null, null] +2866 - Gate - [Open, null, null, null, null] +2867 - Potted plant - [Look-under, null, null, null, null] +2868 - Cupboard - [Open, null, null, null, null] +2869 - Cupboard - [Search, Shut, null, null, null] +2870 - null - [null, null, null, null, null] +2871 - Ladder - [Climb-down, null, null, null, null] +2872 - Ladder - [Climb-up, null, null, null, null] +2873 - Statue of Saradomin - [Pray at, null, null, null, null] +2874 - Statue of Zamorak - [Pray at, null, null, null, null] +2875 - Statue of Guthix - [Pray at, null, null, null, null] +2876 - Counter - [null, null, null, null, null] +2877 - Barrel - [null, null, null, null, null] +2878 - Sparkling pool - [Step-into, null, null, null, null] +2879 - Sparkling pool - [Step-into, null, null, null, null] +2880 - Mystic portal - [Walk-through, null, null, null, null] +2881 - Prison Door - [Open, null, null, null, null] +2882 - Gate - [Open, null, null, Pay-toll(10gp), null] +2883 - Gate - [Open, null, null, Pay-toll(10gp), null] +2884 - Ladder - [Climb, Climb-up, Climb-down, null, null] +2885 - Cupboard - [Open, null, null, null, null] +2886 - Open Cupboard - [null, Search, Shut, null, null] +2887 - Jungle Tree - [Chop-down, null, hidden, null, null] +2888 - Jungle Palm - [null, null, null, null, null] +2889 - Jungle Tree - [Chop-down, null, hidden, null, null] +2890 - Jungle Tree - [Chop-down, null, hidden, null, null] +2891 - Tree stump - [null, null, null, null, null] +2892 - Jungle Bush - [Chop-down, null, hidden, null, null] +2893 - Jungle Bush - [Chop-down, null, hidden, null, null] +2894 - Slashed bush - [null, null, null, null, null] +2895 - Slashed bush - [null, null, null, null, null] +2896 - Legends Guild door - [Open, null, null, null, null] +2897 - Legends Guild door - [Open, null, null, null, null] +2898 - null - [null, null, null, null, null] +2899 - null - [null, null, null, null, null] +2900 - Bed - [null, null, null, null, null] +2901 - Sir Palomedes - [Talk-to, null, null, null, null] +2902 - Rocks - [Search, null, null, null, null] +2903 - Cave entrance - [Walk through, null, null, null, null] +2904 - Cave entrance - [Walk through, null, null, null, null] +2905 - Crate - [Look, Search, null, null, null] +2906 - Table - [Look-at, Search, null, null, null] +2907 - Bed - [null, Search, null, null, null] +2908 - Fire Wall - [Touch, Investigate, null, null, null] +2909 - Fire Wall - [Touch, Investigate, null, null, null] +2910 - Desk - [Look, Search, null, null, null] +2911 - Bookcase - [Look, Search, null, null, null] +2912 - Ancient Gate - [Open, Search, null, null, null] +2913 - Ancient Gate - [Open, Search, null, null, null] +2914 - null - [null, null, null, null, null] +2915 - null - [null, null, null, null, null] +2916 - Rocks - [Mine, Prospect, hidden, null, null] +2917 - null - [null, null, null, null, null] +2918 - Crevice - [Look-at, Search, null, null, null] +2919 - Boulder - [Smash-to-bits, null, null, null, null] +2920 - Boulder - [Smash-to-bits, null, null, null, null] +2921 - Boulder - [Smash-to-bits, null, null, null, null] +2922 - Ancient Gate - [Open, null, null, null, null] +2923 - Ancient Gate - [Open, null, null, null, null] +2924 - Ancient Gate - [null, null, null, null, null] +2925 - Ancient Gate - [null, null, null, null, null] +2926 - Jagged wall - [Look, Jump-over, null, null, null] +2927 - Marked wall - [Use, Search, null, null, null] +2928 - Carved rock - [Look, Search, null, null, null] +2929 - Buried skeleton - [Search, null, null, null, null] +2930 - Ancient Gate - [Open, Search, null, null, null] +2931 - Ancient Gate - [null, null, null, null, null] +2932 - Barrel - [Smash, null, null, null, null] +2933 - null - [null, null, null, null, null] +2934 - Winch - [Search, null, null, null, null] +2935 - Winch - [Climb-down, null, null, null, null] +2936 - Totem Pole - [Look, null, null, null, null] +2937 - Totem Pole - [Look, null, null, null, null] +2938 - Totem Pole - [Look, null, null, null, null] +2939 - Totem Pole - [Look, null, null, null, null] +2940 - Table - [null, null, null, null, null] +2941 - Sacred water - [Look, null, null, null, null] +2942 - Water Pool - [Look, Investigate, null, null, null] +2943 - Polluted water - [Look, null, null, null, null] +2944 - Tall Reeds - [Look, Search, null, null, null] +2945 - Yommi tree baby - [null, null, null, null, null] +2946 - Yommi tree sapling - [null, null, null, null, null] +2947 - Dead Yommi sapling - [null, null, null, null, null] +2948 - Adult Yommi tree - [null, null, null, null, null] +2949 - Dead Yommi - [null, null, null, null, null] +2950 - Felled Yommi tree - [null, null, null, null, null] +2951 - Rotten Yommi - [null, null, null, null, null] +2952 - Trimmed Yommi - [null, null, null, null, null] +2953 - Rotten Yommi tree - [null, null, null, null, null] +2954 - Totem pole - [Lift, null, null, null, null] +2955 - Rotten Totem pole - [null, null, null, null, null] +2956 - Fertile Soil - [null, null, null, null, null] +2957 - Damaged Earth - [null, null, null, null, null] +2958 - Climbing rope - [Climb, null, null, null, null] +2959 - Rocky Ledge - [Climb-over, null, null, null, null] +2960 - Rocky Ledge - [Climb-over, null, null, null, null] +2961 - Rocky Ledge - [Climb-over, null, null, null, null] +2962 - Rocks - [Climb-over, null, null, null, null] +2963 - Rocks - [Climb-over, null, null, null, null] +2964 - Rocks - [Climb-over, null, null, null, null] +2965 - Mossy rock - [Search, null, null, null, null] +2966 - Furnace - [Look, Search, null, null, null] +2967 - null - [null, null, null, null, null] +2968 - null - [null, null, null, null, null] +2969 - Recess - [Search, null, null, null, null] +2970 - Filled Recess - [Search, null, null, null, null] +2971 - Shimmering field - [Walk-through, Look, null, null, null] +2972 - Boulder - [Smash-to-bits, null, null, null, null] +2973 - Boulder - [Smash-to-bits, null, null, null, null] +2974 - Boulder - [Smash-to-bits, null, null, null, null] +2975 - Leafy Palm Tree - [Shake, null, null, null, null] +2976 - Leafy Palm Tree - [null, null, null, null, null] +2977 - Sand - [Look, null, null, null, null] +2978 - Sand - [Look, null, null, null, null] +2979 - Sand - [Look, null, null, null, null] +2980 - Flowers - [null, null, null, null, null] +2981 - Flowers - [null, null, null, null, null] +2982 - Flowers - [null, null, null, null, null] +2983 - Flowers - [null, null, null, null, null] +2984 - Flowers - [null, null, null, null, null] +2985 - Flowers - [null, null, null, null, null] +2986 - Flowers - [null, null, null, null, null] +2987 - Flowers - [null, null, null, null, null] +2988 - Flowers - [null, null, null, null, null] +2989 - Vine - [Check, null, null, null, null] +2990 - Vine - [Check, null, null, null, null] +2991 - Vine - [Check, null, null, null, null] +2992 - Vine - [Check, null, null, null, null] +2993 - Vine - [Check, null, null, null, null] +2994 - Vine - [Check, null, null, null, null] +2995 - Closed chest - [Open, null, null, null, null] +2996 - Closed chest - [Open, null, null, null, null] +2997 - Door - [Open, null, null, null, null] +2998 - Door - [Close, null, null, null, null] +2999 - null - [null, null, null, null, null] +3000 - Timber defence - [null, null, null, null, null] +3001 - null - [null, null, null, null, null] +3002 - null - [null, null, null, null, null] +3003 - null - [null, null, null, null, null] +3004 - null - [null, null, null, null, null] +3005 - null - [null, null, null, null, null] +3006 - null - [null, null, null, null, null] +3007 - null - [null, null, null, null, null] +3008 - null - [null, null, null, null, null] +3009 - null - [null, null, null, null, null] +3010 - null - [null, null, null, null, null] +3011 - null - [null, null, null, null, null] +3012 - null - [null, null, null, null, null] +3013 - null - [null, null, null, null, null] +3014 - Door - [Open, null, null, null, null] +3015 - Gate - [Open, null, null, null, null] +3016 - Gate - [Open, null, null, null, null] +3017 - Door - [Open, null, null, null, null] +3018 - Door - [Open, null, null, null, null] +3019 - Door - [Open, null, null, null, null] +3020 - Gate - [Open, null, null, null, null] +3021 - Gate - [Open, null, null, null, null] +3022 - Gate - [Open, null, null, null, null] +3023 - Gate - [Open, null, null, null, null] +3024 - Door - [Open, null, null, null, null] +3025 - Door - [Open, null, null, null, null] +3026 - Door - [Open, null, null, null, null] +3027 - Door - [Open, null, null, null, null] +3028 - Ladder - [Climb-up, null, null, null, null] +3029 - Ladder - [Climb-down, null, null, null, null] +3030 - Ladder - [Climb-up, null, null, null, null] +3031 - Ladder - [Climb-down, null, null, null, null] +3032 - Fishing spot - [Net, null, hidden, null, null] +3033 - Tree - [Chop down, null, hidden, null, null] +3034 - Tree - [Chop down, null, hidden, null, null] +3035 - Tree - [Chop down, null, hidden, null, null] +3036 - Tree - [Chop down, null, hidden, null, null] +3037 - Oak - [Chop down, null, hidden, null, null] +3038 - Fire - [null, null, null, null, null] +3039 - Range - [Use, null, null, null, null] +3040 - Cupboard - [Open, null, null, null, null] +3041 - Cupboard - [Search, Shut, null, null, null] +3042 - Rocks - [Mine, Prospect, null, null, null] +3043 - Rocks - [Mine, Prospect, null, null, null] +3044 - Furnace - [Use, null, null, null, null] +3045 - Bank booth - [Use, null, null, null, null] +3046 - Timber defence - [null, null, null, null, null] +3047 - null - [null, null, null, null, null] +3048 - null - [null, null, null, null, null] +3049 - null - [null, null, null, null, null] +3050 - null - [null, null, null, null, null] +3051 - null - [null, null, null, null, null] +3052 - null - [null, null, null, null, null] +3053 - null - [null, null, null, null, null] +3054 - null - [null, null, null, null, null] +3055 - null - [null, null, null, null, null] +3056 - null - [null, null, null, null, null] +3057 - null - [null, null, null, null, null] +3058 - null - [null, null, null, null, null] +3059 - null - [null, null, null, null, null] +3060 - null - [null, null, null, null, null] +3061 - null - [null, null, null, null, null] +3062 - null - [null, null, null, null, null] +3063 - null - [null, null, null, null, null] +3064 - null - [null, null, null, null, null] +3065 - null - [null, null, null, null, null] +3066 - null - [null, null, null, null, null] +3067 - null - [null, null, null, null, null] +3068 - null - [null, null, null, null, null] +3069 - null - [null, null, null, null, null] +3070 - null - [null, null, null, null, null] +3071 - null - [null, null, null, null, null] +3072 - null - [null, null, null, null, null] +3073 - null - [null, null, null, null, null] +3074 - null - [null, null, null, null, null] +3075 - null - [null, null, null, null, null] +3076 - null - [null, null, null, null, null] +3077 - Wall - [null, null, null, null, Lean against] +3078 - Wall - [null, null, null, null, Lean against] +3079 - Wall - [null, null, null, null, Lean against] +3080 - null - [null, null, null, null, null] +3081 - null - [null, null, null, null, null] +3082 - Wall - [null, null, null, null, Lean against] +3083 - Wall - [null, null, null, null, Lean against] +3084 - null - [null, null, null, null, null] +3085 - null - [null, null, null, null, null] +3086 - null - [null, null, null, null, null] +3087 - null - [null, null, null, null, null] +3088 - null - [null, null, null, null, null] +3089 - null - [null, null, null, null, null] +3090 - null - [null, null, null, null, null] +3091 - null - [null, null, null, null, null] +3092 - null - [null, null, null, null, null] +3093 - null - [null, null, null, null, null] +3094 - null - [null, null, null, null, null] +3095 - null - [null, null, null, null, null] +3096 - null - [null, null, null, null, null] +3097 - null - [null, null, null, null, null] +3098 - null - [null, null, null, null, null] +3099 - null - [null, null, null, null, null] +3100 - null - [null, null, null, null, null] +3101 - null - [null, null, null, null, null] +3102 - null - [null, null, null, null, null] +3103 - null - [null, null, null, null, null] +3104 - null - [null, null, null, null, null] +3105 - null - [null, null, null, null, null] +3106 - null - [null, null, null, null, null] +3107 - null - [null, null, null, null, null] +3108 - Entrance - [Forfeit, null, null, null, null] +3109 - Entrance - [Forfeit, null, null, null, null] +3110 - null - [null, null, null, null, null] +3111 - Entrance - [Forfeit, null, null, null, null] +3112 - Entrance - [Forfeit, null, null, null, null] +3113 - Entrance - [Forfeit, null, null, null, null] +3114 - Entrance - [Forfeit, null, null, null, null] +3115 - null - [null, null, null, null, null] +3116 - null - [null, null, null, null, null] +3117 - null - [null, null, null, null, null] +3118 - null - [null, null, null, null, null] +3119 - null - [null, null, null, null, null] +3120 - null - [null, null, null, null, null] +3121 - null - [null, null, null, null, null] +3122 - null - [null, null, null, null, null] +3123 - null - [null, null, null, null, null] +3124 - null - [null, null, null, null, null] +3125 - null - [null, null, null, null, null] +3126 - null - [null, null, null, null, null] +3127 - null - [null, null, null, null, null] +3128 - null - [null, null, null, null, null] +3129 - null - [null, null, null, null, null] +3130 - null - [null, null, null, null, null] +3131 - null - [null, null, null, null, null] +3132 - null - [null, null, null, null, null] +3133 - null - [null, null, null, null, null] +3134 - null - [null, null, null, null, null] +3135 - null - [null, null, null, null, null] +3136 - null - [null, null, null, null, null] +3137 - null - [null, null, null, null, null] +3138 - null - [null, null, null, null, null] +3139 - null - [null, null, null, null, null] +3140 - null - [null, null, null, null, null] +3141 - null - [null, null, null, null, null] +3142 - null - [null, null, null, null, null] +3143 - null - [null, null, null, null, null] +3144 - null - [null, null, null, null, null] +3145 - null - [null, null, null, null, null] +3146 - null - [null, null, null, null, null] +3147 - null - [null, null, null, null, null] +3148 - null - [null, null, null, null, null] +3149 - null - [null, null, null, null, null] +3150 - null - [null, null, null, null, null] +3151 - null - [null, null, null, null, null] +3152 - null - [null, null, null, null, null] +3153 - null - [null, null, null, null, null] +3154 - null - [null, null, null, null, null] +3155 - null - [null, null, null, null, null] +3156 - null - [null, null, null, null, null] +3157 - null - [null, null, null, null, null] +3158 - null - [null, null, null, null, null] +3159 - Bed - [null, null, null, null, null] +3160 - null - [null, null, null, null, null] +3161 - null - [null, null, null, null, null] +3162 - null - [null, null, null, null, null] +3163 - null - [null, null, null, null, null] +3164 - null - [null, null, null, null, null] +3165 - null - [null, null, null, null, null] +3166 - null - [null, null, null, null, null] +3167 - null - [null, null, null, null, null] +3168 - null - [null, null, null, null, null] +3169 - null - [null, null, null, null, null] +3170 - null - [null, null, null, null, null] +3171 - null - [null, null, null, null, null] +3172 - null - [null, null, null, null, null] +3173 - null - [null, null, null, null, null] +3174 - null - [null, null, null, null, null] +3175 - null - [null, null, null, null, null] +3176 - null - [null, null, null, null, null] +3177 - null - [null, null, null, null, null] +3178 - null - [null, null, null, null, null] +3179 - null - [null, null, null, null, null] +3180 - null - [null, null, null, null, null] +3181 - null - [null, null, null, null, null] +3182 - Chair - [null, null, null, null, null] +3183 - Hospital shelves - [null, null, null, null, null] +3184 - Hospital shelves - [null, null, null, null, null] +3185 - Hospital shelves - [null, null, null, null, null] +3186 - Operating Table - [null, null, null, null, null] +3187 - Operating Table - [null, null, null, null, null] +3188 - null - [null, null, null, null, null] +3189 - null - [null, null, null, null, null] +3190 - Drawers - [Open, null, null, null, null] +3191 - Drawers - [null, null, Shut, null, null] +3192 - Scoreboard - [View, null, null, null, null] +3193 - Closed bank chest - [Open, null, null, null, null] +3194 - Bank chest - [null, Bank, Shut, null, null] +3195 - Crate - [Buy, null, null, null, null] +3196 - Damaged armour - [null, null, null, null, null] +3197 - Gate - [Open, null, null, null, null] +3198 - Gate - [Open, null, null, null, null] +3199 - Bed - [null, null, null, null, null] +3200 - null - [null, null, null, null, null] +3201 - null - [null, null, null, null, null] +3202 - null - [null, null, null, null, null] +3203 - Trapdoor - [Forfeit, null, null, null, null] +3204 - null - [null, null, null, null, null] +3205 - Ladder - [Climb-down, null, null, null, null] +3206 - Barrel - [null, null, null, null, null] +3207 - null - [null, null, null, null, null] +3208 - null - [null, null, null, null, null] +3209 - Odd looking wall - [Push, null, null, null, null] +3210 - Odd looking wall - [null, null, null, null, null] +3211 - Odd looking wall - [Push, null, null, null, null] +3212 - Odd looking wall - [null, null, null, null, null] +3213 - Cave entrance - [Enter, null, null, null, null] +3214 - Underground Pass Exit - [Leave, null, null, null, null] +3215 - null - [null, null, null, null, null] +3216 - Mud - [null, null, null, null, null] +3217 - Cave - [Enter, null, null, null, null] +3218 - Tunnel - [Pass-through, null, null, null, null] +3219 - Tunnel - [Pass-through, null, null, null, null] +3220 - Door - [Open, null, null, null, null] +3221 - Door - [Open, null, null, null, null] +3222 - Cave Stairs - [Descend, null, null, null, null] +3223 - Cave Stairs - [Ascend, null, null, null, null] +3224 - Cave - [Enter, null, null, null, null] +3225 - null - [null, null, null, null, null] +3226 - null - [null, null, null, null, null] +3227 - Trap - [null, null, null, null, null] +3228 - Trap - [null, null, null, null, null] +3229 - Trap - [null, null, null, null, null] +3230 - Flat rock - [Search, null, null, null, null] +3231 - Plank - [null, null, null, null, null] +3232 - Stalagmites - [null, null, null, null, null] +3233 - Trap - [null, null, null, null, null] +3234 - Odd markings - [Search, null, null, null, null] +3235 - Obstacle pipe - [Squeeze-through, null, null, null, null] +3236 - Obstacle pipe - [Squeeze-through, null, null, null, null] +3237 - Obstacle pipe - [Squeeze-through, null, null, null, null] +3238 - Ledge - [Cross, null, null, null, null] +3239 - Bridge - [null, null, null, null, null] +3240 - Bridge - [null, null, null, null, null] +3241 - Lever - [Pull, null, null, null, null] +3242 - Lever - [null, null, null, null, null] +3243 - Platform - [null, null, null, null, null] +3244 - Platform - [null, null, null, null, null] +3245 - Platform - [null, null, null, null, null] +3246 - Platform - [null, null, null, null, null] +3247 - Bridge - [null, null, null, null, null] +3248 - Bridge - [null, null, null, null, null] +3249 - Bridge - [null, null, null, null, null] +3250 - Bridge - [null, null, null, null, null] +3251 - null - [null, null, null, null, null] +3252 - null - [null, null, null, null, null] +3253 - null - [null, null, null, null, null] +3254 - Bridge - [Cross, null, null, null, null] +3255 - Bridge - [Cross, null, null, null, null] +3256 - null - [null, null, null, null, null] +3257 - Platform - [null, null, null, null, null] +3258 - Bridge - [null, null, null, null, null] +3259 - Bridge - [null, null, null, null, null] +3260 - Bridge - [null, null, null, null, null] +3261 - null - [null, null, null, null, null] +3262 - null - [null, null, null, null, null] +3263 - Swamp - [Cross, null, null, null, null] +3264 - Well - [Climb-down, null, null, null, null] +3265 - Pile of rocks - [Climb, null, null, null, null] +3266 - Cage - [Pick-lock, Search, null, null, null] +3267 - Cage - [null, Search, null, null, null] +3268 - Cage - [Pick-lock, Search, null, null, null] +3269 - null - [null, null, null, null, null] +3270 - Door - [Open, Knock, null, null, null] +3271 - Door - [Close, null, null, null, null] +3272 - Chest - [Open, null, null, null, null] +3273 - Chest - [Search, null, null, null, null] +3274 - Chest - [Open, null, null, null, null] +3275 - null - [null, null, null, null, null] +3276 - Stone bridge - [Cross, null, null, null, null] +3277 - null - [null, null, null, null, null] +3278 - null - [null, null, null, null, null] +3279 - null - [null, null, null, null, null] +3280 - null - [null, null, null, null, null] +3281 - null - [null, null, null, null, null] +3282 - null - [null, null, null, null, null] +3283 - null - [null, null, null, null, null] +3284 - null - [null, null, null, null, null] +3285 - null - [null, null, null, null, null] +3286 - null - [null, null, null, null, null] +3287 - null - [null, null, null, null, null] +3288 - null - [null, null, null, null, null] +3289 - null - [null, null, null, null, null] +3290 - null - [null, null, null, null, null] +3291 - null - [null, null, null, null, null] +3292 - null - [null, null, null, null, null] +3293 - null - [null, null, null, null, null] +3294 - Furnace - [null, null, null, null, null] +3295 - Stone tablet - [Read, null, null, null, null] +3296 - Stone tablet - [Read, null, null, null, null] +3297 - Stone tablet - [Read, null, null, null, null] +3298 - Stone tablet - [Read, null, null, null, null] +3299 - Stone tablet - [Read, null, null, null, null] +3300 - Stone tablet - [null, null, null, null, null] +3301 - Stone tablet - [Read, null, null, null, null] +3302 - Stone tablet - [Read, null, null, null, null] +3303 - Portcullis - [null, null, null, null, null] +3304 - Portcullis - [null, null, null, null, null] +3305 - Well - [Search, null, null, null, null] +3306 - null - [null, null, null, null, null] +3307 - Rockpile - [Climb, null, null, null, null] +3308 - Smashed cage - [Search, null, null, null, null] +3309 - Rockslide - [Climb-over, null, null, null, null] +3310 - null - [null, null, null, null, null] +3311 - null - [null, null, null, null, null] +3312 - null - [null, null, null, null, null] +3313 - null - [null, null, null, null, null] +3314 - null - [null, null, null, null, null] +3315 - null - [null, null, null, null, null] +3316 - null - [null, null, null, null, null] +3317 - null - [null, null, null, null, null] +3318 - null - [null, null, null, null, null] +3319 - null - [null, null, null, null, null] +3320 - null - [null, null, null, null, null] +3321 - null - [null, null, null, null, null] +3322 - null - [null, null, null, null, null] +3323 - null - [null, null, null, null, null] +3324 - null - [null, null, null, null, null] +3325 - null - [null, null, null, null, null] +3326 - null - [null, null, null, null, null] +3327 - Eerie statue - [null, null, null, null, null] +3328 - Dwarf statue - [null, null, null, null, null] +3329 - null - [null, null, null, null, null] +3330 - null - [null, null, null, null, null] +3331 - null - [null, null, null, null, null] +3332 - Temple door - [null, null, null, null, null] +3333 - Door - [Open, null, null, null, null] +3334 - Door - [Open, null, null, null, null] +3335 - Door - [null, null, null, null, null] +3336 - Door - [null, null, null, null, null] +3337 - Lever - [Pull, null, null, null, null] +3338 - Hanging log - [null, null, null, null, null] +3339 - Flat rock - [Search, null, null, null, null] +3340 - Guide rope - [Fire-at, null, null, null, null] +3341 - Guide rope - [null, null, null, null, null] +3342 - null - [null, null, null, null, null] +3343 - Rock pile - [Climb-over, null, null, null, null] +3344 - Barrel - [null, null, null, null, null] +3345 - null - [null, null, null, null, null] +3346 - null - [null, null, null, null, null] +3347 - null - [null, null, null, null, null] +3348 - Iban's Throne - [null, null, null, null, null] +3349 - null - [null, null, null, null, null] +3350 - null - [null, null, null, null, null] +3351 - Cage - [Search, null, null, null, null] +3352 - Cage - [Search, null, null, null, null] +3353 - Tomb - [Search, null, null, null, null] +3354 - Tomb - [Search, null, null, null, null] +3355 - null - [null, null, null, null, null] +3356 - null - [null, null, null, null, null] +3357 - null - [null, null, null, null, null] +3358 - null - [null, null, null, null, null] +3359 - Well - [null, null, null, null, null] +3360 - Crate - [Search, null, null, null, null] +3361 - null - [null, null, null, null, null] +3362 - Window - [Search, null, null, null, null] +3363 - null - [null, null, null, null, null] +3364 - Rock - [null, null, null, null, null] +3365 - Protruding rocks - [Climb, null, null, null, null] +3366 - Onion - [null, Pick, null, null, null] +3367 - Prison Door - [Open, null, null, null, null] +3368 - null - [null, null, null, null, null] +3369 - null - [null, null, null, null, null] +3370 - null - [null, null, null, null, null] +3371 - Achey Tree stump - [null, null, null, null, null] +3372 - Ogre spit-roast - [null, null, null, null, null] +3373 - Ogre spit-roast - [null, null, null, null, null] +3374 - Ogre spit-roast - [null, null, null, null, null] +3375 - Ogre spit-roast - [null, null, null, null, null] +3376 - Ogre bench - [null, null, null, null, null] +3377 - Locked Ogre chest - [Unlock, null, null, null, null] +3378 - Unlocked Ogre chest - [Search, null, null, null, null] +3379 - Cave entrance - [Enter, null, null, null, null] +3380 - Cave exit - [Walk through, null, null, null, null] +3381 - Cave exit - [Walk through, null, null, null, null] +3382 - Ogre spit-roast - [null, null, null, null, null] +3383 - Ogre spit-roast - [null, null, null, null, null] +3384 - null - [null, null, null, null, null] +3385 - null - [null, null, null, null, null] +3386 - null - [null, null, null, null, null] +3387 - null - [null, null, null, null, null] +3388 - null - [null, null, null, null, null] +3389 - null - [null, null, null, null, null] +3390 - null - [null, null, null, null, null] +3391 - null - [null, null, null, null, null] +3392 - null - [null, null, null, null, null] +3393 - null - [null, null, null, null, null] +3394 - Crate - [Search, null, null, null, null] +3395 - Crate - [Search, null, null, null, null] +3396 - Boxes - [Search, null, null, null, null] +3397 - Boxes - [Search, null, null, null, null] +3398 - Crate - [Search, null, null, null, null] +3399 - Crate - [Search, null, null, null, null] +3400 - Crate - [Search, null, null, null, null] +3401 - Crate - [Search, null, null, null, null] +3402 - Workbench - [null, null, null, null, null] +3403 - null - [null, null, null, null, null] +3404 - null - [null, null, null, null, null] +3405 - null - [null, null, null, null, null] +3406 - Lever - [Pull, null, null, null, null] +3407 - null - [null, null, null, null, null] +3408 - Water wheel - [null, null, null, null, null] +3409 - Lever - [Pull, null, null, null, null] +3410 - null - [null, null, null, null, null] +3411 - null - [null, null, null, null, null] +3412 - null - [null, null, null, null, null] +3413 - null - [null, null, null, null, null] +3414 - null - [null, null, null, null, null] +3415 - Staircase - [Climb-down, null, null, null, null] +3416 - Staircase - [Climb-up, null, null, null, null] +3417 - Lever - [null, null, null, null, null] +3418 - null - [null, null, null, null, null] +3419 - null - [null, null, null, null, null] +3420 - null - [null, null, null, null, null] +3421 - null - [null, null, null, null, null] +3422 - Machinery - [null, null, null, null, null] +3423 - null - [null, null, null, null, null] +3424 - null - [null, null, null, null, null] +3425 - null - [null, null, null, null, null] +3426 - null - [null, null, null, null, null] +3427 - null - [null, null, null, null, null] +3428 - null - [null, null, null, null, null] +3429 - null - [null, null, null, null, null] +3430 - null - [null, null, null, null, null] +3431 - Rocks - [Mine, Prospect, hidden, null, null] +3432 - Trapdoor - [Open, null, null, null, null] +3433 - Trapdoor - [Climb-down, Close, null, null, null] +3434 - null - [null, null, null, null, null] +3435 - null - [null, null, null, null, null] +3436 - null - [null, null, null, null, null] +3437 - null - [null, null, null, null, null] +3438 - null - [null, null, null, null, null] +3439 - null - [null, null, null, null, null] +3440 - Stairs - [Use, null, null, null, null] +3441 - Stairs - [Use, null, null, null, null] +3442 - null - [null, null, null, null, null] +3443 - Holy barrier - [Pass-through, null, null, null, null] +3444 - Gate - [Open, null, null, null, null] +3445 - Gate - [Open, null, null, null, null] +3446 - null - [null, null, null, null, null] +3447 - null - [null, null, null, null, null] +3448 - null - [null, null, null, null, null] +3449 - null - [null, null, null, null, null] +3450 - null - [null, null, null, null, null] +3451 - null - [null, null, null, null, null] +3452 - null - [null, null, null, null, null] +3453 - null - [null, null, null, null, null] +3454 - null - [null, null, null, null, null] +3455 - null - [null, null, null, null, null] +3456 - null - [null, null, null, null, null] +3457 - null - [null, null, null, null, null] +3458 - null - [null, null, null, null, null] +3459 - null - [null, null, null, null, null] +3460 - null - [null, null, null, null, null] +3461 - null - [null, null, null, null, null] +3462 - null - [null, null, null, null, null] +3463 - Cell door - [Open, Talk-through, null, null, null] +3464 - null - [null, null, null, null, null] +3465 - null - [null, null, null, null, null] +3466 - Hanging meat - [null, null, null, null, null] +3467 - Hanging meat - [null, null, null, null, null] +3468 - null - [null, null, null, null, null] +3469 - null - [null, null, null, null, null] +3470 - null - [null, null, null, null, null] +3471 - null - [null, null, null, null, null] +3472 - null - [null, null, null, null, null] +3473 - null - [null, null, null, null, null] +3474 - null - [null, null, null, null, null] +3475 - null - [null, null, null, null, null] +3476 - null - [null, null, null, null, null] +3477 - null - [null, null, null, null, null] +3478 - null - [null, null, null, null, null] +3479 - Statue - [null, null, null, null, null] +3480 - null - [null, null, null, null, null] +3481 - null - [null, null, null, null, null] +3482 - null - [null, null, null, null, null] +3483 - null - [null, null, null, null, null] +3484 - null - [null, null, null, null, null] +3485 - Well - [Search, null, null, null, null] +3486 - null - [null, null, null, null, null] +3487 - null - [null, null, null, null, null] +3488 - null - [null, null, null, null, null] +3489 - null - [null, null, null, null, null] +3490 - null - [null, null, null, null, null] +3491 - null - [null, null, null, null, null] +3492 - null - [null, null, null, null, null] +3493 - Monument - [Study, Take-from, null, null, null] +3494 - Monument - [Study, Take-from, null, null, null] +3495 - Monument - [Study, Take-from, null, null, null] +3496 - Monument - [Study, Take-from, null, null, null] +3497 - Monument - [Study, Take-from, null, null, null] +3498 - Monument - [Study, Take-from, null, null, null] +3499 - Monument - [Study, Take-from, null, null, null] +3500 - Church organ - [Play, null, null, null, null] +3501 - null - [null, null, null, null, null] +3502 - null - [null, null, null, null, null] +3503 - null - [null, null, null, null, null] +3504 - null - [null, null, null, null, null] +3505 - null - [null, null, null, null, null] +3506 - Gate - [Open, null, null, null, null] +3507 - Gate - [Open, null, null, null, null] +3508 - Rotting log - [null, null, null, null, null] +3509 - Fungi on log - [null, Pick, null, null, null] +3510 - Rotting branch - [null, null, null, null, null] +3511 - Budding branch - [null, Take-cutting, null, null, null] +3512 - A small bush - [null, null, null, null, null] +3513 - A golden pear bush - [null, Pick, null, null, null] +3514 - Rotting tree - [null, null, null, null, null] +3515 - null - [null, null, null, null, null] +3516 - Grotto - [Enter, null, null, null, null] +3517 - Grotto tree - [Look-at, Search, null, null, null] +3518 - null - [null, null, null, null, null] +3519 - null - [null, null, null, null, null] +3520 - Grotto - [Search, null, null, null, null] +3521 - Altar of nature - [Pray-at, null, null, null, null] +3522 - Bridge - [Jump, null, null, null, null] +3523 - Bench - [null, null, null, null, null] +3524 - null - [null, null, null, null, null] +3525 - Grotto - [Exit, null, null, null, null] +3526 - Grotto - [Exit, null, null, null, null] +3527 - Stone - [null, null, null, null, Search] +3528 - Stone - [null, null, null, null, Search] +3529 - Stone - [null, null, null, null, Search] +3530 - null - [null, null, null, null, null] +3531 - null - [null, null, null, null, null] +3532 - null - [null, null, null, null, null] +3533 - null - [null, null, null, null, null] +3534 - null - [null, null, null, null, null] +3535 - null - [null, null, null, null, null] +3536 - null - [null, null, null, null, null] +3537 - null - [null, null, null, null, null] +3538 - null - [null, null, null, null, null] +3539 - null - [null, null, null, null, null] +3540 - null - [null, null, null, null, null] +3541 - null - [null, null, null, null, null] +3542 - null - [null, null, null, null, null] +3543 - null - [null, null, null, null, null] +3544 - null - [null, null, null, null, null] +3545 - null - [null, null, null, null, null] +3546 - Old well - [Climb-down, null, null, null, null] +3547 - null - [null, null, null, null, null] +3548 - null - [null, null, null, null, null] +3549 - null - [null, null, null, null, null] +3550 - null - [null, null, null, null, null] +3551 - Balancing rope - [Walk-on, null, null, null, null] +3552 - Balancing rope - [null, null, null, null, null] +3553 - Log balance - [Walk-on, null, null, null, null] +3554 - Log balance - [null, null, null, null, null] +3555 - Log balance - [Walk-on, null, null, null, null] +3556 - Log balance - [null, null, null, null, null] +3557 - Log balance - [Walk-on, null, null, null, null] +3558 - Log balance - [null, null, null, null, null] +3559 - Balancing ledge - [Walk-across, null, null, null, null] +3560 - Balancing ledge - [null, null, null, null, null] +3561 - Balancing ledge - [Walk-across, null, null, null, null] +3562 - Balancing ledge - [null, null, null, null, null] +3563 - Monkey bars - [null, null, null, null, null] +3564 - Monkey bars - [Swing-across, null, null, null, null] +3565 - Low wall - [Climb-over, null, null, null, null] +3566 - Rope swing - [Swing-on, null, null, null, null] +3567 - Blade - [null, null, null, null, null] +3568 - Blade - [null, null, null, null, null] +3569 - Blade - [null, null, null, null, null] +3570 - Plank - [Walk-on, null, null, null, null] +3571 - Plank - [Walk-on, null, null, null, null] +3572 - Plank - [Walk-on, null, null, null, null] +3573 - Plank - [null, null, null, null, null] +3574 - Plank - [null, null, null, null, null] +3575 - Plank - [null, null, null, null, null] +3576 - Plank - [null, null, null, null, null] +3577 - Plank - [null, null, null, null, null] +3578 - Pillar - [Jump-on, null, null, null, null] +3579 - Pillar - [null, null, null, null, null] +3580 - Spinning blades - [null, null, null, null, null] +3581 - Ticket Dispenser - [Tag, null, null, null, null] +3582 - Floor spikes - [null, null, null, null, null] +3583 - Hand holds - [Climb-across, null, null, null, null] +3584 - Hand holds - [null, null, null, null, null] +3585 - Pressure pad - [null, null, null, null, null] +3586 - null - [null, null, null, null, null] +3587 - null - [null, null, null, null, null] +3588 - null - [null, null, null, null, null] +3589 - null - [null, null, null, null, null] +3590 - null - [null, null, null, null, null] +3591 - null - [null, null, null, null, null] +3592 - null - [null, null, null, null, null] +3593 - null - [null, null, null, null, null] +3594 - null - [null, null, null, null, null] +3595 - null - [null, null, null, null, null] +3596 - null - [null, null, null, null, null] +3597 - null - [null, null, null, null, null] +3598 - null - [null, null, null, null, null] +3599 - null - [null, null, null, null, null] +3600 - null - [null, null, null, null, null] +3601 - null - [null, null, null, null, null] +3602 - null - [null, null, null, null, null] +3603 - null - [null, null, null, null, null] +3604 - null - [null, null, null, null, null] +3605 - null - [null, null, null, null, null] +3606 - null - [null, null, null, null, null] +3607 - null - [null, null, null, null, null] +3608 - Ticket Dispenser - [Tag, null, null, null, null] +3609 - null - [null, null, null, null, null] +3610 - Climbing rope - [Climb, null, null, null, null] +3611 - null - [null, null, null, null, null] +3612 - null - [null, null, null, null, null] +3613 - null - [null, null, null, null, null] +3614 - null - [null, null, null, null, null] +3615 - null - [null, null, null, null, null] +3616 - null - [null, null, null, null, null] +3617 - Ladder - [Climb-Down, null, null, null, null] +3618 - Ladder - [Climb-up, null, null, null, null] +3619 - null - [null, null, null, null, null] +3620 - null - [null, null, null, null, null] +3621 - null - [null, null, null, null, null] +3622 - null - [null, null, null, null, null] +3623 - null - [null, null, null, null, null] +3624 - null - [null, null, null, null, null] +3625 - null - [null, null, null, null, null] +3626 - Wall - [Open, null, null, null, null] +3627 - null - [null, null, null, null, null] +3628 - Wall - [Open, null, null, null, null] +3629 - Wall - [Open, null, null, null, null] +3630 - Wall - [Open, null, null, null, null] +3631 - Wall - [Open, null, null, null, null] +3632 - Wall - [Open, null, null, null, null] +3633 - null - [null, null, null, null, null] +3634 - Strange shrine - [Touch, null, null, null, null] +3635 - Chest - [Open, null, null, null, null] +3636 - Chest - [Search, null, null, null, null] +3637 - null - [null, null, null, null, null] +3638 - null - [null, null, null, null, null] +3639 - null - [null, null, null, null, null] +3640 - null - [null, null, null, null, null] +3641 - null - [null, null, null, null, null] +3642 - null - [null, null, null, null, null] +3643 - null - [null, null, null, null, null] +3644 - Spotlight - [null, null, null, null, null] +3645 - null - [null, null, null, null, null] +3646 - null - [null, null, null, null, null] +3647 - null - [null, null, null, null, null] +3648 - null - [null, null, null, null, null] +3649 - null - [null, null, null, null, null] +3650 - null - [null, null, null, null, null] +3651 - null - [null, null, null, null, null] +3652 - null - [null, null, null, null, null] +3653 - null - [null, null, null, null, null] +3654 - null - [null, null, null, null, null] +3655 - null - [null, null, null, null, null] +3656 - null - [null, null, null, null, null] +3657 - null - [null, null, null, null, null] +3658 - null - [null, null, null, null, null] +3659 - null - [null, null, null, null, null] +3660 - null - [null, null, null, null, null] +3661 - null - [null, null, null, null, null] +3662 - Cooking pot - [Search, null, null, null, null] +3663 - null - [null, null, null, null, null] +3664 - null - [null, null, null, null, null] +3665 - Bones - [null, null, null, null, null] +3666 - null - [null, null, null, null, null] +3667 - null - [null, null, null, null, null] +3668 - null - [null, null, null, null, null] +3669 - null - [null, null, null, null, null] +3670 - null - [null, null, null, null, null] +3671 - null - [null, null, null, null, null] +3672 - null - [null, null, null, null, null] +3673 - null - [null, null, null, null, null] +3674 - null - [null, null, null, null, null] +3675 - null - [null, null, null, null, null] +3676 - Stone Mechanism - [null, null, null, null, null] +3677 - Stone Mechanism - [null, null, null, null, null] +3678 - null - [null, null, null, null, null] +3679 - Standard - [null, null, null, null, null] +3680 - Flagpole - [null, null, null, null, null] +3681 - Signpost - [null, null, null, null, null] +3682 - null - [null, null, null, null, null] +3683 - null - [null, null, null, null, null] +3684 - null - [null, null, null, null, null] +3685 - Boxes - [Search, null, null, null, null] +3686 - Boxes - [Search, null, null, null, null] +3687 - Boxes - [Search, null, null, null, null] +3688 - null - [null, null, null, null, null] +3689 - null - [null, null, null, null, null] +3690 - null - [null, null, null, null, null] +3691 - null - [null, null, null, null, null] +3692 - Climbing Rope - [null, null, null, null, null] +3693 - null - [null, null, null, null, null] +3694 - Crate - [null, null, null, null, null] +3695 - null - [null, null, null, null, null] +3696 - Suit of armour - [null, null, null, null, null] +3697 - Barrel - [null, null, null, null, null] +3698 - null - [null, null, null, null, null] +3699 - null - [null, null, null, null, null] +3700 - null - [null, null, null, null, null] +3701 - null - [null, null, null, null, null] +3702 - null - [null, null, null, null, null] +3703 - null - [null, null, null, null, null] +3704 - null - [null, null, null, null, null] +3705 - null - [null, null, null, null, null] +3706 - null - [null, null, null, null, null] +3707 - null - [null, null, null, null, null] +3708 - null - [null, null, null, null, null] +3709 - null - [null, null, null, null, null] +3710 - null - [null, null, null, null, null] +3711 - null - [null, null, null, null, null] +3712 - null - [null, null, null, null, null] +3713 - null - [null, null, null, null, null] +3714 - null - [null, null, null, null, null] +3715 - null - [null, null, null, null, null] +3716 - null - [null, null, null, null, null] +3717 - null - [null, null, null, null, null] +3718 - null - [null, null, null, null, null] +3719 - null - [null, null, null, null, null] +3720 - null - [null, null, null, null, null] +3721 - null - [null, null, null, null, null] +3722 - Rocks - [Climb, null, null, null, null] +3723 - Rocks - [Climb, null, null, null, null] +3724 - null - [null, null, null, null, null] +3725 - Gate - [Open, null, null, null, null] +3726 - Gate - [Open, null, null, null, null] +3727 - Gate - [Close, null, null, null, null] +3728 - Gate - [Close, null, null, null, null] +3729 - null - [null, null, null, null, null] +3730 - Stile - [Climb-over, null, null, null, null] +3731 - null - [null, null, null, null, null] +3732 - null - [null, null, null, null, null] +3733 - null - [null, null, null, null, null] +3734 - null - [null, null, null, null, null] +3735 - Cave Entrance - [Enter, null, null, null, null] +3736 - Cave Exit - [Exit, null, null, null, null] +3737 - null - [null, null, null, null, null] +3738 - null - [null, null, null, null, null] +3739 - null - [null, null, null, null, null] +3740 - null - [null, null, null, null, null] +3741 - Danger sign - [null, null, null, null, null] +3742 - Danger sign - [Read, null, null, null, null] +3743 - Large door - [Open, null, null, null, null] +3744 - null - [null, null, null, null, null] +3745 - Door - [Open, null, null, null, null] +3746 - Door - [Open, null, null, null, null] +3747 - Door - [Open, null, null, null, null] +3748 - Rocks - [Climb, null, null, null, null] +3749 - null - [null, null, null, null, null] +3750 - null - [null, null, null, null, null] +3751 - null - [null, null, null, null, null] +3752 - Mysterious glow - [null, null, null, null, null] +3753 - null - [null, null, null, null, null] +3754 - null - [null, null, null, null, null] +3755 - null - [null, null, null, null, null] +3756 - null - [null, null, null, null, null] +3757 - Cave Entrance - [Enter, null, null, null, null] +3758 - Cave Exit - [Exit, null, null, null, null] +3759 - Cave Entrance - [Enter, null, null, null, null] +3760 - Cave Exit - [Exit, null, null, null, null] +3761 - Exit - [Open, null, null, null, null] +3762 - Secret Door - [Open, null, null, null, null] +3763 - Cell Door - [Open, null, null, null, null] +3764 - Cell Door - [Close, null, null, null, null] +3765 - Cell Door - [Unlock, null, null, null, null] +3766 - null - [null, null, null, null, null] +3767 - Cell Door - [Unlock, null, null, null, null] +3768 - null - [null, null, null, null, null] +3769 - Fire - [null, null, null, null, null] +3770 - Window - [null, null, null, null, null] +3771 - Stronghold - [Enter, null, null, null, null] +3772 - Exit - [Use, null, null, null, null] +3773 - Exit - [Leave, null, null, null, null] +3774 - Exit - [Leave, null, null, null, null] +3775 - Fire - [null, null, null, null, null] +3776 - Door - [Open, null, null, null, null] +3777 - Door - [Close, null, null, null, null] +3778 - null - [null, null, null, null, null] +3779 - null - [null, null, null, null, null] +3780 - Prison Door - [Unlock, null, null, null, null] +3781 - null - [null, null, null, null, null] +3782 - Arena Entrance - [Open, null, null, null, null] +3783 - Arena Entrance - [Open, null, null, null, null] +3784 - null - [null, null, null, null, null] +3785 - Arena Exit - [Open, null, null, null, null] +3786 - Arena Exit - [Open, null, null, null, null] +3787 - null - [null, null, null, null, null] +3788 - Stone Staircase - [Climb-up, null, null, null, null] +3789 - Stone Staircase - [Climb-down, null, null, null, null] +3790 - Rocks - [Climb, null, null, null, null] +3791 - Rocks - [Climb, null, null, null, null] +3792 - null - [null, null, null, null, null] +3793 - null - [null, null, null, null, null] +3794 - Grass - [null, null, null, null, null] +3795 - Grass - [null, null, null, null, null] +3796 - null - [null, null, null, null, null] +3797 - Corpse - [null, null, null, null, null] +3798 - Corpse - [null, null, null, null, null] +3799 - Corpse - [null, null, null, null, null] +3800 - Counter - [null, null, null, null, null] +3801 - Chair - [null, null, null, null, null] +3802 - Smashed chair - [null, null, null, null, null] +3803 - Rocks - [Climb, null, null, null, null] +3804 - Rocks - [Climb, null, null, null, null] +3805 - Rocks - [null, null, null, null, null] +3806 - Rocks - [null, null, null, null, null] +3807 - Rocks - [null, null, null, null, null] +3808 - Rocks - [null, null, null, null, null] +3809 - null - [null, null, null, null, null] +3810 - Storeroom Door - [Open, null, null, null, null] +3811 - null - [null, null, null, null, null] +3812 - null - [null, null, null, null, null] +3813 - Crate - [null, null, null, null, null] +3814 - Crates - [null, null, null, null, null] +3815 - Crates - [null, null, null, null, null] +3816 - Kitchen Drawers - [Open, null, null, null, null] +3817 - Kitchen Drawers - [Close, Search, null, null, null] +3818 - null - [null, null, null, null, null] +3819 - null - [null, null, null, null, null] +3820 - Food Trough - [null, null, null, null, null] +3821 - Rack - [Search, null, null, null, null] +3822 - Goutweed Crate - [Search, null, null, null, null] +3823 - Sign - [null, null, null, null, null] +3824 - Troll Stew - [null, null, null, null, null] +3825 - Stalagmite - [null, null, null, null, null] +3826 - Stalagmites - [null, null, null, null, null] +3827 - Tunnel entrance - [null, null, null, null, null] +3828 - Tunnel entrance - [Climb-down, null, null, null, null] +3829 - Rope - [Climb-up, null, null, null, null] +3830 - Tunnel entrance - [null, null, null, null, null] +3831 - Tunnel entrance - [Climb-down, null, null, null, null] +3832 - Rope - [Climb-up, null, null, null, null] +3833 - Cocoon - [null, null, null, null, null] +3834 - null - [null, null, null, null, null] +3835 - null - [null, null, null, null, null] +3836 - null - [null, null, null, null, null] +3837 - null - [null, null, null, null, null] +3838 - null - [null, null, null, null, null] +3839 - null - [null, null, null, null, null] +3840 - null - [null, null, null, null, null] +3841 - null - [null, null, null, null, null] +3842 - null - [null, null, null, null, null] +3843 - null - [null, null, null, null, null] +3844 - null - [null, null, null, null, null] +3845 - null - [null, null, null, null, null] +3846 - null - [null, null, null, null, null] +3847 - null - [null, null, null, null, null] +3848 - null - [null, null, null, null, null] +3849 - null - [null, null, null, null, null] +3850 - null - [null, null, null, null, null] +3851 - null - [null, null, null, null, null] +3852 - null - [null, null, null, null, null] +3853 - null - [null, null, null, null, null] +3854 - null - [null, null, null, null, null] +3855 - null - [null, null, null, null, null] +3856 - Crate - [null, null, null, null, null] +3857 - Crate - [null, null, null, null, null] +3858 - Fishing rod - [null, null, null, null, null] +3859 - Fishing rod - [null, null, null, null, null] +3860 - Barrel - [null, null, null, null, null] +3861 - Crate - [null, null, null, null, null] +3862 - Burning bones - [null, null, null, null, null] +3863 - Tribal Statue - [Pray-at, null, null, null, null] +3864 - null - [null, null, null, null, null] +3865 - null - [null, null, null, null, null] +3866 - null - [null, null, null, null, null] +3867 - null - [null, null, null, null, null] +3868 - null - [null, null, null, null, null] +3869 - null - [null, null, null, null, null] +3870 - null - [null, null, null, null, null] +3871 - null - [null, null, null, null, null] +3872 - null - [null, null, null, null, null] +3873 - null - [null, null, null, null, null] +3874 - null - [null, null, null, null, null] +3875 - null - [null, null, null, null, null] +3876 - null - [null, null, null, null, null] +3877 - null - [null, null, null, null, null] +3878 - null - [null, null, null, null, null] +3879 - Tree - [Chop down, null, hidden, null, null] +3880 - Tree stump - [null, null, null, null, null] +3881 - Tree - [Chop down, null, hidden, null, null] +3882 - Tree - [Chop down, null, hidden, null, null] +3883 - Tree - [Chop down, null, hidden, null, null] +3884 - Tree stump - [null, null, null, null, null] +3885 - Tree - [null, null, null, null, null] +3886 - Tree - [null, null, null, null, null] +3887 - Tree - [null, null, null, null, null] +3888 - Tree - [null, null, null, null, null] +3889 - Tree - [null, null, null, null, null] +3890 - Tree - [null, null, null, null, null] +3891 - Tree - [null, null, null, null, null] +3892 - Tree - [null, null, null, null, null] +3893 - Tree - [null, null, null, null, null] +3894 - null - [null, null, null, null, null] +3895 - null - [null, null, null, null, null] +3896 - null - [null, null, null, null, null] +3897 - null - [null, null, null, null, null] +3898 - null - [null, null, null, null, null] +3899 - null - [null, null, null, null, null] +3900 - null - [null, null, null, null, null] +3901 - Flowers - [null, null, null, null, null] +3902 - Flowers - [null, null, null, null, null] +3903 - Flowers - [null, null, null, null, null] +3904 - Flowers - [null, null, null, null, null] +3905 - Flowers - [null, null, null, null, null] +3906 - Flowers - [null, null, null, null, null] +3907 - null - [null, null, null, null, null] +3908 - null - [null, null, null, null, null] +3909 - null - [null, null, null, null, null] +3910 - null - [null, null, null, null, null] +3911 - null - [null, null, null, null, null] +3912 - Mushroom - [null, null, null, null, null] +3913 - Mushrooms - [null, null, null, null, null] +3914 - Mushroom - [null, null, null, null, null] +3915 - Mushroom - [null, null, null, null, null] +3916 - Mushrooms - [null, null, null, null, null] +3917 - Mushroom - [null, null, null, null, null] +3918 - Elven lamp - [null, null, null, null, null] +3919 - Twigs - [null, null, null, null, null] +3920 - null - [null, null, null, null, null] +3921 - Tripwire - [Step-over, null, null, null, null] +3922 - Sticks - [Pass, null, null, null, null] +3923 - Leaves - [Jump, null, null, null, null] +3924 - Leaves - [Jump, null, null, null, null] +3925 - Leaves - [Jump, null, null, null, null] +3926 - null - [null, null, null, null, null] +3927 - Protruding rocks - [Climb, null, null, null, null] +3928 - Tree - [null, null, null, null, null] +3929 - Log balance - [null, null, null, null, null] +3930 - Log balance - [null, null, null, null, null] +3931 - Log balance - [Cross, null, null, null, null] +3932 - Log balance - [Cross, null, null, null, null] +3933 - Log balance - [Cross, null, null, null, null] +3934 - null - [null, null, null, null, null] +3935 - null - [null, null, null, null, null] +3936 - null - [null, null, null, null, null] +3937 - Dense forest - [Enter, null, null, null, null] +3938 - Dense forest - [Enter, null, null, null, null] +3939 - Dense forest - [Enter, null, null, null, null] +3940 - null - [null, null, null, null, null] +3941 - Tracks - [Follow, null, null, null, null] +3942 - null - [null, null, null, null, null] +3943 - null - [null, null, null, null, null] +3944 - Huge Gate - [Enter, null, null, null, null] +3945 - Huge Gate - [Enter, null, null, null, null] +3946 - Huge Gate - [null, null, null, null, null] +3947 - Huge Gate - [null, null, null, null, null] +3948 - null - [null, null, null, null, null] +3949 - null - [null, null, null, null, null] +3950 - null - [null, null, null, null, null] +3951 - null - [null, null, null, null, null] +3952 - null - [null, null, null, null, null] +3953 - null - [null, null, null, null, null] +3954 - null - [null, null, null, null, null] +3955 - null - [null, null, null, null, null] +3956 - null - [null, null, null, null, null] +3957 - null - [null, null, null, null, null] +3958 - null - [null, null, null, null, null] +3959 - null - [null, null, null, null, null] +3960 - null - [null, null, null, null, null] +3961 - null - [null, null, null, null, null] +3962 - Sulphur - [Take, null, null, null, null] +3963 - Sulphur - [Take, null, null, null, null] +3964 - Sulphur - [Take, null, null, null, null] +3965 - null - [null, null, null, null, null] +3966 - null - [null, null, null, null, null] +3967 - Tree - [null, null, null, null, null] +3968 - Tree - [null, null, null, null, null] +3969 - Pile of skulls - [null, null, null, null, null] +3970 - Charred bones - [null, null, null, null, null] +3971 - Corpse - [null, null, null, null, null] +3972 - Corpse - [null, null, null, null, null] +3973 - Corpse - [null, null, null, null, null] +3974 - Corpse - [null, null, null, null, null] +3975 - Tar - [Take, null, null, null, null] +3976 - null - [null, null, null, null, null] +3977 - null - [null, null, null, null, null] +3978 - null - [null, null, null, null, null] +3979 - null - [null, null, null, null, null] +3980 - Tent flap - [Enter, null, null, null, null] +3981 - null - [null, null, null, null, null] +3982 - null - [null, null, null, null, null] +3983 - Tent - [null, null, null, null, null] +3984 - Tent - [null, null, null, null, null] +3985 - Tent - [null, null, null, null, null] +3986 - Tent - [null, null, null, null, null] +3987 - Barrel - [null, null, null, null, null] +3988 - null - [null, null, null, null, null] +3989 - null - [null, null, null, null, null] +3990 - null - [null, null, null, null, null] +3991 - null - [null, null, null, null, null] +3992 - Standard - [null, null, null, null, null] +3993 - Standard - [null, null, null, null, null] +3994 - Small furnace - [null, null, null, null, null] +3995 - Tent wall - [null, null, null, null, null] +3996 - Tent flap - [Enter, null, null, null, null] +3997 - Tent wall - [null, null, null, null, null] +3998 - Dense forest - [Enter, null, null, null, null] +3999 - Dense forest - [Enter, null, null, null, null] +4000 - Tent roof - [null, null, null, null, null] +4001 - Tent wall - [null, null, null, null, null] +4002 - Tent pole - [null, null, null, null, null] +4003 - null - [null, null, null, null, null] +4004 - Well - [Climb-down, null, null, null, null] +4005 - Well - [Climb-down, null, null, null, null] +4006 - Cave entrance - [Enter, null, null, null, null] +4007 - Cave Exit - [Exit, null, null, null, null] +4008 - Altar - [Pray-at, null, null, null, null] +4009 - null - [null, null, null, null, null] +4010 - null - [null, null, null, null, null] +4011 - null - [null, null, null, null, null] +4012 - null - [null, null, null, null, null] +4013 - null - [null, null, null, null, null] +4014 - null - [null, null, null, null, null] +4015 - null - [null, null, null, null, null] +4016 - null - [null, null, null, null, null] +4017 - null - [null, null, null, null, null] +4018 - null - [null, null, null, null, null] +4019 - null - [null, null, null, null, null] +4020 - null - [null, null, null, null, null] +4021 - null - [null, null, null, null, null] +4022 - null - [null, null, null, null, null] +4023 - null - [null, null, null, null, null] +4024 - Barrel - [null, null, null, null, null] +4025 - Barrel - [null, null, null, null, null] +4026 - Fractionalizing still - [Operate, null, null, null, null] +4027 - Pile of Rock - [Mine, Prospect, hidden, null, null] +4028 - Pile of Rock - [Mine, Prospect, hidden, null, null] +4029 - Pile of Rock - [Mine, Prospect, hidden, null, null] +4030 - Pile of Rock - [Mine, Prospect, null, null, null] +4031 - Shantay pass - [Go-through, Look-at, null, null, null] +4032 - null - [null, null, null, null, null] +4033 - null - [null, null, null, null, null] +4034 - null - [null, null, null, null, null] +4035 - Druid's robes - [null, null, null, null, null] +4036 - Druid's robes - [null, null, null, null, null] +4037 - null - [null, null, null, null, null] +4038 - null - [null, null, null, null, null] +4039 - Trapdoor - [Open, hidden, null, null, null] +4040 - null - [null, null, null, null, null] +4041 - null - [null, null, null, null, null] +4042 - null - [null, null, null, null, null] +4043 - Aviary Hatch - [null, null, null, null, null] +4044 - Standard - [null, null, null, null, null] +4045 - null - [null, null, null, null, null] +4046 - null - [null, null, null, null, null] +4047 - null - [null, null, null, null, null] +4048 - Tree - [null, null, null, null, null] +4049 - Tree - [null, null, null, null, null] +4050 - Tree - [null, null, null, null, null] +4051 - Tree - [null, null, null, null, null] +4052 - Tree - [null, null, null, null, null] +4053 - Tree - [null, null, null, null, null] +4054 - Tree - [null, null, null, null, null] +4055 - Huge Mushroom - [null, null, null, null, null] +4056 - Huge Mushroom - [null, null, null, null, null] +4057 - Huge Mushroom - [null, null, null, null, null] +4058 - Obstacle pipe - [Squeeze-through, null, null, null, null] +4059 - Balancing rope - [Walk-on, null, null, null, null] +4060 - Hollow tree - [Chop down, null, hidden, null, null] +4061 - Tree stump - [null, null, null, null, null] +4062 - Shelf - [Search, null, null, null, null] +4063 - Sink - [null, null, null, null, null] +4064 - Smashed table - [null, null, null, null, Search] +4065 - Stone stand - [null, null, null, null, null] +4066 - Signpost - [Search, null, null, null, null] +4067 - Warning sign - [null, null, null, null, null] +4068 - Broken Wall - [Repair, null, hidden, null, null] +4069 - Temple wall - [Repair, null, hidden, null, null] +4070 - Temple wall - [Repair, null, hidden, null, null] +4071 - Temple wall - [Repair, null, hidden, null, null] +4072 - Temple wall - [Repair, null, hidden, null, null] +4073 - Temple wall - [Repair, null, hidden, null, null] +4074 - Temple wall - [Repair, null, hidden, null, null] +4075 - Temple wall - [Repair, null, hidden, null, null] +4076 - Temple wall - [Repair, null, hidden, null, null] +4077 - Temple wall - [Repair, null, hidden, null, null] +4078 - Temple wall - [Reinforce, null, hidden, null, null] +4079 - Broken Wall - [Repair, null, hidden, null, null] +4080 - Temple wall - [Repair, null, hidden, null, null] +4081 - Temple wall - [Repair, null, hidden, null, null] +4082 - Temple wall - [Repair, null, hidden, null, null] +4083 - Temple wall - [Repair, null, hidden, null, null] +4084 - Temple wall - [Repair, null, hidden, null, null] +4085 - Temple wall - [Repair, null, hidden, null, null] +4086 - Temple wall - [Repair, null, hidden, null, null] +4087 - Temple wall - [Repair, null, hidden, null, null] +4088 - Temple wall - [Repair, null, hidden, null, null] +4089 - Temple wall - [Reinforce, null, hidden, null, null] +4090 - Flaming Fire altar - [null, null, null, null, null] +4091 - Fire altar - [Light, null, hidden, null, null] +4092 - Broken Fire altar - [null, null, null, null, null] +4093 - Funeral Pyre - [null, null, null, null, null] +4094 - Funeral pyre - [null, null, null, null, null] +4095 - Funeral pyre - [null, null, null, null, null] +4096 - Funeral pyre - [null, null, null, null, null] +4097 - Funeral pyre - [null, null, null, null, null] +4098 - Funeral pyre - [null, null, null, null, null] +4099 - null - [null, null, null, null, null] +4100 - Funeral pyre - [Light, null, null, null, null] +4101 - Funeral pyre - [Light, null, null, null, null] +4102 - Funeral pyre - [Light, null, null, null, null] +4103 - Funeral pyre - [Light, null, null, null, null] +4104 - Funeral pyre - [Light, null, null, null, null] +4105 - null - [null, null, null, null, null] +4106 - Solid bronze door - [Open, null, null, null, null] +4107 - Solid steel door - [Open, null, null, null, null] +4108 - Solid black door - [Open, null, null, null, null] +4109 - Solid silver door - [Open, null, null, null, null] +4110 - null - [null, null, null, null, null] +4111 - Bronze Chest - [Open, null, null, null, null] +4112 - Bronze Chest - [Open, null, null, null, null] +4113 - Bronze Chest - [Open, null, null, null, null] +4114 - Bronze Chest - [Open, null, null, null, null] +4115 - Bronze Chest - [Open, null, null, null, null] +4116 - Steel Chest - [Open, null, null, null, null] +4117 - Steel Chest - [Open, null, null, null, null] +4118 - Steel Chest - [Open, null, null, null, null] +4119 - Steel Chest - [Open, null, null, null, null] +4120 - Steel Chest - [Open, null, null, null, null] +4121 - Black Chest - [Open, null, null, null, null] +4122 - Black Chest - [Open, null, null, null, null] +4123 - Black Chest - [Open, null, null, null, null] +4124 - Black Chest - [Open, null, null, null, null] +4125 - Black Chest - [Open, null, null, null, null] +4126 - Silver Chest - [Open, null, null, null, null] +4127 - Silver Chest - [Open, null, null, null, null] +4128 - Silver Chest - [Open, null, null, null, null] +4129 - Silver Chest - [Open, null, null, null, null] +4130 - Silver Chest - [Open, null, null, null, null] +4131 - Bronze Chest - [null, null, null, null, null] +4132 - Signpost - [Read, null, null, null, null] +4133 - Signpost - [Read, null, null, null, null] +4134 - Signpost - [Read, null, null, null, null] +4135 - Signpost - [Read, null, null, null, null] +4136 - null - [null, null, null, null, null] +4137 - null - [null, null, null, null, null] +4138 - Counter - [null, null, null, null, null] +4139 - Gate - [Close, null, null, null, null] +4140 - Gate - [Close, null, null, null, null] +4141 - Strange altar - [null, null, null, null, null] +4142 - Swaying tree - [Cut-branch, null, null, null, null] +4143 - Danger sign - [Read, null, null, null, null] +4144 - Golden tree - [null, null, null, null, null] +4145 - null - [null, null, null, null, null] +4146 - null - [null, null, null, null, null] +4147 - Cave Entrance - [Enter, null, null, null, null] +4148 - Door - [Open, null, null, null, null] +4149 - Lalli's Stew - [null, null, null, null, null] +4150 - Portal - [Use, null, null, null, null] +4151 - Portal - [Use, null, null, null, null] +4152 - Portal - [Use, null, null, null, null] +4153 - Portal - [Use, null, null, null, null] +4154 - Portal - [Use, null, null, null, null] +4155 - Portal - [Use, null, null, null, null] +4156 - Portal - [Use, null, null, null, null] +4157 - Portal - [Use, null, null, null, null] +4158 - Ladder - [Climb-down, null, null, null, null] +4159 - Ladder - [Climb-up, null, null, null, null] +4160 - Ladder - [Climb-up, null, null, null, null] +4161 - Escape rope - [Climb-up, null, null, null, null] +4162 - Pipe - [Put-inside, null, null, null, null] +4163 - Ladder - [Climb-up, null, null, null, null] +4164 - Ladder - [Climb-up, null, null, null, null] +4165 - Door - [Open, null, null, null, null] +4166 - Door - [Open, null, null, null, null] +4167 - Chest - [Open, null, null, null, null] +4168 - Chest - [Close, Search, null, null, null] +4169 - Frozen table - [null, null, null, null, null] +4170 - Chest - [Open, null, null, null, null] +4171 - Bookcase - [Search, null, null, null, null] +4172 - Cooking range - [null, null, null, null, null] +4173 - Trapdoor - [Climb-down, Close, null, null, null] +4174 - Trapdoor - [Open, null, null, null, null] +4175 - Drain - [null, null, null, null, null] +4176 - Tap - [null, null, null, null, null] +4177 - Cupboard - [Open, null, null, null, null] +4178 - Cupboard - [Shut, Search, null, null, null] +4179 - Abstract mural - [Study, null, null, null, null] +4180 - Abstract mural - [Study, null, null, null, null] +4181 - Unicorn's head - [Study, null, null, null, null] +4182 - Bull's head - [Study, null, null, null, null] +4183 - Boxes - [Search, null, null, null, null] +4184 - Boxes - [Search, null, null, null, null] +4185 - Crate - [Search, null, null, null, null] +4186 - Crate - [Search, null, null, null, null] +4187 - Ladder - [null, Climb-down, Climb-up, null, null] +4188 - Ladder - [Climb-up, null, null, null, null] +4189 - Ladder - [Climb-down, null, null, null, null] +4190 - null - [null, null, null, null, null] +4191 - null - [null, null, null, null, null] +4192 - null - [null, null, null, null, null] +4193 - null - [null, null, null, null, null] +4194 - null - [null, null, null, null, null] +4195 - null - [null, null, null, null, null] +4196 - null - [null, null, null, null, null] +4197 - null - [null, null, null, null, null] +4198 - null - [null, null, null, null, null] +4199 - null - [null, null, null, null, null] +4200 - null - [null, null, null, null, null] +4201 - null - [null, null, null, null, null] +4202 - null - [null, null, null, null, null] +4203 - null - [null, null, null, null, null] +4204 - null - [null, null, null, null, null] +4205 - null - [null, null, null, null, null] +4206 - null - [null, null, null, null, null] +4207 - null - [null, null, null, null, null] +4208 - null - [null, null, null, null, null] +4209 - null - [null, null, null, null, null] +4210 - null - [null, null, null, null, null] +4211 - null - [null, null, null, null, null] +4212 - null - [null, null, null, null, null] +4213 - null - [null, null, null, null, null] +4214 - null - [null, null, null, null, null] +4215 - null - [null, null, null, null, null] +4216 - null - [null, null, null, null, null] +4217 - null - [null, null, null, null, null] +4218 - null - [null, null, null, null, null] +4219 - null - [null, null, null, null, null] +4220 - null - [null, null, null, null, null] +4221 - null - [null, null, null, null, null] +4222 - null - [null, null, null, null, null] +4223 - null - [null, null, null, null, null] +4224 - null - [null, null, null, null, null] +4225 - null - [null, null, null, null, null] +4226 - null - [null, null, null, null, null] +4227 - null - [null, null, null, null, null] +4228 - null - [null, null, null, null, null] +4229 - null - [null, null, null, null, null] +4230 - null - [null, null, null, null, null] +4231 - null - [null, null, null, null, null] +4232 - null - [null, null, null, null, null] +4233 - null - [null, null, null, null, null] +4234 - null - [null, null, null, null, null] +4235 - null - [null, null, null, null, null] +4236 - null - [null, null, null, null, null] +4237 - null - [null, null, null, null, null] +4238 - null - [null, null, null, null, null] +4239 - null - [null, null, null, null, null] +4240 - null - [null, null, null, null, null] +4241 - null - [null, null, null, null, null] +4242 - null - [null, null, null, null, null] +4243 - null - [null, null, null, null, null] +4244 - null - [null, null, null, null, null] +4245 - null - [null, null, null, null, null] +4246 - null - [null, null, null, null, null] +4247 - Door - [Open, null, null, null, null] +4248 - Door - [Close, null, null, null, null] +4249 - null - [null, null, null, null, null] +4250 - Door - [Open, null, null, null, null] +4251 - Door - [Close, null, null, null, null] +4252 - Chest - [Open, null, null, null, null] +4253 - Chest - [Close, Search, null, null, null] +4254 - null - [null, null, null, null, null] +4255 - null - [null, null, null, null, null] +4256 - null - [null, null, null, null, null] +4257 - null - [null, null, null, null, null] +4258 - null - [null, null, null, null, null] +4259 - null - [null, null, null, null, null] +4260 - null - [null, null, null, null, null] +4261 - null - [null, null, null, null, null] +4262 - null - [null, null, null, null, null] +4263 - null - [null, null, null, null, null] +4264 - null - [null, null, null, null, null] +4265 - Fire - [null, null, null, null, null] +4266 - Fire - [null, null, null, null, null] +4267 - Spit roast - [null, null, null, null, null] +4268 - null - [null, null, null, null, null] +4269 - Wooden Table - [null, null, null, null, null] +4270 - Wooden Table - [null, null, null, null, null] +4271 - Chair - [null, null, null, null, null] +4272 - Table - [null, null, null, null, null] +4273 - Bar pumps - [null, null, null, null, null] +4274 - Bar - [null, null, null, null, null] +4275 - Barrel - [null, null, null, null, null] +4276 - Market stall - [null, null, null, null, null] +4277 - Fish stall - [null, Steal-from, null, null, null] +4278 - Fur stall - [null, Steal-from, null, null, null] +4279 - null - [null, null, null, null, null] +4280 - null - [null, null, null, null, null] +4281 - null - [null, null, null, null, null] +4282 - null - [null, null, null, null, null] +4283 - Drain - [null, null, null, null, null] +4284 - null - [null, null, null, null, null] +4285 - Tap - [null, null, null, null, null] +4286 - Keg - [null, null, null, null, null] +4287 - Bed - [null, null, null, null, null] +4288 - Bed - [null, null, null, null, null] +4289 - null - [null, null, null, null, null] +4290 - null - [null, null, null, null, null] +4291 - null - [null, null, null, null, null] +4292 - null - [null, null, null, null, null] +4293 - null - [null, null, null, null, null] +4294 - null - [null, null, null, null, null] +4295 - null - [null, null, null, null, null] +4296 - Abandoned Cart - [null, null, null, null, null] +4297 - Boxes - [null, null, null, null, null] +4298 - Boxes - [null, null, null, null, null] +4299 - Boxes - [null, null, null, null, null] +4300 - Crate - [Search, null, null, null, null] +4301 - Crate - [Search, null, null, null, null] +4302 - null - [null, null, null, null, null] +4303 - null - [null, null, null, null, null] +4304 - Furnace - [null, Smelt, null, null, null] +4305 - null - [null, null, null, null, null] +4306 - Anvil - [null, null, null, null, null] +4307 - Blacksmith's tools - [null, null, null, null, null] +4308 - Pottery Oven - [Fire, null, null, null, null] +4309 - Spinning wheel - [null, Spin, null, null, null] +4310 - Potter's Wheel - [null, null, null, null, null] +4311 - Gate - [Open, null, null, null, null] +4312 - Gate - [Open, null, null, null, null] +4313 - Gate - [null, null, null, null, null] +4314 - null - [null, null, null, null, null] +4315 - null - [null, null, null, null, null] +4316 - null - [null, null, null, null, null] +4317 - null - [null, null, null, null, null] +4318 - null - [null, null, null, null, null] +4319 - null - [null, null, null, null, null] +4320 - null - [null, null, null, null, null] +4321 - null - [null, null, null, null, null] +4322 - null - [null, null, null, null, null] +4323 - null - [null, null, null, null, null] +4324 - null - [null, null, null, null, null] +4325 - null - [null, null, null, null, null] +4326 - null - [null, null, null, null, null] +4327 - null - [null, null, null, null, null] +4328 - Tree stump - [null, null, null, null, null] +4329 - Tree stump - [null, null, null, null, null] +4330 - null - [null, null, null, null, null] +4331 - null - [null, null, null, null, null] +4332 - null - [null, null, null, null, null] +4333 - null - [null, null, null, null, null] +4334 - null - [null, null, null, null, null] +4335 - null - [null, null, null, null, null] +4336 - null - [null, null, null, null, null] +4337 - null - [null, null, null, null, null] +4338 - null - [null, null, null, null, null] +4339 - null - [null, null, null, null, null] +4340 - null - [null, null, null, null, null] +4341 - null - [null, null, null, null, null] +4342 - null - [null, null, null, null, null] +4343 - null - [null, null, null, null, null] +4344 - null - [null, null, null, null, null] +4345 - null - [null, null, null, null, null] +4346 - null - [null, null, null, null, null] +4347 - null - [null, null, null, null, null] +4348 - Shell - [null, null, null, null, null] +4349 - Shell - [null, null, null, null, null] +4350 - Shell - [null, null, null, null, null] +4351 - Shell - [null, null, null, null, null] +4352 - Bowl - [null, null, null, null, null] +4353 - null - [null, null, null, null, null] +4354 - null - [null, null, null, null, null] +4355 - null - [null, null, null, null, null] +4356 - null - [null, null, null, null, null] +4357 - null - [null, null, null, null, null] +4358 - null - [null, null, null, null, null] +4359 - null - [null, null, null, null, null] +4360 - null - [null, null, null, null, null] +4361 - null - [null, null, null, null, null] +4362 - null - [null, null, null, null, null] +4363 - null - [null, null, null, null, null] +4364 - null - [null, null, null, null, null] +4365 - null - [null, null, null, null, null] +4366 - Shelf - [null, null, null, null, null] +4367 - Shelf - [null, null, null, null, null] +4368 - Shelf - [null, null, null, null, null] +4369 - Shelf - [null, null, null, null, null] +4370 - Shelf - [null, null, null, null, null] +4371 - Shelf - [null, null, null, null, null] +4372 - Table - [null, null, null, null, null] +4373 - Sand pit - [null, null, null, null, null] +4374 - null - [null, null, null, null, null] +4375 - null - [null, null, null, null, null] +4376 - null - [null, null, null, null, null] +4377 - Standard Stand - [Capture, null, null, null, null] +4378 - Standard Stand - [Capture, null, null, null, null] +4379 - null - [null, null, null, null, null] +4380 - Iron ladder - [null, null, null, null, null] +4381 - Catapult - [Operate, null, null, null, null] +4382 - Catapult - [Operate, null, null, null, null] +4383 - Iron ladder - [Climb, null, null, null, null] +4384 - null - [null, null, null, null, null] +4385 - Catapult - [Repair, null, null, null, null] +4386 - Catapult - [Repair, null, null, null, null] +4387 - Saradomin Portal - [Enter, null, null, null, null] +4388 - Zamorak Portal - [Enter, null, null, null, null] +4389 - Portal - [Exit, null, null, null, null] +4390 - Portal - [Exit, null, null, null, null] +4391 - null - [null, null, null, null, null] +4392 - null - [null, null, null, null, null] +4393 - null - [null, null, null, null, null] +4394 - null - [null, null, null, null, null] +4395 - null - [null, null, null, null, null] +4396 - null - [null, null, null, null, null] +4397 - null - [null, null, null, null, null] +4398 - null - [null, null, null, null, null] +4399 - null - [null, null, null, null, null] +4400 - null - [null, null, null, null, null] +4401 - null - [null, null, null, null, null] +4402 - null - [null, null, null, null, null] +4403 - null - [null, null, null, null, null] +4404 - null - [null, null, null, null, null] +4405 - null - [null, null, null, null, null] +4406 - Portal - [Leave, null, null, null, null] +4407 - Portal - [Leave, null, null, null, null] +4408 - Guthix Portal - [Enter, null, null, null, null] +4409 - null - [null, null, null, null, null] +4410 - null - [null, null, null, null, null] +4411 - Stepping stone - [Jump-to, null, null, null, null] +4412 - Iron ladder - [Climb, null, null, null, null] +4413 - Iron ladder - [Climb, null, null, null, null] +4414 - Staircase - [null, null, null, null, null] +4415 - Staircase - [Climb, null, null, null, null] +4416 - Staircase - [Climb, null, null, null, null] +4417 - Staircase - [Climb, null, null, null, null] +4418 - Staircase - [Climb, null, null, null, null] +4419 - Staircase - [Climb, null, null, null, null] +4420 - Staircase - [Climb, null, null, null, null] +4421 - Barricade - [null, null, null, null, null] +4422 - Barricade - [null, null, null, null, null] +4423 - Large door - [Open, Attack, null, null, null] +4424 - Large door - [Open, Attack, null, null, null] +4425 - Large door - [Close, null, null, null, null] +4426 - Large door - [Close, null, null, null, null] +4427 - Large door - [Open, Attack, null, null, null] +4428 - Large door - [Open, Attack, null, null, null] +4429 - Large door - [Close, null, null, null, null] +4430 - Large door - [Close, null, null, null, null] +4431 - Broken door - [Repair, null, null, null, null] +4432 - Broken door - [Repair, null, null, null, null] +4433 - Broken door - [Repair, null, null, null, null] +4434 - Broken door - [Repair, null, null, null, null] +4435 - null - [null, null, null, null, null] +4436 - null - [null, null, null, null, null] +4437 - Rocks - [Mine, null, hidden, null, null] +4438 - Rocks - [Mine, null, hidden, null, null] +4439 - null - [null, null, null, null, null] +4440 - null - [null, null, null, null, null] +4441 - null - [null, null, null, null, null] +4442 - null - [null, null, null, null, null] +4443 - null - [null, null, null, null, null] +4444 - Climbing Rope - [Climb, null, null, null, null] +4445 - null - [null, null, null, null, null] +4446 - Battlements - [null, null, null, null, null] +4447 - Battlements - [null, null, null, null, null] +4448 - Cave wall - [Collapse, null, hidden, null, null] +4449 - Staircase - [null, null, null, null, null] +4450 - Staircase - [null, null, null, null, null] +4451 - null - [null, null, null, null, null] +4452 - null - [null, null, null, null, null] +4453 - null - [null, null, null, null, null] +4454 - null - [null, null, null, null, null] +4455 - null - [null, null, null, null, null] +4456 - null - [null, null, null, null, null] +4457 - null - [null, null, null, null, null] +4458 - Table - [Take-from, null, null, null, null] +4459 - Table - [Take-from, null, null, null, null] +4460 - Table - [Take-from, null, null, null, null] +4461 - Table - [Take-from, null, null, null, null] +4462 - Table - [Take-from, null, null, null, null] +4463 - Table - [Take-from, null, null, null, null] +4464 - Table - [Take-from, null, null, null, null] +4465 - Door - [Unlock, null, null, null, null] +4466 - Door - [Lock, null, null, null, null] +4467 - Door - [Unlock, null, null, null, null] +4468 - Door - [Lock, null, null, null, null] +4469 - Energy Barrier - [Pass, null, null, null, null] +4470 - Energy Barrier - [Pass, null, null, null, null] +4471 - Trapdoor - [Open, null, null, null, null] +4472 - Trapdoor - [Open, null, null, null, null] +4473 - null - [null, null, null, null, null] +4474 - null - [null, null, null, null, null] +4475 - null - [null, null, null, null, null] +4476 - null - [null, null, null, null, null] +4477 - null - [null, null, null, null, null] +4478 - null - [null, null, null, null, null] +4479 - null - [null, null, null, null, null] +4480 - null - [null, null, null, null, null] +4481 - null - [null, null, null, null, null] +4482 - Tap - [null, null, null, null, null] +4483 - Bank chest - [Use, null, null, null, null] +4484 - Scoreboard - [View, null, null, null, null] +4485 - Iron ladder - [Climb, null, null, null, null] +4486 - null - [null, null, null, null, null] +4487 - Door - [Open, null, null, null, null] +4488 - null - [Open, null, null, null, null] +4489 - null - [Open, null, null, null, null] +4490 - Door - [Open, null, null, null, null] +4491 - Door - [Close, null, null, null, null] +4492 - Door - [Close, null, null, null, null] +4493 - Staircase - [Climb-up, null, null, null, null] +4494 - Staircase - [Climb-down, null, null, null, null] +4495 - Staircase - [Climb-up, null, null, null, null] +4496 - Staircase - [Climb-down, null, null, null, null] +4497 - Staircase - [Climb-up, null, null, null, null] +4498 - Staircase - [Climb-down, null, null, null, null] +4499 - Cave Entrance - [Enter, null, null, null, null] +4500 - Tunnel - [Enter, null, null, null, null] +4501 - null - [null, null, null, null, null] +4502 - null - [null, null, null, null, null] +4503 - null - [null, null, null, null, null] +4504 - null - [null, null, null, null, null] +4505 - null - [null, null, null, null, null] +4506 - null - [null, null, null, null, null] +4507 - null - [null, null, null, null, null] +4508 - null - [null, null, null, null, null] +4509 - null - [null, null, null, null, null] +4510 - null - [null, null, null, null, null] +4511 - null - [null, null, null, null, null] +4512 - null - [null, null, null, null, null] +4513 - Heap of bricks - [null, null, null, null, null] +4514 - null - [null, null, null, null, null] +4515 - null - [null, null, null, null, null] +4516 - null - [null, null, null, null, null] +4517 - null - [null, null, null, null, null] +4518 - Corpse - [null, null, null, null, null] +4519 - Corpse - [null, null, null, null, null] +4520 - Corpse - [null, null, null, null, null] +4521 - null - [null, null, null, null, null] +4522 - null - [null, null, null, null, null] +4523 - null - [null, null, null, null, null] +4524 - null - [null, null, null, null, null] +4525 - null - [null, null, null, null, null] +4526 - null - [null, null, null, null, null] +4527 - null - [null, null, null, null, null] +4528 - null - [null, null, null, null, null] +4529 - null - [null, null, null, null, null] +4530 - null - [null, null, null, null, null] +4531 - null - [null, null, null, null, null] +4532 - null - [null, null, null, null, null] +4533 - null - [null, null, null, null, null] +4534 - null - [null, null, null, null, null] +4535 - null - [null, null, null, null, null] +4536 - null - [null, null, null, null, null] +4537 - null - [null, null, null, null, null] +4538 - null - [null, null, null, null, null] +4539 - null - [null, null, null, null, null] +4540 - null - [null, null, null, null, null] +4541 - Statue - [null, null, null, null, null] +4542 - null - [null, null, null, null, null] +4543 - Strange wall - [Study, null, null, null, null] +4544 - Strange wall - [Study, null, null, null, null] +4545 - Strange wall - [Open, null, null, null, null] +4546 - Strange wall - [Open, null, null, null, null] +4547 - null - [null, null, null, null, null] +4548 - null - [null, null, null, null, null] +4549 - null - [null, null, null, null, null] +4550 - Beach - [Jump-to, null, null, null, null] +4551 - Basalt rock - [Jump-across, null, null, null, null] +4552 - Basalt rock - [Jump-across, null, null, null, null] +4553 - Basalt rock - [Jump-across, null, null, null, null] +4554 - Basalt rock - [Jump-across, null, null, null, null] +4555 - Basalt rock - [Jump-across, null, null, null, null] +4556 - Basalt rock - [Jump-across, null, null, null, null] +4557 - Basalt rock - [Jump-across, null, null, null, null] +4558 - Basalt rock - [Jump-across, null, null, null, null] +4559 - Rocky shore - [Jump-to, null, null, null, null] +4560 - null - [null, null, null, null, null] +4561 - null - [null, null, null, null, null] +4562 - null - [null, null, null, null, null] +4563 - null - [null, null, null, null, null] +4564 - null - [null, null, null, null, null] +4565 - null - [null, null, null, null, null] +4566 - null - [null, null, null, null, null] +4567 - null - [null, null, null, null, null] +4568 - Staircase - [Climb-up, null, null, null, null] +4569 - Staircase - [Climb, Climb-up, Climb-down, null, null] +4570 - Staircase - [Climb-down, null, null, null, null] +4571 - null - [null, null, null, null, null] +4572 - null - [null, null, null, null, null] +4573 - null - [null, null, null, null, null] +4574 - null - [null, null, null, null, null] +4575 - null - [null, null, null, null, null] +4576 - null - [null, null, null, null, null] +4577 - Doorway - [Walk-through, null, null, null, null] +4578 - null - [null, null, null, null, null] +4579 - null - [null, null, null, null, null] +4580 - null - [null, null, null, null, null] +4581 - null - [null, null, null, null, null] +4582 - null - [null, null, null, null, null] +4583 - null - [null, null, null, null, null] +4584 - null - [null, null, null, null, null] +4585 - null - [null, null, null, null, null] +4586 - null - [null, null, null, null, null] +4587 - Lighting mechanism - [null, null, null, null, null] +4588 - Lighting mechanism - [null, null, null, null, null] +4589 - Lighting mechanism - [null, null, null, null, null] +4590 - Lighting mechanism - [null, null, null, null, null] +4591 - null - [null, null, null, null, null] +4592 - null - [null, null, null, null, null] +4593 - null - [null, null, null, null, null] +4594 - null - [null, null, null, null, null] +4595 - null - [null, null, null, null, null] +4596 - null - [null, null, null, null, null] +4597 - null - [null, null, null, null, null] +4598 - null - [null, null, null, null, null] +4599 - null - [null, null, null, null, null] +4600 - null - [null, null, null, null, null] +4601 - null - [null, null, null, null, null] +4602 - null - [null, null, null, null, null] +4603 - null - [null, null, null, null, null] +4604 - null - [null, null, null, null, null] +4605 - null - [null, null, null, null, null] +4606 - null - [null, null, null, null, null] +4607 - null - [null, null, null, null, null] +4608 - null - [null, null, null, null, null] +4609 - null - [null, null, null, null, null] +4610 - Shell - [null, null, null, null, null] +4611 - Shell - [null, null, null, null, null] +4612 - Shell - [null, null, null, null, null] +4613 - Shell - [null, null, null, null, null] +4614 - Bowl - [null, null, null, null, null] +4615 - Broken bridge - [Cross, null, null, null, null] +4616 - Broken bridge - [Cross, null, null, null, null] +4617 - Bookcase - [Search, null, null, null, null] +4618 - Fireplace - [null, null, null, null, null] +4619 - null - [null, null, null, null, null] +4620 - Stairs - [Climb-down, null, null, null, null] +4621 - Stairs - [Climb-down, null, null, null, null] +4622 - Stairs - [Climb-up, null, null, null, null] +4623 - Stairs - [Climb-up, null, null, null, null] +4624 - Stairs - [Climb-down, null, null, null, null] +4625 - Stairs - [Climb-down, null, null, null, null] +4626 - Stairs - [Climb-up, null, null, null, null] +4627 - Stairs - [Climb-up, null, null, null, null] +4628 - null - [null, null, null, null, null] +4629 - Large door - [Open, null, null, null, null] +4630 - Large door - [Close, null, null, null, null] +4631 - Large door - [Open, null, null, null, null] +4632 - Large door - [Open, null, null, null, null] +4633 - Large door - [Open, null, null, null, null] +4634 - Large door - [Close, null, null, null, null] +4635 - null - [null, null, null, null, null] +4636 - Door - [Open, null, null, null, null] +4637 - Door - [Open, null, null, null, null] +4638 - Door - [Open, null, null, null, null] +4639 - Door - [Close, null, null, null, null] +4640 - Door - [Open, null, null, null, null] +4641 - Stacked barrels - [null, null, null, null, null] +4642 - Noticeboard - [Read, null, null, null, null] +4643 - Ladder - [Climb-up, null, null, null, null] +4644 - Ladder - [Climb-Down, null, null, null, null] +4645 - Ladder - [Climb-up, null, null, null, null] +4646 - Ladder - [Climb-Down, null, null, null, null] +4647 - Ladder - [Climb-up, null, null, null, null] +4648 - Ladder - [Climb-Down, null, null, null, null] +4649 - null - [null, null, null, null, null] +4650 - Fireplace - [null, null, null, null, null] +4651 - Table - [null, null, null, null, null] +4652 - Table - [View-game, null, null, null, null] +4653 - Table - [View-game, null, null, null, null] +4654 - null - [null, null, null, null, null] +4655 - null - [null, null, null, null, null] +4656 - Stool - [null, null, null, null, null] +4657 - null - [null, null, null, null, null] +4658 - Plaque - [null, null, null, null, null] +4659 - Plaque - [null, null, null, null, null] +4660 - Plaque - [null, null, null, null, null] +4661 - Plaque - [null, null, null, null, null] +4662 - null - [null, null, null, null, null] +4663 - null - [null, null, null, null, null] +4664 - null - [null, null, null, null, null] +4665 - null - [null, null, null, null, null] +4666 - null - [null, null, null, null, null] +4667 - null - [null, null, null, null, null] +4668 - null - [null, null, null, null, null] +4669 - Arrav - [null, null, null, null, null] +4670 - Camorra - [null, null, null, null, null] +4671 - Bookcase - [Search, null, null, null, null] +4672 - Throne Room Door - [Open, null, null, null, null] +4673 - null - [null, null, null, null, null] +4674 - Maple tree - [Chop down, null, hidden, null, null] +4675 - Herbs - [Weed, null, hidden, null, null] +4676 - Rocks - [Mine, Prospect, hidden, null, null] +4677 - Herbs - [Weed, null, hidden, null, null] +4678 - Herbs - [Weed, null, hidden, null, null] +4679 - Herbs - [Weed, null, hidden, null, null] +4680 - null - [null, null, null, null, null] +4681 - null - [null, null, null, null, null] +4682 - null - [null, null, null, null, null] +4683 - Harp - [null, null, null, null, null] +4684 - Barrel - [null, null, null, null, null] +4685 - Hollow log - [null, null, null, null, null] +4686 - Hollow log - [null, null, null, null, null] +4687 - null - [null, null, null, null, null] +4688 - null - [null, null, null, null, null] +4689 - null - [null, null, null, null, null] +4690 - Chair - [null, null, null, null, null] +4691 - null - [null, null, null, null, null] +4692 - Flagpole - [null, null, null, null, null] +4693 - Flagpole - [null, null, null, null, null] +4694 - null - [null, null, null, null, null] +4695 - null - [null, null, null, null, null] +4696 - Door - [Open, null, null, null, null] +4697 - Door - [Close, null, null, null, null] +4698 - null - [null, null, null, null, null] +4699 - null - [null, null, null, null, null] +4700 - null - [null, null, null, null, null] +4701 - Door - [null, null, null, null, null] +4702 - Chair - [null, null, null, null, null] +4703 - Bed - [null, null, null, null, null] +4704 - Bed - [null, null, null, null, null] +4705 - Fish stall - [null, Steal-from, null, null, null] +4706 - Veg stall - [null, Steal-from, null, null, null] +4707 - Fish stall - [null, Steal-from, null, null, null] +4708 - Veg stall - [null, Steal-from, null, null, null] +4709 - null - [null, null, null, null, null] +4710 - Doorway - [Open, null, null, null, null] +4711 - null - [null, null, null, null, null] +4712 - Trapdoor - [Open, null, null, null, null] +4713 - Trapdoor - [Climb-down, Close, null, null, null] +4714 - Crate - [Search, null, null, null, null] +4715 - Crate - [Search, null, null, null, null] +4716 - Crate - [Search, null, null, null, null] +4717 - Crate - [Search, null, null, null, null] +4718 - Crate - [Search, null, null, null, null] +4719 - Crate - [Search, null, null, null, null] +4720 - Crate - [Search, null, null, null, null] +4721 - Crate - [Search, null, null, null, null] +4722 - Crate - [Search, null, null, null, null] +4723 - Crate - [Search, null, null, null, null] +4724 - Crate - [Search, null, null, null, null] +4725 - Crate - [Search, null, null, null, null] +4726 - Crate - [Search, null, null, null, null] +4727 - Crate - [Search, null, null, null, null] +4728 - Climbing rope - [Climb, null, null, null, null] +4729 - Bush - [null, null, null, null, null] +4730 - null - [null, null, null, null, null] +4731 - null - [null, null, null, null, null] +4732 - null - [null, null, null, null, null] +4733 - null - [null, null, null, null, null] +4734 - null - [null, null, null, null, null] +4735 - null - [null, null, null, null, null] +4736 - null - [null, null, null, null, null] +4737 - null - [null, null, null, null, null] +4738 - null - [null, null, null, null, null] +4739 - null - [null, null, null, null, null] +4740 - null - [null, null, null, null, null] +4741 - null - [null, null, null, null, null] +4742 - null - [null, null, null, null, null] +4743 - Bamboo Ladder - [Climb-up, null, null, null, null] +4744 - Bamboo Ladder - [Climb-down, null, null, null, null] +4745 - End of bridge - [Jump off, null, null, null, null] +4746 - Crate - [Search, null, null, null, null] +4747 - null - [null, null, null, null, null] +4748 - null - [null, null, null, null, null] +4749 - Banana Tree - [Search, null, null, null, null] +4750 - Banana Tree - [Search, null, null, null, null] +4751 - Banana Tree - [Search, null, null, null, null] +4752 - Banana Tree - [Search, null, null, null, null] +4753 - Banana Tree - [Search, null, null, null, null] +4754 - Banana Tree - [Search, null, null, null, null] +4755 - Stairs - [Climb-down, null, null, null, null] +4756 - Stairs - [Climb-up, null, null, null, null] +4757 - null - [null, null, null, null, null] +4758 - null - [null, null, null, null, null] +4759 - null - [null, null, null, null, null] +4760 - null - [null, null, null, null, null] +4761 - null - [null, null, null, null, null] +4762 - null - [null, null, null, null, null] +4763 - null - [null, null, null, null, null] +4764 - Bamboo Stool - [null, null, null, null, null] +4765 - Wall of flame - [null, null, null, null, null] +4766 - Wall of flame - [null, null, null, null, null] +4767 - Sacrificial Pyre - [null, null, null, null, null] +4768 - Wall of bricks - [null, null, null, null, null] +4769 - Pile of bricks - [null, null, null, null, null] +4770 - Pile of bricks - [null, null, null, null, null] +4771 - Awowogei - [Talk-to, null, null, null, null] +4772 - Bamboo Ladder - [Climb-up, null, null, null, null] +4773 - Bamboo Ladder - [Climb-up, null, null, null, null] +4774 - Bamboo Ladder - [Climb-up, null, null, null, null] +4775 - Bamboo Ladder - [Climb-up, null, null, null, null] +4776 - Bamboo Ladder - [Climb-down, null, null, null, null] +4777 - Bamboo Ladder - [Climb-down, null, null, null, null] +4778 - Bamboo Ladder - [Climb-down, null, null, null, null] +4779 - Bamboo Ladder - [Climb-down, null, null, null, null] +4780 - Bamboo Ladder - [Climb-down, null, null, null, null] +4781 - Bamboo Ladder - [Climb-up, null, null, null, null] +4782 - null - [null, null, null, null, null] +4783 - null - [null, null, null, null, null] +4784 - null - [null, null, null, null, null] +4785 - null - [null, null, null, null, null] +4786 - Potted plant - [null, null, null, null, null] +4787 - Bamboo Gate - [Open, null, null, null, null] +4788 - Bamboo Gate - [Open, null, null, null, null] +4789 - null - [null, null, null, null, null] +4790 - null - [null, null, null, null, null] +4791 - Bamboo Bed - [null, null, null, null, null] +4792 - Bamboo Bed - [null, null, null, null, null] +4793 - Bamboo Bed - [null, null, null, null, null] +4794 - Pot - [null, null, null, null, null] +4795 - Pots - [null, null, null, null, null] +4796 - null - [null, null, null, null, null] +4797 - Bamboo Desk - [null, null, null, null, null] +4798 - Bamboo Bookcase - [null, Search, null, null, null] +4799 - Jail Door - [Pick-lock, null, null, null, null] +4800 - Jail Door - [Pick-lock, null, null, null, null] +4801 - null - [null, null, null, null, null] +4802 - null - [null, null, null, null, null] +4803 - null - [null, null, null, null, null] +4804 - null - [null, null, null, null, null] +4805 - null - [null, null, null, null, null] +4806 - null - [null, null, null, null, null] +4807 - Bamboo Door - [Open, null, null, null, null] +4808 - null - [null, null, null, null, null] +4809 - null - [null, null, null, null, null] +4810 - null - [null, null, null, null, null] +4811 - null - [null, null, null, null, null] +4812 - Jungle Grass - [null, null, null, null, null] +4813 - Jungle Grass - [null, null, null, null, null] +4814 - Jungle Grass - [null, null, null, null, null] +4815 - Long grass - [null, null, null, null, null] +4816 - Jungle Tree - [null, null, null, null, null] +4817 - Jungle Palm - [null, null, null, null, null] +4818 - Jungle Tree - [Chop-down, null, hidden, null, null] +4819 - Jungle Tree Stump - [null, null, null, null, null] +4820 - Jungle Tree - [Chop-down, null, hidden, null, null] +4821 - Jungle Tree Stump - [null, null, null, null, null] +4822 - Tree stump - [null, null, null, null, null] +4823 - Jungle Flower - [null, null, null, null, null] +4824 - Orchid - [null, null, null, null, null] +4825 - Jungle Plant - [null, null, null, null, null] +4826 - Whipping Plant - [null, null, null, null, null] +4827 - Pineapple Plant - [Pick, null, null, null, null] +4828 - Jungle Plant - [null, null, null, null, null] +4829 - Jungle Plant - [null, null, null, null, null] +4830 - Jungle Plant - [null, null, null, null, null] +4831 - Jungle Plant - [null, null, null, null, null] +4832 - Creeping Plant - [null, null, null, null, null] +4833 - Jungle Bush - [null, null, null, null, null] +4834 - Jungle Bush - [null, null, null, null, null] +4835 - Slashed Bush - [null, null, null, null, null] +4836 - null - [null, null, null, null, null] +4837 - null - [null, null, null, null, null] +4838 - null - [null, null, null, null, null] +4839 - null - [null, null, null, null, null] +4840 - null - [null, null, null, null, null] +4841 - null - [null, null, null, null, null] +4842 - null - [null, null, null, null, null] +4843 - null - [null, null, null, null, null] +4844 - null - [null, null, null, null, null] +4845 - Tropical tree - [null, null, null, null, null] +4846 - Tropical tree - [null, null, null, null, null] +4847 - Tropical tree - [null, null, null, null, null] +4848 - Tropical Leaves - [null, null, null, null, null] +4849 - Tropical tree - [null, null, null, null, null] +4850 - Tropical tree - [null, null, null, null, null] +4851 - Tropical tree - [null, null, null, null, null] +4852 - Hollow Log - [null, null, null, null, null] +4853 - Roots - [null, null, null, null, null] +4854 - Roots - [null, null, null, null, null] +4855 - Roots - [null, null, null, null, null] +4856 - Glowing Fungus - [null, null, null, null, null] +4857 - Glowing Fungus - [null, null, null, null, null] +4858 - Gorilla Statue - [null, null, null, null, null] +4859 - Gorilla Statue - [Pray-at, null, null, null, null] +4860 - Gorilla Statue - [null, null, null, null, null] +4861 - Monkey Statue - [null, null, null, null, null] +4862 - Glowing Fungus - [null, null, null, null, null] +4863 - Watchtower Legs - [null, null, null, null, null] +4864 - Watchtower Legs - [null, null, null, null, null] +4865 - Watchtower Middle - [null, null, null, null, null] +4866 - Gnome Glider - [null, null, null, null, null] +4867 - Gnome Glider - [null, null, null, null, null] +4868 - Teleportation Device - [Operate, null, null, null, null] +4869 - Teleportation Device - [Operate, null, null, null, null] +4870 - Teleportation Device - [Operate, null, null, null, null] +4871 - Reinitialisation Panel - [Operate, null, null, null, null] +4872 - Exit Sign - [null, null, null, null, null] +4873 - Lever - [null, null, null, null, null] +4874 - Crafting Stall - [null, Steal from, null, null, null] +4875 - Food Stall - [null, Steal from, null, null, null] +4876 - General Stall - [null, Steal from, null, null, null] +4877 - Magic Stall - [null, Steal from, null, null, null] +4878 - Scimitar Stall - [null, Steal from, null, null, null] +4879 - Trapdoor - [Open, null, null, null, null] +4880 - Trapdoor - [Climb-down, Close, null, null, null] +4881 - Climbing rope - [Climb, null, null, null, null] +4882 - Slight indentations - [null, null, null, null, null] +4883 - A rock - [Search, null, null, null, null] +4884 - Plank - [null, null, null, null, null] +4885 - Stalagmites - [null, null, null, null, null] +4886 - Floor spikes - [null, null, null, null, null] +4887 - A rock - [Search, null, null, null, null] +4888 - Trapdoor - [Open, null, null, null, null] +4889 - Climbing rope - [Climb, null, null, null, null] +4890 - null - [null, null, null, null, null] +4891 - null - [null, null, null, null, null] +4892 - null - [null, null, null, null, null] +4893 - null - [null, null, null, null, null] +4894 - null - [null, null, null, null, null] +4895 - null - [null, null, null, null, null] +4896 - null - [null, null, null, null, null] +4897 - null - [null, null, null, null, null] +4898 - null - [null, null, null, null, null] +4899 - null - [null, null, null, null, null] +4900 - Saradomin Standard - [Take, null, null, null, null] +4901 - Zamorak Standard - [Take, null, null, null, null] +4902 - Saradomin Standard - [Capture, null, null, null, null] +4903 - Zamorak Standard - [Capture, null, null, null, null] +4904 - Catapult - [null, null, null, null, null] +4905 - Catapult - [null, null, null, null, null] +4906 - null - [null, null, null, null, null] +4907 - null - [null, null, null, null, null] +4908 - null - [null, null, null, null, null] +4909 - null - [null, null, null, null, null] +4910 - Barrel - [null, null, null, null, null] +4911 - Ladder - [Climb-down, null, null, null, null] +4912 - Ladder - [Climb-down, null, null, null, null] +4913 - Cart tunnel - [Crawl-down, null, null, null, null] +4914 - Cart tunnel - [Crawl-down, null, null, null, null] +4915 - Cart tunnel - [Crawl-down, null, null, null, null] +4916 - null - [null, null, null, null, null] +4917 - null - [null, null, null, null, null] +4918 - Mine cart - [Climb-over, null, null, null, null] +4919 - Stairs - [Walk-down, null, null, null, null] +4920 - Cart tunnel - [Crawl-through, null, null, null, null] +4921 - Cart tunnel - [Crawl-through, null, null, null, null] +4922 - Cart tunnel - [Crawl-through, null, null, null, null] +4923 - Stairs - [Walk-up, null, null, null, null] +4924 - Water Valve - [Turn, null, null, null, null] +4925 - null - [null, null, null, null, null] +4926 - Crystal outcrop - [Cut, null, null, null, null] +4927 - Crystal outcrop - [Cut, null, null, null, null] +4928 - Crystal outcrop - [Cut, null, null, null, null] +4929 - Dark tunnel - [null, null, null, null, null] +4930 - Mine cart - [null, null, null, null, null] +4931 - null - [null, null, null, null, null] +4932 - Glowing fungus - [Pick, null, null, null, null] +4933 - Glowing fungus - [Pick, null, null, null, null] +4934 - null - [null, null, null, null, null] +4935 - Ceiling support - [null, null, null, null, null] +4936 - Wall support - [null, null, null, null, null] +4937 - Lift - [Go-down, null, null, null, null] +4938 - Lift - [Go-down, null, null, null, null] +4939 - null - [null, null, null, null, null] +4940 - Lift - [Go-down, null, null, null, null] +4941 - null - [null, null, null, null, null] +4942 - Lift - [Go-up, null, null, null, null] +4943 - null - [null, null, null, null, null] +4944 - Crate - [null, null, null, null, null] +4945 - Mine cart - [null, null, null, null, null] +4946 - null - [null, null, null, null, null] +4947 - null - [null, null, null, null, null] +4948 - null - [null, null, null, null, null] +4949 - Points settings - [Check, null, null, null, null] +4950 - Lever - [Pull, null, null, null, null] +4951 - Lever - [Pull, null, null, null, null] +4952 - Lever - [Pull, null, null, null, null] +4953 - Lever - [Pull, null, null, null, null] +4954 - Lever - [Pull, null, null, null, null] +4955 - Lever - [Pull, null, null, null, null] +4956 - Lever - [Pull, null, null, null, null] +4957 - Lever - [Pull, null, null, null, null] +4958 - Lever - [null, null, null, null, null] +4959 - Lever - [null, null, null, null, null] +4960 - Lever - [null, null, null, null, null] +4961 - Lever - [null, null, null, null, null] +4962 - Door - [Open, null, null, null, null] +4963 - Large door - [Open, null, null, null, null] +4964 - Large door - [Open, null, null, null, null] +4965 - Ladder - [Climb-down, null, null, null, null] +4966 - Ladder - [Climb-up, null, null, null, null] +4967 - Ladder - [Climb-down, null, null, null, null] +4968 - Ladder - [Climb-up, null, null, null, null] +4969 - Ladder - [Climb-down, null, null, null, null] +4970 - Ladder - [Climb-up, null, null, null, null] +4971 - Stairs - [Walk-down, null, null, null, null] +4972 - Stairs - [Walk-up, null, null, null, null] +4973 - Stairs - [Walk-up, null, null, null, null] +4974 - Mine cart - [Search, null, null, null, null] +4975 - Crate - [Search, null, null, null, null] +4976 - Mineral vein - [Mine, Prospect, null, null, null] +4977 - Mineral vein - [Mine, Prospect, null, null, null] +4978 - Mineral vein - [Mine, Prospect, null, null, null] +4979 - Mineral vein - [Mine, Prospect, null, null, null] +4980 - Mineral vein - [Mine, Prospect, null, null, null] +4981 - Mineral vein - [Mine, Prospect, null, null, null] +4982 - Mineral vein - [Mine, Prospect, null, null, null] +4983 - Mineral vein - [Mine, Prospect, null, null, null] +4984 - Mineral vein - [Mine, Prospect, null, null, null] +4985 - Mineral vein - [Mine, Prospect, null, null, null] +4986 - Mineral vein - [Mine, Prospect, null, null, null] +4987 - Mineral vein - [Mine, Prospect, null, null, null] +4988 - Mineral vein - [Mine, Prospect, null, null, null] +4989 - Mineral vein - [Mine, Prospect, null, null, null] +4990 - Mineral vein - [Mine, Prospect, null, null, null] +4991 - Mineral vein - [Mine, Prospect, null, null, null] +4992 - Mineral vein - [Mine, Prospect, null, null, null] +4993 - Mineral vein - [Mine, Prospect, null, null, null] +4994 - Mineral vein - [Mine, Prospect, null, null, null] +4995 - Mineral vein - [Mine, Prospect, null, null, null] +4996 - Mineral vein - [Mine, Prospect, null, null, null] +4997 - null - [null, null, null, null, null] +4998 - null - [null, null, null, null, null] +4999 - null - [null, null, null, null, null] +5000 - null - [null, null, null, null, null] +5001 - Wooden boards - [null, null, null, null, null] +5002 - Rope bridge - [Walk-here, null, null, null, Repair] +5003 - Broken rope bridge - [Repair, null, null, null, null] +5004 - Tree - [null, null, null, null, null] +5005 - Tree - [Climb up, Climb down, null, null, null] +5006 - Rare Flowers - [null, Pick, null, null, null] +5007 - Cave entrance - [Enter, null, null, null, null] +5008 - Tunnel - [Enter, null, null, null, null] +5009 - Tunnel - [Enter, null, null, null, null] +5010 - Tunnel - [Enter, null, null, null, null] +5011 - Tunnel - [Enter, null, null, null, null] +5012 - Tunnel - [Enter, null, null, null, null] +5013 - Tunnel - [Enter, null, null, null, null] +5014 - Tunnel - [Enter, null, null, null, null] +5015 - slope - [Slide, null, null, null, null] +5016 - slope - [Slide, null, null, null, null] +5017 - null - [null, null, null, null, null] +5018 - null - [null, null, null, null, null] +5019 - null - [null, null, null, null, null] +5020 - null - [null, null, null, null, null] +5021 - null - [null, null, null, null, null] +5022 - null - [null, null, null, null, null] +5023 - null - [null, null, null, null, null] +5024 - null - [null, null, null, null, null] +5025 - Crevasse - [Enter, null, null, null, null] +5026 - null - [null, null, null, null, null] +5027 - null - [null, null, null, null, null] +5028 - null - [null, null, null, null, null] +5029 - null - [null, null, null, null, null] +5030 - null - [null, null, null, null, null] +5031 - null - [null, null, null, null, null] +5032 - null - [null, null, null, null, null] +5033 - null - [null, null, null, null, null] +5034 - null - [null, null, null, null, null] +5035 - null - [null, null, null, null, null] +5036 - null - [null, null, hidden, null, null] +5037 - Ice covered boulder - [null, null, null, null, null] +5038 - Ice covered boulder - [null, null, null, null, null] +5039 - Ice covered boulder - [null, null, null, null, null] +5040 - null - [null, null, null, null, null] +5041 - null - [null, null, null, null, null] +5042 - null - [null, null, null, null, null] +5043 - Ice gate - [Go-through, null, null, null, null] +5044 - Ice gate - [Go-through, null, null, null, null] +5045 - Tree - [null, null, null, null, null] +5046 - Cave entrance - [Enter, null, null, null, null] +5047 - Stalagmites - [null, null, null, null, null] +5048 - Stalactite - [null, null, null, null, null] +5049 - Stalagmite - [null, null, null, null, null] +5050 - Stalagmite - [Look, Squeeze-past, null, null, null] +5051 - Swamp Boaty - [null, null, null, null, null] +5052 - Wall - [Search, null, null, null, null] +5053 - null - [null, null, null, null, null] +5054 - Ladder - [Climb-up, null, null, null, null] +5055 - Trapdoor - [Open, null, null, null, null] +5056 - Wooden doors - [Open, null, null, null, null] +5057 - Wooden doors - [Open, null, null, null, null] +5058 - Wooden doors - [Walk-through, null, null, null, null] +5059 - Wooden doors - [Walk-through, null, null, null, null] +5060 - null - [null, null, null, null, null] +5061 - null - [null, null, null, null, null] +5062 - null - [null, null, null, null, null] +5063 - null - [null, null, null, null, null] +5064 - null - [null, null, null, null, null] +5065 - null - [null, null, null, null, null] +5066 - null - [null, null, null, null, null] +5067 - null - [null, null, null, null, null] +5068 - null - [null, null, null, null, null] +5069 - null - [null, null, null, null, null] +5070 - null - [null, null, null, null, null] +5071 - null - [null, null, null, null, null] +5072 - Pillar - [null, null, null, null, null] +5073 - null - [null, null, null, null, null] +5074 - null - [null, null, null, null, null] +5075 - null - [null, null, null, null, null] +5076 - null - [null, null, null, null, null] +5077 - null - [null, null, null, null, null] +5078 - null - [null, null, null, null, null] +5079 - null - [null, null, null, null, null] +5080 - null - [null, null, null, null, null] +5081 - null - [null, null, null, null, null] +5082 - Dungeon entrance - [Enter, null, null, null, null] +5083 - Dungeon entrance - [Enter, null, null, null, null] +5084 - Exit - [Leave, null, null, null, null] +5085 - null - [null, null, null, null, null] +5086 - null - [null, null, null, null, null] +5087 - null - [null, null, null, null, null] +5088 - Log balance - [Walk-across, null, null, null, null] +5089 - null - [null, null, null, null, null] +5090 - Log balance - [Walk-across, null, null, null, null] +5091 - null - [null, null, null, null, null] +5092 - null - [null, null, null, null, null] +5093 - null - [null, null, null, null, null] +5094 - Stairs - [Walk-up, null, null, null, null] +5095 - Stairs - [null, null, null, null, null] +5096 - Stairs - [Walk-down, null, null, null, null] +5097 - Stairs - [Walk-up, null, null, null, null] +5098 - Stairs - [Walk-down, null, null, null, null] +5099 - Pipe - [Squeeze-through, null, null, null, null] +5100 - Pipe - [Squeeze-through, null, null, null, null] +5101 - null - [null, null, null, null, null] +5102 - null - [null, null, null, null, null] +5103 - Vines - [Chop-down, null, hidden, null, null] +5104 - Vines - [Chop-down, null, hidden, null, null] +5105 - Vines - [Chop-down, null, hidden, null, null] +5106 - Vines - [Chop-down, null, hidden, null, null] +5107 - Vines - [Chop-down, null, hidden, null, null] +5108 - null - [null, null, null, null, null] +5109 - null - [null, null, null, null, null] +5110 - Stepping stone - [Jump-from, null, null, null, null] +5111 - Stepping stone - [Jump-from, null, null, null, null] +5112 - Mushroom - [null, null, null, null, null] +5113 - Fungus - [null, null, null, null, null] +5114 - Fungus - [null, null, null, null, null] +5115 - Fungus - [null, null, null, null, null] +5116 - Statue - [null, null, null, null, null] +5117 - Statue - [null, null, null, null, null] +5118 - null - [null, null, null, null, null] +5119 - null - [null, null, null, null, null] +5120 - null - [null, null, null, null, null] +5121 - null - [null, null, null, null, null] +5122 - Corpse - [null, null, null, null, null] +5123 - Corpse - [null, null, null, null, null] +5124 - Corpse - [null, null, null, null, null] +5125 - Corpse - [null, null, null, null, null] +5126 - Door - [Open, null, null, null, null] +5127 - Danger sign - [Read, null, null, null, null] +5128 - Door - [Close, null, null, null, null] +5129 - null - [null, null, null, null, null] +5130 - Ladder - [Climb-up, null, null, null, null] +5131 - Trapdoor - [Open, null, null, null, null] +5132 - Trapdoor - [Climb-down, Close, null, null, null] +5133 - Hurdle - [Jump, null, null, null, null] +5134 - Hurdle - [Jump, null, null, null, null] +5135 - Hurdle - [Jump, null, null, null, null] +5136 - Skull slope - [Climb-up, null, null, null, null] +5137 - null - [null, null, null, null, null] +5138 - Stepping stone - [Jump-to, null, null, null, null] +5139 - Zip line - [Teeth-grip, null, null, null, null] +5140 - Zip line - [Teeth-grip, null, null, null, null] +5141 - Zip line - [Teeth-grip, null, null, null, null] +5142 - Zip line - [null, null, null, null, null] +5143 - Zip line - [null, null, null, null, null] +5144 - Zip line - [null, null, null, null, null] +5145 - Zip line - [null, null, null, null, null] +5146 - Goal - [null, null, null, null, null] +5147 - Goal - [null, null, null, null, null] +5148 - Goal - [null, null, null, null, null] +5149 - null - [null, null, null, null, null] +5150 - null - [null, null, null, null, null] +5151 - null - [null, null, null, null, null] +5152 - Pipe - [Squeeze-through, null, null, null, null] +5153 - null - [null, null, null, null, null] +5154 - null - [null, null, null, null, null] +5155 - null - [null, null, null, null, null] +5156 - Cupboard - [Open, null, null, null, null] +5157 - Open Cupboard - [null, Search, Shut, null, null] +5158 - Pile of canes - [Take-from, null, null, null, null] +5159 - Bridge - [Cross, null, null, null, null] +5160 - Bridge - [Cross, null, null, null, null] +5161 - Clock - [Wind, null, null, null, null] +5162 - Chest - [Open, null, null, null, null] +5163 - Chest - [Search, Close, null, null, null] +5164 - Signpost - [Read, null, null, null, null] +5165 - Fireplace - [null, null, null, null, null] +5166 - Bookcase - [Search, null, null, null, null] +5167 - Memorial - [Push, Search, null, null, null] +5168 - Grave - [Read, Dig, null, null, null] +5169 - Grave - [Read, Dig, null, null, null] +5170 - Entrance - [Open, null, null, null, null] +5171 - null - [null, null, null, null, null] +5172 - Door - [Open, null, null, null, null] +5173 - null - [null, null, null, null, null] +5174 - Door - [Open, null, null, null, null] +5175 - null - [null, null, null, null, null] +5176 - Lightning conductor - [Repair, null, null, null, null] +5177 - Lightning conductor - [null, null, null, null, null] +5178 - Fireplace surround - [null, null, null, null, null] +5179 - Fireplace surround - [null, null, null, null, null] +5180 - null - [null, null, null, null, null] +5181 - null - [null, null, null, null, null] +5182 - null - [null, null, null, null, null] +5183 - Door - [Open, null, null, null, null] +5184 - null - [Open, null, null, null, null] +5185 - null - [Open, null, null, null, null] +5186 - Door - [Open, null, null, null, null] +5187 - Door - [Close, null, null, null, null] +5188 - Door - [Close, null, null, null, null] +5189 - null - [null, null, null, null, null] +5190 - null - [null, null, null, null, null] +5191 - null - [null, null, null, null, null] +5192 - null - [null, null, null, null, null] +5193 - null - [null, null, null, null, null] +5194 - null - [null, null, null, null, null] +5195 - null - [null, null, null, null, null] +5196 - null - [null, null, null, null, null] +5197 - null - [null, null, null, null, null] +5198 - null - [null, null, null, null, null] +5199 - null - [null, null, null, null, null] +5200 - null - [null, null, null, null, null] +5201 - null - [null, null, null, null, null] +5202 - Pile of bricks - [null, null, null, null, null] +5203 - null - [null, null, null, null, null] +5204 - null - [null, null, null, null, null] +5205 - null - [null, null, null, null, null] +5206 - Staircase - [Climb-up, null, null, null, null] +5207 - Staircase - [Climb-down, null, null, null, null] +5208 - null - [null, null, null, null, null] +5209 - null - [null, null, null, null, null] +5210 - null - [null, null, null, null, null] +5211 - null - [null, null, null, null, null] +5212 - null - [null, null, null, null, null] +5213 - null - [null, null, null, null, null] +5214 - null - [null, null, null, null, null] +5215 - null - [null, null, null, null, null] +5216 - null - [null, null, null, null, null] +5217 - null - [null, null, null, null, null] +5218 - null - [null, null, null, null, null] +5219 - null - [null, null, null, null, null] +5220 - null - [null, null, null, null, null] +5221 - null - [null, null, null, null, null] +5222 - null - [null, null, null, null, null] +5223 - null - [null, null, null, null, null] +5224 - null - [null, null, null, null, null] +5225 - null - [null, null, null, null, null] +5226 - null - [null, null, null, null, null] +5227 - null - [null, null, null, null, null] +5228 - Column - [null, null, null, null, null] +5229 - Column - [null, null, null, null, null] +5230 - Column - [null, null, null, null, null] +5231 - Stalagmite - [null, null, null, null, null] +5232 - Stalagmite - [null, null, null, null, null] +5233 - null - [null, null, null, null, null] +5234 - null - [null, null, null, null, null] +5235 - null - [null, null, null, null, null] +5236 - null - [null, null, null, null, null] +5237 - null - [null, null, null, null, null] +5238 - null - [null, null, null, null, null] +5239 - null - [null, null, null, null, null] +5240 - null - [null, null, null, null, null] +5241 - null - [null, null, null, null, null] +5242 - null - [null, null, null, null, null] +5243 - null - [null, null, null, null, null] +5244 - Door - [Open, null, null, null, null] +5245 - Door - [Close, null, null, null, null] +5246 - Bed - [null, null, null, null, null] +5247 - null - [null, null, null, null, null] +5248 - Crystal growth - [null, null, null, null, null] +5249 - Fire - [null, null, null, null, null] +5250 - Ladder - [Climb-down, null, null, null, null] +5251 - Ladder - [Climb-up, null, null, null, null] +5252 - Fire remains - [Search, null, null, null, null] +5253 - Nettles - [Pick, null, null, null, null] +5254 - Nettles - [Pick, null, null, null, null] +5255 - Nettles - [Pick, null, null, null, null] +5256 - Nettles - [Pick, null, null, null, null] +5257 - Nettles - [Pick, null, null, null, null] +5258 - Nettles - [Pick, null, null, null, null] +5259 - Energy Barrier - [Pass, null, null, Pay-toll(2-Ecto), null] +5260 - null - [null, null, null, null, null] +5261 - null - [null, null, null, null, null] +5262 - Stairs - [Climb-up, null, null, null, null] +5263 - Stairs - [Climb-down, null, null, null, null] +5264 - Ladder - [Climb-up, null, null, null, null] +5265 - Ship's ladder - [Climb-up, null, null, null, null] +5266 - Ship's ladder - [Climb-down, null, null, null, null] +5267 - Trapdoor - [Open, null, null, null, null] +5268 - Trapdoor - [Climb-down, Close, null, null, null] +5269 - Rock - [Jump-To, null, null, null, null] +5270 - Closed chest - [Open, null, null, null, null] +5271 - Open chest - [null, null, null, null, null] +5272 - Closed chest - [Open, null, null, null, null] +5273 - Open chest - [Search, Close, null, null, null] +5274 - Mast - [Search, null, null, null, null] +5275 - Cooking range - [null, null, null, null, null] +5276 - Bank booth - [Use, Use-quickly, Collect, null, null] +5277 - Closed bank booth - [null, null, null, null, null] +5278 - Coffin - [Open, null, null, null, null] +5279 - Coffin - [Search, Close, null, null, null] +5280 - Staircase - [Climb-up, null, null, null, null] +5281 - Staircase - [Climb-down, null, null, null, null] +5282 - Ectofuntus - [Worship, null, null, null, null] +5283 - Ectofuntus - [null, null, null, null, null] +5284 - Bone grinder - [Wind, Empty, Status, null, null] +5285 - Gangplank - [Cross, null, null, null, null] +5286 - Gangplank - [Cross, null, null, null, null] +5287 - Pirate Captain - [Talk-To, null, null, null, null] +5288 - null - [null, null, null, null, null] +5289 - null - [null, null, null, null, null] +5290 - null - [null, null, null, null, null] +5291 - null - [null, null, null, null, null] +5292 - null - [null, null, null, null, null] +5293 - null - [null, null, null, null, null] +5294 - null - [null, null, null, null, null] +5295 - null - [null, null, null, null, null] +5296 - null - [null, null, null, null, null] +5297 - null - [null, null, null, null, null] +5298 - null - [null, null, null, null, null] +5299 - null - [null, null, null, null, null] +5300 - null - [null, null, null, null, null] +5301 - null - [null, null, null, null, null] +5302 - null - [null, null, null, null, null] +5303 - null - [null, null, null, null, null] +5304 - null - [null, null, null, null, null] +5305 - null - [null, null, null, null, null] +5306 - Boat - [null, null, null, null, null] +5307 - null - [null, null, null, null, null] +5308 - null - [null, null, null, null, null] +5309 - null - [null, null, null, null, null] +5310 - null - [null, null, null, null, null] +5311 - null - [null, null, null, null, null] +5312 - null - [null, null, null, null, null] +5313 - null - [null, null, null, null, null] +5314 - null - [null, null, null, null, null] +5315 - null - [null, null, null, null, null] +5316 - null - [null, null, null, null, null] +5317 - null - [null, null, null, null, null] +5318 - null - [null, null, null, null, null] +5319 - null - [null, null, null, null, null] +5320 - null - [null, null, null, null, null] +5321 - null - [null, null, null, null, null] +5322 - null - [null, null, null, null, null] +5323 - null - [null, null, null, null, null] +5324 - null - [null, null, null, null, null] +5325 - null - [null, null, null, null, null] +5326 - null - [null, null, null, null, null] +5327 - null - [null, null, null, null, null] +5328 - null - [null, null, null, null, null] +5329 - null - [null, null, null, null, null] +5330 - Boxes - [Search, null, null, null, null] +5331 - Plant - [null, null, null, null, null] +5332 - Plant - [null, null, null, null, null] +5333 - Plant - [null, null, null, null, null] +5334 - Plant - [null, null, null, null, null] +5335 - null - [null, null, null, null, null] +5336 - null - [null, null, null, null, null] +5337 - null - [null, null, null, null, null] +5338 - null - [null, null, null, null, null] +5339 - null - [null, null, null, null, null] +5340 - null - [null, null, null, null, null] +5341 - null - [null, null, null, null, null] +5342 - null - [null, null, null, null, null] +5343 - null - [null, null, null, null, null] +5344 - null - [null, null, null, null, null] +5345 - Chair - [null, null, null, null, null] +5346 - Chair - [null, null, null, null, null] +5347 - Chair - [null, null, null, null, null] +5348 - Smashed chair - [null, null, null, null, null] +5349 - Table - [null, null, null, null, null] +5350 - Bar pumps - [null, null, null, null, null] +5351 - Bar - [null, null, null, null, null] +5352 - Cart - [null, null, null, null, null] +5353 - Wheelbarrow - [null, null, null, null, null] +5354 - Trough - [null, null, null, null, null] +5355 - Crate - [null, null, null, null, null] +5356 - Crates - [null, null, null, null, null] +5357 - Crates - [null, null, null, null, null] +5358 - Skeleton - [null, null, null, null, null] +5359 - Skeleton - [null, null, null, null, null] +5360 - Skeleton - [null, null, null, null, null] +5361 - null - [null, null, null, null, null] +5362 - null - [null, null, null, null, null] +5363 - null - [null, null, null, null, null] +5364 - null - [null, null, null, null, null] +5365 - null - [null, null, null, null, null] +5366 - null - [null, null, null, null, null] +5367 - null - [null, null, null, null, null] +5368 - null - [null, null, null, null, null] +5369 - null - [null, null, null, null, null] +5370 - null - [null, null, null, null, null] +5371 - null - [null, null, null, null, null] +5372 - null - [null, null, null, null, null] +5373 - null - [null, null, null, null, null] +5374 - null - [null, null, null, null, null] +5375 - null - [null, null, null, null, null] +5376 - null - [null, null, null, null, null] +5377 - null - [null, null, null, null, null] +5378 - null - [null, null, null, null, null] +5379 - null - [null, null, null, null, null] +5380 - null - [null, null, null, null, null] +5381 - null - [null, null, null, null, null] +5382 - null - [null, null, null, null, null] +5383 - null - [null, null, null, null, null] +5384 - null - [null, null, null, null, null] +5385 - null - [null, null, null, null, null] +5386 - null - [null, null, null, null, null] +5387 - null - [null, null, null, null, null] +5388 - null - [null, null, null, null, null] +5389 - null - [null, null, null, null, null] +5390 - null - [null, null, null, null, null] +5391 - null - [null, null, null, null, null] +5392 - null - [null, null, null, null, null] +5393 - null - [null, null, null, null, null] +5394 - null - [null, null, null, null, null] +5395 - null - [null, null, null, null, null] +5396 - null - [null, null, null, null, null] +5397 - Figurehead - [null, null, null, null, null] +5398 - null - [null, null, null, null, null] +5399 - null - [null, null, null, null, null] +5400 - null - [null, null, null, null, null] +5401 - null - [null, null, null, null, null] +5402 - null - [null, null, null, null, null] +5403 - Ship's wheel - [null, null, null, null, null] +5404 - Mast - [null, null, null, null, null] +5405 - null - [null, null, null, null, null] +5406 - null - [null, null, null, null, null] +5407 - null - [null, null, null, null, null] +5408 - null - [null, null, null, null, null] +5409 - null - [null, null, null, null, null] +5410 - null - [null, null, null, null, null] +5411 - null - [null, null, null, null, null] +5412 - null - [null, null, null, null, null] +5413 - null - [null, null, null, null, null] +5414 - null - [null, null, null, null, null] +5415 - Ship's ladder - [Climb-up, null, null, null, null] +5416 - Ship's ladder - [Climb-down, null, null, null, null] +5417 - null - [null, null, null, null, null] +5418 - null - [null, null, null, null, null] +5419 - null - [null, null, null, null, null] +5420 - null - [null, null, null, null, null] +5421 - null - [null, null, null, null, null] +5422 - null - [null, null, null, null, null] +5423 - null - [null, null, null, null, null] +5424 - null - [null, null, null, null, null] +5425 - null - [null, null, null, null, null] +5426 - null - [null, null, null, null, null] +5427 - null - [null, null, null, null, null] +5428 - null - [null, null, null, null, null] +5429 - Captain's Table - [null, null, null, null, null] +5430 - Market stall - [null, null, null, null, null] +5431 - Market stall - [null, null, null, null, null] +5432 - null - [null, null, null, null, null] +5433 - null - [null, null, null, null, null] +5434 - null - [null, null, null, null, null] +5435 - null - [null, null, null, null, null] +5436 - null - [null, null, null, null, null] +5437 - null - [null, null, null, null, null] +5438 - null - [null, null, null, null, null] +5439 - Broken Door - [null, null, null, null, null] +5440 - null - [null, null, null, null, null] +5441 - null - [null, null, null, null, null] +5442 - null - [null, null, null, null, null] +5443 - null - [null, null, null, null, null] +5444 - null - [null, null, null, null, null] +5445 - null - [null, null, null, null, null] +5446 - null - [null, null, null, null, null] +5447 - null - [null, null, null, null, null] +5448 - null - [null, null, null, null, null] +5449 - null - [null, null, null, null, null] +5450 - null - [null, null, null, null, null] +5451 - null - [null, null, null, null, null] +5452 - null - [null, null, null, null, null] +5453 - Door - [Open, null, null, null, null] +5454 - Door - [Open, null, null, null, null] +5455 - null - [null, null, null, null, null] +5456 - null - [null, null, null, null, null] +5457 - null - [null, null, null, null, null] +5458 - null - [null, null, null, null, null] +5459 - null - [null, null, null, null, null] +5460 - null - [null, null, null, null, null] +5461 - null - [null, null, null, null, null] +5462 - null - [null, null, null, null, null] +5463 - null - [null, null, null, null, null] +5464 - null - [null, null, null, null, null] +5465 - null - [null, null, null, null, null] +5466 - null - [null, null, null, null, null] +5467 - null - [null, null, null, null, null] +5468 - null - [null, null, null, null, null] +5469 - null - [null, null, null, null, null] +5470 - null - [null, null, null, null, null] +5471 - null - [null, null, null, null, null] +5472 - null - [null, null, null, null, null] +5473 - null - [null, null, null, null, null] +5474 - null - [null, null, null, null, null] +5475 - null - [null, null, null, null, null] +5476 - null - [null, null, null, null, null] +5477 - null - [null, null, null, null, null] +5478 - null - [null, null, null, null, null] +5479 - null - [null, null, null, null, null] +5480 - null - [null, null, null, null, null] +5481 - null - [null, null, null, null, null] +5482 - null - [null, null, null, null, null] +5483 - null - [null, null, null, null, null] +5484 - null - [null, null, null, null, null] +5485 - null - [null, null, null, null, null] +5486 - null - [null, null, null, null, null] +5487 - null - [null, null, null, null, null] +5488 - Ladder - [Climb-up, null, null, null, null] +5489 - Jewellery stall - [null, null, null, null, null] +5490 - Trapdoor - [Open, null, null, hidden, Pick-Lock] +5491 - Trapdoor - [Climb-down, Close, null, null, null] +5492 - null - [null, null, null, null, null] +5493 - Ladder - [Climb-up, null, null, null, null] +5494 - Standing torch - [null, null, null, null, null] +5495 - Bed - [null, null, null, null, null] +5496 - null - [null, null, null, null, null] +5497 - Bed - [null, null, null, null, null] +5498 - Bed - [null, null, null, null, null] +5499 - Fire - [null, null, null, null, null] +5500 - null - [null, null, null, null, null] +5501 - Door - [Open, null, null, null, Pick-lock] +5502 - null - [null, null, null, null, null] +5503 - null - [null, null, null, null, null] +5504 - null - [null, null, null, null, null] +5505 - null - [null, null, null, null, null] +5506 - null - [null, null, null, null, null] +5507 - null - [null, null, null, null, null] +5508 - Lectern - [null, null, null, null, null] +5509 - null - [null, null, null, null, null] +5510 - null - [null, null, null, null, null] +5511 - null - [null, null, null, null, null] +5512 - null - [null, null, null, null, null] +5513 - null - [null, null, null, null, null] +5514 - null - [null, null, null, null, null] +5515 - null - [null, null, null, null, null] +5516 - null - [null, null, null, null, null] +5517 - null - [null, null, null, null, null] +5518 - null - [null, null, null, null, null] +5519 - null - [null, null, null, null, null] +5520 - null - [null, null, null, null, null] +5521 - null - [null, null, null, null, null] +5522 - null - [null, null, null, null, null] +5523 - null - [null, null, null, null, null] +5524 - null - [null, null, null, null, null] +5525 - null - [null, null, null, null, null] +5526 - null - [null, null, null, null, null] +5527 - null - [null, null, null, null, null] +5528 - null - [null, null, null, null, null] +5529 - null - [null, null, null, null, null] +5530 - null - [null, null, null, null, null] +5531 - null - [null, null, null, null, null] +5532 - null - [null, null, null, null, null] +5533 - null - [null, null, null, null, null] +5534 - null - [null, null, null, null, null] +5535 - null - [null, null, null, null, null] +5536 - null - [null, null, null, null, null] +5537 - null - [null, null, null, null, null] +5538 - Onion - [null, Pick, null, null, null] +5539 - Bullrushes - [null, null, null, null, null] +5540 - Bullrushes - [null, null, null, null, null] +5541 - Bullrushes - [null, null, null, null, null] +5542 - Bullrushes - [null, null, null, null, null] +5543 - Heather - [null, null, null, null, null] +5544 - Heather - [null, null, null, null, null] +5545 - Heather - [null, null, null, null, null] +5546 - Heather - [null, null, null, null, null] +5547 - Heather - [null, null, null, null, null] +5548 - Heather - [null, null, null, null, null] +5549 - Heather - [null, null, null, null, null] +5550 - Dock leaf plant - [null, null, null, null, null] +5551 - Willow - [Chop down, null, hidden, null, null] +5552 - Willow - [Chop down, null, hidden, null, null] +5553 - Willow - [Chop down, null, hidden, null, null] +5554 - Tree Stump - [null, null, hidden, null, null] +5555 - Hanging tapestry - [null, null, null, null, null] +5556 - Hanging tapestry - [null, null, null, null, null] +5557 - null - [null, null, null, null, null] +5558 - Aggie's Cauldron - [null, null, null, null, null] +5559 - Charms - [null, null, null, null, null] +5560 - Mirror - [null, null, null, null, null] +5561 - Broom - [null, null, null, null, null] +5562 - Cloth - [null, null, null, null, null] +5563 - null - [null, null, null, null, null] +5564 - Bed - [null, null, null, null, null] +5565 - Bed - [null, null, null, null, null] +5566 - null - [null, null, null, null, null] +5567 - null - [null, null, null, null, null] +5568 - null - [null, null, null, null, null] +5569 - Dry stone wall - [null, null, null, null, null] +5570 - null - [null, null, null, null, null] +5571 - Coop - [null, null, null, null, null] +5572 - Coop - [null, null, null, null, null] +5573 - Coop - [null, null, null, null, null] +5574 - Sack - [null, null, null, null, null] +5575 - Trough - [null, null, null, null, null] +5576 - Trough - [null, null, null, null, null] +5577 - Trough - [null, null, null, null, null] +5578 - Cart - [null, null, null, null, null] +5579 - Cart - [null, null, null, null, null] +5580 - Wheelbarrow - [null, null, null, null, null] +5581 - Logs - [Take-axe, null, null, null, null] +5582 - Logs - [null, null, null, null, null] +5583 - Wheat - [null, Pick, null, null, null] +5584 - Wheat - [null, Pick, null, null, null] +5585 - Wheat - [null, Pick, null, null, null] +5586 - null - [null, null, null, null, null] +5587 - null - [null, null, null, null, null] +5588 - null - [null, null, null, null, null] +5589 - Water wheel - [null, null, null, null, null] +5590 - Water wheel - [null, null, null, null, null] +5591 - Water wheel - [null, null, null, null, null] +5592 - null - [null, null, null, null, null] +5593 - null - [null, null, null, null, null] +5594 - Water wheel - [null, null, null, null, null] +5595 - Toy Stall - [null, null, null, null, null] +5596 - Market stall - [null, null, null, null, null] +5597 - Weather vane - [null, null, null, null, null] +5598 - Water Barrel - [null, null, null, null, null] +5599 - Water Barrel - [null, null, null, null, null] +5600 - null - [null, null, null, null, null] +5601 - null - [null, null, null, null, null] +5602 - null - [null, null, null, null, null] +5603 - null - [null, null, null, null, null] +5604 - Rock - [null, null, null, null, null] +5605 - Rock - [null, null, null, null, null] +5606 - Rock - [null, null, null, null, null] +5607 - null - [null, null, null, null, null] +5608 - Spit roast - [null, null, null, null, null] +5609 - Cooking Pots - [null, null, null, null, null] +5610 - Cooking Pots - [null, null, null, null, null] +5611 - null - [null, null, null, null, null] +5612 - null - [null, null, null, null, null] +5613 - Rat-hole - [null, null, null, null, null] +5614 - Chair - [null, null, null, null, null] +5615 - Bench - [null, null, null, null, null] +5616 - Signpost - [null, null, null, null, null] +5617 - null - [null, null, null, null, null] +5618 - Drawers - [Open, null, null, null, null] +5619 - Drawers - [null, Search, Shut, null, null] +5620 - null - [null, null, null, null, null] +5621 - Big vase - [null, null, null, null, null] +5622 - Wardrobe - [Open, null, null, null, null] +5623 - Wardrobe - [null, Search, Close, null, null] +5624 - Wardrobe - [null, Search, Close, null, null] +5625 - Ned's Table - [null, null, null, null, null] +5626 - null - [null, null, null, null, null] +5627 - Standard - [null, null, null, null, null] +5628 - Standard - [null, null, null, null, null] +5629 - Standard - [null, null, null, null, null] +5630 - null - [null, null, null, null, null] +5631 - Fire - [null, null, null, null, null] +5632 - Fire - [null, null, null, null, null] +5633 - null - [null, null, null, null, null] +5634 - null - [null, null, null, null, null] +5635 - null - [null, null, null, null, null] +5636 - null - [null, null, null, null, null] +5637 - null - [null, null, null, null, null] +5638 - null - [null, null, null, null, null] +5639 - null - [null, null, null, null, null] +5640 - null - [null, null, null, null, null] +5641 - null - [null, null, null, null, null] +5642 - null - [null, null, null, null, null] +5643 - null - [null, null, null, null, null] +5644 - null - [null, null, null, null, null] +5645 - null - [null, null, null, null, null] +5646 - null - [null, null, null, null, null] +5647 - null - [null, null, null, null, null] +5648 - null - [null, null, null, null, null] +5649 - null - [null, null, null, null, null] +5650 - null - [null, null, null, null, null] +5651 - null - [null, null, null, null, null] +5652 - null - [null, null, null, null, null] +5653 - null - [null, null, null, null, null] +5654 - null - [null, null, null, null, null] +5655 - null - [null, null, null, null, null] +5656 - null - [null, null, null, null, null] +5657 - null - [null, null, null, null, null] +5658 - null - [null, null, null, null, null] +5659 - null - [null, null, null, null, null] +5660 - null - [null, null, null, null, null] +5661 - null - [null, null, null, null, null] +5662 - null - [null, null, null, null, null] +5663 - null - [null, null, null, null, null] +5664 - null - [null, null, null, null, null] +5665 - null - [null, null, null, null, null] +5666 - null - [null, null, null, null, null] +5667 - Large door - [Open, null, null, null, null] +5668 - null - [null, null, null, null, null] +5669 - null - [null, null, null, null, null] +5670 - null - [null, null, null, null, null] +5671 - null - [null, null, null, null, null] +5672 - null - [null, null, null, null, null] +5673 - null - [null, null, null, null, null] +5674 - null - [null, null, null, null, null] +5675 - null - [null, null, null, null, null] +5676 - null - [null, null, null, null, null] +5677 - null - [null, null, null, null, null] +5678 - null - [null, null, null, null, null] +5679 - null - [null, null, null, null, null] +5680 - null - [null, null, null, null, null] +5681 - null - [null, null, null, null, null] +5682 - null - [null, null, null, null, null] +5683 - null - [null, null, null, null, null] +5684 - null - [null, null, null, null, null] +5685 - null - [null, null, null, null, null] +5686 - null - [null, null, null, null, null] +5687 - null - [null, null, null, null, null] +5688 - null - [null, null, null, null, null] +5689 - null - [null, null, null, null, null] +5690 - null - [null, null, null, null, null] +5691 - null - [null, null, null, null, null] +5692 - null - [null, null, null, null, null] +5693 - null - [null, null, null, null, null] +5694 - null - [null, null, null, null, null] +5695 - null - [null, null, null, null, null] +5696 - null - [null, null, null, null, null] +5697 - null - [null, null, null, null, null] +5698 - null - [null, null, null, null, null] +5699 - null - [null, null, null, null, null] +5700 - null - [null, null, null, null, null] +5701 - null - [null, null, null, null, null] +5702 - null - [null, null, null, null, null] +5703 - null - [null, null, null, null, null] +5704 - null - [null, null, null, null, null] +5705 - null - [null, null, null, null, null] +5706 - null - [null, null, null, null, null] +5707 - null - [null, null, null, null, null] +5708 - null - [null, null, null, null, null] +5709 - null - [null, null, null, null, null] +5710 - null - [null, null, null, null, null] +5711 - null - [null, null, null, null, null] +5712 - null - [null, null, null, null, null] +5713 - null - [null, null, null, null, null] +5714 - null - [null, null, null, null, null] +5715 - null - [null, null, null, null, null] +5716 - null - [null, null, null, null, null] +5717 - null - [null, null, null, null, null] +5718 - null - [null, null, null, null, null] +5719 - null - [null, null, null, null, null] +5720 - null - [null, null, null, null, null] +5721 - null - [null, null, null, null, null] +5722 - null - [null, null, null, null, null] +5723 - null - [null, null, null, null, null] +5724 - null - [null, null, null, null, null] +5725 - null - [null, null, null, null, null] +5726 - null - [null, null, null, null, null] +5727 - null - [null, null, null, null, null] +5728 - null - [null, null, null, null, null] +5729 - null - [null, null, null, null, null] +5730 - null - [null, null, null, null, null] +5731 - null - [null, null, null, null, null] +5732 - null - [null, null, null, null, null] +5733 - null - [null, null, null, null, null] +5734 - null - [null, null, null, null, null] +5735 - null - [null, null, null, null, null] +5736 - null - [null, null, null, null, null] +5737 - null - [null, null, null, null, null] +5738 - null - [null, null, null, null, null] +5739 - null - [null, null, null, null, null] +5740 - null - [null, null, null, null, null] +5741 - null - [null, null, null, null, null] +5742 - null - [null, null, null, null, null] +5743 - null - [null, null, null, null, null] +5744 - null - [null, null, null, null, null] +5745 - null - [null, null, null, null, null] +5746 - null - [null, null, null, null, null] +5747 - null - [null, null, null, null, null] +5748 - null - [null, null, null, null, null] +5749 - null - [null, null, null, null, null] +5750 - null - [null, null, null, null, null] +5751 - null - [null, null, null, null, null] +5752 - null - [null, null, null, null, null] +5753 - null - [null, null, null, null, null] +5754 - null - [null, null, null, null, null] +5755 - null - [null, null, null, null, null] +5756 - null - [null, null, null, null, null] +5757 - null - [null, null, null, null, null] +5758 - null - [null, null, null, null, null] +5759 - null - [null, null, null, null, null] +5760 - null - [null, null, null, null, null] +5761 - null - [null, null, null, null, null] +5762 - null - [null, null, null, null, null] +5763 - null - [null, null, null, null, null] +5764 - null - [null, null, null, null, null] +5765 - null - [null, null, null, null, null] +5766 - null - [null, null, null, null, null] +5767 - null - [null, null, null, null, null] +5768 - null - [null, null, null, null, null] +5769 - null - [null, null, null, null, null] +5770 - null - [null, null, null, null, null] +5771 - null - [null, null, null, null, null] +5772 - null - [null, null, null, null, null] +5773 - null - [null, null, null, null, null] +5774 - null - [null, null, null, null, null] +5775 - null - [null, null, null, null, null] +5776 - null - [null, null, null, null, null] +5777 - null - [null, null, null, null, null] +5778 - null - [null, null, null, null, null] +5779 - null - [null, null, null, null, null] +5780 - null - [null, null, null, null, null] +5781 - null - [null, null, null, null, null] +5782 - null - [null, null, null, null, null] +5783 - null - [null, null, null, null, null] +5784 - null - [null, null, null, null, null] +5785 - null - [null, null, null, null, null] +5786 - null - [null, null, null, null, null] +5787 - null - [null, null, null, null, null] +5788 - Church pew - [null, null, null, null, null] +5789 - Statue - [null, null, null, null, null] +5790 - Statue - [null, null, null, null, null] +5791 - Statue - [null, null, null, null, null] +5792 - Flour bin - [null, null, null, null, null] +5793 - Crack - [Enter, null, null, null, null] +5794 - Crack - [Enter, null, null, null, null] +5795 - Crack - [Enter, null, null, null, null] +5796 - Crack - [Enter, null, null, null, null] +5797 - Crack - [Enter, null, null, null, null] +5798 - Crack - [Enter, null, null, null, null] +5799 - Trapdoor - [Open, null, null, null, null] +5800 - Trapdoor - [Open, null, null, null, null] +5801 - Trapdoor - [Open, null, null, null, null] +5802 - Trapdoor - [Open, null, null, null, null] +5803 - Trapdoor - [Open, null, null, null, null] +5804 - Trapdoor - [Open, null, null, null, null] +5805 - Trapdoor - [Open, null, null, null, null] +5806 - Trapdoor - [Open, null, null, null, null] +5807 - null - [null, null, null, null, null] +5808 - Sculpture - [Look, null, null, null, Search] +5809 - Weathervane - [Look, null, null, null, Search] +5810 - Seers weathervane - [null, null, null, null, null] +5811 - null - [null, null, null, null, null] +5812 - null - [null, null, null, null, null] +5813 - Ladder - [Climb-down, null, null, null, null] +5814 - Landing light - [null, null, null, null, null] +5815 - Gnome landing light - [Look, null, null, null, Search] +5816 - Flashing landing light - [Look, null, null, null, null] +5817 - Flashing landing light - [Look, null, null, null, null] +5818 - Flashing landing light - [Look, null, null, null, null] +5819 - Flashing landing light - [Look, null, null, null, null] +5820 - null - [null, null, null, null, null] +5821 - null - [null, null, null, null, null] +5822 - null - [null, null, null, null, null] +5823 - null - [null, null, null, null, null] +5824 - null - [null, null, null, null, null] +5825 - Gnome glider - [null, null, null, null, null] +5826 - Swordshop Sign - [null, null, null, null, null] +5827 - null - [null, null, null, null, null] +5828 - null - [null, null, null, null, null] +5829 - null - [null, null, null, null, null] +5830 - null - [null, null, null, null, null] +5831 - Antiques Shop Stall - [Ring-bell, null, null, null, null] +5832 - null - [null, null, null, null, null] +5833 - null - [null, null, null, null, null] +5834 - null - [null, null, null, null, null] +5835 - null - [null, null, null, null, null] +5836 - null - [null, null, null, null, null] +5837 - null - [null, null, null, null, null] +5838 - null - [null, null, null, null, null] +5839 - null - [null, null, null, null, null] +5840 - null - [null, null, null, null, null] +5841 - null - [null, null, null, null, null] +5842 - Boulder - [null, null, Push, null, null] +5843 - Boulder - [null, null, null, null, null] +5844 - Rock - [null, null, null, null, null] +5845 - Rock - [null, null, null, null, null] +5846 - Rope - [null, null, null, null, null] +5847 - Rockslide - [Climb-over, null, null, null, null] +5848 - Tall tree - [null, null, Climb, null, null] +5849 - Clump of rocks - [Jump-across, null, null, null, null] +5850 - Flat stone - [Jump-across, null, null, null, null] +5851 - Flat stone - [Jump-across, null, null, null, null] +5852 - Flat stone - [null, null, null, null, null] +5853 - Flat stone - [null, null, null, null, null] +5854 - Flat stone - [null, null, null, null, null] +5855 - Shining pool - [null, null, Listen-to, null, null] +5856 - Thorny bushes - [null, null, Pick-from, null, null] +5857 - Cave entrance - [Enter, null, null, null, null] +5858 - Cave exit - [Exit, null, null, null, null] +5859 - Cave exit - [Exit, null, null, null, null] +5860 - Standing spears - [null, null, null, null, null] +5861 - null - [null, null, null, null, null] +5862 - Burial mound - [null, null, null, null, null] +5863 - Burial cairn - [null, null, null, null, null] +5864 - null - [null, null, null, null, null] +5865 - null - [null, null, null, null, null] +5866 - null - [null, null, null, null, null] +5867 - null - [null, null, null, null, null] +5868 - null - [null, null, null, null, null] +5869 - null - [null, null, null, null, null] +5870 - null - [null, null, null, null, null] +5871 - null - [null, null, null, null, null] +5872 - null - [null, null, null, null, null] +5873 - null - [null, null, null, null, null] +5874 - null - [null, null, null, null, null] +5875 - null - [null, null, null, null, null] +5876 - null - [null, null, null, null, null] +5877 - null - [null, null, null, null, null] +5878 - Wooden Table - [null, null, null, null, null] +5879 - Table - [null, null, null, null, null] +5880 - Stool - [null, null, null, null, null] +5881 - Standing torch - [null, null, null, null, null] +5882 - null - [null, null, null, null, null] +5883 - Mud - [Dig-up, null, null, null, null] +5884 - Swamp - [null, null, null, null, null] +5885 - Roots - [Dig-below, null, null, null, null] +5886 - Roots - [Dig-below, null, null, null, null] +5887 - Tent door - [Open, null, null, null, null] +5888 - Tent door - [Close, null, null, null, null] +5889 - Tent door - [Open, null, null, null, null] +5890 - Tent door - [Close, null, null, null, null] +5891 - Tent door - [Go-through, null, null, null, null] +5892 - null - [null, null, null, null, null] +5893 - Tent door - [Go-through, null, null, null, null] +5894 - null - [null, null, null, null, null] +5895 - Ancient Rock - [null, null, null, null, null] +5896 - Ancient Rock - [null, null, null, null, null] +5897 - Shining pool - [Listen-to, null, null, null, null] +5898 - null - [null, null, null, null, null] +5899 - null - [null, null, null, null, null] +5900 - null - [null, null, null, null, null] +5901 - null - [null, null, null, null, null] +5902 - Dead tree - [Chop down, null, hidden, null, null] +5903 - Dead tree - [Chop down, null, hidden, null, null] +5904 - Dead tree - [Chop down, null, hidden, null, null] +5905 - Tree stump - [Step-over, null, null, null, null] +5906 - null - [null, null, null, null, null] +5907 - null - [null, null, null, null, null] +5908 - null - [null, null, null, null, null] +5909 - Lamp oil still - [null, null, null, null, null] +5910 - Lamp oil still - [null, null, null, null, null] +5911 - null - [null, null, null, null, null] +5912 - null - [null, null, null, null, null] +5913 - null - [null, null, null, null, null] +5914 - null - [null, null, null, null, null] +5915 - null - [null, null, null, null, null] +5916 - null - [null, null, null, null, null] +5917 - Gas hole - [null, null, null, null, null] +5918 - Gas hole - [null, null, null, null, null] +5919 - null - [null, null, null, null, null] +5920 - null - [null, null, null, null, null] +5921 - null - [null, null, null, null, null] +5922 - null - [null, null, null, null, null] +5923 - null - [null, null, null, null, null] +5924 - null - [null, null, null, null, null] +5925 - null - [null, null, null, null, null] +5926 - null - [null, null, null, null, null] +5927 - null - [null, null, null, null, null] +5928 - null - [null, null, null, null, null] +5929 - null - [null, null, null, null, null] +5930 - null - [null, null, null, null, null] +5931 - null - [null, null, null, null, null] +5932 - null - [null, null, null, null, null] +5933 - null - [null, null, null, null, null] +5934 - null - [null, null, null, null, null] +5935 - null - [null, null, null, null, null] +5936 - null - [null, null, null, null, null] +5937 - null - [null, null, null, null, null] +5938 - null - [null, null, null, null, null] +5939 - null - [null, null, null, null, null] +5940 - null - [null, null, null, null, null] +5941 - null - [null, null, null, null, null] +5942 - null - [null, null, null, null, null] +5943 - null - [null, null, null, null, null] +5944 - null - [null, null, null, null, null] +5945 - null - [null, null, null, null, null] +5946 - Climbing rope - [Climb, null, null, null, null] +5947 - Dark hole - [Climb-down, null, null, null, null] +5948 - Stepping stone - [Jump-across, null, null, null, null] +5949 - Stepping stone - [Jump-across, null, null, null, null] +5950 - null - [null, null, null, null, null] +5951 - null - [null, null, null, null, null] +5952 - null - [null, null, null, null, null] +5953 - null - [null, null, null, null, null] +5954 - null - [null, null, null, null, null] +5955 - null - [null, null, null, null, null] +5956 - null - [null, null, null, null, null] +5957 - null - [null, null, null, null, null] +5958 - null - [null, null, null, null, null] +5959 - Lever - [Pull, null, null, null, null] +5960 - Lever - [Pull, null, null, null, null] +5961 - null - [null, null, null, null, null] +5962 - null - [null, null, null, null, null] +5963 - null - [null, null, null, null, null] +5964 - Cannonball - [null, null, null, null, null] +5965 - Gold cannonball - [null, null, null, null, null] +5966 - Passage - [null, null, null, null, null] +5967 - Cannonballs - [null, null, null, null, null] +5968 - Cannonballs - [null, null, null, null, null] +5969 - Cannonballs - [null, null, null, null, null] +5970 - Cannonballs - [null, null, null, null, null] +5971 - Cannonballs - [null, null, null, null, null] +5972 - Cannonballs - [null, null, null, null, null] +5973 - Cave entrance - [Go-through, null, null, null, null] +5974 - null - [null, null, null, null, null] +5975 - Dwarf MultiCannon - [Fire, null, null, null, null] +5976 - Dwarf MultiCannon - [null, null, null, null, null] +5977 - Wall of flame - [Jump-through, null, null, null, null] +5978 - Wall of flame - [Jump-through, null, null, null, null] +5979 - Wall of flame - [Jump-through, Talk-to, null, null, null] +5980 - Wall of flame - [Jump-through, Talk-to, null, null, null] +5981 - Fire - [null, null, null, null, null] +5982 - null - [null, null, null, null, null] +5983 - null - [null, null, null, null, null] +5984 - null - [null, null, null, null, null] +5985 - Rock - [null, null, null, null, null] +5986 - Small rock - [null, null, null, null, null] +5987 - Rock - [null, null, null, null, null] +5988 - null - [null, null, null, null, null] +5989 - Mineral vein - [Mine, Prospect, null, null, null] +5990 - Mineral vein - [Mine, Prospect, null, null, null] +5991 - Mineral vein - [Mine, Prospect, null, null, null] +5992 - null - [null, null, null, null, null] +5993 - null - [null, null, null, null, null] +5994 - null - [null, null, null, null, null] +5995 - null - [null, null, null, null, null] +5996 - null - [null, null, null, null, null] +5997 - null - [null, null, null, null, null] +5998 - Entrance - [Go-through, null, null, null, null] +5999 - null - [null, null, null, null, null] +6000 - null - [null, null, null, null, null] +6001 - null - [null, null, null, null, null] +6002 - null - [null, null, null, null, null] +6003 - null - [null, null, null, null, null] +6004 - null - [null, null, null, null, null] +6005 - null - [null, null, null, null, null] +6006 - null - [null, null, null, null, null] +6007 - null - [null, null, null, null, null] +6008 - null - [null, null, null, null, null] +6009 - Blue Fire - [null, null, null, null, null] +6010 - null - [null, null, null, null, null] +6011 - null - [null, null, null, null, null] +6012 - null - [null, null, null, null, null] +6013 - null - [null, null, null, null, null] +6014 - null - [null, null, null, null, null] +6015 - null - [null, null, null, null, null] +6016 - null - [null, null, null, null, null] +6017 - null - [null, null, null, null, null] +6018 - null - [null, null, null, null, null] +6019 - null - [null, null, null, null, null] +6020 - null - [null, null, null, null, null] +6021 - null - [null, null, null, null, null] +6022 - null - [null, null, null, null, null] +6023 - null - [null, null, null, null, null] +6024 - null - [null, null, null, null, null] +6025 - null - [null, null, null, null, null] +6026 - null - [null, null, null, null, null] +6027 - null - [null, null, null, null, null] +6028 - null - [null, null, null, null, null] +6029 - null - [null, null, null, null, null] +6030 - null - [null, null, null, null, null] +6031 - null - [null, null, null, null, null] +6032 - Boiler - [null, null, null, null, null] +6033 - Boiler - [null, null, null, null, null] +6034 - null - [null, null, null, null, null] +6035 - null - [null, null, null, null, null] +6036 - Ship's ladder - [null, null, null, null, null] +6037 - Ship's ladder - [null, null, null, null, null] +6038 - Ship's wheel - [null, null, null, null, null] +6039 - null - [null, null, null, null, null] +6040 - null - [null, null, null, null, null] +6041 - null - [null, null, null, null, null] +6042 - null - [null, null, null, null, null] +6043 - Boiler - [null, null, null, null, null] +6044 - Boiler - [null, null, null, null, null] +6045 - Mine cart - [Search, null, null, null, null] +6046 - null - [null, null, null, null, null] +6047 - null - [null, null, null, null, null] +6048 - null - [null, null, null, null, null] +6049 - null - [null, null, null, null, null] +6050 - null - [null, null, null, null, null] +6051 - null - [null, null, null, null, null] +6052 - null - [null, null, null, null, null] +6053 - null - [null, null, null, null, null] +6054 - null - [null, null, null, null, null] +6055 - null - [null, null, null, null, null] +6056 - null - [null, null, null, null, null] +6057 - null - [null, null, null, null, null] +6058 - null - [null, null, null, null, null] +6059 - null - [null, null, null, null, null] +6060 - null - [null, null, null, null, null] +6061 - null - [null, null, null, null, null] +6062 - null - [null, null, null, null, null] +6063 - null - [null, null, null, null, null] +6064 - Hat stand - [null, null, null, null, null] +6065 - Clothes - [null, null, null, null, null] +6066 - Weapon Rack - [null, null, null, null, null] +6067 - Weapon Rack - [null, null, null, null, null] +6068 - Weapon Rack - [null, null, null, null, null] +6069 - Weapon Rack - [null, null, null, null, null] +6070 - Cabinet - [null, null, null, null, null] +6071 - Cabinet - [null, null, null, null, null] +6072 - Cabinet - [null, null, null, null, null] +6073 - Cabinet - [null, null, null, null, null] +6074 - Cabinet - [null, null, null, null, null] +6075 - Table - [null, null, null, null, null] +6076 - Desk - [null, null, null, null, null] +6077 - Desk - [null, null, null, null, null] +6078 - Desk - [null, null, null, null, null] +6079 - Desk - [null, null, null, null, null] +6080 - Spinning Machine - [null, null, null, null, null] +6081 - Bank table - [null, null, null, null, null] +6082 - Bank table - [null, null, null, null, null] +6083 - Closed bank booth - [null, null, null, null, null] +6084 - Bank booth - [Use, Use-quickly, Collect, null, null] +6085 - Stairs - [Climb-up, null, null, null, null] +6086 - Stairs - [Climb-down, null, null, null, null] +6087 - Stairs - [Climb-up, null, null, null, null] +6088 - Stairs - [Climb-down, null, null, null, null] +6089 - Stairs - [Climb-up, null, null, null, null] +6090 - Stairs - [Climb-down, null, null, null, null] +6091 - Bookcase - [Search, null, null, null, null] +6092 - Bookcase - [Climb, null, null, null, null] +6093 - Fireplace - [null, null, null, null, null] +6094 - Fireplace - [null, null, null, null, null] +6095 - Fireplace - [null, null, null, null, null] +6096 - Fireplace - [null, null, null, null, null] +6097 - Well - [null, null, null, null, null] +6098 - null - [null, null, null, null, null] +6099 - null - [null, null, null, null, null] +6100 - Door - [Open, null, null, null, null] +6101 - Door - [Close, null, null, null, null] +6102 - Door - [Open, null, null, null, null] +6103 - Door - [Close, null, null, null, null] +6104 - Door - [Open, null, null, null, null] +6105 - Door - [Close, null, null, null, null] +6106 - Door - [Open, null, null, null, null] +6107 - Door - [Close, null, null, null, null] +6108 - Door - [Open, null, null, null, null] +6109 - Door - [Close, null, null, null, null] +6110 - Door - [Open, null, null, null, null] +6111 - Door - [Close, null, null, null, null] +6112 - Door - [Open, null, null, null, null] +6113 - Door - [Close, null, null, null, null] +6114 - Door - [Open, null, null, null, null] +6115 - Door - [Close, null, null, null, null] +6116 - null - [null, null, null, null, null] +6117 - null - [null, null, null, null, null] +6118 - null - [null, null, null, null, null] +6119 - null - [null, null, null, null, null] +6120 - null - [null, null, null, null, null] +6121 - null - [null, null, null, null, null] +6122 - null - [null, null, null, null, null] +6123 - null - [null, null, null, null, null] +6124 - null - [null, null, null, null, null] +6125 - null - [null, null, null, null, null] +6126 - null - [null, null, null, null, null] +6127 - null - [null, null, null, null, null] +6128 - null - [null, null, null, null, null] +6129 - null - [null, null, null, null, null] +6130 - null - [null, null, null, null, null] +6131 - null - [null, null, null, null, null] +6132 - null - [null, null, null, null, null] +6133 - null - [null, null, null, null, null] +6134 - null - [null, null, null, null, null] +6135 - null - [null, null, null, null, null] +6136 - null - [null, null, null, null, null] +6137 - null - [null, null, null, null, null] +6138 - null - [null, null, null, null, null] +6139 - null - [null, null, null, null, null] +6140 - null - [null, null, null, null, null] +6141 - null - [null, null, null, null, null] +6142 - null - [null, null, null, null, null] +6143 - null - [null, null, null, null, null] +6144 - null - [null, null, null, null, null] +6145 - null - [null, null, null, null, null] +6146 - Bird cage stand - [null, null, null, null, null] +6147 - Column - [null, null, null, null, null] +6148 - Column - [null, null, null, null, null] +6149 - Column - [null, null, null, null, null] +6150 - Anvil - [null, null, null, null, null] +6151 - Sink - [null, null, null, null, null] +6152 - Bar - [null, null, null, null, null] +6153 - Bar - [null, null, null, null, null] +6154 - Shelves - [null, null, null, null, null] +6155 - Shelves - [null, null, null, null, null] +6156 - Shelves - [null, null, null, null, null] +6157 - Shelves - [null, null, null, null, null] +6158 - Red fungi - [null, null, null, null, null] +6159 - Red fungi - [null, null, null, null, null] +6160 - Red fungi - [null, null, null, null, null] +6161 - Red fungi - [null, null, null, null, null] +6162 - Gem Stall - [null, Steal-from, null, null, null] +6163 - Bakery stall - [null, Steal-from, null, null, null] +6164 - Silver stall - [null, Steal-from, null, null, null] +6165 - Clothes stall - [null, Steal-from, null, null, null] +6166 - Crafting stall - [null, Steal-from, null, null, null] +6167 - null - [null, null, null, null, null] +6168 - null - [null, null, null, null, null] +6169 - null - [null, null, null, null, null] +6170 - null - [null, null, null, null, null] +6171 - null - [null, null, null, null, null] +6172 - null - [null, null, null, null, null] +6173 - Giant Dwarf - [null, null, null, null, null] +6174 - Giant Dwarf - [null, null, null, null, null] +6175 - Giant Dwarf - [null, null, null, null, null] +6176 - Boxes - [Search, null, null, null, null] +6177 - Crate - [null, null, null, null, null] +6178 - Crates - [null, null, null, null, null] +6179 - Cooking Pots - [null, null, null, null, null] +6180 - Cooking Pots - [null, null, null, null, null] +6181 - Hanging meat - [null, null, null, null, null] +6182 - Hanging meat - [null, null, null, null, null] +6183 - Bed - [null, null, null, null, null] +6184 - Bed - [null, null, null, null, null] +6185 - Armour - [null, null, null, null, null] +6186 - Armour - [null, null, null, null, null] +6187 - Armour - [null, null, null, null, null] +6188 - Blacksmith's tools - [null, null, null, null, null] +6189 - Furnace - [null, Smelt, null, null, null] +6190 - Catapult - [null, null, null, null, null] +6191 - Warhammer - [null, null, null, null, null] +6192 - Pickaxe - [null, null, null, null, null] +6193 - Dwarf mirror - [null, null, null, null, null] +6194 - Chair - [null, null, null, null, null] +6195 - Chair - [null, null, null, null, null] +6196 - Table - [null, null, null, null, null] +6197 - Table - [null, null, null, null, null] +6198 - Table - [null, null, null, null, null] +6199 - Table - [null, null, null, null, null] +6200 - Table - [null, null, null, null, null] +6201 - Table - [null, null, null, null, null] +6202 - Lamp - [null, null, null, null, null] +6203 - Lamp - [null, null, null, null, null] +6204 - Poor Bed - [null, null, null, null, null] +6205 - Bed - [null, null, null, null, null] +6206 - Dwarven Consortium Table - [null, null, null, null, null] +6207 - Throne - [null, null, null, null, null] +6208 - Throne - [null, null, null, null, null] +6209 - null - [null, null, null, null, null] +6210 - null - [null, null, null, null, null] +6211 - Table - [null, null, null, null, null] +6212 - Tree stump - [null, null, null, null, null] +6213 - Barrel - [null, null, null, null, null] +6214 - null - [null, null, null, null, null] +6215 - null - [null, null, null, null, null] +6216 - null - [null, null, null, null, null] +6217 - null - [null, null, null, null, null] +6218 - null - [null, null, null, null, null] +6219 - null - [null, null, null, null, null] +6220 - null - [null, null, null, null, null] +6221 - null - [null, null, null, null, null] +6222 - null - [null, null, null, null, null] +6223 - null - [null, null, null, null, null] +6224 - null - [null, null, null, null, null] +6225 - null - [null, null, null, null, null] +6226 - null - [null, null, null, null, null] +6227 - null - [null, null, null, null, null] +6228 - null - [null, null, null, null, null] +6229 - null - [null, null, null, null, null] +6230 - Money Pot - [null, null, null, null, null] +6231 - Table - [null, null, null, null, null] +6232 - Fountain - [null, null, null, null, null] +6233 - null - [null, null, null, null, null] +6234 - null - [null, null, null, null, null] +6235 - null - [null, null, null, null, null] +6236 - Stop! - [null, null, null, null, null] +6237 - Plant - [null, null, null, null, null] +6238 - Door - [Open, null, null, null, null] +6239 - Door - [null, null, null, null, null] +6240 - Door - [Open, null, null, null, null] +6241 - Door - [null, null, null, null, null] +6242 - Staircase - [Climb-up, null, null, null, null] +6243 - Staircase - [Climb-down, null, null, null, null] +6244 - Staircase - [Climb-Up, null, null, null, null] +6245 - Staircase - [Climb-Down, null, null, null, null] +6246 - Table - [Take-beer, null, null, null, null] +6247 - null - [null, null, null, null, null] +6248 - null - [null, null, null, null, null] +6249 - Well - [null, null, null, null, null] +6250 - Bed - [null, null, null, null, null] +6251 - null - [null, null, null, null, null] +6252 - null - [null, null, null, null, null] +6253 - null - [null, null, null, null, null] +6254 - null - [null, null, null, null, null] +6255 - Trough - [null, null, null, null, null] +6256 - Trough - [null, null, null, null, null] +6257 - Dung - [Pick-up, null, null, null, null] +6258 - Dung - [Pick-up, null, null, null, null] +6259 - Dung - [Pick-up, null, null, null, null] +6260 - Ladder - [Climb-down, null, null, null, null] +6261 - Ladder - [Climb-up, null, null, null, null] +6262 - Ladder - [Climb, Climb-up, Climb-down, null, null] +6263 - Hutch - [null, null, null, null, null] +6264 - Bird cage stand - [null, null, null, null, null] +6265 - Cage - [null, null, null, null, null] +6266 - Cage - [null, null, null, null, null] +6267 - Golden cage - [null, null, null, null, null] +6268 - Hutch - [null, null, null, null, null] +6269 - Cages - [null, null, null, null, null] +6270 - null - [null, null, null, null, null] +6271 - null - [null, null, null, null, null] +6272 - null - [null, null, null, null, null] +6273 - null - [null, null, null, null, null] +6274 - Bed - [Search, null, null, null, null] +6275 - Study desk - [Search, null, null, null, null] +6276 - Landscape - [Search, null, null, null, null] +6277 - Cactus - [Hide-behind, null, null, null, null] +6278 - Trapdoor - [Open, null, null, null, null] +6279 - Smokey well - [Climb-down, null, null, null, null] +6280 - Ladder - [Climb-up, null, null, null, null] +6281 - Ladder - [Climb-up, null, null, null, null] +6282 - Portal - [Enter, null, null, null, null] +6283 - Pillar - [null, null, null, null, null] +6284 - Pillar - [null, null, null, null, null] +6285 - Pillar - [null, null, null, null, null] +6286 - Pillar - [null, null, null, null, null] +6287 - null - [null, null, null, null, null] +6288 - null - [null, null, null, null, null] +6289 - null - [null, null, null, null, null] +6290 - null - [null, null, null, null, null] +6291 - null - [null, null, null, null, null] +6292 - Bookcase - [Search, null, null, null, null] +6293 - null - [null, null, null, null, null] +6294 - Display case - [Open, null, null, null, null] +6295 - Display case - [null, null, null, null, null] +6296 - Skeleton - [null, null, null, null, null] +6297 - Skeleton - [null, null, null, null, null] +6298 - Skeleton - [null, null, null, null, null] +6299 - Skeleton - [null, null, null, null, null] +6300 - null - [null, null, null, null, null] +6301 - Throne - [null, null, null, null, null] +6302 - Throne - [null, null, null, null, null] +6303 - null - [null, null, null, null, null] +6304 - null - [null, null, null, null, null] +6305 - null - [null, null, null, null, null] +6306 - null - [null, null, null, null, null] +6307 - Statuette in alcove - [Turn, null, null, null, null] +6308 - Statuette in alcove - [Turn, null, null, null, null] +6309 - Alcove - [null, null, null, null, null] +6310 - null - [null, null, null, null, null] +6311 - Black mushrooms - [Pick, null, null, null, null] +6312 - Staircase - [Climb-up, null, null, null, null] +6313 - Staircase - [Climb-down, null, null, null, null] +6314 - null - [null, null, null, null, null] +6315 - null - [null, null, null, null, null] +6316 - null - [null, null, null, null, null] +6317 - null - [null, null, null, null, null] +6318 - null - [null, null, null, null, null] +6319 - null - [null, null, null, null, null] +6320 - null - [null, null, null, null, null] +6321 - null - [null, null, null, null, null] +6322 - null - [null, null, null, null, null] +6323 - Golem arm - [null, null, null, null, null] +6324 - Golem foot - [null, null, null, null, null] +6325 - Golem body - [null, null, null, null, null] +6326 - Golem head - [null, null, null, null, null] +6327 - Broken kiln - [null, null, null, null, null] +6328 - Broken kiln - [null, null, null, null, null] +6329 - Broken kiln - [null, null, null, null, null] +6330 - Broken kiln - [null, null, null, null, null] +6331 - Statue - [null, null, null, null, null] +6332 - Statue - [null, null, null, null, null] +6333 - Statue - [null, null, null, null, null] +6334 - Statue - [null, null, null, null, null] +6335 - Plinth - [null, null, null, null, null] +6336 - Plinth - [null, null, null, null, null] +6337 - Plinth - [null, null, null, null, null] +6338 - Plinth - [null, null, null, null, null] +6339 - null - [null, null, null, null, null] +6340 - null - [null, null, null, null, null] +6341 - null - [null, null, null, null, null] +6342 - null - [null, null, null, null, null] +6343 - null - [null, null, null, null, null] +6344 - null - [null, null, null, null, null] +6345 - null - [null, null, null, null, null] +6346 - null - [null, null, null, null, null] +6347 - null - [null, null, null, null, null] +6348 - null - [null, null, null, null, null] +6349 - null - [null, null, null, null, null] +6350 - null - [null, null, null, null, null] +6351 - null - [null, null, null, null, null] +6352 - null - [null, null, null, null, null] +6353 - null - [null, null, null, null, null] +6354 - null - [null, null, null, null, null] +6355 - null - [null, null, null, null, null] +6356 - null - [null, null, null, null, null] +6357 - null - [null, null, null, null, null] +6358 - null - [null, null, null, null, null] +6359 - null - [null, null, null, null, null] +6360 - null - [null, null, null, null, null] +6361 - null - [null, null, null, null, null] +6362 - null - [null, null, null, null, null] +6363 - Door - [Open, null, null, null, null] +6364 - Door - [Enter, null, null, null, null] +6365 - null - [null, null, null, null, null] +6366 - null - [null, null, null, null, null] +6367 - null - [null, null, null, null, null] +6368 - null - [null, null, null, null, null] +6369 - null - [null, null, null, null, null] +6370 - null - [null, null, null, null, null] +6371 - null - [null, null, null, null, null] +6372 - Staircase - [Climb-up, null, null, null, null] +6373 - Staircase - [Climb-down, null, null, null, null] +6374 - null - [null, null, null, null, null] +6375 - null - [null, null, null, null, null] +6376 - null - [null, null, null, null, null] +6377 - null - [null, null, null, null, null] +6378 - null - [null, null, null, null, null] +6379 - null - [null, null, null, null, null] +6380 - null - [null, null, null, null, null] +6381 - Cave - [null, null, null, null, null] +6382 - Root - [null, null, null, null, null] +6383 - null - [null, null, null, null, null] +6384 - null - [null, null, null, null, null] +6385 - null - [null, null, null, null, null] +6386 - null - [null, null, null, null, null] +6387 - null - [null, null, null, null, null] +6388 - null - [null, null, null, null, null] +6389 - null - [null, null, null, null, null] +6390 - null - [null, null, null, null, null] +6391 - null - [null, null, null, null, null] +6392 - null - [null, null, null, null, null] +6393 - null - [null, null, null, null, null] +6394 - null - [null, null, null, null, null] +6395 - null - [null, null, null, null, null] +6396 - null - [null, null, null, null, null] +6397 - null - [null, null, null, null, null] +6398 - null - [null, null, null, null, null] +6399 - null - [null, null, null, null, null] +6400 - null - [null, null, null, null, null] +6401 - null - [null, null, null, null, null] +6402 - Stalagmites - [null, null, null, null, null] +6403 - Stalagmite - [null, null, null, null, null] +6404 - Standing Torch - [null, null, null, null, null] +6405 - null - [null, null, null, null, null] +6406 - Standing Torch - [null, null, null, null, null] +6407 - null - [null, null, null, null, null] +6408 - Standing Torch - [null, null, null, null, null] +6409 - null - [null, null, null, null, null] +6410 - Standing Torch - [null, null, null, null, null] +6411 - null - [null, null, null, null, null] +6412 - Standing Torch - [null, null, null, null, null] +6413 - Standing Torch - [null, null, null, null, null] +6414 - Standing Torch - [null, null, null, null, null] +6415 - Standing Torch - [null, null, null, null, null] +6416 - Standing Torch - [null, null, null, null, null] +6417 - null - [null, null, null, null, null] +6418 - Ladder - [Climb-up, null, null, null, null] +6419 - Ladder - [Climb-up, null, null, null, null] +6420 - Burnt chest - [Open, null, null, null, null] +6421 - null - [null, null, null, null, null] +6422 - null - [null, null, null, null, null] +6423 - Mystical mirror - [Look-into, null, null, null, null] +6424 - null - [null, null, null, null, null] +6425 - Mystical mirror - [Look-into, null, null, null, null] +6426 - null - [null, null, null, null, null] +6427 - Mystical mirror - [Look-into, null, null, null, null] +6428 - null - [null, null, null, null, null] +6429 - Mystical mirror - [Look-into, null, null, null, null] +6430 - null - [null, null, null, null, null] +6431 - Mystical mirror - [Look-into, null, null, null, null] +6432 - null - [null, null, null, null, null] +6433 - Mystical mirror - [Look-into, null, null, null, null] +6434 - Trapdoor - [Open, null, null, null, null] +6435 - Trapdoor - [Climb-down, null, null, null, null] +6436 - Ladder - [Climb-up, null, null, null, null] +6437 - Vampire tomb - [null, null, null, null, null] +6438 - Vampire tomb - [null, null, null, null, null] +6439 - Rope - [Climb-up, null, null, null, null] +6440 - null - [Enter, null, null, null, null] +6441 - Cave entrance - [Enter, null, null, null, null] +6442 - Cave entrance - [Enter, null, null, null, null] +6443 - Cave entrance - [Enter, null, null, null, null] +6444 - Cave entrance - [Enter, null, null, null, null] +6445 - Cave entrance - [Enter, null, null, null, null] +6446 - Cave entrance - [Enter, null, null, null, null] +6447 - Cave exit - [Enter, null, null, null, null] +6448 - Secure chest - [Open, null, null, null, null] +6449 - null - [null, null, null, null, null] +6450 - Ladder - [Climb-up, null, null, null, null] +6451 - Gate - [Open, null, null, null, null] +6452 - Gate - [Open, null, null, null, null] +6453 - null - [null, null, null, null, null] +6454 - Icy rock - [null, null, null, null, null] +6455 - Ice ledge - [Use, null, null, null, null] +6456 - Ice ledge - [Step-off, null, null, null, null] +6457 - null - [null, null, null, null, null] +6458 - null - [null, null, null, null, null] +6459 - null - [null, null, null, null, null] +6460 - null - [null, null, null, null, null] +6461 - Ice gate - [Go-through, null, null, null, null] +6462 - Ice gate - [Go-through, null, null, null, null] +6463 - null - [null, null, null, null, null] +6464 - null - [null, null, null, null, null] +6465 - null - [null, null, null, null, null] +6466 - null - [null, null, null, null, null] +6467 - null - [null, null, null, null, null] +6468 - null - [null, null, null, null, null] +6469 - null - [null, null, null, null, null] +6470 - null - [null, null, null, null, null] +6471 - null - [null, null, null, null, null] +6472 - Ice chunks - [null, null, null, null, null] +6473 - Ice chunks - [null, null, null, null, null] +6474 - Ice chunks - [null, null, null, null, null] +6475 - Ice chunks - [null, null, null, null, null] +6476 - Ice chunks - [null, null, null, null, null] +6477 - Ice chunks - [null, null, null, null, null] +6478 - null - [null, null, null, null, null] +6479 - null - [null, null, null, null, null] +6480 - null - [null, null, null, null, null] +6481 - Tunnel - [Enter, null, null, null, null] +6482 - null - [null, null, null, null, null] +6483 - Obelisk - [null, null, null, null, null] +6484 - Obelisk - [null, null, null, null, null] +6485 - null - [null, null, null, null, null] +6486 - Obelisk - [null, null, null, null, null] +6487 - Obelisk - [null, null, null, null, null] +6488 - null - [null, null, null, null, null] +6489 - Obelisk - [null, null, null, null, null] +6490 - Obelisk - [null, null, null, null, null] +6491 - null - [null, null, null, null, null] +6492 - Obelisk - [null, null, null, null, null] +6493 - Obelisk - [null, null, null, null, null] +6494 - Mystical door - [Open, null, null, null, null] +6495 - null - [null, null, null, null, null] +6496 - null - [null, null, null, null, null] +6497 - Ladder - [Climb-down, null, null, null, null] +6498 - Ladder - [Climb-down, null, null, null, null] +6499 - Ladder - [Climb-down, null, null, null, null] +6500 - Ladder - [Climb-down, null, null, null, null] +6501 - Ladder - [Climb-up, null, null, null, null] +6502 - Ladder - [Climb-up, null, null, null, null] +6503 - Ladder - [Climb-up, null, null, null, null] +6504 - Ladder - [Climb-up, null, null, null, null] +6505 - null - [null, null, null, null, null] +6506 - null - [null, null, null, null, null] +6507 - null - [null, null, null, null, null] +6508 - null - [null, null, null, null, null] +6509 - null - [null, null, null, null, null] +6510 - null - [null, null, null, null, null] +6511 - null - [null, null, null, null, null] +6512 - Sarcophagus - [Search, null, null, null, null] +6513 - Sarcophagus - [Search, null, null, null, null] +6514 - Sarcophagus - [Search, null, null, null, null] +6515 - Sarcophagus - [Search, null, null, null, null] +6516 - Sarcophagus - [Search, null, null, null, null] +6517 - Sarcophagus - [Search, null, null, null, null] +6518 - null - [null, null, null, null, null] +6519 - null - [null, null, null, null, null] +6520 - null - [null, null, null, null, null] +6521 - Pitfall - [null, null, null, null, null] +6522 - null - [null, null, null, null, null] +6523 - Ladder - [null, null, Climb-down, null, null] +6524 - Crack - [null, null, null, null, null] +6525 - null - [null, null, null, null, null] +6526 - null - [null, null, null, null, null] +6527 - null - [null, null, null, null, null] +6528 - null - [null, null, null, null, null] +6529 - null - [null, null, null, null, null] +6530 - null - [null, null, null, null, null] +6531 - null - [null, null, null, null, null] +6532 - null - [null, null, null, null, null] +6533 - null - [null, null, null, null, null] +6534 - null - [null, null, null, null, null] +6535 - null - [null, null, null, null, null] +6536 - null - [null, null, null, null, null] +6537 - null - [null, null, null, null, null] +6538 - Sphinx - [null, null, null, null, null] +6539 - null - [null, null, null, null, null] +6540 - null - [null, null, null, null, null] +6541 - null - [null, null, null, null, null] +6542 - null - [null, null, null, null, null] +6543 - null - [null, null, null, null, null] +6544 - null - [null, null, null, null, null] +6545 - Pyramid entrance - [Open, null, null, null, null] +6546 - null - [null, null, null, null, null] +6547 - Pyramid entrance - [Open, null, null, null, null] +6548 - null - [null, null, null, null, null] +6549 - Well - [null, null, null, null, null] +6550 - null - [null, null, null, null, null] +6551 - Portal - [Use, null, null, null, null] +6552 - Altar - [Pray-at, null, null, null, null] +6553 - Doorway - [Open, null, null, null, null] +6554 - null - [null, null, null, null, null] +6555 - Doorway - [Open, null, null, null, null] +6556 - null - [null, null, null, null, null] +6557 - null - [null, null, null, null, null] +6558 - null - [null, null, null, null, null] +6559 - null - [null, null, null, null, null] +6560 - null - [null, null, null, null, null] +6561 - Ladder - [Climb-down, null, null, null, null] +6562 - null - [null, null, null, null, null] +6563 - null - [null, null, null, null, null] +6564 - null - [null, null, null, null, null] +6565 - null - [null, null, null, null, null] +6566 - City gate - [null, null, null, null, null] +6567 - null - [null, null, null, null, null] +6568 - Silk stall - [null, null, null, null, null] +6569 - Bakery stall - [null, null, null, null, null] +6570 - Gem stall - [null, null, null, null, null] +6571 - Fur stall - [null, null, null, null, null] +6572 - Spice stall - [Search, null, null, null, null] +6573 - Market stall - [null, null, null, null, null] +6574 - Tea stall - [null, Steal-from, null, null, null] +6575 - Cart - [null, null, null, null, null] +6576 - null - [null, null, null, null, null] +6577 - null - [null, null, null, null, null] +6578 - null - [null, null, null, null, null] +6579 - Banana Tree - [Search, null, null, null, null] +6580 - null - [null, null, null, null, null] +6581 - Tent flap - [Enter, null, null, null, null] +6582 - null - [null, null, null, null, null] +6583 - null - [null, null, null, null, null] +6584 - null - [null, null, null, null, null] +6585 - null - [null, null, null, null, null] +6586 - null - [null, null, null, null, null] +6587 - null - [null, null, null, null, null] +6588 - null - [Open, null, null, null, null] +6589 - null - [Open, null, null, null, null] +6590 - null - [null, null, null, null, null] +6591 - null - [null, null, null, null, null] +6592 - null - [null, null, null, null, null] +6593 - null - [null, null, null, null, null] +6594 - null - [null, null, null, null, null] +6595 - null - [null, null, null, null, null] +6596 - null - [null, null, null, null, null] +6597 - null - [null, null, null, null, null] +6598 - null - [null, null, null, null, null] +6599 - null - [null, null, null, null, null] +6600 - null - [null, null, null, null, null] +6601 - null - [null, null, null, null, null] +6602 - null - [null, null, null, null, null] +6603 - null - [null, null, null, null, null] +6604 - null - [null, null, null, null, null] +6605 - Water - [null, null, null, null, null] +6606 - Centre piece - [Search, null, null, null, null] +6607 - Mirror - [null, null, null, null, null] +6608 - Mirror - [null, null, null, null, null] +6609 - Mirror - [null, null, null, null, null] +6610 - Mirror - [null, null, null, null, null] +6611 - Mirror - [null, null, null, null, null] +6612 - Mirror - [null, null, null, null, null] +6613 - Mirror - [null, null, null, null, null] +6614 - Door - [Touch, null, Open, null, null] +6615 - City gate - [Open, null, null, null, null] +6616 - null - [null, null, null, null, null] +6617 - null - [null, null, null, null, null] +6618 - null - [null, null, null, null, null] +6619 - null - [null, null, null, null, null] +6620 - Hole - [Climb-through, null, null, null, null] +6621 - null - [null, null, null, null, null] +6622 - Rock - [null, null, null, null, null] +6623 - Rock - [Enter, null, null, null, null] +6624 - Door - [Open, null, null, null, null] +6625 - Door - [Open, null, null, null, null] +6626 - Door - [Close, null, null, null, null] +6627 - Door - [Close, null, null, null, null] +6628 - null - [null, null, null, null, null] +6629 - Wall Crusher - [null, null, null, null, null] +6630 - Sarcophagus - [Search, null, null, null, null] +6631 - null - [null, null, null, null, null] +6632 - Pit - [null, Jump-Across, null, null, null] +6633 - Pit - [null, null, null, null, null] +6634 - null - [null, null, null, null, null] +6635 - Canopic Jar - [Take, null, null, null, null] +6636 - null - [null, null, null, null, null] +6637 - Canopic Jar - [Take, null, null, null, null] +6638 - null - [null, null, null, null, null] +6639 - Canopic Jar - [Take, null, null, null, null] +6640 - null - [null, null, null, null, null] +6641 - Canopic Jar - [Take, null, null, null, null] +6642 - - [null, null, null, null, null] +6643 - Doorway - [Open, null, null, null, null] +6644 - Ceremonial table - [null, null, null, null, null] +6645 - Ladder - [Climb-up, null, null, null, null] +6646 - Closed chest - [Open, null, null, null, null] +6647 - Open chest - [null, Search, Shut, null, null] +6648 - Staircase - [Climb-up, null, null, null, null] +6649 - Staircase - [Climb-down, null, null, null, null] +6650 - Bridge - [null, null, null, null, null] +6651 - Bridge - [null, null, null, null, null] +6652 - Bridge - [null, null, null, null, null] +6653 - Bridge - [null, null, null, null, null] +6654 - null - [null, null, null, null, null] +6655 - Broken logs - [null, null, null, null, null] +6656 - Cloth - [null, null, null, null, null] +6657 - Juna - [Talk-to, null, null, null, null] +6658 - Tunnel - [Enter, null, null, null, null] +6659 - Tunnel - [Enter, null, null, null, null] +6660 - Weeping wall - [Collect-from, null, null, null, null] +6661 - Blue tears - [null, null, null, null, null] +6662 - Green tears - [null, null, null, null, null] +6663 - Absence of tears - [null, null, null, null, null] +6664 - null - [null, null, null, null, null] +6665 - Blue tears - [null, null, null, null, null] +6666 - Green tears - [null, null, null, null, null] +6667 - Absence of tears - [null, null, null, null, null] +6668 - null - [null, null, null, null, null] +6669 - Rocks - [Mine, Prospect, hidden, null, null] +6670 - Rocks - [Mine, Prospect, hidden, null, null] +6671 - Rocks - [Mine, Prospect, hidden, null, null] +6672 - Rocks - [Climb, null, null, null, null] +6673 - Rocks - [Climb, null, null, null, null] +6674 - null - [null, null, null, null, null] +6675 - null - [null, null, null, null, null] +6676 - null - [null, null, null, null, null] +6677 - null - [null, null, null, null, null] +6678 - null - [null, null, null, null, null] +6679 - null - [null, null, null, null, null] +6680 - null - [null, null, null, null, null] +6681 - null - [null, null, null, null, null] +6682 - null - [null, null, null, null, null] +6683 - null - [null, null, null, null, null] +6684 - null - [null, null, null, null, null] +6685 - null - [null, null, null, null, null] +6686 - null - [null, null, null, null, null] +6687 - null - [null, null, null, null, null] +6688 - null - [null, null, null, null, null] +6689 - null - [null, null, null, null, null] +6690 - null - [null, null, null, null, null] +6691 - null - [null, null, null, null, null] +6692 - null - [null, null, null, null, null] +6693 - null - [null, null, null, null, null] +6694 - null - [null, null, null, null, null] +6695 - null - [null, null, null, null, null] +6696 - null - [null, null, null, null, null] +6697 - null - [null, null, null, null, null] +6698 - null - [null, null, null, null, null] +6699 - null - [null, null, null, null, null] +6700 - null - [null, null, null, null, null] +6701 - null - [null, null, null, null, null] +6702 - Staircase - [Climb-up, null, null, null, null] +6703 - Staircase - [Climb-up, null, null, null, null] +6704 - Staircase - [Climb-up, null, null, null, null] +6705 - Staircase - [Climb-up, null, null, null, null] +6706 - Staircase - [Climb-up, null, null, null, null] +6707 - Staircase - [Climb-up, null, null, null, null] +6708 - Ladder - [Climb-up, null, null, null, null] +6709 - null - [null, null, null, null, null] +6710 - null - [null, null, null, null, null] +6711 - null - [null, null, null, null, null] +6712 - null - [null, null, null, null, null] +6713 - Door - [null, null, null, null, null] +6714 - Door - [Open, null, null, null, null] +6715 - Door - [null, null, null, null, null] +6716 - null - [null, null, null, null, null] +6717 - null - [null, null, null, null, null] +6718 - null - [null, null, null, null, null] +6719 - null - [null, null, null, null, null] +6720 - null - [null, null, null, null, null] +6721 - null - [null, null, null, null, null] +6722 - null - [null, null, null, null, null] +6723 - null - [null, null, null, null, null] +6724 - null - [null, null, null, null, null] +6725 - null - [null, null, null, null, null] +6726 - null - [null, null, null, null, null] +6727 - null - [null, null, null, null, null] +6728 - null - [null, null, null, null, null] +6729 - null - [null, null, null, null, null] +6730 - null - [null, null, null, null, null] +6731 - null - [null, null, null, null, null] +6732 - Door - [null, null, null, null, null] +6733 - Door - [Open, null, null, null, null] +6734 - Door - [null, null, null, null, null] +6735 - null - [null, null, null, null, null] +6736 - null - [null, null, null, null, null] +6737 - null - [null, null, null, null, null] +6738 - null - [null, null, null, null, null] +6739 - null - [null, null, null, null, null] +6740 - null - [null, null, null, null, null] +6741 - null - [null, null, null, null, null] +6742 - null - [null, null, null, null, null] +6743 - null - [null, null, null, null, null] +6744 - null - [null, null, null, null, null] +6745 - null - [null, null, null, null, null] +6746 - null - [null, null, null, null, null] +6747 - null - [null, null, null, null, null] +6748 - null - [null, null, null, null, null] +6749 - null - [null, null, null, null, null] +6750 - null - [null, null, null, null, null] +6751 - null - [null, null, null, null, null] +6752 - null - [null, null, null, null, null] +6753 - null - [null, null, null, null, null] +6754 - null - [null, null, null, null, null] +6755 - null - [null, null, null, null, null] +6756 - null - [null, null, null, null, null] +6757 - null - [null, null, null, null, null] +6758 - null - [null, null, null, null, null] +6759 - null - [null, null, null, null, null] +6760 - null - [null, null, null, null, null] +6761 - null - [null, null, null, null, null] +6762 - null - [null, null, null, null, null] +6763 - null - [null, null, null, null, null] +6764 - null - [null, null, null, null, null] +6765 - null - [null, null, null, null, null] +6766 - null - [null, null, null, null, null] +6767 - Standing torch - [null, null, null, null, null] +6768 - null - [null, null, null, null, null] +6769 - null - [null, null, null, null, null] +6770 - null - [null, null, null, null, null] +6771 - Sarcophagus - [Search, null, null, null, null] +6772 - Sarcophagus - [Search, null, null, null, null] +6773 - Sarcophagus - [Search, null, null, null, null] +6774 - Chest - [Open, null, null, null, null] +6775 - Chest - [Search, Close, null, null, null] +6776 - Skeleton - [null, null, null, null, null] +6777 - Skeleton - [null, null, null, null, null] +6778 - Skeleton - [null, null, null, null, null] +6779 - null - [null, null, null, null, null] +6780 - null - [null, null, null, null, null] +6781 - null - [null, null, null, null, null] +6782 - null - [null, null, null, null, null] +6783 - null - [null, null, null, null, null] +6784 - null - [null, null, null, null, null] +6785 - null - [null, null, null, null, null] +6786 - null - [null, null, null, null, null] +6787 - null - [null, null, null, null, null] +6788 - null - [null, null, null, null, null] +6789 - null - [null, null, null, null, null] +6790 - null - [null, null, null, null, null] +6791 - Bed - [null, null, null, null, null] +6792 - null - [null, null, null, null, null] +6793 - null - [null, null, null, null, null] +6794 - null - [null, null, null, null, null] +6795 - null - [null, null, null, null, null] +6796 - null - [null, null, null, null, null] +6797 - null - [null, null, null, null, null] +6798 - null - [null, null, null, null, null] +6799 - null - [null, null, null, null, null] +6800 - null - [null, null, null, null, null] +6801 - null - [null, null, null, null, null] +6802 - null - [null, null, null, null, null] +6803 - null - [null, null, null, null, null] +6804 - null - [null, null, null, null, null] +6805 - null - [null, null, null, null, null] +6806 - null - [null, null, null, null, null] +6807 - null - [null, null, null, null, null] +6808 - null - [null, null, null, null, null] +6809 - null - [null, null, null, null, null] +6810 - null - [null, null, null, null, null] +6811 - null - [null, null, null, null, null] +6812 - null - [null, null, null, null, null] +6813 - null - [null, null, null, null, null] +6814 - null - [null, null, null, null, null] +6815 - null - [null, null, null, null, null] +6816 - null - [null, null, null, null, null] +6817 - null - [null, null, null, null, null] +6818 - null - [null, null, null, null, null] +6819 - null - [null, null, null, null, null] +6820 - null - [null, null, null, null, null] +6821 - Sarcophagus - [Search, null, null, null, null] +6822 - Sarcophagus - [Search, null, null, null, null] +6823 - Sarcophagus - [Search, null, null, null, null] +6824 - Door - [null, null, null, null, null] +6825 - null - [null, null, null, null, null] +6826 - null - [null, null, null, null, null] +6827 - Waterpump - [null, null, null, null, null] +6828 - null - [null, null, null, null, null] +6829 - null - [null, null, null, null, null] +6830 - null - [null, null, null, null, null] +6831 - null - [null, null, null, null, null] +6832 - null - [null, null, null, null, null] +6833 - null - [null, null, null, null, null] +6834 - null - [null, null, null, null, null] +6835 - Warning sign - [null, null, null, null, null] +6836 - Cage - [Unlock, null, null, null, null] +6837 - null - [null, null, null, null, null] +6838 - null - [null, null, null, null, null] +6839 - Crate - [Buy, null, null, null, null] +6840 - Fungus pattern - [null, null, hidden, null, null] +6841 - Stairs - [Climb-down, null, null, null, null] +6842 - Stairs - [Climb-up, null, null, null, null] +6843 - null - [null, null, null, null, null] +6844 - Ogre Coffin - [Search, null, null, null, null] +6845 - Ogre Coffin - [Search, null, null, null, null] +6846 - Broken Lecturn - [Search, null, null, null, null] +6847 - Bell - [Ring, null, null, null, null] +6848 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +6849 - Signpost - [Search, null, null, null, null] +6850 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +6851 - Ogre Coffin - [null, null, null, null, null] +6852 - Ogre Coffin - [null, null, null, null, null] +6853 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +6854 - Ogre Coffin - [null, null, null, null, null] +6855 - Ogre Coffin - [null, null, null, null, null] +6856 - Barricade - [null, null, null, null, null] +6857 - Barricade - [null, null, null, null, null] +6858 - Barricade - [null, null, null, null, null] +6859 - null - [null, null, null, null, null] +6860 - null - [null, null, null, null, null] +6861 - null - [null, null, null, null, null] +6862 - null - [null, null, null, null, null] +6863 - null - [null, null, null, null, null] +6864 - null - [null, null, null, null, null] +6865 - An ogre standard - [null, null, null, null, null] +6866 - Ogre fire - [null, null, null, null, null] +6867 - Ogre Drums - [null, null, null, null, null] +6868 - Ogre Drums - [null, null, null, null, null] +6869 - null - [null, null, null, null, null] +6870 - null - [null, null, null, null, null] +6871 - Ogre stone door - [Open, null, null, null, null] +6872 - Ogre stone door - [Open, null, null, null, null] +6873 - null - [null, null, null, null, null] +6874 - null - [null, null, null, null, null] +6875 - Drawers - [Search, null, null, null, null] +6876 - Cupboard - [Search, null, null, null, null] +6877 - Wardrobe - [Search, null, null, null, null] +6878 - null - [null, null, null, null, null] +6879 - null - [null, null, null, null, null] +6880 - Ogre barricade - [null, null, null, null, null] +6881 - Crushed barricade - [Climb-over, null, null, null, null] +6882 - Crushed barricade - [Climb-over, null, null, null, null] +6883 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +6884 - null - [null, null, null, null, null] +6885 - null - [null, null, null, null, null] +6886 - null - [null, null, null, null, null] +6887 - null - [null, null, null, null, null] +6888 - Sithik Ints - [Talk-to, null, null, null, null] +6889 - Sithik Ints - [Talk-to, null, null, null, null] +6890 - Ogre Coffin - [null, null, null, hidden, null] +6891 - Ogre Coffin - [null, null, null, hidden, null] +6892 - Ogre Coffin - [null, null, null, hidden, null] +6893 - Skeleton - [Search, null, null, null, null] +6894 - Bookcase - [Search, null, null, null, null] +6895 - null - [null, null, null, null, null] +6896 - Standing torch - [null, null, null, null, null] +6897 - Stand - [Search, null, null, null, null] +6898 - null - [null, null, null, null, null] +6899 - null - [null, null, null, null, null] +6900 - null - [null, null, null, null, null] +6901 - null - [null, null, null, null, null] +6902 - null - [null, null, null, null, null] +6903 - Rubble - [null, null, null, null, null] +6904 - Shelves - [null, null, null, null, null] +6905 - Hole - [Squeeze-through, null, null, null, null] +6906 - null - [null, null, null, null, null] +6907 - null - [null, null, null, null, null] +6908 - null - [null, null, null, null, null] +6909 - Wall - [null, null, null, null, null] +6910 - Chest - [Open, null, null, null, null] +6911 - Crate - [Search, null, null, null, null] +6912 - Hole - [Squeeze-through, null, null, null, null] +6913 - null - [null, null, null, null, null] +6914 - Hole - [Squeeze-through, null, null, null, null] +6915 - Rubble - [null, null, null, null, null] +6916 - Bookcase - [Search, null, null, null, null] +6917 - null - [null, null, null, null, null] +6918 - null - [null, null, null, null, null] +6919 - Door - [Open, null, null, null, null] +6920 - Door - [Open, null, null, null, null] +6921 - Symbol - [Look-at, null, null, null, null] +6922 - Symbol - [Look-at, null, null, null, null] +6923 - Symbol - [Look-at, null, null, null, null] +6924 - Symbol - [Look-at, null, null, null, null] +6925 - null - [null, null, null, null, null] +6926 - null - [null, null, null, null, null] +6927 - Big, big boulder... - [null, null, null, null, null] +6928 - Bone Crane - [null, null, null, null, null] +6929 - Bone support - [null, null, null, null, null] +6930 - Bone support - [null, null, null, null, null] +6931 - Bone arch - [null, null, null, null, null] +6932 - Bone arch - [null, null, null, null, null] +6933 - Bone arch - [null, null, null, null, null] +6934 - Bone arch - [null, null, null, null, null] +6935 - Bone arch - [null, null, null, null, null] +6936 - Bone arch - [null, null, null, null, null] +6937 - Bone arch - [null, null, null, null, null] +6938 - Bone arch - [null, null, null, null, null] +6939 - Bone arch - [null, null, null, null, null] +6940 - Bone arch - [null, null, null, null, null] +6941 - null - [null, null, null, null, null] +6942 - null - [null, null, null, null, null] +6943 - Rocks - [Mine, Prospect, hidden, null, null] +6944 - Rocks - [Mine, Prospect, hidden, null, null] +6945 - Rocks - [Mine, Prospect, hidden, null, null] +6946 - Rocks - [Mine, Prospect, hidden, null, null] +6947 - Rocks - [Mine, Prospect, hidden, null, null] +6948 - Rocks - [Mine, Prospect, hidden, null, null] +6949 - null - [null, null, null, null, null] +6950 - Boulder - [null, null, null, null, null] +6951 - Nothing - [null, null, null, null, null] +6952 - Nothing - [null, null, null, null, null] +6953 - Nothing - [null, null, null, null, null] +6954 - null - [null, null, null, null, null] +6955 - null - [null, null, null, null, null] +6956 - null - [null, null, null, null, null] +6957 - null - [null, null, null, null, null] +6958 - null - [null, null, null, null, null] +6959 - null - [null, null, null, null, null] +6960 - null - [null, null, null, null, null] +6961 - null - [null, null, null, null, null] +6962 - null - [null, null, null, null, null] +6963 - null - [null, null, null, null, null] +6964 - null - [null, null, null, null, null] +6965 - null - [null, null, null, null, null] +6966 - null - [null, null, null, null, null] +6967 - null - [null, null, null, null, null] +6968 - null - [null, null, null, null, null] +6969 - Swamp Boaty - [Board, Board ( Pay 10 ), null, null, null] +6970 - Swamp Boaty - [Board, null, null, null, null] +6971 - Cart Track - [null, null, null, null, null] +6972 - Bookcase - [null, null, null, null, null] +6973 - null - [null, null, null, null, null] +6974 - null - [null, null, null, null, null] +6975 - Door - [Open, null, null, null, null] +6976 - Door - [Close, null, null, null, null] +6977 - Door - [Open, null, null, null, null] +6978 - Door - [null, null, null, null, null] +6979 - null - [null, null, null, null, null] +6980 - null - [null, null, null, null, null] +6981 - null - [null, null, null, null, null] +6982 - null - [null, null, null, null, null] +6983 - null - [null, null, null, null, null] +6984 - Market Stall - [null, null, null, null, null] +6985 - Crusher - [null, null, null, null, null] +6986 - null - [null, null, null, null, null] +6987 - null - [null, null, null, null, null] +6988 - null - [null, null, null, null, null] +6989 - null - [null, null, null, null, null] +6990 - null - [null, null, null, null, null] +6991 - null - [null, null, null, null, null] +6992 - null - [null, null, null, null, null] +6993 - null - [null, null, null, null, null] +6994 - null - [null, null, null, null, null] +6995 - null - [null, null, null, null, null] +6996 - null - [null, null, null, null, null] +6997 - null - [null, null, null, null, null] +6998 - null - [null, null, null, null, null] +6999 - null - [null, null, null, null, null] +7000 - null - [null, null, null, null, null] +7001 - null - [null, null, null, null, null] +7002 - Statue - [null, null, null, null, null] +7003 - Statue - [null, null, null, null, null] +7004 - Statue - [null, null, null, null, null] +7005 - Statue - [null, null, null, null, null] +7006 - Statue - [null, null, null, null, null] +7007 - Statue - [null, null, null, null, null] +7008 - Statue - [null, null, null, null, null] +7009 - Statue - [null, null, null, null, null] +7010 - Almost a Statue - [null, null, null, null, null] +7011 - Plant - [null, null, null, null, null] +7012 - Plant - [null, null, null, null, null] +7013 - Plant - [null, null, null, null, null] +7014 - Plant - [null, null, null, null, null] +7015 - Plant - [null, null, null, null, null] +7016 - Pillar - [null, null, null, null, null] +7017 - Pillar - [null, null, null, null, null] +7018 - Cupboard - [null, null, null, null, null] +7019 - Cabinet - [null, null, null, null, null] +7020 - Cabinet - [null, null, null, null, null] +7021 - Cabinet - [null, null, null, null, null] +7022 - Track - [null, null, null, null, null] +7023 - Track - [null, null, null, null, null] +7024 - null - [null, null, null, null, null] +7025 - null - [null, null, null, null, null] +7026 - Track - [null, null, null, null, null] +7027 - Train cart - [null, null, null, null, null] +7028 - Train cart - [Ride, null, null, null, null] +7029 - Train cart - [Ride, null, null, null, null] +7030 - Train cart - [Ride, null, null, null, null] +7031 - null - [null, null, null, null, null] +7032 - Giant Dwarf - [null, null, null, null, null] +7033 - Giant Dwarf - [null, null, null, null, null] +7034 - Giant Dwarf - [null, null, null, null, null] +7035 - Giant Dwarf - [null, null, null, null, null] +7036 - Giant Dwarf - [null, null, null, null, null] +7037 - Giant Dwarf - [null, null, null, null, null] +7038 - Giant Dwarf - [null, null, null, null, null] +7039 - Giant Dwarf - [null, null, null, null, null] +7040 - null - [null, null, null, null, null] +7041 - Giant Dwarf - [null, null, null, null, null] +7042 - null - [null, null, null, null, null] +7043 - Giant Dwarf - [null, null, null, null, null] +7044 - Buffers - [null, null, null, null, null] +7045 - null - [null, null, null, null, null] +7046 - null - [null, null, null, null, null] +7047 - null - [null, null, null, null, null] +7048 - null - [null, null, null, null, null] +7049 - Gate - [Open, null, null, null, null] +7050 - Gate - [Open, null, null, null, null] +7051 - Gate - [Close, null, null, null, null] +7052 - Gate - [Close, null, null, null, null] +7053 - Seed Stall - [null, Steal from, null, null, null] +7054 - null - [null, null, null, null, null] +7055 - null - [null, null, null, null, null] +7056 - Staircase - [Climb-down, null, null, null, null] +7057 - Staircase - [Climb-up, null, null, null, null] +7058 - Old Bookshelf - [Search, null, null, null, null] +7059 - Old Bookshelf - [Search, null, null, null, null] +7060 - Old Bookshelf - [Search, null, null, null, null] +7061 - Old Bookshelf - [Search, null, null, null, null] +7062 - Old Bookshelf - [Search, null, null, null, null] +7063 - Old Bookshelf - [Search, null, null, null, null] +7064 - Old Bookshelf - [Search, null, null, null, null] +7065 - Old Bookshelf - [Search, null, null, null, null] +7066 - Old Bookshelf - [Search, null, null, null, null] +7067 - Old Bookshelf - [Search, null, null, null, null] +7068 - Old Bookshelf - [Search, null, null, null, null] +7069 - Old Bookshelf - [Search, null, null, null, null] +7070 - Old Bookshelf - [Search, null, null, null, null] +7071 - Old Bookshelf - [Search, null, null, null, null] +7072 - Old Bookshelf - [Search, null, null, null, null] +7073 - Old Bookshelf - [Search, null, null, null, null] +7074 - Old Bookshelf - [Search, null, null, null, null] +7075 - Old Bookshelf - [Search, null, null, null, null] +7076 - Old Bookshelf - [Search, null, null, null, null] +7077 - Old Bookshelf - [Search, null, null, null, null] +7078 - Old Bookshelf - [Search, null, null, null, null] +7079 - Old Bookshelf - [Search, null, null, null, null] +7080 - Old Bookshelf - [Search, null, null, null, null] +7081 - Old Bookshelf - [Search, null, null, null, null] +7082 - Old Bookshelf - [Search, null, null, null, null] +7083 - Old Bookshelf - [Search, null, null, null, null] +7084 - Old Bookshelf - [Search, null, null, null, null] +7085 - Old Bookshelf - [Search, null, null, null, null] +7086 - Old Bookshelf - [Search, null, null, null, null] +7087 - Old Bookshelf - [Search, null, null, null, null] +7088 - Old Bookshelf - [Search, null, null, null, null] +7089 - Old Bookshelf - [Search, null, null, null, null] +7090 - Globe of Gielinor - [null, null, null, null, null] +7091 - Study Desk - [null, null, null, null, null] +7092 - Telescope - [Observe, null, null, null, null] +7093 - null - [null, null, null, null, null] +7094 - null - [null, null, null, null, null] +7095 - null - [null, null, null, null, null] +7096 - Chart - [null, null, null, null, null] +7097 - Chart - [null, null, null, null, null] +7098 - Chart - [null, null, null, null, null] +7099 - Scrolls - [null, null, null, null, null] +7100 - Suit of armour - [null, null, null, null, null] +7101 - Hanging cape - [null, null, null, null, null] +7102 - Saradomin staff - [null, null, null, null, null] +7103 - Mysterious ruins - [null, null, null, null, null] +7104 - Mysterious ruins - [Enter, null, null, null, null] +7105 - Mysterious ruins - [null, null, null, null, null] +7106 - Mysterious ruins - [Enter, null, null, null, null] +7107 - Mysterious ruins - [null, null, null, null, null] +7108 - Mysterious ruins - [Enter, null, null, null, null] +7109 - Mysterious ruins - [null, null, null, null, null] +7110 - Mysterious ruins - [Enter, null, null, null, null] +7111 - Mysterious ruins - [null, null, null, null, null] +7112 - Mysterious ruins - [Enter, null, null, null, null] +7113 - Mysterious ruins - [null, null, null, null, null] +7114 - Mysterious ruins - [Enter, null, null, null, null] +7115 - Mysterious ruins - [null, null, null, null, null] +7116 - Mysterious ruins - [Enter, null, null, null, null] +7117 - Mysterious ruins - [null, null, null, null, null] +7118 - Mysterious ruins - [Enter, null, null, null, null] +7119 - Mysterious ruins - [null, null, null, null, null] +7120 - Mysterious ruins - [Enter, null, null, null, null] +7121 - Mysterious ruins - [null, null, null, null, null] +7122 - Mysterious ruins - [Enter, null, null, null, null] +7123 - Mysterious ruins - [null, null, null, null, null] +7124 - Mysterious ruins - [Enter, null, null, null, null] +7125 - Mysterious ruins - [null, null, null, null, null] +7126 - Mysterious ruins - [Enter, null, null, null, null] +7127 - null - [null, null, null, null, null] +7128 - null - [null, null, null, null, null] +7129 - Fire rift - [Exit-through, null, null, null, null] +7130 - Earth rift - [Exit-through, null, null, null, null] +7131 - Body rift - [Exit-through, null, null, null, null] +7132 - Cosmic rift - [Exit-through, null, null, null, null] +7133 - Nature rift - [Exit-through, null, null, null, null] +7134 - Chaos rift - [Exit-through, null, null, null, null] +7135 - Law rift - [Exit-through, null, null, null, null] +7136 - Death rift - [Exit-through, null, null, null, null] +7137 - Water rift - [Exit-through, null, null, null, null] +7138 - Soul rift - [Exit-through, null, null, null, null] +7139 - Air rift - [Exit-through, null, null, null, null] +7140 - Mind rift - [Exit-through, null, null, null, null] +7141 - Blood rift - [Exit-through, null, null, null, null] +7142 - null - [null, null, null, null, null] +7143 - Rock - [Mine, null, null, null, null] +7144 - Tendrils - [Chop, null, null, null, null] +7145 - Boil - [Burn-down, null, null, null, null] +7146 - eyes - [distract, null, null, null, null] +7147 - Gap - [squeeze-through, null, null, null, null] +7148 - Passage - [go-through, null, null, null, null] +7149 - Gap - [squeeze-through, null, null, null, null] +7150 - eyes - [distract, null, null, null, null] +7151 - Boil - [Burn-down, null, null, null, null] +7152 - Tendrils - [Chop, null, null, null, null] +7153 - Rock - [Mine, null, null, null, null] +7154 - Passage - [Go-through, null, null, null, null] +7155 - null - [null, null, null, null, null] +7156 - Blockage - [null, null, null, null, null] +7157 - null - [Go-through, null, null, null, null] +7158 - Rock - [Mine, null, null, null, null] +7159 - Rock - [null, null, null, null, null] +7160 - Broken rock - [null, null, null, null, null] +7161 - Tendrils - [Chop, null, null, null, null] +7162 - Tendrils - [null, null, null, null, null] +7163 - Chopped tendrils - [null, null, null, null, null] +7164 - Gap - [Squeeze-through, null, null, null, null] +7165 - Boil - [Burn-down, null, null, null, null] +7166 - Boil - [null, null, null, null, null] +7167 - Boil - [null, null, null, null, null] +7168 - Eyes - [Distract, null, null, null, null] +7169 - Eyes - [null, null, null, null, null] +7170 - Eyes - [null, null, null, null, null] +7171 - Abyssal rift - [null, null, null, null, null] +7172 - null - [null, null, null, null, null] +7173 - null - [null, null, null, null, null] +7174 - null - [null, null, null, null, null] +7175 - null - [null, null, null, null, null] +7176 - null - [null, null, null, null, null] +7177 - null - [null, null, null, null, null] +7178 - null - [null, null, null, null, null] +7179 - null - [null, null, null, null, null] +7180 - null - [null, null, null, null, null] +7181 - null - [null, null, null, null, null] +7182 - null - [null, null, null, null, null] +7183 - null - [null, null, null, null, null] +7184 - null - [null, null, null, null, null] +7185 - null - [null, null, null, null, null] +7186 - null - [null, null, null, null, null] +7187 - null - [null, null, null, null, null] +7188 - null - [null, null, null, null, null] +7189 - Tendrils - [null, null, null, null, null] +7190 - Tendrils - [null, null, null, null, null] +7191 - Tendrils - [null, null, null, null, null] +7192 - null - [null, null, null, null, null] +7193 - null - [null, null, null, null, null] +7194 - null - [null, null, null, null, null] +7195 - null - [null, null, null, null, null] +7196 - null - [null, null, null, null, null] +7197 - null - [null, null, null, null, null] +7198 - null - [null, null, null, null, null] +7199 - null - [null, null, null, null, null] +7200 - null - [null, null, null, null, null] +7201 - null - [null, null, null, null, null] +7202 - null - [null, null, null, null, null] +7203 - null - [null, null, null, null, null] +7204 - null - [null, null, null, null, null] +7205 - null - [null, null, null, null, null] +7206 - Corpse - [null, null, null, null, null] +7207 - Corpse - [null, null, null, null, null] +7208 - Corpse - [null, null, null, null, null] +7209 - null - [null, null, null, null, null] +7210 - null - [null, null, null, null, null] +7211 - null - [null, null, null, null, null] +7212 - null - [null, null, null, null, null] +7213 - null - [null, null, null, null, null] +7214 - null - [null, null, null, null, null] +7215 - null - [null, null, null, null, null] +7216 - null - [null, null, null, null, null] +7217 - null - [null, null, null, null, null] +7218 - null - [null, null, null, null, null] +7219 - Passageway - [Enter, null, null, null, null] +7220 - Passageway - [Enter, null, null, null, null] +7221 - Ladder - [Climb-Down, null, null, null, null] +7222 - Door - [Open, null, null, null, null] +7223 - Door - [null, null, null, null, null] +7224 - Spinning blades - [null, null, null, null, null] +7225 - Wall - [null, null, null, null, null] +7226 - null - [null, null, null, null, null] +7227 - Floor - [null, null, null, null, Search] +7228 - Wall - [null, null, null, null, Search] +7229 - Wall - [null, null, null, null, Search] +7230 - Floor - [null, null, null, null, Search] +7231 - Door - [Open, null, null, null, null] +7232 - Door - [Open, null, null, null, null] +7233 - Door - [Open, null, null, null, null] +7234 - Door - [Open, null, null, null, null] +7235 - null - [null, null, null, null, null] +7236 - Wall safe - [Crack, hidden, null, null, null] +7237 - Wall safe - [Crack, hidden, null, null, null] +7238 - null - [null, null, null, null, null] +7239 - Ledge - [Climb, null, null, null, null] +7240 - Ledge - [Climb, null, null, null, null] +7241 - Pendulum - [null, null, null, null, null] +7242 - Wooden Obstruction - [null, null, null, null, null] +7243 - Wooden Obstruction - [null, null, null, null, null] +7244 - Wooden Obstruction - [null, null, null, null, null] +7245 - Floor - [null, null, null, null, Search] +7246 - Door - [Pick-lock, null, null, null, null] +7247 - null - [null, null, null, null, null] +7248 - Wall - [null, null, null, null, null] +7249 - Wall - [null, null, null, null, Search] +7250 - Floor - [null, null, null, null, null] +7251 - Contortion Bars - [Enter, null, null, null, null] +7252 - Blade - [null, null, null, null, null] +7253 - Spin Blades - [null, null, null, null, null] +7254 - Grill - [null, null, null, null, null] +7255 - Grill - [Open, null, null, null, null] +7256 - Doorway - [Open, null, null, null, null] +7257 - Trapdoor - [Enter, null, null, null, null] +7258 - Passageway - [Enter, null, null, null, null] +7259 - Door - [Open, null, null, null, null] +7260 - Door - [Close, null, null, null, null] +7261 - null - [null, null, null, null, null] +7262 - null - [null, null, null, null, null] +7263 - null - [null, null, null, null, null] +7264 - null - [null, null, null, null, null] +7265 - null - [null, null, null, null, null] +7266 - null - [null, null, null, null, null] +7267 - null - [null, null, null, null, null] +7268 - null - [null, null, null, null, null] +7269 - null - [null, null, null, null, null] +7270 - null - [null, null, null, null, null] +7271 - null - [null, null, null, null, null] +7272 - Portal - [Use, null, null, null, null] +7273 - Portal - [Use, null, null, null, null] +7274 - Door - [Open, null, null, null, null] +7275 - null - [Pick-up, null, null, null, null] +7276 - null - [Pick-up, null, null, null, null] +7277 - Fox - [Pick-up, null, null, null, null] +7278 - Fox - [Pick-up, null, null, null, null] +7279 - null - [Pick-up, null, null, null, null] +7280 - null - [Pick-up, null, null, null, null] +7281 - Chicken - [Pick-up, null, null, null, null] +7282 - null - [Pick-up, null, null, null, null] +7283 - null - [Pick-up, null, null, null, null] +7284 - Grain - [Pick-up, null, null, null, null] +7285 - Empty Sack - [Pick-up, null, null, null, null] +7286 - Precarious bridge - [Cross, null, null, null, null] +7287 - Precarious bridge - [Cross, null, null, null, null] +7288 - Portal - [Use, null, null, null, null] +7289 - Portal - [Use, null, null, null, null] +7290 - null - [null, null, null, null, null] +7291 - null - [null, null, null, null, null] +7292 - null - [null, null, null, null, null] +7293 - null - [null, null, null, null, null] +7294 - null - [null, null, null, null, null] +7295 - null - [null, null, null, null, null] +7296 - null - [null, null, null, null, null] +7297 - null - [null, null, null, null, null] +7298 - null - [null, null, null, null, null] +7299 - null - [null, null, null, null, null] +7300 - null - [null, null, null, null, null] +7301 - null - [null, null, null, null, null] +7302 - Door - [Open, null, null, null, null] +7303 - Statue - [Touch, null, null, null, null] +7304 - Statue - [Touch, null, null, null, null] +7305 - Statue - [Touch, null, null, null, null] +7306 - Statue - [Touch, null, null, null, null] +7307 - Statue - [Touch, null, null, null, null] +7308 - Statue - [Touch, null, null, null, null] +7309 - Statue - [Touch, null, null, null, null] +7310 - Statue - [Touch, null, null, null, null] +7311 - Statue - [Touch, null, null, null, null] +7312 - Statue - [Touch, null, null, null, null] +7313 - Statue - [Touch, null, null, null, null] +7314 - Statue - [Touch, null, null, null, null] +7315 - Portal - [Use, null, null, null, null] +7316 - Portal - [Use, null, null, null, null] +7317 - Door - [Open, null, null, null, null] +7318 - Portal - [Use, null, null, null, null] +7319 - Portal - [Use, null, null, null, null] +7320 - Door - [Open, null, null, null, null] +7321 - Portal - [Use, null, null, null, null] +7322 - Portal - [Use, null, null, null, null] +7323 - Door - [Open, null, null, null, null] +7324 - Portal - [Use, null, null, null, null] +7325 - Portal - [Use, null, null, null, null] +7326 - Door - [Open, null, null, null, null] +7327 - Old Bookshelf - [Search, null, null, null, null] +7328 - Old Bookshelf - [Search, null, null, null, null] +7329 - Old Bookshelf - [Search, null, null, null, null] +7330 - Old Bookshelf - [Search, null, null, null, null] +7331 - Table - [null, null, null, null, null] +7332 - Bunsen burner - [null, null, null, null, null] +7333 - Shelves - [Search, null, null, null, null] +7334 - Shelves - [Search, null, null, null, null] +7335 - Shelves - [Search, null, null, null, null] +7336 - Shelves - [Search, null, null, null, null] +7337 - Shelves - [Search, null, null, null, null] +7338 - Shelves - [Search, null, null, null, null] +7339 - Shelves - [Search, null, null, null, null] +7340 - Shelves - [Search, null, null, null, null] +7341 - null - [null, null, null, null, null] +7342 - null - [null, null, null, null, null] +7343 - Stone Door - [Study, null, null, null, null] +7344 - Stone Door - [Pull-spade, null, null, null, null] +7345 - Open Door - [Walk-through, null, null, null, null] +7346 - Key - [null, null, null, null, null] +7347 - Crate - [Search, null, null, null, null] +7348 - Crate - [Search, null, null, null, null] +7349 - Crate - [Search, null, null, null, null] +7350 - Closed chest - [Open, null, null, null, null] +7351 - Open chest - [Search, Close, null, null, null] +7352 - Portal - [Use, null, null, null, null] +7353 - Portal - [Use, null, null, null, null] +7354 - Door - [Open, null, null, null, null] +7355 - Warning Sign - [null, null, null, null, null] +7356 - null - [null, null, null, null, null] +7357 - null - [null, null, null, null, null] +7358 - null - [null, null, null, null, null] +7359 - null - [null, null, null, null, null] +7360 - null - [null, null, null, null, null] +7361 - null - [null, null, null, null, null] +7362 - null - [null, null, null, null, null] +7363 - null - [null, null, null, null, null] +7364 - null - [null, null, null, null, null] +7365 - null - [null, null, null, null, null] +7366 - null - [null, null, null, null, null] +7367 - null - [null, null, null, null, null] +7368 - null - [null, null, null, null, null] +7369 - null - [null, null, null, null, null] +7370 - null - [null, null, null, null, null] +7371 - null - [null, null, null, null, null] +7372 - null - [null, null, null, null, null] +7373 - Door - [Open, null, null, null, null] +7374 - Door - [Close, null, null, null, null] +7375 - null - [null, null, null, null, null] +7376 - null - [null, null, null, null, null] +7377 - null - [null, null, null, null, null] +7378 - null - [null, null, null, null, null] +7379 - null - [null, null, null, null, null] +7380 - null - [null, null, null, null, null] +7381 - null - [null, null, null, null, null] +7382 - null - [null, null, null, null, null] +7383 - null - [null, null, null, null, null] +7384 - null - [null, null, null, null, null] +7385 - Chair - [null, null, null, null, null] +7386 - null - [null, null, null, null, null] +7387 - null - [null, null, null, null, null] +7388 - Bench - [null, null, null, null, null] +7389 - null - [null, null, null, null, null] +7390 - Hookah - [null, null, null, null, null] +7391 - Rolled up rug - [null, null, null, null, null] +7392 - Rolled up rugs - [null, null, null, null, null] +7393 - Little tent - [null, null, null, null, null] +7394 - Rug - [null, null, null, null, null] +7395 - null - [null, null, null, null, null] +7396 - Carpet Exhibit - [null, null, null, null, null] +7397 - Leafy tree - [null, null, null, null, null] +7398 - Leafy tree - [null, null, null, null, null] +7399 - Tree Stump - [null, null, hidden, null, null] +7400 - Tree Stump - [null, null, hidden, null, null] +7401 - Tree Stump - [null, null, hidden, null, null] +7402 - Tree Stump - [null, null, hidden, null, null] +7403 - Apple Barrel - [null, null, null, null, null] +7404 - Apple Barrel - [null, null, null, null, null] +7405 - null - [null, null, null, null, null] +7406 - Barrel Tap - [null, null, null, null, null] +7407 - Barrel - [null, null, null, null, null] +7408 - Barrel - [Drain, null, null, null, null] +7409 - Barrel - [Drain, null, null, null, null] +7410 - Barrel - [Drain, null, null, null, null] +7411 - Dwarven Stout - [Level, null, null, null, null] +7412 - Mature Dwarven Stout - [Level, null, null, null, null] +7413 - Asgarnian Ale - [Level, null, null, null, null] +7414 - Mature Asgarnian Ale - [Level, null, null, null, null] +7415 - Greenmans Ale - [Level, null, null, null, null] +7416 - Mature Greenmans Ale - [Level, null, null, null, null] +7417 - Wizards Mind Bomb - [Level, null, null, null, null] +7418 - Mature Wizards Mind Bomb - [Level, null, null, null, null] +7419 - Dragon Bitter - [Level, null, null, null, null] +7420 - Mature Dragon Bitter - [Level, null, null, null, null] +7421 - Moonlight Mead - [Level, null, null, null, null] +7422 - Mature Moonlight Mead - [Level, null, null, null, null] +7423 - Axeman's Folly - [Level, null, null, null, null] +7424 - Mature Axeman's Folly - [Level, null, null, null, null] +7425 - Chef's Delight - [Level, null, null, null, null] +7426 - Mature Chef's Delight - [Level, null, null, null, null] +7427 - Slayer's Respite - [Level, null, null, null, null] +7428 - Mature Slayer's Respite - [Level, null, null, null, null] +7429 - Cider - [Level, null, null, null, null] +7430 - Mature Cider - [Level, null, null, null, null] +7431 - null - [null, null, null, null, null] +7432 - null - [null, null, null, null, null] +7433 - ladder - [Climb-up, null, null, null, null] +7434 - Trapdoor - [Open, null, null, null, null] +7435 - Trapdoor - [Climb-down, Close, null, null, null] +7436 - Barrel - [null, null, null, null, null] +7437 - Fermenting Vat - [null, null, null, null, null] +7438 - Fermenting Vat - [null, null, null, null, null] +7439 - Fermenting Vat - [null, null, null, null, null] +7440 - Fermenting Vat - [null, null, null, null, null] +7441 - Fermenting Vat - [null, null, null, null, null] +7442 - Valve - [Turn, null, null, null, null] +7443 - Valve - [Turn, null, null, null, null] +7444 - Fermenting Vat - [null, null, null, null, null] +7445 - Fermenting Vat - [null, null, null, null, null] +7446 - Fermenting Vat - [null, null, null, null, null] +7447 - Fermenting Vat - [null, null, null, null, null] +7448 - Fermenting Vat - [null, null, null, null, null] +7449 - Fermenting Vat - [null, null, null, null, null] +7450 - Fermenting Vat - [null, null, null, null, null] +7451 - Fermenting Vat - [null, null, null, null, null] +7452 - Fermenting Vat - [null, null, null, null, null] +7453 - Fermenting Vat - [null, null, null, null, null] +7454 - Fermenting Vat - [null, null, null, null, null] +7455 - Fermenting Vat - [null, null, null, null, null] +7456 - Fermenting Vat - [null, null, null, null, null] +7457 - Fermenting Vat - [null, null, null, null, null] +7458 - Fermenting Vat - [null, null, null, null, null] +7459 - Fermenting Vat - [null, null, null, null, null] +7460 - Fermenting Vat - [null, null, null, null, null] +7461 - Fermenting Vat - [null, null, null, null, null] +7462 - Fermenting Vat - [null, null, null, null, null] +7463 - Fermenting Vat - [null, null, null, null, null] +7464 - Fermenting Vat - [null, null, null, null, null] +7465 - Fermenting Vat - [null, null, null, null, null] +7466 - Fermenting Vat - [null, null, null, null, null] +7467 - Fermenting Vat - [null, null, null, null, null] +7468 - Fermenting Vat - [null, null, null, null, null] +7469 - Fermenting Vat - [null, null, null, null, null] +7470 - Fermenting Vat - [null, null, null, null, null] +7471 - Fermenting Vat - [null, null, null, null, null] +7472 - Fermenting Vat - [null, null, null, null, null] +7473 - Fermenting Vat - [null, null, null, null, null] +7474 - Fermenting Vat - [null, null, null, null, null] +7475 - Fermenting Vat - [null, null, null, null, null] +7476 - Fermenting Vat - [null, null, null, null, null] +7477 - Fermenting Vat - [null, null, null, null, null] +7478 - Fermenting Vat - [null, null, null, null, null] +7479 - Fermenting Vat - [null, null, null, null, null] +7480 - Fermenting Vat - [null, null, null, null, null] +7481 - Fermenting Vat - [null, null, null, null, null] +7482 - Fermenting Vat - [null, null, null, null, null] +7483 - Fermenting Vat - [null, null, null, null, null] +7484 - Fermenting Vat - [null, null, null, null, null] +7485 - Fermenting Vat - [null, null, null, null, null] +7486 - Fermenting Vat - [null, null, null, null, null] +7487 - Fermenting Vat - [null, null, null, null, null] +7488 - Fermenting Vat - [null, null, null, null, null] +7489 - Fermenting Vat - [null, null, null, null, null] +7490 - Fermenting Vat - [null, null, null, null, null] +7491 - Fermenting Vat - [null, null, null, null, null] +7492 - Fermenting Vat - [null, null, null, null, null] +7493 - Fermenting Vat - [null, null, null, null, null] +7494 - null - [null, null, null, null, null] +7495 - null - [null, null, null, null, null] +7496 - Counter - [null, null, null, null, null] +7497 - Counter - [null, null, null, null, null] +7498 - Shelves - [null, null, null, null, null] +7499 - Shelves - [null, null, null, null, null] +7500 - Shelves - [null, null, null, null, null] +7501 - Shelves - [null, null, null, null, null] +7502 - Shelves - [null, null, null, null, null] +7503 - null - [null, null, null, null, null] +7504 - Chair - [null, null, null, null, null] +7505 - Chair - [null, null, null, null, null] +7506 - Shelves - [null, null, null, null, null] +7507 - Shelves - [null, null, null, null, null] +7508 - Shelves - [null, null, null, null, null] +7509 - Shelves - [null, null, null, null, null] +7510 - Shelves - [null, null, null, null, null] +7511 - Shelves - [null, null, null, null, null] +7512 - Sacks - [null, null, null, null, null] +7513 - Crate - [null, null, null, null, null] +7514 - Crate - [null, null, null, null, null] +7515 - null - [null, null, null, null, null] +7516 - Tools - [null, null, null, null, null] +7517 - null - [null, null, null, null, null] +7518 - null - [null, null, null, null, null] +7519 - null - [null, null, null, null, null] +7520 - null - [null, null, null, null, null] +7521 - null - [null, null, null, null, null] +7522 - null - [null, null, null, null, null] +7523 - null - [null, null, null, null, null] +7524 - null - [null, null, null, null, null] +7525 - null - [null, null, null, null, null] +7526 - null - [null, null, null, null, null] +7527 - Stile - [Climb-over, null, null, null, null] +7528 - Fermenting Vat - [null, null, null, null, null] +7529 - Fermenting Vat - [null, null, null, null, null] +7530 - Fermenting Vat - [null, null, null, null, null] +7531 - Barrel - [null, null, null, null, null] +7532 - Valve - [null, null, null, null, null] +7533 - null - [null, null, null, null, null] +7534 - null - [null, null, null, null, null] +7535 - null - [null, null, null, null, null] +7536 - null - [null, null, null, null, null] +7537 - null - [null, null, null, null, null] +7538 - null - [null, null, null, null, null] +7539 - null - [null, null, null, null, null] +7540 - null - [null, null, null, null, null] +7541 - null - [null, null, null, null, null] +7542 - null - [null, null, null, null, null] +7543 - null - [null, null, null, null, null] +7544 - null - [null, null, null, null, null] +7545 - null - [null, null, null, null, null] +7546 - null - [null, null, null, null, null] +7547 - null - [null, null, null, null, null] +7548 - null - [null, null, null, null, null] +7549 - null - [null, null, null, null, null] +7550 - null - [null, null, null, null, null] +7551 - null - [null, null, null, null, null] +7552 - null - [null, null, null, null, null] +7553 - null - [null, null, null, null, null] +7554 - null - [null, null, null, null, null] +7555 - null - [null, null, null, null, null] +7556 - null - [null, null, null, null, null] +7557 - Belladonna patch - [null, Inspect, null, Guide, null] +7558 - Belladonna patch - [null, Inspect, null, Guide, null] +7559 - Belladonna patch - [null, Inspect, null, Guide, null] +7560 - Belladonna patch - [null, Inspect, null, Guide, null] +7561 - Belladonna - [null, Inspect, null, Guide, null] +7562 - Belladonna - [null, Inspect, null, Guide, null] +7563 - Belladonna - [null, Inspect, null, Guide, null] +7564 - Belladonna - [null, Inspect, null, Guide, null] +7565 - Belladonna - [Pick, Inspect, null, Guide, null] +7566 - Diseased Belladonna - [null, Inspect, null, Guide, null] +7567 - Diseased Belladonna - [null, Inspect, null, Guide, null] +7568 - Diseased Belladonna - [null, Inspect, null, Guide, null] +7569 - Dead Belladonna - [null, Inspect, null, Guide, null] +7570 - Dead Belladonna - [null, Inspect, null, Guide, null] +7571 - Dead Belladonna - [null, Inspect, null, Guide, null] +7572 - null - [null, null, null, null, null] +7573 - Bush Patch - [null, Inspect, null, Guide, null] +7574 - Bush Patch - [null, Inspect, null, Guide, null] +7575 - Bush Patch - [null, Inspect, null, Guide, null] +7576 - Bush Patch - [null, Inspect, null, Guide, null] +7577 - null - [null, null, null, null, null] +7578 - null - [null, null, null, null, null] +7579 - null - [null, null, null, null, null] +7580 - null - [null, null, null, null, null] +7581 - Cadavaberry bush - [null, Inspect, null, Guide, null] +7582 - Cadavaberry bush - [null, Inspect, null, Guide, null] +7583 - Cadavaberry bush - [null, Inspect, null, Guide, null] +7584 - Cadavaberry bush - [null, Inspect, null, Guide, null] +7585 - Cadavaberry bush - [null, Inspect, null, Guide, null] +7586 - Cadavaberry bush - [null, Inspect, null, Guide, null] +7587 - Cadavaberry bush - [null, Inspect, null, Guide, null] +7588 - Cadavaberry bush - [Pick-from, Inspect, null, Guide, null] +7589 - Cadavaberry bush - [Pick-from, Inspect, null, Guide, null] +7590 - Cadavaberry bush - [Pick-from, Inspect, null, Guide, null] +7591 - Cadavaberry bush - [Pick-from, Inspect, null, Guide, null] +7592 - Cadavaberry bush - [Check-health, Inspect, null, Guide, null] +7593 - Diseased cadavaberry bush - [null, Inspect, null, Guide, null] +7594 - Diseased cadavaberry bush - [null, Inspect, null, Guide, null] +7595 - Diseased cadavaberry bush - [null, Inspect, null, Guide, null] +7596 - Diseased cadavaberry bush - [null, Inspect, null, Guide, null] +7597 - Diseased cadavaberry bush - [null, Inspect, null, Guide, null] +7598 - Diseased cadavaberry bush - [null, Inspect, null, Guide, null] +7599 - Dead cadavaberry bush - [null, Inspect, null, Guide, null] +7600 - Dead cadavaberry bush - [null, Inspect, null, Guide, null] +7601 - Dead cadavaberry bush - [null, Inspect, null, Guide, null] +7602 - Dead cadavaberry bush - [null, Inspect, null, Guide, null] +7603 - Dead cadavaberry bush - [null, Inspect, null, Guide, null] +7604 - Dead cadavaberry bush - [null, Inspect, null, Guide, null] +7605 - Dwellberry bush - [null, Inspect, null, Guide, null] +7606 - Dwellberry bush - [null, Inspect, null, Guide, null] +7607 - Dwellberry bush - [null, Inspect, null, Guide, null] +7608 - Dwellberry bush - [null, Inspect, null, Guide, null] +7609 - Dwellberry bush - [null, Inspect, null, Guide, null] +7610 - Dwellberry bush - [null, Inspect, null, Guide, null] +7611 - Dwellberry bush - [null, Inspect, null, Guide, null] +7612 - Dwellberry bush - [null, Inspect, null, Guide, null] +7613 - Dwellberry bush - [Pick-from, Inspect, null, Guide, null] +7614 - Dwellberry bush - [Pick-from, Inspect, null, Guide, null] +7615 - Dwellberry bush - [Pick-from, Inspect, null, Guide, null] +7616 - Dwellberry bush - [Pick-from, Inspect, null, Guide, null] +7617 - Dwellberry bush - [Check-health, Inspect, null, Guide, null] +7618 - Diseased dwellberry bush - [null, Inspect, null, Guide, null] +7619 - Diseased dwellberry bush - [null, Inspect, null, Guide, null] +7620 - Diseased dwellberry bush - [null, Inspect, null, Guide, null] +7621 - Diseased dwellberry bush - [null, Inspect, null, Guide, null] +7622 - Diseased dwellberry bush - [null, Inspect, null, Guide, null] +7623 - Diseased dwellberry bush - [null, Inspect, null, Guide, null] +7624 - Diseased dwellberry bush - [null, Inspect, null, Guide, null] +7625 - Dead dwellberry bush - [null, Inspect, null, Guide, null] +7626 - Dead dwellberry bush - [null, Inspect, null, Guide, null] +7627 - Dead dwellberry bush - [null, Inspect, null, Guide, null] +7628 - Dead dwellberry bush - [null, Inspect, null, Guide, null] +7629 - Dead dwellberry bush - [null, Inspect, null, Guide, null] +7630 - Dead dwellberry bush - [null, Inspect, null, Guide, null] +7631 - Dead dwellberry bush - [null, Inspect, null, Guide, null] +7632 - Jangerberry bush - [null, Inspect, null, Guide, null] +7633 - Jangerberry bush - [null, Inspect, null, Guide, null] +7634 - Jangerberry bush - [null, Inspect, null, Guide, null] +7635 - Jangerberry bush - [null, Inspect, null, Guide, null] +7636 - Jangerberry bush - [null, Inspect, null, Guide, null] +7637 - Jangerberry bush - [null, Inspect, null, Guide, null] +7638 - Jangerberry bush - [null, Inspect, null, Guide, null] +7639 - Jangerberry bush - [null, Inspect, null, Guide, null] +7640 - Jangerberry bush - [null, Inspect, null, Guide, null] +7641 - Jangerberry bush - [Pick-from, Inspect, null, Guide, null] +7642 - Jangerberry bush - [Pick-from, Inspect, null, Guide, null] +7643 - Jangerberry bush - [Pick-from, Inspect, null, Guide, null] +7644 - Jangerberry bush - [Pick-from, Inspect, null, Guide, null] +7645 - Jangerberry bush - [Check-health, Inspect, null, Guide, null] +7646 - Diseased jangerberry bush - [null, Inspect, null, Guide, null] +7647 - Diseased jangerberry bush - [null, Inspect, null, Guide, null] +7648 - Diseased jangerberry bush - [null, Inspect, null, Guide, null] +7649 - Diseased jangerberry bush - [null, Inspect, null, Guide, null] +7650 - Diseased jangerberry bush - [null, Inspect, null, Guide, null] +7651 - Diseased jangerberry bush - [null, Inspect, null, Guide, null] +7652 - Diseased jangerberry bush - [null, Inspect, null, Guide, null] +7653 - Diseased jangerberry bush - [null, Inspect, null, Guide, null] +7654 - Dead jangerberry bush - [null, Inspect, null, Guide, null] +7655 - Dead jangerberry bush - [null, Inspect, null, Guide, null] +7656 - Dead jangerberry bush - [null, Inspect, null, Guide, null] +7657 - Dead jangerberry bush - [null, Inspect, null, Guide, null] +7658 - Dead jangerberry bush - [null, Inspect, null, Guide, null] +7659 - Dead jangerberry bush - [null, Inspect, null, Guide, null] +7660 - Dead jangerberry bush - [null, Inspect, null, Guide, null] +7661 - Dead jangerberry bush - [null, Inspect, null, Guide, null] +7662 - Poison Ivy bush - [null, Inspect, null, Guide, null] +7663 - Poison Ivy bush - [null, Inspect, null, Guide, null] +7664 - Poison Ivy bush - [null, Inspect, null, Guide, null] +7665 - Poison Ivy bush - [null, Inspect, null, Guide, null] +7666 - Poison Ivy bush - [null, Inspect, null, Guide, null] +7667 - Poison Ivy bush - [null, Inspect, null, Guide, null] +7668 - Poison Ivy bush - [null, Inspect, null, Guide, null] +7669 - Poison Ivy bush - [null, Inspect, null, Guide, null] +7670 - Poison Ivy bush - [null, Inspect, null, Guide, null] +7671 - Poison Ivy bush - [Pick-from, Inspect, null, Guide, null] +7672 - Poison Ivy bush - [Pick-from, Inspect, null, Guide, null] +7673 - Poison Ivy bush - [Pick-from, Inspect, null, Guide, null] +7674 - Poison Ivy bush - [Pick-from, Inspect, null, Guide, null] +7675 - Poison Ivy bush - [Check-health, Inspect, null, Guide, null] +7676 - Diseased Poison Ivy bush - [null, Inspect, null, Guide, null] +7677 - Diseased Poison Ivy bush - [null, Inspect, null, Guide, null] +7678 - Diseased Poison Ivy bush - [null, Inspect, null, Guide, null] +7679 - Diseased Poison Ivy bush - [null, Inspect, null, Guide, null] +7680 - Diseased Poison Ivy bush - [null, Inspect, null, Guide, null] +7681 - Diseased Poison Ivy bush - [null, Inspect, null, Guide, null] +7682 - Diseased Poison Ivy bush - [null, Inspect, null, Guide, null] +7683 - Diseased Poison Ivy bush - [null, Inspect, null, Guide, null] +7684 - Dead Poison Ivy bush - [null, Inspect, null, Guide, null] +7685 - Dead Poison Ivy bush - [null, Inspect, null, Guide, null] +7686 - Dead Poison Ivy bush - [null, Inspect, null, Guide, null] +7687 - Dead Poison Ivy bush - [null, Inspect, null, Guide, null] +7688 - Dead Poison Ivy bush - [null, Inspect, null, Guide, null] +7689 - Dead Poison Ivy bush - [null, Inspect, null, Guide, null] +7690 - Dead Poison Ivy bush - [null, Inspect, null, Guide, null] +7691 - Dead Poison Ivy bush - [null, Inspect, null, Guide, null] +7692 - Redberry bush - [null, Inspect, null, Guide, null] +7693 - Redberry bush - [null, Inspect, null, Guide, null] +7694 - Redberry bush - [null, Inspect, null, Guide, null] +7695 - Redberry bush - [null, Inspect, null, Guide, null] +7696 - Redberry bush - [null, Inspect, null, Guide, null] +7697 - Redberry bush - [null, Inspect, null, Guide, null] +7698 - Redberry bush - [Pick-from, Inspect, null, Guide, null] +7699 - Redberry bush - [Pick-from, Inspect, null, Guide, null] +7700 - Redberry bush - [Pick-from, Inspect, null, Guide, null] +7701 - Redberry bush - [Pick-from, Inspect, null, Guide, null] +7702 - Redberry bush - [Check-health, Inspect, null, Guide, null] +7703 - Diseased redberry bush - [null, Inspect, null, Guide, null] +7704 - Diseased redberry bush - [null, Inspect, null, Guide, null] +7705 - Diseased redberry bush - [null, Inspect, null, Guide, null] +7706 - Diseased redberry bush - [null, Inspect, null, Guide, null] +7707 - Diseased redberry bush - [null, Inspect, null, Guide, null] +7708 - Dead redberry bush - [null, Inspect, null, Guide, null] +7709 - Dead redberry bush - [null, Inspect, null, Guide, null] +7710 - Dead redberry bush - [null, Inspect, null, Guide, null] +7711 - Dead redberry bush - [null, Inspect, null, Guide, null] +7712 - Dead redberry bush - [null, Inspect, null, Guide, null] +7713 - Whiteberry bush - [null, Inspect, null, Guide, null] +7714 - Whiteberry bush - [null, Inspect, null, Guide, null] +7715 - Whiteberry bush - [null, Inspect, null, Guide, null] +7716 - Whiteberry bush - [null, Inspect, null, Guide, null] +7717 - Whiteberry bush - [null, Inspect, null, Guide, null] +7718 - Whiteberry bush - [null, Inspect, null, Guide, null] +7719 - Whiteberry bush - [null, Inspect, null, Guide, null] +7720 - Whiteberry bush - [null, Inspect, null, Guide, null] +7721 - Whiteberry bush - [null, Inspect, null, Guide, null] +7722 - Whiteberry bush - [Pick-from, Inspect, null, Guide, null] +7723 - Whiteberry bush - [Pick-from, Inspect, null, Guide, null] +7724 - Whiteberry bush - [Pick-from, Inspect, null, Guide, null] +7725 - Whiteberry bush - [Pick-from, Inspect, null, Guide, null] +7726 - Whiteberry bush - [Check-health, Inspect, null, Guide, null] +7727 - Diseased whiteberry bush - [null, Inspect, null, Guide, null] +7728 - Diseased whiteberry bush - [null, Inspect, null, Guide, null] +7729 - Diseased whiteberry bush - [null, Inspect, null, Guide, null] +7730 - Diseased whiteberry bush - [null, Inspect, null, Guide, null] +7731 - Diseased whiteberry bush - [null, Inspect, null, Guide, null] +7732 - Diseased whiteberry bush - [null, Inspect, null, Guide, null] +7733 - Diseased whiteberry bush - [null, Inspect, null, Guide, null] +7734 - Diseased whiteberry bush - [null, Inspect, null, Guide, null] +7735 - Dead whiteberry bush - [null, Inspect, null, Guide, null] +7736 - Dead whiteberry bush - [null, Inspect, null, Guide, null] +7737 - Dead whiteberry bush - [null, Inspect, null, Guide, null] +7738 - Dead whiteberry bush - [null, Inspect, null, Guide, null] +7739 - Dead whiteberry bush - [null, Inspect, null, Guide, null] +7740 - Dead whiteberry bush - [null, Inspect, null, Guide, null] +7741 - Dead whiteberry bush - [null, Inspect, null, Guide, null] +7742 - Dead whiteberry bush - [null, Inspect, null, Guide, null] +7743 - Cactus patch - [null, Inspect, null, Guide, null] +7744 - Cactus patch - [null, Inspect, null, Guide, null] +7745 - Cactus patch - [null, Inspect, null, Guide, null] +7746 - Cactus patch - [null, Inspect, null, Guide, null] +7747 - Cactus - [null, Inspect, null, Guide, null] +7748 - Cactus - [null, Inspect, null, Guide, null] +7749 - Cactus - [null, Inspect, null, Guide, null] +7750 - Cactus - [null, Inspect, null, Guide, null] +7751 - Cactus - [null, Inspect, null, Guide, null] +7752 - Cactus - [null, Inspect, null, Guide, null] +7753 - Cactus - [null, Inspect, null, Guide, null] +7754 - Cactus - [null, Inspect, null, Guide, null] +7755 - Cactus - [Pick-spine, Inspect, null, Guide, null] +7756 - Cactus - [Pick-spine, Inspect, null, Guide, null] +7757 - Cactus - [Pick-spine, Inspect, null, Guide, null] +7758 - Cactus - [Check-health, Inspect, null, Guide, null] +7759 - Diseased cactus - [null, Inspect, null, Guide, null] +7760 - Diseased cactus - [null, Inspect, null, Guide, null] +7761 - Diseased cactus - [null, Inspect, null, Guide, null] +7762 - Diseased cactus - [null, Inspect, null, Guide, null] +7763 - Diseased cactus - [null, Inspect, null, Guide, null] +7764 - Diseased cactus - [null, Inspect, null, Guide, null] +7765 - Dead cactus - [null, Inspect, null, Guide, null] +7766 - Dead cactus - [null, Inspect, null, Guide, null] +7767 - Dead cactus - [null, Inspect, null, Guide, null] +7768 - Dead cactus - [null, Inspect, null, Guide, null] +7769 - Dead cactus - [null, Inspect, null, Guide, null] +7770 - Dead cactus - [null, Inspect, null, Guide, null] +7771 - null - [null, null, null, null, null] +7772 - Calquat patch - [null, Inspect, null, Guide, null] +7773 - Calquat patch - [null, Inspect, null, Guide, null] +7774 - Calquat patch - [null, Inspect, null, Guide, null] +7775 - Calquat patch - [null, Inspect, null, Guide, null] +7776 - Calquat Tree - [null, Inspect, null, Guide, null] +7777 - Calquat Tree - [null, Inspect, null, Guide, null] +7778 - Calquat Tree - [null, Inspect, null, Guide, null] +7779 - Calquat Tree - [null, Inspect, null, Guide, null] +7780 - Calquat Tree - [null, Inspect, null, Guide, null] +7781 - Calquat Tree - [null, Inspect, null, Guide, null] +7782 - Calquat Tree - [null, Inspect, null, Guide, null] +7783 - Calquat Tree - [null, Inspect, null, Guide, null] +7784 - Calquat Tree - [null, Inspect, null, Guide, null] +7785 - Calquat Tree - [Pick-fruit, Inspect, null, Guide, null] +7786 - Calquat Tree - [Pick-fruit, Inspect, null, Guide, null] +7787 - Calquat Tree - [Pick-fruit, Inspect, null, Guide, null] +7788 - Calquat Tree - [Pick-fruit, Inspect, null, Guide, null] +7789 - Calquat Tree - [Pick-fruit, Inspect, null, Guide, null] +7790 - Calquat Tree - [Pick-fruit, Inspect, null, Guide, null] +7791 - Calquat Tree - [Check-health, Inspect, null, Guide, null] +7792 - Diseased Calquat - [null, Inspect, null, Guide, null] +7793 - Diseased Calquat - [null, Inspect, null, Guide, null] +7794 - Diseased Calquat - [null, Inspect, null, Guide, null] +7795 - Diseased Calquat - [null, Inspect, null, Guide, null] +7796 - Diseased Calquat - [null, Inspect, null, Guide, null] +7797 - Diseased Calquat - [null, Inspect, null, Guide, null] +7798 - Diseased Calquat - [null, Inspect, null, Guide, null] +7799 - Dead Calquat - [null, Inspect, null, Guide, null] +7800 - Dead Calquat - [null, Inspect, null, Guide, null] +7801 - Dead Calquat - [null, Inspect, null, Guide, null] +7802 - Dead Calquat - [null, Inspect, null, Guide, null] +7803 - Dead Calquat - [null, Inspect, null, Guide, null] +7804 - Dead Calquat - [null, Inspect, null, Guide, null] +7805 - Dead Calquat - [null, Inspect, null, Guide, null] +7806 - Dead Calquat - [null, Inspect, null, Guide, null] +7807 - null - [null, null, null, null, null] +7808 - Compost Bin - [null, null, null, null, null] +7809 - Compost Bin - [null, null, null, null, null] +7810 - Compost Bin - [Close, null, null, null, null] +7811 - Compost Bin - [null, null, null, null, null] +7812 - Compost Bin - [Close, null, null, null, null] +7813 - Compost Bin - [Open, null, null, null, null] +7814 - Compost Bin - [null, null, null, null, null] +7815 - Compost Bin - [null, null, null, null, null] +7816 - Compost Bin - [null, null, null, null, null] +7817 - Compost Bin - [null, null, null, null, null] +7818 - Compost Bin - [null, null, null, null, null] +7819 - Compost Bin - [null, null, null, null, null] +7820 - Compost Bin - [Close, null, null, null, null] +7821 - Compost Bin - [null, null, null, null, null] +7822 - Compost Bin - [Close, null, null, null, null] +7823 - Compost Bin - [Open, null, null, null, null] +7824 - Compost Bin - [null, null, null, null, null] +7825 - Compost Bin - [null, null, null, null, null] +7826 - Compost Bin - [null, null, null, null, null] +7827 - Compost Bin - [null, null, null, null, null] +7828 - Compost Bin - [null, null, null, null, null] +7829 - Compost Bin - [Close, null, null, null, null] +7830 - Compost Bin - [Take-tomato, null, null, null, null] +7831 - Compost Bin - [Take-tomato, null, null, null, null] +7832 - Compost Bin - [null, null, null, null, null] +7833 - Compost Bin - [Close, null, null, null, null] +7834 - Compost Bin - [Take-tomato, null, null, null, null] +7835 - Compost Bin - [Take-tomato, null, null, null, null] +7836 - null - [null, null, null, null, null] +7837 - null - [null, null, null, null, null] +7838 - null - [null, null, null, null, null] +7839 - null - [null, null, null, null, null] +7840 - Flower Patch - [null, Inspect, null, Guide, null] +7841 - Flower Patch - [null, Inspect, null, Guide, null] +7842 - Flower Patch - [null, Inspect, null, Guide, null] +7843 - Flower Patch - [null, Inspect, null, Guide, null] +7844 - Flower Patch - [null, Inspect, null, Guide, null] +7845 - Flower Patch - [null, Inspect, null, Guide, null] +7846 - Flower Patch - [null, Inspect, null, Guide, null] +7847 - null - [null, null, null, null, null] +7848 - null - [null, null, null, null, null] +7849 - null - [null, null, null, null, null] +7850 - null - [null, null, null, null, null] +7851 - Limpwurt plant - [null, Inspect, null, Guide, null] +7852 - Limpwurt plant - [null, Inspect, null, Guide, null] +7853 - Limpwurt plant - [null, Inspect, null, Guide, null] +7854 - Limpwurt plant - [null, Inspect, null, Guide, null] +7855 - Limpwurt plant - [Pick, Inspect, null, Guide, null] +7856 - Limpwurt plant - [null, Inspect, null, Guide, null] +7857 - Limpwurt plant - [null, Inspect, null, Guide, null] +7858 - Limpwurt plant - [null, Inspect, null, Guide, null] +7859 - Limpwurt plant - [null, Inspect, null, Guide, null] +7860 - Diseased limpwurt plant - [null, Inspect, null, Guide, null] +7861 - Diseased limpwurt plant - [null, Inspect, null, Guide, null] +7862 - Diseased limpwurt plant - [null, Inspect, null, Guide, null] +7863 - Dead limpwurt plant - [null, Inspect, null, Guide, null] +7864 - Dead limpwurt plant - [null, Inspect, null, Guide, null] +7865 - Dead limpwurt plant - [null, Inspect, null, Guide, null] +7866 - Dead limpwurt plant - [null, Inspect, null, Guide, null] +7867 - Marigold - [null, Inspect, null, Guide, null] +7868 - Marigold - [null, Inspect, null, Guide, null] +7869 - Marigold - [null, Inspect, null, Guide, null] +7870 - Marigold - [null, Inspect, null, Guide, null] +7871 - Marigold - [Pick, Inspect, null, Guide, null] +7872 - Marigold - [null, Inspect, null, Guide, null] +7873 - Marigold - [null, Inspect, null, Guide, null] +7874 - Marigold - [null, Inspect, null, Guide, null] +7875 - Marigold - [null, Inspect, null, Guide, null] +7876 - Diseased marigold - [null, Inspect, null, Guide, null] +7877 - Diseased marigold - [null, Inspect, null, Guide, null] +7878 - Diseased marigold - [null, Inspect, null, Guide, null] +7879 - Dead marigold - [null, Inspect, null, Guide, null] +7880 - Dead marigold - [null, Inspect, null, Guide, null] +7881 - Dead marigold - [null, Inspect, null, Guide, null] +7882 - Dead marigold - [null, Inspect, null, Guide, null] +7883 - Nasturtium - [null, Inspect, null, Guide, null] +7884 - Nasturtium - [null, Inspect, null, Guide, null] +7885 - Nasturtium - [null, Inspect, null, Guide, null] +7886 - Nasturtium - [null, Inspect, null, Guide, null] +7887 - Nasturtium - [Pick, Inspect, null, Guide, null] +7888 - Nasturtium - [null, Inspect, null, Guide, null] +7889 - Nasturtium - [null, Inspect, null, Guide, null] +7890 - Nasturtium - [null, Inspect, null, Guide, null] +7891 - Nasturtium - [null, Inspect, null, Guide, null] +7892 - Diseased nasturtium - [null, Inspect, null, Guide, null] +7893 - Diseased nasturtium - [null, Inspect, null, Guide, null] +7894 - Diseased nasturtium - [null, Inspect, null, Guide, null] +7895 - Dead nasturtium - [null, Inspect, null, Guide, null] +7896 - Dead nasturtium - [null, Inspect, null, Guide, null] +7897 - Dead nasturtium - [null, Inspect, null, Guide, null] +7898 - Dead nasturtium - [null, Inspect, null, Guide, null] +7899 - Rosemary - [null, Inspect, null, Guide, null] +7900 - Rosemary - [null, Inspect, null, Guide, null] +7901 - Rosemary - [null, Inspect, null, Guide, null] +7902 - Rosemary - [null, Inspect, null, Guide, null] +7903 - Rosemary - [Pick, Inspect, null, Guide, null] +7904 - Rosemary - [null, Inspect, null, Guide, null] +7905 - Rosemary - [null, Inspect, null, Guide, null] +7906 - Rosemary - [null, Inspect, null, Guide, null] +7907 - Rosemary - [null, Inspect, null, Guide, null] +7908 - Diseased rosemary - [null, Inspect, null, Guide, null] +7909 - Diseased rosemary - [null, Inspect, null, Guide, null] +7910 - Diseased rosemary - [null, Inspect, null, Guide, null] +7911 - Dead rosemary - [null, Inspect, null, Guide, null] +7912 - Dead rosemary - [null, Inspect, null, Guide, null] +7913 - Dead rosemary - [null, Inspect, null, Guide, null] +7914 - Dead rosemary - [null, Inspect, null, Guide, null] +7915 - Scarecrow - [null, Inspect, null, Guide, null] +7916 - Scarecrow - [null, Inspect, null, Guide, null] +7917 - Scarecrow - [null, Inspect, null, Guide, null] +7918 - Scarecrow - [null, Inspect, null, Guide, null] +7919 - Woad plant - [null, Inspect, null, Guide, null] +7920 - Woad plant - [null, Inspect, null, Guide, null] +7921 - Woad plant - [null, Inspect, null, Guide, null] +7922 - Woad plant - [null, Inspect, null, Guide, null] +7923 - Woad plant - [Pick, Inspect, null, Guide, null] +7924 - Woad plant - [null, Inspect, null, Guide, null] +7925 - Woad plant - [null, Inspect, null, Guide, null] +7926 - Woad plant - [null, Inspect, null, Guide, null] +7927 - Woad plant - [null, Inspect, null, Guide, null] +7928 - Diseased woad plant - [null, Inspect, null, Guide, null] +7929 - Diseased woad plant - [null, Inspect, null, Guide, null] +7930 - Diseased woad plant - [null, Inspect, null, Guide, null] +7931 - Dead woad plant - [null, Inspect, null, Guide, null] +7932 - Dead woad plant - [null, Inspect, null, Guide, null] +7933 - Dead woad plant - [null, Inspect, null, Guide, null] +7934 - Dead woad plant - [null, Inspect, null, Guide, null] +7935 - Apple tree - [null, Inspect, null, Guide, null] +7936 - Apple tree - [null, Inspect, null, Guide, null] +7937 - Apple tree - [null, Inspect, null, Guide, null] +7938 - Apple tree - [null, Inspect, null, Guide, null] +7939 - Apple tree - [null, Inspect, null, Guide, null] +7940 - Apple tree - [null, Inspect, null, Guide, null] +7941 - Apple tree - [Chop-down, Inspect, null, Guide, null] +7942 - Apple tree - [Pick-apple, Inspect, null, Guide, null] +7943 - Apple tree - [Pick-apple, Inspect, null, Guide, null] +7944 - Apple tree - [Pick-apple, Inspect, null, Guide, null] +7945 - Apple tree - [Pick-apple, Inspect, null, Guide, null] +7946 - Apple tree - [Pick-apple, Inspect, null, Guide, null] +7947 - Apple tree - [Pick-apple, Inspect, null, Guide, null] +7948 - Apple tree - [Check-health, Inspect, null, Guide, null] +7949 - Diseased apple tree - [null, Inspect, null, Guide, null] +7950 - Diseased apple tree - [null, Inspect, null, Guide, null] +7951 - Diseased apple tree - [null, Inspect, null, Guide, null] +7952 - Diseased apple tree - [null, Inspect, null, Guide, null] +7953 - Diseased apple tree - [null, Inspect, null, Guide, null] +7954 - Diseased apple tree - [null, Inspect, null, Guide, null] +7955 - Dead apple tree - [null, Inspect, null, Guide, null] +7956 - Dead apple tree - [null, Inspect, null, Guide, null] +7957 - Dead apple tree - [null, Inspect, null, Guide, null] +7958 - Dead apple tree - [null, Inspect, null, Guide, null] +7959 - Dead apple tree - [null, Inspect, null, Guide, null] +7960 - Dead apple tree - [null, Inspect, null, Guide, null] +7961 - Apple tree stump - [null, Inspect, null, Guide, null] +7962 - null - [null, null, null, null, null] +7963 - null - [null, null, null, null, null] +7964 - null - [null, null, null, null, null] +7965 - null - [null, null, null, null, null] +7966 - Pineapple plant - [null, Inspect, null, Guide, null] +7967 - Pineapple plant - [null, Inspect, null, Guide, null] +7968 - Pineapple plant - [null, Inspect, null, Guide, null] +7969 - Pineapple plant - [null, Inspect, null, Guide, null] +7970 - Pineapple plant - [null, Inspect, null, Guide, null] +7971 - Pineapple plant - [null, Inspect, null, Guide, null] +7972 - Pineapple plant - [Chop down, Inspect, null, Guide, null] +7973 - Pineapple plant - [Pick-pineapple, Inspect, null, Guide, null] +7974 - Pineapple plant - [Pick-pineapple, Inspect, null, Guide, null] +7975 - Pineapple plant - [Pick-pineapple, Inspect, null, Guide, null] +7976 - Pineapple plant - [Pick-pineapple, Inspect, null, Guide, null] +7977 - Pineapple plant - [Pick-pineapple, Inspect, null, Guide, null] +7978 - Pineapple plant - [Pick-pineapple, Inspect, null, Guide, null] +7979 - Pineapple plant - [Check-health, Inspect, null, Guide, null] +7980 - Diseased pineapple plant - [null, Inspect, null, Guide, null] +7981 - Diseased pineapple plant - [null, Inspect, null, Guide, null] +7982 - Diseased pineapple plant - [null, Inspect, null, Guide, null] +7983 - Diseased pineapple plant - [null, Inspect, null, Guide, null] +7984 - Diseased pineapple plant - [null, Inspect, null, Guide, null] +7985 - Diseased pineapple plant - [null, Inspect, null, Guide, null] +7986 - Dead pineapple plant - [null, Inspect, null, Guide, null] +7987 - Dead pineapple plant - [null, Inspect, null, Guide, null] +7988 - Dead pineapple plant - [null, Inspect, null, Guide, null] +7989 - Dead pineapple plant - [null, Inspect, null, Guide, null] +7990 - Dead pineapple plant - [null, Inspect, null, Guide, null] +7991 - Dead pineapple plant - [null, Inspect, null, Guide, null] +7992 - Pineapple plant stump - [null, Inspect, null, Guide, null] +7993 - Banana tree - [null, Inspect, null, Guide, null] +7994 - Banana tree - [null, Inspect, null, Guide, null] +7995 - Banana tree - [null, Inspect, null, Guide, null] +7996 - Banana tree - [null, Inspect, null, Guide, null] +7997 - Banana tree - [null, Inspect, null, Guide, null] +7998 - Banana tree - [null, Inspect, null, Guide, null] +7999 - Banana tree - [Check-health, Inspect, null, Guide, null] +8000 - Banana tree - [Chop-down, Inspect, null, Guide, null] +8001 - Banana tree - [Pick-banana, Inspect, null, Guide, null] +8002 - Banana tree - [Pick-banana, Inspect, null, Guide, null] +8003 - Banana tree - [Pick-banana, Inspect, null, Guide, null] +8004 - Banana tree - [Pick-banana, Inspect, null, Guide, null] +8005 - Banana tree - [Pick-banana, Inspect, null, Guide, null] +8006 - Banana tree - [Pick-banana, Inspect, null, Guide, null] +8007 - Diseased banana tree - [null, Inspect, null, Guide, null] +8008 - Diseased banana tree - [null, Inspect, null, Guide, null] +8009 - Diseased banana tree - [null, Inspect, null, Guide, null] +8010 - Diseased banana tree - [null, Inspect, null, Guide, null] +8011 - Diseased banana tree - [null, Inspect, null, Guide, null] +8012 - Diseased banana tree - [null, Inspect, null, Guide, null] +8013 - Dead banana tree - [null, Inspect, null, Guide, null] +8014 - Dead banana tree - [null, Inspect, null, Guide, null] +8015 - Dead banana tree - [null, Inspect, null, Guide, null] +8016 - Dead banana tree - [null, Inspect, null, Guide, null] +8017 - Dead banana tree - [null, Inspect, null, Guide, null] +8018 - Dead banana tree - [null, Inspect, null, Guide, null] +8019 - Banana tree stump - [null, Inspect, null, Guide, null] +8020 - Curry tree - [null, Inspect, null, Guide, null] +8021 - Curry tree - [null, Inspect, null, Guide, null] +8022 - Curry tree - [null, Inspect, null, Guide, null] +8023 - Curry tree - [null, Inspect, null, Guide, null] +8024 - Curry tree - [null, Inspect, null, Guide, null] +8025 - Curry tree - [null, Inspect, null, Guide, null] +8026 - Curry tree - [Chop-down, Inspect, null, Guide, null] +8027 - Curry tree - [Pick-leaf, Inspect, null, Guide, null] +8028 - Curry tree - [Pick-leaf, Inspect, null, Guide, null] +8029 - Curry tree - [Pick-leaf, Inspect, null, Guide, null] +8030 - Curry tree - [Pick-leaf, Inspect, null, Guide, null] +8031 - Curry tree - [Pick-leaf, Inspect, null, Guide, null] +8032 - Curry tree - [Pick-leaf, Inspect, null, Guide, null] +8033 - Curry tree - [Check-health, Inspect, null, Guide, null] +8034 - Diseased curry tree - [null, Inspect, null, Guide, null] +8035 - Diseased curry tree - [null, Inspect, null, Guide, null] +8036 - Diseased curry tree - [null, Inspect, null, Guide, null] +8037 - Diseased curry tree - [null, Inspect, null, Guide, null] +8038 - Diseased curry tree - [null, Inspect, null, Guide, null] +8039 - Diseased curry tree - [null, Inspect, null, Guide, null] +8040 - Dead curry tree - [null, Inspect, null, Guide, null] +8041 - Dead curry tree - [null, Inspect, null, Guide, null] +8042 - Dead curry tree - [null, Inspect, null, Guide, null] +8043 - Dead curry tree - [null, Inspect, null, Guide, null] +8044 - Dead curry tree - [null, Inspect, null, Guide, null] +8045 - Dead curry tree - [null, Inspect, null, Guide, null] +8046 - Curry tree stump - [null, Inspect, null, Guide, null] +8047 - Fruit Tree Patch - [null, Inspect, null, Guide, null] +8048 - Fruit Tree Patch - [null, Inspect, null, Guide, null] +8049 - Fruit Tree Patch - [null, Inspect, null, Guide, null] +8050 - Fruit Tree Patch - [null, Inspect, null, Guide, null] +8051 - Orange tree - [null, Inspect, null, Guide, null] +8052 - Orange tree - [null, Inspect, null, Guide, null] +8053 - Orange tree - [null, Inspect, null, Guide, null] +8054 - Orange tree - [null, Inspect, null, Guide, null] +8055 - Orange tree - [null, Inspect, null, Guide, null] +8056 - Orange tree - [null, Inspect, null, Guide, null] +8057 - Orange tree - [Chop-down, Inspect, null, Guide, null] +8058 - Orange tree - [Pick-orange, Inspect, null, Guide, null] +8059 - Orange tree - [Pick-orange, Inspect, null, Guide, null] +8060 - Orange tree - [Pick-orange, Inspect, null, Guide, null] +8061 - Orange tree - [Pick-orange, Inspect, null, Guide, null] +8062 - Orange tree - [Pick-orange, Inspect, null, Guide, null] +8063 - Orange tree - [Pick-orange, Inspect, null, Guide, null] +8064 - Orange tree - [Check-health, Inspect, null, Guide, null] +8065 - Diseased orange tree - [null, Inspect, null, Guide, null] +8066 - Diseased orange tree - [null, Inspect, null, Guide, null] +8067 - Diseased orange tree - [null, Inspect, null, Guide, null] +8068 - Diseased orange tree - [null, Inspect, null, Guide, null] +8069 - Diseased orange tree - [null, Inspect, null, Guide, null] +8070 - Diseased orange tree - [Chop-down, Inspect, null, Guide, null] +8071 - Dead orange tree - [null, Inspect, null, Guide, null] +8072 - Dead orange tree - [null, Inspect, null, Guide, null] +8073 - Dead orange tree - [null, Inspect, null, Guide, null] +8074 - Dead orange tree - [null, Inspect, null, Guide, null] +8075 - Dead orange tree - [null, Inspect, null, Guide, null] +8076 - Dead orange tree - [null, Inspect, null, Guide, null] +8077 - Orange tree stump - [null, Inspect, null, Guide, null] +8078 - Palm tree - [null, Inspect, null, Guide, null] +8079 - Palm tree - [null, Inspect, null, Guide, null] +8080 - Palm tree - [null, Inspect, null, Guide, null] +8081 - Palm tree - [null, Inspect, null, Guide, null] +8082 - Palm tree - [null, Inspect, null, Guide, null] +8083 - Palm tree - [null, Inspect, null, Guide, null] +8084 - Palm tree - [Chop-down, Inspect, null, Guide, null] +8085 - Palm tree - [Pick-coconut, Inspect, null, Guide, null] +8086 - Palm tree - [Pick-coconut, Inspect, null, Guide, null] +8087 - Palm tree - [Pick-coconut, Inspect, null, Guide, null] +8088 - Palm tree - [Pick-coconut, Inspect, null, Guide, null] +8089 - Palm tree - [Pick-coconut, Inspect, null, Guide, null] +8090 - Palm tree - [Pick-coconut, Inspect, null, Guide, null] +8091 - Palm tree - [Check-health, Inspect, null, Guide, null] +8092 - Diseased palm tree - [null, Inspect, null, Guide, null] +8093 - Diseased palm tree - [null, Inspect, null, Guide, null] +8094 - Diseased palm tree - [null, Inspect, null, Guide, null] +8095 - Diseased palm tree - [null, Inspect, null, Guide, null] +8096 - Diseased palm tree - [null, Inspect, null, Guide, null] +8097 - Diseased palm tree - [null, Inspect, null, Guide, null] +8098 - Dead palm tree - [null, Inspect, null, Guide, null] +8099 - Dead palm tree - [null, Inspect, null, Guide, null] +8100 - Dead palm tree - [null, Inspect, null, Guide, null] +8101 - Dead palm tree - [null, Inspect, null, Guide, null] +8102 - Dead palm tree - [null, Inspect, null, Guide, null] +8103 - Dead palm tree - [null, Inspect, null, Guide, null] +8104 - Palm tree stump - [null, Inspect, null, Guide, null] +8105 - Papaya tree - [null, Inspect, null, Guide, null] +8106 - Papaya tree - [null, Inspect, null, Guide, null] +8107 - Papaya tree - [null, Inspect, null, Guide, null] +8108 - Papaya tree - [null, Inspect, null, Guide, null] +8109 - Papaya tree - [null, Inspect, null, Guide, null] +8110 - Papaya tree - [null, Inspect, null, Guide, null] +8111 - Papaya tree - [Chop-down, Inspect, null, Guide, null] +8112 - Papaya tree - [Pick-fruit, Inspect, null, Guide, null] +8113 - Papaya tree - [Pick-fruit, Inspect, null, Guide, null] +8114 - Papaya tree - [Pick-fruit, Inspect, null, Guide, null] +8115 - Papaya tree - [Pick-fruit, Inspect, null, Guide, null] +8116 - Papaya tree - [Pick-fruit, Inspect, null, Guide, null] +8117 - Papaya tree - [Pick-fruit, Inspect, null, Guide, null] +8118 - Papaya tree - [Check-health, Inspect, null, Guide, null] +8119 - Diseased papaya tree - [null, Inspect, null, Guide, null] +8120 - Diseased papaya tree - [null, Inspect, null, Guide, null] +8121 - Diseased papaya tree - [null, Inspect, null, Guide, null] +8122 - Diseased papaya tree - [null, Inspect, null, Guide, null] +8123 - Diseased papaya tree - [null, Inspect, null, Guide, null] +8124 - Diseased papaya tree - [null, Inspect, null, Guide, null] +8125 - Dead papaya tree - [null, Inspect, null, Guide, null] +8126 - Dead papaya tree - [null, Inspect, null, Guide, null] +8127 - Dead papaya tree - [null, Inspect, null, Guide, null] +8128 - Dead papaya tree - [null, Inspect, null, Guide, null] +8129 - Dead papaya tree - [null, Inspect, null, Guide, null] +8130 - Dead papaya tree - [null, Inspect, null, Guide, null] +8131 - Papaya tree stump - [null, Inspect, null, Guide, null] +8132 - Herb patch - [null, Inspect, null, Guide, null] +8133 - Herb patch - [null, Inspect, null, Guide, null] +8134 - Herb patch - [null, Inspect, null, Guide, null] +8135 - Herb patch - [null, Inspect, null, Guide, null] +8136 - Herb patch - [null, Inspect, null, Guide, null] +8137 - Herb patch - [null, Inspect, null, Guide, null] +8138 - Herb patch - [null, Inspect, null, Guide, null] +8139 - Herbs - [null, Inspect, null, Guide, null] +8140 - Herbs - [null, Inspect, null, Guide, null] +8141 - Herbs - [null, Inspect, null, Guide, null] +8142 - Herbs - [null, Inspect, null, Guide, null] +8143 - Herbs - [Pick, Inspect, null, Guide, null] +8144 - Diseased herbs - [null, Inspect, null, Guide, null] +8145 - Diseased herbs - [null, Inspect, null, Guide, null] +8146 - Diseased herbs - [null, Inspect, null, Guide, null] +8147 - Dead herbs - [null, Inspect, null, Guide, null] +8148 - Dead herbs - [null, Inspect, null, Guide, null] +8149 - Dead herbs - [null, Inspect, null, Guide, null] +8150 - null - [null, null, null, null, null] +8151 - null - [null, null, null, null, null] +8152 - null - [null, null, null, null, null] +8153 - null - [null, null, null, null, null] +8154 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8155 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8156 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8157 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8158 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8159 - Asgarnian Hops - [Harvest, Inspect, null, Guide, null] +8160 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8161 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8162 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8163 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8164 - Asgarnian Hops - [null, Inspect, null, Guide, null] +8165 - Diseased Asgarnian Hops - [null, Inspect, null, Guide, null] +8166 - Diseased Asgarnian Hops - [null, Inspect, null, Guide, null] +8167 - Diseased Asgarnian Hops - [null, Inspect, null, Guide, null] +8168 - Diseased Asgarnian Hops - [null, Inspect, null, Guide, null] +8169 - Dead Asgarnian Hops - [null, Inspect, null, Guide, null] +8170 - Dead Asgarnian Hops - [null, Inspect, null, Guide, null] +8171 - Dead Asgarnian Hops - [null, Inspect, null, Guide, null] +8172 - Dead Asgarnian Hops - [null, Inspect, null, Guide, null] +8173 - null - [null, null, null, null, null] +8174 - null - [null, null, null, null, null] +8175 - null - [null, null, null, null, null] +8176 - null - [null, null, null, null, null] +8177 - Hammerstone Hops - [null, Inspect, null, Guide, null] +8178 - Hammerstone Hops - [null, Inspect, null, Guide, null] +8179 - Hammerstone Hops - [null, Inspect, null, Guide, null] +8180 - Hammerstone Hops - [null, Inspect, null, Guide, null] +8181 - Hammerstone Hops - [Harvest, Inspect, null, Guide, null] +8182 - Hammerstone Hops - [null, Inspect, null, Guide, null] +8183 - Hammerstone Hops - [null, Inspect, null, Guide, null] +8184 - Hammerstone Hops - [null, Inspect, null, Guide, null] +8185 - Hammerstone Hops - [null, Inspect, null, Guide, null] +8186 - Diseased Hammerstone Hops - [null, Inspect, null, Guide, null] +8187 - Diseased Hammerstone Hops - [null, Inspect, null, Guide, null] +8188 - Diseased Hammerstone Hops - [null, Inspect, null, Guide, null] +8189 - Dead Hammerstone Hops - [null, Inspect, null, Guide, null] +8190 - Dead Hammerstone Hops - [null, Inspect, null, Guide, null] +8191 - Dead Hammerstone Hops - [null, Inspect, null, Guide, null] +8192 - Barley - [null, Inspect, null, Guide, null] +8193 - Barley - [null, Inspect, null, Guide, null] +8194 - Barley - [null, Inspect, null, Guide, null] +8195 - Barley - [null, Inspect, null, Guide, null] +8196 - Barley - [Harvest, Inspect, null, Guide, null] +8197 - Barley - [null, Inspect, null, Guide, null] +8198 - Barley - [null, Inspect, null, Guide, null] +8199 - Barley - [null, Inspect, null, Guide, null] +8200 - Barley - [null, Inspect, null, Guide, null] +8201 - Diseased Barley - [null, Inspect, null, Guide, null] +8202 - Diseased Barley - [null, Inspect, null, Guide, null] +8203 - Diseased Barley - [null, Inspect, null, Guide, null] +8204 - Dead Barley - [null, Inspect, null, Guide, null] +8205 - Dead Barley - [null, Inspect, null, Guide, null] +8206 - Dead Barley - [null, Inspect, null, Guide, null] +8207 - Hops Patch - [null, Inspect, null, Guide, null] +8208 - Hops Patch - [null, Inspect, null, Guide, null] +8209 - Hops Patch - [null, Inspect, null, Guide, null] +8210 - Hops Patch - [null, Inspect, null, Guide, null] +8211 - Krandorian Hops - [null, Inspect, null, Guide, null] +8212 - Krandorian Hops - [null, Inspect, null, Guide, null] +8213 - Krandorian Hops - [null, Inspect, null, Guide, null] +8214 - Krandorian Hops - [null, Inspect, null, Guide, null] +8215 - Krandorian Hops - [null, Inspect, null, Guide, null] +8216 - Krandorian Hops - [null, Inspect, null, Guide, null] +8217 - Krandorian Hops - [null, Inspect, null, Guide, null] +8218 - Krandorian Hops - [Harvest, Inspect, null, Guide, null] +8219 - Krandorian Hops - [null, Inspect, null, Guide, null] +8220 - Krandorian Hops - [null, Inspect, null, Guide, null] +8221 - Krandorian Hops - [null, Inspect, null, Guide, null] +8222 - Krandorian Hops - [null, Inspect, null, Guide, null] +8223 - Krandorian Hops - [null, Inspect, null, Guide, null] +8224 - Krandorian Hops - [null, Inspect, null, Guide, null] +8225 - Krandorian Hops - [null, Inspect, null, Guide, null] +8226 - Diseased Krandorian Hops - [null, Inspect, null, Guide, null] +8227 - Diseased Krandorian Hops - [null, Inspect, null, Guide, null] +8228 - Diseased Krandorian Hops - [null, Inspect, null, Guide, null] +8229 - Diseased Krandorian Hops - [null, Inspect, null, Guide, null] +8230 - Diseased Krandorian Hops - [null, Inspect, null, Guide, null] +8231 - Diseased Krandorian Hops - [null, Inspect, null, Guide, null] +8232 - Dead Krandorian Hops - [null, Inspect, null, Guide, null] +8233 - Dead Krandorian Hops - [null, Inspect, null, Guide, null] +8234 - Dead Krandorian Hops - [null, Inspect, null, Guide, null] +8235 - Dead Krandorian Hops - [null, Inspect, null, Guide, null] +8236 - Dead Krandorian Hops - [null, Inspect, null, Guide, null] +8237 - Dead Krandorian Hops - [null, Inspect, null, Guide, null] +8238 - Jute - [null, Inspect, null, Guide, null] +8239 - Jute - [null, Inspect, null, Guide, null] +8240 - Jute - [null, Inspect, null, Guide, null] +8241 - Jute - [null, Inspect, null, Guide, null] +8242 - Jute - [null, Inspect, null, Guide, null] +8243 - Jute - [Harvest, Inspect, null, Guide, null] +8244 - Jute - [null, Inspect, null, Guide, null] +8245 - Jute - [null, Inspect, null, Guide, null] +8246 - Jute - [null, Inspect, null, Guide, null] +8247 - Jute - [null, Inspect, null, Guide, null] +8248 - Jute - [null, Inspect, null, Guide, null] +8249 - Diseased Jute - [null, Inspect, null, Guide, null] +8250 - Diseased Jute - [null, Inspect, null, Guide, null] +8251 - Diseased Jute - [null, Inspect, null, Guide, null] +8252 - Diseased Jute - [null, Inspect, null, Guide, null] +8253 - Dead Jute - [null, Inspect, null, Guide, null] +8254 - Dead Jute - [null, Inspect, null, Guide, null] +8255 - Dead Jute - [null, Inspect, null, Guide, null] +8256 - Dead Jute - [null, Inspect, null, Guide, null] +8257 - Wildblood Hops - [null, Inspect, null, Guide, null] +8258 - Wildblood Hops - [null, Inspect, null, Guide, null] +8259 - Wildblood Hops - [null, Inspect, null, Guide, null] +8260 - Wildblood Hops - [null, Inspect, null, Guide, null] +8261 - Wildblood Hops - [null, Inspect, null, Guide, null] +8262 - Wildblood Hops - [null, Inspect, null, Guide, null] +8263 - Wildblood Hops - [null, Inspect, null, Guide, null] +8264 - Wildblood Hops - [null, Inspect, null, Guide, null] +8265 - Wildblood Hops - [Harvest, Inspect, null, Guide, null] +8266 - Wildblood Hops - [null, Inspect, null, Guide, null] +8267 - Wildblood Hops - [null, Inspect, null, Guide, null] +8268 - Wildblood Hops - [null, Inspect, null, Guide, null] +8269 - Wildblood Hops - [null, Inspect, null, Guide, null] +8270 - Wildblood Hops - [null, Inspect, null, Guide, null] +8271 - Wildblood Hops - [null, Inspect, null, Guide, null] +8272 - Wildblood Hops - [null, Inspect, null, Guide, null] +8273 - Wildblood Hops - [null, Inspect, null, Guide, null] +8274 - Diseased Wildblood Hops - [null, Inspect, null, Guide, null] +8275 - Diseased Wildblood Hops - [null, Inspect, null, Guide, null] +8276 - Diseased Wildblood Hops - [null, Inspect, null, Guide, null] +8277 - Diseased Wildblood Hops - [null, Inspect, null, Guide, null] +8278 - Diseased Wildblood Hops - [null, Inspect, null, Guide, null] +8279 - Diseased Wildblood Hops - [null, Inspect, null, Guide, null] +8280 - Diseased Wildblood Hops - [null, Inspect, null, Guide, null] +8281 - Dead Wildblood Hops - [null, Inspect, null, Guide, null] +8282 - Dead Wildblood Hops - [null, Inspect, null, Guide, null] +8283 - Dead Wildblood Hops - [null, Inspect, null, Guide, null] +8284 - Dead Wildblood Hops - [null, Inspect, null, Guide, null] +8285 - Dead Wildblood Hops - [null, Inspect, null, Guide, null] +8286 - Dead Wildblood Hops - [null, Inspect, null, Guide, null] +8287 - Dead Wildblood Hops - [null, Inspect, null, Guide, null] +8288 - Yanillian Hops - [null, Inspect, null, Guide, null] +8289 - Yanillian Hops - [null, Inspect, null, Guide, null] +8290 - Yanillian Hops - [null, Inspect, null, Guide, null] +8291 - Yanillian Hops - [null, Inspect, null, Guide, null] +8292 - Yanillian Hops - [null, Inspect, null, Guide, null] +8293 - Yanillian Hops - [null, Inspect, null, Guide, null] +8294 - Yanillian Hops - [Harvest, Inspect, null, Guide, null] +8295 - Yanillian Hops - [null, Inspect, null, Guide, null] +8296 - Yanillian Hops - [null, Inspect, null, Guide, null] +8297 - Yanillian Hops - [null, Inspect, null, Guide, null] +8298 - Yanillian Hops - [null, Inspect, null, Guide, null] +8299 - Yanillian Hops - [null, Inspect, null, Guide, null] +8300 - Yanillian Hops - [null, Inspect, null, Guide, null] +8301 - Diseased Yanillian Hops - [null, Inspect, null, Guide, null] +8302 - Diseased Yanillian Hops - [null, Inspect, null, Guide, null] +8303 - Diseased Yanillian Hops - [null, Inspect, null, Guide, null] +8304 - Diseased Yanillian Hops - [null, Inspect, null, Guide, null] +8305 - Diseased Yanillian Hops - [null, Inspect, null, Guide, null] +8306 - Dead Yanillian Hops - [null, Inspect, null, Guide, null] +8307 - Dead Yanillian Hops - [null, Inspect, null, Guide, null] +8308 - Dead Yanillian Hops - [null, Inspect, null, Guide, null] +8309 - Dead Yanillian Hops - [null, Inspect, null, Guide, null] +8310 - Dead Yanillian Hops - [null, Inspect, null, Guide, null] +8311 - Mushroom patch - [null, Inspect, null, Guide, null] +8312 - Mushroom patch - [null, Inspect, null, Guide, null] +8313 - Mushroom patch - [null, Inspect, null, Guide, null] +8314 - Mushroom patch - [null, Inspect, null, Guide, null] +8315 - Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8316 - Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8317 - Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8318 - Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8319 - Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8320 - Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8321 - Bittercap Mushrooms - [Pick, Inspect, null, Guide, null] +8322 - Bittercap Mushrooms - [Pick, Inspect, null, Guide, null] +8323 - Bittercap Mushrooms - [Pick, Inspect, null, Guide, null] +8324 - Bittercap Mushrooms - [Pick, Inspect, null, Guide, null] +8325 - Bittercap Mushrooms - [Pick, Inspect, null, Guide, null] +8326 - Bittercap Mushrooms - [Pick, Inspect, null, Guide, null] +8327 - Diseased Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8328 - Diseased Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8329 - Diseased Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8330 - Diseased Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8331 - Diseased Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8332 - Dead Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8333 - Dead Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8334 - Dead Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8335 - Dead Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8336 - Dead Bittercap Mushrooms - [null, Inspect, null, Guide, null] +8337 - null - [null, null, null, null, null] +8338 - null - [null, null, null, null, null] +8339 - Spirit Tree Patch - [null, Inspect, null, Guide, null] +8340 - Spirit Tree Patch - [null, Inspect, null, Guide, null] +8341 - Spirit Tree Patch - [null, Inspect, null, Guide, null] +8342 - Spirit Tree Patch - [null, Inspect, null, Guide, null] +8343 - Spirit Tree - [null, Inspect, null, Guide, null] +8344 - Spirit Tree - [null, Inspect, null, Guide, null] +8345 - Spirit Tree - [null, Inspect, null, Guide, null] +8346 - Spirit Tree - [null, Inspect, null, Guide, null] +8347 - Spirit Tree - [null, Inspect, null, Guide, null] +8348 - Spirit Tree - [null, Inspect, null, Guide, null] +8349 - Spirit Tree - [null, Inspect, null, Guide, null] +8350 - Spirit Tree - [null, Inspect, null, Guide, null] +8351 - Spirit Tree - [null, Inspect, null, Guide, null] +8352 - Spirit Tree - [null, Inspect, null, Guide, null] +8353 - Spirit Tree - [null, Inspect, null, Guide, null] +8354 - Spirit Tree - [null, Inspect, null, Guide, null] +8355 - Spirit Tree - [Talk-to, Inspect, null, Guide, null] +8356 - Spirit Tree - [Check-health, Inspect, null, Guide, null] +8357 - Spirit Tree Stump - [null, Inspect, null, Guide, null] +8358 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8359 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8360 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8361 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8362 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8363 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8364 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8365 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8366 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8367 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8368 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8369 - Diseased Spirit Tree - [null, Inspect, null, Guide, null] +8370 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8371 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8372 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8373 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8374 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8375 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8376 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8377 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8378 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8379 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8380 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8381 - Dead Spirit Tree - [null, Inspect, null, Guide, null] +8382 - null - [null, null, null, null, null] +8383 - null - [null, null, null, null, null] +8384 - null - [null, null, null, null, null] +8385 - null - [null, null, null, null, null] +8386 - null - [null, null, null, null, null] +8387 - null - [null, null, null, null, null] +8388 - null - [null, null, null, null, null] +8389 - null - [null, null, null, null, null] +8390 - null - [null, null, null, null, null] +8391 - null - [null, null, null, null, null] +8392 - Tree patch - [null, Inspect, null, Guide, null] +8393 - Tree patch - [null, Inspect, null, Guide, null] +8394 - Tree patch - [null, Inspect, null, Guide, null] +8395 - Tree patch - [null, Inspect, null, Guide, null] +8396 - Magic Tree - [null, Inspect, null, Guide, null] +8397 - Magic Tree - [null, Inspect, null, Guide, null] +8398 - Magic Tree - [null, Inspect, null, Guide, null] +8399 - Magic Tree - [null, Inspect, null, Guide, null] +8400 - Magic Tree - [null, Inspect, null, Guide, null] +8401 - Magic Tree - [null, Inspect, null, Guide, null] +8402 - Magic Tree - [null, Inspect, null, Guide, null] +8403 - Magic Tree - [null, Inspect, null, Guide, null] +8404 - Magic Tree - [null, Inspect, null, Guide, null] +8405 - Magic Tree - [null, Inspect, null, Guide, null] +8406 - Magic Tree - [null, Inspect, null, Guide, null] +8407 - Magic Tree - [null, Inspect, null, Guide, null] +8408 - Magic Tree - [Check-health, Inspect, null, Guide, null] +8409 - Magic Tree - [Chop down, Inspect, hidden, Guide, null] +8410 - Magic Tree Stump - [null, Inspect, null, Guide, null] +8411 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8412 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8413 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8414 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8415 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8416 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8417 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8418 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8419 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8420 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8421 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8422 - Diseased Magic Tree - [null, Inspect, null, Guide, null] +8423 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8424 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8425 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8426 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8427 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8428 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8429 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8430 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8431 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8432 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8433 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8434 - Dead Magic Tree - [null, Inspect, null, Guide, null] +8435 - Maple Tree - [null, Inspect, null, Guide, null] +8436 - Maple Tree - [null, Inspect, null, Guide, null] +8437 - Maple Tree - [null, Inspect, null, Guide, null] +8438 - Maple Tree - [null, Inspect, null, Guide, null] +8439 - Maple Tree - [null, Inspect, null, Guide, null] +8440 - Maple Tree - [null, Inspect, null, Guide, null] +8441 - Maple Tree - [null, Inspect, null, Guide, null] +8442 - Maple Tree - [null, Inspect, null, Guide, null] +8443 - Maple Tree - [Check-health, Inspect, null, Guide, null] +8444 - Maple Tree - [Chop down, Inspect, hidden, Guide, null] +8445 - Maple tree stump - [null, Inspect, null, Guide, null] +8446 - Diseased Maple - [null, Inspect, null, Guide, null] +8447 - Diseased Maple - [null, Inspect, null, Guide, null] +8448 - Diseased Maple - [null, Inspect, null, Guide, null] +8449 - Diseased Maple - [null, Inspect, null, Guide, null] +8450 - Diseased Maple - [null, Inspect, null, Guide, null] +8451 - Diseased Maple - [null, Inspect, null, Guide, null] +8452 - Diseased Maple - [null, Inspect, null, Guide, null] +8453 - Diseased Maple - [null, Inspect, null, Guide, null] +8454 - Dead Maple - [null, Inspect, null, Guide, null] +8455 - Dead Maple - [null, Inspect, null, Guide, null] +8456 - Dead Maple - [null, Inspect, null, Guide, null] +8457 - Dead Maple - [null, Inspect, null, Guide, null] +8458 - Dead Maple - [null, Inspect, null, Guide, null] +8459 - Dead Maple - [null, Inspect, null, Guide, null] +8460 - Dead Maple - [null, Inspect, null, Guide, null] +8461 - Dead Maple - [null, Inspect, null, Guide, null] +8462 - Oak - [null, Inspect, null, Guide, null] +8463 - Oak - [null, Inspect, null, Guide, null] +8464 - Oak - [null, Inspect, null, Guide, null] +8465 - Oak - [null, Inspect, null, Guide, null] +8466 - Oak - [Check-health, Inspect, null, Guide, null] +8467 - Oak - [Chop down, Inspect, hidden, Guide, null] +8468 - Oak tree stump - [null, Inspect, null, Guide, null] +8469 - null - [null, null, null, null, null] +8470 - null - [null, null, null, null, null] +8471 - null - [null, null, null, null, null] +8472 - null - [null, null, null, null, null] +8473 - Diseased Oak - [null, Inspect, null, Guide, null] +8474 - Diseased Oak - [null, Inspect, null, Guide, null] +8475 - Diseased Oak - [null, Inspect, null, Guide, null] +8476 - Diseased Oak - [null, Inspect, null, Guide, null] +8477 - Dead Oak - [null, Inspect, null, Guide, null] +8478 - Dead Oak - [null, Inspect, null, Guide, null] +8479 - Dead Oak - [null, Inspect, null, Guide, null] +8480 - Dead Oak - [null, Inspect, null, Guide, null] +8481 - Willow Tree - [null, Inspect, null, Guide, null] +8482 - Willow Tree - [null, Inspect, null, Guide, null] +8483 - Willow Tree - [null, Inspect, null, Guide, null] +8484 - Willow Tree - [null, Inspect, null, Guide, null] +8485 - Willow Tree - [null, Inspect, null, Guide, null] +8486 - Willow Tree - [null, Inspect, null, Guide, null] +8487 - Willow Tree - [Check-health, Inspect, null, Guide, null] +8488 - Willow Tree - [Chop down, Inspect, hidden, Guide, null] +8489 - Willow tree stump - [null, Inspect, null, Guide, null] +8490 - Diseased Willow - [null, Inspect, null, Guide, null] +8491 - Diseased Willow - [null, Inspect, null, Guide, null] +8492 - Diseased Willow - [null, Inspect, null, Guide, null] +8493 - Diseased Willow - [null, Inspect, null, Guide, null] +8494 - Diseased Willow - [null, Inspect, null, Guide, null] +8495 - Diseased Willow - [null, Inspect, null, Guide, null] +8496 - Dead Willow - [null, Inspect, null, Guide, null] +8497 - Dead Willow - [null, Inspect, null, Guide, null] +8498 - Dead Willow - [null, Inspect, null, Guide, null] +8499 - Dead Willow - [null, Inspect, null, Guide, null] +8500 - Dead Willow - [null, Inspect, null, Guide, null] +8501 - Dead Willow - [null, Inspect, null, Guide, null] +8502 - Yew sapling - [null, Inspect, null, Guide, null] +8503 - Yew tree - [null, Inspect, null, Guide, null] +8504 - Yew tree - [null, Inspect, null, Guide, null] +8505 - Yew tree - [null, Inspect, null, Guide, null] +8506 - Yew tree - [null, Inspect, null, Guide, null] +8507 - Yew tree - [null, Inspect, null, Guide, null] +8508 - Yew tree - [null, Inspect, null, Guide, null] +8509 - Yew tree - [null, Inspect, null, Guide, null] +8510 - Yew tree - [null, Inspect, null, Guide, null] +8511 - Yew tree - [null, Inspect, null, Guide, null] +8512 - Yew tree - [Check-health, Inspect, null, Guide, null] +8513 - Yew tree - [Chop down, Inspect, hidden, Guide, null] +8514 - Yew tree stump - [null, Inspect, null, Guide, null] +8515 - Diseased Yew - [null, Inspect, null, Guide, null] +8516 - Diseased Yew - [null, Inspect, null, Guide, null] +8517 - Diseased Yew - [null, Inspect, null, Guide, null] +8518 - Diseased Yew - [null, Inspect, null, Guide, null] +8519 - Diseased Yew - [null, Inspect, null, Guide, null] +8520 - Diseased Yew - [null, Inspect, null, Guide, null] +8521 - Diseased Yew - [null, Inspect, null, Guide, null] +8522 - Diseased Yew - [null, Inspect, null, Guide, null] +8523 - Diseased Yew - [null, Inspect, null, Guide, null] +8524 - Diseased Yew - [null, Inspect, null, Guide, null] +8525 - Dead Yew - [null, Inspect, null, Guide, null] +8526 - Dead Yew - [null, Inspect, null, Guide, null] +8527 - Dead Yew - [null, Inspect, null, Guide, null] +8528 - Dead Yew - [null, Inspect, null, Guide, null] +8529 - Dead Yew - [null, Inspect, null, Guide, null] +8530 - Dead Yew - [null, Inspect, null, Guide, null] +8531 - Dead Yew - [null, Inspect, null, Guide, null] +8532 - Dead Yew - [null, Inspect, null, Guide, null] +8533 - Dead Yew - [null, Inspect, null, Guide, null] +8534 - Dead Yew - [null, Inspect, null, Guide, null] +8535 - Cabbages - [null, Inspect, null, Guide, null] +8536 - Cabbages - [null, Inspect, null, Guide, null] +8537 - Cabbages - [null, Inspect, null, Guide, null] +8538 - Cabbages - [null, Inspect, null, Guide, null] +8539 - Cabbages - [Harvest, Inspect, null, Guide, null] +8540 - Cabbages - [null, Inspect, null, Guide, null] +8541 - Cabbages - [null, Inspect, null, Guide, null] +8542 - Cabbages - [null, Inspect, null, Guide, null] +8543 - Cabbages - [null, Inspect, null, Guide, null] +8544 - Diseased cabbages - [null, Inspect, null, Guide, null] +8545 - Diseased cabbages - [null, Inspect, null, Guide, null] +8546 - Diseased cabbages - [null, Inspect, null, Guide, null] +8547 - Dead cabbages - [null, Inspect, null, Guide, null] +8548 - Dead cabbages - [null, Inspect, null, Guide, null] +8549 - Dead cabbages - [null, Inspect, null, Guide, null] +8550 - null - [null, null, null, null, null] +8551 - null - [null, null, null, null, null] +8552 - null - [null, null, null, null, null] +8553 - null - [null, null, null, null, null] +8554 - null - [null, null, null, null, null] +8555 - null - [null, null, null, null, null] +8556 - null - [null, null, null, null, null] +8557 - null - [null, null, null, null, null] +8558 - Potato seed - [null, Inspect, null, Guide, null] +8559 - Potato plant - [null, Inspect, null, Guide, null] +8560 - Potato plant - [null, Inspect, null, Guide, null] +8561 - Potato plant - [null, Inspect, null, Guide, null] +8562 - Potato - [Harvest, Inspect, null, Guide, null] +8563 - Potato seed - [null, Inspect, null, Guide, null] +8564 - Potato plant - [null, Inspect, null, Guide, null] +8565 - Potato plant - [null, Inspect, null, Guide, null] +8566 - Potato plant - [null, Inspect, null, Guide, null] +8567 - Diseased potatoes - [null, Inspect, null, Guide, null] +8568 - Diseased potatoes - [null, Inspect, null, Guide, null] +8569 - Diseased potatoes - [null, Inspect, null, Guide, null] +8570 - Dead potatoes - [null, Inspect, null, Guide, null] +8571 - Dead potatoes - [null, Inspect, null, Guide, null] +8572 - Dead potatoes - [null, Inspect, null, Guide, null] +8573 - Allotment - [null, Inspect, null, Guide, null] +8574 - Allotment - [null, Inspect, null, Guide, null] +8575 - Allotment - [null, Inspect, null, Guide, null] +8576 - Allotment - [null, Inspect, null, Guide, null] +8577 - Allotment - [null, Inspect, null, Guide, null] +8578 - Allotment - [null, Inspect, null, Guide, null] +8579 - Allotment - [null, Inspect, null, Guide, null] +8580 - Onion seeds - [null, Inspect, null, Guide, null] +8581 - Onion plant - [null, Inspect, null, Guide, null] +8582 - Onion plant - [null, Inspect, null, Guide, null] +8583 - Onion plant - [null, Inspect, null, Guide, null] +8584 - Onion - [Harvest, Inspect, null, Guide, null] +8585 - Onion seeds - [null, Inspect, null, Guide, null] +8586 - Onion plant - [null, Inspect, null, Guide, null] +8587 - Onion plant - [null, Inspect, null, Guide, null] +8588 - Onion plant - [null, Inspect, null, Guide, null] +8589 - Diseased onions - [null, Inspect, null, Guide, null] +8590 - Diseased onions - [null, Inspect, null, Guide, null] +8591 - Diseased onions - [null, Inspect, null, Guide, null] +8592 - Dead onions - [null, Inspect, null, Guide, null] +8593 - Dead onions - [null, Inspect, null, Guide, null] +8594 - Dead onions - [null, Inspect, null, Guide, null] +8595 - Strawberry seed - [null, Inspect, null, Guide, null] +8596 - Strawberry plant - [null, Inspect, null, Guide, null] +8597 - Strawberry plant - [null, Inspect, null, Guide, null] +8598 - Strawberry plant - [null, Inspect, null, Guide, null] +8599 - Strawberry plant - [null, Inspect, null, Guide, null] +8600 - Strawberry plant - [null, Inspect, null, Guide, null] +8601 - Strawberry - [Harvest, Inspect, null, Guide, null] +8602 - Strawberry seed - [null, Inspect, null, Guide, null] +8603 - Strawberry plant - [null, Inspect, null, Guide, null] +8604 - Strawberry plant - [null, Inspect, null, Guide, null] +8605 - Strawberry plant - [null, Inspect, null, Guide, null] +8606 - Strawberry plant - [null, Inspect, null, Guide, null] +8607 - Strawberry plant - [null, Inspect, null, Guide, null] +8608 - Diseased strawberry plant - [null, Inspect, null, Guide, null] +8609 - Diseased strawberry plant - [null, Inspect, null, Guide, null] +8610 - Diseased strawberry plant - [null, Inspect, null, Guide, null] +8611 - Diseased strawberry plant - [null, Inspect, null, Guide, null] +8612 - Diseased strawberry plant - [null, Inspect, null, Guide, null] +8613 - Dead strawberry plant - [null, Inspect, null, Guide, null] +8614 - Dead strawberry plant - [null, Inspect, null, Guide, null] +8615 - Dead strawberry plant - [null, Inspect, null, Guide, null] +8616 - Dead strawberry plant - [null, Inspect, null, Guide, null] +8617 - Dead strawberry plant - [null, Inspect, null, Guide, null] +8618 - Sweetcorn seed - [null, Inspect, null, Guide, null] +8619 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8620 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8621 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8622 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8623 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8624 - Sweetcorn - [Harvest, Inspect, null, Guide, null] +8625 - Sweetcorn seed - [null, Inspect, null, Guide, null] +8626 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8627 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8628 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8629 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8630 - Sweetcorn plant - [null, Inspect, null, Guide, null] +8631 - Diseased sweetcorn plant - [null, Inspect, null, Guide, null] +8632 - Diseased sweetcorn plant - [null, Inspect, null, Guide, null] +8633 - Diseased sweetcorn plant - [null, Inspect, null, Guide, null] +8634 - Diseased sweetcorn plant - [null, Inspect, null, Guide, null] +8635 - Diseased sweetcorn plant - [null, Inspect, null, Guide, null] +8636 - Dead sweetcorn plant - [null, Inspect, null, Guide, null] +8637 - Dead sweetcorn plant - [null, Inspect, null, Guide, null] +8638 - Dead sweetcorn plant - [null, Inspect, null, Guide, null] +8639 - Dead sweetcorn plant - [null, Inspect, null, Guide, null] +8640 - Dead sweetcorn plant - [null, Inspect, null, Guide, null] +8641 - Tomato plant - [null, Inspect, null, Guide, null] +8642 - Tomato plant - [null, Inspect, null, Guide, null] +8643 - Tomato plant - [null, Inspect, null, Guide, null] +8644 - Tomato plant - [null, Inspect, null, Guide, null] +8645 - Tomato - [Harvest, Inspect, null, Guide, null] +8646 - Tomato plant - [null, Inspect, null, Guide, null] +8647 - Tomato plant - [null, Inspect, null, Guide, null] +8648 - Tomato plant - [null, Inspect, null, Guide, null] +8649 - Tomato plant - [null, Inspect, null, Guide, null] +8650 - Diseased tomato plant - [null, Inspect, null, Guide, null] +8651 - Diseased tomato plant - [null, Inspect, null, Guide, null] +8652 - Diseased tomato plant - [null, Inspect, null, Guide, null] +8653 - Dead tomato plant - [null, Inspect, null, Guide, null] +8654 - Dead tomato plant - [null, Inspect, null, Guide, null] +8655 - Dead tomato plant - [null, Inspect, null, Guide, null] +8656 - Watermelon seed - [null, Inspect, null, Guide, null] +8657 - Watermelons - [null, Inspect, null, Guide, null] +8658 - Watermelons - [null, Inspect, null, Guide, null] +8659 - Watermelons - [null, Inspect, null, Guide, null] +8660 - Watermelons - [null, Inspect, null, Guide, null] +8661 - Watermelons - [null, Inspect, null, Guide, null] +8662 - Watermelons - [null, Inspect, null, Guide, null] +8663 - Watermelons - [null, Inspect, null, Guide, null] +8664 - Watermelon - [Harvest, Inspect, null, Guide, null] +8665 - Watermelon seed - [null, Inspect, null, Guide, null] +8666 - Watermelons - [null, Inspect, null, Guide, null] +8667 - Watermelons - [null, Inspect, null, Guide, null] +8668 - Watermelons - [null, Inspect, null, Guide, null] +8669 - Watermelons - [null, Inspect, null, Guide, null] +8670 - Watermelons - [null, Inspect, null, Guide, null] +8671 - Watermelons - [null, Inspect, null, Guide, null] +8672 - Watermelons - [null, Inspect, null, Guide, null] +8673 - Diseased watermelons - [null, Inspect, null, Guide, null] +8674 - Diseased watermelons - [null, Inspect, null, Guide, null] +8675 - Diseased watermelons - [null, Inspect, null, Guide, null] +8676 - Diseased watermelons - [null, Inspect, null, Guide, null] +8677 - Diseased watermelons - [null, Inspect, null, Guide, null] +8678 - Diseased watermelons - [null, Inspect, null, Guide, null] +8679 - Diseased watermelons - [null, Inspect, null, Guide, null] +8680 - Dead watermelons - [null, Inspect, null, Guide, null] +8681 - Dead watermelons - [null, Inspect, null, Guide, null] +8682 - Dead watermelons - [null, Inspect, null, Guide, null] +8683 - Dead watermelons - [null, Inspect, null, Guide, null] +8684 - Dead watermelons - [null, Inspect, null, Guide, null] +8685 - Dead watermelons - [null, Inspect, null, Guide, null] +8686 - Dead watermelons - [null, Inspect, null, Guide, null] +8687 - null - [null, null, null, null, null] +8688 - Dresser - [null, null, null, null, null] +8689 - Dairy cow - [Milk, Steal-cowbell, null, null, null] +8690 - Milk Urns - [null, null, null, null, null] +8691 - Milk Urns - [null, null, null, null, null] +8692 - null - [null, null, null, null, null] +8693 - null - [null, null, null, null, null] +8694 - null - [null, null, null, null, null] +8695 - Door - [Open, null, null, null, null] +8696 - Door - [Close, null, null, null, null] +8697 - null - [null, null, null, null, null] +8698 - null - [null, null, null, null, null] +8699 - Sink - [null, null, null, null, null] +8700 - Table - [null, null, null, null, null] +8701 - Table - [null, null, null, null, null] +8702 - Water barrel - [null, null, null, null, null] +8703 - Water barrel - [null, null, null, null, null] +8704 - null - [null, null, null, null, null] +8705 - null - [null, null, null, null, null] +8706 - null - [null, null, null, null, null] +8707 - null - [null, null, null, null, null] +8708 - null - [null, null, null, null, null] +8709 - null - [null, null, null, null, null] +8710 - null - [null, null, null, null, null] +8711 - null - [null, null, null, null, null] +8712 - Fireplace - [null, null, null, null, null] +8713 - Hay bale - [null, null, null, null, null] +8714 - Haystack - [null, null, null, null, null] +8715 - Hay bale - [null, null, null, null, null] +8716 - Haystack - [null, null, null, null, null] +8717 - Loom - [null, Weave, null, null, null] +8718 - null - [null, null, null, null, null] +8719 - null - [null, null, null, null, null] +8720 - null - [null, null, null, null, null] +8721 - null - [null, null, null, null, null] +8722 - null - [null, null, null, null, null] +8723 - null - [null, null, null, null, null] +8724 - null - [null, null, null, null, null] +8725 - Rock - [null, null, null, null, null] +8726 - Rock - [null, null, null, null, null] +8727 - Rocks - [null, null, null, null, null] +8728 - Rockslide - [null, null, null, null, null] +8729 - Rockslide - [null, null, null, null, null] +8730 - Rockslide - [null, null, null, null, null] +8731 - Rockslide - [null, null, null, null, null] +8732 - null - [null, null, null, null, null] +8733 - null - [null, null, null, null, null] +8734 - null - [null, null, null, null, null] +8735 - null - [null, null, null, null, null] +8736 - null - [null, null, null, null, null] +8737 - Barrel Tap - [null, null, null, null, null] +8738 - Ardougne Wall Door - [Open, null, null, null, null] +8739 - Ardougne Wall Door - [Open, null, null, null, null] +8740 - Ardougne Wall Door - [Open, null, null, null, null] +8741 - Ardougne Wall Door - [Open, null, null, null, null] +8742 - Tree - [Pass, null, null, null, null] +8743 - Tree - [null, null, null, null, null] +8744 - ladder - [Climb-up, null, null, null, null] +8745 - ladder - [Climb, Climb-up, Climb-down, null, null] +8746 - ladder - [Climb-down, null, null, null, null] +8747 - Well - [null, null, null, null, null] +8748 - Spinning wheel - [null, Spin, null, null, null] +8749 - Altar - [Pray-at, null, null, null, null] +8750 - Cooking range - [null, null, null, null, null] +8751 - Table - [null, null, null, null, null] +8752 - Bookcase - [Search, null, null, null, null] +8753 - Bookcase - [Search, null, null, null, null] +8754 - Bookcase - [Search, null, null, null, null] +8755 - null - [null, null, null, null, null] +8756 - null - [null, null, null, null, null] +8757 - null - [null, null, null, null, null] +8758 - null - [null, null, null, null, null] +8759 - null - [null, null, null, null, null] +8760 - null - [null, null, null, null, null] +8761 - null - [null, null, null, null, null] +8762 - null - [null, null, null, null, null] +8763 - null - [null, null, null, null, null] +8764 - null - [null, null, null, null, null] +8765 - null - [null, null, null, null, null] +8766 - null - [null, null, null, null, null] +8767 - Elven lamp - [null, null, null, null, null] +8768 - Table - [null, null, null, null, null] +8769 - Table - [null, null, null, null, null] +8770 - Chair - [null, null, null, null, null] +8771 - Painting - [null, null, null, null, null] +8772 - Bench - [null, null, null, null, null] +8773 - Bow and Arrow - [null, null, null, null, null] +8774 - null - [null, null, null, null, null] +8775 - Arrows - [null, null, null, null, null] +8776 - Clothing shelves - [null, null, null, null, null] +8777 - null - [null, null, null, null, null] +8778 - Clothes model - [null, null, null, null, null] +8779 - Clothes model - [null, null, null, null, null] +8780 - null - [null, null, null, null, null] +8781 - null - [null, null, null, null, null] +8782 - null - [null, null, null, null, null] +8783 - Trapdoor - [Open, null, null, null, null] +8784 - null - [null, null, null, null, null] +8785 - Ladder - [Climb-up, null, null, null, null] +8786 - Door - [Open, null, null, null, null] +8787 - Door - [Open, null, null, null, null] +8788 - Door - [Open, null, null, null, null] +8789 - Door - [Open, null, null, null, null] +8790 - Door - [null, null, null, null, null] +8791 - Door - [Close, null, null, null, null] +8792 - Door - [null, null, null, null, null] +8793 - Door - [null, null, null, null, null] +8794 - null - [null, null, null, null, null] +8795 - Gnome on a rack - [Talk-to, Release, null, null, null] +8796 - An empty rack - [null, null, null, null, null] +8797 - Closed chest - [Open, null, null, null, null] +8798 - Open chest - [Search, Shut, null, null, null] +8799 - Desk - [Search, null, null, null, null] +8800 - Closed chest - [Open, null, null, null, null] +8801 - Grain sacks - [null, null, null, null, null] +8802 - Grain sacks - [null, null, null, null, null] +8803 - Grain sacks - [null, null, null, null, null] +8804 - Grain sacks - [null, null, null, null, null] +8805 - Grain sacks - [null, null, null, null, null] +8806 - Grain sacks - [null, null, null, null, null] +8807 - Apple Barrel - [null, null, null, null, null] +8808 - Apple Barrel - [null, null, null, null, null] +8809 - Rotten Apple Pile - [Take-from, null, null, null, null] +8810 - Gate - [Open, null, null, null, null] +8811 - Gate - [Open, null, null, null, null] +8812 - Gate - [Close, null, null, null, null] +8813 - Gate - [Close, null, null, null, null] +8814 - Bed - [null, null, null, null, null] +8815 - Bed - [null, null, null, null, null] +8816 - Bed - [null, null, null, null, null] +8817 - Bed - [null, null, null, null, null] +8818 - Door - [Open, null, null, null, null] +8819 - Door - [Close, null, null, null, null] +8820 - Door - [Open, null, null, null, null] +8821 - Door - [Close, null, null, null, null] +8822 - null - [null, null, null, null, null] +8823 - null - [null, null, null, null, null] +8824 - null - [null, null, null, null, null] +8825 - null - [null, null, null, null, null] +8826 - null - [null, null, null, null, null] +8827 - null - [null, null, null, null, null] +8828 - Rocks - [null, null, null, null, null] +8829 - Rocks - [null, null, null, null, null] +8830 - Rocks - [null, null, null, null, null] +8831 - Mine cart - [null, null, null, null, null] +8832 - null - [null, null, null, null, null] +8833 - null - [null, null, null, null, null] +8834 - null - [null, null, null, null, null] +8835 - null - [null, null, null, null, null] +8836 - null - [null, null, null, null, null] +8837 - null - [null, null, null, null, null] +8838 - null - [null, null, null, null, null] +8839 - null - [null, null, null, null, null] +8840 - Stocks - [null, null, null, null, null] +8841 - null - [null, null, null, null, null] +8842 - Apple Tree - [null, null, null, null, null] +8843 - Apple Tree - [null, null, null, null, null] +8844 - null - [Enter, null, null, null, null] +8845 - null - [Enter, null, null, null, null] +8846 - null - [null, null, null, null, null] +8847 - null - [null, null, null, null, null] +8848 - null - [null, null, null, null, null] +8849 - null - [null, null, null, null, null] +8850 - null - [null, null, null, null, null] +8851 - null - [null, null, null, null, null] +8852 - null - [null, null, null, null, null] +8853 - null - [null, null, null, null, null] +8854 - null - [null, null, null, null, null] +8855 - null - [null, null, null, null, null] +8856 - null - [null, null, null, null, null] +8857 - null - [null, null, null, null, null] +8858 - null - [null, null, null, null, null] +8859 - null - [null, null, null, null, null] +8860 - null - [null, null, null, null, null] +8861 - Kelda Hops Patch - [null, null, null, null, null] +8862 - Kelda Hops Patch - [null, null, null, null, null] +8863 - Kelda Hops Patch - [null, null, null, null, null] +8864 - Kelda Hops Patch - [null, null, null, null, null] +8865 - Kelda Hops - [null, Inspect, null, null, null] +8866 - Kelda Hops - [null, Inspect, null, null, null] +8867 - Kelda Hops - [null, Inspect, null, null, null] +8868 - Kelda Hops - [null, Inspect, null, null, null] +8869 - Kelda Hops - [Harvest, Inspect, null, null, null] +8870 - Kelda Stout - [Level, null, null, null, null] +8871 - Fermenting Vat - [null, null, null, null, null] +8872 - Fermenting Vat - [null, null, null, null, null] +8873 - Fermenting Vat - [null, null, null, null, null] +8874 - Fermenting Vat - [null, null, null, null, null] +8875 - null - [null, null, null, null, null] +8876 - null - [null, null, null, null, null] +8877 - null - [null, null, null, null, null] +8878 - Dwarven machinery - [Control, null, null, null, null] +8879 - Box - [Search, null, null, null, null] +8880 - Box - [null, null, null, null, null] +8881 - Cave entrance - [Go-through, null, null, null, null] +8882 - Cave entrance - [null, null, null, null, null] +8883 - Cave entrance - [Enter, null, null, null, null] +8884 - Cave entrance - [Enter, null, null, null, null] +8885 - null - [null, null, null, null, null] +8886 - Buffers - [null, null, null, null, null] +8887 - Track - [null, null, null, null, null] +8888 - Track - [null, null, null, null, null] +8889 - Track - [null, null, null, null, null] +8890 - Track - [null, null, null, null, null] +8891 - Track - [null, null, null, null, null] +8892 - Track - [null, null, null, null, null] +8893 - Track - [null, null, null, null, null] +8894 - Track - [null, null, null, null, null] +8895 - Track - [null, null, null, null, null] +8896 - Track - [null, null, null, null, null] +8897 - Track - [null, null, null, null, null] +8898 - Track - [null, null, null, null, null] +8899 - Track support - [null, null, null, null, null] +8900 - Track support - [null, null, null, null, null] +8901 - Track support - [null, null, null, null, null] +8902 - Track support - [null, null, null, null, null] +8903 - Track support - [null, null, null, null, null] +8904 - Track support - [null, null, null, null, null] +8905 - null - [null, null, null, null, null] +8906 - null - [null, null, null, null, null] +8907 - null - [null, null, null, null, null] +8908 - null - [null, null, null, null, null] +8909 - null - [null, null, null, null, null] +8910 - Bookcase - [Search, null, null, null, null] +8911 - Crate - [null, null, null, null, null] +8912 - Crates - [null, null, null, null, null] +8913 - Crate - [Search, null, null, null, null] +8914 - Crate - [Search, null, null, null, null] +8915 - Crate - [Search, null, null, null, null] +8916 - Crate - [Search, null, null, null, null] +8917 - null - [null, null, null, null, null] +8918 - Banner - [null, null, null, null, null] +8919 - null - [null, null, null, null, null] +8920 - null - [null, null, null, null, null] +8921 - null - [null, null, null, null, null] +8922 - null - [null, null, null, null, null] +8923 - null - [null, null, null, null, null] +8924 - Train cart - [Ride, Return, null, null, null] +8925 - Train cart - [Ride, null, null, null, null] +8926 - Viking Boat - [null, null, null, null, null] +8927 - Well - [null, null, null, null, null] +8928 - null - [null, null, null, null, null] +8929 - Cave entrance - [Enter, null, null, null, null] +8930 - Cave entrance - [Enter, null, null, null, null] +8931 - null - [null, null, null, null, null] +8932 - null - [null, null, null, null, null] +8933 - null - [null, null, null, null, null] +8934 - null - [null, null, null, null, null] +8935 - null - [null, null, null, null, null] +8936 - null - [null, null, null, null, null] +8937 - null - [null, null, null, null, null] +8938 - null - [null, null, null, null, null] +8939 - null - [null, null, null, null, null] +8940 - null - [null, null, null, null, null] +8941 - null - [null, null, null, null, null] +8942 - null - [null, null, null, null, null] +8943 - null - [null, null, null, null, null] +8944 - null - [null, null, null, null, null] +8945 - null - [null, null, null, null, null] +8946 - null - [null, null, null, null, null] +8947 - null - [null, null, null, null, null] +8948 - null - [null, null, null, null, null] +8949 - null - [null, null, null, null, null] +8950 - Rock - [null, null, null, null, null] +8951 - Rock - [null, null, null, null, null] +8952 - Rock - [null, null, null, null, null] +8953 - null - [null, null, null, null, null] +8954 - Flag - [null, null, null, null, null] +8955 - Flag - [null, null, null, null, null] +8956 - Iron ladder - [Climb, Climb-up, Climb-down, null, null] +8957 - null - [null, null, null, null, null] +8958 - Door - [Open, null, null, null, null] +8959 - Door - [Open, null, null, null, null] +8960 - Door - [Open, null, null, null, null] +8961 - Door - [null, null, null, null, null] +8962 - Door - [null, null, null, null, null] +8963 - Door - [null, null, null, null, null] +8964 - null - [null, null, null, null, null] +8965 - null - [null, null, null, null, null] +8966 - Steps - [Climb, null, null, null, null] +8967 - Door - [null, null, null, null, null] +8968 - null - [null, null, null, null, null] +8969 - null - [null, null, null, null, null] +8970 - null - [null, null, null, null, null] +8971 - null - [null, null, null, null, null] +8972 - Portal - [Enter, null, null, null, null] +8973 - Tree - [null, null, null, null, null] +8974 - Tree - [null, null, null, null, null] +8975 - null - [null, null, null, null, null] +8976 - null - [null, null, null, null, null] +8977 - null - [null, null, null, null, null] +8978 - null - [null, null, null, null, null] +8979 - null - [null, null, null, null, null] +8980 - null - [null, null, null, null, null] +8981 - null - [null, null, null, null, null] +8982 - null - [null, null, null, null, null] +8983 - null - [null, null, null, null, null] +8984 - null - [null, null, null, null, null] +8985 - Uncooking pot - [null, null, null, null, null] +8986 - Fishing spot - [Net, hidden, null, null, null] +8987 - Portal - [Enter, null, null, null, null] +8988 - Chest - [Open, null, null, null, null] +8989 - Open Chest - [null, null, null, null, null] +8990 - null - [null, null, null, null, null] +8991 - null - [null, null, null, null, null] +8992 - null - [null, null, null, null, null] +8993 - null - [null, null, null, null, null] +8994 - null - [null, null, null, null, null] +8995 - null - [null, null, null, null, null] +8996 - null - [null, null, null, null, null] +8997 - null - [null, null, null, null, null] +8998 - Appendage - [Operate, null, null, null, null] +8999 - Appendage - [Operate, null, null, null, null] +9000 - Appendage - [Operate, null, null, null, null] +9001 - Appendage - [Operate, null, null, null, null] +9002 - Appendage - [Operate, null, null, null, null] +9003 - Appendage - [Operate, null, null, null, null] +9004 - Appendage - [Operate, null, null, null, null] +9005 - Appendage - [Operate, null, null, null, null] +9006 - Funeral pyre - [null, null, null, null, null] +9007 - Funeral pyre - [null, null, null, null, null] +9008 - Funeral pyre - [Light, null, null, null, null] +9009 - Funeral pyre - [Light, null, null, null, null] +9010 - Light Jungle - [null, null, null, Hack, null] +9011 - Light Jungle - [null, null, null, Hack, null] +9012 - Light Jungle - [null, null, null, Hack, null] +9013 - Light Jungle - [null, null, null, Hack, null] +9014 - Light Jungle - [null, null, null, null, null] +9015 - Medium Jungle - [null, null, null, Hack, null] +9016 - Medium Jungle - [null, null, null, Hack, null] +9017 - Medium Jungle - [null, null, null, Hack, null] +9018 - Medium Jungle - [null, null, null, Hack, null] +9019 - Medium Jungle - [null, null, null, null, null] +9020 - Dense Jungle - [null, null, null, Hack, null] +9021 - Dense Jungle - [null, null, null, Hack, null] +9022 - Dense Jungle - [null, null, null, Hack, null] +9023 - Dense Jungle - [null, null, null, Hack, null] +9024 - Dense Jungle - [null, null, null, null, null] +9025 - Rotten village fence - [Repair, null, null, null, null] +9026 - Partial fence - [Repair, null, null, null, null] +9027 - Short fence - [Repair, null, null, null, null] +9028 - Medium fence - [Repair, null, null, null, null] +9029 - Village fence - [Reinforce, null, null, null, null] +9030 - Gem Rock - [Mine, Prospect, hidden, null, null] +9031 - Gem Rock - [Mine, Prospect, hidden, null, null] +9032 - Gem Rock - [Mine, Prospect, hidden, null, null] +9033 - Gout Tuber Plant - [null, null, null, null, null] +9034 - Mahogany - [Chop down, null, hidden, null, null] +9035 - Tree stump - [null, null, null, null, null] +9036 - Teak - [Chop down, null, hidden, null, null] +9037 - Tree stump - [null, null, null, null, null] +9038 - Hardwood Grove Doors - [Open, Quick-Pay(100), null, null, null] +9039 - Hardwood Grove Doors - [Open, Quick-Pay(100), null, null, null] +9040 - null - [null, null, null, null, null] +9041 - null - [null, null, null, null, null] +9042 - null - [null, null, null, null, null] +9043 - null - [null, null, null, null, null] +9044 - Goutweed - [null, Inspect, null, Guide, null] +9045 - Goutweed - [null, Inspect, null, Guide, null] +9046 - Goutweed - [null, Inspect, null, Guide, null] +9047 - Goutweed - [null, Inspect, null, Guide, null] +9048 - Goutweed - [Pick, Inspect, null, Guide, null] +9049 - Diseased goutweed - [null, Inspect, null, Guide, null] +9050 - Diseased goutweed - [null, Inspect, null, Guide, null] +9051 - Diseased goutweed - [null, Inspect, null, Guide, null] +9052 - Dead goutweed - [null, Inspect, null, Guide, null] +9053 - Dead goutweed - [null, Inspect, null, Guide, null] +9054 - Dead goutweed - [null, Inspect, null, Guide, null] +9055 - null - [null, null, null, null, null] +9056 - null - [null, null, null, null, null] +9057 - null - [null, null, null, null, null] +9058 - Ali M's Market - [null, null, null, null, null] +9059 - Ali M's Market - [null, null, null, null, null] +9060 - Ali M's Market - [null, null, null, null, null] +9061 - Ali M's Market - [null, null, null, null, null] +9062 - Ali M's Market - [null, null, null, null, null] +9063 - Ali M's Market - [null, null, null, null, null] +9064 - Crate - [null, null, null, null, null] +9065 - null - [null, null, null, null, null] +9066 - Crate of rune caskets - [null, null, null, null, null] +9067 - null - [null, null, null, null, null] +9068 - Crate - [null, null, null, null, null] +9069 - null - [null, null, null, null, null] +9070 - Crate - [null, null, null, null, null] +9071 - Crate - [null, null, null, null, null] +9072 - rune casket - [null, null, null, null, null] +9073 - rune casket - [null, null, null, null, null] +9074 - rune casket - [null, null, null, null, null] +9075 - rune casket - [null, null, null, null, null] +9076 - Cloth - [null, null, null, null, null] +9077 - Hanging dye - [null, null, null, null, null] +9078 - Hanging dye - [null, null, null, null, null] +9079 - Dyed fabric - [null, null, null, null, null] +9080 - Dyed fabric - [null, null, null, null, null] +9081 - Dyed fabric - [null, null, null, null, null] +9082 - Table - [null, null, null, null, null] +9083 - Dye Pots - [null, null, null, null, null] +9084 - Stairs - [Climb-down, null, null, null, null] +9085 - Stove - [Refuel, null, null, null, null] +9086 - Stove - [Refuel, null, null, null, null] +9087 - Stove - [Refuel, null, null, null, null] +9088 - Coke - [Collect, null, null, null, null] +9089 - Temperature gauge - [Read, null, null, null, null] +9090 - Pump - [Operate, null, null, null, null] +9091 - Bars - [Retrieve, null, null, null, null] +9092 - null - [null, null, null, null, null] +9093 - Bar dispenser - [Search, null, null, null, null] +9094 - Bar dispenser - [null, null, null, null, null] +9095 - Bar dispenser - [null, null, null, null, null] +9096 - Bar dispenser - [Take, null, null, null, null] +9097 - Pedals - [Pedal, null, null, null, null] +9098 - Melting Pot - [null, null, null, null, null] +9099 - Smoke - [null, null, null, null, null] +9100 - Conveyor belt - [Put-ore-on, null, null, null, null] +9101 - Conveyor belt - [null, null, null, null, null] +9102 - Drive belt - [null, null, null, null, null] +9103 - Drive belt - [Repair, null, null, null, null] +9104 - Cogs - [null, null, null, null, null] +9105 - Cogs - [Repair, null, null, null, null] +9106 - Gear box - [null, null, null, null, null] +9107 - Drive belt - [null, null, null, null, null] +9108 - Cogs - [null, null, null, null, null] +9109 - null - [null, null, null, null, null] +9110 - null - [null, null, null, null, null] +9111 - null - [null, null, null, null, null] +9112 - null - [null, null, null, null, null] +9113 - null - [null, null, null, null, null] +9114 - null - [null, null, null, null, null] +9115 - Smoke - [null, null, null, null, null] +9116 - Pipes - [null, null, null, null, null] +9117 - Pipes - [Repair, null, null, null, null] +9118 - null - [null, null, null, null, null] +9119 - null - [null, null, null, null, null] +9120 - Pipes - [null, null, null, null, null] +9121 - Pipes - [Repair, null, null, null, null] +9122 - null - [null, null, null, null, null] +9123 - Smoke - [null, null, null, null, null] +9124 - null - [null, null, null, null, null] +9125 - null - [null, null, null, null, null] +9126 - null - [null, null, null, null, null] +9127 - null - [null, null, null, null, null] +9128 - null - [null, null, null, null, null] +9129 - null - [null, null, null, null, null] +9130 - null - [null, null, null, null, null] +9131 - null - [null, null, null, null, null] +9132 - null - [null, null, null, null, null] +9133 - null - [null, null, null, null, null] +9134 - null - [null, null, null, null, null] +9135 - null - [null, null, null, null, null] +9136 - null - [null, null, null, null, null] +9137 - null - [null, null, null, null, null] +9138 - Stairs - [Climb-up, null, null, null, null] +9139 - null - [null, null, null, null, null] +9140 - Gate - [Open, null, null, null, null] +9141 - Gate - [Open, null, null, null, null] +9142 - Gate - [null, null, null, null, null] +9143 - Sink - [Fill-bucket, null, null, null, null] +9144 - Candelabrum - [null, null, null, null, null] +9145 - Golden lantern - [null, null, null, null, null] +9146 - Old Bookshelf - [Search, null, null, null, null] +9147 - Old Bookshelf - [Search, null, null, null, null] +9148 - Chair - [null, null, null, null, null] +9149 - Gold Screen - [null, null, null, null, null] +9150 - Wall - [null, null, null, null, null] +9151 - Hole in the wall - [null, null, null, null, null] +9152 - Patched Wall - [null, null, null, null, null] +9153 - null - [null, null, null, null, null] +9154 - null - [null, null, null, null, null] +9155 - Globe of Gielinor - [null, null, null, null, null] +9156 - Study Desk - [null, null, null, null, null] +9157 - Suit of armour - [null, null, null, null, null] +9158 - null - [null, null, null, null, null] +9159 - Candles - [null, null, null, null, null] +9160 - Candles - [null, null, null, null, null] +9161 - Candles - [null, null, null, null, null] +9162 - null - [null, null, null, null, null] +9163 - null - [null, null, null, null, null] +9164 - null - [null, null, null, null, null] +9165 - null - [null, null, null, null, null] +9166 - Delphinium patch - [null, Inspect, null, null, null] +9167 - Delphinium patch - [null, Inspect, null, null, null] +9168 - Delphinium patch - [null, Inspect, null, null, null] +9169 - Delphinium patch - [null, Inspect, null, null, null] +9170 - Delphiniums - [null, null, null, null, null] +9171 - Delphiniums - [null, null, null, null, null] +9172 - Delphiniums - [null, null, null, null, null] +9173 - Delphiniums - [null, null, null, null, null] +9174 - null - [null, null, null, null, null] +9175 - null - [null, null, null, null, null] +9176 - null - [null, null, null, null, null] +9177 - Pink rose bush patch - [null, Inspect, null, null, null] +9178 - Pink rose bush patch - [null, Inspect, null, null, null] +9179 - Pink rose bush patch - [null, Inspect, null, null, null] +9180 - Pink rose bush patch - [null, Inspect, null, null, null] +9181 - White rose bush patch - [null, Inspect, null, null, null] +9182 - White rose bush patch - [null, Inspect, null, null, null] +9183 - White rose bush patch - [null, Inspect, null, null, null] +9184 - White rose bush patch - [null, Inspect, null, null, null] +9185 - Red rose bush patch - [null, Inspect, null, null, null] +9186 - Red rose bush patch - [null, Inspect, null, null, null] +9187 - Red rose bush patch - [null, Inspect, null, null, null] +9188 - Red rose bush patch - [null, Inspect, null, null, null] +9189 - Rose bush - [null, null, null, null, null] +9190 - Rose bush - [null, null, null, null, null] +9191 - Rose bush - [null, null, null, null, null] +9192 - Rose bush - [null, null, null, null, null] +9193 - Rose bush - [null, null, null, null, null] +9194 - Rose bush - [null, null, null, null, null] +9195 - Rose bush - [null, null, null, null, null] +9196 - Rose bush - [null, null, null, null, null] +9197 - null - [null, null, null, null, null] +9198 - null - [null, null, null, null, null] +9199 - Orchids - [null, null, null, null, null] +9200 - Orchids - [null, null, null, null, null] +9201 - Orchids - [null, null, null, null, null] +9202 - Orchids - [null, null, null, null, null] +9203 - Plantpot - [null, Inspect, null, null, null] +9204 - Plantpot - [null, Inspect, null, null, null] +9205 - Yellow orchids - [null, null, null, null, null] +9206 - Yellow orchids - [null, null, null, null, null] +9207 - Yellow orchids - [null, null, null, null, null] +9208 - Yellow orchids - [null, null, null, null, null] +9209 - null - [null, null, null, null, null] +9210 - White Tree patch - [null, Inspect, null, null, null] +9211 - White Tree patch - [null, Inspect, null, null, null] +9212 - White Tree patch - [null, Inspect, null, null, null] +9213 - White Tree patch - [null, Inspect, null, null, null] +9214 - White Tree patch - [null, null, null, null, null] +9215 - White Tree patch - [null, null, null, null, null] +9216 - White Tree patch - [null, null, null, null, null] +9217 - White Tree patch - [null, null, null, null, null] +9218 - White Tree patch - [null, null, null, null, null] +9219 - White Tree patch - [Pick-fruit, null, null, null, null] +9220 - White Tree patch - [Pick-fruit, null, null, null, null] +9221 - White Tree patch - [Pick-fruit, null, null, null, null] +9222 - White Tree patch - [Pick-fruit, null, null, null, null] +9223 - null - [null, null, null, null, null] +9224 - Snowdrop patch - [null, Inspect, null, null, null] +9225 - Snowdrop patch - [null, Inspect, null, null, null] +9226 - Snowdrop patch - [null, Inspect, null, null, null] +9227 - Snowdrop patch - [null, Inspect, null, null, null] +9228 - Snowdrops - [null, null, null, null, null] +9229 - Snowdrops - [null, null, null, null, null] +9230 - Snowdrops - [null, null, null, null, null] +9231 - Snowdrops - [null, null, null, null, null] +9232 - null - [null, null, null, null, null] +9233 - Vine patch - [null, Inspect, null, null, null] +9234 - Vine patch - [null, Inspect, null, null, null] +9235 - Vine patch - [null, Inspect, null, null, null] +9236 - Vine patch - [null, Inspect, null, null, null] +9237 - Vines - [null, null, null, null, null] +9238 - Vines - [null, null, null, null, null] +9239 - Vines - [null, null, null, null, null] +9240 - Vines - [null, null, null, null, null] +9241 - Plinth - [null, null, null, null, null] +9242 - Plinth - [null, null, null, null, null] +9243 - Statue of Saradomin - [null, null, null, null, null] +9244 - Plinth - [null, null, null, null, null] +9245 - Statue - [null, null, null, null, null] +9246 - Statue plinth - [null, Inspect, null, null, null] +9247 - Statue of Saradomin - [null, null, null, null, null] +9248 - Statue plinth - [null, Inspect, null, null, null] +9249 - Statue - [null, null, null, null, null] +9250 - null - [null, null, null, null, null] +9251 - null - [null, null, null, null, null] +9252 - null - [null, null, null, null, null] +9253 - null - [null, null, null, null, null] +9254 - null - [null, null, null, null, null] +9255 - Grapevines - [null, null, null, null, null] +9256 - Diseased Grapevines - [null, null, null, null, null] +9257 - null - [null, null, null, null, null] +9258 - Hole - [Use, null, null, null, null] +9259 - Hole - [Use, null, null, null, null] +9260 - null - [null, null, null, null, null] +9261 - Roses - [Take-seed, null, null, null, null] +9262 - Roses - [Take-seed, null, null, null, null] +9263 - White Tree - [null, null, null, null, null] +9264 - null - [null, null, null, null, null] +9265 - null - [null, null, null, null, null] +9266 - null - [null, null, null, null, null] +9267 - null - [null, null, null, null, null] +9268 - null - [null, null, null, null, null] +9269 - null - [null, null, null, null, null] +9270 - null - [null, null, null, null, null] +9271 - null - [null, null, null, null, null] +9272 - null - [null, null, null, null, null] +9273 - null - [null, null, null, null, null] +9274 - null - [null, null, null, null, null] +9275 - null - [null, null, null, null, null] +9276 - null - [null, null, null, null, null] +9277 - null - [null, null, null, null, null] +9278 - null - [null, null, null, null, null] +9279 - null - [null, null, null, null, null] +9280 - null - [null, null, null, null, null] +9281 - null - [null, null, null, null, null] +9282 - null - [null, null, null, null, null] +9283 - null - [null, null, null, null, null] +9284 - null - [null, null, null, null, null] +9285 - null - [null, null, null, null, null] +9286 - null - [null, null, null, null, null] +9287 - null - [null, null, null, null, null] +9288 - null - [null, null, null, null, null] +9289 - null - [null, null, null, null, null] +9290 - null - [null, null, null, null, null] +9291 - Picnic bench - [null, null, null, null, null] +9292 - Statue - [null, null, null, null, null] +9293 - Obstacle pipe - [Squeeze-through, null, null, null, null] +9294 - Strange floor - [Jump-over, null, null, null, null] +9295 - Obstacle pipe - [Squeeze-through, null, null, null, null] +9296 - Rocks - [Climb, null, null, null, null] +9297 - Rocks - [Climb, null, null, null, null] +9298 - null - [null, null, null, null, null] +9299 - Fence - [Squeeze-through, null, null, null, null] +9300 - Fence - [Jump-over, null, null, null, null] +9301 - Castle wall - [Climb-under, null, null, null, null] +9302 - Hole - [Climb-into, null, null, null, null] +9303 - Rocks - [Climb, null, null, null, null] +9304 - Rocks - [Climb, null, null, null, null] +9305 - Rocks - [Climb, null, null, null, null] +9306 - Rocks - [Climb, null, null, null, null] +9307 - Weathered wall - [Jump-up, null, null, null, null] +9308 - Weathered wall - [Jump-down, null, null, null, null] +9309 - Underwall tunnel - [Climb-into, null, null, null, null] +9310 - Underwall tunnel - [Climb-into, null, null, null, null] +9311 - Underwall tunnel - [Climb-into, null, null, null, null] +9312 - Underwall tunnel - [Climb-into, null, null, null, null] +9313 - Damaged wall - [null, null, null, null, null] +9314 - Jutting wall - [Squeeze-past, null, null, null, null] +9315 - Stepping stone - [Jump-onto, null, null, null, null] +9316 - Rocks - [Climb, null, null, null, null] +9317 - Rocks - [Climb, null, null, null, null] +9318 - null - [null, null, null, null, null] +9319 - Spikey chain - [Climb-up, null, null, null, null] +9320 - Spikey chain - [Climb-down, null, null, null, null] +9321 - Crevice - [Squeeze-through, null, null, null, null] +9322 - Log balance - [Walk-across, null, null, null, null] +9323 - Log balance - [Walk-across, null, null, null, null] +9324 - Log balance - [Walk-across, null, null, null, null] +9325 - Crevice - [Squeeze-through, null, null, null, null] +9326 - Strange floor - [Jump-over, null, null, null, null] +9327 - Rocks - [Climb, null, null, null, null] +9328 - Log balance - [Walk-across, null, null, null, null] +9329 - Log balance - [Walk-across, null, null, null, null] +9330 - Log balance - [Walk-across, null, null, null, null] +9331 - Rocks - [Climb, null, null, null, null] +9332 - Rocks - [Climb, null, null, null, null] +9333 - null - [null, null, null, null, null] +9334 - Ornate railing - [Squeeze-through, null, null, null, null] +9335 - Rocks - [Climb, null, null, null, null] +9336 - Rocks - [Climb, null, null, null, null] +9337 - Ornate railing - [Squeeze-through, null, null, null, null] +9338 - Scarecrow - [null, Inspect, null, Guide, null] +9339 - Scarecrow - [null, Inspect, null, Guide, null] +9340 - Scarecrow - [null, Inspect, null, Guide, null] +9341 - null - [null, null, null, null, null] +9342 - null - [null, null, null, null, null] +9343 - null - [null, null, null, null, null] +9344 - null - [null, null, null, null, null] +9345 - null - [null, null, null, null, null] +9346 - null - [null, null, null, null, null] +9347 - null - [null, null, null, null, null] +9348 - null - [null, null, null, null, null] +9349 - null - [null, null, null, null, null] +9350 - null - [null, null, null, null, null] +9351 - null - [null, null, null, null, null] +9352 - null - [null, null, null, null, null] +9353 - null - [null, null, null, null, null] +9354 - Cave exit - [null, null, null, null, null] +9355 - Cave entrance - [null, null, null, null, null] +9356 - Cave entrance - [Enter, null, null, null, null] +9357 - Cave entrance - [Enter, null, null, null, null] +9358 - Crack in wall - [Go-through, null, null, null, null] +9359 - Cave exit - [Enter, null, null, null, null] +9360 - null - [null, null, null, null, null] +9361 - null - [null, null, null, null, null] +9362 - null - [null, null, null, null, null] +9363 - null - [null, null, null, null, null] +9364 - null - [null, null, null, null, null] +9365 - null - [null, null, null, null, null] +9366 - Open hot vent door - [null, null, null, null, null] +9367 - Hot vent door - [Pass, null, null, null, null] +9368 - Hot vent door - [Pass, null, null, null, null] +9369 - Hot vent door - [Pass, null, null, null, null] +9370 - null - [null, null, null, null, null] +9371 - null - [null, null, null, null, null] +9372 - null - [null, null, null, null, null] +9373 - null - [null, null, null, null, null] +9374 - Sulphur vent - [null, null, null, null, null] +9375 - null - [null, null, null, null, null] +9376 - Obsidian wall - [Mine, Prospect, hidden, null, null] +9377 - Egg - [null, null, null, null, null] +9378 - Egg - [null, null, null, null, null] +9379 - Egg - [null, null, null, null, null] +9380 - TzHaar statue - [null, null, null, null, null] +9381 - Crate - [null, null, null, null, null] +9382 - Crates - [null, null, null, null, null] +9383 - null - [null, null, null, null, null] +9384 - null - [null, null, null, null, null] +9385 - null - [null, null, null, null, null] +9386 - null - [null, null, null, null, null] +9387 - null - [null, null, null, null, null] +9388 - null - [null, null, null, null, null] +9389 - null - [null, null, null, null, null] +9390 - Lava forge - [null, Smelt, null, null, null] +9391 - Viewing orb - [Look-into, null, null, null, null] +9392 - null - [null, null, null, null, null] +9393 - null - [null, null, null, null, null] +9394 - null - [null, null, null, null, null] +9395 - null - [null, null, null, null, null] +9396 - null - [null, null, null, null, null] +9397 - null - [null, null, null, null, null] +9398 - Bank Deposit Box - [Deposit, null, null, null, null] +9399 - null - [null, null, null, null, null] +9400 - Unferth's patch - [null, null, null, null, null] +9401 - Unferth's patch - [null, null, null, null, null] +9402 - Unferth's patch - [null, null, null, null, null] +9403 - Unferth's patch - [null, null, null, null, null] +9404 - Potato plants - [null, null, null, null, null] +9405 - Potato plants - [null, null, null, null, null] +9406 - Potato plants - [null, null, null, null, null] +9407 - Potato plants - [null, null, null, null, null] +9408 - Potatoes - [null, null, null, null, null] +9409 - null - [null, null, null, null, null] +9410 - null - [null, null, null, null, null] +9411 - null - [null, null, null, null, null] +9412 - null - [null, null, null, null, null] +9413 - null - [null, null, null, null, null] +9414 - null - [null, null, null, null, null] +9415 - null - [null, null, null, null, null] +9416 - null - [null, null, null, null, null] +9417 - null - [null, null, null, null, null] +9418 - null - [null, null, null, null, null] +9419 - null - [null, null, null, null, null] +9420 - null - [null, null, null, null, null] +9421 - null - [null, null, null, null, null] +9422 - null - [null, null, null, null, null] +9423 - null - [null, null, null, null, null] +9424 - null - [null, null, null, null, null] +9425 - null - [null, null, null, null, null] +9426 - null - [null, null, null, null, null] +9427 - null - [null, null, null, null, null] +9428 - null - [null, null, null, null, null] +9429 - null - [null, null, null, null, null] +9430 - Table - [Inspect, null, null, null, null] +9431 - Table - [Inspect, null, null, null, null] +9432 - Table - [Inspect, null, null, null, null] +9433 - Table - [Inspect, null, null, null, null] +9434 - Table - [Inspect, null, null, null, null] +9435 - null - [null, null, null, null, null] +9436 - Bed - [null, null, null, null, null] +9437 - Bed - [Make, null, null, null, null] +9438 - null - [null, null, null, null, null] +9439 - Fireplace - [null, null, null, null, null] +9440 - Fireplace - [null, null, null, null, null] +9441 - Fireplace - [null, null, null, null, null] +9442 - null - [null, null, null, null, null] +9443 - Bookcase - [Search, null, null, null, null] +9444 - null - [null, null, null, null, null] +9445 - null - [null, null, null, null, null] +9446 - null - [null, null, null, null, null] +9447 - null - [null, null, null, null, null] +9448 - null - [null, null, null, null, null] +9449 - null - [null, null, null, null, null] +9450 - null - [null, null, null, null, null] +9451 - null - [null, null, null, null, null] +9452 - null - [null, null, null, null, null] +9453 - null - [null, null, null, null, null] +9454 - null - [null, null, null, null, null] +9455 - null - [null, null, null, null, null] +9456 - null - [null, null, null, null, null] +9457 - null - [null, null, null, null, null] +9458 - null - [null, null, null, null, null] +9459 - null - [null, null, null, null, null] +9460 - null - [null, null, null, null, null] +9461 - null - [null, null, null, null, null] +9462 - null - [null, null, null, null, null] +9463 - null - [null, null, null, null, null] +9464 - null - [null, null, null, null, null] +9465 - null - [null, null, null, null, null] +9466 - null - [null, null, null, null, null] +9467 - null - [null, null, null, null, null] +9468 - null - [null, null, null, null, null] +9469 - null - [null, null, null, null, null] +9470 - Staircase - [Climb-up, null, null, null, null] +9471 - Staircase - [Climb-down, null, null, null, null] +9472 - Trapdoor - [Climb-down, null, null, null, null] +9473 - null - [null, null, null, null, null] +9474 - null - [null, null, null, null, null] +9475 - null - [null, null, null, null, null] +9476 - null - [null, null, null, null, null] +9477 - null - [null, null, null, null, null] +9478 - null - [null, null, null, null, null] +9479 - null - [null, null, null, null, null] +9480 - null - [null, null, null, null, null] +9481 - null - [null, null, null, null, null] +9482 - null - [null, null, null, null, null] +9483 - null - [null, null, null, null, null] +9484 - null - [null, null, null, null, null] +9485 - null - [null, null, null, null, null] +9486 - null - [null, null, null, null, null] +9487 - null - [null, null, null, null, null] +9488 - null - [null, null, null, null, null] +9489 - null - [null, null, null, null, null] +9490 - null - [null, null, null, null, null] +9491 - null - [null, null, null, null, null] +9492 - null - [null, null, null, null, null] +9493 - null - [null, null, null, null, null] +9494 - null - [null, null, null, null, null] +9495 - null - [null, null, null, null, null] +9496 - null - [null, null, null, null, null] +9497 - null - [null, null, null, null, null] +9498 - Plant - [null, null, null, null, null] +9499 - Plant - [null, null, null, null, null] +9500 - Plant - [null, null, null, null, null] +9501 - Plant - [null, null, null, null, null] +9502 - null - [null, null, null, null, null] +9503 - null - [null, null, null, null, null] +9504 - null - [null, null, null, null, null] +9505 - null - [null, null, null, null, null] +9506 - null - [null, null, null, null, null] +9507 - null - [null, null, null, null, null] +9508 - Hammock - [null, null, null, null, null] +9509 - Bed - [null, null, null, null, null] +9510 - Signpost - [null, null, null, null, null] +9511 - null - [null, null, null, null, null] +9512 - null - [null, null, null, null, null] +9513 - null - [null, null, null, null, null] +9514 - Chair - [null, null, null, null, null] +9515 - Betty's cauldron - [null, null, null, null, null] +9516 - Counter - [null, null, null, null, null] +9517 - null - [null, null, null, null, null] +9518 - null - [null, null, null, null, null] +9519 - Barrel - [null, null, null, null, null] +9520 - Barrel - [null, null, null, null, null] +9521 - Barrel - [null, null, null, null, null] +9522 - Anchor - [null, null, null, null, null] +9523 - Bookcase - [Search, null, null, null, null] +9524 - Chain - [null, null, null, null, null] +9525 - Cart - [null, null, null, null, null] +9526 - Shelves - [null, null, null, null, null] +9527 - Shelves - [null, null, null, null, null] +9528 - Shelves - [null, null, null, null, null] +9529 - Shelves - [null, null, null, null, null] +9530 - Fungus - [null, null, null, null, null] +9531 - Bench - [null, null, null, null, null] +9532 - Picnic bench - [null, null, null, null, null] +9533 - Crate - [Search, null, null, null, null] +9534 - Crate - [Search, null, null, null, null] +9535 - Crates - [Search, null, null, null, null] +9536 - Boxes - [Search, null, null, null, null] +9537 - Crane - [null, null, null, null, null] +9538 - Row boat - [null, null, null, null, null] +9539 - null - [null, null, null, null, null] +9540 - null - [null, null, null, null, null] +9541 - null - [null, null, null, null, null] +9542 - null - [null, null, null, null, null] +9543 - null - [null, null, null, null, null] +9544 - null - [null, null, null, null, null] +9545 - null - [null, null, null, null, null] +9546 - null - [null, null, null, null, null] +9547 - null - [null, null, null, null, null] +9548 - Hot Coals - [null, null, null, null, null] +9549 - Hot Coals - [null, null, null, null, null] +9550 - null - [null, null, null, null, null] +9551 - null - [null, null, null, null, null] +9552 - null - [null, null, null, null, null] +9553 - null - [null, null, null, null, null] +9554 - null - [null, null, null, null, null] +9555 - null - [null, null, null, null, null] +9556 - null - [null, null, null, null, null] +9557 - null - [null, null, null, null, null] +9558 - Ladder - [Climb-up, null, null, null, null] +9559 - Ladder - [Climb-down, null, null, null, null] +9560 - Trapdoor - [Climb-down, null, null, null, null] +9561 - Bed - [null, null, null, null, null] +9562 - Cell door - [Open, null, null, null, null] +9563 - Cell door - [Open, null, null, null, null] +9564 - Cell door - [Close, null, null, null, null] +9565 - Door - [Open, null, null, null, Pick-lock] +9566 - null - [null, null, null, null, null] +9567 - Bucket - [null, null, null, null, null] +9568 - Bucket - [null, null, null, null, null] +9569 - null - [null, null, null, null, null] +9570 - null - [null, null, null, null, null] +9571 - null - [null, null, null, null, null] +9572 - null - [null, null, null, null, null] +9573 - null - [null, null, null, null, null] +9574 - null - [null, null, null, null, null] +9575 - null - [null, null, null, null, null] +9576 - null - [null, null, null, null, null] +9577 - null - [null, null, null, null, null] +9578 - null - [null, null, null, null, null] +9579 - null - [null, null, null, null, null] +9580 - null - [null, null, null, null, null] +9581 - null - [null, null, null, null, null] +9582 - Staircase - [Climb-up, null, null, null, null] +9583 - null - [null, null, null, null, null] +9584 - Staircase - [Climb-down, null, null, null, null] +9585 - null - [null, null, null, null, null] +9586 - null - [null, null, null, null, null] +9587 - null - [null, null, null, null, null] +9588 - null - [null, null, null, null, null] +9589 - null - [null, null, null, null, null] +9590 - null - [null, null, null, null, null] +9591 - null - [null, null, null, null, null] +9592 - null - [null, null, null, null, null] +9593 - null - [null, null, null, null, null] +9594 - null - [null, null, null, null, null] +9595 - null - [null, null, null, null, null] +9596 - null - [null, null, null, null, null] +9597 - null - [null, null, null, null, null] +9598 - null - [null, null, null, null, null] +9599 - null - [null, null, null, null, null] +9600 - null - [null, null, null, null, null] +9601 - null - [null, null, null, null, null] +9602 - null - [null, null, null, null, null] +9603 - null - [null, null, null, null, null] +9604 - Plant - [null, null, null, null, null] +9605 - Plant - [null, null, null, null, null] +9606 - Plant - [null, null, null, null, null] +9607 - Bookcase - [Search, null, null, null, null] +9608 - Bookcase - [Search, null, null, null, null] +9609 - Bookcase - [Search, null, null, null, null] +9610 - Easel - [null, null, null, null, null] +9611 - Bookcase - [Search, null, null, null, null] +9612 - Bed - [null, null, null, null, null] +9613 - Large Table - [null, null, null, null, null] +9614 - Table - [null, null, null, null, null] +9615 - Small Table - [null, null, null, null, null] +9616 - Counter - [null, null, null, null, null] +9617 - Warehouse shelves - [null, null, null, null, null] +9618 - Warehouse shelves - [null, null, null, null, null] +9619 - Warehouse shelves - [null, null, null, null, null] +9620 - Warehouse shelves - [null, null, null, null, null] +9621 - Chair - [null, null, null, null, null] +9622 - Chair - [null, null, null, null, null] +9623 - null - [null, null, null, null, null] +9624 - Plough - [null, null, null, null, null] +9625 - Wheelbarrow - [null, null, null, null, null] +9626 - null - [null, null, null, null, null] +9627 - null - [null, null, null, null, null] +9628 - null - [null, null, null, null, null] +9629 - null - [null, null, null, null, null] +9630 - null - [null, null, null, null, null] +9631 - null - [null, null, null, null, null] +9632 - null - [null, null, null, null, null] +9633 - null - [null, null, null, null, null] +9634 - null - [null, null, null, null, null] +9635 - null - [null, null, null, null, null] +9636 - null - [null, null, null, null, null] +9637 - null - [null, null, null, null, null] +9638 - null - [null, null, null, null, null] +9639 - null - [null, null, null, null, null] +9640 - null - [null, null, null, null, null] +9641 - null - [null, null, null, null, null] +9642 - null - [null, null, null, null, null] +9643 - null - [null, null, null, null, null] +9644 - null - [null, null, null, null, null] +9645 - null - [null, null, null, null, null] +9646 - null - [null, null, null, null, null] +9647 - null - [null, null, null, null, null] +9648 - null - [null, null, null, null, null] +9649 - null - [null, null, null, null, null] +9650 - null - [null, null, null, null, null] +9651 - null - [null, null, null, null, null] +9652 - null - [null, null, null, null, null] +9653 - null - [null, null, null, null, null] +9654 - null - [null, null, null, null, null] +9655 - null - [null, null, null, null, null] +9656 - null - [null, null, null, null, null] +9657 - null - [null, null, null, null, null] +9658 - null - [null, null, null, null, null] +9659 - null - [null, null, null, null, null] +9660 - null - [null, null, null, null, null] +9661 - Tree stump - [null, null, null, null, null] +9662 - Spade - [Take, null, null, null, null] +9663 - Fallen tree - [null, null, null, null, null] +9664 - Roots - [null, null, null, null, null] +9665 - Roots - [null, null, null, null, null] +9666 - Roots - [null, null, null, null, null] +9667 - Scarecrow - [null, null, null, null, null] +9668 - Mysterious statue - [null, null, null, null, null] +9669 - null - [null, null, null, null, null] +9670 - null - [null, null, null, null, null] +9671 - null - [null, null, null, null, null] +9672 - null - [null, null, null, null, null] +9673 - null - [null, null, null, null, null] +9674 - null - [null, null, null, null, null] +9675 - null - [null, null, null, null, null] +9676 - null - [null, null, null, null, null] +9677 - null - [null, null, null, null, null] +9678 - null - [null, null, null, null, null] +9679 - null - [null, null, null, null, null] +9680 - null - [null, null, null, null, null] +9681 - null - [null, null, null, null, null] +9682 - Range - [null, null, null, null, null] +9683 - Range chimney - [null, null, null, null, null] +9684 - Sink - [null, null, null, null, null] +9685 - Table - [null, null, null, null, null] +9686 - Cloth - [null, null, null, null, null] +9687 - Clothes model - [null, null, null, null, null] +9688 - Clothes model - [null, null, null, null, null] +9689 - Clothes model - [null, null, null, null, null] +9690 - Clothes model - [null, null, null, null, null] +9691 - null - [null, null, null, null, null] +9692 - null - [null, null, null, null, null] +9693 - null - [null, null, null, null, null] +9694 - Noticeboard - [null, null, null, null, null] +9695 - Noticeboard - [null, null, null, null, null] +9696 - Sign - [null, null, null, null, null] +9697 - Large Table - [null, null, null, null, null] +9698 - Large Table - [null, null, null, null, null] +9699 - Large Table - [null, null, null, null, null] +9700 - Large Table - [null, null, null, null, null] +9701 - null - [null, null, null, null, null] +9702 - Table - [null, null, null, null, null] +9703 - Candlestick holder - [null, null, null, null, null] +9704 - Chair - [null, null, null, null, null] +9705 - Chair - [null, null, null, null, null] +9706 - Lever - [Pull, null, null, null, null] +9707 - Lever - [Pull, null, null, null, null] +9708 - Rocks - [Mine, Prospect, hidden, null, null] +9709 - Rocks - [Mine, Prospect, hidden, null, null] +9710 - Rocks - [Mine, Prospect, hidden, null, null] +9711 - Rocks - [Mine, Prospect, hidden, null, null] +9712 - Rocks - [Mine, Prospect, hidden, null, null] +9713 - Rocks - [Mine, Prospect, hidden, null, null] +9714 - Rocks - [Mine, Prospect, hidden, null, null] +9715 - Rocks - [Mine, Prospect, hidden, null, null] +9716 - Rocks - [Mine, Prospect, hidden, null, null] +9717 - Rocks - [Mine, Prospect, hidden, null, null] +9718 - Rocks - [Mine, Prospect, hidden, null, null] +9719 - Rocks - [Mine, Prospect, hidden, null, null] +9720 - Rocks - [Mine, Prospect, hidden, null, null] +9721 - Rocks - [Mine, Prospect, hidden, null, null] +9722 - Rocks - [Mine, Prospect, hidden, null, null] +9723 - Rocks - [Mine, Prospect, hidden, null, null] +9724 - Rocks - [Mine, Prospect, hidden, null, null] +9725 - Rocks - [Mine, Prospect, hidden, null, null] +9726 - Rocks - [Mine, Prospect, hidden, null, null] +9727 - Rocks - [Mine, Prospect, hidden, null, null] +9728 - Rocks - [Mine, Prospect, hidden, null, null] +9729 - Rocks - [Mine, Prospect, hidden, null, null] +9730 - Rocks - [Mine, Prospect, hidden, null, null] +9731 - Rocks - [Mine, Prospect, hidden, null, null] +9732 - Rocks - [Mine, Prospect, hidden, null, null] +9733 - Rocks - [Mine, Prospect, hidden, null, null] +9734 - Rocks - [Mine, Prospect, hidden, null, null] +9735 - Rocks - [Mine, Prospect, hidden, null, null] +9736 - Rocks - [Mine, Prospect, hidden, null, null] +9737 - Rocks - [Mine, Prospect, hidden, null, null] +9738 - Ruined Pillar - [null, null, null, null, null] +9739 - Ruined Pillar - [null, null, null, null, null] +9740 - Ruined Pillar - [null, null, null, null, null] +9741 - Trawler net - [null, null, null, null, null] +9742 - Trawler net - [null, null, null, null, null] +9743 - null - [null, null, null, null, null] +9744 - Ship's ladder - [Climb-up, null, null, null, null] +9745 - Ship's ladder - [Climb-down, null, null, null, null] +9746 - null - [null, null, null, null, null] +9747 - null - [null, null, null, null, null] +9748 - Crystal collector - [Collect, null, null, null, null] +9749 - Crystal collector - [Pull, null, null, null, null] +9750 - null - [null, null, null, null, null] +9751 - Crystal - [Search, null, null, null, null] +9752 - Crystal - [null, null, null, null, null] +9753 - Open chest - [Search, Shut, null, null, null] +9754 - Closed chest - [Open, null, null, null, null] +9755 - Open chest - [Search, Shut, null, null, null] +9756 - Closed chest - [Open, null, null, null, null] +9757 - Open chest - [Search, Shut, null, null, null] +9758 - Closed chest - [Open, null, null, null, null] +9759 - Open chest - [Search, Shut, null, null, null] +9760 - Closed chest - [Open, null, null, null, null] +9761 - Open chest - [Search, Shut, null, null, null] +9762 - Closed chest - [Open, null, null, null, null] +9763 - Guard - [Search, null, null, null, null] +9764 - Guard - [Search, null, null, null, null] +9765 - Guard - [Search, null, null, null, null] +9766 - Slave - [Search, null, null, null, null] +9767 - Slave - [Search, null, null, null, null] +9768 - Light door - [null, null, null, null, null] +9769 - Light door - [null, null, null, null, null] +9770 - Light door - [null, null, null, null, null] +9771 - Light door - [null, null, null, null, null] +9772 - Light door - [null, null, null, null, null] +9773 - Light door - [null, null, null, null, null] +9774 - Light door - [null, null, null, null, null] +9775 - Light door - [Pass-through, null, null, null, null] +9776 - null - [Pass, null, null, null, null] +9777 - null - [Pass, null, null, null, null] +9778 - null - [Pass, null, null, null, null] +9779 - null - [Pass, null, null, null, null] +9780 - null - [Pass, null, null, null, null] +9781 - null - [Pass, null, null, null, null] +9782 - null - [Pass, null, null, null, null] +9783 - null - [Pass, null, null, null, null] +9784 - null - [Pass, null, null, null, null] +9785 - null - [Pass, null, null, null, null] +9786 - null - [Pass, null, null, null, null] +9787 - null - [Pass, null, null, null, null] +9788 - null - [Pass, null, null, null, null] +9789 - null - [null, null, null, null, null] +9790 - null - [null, null, null, null, null] +9791 - null - [null, null, null, null, null] +9792 - null - [null, null, null, null, null] +9793 - null - [null, null, null, null, null] +9794 - null - [null, null, null, null, null] +9795 - null - [null, null, null, null, null] +9796 - null - [null, null, null, null, null] +9797 - null - [null, null, null, null, null] +9798 - null - [null, null, null, null, null] +9799 - null - [null, null, null, null, null] +9800 - null - [null, null, null, null, null] +9801 - null - [null, null, null, null, null] +9802 - null - [null, null, null, null, null] +9803 - null - [null, null, null, null, null] +9804 - null - [null, null, null, null, null] +9805 - null - [null, null, null, null, null] +9806 - null - [null, null, null, null, null] +9807 - null - [null, null, null, null, null] +9808 - null - [null, null, null, null, null] +9809 - null - [null, null, null, null, null] +9810 - null - [null, null, null, null, null] +9811 - null - [null, null, null, null, null] +9812 - null - [null, null, null, null, null] +9813 - null - [null, null, null, null, null] +9814 - null - [null, null, null, null, null] +9815 - null - [null, null, null, null, null] +9816 - null - [null, null, null, null, null] +9817 - null - [null, null, null, null, null] +9818 - null - [null, null, null, null, null] +9819 - null - [null, null, null, null, null] +9820 - null - [null, null, null, null, null] +9821 - null - [null, null, null, null, null] +9822 - null - [null, null, null, null, null] +9823 - null - [null, null, null, null, null] +9824 - null - [null, null, null, null, null] +9825 - null - [null, null, null, null, null] +9826 - null - [null, null, null, null, null] +9827 - null - [null, null, null, null, null] +9828 - null - [null, null, null, null, null] +9829 - null - [null, null, null, null, null] +9830 - null - [null, null, null, null, null] +9831 - null - [null, null, null, null, null] +9832 - null - [null, null, null, null, null] +9833 - null - [null, null, null, null, null] +9834 - null - [null, null, null, null, null] +9835 - null - [null, null, null, null, null] +9836 - null - [null, null, null, null, null] +9837 - null - [null, null, null, null, null] +9838 - null - [null, null, null, null, null] +9839 - null - [null, null, null, null, null] +9840 - null - [null, null, null, null, null] +9841 - null - [null, null, null, null, null] +9842 - null - [null, null, null, null, null] +9843 - null - [null, null, null, null, null] +9844 - null - [null, null, null, null, null] +9845 - null - [null, null, null, null, null] +9846 - null - [null, null, null, null, null] +9847 - null - [null, null, null, null, null] +9848 - null - [null, null, null, null, null] +9849 - null - [null, null, null, null, null] +9850 - null - [null, null, null, null, null] +9851 - null - [null, null, null, null, null] +9852 - null - [null, null, null, null, null] +9853 - null - [null, null, null, null, null] +9854 - null - [null, null, null, null, null] +9855 - null - [null, null, null, null, null] +9856 - null - [null, null, null, null, null] +9857 - null - [null, null, null, null, null] +9858 - null - [null, null, null, null, null] +9859 - null - [null, null, null, null, null] +9860 - null - [null, null, null, null, null] +9861 - null - [null, null, null, null, null] +9862 - null - [null, null, null, null, null] +9863 - null - [null, null, null, null, null] +9864 - null - [null, null, null, null, null] +9865 - null - [null, null, null, null, null] +9866 - null - [null, null, null, null, null] +9867 - null - [null, null, null, null, null] +9868 - null - [null, null, null, null, null] +9869 - null - [null, null, null, null, null] +9870 - null - [null, null, null, null, null] +9871 - null - [null, null, null, null, null] +9872 - null - [null, null, null, null, null] +9873 - null - [null, null, null, null, null] +9874 - null - [null, null, null, null, null] +9875 - null - [null, null, null, null, null] +9876 - null - [null, null, null, null, null] +9877 - null - [null, null, null, null, null] +9878 - null - [null, null, null, null, null] +9879 - null - [null, null, null, null, null] +9880 - null - [null, null, null, null, null] +9881 - null - [null, null, null, null, null] +9882 - null - [null, null, null, null, null] +9883 - null - [null, null, null, null, null] +9884 - null - [null, null, null, null, null] +9885 - null - [null, null, null, null, null] +9886 - null - [null, null, null, null, null] +9887 - null - [null, null, null, null, null] +9888 - null - [null, null, null, null, null] +9889 - null - [null, null, null, null, null] +9890 - null - [null, null, null, null, null] +9891 - null - [null, null, null, null, null] +9892 - null - [null, null, null, null, null] +9893 - null - [null, null, null, null, null] +9894 - null - [null, null, null, null, null] +9895 - null - [null, null, null, null, null] +9896 - null - [null, null, null, null, null] +9897 - null - [null, null, null, null, null] +9898 - Pillar of Light - [Search, null, null, null, null] +9899 - Pillar of Light - [Search, null, null, null, null] +9900 - Pillar of Light - [Search, null, null, null, null] +9901 - Pillar of Light - [Search, null, null, null, null] +9902 - Pillar of Light - [Search, null, null, null, null] +9903 - Pillar of Light - [Search, null, null, null, null] +9904 - Pillar of Light - [Search, null, null, null, null] +9905 - Pillar of Light - [Search, null, null, null, null] +9906 - Pillar of Light - [Search, null, null, null, null] +9907 - Pillar of Light - [Search, null, null, null, null] +9908 - Pillar of Light - [Search, null, null, null, null] +9909 - Pillar of Light - [Search, null, null, null, null] +9910 - Pillar of Light - [Search, null, null, null, null] +9911 - Pillar of Light - [Search, null, null, null, null] +9912 - Pillar of Light - [Search, null, null, null, null] +9913 - Pillar of Light - [Search, null, null, null, null] +9914 - Pillar of Light - [Search, null, null, null, null] +9915 - Pillar of Light - [Search, null, null, null, null] +9916 - Pillar of Light - [Search, null, null, null, null] +9917 - Pillar of Light - [Search, null, null, null, null] +9918 - Pillar of Light - [Search, null, null, null, null] +9919 - Pillar of Light - [Search, null, null, null, null] +9920 - Pillar of Light - [Search, null, null, null, null] +9921 - Pillar of Light - [Search, null, null, null, null] +9922 - Pillar of Light - [Search, null, null, null, null] +9923 - Pillar of Light - [Search, null, null, null, null] +9924 - Pillar of Light - [Search, null, null, null, null] +9925 - Pillar of Light - [Search, null, null, null, null] +9926 - Pillar of Light - [Search, null, null, null, null] +9927 - Pillar of Light - [Search, null, null, null, null] +9928 - Pillar of Light - [Search, null, null, null, null] +9929 - Pillar of Light - [Search, null, null, null, null] +9930 - Pillar of Light - [Search, null, null, null, null] +9931 - Pillar of Light - [Search, null, null, null, null] +9932 - Pillar of Light - [Search, null, null, null, null] +9933 - Pillar of Light - [Search, null, null, null, null] +9934 - Pillar of Light - [Search, null, null, null, null] +9935 - Pillar of Light - [Search, null, null, null, null] +9936 - Pillar of Light - [Search, null, null, null, null] +9937 - Pillar of Light - [Search, null, null, null, null] +9938 - null - [null, null, null, null, null] +9939 - null - [null, null, null, null, null] +9940 - null - [null, null, null, null, null] +9941 - null - [null, null, null, null, null] +9942 - null - [null, null, null, null, null] +9943 - null - [null, null, null, null, null] +9944 - null - [null, null, null, null, null] +9945 - null - [null, null, null, null, null] +9946 - null - [null, null, null, null, null] +9947 - null - [null, null, null, null, null] +9948 - null - [null, null, null, null, null] +9949 - null - [null, null, null, null, null] +9950 - null - [null, null, null, null, null] +9951 - null - [null, null, null, null, null] +9952 - null - [null, null, null, null, null] +9953 - null - [null, null, null, null, null] +9954 - null - [null, null, null, null, null] +9955 - null - [null, null, null, null, null] +9956 - null - [null, null, null, null, null] +9957 - null - [null, null, null, null, null] +9958 - null - [null, null, null, null, null] +9959 - null - [null, null, null, null, null] +9960 - null - [null, null, null, null, null] +9961 - null - [null, null, null, null, null] +9962 - null - [null, null, null, null, null] +9963 - null - [null, null, null, null, null] +9964 - null - [null, null, null, null, null] +9965 - null - [null, null, null, null, null] +9966 - null - [null, null, null, null, null] +9967 - null - [null, null, null, null, null] +9968 - null - [null, null, null, null, null] +9969 - null - [null, null, null, null, null] +9970 - null - [null, null, null, null, null] +9971 - null - [null, null, null, null, null] +9972 - null - [null, null, null, null, null] +9973 - Pillar of Light - [Search, null, null, null, null] +9974 - null - [null, null, null, null, null] +9975 - Cave Stairs - [Descend, null, null, null, null] +9976 - Cave wall - [null, null, null, null, null] +9977 - Tunnel - [Enter, null, null, null, null] +9978 - Ladder - [Climb-up, null, null, null, null] +9979 - Ladder - [Climb-down, null, null, null, null] +9980 - Final Pillar - [null, null, null, null, null] +9981 - Pillar of Light - [null, null, null, null, null] +9982 - Pillar of Light - [null, null, null, null, null] +9983 - Pillar of Light - [null, null, null, null, null] +9984 - Pillar of Light - [null, null, null, null, null] +9985 - Pillar of Light - [null, null, null, null, null] +9986 - Pillar of Light - [null, null, null, null, null] +9987 - null - [null, null, null, null, null] +9988 - Pillar of Light - [null, null, null, null, null] +9989 - null - [null, null, null, null, null] +9990 - null - [null, null, null, null, null] +9991 - null - [null, null, null, null, null] +9992 - null - [null, null, null, null, null] +9993 - null - [null, null, null, null, null] +9994 - null - [null, null, null, null, null] +9995 - null - [null, null, null, null, null] +9996 - null - [null, null, null, null, null] +9997 - null - [null, null, null, null, null] +9998 - null - [null, null, null, null, null] +9999 - null - [null, null, null, null, null] +10000 - null - [null, null, null, null, null] +10001 - null - [null, null, null, null, null] +10002 - Light door - [null, null, null, null, null] +10003 - Light door - [null, null, null, null, null] +10004 - Light door - [null, null, null, null, null] +10005 - Light door - [null, null, null, null, null] +10006 - Light door - [null, null, null, null, null] +10007 - Light door - [null, null, null, null, null] +10008 - Light door - [null, null, null, null, null] +10009 - Light door - [null, null, null, null, null] +10010 - Light door - [null, null, null, null, null] +10011 - Light door - [null, null, null, null, null] +10012 - Light door - [null, null, null, null, null] +10013 - Light door - [null, null, null, null, null] +10014 - Crystal - [null, null, null, null, null] +10015 - Staircase - [Climb-up, null, null, null, null] +10016 - Staircase - [Climb-down, null, null, null, null] +10017 - Staircase - [Climb-up, null, null, null, null] +10018 - Staircase - [Climb-down, null, null, null, null] +10019 - Pillar - [null, null, null, null, null] +10020 - Pillar - [null, null, null, null, null] +10021 - Pillar - [null, null, null, null, null] +10022 - Pillar - [null, null, null, null, null] +10023 - null - [null, null, null, null, null] +10024 - null - [null, null, null, null, null] +10025 - null - [null, null, null, null, null] +10026 - null - [null, null, null, null, null] +10027 - null - [null, null, null, null, null] +10028 - null - [null, null, null, null, null] +10029 - null - [null, null, null, null, null] +10030 - null - [null, null, null, null, null] +10031 - null - [null, null, null, null, null] +10032 - null - [null, null, null, null, null] +10033 - Wall support - [Climb, null, null, null, null] +10034 - Trap - [null, null, null, null, null] +10035 - Low wall - [Climb-over, null, null, null, null] +10036 - Rock - [Climb-down, null, null, null, null] +10037 - Rope - [null, null, null, null, null] +10038 - Rope - [Climb-up, null, null, null, null] +10039 - null - [null, null, null, null, null] +10040 - null - [null, null, null, null, null] +10041 - Tree - [Chop down, Talk to, null, null, null] +10042 - null - [null, null, null, null, null] +10043 - null - [null, null, null, null, null] +10044 - null - [null, null, null, null, null] +10045 - null - [null, null, null, null, null] +10046 - null - [null, null, null, null, null] +10047 - null - [null, null, null, null, null] +10048 - null - [null, null, null, null, null] +10049 - null - [null, null, null, null, null] +10050 - null - [null, null, null, null, null] +10051 - null - [null, null, null, null, null] +10052 - null - [null, null, null, null, null] +10053 - null - [null, null, null, null, null] +10054 - Container - [null, null, null, null, null] +10055 - Gate - [null, null, null, null, null] +10056 - Gate - [null, null, null, null, null] +10057 - Flagpole - [null, null, null, null, null] +10058 - null - [null, null, null, null, null] +10059 - null - [null, null, null, null, null] +10060 - null - [null, null, null, null, null] +10061 - null - [null, null, null, null, null] +10062 - Obstacle net - [null, null, null, null, null] +10063 - Obstacle pipe - [null, null, null, null, null] +10064 - null - [null, null, null, null, null] +10065 - null - [null, null, null, null, null] +10066 - null - [null, null, null, null, null] +10067 - null - [null, null, null, null, null] +10068 - null - [null, null, null, null, null] +10069 - null - [null, null, null, null, null] +10070 - null - [null, null, null, null, null] +10071 - null - [null, null, null, null, null] +10072 - null - [null, null, null, null, null] +10073 - null - [null, null, null, null, null] +10074 - null - [null, null, null, null, null] +10075 - null - [null, null, null, null, null] +10076 - Exercise mat - [Use, null, null, null, null] +10077 - Exercise mat - [Use, null, null, null, null] +10078 - Exercise mat - [Use, null, null, null, null] +10079 - Exercise mat - [Use, null, null, null, null] +10080 - Target - [null, null, null, null, null] +10081 - Tree - [null, null, hidden, null, null] +10082 - Tree - [null, null, hidden, null, null] +10083 - Oak - [null, null, hidden, null, null] +10084 - Hay Bales - [null, null, null, null, null] +10085 - Hay Bales - [null, null, null, null, null] +10086 - Haystack - [null, null, null, null, null] +10087 - Ominous Fishing Spot - [Lure, Bait, null, null, null] +10088 - Ominous Fishing Spot - [Lure, Bait, null, null, null] +10089 - Ominous Fishing Spot - [Lure, Bait, null, null, null] +10090 - Signpost - [Read, null, null, null, null] +10091 - Aquarium - [Fish-In, null, null, null, null] +10092 - null - [null, null, null, null, null] +10093 - Dairy churn - [Churn, null, null, null, null] +10094 - Dairy churn - [Churn, null, null, null, null] +10095 - null - [null, null, null, null, null] +10096 - null - [null, null, null, null, null] +10097 - Blindweed Patch - [null, Inspect, null, null, null] +10098 - Blindweed Patch - [null, Inspect, null, null, null] +10099 - Blindweed Patch - [null, Inspect, null, null, null] +10100 - Blindweed Patch - [null, Inspect, null, null, null] +10101 - Blindweed Patch - [null, Inspect, null, null, null] +10102 - Blindweed Patch - [Pick, Inspect, null, null, null] +10103 - Trashed Patch - [null, Inspect, null, null, null] +10104 - null - [null, null, null, null, null] +10105 - Stagnant Lake - [null, null, null, null, null] +10106 - null - [null, null, null, null, null] +10107 - null - [null, null, null, null, null] +10108 - null - [null, null, null, null, null] +10109 - null - [null, null, null, null, null] +10110 - null - [null, null, null, null, null] +10111 - null - [null, null, null, null, null] +10112 - null - [null, null, null, null, null] +10113 - null - [null, null, null, null, null] +10114 - null - [null, null, null, null, null] +10115 - null - [null, null, null, null, null] +10116 - null - [null, null, null, null, null] +10117 - null - [null, null, null, null, null] +10118 - null - [null, null, null, null, null] +10119 - null - [null, null, null, null, null] +10120 - null - [null, null, null, null, null] +10121 - null - [null, null, null, null, null] +10122 - null - [null, null, null, null, null] +10123 - null - [null, null, null, null, null] +10124 - null - [null, null, null, null, null] +10125 - null - [null, null, null, null, null] +10126 - null - [null, null, null, null, null] +10127 - null - [null, null, null, null, null] +10128 - null - [null, null, null, null, null] +10129 - Chimney Pipe - [null, null, null, null, null] +10130 - null - [null, null, null, null, null] +10131 - null - [null, null, null, null, null] +10132 - null - [null, null, null, null, null] +10133 - null - [null, null, null, null, null] +10134 - null - [null, null, null, null, null] +10135 - null - [null, null, null, null, null] +10136 - Wooden Stair - [Climb-Up, null, null, null, null] +10137 - Wooden Stair - [Climb-Down, null, null, null, null] +10138 - Row boat - [null, null, null, null, null] +10139 - Palm tree - [null, null, null, null, null] +10140 - Palm tree - [null, null, null, null, null] +10141 - Palm tree - [null, null, null, null, null] +10142 - Brewing control - [null, null, null, null, null] +10143 - Brewing control - [null, null, null, null, null] +10144 - Brewing control - [null, null, null, null, null] +10145 - Brewing vat - [null, null, null, null, null] +10146 - Brewing vat - [null, null, null, null, null] +10147 - Brewing vat - [null, null, null, null, null] +10148 - Output Tap - [Turn, null, null, null, null] +10149 - null - [null, null, null, null, null] +10150 - null - [null, null, null, null, null] +10151 - null - [null, null, null, null, null] +10152 - null - [null, null, null, null, null] +10153 - null - [null, null, null, null, null] +10154 - null - [null, null, null, null, null] +10155 - null - [null, null, null, null, null] +10156 - null - [null, null, null, null, null] +10157 - Barrels - [null, null, null, null, null] +10158 - Brewer's Barrel - [null, null, null, null, null] +10159 - Crate - [Search, null, null, null, null] +10160 - Crates - [Search, null, null, null, null] +10161 - Boxes - [null, null, null, null, null] +10162 - Cupboard - [Open, null, null, null, null] +10163 - Open Cupboard - [null, Search, Shut, null, null] +10164 - null - [Pull, null, null, null, null] +10165 - Pressure Lever - [Pull, null, null, null, null] +10166 - Pressure Lever - [Pull, null, null, null, null] +10167 - Ladder - [Climb-up, null, null, null, null] +10168 - Ladder - [Climb-down, null, null, null, null] +10169 - null - [null, null, null, null, null] +10170 - Hopper - [null, null, null, null, null] +10171 - Pressure Barrel - [null, Count, null, null, null] +10172 - Gate - [Open, null, null, null, null] +10173 - null - [null, null, null, null, null] +10174 - Pirate Sign - [null, null, null, null, null] +10175 - Sink - [null, null, null, null, null] +10176 - null - [null, null, null, null, null] +10177 - Iron ladder - [Climb, Climb-up, Climb-down, null, null] +10178 - Standing Torch - [null, null, null, null, null] +10179 - Standing Torch - [null, null, null, null, null] +10180 - null - [null, null, null, null, null] +10181 - null - [null, null, null, null, null] +10182 - null - [null, null, null, null, null] +10183 - null - [null, null, null, null, null] +10184 - null - [null, null, null, null, null] +10185 - null - [null, null, null, null, null] +10186 - null - [null, null, null, null, null] +10187 - null - [null, null, null, null, null] +10188 - null - [null, null, null, null, null] +10189 - null - [null, null, null, null, null] +10190 - null - [null, null, null, null, null] +10191 - null - [null, null, null, null, null] +10192 - null - [null, null, null, null, null] +10193 - Ladder - [Climb-up, null, null, null, null] +10194 - Ladder - [Climb-up, null, null, null, null] +10195 - Ladder - [Climb-down, null, null, null, null] +10196 - Ladder - [Climb-up, null, null, null, null] +10197 - Ladder - [Climb-down, null, null, null, null] +10198 - Ladder - [Climb-up, null, null, null, null] +10199 - Ladder - [Climb-down, null, null, null, null] +10200 - Ladder - [Climb-up, null, null, null, null] +10201 - Ladder - [Climb-down, null, null, null, null] +10202 - Ladder - [Climb-up, null, null, null, null] +10203 - Ladder - [Climb-up, null, null, null, null] +10204 - Ladder - [Climb-down, null, null, null, null] +10205 - Ladder - [Climb-down, null, null, null, null] +10206 - Ladder - [Climb-up, null, null, null, null] +10207 - Ladder - [Climb-up, null, null, null, null] +10208 - Ladder - [Climb-down, null, null, null, null] +10209 - Ladder - [Climb-down, null, null, null, null] +10210 - Ladder - [Climb-up, null, null, null, null] +10211 - Ladder - [Climb-up, null, null, null, null] +10212 - Ladder - [Climb-down, null, null, null, null] +10213 - Ladder - [Climb-down, null, null, null, null] +10214 - Ladder - [Climb-up, null, null, null, null] +10215 - Ladder - [Climb-down, null, null, null, null] +10216 - Ladder - [Climb-up, null, null, null, null] +10217 - Ladder - [Climb-up, null, null, null, null] +10218 - Ladder - [Climb-down, null, null, null, null] +10219 - Ladder - [Climb-up, null, null, null, null] +10220 - Ladder - [Climb-down, null, null, null, null] +10221 - Ladder - [Climb-down, null, null, null, null] +10222 - Ladder - [Climb-up, null, null, null, null] +10223 - Ladder - [Climb-down, null, null, null, null] +10224 - Ladder - [Climb-up, null, null, null, null] +10225 - Ladder - [Climb-down, null, null, null, null] +10226 - Ladder - [Climb-up, null, null, null, null] +10227 - Ladder - [Climb-down, null, null, null, null] +10228 - Ladder - [Climb-up, null, null, null, null] +10229 - Ladder - [Climb-up, null, null, null, null] +10230 - Ladder - [Climb-down, null, null, null, null] +10231 - null - [null, null, null, null, null] +10232 - null - [null, null, null, null, null] +10233 - null - [null, null, null, null, null] +10234 - null - [null, null, null, null, null] +10235 - null - [null, null, null, null, null] +10236 - null - [null, null, null, null, null] +10237 - null - [null, null, null, null, null] +10238 - null - [null, null, null, null, null] +10239 - null - [null, null, null, null, null] +10240 - null - [null, null, null, null, null] +10241 - null - [null, null, null, null, null] +10242 - null - [null, null, null, null, null] +10243 - null - [null, null, null, null, null] +10244 - null - [null, null, null, null, null] +10245 - null - [null, null, null, null, null] +10246 - Broken kiln - [Look-in, null, null, null, null] +10247 - Broken kiln - [Look-in, null, null, null, null] +10248 - Broken kiln - [Look-in, null, null, null, null] +10249 - null - [null, null, null, null, null] +10250 - Eric - [null, null, null, null, null] +10251 - Portal - [Enter, null, null, null, null] +10252 - Magic circle - [null, null, null, null, null] +10253 - Standard - [null, null, null, null, null] +10254 - null - [null, null, null, null, null] +10255 - Bed - [null, null, null, null, null] +10256 - Shelf - [null, null, null, null, null] +10257 - Shelf - [null, null, null, null, null] +10258 - Table - [null, null, null, null, null] +10259 - Chair - [null, null, null, null, null] +10260 - Door - [Open, null, null, null, null] +10261 - Door - [Close, null, null, null, null] +10262 - Door - [Open, null, null, null, null] +10263 - Door - [Close, null, null, null, null] +10264 - Door - [Open, null, null, null, null] +10265 - Door - [Close, null, null, null, null] +10266 - null - [null, null, null, null, null] +10267 - Shield Display - [Study, null, null, null, null] +10268 - null - [null, null, null, null, null] +10269 - Large Display - [Study, null, null, null, null] +10270 - null - [null, null, null, null, null] +10271 - Large Display - [Study, null, null, null, null] +10272 - null - [null, null, null, null, null] +10273 - Bookcase - [Study, null, null, null, null] +10274 - Sacks - [null, null, null, null, null] +10275 - null - [null, null, null, null, null] +10276 - null - [null, null, null, null, null] +10277 - null - [null, null, null, null, null] +10278 - Catapult - [null, null, null, null, null] +10279 - Crates - [null, null, null, null, null] +10280 - Crates - [null, null, null, null, null] +10281 - Crate - [null, null, null, null, null] +10282 - Crates - [null, null, null, null, null] +10283 - River - [Swim, null, null, null, null] +10284 - null - [null, null, null, null, null] +10285 - null - [null, null, null, null, null] +10286 - Sack - [null, null, null, null, null] +10287 - Stairs - [Climb-up, null, null, null, null] +10288 - Stairs - [Climb-down, null, null, null, null] +10289 - null - [null, null, null, null, null] +10290 - Rat trap - [Take, null, null, null, null] +10291 - Rat trap - [Take, null, null, null, null] +10292 - Rat trap - [null, null, null, null, null] +10293 - Barrel - [null, null, null, null, null] +10294 - Barrel - [null, null, null, null, null] +10295 - Bar pumps - [null, null, null, null, null] +10296 - Stool - [null, null, null, null, null] +10297 - null - [null, null, null, null, null] +10298 - Crates - [null, null, null, null, null] +10299 - Rat lever - [null, null, null, null, null] +10300 - Rat barn - [null, null, null, null, null] +10301 - Rat barrel - [null, null, null, null, null] +10302 - Rat barrel - [null, null, null, null, null] +10303 - Rat barrel - [null, null, null, null, null] +10304 - Sacks - [null, null, null, null, null] +10305 - Sack - [null, null, null, null, null] +10306 - Sack - [null, null, null, null, null] +10307 - Lantern - [null, null, null, null, null] +10308 - Ladder - [Climb-down, null, null, null, null] +10309 - Ladder - [Climb-up, null, null, null, null] +10310 - Rat barrel - [null, null, null, null, null] +10311 - Rat lever - [null, null, null, null, null] +10312 - Rat barn - [null, null, null, null, null] +10313 - Sacks - [null, null, null, null, null] +10314 - Sack - [null, null, null, null, null] +10315 - Sack - [null, null, null, null, null] +10316 - Rat barrel - [null, null, null, null, null] +10317 - Rat barrel - [null, null, null, null, null] +10318 - Gates - [Open, null, null, null, null] +10319 - Trellis top - [Climb-down, null, null, null, null] +10320 - Hole in wall - [null, null, null, null, null] +10321 - Manhole - [Climb-down, null, null, null, null] +10322 - Ladder - [Climb-down, null, null, null, null] +10323 - Trellis - [Climb-up, Look-up, null, null, null] +10324 - Trellis - [null, null, null, null, null] +10325 - Door - [Open, null, null, null, null] +10326 - Door - [null, null, null, null, null] +10327 - Door - [Close, null, null, null, null] +10328 - null - [null, null, null, null, null] +10329 - null - [null, null, null, null, null] +10330 - null - [null, null, null, null, null] +10331 - null - [null, null, null, null, null] +10332 - null - [null, null, null, null, null] +10333 - null - [null, null, null, null, null] +10334 - null - [null, null, null, null, null] +10335 - Rat wall - [Spectate, null, null, null, null] +10336 - Rat wall - [Spectate, null, null, null, null] +10337 - Rat wall - [Spectate, null, null, null, null] +10338 - Rat wall - [Spectate, null, null, null, null] +10339 - null - [null, null, null, null, null] +10340 - null - [null, null, null, null, null] +10341 - null - [null, null, null, null, null] +10342 - Rat Wall - [Spectate, null, null, null, null] +10343 - Rat Wall - [Spectate, null, null, null, null] +10344 - Rat Wall - [Spectate, null, null, null, null] +10345 - Rat Wall - [Spectate, null, null, null, null] +10346 - Rat hole - [null, null, null, null, null] +10347 - Rat hole - [null, null, null, null, null] +10348 - Rat hole - [null, null, null, null, null] +10349 - Rat hole - [null, null, null, null, null] +10350 - Rat hole - [null, null, null, null, null] +10351 - null - [null, null, null, null, null] +10352 - null - [null, null, null, null, null] +10353 - null - [null, null, null, null, null] +10354 - null - [null, null, null, null, null] +10355 - null - [null, null, null, null, null] +10356 - null - [null, null, null, null, null] +10357 - null - [null, null, null, null, null] +10358 - Bed - [null, null, null, null, null] +10359 - Bed - [null, null, null, null, null] +10360 - Rolled up rugs - [null, null, null, null, null] +10361 - Door - [null, null, null, null, null] +10362 - Hay Bales - [null, null, null, null, null] +10363 - null - [null, null, null, null, null] +10364 - null - [null, null, null, null, null] +10365 - null - [null, null, null, null, null] +10366 - null - [null, null, null, null, null] +10367 - null - [null, null, null, null, null] +10368 - null - [null, null, null, null, null] +10369 - null - [null, null, null, null, null] +10370 - null - [null, null, null, null, null] +10371 - Barrel - [null, null, null, null, null] +10372 - null - [null, null, null, null, null] +10373 - null - [null, null, null, null, null] +10374 - Crates - [null, null, null, null, null] +10375 - Tools - [Take, null, null, null, null] +10376 - Choc-Ice Stall - [null, null, null, null, null] +10377 - Clay Oven - [null, null, null, null, null] +10378 - Crate - [Search, null, null, null, null] +10379 - Crates - [Search, null, null, null, null] +10380 - Boxes - [Search, null, null, null, null] +10381 - Crates - [Search, null, null, null, null] +10382 - Cupboard - [Open, null, null, null, null] +10383 - Cupboard - [null, Search, Shut, null, null] +10384 - Cupboard - [Open, null, null, null, null] +10385 - Cupboard - [null, Search, Shut, null, null] +10386 - Cupboard - [null, Search, Shut, null, null] +10387 - Cupboard - [null, Search, Shut, null, null] +10388 - null - [null, null, null, null, null] +10389 - null - [null, null, null, null, null] +10390 - null - [null, null, null, null, null] +10391 - null - [null, null, null, null, null] +10392 - null - [null, null, null, null, null] +10393 - null - [null, null, null, null, null] +10394 - null - [null, null, null, null, null] +10395 - null - [null, null, null, null, null] +10396 - null - [null, null, null, null, null] +10397 - null - [null, null, null, null, null] +10398 - null - [null, null, null, null, null] +10399 - null - [null, null, null, null, null] +10400 - null - [null, null, null, null, null] +10401 - null - [null, null, null, null, null] +10402 - Water Channel - [null, null, null, null, null] +10403 - null - [null, null, null, null, null] +10404 - Water Channel - [null, null, null, null, null] +10405 - Water Channel - [Clear, null, hidden, null, null] +10406 - Water Channel - [null, null, null, null, null] +10407 - Water Channel - [Clear, null, null, null, null] +10408 - Water Channel - [null, null, null, null, null] +10409 - Water Channel - [null, null, null, null, null] +10410 - Water Channel - [null, null, null, null, null] +10411 - null - [null, null, null, null, null] +10412 - Hole - [null, null, null, null, null] +10413 - Bed - [null, null, null, null, null] +10414 - Table - [null, null, null, null, null] +10415 - Rolled up rugs - [null, null, null, null, null] +10416 - Crevice - [Climb-down, null, null, null, null] +10417 - Cave exit - [Leave, null, null, null, null] +10418 - Door - [Open, null, null, null, null] +10419 - Door - [Open, null, null, null, null] +10420 - Door - [Open, null, null, null, null] +10421 - Door - [Open, null, null, null, null] +10422 - null - [null, null, null, null, null] +10423 - Door - [Open, null, null, null, null] +10424 - null - [null, null, null, null, null] +10425 - Door - [Open, null, null, null, null] +10426 - null - [null, null, null, null, null] +10427 - Door - [Open, null, null, null, null] +10428 - null - [null, null, null, null, null] +10429 - Door - [Open, null, null, null, null] +10430 - null - [null, null, null, null, null] +10431 - Door - [Open, null, null, null, null] +10432 - null - [null, null, null, null, null] +10433 - Fire - [null, null, null, null, null] +10434 - Rope - [Climb, null, null, null, null] +10435 - null - [null, null, null, null, null] +10436 - Fountain - [null, null, null, null, null] +10437 - Fountain - [null, null, null, null, null] +10438 - Statuette Plinth - [null, null, null, null, null] +10439 - Elidinis Statuette - [Pray-at, null, null, null, null] +10440 - Rock Chair - [null, null, null, null, null] +10441 - null - [null, null, null, null, null] +10442 - null - [null, null, null, null, null] +10443 - null - [null, null, null, null, null] +10444 - null - [null, null, null, null, null] +10445 - null - [null, null, null, null, null] +10446 - null - [null, null, null, null, null] +10447 - null - [null, null, null, null, null] +10448 - null - [null, null, null, null, null] +10449 - null - [null, null, null, null, null] +10450 - null - [null, null, null, null, null] +10451 - null - [null, null, null, null, null] +10452 - null - [null, null, null, null, null] +10453 - null - [null, null, null, null, null] +10454 - null - [null, null, null, null, null] +10455 - null - [null, null, null, null, null] +10456 - null - [null, null, null, null, null] +10457 - Cart - [null, null, null, null, null] +10458 - Barrel - [null, null, null, null, null] +10459 - null - [null, null, null, null, null] +10460 - null - [null, null, null, null, null] +10461 - null - [null, null, null, null, null] +10462 - null - [null, null, null, null, null] +10463 - null - [null, null, null, null, null] +10464 - null - [null, null, null, null, null] +10465 - null - [null, null, null, null, null] +10466 - null - [null, null, null, null, null] +10467 - null - [null, null, null, null, null] +10468 - null - [null, null, null, null, null] +10469 - null - [null, null, null, null, null] +10470 - null - [null, null, null, null, null] +10471 - null - [null, null, null, null, null] +10472 - null - [null, null, null, null, null] +10473 - null - [null, null, null, null, null] +10474 - null - [null, null, null, null, null] +10475 - null - [null, null, null, null, null] +10476 - null - [null, null, null, null, null] +10477 - null - [null, null, null, null, null] +10478 - null - [null, null, null, null, null] +10479 - null - [null, null, null, null, null] +10480 - null - [null, null, null, null, null] +10481 - null - [null, null, null, null, null] +10482 - null - [null, null, null, null, null] +10483 - null - [null, null, null, null, null] +10484 - null - [null, null, null, null, null] +10485 - Counter - [null, null, null, null, null] +10486 - Counter - [null, null, null, null, null] +10487 - Blacksmith's tools - [null, null, null, null, null] +10488 - null - [null, null, null, null, null] +10489 - Armour - [null, null, null, null, null] +10490 - Table - [null, null, null, null, null] +10491 - Chair - [null, null, null, null, null] +10492 - Chair - [null, null, null, null, null] +10493 - Ladder - [Climb-up, null, null, null, null] +10494 - Ladder - [Climb-down, null, null, null, null] +10495 - Warehouse shelves - [null, null, null, null, null] +10496 - Warehouse shelves - [null, null, null, null, null] +10497 - Warehouse shelves - [null, null, null, null, null] +10498 - Warehouse shelves - [null, null, null, null, null] +10499 - Potted fern - [null, null, null, null, null] +10500 - Potted fern - [null, null, null, null, null] +10501 - Potted fern - [null, null, null, null, null] +10502 - Potted fern - [null, null, null, null, null] +10503 - Pile of bricks - [null, null, null, null, null] +10504 - Cooking Pots - [null, null, null, null, null] +10505 - Cooking Pots - [null, null, null, null, null] +10506 - Shelf - [null, null, null, null, null] +10507 - null - [null, null, null, null, null] +10508 - Stone Pew - [null, null, null, null, null] +10509 - Table - [null, null, null, null, null] +10510 - Bookcase - [null, null, null, null, null] +10511 - Bed - [null, null, null, null, null] +10512 - Bed - [null, null, null, null, null] +10513 - Shelves - [null, null, null, null, null] +10514 - Shelves - [null, null, null, null, null] +10515 - null - [null, null, null, null, null] +10516 - Wheelbarrow - [null, null, null, null, null] +10517 - Bank booth - [Use, Use-quickly, Collect, null, null] +10518 - Closed bank booth - [null, null, null, null, null] +10519 - null - [null, null, null, null, null] +10520 - null - [null, null, null, null, null] +10521 - Chalice - [null, null, null, null, null] +10522 - Tapestry - [null, null, null, null, null] +10523 - null - [null, null, null, null, null] +10524 - null - [null, null, null, null, null] +10525 - Staircase - [Climb-up, null, null, null, null] +10526 - Staircase - [Climb-down, null, null, null, null] +10527 - Door - [Open, null, null, null, null] +10528 - Door - [Close, null, null, null, null] +10529 - Door - [Open, null, null, null, null] +10530 - Door - [Close, null, null, null, null] +10531 - null - [null, null, null, null, null] +10532 - null - [null, null, null, null, null] +10533 - null - [null, null, null, null, null] +10534 - null - [null, null, null, null, null] +10535 - null - [null, null, null, null, null] +10536 - null - [null, null, null, null, null] +10537 - null - [null, null, null, null, null] +10538 - null - [null, null, null, null, null] +10539 - null - [null, null, null, null, null] +10540 - null - [null, null, null, null, null] +10541 - Human Flag - [null, null, null, null, null] +10542 - Human Flag - [null, null, null, null, null] +10543 - Dwarf Flag - [null, null, null, null, null] +10544 - Dwarf Flag - [null, null, null, null, null] +10545 - Elf Flag - [null, null, null, null, null] +10546 - Elf Flag - [null, null, null, null, null] +10547 - Gnome Flag - [null, null, null, null, null] +10548 - Gnome Flag - [null, null, null, null, null] +10549 - Werewolf Flag - [null, null, null, null, null] +10550 - Werewolf Flag - [null, null, null, null, null] +10551 - TzHaar Flag - [null, null, null, null, null] +10552 - TzHaar Flag - [null, null, null, null, null] +10553 - Portcullis - [Open, null, null, null, null] +10554 - Ladder - [Climb-up, null, null, null, null] +10555 - null - [null, null, null, null, null] +10556 - Champion Statue - [Open, null, null, null, null] +10557 - Champion Statue - [Climb-down, null, null, null, null] +10558 - Trapdoor - [Open, null, null, null, null] +10559 - Trapdoor - [Climb-down, Close, null, null, null] +10560 - Ladder - [Climb-up, null, null, null, null] +10561 - null - [null, null, null, null, null] +10562 - Bank chest - [Use, null, null, null, null] +10563 - null - [null, null, null, null, null] +10564 - Banner - [null, null, null, null, null] +10565 - null - [null, null, null, null, null] +10566 - Banner - [null, null, null, null, null] +10567 - null - [null, null, null, null, null] +10568 - Banner - [null, null, null, null, null] +10569 - null - [null, null, null, null, null] +10570 - Banner - [null, null, null, null, null] +10571 - null - [null, null, null, null, null] +10572 - Banner - [null, null, null, null, null] +10573 - null - [null, null, null, null, null] +10574 - Banner - [null, null, null, null, null] +10575 - null - [null, null, null, null, null] +10576 - Banner - [null, null, null, null, null] +10577 - null - [null, null, null, null, null] +10578 - Banner - [null, null, null, null, null] +10579 - null - [null, null, null, null, null] +10580 - Banner - [null, null, null, null, null] +10581 - null - [null, null, null, null, null] +10582 - Banner - [null, null, null, null, null] +10583 - Rocks - [Mine, Prospect, hidden, null, null] +10584 - Rocks - [Mine, Prospect, hidden, null, null] +10585 - Rocks - [Mine, Prospect, hidden, null, null] +10586 - Rocks - [Mine, Prospect, hidden, null, null] +10587 - Rocks - [Mine, Prospect, hidden, null, null] +10588 - null - [null, null, null, null, null] +10589 - null - [null, null, null, null, null] +10590 - null - [null, null, null, null, null] +10591 - null - [null, null, null, null, null] +10592 - null - [null, null, null, null, null] +10593 - null - [null, null, null, null, null] +10594 - null - [null, null, null, null, null] +10595 - Icy Cavern - [Enter, null, null, null, null] +10596 - Icy Cavern - [Enter, null, null, null, null] +10597 - null - [null, null, null, null, null] +10598 - null - [null, null, null, null, null] +10599 - null - [null, null, null, null, null] +10600 - null - [null, null, null, null, null] +10601 - null - [null, null, null, null, null] +10602 - null - [null, null, null, null, null] +10603 - null - [null, null, null, null, null] +10604 - null - [null, null, null, null, null] +10605 - Danger Sign - [null, null, null, null, null] +10606 - - [null, null, null, null, null] +10607 - Bronze Chest - [null, null, null, null, null] +10608 - Bronze Chest - [null, null, null, null, null] +10609 - Bronze Chest - [null, null, null, null, null] +10610 - Bronze Chest - [null, null, null, null, null] +10611 - Steel Chest - [null, null, null, null, null] +10612 - Steel Chest - [null, null, null, null, null] +10613 - Steel Chest - [null, null, null, null, null] +10614 - Steel Chest - [null, null, null, null, null] +10615 - Steel Chest - [null, null, null, null, null] +10616 - Black Chest - [null, null, null, null, null] +10617 - Black Chest - [null, null, null, null, null] +10618 - Black Chest - [null, null, null, null, null] +10619 - Black Chest - [null, null, null, null, null] +10620 - Black Chest - [null, null, null, null, null] +10621 - Silver Chest - [null, null, null, null, null] +10622 - Silver Chest - [null, null, null, null, null] +10623 - Silver Chest - [null, null, null, null, null] +10624 - Silver Chest - [null, null, null, null, null] +10625 - Silver Chest - [null, null, null, null, null] +10626 - null - [null, null, null, null, null] +10627 - null - [null, null, null, null, null] +10628 - null - [null, null, null, null, null] +10629 - null - [null, null, null, null, null] +10630 - null - [null, null, null, null, null] +10631 - null - [null, null, null, null, null] +10632 - null - [null, null, null, null, null] +10633 - null - [null, null, null, null, null] +10634 - null - [null, null, null, null, null] +10635 - null - [null, null, null, null, null] +10636 - null - [null, null, null, null, null] +10637 - null - [null, null, null, null, null] +10638 - null - [null, null, null, null, null] +10639 - Altar - [Pray-at, null, null, null, null] +10640 - Altar - [Pray-at, null, null, null, null] +10641 - Doric's Whetstone - [null, null, null, null, null] +10642 - null - [null, null, null, null, null] +10643 - null - [null, null, null, null, null] +10644 - null - [null, null, null, null, null] +10645 - null - [null, null, null, null, null] +10646 - null - [null, null, null, null, null] +10647 - null - [null, null, null, null, null] +10648 - null - [null, null, null, null, null] +10649 - null - [null, null, null, null, null] +10650 - null - [null, null, null, null, null] +10651 - null - [null, null, null, null, null] +10652 - Evergreen. - [null, null, null, null, null] +10653 - Evergreen. - [null, null, null, null, null] +10654 - Evergreen. - [null, null, null, null, null] +10655 - Evergreen. - [null, null, null, null, null] +10656 - Evergreen. - [null, null, null, null, null] +10657 - Evergreen. - [null, null, null, null, null] +10658 - Evergreen. - [null, null, null, null, null] +10659 - Evergreen. - [null, null, null, null, null] +10660 - Evergreen. - [null, null, null, null, null] +10661 - Evergreen. - [null, null, null, null, null] +10662 - Evergreen. - [null, null, null, null, null] +10663 - Evergreen. - [null, null, null, null, null] +10664 - Tree - [null, null, null, null, null] +10665 - Gifts - [null, null, null, null, null] +10666 - Gifts - [Unwrap presents, null, null, null, null] +10667 - null - [null, null, null, null, null] +10668 - null - [null, null, null, null, null] +10669 - null - [null, null, null, null, null] +10670 - null - [null, null, null, null, null] +10671 - Crate - [null, null, null, null, null] +10672 - Crate - [Take-marionette, null, null, null, null] +10673 - Paintcans - [Paint-bauble, null, null, null, null] +10674 - Paintcans - [Paint-bauble, null, null, null, null] +10675 - Paintcans - [Paint-bauble, null, null, null, null] +10676 - Workbench - [null, null, null, null, null] +10677 - Workbench - [null, null, null, null, null] +10678 - Workbench - [null, null, null, null, null] +10679 - Decorations Box - [Take-decoration, null, null, null, null] +10680 - Decorations Box - [Take-decoration, null, null, null, null] +10681 - Decorations Box - [Take-decoration, null, null, null, null] +10682 - Decorations Box - [Take-decoration, null, null, null, null] +10683 - Decorations Box - [Take-decoration, null, null, null, null] +10684 - Decorations Box - [Take-decoration, null, null, null, null] +10685 - Decorations Box - [Take-decoration, null, null, null, null] +10686 - Puppet heads - [Add, null, null, null, null] +10687 - Puppet torsos - [Take, null, null, null, null] +10688 - Puppet arms - [Add, null, null, null, null] +10689 - Puppet legs - [Add, null, null, null, null] +10690 - Puppet heads - [Add, null, null, null, null] +10691 - Puppet torsos - [Take, null, null, null, null] +10692 - Puppet arms - [Add, null, null, null, null] +10693 - Puppet legs - [Add, null, null, null, null] +10694 - Puppet heads - [Add, null, null, null, null] +10695 - Puppet torsos - [Take, null, null, null, null] +10696 - Puppet arms - [Add, null, null, null, null] +10697 - Puppet legs - [Add, null, null, null, null] +10698 - Trapdoor - [Climb-down, null, null, null, null] +10699 - Trapdoor Steps - [Climb-up, null, null, null, null] +10700 - null - [null, null, null, null, null] +10701 - Crate - [null, null, null, null, null] +10702 - Crate - [null, null, null, null, null] +10703 - Crate - [null, null, null, null, null] +10704 - Crate - [null, null, null, null, null] +10705 - Crates - [null, null, null, null, null] +10706 - Large Box - [null, null, null, null, null] +10707 - Ladder - [Climb-up, null, null, null, null] +10708 - Ladder - [Climb-down, null, null, null, null] +10709 - null - [null, null, null, null, null] +10710 - Paint Pots - [null, null, null, null, null] +10711 - null - [null, null, null, null, null] +10712 - null - [null, null, null, null, null] +10713 - null - [null, null, null, null, null] +10714 - null - [null, null, null, null, null] +10715 - null - [null, null, null, null, null] +10716 - null - [null, null, null, null, null] +10717 - null - [null, null, null, null, null] +10718 - null - [null, null, null, null, null] +10719 - null - [null, null, null, null, null] +10720 - null - [null, null, null, null, null] +10721 - Doorway - [Enter, null, null, null, null] +10722 - Old Bookshelf - [Search, null, null, null, null] +10723 - Old Bookshelf - [Search, null, null, null, null] +10724 - Chair - [null, null, null, null, null] +10725 - Bones - [Grab, null, null, null, null] +10726 - Bones - [Grab, null, null, null, null] +10727 - Bones - [Grab, null, null, null, null] +10728 - Bones - [Grab, null, null, null, null] +10729 - null - [null, null, null, null, null] +10730 - null - [null, null, null, null, null] +10731 - null - [null, null, null, null, null] +10732 - null - [null, null, null, null, null] +10733 - Portal - [null, null, null, null, null] +10734 - Coin Collector - [Deposit, null, null, null, null] +10735 - Food chute - [Deposit, null, null, null, null] +10736 - Statue - [null, null, null, null, null] +10737 - Statue - [null, null, null, null, null] +10738 - Statue - [null, null, null, null, null] +10739 - Statue - [null, null, null, null, null] +10740 - null - [null, null, null, null, null] +10741 - null - [null, null, null, null, null] +10742 - null - [null, null, null, null, null] +10743 - null - [null, null, null, null, null] +10744 - null - [null, null, null, null, null] +10745 - null - [null, null, null, null, null] +10746 - null - [null, null, null, null, null] +10747 - null - [null, null, null, null, null] +10748 - null - [null, null, null, null, null] +10749 - null - [null, null, null, null, null] +10750 - null - [null, null, null, null, null] +10751 - null - [null, null, null, null, null] +10752 - null - [null, null, null, null, null] +10753 - null - [null, null, null, null, null] +10754 - null - [null, null, null, null, null] +10755 - null - [null, null, null, null, null] +10756 - null - [null, null, null, null, null] +10757 - null - [null, null, null, null, null] +10758 - null - [null, null, null, null, null] +10759 - null - [null, null, null, null, null] +10760 - null - [null, null, null, null, null] +10761 - null - [null, null, null, null, null] +10762 - null - [null, null, null, null, null] +10763 - null - [null, null, null, null, null] +10764 - null - [null, null, null, null, null] +10765 - null - [null, null, null, null, null] +10766 - null - [null, null, null, null, null] +10767 - null - [null, null, null, null, null] +10768 - Bank - [null, null, null, null, null] +10769 - null - [null, null, null, null, null] +10770 - null - [null, null, null, null, null] +10771 - Stairs - [Climb-up, null, null, null, null] +10772 - Stairs - [Climb, null, null, null, null] +10773 - Stairs - [Climb-down, null, null, null, null] +10774 - Stairs - [Climb-down, null, null, null, null] +10775 - Stairs - [Climb-up, null, null, null, null] +10776 - Stairs - [Climb-down, null, null, null, null] +10777 - null - [null, null, null, null, null] +10778 - Telekinetic Teleport - [Enter, null, null, null, null] +10779 - Enchanters Teleport - [Enter, null, null, null, null] +10780 - Alchemists Teleport - [Enter, null, null, null, null] +10781 - Graveyard Teleport - [Enter, null, null, null, null] +10782 - Exit Teleport - [Enter, null, null, null, null] +10783 - Cupboard - [Search, null, null, null, null] +10784 - Cupboard - [Search, null, null, null, null] +10785 - Cupboard - [Search, null, null, null, null] +10786 - Cupboard - [Search, null, null, null, null] +10787 - Cupboard - [Search, null, null, null, null] +10788 - Cupboard - [Search, null, null, null, null] +10789 - Cupboard - [Search, null, null, null, null] +10790 - Cupboard - [Search, null, null, null, null] +10791 - Cupboard - [Search, null, null, null, null] +10792 - Cupboard - [Search, null, null, null, null] +10793 - Cupboard - [Search, null, null, null, null] +10794 - Cupboard - [Search, null, null, null, null] +10795 - Cupboard - [Search, null, null, null, null] +10796 - Cupboard - [Search, null, null, null, null] +10797 - Cupboard - [Search, null, null, null, null] +10798 - Cupboard - [Search, null, null, null, null] +10799 - Cube Pile - [Take-from, null, null, null, null] +10800 - Cylinder Pile - [Take-from, null, null, null, null] +10801 - Icosahedron Pile - [Take-from, null, null, null, null] +10802 - Pentamid Pile - [Take-from, null, null, null, null] +10803 - Hole - [Deposit, null, null, null, null] +10804 - Trapdoor - [Climb-down, null, null, null, null] +10805 - Sandy's Desk - [Search, null, null, null, null] +10806 - null - [null, null, null, null, null] +10807 - Sandy's Coffee Mug - [null, null, null, null, null] +10808 - Table - [null, null, null, null, null] +10809 - Waste Paper Bin - [null, null, null, null, null] +10810 - null - [null, null, null, null, null] +10811 - null - [null, null, null, null, null] +10812 - null - [null, null, null, null, null] +10813 - Counter - [null, null, null, null, null] +10814 - Sandpit - [null, null, null, null, null] +10815 - null - [null, null, null, null, null] +10816 - null - [null, null, null, null, null] +10817 - Lever - [Pull, null, null, null, null] +10818 - Locked door - [Open, null, null, null, null] +10819 - Locked door - [Open, null, null, null, null] +10820 - Energy Barrier - [null, null, null, null, null] +10821 - null - [null, null, null, null, null] +10822 - null - [null, null, null, null, null] +10823 - null - [null, null, null, null, null] +10824 - Fireplace - [null, null, null, null, null] +10825 - null - [null, null, null, null, null] +10826 - null - [null, null, null, null, null] +10827 - Fountain - [null, null, null, null, null] +10828 - Trawler net - [null, null, null, null, null] +10829 - Trawler net - [null, null, null, null, null] +10830 - Trawler net - [null, null, null, null, null] +10831 - Trawler net - [null, null, null, null, null] +10832 - Trawler net - [null, null, null, null, null] +10833 - Trawler net - [null, null, null, null, null] +10834 - Trawler net - [null, null, null, null, null] +10835 - Trawler net - [null, null, null, null, null] +10836 - Trawler net - [null, null, null, null, null] +10837 - null - [null, null, null, null, null] +10838 - null - [null, null, null, null, null] +10839 - null - [null, null, null, null, null] +10840 - null - [null, null, null, null, null] +10841 - null - [null, null, null, null, null] +10842 - null - [null, null, null, null, null] +10843 - null - [null, null, null, null, null] +10844 - null - [null, null, null, null, null] +10845 - null - [null, null, null, null, null] +10846 - null - [null, null, null, null, null] +10847 - null - [null, null, null, null, null] +10848 - Doorway - [null, null, null, null, null] +10849 - Doorway - [null, null, null, null, null] +10850 - null - [null, null, null, null, null] +10851 - Climbing rocks - [Climb, null, null, null, null] +10852 - Climbing rocks - [Climb, null, null, null, null] +10853 - null - [null, null, null, null, null] +10854 - null - [null, null, null, null, null] +10855 - Doorway - [Enter, null, null, null, null] +10856 - Doorway - [Enter, null, null, null, null] +10857 - Stairs - [Climb-up, null, null, null, null] +10858 - Stairs - [Climb-down, null, null, null, null] +10859 - Gap - [Jump, null, null, null, null] +10860 - Ledge - [Cross, null, null, null, null] +10861 - Gap - [Cross, null, null, null, null] +10862 - Gap - [Cross, null, null, null, null] +10863 - Gap - [Cross, null, null, null, null] +10864 - Gap - [Cross, null, null, null, null] +10865 - Low wall - [Climb-over, null, null, null, null] +10866 - null - [null, null, null, null, null] +10867 - Plank - [Cross, null, null, null, null] +10868 - Plank - [Cross, null, null, null, null] +10869 - null - [null, null, null, null, null] +10870 - null - [null, null, null, null, null] +10871 - null - [null, null, null, null, null] +10872 - null - [null, null, null, null, null] +10873 - null - [null, null, null, null, null] +10874 - null - [null, null, null, null, null] +10875 - Stone block - [null, null, null, null, null] +10876 - Stone block - [null, null, null, null, null] +10877 - null - [null, null, null, null, null] +10878 - null - [null, null, null, null, null] +10879 - null - [null, null, null, null, null] +10880 - null - [null, null, null, null, null] +10881 - null - [null, null, null, null, null] +10882 - Gap - [Cross, null, null, null, null] +10883 - Gap - [Cross, null, null, null, null] +10884 - Gap - [Cross, null, null, null, null] +10885 - Gap - [Cross, null, null, null, null] +10886 - Ledge - [Cross, null, null, null, null] +10887 - Ledge - [Cross, null, null, null, null] +10888 - Ledge - [Cross, null, null, null, null] +10889 - Ledge - [Cross, null, null, null, null] +10890 - null - [null, null, null, null, null] +10891 - null - [null, null, null, null, null] +10892 - null - [null, null, null, null, null] +10893 - null - [null, null, null, null, null] +10894 - null - [null, null, null, null, null] +10895 - null - [null, null, null, null, null] +10896 - null - [null, null, null, null, null] +10897 - null - [null, null, null, null, null] +10898 - null - [null, null, null, null, null] +10899 - null - [null, null, null, null, null] +10900 - null - [null, null, null, null, null] +10901 - null - [null, null, null, null, null] +10902 - null - [null, null, null, null, null] +10903 - null - [null, null, null, null, null] +10904 - null - [null, null, null, null, null] +10905 - null - [null, null, null, null, null] +10906 - null - [null, null, null, null, null] +10907 - null - [null, null, null, null, null] +10908 - null - [null, null, null, null, null] +10909 - null - [null, null, null, null, null] +10910 - null - [null, null, null, null, null] +10911 - null - [null, null, null, null, null] +10912 - null - [null, null, null, null, null] +10913 - null - [null, null, null, null, null] +10914 - null - [null, null, null, null, null] +10915 - null - [null, null, null, null, null] +10916 - null - [null, null, null, null, null] +10917 - null - [null, null, null, null, null] +10918 - null - [null, null, null, null, null] +10919 - null - [null, null, null, null, null] +10920 - null - [null, null, null, null, null] +10921 - null - [null, null, null, null, null] +10922 - null - [null, null, null, null, null] +10923 - null - [null, null, null, null, null] +10924 - null - [null, null, null, null, null] +10925 - null - [null, null, null, null, null] +10926 - null - [null, null, null, null, null] +10927 - null - [null, null, null, null, null] +10928 - null - [null, null, null, null, null] +10929 - null - [null, null, null, null, null] +10930 - null - [null, null, null, null, null] +10931 - null - [null, null, null, null, null] +10932 - null - [null, null, null, null, null] +10933 - null - [null, null, null, null, null] +10934 - null - [null, null, null, null, null] +10935 - null - [null, null, null, null, null] +10936 - null - [null, null, null, null, null] +10937 - null - [null, null, null, null, null] +10938 - null - [null, null, null, null, null] +10939 - null - [null, null, null, null, null] +10940 - null - [null, null, null, null, null] +10941 - null - [null, null, null, null, null] +10942 - null - [null, null, null, null, null] +10943 - null - [null, null, null, null, null] +10944 - Rocks - [Mine, Prospect, hidden, null, null] +10945 - Rocks - [Mine, Prospect, hidden, null, null] +10946 - Rocks - [Mine, Prospect, hidden, null, null] +10947 - Rocks - [Mine, Prospect, hidden, null, null] +10948 - Rocks - [Mine, Prospect, hidden, null, null] +10949 - Rocks - [Mine, Prospect, hidden, null, null] +10950 - Sand pile - [Climb, null, null, null, null] +10951 - null - [null, null, null, null, null] +10952 - null - [null, null, null, null, null] +10953 - Hole - [null, null, null, null, null] +10954 - Flat ground - [null, null, null, null, null] +10955 - Headless statue - [null, null, null, null, null] +10956 - Headless statue - [null, null, null, null, null] +10957 - Headless statue - [null, null, null, null, null] +10958 - Lazim's statue - [null, null, null, null, null] +10959 - Zamorak's statue - [null, null, null, null, null] +10960 - Icthlarin's statue - [null, null, null, null, null] +10961 - Camel's statue - [null, null, null, null, null] +10962 - Statue - [null, null, null, null, null] +10963 - Statue - [null, null, null, null, null] +10964 - Statue - [null, null, null, null, null] +10965 - Statue - [null, null, null, null, null] +10966 - Statue - [null, null, null, null, null] +10967 - Statue - [null, null, null, null, null] +10968 - Statue - [null, null, null, null, null] +10969 - Statue - [null, null, null, null, null] +10970 - null - [null, null, null, null, null] +10971 - Fallen statue - [null, null, null, null, null] +10972 - Fallen statue - [null, null, null, null, null] +10973 - Fallen statue - [null, null, null, null, null] +10974 - Fallen statue - [null, null, null, null, null] +10975 - Fallen statue - [null, null, null, null, null] +10976 - Fallen statue - [null, null, null, null, null] +10977 - Fallen statue - [null, null, null, null, null] +10978 - Fallen statue - [null, null, null, null, null] +10979 - Fallen statue - [null, null, null, null, null] +10980 - Fallen statue - [null, null, null, null, null] +10981 - Fallen statue - [null, null, null, null, null] +10982 - Fallen statue - [null, null, null, null, null] +10983 - Fallen statue - [null, null, null, null, null] +10984 - Fallen statue - [null, null, null, null, null] +10985 - Fallen statue - [null, null, null, null, null] +10986 - Fallen statue - [null, null, null, null, null] +10987 - null - [null, null, null, null, null] +10988 - Pedestal - [null, null, null, null, null] +10989 - Pedestal - [null, null, null, null, null] +10990 - Pedestal - [null, null, null, null, null] +10991 - Pedestal - [null, null, null, null, null] +10992 - Pedestal - [null, null, null, null, null] +10993 - Pedestal - [null, null, null, null, null] +10994 - Pedestal - [null, null, null, null, null] +10995 - Pedestal - [null, null, null, null, null] +10996 - Pedestal - [null, null, null, null, null] +10997 - Pedestal - [null, null, null, null, null] +10998 - Pedestal - [null, null, null, null, null] +10999 - Pedestal - [null, null, null, null, null] +11000 - Pedestal - [null, null, null, null, null] +11001 - Pedestal - [null, null, null, null, null] +11002 - Pedestal - [null, null, null, null, null] +11003 - Pedestal - [null, null, null, null, null] +11004 - Pedestal - [null, null, null, null, null] +11005 - Magic barrier - [Pass-through, null, null, null, null] +11006 - null - [null, null, null, null, null] +11007 - Fountain - [null, null, null, null, null] +11008 - null - [null, null, null, null, null] +11009 - Furnace - [null, null, null, null, null] +11010 - Furnace - [null, Smelt, null, null, null] +11011 - null - [null, null, null, null, null] +11012 - null - [null, null, null, null, null] +11013 - null - [null, null, null, null, null] +11014 - null - [null, null, null, null, null] +11015 - null - [null, null, null, null, null] +11016 - null - [null, null, null, null, null] +11017 - Brazier - [Investigate, null, null, null, null] +11018 - Brazier - [Investigate, null, null, null, null] +11019 - Brazier - [Investigate, null, null, null, null] +11020 - Brazier - [Investigate, null, null, null, null] +11021 - Brazier - [Investigate, null, null, null, null] +11022 - Brazier - [Investigate, null, null, null, null] +11023 - Brazier - [Investigate, null, null, null, null] +11024 - Brazier - [Investigate, null, null, null, null] +11025 - Brazier - [Investigate, null, null, null, null] +11026 - null - [null, null, null, null, null] +11027 - null - [null, null, null, null, null] +11028 - Wall - [null, null, null, null, null] +11029 - Wall - [null, null, null, null, null] +11030 - Wall - [null, null, null, null, null] +11031 - Wall - [null, null, null, null, null] +11032 - Wall - [null, null, null, null, null] +11033 - Wall - [null, null, null, null, null] +11034 - Wall - [null, null, null, null, null] +11035 - Wall - [null, null, null, null, null] +11036 - Wall - [null, null, null, null, null] +11037 - Wall - [null, null, null, null, null] +11038 - Wall - [null, null, null, null, null] +11039 - Wall - [null, null, null, null, null] +11040 - Rubble - [Take-rock, null, null, null, null] +11041 - Ladder - [Climb-up, null, null, null, null] +11042 - Ladder - [Climb-down, null, null, null, null] +11043 - Stone Ladder - [Climb-up, null, null, null, null] +11044 - Stone Ladder - [Climb-down, null, null, null, null] +11045 - null - [null, null, null, null, null] +11046 - null - [null, null, null, null, null] +11047 - null - [null, null, null, null, null] +11048 - null - [null, null, null, null, null] +11049 - Boulder - [null, null, null, null, null] +11050 - Secret entrance - [Climb-down, null, null, null, null] +11051 - Door - [Open, null, null, null, null] +11052 - Door - [null, null, null, null, null] +11053 - Door - [Open, null, null, null, null] +11054 - Door - [null, null, null, null, null] +11055 - Door - [Open, null, null, null, null] +11056 - Door - [null, null, null, null, null] +11057 - Door - [Open, null, null, null, null] +11058 - Door - [null, null, null, null, null] +11059 - Pedestal - [null, null, null, null, null] +11060 - Pedestal - [Take-sigil, null, null, null, null] +11061 - Pedestal - [Take-sigil, null, null, null, null] +11062 - Pedestal - [Take-sigil, null, null, null, null] +11063 - Pedestal - [Take-sigil, null, null, null, null] +11064 - Door - [Open, null, null, null, null] +11065 - Door - [null, null, null, null, null] +11066 - Door - [Open, null, null, null, null] +11067 - Door - [null, null, null, null, null] +11068 - Door - [Open, null, null, null, null] +11069 - Door - [null, null, null, null, null] +11070 - Door - [Open, null, null, null, null] +11071 - Door - [null, null, null, null, null] +11072 - Ruins - [null, null, null, null, null] +11073 - Ruins - [null, null, null, null, null] +11074 - Ruins - [null, null, null, null, null] +11075 - Ruins - [null, null, null, null, null] +11076 - null - [null, null, null, null, null] +11077 - null - [null, null, null, null, null] +11078 - null - [null, null, null, null, null] +11079 - Light - [null, null, null, null, null] +11080 - Scaffold - [null, null, null, null, null] +11081 - Ladder - [null, null, null, null, null] +11082 - Wheelbarrow - [null, null, null, null, null] +11083 - null - [null, null, null, null, null] +11084 - null - [null, null, null, null, null] +11085 - null - [null, null, null, null, null] +11086 - null - [null, null, null, null, null] +11087 - null - [null, null, null, null, null] +11088 - null - [null, null, null, null, null] +11089 - null - [null, null, null, null, null] +11090 - null - [null, null, null, null, null] +11091 - null - [null, null, null, null, null] +11092 - null - [null, null, null, null, null] +11093 - null - [null, null, null, null, null] +11094 - null - [null, null, null, null, null] +11095 - null - [null, null, null, null, null] +11096 - null - [null, null, null, null, null] +11097 - Rock - [Take-axe, null, null, null, null] +11098 - Rock - [null, null, null, null, null] +11099 - null - [null, null, null, null, null] +11100 - null - [null, null, null, null, null] +11101 - null - [null, null, null, null, null] +11102 - null - [null, null, null, null, null] +11103 - null - [null, null, null, null, null] +11104 - null - [null, null, null, null, null] +11105 - null - [null, null, null, null, null] +11106 - null - [null, null, null, null, null] +11107 - null - [null, null, null, null, null] +11108 - null - [null, null, null, null, null] +11109 - null - [null, null, null, null, null] +11110 - null - [null, null, null, null, null] +11111 - null - [null, null, null, null, null] +11112 - Dead tree - [null, null, null, null, null] +11113 - Bush - [null, null, null, null, null] +11114 - null - [null, null, null, null, null] +11115 - null - [null, null, null, null, null] +11116 - null - [null, null, null, null, null] +11117 - null - [null, null, null, null, null] +11118 - null - [null, null, null, null, null] +11119 - null - [null, null, null, null, null] +11120 - null - [null, null, null, null, null] +11121 - null - [null, null, null, null, null] +11122 - null - [null, null, null, null, null] +11123 - null - [null, null, null, null, null] +11124 - null - [null, null, null, null, null] +11125 - null - [null, null, null, null, null] +11126 - null - [null, null, null, null, null] +11127 - null - [null, null, null, null, null] +11128 - null - [null, null, null, null, null] +11129 - null - [null, null, null, null, null] +11130 - null - [null, null, null, null, null] +11131 - null - [null, null, null, null, null] +11132 - null - [null, null, null, null, null] +11133 - null - [null, null, null, null, null] +11134 - null - [null, null, null, null, null] +11135 - null - [null, null, null, null, null] +11136 - null - [null, null, null, null, null] +11137 - null - [null, null, null, null, null] +11138 - null - [null, null, null, null, null] +11139 - null - [null, null, null, null, null] +11140 - null - [null, null, null, null, null] +11141 - Magic spell - [null, null, null, null, null] +11142 - null - [null, null, null, null, null] +11143 - null - [null, null, null, null, null] +11144 - null - [null, null, null, null, null] +11145 - null - [null, null, null, null, null] +11146 - null - [null, null, null, null, null] +11147 - null - [null, null, null, null, null] +11148 - null - [null, null, null, null, null] +11149 - null - [null, null, null, null, null] +11150 - null - [null, null, null, null, null] +11151 - Door - [Open, null, null, null, null] +11152 - Door - [Open, null, null, null, null] +11153 - Pedestal - [null, null, null, null, null] +11154 - null - [null, null, null, null, null] +11155 - null - [null, null, null, null, null] +11156 - null - [null, null, null, null, null] +11157 - null - [null, null, null, null, null] +11158 - null - [null, null, null, null, null] +11159 - null - [null, null, null, null, null] +11160 - null - [null, null, null, null, null] +11161 - null - [null, null, null, null, null] +11162 - Loader - [null, null, null, null, null] +11163 - Bone grinder - [Wind, Status, null, null, null] +11164 - Bin - [Empty, null, null, null, null] +11165 - Rocks - [Mine, Prospect, hidden, null, null] +11166 - Rocks - [Mine, Prospect, hidden, null, null] +11167 - Rocks - [Mine, Prospect, hidden, null, null] +11168 - Rocks - [Mine, Prospect, hidden, null, null] +11169 - Rocks - [Mine, Prospect, hidden, null, null] +11170 - Rocks - [Mine, Prospect, hidden, null, null] +11171 - Rocks - [Mine, Prospect, hidden, null, null] +11172 - Rocks - [Mine, Prospect, hidden, null, null] +11173 - Rocks - [Mine, Prospect, hidden, null, null] +11174 - Rocks - [Mine, Prospect, hidden, null, null] +11175 - Rocks - [Mine, Prospect, hidden, null, null] +11176 - Rocks - [Mine, Prospect, hidden, null, null] +11177 - Rocks - [Mine, Prospect, hidden, null, null] +11178 - Rocks - [Mine, Prospect, hidden, null, null] +11179 - Rocks - [Mine, Prospect, hidden, null, null] +11180 - Rocks - [Mine, Prospect, hidden, null, null] +11181 - Rocks - [Mine, Prospect, hidden, null, null] +11182 - Rocks - [Mine, Prospect, hidden, null, null] +11183 - Rocks - [Mine, Prospect, hidden, null, null] +11184 - Rocks - [Mine, Prospect, hidden, null, null] +11185 - Rocks - [Mine, Prospect, hidden, null, null] +11186 - Rocks - [Mine, Prospect, hidden, null, null] +11187 - Rocks - [Mine, Prospect, hidden, null, null] +11188 - Rocks - [Mine, Prospect, hidden, null, null] +11189 - Rocks - [Mine, Prospect, hidden, null, null] +11190 - Rocks - [Mine, Prospect, hidden, null, null] +11191 - Rocks - [Mine, Prospect, hidden, null, null] +11192 - Rocks - [Mine, Prospect, hidden, null, null] +11193 - Rocks - [Mine, Prospect, hidden, null, null] +11194 - Rocks - [Mine, Prospect, hidden, null, null] +11195 - Rocks - [Mine, Prospect, hidden, null, null] +11196 - Door - [Open, null, null, null, null] +11197 - Door - [Open, null, null, null, null] +11198 - Ladder - [Climb-up, null, null, null, null] +11199 - Ladder - [Climb-Down, null, null, null, null] +11200 - Ladder - [Climb-up, null, null, null, null] +11201 - Ladder - [Climb-Down, null, null, null, null] +11202 - Table - [View-game, null, null, null, null] +11203 - Table - [View-game, null, null, null, null] +11204 - Plaque - [null, null, null, null, null] +11205 - Plaque - [null, null, null, null, null] +11206 - Plaque - [null, null, null, null, null] +11207 - Plaque - [null, null, null, null, null] +11208 - Coffin - [null, null, null, null, null] +11209 - Gangplank - [Cross, null, null, null, null] +11210 - Gangplank - [Cross, null, null, null, null] +11211 - Gangplank - [Cross, null, null, null, null] +11212 - Gangplank - [Cross, null, null, null, null] +11213 - null - [Load, null, null, null, null] +11214 - Cannon - [Inspect, Empty-Out, null, null, null] +11215 - Broken Cannon - [Repair, null, null, null, null] +11216 - Broken Cannon - [Repair, null, null, null, null] +11217 - Cannon - [Fire!, null, null, null, null] +11218 - null - [null, null, null, null, null] +11219 - Cannon - [null, null, null, null, null] +11220 - Broken Cannon - [null, null, null, null, null] +11221 - null - [Repair, null, null, null, null] +11222 - null - [Repair, null, null, null, null] +11223 - null - [Repair, null, null, null, null] +11224 - null - [null, null, null, null, null] +11225 - null - [null, null, null, null, null] +11226 - null - [null, null, null, null, null] +11227 - null - [Loot, null, null, null, null] +11228 - Crate - [Loot, null, null, null, null] +11229 - Crate - [Loot, null, null, null, null] +11230 - null - [Plunder, null, null, null, null] +11231 - Closed chest - [Plunder, null, null, null, null] +11232 - Open chest - [Plunder, null, null, null, null] +11233 - null - [Loot, null, null, null, null] +11234 - Barrel - [Ransack, null, null, null, null] +11235 - Barrel - [Ransack, null, null, null, null] +11236 - Plunder Storage - [Count-Plunder, Store-Plunder, null, null, null] +11237 - null - [Take-Powder, null, null, null, null] +11238 - Powder Barrel - [Take-Powder, null, null, null, null] +11239 - Barrel - [Take-Powder, null, null, null, null] +11240 - Barrel - [Take-Powder, null, null, null, null] +11241 - null - [null, null, null, null, null] +11242 - null - [null, null, null, null, null] +11243 - null - [Climb, null, null, null, null] +11244 - Climbing Net - [Climb-Down, null, null, null, null] +11245 - Powder Barrel - [Take-Powder, null, null, null, null] +11246 - Repair Locker - [Open, null, null, null, null] +11247 - Repair Locker - [Search, Close, null, null, null] +11248 - Gun Locker - [Open, null, null, null, null] +11249 - Gun Locker - [Search, Close, null, null, null] +11250 - null - [null, null, null, null, null] +11251 - null - [null, null, null, null, null] +11252 - null - [null, null, null, null, null] +11253 - null - [null, null, null, null, null] +11254 - null - [null, null, null, null, null] +11255 - null - [null, null, null, null, null] +11256 - null - [null, null, null, null, null] +11257 - null - [null, null, null, null, null] +11258 - null - [null, null, null, null, null] +11259 - null - [null, null, null, null, null] +11260 - null - [null, null, null, null, null] +11261 - null - [null, null, null, null, null] +11262 - null - [null, null, null, null, null] +11263 - null - [null, null, null, null, null] +11264 - null - [null, null, null, null, null] +11265 - null - [null, null, null, null, null] +11266 - null - [null, null, null, null, null] +11267 - null - [null, null, null, null, null] +11268 - null - [null, null, null, null, null] +11269 - null - [null, null, null, null, null] +11270 - null - [null, null, null, null, null] +11271 - null - [null, null, null, null, null] +11272 - null - [null, null, null, null, null] +11273 - null - [null, null, null, null, null] +11274 - null - [null, null, null, null, null] +11275 - null - [null, null, null, null, null] +11276 - Mast - [null, null, null, null, null] +11277 - Mast - [null, null, null, null, null] +11278 - Mast - [null, null, null, null, null] +11279 - Mast - [null, null, null, null, null] +11280 - Sail - [null, null, null, null, null] +11281 - Sail - [null, null, null, null, null] +11282 - Sail - [null, null, null, null, null] +11283 - Sail - [null, null, null, null, null] +11284 - null - [null, null, null, null, null] +11285 - null - [null, null, null, null, null] +11286 - null - [null, null, null, null, null] +11287 - Figurehead - [null, null, null, null, null] +11288 - null - [null, null, null, null, null] +11289 - Ship's ladder - [Climb-up, null, null, null, null] +11290 - Ship's ladder - [Climb-down, null, null, null, null] +11291 - Sail - [null, null, null, null, null] +11292 - Hoisted sail - [null, null, null, null, null] +11293 - Hoisted sail - [null, null, null, null, null] +11294 - Hoisted sail - [null, null, null, null, null] +11295 - null - [null, null, null, null, null] +11296 - null - [null, null, null, null, null] +11297 - Hoisted sail - [null, null, null, null, null] +11298 - Hoisted sail - [null, null, null, null, null] +11299 - Hoisted sail - [null, null, null, null, null] +11300 - Hoisted sail - [null, null, null, null, null] +11301 - Hoisted sail - [null, null, null, null, null] +11302 - Sail - [null, null, null, null, null] +11303 - Hoisted sail - [null, null, null, null, null] +11304 - Hoisted sail - [null, null, null, null, null] +11305 - Barrel - [null, null, null, null, null] +11306 - Ship's wheel - [null, null, null, null, null] +11307 - Anchor - [null, null, null, null, null] +11308 - Ship's ladder - [Climb-up, null, null, null, null] +11309 - Ship's ladder - [Climb-down, null, null, null, null] +11310 - Climbing net - [Climb, null, null, null, null] +11311 - Rope - [null, null, null, null, null] +11312 - Cannon - [null, null, null, null, null] +11313 - Cannon - [null, null, null, null, null] +11314 - Cannon - [null, null, null, null, null] +11315 - Barrel - [null, null, null, null, null] +11316 - Fuse - [null, null, null, null, null] +11317 - Ship hull - [Fill, null, null, null, null] +11318 - Ship hull - [Waterproof, null, null, null, null] +11319 - Ship hull - [null, null, null, null, null] +11320 - Barrel - [null, null, null, null, null] +11321 - null - [null, null, null, null, null] +11322 - Barrel - [null, null, null, null, null] +11323 - Chest - [null, null, null, null, null] +11324 - Ancient Pillar - [null, null, null, null, null] +11325 - null - [null, null, null, null, null] +11326 - null - [null, null, null, null, null] +11327 - null - [null, null, null, null, null] +11328 - null - [null, null, null, null, null] +11329 - null - [null, null, null, null, null] +11330 - Crate - [null, null, null, null, null] +11331 - Crate - [null, null, null, null, null] +11332 - Gate - [null, null, null, null, null] +11333 - Gate - [null, null, null, null, null] +11334 - null - [null, null, null, null, null] +11335 - Bamboo Desk - [null, null, null, null, null] +11336 - Bamboo Desk - [null, null, null, null, null] +11337 - Bamboo Desk - [null, null, null, null, null] +11338 - Bank booth - [Use, Use-quickly, Collect, null, null] +11339 - Open chest - [null, null, null, null, null] +11340 - null - [null, null, null, null, null] +11341 - Closed chest - [null, null, null, null, null] +11342 - Repair Locker - [null, null, null, null, null] +11343 - Gun Locker - [null, null, null, null, null] +11344 - null - [null, null, null, null, null] +11345 - null - [null, null, null, null, null] +11346 - null - [null, null, null, null, null] +11347 - null - [null, null, null, null, null] +11348 - null - [null, null, null, null, null] +11349 - null - [null, null, null, null, null] +11350 - null - [null, null, null, null, null] +11351 - null - [null, null, null, null, null] +11352 - null - [null, null, null, null, null] +11353 - null - [null, null, null, null, null] +11354 - Interdimensional rift - [Enter, null, null, null, null] +11355 - null - [null, null, null, null, null] +11356 - Portal Home - [Enter, null, null, null, null] +11357 - Portal machine - [null, null, null, null, null] +11358 - Staircase - [Climb-up, null, null, null, null] +11359 - null - [null, null, null, null, null] +11360 - Pie stall - [null, null, null, null, null] +11361 - Raw chompy bird - [null, null, null, null, null] +11362 - Raw Rabbit - [null, null, null, null, null] +11363 - Iron spit - [null, null, null, null, null] +11364 - Decorative Pillar - [Light, null, null, null, null] +11365 - Decorative Pillar - [Light, null, null, null, null] +11366 - Decorative Pillar - [Light, null, null, null, null] +11367 - Decorative Pillar - [Light, null, null, null, null] +11368 - null - [Light, null, null, null, null] +11369 - null - [Light, null, null, null, null] +11370 - null - [Light, null, null, null, null] +11371 - null - [Light, null, null, null, null] +11372 - null - [Light, null, null, null, null] +11373 - null - [Light, null, null, null, null] +11374 - null - [Light, null, null, null, null] +11375 - null - [Light, null, null, null, null] +11376 - null - [Light, null, null, null, null] +11377 - null - [Light, null, null, null, null] +11378 - null - [Light, null, null, null, null] +11379 - Large door - [Open, null, null, null, null] +11380 - Large door - [Close, null, null, null, null] +11381 - Large door - [Open, null, null, null, null] +11382 - Large door - [Close, null, null, null, null] +11383 - Decorative Pillar - [Light, null, null, null, null] +11384 - Decorative Pillar - [Light, null, null, null, null] +11385 - Decorative Pillar - [Light, null, null, null, null] +11386 - Decorative Pillar - [Light, null, null, null, null] +11387 - Decorative Pillar - [Light, null, null, null, null] +11388 - Decorative Pillar - [Light, null, null, null, null] +11389 - Decorative Pillar - [Light, null, null, null, null] +11390 - Decorative Pillar - [Light, null, null, null, null] +11391 - Decorative Pillar - [Light, null, null, null, null] +11392 - Decorative Pillar - [Light, null, null, null, null] +11393 - Decorative Pillar - [Light, null, null, null, null] +11394 - Decorative Pillar - [Light, null, null, null, null] +11395 - Pillar candle. - [null, null, null, null, null] +11396 - Melted candle. - [null, null, null, null, null] +11397 - Pillar candle flame. - [null, null, null, null, null] +11398 - Our lives - [Read, Leave, null, null, null] +11399 - Cave entrance - [Crawl-through, null, null, null, null] +11400 - Web - [Slash, null, null, null, null] +11401 - Slashed web - [null, null, null, null, null] +11402 - Bank booth - [Use, Use-quickly, Collect, null, null] +11403 - null - [null, null, null, null, null] +11404 - Fire - [null, null, null, null, null] +11405 - Fire - [null, null, null, null, null] +11406 - Fire - [null, null, null, null, null] +11407 - null - [null, null, null, null, null] +11408 - null - [null, null, null, null, null] +11409 - pipe with rope - [null, null, null, null, null] +11410 - Pipe - [null, null, null, null, null] +11411 - Rope - [null, null, null, null, null] +11412 - straight rope - [null, null, null, null, null] +11413 - Rope - [null, null, null, null, null] +11414 - Rope - [null, null, null, null, null] +11415 - Rope - [null, null, null, null, null] +11416 - Rope - [null, null, null, null, null] +11417 - Dug hole - [Climb-down, null, null, null, null] +11418 - Mud patch - [null, null, null, null, null] +11419 - null - [null, null, null, null, null] +11420 - null - [null, null, null, null, null] +11421 - null - [null, null, null, null, null] +11422 - null - [null, null, null, null, null] +11423 - Grill - [Open, null, null, null, null] +11424 - Rocks - [Mine, Prospect, hidden, null, null] +11425 - Rocks - [Mine, Prospect, hidden, null, null] +11426 - Rocks - [Mine, Prospect, hidden, null, null] +11427 - Rocks - [Mine, Prospect, hidden, null, null] +11428 - Rocks - [Mine, Prospect, hidden, null, null] +11429 - Rocks - [Mine, Prospect, hidden, null, null] +11430 - Rocks - [Mine, Prospect, hidden, null, null] +11431 - Rocks - [Mine, Prospect, hidden, null, null] +11432 - Rocks - [Mine, Prospect, hidden, null, null] +11433 - Rocks - [Mine, Prospect, hidden, null, null] +11434 - Rocks - [Mine, Prospect, hidden, null, null] +11435 - Rocks - [Mine, Prospect, hidden, null, null] +11436 - Rocks - [Mine, Prospect, hidden, null, null] +11437 - Rocks - [Mine, Prospect, hidden, null, null] +11438 - Rocks - [Mine, Prospect, hidden, null, null] +11439 - Rocks - [Mine, Prospect, hidden, null, null] +11440 - Rocks - [Mine, Prospect, hidden, null, null] +11441 - Rocks - [Mine, Prospect, hidden, null, null] +11442 - Rocks - [Mine, Prospect, hidden, null, null] +11443 - Rocks - [Mine, Prospect, hidden, null, null] +11444 - Rocks - [Mine, Prospect, hidden, null, null] +11445 - null - [null, null, null, null, null] +11446 - null - [null, null, null, null, null] +11447 - null - [null, null, null, null, null] +11448 - null - [null, null, null, null, null] +11449 - Door - [null, null, null, null, null] +11450 - Door - [Open, null, null, null, null] +11451 - Lever A - [Pull, Inspect, null, null, null] +11452 - Lever A - [Pull, Inspect, null, null, null] +11453 - Lever B - [Pull, Inspect, null, null, null] +11454 - Lever B - [Pull, Inspect, null, null, null] +11455 - Lever C - [Pull, Inspect, null, null, null] +11456 - Lever C - [Pull, Inspect, null, null, null] +11457 - Lever D - [Pull, Inspect, null, null, null] +11458 - Lever D - [Pull, Inspect, null, null, null] +11459 - Lever E - [Pull, Inspect, null, null, null] +11460 - Lever E - [Pull, Inspect, null, null, null] +11461 - Lever F - [Pull, Inspect, null, null, null] +11462 - Lever F - [Pull, Inspect, null, null, null] +11463 - null - [null, null, null, null, null] +11464 - null - [null, null, null, null, null] +11465 - null - [null, null, null, null, null] +11466 - null - [null, null, null, null, null] +11467 - null - [null, null, null, null, null] +11468 - Lantern - [null, null, null, null, null] +11469 - Spooky picture - [null, null, null, null, null] +11470 - Door - [Open, null, null, null, null] +11471 - Door - [Close, null, null, null, null] +11472 - Candles - [null, null, null, null, null] +11473 - Candles - [null, null, null, null, null] +11474 - null - [null, null, null, null, null] +11475 - null - [null, null, null, null, null] +11476 - null - [null, null, null, null, null] +11477 - null - [null, null, null, null, null] +11478 - null - [null, null, null, null, null] +11479 - null - [null, null, null, null, null] +11480 - null - [null, null, null, null, null] +11481 - null - [null, null, null, null, null] +11482 - null - [null, null, null, null, null] +11483 - Door - [Open, null, null, null, null] +11484 - Barrel - [null, null, null, null, null] +11485 - Crate - [Search, null, null, null, null] +11486 - Crates - [Search, null, null, null, null] +11487 - Boxes - [null, null, null, null, null] +11488 - Crates - [null, null, null, null, null] +11489 - Chair - [null, null, null, null, null] +11490 - Chair - [null, null, null, null, null] +11491 - Large Table - [null, null, null, null, null] +11492 - Smashed chair - [null, null, null, null, null] +11493 - Grandfather clock - [null, null, null, null, null] +11494 - Cabbage - [Pick, null, null, null, null] +11495 - Gallows - [null, null, null, null, null] +11496 - Chair - [null, null, null, null, null] +11497 - Spooky picture - [null, null, null, null, null] +11498 - Staircase - [Climb-up, null, null, null, null] +11499 - Staircase - [Climb-down, null, null, null, null] +11500 - Table - [null, null, null, null, null] +11501 - Table - [null, null, null, null, null] +11502 - Table - [null, null, null, null, null] +11503 - Table - [null, null, null, null, null] +11504 - Table - [null, null, null, null, null] +11505 - null - [null, null, null, null, null] +11506 - null - [null, null, null, null, null] +11507 - null - [null, null, null, null, null] +11508 - null - [null, null, null, null, null] +11509 - null - [null, null, null, null, null] +11510 - Dead tree - [null, null, null, null, null] +11511 - Staircase - [Climb-up, null, null, null, null] +11512 - null - [null, null, null, null, null] +11513 - null - [null, null, null, null, null] +11514 - null - [null, null, null, null, null] +11515 - null - [null, null, null, null, null] +11516 - null - [null, null, null, null, null] +11517 - null - [null, null, null, null, null] +11518 - null - [null, null, null, null, null] +11519 - null - [null, null, null, null, null] +11520 - null - [null, null, null, null, null] +11521 - null - [null, null, null, null, null] +11522 - null - [null, null, null, null, null] +11523 - null - [null, null, null, null, null] +11524 - null - [null, null, null, null, null] +11525 - null - [null, null, null, null, null] +11526 - null - [null, null, null, null, null] +11527 - null - [null, null, null, null, null] +11528 - null - [null, null, null, null, null] +11529 - null - [null, null, null, null, null] +11530 - null - [null, null, null, null, null] +11531 - null - [null, null, null, null, null] +11532 - null - [null, null, null, null, null] +11533 - null - [null, null, null, null, null] +11534 - null - [null, null, null, null, null] +11535 - null - [null, null, null, null, null] +11536 - null - [null, null, null, null, null] +11537 - null - [null, null, null, null, null] +11538 - null - [null, null, null, null, null] +11539 - null - [null, null, null, null, null] +11540 - null - [null, null, null, null, null] +11541 - null - [null, null, null, null, null] +11542 - null - [null, null, null, null, null] +11543 - null - [null, null, null, null, null] +11544 - null - [null, null, null, null, null] +11545 - null - [null, null, null, null, null] +11546 - Strange machine - [null, null, null, null, null] +11547 - Strange machine - [null, null, null, null, null] +11548 - Strange machine - [null, null, null, null, null] +11549 - Strange machine - [null, null, null, null, null] +11550 - Strange machine - [null, null, null, null, null] +11551 - Table - [null, null, null, null, null] +11552 - Rocks - [Mine, Prospect, hidden, null, null] +11553 - Rocks - [Mine, Prospect, hidden, null, null] +11554 - Rocks - [Mine, Prospect, hidden, null, null] +11555 - Rocks - [Mine, Prospect, hidden, null, null] +11556 - Rocks - [Mine, Prospect, hidden, null, null] +11557 - Rocks - [Mine, Prospect, hidden, null, null] +11558 - null - [null, null, null, null, null] +11559 - null - [null, null, null, null, null] +11560 - null - [null, null, null, null, null] +11561 - null - [null, null, null, null, null] +11562 - null - [null, null, null, null, null] +11563 - null - [null, null, null, null, null] +11564 - null - [null, null, null, null, null] +11565 - null - [null, null, null, null, null] +11566 - null - [null, null, null, null, null] +11567 - null - [null, null, null, null, null] +11568 - null - [null, null, null, null, null] +11569 - null - [null, null, null, null, null] +11570 - null - [null, null, null, null, null] +11571 - null - [null, null, null, null, null] +11572 - null - [null, null, null, null, null] +11573 - null - [null, null, null, null, null] +11574 - null - [null, null, null, null, null] +11575 - null - [null, null, null, null, null] +11576 - null - [null, null, null, null, null] +11577 - null - [null, null, null, null, null] +11578 - null - [null, null, null, null, null] +11579 - null - [null, null, null, null, null] +11580 - null - [null, null, null, null, null] +11581 - null - [null, null, null, null, null] +11582 - null - [null, null, null, null, null] +11583 - null - [null, null, null, null, null] +11584 - null - [null, null, null, null, null] +11585 - null - [null, null, null, null, null] +11586 - null - [null, null, null, null, null] +11587 - null - [null, null, null, null, null] +11588 - null - [null, null, null, null, null] +11589 - Barrel - [null, null, null, null, null] +11590 - Barrel - [null, null, null, null, null] +11591 - null - [null, null, null, null, null] +11592 - null - [null, null, null, null, null] +11593 - null - [null, null, null, null, null] +11594 - null - [null, null, null, null, null] +11595 - null - [null, null, null, null, null] +11596 - null - [null, null, null, null, null] +11597 - null - [null, null, null, null, null] +11598 - null - [null, null, null, null, null] +11599 - Crate - [null, null, null, null, null] +11600 - Crates - [Search, null, null, null, null] +11601 - Pottery Oven - [Fire, null, null, null, null] +11602 - null - [null, null, null, null, null] +11603 - Stool - [null, null, null, null, null] +11604 - null - [null, null, null, null, null] +11605 - null - [null, null, null, null, null] +11606 - Standing torch - [null, null, null, null, null] +11607 - null - [null, null, null, null, null] +11608 - null - [null, null, null, null, null] +11609 - null - [null, null, null, null, null] +11610 - null - [null, null, null, null, null] +11611 - null - [null, null, null, null, null] +11612 - null - [null, null, null, null, null] +11613 - null - [null, null, null, null, null] +11614 - Standard - [null, null, null, null, null] +11615 - Standard - [null, null, null, null, null] +11616 - Door - [Open, null, null, null, null] +11617 - Door - [Close, null, null, null, null] +11618 - null - [null, null, null, null, null] +11619 - Table - [null, null, null, null, null] +11620 - Longhall door - [Open, null, null, null, null] +11621 - Longhall door - [Open, null, null, null, null] +11622 - null - [null, null, null, null, null] +11623 - null - [null, null, null, null, null] +11624 - Longhall door - [Close, null, null, null, null] +11625 - Longhall door - [Close, null, null, null, null] +11626 - Counter - [null, null, null, null, null] +11627 - Small Table - [null, null, null, null, null] +11628 - null - [null, null, null, null, null] +11629 - Rock - [null, null, null, null, null] +11630 - Stone signpost - [null, null, null, null, null] +11631 - Stone signpost - [null, null, null, null, null] +11632 - null - [null, null, null, null, null] +11633 - null - [null, null, null, null, null] +11634 - Rock - [null, null, null, null, null] +11635 - Rock - [null, null, null, null, null] +11636 - Rock - [null, null, null, null, null] +11637 - Rock - [null, null, null, null, null] +11638 - Rock - [null, null, null, null, null] +11639 - Rock - [null, null, null, null, null] +11640 - City gate - [null, null, null, null, null] +11641 - City gate - [null, null, null, null, null] +11642 - City gate - [null, null, null, null, null] +11643 - City gate - [null, null, null, null, null] +11644 - City gate - [null, null, null, null, null] +11645 - City gate - [null, null, null, null, null] +11646 - City gate - [null, null, null, null, null] +11647 - City gate - [null, null, null, null, null] +11648 - City gate - [null, null, null, null, null] +11649 - City gate - [null, null, null, null, null] +11650 - City gate - [null, null, null, null, null] +11651 - City gate - [null, null, null, null, null] +11652 - null - [null, null, null, null, null] +11653 - null - [null, null, null, null, null] +11654 - null - [null, null, null, null, null] +11655 - null - [null, null, null, null, null] +11656 - null - [null, null, null, null, null] +11657 - Rack - [null, null, null, null, null] +11658 - Shelves - [null, null, null, null, null] +11659 - Barrel - [null, null, null, null, null] +11660 - Table - [null, null, null, null, null] +11661 - Waterpump - [null, null, null, null, null] +11662 - Shop counter - [null, null, null, null, null] +11663 - Cabinet - [null, null, null, null, null] +11664 - null - [null, null, null, null, null] +11665 - null - [null, null, null, null, null] +11666 - Furnace - [null, Smelt, null, null, null] +11667 - null - [null, null, null, null, null] +11668 - null - [null, null, null, null, null] +11669 - null - [null, null, null, null, null] +11670 - null - [null, null, null, null, null] +11671 - null - [null, null, null, null, null] +11672 - null - [null, null, null, null, null] +11673 - null - [null, null, null, null, null] +11674 - Sign - [null, null, null, null, null] +11675 - Banner - [null, null, null, null, null] +11676 - null - [null, null, null, null, null] +11677 - Treadmill - [null, null, null, null, null] +11678 - Spinning pole - [null, null, null, null, null] +11679 - null - [null, null, null, null, null] +11680 - null - [null, null, null, null, null] +11681 - null - [null, null, null, null, null] +11682 - Table - [null, null, null, null, null] +11683 - null - [null, null, null, null, null] +11684 - null - [null, null, null, null, null] +11685 - null - [null, null, null, null, null] +11686 - null - [null, null, null, null, null] +11687 - null - [null, null, null, null, null] +11688 - null - [null, null, null, null, null] +11689 - null - [null, null, null, null, null] +11690 - null - [null, null, null, null, null] +11691 - null - [null, null, null, null, null] +11692 - null - [null, null, null, null, null] +11693 - Statue - [null, null, null, null, null] +11694 - Statue - [null, null, null, null, null] +11695 - Statue - [null, null, null, null, null] +11696 - Statue - [null, null, null, null, null] +11697 - Statue - [null, null, null, null, null] +11698 - Old bookshelf - [Search, null, null, null, null] +11699 - Flagpole - [null, null, null, null, null] +11700 - Statue of Saradomin - [null, null, null, null, null] +11701 - Statue of Saradomin - [null, null, null, null, null] +11702 - null - [null, null, null, null, null] +11703 - null - [null, null, null, null, null] +11704 - null - [null, null, null, null, null] +11705 - null - [null, null, null, null, null] +11706 - Rockery - [null, null, null, null, null] +11707 - Door - [Open, null, null, null, null] +11708 - Door - [Close, null, null, null, null] +11709 - Door - [Open, null, null, null, null] +11710 - Door - [Close, null, null, null, null] +11711 - Door - [Open, null, null, null, null] +11712 - Door - [Close, null, null, null, null] +11713 - Door - [Open, null, null, null, null] +11714 - Door - [Open, null, null, null, null] +11715 - Door - [Close, null, null, null, null] +11716 - Castle door - [Open, null, null, null, null] +11717 - Castle door - [Open, null, null, null, null] +11718 - Castle door - [Close, null, null, null, null] +11719 - Castle door - [Open, null, null, null, null] +11720 - Castle door - [Close, null, null, null, null] +11721 - Castle door - [Open, null, null, null, null] +11722 - Castle door - [Close, null, null, null, null] +11723 - Castle door - [Close, null, null, null, null] +11724 - Staircase - [Climb-up, null, null, null, null] +11725 - Staircase - [Climb-down, null, null, null, null] +11726 - null - [null, null, null, null, null] +11727 - Ladder - [Climb-up, null, null, null, null] +11728 - Ladder - [Climb-down, null, null, null, null] +11729 - Staircase - [Climb-up, null, null, null, null] +11730 - null - [null, null, null, null, null] +11731 - Staircase - [Climb-down, null, null, null, null] +11732 - Staircase - [Climb-up, null, null, null, null] +11733 - Staircase - [Climb-down, null, null, null, null] +11734 - Staircase - [Climb-up, null, null, null, null] +11735 - Staircase - [Climb-down, null, null, null, null] +11736 - Staircase - [Climb-up, null, null, null, null] +11737 - Staircase - [Climb-down, null, null, null, null] +11738 - Large table - [null, null, null, null, null] +11739 - Ladder - [Climb-up, null, null, null, null] +11740 - Ladder - [Climb-up, null, null, null, null] +11741 - Ladder - [Climb-down, null, null, null, null] +11742 - Ladder - [Climb-down, null, null, null, null] +11743 - Table - [null, null, null, null, null] +11744 - Boxes - [Search, null, null, null, null] +11745 - Crates - [Search, null, null, null, null] +11746 - Stool - [null, null, null, null, null] +11747 - Bed - [null, null, null, null, null] +11748 - Table - [null, null, null, null, null] +11749 - Table - [null, null, null, null, null] +11750 - null - [null, null, null, null, null] +11751 - null - [null, null, null, null, null] +11752 - null - [null, null, null, null, null] +11753 - Suit of armour - [null, null, null, null, null] +11754 - null - [null, null, null, null, null] +11755 - Noticeboard - [Read, null, null, null, null] +11756 - Noticeboard - [Read, null, null, null, null] +11757 - Chest - [null, null, null, null, null] +11758 - Bank booth - [Use, Use-quickly, Collect, null, null] +11759 - Fountain - [null, null, null, null, null] +11760 - Chair - [null, null, null, null, null] +11761 - Statue - [null, null, null, null, null] +11762 - Bar pumps - [null, null, null, null, null] +11763 - Bar - [null, null, null, null, null] +11764 - Picnic table - [null, null, null, null, null] +11765 - Barrel - [null, null, null, null, null] +11766 - Barrel - [null, null, null, null, null] +11767 - Bookcase - [Search, null, null, null, null] +11768 - Shelves - [null, null, null, null, null] +11769 - Shelves - [null, null, null, null, null] +11770 - Shelves - [null, null, null, null, null] +11771 - Shelves - [null, null, null, null, null] +11772 - null - [null, null, null, null, null] +11773 - null - [null, null, null, null, null] +11774 - null - [null, null, null, null, null] +11775 - null - [null, null, null, null, null] +11776 - null - [null, null, null, null, null] +11777 - null - [null, null, null, null, null] +11778 - null - [null, null, null, null, null] +11779 - null - [null, null, null, null, null] +11780 - null - [null, null, null, null, null] +11781 - null - [null, null, null, null, null] +11782 - Standing stone - [null, null, null, null, null] +11783 - Standing stone - [null, null, null, null, null] +11784 - Standing stone - [null, null, null, null, null] +11785 - Standing stone - [null, null, null, null, null] +11786 - null - [null, null, null, null, null] +11787 - null - [null, null, null, null, null] +11788 - null - [null, null, null, null, null] +11789 - Rocks - [null, null, null, null, null] +11790 - Rocks - [null, null, null, null, null] +11791 - Rocks - [null, null, null, null, null] +11792 - null - [null, null, null, null, null] +11793 - Well - [null, null, null, null, null] +11794 - Chair - [null, null, null, null, null] +11795 - Chair - [null, null, null, null, null] +11796 - Mirror - [null, null, null, null, null] +11797 - null - [null, null, null, null, null] +11798 - null - [null, null, null, null, null] +11799 - Heater - [null, null, null, null, null] +11800 - null - [null, null, null, null, null] +11801 - null - [null, null, null, null, null] +11802 - null - [null, null, null, null, null] +11803 - null - [null, null, null, null, null] +11804 - null - [null, null, null, null, null] +11805 - null - [null, null, null, null, null] +11806 - null - [null, null, null, null, null] +11807 - null - [null, null, null, null, null] +11808 - null - [null, null, null, null, null] +11809 - null - [null, null, null, null, null] +11810 - null - [null, null, null, null, null] +11811 - null - [null, null, null, null, null] +11812 - Bathtub - [null, null, null, null, null] +11813 - Workbench - [null, null, null, null, null] +11814 - Workbench - [null, null, null, null, null] +11815 - null - [null, null, null, null, null] +11816 - null - [null, null, null, null, null] +11817 - null - [null, null, null, null, null] +11818 - null - [null, null, null, null, null] +11819 - null - [null, null, null, null, null] +11820 - null - [null, null, null, null, null] +11821 - null - [null, null, null, null, null] +11822 - null - [null, null, null, null, null] +11823 - null - [null, null, null, null, null] +11824 - null - [null, null, null, null, null] +11825 - null - [null, null, null, null, null] +11826 - null - [null, null, null, null, null] +11827 - null - [null, null, null, null, null] +11828 - null - [null, null, null, null, null] +11829 - null - [null, null, null, null, null] +11830 - null - [null, null, null, null, null] +11831 - null - [null, null, null, null, null] +11832 - null - [null, null, null, null, null] +11833 - null - [null, null, null, null, null] +11834 - null - [null, null, null, null, null] +11835 - null - [null, null, null, null, null] +11836 - null - [null, null, null, null, null] +11837 - null - [null, null, null, null, null] +11838 - null - [null, null, null, null, null] +11839 - null - [null, null, null, null, null] +11840 - Bricks - [null, null, null, null, null] +11841 - Bricks - [null, null, null, null, null] +11842 - null - [null, null, null, null, null] +11843 - null - [null, null, null, null, null] +11844 - Crumbling wall - [Climb-over, null, null, null, null] +11845 - null - [null, null, null, null, null] +11846 - null - [null, null, null, null, null] +11847 - null - [null, null, null, null, null] +11848 - Bow cabinet - [null, null, null, null, null] +11849 - Table - [null, null, null, null, null] +11850 - null - [null, null, null, null, null] +11851 - null - [null, null, null, null, null] +11852 - null - [null, null, null, null, null] +11853 - null - [null, null, null, null, null] +11854 - null - [null, null, null, null, null] +11855 - null - [null, null, null, null, null] +11856 - null - [null, null, null, null, null] +11857 - null - [null, null, null, null, null] +11858 - null - [null, null, null, null, null] +11859 - null - [null, null, null, null, null] +11860 - null - [null, null, null, null, null] +11861 - Standard - [null, null, null, null, null] +11862 - Dwarf bath - [null, null, null, null, null] +11863 - Winch - [null, null, null, null, null] +11864 - null - [null, null, null, null, null] +11865 - null - [null, null, null, null, null] +11866 - null - [null, null, null, null, null] +11867 - Trapdoor - [Climb-down, null, null, null, null] +11868 - Dwarf multicannon - [null, null, null, null, null] +11869 - Multicannon parts - [null, null, null, null, null] +11870 - Multicannon parts - [null, null, null, null, null] +11871 - null - [null, null, null, null, null] +11872 - null - [null, null, null, null, null] +11873 - Multicannon parts - [null, null, null, null, null] +11874 - Multicannon parts - [null, null, null, null, null] +11875 - Canary - [null, null, null, null, null] +11876 - Blacksmiths' tools - [null, null, null, null, null] +11877 - Bed - [null, null, null, null, null] +11878 - null - [null, null, null, null, null] +11879 - null - [null, null, null, null, null] +11880 - null - [null, null, null, null, null] +11881 - null - [null, null, null, null, null] +11882 - null - [null, null, null, null, null] +11883 - null - [null, null, null, null, null] +11884 - null - [null, null, null, null, null] +11885 - null - [null, null, null, null, null] +11886 - null - [null, null, null, null, null] +11887 - null - [null, null, null, null, null] +11888 - Staircase - [Climb-up, null, null, null, null] +11889 - Staircase - [Climb, Climb-up, Climb-down, null, null] +11890 - Staircase - [Climb-down, null, null, null, null] +11891 - Sinister barrel - [null, null, null, null, null] +11892 - Table - [null, null, null, null, null] +11893 - Bookcase - [null, null, null, null, null] +11894 - Bookcase - [null, null, null, null, null] +11895 - Thorns - [null, null, null, null, null] +11896 - Thorns - [null, null, null, null, null] +11897 - Thorns - [null, null, null, null, null] +11898 - null - [null, null, null, null, null] +11899 - null - [null, null, null, null, null] +11900 - null - [null, null, null, null, null] +11901 - null - [null, null, null, null, null] +11902 - null - [null, null, null, null, null] +11903 - null - [null, null, null, null, null] +11904 - null - [null, null, null, null, null] +11905 - null - [null, null, null, null, null] +11906 - null - [null, null, null, null, null] +11907 - null - [null, null, null, null, null] +11908 - null - [null, null, null, null, null] +11909 - null - [null, null, null, null, null] +11910 - Creature - [null, null, null, null, null] +11911 - Bush - [null, null, null, null, null] +11912 - Bush - [null, null, null, null, null] +11913 - Bush - [null, null, null, null, null] +11914 - Bush - [null, null, null, null, null] +11915 - Rocks - [Mine, Prospect, hidden, null, null] +11916 - Rocks - [Mine, Prospect, hidden, null, null] +11917 - Rocks - [Mine, Prospect, hidden, null, null] +11918 - Rocks - [Mine, Prospect, hidden, null, null] +11919 - Rocks - [Mine, Prospect, hidden, null, null] +11920 - Rocks - [Mine, Prospect, hidden, null, null] +11921 - Rocks - [Mine, Prospect, hidden, null, null] +11922 - Rocks - [Mine, Prospect, hidden, null, null] +11923 - Rocks - [Mine, Prospect, hidden, null, null] +11924 - Rocks - [Mine, Prospect, hidden, null, null] +11925 - Rocks - [Mine, Prospect, hidden, null, null] +11926 - Rocks - [Mine, Prospect, hidden, null, null] +11927 - Rocks - [Mine, Prospect, hidden, null, null] +11928 - Rocks - [Mine, Prospect, hidden, null, null] +11929 - Rocks - [Mine, Prospect, hidden, null, null] +11930 - Rocks - [Mine, Prospect, hidden, null, null] +11931 - Rocks - [Mine, Prospect, hidden, null, null] +11932 - Rocks - [Mine, Prospect, hidden, null, null] +11933 - Rocks - [Mine, Prospect, hidden, null, null] +11934 - Rocks - [Mine, Prospect, hidden, null, null] +11935 - Rocks - [Mine, Prospect, hidden, null, null] +11936 - Rocks - [Mine, Prospect, hidden, null, null] +11937 - Rocks - [Mine, Prospect, hidden, null, null] +11938 - Rocks - [Mine, Prospect, hidden, null, null] +11939 - Rocks - [Mine, Prospect, hidden, null, null] +11940 - Rocks - [Mine, Prospect, hidden, null, null] +11941 - Rocks - [Mine, Prospect, hidden, null, null] +11942 - Rocks - [Mine, Prospect, hidden, null, null] +11943 - Rocks - [Mine, Prospect, hidden, null, null] +11944 - Rocks - [Mine, Prospect, hidden, null, null] +11945 - Rocks - [Mine, Prospect, hidden, null, null] +11946 - Rocks - [Mine, Prospect, hidden, null, null] +11947 - Rocks - [Mine, Prospect, hidden, null, null] +11948 - Rocks - [Mine, Prospect, hidden, null, null] +11949 - Rocks - [Mine, Prospect, hidden, null, null] +11950 - Rocks - [Mine, Prospect, hidden, null, null] +11951 - Rocks - [Mine, Prospect, hidden, null, null] +11952 - Rocks - [Mine, Prospect, hidden, null, null] +11953 - Rocks - [Mine, Prospect, hidden, null, null] +11954 - Rocks - [Mine, Prospect, hidden, null, null] +11955 - Rocks - [Mine, Prospect, hidden, null, null] +11956 - Rocks - [Mine, Prospect, hidden, null, null] +11957 - Rocks - [Mine, Prospect, hidden, null, null] +11958 - Rocks - [Mine, Prospect, hidden, null, null] +11959 - Rocks - [Mine, Prospect, hidden, null, null] +11960 - Rocks - [Mine, Prospect, hidden, null, null] +11961 - Rocks - [Mine, Prospect, hidden, null, null] +11962 - Rocks - [Mine, Prospect, hidden, null, null] +11963 - Rocks - [Mine, Prospect, hidden, null, null] +11964 - Rocks - [Mine, Prospect, hidden, null, null] +11965 - Rocks - [Mine, Prospect, hidden, null, null] +11966 - null - [null, null, null, null, null] +11967 - null - [null, null, null, null, null] +11968 - null - [null, null, null, null, null] +11969 - null - [null, null, null, null, null] +11970 - null - [null, null, null, null, null] +11971 - null - [null, null, null, null, null] +11972 - null - [null, null, null, null, null] +11973 - null - [null, null, null, null, null] +11974 - null - [null, null, null, null, null] +11975 - null - [null, null, null, null, null] +11976 - null - [null, null, null, null, null] +11977 - null - [null, null, null, null, null] +11978 - null - [null, null, null, null, null] +11979 - null - [null, null, null, null, null] +11980 - null - [null, null, null, null, null] +11981 - null - [null, null, null, null, null] +11982 - null - [null, null, null, null, null] +11983 - null - [null, null, null, null, null] +11984 - null - [null, null, null, null, null] +11985 - null - [null, null, null, null, null] +11986 - null - [null, null, null, null, null] +11987 - null - [null, null, null, null, null] +11988 - null - [null, null, null, null, null] +11989 - null - [null, null, null, null, null] +11990 - null - [null, null, null, null, null] +11991 - null - [null, null, null, null, null] +11992 - null - [null, null, null, null, null] +11993 - Door - [Open, null, null, null, null] +11994 - Door - [Close, null, null, null, null] +11995 - null - [null, null, null, null, null] +11996 - null - [null, null, null, null, null] +11997 - null - [null, null, null, null, null] +11998 - null - [null, null, null, null, null] +11999 - null - [null, null, null, null, null] +12000 - null - [null, null, null, null, null] +12001 - null - [null, null, null, null, null] +12002 - null - [null, null, null, null, null] +12003 - Fairy ring - [Use, null, null, null, null] +12004 - A gap through the wall - [Squeeze-through, null, null, null, null] +12005 - Mushroom torch - [null, null, null, null, null] +12006 - Mushroom torch - [null, null, null, null, null] +12007 - null - [null, null, null, null, null] +12008 - null - [null, null, null, null, null] +12009 - null - [null, null, null, null, null] +12010 - null - [null, null, null, null, null] +12011 - null - [null, null, null, null, null] +12012 - null - [null, null, null, null, null] +12013 - null - [null, null, null, null, null] +12014 - null - [null, null, null, null, null] +12015 - null - [null, null, null, null, null] +12016 - null - [null, null, null, null, null] +12017 - null - [null, null, null, null, null] +12018 - null - [null, null, null, null, null] +12019 - null - [null, null, null, null, null] +12020 - null - [null, null, null, null, null] +12021 - null - [null, null, null, null, null] +12022 - null - [null, null, null, null, null] +12023 - null - [null, null, null, null, null] +12024 - null - [null, null, null, null, null] +12025 - null - [null, null, null, null, null] +12026 - null - [null, null, null, null, null] +12027 - null - [null, null, null, null, null] +12028 - null - [null, null, null, null, null] +12029 - null - [null, null, null, null, null] +12030 - null - [null, null, null, null, null] +12031 - null - [null, null, null, null, null] +12032 - null - [null, null, null, null, null] +12033 - null - [null, null, null, null, null] +12034 - null - [null, null, null, null, null] +12035 - null - [null, null, null, null, null] +12036 - null - [null, null, null, null, null] +12037 - null - [null, null, null, null, null] +12038 - null - [null, null, null, null, null] +12039 - null - [null, null, null, null, null] +12040 - null - [null, null, null, null, null] +12041 - A gap through the wall - [Squeeze-through, null, null, null, null] +12042 - A wall - [null, null, null, null, null] +12043 - A wall - [null, null, null, null, null] +12044 - null - [null, null, null, null, null] +12045 - Magic door - [Open, null, null, null, null] +12046 - Magic door - [Close, null, null, null, null] +12047 - Magic door - [Open, null, null, null, null] +12048 - Magic door - [Close, null, null, null, null] +12049 - null - [null, null, null, null, null] +12050 - null - [null, null, null, null, null] +12051 - null - [null, null, null, null, null] +12052 - null - [null, null, null, null, null] +12053 - null - [null, null, null, null, null] +12054 - null - [null, null, null, null, null] +12055 - null - [null, null, null, null, null] +12056 - null - [null, null, null, null, null] +12057 - null - [null, null, null, null, null] +12058 - null - [null, null, null, null, null] +12059 - null - [null, null, null, null, null] +12060 - Potion shelves - [null, null, null, null, null] +12061 - Potion shelves - [null, null, null, null, null] +12062 - Potion shelf - [null, null, null, null, null] +12063 - Potion shelf - [null, null, null, null, null] +12064 - Healing certificate - [Examine, null, null, null, null] +12065 - Certificate of healing - [null, null, null, null, null] +12066 - A fairy workbench - [null, null, null, null, null] +12067 - A fairy workbench - [null, null, null, null, null] +12068 - null - [null, null, null, null, null] +12069 - null - [null, null, null, null, null] +12070 - null - [null, null, null, null, null] +12071 - null - [null, null, null, null, null] +12072 - null - [null, null, null, null, null] +12073 - null - [null, null, null, null, null] +12074 - null - [null, null, null, null, null] +12075 - null - [null, null, null, null, null] +12076 - null - [null, null, null, null, null] +12077 - null - [null, null, null, null, null] +12078 - null - [null, null, null, null, null] +12079 - null - [null, null, null, null, null] +12080 - null - [null, null, null, null, null] +12081 - null - [null, null, null, null, null] +12082 - null - [null, null, null, null, null] +12083 - null - [null, null, null, null, null] +12084 - null - [null, null, null, null, null] +12085 - null - [null, null, null, null, null] +12086 - null - [null, null, null, null, null] +12087 - null - [null, null, null, null, null] +12088 - null - [null, null, null, null, null] +12089 - Fairy fountain - [null, null, null, null, null] +12090 - Fairy Queen - [null, null, null, null, null] +12091 - Fairy Queen throne - [null, null, null, null, null] +12092 - Godfather throne - [null, null, null, null, null] +12093 - Chicken Shrine - [null, null, null, null, null] +12094 - Fairy ring - [Use, null, null, null, null] +12095 - Fairy ring - [Use, null, null, null, null] +12096 - null - [null, null, null, null, null] +12097 - null - [null, null, null, null, null] +12098 - null - [null, null, null, null, null] +12099 - null - [null, null, null, null, null] +12100 - Furnace - [null, Smelt, null, null, null] +12101 - null - [null, null, null, null, null] +12102 - Range - [null, null, null, null, null] +12103 - Crate - [Search, null, null, null, null] +12104 - Crates - [Search, null, null, null, null] +12105 - Crate - [Search, null, null, null, null] +12106 - Table - [null, null, null, null, null] +12107 - Barrel - [null, null, null, null, null] +12108 - Table - [null, null, null, null, null] +12109 - Wall - [null, null, null, null, null] +12110 - G.A.G. banner - [null, null, null, null, null] +12111 - Dairy Cow - [Talk-to, Milk, null, Steal-cowbell, null] +12112 - Ladder - [Climb-up, null, null, null, null] +12113 - Ladder - [Climb-down, null, null, null, null] +12114 - Cow wheel - [null, null, null, null, null] +12115 - Sacks - [null, null, null, null, null] +12116 - null - [null, null, null, null, null] +12117 - null - [null, null, null, null, null] +12118 - null - [null, null, null, null, null] +12119 - null - [null, null, null, null, null] +12120 - Closed chest - [Open, null, null, null, null] +12121 - Open chest - [null, Search, Shut, null, null] +12122 - Water Trough - [null, null, null, null, null] +12123 - null - [null, null, null, null, null] +12124 - null - [null, null, null, null, null] +12125 - Gravestone - [null, null, null, null, null] +12126 - Damaged wall - [null, null, null, null, null] +12127 - Jutting wall - [Squeeze-past, null, null, null, null] +12128 - Fairy ring - [Use, null, null, null, null] +12129 - null - [null, null, null, null, null] +12130 - null - [null, null, null, null, null] +12131 - Stairs - [null, null, null, null, null] +12132 - Tomb - [null, null, null, null, null] +12133 - Juliet - [null, null, null, null, null] +12134 - Coffin - [null, null, null, null, null] +12135 - Coffin - [null, null, null, null, null] +12136 - null - [null, null, null, null, null] +12137 - null - [Study, null, null, null, null] +12138 - null - [Study, null, null, null, null] +12139 - null - [Study, null, null, null, null] +12140 - Church pew - [null, null, null, null, null] +12141 - null - [null, null, null, null, null] +12142 - null - [null, null, null, null, null] +12143 - null - [null, null, null, null, null] +12144 - Canoe Station - [Chop-down, null, null, null, null] +12145 - Canoe Station - [null, null, null, null, null] +12146 - Canoe Station - [Shape-Canoe, null, hidden, null, null] +12147 - Canoe Station - [Float Log, null, hidden, null, null] +12148 - Canoe Station - [Float Canoe, null, null, null, null] +12149 - Canoe Station - [Float Canoe, null, null, null, null] +12150 - Canoe Station - [Float Canoe, null, null, null, null] +12151 - Canoe Station - [Paddle Log, null, null, null, null] +12152 - Canoe Station - [Paddle Canoe, null, null, null, null] +12153 - Canoe Station - [Paddle Canoe, null, null, null, null] +12154 - Canoe Station - [Paddle Canoe, null, null, null, null] +12155 - Canoe Station - [Paddle Canoe, null, null, null, null] +12156 - Canoe Station - [Paddle Canoe, null, null, null, null] +12157 - Canoe Station - [Paddle Canoe, null, null, null, null] +12158 - Canoe Station - [Paddle Canoe, null, null, null, null] +12159 - A Sinking Canoe - [null, null, null, null, null] +12160 - A Sinking Canoe - [null, null, null, null, null] +12161 - A Sinking Canoe - [null, null, null, null, null] +12162 - A Sinking Canoe - [null, null, null, null, null] +12163 - Canoe station - [Chop-down, null, null, null, null] +12164 - Canoe station - [Chop-down, null, null, null, null] +12165 - Canoe station - [Chop-down, null, null, null, null] +12166 - Canoe station - [Chop-down, null, null, null, null] +12167 - null - [null, null, null, null, null] +12168 - null - [null, null, null, null, null] +12169 - null - [null, null, null, null, null] +12170 - null - [null, null, null, null, null] +12171 - null - [null, null, null, null, null] +12172 - null - [null, null, null, null, null] +12173 - null - [null, null, null, null, null] +12174 - null - [null, null, null, null, null] +12175 - null - [null, null, null, null, null] +12176 - null - [null, null, null, null, null] +12177 - null - [null, null, null, null, null] +12178 - null - [null, null, null, null, null] +12179 - null - [null, null, null, null, null] +12180 - null - [null, null, null, null, null] +12181 - null - [null, null, null, null, null] +12182 - null - [null, null, null, null, null] +12183 - null - [null, null, null, null, null] +12184 - null - [null, null, null, null, null] +12185 - null - [null, null, null, null, null] +12186 - null - [null, null, null, null, null] +12187 - null - [null, null, null, null, null] +12188 - null - [null, null, null, null, null] +12189 - null - [null, null, null, null, null] +12190 - null - [null, null, null, null, null] +12191 - null - [null, null, null, null, null] +12192 - null - [null, null, null, null, null] +12193 - null - [null, null, null, null, null] +12194 - null - [null, null, null, null, null] +12195 - null - [null, null, null, null, null] +12196 - null - [null, null, null, null, null] +12197 - null - [null, null, null, null, null] +12198 - null - [null, null, null, null, null] +12199 - null - [null, null, null, null, null] +12200 - null - [null, null, null, null, null] +12201 - Well - [null, null, null, null, null] +12202 - Mole hill - [null, null, null, null, null] +12203 - Light - [null, null, null, null, null] +12204 - null - [null, null, null, null, null] +12205 - null - [null, null, null, null, null] +12206 - null - [null, null, null, null, null] +12207 - null - [null, null, null, null, null] +12208 - null - [null, null, null, null, null] +12209 - null - [null, null, null, null, null] +12210 - null - [null, null, null, null, null] +12211 - null - [null, null, null, null, null] +12212 - null - [null, null, null, null, null] +12213 - null - [null, null, null, null, null] +12214 - null - [null, null, null, null, null] +12215 - null - [null, null, null, null, null] +12216 - null - [null, null, null, null, null] +12217 - null - [null, null, null, null, null] +12218 - null - [null, null, null, null, null] +12219 - null - [null, null, null, null, null] +12220 - null - [null, null, null, null, null] +12221 - null - [null, null, null, null, null] +12222 - null - [null, null, null, null, null] +12223 - null - [null, null, null, null, null] +12224 - null - [null, null, null, null, null] +12225 - null - [null, null, null, null, null] +12226 - null - [null, null, null, null, null] +12227 - null - [null, null, null, null, null] +12228 - null - [null, null, null, null, null] +12229 - null - [null, null, null, null, null] +12230 - Rope - [Climb, null, null, null, null] +12231 - null - [null, null, null, null, null] +12232 - null - [Study, null, null, null, null] +12233 - null - [Study, null, null, null, null] +12234 - null - [Study, null, null, null, null] +12235 - Kurask head - [null, null, null, null, null] +12236 - Mounted sea bass - [null, null, null, null, null] +12237 - Mounted swordfish - [null, null, null, null, null] +12238 - null - [null, null, null, null, null] +12239 - Vanilla plant - [Search, null, null, null, null] +12240 - Bones - [null, null, null, null, null] +12241 - Bones - [null, null, null, null, null] +12242 - Bones - [null, null, null, null, null] +12243 - Skeleton - [null, null, null, null, null] +12244 - Skeleton - [null, null, null, null, null] +12245 - Skeleton - [null, null, null, null, null] +12246 - Skeleton - [null, null, null, null, null] +12247 - Skeleton - [null, null, null, null, null] +12248 - Skeleton - [null, null, null, null, null] +12249 - null - [null, null, null, null, null] +12250 - null - [null, null, null, null, null] +12251 - null - [null, null, null, null, null] +12252 - null - [null, null, null, null, null] +12253 - Tunnel entrance - [null, null, null, null, null] +12254 - Tunnel entrance - [Climb-down, null, null, null, null] +12255 - Rope - [Climb-up, null, null, null, null] +12256 - Nest - [Search, null, null, null, null] +12257 - Dragon egg - [null, null, null, null, null] +12258 - Dragonfire - [null, null, null, null, null] +12259 - Nest - [null, null, null, null, null] +12260 - Portal - [Use, null, null, null, null] +12261 - null - [null, null, null, null, null] +12262 - Trapdoor - [Open, null, null, null, null] +12263 - Trapdoor - [Go-down, null, null, null, null] +12264 - Ladder - [Climb, null, null, null, null] +12265 - Cellar stairs - [Climb, null, null, null, null] +12266 - null - [null, null, null, null, null] +12267 - Trapdoor - [Open, null, null, null, null] +12268 - Open trapdoor - [Go-down, Close, null, null, null] +12269 - Stove - [null, null, null, null, null] +12270 - null - [null, null, null, null, null] +12271 - null - [null, null, null, null, null] +12272 - null - [null, null, null, null, null] +12273 - null - [null, null, null, null, null] +12274 - null - [null, null, null, null, null] +12275 - null - [null, null, null, null, null] +12276 - null - [null, null, null, null, null] +12277 - null - [null, null, null, null, null] +12278 - null - [null, null, null, null, null] +12279 - Sink - [null, null, null, null, null] +12280 - Large Table - [null, null, null, null, null] +12281 - Small Table - [null, null, null, null, null] +12282 - Bookcase - [null, null, null, null, null] +12283 - null - [null, null, null, null, null] +12284 - null - [null, null, null, null, null] +12285 - null - [null, null, null, null, null] +12286 - null - [null, null, null, null, null] +12287 - null - [null, null, null, null, null] +12288 - null - [null, null, null, null, null] +12289 - null - [null, null, null, null, null] +12290 - null - [null, null, null, null, null] +12291 - null - [null, null, null, null, null] +12292 - null - [null, null, null, null, null] +12293 - Grandfather clock - [null, null, null, null, null] +12294 - null - [null, null, null, null, null] +12295 - null - [null, null, null, null, null] +12296 - null - [null, null, null, null, null] +12297 - null - [null, null, null, null, null] +12298 - null - [null, null, null, null, null] +12299 - null - [null, null, null, null, null] +12300 - null - [null, null, null, null, null] +12301 - Candles - [null, null, null, null, null] +12302 - Candles - [null, null, null, null, null] +12303 - null - [null, null, null, null, null] +12304 - null - [null, null, null, null, null] +12305 - null - [null, null, null, null, null] +12306 - null - [null, null, null, null, null] +12307 - null - [null, null, null, null, null] +12308 - null - [null, null, null, null, null] +12309 - Chest - [Bank, Buy-food, Buy-items, null, null] +12310 - Chair - [null, null, null, null, null] +12311 - Chair - [null, null, null, null, null] +12312 - Chair - [null, null, null, null, null] +12313 - Chair - [null, null, null, null, null] +12314 - Banquet table - [null, null, null, null, null] +12315 - Banquet table - [null, null, null, null, null] +12316 - Banquet table - [null, null, null, null, null] +12317 - Banquet table - [null, null, null, null, null] +12318 - Chair - [null, null, null, null, null] +12319 - Chair - [null, null, null, null, null] +12320 - Pirate Pete - [null, null, null, null, null] +12321 - Dwarf - [null, null, null, null, null] +12322 - General Wartface - [null, null, null, null, null] +12323 - General Bentnoze - [null, null, null, null, null] +12324 - Lumbridge Guide - [null, null, null, null, null] +12325 - Evil Dave - [null, null, null, null, null] +12326 - Sir Amik Varze - [null, null, null, null, null] +12327 - Awowogei - [null, null, null, null, null] +12328 - Skrach Uglogwee - [null, null, null, null, null] +12329 - null - [null, null, null, null, null] +12330 - Dwarf - [Inspect, null, null, null, null] +12331 - null - [null, null, null, null, null] +12332 - General Bentnoze - [Inspect, null, null, null, null] +12333 - null - [null, null, null, null, null] +12334 - General Wartface - [Inspect, null, null, null, null] +12335 - null - [null, null, null, null, null] +12336 - null - [null, null, null, null, null] +12337 - Pirate Pete - [Inspect, null, null, null, null] +12338 - null - [null, null, null, null, null] +12339 - Lumbridge Guide - [Inspect, null, null, null, null] +12340 - null - [null, null, null, null, null] +12341 - Evil Dave - [Inspect, null, null, null, null] +12342 - null - [null, null, null, null, null] +12343 - Skrach Uglogwee - [Inspect, null, null, null, null] +12344 - null - [null, null, null, null, null] +12345 - Sir Amik Varze - [Inspect, null, null, null, null] +12346 - null - [null, null, null, null, null] +12347 - Awowogei - [Inspect, null, null, null, null] +12348 - Door - [Open, null, null, null, null] +12349 - Large door - [Open, null, null, null, null] +12350 - Large door - [Open, null, null, null, null] +12351 - Barrier - [Pass-through, null, null, null, null] +12352 - Barrier - [Pass-through, null, null, null, null] +12353 - Barrier - [Pass-through, null, null, null, null] +12354 - null - [null, null, null, null, null] +12355 - Portal - [Use, null, null, null, null] +12356 - Portal - [Use, null, null, null, null] +12357 - null - [null, null, null, null, null] +12358 - null - [null, null, null, null, null] +12359 - null - [null, null, null, null, null] +12360 - null - [null, null, null, null, null] +12361 - null - [null, null, null, null, null] +12362 - null - [null, null, null, null, null] +12363 - null - [null, null, null, null, null] +12364 - null - [null, null, null, null, null] +12365 - null - [null, null, null, null, null] +12366 - null - [null, null, null, null, null] +12367 - null - [null, null, null, null, null] +12368 - null - [null, null, null, null, null] +12369 - null - [null, null, null, null, null] +12370 - null - [null, null, null, null, null] +12371 - null - [null, null, null, null, null] +12372 - null - [null, null, null, null, null] +12373 - null - [null, null, null, null, null] +12374 - null - [null, null, null, null, null] +12375 - null - [null, null, null, null, null] +12376 - null - [null, null, null, null, null] +12377 - null - [null, null, null, null, null] +12378 - null - [null, null, null, null, null] +12379 - null - [null, null, null, null, null] +12380 - null - [null, null, null, null, null] +12381 - null - [null, null, null, null, null] +12382 - null - [null, null, null, null, null] +12383 - null - [null, null, null, null, null] +12384 - null - [null, null, null, null, null] +12385 - null - [null, null, null, null, null] +12386 - Table - [null, null, null, null, null] +12387 - Table - [null, null, null, null, null] +12388 - Table - [null, null, null, null, null] +12389 - Ladder - [Climb-Down, null, null, null, null] +12390 - Ladder - [Climb-up, null, null, null, null] +12391 - Ladder - [Climb-up, null, null, null, null] +12392 - Sacks - [null, null, null, null, null] +12393 - Sacks - [null, null, null, null, null] +12394 - Sack Pile - [null, null, null, null, null] +12395 - Sack Pile - [null, null, null, null, null] +12396 - Sack - [null, null, null, null, null] +12397 - null - [null, null, null, null, null] +12398 - null - [null, null, null, null, null] +12399 - Sack - [null, null, null, null, null] +12400 - Cauldron - [null, null, null, null, null] +12401 - Cauldron - [null, null, null, null, null] +12402 - Explosion - [null, null, null, null, null] +12403 - Shelves - [null, null, null, null, null] +12404 - Shelves - [null, null, null, null, null] +12405 - Cupboard - [null, null, null, null, null] +12406 - Cupboard - [null, null, null, null, null] +12407 - Stool - [null, null, null, null, null] +12408 - Stool - [null, null, null, null, null] +12409 - Stool - [null, null, null, null, null] +12410 - Saucepan - [null, null, null, null, null] +12411 - Saucepan - [null, null, null, null, null] +12412 - Rolling pin - [null, null, null, null, null] +12413 - Rolling pin - [null, null, null, null, null] +12414 - Spork - [null, null, null, null, null] +12415 - Spork - [null, null, null, null, null] +12416 - null - [null, null, null, null, null] +12417 - null - [null, null, null, null, null] +12418 - null - [null, null, null, null, null] +12419 - null - [null, null, null, null, null] +12420 - null - [null, null, null, null, null] +12421 - null - [null, null, null, null, null] +12422 - null - [null, null, null, null, null] +12423 - null - [null, null, null, null, null] +12424 - null - [null, null, null, null, null] +12425 - null - [null, null, null, null, null] +12426 - null - [null, null, null, null, null] +12427 - null - [null, null, null, null, null] +12428 - null - [null, null, null, null, null] +12429 - null - [null, null, null, null, null] +12430 - null - [null, null, null, null, null] +12431 - null - [null, null, null, null, null] +12432 - null - [null, null, null, null, null] +12433 - null - [null, null, null, null, null] +12434 - Barrel - [null, null, null, null, null] +12435 - Barrel - [null, null, null, null, null] +12436 - null - [null, null, null, null, null] +12437 - null - [null, null, null, null, null] +12438 - null - [null, null, null, null, null] +12439 - null - [null, null, null, null, null] +12440 - Stool - [null, null, null, null, null] +12441 - null - [null, null, null, null, null] +12442 - Crate - [null, null, null, null, null] +12443 - Crate - [null, null, null, null, null] +12444 - Door - [Open, null, null, null, null] +12445 - Door - [Close, null, null, null, null] +12446 - Large door - [Open, null, null, null, null] +12447 - Large door - [Close, null, null, null, null] +12448 - Large door - [Open, null, null, null, null] +12449 - Large door - [Close, null, null, null, null] +12450 - Table - [null, null, null, null, null] +12451 - Chest - [Open, null, null, null, null] +12452 - Chest - [Close, Search, null, null, null] +12453 - Skulls - [null, null, null, null, null] +12454 - null - [null, null, null, null, null] +12455 - null - [null, null, null, null, null] +12456 - null - [null, null, null, null, null] +12457 - null - [null, null, null, null, null] +12458 - null - [null, null, null, null, null] +12459 - null - [null, null, null, null, null] +12460 - Underwater Cavern Entrance - [Enter, null, null, null, null] +12461 - Underwater Cavern Entrance - [Enter, null, null, null, null] +12462 - Underwater Cavern Entrance - [Exit, null, null, null, null] +12463 - Underwater Cavern Entrance - [Exit, null, null, null, null] +12464 - null - [null, null, null, null, null] +12465 - null - [null, null, null, null, null] +12466 - null - [null, null, null, null, null] +12467 - Pen Door - [Open, null, null, null, null] +12468 - Pen Door - [Open, null, null, null, null] +12469 - null - [null, null, null, null, null] +12470 - null - [null, null, null, null, null] +12471 - null - [null, null, null, null, null] +12472 - null - [null, null, null, null, null] +12473 - null - [null, null, null, null, null] +12474 - Anchor - [null, null, null, null, null] +12475 - Anchor - [Climb, null, null, null, null] +12476 - Anchor - [null, null, null, null, null] +12477 - Kelp - [null, null, null, null, null] +12478 - Kelp - [Pick, null, null, null, null] +12479 - Coral Reef - [null, null, null, null, null] +12480 - Coral - [null, null, null, null, null] +12481 - Coral - [null, null, null, null, null] +12482 - Coral - [null, null, null, null, null] +12483 - Coral - [null, null, null, null, null] +12484 - Coral - [null, null, null, null, null] +12485 - Coral - [null, null, null, null, null] +12486 - Coral - [null, null, null, null, null] +12487 - Coral - [null, null, null, null, null] +12488 - Coral - [null, null, null, null, null] +12489 - Coral - [null, null, null, null, null] +12490 - Coral - [null, null, null, null, null] +12491 - Coral - [null, null, null, null, null] +12492 - Coral - [null, null, null, null, null] +12493 - Coral - [null, null, null, null, null] +12494 - Coral - [null, null, null, null, null] +12495 - Coral - [null, null, null, null, null] +12496 - Coral - [null, null, null, null, null] +12497 - Coral - [null, null, null, null, null] +12498 - Coral - [null, null, null, null, null] +12499 - Coral Reef - [null, null, null, null, null] +12500 - Coral - [null, null, null, null, null] +12501 - Coral - [null, null, null, null, null] +12502 - Coral - [null, null, null, null, null] +12503 - Coral - [null, null, null, null, null] +12504 - Coral - [null, null, null, null, null] +12505 - Coral - [null, null, null, null, null] +12506 - Coral - [null, null, null, null, null] +12507 - Coral - [null, null, null, null, null] +12508 - Coral - [null, null, null, null, null] +12509 - Coral Reef - [null, null, null, null, null] +12510 - Coral - [null, null, null, null, null] +12511 - Coral - [null, null, null, null, null] +12512 - Coral - [null, null, null, null, null] +12513 - Coral - [null, null, null, null, null] +12514 - Coral - [null, null, null, null, null] +12515 - Coral - [null, null, null, null, null] +12516 - Coral - [null, null, null, null, null] +12517 - Coral - [null, null, null, null, null] +12518 - Coral - [null, null, null, null, null] +12519 - Coral - [null, null, null, null, null] +12520 - Coral Reef - [null, null, null, null, null] +12521 - Coral - [null, null, null, null, null] +12522 - Coral - [null, null, null, null, null] +12523 - Coral - [null, null, null, null, null] +12524 - Coral - [null, null, null, null, null] +12525 - Coral - [null, null, null, null, null] +12526 - Coral - [null, null, null, null, null] +12527 - Coral - [null, null, null, null, null] +12528 - Coral - [null, null, null, null, null] +12529 - Coral - [null, null, null, null, null] +12530 - Anchor - [null, null, null, null, null] +12531 - Bubbles - [null, null, null, null, null] +12532 - null - [null, null, null, null, null] +12533 - null - [null, null, null, null, null] +12534 - null - [null, null, null, null, null] +12535 - null - [null, null, null, null, null] +12536 - Staircase - [Climb-up, null, null, null, null] +12537 - Staircase - [Climb, Climb-up, Climb-down, null, null] +12538 - Staircase - [Climb-down, null, null, null, null] +12539 - Bookcase - [Search, null, null, null, null] +12540 - Bookcase - [Search, null, null, null, null] +12541 - Table - [null, null, null, null, null] +12542 - null - [null, null, null, null, null] +12543 - Large table - [null, null, null, null, null] +12544 - Table - [null, null, null, null, null] +12545 - Boxes - [Search, null, null, null, null] +12546 - Crate - [Search, null, null, null, null] +12547 - Crate - [Search, null, null, null, null] +12548 - Crates - [Search, null, null, null, null] +12549 - null - [null, null, null, null, null] +12550 - Old tree - [null, null, null, null, null] +12551 - Old tree - [null, null, null, null, null] +12552 - Old tree - [null, null, null, null, null] +12553 - Old tree - [null, null, null, null, null] +12554 - Crude boat - [null, null, null, null, null] +12555 - Roots - [null, null, null, null, null] +12556 - Rock and string - [null, null, null, null, null] +12557 - Rock and string - [null, null, null, null, null] +12558 - null - [null, null, null, null, null] +12559 - Tree - [null, null, null, null, null] +12560 - Tree - [null, null, null, null, null] +12561 - Ogre spit-roast - [null, null, null, null, null] +12562 - Ogre spit-roast - [null, null, null, null, null] +12563 - Ogre spit-roast - [null, null, null, null, null] +12564 - Pile of Rock - [Mine, Prospect, hidden, null, null] +12565 - Pile of Rock - [Mine, Prospect, hidden, null, null] +12566 - Pile of Rock - [Mine, Prospect, hidden, null, null] +12567 - Pile of Rock - [Mine, Prospect, null, null, null] +12568 - Stepping stone - [Jump-to, null, null, null, null] +12569 - Temp Stone 4 Zip - [Climb-down, null, null, null, null] +12570 - Tropical tree - [Climb, null, null, null, null] +12571 - Tropical tree - [null, null, null, null, null] +12572 - Tropical tree - [null, null, null, null, null] +12573 - Monkeybars - [Swing Across, null, null, null, null] +12574 - null - [null, null, null, null, null] +12575 - Monkeybars - [Swing Across, null, null, null, null] +12576 - Skull slope - [Climb-up, null, null, null, null] +12577 - null - [null, null, null, null, null] +12578 - Rope - [Swing, null, null, null, null] +12579 - Tropical tree - [null, null, null, null, null] +12580 - Tropical tree - [null, null, null, null, null] +12581 - Hole - [Enter, null, null, null, null] +12582 - null - [null, null, null, null, null] +12583 - null - [null, null, null, null, null] +12584 - null - [null, null, null, null, null] +12585 - null - [null, null, null, null, null] +12586 - null - [null, null, null, null, null] +12587 - null - [null, null, null, null, null] +12588 - null - [null, null, null, null, null] +12589 - Rock - [null, null, null, null, null] +12590 - Rock - [null, null, null, null, null] +12591 - null - [null, null, null, null, null] +12592 - null - [null, null, null, null, null] +12593 - null - [null, null, null, null, null] +12594 - Snake - [null, null, null, null, null] +12595 - Snake - [null, null, null, null, null] +12596 - Snake - [null, null, null, null, null] +12597 - Hole - [null, null, null, null, null] +12598 - Snake - [null, null, null, null, null] +12599 - Snake - [null, null, null, null, null] +12600 - Snake - [null, null, null, null, null] +12601 - Rope - [Climb, null, null, null, null] +12602 - Pit - [Enter, null, null, null, null] +12603 - Tchiki Monkey Nut Bush - [Pick Nuts, null, null, null, null] +12604 - Strange Banana Tree - [Pick Banana, null, null, null, null] +12605 - Light - [Climb, null, null, null, null] +12606 - Banana tree - [Pick, null, null, null, null] +12607 - Banana tree - [Pick, null, null, null, null] +12608 - Red Banana Tree - [null, null, null, null, null] +12609 - Red Banana Tree - [Pick, null, null, null, null] +12610 - null - [null, null, null, null, null] +12611 - null - [null, null, null, null, null] +12612 - null - [null, null, null, null, null] +12613 - null - [null, null, null, null, null] +12614 - null - [null, null, null, null, null] +12615 - Bush - [Pick, null, null, null, null] +12616 - Exit - [Climb-up, null, null, null, null] +12617 - Exit - [Enter, null, null, null, null] +12618 - Tropical tree - [Climb-down, null, null, null, null] +12619 - null - [null, null, null, null, null] +12620 - null - [null, null, null, null, null] +12621 - null - [null, null, null, null, null] +12622 - Vine - [Climb-down, null, null, null, null] +12623 - null - [null, null, null, null, null] +12624 - null - [null, null, null, null, null] +12625 - null - [null, null, null, null, null] +12626 - null - [null, null, null, null, null] +12627 - Tropical tree - [null, null, null, null, null] +12628 - null - [null, null, null, null, null] +12629 - null - [null, null, null, null, null] +12630 - null - [null, null, null, null, null] +12631 - null - [null, null, null, null, null] +12632 - null - [null, null, null, null, null] +12633 - null - [null, null, null, null, null] +12634 - Rock - [null, null, null, null, null] +12635 - Rock - [null, null, null, null, null] +12636 - Rock - [null, null, null, null, null] +12637 - Rock - [null, null, null, null, null] +12638 - null - [null, null, null, null, null] +12639 - null - [null, null, null, null, null] +12640 - null - [null, null, null, null, null] +12641 - null - [null, null, null, null, null] +12642 - null - [null, null, null, null, null] +12643 - null - [null, null, null, null, null] +12644 - null - [null, null, null, null, null] +12645 - null - [null, null, null, null, null] +12646 - null - [null, null, null, null, null] +12647 - null - [null, null, null, null, null] +12648 - null - [null, null, null, null, null] +12649 - null - [null, null, null, null, null] +12650 - null - [null, null, null, null, null] +12651 - null - [null, null, null, null, null] +12652 - null - [null, null, null, null, null] +12653 - null - [null, null, null, null, null] +12654 - null - [null, null, null, null, null] +12655 - null - [null, null, null, null, null] +12656 - null - [null, null, null, null, null] +12657 - Exit - [Enter, null, null, null, null] +12658 - null - [null, null, null, null, null] +12659 - null - [null, null, null, null, null] +12660 - null - [null, null, null, null, null] +12661 - Signpost - [null, null, null, null, null] +12662 - null - [null, null, null, null, null] +12663 - null - [null, null, null, null, null] +12664 - null - [null, null, null, null, null] +12665 - null - [null, null, null, null, null] +12666 - null - [null, null, null, null, null] +12667 - null - [null, null, null, null, null] +12668 - null - [null, null, null, null, null] +12669 - null - [null, null, null, null, null] +12670 - null - [null, null, null, null, null] +12671 - null - [null, null, null, null, null] +12672 - null - [null, null, null, null, null] +12673 - null - [null, null, null, null, null] +12674 - null - [null, null, null, null, null] +12675 - null - [null, null, null, null, null] +12676 - null - [null, null, null, null, null] +12677 - null - [null, null, null, null, null] +12678 - null - [null, null, null, null, null] +12679 - null - [null, null, null, null, null] +12680 - null - [null, null, null, null, null] +12681 - null - [null, null, null, null, null] +12682 - null - [null, null, null, null, null] +12683 - Bridge - [null, null, null, null, null] +12684 - Bridge - [null, null, null, null, null] +12685 - null - [null, null, null, null, null] +12686 - null - [null, null, null, null, null] +12687 - null - [null, null, null, null, null] +12688 - null - [null, null, null, null, null] +12689 - null - [null, null, null, null, null] +12690 - null - [null, null, null, null, null] +12691 - null - [null, null, null, null, null] +12692 - null - [null, null, null, null, null] +12693 - null - [null, null, null, null, null] +12694 - null - [null, null, null, null, null] +12695 - null - [null, null, null, null, null] +12696 - null - [null, null, null, null, null] +12697 - null - [null, null, null, null, null] +12698 - null - [null, null, null, null, null] +12699 - null - [null, null, null, null, null] +12700 - null - [null, null, null, null, null] +12701 - null - [null, null, null, null, null] +12702 - null - [null, null, null, null, null] +12703 - null - [null, null, null, null, null] +12704 - null - [null, null, null, null, null] +12705 - null - [null, null, null, null, null] +12706 - null - [null, null, null, null, null] +12707 - null - [null, null, null, null, null] +12708 - null - [null, null, null, null, null] +12709 - null - [null, null, null, null, null] +12710 - null - [null, null, null, null, null] +12711 - Grave - [Dig, null, null, null, null] +12712 - Grave - [Dig, null, null, null, null] +12713 - Grave - [Dig, null, null, null, null] +12714 - Grave - [Dig, null, null, null, null] +12715 - Grave - [Dig, null, null, null, null] +12716 - Gravestone - [Read, null, null, null, null] +12717 - Gravestone - [Read, null, null, null, null] +12718 - Gravestone - [Read, null, null, null, null] +12719 - Gravestone - [Read, null, null, null, null] +12720 - Gravestone - [Read, null, null, null, null] +12721 - Grave - [Take-Coffin, null, null, null, null] +12722 - Grave - [Take-Coffin, null, null, null, null] +12723 - Grave - [Take-Coffin, null, null, null, null] +12724 - Grave - [Take-Coffin, null, null, null, null] +12725 - Grave - [Take-Coffin, null, null, null, null] +12726 - Grave - [null, null, null, null, null] +12727 - Grave - [null, null, null, null, null] +12728 - Grave - [null, null, null, null, null] +12729 - Grave - [hidden, null, null, null, null] +12730 - Grave - [hidden, null, null, null, null] +12731 - Mausoleum - [Deposit, null, null, null, null] +12732 - Dead tree - [null, null, null, null, null] +12733 - Tree stump - [null, null, null, null, null] +12734 - Table - [Search, null, null, null, null] +12735 - Closed chest - [Open, null, null, null, null] +12736 - Open chest - [null, Search, null, null, null] +12737 - Broken down wall - [Climb-over, null, null, null, null] +12738 - null - [null, null, null, null, null] +12739 - Rubble - [null, null, null, null, null] +12740 - Rubble - [null, null, null, null, null] +12741 - Fallen Wall - [Search, null, null, null, null] +12742 - Rubble - [null, null, null, null, null] +12743 - null - [null, null, null, null, null] +12744 - Trapdoor - [Open, null, null, null, null] +12745 - Trapdoor - [Climb-down, Close, null, null, null] +12746 - Rubble - [Mine, Prospect, hidden, null, null] +12747 - Pile of rubble. - [null, null, null, null, null] +12748 - Ladder - [Climb-up, null, null, null, null] +12749 - Rubble Pile - [null, Search, null, null, null] +12750 - Plaque - [Search, null, null, null, null] +12751 - null - [null, null, null, null, null] +12752 - null - [null, null, null, null, null] +12753 - null - [null, null, null, null, null] +12754 - null - [null, null, null, null, null] +12755 - null - [null, null, null, null, null] +12756 - null - [null, null, null, null, null] +12757 - null - [null, null, null, null, null] +12758 - null - [null, null, null, null, null] +12759 - null - [null, null, null, null, null] +12760 - null - [null, null, null, null, null] +12761 - Door - [Open, null, null, null, null] +12762 - null - [null, null, null, null, null] +12763 - Trapdoor - [Climb-down, null, null, null, null] +12764 - Ladder - [Climb-up, null, null, null, null] +12765 - Keyhole - [Search, null, null, null, null] +12766 - Bookcase - [Search, null, null, null, null] +12767 - Bookcase - [Search, null, null, null, null] +12768 - Closed chest - [Open, null, null, null, null] +12769 - Open chest - [Search, Close, null, null, null] +12770 - Cave entrance - [Enter, null, null, null, null] +12771 - Cave entrance - [Enter, null, null, null, null] +12772 - null - [null, null, null, null, null] +12773 - Wooden boards - [null, null, null, null, null] +12774 - Rock - [null, null, null, null, null] +12775 - Marius - [Talk-to, null, null, null, null] +12776 - Low fence - [Jump-over, null, null, null, null] +12777 - Trapdoor - [null, null, null, null, null] +12778 - Trapdoor - [null, null, null, null, null] +12779 - Ladder - [Climb-up, null, null, null, null] +12780 - Ladder - [Climb-up, null, null, null, null] +12781 - Ladder - [Climb-down, null, null, null, null] +12782 - Broken Roof - [Search, null, null, null, null] +12783 - Repaired roof - [Search, null, null, null, null] +12784 - Bucket - [null, null, null, null, null] +12785 - Bucket - [null, null, null, null, null] +12786 - Repaired wall - [null, null, null, null, null] +12787 - Damaged wall - [Search, null, null, null, null] +12788 - null - [null, null, null, null, null] +12789 - null - [null, null, null, null, null] +12790 - null - [null, null, null, null, null] +12791 - null - [null, null, null, null, null] +12792 - null - [null, null, null, null, null] +12793 - null - [null, null, null, null, null] +12794 - null - [null, null, null, null, null] +12795 - null - [null, null, null, null, null] +12796 - Fire - [null, null, null, null, null] +12797 - null - [null, null, null, null, null] +12798 - Bank Booth - [Use, Use-quickly, Collect, null, null] +12799 - Bank Booth - [Search, null, null, null, null] +12800 - Bank Booth - [null, null, null, null, null] +12801 - Bank Booth - [null, null, null, null, null] +12802 - Tomb - [Search, null, null, null, null] +12803 - null - [null, null, null, null, null] +12804 - Barrel - [null, null, null, null, null] +12805 - null - [null, null, null, null, null] +12806 - Broken furnace - [Search, null, null, null, null] +12807 - Repaired furnace - [Search, null, null, null, null] +12808 - Repaired furnace - [Search, null, null, null, null] +12809 - Furnace - [null, Smelt, null, null, null] +12810 - null - [null, null, null, null, null] +12811 - null - [null, null, null, null, null] +12812 - Rubble - [Mine, Prospect, hidden, null, null] +12813 - Rubble - [Mine, Prospect, hidden, null, null] +12814 - Rubble - [Mine, Prospect, hidden, null, null] +12815 - Rubble - [null, null, null, null, null] +12816 - Gate - [Open, null, null, null, null] +12817 - Gate - [Open, null, null, null, null] +12818 - Gate - [null, null, null, null, null] +12819 - null - [null, null, null, null, null] +12820 - Exit path - [Search, Escape, null, null, null] +12821 - null - [null, null, null, null, null] +12822 - null - [null, null, null, null, null] +12823 - null - [null, null, null, null, null] +12824 - null - [null, null, null, null, null] +12825 - null - [null, null, null, null, null] +12826 - null - [null, null, null, null, null] +12827 - null - [null, null, null, null, null] +12828 - null - [null, null, null, null, null] +12829 - null - [null, null, null, null, null] +12830 - null - [null, null, null, null, null] +12831 - null - [null, null, null, null, null] +12832 - null - [null, null, null, null, null] +12833 - null - [null, null, null, null, null] +12834 - null - [null, null, null, null, null] +12835 - null - [null, null, null, null, null] +12836 - null - [null, null, null, null, null] +12837 - null - [null, null, null, null, null] +12838 - null - [null, null, null, null, null] +12839 - null - [null, null, null, null, null] +12840 - null - [null, null, null, null, null] +12841 - null - [null, null, null, null, null] +12842 - null - [null, null, null, null, null] +12843 - null - [null, null, null, null, null] +12844 - Pile of bricks - [null, null, null, null, null] +12845 - null - [null, null, null, null, null] +12846 - null - [null, null, null, null, null] +12847 - null - [null, null, null, null, null] +12848 - null - [null, null, null, null, null] +12849 - null - [null, null, null, null, null] +12850 - null - [null, null, null, null, null] +12851 - null - [null, null, null, null, null] +12852 - null - [null, null, null, null, null] +12853 - null - [null, null, null, null, null] +12854 - null - [null, null, null, null, null] +12855 - Table - [null, null, null, null, null] +12856 - Store door - [null, null, null, null, null] +12857 - Bar pumps - [null, null, null, null, null] +12858 - null - [null, null, null, null, null] +12859 - null - [null, null, null, null, null] +12860 - null - [null, null, null, null, null] +12861 - null - [null, null, null, null, null] +12862 - null - [null, null, null, null, null] +12863 - null - [null, null, null, null, null] +12864 - null - [null, null, null, null, null] +12865 - null - [null, null, null, null, null] +12866 - null - [null, null, null, null, null] +12867 - null - [null, null, null, null, null] +12868 - null - [null, null, null, null, null] +12869 - null - [null, null, null, null, null] +12870 - null - [null, null, null, null, null] +12871 - null - [null, null, null, null, null] +12872 - Trapdoor - [null, null, null, null, null] +12873 - Bookcase - [null, null, null, null, null] +12874 - Crate - [null, null, null, null, null] +12875 - Wheelbarrow - [null, null, null, null, null] +12876 - Crate - [null, null, null, null, null] +12877 - Crates - [null, null, null, null, null] +12878 - Boxes - [null, null, null, null, null] +12879 - Crate - [null, null, null, null, null] +12880 - Bed - [null, null, null, null, null] +12881 - Bookcase - [null, null, null, null, null] +12882 - Bookcase - [null, null, null, null, null] +12883 - Bookcase - [null, null, null, null, null] +12884 - Table - [null, null, null, null, null] +12885 - Chair - [null, null, null, null, null] +12886 - Chair - [null, null, null, null, null] +12887 - Chair - [null, null, null, null, null] +12888 - Chair - [null, null, null, null, null] +12889 - Smashed chair - [null, null, null, null, null] +12890 - Barrel - [null, null, null, null, null] +12891 - Barrel - [null, null, null, null, null] +12892 - Small Table - [null, null, null, null, null] +12893 - null - [null, null, null, null, null] +12894 - Tree Stump - [null, null, null, null, null] +12895 - Tree - [null, null, null, null, null] +12896 - Tree - [null, null, null, null, null] +12897 - Well - [null, null, null, null, null] +12898 - null - [null, null, null, null, null] +12899 - null - [null, null, null, null, null] +12900 - null - [null, null, null, null, null] +12901 - null - [null, null, null, null, null] +12902 - null - [null, null, null, null, null] +12903 - null - [null, null, null, null, null] +12904 - null - [null, null, null, null, null] +12905 - null - [null, null, null, null, null] +12906 - Ladder - [Climb-down, null, null, null, null] +12907 - Ladder - [Climb-up, null, null, null, null] +12908 - null - [null, null, null, null, null] +12909 - null - [null, null, null, null, null] +12910 - null - [null, null, null, null, null] +12911 - null - [null, null, null, null, null] +12912 - null - [null, null, null, null, null] +12913 - null - [null, null, null, null, null] +12914 - null - [null, null, null, null, null] +12915 - null - [null, null, null, null, null] +12916 - null - [null, null, null, null, null] +12917 - null - [null, null, null, null, null] +12918 - null - [null, null, null, null, null] +12919 - null - [null, null, null, null, null] +12920 - null - [null, null, null, null, null] +12921 - null - [null, null, null, null, null] +12922 - null - [null, null, null, null, null] +12923 - null - [null, null, null, null, null] +12924 - null - [null, null, null, null, null] +12925 - null - [null, null, null, null, null] +12926 - null - [null, null, null, null, null] +12927 - null - [null, null, null, null, null] +12928 - null - [null, null, null, null, null] +12929 - null - [null, null, null, null, null] +12930 - null - [null, null, null, null, null] +12931 - null - [null, null, null, null, null] +12932 - null - [null, null, null, null, null] +12933 - Counter - [null, null, null, null, null] +12934 - null - [null, null, null, null, null] +12935 - null - [null, null, null, null, null] +12936 - null - [null, null, null, null, null] +12937 - null - [null, null, null, null, null] +12938 - null - [null, null, null, null, null] +12939 - null - [null, null, null, null, null] +12940 - null - [null, null, null, null, null] +12941 - Mineral vein - [Mine, Prospect, null, null, null] +12942 - Mineral vein - [Mine, Prospect, null, null, null] +12943 - Mineral vein - [Mine, Prospect, null, null, null] +12944 - null - [null, null, null, null, null] +12945 - null - [null, null, null, null, null] +12946 - null - [null, null, null, null, null] +12947 - null - [null, null, null, null, null] +12948 - null - [null, null, null, null, null] +12949 - null - [null, null, null, null, null] +12950 - null - [null, null, null, null, null] +12951 - null - [null, null, null, null, null] +12952 - null - [null, null, null, null, null] +12953 - null - [null, null, null, null, null] +12954 - null - [null, null, null, null, null] +12955 - null - [null, null, null, null, null] +12956 - null - [null, null, null, null, null] +12957 - null - [null, null, null, null, null] +12958 - null - [null, null, null, null, null] +12959 - null - [null, null, null, null, null] +12960 - null - [null, null, null, null, null] +12961 - Crate - [null, null, null, null, null] +12962 - Table - [null, null, null, null, null] +12963 - Crate - [Search, null, null, null, null] +12964 - Ladder - [Climb-up, null, null, null, null] +12965 - Ladder - [Climb, Climb-up, Climb-down, null, null] +12966 - Ladder - [Climb-down, null, null, null, null] +12967 - Barrel - [null, null, null, null, null] +12968 - Barrel - [null, null, null, null, null] +12969 - Cooking pot - [null, null, null, null, null] +12970 - Bed - [null, null, null, null, null] +12971 - Table - [null, null, null, null, null] +12972 - Table - [null, null, null, null, null] +12973 - Chair - [null, null, null, null, null] +12974 - Sink - [null, null, null, null, null] +12975 - null - [null, null, null, null, null] +12976 - null - [null, null, null, null, null] +12977 - Crate - [null, null, null, null, null] +12978 - Crate - [null, null, null, null, null] +12979 - Rocking chair - [null, null, null, null, null] +12980 - Shelves - [null, null, null, null, null] +12981 - Hat stand - [null, null, null, null, null] +12982 - Stile - [Climb-over, null, null, null, null] +12983 - null - [null, null, null, null, null] +12984 - null - [null, null, null, null, null] +12985 - null - [null, null, null, null, null] +12986 - Gate - [Open, null, null, null, null] +12987 - Gate - [Open, null, null, null, null] +12988 - Gate - [Close, null, null, null, null] +12989 - Gate - [Close, null, null, null, null] +12990 - null - [null, null, null, null, null] +12991 - null - [null, null, null, null, null] +12992 - null - [null, null, null, null, null] +12993 - null - [null, null, null, null, null] +12994 - null - [null, null, null, null, null] +12995 - null - [null, null, null, null, null] +12996 - null - [null, null, null, null, null] +12997 - null - [null, null, null, null, null] +12998 - null - [null, null, null, null, null] +12999 - null - [null, null, null, null, null] +13000 - null - [null, null, null, null, null] +13001 - Door - [Open, null, null, null, null] +13002 - Door - [Close, null, null, null, null] +13003 - Closed chest - [null, null, null, null, null] +13004 - Open chest - [null, null, null, null, null] +13005 - null - [null, null, null, null, null] +13006 - Door - [Open, null, null, null, null] +13007 - Door - [Open, null, null, null, null] +13008 - Door - [Close, null, null, null, null] +13009 - Door - [Close, null, null, null, null] +13010 - null - [null, null, null, null, null] +13011 - null - [null, null, null, null, null] +13012 - null - [null, null, null, null, null] +13013 - null - [null, null, null, null, null] +13014 - null - [null, null, null, null, null] +13015 - Door - [Open, null, null, null, null] +13016 - Door - [Open, null, null, null, null] +13017 - Door - [Close, null, null, null, null] +13018 - Door - [Close, null, null, null, null] +13019 - null - [null, null, null, null, null] +13020 - null - [null, null, null, null, null] +13021 - null - [null, null, null, null, null] +13022 - null - [null, null, null, null, null] +13023 - null - [null, null, null, null, null] +13024 - null - [null, null, null, null, null] +13025 - null - [null, null, null, null, null] +13026 - null - [null, null, null, null, null] +13027 - null - [null, null, null, null, null] +13028 - null - [null, null, null, null, null] +13029 - null - [null, null, null, null, null] +13030 - null - [null, null, null, null, null] +13031 - null - [null, null, null, null, null] +13032 - null - [null, null, null, null, null] +13033 - null - [null, null, null, null, null] +13034 - null - [null, null, null, null, null] +13035 - null - [null, null, null, null, null] +13036 - null - [null, null, null, null, null] +13037 - null - [null, null, null, null, null] +13038 - null - [null, null, null, null, null] +13039 - null - [null, null, null, null, null] +13040 - null - [null, null, null, null, null] +13041 - null - [null, null, null, null, null] +13042 - null - [null, null, null, null, null] +13043 - null - [null, null, null, null, null] +13044 - null - [null, null, null, null, null] +13045 - null - [null, null, null, null, null] +13046 - null - [null, null, null, null, null] +13047 - null - [null, null, null, null, null] +13048 - null - [null, null, null, null, null] +13049 - null - [null, null, null, null, null] +13050 - null - [null, null, null, null, null] +13051 - null - [null, null, null, null, null] +13052 - null - [null, null, null, null, null] +13053 - null - [null, null, null, null, null] +13054 - null - [null, null, null, null, null] +13055 - null - [null, null, null, null, null] +13056 - null - [null, null, null, null, null] +13057 - null - [null, null, null, null, null] +13058 - null - [null, null, null, null, null] +13059 - null - [null, null, null, null, null] +13060 - null - [null, null, null, null, null] +13061 - null - [null, null, null, null, null] +13062 - null - [null, null, null, null, null] +13063 - null - [null, null, null, null, null] +13064 - null - [null, null, null, null, null] +13065 - null - [null, null, null, null, null] +13066 - null - [null, null, null, null, null] +13067 - null - [null, null, null, null, null] +13068 - null - [null, null, null, null, null] +13069 - null - [null, null, null, null, null] +13070 - null - [null, null, null, null, null] +13071 - null - [null, null, null, null, null] +13072 - null - [null, null, null, null, null] +13073 - null - [null, null, null, null, null] +13074 - null - [null, null, null, null, null] +13075 - null - [null, null, null, null, null] +13076 - null - [null, null, null, null, null] +13077 - null - [null, null, null, null, null] +13078 - null - [null, null, null, null, null] +13079 - null - [null, null, null, null, null] +13080 - null - [null, null, null, null, null] +13081 - null - [null, null, null, null, null] +13082 - null - [null, null, null, null, null] +13083 - null - [null, null, null, null, null] +13084 - null - [null, null, null, null, null] +13085 - null - [null, null, null, null, null] +13086 - null - [null, null, null, null, null] +13087 - null - [null, null, null, null, null] +13088 - null - [null, null, null, null, null] +13089 - null - [null, null, null, null, null] +13090 - null - [null, null, null, null, null] +13091 - null - [null, null, null, null, null] +13092 - null - [null, null, null, null, null] +13093 - null - [null, null, null, null, null] +13094 - Large door - [Open, null, null, null, null] +13095 - Large door - [Close, null, null, null, null] +13096 - Large door - [Open, null, null, null, null] +13097 - Large door - [Close, null, null, null, null] +13098 - null - [null, null, null, null, null] +13099 - null - [null, null, null, null, null] +13100 - Door - [Open, null, null, null, null] +13101 - Door - [Open, null, null, null, null] +13102 - Door - [Close, null, null, null, null] +13103 - Door - [Close, null, null, null, null] +13104 - Hazelmere statue - [null, null, null, null, null] +13105 - Glouphrie statue - [null, null, null, null, null] +13106 - Glouphrie statue - [null, null, null, null, null] +13107 - Door - [Open, null, null, null, null] +13108 - Door - [Close, null, null, null, null] +13109 - Door - [Open, null, null, null, null] +13110 - Door - [Close, null, null, null, null] +13111 - null - [null, null, null, null, null] +13112 - null - [null, null, null, null, null] +13113 - null - [null, null, null, null, null] +13114 - Ornament - [Examine, null, null, null, null] +13115 - Goblin crowd - [null, null, null, null, null] +13116 - null - [null, null, null, null, null] +13117 - null - [null, null, null, null, null] +13118 - Door - [Open, null, null, null, null] +13119 - Door - [Open, null, null, null, null] +13120 - Door - [Close, null, null, null, null] +13121 - Door - [Close, null, null, null, null] +13122 - null - [null, null, null, null, null] +13123 - null - [null, null, null, null, null] +13124 - null - [null, null, null, null, null] +13125 - null - [null, null, null, null, null] +13126 - Boxing mat - [null, null, null, null, Remove] +13127 - Boxing mat - [null, null, null, null, Remove] +13128 - Boxing mat - [null, null, null, null, Remove] +13129 - Boxing ring - [Climb-over, null, null, null, Remove] +13130 - Boxing ring - [Climb-over, null, null, null, Remove] +13131 - Boxing ring - [Climb-over, null, null, null, Remove] +13132 - Boxing ring - [Climb-over, null, null, null, Remove] +13133 - Fencing ring - [Climb-over, null, null, null, Remove] +13134 - Fencing ring - [null, null, null, null, Remove] +13135 - Fencing ring - [null, null, null, null, Remove] +13136 - Fencing ring - [null, null, null, null, Remove] +13137 - Combat ring - [Climb-over, null, null, null, Remove] +13138 - Combat ring - [null, null, null, null, Remove] +13139 - Combat ring - [null, null, null, null, Remove] +13140 - Combat ring - [null, null, null, null, Remove] +13141 - Nothing - [hidden, null, null, null, null] +13142 - Balance beam - [Stand-on, hidden, null, Get-down, Remove] +13143 - Balance beam - [Stand-on, hidden, null, Get-down, Remove] +13144 - Balance beam - [Stand-on, hidden, null, Get-down, Remove] +13145 - Magic barrier - [Walk-through, null, null, null, Remove] +13146 - Magic barrier - [Walk-through, null, null, null, null] +13147 - Ranging spot - [null, null, null, null, Remove] +13148 - Bed - [null, null, null, null, Remove] +13149 - Bed - [null, null, null, null, Remove] +13150 - Bed - [null, null, null, null, Remove] +13151 - Bed - [null, null, null, null, Remove] +13152 - Bed - [null, null, null, null, Remove] +13153 - Bed - [null, null, null, null, Remove] +13154 - Bed - [null, null, null, null, Remove] +13155 - Shoe box - [Change-clothes, null, null, null, Remove] +13156 - Oak drawers - [Change-clothes, null, null, null, Remove] +13157 - Oak wardrobe - [Change-clothes, null, null, null, Remove] +13158 - Teak drawers - [Change-clothes, null, null, null, Remove] +13159 - Teak wardrobe - [Change-clothes, null, null, null, Remove] +13160 - Mahogany Wardrobe - [Change-clothes, null, null, null, Remove] +13161 - Gilded wardrobe - [Change-clothes, null, null, null, Remove] +13162 - Shaving stand - [Preen, null, null, null, Remove] +13163 - Shaving stand - [Preen, null, null, null, Remove] +13164 - Dresser - [Preen, null, null, null, Remove] +13165 - Dresser - [Preen, null, null, null, Remove] +13166 - Dresser - [Preen, null, null, null, Remove] +13167 - Dresser - [Preen, null, null, null, Remove] +13168 - Dresser - [Preen, null, null, null, Remove] +13169 - Clock - [Read, null, null, null, Remove] +13170 - Clock - [Read, null, null, null, Remove] +13171 - Clock - [Read, null, null, null, Remove] +13172 - Symbol of Saradomin - [null, null, null, null, Remove] +13173 - Symbol of Zamorak - [null, null, null, null, Remove] +13174 - Symbol of Guthix - [null, null, null, null, Remove] +13175 - Icon of Saradomin - [null, null, null, null, Remove] +13176 - Icon of Zamorak - [null, null, null, null, Remove] +13177 - Icon of Guthix - [null, null, null, null, Remove] +13178 - Icon of Bob - [null, null, null, null, Remove] +13179 - Altar - [Pray, null, null, null, Remove] +13180 - Altar - [Pray, null, null, null, Remove] +13181 - Altar - [Pray, null, null, null, Remove] +13182 - Altar - [Pray, null, null, null, Remove] +13183 - Altar - [Pray, null, null, null, Remove] +13184 - Altar - [Pray, null, null, null, Remove] +13185 - Altar - [Pray, null, null, null, Remove] +13186 - Altar - [Pray, null, null, null, Remove] +13187 - Altar - [Pray, null, null, null, Remove] +13188 - Altar - [Pray, null, null, null, Remove] +13189 - Altar - [Pray, null, null, null, Remove] +13190 - Altar - [Pray, null, null, null, Remove] +13191 - Altar - [Pray, null, null, null, Remove] +13192 - Altar - [Pray, null, null, null, Remove] +13193 - Altar - [Pray, null, null, null, Remove] +13194 - Altar - [Pray, null, null, null, Remove] +13195 - Altar - [Pray, null, null, null, Remove] +13196 - Altar - [Pray, null, null, null, Remove] +13197 - Altar - [Pray, null, null, null, Remove] +13198 - Altar - [Pray, null, null, null, Remove] +13199 - Altar - [Pray, null, null, null, Remove] +13200 - Torch - [Light, null, null, null, Remove] +13201 - Torch - [null, null, null, null, Remove] +13202 - Torch - [Light, null, null, null, Remove] +13203 - Torch - [null, null, null, null, Remove] +13204 - Torch - [Light, null, null, null, Remove] +13205 - Torch - [null, null, null, null, Remove] +13206 - Torch - [Light, null, null, null, Remove] +13207 - Torch - [null, null, null, null, Remove] +13208 - Incense burner - [Light, null, null, null, Remove] +13209 - Incense burner - [null, null, null, null, Remove] +13210 - Incense burner - [Light, null, null, null, Remove] +13211 - Incense burner - [null, null, null, null, Remove] +13212 - Incense burner - [Light, null, null, null, Remove] +13213 - Incense burner - [null, null, null, null, Remove] +13214 - Windchimes - [Play, null, null, null, Remove] +13215 - Bells - [Play, null, null, null, Remove] +13216 - Organ - [Play, null, null, null, Remove] +13217 - Shuttered window - [null, null, null, null, Remove] +13218 - Decorative window - [null, null, null, null, Remove] +13219 - Stained-glass window - [null, null, null, null, Remove] +13220 - Decorative window - [null, null, null, null, Remove] +13221 - Stained-glass window - [null, null, null, null, Remove] +13222 - Decorative window - [null, null, null, null, Remove] +13223 - Stained-glass window - [null, null, null, null, Remove] +13224 - Decorative window - [null, null, null, null, Remove] +13225 - Stained-glass window - [null, null, null, null, Remove] +13226 - Shuttered window - [null, null, null, null, Remove] +13227 - Decorative window - [null, null, null, null, Remove] +13228 - Stained-glass window - [null, null, null, null, Remove] +13229 - Decorative window - [null, null, null, null, Remove] +13230 - Stained-glass window - [null, null, null, null, Remove] +13231 - Decorative window - [null, null, null, null, Remove] +13232 - Stained-glass window - [null, null, null, null, Remove] +13233 - Decorative window - [null, null, null, null, Remove] +13234 - Stained-glass window - [null, null, null, null, Remove] +13235 - Shuttered window - [null, null, null, null, Remove] +13236 - Decorative window - [null, null, null, null, Remove] +13237 - Stained-glass window - [null, null, null, null, Remove] +13238 - Decorative window - [null, null, null, null, Remove] +13239 - Stained-glass window - [null, null, null, null, Remove] +13240 - Decorative window - [null, null, null, null, Remove] +13241 - Stained-glass window - [null, null, null, null, Remove] +13242 - Decorative window - [null, null, null, null, Remove] +13243 - Stained-glass window - [null, null, null, null, Remove] +13244 - Shuttered window - [null, null, null, null, Remove] +13245 - Decorative window - [null, null, null, null, Remove] +13246 - Stained-glass window - [null, null, null, null, Remove] +13247 - Decorative window - [null, null, null, null, Remove] +13248 - Stained-glass window - [null, null, null, null, Remove] +13249 - Decorative window - [null, null, null, null, Remove] +13250 - Stained-glass window - [null, null, null, null, Remove] +13251 - Decorative window - [null, null, null, null, Remove] +13252 - Stained-glass window - [null, null, null, null, Remove] +13253 - Shuttered window - [null, null, null, null, Remove] +13254 - Decorative window - [null, null, null, null, Remove] +13255 - Stained-glass window - [null, null, null, null, Remove] +13256 - Decorative window - [null, null, null, null, Remove] +13257 - Stained-glass window - [null, null, null, null, Remove] +13258 - Decorative window - [null, null, null, null, Remove] +13259 - Stained-glass window - [null, null, null, null, Remove] +13260 - Decorative window - [null, null, null, null, Remove] +13261 - Stained-glass window - [null, null, null, null, Remove] +13262 - Shuttered window - [null, null, null, null, Remove] +13263 - Decorative window - [null, null, null, null, Remove] +13264 - Stained-glass window - [null, null, null, null, Remove] +13265 - Decorative window - [null, null, null, null, Remove] +13266 - Stained-glass window - [null, null, null, null, Remove] +13267 - Decorative window - [null, null, null, null, Remove] +13268 - Stained-glass window - [null, null, null, null, Remove] +13269 - Decorative window - [null, null, null, null, Remove] +13270 - Stained-glass window - [null, null, null, null, Remove] +13271 - Statue - [null, null, null, null, Remove] +13272 - Statue - [null, null, null, null, Remove] +13273 - Statue - [null, null, null, null, Remove] +13274 - Statue - [null, null, null, null, Remove] +13275 - Statue - [null, null, null, null, Remove] +13276 - Statue - [null, null, null, null, Remove] +13277 - Statue - [null, null, null, null, Remove] +13278 - Statue - [null, null, null, null, Remove] +13279 - Statue - [null, null, null, null, Remove] +13280 - Statue - [null, null, null, null, Remove] +13281 - Statue - [null, null, null, null, Remove] +13282 - Statue - [null, null, null, null, Remove] +13283 - Wooden crate - [Open, null, null, null, Remove] +13284 - Wooden crate - [Search, null, null, null, null] +13285 - Oak chest - [Open, null, null, null, Remove] +13286 - Oak chest - [Search, null, null, null, null] +13287 - Teak chest - [Open, null, null, null, Remove] +13288 - Teak chest - [Search, null, null, null, null] +13289 - Mahogany chest - [Open, null, null, null, Remove] +13290 - Mahogany chest - [Search, null, null, null, null] +13291 - Magic chest - [Open, null, null, null, Remove] +13292 - Magic chest - [Search, null, null, null, null] +13293 - Wooden table - [null, null, null, null, Remove] +13294 - Oak table - [null, null, null, null, Remove] +13295 - Oak table - [null, null, null, null, Remove] +13296 - Teak table - [null, null, null, null, Remove] +13297 - Teak table - [null, null, null, null, Remove] +13298 - Mahogany table - [null, null, null, null, Remove] +13299 - Opulent table - [null, null, null, null, Remove] +13300 - Wooden bench - [Sit-on, null, null, null, Remove] +13301 - Oak bench - [Sit-on, null, null, null, Remove] +13302 - Carved oak bench - [Sit-on, null, null, null, Remove] +13303 - Teak bench - [Sit-on, null, null, null, Remove] +13304 - Carved teak bench - [Sit-on, null, null, null, Remove] +13305 - Mahogany bench - [Sit-on, null, null, null, Remove] +13306 - Gilded bench - [Sit-on, null, null, null, Remove] +13307 - Rope bell-pull - [Ring, null, null, null, Remove] +13308 - Bell-pull - [Ring, null, null, null, Remove] +13309 - Posh bell-pull - [Ring, null, null, null, Remove] +13310 - Skeleton - [null, null, null, null, Remove] +13311 - Pipe - [null, null, null, null, Remove] +13312 - Blood - [null, null, null, null, Remove] +13313 - Cage - [null, null, null, Build-in, Remove] +13314 - Door - [Open, Pick-lock, Force, null, Remove] +13315 - Door - [Close, null, null, null, null] +13316 - Cage - [null, null, null, Build-in, Remove] +13317 - Door - [Open, Pick-lock, Force, null, Remove] +13318 - Door - [Close, null, null, null, null] +13319 - Cage - [null, null, null, Build-in, Remove] +13320 - Door - [Open, Pick-lock, Force, null, Remove] +13321 - Door - [Close, null, null, null, null] +13322 - Cage - [null, null, null, Build-in, Remove] +13323 - Door - [Open, Pick-lock, Force, null, Remove] +13324 - Door - [Close, null, null, null, null] +13325 - Cage - [null, null, null, Build-in, Remove] +13326 - Door - [Open, Pick-lock, Force, null, Remove] +13327 - Door - [Close, null, null, null, null] +13328 - Ladder - [Climb, null, null, Remove-room, Remove] +13329 - Ladder - [Climb, null, null, Remove-room, Remove] +13330 - Ladder - [Climb, null, null, Remove-room, Remove] +13331 - Slimy water - [null, null, null, null, Remove] +13332 - Slimy water - [null, null, null, null, Remove] +13333 - Slimy water - [null, null, null, null, Remove] +13334 - Spikes - [null, null, null, null, Remove] +13335 - Spikes - [null, null, null, null, Remove] +13336 - Spikes - [null, null, null, null, Remove] +13337 - Fire - [null, null, null, null, Remove] +13338 - Floor - [null, null, null, null, null] +13339 - Floor - [null, null, null, null, null] +13340 - Floor - [null, null, null, null, null] +13341 - Torch - [null, null, null, null, Remove] +13342 - Candle - [null, null, null, null, Remove] +13343 - Skull - [null, null, null, null, Remove] +13344 - Door - [Open, Pick-lock, Force, null, Remove] +13345 - Door - [Open, Pick-lock, Force, null, Remove] +13346 - Door - [Open, Pick-lock, Force, null, Remove] +13347 - Door - [Open, Pick-lock, Force, null, Remove] +13348 - Door - [Open, Pick-lock, Force, null, Remove] +13349 - Door - [Open, Pick-lock, Force, null, Remove] +13350 - Door - [Close, null, null, null, null] +13351 - Door - [Close, null, null, null, null] +13352 - Door - [Close, null, null, null, null] +13353 - Door - [Close, null, null, null, null] +13354 - Door - [Close, null, null, null, null] +13355 - Door - [Close, null, null, null, null] +13356 - Spike trap - [null, null, null, null, Remove] +13357 - Man trap - [null, null, null, null, Remove] +13358 - Tangle vine - [null, null, null, null, Remove] +13359 - Marble trap - [null, null, null, null, Remove] +13360 - Teleport trap - [null, null, null, null, Remove] +13361 - Spike hidden - [null, null, null, null, Remove] +13362 - Man hidden - [null, null, null, null, Remove] +13363 - Tangle hidden - [null, null, null, null, Remove] +13364 - Marble hidden - [null, null, null, null, Remove] +13365 - Teleport hidden - [null, null, null, null, Remove] +13366 - Bones - [null, null, null, null, Remove] +13367 - Guard dog - [null, null, null, null, Remove] +13368 - Hobgoblin - [null, null, null, null, Remove] +13369 - Troll - [null, null, null, null, Remove] +13370 - Huge Spider - [null, null, null, null, Remove] +13371 - null - [null, null, null, null, null] +13372 - Baby red dragon - [null, null, null, null, Remove] +13373 - Rocnar - [null, null, null, null, Remove] +13374 - Kalphite Soldier - [null, null, null, null, Remove] +13375 - Steel dragon - [null, null, null, null, Remove] +13376 - Dagannoth - [null, null, null, null, Remove] +13377 - Tok-Xil - [null, null, null, null, Remove] +13378 - Demon - [null, null, null, null, Remove] +13379 - Treasure Hunt Fairy House - [Activate, null, null, null, Remove] +13380 - Treasure Hunt Fairy House - [Activate, null, null, null, Remove] +13381 - Glove Rack - [Search, null, null, null, Remove] +13382 - Weapons Rack - [Search, null, null, null, Remove] +13383 - Weapons Rack - [Search, null, null, null, Remove] +13384 - Oak prize chest - [null, null, null, null, Remove] +13385 - Oak prize chest - [Open, null, null, null, Remove] +13386 - Teak prize chest - [null, null, null, null, Remove] +13387 - Teak prize chest - [Open, null, null, null, Remove] +13388 - Mahogany prize chest - [null, null, null, null, Remove] +13389 - Mahogany prize chest - [Open, null, null, null, Remove] +13390 - Jacky Jester - [Activate, null, null, null, Remove] +13391 - Jacky Jester - [Activate, null, null, null, null] +13392 - Attack stone - [Set-up, null, null, null, Remove] +13393 - Attack stone - [Set-up, null, null, null, Remove] +13394 - Attack stone - [Set-up, null, null, null, Remove] +13395 - Elemental balance - [Activate, null, null, null, Remove] +13396 - Elemental balance - [Activate, null, null, null, Remove] +13397 - Elemental balance - [Activate, null, null, null, Remove] +13398 - Stick - [Hoop, null, null, null, Remove] +13399 - Stick and hoop - [Hoop, null, null, null, Remove] +13400 - Dartboard - [Throw-at, null, null, null, Remove] +13401 - Dartboard - [Throw-at, null, null, null, Remove] +13402 - Archery target - [Shoot-at, null, null, null, Remove] +13403 - Archery target - [Shoot-at, null, null, null, Remove] +13404 - Hangman game - [Activate, null, null, null, Remove] +13405 - Portal - [Enter, Lock, null, null, Remove] +13406 - Rock - [null, null, null, null, Remove] +13407 - Pond - [null, null, null, null, Remove] +13408 - Statue - [null, null, null, null, Remove] +13409 - Dungeon entrance - [Enter, null, null, Remove-room, Remove] +13410 - null - [null, null, null, null, null] +13411 - Dead tree - [null, null, null, null, Remove] +13412 - Tree - [null, null, null, null, Remove] +13413 - Oak tree - [null, null, null, null, Remove] +13414 - Willow tree - [null, null, null, null, Remove] +13415 - Maple tree - [null, null, null, null, Remove] +13416 - Yew tree - [null, null, null, null, Remove] +13417 - Magic tree - [null, null, null, null, Remove] +13418 - Dead Tree - [null, null, null, null, Remove] +13419 - Tree - [null, null, null, null, Remove] +13420 - Oak Tree - [null, null, null, null, Remove] +13421 - Willow Tree - [null, null, null, null, Remove] +13422 - Yew tree - [null, null, null, null, Remove] +13423 - Maple tree - [null, null, null, null, Remove] +13424 - Magic tree - [null, null, null, null, Remove] +13425 - Fern - [null, null, null, null, Remove] +13426 - Bush - [null, null, null, null, Remove] +13427 - Tall Plant - [null, null, null, null, Remove] +13428 - Short Plant - [null, null, null, null, Remove] +13429 - Large-leaf Plant - [null, null, null, null, Remove] +13430 - Huge plant - [null, null, null, null, Remove] +13431 - Plant - [null, null, null, null, Remove] +13432 - Small fern - [null, null, null, null, Remove] +13433 - Fern - [null, null, null, null, Remove] +13434 - Dock Leaf - [null, null, null, null, Remove] +13435 - Thistle - [null, null, null, null, Remove] +13436 - Reeds - [null, null, null, null, Remove] +13437 - Rosemary - [null, null, null, null, Remove] +13438 - Daffodils - [null, null, null, null, Remove] +13439 - Bluebells - [null, null, null, null, Remove] +13440 - Rosemary - [null, null, null, null, Remove] +13441 - Daffodils - [null, null, null, null, Remove] +13442 - Bluebells - [null, null, null, null, Remove] +13443 - Sunflower - [null, null, null, null, Remove] +13444 - Marigolds - [null, null, null, null, Remove] +13445 - Roses - [null, null, null, null, Remove] +13446 - Sunflowers - [null, null, null, null, Remove] +13447 - Marigolds - [null, null, null, null, Remove] +13448 - Roses - [null, null, null, null, Remove] +13449 - Boundary stones - [null, null, null, null, Remove] +13450 - Wooden fence - [null, null, null, null, Remove] +13451 - Stone wall - [null, null, null, null, Remove] +13452 - Iron railings - [null, null, null, null, Remove] +13453 - Picket fence - [null, null, null, null, Remove] +13454 - Garden fence - [null, null, null, null, Remove] +13455 - Marble wall - [null, null, null, null, Remove] +13456 - Hedge - [null, null, null, null, Remove] +13457 - Hedge - [null, null, null, null, Remove] +13458 - Hedge - [null, null, null, null, Remove] +13459 - Hedge - [null, null, null, null, Remove] +13460 - Hedge - [null, null, null, null, Remove] +13461 - Hedge - [null, null, null, null, Remove] +13462 - Hedge - [null, null, null, null, Remove] +13463 - Hedge - [null, null, null, null, Remove] +13464 - Hedge - [null, null, null, null, Remove] +13465 - Hedge - [null, null, null, null, Remove] +13466 - Hedge - [null, null, null, null, Remove] +13467 - Hedge - [null, null, null, null, Remove] +13468 - Hedge - [null, null, null, null, Remove] +13469 - Hedge - [null, null, null, null, Remove] +13470 - Hedge - [null, null, null, null, Remove] +13471 - Hedge - [null, null, null, null, Remove] +13472 - Hedge - [null, null, null, null, Remove] +13473 - Hedge - [null, null, null, null, Remove] +13474 - Hedge - [null, null, null, null, Remove] +13475 - Hedge - [null, null, null, null, Remove] +13476 - Hedge - [null, null, null, null, Remove] +13477 - Gazebo - [null, null, null, null, Remove] +13478 - Small fountain - [null, null, null, null, Remove] +13479 - Large fountain - [null, null, null, null, Remove] +13480 - Ornamental fountain - [null, null, null, null, Remove] +13481 - Crawling hand - [Talk-to, null, null, null, Remove] +13482 - Cockatrice head - [Talk-to, null, null, null, Remove] +13483 - Basilisk head - [Talk-to, null, null, null, Remove] +13484 - Kurask head - [Talk-to, null, null, null, Remove] +13485 - Abyssal demon head - [Talk-to, null, null, null, Remove] +13486 - KBD heads - [Talk-to, null, null, null, Remove] +13487 - KQ head - [Talk-to, null, null, null, Remove] +13488 - Mounted sea bass - [null, null, null, null, Remove] +13489 - Mounted swordfish - [null, null, null, null, Remove] +13490 - Mounted shark - [null, null, null, null, Remove] +13491 - Mithril armour - [null, null, null, null, Remove] +13492 - Adamant armour - [null, null, null, null, Remove] +13493 - Rune armour - [null, null, null, null, Remove] +13494 - null - [null, null, null, null, null] +13495 - White Castlewars armour - [null, null, null, null, Remove] +13496 - Gold Castlewars armour - [null, null, null, null, Remove] +13497 - Staircase - [Climb-up, null, null, Remove-room, Remove] +13498 - Staircase - [Climb-down, null, null, Remove-room, Remove] +13499 - Staircase - [Climb-up, null, null, Remove-room, Remove] +13500 - Staircase - [Climb-down, null, null, Remove-room, Remove] +13501 - Staircase - [Climb-up, null, null, Remove-room, Remove] +13502 - Staircase - [Climb-down, null, null, Remove-room, Remove] +13503 - Staircase - [Climb, Climb-up, Climb-down, Remove-room, Remove] +13504 - Staircase - [Climb, null, Climb-down, Remove-room, Remove] +13505 - Staircase - [Climb, Climb-up, Climb-down, Remove-room, Remove] +13506 - Staircase - [Climb, null, Climb-down, Remove-room, Remove] +13507 - Rune display case - [null, null, null, null, Remove] +13508 - Rune display case - [null, null, null, null, Remove] +13509 - Rune display case - [null, null, null, null, Remove] +13510 - Portrait - [null, null, null, null, Remove] +13511 - Portrait - [null, null, null, null, Remove] +13512 - Painting - [null, null, null, null, Remove] +13513 - Portrait - [null, null, null, null, Remove] +13514 - Desert painting - [null, null, null, null, Remove] +13515 - Isafdar painting - [null, null, null, null, Remove] +13516 - Karamja painting - [null, null, null, null, Remove] +13517 - Lumbridge painting - [null, null, null, null, Remove] +13518 - Morytania painting - [null, null, null, null, Remove] +13519 - Silverlight - [null, null, null, null, Remove] +13520 - Darklight - [null, null, null, null, Remove] +13521 - Excalibur - [null, null, null, null, Remove] +13522 - Anti-Dragon Breath Shield - [null, null, null, null, Remove] +13523 - Amulet of Glory - [Rub, null, null, null, Remove] +13524 - Cape of Legends - [null, null, null, null, Remove] +13525 - Map - [null, null, null, null, Remove] +13526 - Map - [null, null, null, null, Remove] +13527 - Map - [null, null, null, null, Remove] +13528 - Firepit - [null, null, null, null, Remove] +13529 - Firepit with hook - [null, null, null, null, Remove] +13530 - Firepit with hook - [Take-kettle, null, null, null, null] +13531 - Firepit with pot - [null, null, null, null, Remove] +13532 - Firepit with pot - [Take-kettle, null, null, null, null] +13533 - Small oven - [null, null, null, null, Remove] +13534 - Small Oven - [null, null, null, null, Remove] +13535 - Small oven - [Take-kettle, null, null, null, null] +13536 - Large oven - [null, null, null, null, Remove] +13537 - Large oven - [null, null, null, null, Remove] +13538 - Large oven - [Take-kettle, null, null, null, null] +13539 - Steel range - [null, null, null, null, Remove] +13540 - Steel range - [Take-kettle, null, null, null, null] +13541 - Steel range - [null, null, null, null, Remove] +13542 - Fancy range - [null, null, null, null, Remove] +13543 - Fancy range - [Take-kettle, null, null, null, null] +13544 - Fancy range - [null, null, null, null, Remove] +13545 - Shelves - [Search, null, null, null, Remove] +13546 - Shelves - [Search, null, null, null, Remove] +13547 - Shelves - [Search, null, null, null, Remove] +13548 - Shelves - [Search, null, null, null, Remove] +13549 - Shelves - [Search, null, null, null, Remove] +13550 - Shelves - [Search, null, null, null, Remove] +13551 - Shelves - [Search, null, null, null, Remove] +13552 - Shelves - [Search, null, null, null, Remove] +13553 - Shelves - [Search, null, null, null, Remove] +13554 - Shelves - [Search, null, null, null, Remove] +13555 - Shelves - [Search, null, null, null, Remove] +13556 - Shelves - [Search, null, null, null, Remove] +13557 - Shelves - [Search, null, null, null, Remove] +13558 - Shelves - [Search, null, null, null, Remove] +13559 - Pump and drain - [null, null, null, null, Remove] +13560 - Pump and drain - [null, null, null, null, Remove] +13561 - Pump and tub - [null, null, null, null, Remove] +13562 - Pump and tub - [null, null, null, null, Remove] +13563 - Sink - [null, null, null, null, Remove] +13564 - Sink - [null, null, null, null, Remove] +13565 - Larder - [Search, null, null, null, Remove] +13566 - Larder - [Search, null, null, null, Remove] +13567 - Larder - [Search, null, null, null, Remove] +13568 - Beer barrel - [null, null, null, null, Remove] +13569 - Cider barrel - [null, null, null, null, Remove] +13570 - Asgarnian ale - [null, null, null, null, Remove] +13571 - Greenman's ale - [null, null, null, null, Remove] +13572 - Dragon bitter - [null, null, null, null, Remove] +13573 - Chef's Delight - [null, null, null, null, Remove] +13574 - Pet blanket - [null, null, null, null, Remove] +13575 - Pet basket - [null, null, null, null, Remove] +13576 - Pet basket - [null, null, null, null, Remove] +13577 - Wooden table - [null, null, null, null, Remove] +13578 - Oak table - [null, null, null, null, Remove] +13579 - Teak table - [null, null, null, null, Remove] +13580 - Pet blanket - [Sleep-in, null, null, null, Remove] +13581 - Chair - [Sit-on, null, null, null, Remove] +13582 - Chair - [Sit-on, null, null, null, Remove] +13583 - Chair - [Sit-on, null, null, null, Remove] +13584 - Chair - [Sit-on, null, null, null, Remove] +13585 - Chair - [Sit-on, null, null, null, Remove] +13586 - Chair - [Sit-on, null, null, null, Remove] +13587 - Chair - [Sit-on, null, null, null, Remove] +13588 - Rug - [null, null, null, null, Remove] +13589 - Rug - [null, null, null, null, Remove] +13590 - Rug - [null, null, null, null, Remove] +13591 - Rug - [null, null, null, null, Remove] +13592 - Rug - [null, null, null, null, Remove] +13593 - Rug - [null, null, null, null, Remove] +13594 - Rug - [null, null, null, null, Remove] +13595 - Rug - [null, null, null, null, Remove] +13596 - Rug - [null, null, null, null, Remove] +13597 - Bookcase - [Search, null, null, null, Remove] +13598 - Bookcase - [Search, null, null, null, Remove] +13599 - Bookcase - [Search, null, null, null, Remove] +13600 - Scroll rack - [Search, null, null, null, Remove] +13601 - Scroll rack - [Search, null, null, null, Remove] +13602 - Scroll rack - [Search, null, null, null, Remove] +13603 - Curtains - [null, null, null, null, Remove] +13604 - Curtains - [null, null, null, null, Remove] +13605 - Curtains - [null, null, null, null, Remove] +13606 - Wall decoration - [null, null, null, null, Remove] +13607 - Wall decoration - [null, null, null, null, Remove] +13608 - Wall decoration - [null, null, null, null, Remove] +13609 - Clay fireplace - [Light, null, null, null, Remove] +13610 - Clay fireplace - [null, null, null, null, null] +13611 - Limestone fireplace - [Light, null, null, null, Remove] +13612 - Limestone fireplace - [null, null, null, null, null] +13613 - Marble fireplace - [Light, null, null, null, Remove] +13614 - Marble fireplace - [null, null, null, null, null] +13615 - Varrock Portal - [Enter, null, null, null, Remove] +13616 - Lumbridge Portal - [Enter, null, null, null, Remove] +13617 - Falador Portal - [Enter, null, null, null, Remove] +13618 - Camelot Portal - [Enter, null, null, null, Remove] +13619 - Ardougne Portal - [Enter, null, null, null, Remove] +13620 - Yanille Portal - [Enter, null, null, null, Remove] +13621 - Kharyrll Portal - [Enter, null, null, null, Remove] +13622 - Varrock Portal - [Enter, null, null, null, Remove] +13623 - Lumbridge Portal - [Enter, null, null, null, Remove] +13624 - Falador Portal - [Enter, null, null, null, Remove] +13625 - Camelot Portal - [Enter, null, null, null, Remove] +13626 - Ardougne Portal - [Enter, null, null, null, Remove] +13627 - Yanille Portal - [Enter, null, null, null, Remove] +13628 - Kharyrll Portal - [Enter, null, null, null, Remove] +13629 - Varrock Portal - [Enter, null, null, null, Remove] +13630 - Lumbridge Portal - [Enter, null, null, null, Remove] +13631 - Falador Portal - [Enter, null, null, null, Remove] +13632 - Camelot Portal - [Enter, null, null, null, Remove] +13633 - Ardougne Portal - [Enter, null, null, null, Remove] +13634 - Yanille Portal - [Enter, null, null, null, Remove] +13635 - Kharyrll Portal - [Enter, null, null, null, Remove] +13636 - Portal frame - [null, null, null, null, Remove] +13637 - Portal frame - [null, null, null, null, Remove] +13638 - Portal frame - [null, null, null, null, Remove] +13639 - Scrying pool - [Direct-portal, Scry, null, null, Remove] +13640 - Teleportation focus - [Direct-portal, null, null, null, Remove] +13641 - Greater teleport focus - [Direct-portal, null, null, null, Remove] +13642 - Lectern - [Study, null, null, null, Remove] +13643 - Lectern - [Study, null, null, null, Remove] +13644 - Lectern - [Study, null, null, null, Remove] +13645 - Lectern - [Study, null, null, null, Remove] +13646 - Lectern - [Study, null, null, null, Remove] +13647 - Lectern - [Study, null, null, null, Remove] +13648 - Lectern - [Study, null, null, null, Remove] +13649 - Globe - [null, null, null, null, Remove] +13650 - Ornamental globe - [null, null, null, null, Remove] +13651 - Lunar globe - [null, null, null, null, Remove] +13652 - Celestial globe - [null, null, null, null, Remove] +13653 - Armillary sphere - [null, null, null, null, Remove] +13654 - Small orrery - [null, null, null, null, Remove] +13655 - Large orrery - [null, null, null, null, Remove] +13656 - Telescope - [Observe, null, null, null, Remove] +13657 - Telescope - [Observe, null, null, null, Remove] +13658 - Telescope - [Observe, null, null, null, Remove] +13659 - Crystal ball - [null, null, null, null, Remove] +13660 - Elemental sphere - [null, null, null, null, Remove] +13661 - Crystal of power - [null, null, null, null, Remove] +13662 - Alchemical chart - [Study, null, null, null, Remove] +13663 - Astronomical chart - [Study, null, null, null, Remove] +13664 - Infernal chart - [Study, null, null, null, Remove] +13665 - Throne - [Sit-on, null, null, null, Remove] +13666 - Throne - [Sit-on, null, null, null, Remove] +13667 - Throne - [Sit-on, null, null, null, Remove] +13668 - Throne - [Sit-on, null, null, null, Remove] +13669 - Throne - [Sit-on, null, null, null, Remove] +13670 - Throne - [Sit-on, null, null, null, Remove] +13671 - Throne - [Sit-on, null, null, null, Remove] +13672 - Lever - [Pull, Challenge-mode, null, null, Remove] +13673 - Lever - [Pull, Challenge-mode, null, null, Remove] +13674 - Lever - [Pull, Challenge-mode, null, null, Remove] +13675 - Trapdoor - [Open, null, null, Remove-room, Remove] +13676 - Trapdoor - [Open, null, null, Remove-room, Remove] +13677 - Trapdoor - [Open, null, null, Remove-room, Remove] +13678 - Trapdoor - [Go-down, Close, null, Remove-room, Remove] +13679 - Trapdoor - [Go-down, Close, null, Remove-room, Remove] +13680 - Trapdoor - [Go-down, Close, null, Remove-room, Remove] +13681 - Steel cage - [null, null, null, null, Remove] +13682 - Magic circle - [null, null, null, null, Remove] +13683 - Greater magic circle - [null, null, null, null, Remove] +13684 - Floor decoration - [null, null, null, null, Remove] +13685 - Floor decoration - [null, null, null, null, Remove] +13686 - Floor decoration - [null, null, null, null, Remove] +13687 - Floor decoration - [null, null, null, null, Remove] +13688 - Floor decoration - [null, null, null, null, Remove] +13689 - Floor decoration - [null, null, null, null, Remove] +13690 - Hanging - [null, null, null, null, Remove] +13691 - Decoration - [null, null, null, null, Remove] +13692 - Decoration - [null, null, null, null, Remove] +13693 - Decoration - [null, null, null, null, Remove] +13694 - Teak bench - [Sit-on, null, null, null, Remove] +13695 - Mahogany bench - [Sit-on, null, null, null, Remove] +13696 - Gilded bench - [Sit-on, null, null, null, Remove] +13697 - Nothing - [null, null, null, null, null] +13698 - Throne - [null, null, null, null, null] +13699 - Tools - [Search, null, null, Upgrade, Remove] +13700 - Tools - [Search, null, null, Upgrade, Remove] +13701 - Tools - [Search, null, null, Upgrade, Remove] +13702 - Tools - [Search, null, null, Upgrade, Remove] +13703 - Tools - [Search, null, null, null, Remove] +13704 - Workbench - [Work-at, null, null, null, Remove] +13705 - Workbench - [Work-at, null, null, null, Remove] +13706 - Workbench - [Work-at, null, null, Upgrade, Remove] +13707 - Workbench - [Work-at, null, null, Upgrade, Remove] +13708 - Workbench - [Work-at, null, null, null, Remove] +13709 - Clockmaker's bench - [Craft, null, null, Upgrade, Remove] +13710 - Clockmaker's bench - [Craft, null, null, Upgrade, Remove] +13711 - Clockmaker's bench - [Craft, null, null, Upgrade, Remove] +13712 - Clockmaker's bench - [Craft, null, null, null, Remove] +13713 - Repair bench - [null, null, null, null, Remove] +13714 - Whetstone - [null, null, null, null, Remove] +13715 - Armour repair stand - [null, null, null, null, Remove] +13716 - Helmet pluming stand - [Make-helmet, null, null, null, Remove] +13717 - Painting stand - [Use, null, null, null, Remove] +13718 - Banner making stand - [Use, null, null, null, Remove] +13719 - Stool - [null, null, null, null, null] +13720 - Stool - [null, null, null, null, null] +13721 - Nothing - [null, null, null, null, null] +13722 - Nothing - [null, null, null, null, null] +13723 - Nothing - [null, null, null, null, null] +13724 - Nothing - [null, null, null, null, null] +13725 - null - [null, null, null, null, null] +13726 - Jacky Jester - [null, null, null, null, null] +13727 - Jacky Jester - [null, null, null, null, null] +13728 - Window space - [null, null, null, null, Build] +13729 - Window space - [null, null, null, null, Build] +13730 - Window space - [null, null, null, null, Build] +13731 - Window space - [null, null, null, null, Build] +13732 - Window space - [null, null, null, null, Build] +13733 - Window space - [null, null, null, null, Build] +13734 - Round shield - [null, null, null, null, Remove] +13735 - Round shield - [null, null, null, null, Remove] +13736 - Round shield - [null, null, null, null, Remove] +13737 - Round shield - [null, null, null, null, Remove] +13738 - Round shield - [null, null, null, null, Remove] +13739 - Round shield - [null, null, null, null, Remove] +13740 - Round shield - [null, null, null, null, Remove] +13741 - Round shield - [null, null, null, null, Remove] +13742 - Round shield - [null, null, null, null, Remove] +13743 - Round shield - [null, null, null, null, Remove] +13744 - Round shield - [null, null, null, null, Remove] +13745 - Round shield - [null, null, null, null, Remove] +13746 - Round shield - [null, null, null, null, Remove] +13747 - Round shield - [null, null, null, null, Remove] +13748 - Round shield - [null, null, null, null, Remove] +13749 - Round shield - [null, null, null, null, Remove] +13750 - Kite shield - [null, null, null, null, Remove] +13751 - Kite shield - [null, null, null, null, Remove] +13752 - Kite shield - [null, null, null, null, Remove] +13753 - Kite shield - [null, null, null, null, Remove] +13754 - Kite shield - [null, null, null, null, Remove] +13755 - Kite shield - [null, null, null, null, Remove] +13756 - Kite shield - [null, null, null, null, Remove] +13757 - Kite shield - [null, null, null, null, Remove] +13758 - Kite shield - [null, null, null, null, Remove] +13759 - Kite shield - [null, null, null, null, Remove] +13760 - Kite shield - [null, null, null, null, Remove] +13761 - Kite shield - [null, null, null, null, Remove] +13762 - Kite shield - [null, null, null, null, Remove] +13763 - Kite shield - [null, null, null, null, Remove] +13764 - Kite shield - [null, null, null, null, Remove] +13765 - Kite shield - [null, null, null, null, Remove] +13766 - Square shield - [null, null, null, null, Remove] +13767 - Square shield - [null, null, null, null, Remove] +13768 - Square shield - [null, null, null, null, Remove] +13769 - Square shield - [null, null, null, null, Remove] +13770 - Square shield - [null, null, null, null, Remove] +13771 - Square shield - [null, null, null, null, Remove] +13772 - Square shield - [null, null, null, null, Remove] +13773 - Square shield - [null, null, null, null, Remove] +13774 - Square shield - [null, null, null, null, Remove] +13775 - Square shield - [null, null, null, null, Remove] +13776 - Square shield - [null, null, null, null, Remove] +13777 - Square shield - [null, null, null, null, Remove] +13778 - Square shield - [null, null, null, null, Remove] +13779 - Square shield - [null, null, null, null, Remove] +13780 - Square shield - [null, null, null, null, Remove] +13781 - Square shield - [null, null, null, null, Remove] +13782 - Mahogany wall decoration - [null, null, null, null, Remove] +13783 - Mahogany wall decoration - [null, null, null, null, Remove] +13784 - Mahogany wall decoration - [null, null, null, null, Remove] +13785 - Mahogany wall decoration - [null, null, null, null, Remove] +13786 - Mahogany wall decoration - [null, null, null, null, Remove] +13787 - Mahogany wall decoration - [null, null, null, null, Remove] +13788 - Mahogany wall decoration - [null, null, null, null, Remove] +13789 - Mahogany wall decoration - [null, null, null, null, Remove] +13790 - Mahogany wall decoration - [null, null, null, null, Remove] +13791 - Mahogany wall decoration - [null, null, null, null, Remove] +13792 - Mahogany wall decoration - [null, null, null, null, Remove] +13793 - Mahogany wall decoration - [null, null, null, null, Remove] +13794 - Mahogany wall decoration - [null, null, null, null, Remove] +13795 - Mahogany wall decoration - [null, null, null, null, Remove] +13796 - Mahogany wall decoration - [null, null, null, null, Remove] +13797 - Mahogany wall decoration - [null, null, null, null, Remove] +13798 - Oak wall decoration - [null, null, null, null, Remove] +13799 - Oak wall decoration - [null, null, null, null, Remove] +13800 - Oak wall decoration - [null, null, null, null, Remove] +13801 - Oak wall decoration - [null, null, null, null, Remove] +13802 - Oak wall decoration - [null, null, null, null, Remove] +13803 - Oak wall decoration - [null, null, null, null, Remove] +13804 - Oak wall decoration - [null, null, null, null, Remove] +13805 - Oak wall decoration - [null, null, null, null, Remove] +13806 - Oak wall decoration - [null, null, null, null, Remove] +13807 - Oak wall decoration - [null, null, null, null, Remove] +13808 - Oak wall decoration - [null, null, null, null, Remove] +13809 - Oak wall decoration - [null, null, null, null, Remove] +13810 - Oak wall decoration - [null, null, null, null, Remove] +13811 - Oak wall decoration - [null, null, null, null, Remove] +13812 - Oak wall decoration - [null, null, null, null, Remove] +13813 - Oak wall decoration - [null, null, null, null, Remove] +13814 - Teak wall decoration - [null, null, null, null, Remove] +13815 - Teak wall decoration - [null, null, null, null, Remove] +13816 - Teak wall decoration - [null, null, null, null, Remove] +13817 - Teak wall decoration - [null, null, null, null, Remove] +13818 - Teak wall decoration - [null, null, null, null, Remove] +13819 - Teak wall decoration - [null, null, null, null, Remove] +13820 - Teak wall decoration - [null, null, null, null, Remove] +13821 - Teak wall decoration - [null, null, null, null, Remove] +13822 - Teak wall decoration - [null, null, null, null, Remove] +13823 - Teak wall decoration - [null, null, null, null, Remove] +13824 - Teak wall decoration - [null, null, null, null, Remove] +13825 - Teak wall decoration - [null, null, null, null, Remove] +13826 - Teak wall decoration - [null, null, null, null, Remove] +13827 - Teak wall decoration - [null, null, null, null, Remove] +13828 - Teak wall decoration - [null, null, null, null, Remove] +13829 - Teak wall decoration - [null, null, null, null, Remove] +13830 - Window - [null, null, null, null, null] +13831 - Path - [null, Evade-event, null, null, null] +13832 - Path - [Look-at, Continue-trek, null, null, null] +13833 - Path - [Look-at, Escape, null, null, null] +13834 - Broken bridge - [Search, null, null, null, null] +13835 - Partially broken bridge - [Search, null, null, null, null] +13836 - Slightly broken bridge - [Search, null, null, null, null] +13837 - Fixed bridge - [Search, Walk-across, null, null, null] +13838 - Bog - [Stand-on, null, null, null, null] +13839 - Bog - [Stand-on, null, null, null, null] +13840 - Spiny bush - [null, null, null, null, null] +13841 - Row boat - [null, null, null, null, null] +13842 - Ripples - [null, null, null, null, null] +13843 - Swamp tree - [null, null, null, null, null] +13844 - Swamp tree - [null, null, null, null, null] +13845 - Swamp tree - [null, null, null, null, null] +13846 - Vine hanging from branch - [Look-at, Swing-on, null, null, null] +13847 - Swamp tree - [null, null, null, null, null] +13848 - Swamp tree - [null, null, null, null, null] +13849 - Swamp tree - [null, null, null, null, null] +13850 - Swamp tree - [null, null, null, null, null] +13851 - null - [null, null, null, null, null] +13852 - null - [null, null, null, null, null] +13853 - null - [null, null, null, null, null] +13854 - null - [null, null, null, null, null] +13855 - null - [null, null, null, null, null] +13856 - null - [null, null, null, null, null] +13857 - null - [null, null, null, null, null] +13858 - null - [null, null, null, null, null] +13859 - null - [null, null, null, null, null] +13860 - null - [null, null, null, null, null] +13861 - null - [null, null, null, null, null] +13862 - null - [null, null, null, null, null] +13863 - null - [null, null, null, null, null] +13864 - Boat - [null, null, null, Continue-trek, Escape-event] +13865 - null - [null, null, null, null, null] +13866 - Path - [Look-at, Continue-trek, null, null, null] +13867 - Path - [Look-at, Continue-trek, null, null, null] +13868 - Path - [Look-at, Return-to-Burgh, null, null, null] +13869 - Path - [null, Evade-event, null, null, null] +13870 - Path - [Look-at, Continue-trek, null, null, null] +13871 - Path - [Look-at, Escape, null, null, null] +13872 - Backpack - [Search, null, null, null, null] +13873 - Signpost - [Read, null, null, null, null] +13874 - null - [null, null, null, null, null] +13875 - null - [null, null, null, null, null] +13876 - null - [null, null, null, null, null] +13877 - null - [null, null, null, null, null] +13878 - Exit - [Use, null, null, null, null] +13879 - Exit - [Use, null, null, null, null] +13880 - null - [null, null, null, null, null] +13881 - Fire - [null, null, null, null, null] +13882 - Exit - [Enter, null, null, null, null] +13883 - null - [null, null, null, null, null] +13884 - null - [null, null, null, null, null] +13885 - null - [null, null, null, null, null] +13886 - null - [null, null, null, null, null] +13887 - null - [null, null, null, null, null] +13888 - null - [null, null, null, null, null] +13889 - null - [null, null, null, null, null] +13890 - null - [null, null, null, null, null] +13891 - Dark hole - [Look-inside, null, null, null, null] +13892 - Dark hole - [Look-inside, null, null, null, null] +13893 - Dark hole - [Look-inside, null, null, null, null] +13894 - Dark hole - [Look-inside, null, null, null, null] +13895 - Dark hole - [Look-inside, null, null, null, null] +13896 - Dark hole - [Look-inside, null, null, null, null] +13897 - null - [null, null, null, null, null] +13898 - null - [Enter, null, null, null, null] +13899 - Black hole - [Enter, null, null, null, null] +13900 - Black hole - [Enter, null, null, null, null] +13901 - Exit - [Use, null, null, null, null] +13902 - null - [null, null, null, null, null] +13903 - null - [null, null, null, null, null] +13904 - Exit - [Use, null, null, null, null] +13905 - null - [null, null, null, null, null] +13906 - null - [null, null, null, null, null] +13907 - null - [Enter, null, null, null, null] +13908 - null - [Enter, null, null, null, null] +13909 - null - [Enter, null, null, null, null] +13910 - null - [Enter, null, null, null, null] +13911 - null - [Enter, null, null, null, null] +13912 - null - [Enter, null, null, null, null] +13913 - Confusing door - [Enter, null, null, null, null] +13914 - Confusing door - [Enter, null, null, null, null] +13915 - Confusing door - [Enter, null, null, null, null] +13916 - Confusing door - [Enter, null, null, null, null] +13917 - Confusing door - [Enter, null, null, null, null] +13918 - Confusing door - [Enter, null, null, null, null] +13919 - Confusing door - [Enter, null, null, null, null] +13920 - Confusing door - [Enter, null, null, null, null] +13921 - Confusing door - [Enter, null, null, null, null] +13922 - Confusing door - [Enter, null, null, null, null] +13923 - Confusing door - [Enter, null, null, null, null] +13924 - Confusing door - [Enter, null, null, null, null] +13925 - Hole - [null, null, null, null, null] +13926 - null - [null, null, null, null, null] +13927 - null - [null, null, null, null, null] +13928 - null - [null, null, null, null, null] +13929 - null - [null, null, null, null, null] +13930 - null - [null, null, null, null, null] +13931 - null - [null, null, null, null, null] +13932 - Exit - [Use, null, null, null, null] +13933 - Exit - [Use, null, null, null, null] +13934 - null - [null, null, null, null, null] +13935 - null - [null, null, null, null, null] +13936 - null - [null, null, null, null, null] +13937 - null - [null, null, null, null, null] +13938 - Hope bridge - [null, null, null, null, null] +13939 - Hope bridge - [null, null, null, null, null] +13940 - Hope bridge - [null, null, null, null, null] +13941 - Hope bridge - [null, null, null, null, null] +13942 - Hope bridge - [null, null, null, null, null] +13943 - Hope bridge - [null, null, null, null, null] +13944 - Hope bridge - [null, null, null, null, null] +13945 - Hope bridge - [null, null, null, null, null] +13946 - Hope bridge - [null, null, null, null, null] +13947 - Hope bridge - [null, null, null, null, null] +13948 - Hope bridge - [null, null, null, null, null] +13949 - Hope bridge - [null, null, null, null, null] +13950 - Hope bridge - [null, null, null, null, null] +13951 - Hope bridge - [null, null, null, null, null] +13952 - Hope bridge - [null, null, null, null, null] +13953 - Hope bridge - [null, null, null, null, null] +13954 - Hope bridge - [null, null, null, null, null] +13955 - Hope bridge - [null, null, null, null, null] +13956 - Hope bridge - [null, null, null, null, null] +13957 - Hope bridge - [null, null, null, null, null] +13958 - Hope bridge - [null, null, null, null, null] +13959 - Hope bridge - [null, null, null, null, null] +13960 - Hope bridge - [null, null, null, null, null] +13961 - Hope bridge - [null, null, null, null, null] +13962 - null - [null, null, null, null, null] +13963 - null - [null, null, null, null, null] +13964 - null - [null, null, null, null, null] +13965 - null - [null, null, null, null, null] +13966 - null - [null, null, null, null, null] +13967 - Rift - [Enter, null, null, null, null] +13968 - null - [Enter, null, null, null, null] +13969 - Rift - [Enter, null, null, null, null] +13970 - Rift - [Enter, null, null, null, null] +13971 - Rift - [Enter, null, null, null, null] +13972 - Rift - [Enter, null, null, null, null] +13973 - Rift - [Enter, null, null, null, null] +13974 - Rift - [Enter, null, null, null, null] +13975 - Rift - [Enter, null, null, null, null] +13976 - Rift - [Enter, null, null, null, null] +13977 - Rift - [Enter, null, null, null, null] +13978 - Rift - [Enter, null, null, null, null] +13979 - Rift - [Enter, null, null, null, null] +13980 - Rift - [Enter, null, null, null, null] +13981 - null - [null, null, null, null, null] +13982 - null - [null, null, null, null, null] +13983 - null - [null, null, null, null, null] +13984 - null - [null, null, null, null, null] +13985 - null - [null, null, null, null, null] +13986 - null - [null, null, null, null, null] +13987 - null - [null, null, null, null, null] +13988 - null - [null, null, null, null, null] +13989 - null - [null, null, null, null, null] +13990 - null - [null, null, null, null, null] +13991 - null - [null, null, null, null, null] +13992 - null - [null, null, null, null, null] +13993 - null - [Take-from, null, null, null, null] +13994 - Weapon rack - [Take-from, null, null, null, null] +13995 - Weapon rack - [Take-from, null, null, null, null] +13996 - Weapon rack - [Take-from, null, null, null, null] +13997 - Weapon rack - [Take-from, null, null, null, null] +13998 - Weapon rack - [Take-from, null, null, null, null] +13999 - Rope - [Climb-up, null, null, null, null] +14000 - null - [Climb-down, null, null, null, null] +14001 - null - [Read, null, null, null, null] +14002 - Warning sign - [Read, null, null, null, null] +14003 - Grass - [null, null, null, null, null] +14004 - null - [hidden, null, null, null, null] +14005 - Pot-boiler - [null, null, null, null, null] +14006 - Pot-boiler - [null, null, null, null, null] +14007 - Pot-boiler - [Remove-Pot, null, null, null, null] +14008 - Pot-boiler - [null, null, null, null, null] +14009 - Pot-boiler - [Remove-Bone, null, null, null, null] +14010 - Wish-list - [Read, null, null, null, null] +14011 - Market stall - [null, Steal-From, null, null, null] +14012 - Market stall - [null, Steal-From, null, null, null] +14013 - Massive ribs - [null, null, null, null, null] +14014 - null - [null, null, null, null, null] +14015 - null - [null, null, null, null, null] +14016 - Box of bones - [null, null, null, null, null] +14017 - Box of bones - [null, null, null, null, null] +14018 - Bones - [null, null, null, null, null] +14019 - Bones - [null, null, null, null, null] +14020 - Bones - [null, null, null, null, null] +14021 - Bones - [null, null, null, null, null] +14022 - Bones - [null, null, null, null, null] +14023 - Bones - [null, null, null, null, null] +14024 - Bones - [null, null, null, null, null] +14025 - Bones - [null, null, null, null, null] +14026 - Bones - [null, null, null, null, null] +14027 - Bones - [null, null, null, null, null] +14028 - Bones - [null, null, null, null, null] +14029 - Bones - [null, null, null, null, null] +14030 - Bones - [null, null, null, null, null] +14031 - Bones - [null, null, null, null, null] +14032 - Bones - [null, null, null, null, null] +14033 - null - [null, null, null, null, null] +14034 - null - [null, null, null, null, null] +14035 - Fishing Contest Banner - [null, null, null, null, null] +14036 - null - [null, null, null, null, null] +14037 - null - [null, null, null, null, null] +14038 - null - [null, null, null, null, null] +14039 - null - [null, null, null, null, null] +14040 - Bonzo's Table - [null, null, null, null, null] +14041 - Bonzo's Table - [null, null, null, null, null] +14042 - null - [null, null, null, null, null] +14043 - Barrel - [null, null, null, null, null] +14044 - Table - [null, null, null, null, null] +14045 - Bed - [null, null, null, null, null] +14046 - null - [null, null, null, null, null] +14047 - null - [null, null, null, null, null] +14048 - null - [null, null, null, null, null] +14049 - Table - [null, null, null, null, null] +14050 - Chair - [null, null, null, null, null] +14051 - Small Table - [null, null, null, null, null] +14052 - null - [null, null, null, null, null] +14053 - null - [null, null, null, null, null] +14054 - null - [null, null, null, null, null] +14055 - null - [null, null, null, null, null] +14056 - null - [null, null, null, null, null] +14057 - null - [null, null, null, null, null] +14058 - Fairy ring - [Use, null, null, null, null] +14059 - null - [null, null, null, null, null] +14060 - null - [null, null, null, null, null] +14061 - Fairy ring - [Use, null, null, null, null] +14062 - null - [null, null, null, null, null] +14063 - null - [null, null, null, null, null] +14064 - Fairy ring - [Use, null, null, null, null] +14065 - null - [null, null, null, null, null] +14066 - null - [null, null, null, null, null] +14067 - Fairy ring - [Use, null, null, null, null] +14068 - null - [null, null, null, null, null] +14069 - null - [null, null, null, null, null] +14070 - Fairy ring - [Use, null, null, null, null] +14071 - null - [null, null, null, null, null] +14072 - null - [null, null, null, null, null] +14073 - Fairy ring - [Use, null, null, null, null] +14074 - null - [null, null, null, null, null] +14075 - null - [null, null, null, null, null] +14076 - Fairy ring - [Use, null, null, null, null] +14077 - null - [null, null, null, null, null] +14078 - null - [null, null, null, null, null] +14079 - Fairy ring - [Use, null, null, null, null] +14080 - null - [null, null, null, null, null] +14081 - null - [null, null, null, null, null] +14082 - Fairy ring - [Use, null, null, null, null] +14083 - null - [null, null, null, null, null] +14084 - null - [null, null, null, null, null] +14085 - Fairy ring - [Use, null, null, null, null] +14086 - null - [null, null, null, null, null] +14087 - null - [null, null, null, null, null] +14088 - Fairy ring - [Use, null, null, null, null] +14089 - null - [null, null, null, null, null] +14090 - null - [null, null, null, null, null] +14091 - Fairy ring - [Use, null, null, null, null] +14092 - null - [null, null, null, null, null] +14093 - null - [null, null, null, null, null] +14094 - Fairy ring - [Use, null, null, null, null] +14095 - null - [null, null, null, null, null] +14096 - null - [null, null, null, null, null] +14097 - Fairy ring - [Use, null, null, null, null] +14098 - null - [null, null, null, null, null] +14099 - null - [null, null, null, null, null] +14100 - Fairy ring - [Use, null, null, null, null] +14101 - null - [null, null, null, null, null] +14102 - null - [null, null, null, null, null] +14103 - Fairy ring - [Use, null, null, null, null] +14104 - null - [null, null, null, null, null] +14105 - null - [null, null, null, null, null] +14106 - Fairy ring - [Use, null, null, null, null] +14107 - null - [null, null, null, null, null] +14108 - null - [null, null, null, null, null] +14109 - Fairy ring - [Use, null, null, null, null] +14110 - null - [null, null, null, null, null] +14111 - null - [null, null, null, null, null] +14112 - Fairy ring - [Use, null, null, null, null] +14113 - null - [null, null, null, null, null] +14114 - null - [null, null, null, null, null] +14115 - Fairy ring - [Use, null, null, null, null] +14116 - null - [null, null, null, null, null] +14117 - null - [null, null, null, null, null] +14118 - Fairy ring - [Use, null, null, null, null] +14119 - null - [null, null, null, null, null] +14120 - null - [null, null, null, null, null] +14121 - Fairy ring - [Use, null, null, null, null] +14122 - null - [null, null, null, null, null] +14123 - null - [null, null, null, null, null] +14124 - Fairy ring - [Use, null, null, null, null] +14125 - null - [null, null, null, null, null] +14126 - null - [null, null, null, null, null] +14127 - Fairy ring - [Use, null, null, null, null] +14128 - null - [null, null, null, null, null] +14129 - null - [null, null, null, null, null] +14130 - Fairy ring - [Use, null, null, null, null] +14131 - null - [null, null, null, null, null] +14132 - null - [null, null, null, null, null] +14133 - Fairy ring - [Use, null, null, null, null] +14134 - null - [null, null, null, null, null] +14135 - null - [null, null, null, null, null] +14136 - Fairy ring - [Use, null, null, null, null] +14137 - null - [null, null, null, null, null] +14138 - null - [null, null, null, null, null] +14139 - Fairy ring - [Use, null, null, null, null] +14140 - null - [null, null, null, null, null] +14141 - null - [null, null, null, null, null] +14142 - Fairy ring - [Use, null, null, null, null] +14143 - null - [null, null, null, null, null] +14144 - null - [null, null, null, null, null] +14145 - Fairy ring - [Use, null, null, null, null] +14146 - null - [null, null, null, null, null] +14147 - null - [null, null, null, null, null] +14148 - Fairy ring - [Use, null, null, null, null] +14149 - null - [null, null, null, null, null] +14150 - null - [null, null, null, null, null] +14151 - Fairy ring - [Use, null, null, null, null] +14152 - null - [null, null, null, null, null] +14153 - null - [null, null, null, null, null] +14154 - Fairy ring - [Use, null, null, null, null] +14155 - null - [null, null, null, null, null] +14156 - null - [null, null, null, null, null] +14157 - Fairy ring - [Use, null, null, null, null] +14158 - null - [null, null, null, null, null] +14159 - null - [null, null, null, null, null] +14160 - Fairy ring - [Use, null, null, null, null] +14161 - null - [null, null, null, null, null] +14162 - null - [null, null, null, null, null] +14163 - Table - [null, null, null, null, null] +14164 - null - [null, null, null, null, null] +14165 - null - [null, null, null, null, null] +14166 - null - [null, null, null, null, null] +14167 - null - [null, null, null, null, null] +14168 - Easter bird perch. - [null, null, null, null, null] +14169 - Fire - [null, null, null, null, null] +14170 - null - [Use-Logs, null, null, null, null] +14171 - Embers - [Use-Driftwood, null, null, null, null] +14172 - null - [null, null, null, null, null] +14173 - Olaf's boat - [null, null, null, null, null] +14174 - Driftwood - [null, null, null, null, null] +14175 - Chute - [Enter, null, null, null, null] +14176 - null - [null, null, null, null, null] +14177 - null - [null, null, null, null, null] +14178 - Chute - [Climb Down, null, null, null, null] +14179 - Light - [Jump-out, null, null, null, null] +14180 - null - [null, null, null, null, null] +14181 - null - [null, null, null, null, null] +14182 - null - [null, null, null, null, null] +14183 - null - [null, null, null, null, null] +14184 - null - [null, null, null, null, null] +14185 - null - [null, null, null, null, null] +14186 - null - [null, null, null, null, null] +14187 - null - [null, null, null, null, null] +14188 - null - [null, null, null, null, null] +14189 - null - [null, null, null, null, null] +14190 - null - [null, null, null, null, null] +14191 - null - [null, null, null, null, null] +14192 - null - [null, null, null, null, null] +14193 - null - [null, null, null, null, null] +14194 - null - [null, null, null, null, null] +14195 - null - [null, null, null, null, null] +14196 - Chest - [null, null, null, null, null] +14197 - Chest - [Open, null, null, null, null] +14198 - null - [null, null, null, null, null] +14199 - null - [null, null, null, null, null] +14200 - null - [null, null, null, null, null] +14201 - null - [null, null, null, null, null] +14202 - null - [null, null, null, null, null] +14203 - Hole - [null, null, null, null, null] +14204 - Mound - [null, null, null, null, null] +14205 - Mound - [null, null, null, null, null] +14206 - Mound - [null, null, null, null, null] +14207 - Mound - [null, null, null, null, null] +14208 - Mound - [null, null, null, null, null] +14209 - Mound - [null, null, null, null, null] +14210 - null - [null, null, null, null, null] +14211 - null - [null, null, null, null, null] +14212 - Wall - [null, null, null, null, null] +14213 - Wall - [null, null, null, null, null] +14214 - null - [null, null, null, null, null] +14215 - null - [null, null, null, null, null] +14216 - Wall - [null, hidden, Repair, null, null] +14217 - Wall - [null, hidden, Repair, null, null] +14218 - Wall - [null, hidden, Repair, null, null] +14219 - Wall - [null, hidden, Repair, null, null] +14220 - Wall - [null, null, Repair, null, null] +14221 - Wall - [null, null, Repair, null, null] +14222 - null - [null, null, null, null, null] +14223 - null - [null, null, null, null, null] +14224 - Barricade - [null, hidden, null, null, null] +14225 - Barricade - [null, hidden, null, null, null] +14226 - Barricade - [null, hidden, null, null, null] +14227 - Barricade - [null, hidden, Repair, null, null] +14228 - Barricade - [null, hidden, Repair, null, null] +14229 - Barricade - [null, hidden, Repair, null, null] +14230 - Barricade - [null, null, Repair, null, null] +14231 - Barricade - [null, null, Repair, null, null] +14232 - Barricade - [null, null, Repair, null, null] +14233 - Gate - [Open, hidden, null, null, null] +14234 - Gate - [Close, hidden, null, null, null] +14235 - Gate - [Open, hidden, null, null, null] +14236 - Gate - [Close, hidden, null, null, null] +14237 - Gate - [Open, hidden, Repair, null, null] +14238 - Gate - [Close, hidden, Repair, null, null] +14239 - Gate - [Open, hidden, Repair, null, null] +14240 - Gate - [Close, hidden, Repair, null, null] +14241 - Gate - [Open, hidden, Repair, null, null] +14242 - Gate - [Close, hidden, Repair, null, null] +14243 - Gate - [Open, hidden, Repair, null, null] +14244 - Gate - [Close, hidden, Repair, null, null] +14245 - Gate - [Open, null, Repair, null, null] +14246 - Gate - [Close, null, Repair, null, null] +14247 - Gate - [Open, null, Repair, null, null] +14248 - Gate - [Close, null, Repair, null, null] +14249 - null - [null, null, null, null, null] +14250 - null - [null, null, null, null, null] +14251 - null - [null, null, null, null, null] +14252 - null - [null, null, null, null, null] +14253 - null - [null, null, null, null, null] +14254 - null - [null, null, null, null, null] +14255 - null - [null, null, null, null, null] +14256 - null - [null, null, null, null, null] +14257 - null - [null, null, null, null, null] +14258 - Lander boat - [null, null, null, null, null] +14259 - Lander boat - [null, null, null, null, null] +14260 - Lander boat - [null, null, null, null, null] +14261 - Lander boat - [null, null, null, null, null] +14262 - Lander boat - [null, null, null, null, null] +14263 - Lander boat - [null, null, null, null, null] +14264 - Lander boat - [null, null, null, null, null] +14265 - Lander boat - [null, null, null, null, null] +14266 - Lander boat - [null, null, null, null, null] +14267 - Lander boat - [null, null, null, null, null] +14268 - Lander boat - [null, null, null, null, null] +14269 - Lander hatch - [null, null, null, null, null] +14270 - null - [null, null, null, null, null] +14271 - null - [null, null, null, null, null] +14272 - null - [null, null, null, null, null] +14273 - null - [null, null, null, null, null] +14274 - null - [null, null, null, null, null] +14275 - null - [null, null, null, null, null] +14276 - null - [null, null, null, null, null] +14277 - null - [null, null, null, null, null] +14278 - null - [null, null, null, null, null] +14279 - null - [null, null, null, null, null] +14280 - null - [null, null, null, null, null] +14281 - null - [null, null, null, null, null] +14282 - null - [null, null, null, null, null] +14283 - Banner - [null, null, null, null, null] +14284 - null - [null, null, null, null, null] +14285 - null - [null, null, null, null, null] +14286 - null - [null, null, null, null, null] +14287 - null - [null, null, null, null, null] +14288 - null - [null, null, null, null, null] +14289 - null - [null, null, null, null, null] +14290 - null - [null, null, null, null, null] +14291 - null - [null, null, null, null, null] +14292 - null - [null, null, null, null, null] +14293 - null - [null, null, null, null, null] +14294 - null - [null, null, null, null, null] +14295 - null - [null, null, null, null, null] +14296 - Ladder - [Climb, null, null, null, null] +14297 - null - [null, null, null, null, null] +14298 - null - [null, null, null, null, null] +14299 - null - [null, null, null, null, null] +14300 - null - [null, null, null, null, null] +14301 - null - [null, null, null, null, null] +14302 - null - [null, null, null, null, null] +14303 - null - [null, null, null, null, null] +14304 - Gangplank - [Cross, null, null, null, null] +14305 - Gangplank - [Cross, null, null, null, null] +14306 - Gangplank - [Cross, null, null, null, null] +14307 - Gangplank - [Cross, null, null, null, null] +14308 - Tree - [Chop down, null, hidden, null, null] +14309 - Tree - [Chop down, null, hidden, null, null] +14310 - null - [null, null, null, null, null] +14311 - null - [null, null, null, null, null] +14312 - null - [null, null, null, null, null] +14313 - null - [null, null, null, null, null] +14314 - Ladder - [Climb, null, null, null, null] +14315 - Gangplank - [Cross, null, null, null, null] +14316 - null - [null, null, null, null, null] +14317 - null - [null, null, null, null, null] +14318 - null - [null, null, null, null, null] +14319 - null - [null, null, null, null, null] +14320 - null - [null, null, null, null, null] +14321 - null - [null, null, null, null, null] +14322 - null - [null, null, null, null, null] +14323 - null - [null, null, null, null, null] +14324 - null - [null, null, null, null, null] +14325 - null - [null, null, null, null, null] +14326 - null - [null, null, null, null, null] +14327 - null - [null, null, null, null, null] +14328 - null - [null, null, null, null, null] +14329 - null - [null, null, null, null, null] +14330 - null - [null, null, null, null, null] +14331 - null - [null, null, null, null, null] +14332 - null - [null, null, null, null, null] +14333 - null - [null, null, null, null, null] +14334 - null - [null, null, null, null, null] +14335 - Bones - [null, null, null, null, null] +14336 - null - [null, null, null, null, null] +14337 - null - [null, null, null, null, null] +14338 - null - [null, null, null, null, null] +14339 - null - [null, null, null, null, null] +14340 - null - [null, null, null, null, null] +14341 - null - [null, null, null, null, null] +14342 - null - [null, null, null, null, null] +14343 - null - [null, null, null, null, null] +14344 - null - [null, null, null, null, null] +14345 - null - [null, null, null, null, null] +14346 - null - [null, null, null, null, null] +14347 - null - [null, null, null, null, null] +14348 - null - [null, null, null, null, null] +14349 - null - [null, null, null, null, null] +14350 - null - [null, null, null, null, null] +14351 - null - [null, null, null, null, null] +14352 - null - [null, null, null, null, null] +14353 - null - [null, null, null, null, null] +14354 - null - [null, null, null, null, null] +14355 - Pile of bricks - [null, null, null, null, null] +14356 - Shelves - [null, null, null, null, null] +14357 - Shelves - [null, null, null, null, null] +14358 - Shelves - [null, null, null, null, null] +14359 - Shelves - [null, null, null, null, null] +14360 - Cauldron - [null, null, null, null, null] +14361 - null - [null, null, null, null, null] +14362 - Charms - [null, null, null, null, null] +14363 - Table - [null, null, null, null, null] +14364 - Rocking chair - [null, null, null, null, null] +14365 - null - [null, null, null, null, null] +14366 - Counter - [null, null, null, null, null] +14367 - Bank booth - [Use, Use-quickly, Collect, null, null] +14368 - Bank booth - [null, null, null, null, null] +14369 - Crate - [null, null, null, null, null] +14370 - Crates - [null, null, null, null, null] +14371 - Boxes - [null, null, null, null, null] +14372 - Crates - [null, null, null, null, null] +14373 - Blacksmith's tools - [null, null, null, null, null] +14374 - Barrel - [null, null, null, null, null] +14375 - Shelves - [null, null, null, null, null] +14376 - Shelves - [null, null, null, null, null] +14377 - Shelves - [null, null, null, null, null] +14378 - Shelves - [null, null, null, null, null] +14379 - Shelves - [null, null, null, null, null] +14380 - null - [null, null, null, null, null] +14381 - Stool - [null, null, null, null, null] +14382 - Bank chest - [null, null, null, null, null] +14383 - null - [null, null, null, null, null] +14384 - null - [null, null, null, null, null] +14385 - null - [null, null, null, null, null] +14386 - null - [null, null, null, null, null] +14387 - null - [null, null, null, null, null] +14388 - null - [null, null, null, null, null] +14389 - null - [null, null, null, null, null] +14390 - null - [null, null, null, null, null] +14391 - null - [null, null, null, null, null] +14392 - null - [null, null, null, null, null] +14393 - null - [null, null, null, null, null] +14394 - null - [null, null, null, null, null] +14395 - null - [null, null, null, null, null] +14396 - null - [null, null, null, null, null] +14397 - null - [null, null, null, null, null] +14398 - null - [null, null, null, null, null] +14399 - null - [null, null, null, null, null] +14400 - null - [null, null, null, null, null] +14401 - null - [null, null, null, null, null] +14402 - null - [null, null, null, null, null] +14403 - null - [null, null, null, null, null] +14404 - null - [null, null, null, null, null] +14405 - null - [null, null, null, null, null] +14406 - null - [null, null, null, null, null] +14407 - null - [null, null, null, null, null] +14408 - null - [null, null, null, null, null] +14409 - null - [null, null, null, null, null] +14410 - null - [null, null, null, null, null] +14411 - null - [null, null, null, null, null] +14412 - null - [null, null, null, null, null] +14413 - null - [null, null, null, null, null] +14414 - null - [null, null, null, null, null] +14415 - Study desk - [null, null, null, null, null] +14416 - null - [null, null, null, null, null] +14417 - null - [null, null, null, null, null] +14418 - null - [null, null, null, null, null] +14419 - null - [null, null, null, null, null] +14420 - null - [null, null, null, null, null] +14421 - null - [null, null, null, null, null] +14422 - null - [null, null, null, null, null] +14423 - null - [null, null, null, null, null] +14424 - null - [null, null, null, null, null] +14425 - null - [null, null, null, null, null] +14426 - null - [null, null, null, null, null] +14427 - null - [null, null, null, null, null] +14428 - Fishing spot - [Bait, null, hidden, null, null] +14429 - null - [null, null, null, null, null] +14430 - null - [null, null, null, null, null] +14431 - Rift - [null, null, null, null, null] +14432 - null - [null, null, null, null, null] +14433 - null - [null, null, null, null, null] +14434 - Gas bubble - [null, null, null, null, null] +14435 - null - [null, null, null, null, null] +14436 - Cave entrance - [null, null, null, null, null] +14437 - null - [null, null, null, null, null] +14438 - null - [null, null, null, null, null] +14439 - null - [null, null, null, null, null] +14440 - null - [null, null, null, null, null] +14441 - null - [null, null, null, null, null] +14442 - null - [null, null, null, null, null] +14443 - Mushroom - [null, null, null, null, null] +14444 - Mushroom - [null, null, null, null, null] +14445 - Mushroom - [null, null, null, null, null] +14446 - Mushroom - [null, null, null, null, null] +14447 - Mushroom - [null, null, null, null, null] +14448 - Mushroom - [null, null, null, null, null] +14449 - Mushroom - [null, null, null, null, null] +14450 - null - [null, null, null, null, null] +14451 - null - [null, null, null, null, null] +14452 - null - [null, null, null, null, null] +14453 - null - [null, null, null, null, null] +14454 - null - [null, null, null, null, null] +14455 - null - [null, null, null, null, null] +14456 - null - [null, null, null, null, null] +14457 - null - [null, null, null, null, null] +14458 - null - [null, null, null, null, null] +14459 - null - [null, null, null, null, null] +14460 - null - [null, null, null, null, null] +14461 - null - [null, null, null, null, null] +14462 - null - [null, null, null, null, null] +14463 - null - [null, null, null, null, null] +14464 - null - [null, null, null, null, null] +14465 - null - [null, null, null, null, null] +14466 - null - [null, null, null, null, null] +14467 - null - [null, null, null, null, null] +14468 - null - [null, null, null, null, null] +14469 - null - [null, null, null, null, null] +14470 - null - [null, null, null, null, null] +14471 - null - [null, null, null, null, null] +14472 - Skeleton - [null, null, null, null, null] +14473 - Cage - [null, null, null, null, null] +14474 - Cage - [null, null, null, null, null] +14475 - Skeleton - [null, null, null, null, null] +14476 - Skeleton - [null, null, null, null, null] +14477 - Skeleton - [null, null, null, null, null] +14478 - Skeleton - [null, null, null, null, null] +14479 - Stocks - [null, null, null, null, null] +14480 - Skeleton - [null, null, null, null, null] +14481 - Skeleton - [null, null, null, null, null] +14482 - null - [null, null, null, null, null] +14483 - null - [null, null, null, null, null] +14484 - null - [null, null, null, null, null] +14485 - null - [null, null, null, null, null] +14486 - null - [null, null, null, null, null] +14487 - null - [null, null, null, null, null] +14488 - null - [null, null, null, null, null] +14489 - null - [null, null, null, null, null] +14490 - null - [null, null, null, null, null] +14491 - null - [null, null, null, null, null] +14492 - null - [null, null, null, null, null] +14493 - null - [null, null, null, null, null] +14494 - null - [null, null, null, null, null] +14495 - null - [null, null, null, null, null] +14496 - null - [null, null, null, null, null] +14497 - null - [null, null, null, null, null] +14498 - null - [null, null, null, null, null] +14499 - null - [null, null, null, null, null] +14500 - null - [null, null, null, null, null] +14501 - null - [null, null, null, null, null] +14502 - null - [null, null, null, null, null] +14503 - Wilderness Sign - [null, null, null, null, null] +14504 - Wilderness Sign - [null, null, null, null, null] +14505 - Wilderness Sign - [null, null, null, null, null] +14506 - Wilderness Sign - [null, null, null, null, null] +14507 - Wilderness Sign - [null, null, null, null, null] +14508 - null - [null, null, null, null, null] +14509 - null - [null, null, null, null, null] +14510 - null - [null, null, null, null, null] +14511 - null - [null, null, null, null, null] +14512 - null - [null, null, null, null, null] +14513 - Tree - [null, null, null, null, null] +14514 - Tree - [null, null, null, null, null] +14515 - Tree - [null, null, null, null, null] +14516 - Tree stump - [null, null, null, null, null] +14517 - Tree Stump - [null, null, null, null, null] +14518 - Roots - [null, null, null, null, null] +14519 - Roots - [null, null, null, null, null] +14520 - Roots - [null, null, null, null, null] +14521 - Tree - [null, null, null, null, null] +14522 - null - [null, null, null, null, null] +14523 - Skeleton - [null, null, null, null, null] +14524 - Skeleton - [null, null, null, null, null] +14525 - Skeleton - [null, null, null, null, null] +14526 - Bones - [null, null, null, null, null] +14527 - Bones - [null, null, null, null, null] +14528 - Bones - [null, null, null, null, null] +14529 - Bones - [null, null, null, null, null] +14530 - Bones - [null, null, null, null, null] +14531 - Bones - [null, null, null, null, null] +14532 - Bones - [null, null, null, null, null] +14533 - Bones - [null, null, null, null, null] +14534 - Bones - [null, null, null, null, null] +14535 - Bones - [null, null, null, null, null] +14536 - Bones - [null, null, null, null, null] +14537 - Bones - [null, null, null, null, null] +14538 - Mushroom - [null, null, null, null, null] +14539 - Mushroom - [null, null, null, null, null] +14540 - Mushroom - [null, null, null, null, null] +14541 - Mushroom - [null, null, null, null, null] +14542 - Mushroom - [null, null, null, null, null] +14543 - null - [null, null, null, null, null] +14544 - null - [null, null, null, null, null] +14545 - null - [null, null, null, null, null] +14546 - null - [null, null, null, null, null] +14547 - null - [null, null, null, null, null] +14548 - null - [null, null, null, null, null] +14549 - null - [null, null, null, null, null] +14550 - null - [null, null, null, null, null] +14551 - null - [null, null, null, null, null] +14552 - null - [null, null, null, null, null] +14553 - null - [null, null, null, null, null] +14554 - null - [null, null, null, null, null] +14555 - null - [null, null, null, null, null] +14556 - Stone Pile - [null, null, null, null, null] +14557 - Stone Pile - [null, null, null, null, null] +14558 - null - [null, null, null, null, null] +14559 - null - [null, null, null, null, null] +14560 - null - [null, null, null, null, null] +14561 - null - [null, null, null, null, null] +14562 - null - [null, null, null, null, null] +14563 - null - [null, null, null, null, null] +14564 - Tree - [null, null, null, null, null] +14565 - Tree - [null, null, null, null, null] +14566 - Tree - [null, null, null, null, null] +14567 - Tree Stump - [null, null, null, null, null] +14568 - Roots - [null, null, null, null, null] +14569 - Roots - [null, null, null, null, null] +14570 - Roots - [null, null, null, null, null] +14571 - Tree - [null, null, null, null, null] +14572 - null - [null, null, null, null, null] +14573 - Skeleton - [null, null, null, null, null] +14574 - Skeleton - [null, null, null, null, null] +14575 - Skeleton - [null, null, null, null, null] +14576 - Bones - [null, null, null, null, null] +14577 - Bones - [null, null, null, null, null] +14578 - Bones - [null, null, null, null, null] +14579 - Bones - [null, null, null, null, null] +14580 - Bones - [null, null, null, null, null] +14581 - Bones - [null, null, null, null, null] +14582 - Bones - [null, null, null, null, null] +14583 - Bones - [null, null, null, null, null] +14584 - Bones - [null, null, null, null, null] +14585 - Bones - [null, null, null, null, null] +14586 - Bones - [null, null, null, null, null] +14587 - Bones - [null, null, null, null, null] +14588 - Mushroom - [null, null, null, null, null] +14589 - Mushroom - [null, null, null, null, null] +14590 - Mushroom - [null, null, null, null, null] +14591 - Mushroom - [null, null, null, null, null] +14592 - Mushroom - [null, null, null, null, null] +14593 - Tree - [null, null, null, null, null] +14594 - Tree - [null, null, null, null, null] +14595 - Tree - [null, null, null, null, null] +14596 - Tree Stump - [null, null, null, null, null] +14597 - Roots - [null, null, null, null, null] +14598 - Roots - [null, null, null, null, null] +14599 - Roots - [null, null, null, null, null] +14600 - Tree - [null, null, null, null, null] +14601 - null - [null, null, null, null, null] +14602 - Skeleton - [null, null, null, null, null] +14603 - Skeleton - [null, null, null, null, null] +14604 - Skeleton - [null, null, null, null, null] +14605 - Bones - [null, null, null, null, null] +14606 - Bones - [null, null, null, null, null] +14607 - Bones - [null, null, null, null, null] +14608 - Bones - [null, null, null, null, null] +14609 - Bones - [null, null, null, null, null] +14610 - Bones - [null, null, null, null, null] +14611 - Bones - [null, null, null, null, null] +14612 - Bones - [null, null, null, null, null] +14613 - Bones - [null, null, null, null, null] +14614 - Bones - [null, null, null, null, null] +14615 - Bones - [null, null, null, null, null] +14616 - Bones - [null, null, null, null, null] +14617 - Mushroom - [null, null, null, null, null] +14618 - Mushroom - [null, null, null, null, null] +14619 - Mushroom - [null, null, null, null, null] +14620 - Mushroom - [null, null, null, null, null] +14621 - Mushroom - [null, null, null, null, null] +14622 - null - [null, null, null, null, null] +14623 - null - [null, null, null, null, null] +14624 - null - [null, null, null, null, null] +14625 - null - [null, null, null, null, null] +14626 - null - [null, null, null, null, null] +14627 - null - [null, null, null, null, null] +14628 - null - [null, null, null, null, null] +14629 - null - [null, null, null, null, null] +14630 - Stone Pile - [null, null, null, null, null] +14631 - Stone Pile - [null, null, null, null, null] +14632 - null - [null, null, null, null, null] +14633 - null - [null, null, null, null, null] +14634 - null - [null, null, null, null, null] +14635 - Tree - [null, null, null, null, null] +14636 - Tree - [null, null, null, null, null] +14637 - Tree - [null, null, null, null, null] +14638 - Tree Stump - [null, null, null, null, null] +14639 - Roots - [null, null, null, null, null] +14640 - Roots - [null, null, null, null, null] +14641 - Roots - [null, null, null, null, null] +14642 - Tree - [null, null, null, null, null] +14643 - null - [null, null, null, null, null] +14644 - Skeleton - [null, null, null, null, null] +14645 - Skeleton - [null, null, null, null, null] +14646 - Skeleton - [null, null, null, null, null] +14647 - Bones - [null, null, null, null, null] +14648 - Bones - [null, null, null, null, null] +14649 - Bones - [null, null, null, null, null] +14650 - Bones - [null, null, null, null, null] +14651 - Bones - [null, null, null, null, null] +14652 - Bones - [null, null, null, null, null] +14653 - Bones - [null, null, null, null, null] +14654 - Bones - [null, null, null, null, null] +14655 - Bones - [null, null, null, null, null] +14656 - Bones - [null, null, null, null, null] +14657 - Bones - [null, null, null, null, null] +14658 - Bones - [null, null, null, null, null] +14659 - Mushroom - [null, null, null, null, null] +14660 - Mushroom - [null, null, null, null, null] +14661 - Mushroom - [null, null, null, null, null] +14662 - Mushroom - [null, null, null, null, null] +14663 - Mushroom - [null, null, null, null, null] +14664 - Tree - [null, null, null, null, null] +14665 - Tree - [null, null, null, null, null] +14666 - Tree - [null, null, null, null, null] +14667 - Tree Stump - [null, null, null, null, null] +14668 - Roots - [null, null, null, null, null] +14669 - Roots - [null, null, null, null, null] +14670 - Roots - [null, null, null, null, null] +14671 - Tree - [null, null, null, null, null] +14672 - null - [null, null, null, null, null] +14673 - Skeleton - [null, null, null, null, null] +14674 - Skeleton - [null, null, null, null, null] +14675 - Skeleton - [null, null, null, null, null] +14676 - Bones - [null, null, null, null, null] +14677 - Bones - [null, null, null, null, null] +14678 - Bones - [null, null, null, null, null] +14679 - Bones - [null, null, null, null, null] +14680 - Bones - [null, null, null, null, null] +14681 - Bones - [null, null, null, null, null] +14682 - Bones - [null, null, null, null, null] +14683 - Bones - [null, null, null, null, null] +14684 - Bones - [null, null, null, null, null] +14685 - Bones - [null, null, null, null, null] +14686 - Bones - [null, null, null, null, null] +14687 - Bones - [null, null, null, null, null] +14688 - Mushroom - [null, null, null, null, null] +14689 - Mushroom - [null, null, null, null, null] +14690 - Mushroom - [null, null, null, null, null] +14691 - Mushroom - [null, null, null, null, null] +14692 - Mushroom - [null, null, null, null, null] +14693 - Tree - [null, null, null, null, null] +14694 - Tree - [null, null, null, null, null] +14695 - Tree - [null, null, null, null, null] +14696 - Tree - [null, null, null, null, null] +14697 - Tree Stump - [null, null, null, null, null] +14698 - Roots - [null, null, null, null, null] +14699 - Roots - [null, null, null, null, null] +14700 - Roots - [null, null, null, null, null] +14701 - Tree - [null, null, null, null, null] +14702 - null - [null, null, null, null, null] +14703 - Skeleton - [null, null, null, null, null] +14704 - Skeleton - [null, null, null, null, null] +14705 - Skeleton - [null, null, null, null, null] +14706 - Bones - [null, null, null, null, null] +14707 - Bones - [null, null, null, null, null] +14708 - Bones - [null, null, null, null, null] +14709 - Bones - [null, null, null, null, null] +14710 - Bones - [null, null, null, null, null] +14711 - Bones - [null, null, null, null, null] +14712 - Bones - [null, null, null, null, null] +14713 - Bones - [null, null, null, null, null] +14714 - Bones - [null, null, null, null, null] +14715 - Bones - [null, null, null, null, null] +14716 - Bones - [null, null, null, null, null] +14717 - Bones - [null, null, null, null, null] +14718 - Mushroom - [null, null, null, null, null] +14719 - Mushroom - [null, null, null, null, null] +14720 - Mushroom - [null, null, null, null, null] +14721 - Mushroom - [null, null, null, null, null] +14722 - Mushroom - [null, null, null, null, null] +14723 - null - [null, null, null, null, null] +14724 - null - [null, null, null, null, null] +14725 - null - [null, null, null, null, null] +14726 - null - [null, null, null, null, null] +14727 - null - [null, null, null, null, null] +14728 - null - [null, null, null, null, null] +14729 - null - [null, null, null, null, null] +14730 - null - [null, null, null, null, null] +14731 - Stone Pile - [null, null, null, null, null] +14732 - Stone Pile - [null, null, null, null, null] +14733 - null - [null, null, null, null, null] +14734 - null - [null, null, null, null, null] +14735 - Staircase - [Climb-up, null, null, null, null] +14736 - Staircase - [Climb, Climb-up, Climb-down, null, null] +14737 - Staircase - [Climb-down, null, null, null, null] +14738 - Tree - [null, null, null, null, null] +14739 - Crate - [null, null, null, null, null] +14740 - Barrel - [null, null, null, null, null] +14741 - Crates - [null, null, null, null, null] +14742 - Pile of Crates - [Search, null, null, null, null] +14743 - Sack - [Search, null, null, null, null] +14744 - null - [null, null, null, null, null] +14745 - Ladder - [Climb-up, null, null, null, null] +14746 - Ladder - [Climb-down, null, null, null, null] +14747 - Ladder - [Climb, Climb-up, Climb-down, null, null] +14748 - Ladder - [null, null, null, null, null] +14749 - Door - [Open, null, null, null, null] +14750 - Door - [Close, null, null, null, null] +14751 - Door - [Open, null, null, null, null] +14752 - Door - [Open, null, null, null, null] +14753 - Door - [Close, null, null, null, null] +14754 - Door - [Close, null, null, null, null] +14755 - Banner - [null, null, null, null, null] +14756 - Banner - [null, null, null, null, null] +14757 - Banner - [null, null, null, null, null] +14758 - Ladder - [Climb-down, null, null, null, null] +14759 - Roots - [null, null, null, null, null] +14760 - Roots - [null, null, null, null, null] +14761 - Roots - [null, null, null, null, null] +14762 - Table - [null, null, null, null, null] +14763 - Table - [null, null, null, null, null] +14764 - Stool - [null, null, null, null, null] +14765 - Gravestone - [null, null, null, null, null] +14766 - Gravestone - [null, null, null, null, null] +14767 - Gravestone - [null, null, null, null, null] +14768 - Gravestone - [null, null, null, null, null] +14769 - Gravestone - [null, null, null, null, null] +14770 - null - [null, null, null, null, null] +14771 - Bed - [null, null, null, null, null] +14772 - Bed - [null, null, null, null, null] +14773 - Chest - [Open, null, null, null, null] +14774 - Chest - [Search, Close, null, null, null] +14775 - null - [null, null, null, null, null] +14776 - null - [null, null, null, null, null] +14777 - null - [null, null, null, null, null] +14778 - null - [null, null, null, null, null] +14779 - null - [null, null, null, null, null] +14780 - null - [null, null, null, null, null] +14781 - null - [null, null, null, null, null] +14782 - null - [null, null, null, null, null] +14783 - null - [null, null, null, null, null] +14784 - null - [null, null, null, null, null] +14785 - null - [null, null, null, null, null] +14786 - null - [null, null, null, null, null] +14787 - null - [null, null, null, null, null] +14788 - null - [null, null, null, null, null] +14789 - null - [null, null, null, null, null] +14790 - null - [null, null, null, null, null] +14791 - null - [null, null, null, null, null] +14792 - null - [null, null, null, null, null] +14793 - null - [null, null, null, null, null] +14794 - null - [null, null, null, null, null] +14795 - null - [null, null, null, null, null] +14796 - Tree - [null, null, null, null, null] +14797 - Tree - [null, null, null, null, null] +14798 - Tree - [null, null, null, null, null] +14799 - Tree - [null, null, null, null, null] +14800 - Tree - [null, null, null, null, null] +14801 - Tree - [null, null, null, null, null] +14802 - Tree - [null, null, null, null, null] +14803 - Tree - [null, null, null, null, null] +14804 - Tree - [null, null, null, null, null] +14805 - Tree - [null, null, null, null, null] +14806 - Tree - [null, null, null, null, null] +14807 - Tree - [null, null, null, null, null] +14808 - Creeper - [null, null, null, null, null] +14809 - Creeper - [null, null, null, null, null] +14810 - Creeper - [null, null, null, null, null] +14811 - Creeper - [null, null, null, null, null] +14812 - Creeper - [null, null, null, null, null] +14813 - Creeper - [null, null, null, null, null] +14814 - Rock - [null, null, null, null, null] +14815 - Rock - [null, null, null, null, null] +14816 - Rock - [null, null, null, null, null] +14817 - Rock - [null, null, null, null, null] +14818 - null - [null, null, null, null, null] +14819 - null - [null, null, null, null, null] +14820 - null - [null, null, null, null, null] +14821 - null - [null, null, null, null, null] +14822 - null - [null, null, null, null, null] +14823 - null - [null, null, null, null, null] +14824 - null - [null, null, null, null, null] +14825 - Obelisk - [null, null, null, null, null] +14826 - Obelisk - [Activate, null, null, null, null] +14827 - Obelisk - [Activate, null, null, null, null] +14828 - Obelisk - [Activate, null, null, null, null] +14829 - Obelisk - [Activate, null, null, null, null] +14830 - Obelisk - [Activate, null, null, null, null] +14831 - Obelisk - [Activate, null, null, null, null] +14832 - Rocks - [Mine, Prospect, hidden, null, null] +14833 - Rocks - [Mine, Prospect, hidden, null, null] +14834 - Rocks - [Mine, Prospect, hidden, null, null] +14835 - Rocks - [Mine, Prospect, hidden, null, null] +14836 - Rocks - [Mine, Prospect, hidden, null, null] +14837 - Rocks - [Mine, Prospect, hidden, null, null] +14838 - Rocks - [Mine, Prospect, hidden, null, null] +14839 - Rocks - [Mine, Prospect, hidden, null, null] +14840 - Rocks - [Mine, Prospect, hidden, null, null] +14841 - Rocks - [Mine, Prospect, hidden, null, null] +14842 - Rocks - [Mine, Prospect, hidden, null, null] +14843 - Rocks - [Mine, Prospect, hidden, null, null] +14844 - Rocks - [Mine, Prospect, hidden, null, null] +14845 - Rocks - [Mine, Prospect, hidden, null, null] +14846 - Rocks - [Mine, Prospect, hidden, null, null] +14847 - Rocks - [Mine, Prospect, hidden, null, null] +14848 - Rocks - [Mine, Prospect, hidden, null, null] +14849 - Rocks - [Mine, Prospect, hidden, null, null] +14850 - Rocks - [Mine, Prospect, hidden, null, null] +14851 - Rocks - [Mine, Prospect, hidden, null, null] +14852 - Rocks - [Mine, Prospect, hidden, null, null] +14853 - Rocks - [Mine, Prospect, hidden, null, null] +14854 - Rocks - [Mine, Prospect, hidden, null, null] +14855 - Rocks - [Mine, Prospect, hidden, null, null] +14856 - Rocks - [Mine, Prospect, hidden, null, null] +14857 - Rocks - [Mine, Prospect, hidden, null, null] +14858 - Rocks - [Mine, Prospect, hidden, null, null] +14859 - Rocks - [Mine, Prospect, hidden, null, null] +14860 - Rocks - [Mine, Prospect, hidden, null, null] +14861 - Rocks - [Mine, Prospect, hidden, null, null] +14862 - Rocks - [Mine, Prospect, hidden, null, null] +14863 - Rocks - [Mine, Prospect, hidden, null, null] +14864 - Rocks - [Mine, Prospect, hidden, null, null] +14865 - Barrel - [null, null, null, null, null] +14866 - Barrel - [null, null, null, null, null] +14867 - Barrel - [null, null, null, null, null] +14868 - Sink - [null, null, null, null, null] +14869 - Shelves - [null, null, null, null, null] +14870 - null - [null, null, null, null, null] +14871 - null - [null, null, null, null, null] +14872 - Stool - [null, null, null, null, null] +14873 - Hanging meat - [null, null, null, null, null] +14874 - Hanging meat - [null, null, null, null, null] +14875 - null - [null, null, null, null, null] +14876 - null - [null, null, null, null, null] +14877 - null - [null, null, null, null, null] +14878 - null - [null, null, null, null, null] +14879 - Trapdoor - [Open, null, null, null, null] +14880 - Trapdoor - [Climb-down, null, null, null, null] +14881 - null - [null, null, null, null, null] +14882 - null - [null, null, null, null, null] +14883 - Rocks - [Mine, Prospect, hidden, null, null] +14884 - Rocks - [Mine, Prospect, hidden, null, null] +14885 - Rocks - [Mine, Prospect, hidden, null, null] +14886 - Rocks - [Mine, Prospect, hidden, null, null] +14887 - Rocks - [Mine, Prospect, hidden, null, null] +14888 - Rocks - [Mine, Prospect, hidden, null, null] +14889 - Rocks - [Mine, Prospect, hidden, null, null] +14890 - Rocks - [Mine, Prospect, hidden, null, null] +14891 - Bed - [null, null, null, null, null] +14892 - Rocks - [Mine, Prospect, hidden, null, null] +14893 - Rocks - [Mine, Prospect, hidden, null, null] +14894 - Rocks - [Mine, Prospect, hidden, null, null] +14895 - Rocks - [Mine, Prospect, hidden, null, null] +14896 - Rocks - [Mine, Prospect, hidden, null, null] +14897 - Rocks - [Mine, Prospect, hidden, null, null] +14898 - Rocks - [Mine, Prospect, hidden, null, null] +14899 - Rocks - [Mine, Prospect, hidden, null, null] +14900 - Rocks - [Mine, Prospect, hidden, null, null] +14901 - Rocks - [Mine, Prospect, hidden, null, null] +14902 - Rocks - [Mine, Prospect, hidden, null, null] +14903 - Rocks - [Mine, Prospect, hidden, null, null] +14904 - Rocks - [Mine, Prospect, hidden, null, null] +14905 - Rocks - [Mine, Prospect, hidden, null, null] +14906 - Rocks - [Mine, Prospect, hidden, null, null] +14907 - Rocks - [Mine, Prospect, hidden, null, null] +14908 - null - [null, null, null, null, null] +14909 - null - [null, null, null, null, null] +14910 - Bronze pickaxe - [Take, null, null, null, null] +14911 - null - [null, null, null, null, null] +14912 - Bronze axe - [Take, null, null, null, null] +14913 - Rocks - [Mine, Prospect, hidden, null, null] +14914 - Rocks - [Mine, Prospect, hidden, null, null] +14915 - Rocks - [Mine, Prospect, hidden, null, null] +14916 - Rocks - [Mine, Prospect, hidden, null, null] +14917 - Sink - [null, null, null, null, null] +14918 - Washbasin - [null, null, null, null, null] +14919 - Range - [null, null, null, null, null] +14920 - Table - [null, null, null, null, null] +14921 - Small furnace - [null, Smelt, null, null, null] +14922 - Hole - [Enter, null, null, null, null] +14923 - Door - [Open, null, null, null, null] +14924 - Door - [Close, null, null, null, null] +14925 - null - [null, null, null, null, null] +14926 - null - [null, null, null, null, null] +14927 - null - [null, null, null, null, null] +14928 - null - [null, null, null, null, null] +14929 - Colony gate - [Open, null, null, null, null] +14930 - null - [null, null, null, null, null] +14931 - Colony gate - [Open, null, null, null, null] +14932 - null - [null, null, null, null, null] +14933 - null - [null, null, null, null, null] +14934 - null - [null, null, null, null, null] +14935 - null - [null, null, null, null, null] +14936 - null - [null, null, null, null, null] +14937 - null - [null, null, null, null, null] +14938 - Fishing spot - [Net, null, hidden, null, null] +14939 - null - [null, null, null, null, null] +14940 - null - [null, null, null, null, null] +14941 - null - [null, null, null, null, null] +14942 - null - [null, null, null, null, null] +14943 - null - [null, null, null, null, null] +14944 - null - [null, null, null, null, null] +14945 - Broken wall - [null, null, null, null, null] +14946 - Broken wall - [null, null, null, null, null] +14947 - Broken wall - [null, null, null, null, null] +14948 - Patched wall - [null, null, null, null, null] +14949 - Patched wall - [null, null, null, null, null] +14950 - Patched wall - [null, null, null, null, null] +14951 - Cogs - [null, null, null, null, null] +14952 - Junk - [null, null, null, null, null] +14953 - Fishing weights - [null, null, null, null, null] +14954 - null - [null, null, null, null, null] +14955 - null - [null, null, null, null, null] +14956 - Metal Press - [null, null, null, null, null] +14957 - Metal Press - [null, null, null, null, null] +14958 - Firebox - [null, null, null, null, null] +14959 - Firebox - [null, null, null, null, null] +14960 - Firebox - [null, null, null, null, null] +14961 - Shelves - [null, null, null, null, null] +14962 - Crates - [null, null, null, null, null] +14963 - Crates - [null, null, null, null, null] +14964 - Barrel - [Take-from, null, null, null, null] +14965 - Large barrel - [null, null, null, null, null] +14966 - Rack of barrels - [null, null, null, null, null] +14967 - Large Barrel - [null, null, null, null, null] +14968 - Barrow - [null, null, null, null, null] +14969 - Barrow - [null, null, null, null, null] +14970 - Barrow - [null, null, null, null, null] +14971 - Herman's desk - [Search, null, null, null, null] +14972 - Net - [null, null, null, null, null] +14973 - Net - [Take-from, null, null, null, null] +14974 - null - [null, null, null, null, null] +14975 - null - [null, null, null, null, null] +14976 - Evil claw - [null, null, null, null, null] +14977 - null - [null, null, null, null, null] +14978 - Control panel - [Use, null, null, null, null] +14979 - null - [null, null, null, null, null] +14980 - null - [null, null, null, null, null] +14981 - null - [null, null, null, null, null] +14982 - Door - [Open, null, null, null, null] +14983 - null - [Close, null, null, null, null] +14984 - null - [null, null, null, null, null] +14985 - Crates - [null, null, null, null, null] +14986 - Crate - [null, null, null, null, null] +14987 - Crates - [null, null, null, null, null] +14988 - Cogs - [null, null, null, null, null] +14989 - Junk - [null, null, null, null, null] +14990 - Rack of barrels - [null, null, null, null, null] +14991 - Barrel - [null, null, null, null, null] +14992 - Barrow - [null, null, null, null, null] +14993 - null - [null, null, null, null, null] +14994 - null - [null, null, null, null, null] +14995 - null - [null, null, null, null, null] +14996 - null - [null, null, null, null, null] +14997 - null - [null, null, null, null, null] +14998 - Sack Pile - [null, null, null, null, null] +14999 - Sack Pile - [null, null, null, null, null] +15000 - Pinball Post - [Tag, null, null, null, null] +15001 - Pinball Post - [Tag, null, null, null, null] +15002 - Pinball Post - [Tag, null, null, null, null] +15003 - Pinball Post - [Tag, null, null, null, null] +15004 - Pinball Post - [Tag, null, null, null, null] +15005 - Pinball Post - [Tag, null, null, null, null] +15006 - Pinball Post - [Tag, null, null, null, null] +15007 - Pinball Post - [Tag, null, null, null, null] +15008 - Pinball Post - [Tag, null, null, null, null] +15009 - Pinball Post - [Tag, null, null, null, null] +15010 - Cave Exit - [Exit, null, null, null, null] +15011 - null - [null, null, null, null, null] +15012 - null - [null, null, null, null, null] +15013 - null - [null, null, null, null, null] +15014 - null - [null, null, null, null, null] +15015 - null - [null, null, null, null, null] +15016 - null - [null, null, null, null, null] +15017 - null - [null, null, null, null, null] +15018 - null - [null, null, null, null, null] +15019 - null - [null, null, null, null, null] +15020 - null - [null, null, null, null, null] +15021 - null - [null, null, null, null, null] +15022 - null - [null, null, null, null, null] +15023 - null - [null, null, null, null, null] +15024 - null - [null, null, null, null, null] +15025 - null - [null, null, null, null, null] +15026 - null - [null, null, null, null, null] +15027 - null - [null, null, null, null, null] +15028 - null - [null, null, null, null, null] +15029 - null - [null, null, null, null, null] +15030 - Crate - [Search, null, null, null, null] +15031 - Crate - [Search, null, null, null, null] +15032 - Crates - [Search, null, null, null, null] +15033 - null - [null, null, null, null, null] +15034 - null - [null, null, null, null, null] +15035 - null - [null, null, null, null, null] +15036 - null - [null, null, null, null, null] +15037 - null - [null, null, null, null, null] +15038 - null - [null, null, null, null, null] +15039 - Stool - [null, null, null, null, null] +15040 - Counter - [null, null, null, null, null] +15041 - Picnic table - [null, null, null, null, null] +15042 - null - [Take, null, null, null, null] +15043 - null - [null, null, null, null, null] +15044 - Table - [null, null, null, null, null] +15045 - Bar pumps - [null, null, null, null, null] +15046 - Warehouse shelves - [null, null, null, null, null] +15047 - Warehouse shelves - [null, null, null, null, null] +15048 - Warehouse shelves - [null, null, null, null, null] +15049 - Warehouse shelves - [null, null, null, null, null] +15050 - Altar - [Search, null, null, null, null] +15051 - Altar - [Search, null, null, null, null] +15052 - Coffin - [Close, Search, null, null, null] +15053 - Coffin - [Close, Search, null, null, null] +15054 - null - [null, null, null, null, null] +15055 - null - [null, null, null, null, null] +15056 - Door - [Open, null, null, null, null] +15057 - Skeleton - [null, null, null, null, null] +15058 - null - [null, null, null, null, null] +15059 - null - [null, null, null, null, null] +15060 - null - [null, null, null, null, null] +15061 - null - [Close, Search, null, null, null] +15062 - Teak - [Chop down, null, null, null, null] +15063 - Weedy patch - [null, null, null, null, null] +15064 - Weedy patch - [null, null, null, null, null] +15065 - Weedy patch - [null, null, null, null, null] +15066 - Weedy patch - [null, null, null, null, null] +15067 - null - [null, null, null, null, null] +15068 - Dry patch - [null, null, null, null, null] +15069 - Dry patch - [null, null, null, null, null] +15070 - Dry patch - [null, null, null, null, null] +15071 - null - [null, null, null, null, null] +15072 - Barren patch - [null, null, null, null, null] +15073 - Barren patch - [null, null, null, null, null] +15074 - null - [null, null, null, null, null] +15075 - Flax - [null, null, null, null, null] +15076 - Flax - [null, null, null, null, null] +15077 - Flax - [null, null, null, null, null] +15078 - Flax - [null, null, null, null, null] +15079 - null - [null, null, null, null, null] +15080 - Herbs - [null, null, null, null, null] +15081 - Herbs - [null, null, null, null, null] +15082 - Herbs - [null, null, null, null, null] +15083 - Herbs - [null, null, null, null, null] +15084 - null - [null, null, null, null, null] +15085 - null - [null, null, null, null, null] +15086 - null - [null, null, null, null, null] +15087 - null - [null, null, null, null, null] +15088 - Bench - [null, null, null, null, null] +15089 - null - [null, null, null, null, null] +15090 - null - [null, null, null, null, null] +15091 - Chair - [null, null, null, null, null] +15092 - Table - [null, null, null, null, null] +15093 - Stool - [null, null, null, null, null] +15094 - Bed - [null, null, null, null, null] +15095 - Bed - [null, null, null, null, null] +15096 - Bed - [null, null, null, null, null] +15097 - Bed - [null, null, null, null, null] +15098 - Shelf - [null, null, null, null, null] +15099 - Shelf - [null, null, null, null, null] +15100 - Shelf - [null, null, null, null, null] +15101 - Shelf - [null, null, null, null, null] +15102 - Shelf - [null, null, null, null, null] +15103 - Bar pumps - [null, null, null, null, null] +15104 - Bar - [null, null, null, null, null] +15105 - Barrel - [null, null, null, null, null] +15106 - Crates - [null, null, null, null, null] +15107 - Crate - [null, null, null, null, null] +15108 - Barrel - [null, null, null, null, null] +15109 - Crates - [null, null, null, null, null] +15110 - Warehouse shelves - [null, null, null, null, null] +15111 - Warehouse shelves - [null, null, null, null, null] +15112 - Warehouse shelves - [null, null, null, null, null] +15113 - Warehouse shelves - [null, null, null, null, null] +15114 - Counter - [null, null, null, null, null] +15115 - Ladder - [Climb-up, null, null, null, null] +15116 - Ladder - [Climb-down, null, null, null, null] +15117 - Bookcase - [null, null, null, null, null] +15118 - Bookcase - [null, null, null, null, null] +15119 - Bookcase - [null, null, null, null, null] +15120 - Fungus - [null, null, null, null, null] +15121 - Fungus - [null, null, null, null, null] +15122 - null - [null, null, null, null, null] +15123 - null - [null, null, null, null, null] +15124 - null - [null, null, null, null, null] +15125 - null - [null, null, null, null, null] +15126 - null - [null, null, null, null, null] +15127 - Rocks - [Take-axe, null, null, null, null] +15128 - Rocks - [null, null, null, null, null] +15129 - null - [null, null, null, null, null] +15130 - null - [null, null, null, null, null] +15131 - null - [null, null, null, null, null] +15132 - null - [null, null, null, null, null] +15133 - null - [null, null, null, null, null] +15134 - Dyed fabric - [null, null, null, null, null] +15135 - Dyed fabric - [null, null, null, null, null] +15136 - Dyed fabric - [null, null, null, null, null] +15137 - Table - [null, null, null, null, null] +15138 - Dye Pots - [null, null, null, null, null] +15139 - Cloth - [null, null, null, null, null] +15140 - Clothes model - [null, null, null, null, null] +15141 - Clothes model - [null, null, null, null, null] +15142 - Clothes model - [null, null, null, null, null] +15143 - Clothes model - [null, null, null, null, null] +15144 - Clothes equipment - [null, null, null, null, null] +15145 - Clothing shelves - [null, null, null, null, null] +15146 - null - [null, null, null, null, null] +15147 - null - [null, null, null, null, null] +15148 - null - [null, null, null, null, null] +15149 - null - [null, null, null, null, null] +15150 - null - [null, null, null, null, null] +15151 - null - [null, null, null, null, null] +15152 - null - [null, null, null, null, null] +15153 - null - [null, null, null, null, null] +15154 - null - [null, null, null, null, null] +15155 - null - [null, null, null, null, null] +15156 - Fire - [null, null, null, null, null] +15157 - null - [null, null, null, null, null] +15158 - Standing torch - [null, null, null, null, null] +15159 - null - [null, null, null, null, null] +15160 - null - [null, null, null, null, null] +15161 - null - [null, null, null, null, null] +15162 - null - [null, null, null, null, null] +15163 - null - [null, null, null, null, null] +15164 - null - [null, null, null, null, null] +15165 - Hat stand - [null, null, null, null, null] +15166 - Armour - [null, null, null, null, null] +15167 - Armour - [null, null, null, null, null] +15168 - null - [null, null, null, null, null] +15169 - null - [null, null, null, null, null] +15170 - null - [null, null, null, null, null] +15171 - null - [null, null, null, null, null] +15172 - null - [null, null, null, null, null] +15173 - null - [null, null, null, null, null] +15174 - null - [null, null, null, null, null] +15175 - null - [null, null, null, null, null] +15176 - null - [null, null, null, null, null] +15177 - null - [null, null, null, null, null] +15178 - null - [null, null, null, null, null] +15179 - null - [null, null, null, null, null] +15180 - null - [null, null, null, null, null] +15181 - null - [null, null, null, null, null] +15182 - Eggs - [null, null, null, null, null] +15183 - Eggs - [null, null, null, null, null] +15184 - Eggs - [null, null, null, null, null] +15185 - Eggs - [null, null, null, null, null] +15186 - Crevice - [Squeeze-through, null, null, null, null] +15187 - Crevice - [Squeeze-through, null, null, null, null] +15188 - Tunnel - [Enter, null, null, null, null] +15189 - Tunnel - [Enter, null, null, null, null] +15190 - Light - [null, null, null, null, null] +15191 - Exit - [Climb-up, null, null, null, null] +15192 - null - [null, null, null, null, null] +15193 - null - [null, null, null, null, null] +15194 - Crevice - [Squeeze-through, null, null, null, null] +15195 - Crevice - [Squeeze-through, null, null, null, null] +15196 - Crevice - [Squeeze-through, null, null, null, null] +15197 - Crevice - [Squeeze-through, null, null, null, null] +15198 - Rock - [null, null, null, null, null] +15199 - Rock - [null, null, null, null, null] +15200 - null - [null, null, null, null, null] +15201 - Hole - [null, null, null, null, null] +15202 - Hole - [Climb-down, null, null, null, null] +15203 - null - [null, null, null, null, null] +15204 - Door - [Open, null, null, null, null] +15205 - Door - [Close, null, null, null, null] +15206 - Fire remains - [Search, null, null, null, null] +15207 - Fire remains - [Search, null, null, null, null] +15208 - Fire remains - [Search, null, null, null, null] +15209 - Fire remains - [Search, null, null, null, null] +15210 - Fire remains - [Search, null, null, null, null] +15211 - null - [null, null, null, null, null] +15212 - null - [null, null, null, null, null] +15213 - Rocks - [Look-at, null, null, null, null] +15214 - Steam Vent - [null, null, null, null, null] +15215 - Steam Vent - [null, null, null, null, null] +15216 - Ropeswing - [Swing-on, null, null, null, null] +15217 - Rock - [null, null, null, null, null] +15218 - Rock - [null, null, null, null, null] +15219 - Rock - [null, null, null, null, null] +15220 - null - [null, null, null, null, null] +15221 - null - [null, null, null, null, null] +15222 - Platform - [null, null, null, null, null] +15223 - Platform - [null, null, null, null, null] +15224 - Platform - [null, null, null, null, null] +15225 - Platform - [Use-Lift, null, null, null, null] +15226 - Platform - [null, null, null, null, null] +15227 - Engine Platform - [null, null, null, null, null] +15228 - Lift Engine - [null, null, null, null, null] +15229 - Lift Engine - [null, null, null, null, null] +15230 - Broken Scaffold - [null, null, null, null, null] +15231 - Scaffold - [null, null, null, null, null] +15232 - Scaffold - [null, null, null, null, null] +15233 - Broken Scaffold - [null, null, null, null, null] +15234 - Scaffold - [null, null, null, null, null] +15235 - Scaffold - [null, null, null, null, null] +15236 - Scaffold - [null, null, null, null, null] +15237 - Lift Platform - [Use-Lift, null, null, null, null] +15238 - null - [null, null, null, null, null] +15239 - null - [null, null, null, null, null] +15240 - null - [null, null, null, null, null] +15241 - null - [null, null, null, null, null] +15242 - null - [null, null, null, null, null] +15243 - Crate - [Take-Beam, null, null, null, null] +15244 - Crate - [Take-Pulley-Beam, null, null, null, null] +15245 - Crate - [Take-Rope, null, null, null, null] +15246 - Rocks - [Mine, Prospect, hidden, null, null] +15247 - Rocks - [Mine, Prospect, hidden, null, null] +15248 - Rocks - [Mine, Prospect, hidden, null, null] +15249 - Rocks - [Mine, Prospect, hidden, null, null] +15250 - Rocks - [Mine, Prospect, hidden, null, null] +15251 - Rocks - [Mine, Prospect, hidden, null, null] +15252 - null - [null, null, null, null, null] +15253 - Rocks - [Mine, Prospect, hidden, null, null] +15254 - Rocks - [Mine, Prospect, hidden, null, null] +15255 - Rocks - [Mine, Prospect, hidden, null, null] +15256 - Treasure space - [null, null, null, null, Build] +15257 - Monster space - [null, null, null, null, Build] +15258 - Monster space 3 - [null, null, null, null, Build] +15259 - Decoration space - [null, null, null, null, Build] +15260 - Bed space - [null, null, null, null, Build] +15261 - Wardrobe space - [null, null, null, null, Build] +15262 - Dresser space - [null, null, null, null, Build] +15263 - Curtain space - [null, null, null, null, Build] +15264 - Rug space - [null, null, null, null, Build] +15265 - Rug space - [null, null, null, null, Build] +15266 - Rug space - [null, null, null, null, Build] +15267 - Fireplace space - [null, null, null, null, Build] +15268 - Clock space - [null, null, null, null, Build] +15269 - Icon space - [null, null, null, null, Build] +15270 - Altar space - [null, null, null, null, Build] +15271 - Lamp space - [null, null, null, null, Build] +15272 - Rug space - [null, null, null, null, Build] +15273 - Rug space - [null, null, null, null, Build] +15274 - Rug space - [null, null, null, null, Build] +15275 - Statue space - [null, null, null, null, Build] +15276 - Musical space - [null, null, null, null, Build] +15277 - Combat ring space - [null, null, null, null, Build] +15278 - Combat ring space - [null, null, null, null, Build] +15279 - Combat ring space - [null, null, null, null, Build] +15280 - Combat ring space - [null, null, null, null, Build] +15281 - Combat ring space - [null, null, null, null, Build] +15282 - Combat ring space - [null, null, null, null, Build] +15283 - Combat ring space - [null, null, null, null, Build] +15284 - Combat ring space - [null, null, null, null, Build] +15285 - Combat ring space - [null, null, null, null, Build] +15286 - Combat ring space - [null, null, null, null, Build] +15287 - Combat ring space - [null, null, null, null, Build] +15288 - Combat ring space - [null, null, null, null, Build] +15289 - Combat ring space - [null, null, null, null, Build] +15290 - Combat ring space - [null, null, null, null, Build] +15291 - Combat ring space - [null, null, null, null, Build] +15292 - Combat ring space - [null, null, null, null, Build] +15293 - Combat ring space - [null, null, null, null, Build] +15294 - Combat ring space - [null, null, null, null, Build] +15295 - Combat ring space - [null, null, null, null, Build] +15296 - Storage space - [null, null, null, null, Build] +15297 - Decoration space - [null, null, null, null, Build] +15298 - Table space - [null, null, null, null, Build] +15299 - Seating space - [null, null, null, null, Build] +15300 - Seating space - [null, null, null, null, Build] +15301 - Fireplace space - [null, null, null, null, Build] +15302 - Curtain space - [null, null, null, null, Build] +15303 - Decoration space - [null, null, null, null, Build] +15304 - Bell pull space - [null, null, null, null, Build] +15305 - Door hotspot - [null, null, null, null, Build] +15306 - Door hotspot - [null, null, null, null, Build] +15307 - Door hotspot - [null, null, null, null, Build] +15308 - Door hotspot - [null, null, null, null, Build] +15309 - Door hotspot - [null, null, null, null, Build] +15310 - Door hotspot - [null, null, null, null, Build] +15311 - Door hotspot - [null, null, null, null, Build] +15312 - Door hotspot - [null, null, null, null, Build] +15313 - Door hotspot - [null, null, null, null, Build] +15314 - Door hotspot - [null, null, null, null, Build] +15315 - Door hotspot - [null, null, null, null, Build] +15316 - Door hotspot - [null, null, null, null, Build] +15317 - Door hotspot - [null, null, null, null, Build] +15318 - Door hotspot - [null, null, null, null, Build] +15319 - Door hotspot - [null, null, null, null, Build] +15320 - Door hotspot - [null, null, null, null, Build] +15321 - Door hotspot - [null, null, null, null, Build] +15322 - Door hotspot - [null, null, null, null, Build] +15323 - Guard space - [null, null, null, null, Build] +15324 - Trap space - [null, null, null, null, Build] +15325 - Trap space - [null, null, null, null, Build] +15326 - Door space - [null, null, null, null, Build] +15327 - Door space - [null, null, null, null, Build] +15328 - Door space - [null, null, null, null, Build] +15329 - Door space - [null, null, null, null, Build] +15330 - Lighting space - [null, null, null, null, Build] +15331 - Decoration space - [null, null, null, null, Build] +15332 - Rug space - [null, null, null, null, Build] +15333 - Rug space - [null, null, null, null, Build] +15334 - Rug space - [null, null, null, null, Build] +15335 - Rug space - [null, null, null, null, Build] +15336 - Guard space - [null, null, null, null, Build] +15337 - Guard space - [null, null, null, null, Build] +15338 - Door space - [null, null, null, null, Build] +15339 - Door space - [null, null, null, null, Build] +15340 - Lighting space - [null, null, null, null, Build] +15341 - Decoration space - [null, null, null, null, Build] +15342 - Game space - [null, null, null, null, Build] +15343 - Prize chest space - [null, null, null, null, Build] +15344 - Stone space - [null, null, null, null, Build] +15345 - Elemental balance space - [null, null, null, null, Build] +15346 - Ranging game space - [null, null, null, null, Build] +15347 - Floor space mid - [null, null, null, null, Build] +15348 - Floor space side - [null, null, null, null, Build] +15349 - Floor space corner - [null, null, null, null, Build] +15350 - Floor space - [null, null, null, null, Build] +15351 - Floor space - [null, null, null, null, Build] +15352 - Prison space - [null, null, null, null, Build] +15353 - Prison space - [null, null, null, null, Build] +15354 - Guard space - [null, null, null, null, Build] +15355 - Lighting space - [null, null, null, null, Build] +15356 - Ladder space - [null, null, null, null, Build] +15357 - Door space - [null, null, null, null, Build] +15358 - Door space - [null, null, null, null, Build] +15359 - Door space - [null, null, null, null, Build] +15360 - Door space - [null, null, null, null, Build] +15361 - Centrepiece space - [null, null, null, null, Build] +15362 - Big Tree space - [null, null, null, null, Build] +15363 - Tree space - [null, null, null, null, Build] +15364 - Big Plant space 1 - [null, null, null, null, Build] +15365 - Big Plant space 2 - [null, null, null, null, Build] +15366 - Small Plant space 1 - [null, null, null, null, Build] +15367 - Small Plant space 2 - [null, null, null, null, Build] +15368 - Centrepiece space - [null, null, null, null, Build] +15369 - Fencing - [null, null, null, null, Build] +15370 - Hedging - [null, null, null, null, Build] +15371 - Hedging - [null, null, null, null, Build] +15372 - Hedging - [null, null, null, null, Build] +15373 - Big plant - [null, null, null, null, Build] +15374 - Big plant 2 - [null, null, null, null, Build] +15375 - Small plant - [null, null, null, null, Build] +15376 - Small plant 2 - [null, null, null, null, Build] +15377 - Rug space - [null, null, null, null, Build] +15378 - Rug space - [null, null, null, null, Build] +15379 - Rug space - [null, null, null, null, Build] +15380 - Stair Space - [null, null, null, null, Build] +15381 - Stair Space - [null, null, null, null, Build] +15382 - Head trophy space - [null, null, null, null, Build] +15383 - Fishing trophy space - [null, null, null, null, Build] +15384 - Armour space - [null, null, null, null, Build] +15385 - Armour space - [null, null, null, null, Build] +15386 - Rune case space - [null, null, null, null, Build] +15387 - Rug space - [null, null, null, null, Build] +15388 - Rug space - [null, null, null, null, Build] +15389 - Rug space - [null, null, null, null, Build] +15390 - Stair Space - [null, null, null, null, Build] +15391 - Stair Space - [null, null, null, null, Build] +15392 - Portrait space - [null, null, null, null, Build] +15393 - Landscape space - [null, null, null, null, Build] +15394 - Guild trophy space - [null, null, null, null, Build] +15395 - Sword space - [null, null, null, null, Build] +15396 - Map space - [null, null, null, null, Build] +15397 - Bookcase space - [null, null, null, null, Build] +15398 - Stove space - [null, null, null, null, Build] +15399 - Shelf space - [null, null, null, null, Build] +15400 - Shelf space - [null, null, null, null, Build] +15401 - Barrel space - [null, null, null, null, Build] +15402 - Cat basket space - [null, null, null, null, Build] +15403 - Larder space - [null, null, null, null, Build] +15404 - Sink space - [null, null, null, null, Build] +15405 - Table space - [null, null, null, null, Build] +15406 - Portal space - [null, null, null, null, Build] +15407 - Portal space - [null, null, null, null, Build] +15408 - Portal space - [null, null, null, null, Build] +15409 - Centrepiece space - [null, null, null, null, Build] +15410 - Chair space - [null, null, null, null, Build] +15411 - Chair space - [null, null, null, null, Build] +15412 - Chair space - [null, null, null, null, Build] +15413 - Rug space - [null, null, null, null, Build] +15414 - Rug space - [null, null, null, null, Build] +15415 - Rug space - [null, null, null, null, Build] +15416 - Bookcase space - [null, null, null, null, Build] +15417 - Bookcase space - [null, null, null, null, Build] +15418 - Fireplace space - [null, null, null, null, Build] +15419 - Curtain space - [null, null, null, null, Build] +15420 - Lectern space - [null, null, null, null, Build] +15421 - Globe space - [null, null, null, null, Build] +15422 - Crystal ball space - [null, null, null, null, Build] +15423 - Wall chart space - [null, null, null, null, Build] +15424 - Telescope space - [null, null, null, null, Build] +15425 - Bookcase space - [null, null, null, null, Build] +15426 - Throne space - [null, null, null, null, Build] +15427 - Floor space - [null, null, null, null, Build] +15428 - Floor space - [null, null, null, null, Build] +15429 - Floor space - [null, null, null, null, Build] +15430 - Floor space - [null, null, null, null, Build] +15431 - Floor space - [null, null, null, null, Build] +15432 - Floor space - [null, null, null, null, Build] +15433 - Decoration space - [null, null, null, null, Build] +15434 - Decoration space - [null, null, null, null, Build] +15435 - Lever space - [null, null, null, null, Build] +15436 - Seating space - [null, null, null, null, Build] +15437 - Seating space - [null, null, null, null, Build] +15438 - Trapdoor space - [null, null, null, null, Build] +15439 - Workbench space - [null, null, null, null, Build] +15440 - Nothing - [null, null, null, null, Build] +15441 - Clockmaking space - [null, null, null, null, Build] +15442 - Nothing - [null, null, null, null, Build] +15443 - Tool space - [null, null, null, null, Build] +15444 - Tool space - [null, null, null, null, Build] +15445 - Tool space - [null, null, null, null, Build] +15446 - Tool space - [null, null, null, null, Build] +15447 - Tool space - [null, null, null, null, Build] +15448 - Repair space - [null, null, null, null, Build] +15449 - Nothing - [null, null, null, null, Build] +15450 - Heraldry space - [null, null, null, null, Build] +15451 - Doorway - [null, null, null, null, Carpent] +15452 - Wall - [null, null, null, null, null] +15453 - null - [null, null, null, null, null] +15454 - null - [null, null, null, null, null] +15455 - null - [null, null, null, null, null] +15456 - null - [null, null, null, null, null] +15457 - null - [null, null, null, null, null] +15458 - null - [null, null, null, null, null] +15459 - null - [null, null, null, null, null] +15460 - null - [null, null, null, null, null] +15461 - Bookcase - [null, null, null, null, null] +15462 - Chair - [null, null, null, null, null] +15463 - Hat stand - [null, null, null, null, null] +15464 - Picture - [null, null, null, null, null] +15465 - Display board - [null, null, null, null, null] +15466 - Stone crusher - [null, null, null, null, null] +15467 - Cleaning supplies - [null, null, null, null, null] +15468 - Power saw - [null, null, null, null, null] +15469 - Embalming tube - [null, null, null, null, null] +15470 - null - [null, null, null, null, null] +15471 - Fish bowl - [null, null, null, null, null] +15472 - Gloves and duster - [null, null, null, null, null] +15473 - Mahogany table - [null, null, null, null, null] +15474 - null - [null, null, null, null, null] +15475 - null - [null, null, null, null, null] +15476 - null - [null, null, null, null, null] +15477 - Portal - [Enter, null, null, null, null] +15478 - Portal - [Enter, null, null, null, null] +15479 - Portal - [Enter, null, null, null, null] +15480 - Portal - [Enter, null, null, null, null] +15481 - Portal - [Enter, null, null, null, null] +15482 - Portal - [Enter, null, null, null, null] +15483 - null - [null, null, null, null, null] +15484 - null - [Study, null, null, null, null] +15485 - null - [null, null, null, null, null] +15486 - Pigeon - [null, null, null, null, null] +15487 - Chimney - [null, null, null, null, null] +15488 - Tree trunk - [null, null, null, null, null] +15489 - Tree - [null, null, null, null, null] +15490 - Kalphite Queen - [null, null, null, null, null] +15491 - Rocks - [Mine, Prospect, hidden, null, null] +15492 - Rocks - [Mine, Prospect, hidden, null, null] +15493 - Rocks - [Mine, Prospect, hidden, null, null] +15494 - null - [null, null, null, null, null] +15495 - null - [null, null, null, null, null] +15496 - null - [null, null, null, null, null] +15497 - null - [null, null, null, null, null] +15498 - null - [null, null, null, null, null] +15499 - null - [null, null, null, null, null] +15500 - null - [null, null, null, null, null] +15501 - null - [null, null, null, null, null] +15502 - null - [null, null, null, null, null] +15503 - Rocks - [Mine, Prospect, hidden, null, null] +15504 - Rocks - [Mine, Prospect, hidden, null, null] +15505 - Rocks - [Mine, Prospect, hidden, null, null] +15506 - Wheat - [null, Pick, null, null, null] +15507 - Wheat - [null, Pick, null, null, null] +15508 - Wheat - [null, Pick, null, null, null] +15509 - null - [null, null, null, null, null] +15510 - Gate - [Open, null, null, null, null] +15511 - Gate - [Close, null, null, null, null] +15512 - Gate - [Open, null, null, null, null] +15513 - Gate - [Close, null, null, null, null] +15514 - Gate - [Open, null, null, null, null] +15515 - Gate - [Close, null, null, null, null] +15516 - Gate - [Open, null, null, null, null] +15517 - Gate - [Close, null, null, null, null] +15518 - Mouse hole - [null, null, null, null, null] +15519 - Mouse hole - [null, null, null, null, null] +15520 - null - [null, null, null, null, null] +15521 - Piano stool - [Sit-On, null, null, null, null] +15522 - Signpost - [Read, null, null, null, null] +15523 - Trapdoor - [Open, null, null, null, null] +15524 - Barrel - [null, null, null, null, null] +15525 - null - [null, null, null, null, null] +15526 - null - [null, null, null, null, null] +15527 - null - [null, null, null, null, null] +15528 - null - [null, null, null, null, null] +15529 - null - [null, null, null, null, null] +15530 - null - [null, null, null, null, null] +15531 - null - [null, null, null, null, null] +15532 - null - [null, null, null, null, null] +15533 - null - [null, null, null, null, null] +15534 - null - [null, null, null, null, null] +15535 - Door - [Close, null, null, null, null] +15536 - Door - [Open, null, null, null, null] +15537 - Drain - [null, null, null, null, null] +15538 - null - [null, null, null, null, null] +15539 - null - [null, null, null, null, null] +15540 - null - [null, null, null, null, null] +15541 - Bookcase - [Search, null, null, null, null] +15542 - Bookcase - [Search, null, null, null, null] +15543 - Bookcase - [Search, null, null, null, null] +15544 - Bookcase - [Search, null, null, null, null] +15545 - null - [null, null, null, null, null] +15546 - Oak chair - [null, null, null, null, null] +15547 - Clock - [null, null, null, null, null] +15548 - null - [null, null, null, null, null] +15549 - null - [null, null, null, null, null] +15550 - null - [null, null, null, null, null] +15551 - Desk - [null, null, null, null, null] +15552 - null - [null, null, null, null, null] +15553 - null - [null, null, null, null, null] +15554 - null - [null, null, null, null, null] +15555 - null - [null, null, null, null, null] +15556 - null - [null, null, null, null, null] +15557 - null - [null, null, null, null, null] +15558 - null - [null, null, null, null, null] +15559 - Painting - [null, null, null, null, null] +15560 - Painting - [null, null, null, null, null] +15561 - Dragon's head - [null, null, null, null, null] +15562 - Dragon's head - [null, null, null, null, null] +15563 - Dragon's head - [null, null, null, null, null] +15564 - Dragon's head - [null, null, null, null, null] +15565 - Dragon's head - [null, null, null, null, null] +15566 - Warning sign - [Read, null, null, null, null] +15567 - null - [null, null, null, null, null] +15568 - null - [null, null, null, null, null] +15569 - null - [null, null, null, null, null] +15570 - Rocks - [Mine, Prospect, hidden, null, null] +15571 - Rocks - [Mine, Prospect, hidden, null, null] +15572 - Rocks - [Mine, Prospect, hidden, null, null] +15573 - Rocks - [Mine, Prospect, hidden, null, null] +15574 - Rocks - [Mine, Prospect, hidden, null, null] +15575 - Rocks - [Mine, Prospect, hidden, null, null] +15576 - Rocks - [Mine, Prospect, hidden, null, null] +15577 - Rocks - [Mine, Prospect, hidden, null, null] +15578 - Rocks - [Mine, Prospect, hidden, null, null] +15579 - Rocks - [Mine, Prospect, hidden, null, null] +15580 - Rocks - [Mine, Prospect, hidden, null, null] +15581 - Rocks - [Mine, Prospect, hidden, null, null] +15582 - Rocks - [Mine, Prospect, hidden, null, null] +15583 - Rocks - [Mine, Prospect, hidden, null, null] +15584 - Rocks - [Mine, Prospect, hidden, null, null] +15585 - null - [null, null, null, null, null] +15586 - null - [null, null, null, null, null] +15587 - null - [null, null, null, null, null] +15588 - null - [null, null, null, null, null] +15589 - null - [null, null, null, null, null] +15590 - null - [null, null, null, null, null] +15591 - null - [null, null, null, null, null] +15592 - null - [null, null, null, null, null] +15593 - null - [null, null, null, null, null] +15594 - null - [null, null, null, null, null] +15595 - null - [null, null, null, null, null] +15596 - Dwarf remains - [Take, null, null, null, null] +15597 - null - [null, null, null, null, null] +15598 - Boxes - [Search, null, null, null, null] +15599 - Crate - [Search, null, null, null, null] +15600 - Crates - [Search, null, null, null, null] +15601 - Railing - [Inspect, null, null, null, null] +15602 - Railing - [null, null, null, null, null] +15603 - Railing - [null, null, null, null, null] +15604 - Gate - [Open, null, null, null, null] +15605 - Gate - [Open, null, null, null, null] +15606 - null - [null, null, null, null, null] +15607 - null - [null, null, null, null, null] +15608 - Statue of a warrior - [null, null, null, null, null] +15609 - Statue of a warrior - [null, null, null, null, null] +15610 - Statue of a king - [null, null, null, null, null] +15611 - Statue of a queen - [null, null, null, null, null] +15612 - Gnome statue - [null, null, null, null, null] +15613 - Statue of a king - [null, null, null, null, null] +15614 - null - [null, null, null, null, null] +15615 - null - [null, null, null, null, null] +15616 - Catapult - [null, null, null, null, null] +15617 - Catapult - [null, null, null, null, null] +15618 - Catapult - [null, null, null, null, null] +15619 - Catapult - [null, null, null, null, null] +15620 - Catapult - [null, null, null, null, null] +15621 - Magical Animator - [null, null, null, null, null] +15622 - null - [null, null, null, null, null] +15623 - null - [null, null, null, null, null] +15624 - Dummy - [Hit, null, null, null, null] +15625 - Dummy - [Hit, null, null, null, null] +15626 - Dummy - [Hit, null, null, null, null] +15627 - Dummy - [Hit, null, null, null, null] +15628 - Dummy - [Hit, null, null, null, null] +15629 - Dummy - [Hit, null, null, null, null] +15630 - Dummy - [Hit, null, null, null, null] +15631 - Hole - [null, null, null, null, null] +15632 - Hole - [null, null, null, null, null] +15633 - Hole - [null, null, null, null, null] +15634 - Hole - [null, null, null, null, null] +15635 - Hole - [null, null, null, null, null] +15636 - Hole - [null, null, null, null, null] +15637 - Hole - [null, null, null, null, null] +15638 - Staircase - [Climb-down, null, null, null, null] +15639 - null - [null, null, null, null, null] +15640 - null - [null, null, null, null, null] +15641 - Door - [Open, null, null, null, null] +15642 - Door - [Close, null, null, null, null] +15643 - null - [null, null, null, null, null] +15644 - Door - [Open, null, null, null, null] +15645 - Door - [Close, null, null, null, null] +15646 - null - [null, null, null, null, null] +15647 - Door - [Open, null, null, null, null] +15648 - Door - [Close, null, null, null, null] +15649 - null - [null, null, null, null, null] +15650 - Door - [Open, null, null, null, null] +15651 - Door - [Close, null, null, null, null] +15652 - null - [null, null, null, null, null] +15653 - Door - [Open, null, null, null, null] +15654 - Door - [Close, null, null, null, null] +15655 - null - [null, null, null, null, null] +15656 - Information Scroll - [View, null, null, null, null] +15657 - Information Scroll - [View, null, null, null, null] +15658 - Heavy door - [Open, null, null, null, null] +15659 - Heavy door - [null, null, null, null, null] +15660 - Heavy door - [Open, null, null, null, null] +15661 - Heavy door - [null, null, null, null, null] +15662 - Keg - [null, null, null, null, null] +15663 - Keg - [null, null, null, null, null] +15664 - Shot - [Throw, null, null, null, null] +15665 - Shot - [Throw, null, null, null, null] +15666 - null - [null, null, null, null, null] +15667 - null - [null, null, null, null, null] +15668 - Keg - [Pick-up, null, null, null, null] +15669 - null - [null, null, null, null, null] +15670 - null - [null, null, null, null, null] +15671 - null - [null, null, null, null, null] +15672 - null - [null, null, null, null, null] +15673 - null - [null, null, null, null, null] +15674 - Barrel - [null, null, null, null, null] +15675 - Barrel - [null, null, null, null, null] +15676 - Barrel - [null, null, null, null, null] +15677 - Bank table - [null, null, null, null, null] +15678 - Sink - [null, null, null, null, null] +15679 - Stool - [null, null, null, null, null] +15680 - Table - [null, null, null, null, null] +15681 - null - [null, null, null, null, null] +15682 - null - [null, null, null, null, null] +15683 - Bed - [null, null, null, null, null] +15684 - Table - [null, null, null, null, null] +15685 - Cooking shelves - [null, null, null, null, null] +15686 - Cooking shelves - [null, null, null, null, null] +15687 - null - [null, null, null, null, null] +15688 - null - [null, null, null, null, null] +15689 - null - [null, null, null, null, null] +15690 - Portrait - [null, null, null, null, null] +15691 - Painting - [null, null, null, null, null] +15692 - Crate - [null, null, null, null, null] +15693 - Crates - [null, null, null, null, null] +15694 - null - [null, null, null, null, null] +15695 - Crate - [Search, null, null, null, null] +15696 - Crate - [Search, null, null, null, null] +15697 - Crate - [null, null, null, null, null] +15698 - Crate - [null, null, null, null, null] +15699 - Box cart - [null, null, null, null, null] +15700 - Box cart - [null, null, null, null, null] +15701 - null - [null, null, null, null, null] +15702 - null - [null, null, null, null, null] +15703 - null - [null, null, null, null, null] +15704 - Crate - [Search, null, null, null, null] +15705 - Crate - [null, null, null, null, null] +15706 - Crate - [null, null, null, null, null] +15707 - Crate - [null, null, null, null, null] +15708 - null - [null, null, null, null, null] +15709 - Zanik - [null, null, null, null, null] +15710 - null - [null, null, null, null, null] +15711 - Zanik - [Inspect, null, null, null, null] +15712 - null - [null, null, null, null, null] +15713 - Drilling machine - [Smash, null, null, null, null] +15714 - Drilling machine - [null, null, null, null, null] +15715 - Broken drilling machine - [null, null, null, null, null] +15716 - null - [null, null, null, null, null] +15717 - null - [null, null, null, null, null] +15718 - null - [null, null, null, null, null] +15719 - Table - [null, null, null, null, null] +15720 - Crate - [Search, null, null, null, null] +15721 - Crate - [Search, null, null, null, null] +15722 - Small chest - [Open, null, null, null, null] +15723 - Small chest - [Open, null, null, null, null] +15724 - Small chest - [Open, null, null, null, null] +15725 - Small chest - [null, null, null, null, null] +15726 - Small chest - [Open, null, null, null, null] +15727 - Drip - [null, null, null, null, null] +15728 - Drips - [null, null, null, null, null] +15729 - null - [null, null, null, null, null] +15730 - null - [null, null, null, null, null] +15731 - Crack - [Squeeze-through, null, null, null, null] +15732 - Wall - [null, null, null, null, null] +15733 - Wall - [null, null, null, null, null] +15734 - null - [null, null, null, null, null] +15735 - null - [null, null, null, null, null] +15736 - null - [null, null, null, null, null] +15737 - null - [null, null, null, null, null] +15738 - null - [null, null, null, null, null] +15739 - null - [null, null, null, null, null] +15740 - null - [null, null, null, null, null] +15741 - null - [null, null, null, null, null] +15742 - null - [null, null, null, null, null] +15743 - null - [null, null, null, null, null] +15744 - null - [null, null, null, null, null] +15745 - null - [null, null, null, null, null] +15746 - Ladder - [Climb-up, null, null, null, null] +15747 - Ladder - [Climb-up, null, null, null, null] +15748 - Tunnel - [Squeeze-through, null, null, null, null] +15749 - Tunnel - [null, null, null, null, null] +15750 - Tunnel - [Squeeze-through, null, null, null, null] +15751 - Tunnel - [Unblock, null, null, null, null] +15752 - Trapdoor - [Open, null, null, null, null] +15753 - Trapdoor - [Go-down, null, null, null, null] +15754 - Rubble - [null, null, null, null, null] +15755 - Hidden trapdoor - [Open, Pick-lock, null, null, null] +15756 - Trapdoor - [Climb-down, null, null, null, null] +15757 - Large door - [Listen-at, null, null, null, null] +15758 - Large door - [Listen-at, null, null, null, null] +15759 - Door - [Open, null, null, Pick-lock, null] +15760 - Sack - [null, null, null, null, null] +15761 - Sack Pile - [null, null, null, null, null] +15762 - Sacks - [null, null, null, null, null] +15763 - null - [null, null, null, null, null] +15764 - null - [null, null, null, null, null] +15765 - null - [null, null, null, null, null] +15766 - null - [null, null, null, null, null] +15767 - Cave entrance - [Enter, null, null, null, null] +15768 - Cave entrance - [null, null, null, null, null] +15769 - Cave - [null, null, null, null, null] +15770 - Cave - [null, null, null, null, null] +15771 - Boulders - [null, null, null, null, null] +15772 - Boulders - [null, null, null, null, null] +15773 - Ruins - [null, null, null, null, null] +15774 - Slab - [null, null, null, null, null] +15775 - Stump - [null, null, null, null, null] +15776 - Tree - [null, null, null, null, null] +15777 - Tree - [null, null, null, null, null] +15778 - Tropical tree - [null, null, null, null, null] +15779 - Tropical tree - [null, null, null, null, null] +15780 - Tropical tree - [null, null, null, null, null] +15781 - Tropical tree - [null, null, null, null, null] +15782 - Tropical tree - [null, null, null, null, null] +15783 - Tropical tree - [null, null, null, null, null] +15784 - Tropical tree - [null, null, null, null, null] +15785 - null - [null, null, null, null, null] +15786 - null - [null, null, null, null, null] +15787 - null - [null, null, null, null, null] +15788 - Leaves - [null, null, null, null, null] +15789 - Leaves - [null, null, null, null, null] +15790 - Staircase - [Climb-up, null, null, null, null] +15791 - Staircase - [Climb-Down, null, null, null, null] +15792 - null - [null, null, null, null, null] +15793 - null - [null, null, null, null, null] +15794 - null - [null, null, null, null, null] +15795 - null - [null, null, null, null, null] +15796 - null - [null, null, null, null, null] +15797 - null - [null, null, null, null, null] +15798 - null - [null, null, null, null, null] +15799 - null - [null, null, null, null, null] +15800 - null - [null, null, null, null, null] +15801 - null - [null, null, null, null, null] +15802 - null - [null, null, null, null, null] +15803 - null - [null, null, null, null, null] +15804 - null - [null, null, null, null, null] +15805 - null - [null, null, null, null, null] +15806 - null - [null, null, null, null, null] +15807 - null - [null, null, null, null, null] +15808 - null - [null, null, null, null, null] +15809 - null - [null, null, null, null, null] +15810 - Hole - [Enter, null, null, null, null] +15811 - Cave - [Exit, null, null, null, null] +15812 - Cave - [Exit, null, null, null, null] +15813 - Boulders - [null, null, null, null, null] +15814 - Boulders - [null, null, null, null, null] +15815 - Mushrooms - [null, null, null, null, null] +15816 - Mushrooms - [null, null, null, null, null] +15817 - Rock - [null, null, null, null, null] +15818 - Small rock - [null, null, null, null, null] +15819 - Rock - [null, null, null, null, null] +15820 - null - [null, null, null, null, null] +15821 - null - [null, null, null, null, null] +15822 - null - [null, null, null, null, null] +15823 - null - [null, null, null, null, null] +15824 - null - [null, null, null, null, null] +15825 - null - [null, null, null, null, null] +15826 - null - [null, null, null, null, null] +15827 - null - [null, null, null, null, null] +15828 - null - [null, null, null, null, null] +15829 - null - [null, null, null, null, null] +15830 - null - [null, null, null, null, null] +15831 - null - [null, null, null, null, null] +15832 - null - [null, null, null, null, null] +15833 - null - [null, null, null, null, null] +15834 - null - [null, null, null, null, null] +15835 - null - [null, null, null, null, null] +15836 - null - [null, null, null, null, null] +15837 - Bamboo Pipes - [null, null, null, null, null] +15838 - Bamboo Pipes - [null, null, null, null, null] +15839 - Bamboo Pipes - [null, null, null, null, null] +15840 - Bamboo Pipes - [null, null, null, null, null] +15841 - Bamboo Pipes - [null, null, null, null, null] +15842 - Bamboo Pipes - [null, null, null, null, null] +15843 - Bamboo Pipes - [null, null, null, null, null] +15844 - Bamboo Pipes - [null, null, null, null, null] +15845 - Rum Crate - [null, null, null, null, null] +15846 - Red flowers - [Pick, null, null, null, null] +15847 - Hopper - [null, null, null, null, null] +15848 - Hopper - [null, null, null, null, null] +15849 - Hopper - [null, null, null, null, null] +15850 - Hopper - [null, null, null, null, null] +15851 - Hopper - [null, null, null, null, null] +15852 - Hopper - [null, null, null, null, null] +15853 - Hopper - [null, null, null, null, null] +15854 - Hopper - [null, null, null, null, null] +15855 - Bridge - [null, null, null, null, null] +15856 - Bridge - [null, null, null, null, null] +15857 - Bridge - [null, null, null, null, null] +15858 - Bridge - [null, null, null, null, null] +15859 - Bridge - [null, null, null, null, null] +15860 - Bridge - [null, null, null, null, null] +15861 - Bridge - [null, null, null, null, null] +15862 - Bridge - [null, null, null, null, null] +15863 - Bamboo Pipes - [null, null, null, null, null] +15864 - Bamboo Pipes - [null, null, null, null, null] +15865 - Bamboo Pipes - [null, null, null, null, null] +15866 - Bamboo Pipes - [null, null, null, null, null] +15867 - Bamboo Pipes - [null, null, null, null, null] +15868 - Bamboo Pipes - [null, null, null, null, null] +15869 - Bamboo Pipes - [null, null, null, null, null] +15870 - Bamboo Pipes - [null, null, null, null, null] +15871 - Rum Crate - [null, null, null, null, null] +15872 - Blue flowers - [Pick, null, null, null, null] +15873 - Hopper - [null, null, null, null, null] +15874 - Hopper - [null, null, null, null, null] +15875 - Hopper - [null, null, null, null, null] +15876 - Hopper - [null, null, null, null, null] +15877 - Hopper - [null, null, null, null, null] +15878 - Hopper - [null, null, null, null, null] +15879 - Hopper - [null, null, null, null, null] +15880 - Hopper - [null, null, null, null, null] +15881 - Bridge - [null, null, null, null, null] +15882 - Bridge - [null, null, null, null, null] +15883 - Bridge - [null, null, null, null, null] +15884 - Bridge - [null, null, null, null, null] +15885 - Bridge - [null, null, null, null, null] +15886 - Bridge - [null, null, null, null, null] +15887 - Bridge - [null, null, null, null, null] +15888 - Bridge - [null, null, null, null, null] +15889 - null - [null, null, null, null, null] +15890 - Bamboo Ladder - [Climb-up, null, null, null, null] +15891 - Bamboo Ladder - [null, null, null, null, null] +15892 - Bamboo Ladder - [Climb-down, null, null, null, null] +15893 - Bamboo Ladder - [Climb-up, null, null, null, null] +15894 - Bamboo Ladder - [null, null, null, null, null] +15895 - Bamboo Ladder - [Climb-down, null, null, null, null] +15896 - Copper Ladder - [Climb-up, null, null, null, null] +15897 - Copper Ladder - [null, null, null, null, null] +15898 - Copper Ladder - [Climb-down, null, null, null, null] +15899 - Copper Ladder - [Climb-up, null, null, null, null] +15900 - Copper Ladder - [null, null, null, null, null] +15901 - Copper Ladder - [Climb-down, null, null, null, null] +15902 - Posts - [null, null, null, null, null] +15903 - Boiler - [null, null, null, null, null] +15904 - Boiler - [null, null, null, null, null] +15905 - Boiler - [null, null, null, null, null] +15906 - Boiler - [null, null, null, null, null] +15907 - Boiler - [null, null, null, null, null] +15908 - Boiler - [null, null, null, null, null] +15909 - Boiler - [null, null, null, null, null] +15910 - Boiler - [null, null, null, null, null] +15911 - Boiler - [null, null, null, null, null] +15912 - Boiler - [null, null, null, null, null] +15913 - Boiler - [null, null, null, null, null] +15914 - Boiler - [null, null, null, null, null] +15915 - null - [null, null, null, null, null] +15916 - middle section - [null, null, null, null, null] +15917 - middle section - [null, null, null, null, null] +15918 - middle section - [null, null, null, null, null] +15919 - middle section - [null, null, null, null, null] +15920 - middle section - [null, null, null, null, null] +15921 - middle section - [null, null, null, null, null] +15922 - Bottle Machine - [null, null, null, null, null] +15923 - Bottle machine - [null, null, null, null, null] +15924 - Conveyor Belt - [null, null, null, null, null] +15925 - Conveyor Belt - [null, null, null, null, null] +15926 - Conveyor Belt - [Take-Rum, null, null, null, null] +15927 - Conveyor Belt - [null, null, null, null, null] +15928 - Steam Pump - [Pump, Vent, hidden, null, null] +15929 - Steam Pump - [hidden, null, hidden, null, null] +15930 - Steam_Pump - [hidden, null, hidden, null, null] +15931 - Log Store - [Take-Log, null, null, null, null] +15932 - Workbench - [null, null, null, null, null] +15933 - Workbench - [null, null, null, null, null] +15934 - Workbench - [Take-Tool, null, null, null, null] +15935 - Watering Hole - [null, null, null, null, null] +15936 - Water Pump - [null, null, null, null, null] +15937 - Water Pump - [null, null, null, null, null] +15938 - Water Pump - [null, null, null, null, null] +15939 - Red Flowers - [null, null, null, null, null] +15940 - Blue Flowers - [null, null, null, null, null] +15941 - Red Flowers - [null, null, null, null, null] +15942 - Blue Flowers - [null, null, null, null, null] +15943 - Bridge - [null, null, null, null, null] +15944 - Bridge - [null, null, null, null, null] +15945 - Bridge - [null, null, null, null, null] +15946 - Sweetgrub Mound - [null, null, null, null, null] +15947 - Sweetgrub Mound - [null, null, null, null, null] +15948 - Jungle Tree - [Cut-Down, null, hidden, null, null] +15949 - Jungle Tree - [null, null, null, null, null] +15950 - Jungle Tree - [null, null, null, null, null] +15951 - Jungle Tree - [Cut-Down, null, hidden, null, null] +15952 - Jungle Tree - [null, null, null, null, null] +15953 - Jungle Tree - [null, null, null, null, null] +15954 - Jungle Tree - [Cut-Down, null, hidden, null, null] +15955 - Jungle Tree - [null, null, null, null, null] +15956 - Jungle Tree - [null, null, null, null, null] +15957 - Tropical tree - [null, null, null, null, null] +15958 - Tropical tree - [null, null, null, null, null] +15959 - Tropical tree - [null, null, null, null, null] +15960 - Tropical leaves - [null, null, null, null, null] +15961 - Bitternut Tree - [null, null, null, null, null] +15962 - Bitternut Tree - [null, null, null, null, null] +15963 - Bitternut Tree - [null, null, null, null, null] +15964 - Bitternut Tree - [null, null, null, null, null] +15965 - Bitternut Tree - [null, null, null, null, null] +15966 - Bitternut Tree - [null, null, null, null, null] +15967 - Bitternut Tree - [null, null, null, null, null] +15968 - Bitternut Tree - [null, null, null, null, null] +15969 - Bitternut Tree - [null, null, null, null, null] +15970 - Scrapey Tree - [Cut-Down, null, hidden, null, null] +15971 - Scrapey Tree - [null, null, null, null, null] +15972 - null - [null, null, null, null, null] +15973 - null - [null, null, null, null, null] +15974 - null - [null, null, null, null, null] +15975 - null - [null, null, null, null, null] +15976 - null - [null, null, null, null, null] +15977 - null - [null, null, null, null, null] +15978 - Jungle Plant - [null, null, null, null, null] +15979 - null - [null, null, null, null, null] +15980 - null - [null, null, null, null, null] +15981 - Chair - [null, null, null, null, null] +15982 - Table - [null, null, null, null, null] +15983 - Kettle - [null, null, null, null, null] +15984 - Waiting Room Door - [Open, null, null, null, null] +15985 - Deposit Box - [Deposit, null, null, null, null] +15986 - Bitternut Sign - [null, null, null, null, null] +15987 - Sweetgrub Sign - [null, null, null, null, null] +15988 - Scrapey Bark Sign - [null, null, null, null, null] +15989 - Red Water Sign - [null, null, null, null, null] +15990 - Blue Water Sign - [null, null, null, null, null] +15991 - Water Sign - [null, null, null, null, null] +15992 - Sign - [null, null, null, null, null] +15993 - Sign - [null, null, null, null, null] +15994 - Sign - [null, null, null, null, null] +15995 - Stall - [null, null, null, null, null] +15996 - Portal - [Exit, null, null, null, null] +15997 - Pirate Flag - [null, null, null, null, null] +15998 - Pirate Flag - [null, null, null, null, null] +15999 - null - [null, null, null, null, null] +16000 - null - [null, null, null, null, null] +16001 - Crate - [null, null, null, null, null] +16002 - Crate - [null, null, null, null, null] +16003 - Barrel - [null, null, null, null, null] +16004 - null - [null, null, null, null, null] +16005 - Stepping log - [Jump-to, null, null, null, null] +16006 - Stepping log - [null, null, null, null, null] +16007 - Stepping log - [null, null, null, null, null] +16008 - null - [null, null, null, null, null] +16009 - null - [null, null, null, null, null] +16010 - Telescope - [Peer-Through, null, null, null, null] +16011 - null - [null, null, null, null, null] +16012 - Stepping Stone - [null, null, null, null, null] +16013 - Stepping stone - [null, null, null, null, null] +16014 - null - [null, null, null, null, null] +16015 - null - [null, null, null, null, null] +16016 - null - [null, null, null, null, null] +16017 - null - [null, null, null, null, null] +16018 - null - [null, null, null, null, null] +16019 - null - [null, null, null, null, null] +16020 - null - [null, null, null, null, null] +16021 - null - [null, null, null, null, null] +16022 - null - [null, null, null, null, null] +16023 - null - [null, null, null, null, null] +16024 - null - [null, null, null, null, null] +16025 - null - [Take-Rum, null, null, null, null] +16026 - null - [Take-Rum, null, null, null, null] +16027 - null - [null, null, null, null, null] +16028 - null - [null, null, null, null, null] +16029 - null - [null, null, null, null, null] +16030 - null - [null, null, null, null, null] +16031 - null - [null, null, null, null, null] +16032 - null - [null, null, null, null, null] +16033 - null - [null, null, null, null, null] +16034 - null - [null, null, null, null, null] +16035 - null - [null, null, null, null, null] +16036 - null - [null, null, null, null, null] +16037 - null - [null, null, null, null, null] +16038 - null - [null, null, null, null, null] +16039 - null - [null, null, null, null, null] +16040 - null - [null, null, null, null, null] +16041 - Sulphur vent - [null, null, null, null, null] +16042 - null - [null, null, null, null, null] +16043 - Portal of Death - [Open, null, null, null, null] +16044 - Portal of Death - [Open, null, null, null, null] +16045 - Portal of Death - [null, null, null, null, null] +16046 - Portal of Death - [null, null, null, null, null] +16047 - Cradle of Life - [Search, null, null, null, null] +16048 - Bone Chain - [Climb-up, null, null, null, null] +16049 - Boney ladder - [Climb-up, null, null, null, null] +16050 - Portal - [Use, null, null, null, null] +16051 - null - [null, null, null, null, null] +16052 - null - [null, null, null, null, null] +16053 - null - [null, null, null, null, null] +16054 - null - [null, null, null, null, null] +16055 - Skeleton - [null, null, null, null, null] +16056 - Skeleton - [null, null, null, null, null] +16057 - Skeleton - [null, null, null, null, null] +16058 - null - [null, null, null, null, null] +16059 - null - [null, null, null, null, null] +16060 - null - [null, null, null, null, null] +16061 - null - [null, null, null, null, null] +16062 - null - [null, null, null, null, null] +16063 - null - [null, null, null, null, null] +16064 - null - [null, null, null, null, null] +16065 - Rickety door - [Open, null, null, null, null] +16066 - Rickety door - [Open, null, null, null, null] +16067 - Rickety door - [null, null, null, null, null] +16068 - Rickety door - [null, null, null, null, null] +16069 - null - [null, null, null, null, null] +16070 - null - [null, null, null, null, null] +16071 - null - [null, null, null, null, null] +16072 - null - [null, null, null, null, null] +16073 - null - [null, null, null, null, null] +16074 - Skeleton - [null, null, null, null, null] +16075 - Skeleton - [null, null, null, null, null] +16076 - Skeleton - [null, null, null, null, null] +16077 - Grain of Plenty - [Search, null, null, null, null] +16078 - Rope - [Climb-up, null, null, null, null] +16079 - Rope - [Climb-down, null, null, null, null] +16080 - Ladder - [Climb-up, null, null, null, null] +16081 - Ladder - [Climb-down, null, null, null, null] +16082 - Portal - [Use, null, null, null, null] +16083 - Danger Sign - [null, null, null, null, null] +16084 - null - [null, null, null, null, null] +16085 - null - [null, null, null, null, null] +16086 - null - [null, null, null, null, null] +16087 - null - [null, null, null, null, null] +16088 - null - [null, null, null, null, null] +16089 - Oozing barrier - [Open, null, null, null, null] +16090 - Oozing barrier - [Open, null, null, null, null] +16091 - null - [null, null, null, null, null] +16092 - Oozing barrier - [null, null, null, null, null] +16093 - null - [null, null, null, null, null] +16094 - null - [null, null, null, null, null] +16095 - null - [null, null, null, null, null] +16096 - null - [null, null, null, null, null] +16097 - null - [null, null, null, null, null] +16098 - null - [null, null, null, null, null] +16099 - null - [null, null, null, null, null] +16100 - null - [null, null, null, null, null] +16101 - null - [null, null, null, null, null] +16102 - null - [null, null, null, null, null] +16103 - Skeleton - [null, null, null, null, null] +16104 - Skeleton - [null, null, null, null, null] +16105 - Skeleton - [null, null, null, null, null] +16106 - null - [null, null, null, null, null] +16107 - null - [null, null, null, null, null] +16108 - null - [null, null, null, null, null] +16109 - Stinking tendrils - [null, null, null, null, null] +16110 - Dripping tendrils - [null, null, null, null, null] +16111 - Tendrils - [null, null, null, null, null] +16112 - Goo covered vine - [Climb-up, null, null, null, null] +16113 - Goo covered vine - [Climb-down, null, null, null, null] +16114 - Dripping vine - [Climb-up, null, null, null, null] +16115 - Dripping vine - [Climb-down, null, null, null, null] +16116 - Portal - [Use, null, null, null, null] +16117 - Danger Sign - [null, null, null, null, null] +16118 - Box of Health - [Open, null, null, null, null] +16119 - null - [null, null, null, null, null] +16120 - null - [null, null, null, null, null] +16121 - null - [null, null, null, null, null] +16122 - null - [null, null, null, null, null] +16123 - Gate of War - [Open, null, null, null, null] +16124 - Gate of War - [Open, null, null, null, null] +16125 - null - [null, null, null, null, null] +16126 - Gate of War - [null, null, null, null, null] +16127 - Gate of War - [null, null, null, null, null] +16128 - null - [null, null, null, null, null] +16129 - null - [null, null, null, null, null] +16130 - null - [null, null, null, null, null] +16131 - null - [null, null, null, null, null] +16132 - null - [null, null, null, null, null] +16133 - null - [null, null, null, null, null] +16134 - null - [null, null, null, null, null] +16135 - Gift of Peace - [Open, null, null, null, null] +16136 - Rock - [null, null, null, null, null] +16137 - null - [null, null, null, null, null] +16138 - null - [null, null, null, null, null] +16139 - null - [null, null, null, null, null] +16140 - null - [null, null, null, null, null] +16141 - null - [null, null, null, null, null] +16142 - null - [null, null, null, null, null] +16143 - Skeleton - [null, null, null, null, null] +16144 - Skeleton - [null, null, null, null, null] +16145 - Skeleton - [null, null, null, null, null] +16146 - Spikey chain - [Climb-up, null, null, null, null] +16147 - Spikey chain - [Climb-down, null, null, null, null] +16148 - Ladder - [Climb-up, null, null, null, null] +16149 - Ladder - [Climb-down, null, null, null, null] +16150 - Portal - [Use, null, null, null, null] +16151 - Danger Sign - [null, null, null, null, null] +16152 - Dead Explorer - [Search, null, null, null, null] +16153 - Rock - [null, null, null, null, null] +16154 - Entrance - [Climb-down, null, null, null, null] +16155 - Beehive part - [null, null, null, null, null] +16156 - Beehive part - [null, null, null, null, null] +16157 - Beehive part - [null, null, null, null, null] +16158 - Beehive part - [null, null, null, null, null] +16159 - Interface surround - [null, null, null, null, null] +16160 - Button up - [null, null, null, null, null] +16161 - Button down - [null, null, null, null, null] +16162 - Button left - [null, null, null, null, null] +16163 - Button right - [null, null, null, null, null] +16164 - Button build - [null, null, null, null, null] +16165 - Beehive - [null, null, null, null, null] +16166 - null - [null, null, null, null, null] +16167 - null - [null, null, null, null, null] +16168 - null - [null, null, null, null, null] +16169 - Table - [null, null, null, null, null] +16170 - Table - [null, null, null, null, null] +16171 - null - [null, null, null, null, null] +16172 - Staircase - [Climb-down, null, null, null, null] +16173 - Staircase - [Climb-up, null, null, null, null] +16174 - Bone Chain - [Climb-down, null, null, null, null] +16175 - null - [null, null, null, null, null] +16176 - null - [null, null, null, null, null] +16177 - Waterlily - [null, null, null, null, null] +16178 - Waterlily - [null, null, null, null, null] +16179 - Waterlily - [null, null, null, null, null] +16180 - null - [null, null, null, null, null] +16181 - Fairy ring - [Use, null, null, null, null] +16182 - null - [null, null, null, null, null] +16183 - null - [null, null, null, null, null] +16184 - Fairy ring - [Use, null, null, null, null] +16185 - null - [null, null, null, null, null] +16186 - null - [null, null, null, null, null] +16187 - Cloud bank - [Enter-cloud, null, null, null, null] +16188 - null - [null, null, null, null, null] +16189 - Cloud bank - [Enter-cloud, null, null, null, null] +16190 - Lightning - [null, null, null, null, null] +16191 - Lightning - [null, null, null, null, null] +16192 - null - [null, null, null, null, null] +16193 - null - [null, null, null, null, null] +16194 - null - [null, null, null, null, null] +16195 - null - [null, null, null, null, null] +16196 - null - [null, null, null, null, null] +16197 - null - [null, null, null, null, null] +16198 - Lifeless Matter - [null, null, null, null, null] +16199 - Lifeless Matter - [null, null, null, null, null] +16200 - null - [null, null, null, null, null] +16201 - null - [null, null, null, null, null] +16202 - null - [null, null, null, null, null] +16203 - null - [null, null, null, null, null] +16204 - null - [null, null, null, null, null] +16205 - null - [null, null, null, null, null] +16206 - null - [null, null, null, null, null] +16207 - null - [null, null, null, null, null] +16208 - null - [null, null, null, null, null] +16209 - null - [null, null, null, null, null] +16210 - null - [null, null, null, null, null] +16211 - null - [null, null, null, null, null] +16212 - null - [null, null, null, null, null] +16213 - Fairy workbench - [Search, null, null, null, null] +16214 - null - [null, null, null, null, null] +16215 - Fairy workbench - [Search, null, null, null, null] +16216 - null - [null, null, null, null, null] +16217 - Potion shelves - [Search, null, null, null, null] +16218 - null - [null, null, null, null, null] +16219 - Potion shelves - [Search, null, null, null, null] +16220 - null - [null, null, null, null, null] +16221 - Potion shelf - [Search, null, null, null, null] +16222 - null - [null, null, null, null, null] +16223 - Potion shelf - [Search, null, null, null, null] +16224 - Healing certificate - [Take, null, null, null, null] +16225 - null - [null, null, null, null, null] +16226 - null - [null, null, null, null, null] +16227 - null - [null, null, null, null, null] +16228 - null - [null, null, null, null, null] +16229 - null - [null, null, null, null, null] +16230 - null - [null, null, null, null, null] +16231 - null - [null, null, null, null, null] +16232 - null - [null, null, null, null, null] +16233 - null - [null, null, null, null, null] +16234 - Hurt fairy - [null, null, null, null, null] +16235 - Injured fairy - [null, null, null, null, null] +16236 - Wounded fairy - [null, null, null, null, null] +16237 - Hurt fairy - [null, null, null, null, null] +16238 - Stretcher - [null, null, null, null, null] +16239 - First aid box - [null, null, null, null, null] +16240 - Crutch - [null, null, null, null, null] +16241 - Crutch - [null, null, null, null, null] +16242 - Crutch - [null, null, null, null, null] +16243 - null - [null, null, null, null, null] +16244 - Medical table - [null, null, null, null, null] +16245 - Map table - [null, null, null, null, null] +16246 - Stool - [null, null, null, null, null] +16247 - Wall map - [null, null, null, null, null] +16248 - Crate of wands - [null, null, null, null, null] +16249 - Crate - [null, null, null, null, null] +16250 - Crate - [Search, null, null, null, null] +16251 - Crates - [Search, null, null, null, null] +16252 - Crate - [Search, null, null, null, null] +16253 - Barrel - [null, null, null, null, null] +16254 - Tactical map frame - [null, null, null, null, null] +16255 - null - [null, null, null, null, null] +16256 - null - [null, null, null, null, null] +16257 - null - [null, null, null, null, null] +16258 - null - [null, null, null, null, null] +16259 - null - [null, null, null, null, null] +16260 - Stalagmite - [null, null, null, null, null] +16261 - Stalagmite - [null, null, null, null, null] +16262 - Stalagmite - [null, null, null, null, null] +16263 - Stalagmite - [null, null, null, null, null] +16264 - Tree - [Chop-down, null, null, null, null] +16265 - Tree - [Chop-down, null, null, null, null] +16266 - Tree Stump - [null, null, null, null, null] +16267 - Plant - [null, null, null, null, null] +16268 - Plant - [null, null, null, null, null] +16269 - Plant - [null, null, null, null, null] +16270 - Plant - [null, null, null, null, null] +16271 - null - [null, null, null, null, null] +16272 - null - [null, null, null, null, null] +16273 - null - [null, null, null, null, null] +16274 - null - [null, null, null, null, null] +16275 - null - [null, null, null, null, null] +16276 - null - [null, null, null, null, null] +16277 - null - [null, null, null, null, null] +16278 - null - [null, null, null, null, null] +16279 - null - [null, null, null, null, null] +16280 - null - [null, null, null, null, null] +16281 - null - [null, null, null, null, null] +16282 - null - [null, null, null, null, null] +16283 - Large rock - [null, null, null, null, null] +16284 - Large rock - [null, null, null, null, null] +16285 - null - [null, null, null, null, null] +16286 - null - [null, null, null, null, null] +16287 - null - [null, null, null, null, null] +16288 - null - [null, null, null, null, null] +16289 - null - [null, null, null, null, null] +16290 - null - [null, null, null, null, null] +16291 - null - [null, null, null, null, null] +16292 - null - [null, null, null, null, null] +16293 - null - [null, null, null, null, null] +16294 - null - [null, null, null, null, null] +16295 - null - [null, null, null, null, null] +16296 - null - [null, null, null, null, null] +16297 - null - [null, null, null, null, null] +16298 - null - [null, null, null, null, null] +16299 - null - [null, null, null, null, null] +16300 - null - [null, null, null, null, null] +16301 - null - [null, null, null, null, null] +16302 - Waterfall - [null, null, null, null, null] +16303 - Small rock - [null, null, null, null, null] +16304 - Stretcher - [null, null, null, null, null] +16305 - Fairy Queen - [null, null, null, null, null] +16306 - Fairy Queen - [null, null, null, null, null] +16307 - Rune temple sign - [Read, null, null, null, null] +16308 - Cave entrance - [Enter, null, null, null, null] +16309 - Cave entrance - [Enter, null, null, null, null] +16310 - null - [null, null, null, null, null] +16311 - null - [null, null, null, null, null] +16312 - null - [null, null, null, null, null] +16313 - null - [null, null, null, null, null] +16314 - null - [null, null, null, null, null] +16315 - null - [null, null, null, null, null] +16316 - null - [null, null, null, null, null] +16317 - null - [null, null, null, null, null] +16318 - null - [null, null, null, null, null] +16319 - null - [null, null, null, null, null] +16320 - null - [null, null, null, null, null] +16321 - null - [null, null, null, null, null] +16322 - null - [null, null, null, null, null] +16323 - null - [null, null, null, null, null] +16324 - null - [null, null, null, null, null] +16325 - null - [null, null, null, null, null] +16326 - null - [null, null, null, null, null] +16327 - null - [null, null, null, null, null] +16328 - null - [null, null, null, null, null] +16329 - null - [null, null, null, null, null] +16330 - null - [null, null, null, null, null] +16331 - null - [null, null, null, null, null] +16332 - null - [null, null, null, null, null] +16333 - null - [null, null, null, null, null] +16334 - null - [null, null, null, null, null] +16335 - null - [null, null, null, null, null] +16336 - null - [null, null, null, null, null] +16337 - null - [null, null, null, null, null] +16338 - null - [null, null, null, null, null] +16339 - null - [null, null, null, null, null] +16340 - null - [null, null, null, null, null] +16341 - null - [null, null, null, null, null] +16342 - null - [null, null, null, null, null] +16343 - null - [null, null, null, null, null] +16344 - null - [null, null, null, null, null] +16345 - null - [null, null, null, null, null] +16346 - null - [null, null, null, null, null] +16347 - null - [null, null, null, null, null] +16348 - null - [null, null, null, null, null] +16349 - null - [null, null, null, null, null] +16350 - null - [null, null, null, null, null] +16351 - null - [null, null, null, null, null] +16352 - null - [null, null, null, null, null] +16353 - null - [null, null, null, null, null] +16354 - null - [null, null, null, null, null] +16355 - null - [null, null, null, null, null] +16356 - null - [null, null, null, null, null] +16357 - null - [null, null, null, null, null] +16358 - null - [null, null, null, null, null] +16359 - null - [null, null, null, null, null] +16360 - null - [null, null, null, null, null] +16361 - null - [null, null, null, null, null] +16362 - null - [null, null, null, null, null] +16363 - null - [null, null, null, null, null] +16364 - null - [null, null, null, null, null] +16365 - null - [null, null, null, null, null] +16366 - null - [null, null, null, null, null] +16367 - null - [null, null, null, null, null] +16368 - null - [null, null, null, null, null] +16369 - null - [null, null, null, null, null] +16370 - null - [null, null, null, null, null] +16371 - null - [null, null, null, null, null] +16372 - null - [null, null, null, null, null] +16373 - null - [null, null, null, null, null] +16374 - Potion shelves - [null, null, null, null, null] +16375 - Potion shelves - [null, null, null, null, null] +16376 - Potion shelf - [null, null, null, null, null] +16377 - Potion shelf - [null, null, null, null, null] +16378 - Healing certificate - [Examine, null, null, null, null] +16379 - Healing certificate - [Examine, null, null, null, null] +16380 - null - [null, null, null, null, null] +16381 - null - [null, null, null, null, null] +16382 - null - [null, null, null, null, null] +16383 - null - [null, null, null, null, null] +16384 - null - [null, null, null, null, null] +16385 - null - [null, null, null, null, null] +16386 - null - [null, null, null, null, null] +16387 - null - [null, null, null, null, null] +16388 - null - [null, null, null, null, null] +16389 - null - [null, null, null, null, null] +16390 - null - [null, null, null, null, null] +16391 - null - [null, null, null, null, null] +16392 - null - [null, null, null, null, null] +16393 - null - [null, null, null, null, null] +16394 - null - [null, null, null, null, null] +16395 - null - [null, null, null, null, null] +16396 - null - [null, null, null, null, null] +16397 - null - [null, null, null, null, null] +16398 - null - [null, null, null, null, null] +16399 - null - [null, null, null, null, null] +16400 - null - [null, null, null, null, null] +16401 - null - [null, null, null, null, null] +16402 - null - [null, null, null, null, null] +16403 - null - [null, null, null, null, null] +16404 - null - [null, null, null, null, null] +16405 - null - [null, null, null, null, null] +16406 - null - [null, null, null, null, null] +16407 - null - [null, null, null, null, null] +16408 - null - [null, null, null, null, null] +16409 - null - [null, null, null, null, null] +16410 - null - [null, null, null, null, null] +16411 - null - [null, null, null, null, null] +16412 - null - [null, null, null, null, null] +16413 - null - [null, null, null, null, null] +16414 - null - [null, null, null, null, null] +16415 - null - [null, null, null, null, null] +16416 - null - [null, null, null, null, null] +16417 - null - [null, null, null, null, null] +16418 - null - [null, null, null, null, null] +16419 - null - [null, null, null, null, null] +16420 - null - [null, null, null, null, null] +16421 - null - [null, null, null, null, null] +16422 - null - [null, null, null, null, null] +16423 - null - [null, null, null, null, null] +16424 - null - [null, null, null, null, null] +16425 - null - [null, null, null, null, null] +16426 - null - [null, null, null, null, null] +16427 - null - [null, null, null, null, null] +16428 - null - [null, null, null, null, null] +16429 - null - [null, null, null, null, null] +16430 - null - [null, null, null, null, null] +16431 - null - [null, null, null, null, null] +16432 - null - [null, null, null, null, null] +16433 - null - [null, null, null, null, null] +16434 - null - [null, null, null, null, null] +16435 - null - [null, null, null, null, null] +16436 - null - [null, null, null, null, null] +16437 - null - [null, null, null, null, null] +16438 - null - [null, null, null, null, null] +16439 - null - [null, null, null, null, null] +16440 - null - [null, null, null, null, null] +16441 - null - [null, null, null, null, null] +16442 - null - [null, null, null, null, null] +16443 - null - [null, null, null, null, null] +16444 - null - [null, null, null, null, null] +16445 - null - [null, null, null, null, null] +16446 - null - [null, null, null, null, null] +16447 - null - [null, null, null, null, null] +16448 - null - [null, null, null, null, null] +16449 - null - [null, null, null, null, null] +16450 - Ladder - [Climb-up, null, null, null, null] +16451 - null - [null, null, null, null, null] +16452 - null - [null, null, null, null, null] +16453 - null - [null, null, null, null, null] +16454 - null - [null, null, null, null, null] +16455 - null - [null, null, null, null, null] +16456 - null - [null, null, null, null, null] +16457 - null - [null, null, null, null, null] +16458 - Tomb Door - [Leave Tomb, null, null, null, null] +16459 - Tomb Door - [Leave Tomb, null, null, null, null] +16460 - null - [null, null, null, null, null] +16461 - null - [null, null, null, null, null] +16462 - null - [null, null, null, null, null] +16463 - null - [null, null, null, null, null] +16464 - null - [null, null, null, null, null] +16465 - null - [null, null, null, null, null] +16466 - null - [null, null, null, null, null] +16467 - null - [null, null, null, null, null] +16468 - null - [null, null, null, null, null] +16469 - null - [null, null, null, null, null] +16470 - null - [null, null, null, null, null] +16471 - null - [null, null, null, null, null] +16472 - null - [null, null, null, null, null] +16473 - Grand Gold Chest - [Search, null, null, null, null] +16474 - Opened gold chest - [null, null, null, null, null] +16475 - Tomb Door - [Pick-lock, null, null, null, null] +16476 - Tomb Door - [Enter, null, null, null, null] +16477 - null - [null, null, null, null, null] +16478 - null - [null, null, null, null, null] +16479 - null - [null, null, null, null, null] +16480 - Bust - [null, null, null, null, null] +16481 - Bust - [null, null, null, null, null] +16482 - Obelisk - [null, null, null, null, null] +16483 - An anonymous looking door - [null, null, null, null, null] +16484 - An anonymous looking door - [Search, null, null, null, null] +16485 - An anonymous looking door - [Search, null, null, null, null] +16486 - An anonymous looking door - [null, null, null, null, null] +16487 - An anonymous looking door - [Search, null, null, null, null] +16488 - An anonymous looking door - [Search, null, null, null, null] +16489 - An anonymous looking door - [null, null, null, null, null] +16490 - An anonymous looking door - [Search, null, null, null, null] +16491 - An anonymous looking door - [Search, null, null, null, null] +16492 - An anonymous looking door - [null, null, null, null, null] +16493 - An anonymous looking door - [Search, null, null, null, null] +16494 - An anonymous looking door - [Enter, null, null, null, null] +16495 - Sarcophagus - [Open, null, null, null, null] +16496 - Sarcophagus - [Search, null, null, null, null] +16497 - Sarcophagus - [null, null, null, null, null] +16498 - Sarcophagus - [null, null, null, null, null] +16499 - Sarcophagus - [null, null, null, null, null] +16500 - Sarcophagus - [null, null, null, null, null] +16501 - Urn - [Search, Check for Snakes, null, null, null] +16502 - Urn - [Search, Check for Snakes, null, null, null] +16503 - Urn - [Search, Check for Snakes, null, null, null] +16504 - Urn - [null, null, null, null, null] +16505 - Urn - [Search, null, null, null, null] +16506 - Urn - [Search, null, null, null, null] +16507 - Urn - [Search, null, null, null, null] +16508 - Urn - [null, null, null, null, null] +16509 - Urn - [Search, null, Charm Snake, null, null] +16510 - Urn - [Search, null, Charm Snake, null, null] +16511 - Urn - [Search, null, Charm Snake, null, null] +16512 - Urn - [Search, null, Charm Snake, null, null] +16513 - Urn - [Search, null, null, null, null] +16514 - Urn - [Search, null, null, null, null] +16515 - Urn - [Search, null, null, null, null] +16516 - Urn - [Search, null, null, null, null] +16517 - Speartrap - [Pass, null, null, null, null] +16518 - null - [null, null, null, null, null] +16519 - null - [null, null, null, null, null] +16520 - null - [null, null, null, null, null] +16521 - null - [null, null, null, null, null] +16522 - null - [null, null, null, null, null] +16523 - null - [null, null, null, null, null] +16524 - null - [null, null, null, null, null] +16525 - null - [null, null, null, null, null] +16526 - null - [null, null, null, null, null] +16527 - null - [null, null, null, null, null] +16528 - null - [null, null, null, null, null] +16529 - null - [null, null, null, null, null] +16530 - null - [null, null, null, null, null] +16531 - null - [null, null, null, null, null] +16532 - null - [null, null, null, null, null] +16533 - null - [null, null, null, null, null] +16534 - null - [null, null, null, null, null] +16535 - Climbing rocks - [Climb, null, null, null, null] +16536 - Climbing rocks - [Climb, null, null, null, null] +16537 - null - [null, null, null, null, null] +16538 - null - [null, null, null, null, null] +16539 - null - [null, null, null, null, null] +16540 - null - [null, null, null, null, null] +16541 - null - [null, null, null, null, null] +16542 - null - [null, null, null, null, null] +16543 - null - [null, null, null, null, null] +16544 - null - [null, null, null, null, null] +16545 - null - [null, null, null, null, null] +16546 - null - [null, null, null, null, null] +16547 - null - [null, null, null, null, null] +16548 - null - [null, null, null, null, null] +16549 - null - [null, null, null, null, null] +16550 - null - [null, null, null, null, null] +16551 - null - [null, null, null, null, null] +16552 - null - [null, null, null, null, null] +16553 - null - [null, null, null, null, null] +16554 - null - [null, null, null, null, null] +16555 - null - [null, null, null, null, null] +16556 - Ladder - [Climb-down, null, null, null, null] +16557 - Ladder - [null, null, null, null, null] +16558 - Changing Curtain - [null, null, null, null, null] +16559 - Crate - [Search, null, null, null, null] +16560 - Crate - [Search, null, null, null, null] +16561 - Crate - [Search, null, null, null, null] +16562 - Table - [null, null, null, null, null] +16563 - null - [null, null, null, null, null] +16564 - Crate - [Search, null, null, null, null] +16565 - Crate - [Search, null, null, null, null] +16566 - Barrel - [null, null, null, null, null] +16567 - null - [null, null, null, null, null] +16568 - Standard - [null, null, null, null, null] +16569 - Standard - [null, null, null, null, null] +16570 - null - [null, null, null, null, null] +16571 - null - [null, null, null, null, null] +16572 - null - [null, null, null, null, null] +16573 - Timber defence - [null, null, null, null, null] +16574 - null - [null, null, null, null, null] +16575 - null - [null, null, null, null, null] +16576 - Rocks - [Mine, Prospect, hidden, null, null] +16577 - Rocks - [Mine, Prospect, hidden, null, null] +16578 - Rocks - [Mine, Prospect, hidden, null, null] +16579 - Rocks - [Mine, Prospect, hidden, null, null] +16580 - Rocks - [Mine, Prospect, hidden, null, null] +16581 - Rocks - [Mine, Prospect, hidden, null, null] +16582 - Rocks - [Mine, Prospect, hidden, null, null] +16583 - Rocks - [Mine, Prospect, hidden, null, null] +16584 - Rocks - [Mine, Prospect, hidden, null, null] +16585 - Log pile - [Deposit, null, null, null, null] +16586 - Log pile - [Deposit, null, null, null, null] +16587 - Log pile - [Deposit, null, null, null, null] +16588 - Log pile - [Deposit, null, null, null, null] +16589 - Log pile - [Deposit, null, null, null, null] +16590 - Log pile - [Deposit, null, null, null, null] +16591 - Log pile - [Deposit, null, null, null, null] +16592 - Log pile - [Deposit, null, null, null, null] +16593 - Log pile - [Deposit, null, null, null, null] +16594 - Log pile - [Deposit, null, null, null, null] +16595 - null - [null, null, null, null, null] +16596 - null - [null, null, null, null, null] +16597 - null - [null, null, null, null, null] +16598 - Dream puff - [null, null, null, null, null] +16599 - My life - [Read, null, null, null, null] +16600 - Hurdle - [Jump-over, null, null, null, null] +16601 - Note - [null, null, null, null, null] +16602 - Note - [null, null, null, null, null] +16603 - null - [null, null, null, null, null] +16604 - Dream tree - [Chop, null, null, null, null] +16605 - Dream Tree stump - [null, null, null, null, null] +16606 - null - [null, null, null, null, null] +16607 - null - [null, null, null, null, null] +16608 - null - [null, null, null, null, null] +16609 - null - [null, null, null, null, null] +16610 - null - [null, null, null, null, null] +16611 - null - [null, null, null, null, null] +16612 - null - [null, null, null, null, null] +16613 - null - [null, null, null, null, null] +16614 - null - [null, null, null, null, null] +16615 - null - [null, null, null, null, null] +16616 - null - [null, null, null, null, null] +16617 - null - [null, null, null, null, null] +16618 - null - [null, null, null, null, null] +16619 - Zero - [Press, null, null, null, null] +16620 - One - [Press, null, null, null, null] +16621 - Two - [Press, null, null, null, null] +16622 - Three - [Press, null, null, null, null] +16623 - Four - [Press, null, null, null, null] +16624 - Five - [Press, null, null, null, null] +16625 - Six - [Press, null, null, null, null] +16626 - Seven - [Press, null, null, null, null] +16627 - Eight - [Press, null, null, null, null] +16628 - Nine - [Press, null, null, null, null] +16629 - null - [null, null, null, null, null] +16630 - null - [null, null, null, null, null] +16631 - null - [null, null, null, null, null] +16632 - Platform - [Step-on, null, null, null, null] +16633 - Platform - [Step-on, null, null, null, null] +16634 - Platform - [Step-on, null, null, null, null] +16635 - Platform - [Step-on, null, null, null, null] +16636 - Platform - [Step-on, null, null, null, null] +16637 - Platform - [Step-on, null, null, null, null] +16638 - Dream puff - [Jump-to, null, null, null, null] +16639 - Windswept Tree - [null, null, null, null, null] +16640 - Ladder - [Climb-up, null, null, null, null] +16641 - Ladder - [Climb-down, null, null, null, null] +16642 - null - [null, null, null, null, null] +16643 - Water Source - [null, null, null, null, null] +16644 - null - [null, null, null, null, null] +16645 - null - [null, null, null, null, null] +16646 - null - [null, null, null, null, null] +16647 - null - [null, null, null, null, null] +16648 - null - [null, null, null, null, null] +16649 - null - [null, null, null, null, null] +16650 - null - [null, null, null, null, null] +16651 - null - [null, null, null, null, null] +16652 - null - [null, null, null, null, null] +16653 - null - [null, null, null, null, null] +16654 - null - [null, null, null, null, null] +16655 - null - [null, null, null, null, null] +16656 - null - [null, null, null, null, null] +16657 - null - [null, null, null, null, null] +16658 - null - [null, null, null, null, null] +16659 - null - [null, null, null, null, null] +16660 - null - [null, null, null, null, null] +16661 - null - [null, null, null, null, null] +16662 - null - [null, null, null, null, null] +16663 - null - [null, null, null, null, null] +16664 - null - [null, null, null, null, null] +16665 - null - [null, null, null, null, null] +16666 - null - [null, null, null, null, null] +16667 - null - [null, null, null, null, null] +16668 - null - [null, null, null, null, null] +16669 - null - [null, null, null, null, null] +16670 - null - [null, null, null, null, null] +16671 - null - [null, null, null, null, null] +16672 - null - [null, null, null, null, null] +16673 - null - [null, null, null, null, null] +16674 - null - [null, null, null, null, null] +16675 - null - [null, null, null, null, null] +16676 - null - [null, null, null, null, null] +16677 - null - [null, null, null, null, null] +16678 - null - [null, null, null, null, null] +16679 - Stalagmites - [Mine, null, null, null, null] +16680 - Stalagmite - [Mine, null, null, null, null] +16681 - null - [null, null, null, null, null] +16682 - null - [null, null, null, null, null] +16683 - null - [null, null, null, null, null] +16684 - Rock - [Mine, Prospect, hidden, null, null] +16685 - null - [null, null, null, null, null] +16686 - Portal - [Use, null, null, null, null] +16687 - Rune essence - [Mine, Prospect, hidden, null, null] +16688 - Tar Barrel - [null, null, null, null, null] +16689 - Tanning Barrel - [null, null, null, null, null] +16690 - null - [null, null, null, null, null] +16691 - Hat rack - [null, null, null, null, null] +16692 - Hat rack - [null, null, null, null, null] +16693 - Clothes rack - [null, null, null, null, null] +16694 - null - [null, null, null, null, null] +16695 - Bank chest - [null, null, null, null, null] +16696 - Bank chest - [null, null, null, null, null] +16697 - Chest - [null, null, null, null, null] +16698 - null - [null, null, null, null, null] +16699 - null - [null, null, null, null, null] +16700 - Bank booth - [Use, Use-quickly, Collect, null, null] +16701 - Light - [null, null, null, null, null] +16702 - Cooker - [null, null, null, null, null] +16703 - Cooker - [null, null, null, null, null] +16704 - Sink - [null, null, null, null, null] +16705 - Sink - [null, null, null, null, null] +16706 - Bench - [null, null, null, null, null] +16707 - Bookcase - [null, null, null, null, null] +16708 - Tall mirror - [Admire, null, null, null, null] +16709 - null - [null, null, null, null, null] +16710 - null - [null, null, null, null, null] +16711 - null - [null, null, null, null, null] +16712 - null - [null, null, null, null, null] +16713 - null - [null, null, null, null, null] +16714 - Bags for sale - [null, null, null, null, null] +16715 - Bags for sale - [null, null, null, null, null] +16716 - null - [null, null, null, null, null] +16717 - null - [null, null, null, null, null] +16718 - null - [null, null, null, null, null] +16719 - Bed - [null, null, null, null, null] +16720 - Bed - [null, null, null, null, null] +16721 - Bed - [null, null, null, null, null] +16722 - null - [null, null, null, null, null] +16723 - null - [null, null, null, null, null] +16724 - null - [null, null, null, null, null] +16725 - null - [null, null, null, null, null] +16726 - null - [null, null, null, null, null] +16727 - null - [null, null, null, null, null] +16728 - null - [null, null, null, null, null] +16729 - Flowers - [null, null, null, null, null] +16730 - Flowers - [null, null, null, null, null] +16731 - Flowers - [null, null, null, null, null] +16732 - Stairs - [Climb-down, null, null, null, null] +16733 - Stairs - [Climb-down, null, null, null, null] +16734 - Stairs - [Climb-up, null, null, null, null] +16735 - Ladder - [Climb-up, null, null, null, null] +16736 - Ladder - [Climb-down, null, null, null, null] +16737 - Table - [null, null, null, null, null] +16738 - Table - [null, null, null, null, null] +16739 - Table - [null, null, null, null, null] +16740 - Table - [null, null, null, null, null] +16741 - Table - [null, null, null, null, null] +16742 - Table - [null, null, null, null, null] +16743 - Chair - [null, null, null, null, null] +16744 - Chair - [null, null, null, null, null] +16745 - Stool - [null, null, null, null, null] +16746 - null - [null, null, null, null, null] +16747 - null - [null, null, null, null, null] +16748 - null - [null, null, null, null, null] +16749 - null - [null, null, null, null, null] +16750 - null - [null, null, null, null, null] +16751 - null - [null, null, null, null, null] +16752 - null - [null, null, null, null, null] +16753 - null - [null, null, null, null, null] +16754 - null - [null, null, null, null, null] +16755 - null - [null, null, null, null, null] +16756 - null - [null, null, null, null, null] +16757 - null - [null, null, null, null, null] +16758 - null - [null, null, null, null, null] +16759 - null - [null, null, null, null, null] +16760 - null - [null, null, null, null, null] +16761 - null - [null, null, null, null, null] +16762 - null - [null, null, null, null, null] +16763 - null - [null, null, null, null, null] +16764 - null - [null, null, null, null, null] +16765 - null - [null, null, null, null, null] +16766 - null - [null, null, null, null, null] +16767 - null - [null, null, null, null, null] +16768 - null - [null, null, null, null, null] +16769 - null - [null, null, null, null, null] +16770 - null - [null, null, null, null, null] +16771 - null - [null, null, null, null, null] +16772 - null - [null, null, null, null, null] +16773 - null - [null, null, null, null, null] +16774 - Door - [Open, null, null, null, null] +16775 - null - [null, null, null, null, null] +16776 - Door - [Open, null, null, null, null] +16777 - Door - [Close, null, null, null, null] +16778 - Door - [Open, null, null, null, null] +16779 - Door - [Close, null, null, null, null] +16780 - null - [null, null, null, null, null] +16781 - null - [null, null, null, null, null] +16782 - null - [null, null, null, null, null] +16783 - null - [null, null, null, null, null] +16784 - null - [null, null, null, null, null] +16785 - null - [null, null, null, null, null] +16786 - null - [null, null, null, null, null] +16787 - null - [null, null, null, null, null] +16788 - null - [null, null, null, null, null] +16789 - null - [null, null, null, null, null] +16790 - null - [null, null, null, null, null] +16791 - null - [null, null, null, null, null] +16792 - null - [null, null, null, null, null] +16793 - null - [null, null, null, null, null] +16794 - null - [null, null, null, null, null] +16795 - null - [null, null, null, null, null] +16796 - null - [null, null, null, null, null] +16797 - null - [null, null, null, null, null] +16798 - null - [null, null, null, null, null] +16799 - null - [null, null, null, null, null] +16800 - null - [null, null, null, null, null] +16801 - null - [null, null, null, null, null] +16802 - null - [null, null, null, null, null] +16803 - null - [null, null, null, null, null] +16804 - null - [null, null, null, null, null] +16805 - null - [null, null, null, null, null] +16806 - null - [null, null, null, null, null] +16807 - null - [null, null, null, null, null] +16808 - Ceremonial Brazier - [null, null, null, null, null] +16809 - Ceremonial Brazier - [null, null, null, null, null] +16810 - Ceremonial Brazier - [null, null, null, null, null] +16811 - Ceremonial Brazier - [null, null, null, null, null] +16812 - Cooker - [null, null, null, null, null] +16813 - Rack - [null, null, null, null, null] +16814 - Stool - [null, null, null, null, null] +16815 - Table - [null, null, null, null, null] +16816 - null - [null, null, null, null, null] +16817 - null - [null, null, null, null, null] +16818 - null - [null, null, null, null, null] +16819 - null - [null, null, null, null, null] +16820 - null - [null, null, null, null, null] +16821 - null - [null, null, null, null, null] +16822 - null - [null, null, null, null, null] +16823 - null - [null, null, null, null, null] +16824 - null - [null, null, null, null, null] +16825 - null - [null, null, null, null, null] +16826 - null - [null, null, null, null, null] +16827 - Table - [null, null, null, null, null] +16828 - Table - [null, null, null, null, null] +16829 - Transport platform - [Step-on, null, null, null, null] +16830 - null - [null, null, null, null, null] +16831 - Transport platform - [Step-on, null, null, null, null] +16832 - null - [null, null, null, null, null] +16833 - Transport platform - [Step-on, null, null, null, null] +16834 - null - [null, null, null, null, null] +16835 - Transport platform - [Step-on, null, null, null, null] +16836 - null - [null, null, null, null, null] +16837 - Transport platform - [Step-on, null, null, null, null] +16838 - null - [null, null, null, null, null] +16839 - Transport platform - [Step-on, null, null, null, null] +16840 - null - [null, null, null, null, null] +16841 - Transport platform - [Step-on, null, null, null, null] +16842 - null - [null, null, null, null, null] +16843 - Dice - [Roll, null, null, null, null] +16844 - Dice - [Roll, null, null, null, null] +16845 - Dice - [Roll, null, null, null, null] +16846 - Dice - [Roll, null, null, null, null] +16847 - Dice - [Roll, null, null, null, null] +16848 - Dice - [Roll, null, null, null, null] +16849 - Dice - [null, null, null, null, null] +16850 - Dice - [null, null, null, null, null] +16851 - Dice - [null, null, null, null, null] +16852 - Dice - [null, null, null, null, null] +16853 - Dice - [null, null, null, null, null] +16854 - Dice - [null, null, null, null, null] +16855 - Dice - [null, null, null, null, null] +16856 - Dream puff - [null, null, null, null, null] +16857 - Dream puff - [null, null, null, null, null] +16858 - Platform edge - [Jump-to, null, null, null, null] +16859 - Hanging pirate - [null, null, null, null, null] +16860 - Tar barrel - [Take-from, null, null, null, null] +16861 - Hammock - [null, null, null, null, null] +16862 - Crate - [null, null, null, null, null] +16863 - Crate - [null, null, null, null, null] +16864 - Crate - [null, null, null, null, null] +16865 - Crate - [null, null, null, null, null] +16866 - Sack pile - [null, null, null, null, null] +16867 - Sack pile - [null, null, null, null, null] +16868 - Sack pile - [null, null, null, null, null] +16869 - Sack pile - [null, null, null, null, null] +16870 - Sack pile - [null, null, null, null, null] +16871 - Sack pile - [null, null, null, null, null] +16872 - Fish bits - [null, null, null, null, null] +16873 - Fish bits - [null, null, null, null, null] +16874 - Table - [null, null, null, null, null] +16875 - Stool - [null, null, null, null, null] +16876 - Barrel - [null, null, null, null, null] +16877 - Barrel - [null, null, null, null, null] +16878 - Sack - [null, null, null, null, null] +16879 - Cannonballs - [null, null, null, null, null] +16880 - Cannonballs - [null, null, null, null, null] +16881 - Barrel - [null, null, null, null, null] +16882 - Barrel - [null, null, null, null, null] +16883 - Barrel - [null, null, null, null, null] +16884 - Barrel - [Take-from, null, null, null, null] +16885 - Barrel - [Take-from, null, null, null, null] +16886 - Barrel - [null, null, null, null, null] +16887 - Wooden chest - [null, null, null, null, null] +16888 - Wooden chest - [null, null, null, null, null] +16889 - Wooden chest - [null, null, null, null, null] +16890 - Chest - [null, null, null, null, null] +16891 - Chest - [null, null, null, null, null] +16892 - null - [null, null, null, null, null] +16893 - Cooking range - [null, null, null, null, null] +16894 - Extra anchor - [null, null, null, null, null] +16895 - Extra chain - [null, null, null, null, null] +16896 - null - [null, null, null, null, null] +16897 - null - [null, null, null, null, null] +16898 - null - [null, null, null, null, null] +16899 - Wooden table - [null, null, null, null, null] +16900 - Chair - [null, null, null, null, null] +16901 - Lantern - [null, null, null, null, null] +16902 - Door - [Open, null, null, null, null] +16903 - Door - [Close, null, null, null, null] +16904 - null - [null, null, null, null, null] +16905 - null - [null, null, null, null, null] +16906 - Wheel - [null, null, null, null, null] +16907 - null - [null, null, null, null, null] +16908 - null - [null, null, null, null, null] +16909 - null - [null, null, null, null, null] +16910 - null - [null, null, null, null, null] +16911 - null - [null, null, null, null, null] +16912 - null - [null, null, null, null, null] +16913 - null - [null, null, null, null, null] +16914 - null - [null, null, null, null, null] +16915 - null - [null, null, null, null, null] +16916 - null - [null, null, null, null, null] +16917 - null - [null, null, null, null, null] +16918 - null - [null, null, null, null, null] +16919 - null - [null, null, null, null, null] +16920 - null - [null, null, null, null, null] +16921 - null - [null, null, null, null, null] +16922 - null - [null, null, null, null, null] +16923 - null - [null, null, null, null, null] +16924 - null - [null, null, null, null, null] +16925 - null - [null, null, null, null, null] +16926 - null - [null, null, null, null, null] +16927 - null - [null, null, null, null, null] +16928 - null - [null, null, null, null, null] +16929 - null - [null, null, null, null, null] +16930 - null - [null, null, null, null, null] +16931 - null - [null, null, null, null, null] +16932 - null - [null, null, null, null, null] +16933 - null - [null, null, null, null, null] +16934 - null - [null, null, null, null, null] +16935 - null - [null, null, null, null, null] +16936 - null - [null, null, null, null, null] +16937 - null - [null, null, null, null, null] +16938 - Cannon - [null, null, null, null, null] +16939 - Cannon - [null, null, null, null, null] +16940 - null - [null, null, null, null, null] +16941 - Support - [null, null, null, null, null] +16942 - null - [null, null, null, null, null] +16943 - null - [null, null, null, null, null] +16944 - null - [null, null, null, null, null] +16945 - Stairs - [Climb, null, null, null, null] +16946 - Stairs - [Climb, null, null, null, null] +16947 - Stairs - [Climb, null, null, null, null] +16948 - Stairs - [Climb, null, null, null, null] +16949 - null - [null, null, null, null, null] +16950 - null - [null, null, null, null, null] +16951 - Support - [null, null, null, null, null] +16952 - Support - [null, null, null, null, null] +16953 - Cannon - [null, null, null, null, null] +16954 - Crate - [null, null, null, null, null] +16955 - Wall chart - [null, null, null, null, null] +16956 - Chest - [null, null, null, null, null] +16957 - Crane - [null, null, null, null, null] +16958 - Row boat - [null, null, null, null, null] +16959 - Ladder - [Climb, null, null, null, null] +16960 - Ladder - [Climb, null, null, null, null] +16961 - Ladder - [Climb, null, null, null, null] +16962 - Ladder - [Climb, null, null, null, null] +16963 - null - [null, null, null, null, null] +16964 - null - [null, null, null, null, null] +16965 - null - [null, null, null, null, null] +16966 - null - [null, null, null, null, null] +16967 - null - [null, null, null, null, null] +16968 - Shelf - [null, null, null, null, null] +16969 - Shelf - [null, null, null, null, null] +16970 - Shelf - [null, null, null, null, null] +16971 - Shelf - [null, null, null, null, null] +16972 - Shelf - [null, null, null, null, null] +16973 - Shelf - [null, null, null, null, null] +16974 - Table - [null, null, null, null, null] +16975 - Wallchart - [null, null, null, null, null] +16976 - null - [null, null, null, null, null] +16977 - null - [null, null, null, null, null] +16978 - Chart - [null, null, null, null, null] +16979 - Chart - [null, null, null, null, null] +16980 - Chart - [null, null, null, null, null] +16981 - Scrolls - [null, null, null, null, null] +16982 - null - [null, null, null, null, null] +16983 - null - [null, null, null, null, null] +16984 - null - [null, null, null, null, null] +16985 - null - [null, null, null, null, null] +16986 - null - [null, null, null, null, null] +16987 - null - [null, null, null, null, null] +16988 - null - [null, null, null, null, null] +16989 - null - [null, null, null, null, null] +16990 - null - [null, null, null, null, null] +16991 - null - [null, null, null, null, null] +16992 - null - [null, null, null, null, null] +16993 - null - [null, null, null, null, null] +16994 - null - [null, null, null, null, null] +16995 - null - [null, null, null, null, null] +16996 - null - [null, null, null, null, null] +16997 - null - [null, null, null, null, null] +16998 - Rocks - [Mine, Prospect, hidden, null, null] +16999 - Rocks - [Mine, Prospect, hidden, null, null] +17000 - Rocks - [Mine, Prospect, hidden, null, null] +17001 - Rocks - [Mine, Prospect, hidden, null, null] +17002 - Rocks - [Mine, Prospect, hidden, null, null] +17003 - Rocks - [Mine, Prospect, hidden, null, null] +17004 - Rocks - [Mine, Prospect, hidden, null, null] +17005 - Rocks - [Mine, Prospect, hidden, null, null] +17006 - Rocks - [Mine, Prospect, hidden, null, null] +17007 - Rocks - [Mine, Prospect, hidden, null, null] +17008 - Rocks - [Mine, Prospect, hidden, null, null] +17009 - Rocks - [Mine, Prospect, hidden, null, null] +17010 - Altar - [Craft-rune, Pray, null, null, null] +17011 - Pillar - [null, null, null, null, null] +17012 - Pillar - [null, null, null, null, null] +17013 - Pillar - [null, null, null, null, null] +17014 - null - [null, null, null, null, null] +17015 - null - [null, null, null, null, null] +17016 - null - [null, null, null, null, null] +17017 - null - [null, null, null, null, null] +17018 - null - [null, null, null, null, null] +17019 - null - [null, null, null, null, null] +17020 - null - [null, null, null, null, null] +17021 - null - [null, null, null, null, null] +17022 - null - [null, null, null, null, null] +17023 - null - [null, null, null, null, null] +17024 - null - [null, null, null, null, null] +17025 - null - [null, null, null, null, null] +17026 - Rocks - [Mine, Prospect, hidden, null, null] +17027 - Rocks - [Mine, Prospect, hidden, null, null] +17028 - Rocks - [Mine, Prospect, hidden, null, null] +17029 - null - [null, null, null, null, null] +17030 - null - [null, null, null, null, null] +17031 - Crossbow stall - [null, Steal-from, null, null, null] +17032 - null - [null, null, null, null, null] +17033 - Crate - [null, null, null, null, null] +17034 - null - [null, null, null, null, null] +17035 - null - [null, null, null, null, null] +17036 - Strong Tree - [null, null, null, null, null] +17037 - Strong Tree - [null, null, null, null, null] +17038 - Strong Tree - [null, null, null, null, null] +17039 - Strong Yew - [null, null, null, null, null] +17040 - Strong Yew - [null, null, null, null, null] +17041 - Strong Yew - [null, null, null, null, null] +17042 - Rocks - [Grapple, null, null, null, null] +17043 - Rocks - [Grapple, null, null, null, null] +17044 - null - [null, null, null, null, null] +17045 - null - [null, null, null, null, null] +17046 - Strong Tree - [Grapple, null, null, null, null] +17047 - Wall - [Grapple, null, null, null, null] +17048 - Wall - [Jump, null, null, null, null] +17049 - Wall - [Grapple, null, null, null, null] +17050 - Wall - [Grapple, null, null, null, null] +17051 - Wall - [Jump, null, null, null, null] +17052 - Wall - [Jump, null, null, null, null] +17053 - null - [null, null, null, null, null] +17054 - null - [null, null, null, null, null] +17055 - null - [null, null, null, null, null] +17056 - Crossbow Tree - [null, null, null, null, null] +17057 - Crossbow Tree - [null, null, null, null, null] +17058 - Crossbow Tree - [null, null, null, null, null] +17059 - Crossbow Tree - [null, null, null, null, null] +17060 - Crossbow Tree - [null, null, null, null, null] +17061 - Crossbow Tree - [null, null, null, null, null] +17062 - Crossbow Tree - [Grapple, null, null, null, null] +17063 - Crossbow Tree - [null, null, null, null, null] +17064 - Rocks - [null, null, null, null, null] +17065 - Rocks - [null, null, null, null, null] +17066 - null - [null, null, null, null, null] +17067 - null - [null, null, null, null, null] +17068 - Broken Raft - [Grapple, null, null, null, null] +17069 - Broken Raft - [null, null, null, null, null] +17070 - Broken Raft - [null, null, null, null, null] +17071 - Broken Raft - [null, null, null, null, null] +17072 - null - [null, null, null, null, null] +17073 - null - [null, null, null, null, null] +17074 - Strong Tree - [Grapple, null, null, null, null] +17075 - Strong Tree - [Grapple, null, null, null, null] +17076 - Strong Tree - [Grapple, null, null, null, null] +17077 - Strong Tree - [Grapple, null, null, null, null] +17078 - null - [null, null, null, null, null] +17079 - null - [null, null, null, null, null] +17080 - Strong Tree - [Grapple, null, null, null, null] +17081 - Strong Tree - [Grapple, null, null, null, null] +17082 - null - [null, null, null, null, null] +17083 - null - [null, null, null, null, null] +17084 - null - [null, null, null, null, null] +17085 - null - [null, null, null, null, null] +17086 - null - [null, null, null, null, null] +17087 - null - [null, null, null, null, null] +17088 - null - [null, null, null, null, null] +17089 - Large door - [Open, null, null, null, null] +17090 - Large door - [Close, null, null, null, null] +17091 - Large door - [Open, null, null, null, null] +17092 - Large door - [Close, null, null, null, null] +17093 - Large door - [Open, null, null, null, null] +17094 - Large door - [Close, null, null, null, null] +17095 - Shelf - [null, null, null, null, null] +17096 - Shelf - [null, null, null, null, null] +17097 - Shelf - [null, null, null, null, null] +17098 - Stool - [null, null, null, null, null] +17099 - Table - [null, null, null, null, null] +17100 - Crate - [Search, null, null, null, null] +17101 - Crate - [Search, null, null, null, null] +17102 - null - [null, null, null, null, null] +17103 - null - [null, null, null, null, null] +17104 - null - [null, null, null, null, null] +17105 - null - [null, null, null, null, null] +17106 - null - [null, null, null, null, null] +17107 - null - [null, null, null, null, null] +17108 - null - [null, null, null, null, null] +17109 - null - [null, null, null, null, null] +17110 - null - [null, null, null, null, null] +17111 - null - [null, null, null, null, null] +17112 - null - [null, null, null, null, null] +17113 - null - [null, null, null, null, null] +17114 - Door - [Open, null, null, null, null] +17115 - Door - [Close, null, null, null, null] +17116 - Pool of Slime - [null, null, null, null, null] +17117 - Pool of Slime - [null, null, null, null, null] +17118 - Pool of Slime - [null, null, null, null, null] +17119 - Pool of Slime - [null, null, null, null, null] +17120 - Ladder - [Climb-up, null, null, null, null] +17121 - Ladder - [Climb, Climb-up, Climb-down, null, null] +17122 - Ladder - [Climb-down, null, null, null, null] +17123 - null - [null, null, null, null, null] +17124 - null - [null, null, null, null, null] +17125 - Gnome chair - [null, null, null, null, null] +17126 - Gnome table - [null, null, null, null, null] +17127 - Gnome table - [null, null, null, null, null] +17128 - Gnome table - [null, null, null, null, null] +17129 - Gnome table - [null, null, null, null, null] +17130 - Office table - [null, null, null, null, null] +17131 - Gnome cooker - [null, null, null, null, null] +17132 - Kitchen cabinet - [Search, null, null, null, null] +17133 - Gnome cabinet - [null, null, null, null, null] +17134 - Gnome barrel - [null, null, null, null, null] +17135 - Gnome barrels - [null, null, null, null, null] +17136 - Gnome crates - [null, null, null, null, null] +17137 - Gnome crate - [null, null, null, null, null] +17138 - null - [null, null, null, null, null] +17139 - null - [null, null, null, null, null] +17140 - Oaknock statue - [null, null, null, null, null] +17141 - Healthorg statue - [null, null, null, null, null] +17142 - null - [null, null, null, null, null] +17143 - Staircase - [Climb-up, null, null, null, null] +17144 - Boxes - [Search, null, null, null, null] +17145 - Table - [null, null, null, null, null] +17146 - Chair - [null, null, null, null, null] +17147 - null - [null, null, null, null, null] +17148 - Ladder - [Climb-up, null, null, null, null] +17149 - Ladder - [Climb-down, null, null, null, null] +17150 - Storage shelves - [null, null, null, null, null] +17151 - Shelves - [null, null, null, null, null] +17152 - Shelves - [null, null, null, null, null] +17153 - Sinister barrel - [null, null, null, null, null] +17154 - null - [null, null, null, null, null] +17155 - Staircase - [Climb-down, null, null, null, null] +17156 - null - [null, null, null, null, null] +17157 - null - [null, null, null, null, null] +17158 - Stool - [null, null, null, null, null] +17159 - Ladder - [Climb-up, null, null, null, null] +17160 - Ladder - [Climb-down, null, null, null, null] +17161 - Cauldron - [null, null, null, null, null] +17162 - Cauldron - [null, null, null, null, null] +17163 - null - [null, null, null, null, null] +17164 - null - [null, null, null, null, null] +17165 - null - [null, null, null, null, null] +17166 - null - [null, null, null, null, null] +17167 - null - [null, null, null, null, null] +17168 - null - [null, null, null, null, null] +17169 - null - [null, null, null, null, null] +17170 - null - [null, null, null, null, null] +17171 - null - [null, null, null, null, null] +17172 - null - [null, null, null, null, null] +17173 - null - [null, null, null, null, null] +17174 - null - [null, null, null, null, null] +17175 - null - [null, null, null, null, null] +17176 - null - [null, null, null, null, null] +17177 - null - [null, null, null, null, null] +17178 - null - [null, null, null, null, null] +17179 - null - [null, null, null, null, null] +17180 - null - [null, null, null, null, null] +17181 - null - [null, null, null, null, null] +17182 - null - [null, null, null, null, null] +17183 - null - [null, null, null, null, null] +17184 - null - [null, null, null, null, null] +17185 - null - [null, null, null, null, null] +17186 - null - [null, null, null, null, null] +17187 - null - [null, null, null, null, null] +17188 - null - [null, null, null, null, null] +17189 - null - [null, null, null, null, null] +17190 - null - [null, null, null, null, null] +17191 - null - [null, null, null, null, null] +17192 - null - [null, null, null, null, null] +17193 - null - [null, null, null, null, null] +17194 - null - [null, null, null, null, null] +17195 - null - [null, null, null, null, null] +17196 - Goblin crowd - [null, null, null, null, null] +17197 - Gnome crowd - [null, null, null, null, null] +17198 - Gnome crowd - [null, null, null, null, null] +17199 - Goblin crowd - [null, null, null, null, null] +17200 - Goblin crowd - [null, null, null, null, null] +17201 - Gnome crowd - [null, null, null, null, null] +17202 - Gnome crowd - [null, null, null, null, null] +17203 - Goblin crowd - [null, null, null, null, null] +17204 - Goblin crowd - [null, null, null, null, null] +17205 - Gnome crowd - [null, null, null, null, null] +17206 - Gnome crowd - [null, null, null, null, null] +17207 - A Goblin standard - [null, null, null, null, null] +17208 - null - [null, null, null, null, null] +17209 - Cave entrance - [Enter, null, null, null, null] +17210 - null - [null, null, null, null, null] +17211 - null - [null, null, null, null, null] +17212 - null - [null, null, null, null, null] +17213 - null - [null, null, null, null, null] +17214 - null - [null, null, null, null, null] +17215 - null - [null, null, null, null, null] +17216 - null - [null, null, null, null, null] +17217 - null - [null, null, null, null, null] +17218 - null - [null, null, null, null, null] +17219 - null - [null, null, null, null, null] +17220 - null - [null, null, null, null, null] +17221 - null - [null, null, null, null, null] +17222 - Tunnel - [Exit, null, null, null, null] +17223 - Tunnel - [Exit, null, null, null, null] +17224 - null - [null, null, null, null, null] +17225 - null - [null, null, null, null, null] +17226 - null - [null, null, null, null, null] +17227 - null - [null, null, null, null, null] +17228 - null - [null, null, null, null, null] +17229 - null - [null, null, null, null, null] +17230 - null - [null, null, null, null, null] +17231 - null - [null, null, null, null, null] +17232 - Drawers - [Search, null, null, null, null] +17233 - Drawers - [null, null, null, null, null] +17234 - Chair - [null, null, null, null, null] +17235 - Table - [Take-bowl, null, null, null, null] +17236 - Hammock - [null, null, null, null, null] +17237 - Torch - [null, null, null, null, null] +17238 - Aspidistra plant - [Search, null, null, null, null] +17239 - Singing bowl - [Inspect, null, Sing-glass, Revert-crystal, null] +17240 - Oaknock's machine - [Repair, null, null, null, null] +17241 - Oaknock's machine - [null, null, null, null, null] +17242 - Broken cogs - [null, null, null, null, null] +17243 - Cogs - [null, null, null, null, null] +17244 - null - [null, null, null, null, null] +17245 - Oaknock's Machine - [Operate, null, null, null, null] +17246 - Oaknock's Machine - [Repair, null, null, null, null] +17247 - Oaknock's Machine - [Unlock, null, null, null, null] +17248 - Oaknock's exchanger - [Use, null, null, null, null] +17249 - Oaknock's exchanger - [Repair, null, null, null, null] +17250 - null - [null, null, null, null, null] +17251 - null - [null, null, null, null, null] +17252 - null - [null, null, null, null, null] +17253 - null - [null, null, null, null, null] +17254 - null - [null, null, null, null, null] +17255 - null - [null, null, null, null, null] +17256 - Rift - [null, null, null, null, null] +17257 - Rift - [null, null, null, null, null] +17258 - Rift - [null, null, null, null, null] +17259 - Rift - [null, null, null, null, null] +17260 - Rift - [null, null, null, null, null] +17261 - Rift - [null, null, null, null, null] +17262 - Rift - [null, null, null, null, null] +17263 - Rift - [null, null, null, null, null] +17264 - Rift - [null, null, null, null, null] +17265 - Rift - [null, null, null, null, null] +17266 - Rift - [null, null, null, null, null] +17267 - Crystal bridge - [Walk-across, null, null, null, null] +17268 - A chasm - [null, null, null, null, null] +17269 - null - [null, null, null, null, null] +17270 - null - [null, null, null, null, null] +17271 - Crate - [null, null, null, null, null] +17272 - Machine panel - [Look-at, null, null, null, null] +17273 - Argento - [null, null, null, null, null] +17274 - Argento - [null, null, null, null, null] +17275 - Argento - [null, null, null, null, null] +17276 - Argento - [test, null, null, null, null] +17277 - Argento - [null, null, null, null, null] +17278 - Argento - [null, null, null, null, null] +17279 - Argento - [null, null, null, null, null] +17280 - null - [null, null, null, null, null] +17281 - null - [null, null, null, null, null] +17282 - null - [null, null, null, null, null] +17283 - null - [null, null, null, null, null] +17284 - Door - [null, null, null, null, null] +17285 - null - [null, null, null, null, null] +17286 - Hoisted sail - [null, null, null, null, null] +17287 - Hoisted sail - [null, null, null, null, null] +17288 - Hoisted sail - [null, null, null, null, null] +17289 - Hoisted sail - [null, null, null, null, null] +17290 - Hoisted sail - [null, null, null, null, null] +17291 - Hoisted sail - [null, null, null, null, null] +17292 - Hoisted sail - [null, null, null, null, null] +17293 - Hoisted sail - [null, null, null, null, null] +17294 - Hoisted sail - [null, null, null, null, null] +17295 - Hoisted sail - [null, null, null, null, null] +17296 - Barrel - [Open, Search, null, null, null] +17297 - Barrel - [null, Search, null, null, null] +17298 - null - [null, null, null, null, null] +17299 - Table - [null, null, null, null, null] +17300 - Cupboard - [Open, null, null, null, null] +17301 - Cupboard - [Close, Search, null, null, null] +17302 - Cupboard - [Open, null, null, null, null] +17303 - Cupboard - [Close, Search, null, null, null] +17304 - Crate - [null, null, null, null, null] +17305 - Crate - [null, null, null, null, null] +17306 - Stool - [null, null, null, null, null] +17307 - Barrel - [null, null, null, null, null] +17308 - Barrel - [null, null, null, null, null] +17309 - Study desk - [null, null, null, null, null] +17310 - null - [null, null, null, null, null] +17311 - Chair - [null, null, null, null, null] +17312 - Bench - [null, null, null, null, null] +17313 - Hedge - [null, null, null, null, null] +17314 - Hedge - [null, null, null, null, null] +17315 - Hedge - [null, null, null, null, null] +17316 - Door - [Open, null, null, null, null] +17317 - Door - [Close, null, null, null, null] +17318 - null - [null, null, null, null, null] +17319 - Bookcase - [Search, null, null, null, null] +17320 - Bookcase - [Search, null, null, null, null] +17321 - Bookcase - [Search, null, null, null, null] +17322 - Log pile - [null, null, null, null, null] +17323 - Candles - [null, null, null, null, null] +17324 - null - [null, null, null, null, null] +17325 - Limestone fireplace - [null, null, null, null, null] +17326 - null - [null, null, null, null, null] +17327 - null - [null, null, null, null, null] +17328 - null - [null, null, null, null, null] +17329 - null - [null, null, null, null, null] +17330 - null - [null, null, null, null, null] +17331 - null - [null, null, null, null, null] +17332 - null - [null, null, null, null, null] +17333 - null - [null, null, null, null, null] +17334 - Lava - [null, null, null, null, null] +17335 - Lava - [null, null, null, null, null] +17336 - Lava - [null, null, null, null, null] +17337 - Lava - [null, null, null, null, null] +17338 - Lava - [null, null, null, null, null] +17339 - Lava - [null, null, null, null, null] +17340 - Lava - [null, null, null, null, null] +17341 - Lava - [null, null, null, null, null] +17342 - Lava - [null, null, null, null, null] +17343 - Lava - [null, null, null, null, null] +17344 - Lava - [null, null, null, null, null] +17345 - Lava - [null, null, null, null, null] +17346 - null - [null, null, null, null, null] +17347 - null - [null, null, null, null, null] +17348 - Table - [null, null, null, null, null] +17349 - null - [null, null, null, null, null] +17350 - Rock - [null, null, null, null, null] +17351 - Rock - [null, null, null, null, null] +17352 - Rock - [null, null, null, null, null] +17353 - Rock - [null, null, null, null, null] +17354 - Rock - [null, null, null, null, null] +17355 - Rock - [null, null, null, null, null] +17356 - Rock - [null, null, null, null, null] +17357 - Rock - [null, null, null, null, null] +17358 - Rock - [null, null, null, null, null] +17359 - null - [null, null, null, null, null] +17360 - null - [null, null, null, null, null] +17361 - null - [null, null, null, null, null] +17362 - Urn - [null, null, null, null, null] +17363 - null - [null, null, null, null, null] +17364 - Rock - [null, null, null, null, null] +17365 - Small rock - [null, null, null, null, null] +17366 - Rock - [null, null, null, null, null] +17367 - Stone Tablet - [Take, null, null, null, null] +17368 - Floor - [null, null, null, null, null] +17369 - null - [null, null, null, null, null] +17370 - Rift - [null, null, null, null, null] +17371 - Rift - [null, null, null, null, null] +17372 - Rift - [null, null, null, null, null] +17373 - Rift - [null, null, null, null, null] +17374 - Rift - [null, null, null, null, null] +17375 - Rift - [null, null, null, null, null] +17376 - Rift - [null, null, null, null, null] +17377 - Rift - [null, null, null, null, null] +17378 - Rift - [null, null, null, null, null] +17379 - Rift - [null, null, null, null, null] +17380 - Rift - [null, null, null, null, null] +17381 - Rift - [null, null, null, null, null] +17382 - Bookcase - [Search, null, null, null, null] +17383 - Rocks - [Mine, Prospect, hidden, null, null] +17384 - Rocks - [Mine, Prospect, hidden, null, null] +17385 - Rocks - [Mine, Prospect, hidden, null, null] +17386 - Rocks - [Mine, Prospect, hidden, null, null] +17387 - Rocks - [Mine, Prospect, hidden, null, null] +17388 - Rocks - [Mine, Prospect, hidden, null, null] +17389 - Rocks - [Mine, Prospect, hidden, null, null] +17390 - Rocks - [Mine, Prospect, hidden, null, null] +17391 - Rocks - [Mine, Prospect, hidden, null, null] +17392 - Gangplank - [Cross, null, null, null, null] +17393 - Gangplank - [Cross, null, null, null, null] +17394 - Gangplank - [Cross, null, null, null, null] +17395 - Gangplank - [Cross, null, null, null, null] +17396 - Gangplank - [Cross, null, null, null, null] +17397 - Gangplank - [Cross, null, null, null, null] +17398 - Gangplank - [Cross, null, null, null, null] +17399 - Gangplank - [Cross, null, null, null, null] +17400 - Gangplank - [Cross, null, null, null, null] +17401 - Gangplank - [Cross, null, null, null, null] +17402 - Gangplank - [Cross, null, null, null, null] +17403 - Gangplank - [Cross, null, null, null, null] +17404 - Gangplank - [Cross, null, null, null, null] +17405 - Gangplank - [Cross, null, null, null, null] +17406 - Gangplank - [Cross, null, null, null, null] +17407 - Gangplank - [Cross, null, null, null, null] +17408 - Gangplank - [Cross, null, null, null, null] +17409 - Gangplank - [Cross, null, null, null, null] +17410 - null - [null, null, null, null, null] +17411 - null - [null, null, null, null, null] +17412 - null - [null, null, null, null, null] +17413 - null - [null, null, null, null, null] +17414 - null - [null, null, null, null, null] +17415 - null - [null, null, null, null, null] +17416 - null - [null, null, null, null, null] +17417 - null - [null, null, null, null, null] +17418 - null - [null, null, null, null, null] +17419 - null - [null, null, null, null, null] +17420 - null - [null, null, null, null, null] +17421 - null - [null, null, null, null, null] +17422 - null - [null, null, null, null, null] +17423 - Drain - [Search, null, null, null, null] +17424 - Drain - [Search, null, null, null, null] +17425 - Sword case - [null, null, null, null, null] +17426 - Sword case - [null, null, null, null, null] +17427 - Sword case - [null, null, null, null, null] +17428 - null - [null, null, null, null, null] +17429 - Rusty key - [Take, null, null, null, null] +17430 - Mud - [null, null, null, null, null] +17431 - Rusty key - [Take, null, null, null, null] +17432 - Sewer pipe - [Search, null, null, null, null] +17433 - Wardrobe - [null, null, null, null, null] +17434 - Wardrobe - [null, null, null, null, null] +17435 - Stone table - [null, null, null, null, null] +17436 - Stone table - [null, null, null, null, null] +17437 - Stone table - [null, null, null, null, null] +17438 - Stone table - [null, null, null, null, null] +17439 - Stone circle wall - [null, null, null, null, null] +17440 - Stone circle wall - [null, null, null, null, null] +17441 - Stone circle wall - [null, null, null, null, null] +17442 - Stone circle wall - [null, null, null, null, null] +17443 - Stone circle wall - [null, null, null, null, null] +17444 - Stone circle wall - [null, null, null, null, null] +17445 - Stone circle wall - [null, null, null, null, null] +17446 - null - [null, null, null, null, null] +17447 - null - [null, null, null, null, null] +17448 - null - [null, null, null, null, null] +17449 - null - [null, null, null, null, null] +17450 - Dragon head - [null, null, null, null, null] +17451 - Chess - [null, null, null, null, null] +17452 - null - [null, null, null, null, null] +17453 - null - [null, null, null, null, null] +17454 - null - [null, null, null, null, null] +17455 - Crystal ball - [null, null, null, null, null] +17456 - null - [null, null, null, null, null] +17457 - null - [null, null, null, null, null] +17458 - null - [null, null, null, null, null] +17459 - null - [null, null, null, null, null] +17460 - null - [null, null, null, null, null] +17461 - Ornate candle - [null, null, null, null, null] +17462 - Chair - [null, null, null, null, null] +17463 - Chair - [null, null, null, null, null] +17464 - Desk - [null, null, null, null, null] +17465 - Bed - [null, null, null, null, null] +17466 - Drawers - [Open, null, null, null, null] +17467 - Shelf - [null, null, null, null, null] +17468 - Shelf - [null, null, null, null, null] +17469 - null - [null, null, null, null, null] +17470 - null - [null, null, null, null, null] +17471 - null - [null, null, null, null, null] +17472 - null - [null, null, null, null, null] +17473 - null - [null, null, null, null, null] +17474 - null - [null, null, null, null, null] +17475 - null - [null, null, null, null, null] +17476 - null - [null, null, null, null, null] +17477 - Dragon's head - [null, null, null, null, null] +17478 - Dragon's head - [null, null, null, null, null] +17479 - Dragon's head - [null, null, null, null, null] +17480 - Dragon's head - [null, null, null, null, null] +17481 - Dragon's head - [null, null, null, null, null] +17482 - Dragon's head - [null, null, null, null, null] +17483 - Dragon's head - [null, null, null, null, null] +17484 - Dragon's head - [null, null, null, null, null] +17485 - Dragon's head - [null, null, null, null, null] +17486 - Dragon's head - [null, null, null, null, null] +17487 - null - [null, null, null, null, null] +17488 - Door - [null, null, null, null, null] +17489 - null - [null, null, null, null, null] +17490 - null - [null, null, null, null, null] +17491 - null - [null, null, null, null, null] +17492 - null - [null, null, null, null, null] +17493 - null - [null, null, null, null, null] +17494 - null - [null, null, null, null, null] +17495 - null - [null, null, null, null, null] +17496 - null - [null, null, null, null, null] +17497 - Wall - [null, null, null, null, null] +17498 - Wall - [null, null, null, null, null] +17499 - null - [null, null, null, null, null] +17500 - Wall - [null, null, null, null, null] +17501 - null - [null, null, null, null, null] +17502 - null - [null, null, null, null, null] +17503 - null - [null, null, null, null, null] +17504 - null - [null, null, null, null, null] +17505 - null - [null, null, null, null, null] +17506 - null - [null, null, null, null, null] +17507 - null - [null, null, null, null, null] +17508 - Waste pipes - [null, null, null, null, null] +17509 - Waste pipes - [null, null, null, null, null] +17510 - Waste pipes - [null, null, null, null, null] +17511 - Waste pipes - [null, null, null, null, null] +17512 - null - [null, null, null, null, null] +17513 - null - [null, null, null, null, null] +17514 - null - [null, null, null, null, null] +17515 - null - [null, null, null, null, null] +17516 - null - [null, null, null, null, null] +17517 - null - [null, null, null, null, null] +17518 - null - [null, null, null, null, null] +17519 - null - [null, null, null, null, null] +17520 - null - [null, null, null, null, null] +17521 - null - [null, null, null, null, null] +17522 - null - [null, null, null, null, null] +17523 - null - [null, null, null, null, null] +17524 - null - [null, null, null, null, null] +17525 - null - [null, null, null, null, null] +17526 - null - [null, null, null, null, null] +17527 - null - [null, null, null, null, null] +17528 - null - [null, null, null, null, null] +17529 - null - [null, null, null, null, null] +17530 - null - [null, null, null, null, null] +17531 - null - [null, null, null, null, null] +17532 - null - [null, null, null, null, null] +17533 - null - [null, null, null, null, null] +17534 - null - [null, null, null, null, null] +17535 - null - [null, null, null, null, null] +17536 - null - [null, null, null, null, null] +17537 - null - [null, null, null, null, null] +17538 - null - [null, null, null, null, null] +17539 - null - [null, null, null, null, null] +17540 - null - [null, null, null, null, null] +17541 - null - [null, null, null, null, null] +17542 - null - [null, null, null, null, null] +17543 - null - [null, null, null, null, null] +17544 - null - [null, null, null, null, null] +17545 - Table - [null, null, null, null, null] +17546 - Table - [null, null, null, null, null] +17547 - Chair - [null, null, null, null, null] +17548 - Chair - [null, null, null, null, null] +17549 - Chair - [null, null, null, null, null] +17550 - Chair - [null, null, null, null, null] +17551 - Stool - [null, null, null, null, null] +17552 - Stool - [null, null, null, null, null] +17553 - Bed - [null, null, null, null, null] +17554 - Bed - [null, null, null, null, null] +17555 - Bed - [null, null, null, null, null] +17556 - Bucket - [null, null, null, null, null] +17557 - Bucket - [null, null, null, null, null] +17558 - Bucket - [null, null, null, null, null] +17559 - Panning tray - [null, null, null, null, null] +17560 - Panning tray - [null, null, null, null, null] +17561 - Pots - [null, null, null, null, null] +17562 - Pots - [null, null, null, null, null] +17563 - Floor below - [null, null, null, null, null] +17564 - null - [null, null, null, null, null] +17565 - null - [null, null, null, null, null] +17566 - null - [null, null, null, null, null] +17567 - null - [null, null, null, null, null] +17568 - null - [null, null, null, null, null] +17569 - null - [null, null, null, null, null] +17570 - null - [null, null, null, null, null] +17571 - null - [null, null, null, null, null] +17572 - null - [null, null, null, null, null] +17573 - null - [null, null, null, null, null] +17574 - null - [null, null, null, null, null] +17575 - null - [null, null, null, null, null] +17576 - null - [null, null, null, null, null] +17577 - null - [null, null, null, null, null] +17578 - null - [null, null, null, null, null] +17579 - null - [null, null, null, null, null] +17580 - null - [null, null, null, null, null] +17581 - null - [null, null, null, null, null] +17582 - null - [null, null, null, null, null] +17583 - null - [null, null, null, null, null] +17584 - null - [null, null, null, null, null] +17585 - null - [null, null, null, null, null] +17586 - null - [null, null, null, null, null] +17587 - null - [null, null, null, null, null] +17588 - null - [null, null, null, null, null] +17589 - null - [null, null, null, null, null] +17590 - null - [null, null, null, null, null] +17591 - null - [null, null, null, null, null] +17592 - null - [null, null, null, null, null] +17593 - null - [null, null, null, null, null] +17594 - null - [null, null, null, null, null] +17595 - null - [null, null, null, null, null] +17596 - null - [null, null, null, null, null] +17597 - null - [null, null, null, null, null] +17598 - null - [null, null, null, null, null] +17599 - null - [null, null, null, null, null] +17600 - Door - [Open, null, null, null, null] +17601 - Door - [Open, null, null, null, null] +17602 - null - [null, null, null, null, null] +17603 - null - [null, null, null, null, null] +17604 - null - [null, null, null, null, null] +17605 - null - [null, null, null, null, null] +17606 - null - [null, null, null, null, null] +17607 - null - [null, null, null, null, null] +17608 - null - [null, null, null, null, null] +17609 - null - [null, null, null, null, null] +17610 - null - [null, null, null, null, null] +17611 - null - [null, null, null, null, null] +17612 - null - [null, null, null, null, null] +17613 - null - [null, null, null, null, null] +17614 - null - [null, null, null, null, null] +17615 - null - [null, null, null, null, null] +17616 - null - [null, null, null, null, null] +17617 - null - [null, null, null, null, null] +17618 - null - [null, null, null, null, null] +17619 - null - [null, null, null, null, null] +17620 - null - [null, null, null, null, null] +17621 - null - [null, null, null, null, null] +17622 - null - [null, null, null, null, null] +17623 - null - [null, null, null, null, null] +17624 - null - [null, null, null, null, null] +17625 - null - [null, null, null, null, null] +17626 - Rubble - [null, null, null, null, null] +17627 - Washing Line - [null, null, null, null, null] +17628 - null - [null, null, null, null, null] +17629 - null - [null, null, null, null, null] +17630 - null - [null, null, null, null, null] +17631 - null - [null, null, null, null, null] +17632 - null - [null, null, null, null, null] +17633 - null - [null, null, null, null, null] +17634 - null - [null, null, null, null, null] +17635 - Scaffolding - [null, null, null, null, null] +17636 - Scaffolding - [null, null, null, null, null] +17637 - Ladder - [null, null, null, null, null] +17638 - null - [null, null, null, null, null] +17639 - null - [null, null, null, null, null] +17640 - Fireplace - [null, null, null, null, null] +17641 - Fireplace - [null, null, null, null, null] +17642 - Fireplace - [null, null, null, null, null] +17643 - Fireplace - [null, null, null, null, null] +17644 - Barricade - [null, null, null, null, null] +17645 - Barricade - [null, null, null, null, null] +17646 - Barricade - [null, null, null, null, null] +17647 - Sickle logo - [null, null, null, null, null] +17648 - Sickle logo - [null, null, null, null, null] +17649 - null - [null, null, null, null, null] +17650 - null - [null, null, null, null, null] +17651 - null - [null, null, null, null, null] +17652 - null - [null, null, null, null, null] +17653 - null - [null, null, null, null, null] +17654 - Barrel - [null, null, null, null, null] +17655 - Crate - [null, null, null, null, null] +17656 - Crates - [null, null, null, null, null] +17657 - Boxes - [null, null, null, null, null] +17658 - Crate - [null, null, null, null, null] +17659 - Staircase - [null, null, null, null, null] +17660 - Staircase - [null, null, null, null, null] +17661 - Table - [null, null, null, null, null] +17662 - Table - [null, null, null, null, null] +17663 - Chair - [null, null, null, null, null] +17664 - null - [null, null, null, null, null] +17665 - null - [null, null, null, null, null] +17666 - Table - [null, null, null, null, null] +17667 - Stool - [null, null, null, null, null] +17668 - Bunk bed - [Search, null, null, null, null] +17669 - Bunk bed - [Search, null, null, null, null] +17670 - Blackboard - [null, null, null, null, null] +17671 - Locker - [Search, null, null, null, null] +17672 - Locker - [Search, null, null, null, null] +17673 - null - [null, null, null, null, null] +17674 - null - [null, null, null, null, null] +17675 - null - [null, null, null, null, null] +17676 - Wall - [null, null, null, null, null] +17677 - Wall - [null, null, null, null, null] +17678 - Wall - [null, null, null, null, null] +17679 - Rock - [Jump, null, null, null, null] +17680 - Wall - [null, null, null, null, null] +17681 - Wall - [null, null, null, null, null] +17682 - Wall - [null, null, null, null, null] +17683 - Wall - [null, null, null, null, null] +17684 - Wall - [null, null, null, null, null] +17685 - Wall - [null, null, null, null, null] +17686 - Wall - [null, null, null, null, null] +17687 - Wall - [null, null, null, null, null] +17688 - Wall - [null, null, null, null, null] +17689 - null - [null, null, null, null, null] +17690 - null - [null, null, null, null, null] +17691 - null - [null, null, null, null, null] +17692 - null - [null, null, null, null, null] +17693 - null - [null, null, null, null, null] +17694 - null - [null, null, null, null, null] +17695 - null - [null, null, null, null, null] +17696 - null - [null, null, null, null, null] +17697 - null - [null, null, null, null, null] +17698 - Wall - [null, null, null, null, null] +17699 - null - [null, null, null, null, null] +17700 - null - [null, null, null, null, null] +17701 - null - [null, null, null, null, null] +17702 - Floor - [null, null, null, null, null] +17703 - null - [null, null, null, null, null] +17704 - null - [null, null, null, null, null] +17705 - null - [null, null, null, null, null] +17706 - null - [null, null, null, null, null] +17707 - null - [null, null, null, null, null] +17708 - null - [null, null, null, null, null] +17709 - Floor - [null, null, null, null, null] +17710 - Floor - [null, null, null, null, null] +17711 - Floor - [null, null, null, null, null] +17712 - Floor - [null, null, null, null, null] +17713 - null - [null, null, null, null, null] +17714 - null - [null, null, null, null, null] +17715 - null - [null, null, null, null, null] +17716 - null - [null, null, null, null, null] +17717 - null - [null, null, null, null, null] +17718 - null - [null, null, null, null, null] +17719 - null - [null, null, null, null, null] +17720 - null - [null, null, null, null, null] +17721 - null - [null, null, null, null, null] +17722 - null - [null, null, null, null, null] +17723 - null - [null, null, null, null, null] +17724 - null - [null, null, null, null, null] +17725 - null - [null, null, null, null, null] +17726 - null - [null, null, null, null, null] +17727 - null - [null, null, null, null, null] +17728 - null - [null, null, null, null, null] +17729 - null - [null, null, null, null, null] +17730 - null - [null, null, null, null, null] +17731 - null - [null, null, null, null, null] +17732 - null - [null, null, null, null, null] +17733 - null - [null, null, null, null, null] +17734 - null - [null, null, null, null, null] +17735 - null - [null, null, null, null, null] +17736 - null - [null, null, null, null, null] +17737 - null - [null, null, null, null, null] +17738 - null - [null, null, null, null, null] +17739 - null - [null, null, null, null, null] +17740 - null - [null, null, null, null, null] +17741 - null - [null, null, null, null, null] +17742 - null - [null, null, null, null, null] +17743 - null - [null, null, null, null, null] +17744 - null - [null, null, null, null, null] +17745 - null - [null, null, null, null, null] +17746 - null - [null, null, null, null, null] +17747 - null - [null, null, null, null, null] +17748 - null - [null, null, null, null, null] +17749 - null - [null, null, null, null, null] +17750 - null - [null, null, null, null, null] +17751 - null - [null, null, null, null, null] +17752 - null - [null, null, null, null, null] +17753 - null - [null, null, null, null, null] +17754 - null - [null, null, null, null, null] +17755 - null - [null, null, null, null, null] +17756 - null - [null, null, null, null, null] +17757 - Chair - [null, null, null, null, null] +17758 - Chair - [null, null, null, null, null] +17759 - Chair - [null, null, null, null, null] +17760 - Chair - [null, null, null, null, null] +17761 - Chair - [null, null, null, null, null] +17762 - Table - [null, null, null, null, null] +17763 - Bookcase - [null, null, null, null, null] +17764 - Bench - [null, null, null, null, null] +17765 - Grandfather clock - [null, null, null, null, null] +17766 - The middle of a fireplace - [null, null, null, null, null] +17767 - Left side of a fireplace - [null, null, null, null, null] +17768 - Right side of a fireplace - [null, null, null, null, null] +17769 - Ornate vase - [null, null, null, null, null] +17770 - null - [null, null, null, null, null] +17771 - null - [null, null, null, null, null] +17772 - null - [null, null, null, null, null] +17773 - null - [null, null, null, null, null] +17774 - null - [null, null, null, null, null] +17775 - null - [null, null, null, null, null] +17776 - null - [null, null, null, null, null] +17777 - null - [null, null, null, null, null] +17778 - null - [null, null, null, null, null] +17779 - null - [null, null, null, null, null] +17780 - null - [null, null, null, null, null] +17781 - null - [null, null, null, null, null] +17782 - Fence end - [null, null, null, null, null] +17783 - Fence mid - [null, null, null, null, null] +17784 - Fence corner - [null, null, null, null, null] +17785 - Fence t-piece - [null, null, null, null, null] +17786 - Single pillar - [null, null, null, null, null] +17787 - Fence mid - [null, null, null, null, null] +17788 - Fence corner - [null, null, null, null, null] +17789 - Fence bits - [null, null, null, null, null] +17790 - Fence mid - [null, null, null, null, null] +17791 - Fence mid - [null, null, null, null, null] +17792 - null - [null, null, null, null, null] +17793 - null - [null, null, null, null, null] +17794 - null - [null, null, null, null, null] +17795 - null - [null, null, null, null, null] +17796 - null - [null, null, null, null, null] +17797 - null - [null, null, null, null, null] +17798 - null - [null, null, null, null, null] +17799 - null - [null, null, null, null, null] +17800 - null - [null, null, null, null, null] +17801 - null - [null, null, null, null, null] +17802 - null - [null, null, null, null, null] +17803 - null - [null, null, null, null, null] +17804 - null - [null, null, null, null, null] +17805 - null - [null, null, null, null, null] +17806 - null - [null, null, null, null, null] +17807 - null - [null, null, null, null, null] +17808 - null - [null, null, null, null, null] +17809 - null - [null, null, null, null, null] +17810 - null - [null, null, null, null, null] +17811 - null - [null, null, null, null, null] +17812 - null - [null, null, null, null, null] +17813 - null - [null, null, null, null, null] +17814 - null - [null, null, null, null, null] +17815 - null - [null, null, null, null, null] +17816 - null - [null, null, null, null, null] +17817 - null - [null, null, null, null, null] +17818 - null - [null, null, null, null, null] +17819 - null - [null, null, null, null, null] +17820 - null - [null, null, null, null, null] +17821 - null - [null, null, null, null, null] +17822 - null - [null, null, null, null, null] +17823 - null - [null, null, null, null, null] +17824 - null - [null, null, null, null, null] +17825 - null - [null, null, null, null, null] +17826 - null - [null, null, null, null, null] +17827 - null - [null, null, null, null, null] +17828 - Rock wall - [null, null, null, null, null] +17829 - null - [null, null, null, null, null] +17830 - null - [null, null, null, null, null] +17831 - null - [null, null, null, null, null] +17832 - null - [null, null, null, null, null] +17833 - null - [null, null, null, null, null] +17834 - null - [null, null, null, null, null] +17835 - null - [null, null, null, null, null] +17836 - null - [null, null, null, null, null] +17837 - null - [null, null, null, null, null] +17838 - null - [null, null, null, null, null] +17839 - null - [null, null, null, null, null] +17840 - null - [null, null, null, null, null] +17841 - null - [null, null, null, null, null] +17842 - null - [null, null, null, null, null] +17843 - null - [null, null, null, null, null] +17844 - null - [null, null, null, null, null] +17845 - null - [null, null, null, null, null] +17846 - Rift - [null, null, null, null, null] +17847 - Rift - [null, null, null, null, null] +17848 - Rift - [null, null, null, null, null] +17849 - Rift - [null, null, null, null, null] +17850 - Rift - [null, null, null, null, null] +17851 - Rift - [null, null, null, null, null] +17852 - Rift - [null, null, null, null, null] +17853 - Rift - [null, null, null, null, null] +17854 - Rift - [null, null, null, null, null] +17855 - Rift - [null, null, null, null, null] +17856 - Rift - [null, null, null, null, null] +17857 - null - [null, null, null, null, null] +17858 - null - [null, null, null, null, null] +17859 - null - [null, null, null, null, null] +17860 - null - [null, null, null, null, null] +17861 - null - [null, null, null, null, null] +17862 - null - [null, null, null, null, null] +17863 - null - [null, null, null, null, null] +17864 - null - [null, null, null, null, null] +17865 - null - [null, null, null, null, null] +17866 - null - [null, null, null, null, null] +17867 - null - [null, null, null, null, null] +17868 - null - [null, null, null, null, null] +17869 - null - [null, null, null, null, null] +17870 - null - [null, null, null, null, null] +17871 - null - [null, null, null, null, null] +17872 - null - [null, null, null, null, null] +17873 - null - [null, null, null, null, null] +17874 - null - [null, null, null, null, null] +17875 - null - [null, null, null, null, null] +17876 - null - [null, null, null, null, null] +17877 - null - [null, null, null, null, null] +17878 - null - [null, null, null, null, null] +17879 - Rift - [null, null, null, null, null] +17880 - Rift - [null, null, null, null, null] +17881 - Rift - [null, null, null, null, null] +17882 - Rift - [null, null, null, null, null] +17883 - Rift - [null, null, null, null, null] +17884 - Rift - [null, null, null, null, null] +17885 - Rift - [null, null, null, null, null] +17886 - Rift - [null, null, null, null, null] +17887 - Rift - [null, null, null, null, null] +17888 - Rift - [null, null, null, null, null] +17889 - Rift - [null, null, null, null, null] +17890 - Bookshelf - [null, null, null, null, null] +17891 - Bookshelf - [null, null, null, null, null] +17892 - null - [null, null, null, null, null] +17893 - Lab table - [null, null, null, null, null] +17894 - Lab table - [null, null, null, null, null] +17895 - Lab table - [null, null, null, null, null] +17896 - Lab table - [null, null, null, null, null] +17897 - Lab tube - [null, null, null, null, null] +17898 - Lab tube - [null, null, null, null, null] +17899 - Experiment booth - [null, null, null, null, null] +17900 - null - [null, null, null, null, null] +17901 - null - [null, null, null, null, null] +17902 - null - [null, null, null, null, null] +17903 - null - [null, null, null, null, null] +17904 - Barrel - [null, null, null, null, null] +17905 - Crate - [null, null, null, null, null] +17906 - Crates - [null, null, null, null, null] +17907 - Boxes - [null, null, null, null, null] +17908 - Crate - [null, null, null, null, null] +17909 - Stool - [null, null, null, null, null] +17910 - Stool - [null, null, null, null, null] +17911 - null - [null, null, null, null, null] +17912 - null - [null, null, null, null, null] +17913 - null - [null, null, null, null, null] +17914 - null - [null, null, null, null, null] +17915 - null - [null, null, null, null, null] +17916 - null - [null, null, null, null, null] +17917 - null - [null, null, null, null, null] +17918 - null - [null, null, null, null, null] +17919 - null - [null, null, null, null, null] +17920 - null - [null, null, null, null, null] +17921 - null - [null, null, null, null, null] +17922 - null - [null, null, null, null, null] +17923 - null - [null, null, null, null, null] +17924 - null - [null, null, null, null, null] +17925 - null - [null, null, null, null, null] +17926 - null - [null, null, null, null, null] +17927 - null - [null, null, null, null, null] +17928 - null - [null, null, null, null, null] +17929 - null - [null, null, null, null, null] +17930 - null - [null, null, null, null, null] +17931 - null - [null, null, null, null, null] +17932 - null - [null, null, null, null, null] +17933 - null - [null, null, null, null, null] +17934 - Wall - [null, null, null, null, null] +17935 - Wall - [null, null, null, null, null] +17936 - Wall - [null, null, null, null, null] +17937 - Wall - [null, null, null, null, null] +17938 - Wall - [null, null, null, null, null] +17939 - Wall - [null, null, null, null, null] +17940 - Wall - [null, null, null, null, null] +17941 - Wall - [null, null, null, null, null] +17942 - null - [null, null, null, null, null] +17943 - Wall - [null, null, null, null, null] +17944 - null - [null, null, null, null, null] +17945 - null - [null, null, null, null, null] +17946 - null - [null, null, null, null, null] +17947 - null - [null, null, null, null, null] +17948 - null - [null, null, null, null, null] +17949 - null - [null, null, null, null, null] +17950 - null - [null, null, null, null, null] +17951 - null - [null, null, null, null, null] +17952 - null - [null, null, null, null, null] +17953 - Boat - [Search, null, null, null, null] +17954 - Boat - [Search, Push, null, null, null] +17955 - Boat - [Board, null, null, null, null] +17956 - Boat Chute - [Look-at, null, null, null, null] +17957 - Boat Chute - [Look-at, null, null, null, null] +17958 - Rock - [Jump-onto, null, null, null, null] +17959 - Rock - [Climb-up, null, null, null, null] +17960 - Rock - [Climb-down, null, null, null, null] +17961 - Boat - [Jump-onto, null, null, null, null] +17962 - Daeyalt rocks - [Mine, Prospect, null, null, null] +17963 - Daeyalt rocks - [Mine, Prospect, null, null, null] +17964 - Daeyalt rocks - [Mine, Prospect, null, null, null] +17965 - Daeyalt rocks - [null, Prospect, null, null, null] +17966 - Mine cart - [Search, null, null, null, null] +17967 - Mine cart - [Search, null, null, null, null] +17968 - Mine cart - [Search, null, null, null, null] +17969 - Mine cart - [Search, null, null, null, null] +17970 - Rock - [Jump-to, null, null, null, null] +17971 - Rock - [Climb-down, null, null, null, null] +17972 - Rock - [Climb-down, null, null, null, null] +17973 - Door - [Open, null, null, null, null] +17974 - Ladder - [Climb-up, null, null, null, null] +17975 - Ladder - [Climb-down, null, null, null, null] +17976 - Stairs up - [Climb-up, null, null, null, null] +17977 - Broken stairs - [Climb-up, null, null, null, null] +17978 - Stairs down - [Climb-down, null, null, null, null] +17979 - Broken stairs - [Climb-down, null, null, null, null] +17980 - Wall - [null, null, null, Search, Push] +17981 - null - [null, null, null, null, null] +17982 - Decorated wall - [null, Search, null, null, Press] +17983 - Rug - [null, null, null, null, null] +17984 - Lumpy rug - [Open, null, null, null, null] +17985 - Trapdoor - [Climb-down, Close, null, null, null] +17986 - Ladder - [Climb-up, null, null, null, null] +17987 - Boxes - [Search, null, null, null, null] +17988 - Bush - [null, null, null, null, null] +17989 - Bush - [Search, null, null, null, null] +17990 - Bush - [null, null, null, null, null] +17991 - Bush - [null, null, null, null, null] +17992 - null - [null, null, null, null, null] +17993 - null - [null, null, null, null, null] +17994 - null - [null, null, null, null, null] +17995 - Ladder - [null, Climb-down, null, null, null] +17996 - Ladder - [Climb-up, null, null, null, null] +17997 - Ladder - [Climb-up, null, null, null, null] +17998 - Ladder - [null, Climb-down, null, null, null] +17999 - Ladder - [null, Climb-down, null, null, null] +18000 - Ladder - [null, Climb-up, null, null, null] +18001 - Ladder - [null, Climb-down, null, null, null] +18002 - Ladder - [null, Climb-up, null, null, null] +18003 - null - [null, null, null, null, null] +18004 - null - [null, null, null, null, null] +18005 - null - [null, null, null, null, null] +18006 - Barrel of fishbones - [null, null, null, null, null] +18007 - Corner Table - [null, null, null, null, null] +18008 - Cutting Table - [null, null, null, null, null] +18009 - Broken fish display - [null, null, null, null, null] +18010 - Stagnant fish display - [null, null, null, null, null] +18011 - A fallen barrel - [null, null, null, null, null] +18012 - Broken barrel - [null, null, null, null, null] +18013 - Stacked crates - [null, null, null, null, null] +18014 - Table and till - [null, null, null, null, null] +18015 - Barrel - [null, null, null, null, null] +18016 - Broken counter - [null, null, null, null, null] +18017 - Counter - [null, null, null, null, null] +18018 - Counter - [null, null, null, null, null] +18019 - null - [null, null, null, null, null] +18020 - null - [null, null, null, null, null] +18021 - null - [null, null, null, null, null] +18022 - null - [null, null, null, null, null] +18023 - null - [null, null, null, null, null] +18024 - null - [null, null, null, null, null] +18025 - null - [null, null, null, null, null] +18026 - null - [null, null, null, null, null] +18027 - null - [null, null, null, null, null] +18028 - Skeleton - [null, null, null, null, null] +18029 - Skeleton - [null, null, null, null, null] +18030 - Machine - [null, null, null, null, null] +18031 - Door - [Close, null, null, null, null] +18032 - Door - [Close, null, null, null, null] +18033 - Floor - [Search, null, null, null, Kick-down] +18034 - Floor - [null, null, null, null, Climb-down] +18035 - Floor - [null, null, null, null, null] +18036 - Floor - [Climb-up, null, null, null, null] +18037 - Wall rubble - [Climb-over, null, null, null, null] +18038 - Wall rubble - [Climb-over, null, null, null, null] +18039 - Fireplace - [Look-at, null, null, null, null] +18040 - Tapestry - [null, null, null, null, null] +18041 - Slashed tapestry - [null, null, null, null, Walk-through] +18042 - Portrait - [null, null, null, null, Look-at] +18043 - Portrait - [Search, null, null, null, Look-at] +18044 - Portrait - [Search, null, null, null, Look-at] +18045 - Vampyre statue - [null, null, Search, null, null] +18046 - Statue with key - [null, null, Search, null, null] +18047 - Door - [Open, null, null, null, null] +18048 - Door - [null, null, null, null, null] +18049 - Staircase - [Climb-down, null, null, null, null] +18050 - Staircase - [Climb-up, null, null, null, null] +18051 - Table - [Search, null, null, null, null] +18052 - Broken rune case - [null, Search, null, null, null] +18053 - Rubble - [null, null, null, null, null] +18054 - Barricade - [Open, null, null, null, null] +18055 - Barricade - [null, null, null, null, null] +18056 - Rocky surface - [Look-at, Search, null, null, null] +18057 - Door - [Open, null, null, null, null] +18058 - Door - [null, null, null, null, null] +18059 - Table - [Search, null, null, null, null] +18060 - Trapdoor table - [Open, null, null, null, null] +18061 - Trapdoor tunnel - [Climb-into, null, null, null, null] +18062 - Table - [Search, null, null, null, null] +18063 - Trapdoor table - [Open, null, null, null, null] +18064 - Trapdoor table - [null, null, null, null, null] +18065 - Pots - [Search, null, null, null, null] +18066 - Wall - [Search, null, null, null, null] +18067 - Wall - [Search, null, null, null, null] +18068 - Broken ladder - [Search, null, null, null, null] +18069 - Ladder - [Climb-down, null, null, null, null] +18070 - Floorboards - [null, null, null, null, Jump-to] +18071 - Floorboards - [null, null, null, null, Jump-to] +18072 - Floorboards - [null, null, null, null, Jump-to] +18073 - Floorboards - [null, null, null, null, Jump-to] +18074 - Wall - [null, null, null, null, Push] +18075 - Wall - [null, null, null, null, null] +18076 - Floor - [Walk-across, null, null, null, null] +18077 - Floor - [Walk-across, null, null, null, null] +18078 - Wall - [null, null, null, null, Crawl-under] +18079 - Wall - [null, null, null, null, Push] +18080 - Wall - [null, null, null, null, null] +18081 - Floor - [Walk-across, null, null, null, null] +18082 - Floor - [Walk-across, null, null, null, null] +18083 - null - [null, null, null, null, null] +18084 - null - [null, null, null, null, null] +18085 - Tunnel - [null, null, null, null, Climb-into] +18086 - Shelf - [null, null, null, null, Climb-up] +18087 - Shelf - [null, null, null, null, Climb-down] +18088 - Wall - [null, null, null, null, Crawl-under] +18089 - Floorboards - [null, null, null, null, Jump-to] +18090 - Floorboards - [null, null, null, null, Jump-to] +18091 - Door - [Open, null, null, null, null] +18092 - Door - [Open, null, null, null, null] +18093 - Floorboards - [null, null, null, null, Jump-to] +18094 - Floorboards - [null, null, null, null, Jump-to] +18095 - Shelf - [null, null, null, null, Climb-up] +18096 - Shelf - [null, null, null, null, Climb-down] +18097 - Floorboards - [null, null, null, null, Jump-to] +18098 - Floorboards - [null, null, null, null, Jump-to] +18099 - Washing line - [null, null, null, null, Walk-across] +18100 - Washing line - [null, null, null, null, Walk-across] +18101 - Wall - [null, null, null, null, Push] +18102 - Falling door - [null, null, null, null, null] +18103 - Floor - [Walk-across, null, null, null, null] +18104 - Floor - [Walk-across, null, null, null, null] +18105 - Shelf - [null, null, null, null, Climb-up] +18106 - Shelf - [null, null, null, null, Climb-down] +18107 - Shelf - [null, null, null, null, Climb-down] +18108 - Shelf - [null, null, null, null, Climb-up] +18109 - Floorboards - [null, null, null, null, Jump-to] +18110 - Floorboards - [null, null, null, null, Jump-to] +18111 - Floorboards - [null, null, null, null, Jump-to] +18112 - Floorboards - [null, null, null, null, Jump-to] +18113 - Floorboards - [null, null, null, null, Jump-to] +18114 - Floorboards - [null, null, null, null, Jump-to] +18115 - null - [null, null, null, null, null] +18116 - null - [null, null, null, null, null] +18117 - Floorboards - [null, null, null, null, Jump-to] +18118 - Floorboards - [null, null, null, null, Jump-to] +18119 - null - [null, null, null, null, null] +18120 - null - [null, null, null, null, null] +18121 - null - [null, null, null, null, null] +18122 - null - [null, null, null, null, null] +18123 - null - [null, null, null, null, null] +18124 - null - [null, null, null, null, null] +18125 - null - [null, null, null, null, null] +18126 - null - [null, null, null, null, null] +18127 - null - [null, null, null, null, null] +18128 - null - [null, null, null, null, null] +18129 - null - [null, null, null, null, null] +18130 - null - [null, null, null, null, null] +18131 - null - [null, null, null, null, null] +18132 - null - [null, null, null, null, null] +18133 - null - [null, null, null, null, null] +18134 - null - [null, null, null, null, null] +18135 - null - [null, null, null, null, null] +18136 - null - [null, null, null, null, null] +18137 - Windswept tree - [Chop down, null, null, null, null] +18138 - null - [null, null, null, null, null] +18139 - null - [null, null, null, null, null] +18140 - null - [null, null, null, null, null] +18141 - null - [null, null, null, null, null] +18142 - null - [null, null, null, null, null] +18143 - null - [null, null, null, null, null] +18144 - Decorated wall - [null, Search, null, null, Press] +18145 - Decorated wall - [null, Search, null, null, null] +18146 - null - [null, null, null, null, null] +18147 - null - [null, null, null, null, null] +18148 - null - [null, null, null, null, null] +18149 - null - [null, null, null, null, null] +18150 - null - [null, null, null, null, null] +18151 - null - [null, null, null, null, null] +18152 - null - [null, null, null, null, null] +18153 - null - [null, null, null, null, null] +18154 - Smashed table - [null, null, null, null, null] +18155 - Shelf - [Search, null, null, null, null] +18156 - Shelf - [Search, null, null, null, null] +18157 - Dolls and balls - [null, null, null, null, null] +18158 - null - [null, null, null, null, null] +18159 - null - [null, null, null, null, null] +18160 - null - [null, null, null, null, null] +18161 - null - [null, null, null, null, null] +18162 - null - [null, null, null, null, null] +18163 - null - [null, null, null, null, null] +18164 - null - [null, null, null, null, null] +18165 - null - [null, null, null, null, null] +18166 - null - [null, null, null, null, null] +18167 - null - [null, null, null, null, null] +18168 - Door - [Open, null, null, null, null] +18169 - null - [null, null, null, null, null] +18170 - Clay oven - [null, null, null, null, null] +18171 - Washbasin - [null, null, null, null, null] +18172 - Hammock - [null, null, null, null, null] +18173 - null - [null, null, null, null, null] +18174 - null - [null, null, null, null, null] +18175 - null - [null, null, null, null, null] +18176 - Large table - [null, null, null, null, null] +18177 - Display table - [null, null, null, null, null] +18178 - Display table - [null, null, null, null, null] +18179 - null - [null, null, null, null, null] +18180 - null - [null, null, null, null, null] +18181 - null - [null, null, null, null, null] +18182 - Barrel - [null, null, null, null, null] +18183 - Bucket - [null, null, null, null, null] +18184 - Suit of armour - [null, null, null, null, null] +18185 - Suit of armour - [null, null, null, null, null] +18186 - Rowboat - [null, null, null, null, null] +18187 - Rowboat - [null, null, null, null, null] +18188 - null - [null, null, null, null, null] +18189 - Broken boat - [null, null, null, null, null] +18190 - Broken boat - [null, null, null, null, null] +18191 - Broken boat - [null, null, null, null, null] +18192 - null - [null, null, null, null, null] +18193 - null - [null, null, null, null, null] +18194 - null - [null, null, null, null, null] +18195 - null - [null, null, null, null, null] +18196 - null - [null, null, null, null, null] +18197 - null - [null, null, null, null, null] +18198 - null - [null, null, null, null, null] +18199 - null - [null, null, null, null, null] +18200 - A barrel of rainwater - [null, null, null, null, null] +18201 - Stacked crates - [null, null, null, null, null] +18202 - Crates - [null, null, null, null, null] +18203 - null - [null, null, null, null, null] +18204 - null - [null, null, null, null, null] +18205 - Barrel - [null, null, null, null, null] +18206 - null - [null, null, null, null, null] +18207 - null - [null, null, null, null, null] +18208 - Life buoy - [null, null, null, null, null] +18209 - null - [null, null, null, null, null] +18210 - null - [null, null, null, null, null] +18211 - null - [null, null, null, null, null] +18212 - null - [null, null, null, null, null] +18213 - null - [null, null, null, null, null] +18214 - null - [null, null, null, null, null] +18215 - null - [null, null, null, null, null] +18216 - null - [null, null, null, null, null] +18217 - null - [null, null, null, null, null] +18218 - null - [null, null, null, null, null] +18219 - null - [null, null, null, null, null] +18220 - Pillar - [null, null, null, null, null] +18221 - Study desk - [Search, null, null, null, null] +18222 - Painting - [null, null, null, null, null] +18223 - Painting - [null, null, null, null, null] +18224 - Painting - [null, null, null, null, null] +18225 - Sailfish - [null, null, null, null, null] +18226 - Shark head - [null, null, null, null, null] +18227 - Large vase - [null, null, null, null, null] +18228 - Small vase - [null, null, null, null, null] +18229 - Vase set - [null, null, null, null, null] +18230 - Ladder - [Climb-up, null, null, null, null] +18231 - Ladder - [Climb-down, null, null, null, null] +18232 - Ladder - [Climb-up, null, null, null, null] +18233 - Ladder - [Climb-down, null, null, null, null] +18234 - Bench - [null, null, null, null, null] +18235 - Bookcase - [null, null, null, null, null] +18236 - Drawers - [null, null, null, null, null] +18237 - Wardrobe - [null, null, null, null, null] +18238 - Dummy - [null, null, null, null, null] +18239 - Anchor - [null, null, null, null, null] +18240 - Bed - [null, null, null, null, null] +18241 - Lectern - [null, null, null, null, null] +18242 - null - [null, null, null, null, null] +18243 - null - [null, null, null, null, null] +18244 - null - [null, null, null, null, null] +18245 - null - [null, null, null, null, null] +18246 - null - [null, null, null, null, null] +18247 - null - [null, null, null, null, null] +18248 - null - [null, null, null, null, null] +18249 - null - [null, null, null, null, null] +18250 - null - [null, null, null, null, null] +18251 - null - [null, null, null, null, null] +18252 - null - [null, null, null, null, null] +18253 - null - [null, null, null, null, null] +18254 - Altar - [Pray, null, null, null, null] +18255 - null - [null, null, null, null, null] +18256 - Steeple - [null, null, null, null, null] +18257 - Pillar - [null, null, null, null, null] +18258 - Pillar - [null, null, null, null, null] +18259 - Statue - [null, null, null, null, null] +18260 - null - [null, null, null, null, null] +18261 - null - [null, null, null, null, null] +18262 - null - [null, null, null, null, null] +18263 - null - [null, null, null, null, null] +18264 - null - [null, null, null, null, null] +18265 - null - [null, null, null, null, null] +18266 - Old ruin entrance - [Climb-down, null, null, null, null] +18267 - null - [null, null, null, null, null] +18268 - null - [null, null, null, null, null] +18269 - null - [null, null, null, null, null] +18270 - null - [null, null, null, null, null] +18271 - null - [null, null, null, null, null] +18272 - null - [null, null, null, null, null] +18273 - null - [null, null, null, null, null] +18274 - null - [null, null, null, null, null] +18275 - null - [null, null, null, null, null] +18276 - null - [null, null, null, null, null] +18277 - null - [null, null, null, null, null] +18278 - null - [null, null, null, null, null] +18279 - null - [null, null, null, null, null] +18280 - null - [null, null, null, null, null] +18281 - null - [null, null, null, null, null] +18282 - null - [null, null, null, null, null] +18283 - null - [null, null, null, null, null] +18284 - null - [null, null, null, null, null] +18285 - null - [null, null, null, null, null] +18286 - null - [null, null, null, null, null] +18287 - null - [null, null, null, null, null] +18288 - null - [null, null, null, null, null] +18289 - null - [null, null, null, null, null] +18290 - null - [null, null, null, null, null] +18291 - null - [null, null, null, null, null] +18292 - null - [null, null, null, null, null] +18293 - null - [null, null, null, null, null] +18294 - null - [null, null, null, null, null] +18295 - null - [null, null, null, null, null] +18296 - null - [null, null, null, null, null] +18297 - null - [null, null, null, null, null] +18298 - null - [null, null, null, null, null] +18299 - null - [null, null, null, null, null] +18300 - null - [null, null, null, null, null] +18301 - null - [null, null, null, null, null] +18302 - null - [null, null, null, null, null] +18303 - null - [null, null, null, null, null] +18304 - Chest - [Open, null, null, null, null] +18305 - null - [null, null, null, null, null] +18306 - null - [null, null, null, null, null] +18307 - null - [null, null, null, null, null] +18308 - null - [null, null, null, null, null] +18309 - null - [null, null, null, null, null] +18310 - null - [null, null, null, null, null] +18311 - null - [null, null, null, null, null] +18312 - Stool - [null, null, null, null, null] +18313 - null - [null, null, null, null, null] +18314 - Table - [null, null, null, null, null] +18315 - null - [null, null, null, null, null] +18316 - Chair - [null, null, null, null, null] +18317 - Hanger - [null, null, null, null, null] +18318 - Mirror - [null, null, null, null, null] +18319 - null - [null, null, null, null, null] +18320 - null - [null, null, null, null, null] +18321 - Chest - [null, Search, Shut, null, null] +18322 - Ladder - [Climb-down, null, null, null, null] +18323 - null - [null, null, null, null, null] +18324 - Ladder - [Climb-up, null, null, null, null] +18325 - Ladder - [Climb-down, null, null, null, null] +18326 - Crane - [null, null, null, null, null] +18327 - Crane - [Rotate, null, null, null, null] +18328 - null - [null, null, null, null, null] +18329 - null - [null, null, null, null, null] +18330 - null - [null, null, null, null, null] +18331 - null - [null, null, null, null, null] +18332 - null - [null, null, null, null, null] +18333 - null - [null, null, null, null, null] +18334 - null - [null, null, null, null, null] +18335 - null - [null, null, null, null, null] +18336 - null - [null, null, null, null, null] +18337 - null - [null, null, null, null, null] +18338 - null - [null, null, null, null, null] +18339 - null - [null, null, null, null, null] +18340 - null - [null, null, null, null, null] +18341 - null - [null, null, null, null, null] +18342 - null - [null, null, null, null, null] +18343 - null - [null, null, null, null, null] +18344 - null - [null, null, null, null, null] +18345 - null - [null, null, null, null, null] +18346 - null - [null, null, null, null, null] +18347 - null - [null, null, null, null, null] +18348 - null - [null, null, null, null, null] +18349 - null - [null, null, null, null, null] +18350 - null - [null, null, null, null, null] +18351 - Barrel - [null, null, null, null, null] +18352 - Wreck - [null, null, null, null, null] +18353 - Wreck - [null, null, null, null, null] +18354 - Wreck - [null, null, null, null, null] +18355 - Wreck - [null, null, null, null, null] +18356 - Wreck - [null, null, null, null, null] +18357 - Wreck - [null, null, null, null, null] +18358 - null - [null, null, null, null, null] +18359 - null - [null, null, null, null, null] +18360 - null - [null, null, null, null, null] +18361 - null - [null, null, null, null, null] +18362 - Bed - [null, null, null, null, null] +18363 - Child's bed - [null, null, null, null, null] +18364 - Floats - [null, null, null, null, null] +18365 - Broken boat - [null, null, null, null, null] +18366 - Crow nest - [null, null, null, null, null] +18367 - Crate - [null, null, null, null, null] +18368 - Crate - [null, null, null, null, null] +18369 - null - [null, null, null, null, null] +18370 - null - [null, null, null, null, null] +18371 - null - [null, null, null, null, null] +18372 - null - [null, null, null, null, null] +18373 - null - [null, null, null, null, null] +18374 - null - [null, null, null, null, null] +18375 - null - [null, null, null, null, null] +18376 - null - [null, null, null, null, null] +18377 - null - [null, null, null, null, null] +18378 - null - [null, null, null, null, null] +18379 - null - [null, null, null, null, null] +18380 - Broken wall - [null, null, null, null, null] +18381 - Badly repaired wall - [Kick, null, null, null, null] +18382 - null - [null, null, null, null, null] +18383 - null - [null, null, null, null, null] +18384 - null - [null, null, null, null, null] +18385 - null - [null, null, null, null, null] +18386 - null - [null, null, null, null, null] +18387 - null - [null, null, null, null, null] +18388 - null - [null, null, null, null, null] +18389 - null - [null, null, null, null, null] +18390 - null - [null, null, null, null, null] +18391 - null - [null, null, null, null, null] +18392 - null - [null, null, null, null, null] +18393 - null - [null, null, null, null, null] +18394 - null - [null, null, null, null, null] +18395 - null - [null, null, null, null, null] +18396 - null - [null, null, null, null, null] +18397 - null - [null, null, null, null, null] +18398 - null - [null, null, null, null, null] +18399 - Bone barrel - [null, null, null, null, null] +18400 - Ice cube - [null, null, null, null, null] +18401 - null - [null, null, null, null, null] +18402 - null - [null, null, null, null, null] +18403 - Kennith's ball - [null, null, null, null, null] +18404 - Bottle - [null, null, null, null, null] +18405 - null - [null, null, null, null, null] +18406 - null - [null, null, null, null, null] +18407 - null - [null, null, null, null, null] +18408 - null - [null, null, null, null, null] +18409 - null - [null, null, null, null, null] +18410 - null - [null, null, null, null, null] +18411 - Broken fence - [Climb-over, null, null, null, null] +18412 - Broken boat - [null, null, null, null, null] +18413 - null - [null, null, null, null, null] +18414 - null - [null, null, null, null, null] +18415 - null - [null, null, null, null, null] +18416 - null - [null, null, null, null, null] +18417 - null - [null, null, null, null, null] +18418 - Wall corner - [null, null, null, null, null] +18419 - null - [null, null, null, null, null] +18420 - null - [null, null, null, null, null] +18421 - null - [null, null, null, null, null] +18422 - null - [null, null, null, null, null] +18423 - null - [null, null, null, null, null] +18424 - null - [null, null, null, null, null] +18425 - null - [null, null, null, null, null] +18426 - Torture Rack - [null, null, null, null, null] +18427 - Exit - [Climb-up, null, null, null, null] +18428 - null - [null, null, null, null, null] +18429 - null - [null, null, null, null, null] +18430 - Wall - [Push, null, null, null, null] +18431 - Wall opening - [Enter, null, null, null, null] +18432 - null - [null, null, null, null, null] +18433 - null - [null, null, null, null, null] +18434 - null - [null, null, null, null, null] +18435 - null - [null, null, null, null, null] +18436 - null - [null, null, null, null, null] +18437 - null - [null, null, null, null, null] +18438 - null - [null, null, null, null, null] +18439 - null - [null, null, null, null, null] +18440 - Passage - [Enter, null, null, null, null] +18441 - Imposing Doors - [Open, null, null, null, null] +18442 - Imposing Doors - [Open, null, null, null, null] +18443 - Imposing Doors - [Open, null, null, null, null] +18444 - Shortcut - [Climb-through, null, null, null, null] +18445 - null - [null, null, null, null, null] +18446 - null - [null, null, null, null, null] +18447 - null - [null, null, null, null, null] +18448 - null - [null, null, null, null, null] +18449 - null - [null, null, null, null, null] +18450 - null - [null, null, null, null, null] +18451 - null - [null, null, null, null, null] +18452 - null - [null, null, null, null, null] +18453 - null - [null, null, null, null, null] +18454 - null - [null, null, null, null, null] +18455 - null - [null, null, null, null, null] +18456 - null - [null, null, null, null, null] +18457 - null - [null, null, null, null, null] +18458 - null - [null, null, null, null, null] +18459 - null - [null, null, null, null, null] +18460 - null - [null, null, null, null, null] +18461 - null - [null, null, null, null, null] +18462 - Slug goo - [null, null, null, null, null] +18463 - null - [null, null, null, null, null] +18464 - null - [null, null, null, null, null] +18465 - null - [null, null, null, null, null] +18466 - null - [null, null, null, null, null] +18467 - null - [null, null, null, null, null] +18468 - null - [null, null, null, null, null] +18469 - null - [null, null, null, null, null] +18470 - null - [null, null, null, null, null] +18471 - null - [null, null, null, null, null] +18472 - null - [null, null, null, null, null] +18473 - null - [null, null, null, null, null] +18474 - null - [null, null, null, null, null] +18475 - null - [null, null, null, null, null] +18476 - null - [null, null, null, null, null] +18477 - null - [null, null, null, null, null] +18478 - null - [null, null, null, null, null] +18479 - null - [null, null, null, null, null] +18480 - null - [null, null, null, null, null] +18481 - null - [null, null, null, null, null] +18482 - Big fish - [null, null, null, null, null] +18483 - Shelves - [null, null, null, null, null] +18484 - null - [null, null, null, null, null] +18485 - Stool - [null, null, null, null, null] +18486 - Table - [null, null, null, null, null] +18487 - null - [null, null, null, null, null] +18488 - Bench - [null, null, null, null, null] +18489 - Door - [Open, null, null, null, null] +18490 - Door - [Close, null, null, null, null] +18491 - Bank booth - [Use, Use-quickly, Collect, null, null] +18492 - Closed booth - [null, null, null, null, null] +18493 - Signpost - [Read, null, null, null, null] +18494 - null - [null, null, null, null, null] +18495 - Bookcase - [Search, null, null, null, null] +18496 - null - [null, null, null, null, null] +18497 - Furnace - [null, Smelt, null, null, null] +18498 - null - [null, null, null, null, null] +18499 - null - [null, null, null, null, null] +18500 - null - [null, null, null, null, null] +18501 - Crane - [null, null, null, null, null] +18502 - Crate - [Search, null, null, null, null] +18503 - Staircase - [Climb-up, null, null, null, null] +18504 - Staircase - [Climb-down, null, null, null, null] +18505 - Odd looking wall - [Pass, null, null, null, null] +18506 - Crate - [Search, null, null, null, null] +18507 - Crate - [Search, null, null, null, null] +18508 - Crates - [Search, null, null, null, null] +18509 - Water controls - [Turn, null, null, null, null] +18510 - Water controls - [Turn, null, null, null, null] +18511 - Water wheel - [null, null, null, null, null] +18512 - Water wheel - [null, null, null, null, null] +18513 - null - [null, null, null, null, null] +18514 - null - [null, null, null, null, null] +18515 - Bellows - [null, null, null, null, null] +18516 - Bellows - [Fix, null, null, null, null] +18517 - null - [null, null, null, null, null] +18518 - null - [null, null, null, null, null] +18519 - Lava trough - [null, null, null, null, null] +18520 - Lava trough - [null, null, null, null, null] +18521 - Lava trough - [null, null, null, null, null] +18522 - Lava trough - [null, null, null, null, null] +18523 - Lava trough - [null, null, null, null, null] +18524 - null - [null, null, null, null, null] +18525 - Furnace - [null, null, null, null, null] +18526 - Furnace - [null, null, null, null, null] +18527 - null - [null, null, null, null, null] +18528 - null - [null, null, null, null, null] +18529 - null - [null, null, null, null, null] +18530 - Machinery - [null, null, null, null, null] +18531 - null - [null, null, null, null, null] +18532 - null - [null, null, null, null, null] +18533 - null - [null, null, null, null, null] +18534 - null - [null, null, null, null, null] +18535 - null - [null, null, null, null, null] +18536 - null - [null, null, null, null, null] +18537 - null - [null, null, null, null, null] +18538 - null - [null, null, null, null, null] +18539 - null - [null, null, null, null, null] +18540 - null - [null, null, null, null, null] +18541 - null - [null, null, null, null, null] +18542 - null - [null, null, null, null, null] +18543 - null - [null, null, null, null, null] +18544 - null - [null, null, null, null, null] +18545 - null - [null, null, null, null, null] +18546 - null - [null, null, null, null, null] +18547 - null - [null, null, null, null, null] +18548 - null - [null, null, null, null, null] +18549 - null - [null, null, null, null, null] +18550 - null - [null, null, null, null, null] +18551 - null - [null, null, null, null, null] +18552 - null - [null, null, null, null, null] +18553 - null - [null, null, null, null, null] +18554 - null - [null, null, null, null, null] +18555 - null - [null, null, null, null, null] +18556 - null - [null, null, null, null, null] +18557 - null - [null, null, null, null, null] +18558 - null - [null, null, null, null, null] +18559 - null - [null, null, null, null, null] +18560 - null - [null, null, null, null, null] +18561 - null - [null, null, null, null, null] +18562 - null - [null, null, null, null, null] +18563 - null - [null, null, null, null, null] +18564 - null - [null, null, null, null, null] +18565 - null - [null, null, null, null, null] +18566 - null - [null, null, null, null, null] +18567 - null - [null, null, null, null, null] +18568 - null - [null, null, null, null, null] +18569 - null - [null, null, null, null, null] +18570 - null - [null, null, null, null, null] +18571 - null - [null, null, null, null, null] +18572 - null - [null, null, null, null, null] +18573 - null - [null, null, null, null, null] +18574 - null - [null, null, null, null, null] +18575 - null - [null, null, null, null, null] +18576 - null - [null, null, null, null, null] +18577 - null - [null, null, null, null, null] +18578 - null - [null, null, null, null, null] +18579 - null - [null, null, null, null, null] +18580 - null - [null, null, null, null, null] +18581 - null - [null, null, null, null, null] +18582 - null - [null, null, null, null, null] +18583 - null - [null, null, null, null, null] +18584 - null - [null, null, null, null, null] +18585 - null - [null, null, null, null, null] +18586 - null - [null, null, null, null, null] +18587 - Machinery - [null, null, null, null, null] +18588 - null - [null, null, null, null, null] +18589 - null - [null, null, null, null, null] +18590 - null - [null, null, null, null, null] +18591 - null - [null, null, null, null, null] +18592 - null - [null, null, null, null, null] +18593 - null - [null, null, null, null, null] +18594 - Machinery - [Search, null, null, null, null] +18595 - Hatch - [Open, null, null, null, null] +18596 - Hatch - [Climb-down, null, null, null, null] +18597 - Stairwell - [Climb-down, null, null, null, null] +18598 - Stairs - [Climb-up, null, null, null, null] +18599 - Stairs - [Climb-up, null, null, null, null] +18600 - null - [null, null, null, null, null] +18601 - null - [null, null, null, null, null] +18602 - null - [null, null, null, null, null] +18603 - null - [null, null, null, null, null] +18604 - null - [null, null, null, null, null] +18605 - null - [null, null, null, null, null] +18606 - null - [null, null, null, null, null] +18607 - null - [null, null, null, null, null] +18608 - null - [null, null, null, null, null] +18609 - null - [null, null, null, null, null] +18610 - Stairs - [Climb-up, null, null, null, null] +18611 - Stairs - [Climb-down, null, null, null, null] +18612 - Crate - [Search, null, null, null, null] +18613 - Crate - [Search, null, null, null, null] +18614 - Crates - [Search, null, null, null, null] +18615 - Crates - [Search, null, null, null, null] +18616 - Crate - [Search, null, null, null, null] +18617 - Crates - [Search, null, null, null, null] +18618 - Crate - [Search, null, null, null, null] +18619 - Crate - [Search, null, null, null, null] +18620 - Lever - [Pull, null, null, null, null] +18621 - An old lever - [Pull, null, null, null, null] +18622 - An old lever - [Pull, null, null, null, null] +18623 - Old crane - [null, null, null, null, null] +18624 - Old crane - [null, null, null, null, null] +18625 - Old crane - [null, null, null, null, null] +18626 - Old crane - [null, null, null, null, null] +18627 - Old crane - [null, null, null, null, null] +18628 - Old crane - [null, null, null, null, null] +18629 - Old crane - [null, null, null, null, null] +18630 - Old crane - [null, null, null, null, null] +18631 - Old crane - [null, null, null, null, null] +18632 - Old crane - [null, null, null, null, null] +18633 - Old crane - [null, null, null, null, null] +18634 - Old crane - [null, null, null, null, null] +18635 - Old crane - [null, null, null, null, null] +18636 - Old crane - [null, null, null, null, null] +18637 - Old crane - [null, null, null, null, null] +18638 - Old Crane - [null, null, null, null, null] +18639 - null - [null, null, null, null, null] +18640 - An old lever - [Pull, null, null, null, null] +18641 - Junction box - [Open, null, null, null, null] +18642 - Press support - [null, null, null, null, null] +18643 - Steam press - [null, null, null, null, null] +18644 - Steam press - [null, null, null, null, null] +18645 - Steam press - [null, null, null, null, null] +18646 - Water valve - [Turn, null, null, null, null] +18647 - Water valve - [Turn, null, null, null, null] +18648 - An old lever - [Pull, null, null, null, null] +18649 - Corkscrew lever - [Turn, null, null, null, null] +18650 - Piping - [null, null, null, null, null] +18651 - Door - [null, null, null, null, null] +18652 - Door - [null, null, null, null, null] +18653 - Door - [null, null, null, null, null] +18654 - Door - [null, null, null, null, null] +18655 - Door - [null, null, null, null, null] +18656 - Door - [null, null, null, null, null] +18657 - Door - [null, null, null, null, null] +18658 - Door - [null, null, null, null, null] +18659 - Door - [null, null, null, null, null] +18660 - Water Tank - [null, null, null, null, null] +18661 - Water Tank - [null, null, null, null, null] +18662 - null - [null, null, null, null, null] +18663 - An old lever - [Pull, null, null, null, null] +18664 - Pin - [null, null, null, null, null] +18665 - Pin - [null, null, null, null, null] +18666 - Pin - [null, null, null, null, null] +18667 - Cog - [Take, null, null, null, null] +18668 - Cog - [Take, null, null, null, null] +18669 - Cog - [Take, null, null, null, null] +18670 - Cog - [Take, null, null, null, null] +18671 - Cog - [Take, null, null, null, null] +18672 - Cog - [Take, null, null, null, null] +18673 - Cog - [Take, null, null, null, null] +18674 - Cog - [Take, null, null, null, null] +18675 - Cog - [Take, null, null, null, null] +18676 - Cog - [Take, null, null, null, null] +18677 - Cog - [Take, null, null, null, null] +18678 - Cog - [Take, null, null, null, null] +18679 - Cog - [Take, null, null, null, null] +18680 - Cog - [Take, null, null, null, null] +18681 - Cog - [Take, null, null, null, null] +18682 - Cog - [Take, null, null, null, null] +18683 - Cog - [Take, null, null, null, null] +18684 - Cog - [Take, null, null, null, null] +18685 - Fan blade - [null, null, null, null, null] +18686 - Fan blade - [null, null, null, null, null] +18687 - Fan blade - [null, null, null, null, null] +18688 - null - [null, null, null, null, null] +18689 - null - [null, null, null, null, null] +18690 - Extractor hat - [Operate, null, null, null, null] +18691 - Extractor hat - [Operate, null, null, null, null] +18692 - Extractor hat-top - [null, null, null, null, null] +18693 - Extractor gun - [null, null, null, null, null] +18694 - Extractor gun - [Take-from, null, null, null, null] +18695 - Extractor gun - [Take-from, null, null, null, null] +18696 - Extractor gun - [null, null, null, null, null] +18697 - null - [null, null, null, null, null] +18698 - Mind Door - [Open, null, null, null, null] +18699 - Mind Door - [Close, null, null, null, null] +18700 - Mind Door - [Open, null, null, null, null] +18701 - Mind Door - [Close, null, null, null, null] +18702 - Door - [Open, null, null, null, null] +18703 - Door - [Open, null, null, null, null] +18704 - Connection pipe - [null, null, null, null, null] +18705 - Connection pipe - [null, null, null, null, null] +18706 - Connection pipe - [null, null, null, null, null] +18707 - Connection pipe - [null, null, null, null, null] +18708 - null - [null, null, null, null, null] +18709 - null - [null, null, null, null, null] +18710 - Stairs - [null, null, null, null, null] +18711 - Schematic crate - [Take-from, null, null, null, null] +18712 - null - [null, null, null, null, null] +18713 - null - [null, null, null, null, null] +18714 - null - [null, null, null, null, null] +18715 - null - [null, null, null, null, null] +18716 - null - [null, null, null, null, null] +18717 - null - [null, null, null, null, null] +18718 - null - [null, null, null, null, null] +18719 - null - [null, null, null, null, null] +18720 - null - [null, null, null, null, null] +18721 - null - [null, null, null, null, null] +18722 - null - [null, null, null, null, null] +18723 - null - [null, null, null, null, null] +18724 - null - [null, null, null, null, null] +18725 - null - [null, null, null, null, null] +18726 - Piping - [null, null, null, null, null] +18727 - null - [null, null, null, null, null] +18728 - null - [null, null, null, null, null] +18729 - null - [null, null, null, null, null] +18730 - null - [null, null, null, null, null] +18731 - null - [null, null, null, null, null] +18732 - null - [null, null, null, null, null] +18733 - null - [null, null, null, null, null] +18734 - null - [null, null, null, null, null] +18735 - null - [null, null, null, null, null] +18736 - null - [null, null, null, null, null] +18737 - null - [null, null, null, null, null] +18738 - null - [null, null, null, null, null] +18739 - null - [null, null, null, null, null] +18740 - null - [null, null, null, null, null] +18741 - null - [null, null, null, null, null] +18742 - null - [null, null, null, null, null] +18743 - null - [null, null, null, null, null] +18744 - null - [null, null, null, null, null] +18745 - null - [null, null, null, null, null] +18746 - Mine cart sign - [null, null, null, null, null] +18747 - Track - [null, null, null, null, null] +18748 - null - [null, null, null, null, null] +18749 - null - [null, null, null, null, null] +18750 - Track - [null, null, null, null, null] +18751 - Track - [null, null, null, null, null] +18752 - null - [null, null, null, null, null] +18753 - null - [null, null, null, null, null] +18754 - null - [null, null, null, null, null] +18755 - null - [null, null, null, null, null] +18756 - null - [null, null, null, null, null] +18757 - null - [null, null, null, null, null] +18758 - Tunnel roof - [null, null, null, null, null] +18759 - Tunnel roof - [null, null, null, null, null] +18760 - Tunnel wall - [null, null, null, null, null] +18761 - null - [null, null, null, null, null] +18762 - null - [null, null, null, null, null] +18763 - null - [null, null, null, null, null] +18764 - null - [null, null, null, null, null] +18765 - null - [null, null, null, null, null] +18766 - Oak cape rack - [Search, null, null, null, Remove] +18767 - Teak cape rack - [Search, null, null, null, Remove] +18768 - Mahogany cape rack - [Search, null, null, null, Remove] +18769 - Gilded cape rack - [Search, null, null, null, Remove] +18770 - Marble cape rack - [Search, null, null, null, Remove] +18771 - Magic cape rack - [Search, null, null, null, Remove] +18772 - Fancy dress box - [Open, null, null, null, Remove] +18773 - Fancy dress box - [Search, Close, null, null, null] +18774 - Fancy dress box - [Open, null, null, null, Remove] +18775 - Fancy dress box - [Search, Close, null, null, null] +18776 - Fancy dress box - [Open, null, null, null, Remove] +18777 - Fancy dress box - [Search, Close, null, null, null] +18778 - Armour case - [Open, null, null, null, Remove] +18779 - Armour case - [Search, Close, null, null, null] +18780 - Armour case - [Open, null, null, null, Remove] +18781 - Armour case - [Search, Close, null, null, null] +18782 - Armour case - [Open, null, null, null, Remove] +18783 - Armour case - [Search, Close, null, null, null] +18784 - Magic wardrobe - [Open, null, null, null, Remove] +18785 - Magic wardrobe - [Search, Close, null, null, null] +18786 - Magic wardrobe - [Open, null, null, null, Remove] +18787 - Magic wardrobe - [Search, Close, null, null, null] +18788 - Magic wardrobe - [Open, null, null, null, Remove] +18789 - Magic wardrobe - [Search, Close, null, null, null] +18790 - Magic wardrobe - [Open, null, null, null, Remove] +18791 - Magic wardrobe - [Search, Close, null, null, null] +18792 - Magic wardrobe - [Open, null, null, null, Remove] +18793 - Magic wardrobe - [Search, Close, null, null, null] +18794 - Magic wardrobe - [Open, null, null, null, Remove] +18795 - Magic wardrobe - [Search, Close, null, null, null] +18796 - Magic wardrobe - [Open, null, null, null, Remove] +18797 - Magic wardrobe - [Search, Close, null, null, null] +18798 - Toy box - [Open, null, null, null, Remove] +18799 - Toy box - [Search, Close, null, null, null] +18800 - Toy box - [Open, null, null, null, Remove] +18801 - Toy box - [Search, Close, null, null, null] +18802 - Toy box - [Open, null, null, null, Remove] +18803 - Toy box - [Search, Close, null, null, null] +18804 - Treasure chest - [Open, null, null, null, Remove] +18805 - Treasure chest - [Search, Close, null, null, null] +18806 - Treasure chest - [Open, null, null, null, Remove] +18807 - Treasure chest - [Search, Close, null, null, null] +18808 - Treasure chest - [Open, null, null, null, Remove] +18809 - Treasure chest - [Search, Close, null, null, null] +18810 - Cape rack space - [null, null, null, null, Build] +18811 - Magic wardrobe space - [null, null, null, null, Build] +18812 - Toy box space - [null, null, null, null, Build] +18813 - Treasure chest space - [null, null, null, null, Build] +18814 - Fancy dress box space - [null, null, null, null, Build] +18815 - Armour case space - [null, null, null, null, Build] +18816 - null - [null, null, null, null, null] +18817 - Rocks - [null, null, null, null, null] +18818 - Herb patch - [null, Inspect, null, null, null] +18819 - Herb patch - [null, Inspect, null, null, null] +18820 - Herb patch - [null, Inspect, null, null, null] +18821 - Herb patch - [null, Inspect, null, null, null] +18822 - Herb patch - [null, Inspect, null, null, null] +18823 - Herb patch - [null, Inspect, null, null, null] +18824 - Herbs - [null, Inspect, null, null, null] +18825 - Herbs - [null, Inspect, null, null, null] +18826 - Herbs - [Pick, Inspect, null, null, null] +18827 - Diseased herbs - [null, Inspect, null, null, null] +18828 - Diseased herbs - [null, Inspect, null, null, null] +18829 - Diseased herbs - [null, Inspect, null, null, null] +18830 - Dead herbs - [null, Inspect, null, null, null] +18831 - Dead herbs - [null, Inspect, null, null, null] +18832 - Dead herbs - [null, Inspect, null, null, null] +18833 - Troll ladder - [Climb-down, null, null, null, null] +18834 - Troll ladder - [Climb-up, null, null, null, null] +18835 - Crate - [null, null, null, null, null] +18836 - Tree branch - [null, null, null, null, null] +18837 - Goat - [null, null, null, null, null] +18838 - Trolley - [null, null, null, null, null] +18839 - Fish - [null, null, null, null, null] +18840 - Rocks - [null, null, null, null, null] +18841 - Dolphin - [null, null, null, null, null] +18842 - Fish - [null, null, null, null, null] +18843 - Ladder - [Climb-down, null, null, null, null] +18844 - null - [null, null, null, null, null] +18845 - Soil patch - [null, null, null, null, null] +18846 - Soil patch - [null, null, null, null, null] +18847 - Weeds - [null, null, null, null, null] +18848 - Weeds - [null, null, null, null, null] +18849 - Weeds - [null, null, null, null, null] +18850 - New farming patch - [null, null, null, null, null] +18851 - Hardy goutweed - [null, null, null, null, null] +18852 - Diseased hardy goutweed - [null, null, null, null, null] +18853 - Dead hardy goutweed - [null, null, null, null, null] +18854 - Hardy goutweed - [null, null, null, null, null] +18855 - Hardy goutweed - [Pick, null, null, null, null] +18856 - Parasol - [null, null, null, null, null] +18857 - null - [null, null, null, null, null] +18858 - null - [null, null, null, null, null] +18859 - null - [null, null, null, null, null] +18860 - null - [null, null, null, null, null] +18861 - null - [null, null, null, null, null] +18862 - null - [null, null, null, null, null] +18863 - null - [null, null, null, null, null] +18864 - Drunken Dwarf - [null, null, null, null, null] +18865 - Broken beer glass - [null, null, null, null, null] +18866 - Deckchair - [null, null, null, null, null] +18867 - null - [null, null, null, null, null] +18868 - null - [null, null, null, null, null] +18869 - Cell wall window - [Bend, null, null, null, null] +18870 - Cell wall window - [Escape, null, null, null, null] +18871 - Rock - [null, Climb, null, null, null] +18872 - Rock - [null, Climb, null, null, null] +18873 - Rock - [null, Climb, null, null, null] +18874 - Danger sign - [null, null, null, null, null] +18875 - Cactus - [Inspect, null, null, null, null] +18876 - Sign post - [null, null, null, null, null] +18877 - Footprints - [Look at, Search, null, null, null] +18878 - Footprints - [Look at, Search, null, null, null] +18879 - Footprints - [Look at, Search, null, null, null] +18880 - Footprints - [Look at, Search, null, null, null] +18881 - Footprints - [Look at, Search, null, null, null] +18882 - Footprints - [Look at, Search, null, null, null] +18883 - Footprints - [Look at, Search, null, null, null] +18884 - Footprints - [Look at, Search, null, null, null] +18885 - Footprints - [Look at, Search, null, null, null] +18886 - Footprints - [Look at, Search, null, null, null] +18887 - Barrel - [null, null, null, null, null] +18888 - Winch - [Look at, Operate, null, null, null] +18889 - Crate - [Search, null, null, null, null] +18890 - Crate - [null, null, null, null, null] +18891 - null - [null, null, null, null, null] +18892 - Rockslide - [null, null, null, null, null] +18893 - Rockslide - [null, null, null, null, null] +18894 - Rockslide - [null, null, null, null, null] +18895 - Rockslide - [null, null, null, null, null] +18896 - null - [null, null, null, null, null] +18897 - null - [null, null, null, null, null] +18898 - Footprints - [Look at, Search, null, null, null] +18899 - Footprints - [Look at, Search, null, null, null] +18900 - Footprints - [Look at, Search, null, null, null] +18901 - null - [null, null, null, null, null] +18902 - Table - [null, Search, null, null, null] +18903 - Ladder - [Climb-up, null, null, null, null] +18904 - Ladder - [Climb-down, null, null, null, null] +18905 - null - [null, null, null, null, null] +18906 - null - [null, null, null, null, null] +18907 - Chest - [Open, null, null, null, null] +18908 - null - [null, null, null, null, null] +18909 - null - [null, null, null, null, null] +18910 - null - [null, null, null, null, null] +18911 - null - [null, null, null, null, null] +18912 - null - [null, null, null, null, null] +18913 - null - [null, null, null, null, null] +18914 - null - [null, null, null, null, null] +18915 - null - [null, null, null, null, null] +18916 - null - [null, null, null, null, null] +18917 - null - [null, null, null, null, null] +18918 - Crate - [null, null, null, null, null] +18919 - Crate - [null, null, null, null, null] +18920 - Barrel - [null, null, null, null, null] +18921 - Barrel - [null, null, null, null, null] +18922 - Cliff edge - [Climb-down, null, null, null, null] +18923 - Cliff - [Climb-up, null, null, null, null] +18924 - Cliff - [Climb-down, null, null, null, null] +18925 - null - [null, null, null, null, null] +18926 - null - [null, null, null, null, null] +18927 - null - [null, null, null, null, null] +18928 - null - [null, null, null, null, null] +18929 - null - [null, null, null, null, null] +18930 - null - [null, null, null, null, null] +18931 - null - [null, null, null, null, null] +18932 - null - [null, null, null, null, null] +18933 - null - [null, null, null, null, null] +18934 - null - [null, null, null, null, null] +18935 - null - [null, null, null, null, null] +18936 - null - [null, null, null, null, null] +18937 - null - [null, null, null, null, null] +18938 - Cart track sign - [null, null, null, null, null] +18939 - null - [null, null, null, null, null] +18940 - null - [null, null, null, null, null] +18941 - null - [null, null, null, null, null] +18942 - null - [null, null, null, null, null] +18943 - null - [null, null, null, null, null] +18944 - null - [null, null, null, null, null] +18945 - null - [null, null, null, null, null] +18946 - Buffers - [null, null, null, null, null] +18947 - null - [null, null, null, null, null] +18948 - null - [null, null, null, null, null] +18949 - null - [null, null, null, null, null] +18950 - null - [null, null, null, null, null] +18951 - Winch bucket - [Look at, Use, null, null, null] +18952 - Rocks - [Mine, Prospect, hidden, null, null] +18953 - Rocks - [Mine, Prospect, hidden, null, null] +18954 - Rocks - [Mine, Prospect, hidden, null, null] +18955 - Skeleton - [null, null, null, null, null] +18956 - Skeleton - [null, null, null, null, null] +18957 - Skeleton - [null, null, null, null, null] +18958 - Wooden cart - [Look at, Search, null, null, null] +18959 - Wooden cart - [Look at, Search, null, null, null] +18960 - Cart Camel - [Talk-to, null, null, null, null] +18961 - Rocks - [Mine, Prospect, hidden, null, null] +18962 - Barrel - [Look-in, Search, null, null, null] +18963 - null - [null, null, null, null, null] +18964 - null - [null, null, null, null, null] +18965 - null - [null, null, null, null, null] +18966 - null - [null, null, null, null, null] +18967 - Rocks - [Mine, Prospect, hidden, null, null] +18968 - Rocks - [Mine, Prospect, hidden, null, null] +18969 - Rocks - [Mine, Prospect, hidden, null, null] +18970 - Rocks - [Mine, Prospect, hidden, null, null] +18971 - Rocks - [Mine, Prospect, hidden, null, null] +18972 - Rocks - [Mine, Prospect, hidden, null, null] +18973 - Rocks - [Mine, Prospect, hidden, null, null] +18974 - Rocks - [Mine, Prospect, hidden, null, null] +18975 - Rocks - [Mine, Prospect, hidden, null, null] +18976 - Rocks - [Mine, Prospect, hidden, null, null] +18977 - Rocks - [Mine, Prospect, hidden, null, null] +18978 - Rocks - [Mine, Prospect, hidden, null, null] +18979 - Rocks - [Mine, Prospect, hidden, null, null] +18980 - Rocks - [Mine, Prospect, hidden, null, null] +18981 - Rocks - [Mine, Prospect, hidden, null, null] +18982 - Rocks - [Mine, Prospect, hidden, null, null] +18983 - Rocks - [Mine, Prospect, hidden, null, null] +18984 - Rocks - [Mine, Prospect, hidden, null, null] +18985 - Rocks - [Mine, Prospect, hidden, null, null] +18986 - Rocks - [Mine, Prospect, hidden, null, null] +18987 - Rocks - [Mine, Prospect, hidden, null, null] +18988 - Rocks - [Mine, Prospect, hidden, null, null] +18989 - Rocks - [Mine, Prospect, hidden, null, null] +18990 - Rocks - [Mine, Prospect, hidden, null, null] +18991 - Rocks - [Mine, Prospect, hidden, null, null] +18992 - Rocks - [Mine, Prospect, hidden, null, null] +18993 - Rocks - [Mine, Prospect, hidden, null, null] +18994 - Rocks - [Mine, Prospect, hidden, null, null] +18995 - Rocks - [Mine, Prospect, hidden, null, null] +18996 - Rocks - [Mine, Prospect, hidden, null, null] +18997 - Rocks - [Mine, Prospect, hidden, null, null] +18998 - Rocks - [Mine, Prospect, hidden, null, null] +18999 - Rocks - [Mine, Prospect, hidden, null, null] +19000 - Rocks - [Mine, Prospect, hidden, null, null] +19001 - Rocks - [Mine, Prospect, hidden, null, null] +19002 - Rocks - [Mine, Prospect, hidden, null, null] +19003 - Rocks - [Mine, Prospect, hidden, null, null] +19004 - Rocks - [Mine, Prospect, hidden, null, null] +19005 - Rocks - [Mine, Prospect, hidden, null, null] +19006 - Rocks - [Mine, Prospect, hidden, null, null] +19007 - Rocks - [Mine, Prospect, hidden, null, null] +19008 - Rocks - [Mine, Prospect, hidden, null, null] +19009 - Rocks - [Mine, Prospect, hidden, null, null] +19010 - Rocks - [Mine, Prospect, hidden, null, null] +19011 - Rocks - [Mine, Prospect, hidden, null, null] +19012 - Rocks - [Mine, Prospect, hidden, null, null] +19013 - Rocks - [Mine, Prospect, hidden, null, null] +19014 - Rocks - [Mine, Prospect, hidden, null, null] +19015 - Rocks - [Mine, Prospect, hidden, null, null] +19016 - Rocks - [Mine, Prospect, hidden, null, null] +19017 - Rocks - [Mine, Prospect, hidden, null, null] +19018 - Rocks - [Mine, Prospect, hidden, null, null] +19019 - Rocks - [Mine, Prospect, hidden, null, null] +19020 - Rocks - [Mine, Prospect, hidden, null, null] +19021 - Rocks - [Mine, Prospect, hidden, null, null] +19022 - Rocks - [Mine, Prospect, hidden, null, null] +19023 - Rocks - [Mine, Prospect, hidden, null, null] +19024 - Rocks - [Mine, Prospect, hidden, null, null] +19025 - Rocks - [Mine, Prospect, hidden, null, null] +19026 - Rocks - [Mine, Prospect, hidden, null, null] +19027 - Rocks - [Mine, Prospect, hidden, null, null] +19028 - Rocks - [Mine, Prospect, hidden, null, null] +19029 - Rocks - [Mine, Prospect, hidden, null, null] +19030 - Snow - [Make-ball-of, null, hidden, null, null] +19031 - Snow - [Make-ball-of, null, hidden, null, null] +19032 - Large root - [Pull Up, null, null, null, null] +19033 - Snow - [Make-ball-of, null, hidden, null, null] +19034 - Snow - [Make-ball-of, null, hidden, null, null] +19035 - Snow - [Make-ball-of, null, hidden, null, null] +19036 - Cage - [null, null, null, null, null] +19037 - Cage with gublinch - [null, null, null, null, null] +19038 - Wintumber tree - [Dig-up, hidden, null, null, null] +19039 - Cave entrance - [Climb-down, Search, null, null, null] +19040 - Ladder - [Climb-up, null, null, null, null] +19041 - null - [null, null, null, null, null] +19042 - null - [null, null, null, null, null] +19043 - null - [null, null, null, null, null] +19044 - null - [null, null, null, null, null] +19045 - null - [null, null, null, null, null] +19046 - null - [null, null, null, null, null] +19047 - null - [null, null, null, null, null] +19048 - null - [null, null, null, null, null] +19049 - null - [null, null, null, null, null] +19050 - null - [null, null, null, null, null] +19051 - null - [null, null, null, null, null] +19052 - null - [null, null, null, null, null] +19053 - null - [null, null, null, null, null] +19054 - null - [null, null, null, null, null] +19055 - null - [null, null, null, null, null] +19056 - null - [null, null, null, null, null] +19057 - null - [null, null, null, null, null] +19058 - null - [null, null, null, null, null] +19059 - null - [null, null, null, null, null] +19060 - null - [null, null, null, null, null] +19061 - null - [null, null, null, null, null] +19062 - null - [null, null, null, null, null] +19063 - null - [null, null, null, null, null] +19064 - Paint cans - [null, null, null, null, null] +19065 - Large box - [null, null, null, null, null] +19066 - Puppet arms - [null, null, null, null, null] +19067 - Puppet arms - [null, null, null, null, null] +19068 - Puppet heads - [null, null, null, null, null] +19069 - Puppet heads - [null, null, null, null, null] +19070 - Crate - [null, null, null, null, null] +19071 - Crates - [null, null, null, null, null] +19072 - Crate - [null, null, null, null, null] +19073 - Crate - [null, null, null, null, null] +19074 - Crate - [null, null, null, null, null] +19075 - null - [null, null, null, null, null] +19076 - null - [null, null, null, null, null] +19077 - null - [null, null, null, null, null] +19078 - null - [null, null, null, null, null] +19079 - null - [null, null, null, null, null] +19080 - null - [null, null, null, null, null] +19081 - null - [null, null, null, null, null] +19082 - null - [null, null, null, null, null] +19083 - null - [null, null, null, null, null] +19084 - null - [null, null, null, null, null] +19085 - Decorations box - [null, null, null, null, null] +19086 - Decorations box - [null, null, null, null, null] +19087 - null - [null, null, null, null, null] +19088 - null - [null, null, null, null, null] +19089 - null - [null, null, null, null, null] +19090 - null - [null, null, null, null, null] +19091 - null - [null, null, null, null, null] +19092 - null - [null, null, null, null, null] +19093 - Climbing rope - [Climb, null, null, null, null] +19094 - Decorations box - [null, null, null, null, null] +19095 - Decorations box - [null, null, null, null, null] +19096 - Decorations box - [null, null, null, null, null] +19097 - Decorations box - [null, null, null, null, null] +19098 - Decorations box - [null, null, null, null, null] +19099 - Paint cans - [null, null, null, null, null] +19100 - Paint cans - [null, null, null, null, null] +19101 - Paint cans - [null, null, null, null, null] +19102 - Puppet torsos - [null, null, null, null, null] +19103 - Puppet legs - [null, null, null, null, null] +19104 - Puppet heads - [null, null, null, null, null] +19105 - Puppet torsos - [null, null, null, null, null] +19106 - Puppet legs - [null, null, null, null, null] +19107 - Puppet torsos - [null, null, null, null, null] +19108 - Puppet arms - [null, null, null, null, null] +19109 - Puppet legs - [null, null, null, null, null] +19110 - Roots - [Climb, null, null, null, null] +19111 - Roots - [null, null, null, null, null] +19112 - null - [null, null, null, null, null] +19113 - null - [null, null, null, null, null] +19114 - null - [null, null, null, null, null] +19115 - null - [null, null, null, null, null] +19116 - null - [null, null, null, null, null] +19117 - null - [null, null, null, null, null] +19118 - null - [null, null, null, null, null] +19119 - null - [null, null, null, null, null] +19120 - null - [null, null, null, null, null] +19121 - null - [null, null, null, null, null] +19122 - null - [null, null, null, null, null] +19123 - null - [null, null, null, null, null] +19124 - Shark head - [null, null, null, null, null] +19125 - Dirt - [Leave, null, null, null, null] +19126 - Plank - [Use, null, null, null, null] +19127 - Candles - [Steal, null, null, null, null] +19128 - Basket - [Use, null, null, null, null] +19129 - Basket - [Use, null, null, null, null] +19130 - Air balloon - [null, null, null, null, null] +19131 - Rock - [null, null, null, null, null] +19132 - Basket - [null, null, null, null, null] +19133 - null - [null, null, null, null, null] +19134 - null - [null, null, null, null, null] +19135 - null - [null, null, null, null, null] +19136 - null - [null, null, null, null, null] +19137 - null - [null, null, null, null, null] +19138 - null - [null, null, null, null, null] +19139 - null - [null, null, null, null, null] +19140 - null - [null, null, null, null, null] +19141 - null - [null, null, null, null, null] +19142 - null - [null, null, null, null, null] +19143 - null - [null, null, null, null, null] +19144 - null - [null, null, null, null, null] +19145 - Altar - [Pray-at, null, null, null, null] +19146 - null - [null, null, null, null, null] +19147 - null - [null, null, null, null, null] +19148 - null - [null, null, null, null, null] +19149 - null - [null, null, null, null, null] +19150 - null - [null, null, null, null, null] +19151 - null - [null, null, null, null, null] +19152 - null - [null, null, null, null, null] +19153 - null - [null, null, null, null, null] +19154 - null - [null, null, null, null, null] +19155 - null - [null, null, null, null, null] +19156 - Basket - [null, null, null, null, null] +19157 - Bed - [null, null, null, null, null] +19158 - Table - [null, null, null, null, null] +19159 - Bookcase - [Search, null, null, null, null] +19160 - null - [null, null, null, null, null] +19161 - Basket - [null, null, null, null, null] +19162 - Frame - [null, null, null, null, null] +19163 - null - [null, null, null, null, null] +19164 - Basket - [null, null, null, null, null] +19165 - Tree - [null, null, null, null, null] +19166 - Tree - [null, null, null, null, null] +19167 - Tree - [null, null, null, null, null] +19168 - null - [null, null, null, null, null] +19169 - null - [null, null, null, null, null] +19170 - null - [null, null, null, null, null] +19171 - Loose Railing - [Squeeze-through, null, null, null, null] +19172 - Raw bird - [null, null, null, null, null] +19173 - Raw hunting beast - [null, null, null, null, null] +19174 - Bird snare - [Dismantle, null, null, null, null] +19175 - Bird snare - [Dismantle, Investigate, null, null, null] +19176 - Bird snare - [null, null, null, null, null] +19177 - Bird snare - [null, null, null, null, null] +19178 - Bird snare - [Check, null, null, null, null] +19179 - Bird snare - [null, null, null, null, null] +19180 - Bird snare - [Check, null, null, null, null] +19181 - Bird snare - [null, null, null, null, null] +19182 - Bird snare - [Check, null, null, null, null] +19183 - Bird snare - [null, null, null, null, null] +19184 - Bird snare - [Check, null, null, null, null] +19185 - Bird snare - [null, null, null, null, null] +19186 - Bird snare - [Check, null, null, null, null] +19187 - Box trap - [Dismantle, Investigate, null, null, null] +19188 - Box trap - [null, null, null, null, null] +19189 - Shaking box - [Check, null, null, null, null] +19190 - Shaking box - [Check, null, null, null, null] +19191 - Shaking box - [Check, null, null, null, null] +19192 - Box trap - [Dismantle, null, null, null, null] +19193 - Box trap - [null, null, null, null, null] +19194 - Box trap - [null, null, null, null, null] +19195 - Box trap - [null, null, null, null, null] +19196 - Box trap - [null, null, null, null, null] +19197 - Box trap - [null, null, null, null, null] +19198 - Box trap - [null, null, null, null, null] +19199 - Box trap - [null, null, null, null, null] +19200 - Box trap - [null, null, null, null, null] +19201 - Box trap - [null, null, null, null, null] +19202 - Box trap - [null, null, null, null, null] +19203 - Box trap - [null, null, null, null, null] +19204 - Box trap - [null, null, null, null, null] +19205 - Boulder - [Set-trap, null, null, null, null] +19206 - Deadfall - [Dismantle, Investigate, null, null, null] +19207 - Deadfall - [null, null, null, null, null] +19208 - Deadfall - [null, null, null, null, null] +19209 - Deadfall - [null, null, null, null, null] +19210 - Deadfall - [null, null, null, null, null] +19211 - Deadfall - [null, null, null, null, null] +19212 - Deadfall - [null, null, null, null, null] +19213 - Deadfall - [null, null, null, null, null] +19214 - Deadfall - [null, null, null, null, null] +19215 - Boulder - [Check, null, null, null, null] +19216 - Boulder - [Check, null, null, null, null] +19217 - Boulder - [Check, null, null, null, null] +19218 - Boulder - [Check, null, null, null, null] +19219 - Deadfall - [null, null, null, null, null] +19220 - Perch - [null, null, null, null, hidden] +19221 - Occupied perch - [null, null, null, null, hidden] +19222 - Stile - [Climb-over, null, null, null, null] +19223 - Magic box - [Deactivate, Investigate, null, null, null] +19224 - Magic box failed - [Deactivate, null, null, null, null] +19225 - Magic box - [null, null, null, null, null] +19226 - Magic box - [Retrieve, null, null, null, null] +19227 - Pit - [null, null, Trap, null, null] +19228 - Spiked pit - [Jump, Dismantle, null, null, null] +19229 - Collapsed trap - [null, null, null, null, null] +19230 - Bank booth - [Use, Use-quickly, Collect, null, null] +19231 - Collapsed trap - [null, Dismantle, null, null, null] +19232 - Collapsed trap - [null, Dismantle, null, null, null] +19233 - Collapsed trap - [null, Dismantle, null, null, null] +19234 - Collapsed trap - [null, Dismantle, null, null, null] +19235 - Collapsed trap - [null, Dismantle, null, null, null] +19236 - Collapsed trap - [null, Dismantle, null, null, null] +19237 - null - [null, null, null, null, null] +19238 - null - [null, null, null, null, null] +19239 - null - [null, null, null, null, null] +19240 - null - [null, null, null, null, null] +19241 - null - [null, null, null, null, null] +19242 - null - [null, null, null, null, null] +19243 - null - [null, null, null, null, null] +19244 - null - [null, null, null, null, null] +19245 - null - [null, null, null, null, null] +19246 - null - [null, null, null, null, null] +19247 - null - [null, null, null, null, null] +19248 - null - [null, null, null, null, null] +19249 - null - [null, null, null, null, null] +19250 - null - [null, null, null, null, null] +19251 - null - [null, null, null, null, null] +19252 - null - [null, null, null, null, null] +19253 - null - [null, null, null, null, null] +19254 - null - [null, null, null, null, null] +19255 - null - [null, null, null, null, null] +19256 - null - [null, null, null, null, null] +19257 - null - [null, null, null, null, null] +19258 - null - [null, null, null, null, null] +19259 - null - [null, null, null, null, null] +19260 - Pit - [Trap, null, null, null, null] +19261 - Pit - [Trap, null, null, null, null] +19262 - Pit - [Trap, null, null, null, null] +19263 - Pit - [Trap, null, null, null, null] +19264 - Pit - [Trap, null, null, null, null] +19265 - Pit - [Trap, null, null, null, null] +19266 - Pit - [Trap, null, null, null, null] +19267 - Pit - [Trap, null, null, null, null] +19268 - Pit - [Trap, null, null, null, null] +19269 - null - [null, null, null, null, null] +19270 - null - [null, null, null, null, null] +19271 - null - [null, null, null, null, null] +19272 - null - [null, null, null, null, null] +19273 - null - [null, null, null, null, null] +19274 - null - [null, null, null, null, null] +19275 - null - [null, null, null, null, null] +19276 - null - [null, null, null, null, null] +19277 - null - [null, null, null, null, null] +19278 - null - [null, null, null, null, null] +19279 - null - [null, null, null, null, null] +19280 - null - [null, null, null, null, null] +19281 - null - [null, null, null, null, null] +19282 - null - [null, null, null, null, null] +19283 - null - [null, null, null, null, null] +19284 - null - [null, null, null, null, null] +19285 - null - [null, null, null, null, null] +19286 - null - [null, null, null, null, null] +19287 - null - [null, null, null, null, null] +19288 - null - [null, null, null, null, null] +19289 - null - [null, null, null, null, null] +19290 - null - [null, null, null, null, null] +19291 - null - [null, null, null, null, null] +19292 - null - [null, null, null, null, null] +19293 - null - [null, null, null, null, null] +19294 - null - [null, null, null, null, null] +19295 - null - [null, null, null, null, null] +19296 - null - [null, null, null, null, null] +19297 - null - [null, null, null, null, null] +19298 - null - [null, null, null, null, null] +19299 - null - [null, null, null, null, null] +19300 - null - [null, null, null, null, null] +19301 - null - [null, null, null, null, null] +19302 - null - [null, null, null, null, null] +19303 - null - [null, null, null, null, null] +19304 - null - [null, null, null, null, null] +19305 - null - [null, null, null, null, null] +19306 - null - [null, null, null, null, null] +19307 - null - [null, null, null, null, null] +19308 - null - [null, null, null, null, null] +19309 - null - [null, null, null, null, null] +19310 - null - [null, null, null, null, null] +19311 - null - [null, null, null, null, null] +19312 - null - [null, null, null, null, null] +19313 - null - [null, null, null, null, null] +19314 - null - [null, null, null, null, null] +19315 - null - [null, null, null, null, null] +19316 - null - [null, null, null, null, null] +19317 - null - [null, null, null, null, null] +19318 - null - [null, null, null, null, null] +19319 - null - [null, null, null, null, null] +19320 - null - [null, null, null, null, null] +19321 - null - [null, null, null, null, null] +19322 - null - [null, null, null, null, null] +19323 - null - [null, null, null, null, null] +19324 - null - [null, null, null, null, null] +19325 - null - [null, null, null, null, null] +19326 - null - [null, null, null, null, null] +19327 - null - [null, null, null, null, null] +19328 - null - [null, null, null, null, null] +19329 - null - [null, null, null, null, null] +19330 - null - [null, null, null, null, null] +19331 - null - [null, null, null, null, null] +19332 - null - [null, null, null, null, null] +19333 - Rabbit snare - [Dismantle, Investigate, null, null, null] +19334 - Broken snare - [Dismantle, null, null, null, null] +19335 - Rabbit snare - [Check, null, null, null, null] +19336 - Rabbit snare - [Check, null, null, null, null] +19337 - Rabbit hole - [Flush, null, null, null, null] +19338 - Rabbitless hole - [null, null, null, null, null] +19339 - Plant - [Inspect, null, null, null, null] +19340 - Plant - [Inspect, null, null, null, null] +19341 - Plant - [Inspect, null, null, null, null] +19342 - Plant - [Inspect, null, null, null, null] +19343 - Plant - [Inspect, null, null, null, null] +19344 - Plant - [Inspect, null, null, null, null] +19345 - Plant - [Inspect, null, null, null, null] +19346 - Plant - [Inspect, null, null, null, null] +19347 - Plant - [Inspect, null, null, null, null] +19348 - Plant - [Inspect, null, null, null, null] +19349 - Plant - [Inspect, null, null, null, null] +19350 - Plant - [Inspect, null, null, null, null] +19351 - Plant - [Inspect, null, null, null, null] +19352 - Plant - [Inspect, null, null, null, null] +19353 - Plant - [Inspect, null, null, null, null] +19354 - Plant - [Inspect, null, null, null, null] +19355 - Plant - [Inspect, null, null, null, null] +19356 - Plant - [Inspect, null, null, null, null] +19357 - Plant - [Inspect, null, null, null, null] +19358 - Plant - [Inspect, null, null, null, null] +19359 - Plant - [Inspect, null, null, null, null] +19360 - Plant - [Inspect, null, null, null, null] +19361 - Plant - [Inspect, null, null, null, null] +19362 - Plant - [Inspect, null, null, null, null] +19363 - Plant - [Inspect, null, null, null, null] +19364 - Plant - [Inspect, null, null, null, null] +19365 - Plant - [Inspect, null, null, null, null] +19366 - Plant - [Inspect, null, null, null, null] +19367 - Plant - [Inspect, null, null, null, null] +19368 - Plant - [Inspect, null, null, null, null] +19369 - Plant - [Inspect, null, null, null, null] +19370 - Plant - [Inspect, null, null, null, null] +19371 - Plant - [Inspect, null, null, null, null] +19372 - Plant - [Inspect, null, null, null, null] +19373 - Plant - [Inspect, null, null, null, null] +19374 - Plant - [Inspect, null, null, null, null] +19375 - Plant - [Inspect, null, null, null, null] +19376 - Plant - [Inspect, null, null, null, null] +19377 - Plant - [Inspect, null, null, null, null] +19378 - Plant - [Inspect, null, null, null, null] +19379 - Plant - [Inspect, null, null, null, null] +19380 - Plant - [Inspect, null, null, null, null] +19381 - Plant - [Inspect, null, null, null, null] +19382 - Plant - [Inspect, null, null, null, null] +19383 - Plant - [Inspect, null, null, null, null] +19384 - Plant - [Inspect, null, null, null, null] +19385 - Plant - [Inspect, null, null, null, null] +19386 - Plant - [Inspect, null, null, null, null] +19387 - Plant - [Inspect, null, null, null, null] +19388 - Cactus - [Inspect, null, null, null, null] +19389 - Cactus - [Inspect, null, null, null, null] +19390 - Rockslide - [Inspect, null, null, null, null] +19391 - Cactus - [Inspect, null, null, null, null] +19392 - Cactus - [Inspect, null, null, null, null] +19393 - Rockslide - [Inspect, null, null, null, null] +19394 - Cactus - [Inspect, null, null, null, null] +19395 - Cactus - [Inspect, null, null, null, null] +19396 - Rockslide - [Inspect, null, null, null, null] +19397 - Rockslide - [Inspect, null, null, null, null] +19398 - Cactus - [Inspect, null, null, null, null] +19399 - Cactus - [Inspect, null, null, null, null] +19400 - Rockslide - [Inspect, null, null, null, null] +19401 - Cactus - [Inspect, null, null, null, null] +19402 - Rockslide - [Inspect, null, null, null, null] +19403 - Jungle plant - [Inspect, null, null, null, null] +19404 - Jungle plant - [Inspect, null, null, null, null] +19405 - Jungle plant - [Inspect, null, null, null, null] +19406 - Jungle plant - [Inspect, null, null, null, null] +19407 - Jungle plant - [Inspect, null, null, null, null] +19408 - Jungle plant - [Inspect, null, null, null, null] +19409 - Jungle plant - [Inspect, null, null, null, null] +19410 - Jungle plant - [Inspect, null, null, null, null] +19411 - Jungle plant - [Inspect, null, null, null, null] +19412 - Jungle plant - [Inspect, null, null, null, null] +19413 - Jungle plant - [Inspect, null, null, null, null] +19414 - Jungle plant - [Inspect, null, null, null, null] +19415 - Jungle plant - [Inspect, null, null, null, null] +19416 - Jungle plant - [Inspect, null, null, null, null] +19417 - Jungle plant - [Inspect, null, null, null, null] +19418 - Hollow log - [Inspect, null, null, null, null] +19419 - Tunnel - [Inspect, null, null, null, null] +19420 - Tunnel - [Inspect, null, null, null, null] +19421 - Tunnel - [Inspect, null, null, null, null] +19422 - Hollow log - [Inspect, null, null, null, null] +19423 - Tunnel - [Inspect, null, null, null, null] +19424 - Tunnel - [Inspect, null, null, null, null] +19425 - Hollow log - [Inspect, null, null, null, null] +19426 - Tunnel - [Inspect, null, null, null, null] +19427 - Bush - [Search, Attack, null, null, null] +19428 - Bush - [Search, Attack, null, null, null] +19429 - Bush - [Search, Attack, null, null, null] +19430 - Disturbed sand - [Search, Attack, null, null, null] +19431 - null - [null, null, null, null, null] +19432 - null - [null, null, null, null, null] +19433 - null - [null, null, null, null, null] +19434 - Tunnel - [Inspect, null, null, null, null] +19435 - Snow drift - [Search, Attack, null, null, null] +19436 - null - [null, null, null, null, null] +19437 - null - [null, null, null, null, null] +19438 - Burrow - [Inspect, null, null, null, null] +19439 - Burrow - [Inspect, null, null, null, null] +19440 - Burrow - [Inspect, null, null, null, null] +19441 - null - [null, null, null, null, null] +19442 - null - [null, null, null, null, null] +19443 - null - [null, null, null, null, null] +19444 - null - [null, null, null, null, null] +19445 - null - [null, null, null, null, null] +19446 - null - [null, null, null, null, null] +19447 - null - [null, null, null, null, null] +19448 - null - [null, null, null, null, null] +19449 - null - [null, null, null, null, null] +19450 - null - [null, null, null, null, null] +19451 - null - [null, null, null, null, null] +19452 - null - [null, null, null, null, null] +19453 - null - [null, null, null, null, null] +19454 - null - [null, null, null, null, null] +19455 - null - [null, null, null, null, null] +19456 - null - [null, null, null, null, null] +19457 - null - [null, null, null, null, null] +19458 - null - [null, null, null, null, null] +19459 - null - [null, null, null, null, null] +19460 - null - [null, null, null, null, null] +19461 - null - [null, null, null, null, null] +19462 - null - [null, null, null, null, null] +19463 - null - [null, null, null, null, null] +19464 - null - [null, null, null, null, null] +19465 - null - [null, null, null, null, null] +19466 - null - [null, null, null, null, null] +19467 - null - [null, null, null, null, null] +19468 - null - [null, null, null, null, null] +19469 - null - [null, null, null, null, null] +19470 - null - [null, null, null, null, null] +19471 - null - [null, null, null, null, null] +19472 - null - [null, null, null, null, null] +19473 - null - [null, null, null, null, null] +19474 - null - [null, null, null, null, null] +19475 - null - [null, null, null, null, null] +19476 - null - [null, null, null, null, null] +19477 - null - [null, null, null, null, null] +19478 - null - [null, null, null, null, null] +19479 - null - [null, null, null, null, null] +19480 - null - [null, null, null, null, null] +19481 - null - [null, null, null, null, null] +19482 - null - [null, null, null, null, null] +19483 - null - [null, null, null, null, null] +19484 - null - [null, null, null, null, null] +19485 - null - [null, null, null, null, null] +19486 - null - [null, null, null, null, null] +19487 - null - [null, null, null, null, null] +19488 - null - [null, null, null, null, null] +19489 - null - [null, null, null, null, null] +19490 - null - [null, null, null, null, null] +19491 - null - [null, null, null, null, null] +19492 - Burrow - [Inspect, null, null, null, null] +19493 - Burrow - [Inspect, null, null, null, null] +19494 - Burrow - [Inspect, null, null, null, null] +19495 - null - [null, null, null, null, null] +19496 - null - [null, null, null, null, null] +19497 - null - [null, null, null, null, null] +19498 - null - [null, null, null, null, null] +19499 - null - [null, null, null, null, null] +19500 - null - [null, null, null, null, null] +19501 - null - [null, null, null, null, null] +19502 - null - [null, null, null, null, null] +19503 - null - [null, null, null, null, null] +19504 - null - [null, null, null, null, null] +19505 - null - [null, null, null, null, null] +19506 - null - [null, null, null, null, null] +19507 - null - [null, null, null, null, null] +19508 - null - [null, null, null, null, null] +19509 - null - [null, null, null, null, null] +19510 - null - [null, null, null, null, null] +19511 - null - [null, null, null, null, null] +19512 - null - [null, null, null, null, null] +19513 - null - [null, null, null, null, null] +19514 - null - [null, null, null, null, null] +19515 - null - [null, null, null, null, null] +19516 - null - [null, null, null, null, null] +19517 - null - [null, null, null, null, null] +19518 - null - [null, null, null, null, null] +19519 - null - [null, null, null, null, null] +19520 - null - [null, null, null, null, null] +19521 - null - [null, null, null, null, null] +19522 - null - [null, null, null, null, null] +19523 - null - [null, null, null, null, null] +19524 - null - [null, null, null, null, null] +19525 - null - [null, null, null, null, null] +19526 - null - [null, null, null, null, null] +19527 - null - [null, null, null, null, null] +19528 - null - [null, null, null, null, null] +19529 - null - [null, null, null, null, null] +19530 - null - [null, null, null, null, null] +19531 - null - [null, null, null, null, null] +19532 - null - [null, null, null, null, null] +19533 - null - [null, null, null, null, null] +19534 - null - [null, null, null, null, null] +19535 - null - [null, null, null, null, null] +19536 - null - [null, null, null, null, null] +19537 - null - [null, null, null, null, null] +19538 - null - [null, null, null, null, null] +19539 - null - [null, null, null, null, null] +19540 - null - [null, null, null, null, null] +19541 - null - [null, null, null, null, null] +19542 - null - [null, null, null, null, null] +19543 - null - [null, null, null, null, null] +19544 - null - [null, null, null, null, null] +19545 - null - [null, null, null, null, null] +19546 - null - [null, null, null, null, null] +19547 - null - [null, null, null, null, null] +19548 - null - [null, null, null, null, null] +19549 - null - [null, null, null, null, null] +19550 - null - [null, null, null, null, null] +19551 - null - [null, null, null, null, null] +19552 - Burrow - [Inspect, null, null, null, null] +19553 - Burrow - [Inspect, null, null, null, null] +19554 - null - [null, null, null, null, null] +19555 - null - [null, null, null, null, null] +19556 - null - [null, null, null, null, null] +19557 - null - [null, null, null, null, null] +19558 - null - [null, null, null, null, null] +19559 - null - [null, null, null, null, null] +19560 - null - [null, null, null, null, null] +19561 - null - [null, null, null, null, null] +19562 - null - [null, null, null, null, null] +19563 - null - [null, null, null, null, null] +19564 - null - [null, null, null, null, null] +19565 - null - [null, null, null, null, null] +19566 - null - [null, null, null, null, null] +19567 - null - [null, null, null, null, null] +19568 - null - [null, null, null, null, null] +19569 - null - [null, null, null, null, null] +19570 - null - [null, null, null, null, null] +19571 - null - [null, null, null, null, null] +19572 - null - [null, null, null, null, null] +19573 - null - [null, null, null, null, null] +19574 - null - [null, null, null, null, null] +19575 - null - [null, null, null, null, null] +19576 - null - [null, null, null, null, null] +19577 - null - [null, null, null, null, null] +19578 - null - [null, null, null, null, null] +19579 - null - [null, null, null, null, null] +19580 - null - [null, null, null, null, null] +19581 - null - [null, null, null, null, null] +19582 - null - [null, null, null, null, null] +19583 - null - [null, null, null, null, null] +19584 - null - [null, null, null, null, null] +19585 - null - [null, null, null, null, null] +19586 - null - [null, null, null, null, null] +19587 - null - [null, null, null, null, null] +19588 - null - [null, null, null, null, null] +19589 - null - [null, null, null, null, null] +19590 - null - [null, null, null, null, null] +19591 - null - [null, null, null, null, null] +19592 - null - [null, null, null, null, null] +19593 - Burrow - [Inspect, null, null, null, null] +19594 - Burrow - [Inspect, null, null, null, null] +19595 - null - [null, null, null, null, null] +19596 - null - [null, null, null, null, null] +19597 - null - [null, null, null, null, null] +19598 - null - [null, null, null, null, null] +19599 - null - [null, null, null, null, null] +19600 - null - [null, null, null, null, null] +19601 - null - [null, null, null, null, null] +19602 - null - [null, null, null, null, null] +19603 - null - [null, null, null, null, null] +19604 - null - [null, null, null, null, null] +19605 - null - [null, null, null, null, null] +19606 - null - [null, null, null, null, null] +19607 - null - [null, null, null, null, null] +19608 - null - [null, null, null, null, null] +19609 - null - [null, null, null, null, null] +19610 - null - [null, null, null, null, null] +19611 - null - [null, null, null, null, null] +19612 - null - [null, null, null, null, null] +19613 - null - [null, null, null, null, null] +19614 - null - [null, null, null, null, null] +19615 - null - [null, null, null, null, null] +19616 - null - [null, null, null, null, null] +19617 - null - [null, null, null, null, null] +19618 - null - [null, null, null, null, null] +19619 - null - [null, null, null, null, null] +19620 - null - [null, null, null, null, null] +19621 - null - [null, null, null, null, null] +19622 - null - [null, null, null, null, null] +19623 - null - [null, null, null, null, null] +19624 - null - [null, null, null, null, null] +19625 - null - [null, null, null, null, null] +19626 - null - [null, null, null, null, null] +19627 - null - [null, null, null, null, null] +19628 - null - [null, null, null, null, null] +19629 - null - [null, null, null, null, null] +19630 - null - [null, null, null, null, null] +19631 - null - [null, null, null, null, null] +19632 - null - [null, null, null, null, null] +19633 - null - [null, null, null, null, null] +19634 - null - [null, null, null, null, null] +19635 - null - [null, null, null, null, null] +19636 - null - [null, null, null, null, null] +19637 - null - [null, null, null, null, null] +19638 - null - [null, null, null, null, null] +19639 - null - [null, null, null, null, null] +19640 - Hole - [Inspect, null, null, null, null] +19641 - Hole - [Inspect, null, null, null, null] +19642 - null - [null, null, null, null, null] +19643 - null - [null, null, null, null, null] +19644 - null - [null, null, null, null, null] +19645 - null - [null, null, null, null, null] +19646 - null - [null, null, null, null, null] +19647 - null - [null, null, null, null, null] +19648 - null - [null, null, null, null, null] +19649 - null - [null, null, null, null, null] +19650 - Young tree - [Dismantle, Investigate, null, null, null] +19651 - Net trap - [Dismantle, Investigate, null, null, null] +19652 - Young tree - [Set-trap, null, null, null, null] +19653 - Young tree - [null, null, null, null, null] +19654 - Net trap - [Check, null, null, null, null] +19655 - Net trap - [null, null, null, null, null] +19656 - Net trap - [Dismantle, null, null, null, null] +19657 - Net trap - [null, null, null, null, null] +19658 - Net trap - [null, null, null, null, null] +19659 - Net trap - [Check, null, null, null, null] +19660 - Net trap - [null, null, null, null, null] +19661 - Net trap - [Dismantle, null, null, null, null] +19662 - Young tree - [Dismantle, Investigate, null, null, null] +19663 - Young tree - [Set-trap, null, null, null, null] +19664 - Young tree - [null, null, null, null, null] +19665 - Net trap - [Dismantle, Investigate, null, null, null] +19666 - Net trap - [null, null, null, null, null] +19667 - Net trap - [Check, null, null, null, null] +19668 - Net trap - [null, null, null, null, null] +19669 - Net trap - [Dismantle, null, null, null, null] +19670 - Young tree - [Dismantle, Investigate, null, null, null] +19671 - Young tree - [Set-trap, null, null, null, null] +19672 - Young tree - [null, null, null, null, null] +19673 - Net trap - [Dismantle, Investigate, null, null, null] +19674 - Net trap - [null, null, null, null, null] +19675 - Net trap - [Check, null, null, null, null] +19676 - Net trap - [null, null, null, null, null] +19677 - Net trap - [Dismantle, null, null, null, null] +19678 - Young tree - [Dismantle, Investigate, null, null, null] +19679 - Young tree - [Set-trap, null, null, null, null] +19680 - Young tree - [null, null, null, null, null] +19681 - Net trap - [Dismantle, Investigate, null, null, null] +19682 - null - [null, null, null, null, null] +19683 - null - [null, null, null, null, null] +19684 - null - [null, null, null, null, null] +19685 - null - [null, null, null, null, null] +19686 - null - [null, null, null, null, null] +19687 - null - [null, null, null, null, null] +19688 - null - [null, null, null, null, null] +19689 - null - [null, null, null, null, null] +19690 - Steps - [Ascend, null, null, null, null] +19691 - Steps - [Descend, null, null, null, null] +19692 - null - [null, null, null, null, null] +19693 - null - [null, null, null, null, null] +19694 - null - [null, null, null, null, null] +19695 - null - [null, null, null, null, null] +19696 - null - [null, null, null, null, null] +19697 - null - [null, null, null, null, null] +19698 - null - [null, null, null, null, null] +19699 - Counter - [null, null, null, null, null] +19700 - null - [null, null, null, null, null] +19701 - null - [null, null, null, null, null] +19702 - null - [null, null, null, null, null] +19703 - null - [null, null, null, null, null] +19704 - null - [null, null, null, null, null] +19705 - null - [null, null, null, null, null] +19706 - null - [null, null, null, null, null] +19707 - null - [null, null, null, null, null] +19708 - null - [null, null, null, null, null] +19709 - null - [null, null, null, null, null] +19710 - null - [null, null, null, null, null] +19711 - null - [null, null, null, null, null] +19712 - null - [null, null, null, null, null] +19713 - null - [null, null, null, null, null] +19714 - null - [null, null, null, null, null] +19715 - null - [null, null, null, null, null] +19716 - null - [null, null, null, null, null] +19717 - null - [null, null, null, null, null] +19718 - null - [null, null, null, null, null] +19719 - null - [null, null, null, null, null] +19720 - null - [null, null, null, null, null] +19721 - null - [null, null, null, null, null] +19722 - null - [null, null, null, null, null] +19723 - null - [null, null, null, null, null] +19724 - null - [null, null, null, null, null] +19725 - null - [null, null, null, null, null] +19726 - null - [null, null, null, null, null] +19727 - null - [null, null, null, null, null] +19728 - null - [null, null, null, null, null] +19729 - null - [null, null, null, null, null] +19730 - null - [null, null, null, null, null] +19731 - null - [null, null, null, null, null] +19732 - null - [null, null, null, null, null] +19733 - null - [null, null, null, null, null] +19734 - null - [null, null, null, null, null] +19735 - null - [null, null, null, null, null] +19736 - null - [null, null, null, null, null] +19737 - null - [null, null, null, null, null] +19738 - null - [null, null, null, null, null] +19739 - null - [null, null, null, null, null] +19740 - null - [null, null, null, null, null] +19741 - null - [null, null, null, null, null] +19742 - null - [null, null, null, null, null] +19743 - null - [null, null, null, null, null] +19744 - null - [null, null, null, null, null] +19745 - null - [null, null, null, null, null] +19746 - null - [null, null, null, null, null] +19747 - null - [null, null, null, null, null] +19748 - null - [null, null, null, null, null] +19749 - null - [null, null, null, null, null] +19750 - null - [null, null, null, null, null] +19751 - null - [null, null, null, null, null] +19752 - Rockslide - [Shout-over, null, null, null, null] +19753 - Cave - [Enter, null, null, null, null] +19754 - Cave - [null, null, null, null, null] +19755 - null - [null, null, null, null, null] +19756 - null - [null, null, null, null, null] +19757 - null - [null, null, null, null, null] +19758 - null - [null, null, null, null, null] +19759 - Cave - [Exit, null, null, null, null] +19760 - Cave - [Exit, null, null, null, null] +19761 - Cave - [null, null, null, null, null] +19762 - Cave - [Enter, null, null, null, null] +19763 - Cave - [Exit, null, null, null, null] +19764 - Cave - [Exit, null, null, null, null] +19765 - null - [null, null, null, null, null] +19766 - null - [null, null, null, null, null] +19767 - null - [null, null, null, null, null] +19768 - null - [null, null, null, null, null] +19769 - null - [null, null, null, null, null] +19770 - null - [null, null, null, null, null] +19771 - null - [null, null, null, null, null] +19772 - null - [null, null, null, null, null] +19773 - null - [null, null, null, null, null] +19774 - null - [null, null, null, null, null] +19775 - null - [null, null, null, null, null] +19776 - null - [null, null, null, null, null] +19777 - null - [null, null, null, null, null] +19778 - null - [null, null, null, null, null] +19779 - null - [null, null, null, null, null] +19780 - null - [null, null, null, null, null] +19781 - null - [null, null, null, null, null] +19782 - null - [null, null, null, null, null] +19783 - null - [null, null, null, null, null] +19784 - null - [null, null, null, null, null] +19785 - null - [Inspect, null, null, null, null] +19786 - null - [null, null, null, null, null] +19787 - null - [Inspect, null, null, null, null] +19788 - null - [Inspect, null, null, null, null] +19789 - null - [null, null, null, null, null] +19790 - null - [Enter, Inspect, null, null, null] +19791 - Cave - [Exit, null, null, null, null] +19792 - Cave - [Exit, null, null, null, null] +19793 - null - [null, null, null, null, null] +19794 - null - [null, null, null, null, null] +19795 - null - [null, null, null, null, null] +19796 - null - [null, null, null, null, null] +19797 - Cave - [null, null, null, null, null] +19798 - Cave - [Enter, null, null, null, null] +19799 - null - [null, null, null, null, null] +19800 - null - [null, null, null, null, null] +19801 - null - [null, null, null, null, null] +19802 - null - [null, null, null, null, null] +19803 - null - [null, null, null, null, null] +19804 - null - [null, null, null, null, null] +19805 - null - [null, null, null, null, null] +19806 - null - [null, null, null, null, null] +19807 - null - [null, null, null, null, null] +19808 - Rockslide - [null, null, null, null, null] +19809 - Cave - [Enter, null, null, null, null] +19810 - Large cave - [null, null, null, null, null] +19811 - Cave - [Exit, null, null, null, null] +19812 - Cave - [Exit, null, null, null, null] +19813 - null - [null, null, null, null, null] +19814 - null - [null, null, null, null, null] +19815 - null - [null, null, null, null, null] +19816 - null - [null, null, null, null, null] +19817 - null - [null, null, null, null, null] +19818 - null - [null, null, null, null, null] +19819 - null - [null, null, null, null, null] +19820 - null - [null, null, null, null, null] +19821 - null - [null, null, null, null, null] +19822 - null - [null, null, null, null, null] +19823 - null - [null, null, null, null, null] +19824 - null - [null, null, null, null, null] +19825 - null - [null, null, null, null, null] +19826 - null - [null, null, null, null, null] +19827 - null - [null, null, null, null, null] +19828 - null - [null, null, null, null, null] +19829 - null - [null, null, null, null, null] +19830 - null - [null, null, null, null, null] +19831 - null - [null, null, null, null, null] +19832 - null - [null, null, null, null, null] +19833 - null - [null, null, null, null, null] +19834 - null - [null, null, null, null, null] +19835 - null - [null, null, null, null, null] +19836 - null - [null, null, null, null, null] +19837 - null - [null, null, null, null, null] +19838 - null - [null, null, null, null, null] +19839 - Fern - [null, null, null, null, null] +19840 - Fern - [null, null, null, null, null] +19841 - null - [null, null, null, null, null] +19842 - null - [null, null, null, null, null] +19843 - null - [Open, null, null, null, null] +19844 - null - [null, null, null, null, null] +19845 - null - [null, null, null, null, null] +19846 - Rocky handholds - [Climb, null, null, null, null] +19847 - Rocky handholds - [Climb, null, null, null, null] +19848 - null - [null, null, null, null, null] +19849 - Rocks - [Climb, null, null, null, null] +19850 - null - [null, null, null, null, null] +19851 - Boulder - [null, null, null, null, null] +19852 - Hill - [null, null, null, null, null] +19853 - null - [null, null, null, null, null] +19854 - null - [null, null, null, null, null] +19855 - null - [null, null, null, null, null] +19856 - null - [null, null, null, null, null] +19857 - null - [null, null, null, null, null] +19858 - null - [null, null, null, null, null] +19859 - null - [null, null, null, null, null] +19860 - null - [null, null, null, null, null] +19861 - null - [null, null, null, null, null] +19862 - null - [null, null, null, null, null] +19863 - null - [null, null, null, null, null] +19864 - null - [null, null, null, null, null] +19865 - null - [null, null, null, null, null] +19866 - null - [null, null, null, null, null] +19867 - null - [null, null, null, null, null] +19868 - null - [null, null, null, null, null] +19869 - null - [null, null, null, null, null] +19870 - Stone Gate - [null, null, null, null, null] +19871 - Stone Gate - [null, null, null, null, null] +19872 - null - [null, null, null, null, null] +19873 - null - [null, null, null, null, null] +19874 - null - [null, null, null, null, null] +19875 - null - [null, null, null, null, null] +19876 - null - [null, null, null, null, null] +19877 - Eagle lever - [Pull-down, null, null, null, null] +19878 - Eagle lever - [null, Push-up, null, null, null] +19879 - null - [null, null, null, null, null] +19880 - null - [null, null, null, null, null] +19881 - Campfire - [null, null, null, null, null] +19882 - null - [null, null, null, null, null] +19883 - null - [null, null, null, null, null] +19884 - Campfire - [Inspect, null, null, null, null] +19885 - Books - [null, null, null, null, null] +19886 - Books - [Inspect, null, null, null, null] +19887 - Camping equipment - [null, null, null, null, null] +19888 - Camping equipment - [Inspect, null, null, null, null] +19889 - null - [null, null, null, null, null] +19890 - null - [null, null, null, null, null] +19891 - Cave entrance - [Exit, null, null, null, null] +19892 - null - [null, null, null, null, null] +19893 - null - [null, null, null, null, null] +19894 - Tunnel - [Enter, null, null, null, null] +19895 - null - [null, null, null, null, null] +19896 - null - [null, null, null, null, null] +19897 - Tunnel - [Enter, null, null, null, null] +19898 - null - [null, null, null, null, null] +19899 - null - [null, null, null, null, null] +19900 - Tunnel - [Enter, null, null, null, null] +19901 - null - [null, null, null, null, null] +19902 - null - [null, null, null, null, null] +19903 - Tunnel - [Enter, null, null, null, null] +19904 - null - [null, null, null, null, null] +19905 - null - [null, null, null, null, null] +19906 - Tunnel - [Enter, null, null, null, null] +19907 - null - [null, null, null, null, null] +19908 - null - [null, null, null, null, null] +19909 - Tunnel - [Enter, null, null, null, null] +19910 - null - [null, null, null, null, null] +19911 - Stone pedestal - [null, null, null, null, null] +19912 - null - [null, null, null, null, null] +19913 - null - [null, null, null, null, null] +19914 - Stone door - [Open, null, null, null, null] +19915 - Stone door - [Open, null, null, null, null] +19916 - Stone door - [Open, null, null, null, null] +19917 - Stone door - [Open, null, null, null, null] +19918 - Stone door - [Open, null, null, null, null] +19919 - Birdseed holder - [Take-from, null, null, null, null] +19920 - Bird feeder - [null, null, null, null, null] +19921 - Bird feeder - [null, null, null, null, null] +19922 - Giant feathers - [Take, null, null, null, null] +19923 - Rocky outcrop - [null, Inspect, null, null, null] +19924 - Cave entrance - [Enter, null, null, null, null] +19925 - Rocky outcrop - [null, Inspect, null, null, null] +19926 - Cave entrance - [Enter, null, null, null, null] +19927 - null - [null, null, null, null, null] +19928 - Table - [null, null, null, null, null] +19929 - Chair - [null, null, null, null, null] +19930 - Leftovers - [null, null, null, null, null] +19931 - Chest - [null, null, null, null, null] +19932 - Bookcase - [null, null, null, null, null] +19933 - Chair - [null, null, null, null, null] +19934 - Armour - [null, null, null, null, null] +19935 - Metal bird - [null, null, null, null, null] +19936 - Bird feeder - [null, null, null, null, null] +19937 - Bird feeder - [null, null, null, null, null] +19938 - Bird feeder - [null, null, null, null, null] +19939 - Bird feeder - [null, null, null, null, null] +19940 - Bird feeder - [null, null, null, null, null] +19941 - Bird feeder - [null, null, null, null, null] +19942 - Bird feeder - [null, null, null, null, null] +19943 - Bird feeder - [null, null, null, null, null] +19944 - Bird feeder - [null, null, null, null, null] +19945 - Reset Lever - [Pull, null, null, null, null] +19946 - null - [Pull-down, Push-up, null, null, null] +19947 - null - [Pull-down, Push-up, null, null, null] +19948 - null - [Pull-down, Push-up, null, null, null] +19949 - null - [Pull-down, Push-up, null, null, null] +19950 - Stone pedestal - [Take-from, null, null, null, null] +19951 - null - [null, null, null, null, null] +19952 - null - [null, null, null, null, null] +19953 - null - [null, null, null, null, null] +19954 - null - [null, null, null, null, null] +19955 - null - [null, null, null, null, null] +19956 - null - [null, null, null, null, null] +19957 - null - [null, null, null, null, null] +19958 - null - [null, null, null, null, null] +19959 - null - [null, null, null, null, null] +19960 - null - [null, null, null, null, null] +19961 - null - [null, null, null, null, null] +19962 - null - [null, null, null, null, null] +19963 - null - [null, null, null, null, null] +19964 - null - [null, null, null, null, null] +19965 - null - [null, null, null, null, null] +19966 - null - [null, null, null, null, null] +19967 - Opening - [Inspect, null, null, null, null] +19968 - null - [null, null, null, null, null] +19969 - Rocks - [Inspect, null, null, null, null] +19970 - Rocks - [Inspect, null, null, null, null] +19971 - Rocks - [Inspect, null, null, null, null] +19972 - Rocks - [Inspect, null, null, null, null] +19973 - Rocks - [Inspect, null, null, null, null] +19974 - Stone pedestal - [Inspect, null, null, null, null] +19975 - Stone pedestal - [Take-from, null, null, null, null] +19976 - Winch - [Operate, null, null, null, null] +19977 - Winch - [Operate, null, null, null, null] +19978 - Winch - [Operate, null, null, null, null] +19979 - Winch - [Operate, null, null, null, null] +19980 - Pedestal - [Take-from, null, null, null, null] +19981 - Pedestal - [null, null, null, null, null] +19982 - Pedestal - [null, null, null, null, null] +19983 - Pedestal - [null, null, null, null, null] +19984 - Stone pedestal - [Take-from, null, null, null, null] +19985 - Young vine - [Climb, null, null, null, null] +19986 - Young vine - [Climb, null, null, null, null] +19987 - Growing vine - [Climb, null, null, null, null] +19988 - Tall vine - [Climb, null, null, null, null] +19989 - Tall vine - [Climb, null, null, null, null] +19990 - null - [null, null, null, null, null] +19991 - null - [Open, null, null, null, null] +19992 - null - [null, null, null, null, null] +19993 - null - [Climb, null, null, null, null] +19994 - null - [Enter, Inspect, null, null, null] +19995 - null - [null, null, null, null, null] +19996 - Buried skeleton - [Search, null, null, null, null] +19997 - Animal skull - [null, null, null, null, null] +19998 - Curved bone - [null, null, null, null, null] +19999 - Large bone - [null, null, null, null, null] +20000 - Fire - [null, null, null, null, null] +20001 - Fire - [null, null, null, null, null] +20002 - null - [null, null, null, null, null] +20003 - null - [null, null, null, null, null] +20004 - Rope bridge support - [null, null, null, null, null] +20005 - Rope bridge support - [null, null, null, null, null] +20006 - Rope bridge support - [null, null, null, null, null] +20007 - Rope bridge support - [null, null, null, null, null] +20008 - null - [null, null, null, null, null] +20009 - null - [null, null, null, null, null] +20010 - null - [null, null, null, null, null] +20011 - null - [null, null, null, null, null] +20012 - null - [null, null, null, null, null] +20013 - null - [null, null, null, null, null] +20014 - null - [null, null, null, null, null] +20015 - null - [null, null, null, null, null] +20016 - null - [null, null, null, null, null] +20017 - null - [null, null, null, null, null] +20018 - null - [null, null, null, null, null] +20019 - null - [null, null, null, null, null] +20020 - null - [null, null, null, null, null] +20021 - null - [null, null, null, null, null] +20022 - Pillar - [null, null, null, null, null] +20023 - Pillar - [null, null, null, null, null] +20024 - Pillar - [null, null, null, null, null] +20025 - null - [null, null, null, null, null] +20026 - Pillar - [null, null, null, null, null] +20027 - Pillar - [null, null, null, null, null] +20028 - Pillar - [null, null, null, null, null] +20029 - null - [null, null, null, null, null] +20030 - Pillar - [null, null, null, null, null] +20031 - Pillar - [null, null, null, null, null] +20032 - Pillar - [null, null, null, null, null] +20033 - null - [null, null, null, null, null] +20034 - null - [null, null, null, null, null] +20035 - null - [null, null, null, null, null] +20036 - null - [null, null, null, null, null] +20037 - Bed - [null, null, null, null, null] +20038 - Switch - [null, null, null, null, null] +20039 - Switch - [null, null, null, null, null] +20040 - Machine - [null, null, null, null, null] +20041 - null - [null, null, null, null, null] +20042 - null - [null, null, null, null, null] +20043 - null - [null, null, null, null, null] +20044 - null - [null, null, null, null, null] +20045 - Gate - [Open, null, null, null, null] +20046 - Gate - [Open, null, null, null, null] +20047 - null - [null, null, null, null, null] +20048 - null - [null, null, null, null, null] +20049 - Gate - [Close, null, null, null, null] +20050 - Gate - [Close, null, null, null, null] +20051 - null - [null, null, null, null, null] +20052 - null - [null, null, null, null, null] +20053 - null - [null, null, null, null, null] +20054 - null - [null, null, null, null, null] +20055 - null - [null, null, null, null, null] +20056 - Trellis - [Climb-up, null, null, null, null] +20057 - Trellis - [null, null, null, null, null] +20058 - Table - [null, null, null, null, null] +20059 - Stool - [null, null, null, null, null] +20060 - Table - [null, null, null, null, null] +20061 - Shelf - [null, null, null, null, null] +20062 - Shelf - [null, null, null, null, null] +20063 - A bunk bed - [null, null, null, null, null] +20064 - null - [null, null, null, null, null] +20065 - Chair - [null, null, null, null, null] +20066 - null - [null, null, null, null, null] +20067 - null - [null, null, null, null, null] +20068 - null - [null, null, null, null, null] +20069 - null - [null, null, null, null, null] +20070 - null - [null, null, null, null, null] +20071 - null - [null, null, null, null, null] +20072 - null - [null, null, null, null, null] +20073 - null - [null, null, null, null, null] +20074 - null - [null, null, null, null, null] +20075 - null - [null, null, null, null, null] +20076 - null - [null, null, null, null, null] +20077 - null - [null, null, null, null, null] +20078 - null - [null, null, null, null, null] +20079 - null - [null, null, null, null, null] +20080 - null - [null, null, null, null, null] +20081 - null - [null, null, null, null, null] +20082 - null - [null, null, null, null, null] +20083 - null - [null, null, null, null, null] +20084 - Castle wall - [Climb-under, null, null, null, null] +20085 - Hole - [Climb-into, null, null, null, null] +20086 - null - [null, null, null, null, null] +20087 - City gate - [Close, null, null, null, null] +20088 - City gate - [Close, null, null, null, null] +20089 - City gate - [Close, null, null, null, null] +20090 - City gate - [Close, null, null, null, null] +20091 - null - [null, null, null, null, null] +20092 - null - [null, null, null, null, null] +20093 - null - [null, null, null, null, null] +20094 - null - [null, null, null, null, null] +20095 - Open chest - [null, Search, Shut, null, null] +20096 - Bed - [null, null, null, null, null] +20097 - Bed - [null, null, null, null, null] +20098 - null - [null, null, null, null, null] +20099 - null - [null, null, null, null, null] +20100 - Childerkin slaves - [null, null, null, null, null] +20101 - null - [null, null, null, null, null] +20102 - null - [null, null, null, null, null] +20103 - null - [null, null, null, null, null] +20104 - null - [null, null, null, null, null] +20105 - null - [null, null, null, null, null] +20106 - null - [null, null, null, null, null] +20107 - null - [null, null, null, null, null] +20108 - null - [null, null, null, null, null] +20109 - null - [null, null, null, null, null] +20110 - null - [null, null, null, null, null] +20111 - null - [null, null, null, null, null] +20112 - null - [null, null, null, null, null] +20113 - null - [null, null, null, null, null] +20114 - null - [null, null, null, null, null] +20115 - null - [null, null, null, null, null] +20116 - null - [null, null, null, null, null] +20117 - Childerkin slaves - [null, null, null, null, null] +20118 - null - [null, null, null, null, null] +20119 - null - [null, null, null, null, null] +20120 - null - [null, null, null, null, null] +20121 - null - [null, null, null, null, null] +20122 - null - [null, null, null, null, null] +20123 - null - [null, null, null, null, null] +20124 - null - [null, null, null, null, null] +20125 - null - [null, null, null, null, null] +20126 - null - [null, null, null, null, null] +20127 - null - [null, null, null, null, null] +20128 - null - [null, null, null, null, null] +20129 - null - [null, null, null, null, null] +20130 - null - [null, null, null, null, null] +20131 - null - [null, null, null, null, null] +20132 - null - [null, null, null, null, null] +20133 - Egg launcher - [Shoot, null, null, null, null] +20134 - Blackboard - [Read, null, null, null, null] +20135 - Runner trap(2) - [null, null, null, null, null] +20136 - Trapdoor - [null, null, null, null, null] +20137 - Trapdoor - [null, null, null, null, null] +20138 - Trapdoor - [null, null, null, null, null] +20139 - Trapdoor - [null, null, null, null, null] +20140 - Trapdoor - [null, null, null, null, null] +20141 - Trapdoor - [null, null, null, null, null] +20142 - Trapdoor - [null, null, null, null, null] +20143 - Trapdoor - [null, null, null, null, null] +20144 - Trapdoor - [null, null, null, null, null] +20145 - Trapdoor - [null, null, null, null, null] +20146 - Trapdoor - [null, null, null, null, null] +20147 - Trapdoor - [null, null, null, null, null] +20148 - Winch - [null, null, null, null, null] +20149 - Scroll table - [Take-from, null, null, null, null] +20150 - Healer spring - [Drink-from, null, Take-from, null, null] +20151 - Lure cave - [Enter, null, null, null, null] +20152 - null - [null, null, null, null, null] +20153 - null - [null, null, null, null, null] +20154 - null - [null, null, null, null, null] +20155 - null - [null, null, null, null, null] +20156 - null - [null, null, null, null, null] +20157 - null - [null, null, null, null, null] +20158 - null - [null, null, null, null, null] +20159 - null - [null, null, null, null, null] +20160 - null - [null, null, null, null, null] +20161 - null - [null, null, null, null, null] +20162 - null - [null, null, null, null, null] +20163 - null - [null, null, null, null, null] +20164 - Penance Fighter statue - [Inspect, null, null, null, null] +20165 - Penance Healer statue - [Inspect, null, null, null, null] +20166 - Penance Runner statue - [Inspect, null, null, null, null] +20167 - Penance Ranger statue - [Inspect, null, null, null, null] +20168 - Penance Queen spawn statue - [Inspect, null, null, null, null] +20169 - null - [null, null, null, null, null] +20170 - null - [null, null, null, null, null] +20171 - null - [null, null, null, null, null] +20172 - null - [null, null, null, null, null] +20173 - null - [null, null, null, null, null] +20174 - null - [null, null, null, null, null] +20175 - null - [null, null, null, null, null] +20176 - null - [null, null, null, null, null] +20177 - null - [null, null, null, null, null] +20178 - null - [null, null, null, null, null] +20179 - null - [null, null, null, null, null] +20180 - null - [null, null, null, null, null] +20181 - null - [null, null, null, null, null] +20182 - null - [null, null, null, null, null] +20183 - One - [null, null, null, null, null] +20184 - Two - [null, null, null, null, null] +20185 - Three - [null, null, null, null, null] +20186 - Four - [null, null, null, null, null] +20187 - Five - [null, null, null, null, null] +20188 - Six - [null, null, null, null, null] +20189 - Seven - [null, null, null, null, null] +20190 - Eight - [null, null, null, null, null] +20191 - Nine - [null, null, null, null, null] +20192 - Ten - [null, null, null, null, null] +20193 - Ladder - [Climb-down, null, null, null, null] +20194 - Ladder - [Climb-up, null, null, null, null] +20195 - Barbarian door - [Open, null, null, null, null] +20196 - Barbarian door - [Open, null, null, null, null] +20197 - Barbarian door - [Close, null, null, null, null] +20198 - Barbarian door - [Close, null, null, null, null] +20199 - Door - [Pass, null, null, null, null] +20200 - Door - [Pass, null, null, null, null] +20201 - Door - [Pass, null, null, null, null] +20202 - Door - [Pass, null, null, null, null] +20203 - Door - [Pass, null, null, null, null] +20204 - Door - [Pass, null, null, null, null] +20205 - Door - [Pass, null, null, null, null] +20206 - Door - [Pass, null, null, null, null] +20207 - Door - [Pass, null, null, null, null] +20208 - Door - [Pass, null, null, null, null] +20209 - Door - [Pass, null, null, null, null] +20210 - Obstacle pipe - [Squeeze-through, null, null, null, null] +20211 - Obstacle net - [Climb-over, null, null, null, null] +20212 - null - [null, null, null, null, null] +20213 - null - [null, null, null, null, null] +20214 - null - [null, null, null, null, null] +20215 - null - [null, null, null, null, null] +20216 - Crate - [null, null, null, null, null] +20217 - Barrel - [null, null, null, null, null] +20218 - null - [null, null, null, null, null] +20219 - null - [null, null, null, null, null] +20220 - null - [null, null, null, null, null] +20221 - null - [null, null, null, null, null] +20222 - null - [null, null, null, null, null] +20223 - null - [null, null, null, null, null] +20224 - null - [null, null, null, null, null] +20225 - null - [null, null, null, null, null] +20226 - Ladder - [Climb-down, null, null, null, null] +20227 - Ladder - [Climb-up, null, null, null, null] +20228 - Bank deposit box - [Deposit, null, null, null, null] +20229 - Information scroll - [Read, null, null, null, null] +20230 - Runner trap(1) - [Fix, null, null, null, null] +20231 - Broken trap(0) - [Fix, null, null, null, null] +20232 - Lava crater - [Dunk, null, null, null, null] +20233 - Poison crater - [Dunk, null, null, null, null] +20234 - Lava crater - [Dunk, null, null, null, null] +20235 - Poison crater - [Dunk, null, null, null, null] +20236 - null - [null, null, null, null, null] +20237 - Penance cave - [Block, null, null, null, null] +20238 - Penance cave - [Demolish, null, null, null, null] +20239 - Penance cave - [Fix, null, null, null, null] +20240 - null - [null, null, null, null, null] +20241 - Attacker item machine - [null, Take-Runes, Take-Arrows, null, null] +20242 - Defender item machine - [Stock-Up, Take-Crackers, Take-Tofu, Take-Worms, null] +20243 - Healer item machine - [Stock-Up, Take-Vial, Take-Tofu, Take-Worms, Take-Meat] +20244 - null - [null, null, null, null, null] +20245 - null - [null, null, null, null, null] +20246 - null - [null, null, null, null, null] +20247 - Horn of glory - [Call, null, null, null, null] +20248 - Horn of glory - [Call, null, null, null, null] +20249 - null - [null, null, null, null, null] +20250 - Petrified mushroom - [Get-Spikes, null, null, null, null] +20251 - Petrified mushroom - [null, null, null, null, null] +20252 - null - [null, null, null, null, null] +20253 - null - [null, null, null, null, null] +20254 - null - [null, null, null, null, null] +20255 - null - [null, null, null, null, null] +20256 - null - [null, null, null, null, null] +20257 - null - [null, null, null, null, null] +20258 - null - [null, null, null, null, null] +20259 - Egg launcher - [null, null, null, null, null] +20260 - Hopper - [null, null, null, null, null] +20261 - Hopper - [null, null, null, null, null] +20262 - Hopper - [null, null, null, null, null] +20263 - Egg launcher - [null, null, null, null, null] +20264 - Egg hopper - [Load, Look-in, null, null, null] +20265 - Egg hopper - [Load, Look-in, null, null, null] +20266 - Egg hopper - [Load, Look-in, null, null, null] +20267 - null - [Load, Look-in, null, null, null] +20268 - null - [null, null, null, null, null] +20269 - null - [null, null, null, null, null] +20270 - null - [null, null, null, null, null] +20271 - Floor - [Search, null, null, null, null] +20272 - Odd markings - [Search, null, null, null, null] +20273 - Speartrap - [null, null, null, null, null] +20274 - Trapdoor - [null, null, null, null, null] +20275 - Ladder - [Climb-down, null, null, null, null] +20276 - null - [null, null, null, null, null] +20277 - Ladder - [Climb-up, null, null, null, null] +20278 - Ladder - [Climb-down, null, null, null, null] +20279 - Trapdoor - [null, null, null, null, null] +20280 - Ladder - [Climb-up, null, null, null, null] +20281 - Ladder - [Climb-up, null, null, null, null] +20282 - null - [Climb-up, null, null, null, null] +20283 - null - [Climb-up, null, null, null, null] +20284 - Ladder - [Climb-up, null, null, null, null] +20285 - Ladder - [Climb-down, null, null, null, null] +20286 - Ladder - [Climb-up, null, null, null, null] +20287 - Ladder - [Climb-down, null, null, null, null] +20288 - Kaleef's body - [Search, null, null, null, null] +20289 - null - [null, null, null, null, null] +20290 - null - [null, null, null, null, null] +20291 - null - [null, null, null, null, null] +20292 - null - [null, null, null, null, null] +20293 - null - [null, null, null, null, null] +20294 - null - [null, null, null, null, null] +20295 - null - [null, null, null, null, null] +20296 - null - [null, null, null, null, null] +20297 - Corpse - [null, null, null, null, null] +20298 - Corpse - [null, null, null, null, null] +20299 - Corpse - [null, null, null, null, null] +20300 - Corpse - [null, null, null, null, null] +20301 - null - [null, null, null, null, null] +20302 - null - [null, null, null, null, null] +20303 - null - [null, null, null, null, null] +20304 - null - [null, null, null, null, null] +20305 - null - [null, null, null, null, null] +20306 - null - [null, null, null, null, null] +20307 - null - [null, null, null, null, null] +20308 - null - [null, null, null, null, null] +20309 - null - [null, null, null, null, null] +20310 - null - [null, null, null, null, null] +20311 - null - [null, null, null, null, null] +20312 - null - [null, null, null, null, null] +20313 - null - [null, null, null, null, null] +20314 - null - [null, null, null, null, null] +20315 - null - [null, null, null, null, null] +20316 - null - [null, null, null, null, null] +20317 - null - [null, null, null, null, null] +20318 - null - [null, null, null, null, null] +20319 - null - [null, null, null, null, null] +20320 - null - [null, null, null, null, null] +20321 - null - [null, null, null, null, null] +20322 - Red Castlewars armour - [null, null, null, null, Remove] +20323 - Private bank booth - [null, null, null, null, null] +20324 - Private bank booth - [null, null, null, null, null] +20325 - Bank booth - [Use, Use-quickly, Collect, null, null] +20326 - Bank booth - [null, null, null, null, null] +20327 - Bank booth - [null, null, null, null, null] +20328 - Bank booth - [null, null, null, null, null] +20329 - Bank table - [null, null, null, null, null] +20330 - Bank table - [null, null, null, null, null] +20331 - Dagger stall - [null, null, null, null, null] +20332 - Craft stall - [null, null, null, null, null] +20333 - null - [null, null, null, null, null] +20334 - null - [null, null, null, null, null] +20335 - Floor - [null, null, null, null, null] +20336 - null - [null, null, null, null, null] +20337 - null - [null, null, null, null, null] +20338 - null - [null, null, null, null, null] +20339 - null - [null, null, null, null, null] +20340 - Trapdoor - [Climb-down, null, null, null, null] +20341 - Gate - [Open, null, null, null, null] +20342 - Cart - [null, null, null, null, null] +20343 - Cart - [null, null, null, null, null] +20344 - Silk stall - [null, null, null, null, null] +20345 - Bakery stall - [null, null, null, null, null] +20346 - Gem stall - [null, null, null, null, null] +20347 - Fur stall - [null, null, null, null, null] +20348 - Spice stall - [Search, null, null, null, null] +20349 - Market stall - [null, null, null, null, null] +20350 - Tea stall - [null, Steal-from, null, null, null] +20351 - Table - [null, null, null, null, null] +20352 - Chair - [null, null, null, null, null] +20353 - Ladder - [Climb-up, null, null, null, null] +20354 - Ladder - [Climb-down, null, null, null, null] +20355 - null - [null, null, null, null, null] +20356 - Ladder - [Climb-up, null, null, null, null] +20357 - Ladder - [Climb-down, null, null, null, null] +20358 - Sink - [null, null, null, null, null] +20359 - Wheelbarrow - [null, null, null, null, null] +20360 - Work bench - [null, null, null, null, null] +20361 - null - [null, null, null, null, null] +20362 - Shelf - [null, null, null, null, null] +20363 - null - [null, null, null, null, null] +20364 - Clothing shelves - [null, null, null, null, null] +20365 - Spinning wheel - [null, Spin, null, null, null] +20366 - null - [null, null, null, null, null] +20367 - Crate - [null, null, null, null, null] +20368 - Crate - [null, null, null, null, null] +20369 - Boxes - [Search, null, null, null, null] +20370 - Log pile - [null, null, null, null, null] +20371 - Broken logs - [null, null, null, null, null] +20372 - Hollow log - [null, null, null, null, null] +20373 - Logs - [null, null, null, null, null] +20374 - Logs - [null, null, null, null, null] +20375 - Potter's wheel - [null, null, null, null, null] +20376 - Clothes - [null, null, null, null, null] +20377 - Altar - [Pray-at, null, null, null, null] +20378 - Altar - [Pray-at, null, null, null, null] +20379 - Altar - [null, null, null, null, null] +20380 - null - [null, null, null, null, null] +20381 - null - [null, null, null, null, null] +20382 - null - [null, null, null, null, null] +20383 - null - [null, null, null, null, null] +20384 - null - [null, null, null, null, null] +20385 - null - [null, null, null, null, null] +20386 - Bed - [null, null, null, null, null] +20387 - Bed - [null, null, null, null, null] +20388 - Cloth covered table - [null, null, null, null, null] +20389 - null - [null, null, null, null, null] +20390 - null - [null, null, null, null, null] +20391 - Gate - [Open, Use-quickly, null, null, null] +20392 - null - [null, null, null, null, null] +20393 - null - [null, null, null, null, null] +20394 - null - [null, null, null, null, null] +20395 - null - [null, null, null, null, null] +20396 - null - [null, null, null, null, null] +20397 - null - [null, null, null, null, null] +20398 - null - [null, null, null, null, null] +20399 - null - [null, null, null, null, null] +20400 - null - [null, null, null, null, null] +20401 - null - [null, null, null, null, null] +20402 - Buffers - [null, null, null, null, null] +20403 - null - [null, null, null, null, null] +20404 - null - [null, null, null, null, null] +20405 - null - [null, null, null, null, null] +20406 - null - [null, null, null, null, null] +20407 - Ore vein - [Mine, Prospect, null, null, null] +20408 - Ore vein - [Mine, Prospect, null, null, null] +20409 - Ore vein - [Mine, Prospect, null, null, null] +20410 - Ore vein - [Mine, Prospect, null, null, null] +20411 - Ore vein - [Mine, Prospect, null, null, null] +20412 - Ore vein - [Mine, Prospect, null, null, null] +20413 - Ore vein - [Mine, Prospect, null, null, null] +20414 - Ore vein - [Mine, Prospect, null, null, null] +20415 - Ore vein - [Mine, Prospect, null, null, null] +20416 - Ore vein - [Mine, Prospect, null, null, null] +20417 - Ore vein - [Mine, Prospect, null, null, null] +20418 - Ore vein - [Mine, Prospect, null, null, null] +20419 - Ore vein - [Mine, Prospect, null, null, null] +20420 - Ore vein - [Mine, Prospect, null, null, null] +20421 - Ore vein - [Mine, Prospect, null, null, null] +20422 - Ore vein - [Mine, Prospect, null, null, null] +20423 - Ore vein - [Mine, Prospect, null, null, null] +20424 - Ore vein - [Mine, Prospect, null, null, null] +20425 - Ore vein - [Mine, Prospect, null, null, null] +20426 - Stairs - [Walk-up, null, null, null, null] +20427 - null - [null, null, null, null, null] +20428 - null - [null, null, null, null, null] +20429 - Crate - [null, null, null, null, null] +20430 - Crate - [null, null, null, null, null] +20431 - Barrel - [null, null, null, null, null] +20432 - null - [null, null, null, null, null] +20433 - Cart tunnel - [null, null, null, null, null] +20434 - null - [null, null, null, null, null] +20435 - Stairs - [Walk-down, null, null, null, null] +20436 - null - [null, null, null, null, null] +20437 - null - [null, null, null, null, null] +20438 - null - [null, null, null, null, null] +20439 - Depleted vein - [Mine, Prospect, null, null, null] +20440 - Depleted vein - [Mine, Prospect, null, null, null] +20441 - Depleted vein - [Mine, Prospect, null, null, null] +20442 - Depleted vein - [Mine, Prospect, null, null, null] +20443 - Ore vein - [Mine, Prospect, null, null, null] +20444 - Ore vein - [Mine, Prospect, null, null, null] +20445 - Ore vein - [Mine, Prospect, null, null, null] +20446 - Ore vein - [Mine, Prospect, null, null, null] +20447 - Ore vein - [Mine, Prospect, null, null, null] +20448 - Ore vein - [Mine, Prospect, null, null, null] +20449 - Ore vein - [Mine, Prospect, null, null, null] +20450 - Ore vein - [Mine, Prospect, null, null, null] +20451 - Ore vein - [Mine, Prospect, null, null, null] +20452 - Armour - [null, null, null, null, null] +20453 - Armour - [null, null, null, null, null] +20454 - Skeleton - [null, null, null, null, null] +20455 - Skeleton - [null, null, null, null, null] +20456 - Skeleton - [null, null, null, null, null] +20457 - Skeleton - [null, null, null, null, null] +20458 - Locker - [null, null, null, null, null] +20459 - Stool - [null, null, null, null, null] +20460 - Small table - [null, null, null, null, null] +20461 - Bookcase - [null, null, null, null, null] +20462 - Bed - [null, null, null, null, null] +20463 - Crate - [Search, null, null, null, null] +20464 - Crate - [Search, null, null, null, null] +20465 - Passageway - [Enter, null, null, null, null] +20466 - Passageway - [Enter, null, null, null, null] +20467 - Passageway - [Enter, null, null, null, null] +20468 - Passageway - [Enter, null, null, null, null] +20469 - Passageway - [Enter, null, null, null, null] +20470 - null - [null, null, null, null, null] +20471 - null - [null, null, null, null, null] +20472 - null - [null, null, null, null, null] +20473 - null - [null, null, null, null, null] +20474 - null - [null, null, null, null, null] +20475 - null - [null, null, null, null, null] +20476 - null - [null, null, null, null, null] +20477 - null - [null, null, null, null, null] +20478 - null - [null, null, null, null, null] +20479 - null - [null, null, null, null, null] +20480 - null - [null, null, null, null, null] +20481 - null - [null, null, null, null, null] +20482 - null - [null, null, null, null, null] +20483 - null - [null, null, null, null, null] +20484 - null - [null, null, null, null, null] +20485 - null - [null, null, null, null, null] +20486 - null - [null, null, null, null, null] +20487 - null - [null, null, null, null, null] +20488 - null - [null, null, null, null, null] +20489 - null - [null, null, null, null, null] +20490 - null - [null, null, null, null, null] +20491 - null - [null, null, null, null, null] +20492 - null - [null, null, null, null, null] +20493 - null - [null, null, null, null, null] +20494 - null - [null, null, null, null, null] +20495 - null - [null, null, null, null, null] +20496 - null - [null, null, null, null, null] +20497 - null - [null, null, null, null, null] +20498 - null - [null, null, null, null, null] +20499 - null - [null, null, null, null, null] +20500 - null - [null, null, null, null, null] +20501 - null - [null, null, null, null, null] +20502 - null - [null, null, null, null, null] +20503 - null - [null, null, null, null, null] +20504 - null - [null, null, null, null, null] +20505 - null - [null, null, null, null, null] +20506 - null - [null, null, null, null, null] +20507 - null - [null, null, null, null, null] +20508 - null - [null, null, null, null, null] +20509 - null - [null, null, null, null, null] +20510 - Crate - [null, null, null, null, null] +20511 - Barrel - [null, null, null, null, null] +20512 - null - [null, null, null, null, null] +20513 - null - [null, null, null, null, null] +20514 - null - [null, null, null, null, null] +20515 - null - [null, null, null, null, null] +20516 - null - [null, null, null, null, null] +20517 - null - [null, null, null, null, null] +20518 - null - [null, null, null, null, null] +20519 - Buffers - [null, null, null, null, null] +20520 - null - [null, null, null, null, null] +20521 - null - [null, null, null, null, null] +20522 - null - [null, null, null, null, null] +20523 - null - [null, null, null, null, null] +20524 - Cart tunnel - [Crawl-through, null, null, null, null] +20525 - Cart tunnel - [Crawl-through, null, null, null, null] +20526 - Wall support - [null, null, null, null, null] +20527 - Entrance - [Enter, null, null, null, null] +20528 - Entrance - [null, null, null, null, null] +20529 - null - [null, null, null, null, null] +20530 - null - [null, null, null, null, null] +20531 - Bars - [null, null, null, null, null] +20532 - Bars - [null, null, null, null, null] +20533 - Bars - [null, null, null, null, null] +20534 - Bars - [null, null, null, null, null] +20535 - Stairs - [Climb, null, null, null, null] +20536 - Stairs - [null, null, null, null, null] +20537 - null - [null, null, null, null, null] +20538 - null - [null, null, null, null, null] +20539 - null - [null, null, null, null, null] +20540 - null - [null, null, null, null, null] +20541 - null - [null, null, null, null, null] +20542 - null - [null, null, null, null, null] +20543 - null - [null, null, null, null, null] +20544 - null - [null, null, null, null, null] +20545 - null - [null, null, null, null, null] +20546 - null - [null, null, null, null, null] +20547 - null - [null, null, null, null, null] +20548 - null - [null, null, null, null, null] +20549 - null - [null, null, null, null, null] +20550 - null - [null, null, null, null, null] +20551 - null - [null, null, null, null, null] +20552 - null - [null, null, null, null, null] +20553 - null - [null, null, null, null, null] +20554 - null - [null, null, null, null, null] +20555 - null - [null, null, null, null, null] +20556 - null - [null, null, null, null, null] +20557 - null - [null, null, null, null, null] +20558 - null - [null, null, null, null, null] +20559 - null - [null, null, null, null, null] +20560 - null - [null, null, null, null, null] +20561 - null - [null, null, null, null, null] +20562 - null - [null, null, null, null, null] +20563 - null - [null, null, null, null, null] +20564 - null - [null, null, null, null, null] +20565 - null - [null, null, null, null, null] +20566 - null - [null, null, null, null, null] +20567 - null - [null, null, null, null, null] +20568 - null - [null, null, null, null, null] +20569 - null - [null, null, null, null, null] +20570 - null - [null, null, null, null, null] +20571 - null - [null, null, null, null, null] +20572 - Passageway - [Enter, null, null, null, null] +20573 - Passageway - [Enter, null, null, null, null] +20574 - Passageway - [Enter, null, null, null, null] +20575 - Passageway - [Enter, null, null, null, null] +20576 - Passageway - [Enter, null, null, null, null] +20577 - Passageway - [Enter, null, null, null, null] +20578 - null - [null, null, null, null, null] +20579 - null - [null, null, null, null, null] +20580 - null - [null, null, null, null, null] +20581 - null - [null, null, null, null, null] +20582 - null - [null, null, null, null, null] +20583 - null - [null, null, null, null, null] +20584 - null - [null, null, null, null, null] +20585 - null - [null, null, null, null, null] +20586 - null - [null, null, null, null, null] +20587 - null - [null, null, null, null, null] +20588 - null - [null, null, null, null, null] +20589 - null - [null, null, null, null, null] +20590 - null - [null, null, null, null, null] +20591 - null - [null, null, null, null, null] +20592 - null - [null, null, null, null, null] +20593 - null - [null, null, null, null, null] +20594 - null - [null, null, null, null, null] +20595 - null - [null, null, null, null, null] +20596 - null - [null, null, null, null, null] +20597 - null - [null, null, null, null, null] +20598 - null - [null, null, null, null, null] +20599 - null - [null, null, null, null, null] +20600 - null - [null, null, null, null, null] +20601 - null - [null, null, null, null, null] +20602 - null - [null, null, null, null, null] +20603 - null - [null, null, null, null, null] +20604 - null - [null, null, null, null, null] +20605 - null - [null, null, null, null, null] +20606 - null - [null, null, null, null, null] +20607 - null - [null, null, null, null, null] +20608 - null - [null, null, null, null, null] +20609 - null - [null, null, null, null, null] +20610 - null - [null, null, null, null, null] +20611 - null - [null, null, null, null, null] +20612 - null - [null, null, null, null, null] +20613 - null - [null, null, null, null, null] +20614 - null - [null, null, null, null, null] +20615 - null - [null, null, null, null, null] +20616 - null - [null, null, null, null, null] +20617 - null - [null, null, null, null, null] +20618 - null - [null, null, null, null, null] +20619 - Stairs - [Climb, null, null, null, null] +20620 - Stairs - [null, null, null, null, null] +20621 - null - [null, null, null, null, null] +20622 - null - [null, null, null, null, null] +20623 - null - [null, null, null, null, null] +20624 - null - [null, null, null, null, null] +20625 - null - [null, null, null, null, null] +20626 - null - [null, null, null, null, null] +20627 - null - [null, null, null, null, null] +20628 - null - [null, null, null, null, null] +20629 - null - [null, null, null, null, null] +20630 - null - [null, null, null, null, null] +20631 - null - [null, null, null, null, null] +20632 - null - [null, null, null, null, null] +20633 - null - [null, null, null, null, null] +20634 - null - [null, null, null, null, null] +20635 - null - [null, null, null, null, null] +20636 - null - [null, null, null, null, null] +20637 - null - [null, null, null, null, null] +20638 - null - [null, null, null, null, null] +20639 - null - [null, null, null, null, null] +20640 - null - [null, null, null, null, null] +20641 - null - [null, null, null, null, null] +20642 - null - [null, null, null, null, null] +20643 - null - [null, null, null, null, null] +20644 - null - [null, null, null, null, null] +20645 - null - [null, null, null, null, null] +20646 - null - [null, null, null, null, null] +20647 - null - [null, null, null, null, null] +20648 - null - [null, null, null, null, null] +20649 - null - [null, null, null, null, null] +20650 - null - [null, null, null, null, null] +20651 - null - [null, null, null, null, null] +20652 - Passageway - [Enter, null, null, null, null] +20653 - Passageway - [Enter, null, null, null, null] +20654 - Passageway - [Enter, null, null, null, null] +20655 - Passageway - [Enter, null, null, null, null] +20656 - Passageway - [Enter, null, null, null, null] +20657 - Passageway - [Enter, null, null, null, null] +20658 - null - [null, null, null, null, null] +20659 - null - [null, null, null, null, null] +20660 - null - [null, null, null, null, null] +20661 - null - [null, null, null, null, null] +20662 - null - [null, null, null, null, null] +20663 - null - [null, null, null, null, null] +20664 - null - [null, null, null, null, null] +20665 - null - [null, null, null, null, null] +20666 - null - [null, null, null, null, null] +20667 - null - [null, null, null, null, null] +20668 - null - [null, null, null, null, null] +20669 - null - [null, null, null, null, null] +20670 - null - [null, null, null, null, null] +20671 - null - [null, null, null, null, null] +20672 - null - [null, null, null, null, null] +20673 - null - [null, null, null, null, null] +20674 - null - [null, null, null, null, null] +20675 - null - [null, null, null, null, null] +20676 - null - [null, null, null, null, null] +20677 - null - [null, null, null, null, null] +20678 - null - [null, null, null, null, null] +20679 - null - [null, null, null, null, null] +20680 - null - [null, null, null, null, null] +20681 - null - [null, null, null, null, null] +20682 - null - [null, null, null, null, null] +20683 - null - [null, null, null, null, null] +20684 - Stairs - [Climb, null, null, null, null] +20685 - Stairs - [null, null, null, null, null] +20686 - null - [null, null, null, null, null] +20687 - null - [null, null, null, null, null] +20688 - null - [null, null, null, null, null] +20689 - null - [null, null, null, null, null] +20690 - null - [null, null, null, null, null] +20691 - null - [null, null, null, null, null] +20692 - null - [null, null, null, null, null] +20693 - Ledge - [Walk-across, null, null, null, null] +20694 - null - [null, null, null, null, null] +20695 - null - [null, null, null, null, null] +20696 - null - [null, null, null, null, null] +20697 - null - [null, null, null, null, null] +20698 - null - [null, null, null, null, null] +20699 - null - [null, null, null, null, null] +20700 - null - [null, null, null, null, null] +20701 - null - [null, null, null, null, null] +20702 - null - [null, null, null, null, null] +20703 - null - [null, null, null, null, null] +20704 - null - [null, null, null, null, null] +20705 - null - [null, null, null, null, null] +20706 - null - [null, null, null, null, null] +20707 - null - [null, null, null, null, null] +20708 - null - [null, null, null, null, null] +20709 - null - [null, null, null, null, null] +20710 - null - [null, null, null, null, null] +20711 - null - [null, null, null, null, null] +20712 - null - [null, null, null, null, null] +20713 - null - [null, null, null, null, null] +20714 - null - [null, null, null, null, null] +20715 - null - [null, null, null, null, null] +20716 - null - [null, null, null, null, null] +20717 - Passageway - [Enter, null, null, null, null] +20718 - Passageway - [Enter, null, null, null, null] +20719 - Passageway - [Enter, null, null, null, null] +20720 - Passageway - [Enter, null, null, null, null] +20721 - Passageway - [Enter, null, null, null, null] +20722 - Passageway - [Enter, null, null, null, null] +20723 - null - [null, null, null, null, null] +20724 - null - [null, null, null, null, null] +20725 - null - [null, null, null, null, null] +20726 - null - [null, null, null, null, null] +20727 - null - [null, null, null, null, null] +20728 - null - [null, null, null, null, null] +20729 - null - [null, null, null, null, null] +20730 - null - [null, null, null, null, null] +20731 - null - [null, null, null, null, null] +20732 - null - [null, null, null, null, null] +20733 - null - [null, null, null, null, null] +20734 - null - [null, null, null, null, null] +20735 - null - [null, null, null, null, null] +20736 - null - [null, null, null, null, null] +20737 - null - [null, null, null, null, null] +20738 - null - [null, null, null, null, null] +20739 - null - [null, null, null, null, null] +20740 - null - [null, null, null, null, null] +20741 - null - [null, null, null, null, null] +20742 - null - [null, null, null, null, null] +20743 - null - [null, null, null, null, null] +20744 - null - [null, null, null, null, null] +20745 - null - [null, null, null, null, null] +20746 - null - [null, null, null, null, null] +20747 - null - [null, null, null, null, null] +20748 - null - [null, null, null, null, null] +20749 - Stairs - [Climb, null, null, null, null] +20750 - Stairs - [null, null, null, null, null] +20751 - null - [null, null, null, null, null] +20752 - null - [null, null, null, null, null] +20753 - null - [null, null, null, null, null] +20754 - null - [null, null, null, null, null] +20755 - null - [null, null, null, null, null] +20756 - null - [null, null, null, null, null] +20757 - null - [null, null, null, null, null] +20758 - null - [null, null, null, null, null] +20759 - null - [null, null, null, null, null] +20760 - null - [null, null, null, null, null] +20761 - null - [null, null, null, null, null] +20762 - null - [null, null, null, null, null] +20763 - null - [null, null, null, null, null] +20764 - null - [null, null, null, null, null] +20765 - null - [null, null, null, null, null] +20766 - null - [null, null, null, null, null] +20767 - null - [null, null, null, null, null] +20768 - null - [null, null, null, null, null] +20769 - null - [null, null, null, null, null] +20770 - null - [null, null, null, null, null] +20771 - null - [null, null, null, null, null] +20772 - null - [null, null, null, null, null] +20773 - null - [null, null, null, null, null] +20774 - null - [null, null, null, null, null] +20775 - null - [null, null, null, null, null] +20776 - null - [null, null, null, null, null] +20777 - null - [null, null, null, null, null] +20778 - null - [null, null, null, null, null] +20779 - null - [null, null, null, null, null] +20780 - null - [null, null, null, null, null] +20781 - null - [null, null, null, null, null] +20782 - Passageway - [Enter, null, null, null, null] +20783 - Passageway - [Enter, null, null, null, null] +20784 - Passageway - [Enter, null, null, null, null] +20785 - Passageway - [Enter, null, null, null, null] +20786 - Passageway - [Enter, null, null, null, null] +20787 - Passageway - [Enter, null, null, null, null] +20788 - null - [null, null, null, null, null] +20789 - null - [null, null, null, null, null] +20790 - null - [null, null, null, null, null] +20791 - null - [null, null, null, null, null] +20792 - null - [null, null, null, null, null] +20793 - null - [null, null, null, null, null] +20794 - null - [null, null, null, null, null] +20795 - null - [null, null, null, null, null] +20796 - null - [null, null, null, null, null] +20797 - null - [null, null, null, null, null] +20798 - null - [null, null, null, null, null] +20799 - null - [null, null, null, null, null] +20800 - null - [null, null, null, null, null] +20801 - null - [null, null, null, null, null] +20802 - null - [null, null, null, null, null] +20803 - null - [null, null, null, null, null] +20804 - null - [null, null, null, null, null] +20805 - null - [null, null, null, null, null] +20806 - null - [null, null, null, null, null] +20807 - null - [null, null, null, null, null] +20808 - null - [null, null, null, null, null] +20809 - null - [null, null, null, null, null] +20810 - null - [null, null, null, null, null] +20811 - null - [null, null, null, null, null] +20812 - null - [null, null, null, null, null] +20813 - null - [null, null, null, null, null] +20814 - Passageway - [Enter, null, null, null, null] +20815 - Passageway - [Enter, null, null, null, null] +20816 - Stairs - [Enter, null, null, null, null] +20817 - Passageway - [Enter, null, null, null, null] +20818 - Stairs - [Enter, null, null, null, null] +20819 - Stairs - [Enter, null, null, null, null] +20820 - Passageway - [Enter, null, null, null, null] +20821 - Passageway - [Enter, null, null, null, null] +20822 - Passageway - [Enter, null, null, null, null] +20823 - Passageway - [Enter, null, null, null, null] +20824 - Passageway - [Enter, null, null, null, null] +20825 - Passageway - [Enter, null, null, null, null] +20826 - Stairs - [Enter, null, null, null, null] +20827 - Passageway - [Enter, null, null, null, null] +20828 - Stairs - [Enter, null, null, null, null] +20829 - Passageway - [Enter, null, null, null, null] +20830 - Passageway - [Enter, null, null, null, null] +20831 - Passageway - [Enter, null, null, null, null] +20832 - Passageway - [Enter, null, null, null, null] +20833 - Passageway - [Enter, null, null, null, null] +20834 - Passageway - [Enter, null, null, null, null] +20835 - Passageway - [Enter, null, null, null, null] +20836 - Passageway - [Enter, null, null, null, null] +20837 - Passageway - [Enter, null, null, null, null] +20838 - Passageway - [Enter, null, null, null, null] +20839 - Passageway - [Enter, null, null, null, null] +20840 - Stairs - [Enter, null, null, null, null] +20841 - Passageway - [Enter, null, null, null, null] +20842 - Passageway - [Enter, null, null, null, null] +20843 - Passageway - [Enter, null, null, null, null] +20844 - Passageway - [Enter, null, null, null, null] +20845 - Passageway - [Enter, null, null, null, null] +20846 - Passageway - [Enter, null, null, null, null] +20847 - Passageway - [Enter, null, null, null, null] +20848 - Passageway - [Enter, null, null, null, null] +20849 - Passageway - [Enter, null, null, null, null] +20850 - Passageway - [Enter, null, null, null, null] +20851 - Passageway - [Enter, null, null, null, null] +20852 - Passageway - [Enter, null, null, null, null] +20853 - Passageway - [Enter, null, null, null, null] +20854 - Passageway - [Enter, null, null, null, null] +20855 - Passageway - [Enter, null, null, null, null] +20856 - Passageway - [Enter, null, null, null, null] +20857 - Passageway - [Enter, null, null, null, null] +20858 - Passageway - [Enter, null, null, null, null] +20859 - Passageway - [Enter, null, null, null, null] +20860 - Passageway - [Enter, null, null, null, null] +20861 - Passageway - [Enter, null, null, null, null] +20862 - Passageway - [Enter, null, null, null, null] +20863 - Passageway - [Enter, null, null, null, null] +20864 - Passageway - [Enter, null, null, null, null] +20865 - Passageway - [Enter, null, null, null, null] +20866 - Passageway - [Enter, null, null, null, null] +20867 - Passageway - [Enter, null, null, null, null] +20868 - Passageway - [Enter, null, null, null, null] +20869 - Passageway - [Enter, null, null, null, null] +20870 - Passageway - [Enter, null, null, null, null] +20871 - Passageway - [Enter, null, null, null, null] +20872 - Pillar - [null, null, null, null, Jump-to] +20873 - Pillar - [null, null, null, null, Jump-to] +20874 - Pillar - [null, null, null, null, Jump-to] +20875 - Pillar - [null, null, null, null, Jump-to] +20876 - Pillar - [null, null, null, null, Jump-to] +20877 - Pillar - [null, null, null, null, Jump-to] +20878 - Pillar - [null, null, null, null, Jump-to] +20879 - Pillar - [null, null, null, null, Jump-to] +20880 - Pillar - [null, null, null, null, Jump-to] +20881 - Pillar - [null, null, null, null, Jump-to] +20882 - Pillar - [null, null, null, null, Jump-to] +20883 - Pillar - [null, null, null, null, Jump-to] +20884 - Pillar - [null, null, null, null, Jump-to] +20885 - Pillar - [null, null, null, null, Jump-to] +20886 - Pillar - [null, null, null, null, Jump-to] +20887 - Pillar - [null, null, null, null, Jump-to] +20888 - Pillar - [null, null, null, null, Jump-to] +20889 - Pillar - [null, null, null, null, Jump-to] +20890 - Ledge - [null, null, null, null, Jump-to] +20891 - Ledge - [null, null, null, null, Jump-to] +20892 - Ledge - [null, null, null, null, Jump-to] +20893 - Ledge - [null, null, null, null, Jump-to] +20894 - Ledge - [null, null, null, null, Jump-to] +20895 - Ledge - [null, null, null, null, Jump-to] +20896 - Ledge - [null, null, null, null, Jump-to] +20897 - Ledge - [null, null, null, null, Jump-to] +20898 - Ledge - [null, null, null, null, Jump-to] +20899 - Ledge - [null, null, null, null, Jump-to] +20900 - Ledge - [null, null, null, null, Jump-to] +20901 - Ledge - [null, null, null, null, Jump-to] +20902 - Trap bypass - [null, null, null, null, null] +20903 - Hanging log - [null, null, null, null, null] +20904 - Hanging log - [null, null, null, null, null] +20905 - Hanging log - [null, null, null, null, null] +20906 - Hanging log - [null, null, null, null, null] +20907 - null - [null, null, null, null, null] +20908 - null - [null, null, null, null, null] +20909 - null - [null, null, null, null, null] +20910 - null - [null, null, null, null, null] +20911 - null - [null, null, null, null, null] +20912 - null - [null, null, null, null, null] +20913 - null - [null, null, null, null, null] +20914 - null - [null, null, null, null, null] +20915 - Floor - [null, null, null, null, Search] +20916 - Floor - [null, null, null, null, Search] +20917 - Floor - [null, null, null, null, Search] +20918 - Floor - [null, null, null, null, Search] +20919 - Floor - [null, null, null, null, null] +20920 - Wall - [null, null, null, null, Search] +20921 - Wall - [null, null, null, null, null] +20922 - Wall - [null, null, null, null, Search] +20923 - Wall - [null, null, null, null, null] +20924 - Wall - [null, null, null, null, Search] +20925 - Wall - [null, null, null, null, Search] +20926 - Wall - [null, null, null, null, Search] +20927 - Wall - [null, null, null, null, null] +20928 - Wall - [null, null, null, null, Search] +20929 - Wall - [null, null, null, null, null] +20930 - Wall - [null, null, null, null, Search] +20931 - Wall - [null, null, null, null, Search] +20932 - Wall - [null, null, null, null, null] +20933 - Wall - [null, null, null, null, null] +20934 - Wall - [null, null, null, null, null] +20935 - Wall - [null, null, null, null, null] +20936 - Wall - [null, null, null, null, null] +20937 - Wall - [null, null, null, null, null] +20938 - Wall - [null, null, null, null, null] +20939 - Wall - [null, null, null, null, null] +20940 - Wall - [null, null, null, null, null] +20941 - Wall - [null, null, null, null, null] +20942 - Wall - [null, null, null, null, null] +20943 - Wall - [null, null, null, null, null] +20944 - Wall - [null, null, null, null, null] +20945 - Wall - [null, null, null, null, null] +20946 - Wall - [null, null, null, null, null] +20947 - Wall - [null, null, null, null, null] +20948 - Wall - [null, null, null, null, null] +20949 - Wall - [null, null, null, null, null] +20950 - Wall - [null, null, null, null, null] +20951 - Wall - [null, null, null, null, null] +20952 - Wall - [null, null, null, null, null] +20953 - Wall - [null, null, null, null, null] +20954 - Wall - [null, null, null, null, null] +20955 - Wall - [null, null, null, null, null] +20956 - Floor - [null, null, null, null, null] +20957 - Floor - [null, null, null, null, null] +20958 - Floor - [null, null, null, null, null] +20959 - Floor - [null, null, null, null, null] +20960 - Floor - [null, null, null, null, null] +20961 - Floor - [null, null, null, null, null] +20962 - Floor - [null, null, null, null, null] +20963 - Floor - [null, null, null, null, null] +20964 - Floor - [Search, null, null, null, null] +20965 - Floor - [Search, null, null, null, null] +20966 - Floor - [Search, null, null, null, null] +20967 - Floor - [Search, null, null, null, null] +20968 - Floor - [Search, null, null, null, null] +20969 - Floor - [Search, null, null, null, null] +20970 - Floor - [Search, null, null, null, null] +20971 - Floor - [Search, null, null, null, null] +20972 - null - [null, null, null, null, null] +20973 - null - [null, null, null, null, null] +20974 - null - [null, null, null, null, null] +20975 - null - [null, null, null, null, null] +20976 - null - [null, null, null, null, null] +20977 - null - [null, null, null, null, null] +20978 - Gnome skeleton - [null, null, null, null, null] +20979 - null - [null, null, null, null, null] +20980 - null - [null, null, null, null, null] +20981 - null - [null, null, null, null, null] +20982 - null - [null, null, null, null, null] +20983 - null - [null, null, null, null, null] +20984 - null - [null, null, null, null, null] +20985 - Mummy - [null, null, null, null, null] +20986 - Mummy - [null, null, null, null, null] +20987 - Ladder - [Climb-down, null, null, null, null] +20988 - null - [null, null, null, null, null] +20989 - null - [null, null, null, null, null] +20990 - null - [null, null, null, null, null] +20991 - null - [null, null, null, null, null] +20992 - null - [null, null, null, null, null] +20993 - null - [null, null, null, null, null] +20994 - null - [null, null, null, null, null] +20995 - Golf-cart - [null, null, null, null, null] +20996 - Table - [null, null, null, null, null] +20997 - null - [null, null, null, null, null] +20998 - null - [null, null, null, null, null] +20999 - Chair - [null, null, null, null, null] +21000 - Map - [null, null, null, null, null] +21001 - Interrogation chair - [null, null, null, null, null] +21002 - Steam generator - [null, null, null, null, null] +21003 - null - [null, null, null, null, null] +21004 - null - [null, null, null, null, null] +21005 - null - [null, null, null, null, null] +21006 - null - [null, null, null, null, null] +21007 - null - [null, null, null, null, null] +21008 - Drill - [null, null, null, null, null] +21009 - Lathe - [null, null, null, null, null] +21010 - Gigantic penguin - [null, null, null, null, null] +21011 - null - [null, null, null, null, null] +21012 - null - [null, null, null, null, null] +21013 - Crate - [null, null, null, null, null] +21014 - Crate - [null, null, null, null, null] +21015 - Crates - [null, null, null, null, null] +21016 - Barrel - [null, null, null, null, null] +21017 - null - [null, null, null, null, null] +21018 - Workbench - [null, null, null, null, null] +21019 - Workbench - [null, null, null, null, null] +21020 - null - [null, null, null, null, null] +21021 - null - [null, null, null, null, null] +21022 - Bed - [null, null, null, null, null] +21023 - Lockers - [null, null, null, null, null] +21024 - Foot lockers - [null, null, null, null, null] +21025 - Cello - [null, null, null, null, null] +21026 - Guitar - [null, null, null, null, null] +21027 - Harp - [null, null, null, null, null] +21028 - Flute - [null, null, null, null, null] +21029 - Trumpet - [null, null, null, null, null] +21030 - Piano - [null, null, null, null, null] +21031 - Stool - [null, null, null, null, null] +21032 - Clarinet - [null, null, null, null, null] +21033 - Music Scores - [null, null, null, null, null] +21034 - null - [null, null, null, null, null] +21035 - Chasm - [Use, null, null, null, null] +21036 - null - [null, null, null, null, null] +21037 - null - [null, null, null, null, null] +21038 - null - [null, null, null, null, null] +21039 - null - [null, null, null, null, null] +21040 - null - [null, null, null, null, null] +21041 - null - [null, null, null, null, null] +21042 - null - [null, null, null, null, null] +21043 - null - [null, null, null, null, null] +21044 - null - [null, null, null, null, null] +21045 - null - [null, null, null, null, null] +21046 - null - [null, null, null, null, null] +21047 - null - [null, null, null, null, null] +21048 - null - [null, null, null, null, null] +21049 - null - [null, null, null, null, null] +21050 - null - [null, null, null, null, null] +21051 - null - [null, null, null, null, null] +21052 - null - [null, null, null, null, null] +21053 - null - [null, null, null, null, null] +21054 - null - [null, null, null, null, null] +21055 - Control panel - [Use, null, null, null, null] +21056 - null - [null, null, null, null, null] +21057 - null - [null, null, null, null, null] +21058 - null - [null, null, null, null, null] +21059 - null - [null, null, null, null, null] +21060 - null - [null, null, null, null, null] +21061 - null - [null, null, null, null, null] +21062 - null - [null, null, null, null, null] +21063 - null - [null, null, null, null, null] +21064 - null - [null, null, null, null, null] +21065 - Door - [Open, null, null, null, null] +21066 - Door - [null, null, null, null, null] +21067 - Door - [null, null, null, null, null] +21068 - Door - [Open, null, null, null, null] +21069 - null - [null, null, null, null, null] +21070 - null - [null, null, null, null, null] +21071 - null - [null, null, null, null, null] +21072 - null - [null, null, null, null, null] +21073 - null - [null, null, null, null, null] +21074 - null - [null, null, null, null, null] +21075 - null - [null, null, null, null, null] +21076 - null - [null, null, null, null, null] +21077 - null - [null, null, null, null, null] +21078 - null - [null, null, null, null, null] +21079 - null - [null, null, null, null, null] +21080 - null - [null, null, null, null, null] +21081 - null - [null, null, null, null, null] +21082 - null - [null, null, null, null, null] +21083 - null - [null, null, null, null, null] +21084 - null - [null, null, null, null, null] +21085 - Spinning light - [null, null, null, null, null] +21086 - Big Button - [Use, null, null, null, null] +21087 - null - [null, null, null, null, null] +21088 - null - [null, null, null, null, null] +21089 - null - [null, null, null, null, null] +21090 - null - [null, null, null, null, null] +21091 - null - [null, null, null, null, null] +21092 - Crazy penguin - [null, null, null, null, null] +21093 - Crazy penguin - [null, null, null, null, null] +21094 - Crazy penguin - [null, null, null, null, null] +21095 - Ice steps - [Climb, null, null, null, null] +21096 - null - [null, null, null, null, null] +21097 - null - [null, null, null, null, null] +21098 - null - [null, null, null, null, null] +21099 - null - [null, null, null, null, null] +21100 - null - [null, null, null, null, null] +21101 - null - [null, null, null, null, null] +21102 - null - [null, null, null, null, null] +21103 - null - [null, null, null, null, null] +21104 - null - [null, null, null, null, null] +21105 - null - [null, null, null, null, null] +21106 - Start - [null, null, null, null, null] +21107 - Sign - [null, null, null, null, null] +21108 - null - [null, null, null, null, null] +21109 - null - [null, null, null, null, null] +21110 - null - [null, null, null, null, null] +21111 - null - [null, null, null, null, null] +21112 - null - [null, null, null, null, null] +21113 - null - [null, null, null, null, null] +21114 - null - [null, null, null, null, null] +21115 - null - [null, null, null, null, null] +21116 - null - [null, null, null, null, null] +21117 - null - [null, null, null, null, null] +21118 - null - [null, null, null, null, null] +21119 - null - [null, null, null, null, null] +21120 - Stepping Stone - [Climb, null, null, null, null] +21121 - Stepping Stone - [null, null, null, null, null] +21122 - Stepping Stone - [null, null, null, null, null] +21123 - Stepping Stone - [null, null, null, null, null] +21124 - Stepping Stone - [null, null, null, null, null] +21125 - null - [null, null, null, null, null] +21126 - Stepping Stone - [Jump, null, null, null, null] +21127 - Stepping Stone - [Jump, null, null, null, null] +21128 - Stepping Stone - [Jump, null, null, null, null] +21129 - Stepping Stone - [Jump, null, null, null, null] +21130 - Stepping Stone - [Jump, null, null, null, null] +21131 - Stepping Stone - [Jump, null, null, null, null] +21132 - Stepping Stone - [Jump, null, null, null, null] +21133 - Stepping Stone - [Jump, null, null, null, null] +21134 - Icicles - [Tread-softly, null, null, null, null] +21135 - null - [null, null, null, null, null] +21136 - null - [null, null, null, null, null] +21137 - null - [null, null, null, null, null] +21138 - null - [null, null, null, null, null] +21139 - null - [null, null, null, null, null] +21140 - null - [null, null, null, null, null] +21141 - null - [null, null, null, null, null] +21142 - Snow jump - [Jump, null, null, null, null] +21143 - Snow jump - [Jump, null, null, null, null] +21144 - null - [null, null, null, null, null] +21145 - null - [null, null, null, null, null] +21146 - null - [null, null, null, null, null] +21147 - Wooden platform - [null, null, null, null, null] +21148 - Ice - [Cross, null, null, null, null] +21149 - Ice - [Cross, null, null, null, null] +21150 - Ice - [Cross, null, null, null, null] +21151 - Ice - [Cross, null, null, null, null] +21152 - Ice - [Cross, null, null, null, null] +21153 - Ice - [Cross, null, null, null, null] +21154 - Ice - [Cross, null, null, null, null] +21155 - Ice - [Cross, null, null, null, null] +21156 - Ice - [Cross, null, null, null, null] +21157 - A crack - [Use, null, null, null, null] +21158 - Avalanche - [Use, null, null, null, null] +21159 - Avalanche - [Use, null, null, null, null] +21160 - Door - [Open, null, null, null, null] +21161 - Door - [Close, null, null, null, null] +21162 - Door - [Open, null, null, null, null] +21163 - null - [null, null, null, null, null] +21164 - Door - [Open, null, null, null, null] +21165 - null - [null, null, null, null, null] +21166 - Door - [null, null, null, null, null] +21167 - Door - [Open, null, null, null, null] +21168 - null - [null, null, null, null, null] +21169 - Door - [Open, null, null, null, null] +21170 - Door - [Open, null, null, null, null] +21171 - Door - [Open, null, null, null, null] +21172 - Gate - [Open, null, null, null, null] +21173 - null - [null, null, null, null, null] +21174 - null - [null, null, null, null, null] +21175 - Boat - [Travel, null, null, null, null] +21176 - Boat - [Travel, null, null, null, null] +21177 - Boat - [Travel, null, null, null, null] +21178 - null - [null, null, null, null, null] +21179 - Firm snow patch - [Use, null, null, null, null] +21180 - Bird hide structure - [Use, null, null, null, null] +21181 - Snowy bird hide - [Use, null, null, null, null] +21182 - Destroyed bird hide - [Use, null, null, null, null] +21183 - Suspicious footprints - [null, null, null, null, null] +21184 - Suspicious footprints - [null, null, null, null, null] +21185 - Suspicious footprints - [null, null, null, null, null] +21186 - null - [null, null, null, null, null] +21187 - Chasm - [Use, null, null, null, null] +21188 - null - [null, null, null, null, null] +21189 - null - [null, null, null, null, null] +21190 - null - [null, null, null, null, null] +21191 - null - [null, null, null, null, null] +21192 - null - [null, null, null, null, null] +21193 - null - [null, null, null, null, null] +21194 - null - [null, null, null, null, null] +21195 - null - [null, null, null, null, null] +21196 - null - [null, null, null, null, null] +21197 - null - [null, null, null, null, null] +21198 - null - [null, null, null, null, null] +21199 - Snow - [null, null, null, null, null] +21200 - Snow - [null, null, null, null, null] +21201 - Door - [null, null, null, null, null] +21202 - null - [null, null, null, null, null] +21203 - null - [null, null, null, null, null] +21204 - null - [null, null, null, null, null] +21205 - null - [null, null, null, null, null] +21206 - null - [null, null, null, null, null] +21207 - null - [null, null, null, null, null] +21208 - null - [null, null, null, null, null] +21209 - null - [null, null, null, null, null] +21210 - null - [null, null, null, null, null] +21211 - null - [null, null, null, null, null] +21212 - null - [null, null, null, null, null] +21213 - null - [null, null, null, null, null] +21214 - null - [null, null, null, null, null] +21215 - null - [null, null, null, null, null] +21216 - null - [null, null, null, null, null] +21217 - null - [null, null, null, null, null] +21218 - null - [null, null, null, null, null] +21219 - null - [null, null, null, null, null] +21220 - null - [null, null, null, null, null] +21221 - null - [null, null, null, null, null] +21222 - null - [null, null, null, null, null] +21223 - null - [null, null, null, null, null] +21224 - null - [null, null, null, null, null] +21225 - null - [null, null, null, null, null] +21226 - null - [null, null, null, null, null] +21227 - null - [null, null, null, null, null] +21228 - null - [null, null, null, null, null] +21229 - null - [null, null, null, null, null] +21230 - null - [null, null, null, null, null] +21231 - null - [null, null, null, null, null] +21232 - null - [null, null, null, null, null] +21233 - null - [null, null, null, null, null] +21234 - null - [null, null, null, null, null] +21235 - null - [null, null, null, null, null] +21236 - null - [null, null, null, null, null] +21237 - null - [null, null, null, null, null] +21238 - null - [null, null, null, null, null] +21239 - null - [null, null, null, null, null] +21240 - null - [null, null, null, null, null] +21241 - null - [null, null, null, null, null] +21242 - null - [null, null, null, null, null] +21243 - Door - [Open, null, null, null, null] +21244 - null - [null, null, null, null, null] +21245 - null - [Use, null, null, null, null] +21246 - null - [Use, null, null, null, null] +21247 - null - [null, null, null, null, null] +21248 - null - [null, null, null, null, null] +21249 - null - [null, null, null, null, null] +21250 - Collector Converter - [Convert, null, null, null, null] +21251 - Rocks - [Mine, Prospect, hidden, null, null] +21252 - Rocks - [Mine, Prospect, hidden, null, null] +21253 - Rocks - [Mine, Prospect, hidden, null, null] +21254 - Rocks - [Mine, Prospect, hidden, null, null] +21255 - Rocks - [Mine, Prospect, hidden, null, null] +21256 - Rocks - [Mine, Prospect, hidden, null, null] +21257 - Rocks - [Mine, Prospect, hidden, null, null] +21258 - Rocks - [Mine, Prospect, hidden, null, null] +21259 - Rocks - [Mine, Prospect, hidden, null, null] +21260 - Rocks - [Mine, Prospect, hidden, null, null] +21261 - Rocks - [Mine, Prospect, hidden, null, null] +21262 - Rocks - [Mine, Prospect, hidden, null, null] +21263 - Rocks - [Mine, Prospect, hidden, null, null] +21264 - Rocks - [Mine, Prospect, hidden, null, null] +21265 - Rocks - [Mine, Prospect, hidden, null, null] +21266 - Rocks - [Mine, Prospect, hidden, null, null] +21267 - Rocks - [Mine, Prospect, hidden, null, null] +21268 - Rocks - [Mine, Prospect, hidden, null, null] +21269 - Rocks - [Mine, Prospect, hidden, null, null] +21270 - Rocks - [Mine, Prospect, hidden, null, null] +21271 - Funeral pyre - [null, null, null, null, null] +21272 - Funeral pyre - [Light, null, null, null, null] +21273 - Arctic Pine - [Cut down, null, hidden, null, null] +21274 - Tree Stump - [null, null, null, null, null] +21275 - Rocks - [Mine, Prospect, hidden, null, null] +21276 - Rocks - [Mine, Prospect, hidden, null, null] +21277 - Rocks - [Mine, Prospect, hidden, null, null] +21278 - Rocks - [Mine, Prospect, hidden, null, null] +21279 - Rocks - [Mine, Prospect, hidden, null, null] +21280 - Rocks - [Mine, Prospect, hidden, null, null] +21281 - Rocks - [Mine, Prospect, hidden, null, null] +21282 - Rocks - [Mine, Prospect, hidden, null, null] +21283 - Rocks - [Mine, Prospect, hidden, null, null] +21284 - Rocks - [Mine, Prospect, hidden, null, null] +21285 - Rocks - [Mine, Prospect, hidden, null, null] +21286 - Rocks - [Mine, Prospect, hidden, null, null] +21287 - Rocks - [Mine, Prospect, hidden, null, null] +21288 - Rocks - [Mine, Prospect, hidden, null, null] +21289 - Rocks - [Mine, Prospect, hidden, null, null] +21290 - Rocks - [Mine, Prospect, hidden, null, null] +21291 - Rocks - [Mine, Prospect, hidden, null, null] +21292 - Rocks - [Mine, Prospect, hidden, null, null] +21293 - Rocks - [Mine, Prospect, hidden, null, null] +21294 - Rocks - [Mine, Prospect, hidden, null, null] +21295 - Rocks - [Mine, Prospect, hidden, null, null] +21296 - Rocks - [Mine, Prospect, hidden, null, null] +21297 - Rocks - [Mine, Prospect, hidden, null, null] +21298 - Rocks - [Mine, Prospect, hidden, null, null] +21299 - Chest - [Open, null, null, null, null] +21300 - Chest - [Search, null, null, null, null] +21301 - Bank chest - [Use, null, null, null, null] +21302 - Clay oven - [null, null, null, null, null] +21303 - Clay forge - [null, Smelt-ore, null, null, null] +21304 - Spinning wheel - [Spin, null, null, null, null] +21305 - Woodcutting stump - [Cut-wood, null, null, null, null] +21306 - Rope bridge - [Walk-across, null, null, null, null] +21307 - Rope bridge - [Walk-across, null, null, null, null] +21308 - Rope bridge - [Walk-across, null, null, null, null] +21309 - Rope bridge - [Walk-across, null, null, null, null] +21310 - Rope bridge - [Walk-across, Repair, null, null, null] +21311 - Rope bridge - [Walk-across, Repair, null, null, null] +21312 - Rope bridge - [Walk-across, Repair, null, null, null] +21313 - Rope bridge - [Walk-across, Repair, null, null, null] +21314 - Rope bridge - [Cross-bridge, null, null, null, null] +21315 - Rope bridge - [Walk-across, null, null, null, null] +21316 - Rope bridge - [Walk-across, null, null, null, null] +21317 - Rope bridge - [Walk-across, null, null, null, null] +21318 - Rope bridge - [Walk-across, null, null, null, null] +21319 - Rope bridge - [Walk-across, null, null, null, null] +21320 - null - [null, null, null, null, null] +21321 - null - [null, null, null, null, null] +21322 - null - [null, null, null, null, null] +21323 - null - [null, null, null, null, null] +21324 - null - [null, null, null, null, null] +21325 - null - [null, null, null, null, null] +21326 - null - [null, null, null, null, null] +21327 - null - [null, null, null, null, null] +21328 - null - [null, null, null, null, null] +21329 - null - [null, null, null, null, null] +21330 - null - [null, null, null, null, null] +21331 - null - [null, null, null, null, null] +21332 - null - [null, null, null, null, null] +21333 - null - [null, null, null, null, null] +21334 - null - [null, null, null, null, null] +21335 - null - [null, null, null, null, null] +21336 - null - [null, null, null, null, null] +21337 - null - [null, null, null, null, null] +21338 - null - [null, null, null, null, null] +21339 - null - [null, null, null, null, null] +21340 - Door - [Open, null, null, null, null] +21341 - Door - [Open, null, null, null, null] +21342 - Door - [Close, null, null, null, null] +21343 - Door - [Close, null, null, null, null] +21344 - null - [null, null, null, null, null] +21345 - null - [null, null, null, null, null] +21346 - null - [null, null, null, null, null] +21347 - null - [null, null, null, null, null] +21348 - null - [null, null, null, null, null] +21349 - null - [null, null, null, null, null] +21350 - null - [null, null, null, null, null] +21351 - null - [null, null, null, null, null] +21352 - null - [null, null, null, null, null] +21353 - null - [null, null, null, null, null] +21354 - Chair - [null, null, null, null, null] +21355 - Large Geyser - [null, null, null, null, null] +21356 - Small Geyser - [null, null, null, null, null] +21357 - null - [null, null, null, null, null] +21358 - Bank Table - [null, null, null, null, null] +21359 - Table - [null, null, null, null, null] +21360 - Table - [null, null, null, null, null] +21361 - Smashed chair - [null, null, null, null, null] +21362 - Bed - [null, null, null, null, null] +21363 - null - [null, null, null, null, null] +21364 - null - [null, null, null, null, null] +21365 - null - [null, null, null, null, null] +21366 - null - [null, null, null, null, null] +21367 - null - [null, null, null, null, null] +21368 - null - [null, null, null, null, null] +21369 - null - [null, null, null, null, null] +21370 - null - [null, null, null, null, null] +21371 - null - [null, null, null, null, null] +21372 - null - [null, null, null, null, null] +21373 - null - [null, null, null, null, null] +21374 - null - [null, null, null, null, null] +21375 - null - [null, null, null, null, null] +21376 - null - [null, null, null, null, null] +21377 - null - [null, null, null, null, null] +21378 - null - [null, null, null, null, null] +21379 - null - [null, null, null, null, null] +21380 - null - [null, null, null, null, null] +21381 - null - [null, null, null, null, null] +21382 - null - [null, null, null, null, null] +21383 - null - [null, null, null, null, null] +21384 - null - [null, null, null, null, null] +21385 - null - [null, null, null, null, null] +21386 - null - [null, null, null, null, null] +21387 - null - [null, null, null, null, null] +21388 - Table - [null, null, null, null, null] +21389 - Table - [null, null, null, null, null] +21390 - Sacks - [null, null, null, null, null] +21391 - null - [null, null, null, null, null] +21392 - null - [null, null, null, null, null] +21393 - Throne - [null, null, null, null, null] +21394 - Bell - [Ring-bell, null, null, null, null] +21395 - Ladder - [Climb-up, null, null, null, null] +21396 - Ladder - [Climb-down, null, null, null, null] +21397 - Large door - [Open, null, null, null, null] +21398 - Large door - [Close, null, null, null, null] +21399 - Large door - [Open, null, null, null, null] +21400 - Large door - [Open, null, null, null, null] +21401 - Large door - [Close, null, null, null, null] +21402 - Large door - [Close, null, null, null, null] +21403 - Gate - [Open, null, null, null, null] +21404 - Gate - [Close, null, null, null, null] +21405 - Gate - [Open, null, null, null, null] +21406 - Gate - [Close, null, null, null, null] +21407 - null - [null, null, null, null, null] +21408 - null - [null, null, null, null, null] +21409 - null - [null, null, null, null, null] +21410 - null - [null, null, null, null, null] +21411 - null - [null, null, null, null, null] +21412 - null - [null, null, null, null, null] +21413 - null - [null, null, null, null, null] +21414 - null - [null, null, null, null, null] +21415 - null - [null, null, null, null, null] +21416 - null - [null, null, null, null, null] +21417 - null - [null, null, null, null, null] +21418 - null - [null, null, null, null, null] +21419 - null - [null, null, null, null, null] +21420 - null - [null, null, null, null, null] +21421 - null - [null, null, null, null, null] +21422 - null - [null, null, null, null, null] +21423 - null - [null, null, null, null, null] +21424 - null - [null, null, null, null, null] +21425 - null - [null, null, null, null, null] +21426 - null - [null, null, null, null, null] +21427 - null - [null, null, null, null, null] +21428 - null - [null, null, null, null, null] +21429 - null - [null, null, null, null, null] +21430 - null - [null, null, null, null, null] +21431 - null - [null, null, null, null, null] +21432 - null - [null, null, null, null, null] +21433 - null - [null, null, null, null, null] +21434 - null - [null, null, null, null, null] +21435 - null - [null, null, null, null, null] +21436 - null - [null, null, null, null, null] +21437 - Axe case - [null, null, null, null, null] +21438 - Sword case - [null, null, null, null, null] +21439 - Swords - [null, null, null, null, null] +21440 - null - [null, null, null, null, null] +21441 - Chopping table - [null, null, null, null, null] +21442 - Ore crate - [null, null, null, null, null] +21443 - Ore table - [null, null, null, null, null] +21444 - Ore stones - [null, null, null, null, null] +21445 - Shield display - [null, null, null, null, null] +21446 - Shield display - [null, null, null, null, null] +21447 - Armour display - [null, null, null, null, null] +21448 - null - [null, null, null, null, null] +21449 - null - [null, null, null, null, null] +21450 - null - [null, null, null, null, null] +21451 - null - [null, null, null, null, null] +21452 - null - [null, null, null, null, null] +21453 - null - [null, null, null, null, null] +21454 - null - [null, null, null, null, null] +21455 - Staircase - [Climb-Down, null, null, null, null] +21456 - null - [null, null, null, null, null] +21457 - null - [null, null, null, null, null] +21458 - null - [null, null, null, null, null] +21459 - Arch - [null, null, null, null, null] +21460 - Arch - [null, null, null, null, null] +21461 - Arch - [null, null, null, null, null] +21462 - null - [null, null, null, null, null] +21463 - null - [null, null, null, null, null] +21464 - Throne - [null, null, null, null, null] +21465 - Torch - [null, null, null, null, null] +21466 - null - [null, null, null, null, null] +21467 - null - [null, null, null, null, null] +21468 - null - [null, null, null, null, null] +21469 - null - [null, null, null, null, null] +21470 - null - [null, null, null, null, null] +21471 - null - [null, null, null, null, null] +21472 - null - [null, null, null, null, null] +21473 - null - [null, null, null, null, null] +21474 - null - [null, null, null, null, null] +21475 - null - [null, null, null, null, null] +21476 - null - [null, null, null, null, null] +21477 - null - [null, null, null, null, null] +21478 - null - [null, null, null, null, null] +21479 - null - [null, null, null, null, null] +21480 - null - [null, null, null, null, null] +21481 - null - [null, null, null, null, null] +21482 - null - [null, null, null, null, null] +21483 - null - [null, null, null, null, null] +21484 - null - [null, null, null, null, null] +21485 - null - [null, null, null, null, null] +21486 - null - [null, null, null, null, null] +21487 - null - [null, null, null, null, null] +21488 - null - [null, null, null, null, null] +21489 - null - [null, null, null, null, null] +21490 - null - [null, null, null, null, null] +21491 - null - [null, null, null, null, null] +21492 - null - [null, null, null, null, null] +21493 - null - [null, null, null, null, null] +21494 - null - [null, null, null, null, null] +21495 - null - [null, null, null, null, null] +21496 - null - [null, null, null, null, null] +21497 - null - [null, null, null, null, null] +21498 - null - [null, null, null, null, null] +21499 - null - [null, null, null, null, null] +21500 - Banner - [null, null, null, null, null] +21501 - Banner - [null, null, null, null, null] +21502 - null - [null, hidden, null, null, null] +21503 - null - [null, null, null, null, null] +21504 - null - [null, null, null, null, null] +21505 - Door - [Open, null, null, null, null] +21506 - Door - [Close, null, null, null, null] +21507 - Door - [Open, null, null, null, null] +21508 - Door - [Close, null, null, null, null] +21509 - Rope bridge - [null, null, null, null, null] +21510 - Broken rope bridge - [null, null, null, null, null] +21511 - null - [Climb-up, null, null, null, null] +21512 - Ladder - [Climb-up, null, null, null, null] +21513 - Ladder - [Climb-down, null, null, null, null] +21514 - Ladder - [Climb-up, null, null, null, null] +21515 - Ladder - [Climb-down, null, null, null, null] +21516 - null - [null, null, null, null, null] +21517 - null - [null, null, null, null, null] +21518 - null - [null, null, null, null, null] +21519 - null - [null, null, null, null, null] +21520 - null - [null, null, null, null, null] +21521 - null - [null, null, null, null, null] +21522 - null - [null, null, null, null, null] +21523 - null - [null, null, null, null, null] +21524 - null - [null, null, null, null, null] +21525 - null - [null, null, null, null, null] +21526 - null - [null, null, null, null, null] +21527 - null - [null, null, null, null, null] +21528 - null - [null, null, null, null, null] +21529 - Rift - [null, null, null, null, null] +21530 - Rift - [null, null, null, null, null] +21531 - Rift - [null, null, null, null, null] +21532 - Rift - [null, null, null, null, null] +21533 - Rift - [null, null, null, null, null] +21534 - Rift - [null, null, null, null, null] +21535 - Rift - [null, null, null, null, null] +21536 - Rift - [null, null, null, null, null] +21537 - Rift - [null, null, null, null, null] +21538 - Rift - [null, null, null, null, null] +21539 - Rift - [null, null, null, null, null] +21540 - null - [null, null, null, null, null] +21541 - null - [null, null, null, null, null] +21542 - null - [null, null, null, null, null] +21543 - null - [null, null, null, null, null] +21544 - null - [null, null, null, null, null] +21545 - Vault - [null, null, null, null, null] +21546 - Pillar - [null, null, null, null, null] +21547 - Pillar - [null, null, null, null, null] +21548 - Pillar - [null, null, null, null, null] +21549 - null - [null, null, null, null, null] +21550 - Banana Tree - [Search, null, null, null, null] +21551 - null - [null, null, null, null, null] +21552 - null - [null, null, null, null, null] +21553 - null - [null, null, null, null, null] +21554 - null - [null, null, null, null, null] +21555 - null - [null, null, null, null, null] +21556 - null - [null, null, null, null, null] +21557 - null - [null, null, null, null, null] +21558 - null - [null, null, null, null, null] +21559 - null - [null, null, null, null, null] +21560 - Exit cavern - [Exit-cave, null, null, null, null] +21561 - null - [null, null, null, null, null] +21562 - null - [null, null, null, null, null] +21563 - null - [null, null, null, null, null] +21564 - null - [null, null, null, null, null] +21565 - null - [null, null, null, null, null] +21566 - null - [null, null, null, null, null] +21567 - null - [null, null, null, null, null] +21568 - null - [null, null, null, null, null] +21569 - Mushrooms - [null, null, null, null, null] +21570 - Mushrooms - [null, null, null, null, null] +21571 - Rock - [null, null, null, null, null] +21572 - Small rock - [null, null, null, null, null] +21573 - Rock - [null, null, null, null, null] +21574 - Boulders - [null, null, null, null, null] +21575 - Boulders - [null, null, null, null, null] +21576 - null - [null, null, null, null, null] +21577 - null - [null, null, null, null, null] +21578 - Staircase - [Climb-up, null, null, null, null] +21579 - null - [null, null, null, null, null] +21580 - Cave - [null, null, null, null, null] +21581 - Cave - [Open, null, null, null, null] +21582 - Cave - [null, null, null, null, null] +21583 - Cave - [Open, null, null, null, null] +21584 - Cave - [Open, null, null, null, null] +21585 - Cave - [Open, null, null, null, null] +21586 - Cave - [Open, null, null, null, null] +21587 - Cave - [Close, null, null, null, null] +21588 - Cave - [Close, null, null, null, null] +21589 - Cave - [Close, null, null, null, null] +21590 - Cave - [Close, null, null, null, null] +21591 - Stone ladder - [null, null, null, null, null] +21592 - Stone ladder - [Climb-up, null, null, null, null] +21593 - Stone ladder - [Climb-down, null, null, null, null] +21594 - Cave opening - [Exit, null, null, null, null] +21595 - Cave opening - [Exit, null, null, null, null] +21596 - Cave opening - [Exit, null, null, null, null] +21597 - Cave opening - [Exit, null, null, null, null] +21598 - Cave opening - [Exit, null, null, null, null] +21599 - Cave opening - [Exit, null, null, null, null] +21600 - Gate - [Open, null, null, null, null] +21601 - Gate - [Close, null, null, null, null] +21602 - null - [null, null, null, null, null] +21603 - Broken barrel - [null, null, null, null, null] +21604 - null - [null, null, null, null, null] +21605 - null - [null, null, null, null, null] +21606 - null - [null, null, null, null, null] +21607 - Chair - [null, null, null, null, null] +21608 - Table - [null, null, null, null, null] +21609 - Table - [null, null, null, null, null] +21610 - Table - [null, null, null, null, null] +21611 - Bed - [null, null, null, null, null] +21612 - Crate - [null, null, null, null, null] +21613 - null - [null, null, null, null, null] +21614 - Shelf - [null, null, null, null, null] +21615 - Shelf - [null, null, null, null, null] +21616 - null - [null, null, null, null, null] +21617 - null - [null, null, null, null, null] +21618 - null - [null, null, null, null, null] +21619 - null - [null, null, null, null, null] +21620 - Fire - [null, null, null, null, null] +21621 - null - [null, null, null, null, null] +21622 - Ice Troll King - [Decapitate, null, null, null, null] +21623 - Ice Troll King - [null, null, null, null, null] +21624 - null - [null, null, null, null, null] +21625 - null - [null, null, null, null, null] +21626 - null - [null, null, null, null, null] +21627 - null - [null, null, null, null, null] +21628 - null - [null, null, null, null, null] +21629 - null - [null, null, null, null, null] +21630 - null - [null, null, null, null, null] +21631 - null - [null, null, null, null, null] +21632 - null - [null, null, null, null, null] +21633 - null - [null, null, null, null, null] +21634 - Fremennik boat - [null, null, null, null, null] +21635 - Standard - [null, null, null, null, null] +21636 - Standard - [null, null, null, null, null] +21637 - Standard - [null, null, null, null, null] +21638 - null - [null, null, null, null, null] +21639 - null - [null, null, null, null, null] +21640 - null - [null, null, null, null, null] +21641 - null - [null, null, null, null, null] +21642 - null - [null, null, null, null, null] +21643 - null - [null, null, null, null, null] +21644 - null - [null, null, null, null, null] +21645 - null - [null, null, null, null, null] +21646 - null - [null, null, null, null, null] +21647 - null - [null, null, null, null, null] +21648 - null - [null, null, null, null, null] +21649 - null - [null, null, null, null, null] +21650 - null - [null, null, null, null, null] +21651 - null - [null, null, null, null, null] +21652 - null - [null, null, null, null, null] +21653 - null - [null, null, null, null, null] +21654 - null - [null, null, null, null, null] +21655 - null - [null, null, null, null, null] +21656 - null - [null, null, null, null, null] +21657 - null - [null, null, null, null, null] +21658 - null - [null, null, null, null, null] +21659 - null - [null, null, null, null, null] +21660 - null - [null, null, null, null, null] +21661 - null - [null, null, null, null, null] +21662 - null - [null, null, null, null, null] +21663 - null - [null, null, null, null, null] +21664 - null - [null, null, null, null, null] +21665 - null - [null, null, null, null, null] +21666 - null - [null, null, null, null, null] +21667 - Torch - [null, null, null, null, null] +21668 - Herbs - [Pick, null, null, null, null] +21669 - Herbs - [Pick, null, null, null, null] +21670 - Herbs - [Pick, null, null, null, null] +21671 - Herbs - [Pick, null, null, null, null] +21672 - Gate - [Open, null, null, null, null] +21673 - Gate - [Open, null, null, null, null] +21674 - Gate - [Open, null, null, null, null] +21675 - Gate - [Open, null, null, null, null] +21676 - null - [null, null, null, null, null] +21677 - null - [null, null, null, null, null] +21678 - null - [null, null, null, null, null] +21679 - null - [null, null, null, null, null] +21680 - null - [null, null, null, null, null] +21681 - null - [null, null, null, null, null] +21682 - null - [null, null, null, null, null] +21683 - null - [null, null, null, null, null] +21684 - null - [null, null, null, null, null] +21685 - null - [null, null, null, null, null] +21686 - null - [null, null, null, null, null] +21687 - Gate - [Open, null, null, null, null] +21688 - null - [null, null, null, null, null] +21689 - null - [null, null, null, null, null] +21690 - null - [null, null, null, null, null] +21691 - null - [null, null, null, null, null] +21692 - null - [null, null, null, null, null] +21693 - null - [null, null, null, null, null] +21694 - null - [null, null, null, null, null] +21695 - null - [null, null, null, null, null] +21696 - null - [null, null, null, null, null] +21697 - null - [null, null, null, null, null] +21698 - null - [null, null, null, null, null] +21699 - null - [null, null, null, null, null] +21700 - null - [null, null, null, null, null] +21701 - null - [null, null, null, null, null] +21702 - null - [null, null, null, null, null] +21703 - null - [null, null, null, null, null] +21704 - null - [null, null, null, null, null] +21705 - null - [null, null, null, null, null] +21706 - null - [null, null, null, null, null] +21707 - null - [null, null, null, null, null] +21708 - null - [null, null, null, null, null] +21709 - Gate - [Open, null, null, null, null] +21710 - null - [null, null, null, null, null] +21711 - null - [null, null, null, null, null] +21712 - null - [null, null, null, null, null] +21713 - null - [null, null, null, null, null] +21714 - null - [null, null, null, null, null] +21715 - null - [null, null, null, null, null] +21716 - null - [null, null, null, null, null] +21717 - null - [null, null, null, null, null] +21718 - null - [null, null, null, null, null] +21719 - null - [null, null, null, null, null] +21720 - null - [null, null, null, null, null] +21721 - null - [null, null, null, null, null] +21722 - null - [null, null, null, null, null] +21723 - null - [null, null, null, null, null] +21724 - null - [null, null, null, null, null] +21725 - null - [null, null, null, null, null] +21726 - null - [null, null, null, null, null] +21727 - null - [null, null, null, null, null] +21728 - null - [null, null, null, null, null] +21729 - null - [null, null, null, null, null] +21730 - null - [null, null, null, null, null] +21731 - Gate - [Open, null, null, null, null] +21732 - null - [null, null, null, null, null] +21733 - null - [null, null, null, null, null] +21734 - null - [null, null, null, null, null] +21735 - null - [null, null, null, null, null] +21736 - null - [null, null, null, null, null] +21737 - null - [null, null, null, null, null] +21738 - null - [null, null, null, null, null] +21739 - null - [null, null, null, null, null] +21740 - null - [null, null, null, null, null] +21741 - null - [null, null, null, null, null] +21742 - null - [null, null, null, null, null] +21743 - null - [null, null, null, null, null] +21744 - null - [null, null, null, null, null] +21745 - null - [null, null, null, null, null] +21746 - null - [null, null, null, null, null] +21747 - null - [null, null, null, null, null] +21748 - null - [null, null, null, null, null] +21749 - null - [null, null, null, null, null] +21750 - null - [null, null, null, null, null] +21751 - null - [null, null, null, null, null] +21752 - null - [null, null, null, null, null] +21753 - Gate - [Open, null, null, null, null] +21754 - null - [null, null, null, null, null] +21755 - null - [null, null, null, null, null] +21756 - null - [null, null, null, null, null] +21757 - null - [null, null, null, null, null] +21758 - null - [null, null, null, null, null] +21759 - null - [null, null, null, null, null] +21760 - null - [null, null, null, null, null] +21761 - null - [null, null, null, null, null] +21762 - null - [null, null, null, null, null] +21763 - null - [null, null, null, null, null] +21764 - Fountain - [Drink-from, null, null, null, null] +21765 - null - [null, null, null, null, null] +21766 - Sq'irk tree - [Pick-Fruit, null, null, null, null] +21767 - Sq'irk tree - [Pick-Fruit, null, null, null, null] +21768 - Sq'irk tree - [Pick-Fruit, null, null, null, null] +21769 - Sq'irk tree - [Pick-Fruit, null, null, null, null] +21770 - null - [null, null, null, null, null] +21771 - null - [null, null, null, null, null] +21772 - null - [null, null, null, null, null] +21773 - null - [null, null, null, null, null] +21774 - null - [null, null, null, null, null] +21775 - null - [null, null, null, null, null] +21776 - null - [null, null, null, null, null] +21777 - null - [null, null, null, null, null] +21778 - null - [null, null, null, null, null] +21779 - null - [null, null, null, null, null] +21780 - null - [null, null, null, null, null] +21781 - Ladder - [Climb-up, null, null, null, null] +21782 - Ladder - [Climb-down, null, null, null, null] +21783 - null - [null, null, null, null, null] +21784 - null - [null, null, null, null, null] +21785 - null - [null, null, null, null, null] +21786 - null - [null, null, null, null, null] +21787 - null - [null, null, null, null, null] +21788 - null - [null, null, null, null, null] +21789 - null - [null, null, null, null, null] +21790 - null - [null, null, null, null, null] +21791 - null - [null, null, null, null, null] +21792 - Range - [null, null, null, null, null] +21793 - Table - [null, null, null, null, null] +21794 - Shelves - [Search, null, null, null, null] +21795 - Fireplace - [null, null, null, null, null] +21796 - null - [null, null, null, null, null] +21797 - null - [null, null, null, null, null] +21798 - null - [null, null, null, null, null] +21799 - null - [null, null, null, null, null] +21800 - Crack - [Enter, null, null, null, null] +21801 - null - [null, null, null, null, null] +21802 - Corpse - [null, null, null, null, null] +21803 - Corpse - [null, null, null, null, null] +21804 - null - [null, null, null, null, null] +21805 - null - [null, null, null, null, null] +21806 - null - [null, null, null, null, null] +21807 - null - [null, null, null, null, null] +21808 - null - [null, null, null, null, null] +21809 - null - [null, null, null, null, null] +21810 - null - [null, null, null, null, null] +21811 - null - [null, null, null, null, null] +21812 - null - [null, null, null, null, null] +21813 - null - [null, null, null, null, null] +21814 - Tower door - [Open, null, null, null, null] +21815 - null - [null, null, null, null, null] +21816 - null - [null, null, null, null, null] +21817 - null - [null, null, null, null, null] +21818 - null - [null, null, null, null, null] +21819 - null - [null, null, null, null, null] +21820 - null - [null, null, null, null, null] +21821 - null - [null, null, null, null, null] +21822 - null - [null, null, null, null, null] +21823 - null - [null, null, null, null, null] +21824 - null - [null, null, null, null, null] +21825 - null - [null, null, null, null, null] +21826 - null - [null, null, null, null, null] +21827 - null - [null, null, null, null, null] +21828 - null - [null, null, null, null, null] +21829 - null - [null, null, null, null, null] +21830 - null - [null, null, null, null, null] +21831 - null - [null, null, null, null, null] +21832 - null - [null, null, null, null, null] +21833 - null - [null, null, null, null, null] +21834 - null - [null, null, null, null, null] +21835 - null - [null, null, null, null, null] +21836 - null - [null, null, null, null, null] +21837 - null - [null, null, null, null, null] +21838 - null - [null, null, null, null, null] +21839 - null - [null, null, null, null, null] +21840 - null - [null, null, null, null, null] +21841 - null - [null, null, null, null, null] +21842 - null - [null, null, null, null, null] +21843 - null - [null, null, null, null, null] +21844 - Water pipes - [null, null, null, null, null] +21845 - Water pipes - [null, null, null, null, null] +21846 - Water pipes - [null, null, null, null, null] +21847 - Water pipes - [null, null, null, null, null] +21848 - Water pipes - [null, null, null, null, null] +21849 - Barricade - [null, null, null, null, null] +21850 - null - [null, null, null, null, null] +21851 - null - [null, null, null, null, null] +21852 - null - [null, null, null, null, null] +21853 - null - [null, null, null, null, null] +21854 - null - [null, null, null, null, null] +21855 - null - [null, null, null, null, null] +21856 - null - [null, null, null, null, null] +21857 - null - [null, null, null, null, null] +21858 - null - [null, null, null, null, null] +21859 - null - [null, null, null, null, null] +21860 - null - [null, null, null, null, null] +21861 - null - [null, null, null, null, null] +21862 - null - [null, null, null, null, null] +21863 - null - [null, null, null, null, null] +21864 - null - [null, null, null, null, null] +21865 - null - [null, null, null, null, null] +21866 - null - [null, null, null, null, null] +21867 - null - [null, null, null, null, null] +21868 - Rift - [null, null, null, null, null] +21869 - Cage - [null, null, null, null, null] +21870 - Cage - [Fix, null, null, null, null] +21871 - Stairs - [Climb-up, null, null, null, null] +21872 - Stairs - [Climb-down, null, null, null, null] +21873 - Pressure machine - [Fix, null, null, null, null] +21874 - Huge vat - [null, null, null, null, null] +21875 - Pipe - [null, null, null, null, null] +21876 - Pipe - [null, null, null, null, null] +21877 - Pipe - [null, null, null, null, null] +21878 - Pipe - [null, null, null, null, null] +21879 - Furnace - [null, null, null, null, null] +21880 - Pipe machine - [Fix, null, null, null, null] +21881 - Pipe machine - [null, null, null, null, null] +21882 - Pipe - [null, null, null, null, null] +21883 - Pipe - [null, null, null, null, null] +21884 - null - [null, null, null, null, null] +21885 - null - [null, null, null, null, null] +21886 - null - [null, null, null, null, null] +21887 - null - [null, null, null, null, null] +21888 - null - [null, null, null, null, null] +21889 - null - [null, null, null, null, null] +21890 - Support - [null, null, null, null, null] +21891 - null - [null, null, null, null, null] +21892 - null - [null, null, null, null, null] +21893 - Symbol of life - [Inspect, Activate, null, null, null] +21894 - Symbol of life - [Inspect, Activate, null, null, null] +21895 - null - [null, null, null, null, null] +21896 - null - [null, null, null, null, null] +21897 - null - [null, null, null, null, null] +21898 - null - [null, null, null, null, null] +21899 - null - [null, null, null, null, null] +21900 - null - [null, null, null, null, null] +21901 - Tube - [null, null, null, null, null] +21902 - Magic well - [null, null, null, null, null] +21903 - Magic well - [null, null, null, null, null] +21904 - Magic well - [null, null, null, null, null] +21905 - Pipe - [null, null, null, null, null] +21906 - Operation table - [null, null, null, null, null] +21907 - Operation chair - [null, null, null, null, null] +21908 - Crate - [Search, null, null, null, null] +21909 - Crate - [Search, null, null, null, null] +21910 - Crate - [Search, null, null, null, null] +21911 - Crate - [Search, null, null, null, null] +21912 - Crate - [Search, null, null, null, null] +21913 - Crate - [Search, null, null, null, null] +21914 - Crate - [Search, null, null, null, null] +21915 - Crate - [Search, null, null, null, null] +21916 - Crate - [Search, null, null, null, null] +21917 - Crate - [Search, null, null, null, null] +21918 - Magic table - [null, null, null, null, null] +21919 - null - [null, null, null, null, null] +21920 - Spinning pipe - [null, null, null, null, null] +21921 - Trapdoor - [Open, null, null, null, null] +21922 - Trapdoor - [Climb-down, Close, null, null, null] +21923 - Specimen - [null, null, null, null, null] +21924 - Plant - [Search, null, null, null, null] +21925 - Pipe - [null, null, null, null, null] +21926 - Pipe - [null, null, null, null, null] +21927 - null - [null, null, null, null, null] +21928 - null - [null, null, null, null, null] +21929 - Tower door - [Enter, null, null, null, null] +21930 - Cage - [null, null, null, null, null] +21931 - Cage - [null, null, null, null, null] +21932 - Shackle table - [null, null, null, null, null] +21933 - Retorts - [null, null, null, null, null] +21934 - Experiment table - [null, null, null, null, null] +21935 - Experiment table - [null, null, null, null, null] +21936 - Experiment table - [null, null, null, null, null] +21937 - Experiment cabinet - [null, null, null, null, null] +21938 - Crate - [null, null, null, null, null] +21939 - Crate - [null, null, null, null, null] +21940 - Crate - [null, null, null, null, null] +21941 - null - [null, null, null, null, null] +21942 - null - [null, null, null, null, null] +21943 - null - [null, null, null, null, null] +21944 - null - [null, null, null, null, null] +21945 - Lighting mechanism - [null, null, null, null, null] +21946 - Staircase - [Climb-up, null, null, null, null] +21947 - Staircase - [Climb-down, null, null, null, null] +21948 - null - [null, null, null, null, null] +21949 - null - [null, null, null, null, null] +21950 - null - [null, null, null, null, null] +21951 - null - [null, null, null, null, null] +21952 - null - [null, null, null, null, null] +21953 - null - [null, null, null, null, null] +21954 - null - [null, null, null, null, null] +21955 - null - [null, null, null, null, null] +21956 - null - [null, null, null, null, null] +21957 - null - [null, null, null, null, null] +21958 - null - [null, null, null, null, null] +21959 - null - [null, null, null, null, null] +21960 - null - [null, null, null, null, null] +21961 - null - [null, null, null, null, null] +21962 - null - [null, null, null, null, null] +21963 - null - [null, null, null, null, null] +21964 - null - [null, null, null, null, null] +21965 - null - [null, null, null, null, null] +21966 - null - [null, null, null, null, null] +21967 - null - [null, null, null, null, null] +21968 - null - [null, null, null, null, null] +21969 - null - [null, null, null, null, null] +21970 - null - [null, null, null, null, null] +21971 - null - [null, null, null, null, null] +21972 - null - [null, null, null, null, null] +21973 - null - [null, null, null, null, null] +21974 - null - [null, null, null, null, null] +21975 - null - [null, null, null, null, null] +21976 - null - [null, null, null, null, null] +21977 - null - [null, null, null, null, null] +21978 - null - [null, null, null, null, null] +21979 - null - [null, null, null, null, null] +21980 - null - [null, null, null, null, null] +21981 - null - [null, null, null, null, null] +21982 - null - [null, null, null, null, null] +21983 - null - [null, null, null, null, null] +21984 - null - [null, null, null, null, null] +21985 - null - [null, null, null, null, null] +21986 - null - [null, null, null, null, null] +21987 - null - [null, null, null, null, null] +21988 - null - [null, null, null, null, null] +21989 - null - [null, null, null, null, null] +21990 - null - [null, null, null, null, null] +21991 - null - [null, null, null, null, null] +21992 - null - [null, null, null, null, null] +21993 - null - [null, null, null, null, null] +21994 - null - [null, null, null, null, null] +21995 - null - [null, null, null, null, null] +21996 - null - [null, null, null, null, null] +21997 - null - [null, null, null, null, null] +21998 - null - [null, null, null, null, null] +21999 - null - [null, null, null, null, null] +22000 - null - [null, null, null, null, null] +22001 - null - [null, null, null, null, null] +22002 - null - [null, null, null, null, null] +22003 - null - [null, null, null, null, null] +22004 - null - [null, null, null, null, null] +22005 - null - [null, null, null, null, null] +22006 - null - [null, null, null, null, null] +22007 - Door - [Open, null, null, null, null] +22008 - null - [null, null, null, null, null] +22009 - null - [null, null, null, null, null] +22010 - null - [null, null, null, null, null] +22011 - null - [null, null, null, null, null] +22012 - null - [null, null, null, null, null] +22013 - null - [null, null, null, null, null] +22014 - null - [null, null, null, null, null] +22015 - null - [null, null, null, null, null] +22016 - null - [null, null, null, null, null] +22017 - null - [null, null, null, null, null] +22018 - null - [null, null, null, null, null] +22019 - null - [null, null, null, null, null] +22020 - null - [null, null, null, null, null] +22021 - null - [null, null, null, null, null] +22022 - null - [null, null, null, null, null] +22023 - null - [null, null, null, null, null] +22024 - null - [null, null, null, null, null] +22025 - null - [null, null, null, null, null] +22026 - null - [null, null, null, null, null] +22027 - null - [null, null, null, null, null] +22028 - null - [null, null, null, null, null] +22029 - null - [null, null, null, null, null] +22030 - null - [null, null, null, null, null] +22031 - null - [null, null, null, null, null] +22032 - null - [null, null, null, null, null] +22033 - null - [null, null, null, null, null] +22034 - null - [null, null, null, null, null] +22035 - null - [null, null, null, null, null] +22036 - null - [null, null, null, null, null] +22037 - null - [null, null, null, null, null] +22038 - null - [null, null, null, null, null] +22039 - null - [null, null, null, null, null] +22040 - null - [null, null, null, null, null] +22041 - null - [null, null, null, null, null] +22042 - null - [null, null, null, null, null] +22043 - null - [null, null, null, null, null] +22044 - null - [null, null, null, null, null] +22045 - null - [null, null, null, null, null] +22046 - null - [null, null, null, null, null] +22047 - null - [null, null, null, null, null] +22048 - null - [null, null, null, null, null] +22049 - null - [null, null, null, null, null] +22050 - null - [null, null, null, null, null] +22051 - null - [null, null, null, null, null] +22052 - null - [null, null, null, null, null] +22053 - null - [null, null, null, null, null] +22054 - null - [null, null, null, null, null] +22055 - null - [null, null, null, null, null] +22056 - null - [null, null, null, null, null] +22057 - null - [null, null, null, null, null] +22058 - null - [null, null, null, null, null] +22059 - null - [null, null, null, null, null] +22060 - null - [null, null, null, null, null] +22061 - null - [null, null, null, null, null] +22062 - null - [null, null, null, null, null] +22063 - null - [null, null, null, null, null] +22064 - null - [null, null, null, null, null] +22065 - null - [null, null, null, null, null] +22066 - null - [null, null, null, null, null] +22067 - null - [null, null, null, null, null] +22068 - null - [null, null, null, null, null] +22069 - null - [null, null, null, null, null] +22070 - null - [null, null, null, null, null] +22071 - null - [null, null, null, null, null] +22072 - null - [null, null, null, null, null] +22073 - null - [null, null, null, null, null] +22074 - null - [null, null, null, null, null] +22075 - null - [null, null, null, null, null] +22076 - null - [null, null, null, null, null] +22077 - null - [null, null, null, null, null] +22078 - null - [null, null, null, null, null] +22079 - null - [null, null, null, null, null] +22080 - null - [null, null, null, null, null] +22081 - null - [null, null, null, null, null] +22082 - null - [null, null, null, null, null] +22083 - null - [null, null, null, null, null] +22084 - null - [null, null, null, null, null] +22085 - null - [null, null, null, null, null] +22086 - null - [null, null, null, null, null] +22087 - null - [null, null, null, null, null] +22088 - null - [null, null, null, null, null] +22089 - null - [null, null, null, null, null] +22090 - null - [null, null, null, null, null] +22091 - Wall - [null, null, null, null, null] +22092 - Wall - [null, null, null, null, null] +22093 - Wall - [null, null, null, null, null] +22094 - Wall - [null, null, null, null, null] +22095 - Wall - [null, null, null, null, null] +22096 - Wall - [null, null, null, null, null] +22097 - Peephole - [Peer-through, null, null, null, null] +22098 - Rubble - [null, null, null, null, null] +22099 - Rubble - [null, null, null, null, null] +22100 - null - [null, null, null, null, null] +22101 - null - [null, null, null, null, null] +22102 - null - [null, null, null, null, null] +22103 - null - [null, null, null, null, null] +22104 - null - [null, null, null, null, null] +22105 - Wall - [null, null, null, null, null] +22106 - Wall - [null, null, null, null, null] +22107 - Wall - [null, null, null, null, null] +22108 - Wall - [null, null, null, null, null] +22109 - Collapsed wall - [null, null, null, null, null] +22110 - Collapsed wall - [null, null, null, null, null] +22111 - null - [null, null, null, null, null] +22112 - null - [null, null, null, null, null] +22113 - Door - [Open, null, null, null, null] +22114 - Door - [Open, null, null, null, null] +22115 - Door - [Open, null, null, null, null] +22116 - Door - [Open, null, null, null, null] +22117 - Door - [Open, null, null, null, null] +22118 - Door - [Open, null, null, null, null] +22119 - null - [Open, null, null, null, null] +22120 - Bench - [null, null, null, null, null] +22121 - Ladder - [Climb-up, null, null, null, null] +22122 - Ladder - [Climb-down, null, null, null, null] +22123 - Stand - [null, null, null, null, null] +22124 - Stand - [null, null, null, null, null] +22125 - Candle stand - [null, null, null, null, null] +22126 - Bookcase - [null, null, null, null, null] +22127 - Bookcase - [null, null, null, null, null] +22128 - Bookcase - [null, null, null, null, null] +22129 - Bookcase - [null, null, null, null, null] +22130 - null - [null, null, null, null, null] +22131 - Bookcase - [null, null, null, null, null] +22132 - Bed - [null, null, null, null, null] +22133 - Bed - [null, null, null, null, null] +22134 - Drawers - [null, null, null, null, null] +22135 - Drawers - [null, null, null, null, null] +22136 - Drawers - [null, null, null, null, null] +22137 - Drawers - [null, null, null, null, null] +22138 - Drawers - [null, null, null, null, null] +22139 - Drawers - [null, null, null, null, null] +22140 - Drawers - [null, null, null, null, null] +22141 - Drawers - [null, null, null, null, null] +22142 - Drawers - [null, null, null, null, null] +22143 - Drawers - [null, null, null, null, null] +22144 - Wardrobe - [null, null, null, null, null] +22145 - Wardrobe - [null, null, null, null, null] +22146 - Wardrobe - [null, null, null, null, null] +22147 - Wardrobe - [null, null, null, null, null] +22148 - Wardrobe - [null, null, null, null, null] +22149 - Wardrobe - [null, null, null, null, null] +22150 - Wardrobe - [null, null, null, null, null] +22151 - Wardrobe - [null, null, null, null, null] +22152 - Wardrobe - [null, null, null, null, null] +22153 - Wardrobe - [null, null, null, null, null] +22154 - Cooking range - [null, null, null, null, null] +22155 - Clock - [null, null, null, null, null] +22156 - Chair - [null, null, null, null, null] +22157 - Chair - [null, null, null, null, null] +22158 - Bench - [null, null, null, null, null] +22159 - Table - [null, null, null, null, null] +22160 - Table - [null, null, null, null, null] +22161 - Potted plant - [null, null, null, null, null] +22162 - Larder - [null, null, null, null, null] +22163 - null - [null, null, null, null, null] +22164 - Ladder - [Climb-down, null, null, null, null] +22165 - null - [null, null, null, null, null] +22166 - null - [null, null, null, null, null] +22167 - null - [null, null, null, null, null] +22168 - null - [null, null, null, null, null] +22169 - null - [null, null, null, null, null] +22170 - null - [null, null, null, null, null] +22171 - null - [null, null, null, null, null] +22172 - Ladder - [Climb-up, null, null, null, null] +22173 - Ladder - [Climb-down, null, null, null, null] +22174 - null - [null, null, null, null, null] +22175 - null - [null, null, null, null, null] +22176 - null - [null, null, null, null, null] +22177 - null - [null, null, null, null, null] +22178 - null - [null, null, null, null, null] +22179 - null - [null, null, null, null, null] +22180 - null - [null, null, null, null, null] +22181 - null - [null, null, null, null, null] +22182 - null - [null, null, null, null, null] +22183 - null - [null, null, null, null, null] +22184 - null - [null, null, null, null, null] +22185 - null - [null, null, null, null, null] +22186 - null - [null, null, null, null, null] +22187 - null - [null, null, null, null, null] +22188 - null - [null, null, null, null, null] +22189 - null - [null, null, null, null, null] +22190 - null - [null, null, null, null, null] +22191 - null - [null, null, null, null, null] +22192 - null - [null, null, null, null, null] +22193 - null - [null, null, null, null, null] +22194 - null - [null, null, null, null, null] +22195 - null - [null, null, null, null, null] +22196 - null - [null, null, null, null, null] +22197 - null - [null, null, null, null, null] +22198 - null - [null, null, null, null, null] +22199 - null - [null, null, null, null, null] +22200 - null - [null, null, null, null, null] +22201 - null - [null, null, null, null, null] +22202 - null - [null, null, null, null, null] +22203 - null - [null, null, null, null, null] +22204 - null - [null, null, null, null, null] +22205 - null - [null, null, null, null, null] +22206 - null - [null, null, null, null, null] +22207 - null - [null, null, null, null, null] +22208 - null - [null, null, null, null, null] +22209 - null - [null, null, null, null, null] +22210 - null - [null, null, null, null, null] +22211 - null - [null, null, null, null, null] +22212 - null - [null, null, null, null, null] +22213 - null - [null, null, null, null, null] +22214 - null - [null, null, null, null, null] +22215 - null - [null, null, null, null, null] +22216 - null - [null, null, null, null, null] +22217 - null - [null, null, null, null, null] +22218 - null - [null, null, null, null, null] +22219 - null - [null, null, null, null, null] +22220 - null - [null, null, null, null, null] +22221 - null - [null, null, null, null, null] +22222 - null - [null, null, null, null, null] +22223 - null - [null, null, null, null, null] +22224 - null - [null, null, null, null, null] +22225 - null - [null, null, null, null, null] +22226 - null - [null, null, null, null, null] +22227 - null - [null, null, null, null, null] +22228 - null - [null, null, null, null, null] +22229 - null - [null, null, null, null, null] +22230 - null - [null, null, null, null, null] +22231 - null - [null, null, null, null, null] +22232 - null - [null, null, null, null, null] +22233 - null - [null, null, null, null, null] +22234 - null - [null, null, null, null, null] +22235 - null - [null, null, null, null, null] +22236 - null - [null, null, null, null, null] +22237 - null - [null, null, null, null, null] +22238 - null - [null, null, null, null, null] +22239 - null - [null, null, null, null, null] +22240 - null - [null, null, null, null, null] +22241 - null - [null, null, null, null, null] +22242 - null - [null, null, null, null, null] +22243 - null - [null, null, null, null, null] +22244 - null - [null, null, null, null, null] +22245 - null - [null, null, null, null, null] +22246 - null - [null, null, null, null, null] +22247 - Stairs - [Climb-up, null, null, null, null] +22248 - Stairs - [Climb-up, null, null, null, null] +22249 - null - [null, null, null, null, null] +22250 - Stairs - [Climb-up, null, null, null, null] +22251 - null - [null, null, null, null, null] +22252 - Stairs - [Climb-down, null, null, null, null] +22253 - Stairs - [Climb-down, null, null, null, null] +22254 - Stairs - [Climb-down, null, null, null, null] +22255 - null - [null, null, null, null, null] +22256 - null - [null, null, null, null, null] +22257 - null - [null, null, null, null, null] +22258 - null - [null, null, null, null, null] +22259 - null - [null, null, null, null, null] +22260 - null - [null, null, null, null, null] +22261 - null - [null, null, null, null, null] +22262 - null - [null, null, null, null, null] +22263 - null - [null, null, null, null, null] +22264 - null - [null, null, null, null, null] +22265 - null - [null, null, null, null, null] +22266 - null - [null, null, null, null, null] +22267 - null - [null, null, null, null, null] +22268 - null - [null, null, null, null, null] +22269 - null - [null, null, null, null, null] +22270 - Support - [null, null, null, null, null] +22271 - Cannon - [null, null, null, null, null] +22272 - Cannon - [null, null, null, null, null] +22273 - Broken cannon - [null, null, null, null, null] +22274 - Ladder - [Climb, null, null, null, null] +22275 - Ladder - [Climb, null, null, null, null] +22276 - null - [null, null, null, null, null] +22277 - Crate - [null, null, null, null, null] +22278 - Barrel - [null, null, null, null, null] +22279 - Barrel - [null, null, null, null, null] +22280 - Barrel - [null, null, null, null, null] +22281 - Locked door - [null, null, null, null, null] +22282 - Locked door - [null, null, null, null, null] +22283 - Locked door - [null, null, null, null, null] +22284 - null - [null, null, null, null, null] +22285 - null - [null, null, null, null, null] +22286 - null - [null, null, null, null, null] +22287 - null - [null, null, null, null, null] +22288 - null - [null, null, null, null, null] +22289 - null - [null, null, null, null, null] +22290 - null - [null, null, null, null, null] +22291 - null - [null, null, null, null, null] +22292 - null - [null, null, null, null, null] +22293 - null - [null, null, null, null, null] +22294 - null - [null, null, null, null, null] +22295 - null - [null, null, null, null, null] +22296 - null - [null, null, null, null, null] +22297 - null - [null, null, null, null, null] +22298 - Locker - [Open, null, null, null, null] +22299 - Locker - [Search, Close, null, null, null] +22300 - Wheat - [null, Pick, null, null, null] +22301 - Cabbage - [null, Pick, null, null, null] +22302 - Stile - [Climb-over, null, null, null, null] +22303 - null - [null, null, null, null, null] +22304 - null - [null, null, null, null, null] +22305 - null - [null, null, null, null, null] +22306 - null - [null, null, null, null, null] +22307 - null - [null, null, null, null, null] +22308 - null - [null, null, null, null, null] +22309 - null - [null, null, null, null, null] +22310 - null - [null, null, null, null, null] +22311 - null - [null, null, null, null, null] +22312 - null - [null, null, null, null, null] +22313 - null - [null, null, null, null, null] +22314 - null - [null, null, null, null, null] +22315 - null - [null, null, null, null, null] +22316 - null - [null, null, null, null, null] +22317 - null - [null, null, null, null, null] +22318 - null - [null, null, null, null, null] +22319 - null - [null, null, null, null, null] +22320 - null - [null, null, null, null, null] +22321 - null - [null, null, null, null, null] +22322 - null - [null, null, null, null, null] +22323 - null - [null, null, null, null, null] +22324 - null - [null, null, null, null, null] +22325 - null - [null, null, null, null, null] +22326 - null - [null, null, null, null, null] +22327 - null - [null, null, null, null, null] +22328 - null - [null, null, null, null, null] +22329 - null - [null, null, null, null, null] +22330 - null - [null, null, null, null, null] +22331 - null - [null, null, null, null, null] +22332 - null - [null, null, null, null, null] +22333 - null - [null, null, null, null, null] +22334 - null - [null, null, null, null, null] +22335 - null - [null, null, null, null, null] +22336 - null - [null, null, null, null, null] +22337 - null - [null, null, null, null, null] +22338 - null - [null, null, null, null, null] +22339 - null - [null, null, null, null, null] +22340 - null - [null, null, null, null, null] +22341 - null - [null, null, null, null, null] +22342 - null - [null, null, null, null, null] +22343 - null - [null, null, null, null, null] +22344 - null - [null, null, null, null, null] +22345 - null - [null, null, null, null, null] +22346 - null - [null, null, null, null, null] +22347 - null - [null, null, null, null, null] +22348 - null - [null, null, null, null, null] +22349 - null - [null, null, null, null, null] +22350 - null - [null, null, null, null, null] +22351 - null - [null, null, null, null, null] +22352 - Statue - [null, null, null, null, null] +22353 - Statue - [Pull, null, null, null, null] +22354 - Statue - [Climb-down, null, null, null, null] +22355 - null - [hidden, null, null, null, null] +22356 - null - [null, null, null, null, null] +22357 - null - [null, null, null, null, null] +22358 - null - [null, null, null, null, null] +22359 - null - [null, null, null, null, null] +22360 - null - [null, null, null, null, null] +22361 - null - [null, null, null, null, null] +22362 - null - [null, null, null, null, null] +22363 - null - [null, null, null, null, null] +22364 - null - [null, null, null, null, null] +22365 - Stairs - [Descend, null, null, null, null] +22366 - Stairs - [Descend, null, null, null, null] +22367 - Stairs - [Climb, null, null, null, null] +22368 - Stairs - [Repair, Climb, null, null, null] +22369 - Stairs - [null, Climb, null, null, null] +22370 - null - [hidden, Climb, null, null, null] +22371 - Ladder - [Climb, null, null, null, null] +22372 - Ladder - [Climb, null, null, null, null] +22373 - Granary wall - [null, null, null, null, null] +22374 - Granary wall - [null, null, null, null, null] +22375 - Granary wall - [null, null, null, null, null] +22376 - Granary wall - [null, null, null, null, null] +22377 - Granary wall - [null, null, null, null, null] +22378 - Granary wall - [null, null, null, null, null] +22379 - Granary wall - [null, null, null, null, null] +22380 - Granary wall - [null, null, null, null, null] +22381 - null - [null, null, null, null, null] +22382 - null - [null, null, null, null, null] +22383 - null - [null, null, null, null, null] +22384 - null - [null, null, null, null, null] +22385 - Granary roof - [null, null, null, null, null] +22386 - Granary roof - [null, null, null, null, null] +22387 - Granary roof - [null, null, null, null, null] +22388 - Granary roof - [null, null, null, null, null] +22389 - Granary roof - [null, null, null, null, null] +22390 - Granary roof - [null, null, null, null, null] +22391 - Granary roof - [null, null, null, null, null] +22392 - Granary roof - [null, null, null, null, null] +22393 - Granary roof - [null, null, null, null, null] +22394 - Granary roof - [null, null, null, null, null] +22395 - Granary roof - [null, null, null, null, null] +22396 - Granary roof - [null, null, null, null, null] +22397 - Granary roof - [null, null, null, null, null] +22398 - Granary roof - [null, null, null, null, null] +22399 - Granary roof - [null, null, null, null, null] +22400 - Granary roof - [null, null, null, null, null] +22401 - Granary roof - [null, null, null, null, null] +22402 - Granary roof - [null, null, null, null, null] +22403 - Granary roof - [null, null, null, null, null] +22404 - Granary roof - [null, null, null, null, null] +22405 - Granary roof - [null, null, null, null, null] +22406 - Granary roof - [null, null, null, null, null] +22407 - Granary roof - [null, null, null, null, null] +22408 - Granary roof - [null, null, null, null, null] +22409 - Granary roof - [null, null, null, null, null] +22410 - Granary roof - [null, null, null, null, null] +22411 - Granary roof - [null, null, null, null, null] +22412 - Granary roof - [null, null, null, null, null] +22413 - Granary roof - [null, null, null, null, null] +22414 - Granary roof - [null, null, null, null, null] +22415 - Granary roof - [null, null, null, null, null] +22416 - Granary roof - [null, null, null, null, null] +22417 - Granary roof - [null, null, null, null, null] +22418 - Sails - [null, null, null, null, null] +22419 - Millstones - [null, null, null, null, null] +22420 - Flour bin - [null, null, null, null, null] +22421 - Flour bin - [Empty, null, null, null, null] +22422 - Hopper - [null, null, null, null, null] +22423 - null - [null, null, null, null, null] +22424 - Lever - [Pull, null, null, null, null] +22425 - null - [null, null, null, null, null] +22426 - Crate - [null, null, null, null, null] +22427 - Crate - [Search, null, null, null, null] +22428 - null - [null, null, null, null, null] +22429 - null - [null, null, null, null, null] +22430 - Sack - [null, null, null, null, null] +22431 - Table - [null, null, null, null, null] +22432 - Ladder - [Climb-up, null, null, null, null] +22433 - Ladder - [Climb, Climb-up, Climb-down, null, null] +22434 - Ladder - [Climb-down, null, null, null, null] +22435 - Large door - [Open, null, null, null, null] +22436 - Large door - [Close, null, null, null, null] +22437 - Large door - [Open, null, null, null, null] +22438 - Large door - [Close, null, null, null, null] +22439 - Rock wall - [null, null, null, null, null] +22440 - Rock wall - [null, null, null, null, null] +22441 - Rock wall - [null, null, null, null, null] +22442 - Rock wall - [null, null, null, null, null] +22443 - Rock wall - [null, null, null, null, null] +22444 - Rock wall - [null, null, null, null, null] +22445 - Rock wall - [null, null, null, null, null] +22446 - Rock wall - [null, null, null, null, null] +22447 - Rock wall - [null, null, null, null, null] +22448 - Rock wall - [null, null, null, null, null] +22449 - Rock wall - [null, null, null, null, null] +22450 - Rock wall - [null, null, null, null, null] +22451 - Rock wall - [null, null, null, null, null] +22452 - Rock wall - [null, null, null, null, null] +22453 - Crate - [Add-bottom, null, null, null, null] +22454 - Crate - [Fill, null, null, null, null] +22455 - Crate - [null, null, null, null, null] +22456 - Crate - [null, null, null, null, null] +22457 - Crate - [Build, null, null, null, null] +22458 - null - [null, null, null, null, null] +22459 - null - [null, null, null, null, null] +22460 - null - [null, null, null, null, null] +22461 - null - [null, null, null, null, null] +22462 - null - [null, null, null, null, null] +22463 - null - [null, null, null, null, null] +22464 - null - [null, null, null, null, null] +22465 - null - [null, null, null, null, null] +22466 - null - [null, null, null, null, null] +22467 - null - [null, null, null, null, null] +22468 - null - [null, null, null, null, null] +22469 - null - [null, null, null, null, null] +22470 - null - [null, null, null, null, null] +22471 - null - [null, null, null, null, null] +22472 - Lectern - [null, null, null, null, null] +22473 - Wheat - [null, Pick, null, null, null] +22474 - Wheat - [null, Pick, null, null, null] +22475 - Wheat - [null, Pick, null, null, null] +22476 - Wheat - [null, Pick, null, null, null] +22477 - Door - [null, null, null, null, null] +22478 - Wall - [null, null, null, null, null] +22479 - Wall - [null, null, null, null, null] +22480 - Wall - [null, null, null, null, null] +22481 - Wall - [null, null, null, null, null] +22482 - Wall - [null, null, null, null, null] +22483 - Fuse - [null, null, null, null, null] +22484 - Fuse - [null, null, null, null, null] +22485 - null - [null, null, null, null, null] +22486 - null - [null, null, null, null, null] +22487 - null - [null, null, null, null, null] +22488 - null - [null, null, null, null, null] +22489 - null - [hidden, null, null, null, null] +22490 - null - [null, null, null, null, null] +22491 - null - [null, null, null, null, null] +22492 - null - [null, null, null, null, null] +22493 - null - [null, null, null, null, null] +22494 - null - [null, null, null, null, null] +22495 - null - [null, null, null, null, null] +22496 - Path - [Look-at, Return-to-Paterdomus, null, null, null] +22497 - Marv (sick) - [Talk-to, null, null, null, null] +22498 - Marv (very sick) - [Talk-to, null, null, null, null] +22499 - Marv (ghastly!) - [Talk-to, null, null, null, null] +22500 - Marv (sick) - [Talk-to, null, null, null, null] +22501 - Marv (very sick) - [Talk-to, null, null, null, null] +22502 - Marv (ghastly!) - [Talk-to, null, null, null, null] +22503 - Marv (Well) - [Talk-to, null, hidden, null, null] +22504 - Hank (sick) - [Talk-to, null, null, null, null] +22505 - Hank (very sick) - [Talk-to, null, null, null, null] +22506 - Hank (ghastly!) - [Talk-to, null, null, null, null] +22507 - Hank (sick) - [Talk-to, null, null, null, null] +22508 - Hank (very sick) - [Talk-to, null, null, null, null] +22509 - Hank (ghastly!) - [Talk-to, null, null, null, null] +22510 - Hank (Well) - [Talk-to, null, hidden, null, null] +22511 - Wilf (sick) - [Talk-to, null, null, null, null] +22512 - Wilf (very sick) - [Talk-to, null, null, null, null] +22513 - Wilf (ghastly!) - [Talk-to, null, null, null, null] +22514 - Wilf (sick) - [Talk-to, null, null, null, null] +22515 - Wilf (very sick) - [Talk-to, null, null, null, null] +22516 - Wilf (ghastly!) - [Talk-to, null, null, null, null] +22517 - Wilf (Well) - [Talk-to, null, hidden, null, null] +22518 - Sarah (sick!) - [Talk-to, null, null, null, null] +22519 - Sarah (very sick!) - [Talk-to, null, null, null, null] +22520 - Sarah (ghastly!) - [Talk-to, null, null, null, null] +22521 - Sarah (sick!) - [Talk-to, null, null, null, null] +22522 - Sarah (very sick!) - [Talk-to, null, null, null, null] +22523 - Sarah (ghastly!) - [Talk-to, null, null, null, null] +22524 - Sarah (Well) - [Talk-to, null, hidden, null, null] +22525 - Rachel (sick) - [Talk-to, null, null, null, null] +22526 - Rachel (very sick) - [Talk-to, null, null, null, null] +22527 - Rachel (ghastly!) - [Talk-to, null, null, null, null] +22528 - Rachel (sick) - [Talk-to, null, null, null, null] +22529 - Rachel (very sick) - [Talk-to, null, null, null, null] +22530 - Rachel (ghastly!) - [Talk-to, null, null, null, null] +22531 - Rachel (Well) - [Talk-to, null, hidden, null, null] +22532 - Empty clothes - [null, null, null, null, null] +22533 - Partially broken bridge - [Search, null, null, null, null] +22534 - Slightly broken bridge - [Search, null, null, null, null] +22535 - Fixed bridge - [Search, Walk-across, null, null, null] +22536 - null - [null, null, null, null, null] +22537 - Tunnel - [Enter, null, null, null, null] +22538 - Tunnel - [Enter, null, null, null, null] +22539 - null - [null, null, null, null, null] +22540 - null - [null, null, null, null, null] +22541 - Stalagmite - [null, null, null, null, null] +22542 - Large stalagmite - [null, null, null, null, null] +22543 - Connected stalagmites - [null, null, null, null, null] +22544 - null - [null, null, null, null, null] +22545 - Molanisk - [null, null, null, null, null] +22546 - null - [null, null, null, null, null] +22547 - null - [null, null, null, null, null] +22548 - null - [null, null, null, null, null] +22549 - Rock - [null, null, null, null, null] +22550 - Rock - [null, null, null, null, null] +22551 - Rock - [null, null, null, null, null] +22552 - Jutting wall - [Squeeze-past, null, null, null, null] +22553 - null - [null, null, null, null, null] +22554 - null - [null, null, null, null, null] +22555 - null - [null, null, null, null, null] +22556 - Hole - [Squeeze-through, null, null, null, null] +22557 - Tunnel - [Squeeze-through, null, null, null, null] +22558 - null - [null, null, null, null, null] +22559 - null - [null, null, null, null, null] +22560 - null - [null, null, null, null, null] +22561 - null - [null, null, null, null, null] +22562 - null - [null, null, null, null, null] +22563 - Ladder - [null, null, null, null, null] +22564 - Ladder - [Swing-across, null, null, null, null] +22565 - null - [null, null, null, null, null] +22566 - Ladder - [null, null, null, null, null] +22567 - Ladder - [null, null, null, null, null] +22568 - Cable - [null, null, null, null, null] +22569 - Cable - [Walk-across, null, null, null, null] +22570 - Lamppost - [null, null, null, null, null] +22571 - Lamppost - [null, null, null, null, null] +22572 - Cable - [Swing, null, null, null, null] +22573 - null - [null, null, null, null, null] +22574 - null - [null, null, null, null, null] +22575 - null - [null, null, null, null, null] +22576 - Cable - [null, null, null, null, null] +22577 - null - [null, null, null, null, null] +22578 - null - [null, null, null, null, null] +22579 - null - [null, null, null, null, null] +22580 - null - [null, null, null, null, null] +22581 - null - [null, null, null, null, null] +22582 - null - [null, null, null, null, null] +22583 - null - [null, null, null, null, null] +22584 - null - [null, null, null, null, null] +22585 - null - [null, null, null, null, null] +22586 - null - [null, null, null, null, null] +22587 - null - [null, null, null, null, null] +22588 - null - [null, null, null, null, null] +22589 - Pylon - [null, null, null, null, null] +22590 - Pylon - [null, null, null, null, null] +22591 - Pylon - [null, null, null, null, null] +22592 - null - [null, null, null, null, null] +22593 - null - [null, null, null, null, null] +22594 - null - [null, null, null, null, null] +22595 - null - [null, null, null, null, null] +22596 - null - [null, null, null, null, null] +22597 - null - [null, null, null, null, null] +22598 - null - [null, null, null, null, null] +22599 - null - [null, null, null, null, null] +22600 - Ladder - [Climb-up, null, null, null, null] +22601 - Ladder - [Climb-up, null, null, null, null] +22602 - Ladder - [Climb-down, null, null, null, null] +22603 - null - [null, null, null, null, null] +22604 - null - [null, null, null, null, null] +22605 - null - [null, null, null, null, null] +22606 - null - [null, null, null, null, null] +22607 - Stairs - [null, null, null, null, null] +22608 - Stairs - [Climb-up, null, null, null, null] +22609 - Stairs - [Climb-down, null, null, null, null] +22610 - null - [null, null, null, null, null] +22611 - null - [null, null, null, null, null] +22612 - null - [null, null, null, null, null] +22613 - null - [null, null, null, null, null] +22614 - null - [null, null, null, null, null] +22615 - null - [null, null, null, null, null] +22616 - null - [null, null, null, null, null] +22617 - null - [null, null, null, null, null] +22618 - null - [null, null, null, null, null] +22619 - null - [null, null, null, null, null] +22620 - null - [null, null, null, null, null] +22621 - null - [null, null, null, null, null] +22622 - null - [null, null, null, null, null] +22623 - null - [null, null, null, null, null] +22624 - Dial - [null, null, null, null, null] +22625 - Levers - [null, null, null, null, null] +22626 - null - [null, null, null, null, null] +22627 - null - [null, null, null, null, null] +22628 - null - [null, null, null, null, null] +22629 - null - [null, null, null, null, null] +22630 - null - [null, null, null, null, null] +22631 - null - [null, null, null, null, null] +22632 - null - [null, null, null, null, null] +22633 - null - [null, null, null, null, null] +22634 - Console - [null, null, null, null, null] +22635 - Boiler - [null, null, null, null, null] +22636 - null - [null, null, null, null, null] +22637 - null - [null, null, null, null, null] +22638 - null - [null, null, null, null, null] +22639 - null - [null, null, null, null, null] +22640 - null - [null, null, null, null, null] +22641 - null - [null, null, null, null, null] +22642 - null - [null, null, null, null, null] +22643 - null - [null, null, null, null, null] +22644 - null - [null, null, null, null, null] +22645 - null - [null, null, null, null, null] +22646 - null - [null, null, null, null, null] +22647 - null - [null, null, null, null, null] +22648 - null - [null, null, null, null, null] +22649 - Stairs - [null, null, null, null, null] +22650 - Stairs - [Climb-up, null, null, null, null] +22651 - Stairs - [Climb-down, null, null, null, null] +22652 - null - [null, null, null, null, null] +22653 - null - [null, null, null, null, null] +22654 - null - [null, null, null, null, null] +22655 - null - [null, null, null, null, null] +22656 - Blocked tunnel - [Enter, null, null, null, null] +22657 - Blocked tunnel - [Enter, null, null, null, null] +22658 - Open gate - [null, null, null, null, null] +22659 - Blocked tunnel - [null, null, null, null, null] +22660 - null - [null, null, null, null, null] +22661 - null - [null, null, null, null, null] +22662 - null - [null, null, null, null, null] +22663 - Pylon - [null, null, null, null, null] +22664 - Pylon - [Grapple, null, null, null, null] +22665 - Rocks - [null, null, null, null, null] +22666 - Ladder top - [Climb-down, null, null, null, null] +22667 - Rocks - [Climb-down, null, null, null, null] +22668 - Sign - [null, null, null, null, null] +22669 - Bench - [null, null, null, null, null] +22670 - Stool - [null, null, null, null, null] +22671 - Shelf - [null, null, null, null, null] +22672 - Table - [null, null, null, null, null] +22673 - null - [null, null, null, null, null] +22674 - null - [null, null, null, null, null] +22675 - null - [null, null, null, null, null] +22676 - Chair - [null, null, null, null, null] +22677 - Table - [null, null, null, null, null] +22678 - Table - [null, null, null, null, null] +22679 - Bed - [null, null, null, null, null] +22680 - Bed - [null, null, null, null, null] +22681 - Chest - [Open, Pick-lock, null, null, null] +22682 - Chest - [Open, Pick-lock, null, null, null] +22683 - Chest - [null, null, null, null, null] +22684 - Ladder - [null, null, null, null, null] +22685 - Shelf - [null, null, null, null, null] +22686 - Shelf - [null, null, null, null, null] +22687 - null - [null, null, null, null, null] +22688 - null - [null, null, null, null, null] +22689 - null - [null, null, null, null, null] +22690 - Table - [null, null, null, null, null] +22691 - Stool - [null, null, null, null, null] +22692 - Chair - [null, null, null, null, null] +22693 - Table - [null, null, null, null, null] +22694 - Table - [null, null, null, null, null] +22695 - Bed - [null, null, null, null, null] +22696 - Bed - [null, null, null, null, null] +22697 - Chest - [Open, Pick-lock, null, null, null] +22698 - Chest - [Open, Pick-lock, null, null, null] +22699 - Chest - [null, null, null, null, null] +22700 - Ladder - [null, null, null, null, null] +22701 - Shelf - [null, null, null, null, null] +22702 - Shelf - [null, null, null, null, null] +22703 - Chair - [null, null, null, null, null] +22704 - Chair - [null, null, null, null, null] +22705 - Table - [null, null, null, null, null] +22706 - Carving - [null, null, null, null, null] +22707 - Carving - [null, null, null, null, null] +22708 - Carving - [null, null, null, null, null] +22709 - Statue - [null, null, null, null, null] +22710 - Statue - [null, null, null, null, null] +22711 - Bust - [null, null, null, null, null] +22712 - Bust - [null, null, null, null, null] +22713 - Range - [null, null, null, null, null] +22714 - Range - [null, null, null, null, null] +22715 - Sink - [null, null, null, null, null] +22716 - Kitchen table - [null, null, null, null, null] +22717 - Pots - [null, null, null, null, null] +22718 - Shelves - [null, null, null, null, null] +22719 - Shelves - [null, null, null, null, null] +22720 - Shelves - [null, null, null, null, null] +22721 - Furnace - [null, null, null, null, null] +22722 - Bellows - [null, null, null, null, null] +22723 - Chimney - [null, null, null, null, null] +22724 - Chimney pipe - [null, null, null, null, null] +22725 - Anvil - [null, null, null, null, null] +22726 - Sandpit - [null, null, null, null, null] +22727 - Chimney - [null, null, null, null, null] +22728 - Wire machine - [null, null, null, null, null] +22729 - Wire machine - [null, null, null, null, null] +22730 - Wire - [Grab, null, null, null, null] +22731 - Wire - [null, null, null, null, null] +22732 - Cogs - [null, null, null, null, null] +22733 - Smoke - [null, null, null, null, null] +22734 - Moths - [null, null, null, null, null] +22735 - Zapper - [hidden, null, null, null, null] +22736 - Zapper - [null, null, null, null, null] +22737 - Zapper - [null, null, null, null, null] +22738 - Lamppost - [null, null, null, null, null] +22739 - Lamppost - [null, null, null, null, null] +22740 - Lamppost - [null, null, null, null, null] +22741 - Lamppost - [null, null, null, null, null] +22742 - Lamppost - [null, null, null, null, null] +22743 - Lamppost - [null, null, null, null, null] +22744 - Lamppost - [null, null, null, null, null] +22745 - Lamppost - [null, null, null, null, null] +22746 - Lamppost - [null, null, null, null, null] +22747 - Lamppost - [null, null, null, null, null] +22748 - Lamppost - [null, null, null, null, null] +22749 - Lamppost - [null, null, null, null, null] +22750 - Cable - [null, null, null, null, null] +22751 - Cable - [null, null, null, null, null] +22752 - Cable - [null, null, null, null, null] +22753 - Cable - [null, null, null, null, null] +22754 - Cable - [null, null, null, null, null] +22755 - Cable - [null, null, null, null, null] +22756 - Cable - [null, null, null, null, null] +22757 - Cable - [null, null, null, null, null] +22758 - Cable - [null, null, null, null, null] +22759 - Cable - [null, null, null, null, null] +22760 - Lamp - [null, null, null, null, null] +22761 - Lamp - [null, null, null, null, null] +22762 - Lamp - [null, null, null, null, null] +22763 - Empty lamp - [Inspect, null, null, null, null] +22764 - Lamp - [null, null, null, null, null] +22765 - Market stall - [null, null, null, null, null] +22766 - Market stall - [null, null, null, null, null] +22767 - Market stall - [null, null, null, null, null] +22768 - Market stall - [null, null, null, null, null] +22769 - Market stall - [null, null, null, null, null] +22770 - Market stall - [null, null, null, null, null] +22771 - Market stall - [null, null, null, null, null] +22772 - Lamp stall - [null, null, null, null, null] +22773 - Lamp still - [null, null, null, null, null] +22774 - Armour stall - [null, null, null, null, null] +22775 - Barrier - [null, null, null, null, null] +22776 - Barrier - [null, null, null, null, null] +22777 - null - [null, null, null, null, null] +22778 - Gate - [Close, null, null, null, null] +22779 - Gate - [Open, null, null, null, null] +22780 - null - [null, null, null, null, null] +22781 - Toy range - [null, null, null, null, null] +22782 - Toy sink - [null, null, null, null, null] +22783 - Toy table - [null, null, null, null, null] +22784 - Play blocks - [null, null, null, null, null] +22785 - Play blocks - [null, null, null, null, null] +22786 - Play blocks - [null, null, null, null, null] +22787 - Crib - [null, null, null, null, null] +22788 - Chalk patterns - [null, null, null, null, null] +22789 - Chalk patterns - [null, null, null, null, null] +22790 - Chalk patterns - [null, null, null, null, null] +22791 - Chalk patterns - [null, null, null, null, null] +22792 - Chalk patterns - [null, null, null, null, null] +22793 - Chalk patterns - [null, null, null, null, null] +22794 - Shape puzzle - [null, null, null, null, null] +22795 - Shape puzzle - [null, null, null, null, null] +22796 - Mushrooms - [null, null, null, null, null] +22797 - Mushrooms - [null, null, null, null, null] +22798 - Mushrooms - [null, null, null, null, null] +22799 - Mushrooms - [null, null, null, null, null] +22800 - Mushrooms - [null, null, null, null, null] +22801 - Mushrooms - [null, null, null, null, null] +22802 - Mushrooms - [null, null, null, null, null] +22803 - Mushrooms - [null, null, null, null, null] +22804 - Fern - [null, null, null, null, null] +22805 - Fern - [null, null, null, null, null] +22806 - Fern - [null, null, null, null, null] +22807 - Fern - [null, null, null, null, null] +22808 - Flowering fern - [null, null, null, null, null] +22809 - Flowering fern - [null, null, null, null, null] +22810 - Box - [null, null, null, null, null] +22811 - Counter - [null, null, null, null, null] +22812 - Bone rack - [null, null, null, null, null] +22813 - Bone rack - [null, null, null, null, null] +22814 - Bone rack - [null, null, null, null, null] +22815 - Bone rack - [null, null, null, null, null] +22816 - Bone rack - [null, null, null, null, null] +22817 - Bone rack - [null, null, null, null, null] +22818 - Bone rack - [null, null, null, null, null] +22819 - Bank booth - [Use, Use-quickly, Collect, null, null] +22820 - Desk - [null, null, null, null, null] +22821 - Desk - [null, null, null, null, null] +22822 - Bank safe - [null, null, null, null, null] +22823 - Thingymajig - [null, null, null, null, null] +22824 - Oojimaflip - [null, null, null, null, null] +22825 - Plinth - [null, null, null, null, null] +22826 - Magic ball - [null, null, null, null, null] +22827 - Workbench - [null, null, null, null, null] +22828 - Beetle - [null, null, null, null, null] +22829 - Frog - [null, null, null, null, null] +22830 - Table - [null, null, null, null, null] +22831 - Table - [null, null, null, null, null] +22832 - Table - [null, null, null, null, null] +22833 - Shelf - [null, null, null, null, null] +22834 - Shelf - [null, null, null, null, null] +22835 - Fungus seat - [null, null, null, null, null] +22836 - Moth - [null, null, null, null, null] +22837 - null - [null, null, null, null, null] +22838 - null - [null, null, null, null, null] +22839 - null - [null, null, null, null, null] +22840 - null - [null, null, null, null, null] +22841 - Bust - [null, null, null, null, null] +22842 - Bust - [null, null, null, null, null] +22843 - Chair - [null, null, null, null, null] +22844 - Table - [null, null, null, null, null] +22845 - Table - [null, null, null, null, null] +22846 - Table - [null, null, null, null, null] +22847 - Table - [null, null, null, null, null] +22848 - Table - [nul + + + +null, null] +23253 - Wreck - [null, null, null, null, null] +23254 - Wreck - [null, null, null, null, null] +23255 - Wreck - [null, null, null, null, null] +23256 - Wreck - [null, null, null, null, null] +23257 - null - [null, null, null, null, null] +23258 - null - [null, null, null, null, null] +23259 - null - [null, null, null, null, null] +23260 - null - [null, null, null, null, null] +23261 - null - [null, null, null, null, null] +23262 - null - [null, null, null, null, null] +23263 - null - [null, null, null, null, null] +23264 - null - [null, null, null, null, null] +23265 - null - [null, null, null, null, null] +23266 - null - [null, null, null, null, null] +23267 - null - [null, null, null, null, null] +23268 - null - [null, null, null, null, null] +23269 - null - [null, null, null, null, null] +23270 - null - [null, null, null, null, null] +23271 - Wilderness Ditch - [Cross, null, null, null, null] +23272 - null - [null, null, null, null, null] +23273 - null - [null, null, null, null, null] +23274 - Gate - [Open, null, null, null, null] +23275 - Sign - [Read, null, null, null, null] +23276 - Sign - [Read, null, null, null, null] +23277 - null - [null, null, null, null, null] +23278 - null - [null, null, null, null, null] +23279 - Ladder - [Climb-down, null, null, null, null] +23280 - Rocks - [null, null, null, null, null] +23281 - Rocks - [null, null, null, null, null] +23282 - null - [null, null, null, null, null] +23283 - Crate - [Hide-behind, hidden, null, null, null] +23284 - Zanik - [Untie, null, null, null, null] +23285 - Doorway - [Enter, null, null, null, null] +23286 - Doorway - [Enter, null, null, null, null] +23287 - Doorway - [Enter, null, null, null, null] +23288 - Artefact - [null, null, null, null, null] +23289 - Hole - [null, null, null, null, null] +23290 - null - [null, null, null, null, null] +23291 - Artefact - [null, null, null, null, null] +23292 - Hole - [null, null, null, null, null] +23293 - null - [null, null, null, null, null] +23294 - Artefact - [null, null, null, null, null] +23295 - Hole - [null, null, null, null, null] +23296 - null - [null, null, null, null, null] +23297 - Artefact - [null, null, null, null, null] +23298 - Hole - [null, null, null, null, null] +23299 - Artefact - [null, null, null, null, null] +23300 - Hole - [null, null, null, null, null] +23301 - null - [null, null, null, null, null] +23302 - Artefact - [null, null, null, null, null] +23303 - Hole - [null, null, null, null, null] +23304 - null - [null, null, null, null, null] +23305 - Specimen table - [null, null, null, null, null] +23306 - Goblin crowd - [null, null, null, null, null] +23307 - Goblin crowd - [null, null, null, null, null] +23308 - Goblin crowd - [null, null, null, null, null] +23309 - Goblin crowd - [null, null, null, null, null] +23310 - Goblin crowd - [null, null, null, null, null] +23311 - Goblin crowd - [null, null, null, null, null] +23312 - Goblin crowd - [null, null, null, null, null] +23313 - Goblin crowd - [null, null, null, null, null] +23314 - Goblin crowd - [null, null, null, null, null] +23315 - Crowd of dwarves - [null, null, null, null, null] +23316 - Crowd of dwarves - [null, null, null, null, null] +23317 - Crowd of dwarves - [null, null, null, null, null] +23318 - Council members - [null, null, null, null, null] +23319 - Cave gobins - [null, null, null, null, null] +23320 - null - [null, null, null, null, null] +23321 - null - [null, null, null, null, null] +23322 - null - [null, null, null, null, null] +23323 - null - [null, null, null, null, null] +23324 - null - [null, null, null, null, null] +23325 - null - [null, null, null, null, null] +23326 - null - [null, null, null, null, null] +23327 - null - [null, null, null, null, null] +23328 - null - [null, null, null, null, null] +23329 - null - [null, null, null, null, null] +23330 - null - [null, null, null, null, null] +23331 - null - [null, null, null, null, null] +23332 - null - [null, null, null, null, null] +23333 - null - [null, null, null, null, null] +23334 - null - [null, null, null, null, null] +23335 - null - [null, null, null, null, null] +23336 - null - [null, null, null, null, null] +23337 - null - [null, null, null, null, null] +23338 - Door - [Open, null, null, null, null] +23339 - Door - [Close, null, null, null, null] +23340 - Large door - [Open, null, null, null, null] +23341 - Large door - [Close, null, null, null, null] +23342 - Large door - [Open, null, null, null, null] +23343 - Large door - [Close, null, null, null, null] +23344 - null - [null, null, null, null, null] +23345 - null - [null, null, null, null, null] +23346 - null - [null, null, null, null, null] +23347 - null - [null, null, null, null, null] +23348 - Wall - [null, null, null, null, null] +23349 - Wall - [null, null, null, null, null] +23350 - Wall - [null, null, null, null, null] +23351 - null - [null, null, null, null, null] +23352 - null - [null, null, null, null, null] +23353 - null - [null, null, null, null, null] +23354 - null - [null, null, null, null, null] +23355 - null - [null, null, null, null, null] +23356 - Crate - [null, null, null, null, null] +23357 - Crate - [null, null, null, null, null] +23358 - Crate - [null, null, null, null, null] +23359 - null - [null, null, null, null, null] +23360 - null - [null, null, null, null, null] +23361 - null - [null, null, null, null, null] +23362 - null - [null, null, null, null, null] +23363 - null - [null, null, null, null, null] +23364 - null - [null, null, null, null, null] +23365 - null - [null, null, null, null, null] +23366 - Barrel - [null, null, null, null, null] +23367 - null - [null, null, null, null, null] +23368 - null - [null, null, null, null, null] +23369 - null - [null, null, null, null, null] +23370 - null - [null, null, null, null, null] +23371 - null - [null, null, null, null, null] +23372 - null - [null, null, null, null, null] +23373 - null - [null, null, null, null, null] +23374 - null - [null, null, null, null, null] +23375 - null - [null, null, null, null, null] +23376 - Ladder - [Climb-down, null, null, null, null] +23377 - Ladder - [Climb-up, null, null, null, null] +23378 - Door - [Open, null, null, null, null] +23379 - Door - [null, null, null, null, null] +23380 - null - [null, null, null, null, null] +23381 - Dead tree - [null, null, null, null, null] +23382 - null - [null, null, null, null, null] +23383 - null - [null, null, null, null, null] +23384 - null - [null, null, null, null, null] +23385 - null - [null, null, null, null, null] +23386 - null - [null, null, null, null, null] +23387 - null - [null, null, null, null, null] +23388 - null - [null, null, null, null, null] +23389 - null - [null, null, null, null, null] +23390 - null - [null, null, null, null, null] +23391 - null - [null, null, null, null, null] +23392 - null - [null, null, null, null, null] +23393 - null - [null, null, null, null, null] +23394 - null - [null, null, null, null, null] +23395 - null - [null, null, null, null, null] +23396 - null - [null, null, null, null, null] +23397 - null - [null, null, null, null, null] +23398 - null - [null, null, null, null, null] +23399 - null - [null, null, null, null, null] +23400 - null - [null, null, null, null, null] +23401 - null - [null, null, null, null, null] +23402 - null - [null, null, null, null, null] +23403 - null - [null, null, null, null, null] +23404 - null - [null, null, null, null, null] +23405 - null - [null, null, null, null, null] +23406 - null - [null, null, null, null, null] +23407 - null - [null, null, null, null, null] +23408 - null - [null, null, null, null, null] +23409 - null - [null, null, null, null, null] +23410 - null - [null, null, null, null, null] +23411 - null - [null, null, null, null, null] +23412 - null - [null, null, null, null, null] +23413 - null - [null, null, null, null, null] +23414 - null - [null, null, null, null, null] +23415 - null - [null, null, null, null, null] +23416 - null - [null, null, null, null, null] +23417 - null - [null, null, null, null, null] +23418 - null - [null, null, null, null, null] +23419 - null - [null, null, null, null, null] +23420 - null - [null, null, null, null, null] +23421 - null - [null, null, null, null, null] +23422 - null - [null, null, null, null, null] +23423 - null - [null, null, null, null, null] +23424 - null - [null, null, null, null, null] +23425 - null - [null, null, null, null, null] +23426 - null - [null, null, null, null, null] +23427 - null - [null, null, null, null, null] +23428 - null - [null, null, null, null, null] +23429 - null - [null, null, null, null, null] +23430 - null - [null, null, null, null, null] +23431 - null - [null, null, null, null, null] +23432 - null - [null, null, null, null, null] +23433 - null - [null, null, null, null, null] +23434 - null - [null, null, null, null, null] +23435 - null - [null, null, null, null, null] +23436 - null - [null, null, null, null, null] +23437 - null - [null, null, null, null, null] +23438 - null - [null, null, null, null, null] +23439 - null - [null, null, null, null, null] +23440 - null - [null, null, null, null, null] +23441 - null - [null, null, null, null, null] +23442 - null - [null, null, null, null, null] +23443 - null - [null, null, null, null, null] +23444 - null - [null, null, null, null, null] +23445 - null - [null, null, null, null, null] +23446 - null - [null, null, null, null, null] +23447 - null - [null, null, null, null, null] +23448 - null - [null, null, null, null, null] +23449 - null - [null, null, null, null, null] +23450 - null - [null, null, null, null, null] +23451 - null - [null, null, null, null, null] +23452 - null - [null, null, null, null, null] +23453 - null - [null, null, null, null, null] +23454 - null - [null, null, null, null, null] +23455 - null - [null, null, null, null, null] +23456 - null - [null, null, null, null, null] +23457 - null - [null, null, null, null, null] +23458 - null - [null, null, null, null, null] +23459 - null - [null, null, null, null, null] +23460 - null - [null, null, null, null, null] +23461 - null - [null, null, null, null, null] +23462 - null - [null, null, null, null, null] +23463 - null - [null, null, null, null, null] +23464 - null - [null, null, null, null, null] +23465 - null - [null, null, null, null, null] +23466 - null - [null, null, null, null, null] +23467 - null - [null, null, null, null, null] +23468 - null - [null, null, null, null, null] +23469 - null - [null, null, null, null, null] +23470 - null - [null, null, null, null, null] +23471 - null - [null, null, null, null, null] +23472 - null - [null, null, null, null, null] +23473 - null - [null, null, null, null, null] +23474 - null - [null, null, null, null, null] +23475 - null - [null, null, null, null, null] +23476 - null - [null, null, null, null, null] +23477 - null - [null, null, null, null, null] +23478 - null - [null, null, null, null, null] +23479 - null - [null, null, null, null, null] +23480 - null - [null, null, null, null, null] +23481 - null - [null, null, null, null, null] +23482 - null - [null, null, null, null, null] +23483 - null - [null, null, null, null, null] +23484 - null - [null, null, null, null, null] +23485 - null - [null, null, null, null, null] +23486 - null - [null, null, null, null, null] +23487 - null - [null, null, null, null, null] +23488 - null - [null, null, null, null, null] +23489 - null - [null, null, null, null, null] +23490 - null - [null, null, null, null, null] +23491 - null - [null, null, null, null, null] +23492 - null - [null, null, null, null, null] +23493 - null - [null, null, null, null, null] +23494 - null - [null, null, null, null, null] +23495 - null - [null, null, null, null, null] +23496 - null - [null, null, null, null, null] +23497 - null - [null, null, null, null, null] +23498 - null - [null, null, null, null, null] +23499 - Tunnel - [Walk-along, null, null, null, null] +23500 - Tunnel - [null, null, null, null, null] +23501 - null - [null, null, null, null, null] +23502 - null - [null, null, null, null, null] +23503 - null - [null, null, null, null, null] +23504 - Ladder - [Climb-up, null, null, null, null] +23505 - null - [null, null, null, null, null] +23506 - null - [null, null, null, null, null] +23507 - null - [null, null, null, null, null] +23508 - null - [null, null, null, null, null] +23509 - null - [null, null, null, null, null] +23510 - null - [null, null, null, null, null] +23511 - null - [null, null, null, null, null] +23512 - null - [null, null, null, null, null] +23513 - null - [null, null, null, null, null] +23514 - null - [null, null, null, null, null] +23515 - null - [null, null, null, null, null] +23516 - null - [null, null, null, null, null] +23517 - null - [null, null, null, null, null] +23518 - null - [null, null, null, null, null] +23519 - null - [null, null, null, null, null] +23520 - null - [null, null, null, null, null] +23521 - null - [null, null, null, null, null] +23522 - null - [null, null, null, null, null] +23523 - null - [null, null, null, null, null] +23524 - null - [null, null, null, null, null] +23525 - null - [null, null, null, null, null] +23526 - Sample table - [null, null, null, null, null] +23527 - Sample table - [null, null, null, null, null] +23528 - Buried artefact - [null, null, null, null, null] +23529 - Hole - [null, null, null, null, null] +23530 - Crate - [Hide-behind, null, null, null, null] +23531 - Ladder - [Climb-up, null, null, null, null] +23532 - Ladder - [Climb-down, null, null, null, null] +23533 - Crate - [Hide-behind, null, null, null, null] +23534 - null - [null, null, null, null, null] +23535 - null - [null, null, null, null, null] +23536 - null - [null, null, null, null, null] +23537 - null - [null, null, null, null, null] +23538 - null - [null, null, null, null, null] +23539 - null - [null, null, null, null, null] +23540 - null - [null, null, null, null, null] +23541 - null - [null, null, null, null, null] +23542 - Trawler net - [null, null, null, null, null] +23543 - Trawler net - [null, null, null, null, null] +23544 - Trawler net - [null, null, null, null, null] +23545 - Trawler net - [null, null, null, null, null] +23546 - Trawler net - [null, null, null, null, null] +23547 - Trawler net - [null, null, null, null, null] +23548 - Trawler net - [null, null, null, null, null] +23549 - Trawler net - [null, null, null, null, null] +23550 - Trawler net - [null, null, null, null, null] +23551 - Chest - [null, null, null, null, null] +23552 - Chest - [null, null, null, null, null] +23553 - null - [Fill, null, null, null, null] +23554 - Rocks - [Mine, Prospect, hidden, null, null] +23555 - Rocks - [Mine, Prospect, hidden, null, null] +23556 - Rocks - [Mine, Prospect, hidden, null, null] +23557 - Rocks - [Mine, Prospect, hidden, null, null] +23558 - Rocks - [Mine, Prospect, hidden, null, null] +23559 - Rocks - [Mine, Prospect, hidden, null, null] +23560 - Rocks - [Mine, Prospect, hidden, null, null] +23561 - Rocks - [Mine, Prospect, hidden, null, null] +23562 - Rocks - [Mine, Prospect, hidden, null, null] +23563 - Rocks - [Mine, Prospect, hidden, null, null] +23564 - Rocks - [Mine, Prospect, hidden, null, null] +23565 - Rocks - [Mine, Prospect, hidden, null, null] +23566 - Rocks - [Mine, Prospect, hidden, null, null] +23567 - Rocks - [Mine, Prospect, hidden, null, null] +23568 - Rocks - [Mine, Prospect, hidden, null, null] +23569 - Rocks - [Mine, Prospect, hidden, null, null] +23570 - Rocks - [Mine, Prospect, hidden, null, null] +23571 - Rocks - [Mine, Prospect, hidden, null, null] +23572 - null - [null, null, null, null, null] +23573 - null - [null, null, null, null, null] +23574 - null - [null, null, null, null, null] +23575 - null - [null, null, null, null, null] +23576 - null - [null, null, null, null, null] +23577 - null - [null, null, null, null, null] +23578 - null - [null, null, null, null, null] +23579 - null - [null, null, null, null, null] +23580 - null - [null, null, null, null, null] +23581 - null - [null, null, null, null, null] +23582 - null - [null, null, null, null, null] +23583 - null - [null, null, null, null, null] +23584 - Ladder - [Climb-up, null, null, null, null] +23585 - Ladder - [Climb-down, null, null, null, null] +23586 - null - [null, null, null, null, null] +23587 - null - [null, null, null, null, null] +23588 - null - [null, null, null, null, null] +23589 - null - [null, null, null, null, null] +23590 - null - [null, null, null, null, null] +23591 - Kalphite queen legs - [null, null, null, null, null] +23592 - null - [null, null, null, null, null] +23593 - null - [null, null, null, null, null] +23594 - null - [null, null, null, null, null] +23595 - null - [null, null, null, null, null] +23596 - Tunnel - [Enter, null, null, null, null] +23597 - null - [null, null, null, null, null] +23598 - null - [null, null, null, null, null] +23599 - null - [null, null, null, null, null] +23600 - null - [null, null, null, null, null] +23601 - null - [null, null, null, null, null] +23602 - null - [null, null, null, null, null] +23603 - null - [null, null, null, null, null] +23604 - null - [null, null, null, null, null] +23605 - null - [null, null, null, null, null] +23606 - Stalagmites - [null, null, null, null, null] +23607 - Stalagmites - [null, null, null, null, null] +23608 - null - [null, null, null, null, null] +23609 - Tunnel entrance - [null, null, null, null, null] +23610 - Tunnel entrance - [Climb-down, null, null, null, null] +23611 - Cocoon - [hidden, null, null, null, null] +23612 - null - [null, null, null, null, null] +23613 - null - [null, null, null, null, null] +23614 - null - [null, null, null, null, null] +23615 - A cart full of logs - [null, null, null, hidden, null] +23616 - Roses - [null, null, null, null, null] +23617 - null - [null, null, null, null, null] +23618 - null - [null, null, null, null, null] +23619 - null - [null, null, null, null, null] +23620 - null - [null, null, null, null, null] +23621 - null - [null, null, null, null, null] +23622 - null - [null, null, null, null, null] +23623 - null - [null, null, null, null, null] +23624 - Chair - [null, null, null, null, null] +23625 - Cadava bush - [Pick-from, null, null, null, null] +23626 - Cadava bush - [Pick-from, null, null, null, null] +23627 - Cadava bush - [Pick-from, null, null, null, null] +23628 - Redberry bush - [Pick-from, null, null, null, null] +23629 - Redberry bush - [Pick-from, null, null, null, null] +23630 - Redberry bush - [Pick-from, null, null, null, null] +23631 - Door - [null, null, null, null, null] +23632 - Stand - [null, null, null, null, null] +23633 - Newspapers - [null, null, null, null, null] +23634 - Display case - [null, null, null, null, null] +23635 - Display case - [null, null, null, null, null] +23636 - Plaque - [Read, null, null, null, null] +23637 - Door - [null, null, null, null, null] +23638 - null - [null, null, null, null, null] +23639 - null - [null, null, null, null, null] +23640 - Door - [null, null, null, null, null] +23641 - null - [null, null, null, null, null] +23642 - null - [null, null, null, null, null] +23643 - null - [null, null, null, null, null] +23644 - null - [null, null, null, null, null] +23645 - null - [null, null, null, null, null] +23646 - null - [null, null, null, null, null] +23647 - null - [null, null, null, null, null] +23648 - null - [null, null, null, null, null] +23649 - null - [null, null, null, null, null] +23650 - null - [null, null, null, null, null] +23651 - null - [null, null, null, null, null] +23652 - null - [null, null, null, null, null] +23653 - null - [null, null, null, null, null] +23654 - null - [null, null, null, null, null] +23655 - null - [null, null, null, null, null] +23656 - null - [null, null, null, null, null] +23657 - null - [null, null, null, null, null] +23658 - null - [null, null, null, null, null] +23659 - null - [null, null, null, null, null] +23660 - null - [null, null, null, null, null] +23661 - null - [null, null, null, null, null] +23662 - null - [null, null, null, null, null] +23663 - null - [null, null, null, null, null] +23664 - null - [null, null, null, null, null] +23665 - null - [null, null, null, null, null] +23666 - null - [null, null, null, null, null] +23667 - null - [null, null, null, null, null] +23668 - null - [null, null, null, null, null] +23669 - null - [null, null, null, null, null] +23670 - null - [null, null, null, null, null] +23671 - null - [null, null, null, null, null] +23672 - null - [null, null, null, null, null] +23673 - null - [null, null, null, null, null] +23674 - null - [null, null, null, null, null] +23675 - null - [null, null, null, null, null] +23676 - null - [null, null, null, null, null] +23677 - null - [null, null, null, null, null] +23678 - null - [null, null, null, null, null] +23679 - null - [null, null, null, null, null] +23680 - null - [null, null, null, null, null] +23681 - null - [null, null, null, null, null] +23682 - null - [null, null, null, null, null] +23683 - null - [null, null, null, null, null] +23684 - null - [null, null, null, null, null] +23685 - null - [null, null, null, null, null] +23686 - null - [null, null, null, null, null] +23687 - null - [null, null, null, null, null] +23688 - null - [null, null, null, null, null] +23689 - null - [null, null, null, null, null] +23690 - null - [null, null, null, null, null] +23691 - null - [null, null, null, null, null] +23692 - null - [null, null, null, null, null] +23693 - null - [null, null, null, null, null] +23694 - null - [null, null, null, null, null] +23695 - null - [null, null, null, null, null] +23696 - null - [null, null, null, null, null] +23697 - null - [null, null, null, null, null] +23698 - null - [null, null, null, null, null] +23699 - null - [null, null, null, null, null] +23700 - null - [null, null, null, null, null] +23701 - null - [null, null, null, null, null] +23702 - null - [null, null, null, null, null] +23703 - null - [null, null, null, null, null] +23704 - null - [null, null, null, null, null] +23705 - null - [null, null, null, null, null] +23706 - null - [null, null, null, null, null] +23707 - null - [null, null, null, null, null] +23708 - null - [null, null, null, null, null] +23709 - null - [null, null, null, null, null] +23710 - null - [null, null, null, null, null] +23711 - null - [null, null, null, null, null] +23712 - null - [null, null, null, null, null] +23713 - null - [null, null, null, null, null] +23714 - null - [null, null, null, null, null] +23715 - null - [null, null, null, null, null] +23716 - null - [null, null, null, null, null] +23717 - null - [null, null, null, null, null] +23718 - null - [null, null, null, null, null] +23719 - null - [null, null, null, null, null] +23720 - null - [null, null, null, null, null] +23721 - null - [null, null, null, null, null] +23722 - null - [null, null, null, null, null] +23723 - null - [null, null, null, null, null] +23724 - null - [null, null, null, null, null] +23725 - null - [null, null, null, null, null] +23726 - null - [null, null, null, null, null] +23727 - null - [null, null, null, null, null] +23728 - null - [null, null, null, null, null] +23729 - null - [null, null, null, null, null] +23730 - null - [null, null, null, null, null] +23731 - Door - [Open, null, null, null, null] +23732 - null - [null, null, null, null, null] +23733 - null - [null, null, null, null, null] +23734 - null - [null, null, null, null, null] +23735 - null - [null, null, null, null, null] +23736 - null - [null, null, null, null, null] +23737 - null - [null, null, null, null, null] +23738 - null - [null, null, null, null, null] +23739 - null - [null, null, null, null, null] +23740 - null - [null, null, null, null, null] +23741 - null - [null, null, null, null, null] +23742 - null - [null, null, null, null, null] +23743 - null - [null, null, null, null, null] +23744 - null - [null, null, null, null, null] +23745 - null - [null, null, null, null, null] +23746 - null - [null, null, null, null, null] +23747 - null - [null, null, null, null, null] +23748 - null - [null, null, null, null, null] +23749 - null - [null, null, null, null, null] +23750 - null - [null, null, null, null, null] +23751 - null - [null, null, null, null, null] +23752 - null - [null, null, null, null, null] +23753 - null - [null, null, null, null, null] +23754 - null - [null, null, null, null, null] +23755 - null - [null, null, null, null, null] +23756 - null - [null, null, null, null, null] +23757 - null - [null, null, null, null, null] +23758 - null - [null, null, null, null, null] +23759 - null - [null, null, null, null, null] +23760 - null - [null, null, null, null, null] +23761 - null - [null, null, null, null, null] +23762 - null - [null, null, null, null, null] +23763 - null - [null, null, null, null, null] +23764 - null - [null, null, null, null, null] +23765 - null - [null, null, null, null, null] +23766 - null - [null, null, null, null, null] +23767 - null - [null, null, null, null, null] +23768 - null - [null, null, null, null, null] +23769 - null - [null, null, null, null, null] +23770 - null - [null, null, null, null, null] +23771 - null - [null, null, null, null, null] +23772 - null - [null, null, null, null, null] +23773 - null - [null, null, null, null, null] +23774 - null - [null, null, null, null, null] +23775 - null - [null, null, null, null, null] +23776 - null - [null, null, null, null, null] +23777 - null - [null, null, null, null, null] +23778 - null - [null, null, null, null, null] +23779 - null - [null, null, null, null, null] +23780 - null - [null, null, null, null, null] +23781 - null - [null, null, null, null, null] +23782 - null - [null, null, null, null, null] +23783 - null - [null, null, null, null, null] +23784 - null - [null, null, null, null, null] +23785 - null - [null, null, null, null, null] +23786 - null - [null, null, null, null, null] +23787 - null - [null, null, null, null, null] +23788 - null - [null, null, null, null, null] +23789 - null - [null, null, null, null, null] +23790 - null - [null, null, null, null, null] +23791 - null - [null, null, null, null, null] +23792 - null - [null, null, null, null, null] +23793 - null - [null, null, null, null, null] +23794 - null - [null, null, null, null, null] +23795 - null - [null, null, null, null, null] +23796 - null - [null, null, null, null, null] +23797 - null - [null, null, null, null, null] +23798 - null - [null, null, null, null, null] +23799 - null - [null, null, null, null, null] +23800 - null - [null, null, null, null, null] +23801 - null - [null, null, null, null, null] +23802 - null - [null, null, null, null, null] +23803 - null - [null, null, null, null, null] +23804 - null - [null, null, null, null, null] +23805 - null - [null, null, null, null, null] +23806 - null - [null, null, null, null, null] +23807 - null - [null, null, null, null, null] +23808 - null - [null, null, null, null, null] +23809 - null - [null, null, null, null, null] +23810 - null - [null, null, null, null, null] +23811 - null - [null, null, null, null, null] +23812 - null - [null, null, null, null, null] +23813 - null - [null, null, null, null, null] +23814 - null - [null, null, null, null, null] +23815 - null - [null, null, null, null, null] +23816 - null - [null, null, null, null, null] +23817 - null - [null, null, null, null, null] +23818 - null - [null, null, null, null, null] +23819 - null - [null, null, null, null, null] +23820 - null - [null, null, null, null, null] +23821 - null - [null, null, null, null, null] +23822 - null - [null, null, null, null, null] +23823 - null - [null, null, null, null, null] +23824 - null - [null, null, null, null, null] +23825 - null - [null, null, null, null, null] +23826 - null - [null, null, null, null, null] +23827 - null - [null, null, null, null, null] +23828 - null - [null, null, null, null, null] +23829 - null - [null, null, null, null, null] +23830 - null - [null, null, null, null, null] +23831 - null - [null, null, null, null, null] +23832 - null - [null, null, null, null, null] +23833 - null - [null, null, null, null, null] +23834 - null - [null, null, null, null, null] +23835 - null - [null, null, null, null, null] +23836 - null - [null, null, null, null, null] +23837 - null - [null, null, null, null, null] +23838 - null - [null, null, null, null, null] +23839 - null - [null, null, null, null, null] +23840 - null - [null, null, null, null, null] +23841 - null - [null, null, null, null, null] +23842 - null - [null, null, null, null, null] +23843 - null - [null, null, null, null, null] +23844 - null - [null, null, null, null, null] +23845 - null - [null, null, null, null, null] +23846 - null - [null, null, null, null, null] +23847 - null - [null, null, null, null, null] +23848 - null - [null, null, null, null, null] +23849 - null - [null, null, null, null, null] +23850 - null - [null, null, null, null, null] +23851 - null - [null, null, null, null, null] +23852 - null - [null, null, null, null, null] +23853 - null - [null, null, null, null, null] +23854 - null - [null, null, null, null, null] +23855 - null - [null, null, null, null, null] +23856 - null - [null, null, null, null, null] +23857 - null - [null, null, null, null, null] +23858 - null - [null, null, null, null, null] +23859 - null - [null, null, null, null, null] +23860 - null - [null, null, null, null, null] +23861 - null - [null, null, null, null, null] +23862 - null - [null, null, null, null, null] +23863 - null - [null, null, null, null, null] +23864 - null - [null, null, null, null, null] +23865 - null - [null, null, null, null, null] +23866 - null - [null, null, null, null, null] +23867 - null - [null, null, null, null, null] +23868 - null - [null, null, null, null, null] +23869 - null - [null, null, null, null, null] +23870 - null - [null, null, null, null, null] +23871 - null - [null, null, null, null, null] +23872 - null - [null, null, null, null, null] +23873 - null - [null, null, null, null, null] +23874 - null - [null, null, null, null, null] +23875 - null - [null, null, null, null, null] +23876 - null - [null, null, null, null, null] +23877 - null - [null, null, null, null, null] +23878 - null - [null, null, null, null, null] +23879 - null - [null, null, null, null, null] +23880 - null - [null, null, null, null, null] +23881 - null - [null, null, null, null, null] +23882 - null - [null, null, null, null, null] +23883 - null - [null, null, null, null, null] +23884 - null - [null, null, null, null, null] +23885 - null - [null, null, null, null, null] +23886 - null - [null, null, null, null, null] +23887 - null - [null, null, null, null, null] +23888 - null - [null, null, null, null, null] +23889 - null - [null, null, null, null, null] +23890 - null - [null, null, null, null, null] +23891 - null - [null, null, null, null, null] +23892 - null - [null, null, null, null, null] +23893 - null - [null, null, null, null, null] +23894 - null - [null, null, null, null, null] +23895 - null - [null, null, null, null, null] +23896 - null - [null, null, null, null, null] +23897 - null - [null, null, null, null, null] +23898 - null - [null, null, null, null, null] +23899 - null - [null, null, null, null, null] +23900 - null - [null, null, null, null, null] +23901 - null - [null, null, null, null, null] +23902 - null - [null, null, null, null, null] +23903 - null - [null, null, null, null, null] +23904 - null - [null, null, null, null, null] +23905 - null - [null, null, null, null, null] +23906 - null - [null, null, null, null, null] +23907 - null - [null, null, null, null, null] +23908 - null - [null, null, null, null, null] +23909 - null - [null, null, null, null, null] +23910 - null - [null, null, null, null, null] +23911 - null - [null, null, null, null, null] +23912 - null - [null, null, null, null, null] +23913 - null - [null, null, null, null, null] +23914 - null - [null, null, null, null, null] +23915 - null - [null, null, null, null, null] +23916 - null - [null, null, null, null, null] +23917 - Gate - [Open, null, null, null, null] +23918 - Gate - [Close, null, null, null, null] +23919 - Gate - [Close, null, null, null, null] +23920 - Pump and drain - [null, null, null, null, null] +23921 - Dummy - [Attack, null, null, null, null] +23922 - null - [null, null, null, null, null] +23923 - null - [null, null, null, null, null] +23924 - Leaflets - [null, null, null, null, null] +23925 - Chest - [null, null, null, null, null] +23926 - Chest - [null, null, null, null, null] +23927 - null - [null, null, null, null, null] +23928 - Bank table - [null, null, null, null, null] +23929 - Gold - [null, null, null, null, null] +23930 - Statue - [null, null, null, null, null] +23931 - null - [null, null, null, null, null] +23932 - null - [null, null, null, null, null] +23933 - Chandelier - [null, null, null, null, null] +23934 - null - [null, null, null, null, null] +23935 - null - [null, null, null, null, null] +23936 - null - [null, null, null, null, null] +23937 - null - [null, null, null, null, null] +23938 - null - [null, null, null, null, null] +23939 - Safe - [null, null, null, null, null] +23940 - Rack - [null, null, null, null, null] +23941 - Barrel - [null, null, null, null, null] +23942 - Table - [null, null, null, null, null] +23943 - Barrel - [null, null, null, null, null] +23944 - Rack - [null, null, null, null, null] +23945 - null - [null, null, null, null, null] +23946 - null - [null, null, null, null, null] +23947 - Bellows - [null, null, null, null, null] +23948 - null - [null, null, null, null, null] +23949 - null - [null, null, null, null, null] +23950 - null - [null, null, null, null, null] +23951 - Metal pieces - [null, null, null, null, null] +23952 - null - [null, null, null, null, null] +23953 - null - [null, null, null, null, null] +23954 - null - [null, null, null, null, null] +23955 - Chimney - [null, null, null, null, null] +23956 - null - [null, null, null, null, null] +23957 - null - [null, null, null, null, null] +23958 - null - [null, null, null, null, null] +23959 - null - [null, null, null, null, null] +23960 - Workbench - [null, null, null, null, null] +23961 - Lathe - [null, null, null, null, null] +23962 - Drill - [null, null, null, null, null] +23963 - Hearth - [null, null, null, null, null] +23964 - Mould - [null, null, null, null, null] +23965 - Poster - [null, null, null, null, null] +23966 - null - [null, null, null, null, null] +23967 - Sign - [null, null, null, null, null] +23968 - Sign - [null, null, null, null, null] +23969 - Sign - [null, null, null, null, null] +23970 - Sign - [null, null, null, null, null] +23971 - null - [null, null, null, null, null] +23972 - Sign - [null, null, null, null, null] +23973 - null - [null, null, null, null, null] +23974 - Sign - [null, null, null, null, null] +23975 - null - [null, null, null, null, null] +23976 - null - [null, null, null, null, null] +23977 - Sign - [null, null, null, null, null] +23978 - Sign - [null, null, null, null, null] +23979 - null - [null, null, null, null, null] +23980 - Sign - [null, null, null, null, null] +23981 - null - [null, null, null, null, null] +23982 - Sign - [null, null, null, null, null] +23983 - Market stall - [null, null, null, null, null] +23984 - Market stall - [null, null, null, null, null] +23985 - Market stall - [null, null, null, null, null] +23986 - Market stall - [null, null, null, null, null] +23987 - Market stall - [null, null, null, null, null] +23988 - Scuttle - [null, null, null, null, null] +23989 - Pokers - [null, null, null, null, null] +23990 - null - [null, null, null, null, null] +23991 - null - [null, null, null, null, null] +23992 - null - [null, null, null, null, null] +23993 - Bar - [null, null, null, null, null] +23994 - Bar - [null, null, null, null, null] +23995 - Bar - [null, null, null, null, null] +23996 - Bar - [null, null, null, null, null] +23997 - Bar - [null, null, null, null, null] +23998 - Bar - [null, null, null, null, null] +23999 - Bar - [null, null, null, null, null] +24000 - Bar - [null, null, null, null, null] +24001 - Bar - [null, null, null, null, null] +24002 - null - [null, null, null, null, null] +24003 - null - [null, null, null, null, null] +24004 - null - [null, null, null, null, null] +24005 - null - [null, null, null, null, null] +24006 - null - [null, null, null, null, null] +24007 - null - [null, null, null, null, null] +24008 - null - [null, null, null, null, null] +24009 - null - [null, null, null, null, null] +24010 - null - [null, null, null, null, null] +24011 - Table - [null, null, null, null, null] +24012 - Table - [null, null, null, null, null] +24013 - Table - [null, null, null, null, null] +24014 - Table - [null, null, null, null, null] +24015 - null - [null, null, null, null, null] +24016 - Wine rack - [null, null, null, null, null] +24017 - null - [null, null, null, null, null] +24018 - null - [null, null, null, null, null] +24019 - null - [null, null, null, null, null] +24020 - null - [null, null, null, null, null] +24021 - null - [null, null, null, null, null] +24022 - null - [null, null, null, null, null] +24023 - null - [null, null, null, null, null] +24024 - null - [null, null, null, null, null] +24025 - Lamp - [null, null, null, null, null] +24026 - Lantern - [null, null, null, null, null] +24027 - Sewing machine - [null, null, null, null, null] +24028 - Table - [null, null, null, null, null] +24029 - null - [null, null, null, null, null] +24030 - Clothes - [null, null, null, null, null] +24031 - Cloth - [null, null, null, null, null] +24032 - null - [null, null, null, null, null] +24033 - Oil lamp - [null, null, null, null, null] +24034 - Fabric - [null, null, null, null, null] +24035 - Fabric - [null, null, null, null, null] +24036 - null - [null, null, null, null, null] +24037 - null - [null, null, null, null, null] +24038 - null - [null, null, null, null, null] +24039 - null - [null, null, null, null, null] +24040 - null - [null, null, null, null, null] +24041 - null - [null, null, null, null, null] +24042 - null - [null, null, null, null, null] +24043 - Bed - [null, null, null, null, null] +24044 - Clothes - [null, null, null, null, null] +24045 - Clothes - [null, null, null, null, null] +24046 - Clothes - [null, null, null, null, null] +24047 - Clothes - [null, null, null, null, null] +24048 - Clothes - [null, null, null, null, null] +24049 - Clothes - [null, null, null, null, null] +24050 - Clothes - [null, null, null, null, null] +24051 - null - [null, null, null, null, null] +24052 - null - [null, null, null, null, null] +24053 - null - [null, null, null, null, null] +24054 - null - [null, null, null, null, null] +24055 - null - [null, null, null, null, null] +24056 - null - [null, null, null, null, null] +24057 - null - [null, null, null, null, null] +24058 - null - [null, null, null, null, null] +24059 - null - [null, null, null, null, null] +24060 - null - [null, null, null, null, null] +24061 - null - [null, null, null, null, null] +24062 - null - [null, null, null, null, null] +24063 - null - [null, null, null, null, null] +24064 - null - [null, null, null, null, null] +24065 - Sails - [null, null, null, null, null] +24066 - Mill - [null, null, null, null, null] +24067 - Mill - [null, null, null, null, null] +24068 - Mill - [null, null, null, null, null] +24069 - Mill - [null, null, null, null, null] +24070 - Flour bin - [Empty, null, null, null, null] +24071 - Hopper - [null, null, null, null, null] +24072 - Hopper controls - [Operate, null, null, null, null] +24073 - Staircase - [Climb-up, null, null, null, null] +24074 - Staircase - [Climb, Climb-up, Climb-down, null, null] +24075 - Staircase - [Climb-down, null, null, null, null] +24076 - Table - [null, null, null, null, null] +24077 - null - [null, null, null, null, null] +24078 - null - [null, null, null, null, null] +24079 - Shelves - [null, null, null, null, null] +24080 - Shelves - [null, null, null, null, null] +24081 - Picture - [null, null, null, null, null] +24082 - Picture - [null, null, null, null, null] +24083 - Picture - [null, null, null, null, null] +24084 - Table - [null, null, null, null, null] +24085 - Shelves - [Search, null, null, null, null] +24086 - Shelves - [Search, null, null, null, null] +24087 - Study desk - [Search, null, null, null, null] +24088 - Table - [null, null, null, null, null] +24089 - null - [null, null, null, null, null] +24090 - Dead bat - [null, null, null, null, null] +24091 - Herbs - [null, null, null, null, null] +24092 - Cabinet - [null, null, null, null, null] +24093 - Cabinet - [null, null, null, null, null] +24094 - Swings - [null, null, null, null, null] +24095 - Washing line - [null, null, null, null, null] +24096 - Toy bricks - [null, null, null, null, null] +24097 - Toy weapons - [null, null, null, null, null] +24098 - Cat basket - [null, null, null, null, null] +24099 - Bunkbed - [null, null, null, null, null] +24100 - Flowerbed - [null, null, null, null, null] +24101 - Flowerbed - [null, null, null, null, null] +24102 - null - [null, null, null, null, null] +24103 - null - [null, null, null, null, null] +24104 - Table - [null, null, null, null, null] +24105 - Sword cabinet - [null, null, null, null, null] +24106 - Sword in stone - [null, null, null, null, null] +24107 - null - [null, null, null, null, null] +24108 - null - [null, null, null, null, null] +24109 - Sword case - [null, null, null, null, null] +24110 - Sword case - [null, null, null, null, null] +24111 - Sword case - [null, null, null, null, null] +24112 - Sink - [null, null, null, null, null] +24113 - Dishes - [null, null, null, null, null] +24114 - Dishes - [null, null, null, null, null] +24115 - Dishes - [null, null, null, null, null] +24116 - Sword case - [null, null, null, null, null] +24117 - Poster - [null, null, null, null, null] +24118 - Poster - [null, null, null, null, null] +24119 - Poster - [null, null, null, null, null] +24120 - null - [null, null, null, null, null] +24121 - null - [null, null, null, null, null] +24122 - Stepladder - [null, null, null, null, null] +24123 - null - [null, null, null, null, null] +24124 - Shop counter - [null, null, null, null, null] +24125 - null - [null, null, null, null, null] +24126 - null - [null, null, null, null, null] +24127 - Notices - [null, null, null, null, null] +24128 - null - [null, null, null, null, null] +24129 - null - [null, null, null, null, null] +24130 - null - [null, null, null, null, null] +24131 - null - [null, null, null, null, null] +24132 - null - [null, null, null, null, null] +24133 - null - [null, null, null, null, null] +24134 - Bow cabinet - [null, null, null, null, null] +24135 - Workbench - [null, null, null, null, null] +24136 - null - [null, null, null, null, null] +24137 - null - [null, null, null, null, null] +24138 - Bow case - [null, null, null, null, null] +24139 - Crate - [null, null, null, null, null] +24140 - Crate - [null, null, null, null, null] +24141 - Wood - [null, null, null, null, null] +24142 - Barrel - [null, null, null, null, null] +24143 - Poster - [null, null, null, null, null] +24144 - Poster - [null, null, null, null, null] +24145 - null - [null, null, null, null, null] +24146 - null - [null, null, null, null, null] +24147 - Mannequin - [null, null, null, null, null] +24148 - Bookcase - [null, null, null, null, null] +24149 - null - [null, null, null, null, null] +24150 - null - [null, null, null, null, null] +24151 - null - [null, null, null, null, null] +24152 - null - [null, null, null, null, null] +24153 - Cart - [null, null, null, null, null] +24154 - null - [null, null, null, null, null] +24155 - null - [null, null, null, null, null] +24156 - null - [null, null, null, null, null] +24157 - null - [null, null, null, null, null] +24158 - null - [null, null, null, null, null] +24159 - null - [null, null, null, null, null] +24160 - Waterpump - [null, null, null, null, null] +24161 - Fountain - [null, null, null, null, null] +24162 - Statue - [null, null, null, null, null] +24163 - Statue - [null, null, null, null, null] +24164 - Trough - [null, null, null, null, null] +24165 - Plough - [null, null, null, null, null] +24166 - Well - [null, null, null, null, null] +24167 - Spear wall - [null, null, null, null, null] +24168 - Dying tree - [Chop down, null, hidden, null, null] +24169 - Dying tree Stump - [null, null, null, null, null] +24170 - Washing Line - [null, null, null, null, null] +24171 - Washing Line - [null, null, null, null, null] +24172 - Washing Line - [null, null, null, null, null] +24173 - null - [null, null, null, null, null] +24174 - null - [null, null, null, null, null] +24175 - null - [null, null, null, null, null] +24176 - null - [null, null, null, null, null] +24177 - null - [null, null, null, null, null] +24178 - null - [null, null, null, null, null] +24179 - null - [null, null, null, null, null] +24180 - null - [null, null, null, null, null] +24181 - null - [null, null, null, null, null] +24182 - null - [null, null, null, null, null] +24183 - Painting - [null, null, null, null, null] +24184 - Painting - [null, null, null, null, null] +24185 - null - [null, null, null, null, null] +24186 - null - [null, null, null, null, null] +24187 - null - [null, null, null, null, null] +24188 - null - [null, null, null, null, null] +24189 - null - [null, null, null, null, null] +24190 - null - [null, null, null, null, null] +24191 - null - [null, null, null, null, null] +24192 - Combat Scroll - [Read, null, null, null, null] +24193 - null - [null, null, null, null, null] +24194 - Smoking vent - [null, null, null, null, null] +24195 - Smoking vent - [null, null, null, null, null] +24196 - null - [null, null, null, null, null] +24197 - null - [null, null, null, null, null] +24198 - null - [null, null, null, null, null] +24199 - null - [null, null, null, null, null] +24200 - Shield - [null, null, null, null, null] +24201 - null - [null, null, null, null, null] +24202 - null - [null, null, null, null, null] +24203 - Closed chest - [Open, null, null, null, null] +24204 - Open chest - [Search, Shut, null, null, null] +24205 - Crate - [Search, null, null, null, null] +24206 - Boxes - [Search, null, null, null, null] +24207 - Barrel - [null, null, null, null, null] +24208 - Crate - [Search, null, null, null, null] +24209 - Barrel - [null, null, null, null, null] +24210 - null - [Search, null, null, null, null] +24211 - Barrel - [null, null, null, null, null] +24212 - Barrel - [null, null, null, null, null] +24213 - null - [null, null, null, null, null] +24214 - Fountain - [null, null, null, null, null] +24215 - Suit of armour - [null, null, null, null, null] +24216 - Standard - [null, null, null, null, null] +24217 - null - [null, null, null, null, null] +24218 - null - [null, null, null, null, null] +24219 - null - [null, null, null, null, null] +24220 - null - [null, null, null, null, null] +24221 - null - [null, null, null, null, null] +24222 - null - [null, null, null, null, null] +24223 - null - [null, null, null, null, null] +24224 - null - [null, null, null, null, null] +24225 - null - [null, null, null, null, null] +24226 - null - [null, null, null, null, null] +24227 - null - [null, null, null, null, null] +24228 - null - [null, null, null, null, null] +24229 - null - [null, null, null, null, null] +24230 - null - [null, null, null, null, null] +24231 - null - [null, null, null, null, null] +24232 - Paper - [null, null, null, null, null] +24233 - Paper - [null, null, null, null, null] +24234 - Drain - [null, null, null, null, null] +24235 - Drain - [null, null, null, null, null] +24236 - null - [null, null, null, null, null] +24237 - null - [null, null, null, null, null] +24238 - null - [null, null, null, null, null] +24239 - null - [null, null, null, null, null] +24240 - null - [null, null, null, null, null] +24241 - null - [null, null, null, null, null] +24242 - null - [null, null, null, null, null] +24243 - null - [null, null, null, null, null] +24244 - null - [null, null, null, null, null] +24245 - null - [null, null, null, null, null] +24246 - null - [null, null, null, null, null] +24247 - null - [null, null, null, null, null] +24248 - null - [null, null, null, null, null] +24249 - null - [null, null, null, null, null] +24250 - null - [null, null, null, null, null] +24251 - null - [null, null, null, null, null] +24252 - Rotten food - [null, null, null, null, null] +24253 - Rotten food - [null, null, null, null, null] +24254 - Rotten food - [null, null, null, null, null] +24255 - Rat - [null, null, null, null, null] +24256 - Mushroom - [null, null, null, null, null] +24257 - Mushrooms - [null, null, null, null, null] +24258 - Mushroom - [null, null, null, null, null] +24259 - Cannon - [null, null, null, null, null] +24260 - Banner - [null, null, null, null, null] +24261 - null - [null, null, null, null, null] +24262 - null - [null, null, null, null, null] +24263 - Signpost - [Read, null, null, null, null] +24264 - Hole - [Climb-down, null, null, null, null] +24265 - Fountain - [null, null, null, null, null] +24266 - null - [null, null, null, null, null] +24267 - null - [null, null, null, null, null] +24268 - null - [null, null, null, null, null] +24269 - null - [null, null, null, null, null] +24270 - null - [null, null, null, null, null] +24271 - null - [null, null, null, null, null] +24272 - null - [null, null, null, null, null] +24273 - null - [null, null, null, null, null] +24274 - null - [null, null, null, null, null] +24275 - null - [null, null, null, null, null] +24276 - null - [null, null, null, null, null] +24277 - null - [null, null, null, null, null] +24278 - null - [null, null, null, null, null] +24279 - null - [null, null, null, null, null] +24280 - null - [null, null, null, null, null] +24281 - Bookcase - [Search, null, null, null, null] +24282 - Bookcase - [Search, null, null, null, null] +24283 - Range - [null, null, null, null, null] +24284 - Range - [null, null, null, null, null] +24285 - Fireplace - [null, null, null, null, null] +24286 - null - [null, null, null, null, null] +24287 - Chair - [null, null, null, null, null] +24288 - Bed - [null, null, null, null, null] +24289 - Bed - [null, null, null, null, null] +24290 - Bed - [null, null, null, null, null] +24291 - Bed - [null, null, null, null, null] +24292 - Chest - [null, null, null, null, null] +24293 - Wardrobe - [null, null, null, null, null] +24294 - Drawers - [Open, null, null, null, null] +24295 - Drawers - [Search, Close, null, null, null] +24296 - Dresser - [null, null, null, null, null] +24297 - Wardrobe - [null, null, null, null, null] +24298 - Wardrobe - [null, null, null, null, null] +24299 - Bed - [null, null, null, null, null] +24300 - Mossy rock - [Search, null, null, null, null] +24301 - Table - [null, null, null, null, null] +24302 - Table - [null, null, null, null, null] +24303 - Table - [null, null, null, null, null] +24304 - Chair - [null, null, null, null, null] +24305 - Teak table - [null, null, null, null, null] +24306 - Teak table - [null, null, null, null, null] +24307 - Table - [null, null, null, null, null] +24308 - Table - [null, null, null, null, null] +24309 - Table - [null, null, null, null, null] +24310 - Throne - [null, null, null, null, null] +24311 - Cabinet - [null, null, null, null, null] +24312 - Cabinet - [null, null, null, null, null] +24313 - Oven - [null, null, null, null, null] +24314 - Sink - [null, null, null, null, null] +24315 - Larder - [null, null, null, null, null] +24316 - Dresser - [null, null, null, null, null] +24317 - Mirror - [null, null, null, null, null] +24318 - Bath screen - [null, null, null, null, null] +24319 - Bathtub - [null, null, null, null, null] +24320 - Table - [null, null, null, null, null] +24321 - Bench - [null, null, null, null, null] +24322 - Drawers - [Search, Close, null, null, null] +24323 - Piano - [null, null, null, null, null] +24324 - Piano stool - [null, null, null, null, null] +24325 - null - [null, null, null, null, null] +24326 - null - [null, null, null, null, null] +24327 - null - [null, null, null, null, null] +24328 - Cooking pot - [null, null, null, null, null] +24329 - Fireplace - [null, null, null, null, null] +24330 - null - [null, null, null, null, null] +24331 - null - [null, null, null, null, null] +24332 - null - [null, null, null, null, null] +24333 - Chair - [null, null, null, null, null] +24334 - Chair - [null, null, null, null, null] +24335 - Table - [null, null, null, null, null] +24336 - Table - [null, null, null, null, null] +24337 - Chest - [null, null, null, null, null] +24338 - Bed - [null, null, null, null, null] +24339 - Bunk bed - [null, null, null, null, null] +24340 - Trunk - [null, null, null, null, null] +24341 - Locker - [null, null, null, null, null] +24342 - Saradomin star - [null, null, null, null, null] +24343 - Altar - [Pray-at, null, null, null, null] +24344 - Church pew - [null, null, null, null, null] +24345 - null - [null, null, null, null, null] +24346 - null - [null, null, null, null, null] +24347 - null - [null, null, null, null, null] +24348 - Candles - [null, null, null, null, null] +24349 - Staircase - [Climb-up, null, null, null, null] +24350 - Staircase - [Climb-up, null, null, null, null] +24351 - Staircase - [Climb, Climb-up, Climb-down, null, null] +24352 - Staircase - [Climb, Climb-up, Climb-down, null, null] +24353 - Staircase - [Climb-down, null, null, null, null] +24354 - Ladder - [Climb-up, null, null, null, null] +24355 - Ladder - [Climb-down, null, null, null, null] +24356 - Staircase - [Climb-up, null, null, null, null] +24357 - Staircase - [Climb-up, null, null, null, null] +24358 - Staircase - [Climb-up, null, null, null, null] +24359 - Staircase - [Climb-down, null, null, null, null] +24360 - Staircase - [Climb-down, null, null, null, null] +24361 - Ladder - [Climb-up, null, null, null, null] +24362 - Ladder - [Climb-down, null, null, null, null] +24363 - Ladder - [Climb-down, null, null, null, null] +24364 - Ladder - [Climb-up, null, null, null, null] +24365 - Staircase - [Climb-up, null, null, null, null] +24366 - Ladder - [Climb-up, null, null, null, null] +24367 - Staircase - [Climb-up, null, null, null, null] +24368 - Door - [null, null, null, null, null] +24369 - Gate - [Open, null, null, null, null] +24370 - Gate - [Open, null, null, null, null] +24371 - null - [null, null, null, null, null] +24372 - null - [null, null, null, null, null] +24373 - Gate - [Close, null, null, null, null] +24374 - Gate - [Close, null, null, null, null] +24375 - Door - [Close, null, null, null, null] +24376 - Door - [Open, null, null, null, null] +24377 - Door - [Close, null, null, null, null] +24378 - Door - [Open, null, null, null, null] +24379 - Door - [Close, null, null, null, null] +24380 - null - [null, null, null, null, null] +24381 - Door - [Open, null, null, null, null] +24382 - Door - [null, null, null, null, null] +24383 - Door - [Close, null, null, null, null] +24384 - Door - [Open, null, null, null, null] +24385 - null - [null, null, null, null, null] +24386 - null - [null, null, null, null, null] +24387 - null - [null, null, null, null, null] +24388 - null - [null, null, null, null, null] +24389 - Door - [Knock-at, null, null, null, null] +24390 - Map - [Look-at, Take, null, null, null] +24391 - Map - [Look-at, Take, null, null, null] +24392 - Map - [Look-at, Take, null, null, null] +24393 - null - [null, null, null, null, null] +24394 - null - [null, null, null, null, null] +24395 - null - [null, null, null, null, null] +24396 - null - [null, null, null, null, null] +24397 - null - [null, null, null, null, null] +24398 - null - [null, null, null, null, null] +24399 - null - [null, null, null, null, null] +24400 - null - [null, null, null, null, null] +24401 - null - [null, null, null, null, null] +24402 - null - [null, null, null, null, null] +24403 - null - [null, null, null, null, null] +24404 - null - [null, null, null, null, null] +24405 - null - [null, null, null, null, null] +24406 - null - [null, null, null, null, null] +24407 - null - [null, null, null, null, null] +24408 - null - [null, null, null, null, null] +24409 - null - [null, null, null, null, null] +24410 - null - [null, null, null, null, null] +24411 - null - [null, null, null, null, null] +24412 - null - [null, null, null, null, null] +24413 - null - [null, null, null, null, null] +24414 - null - [null, null, null, null, null] +24415 - null - [null, null, null, null, null] +24416 - null - [null, null, null, null, null] +24417 - null - [null, null, null, null, null] +24418 - null - [null, null, null, null, null] +24419 - null - [null, null, null, null, null] +24420 - null - [null, null, null, null, null] +24421 - null - [null, null, null, null, null] +24422 - null - [null, null, null, null, null] +24423 - null - [null, null, null, null, null] +24424 - null - [null, null, null, null, null] +24425 - null - [null, null, null, null, null] +24426 - null - [null, null, null, null, null] +24427 - Stairs - [Walk-up, null, null, null, null] +24428 - Stairs - [Walk-down, null, null, null, null] +24429 - null - [null, null, null, null, null] +24430 - null - [null, null, null, null, null] +24431 - null - [null, null, null, null, null] +24432 - null - [null, null, null, null, null] +24433 - null - [null, null, null, null, null] +24434 - null - [null, null, null, null, null] +24435 - null - [null, null, null, null, null] +24436 - null - [null, null, null, null, null] +24437 - null - [null, null, null, null, null] +24438 - null - [null, null, null, null, null] +24439 - null - [null, null, null, null, null] +24440 - null - [null, null, null, null, null] +24441 - null - [null, null, null, null, null] +24442 - null - [null, null, null, null, null] +24443 - null - [null, null, null, null, null] +24444 - null - [null, null, null, null, null] +24445 - null - [null, null, null, null, null] +24446 - null - [null, null, null, null, null] +24447 - null - [null, null, null, null, null] +24448 - null - [null, null, null, null, null] +24449 - null - [null, null, null, null, null] +24450 - null - [null, null, null, null, null] +24451 - null - [null, null, null, null, null] +24452 - Information booth - [Look-at, null, null, null, null] +24453 - null - [null, null, null, null, null] +24454 - null - [null, null, null, null, null] +24455 - Canal barge - [null, null, null, null, null] +24456 - Canal barge - [null, null, null, null, null] +24457 - Canal barge - [null, null, null, null, null] +24458 - Canal barge - [null, null, null, null, null] +24459 - Canal barge - [null, null, null, null, null] +24460 - Canal barge - [null, null, null, null, null] +24461 - Canal barge - [null, null, null, null, null] +24462 - Canal barge - [null, null, null, null, null] +24463 - Canal barge - [null, null, null, null, null] +24464 - Canal barge - [null, null, null, null, null] +24465 - Canal barge - [null, null, null, null, null] +24466 - Canal barge - [null, null, null, null, null] +24467 - Canal barge - [null, null, null, null, null] +24468 - Canal barge - [null, null, null, null, null] +24469 - Canal barge - [null, null, null, null, null] +24470 - Canal barge - [null, null, null, null, null] +24471 - Canal barge - [null, null, null, null, null] +24472 - Canal barge - [null, null, null, null, null] +24473 - Canal barge - [null, null, null, null, null] +24474 - Canal barge - [null, null, null, null, null] +24475 - Canal barge - [null, null, null, null, null] +24476 - Canal barge - [null, null, null, null, null] +24477 - Canal barge - [null, null, null, null, null] +24478 - Canal barge - [null, null, null, null, null] +24479 - Canal barge - [null, null, null, null, null] +24480 - Canal barge - [null, null, null, null, null] +24481 - Canal barge - [null, null, null, null, null] +24482 - Canal barge - [null, null, null, null, null] +24483 - Canal barge - [null, null, null, null, null] +24484 - Canal barge - [null, null, null, null, null] +24485 - Canal barge - [null, null, null, null, null] +24486 - Canal barge - [null, null, null, null, null] +24487 - Canal wall - [null, null, null, null, null] +24488 - Canal wall - [null, null, null, null, null] +24489 - null - [null, null, null, null, null] +24490 - null - [null, null, null, null, null] +24491 - null - [null, null, null, null, null] +24492 - null - [null, null, null, null, null] +24493 - null - [null, null, null, null, null] +24494 - null - [null, null, null, null, null] +24495 - null - [null, null, null, null, null] +24496 - null - [null, null, null, null, null] +24497 - null - [null, null, null, null, null] +24498 - null - [null, null, null, null, null] +24499 - null - [null, null, null, null, null] +24500 - Tar buckets - [null, null, null, null, null] +24501 - Short planks - [null, null, null, null, null] +24502 - Long planks - [null, null, null, null, null] +24503 - Canal barge - [null, null, null, null, null] +24504 - Canal barge - [null, null, null, null, null] +24505 - Canal barge - [null, null, null, null, null] +24506 - Canal barge - [null, null, null, null, null] +24507 - Canal barge - [null, null, null, null, null] +24508 - Canal barge - [null, null, null, null, null] +24509 - Canal barge - [null, null, null, null, null] +24510 - Canal barge - [null, null, null, null, null] +24511 - Canal barge - [null, null, null, null, null] +24512 - Canal barge - [null, null, null, null, null] +24513 - Canal barge - [null, null, null, null, null] +24514 - Canal barge - [null, null, null, null, null] +24515 - Canal barge - [null, null, null, null, null] +24516 - Canal barge - [null, null, null, null, null] +24517 - Canal barge - [null, null, null, null, null] +24518 - Canal barge - [null, null, null, null, null] +24519 - Canal barge - [null, null, null, null, null] +24520 - Canal barge - [null, null, null, null, null] +24521 - Canal barge - [null, null, null, null, null] +24522 - Canal barge - [null, null, null, null, null] +24523 - Canal barge - [null, null, null, null, null] +24524 - Canal barge - [null, null, null, null, null] +24525 - Canal barge - [null, null, null, null, null] +24526 - Canal barge - [null, null, null, null, null] +24527 - Canal barge - [null, null, null, null, null] +24528 - Canal barge - [null, null, null, null, null] +24529 - Canal barge - [null, null, null, null, null] +24530 - Canal barge - [null, null, null, null, null] +24531 - Canal wall - [null, null, null, null, null] +24532 - Canal wall - [null, null, null, null, null] +24533 - null - [null, null, null, null, null] +24534 - Storage crate - [null, null, null, null, null] +24535 - Tools - [Take, null, null, null, null] +24536 - Gate - [Open, null, null, null, null] +24537 - null - [null, null, null, null, null] +24538 - null - [null, null, null, null, null] +24539 - Display case - [Study, null, null, null, null] +24540 - Display case - [Study, null, null, null, null] +24541 - Display case - [Study, null, null, null, null] +24542 - Display case - [Study, null, null, null, null] +24543 - Display case - [Study, null, null, null, null] +24544 - Display case - [Study, null, null, null, null] +24545 - Display case - [Study, null, null, null, null] +24546 - Display case - [Study, null, null, null, null] +24547 - Display case - [Study, null, null, null, null] +24548 - Display case - [Study, null, null, null, null] +24549 - Display case - [Study, null, null, null, null] +24550 - Display case - [Study, null, null, null, null] +24551 - Display case - [Study, null, null, null, null] +24552 - null - [null, null, null, null, null] +24553 - null - [null, null, null, null, null] +24554 - null - [null, null, null, null, null] +24555 - Specimen table - [null, null, null, null, null] +24556 - Specimen table - [null, null, null, null, null] +24557 - Rocks - [null, null, null, null, null] +24558 - null - [null, null, null, null, null] +24559 - Dig Site specimen rocks - [Take, null, null, null, null] +24560 - Gate - [Open, null, null, null, null] +24561 - Gate - [Open, null, null, null, null] +24562 - Gap - [null, null, null, null, null] +24563 - Doorway - [Walk-through, null, null, null, null] +24564 - Gate - [Open, null, null, null, null] +24565 - Door - [Open, null, null, null, null] +24566 - Door - [null, null, null, null, null] +24567 - Door - [Open, null, null, null, null] +24568 - Door - [null, null, null, null, null] +24569 - Snake - [null, null, null, null, null] +24570 - null - [null, null, null, null, null] +24571 - Machine - [null, null, null, null, null] +24572 - Machine - [null, null, null, null, null] +24573 - Machine - [null, null, null, null, null] +24574 - Machine - [null, null, null, null, null] +24575 - Machine - [null, null, null, null, null] +24576 - Machine - [null, null, null, null, null] +24577 - Machine - [null, null, null, null, null] +24578 - Machine - [null, null, null, null, null] +24579 - Machine - [null, null, null, null, null] +24580 - Machine - [null, null, null, null, null] +24581 - Machine - [null, null, null, null, null] +24582 - Machine - [null, null, null, null, null] +24583 - Machine - [null, null, null, null, null] +24584 - Machine - [null, null, null, null, null] +24585 - Machine - [null, null, null, null, null] +24586 - Machine - [null, null, null, null, null] +24587 - Machine - [null, null, null, null, null] +24588 - Button - [null, null, null, null, null] +24589 - Button - [null, null, null, null, null] +24590 - Button - [Push, null, null, null, null] +24591 - Button - [Push, null, null, null, null] +24592 - Button - [Push, null, null, null, null] +24593 - Button - [Push, null, null, null, null] +24594 - Button - [Push, null, null, null, null] +24595 - Button - [Push, null, null, null, null] +24596 - Button - [Push, null, null, null, null] +24597 - Button - [Push, null, null, null, null] +24598 - Button - [Push, null, null, null, null] +24599 - Button - [Push, null, null, null, null] +24600 - Button - [Push, null, null, null, null] +24601 - Button - [Push, null, null, null, null] +24602 - Button - [Push, null, null, null, null] +24603 - Button - [Push, null, null, null, null] +24604 - null - [null, null, null, null, null] +24605 - Plaque - [Study, null, null, null, null] +24606 - Plaque - [Study, null, null, null, null] +24607 - Plaque - [Study, null, null, null, null] +24608 - Plaque - [Study, null, null, null, null] +24609 - Plaque - [Study, null, null, null, null] +24610 - Plaque - [Study, null, null, null, null] +24611 - Plaque - [Study, null, null, null, null] +24612 - Plaque - [Study, null, null, null, null] +24613 - Plaque - [Study, null, null, null, null] +24614 - Plaque - [Study, null, null, null, null] +24615 - Plaque - [Study, null, null, null, null] +24616 - Plaque - [Study, null, null, null, null] +24617 - Plaque - [Study, null, null, null, null] +24618 - Plaque - [Study, null, null, null, null] +24619 - Display case - [null, null, null, null, null] +24620 - Painting - [Study, null, null, null, null] +24621 - Display case - [Study, null, null, null, null] +24622 - Display case - [Study, null, null, null, null] +24623 - null - [null, null, null, null, null] +24624 - Display case - [Study, null, null, null, null] +24625 - Display case - [Study, null, null, null, null] +24626 - null - [null, null, null, null, null] +24627 - Display case - [Study, Open, null, null, null] +24628 - Display case - [Study, null, null, null, null] +24629 - Display case - [Study, null, null, null, null] +24630 - Display case - [Study, null, null, null, null] +24631 - Display case - [Study, null, null, null, null] +24632 - Display case - [Study, null, null, null, null] +24633 - null - [null, null, null, null, null] +24634 - Display case - [Study, null, null, null, null] +24635 - Display case - [Study, null, null, null, null] +24636 - null - [null, null, null, null, null] +24637 - Display case - [Study, null, null, null, null] +24638 - null - [null, null, null, null, null] +24639 - Display case - [Study, null, null, null, null] +24640 - Display case - [Study, null, null, null, null] +24641 - Display case - [Study, null, null, null, null] +24642 - null - [null, null, null, null, null] +24643 - Display case - [Study, null, null, null, null] +24644 - Display case - [Study, null, null, null, null] +24645 - Display case - [Study, null, null, null, null] +24646 - Display case - [Study, null, null, null, null] +24647 - Display case - [Study, null, null, null, null] +24648 - Display case - [Study, null, null, null, null] +24649 - Display case - [Study, null, null, null, null] +24650 - Display case - [Study, null, null, null, null] +24651 - Display case - [Study, null, null, null, null] +24652 - Display case - [Study, null, null, null, null] +24653 - null - [null, null, null, null, null] +24654 - Display case - [Study, null, null, null, null] +24655 - Display case - [Study, null, null, null, null] +24656 - Display case - [Study, null, null, null, null] +24657 - Display case - [Study, null, null, null, null] +24658 - Display case - [Study, null, null, null, null] +24659 - Display case - [Study, null, null, null, null] +24660 - Display case - [Study, null, null, null, null] +24661 - Display case - [Study, null, null, null, null] +24662 - null - [null, null, null, null, null] +24663 - Display case - [Study, null, null, null, null] +24664 - null - [null, null, null, null, null] +24665 - null - [null, null, null, null, null] +24666 - Candles - [null, null, null, null, null] +24667 - Table - [null, null, null, null, null] +24668 - Wardrobe - [Open, null, null, null, null] +24669 - Wardrobe - [null, Search, Close, null, null] +24670 - Wardrobe - [Open, null, null, null, null] +24671 - Wardrobe - [null, Search, Close, null, null] +24672 - Staircase - [Walk-up, null, null, null, null] +24673 - Staircase - [Walk-down, null, null, null, null] +24674 - Mirror - [null, null, null, null, null] +24675 - Shelf - [null, null, null, null, null] +24676 - Shelf - [null, null, null, null, null] +24677 - Charms - [null, null, null, null, null] +24678 - null - [null, null, null, null, null] +24679 - Bed - [null, null, null, null, null] +24680 - Dresser - [null, null, null, null, null] +24681 - Drawers - [Open, null, null, null, null] +24682 - Drawers - [null, Search, Close, null, null] +24683 - Chair - [null, null, null, null, null] +24684 - Table - [null, null, null, null, null] +24685 - Door - [Close, null, null, null, null] +24686 - Door - [Open, null, null, null, null] +24687 - Staircase - [Climb-up, null, null, null, null] +24688 - Broken experiment tube - [null, null, null, null, null] +24689 - Experiment tube - [null, null, null, null, null] +24690 - Box - [null, null, null, null, null] +24691 - Stacked Boxes - [null, null, null, null, null] +24692 - Boxes - [Search, null, null, null, null] +24693 - Rock - [null, null, null, null, null] +24694 - Rock - [null, null, null, null, null] +24695 - Rock - [null, null, null, null, null] +24696 - Rock - [null, null, null, null, null] +24697 - Rock - [null, null, null, null, null] +24698 - Rock - [null, null, null, null, null] +24699 - Rock - [null, null, null, null, null] +24700 - Rock - [null, null, null, null, null] +24701 - Rock - [null, null, null, null, null] +24702 - null - [null, null, null, null, null] +24703 - null - [null, null, null, null, null] +24704 - null - [null, null, null, null, null] +24705 - null - [null, null, null, null, null] +24706 - Skeleton - [null, null, null, null, null] +24707 - Skeleton - [null, null, null, null, null] +24708 - Skeleton - [null, null, null, null, null] +24709 - Barrel - [null, null, null, null, null] +24710 - Sack - [Search, null, null, null, null] +24711 - Smashed chair - [null, null, null, null, null] +24712 - Broken cart wheel - [null, null, null, null, null] +24713 - null - [null, null, null, null, null] +24714 - null - [null, null, null, null, null] +24715 - null - [null, null, null, null, null] +24716 - Mysterious statue - [null, null, null, null, null] +24717 - Ladder - [Climb-up, null, null, null, null] +24718 - Ladder - [Climb-down, null, null, null, null] +24719 - null - [null, null, null, null, null] +24720 - null - [null, null, null, null, null] +24721 - Piano - [Play, null, null, null, null] +24722 - Piano - [Play, null, Search, null, null] +24723 - Drain Pipe - [Talk-into, null, Climb, null, null] +24724 - Gramophone - [Wind-up, null, null, null, null] +24725 - Gramophone - [Turn-Off, null, null, null, null] +24726 - Gramophone - [Kick, null, null, null, null] +24727 - Gramophone - [null, null, null, null, null] +24728 - Music Stand - [Search, null, null, null, null] +24729 - Music Stand - [null, null, null, null, null] +24730 - Earth Mound - [null, null, null, null, null] +24731 - Bean Mound - [null, null, null, null, null] +24732 - Beanstalk - [null, null, null, null, null] +24733 - Beanstalk - [Climb, null, Chop, null, null] +24734 - Beanstalk - [null, null, null, null, null] +24735 - Beanstalk - [null, null, Chop, null, null] +24736 - Beanstalk - [null, null, null, null, null] +24737 - Beanstalk - [null, null, null, null, null] +24738 - Beanstump - [null, null, null, null, null] +24739 - null - [null, null, null, null, null] +24740 - null - [null, null, null, null, null] +24741 - null - [null, null, null, null, null] +24742 - null - [null, null, null, null, null] +24743 - null - [null, null, null, null, null] +24744 - null - [null, null, null, null, null] +24745 - null - [null, null, null, null, null] +24746 - null - [null, null, null, null, null] +24747 - null - [null, null, null, null, null] +24748 - null - [null, null, null, null, null] +24749 - Crumbling wall - [Climb-over, null, null, null, null] +24750 - null - [null, null, null, null, null] +24751 - null - [null, null, null, null, null] +24752 - null - [null, null, null, null, null] +24753 - null - [null, null, null, null, null] +24754 - null - [null, null, null, null, null] +24755 - null - [null, null, null, null, null] +24756 - null - [null, null, null, null, null] +24757 - null - [null, null, null, null, null] +24758 - null - [null, null, null, null, null] +24759 - Door - [Open, null, null, null, null] +24760 - null - [null, null, null, null, null] +24761 - null - [null, null, null, null, null] +24762 - null - [null, null, null, null, null] +24763 - null - [null, null, null, null, null] +24764 - null - [null, null, null, null, null] +24765 - Window - [null, null, null, null, null] +24766 - Window - [null, null, null, null, null] +24767 - Beard - [Climb up, null, null, null, null] +24768 - Window - [null, null, null, null, null] +24769 - Rupert - [null, null, null, null, null] +24770 - Rupert - [null, null, null, null, null] +24771 - Rupert - [Talk-to, null, Climb-down, null, null] +24772 - Rupert - [Talk-to, null, Climb-down, null, null] +24773 - null - [null, null, null, null, null] +24774 - null - [null, null, null, null, null] +24775 - null - [null, null, null, null, null] +24776 - null - [null, null, null, null, null] +24777 - null - [null, null, null, null, null] +24778 - Window - [null, null, null, null, null] +24779 - Beard - [null, null, null, null, null] +24780 - Pendant - [Take, null, null, null, null] +24781 - Rock - [null, null, null, null, null] +24782 - null - [null, null, null, null, null] +24783 - null - [null, null, null, null, null] +24784 - null - [null, null, null, null, null] +24785 - null - [null, null, null, null, null] +24786 - null - [null, null, null, null, null] +24787 - null - [null, null, null, null, null] +24788 - null - [null, null, null, null, null] +24789 - null - [null, null, null, null, null] +24790 - null - [null, null, null, null, null] +24791 - null - [null, null, null, null, null] +24792 - null - [null, null, null, null, null] +24793 - null - [null, null, null, null, null] +24794 - null - [null, null, null, null, null] +24795 - Nails - [Climb-up, null, null, null, null] +24796 - Nails - [Climb-down, null, null, null, null] +24797 - null - [null, null, null, null, null] +24798 - null - [null, null, null, null, null] +24799 - Mouse hole - [Enter, null, null, null, null] +24800 - null - [null, null, null, null, null] +24801 - null - [null, null, null, null, null] +24802 - Grate - [Enter, null, null, null, null] +24803 - Lock - [null, null, null, null, null] +24804 - Nails - [null, null, null, null, null] +24805 - Witch's charm - [null, null, null, null, null] +24806 - null - [null, null, null, null, null] +24807 - null - [null, null, null, null, null] +24808 - Drain - [null, null, null, null, null] +24809 - null - [null, null, null, null, null] +24810 - null - [null, null, null, null, null] +24811 - null - [null, null, null, null, null] +24812 - null - [null, null, null, null, null] +24813 - null - [null, null, null, null, null] +24814 - Chair - [null, null, null, null, null] +24815 - Door - [Close, null, null, null, null] +24816 - Door - [Open, null, null, null, null] +24817 - null - [null, null, null, null, null] +24818 - null - [null, null, null, null, null] +24819 - Beanstalk - [Climb-down, null, null, null, null] +24820 - null - [null, null, null, null, null] +24821 - null - [null, null, null, null, null] +24822 - null - [null, null, null, null, null] +24823 - null - [null, null, null, null, null] +24824 - null - [null, null, null, null, null] +24825 - null - [null, null, null, null, null] +24826 - null - [null, null, null, null, null] +24827 - null - [null, null, null, null, null] +24828 - null - [null, null, null, null, null] +24829 - null - [null, null, null, null, null] +24830 - null - [null, null, null, null, null] +24831 - null - [null, null, null, null, null] +24832 - null - [null, null, null, null, null] +24833 - null - [null, null, null, null, null] +24834 - null - [null, null, null, null, null] +24835 - null - [null, null, null, null, null] +24836 - null - [null, null, null, null, null] +24837 - null - [null, null, null, null, null] +24838 - null - [null, null, null, null, null] +24839 - Grimgnash - [Talk-to, null, null, null, null] +24840 - null - [Talk-to, null, null, null, null] +24841 - Feathers - [Take, null, null, null, null] +24842 - Manhole - [Enter, null, null, null, null] +24843 - Floor - [null, null, null, null, null] +24844 - Floor - [null, null, null, null, null] +24845 - Floor - [null, null, null, null, null] +24846 - Floor - [null, null, null, null, null] +24847 - Floor - [null, null, null, null, null] +24848 - null - [null, null, null, null, null] +24849 - null - [null, null, null, null, null] +24850 - null - [null, null, null, null, null] +24851 - null - [null, null, null, null, null] +24852 - null - [null, null, null, null, null] +24853 - null - [null, null, null, null, null] +24854 - null - [null, null, null, null, null] +24855 - null - [null, null, null, null, null] +24856 - null - [null, null, null, null, null] +24857 - null - [null, null, null, null, null] +24858 - null - [null, null, null, null, null] +24859 - null - [null, null, null, null, null] +24860 - null - [null, null, null, null, null] +24861 - null - [null, null, null, null, null] +24862 - null - [null, null, null, null, null] +24863 - null - [null, null, null, null, null] +24864 - null - [null, null, null, null, null] +24865 - null - [null, null, null, null, null] +24866 - null - [null, null, null, null, null] +24867 - null - [null, null, null, null, null] +24868 - null - [null, null, null, null, null] +24869 - null - [null, null, null, null, null] +24870 - null - [null, null, null, null, null] +24871 - null - [null, null, null, null, null] +24872 - null - [null, null, null, null, null] +24873 - null - [null, null, null, null, null] +24874 - Cheese - [Take, null, null, null, null] +24875 - Coins - [Take, null, null, null, null] +24876 - Bones - [Take, null, null, null, null] +24877 - Witch Glyph - [null, null, null, null, null] +24878 - Witch Glyph - [null, null, null, null, null] +24879 - null - [null, null, null, null, null] +24880 - Crumbling wall - [Climb-over, null, null, null, null] +24881 - null - [null, null, null, null, null] +24882 - null - [hidden, null, null, null, null] +24883 - null - [null, null, null, null, null] +24884 - null - [null, null, null, null, null] +24885 - null - [null, null, null, null, null] +24886 - null - [null, null, null, null, null] +24887 - Cage - [null, null, null, null, null] +24888 - Scuttle - [null, null, null, null, null] +24889 - Barstool - [null, null, null, null, null] +24890 - Barstool - [null, null, null, null, null] +24891 - Bar - [null, null, null, null, null] +24892 - Bar - [null, null, null, null, null] +24893 - Bar - [null, null, null, null, null] +24894 - Bar - [null, null, null, null, null] +24895 - Bar - [null, null, null, null, null] +24896 - Bar - [null, null, null, null, null] +24897 - Bar - [null, null, null, null, null] +24898 - Bar - [null, null, null, null, null] +24899 - Bar - [null, null, null, null, null] +24900 - Table - [null, null, null, null, null] +24901 - null - [null, null, null, null, null] +24902 - null - [null, null, null, null, null] +24903 - null - [null, null, null, null, null] +24904 - null - [null, null, null, null, null] +24905 - null - [null, null, null, null, null] +24906 - null - [null, null, null, null, null] +24907 - Old Bookshelf - [Search, null, null, null, null] +24908 - Old Bookshelf - [Search, null, null, null, null] +24909 - Old Bookshelf - [Search, null, null, null, null] +24910 - Old Bookshelf - [Search, null, null, null, null] +24911 - Crate - [Search, null, null, null, null] +24912 - null - [null, null, null, null, null] +24913 - Bed - [null, null, null, null, null] +24914 - Bank booth - [Use, Use-quickly, Collect, null, null] +24915 - null - [null, null, null, null, null] +24916 - Shelves - [null, null, null, null, null] +24917 - Stepladder - [null, null, null, null, null] +24918 - Ladder - [Climb-up, null, null, null, null] +24919 - Ladder - [Climb-down, null, null, null, null] +24920 - Mangle - [null, null, null, null, null] +24921 - Mangle - [null, null, null, null, null] +24922 - Table - [null, null, null, null, null] +24923 - null - [null, null, null, null, null] +24924 - null - [null, null, null, null, null] +24925 - Staircase - [Climb-up, null, null, null, null] +24926 - Staircase - [Climb-down, null, null, null, null] +24927 - Table - [null, null, null, null, null] +24928 - null - [null, null, null, null, null] +24929 - Tanning line - [null, null, null, null, null] +24930 - Door - [Close, null, null, null, null] +24931 - Door - [Open, null, null, null, null] +24932 - Door - [Close, null, null, null, null] +24933 - Door - [Open, null, null, null, null] +24934 - Door - [null, null, null, null, null] +24935 - Door - [Close, null, null, null, null] +24936 - Door - [Open, null, null, null, null] +24937 - null - [null, null, null, null, null] +24938 - null - [null, null, null, null, null] +24939 - null - [null, null, null, null, null] +24940 - null - [null, null, null, null, null] +24941 - null - [null, null, null, null, null] +24942 - null - [null, null, null, null, null] +24943 - null - [null, null, null, null, null] +24944 - null - [null, null, null, null, null] +24945 - null - [null, null, null, null, null] +24946 - null - [null, null, null, null, null] +24947 - null - [null, null, null, null, null] +24948 - null - [null, null, null, null, null] +24949 - null - [null, null, null, null, null] +24950 - null - [null, null, null, null, null] +24951 - null - [null, null, null, null, null] +24952 - null - [null, null, null, null, null] +24953 - null - [null, null, null, null, null] +24954 - null - [null, null, null, null, null] +24955 - null - [null, null, null, null, null] +24956 - null - [null, null, null, null, null] +24957 - null - [null, null, null, null, null] +24958 - null - [null, null, null, null, null] +24959 - null - [null, null, null, null, null] +24960 - null - [null, null, null, null, null] +24961 - null - [null, null, null, null, null] +24962 - null - [null, null, null, null, null] +24963 - null - [null, null, null, null, null] +24964 - null - [null, null, null, null, null] +24965 - null - [null, null, null, null, null] +24966 - null - [null, null, null, null, null] +24967 - null - [null, null, null, null, null] +24968 - null - [null, null, null, null, null] +24969 - null - [null, null, null, null, null] +24970 - null - [null, null, null, null, null] +24971 - null - [null, null, null, null, null] +24972 - null - [null, null, null, null, null] +24973 - null - [null, null, null, null, null] +24974 - null - [null, null, null, null, null] +24975 - null - [null, null, null, null, null] +24976 - Clothes equipment - [null, null, null, null, null] +24977 - null - [null, null, null, null, null] +24978 - null - [null, null, null, null, null] +24979 - null - [null, null, null, null, null] +24980 - null - [null, null, null, null, null] +24981 - null - [null, null, null, null, null] +24982 - null - [null, null, null, null, null] +24983 - null - [null, null, null, null, null] +24984 - Crop circle - [null, null, null, null, null] +24985 - Crop circle - [null, null, null, null, null] +24986 - Crop circle - [null, null, null, null, null] +24987 - Crop circle - [null, null, null, null, null] +24988 - Centre of crop circle - [Enter, null, null, null, null] +24989 - Magic wheat - [null, null, null, null, null] +24990 - Magic wheat - [null, null, null, null, null] +24991 - Centre of crop circle - [Enter, null, null, null, null] +24992 - null - [null, null, null, null, null] +24993 - null - [null, null, null, null, null] +24994 - null - [null, null, null, null, null] +24995 - null - [null, null, null, null, null] +24996 - null - [null, null, null, null, null] +24997 - null - [null, null, null, null, null] +24998 - null - [null, null, null, null, null] +24999 - null - [null, null, null, null, null] +25000 - null - [null, null, null, null, null] +25001 - null - [null, null, null, null, null] +25002 - null - [null, null, null, null, null] +25003 - null - [null, null, null, null, null] +25004 - null - [null, null, null, null, null] +25005 - null - [null, null, null, null, null] +25006 - null - [null, null, null, null, null] +25007 - null - [null, null, null, null, null] +25008 - null - [null, null, null, null, null] +25009 - null - [null, null, null, null, null] +25010 - null - [null, null, null, null, null] +25011 - null - [null, null, null, null, null] +25012 - null - [null, null, null, null, null] +25013 - null - [null, null, null, null, null] +25014 - Portal - [Leave, null, null, null, null] +25015 - null - [null, null, null, null, null] +25016 - Magical wheat - [null, null, null, null, Push-through] +25017 - Magical wheat - [null, null, null, null, null] +25018 - Magical wheat - [null, null, null, null, null] +25019 - Magical wheat - [null, null, null, null, Push-through] +25020 - Magical wheat - [null, null, null, null, Push-through] +25021 - Magical wheat - [null, null, null, null, Push-through] +25022 - Growing wheat - [null, null, null, null, null] +25023 - Wilting wheat - [null, null, null, null, null] +25024 - Magical wheat - [null, null, null, null, null] +25025 - Magical wheat - [null, null, null, null, null] +25026 - Magical wheat - [null, null, null, null, null] +25027 - Magical wheat - [null, null, null, null, null] +25028 - Magical wheat - [null, null, null, null, null] +25029 - Magical wheat - [null, null, null, null, Push-through] +25030 - null - [null, null, null, null, null] +25031 - null - [null, null, null, null, null] +25032 - null - [null, null, null, null, null] +25033 - Dragon's head - [null, null, null, null, null] +25034 - Drawers - [Open, null, null, null, null] +25035 - Drawers - [Search, Close, null, null, null] +25036 - null - [Repair, null, null, null, null] +25037 - Hull - [null, null, null, null, null] +25038 - Ladder - [Climb-up, null, null, null, null] +25039 - Wall - [null, null, null, null, null] +25040 - Wardrobe - [Open, null, null, null, null] +25041 - Wardrobe - [null, Search, Close, null, null] +25042 - Wardrobe - [null, Search, Close, null, null] +25043 - Wardrobe - [null, Search, Close, null, null] +25044 - Wardrobe - [null, Search, Close, null, null] +25045 - Ladder - [Climb-down, null, null, null, null] +25046 - Bookshelves - [Search, null, null, null, null] +25047 - Table - [null, null, null, null, null] +25048 - Chair - [null, null, null, null, null] +25049 - null - [null, null, null, null, null] +25050 - null - [null, null, null, null, null] +25051 - null - [null, null, null, null, null] +25052 - null - [null, null, null, null, null] +25053 - null - [null, null, null, null, null] +25054 - null - [null, null, null, null, null] +25055 - null - [null, null, null, null, null] +25056 - null - [null, null, null, null, null] +25057 - null - [null, null, null, null, null] +25058 - null - [null, null, null, null, null] +25059 - null - [null, null, null, null, null] +25060 - null - [null, null, null, null, null] +25061 - null - [null, null, null, null, null] +25062 - null - [null, null, null, null, null] +25063 - null - [null, null, null, null, null] +25064 - null - [null, null, null, null, null] +25065 - null - [null, null, null, null, null] +25066 - null - [null, null, null, null, null] +25067 - null - [null, null, null, null, null] +25068 - null - [null, null, null, null, null] +25069 - null - [null, null, null, null, null] +25070 - null - [null, null, null, null, null] +25071 - null - [null, null, null, null, null] +25072 - null - [null, null, null, null, null] +25073 - null - [null, null, null, null, null] +25074 - null - [null, null, null, null, null] +25075 - null - [null, null, null, null, null] +25076 - null - [null, null, null, null, null] +25077 - null - [null, null, null, null, null] +25078 - null - [null, null, null, null, null] +25079 - null - [null, null, null, null, null] +25080 - Column - [null, null, null, null, null] +25081 - Column - [null, null, null, null, null] +25082 - Column - [null, null, null, null, null] +25083 - Stalactite - [null, null, null, null, null] +25084 - Stalagmites - [null, null, null, null, null] +25085 - Stalagmites - [null, null, null, null, null] +25086 - null - [null, null, null, null, null] +25087 - Skeleton - [null, null, null, null, null] +25088 - Skeleton - [null, null, null, null, null] +25089 - Skeleton - [null, null, null, null, null] +25090 - Skeleton - [null, null, null, null, null] +25091 - Shield - [null, null, null, null, null] +25092 - null - [null, null, null, null, null] +25093 - null - [null, null, null, null, null] +25094 - null - [null, null, null, null, null] +25095 - null - [null, null, null, null, null] +25096 - null - [null, null, null, null, null] +25097 - null - [null, null, null, null, null] +25098 - null - [null, null, null, null, null] +25099 - null - [null, null, null, null, null] +25100 - null - [null, null, null, null, null] +25101 - null - [null, null, null, null, null] +25102 - null - [null, null, null, null, null] +25103 - null - [null, null, null, null, null] +25104 - null - [null, null, null, null, null] +25105 - null - [null, null, null, null, null] +25106 - null - [null, null, null, null, null] +25107 - null - [null, null, null, null, null] +25108 - null - [null, null, null, null, null] +25109 - null - [null, null, null, null, null] +25110 - null - [null, null, null, null, null] +25111 - null - [null, null, null, null, null] +25112 - null - [null, null, null, null, null] +25113 - null - [null, null, null, null, null] +25114 - null - [null, null, null, null, null] +25115 - Magic door - [Open, null, null, null, null] +25116 - Magic door - [null, null, null, null, null] +25117 - Magic door - [null, null, null, null, null] +25118 - Magic door - [Open, null, null, null, null] +25119 - null - [null, null, null, null, null] +25120 - null - [null, null, null, null, null] +25121 - null - [null, null, null, null, null] +25122 - Candle stand - [null, null, null, null, null] +25123 - Candle stand - [null, null, null, null, null] +25124 - null - [null, null, null, null, null] +25125 - null - [null, null, null, null, null] +25126 - null - [null, null, null, null, null] +25127 - null - [null, null, null, null, null] +25128 - null - [null, null, null, null, null] +25129 - Vines - [null, null, null, null, null] +25130 - Vines - [null, null, null, null, null] +25131 - Vines - [null, null, null, null, null] +25132 - Vines - [null, null, null, null, null] +25133 - null - [null, null, null, null, null] +25134 - null - [null, null, null, null, null] +25135 - null - [null, null, null, null, null] +25136 - Vines - [null, null, null, null, null] +25137 - Plant - [null, null, null, null, null] +25138 - Fungus - [null, null, null, null, null] +25139 - Fungus - [null, null, null, null, null] +25140 - null - [null, null, null, null, null] +25141 - null - [null, null, null, null, null] +25142 - null - [null, null, null, null, null] +25143 - null - [null, null, null, null, null] +25144 - null - [null, null, null, null, null] +25145 - null - [null, null, null, null, null] +25146 - null - [null, null, null, null, null] +25147 - null - [null, null, null, null, null] +25148 - Wall - [null, null, null, null, null] +25149 - Wall - [null, null, null, null, null] +25150 - Wall - [null, null, null, null, null] +25151 - Wall - [null, null, null, null, null] +25152 - Pillar - [null, null, null, null, null] +25153 - Pillar - [null, null, null, null, null] +25154 - Hole - [Enter, null, null, null, null] +25155 - Fire - [null, null, null, null, null] +25156 - Fire - [null, null, null, null, null] +25157 - Jenkins - [null, null, null, null, null] +25158 - Rock - [null, null, null, null, null] +25159 - Rock - [null, null, null, null, null] +25160 - Rock - [null, null, null, null, null] +25161 - Wall - [Climb-over, null, null, null, null] +25162 - null - [null, null, null, null, null] +25163 - null - [null, null, null, null, null] +25164 - null - [null, null, null, null, null] +25165 - null - [null, null, null, null, null] +25166 - null - [null, null, null, null, null] +25167 - null - [null, null, null, null, null] +25168 - null - [null, null, null, null, null] +25169 - Tree - [null, null, null, null, null] +25170 - White tree - [null, null, null, null, null] +25171 - Tree - [null, null, null, null, null] +25172 - Tree - [null, null, null, null, null] +25173 - null - [null, null, null, null, null] +25174 - Tree - [null, null, null, null, null] +25175 - Fern - [null, null, null, null, null] +25176 - Fern - [null, null, null, null, null] +25177 - Fern - [null, null, null, null, null] +25178 - Fern - [null, null, null, null, null] +25179 - Flowering fern - [null, null, null, null, null] +25180 - Flowering fern - [null, null, null, null, null] +25181 - Dead calquat - [null, null, null, null, null] +25182 - Diseased calquat - [null, null, null, null, null] +25183 - Tree - [null, null, null, null, null] +25184 - Tree - [null, null, null, null, null] +25185 - Tree - [null, null, null, null, null] +25186 - Tree stump - [null, null, null, null, null] +25187 - A burnt tree - [null, null, null, null, null] +25188 - A burnt tree - [null, null, null, null, null] +25189 - Tree - [null, null, null, null, null] +25190 - A tropical tree - [null, null, null, null, null] +25191 - A tropical tree - [null, null, null, null, null] +25192 - Weeds - [null, null, null, null, null] +25193 - null - [null, null, null, null, null] +25194 - Dragon statue - [null, null, null, null, null] +25195 - null - [null, null, null, null, null] +25196 - null - [null, null, null, null, null] +25197 - null - [null, null, null, null, null] +25198 - null - [null, null, null, null, null] +25199 - Circle - [null, null, null, null, null] +25200 - Beacon - [null, null, null, null, null] +25201 - Flames - [null, null, null, null, null] +25202 - Dragon corpse - [null, null, null, null, null] +25203 - Dragon corpse - [null, null, null, null, null] +25204 - Tent - [null, null, null, null, null] +25205 - Flag - [null, null, null, null, null] +25206 - Suit of armour - [null, null, null, null, null] +25207 - Hoisted sail - [null, null, null, null, null] +25208 - Hoisted sail - [null, null, null, null, null] +25209 - null - [null, null, null, null, null] +25210 - Magic door - [null, null, null, null, null] +25211 - Magic door - [null, null, null, null, null] +25212 - null - [null, null, null, null, null] +25213 - Climbing rope - [Climb, null, null, null, null] +25214 - Trapdoor - [Open, null, null, null, null] +25215 - null - [null, null, null, null, null] +25216 - Aged log - [Ride, null, null, null, null] +25217 - null - [null, null, null, null, null] +25218 - null - [null, null, null, null, null] +25219 - null - [null, null, null, null, null] +25220 - null - [null, null, null, null, null] +25221 - null - [null, null, null, null, null] +25222 - null - [null, null, null, null, null] +25223 - null - [null, null, null, null, null] +25224 - null - [null, null, null, null, null] +25225 - null - [null, null, null, null, null] +25226 - null - [null, null, null, null, null] +25227 - null - [null, null, null, null, null] +25228 - null - [null, null, null, null, null] +25229 - null - [null, null, null, null, null] +25230 - null - [null, null, null, null, null] +25231 - null - [null, null, null, null, null] +25232 - null - [null, null, null, null, null] +25233 - null - [null, null, null, null, null] +25234 - null - [null, null, null, null, null] +25235 - null - [null, null, null, null, null] +25236 - null - [null, null, null, null, null] +25237 - null - [null, null, null, null, null] +25238 - null - [null, null, null, null, null] +25239 - null - [null, null, null, null, null] +25240 - null - [null, null, null, null, null] +25241 - null - [null, null, null, null, null] +25242 - null - [null, null, null, null, null] +25243 - null - [null, null, null, null, null] +25244 - null - [null, null, null, null, null] +25245 - null - [null, null, null, null, null] +25246 - null - [null, null, null, null, null] +25247 - null - [null, null, null, null, null] +25248 - null - [null, null, null, null, null] +25249 - null - [null, null, null, null, null] +25250 - null - [null, null, null, null, null] +25251 - null - [null, null, null, null, null] +25252 - Door - [null, null, null, null, null] +25253 - null - [null, null, null, null, null] +25254 - null - [null, null, null, null, null] +25255 - null - [null, null, null, null, null] +25256 - null - [null, null, null, null, null] +25257 - null - [null, null, null, null, null] +25258 - null - [null, null, null, null, null] +25259 - null - [null, null, null, null, null] +25260 - null - [null, null, null, null, null] +25261 - null - [null, null, null, null, null] +25262 - null - [null, null, null, null, null] +25263 - funeral pyre - [null, null, null, null, null] +25264 - funeral pyre - [null, null, null, null, null] +25265 - funeral pyre - [null, null, null, null, null] +25266 - funeral pyre - [null, null, null, null, null] +25267 - funeral pyre - [null, null, null, null, null] +25268 - Barbarian bed - [Search, null, null, null, null] +25269 - Barbarian table - [null, null, null, null, null] +25270 - Barbarian chair - [null, null, null, null, null] +25271 - null - [null, null, null, null, null] +25272 - null - [null, null, null, null, null] +25273 - null - [null, null, null, null, null] +25274 - Whirlpool - [Dive in, null, null, null, null] +25275 - Whirlpool - [Dive in, null, null, null, null] +25276 - Mighty torrent - [null, null, null, null, null] +25277 - Mighty torrent - [null, null, null, null, null] +25278 - Mighty torrent - [null, null, null, null, null] +25279 - Mighty torrent - [null, null, null, null, null] +25280 - null - [null, null, null, null, null] +25281 - null - [null, null, null, null, null] +25282 - null - [null, null, null, null, null] +25283 - null - [null, null, null, null, null] +25284 - null - [null, null, null, null, null] +25285 - null - [null, null, null, null, null] +25286 - Pyre site - [Construct, null, null, null, null] +25287 - Boat station - [null, null, null, null, null] +25288 - Carved log - [null, null, null, null, null] +25289 - Carved log - [null, null, null, null, null] +25290 - Pyre boat - [null, null, null, null, null] +25291 - Pyre boat - [null, null, null, null, null] +25292 - Pyre boat - [null, null, null, null, null] +25293 - Pyre boat - [null, null, null, null, null] +25294 - Pyre boat - [null, null, null, null, null] +25295 - Pyre boat - [null, null, null, null, null] +25296 - null - [null, null, null, null, null] +25297 - null - [null, null, null, null, null] +25298 - null - [null, null, null, null, null] +25299 - null - [null, null, null, null, null] +25300 - null - [null, null, null, null, null] +25301 - null - [null, null, null, null, null] +25302 - null - [null, null, null, null, null] +25303 - null - [null, null, null, null, null] +25304 - null - [null, null, null, null, null] +25305 - null - [null, null, null, null, null] +25306 - null - [null, null, null, null, null] +25307 - null - [null, null, null, null, null] +25308 - null - [null, null, null, null, null] +25309 - null - [null, null, null, null, null] +25310 - null - [null, null, null, null, null] +25311 - null - [null, null, null, null, null] +25312 - null - [null, null, null, null, null] +25313 - null - [null, null, null, null, null] +25314 - null - [null, null, null, null, null] +25315 - null - [null, null, null, null, null] +25316 - null - [null, null, null, null, null] +25317 - null - [null, null, null, null, null] +25318 - null - [null, null, null, null, null] +25319 - null - [null, null, null, null, null] +25320 - null - [null, null, null, null, null] +25321 - null - [null, null, null, null, null] +25322 - null - [null, null, null, null, null] +25323 - null - [null, null, null, null, null] +25324 - null - [null, null, null, null, null] +25325 - null - [null, null, null, null, null] +25326 - null - [null, null, null, null, null] +25327 - null - [null, null, null, null, null] +25328 - null - [null, null, null, null, null] +25329 - null - [null, null, null, null, null] +25330 - null - [null, null, null, null, null] +25331 - null - [null, null, null, null, null] +25332 - null - [null, null, null, null, null] +25333 - null - [null, null, null, null, null] +25334 - null - [null, null, null, null, null] +25335 - null - [null, null, null, null, null] +25336 - Stairs - [Climb-up, null, null, null, null] +25337 - Stairs - [Climb-up, null, null, null, null] +25338 - Stairs - [Climb-down, null, null, null, null] +25339 - Stairs - [Climb-up, null, null, null, null] +25340 - Stairs - [Climb-down, null, null, null, null] +25341 - Mithril door - [Open, null, null, null, null] +25342 - null - [null, null, null, null, null] +25343 - null - [null, null, null, null, null] +25344 - null - [null, null, null, null, null] +25345 - null - [null, null, null, null, null] +25346 - null - [null, null, null, null, null] +25347 - null - [null, null, null, null, null] +25348 - null - [null, null, null, null, null] +25349 - Barbarian anvil - [null, null, null, null, null] +25350 - null - [null, null, null, null, null] +25351 - null - [null, null, null, null, null] +25352 - null - [null, null, null, null, null] +25353 - null - [null, null, null, null, null] +25354 - null - [null, null, null, null, null] +25355 - null - [null, null, null, null, null] +25356 - null - [null, null, null, null, null] +25357 - null - [null, null, null, null, null] +25358 - null - [null, null, null, null, null] +25359 - null - [null, null, null, null, null] +25360 - null - [null, null, null, null, null] +25361 - null - [null, null, null, null, null] +25362 - Skeleton - [Rummage, null, null, null, null] +25363 - null - [null, null, null, null, null] +25364 - null - [null, null, null, null, null] +25365 - null - [null, null, null, null, null] +25366 - null - [null, null, null, null, null] +25367 - null - [null, null, null, null, null] +25368 - Rocks - [Mine, Prospect, hidden, null, null] +25369 - Rocks - [Mine, Prospect, hidden, null, null] +25370 - Rocks - [Mine, Prospect, hidden, null, null] +25371 - Rocks - [Mine, Prospect, hidden, null, null] +25372 - Rocks - [Mine, Prospect, hidden, null, null] +25373 - Rocks - [Mine, Prospect, hidden, null, null] +25374 - campfire - [null, null, null, null, null] +25375 - null - [null, null, null, null, null] +25376 - Wardrobe - [null, null, null, null, null] +25377 - Drawers - [null, null, null, null, null] +25378 - Drawers - [null, null, null, null, null] +25379 - null - [null, null, null, null, null] +25380 - null - [null, null, null, null, null] +25381 - null - [null, null, null, null, null] +25382 - null - [null, null, null, null, null] +25383 - null - [null, null, null, null, null] +25384 - null - [null, null, null, null, null] +25385 - Chest - [Open, null, null, null, null] +25386 - Chest - [Search, Close, null, null, null] +25387 - Chest - [Open, null, null, null, null] +25388 - Chest - [Search, Close, null, null, null] +25389 - Chest - [Open, null, null, null, null] +25390 - Chest - [Search, Close, null, null, null] +25391 - Chest - [Open, null, null, null, null] +25392 - Chest - [Search, Close, null, null, null] +25393 - Telescope - [null, null, null, null, null] +25394 - null - [null, null, null, null, null] +25395 - null - [null, null, null, null, null] +25396 - null - [null, null, null, null, null] +25397 - Signpost - [Read, null, null, null, null] +25398 - null - [null, null, null, null, null] +25399 - null - [null, null, null, null, null] +25400 - null - [null, null, null, null, null] +25401 - Orrery - [View, null, null, null, null] +25402 - Bookcase - [null, null, null, null, null] +25403 - Bookcase - [null, null, null, null, null] +25404 - Bookcase - [null, null, null, null, null] +25405 - Bookcase - [null, null, null, null, null] +25406 - Bookcase - [null, null, null, null, null] +25407 - Old bookshelf - [null, null, null, null, null] +25408 - Old bookshelf - [null, null, null, null, null] +25409 - null - [null, null, null, null, null] +25410 - null - [null, null, null, null, null] +25411 - Professor's table - [null, null, null, null, null] +25412 - null - [null, null, null, null, null] +25413 - null - [null, null, null, null, null] +25414 - null - [null, null, null, null, null] +25415 - Stalagmites - [null, null, null, null, null] +25416 - null - [null, null, null, null, null] +25417 - Door - [Close, null, null, null, null] +25418 - Door - [Open, null, null, null, null] +25419 - Bluebells - [null, null, null, null, null] +25420 - Sunflower - [null, null, null, null, null] +25421 - Sunflowers - [null, null, null, null, null] +25422 - Students' art - [null, null, null, null, null] +25423 - Work board - [null, null, null, null, null] +25424 - Work board - [null, null, null, null, null] +25425 - Coat rack - [null, null, null, null, null] +25426 - Rocking unicorn - [null, null, null, null, null] +25427 - Blackboard - [null, null, null, null, null] +25428 - Empty desk - [null, null, null, null, null] +25429 - Stairs - [Climb up, null, null, null, null] +25430 - null - [null, null, null, null, null] +25431 - Stairs - [Climb-up, null, null, null, null] +25432 - Stairs - [Climb-down, null, null, null, null] +25433 - null - [null, null, null, null, null] +25434 - Stairs - [Climb-down, null, null, null, null] +25435 - null - [null, null, null, null, null] +25436 - null - [null, null, null, null, null] +25437 - Stairs - [Climb-down, null, null, null, null] +25438 - Telescope - [View, null, null, null, null] +25439 - Telescope - [View, null, null, null, null] +25440 - Goblin stove - [Inspect, null, null, null, null] +25441 - Goblin stove - [Inspect, null, null, null, null] +25442 - null - [Inspect, null, null, null, null] +25443 - Spiderwebs - [null, null, null, null, null] +25444 - null - [null, null, null, null, null] +25445 - null - [null, null, null, null, null] +25446 - null - [null, null, null, null, null] +25447 - null - [null, null, null, null, null] +25448 - null - [null, null, null, null, null] +25449 - null - [null, null, null, null, null] +25450 - null - [null, null, null, null, null] +25451 - null - [null, null, null, null, null] +25452 - null - [null, null, null, null, null] +25453 - null - [null, null, null, null, null] +25454 - null - [null, null, null, null, null] +25455 - null - [null, null, null, null, null] +25456 - null - [null, null, null, null, null] +25457 - null - [null, null, null, null, null] +25458 - null - [null, null, null, null, null] +25459 - null - [null, null, null, null, null] +25460 - null - [null, null, null, null, null] +25461 - null - [null, null, null, null, null] +25462 - null - [null, null, null, null, null] +25463 - null - [null, null, null, null, null] +25464 - Potential fire - [null, null, null, null, null] +25465 - Fire - [null, null, null, null, null] +25466 - null - [null, null, null, null, null] +25467 - null - [null, null, null, null, null] +25468 - null - [null, null, null, null, null] +25469 - null - [null, null, null, null, null] +25470 - null - [null, null, null, null, null] +25471 - null - [null, null, null, null, null] +25472 - null - [null, null, null, null, null] +25473 - null - [null, null, null, null, null] +25474 - null - [null, null, null, null, null] +25475 - null - [null, null, null, null, null] +25476 - null - [null, null, null, null, null] +25477 - null - [null, null, null, null, null] +25478 - null - [null, null, null, null, null] +25479 - null - [null, null, null, null, null] +25480 - null - [null, null, null, null, null] +25481 - null - [null, null, null, null, null] +25482 - null - [null, null, null, null, null] +25483 - null - [null, null, null, null, null] +25484 - null - [null, null, null, null, null] +25485 - null - [null, null, null, null, null] +25486 - null - [null, null, null, null, null] +25487 - null - [null, null, null, null, null] +25488 - null - [null, null, null, null, null] +25489 - null - [null, null, null, null, null] +25490 - null - [null, null, null, null, null] +25491 - null - [null, null, null, null, null] +25492 - null - [null, null, null, null, null] +25493 - null - [null, null, null, null, null] +25494 - null - [null, null, null, null, null] +25495 - null - [null, null, null, null, null] +25496 - null - [null, null, null, null, null] +25497 - null - [null, null, null, null, null] +25498 - null - [null, null, null, null, null] +25499 - null - [null, null, null, null, null] +25500 - null - [null, null, null, null, null] +25501 - null - [null, null, null, null, null] +25502 - null - [null, null, null, null, null] +25503 - null - [null, null, null, null, null] +25504 - null - [null, null, null, null, null] +25505 - null - [null, null, null, null, null] +25506 - null - [null, null, null, null, null] +25507 - null - [null, null, null, null, null] +25508 - null - [null, null, null, null, null] +25509 - null - [null, null, null, null, null] +25510 - null - [null, null, null, null, null] +25511 - null - [null, null, null, null, null] +25512 - null - [null, null, null, null, null] +25513 - null - [null, null, null, null, null] +25514 - null - [null, null, null, null, null] +25515 - null - [null, null, null, null, null] +25516 - null - [null, null, null, null, null] +25517 - null - [null, null, null, null, null] +25518 - null - [null, null, null, null, null] +25519 - null - [null, null, null, null, null] +25520 - null - [null, null, null, null, null] +25521 - null - [null, null, null, null, null] +25522 - null - [null, null, null, null, null] +25523 - null - [null, null, null, null, null] +25524 - null - [null, null, null, null, null] +25525 - null - [null, null, null, null, null] +25526 - Door - [Open, null, null, null, null] +25527 - Door - [Open, null, null, null, null] +25528 - null - [null, null, null, null, null] +25529 - null - [null, null, null, null, null] +25530 - null - [null, null, null, null, null] +25531 - null - [null, null, null, null, null] +25532 - null - [null, null, null, null, null] +25533 - null - [null, null, null, null, null] +25534 - null - [null, null, null, null, null] +25535 - null - [null, null, null, null, null] +25536 - null - [null, null, null, null, null] +25537 - null - [null, null, null, null, null] +25538 - null - [null, null, null, null, null] +25539 - null - [null, null, null, null, null] +25540 - null - [null, null, null, null, null] +25541 - null - [null, null, null, null, null] +25542 - null - [null, null, null, null, null] +25543 - null - [null, null, null, null, null] +25544 - null - [null, null, null, null, null] +25545 - null - [null, null, null, null, null] +25546 - null - [null, null, null, null, null] +25547 - null - [null, null, null, null, null] +25548 - null - [null, null, null, null, null] +25549 - null - [null, null, null, null, null] +25550 - null - [null, null, null, null, null] +25551 - null - [null, null, null, null, null] +25552 - null - [null, null, null, null, null] +25553 - null - [null, null, null, null, null] +25554 - null - [null, null, null, null, null] +25555 - null - [null, null, null, null, null] +25556 - null - [null, null, null, null, null] +25557 - null - [null, null, null, null, null] +25558 - null - [null, null, null, null, null] +25559 - null - [null, null, null, null, null] +25560 - null - [null, null, null, null, null] +25561 - null - [null, null, null, null, null] +25562 - null - [null, null, null, null, null] +25563 - null - [null, null, null, null, null] +25564 - null - [null, null, null, null, null] +25565 - null - [null, null, null, null, null] +25566 - null - [null, null, null, null, null] +25567 - null - [null, null, null, null, null] +25568 - null - [null, null, null, null, null] +25569 - null - [null, null, null, null, null] +25570 - null - [null, null, null, null, null] +25571 - null - [null, null, null, null, null] +25572 - null - [null, null, null, null, null] +25573 - null - [null, null, null, null, null] +25574 - null - [null, null, null, null, null] +25575 - null - [null, null, null, null, null] +25576 - null - [null, null, null, null, null] +25577 - null - [null, null, null, null, null] +25578 - Star chart - [Look-at, null, null, null, null] +25579 - Star chart - [Look-at, null, null, null, null] +25580 - Star chart - [Look-at, null, null, null, null] +25581 - Star chart - [Look-at, null, null, null, null] +25582 - Star chart - [Look-at, null, null, null, null] +25583 - Star chart - [Look-at, null, null, null, null] +25584 - null - [null, null, null, null, null] +25585 - null - [null, null, null, null, null] +25586 - null - [null, null, null, null, null] +25587 - null - [null, null, null, null, null] +25588 - Stone arch - [null, null, null, null, null] +25589 - null - [null, null, null, null, null] +25590 - Rat wheel - [null, null, null, null, null] +25591 - null - [View, null, null, null, null] +25592 - Closed chest - [Open, null, null, null, null] +25593 - Open chest - [null, Search, Shut, null, null] +25594 - Large door - [Open, null, null, null, null] +25595 - Large door - [Open, null, null, null, null] +25596 - null - [null, null, null, null, null] +25597 - null - [null, null, null, null, null] +25598 - null - [null, null, null, null, null] +25599 - Suit of armour - [null, null, null, null, null] +25600 - Barrel - [null, null, null, null, null] +25601 - Bench - [null, null, null, null, null] +25602 - Bow cabinet - [null, null, null, null, null] +25603 - Table - [null, null, null, null, null] +25604 - Staircase - [Climb-down, null, null, null, null] +25605 - Throne - [null, null, null, null, null] +25606 - Ladder - [Climb-down, null, null, null, null] +25607 - Bookcase - [Search, null, null, null, null] +25608 - Cabinet - [null, null, null, null, null] +25609 - Cabinet - [null, null, null, null, null] +25610 - Wardrobe - [null, null, null, null, null] +25611 - Shelves - [null, null, null, null, null] +25612 - Shelves - [null, null, null, null, null] +25613 - null - [null, null, null, null, null] +25614 - Crystal ball - [null, null, null, null, null] +25615 - Table - [null, null, null, null, null] +25616 - Chair - [null, null, null, null, null] +25617 - null - [null, null, null, null, null] +25618 - null - [null, null, null, null, null] +25619 - null - [null, null, null, null, null] +25620 - Novice Flag - [null, null, null, null, null] +25621 - Intermediate Flag - [null, null, null, null, null] +25622 - Veteran Flag - [null, null, null, null, null] +25623 - Novice flag - [null, null, null, null, null] +25624 - Intermediate Flag - [null, null, null, null, null] +25625 - Veteran Flag - [null, null, null, null, null] +25626 - null - [null, null, null, null, null] +25627 - null - [null, null, null, null, null] +25628 - null - [null, null, null, null, null] +25629 - Ladder - [Climb, null, null, null, null] +25630 - Ladder - [Climb, null, null, null, null] +25631 - Gangplank - [Cross, null, null, null, null] +25632 - Gangplank - [Cross, null, null, null, null] +25633 - null - [null, null, null, null, null] +25634 - null - [null, null, null, null, null] +25635 - null - [null, null, null, null, null] +25636 - Barricade - [null, null, null, null, null] +25637 - null - [null, null, null, null, null] +25638 - Large door - [Open, null, null, null, null] +25639 - Large door - [Close, null, null, null, null] +25640 - Large door - [Open, null, null, null, null] +25641 - Large door - [Close, null, null, null, null] +25642 - Door - [Open, null, null, null, null] +25643 - Door - [Close, null, null, null, null] +25644 - Crate - [null, null, null, null, null] +25645 - Crate - [null, null, null, null, null] +25646 - Cannon - [null, null, null, null, null] +25647 - Closed chest - [Open, null, null, null, null] +25648 - Dummy - [null, null, null, null, null] +25649 - Rack - [null, null, null, null, null] +25650 - null - [null, null, null, null, null] +25651 - Bow and arrow - [null, null, null, null, null] +25652 - Shelf - [null, null, null, null, null] +25653 - Shelf - [null, null, null, null, null] +25654 - Charms - [null, null, null, null, null] +25655 - Crate - [null, Hide-in, null, null, null] +25656 - null - [null, null, null, null, null] +25657 - null - [null, null, null, null, null] +25658 - null - [null, null, null, null, null] +25659 - null - [null, null, null, null, null] +25660 - Crate - [null, null, null, null, null] +25661 - Crate - [null, null, null, null, null] +25662 - Ladder - [Climb-down, null, null, null, null] +25663 - Ladder - [Climb-up, null, null, null, null] +25664 - Sir Lucan - [Talk-to, null, null, null, null] +25665 - Mossy rock - [Search, null, null, null, null] +25666 - Sir Lancelot - [Talk-to, null, null, null, null] +25667 - Sir Bedivere - [Talk-to, null, null, null, null] +25668 - Hedge - [null, null, null, null, null] +25669 - Hedge - [null, null, null, null, null] +25670 - Hedge - [null, null, null, null, null] +25671 - null - [null, null, null, null, null] +25672 - null - [null, null, null, null, null] +25673 - null - [null, null, null, null, null] +25674 - null - [null, null, null, null, null] +25675 - Food trough - [null, null, null, null, null] +25676 - Bench - [null, null, null, null, null] +25677 - null - [null, null, null, null, null] +25678 - null - [null, null, null, null, null] +25679 - null - [null, null, null, null, null] +25680 - null - [null, null, null, null, null] +25681 - Bed - [null, null, null, null, null] +25682 - Staircase - [Climb-up, null, null, null, null] +25683 - Staircase - [Climb-down, null, null, null, null] +25684 - Bookcase - [Search, null, null, null, null] +25685 - Chest - [Open, null, null, null, null] +25686 - Chest - [Search, Close, null, null, null] +25687 - Ladder - [Climb-up, null, null, null, null] +25688 - Ladder - [Climb-down, null, null, null, null] +25689 - Bookcase - [Search, null, null, null, null] +25690 - Bookcase - [null, null, null, null, null] +25691 - Bookcase - [null, null, null, null, null] +25692 - Bookcase - [null, null, null, null, null] +25693 - Bookcase - [null, null, null, null, null] +25694 - Bookcase - [Search, null, null, null, null] +25695 - Bookcase - [Search, null, null, null, null] +25696 - Bookcase - [Search, null, null, null, null] +25697 - Bookcase - [Search, null, null, null, null] +25698 - Bookcase - [Search, null, null, null, null] +25699 - Cabinet - [null, null, null, null, null] +25700 - Cabinet - [null, null, null, null, null] +25701 - Drawers - [Open, null, null, null, null] +25702 - Drawers - [Search, Shut, null, null, null] +25703 - Drawers - [Open, null, null, null, null] +25704 - Drawers - [Search, Shut, null, null, null] +25705 - Drawers - [Open, null, null, null, null] +25706 - Drawers - [Search, Shut, null, null, null] +25707 - Drawers - [null, null, null, null, null] +25708 - Drawers - [Open, null, null, null, null] +25709 - Drawers - [Search, Shut, null, null, null] +25710 - Drawers - [Open, null, null, null, null] +25711 - Drawers - [Search, Shut, null, null, null] +25712 - Drawers - [Open, null, null, null, null] +25713 - Drawers - [Search, Shut, null, null, null] +25714 - Drawers - [Open, null, null, null, null] +25715 - Drawers - [Search, Shut, null, null, null] +25716 - Door - [Open, null, null, null, null] +25717 - Door - [Close, null, null, null, null] +25718 - Door - [Open, null, null, null, null] +25719 - Door - [Close, null, null, null, null] +25720 - Dairy churn - [Churn, null, null, null, null] +25721 - Barrel - [null, null, null, null, null] +25722 - Barrel of flour - [null, Take From, null, null, null] +25723 - Anna's barrel - [null, Search, null, null, null] +25724 - Bob's barrel - [null, Search, null, null, null] +25725 - Carol's barrel - [null, Search, null, null, null] +25726 - David's barrel - [null, Search, null, null, null] +25727 - Elizabeth's barrel - [null, Search, null, null, null] +25728 - Frank's barrel - [null, Search, null, null, null] +25729 - Sink - [null, null, null, null, null] +25730 - Range - [null, null, null, null, null] +25731 - Grandfather clock - [null, null, null, null, null] +25732 - Dragon's head - [null, null, null, null, null] +25733 - Table - [null, null, null, null, null] +25734 - Table - [null, null, null, null, null] +25735 - Bed - [null, null, null, null, null] +25736 - Shelf - [null, null, null, null, null] +25737 - Shelf - [null, null, null, null, null] +25738 - Painting - [null, null, null, null, null] +25739 - Portrait - [null, null, null, null, null] +25740 - Landscape - [null, null, null, null, null] +25741 - Painting - [null, null, null, null, null] +25742 - Painting - [null, null, null, null, null] +25743 - Landscape - [null, null, null, null, null] +25744 - Painting - [null, null, null, null, null] +25745 - null - [null, null, null, null, null] +25746 - null - [null, null, null, null, null] +25747 - null - [null, null, null, null, null] +25748 - Large door - [Open, null, null, null, null] +25749 - null - [Close, null, null, null, null] +25750 - Large door - [Open, null, null, null, null] +25751 - null - [Close, null, null, null, null] +25752 - null - [null, null, null, null, null] +25753 - null - [null, null, null, null, null] +25754 - null - [null, null, null, null, null] +25755 - null - [null, null, null, null, null] +25756 - null - [null, null, null, null, null] +25757 - null - [null, null, null, null, null] +25758 - null - [null, null, null, null, null] +25759 - null - [null, null, null, null, null] +25760 - null - [null, null, null, null, null] +25761 - Blacksmith's tools - [null, null, null, null, null] +25762 - Sign - [null, null, null, null, null] +25763 - Clock - [null, null, null, null, null] +25764 - Piano - [null, null, null, null, null] +25765 - Piano stool - [null, null, null, null, null] +25766 - Drawers - [Open, null, null, null, null] +25767 - Drawers - [Search, Shut, null, null, null] +25768 - Bench - [null, null, null, null, null] +25769 - Cabinet - [null, null, null, null, null] +25770 - Cabinet - [null, null, null, null, null] +25771 - Chair - [null, null, null, null, null] +25772 - Smashed chair - [null, null, null, null, null] +25773 - Stool - [null, null, null, null, null] +25774 - Workbench - [null, null, null, null, null] +25775 - Crate - [Search, null, null, null, null] +25776 - Crates - [null, null, null, null, null] +25777 - null - [null, null, null, null, null] +25778 - Table - [null, null, null, null, null] +25779 - Statue - [null, null, null, null, null] +25780 - Barrel - [null, null, null, null, null] +25781 - Cooking shelves - [null, null, null, null, null] +25782 - Old bookshelf - [Search, null, null, null, null] +25783 - Rocking chair - [null, null, null, null, null] +25784 - Chair - [null, null, null, null, null] +25785 - Rack - [null, null, null, null, null] +25786 - Staircase - [Climb-up, null, null, null, null] +25787 - Staircase - [Climb-down, null, null, null, null] +25788 - Large door - [Open, null, null, null, null] +25789 - Large door - [Close, null, null, null, null] +25790 - Large door - [Open, null, null, null, null] +25791 - Large door - [Close, null, null, null, null] +25792 - Suit of armour - [null, null, null, null, null] +25793 - Closed chest - [Open, null, null, null, null] +25794 - Open chest - [null, Search, Shut, null, null] +25795 - null - [null, null, null, null, null] +25796 - null - [null, null, null, null, null] +25797 - null - [null, null, null, null, null] +25798 - Cannon - [null, null, null, null, null] +25799 - Door - [Open, null, null, null, null] +25800 - Door - [Close, null, null, null, null] +25801 - Staircase - [Climb-down, null, null, null, null] +25802 - null - [null, null, null, null, null] +25803 - null - [null, null, null, null, null] +25804 - Large door - [Open, null, null, null, null] +25805 - Large door - [Close, null, null, null, null] +25806 - Large door - [Open, null, null, null, null] +25807 - Large door - [Close, null, null, null, null] +25808 - Bank booth - [Use, Use-quickly, Collect, null, null] +25809 - Closed booth - [null, null, null, null, null] +25810 - null - [null, null, null, null, null] +25811 - null - [null, null, null, null, null] +25812 - null - [null, null, null, null, null] +25813 - Large door - [Open, null, null, null, null] +25814 - Large door - [Open, null, null, null, null] +25815 - Large door - [Close, null, null, null, null] +25816 - Large door - [Close, null, null, null, null] +25817 - Study desk - [null, null, null, null, null] +25818 - Church organ - [Play, null, null, null, null] +25819 - Door - [Open, null, null, null, null] +25820 - Door - [Close, null, null, null, null] +25821 - Bow cabinet - [null, null, null, null, null] +25822 - Bed - [null, null, null, null, null] +25823 - Mirror - [null, null, null, null, null] +25824 - Spinning wheel - [null, Spin, null, null, null] +25825 - Door - [Open, null, null, null, null] +25826 - Door - [Close, null, null, null, null] +25827 - Door - [Open, null, null, null, null] +25828 - Door - [Close, null, null, null, null] +25829 - null - [null, null, null, null, null] +25830 - null - [null, null, null, null, null] +25831 - null - [null, null, null, null, null] +25832 - Chair - [null, null, null, null, null] +25833 - null - [null, null, null, null, null] +25834 - null - [null, null, null, null, null] +25835 - null - [null, null, null, null, null] +25836 - Crate - [null, null, null, null, null] +25837 - Crate - [null, null, null, null, null] +25838 - null - [null, null, null, null, null] +25839 - null - [null, null, null, null, null] +25840 - null - [null, null, null, null, null] +25841 - null - [null, null, null, null, null] +25842 - null - [null, null, null, null, null] +25843 - Ladder - [Climb-down, null, null, null, null] +25844 - Ladder - [Climb-up, null, null, null, null] +25845 - null - [null, null, null, null, null] +25846 - null - [null, null, null, null, null] +25847 - null - [null, null, null, null, null] +25848 - null - [null, null, null, null, null] +25849 - null - [null, null, null, null, null] +25850 - null - [null, null, null, null, null] +25851 - null - [null, null, null, null, null] +25852 - null - [null, null, null, null, null] +25853 - null - [null, null, null, null, null] +25854 - null - [null, null, null, null, null] +25855 - null - [null, null, null, null, null] +25856 - null - [null, null, null, null, null] +25857 - null - [null, null, null, null, null] +25858 - null - [null, null, null, null, null] +25859 - null - [null, null, null, null, null] +25860 - null - [null, null, null, null, null] +25861 - null - [null, null, null, null, null] +25862 - null - [null, null, null, null, null] +25863 - null - [null, null, null, null, null] +25864 - null - [null, null, null, null, null] +25865 - null - [null, null, null, null, null] +25866 - null - [null, null, null, null, null] +25867 - null - [null, null, null, null, null] +25868 - null - [null, null, null, null, null] +25869 - null - [null, null, null, null, null] +25870 - null - [null, null, null, null, null] +25871 - null - [null, null, null, null, null] +25872 - null - [null, null, null, null, null] +25873 - null - [null, null, null, null, null] +25874 - null - [null, null, null, null, null] +25875 - null - [null, null, null, null, null] +25876 - Metal door - [Open, null, null, null, null] +25877 - Metal door - [Close, null, null, null, null] +25878 - null - [null, null, null, null, null] +25879 - Vent - [null, null, null, null, null] +25880 - Vent - [Reach, null, null, null, null] +25881 - null - [null, null, null, null, null] +25882 - null - [null, null, null, null, null] +25883 - null - [null, null, null, null, null] +25884 - null - [null, null, null, null, null] +25885 - null - [null, null, null, null, null] +25886 - null - [null, null, null, null, null] +25887 - null - [null, null, null, null, null] +25888 - null - [null, null, null, null, null] +25889 - Sir Tristram - [Talk-to, null, null, null, null] +25890 - null - [null, null, null, null, null] +25891 - null - [null, null, null, null, null] +25892 - null - [null, null, null, null, null] +25893 - null - [null, null, null, null, null] +25894 - null - [null, null, null, null, null] +25895 - null - [null, null, null, null, null] +25896 - null - [null, null, null, null, null] +25897 - null - [null, null, null, null, null] +25898 - null - [null, null, null, null, null] +25899 - null - [null, null, null, null, null] +25900 - null - [null, null, null, null, null] +25901 - null - [null, null, null, null, null] +25902 - null - [null, null, null, null, null] +25903 - null - [null, null, null, null, null] +25904 - null - [null, null, null, null, null] +25905 - null - [null, null, null, null, null] +25906 - null - [null, null, null, null, null] +25907 - null - [null, null, null, null, null] +25908 - null - [null, null, null, null, null] +25909 - null - [null, null, null, null, null] +25910 - null - [null, null, null, null, null] +25911 - null - [null, null, null, null, null] +25912 - null - [null, null, null, null, null] +25913 - null - [null, null, null, null, null] +25914 - null - [null, null, null, null, null] +25915 - null - [null, null, null, null, null] +25916 - null - [null, null, null, null, null] +25917 - null - [null, null, null, null, null] +25918 - null - [null, null, null, null, null] +25919 - null - [null, null, null, null, null] +25920 - null - [null, null, null, null, null] +25921 - null - [null, null, null, null, null] +25922 - null - [null, null, null, null, null] +25923 - null - [null, null, null, null, null] +25924 - null - [null, null, null, null, null] +25925 - null - [null, null, null, null, null] +25926 - null - [null, null, null, null, null] +25927 - Bookcase - [Search, null, null, null, null] +25928 - Table - [null, null, null, null, null] +25929 - Sink - [null, null, null, null, null] +25930 - Table - [null, null, null, null, null] +25931 - Table - [null, null, null, null, null] +25932 - Bar pumps - [null, null, null, null, null] +25933 - Shelves - [null, null, null, null, null] +25934 - Shelves - [null, null, null, null, null] +25935 - Staircase - [Climb-up, null, null, null, null] +25936 - null - [null, null, null, null, null] +25937 - Bank deposit box - [Deposit, null, null, null, null] +25938 - Ladder - [Climb-up, null, null, null, null] +25939 - Ladder - [Climb-down, null, null, null, null] +25940 - Ladder - [Climb-down, null, null, null, null] +25941 - Ladder - [Climb-up, null, null, null, null] +25942 - King Arthur - [Free, null, null, null, null] +25943 - null - [Free, null, null, null, null] +25944 - The jury - [null, null, null, null, null] +25945 - The jury - [null, null, null, null, null] +25946 - The jury - [null, null, null, null, null] +25947 - The jury - [null, null, null, null, null] +25948 - The jury - [null, null, null, null, null] +25949 - The jury - [null, null, null, null, null] +25950 - The jury - [null, null, null, null, null] +25951 - The jury - [null, null, null, null, null] +25952 - The jury - [null, null, null, null, null] +25953 - null - [null, null, null, null, null] +25954 - null - [null, null, null, null, null] +25955 - Alan - [null, null, null, null, null] +25956 - Court judge - [Talk-to, null, null, null, null] +25957 - null - [null, null, null, null, null] +25958 - null - [null, null, null, null, null] +25959 - null - [null, null, null, null, null] +25960 - null - [null, null, null, null, null] +25961 - null - [null, null, null, null, null] +25962 - null - [null, null, null, null, null] +25963 - null - [null, null, null, null, null] +25964 - null - [null, null, null, null, null] +25965 - null - [null, null, null, null, null] +25966 - null - [null, null, null, null, null] +25967 - null - [null, null, null, null, null] +25968 - null - [null, null, null, null, null] +25969 - null - [null, null, null, null, null] +25970 - null - [null, null, null, null, null] +25971 - null - [null, null, null, null, null] +25972 - null - [null, null, null, null, null] +25973 - null - [null, null, null, null, null] +25974 - null - [null, null, null, null, null] +25975 - null - [null, null, null, null, null] +25976 - null - [null, null, null, null, null] +25977 - null - [null, null, null, null, null] +25978 - null - [null, null, null, null, null] +25979 - null - [null, null, null, null, null] +25980 - null - [null, null, null, null, null] +25981 - Locked gate - [null, null, null, null, null] +25982 - null - [null, null, null, null, null] +25983 - null - [null, null, null, null, null] +25984 - null - [null, null, null, null, null] +25985 - null - [null, null, null, null, null] +25986 - null - [null, null, null, null, null] +25987 - null - [null, null, null, null, null] +25988 - null - [null, null, null, null, null] +25989 - null - [null, null, null, null, null] +25990 - null - [null, null, null, null, null] +25991 - null - [null, null, null, null, null] +25992 - null - [null, null, null, null, null] +25993 - null - [null, null, null, null, null] +25994 - null - [null, null, null, null, null] +25995 - null - [null, null, null, null, null] +25996 - null - [null, null, null, null, null] +25997 - null - [null, null, null, null, null] +25998 - null - [null, null, null, null, null] +25999 - null - [null, null, null, null, null] +26000 - null - [null, null, null, null, null] +26001 - null - [null, null, null, null, null] +26002 - null - [null, null, null, null, null] +26003 - null - [null, null, null, null, null] +26004 - null - [null, null, null, null, null] +26005 - null - [null, null, null, null, null] +26006 - null - [null, null, null, null, null] +26007 - null - [null, null, null, null, null] +26008 - null - [null, null, null, null, null] +26009 - null - [null, null, null, null, null] +26010 - null - [null, null, null, null, null] +26011 - null - [null, null, null, null, null] +26012 - null - [null, null, null, null, null] +26013 - null - [null, null, null, null, null] +26014 - null - [null, null, null, null, null] +26015 - null - [null, null, null, null, null] +26016 - null - [null, null, null, null, null] +26017 - Stairs - [Climb-down, null, null, null, null] +26018 - null - [null, null, null, null, null] +26019 - null - [null, null, null, null, null] +26020 - Table - [null, null, null, null, null] +26021 - null - [null, null, null, null, null] +26022 - null - [null, null, null, null, null] +26023 - null - [null, null, null, null, null] +26024 - null - [null, null, null, null, null] +26025 - null - [null, null, null, null, null] +26026 - null - [null, null, null, null, null] +26027 - null - [null, null, null, null, null] +26028 - null - [null, null, null, null, null] +26029 - null - [null, null, null, null, null] +26030 - null - [null, null, null, null, null] +26031 - null - [null, null, null, null, null] +26032 - null - [null, null, null, null, null] +26033 - null - [null, null, null, null, null] +26034 - null - [null, null, null, null, null] +26035 - null - [null, null, null, null, null] +26036 - null - [null, null, null, null, null] +26037 - null - [null, null, null, null, null] +26038 - null - [null, null, null, null, null] +26039 - null - [null, null, null, null, null] +26040 - null - [null, null, null, null, null] +26041 - null - [null, null, null, null, null] +26042 - Gate - [Exit, null, null, null, null] +26043 - Desk - [null, null, null, null, null] +26044 - Desk - [null, null, null, null, null] +26045 - Citizen - [null, null, null, null, null] +26046 - Citizen - [null, null, null, null, null] +26047 - Citizen - [null, null, null, null, null] +26048 - Citizen - [null, null, null, null, null] +26049 - Citizen - [null, null, null, null, null] +26050 - Citizen - [null, null, null, null, null] +26051 - Stairs - [null, null, null, null, null] +26052 - null - [null, null, null, null, null] +26053 - Bookcase - [Search, null, null, null, null] +26054 - null - [null, null, null, null, null] +26055 - null - [null, null, null, null, null] +26056 - null - [null, null, null, null, null] +26057 - null - [null, null, null, null, null] +26058 - null - [null, null, null, null, null] +26059 - null - [null, null, null, null, null] +26060 - null - [null, null, null, null, null] +26061 - null - [null, null, null, null, null] +26062 - null - [null, null, null, null, null] +26063 - null - [null, null, null, null, null] +26064 - null - [null, null, null, null, null] +26065 - null - [null, null, null, null, null] +26066 - null - [null, null, null, null, null] +26067 - null - [null, null, null, null, null] +26068 - null - [null, null, null, null, null] +26069 - null - [null, null, null, null, null] +26070 - null - [null, null, null, null, null] +26071 - null - [null, null, null, null, null] +26072 - null - [null, null, null, null, null] +26073 - Statue - [Search, null, null, null, null] +26074 - Table - [null, null, null, null, null] +26075 - Chair - [null, null, null, null, null] +26076 - Chair - [null, null, null, null, null] +26077 - Chair - [null, null, null, null, null] +26078 - null - [null, null, null, null, null] +26079 - null - [null, null, null, null, null] +26080 - null - [null, null, null, null, null] +26081 - Gate - [Open, null, null, null, null] +26082 - Gate - [Open, null, null, null, null] +26083 - null - [Close, null, null, null, null] +26084 - null - [Close, null, null, null, null] +26085 - null - [null, null, null, null, null] +26086 - null - [null, null, null, null, null] +26087 - null - [null, null, null, null, null] +26088 - null - [null, null, null, null, null] +26089 - null - [null, null, null, null, null] +26090 - null - [null, null, null, null, null] +26091 - null - [null, null, null, null, null] +26092 - null - [null, null, null, null, null] +26093 - null - [null, null, null, null, null] +26094 - null - [null, null, null, null, null] +26095 - null - [null, null, null, null, null] +26096 - null - [null, null, null, null, null] +26097 - null - [null, null, null, null, null] +26098 - null - [null, null, null, null, null] +26099 - null - [null, null, null, null, null] +26100 - null - [null, null, null, null, null] +26101 - null - [null, null, null, null, null] +26102 - null - [null, null, null, null, null] +26103 - null - [null, null, null, null, null] +26104 - null - [null, null, null, null, null] +26105 - null - [null, null, null, null, null] +26106 - Staircase - [Climb-up, null, null, null, null] +26107 - Ladder - [Climb-up, null, null, null, null] +26108 - null - [null, null, null, null, null] +26109 - Spiders' nest - [null, Investigate, null, null, null] +26110 - Smashed window - [null, Investigate, Break, null, null] +26111 - Smashed window - [null, Investigate, Break, null, null] +26112 - Window - [null, Investigate, Break, null, null] +26113 - Bookcase - [Search, null, null, null, null] +26114 - Odd looking wall - [Open, null, null, null, null] +26115 - Odd looking wall - [Open, null, null, null, null] +26116 - Odd looking wall - [null, null, null, null, null] +26117 - Odd looking wall - [null, null, null, null, null] +26118 - Ladder - [Climb-up, null, null, null, null] +26119 - Trapdoor - [Climb-down, null, null, null, null] +26120 - Sinclair family compost heap - [null, Investigate, null, null, null] +26121 - Sinclair family beehive - [null, Investigate, null, null, null] +26122 - Barrel of flour - [null, Take From, null, null, null] +26123 - null - [null, null, null, null, null] +26124 - null - [null, null, null, null, null] +26125 - null - [null, null, null, null, null] +26126 - null - [null, null, null, null, null] +26127 - null - [null, null, null, null, null] +26128 - null - [null, null, null, null, null] +26129 - null - [null, null, null, null, null] +26130 - Gate - [Open, null, null, null, null] +26131 - Gate - [Open, null, null, null, null] +26132 - Gate - [Close, null, null, null, null] +26133 - Gate - [Close, null, null, null, null] +26134 - null - [null, null, null, null, null] +26135 - null - [null, null, null, null, null] +26136 - null - [null, null, null, null, null] +26137 - Fly paper - [null, null, null, null, null] +26138 - null - [null, null, null, null, null] +26139 - null - [null, null, null, null, null] +26140 - Gramophone - [null, null, null, null, null] +26141 - Gramophone - [null, null, null, null, null] +26142 - Table - [null, null, null, null, null] +26143 - Spinning wheel - [null, Spin, null, null, null] +26144 - Staircase - [Climb-up, null, null, null, null] +26145 - Staircase - [Climb-up, null, null, null, null] +26146 - Staircase - [Climb-up, null, null, null, null] +26147 - Staircase - [Climb-up, null, null, null, null] +26148 - Staircase - [Climb-down, null, null, null, null] +26149 - Staircase - [Climb-down, null, null, null, null] +26150 - Staircase - [Climb-down, null, null, null, null] +26151 - Staircase - [Climb-down, null, null, null, null] +26152 - null - [null, null, null, null, null] +26153 - null - [null, null, null, null, null] +26154 - null - [null, null, null, null, null] +26155 - null - [null, null, null, null, null] +26156 - null - [null, null, null, null, null] +26157 - null - [null, null, null, null, null] +26158 - null - [null, null, null, null, null] +26159 - null - [null, null, null, null, null] +26160 - null - [null, null, null, null, null] +26161 - null - [null, null, null, null, null] +26162 - null - [null, null, null, null, null] +26163 - null - [null, null, null, null, null] +26164 - null - [null, null, null, null, null] +26165 - null - [null, null, null, null, null] +26166 - null - [null, null, null, null, null] +26167 - null - [null, null, null, null, null] +26168 - null - [null, null, null, null, null] +26169 - null - [null, null, null, null, null] +26170 - null - [null, null, null, null, null] +26171 - null - [null, null, null, null, null] +26172 - null - [null, null, null, null, null] +26173 - null - [null, null, null, null, null] +26174 - null - [null, null, null, null, null] +26175 - null - [null, null, null, null, null] +26176 - null - [null, null, null, null, null] +26177 - null - [null, null, null, null, null] +26178 - null - [null, null, null, null, null] +26179 - null - [null, null, null, null, null] +26180 - null - [null, null, null, null, null] +26181 - null - [null, null, null, null, null] +26182 - null - [null, null, null, null, null] +26183 - null - [null, null, null, null, null] +26184 - null - [null, null, null, null, null] +26185 - null - [null, null, null, null, null] +26186 - null - [null, null, null, null, null] +26187 - null - [null, null, null, null, null] +26188 - Locked door - [Open, null, null, null, null] +26189 - Locked door - [Open, null, null, null, null] +26190 - null - [null, null, null, null, null] +26191 - Lever - [Pull, null, null, null, null] +26192 - null - [Examine, Warm-by, null, null, null] +26193 - Chest - [Open, null, null, null, null] +26194 - Lever - [Pull, null, null, null, null] +26195 - null - [null, null, null, null, null] +26196 - null - [null, null, null, null, null] +26197 - null - [null, null, null, null, null] +26198 - Birthday cake - [null, null, null, null, null] +26199 - Birthday cake - [null, null, null, null, null] +26200 - Birthday cake - [null, null, null, null, null] +26201 - Table - [null, null, null, null, null] +26202 - Table - [null, null, null, null, null] +26203 - Table - [null, null, null, null, null] +26204 - Present - [null, null, null, null, null] +26205 - Present - [null, null, null, null, null] +26206 - Table - [null, null, null, null, null] +26207 - Large door - [Close, null, null, null, null] +26208 - Staircase - [Climb-up, null, null, null, null] +26209 - Skeleton - [null, null, null, null, null] +26210 - Skeleton - [null, null, null, null, null] +26211 - Skeleton - [null, null, null, null, null] +26212 - Skeleton - [null, null, null, null, null] +26213 - Bones - [null, null, null, null, null] +26214 - Bones - [null, null, null, null, null] +26215 - Bones - [null, null, null, null, null] +26216 - Skeleton - [null, null, null, null, null] +26217 - Crushed skeleton - [null, null, null, null, null] +26218 - Skeleton - [null, null, null, null, null] +26219 - null - [null, null, null, null, null] +26220 - null - [null, null, null, null, null] +26221 - null - [null, null, null, null, null] +26222 - null - [null, null, null, null, null] +26223 - null - [null, null, null, null, null] +26224 - null - [null, null, null, null, null] +26225 - null - [null, null, null, null, null] +26226 - null - [null, null, null, null, null] +26227 - Skeleton - [null, null, null, null, null] +26228 - null - [null, null, null, null, null] +26229 - Battle tower - [null, null, null, null, null] +26230 - Broken catapult - [null, null, null, null, null] +26231 - Crossbow - [null, null, null, null, null] +26232 - Chain - [null, null, null, null, null] +26233 - Battering ram - [null, null, null, null, null] +26234 - Arrow - [null, null, null, null, null] +26235 - Broken mast - [null, null, null, null, null] +26236 - Skeleton - [null, null, null, null, null] +26237 - Wheel - [null, null, null, null, null] +26238 - Hammer - [null, null, null, null, null] +26239 - Armour - [null, null, null, null, null] +26240 - Ladder - [null, null, null, null, null] +26241 - Crate - [null, null, null, null, null] +26242 - Arm - [null, null, null, null, null] +26243 - Barrels - [null, null, null, null, null] +26244 - null - [null, null, null, null, null] +26245 - null - [null, null, null, null, null] +26246 - null - [null, null, null, null, null] +26247 - Old axe - [null, null, null, null, null] +26248 - Column - [null, null, null, null, null] +26249 - Cannonball - [null, null, null, null, null] +26250 - Spikes - [null, null, null, null, null] +26251 - Crate - [null, null, null, null, null] +26252 - Spikes - [null, null, null, null, null] +26253 - Barrels - [null, null, null, null, null] +26254 - Barrels - [null, null, null, null, null] +26255 - Pole - [null, null, null, null, null] +26256 - Catapult - [null, null, null, null, null] +26257 - Crates - [null, null, null, null, null] +26258 - Crates - [null, null, null, null, null] +26259 - Crossbow - [null, null, null, null, null] +26260 - Crates - [null, null, null, null, null] +26261 - Crates - [null, null, null, null, null] +26262 - Spikes - [null, null, null, null, null] +26263 - Wood - [null, null, null, null, null] +26264 - Spikes - [null, null, null, null, null] +26265 - Stormram - [null, null, null, null, null] +26266 - Skullshield - [null, null, null, null, null] +26267 - Barrels - [null, null, null, null, null] +26268 - Boards - [null, null, null, null, null] +26269 - Crane - [null, null, null, null, null] +26270 - Handle - [null, null, null, null, null] +26271 - Frozen warrior - [null, null, null, null, null] +26272 - Frozen warrior - [null, null, null, null, null] +26273 - Frozen warrior - [null, null, null, null, null] +26274 - Frozen warrior - [null, null, null, null, null] +26275 - Frozen warrior - [null, null, null, null, null] +26276 - Frozen warrior - [null, null, null, null, null] +26277 - Frozen warrior - [null, null, null, null, null] +26278 - Frozen warrior - [null, null, null, null, null] +26279 - Frozen warrior - [null, null, null, null, null] +26280 - Frozen warrior - [null, null, null, null, null] +26281 - Frozen demon - [null, null, null, null, null] +26282 - Frozen demon - [null, null, null, null, null] +26283 - Frozen orc - [null, null, null, null, null] +26284 - Frozen orc - [null, null, null, null, null] +26285 - Frozen orc - [null, null, null, null, null] +26286 - Zamorak altar - [Pray-at, Teleport, null, null, null] +26287 - Saradomin altar - [Pray-at, Teleport, null, null, null] +26288 - Armadyl altar - [Pray-at, Teleport, null, null, null] +26289 - Bandos altar - [Pray-at, Teleport, null, null, null] +26290 - null - [null, null, null, null, null] +26291 - Big hole - [null, null, null, null, null] +26292 - Rope - [null, null, null, null, null] +26293 - Rope - [Climb, null, null, null, null] +26294 - null - [null, null, null, null, null] +26295 - Rock - [null, Climb-down, null, null, null] +26296 - Rock - [Tie-rope, null, null, null, null] +26297 - Rope - [Climb-up, null, null, null, null] +26298 - null - [null, null, null, null, null] +26299 - Rock - [null, Climb-down, null, null, null] +26300 - Rock - [Tie-rope, null, null, null, null] +26301 - Rope - [Climb-up, null, null, null, null] +26302 - Pillar - [null, null, null, null, null] +26303 - Pillar - [Grapple, null, null, null, null] +26304 - null - [null, null, null, null, null] +26305 - Little crack - [Crawl-through, null, null, null, null] +26306 - Knight - [null, null, Search, null, null] +26307 - null - [null, null, null, null, null] +26308 - null - [null, null, null, null, null] +26309 - null - [null, null, null, null, null] +26310 - null - [null, null, null, null, null] +26311 - null - [null, null, null, null, null] +26312 - null - [null, null, null, null, null] +26313 - null - [null, null, null, null, null] +26314 - null - [null, null, null, null, null] +26315 - null - [null, null, null, null, null] +26316 - null - [null, null, null, null, null] +26317 - null - [null, null, null, null, null] +26318 - null - [null, null, null, null, null] +26319 - null - [null, null, null, null, null] +26320 - null - [null, null, null, null, null] +26321 - null - [null, null, null, null, null] +26322 - null - [null, null, null, null, null] +26323 - Rocky handholds - [Climb, null, null, null, null] +26324 - Rocky handholds - [Climb, null, null, null, null] +26325 - Rocky handholds - [Climb, null, null, null, null] +26326 - null - [null, null, null, null, null] +26327 - Rocky handholds - [Climb, null, null, null, null] +26328 - Rocky handholds - [Climb, null, null, null, null] +26329 - Rocky handholds - [Climb, null, null, null, null] +26330 - null - [null, null, null, null, null] +26331 - null - [null, null, null, null, null] +26332 - null - [null, null, null, null, null] +26333 - null - [null, null, null, null, null] +26334 - null - [null, null, null, null, null] +26335 - null - [null, null, null, null, null] +26336 - null - [null, null, null, null, null] +26337 - null - [null, null, null, null, null] +26338 - Boulder - [Move, null, null, null, null] +26339 - Boulder - [null, null, null, null, null] +26340 - Hole - [Tie-rope, null, null, null, null] +26341 - Hole - [Climb-down, null, null, null, null] +26342 - null - [null, null, null, null, null] +26343 - Broken pillar - [Tie-rope, null, null, null, null] +26344 - Broken pillar - [null, null, null, null, null] +26345 - Rope - [Climb-down, null, null, null, null] +26346 - null - [null, null, null, null, null] +26347 - null - [null, null, null, null, null] +26348 - null - [null, null, null, null, null] +26349 - null - [null, null, null, null, null] +26350 - null - [null, null, null, null, null] +26351 - null - [null, null, null, null, null] +26352 - null - [null, null, null, null, null] +26353 - null - [null, null, null, null, null] +26354 - null - [null, null, null, null, null] +26355 - null - [null, null, null, null, null] +26356 - null - [null, null, null, null, null] +26357 - null - [null, null, null, null, null] +26358 - null - [null, null, null, null, null] +26359 - null - [null, null, null, null, null] +26360 - null - [null, null, null, null, null] +26361 - null - [null, null, null, null, null] +26362 - null - [null, null, null, null, null] +26363 - null - [null, null, null, null, null] +26364 - null - [null, null, null, null, null] +26365 - null - [null, null, null, null, null] +26366 - null - [null, null, null, null, null] +26367 - null - [null, null, null, null, null] +26368 - null - [null, null, null, null, null] +26369 - null - [null, null, null, null, null] +26370 - null - [null, null, null, null, null] +26371 - null - [null, null, null, null, null] +26372 - null - [null, null, null, null, null] +26373 - null - [null, null, null, null, null] +26374 - null - [null, null, null, null, null] +26375 - null - [null, null, null, null, null] +26376 - null - [null, null, null, null, null] +26377 - null - [null, null, null, null, null] +26378 - null - [null, null, null, null, null] +26379 - null - [null, null, null, null, null] +26380 - Frozen door - [null, null, null, null, null] +26381 - Frozen door - [null, null, null, null, null] +26382 - null - [null, null, null, null, null] +26383 - null - [null, null, null, null, null] +26384 - Big door - [Bang, null, null, null, null] +26385 - null - [null, null, null, null, null] +26386 - null - [null, null, null, null, null] +26387 - Door - [null, null, null, null, null] +26388 - null - [null, null, null, null, null] +26389 - null - [null, null, null, null, null] +26390 - null - [null, null, null, null, null] +26391 - null - [null, null, null, null, null] +26392 - null - [null, null, null, null, null] +26393 - null - [null, null, null, null, null] +26394 - null - [null, null, null, null, null] +26395 - null - [null, null, null, null, null] +26396 - null - [null, null, null, null, null] +26397 - null - [null, null, null, null, null] +26398 - null - [null, null, null, null, null] +26399 - null - [null, null, null, null, null] +26400 - null - [null, null, null, null, null] +26401 - null - [null, null, null, null, null] +26402 - null - [null, null, null, null, null] +26403 - null - [null, null, null, null, null] +26404 - null - [null, null, null, null, null] +26405 - null - [null, null, null, null, null] +26406 - null - [null, null, null, null, null] +26407 - null - [null, null, null, null, null] +26408 - null - [null, null, null, null, null] +26409 - null - [null, null, null, null, null] +26410 - null - [null, null, null, null, null] +26411 - null - [null, null, null, null, null] +26412 - null - [null, null, null, null, null] +26413 - null - [null, null, null, null, null] +26414 - Large geyser - [null, null, null, null, null] +26415 - Snow - [null, null, null, null, null] +26416 - null - [null, null, null, null, null] +26417 - Snowfall - [null, null, null, null, null] +26418 - Waterfall - [null, null, null, null, null] +26419 - Waterfall - [null, null, null, null, null] +26420 - Waterfall - [null, null, null, null, null] +26421 - Waterfall - [null, null, null, null, null] +26422 - Waterfall - [null, null, null, null, null] +26423 - null - [null, null, null, null, null] +26424 - null - [null, null, null, null, null] +26425 - Big door - [Open, null, null, null, null] +26426 - Big door - [Open, null, null, null, null] +26427 - Big door - [Open, null, null, null, null] +26428 - Big door - [Open, null, null, null, null] +26429 - null - [null, null, null, null, null] +26430 - null - [null, null, null, null, null] +26431 - null - [null, null, null, null, null] +26432 - null - [null, null, null, null, null] +26433 - null - [null, null, null, null, null] +26434 - null - [null, null, null, null, null] +26435 - null - [null, null, null, null, null] +26436 - null - [null, null, null, null, null] +26437 - null - [null, null, null, null, null] +26438 - null - [null, null, null, null, null] +26439 - Ice bridge - [Climb-off, null, null, null, null] +26440 - Crate - [Search, null, null, null, null] +26441 - null - [null, null, null, null, null] +26442 - null - [null, null, null, null, null] +26443 - null - [null, null, null, null, null] +26444 - null - [null, null, null, null, null] +26445 - null - [null, null, null, null, null] +26446 - null - [null, null, null, null, null] +26447 - null - [null, null, null, null, null] +26448 - null - [null, null, null, null, null] +26449 - null - [null, null, null, null, null] +26450 - null - [null, null, null, null, null] +26451 - null - [null, null, null, null, null] +26452 - null - [null, null, null, null, null] +26453 - null - [null, null, null, null, null] +26454 - null - [null, null, null, null, null] +26455 - null - [null, null, null, null, null] +26456 - null - [null, null, null, null, null] +26457 - null - [null, null, null, null, null] +26458 - null - [null, null, null, null, null] +26459 - null - [null, null, null, null, null] +26460 - null - [null, null, null, null, null] +26461 - null - [null, null, null, null, null] +26462 - null - [null, null, null, null, null] +26463 - null - [null, null, null, null, null] +26464 - null - [null, null, null, null, null] +26465 - null - [null, null, null, null, null] +26466 - null - [null, null, null, null, null] +26467 - null - [null, null, null, null, null] +26468 - null - [null, null, null, null, null] +26469 - null - [null, null, null, null, null] +26470 - null - [null, null, null, null, null] +26471 - null - [null, null, null, null, null] +26472 - null - [null, null, null, null, null] +26473 - null - [null, null, null, null, null] +26474 - null - [null, null, null, null, null] +26475 - null - [null, null, null, null, null] +26476 - null - [null, null, null, null, null] +26477 - null - [null, null, null, null, null] +26478 - null - [null, null, null, null, null] +26479 - null - [null, null, null, null, null] +26480 - null - [null, null, null, null, null] +26481 - null - [null, null, null, null, null] +26482 - null - [null, null, null, null, null] +26483 - null - [null, null, null, null, null] +26484 - null - [null, null, null, null, null] +26485 - null - [null, null, null, null, null] +26486 - null - [null, null, null, null, null] +26487 - null - [null, null, null, null, null] +26488 - Staircase - [Climb, null, null, null, null] +26489 - Staircase - [Climb, null, null, null, null] +26490 - null - [null, null, null, null, null] +26491 - null - [null, null, null, null, null] +26492 - null - [null, null, null, null, null] +26493 - null - [null, null, null, null, null] +26494 - Crate - [Search, null, null, null, null] +26495 - Crate - [Search, null, null, null, null] +26496 - null - [null, null, null, null, null] +26497 - null - [null, null, null, null, null] +26498 - null - [null, null, null, null, null] +26499 - null - [null, null, null, null, null] +26500 - null - [null, null, null, null, null] +26501 - null - [null, null, null, null, null] +26502 - null - [null, null, null, null, null] +26503 - null - [null, null, null, null, null] +26504 - null - [null, null, null, null, null] +26505 - null - [null, null, null, null, null] +26506 - null - [null, null, null, null, null] +26507 - null - [null, null, null, null, null] +26508 - null - [null, null, null, null, null] +26509 - null - [null, null, null, null, null] +26510 - null - [null, null, null, null, null] +26511 - null - [null, null, null, null, null] +26512 - null - [null, null, null, null, null] +26513 - null - [null, null, null, null, null] +26514 - null - [null, null, null, null, null] +26515 - null - [null, null, null, null, null] +26516 - null - [null, null, null, null, null] +26517 - null - [null, null, null, null, null] +26518 - Ladder - [Climb-up, null, null, null, null] +26519 - Ladder - [Climb-down, null, null, null, null] +26520 - null - [null, null, null, null, null] +26521 - null - [null, null, null, null, null] +26522 - null - [null, null, null, null, null] +26523 - null - [null, null, null, null, null] +26524 - null - [null, null, null, null, null] +26525 - null - [null, null, null, null, null] +26526 - null - [null, null, null, null, null] +26527 - null - [null, null, null, null, null] +26528 - null - [null, null, null, null, null] +26529 - null - [null, null, null, null, null] +26530 - null - [null, null, null, null, null] +26531 - null - [null, null, null, null, null] +26532 - null - [null, null, null, null, null] +26533 - null - [null, null, null, null, null] +26534 - null - [null, null, null, null, null] +26535 - null - [null, null, null, null, null] +26536 - null - [null, null, null, null, null] +26537 - null - [null, null, null, null, null] +26538 - null - [null, null, null, null, null] +26539 - null - [null, null, null, null, null] +26540 - null - [null, null, null, null, null] +26541 - null - [null, null, null, null, null] +26542 - null - [null, null, null, null, null] +26543 - null - [null, null, null, null, null] +26544 - null - [null, null, null, null, null] +26545 - null - [null, null, null, null, null] +26546 - null - [null, null, null, null, null] +26547 - null - [null, null, null, null, null] +26548 - null - [null, null, null, null, null] +26549 - null - [null, null, null, null, null] +26550 - null - [null, null, null, null, null] +26551 - null - [null, null, null, null, null] +26552 - null - [null, null, null, null, null] +26553 - null - [null, null, null, null, null] +26554 - null - [null, null, null, null, null] +26555 - null - [null, null, null, null, null] +26556 - null - [null, null, null, null, null] +26557 - null - [null, null, null, null, null] +26558 - null - [null, null, null, null, null] +26559 - null - [null, null, null, null, null] +26560 - Metal door - [Open, null, null, null, null] +26561 - Metal door - [Close, null, null, null, null] +26562 - null - [null, null, null, null, null] +26563 - null - [null, null, null, null, null] +26564 - null - [null, null, null, null, null] +26565 - null - [null, null, null, null, null] +26566 - null - [null, null, null, null, null] +26567 - null - [null, null, null, null, null] +26568 - null - [null, null, null, null, null] +26569 - null - [null, null, null, null, null] +26570 - Sewer exit - [Exit, null, null, null, null] +26571 - Sewer exit - [Exit, null, null, null, null] +26572 - Sewer exit - [Exit, null, null, null, null] +26573 - Sewer exit - [Exit, null, null, null, null] +26574 - Sewer exit - [Exit, null, null, null, null] +26575 - Sewer exit - [Exit, null, null, null, null] +26576 - null - [null, null, null, null, null] +26577 - null - [null, null, null, null, null] +26578 - Gas - [null, null, null, null, null] +26579 - Gas jet - [null, null, null, null, null] +26580 - null - [null, null, null, null, null] +26581 - null - [null, null, null, null, null] +26582 - null - [null, null, null, null, null] +26583 - null - [null, null, null, null, null] +26584 - null - [null, null, null, null, null] +26585 - null - [null, null, null, null, null] +26586 - null - [null, null, null, null, null] +26587 - null - [null, null, null, null, null] +26588 - null - [null, null, null, null, null] +26589 - null - [null, null, null, null, null] +26590 - null - [null, null, null, null, null] +26591 - null - [null, null, null, null, null] +26592 - null - [null, null, null, null, null] +26593 - null - [null, null, null, null, null] +26594 - null - [null, null, null, null, null] +26595 - null - [null, null, null, null, null] +26596 - null - [null, null, null, null, null] +26597 - null - [null, null, null, null, null] +26598 - null - [null, null, null, null, null] +26599 - null - [null, null, null, null, null] +26600 - null - [null, null, null, null, null] +26601 - null - [null, null, null, null, null] +26602 - null - [null, null, null, null, null] +26603 - null - [null, null, null, null, null] +26604 - null - [null, null, null, null, null] +26605 - null - [null, null, null, null, null] +26606 - null - [null, null, null, null, null] +26607 - null - [null, null, null, null, null] +26608 - null - [null, null, null, null, null] +26609 - null - [null, null, null, null, null] +26610 - null - [null, null, null, null, null] +26611 - null - [null, null, null, null, null] +26612 - null - [null, null, null, null, null] +26613 - null - [null, null, null, null, null] +26614 - null - [null, null, null, null, null] +26615 - null - [null, null, null, null, null] +26616 - null - [null, null, null, null, null] +26617 - null - [null, null, null, null, null] +26618 - null - [null, null, null, null, null] +26619 - null - [null, null, null, null, null] +26620 - null - [null, null, null, null, null] +26621 - null - [null, null, null, null, null] +26622 - null - [null, null, null, null, null] +26623 - null - [null, null, null, null, null] +26624 - null - [null, null, null, null, null] +26625 - null - [null, null, null, null, null] +26626 - null - [null, null, null, null, null] +26627 - null - [null, null, null, null, null] +26628 - null - [null, null, null, null, null] +26629 - null - [null, null, null, null, null] +26630 - null - [null, null, null, null, null] +26631 - null - [null, null, null, null, null] +26632 - null - [null, null, null, null, null] +26633 - null - [null, null, null, null, null] +26634 - null - [null, null, null, null, null] +26635 - null - [null, null, null, null, null] +26636 - null - [null, null, null, null, null] +26637 - null - [null, null, null, null, null] +26638 - null - [null, null, null, null, null] +26639 - null - [null, null, null, null, null] +26640 - null - [null, null, null, null, null] +26641 - null - [null, null, null, null, null] +26642 - null - [null, null, null, null, null] +26643 - null - [null, null, null, null, null] +26644 - null - [null, null, null, null, null] +26645 - null - [null, null, null, null, null] +26646 - null - [null, null, null, null, null] +26647 - null - [null, null, null, null, null] +26648 - null - [null, null, null, null, null] +26649 - null - [null, null, null, null, null] +26650 - null - [null, null, null, null, null] +26651 - null - [null, null, null, null, null] +26652 - null - [null, null, null, null, null] +26653 - null - [null, null, null, null, null] +26654 - null - [null, null, null, null, null] +26655 - null - [null, null, null, null, null] +26656 - null - [null, null, null, null, null] +26657 - null - [null, null, null, null, null] +26658 - null - [null, null, null, null, null] +26659 - null - [null, null, null, null, null] +26660 - null - [null, null, null, null, null] +26661 - null - [null, null, null, null, null] +26662 - null - [null, null, null, null, null] +26663 - null - [null, null, null, null, null] +26664 - null - [null, null, null, null, null] +26665 - null - [null, null, null, null, null] +26666 - null - [null, null, null, null, null] +26667 - null - [null, null, null, null, null] +26668 - null - [null, null, null, null, null] +26669 - null - [null, null, null, null, null] +26670 - null - [null, null, null, null, null] +26671 - null - [null, null, null, null, null] +26672 - null - [null, null, null, null, null] +26673 - null - [null, null, null, null, null] +26674 - null - [null, null, null, null, null] +26675 - null - [null, null, null, null, null] +26676 - null - [null, null, null, null, null] +26677 - null - [null, null, null, null, null] +26678 - null - [null, null, null, null, null] +26679 - null - [null, null, null, null, null] +26680 - null - [null, null, null, null, null] +26681 - null - [null, null, null, null, null] +26682 - null - [null, null, null, null, null] +26683 - null - [null, null, null, null, null] +26684 - Sewer entrance - [Enter, null, null, null, null] +26685 - Sewer entrance - [Enter, null, null, null, null] +26686 - Sewer entrance - [Enter, null, null, null, null] +26687 - null - [null, null, null, null, null] +26688 - null - [null, null, null, null, null] +26689 - null - [null, null, null, null, null] +26690 - null - [null, null, null, null, null] +26691 - null - [null, null, null, null, null] +26692 - null - [null, null, null, null, null] +26693 - null - [null, null, null, null, null] +26694 - null - [null, null, null, null, null] +26695 - null - [null, null, null, null, null] +26696 - null - [null, null, null, null, null] +26697 - null - [null, null, null, null, null] +26698 - null - [null, null, null, null, null] +26699 - null - [null, null, null, null, null] +26700 - null - [null, null, null, null, null] +26701 - null - [null, null, null, null, null] +26702 - Secure door - [null, null, null, null, null] +26703 - Secure door - [null, null, null, null, null] +26704 - null - [null, null, null, null, null] +26705 - null - [null, null, null, null, null] +26706 - Metal door - [Open, null, null, null, null] +26707 - Metal door - [Close, null, null, null, null] +26708 - Pipe - [null, null, null, null, null] +26709 - Pipe - [null, null, null, null, null] +26710 - Pipe - [null, null, null, null, null] +26711 - Pipe - [null, null, null, null, null] +26712 - null - [null, null, null, null, null] +26713 - Warped tree roots - [Enter, null, null, null, null] +26714 - Warped tree roots - [Enter, null, null, null, null] +26715 - Warped tree roots - [Enter, null, null, null, null] +26716 - Parted tree roots - [null, null, null, null, null] +26717 - Parted tree roots - [null, null, null, null, null] +26718 - Warped tree roots - [null, null, null, null, null] +26719 - Parted tree roots - [null, null, null, null, null] +26720 - Spirit tree - [Talk-to, null, null, null, null] +26721 - Spirit tree - [Talk-to, Teleport, null, null, null] +26722 - Spirit tree - [null, null, null, null, null] +26723 - null - [null, null, null, null, null] +26724 - Tree - [null, null, null, null, null] +26725 - Tree - [Grapple, null, null, null, null] +26726 - Healthorg - [null, null, null, null, null] +26727 - Human food - [null, null, null, null, null] +26728 - Human food - [null, null, null, null, null] +26729 - Human food - [null, null, null, null, null] +26730 - null - [null, null, null, null, null] +26731 - Spirit tree - [null, null, null, null, null] +26732 - Healthorg - [null, null, null, null, null] +26733 - Healthorg - [null, null, null, null, null] +26734 - Alarm button - [null, null, null, null, null] +26735 - null - [null, null, null, null, null] +26736 - null - [null, null, null, null, null] +26737 - null - [null, null, null, null, null] +26738 - null - [null, null, null, null, null] +26739 - null - [null, null, null, null, null] +26740 - null - [null, null, null, null, null] +26741 - null - [null, null, null, null, null] +26742 - Singing bowl - [Inspect, null, Sing-glass, Revert-crystal, null] +26743 - Mahogany chest - [Open, null, null, null, null] +26744 - Mahogany chest - [Search, Close, null, null, null] +26745 - Chest - [Open, null, null, null, null] +26746 - Chest - [Search, Close, null, null, null] +26747 - Chest - [Open, null, null, null, null] +26748 - Chest - [Search, Close, null, null, null] +26749 - Tunnel - [Crawl, null, null, null, null] +26750 - Tunnel - [Crawl, null, null, null, null] +26751 - null - [null, null, null, null, null] +26752 - null - [null, null, null, null, null] +26753 - null - [null, null, null, null, null] +26754 - Tunnel - [Crawl, null, null, null, null] +26755 - null - [null, null, null, null, null] +26756 - null - [null, null, null, null, null] +26757 - null - [null, null, null, null, null] +26758 - null - [null, null, null, null, null] +26759 - null - [null, null, null, null, null] +26760 - null - [null, null, null, null, null] +26761 - null - [null, null, null, null, null] +26762 - Rocks - [null, null, null, null, null] +26763 - Rocks - [null, null, null, null, null] +26764 - Rocks - [null, null, null, null, null] +26765 - Rocks - [null, null, null, null, null] +26766 - Gnome barrel - [null, null, null, null, null] +26767 - Gnome barrels - [null, null, null, null, null] +26768 - Gnome crates - [null, null, null, null, null] +26769 - Gnome crate - [null, null, null, null, null] +26770 - Barrel - [null, null, null, null, null] +26771 - Crate - [Search, null, null, null, null] +26772 - Crate - [Search, null, null, null, null] +26773 - Crate - [Search, null, null, null, null] +26774 - null - [null, null, null, null, null] +26775 - null - [null, null, null, null, null] +26776 - null - [null, null, null, null, null] +26777 - null - [null, null, null, null, null] +26778 - null - [null, null, null, null, null] +26779 - null - [null, null, null, null, null] +26780 - null - [null, null, null, null, null] +26781 - null - [null, null, null, null, null] +26782 - null - [null, null, null, null, null] +26783 - Table - [null, null, null, null, null] +26784 - Stool - [null, null, null, null, null] +26785 - Smashed chair - [null, null, null, null, null] +26786 - null - [null, null, null, null, null] +26787 - Door - [Open, null, null, null, null] +26788 - Yewnock's machine - [null, null, null, null, null] +26789 - Cogs - [null, null, null, null, null] +26790 - null - [null, null, null, null, null] +26791 - Yewnock's machine - [Operate, null, null, null, null] +26792 - Yewnock's exchanger - [Use, null, null, null, null] +26793 - null - [null, null, null, null, null] +26794 - null - [null, null, null, null, null] +26795 - null - [null, null, null, null, null] +26796 - null - [null, null, null, null, null] +26797 - null - [null, null, null, null, null] +26798 - null - [null, null, null, null, null] +26799 - null - [null, null, null, null, null] +26800 - null - [null, null, null, null, null] +26801 - null - [null, null, null, null, null] +26802 - Lectern - [Read, null, null, null, null] +26803 - Hatch door - [Peek, null, null, null, null] +26804 - Hatch door - [Peek, null, null, null, null] +26805 - null - [null, null, null, null, null] +26806 - Staircase - [Climb-up, null, null, null, null] +26807 - Table - [null, J-mod Options, null, null, null] +26808 - Door - [Open, null, null, null, null] +26809 - null - [null, null, null, null, null] +26810 - Door - [Open, null, null, null, null] +26811 - null - [null, null, null, null, null] +26812 - null - [null, null, null, null, null] +26813 - null - [null, null, null, null, null] +26814 - Furnace - [null, Smelt, null, null, null] +26815 - Whetstone - [null, null, null, null, null] +26816 - Lathe - [null, null, null, null, null] +26817 - Anvil - [null, null, null, null, null] +26818 - Bellows - [null, null, null, null, null] +26819 - Cart - [null, null, null, null, null] +26820 - Junk - [null, null, null, null, null] +26821 - null - [null, null, null, null, null] +26822 - null - [null, null, null, null, null] +26823 - Coal - [null, null, null, null, null] +26824 - Coal - [null, null, null, null, null] +26825 - null - [null, null, null, null, null] +26826 - null - [null, null, null, null, null] +26827 - null - [null, null, null, null, null] +26828 - null - [null, null, null, null, null] +26829 - null - [null, null, null, null, null] +26830 - null - [null, null, null, null, null] +26831 - null - [null, null, null, null, null] +26832 - null - [null, null, null, null, null] +26833 - null - [null, null, null, null, null] +26834 - null - [null, null, null, null, null] +26835 - null - [null, null, null, null, null] +26836 - null - [null, null, null, null, null] +26837 - null - [null, null, null, null, null] +26838 - null - [null, null, null, null, null] +26839 - null - [null, null, null, null, null] +26840 - null - [null, null, null, null, null] +26841 - null - [null, null, null, null, null] +26842 - null - [null, null, null, null, null] +26843 - null - [null, null, null, null, null] +26844 - Crack - [Squeeze-through, null, null, null, null] +26845 - Crack - [Squeeze-through, null, null, null, null] +26846 - null - [null, null, null, null, null] +26847 - Runecrafting altar - [Craft-rune, null, null, null, null] +26848 - null - [null, null, null, null, null] +26849 - Ladder - [Climb, null, null, null, null] +26850 - Ladder - [Climb, null, null, null, null] +26851 - Big door - [Close, null, null, null, null] +26852 - Big door - [Close, null, null, null, null] +26853 - null - [null, null, null, null, null] +26854 - null - [null, null, null, null, null] +26855 - null - [null, null, null, null, null] +26856 - null - [null, null, null, null, null] +26857 - null - [null, null, null, null, null] +26858 - null - [null, null, null, null, null] +26859 - null - [null, null, null, null, null] +26860 - null - [null, null, null, null, null] +26861 - null - [null, null, null, null, null] +26862 - null - [null, null, null, null, null] +26863 - null - [null, null, null, null, null] +26864 - null - [null, null, null, null, null] +26865 - null - [null, null, null, null, null] +26866 - null - [null, null, null, null, null] +26867 - null - [null, null, null, null, null] +26868 - null - [null, null, null, null, null] +26869 - null - [null, null, null, null, null] +26870 - null - [null, null, null, null, null] +26871 - null - [null, null, null, null, null] +26872 - null - [null, null, null, null, null] +26873 - null - [null, null, null, null, null] +26874 - null - [null, null, null, null, null] +26875 - null - [null, null, null, null, null] +26876 - null - [null, null, null, null, null] +26877 - null - [null, null, null, null, null] +26878 - null - [null, null, null, null, null] +26879 - null - [null, null, null, null, null] +26880 - null - [null, null, null, null, null] +26881 - null - [null, null, null, null, null] +26882 - null - [null, null, null, null, null] +26883 - null - [null, null, null, null, null] +26884 - Rocks - [Mine, Prospect, hidden, null, null] +26885 - null - [null, null, null, null, null] +26886 - null - [null, null, null, null, null] +26887 - null - [null, null, null, null, null] +26888 - Rocks - [Mine, Prospect, hidden, null, null] +26889 - null - [null, null, null, null, null] +26890 - null - [null, null, null, null, null] +26891 - null - [null, null, null, null, null] +26892 - null - [null, null, null, null, null] +26893 - null - [null, null, null, null, null] +26894 - null - [null, null, null, null, null] +26895 - null - [null, null, null, null, null] +26896 - null - [null, null, null, null, null] +26897 - null - [null, null, null, null, null] +26898 - null - [null, null, null, null, null] +26899 - null - [null, null, null, null, null] +26900 - null - [null, null, null, null, null] +26901 - null - [null, null, null, null, null] +26902 - null - [null, null, null, null, null] +26903 - null - [null, null, null, null, null] +26904 - null - [null, null, null, null, null] +26905 - null - [null, null, null, null, null] +26906 - Large door - [Open, null, null, null, null] +26907 - Large door - [Close, null, null, null, null] +26908 - Large door - [Open, null, null, null, null] +26909 - Large door - [Close, null, null, null, null] +26910 - Large door - [Open, null, null, null, null] +26911 - Large door - [Close, null, null, null, null] +26912 - null - [null, null, null, null, null] +26913 - Large door - [Open, null, null, null, null] +26914 - Large door - [Close, null, null, null, null] +26915 - null - [null, null, null, null, null] +26916 - Door - [Close, null, null, null, null] +26917 - Door - [Open, null, null, null, null] +26918 - Rack - [null, null, null, null, null] +26919 - null - [null, null, null, null, null] +26920 - null - [null, null, null, null, null] +26921 - null - [null, null, null, null, null] +26922 - null - [null, null, null, null, null] +26923 - null - [null, null, null, null, null] +26924 - null - [null, null, null, null, null] +26925 - null - [null, null, null, null, null] +26926 - null - [null, null, null, null, null] +26927 - null - [null, null, null, null, null] +26928 - null - [null, null, null, null, null] +26929 - null - [null, null, null, null, null] +26930 - null - [null, null, null, null, null] +26931 - null - [null, null, null, null, null] +26932 - null - [null, null, null, null, null] +26933 - Trapdoor - [Open, null, null, null, null] +26934 - Trapdoor - [Climb-down, Close, null, null, null] +26935 - Coffin - [Open, null, null, null, null] +26936 - Coffin - [Close, null, null, null, null] +26937 - Coffin - [Open, null, null, null, null] +26938 - Coffin - [Close, null, null, null, null] +26939 - Coffin - [Open, null, null, null, null] +26940 - Coffin - [Close, null, null, null, null] +26941 - Coffin - [Open, null, null, null, null] +26942 - Coffin - [Close, null, null, null, null] +26943 - Coffin - [Open, null, null, null, null] +26944 - Coffin - [Close, null, null, null, null] +26945 - Well - [null, null, null, null, null] +26946 - null - [null, null, null, null, null] +26947 - Warehouse shelves - [null, null, null, null, null] +26948 - Warehouse shelves - [null, null, null, null, null] +26949 - Warehouse shelves - [null, null, null, null, null] +26950 - Warehouse shelves - [null, null, null, null, null] +26951 - Bookcase - [null, null, null, null, null] +26952 - Bookcase - [null, null, null, null, null] +26953 - Stepladder - [null, null, null, null, null] +26954 - Bed - [null, null, null, null, null] +26955 - Bed - [null, null, null, null, null] +26956 - null - [null, null, null, null, null] +26957 - Large table - [null, null, null, null, null] +26958 - Small table - [null, null, null, null, null] +26959 - Small table - [null, null, null, null, null] +26960 - null - [null, null, null, null, null] +26961 - Crate - [Search, null, null, null, null] +26962 - Crates - [Search, null, null, null, null] +26963 - Stool - [null, null, null, null, null] +26964 - null - [null, null, null, null, null] +26965 - null - [null, null, null, null, null] +26966 - Sink - [null, null, null, null, null] +26967 - null - [null, null, null, null, null] +26968 - null - [null, null, null, null, null] +26969 - Bank deposit box - [Deposit, null, null, null, null] +26970 - Bank table - [null, null, null, null, null] +26971 - Sign - [null, null, null, null, null] +26972 - Bank booth - [Use, Use-quickly, Collect, null, null] +26973 - null - [null, null, null, null, null] +26974 - null - [null, null, null, null, null] +26975 - null - [null, null, null, null, null] +26976 - null - [null, null, null, null, null] +26977 - null - [null, null, null, null, null] +26978 - null - [null, null, null, null, null] +26979 - null - [null, null, null, null, null] +26980 - null - [null, null, null, null, null] +26981 - null - [null, null, null, null, null] +26982 - Ladder - [Climb-up, null, null, null, null] +26983 - Ladder - [Climb-down, null, null, null, null] +26984 - null - [null, null, null, null, null] +26985 - null - [null, null, null, null, null] +26986 - null - [null, null, null, null, null] +26987 - null - [null, null, null, null, null] +26988 - null - [null, null, null, null, null] +26989 - null - [null, null, null, null, null] +26990 - null - [null, null, null, null, null] +26991 - null - [null, null, null, null, null] +26992 - null - [null, null, null, null, null] +26993 - null - [null, null, null, null, null] +26994 - null - [null, null, null, null, null] +26995 - null - [null, null, null, null, null] +26996 - null - [null, null, null, null, null] +26997 - null - [null, null, null, null, null] +26998 - null - [null, null, null, null, null] +26999 - null - [null, null, null, null, null] +27000 - null - [null, null, null, null, null] +27001 - null - [null, null, null, null, null] +27002 - null - [null, null, null, null, null] +27003 - null - [null, null, null, null, null] +27004 - null - [null, null, null, null, null] +27005 - Suit of armour - [null, null, null, null, null] +27006 - Hanging banner - [null, null, null, null, null] +27007 - Hanging banner - [null, null, null, null, null] +27008 - Clothes equipment - [null, null, null, null, null] +27009 - null - [null, null, null, null, null] +27010 - Staircase - [Climb, null, null, null, null] +27011 - Staircase - [Climb, null, null, null, null] +27012 - Crate - [Search, null, null, null, null] +27013 - Crate - [Search, null, null, null, null] +27014 - Table - [Take-from, null, null, null, null] +27015 - Crate - [Search, null, null, null, null] +27016 - Boxes - [Search, null, null, null, null] +27017 - Crate - [Search, null, null, null, null] +27018 - null - [null, null, null, null, null] +27019 - null - [null, null, null, null, null] +27020 - null - [null, null, null, null, null] +27021 - null - [null, null, null, null, null] +27022 - Jade vine patch - [null, Inspect, null, Guide, null] +27023 - Jade vine patch - [null, Inspect, null, Guide, null] +27024 - Jade vine patch - [null, Inspect, null, Guide, null] +27025 - Jade vine patch - [null, Inspect, null, Guide, null] +27026 - Jade vine - [null, Inspect, null, Guide, null] +27027 - Jade vine - [null, Inspect, null, Guide, null] +27028 - Jade vine - [null, Inspect, null, Guide, null] +27029 - Jade vine - [null, Inspect, null, Guide, null] +27030 - Jade vine - [null, Inspect, null, Guide, null] +27031 - Jade vine - [null, Inspect, null, Guide, null] +27032 - Jade vine - [null, Inspect, null, Guide, null] +27033 - Jade vine - [Check-health, Inspect, null, Guide, null] +27034 - Jade vine - [Prune, Inspect, null, Guide, null] +27035 - Jade vine - [Prune, Inspect, null, Guide, null] +27036 - Jade vine - [Prune, Inspect, null, Guide, null] +27037 - Jade vine - [Prune, Inspect, null, Guide, null] +27038 - Jade vine - [Prune, Inspect, null, Guide, null] +27039 - Jade vine - [Attack, null, null, null, null] +27040 - Diseased jade vine - [null, Inspect, null, Guide, null] +27041 - Diseased jade vine - [null, Inspect, null, Guide, null] +27042 - Diseased jade vine - [null, Inspect, null, Guide, null] +27043 - Diseased jade vine - [null, Inspect, null, Guide, null] +27044 - Diseased jade vine - [null, Inspect, null, Guide, null] +27045 - Dead jade vine - [null, Inspect, null, Guide, null] +27046 - Dead jade vine - [null, Inspect, null, Guide, null] +27047 - Dead jade vine - [null, Inspect, null, Guide, null] +27048 - Dead jade vine - [null, Inspect, null, Guide, null] +27049 - Dead jade vine - [null, Inspect, null, Guide, null] +27050 - null - [null, null, null, null, null] +27051 - Grandfather clock - [null, null, null, null, null] +27052 - Table - [null, null, null, null, null] +27053 - A parcel - [null, null, null, null, null] +27054 - Smelly package - [null, null, null, null, null] +27055 - Smelly package - [Open, null, null, null, null] +27056 - Table - [null, null, null, null, null] +27057 - Open package - [null, null, null, null, null] +27058 - Loose soil - [Dig, null, null, null, null] +27059 - Roots - [Cut, null, null, null, null] +27060 - Cut roots - [null, null, null, null, null] +27061 - Horacio's jade vine patch - [null, null, null, null, null] +27062 - Wild jade vine - [Attack, null, null, null, null] +27063 - Horacio's patch - [null, null, null, null, null] +27064 - Horacio's jade vine patch - [null, null, null, null, null] +27065 - Gate - [Open, null, null, null, null] +27066 - Gate - [Open, null, null, null, null] +27067 - Grave - [null, null, null, null, null] +27068 - Grave - [null, null, null, null, null] +27069 - null - [null, null, null, null, null] +27070 - Loose earth - [null, null, null, null, null] +27071 - Exposed root - [null, null, null, null, null] +27072 - Cut root - [null, null, null, null, null] +27073 - Ugly flowerbed - [null, null, null, null, null] +27074 - Beautiful flowerbed - [null, null, null, null, null] +27075 - null - [null, null, null, null, null] +27076 - Wild jade vine - [null, null, null, null, null] +27077 - Wild jade vine - [null, null, null, null, null] +27078 - Wild jade vine - [Cut, null, null, null, null] +27079 - null - [null, null, null, null, null] +27080 - null - [null, null, null, null, null] +27081 - null - [null, null, null, null, null] +27082 - Counter - [null, null, null, null, null] +27083 - Table - [null, null, null, null, null] +27084 - Barrel - [null, null, null, null, null] +27085 - Boxes - [Search, null, null, null, null] +27086 - Crates - [Search, null, null, null, null] +27087 - Crate - [Search, null, null, null, null] +27088 - null - [null, null, null, null, null] +27089 - Tree - [null, null, null, null, null] +27090 - null - [null, null, null, null, null] +27091 - null - [null, null, null, null, null] +27092 - null - [null, null, null, null, null] +27093 - null - [null, null, null, null, null] +27094 - null - [null, null, null, null, null] +27095 - null - [null, null, null, null, null] +27096 - null - [null, null, null, null, null] +27097 - null - [null, null, null, null, null] +27098 - null - [null, null, null, null, null] +27099 - null - [null, null, null, null, null] +27100 - null - [null, null, null, null, null] +27101 - null - [null, null, null, null, null] +27102 - null - [null, null, null, null, null] +27103 - null - [null, null, null, null, null] +27104 - null - [null, null, null, null, null] +27105 - null - [null, null, null, null, null] +27106 - null - [null, null, null, null, null] +27107 - null - [null, null, null, null, null] +27108 - null - [null, null, null, null, null] +27109 - null - [null, null, null, null, null] +27110 - null - [null, null, null, null, null] +27111 - null - [null, null, null, null, null] +27112 - null - [null, null, null, null, null] +27113 - null - [null, null, null, null, null] +27114 - null - [null, null, null, null, null] +27115 - null - [null, null, null, null, null] +27116 - null - [null, null, null, null, null] +27117 - null - [null, null, null, null, null] +27118 - null - [null, null, null, null, null] +27119 - null - [null, null, null, null, null] +27120 - null - [null, null, null, null, null] +27121 - null - [null, null, null, null, null] +27122 - null - [null, null, null, null, null] +27123 - null - [null, null, null, null, null] +27124 - null - [null, null, null, null, null] +27125 - null - [null, null, null, null, null] +27126 - Vine - [Climb-up, null, null, null, null] +27127 - null - [null, null, null, null, null] +27128 - Vine - [Climb-up, null, null, null, null] +27129 - Vine - [Climb-down, null, null, null, null] +27130 - Vine - [Climb-down, null, null, null, null] +27131 - null - [null, null, null, null, null] +27132 - Vine - [null, null, null, null, null] +27133 - Vine - [null, null, null, null, null] +27134 - null - [null, null, null, null, null] +27135 - null - [null, null, null, null, null] +27136 - null - [null, null, null, null, null] +27137 - null - [null, null, null, null, null] +27138 - null - [null, null, null, null, null] +27139 - null - [null, null, null, null, null] +27140 - null - [null, null, null, null, null] +27141 - null - [null, null, null, null, null] +27142 - null - [null, null, null, null, null] +27143 - null - [null, null, null, null, null] +27144 - null - [null, null, null, null, null] +27145 - null - [null, null, null, null, null] +27146 - null - [null, null, null, null, null] +27147 - null - [null, null, null, null, null] +27148 - null - [null, null, null, null, null] +27149 - null - [null, null, null, null, null] +27150 - null - [null, null, null, null, null] +27151 - Vine - [Climb-up, null, null, null, null] +27152 - Vine - [Climb-up, null, null, null, null] +27153 - null - [null, null, null, null, null] +27154 - null - [null, null, null, null, null] +27155 - null - [null, null, null, null, null] +27156 - null - [null, null, null, null, null] +27157 - null - [null, null, null, null, null] +27158 - null - [null, null, null, null, null] +27159 - null - [null, null, null, null, null] +27160 - null - [null, null, null, null, null] +27161 - null - [null, null, null, null, null] +27162 - null - [null, null, null, null, null] +27163 - null - [null, null, null, null, null] +27164 - null - [null, null, null, null, null] +27165 - null - [null, null, null, null, null] +27166 - null - [null, null, null, null, null] +27167 - null - [null, null, null, null, null] +27168 - null - [null, null, null, null, null] +27169 - null - [null, null, null, null, null] +27170 - null - [null, null, null, null, null] +27171 - null - [null, null, null, null, null] +27172 - null - [null, null, null, null, null] +27173 - Vines - [null, null, null, Cut, null] +27174 - Cut vines - [Crawl-through, null, null, null, null] +27175 - Vines - [Squeeze-through, null, null, null, null] +27176 - Vines - [Crawl-through, null, null, null, null] +27177 - null - [null, null, null, null, null] +27178 - null - [null, null, null, null, null] +27179 - null - [null, null, null, null, null] +27180 - Vine - [Swing-on, null, null, null, null] +27181 - Vine - [Enter, null, null, null, null] +27182 - Vine - [Enter, null, null, null, null] +27183 - null - [null, null, null, null, null] +27184 - null - [null, null, null, null, null] +27185 - Vine - [Cross, null, null, null, null] +27186 - Hole - [Enter, null, null, null, null] +27187 - Wasp nest - [null, null, null, null, null] +27188 - null - [null, null, null, null, null] +27189 - null - [null, null, null, null, null] +27190 - null - [null, null, null, null, null] +27191 - null - [null, null, null, null, null] +27192 - null - [null, null, null, null, null] +27193 - null - [null, null, null, null, null] +27194 - null - [null, null, null, null, null] +27195 - null - [null, null, null, null, null] +27196 - null - [null, null, null, null, null] +27197 - null - [null, null, null, null, null] +27198 - null - [null, null, null, null, null] +27199 - null - [null, null, null, null, null] +27200 - null - [null, null, null, null, null] +27201 - Bush - [null, null, null, null, null] +27202 - null - [null, null, null, null, null] +27203 - null - [null, null, null, null, null] +27204 - null - [null, null, null, null, null] +27205 - null - [null, null, null, null, null] +27206 - null - [null, null, null, null, null] +27207 - null - [null, null, null, null, null] +27208 - null - [null, null, null, null, null] +27209 - null - [null, null, null, null, null] +27210 - null - [null, null, null, null, null] +27211 - Ramp - [Exit, null, null, null, null] +27212 - Ramp - [Enter, null, null, null, null] +27213 - null - [null, null, null, null, null] +27214 - null - [null, null, null, null, null] +27215 - null - [null, null, null, null, null] +27216 - null - [null, null, null, null, null] +27217 - null - [null, null, null, null, null] +27218 - Slide - [Slide-down, null, null, null, null] +27219 - null - [null, null, null, null, null] +27220 - null - [null, null, null, null, null] +27221 - null - [null, null, null, null, null] +27222 - null - [null, null, null, null, null] +27223 - null - [null, null, null, null, null] +27224 - null - [null, null, null, null, null] +27225 - null - [null, null, null, null, null] +27226 - null - [null, null, null, null, null] +27227 - null - [null, null, null, null, null] +27228 - null - [null, null, null, null, null] +27229 - null - [null, null, null, null, null] +27230 - null - [null, null, null, null, null] +27231 - null - [null, null, null, null, null] +27232 - null - [null, null, null, null, null] +27233 - null - [null, null, null, null, null] +27234 - null - [null, null, null, null, null] +27235 - null - [null, null, null, null, null] +27236 - null - [null, null, null, null, null] +27237 - null - [null, null, null, null, null] +27238 - null - [null, null, null, null, null] +27239 - null - [null, null, null, null, null] +27240 - Pitfall - [null, null, null, null, null] +27241 - Torch - [null, null, null, null, null] +27242 - Staircase - [Climb-up, null, null, null, null] +27243 - Staircase - [Climb-down, null, null, null, null] +27244 - Chair - [null, null, null, null, null] +27245 - Table - [Search, null, null, null, null] +27246 - Cabinets - [Search, null, null, null, null] +27247 - Cabinets - [Search, null, null, null, null] +27248 - Bookcases - [Search, null, null, null, null] +27249 - Bookcases - [Search, null, null, null, null] +27250 - Bookcases - [Search, null, null, null, null] +27251 - Fireplace - [Search, null, null, null, null] +27252 - Sofa - [Search, null, null, null, null] +27253 - Fishtank - [Search, null, null, null, null] +27254 - Dark portal - [Enter, null, null, null, null] +27255 - Grim chest - [Open, null, null, null, null] +27256 - Grim chest - [Search, null, null, null, null] +27257 - Skull - [Pick-up, null, null, null, null] +27258 - Skeleton portrait - [null, null, null, null, null] +27259 - Zombie portrait - [null, null, null, null, null] +27260 - Shelves - [Search, null, null, null, null] +27261 - Shelves - [Search, null, null, null, null] +27262 - Sullen tree - [null, null, null, null, null] +27263 - Bleak tree - [null, null, null, null, null] +27264 - Foul tree - [null, null, null, null, null] +27265 - Wretched tree - [null, null, null, null, null] +27266 - Spider web - [Pass, null, null, null, null] +27267 - null - [null, null, null, null, null] +27268 - null - [null, null, null, null, null] +27269 - null - [null, null, null, null, null] +27270 - null - [null, null, null, null, null] +27271 - null - [null, null, null, null, null] +27272 - null - [null, null, null, null, null] +27273 - null - [null, null, null, null, null] +27274 - Gargoyle - [null, null, null, null, null] +27275 - Gargoyle - [null, null, null, null, null] +27276 - Doorway - [Pass, null, null, null, null] +27277 - null - [null, null, null, null, null] +27278 - Springboard - [Step-on, null, null, null, null] +27279 - null - [null, null, null, null, null] +27280 - Worm - [null, null, null, null, null] +27281 - Cursed tree - [null, null, null, null, null] +27282 - Doorway - [null, null, null, null, null] +27283 - Grave - [Say-name, null, null, null, null] +27284 - Grave - [Say-name, null, null, null, null] +27285 - Grave - [Say-name, null, null, null, null] +27286 - Grave - [Say-name, null, null, null, null] +27287 - Grave - [Say-name, null, null, null, null] +27288 - Grave - [null, null, null, null, null] +27289 - null - [null, null, null, null, null] +27290 - null - [null, null, null, null, null] +27291 - null - [null, null, null, null, null] +27292 - null - [null, null, null, null, null] +27293 - null - [null, null, null, null, null] +27294 - Tendrils - [null, null, null, null, null] +27295 - Tendrils - [null, null, null, null, null] +27296 - Tendrils - [null, null, null, null, null] +27297 - Fire - [null, null, null, null, null] +27298 - null - [null, null, null, null, null] +27299 - null - [null, null, null, null, null] +27300 - null - [null, null, null, null, null] +27301 - null - [null, null, null, null, null] +27302 - null - [null, null, null, null, null] +27303 - null - [null, null, null, null, null] +27304 - null - [null, null, null, null, null] +27305 - Crate - [Search, null, null, null, null] +27306 - Altar - [Pray-at, null, null, null, null] +27307 - Altar - [null, null, null, null, null] +27308 - Altar - [null, null, null, null, null] +27309 - Altar - [null, null, null, null, null] +27310 - null - [null, null, null, null, null] +27311 - null - [null, null, null, null, null] +27312 - null - [null, null, null, null, null] +27313 - null - [null, null, null, null, null] +27314 - Stone pew - [null, null, null, null, null] +27315 - Stool - [null, null, null, null, null] +27316 - null - [null, null, null, null, null] +27317 - null - [null, null, null, null, null] +27318 - null - [null, null, null, null, null] +27319 - null - [null, null, null, null, null] +27320 - Machine - [Adjust, null, null, null, null] +27321 - Rock wall - [null, null, null, null, null] +27322 - null - [null, null, null, null, null] +27323 - null - [null, null, null, null, null] +27324 - null - [null, null, null, null, null] +27325 - Fairy ring - [Use, null, null, null, null] +27326 - null - [null, null, null, null, null] +27327 - null - [null, null, null, null, null] +27328 - null - [null, null, null, null, null] +27329 - Fairy portal - [null, null, null, null, null] +27330 - Fairy portal - [null, null, null, null, null] +27331 - null - [null, null, null, null, null] +27332 - Door - [Open, null, null, null, null] +27333 - Door - [Open, null, null, null, null] +27334 - Altar - [null, null, null, null, null] +27335 - null - [null, null, null, null, null] +27336 - null - [null, null, null, null, null] +27337 - null - [null, null, null, null, null] +27338 - Altar - [Pray-at, null, null, null, null] +27339 - Altar - [Pray-at, null, null, null, null] +27340 - Archway - [null, null, null, null, null] +27341 - Mushroom tree - [null, null, null, null, null] +27342 - Mushroom tree - [null, null, null, null, null] +27343 - Mushroom tree - [null, null, null, null, null] +27344 - Plant - [null, null, null, null, null] +27345 - Plants - [null, null, null, null, null] +27346 - Plant - [null, null, null, null, null] +27347 - Plant - [null, null, null, null, null] +27348 - Plant - [null, null, null, null, null] +27349 - null - [null, null, null, null, null] +27350 - null - [null, null, null, null, null] +27351 - null - [null, null, null, null, null] +27352 - null - [null, null, null, null, null] +27353 - null - [null, null, null, null, null] +27354 - Tent - [null, null, null, null, null] +27355 - Plant - [null, null, null, null, null] +27356 - Plant - [null, null, null, null, null] +27357 - Plant - [null, null, null, null, null] +27358 - null - [null, null, null, null, null] +27359 - null - [null, null, null, null, null] +27360 - null - [null, null, null, null, null] +27361 - null - [null, null, null, null, null] +27362 - null - [null, null, null, null, null] +27363 - null - [null, null, null, null, null] +27364 - null - [null, null, null, null, null] +27365 - null - [null, null, null, null, null] +27366 - null - [null, null, null, null, null] +27367 - null - [null, null, null, null, null] +27368 - null - [null, null, null, null, null] +27369 - null - [null, null, null, null, null] +27370 - null - [null, null, null, null, null] +27371 - null - [null, null, null, null, null] +27372 - null - [null, null, null, null, null] +27373 - null - [null, null, null, null, null] +27374 - null - [null, null, null, null, null] +27375 - null - [null, null, null, null, null] +27376 - null - [null, null, null, null, null] +27377 - null - [null, null, null, null, null] +27378 - null - [null, null, null, null, null] +27379 - null - [null, null, null, null, null] +27380 - null - [null, null, null, null, null] +27381 - null - [null, null, null, null, null] +27382 - null - [null, null, null, null, null] +27383 - null - [null, null, null, null, null] +27384 - null - [null, null, null, null, null] +27385 - null - [null, null, null, null, null] +27386 - null - [null, null, null, null, null] +27387 - null - [null, null, null, null, null] +27388 - null - [null, null, null, null, null] +27389 - null - [null, null, null, null, null] +27390 - null - [null, null, null, null, null] +27391 - null - [null, null, null, null, null] +27392 - null - [null, null, null, null, null] +27393 - null - [null, null, null, null, null] +27394 - null - [null, null, null, null, null] +27395 - null - [null, null, null, null, null] +27396 - null - [null, null, null, null, null] +27397 - null - [null, null, null, null, null] +27398 - null - [null, null, null, null, null] +27399 - null - [null, null, null, null, null] +27400 - null - [null, null, null, null, null] +27401 - null - [null, null, null, null, null] +27402 - null - [null, null, null, null, null] +27403 - null - [null, null, null, null, null] +27404 - null - [null, null, null, null, null] +27405 - null - [null, null, null, null, null] +27406 - null - [null, null, null, null, null] +27407 - null - [null, null, null, null, null] +27408 - null - [null, null, null, null, null] +27409 - null - [null, null, null, null, null] +27410 - null - [null, null, null, null, null] +27411 - null - [null, null, null, null, null] +27412 - null - [null, null, null, null, null] +27413 - null - [null, null, null, null, null] +27414 - null - [null, null, null, null, null] +27415 - null - [null, null, null, null, null] +27416 - null - [null, null, null, null, null] +27417 - null - [null, null, null, null, null] +27418 - null - [null, null, null, null, null] +27419 - null - [null, null, null, null, null] +27420 - null - [null, null, null, null, null] +27421 - null - [null, null, null, null, null] +27422 - null - [null, null, null, null, null] +27423 - null - [null, null, null, null, null] +27424 - null - [null, null, null, null, null] +27425 - null - [null, null, null, null, null] +27426 - null - [null, null, null, null, null] +27427 - null - [null, null, null, null, null] +27428 - null - [null, null, null, null, null] +27429 - null - [null, null, null, null, null] +27430 - null - [null, null, null, null, null] +27431 - null - [null, null, null, null, null] +27432 - null - [null, null, null, null, null] +27433 - null - [null, null, null, null, null] +27434 - null - [null, null, null, null, null] +27435 - null - [null, null, null, null, null] +27436 - null - [null, null, null, null, null] +27437 - null - [null, null, null, null, null] +27438 - null - [null, null, null, null, null] +27439 - null - [null, null, null, null, null] +27440 - null - [null, null, null, null, null] +27441 - null - [null, null, null, null, null] +27442 - null - [null, null, null, null, null] +27443 - null - [null, null, null, null, null] +27444 - null - [null, null, null, null, null] +27445 - null - [null, null, null, null, null] +27446 - null - [null, null, null, null, null] +27447 - null - [null, null, null, null, null] +27448 - null - [null, null, null, null, null] +27449 - null - [null, null, null, null, null] +27450 - null - [null, null, null, null, null] +27451 - null - [null, null, null, null, null] +27452 - null - [null, null, null, null, null] +27453 - null - [null, null, null, null, null] +27454 - null - [null, null, null, null, null] +27455 - null - [null, null, null, null, null] +27456 - null - [null, null, null, null, null] +27457 - null - [null, null, null, null, null] +27458 - null - [null, null, null, null, null] +27459 - null - [null, null, null, null, null] +27460 - null - [null, null, null, null, null] +27461 - null - [null, null, null, null, null] +27462 - null - [null, null, null, null, null] +27463 - null - [null, null, null, null, null] +27464 - null - [null, null, null, null, null] +27465 - null - [null, null, null, null, null] +27466 - null - [null, null, null, null, null] +27467 - null - [null, null, null, null, null] +27468 - null - [null, null, null, null, null] +27469 - null - [null, null, null, null, null] +27470 - null - [null, null, null, null, null] +27471 - null - [null, null, null, null, null] +27472 - null - [null, null, null, null, null] +27473 - null - [null, null, null, null, null] +27474 - null - [null, null, null, null, null] +27475 - null - [null, null, null, null, null] +27476 - null - [null, null, null, null, null] +27477 - null - [null, null, null, null, null] +27478 - null - [null, null, null, null, null] +27479 - null - [null, null, null, null, null] +27480 - null - [null, null, null, null, null] +27481 - null - [null, null, null, null, null] +27482 - null - [null, null, null, null, null] +27483 - null - [null, null, null, null, null] +27484 - null - [null, null, null, null, null] +27485 - null - [null, null, null, null, null] +27486 - null - [null, null, null, null, null] +27487 - null - [null, null, null, null, null] +27488 - null - [null, null, null, null, null] +27489 - null - [null, null, null, null, null] +27490 - null - [null, null, null, null, null] +27491 - null - [null, null, null, null, null] +27492 - null - [null, null, null, null, null] +27493 - null - [null, null, null, null, null] +27494 - null - [null, null, null, null, null] +27495 - null - [null, null, null, null, null] +27496 - null - [null, null, null, null, null] +27497 - null - [null, null, null, null, null] +27498 - null - [null, null, null, null, null] +27499 - null - [null, null, null, null, null] +27500 - null - [null, null, null, null, null] +27501 - null - [null, null, null, null, null] +27502 - null - [null, null, null, null, null] +27503 - null - [null, null, null, null, null] +27504 - null - [null, null, null, null, null] +27505 - null - [null, null, null, null, null] +27506 - null - [null, null, null, null, null] +27507 - null - [null, null, null, null, null] +27508 - null - [null, null, null, null, null] +27509 - null - [null, null, null, null, null] +27510 - null - [null, null, null, null, null] +27511 - null - [null, null, null, null, null] +27512 - null - [null, null, null, null, null] +27513 - null - [null, null, null, null, null] +27514 - null - [null, null, null, null, null] +27515 - null - [null, null, null, null, null] +27516 - null - [null, null, null, null, null] +27517 - null - [null, null, null, null, null] +27518 - null - [null, null, null, null, null] +27519 - null - [null, null, null, null, null] +27520 - null - [null, null, null, null, null] +27521 - null - [null, null, null, null, null] +27522 - null - [null, null, null, null, null] +27523 - null - [null, null, null, null, null] +27524 - null - [null, null, null, null, null] +27525 - Prison door - [Talk-through, null, null, null, null] +27526 - Prison door - [null, null, null, null, null] +27527 - Candle - [null, null, null, null, null] +27528 - null - [null, null, null, null, null] +27529 - Crater - [null, null, null, null, null] +27530 - Crater - [null, null, null, null, null] +27531 - Crater - [null, null, null, null, null] +27532 - null - [null, null, null, null, null] +27533 - null - [null, null, null, null, null] +27534 - null - [null, null, null, null, null] +27535 - null - [null, null, null, null, null] +27536 - null - [null, null, null, null, null] +27537 - null - [null, null, null, null, null] +27538 - null - [null, null, null, null, null] +27539 - null - [null, null, null, null, null] +27540 - null - [null, null, null, null, null] +27541 - null - [null, null, null, null, null] +27542 - null - [null, null, null, null, null] +27543 - Stairs - [Climb-down, null, null, null, null] +27544 - null - [null, null, null, null, null] +27545 - null - [null, null, null, null, null] +27546 - null - [null, null, null, null, null] +27547 - null - [null, null, null, null, null] +27548 - null - [null, null, null, null, null] +27549 - null - [null, null, null, null, null] +27550 - null - [null, null, null, null, null] +27551 - null - [null, null, null, null, null] +27552 - null - [null, null, null, null, null] +27553 - null - [null, null, null, null, null] +27554 - null - [null, null, null, null, null] +27555 - null - [null, null, null, null, null] +27556 - null - [null, null, null, null, null] +27557 - null - [null, null, null, null, null] +27558 - null - [null, null, null, null, null] +27559 - null - [null, null, null, null, null] +27560 - Gate - [Open, null, null, null, null] +27561 - Goblin door - [null, null, null, null, null] +27562 - null - [null, null, null, null, null] +27563 - null - [null, null, null, null, null] +27564 - null - [null, null, null, null, null] +27565 - null - [null, null, null, null, null] +27566 - null - [null, null, null, null, null] +27567 - Portal - [Enter, null, null, null, null] +27568 - Portal - [Enter, null, null, null, null] +27569 - null - [null, null, null, null, null] +27570 - null - [null, null, null, null, null] +27571 - null - [null, null, null, null, null] +27572 - null - [null, null, null, null, null] +27573 - null - [null, null, null, null, null] +27574 - null - [null, null, null, null, null] +27575 - null - [null, null, null, null, null] +27576 - null - [null, null, null, null, null] +27577 - null - [null, null, null, null, null] +27578 - null - [null, null, null, null, null] +27579 - null - [null, null, null, null, null] +27580 - null - [null, null, null, null, null] +27581 - null - [null, null, null, null, null] +27582 - null - [null, null, null, null, null] +27583 - null - [null, null, null, null, null] +27584 - null - [null, null, null, null, null] +27585 - null - [null, null, null, null, null] +27586 - null - [null, null, null, null, null] +27587 - null - [null, null, null, null, null] +27588 - null - [null, null, null, null, null] +27589 - null - [null, null, null, null, null] +27590 - null - [null, null, null, null, null] +27591 - null - [null, null, null, null, null] +27592 - null - [null, null, null, null, null] +27593 - null - [null, null, null, null, null] +27594 - null - [null, null, null, null, null] +27595 - null - [null, null, null, null, null] +27596 - null - [null, null, null, null, null] +27597 - null - [null, null, null, null, null] +27598 - null - [null, null, null, null, null] +27599 - null - [null, null, null, null, null] +27600 - null - [null, null, null, null, null] +27601 - null - [null, null, null, null, null] +27602 - null - [null, null, null, null, null] +27603 - null - [null, null, null, null, null] +27604 - null - [null, null, null, null, null] +27605 - null - [null, null, null, null, null] +27606 - null - [null, null, null, null, null] +27607 - null - [null, null, null, null, null] +27608 - null - [null, null, null, null, null] +27609 - null - [null, null, null, null, null] +27610 - null - [null, null, null, null, null] +27611 - null - [null, null, null, null, null] +27612 - null - [null, null, null, null, null] +27613 - null - [null, null, null, null, null] +27614 - null - [null, null, null, null, null] +27615 - Oozing rock - [null, null, null, null, null] +27616 - null - [null, null, null, null, null] +27617 - null - [null, null, null, null, null] +27618 - null - [null, null, null, null, null] +27619 - null - [null, null, null, null, null] +27620 - null - [null, null, null, null, null] +27621 - null - [null, null, null, null, null] +27622 - null - [null, null, null, null, null] +27623 - null - [null, null, null, null, null] +27624 - null - [null, null, null, null, null] +27625 - null - [null, null, null, null, null] +27626 - null - [null, null, null, null, null] +27627 - null - [null, null, null, null, null] +27628 - null - [null, null, null, null, null] +27629 - null - [null, null, null, null, null] +27630 - null - [null, null, null, null, null] +27631 - null - [null, null, null, null, null] +27632 - null - [null, null, null, null, null] +27633 - null - [null, null, null, null, null] +27634 - null - [null, null, null, null, null] +27635 - null - [null, null, null, null, null] +27636 - null - [null, null, null, null, null] +27637 - null - [null, null, null, null, null] +27638 - null - [null, null, null, null, null] +27639 - null - [null, null, null, null, null] +27640 - null - [null, null, null, null, null] +27641 - null - [null, null, null, null, null] +27642 - null - [null, null, null, null, null] +27643 - null - [null, null, null, null, null] +27644 - null - [null, null, null, null, null] +27645 - null - [null, null, null, null, null] +27646 - null - [null, null, null, null, null] +27647 - null - [null, null, null, null, null] +27648 - null - [null, null, null, null, null] +27649 - null - [null, null, null, null, null] +27650 - null - [null, null, null, null, null] +27651 - null - [null, null, null, null, null] +27652 - null - [null, null, null, null, null] +27653 - null - [null, null, null, null, null] +27654 - Strange box - [Open, null, null, null, null] +27655 - Strange box - [null, null, null, null, null] +27656 - Strange box - [null, null, null, null, null] +27657 - null - [null, null, null, null, null] +27658 - null - [null, null, null, null, null] +27659 - null - [null, null, null, null, null] +27660 - null - [null, null, null, null, null] +27661 - Altar - [Pray-at, null, null, null, null] +27662 - Bank chest - [Open, null, null, null, null] +27663 - Bank chest - [null, Bank, null, null, null] +27664 - null - [null, null, null, null, null] +27665 - null - [null, null, null, null, null] +27666 - null - [null, null, null, null, null] +27667 - Bookcase - [null, null, null, null, null] +27668 - Tournament exit - [Climb-up, null, null, null, null] +27669 - Tournament entrance - [Climb-down, null, null, null, null] +27670 - Roof - [null, null, null, null, null] +27671 - null - [null, null, null, null, null] +27672 - Stool - [null, null, null, null, null] +27673 - Hospital bench - [null, null, null, null, null] +27674 - null - [Close, null, null, null, null] +27675 - Door - [Open, null, null, null, null] +27676 - Drawers - [null, null, null, null, null] +27677 - Drawers - [null, null, null, null, null] +27678 - Drawers - [null, null, null, null, null] +27679 - Drawers - [null, null, null, null, null] +27680 - Upcoming tournament rules - [View, null, null, null, null] +27681 - Upcoming tournament rules - [View, null, null, null, null] +27682 - Upcoming tournament rules - [View, null, null, null, null] +27683 - Upcoming tournament rules - [View, null, null, null, null] +27684 - Ladder - [Climb-down, null, null, null, null] +27685 - Ladder - [Climb-up, null, null, null, null] +27686 - Trapdoor - [Forfeit, null, null, null, null] +27687 - Entrance - [Forfeit, null, null, null, null] +27688 - Entrance - [Forfeit, null, null, null, null] +27689 - Entrance - [Forfeit, null, null, null, null] +27690 - Entrance - [Forfeit, null, null, null, null] +27691 - Entrance - [Forfeit, null, null, null, null] +27692 - Entrance - [Forfeit, null, null, null, null] +27693 - Wall - [null, null, null, null, Lean against] +27694 - Wall - [null, null, null, null, Lean against] +27695 - Wall - [null, null, null, null, Lean against] +27696 - Wall - [null, null, null, null, Lean against] +27697 - Wall - [null, null, null, null, Lean against] +27698 - Tournament scoreboard - [View, null, null, null, null] +27699 - KO Board - Arena 2 - [View, null, null, null, null] +27700 - KO Board - Arena 2 - [View, null, null, null, null] +27701 - KO Board - Arena 3 - [View, null, null, null, null] +27702 - KO Board - Arena 4 - [View, null, null, null, null] +27703 - KO Board - Arena 5 - [View, null, null, null, null] +27704 - KO Board - Arena 6 - [View, null, null, null, null] +27705 - null - [null, null, null, null, null] +27706 - Crates - [null, null, null, null, null] +27707 - Crates - [null, null, null, null, null] +27708 - Crate - [null, null, null, null, null] +27709 - Barrel - [null, null, null, null, null] +27710 - Barrel - [null, null, null, null, null] +27711 - Barrel - [null, null, null, null, null] +27712 - Barrel - [null, null, null, null, null] +27713 - Barrel of swords - [null, null, null, null, null] +27714 - Bench - [null, null, null, null, null] +27715 - Operation lights - [null, null, null, null, null] +27716 - Drip - [null, null, null, null, null] +27717 - Hospital bed - [null, null, null, null, null] +27718 - Hospital bed - [null, null, null, null, null] +27719 - Hospital bed - [null, null, null, null, null] +27720 - Shelves - [null, null, null, null, null] +27721 - Cabinet - [null, null, null, null, null] +27722 - Shelves - [null, null, null, null, null] +27723 - Shelves - [null, null, null, null, null] +27724 - Shelves - [null, null, null, null, null] +27725 - Shelves - [null, null, null, null, null] +27726 - Shelves - [null, null, null, null, null] +27727 - Boxes - [null, null, null, null, null] +27728 - Boxes - [null, null, null, null, null] +27729 - Boxes - [null, null, null, null, null] +27730 - Crate - [null, null, null, null, null] +27731 - Hospital chair - [null, null, null, null, null] +27732 - Hospital chair - [null, null, null, null, null] +27733 - null - [null, null, null, null, null] +27734 - null - [null, null, null, null, null] +27735 - null - [null, null, null, null, null] +27736 - null - [null, null, null, null, null] +27737 - null - [null, null, null, null, null] +27738 - null - [null, null, null, null, null] +27739 - null - [null, null, null, null, null] +27740 - null - [null, null, null, null, null] +27741 - null - [null, null, null, null, null] +27742 - null - [null, null, null, null, null] +27743 - null - [null, null, null, null, null] +27744 - null - [null, null, null, null, null] +27745 - null - [null, null, null, null, null] +27746 - null - [null, null, null, null, null] +27747 - null - [null, null, null, null, null] +27748 - null - [null, null, null, null, null] +27749 - null - [null, null, null, null, null] +27750 - null - [null, null, null, null, null] +27751 - null - [null, null, null, null, null] +27752 - null - [null, null, null, null, null] +27753 - null - [null, null, null, null, null] +27754 - null - [null, null, null, null, null] +27755 - null - [null, null, null, null, null] +27756 - null - [null, null, null, null, null] +27757 - null - [null, null, null, null, null] +27758 - null - [null, null, null, null, null] +27759 - null - [null, null, null, null, null] +27760 - null - [null, null, null, null, null] +27761 - null - [null, null, null, null, null] +27762 - null - [null, null, null, null, null] +27763 - null - [null, null, null, null, null] +27764 - null - [null, null, null, null, null] +27765 - null - [null, null, null, null, null] +27766 - null - [null, null, null, null, null] +27767 - null - [null, null, null, null, null] +27768 - null - [null, null, null, null, null] +27769 - null - [null, null, null, null, null] +27770 - null - [null, null, null, null, null] +27771 - null - [null, null, null, null, null] +27772 - null - [null, null, null, null, null] +27773 - null - [null, null, null, null, null] +27774 - null - [null, null, null, null, null] +27775 - null - [null, null, null, null, null] +27776 - null - [null, null, null, null, null] +27777 - null - [null, null, null, null, null] +27778 - null - [null, null, null, null, null] +27779 - null - [null, null, null, null, null] +27780 - null - [null, null, null, null, null] +27781 - null - [null, null, null, null, null] +27782 - null - [null, null, null, null, null] +27783 - null - [null, null, null, null, null] +27784 - null - [null, null, null, null, null] +27785 - null - [null, null, null, null, null] +27786 - null - [null, null, null, null, null] +27787 - null - [null, null, null, null, null] +27788 - null - [null, null, null, null, null] +27789 - null - [null, null, null, null, null] +27790 - null - [null, null, null, null, null] +27791 - null - [null, null, null, null, null] +27792 - null - [null, null, null, null, null] +27793 - null - [null, null, null, null, null] +27794 - null - [null, null, null, null, null] +27795 - null - [null, null, null, null, null] +27796 - null - [null, null, null, null, null] +27797 - null - [null, null, null, null, null] +27798 - null - [null, null, null, null, null] +27799 - null - [null, null, null, null, null] +27800 - null - [null, null, null, null, null] +27801 - null - [null, null, null, null, null] +27802 - null - [null, null, null, null, null] +27803 - null - [null, null, null, null, null] +27804 - null - [null, null, null, null, null] +27805 - null - [null, null, null, null, null] +27806 - null - [null, null, null, null, null] +27807 - null - [null, null, null, null, null] +27808 - null - [null, null, null, null, null] +27809 - null - [null, null, null, null, null] +27810 - null - [null, null, null, null, null] +27811 - null - [null, null, null, null, null] +27812 - null - [null, null, null, null, null] +27813 - null - [null, null, null, null, null] +27814 - null - [null, null, null, null, null] +27815 - null - [null, null, null, null, null] +27816 - null - [null, null, null, null, null] +27817 - null - [null, null, null, null, null] +27818 - null - [null, null, null, null, null] +27819 - null - [null, null, null, null, null] +27820 - null - [null, null, null, null, null] +27821 - null - [null, null, null, null, null] +27822 - null - [null, null, null, null, null] +27823 - null - [null, null, null, null, null] +27824 - null - [null, null, null, null, null] +27825 - null - [null, null, null, null, null] +27826 - null - [null, null, null, null, null] +27827 - null - [null, null, null, null, null] +27828 - null - [null, null, null, null, null] +27829 - null - [null, null, null, null, null] +27830 - null - [null, null, null, null, null] +27831 - null - [null, null, null, null, null] +27832 - null - [null, null, null, null, null] +27833 - null - [null, null, null, null, null] +27834 - null - [null, null, null, null, null] +27835 - null - [null, null, null, null, null] +27836 - null - [null, null, null, null, null] +27837 - null - [null, null, null, null, null] +27838 - null - [null, null, null, null, null] +27839 - null - [null, null, null, null, null] +27840 - null - [null, null, null, null, null] +27841 - null - [null, null, null, null, null] +27842 - null - [null, null, null, null, null] +27843 - null - [null, null, null, null, null] +27844 - null - [null, null, null, null, null] +27845 - Gate - [null, null, null, null, null] +27846 - Gate - [Open, null, null, null, null] +27847 - Gate - [null, null, null, null, null] +27848 - Gate - [Open, null, null, null, null] +27849 - Chair - [null, null, null, null, null] +27850 - Table - [null, null, null, null, null] +27851 - Gate - [Close, null, null, null, null] +27852 - Gate - [Open, null, null, null, null] +27853 - Gate - [Close, null, null, null, null] +27854 - Gate - [Open, null, null, null, null] +27855 - null - [null, null, null, null, null] +27856 - null - [null, null, null, null, null] +27857 - null - [null, null, null, null, null] +27858 - null - [null, null, null, null, null] +27859 - null - [null, null, null, null, null] +27860 - null - [null, null, null, null, null] +27861 - null - [null, null, null, null, null] +27862 - null - [null, null, null, null, null] +27863 - null - [null, null, null, null, null] +27864 - null - [null, null, null, null, null] +27865 - null - [null, null, null, null, null] +27866 - null - [null, null, null, null, null] +27867 - null - [null, null, null, null, null] +27868 - null - [null, null, null, null, null] +27869 - null - [null, null, null, null, null] +27870 - null - [null, null, null, null, null] +27871 - null - [null, null, null, null, null] +27872 - null - [null, null, null, null, null] +27873 - null - [null, null, null, null, null] +27874 - null - [null, null, null, null, null] +27875 - null - [null, null, null, null, null] +27876 - null - [null, null, null, null, null] +27877 - null - [null, null, null, null, null] +27878 - null - [null, null, null, null, null] +27879 - null - [null, null, null, null, null] +27880 - null - [null, null, null, null, null] +27881 - null - [null, null, null, null, null] +27882 - null - [null, null, null, null, null] +27883 - null - [null, null, null, null, null] +27884 - null - [null, null, null, null, null] +27885 - null - [null, null, null, null, null] +27886 - null - [null, null, null, null, null] +27887 - null - [null, null, null, null, null] +27888 - null - [null, null, null, null, null] +27889 - null - [null, null, null, null, null] +27890 - null - [null, null, null, null, null] +27891 - Torch - [null, null, null, null, null] +27892 - Operation lights - [null, null, null, null, null] +27893 - Operation lights - [null, null, null, null, null] +27894 - Operation lights - [null, null, null, null, null] +27895 - Operation side table - [null, null, null, null, null] +27896 - null - [null, null, null, null, null] +27897 - null - [null, null, null, null, null] +27898 - null - [null, null, null, null, null] +27899 - null - [null, null, null, null, null] +27900 - null - [null, null, null, null, null] +27901 - null - [null, null, null, null, null] +27902 - null - [null, null, null, null, null] +27903 - Operation side table - [null, null, null, null, null] +27904 - Plant - [null, null, null, null, null] +27905 - Plant - [null, null, null, null, null] +27906 - null - [null, null, null, null, null] +27907 - null - [null, null, null, null, null] +27908 - null - [null, null, null, null, null] +27909 - null - [null, null, null, null, null] +27910 - null - [null, null, null, null, null] +27911 - null - [null, null, null, null, null] +27912 - null - [null, null, null, null, null] +27913 - null - [null, null, null, null, null] +27914 - null - [null, null, null, null, null] +27915 - null - [null, null, null, null, null] +27916 - null - [null, null, null, null, null] +27917 - null - [null, null, null, null, null] +27918 - null - [null, null, null, null, null] +27919 - null - [null, null, null, null, null] +27920 - null - [null, null, null, null, null] +27921 - null - [null, null, null, null, null] +27922 - null - [null, null, null, null, null] +27923 - null - [null, null, null, null, null] +27924 - null - [null, null, null, null, null] +27925 - null - [null, null, null, null, null] +27926 - null - [null, null, null, null, null] +27927 - null - [null, null, null, null, null] +27928 - null - [null, null, null, null, null] +27929 - null - [null, null, null, null, null] +27930 - null - [null, null, null, null, null] +27931 - null - [null, null, null, null, null] +27932 - null - [null, null, null, null, null] +27933 - null - [null, null, null, null, null] +27934 - null - [null, null, null, null, null] +27935 - null - [null, null, null, null, null] +27936 - null - [null, null, null, null, null] +27937 - null - [null, null, null, null, null] +27938 - null - [null, null, null, null, null] +27939 - null - [null, null, null, null, null] +27940 - null - [null, null, null, null, null] +27941 - null - [null, null, null, null, null] +27942 - null - [null, null, null, null, null] +27943 - null - [null, null, null, null, null] +27944 - null - [null, null, null, null, null] +27945 - null - [null, null, null, null, null] +27946 - null - [null, null, null, null, null] +27947 - null - [null, null, null, null, null] +27948 - null - [null, null, null, null, null] +27949 - null - [null, null, null, null, null] +27950 - null - [null, null, null, null, null] +27951 - null - [null, null, null, null, null] +27952 - null - [null, null, null, null, null] +27953 - null - [null, null, null, null, null] +27954 - null - [null, null, null, null, null] +27955 - null - [null, null, null, null, null] +27956 - null - [null, null, null, null, null] +27957 - null - [null, null, null, null, null] +27958 - null - [null, null, null, null, null] +27959 - null - [null, null, null, null, null] +27960 - null - [null, null, null, null, null] +27961 - null - [null, null, null, null, null] +27962 - null - [null, null, null, null, null] +27963 - null - [null, null, null, null, null] +27964 - null - [null, null, null, null, null] +27965 - null - [null, null, null, null, null] +27966 - null - [null, null, null, null, null] +27967 - null - [null, null, null, null, null] +27968 - null - [null, null, null, null, null] +27969 - null - [null, null, null, null, null] +27970 - null - [null, null, null, null, null] +27971 - null - [null, null, null, null, null] +27972 - null - [null, null, null, null, null] +27973 - null - [null, null, null, null, null] +27974 - null - [null, null, null, null, null] +27975 - null - [null, null, null, null, null] +27976 - null - [null, null, null, null, null] +27977 - null - [null, null, null, null, null] +27978 - null - [null, null, null, null, null] +27979 - null - [null, null, null, null, null] +27980 - null - [null, null, null, null, null] +27981 - null - [null, null, null, null, null] +27982 - null - [null, null, null, null, null] +27983 - Plant - [null, null, null, null, null] +27984 - null - [null, null, null, null, null] +27985 - null - [null, null, null, null, null] +27986 - null - [null, null, null, null, null] +27987 - null - [null, null, null, null, null] +27988 - Door - [Open, null, null, null, null] +27989 - Door - [Close, null, null, null, null] +27990 - null - [null, null, null, null, null] +27991 - null - [null, null, null, null, null] +27992 - null - [null, null, null, null, null] +27993 - null - [null, null, null, null, null] +27994 - null - [null, null, null, null, null] +27995 - null - [null, null, null, null, null] +27996 - null - [null, null, null, null, null] +27997 - null - [null, null, null, null, null] +27998 - null - [null, null, null, null, null] +27999 - null - [null, null, null, null, null] +28000 - null - [null, null, null, null, null] +28001 - null - [null, null, null, null, null] +28002 - null - [null, null, null, null, null] +28003 - null - [null, null, null, null, null] +28004 - null - [null, null, null, null, null] +28005 - null - [null, null, null, null, null] +28006 - null - [null, null, null, null, null] +28007 - null - [null, null, null, null, null] +28008 - null - [null, null, null, null, null] +28009 - null - [null, null, null, null, null] +28010 - null - [null, null, null, null, null] +28011 - null - [null, null, null, null, null] +28012 - null - [null, null, null, null, null] +28013 - null - [null, null, null, null, null] +28014 - null - [null, null, null, null, null] +28015 - null - [null, null, null, null, null] +28016 - null - [null, null, null, null, null] +28017 - null - [null, null, null, null, null] +28018 - null - [null, null, null, null, null] +28019 - null - [null, null, null, null, null] +28020 - null - [null, null, null, null, null] +28021 - null - [null, null, null, null, null] +28022 - null - [null, null, null, null, null] +28023 - null - [null, null, null, null, null] +28024 - null - [null, null, null, null, null] +28025 - null - [null, null, null, null, null] +28026 - null - [null, null, null, null, null] +28027 - null - [null, null, null, null, null] +28028 - null - [null, null, null, null, null] +28029 - null - [null, null, null, null, null] +28030 - null - [null, null, null, null, null] +28031 - null - [null, null, null, null, null] +28032 - null - [null, null, null, null, null] +28033 - null - [null, null, null, null, null] +28034 - null - [null, null, null, null, null] +28035 - null - [null, null, null, null, null] +28036 - null - [null, null, null, null, null] +28037 - null - [null, null, null, null, null] +28038 - null - [null, null, null, null, null] +28039 - null - [null, null, null, null, null] +28040 - null - [null, null, null, null, null] +28041 - null - [null, null, null, null, null] +28042 - null - [null, null, null, null, null] +28043 - null - [null, null, null, null, null] +28044 - null - [null, null, null, null, null] +28045 - null - [null, null, null, null, null] +28046 - null - [null, null, null, null, null] +28047 - null - [null, null, null, null, null] +28048 - null - [null, null, null, null, null] +28049 - null - [null, null, null, null, null] +28050 - null - [null, null, null, null, null] +28051 - null - [null, null, null, null, null] +28052 - null - [null, null, null, null, null] +28053 - null - [null, null, null, null, null] +28054 - null - [null, null, null, null, null] +28055 - null - [null, null, null, null, null] +28056 - null - [null, null, null, null, null] +28057 - null - [null, null, null, null, null] +28058 - null - [null, null, null, null, null] +28059 - null - [null, null, null, null, null] +28060 - null - [null, null, null, null, null] +28061 - null - [null, null, null, null, null] +28062 - null - [null, null, null, null, null] +28063 - null - [null, null, null, null, null] +28064 - null - [null, null, null, null, null] +28065 - null - [null, null, null, null, null] +28066 - null - [null, null, null, null, null] +28067 - null - [null, null, null, null, null] +28068 - null - [null, null, null, null, null] +28069 - null - [null, null, null, null, null] +28070 - null - [null, null, null, null, null] +28071 - null - [null, null, null, null, null] +28072 - null - [null, null, null, null, null] +28073 - null - [null, null, null, null, null] +28074 - null - [null, null, null, null, null] +28075 - null - [null, null, null, null, null] +28076 - null - [null, null, null, null, null] +28077 - null - [null, null, null, null, null] +28078 - null - [null, null, null, null, null] +28079 - null - [null, null, null, null, null] +28080 - null - [null, null, null, null, null] +28081 - null - [null, null, null, null, null] +28082 - null - [null, null, null, null, null] +28083 - null - [null, null, null, null, null] +28084 - null - [null, null, null, null, null] +28085 - null - [null, null, null, null, null] +28086 - null - [null, null, null, null, null] +28087 - null - [null, null, null, null, null] +28088 - null - [null, null, null, null, null] +28089 - Desk - [Use, Exchange, Collect, History, Sets] +28090 - null - [null, null, null, null, null] +28091 - null - [null, null, null, null, null] +28092 - null - [null, null, null, null, null] +28093 - Grand Exchange pillar - [null, null, null, null, null] +28094 - Hidden trapdoor - [Open, null, null, null, null] +28095 - Upcoming tournament rules - [View, null, null, null, null] +28096 - null - [null, null, null, null, null] +28097 - null - [null, null, null, null, null] +28098 - null - [null, null, null, null, null] +28099 - null - [null, null, null, null, null] +28100 - null - [null, null, null, null, null] +28101 - null - [null, null, null, null, null] +28102 - null - [null, null, null, null, null] +28103 - null - [null, null, null, null, null] +28104 - null - [null, null, null, null, null] +28105 - null - [null, null, null, null, null] +28106 - null - [null, null, null, null, null] +28107 - null - [null, null, null, null, null] +28108 - null - [null, null, null, null, null] +28109 - null - [null, null, null, null, null] +28110 - Cave - [Exit, null, null, null, null] +28111 - null - [null, null, null, null, null] +28112 - null - [null, null, null, null, null] +28113 - null - [null, null, null, null, null] +28114 - null - [null, null, null, null, null] +28115 - Rogues' scoreboard - [View, null, null, null, null] +28116 - Hunters' scoreboard - [View, null, null, null, null] +28117 - null - [null, null, null, null, null] +28118 - null - [null, null, null, null, null] +28119 - Low-level crater - [Enter, null, null, null, null] +28120 - Med-level crater - [Enter, null, null, null, null] +28121 - High-level crater - [Enter, null, null, null, null] +28122 - Cave - [Exit, null, null, null, null] +28123 - null - [null, null, null, null, null] +28124 - null - [null, null, null, null, null] +28125 - null - [null, null, null, null, null] +28126 - null - [null, null, null, null, null] +28127 - null - [null, null, null, null, null] +28128 - null - [null, null, null, null, null] +28129 - null - [null, null, null, null, null] +28130 - null - [null, null, null, null, null] +28131 - null - [null, null, null, null, null] +28132 - null - [null, null, null, null, null] +28133 - null - [null, null, null, null, null] +28134 - null - [null, null, null, null, null] +28135 - null - [null, null, null, null, null] +28136 - null - [null, null, null, null, null] +28137 - null - [null, null, null, null, null] +28138 - null - [null, null, null, null, null] +28139 - Tomato barrel - [take tomato, null, null, null, null] +28140 - Portal - [Leave, null, null, null, null] +28141 - null - [null, null, null, null, null] +28142 - null - [null, null, null, null, null] +28143 - null - [null, null, null, null, null] +28144 - null - [null, null, null, null, null] +28145 - null - [null, null, null, null, null] +28146 - null - [null, null, null, null, null] +28147 - null - [null, null, null, null, null] +28148 - null - [null, null, null, null, null] +28149 - null - [null, null, null, null, null] +28150 - null - [null, null, null, null, null] +28151 - null - [null, null, null, null, null] +28152 - null - [null, null, null, null, null] +28153 - null - [null, null, null, null, null] +28154 - null - [null, null, null, null, null] +28155 - null - [null, null, null, null, null] +28156 - null - [null, null, null, null, null] +28157 - null - [null, null, null, null, null] +28158 - null - [null, null, null, null, null] +28159 - null - [null, null, null, null, null] +28160 - null - [null, null, null, null, null] +28161 - null - [null, null, null, null, null] +28162 - null - [null, null, null, null, null] +28163 - null - [null, null, null, null, null] +28164 - null - [null, null, null, null, null] +28165 - null - [null, null, null, null, null] +28166 - null - [null, null, null, null, null] +28167 - null - [null, null, null, null, null] +28168 - null - [null, null, null, null, null] +28169 - null - [null, null, null, null, null] +28170 - null - [null, null, null, null, null] +28171 - null - [null, null, null, null, null] +28172 - null - [null, null, null, null, null] +28173 - null - [null, null, null, null, null] +28174 - null - [null, null, null, null, null] +28175 - null - [null, null, null, null, null] +28176 - null - [null, null, null, null, null] +28177 - null - [null, null, null, null, null] +28178 - null - [null, null, null, null, null] +28179 - null - [null, null, null, null, null] +28180 - null - [null, null, null, null, null] +28181 - null - [null, null, null, null, null] +28182 - null - [null, null, null, null, null] +28183 - null - [null, null, null, null, null] +28184 - null - [null, null, null, null, null] +28185 - null - [null, null, null, null, null] +28186 - null - [null, null, null, null, null] +28187 - null - [null, null, null, null, null] +28188 - null - [null, null, null, null, null] +28189 - null - [null, null, null, null, null] +28190 - null - [null, null, null, null, null] +28191 - null - [null, null, null, null, null] +28192 - null - [null, null, null, null, null] +28193 - null - [null, null, null, null, null] +28194 - Viewing orb - [Look-into, null, null, null, null] +28195 - null - [null, null, null, null, null] +28196 - null - [null, null, null, null, null] +28197 - null - [null, null, null, null, null] +28198 - null - [null, null, null, null, null] +28199 - Table - [null, null, null, null, null] +28200 - Stool - [null, null, null, null, null] +28201 - Crate - [null, null, null, null, null] +28202 - Barrel - [null, null, null, null, null] +28203 - Pile of crates - [null, null, null, null, null] +28204 - Torch - [null, null, null, null, null] +28205 - Banner - [null, null, null, null, null] +28206 - Banner - [null, null, null, null, null] +28207 - null - [null, null, null, null, null] +28208 - null - [null, null, null, null, null] +28209 - Low-level orb - [View, null, null, null, null] +28210 - Mid-level orb - [View, null, null, null, null] +28211 - High-level orb - [View, null, null, null, null] +28212 - null - [null, null, null, null, null] +28213 - Portal - [Enter, null, null, null, null] +28214 - Portal - [Leave, null, null, null, null] +28215 - null - [null, null, null, null, null] +28216 - null - [null, null, null, null, null] +28217 - null - [null, null, null, null, null] +28218 - null - [null, null, null, null, null] +28219 - null - [null, null, null, null, null] +28220 - Lava crater - [null, null, null, null, null] +28221 - null - [null, null, null, null, null] +28222 - null - [null, null, null, null, null] +28223 - null - [null, null, null, null, null] +28224 - null - [null, null, null, null, null] +28225 - null - [null, null, null, null, null] +28226 - null - [null, null, null, null, null] +28227 - null - [null, null, null, null, null] +28228 - null - [null, null, null, null, null] +28229 - null - [null, null, null, null, null] +28230 - null - [null, null, null, null, null] +28231 - null - [null, null, null, null, null] +28232 - null - [null, null, null, null, null] +28233 - null - [null, null, null, null, null] +28234 - null - [null, null, null, null, null] +28235 - null - [null, null, null, null, null] +28236 - null - [null, null, null, null, null] +28237 - null - [null, null, null, null, null] +28238 - null - [null, null, null, null, null] +28239 - null - [null, null, null, null, null] +28240 - null - [null, null, null, null, null] +28241 - null - [null, null, null, null, null] +28242 - null - [null, null, null, null, null] +28243 - null - [null, null, null, null, null] +28244 - null - [null, null, null, null, null] +28245 - null - [null, null, null, null, null] +28246 - null - [null, null, null, null, null] +28247 - null - [null, null, null, null, null] +28248 - null - [null, null, null, null, null] +28249 - null - [null, null, null, null, null] +28250 - null - [null, null, null, null, null] +28251 - null - [null, null, null, null, null] +28252 - null - [null, null, null, null, null] +28253 - null - [null, null, null, null, null] +28254 - null - [null, null, null, null, null] +28255 - null - [null, null, null, null, null] +28256 - null - [null, null, null, null, null] +28257 - null - [null, null, null, null, null] +28258 - null - [null, null, null, null, null] +28259 - null - [null, null, null, null, null] +28260 - null - [null, null, null, null, null] +28261 - null - [null, null, null, null, null] +28262 - Table - [null, null, null, null, null] +28263 - null - [null, null, null, null, null] +28264 - null - [null, null, null, null, null] +28265 - null - [null, null, null, null, null] +28266 - Snowman - [Add-to, null, null, null, null] +28267 - Snowman - [Add-to, null, null, null, null] +28268 - Snowman - [Add-to, null, null, null, null] +28269 - Snowman - [Add-to, null, null, null, null] +28270 - Snowman - [Add-to, null, null, null, null] +28271 - Snowman - [Add-to, null, null, null, null] +28272 - Snowman - [Add-to, null, null, null, null] +28273 - Snowman - [Add-to, null, null, null, null] +28274 - Snowman - [Add-to, null, null, null, null] +28275 - Snowman - [Add-to, null, null, null, null] +28276 - Snowman - [Add-to, null, null, null, null] +28277 - Snowman - [Add-to, null, null, null, null] +28278 - Snowman - [Add-to, null, null, null, null] +28279 - Snowman - [Add-to, null, null, null, null] +28280 - Snowman - [Add-to, null, null, null, null] +28281 - Snowman - [Add-to, null, null, null, null] +28282 - Snowman - [Add-to, null, null, null, null] +28283 - Snowman - [Add-to, null, null, null, null] +28284 - Snowman - [Add-to, null, null, null, null] +28285 - Snowman - [Add-to, null, null, null, null] +28286 - Snowman - [Add-to, null, null, null, null] +28287 - Snowman - [Add-to, null, null, null, null] +28288 - Snowman - [Add-to, null, null, null, null] +28289 - Snowman - [Add-to, null, null, null, null] +28290 - Snowman - [Add-to, null, null, null, null] +28291 - Snowman - [Add-to, null, null, null, null] +28292 - Snowman - [Add-to, null, null, null, null] +28293 - Snowman - [Add-to, null, null, null, null] +28294 - Snowman - [Add-to, null, null, null, null] +28295 - Snowman - [Add-to, null, null, null, null] +28296 - Snow - [Collect, null, null, null, null] +28297 - Snow - [Collect, null, null, null, null] +28298 - Sleigh - [null, null, null, null, null] +28299 - Sleigh - [null, null, null, null, null] +28300 - null - [null, null, null, null, null] +28301 - null - [null, null, null, null, null] +28302 - null - [null, null, null, null, null] +28303 - null - [null, null, null, null, null] +28304 - null - [null, null, null, null, null] +28305 - null - [null, null, null, null, null] +28306 - null - [null, null, null, null, null] +28307 - null - [null, null, null, null, null] +28308 - null - [null, null, null, null, null] +28309 - null - [null, null, null, null, null] +28310 - null - [null, null, null, null, null] +28311 - null - [null, null, null, null, null] +28312 - null - [null, null, null, null, null] +28313 - null - [null, null, null, null, null] +28314 - null - [null, null, null, null, null] +28315 - null - [null, null, null, null, null] +28316 - Throne - [null, null, null, null, null] +28317 - Food trough - [null, null, null, null, null] +28318 - Stags - [null, null, null, null, null] +28319 - Stags - [null, null, null, null, null] +28320 - null - [null, null, null, null, null] +28321 - null - [null, null, null, null, null] +28322 - Zip line - [null, null, null, null, null] +28323 - null - [null, null, null, null, null] +28324 - null - [null, null, null, null, null] +28325 - null - [null, null, null, null, null] +28326 - Door - [null, null, null, null, null] +28327 - null - [null, null, null, null, null] +28328 - Jar - [null, null, null, null, null] +28329 - null - [null, null, null, null, null] +28330 - null - [null, null, null, null, null] +28331 - null - [null, null, null, null, null] +28332 - null - [null, null, null, null, null] +28333 - Shelves - [null, null, null, null, null] +28334 - null - [null, null, null, null, null] +28335 - Birdcage - [null, null, null, null, null] +28336 - Incubator - [null, null, null, null, null] +28337 - Cat basket - [null, null, null, null, null] +28338 - Dog basket - [null, null, null, null, null] +28339 - Dog baskets - [null, null, null, null, null] +28340 - Fish tank - [null, null, null, null, null] +28341 - Pen - [null, null, null, null, null] +28342 - null - [null, null, null, null, null] +28343 - Hay - [null, null, null, null, null] +28344 - Scale - [null, null, null, null, null] +28345 - Collars - [null, null, null, null, null] +28346 - null - [null, null, null, null, null] +28347 - null - [null, null, null, null, null] +28348 - null - [null, null, null, null, null] +28349 - null - [null, null, null, null, null] +28350 - null - [null, null, null, null, null] +28351 - Pet shop - [null, null, null, null, null] +28352 - null - [hidden, hidden, null, null, null] +28353 - Shelves - [null, null, null, null, null] +28354 - Shelves - [null, null, null, null, null] +28355 - Shelves - [null, null, null, null, null] +28356 - Cat - [null, null, null, null, null] +28357 - Counter - [null, null, null, null, null] +28358 - Counter - [null, null, null, null, null] +28359 - Incubator - [Take-Egg, Inspect, null, null, null] +28360 - Ball - [null, null, null, null, null] +28361 - Pillow - [null, null, null, null, null] +28362 - null - [null, null, null, null, null] +28363 - Counter - [null, null, null, null, null] +28364 - Counter - [null, null, null, null, null] +28365 - null - [null, null, null, null, null] +28366 - null - [null, null, null, null, null] +28367 - null - [null, null, null, null, null] +28368 - null - [null, null, null, null, null] +28369 - null - [null, null, null, null, null] +28370 - Spring - [null, null, null, null, null] +28371 - null - [null, null, null, null, null] +28372 - null - [null, null, null, null, null] +28373 - null - [null, null, null, null, null] +28374 - null - [null, null, null, null, null] +28375 - null - [null, null, null, null, null] +28376 - Sealed door - [null, null, null, null, null] +28377 - Sealed door - [null, null, null, null, null] +28378 - Sealed door - [null, null, null, null, null] +28379 - Sealed door - [null, null, null, null, null] +28380 - Sealed door - [null, null, null, null, null] +28381 - null - [null, null, null, null, null] +28382 - null - [null, null, null, null, null] +28383 - null - [null, null, null, null, null] +28384 - null - [null, null, null, null, null] +28385 - null - [null, null, null, null, null] +28386 - Ladder - [Climb, null, null, null, null] +28387 - null - [Climb, null, null, null, null] +28388 - Ladder - [Climb, null, null, null, null] +28389 - null - [null, null, null, null, null] +28390 - null - [null, null, null, null, null] +28391 - null - [null, null, null, null, null] +28392 - null - [null, null, null, null, null] +28393 - null - [null, null, null, null, null] +28394 - null - [null, null, null, null, null] +28395 - null - [null, null, null, null, null] +28396 - null - [null, null, null, null, null] +28397 - null - [null, null, null, null, null] +28398 - null - [null, null, null, null, null] +28399 - null - [null, null, null, null, null] +28400 - null - [null, null, null, null, null] +28401 - Exit - [Leave through, null, null, null, null] +28402 - null - [null, null, null, null, null] +28403 - null - [null, null, null, null, null] +28404 - null - [null, null, null, null, null] +28405 - null - [null, null, null, null, null] +28406 - null - [null, null, null, null, null] +28407 - Door - [Open, null, null, null, null] +28408 - Door - [Close, null, null, null, null] +28409 - Door - [Open, null, null, null, null] +28410 - Door - [Close, null, null, null, null] +28411 - null - [null, null, null, null, null] +28412 - null - [null, null, null, null, null] +28413 - null - [null, null, null, null, null] +28414 - null - [null, null, null, null, null] +28415 - null - [null, null, null, null, null] +28416 - null - [null, null, null, null, null] +28417 - null - [null, null, null, null, null] +28418 - Monument - [null, null, null, null, null] +28419 - Statue of Scabaras - [null, null, null, null, null] +28420 - Statue - [null, null, null, null, null] +28421 - Crate - [Search, null, null, null, null] +28422 - null - [null, null, null, null, null] +28423 - null - [null, null, null, null, null] +28424 - null - [null, null, null, null, null] +28425 - null - [null, null, null, null, null] +28426 - null - [null, null, null, null, null] +28427 - null - [null, null, null, null, null] +28428 - Stairs - [null, null, null, null, null] +28429 - null - [null, null, null, null, null] +28430 - Stairs - [null, null, null, null, null] +28431 - Stairs - [null, null, null, null, null] +28432 - null - [null, null, null, null, null] +28433 - Furnace - [Stoke, null, null, null, null] +28434 - Furnace - [Stoke, null, null, null, null] +28435 - Lever - [Pull, null, null, null, null] +28436 - Lever - [Pull, null, null, null, null] +28437 - Lever - [Pull, null, null, null, null] +28438 - Lever - [Pull, null, null, null, null] +28439 - Mysterious mechanism - [Investigate, null, null, null, null] +28440 - null - [null, null, null, null, null] +28441 - Pipe - [Cross, null, null, null, null] +28442 - Pipe - [Cross, null, null, null, null] +28443 - Greasy pipe - [Cross, null, null, null, null] +28444 - Ladder - [Climb down, null, null, null, null] +28445 - Greasy pipe - [Cross, null, null, null, null] +28446 - null - [null, null, null, null, null] +28447 - null - [null, null, null, null, null] +28448 - null - [null, null, null, null, null] +28449 - null - [null, null, null, null, null] +28450 - Ancient pillar - [null, null, null, null, null] +28451 - Broken pillar - [null, null, null, null, null] +28452 - Incomplete pillar - [null, null, null, null, null] +28453 - Vandalised pillar - [null, null, null, null, null] +28454 - Swamp tree - [null, null, null, null, null] +28455 - Slimy tree - [null, null, null, null, null] +28456 - null - [null, null, null, null, null] +28457 - null - [null, null, null, null, null] +28458 - null - [null, null, null, null, null] +28459 - null - [null, null, null, null, null] +28460 - null - [null, null, null, null, null] +28461 - null - [null, null, null, null, null] +28462 - null - [null, null, null, null, null] +28463 - null - [null, null, null, null, null] +28464 - null - [null, null, null, null, null] +28465 - null - [null, null, null, null, null] +28466 - null - [null, null, null, null, null] +28467 - null - [null, null, null, null, null] +28468 - null - [null, null, null, null, null] +28469 - null - [null, null, null, null, null] +28470 - null - [null, null, null, null, null] +28471 - null - [null, null, null, null, null] +28472 - Reeds - [Push through, null, null, null, null] +28473 - Reeds - [Push through, null, null, null, null] +28474 - Reeds - [Push through, null, null, null, null] +28475 - Storage box - [Remove fuel, null, null, null, null] +28476 - Storage box - [Remove fuel, null, null, null, null] +28477 - Storage box - [Remove fuel, null, null, null, null] +28478 - Storage box - [Remove fuel, null, null, null, null] +28479 - null - [null, null, null, null, null] +28480 - Scratchy writing - [Read, null, null, null, null] +28481 - Stairs down - [Enter, null, null, null, null] +28482 - null - [null, null, null, null, null] +28483 - null - [null, null, null, null, null] +28484 - null - [null, null, null, null, null] +28485 - null - [null, null, null, null, null] +28486 - Warm campfire - [null, null, null, null, null] +28487 - Rock - [null, null, null, null, null] +28488 - Rope - [Climb down, null, null, null, null] +28489 - Rock - [null, null, null, null, null] +28490 - Rope - [Climb up, null, null, null, null] +28491 - null - [null, null, null, null, null] +28492 - Ladder - [Climb, null, null, null, null] +28493 - null - [null, null, null, null, null] +28494 - null - [null, null, null, null, null] +28495 - null - [null, null, null, null, null] +28496 - Dung - [null, null, null, null, null] +28497 - Dung - [null, null, null, null, null] +28498 - Dung - [null, null, null, null, null] +28499 - Dung - [null, null, null, null, null] +28500 - null - [null, null, null, null, null] +28501 - null - [null, null, null, null, null] +28502 - Chest - [Search, null, null, null, null] +28503 - Chest - [Search, null, null, null, null] +28504 - Chair - [null, null, null, null, null] +28505 - Broken chair - [null, null, null, null, null] +28506 - Broken chair - [null, null, null, null, null] +28507 - Broken chair - [null, null, null, null, null] +28508 - Table - [null, null, null, null, null] +28509 - Broken table - [null, null, null, null, null] +28510 - Broken table - [null, null, null, null, null] +28511 - Broken table - [null, null, null, null, null] +28512 - Low wall - [Climb, null, null, null, null] +28513 - null - [null, null, null, null, null] +28514 - Gate - [Open, Use-quickly, null, null, null] +28515 - Fallen pillar - [Climb, null, null, null, null] +28516 - Fallen pillar - [Climb, null, null, null, null] +28517 - null - [null, null, null, null, null] +28518 - Gate - [Close, null, null, null, null] +28519 - Power indicator - [null, null, null, null, null] +28520 - Power indicator - [null, null, null, null, null] +28521 - Power indicator - [null, null, null, null, null] +28522 - Power indicator - [null, null, null, null, null] +28523 - Power indicator - [null, null, null, null, null] +28524 - Power indicator - [null, null, null, null, null] +28525 - Floor - [Search, null, null, null, null] +28526 - Odd markings. - [Search, null, null, null, null] +28527 - Spear trap - [null, null, null, null, null] +28528 - null - [null, null, null, null, null] +28529 - null - [null, null, null, null, null] +28530 - null - [null, null, null, null, null] +28531 - null - [null, null, null, null, null] +28532 - Steam - [null, null, null, null, null] +28533 - Steam - [null, null, null, null, null] +28534 - null - [null, null, null, null, null] +28535 - null - [null, null, null, null, null] +28536 - null - [null, null, null, null, null] +28537 - null - [null, null, null, null, null] +28538 - null - [null, null, null, null, null] +28539 - null - [null, null, null, null, null] +28540 - null - [null, null, null, null, null] +28541 - null - [null, null, null, null, null] +28542 - null - [null, null, null, null, null] +28543 - null - [null, null, null, null, null] +28544 - null - [null, null, null, null, null] +28545 - null - [null, null, null, null, null] +28546 - null - [null, null, null, null, null] +28547 - null - [null, null, null, null, null] +28548 - null - [null, null, null, null, null] +28549 - null - [null, null, null, null, null] +28550 - null - [hidden, hidden, null, null, null] +28551 - Evil turnip patch - [null, Inspect, null, null, null] +28552 - Evil turnip patch - [null, Inspect, null, null, null] +28553 - Evil turnip patch - [null, Inspect, null, null, null] +28554 - Evil turnip patch - [null, Inspect, null, null, null] +28555 - Evil turnip patch - [null, Inspect, null, null, null] +28556 - Evil turnip patch - [Pick, Inspect, null, null, null] +28557 - Shaking box - [Check, null, null, null, null] +28558 - Shaking box - [Check, null, null, null, null] +28559 - Net trap - [null, null, null, null, null] +28560 - Net trap - [Check, null, null, null, null] +28561 - Net trap - [null, null, null, null, null] +28562 - Net trap - [Dismantle, null, null, null, null] +28563 - Young tree - [Dismantle, Investigate, null, null, null] +28564 - Young tree - [Set-trap, null, null, null, null] +28565 - Young tree - [null, null, null, null, null] +28566 - Net trap - [Dismantle, Investigate, null, null, null] +28567 - Shaking box - [Check, null, null, null, null] +28568 - Box trap - [null, null, null, null, null] +28569 - Box trap - [null, null, null, null, null] +28570 - Box trap - [null, null, null, null, null] +28571 - Box trap - [null, null, null, null, null] +28572 - Ladder - [Climb-up, null, null, null, null] +28573 - null - [null, null, null, null, null] +28574 - null - [null, null, null, null, null] +28575 - null - [null, null, null, null, null] +28576 - null - [null, null, null, null, null] +28577 - null - [null, null, null, null, null] +28578 - null - [null, null, null, null, null] +28579 - null - [null, null, null, null, null] +28580 - null - [null, null, null, null, null] +28581 - null - [null, null, null, null, null] +28582 - null - [null, null, null, null, null] +28583 - null - [null, null, null, null, null] +28584 - null - [null, null, null, null, null] +28585 - null - [null, null, null, null, null] +28586 - Dead body - [Search, null, null, null, null] +28587 - null - [null, null, null, null, null] +28588 - Door - [Close, null, null, null, null] +28589 - Door - [Open, null, null, null, null] +28590 - Door - [null, null, null, null, null] +28591 - null - [null, null, null, null, null] +28592 - null - [null, null, null, null, null] +28593 - null - [null, null, null, null, null] +28594 - null - [null, null, null, null, null] +28595 - null - [null, null, null, null, null] +28596 - null - [null, null, null, null, null] +28597 - null - [null, null, null, null, null] +28598 - null - [null, null, null, null, null] +28599 - null - [null, null, null, null, null] +28600 - null - [null, null, null, null, null] +28601 - null - [null, null, null, null, null] +28602 - null - [null, null, null, null, null] +28603 - null - [null, null, null, null, null] +28604 - null - [null, null, null, null, null] +28605 - null - [null, null, null, null, null] +28606 - null - [null, null, null, null, null] +28607 - null - [null, null, null, null, null] +28608 - null - [null, null, null, null, null] +28609 - null - [null, null, null, null, null] +28610 - null - [null, null, null, null, null] +28611 - null - [null, null, null, null, null] +28612 - null - [null, null, null, null, null] +28613 - null - [null, null, null, null, null] +28614 - null - [null, null, null, null, null] +28615 - null - [null, null, null, null, null] +28616 - null - [null, null, null, null, null] +28617 - null - [null, null, null, null, null] +28618 - null - [null, null, null, null, null] +28619 - null - [null, null, null, null, null] +28620 - null - [null, null, null, null, null] +28621 - Table - [null, null, null, null, null] +28622 - Sword cabinet - [null, null, null, null, null] +28623 - Sign - [null, null, null, null, null] +28624 - Sword case - [null, null, null, null, null] +28625 - Crate - [Search, null, null, null, null] +28626 - Crate - [Search, null, null, null, null] +28627 - Chair - [null, null, null, null, null] +28628 - Table - [null, null, null, null, null] +28629 - Table - [null, null, null, null, null] +28630 - Stool - [null, null, null, null, null] +28631 - Stool - [null, null, null, null, null] +28632 - Drawers - [Open, null, null, null, null] +28633 - Drawers - [null, Search, Close, null, null] +28634 - Bed - [null, null, null, null, null] +28635 - Stone table - [null, null, null, null, null] +28636 - Bench - [null, null, null, null, null] +28637 - Bookshelves - [null, null, null, null, null] +28638 - Bookshelves - [null, null, null, null, null] +28639 - Stone table - [null, null, null, null, null] +28640 - Destroyed bed - [null, null, null, null, null] +28641 - Gnawed drawers - [null, null, null, null, null] +28642 - Ruined bookshelves - [null, null, null, null, null] +28643 - Broken stool - [null, null, null, null, null] +28644 - Book heap - [null, null, null, null, null] +28645 - Wooden pieces - [null, null, null, null, null] +28646 - Splinters - [null, null, null, null, null] +28647 - null - [null, null, null, null, null] +28648 - null - [null, null, null, null, null] +28649 - null - [null, null, null, null, null] +28650 - null - [null, null, null, null, null] +28651 - Ladder - [Climb-up, null, null, null, null] +28652 - Ladder - [Climb-down, null, null, null, null] +28653 - Ladder - [Climb-down, null, null, null, null] +28654 - Pillar - [null, null, null, null, null] +28655 - Pillar - [null, null, null, null, null] +28656 - null - [null, null, null, null, null] +28657 - null - [null, null, null, null, null] +28658 - null - [null, null, null, null, null] +28659 - null - [null, null, null, null, null] +28660 - Table - [null, null, null, null, null] +28661 - Stool - [null, null, null, null, null] +28662 - Fountain - [null, null, null, null, null] +28663 - null - [null, null, null, null, null] +28664 - null - [null, null, null, null, null] +28665 - null - [null, null, null, null, null] +28666 - null - [null, null, null, null, null] +28667 - null - [null, null, null, null, null] +28668 - null - [null, null, null, null, null] +28669 - null - [null, null, null, null, null] +28670 - null - [null, null, null, null, null] +28671 - null - [null, null, null, null, null] +28672 - null - [null, null, null, null, null] +28673 - null - [null, null, null, null, null] +28674 - null - [null, null, null, null, null] +28675 - Trapdoor - [Open, null, null, null, null] +28676 - Trapdoor - [Climb-down, Close, null, null, null] +28677 - null - [null, null, null, null, null] +28678 - null - [null, null, null, null, null] +28679 - null - [null, null, null, null, null] +28680 - null - [null, null, null, null, null] +28681 - null - [null, null, null, null, null] +28682 - null - [null, null, null, null, null] +28683 - null - [null, null, null, null, null] +28684 - null - [null, null, null, null, null] +28685 - null - [null, null, null, null, null] +28686 - null - [null, null, null, null, null] +28687 - null - [null, null, null, null, null] +28688 - null - [null, null, null, null, null] +28689 - null - [null, null, null, null, null] +28690 - Gate - [Open, null, null, null, null] +28691 - Gate - [Open, null, null, null, null] +28692 - Gate - [Close, null, null, null, null] +28693 - Gate - [Close, null, null, null, null] +28694 - Druid's Circle stone - [null, null, null, null, null] +28695 - Druid's Circle stone - [null, null, null, null, null] +28696 - Druid's Circle stone - [null, null, null, null, null] +28697 - Druid's Circle stone - [null, null, null, null, null] +28698 - Altar of Guthix - [Pray, null, null, null, null] +28699 - Druid's Circle torch - [null, null, null, null, null] +28700 - null - [null, null, null, null, null] +28701 - null - [null, null, null, null, null] +28702 - null - [null, null, null, null, null] +28703 - null - [null, null, null, null, null] +28704 - null - [null, null, null, null, null] +28705 - null - [null, null, null, null, null] +28706 - null - [null, null, null, null, null] +28707 - Druid's robes - [null, null, null, null, null] +28708 - Druid's robes - [null, null, null, null, null] +28709 - null - [null, null, null, null, null] +28710 - null - [null, null, null, null, null] +28711 - null - [null, null, null, null, null] +28712 - null - [null, null, null, null, null] +28713 - null - [null, null, null, null, null] +28714 - Ladder - [Climb, null, null, null, null] +28715 - Wishing well - [Make-Wish, null, null, null, null] +28716 - Obelisk - [Infuse-Pouch, Renew-Points, null, null, null] +28717 - Inert obelisk - [null, null, null, null, null] +28718 - Inert obelisk - [null, null, null, null, null] +28719 - Obelisk - [Infuse-Pouch, Renew-Points, null, null, null] +28720 - Inert obelisk - [null, null, null, null, null] +28721 - Inert obelisk - [null, null, null, null, null] +28722 - Obelisk - [Infuse-Pouch, Renew-Points, null, null, null] +28723 - Inert obelisk - [null, null, null, null, null] +28724 - Inert obelisk - [null, null, null, null, null] +28725 - Obelisk - [Infuse-Pouch, Renew-Points, null, null, null] +28726 - Inert obelisk - [null, null, null, null, null] +28727 - Inert obelisk - [null, null, null, null, null] +28728 - Obelisk - [Infuse-Pouch, Renew-Points, null, null, null] +28729 - Inert obelisk - [null, null, null, null, null] +28730 - Inert obelisk - [null, null, null, null, null] +28731 - Obelisk - [Infuse-Pouch, Renew-Points, null, null, null] +28732 - Inert obelisk - [null, null, null, null, null] +28733 - Inert obelisk - [null, null, null, null, null] +28734 - Obelisk - [Infuse-Pouch, Renew-Points, null, null, null] +28735 - Inert obelisk - [null, null, null, null, null] +28736 - Inert obelisk - [null, null, null, null, null] +28737 - Desert ladder - [Climb-down, null, null, null, null] +28738 - null - [null, null, null, null, null] +28739 - null - [null, null, null, null, null] +28740 - Ladder - [Climb-Up, null, null, null, null] +28741 - Trapdoor - [Open, null, null, null, null] +28742 - Trapdoor - [Climb-down, Close, null, null, null] +28743 - Ladder - [Climb-up, null, null, null, null] +28744 - null - [null, null, null, null, null] +28745 - null - [null, null, null, null, null] +28746 - null - [null, null, null, null, null] +28747 - null - [null, null, null, null, null] +28748 - null - [null, null, null, null, null] +28749 - null - [null, null, null, null, null] +28750 - Net trap - [null, null, null, null, null] +28751 - Net trap - [Check, null, null, null, null] +28752 - Net trap - [null, null, null, null, null] +28753 - Net trap - [Dismantle, null, null, null, null] +28754 - Box trap - [null, null, null, null, null] +28755 - Box trap - [null, null, null, null, null] +28756 - Box trap - [null, null, null, null, null] +28757 - Box trap - [null, null, null, null, null] +28758 - Box trap - [null, null, null, null, null] +28759 - Box trap - [null, null, null, null, null] +28760 - Box trap - [null, null, null, null, null] +28761 - Laundry Basket - [Search, null, null, null, null] +28762 - null - [null, null, null, null, null] +28763 - null - [null, null, null, null, null] +28764 - null - [null, null, null, null, null] +28765 - null - [null, null, null, null, null] +28766 - null - [null, null, null, null, null] +28767 - null - [null, null, null, null, null] +28768 - null - [null, null, null, null, null] +28769 - null - [null, null, null, null, null] +28770 - null - [null, null, null, null, null] +28771 - null - [null, null, null, null, null] +28772 - null - [null, null, null, null, null] +28773 - null - [null, null, null, null, null] +28774 - null - [null, null, null, null, null] +28775 - null - [null, null, null, null, null] +28776 - null - [null, null, null, null, null] +28777 - Box trap - [null, null, null, null, null] +28778 - null - [null, null, null, null, null] +28779 - Portal - [Use, null, null, null, null] +28780 - Portal - [Use, null, null, null, null] +28781 - Portal - [null, null, null, null, null] +28782 - Exit - [Climb-up, null, null, null, null] +28783 - null - [null, null, null, null, null] +28784 - null - [null, null, null, null, null] +28785 - null - [null, null, null, null, null] +28786 - null - [null, null, null, null, null] +28787 - Stairs - [Climb, null, null, null, null] +28788 - null - [null, null, null, null, null] +28789 - null - [null, null, null, null, null] +28790 - null - [null, null, null, null, null] +28791 - null - [null, null, null, null, null] +28792 - null - [null, null, null, null, null] +28793 - null - [null, null, null, null, null] +28794 - null - [null, null, null, null, null] +28795 - null - [null, null, null, null, null] +28796 - Skeleton - [null, null, null, null, null] +28797 - Skeleton - [null, null, null, null, null] +28798 - Skeleton - [null, null, null, null, null] +28799 - null - [null, null, null, null, null] +28800 - null - [null, null, null, null, null] +28801 - null - [null, null, null, null, null] +28802 - null - [null, null, null, null, null] +28803 - null - [null, null, null, null, null] +28804 - null - [null, null, null, null, null] +28805 - null - [null, null, null, null, null] +28806 - null - [null, null, null, null, null] +28807 - null - [null, null, null, null, null] +28808 - null - [null, null, null, null, null] +28809 - null - [null, null, null, null, null] +28810 - null - [null, null, null, null, null] +28811 - null - [null, null, null, null, null] +28812 - null - [null, null, null, null, null] +28813 - null - [null, null, null, null, null] +28814 - null - [null, null, null, null, null] +28815 - null - [null, null, null, null, null] +28816 - null - [null, null, null, null, null] +28817 - null - [null, null, null, null, null] +28818 - null - [null, null, null, null, null] +28819 - Mushroom - [null, null, null, null, null] +28820 - Mushroom - [null, null, null, null, null] +28821 - Mushrooms - [null, null, null, null, null] +28822 - null - [null, null, null, null, null] +28823 - Crate - [Search, null, null, null, null] +28824 - Crate - [Search, null, null, null, null] +28825 - Sack pile - [null, null, null, null, null] +28826 - Barrel - [null, null, null, null, null] +28827 - null - [null, null, null, null, null] +28828 - null - [null, null, null, null, null] +28829 - null - [null, null, null, null, null] +28830 - null - [null, null, null, null, null] +28831 - null - [null, null, null, null, null] +28832 - null - [null, null, null, null, null] +28833 - null - [null, null, null, null, null] +28834 - null - [null, null, null, null, null] +28835 - null - [null, null, null, null, null] +28836 - null - [null, null, null, null, null] +28837 - null - [null, null, null, null, null] +28838 - null - [null, null, null, null, null] +28839 - null - [null, null, null, null, null] +28840 - null - [null, null, null, null, null] +28841 - null - [null, null, null, null, null] +28842 - null - [null, null, null, null, null] +28843 - null - [null, null, null, null, null] +28844 - null - [null, null, null, null, null] +28845 - null - [null, null, null, null, null] +28846 - null - [null, null, null, null, null] +28847 - Beacon - [null, null, null, null, null] +28848 - Flames - [null, null, null, null, null] +28849 - Skeleton - [null, null, null, null, null] +28850 - Skeleton - [null, null, null, null, null] +28851 - Skeleton - [null, null, null, null, null] +28852 - null - [null, null, null, null, null] +28853 - null - [null, null, null, null, null] +28854 - null - [null, null, null, null, null] +28855 - null - [null, null, null, null, null] +28856 - null - [null, null, null, null, null] +28857 - null - [null, null, null, null, null] +28858 - null - [null, null, null, null, null] +28859 - null - [null, null, null, null, null] +28860 - null - [null, null, null, null, null] +28861 - null - [null, null, null, null, null] +28862 - null - [null, null, null, null, null] +28863 - null - [null, null, null, null, null] +28864 - null - [null, null, null, null, null] +28865 - null - [null, null, null, null, null] +28866 - null - [null, null, null, null, null] +28867 - null - [null, null, null, null, null] +28868 - null - [null, null, null, null, null] +28869 - null - [null, null, null, null, null] +28870 - null - [null, null, null, null, null] +28871 - null - [null, null, null, null, null] +28872 - null - [null, null, null, null, null] +28873 - null - [null, null, null, null, null] +28874 - null - [null, null, null, null, null] +28875 - Plant - [null, null, null, null, null] +28876 - Plant - [null, null, null, null, null] +28877 - Plant - [null, null, null, null, null] +28878 - Plant - [null, null, null, null, null] +28879 - null - [null, null, null, null, null] +28880 - null - [null, null, null, null, null] +28881 - null - [null, null, null, null, null] +28882 - null - [null, null, null, null, null] +28883 - null - [null, null, null, null, null] +28884 - null - [null, null, null, null, null] +28885 - null - [null, null, null, null, null] +28886 - null - [null, null, null, null, null] +28887 - null - [null, null, null, null, null] +28888 - null - [null, null, null, null, null] +28889 - null - [null, null, null, null, null] +28890 - null - [null, null, null, null, null] +28891 - Rift - [Enter, null, null, null, null] +28892 - Rift - [Enter, null, null, null, null] +28893 - Rift - [Enter, null, null, null, null] +28894 - null - [null, null, null, null, null] +28895 - null - [null, null, null, null, null] +28896 - null - [null, null, null, null, null] +28897 - null - [null, null, null, null, null] +28898 - null - [null, null, null, null, null] +28899 - null - [null, null, null, null, null] +28900 - null - [null, null, null, null, null] +28901 - Slimy skulls - [null, null, null, null, null] +28902 - null - [null, null, null, null, null] +28903 - null - [null, null, null, null, null] +28904 - null - [null, null, null, null, null] +28905 - null - [null, null, null, null, null] +28906 - Shaking box - [Check, null, null, null, null] +28907 - Box trap - [Dismantle, null, null, null, null] +28908 - Box trap - [null, null, null, null, null] +28909 - Box trap - [null, null, null, null, null] +28910 - Box trap - [null, null, null, null, null] +28911 - Box trap - [null, null, null, null, null] +28912 - Dummy pawya corpse - [null, null, null, null, null] +28913 - Shaking box - [Check, null, null, null, null] +28914 - Box trap - [Dismantle, null, null, null, null] +28915 - Box trap - [null, null, null, null, null] +28916 - Box trap - [null, null, null, null, null] +28917 - Box trap - [null, null, null, null, null] +28918 - Box trap - [null, null, null, null, null] +28919 - null - [null, null, null, null, null] +28920 - Shaking box - [Check, null, null, null, null] +28921 - Shaking box - [Check, null, null, null, null] +28922 - Shaking box - [Check, null, null, null, null] +28923 - Shaking box - [Check, null, null, null, null] +28924 - Shaking box - [Check, null, null, null, null] +28925 - Shaking box - [Check, null, null, null, null] +28926 - Shaking box - [Check, null, null, null, null] +28927 - Shaking box - [Check, null, null, null, null] +28928 - Shaking box - [Check, null, null, null, null] +28929 - Shaking box - [Check, null, null, null, null] +28930 - Bird snare - [Check, null, null, null, null] +28931 - Bird snare - [Check, null, null, null, null] +28932 - Bird snare - [Check, null, null, null, null] +28933 - Bird snare - [Check, null, null, null, null] +28934 - Bird snare - [Check, null, null, null, null] +28935 - Boulder - [Set-trap, null, null, null, null] +28936 - Boulder - [null, null, null, null, null] +28937 - Deadfall trap - [Dismantle, Investigate, null, null, null] +28938 - Deadfall trap - [null, null, null, null, null] +28939 - Deadfall trap - [null, null, null, null, null] +28940 - Deadfall trap - [null, null, null, null, null] +28941 - Boulder - [Check, null, null, null, null] +28942 - Boulder - [Check, null, null, null, null] +28943 - Boulder - [Check, null, null, null, null] +28944 - Boulder - [Check, null, null, null, null] +28945 - Boulder - [Check, null, null, null, null] +28946 - null - [null, null, null, null, null] +28947 - null - [null, null, null, null, null] +28948 - null - [null, null, null, null, null] +28949 - null - [null, null, null, null, null] +28950 - null - [null, null, null, null, null] +28951 - Eucalyptus tree - [Chop down, null, hidden, null, null] +28952 - Eucalyptus tree - [Chop down, null, hidden, null, null] +28953 - Eucalyptus tree - [Chop down, null, hidden, null, null] +28954 - Eucalyptus stump - [null, null, null, null, null] +28955 - Eucalyptus stump - [null, null, null, null, null] +28956 - Eucalyptus stump - [null, null, null, null, null] +28957 - null - [null, null, null, null, null] +28958 - null - [null, null, null, null, null] +28959 - null - [null, null, null, null, null] +28960 - null - [null, null, null, null, null] +28961 - null - [null, null, null, null, null] +28962 - null - [null, null, null, null, null] +28963 - null - [null, null, null, null, null] +28964 - null - [null, null, null, null, null] +28965 - null - [null, null, null, null, null] +28966 - null - [null, null, null, null, null] +28967 - null - [null, null, null, null, null] +28968 - null - [null, null, null, null, null] +28969 - null - [null, null, null, null, null] +28970 - null - [null, null, null, null, null] +28971 - null - [null, null, null, null, null] +28972 - null - [null, null, null, null, null] +28973 - null - [null, null, null, null, null] +28974 - null - [null, null, null, null, null] +28975 - null - [null, null, null, null, null] +28976 - null - [null, null, null, null, null] +28977 - null - [null, null, null, null, null] +28978 - null - [null, null, null, null, null] +28979 - null - [null, null, null, null, null] +28980 - null - [null, null, null, null, null] +28981 - null - [null, null, null, null, null] +28982 - null - [null, null, null, null, null] +28983 - null - [null, null, null, null, null] +28984 - null - [null, null, null, null, null] +28985 - null - [null, null, null, null, null] +28986 - null - [null, null, null, null, null] +28987 - null - [null, null, null, null, null] +28988 - null - [null, null, null, null, null] +28989 - null - [null, null, null, null, null] +28990 - null - [null, null, null, null, null] +28991 - null - [null, null, null, null, null] +28992 - null - [null, null, null, null, null] +28993 - null - [null, null, null, null, null] +28994 - null - [null, null, null, null, null] +28995 - null - [null, null, null, null, null] +28996 - null - [null, null, null, null, null] +28997 - null - [null, null, null, null, null] +28998 - null - [null, null, null, null, null] +28999 - Bugs - [null, null, null, null, null] +29000 - Bugs - [null, null, null, null, null] +29001 - Mud bath - [null, null, null, null, null] +29002 - Mud bath - [null, null, null, null, null] +29003 - Mud bath - [null, null, null, null, null] +29004 - Rocks - [Climb-over, null, null, null, null] +29005 - Rocks - [Climb-over, null, null, null, null] +29006 - Mud bath - [null, null, null, null, null] +29007 - Mud bath - [null, null, null, null, null] +29008 - Mud bath - [null, null, null, null, null] +29009 - Mud bath - [null, null, null, null, null] +29010 - Mud bath - [null, null, null, null, null] +29011 - Mud bath - [null, null, null, null, null] +29012 - Mud bath - [null, null, null, null, null] +29013 - Mud bath - [null, null, null, null, null] +29014 - Mud bath - [null, null, null, null, null] +29015 - Sulphur spring - [null, null, null, null, null] +29016 - Sulphur spring - [null, null, null, null, null] +29017 - Sulphur spring - [null, null, null, null, null] +29018 - Rocks - [Climb-over, null, null, null, null] +29019 - Rocks - [Climb-over, null, null, null, null] +29020 - Sulphur spring - [null, null, null, null, null] +29021 - Sulphur spring - [null, null, null, null, null] +29022 - Sulphur spring - [null, null, null, null, null] +29023 - Sulphur spring - [null, null, null, null, null] +29024 - Sulphur spring - [null, null, null, null, null] +29025 - Sulphur spring - [null, null, null, null, null] +29026 - Sulphur spring - [null, null, null, null, null] +29027 - Sulphur spring - [null, null, null, null, null] +29028 - Sulphur spring - [null, null, null, null, null] +29029 - Salt-water spring - [null, null, null, null, null] +29030 - Salt-water spring - [null, null, null, null, null] +29031 - Rocks - [Climb-over, null, null, null, null] +29032 - Rocks - [Climb-over, null, null, null, null] +29033 - Salt-water spring - [null, null, null, null, null] +29034 - Salt-water spring - [null, null, null, null, null] +29035 - Salt-water spring - [null, null, null, null, null] +29036 - Salt-water spring - [null, null, null, null, null] +29037 - Salt-water spring - [null, null, null, null, null] +29038 - Salt-water spring - [null, null, null, null, null] +29039 - Salt-water spring - [null, null, null, null, null] +29040 - Salt-water spring - [null, null, null, null, null] +29041 - Salt-water spring - [null, null, null, null, null] +29042 - Thermal bath - [null, null, null, null, null] +29043 - Thermal bath - [null, null, null, null, null] +29044 - Rocks - [Climb-over, null, null, null, null] +29045 - Rocks - [Climb-over, null, null, null, null] +29046 - Thermal bath - [null, null, null, null, null] +29047 - Thermal bath - [null, null, null, null, null] +29048 - Thermal bath - [null, null, null, null, null] +29049 - Thermal bath - [null, null, null, null, null] +29050 - Thermal bath - [null, null, null, null, null] +29051 - Thermal bath - [null, null, null, null, null] +29052 - Thermal bath - [null, null, null, null, null] +29053 - Thermal spring - [null, null, null, null, null] +29054 - Thermal bath - [null, null, null, null, null] +29055 - Bandos pool - [null, null, null, null, null] +29056 - Bandos pool - [null, null, null, null, null] +29057 - Rocks - [Climb-over, null, null, null, null] +29058 - Rocks - [Climb-over, null, null, null, null] +29059 - Bandos pool - [null, null, null, null, null] +29060 - Bandos pool - [null, null, null, null, null] +29061 - Bandos pool - [null, null, null, null, null] +29062 - Bandos pool - [null, null, null, null, null] +29063 - Bandos pool - [null, null, null, null, null] +29064 - Bandos pool - [null, null, null, null, null] +29065 - Bandos pool - [null, null, null, null, null] +29066 - Bandos pool - [null, null, null, null, null] +29067 - Bandos pool - [null, null, null, null, null] +29068 - null - [null, null, null, null, null] +29069 - null - [null, null, null, null, null] +29070 - null - [null, null, null, null, null] +29071 - null - [null, null, null, null, null] +29072 - null - [null, null, null, null, null] +29073 - null - [null, null, null, null, null] +29074 - null - [null, null, null, null, null] +29075 - null - [null, null, null, null, null] +29076 - null - [null, null, null, null, null] +29077 - null - [null, null, null, null, null] +29078 - null - [null, null, null, null, null] +29079 - null - [null, null, null, null, null] +29080 - null - [null, null, null, null, null] +29081 - null - [null, null, null, null, null] +29082 - null - [null, null, null, null, null] +29083 - null - [null, null, null, null, null] +29084 - null - [null, null, null, null, null] +29085 - Bank booth - [Use, Use-quickly, Collect, null, null] +29086 - Hotel bed - [null, null, null, null, null] +29087 - Hotel bed - [null, null, null, null, null] +29088 - Achey tree - [null, null, Chop, null, null] +29089 - Achey tree - [null, null, Chop, null, null] +29090 - Achey tree - [null, null, null, null, null] +29091 - Spear spit - [null, null, null, null, null] +29092 - Uncooked chompies - [null, null, null, null, null] +29093 - Slowly roasting chompies - [null, null, null, null, null] +29094 - Cooking fire - [null, null, null, null, null] +29095 - Unlit fire - [Light, null, null, hidden, null] +29096 - Fire pit - [null, null, null, null, null] +29097 - null - [null, null, null, null, null] +29098 - null - [null, null, null, null, null] +29099 - Rock passage - [Squeeze-through, null, null, null, null] +29100 - null - [null, null, null, null, null] +29101 - null - [null, null, null, null, null] +29102 - null - [null, null, null, null, null] +29103 - Salon customer - [Talk-to, null, null, null, null] +29104 - Hairdryer - [null, null, null, null, null] +29105 - Sink - [null, null, null, null, null] +29106 - Grimechin - [Talk-to, null, null, null, null] +29107 - Chair - [null, null, null, null, null] +29108 - null - [null, null, null, null, null] +29109 - Glorious mud - [null, null, null, null, null] +29110 - null - [null, null, null, null, null] +29111 - null - [null, null, null, null, null] +29112 - Platypus hole - [null, null, null, null, null] +29113 - Fever grass - [Pick, null, null, null, null] +29114 - Lavender - [Pick, null, null, null, null] +29115 - Tansymum - [Pick, null, null, null, null] +29116 - Primweed - [Pick, null, null, null, null] +29117 - Stinkbloom - [Pick, null, null, null, null] +29118 - Crowd of dwarves - [null, null, null, null, null] +29119 - null - [null, null, null, null, null] +29120 - null - [null, null, null, null, null] +29121 - null - [null, null, null, null, null] +29122 - null - [null, null, null, null, null] +29123 - null - [null, null, null, null, null] +29124 - Ogre roof leaves - [null, null, null, null, null] +29125 - Barrel - [null, null, null, null, null] +29126 - Crate - [null, null, null, null, null] +29127 - null - [null, null, null, null, null] +29128 - null - [null, null, null, null, null] +29129 - Logs - [null, null, null, null, null] +29130 - Shelves - [null, null, null, null, null] +29131 - Table - [null, null, null, null, null] +29132 - Oil lamp - [null, null, null, null, null] +29133 - Oil lamp - [null, null, null, null, null] +29134 - Cooking utensils - [null, null, null, null, null] +29135 - null - [null, null, null, null, null] +29136 - null - [null, null, null, null, null] +29137 - Chair - [null, null, null, null, null] +29138 - Throne - [null, null, null, null, null] +29139 - Fire - [null, null, null, null, null] +29140 - Spikes - [null, null, null, null, null] +29141 - Post - [null, null, null, null, null] +29142 - Pennant - [null, null, null, null, null] +29143 - Pennant - [null, null, null, null, null] +29144 - Shop counter - [null, null, null, null, null] +29145 - Shelves - [null, null, null, null, null] +29146 - Shelves - [null, null, null, null, null] +29147 - Shelves - [null, null, null, null, null] +29148 - Large crate - [null, null, null, null, null] +29149 - Crate - [Search, null, null, null, null] +29150 - Barrels - [null, null, null, null, null] +29151 - Barrel - [null, null, null, null, null] +29152 - Fire pit - [null, Check, null, null, null] +29153 - Fire pit - [null, Check-contents, null, hidden, null] +29154 - Fire pit - [null, Check-contents, null, hidden, null] +29155 - Fire pit - [null, Check, null, null, null] +29156 - Pile of stones - [null, null, null, null, null] +29157 - Pile of stones - [null, null, null, null, null] +29158 - Pile of stones - [null, null, null, null, null] +29159 - Pile of stones - [null, null, null, null, null] +29160 - Pile of stones - [null, null, null, null, null] +29161 - Deadfall - [null, null, null, null, null] +29162 - Deadfall - [null, null, null, null, null] +29163 - Boulder - [Check, null, null, null, null] +29164 - Bird snare - [null, null, null, null, null] +29165 - Bird snare - [Check, null, null, null, null] +29166 - Funeral pyre - [null, null, null, null, null] +29167 - Funeral pyre - [Light, null, null, null, null] +29168 - Gangplank - [Cross, null, null, null, null] +29169 - Gangplank - [Cross, null, null, null, null] +29170 - null - [null, null, null, null, null] +29171 - null - [null, null, null, null, null] +29172 - null - [null, null, null, null, null] +29173 - null - [null, null, null, null, null] +29174 - null - [null, null, null, null, null] +29175 - null - [null, null, null, null, null] +29176 - null - [null, null, null, null, null] +29177 - null - [null, null, null, null, null] +29178 - null - [null, null, null, null, null] +29179 - null - [null, null, null, null, null] +29180 - null - [null, null, null, null, null] +29181 - Funeral pyre - [null, null, null, null, null] +29182 - Funeral pyre - [Light, null, null, null, null] +29183 - null - [null, null, null, null, null] +29184 - null - [null, null, null, null, null] +29185 - Box trap - [null, null, null, null, null] +29186 - Box trap - [null, null, null, null, null] +29187 - Box trap - [null, null, null, null, null] +29188 - Box trap - [null, null, null, null, null] +29189 - Box trap - [null, null, null, null, null] +29190 - Box trap - [null, null, null, null, null] +29191 - Box trap - [null, null, null, null, null] +29192 - Box trap - [null, null, null, null, null] +29193 - null - [null, null, null, null, null] +29194 - Rocks - [Mine, Prospect, hidden, null, null] +29195 - Rocks - [Mine, Prospect, hidden, null, null] +29196 - Rocks - [Mine, Prospect, hidden, null, null] +29197 - Rocks - [Mine, Prospect, hidden, null, null] +29198 - Rocks - [Mine, Prospect, hidden, null, null] +29199 - Rocks - [Mine, Prospect, hidden, null, null] +29200 - Rocks - [Mine, Prospect, hidden, null, null] +29201 - Rocks - [Mine, Prospect, hidden, null, null] +29202 - Rocks - [Mine, Prospect, hidden, null, null] +29203 - Rocks - [Mine, Prospect, hidden, null, null] +29204 - Rocks - [Mine, Prospect, hidden, null, null] +29205 - Rocks - [Mine, Prospect, hidden, null, null] +29206 - Rocks - [Mine, Prospect, hidden, null, null] +29207 - Rocks - [Mine, Prospect, hidden, null, null] +29208 - Rocks - [Mine, Prospect, hidden, null, null] +29209 - Rocks - [Mine, Prospect, hidden, null, null] +29210 - Rocks - [Mine, Prospect, hidden, null, null] +29211 - Rocks - [Mine, Prospect, hidden, null, null] +29212 - Rocks - [Mine, Prospect, hidden, null, null] +29213 - Rocks - [Mine, Prospect, hidden, null, null] +29214 - Rocks - [Mine, Prospect, hidden, null, null] +29215 - Rocks - [Mine, Prospect, hidden, null, null] +29216 - Rocks - [Mine, Prospect, hidden, null, null] +29217 - Rocks - [Mine, Prospect, hidden, null, null] +29218 - Rocks - [Mine, Prospect, hidden, null, null] +29219 - Rocks - [Mine, Prospect, hidden, null, null] +29220 - Rocks - [Mine, Prospect, hidden, null, null] +29221 - Rocks - [Mine, Prospect, hidden, null, null] +29222 - Rocks - [Mine, Prospect, hidden, null, null] +29223 - Rocks - [Mine, Prospect, hidden, null, null] +29224 - Rocks - [Mine, Prospect, hidden, null, null] +29225 - Rocks - [Mine, Prospect, hidden, null, null] +29226 - Rocks - [Mine, Prospect, hidden, null, null] +29227 - Rocks - [Mine, Prospect, hidden, null, null] +29228 - Rocks - [Mine, Prospect, hidden, null, null] +29229 - Rocks - [Mine, Prospect, hidden, null, null] +29230 - Rocks - [Mine, Prospect, hidden, null, null] +29231 - Rocks - [Mine, Prospect, hidden, null, null] +29232 - Rocks - [Mine, Prospect, hidden, null, null] +29233 - Rocks - [Mine, Prospect, hidden, null, null] +29234 - Rocks - [Mine, Prospect, hidden, null, null] +29235 - Rocks - [Mine, Prospect, hidden, null, null] +29236 - Rocks - [Mine, Prospect, hidden, null, null] +29237 - Rocks - [Mine, Prospect, hidden, null, null] +29238 - Rocks - [Mine, Prospect, hidden, null, null] +29239 - null - [null, null, null, null, null] +29240 - null - [null, null, null, null, null] +29241 - null - [null, null, null, null, null] +29242 - null - [null, null, null, null, null] +29243 - null - [null, null, null, null, null] +29244 - null - [null, null, null, null, null] +29245 - null - [null, null, null, null, null] +29246 - null - [null, null, null, null, null] +29247 - null - [null, null, null, null, null] +29248 - null - [null, null, null, null, null] +29249 - null - [null, null, null, null, null] +29250 - null - [null, null, null, null, null] +29251 - null - [null, null, null, null, null] +29252 - null - [null, null, null, null, null] +29253 - null - [null, null, null, null, null] +29254 - null - [null, null, null, null, null] +29255 - null - [null, null, null, null, null] +29256 - null - [null, null, null, null, null] +29257 - null - [null, null, null, null, null] +29258 - null - [null, null, null, null, null] +29259 - null - [null, null, null, null, null] +29260 - null - [null, null, null, null, null] +29261 - Metal door - [Open, null, null, null, null] +29262 - Metal door - [Close, null, null, null, null] +29263 - null - [null, null, null, null, null] +29264 - null - [null, null, null, null, null] +29265 - null - [null, null, null, null, null] +29266 - null - [null, null, null, null, null] +29267 - null - [null, null, null, null, null] +29268 - null - [null, null, null, null, null] +29269 - null - [null, null, null, null, null] +29270 - null - [null, null, null, null, null] +29271 - null - [null, null, null, null, null] +29272 - null - [null, null, null, null, null] +29273 - null - [null, null, null, null, null] +29274 - null - [null, null, null, null, null] +29275 - null - [null, null, null, null, null] +29276 - null - [null, null, null, null, null] +29277 - null - [null, null, null, null, null] +29278 - null - [null, null, null, null, null] +29279 - null - [null, null, null, null, null] +29280 - null - [null, null, null, null, null] +29281 - null - [null, null, null, null, null] +29282 - null - [null, null, null, null, null] +29283 - null - [null, null, null, null, null] +29284 - null - [null, null, null, null, null] +29285 - null - [null, null, null, null, null] +29286 - null - [null, null, null, null, null] +29287 - null - [null, null, null, null, null] +29288 - null - [null, null, null, null, null] +29289 - null - [null, null, null, null, null] +29290 - null - [null, null, null, null, null] +29291 - null - [null, null, null, null, null] +29292 - null - [null, null, null, null, null] +29293 - null - [null, null, null, null, null] +29294 - null - [null, null, null, null, null] +29295 - null - [null, null, null, null, null] +29296 - null - [null, null, null, null, null] +29297 - null - [null, null, null, null, null] +29298 - Stalagmite - [null, null, null, null, null] +29299 - null - [null, null, null, null, null] +29300 - null - [null, null, null, null, null] +29301 - null - [null, null, null, null, null] +29302 - null - [null, null, null, null, null] +29303 - null - [null, null, null, null, null] +29304 - null - [null, null, null, null, null] +29305 - null - [null, null, null, null, null] +29306 - null - [null, null, null, null, null] +29307 - null - [null, null, null, null, null] +29308 - null - [null, null, null, null, null] +29309 - null - [null, null, null, null, null] +29310 - null - [null, null, null, null, null] +29311 - null - [null, null, null, null, null] +29312 - null - [null, null, null, null, null] +29313 - null - [null, null, null, null, null] +29314 - Rack - [null, null, null, null, null] +29315 - Metal door - [Open, null, null, null, null] +29316 - Metal door - [Open, null, null, null, null] +29317 - Metal door - [Close, null, null, null, null] +29318 - Metal door - [Close, null, null, null, null] +29319 - Metal door - [Open, null, null, null, null] +29320 - Metal door - [Open, null, null, null, null] +29321 - Metal door - [Close, null, null, null, null] +29322 - Metal door - [Close, null, null, null, null] +29323 - null - [null, null, null, null, null] +29324 - null - [null, null, null, null, null] +29325 - null - [null, null, null, null, null] +29326 - null - [null, null, null, null, null] +29327 - null - [null, null, null, null, null] +29328 - null - [null, null, null, null, null] +29329 - null - [null, null, null, null, null] +29330 - null - [null, null, null, null, null] +29331 - null - [null, null, null, null, null] +29332 - null - [null, null, null, null, null] +29333 - Barrel - [null, null, null, null, null] +29334 - null - [null, null, null, null, null] +29335 - null - [null, null, null, null, null] +29336 - null - [null, null, null, null, null] +29337 - null - [null, null, null, null, null] +29338 - null - [null, null, null, null, null] +29339 - null - [null, null, null, null, null] +29340 - Corpse - [null, null, null, null, null] +29341 - Corpse - [null, null, null, null, null] +29342 - Corpse - [null, null, null, null, null] +29343 - Corpse - [null, null, null, null, null] +29344 - Animal skull - [null, null, null, null, null] +29345 - Curved bone - [null, null, null, null, null] +29346 - Large bone - [null, null, null, null, null] +29347 - Pile of skulls - [null, null, null, null, null] +29348 - null - [null, null, null, null, null] +29349 - null - [null, null, null, null, null] +29350 - null - [null, null, null, null, null] +29351 - Crates - [Search, null, null, null, null] +29352 - Crate - [Search, null, null, null, null] +29353 - null - [null, null, null, null, null] +29354 - Spiderweb - [Pass, null, null, null, null] +29355 - Ladder - [Climb-up, null, null, null, null] +29356 - Counter - [null, null, null, null, null] +29357 - Ladder - [Climb-down, null, null, null, null] +29358 - Ladder - [Climb-down, null, null, null, null] +29359 - Odd-looking wall - [Push, null, null, null, null] +29360 - Odd-looking wall - [Push, null, null, null, null] +29361 - Odd-looking wall - [Push, null, null, null, null] +29362 - Odd-looking wall - [Push, null, null, null, null] +29363 - null - [null, null, null, null, null] +29364 - null - [null, null, null, null, null] +29365 - null - [null, null, null, null, null] +29366 - null - [null, null, null, null, null] +29367 - null - [null, null, null, null, null] +29368 - null - [null, null, null, null, null] +29369 - null - [null, null, null, null, null] +29370 - Pipe - [Squeeze-through, null, null, null, null] +29371 - null - [null, null, null, null, null] +29372 - null - [null, null, null, null, null] +29373 - Danger sign - [null, null, null, null, null] +29374 - Monkey bars - [null, null, null, null, null] +29375 - Monkey bars - [Swing across, null, null, null, null] +29376 - Monkey bars - [Swing across, null, null, null, null] +29377 - null - [null, null, null, null, null] +29378 - null - [null, null, null, null, null] +29379 - null - [null, null, null, null, null] +29380 - null - [null, null, null, null, null] +29381 - null - [null, null, null, null, null] +29382 - null - [null, null, null, null, null] +29383 - null - [null, null, null, null, null] +29384 - null - [null, null, null, null, null] +29385 - null - [null, null, null, null, null] +29386 - null - [null, null, null, null, null] +29387 - null - [null, null, null, null, null] +29388 - null - [null, null, null, null, null] +29389 - null - [null, null, null, null, null] +29390 - null - [null, null, null, null, null] +29391 - null - [null, null, null, null, null] +29392 - null - [null, null, null, null, null] +29393 - null - [null, null, null, null, null] +29394 - null - [null, null, null, null, null] +29395 - null - [null, null, null, null, null] +29396 - null - [null, null, null, null, null] +29397 - null - [null, null, null, null, null] +29398 - null - [null, null, null, null, null] +29399 - Chest - [Search, Close, null, null, null] +29400 - Chest - [Open, null, null, null, null] +29401 - null - [null, null, null, null, null] +29402 - null - [null, null, null, null, null] +29403 - null - [null, null, null, null, null] +29404 - null - [null, null, null, null, null] +29405 - null - [null, null, null, null, null] +29406 - null - [null, null, null, null, null] +29407 - null - [null, null, null, null, null] +29408 - null - [null, null, null, null, null] +29409 - null - [null, null, null, null, null] +29410 - null - [null, null, null, null, null] +29411 - null - [null, null, null, null, null] +29412 - null - [null, null, null, null, null] +29413 - null - [null, null, null, null, null] +29414 - null - [null, null, null, null, null] +29415 - Obelisk of Earth - [null, null, null, null, null] +29416 - null - [null, null, null, null, null] +29417 - null - [null, null, null, null, null] +29418 - null - [null, null, null, null, null] +29419 - null - [null, null, null, null, null] +29420 - null - [null, null, null, null, null] +29421 - Magical symbol - [null, null, null, null, null] +29422 - null - [null, null, null, null, null] +29423 - null - [null, null, null, null, null] +29424 - null - [null, null, null, null, null] +29425 - Catapult - [null, null, null, null, null] +29426 - Catapult - [null, null, null, null, null] +29427 - Catapult - [null, null, null, null, null] +29428 - Catapult - [null, null, null, null, null] +29429 - null - [null, null, null, null, null] +29430 - null - [null, null, null, null, null] +29431 - null - [null, null, null, null, null] +29432 - Target rock - [null, null, null, null, null] +29433 - Target rock - [null, null, null, null, null] +29434 - Target rock - [null, null, null, null, null] +29435 - Boulder - [null, null, null, null, null] +29436 - Catapult - [null, null, null, null, null] +29437 - Rotten Catapult - [null, null, null, null, null] +29438 - Catapult - [null, null, null, null, null] +29439 - Catapult-winch - [null, null, null, null, null] +29440 - Catapult-winch - [null, null, null, null, null] +29441 - Catapult-winch - [null, null, null, null, null] +29442 - Catapult-lever - [null, null, null, null, null] +29443 - Catapult-lever - [null, null, null, null, null] +29444 - Catapult-lever - [null, null, null, null, null] +29445 - null - [null, null, null, null, null] +29446 - Dirt - [Dig, Flag, Inspect, null, null] +29447 - null - [null, null, null, null, null] +29448 - null - [null, null, null, null, null] +29449 - null - [null, null, null, null, null] +29450 - null - [null, null, null, null, null] +29451 - null - [null, null, null, null, null] +29452 - null - [null, null, null, null, null] +29453 - null - [null, null, null, null, null] +29454 - null - [null, null, null, null, null] +29455 - null - [null, null, null, null, null] +29456 - Dead plant - [null, null, null, null, null] +29457 - Flag - [null, null, null, null, null] +29458 - Dead plant - [null, null, null, null, null] +29459 - Flag - [null, null, null, null, null] +29460 - Stile - [Climb-over, null, null, null, null] +29461 - Instruction sign - [Read, null, null, null, null] +29462 - Instruction sign - [Read, null, null, null, null] +29463 - Instruction sign - [Read, null, null, null, null] +29464 - Instruction sign - [Read, null, null, null, null] +29465 - null - [null, null, null, null, null] +29466 - null - [null, null, null, null, null] +29467 - Table - [null, null, null, null, null] +29468 - Table - [null, null, null, null, null] +29469 - Counter - [null, null, null, null, null] +29470 - Crate - [null, null, null, null, null] +29471 - Crates - [null, null, null, null, null] +29472 - Chair - [null, null, null, null, null] +29473 - Cabinet - [null, null, null, null, null] +29474 - Barrel - [null, null, null, null, null] +29475 - Barrels - [null, null, null, null, null] +29476 - Hole - [Dig, Flag, Inspect, null, null] +29477 - Hole - [Dig, Flag, Inspect, null, null] +29478 - Hole - [Dig, Flag, Inspect, null, null] +29479 - null - [null, null, null, null, null] +29480 - null - [null, null, null, null, null] +29481 - null - [null, null, null, null, null] +29482 - null - [null, null, null, null, null] +29483 - null - [null, null, null, null, null] +29484 - null - [null, null, null, null, null] +29485 - null - [null, null, null, null, null] +29486 - null - [null, null, null, null, null] +29487 - null - [null, null, null, null, null] +29488 - null - [null, null, null, null, null] +29489 - null - [null, null, null, null, null] +29490 - null - [null, null, null, null, null] +29491 - null - [null, null, null, null, null] +29492 - null - [null, null, null, null, null] +29493 - null - [null, null, null, null, null] +29494 - null - [null, null, null, null, null] +29495 - null - [null, null, null, null, null] +29496 - null - [null, null, null, null, null] +29497 - null - [null, null, null, null, null] +29498 - null - [null, null, null, null, null] +29499 - null - [null, null, null, null, null] +29500 - null - [null, null, null, null, null] +29501 - null - [null, null, null, null, null] +29502 - null - [null, null, null, null, null] +29503 - null - [null, null, null, null, null] +29504 - null - [null, null, null, null, null] +29505 - null - [null, null, null, null, null] +29506 - null - [null, null, null, null, null] +29507 - null - [null, null, null, null, null] +29508 - null - [null, null, null, null, null] +29509 - null - [null, null, null, null, null] +29510 - null - [null, null, null, null, null] +29511 - null - [null, null, null, null, null] +29512 - null - [null, null, null, null, null] +29513 - null - [null, null, null, null, null] +29514 - null - [null, null, null, null, null] +29515 - null - [null, null, null, null, null] +29516 - null - [null, null, null, null, null] +29517 - null - [null, null, null, null, null] +29518 - null - [null, null, null, null, null] +29519 - null - [null, null, null, null, null] +29520 - null - [null, null, null, null, null] +29521 - null - [null, null, null, null, null] +29522 - null - [null, null, null, null, null] +29523 - null - [null, null, null, null, null] +29524 - null - [null, null, null, null, null] +29525 - null - [null, null, null, null, null] +29526 - null - [null, null, null, null, null] +29527 - null - [null, null, null, null, null] +29528 - null - [null, null, null, null, null] +29529 - null - [null, null, null, null, null] +29530 - null - [null, null, null, null, null] +29531 - null - [null, null, null, null, null] +29532 - null - [null, null, null, null, null] +29533 - Hole - [null, null, null, null, null] +29534 - Portal - [Enter, null, null, null, null] +29535 - null - [null, null, null, null, null] +29536 - null - [null, null, null, null, null] +29537 - Portal - [Use, null, null, null, null] +29538 - null - [null, null, null, null, null] +29539 - null - [null, null, null, null, null] +29540 - Footprints - [null, null, null, null, null] +29541 - Footprints - [null, null, null, null, null] +29542 - null - [null, null, null, null, null] +29543 - null - [null, null, null, null, null] +29544 - null - [null, null, null, null, null] +29545 - null - [null, null, null, null, null] +29546 - Bar shelves - [null, null, null, null, null] +29547 - Boulder - [null, null, null, null, null] +29548 - Boulder - [null, null, Take-Egg, null, null] +29549 - null - [null, null, null, null, null] +29550 - Wheelbarrow - [null, null, null, null, null] +29551 - Wheelbarrow - [null, null, Take-Egg, null, null] +29552 - null - [null, null, null, null, null] +29553 - Mysterious statue - [null, null, null, null, null] +29554 - Mysterious statue - [null, null, Take-Egg, null, null] +29555 - null - [null, null, null, null, null] +29556 - Statue of Saradomin - [null, null, null, null, null] +29557 - Statue of Saradomin - [null, null, Take-Egg, null, null] +29558 - null - [null, null, null, null, null] +29559 - Shop counter - [null, null, null, null, null] +29560 - Shop counter - [null, null, Take-Egg, null, null] +29561 - null - [null, null, null, null, null] +29562 - Shelves - [null, null, null, null, null] +29563 - Shelves - [null, null, Take-Egg, null, null] +29564 - null - [null, null, null, null, null] +29565 - Barrel - [null, null, null, null, null] +29566 - Barrel - [null, null, Take-Egg, null, null] +29567 - null - [null, null, null, null, null] +29568 - Old bookshelf - [null, null, null, null, null] +29569 - Old bookshelf - [null, null, Take-Egg, null, null] +29570 - null - [null, null, null, null, null] +29571 - Bar shelves - [null, null, null, null, null] +29572 - Bar shelves - [null, null, Take-Egg, null, null] +29573 - null - [null, null, null, null, null] +29574 - null - [null, null, null, null, null] +29575 - Door - [Open, null, null, null, null] +29576 - null - [null, null, null, null, null] +29577 - Treasure chest - [Open, null, null, null, null] +29578 - Treasure chest - [Search, null, null, null, null] +29579 - Slimy skulls - [null, null, null, null, null] +29580 - Slimy skulls - [null, null, null, null, null] +29581 - Bookcase - [null, null, null, null, null] +29582 - Bookcase - [null, null, null, null, null] +29583 - Satchel - [null, null, null, null, null] +29584 - Coat of arms - [null, null, null, null, null] +29585 - Poster - [null, null, null, null, null] +29586 - Poster - [Pull-back, null, null, null, null] +29587 - Desk - [null, null, null, null, null] +29588 - Big desk - [null, null, null, null, null] +29589 - Stairs - [Climb-up, null, null, null, null] +29590 - null - [null, null, null, null, null] +29591 - null - [null, null, null, null, null] +29592 - Stairs - [Climb-down, null, null, null, null] +29593 - Jail bunk - [null, null, null, null, null] +29594 - Jail bunk - [null, null, null, null, null] +29595 - Jail door - [Read-plaque on, null, null, null, null] +29596 - Jail door - [Read-plaque on, null, null, null, null] +29597 - Jail door - [Read-plaque on, null, null, null, null] +29598 - Jail door - [Read-plaque on, null, null, null, null] +29599 - Jail door - [Read-plaque on, null, null, null, null] +29600 - Jail door - [Read-plaque on, null, null, null, null] +29601 - Jail door - [Read-plaque on, null, null, null, null] +29602 - Jail entrance - [Leave, null, null, null, null] +29603 - Jail entrance - [Use, null, null, null, null] +29604 - null - [null, null, null, null, null] +29605 - null - [null, null, null, null, null] +29606 - null - [null, null, null, null, null] +29607 - null - [null, null, null, null, null] +29608 - Broken plaque - [null, null, null, null, null] +29609 - null - [null, null, null, null, null] +29610 - null - [null, null, null, null, null] +29611 - null - [null, null, null, null, null] +29612 - null - [null, null, null, null, null] +29613 - null - [null, null, null, null, null] +29614 - null - [null, null, null, null, null] +29615 - null - [null, null, null, null, null] +29616 - null - [null, null, null, null, null] +29617 - null - [null, null, null, null, null] +29618 - null - [null, null, null, null, null] +29619 - null - [null, null, null, null, null] +29620 - null - [null, null, null, null, null] +29621 - null - [null, null, null, null, null] +29622 - null - [null, null, null, null, null] +29623 - Tunnel - [Use, null, null, null, null] +29624 - Jail door - [Open, null, null, null, null] +29625 - null - [enter, null, null, null, null] +29626 - null - [null, null, null, null, null] +29627 - null - [null, null, null, null, null] +29628 - null - [null, null, null, null, null] +29629 - null - [null, null, null, null, null] +29630 - null - [null, null, null, null, null] +29631 - null - [null, null, null, null, null] +29632 - null - [null, null, null, null, null] +29633 - null - [null, null, null, null, null] +29634 - Rock pile - [null, null, null, null, null] +29635 - null - [null, null, null, null, null] +29636 - null - [null, null, null, null, null] +29637 - null - [null, null, null, null, null] +29638 - null - [null, null, null, null, null] +29639 - null - [null, null, null, null, null] +29640 - null - [null, null, null, null, null] +29641 - null - [null, null, null, null, null] +29642 - null - [null, null, null, null, null] +29643 - null - [null, null, null, null, null] +29644 - null - [null, null, null, null, null] +29645 - null - [null, null, null, null, null] +29646 - null - [null, null, null, null, null] +29647 - null - [null, null, null, null, null] +29648 - null - [null, null, null, null, null] +29649 - null - [null, null, null, null, null] +29650 - null - [null, null, null, null, null] +29651 - null - [null, null, null, null, null] +29652 - null - [null, null, null, null, null] +29653 - null - [null, null, null, null, null] +29654 - null - [null, null, null, null, null] +29655 - Stairs - [Climb-down, null, null, null, null] +29656 - Stairs - [Climb-up, null, null, null, null] +29657 - null - [null, null, null, null, null] +29658 - null - [null, null, null, null, null] +29659 - Stairs - [Climb-down, null, null, null, null] +29660 - Stairs - [Climb-up, null, null, null, null] +29661 - null - [null, null, null, null, null] +29662 - null - [null, null, null, null, null] +29663 - Stairs - [Climb-down, null, null, null, null] +29664 - Stairs - [Climb-up, null, null, null, null] +29665 - null - [null, null, null, null, null] +29666 - null - [null, null, null, null, null] +29667 - Stairs - [Climb-down, null, null, null, null] +29668 - Stairs - [Climb-up, null, null, null, null] +29669 - null - [null, null, null, null, null] +29670 - null - [null, null, null, null, null] +29671 - Stairs - [Climb-down, null, null, null, null] +29672 - Stairs - [Climb-up, null, null, null, null] +29673 - null - [null, null, null, null, null] +29674 - null - [null, null, null, null, null] +29675 - null - [null, null, null, null, null] +29676 - null - [null, null, null, null, null] +29677 - null - [null, null, null, null, null] +29678 - null - [null, null, null, null, null] +29679 - null - [null, null, null, null, null] +29680 - null - [null, null, null, null, null] +29681 - null - [null, null, null, null, null] +29682 - null - [null, null, null, null, null] +29683 - null - [null, null, null, null, null] +29684 - null - [null, null, null, null, null] +29685 - null - [null, null, null, null, null] +29686 - null - [null, null, null, null, null] +29687 - null - [null, null, null, null, null] +29688 - null - [null, null, null, null, null] +29689 - null - [null, null, null, null, null] +29690 - null - [null, null, null, null, null] +29691 - null - [null, null, null, null, null] +29692 - null - [null, null, null, null, null] +29693 - null - [null, null, null, null, null] +29694 - null - [null, null, null, null, null] +29695 - null - [null, null, null, null, null] +29696 - null - [null, null, null, null, null] +29697 - null - [null, null, null, null, null] +29698 - null - [null, null, null, null, null] +29699 - null - [null, null, null, null, null] +29700 - null - [null, null, null, null, null] +29701 - null - [null, null, null, null, null] +29702 - null - [null, null, null, null, null] +29703 - null - [null, null, null, null, null] +29704 - null - [null, null, null, null, null] +29705 - null - [null, null, null, null, null] +29706 - null - [null, null, null, null, null] +29707 - null - [null, null, null, null, null] +29708 - null - [null, null, null, null, null] +29709 - null - [null, null, null, null, null] +29710 - null - [null, null, null, null, null] +29711 - null - [null, null, null, null, null] +29712 - null - [null, null, null, null, null] +29713 - null - [null, null, null, null, null] +29714 - null - [null, null, null, null, null] +29715 - null - [null, null, null, null, null] +29716 - null - [null, null, null, null, null] +29717 - null - [null, null, null, null, null] +29718 - null - [null, null, null, null, null] +29719 - null - [null, null, null, null, null] +29720 - null - [null, null, null, null, null] +29721 - null - [null, null, null, null, null] +29722 - null - [null, null, null, null, null] +29723 - null - [null, null, null, null, null] +29724 - null - [null, null, null, null, null] +29725 - null - [null, null, null, null, null] +29726 - Rocks - [null, null, null, null, null] +29727 - Rocks - [null, null, null, null, null] +29728 - Crevice - [Enter, null, null, null, null] +29729 - Rope - [Climb, null, null, null, null] +29730 - An old lever - [Pull, null, null, null, null] +29731 - An old lever - [Pull, null, null, null, null] +29732 - Door - [Open, null, null, null, null] +29733 - null - [null, null, null, null, null] +29734 - null - [null, null, null, null, null] +29735 - null - [null, null, null, null, null] +29736 - null - [null, null, null, null, null] +29737 - Kennith - [Talk-to, null, null, null, null] +29738 - Ezekial Lovecraft - [Talk-to, null, null, null, null] +29739 - Villagers - [null, null, null, null, null] +29740 - Minecart - [Crouch, null, null, null, null] +29741 - Steam vent - [Use, null, null, null, null] +29742 - Steam vent - [null, null, null, null, null] +29743 - Iron pickaxe - [Pick-up, null, null, null, null] +29744 - Lever - [Use, null, null, null, null] +29745 - Rocks - [Break, null, hidden, null, null] +29746 - Rubium - [Mine, Prospect, hidden, null, null] +29747 - Wall - [Prospect, null, null, null, null] +29748 - Wall - [Prospect, null, null, null, null] +29749 - Wall - [Mine, Prospect, hidden, null, null] +29750 - Wall - [Enter, null, null, null, null] +29751 - null - [null, null, null, null, null] +29752 - null - [null, null, null, null, null] +29753 - null - [null, null, null, null, null] +29754 - null - [null, null, null, null, null] +29755 - null - [null, null, null, null, null] +29756 - null - [null, null, null, null, null] +29757 - null - [null, null, null, null, null] +29758 - null - [null, null, null, null, null] +29759 - null - [null, null, null, null, null] +29760 - null - [null, null, null, null, null] +29761 - null - [null, null, null, null, null] +29762 - null - [null, null, null, null, null] +29763 - null - [null, null, null, null, null] +29764 - null - [null, null, null, null, null] +29765 - null - [null, null, null, null, null] +29766 - null - [null, null, null, null, null] +29767 - null - [null, null, null, null, null] +29768 - null - [null, null, null, null, null] +29769 - null - [null, null, null, null, null] +29770 - null - [null, null, null, null, null] +29771 - null - [null, null, null, null, null] +29772 - null - [null, null, null, null, null] +29773 - null - [null, null, null, null, null] +29774 - null - [null, null, null, null, null] +29775 - Door - [Open, null, null, null, null] +29776 - Door - [Open, null, null, null, null] +29777 - Door - [Open, null, null, null, null] +29778 - Door - [Open, null, null, null, null] +29779 - null - [null, null, null, null, null] +29780 - null - [null, null, null, null, null] +29781 - null - [null, null, null, null, null] +29782 - null - [null, null, null, null, null] +29783 - null - [null, null, null, null, null] +29784 - null - [null, null, null, null, null] +29785 - null - [null, null, null, null, null] +29786 - null - [null, null, null, null, null] +29787 - null - [null, null, null, null, null] +29788 - null - [null, null, null, null, null] +29789 - null - [null, null, null, null, null] +29790 - null - [null, null, null, null, null] +29791 - null - [null, null, null, null, null] +29792 - null - [null, null, null, null, null] +29793 - null - [null, null, null, null, null] +29794 - null - [null, null, null, null, null] +29795 - null - [null, null, null, null, null] +29796 - null - [null, null, null, null, null] +29797 - Bed - [null, null, null, null, null] +29798 - Chair - [null, null, null, null, null] +29799 - null - [null, null, null, null, null] +29800 - null - [null, null, null, null, null] +29801 - null - [null, null, null, null, null] +29802 - null - [null, null, null, null, null] +29803 - Barrel - [null, null, null, null, null] +29804 - Broken lobster trap - [null, null, null, null, null] +29805 - null - [null, null, null, null, null] +29806 - null - [null, null, null, null, null] +29807 - Rocks - [Climb-over, null, null, null, null] +29808 - Toy train - [Pick-up, null, null, null, null] +29809 - Entrance - [Enter, null, null, null, null] +29810 - Entrance - [Enter, null, null, null, null] +29811 - Bed - [null, null, null, null, null] +29812 - null - [null, null, null, null, null] +29813 - null - [null, null, null, null, null] +29814 - null - [null, null, null, null, null] +29815 - null - [null, null, null, null, null] +29816 - null - [null, null, null, null, null] +29817 - null - [null, null, null, null, null] +29818 - null - [null, null, null, null, null] +29819 - null - [null, null, null, null, null] +29820 - null - [null, null, null, null, null] +29821 - null - [null, null, null, null, null] +29822 - null - [null, null, null, null, null] +29823 - null - [null, null, null, null, null] +29824 - null - [null, null, null, null, null] +29825 - Sign - [null, null, null, null, null] +29826 - Rabbit hole - [Investigate, null, null, null, null] +29827 - Rabbit hole - [Deposit-Eggs, null, null, null, null] +29828 - Rabbit hole - [Enter, null, null, null, null] +29829 - Rabbit hole - [Leave-Warren, null, null, null, null] +29830 - Rabbit hole - [Enter, null, null, null, null] +29831 - Rabbit hole - [Enter, null, null, null, null] +29832 - Easter banqueting table - [null, null, null, null, null] +29833 - Easter dining chair - [null, null, null, null, null] +29834 - null - [null, null, null, null, null] +29835 - null - [null, null, null, null, null] +29836 - null - [null, null, null, null, null] +29837 - Easter flag - [null, null, null, null, null] +29838 - Easter banner - [null, null, null, null, null] +29839 - Incubator instructions - [Read, null, null, null, null] +29840 - Chocolate mixer - [Add-Chocolate, null, null, null, null] +29841 - Chocolate mixer - [Add-Chocolate, null, null, null, null] +29842 - null - [null, null, null, null, null] +29843 - null - [null, null, null, null, null] +29844 - null - [null, null, null, null, null] +29845 - null - [null, null, null, null, null] +29846 - null - [null, null, null, null, null] +29847 - null - [null, null, null, null, null] +29848 - null - [null, null, null, null, null] +29849 - null - [null, null, null, null, null] +29850 - null - [null, null, null, null, null] +29851 - null - [null, null, null, null, null] +29852 - Basket - [null, null, null, null, null] +29853 - Incubator water tank - [Add-Water, Check, null, null, null] +29854 - Incubator water tank - [Add-Water, Check, null, null, null] +29855 - Incubator coal scuttle - [Add-Coal, Check, null, null, null] +29856 - Incubator coal scuttle - [Add-Coal, Check, null, null, null] +29857 - Incubator - [Add-Egg, null, null, null, null] +29858 - Incubator - [null, null, null, null, null] +29859 - Incubator - [null, null, null, null, null] +29860 - Incubator - [null, null, null, null, null] +29861 - Incubator - [null, null, null, null, null] +29862 - Incubator - [null, null, null, null, null] +29863 - Incubator - [null, null, null, null, null] +29864 - Incubator controls - [Adjust-Temperature, null, null, null, null] +29865 - Cockatrice eggs - [Take-Egg, null, null, null, null] +29866 - Cockatrice eggs - [Take-Egg, null, null, null, null] +29867 - Large table - [Take-Bucket, null, null, null, null] +29868 - Coal - [Fill-Buckets, null, null, null, null] +29869 - Chocolate pool - [Dip-Egg, null, null, null, null] +29870 - null - [null, null, null, null, null] +29871 - Water pool - [Fill-Buckets, null, null, null, null] +29872 - null - [null, null, null, null, null] +29873 - null - [null, null, null, null, null] +29874 - null - [null, null, null, null, null] +29875 - null - [null, null, null, null, null] +29876 - null - [null, null, null, null, null] +29877 - null - [null, null, null, null, null] +29878 - null - [null, null, null, null, null] +29879 - null - [null, null, null, null, null] +29880 - null - [null, null, null, null, null] +29881 - null - [null, null, null, null, null] +29882 - Small obelisk - [Renew-points, null, null, null, null] +29883 - null - [null, null, null, null, null] +29884 - null - [null, null, null, null, null] +29885 - null - [null, null, null, null, null] +29886 - null - [null, null, null, null, null] +29887 - Shaking box - [Check, null, null, null, null] +29888 - Shaking box - [Check, null, null, null, null] +29889 - Box trap - [null, null, null, null, null] +29890 - Box trap - [null, null, null, null, null] +29891 - Box trap - [null, null, null, null, null] +29892 - Box trap - [null, null, null, null, null] +29893 - Box trap - [null, null, null, null, null] +29894 - Box trap - [null, null, null, null, null] +29895 - Box trap - [null, null, null, null, null] +29896 - Box trap - [null, null, null, null, null] +29897 - Shaking box - [Check, null, null, null, null] +29898 - Shaking box - [Check, null, null, null, null] +29899 - Shaking box - [Check, null, null, null, null] +29900 - Shaking box - [Check, null, null, null, null] +29901 - Shaking box - [Check, null, null, null, null] +29902 - Shaking box - [Check, null, null, null, null] +29903 - Shaking box - [Check, null, null, null, null] +29904 - Shaking box - [Check, null, null, null, null] +29905 - Shaking box - [Check, null, null, null, null] +29906 - Box trap - [null, null, null, null, null] +29907 - Box trap - [null, null, null, null, null] +29908 - Box trap - [null, null, null, null, null] +29909 - Box trap - [null, null, null, null, null] +29910 - Shaking box - [Check, null, null, null, null] +29911 - Shaking box - [Check, null, null, null, null] +29912 - Shaking box - [Check, null, null, null, null] +29913 - Shaking box - [Check, null, null, null, null] +29914 - Box trap - [null, null, null, null, null] +29915 - Box trap - [null, null, null, null, null] +29916 - Box trap - [null, null, null, null, null] +29917 - Box trap - [null, null, null, null, null] +29918 - Box trap - [null, null, null, null, null] +29919 - Box trap - [null, null, null, null, null] +29920 - Box trap - [null, null, null, null, null] +29921 - Box trap - [null, null, null, null, null] +29922 - Box trap - [null, null, null, null, null] +29923 - Box trap - [null, null, null, null, null] +29924 - Box trap - [null, null, null, null, null] +29925 - Box trap - [null, null, null, null, null] +29926 - Box trap - [null, null, null, null, null] +29927 - Box trap - [null, null, null, null, null] +29928 - Box trap - [null, null, null, null, null] +29929 - Box trap - [null, null, null, null, null] +29930 - Net trap - [Check, null, null, null, null] +29931 - Net trap - [Check, null, null, null, null] +29932 - Net trap - [Check, null, null, null, null] +29933 - Net trap - [Check, null, null, null, null] +29934 - Net trap - [Check, null, null, null, null] +29935 - Net trap - [Check, null, null, null, null] +29936 - Net trap - [Check, null, null, null, null] +29937 - Net trap - [Check, null, null, null, null] +29938 - Small obelisk - [Renew-points, null, null, null, null] +29939 - Small obelisk - [Renew-points, null, null, null, null] +29940 - Small obelisk - [Renew-points, null, null, null, null] +29941 - Small obelisk - [Renew-points, null, null, null, null] +29942 - Small obelisk - [Renew-points, null, null, null, null] +29943 - Small obelisk - [Renew-points, null, null, null, null] +29944 - Small obelisk - [Renew-points, null, null, null, null] +29945 - Small obelisk - [Renew-points, null, null, null, null] +29946 - Small obelisk - [Renew-points, null, null, null, null] +29947 - Small obelisk - [Renew-points, null, null, null, null] +29948 - Small obelisk - [Renew-points, null, null, null, null] +29949 - Small obelisk - [Renew-points, null, null, null, null] +29950 - Small obelisk - [Renew-points, null, null, null, null] +29951 - Small obelisk - [Renew-points, null, null, null, null] +29952 - Small obelisk - [Renew-points, null, null, null, null] +29953 - Small obelisk - [Renew-points, null, null, null, null] +29954 - Small obelisk - [Renew-points, null, null, null, null] +29955 - Small obelisk - [Renew-points, null, null, null, null] +29956 - Small obelisk - [Renew-points, null, null, null, null] +29957 - Small obelisk - [Renew-points, null, null, null, null] +29958 - Small obelisk - [Renew-points, null, null, null, null] +29959 - Small obelisk - [Renew-points, null, null, null, null] +29960 - Box trap - [null, null, null, null, null] +29961 - Box trap - [null, null, null, null, null] +29962 - Box trap - [null, null, null, null, null] +29963 - Box trap - [null, null, null, null, null] +29964 - Box trap - [null, null, null, null, null] +29965 - Box trap - [null, null, null, null, null] +29966 - Box trap - [null, null, null, null, null] +29967 - Box trap - [null, null, null, null, null] +29968 - Box trap - [null, null, null, null, null] +29969 - Box trap - [null, null, null, null, null] +29970 - Box trap - [null, null, null, null, null] +29971 - Box trap - [null, null, null, null, null] +29972 - Box trap - [null, null, null, null, null] +29973 - Box trap - [null, null, null, null, null] +29974 - Box trap - [null, null, null, null, null] +29975 - Box trap - [null, null, null, null, null] +29976 - Box trap - [null, null, null, null, null] +29977 - Box trap - [null, null, null, null, null] +29978 - Box trap - [null, null, null, null, null] +29979 - Box trap - [null, null, null, null, null] +29980 - Box trap - [null, null, null, null, null] +29981 - Box trap - [null, null, null, null, null] +29982 - Box trap - [null, null, null, null, null] +29983 - Box trap - [null, null, null, null, null] +29984 - Box trap - [null, null, null, null, null] +29985 - Box trap - [null, null, null, null, null] +29986 - Box trap - [null, null, null, null, null] +29987 - Box trap - [null, null, null, null, null] +29988 - Box trap - [null, null, null, null, null] +29989 - Box trap - [null, null, null, null, null] +29990 - Box trap - [null, null, null, null, null] +29991 - Box trap - [null, null, null, null, null] +29992 - null - [null, null, null, null, null] +29993 - null - [null, null, null, null, null] +29994 - null - [null, null, null, null, null] +29995 - null - [null, null, null, null, null] +29996 - null - [null, null, null, null, null] +29997 - null - [null, null, null, null, null] +29998 - null - [null, null, null, null, null] +29999 - null - [null, null, null, null, null] +30000 - null - [null, null, null, null, null] +30001 - null - [null, null, null, null, null] +30002 - null - [null, null, null, null, null] +30003 - null - [null, null, null, null, null] +30004 - null - [null, null, null, null, null] +30005 - null - [null, null, null, null, null] +30006 - null - [null, null, null, null, null] +30007 - null - [null, null, null, null, null] +30008 - null - [null, null, null, null, null] +30009 - null - [null, null, null, null, null] +30010 - Rubble - [null, null, null, null, null] +30011 - Trapdoor - [Open, null, null, null, null] +30012 - Broken roof - [null, null, null, null, null] +30013 - Damaged wall - [null, null, null, null, null] +30014 - Repaired wall - [null, null, null, null, null] +30015 - Bank booth - [null, null, null, null, null] +30016 - Bank booth - [Use, Use-quickly, Collect, null, null] +30017 - Fire - [null, null, null, null, null] +30018 - Broken furnace - [null, null, null, null, null] +30019 - Repaired furnace - [null, null, null, null, null] +30020 - Repaired furnace - [null, null, null, null, null] +30021 - Furnace - [Smelt, null, null, null, null] +30022 - Shelves - [null, null, null, null, null] +30023 - null - [null, null, null, null, null] +30024 - null - [null, null, null, null, null] +30025 - null - [null, null, null, null, null] +30026 - null - [null, null, null, null, null] +30027 - null - [null, null, null, null, null] +30028 - null - [null, null, null, null, null] +30029 - null - [null, null, null, null, null] +30030 - null - [null, null, null, null, null] +30031 - Ladder - [Climb-up, null, null, null, null] +30032 - Gnomecopter - [Fly, null, null, null, null] +30033 - Gnomecopter - [null, null, null, null, null] +30034 - Gnomecopter - [null, null, null, null, null] +30035 - Gnome stall - [null, null, null, null, null] +30036 - Entrance sign - [Read, null, null, null, null] +30037 - Advertisement - [Read, null, null, null, null] +30038 - null - [null, null, null, null, null] +30039 - Signpost - [Read, null, null, null, null] +30040 - Signpost - [Read, null, null, null, null] +30041 - null - [null, null, null, null, null] +30042 - null - [null, null, null, null, null] +30043 - Windsock - [null, null, null, null, null] +30044 - Deposit box - [Deposit, null, null, null, null] +30045 - Deposit box - [Deposit, null, null, null, null] +30046 - null - [null, null, null, null, null] +30047 - null - [null, null, null, null, null] +30048 - null - [null, null, null, null, null] +30049 - null - [null, null, null, null, null] +30050 - null - [null, null, null, null, null] +30051 - null - [null, null, null, null, null] +30052 - null - [null, null, null, null, null] +30053 - null - [null, null, null, null, null] +30054 - null - [null, null, null, null, null] +30055 - null - [null, null, null, null, null] +30056 - null - [null, null, null, null, null] +30057 - null - [null, null, null, null, null] +30058 - null - [null, null, null, null, null] +30059 - null - [null, null, null, null, null] +30060 - null - [null, null, null, null, null] +30061 - null - [null, null, null, null, null] +30062 - null - [null, null, null, null, null] +30063 - null - [null, null, null, null, null] +30064 - null - [null, null, null, null, null] +30065 - null - [null, null, null, null, null] +30066 - null - [null, null, null, null, null] +30067 - null - [null, null, null, null, null] +30068 - null - [null, null, null, null, null] +30069 - null - [null, null, null, null, null] +30070 - Windsock - [null, null, null, null, null] +30071 - null - [null, null, null, null, null] +30072 - null - [null, null, null, null, null] +30073 - null - [null, null, null, null, null] +30074 - Table - [View-game, null, null, null, null] +30075 - Table - [View-game, null, null, null, null] +30076 - Table - [View-game, null, null, null, null] +30077 - Table - [View-game, null, null, null, null] +30078 - Table - [null, null, null, null, null] +30079 - Table - [null, null, null, null, null] +30080 - Table - [null, null, null, null, null] +30081 - Table - [null, null, null, null, null] +30082 - Pit - [null, null, null, null, null] +30083 - Spiked pit - [null, null, null, null, null] +30084 - Collapsed trap - [null, null, null, null, null] +30085 - Collapsed trap - [null, null, null, null, null] +30086 - Pit trap - [null, null, null, null, null] +30087 - Pit trap - [null, null, null, null, null] +30088 - Pit trap - [null, null, null, null, null] +30089 - Pit trap - [null, null, null, null, null] +30090 - Pit trap - [null, null, null, null, null] +30091 - Pit trap - [null, null, null, null, null] +30092 - Pit trap - [null, null, null, null, null] +30093 - Pit trap - [null, null, null, null, null] +30094 - Hole - [null, null, null, null, null] +30095 - Tracks - [null, null, null, null, null] +30096 - Tracks - [null, null, null, null, null] +30097 - Tracks - [null, null, null, null, null] +30098 - Snow drift - [null, null, null, null, null] +30099 - Hollow log - [null, null, null, null, null] +30100 - Hollow log - [null, null, null, null, null] +30101 - Hollow log - [null, null, null, null, null] +30102 - Tunnel - [null, null, null, null, null] +30103 - Steps - [null, null, null, null, null] +30104 - Steps - [null, null, null, null, null] +30105 - Bird snare - [null, null, null, null, null] +30106 - Bird snare - [null, null, null, null, null] +30107 - Bird snare - [null, null, null, null, null] +30108 - Bird snare - [null, null, null, null, null] +30109 - Bird snare - [null, null, null, null, null] +30110 - Bird snare - [null, null, null, null, null] +30111 - Bird snare - [null, null, null, null, null] +30112 - Bird snare - [null, null, null, null, null] +30113 - Bird snare - [null, null, null, null, null] +30114 - - [null, null, null, null, null] +30115 - Staircase - [Climb, null, null, null, null] +30116 - Gate - [Open, null, null, null, null] +30117 - Gate - [Close, null, null, null, null] +30118 - Gate - [Open, null, null, null, null] +30119 - Gate - [Close, null, null, null, null] +30120 - Gate - [Open, null, Repair, null, null] +30121 - Gate - [Close, null, Repair, null, null] +30122 - Gate - [Open, null, Repair, null, null] +30123 - Gate - [Close, null, Repair, null, null] +30124 - Gate - [Open, null, Repair, null, null] +30125 - Gate - [Close, null, Repair, null, null] +30126 - Gate - [Open, null, Repair, null, null] +30127 - Gate - [Close, null, Repair, null, null] +30128 - Gate - [Open, null, Repair, null, null] +30129 - Gate - [Close, null, Repair, null, null] +30130 - Gate - [Open, null, Repair, null, null] +30131 - Gate - [Close, null, Repair, null, null] +30132 - Tree - [Chop down, null, null, null, null] +30133 - Tree - [Chop down, null, null, null, null] +30134 - null - [null, null, null, null, null] +30135 - null - [null, null, null, null, null] +30136 - null - [null, null, null, null, null] +30137 - null - [null, null, null, null, null] +30138 - null - [null, null, null, null, null] +30139 - null - [null, null, null, null, null] +30140 - null - [null, null, null, null, null] +30141 - Energy barrier - [Pass, null, null, null, null] +30142 - Stone dispenser - [null, null, null, null, null] +30143 - Stone dispenser - [Take-stone, null, null, null, null] +30144 - Forfeit tunnel - [Exit-through, null, null, null, null] +30145 - Forfeit tunnel - [Exit-through, null, null, null, null] +30146 - Portal - [Use, null, null, null, null] +30147 - null - [null, null, null, null, null] +30148 - null - [null, null, null, null, null] +30149 - null - [null, null, null, null, null] +30150 - null - [null, null, null, null, null] +30151 - null - [null, null, null, null, null] +30152 - null - [null, null, null, null, null] +30153 - null - [null, null, null, null, null] +30154 - null - [null, null, null, null, null] +30155 - null - [null, null, null, null, null] +30156 - null - [null, null, null, null, null] +30157 - null - [null, null, null, null, null] +30158 - null - [null, null, null, null, null] +30159 - null - [null, null, null, null, null] +30160 - null - [null, null, null, null, null] +30161 - null - [null, null, null, null, null] +30162 - null - [null, null, null, null, null] +30163 - null - [null, null, null, null, null] +30164 - null - [null, null, null, null, null] +30165 - null - [null, null, null, null, null] +30166 - null - [null, null, null, null, null] +30167 - null - [null, null, null, null, null] +30168 - null - [null, null, null, null, null] +30169 - null - [null, null, null, null, null] +30170 - null - [null, null, null, null, null] +30171 - null - [null, null, null, null, null] +30172 - null - [null, null, null, null, null] +30173 - null - [null, null, null, null, null] +30174 - null - [null, null, null, null, null] +30175 - null - [null, null, null, null, null] +30176 - null - [null, null, null, null, null] +30177 - null - [null, null, null, null, null] +30178 - null - [null, null, null, null, null] +30179 - null - [null, null, null, null, null] +30180 - null - [null, null, null, null, null] +30181 - null - [null, null, null, null, null] +30182 - null - [null, null, null, null, null] +30183 - null - [null, null, null, null, null] +30184 - null - [null, null, null, null, null] +30185 - null - [null, null, null, null, null] +30186 - null - [null, null, null, null, null] +30187 - null - [null, null, null, null, null] +30188 - null - [null, null, null, null, null] +30189 - null - [null, null, null, null, null] +30190 - null - [null, null, null, null, null] +30191 - null - [null, null, null, null, null] +30192 - null - [null, null, null, null, null] +30193 - null - [null, null, null, null, null] +30194 - null - [null, null, null, null, null] +30195 - null - [null, null, null, null, null] +30196 - null - [null, null, null, null, null] +30197 - null - [null, null, null, null, null] +30198 - null - [null, null, null, null, null] +30199 - null - [null, null, null, null, null] +30200 - null - [null, null, null, null, null] +30201 - null - [null, null, null, null, null] +30202 - null - [null, null, null, null, null] +30203 - Stairs - [Exit, null, null, null, null] +30204 - Cave entrance - [Enter, null, null, null, null] +30205 - Scoreboard - [Look-at, null, null, null, null] +30206 - Crates - [null, null, null, null, null] +30207 - Crates - [null, null, null, null, null] +30208 - Crate - [null, null, null, null, null] +30209 - Shelf - [null, null, null, null, null] +30210 - Small shelf - [null, null, null, null, null] +30211 - Spear barrel - [null, null, null, null, null] +30212 - Counter - [null, null, null, null, null] +30213 - Entrance - [null, null, null, null, null] +30214 - Bench - [null, null, null, null, null] +30215 - Bench - [null, null, null, null, null] +30216 - Bench - [null, null, null, null, null] +30217 - Bench - [null, null, null, null, null] +30218 - Bench - [null, null, null, null, null] +30219 - Punchbag - [null, null, null, null, null] +30220 - Punchbag - [null, null, null, null, null] +30221 - Suit of armour - [null, null, null, null, null] +30222 - Table - [null, null, null, null, null] +30223 - Fountain - [null, null, null, null, null] +30224 - Passageway - [Go-through, null, null, null, null] +30225 - null - [null, null, null, null, null] +30226 - null - [null, null, null, null, null] +30227 - null - [null, null, null, null, null] +30228 - null - [null, null, null, null, null] +30229 - null - [null, null, null, null, null] +30230 - null - [null, null, null, null, null] +30231 - null - [null, null, null, null, null] +30232 - null - [null, null, null, null, null] +30233 - null - [null, null, null, null, null] +30234 - null - [null, null, null, null, null] +30235 - null - [null, null, null, null, null] +30236 - null - [null, null, null, null, null] +30237 - null - [null, null, null, null, null] +30238 - null - [null, null, null, null, null] +30239 - null - [null, null, null, null, null] +30240 - null - [null, null, null, null, null] +30241 - null - [null, null, null, null, null] +30242 - null - [null, null, null, null, null] +30243 - null - [null, null, null, null, null] +30244 - null - [null, null, null, null, null] +30245 - null - [null, null, null, null, null] +30246 - null - [null, null, null, null, null] +30247 - null - [null, null, null, null, null] +30248 - null - [null, null, null, null, null] +30249 - null - [null, null, null, null, null] +30250 - null - [null, null, null, null, null] +30251 - null - [null, null, null, null, null] +30252 - null - [null, null, null, null, null] +30253 - null - [null, null, null, null, null] +30254 - null - [null, null, null, null, null] +30255 - null - [null, null, null, null, null] +30256 - null - [null, null, null, null, null] +30257 - null - [null, null, null, null, null] +30258 - null - [null, null, null, null, null] +30259 - null - [null, null, null, null, null] +30260 - null - [null, null, null, null, null] +30261 - Wooden doors - [Open, null, null, null, null] +30262 - Wooden doors - [Open, null, null, null, null] +30263 - Wooden doors - [Walk-through, null, null, null, null] +30264 - Wooden doors - [Walk-through, null, null, null, null] +30265 - Wooden doors - [Open, null, null, null, null] +30266 - Wooden doors - [null, null, null, null, null] +30267 - null - [null, null, null, null, null] +30268 - null - [null, null, null, null, null] +30269 - null - [null, null, null, null, null] +30270 - null - [null, null, null, null, null] +30271 - null - [null, null, null, null, null] +30272 - null - [null, null, null, null, null] +30273 - null - [null, null, null, null, null] +30274 - null - [null, null, null, null, null] +30275 - Ladder - [null, null, null, null, null] +30276 - null - [null, null, null, null, null] +30277 - Shelves - [null, null, null, null, null] +30278 - Corpse - [null, null, null, null, null] +30279 - Bookshelf - [null, null, null, null, null] +30280 - Bookshelf - [null, null, null, null, null] +30281 - Lab table - [null, null, null, null, null] +30282 - null - [null, null, null, null, null] +30283 - null - [null, null, null, null, null] +30284 - null - [null, null, null, null, null] +30285 - null - [null, null, null, null, null] +30286 - null - [null, null, null, null, null] +30287 - null - [null, null, null, null, null] +30288 - Crate - [null, null, null, null, null] +30289 - Gnome skeleton - [null, null, null, null, null] +30290 - null - [null, null, null, null, null] +30291 - null - [null, null, null, null, null] +30292 - null - [null, null, null, null, null] +30293 - null - [null, null, null, null, null] +30294 - null - [null, null, null, null, null] +30295 - Column - [null, null, null, null, null] +30296 - Column - [null, null, null, null, null] +30297 - Column - [null, null, null, null, null] +30298 - null - [null, null, null, null, null] +30299 - null - [null, null, null, null, null] +30300 - null - [null, null, null, null, null] +30301 - null - [null, null, null, null, null] +30302 - null - [null, null, null, null, null] +30303 - null - [null, null, null, null, null] +30304 - null - [null, null, null, null, null] +30305 - null - [null, null, null, null, null] +30306 - null - [null, null, null, null, null] +30307 - null - [null, null, null, null, null] +30308 - null - [null, null, null, null, null] +30309 - null - [null, null, null, null, null] +30310 - null - [null, null, null, null, null] +30311 - null - [null, null, null, null, null] +30312 - null - [null, null, null, null, null] +30313 - null - [null, null, null, null, null] +30314 - null - [null, null, null, null, null] +30315 - null - [null, null, null, null, null] +30316 - null - [null, null, null, null, null] +30317 - null - [null, null, null, null, null] +30318 - null - [null, null, null, null, null] +30319 - Broken rusty cage - [null, null, null, null, null] +30320 - Rusty broken cage - [null, null, null, null, null] +30321 - Broken rusting cage - [null, null, null, null, null] +30322 - Caged skeleton - [null, null, null, null, null] +30323 - Broken range - [null, null, null, null, null] +30324 - Equipment table - [null, null, null, null, null] +30325 - Broken equipment table - [null, null, null, null, null] +30326 - Operating table - [null, null, null, null, null] +30327 - Restraining table - [null, null, null, null, null] +30328 - Restraining table - [null, null, null, null, null] +30329 - Restraining table. - [null, null, null, null, null] +30330 - Research desk - [null, null, null, null, null] +30331 - Research desk - [null, null, null, null, null] +30332 - Research table - [null, null, null, null, null] +30333 - null - [null, null, null, null, null] +30334 - null - [null, null, null, null, null] +30335 - Crate - [null, null, null, null, null] +30336 - null - [null, null, null, null, null] +30337 - Large rowboat - [null, null, null, null, null] +30338 - null - [null, null, null, null, null] +30339 - null - [null, null, null, null, null] +30340 - null - [null, null, null, null, null] +30341 - null - [null, null, null, null, null] +30342 - null - [null, null, null, null, null] +30343 - null - [null, null, null, null, null] +30344 - null - [null, null, null, null, null] +30345 - null - [null, null, null, null, null] +30346 - null - [null, null, null, null, null] +30347 - null - [null, null, null, null, null] +30348 - null - [null, null, null, null, null] +30349 - null - [null, null, null, null, null] +30350 - null - [null, null, null, null, null] +30351 - null - [null, null, null, null, null] +30352 - null - [null, null, null, null, null] +30353 - null - [null, null, null, null, null] +30354 - null - [null, null, null, null, null] +30355 - null - [null, null, null, null, null] +30356 - null - [null, null, null, null, null] +30357 - null - [null, null, null, null, null] +30358 - null - [null, null, null, null, null] +30359 - null - [null, null, null, null, null] +30360 - null - [null, null, null, null, null] +30361 - null - [null, null, null, null, null] +30362 - null - [null, null, null, null, null] +30363 - null - [null, null, null, null, null] +30364 - null - [null, null, null, null, null] +30365 - null - [null, null, null, null, null] +30366 - null - [null, null, null, null, null] +30367 - null - [null, null, null, null, null] +30368 - null - [null, null, null, null, null] +30369 - null - [null, null, null, null, null] +30370 - null - [null, null, null, null, null] +30371 - null - [null, null, null, null, null] +30372 - null - [null, null, null, null, null] +30373 - null - [null, null, null, null, null] +30374 - null - [null, null, null, null, null] +30375 - null - [null, null, null, null, null] +30376 - null - [null, null, null, null, null] +30377 - null - [null, null, null, null, null] +30378 - null - [null, null, null, null, null] +30379 - null - [null, null, null, null, null] +30380 - null - [null, null, null, null, null] +30381 - null - [null, null, null, null, null] +30382 - null - [null, null, null, null, null] +30383 - null - [null, null, null, null, null] +30384 - null - [null, null, null, null, null] +30385 - null - [null, null, null, null, null] +30386 - null - [null, null, null, null, null] +30387 - null - [null, null, null, null, null] +30388 - null - [null, null, null, null, null] +30389 - null - [null, null, null, null, null] +30390 - null - [null, null, null, null, null] +30391 - null - [null, null, null, null, null] +30392 - null - [null, null, null, null, null] +30393 - null - [null, null, null, null, null] +30394 - null - [null, null, null, null, null] +30395 - null - [null, null, null, null, null] +30396 - null - [null, null, null, null, null] +30397 - null - [null, null, null, null, null] +30398 - null - [null, null, null, null, null] +30399 - null - [null, null, null, null, null] +30400 - null - [null, null, null, null, null] +30401 - null - [null, null, null, null, null] +30402 - null - [null, null, null, null, null] +30403 - null - [null, null, null, null, null] +30404 - null - [null, null, null, null, null] +30405 - null - [null, null, null, null, null] +30406 - null - [null, null, null, null, null] +30407 - null - [null, null, null, null, null] +30408 - null - [null, null, null, null, null] +30409 - null - [null, null, null, null, null] +30410 - null - [null, null, null, null, null] +30411 - null - [null, null, null, null, null] +30412 - null - [null, null, null, null, null] +30413 - null - [null, null, null, null, null] +30414 - null - [null, null, null, null, null] +30415 - null - [null, null, null, null, null] +30416 - null - [null, null, null, null, null] +30417 - null - [null, null, null, null, null] +30418 - null - [null, null, null, null, null] +30419 - null - [null, null, null, null, null] +30420 - null - [null, null, null, null, null] +30421 - null - [null, null, null, null, null] +30422 - null - [null, null, null, null, null] +30423 - null - [null, null, null, null, null] +30424 - null - [null, null, null, null, null] +30425 - null - [null, null, null, null, null] +30426 - null - [null, null, null, null, null] +30427 - null - [null, null, null, null, null] +30428 - null - [null, null, null, null, null] +30429 - null - [null, null, null, null, null] +30430 - null - [null, null, null, null, null] +30431 - null - [null, null, null, null, null] +30432 - null - [null, null, null, null, null] +30433 - null - [null, null, null, null, null] +30434 - null - [null, null, null, null, null] +30435 - null - [null, null, null, null, null] +30436 - null - [null, null, null, null, null] +30437 - null - [null, null, null, null, null] +30438 - null - [null, null, null, null, null] +30439 - null - [null, null, null, null, null] +30440 - null - [null, null, null, null, null] +30441 - null - [null, null, null, null, null] +30442 - null - [null, null, null, null, null] +30443 - null - [null, null, null, null, null] +30444 - null - [null, null, null, null, null] +30445 - null - [null, null, null, null, null] +30446 - null - [null, null, null, null, null] +30447 - null - [null, null, null, null, null] +30448 - null - [null, null, null, null, null] +30449 - null - [null, null, null, null, null] +30450 - null - [null, null, null, null, null] +30451 - null - [null, null, null, null, null] +30452 - null - [null, null, null, null, null] +30453 - null - [null, null, null, null, null] +30454 - null - [null, null, null, null, null] +30455 - null - [null, null, null, null, null] +30456 - null - [null, null, null, null, null] +30457 - null - [null, null, null, null, null] +30458 - Wooden beam - [null, null, null, null, null] +30459 - Wooden beam - [climb-up, null, null, null, null] +30460 - Safalaan - [Look-at, null, null, null, null] +30461 - null - [null, null, null, null, null] +30462 - Andiess Juip - [Look-at, null, null, null, null] +30463 - Kael Forshaw - [Look-at, null, null, null, null] +30464 - Safalaan - [null, null, null, null, null] +30465 - Andiess Juip - [null, null, null, null, null] +30466 - Kael Forshaw - [null, null, null, null, null] +30467 - Funeral pyre - [null, null, null, null, null] +30468 - Funeral pyre - [null, null, null, null, null] +30469 - Funeral pyre - [null, null, null, null, null] +30470 - Funeral pyre - [null, null, null, null, null] +30471 - Funeral pyre - [null, null, null, null, null] +30472 - Funeral pyre - [null, null, null, null, null] +30473 - Funeral pyre - [null, null, null, null, null] +30474 - Funeral pyre - [null, null, null, null, null] +30475 - Funeral pyre - [null, null, null, null, null] +30476 - Funeral pyre - [null, null, null, null, null] +30477 - Funeral pyre - [null, null, null, null, null] +30478 - Funeral pyre - [Light, null, null, null, null] +30479 - Funeral pyre - [Light, null, null, null, null] +30480 - Funeral pyre - [Light, null, null, null, null] +30481 - Funeral pyre - [Light, null, null, null, null] +30482 - Funeral pyre - [Light, null, null, null, null] +30483 - Funeral pyre - [Light, null, null, null, null] +30484 - Funeral pyre - [Light, null, null, null, null] +30485 - Funeral pyre - [Light, null, null, null, null] +30486 - Funeral pyre - [Light, null, null, null, null] +30487 - Funeral pyre - [Light, null, null, null, null] +30488 - Stone stand - [null, null, null, null, null] +30489 - Ladder - [Climb-up, null, null, null, null] +30490 - Crude table - [Search, null, null, null, null] +30491 - Bunk bed - [Search, null, null, null, null] +30492 - Bunk bed - [Search, null, null, null, null] +30493 - Wooden post - [null, null, null, null, null] +30494 - Wooden post - [Climb-up, null, null, null, null] +30495 - Wooden beam - [Climb-down, null, null, null, null] +30496 - Floorboards - [null, null, null, null, Jump-to] +30497 - Floorboards - [null, null, null, null, Jump-to] +30498 - Damaged wall - [null, null, null, null, Jump-onto] +30499 - Damaged wall - [null, null, null, null, Jump-onto] +30500 - Destroyed wall - [null, null, null, null, Jump-thru] +30501 - Floorboards - [null, null, null, null, Jump-to] +30502 - Floorboards - [null, null, null, null, Jump-to] +30503 - Door - [Open, null, null, null, null] +30504 - Mass of debris - [null, null, null, null, null] +30505 - Mass of debris - [Search, null, hidden, null, Excavate] +30506 - Mass of debris - [Search, null, hidden, null, Excavate] +30507 - Mass of debris - [Search, null, hidden, null, Excavate] +30508 - Empty furnace - [null, null, null, null, null] +30509 - Coal-filled furnace - [null, null, null, null, null] +30510 - Furnace - [null, Smelt, null, null, null] +30511 - Barrel - [Search, null, null, null, null] +30512 - Barrel - [null, null, null, null, null] +30513 - Shelf - [Search, null, null, null, null] +30514 - Shelf - [null, null, null, null, null] +30515 - Tool rack - [Search, null, null, null, null] +30516 - Tool rack - [Search, null, null, null, null] +30517 - Crate - [Search, null, null, null, null] +30518 - Banner - [null, null, null, null, null] +30519 - null - [null, null, null, null, null] +30520 - Trough - [null, null, null, null, null] +30521 - Trough - [Search, null, null, null, null] +30522 - Door - [Search, null, null, null, null] +30523 - Door - [Search, null, null, null, null] +30524 - Door - [Climb-thru, null, null, null, null] +30525 - Door - [null, null, null, null, null] +30526 - Door - [Search, null, null, null, null] +30527 - Door - [Search, null, null, null, null] +30528 - Strange stones - [Search, null, null, null, null] +30529 - Strange stones - [Search, null, null, null, null] +30530 - Strange stones - [Enter, null, null, null, null] +30531 - Instructions - [Look-at, Read, null, null, null] +30532 - Wall - [null, null, null, null, null] +30533 - Stairway - [Climb-down, null, null, null, null] +30534 - Stairs - [Climb-up, null, null, null, null] +30535 - Wall storage - [Search, Open, null, null, null] +30536 - Wall storage - [Search, null, null, null, null] +30537 - Wooden recess - [Open, null, null, null, null] +30538 - Wooden recess - [Open, null, null, null, null] +30539 - Coal barrel - [Search, null, null, null, null] +30540 - Empty barrel - [null, null, null, null, null] +30541 - Boxes - [null, null, null, null, null] +30542 - Crate - [null, null, null, null, null] +30543 - Coffin - [null, null, hidden, null, null] +30544 - Coffin - [null, null, hidden, null, null] +30545 - Coffin - [null, null, null, null, null] +30546 - Coffin - [null, null, null, null, null] +30547 - Coffin - [null, null, null, null, null] +30548 - Raised coffin - [null, null, null, null, null] +30549 - Skull stonepile - [null, null, null, null, null] +30550 - Stone coffin - [null, null, null, null, null] +30551 - Stone coffin - [null, null, null, null, null] +30552 - Skull stonepile - [null, null, null, null, null] +30553 - Stone coffin - [null, null, null, null, null] +30554 - Gravestone - [null, null, null, null, null] +30555 - Jutting wall - [Squeeze-past, null, null, null, null] +30556 - Jutting wall - [Squeeze-past, null, null, null, null] +30557 - Jutting wall - [Squeeze-past, null, null, null, null] +30558 - Speartrap - [null, null, null, null, null] +30559 - Cave entrance - [Enter, null, null, null, null] +30560 - Cave entrance - [Enter, null, null, null, null] +30561 - Cave entrance - [Enter, null, null, null, null] +30562 - Blackboard - [null, null, null, null, null] +30563 - Fishing rods - [Search, null, null, null, null] +30564 - Wall chest coffin - [null, null, null, null, null] +30565 - Wall chest coffin - [null, null, null, null, null] +30566 - Corpse - [Look-at, null, null, null, Search] +30567 - Lectern - [Search, null, null, null, null] +30568 - null - [null, null, null, null, null] +30569 - Torch - [null, null, null, null, null] +30570 - Cell door - [Open, null, null, null, null] +30571 - Trapdoor - [Open, null, null, null, null] +30572 - Ladder - [Climb-down, Close, null, null, null] +30573 - Trapdoor - [Open, null, null, null, null] +30574 - Ladder - [Climb-down, null, null, null, null] +30575 - Ladder - [Climb-up, null, null, null, null] +30576 - Column - [null, null, null, null, null] +30577 - Column - [null, null, null, null, null] +30578 - Column - [null, null, null, null, null] +30579 - null - [null, null, null, null, null] +30580 - null - [null, null, null, null, null] +30581 - null - [null, null, null, null, null] +30582 - null - [null, null, null, null, null] +30583 - null - [null, null, null, null, null] +30584 - null - [null, null, null, null, null] +30585 - null - [null, null, null, null, null] +30586 - null - [null, null, null, null, null] +30587 - null - [null, null, null, null, null] +30588 - null - [null, null, null, null, null] +30589 - null - [null, null, null, null, null] +30590 - null - [null, null, null, null, null] +30591 - null - [null, null, null, null, null] +30592 - null - [null, null, null, null, null] +30593 - null - [null, null, null, null, null] +30594 - null - [null, null, null, null, null] +30595 - null - [null, null, null, null, null] +30596 - null - [null, null, null, null, null] +30597 - null - [null, null, null, null, null] +30598 - null - [null, null, null, null, null] +30599 - null - [null, null, null, null, null] +30600 - null - [null, null, null, null, null] +30601 - null - [null, null, null, null, null] +30602 - null - [null, null, null, null, null] +30603 - null - [null, null, null, null, null] +30604 - null - [null, null, null, null, null] +30605 - null - [null, null, null, null, null] +30606 - null - [null, null, null, null, null] +30607 - null - [null, null, null, null, null] +30608 - null - [null, null, null, null, null] +30609 - null - [null, null, null, null, null] +30610 - null - [null, null, null, null, null] +30611 - null - [null, null, null, null, null] +30612 - null - [null, null, null, null, null] +30613 - null - [null, null, null, null, null] +30614 - null - [null, null, null, null, null] +30615 - null - [null, null, null, null, null] +30616 - null - [null, null, null, null, null] +30617 - null - [null, null, null, null, null] +30618 - Statue - [null, null, null, null, null] +30619 - Statue - [null, null, null, null, null] +30620 - null - [null, null, null, null, null] +30621 - null - [null, null, null, null, null] +30622 - null - [null, null, null, null, null] +30623 - null - [null, null, null, null, null] +30624 - Altar - [Craft-rune, null, null, null, null] +30625 - Gravestone - [null, null, null, null, null] +30626 - Shelves - [null, null, null, null, null] +30627 - null - [null, null, null, null, null] +30628 - null - [null, null, null, null, null] +30629 - null - [null, null, null, null, null] +30630 - null - [null, null, null, null, null] +30631 - null - [null, null, null, null, null] +30632 - null - [null, null, null, null, null] +30633 - null - [null, null, null, null, null] +30634 - null - [null, null, null, null, null] +30635 - null - [null, null, null, null, null] +30636 - null - [null, null, null, null, null] +30637 - null - [null, null, null, null, null] +30638 - null - [null, null, null, null, null] +30639 - null - [null, null, null, null, null] +30640 - null - [null, null, null, null, null] +30641 - null - [null, null, null, null, null] +30642 - null - [null, null, null, null, null] +30643 - null - [null, null, null, null, null] +30644 - null - [null, null, null, null, null] +30645 - null - [null, null, null, null, null] +30646 - null - [null, null, null, null, null] +30647 - Shelves - [null, null, null, null, null] +30648 - Shelves - [null, null, null, null, null] +30649 - Shelves - [null, null, null, null, null] +30650 - Shelves - [null, null, null, null, null] +30651 - Bookcase - [null, null, null, null, null] +30652 - Crate - [null, null, null, null, null] +30653 - null - [null, null, null, null, null] +30654 - null - [null, null, null, null, null] +30655 - null - [null, null, null, null, null] +30656 - null - [null, null, null, null, null] +30657 - null - [null, null, null, null, null] +30658 - null - [null, null, null, null, null] +30659 - null - [null, null, null, null, null] +30660 - null - [null, null, null, null, null] +30661 - null - [null, null, null, null, null] +30662 - null - [null, null, null, null, null] +30663 - null - [null, null, null, null, null] +30664 - null - [null, null, null, null, null] +30665 - null - [null, null, null, null, null] +30666 - null - [null, null, null, null, null] +30667 - Gravestone - [null, null, null, null, null] +30668 - Gravestone - [null, null, null, null, null] +30669 - Gravestone - [null, null, null, null, null] +30670 - Gravestone - [null, null, null, null, null] +30671 - Gravestone - [null, null, null, null, null] +30672 - Gravestone - [null, null, null, null, null] +30673 - null - [null, null, null, null, null] +30674 - null - [null, null, null, null, null] +30675 - null - [null, null, null, null, null] +30676 - null - [null, null, null, null, null] +30677 - null - [null, null, null, null, null] +30678 - null - [null, null, null, null, null] +30679 - null - [null, null, null, null, null] +30680 - null - [null, null, null, null, null] +30681 - null - [null, null, null, null, null] +30682 - null - [null, null, null, null, null] +30683 - null - [null, null, null, null, null] +30684 - null - [null, null, null, null, null] +30685 - Statue - [null, null, null, null, null] +30686 - Bust - [null, null, null, null, null] +30687 - Bust - [null, null, null, null, null] +30688 - null - [null, null, null, null, null] +30689 - null - [null, null, null, null, null] +30690 - null - [null, null, null, null, null] +30691 - Bench - [null, null, null, null, null] +30692 - null - [null, null, null, null, null] +30693 - null - [null, null, null, null, null] +30694 - null - [null, null, null, null, null] +30695 - null - [null, null, null, null, null] +30696 - null - [null, null, null, null, null] +30697 - null - [null, null, null, null, null] +30698 - null - [null, null, null, null, null] +30699 - null - [null, null, null, null, null] +30700 - null - [null, null, null, null, null] +30701 - null - [null, null, null, null, null] +30702 - null - [null, null, null, null, null] +30703 - null - [null, null, null, null, null] +30704 - null - [null, null, null, null, null] +30705 - null - [null, null, null, null, null] +30706 - null - [null, null, null, null, null] +30707 - Large door - [Open, Knock-at, null, null, null] +30708 - Large door - [Open, Knock-at, null, null, null] +30709 - null - [null, null, null, null, null] +30710 - null - [null, null, null, null, null] +30711 - null - [null, null, null, null, null] +30712 - null - [null, null, null, null, null] +30713 - null - [null, null, null, null, null] +30714 - null - [null, null, null, null, null] +30715 - null - [null, null, null, null, null] +30716 - null - [null, null, null, null, null] +30717 - null - [null, null, null, null, null] +30718 - null - [null, null, null, null, null] +30719 - null - [null, null, null, null, null] +30720 - null - [null, null, null, null, null] +30721 - null - [null, null, null, null, null] +30722 - Staircase - [Climb-up, null, null, null, null] +30723 - Staircase top - [Climb-down, null, null, null, null] +30724 - Staircase - [Climb-up, null, null, null, null] +30725 - Staircase top - [Climb-down, null, null, null, null] +30726 - Altar - [Pray-at, null, null, null, null] +30727 - Candle - [null, null, null, null, null] +30728 - Morytania coffin - [Open, null, null, null, null] +30729 - Church pew - [null, null, null, null, null] +30730 - Broken church pew - [null, null, null, null, null] +30731 - Broken church pew - [null, null, null, null, null] +30732 - Ladder - [Climb-up, null, null, null, null] +30733 - Ladder - [Climb-down, null, null, null, null] +30734 - Table - [null, null, null, null, null] +30735 - Lantern - [null, null, null, null, null] +30736 - Chair - [null, null, null, null, null] +30737 - Broken Chair - [null, null, null, null, null] +30738 - Broken Chair - [null, null, null, null, null] +30739 - Broken Chair - [null, null, null, null, null] +30740 - Bookcase - [Search, null, null, null, null] +30741 - Bookcase - [Search, null, null, null, null] +30742 - Desk - [null, null, null, null, null] +30743 - Stand - [null, null, null, null, null] +30744 - Jail bed - [null, null, null, null, null] +30745 - null - [null, null, null, null, null] +30746 - null - [null, null, null, null, null] +30747 - null - [null, null, null, null, null] +30748 - null - [null, null, null, null, null] +30749 - null - [null, null, null, null, null] +30750 - null - [null, null, null, null, null] +30751 - Broken Table - [null, null, null, null, null] +30752 - Candles - [null, null, null, null, null] +30753 - Candles - [null, null, null, null, null] +30754 - Church organ - [Play, null, null, null, null] +30755 - null - [null, null, null, null, null] +30756 - Massive ribs - [null, null, null, null, null] +30757 - null - [null, null, null, null, null] +30758 - null - [null, null, null, null, null] +30759 - null - [null, null, null, null, null] +30760 - null - [null, null, null, null, null] +30761 - null - [null, null, null, null, null] +30762 - null - [null, null, null, null, null] +30763 - null - [null, null, null, null, null] +30764 - null - [null, null, null, null, null] +30765 - null - [null, null, null, null, null] +30766 - null - [null, null, null, null, null] +30767 - null - [null, null, null, null, null] +30768 - null - [null, null, null, null, null] +30769 - null - [null, null, null, null, null] +30770 - null - [null, null, null, null, null] +30771 - null - [null, null, null, null, null] +30772 - null - [null, null, null, null, null] +30773 - null - [null, null, null, null, null] +30774 - null - [null, null, null, null, null] +30775 - null - [null, null, null, null, null] +30776 - null - [null, null, null, null, null] +30777 - null - [null, null, null, null, null] +30778 - null - [null, null, null, null, null] +30779 - null - [null, null, null, null, null] +30780 - null - [null, null, null, null, null] +30781 - null - [null, null, null, null, null] +30782 - null - [null, null, null, null, null] +30783 - null - [null, null, null, null, null] +30784 - null - [null, null, null, null, null] +30785 - null - [null, null, null, null, null] +30786 - null - [null, null, null, null, null] +30787 - null - [null, null, null, null, null] +30788 - null - [null, null, null, null, null] +30789 - null - [null, null, null, null, null] +30790 - null - [null, null, null, null, null] +30791 - null - [null, null, null, null, null] +30792 - null - [null, null, null, null, null] +30793 - null - [null, null, null, null, null] +30794 - Torch - [null, null, null, null, null] +30795 - Tree - [null, null, null, null, null] +30796 - null - [null, null, null, null, null] +30797 - null - [null, null, null, null, null] +30798 - null - [null, null, null, null, null] +30799 - Snow - [null, null, null, null, null] +30800 - Snow - [null, null, null, null, null] +30801 - Snow - [null, null, null, null, null] +30802 - Snow - [null, null, null, null, null] +30803 - Snow - [null, null, null, null, null] +30804 - Dying roses - [Take-seed, null, null, null, null] +30805 - Growing roses - [Take-seed, null, null, null, null] +30806 - Roses - [Take-seed, null, null, null, null] +30807 - Roses - [Take-seed, null, null, null, null] +30808 - Dragon machine - [null, null, null, null, null] +30809 - Machine - [null, null, null, null, null] +30810 - Machine - [null, null, null, null, null] +30811 - Machine - [null, null, null, null, null] +30812 - Convertor - [null, null, null, null, null] +30813 - Pickaxe machine - [null, null, null, null, null] +30814 - null - [null, null, null, null, null] +30815 - null - [null, null, null, null, null] +30816 - null - [null, null, null, null, null] +30817 - Bookcase - [Search, null, null, null, null] +30818 - Bookcase - [Search, null, null, null, null] +30819 - Bench - [null, null, null, null, null] +30820 - Fountain - [null, null, null, null, null] +30821 - Font - [null, null, null, null, null] +30822 - Small table - [null, null, null, null, null] +30823 - Drawers - [Open, null, null, null, null] +30824 - Drawers - [null, Search, Shut, null, null] +30825 - Bed - [null, null, null, null, null] +30826 - Stool - [null, null, null, null, null] +30827 - Table - [null, null, null, null, null] +30828 - Table - [null, null, null, null, null] +30829 - Barrel - [null, null, null, null, null] +30830 - Table - [null, null, null, null, null] +30831 - null - [null, null, null, null, null] +30832 - null - [null, null, null, null, null] +30833 - null - [null, null, null, null, null] +30834 - null - [null, null, null, null, null] +30835 - null - [null, null, null, null, null] +30836 - null - [null, null, null, null, null] +30837 - null - [null, null, null, null, null] +30838 - null - [null, null, null, null, null] +30839 - null - [null, null, null, null, null] +30840 - null - [null, null, null, null, null] +30841 - null - [null, null, null, null, null] +30842 - null - [null, null, null, null, null] +30843 - null - [null, null, null, null, null] +30844 - null - [null, null, null, null, null] +30845 - null - [null, null, null, null, null] +30846 - null - [null, null, null, null, null] +30847 - null - [null, null, null, null, null] +30848 - null - [null, null, null, null, null] +30849 - null - [null, null, null, null, null] +30850 - null - [null, null, null, null, null] +30851 - null - [null, null, null, null, null] +30852 - null - [null, null, null, null, null] +30853 - null - [null, null, null, null, null] +30854 - null - [null, null, null, null, null] +30855 - null - [null, null, null, null, null] +30856 - null - [null, null, null, null, null] +30857 - null - [null, null, null, null, null] +30858 - null - [null, null, null, null, null] +30859 - null - [null, null, null, null, null] +30860 - null - [null, null, null, null, null] +30861 - null - [null, null, null, null, null] +30862 - null - [null, null, null, null, null] +30863 - Ladder - [Climb-down, null, null, null, null] +30864 - Door - [Open, null, null, null, null] +30865 - Door - [Close, null, null, null, null] +30866 - Workbench - [null, null, null, null, null] +30867 - null - [null, null, null, null, null] +30868 - Crevice - [Squeeze-through, null, null, null, null] +30869 - null - [null, null, null, null, null] +30870 - null - [null, null, null, null, null] +30871 - null - [null, null, null, null, null] +30872 - null - [null, null, null, null, null] +30873 - null - [null, null, null, null, null] +30874 - null - [null, null, null, null, null] +30875 - null - [null, null, null, null, null] +30876 - Rockslide - [null, null, null, null, null] +30877 - Rockslide - [null, null, null, null, null] +30878 - Rockslide - [null, null, null, null, null] +30879 - null - [null, null, null, null, null] +30880 - null - [null, null, null, null, null] +30881 - null - [null, null, null, null, null] +30882 - null - [null, null, null, null, null] +30883 - null - [null, null, null, null, null] +30884 - null - [null, null, null, null, null] +30885 - null - [null, null, null, null, null] +30886 - null - [null, null, null, null, null] +30887 - null - [null, null, null, null, null] +30888 - null - [null, null, null, null, null] +30889 - null - [null, null, null, null, null] +30890 - null - [null, null, null, null, null] +30891 - null - [null, null, null, null, null] +30892 - null - [null, null, null, null, null] +30893 - null - [null, null, null, null, null] +30894 - null - [null, null, null, null, null] +30895 - null - [null, null, null, null, null] +30896 - null - [null, null, null, null, null] +30897 - null - [null, null, null, null, null] +30898 - null - [null, null, null, null, null] +30899 - null - [null, null, null, null, null] +30900 - null - [null, null, null, null, null] +30901 - null - [null, null, null, null, null] +30902 - null - [null, null, null, null, null] +30903 - null - [null, null, null, null, null] +30904 - null - [null, null, null, null, null] +30905 - null - [null, null, null, null, null] +30906 - null - [null, null, null, null, null] +30907 - null - [null, null, null, null, null] +30908 - null - [null, null, null, null, null] +30909 - null - [null, null, null, null, null] +30910 - null - [null, null, null, null, null] +30911 - null - [null, null, null, null, null] +30912 - null - [null, null, null, null, null] +30913 - null - [null, null, null, null, null] +30914 - null - [null, null, null, null, null] +30915 - null - [null, null, null, null, null] +30916 - null - [null, null, null, null, null] +30917 - null - [null, null, null, null, null] +30918 - null - [null, null, null, null, null] +30919 - Stalagmite - [null, null, null, null, null] +30920 - null - [null, null, null, null, null] +30921 - null - [null, null, null, null, null] +30922 - null - [null, null, null, null, null] +30923 - Counter - [null, null, null, null, null] +30924 - Crates - [Search, null, null, null, null] +30925 - Crate - [Search, null, null, null, null] +30926 - Barrel - [null, null, null, null, null] +30927 - Chest - [Search, null, Close, null, null] +30928 - Chest - [Open, null, null, null, null] +30929 - Stool - [null, null, null, null, null] +30930 - null - [null, null, null, null, null] +30931 - null - [null, null, null, null, null] +30932 - null - [null, null, null, null, null] +30933 - Torch - [null, null, null, null, null] +30934 - Flames - [null, null, null, null, null] +30935 - null - [null, null, null, null, null] +30936 - null - [null, null, null, null, null] +30937 - null - [null, null, null, null, null] +30938 - Sacks - [Search, null, null, null, null] +30939 - Table - [null, null, null, null, null] +30940 - null - [null, null, null, null, null] +30941 - Ladder - [Climb-up, null, null, null, null] +30942 - Ladder - [Climb-down, null, null, null, null] +30943 - Stairs - [Climb-up, null, null, null, null] +30944 - Stairs - [Climb-down, null, null, null, null] +30945 - A shabby tent - [null, null, null, null, null] +30946 - null - [null, null, null, null, null] +30947 - null - [null, null, null, null, null] +30948 - null - [null, null, null, null, null] +30949 - null - [null, null, null, null, null] +30950 - null - [null, null, null, null, null] +30951 - null - [null, null, null, null, null] +30952 - null - [null, null, null, null, null] +30953 - null - [null, null, null, null, null] +30954 - null - [null, null, null, null, null] +30955 - null - [null, null, null, null, null] +30956 - null - [null, null, null, null, null] +30957 - null - [null, null, null, null, null] +30958 - null - [null, null, null, null, null] +30959 - null - [null, null, null, null, null] +30960 - null - [null, null, null, null, null] +30961 - Machine - [null, null, null, null, null] +30962 - Chest - [null, null, null, null, null] +30963 - Chest - [Open, null, null, null, null] +30964 - Machine - [null, null, null, null, null] +30965 - null - [null, null, null, null, null] +30966 - null - [null, null, null, null, null] +30967 - null - [null, null, null, null, null] +30968 - null - [null, null, null, null, null] +30969 - null - [null, null, null, null, null] +30970 - null - [null, null, null, null, null] +30971 - null - [null, null, null, null, null] +30972 - null - [null, null, null, null, null] +30973 - null - [null, null, null, null, null] +30974 - null - [null, null, null, null, null] +30975 - null - [null, null, null, null, null] +30976 - null - [null, null, null, null, null] +30977 - null - [null, null, null, null, null] +30978 - null - [null, null, null, null, null] +30979 - null - [null, null, null, null, null] +30980 - null - [null, null, null, null, null] +30981 - null - [null, null, null, null, null] +30982 - null - [null, null, null, null, null] +30983 - null - [null, null, null, null, null] +30984 - null - [null, null, null, null, null] +30985 - null - [null, null, null, null, null] +30986 - null - [null, null, null, null, null] +30987 - null - [null, null, null, null, null] +30988 - null - [null, null, null, null, null] +30989 - null - [null, null, null, null, null] +30990 - null - [null, null, null, null, null] +30991 - null - [null, null, null, null, null] +30992 - null - [null, null, null, null, null] +30993 - null - [null, null, null, null, null] +30994 - null - [null, null, null, null, null] +30995 - null - [null, null, null, null, null] +30996 - null - [null, null, null, null, null] +30997 - Dragon eggs - [null, null, null, null, null] +30998 - Rocks - [null, null, null, null, null] +30999 - null - [null, null, null, null, null] +31000 - Bush - [null, null, null, null, null] +31001 - Ladder - [Climb-down, null, null, null, null] +31002 - Ladder - [Climb-up, null, null, null, null] +31003 - Ladder - [Climb-up, null, null, null, null] +31004 - null - [null, null, null, null, null] +31005 - Nesting bird - [null, null, null, null, null] +31006 - Nesting bird - [null, null, null, null, null] +31007 - Nesting bird - [null, null, null, null, null] +31008 - null - [null, null, null, null, null] +31009 - null - [null, null, null, null, null] +31010 - Trapdoor - [Climb-down, null, null, null, null] +31011 - Trapdoor - [Open, null, null, null, null] +31012 - null - [null, null, null, null, null] +31013 - Crate - [Search, null, null, null, null] +31014 - Wrecked tent - [Take, null, null, null, null] +31015 - Remains - [null, null, null, null, null] +31016 - Tent - [null, null, null, null, null] +31017 - Tent - [null, null, null, null, null] +31018 - Bush - [Search, null, null, null, null] +31019 - Bush - [Search, null, null, null, null] +31020 - Bush - [Search, null, null, null, null] +31021 - Bush - [Search, null, null, null, null] +31022 - Bush - [Search, null, null, null, null] +31023 - Bush - [Search, null, null, null, null] +31024 - Bush - [Search, null, null, null, null] +31025 - Bush - [Search, null, null, null, null] +31026 - Cart - [null, null, null, null, null] +31027 - Rocks - [null, null, null, null, null] +31028 - null - [null, null, null, null, null] +31029 - Parachuting gnome - [null, null, null, null, null] +31030 - Door - [null, null, null, null, null] +31031 - null - [null, null, null, null, null] +31032 - null - [null, null, null, null, null] +31033 - null - [null, null, null, null, null] +31034 - null - [null, null, null, null, null] +31035 - null - [null, null, null, null, null] +31036 - null - [null, null, null, null, null] +31037 - null - [null, null, null, null, null] +31038 - null - [null, null, null, null, null] +31039 - null - [null, null, null, null, null] +31040 - null - [null, null, null, null, null] +31041 - null - [null, null, null, null, null] +31042 - null - [null, null, null, null, null] +31043 - null - [null, null, null, null, null] +31044 - null - [null, null, null, null, null] +31045 - null - [null, null, null, null, null] +31046 - null - [null, null, null, null, null] +31047 - null - [null, null, null, null, null] +31048 - null - [null, null, null, null, null] +31049 - null - [null, null, null, null, null] +31050 - null - [null, null, null, null, null] +31051 - null - [null, null, null, null, null] +31052 - null - [null, null, null, null, null] +31053 - null - [null, null, null, null, null] +31054 - null - [null, null, null, null, null] +31055 - null - [null, null, null, null, null] +31056 - null - [null, null, null, null, null] +31057 - Tree stump - [null, null, null, null, null] +31058 - null - [null, null, null, null, null] +31059 - Rocks - [Mine, Prospect, hidden, null, null] +31060 - Rocks - [Mine, Prospect, hidden, null, null] +31061 - Rocks - [Mine, Prospect, hidden, null, null] +31062 - Rocks - [Mine, Prospect, hidden, null, null] +31063 - Rocks - [Mine, Prospect, hidden, null, null] +31064 - Rocks - [Mine, Prospect, hidden, null, null] +31065 - Rocks - [Mine, Prospect, hidden, null, null] +31066 - Rocks - [Mine, Prospect, hidden, null, null] +31067 - Rocks - [Mine, Prospect, hidden, null, null] +31068 - Rocks - [Mine, Prospect, hidden, null, null] +31069 - Rocks - [Mine, Prospect, hidden, null, null] +31070 - Rocks - [Mine, Prospect, hidden, null, null] +31071 - Rocks - [Mine, Prospect, hidden, null, null] +31072 - Rocks - [Mine, Prospect, hidden, null, null] +31073 - Rocks - [Mine, Prospect, hidden, null, null] +31074 - Rocks - [Mine, Prospect, hidden, null, null] +31075 - Rocks - [Mine, Prospect, hidden, null, null] +31076 - Rocks - [Mine, Prospect, hidden, null, null] +31077 - Rocks - [Mine, Prospect, hidden, null, null] +31078 - Rocks - [Mine, Prospect, hidden, null, null] +31079 - Rocks - [Mine, Prospect, hidden, null, null] +31080 - Rocks - [Mine, Prospect, hidden, null, null] +31081 - Rocks - [Mine, Prospect, hidden, null, null] +31082 - Rocks - [Mine, Prospect, hidden, null, null] +31083 - Rocks - [Mine, Prospect, hidden, null, null] +31084 - Rocks - [Mine, Prospect, hidden, null, null] +31085 - Rocks - [Mine, Prospect, hidden, null, null] +31086 - Rocks - [Mine, Prospect, hidden, null, null] +31087 - Rocks - [Mine, Prospect, hidden, null, null] +31088 - Rocks - [Mine, Prospect, hidden, null, null] +31089 - null - [null, null, null, null, null] +31090 - null - [null, null, null, null, null] +31091 - null - [null, null, null, null, null] +31092 - null - [null, null, null, null, null] +31093 - null - [null, null, null, null, null] +31094 - Rocks - [Mine, Prospect, hidden, null, null] +31095 - Rocks - [Mine, Prospect, hidden, null, null] +31096 - Rocks - [Mine, Prospect, hidden, null, null] +31097 - Rocks - [Mine, Prospect, hidden, null, null] +31098 - Rocks - [Mine, Prospect, hidden, null, null] +31099 - Rocks - [Mine, Prospect, hidden, null, null] +31100 - Rocks - [Mine, Prospect, hidden, null, null] +31101 - Rocks - [Mine, Prospect, hidden, null, null] +31102 - Rocks - [Mine, Prospect, hidden, null, null] +31103 - Rocks - [Mine, Prospect, hidden, null, null] +31104 - Rocks - [Mine, Prospect, hidden, null, null] +31105 - Rocks - [Mine, Prospect, hidden, null, null] +31106 - Rocks - [Mine, Prospect, hidden, null, null] +31107 - Rocks - [Mine, Prospect, hidden, null, null] +31108 - Rocks - [Mine, Prospect, hidden, null, null] +31109 - Rocks - [Mine, Prospect, hidden, null, null] +31110 - Rocks - [Mine, Prospect, hidden, null, null] +31111 - Rocks - [Mine, Prospect, hidden, null, null] +31112 - Rocks - [Mine, Prospect, hidden, null, null] +31113 - Rocks - [Mine, Prospect, hidden, null, null] +31114 - Rocks - [Mine, Prospect, hidden, null, null] +31115 - Rocks - [Mine, Prospect, hidden, null, null] +31116 - Rocks - [Mine, Prospect, hidden, null, null] +31117 - Rocks - [Mine, Prospect, hidden, null, null] +31118 - Rocks - [Mine, Prospect, hidden, null, null] +31119 - null - [null, null, null, null, null] +31120 - null - [null, null, null, null, null] +31121 - null - [null, null, null, null, null] +31122 - null - [null, null, null, null, null] +31123 - null - [null, null, null, null, null] +31124 - null - [null, null, null, null, null] +31125 - null - [null, null, null, null, null] +31126 - null - [null, null, null, null, null] +31127 - null - [null, null, null, null, null] +31128 - null - [null, null, null, null, null] +31129 - null - [null, null, null, null, null] +31130 - null - [null, null, null, null, null] +31131 - null - [null, null, null, null, null] +31132 - null - [null, null, null, null, null] +31133 - null - [null, null, null, null, null] +31134 - null - [null, null, null, null, null] +31135 - null - [null, null, null, null, null] +31136 - Barrel - [null, null, null, null, null] +31137 - Crate - [Search, null, null, null, null] +31138 - Crate - [Search, null, null, null, null] +31139 - Crate - [Search, null, null, null, null] +31140 - Crate - [Search, null, null, null, null] +31141 - null - [null, null, null, null, null] +31142 - null - [null, null, null, null, null] +31143 - null - [null, null, null, null, null] +31144 - null - [null, null, null, null, null] +31145 - null - [null, null, null, null, null] +31146 - null - [null, null, null, null, null] +31147 - null - [null, null, null, null, null] +31148 - null - [null, null, null, null, null] +31149 - Fence - [Squeeze-under, null, null, null, null] +31150 - null - [null, null, null, null, null] +31151 - null - [null, null, null, null, null] +31152 - Large gate - [null, null, null, null, null] +31153 - null - [null, null, null, null, null] +31154 - null - [null, null, null, null, null] +31155 - Doogle bush - [Pick-leaf, null, null, null, null] +31156 - null - [null, null, null, null, null] +31157 - null - [null, null, null, null, null] +31158 - null - [null, null, null, null, null] +31159 - null - [null, null, null, null, null] +31160 - null - [null, null, null, null, null] +31161 - null - [null, null, null, null, null] +31162 - Some logs - [null, null, null, hidden, null] +31163 - null - [null, null, null, null, null] +31164 - null - [null, null, null, null, null] +31165 - null - [null, null, null, null, null] +31166 - null - [null, null, null, null, null] +31167 - Rocks - [Mine, Prospect, hidden, null, null] +31168 - Rocks - [Mine, Prospect, hidden, null, null] +31169 - Rocks - [Mine, Prospect, hidden, null, null] +31170 - Rocks - [Mine, Prospect, hidden, null, null] +31171 - Rocks - [Mine, Prospect, hidden, null, null] +31172 - Rocks - [Mine, Prospect, hidden, null, null] +31173 - Rocks - [Mine, Prospect, hidden, null, null] +31174 - Rocks - [Mine, Prospect, hidden, null, null] +31175 - Rocks - [Mine, Prospect, hidden, null, null] +31176 - null - [null, null, null, null, null] +31177 - null - [null, null, null, null, null] +31178 - null - [null, null, null, null, null] +31179 - null - [null, null, null, null, null] +31180 - null - [null, null, null, null, null] +31181 - null - [null, null, null, null, null] +31182 - null - [null, null, null, null, null] +31183 - null - [null, null, null, null, null] +31184 - null - [null, null, null, null, null] +31185 - null - [null, null, null, null, null] +31186 - null - [null, null, null, null, null] +31187 - null - [null, null, null, null, null] +31188 - null - [null, null, null, null, null] +31189 - null - [null, null, null, null, null] +31190 - null - [null, null, null, null, null] +31191 - null - [null, null, null, null, null] +31192 - null - [null, null, null, null, null] +31193 - null - [null, null, null, null, null] +31194 - null - [null, null, null, null, null] +31195 - null - [null, null, null, null, null] +31196 - null - [null, null, null, null, null] +31197 - Rocks - [Mine, Prospect, hidden, null, null] +31198 - Rocks - [Mine, Prospect, hidden, null, null] +31199 - Rocks - [Mine, Prospect, hidden, null, null] +31200 - Rocks - [Mine, Prospect, hidden, null, null] +31201 - Rocks - [Mine, Prospect, hidden, null, null] +31202 - Rocks - [Mine, Prospect, hidden, null, null] +31203 - Rocks - [Mine, Prospect, hidden, null, null] +31204 - Rocks - [Mine, Prospect, hidden, null, null] +31205 - Rocks - [Mine, Prospect, hidden, null, null] +31206 - Tunnel - [Go-through, null, null, null, null] +31207 - Bookcase - [Search, null, null, null, null] +31208 - Tunnel Entrance - [null, null, null, null, null] +31209 - Tunnel Entrance - [null, null, null, null, null] +31210 - Tunnel Entrance - [null, null, null, null, null] +31211 - Tunnel Entrance - [null, null, null, null, null] +31212 - Tunnel Entrance - [null, null, null, null, null] +31213 - Tunnel Entrance - [null, null, null, null, null] +31214 - Stepping stone - [Jump-over, null, null, null, null] +31215 - Stepping stone - [Jump-over, null, null, null, null] +31216 - Stepping stone - [Jump-over, null, null, null, null] +31217 - Stepping stone - [null, null, null, null, null] +31218 - Stepping stone - [null, null, null, null, null] +31219 - Stepping stone - [null, null, null, null, null] +31220 - Stepping stone - [null, null, null, null, null] +31221 - Tunnel entrance - [Go-through-wall, null, null, null, null] +31222 - null - [null, null, null, null, null] +31223 - null - [null, null, null, null, null] +31224 - null - [null, null, null, null, null] +31225 - null - [null, null, null, null, null] +31226 - null - [null, null, null, null, null] +31227 - null - [null, null, null, null, null] +31228 - null - [null, null, null, null, null] +31229 - Obsidian wall - [Mine, Prospect, hidden, null, null] +31230 - Obsidian wall - [Mine, Prospect, hidden, null, null] +31231 - Crack in wall - [null, null, null, null, null] +31232 - Crack in wall - [Go-through, null, null, null, null] +31233 - null - [null, null, null, null, null] +31234 - null - [null, null, null, null, null] +31235 - null - [null, null, null, null, null] +31236 - null - [null, null, null, null, null] +31237 - null - [null, null, null, null, null] +31238 - Collapsed tunnel - [Mine-through, null, null, null, null] +31239 - Collapsed tunnel - [Mine-through, null, null, null, null] +31240 - Collapsed tunnel - [Mine-through, null, null, null, null] +31241 - Caved-in wall - [null, null, null, null, null] +31242 - Repaired caved-in wall - [null, null, null, null, null] +31243 - Caved-in wall - [null, null, null, null, null] +31244 - Repaired caved in wall - [null, null, null, null, null] +31245 - Caved-in wall - [null, null, null, null, null] +31246 - null - [null, null, null, null, null] +31247 - null - [null, null, null, null, null] +31248 - Stone pillar - [Push-over, null, null, null, null] +31249 - Stone pillar - [null, null, null, null, null] +31250 - Pillar - [null, null, null, null, null] +31251 - Cave-in - [Jump-over, null, null, null, null] +31252 - Cave-in - [null, null, null, null, null] +31253 - Cave-in - [Jump-over, null, null, null, null] +31254 - Cave-in - [Jump-over, null, null, null, null] +31255 - Rock - [Push, null, null, null, null] +31256 - Rock - [null, null, null, null, null] +31257 - Rock - [null, null, null, null, null] +31258 - Cave entrance - [Mine-through, null, null, null, null] +31259 - Bookcase - [Search, null, null, null, null] +31260 - Bookcase - [Search, null, null, null, null] +31261 - Bookcase - [Search, null, null, null, null] +31262 - Bookcase - [Search, null, null, null, null] +31263 - Bookcase - [Search, null, null, null, null] +31264 - Bookcase - [Search, null, null, null, null] +31265 - null - [null, null, null, null, null] +31266 - null - [null, null, null, null, null] +31267 - null - [null, null, null, null, null] +31268 - null - [null, null, null, null, null] +31269 - null - [null, null, null, null, null] +31270 - Bench - [null, null, null, null, null] +31271 - Bench - [null, null, null, null, null] +31272 - Rock prop - [null, null, null, null, null] +31273 - Rock prop - [null, null, null, null, null] +31274 - Rock prop - [null, null, null, null, null] +31275 - Rock prop - [null, null, null, null, null] +31276 - null - [null, null, null, null, null] +31277 - null - [null, null, null, null, null] +31278 - null - [null, null, null, null, null] +31279 - null - [null, null, null, null, null] +31280 - null - [null, null, null, null, null] +31281 - null - [null, null, null, null, null] +31282 - null - [null, null, null, null, null] +31283 - null - [null, null, null, null, null] +31284 - Cave entrance - [Enter, null, null, null, null] +31285 - null - [null, null, null, null, null] +31286 - Cave entrance - [null, null, null, null, null] +31287 - Tunnel - [Go-through, null, null, null, null] +31288 - Tunnel - [Go-through, null, null, null, null] +31289 - Tunnel - [Go-through, null, null, null, null] +31290 - Tunnel - [Go-through, null, null, null, null] +31291 - Tunnel - [Go-through, null, null, null, null] +31292 - Cave entrance - [Go-through, null, null, null, null] +31293 - null - [null, null, null, null, null] +31294 - Wooden doors - [Open, null, null, null, null] +31295 - Wooden doors - [null, null, null, null, null] +31296 - Signpost - [Read, null, null, null, null] +31297 - Signpost - [Read, null, null, null, null] +31298 - Signpost - [Read, null, null, null, null] +31299 - Signpost - [Read, null, null, null, null] +31300 - Signpost - [Read, null, null, null, null] +31301 - Signpost - [Read, null, null, null, null] +31302 - Juna - [Talk-to, null, null, null, null] +31303 - Juna - [Talk-to, null, Tell-story, null, null] +31304 - null - [null, null, null, null, null] +31305 - Broken door - [null, null, null, null, null] +31306 - Sticks - [Pass, null, null, null, null] +31307 - Sticks - [Pass, null, null, null, null] +31308 - Sticks - [Pass, null, null, null, null] +31309 - Sarcophagus - [null, null, null, null, null] +31310 - Mummy - [null, null, null, null, null] +31311 - null - [null, null, null, null, null] +31312 - Skeleton - [null, null, null, null, null] +31313 - Skeleton - [null, null, null, null, null] +31314 - Wavering mystic barrier - [Pass, null, null, null, null] +31315 - Wavering mystic barrier - [null, null, null, null, null] +31316 - Bucket rope - [Climb-up, null, null, null, null] +31317 - Flames - [null, null, null, null, null] +31318 - Ashy Pedestal - [null, null, null, null, null] +31319 - Exit - [Leave through, null, null, null, null] +31320 - null - [null, null, null, null, null] +31321 - null - [null, null, null, null, null] +31322 - null - [null, null, null, null, null] +31323 - Tomb - [Search, null, null, null, null] +31324 - Tomb - [Search, null, null, null, null] +31325 - Tomb - [Search, null, null, null, null] +31326 - Tomb - [Search, null, null, null, null] +31327 - null - [Search, null, null, null, null] +31328 - Wall - [Search, null, null, null, null] +31329 - null - [null, null, null, null, null] +31330 - Solid wall - [null, null, null, null, null] +31331 - A holey wall - [Search, null, null, null, null] +31332 - A holey wall - [Search, null, null, null, null] +31333 - Broken door - [null, null, null, null, null] +31334 - Broken door - [Destroy, null, null, null, null] +31335 - Broken door - [Destroy, null, null, null, null] +31336 - Broken door - [Destroy, null, null, null, null] +31337 - Broken door - [Destroy, null, null, null, null] +31338 - Broken door - [Destroy, null, null, null, null] +31339 - Broken door - [Destroy, null, null, null, null] +31340 - Door - [Open, null, null, null, null] +31341 - Door - [Close, null, null, null, null] +31342 - Door - [Open, null, null, null, null] +31343 - Door - [Close, null, null, null, null] +31344 - null - [null, null, null, null, null] +31345 - null - [null, null, null, null, null] +31346 - null - [null, null, null, null, null] +31347 - null - [null, null, null, null, null] +31348 - Sarcophagus - [null, null, null, null, null] +31349 - Sarcophagus - [null, null, null, null, null] +31350 - Floor - [Search, null, null, null, null] +31351 - Odd markings - [Search, null, null, null, null] +31352 - null - [null, null, null, null, null] +31353 - null - [null, null, null, null, null] +31354 - null - [null, null, null, null, null] +31355 - null - [null, null, null, null, null] +31356 - null - [null, null, null, null, null] +31357 - Lever - [Pull, null, null, null, null] +31358 - Lever - [Pull, null, null, null, null] +31359 - Well - [Climb-down, null, null, null, null] +31360 - null - [null, null, null, null, null] +31361 - Open tome - [null, null, null, null, null] +31362 - Ashy pedestal - [null, null, null, null, null] +31363 - Pulsing markings - [Enter, null, null, null, null] +31364 - Dull markings - [null, null, null, null, null] +31365 - null - [null, null, null, null, null] +31366 - null - [null, null, null, null, null] +31367 - A dark hole - [Enter, null, null, null, null] +31368 - null - [null, null, null, null, null] +31369 - Mystic barrier - [null, null, null, null, null] +31370 - Mystic barrier - [null, null, null, null, null] +31371 - Intact sarcophagus - [null, null, null, null, null] +31372 - Damaged sarcophagus - [null, null, null, null, null] +31373 - Empty sarcophagus - [null, null, null, null, null] +31374 - null - [null, null, null, null, null] +31375 - null - [null, null, null, null, null] +31376 - null - [null, null, null, null, null] +31377 - Pile of skulls - [null, null, null, null, null] +31378 - null - [null, null, null, null, null] +31379 - null - [null, null, null, null, null] +31380 - null - [null, null, null, null, null] +31381 - null - [null, null, null, null, null] +31382 - null - [null, null, null, null, null] +31383 - null - [null, null, null, null, null] +31384 - null - [null, null, null, null, null] +31385 - null - [null, null, null, null, null] +31386 - null - [null, null, null, null, null] +31387 - null - [null, null, null, null, null] +31388 - null - [null, null, null, null, null] +31389 - null - [null, null, null, null, null] +31390 - Dark stairs - [Enter, null, null, null, null] +31391 - null - [null, null, null, null, null] +31392 - null - [null, null, null, null, null] +31393 - null - [null, null, null, null, null] +31394 - null - [null, null, null, null, null] +31395 - null - [null, null, null, null, null] +31396 - null - [null, null, null, null, null] +31397 - null - [null, null, null, null, null] +31398 - null - [null, null, null, null, null] +31399 - null - [null, null, null, null, null] +31400 - null - [null, null, null, null, null] +31401 - null - [null, null, null, null, null] +31402 - null - [null, null, null, null, null] +31403 - null - [null, null, null, null, null] +31404 - null - [null, null, null, null, null] +31405 - null - [null, null, null, null, null] +31406 - null - [null, null, null, null, null] +31407 - null - [null, null, null, null, null] +31408 - null - [null, null, null, null, null] +31409 - null - [null, null, null, null, null] +31410 - null - [null, null, null, null, null] +31411 - null - [null, null, null, null, null] +31412 - Stairs - [Climb-down, null, null, null, null] +31413 - null - [null, null, null, null, null] +31414 - null - [null, null, null, null, null] +31415 - null - [null, null, null, null, null] +31416 - null - [null, null, null, null, null] +31417 - Stairs - [Climb-up, null, null, null, null] +31418 - null - [null, null, null, null, null] +31419 - null - [null, null, null, null, null] +31420 - null - [null, null, null, null, null] +31421 - Subterranean spring - [null, null, null, null, null] +31422 - Machinery - [null, null, null, null, null] +31423 - Machinery - [null, null, null, null, null] +31424 - Incomprehensible machinery - [null, null, null, null, null] +31425 - Rock mound - [null, null, null, null, null] +31426 - Rock mound - [null, null, null, null, null] +31427 - Spiky pillar - [null, null, null, null, null] +31428 - Smashed pillar - [null, null, null, null, null] +31429 - Crystalline structure - [null, null, null, null, null] +31430 - null - [null, null, null, null, null] +31431 - null - [null, null, null, null, null] +31432 - null - [null, null, null, null, null] +31433 - null - [null, null, null, null, null] +31434 - null - [null, null, null, null, null] +31435 - Mystic barrier - [Pass, null, null, null, null] +31436 - Mystic barrier - [Pass, null, null, null, null] +31437 - Kurask head - [null, null, null, null, null] +31438 - null - [null, null, null, null, null] +31439 - null - [null, null, null, null, null] +31440 - null - [null, null, null, null, null] +31441 - null - [null, null, null, null, null] +31442 - null - [null, null, null, null, null] +31443 - null - [null, null, null, null, null] +31444 - null - [null, null, null, null, null] +31445 - null - [null, null, null, null, null] +31446 - null - [null, null, null, null, null] +31447 - Flowerbed - [null, null, null, null, null] +31448 - Soil - [null, null, null, null, null] +31449 - null - [null, null, null, null, null] +31450 - null - [null, null, null, null, null] +31451 - null - [null, null, null, null, null] +31452 - Bed - [Search, null, null, null, null] +31453 - null - [null, null, null, null, null] +31454 - Door - [Open, null, null, null, null] +31455 - Door - [Open, null, null, null, null] +31456 - Pipes - [Listen, Tap, null, null, null] +31457 - Pipes - [Jiggle, null, null, null, null] +31458 - Dead guy - [null, null, null, null, null] +31459 - Customs Sergeant - [Talk-to, null, null, null, null] +31460 - Locker - [Store, null, null, null, null] +31461 - null - [null, null, null, null, null] +31462 - null - [null, null, null, null, null] +31463 - null - [null, null, null, null, null] +31464 - null - [null, null, null, null, null] +31465 - null - [null, null, null, null, null] +31466 - null - [null, null, null, null, null] +31467 - null - [null, null, null, null, null] +31468 - null - [null, null, null, null, null] +31469 - null - [null, null, null, null, null] +31470 - null - [null, null, null, null, null] +31471 - null - [null, null, null, null, null] +31472 - null - [null, null, null, null, null] +31473 - null - [null, null, null, null, null] +31474 - null - [null, null, null, null, null] +31475 - null - [null, null, null, null, null] +31476 - null - [null, null, null, null, null] +31477 - null - [null, null, null, null, null] +31478 - null - [null, null, null, null, null] +31479 - null - [null, null, null, null, null] +31480 - null - [null, null, null, null, null] +31481 - null - [null, null, null, null, null] +31482 - null - [null, null, null, null, null] +31483 - null - [null, null, null, null, null] +31484 - null - [null, null, null, null, null] +31485 - null - [null, null, null, null, null] +31486 - null - [null, null, null, null, null] +31487 - null - [null, null, null, null, null] +31488 - null - [null, null, null, null, null] +31489 - null - [null, null, null, null, null] +31490 - null - [null, null, null, null, null] +31491 - null - [null, null, null, null, null] +31492 - null - [null, null, null, null, null] +31493 - null - [null, null, null, null, null] +31494 - null - [null, null, null, null, null] +31495 - Barred window - [Shout-through, null, null, null, null] +31496 - Cell door - [null, null, null, null, null] +31497 - null - [null, null, null, null, null] +31498 - null - [null, null, null, null, null] +31499 - null - [null, null, null, null, null] +31500 - null - [null, null, null, null, null] +31501 - null - [null, null, null, null, null] +31502 - null - [null, null, null, null, null] +31503 - null - [null, null, null, null, null] +31504 - null - [null, null, null, null, null] +31505 - null - [null, null, null, null, null] +31506 - null - [null, null, null, null, null] +31507 - null - [null, null, null, null, null] +31508 - null - [null, null, null, null, null] +31509 - null - [null, null, null, null, null] +31510 - null - [null, null, null, null, null] +31511 - null - [null, null, null, null, null] +31512 - null - [null, null, null, null, null] +31513 - null - [null, null, null, null, null] +31514 - null - [null, null, null, null, null] +31515 - null - [null, null, null, null, null] +31516 - null - [null, null, null, null, null] +31517 - null - [null, null, null, null, null] +31518 - null - [null, null, null, null, null] +31519 - null - [null, null, null, null, null] +31520 - null - [null, null, null, null, null] +31521 - null - [null, null, null, null, null] +31522 - null - [null, null, null, null, null] +31523 - null - [null, null, null, null, null] +31524 - null - [null, null, null, null, null] +31525 - null - [null, null, null, null, null] +31526 - null - [null, null, null, null, null] +31527 - null - [null, null, null, null, null] +31528 - Desk - [null, null, null, null, null] +31529 - Stairs - [Climb, null, null, null, null] +31530 - Stairs - [Climb, null, null, null, null] +31531 - null - [null, null, null, null, null] +31532 - null - [null, null, null, null, null] +31533 - Door - [null, null, null, null, null] +31534 - Door - [Shout-through, Open, null, null, null] +31535 - Door - [Close, null, null, null, null] +31536 - Pipes - [null, null, null, null, null] +31537 - Pipes - [null, null, null, null, null] +31538 - Pipes - [null, null, null, null, null] +31539 - Door - [Open, null, null, null, null] +31540 - Door - [Close, null, null, null, null] +31541 - Sharp rock - [null, null, null, null, null] +31542 - Cabinet - [Open, null, null, null, null] +31543 - Cabinet - [Open, null, null, null, null] +31544 - Rubble - [null, null, null, null, null] +31545 - Rubble - [null, null, null, null, null] +31546 - Rubble - [Search, null, null, null, null] +31547 - Rubble - [null, null, null, null, null] +31548 - Bed - [null, null, null, null, null] +31549 - null - [null, null, null, null, null] +31550 - Bed - [null, null, null, null, null] +31551 - Bed - [null, null, null, null, null] +31552 - Desk - [null, null, null, null, null] +31553 - Bookcase - [null, null, null, null, null] +31554 - Locker - [null, null, null, null, null] +31555 - null - [null, null, null, null, null] +31556 - null - [null, null, null, null, null] +31557 - Perch rock - [null, null, null, null, null] +31558 - Perch rock - [null, null, null, null, null] +31559 - Perch rock - [null, null, null, null, null] +31560 - Perch rock - [null, null, null, null, null] +31561 - Perch rock - [null, null, null, null, null] +31562 - Anchor - [Climb, null, null, null, null] +31563 - Anchor - [Climb, null, null, null, null] +31564 - Anchor - [Climb, null, null, null, null] +31565 - null - [null, null, null, null, null] +31566 - null - [null, null, null, null, null] +31567 - null - [null, null, null, null, null] +31568 - null - [null, null, null, null, null] +31569 - null - [null, null, null, null, null] +31570 - null - [null, null, null, null, null] +31571 - null - [null, null, null, null, null] +31572 - null - [null, null, null, null, null] +31573 - null - [null, null, null, null, null] +31574 - null - [null, null, null, null, null] +31575 - null - [null, null, null, null, null] +31576 - null - [null, null, null, null, null] +31577 - null - [null, null, null, null, null] +31578 - null - [null, null, null, null, null] +31579 - null - [null, null, null, null, null] +31580 - null - [null, null, null, null, null] +31581 - null - [null, null, null, null, null] +31582 - null - [null, null, null, null, null] +31583 - null - [null, null, null, null, null] +31584 - null - [null, null, null, null, null] +31585 - null - [null, null, null, null, null] +31586 - null - [null, null, null, null, null] +31587 - null - [null, null, null, null, null] +31588 - null - [null, null, null, null, null] +31589 - null - [null, null, null, null, null] +31590 - null - [null, null, null, null, null] +31591 - null - [null, null, null, null, null] +31592 - Mess - [Dig, null, null, null, null] +31593 - Mess - [Dig, null, null, null, null] +31594 - Idol - [Take, null, null, null, null] +31595 - Shelf - [null, null, null, null, null] +31596 - Shelf - [null, null, null, null, null] +31597 - Shelf - [null, null, null, null, null] +31598 - null - [null, null, null, null, null] +31599 - null - [null, null, null, null, null] +31600 - null - [null, null, null, null, null] +31601 - null - [null, null, null, null, null] +31602 - null - [null, null, null, null, null] +31603 - null - [null, null, null, null, null] +31604 - null - [null, null, null, null, null] +31605 - null - [null, null, null, null, null] +31606 - null - [null, null, null, null, null] +31607 - null - [null, null, null, null, null] +31608 - null - [null, null, null, null, null] +31609 - null - [null, null, null, null, null] +31610 - null - [null, null, null, null, null] +31611 - null - [null, null, null, null, null] +31612 - null - [null, null, null, null, null] +31613 - null - [null, null, null, null, null] +31614 - null - [null, null, null, null, null] +31615 - null - [null, null, null, null, null] +31616 - null - [null, null, null, null, null] +31617 - null - [null, null, null, null, null] +31618 - null - [null, null, null, null, null] +31619 - null - [null, null, null, null, null] +31620 - null - [null, null, null, null, null] +31621 - null - [null, null, null, null, null] +31622 - null - [null, null, null, null, null] +31623 - null - [null, null, null, null, null] +31624 - null - [null, null, null, null, null] +31625 - null - [null, null, null, null, null] +31626 - null - [null, null, null, null, null] +31627 - null - [null, null, null, null, null] +31628 - null - [null, null, null, null, null] +31629 - null - [null, null, null, null, null] +31630 - null - [null, null, null, null, null] +31631 - null - [null, null, null, null, null] +31632 - null - [null, null, null, null, null] +31633 - null - [null, null, null, null, null] +31634 - null - [null, null, null, null, null] +31635 - null - [null, null, null, null, null] +31636 - null - [null, null, null, null, null] +31637 - null - [null, null, null, null, null] +31638 - null - [null, null, null, null, null] +31639 - null - [null, null, null, null, null] +31640 - null - [null, null, null, null, null] +31641 - null - [null, null, null, null, null] +31642 - null - [null, null, null, null, null] +31643 - null - [null, null, null, null, null] +31644 - null - [null, null, null, null, null] +31645 - null - [null, null, null, null, null] +31646 - null - [null, null, null, null, null] +31647 - null - [null, null, null, null, null] +31648 - null - [null, null, null, null, null] +31649 - Notices - [Read, null, null, null, null] +31650 - null - [null, null, null, null, null] +31651 - Pier - [Dive, null, null, null, null] +31652 - Chain - [Dive, null, null, null, null] +31653 - Chest - [Open, null, null, null, null] +31654 - Chest - [Search, null, null, null, null] +31655 - null - [null, null, null, null, null] +31656 - null - [null, null, null, null, null] +31657 - null - [null, null, null, null, null] +31658 - null - [null, null, null, null, null] +31659 - null - [null, null, null, null, null] +31660 - null - [null, null, null, null, null] +31661 - null - [null, null, null, null, null] +31662 - null - [null, null, null, null, null] +31663 - null - [null, null, null, null, null] +31664 - null - [null, null, null, null, null] +31665 - null - [null, null, null, null, null] +31666 - null - [null, null, null, null, null] +31667 - null - [null, null, null, null, null] +31668 - null - [null, null, null, null, null] +31669 - null - [null, null, null, null, null] +31670 - null - [null, null, null, null, null] +31671 - null - [null, null, null, null, null] +31672 - null - [null, null, null, null, null] +31673 - null - [null, null, null, null, null] +31674 - null - [null, null, null, null, null] +31675 - null - [null, null, null, null, null] +31676 - null - [null, null, null, null, null] +31677 - null - [null, null, null, null, null] +31678 - null - [null, null, null, null, null] +31679 - null - [null, null, null, null, null] +31680 - null - [null, null, null, null, null] +31681 - Cannon - [null, null, null, null, null] +31682 - null - [null, null, null, null, null] +31683 - null - [null, null, null, null, null] +31684 - null - [null, null, null, null, null] +31685 - null - [null, null, null, null, null] +31686 - null - [null, null, null, null, null] +31687 - null - [hidden, null, null, null, null] +31688 - null - [hidden, null, null, null, null] +31689 - null - [hidden, null, null, null, null] +31690 - null - [hidden, hidden, null, null, null] +31691 - null - [hidden, null, null, null, null] +31692 - null - [null, null, null, null, null] +31693 - null - [null, Check, null, null, null] +31694 - null - [null, null, null, null, null] +31695 - null - [null, null, null, null, null] +31696 - null - [null, null, null, null, null] +31697 - null - [null, null, null, null, null] +31698 - null - [null, null, null, null, null] +31699 - null - [null, null, null, null, null] +31700 - null - [null, null, null, null, null] +31701 - null - [null, null, null, null, null] +31702 - null - [null, null, null, null, null] +31703 - null - [null, null, null, null, null] +31704 - null - [null, null, null, null, null] +31705 - null - [null, null, null, null, null] +31706 - null - [null, null, null, null, null] +31707 - null - [null, null, null, null, null] +31708 - null - [null, null, null, null, null] +31709 - null - [null, null, null, null, null] +31710 - null - [null, null, null, null, null] +31711 - null - [null, null, null, null, null] +31712 - null - [null, null, null, null, null] +31713 - null - [null, null, null, null, null] +31714 - null - [null, null, null, null, null] +31715 - null - [null, null, null, null, null] +31716 - null - [null, null, null, null, null] +31717 - null - [null, null, null, null, null] +31718 - null - [null, null, null, null, null] +31719 - null - [null, null, null, null, null] +31720 - null - [null, null, null, null, null] +31721 - null - [null, null, null, null, null] +31722 - null - [null, null, null, null, null] +31723 - null - [null, null, null, null, null] +31724 - null - [null, null, null, null, null] +31725 - null - [null, null, null, null, null] +31726 - null - [null, null, null, null, null] +31727 - null - [null, null, null, null, null] +31728 - null - [null, null, null, null, null] +31729 - null - [null, null, null, null, null] +31730 - null - [null, null, null, null, null] +31731 - null - [null, null, null, null, null] +31732 - null - [null, null, null, null, null] +31733 - null - [null, null, null, null, null] +31734 - null - [null, null, null, null, null] +31735 - null - [null, null, null, null, null] +31736 - null - [null, null, null, null, null] +31737 - null - [null, null, null, null, null] +31738 - null - [null, null, null, null, null] +31739 - null - [null, null, null, null, null] +31740 - null - [null, null, null, null, null] +31741 - null - [null, null, null, null, null] +31742 - null - [null, null, null, null, null] +31743 - Posts - [null, null, null, null, null] +31744 - null - [null, null, null, null, null] +31745 - Pirate Flag - [null, null, null, null, null] +31746 - null - [null, null, null, null, null] +31747 - null - [null, null, null, null, null] +31748 - null - [null, null, null, null, null] +31749 - null - [null, null, null, null, null] +31750 - null - [null, null, null, null, null] +31751 - null - [null, null, null, null, null] +31752 - null - [null, null, null, null, null] +31753 - null - [null, null, null, null, null] +31754 - null - [null, null, null, null, null] +31755 - null - [null, null, null, null, null] +31756 - null - [null, null, null, null, null] +31757 - null - [null, null, null, null, null] +31758 - null - [null, null, null, null, null] +31759 - Drain - [Search, null, null, null, null] +31760 - null - [null, null, null, null, null] +31761 - null - [null, null, null, null, null] +31762 - null - [null, null, null, null, null] +31763 - null - [null, null, null, null, null] +31764 - null - [null, null, null, null, null] +31765 - null - [null, null, null, null, null] +31766 - null - [null, null, null, null, null] +31767 - Cooking shelves - [null, null, null, null, null] +31768 - null - [null, null, null, null, null] +31769 - null - [null, null, null, null, null] +31770 - null - [null, null, null, null, null] +31771 - null - [null, null, null, null, null] +31772 - null - [null, null, null, null, null] +31773 - null - [null, null, null, null, null] +31774 - null - [null, null, null, null, null] +31775 - null - [null, null, null, null, null] +31776 - null - [null, null, null, null, null] +31777 - null - [null, null, null, null, null] +31778 - null - [null, null, null, null, null] +31779 - null - [null, null, null, null, null] +31780 - null - [null, null, null, null, null] +31781 - null - [null, null, null, null, null] +31782 - null - [null, null, null, null, null] +31783 - null - [null, null, null, null, null] +31784 - null - [null, null, null, null, null] +31785 - null - [null, null, null, null, null] +31786 - null - [null, null, null, null, null] +31787 - null - [null, null, null, null, null] +31788 - null - [null, null, null, null, null] +31789 - null - [null, null, null, null, null] +31790 - null - [null, null, null, null, null] +31791 - null - [null, null, null, null, null] +31792 - null - [null, null, null, null, null] +31793 - null - [null, null, null, null, null] +31794 - null - [null, null, null, null, null] +31795 - null - [null, null, null, null, null] +31796 - null - [null, null, null, null, null] +31797 - null - [null, null, null, null, null] +31798 - null - [null, null, null, null, null] +31799 - null - [null, null, null, null, null] +31800 - null - [null, null, null, null, null] +31801 - null - [null, null, null, null, null] +31802 - null - [null, null, null, null, null] +31803 - null - [null, null, null, null, null] +31804 - null - [null, null, null, null, null] +31805 - null - [null, null, null, null, null] +31806 - null - [null, null, null, null, null] +31807 - null - [null, null, null, null, null] +31808 - Large door - [Open, null, null, null, null] +31809 - Large door - [Close, null, null, null, null] +31810 - null - [null, null, null, null, null] +31811 - Large door - [Open, null, null, null, null] +31812 - Large door - [Close, null, null, null, null] +31813 - null - [null, null, null, null, null] +31814 - Large door - [Open, null, null, null, null] +31815 - Large door - [Open, null, null, null, null] +31816 - Large door - [Close, null, null, null, null] +31817 - Large door - [Close, null, null, null, null] +31818 - Large door - [Open, null, null, null, null] +31819 - Large door - [Open, null, null, null, null] +31820 - Large door - [Open, null, null, null, null] +31821 - Large door - [Close, null, null, null, null] +31822 - Large door - [Open, null, null, null, null] +31823 - Large door - [Close, null, null, null, null] +31824 - Door - [Close, null, null, null, null] +31825 - Door - [Open, null, null, null, null] +31826 - Door - [Close, null, null, null, null] +31827 - Door - [Open, null, null, null, null] +31828 - Large door - [Close, null, null, null, null] +31829 - Door - [Close, null, null, null, null] +31830 - Door - [Open, null, null, null, null] +31831 - Door - [Close, null, null, null, null] +31832 - Door - [Open, null, null, null, null] +31833 - Ancient Gate - [Open, Search, null, null, null] +31834 - Ancient Gate - [Open, Search, null, null, null] +31835 - null - [null, null, null, null, null] +31836 - null - [null, null, null, null, null] +31837 - null - [null, null, null, null, null] +31838 - Door - [Open, null, null, null, null] +31839 - Door - [Close, null, null, null, null] +31840 - null - [null, null, null, null, null] +31841 - Door - [Open, null, null, null, null] +31842 - Door - [Close, null, null, null, null] +31843 - null - [null, null, null, null, null] +31844 - Door - [Open, null, null, null, null] +31845 - Door - [Close, null, null, null, null] +31846 - null - [null, null, null, null, null] +31847 - null - [null, null, null, null, null] +31848 - null - [null, null, null, null, null] +31849 - null - [null, null, null, null, null] +31850 - null - [null, null, null, null, null] +31851 - null - [null, null, null, null, null] +31852 - null - [null, null, null, null, null] +31853 - null - [null, null, null, null, null] +31854 - null - [null, null, null, null, null] +31855 - null - [null, null, null, null, null] +31856 - null - [null, null, null, null, null] +31857 - null - [null, null, null, null, null] +31858 - null - [null, null, null, null, null] +31859 - null - [null, null, null, null, null] +31860 - null - [null, null, null, null, null] +31861 - null - [null, null, null, null, null] +31862 - null - [null, null, null, null, null] +31863 - null - [null, null, null, null, null] +31864 - null - [null, null, null, null, null] +31865 - null - [null, null, null, null, null] +31866 - null - [null, null, null, null, null] +31867 - null - [null, null, null, null, null] +31868 - null - [null, null, null, null, null] +31869 - null - [null, null, null, null, null] +31870 - null - [null, null, null, null, null] +31871 - null - [null, null, null, null, null] +31872 - null - [null, null, null, null, null] +31873 - null - [null, null, null, null, null] +31874 - null - [null, null, null, null, null] +31875 - null - [null, null, null, null, null] +31876 - null - [null, null, null, null, null] +31877 - null - [null, null, null, null, null] +31878 - null - [null, null, null, null, null] +31879 - null - [null, null, null, null, null] +31880 - null - [null, null, null, null, null] +31881 - null - [null, null, null, null, null] +31882 - null - [null, null, null, null, null] +31883 - null - [null, null, null, null, null] +31884 - null - [null, null, null, null, null] +31885 - null - [null, null, null, null, null] +31886 - null - [null, null, null, null, null] +31887 - null - [null, null, null, null, null] +31888 - null - [null, null, null, null, null] +31889 - null - [null, null, null, null, null] +31890 - null - [null, null, null, null, null] +31891 - null - [null, null, null, null, null] +31892 - null - [null, null, null, null, null] +31893 - null - [null, null, null, null, null] +31894 - null - [null, null, null, null, null] +31895 - null - [null, null, null, null, null] +31896 - null - [null, null, null, null, null] +31897 - null - [null, null, null, null, null] +31898 - null - [null, null, null, null, null] +31899 - null - [null, null, null, null, null] +31900 - null - [null, null, null, null, null] +31901 - null - [null, null, null, null, null] +31902 - null - [null, null, null, null, null] +31903 - null - [null, null, null, null, null] +31904 - null - [null, null, null, null, null] +31905 - null - [null, null, null, null, null] +31906 - null - [null, null, null, null, null] +31907 - null - [null, null, null, null, null] +31908 - null - [null, null, null, null, null] +31909 - null - [null, null, null, null, null] +31910 - null - [null, null, null, null, null] +31911 - null - [null, null, null, null, null] +31912 - null - [null, null, null, null, null] +31913 - null - [null, null, null, null, null] +31914 - null - [null, null, null, null, null] +31915 - null - [null, null, null, null, null] +31916 - null - [null, null, null, null, null] +31917 - null - [null, null, null, null, null] +31918 - null - [null, null, null, null, null] +31919 - null - [null, null, null, null, null] +31920 - null - [null, null, null, null, null] +31921 - null - [null, null, null, null, null] +31922 - null - [null, null, null, null, null] +31923 - null - [null, null, null, null, null] +31924 - null - [null, null, null, null, null] +31925 - null - [null, null, null, null, null] +31926 - null - [null, null, null, null, null] +31927 - null - [null, null, null, null, null] +31928 - null - [null, null, null, null, null] +31929 - null - [null, null, null, null, null] +31930 - null - [null, null, null, null, null] +31931 - null - [null, null, null, null, null] +31932 - null - [null, null, null, null, null] +31933 - null - [null, null, null, null, null] +31934 - null - [null, null, null, null, null] +31935 - null - [null, null, null, null, null] +31936 - null - [null, null, null, null, null] +31937 - null - [null, null, null, null, null] +31938 - null - [null, null, null, null, null] +31939 - null - [null, null, null, null, null] +31940 - null - [null, null, null, null, null] +31941 - null - [null, null, null, null, null] +31942 - null - [null, null, null, null, null] +31943 - null - [null, null, null, null, null] +31944 - null - [null, null, null, null, null] +31945 - null - [null, null, null, null, null] +31946 - null - [null, null, null, null, null] +31947 - null - [null, null, null, null, null] +31948 - null - [null, null, null, null, null] +31949 - null - [null, null, null, null, null] +31950 - null - [null, null, null, null, null] +31951 - null - [null, null, null, null, null] +31952 - null - [null, null, null, null, null] +31953 - null - [null, null, null, null, null] +31954 - null - [null, null, null, null, null] +31955 - null - [null, null, null, null, null] +31956 - null - [null, null, null, null, null] +31957 - null - [null, null, null, null, null] +31958 - null - [null, null, null, null, null] +31959 - null - [null, null, null, null, null] +31960 - null - [null, null, null, null, null] +31961 - null - [null, null, null, null, null] +31962 - null - [null, null, null, null, null] +31963 - null - [null, null, null, null, null] +31964 - null - [null, null, null, null, null] +31965 - null - [null, null, null, null, null] +31966 - null - [null, null, null, null, null] +31967 - null - [null, null, null, null, null] +31968 - null - [null, null, null, null, null] +31969 - null - [null, null, null, null, null] +31970 - null - [null, null, null, null, null] +31971 - null - [null, null, null, null, null] +31972 - null - [null, null, null, null, null] +31973 - null - [null, null, null, null, null] +31974 - null - [null, null, null, null, null] +31975 - null - [null, null, null, null, null] +31976 - null - [null, null, null, null, null] +31977 - null - [null, null, null, null, null] +31978 - null - [null, null, null, null, null] +31979 - null - [null, null, null, null, null] +31980 - null - [null, null, null, null, null] +31981 - null - [null, null, null, null, null] +31982 - null - [null, null, null, null, null] +31983 - null - [null, null, null, null, null] +31984 - null - [null, null, null, null, null] +31985 - null - [null, null, null, null, null] +31986 - null - [null, null, null, null, null] +31987 - null - [null, null, null, null, null] +31988 - null - [null, null, null, null, null] +31989 - null - [null, null, null, null, null] +31990 - null - [null, null, null, null, null] +31991 - null - [null, null, null, null, null] +31992 - null - [null, null, null, null, null] +31993 - null - [null, null, null, null, null] +31994 - null - [null, null, null, null, null] +31995 - null - [null, null, null, null, null] +31996 - null - [null, null, null, null, null] +31997 - null - [null, null, null, null, null] +31998 - null - [null, null, null, null, null] +31999 - null - [null, null, null, null, null] +32000 - null - [null, null, null, null, null] +32001 - null - [null, null, null, null, null] +32002 - null - [null, null, null, null, null] +32003 - Pillar - [null, null, null, null, null] +32004 - null - [null, null, null, null, null] +32005 - Coal - [null, null, null, null, null] +32006 - null - [null, null, null, null, null] +32007 - null - [null, null, null, null, null] +32008 - Rock - [null, null, null, null, null] +32009 - Open chest - [Search, Close, null, null, null] +32010 - Closed chest - [Open, null, null, null, null] +32011 - null - [null, null, null, null, null] +32012 - Animal skull - [null, null, null, null, null] +32013 - Animal skull - [null, null, null, null, null] +32014 - Animal skull - [null, null, null, null, null] +32015 - Ladder - [Climb-up, null, null, null, null] +32016 - Ladder - [Climb-up, null, null, null, null] +32017 - null - [null, null, null, null, null] +32018 - null - [null, null, null, null, null] +32019 - null - [null, null, null, null, null] +32020 - null - [null, null, null, null, null] +32021 - null - [null, null, null, null, null] +32022 - Standard - [null, null, null, null, null] +32023 - Well - [Search, null, null, null, null] +32024 - Well - [Climb-down, null, null, null, null] +32025 - null - [null, null, null, null, null] +32026 - null - [null, null, null, null, null] +32027 - null - [null, null, null, null, null] +32028 - Shelf - [null, null, null, null, null] +32029 - Bed - [null, null, null, null, null] +32030 - Bed - [null, null, null, null, null] +32031 - Bed - [null, null, null, null, null] +32032 - Chair - [null, null, null, null, null] +32033 - Stool - [null, null, null, null, null] +32034 - Hanging log - [null, null, null, null, null] +32035 - null - [null, null, null, null, null] +32036 - null - [null, null, null, null, null] +32037 - null - [null, null, null, null, null] +32038 - null - [null, null, null, null, null] +32039 - null - [null, null, null, null, null] +32040 - null - [null, null, null, null, null] +32041 - null - [null, null, null, null, null] +32042 - null - [null, null, null, null, null] +32043 - null - [null, null, null, null, null] +32044 - null - [null, null, null, null, null] +32045 - null - [null, null, null, null, null] +32046 - null - [null, null, null, null, null] +32047 - null - [null, null, null, null, null] +32048 - Staircase - [Climb-up, null, null, null, null] +32049 - Sacks - [Search, null, null, null, null] +32050 - Spear wall - [null, null, null, null, null] +32051 - Spear wall - [null, null, null, null, null] +32052 - null - [null, null, null, null, null] +32053 - null - [null, null, null, null, null] +32054 - null - [null, null, null, null, null] +32055 - null - [null, null, null, null, null] +32056 - null - [null, null, null, null, null] +32057 - null - [null, null, null, null, null] +32058 - null - [null, null, null, null, null] +32059 - null - [null, null, null, null, null] +32060 - null - [null, null, null, null, null] +32061 - null - [null, null, null, null, null] +32062 - null - [null, null, null, null, null] +32063 - Barrel - [null, null, null, null, null] +32064 - null - [null, null, null, null, null] +32065 - Fungus - [null, null, null, null, null] +32066 - Fungus - [null, null, null, null, null] +32067 - Fungus - [null, null, null, null, null] +32068 - Tunnel - [Pass-through, null, null, null, null] +32069 - Tunnel - [Pass-through, null, null, null, null] +32070 - Bench - [null, null, null, null, null] +32071 - Charred bones - [null, null, null, null, null] +32072 - Corpse - [null, null, null, null, null] +32073 - Corpse - [null, null, null, null, null] +32074 - Corpse - [null, null, null, null, null] +32075 - Corpse - [null, null, null, null, null] +32076 - Stalagmites - [null, null, null, null, null] +32077 - Flat rock - [Search, null, null, null, null] +32078 - Odd markings - [Search, null, null, null, null] +32079 - Chaos altar - [Pray-at, null, null, null, null] +32080 - null - [null, null, null, null, null] +32081 - null - [null, null, null, null, null] +32082 - null - [null, null, null, null, null] +32083 - null - [null, null, null, null, null] +32084 - null - [null, null, null, null, null] +32085 - null - [null, null, null, null, null] +32086 - null - [null, null, null, null, null] +32087 - null - [null, null, null, null, null] +32088 - null - [null, null, null, null, null] +32089 - null - [null, null, null, null, null] +32090 - null - [null, null, null, null, null] +32091 - null - [null, null, null, null, null] +32092 - null - [null, null, null, null, null] +32093 - null - [null, null, null, null, null] +32094 - null - [null, null, null, null, null] +32095 - null - [null, null, null, null, null] +32096 - null - [null, null, null, null, null] +32097 - null - [null, null, null, null, null] +32098 - null - [null, null, null, null, null] +32099 - Fire - [null, null, null, null, null] +32100 - null - [null, null, null, null, null] +32101 - null - [null, null, null, null, null] +32102 - null - [null, null, null, null, null] +32103 - null - [null, null, null, null, null] +32104 - null - [null, null, null, null, null] +32105 - a cooking pot - [null, null, null, null, null] +32106 - Fungus covered Cavern wall - [null, Search, hidden, null, null] +32107 - Fungus pattern - [null, null, hidden, null, null] +32108 - null - [null, null, null, null, null] +32109 - null - [null, null, null, null, null] +32110 - null - [null, null, null, null, null] +32111 - null - [null, null, null, null, null] +32112 - null - [null, null, null, null, null] +32113 - null - [null, null, null, null, null] +32114 - null - [null, null, null, null, null] +32115 - null - [null, null, null, null, null] +32116 - null - [null, null, null, null, null] +32117 - null - [null, null, null, null, null] +32118 - null - [null, null, null, null, null] +32119 - null - [null, null, null, null, null] +32120 - Smashed chair - [null, null, null, null, null] +32121 - Table - [null, null, null, null, null] +32122 - null - [null, null, null, null, null] +32123 - null - [null, null, null, null, null] +32124 - null - [null, null, null, null, null] +32125 - null - [null, null, null, null, null] +32126 - null - [null, null, null, null, null] +32127 - null - [null, null, null, null, null] +32128 - null - [null, null, null, null, null] +32129 - null - [null, null, null, null, null] +32130 - null - [null, null, null, null, null] +32131 - Passage - [null, null, null, null, null] +32132 - null - [null, null, null, null, null] +32133 - null - [null, null, null, null, null] +32134 - null - [null, null, null, null, null] +32135 - null - [null, null, null, null, null] +32136 - null - [null, null, null, null, null] +32137 - null - [null, null, null, null, null] +32138 - null - [null, null, null, null, null] +32139 - null - [null, null, null, null, null] +32140 - null - [null, null, null, null, null] +32141 - null - [null, null, null, null, null] +32142 - null - [null, null, null, null, null] +32143 - null - [null, null, null, null, null] +32144 - null - [null, null, null, null, null] +32145 - null - [null, null, null, null, null] +32146 - null - [null, null, null, null, null] +32147 - null - [null, null, null, null, null] +32148 - null - [null, null, null, null, null] +32149 - null - [null, null, null, null, null] +32150 - null - [null, null, null, null, null] +32151 - null - [null, null, null, null, null] +32152 - null - [null, null, null, null, null] +32153 - null - [null, null, null, null, null] +32154 - null - [null, null, null, null, null] +32155 - null - [null, null, null, null, null] +32156 - null - [null, null, null, null, null] +32157 - null - [null, null, null, null, null] +32158 - null - [null, null, null, null, null] +32159 - null - [null, null, null, null, null] +32160 - null - [null, null, null, null, null] +32161 - null - [null, null, null, null, null] +32162 - null - [null, null, null, null, null] +32163 - null - [null, null, null, null, null] +32164 - null - [null, null, null, null, null] +32165 - null - [null, null, null, null, null] +32166 - null - [null, null, null, null, null] +32167 - null - [null, null, null, null, null] +32168 - null - [null, null, null, null, null] +32169 - null - [null, null, null, null, null] +32170 - null - [null, null, null, null, null] +32171 - null - [null, null, null, null, null] +32172 - null - [null, null, null, null, null] +32173 - null - [null, null, null, null, null] +32174 - null - [null, null, null, null, null] +32175 - null - [null, null, null, null, null] +32176 - null - [null, null, null, null, null] +32177 - null - [null, null, null, null, null] +32178 - null - [null, null, null, null, null] +32179 - null - [null, null, null, null, null] +32180 - null - [null, null, null, null, null] +32181 - null - [null, null, null, null, null] +32182 - null - [null, null, null, null, null] +32183 - null - [null, null, null, null, null] +32184 - null - [null, null, null, null, null] +32185 - null - [null, null, null, null, null] +32186 - null - [null, null, null, null, null] +32187 - null - [null, null, null, null, null] +32188 - null - [null, null, null, null, null] +32189 - null - [null, null, null, null, null] +32190 - null - [null, null, null, null, null] +32191 - null - [null, null, null, null, null] +32192 - null - [null, null, null, null, null] +32193 - null - [null, null, null, null, null] +32194 - null - [null, null, null, null, null] +32195 - null - [null, null, null, null, null] +32196 - null - [null, null, null, null, null] +32197 - null - [null, null, null, null, null] +32198 - null - [null, null, null, null, null] +32199 - null - [null, null, null, null, null] +32200 - null - [null, null, null, null, null] +32201 - null - [null, null, null, null, null] +32202 - null - [null, null, null, null, null] +32203 - null - [null, null, null, null, null] +32204 - null - [null, null, null, null, null] +32205 - null - [null, null, null, null, null] +32206 - null - [null, null, null, null, null] +32207 - null - [null, null, null, null, null] +32208 - null - [null, null, null, null, null] +32209 - null - [null, null, null, null, null] +32210 - null - [null, null, null, null, null] +32211 - null - [null, null, null, null, null] +32212 - null - [null, null, null, null, null] +32213 - null - [null, null, null, null, null] +32214 - null - [null, null, null, null, null] +32215 - null - [null, null, null, null, null] +32216 - null - [null, null, null, null, null] +32217 - null - [null, null, null, null, null] +32218 - null - [null, null, null, null, null] +32219 - null - [null, null, null, null, null] +32220 - null - [null, null, null, null, null] +32221 - null - [null, null, null, null, null] +32222 - null - [null, null, null, null, null] +32223 - null - [null, null, null, null, null] +32224 - null - [null, null, null, null, null] +32225 - null - [null, null, null, null, null] +32226 - null - [null, null, null, null, null] +32227 - null - [null, null, null, null, null] +32228 - null - [null, null, null, null, null] +32229 - null - [null, null, null, null, null] +32230 - null - [null, null, null, null, null] +32231 - null - [null, null, null, null, null] +32232 - null - [null, null, null, null, null] +32233 - null - [null, null, null, null, null] +32234 - null - [null, null, null, null, null] +32235 - null - [null, null, null, null, null] +32236 - null - [null, null, null, null, null] +32237 - null - [null, null, null, null, null] +32238 - null - [null, null, null, null, null] +32239 - null - [null, null, null, null, null] +32240 - null - [null, null, null, null, null] +32241 - null - [null, null, null, null, null] +32242 - null - [null, null, null, null, null] +32243 - null - [null, null, null, null, null] +32244 - null - [null, null, null, null, null] +32245 - null - [null, null, null, null, null] +32246 - null - [null, null, null, null, null] +32247 - null - [null, null, null, null, null] +32248 - null - [null, null, null, null, null] +32249 - null - [null, null, null, null, null] +32250 - null - [null, null, null, null, null] +32251 - Bed - [null, null, null, null, null] +32252 - Tomb - [null, null, null, null, null] +32253 - pillar - [null, null, null, null, null] +32254 - null - [null, null, null, null, null] +32255 - null - [null, null, null, null, null] +32256 - null - [null, null, null, null, null] +32257 - null - [null, null, null, null, null] +32258 - null - [null, null, null, null, null] +32259 - null - [null, null, null, null, null] +32260 - null - [null, null, null, null, null] +32261 - null - [null, null, null, null, null] +32262 - null - [null, null, null, null, null] +32263 - null - [null, null, null, null, null] +32264 - Rock - [null, null, null, null, null] +32265 - Rock - [null, null, null, null, null] +32266 - Rock - [null, null, null, null, null] +32267 - Rock - [null, null, null, null, null] +32268 - null - [null, null, null, null, null] +32269 - null - [null, null, null, null, null] +32270 - Staircase - [Climb-up, null, null, null, null] +32271 - Staircase - [Climb-down, null, null, null, null] +32272 - Large grave - [null, null, null, null, null] +32273 - Chair - [null, null, null, null, null] +32274 - Chair - [null, null, null, null, null] +32275 - Throne - [null, null, null, null, null] +32276 - Bamboo Ladder - [Climb-up, null, null, null, null] +32277 - Bamboo Ladder - [Climb-down, null, null, null, null] +32278 - Wooden defence - [null, null, null, null, null] +32279 - Climbing rope - [null, null, null, null, null] +32280 - null - [null, null, null, null, null] +32281 - Exit Sign - [null, null, null, null, null] +32282 - Lever - [null, null, null, null, null] +32283 - Cooking shelves - [null, null, null, null, null] +32284 - Shelves - [null, null, null, null, null] +32285 - Throne - [null, null, null, null, null] +32286 - Chair - [null, null, null, null, null] +32287 - Candle - [null, null, null, null, null] +32288 - Candle - [null, null, null, null, null] +32289 - Altar slab - [null, null, null, null, null] +32290 - Coffin - [Open, null, null, null, null] +32291 - Coffin - [Close, null, null, null, null] +32292 - Suit of armour - [null, null, null, null, null] +32293 - Suit of armour - [null, null, null, null, null] +32294 - Dead tree - [Chop down, null, hidden, null, null] +32295 - Standard - [null, null, null, null, null] +32296 - Obstacle pipe - [Squeeze-through, null, null, null, null] +32297 - Obstacle pipe - [Squeeze-through, null, null, null, null] +32298 - Obstacle pipe - [null, null, null, null, null] +32299 - Obstacle pipe - [null, null, null, null, null] +32300 - Obstacle pipe - [null, null, null, null, null] +32301 - Obstacle pipe - [null, null, null, null, null] +32302 - Obstacle pipe - [null, null, null, null, null] +32303 - Obstacle pipe - [null, null, null, null, null] +32304 - Obstacle pipe - [null, null, null, null, null] +32305 - Obstacle pipe - [null, null, null, null, null] +32306 - null - [null, null, null, null, null] +32307 - Bush - [null, null, null, null, null] +32308 - Fungus - [null, null, null, null, null] +32309 - Fungus - [null, null, null, null, null] +32310 - Fungus - [null, null, null, null, null] +32311 - Eggs - [null, null, null, null, null] +32312 - Eggs - [null, null, null, null, null] +32313 - Big egg - [null, null, null, null, null] +32314 - null - [null, null, null, null, null] +32315 - null - [null, null, null, null, null] +32316 - null - [null, null, null, null, null] +32317 - null - [null, null, null, null, null] +32318 - null - [null, null, null, null, null] +32319 - Root - [Search, null, null, null, null] +32320 - Root - [Search, null, null, null, null] +32321 - null - [null, null, null, null, null] +32322 - Wallshield - [null, null, null, null, null] +32323 - Helmet rack - [null, null, null, null, null] +32324 - Magical symbol - [null, null, null, null, null] +32325 - Magical symbol - [null, null, null, null, null] +32326 - Painting - [null, null, null, null, null] +32327 - null - [null, null, null, null, null] +32328 - null - [null, null, null, null, null] +32329 - null - [null, null, null, null, null] +32330 - null - [null, null, null, null, null] +32331 - null - [null, null, null, null, null] +32332 - null - [null, null, null, null, null] +32333 - null - [null, null, null, null, null] +32334 - null - [null, null, null, null, null] +32335 - null - [null, null, null, null, null] +32336 - null - [null, null, null, null, null] +32337 - null - [null, null, null, null, null] +32338 - null - [null, null, null, null, null] +32339 - null - [null, null, null, null, null] +32340 - null - [null, null, null, null, null] +32341 - null - [null, null, null, null, null] +32342 - null - [null, null, null, null, null] +32343 - null - [null, null, null, null, null] +32344 - null - [null, null, null, null, null] +32345 - null - [null, null, null, null, null] +32346 - null - [null, null, null, null, null] +32347 - null - [null, null, null, null, null] +32348 - null - [null, null, null, null, null] +32349 - null - [null, null, null, null, null] +32350 - null - [null, null, null, null, null] +32351 - null - [null, null, null, null, null] +32352 - null - [null, null, null, null, null] +32353 - null - [null, null, null, null, null] +32354 - null - [null, null, null, null, null] +32355 - null - [null, null, null, null, null] +32356 - null - [null, null, null, null, null] +32357 - null - [null, null, null, null, null] +32358 - null - [null, null, null, null, null] +32359 - null - [null, null, null, null, null] +32360 - null - [null, null, null, null, null] +32361 - null - [null, null, null, null, null] +32362 - null - [null, null, null, null, null] +32363 - null - [null, null, null, null, null] +32364 - null - [null, null, null, null, null] +32365 - null - [null, null, null, null, null] +32366 - null - [null, null, null, null, null] +32367 - null - [null, null, null, null, null] +32368 - null - [null, null, null, null, null] +32369 - null - [null, null, null, null, null] +32370 - null - [null, null, null, null, null] +32371 - null - [null, null, null, null, null] +32372 - null - [null, null, null, null, null] +32373 - null - [null, null, null, null, null] +32374 - null - [null, null, null, null, null] +32375 - null - [null, null, null, null, null] +32376 - null - [null, null, null, null, null] +32377 - null - [null, null, null, null, null] +32378 - null - [null, null, null, null, null] +32379 - null - [null, null, null, null, null] +32380 - null - [null, null, null, null, null] +32381 - null - [null, null, null, null, null] +32382 - null - [null, null, null, null, null] +32383 - null - [null, null, null, null, null] +32384 - null - [null, null, null, null, null] +32385 - null - [null, null, null, null, null] +32386 - null - [null, null, null, null, null] +32387 - null - [null, null, null, null, null] +32388 - null - [null, null, null, null, null] +32389 - null - [null, null, null, null, null] +32390 - null - [null, null, null, null, null] +32391 - null - [null, null, null, null, null] +32392 - null - [null, null, null, null, null] +32393 - null - [null, null, null, null, null] +32394 - null - [null, null, null, null, null] +32395 - null - [null, null, null, null, null] +32396 - null - [null, null, null, null, null] +32397 - null - [null, null, null, null, null] +32398 - null - [null, null, null, null, null] +32399 - null - [null, null, null, null, null] +32400 - null - [null, null, null, null, null] +32401 - null - [null, null, null, null, null] +32402 - null - [null, null, null, null, null] +32403 - null - [null, null, null, null, null] +32404 - null - [null, null, null, null, null] +32405 - null - [null, null, null, null, null] +32406 - null - [null, null, null, null, null] +32407 - null - [null, null, null, null, null] +32408 - null - [null, null, null, null, null] +32409 - null - [null, null, null, null, null] +32410 - null - [null, null, null, null, null] +32411 - null - [null, null, null, null, null] +32412 - null - [null, null, null, null, null] +32413 - null - [null, null, null, null, null] +32414 - null - [null, null, null, null, null] +32415 - null - [null, null, null, null, null] +32416 - null - [null, null, null, null, null] +32417 - null - [null, null, null, null, null] +32418 - null - [null, null, null, null, null] +32419 - null - [null, null, null, null, null] +32420 - null - [null, null, null, null, null] +32421 - null - [null, null, null, null, null] +32422 - null - [null, null, null, null, null] +32423 - null - [null, null, null, null, null] +32424 - null - [null, null, null, null, null] +32425 - null - [null, null, null, null, null] +32426 - Rocks - [Mine, Prospect, hidden, null, null] +32427 - Rocks - [Mine, Prospect, hidden, null, null] +32428 - Rocks - [Mine, Prospect, hidden, null, null] +32429 - Rocks - [Mine, Prospect, hidden, null, null] +32430 - Rocks - [Mine, Prospect, hidden, null, null] +32431 - Rocks - [Mine, Prospect, hidden, null, null] +32432 - Rocks - [Mine, Prospect, hidden, null, null] +32433 - Rocks - [Mine, Prospect, hidden, null, null] +32434 - Rocks - [Mine, Prospect, hidden, null, null] +32435 - Rocks - [Mine, Prospect, hidden, null, null] +32436 - Rocks - [Mine, Prospect, hidden, null, null] +32437 - Rocks - [Mine, Prospect, hidden, null, null] +32438 - Rocks - [Mine, Prospect, hidden, null, null] +32439 - Rocks - [Mine, Prospect, hidden, null, null] +32440 - Rocks - [Mine, Prospect, hidden, null, null] +32441 - Rocks - [Mine, Prospect, hidden, null, null] +32442 - Rocks - [Mine, Prospect, hidden, null, null] +32443 - Rocks - [Mine, Prospect, hidden, null, null] +32444 - Rocks - [Mine, Prospect, hidden, null, null] +32445 - Rocks - [Mine, Prospect, hidden, null, null] +32446 - Rocks - [Mine, Prospect, hidden, null, null] +32447 - Rocks - [Mine, Prospect, hidden, null, null] +32448 - Rocks - [Mine, Prospect, hidden, null, null] +32449 - Rocks - [Mine, Prospect, hidden, null, null] +32450 - Rocks - [Mine, Prospect, hidden, null, null] +32451 - Rocks - [Mine, Prospect, hidden, null, null] +32452 - Rocks - [Mine, Prospect, hidden, null, null] +32453 - null - [null, null, null, null, null] +32454 - null - [null, null, null, null, null] +32455 - null - [null, null, null, null, null] +32456 - null - [null, null, null, null, null] +32457 - null - [null, null, null, null, null] +32458 - null - [null, null, null, null, null] +32459 - null - [null, null, null, null, null] +32460 - null - [null, null, null, null, null] +32461 - null - [null, null, null, null, null] +32462 - null - [null, null, null, null, null] +32463 - null - [null, null, null, null, null] +32464 - null - [null, null, null, null, null] +32465 - null - [null, null, null, null, null] +32466 - null - [null, null, null, null, null] +32467 - null - [null, null, null, null, null] +32468 - null - [null, null, null, null, null] +32469 - null - [null, null, null, null, null] +32470 - null - [null, null, null, null, null] +32471 - null - [null, null, null, null, null] +32472 - null - [null, null, null, null, null] +32473 - null - [null, null, null, null, null] +32474 - null - [null, null, null, null, null] +32475 - null - [null, null, null, null, null] +32476 - null - [null, null, null, null, null] +32477 - null - [null, null, null, null, null] +32478 - null - [null, null, null, null, null] +32479 - null - [null, null, null, null, null] +32480 - null - [null, null, null, null, null] +32481 - null - [null, null, null, null, null] +32482 - null - [null, null, null, null, null] +32483 - null - [null, null, null, null, null] +32484 - null - [null, null, null, null, null] +32485 - null - [null, null, null, null, null] +32486 - null - [null, null, null, null, null] +32487 - null - [null, null, null, null, null] +32488 - null - [null, null, null, null, null] +32489 - null - [null, null, null, null, null] +32490 - null - [null, null, null, null, null] +32491 - null - [null, null, null, null, null] +32492 - null - [null, null, null, null, null] +32493 - null - [null, null, null, null, null] +32494 - Cave Exit - [Exit, null, null, null, null] +32495 - Cave Exit - [Exit, null, null, null, null] +32496 - null - [null, null, null, null, null] +32497 - null - [null, null, null, null, null] +32498 - null - [null, null, null, null, null] +32499 - null - [null, null, null, null, null] +32500 - null - [null, null, null, null, null] +32501 - null - [null, null, null, null, null] +32502 - null - [null, null, null, null, null] +32503 - null - [null, null, null, null, null] +32504 - null - [null, null, null, null, null] +32505 - null - [null, null, null, null, null] +32506 - null - [null, null, null, null, null] +32507 - null - [null, null, null, null, null] +32508 - null - [null, null, null, null, null] +32509 - null - [null, null, null, null, null] +32510 - null - [null, null, null, null, null] +32511 - null - [null, null, null, null, null] +32512 - null - [null, null, null, null, null] +32513 - null - [null, null, null, null, null] +32514 - null - [null, null, null, null, null] +32515 - null - [null, null, null, null, null] +32516 - null - [null, null, null, null, null] +32517 - null - [null, null, null, null, null] +32518 - null - [null, null, null, null, null] +32519 - null - [null, null, null, null, null] +32520 - null - [null, null, null, null, null] +32521 - null - [null, null, null, null, null] +32522 - null - [null, null, null, null, null] +32523 - null - [null, null, null, null, null] +32524 - null - [null, null, null, null, null] +32525 - null - [null, null, null, null, null] +32526 - null - [null, null, null, null, null] +32527 - null - [null, null, null, null, null] +32528 - null - [null, null, null, null, null] +32529 - null - [null, null, null, null, null] +32530 - null - [null, null, null, null, null] +32531 - null - [null, null, null, null, null] +32532 - null - [null, null, null, null, null] +32533 - null - [null, null, null, null, null] +32534 - null - [null, null, null, null, null] +32535 - null - [null, null, null, null, null] +32536 - null - [null, null, null, null, null] +32537 - null - [null, null, null, null, null] +32538 - null - [null, null, null, null, null] +32539 - null - [null, null, null, null, null] +32540 - null - [null, null, null, null, null] +32541 - null - [null, null, null, null, null] +32542 - null - [null, null, null, null, null] +32543 - null - [null, null, null, null, null] +32544 - null - [null, null, null, null, null] +32545 - null - [null, null, null, null, null] +32546 - null - [null, null, null, null, null] +32547 - null - [null, null, null, null, null] +32548 - null - [null, null, null, null, null] +32549 - null - [null, null, null, null, null] +32550 - null - [null, null, null, null, null] +32551 - null - [null, null, null, null, null] +32552 - null - [null, null, null, null, null] +32553 - null - [null, null, null, null, null] +32554 - null - [null, null, null, null, null] +32555 - null - [null, null, null, null, null] +32556 - null - [null, null, null, null, null] +32557 - null - [null, null, null, null, null] +32558 - null - [null, null, null, null, null] +32559 - null - [null, null, null, null, null] +32560 - null - [null, null, null, null, null] +32561 - null - [null, null, null, null, null] +32562 - null - [null, null, null, null, null] +32563 - null - [null, null, null, null, null] +32564 - null - [null, null, null, null, null] +32565 - null - [null, null, null, null, null] +32566 - null - [null, null, null, null, null] +32567 - null - [null, null, null, null, null] +32568 - null - [null, null, null, null, null] +32569 - null - [null, null, null, null, null] +32570 - null - [null, null, null, null, null] +32571 - null - [null, null, null, null, null] +32572 - null - [null, null, null, null, null] +32573 - null - [null, null, null, null, null] +32574 - null - [null, null, null, null, null] +32575 - null - [null, null, null, null, null] +32576 - null - [null, null, null, null, null] +32577 - null - [null, null, null, null, null] +32578 - null - [null, null, null, null, null] +32579 - null - [null, null, null, null, null] +32580 - null - [null, null, null, null, null] +32581 - null - [null, null, null, null, null] +32582 - null - [null, null, null, null, null] +32583 - null - [null, null, null, null, null] +32584 - null - [null, null, null, null, null] +32585 - null - [null, null, null, null, null] +32586 - null - [null, null, null, null, null] +32587 - null - [null, null, null, null, null] +32588 - null - [null, null, null, null, null] +32589 - null - [null, null, null, null, null] +32590 - null - [null, null, null, null, null] +32591 - null - [null, null, null, null, null] +32592 - null - [null, null, null, null, null] +32593 - null - [null, null, null, null, null] +32594 - null - [null, null, null, null, null] +32595 - null - [null, null, null, null, null] +32596 - null - [null, null, null, null, null] +32597 - null - [null, null, null, null, null] +32598 - null - [null, null, null, null, null] +32599 - null - [null, null, null, null, null] +32600 - null - [null, null, null, null, null] +32601 - null - [null, null, null, null, null] +32602 - null - [null, null, null, null, null] +32603 - null - [null, null, null, null, null] +32604 - null - [null, null, null, null, null] +32605 - null - [null, null, null, null, null] +32606 - null - [null, null, null, null, null] +32607 - null - [null, null, null, null, null] +32608 - null - [null, null, null, null, null] +32609 - null - [null, null, null, null, null] +32610 - null - [null, null, null, null, null] +32611 - null - [null, null, null, null, null] +32612 - null - [null, null, null, null, null] +32613 - null - [null, null, null, null, null] +32614 - null - [null, null, null, null, null] +32615 - null - [null, null, null, null, null] +32616 - null - [null, null, null, null, null] +32617 - null - [null, null, null, null, null] +32618 - null - [null, null, null, null, null] +32619 - null - [null, null, null, null, null] +32620 - null - [null, null, null, null, null] +32621 - null - [null, null, null, null, null] +32622 - null - [null, null, null, null, null] +32623 - null - [null, null, null, null, null] +32624 - null - [null, null, null, null, null] +32625 - null - [null, null, null, null, null] +32626 - null - [null, null, null, null, null] +32627 - null - [null, null, null, null, null] +32628 - null - [null, null, null, null, null] +32629 - null - [null, null, null, null, null] +32630 - null - [null, null, null, null, null] +32631 - null - [null, null, null, null, null] +32632 - null - [null, null, null, null, null] +32633 - null - [null, null, null, null, null] +32634 - null - [null, null, null, null, null] +32635 - null - [null, null, null, null, null] +32636 - null - [null, null, null, null, null] +32637 - null - [null, null, null, null, null] +32638 - null - [null, null, null, null, null] +32639 - null - [null, null, null, null, null] +32640 - null - [null, null, null, null, null] +32641 - null - [null, null, null, null, null] +32642 - null - [null, null, null, null, null] +32643 - null - [null, null, null, null, null] +32644 - null - [null, null, null, null, null] +32645 - null - [null, null, null, null, null] +32646 - null - [null, null, null, null, null] +32647 - null - [null, null, null, null, null] +32648 - null - [null, null, null, null, null] +32649 - null - [null, null, null, null, null] +32650 - null - [null, null, null, null, null] +32651 - null - [null, null, null, null, null] +32652 - null - [null, null, null, null, null] +32653 - null - [null, null, null, null, null] +32654 - null - [null, null, null, null, null] +32655 - null - [null, null, null, null, null] +32656 - null - [null, null, null, null, null] +32657 - null - [null, null, null, null, null] +32658 - null - [null, null, null, null, null] +32659 - null - [null, null, null, null, null] +32660 - null - [null, null, null, null, null] +32661 - null - [null, null, null, null, null] +32662 - null - [null, null, null, null, null] +32663 - null - [null, null, null, null, null] +32664 - null - [null, null, null, null, null] +32665 - null - [null, null, null, null, null] +32666 - null - [null, null, null, null, null] +32667 - null - [null, null, null, null, null] +32668 - null - [null, null, null, null, null] +32669 - null - [null, null, null, null, null] +32670 - null - [null, null, null, null, null] +32671 - null - [null, null, null, null, null] +32672 - null - [null, null, null, null, null] +32673 - null - [null, null, null, null, null] +32674 - null - [null, null, null, null, null] +32675 - null - [null, null, null, null, null] +32676 - null - [null, null, null, null, null] +32677 - null - [null, null, null, null, null] +32678 - null - [null, null, null, null, null] +32679 - null - [null, null, null, null, null] +32680 - null - [null, null, null, null, null] +32681 - null - [null, null, null, null, null] +32682 - null - [null, null, null, null, null] +32683 - null - [null, null, null, null, null] +32684 - null - [null, null, null, null, null] +32685 - null - [null, null, null, null, null] +32686 - null - [null, null, null, null, null] +32687 - null - [null, null, null, null, null] +32688 - null - [null, null, null, null, null] +32689 - null - [null, null, null, null, null] +32690 - null - [null, null, null, null, null] +32691 - null - [null, null, null, null, null] +32692 - null - [null, null, null, null, null] +32693 - null - [null, null, null, null, null] +32694 - null - [null, null, null, null, null] +32695 - null - [null, null, null, null, null] +32696 - Obstacle pipe - [null, null, null, null, null] +32697 - Obstacle pipe - [null, null, null, null, null] +32698 - Obstacle pipe - [null, null, null, null, null] +32699 - null - [null, null, null, null, null] +32700 - null - [null, null, null, null, null] +32701 - null - [null, null, null, null, null] +32702 - null - [null, null, null, null, null] +32703 - null - [null, null, null, null, null] +32704 - null - [null, null, null, null, null] +32705 - null - [null, null, null, null, null] +32706 - null - [null, null, null, null, null] +32707 - null - [null, null, null, null, null] +32708 - null - [null, null, null, null, null] +32709 - null - [null, null, null, null, null] +32710 - null - [null, null, null, null, null] +32711 - Door - [Open, null, null, null, null] +32712 - null - [null, null, null, null, null] +32713 - null - [null, null, null, null, null] +32714 - null - [null, null, null, null, null] +32715 - null - [null, null, null, null, null] +32716 - null - [null, null, null, null, null] +32717 - null - [null, null, null, null, null] +32718 - null - [null, null, null, null, null] +32719 - null - [null, null, null, null, null] +32720 - null - [null, null, null, null, null] +32721 - null - [null, null, null, null, null] +32722 - null - [null, null, null, null, null] +32723 - null - [null, null, null, null, null] +32724 - null - [null, null, null, null, null] +32725 - null - [null, null, null, null, null] +32726 - null - [null, null, null, null, null] +32727 - null - [null, null, null, null, null] +32728 - null - [null, null, null, null, null] +32729 - null - [null, null, null, null, null] +32730 - null - [null, null, null, null, null] +32731 - null - [null, null, null, null, null] +32732 - null - [null, null, null, null, null] +32733 - null - [null, null, null, null, null] +32734 - null - [null, null, null, null, null] +32735 - null - [null, null, null, null, null] +32736 - null - [null, null, null, null, null] +32737 - Cave Exit - [Exit, null, null, null, null] +32738 - Cave Exit - [Exit, null, null, null, null] +32739 - null - [null, null, null, null, null] +32740 - null - [null, null, null, null, null] +32741 - null - [null, null, null, null, null] +32742 - null - [null, null, null, null, null] +32743 - Cave Exit - [Exit, null, null, null, null] +32744 - null - [null, null, null, null, null] +32745 - null - [null, null, null, null, null] +32746 - null - [null, null, null, null, null] +32747 - null - [null, null, null, null, null] +32748 - null - [null, null, null, null, null] +32749 - null - [null, null, null, null, null] +32750 - null - [null, null, null, null, null] +32751 - null - [null, null, null, null, null] +32752 - null - [null, null, null, null, null] +32753 - null - [null, null, null, null, null] +32754 - null - [null, null, null, null, null] +32755 - null - [null, null, null, null, null] +32756 - null - [null, null, null, null, null] +32757 - null - [null, null, null, null, null] +32758 - null - [null, null, null, null, null] +32759 - null - [null, null, null, null, null] +32760 - null - [null, null, null, null, null] +32761 - null - [null, null, null, null, null] +32762 - null - [null, null, null, null, null] +32763 - null - [null, null, null, null, null] +32764 - null - [null, null, null, null, null] +32765 - null - [null, null, null, null, null] +32766 - Old spike - [null, null, null, null, null] +32767 - Old spike - [null, null, null, null, null] +32768 - null - [null, null, null, null, null] +32769 - null - [null, null, null, null, null] +32770 - null - [null, null, null, null, null] +32771 - Rope - [null, null, null, null, null] +32772 - Rope - [null, null, null, null, null] +32773 - null - [null, null, null, null, null] +32774 - null - [null, null, null, null, null] +32775 - null - [null, null, null, null, null] +32776 - null - [null, null, null, null, null] +32777 - null - [null, null, null, null, null] +32778 - null - [null, null, null, null, null] +32779 - null - [null, null, null, null, null] +32780 - null - [null, null, null, null, null] +32781 - null - [null, null, null, null, null] +32782 - null - [null, null, null, null, null] +32783 - null - [null, null, null, null, null] +32784 - null - [null, null, null, null, null] +32785 - null - [null, null, null, null, null] +32786 - null - [null, null, null, null, null] +32787 - null - [null, null, null, null, null] +32788 - null - [null, null, null, null, null] +32789 - null - [null, null, null, null, null] +32790 - null - [null, null, null, null, null] +32791 - null - [null, null, null, null, null] +32792 - null - [null, null, null, null, null] +32793 - null - [null, null, null, null, null] +32794 - null - [null, null, null, null, null] +32795 - null - [null, null, null, null, null] +32796 - null - [null, null, null, null, null] +32797 - null - [null, null, null, null, null] +32798 - null - [null, null, null, null, null] +32799 - null - [null, null, null, null, null] +32800 - null - [null, null, null, null, null] +32801 - null - [null, null, null, null, null] +32802 - null - [null, null, null, null, null] +32803 - null - [null, null, null, null, null] +32804 - null - [null, null, null, null, null] +32805 - null - [null, null, null, null, null] +32806 - null - [null, null, null, null, null] +32807 - null - [null, null, null, null, null] +32808 - null - [null, null, null, null, null] +32809 - null - [null, null, null, null, null] +32810 - null - [null, null, null, null, null] +32811 - null - [null, null, null, null, null] +32812 - null - [null, null, null, null, null] +32813 - null - [null, null, null, null, null] +32814 - null - [null, null, null, null, null] +32815 - null - [null, null, null, null, null] +32816 - null - [null, null, null, null, null] +32817 - null - [null, null, null, null, null] +32818 - null - [null, null, null, null, null] +32819 - null - [null, null, null, null, null] +32820 - null - [null, null, null, null, null] +32821 - null - [null, null, null, null, null] +32822 - null - [null, null, null, null, null] +32823 - null - [null, null, null, null, null] +32824 - null - [null, null, null, null, null] +32825 - null - [null, null, null, null, null] +32826 - null - [null, null, null, null, null] +32827 - null - [null, null, null, null, null] +32828 - null - [null, null, null, null, null] +32829 - null - [null, null, null, null, null] +32830 - null - [null, null, null, null, null] +32831 - null - [null, null, null, null, null] +32832 - null - [null, null, null, null, null] +32833 - null - [null, null, null, null, null] +32834 - null - [null, null, null, null, null] +32835 - Stairs - [Walk-down, null, null, null, null] +32836 - Stairs - [Walk-up, null, null, null, null] +32837 - null - [null, null, null, null, null] +32838 - null - [null, null, null, null, null] +32839 - null - [null, null, null, null, null] +32840 - null - [null, null, null, null, null] +32841 - null - [null, null, null, null, null] +32842 - null - [null, null, null, null, null] +32843 - null - [null, null, null, null, null] +32844 - null - [null, null, null, null, null] +32845 - null - [null, null, null, null, null] +32846 - null - [null, null, null, null, null] +32847 - null - [null, null, null, null, null] +32848 - null - [null, null, null, null, null] +32849 - null - [null, null, null, null, null] +32850 - null - [null, null, null, null, null] +32851 - null - [null, null, null, null, null] +32852 - null - [null, null, null, null, null] +32853 - null - [null, null, null, null, null] +32854 - null - [null, null, null, null, null] +32855 - null - [null, null, null, null, null] +32856 - null - [null, null, null, null, null] +32857 - null - [null, null, null, null, null] +32858 - null - [null, null, null, null, null] +32859 - null - [null, null, null, null, null] +32860 - null - [null, null, null, null, null] +32861 - null - [null, null, null, null, null] +32862 - null - [null, null, null, null, null] +32863 - null - [null, null, null, null, null] +32864 - null - [null, null, null, null, null] +32865 - null - [null, null, null, null, null] +32866 - null - [null, null, null, null, null] +32867 - null - [null, null, null, null, null] +32868 - null - [null, null, null, null, null] +32869 - null - [null, null, null, null, null] +32870 - null - [null, null, null, null, null] +32871 - null - [null, null, null, null, null] +32872 - null - [null, null, null, null, null] +32873 - null - [null, null, null, null, null] +32874 - null - [null, null, null, null, null] +32875 - null - [null, null, null, null, null] +32876 - null - [null, null, null, null, null] +32877 - null - [null, null, null, null, null] +32878 - null - [null, null, null, null, null] +32879 - null - [null, null, null, null, null] +32880 - null - [null, null, null, null, null] +32881 - null - [null, null, null, null, null] +32882 - null - [null, null, null, null, null] +32883 - null - [null, null, null, null, null] +32884 - null - [null, null, null, null, null] +32885 - null - [null, null, null, null, null] +32886 - null - [null, null, null, null, null] +32887 - null - [null, null, null, null, null] +32888 - null - [null, null, null, null, null] +32889 - null - [null, null, null, null, null] +32890 - null - [null, null, null, null, null] +32891 - Roots - [null, null, null, null, null] +32892 - null - [null, null, null, null, null] +32893 - Roots - [null, null, null, null, null] +32894 - null - [null, null, null, null, null] +32895 - Roots - [null, null, null, null, null] +32896 - null - [null, null, null, null, null] +32897 - Elven lamp - [null, null, null, null, null] +32898 - null - [null, null, null, null, null] +32899 - null - [null, null, null, null, null] +32900 - null - [null, null, null, null, null] +32901 - null - [null, null, null, null, null] +32902 - null - [null, null, null, null, null] +32903 - null - [null, null, null, null, null] +32904 - null - [null, null, null, null, null] +32905 - null - [null, null, null, null, null] +32906 - null - [null, null, null, null, null] +32907 - null - [null, null, null, null, null] +32908 - null - [null, null, null, null, null] +32909 - null - [null, null, null, null, null] +32910 - null - [null, null, null, null, null] +32911 - null - [null, null, null, null, null] +32912 - null - [null, null, null, null, null] +32913 - null - [null, null, null, null, null] +32914 - null - [null, null, null, null, null] +32915 - null - [null, null, null, null, null] +32916 - null - [null, null, null, null, null] +32917 - null - [null, null, null, null, null] +32918 - null - [null, null, null, null, null] +32919 - null - [null, null, null, null, null] +32920 - null - [null, null, null, null, null] +32921 - null - [null, null, null, null, null] +32922 - null - [null, null, null, null, null] +32923 - null - [null, null, null, null, null] +32924 - null - [null, null, null, null, null] +32925 - null - [null, null, null, null, null] +32926 - null - [null, null, null, null, null] +32927 - null - [null, null, null, null, null] +32928 - null - [null, null, null, null, null] +32929 - null - [null, null, null, null, null] +32930 - null - [null, null, null, null, null] +32931 - null - [null, null, null, null, null] +32932 - null - [null, null, null, null, null] +32933 - null - [null, null, null, null, null] +32934 - null - [null, null, null, null, null] +32935 - null - [null, null, null, null, null] +32936 - null - [null, null, null, null, null] +32937 - null - [null, null, null, null, null] +32938 - null - [null, null, null, null, null] +32939 - null - [null, null, null, null, null] +32940 - null - [null, null, null, null, null] +32941 - null - [null, null, null, null, null] +32942 - null - [null, null, null, null, null] +32943 - null - [null, null, null, null, null] +32944 - Tunnel - [Enter, null, null, null, null] +32945 - null - [null, null, null, null, null] +32946 - null - [null, null, null, null, null] +32947 - null - [null, null, null, null, null] +32948 - null - [null, null, null, null, null] +32949 - null - [null, null, null, null, null] +32950 - null - [null, null, null, null, null] +32951 - null - [null, null, null, null, null] +32952 - Door - [Open, null, null, null, null] +32953 - Door - [Open, null, null, null, null] +32954 - Door - [Open, null, null, null, null] +32955 - Door - [Open, null, null, null, null] +32956 - null - [null, null, null, null, null] +32957 - null - [null, null, null, null, null] +32958 - null - [null, null, null, null, null] +32959 - null - [null, null, null, null, null] +32960 - null - [null, null, null, null, null] +32961 - null - [null, null, null, null, null] +32962 - null - [null, null, null, null, null] +32963 - null - [null, null, null, null, null] +32964 - null - [null, null, null, null, null] +32965 - null - [null, null, null, null, null] +32966 - null - [null, null, null, null, null] +32967 - null - [null, null, null, null, null] +32968 - Exit door - [Open, null, null, null, null] +32969 - null - [null, null, null, null, null] +32970 - null - [null, null, null, null, null] +32971 - null - [null, null, null, null, null] +32972 - null - [null, null, null, null, null] +32973 - null - [null, null, null, null, null] +32974 - null - [null, null, null, null, null] +32975 - null - [null, null, null, null, null] +32976 - null - [null, null, null, null, null] +32977 - null - [null, null, null, null, null] +32978 - null - [null, null, null, null, null] +32979 - null - [null, null, null, null, null] +32980 - null - [null, null, null, null, null] +32981 - null - [null, null, null, null, null] +32982 - null - [null, null, null, null, null] +32983 - null - [null, null, null, null, null] +32984 - null - [null, null, null, null, null] +32985 - null - [null, null, null, null, null] +32986 - null - [null, null, null, null, null] +32987 - null - [null, null, null, null, null] +32988 - null - [null, null, null, null, null] +32989 - null - [null, null, null, null, null] +32990 - null - [null, null, null, null, null] +32991 - null - [null, null, null, null, null] +32992 - null - [null, null, null, null, null] +32993 - null - [null, null, null, null, null] +32994 - null - [null, null, null, null, null] +32995 - null - [null, null, null, null, null] +32996 - null - [null, null, null, null, null] +32997 - null - [null, null, null, null, null] +32998 - null - [null, null, null, null, null] +32999 - null - [null, null, null, null, null] +33000 - null - [null, null, null, null, null] +33001 - null - [null, null, null, null, null] +33002 - null - [null, null, null, null, null] +33003 - null - [null, null, null, null, null] +33004 - null - [null, null, null, null, null] +33005 - null - [null, null, null, null, null] +33006 - null - [null, null, null, null, null] +33007 - null - [null, null, null, null, null] +33008 - null - [null, null, null, null, null] +33009 - null - [null, null, null, null, null] +33010 - null - [null, null, null, null, null] +33011 - null - [null, null, null, null, null] +33012 - null - [null, null, null, null, null] +33013 - null - [null, null, null, null, null] +33014 - null - [null, null, null, null, null] +33015 - null - [null, null, null, null, null] +33016 - null - [null, null, null, null, null] +33017 - null - [null, null, null, null, null] +33018 - Entrance - [Enter, null, null, null, null] +33019 - null - [null, null, null, null, null] +33020 - null - [null, null, null, null, null] +33021 - null - [null, null, null, null, null] +33022 - null - [null, null, null, null, null] +33023 - null - [null, null, null, null, null] +33024 - null - [null, null, null, null, null] +33025 - null - [null, null, null, null, null] +33026 - null - [null, null, null, null, null] +33027 - null - [null, null, null, null, null] +33028 - null - [null, null, null, null, null] +33029 - null - [null, null, null, null, null] +33030 - null - [null, null, null, null, null] +33031 - null - [null, null, null, null, null] +33032 - null - [null, null, null, null, null] +33033 - null - [null, null, null, null, null] +33034 - null - [null, null, null, null, null] +33035 - null - [null, null, null, null, null] +33036 - null - [null, null, null, null, null] +33037 - null - [null, null, null, null, null] +33038 - null - [null, null, null, null, null] +33039 - null - [null, null, null, null, null] +33040 - null - [null, null, null, null, null] +33041 - null - [null, null, null, null, null] +33042 - null - [null, null, null, null, null] +33043 - null - [null, null, null, null, null] +33044 - null - [null, null, null, null, null] +33045 - null - [null, null, null, null, null] +33046 - Closed chest - [Open, null, null, null, null] +33047 - Open chest - [Search, Close, null, null, null] +33048 - null - [null, null, null, null, null] +33049 - Rubble - [Search, null, null, null, null] +33050 - Fire remains - [null, null, null, null, null] +33051 - Stool - [null, null, null, null, null] +33052 - Table - [null, null, null, null, null] +33053 - null - [null, null, null, null, null] +33054 - Table - [null, null, null, null, null] +33055 - Bed - [null, null, null, null, null] +33056 - Bookcase - [Search, null, null, null, null] +33057 - Bookcase - [Search, null, null, null, null] +33058 - Chair - [null, null, null, null, null] +33059 - null - [null, null, null, null, null] +33060 - Large door - [Open, null, null, null, null] +33061 - Mirror - [null, null, null, null, null] +33062 - Cabinet - [Open, null, null, null, null] +33063 - Cabinet - [null, Search, Close, null, null] +33064 - Hanging banner - [null, null, null, null, null] +33065 - Hanging banner - [null, null, null, null, null] +33066 - Glarial's tomb - [Search, null, null, null, null] +33067 - null - [null, null, null, null, null] +33068 - null - [null, null, null, null, null] +33069 - null - [null, null, null, null, null] +33070 - null - [null, null, null, null, null] +33071 - null - [null, null, null, null, null] +33072 - null - [null, null, null, null, null] +33073 - null - [null, null, null, null, null] +33074 - null - [null, null, null, null, null] +33075 - null - [null, null, null, null, null] +33076 - null - [null, null, null, null, null] +33077 - null - [null, null, null, null, null] +33078 - Rocks - [Mine, Prospect, hidden, null, null] +33079 - Rocks - [Mine, Prospect, hidden, null, null] +33080 - Roots - [null, null, null, null, null] +33081 - Roots - [null, null, null, null, null] +33082 - Roots - [null, null, null, null, null] +33083 - null - [null, null, null, null, null] +33084 - null - [null, null, null, null, null] +33085 - null - [null, null, null, null, null] +33086 - null - [null, null, null, null, null] +33087 - null - [null, null, null, null, null] +33088 - null - [null, null, null, null, null] +33089 - null - [null, null, null, null, null] +33090 - null - [null, null, null, null, null] +33091 - null - [null, null, null, null, null] +33092 - null - [null, null, null, null, null] +33093 - null - [null, null, null, null, null] +33094 - null - [null, null, null, null, null] +33095 - null - [null, null, null, null, null] +33096 - null - [null, null, null, null, null] +33097 - null - [null, null, null, null, null] +33098 - null - [null, null, null, null, null] +33099 - null - [null, null, null, null, null] +33100 - null - [null, null, null, null, null] +33101 - null - [null, null, null, null, null] +33102 - null - [null, null, null, null, null] +33103 - null - [null, null, null, null, null] +33104 - null - [null, null, null, null, null] +33105 - null - [null, null, null, null, null] +33106 - null - [null, null, null, null, null] +33107 - null - [null, null, null, null, null] +33108 - Door - [Open, null, null, null, null] +33109 - Door - [Open, null, null, null, null] +33110 - Door - [Open, null, null, null, null] +33111 - Door - [Open, null, null, null, null] +33112 - null - [null, null, null, null, null] +33113 - null - [null, null, null, null, null] +33114 - null - [null, null, null, null, null] +33115 - null - [null, null, null, null, null] +33116 - null - [null, null, null, null, null] +33117 - null - [null, null, null, null, null] +33118 - null - [null, null, null, null, null] +33119 - null - [null, null, null, null, null] +33120 - Barrel - [null, null, null, null, null] +33121 - Barrel - [null, null, null, null, null] +33122 - null - [null, null, null, null, null] +33123 - null - [null, null, null, null, null] +33124 - Barrel - [null, null, null, null, null] +33125 - null - [null, null, null, null, null] +33126 - null - [null, null, null, null, null] +33127 - null - [null, null, null, null, null] +33128 - Counter - [null, null, null, null, null] +33129 - Table - [null, null, null, null, null] +33130 - null - [null, null, null, null, null] +33131 - null - [null, null, null, null, null] +33132 - null - [null, null, null, null, null] +33133 - null - [null, null, null, null, null] +33134 - null - [null, null, null, null, null] +33135 - null - [null, null, null, null, null] +33136 - null - [null, null, null, null, null] +33137 - null - [null, null, null, null, null] +33138 - null - [null, null, null, null, null] +33139 - null - [null, null, null, null, null] +33140 - null - [null, null, null, null, null] +33141 - null - [null, null, null, null, null] +33142 - null - [null, null, null, null, null] +33143 - null - [null, null, null, null, null] +33144 - null - [null, null, null, null, null] +33145 - null - [null, null, null, null, null] +33146 - null - [null, null, null, null, null] +33147 - null - [null, null, null, null, null] +33148 - null - [null, null, null, null, null] +33149 - null - [null, null, null, null, null] +33150 - null - [null, null, null, null, null] +33151 - null - [null, null, null, null, null] +33152 - null - [null, null, null, null, null] +33153 - null - [null, null, null, null, null] +33154 - null - [null, null, null, null, null] +33155 - null - [null, null, null, null, null] +33156 - null - [null, null, null, null, null] +33157 - null - [null, null, null, null, null] +33158 - null - [null, null, null, null, null] +33159 - Table - [null, null, null, null, null] +33160 - null - [null, null, null, null, null] +33161 - null - [null, null, null, null, null] +33162 - null - [null, null, null, null, null] +33163 - null - [null, null, null, null, null] +33164 - null - [null, null, null, null, null] +33165 - null - [null, null, null, null, null] +33166 - null - [null, null, null, null, null] +33167 - null - [null, null, null, null, null] +33168 - null - [null, null, null, null, null] +33169 - null - [null, null, null, null, null] +33170 - null - [null, null, null, null, null] +33171 - null - [null, null, null, null, null] +33172 - null - [null, null, null, null, null] +33173 - Cave - [Exit, null, null, null, null] +33174 - Icy Cavern - [Enter, null, null, null, null] +33175 - null - [null, null, null, null, null] +33176 - null - [null, null, null, null, null] +33177 - null - [null, null, null, null, null] +33178 - null - [null, null, null, null, null] +33179 - null - [null, null, null, null, null] +33180 - null - [null, null, null, null, null] +33181 - null - [null, null, null, null, null] +33182 - null - [null, null, null, null, null] +33183 - Ice Light - [null, null, null, null, null] +33184 - Ladder - [Climb-up, null, null, null, null] +33185 - Crevasse - [Enter, null, null, null, null] +33186 - null - [null, null, null, null, null] +33187 - Suit of armour - [null, null, null, null, null] +33188 - Wallshield - [null, null, null, null, null] +33189 - Wallshield - [null, null, null, null, null] +33190 - Wallshield - [null, null, null, null, null] +33191 - Wallshield - [null, null, null, null, null] +33192 - Bow cabinet - [null, null, null, null, null] +33193 - Chair - [null, null, null, null, null] +33194 - Chair - [null, null, null, null, null] +33195 - Chair - [null, null, null, null, null] +33196 - Chair - [null, null, null, null, null] +33197 - Bench - [null, null, null, null, null] +33198 - null - [null, null, null, null, null] +33199 - null - [null, null, null, null, null] +33200 - null - [null, null, null, null, null] +33201 - Table - [null, null, null, null, null] +33202 - Table - [null, null, null, null, null] +33203 - null - [null, null, null, null, null] +33204 - null - [null, null, null, null, null] +33205 - null - [null, null, null, null, null] +33206 - null - [null, null, null, null, null] +33207 - null - [null, null, null, null, null] +33208 - null - [null, null, null, null, null] +33209 - null - [null, null, null, null, null] +33210 - null - [null, null, null, null, null] +33211 - null - [null, null, null, null, null] +33212 - null - [null, null, null, null, null] +33213 - null - [null, null, null, null, null] +33214 - null - [null, null, null, null, null] +33215 - null - [null, null, null, null, null] +33216 - Corpse - [null, null, null, null, null] +33217 - Corpse - [null, null, null, null, null] +33218 - Corpse - [null, null, null, null, null] +33219 - Corpse - [null, null, null, null, null] +33220 - Rocks - [Mine, Prospect, hidden, null, null] +33221 - Rocks - [Mine, Prospect, hidden, null, null] +33222 - Rocks - [Mine, Prospect, hidden, null, null] +33223 - Rocks - [Mine, Prospect, hidden, null, null] +33224 - Cabinet - [null, null, null, null, null] +33225 - null - [null, null, null, null, null] +33226 - null - [null, null, null, null, null] +33227 - null - [null, null, null, null, null] +33228 - null - [null, null, null, null, null] +33229 - null - [null, null, null, null, null] +33230 - Candles - [null, null, null, null, null] +33231 - Cabinet - [null, null, null, null, null] +33232 - Stairs - [Climb-up, null, null, null, null] +33233 - Table - [null, null, null, null, null] +33234 - null - [null, null, null, null, null] +33235 - null - [null, null, null, null, null] +33236 - null - [null, null, null, null, null] +33237 - Web - [Slash, null, null, null, null] +33238 - Slashed web - [null, null, null, null, null] +33239 - null - [null, null, null, null, null] +33240 - null - [null, null, null, null, null] +33241 - null - [null, null, null, null, null] +33242 - null - [null, null, null, null, null] +33243 - null - [null, null, null, null, null] +33244 - Wall opening - [Enter, null, null, null, null] +33245 - Wall - [Push, null, null, null, null] +33246 - Exit - [Climb-up, null, null, null, null] +33247 - null - [null, null, null, null, null] +33248 - null - [null, null, null, null, null] +33249 - null - [null, null, null, null, null] +33250 - Lever - [Pull, null, null, null, null] +33251 - Lever - [Pull, null, null, null, null] +33252 - null - [null, null, null, null, null] +33253 - - [null, null, null, null, null] +33254 - null - [null, null, null, null, null] +33255 - null - [null, null, null, null, null] +33256 - null - [null, null, null, null, null] +33257 - null - [null, null, null, null, null] +33258 - null - [null, null, null, null, null] +33259 - null - [null, null, null, null, null] +33260 - null - [null, null, null, null, null] +33261 - Wall - [null, null, null, null, null] +33262 - null - [null, null, null, null, null] +33263 - Cart Track - [null, null, null, null, null] +33264 - null - [null, null, null, null, null] +33265 - null - [null, null, null, null, null] +33266 - null - [null, null, null, null, null] +33267 - null - [null, null, null, null, null] +33268 - null - [null, null, null, null, null] +33269 - null - [null, null, null, null, null] +33270 - null - [null, null, null, null, null] +33271 - null - [null, null, null, null, null] +33272 - null - [null, null, null, null, null] +33273 - null - [null, null, null, null, null] +33274 - null - [null, null, null, null, null] +33275 - null - [null, null, null, null, null] +33276 - null - [null, null, null, null, null] +33277 - null - [null, null, null, null, null] +33278 - null - [null, null, null, null, null] +33279 - null - [null, null, null, null, null] +33280 - null - [null, null, null, null, null] +33281 - null - [null, null, null, null, null] +33282 - null - [null, null, null, null, null] +33283 - null - [null, null, null, null, null] +33284 - null - [null, null, null, null, null] +33285 - null - [null, null, null, null, null] +33286 - null - [null, null, null, null, null] +33287 - null - [null, null, null, null, null] +33288 - null - [null, null, null, null, null] +33289 - null - [null, null, null, null, null] +33290 - null - [null, null, null, null, null] +33291 - null - [null, null, null, null, null] +33292 - null - [null, null, null, null, null] +33293 - null - [null, null, null, null, null] +33294 - null - [null, null, null, null, null] +33295 - null - [null, null, null, null, null] +33296 - null - [null, null, null, null, null] +33297 - null - [null, null, null, null, null] +33298 - null - [null, null, null, null, null] +33299 - null - [null, null, null, null, null] +33300 - null - [null, null, null, null, null] +33301 - null - [null, null, null, null, null] +33302 - null - [null, null, null, null, null] +33303 - null - [null, null, null, null, null] +33304 - null - [null, null, null, null, null] +33305 - null - [null, null, null, null, null] +33306 - null - [null, null, null, null, null] +33307 - null - [null, null, null, null, null] +33308 - null - [null, null, null, null, null] +33309 - null - [null, null, null, null, null] +33310 - null - [null, null, null, null, null] +33311 - null - [null, null, null, null, null] +33312 - null - [null, null, null, null, null] +33313 - null - [null, null, null, null, null] +33314 - null - [null, null, null, null, null] +33315 - null - [null, null, null, null, null] +33316 - null - [null, null, null, null, null] +33317 - null - [null, null, null, null, null] +33318 - null - [null, null, null, null, null] +33319 - null - [null, null, null, null, null] +33320 - null - [null, null, null, null, null] +33321 - null - [null, null, null, null, null] +33322 - null - [null, null, null, null, null] +33323 - null - [null, null, null, null, null] +33324 - null - [null, null, null, null, null] +33325 - null - [null, null, null, null, null] +33326 - null - [null, null, null, null, null] +33327 - null - [null, null, null, null, null] +33328 - null - [null, null, null, null, null] +33329 - null - [null, null, null, null, null] +33330 - null - [null, null, null, null, null] +33331 - null - [null, null, null, null, null] +33332 - null - [null, null, null, null, null] +33333 - null - [null, null, null, null, null] +33334 - null - [null, null, null, null, null] +33335 - null - [null, null, null, null, null] +33336 - null - [null, null, null, null, null] +33337 - null - [null, null, null, null, null] +33338 - null - [null, null, null, null, null] +33339 - null - [null, null, null, null, null] +33340 - null - [null, null, null, null, null] +33341 - null - [null, null, null, null, null] +33342 - null - [null, null, null, null, null] +33343 - null - [null, null, null, null, null] +33344 - null - [null, null, null, null, null] +33345 - null - [null, null, null, null, null] +33346 - null - [null, null, null, null, null] +33347 - null - [null, null, null, null, null] +33348 - null - [null, null, null, null, null] +33349 - null - [null, null, null, null, null] +33350 - null - [null, null, null, null, null] +33351 - null - [null, null, null, null, null] +33352 - null - [null, null, null, null, null] +33353 - null - [null, null, null, null, null] +33354 - null - [null, null, null, null, null] +33355 - null - [null, null, null, null, null] +33356 - null - [null, null, null, null, null] +33357 - null - [null, null, null, null, null] +33358 - null - [null, null, null, null, null] +33359 - null - [null, null, null, null, null] +33360 - null - [null, null, null, null, null] +33361 - null - [null, null, null, null, null] +33362 - null - [null, null, null, null, null] +33363 - null - [null, null, null, null, null] +33364 - null - [null, null, null, null, null] +33365 - null - [null, null, null, null, null] +33366 - null - [null, null, null, null, null] +33367 - null - [null, null, null, null, null] +33368 - null - [null, null, null, null, null] +33369 - null - [null, null, null, null, null] +33370 - null - [null, null, null, null, null] +33371 - null - [null, null, null, null, null] +33372 - null - [null, null, null, null, null] +33373 - null - [null, null, null, null, null] +33374 - null - [null, null, null, null, null] +33375 - null - [null, null, null, null, null] +33376 - null - [null, null, null, null, null] +33377 - null - [null, null, null, null, null] +33378 - null - [null, null, null, null, null] +33379 - null - [null, null, null, null, null] +33380 - null - [null, null, null, null, null] +33381 - null - [null, null, null, null, null] +33382 - Icicle - [null, null, null, null, null] +33383 - Icicle - [null, null, null, null, null] +33384 - Icicle - [null, null, null, null, null] +33385 - snowrock - [null, null, null, null, null] +33386 - snowrock - [null, null, null, null, null] +33387 - snowrock - [null, null, null, null, null] +33388 - snowrock - [null, null, null, null, null] +33389 - null - [null, null, null, null, null] +33390 - null - [null, null, null, null, null] +33391 - null - [null, null, null, null, null] +33392 - null - [null, null, null, null, null] +33393 - null - [null, null, null, null, null] +33394 - null - [null, null, null, null, null] +33395 - null - [null, null, null, null, null] +33396 - null - [null, null, null, null, null] +33397 - null - [null, null, null, null, null] +33398 - Pillar - [null, null, null, null, null] +33399 - Pillar - [null, null, null, null, null] +33400 - Rocks - [Mine, Prospect, hidden, null, null] +33401 - Rocks - [Mine, Prospect, hidden, null, null] +33402 - Rocks - [Mine, Prospect, hidden, null, null] +33403 - null - [null, null, null, null, null] +33404 - null - [null, null, null, null, null] +33405 - null - [null, null, null, null, null] +33406 - null - [null, null, null, null, null] +33407 - null - [null, null, null, null, null] +33408 - null - [null, null, null, null, null] +33409 - null - [null, null, null, null, null] +33410 - null - [null, null, null, null, null] +33411 - null - [null, null, null, null, null] +33412 - null - [null, null, null, null, null] +33413 - null - [null, null, null, null, null] +33414 - null - [null, null, null, null, null] +33415 - null - [null, null, null, null, null] +33416 - null - [null, null, null, null, null] +33417 - null - [null, null, null, null, null] +33418 - null - [null, null, null, null, null] +33419 - null - [null, null, null, null, null] +33420 - null - [null, null, null, null, null] +33421 - null - [null, null, null, null, null] +33422 - null - [null, null, null, null, null] +33423 - null - [null, null, null, null, null] +33424 - null - [null, null, null, null, null] +33425 - null - [null, null, null, null, null] +33426 - null - [null, null, null, null, null] +33427 - null - [null, null, null, null, null] +33428 - null - [null, null, null, null, null] +33429 - null - [null, null, null, null, null] +33430 - null - [null, null, null, null, null] +33431 - null - [null, null, null, null, null] +33432 - null - [null, null, null, null, null] +33433 - null - [null, null, null, null, null] +33434 - Window - [null, null, null, null, null] +33435 - null - [null, null, null, null, null] +33436 - null - [null, null, null, null, null] +33437 - null - [null, null, null, null, null] +33438 - null - [null, null, null, null, null] +33439 - null - [null, null, null, null, null] +33440 - null - [null, null, null, null, null] +33441 - null - [null, null, null, null, null] +33442 - null - [null, null, null, null, null] +33443 - null - [null, null, null, null, null] +33444 - null - [null, null, null, null, null] +33445 - null - [null, null, null, null, null] +33446 - null - [null, null, null, null, null] +33447 - null - [null, null, null, null, null] +33448 - null - [null, null, null, null, null] +33449 - null - [null, null, null, null, null] +33450 - null - [null, null, null, null, null] +33451 - null - [null, null, null, null, null] +33452 - null - [null, null, null, null, null] +33453 - null - [null, null, null, null, null] +33454 - null - [null, null, null, null, null] +33455 - null - [null, null, null, null, null] +33456 - null - [null, null, null, null, null] +33457 - null - [null, null, null, null, null] +33458 - Sink - [null, null, null, null, null] +33459 - null - [null, null, null, null, null] +33460 - null - [null, null, null, null, null] +33461 - Drawers - [Open, null, null, null, null] +33462 - Drawers - [null, Search, Shut, null, null] +33463 - Dresser - [null, null, null, null, null] +33464 - null - [null, null, null, null, null] +33465 - null - [null, null, null, null, null] +33466 - null - [null, null, null, null, null] +33467 - null - [null, null, null, null, null] +33468 - null - [null, null, null, null, null] +33469 - null - [null, null, null, null, null] +33470 - null - [null, null, null, null, null] +33471 - null - [null, null, null, null, null] +33472 - Oil lamp - [null, null, null, null, null] +33473 - null - [null, null, null, null, null] +33474 - null - [null, null, null, null, null] +33475 - null - [null, null, null, null, null] +33476 - null - [null, null, null, null, null] +33477 - null - [null, null, null, null, null] +33478 - null - [null, null, null, null, null] +33479 - null - [null, null, null, null, null] +33480 - null - [null, null, null, null, null] +33481 - null - [null, null, null, null, null] +33482 - null - [null, null, null, null, null] +33483 - null - [null, null, null, null, null] +33484 - null - [null, null, null, null, null] +33485 - null - [null, null, null, null, null] +33486 - null - [null, null, null, null, null] +33487 - null - [null, null, null, null, null] +33488 - Chest - [Open, null, null, null, null] +33489 - null - [null, null, null, null, null] +33490 - null - [null, null, null, null, null] +33491 - null - [null, null, null, null, null] +33492 - null - [null, null, null, null, null] +33493 - null - [null, null, null, null, null] +33494 - null - [null, null, null, null, null] +33495 - null - [null, null, null, null, null] +33496 - null - [null, null, null, null, null] +33497 - null - [null, null, null, null, null] +33498 - Fireplace - [null, null, null, null, null] +33499 - Cooking pot - [null, null, null, null, null] +33500 - Range - [null, null, null, null, null] +33501 - null - [null, null, null, null, null] +33502 - Cupboard - [Open, null, null, null, null] +33503 - Cupboard - [Search, Close, null, null, null] +33504 - null - [null, null, null, null, null] +33505 - null - [null, null, null, null, null] +33506 - null - [null, null, null, null, null] +33507 - null - [null, null, null, null, null] +33508 - null - [null, null, null, null, null] +33509 - null - [null, null, null, null, null] +33510 - null - [null, null, null, null, null] +33511 - null - [null, null, null, null, null] +33512 - null - [null, null, null, null, null] +33513 - null - [null, null, null, null, null] +33514 - null - [null, null, null, null, null] +33515 - null - [null, null, null, null, null] +33516 - null - [null, null, null, null, null] +33517 - null - [null, null, null, null, null] +33518 - null - [null, null, null, null, null] +33519 - null - [null, null, null, null, null] +33520 - null - [null, null, null, null, null] +33521 - null - [null, null, null, null, null] +33522 - null - [null, null, null, null, null] +33523 - null - [null, null, null, null, null] +33524 - null - [null, null, null, null, null] +33525 - null - [null, null, null, null, null] +33526 - null - [null, null, null, null, null] +33527 - null - [null, null, null, null, null] +33528 - null - [null, null, null, null, null] +33529 - null - [null, null, null, null, null] +33530 - null - [null, null, null, null, null] +33531 - null - [null, null, null, null, null] +33532 - null - [null, null, null, null, null] +33533 - null - [null, null, null, null, null] +33534 - null - [null, null, null, null, null] +33535 - null - [null, null, null, null, null] +33536 - null - [null, null, null, null, null] +33537 - null - [null, null, null, null, null] +33538 - null - [null, null, null, null, null] +33539 - null - [null, null, null, null, null] +33540 - null - [null, null, null, null, null] +33541 - null - [null, null, null, null, null] +33542 - null - [null, null, null, null, null] +33543 - null - [null, null, null, null, null] +33544 - null - [null, null, null, null, null] +33545 - null - [null, null, null, null, null] +33546 - null - [null, null, null, null, null] +33547 - null - [null, null, null, null, null] +33548 - null - [null, null, null, null, null] +33549 - null - [null, null, null, null, null] +33550 - null - [null, null, null, null, null] +33551 - null - [null, null, null, null, null] +33552 - null - [null, null, null, null, null] +33553 - null - [null, null, null, null, null] +33554 - null - [null, null, null, null, null] +33555 - null - [null, null, null, null, null] +33556 - null - [null, null, null, null, null] +33557 - null - [null, null, null, null, null] +33558 - null - [null, null, null, null, null] +33559 - null - [null, null, null, null, null] +33560 - null - [null, null, null, null, null] +33561 - null - [null, null, null, null, null] +33562 - null - [null, null, null, null, null] +33563 - null - [null, null, null, null, null] +33564 - null - [null, null, null, null, null] +33565 - null - [null, null, null, null, null] +33566 - null - [null, null, null, null, null] +33567 - null - [null, null, null, null, null] +33568 - null - [null, null, null, null, null] +33569 - null - [null, null, null, null, null] +33570 - null - [null, null, null, null, null] +33571 - null - [null, null, null, null, null] +33572 - null - [null, null, null, null, null] +33573 - null - [null, null, null, null, null] +33574 - null - [null, null, null, null, null] +33575 - null - [null, null, null, null, null] +33576 - null - [null, null, null, null, null] +33577 - null - [null, null, null, null, null] +33578 - null - [null, null, null, null, null] +33579 - null - [null, null, null, null, null] +33580 - null - [null, null, null, null, null] +33581 - null - [null, null, null, null, null] +33582 - null - [null, null, null, null, null] +33583 - null - [null, null, null, null, null] +33584 - null - [null, null, null, null, null] +33585 - null - [null, null, null, null, null] +33586 - null - [null, null, null, null, null] +33587 - null - [null, null, null, null, null] +33588 - null - [null, null, null, null, null] +33589 - null - [null, null, null, null, null] +33590 - null - [null, null, null, null, null] +33591 - null - [null, null, null, null, null] +33592 - null - [null, null, null, null, null] +33593 - null - [null, null, null, null, null] +33594 - null - [null, null, null, null, null] +33595 - null - [null, null, null, null, null] +33596 - null - [null, null, null, null, null] +33597 - null - [null, null, null, null, null] +33598 - null - [null, null, null, null, null] +33599 - null - [null, null, null, null, null] +33600 - null - [null, null, null, null, null] +33601 - null - [null, null, null, null, null] +33602 - null - [null, null, null, null, null] +33603 - null - [null, null, null, null, null] +33604 - null - [null, null, null, null, null] +33605 - null - [null, null, null, null, null] +33606 - null - [null, null, null, null, null] +33607 - null - [null, null, null, null, null] +33608 - null - [null, null, null, null, null] +33609 - null - [null, null, null, null, null] +33610 - null - [null, null, null, null, null] +33611 - null - [null, null, null, null, null] +33612 - null - [null, null, null, null, null] +33613 - null - [null, null, null, null, null] +33614 - null - [null, null, null, null, null] +33615 - null - [null, null, null, null, null] +33616 - null - [null, null, null, null, null] +33617 - null - [null, null, null, null, null] +33618 - null - [null, null, null, null, null] +33619 - null - [null, null, null, null, null] +33620 - null - [null, null, null, null, null] +33621 - null - [null, null, null, null, null] +33622 - null - [null, null, null, null, null] +33623 - null - [null, null, null, null, null] +33624 - null - [null, null, null, null, null] +33625 - null - [null, null, null, null, null] +33626 - null - [null, null, null, null, null] +33627 - null - [null, null, null, null, null] +33628 - null - [null, null, null, null, null] +33629 - null - [null, null, null, null, null] +33630 - null - [null, null, null, null, null] +33631 - null - [null, null, null, null, null] +33632 - null - [null, null, null, null, null] +33633 - null - [null, null, null, null, null] +33634 - null - [null, null, null, null, null] +33635 - null - [null, null, null, null, null] +33636 - null - [null, null, null, null, null] +33637 - null - [null, null, null, null, null] +33638 - null - [null, null, null, null, null] +33639 - null - [null, null, null, null, null] +33640 - null - [null, null, null, null, null] +33641 - null - [null, null, null, null, null] +33642 - null - [null, null, null, null, null] +33643 - null - [null, null, null, null, null] +33644 - null - [null, null, null, null, null] +33645 - null - [null, null, null, null, null] +33646 - null - [null, null, null, null, null] +33647 - null - [null, null, null, null, null] +33648 - null - [null, null, null, null, null] +33649 - null - [null, null, null, null, null] +33650 - null - [null, null, null, null, null] +33651 - null - [null, null, null, null, null] +33652 - null - [null, null, null, null, null] +33653 - null - [null, null, null, null, null] +33654 - null - [null, null, null, null, null] +33655 - null - [null, null, null, null, null] +33656 - null - [null, null, null, null, null] +33657 - null - [null, null, null, null, null] +33658 - null - [null, null, null, null, null] +33659 - null - [null, null, null, null, null] +33660 - null - [null, null, null, null, null] +33661 - null - [null, null, null, null, null] +33662 - null - [null, null, null, null, null] +33663 - null - [null, null, null, null, null] +33664 - null - [null, null, null, null, null] +33665 - null - [null, null, null, null, null] +33666 - null - [null, null, null, null, null] +33667 - null - [null, null, null, null, null] +33668 - null - [null, null, null, null, null] +33669 - null - [null, null, null, null, null] +33670 - null - [null, null, null, null, null] +33671 - null - [null, null, null, null, null] +33672 - null - [null, null, null, null, null] +33673 - null - [null, null, null, null, null] +33674 - null - [null, null, null, null, null] +33675 - null - [null, null, null, null, null] +33676 - null - [null, null, null, null, null] +33677 - null - [null, null, null, null, null] +33678 - null - [null, null, null, null, null] +33679 - null - [null, null, null, null, null] +33680 - null - [null, null, null, null, null] +33681 - null - [null, null, null, null, null] +33682 - null - [null, null, null, null, null] +33683 - null - [null, null, null, null, null] +33684 - null - [null, null, null, null, null] +33685 - null - [null, null, null, null, null] +33686 - null - [null, null, null, null, null] +33687 - null - [null, null, null, null, null] +33688 - null - [null, null, null, null, null] +33689 - null - [null, null, null, null, null] +33690 - null - [null, null, null, null, null] +33691 - null - [null, null, null, null, null] +33692 - null - [null, null, null, null, null] +33693 - null - [null, null, null, null, null] +33694 - null - [null, null, null, null, null] +33695 - null - [null, null, null, null, null] +33696 - null - [null, null, null, null, null] +33697 - null - [null, null, null, null, null] +33698 - null - [null, null, null, null, null] +33699 - null - [null, null, null, null, null] +33700 - null - [null, null, null, null, null] +33701 - null - [null, null, null, null, null] +33702 - null - [null, null, null, null, null] +33703 - null - [null, null, null, null, null] +33704 - null - [null, null, null, null, null] +33705 - null - [null, null, null, null, null] +33706 - null - [null, null, null, null, null] +33707 - null - [null, null, null, null, null] +33708 - null - [null, null, null, null, null] +33709 - null - [null, null, null, null, null] +33710 - null - [null, null, null, null, null] +33711 - null - [null, null, null, null, null] +33712 - null - [null, null, null, null, null] +33713 - null - [null, null, null, null, null] +33714 - null - [null, null, null, null, null] +33715 - null - [null, null, null, null, null] +33716 - null - [null, null, null, null, null] +33717 - null - [null, null, null, null, null] +33718 - null - [null, null, null, null, null] +33719 - null - [null, null, null, null, null] +33720 - null - [null, null, null, null, null] +33721 - null - [null, null, null, null, null] +33722 - null - [null, null, null, null, null] +33723 - null - [null, null, null, null, null] +33724 - null - [null, null, null, null, null] +33725 - null - [null, null, null, null, null] +33726 - null - [null, null, null, null, null] +33727 - null - [null, null, null, null, null] +33728 - null - [null, null, null, null, null] +33729 - null - [null, null, null, null, null] +33730 - null - [null, null, null, null, null] +33731 - null - [null, null, null, null, null] +33732 - null - [null, null, null, null, null] +33733 - null - [null, null, null, null, null] +33734 - null - [null, null, null, null, null] +33735 - null - [null, null, null, null, null] +33736 - null - [null, null, null, null, null] +33737 - null - [null, null, null, null, null] +33738 - null - [null, null, null, null, null] +33739 - null - [null, null, null, null, null] +33740 - null - [null, null, null, null, null] +33741 - null - [null, null, null, null, null] +33742 - null - [null, null, null, null, null] +33743 - null - [null, null, null, null, null] +33744 - null - [null, null, null, null, null] +33745 - null - [null, null, null, null, null] +33746 - null - [null, null, null, null, null] +33747 - null - [null, null, null, null, null] +33748 - null - [null, null, null, null, null] +33749 - null - [null, null, null, null, null] +33750 - null - [null, null, null, null, null] +33751 - null - [null, null, null, null, null] +33752 - null - [null, null, null, null, null] +33753 - null - [null, null, null, null, null] +33754 - null - [null, null, null, null, null] +33755 - Weather vane - [null, null, null, null, null] +33756 - null - [null, null, null, null, null] +33757 - null - [null, null, null, null, null] +33758 - null - [null, null, null, null, null] +33759 - null - [null, null, null, null, null] +33760 - null - [null, null, null, null, null] +33761 - null - [null, null, null, null, null] +33762 - null - [null, null, null, null, null] +33763 - null - [null, null, null, null, null] +33764 - null - [null, null, null, null, null] +33765 - null - [null, null, null, null, null] +33766 - null - [null, null, null, null, null] +33767 - null - [null, null, null, null, null] +33768 - null - [null, null, null, null, null] +33769 - null - [null, null, null, null, null] +33770 - null - [null, null, null, null, null] +33771 - null - [null, null, null, null, null] +33772 - null - [null, null, null, null, null] +33773 - null - [null, null, null, null, null] +33774 - null - [null, null, null, null, null] +33775 - null - [null, null, null, null, null] +33776 - null - [null, null, null, null, null] +33777 - null - [null, null, null, null, null] +33778 - null - [null, null, null, null, null] +33779 - null - [null, null, null, null, null] +33780 - null - [null, null, null, null, null] +33781 - null - [null, null, null, null, null] +33782 - null - [null, null, null, null, null] +33783 - null - [null, null, null, null, null] +33784 - null - [null, null, null, null, null] +33785 - null - [null, null, null, null, null] +33786 - null - [null, null, null, null, null] +33787 - null - [null, null, null, null, null] +33788 - null - [null, null, null, null, null] +33789 - null - [null, null, null, null, null] +33790 - null - [null, null, null, null, null] +33791 - null - [null, null, null, null, null] +33792 - null - [null, null, null, null, null] +33793 - Weapon rack - [null, null, null, null, null] +33794 - Weapon rack - [null, null, null, null, null] +33795 - null - [null, null, null, null, null] +33796 - null - [null, null, null, null, null] +33797 - null - [null, null, null, null, null] +33798 - null - [null, null, null, null, null] +33799 - null - [null, null, null, null, null] +33800 - null - [null, null, null, null, null] +33801 - null - [null, null, null, null, null] +33802 - null - [null, null, null, null, null] +33803 - null - [null, null, null, null, null] +33804 - null - [null, null, null, null, null] +33805 - null - [null, null, null, null, null] +33806 - null - [null, null, null, null, null] +33807 - null - [null, null, null, null, null] +33808 - null - [null, null, null, null, null] +33809 - null - [null, null, null, null, null] +33810 - null - [null, null, null, null, null] +33811 - null - [null, null, null, null, null] +33812 - null - [null, null, null, null, null] +33813 - null - [null, null, null, null, null] +33814 - null - [null, null, null, null, null] +33815 - null - [null, null, null, null, null] +33816 - null - [null, null, null, null, null] +33817 - null - [null, null, null, null, null] +33818 - null - [null, null, null, null, null] +33819 - null - [null, null, null, null, null] +33820 - null - [null, null, null, null, null] +33821 - null - [null, null, null, null, null] +33822 - null - [null, null, null, null, null] +33823 - null - [null, null, null, null, null] +33824 - null - [null, null, null, null, null] +33825 - null - [null, null, null, null, null] +33826 - Javelin - [null, null, null, null, null] +33827 - null - [null, null, null, null, null] +33828 - null - [null, null, null, null, null] +33829 - null - [null, null, null, null, null] +33830 - null - [null, null, null, null, null] +33831 - null - [null, null, null, null, null] +33832 - null - [null, null, null, null, null] +33833 - null - [null, null, null, null, null] +33834 - Archery Range - [hidden, null, null, null, null] +33835 - null - [null, null, null, null, null] +33836 - null - [null, null, null, null, null] +33837 - null - [null, null, null, null, null] +33838 - null - [null, null, null, null, null] +33839 - null - [null, null, null, null, null] +33840 - null - [null, null, null, null, null] +33841 - null - [null, null, null, null, null] +33842 - Stile - [Climb-over, null, null, null, null] +33843 - null - [null, null, null, null, null] +33844 - null - [null, null, null, null, null] +33845 - null - [null, null, null, null, null] +33846 - null - [null, null, null, null, null] +33847 - null - [null, null, null, null, null] +33848 - null - [null, null, null, null, null] +33849 - null - [null, null, null, null, null] +33850 - Gate - [null, null, null, null, null] +33851 - null - [null, null, null, null, null] +33852 - null - [null, null, null, null, null] +33853 - null - [null, null, null, null, null] +33854 - null - [null, null, null, null, null] +33855 - null - [null, null, null, null, null] +33856 - null - [null, null, null, null, null] +33857 - null - [null, null, null, null, null] +33858 - null - [null, null, null, null, null] +33859 - null - [null, null, null, null, null] +33860 - null - [null, null, null, null, null] +33861 - null - [null, null, null, null, null] +33862 - null - [null, null, null, null, null] +33863 - null - [null, null, null, null, null] +33864 - null - [null, null, null, null, null] +33865 - null - [null, null, null, null, null] +33866 - null - [null, null, null, null, null] +33867 - null - [null, null, null, null, null] +33868 - null - [null, null, null, null, null] +33869 - null - [null, null, null, null, null] +33870 - null - [null, null, null, null, null] +33871 - null - [null, null, null, null, null] +33872 - null - [null, null, null, null, null] +33873 - null - [null, null, null, null, null] +33874 - null - [null, null, null, null, null] +33875 - null - [null, null, null, null, null] +33876 - null - [null, null, null, null, null] +33877 - null - [null, null, null, null, null] +33878 - null - [null, null, null, null, null] +33879 - null - [null, null, null, null, null] +33880 - null - [null, null, null, null, null] +33881 - null - [null, null, null, null, null] +33882 - null - [null, null, null, null, null] +33883 - null - [null, null, null, null, null] +33884 - null - [null, null, null, null, null] +33885 - null - [null, null, null, null, null] +33886 - null - [null, null, null, null, null] +33887 - null - [null, null, null, null, null] +33888 - null - [null, null, null, null, null] +33889 - null - [null, null, null, null, null] +33890 - null - [null, null, null, null, null] +33891 - null - [null, null, null, null, null] +33892 - null - [null, null, null, null, null] +33893 - null - [null, null, null, null, null] +33894 - null - [null, null, null, null, null] +33895 - null - [null, null, null, null, null] +33896 - null - [null, null, null, null, null] +33897 - null - [null, null, null, null, null] +33898 - null - [null, null, null, null, null] +33899 - null - [null, null, null, null, null] +33900 - null - [null, null, null, null, null] +33901 - null - [null, null, null, null, null] +33902 - null - [null, null, null, null, null] +33903 - null - [null, null, null, null, null] +33904 - null - [null, null, null, null, null] +33905 - null - [null, null, null, null, null] +33906 - null - [null, null, null, null, null] +33907 - null - [null, null, null, null, null] +33908 - null - [null, null, null, null, null] +33909 - null - [null, null, null, null, null] +33910 - null - [null, null, null, null, null] +33911 - null - [null, null, null, null, null] +33912 - null - [null, null, null, null, null] +33913 - null - [null, null, null, null, null] +33914 - null - [null, null, null, null, null] +33915 - null - [null, null, null, null, null] +33916 - null - [null, null, null, null, null] +33917 - null - [null, null, null, null, null] +33918 - null - [null, null, null, null, null] +33919 - null - [null, null, null, null, null] +33920 - Wall - [null, null, null, null, null] +33921 - Wall - [null, null, null, null, null] +33922 - Wall - [null, null, null, null, null] +33923 - Wall - [null, null, null, null, null] +33924 - null - [null, null, null, null, null] +33925 - null - [null, null, null, null, null] +33926 - null - [null, null, null, null, null] +33927 - null - [null, null, null, null, null] +33928 - null - [null, null, null, null, null] +33929 - null - [null, null, null, null, null] +33930 - null - [null, null, null, null, null] +33931 - Drawers - [Open, null, null, null, null] +33932 - Drawers - [null, Search, Shut, null, null] +33933 - Closed chest - [Open, null, null, null, null] +33934 - Closed chest - [Open, null, null, null, null] +33935 - null - [null, null, null, null, null] +33936 - null - [null, null, null, null, null] +33937 - null - [null, null, null, null, null] +33938 - null - [null, null, null, null, null] +33939 - null - [null, null, null, null, null] +33940 - null - [null, null, null, null, null] +33941 - null - [null, null, null, null, null] +33942 - null - [null, null, null, null, null] +33943 - null - [null, null, null, null, null] +33944 - null - [null, null, null, null, null] +33945 - null - [null, null, null, null, null] +33946 - null - [null, null, null, null, null] +33947 - null - [null, null, null, null, null] +33948 - null - [null, null, null, null, null] +33949 - null - [null, null, null, null, null] +33950 - null - [null, null, null, null, null] +33951 - null - [null, null, null, null, null] +33952 - null - [null, null, null, null, null] +33953 - null - [null, null, null, null, null] +33954 - null - [null, null, null, null, null] +33955 - null - [null, null, null, null, null] +33956 - null - [null, null, null, null, null] +33957 - null - [null, null, null, null, null] +33958 - Lander boat - [null, null, null, null, null] +33959 - Lander hatch - [null, null, null, null, null] +33960 - Lander hatch - [null, null, null, null, null] +33961 - null - [null, null, null, null, null] +33962 - null - [null, null, null, null, null] +33963 - Wardrobe - [Open, null, null, null, null] +33964 - Bookcase - [Search, null, null, null, null] +33965 - null - [null, null, null, null, null] +33966 - null - [null, null, null, null, null] +33967 - null - [null, null, null, null, null] +33968 - null - [null, null, null, null, null] +33969 - null - [null, null, null, null, null] +33970 - null - [null, null, null, null, null] +33971 - null - [null, null, null, null, null] +33972 - null - [null, null, null, null, null] +33973 - null - [null, null, null, null, null] +33974 - null - [null, null, null, null, null] +33975 - null - [null, null, null, null, null] +33976 - null - [null, null, null, null, null] +33977 - Ladder - [Climb-up, null, null, null, null] +33978 - null - [null, null, null, null, null] +33979 - null - [null, null, null, null, null] +33980 - null - [null, null, null, null, null] +33981 - null - [null, null, null, null, null] +33982 - null - [null, null, null, null, null] +33983 - null - [null, null, null, null, null] +33984 - null - [null, null, null, null, null] +33985 - null - [null, null, null, null, null] +33986 - null - [null, null, null, null, null] +33987 - null - [null, null, null, null, null] +33988 - null - [null, null, null, null, null] +33989 - null - [null, null, null, null, null] +33990 - null - [null, null, null, null, null] +33991 - null - [null, null, null, null, null] +33992 - null - [null, null, null, null, null] +33993 - null - [null, null, null, null, null] +33994 - null - [null, null, null, null, null] +33995 - null - [null, null, null, null, null] +33996 - null - [null, null, null, null, null] +33997 - null - [null, null, null, null, null] +33998 - null - [null, null, null, null, null] +33999 - null - [null, null, null, null, null] +34000 - null - [null, null, null, null, null] +34001 - null - [null, null, null, null, null] +34002 - null - [null, null, null, null, null] +34003 - null - [null, null, null, null, null] +34004 - null - [null, null, null, null, null] +34005 - Door - [Open, null, null, null, Pick-lock] +34006 - null - [null, null, null, null, null] +34007 - null - [null, null, null, null, null] +34008 - null - [null, null, null, null, null] +34009 - null - [null, null, null, null, null] +34010 - null - [null, null, null, null, null] +34011 - null - [null, null, null, null, null] +34012 - Ladder - [Climb-down, null, null, null, null] +34013 - null - [null, null, null, null, null] +34014 - null - [null, null, null, null, null] +34015 - null - [null, null, null, null, null] +34016 - null - [null, null, null, null, null] +34017 - null - [null, null, null, null, null] +34018 - null - [null, null, null, null, null] +34019 - null - [null, null, null, null, null] +34020 - null - [null, null, null, null, null] +34021 - null - [null, null, null, null, null] +34022 - null - [null, null, null, null, null] +34023 - null - [null, null, null, null, null] +34024 - null - [null, null, null, null, null] +34025 - null - [null, null, null, null, null] +34026 - null - [null, null, null, null, null] +34027 - null - [null, null, null, null, null] +34028 - null - [null, null, null, null, null] +34029 - null - [null, null, null, null, null] +34030 - null - [null, null, null, null, null] +34031 - null - [null, null, null, null, null] +34032 - Open chest - [null, Search, Shut, null, null] +34033 - null - [null, null, null, null, null] +34034 - null - [null, null, null, null, null] +34035 - null - [null, null, null, null, null] +34036 - null - [null, null, null, null, null] +34037 - Cabinet - [null, null, null, null, null] +34038 - Cabinet - [null, null, null, null, null] +34039 - Cabinet - [null, null, null, null, null] +34040 - Stairs - [Climb-up, null, null, null, null] +34041 - Stairs - [Climb-down, null, null, null, null] +34042 - Door - [Open, null, null, null, null] +34043 - Door - [Close, null, null, null, null] +34044 - Door - [Open, null, null, null, null] +34045 - Door - [Close, null, null, null, null] +34046 - Door - [Open, null, null, null, null] +34047 - null - [null, null, null, null, null] +34048 - null - [null, null, null, null, null] +34049 - null - [null, null, null, null, null] +34050 - null - [null, null, null, null, null] +34051 - null - [null, null, null, null, null] +34052 - null - [null, null, null, null, null] +34053 - null - [null, null, null, null, null] +34054 - null - [null, null, null, null, null] +34055 - null - [null, null, null, null, null] +34056 - null - [null, null, null, null, null] +34057 - null - [null, null, null, null, null] +34058 - null - [null, null, null, null, null] +34059 - null - [null, null, null, null, null] +34060 - null - [null, null, null, null, null] +34061 - null - [null, null, null, null, null] +34062 - null - [null, null, null, null, null] +34063 - null - [null, null, null, null, null] +34064 - null - [null, null, null, null, null] +34065 - null - [null, null, null, null, null] +34066 - null - [null, null, null, null, null] +34067 - null - [null, null, null, null, null] +34068 - null - [null, null, null, null, null] +34069 - null - [null, null, null, null, null] +34070 - null - [null, null, null, null, null] +34071 - null - [null, null, null, null, null] +34072 - null - [null, null, null, null, null] +34073 - null - [null, null, null, null, null] +34074 - null - [null, null, null, null, null] +34075 - null - [null, null, null, null, null] +34076 - Staircase - [Climb-up, null, null, null, null] +34077 - null - [null, null, null, null, null] +34078 - null - [null, null, null, null, null] +34079 - null - [null, null, null, null, null] +34080 - null - [Climb-up, null, null, null, null] +34081 - null - [null, null, null, null, null] +34082 - Sink - [null, null, null, null, null] +34083 - null - [null, null, null, null, null] +34084 - null - [null, null, null, null, null] +34085 - null - [null, null, null, null, null] +34086 - null - [null, null, null, null, null] +34087 - null - [null, null, null, null, null] +34088 - null - [null, null, null, null, null] +34089 - null - [null, null, null, null, null] +34090 - null - [null, null, null, null, null] +34091 - null - [null, null, null, null, null] +34092 - null - [null, null, null, null, null] +34093 - null - [null, null, null, null, null] +34094 - null - [null, null, null, null, null] +34095 - null - [null, null, null, null, null] +34096 - null - [null, null, null, null, null] +34097 - null - [null, null, null, null, null] +34098 - null - [null, null, null, null, null] +34099 - null - [null, null, null, null, null] +34100 - null - [null, null, null, null, null] +34101 - null - [null, null, null, null, null] +34102 - null - [null, null, null, null, null] +34103 - null - [null, null, null, null, null] +34104 - null - [null, null, null, null, null] +34105 - null - [null, null, null, null, null] +34106 - Shelves - [null, null, null, null, null] +34107 - Shelves - [null, null, null, null, null] +34108 - null - [null, null, null, null, null] +34109 - null - [null, null, null, null, null] +34110 - null - [null, null, null, null, null] +34111 - null - [null, null, null, null, null] +34112 - null - [null, null, null, null, null] +34113 - null - [null, null, null, null, null] +34114 - null - [null, null, null, null, null] +34115 - null - [null, null, null, null, null] +34116 - null - [null, null, null, null, null] +34117 - null - [null, null, null, null, null] +34118 - null - [null, null, null, null, null] +34119 - null - [null, null, null, null, null] +34120 - null - [null, null, null, null, null] +34121 - null - [null, null, null, null, null] +34122 - null - [null, null, null, null, null] +34123 - null - [null, null, null, null, null] +34124 - null - [null, null, null, null, null] +34125 - null - [null, null, null, null, null] +34126 - null - [null, null, null, null, null] +34127 - null - [null, null, null, null, null] +34128 - null - [null, null, null, null, null] +34129 - null - [null, null, null, null, null] +34130 - null - [null, null, null, null, null] +34131 - null - [null, null, null, null, null] +34132 - null - [null, null, null, null, null] +34133 - null - [null, null, null, null, null] +34134 - null - [null, null, null, null, null] +34135 - null - [null, null, null, null, null] +34136 - null - [null, null, null, null, null] +34137 - Crate - [Search, null, null, null, null] +34138 - Lighting space - [null, null, null, null, Build] +34139 - null - [null, null, null, null, null] +34140 - null - [null, null, null, null, null] +34141 - null - [null, null, null, null, null] +34142 - null - [null, null, null, null, null] +34143 - null - [null, null, null, null, null] +34144 - null - [null, null, null, null, null] +34145 - null - [null, null, null, null, null] +34146 - null - [null, null, null, null, null] +34147 - null - [null, null, null, null, null] +34148 - null - [null, null, null, null, null] +34149 - null - [null, null, null, null, null] +34150 - null - [null, null, null, null, null] +34151 - null - [null, null, null, null, null] +34152 - null - [null, null, null, null, null] +34153 - null - [null, null, null, null, null] +34154 - null - [null, null, null, null, null] +34155 - null - [null, null, null, null, null] +34156 - null - [null, null, null, null, null] +34157 - null - [null, null, null, null, null] +34158 - null - [null, null, null, null, null] +34159 - null - [null, null, null, null, null] +34160 - null - [null, null, null, null, null] +34161 - null - [null, null, null, null, null] +34162 - null - [null, null, null, null, null] +34163 - null - [null, null, null, null, null] +34164 - null - [null, null, null, null, null] +34165 - null - [null, null, null, null, null] +34166 - null - [null, null, null, null, null] +34167 - null - [null, null, null, null, null] +34168 - null - [null, null, null, null, null] +34169 - null - [null, null, null, null, null] +34170 - null - [null, null, null, null, null] +34171 - null - [null, null, null, null, null] +34172 - null - [null, null, null, null, null] +34173 - null - [null, null, null, null, null] +34174 - null - [null, null, null, null, null] +34175 - null - [null, null, null, null, null] +34176 - null - [null, null, null, null, null] +34177 - null - [null, null, null, null, null] +34178 - null - [null, null, null, null, null] +34179 - null - [null, null, null, null, null] +34180 - null - [null, null, null, null, null] +34181 - null - [null, null, null, null, null] +34182 - null - [null, null, null, null, null] +34183 - null - [null, null, null, null, null] +34184 - null - [null, null, null, null, null] +34185 - null - [null, null, null, null, null] +34186 - null - [null, null, null, null, null] +34187 - null - [null, null, null, null, null] +34188 - null - [null, null, null, null, null] +34189 - null - [null, null, null, null, null] +34190 - null - [null, null, null, null, null] +34191 - null - [null, null, null, null, null] +34192 - null - [null, null, null, null, null] +34193 - null - [null, null, null, null, null] +34194 - null - [null, null, null, null, null] +34195 - null - [null, null, null, null, null] +34196 - null - [null, null, null, null, null] +34197 - null - [null, null, null, null, null] +34198 - null - [null, null, null, null, null] +34199 - null - [null, null, null, null, null] +34200 - null - [null, null, null, null, null] +34201 - null - [null, null, null, null, null] +34202 - null - [null, null, null, null, null] +34203 - Sack - [null, null, null, null, null] +34204 - Table - [null, null, null, null, null] +34205 - Bank booth - [null, null, null, null, null] +34206 - Closed bank booth - [null, null, null, null, null] +34207 - Closed bank booth - [null, null, null, null, null] +34208 - null - [null, null, null, null, null] +34209 - null - [null, null, null, null, null] +34210 - null - [null, null, null, null, null] +34211 - null - [null, null, null, null, null] +34212 - null - [null, null, null, null, null] +34213 - null - [null, null, null, null, null] +34214 - null - [null, null, null, null, null] +34215 - null - [null, null, null, null, null] +34216 - Bamboo Ladder - [Climb-up, null, null, null, null] +34217 - Bamboo Ladder - [Climb-up, null, null, null, null] +34218 - null - [null, null, null, null, null] +34219 - null - [null, null, null, null, null] +34220 - null - [null, null, null, null, null] +34221 - null - [null, null, null, null, null] +34222 - Watchtower Legs - [null, null, null, null, null] +34223 - Teleportation Device - [Operate, null, null, null, null] +34224 - Teleportation Device - [Operate, null, null, null, null] +34225 - Crate - [Search, null, null, null, null] +34226 - Crates - [Search, null, null, null, null] +34227 - Chair - [null, null, null, null, null] +34228 - null - [null, null, null, null, null] +34229 - null - [null, null, null, null, null] +34230 - null - [null, null, null, null, null] +34231 - null - [null, null, null, null, null] +34232 - null - [null, null, null, null, null] +34233 - null - [null, null, null, null, null] +34234 - Door - [Open, null, null, null, null] +34235 - null - [null, null, null, null, null] +34236 - null - [null, null, null, null, null] +34237 - null - [null, null, null, null, null] +34238 - null - [null, null, null, null, null] +34239 - null - [null, null, null, null, null] +34240 - null - [null, null, null, null, null] +34241 - null - [null, null, null, null, null] +34242 - null - [null, null, null, null, null] +34243 - null - [null, null, null, null, null] +34244 - null - [null, null, null, null, null] +34245 - Wardrobe - [Open, null, null, null, null] +34246 - Wardrobe - [Open, null, null, null, null] +34247 - Wardrobe - [null, Search, Close, null, null] +34248 - Chest - [null, null, null, null, null] +34249 - null - [null, null, null, null, null] +34250 - null - [null, null, null, null, null] +34251 - null - [null, null, null, null, null] +34252 - null - [null, null, null, null, null] +34253 - null - [null, null, null, null, null] +34254 - null - [null, null, null, null, null] +34255 - null - [null, null, null, null, null] +34256 - null - [null, null, null, null, null] +34257 - null - [null, null, null, null, null] +34258 - null - [null, null, null, null, null] +34259 - null - [null, null, null, null, null] +34260 - null - [null, null, null, null, null] +34261 - null - [null, null, null, null, null] +34262 - null - [null, null, null, null, null] +34263 - null - [null, null, null, null, null] +34264 - null - [null, null, null, null, null] +34265 - null - [null, null, null, null, null] +34266 - null - [null, null, null, null, null] +34267 - null - [null, null, null, null, null] +34268 - null - [null, null, null, null, null] +34269 - null - [null, null, null, null, null] +34270 - null - [null, null, null, null, null] +34271 - null - [null, null, null, null, null] +34272 - Keg - [null, null, null, null, null] +34273 - Bed - [null, null, null, null, null] +34274 - null - [null, null, null, null, null] +34275 - null - [null, null, null, null, null] +34276 - null - [null, null, null, null, null] +34277 - null - [null, null, null, null, null] +34278 - null - [null, null, null, null, null] +34279 - null - [null, null, null, null, null] +34280 - null - [null, null, null, null, null] +34281 - null - [null, null, null, null, null] +34282 - null - [null, null, null, null, null] +34283 - null - [null, null, null, null, null] +34284 - null - [null, null, null, null, null] +34285 - null - [null, null, null, null, null] +34286 - Ladder - [null, Climb-down, Climb-up, null, null] +34287 - Ladder - [null, Climb-down, Climb-up, null, null] +34288 - Door - [Open, null, null, null, null] +34289 - Door - [Open, null, null, null, null] +34290 - Door - [null, null, null, null, null] +34291 - Door - [null, null, null, null, null] +34292 - null - [null, null, null, null, null] +34293 - null - [null, null, null, null, null] +34294 - null - [null, null, null, null, null] +34295 - null - [null, null, null, null, null] +34296 - null - [null, null, null, null, null] +34297 - null - [null, null, null, null, null] +34298 - null - [null, null, null, null, null] +34299 - Tomb - [null, null, null, null, null] +34300 - null - [null, null, null, null, null] +34301 - null - [null, null, null, null, null] +34302 - null - [null, null, null, null, null] +34303 - null - [null, null, null, null, null] +34304 - null - [null, null, null, null, null] +34305 - null - [null, null, null, null, null] +34306 - null - [null, null, null, null, null] +34307 - null - [null, null, null, null, null] +34308 - null - [null, null, null, null, null] +34309 - null - [null, null, null, null, null] +34310 - null - [null, null, null, null, null] +34311 - null - [null, null, null, null, null] +34312 - Door - [Open, null, null, null, null] +34313 - Door - [Close, null, null, null, null] +34314 - null - [null, null, null, null, null] +34315 - null - [null, null, null, null, null] +34316 - null - [null, null, null, null, null] +34317 - Pillar - [null, null, null, null, null] +34318 - null - [null, null, null, null, null] +34319 - null - [null, null, null, null, null] +34320 - null - [null, null, null, null, null] +34321 - null - [null, null, null, null, null] +34322 - null - [null, null, null, null, null] +34323 - null - [null, null, null, null, null] +34324 - null - [null, null, null, null, null] +34325 - null - [null, null, null, null, null] +34326 - null - [null, null, null, null, null] +34327 - null - [null, null, null, null, null] +34328 - null - [null, null, null, null, null] +34329 - null - [null, null, null, null, null] +34330 - null - [null, null, null, null, null] +34331 - null - [null, null, null, null, null] +34332 - null - [null, null, null, null, null] +34333 - null - [null, null, null, null, null] +34334 - null - [null, null, null, null, null] +34335 - null - [null, null, null, null, null] +34336 - null - [null, null, null, null, null] +34337 - null - [null, null, null, null, null] +34338 - null - [null, null, null, null, null] +34339 - null - [null, null, null, null, null] +34340 - null - [null, null, null, null, null] +34341 - null - [null, null, null, null, null] +34342 - null - [null, null, null, null, null] +34343 - null - [null, null, null, null, null] +34344 - null - [null, null, null, null, null] +34345 - null - [null, null, null, null, null] +34346 - null - [null, null, null, null, null] +34347 - null - [null, null, null, null, null] +34348 - null - [null, null, null, null, null] +34349 - null - [null, null, null, null, null] +34350 - null - [null, null, null, null, null] +34351 - null - [null, null, null, null, null] +34352 - null - [null, null, null, null, null] +34353 - Door - [Close, null, null, null, null] +34354 - Door - [Open, null, null, null, null] +34355 - null - [null, null, null, null, null] +34356 - null - [null, null, null, null, null] +34357 - null - [null, null, null, null, null] +34358 - null - [null, null, null, null, null] +34359 - null - [null, null, null, null, null] +34360 - null - [null, null, null, null, null] +34361 - null - [null, null, null, null, null] +34362 - null - [null, null, null, null, null] +34363 - null - [null, null, null, null, null] +34364 - null - [null, null, null, null, null] +34365 - null - [null, null, null, null, null] +34366 - Shelves - [null, null, null, null, null] +34367 - Shelves - [null, null, null, null, null] +34368 - Shelves - [null, null, null, null, null] +34369 - Shelves - [null, null, null, null, null] +34370 - Shelf - [null, null, null, null, null] +34371 - null - [null, null, null, null, null] +34372 - null - [null, null, null, null, null] +34373 - null - [null, null, null, null, null] +34374 - null - [null, null, null, null, null] +34375 - Row boat - [null, null, null, null, null] +34376 - Cart - [null, null, null, null, null] +34377 - null - [null, null, null, null, null] +34378 - null - [null, null, null, null, null] +34379 - null - [null, null, null, null, null] +34380 - null - [null, null, null, null, null] +34381 - Market stall - [null, null, null, null, null] +34382 - Silver stall - [null, Steal-from, null, null, null] +34383 - Silk stall - [null, Steal-from, null, null, null] +34384 - Baker's stall - [null, Steal-from, null, null, null] +34385 - Gem stall - [null, Steal-from, null, null, null] +34386 - Spice stall - [null, Steal-from, null, null, null] +34387 - Fur stall - [null, Steal-from, null, null, null] +34388 - Staircase - [Climb-up, null, null, null, null] +34389 - Staircase - [Climb, Climb-up, Climb-down, null, null] +34390 - Staircase - [Climb-down, null, null, null, null] +34391 - Staircase - [Climb-up, null, null, null, null] +34392 - Staircase - [Climb, Climb-up, Climb-down, null, null] +34393 - Staircase - [Climb-down, null, null, null, null] +34394 - Ladder - [Climb-up, null, null, null, null] +34395 - Ladder - [Climb, Climb-up, Climb-down, null, null] +34396 - Ladder - [Climb-down, null, null, null, null] +34397 - Staircase - [Climb-up, null, null, null, null] +34398 - Staircase - [Climb-down, null, null, null, null] +34399 - null - [null, null, null, null, null] +34400 - null - [null, null, null, null, null] +34401 - Bed - [null, null, null, null, null] +34402 - Bed - [null, null, null, null, null] +34403 - Bunk bed - [null, null, null, null, null] +34404 - Drawers - [Open, null, null, null, null] +34405 - Drawers - [Search, Shut, null, null, null] +34406 - Wardrobe - [null, null, null, null, null] +34407 - Dresser - [null, null, null, null, null] +34408 - null - [null, null, null, null, null] +34409 - Larder - [null, null, null, null, null] +34410 - Cooking range - [null, null, null, null, null] +34411 - Sink - [null, null, null, null, null] +34412 - Shelves - [null, null, null, null, null] +34413 - Shelves - [null, null, null, null, null] +34414 - Shelves - [null, null, null, null, null] +34415 - Shelves - [null, null, null, null, null] +34416 - Shelf - [null, null, null, null, null] +34417 - Shelf - [null, null, null, null, null] +34418 - null - [null, null, null, null, null] +34419 - null - [null, null, null, null, null] +34420 - null - [null, null, null, null, null] +34421 - null - [null, null, null, null, null] +34422 - Row boat - [null, null, null, null, null] +34423 - Cart - [null, null, null, null, null] +34424 - null - [null, null, null, null, null] +34425 - null - [null, null, null, null, null] +34426 - null - [null, null, null, null, null] +34427 - Broken Door - [null, null, null, null, null] +34428 - Broken cart wheel - [null, null, null, null, null] +34429 - Table - [null, null, null, null, null] +34430 - Smashed chair - [null, null, null, null, null] +34431 - Table - [null, null, null, null, null] +34432 - Ladder - [null, null, null, null, null] +34433 - Broken Chair - [null, null, null, null, null] +34434 - Broken Chair - [null, null, null, null, null] +34435 - Broken Chair - [null, null, null, null, null] +34436 - Cart - [null, null, null, null, null] +34437 - Broken range - [null, null, null, null, null] +34438 - Stool - [null, null, null, null, null] +34439 - Washing Line - [null, null, null, null, null] +34440 - Washing Line - [null, null, null, null, null] +34441 - Washing Line - [null, null, null, null, null] +34442 - null - [null, null, null, null, null] +34443 - Broken Chair - [null, null, null, null, null] +34444 - null - [null, null, null, null, null] +34445 - null - [null, null, null, null, null] +34446 - null - [null, null, null, null, null] +34447 - null - [null, null, null, null, null] +34448 - Tanning line - [null, null, null, null, null] +34449 - Mangle - [null, null, null, null, null] +34450 - Mangle - [null, null, null, null, null] +34451 - null - [null, null, null, null, null] +34452 - null - [null, null, null, null, null] +34453 - null - [null, null, null, null, null] +34454 - null - [null, null, null, null, null] +34455 - null - [null, null, null, null, null] +34456 - null - [null, null, null, null, null] +34457 - null - [null, null, null, null, null] +34458 - null - [null, null, null, null, null] +34459 - null - [null, null, null, null, null] +34460 - null - [null, null, null, null, null] +34461 - null - [null, null, null, null, null] +34462 - null - [null, null, null, null, null] +34463 - null - [null, null, null, null, null] +34464 - null - [null, null, null, null, null] +34465 - null - [null, null, null, null, null] +34466 - null - [null, null, null, null, null] +34467 - null - [null, null, null, null, null] +34468 - null - [null, null, null, null, null] +34469 - Table - [null, null, null, null, null] +34470 - Table - [null, null, null, null, null] +34471 - Chart Table - [null, null, null, null, null] +34472 - Globe Table - [null, null, null, null, null] +34473 - Table - [null, null, null, null, null] +34474 - Table - [null, null, null, null, null] +34475 - Bed - [null, null, null, null, null] +34476 - Bed - [null, null, null, null, null] +34477 - Bookcase - [null, null, null, null, null] +34478 - Bookcase - [null, null, null, null, null] +34479 - Bookcase - [null, null, null, null, null] +34480 - Books - [null, null, null, null, null] +34481 - Books - [null, null, null, null, null] +34482 - Drawers - [Open, null, null, null, null] +34483 - Drawers - [Search, Close, null, null, null] +34484 - Wardrobe - [null, null, null, null, null] +34485 - Wardrobe - [null, null, null, null, null] +34486 - Wardrobe - [null, null, null, null, null] +34487 - Wardrobe - [null, null, null, null, null] +34488 - Box - [null, null, null, null, null] +34489 - Box - [null, null, null, null, null] +34490 - Dresser - [null, null, null, null, null] +34491 - Telescope - [null, null, null, null, null] +34492 - null - [null, null, null, null, null] +34493 - Grandfather clock - [null, null, null, null, null] +34494 - Larder - [null, null, null, null, null] +34495 - Range - [null, null, null, null, null] +34496 - Sink - [null, null, null, null, null] +34497 - Spinning wheel - [Spin, null, null, null, null] +34498 - Staircase - [Climb-up, null, null, null, null] +34499 - Staircase - [Climb-down, null, null, null, null] +34500 - null - [null, null, null, null, null] +34501 - null - [null, null, null, null, null] +34502 - null - [null, null, null, null, null] +34503 - null - [null, null, null, null, null] +34504 - null - [null, null, null, null, null] +34505 - null - [null, null, null, null, null] +34506 - null - [null, null, null, null, null] +34507 - null - [null, null, null, null, null] +34508 - null - [null, null, null, null, null] +34509 - Painting - [null, null, null, null, null] +34510 - Painting - [null, null, null, null, null] +34511 - Painting - [null, null, null, null, null] +34512 - null - [null, null, null, null, null] +34513 - null - [null, null, null, null, null] +34514 - null - [null, null, null, null, null] +34515 - null - [null, null, null, null, null] +34516 - null - [null, null, null, null, null] +34517 - null - [null, null, null, null, null] +34518 - Table - [null, null, null, null, null] +34519 - Table - [null, null, null, null, null] +34520 - Table - [null, null, null, null, null] +34521 - Table - [null, null, null, null, null] +34522 - null - [null, null, null, null, null] +34523 - null - [null, null, null, null, null] +34524 - null - [null, null, null, null, null] +34525 - Bookcase - [null, null, null, null, null] +34526 - Bookcase - [null, null, null, null, null] +34527 - Bookcase - [Search, null, null, null, null] +34528 - Drawers - [Open, null, null, null, null] +34529 - Drawers - [Search, Close, null, null, null] +34530 - Drawers - [Open, null, null, null, null] +34531 - Drawers - [Search, Close, null, null, null] +34532 - Wardrobe - [null, null, null, null, null] +34533 - Wardrobe - [null, null, null, null, null] +34534 - Wardrobe - [null, null, null, null, null] +34535 - Wardrobe - [null, null, null, null, null] +34536 - Wardrobe - [null, null, null, null, null] +34537 - Wardrobe - [null, null, null, null, null] +34538 - Wardrobe - [null, null, null, null, null] +34539 - Box - [null, null, null, null, null] +34540 - Box - [null, null, null, null, null] +34541 - Box - [null, null, null, null, null] +34542 - Box - [null, null, null, null, null] +34543 - Dresser - [null, null, null, null, null] +34544 - Grandfather clock - [null, null, null, null, null] +34545 - Grandfather clock - [null, null, null, null, null] +34546 - Range - [null, null, null, null, null] +34547 - Sink - [null, null, null, null, null] +34548 - Staircase - [Climb-up, null, null, null, null] +34549 - Staircase - [Climb, Climb-up, Climb-down, null, null] +34550 - Staircase - [Climb-down, null, null, null, null] +34551 - null - [null, null, null, null, null] +34552 - null - [null, null, null, null, null] +34553 - null - [null, null, null, null, null] +34554 - null - [null, null, null, null, null] +34555 - null - [null, null, null, null, null] +34556 - Bed - [null, null, null, null, null] +34557 - Bed - [null, null, null, null, null] +34558 - Bunk bed - [null, null, null, null, null] +34559 - Drawers - [Open, null, null, null, null] +34560 - Drawers - [Search, Shut, null, null, null] +34561 - Wardrobe - [null, null, null, null, null] +34562 - Dresser - [null, null, null, null, null] +34563 - null - [null, null, null, null, null] +34564 - Larder - [null, null, null, null, null] +34565 - Cooking range - [null, null, null, null, null] +34566 - Sink - [null, null, null, null, null] +34567 - Staircase - [Climb-up, null, null, null, null] +34568 - Staircase - [Climb-down, null, null, null, null] +34569 - null - [null, null, null, null, null] +34570 - null - [null, null, null, null, null] +34571 - null - [null, null, null, null, null] +34572 - Swings - [null, null, null, null, null] +34573 - null - [null, null, null, null, null] +34574 - null - [null, null, null, null, null] +34575 - null - [null, null, null, null, null] +34576 - Well - [null, null, null, null, null] +34577 - Waterpump - [null, null, null, null, null] +34578 - Weather vane - [null, null, null, null, null] +34579 - Fountain - [null, null, null, null, null] +34580 - Wheelbarrow - [null, null, null, null, null] +34581 - Sack - [null, null, null, null, null] +34582 - Sack - [null, null, null, null, null] +34583 - Sacks - [Search, null, null, null, null] +34584 - null - [null, null, null, null, null] +34585 - Crate - [Search, null, null, null, null] +34586 - Crate - [Search, null, null, null, null] +34587 - Storage crate - [null, null, null, null, null] +34588 - Boxes - [Search, null, null, null, null] +34589 - Barrels - [null, null, null, null, null] +34590 - Barrel - [null, null, null, null, null] +34591 - Barrel - [null, null, null, null, null] +34592 - Barrel - [null, null, null, null, null] +34593 - Hay bales - [null, null, null, null, null] +34594 - Hay bales - [null, null, null, null, null] +34595 - null - [null, null, null, null, null] +34596 - null - [null, null, null, null, null] +34597 - null - [null, null, null, null, null] +34598 - null - [null, null, null, null, null] +34599 - null - [null, null, null, null, null] +34600 - null - [null, null, null, null, null] +34601 - null - [null, null, null, null, null] +34602 - null - [null, null, null, null, null] +34603 - null - [null, null, null, null, null] +34604 - null - [null, null, null, null, null] +34605 - null - [null, null, null, null, null] +34606 - null - [null, null, null, null, null] +34607 - null - [null, null, null, null, null] +34608 - null - [null, null, null, null, null] +34609 - null - [null, null, null, null, null] +34610 - null - [null, null, null, null, null] +34611 - null - [null, null, null, null, null] +34612 - null - [null, null, null, null, null] +34613 - null - [null, null, null, null, null] +34614 - null - [null, null, null, null, null] +34615 - Candles - [null, null, null, null, null] +34616 - Altar - [Pray, null, null, null, null] +34617 - Organ - [Play, null, null, null, null] +34618 - null - [null, null, null, null, null] +34619 - null - [null, null, null, null, null] +34620 - Gravestone - [null, null, null, null, null] +34621 - Gravestone - [null, null, null, null, null] +34622 - Gravestone - [null, null, null, null, null] +34623 - Gravestone - [null, null, null, null, null] +34624 - Gravestone - [null, null, null, null, null] +34625 - Gravestone - [null, null, null, null, null] +34626 - Gravestone - [null, null, null, null, null] +34627 - Gravestone - [null, null, null, null, null] +34628 - Gravestone - [null, null, null, null, null] +34629 - Gravestone - [null, null, null, null, null] +34630 - null - [null, null, null, null, null] +34631 - null - [null, null, null, null, null] +34632 - null - [null, null, null, null, null] +34633 - null - [null, null, null, null, null] +34634 - null - [null, null, null, null, null] +34635 - null - [null, null, null, null, null] +34636 - null - [null, null, null, null, null] +34637 - null - [null, null, null, null, null] +34638 - null - [null, null, null, null, null] +34639 - null - [null, null, null, null, null] +34640 - null - [null, null, null, null, null] +34641 - null - [null, null, null, null, null] +34642 - null - [null, null, null, null, null] +34643 - null - [null, null, null, null, null] +34644 - null - [null, null, null, null, null] +34645 - null - [null, null, null, null, null] +34646 - null - [null, null, null, null, null] +34647 - null - [null, null, null, null, null] +34648 - null - [null, null, null, null, null] +34649 - null - [null, null, null, null, null] +34650 - null - [null, null, null, null, null] +34651 - null - [null, null, null, null, null] +34652 - null - [null, null, null, null, null] +34653 - null - [null, null, null, null, null] +34654 - null - [null, null, null, null, null] +34655 - null - [null, null, null, null, null] +34656 - null - [null, null, null, null, null] +34657 - null - [null, null, null, null, null] +34658 - null - [null, null, null, null, null] +34659 - null - [null, null, null, null, null] +34660 - null - [null, null, null, null, null] +34661 - null - [null, null, null, null, null] +34662 - null - [null, null, null, null, null] +34663 - null - [null, null, null, null, null] +34664 - null - [null, null, null, null, null] +34665 - null - [null, null, null, null, null] +34666 - null - [null, null, null, null, null] +34667 - null - [null, null, null, null, null] +34668 - null - [null, null, null, null, null] +34669 - null - [null, null, null, null, null] +34670 - null - [null, null, null, null, null] +34671 - null - [null, null, null, null, null] +34672 - null - [null, null, null, null, null] +34673 - null - [null, null, null, null, null] +34674 - null - [null, null, null, null, null] +34675 - null - [null, null, null, null, null] +34676 - null - [null, null, null, null, null] +34677 - null - [null, null, null, null, null] +34678 - null - [null, null, null, null, null] +34679 - null - [null, null, null, null, null] +34680 - null - [null, null, null, null, null] +34681 - null - [null, null, null, null, null] +34682 - null - [null, null, null, null, null] +34683 - null - [null, null, null, null, null] +34684 - null - [null, null, null, null, null] +34685 - null - [null, null, null, null, null] +34686 - null - [null, null, null, null, null] +34687 - null - [null, null, null, null, null] +34688 - null - [null, null, null, null, null] +34689 - null - [null, null, null, null, null] +34690 - null - [null, null, null, null, null] +34691 - null - [null, null, null, null, null] +34692 - null - [null, null, null, null, null] +34693 - null - [null, null, null, null, null] +34694 - null - [null, null, null, null, null] +34695 - null - [null, null, null, null, null] +34696 - null - [null, null, null, null, null] +34697 - null - [null, null, null, null, null] +34698 - null - [null, null, null, null, null] +34699 - null - [null, null, null, null, null] +34700 - null - [null, null, null, null, null] +34701 - null - [null, null, null, null, null] +34702 - null - [null, null, null, null, null] +34703 - null - [null, null, null, null, null] +34704 - null - [null, null, null, null, null] +34705 - null - [null, null, null, null, null] +34706 - null - [null, null, null, null, null] +34707 - null - [null, null, null, null, null] +34708 - null - [null, null, null, null, null] +34709 - null - [null, null, null, null, null] +34710 - null - [null, null, null, null, null] +34711 - null - [null, null, null, null, null] +34712 - null - [null, null, null, null, null] +34713 - null - [null, null, null, null, null] +34714 - null - [null, null, null, null, null] +34715 - null - [null, null, null, null, null] +34716 - null - [null, null, null, null, null] +34717 - null - [null, null, null, null, null] +34718 - null - [null, null, null, null, null] +34719 - null - [null, null, null, null, null] +34720 - null - [null, null, null, null, null] +34721 - null - [null, null, null, null, null] +34722 - null - [null, null, null, null, null] +34723 - null - [null, null, null, null, null] +34724 - null - [null, null, null, null, null] +34725 - null - [null, null, null, null, null] +34726 - null - [null, null, null, null, null] +34727 - null - [null, null, null, null, null] +34728 - null - [null, null, null, null, null] +34729 - null - [null, null, null, null, null] +34730 - null - [null, null, null, null, null] +34731 - null - [null, null, null, null, null] +34732 - null - [null, null, null, null, null] +34733 - null - [null, null, null, null, null] +34734 - null - [null, null, null, null, null] +34735 - null - [null, null, null, null, null] +34736 - null - [null, null, null, null, null] +34737 - null - [null, null, null, null, null] +34738 - Gate - [null, null, null, null, null] +34739 - null - [null, null, null, null, null] +34740 - Bar - [null, null, null, null, null] +34741 - Bar - [null, null, null, null, null] +34742 - Bar - [null, null, null, null, null] +34743 - Bar - [null, null, null, null, null] +34744 - Bar - [null, null, null, null, null] +34745 - Bar - [null, null, null, null, null] +34746 - Bar - [null, null, null, null, null] +34747 - Bar - [null, null, null, null, null] +34748 - Bar - [null, null, null, null, null] +34749 - null - [null, null, null, null, null] +34750 - Barstool - [null, null, null, null, null] +34751 - Small table - [null, null, null, null, null] +34752 - Bank booth - [Use, Use-quickly, Collect, null, null] +34753 - null - [null, null, null, null, null] +34754 - null - [null, null, null, null, null] +34755 - Bank deposit box - [Deposit, null, null, null, null] +34756 - Safe - [null, null, null, null, null] +34757 - null - [null, null, null, null, null] +34758 - null - [null, null, null, null, null] +34759 - null - [null, null, null, null, null] +34760 - null - [null, null, null, null, null] +34761 - null - [null, null, null, null, null] +34762 - null - [null, null, null, null, null] +34763 - null - [null, null, null, null, null] +34764 - null - [null, null, null, null, null] +34765 - null - [null, null, null, null, null] +34766 - null - [null, null, null, null, null] +34767 - null - [null, null, null, null, null] +34768 - Stairs - [Climb-up, null, null, null, null] +34769 - Stairs - [Climb-down, null, null, null, null] +34770 - Stairs - [Climb-up, null, null, null, null] +34771 - Stairs - [Climb-down, null, null, null, null] +34772 - null - [null, null, null, null, null] +34773 - null - [null, null, null, null, null] +34774 - null - [null, null, null, null, null] +34775 - null - [null, null, null, null, null] +34776 - Stile - [Climb-over, null, null, null, null] +34777 - Gate - [Close, null, null, null, null] +34778 - Gate - [Close, null, null, null, null] +34779 - Gate - [Open, null, null, null, null] +34780 - Gate - [Open, null, null, null, null] +34781 - null - [null, null, null, null, null] +34782 - null - [null, null, null, null, null] +34783 - null - [null, null, null, null, null] +34784 - null - [null, null, null, null, null] +34785 - Ladder - [Climb-up, null, null, null, null] +34786 - Ladder - [Climb-up, null, null, null, null] +34787 - Ladder - [Climb, Climb-up, Climb-down, null, null] +34788 - Ladder - [Climb-down, null, null, null, null] +34789 - Ladder - [Climb-down, null, null, null, null] +34790 - null - [null, null, null, null, null] +34791 - null - [null, null, null, null, null] +34792 - null - [null, null, null, null, null] +34793 - null - [null, null, null, null, null] +34794 - null - [null, null, null, null, null] +34795 - null - [null, null, null, null, null] +34796 - Coal - [null, null, null, null, null] +34797 - null - [null, null, null, null, null] +34798 - Sewing machine - [null, null, null, null, null] +34799 - Table - [null, null, null, null, null] +34800 - Dairy churn - [Churn, null, null, null, null] +34801 - Potter's Wheel - [null, null, null, null, null] +34802 - Pottery Oven - [Fire, null, null, null, null] +34803 - null - [null, null, null, null, null] +34804 - null - [null, null, null, null, null] +34805 - Door - [Open, Pick-lock, null, null, null] +34806 - Door - [Open, Pick-lock, null, null, null] +34807 - Door - [Open, null, null, null, null] +34808 - Door - [Close, null, null, null, null] +34809 - Door - [Open, null, null, null, null] +34810 - Door - [Close, null, null, null, null] +34811 - Door - [Open, null, null, null, null] +34812 - Door - [Open, Pick-lock, null, null, null] +34813 - Door - [Close, null, null, null, null] +34814 - null - [null, null, null, null, null] +34815 - null - [null, null, null, null, null] +34816 - Door - [Open, null, null, null, null] +34817 - Door - [Open, null, null, null, null] +34818 - Door - [Close, null, null, null, null] +34819 - Door - [Open, null, null, null, null] +34820 - Door - [Close, null, null, null, null] +34821 - null - [null, null, null, null, null] +34822 - Door - [Open, null, null, null, null] +34823 - Door - [Close, null, null, null, null] +34824 - null - [null, null, null, null, null] +34825 - Wooden Door - [Open, null, null, null, null] +34826 - Wooden Door - [Close, null, null, null, null] +34827 - Wooden Door - [Open, null, null, null, null] +34828 - Wooden Door - [Close, null, null, null, null] +34829 - Ladder - [Climb-up, null, null, null, null] +34830 - null - [null, null, null, null, null] +34831 - null - [null, null, null, null, null] +34832 - null - [null, null, null, null, null] +34833 - null - [null, null, null, null, null] +34834 - null - [null, null, null, null, null] +34835 - null - [null, null, null, null, null] +34836 - null - [null, null, null, null, null] +34837 - null - [null, null, null, null, null] +34838 - null - [null, null, null, null, null] +34839 - null - [null, null, null, null, null] +34840 - Rack - [null, null, null, null, null] +34841 - null - [null, null, null, null, null] +34842 - null - [null, null, null, null, null] +34843 - null - [null, null, null, null, null] +34844 - null - [null, null, null, null, null] +34845 - null - [null, null, null, null, null] +34846 - null - [null, null, null, null, null] +34847 - null - [null, null, null, null, null] +34848 - null - [null, null, null, null, null] +34849 - null - [null, null, null, null, null] +34850 - null - [null, null, null, null, null] +34851 - null - [null, null, null, null, null] +34852 - null - [null, null, null, null, null] +34853 - null - [null, null, null, null, null] +34854 - null - [null, null, null, null, null] +34855 - null - [null, null, null, null, null] +34856 - null - [null, null, null, null, null] +34857 - null - [null, null, null, null, null] +34858 - null - [null, null, null, null, null] +34859 - null - [null, null, null, null, null] +34860 - null - [null, null, null, null, null] +34861 - null - [null, null, null, null, null] +34862 - null - [null, null, null, null, null] +34863 - null - [null, null, null, null, null] +34864 - null - [null, null, null, null, null] +34865 - null - [null, null, null, null, null] +34866 - null - [null, null, null, null, null] +34867 - null - [null, null, null, null, null] +34868 - null - [null, null, null, null, null] +34869 - null - [null, null, null, null, null] +34870 - null - [null, null, null, null, null] +34871 - Staircase - [Climb-up, null, null, null, null] +34872 - Staircase - [Climb, Climb-up, Climb-down, null, null] +34873 - Staircase - [Climb-down, null, null, null, null] +34874 - Staircase - [Climb-up, null, null, null, null] +34875 - Staircase - [Climb, Climb-up, Climb-down, null, null] +34876 - Staircase - [Climb-down, null, null, null, null] +34877 - Ladder - [Climb-up, null, null, null, null] +34878 - Ladder - [Climb-down, null, null, null, null] +34879 - null - [null, null, null, null, null] +34880 - null - [null, null, null, null, null] +34881 - null - [null, null, null, null, null] +34882 - null - [null, null, null, null, null] +34883 - null - [null, null, null, null, null] +34884 - null - [null, null, null, null, null] +34885 - null - [null, null, null, null, null] +34886 - null - [null, null, null, null, null] +34887 - Axe cabinet - [null, null, null, null, null] +34888 - Sword cabinet - [null, null, null, null, null] +34889 - Wardrobe - [null, null, null, null, null] +34890 - Wardrobe - [null, null, null, null, null] +34891 - Throne - [null, null, null, null, null] +34892 - Dresser - [null, null, null, null, null] +34893 - null - [null, null, null, null, null] +34894 - null - [null, null, null, null, null] +34895 - null - [null, null, null, null, null] +34896 - null - [null, null, null, null, null] +34897 - null - [null, null, null, null, null] +34898 - null - [null, null, null, null, null] +34899 - Rope - [null, null, null, null, null] +34900 - null - [null, null, null, null, null] +34901 - null - [null, null, null, null, null] +34902 - Statue of Baxtorian - [null, null, null, null, null] +34903 - Statue of Glarial - [null, null, null, null, null] +34904 - null - [null, null, null, null, null] +34905 - Chalice of Eternity - [null, null, null, null, null] +34906 - null - [null, null, null, null, null] +34907 - null - [null, null, null, null, null] +34908 - null - [null, null, null, null, null] +34909 - null - [null, null, null, null, null] +34910 - null - [null, null, null, null, null] +34911 - null - [null, null, null, null, null] +34912 - null - [null, null, null, null, null] +34913 - null - [null, null, null, null, null] +34914 - null - [null, null, null, null, null] +34915 - Waterfall - [null, null, null, null, null] +34916 - null - [null, null, null, null, null] +34917 - Jagged wall - [Look, Jump-over, null, null, null] +34918 - null - [null, null, null, null, null] +34919 - null - [null, null, null, null, null] +34920 - null - [null, null, null, null, null] +34921 - null - [null, null, null, null, null] +34922 - null - [null, null, null, null, null] +34923 - null - [null, null, null, null, null] +34924 - null - [null, null, null, null, null] +34925 - Shelf - [null, null, null, null, null] +34926 - Shelf - [null, null, null, null, null] +34927 - Table - [null, null, null, null, null] +34928 - Wallchart - [null, null, null, null, null] +34929 - null - [null, null, null, null, null] +34930 - null - [null, null, null, null, null] +34931 - null - [null, null, null, null, null] +34932 - Hammock - [null, null, null, null, null] +34933 - Sack - [null, null, null, null, null] +34934 - Barrel - [null, null, null, null, null] +34935 - null - [null, null, null, null, null] +34936 - Extra anchor - [null, null, null, null, null] +34937 - Lantern - [null, null, null, null, null] +34938 - Lantern - [null, null, null, null, null] +34939 - null - [null, null, null, null, null] +34940 - null - [null, null, null, null, null] +34941 - null - [null, null, null, null, null] +34942 - null - [null, null, null, null, null] +34943 - null - [null, null, null, null, null] +34944 - null - [null, null, null, null, null] +34945 - null - [null, null, null, null, null] +34946 - null - [null, null, null, null, null] +34947 - Solid bronze door - [Open, null, null, null, null] +34948 - null - [null, null, null, null, null] +34949 - null - [null, null, null, null, null] +34950 - null - [null, null, null, null, null] +34951 - null - [null, null, null, null, null] +34952 - null - [null, null, null, null, null] +34953 - null - [null, null, null, null, null] +34954 - null - [null, null, null, null, null] +34955 - null - [null, null, null, null, null] +34956 - null - [null, null, null, null, null] +34957 - null - [null, null, null, null, null] +34958 - null - [null, null, null, null, null] +34959 - null - [null, null, null, null, null] +34960 - null - [null, null, null, null, null] +34961 - null - [null, null, null, null, null] +34962 - null - [null, null, null, null, null] +34963 - Cave exit - [Exit, null, null, null, null] +34964 - null - [null, null, null, null, null] +34965 - null - [null, null, null, null, null] +34966 - null - [null, null, null, null, null] +34967 - null - [null, null, null, null, null] +34968 - Table - [null, null, null, null, null] +34969 - null - [null, null, null, null, null] +34970 - null - [null, null, null, null, null] +34971 - null - [null, null, null, null, null] +34972 - null - [null, null, null, null, null] +34973 - null - [null, null, null, null, null] +34974 - null - [null, null, null, null, null] +34975 - null - [null, null, null, null, null] +34976 - Mineral vein - [Mine, Prospect, null, null, null] +34977 - Mineral vein - [Mine, Prospect, null, null, null] +34978 - Staircase - [Climb-down, null, null, null, null] +34979 - Skeleton - [null, null, null, null, null] +34980 - null - [null, null, null, null, null] +34981 - null - [null, null, null, null, null] +34982 - null - [null, null, null, null, null] +34983 - null - [null, null, null, null, null] +34984 - null - [null, null, null, null, null] +34985 - null - [null, null, null, null, null] +34986 - null - [null, null, null, null, null] +34987 - null - [null, null, null, null, null] +34988 - Crater - [null, null, null, null, null] +34989 - null - [null, null, null, null, null] +34990 - null - [null, null, null, null, null] +34991 - null - [null, null, null, null, null] +34992 - null - [null, null, null, null, null] +34993 - null - [null, null, null, null, null] +34994 - null - [null, null, null, null, null] +34995 - Ladder - [Climb-down, null, null, null, null] +34996 - null - [null, null, null, null, null] +34997 - null - [null, null, null, null, null] +34998 - null - [null, null, null, null, null] +34999 - null - [null, null, null, null, null] +35000 - null - [null, null, null, null, null] +35001 - null - [null, null, null, null, null] +35002 - Cave Exit - [Exit, null, null, null, null] +35003 - null - [null, null, null, null, null] +35004 - null - [null, null, null, null, null] +35005 - null - [null, null, null, null, null] +35006 - null - [null, null, null, null, null] +35007 - null - [null, null, null, null, null] +35008 - null - [null, null, null, null, null] +35009 - null - [null, null, null, null, null] +35010 - null - [null, null, null, null, null] +35011 - null - [null, null, null, null, null] +35012 - null - [null, null, null, null, null] +35013 - null - [null, null, null, null, null] +35014 - null - [null, null, null, null, null] +35015 - crate - [null, null, null, null, null] +35016 - null - [null, null, null, null, null] +35017 - barrel - [null, null, null, null, null] +35018 - null - [null, null, null, null, null] +35019 - null - [null, null, null, null, null] +35020 - null - [null, null, null, null, null] +35021 - null - [null, null, null, null, null] +35022 - null - [null, null, null, null, null] +35023 - null - [null, null, null, null, null] +35024 - null - [null, null, null, null, null] +35025 - null - [null, null, null, null, null] +35026 - null - [null, null, null, null, null] +35027 - null - [null, null, null, null, null] +35028 - null - [null, null, null, null, null] +35029 - null - [null, null, null, null, null] +35030 - null - [null, null, null, null, null] +35031 - null - [null, null, null, null, null] +35032 - null - [null, null, null, null, null] +35033 - null - [null, null, null, null, null] +35034 - null - [null, null, null, null, null] +35035 - null - [null, null, null, null, null] +35036 - null - [null, null, null, null, null] +35037 - null - [null, null, null, null, null] +35038 - null - [null, null, null, null, null] +35039 - null - [null, null, null, null, null] +35040 - null - [null, null, null, null, null] +35041 - null - [null, null, null, null, null] +35042 - null - [null, null, null, null, null] +35043 - null - [null, null, null, null, null] +35044 - null - [null, null, null, null, null] +35045 - null - [null, null, null, null, null] +35046 - null - [null, null, null, null, null] +35047 - null - [null, null, null, null, null] +35048 - null - [null, null, null, null, null] +35049 - null - [null, null, null, null, null] +35050 - null - [null, null, null, null, null] +35051 - null - [null, null, null, null, null] +35052 - null - [null, null, null, null, null] +35053 - null - [null, null, null, null, null] +35054 - null - [null, null, null, null, null] +35055 - null - [null, null, null, null, null] +35056 - null - [null, null, null, null, null] +35057 - null - [null, null, null, null, null] +35058 - null - [null, null, null, null, null] +35059 - null - [null, null, null, null, null] +35060 - null - [null, null, null, null, null] +35061 - null - [null, null, null, null, null] +35062 - null - [null, null, null, null, null] +35063 - null - [null, null, null, null, null] +35064 - null - [null, null, null, null, null] +35065 - null - [null, null, null, null, null] +35066 - null - [null, null, null, null, null] +35067 - null - [null, null, null, null, null] +35068 - null - [null, null, null, null, null] +35069 - null - [null, null, null, null, null] +35070 - null - [null, null, null, null, null] +35071 - null - [null, null, null, null, null] +35072 - null - [null, null, null, null, null] +35073 - null - [null, null, null, null, null] +35074 - null - [null, null, null, null, null] +35075 - null - [null, null, null, null, null] +35076 - null - [null, null, null, null, null] +35077 - Tent - [null, null, null, null, null] +35078 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +35079 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +35080 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +35081 - Ogre Coffin - [null, null, null, null, null] +35082 - Ogre Coffin - [null, null, null, null, null] +35083 - Ogre Coffin - [null, null, null, null, null] +35084 - Ogre Coffin - [null, null, null, null, null] +35085 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +35086 - Statue - [null, null, null, null, null] +35087 - Statue - [null, null, null, null, null] +35088 - null - [null, null, null, null, null] +35089 - null - [null, null, null, null, null] +35090 - null - [null, null, null, null, null] +35091 - null - [null, null, null, null, null] +35092 - null - [null, null, null, null, null] +35093 - null - [null, null, null, null, null] +35094 - null - [null, null, null, null, null] +35095 - Fremennik boat - [null, null, null, null, null] +35096 - null - [null, null, null, null, null] +35097 - null - [null, null, null, null, null] +35098 - null - [null, null, null, null, null] +35099 - null - [null, null, null, null, null] +35100 - null - [null, null, null, null, null] +35101 - Torch - [null, null, null, null, null] +35102 - Torch - [null, null, null, null, null] +35103 - null - [null, null, null, null, null] +35104 - null - [null, null, null, null, null] +35105 - null - [null, null, null, null, null] +35106 - null - [null, null, null, null, null] +35107 - null - [null, null, null, null, null] +35108 - null - [null, null, null, null, null] +35109 - null - [null, null, null, null, null] +35110 - null - [null, null, null, null, null] +35111 - null - [null, null, null, null, null] +35112 - null - [null, null, null, null, null] +35113 - null - [null, null, null, null, null] +35114 - null - [null, null, null, null, null] +35115 - null - [null, null, null, null, null] +35116 - null - [null, null, null, null, null] +35117 - null - [null, null, null, null, null] +35118 - null - [null, null, null, null, null] +35119 - null - [null, null, null, null, null] +35120 - null - [null, null, null, null, null] +35121 - Stairs - [Climb-down, null, null, null, null] +35122 - Closed chest - [Open, null, null, null, null] +35123 - Open chest - [Search, Shut, null, null, null] +35124 - null - [null, null, null, null, null] +35125 - Ladder - [Climb-up, null, null, null, null] +35126 - Tunnel - [Enter, null, null, null, null] +35127 - Tunnel - [Enter, null, null, null, null] +35128 - null - [null, null, null, null, null] +35129 - null - [null, null, null, null, null] +35130 - null - [null, null, null, null, null] +35131 - null - [null, null, null, null, null] +35132 - null - [null, null, null, null, null] +35133 - Wardrobe - [null, Search, Close, null, null] +35134 - Wardrobe - [null, Search, Close, null, null] +35135 - Wardrobe - [null, Search, Close, null, null] +35136 - Wardrobe - [null, Search, Close, null, null] +35137 - null - [null, null, null, null, null] +35138 - null - [null, null, null, null, null] +35139 - null - [null, null, null, null, null] +35140 - Pillar - [null, null, null, null, null] +35141 - Pillar - [null, null, null, null, null] +35142 - null - [null, null, null, null, null] +35143 - null - [null, null, null, null, null] +35144 - null - [null, null, null, null, null] +35145 - Flag - [null, null, null, null, null] +35146 - Door - [Open, null, null, null, null] +35147 - null - [null, null, null, null, null] +35148 - Boxes - [null, null, null, null, null] +35149 - Chair - [null, null, null, null, null] +35150 - Rat barrel - [null, null, null, null, null] +35151 - Rat barrel - [null, null, null, null, null] +35152 - null - [null, null, null, null, null] +35153 - null - [null, null, null, null, null] +35154 - null - [null, null, null, null, null] +35155 - null - [null, null, null, null, null] +35156 - A bunk bed - [null, null, null, null, null] +35157 - null - [null, null, null, null, null] +35158 - Rift - [Enter, null, null, null, null] +35159 - Rift - [Enter, null, null, null, null] +35160 - null - [null, null, null, null, null] +35161 - null - [null, null, null, null, null] +35162 - null - [null, null, null, null, null] +35163 - null - [null, null, null, null, null] +35164 - null - [null, null, null, null, null] +35165 - null - [null, null, null, null, null] +35166 - null - [null, null, null, null, null] +35167 - null - [null, null, null, null, null] +35168 - null - [null, null, null, null, null] +35169 - null - [null, null, null, null, null] +35170 - null - [null, null, null, null, null] +35171 - null - [null, null, null, null, null] +35172 - null - [null, null, null, null, null] +35173 - null - [null, null, null, null, null] +35174 - null - [null, null, null, null, null] +35175 - null - [null, null, null, null, null] +35176 - null - [null, null, null, null, null] +35177 - null - [null, null, null, null, null] +35178 - null - [null, null, null, null, null] +35179 - null - [null, null, null, null, null] +35180 - null - [null, null, null, null, null] +35181 - null - [null, null, null, null, null] +35182 - null - [null, null, null, null, null] +35183 - null - [null, null, null, null, null] +35184 - null - [null, null, null, null, null] +35185 - null - [null, null, null, null, null] +35186 - null - [null, null, null, null, null] +35187 - null - [null, null, null, null, null] +35188 - null - [null, null, null, null, null] +35189 - null - [null, null, null, null, null] +35190 - null - [null, null, null, null, null] +35191 - null - [null, null, null, null, null] +35192 - Boat - [null, null, null, null, null] +35193 - null - [null, null, null, null, null] +35194 - null - [null, null, null, null, null] +35195 - null - [null, null, null, null, null] +35196 - null - [null, null, null, null, null] +35197 - null - [null, null, null, null, null] +35198 - null - [null, null, null, null, null] +35199 - null - [null, null, null, null, null] +35200 - null - [null, null, null, null, null] +35201 - null - [null, null, null, null, null] +35202 - null - [null, null, null, null, null] +35203 - null - [null, null, null, null, null] +35204 - null - [null, null, null, null, null] +35205 - null - [null, null, null, null, null] +35206 - null - [null, null, null, null, null] +35207 - null - [null, null, null, null, null] +35208 - null - [null, null, null, null, null] +35209 - null - [null, null, null, null, null] +35210 - null - [null, null, null, null, null] +35211 - null - [null, null, null, null, null] +35212 - null - [null, null, null, null, null] +35213 - null - [null, null, null, null, null] +35214 - null - [null, null, null, null, null] +35215 - null - [null, null, null, null, null] +35216 - null - [null, null, null, null, null] +35217 - null - [null, null, null, null, null] +35218 - null - [null, null, null, null, null] +35219 - null - [null, null, null, null, null] +35220 - null - [null, null, null, null, null] +35221 - Bench - [null, null, null, null, null] +35222 - Cupboard - [Open, null, null, null, null] +35223 - Cupboard - [Close, Search, null, null, null] +35224 - Bookcase - [Search, null, null, null, null] +35225 - Bookcase - [Search, null, null, null, null] +35226 - Bookcase - [Search, null, null, null, null] +35227 - Bookcase - [Search, null, null, null, null] +35228 - null - [null, null, null, null, null] +35229 - null - [null, null, null, null, null] +35230 - null - [null, null, null, null, null] +35231 - null - [null, null, null, null, null] +35232 - null - [null, null, null, null, null] +35233 - null - [null, null, null, null, null] +35234 - null - [null, null, null, null, null] +35235 - null - [null, null, null, null, null] +35236 - null - [null, null, null, null, null] +35237 - null - [null, null, null, null, null] +35238 - null - [null, null, null, null, null] +35239 - null - [null, null, null, null, null] +35240 - null - [null, null, null, null, null] +35241 - Door - [Open, null, null, null, null] +35242 - Door - [Close, null, null, null, null] +35243 - Door - [Open, null, null, null, null] +35244 - null - [null, null, null, null, null] +35245 - null - [null, null, null, null, null] +35246 - null - [null, null, null, null, null] +35247 - null - [null, null, null, null, null] +35248 - null - [null, null, null, null, null] +35249 - null - [null, null, null, null, null] +35250 - null - [null, null, null, null, null] +35251 - null - [null, null, null, null, null] +35252 - null - [null, null, null, null, null] +35253 - null - [null, null, null, null, null] +35254 - null - [null, null, null, null, null] +35255 - null - [null, null, null, null, null] +35256 - null - [null, null, null, null, null] +35257 - null - [null, null, null, null, null] +35258 - null - [null, null, null, null, null] +35259 - null - [null, null, null, null, null] +35260 - null - [null, null, null, null, null] +35261 - null - [null, null, null, null, null] +35262 - null - [null, null, null, null, null] +35263 - null - [null, null, null, null, null] +35264 - null - [null, null, null, null, null] +35265 - null - [null, null, null, null, null] +35266 - null - [null, null, null, null, null] +35267 - null - [null, null, null, null, null] +35268 - null - [null, null, null, null, null] +35269 - null - [null, null, null, null, null] +35270 - null - [null, null, null, null, null] +35271 - null - [null, null, null, null, null] +35272 - null - [null, null, null, null, null] +35273 - null - [null, null, null, null, null] +35274 - null - [null, null, null, null, null] +35275 - null - [null, null, null, null, null] +35276 - null - [null, null, null, null, null] +35277 - null - [null, null, null, null, null] +35278 - null - [null, null, null, null, null] +35279 - null - [null, null, null, null, null] +35280 - null - [null, null, null, null, null] +35281 - null - [null, null, null, null, null] +35282 - null - [null, null, null, null, null] +35283 - null - [null, null, null, null, null] +35284 - null - [null, null, null, null, null] +35285 - null - [null, null, null, null, null] +35286 - null - [null, null, null, null, null] +35287 - null - [null, null, null, null, null] +35288 - null - [null, null, null, null, null] +35289 - null - [null, null, null, null, null] +35290 - null - [null, null, null, null, null] +35291 - null - [null, null, null, null, null] +35292 - null - [null, null, null, null, null] +35293 - null - [null, null, null, null, null] +35294 - null - [null, null, null, null, null] +35295 - null - [null, null, null, null, null] +35296 - null - [null, null, null, null, null] +35297 - null - [null, null, null, null, null] +35298 - null - [null, null, null, null, null] +35299 - null - [null, null, null, null, null] +35300 - null - [null, null, null, null, null] +35301 - null - [null, null, null, null, null] +35302 - null - [null, null, null, null, null] +35303 - null - [null, null, null, null, null] +35304 - null - [null, null, null, null, null] +35305 - null - [null, null, null, null, null] +35306 - null - [null, null, null, null, null] +35307 - null - [null, null, null, null, null] +35308 - null - [null, null, null, null, null] +35309 - null - [null, null, null, null, null] +35310 - null - [null, null, null, null, null] +35311 - null - [null, null, null, null, null] +35312 - null - [null, null, null, null, null] +35313 - null - [null, null, null, null, null] +35314 - null - [null, null, null, null, null] +35315 - null - [null, null, null, null, null] +35316 - null - [null, null, null, null, null] +35317 - null - [null, null, null, null, null] +35318 - null - [null, null, null, null, null] +35319 - null - [null, null, null, null, null] +35320 - null - [null, null, null, null, null] +35321 - null - [null, null, null, null, null] +35322 - null - [null, null, null, null, null] +35323 - null - [null, null, null, null, null] +35324 - null - [null, null, null, null, null] +35325 - null - [null, null, null, null, null] +35326 - null - [null, null, null, null, null] +35327 - null - [null, null, null, null, null] +35328 - null - [null, null, null, null, null] +35329 - null - [null, null, null, null, null] +35330 - null - [null, null, null, null, null] +35331 - null - [null, null, null, null, null] +35332 - null - [null, null, null, null, null] +35333 - null - [null, null, null, null, null] +35334 - null - [null, null, null, null, null] +35335 - null - [null, null, null, null, null] +35336 - null - [null, null, null, null, null] +35337 - null - [null, null, null, null, null] +35338 - null - [null, null, null, null, null] +35339 - null - [null, null, null, null, null] +35340 - null - [null, null, null, null, null] +35341 - null - [null, null, null, null, null] +35342 - null - [null, null, null, null, null] +35343 - null - [null, null, null, null, null] +35344 - null - [null, null, null, null, null] +35345 - null - [null, null, null, null, null] +35346 - null - [null, null, null, null, null] +35347 - null - [null, null, null, null, null] +35348 - null - [null, null, null, null, null] +35349 - null - [null, null, null, null, null] +35350 - null - [null, null, null, null, null] +35351 - null - [null, null, null, null, null] +35352 - null - [null, null, null, null, null] +35353 - null - [null, null, null, null, null] +35354 - null - [null, null, null, null, null] +35355 - null - [null, null, null, null, null] +35356 - null - [null, null, null, null, null] +35357 - null - [null, null, null, null, null] +35358 - null - [null, null, null, null, null] +35359 - null - [null, null, null, null, null] +35360 - null - [null, null, null, null, null] +35361 - null - [null, null, null, null, null] +35362 - null - [null, null, null, null, null] +35363 - null - [null, null, null, null, null] +35364 - null - [null, null, null, null, null] +35365 - null - [null, null, null, null, null] +35366 - null - [null, null, null, null, null] +35367 - null - [null, null, null, null, null] +35368 - null - [null, null, null, null, null] +35369 - null - [null, null, null, null, null] +35370 - null - [null, null, null, null, null] +35371 - null - [null, null, null, null, null] +35372 - null - [null, null, null, null, null] +35373 - null - [null, null, null, null, null] +35374 - null - [null, null, null, null, null] +35375 - null - [null, null, null, null, null] +35376 - null - [null, null, null, null, null] +35377 - null - [null, null, null, null, null] +35378 - null - [null, null, null, null, null] +35379 - Mushroom - [null, null, null, null, null] +35380 - Mushrooms - [null, null, null, null, null] +35381 - null - [null, null, null, null, null] +35382 - null - [null, null, null, null, null] +35383 - Bed - [null, null, null, null, null] +35384 - Bed - [null, null, null, null, null] +35385 - Painting - [null, null, null, null, null] +35386 - Dragon's head - [null, null, null, null, null] +35387 - Clothes equipment - [null, null, null, null, null] +35388 - Bow cabinet - [null, null, null, null, null] +35389 - null - [null, null, null, null, null] +35390 - null - [null, null, null, null, null] +35391 - null - [null, null, null, null, null] +35392 - null - [null, null, null, null, null] +35393 - null - [null, null, null, null, null] +35394 - null - [null, null, null, null, null] +35395 - null - [null, null, null, null, null] +35396 - null - [null, null, null, null, null] +35397 - null - [null, null, null, null, null] +35398 - null - [null, null, null, null, null] +35399 - null - [null, null, null, null, null] +35400 - Shantay Pass - [Go-through, Look-at, Quick-pass, null, null] +35401 - Jail Door - [Open, null, null, null, null] +35402 - null - [null, null, null, null, null] +35403 - null - [null, null, null, null, null] +35404 - null - [null, null, null, null, null] +35405 - null - [null, null, null, null, null] +35406 - null - [null, null, null, null, null] +35407 - null - [null, null, null, null, null] +35408 - null - [null, null, null, null, null] +35409 - null - [null, null, null, null, null] +35410 - null - [null, null, null, null, null] +35411 - null - [null, null, null, null, null] +35412 - null - [null, null, null, null, null] +35413 - null - [null, null, null, null, null] +35414 - null - [null, null, null, null, null] +35415 - null - [null, null, null, null, null] +35416 - Cactus - [null, null, null, null, null] +35417 - Cactus - [null, null, null, null, null] +35418 - Cactus - [null, null, null, null, null] +35419 - Cactus - [null, null, null, null, null] +35420 - Cactus - [null, null, null, null, null] +35421 - Cactus - [null, null, null, null, null] +35422 - Cactus - [null, null, null, null, null] +35423 - Cactus - [null, null, null, null, null] +35424 - Cactus - [null, null, null, null, null] +35425 - Cactus - [null, null, null, null, null] +35426 - Cactus - [null, null, null, null, null] +35427 - Cactus - [null, null, null, null, null] +35428 - Cactus - [null, null, null, null, null] +35429 - Cactus - [null, null, null, null, null] +35430 - Cactus - [null, null, null, null, null] +35431 - null - [null, null, null, null, null] +35432 - Plant - [null, null, null, null, null] +35433 - null - [null, null, null, null, null] +35434 - null - [null, null, null, null, null] +35435 - null - [null, null, null, null, null] +35436 - null - [null, null, null, null, null] +35437 - Gem stall - [null, null, null, null, null] +35438 - Information - [null, null, null, null, null] +35439 - Gnome glider - [null, null, null, null, null] +35440 - null - [null, null, null, null, null] +35441 - null - [null, null, null, null, null] +35442 - null - [null, null, null, null, null] +35443 - null - [null, null, null, null, null] +35444 - null - [null, null, null, null, null] +35445 - null - [null, null, null, null, null] +35446 - null - [null, null, null, null, null] +35447 - null - [null, null, null, null, null] +35448 - Kebab cooker - [null, null, null, null, null] +35449 - Fireplace - [null, null, null, null, null] +35450 - null - [null, null, null, null, null] +35451 - Chair - [null, null, null, null, null] +35452 - Throne - [null, null, null, null, null] +35453 - Palatial table - [null, null, null, null, null] +35454 - Opulent table - [null, null, null, null, null] +35455 - Mini-table - [null, null, null, null, null] +35456 - A display case - [null, null, null, null, null] +35457 - Large urns - [null, null, null, null, null] +35458 - Urns - [null, null, null, null, null] +35459 - null - [null, null, null, null, null] +35460 - null - [null, null, null, null, null] +35461 - null - [null, null, null, null, null] +35462 - null - [null, null, null, null, null] +35463 - null - [null, null, null, null, null] +35464 - null - [null, null, null, null, null] +35465 - null - [null, null, null, null, null] +35466 - null - [null, null, null, null, null] +35467 - null - [null, null, null, null, null] +35468 - null - [null, null, null, null, null] +35469 - Carved fountain - [null, null, null, null, null] +35470 - Ornate Chest - [Open, null, null, null, null] +35471 - Ornate chest - [Close, Search, null, null, null] +35472 - null - [null, null, null, null, null] +35473 - null - [null, null, null, null, null] +35474 - Divan - [null, null, null, null, null] +35475 - null - [null, null, null, null, null] +35476 - null - [null, null, null, null, null] +35477 - null - [null, null, null, null, null] +35478 - null - [null, null, null, null, null] +35479 - null - [null, null, null, null, null] +35480 - null - [null, null, null, null, null] +35481 - null - [null, null, null, null, null] +35482 - null - [null, null, null, null, null] +35483 - null - [null, null, null, null, null] +35484 - null - [null, null, null, null, null] +35485 - null - [null, null, null, null, null] +35486 - null - [null, null, null, null, null] +35487 - null - [null, null, null, null, null] +35488 - null - [null, null, null, null, null] +35489 - null - [null, null, null, null, null] +35490 - null - [null, null, null, null, null] +35491 - null - [null, null, null, null, null] +35492 - null - [null, null, null, null, null] +35493 - null - [null, null, null, null, null] +35494 - null - [null, null, null, null, null] +35495 - null - [null, null, null, null, null] +35496 - null - [null, null, null, null, null] +35497 - null - [null, null, null, null, null] +35498 - null - [null, null, null, null, null] +35499 - null - [null, null, null, null, null] +35500 - null - [null, null, null, null, null] +35501 - null - [null, null, null, null, null] +35502 - null - [null, null, null, null, null] +35503 - null - [null, null, null, null, null] +35504 - null - [null, null, null, null, null] +35505 - null - [null, null, null, null, null] +35506 - null - [null, null, null, null, null] +35507 - null - [null, null, null, null, null] +35508 - null - [null, null, null, null, null] +35509 - null - [null, null, null, null, null] +35510 - null - [null, null, null, null, null] +35511 - null - [null, null, null, null, null] +35512 - null - [null, null, null, null, null] +35513 - null - [null, null, null, null, null] +35514 - null - [null, null, null, null, null] +35515 - null - [null, null, null, null, null] +35516 - Steps - [Climb-up, null, null, null, null] +35517 - Steps - [null, null, null, null, null] +35518 - Steps - [Climb-down, null, null, null, null] +35519 - null - [null, null, null, null, null] +35520 - Large door - [Open, null, null, null, null] +35521 - null - [null, null, null, null, null] +35522 - null - [null, null, null, null, null] +35523 - null - [null, null, null, null, null] +35524 - null - [null, null, null, null, null] +35525 - Werewolf statue - [null, null, null, null, null] +35526 - Statue - [null, null, null, null, null] +35527 - null - [null, null, null, null, null] +35528 - null - [null, null, null, null, null] +35529 - null - [null, null, null, null, null] +35530 - null - [null, null, null, null, null] +35531 - null - [null, null, null, null, null] +35532 - null - [null, null, null, null, null] +35533 - Staircase - [Climb-up, null, null, null, null] +35534 - Staircase - [Climb-down, null, null, null, null] +35535 - null - [null, null, null, null, null] +35536 - null - [null, null, null, null, null] +35537 - null - [null, null, null, null, null] +35538 - null - [null, null, null, null, null] +35539 - null - [null, null, null, null, null] +35540 - Cell door - [Open, null, null, null, null] +35541 - Cell door - [Close, null, null, null, null] +35542 - Shantay Pass - [Go-through, Look-at, Quick-pass, null, null] +35543 - Shantay Pass - [Go-through, Look-at, Quick-pass, null, null] +35544 - Shantay Pass - [Go-through, Look-at, Quick-pass, null, null] +35545 - Shantay Pass - [Go-through, Look-at, Quick-pass, null, null] +35546 - Shantay Pass - [Go-through, Look-at, Quick-pass, null, null] +35547 - Shantay Pass - [Go-through, Look-at, Quick-pass, null, null] +35548 - Shantay Pass - [Go-through, Look-at, Quick-pass, null, null] +35549 - Gate - [Open, null, null, Pay-toll(10gp), null] +35550 - Gate - [null, null, null, null, null] +35551 - Gate - [Open, null, null, Pay-toll(10gp), null] +35552 - Gate - [null, null, null, null, null] +35553 - null - [null, null, null, null, null] +35554 - null - [null, null, null, null, null] +35555 - Danger sign - [null, null, null, null, null] +35556 - null - [null, null, null, null, null] +35557 - null - [null, null, null, null, null] +35558 - null - [null, null, null, null, null] +35559 - null - [null, null, null, null, null] +35560 - null - [null, null, null, null, null] +35561 - null - [null, null, null, null, null] +35562 - null - [null, null, null, null, null] +35563 - null - [null, null, null, null, null] +35564 - null - [null, null, null, null, null] +35565 - null - [null, null, null, null, null] +35566 - null - [null, null, null, null, null] +35567 - null - [null, null, null, null, null] +35568 - null - [null, null, null, null, null] +35569 - null - [null, null, null, null, null] +35570 - null - [null, null, null, null, null] +35571 - null - [null, null, null, null, null] +35572 - null - [null, null, null, null, null] +35573 - null - [null, null, null, null, null] +35574 - null - [null, null, null, null, null] +35575 - null - [null, null, null, null, null] +35576 - null - [null, null, null, null, null] +35577 - null - [null, null, null, null, null] +35578 - null - [null, null, null, null, null] +35579 - null - [null, null, null, null, null] +35580 - null - [null, null, null, null, null] +35581 - null - [null, null, null, null, null] +35582 - null - [null, null, null, null, null] +35583 - null - [null, null, null, null, null] +35584 - null - [null, null, null, null, null] +35585 - null - [null, null, null, null, null] +35586 - null - [null, null, null, null, null] +35587 - null - [null, null, null, null, null] +35588 - null - [null, null, null, null, null] +35589 - null - [null, null, null, null, null] +35590 - null - [null, null, null, null, null] +35591 - null - [null, null, null, null, null] +35592 - null - [null, null, null, null, null] +35593 - null - [null, null, null, null, null] +35594 - null - [null, null, null, null, null] +35595 - null - [null, null, null, null, null] +35596 - null - [null, null, null, null, null] +35597 - null - [null, null, null, null, null] +35598 - null - [null, null, null, null, null] +35599 - null - [null, null, null, null, null] +35600 - null - [null, null, null, null, null] +35601 - null - [null, null, null, null, null] +35602 - null - [null, null, null, null, null] +35603 - null - [null, null, null, null, null] +35604 - null - [null, null, null, null, null] +35605 - null - [null, null, null, null, null] +35606 - null - [null, null, null, null, null] +35607 - null - [null, null, null, null, null] +35608 - null - [null, null, null, null, null] +35609 - null - [null, null, null, null, null] +35610 - null - [null, null, null, null, null] +35611 - null - [null, null, null, null, null] +35612 - null - [null, null, null, null, null] +35613 - null - [null, null, null, null, null] +35614 - null - [null, null, null, null, null] +35615 - null - [null, null, null, null, null] +35616 - null - [null, null, null, null, null] +35617 - null - [null, null, null, null, null] +35618 - null - [null, null, null, null, null] +35619 - null - [null, null, null, null, null] +35620 - null - [null, null, null, null, null] +35621 - null - [null, null, null, null, null] +35622 - null - [null, null, null, null, null] +35623 - null - [null, null, null, null, null] +35624 - null - [null, null, null, null, null] +35625 - null - [null, null, null, null, null] +35626 - null - [null, null, null, null, null] +35627 - null - [null, null, null, null, null] +35628 - null - [null, null, null, null, null] +35629 - null - [null, null, null, null, null] +35630 - Door - [Open, null, null, null, null] +35631 - Door - [Close, null, null, null, null] +35632 - null - [null, null, null, null, null] +35633 - null - [null, null, null, null, null] +35634 - null - [null, null, null, null, null] +35635 - null - [null, null, null, null, null] +35636 - null - [null, null, null, null, null] +35637 - null - [null, null, null, null, null] +35638 - null - [null, null, null, null, null] +35639 - Shelf - [null, null, null, null, null] +35640 - Shelf - [null, null, null, null, null] +35641 - Shelf - [null, null, null, null, null] +35642 - Round table - [null, null, null, null, null] +35643 - null - [null, null, null, null, null] +35644 - null - [null, null, null, null, null] +35645 - Stairs - [Climb-down, null, null, null, null] +35646 - Stairs - [Climb-up, null, null, null, null] +35647 - Bank booth - [Use, Use-quickly, Collect, null, null] +35648 - Bank booth - [null, null, null, null, null] +35649 - Sign - [null, null, null, null, null] +35650 - Cushioned chair - [null, null, null, null, null] +35651 - Cushioned chair - [null, null, null, null, null] +35652 - Cushioned chair - [null, null, null, null, null] +35653 - Cushioned chair - [null, null, null, null, null] +35654 - Cushioned chair - [null, null, null, null, null] +35655 - Cushioned chair - [null, null, null, null, null] +35656 - Cushioned chair - [null, null, null, null, null] +35657 - Padded chair - [null, null, null, null, null] +35658 - Padded chair - [null, null, null, null, null] +35659 - Padded chair - [null, null, null, null, null] +35660 - Padded chair - [null, null, null, null, null] +35661 - Padded chair - [null, null, null, null, null] +35662 - Stone table - [null, null, null, null, null] +35663 - Vast table - [null, null, null, null, null] +35664 - Messy table - [null, null, null, null, null] +35665 - Crescent table - [null, null, null, null, null] +35666 - null - [null, null, null, null, null] +35667 - Large bed - [null, null, null, null, null] +35668 - Small bed - [null, null, null, null, null] +35669 - Stylish stool - [null, null, null, null, null] +35670 - Ornate vase - [null, null, null, null, null] +35671 - Well - [null, null, null, null, null] +35672 - Ladder - [Climb-up, null, null, null, null] +35673 - Ladder - [Climb-down, null, null, null, null] +35674 - null - [null, null, null, null, null] +35675 - null - [null, null, null, null, null] +35676 - null - [null, null, null, null, null] +35677 - null - [null, null, null, null, null] +35678 - null - [null, null, null, null, null] +35679 - null - [null, null, null, null, null] +35680 - null - [null, null, null, null, null] +35681 - null - [null, null, null, null, null] +35682 - null - [null, null, null, null, null] +35683 - null - [null, null, null, null, null] +35684 - null - [null, null, null, null, null] +35685 - null - [null, null, null, null, null] +35686 - null - [null, null, null, null, null] +35687 - null - [null, null, null, null, null] +35688 - null - [null, null, null, null, null] +35689 - null - [null, null, null, null, null] +35690 - null - [null, null, null, null, null] +35691 - null - [null, null, null, null, null] +35692 - null - [null, null, null, null, null] +35693 - null - [null, null, null, null, null] +35694 - null - [null, null, null, null, null] +35695 - null - [null, null, null, null, null] +35696 - null - [null, null, null, null, null] +35697 - null - [null, null, null, null, null] +35698 - null - [null, null, null, null, null] +35699 - null - [null, null, null, null, null] +35700 - null - [null, null, null, null, null] +35701 - null - [null, null, null, null, null] +35702 - null - [null, null, null, null, null] +35703 - null - [null, null, null, null, null] +35704 - null - [null, null, null, null, null] +35705 - null - [null, null, null, null, null] +35706 - null - [null, null, null, null, null] +35707 - null - [null, null, null, null, null] +35708 - null - [null, null, null, null, null] +35709 - null - [null, null, null, null, null] +35710 - null - [null, null, null, null, null] +35711 - null - [null, null, null, null, null] +35712 - null - [null, null, null, null, null] +35713 - null - [null, null, null, null, null] +35714 - null - [null, null, null, null, null] +35715 - null - [null, null, null, null, null] +35716 - null - [null, null, null, null, null] +35717 - null - [null, null, null, null, null] +35718 - null - [null, null, null, null, null] +35719 - null - [null, null, null, null, null] +35720 - null - [null, null, null, null, null] +35721 - null - [null, null, null, null, null] +35722 - null - [null, null, null, null, null] +35723 - null - [null, null, null, null, null] +35724 - null - [null, null, null, null, null] +35725 - null - [null, null, null, null, null] +35726 - null - [null, null, null, null, null] +35727 - null - [null, null, null, null, null] +35728 - null - [null, null, null, null, null] +35729 - null - [null, null, null, null, null] +35730 - null - [null, null, null, null, null] +35731 - null - [null, null, null, null, null] +35732 - null - [null, null, null, null, null] +35733 - null - [null, null, null, null, null] +35734 - null - [null, null, null, null, null] +35735 - null - [null, null, null, null, null] +35736 - null - [null, null, null, null, null] +35737 - null - [null, null, null, null, null] +35738 - null - [null, null, null, null, null] +35739 - null - [null, null, null, null, null] +35740 - null - [null, null, null, null, null] +35741 - null - [null, null, null, null, null] +35742 - null - [null, null, null, null, null] +35743 - null - [null, null, null, null, null] +35744 - null - [null, null, null, null, null] +35745 - null - [null, null, null, null, null] +35746 - null - [null, null, null, null, null] +35747 - null - [null, null, null, null, null] +35748 - null - [null, null, null, null, null] +35749 - null - [null, null, null, null, null] +35750 - null - [null, null, null, null, null] +35751 - Bookcase - [null, null, null, null, null] +35752 - null - [null, null, null, null, null] +35753 - Shield - [null, null, null, null, null] +35754 - Bookcase - [Search, null, null, null, null] +35755 - Bookcase - [Search, null, null, null, null] +35756 - Bookcase - [Search, null, null, null, null] +35757 - Wardrobe - [null, null, null, null, null] +35758 - Cabinet - [null, null, null, null, null] +35759 - Cabinet - [null, null, null, null, null] +35760 - Cabinet - [null, null, null, null, null] +35761 - Cabinet - [null, null, null, null, null] +35762 - Sink - [null, null, null, null, null] +35763 - Bookcase - [Search, null, null, null, null] +35764 - Desk - [null, null, null, null, null] +35765 - Smashed table - [null, null, null, null, null] +35766 - Bed - [null, null, null, null, null] +35767 - Bunk bed - [null, null, null, null, null] +35768 - null - [null, null, null, null, null] +35769 - null - [null, null, null, null, null] +35770 - null - [null, null, null, null, null] +35771 - null - [null, null, null, null, null] +35772 - null - [null, null, null, null, null] +35773 - null - [null, null, null, null, null] +35774 - null - [null, null, null, null, null] +35775 - null - [null, null, null, null, null] +35776 - null - [null, null, null, null, null] +35777 - null - [null, null, null, null, null] +35778 - null - [null, null, null, null, null] +35779 - null - [null, null, null, null, null] +35780 - null - [null, null, null, null, null] +35781 - Staircase - [Climb-up, null, null, null, null] +35782 - Staircase - [Climb-down, null, null, null, null] +35783 - Staircase - [Climb-down, null, null, null, null] +35784 - Crates - [Search, null, null, null, null] +35785 - Crates - [Search, null, null, null, null] +35786 - null - [null, null, null, null, null] +35787 - null - [null, null, null, null, null] +35788 - null - [null, null, null, null, null] +35789 - null - [null, null, null, null, null] +35790 - null - [null, null, null, null, null] +35791 - null - [null, null, null, null, null] +35792 - null - [null, null, null, null, null] +35793 - null - [null, null, null, null, null] +35794 - null - [null, null, null, null, null] +35795 - null - [null, null, null, null, null] +35796 - null - [null, null, null, null, null] +35797 - null - [null, null, null, null, null] +35798 - null - [null, null, null, null, null] +35799 - null - [null, null, null, null, null] +35800 - null - [null, null, null, null, null] +35801 - null - [null, null, null, null, null] +35802 - null - [null, null, null, null, null] +35803 - null - [null, null, null, null, null] +35804 - null - [null, null, null, null, null] +35805 - null - [null, null, null, null, null] +35806 - null - [null, null, null, null, null] +35807 - null - [null, null, null, null, null] +35808 - null - [null, null, null, null, null] +35809 - null - [null, null, null, null, null] +35810 - null - [null, null, null, null, null] +35811 - null - [null, null, null, null, null] +35812 - null - [null, null, null, null, null] +35813 - null - [null, null, null, null, null] +35814 - null - [null, null, null, null, null] +35815 - null - [null, null, null, null, null] +35816 - null - [null, null, null, null, null] +35817 - null - [null, null, null, null, null] +35818 - null - [null, null, null, null, null] +35819 - null - [null, null, null, null, null] +35820 - null - [null, null, null, null, null] +35821 - null - [null, null, null, null, null] +35822 - null - [null, null, null, null, null] +35823 - null - [null, null, null, null, null] +35824 - null - [null, null, null, null, null] +35825 - null - [null, null, null, null, null] +35826 - null - [null, null, null, null, null] +35827 - null - [null, null, null, null, null] +35828 - null - [null, null, null, null, null] +35829 - null - [null, null, null, null, null] +35830 - null - [null, null, null, null, null] +35831 - null - [null, null, null, null, null] +35832 - null - [null, null, null, null, null] +35833 - null - [null, null, null, null, null] +35834 - null - [null, null, null, null, null] +35835 - null - [null, null, null, null, null] +35836 - null - [null, null, null, null, null] +35837 - null - [null, null, null, null, null] +35838 - null - [null, null, null, null, null] +35839 - null - [null, null, null, null, null] +35840 - null - [null, null, null, null, null] +35841 - null - [null, null, null, null, null] +35842 - null - [null, null, null, null, null] +35843 - null - [null, null, null, null, null] +35844 - null - [null, null, null, null, null] +35845 - null - [null, null, null, null, null] +35846 - null - [null, null, null, null, null] +35847 - null - [null, null, null, null, null] +35848 - null - [null, null, null, null, null] +35849 - null - [null, null, null, null, null] +35850 - null - [null, null, null, null, null] +35851 - null - [null, null, null, null, null] +35852 - null - [null, null, null, null, null] +35853 - null - [null, null, null, null, null] +35854 - null - [null, null, null, null, null] +35855 - null - [null, null, null, null, null] +35856 - null - [null, null, null, null, null] +35857 - null - [null, null, null, null, null] +35858 - null - [null, null, null, null, null] +35859 - null - [null, null, null, null, null] +35860 - null - [null, null, null, null, null] +35861 - null - [null, null, null, null, null] +35862 - null - [null, null, null, null, null] +35863 - null - [null, null, null, null, null] +35864 - null - [null, null, null, null, null] +35865 - null - [null, null, null, null, null] +35866 - null - [null, null, null, null, null] +35867 - null - [null, null, null, null, null] +35868 - null - [null, null, null, null, null] +35869 - null - [null, null, null, null, null] +35870 - null - [null, null, null, null, null] +35871 - null - [null, null, null, null, null] +35872 - null - [null, null, null, null, null] +35873 - null - [null, null, null, null, null] +35874 - null - [null, null, null, null, null] +35875 - null - [null, null, null, null, null] +35876 - null - [null, null, null, null, null] +35877 - null - [null, null, null, null, null] +35878 - null - [null, null, null, null, null] +35879 - null - [null, null, null, null, null] +35880 - null - [null, null, null, null, null] +35881 - null - [null, null, null, null, null] +35882 - null - [null, null, null, null, null] +35883 - null - [null, null, null, null, null] +35884 - null - [null, null, null, null, null] +35885 - null - [null, null, null, null, null] +35886 - null - [null, null, null, null, null] +35887 - null - [null, null, null, null, null] +35888 - null - [null, null, null, null, null] +35889 - null - [null, null, null, null, null] +35890 - null - [null, null, null, null, null] +35891 - null - [null, null, null, null, null] +35892 - null - [null, null, null, null, null] +35893 - null - [null, null, null, null, null] +35894 - null - [null, null, null, null, null] +35895 - null - [null, null, null, null, null] +35896 - null - [null, null, null, null, null] +35897 - null - [null, null, null, null, null] +35898 - null - [null, null, null, null, null] +35899 - null - [null, null, null, null, null] +35900 - null - [null, null, null, null, null] +35901 - null - [null, null, null, null, null] +35902 - null - [null, null, null, null, null] +35903 - null - [null, null, null, null, null] +35904 - null - [null, null, null, null, null] +35905 - null - [null, null, null, null, null] +35906 - null - [null, null, null, null, null] +35907 - bannister end - [null, null, null, null, null] +35908 - null - [null, null, null, null, null] +35909 - null - [null, null, null, null, null] +35910 - null - [null, null, null, null, null] +35911 - null - [null, null, null, null, null] +35912 - null - [null, null, null, null, null] +35913 - null - [null, null, null, null, null] +35914 - null - [null, null, null, null, null] +35915 - null - [null, null, null, null, null] +35916 - null - [null, null, null, null, null] +35917 - null - [null, null, null, null, null] +35918 - null - [null, null, null, null, null] +35919 - null - [null, null, null, null, null] +35920 - null - [null, null, null, null, null] +35921 - null - [null, null, null, null, null] +35922 - null - [null, null, null, null, null] +35923 - null - [null, null, null, null, null] +35924 - null - [null, null, null, null, null] +35925 - null - [null, null, null, null, null] +35926 - null - [null, null, null, null, null] +35927 - null - [null, null, null, null, null] +35928 - null - [null, null, null, null, null] +35929 - null - [null, null, null, null, null] +35930 - Mithril door - [null, null, null, null, null] +35931 - Dairy churn - [Churn, null, null, null, null] +35932 - null - [null, null, null, null, null] +35933 - null - [null, null, null, null, null] +35934 - null - [null, null, null, null, null] +35935 - null - [null, null, null, null, null] +35936 - null - [null, null, null, null, null] +35937 - null - [null, null, null, null, null] +35938 - null - [null, null, null, null, null] +35939 - null - [null, null, null, null, null] +35940 - null - [null, null, null, null, null] +35941 - null - [null, null, null, null, null] +35942 - null - [null, null, null, null, null] +35943 - null - [null, null, null, null, null] +35944 - null - [null, null, null, null, null] +35945 - null - [null, null, null, null, null] +35946 - null - [null, null, null, null, null] +35947 - null - [null, null, null, null, null] +35948 - null - [null, null, null, null, null] +35949 - null - [null, null, null, null, null] +35950 - null - [null, null, null, null, null] +35951 - null - [null, null, null, null, null] +35952 - null - [null, null, null, null, null] +35953 - null - [null, null, null, null, null] +35954 - null - [null, null, null, null, null] +35955 - null - [null, null, null, null, null] +35956 - null - [null, null, null, null, null] +35957 - null - [null, null, null, null, null] +35958 - null - [null, null, null, null, null] +35959 - null - [null, null, null, null, null] +35960 - null - [null, null, null, null, null] +35961 - null - [null, null, null, null, null] +35962 - null - [null, null, null, null, null] +35963 - null - [null, null, null, null, null] +35964 - null - [null, null, null, null, null] +35965 - null - [null, null, null, null, null] +35966 - Rope swing - [Swing-on, null, null, null, null] +35967 - Rope swing - [Swing-on, null, null, null, null] +35968 - Rock - [null, null, null, null, null] +35969 - Balancing ledge - [Walk-across, null, null, null, null] +35970 - Tree branch - [Climb, null, null, null, null] +35971 - null - [null, null, null, null, null] +35972 - null - [null, null, null, null, null] +35973 - null - [null, null, null, null, null] +35974 - null - [null, null, null, null, null] +35975 - null - [null, null, null, null, null] +35976 - null - [null, null, null, null, null] +35977 - null - [null, null, null, null, null] +35978 - null - [null, null, null, null, null] +35979 - null - [null, null, null, null, null] +35980 - null - [null, null, null, null, null] +35981 - null - [null, null, null, null, null] +35982 - null - [null, null, null, null, null] +35983 - null - [null, null, null, null, null] +35984 - null - [null, null, null, null, null] +35985 - null - [null, null, null, null, null] +35986 - null - [null, null, null, null, null] +35987 - null - [null, null, null, null, null] +35988 - null - [null, null, null, null, null] +35989 - long walkway - [null, null, null, null, null] +35990 - null - [null, null, null, null, null] +35991 - Door - [Open, null, null, null, null] +35992 - Door - [null, null, null, null, null] +35993 - null - [null, null, null, null, null] +35994 - null - [null, null, null, null, null] +35995 - null - [null, null, null, null, null] +35996 - Stepping stone - [Jump-to, null, null, null, null] +35997 - Log balance - [Walk-across, null, null, null, null] +35998 - Log balance - [Walk-across, null, null, null, null] +35999 - Log balance - [Walk-across, null, null, null, null] +36000 - Cave entrance - [Enter, null, null, null, null] +36001 - Hanging log - [null, null, null, null, null] +36002 - Smokey well - [Climb-down, null, null, null, null] +36003 - Rift - [null, null, null, null, null] +36004 - null - [null, null, null, null, null] +36005 - null - [null, null, null, null, null] +36006 - null - [null, null, null, null, null] +36007 - null - [null, null, null, null, null] +36008 - null - [null, null, null, null, null] +36009 - null - [null, null, null, null, null] +36010 - null - [null, null, null, null, null] +36011 - null - [null, null, null, null, null] +36012 - null - [null, null, null, null, null] +36013 - null - [null, null, null, null, null] +36014 - null - [null, null, null, null, null] +36015 - null - [null, null, null, null, null] +36016 - null - [null, null, null, null, null] +36017 - null - [null, null, null, null, null] +36018 - null - [null, null, null, null, null] +36019 - null - [null, null, null, null, null] +36020 - null - [null, null, null, null, null] +36021 - Door - [Close, null, null, null, null] +36022 - Door - [Open, null, null, null, null] +36023 - null - [null, null, null, null, null] +36024 - null - [null, null, null, null, null] +36025 - null - [null, null, null, null, null] +36026 - null - [null, null, null, null, null] +36027 - null - [null, null, null, null, null] +36028 - null - [null, null, null, null, null] +36029 - null - [null, null, null, null, null] +36030 - null - [null, null, null, null, null] +36031 - null - [null, null, null, null, null] +36032 - null - [null, null, null, null, null] +36033 - null - [null, null, null, null, null] +36034 - null - [null, null, null, null, null] +36035 - null - [null, null, null, null, null] +36036 - null - [null, null, null, null, null] +36037 - null - [null, null, null, null, null] +36038 - null - [null, null, null, null, null] +36039 - null - [null, null, null, null, null] +36040 - null - [null, null, null, null, null] +36041 - null - [null, null, null, null, null] +36042 - null - [null, null, null, null, null] +36043 - null - [null, null, null, null, null] +36044 - null - [null, null, null, null, null] +36045 - null - [null, null, null, null, null] +36046 - null - [null, null, null, null, null] +36047 - null - [null, null, null, null, null] +36048 - null - [null, null, null, null, null] +36049 - null - [null, null, null, null, null] +36050 - null - [null, null, null, null, null] +36051 - null - [null, null, null, null, null] +36052 - null - [null, null, null, null, null] +36053 - null - [null, null, null, null, null] +36054 - null - [null, null, null, null, null] +36055 - null - [null, null, null, null, null] +36056 - null - [null, null, null, null, null] +36057 - null - [null, null, null, null, null] +36058 - null - [null, null, null, null, null] +36059 - null - [null, null, null, null, null] +36060 - null - [null, null, null, null, null] +36061 - null - [null, null, null, null, null] +36062 - null - [null, null, null, null, null] +36063 - null - [null, null, null, null, null] +36064 - null - [null, null, null, null, null] +36065 - null - [null, null, null, null, null] +36066 - null - [null, null, null, null, null] +36067 - null - [null, null, null, null, null] +36068 - null - [null, null, null, null, null] +36069 - null - [null, null, null, null, null] +36070 - null - [null, null, null, null, null] +36071 - null - [null, null, null, null, null] +36072 - null - [null, null, null, null, null] +36073 - null - [null, null, null, null, null] +36074 - null - [null, null, null, null, null] +36075 - null - [null, null, null, null, null] +36076 - null - [null, null, null, null, null] +36077 - null - [null, null, null, null, null] +36078 - null - [null, null, null, null, null] +36079 - null - [null, null, null, null, null] +36080 - null - [null, null, null, null, null] +36081 - null - [null, null, null, null, null] +36082 - null - [null, null, null, null, null] +36083 - null - [null, null, null, null, null] +36084 - null - [null, null, null, null, null] +36085 - null - [null, null, null, null, null] +36086 - null - [null, null, null, null, null] +36087 - null - [null, null, null, null, null] +36088 - null - [null, null, null, null, null] +36089 - null - [null, null, null, null, null] +36090 - null - [null, null, null, null, null] +36091 - null - [null, null, null, null, null] +36092 - null - [null, null, null, null, null] +36093 - null - [null, null, null, null, null] +36094 - null - [null, null, null, null, null] +36095 - null - [null, null, null, null, null] +36096 - null - [null, null, null, null, null] +36097 - null - [null, null, null, null, null] +36098 - null - [null, null, null, null, null] +36099 - null - [null, null, null, null, null] +36100 - null - [null, null, null, null, null] +36101 - null - [null, null, null, null, null] +36102 - null - [null, null, null, null, null] +36103 - null - [null, null, null, null, null] +36104 - null - [null, null, null, null, null] +36105 - null - [null, null, null, null, null] +36106 - null - [null, null, null, null, null] +36107 - null - [null, null, null, null, null] +36108 - null - [null, null, null, null, null] +36109 - null - [null, null, null, null, null] +36110 - null - [null, null, null, null, null] +36111 - null - [null, null, null, null, null] +36112 - null - [null, null, null, null, null] +36113 - null - [null, null, null, null, null] +36114 - null - [null, null, null, null, null] +36115 - null - [null, null, null, null, null] +36116 - null - [null, null, null, null, null] +36117 - null - [null, null, null, null, null] +36118 - null - [null, null, null, null, null] +36119 - null - [null, null, null, null, null] +36120 - null - [null, null, null, null, null] +36121 - null - [null, null, null, null, null] +36122 - null - [null, null, null, null, null] +36123 - null - [null, null, null, null, null] +36124 - null - [null, null, null, null, null] +36125 - null - [null, null, null, null, null] +36126 - null - [null, null, null, null, null] +36127 - null - [null, null, null, null, null] +36128 - null - [null, null, null, null, null] +36129 - null - [null, null, null, null, null] +36130 - null - [null, null, null, null, null] +36131 - null - [null, null, null, null, null] +36132 - null - [null, null, null, null, null] +36133 - null - [null, null, null, null, null] +36134 - null - [null, null, null, null, null] +36135 - null - [null, null, null, null, null] +36136 - null - [null, null, null, null, null] +36137 - null - [null, null, null, null, null] +36138 - null - [null, null, null, null, null] +36139 - null - [null, null, null, null, null] +36140 - null - [null, null, null, null, null] +36141 - null - [null, null, null, null, null] +36142 - null - [null, null, null, null, null] +36143 - null - [null, null, null, null, null] +36144 - null - [null, null, null, null, null] +36145 - null - [null, null, null, null, null] +36146 - null - [null, null, null, null, null] +36147 - null - [null, null, null, null, null] +36148 - null - [null, null, null, null, null] +36149 - null - [null, null, null, null, null] +36150 - null - [null, null, null, null, null] +36151 - null - [null, null, null, null, null] +36152 - null - [null, null, null, null, null] +36153 - null - [null, null, null, null, null] +36154 - null - [null, null, null, null, null] +36155 - null - [null, null, null, null, null] +36156 - null - [null, null, null, null, null] +36157 - null - [null, null, null, null, null] +36158 - null - [null, null, null, null, null] +36159 - null - [null, null, null, null, null] +36160 - null - [null, null, null, null, null] +36161 - null - [null, null, null, null, null] +36162 - null - [null, null, null, null, null] +36163 - null - [null, null, null, null, null] +36164 - null - [null, null, null, null, null] +36165 - null - [null, null, null, null, null] +36166 - null - [null, null, null, null, null] +36167 - null - [null, null, null, null, null] +36168 - null - [null, null, null, null, null] +36169 - null - [null, null, null, null, null] +36170 - null - [null, null, null, null, null] +36171 - null - [null, null, null, null, null] +36172 - null - [null, null, null, null, null] +36173 - null - [null, null, null, null, null] +36174 - null - [null, null, null, null, null] +36175 - null - [null, null, null, null, null] +36176 - null - [null, null, null, null, null] +36177 - null - [null, null, null, null, null] +36178 - null - [null, null, null, null, null] +36179 - null - [null, null, null, null, null] +36180 - null - [null, null, null, null, null] +36181 - null - [null, null, null, null, null] +36182 - null - [null, null, null, null, null] +36183 - null - [null, null, null, null, null] +36184 - null - [null, null, null, null, null] +36185 - null - [null, null, null, null, null] +36186 - null - [null, null, null, null, null] +36187 - null - [null, null, null, null, null] +36188 - null - [null, null, null, null, null] +36189 - null - [null, null, null, null, null] +36190 - null - [null, null, null, null, null] +36191 - null - [null, null, null, null, null] +36192 - null - [null, null, null, null, null] +36193 - null - [null, null, null, null, null] +36194 - null - [null, null, null, null, null] +36195 - null - [null, null, null, null, null] +36196 - null - [null, null, null, null, null] +36197 - null - [null, null, null, null, null] +36198 - null - [null, null, null, null, null] +36199 - null - [null, null, null, null, null] +36200 - null - [null, null, null, null, null] +36201 - null - [null, null, null, null, null] +36202 - null - [null, null, null, null, null] +36203 - null - [null, null, null, null, null] +36204 - null - [null, null, null, null, null] +36205 - null - [null, null, null, null, null] +36206 - null - [null, null, null, null, null] +36207 - null - [null, null, null, null, null] +36208 - null - [null, null, null, null, null] +36209 - null - [null, null, null, null, null] +36210 - null - [null, null, null, null, null] +36211 - null - [null, null, null, null, null] +36212 - null - [null, null, null, null, null] +36213 - null - [null, null, null, null, null] +36214 - null - [null, null, null, null, null] +36215 - null - [null, null, null, null, null] +36216 - null - [null, null, null, null, null] +36217 - null - [null, null, null, null, null] +36218 - null - [null, null, null, null, null] +36219 - null - [null, null, null, null, null] +36220 - null - [null, null, null, null, null] +36221 - null - [null, null, null, null, null] +36222 - null - [null, null, null, null, null] +36223 - null - [null, null, null, null, null] +36224 - null - [null, null, null, null, null] +36225 - null - [null, null, null, null, null] +36226 - null - [null, null, null, null, null] +36227 - null - [null, null, null, null, null] +36228 - null - [null, null, null, null, null] +36229 - null - [null, null, null, null, null] +36230 - Flag Banner - [null, null, null, null, null] +36231 - Flag Banner - [null, null, null, null, null] +36232 - Flag Banner - [null, null, null, null, null] +36233 - Flag Banner - [null, null, null, null, null] +36234 - Flag Banner - [null, null, null, null, null] +36235 - Flag Banner - [null, null, null, null, null] +36236 - Flag Banner - [null, null, null, null, null] +36237 - Flag Banner - [null, null, null, null, null] +36238 - Flag Banner - [null, null, null, null, null] +36239 - Flag Banner - [null, null, null, null, null] +36240 - null - [null, null, null, null, null] +36241 - null - [null, null, null, null, null] +36242 - null - [null, null, null, null, null] +36243 - null - [null, null, null, null, null] +36244 - null - [null, null, null, null, null] +36245 - null - [null, null, null, null, null] +36246 - null - [null, null, null, null, null] +36247 - null - [null, null, null, null, null] +36248 - null - [null, null, null, null, null] +36249 - null - [null, null, null, null, null] +36250 - null - [null, null, null, null, null] +36251 - null - [null, null, null, null, null] +36252 - null - [null, null, null, null, null] +36253 - null - [null, null, null, null, null] +36254 - null - [null, null, null, null, null] +36255 - Table - [null, null, null, null, null] +36256 - Bed - [null, null, null, null, null] +36257 - Bed - [null, null, null, null, null] +36258 - null - [null, null, null, null, null] +36259 - null - [null, null, null, null, null] +36260 - null - [null, null, null, null, null] +36261 - null - [null, null, null, null, null] +36262 - Bank booth - [null, null, null, null, null] +36263 - Gold bars - [null, null, null, null, null] +36264 - null - [null, null, null, null, null] +36265 - null - [null, null, null, null, null] +36266 - null - [null, null, null, null, null] +36267 - null - [null, null, null, null, null] +36268 - null - [null, null, null, null, null] +36269 - null - [null, null, null, null, null] +36270 - null - [null, null, null, null, null] +36271 - null - [null, null, null, null, null] +36272 - null - [null, null, null, null, null] +36273 - Suit of armour - [null, null, null, null, null] +36274 - null - [null, null, null, null, null] +36275 - null - [null, null, null, null, null] +36276 - null - [null, null, null, null, null] +36277 - null - [null, null, null, null, null] +36278 - null - [null, null, null, null, null] +36279 - null - [null, null, null, null, null] +36280 - null - [null, null, null, null, null] +36281 - null - [null, null, null, null, null] +36282 - null - [null, null, null, null, null] +36283 - null - [null, null, null, null, null] +36284 - null - [null, null, null, null, null] +36285 - null - [null, null, null, null, null] +36286 - null - [null, null, null, null, null] +36287 - Suit of armour - [null, null, null, null, null] +36288 - null - [null, null, null, null, null] +36289 - null - [null, null, null, null, null] +36290 - null - [null, null, null, null, null] +36291 - null - [null, null, null, null, null] +36292 - null - [null, null, null, null, null] +36293 - null - [null, null, null, null, null] +36294 - null - [null, null, null, null, null] +36295 - null - [null, null, null, null, null] +36296 - null - [null, null, null, null, null] +36297 - null - [null, null, null, null, null] +36298 - null - [null, null, null, null, null] +36299 - null - [null, null, null, null, null] +36300 - null - [null, null, null, null, null] +36301 - null - [null, null, null, null, null] +36302 - null - [null, null, null, null, null] +36303 - null - [null, null, null, null, null] +36304 - null - [null, null, null, null, null] +36305 - null - [null, null, null, null, null] +36306 - Ladder - [Climb-down, null, null, null, null] +36307 - Rope Ladder - [null, null, null, null, null] +36308 - Wall - [null, null, null, null, null] +36309 - null - [null, null, null, null, null] +36310 - null - [null, null, null, null, null] +36311 - null - [null, null, null, null, null] +36312 - Climbing Rope - [Climb, null, null, null, null] +36313 - Battlements - [null, null, null, null, null] +36314 - Battlements - [null, null, null, null, null] +36315 - Door - [Open, null, null, null, null] +36316 - Door - [Close, null, null, null, null] +36317 - Door - [Open, null, null, null, null] +36318 - Door - [Close, null, null, null, null] +36319 - Door - [Close, null, null, null, null] +36320 - Door - [Open, null, null, null, null] +36321 - null - [null, null, null, null, null] +36322 - Boxes - [null, null, null, null, null] +36323 - Crate - [null, null, null, null, null] +36324 - Crate - [null, null, null, null, null] +36325 - Barrel of swords - [null, null, null, null, null] +36326 - Barrel - [null, null, null, null, null] +36327 - Barrel - [null, null, null, null, null] +36328 - null - [null, null, null, null, null] +36329 - null - [null, null, null, null, null] +36330 - null - [null, null, null, null, null] +36331 - null - [null, null, null, null, null] +36332 - null - [null, null, null, null, null] +36333 - null - [null, null, null, null, null] +36334 - null - [null, null, null, null, null] +36335 - Shelves - [null, null, null, null, null] +36336 - Shelves - [null, null, null, null, null] +36337 - Shelves - [null, null, null, null, null] +36338 - Shelves - [null, null, null, null, null] +36339 - Door - [Open, null, null, null, null] +36340 - Door - [Close, null, null, null, null] +36341 - Door - [Open, null, null, null, null] +36342 - Door - [Close, null, null, null, null] +36343 - Door - [Close, null, null, null, null] +36344 - Door - [Open, null, null, null, null] +36345 - null - [null, null, null, null, null] +36346 - null - [null, null, null, null, null] +36347 - Ladder - [Climb-up, null, null, null, null] +36348 - Ladder - [Climb, Climb-up, Climb-down, null, null] +36349 - Ladder - [Climb-down, null, null, null, null] +36350 - Table - [null, null, null, null, null] +36351 - Crate - [null, null, null, null, null] +36352 - Crate - [null, null, null, null, null] +36353 - Barrel - [null, null, null, null, null] +36354 - Boxes - [null, null, null, null, null] +36355 - Door - [Open, null, null, null, null] +36356 - Door - [Close, null, null, null, null] +36357 - Door - [Open, null, null, null, null] +36358 - Door - [Close, null, null, null, null] +36359 - Door - [Close, null, null, null, null] +36360 - Door - [Open, null, null, null, null] +36361 - null - [null, null, null, null, null] +36362 - null - [null, null, null, null, null] +36363 - Ladder - [Climb-up, null, null, null, null] +36364 - Ladder - [Climb, Climb-up, Climb-down, null, null] +36365 - Ladder - [Climb-down, null, null, null, null] +36366 - Table - [null, null, null, null, null] +36367 - Barrel - [null, null, null, null, null] +36368 - Boxes - [null, null, null, null, null] +36369 - Crate - [null, null, null, null, null] +36370 - Crate - [null, null, null, null, null] +36371 - null - [null, null, null, null, null] +36372 - null - [null, null, null, null, null] +36373 - null - [null, null, null, null, null] +36374 - null - [null, null, null, null, null] +36375 - null - [null, null, null, null, null] +36376 - null - [null, null, null, null, null] +36377 - null - [null, null, null, null, null] +36378 - null - [null, null, null, null, null] +36379 - null - [null, null, null, null, null] +36380 - null - [null, null, null, null, null] +36381 - null - [null, null, null, null, null] +36382 - null - [null, null, null, null, null] +36383 - null - [null, null, null, null, null] +36384 - null - [null, null, null, null, null] +36385 - null - [null, null, null, null, null] +36386 - null - [null, null, null, null, null] +36387 - null - [null, null, null, null, null] +36388 - null - [null, null, null, null, null] +36389 - null - [null, null, null, null, null] +36390 - null - [null, null, null, null, null] +36391 - null - [null, null, null, null, null] +36392 - null - [null, null, null, null, null] +36393 - null - [null, null, null, null, null] +36394 - null - [null, null, null, null, null] +36395 - null - [null, null, null, null, null] +36396 - null - [null, null, null, null, null] +36397 - null - [null, null, null, null, null] +36398 - null - [null, null, null, null, null] +36399 - null - [null, null, null, null, null] +36400 - null - [null, null, null, null, null] +36401 - null - [null, null, null, null, null] +36402 - null - [null, null, null, null, null] +36403 - null - [null, null, null, null, null] +36404 - null - [null, null, null, null, null] +36405 - null - [null, null, null, null, null] +36406 - null - [null, null, null, null, null] +36407 - null - [null, null, null, null, null] +36408 - null - [null, null, null, null, null] +36409 - null - [null, null, null, null, null] +36410 - null - [null, null, null, null, null] +36411 - null - [null, null, null, null, null] +36412 - null - [null, null, null, null, null] +36413 - null - [null, null, null, null, null] +36414 - null - [null, null, null, null, null] +36415 - null - [null, null, null, null, null] +36416 - null - [null, null, null, null, null] +36417 - null - [null, null, null, null, null] +36418 - null - [null, null, null, null, null] +36419 - null - [null, null, null, null, null] +36420 - null - [null, null, null, null, null] +36421 - null - [null, null, null, null, null] +36422 - null - [null, null, null, null, null] +36423 - null - [null, null, null, null, null] +36424 - null - [null, null, null, null, null] +36425 - null - [null, null, null, null, null] +36426 - null - [null, null, null, null, null] +36427 - null - [null, null, null, null, null] +36428 - null - [null, null, null, null, null] +36429 - null - [null, null, null, null, null] +36430 - null - [null, null, null, null, null] +36431 - null - [null, null, null, null, null] +36432 - null - [null, null, null, null, null] +36433 - null - [null, null, null, null, null] +36434 - null - [null, null, null, null, null] +36435 - null - [null, null, null, null, null] +36436 - null - [null, null, null, null, null] +36437 - null - [null, null, null, null, null] +36438 - null - [null, null, null, null, null] +36439 - null - [null, null, null, null, null] +36440 - null - [null, null, null, null, null] +36441 - Steps - [null, null, null, null, null] +36442 - null - [null, null, null, null, null] +36443 - Steps - [null, null, null, null, null] +36444 - null - [null, null, null, null, null] +36445 - Steps - [null, null, null, null, null] +36446 - null - [null, null, null, null, null] +36447 - null - [null, null, null, null, null] +36448 - null - [null, null, null, null, null] +36449 - null - [null, null, null, null, null] +36450 - null - [null, null, null, null, null] +36451 - Stairs - [Climb, null, null, null, null] +36452 - null - [null, null, null, null, null] +36453 - null - [null, null, null, null, null] +36454 - null - [null, null, null, null, null] +36455 - null - [null, null, null, null, null] +36456 - null - [null, null, null, null, null] +36457 - null - [null, null, null, null, null] +36458 - null - [null, null, null, null, null] +36459 - null - [null, null, null, null, null] +36460 - null - [null, null, null, null, null] +36461 - null - [null, null, null, null, null] +36462 - null - [null, null, null, null, null] +36463 - null - [null, null, null, null, null] +36464 - null - [null, null, null, null, null] +36465 - null - [null, null, null, null, null] +36466 - null - [null, null, null, null, null] +36467 - null - [null, null, null, null, null] +36468 - Steps - [null, null, null, null, null] +36469 - Steps - [null, null, null, null, null] +36470 - null - [null, null, null, null, null] +36471 - null - [null, null, null, null, null] +36472 - Steps - [null, null, null, null, null] +36473 - null - [null, null, null, null, null] +36474 - Steps - [null, null, null, null, null] +36475 - Stairs - [Climb, null, null, null, null] +36476 - null - [Climb, null, null, null, null] +36477 - null - [null, null, null, null, null] +36478 - Stairs - [Climb, null, null, null, null] +36479 - null - [Climb, null, null, null, null] +36480 - Steps - [Climb-up, null, null, null, null] +36481 - Steps - [Climb-up, null, null, null, null] +36482 - null - [null, null, null, null, null] +36483 - null - [null, null, null, null, null] +36484 - Steps - [Climb-up, null, null, null, null] +36485 - null - [null, null, null, null, null] +36486 - null - [null, null, null, null, null] +36487 - null - [null, null, null, null, null] +36488 - null - [null, null, null, null, null] +36489 - null - [null, null, null, null, null] +36490 - null - [null, null, null, null, null] +36491 - null - [null, null, null, null, null] +36492 - null - [null, null, null, null, null] +36493 - null - [null, null, null, null, null] +36494 - null - [null, null, null, null, null] +36495 - Steps - [Climb-up, null, null, null, null] +36496 - null - [null, null, null, null, null] +36497 - null - [null, null, null, null, null] +36498 - null - [null, null, null, null, null] +36499 - null - [null, null, null, null, null] +36500 - null - [Climb, null, null, null, null] +36501 - Stairs - [Climb, null, null, null, null] +36502 - null - [null, null, null, null, null] +36503 - null - [null, null, null, null, null] +36504 - null - [null, null, null, null, null] +36505 - null - [null, null, null, null, null] +36506 - null - [null, null, null, null, null] +36507 - null - [null, null, null, null, null] +36508 - null - [null, null, null, null, null] +36509 - null - [null, null, null, null, null] +36510 - null - [null, null, null, null, null] +36511 - null - [null, null, null, null, null] +36512 - null - [null, null, null, null, null] +36513 - Steps - [null, null, null, null, null] +36514 - Steps - [null, null, null, null, null] +36515 - null - [null, null, null, null, null] +36516 - null - [null, null, null, null, null] +36517 - Steps - [null, null, null, null, null] +36518 - null - [null, null, null, null, null] +36519 - Steps - [null, null, null, null, null] +36520 - null - [null, null, null, null, null] +36521 - Steps - [Climb-up, null, null, null, null] +36522 - null - [null, null, null, null, null] +36523 - Steps - [Climb-up, null, null, null, null] +36524 - null - [null, null, null, null, null] +36525 - null - [null, null, null, null, null] +36526 - null - [null, null, null, null, null] +36527 - null - [null, null, null, null, null] +36528 - null - [null, null, null, null, null] +36529 - null - [null, null, null, null, null] +36530 - null - [null, null, null, null, null] +36531 - null - [null, null, null, null, null] +36532 - Steps - [Climb-up, null, null, null, null] +36533 - null - [null, null, null, null, null] +36534 - null - [null, null, null, null, null] +36535 - null - [null, null, null, null, null] +36536 - null - [null, null, null, null, null] +36537 - null - [null, null, null, null, null] +36538 - null - [null, null, null, null, null] +36539 - null - [null, null, null, null, null] +36540 - Steps - [Climb-up, null, null, null, null] +36541 - null - [null, null, null, null, null] +36542 - null - [null, null, null, null, null] +36543 - null - [null, null, null, null, null] +36544 - null - [null, null, null, null, null] +36545 - null - [null, null, null, null, null] +36546 - null - [null, null, null, null, null] +36547 - null - [null, null, null, null, null] +36548 - null - [null, null, null, null, null] +36549 - null - [null, null, null, null, null] +36550 - null - [null, null, null, null, null] +36551 - null - [null, null, null, null, null] +36552 - null - [null, null, null, null, null] +36553 - null - [null, null, null, null, null] +36554 - null - [null, null, null, null, null] +36555 - null - [null, null, null, null, null] +36556 - null - [null, null, null, null, null] +36557 - null - [null, null, null, null, null] +36558 - null - [null, null, null, null, null] +36559 - null - [null, null, null, null, null] +36560 - null - [null, null, null, null, null] +36561 - null - [null, null, null, null, null] +36562 - null - [null, null, null, null, null] +36563 - null - [null, null, null, null, null] +36564 - null - [null, null, null, null, null] +36565 - null - [null, null, null, null, null] +36566 - null - [null, null, null, null, null] +36567 - null - [null, null, null, null, null] +36568 - null - [null, null, null, null, null] +36569 - null - [null, null, null, null, null] +36570 - null - [null, null, null, null, null] +36571 - null - [null, null, null, null, null] +36572 - null - [null, null, null, null, null] +36573 - Table - [Take-from, null, null, null, null] +36574 - Table - [Take-from, null, null, null, null] +36575 - Table - [Take-from, null, null, null, null] +36576 - Table - [Take-from, null, null, null, null] +36577 - Table - [Take-from, null, null, null, null] +36578 - Table - [Take-from, null, null, null, null] +36579 - Table - [Take-from, null, null, null, null] +36580 - Table - [Take-from, null, null, null, null] +36581 - Table - [Take-from, null, null, null, null] +36582 - Table - [Take-from, null, null, null, null] +36583 - Table - [Take-from, null, null, null, null] +36584 - Table - [Take-from, null, null, null, null] +36585 - Table - [Take-from, null, null, null, null] +36586 - Table - [Take-from, null, null, null, null] +36587 - null - [null, null, null, null, null] +36588 - null - [null, null, null, null, null] +36589 - null - [null, null, null, null, null] +36590 - null - [null, null, null, null, null] +36591 - null - [null, null, null, null, null] +36592 - null - [null, null, null, null, null] +36593 - null - [null, null, null, null, null] +36594 - null - [null, null, null, null, null] +36595 - null - [null, null, null, null, null] +36596 - null - [null, null, null, null, null] +36597 - null - [null, null, null, null, null] +36598 - null - [null, null, null, null, null] +36599 - null - [null, null, null, null, null] +36600 - null - [null, null, null, null, null] +36601 - null - [null, null, null, null, null] +36602 - null - [null, null, null, null, null] +36603 - null - [null, null, null, null, null] +36604 - null - [null, null, null, null, null] +36605 - null - [null, null, null, null, null] +36606 - null - [null, null, null, null, null] +36607 - null - [null, null, null, null, null] +36608 - null - [null, null, null, null, null] +36609 - null - [null, null, null, null, null] +36610 - null - [null, null, null, null, null] +36611 - null - [null, null, null, null, null] +36612 - null - [null, null, null, null, null] +36613 - null - [null, null, null, null, null] +36614 - null - [null, null, null, null, null] +36615 - null - [null, null, null, null, null] +36616 - null - [null, null, null, null, null] +36617 - null - [null, null, null, null, null] +36618 - null - [null, null, null, null, null] +36619 - null - [null, null, null, null, null] +36620 - null - [null, null, null, null, null] +36621 - null - [null, null, null, null, null] +36622 - null - [null, null, null, null, null] +36623 - null - [null, null, null, null, null] +36624 - null - [null, null, null, null, null] +36625 - Trapdoor - [Go-down, null, null, null, null] +36626 - Rock - [null, null, null, null, null] +36627 - Rock - [null, null, null, null, null] +36628 - Rocks - [null, null, null, null, null] +36629 - null - [null, null, null, null, null] +36630 - null - [null, null, null, null, null] +36631 - null - [null, null, null, null, null] +36632 - null - [null, null, null, null, null] +36633 - null - [null, null, null, null, null] +36634 - null - [null, null, null, null, null] +36635 - null - [null, null, null, null, null] +36636 - null - [null, null, null, null, null] +36637 - null - [null, null, null, null, null] +36638 - null - [null, null, null, null, null] +36639 - null - [null, null, null, null, null] +36640 - null - [null, null, null, null, null] +36641 - null - [null, null, null, null, null] +36642 - null - [null, null, null, null, null] +36643 - null - [null, null, null, null, null] +36644 - Ladder - [Climb-up, null, null, null, null] +36645 - Ladder - [Climb-up, null, null, null, null] +36646 - Ladder - [Climb-up, null, null, null, null] +36647 - null - [null, null, null, null, null] +36648 - null - [null, null, null, null, null] +36649 - null - [null, null, null, null, null] +36650 - null - [null, null, null, null, null] +36651 - null - [null, null, null, null, null] +36652 - null - [null, null, null, null, null] +36653 - null - [null, null, null, null, null] +36654 - null - [null, null, null, null, null] +36655 - null - [null, null, null, null, null] +36656 - null - [null, null, null, null, null] +36657 - null - [null, null, null, null, null] +36658 - null - [null, null, null, null, null] +36659 - null - [null, null, null, null, null] +36660 - null - [null, null, null, null, null] +36661 - null - [null, null, null, null, null] +36662 - null - [null, null, null, null, null] +36663 - null - [null, null, null, null, null] +36664 - null - [null, null, null, null, null] +36665 - null - [null, null, null, null, null] +36666 - null - [null, null, null, null, null] +36667 - null - [null, null, null, null, null] +36668 - null - [null, null, null, null, null] +36669 - null - [null, null, null, null, null] +36670 - null - [null, null, null, null, null] +36671 - null - [null, null, null, null, null] +36672 - null - [null, null, null, null, null] +36673 - null - [null, null, null, null, null] +36674 - null - [null, null, null, null, null] +36675 - null - [null, null, null, null, null] +36676 - null - [null, null, null, null, null] +36677 - null - [null, null, null, null, null] +36678 - null - [null, null, null, null, null] +36679 - null - [null, null, null, null, null] +36680 - null - [null, null, null, null, null] +36681 - null - [null, null, null, null, null] +36682 - null - [null, null, null, null, null] +36683 - null - [null, null, null, null, null] +36684 - null - [null, null, null, null, null] +36685 - null - [null, null, null, null, null] +36686 - null - [null, null, null, null, null] +36687 - Trapdoor - [Climb-down, null, null, null, null] +36688 - Hollow log - [Inspect, null, null, null, null] +36689 - Hollow log - [Inspect, null, null, null, null] +36690 - Hollow log - [Inspect, null, null, null, null] +36691 - Trapdoor - [Climb-down, null, null, null, null] +36692 - Ladder - [null, null, null, null, null] +36693 - Ladder - [Climb-down, null, null, null, null] +36694 - Ladder - [Climb-down, null, null, null, null] +36695 - Fountain of Heroes - [null, null, null, null, null] +36696 - Ruined Pillar - [null, null, null, null, null] +36697 - Ruined Pillar - [null, null, null, null, null] +36698 - Pillar - [null, null, null, null, null] +36699 - Ruined Pillar - [null, null, null, null, null] +36700 - Ruined Pillar - [null, null, null, null, null] +36701 - Ruined Pillar - [null, null, null, null, null] +36702 - Ruined Pillar - [null, null, null, null, null] +36703 - Ladder - [Climb-down, null, null, null, null] +36704 - null - [null, null, null, null, null] +36705 - Hedge - [null, null, null, null, null] +36706 - Hedge - [null, null, null, null, null] +36707 - Young vine - [Climb, null, null, null, null] +36708 - Young vine - [Climb, null, null, null, null] +36709 - Growing vine - [Climb, null, null, null, null] +36710 - Tall vine - [Climb, null, null, null, null] +36711 - Tropical tree - [null, null, null, null, null] +36712 - Floor spikes - [null, null, null, null, null] +36713 - Opening - [Inspect, null, null, null, null] +36714 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +36715 - Ogre Coffin - [Open, Pick-lock, null, hidden, null] +36716 - null - [null, null, null, null, null] +36717 - null - [null, null, null, null, null] +36718 - null - [null, null, null, null, null] +36719 - null - [null, null, null, null, null] +36720 - null - [null, null, null, null, null] +36721 - null - [null, null, null, null, null] +36722 - null - [null, null, null, null, null] +36723 - null - [null, null, null, null, null] +36724 - null - [null, null, null, null, null] +36725 - null - [null, null, null, null, null] +36726 - Chair - [null, null, null, null, null] +36727 - Table - [null, null, null, null, null] +36728 - Table - [null, null, null, null, null] +36729 - Wardrobe - [null, null, null, null, null] +36730 - Table - [null, null, null, null, null] +36731 - Table - [null, null, null, null, null] +36732 - Wooden defence - [null, null, null, null, null] +36733 - null - [null, null, null, null, null] +36734 - null - [null, null, null, null, null] +36735 - null - [null, null, null, null, null] +36736 - Coffin - [Close, null, null, null, null] +36737 - Coffin - [Close, null, null, null, null] +36738 - Coffin - [Close, null, null, null, null] +36739 - Coffin - [Close, null, null, null, null] +36740 - null - [null, null, null, null, null] +36741 - null - [null, null, null, null, null] +36742 - null - [null, null, null, null, null] +36743 - null - [null, null, null, null, null] +36744 - Pillar - [null, null, null, null, null] +36745 - Rope swing - [Swing-on, null, null, null, null] +36746 - Rope swing - [Swing-on, null, null, null, null] +36747 - Cave wall - [null, null, null, null, null] +36748 - Cart Camel - [Talk-to, null, null, null, null] +36749 - Statue - [null, null, null, null, null] +36750 - Statue - [null, null, null, null, null] +36751 - Statue - [null, null, null, null, null] +36752 - Statue - [null, null, null, null, null] +36753 - Statue - [null, null, null, null, null] +36754 - Plinth - [null, null, null, null, null] +36755 - null - [null, null, null, null, null] +36756 - null - [null, null, null, null, null] +36757 - null - [null, null, null, null, null] +36758 - null - [null, null, null, null, null] +36759 - null - [null, null, null, null, null] +36760 - null - [null, null, null, null, null] +36761 - null - [null, null, null, null, null] +36762 - null - [null, null, null, null, null] +36763 - null - [null, null, null, null, null] +36764 - null - [null, null, null, null, null] +36765 - Swamp Boaty - [Board, null, null, null, null] +36766 - null - [null, null, null, null, null] +36767 - null - [null, null, null, null, null] +36768 - Ladder - [Climb-up, null, null, null, null] +36769 - Ladder - [Climb, Climb-up, Climb-down, null, null] +36770 - Ladder - [Climb-down, null, null, null, null] +36771 - Ladder - [Climb-up, null, null, null, null] +36772 - Ladder - [Climb-down, null, null, null, null] +36773 - Staircase - [Climb-up, null, null, null, null] +36774 - Staircase - [Climb, Climb-up, Climb-down, null, null] +36775 - Staircase - [Climb-down, null, null, null, null] +36776 - Staircase - [Climb-up, null, null, null, null] +36777 - Staircase - [Climb, Climb-up, Climb-down, null, null] +36778 - Staircase - [Climb-down, null, null, null, null] +36779 - Suit of armour - [null, null, null, null, null] +36780 - Cannon - [null, null, null, null, null] +36781 - Fountain - [null, null, null, null, null] +36782 - Bush - [null, null, null, null, null] +36783 - Chair - [null, null, null, null, null] +36784 - Hanging meat - [null, null, null, null, null] +36785 - Hanging meat - [null, null, null, null, null] +36786 - Bank booth - [Use, Use-quickly, Collect, null, null] +36787 - Closed Bank booth - [null, null, null, null, null] +36788 - Bank deposit box - [Deposit, null, null, null, null] +36789 - Bank table - [null, null, null, null, null] +36790 - Cannonballs - [null, null, null, null, null] +36791 - Stairs - [Climb-up, null, null, null, null] +36792 - Stairs - [Climb-down, null, null, null, null] +36793 - Stairs - [Climb-up, null, null, null, null] +36794 - Stairs - [Climb-down, null, null, null, null] +36795 - Ladder - [Climb-up, null, null, null, null] +36796 - Ladder - [Climb, Climb-up, Climb-down, null, null] +36797 - Ladder - [Climb-down, null, null, null, null] +36798 - Barrel - [null, null, null, null, null] +36799 - Barrel - [null, null, null, null, null] +36800 - Barrel - [null, null, null, null, null] +36801 - Barrel of swords - [null, null, null, null, null] +36802 - Barrel - [null, null, null, null, null] +36803 - Painting - [null, null, null, null, null] +36804 - Painting - [null, null, null, null, null] +36805 - Painting - [null, null, null, null, null] +36806 - Painting - [null, null, null, null, null] +36807 - Hanging tapestry - [null, null, null, null, null] +36808 - Hanging tapestry - [null, null, null, null, null] +36809 - Hanging tapestry - [null, null, null, null, null] +36810 - null - [null, null, null, null, null] +36811 - Painting - [null, null, null, null, null] +36812 - Painting - [null, null, null, null, null] +36813 - Painting - [null, null, null, null, null] +36814 - Painting - [null, null, null, null, null] +36815 - Fireplace - [null, null, null, null, null] +36816 - Fireplace - [null, null, null, null, null] +36817 - Axe cabinet - [null, null, null, null, null] +36818 - Sword cabinet - [null, null, null, null, null] +36819 - Small table - [null, null, null, null, null] +36820 - Table - [null, null, null, null, null] +36821 - Table - [null, null, null, null, null] +36822 - Large table - [null, null, null, null, null] +36823 - Shelves - [null, null, null, null, null] +36824 - Shelves - [null, null, null, null, null] +36825 - Shelves - [null, null, null, null, null] +36826 - Shelves - [null, null, null, null, null] +36827 - null - [null, null, null, null, null] +36828 - null - [null, null, null, null, null] +36829 - Shelves - [null, null, null, null, null] +36830 - Chair - [null, null, null, null, null] +36831 - Chair - [null, null, null, null, null] +36832 - Bookcase - [Search, null, null, null, null] +36833 - Bookcase - [Search, null, null, null, null] +36834 - Bookcase - [Search, null, null, null, null] +36835 - null - [null, null, null, null, null] +36836 - Workbench - [null, null, null, null, null] +36837 - Stool - [null, null, null, null, null] +36838 - null - [null, null, null, null, null] +36839 - null - [null, null, null, null, null] +36840 - null - [null, null, null, null, null] +36841 - Bed - [null, null, null, null, null] +36842 - null - [null, null, null, null, null] +36843 - null - [null, null, null, null, null] +36844 - Door - [Open, null, null, null, null] +36845 - Door - [Close, null, null, null, null] +36846 - Door - [Open, null, null, null, null] +36847 - Door - [Open, null, null, null, null] +36848 - Door - [Close, null, null, null, null] +36849 - null - [null, null, null, null, null] +36850 - null - [null, null, null, null, null] +36851 - Door - [Open, null, null, null, null] +36852 - Door - [Open, null, null, null, null] +36853 - Door - [Close, null, null, null, null] +36854 - null - [null, null, null, null, null] +36855 - null - [null, null, null, null, null] +36856 - Door - [Open, null, null, null, null] +36857 - Door - [Open, null, null, null, null] +36858 - Door - [Close, null, null, null, null] +36859 - Door - [Close, null, null, null, null] +36860 - null - [null, null, null, null, null] +36861 - null - [null, null, null, null, null] +36862 - Door - [Open, null, null, null, null] +36863 - Door - [Open, null, null, null, null] +36864 - Door - [Close, null, null, null, null] +36865 - Door - [Close, null, null, null, null] +36866 - Flag - [null, null, null, null, null] +36867 - Water wheel - [null, null, null, null, null] +36868 - Water wheel - [null, null, null, null, null] +36869 - Water wheel - [null, null, null, null, null] +36870 - null - [null, null, null, null, null] +36871 - Water wheel - [null, null, null, null, null] +36872 - Sails - [null, null, null, null, null] +36873 - Sails - [null, null, null, null, null] +36874 - Mill - [null, null, null, null, null] +36875 - Mill - [null, null, null, null, null] +36876 - null - [null, null, null, null, null] +36877 - Mill - [null, null, null, null, null] +36878 - Flour bin - [Empty, null, null, null, null] +36879 - Mill - [null, null, null, null, null] +36880 - null - [null, null, null, null, null] +36881 - Hopper - [null, null, null, null, null] +36882 - Log pile - [null, null, null, null, null] +36883 - Plough - [null, null, null, null, null] +36884 - Food trough - [null, null, null, null, null] +36885 - Trough - [null, null, null, null, null] +36886 - Trough - [null, null, null, null, null] +36887 - Trough - [null, null, null, null, null] +36888 - Scarecrow - [null, null, null, null, null] +36889 - Cart - [null, null, null, null, null] +36890 - Wheelbarrow - [null, null, null, null, null] +36891 - Tree stump - [null, null, null, null, null] +36892 - Hay bale - [Search, null, null, null, null] +36893 - Hay bale - [Search, null, null, null, null] +36894 - Hay bales - [Search, null, null, null, null] +36895 - Hay bales - [Search, null, null, null, null] +36896 - Hay bales - [Search, null, null, null, null] +36897 - Hay bales - [Search, null, null, null, null] +36898 - Hay bales - [Search, null, null, null, null] +36899 - Hay bales - [Search, null, null, null, null] +36900 - null - [null, null, null, null, null] +36901 - null - [null, null, null, null, null] +36902 - null - [null, null, null, null, null] +36903 - Sack - [null, null, null, null, null] +36904 - Sack - [null, null, null, null, null] +36905 - Bench - [null, null, null, null, null] +36906 - Hat stand - [null, null, null, null, null] +36907 - Quiver - [null, null, null, null, null] +36908 - Wardrobe - [null, null, null, null, null] +36909 - Wardrobe - [null, null, null, null, null] +36910 - Table - [null, null, null, null, null] +36911 - Signpost - [null, null, null, null, null] +36912 - Gate - [Close, null, null, null, null] +36913 - Gate - [Open, null, null, null, null] +36914 - Gate - [Close, null, null, null, null] +36915 - Gate - [Open, null, null, null, null] +36916 - Gate - [Close, null, null, null, null] +36917 - Gate - [Open, null, null, null, null] +36918 - Gate - [Close, null, null, null, null] +36919 - Gate - [Open, null, null, null, null] +36920 - Trapdoor - [Open, null, null, null, null] +36921 - Trapdoor - [Go-down, null, null, null, null] +36922 - null - [null, null, null, null, null] +36923 - Hanging tapestry - [null, null, null, null, null] +36924 - Standard - [null, null, null, null, null] +36925 - Standard - [null, null, null, null, null] +36926 - Standard - [null, null, null, null, null] +36927 - null - [null, null, null, null, null] +36928 - Wooden defence - [null, null, null, null, null] +36929 - Sacks - [Search, null, null, null, null] +36930 - Desk - [null, null, null, null, null] +36931 - A bunk bed - [null, null, null, null, null] +36932 - null - [null, null, null, null, null] +36933 - null - [null, null, null, null, null] +36934 - Cabinet - [null, null, null, null, null] +36935 - Counter - [null, null, null, null, null] +36936 - Stepladder - [null, null, null, null, null] +36937 - Grandfather clock - [null, null, null, null, null] +36938 - null - [null, null, null, null, null] +36939 - null - [null, null, null, null, null] +36940 - null - [null, null, null, null, null] +36941 - Bed - [null, null, null, null, null] +36942 - Bed - [null, null, null, null, null] +36943 - Bed - [null, null, null, null, null] +36944 - Bed - [null, null, null, null, null] +36945 - Ladder - [Climb-up, null, null, null, null] +36946 - Ladder - [Climb-down, null, null, null, null] +36947 - Ladder - [Climb-up, null, null, null, null] +36948 - Ladder - [Climb-down, null, null, null, null] +36949 - Wheelbarrow - [null, null, null, null, null] +36950 - null - [null, null, null, null, null] +36951 - Coop - [null, null, null, null, null] +36952 - Coop - [null, null, null, null, null] +36953 - Coop - [null, null, null, null, null] +36954 - Water barrel - [null, null, null, null, null] +36955 - Water barrel - [null, null, null, null, null] +36956 - Furnace - [null, Smelt, null, null, null] +36957 - null - [null, null, null, null, null] +36958 - null - [null, null, null, null, null] +36959 - Combat dummy - [Attack, null, null, null, null] +36960 - Stairs - [Climb-up, null, null, null, null] +36961 - Stairs - [Climb-down, null, null, null, null] +36962 - Stairs - [Climb-up, null, null, null, null] +36963 - Stairs - [Climb-down, null, null, null, null] +36964 - Stairs - [Climb-up, null, null, null, null] +36965 - Stairs - [Climb-up, null, null, null, null] +36966 - Stairs - [null, null, null, null, null] +36967 - Stairs - [null, null, null, null, null] +36968 - Stairs - [Climb-down, null, null, null, null] +36969 - Stairs - [Climb-down, null, null, null, null] +36970 - Spinning wheel - [Spin, null, null, null, null] +36971 - Sink - [null, null, null, null, null] +36972 - Altar - [Pray, null, null, null, null] +36973 - Range - [null, null, null, null, null] +36974 - Logs - [Take-axe, null, null, null, null] +36975 - Logs - [null, null, null, null, null] +36976 - Bell - [Ring, null, null, null, null] +36977 - Bell - [null, null, null, null, null] +36978 - Organ - [Play, null, null, null, null] +36979 - Organ - [Play, null, null, null, null] +36980 - null - [null, null, null, null, null] +36981 - null - [null, null, null, null, null] +36982 - Stand - [null, null, null, null, null] +36983 - Stand - [null, null, null, null, null] +36984 - Ladder - [Climb-up, null, null, null, null] +36985 - Ladder - [Climb-down, null, null, null, null] +36986 - Ladder - [Climb-up, null, null, null, null] +36987 - Ladder - [Climb-down, null, null, null, null] +36988 - Ladder - [Climb-up, null, null, null, null] +36989 - Ladder - [Climb-up, null, null, null, null] +36990 - Ladder - [Climb-down, null, null, null, null] +36991 - Ladder - [Climb-down, null, null, null, null] +36992 - null - [null, null, null, null, null] +36993 - Ladder - [Climb-up, null, null, null, null] +36994 - Ladder - [Climb-down, null, null, null, null] +36995 - Ladder - [Climb-up, null, null, null, null] +36996 - Ladder - [Climb-down, null, null, null, null] +36997 - Ladder - [Climb-up, null, null, null, null] +36998 - Ladder - [Climb-down, null, null, null, null] +36999 - Church door - [Open, null, null, null, null] +37000 - Church door - [Close, null, null, null, null] +37001 - null - [null, null, null, null, null] +37002 - Church door - [Open, null, null, null, null] +37003 - Church door - [Close, null, null, null, null] +37004 - null - [null, null, null, null, null] +37005 - Gravestone - [null, null, null, null, null] +37006 - Gravestone - [null, null, null, null, null] +37007 - Candle - [null, null, null, null, null] +37008 - Organ - [null, null, null, null, null] +37009 - Closed chest - [Open, null, null, null, null] +37010 - Open chest - [null, Search, Shut, null, null] +37011 - Drawers - [Open, null, null, null, null] +37012 - Drawers - [null, Search, Close, null, null] +37013 - Drawers - [Open, null, null, null, null] +37014 - Drawers - [null, Search, Close, null, null] +37015 - Crate - [Search, null, null, null, null] +37016 - Crate - [Search, null, null, null, null] +37017 - Boxes - [Search, null, null, null, null] +37018 - Doorway - [null, null, null, null, null] +37019 - null - [null, null, null, null, null] +37020 - null - [Open, null, null, null, null] +37021 - null - [null, null, null, null, null] +37022 - null - [null, null, null, null, null] +37023 - Staircase - [Climb-down, null, null, null, null] +37024 - null - [null, null, null, null, null] +37025 - Cabinet - [null, null, null, null, null] +37026 - Cabinet - [null, null, null, null, null] +37027 - Drawers - [Open, null, null, null, null] +37028 - Drawers - [null, Search, Shut, null, null] +37029 - Crate - [Search, null, null, null, null] +37030 - Crate - [Search, null, null, null, null] +37031 - Crate - [Search, null, null, null, null] +37032 - sacks - [Search, null, null, null, null] +37033 - null - [null, null, null, null, null] +37034 - Cupboard - [Open, null, null, null, null] +37035 - Cupboard - [Open, null, null, null, null] +37036 - Open Cupboard - [null, Search, Shut, null, null] +37037 - Cupboard - [Open, null, null, null, null] +37038 - Open Cupboard - [null, Search, Shut, null, null] +37039 - Cupboard - [null, Search, Shut, null, null] +37040 - Closed chest - [Open, null, null, null, null] +37041 - Closed chest - [Open, null, null, null, null] +37042 - Open chest - [null, Search, Shut, null, null] +37043 - Open chest - [null, Search, Shut, null, null] +37044 - Open chest - [null, Search, Shut, null, null] +37045 - Open chest - [null, Search, Shut, null, null] +37046 - Open chest - [null, Search, Shut, null, null] +37047 - Bookcase - [Search, null, null, null, null] +37048 - Wardrobe - [Open, null, null, null, null] +37049 - Wardrobe - [null, Search, Close, null, null] +37050 - Wardrobe - [null, Search, Close, null, null] +37051 - Wardrobe - [Open, null, null, null, null] +37052 - Wardrobe - [null, Search, Close, null, null] +37053 - Wardrobe - [null, Search, Close, null, null] +37054 - null - [null, null, null, null, null] +37055 - null - [null, null, null, null, null] +37056 - null - [null, null, null, null, null] +37057 - null - [null, null, null, null, null] +37058 - null - [null, null, null, null, null] +37059 - null - [null, null, null, null, null] +37060 - null - [null, null, null, null, null] +37061 - null - [null, null, null, null, null] +37062 - Ship's ladder - [Climb-up, null, null, null, null] +37063 - null - [null, null, null, null, null] +37064 - null - [null, null, null, null, null] +37065 - null - [null, null, null, null, null] +37066 - null - [null, null, null, null, null] +37067 - null - [null, null, null, null, null] +37068 - Figurehead - [null, null, null, null, null] +37069 - null - [null, null, null, null, null] +37070 - null - [null, null, null, null, null] +37071 - null - [null, null, null, null, null] +37072 - null - [null, null, null, null, null] +37073 - Stags - [null, null, null, null, null] +37074 - Ectoplasm - [null, null, null, null, null] +37075 - null - [null, null, null, null, null] +37076 - null - [null, null, null, null, null] +37077 - null - [null, null, null, null, null] +37078 - null - [null, null, null, null, null] +37079 - null - [null, null, null, null, null] +37080 - null - [null, null, null, null, null] +37081 - null - [null, null, null, null, null] +37082 - null - [null, null, null, null, null] +37083 - null - [null, null, null, null, null] +37084 - null - [null, null, null, null, null] +37085 - null - [null, null, null, null, null] +37086 - null - [null, null, null, null, null] +37087 - Tiling - [null, null, null, null, null] +37088 - Trapdoor - [Climb-down, null, null, null, null] +37089 - null - [null, null, null, null, null] +37090 - null - [null, null, null, null, null] +37091 - Trapdoor - [null, null, null, null, null] +37092 - Springboard - [Step-on, null, null, null, null] +37093 - null - [null, null, null, null, null] +37094 - null - [null, null, null, null, null] +37095 - Archery target - [Shoot-at, null, null, null, null] +37096 - Archery target - [Shoot-at, null, null, null, null] +37097 - null - [null, null, null, null, null] +37098 - null - [null, null, null, null, null] +37099 - null - [null, null, null, null, null] +37100 - null - [null, null, null, null, null] +37101 - null - [null, null, null, null, null] +37102 - null - [null, null, null, null, null] +37103 - null - [null, null, null, null, null] +37104 - null - [null, null, null, null, null] +37105 - null - [null, null, null, null, null] +37106 - null - [null, null, null, null, null] +37107 - null - [null, null, null, null, null] +37108 - null - [null, null, null, null, null] +37109 - null - [null, null, null, null, null] +37110 - null - [null, null, null, null, null] +37111 - null - [null, null, null, null, null] +37112 - null - [null, null, null, null, null] +37113 - null - [null, null, null, null, null] +37114 - Barrel - [null, null, null, null, null] +37115 - null - [null, null, null, null, null] +37116 - null - [null, null, null, null, null] +37117 - null - [null, null, null, null, null] +37118 - Bookcase - [Search, null, null, null, null] +37119 - Bookcase - [Search, null, null, null, null] +37120 - null - [null, null, null, null, null] +37121 - Mirror - [null, null, null, null, null] +37122 - Broom - [null, null, null, null, null] +37123 - Carcass - [null, null, null, null, null] +37124 - null - [null, null, null, null, null] +37125 - null - [null, null, null, null, null] +37126 - null - [null, null, null, null, null] +37127 - null - [null, null, null, null, null] +37128 - null - [null, null, null, null, null] +37129 - null - [null, null, null, null, null] +37130 - null - [null, null, null, null, null] +37131 - null - [null, null, null, null, null] +37132 - null - [null, null, null, null, null] +37133 - null - [null, null, null, null, null] +37134 - null - [null, null, null, null, null] +37135 - null - [null, null, null, null, null] +37136 - null - [null, null, null, null, null] +37137 - null - [null, null, null, null, null] +37138 - null - [null, null, null, null, null] +37139 - null - [null, null, null, null, null] +37140 - null - [null, null, null, null, null] +37141 - null - [null, null, null, null, null] +37142 - null - [null, null, null, null, null] +37143 - null - [null, null, null, null, null] +37144 - null - [null, null, null, null, null] +37145 - null - [null, null, null, null, null] +37146 - null - [null, null, null, null, null] +37147 - null - [null, null, null, null, null] +37148 - null - [null, null, null, null, null] +37149 - null - [null, null, null, null, null] +37150 - Cooking Pots - [null, null, null, null, null] +37151 - null - [null, null, null, null, null] +37152 - null - [null, null, null, null, null] +37153 - Sign - [null, null, null, null, null] +37154 - Sink - [null, null, null, null, null] +37155 - Sink - [null, null, null, null, null] +37156 - Bath - [null, null, null, null, null] +37157 - Bar pumps - [null, null, null, null, null] +37158 - Bank table - [null, null, null, null, null] +37159 - Bank table - [null, null, null, null, null] +37160 - Table - [null, null, null, null, null] +37161 - Table - [null, null, null, null, null] +37162 - Table - [null, null, null, null, null] +37163 - Table - [null, null, null, null, null] +37164 - Table - [null, null, null, null, null] +37165 - Table - [null, null, null, null, null] +37166 - Table - [null, null, null, null, null] +37167 - Table - [null, null, null, null, null] +37168 - Study desk - [null, null, null, null, null] +37169 - Counter - [null, null, null, null, null] +37170 - Shelves - [null, null, null, null, null] +37171 - Shelves - [null, null, null, null, null] +37172 - Shelves - [null, null, null, null, null] +37173 - Shelves - [null, null, null, null, null] +37174 - Shelves - [null, null, null, null, null] +37175 - Shelves - [null, null, null, null, null] +37176 - Shelves - [null, null, null, null, null] +37177 - Shelves - [null, null, null, null, null] +37178 - Shelves - [null, null, null, null, null] +37179 - Shelves - [null, null, null, null, null] +37180 - Shelves - [null, null, null, null, null] +37181 - Shelf - [null, null, null, null, null] +37182 - null - [null, null, null, null, null] +37183 - null - [null, null, null, null, null] +37184 - null - [null, null, null, null, null] +37185 - null - [null, null, null, null, null] +37186 - null - [null, null, null, null, null] +37187 - null - [null, null, null, null, null] +37188 - null - [null, null, null, null, null] +37189 - null - [null, null, null, null, null] +37190 - null - [null, null, null, null, null] +37191 - null - [null, null, null, null, null] +37192 - null - [null, null, null, null, null] +37193 - Stalactite - [null, null, null, null, null] +37194 - Crashed glider - [null, null, null, null, null] +37195 - null - [null, null, null, null, null] +37196 - Whirpool - [null, null, null, null, null] +37197 - null - [null, null, null, null, null] +37198 - null - [null, null, null, null, null] +37199 - null - [null, null, null, null, null] +37200 - null - [null, null, null, null, null] +37201 - null - [null, null, null, null, null] +37202 - null - [null, null, null, null, null] +37203 - null - [null, null, null, null, null] +37204 - null - [null, null, null, null, null] +37205 - null - [null, null, null, null, null] +37206 - null - [null, null, null, null, null] +37207 - null - [null, null, null, null, null] +37208 - Rocks - [Mine, Prospect, hidden, null, null] +37209 - null - [null, null, null, null, null] +37210 - Whirpool - [null, null, null, null, null] +37211 - null - [null, null, null, null, null] +37212 - null - [null, null, null, null, null] +37213 - null - [null, null, null, null, null] +37214 - null - [null, null, null, null, null] +37215 - null - [null, null, null, null, null] +37216 - null - [null, null, null, null, null] +37217 - null - [null, null, null, null, null] +37218 - null - [null, null, null, null, null] +37219 - null - [null, null, null, null, null] +37220 - null - [null, null, null, null, null] +37221 - null - [null, null, null, null, null] +37222 - null - [null, null, null, null, null] +37223 - null - [null, null, null, null, null] +37224 - null - [null, null, null, null, null] +37225 - null - [null, null, null, null, null] +37226 - null - [null, null, null, null, null] +37227 - null - [null, null, null, null, null] +37228 - null - [null, null, null, null, null] +37229 - null - [null, null, null, null, null] +37230 - null - [null, null, null, null, null] +37231 - null - [null, null, null, null, null] +37232 - null - [null, null, null, null, null] +37233 - null - [null, null, null, null, null] +37234 - null - [null, null, null, null, null] +37235 - null - [null, null, null, null, null] +37236 - null - [null, null, null, null, null] +37237 - null - [null, null, null, null, null] +37238 - null - [null, null, null, null, null] +37239 - null - [null, null, null, null, null] +37240 - null - [null, null, null, null, null] +37241 - null - [null, null, null, null, null] +37242 - null - [null, null, null, null, null] +37243 - null - [null, null, null, null, null] +37244 - null - [null, null, null, null, null] +37245 - Ledge - [Open, null, null, null, null] +37246 - Ledge - [Open, null, null, null, null] +37247 - Ledge - [Open, null, null, null, null] +37248 - null - [null, null, null, null, null] +37249 - null - [null, null, null, null, null] +37250 - null - [null, null, null, null, null] +37251 - null - [null, null, null, null, null] +37252 - null - [null, null, null, null, null] +37253 - null - [null, null, null, null, null] +37254 - null - [null, null, null, null, null] +37255 - null - [null, null, null, null, null] +37256 - null - [null, null, null, null, null] +37257 - null - [null, null, null, null, null] +37258 - null - [null, null, null, null, null] +37259 - null - [null, null, null, null, null] +37260 - null - [null, null, null, null, null] +37261 - null - [null, null, null, null, null] +37262 - null - [null, null, null, null, null] +37263 - null - [null, null, null, null, null] +37264 - null - [null, null, null, null, null] +37265 - null - [null, null, null, null, null] +37266 - null - [null, null, null, null, null] +37267 - null - [null, null, null, null, null] +37268 - null - [null, null, null, null, null] +37269 - null - [null, null, null, null, null] +37270 - null - [null, null, null, null, null] +37271 - null - [null, null, null, null, null] +37272 - null - [null, null, null, null, null] +37273 - null - [null, null, null, null, null] +37274 - null - [null, null, null, null, null] +37275 - null - [null, null, null, null, null] +37276 - null - [null, null, null, null, null] +37277 - null - [null, null, null, null, null] +37278 - null - [null, null, null, null, null] +37279 - null - [null, null, null, null, null] +37280 - null - [null, null, null, null, null] +37281 - null - [null, null, null, null, null] +37282 - null - [null, null, null, null, null] +37283 - null - [null, null, null, null, null] +37284 - null - [null, null, null, null, null] +37285 - null - [null, null, null, null, null] +37286 - null - [null, null, null, null, null] +37287 - null - [null, null, null, null, null] +37288 - null - [null, null, null, null, null] +37289 - null - [null, null, null, null, null] +37290 - null - [null, null, null, null, null] +37291 - null - [null, null, null, null, null] +37292 - null - [null, null, null, null, null] +37293 - null - [null, null, null, null, null] +37294 - null - [null, null, null, null, null] +37295 - Bookcase - [Search, null, null, null, null] +37296 - Corpse - [null, null, null, null, null] +37297 - Smashed chair - [null, null, null, null, null] +37298 - Bench - [null, null, null, null, null] +37299 - Shelves - [null, null, null, null, null] +37300 - Shelves - [null, null, null, null, null] +37301 - Shelves - [null, null, null, null, null] +37302 - null - [null, null, null, null, null] +37303 - null - [null, null, null, null, null] +37304 - Rocks - [Mine, Prospect, hidden, null, null] +37305 - Rocks - [Mine, Prospect, hidden, null, null] +37306 - Rocks - [Mine, Prospect, hidden, null, null] +37307 - Rocks - [Mine, Prospect, hidden, null, null] +37308 - Rocks - [Mine, Prospect, hidden, null, null] +37309 - Rocks - [Mine, Prospect, hidden, null, null] +37310 - Rocks - [Mine, Prospect, hidden, null, null] +37311 - Rocks - [Mine, Prospect, hidden, null, null] +37312 - Rocks - [Mine, Prospect, hidden, null, null] +37313 - null - [null, null, null, null, null] +37314 - null - [null, null, null, null, null] +37315 - Pillar - [null, null, null, null, null] +37316 - null - [null, null, null, null, null] +37317 - Pillar - [null, null, null, null, null] +37318 - Shelves - [null, null, null, null, null] +37319 - Shelves - [null, null, null, null, null] +37320 - null - [null, null, null, null, null] +37321 - Hanging roots - [null, null, null, null, null] +37322 - Hanging roots - [null, null, null, null, null] +37323 - null - [null, null, null, null, null] +37324 - null - [null, null, null, null, null] +37325 - null - [null, null, null, null, null] +37326 - null - [null, null, null, null, null] +37327 - Flower - [null, null, null, null, null] +37328 - Trollweiss flowers - [null, Pick, null, null, null] +37329 - Flowerbed - [null, null, null, null, null] +37330 - Flowers - [null, null, null, null, null] +37331 - null - [null, null, null, null, null] +37332 - null - [null, null, null, null, null] +37333 - null - [null, null, null, null, null] +37334 - Dead tree - [null, null, null, null, null] +37335 - Flag - [Raise, null, null, null, null] +37336 - Winch - [Operate, null, null, null, null] +37337 - Chair - [null, null, null, null, null] +37338 - Pillar - [null, null, null, null, null] +37339 - Pillar - [null, null, null, null, null] +37340 - Pillar - [null, null, null, null, null] +37341 - Pillar - [null, null, null, null, null] +37342 - null - [null, null, null, null, null] +37343 - Stool - [null, null, null, null, null] +37344 - null - [null, null, null, null, null] +37345 - null - [null, null, null, null, null] +37346 - null - [null, null, null, null, null] +37347 - null - [null, null, null, null, null] +37348 - null - [null, null, null, null, null] +37349 - null - [null, null, null, null, null] +37350 - Table - [null, null, null, null, null] +37351 - Gate - [Close, null, null, null, null] +37352 - Gate - [Open, null, null, null, null] +37353 - Gate - [Close, null, null, null, null] +37354 - Gate - [Open, null, null, null, null] +37355 - null - [null, null, null, null, null] +37356 - null - [null, null, null, null, null] +37357 - null - [null, null, null, null, null] +37358 - null - [null, null, null, null, null] +37359 - null - [null, null, null, null, null] +37360 - null - [null, null, null, null, null] +37361 - null - [null, null, null, null, null] +37362 - null - [null, null, null, null, null] +37363 - null - [null, null, null, null, null] +37364 - Stones - [null, null, null, null, null] +37365 - Stones - [null, null, null, null, null] +37366 - Stones - [null, null, null, null, null] +37367 - Stones - [null, null, null, null, null] +37368 - Tree - [null, null, null, null, null] +37369 - null - [null, null, null, null, null] +37370 - null - [null, null, null, null, null] +37371 - null - [null, null, null, null, null] +37372 - null - [null, null, null, null, null] +37373 - Food trough - [null, null, null, null, null] +37374 - Crate - [null, null, null, null, null] +37375 - Crate - [null, null, null, null, null] +37376 - Crate - [Search, null, null, null, null] +37377 - Sack - [Search, null, null, null, null] +37378 - null - [null, null, null, null, null] +37379 - null - [null, null, null, null, null] +37380 - null - [null, null, null, null, null] +37381 - null - [null, null, null, null, null] +37382 - null - [null, null, null, null, null] +37383 - null - [null, null, null, null, null] +37384 - null - [null, null, null, null, null] +37385 - Shelf - [null, null, null, null, null] +37386 - null - [null, null, null, null, null] +37387 - null - [null, null, null, null, null] +37388 - null - [null, null, null, null, null] +37389 - null - [null, null, null, null, null] +37390 - null - [null, null, null, null, null] +37391 - Foliage - [null, null, null, null, null] +37392 - Foliage - [null, null, null, null, null] +37393 - Tropical tree - [null, null, null, null, null] +37394 - Palm tree - [null, null, null, null, null] +37395 - null - [null, null, null, null, null] +37396 - null - [null, null, null, null, null] +37397 - null - [null, null, null, null, null] +37398 - null - [null, null, null, null, null] +37399 - Stone Pile - [null, null, null, null, null] +37400 - Barrel - [null, null, null, null, null] +37401 - Barrel - [null, null, null, null, null] +37402 - Stool - [null, null, null, null, null] +37403 - Stool - [null, null, null, null, null] +37404 - Foliage - [Search, null, null, null, null] +37405 - Foliage - [Search, null, null, null, null] +37406 - null - [null, null, null, null, null] +37407 - null - [null, null, null, null, null] +37408 - null - [null, null, null, null, null] +37409 - null - [null, null, null, null, null] +37410 - null - [null, null, null, null, null] +37411 - null - [null, null, null, null, null] +37412 - null - [null, null, null, null, null] +37413 - null - [null, null, null, null, null] +37414 - null - [null, null, null, null, null] +37415 - null - [null, null, null, null, null] +37416 - null - [null, null, null, null, null] +37417 - null - [null, null, null, null, null] +37418 - null - [null, null, null, null, null] +37419 - Table - [null, null, null, null, null] +37420 - Wardrobe - [null, null, null, null, null] +37421 - Bed - [null, null, null, null, null] +37422 - Ladder - [Climb-up, null, null, null, null] +37423 - Ladder - [Climb-down, null, null, null, null] +37424 - null - [null, null, null, null, null] +37425 - null - [null, null, null, null, null] +37426 - Fireplace - [null, null, null, null, null] +37427 - null - [null, null, null, null, null] +37428 - null - [null, null, null, null, null] +37429 - null - [null, null, null, null, null] +37430 - null - [null, null, null, null, null] +37431 - null - [null, null, null, null, null] +37432 - null - [null, null, null, null, null] +37433 - null - [null, null, null, null, null] +37434 - null - [null, null, null, null, null] +37435 - null - [null, null, null, null, null] +37436 - null - [null, null, null, null, null] +37437 - null - [null, null, null, null, null] +37438 - Ancient Door - [null, Open, Search, null, null] +37439 - Ancient Door - [null, null, null, null, null] +37440 - Ancient Door - [null, Open, Search, null, null] +37441 - Ancient Door - [null, null, null, null, null] +37442 - Ancient Door - [null, null, null, Enter, null] +37443 - Ancient Door - [null, null, null, null, null] +37444 - Ancient Door - [null, null, Enter, null, null] +37445 - Ancient Door - [null, null, null, null, null] +37446 - null - [null, null, null, null, null] +37447 - null - [null, null, null, null, null] +37448 - null - [null, null, null, null, null] +37449 - null - [null, null, null, null, null] +37450 - null - [null, null, null, null, null] +37451 - Pillar - [null, null, null, null, null] +37452 - Bridge - [null, null, null, null, null] +37453 - null - [null, null, null, null, null] +37454 - Staircase - [Climb-up, null, null, null, null] +37455 - null - [null, null, null, null, null] +37456 - null - [null, null, null, null, null] +37457 - null - [null, null, null, null, null] +37458 - null - [null, null, null, null, null] +37459 - null - [null, null, null, null, null] +37460 - null - [null, null, null, null, null] +37461 - null - [null, null, null, null, null] +37462 - null - [null, null, null, null, null] +37463 - null - [null, null, null, null, null] +37464 - null - [null, null, null, null, null] +37465 - Rocks - [Mine, Prospect, hidden, null, null] +37466 - Rocks - [Mine, Prospect, hidden, null, null] +37467 - Rocks - [Mine, Prospect, hidden, null, null] +37468 - Rocks - [Mine, Prospect, hidden, null, null] +37469 - Rocks - [Mine, Prospect, hidden, null, null] +37470 - Rocks - [Mine, Prospect, hidden, null, null] +37471 - Rocks - [Mine, Prospect, hidden, null, null] +37472 - Rocks - [Mine, Prospect, hidden, null, null] +37473 - Rocks - [Mine, Prospect, hidden, null, null] +37474 - Bank booth - [Use, null, null, null, null] +37475 - Bell - [Ring, null, null, null, null] +37476 - Spinning wheel - [Spin, null, null, null, null] +37477 - Tree - [Chop down, null, hidden, null, null] +37478 - Tree - [Chop down, null, hidden, null, null] +37479 - Oak - [Chop down, null, hidden, null, null] +37480 - Willow - [Chop down, null, hidden, null, null] +37481 - Dead tree - [Chop down, null, hidden, null, null] +37482 - Dead tree - [Chop down, null, hidden, null, null] +37483 - Dead tree - [Chop down, null, hidden, null, null] +37484 - Trapdoor - [Open, null, null, null, null] +37485 - Sign - [null, null, null, null, null] +37486 - Door - [null, null, null, null, null] +37487 - Staircase - [Climb-up, null, null, null, null] +37488 - Staircase - [Climb, Climb-up, Climb-down, null, null] +37489 - Staircase - [Climb-down, null, null, null, null] +37490 - Staircase - [Climb-up, null, null, null, null] +37491 - Staircase - [Climb, Climb-up, Climb-down, null, null] +37492 - Staircase - [Climb-down, null, null, null, null] +37493 - Staircase - [Climb-up, null, null, null, null] +37494 - Staircase - [Climb-up, null, null, null, null] +37495 - Staircase - [Climb, Climb-up, Climb-down, null, null] +37496 - Staircase - [Climb, Climb-up, Climb-down, null, null] +37497 - Staircase - [Climb-down, null, null, null, null] +37498 - Staircase - [Climb-down, null, null, null, null] +37499 - null - [null, null, null, null, null] +37500 - null - [null, null, null, null, null] +37501 - null - [null, null, null, null, null] +37502 - Ladder - [Climb-up, null, null, null, null] +37503 - Ladder - [Climb-down, null, null, null, null] +37504 - Flag - [Raise, null, null, null, null] +37505 - Gate - [null, null, null, null, null] +37506 - Gate - [null, null, null, null, null] +37507 - Gate - [Open, null, null, null, null] +37508 - null - [null, null, null, null, null] +37509 - null - [null, null, null, null, null] +37510 - null - [null, null, null, null, null] +37511 - null - [null, null, null, null, null] +37512 - null - [null, null, null, null, null] +37513 - null - [null, null, null, null, null] +37514 - null - [null, null, null, null, null] +37515 - null - [null, null, null, null, null] +37516 - null - [null, null, null, null, null] +37517 - null - [null, null, null, null, null] +37518 - null - [null, null, null, null, null] +37519 - null - [null, null, null, null, null] +37520 - null - [null, null, null, null, null] +37521 - null - [null, null, null, null, null] +37522 - null - [null, null, null, null, null] +37523 - null - [null, null, null, null, null] +37524 - null - [null, null, null, null, null] +37525 - null - [null, null, null, null, null] +37526 - null - [null, null, null, null, null] +37527 - null - [null, null, null, null, null] +37528 - null - [null, null, null, null, null] +37529 - null - [null, null, null, null, null] +37530 - null - [null, null, null, null, null] +37531 - null - [null, null, null, null, null] +37532 - null - [null, null, null, null, null] +37533 - null - [null, null, null, null, null] +37534 - null - [null, null, null, null, null] +37535 - null - [null, null, null, null, null] +37536 - null - [null, null, null, null, null] +37537 - null - [null, null, null, null, null] +37538 - null - [null, null, null, null, null] +37539 - null - [null, null, null, null, null] +37540 - null - [null, null, null, null, null] +37541 - null - [null, null, null, null, null] +37542 - null - [null, null, null, null, null] +37543 - null - [null, null, null, null, null] +37544 - null - [null, null, null, null, null] +37545 - null - [null, null, null, null, null] +37546 - null - [null, null, null, null, null] +37547 - null - [null, null, null, null, null] +37548 - null - [null, null, null, null, null] +37549 - null - [null, null, null, null, null] +37550 - null - [null, null, null, null, null] +37551 - null - [null, null, null, null, null] +37552 - null - [null, null, null, null, null] +37553 - null - [null, null, null, null, null] +37554 - null - [null, null, null, null, null] +37555 - null - [null, null, null, null, null] +37556 - null - [null, null, null, null, null] +37557 - null - [null, null, null, null, null] +37558 - null - [null, null, null, null, null] +37559 - null - [null, null, null, null, null] +37560 - null - [null, null, null, null, null] +37561 - null - [null, null, null, null, null] +37562 - null - [null, null, null, null, null] +37563 - null - [null, null, null, null, null] +37564 - null - [null, null, null, null, null] +37565 - null - [null, null, null, null, null] +37566 - null - [null, null, null, null, null] +37567 - null - [null, null, null, null, null] +37568 - null - [null, null, null, null, null] +37569 - null - [null, null, null, null, null] +37570 - null - [null, null, null, null, null] +37571 - null - [null, null, null, null, null] +37572 - null - [null, null, null, null, null] +37573 - null - [null, null, null, null, null] +37574 - null - [null, null, null, null, null] +37575 - null - [null, null, null, null, null] +37576 - null - [null, null, null, null, null] +37577 - null - [null, null, null, null, null] +37578 - null - [null, null, null, null, null] +37579 - null - [null, null, null, null, null] +37580 - null - [null, null, null, null, null] +37581 - Stool - [null, null, null, null, null] +37582 - Sir Vant - [null, null, null, null, null] +37583 - Barrel - [null, null, null, null, null] +37584 - Barrel - [null, null, null, null, null] +37585 - Water barrel - [null, null, null, null, null] +37586 - Barrel - [null, null, null, null, null] +37587 - Crate - [null, null, null, null, null] +37588 - Crate - [null, null, null, null, null] +37589 - Crates - [null, null, null, null, null] +37590 - Storage crate - [null, null, null, null, null] +37591 - Stacked crates - [null, null, null, null, null] +37592 - Shelves - [null, null, null, null, null] +37593 - Shelves - [null, null, null, null, null] +37594 - Barrel stack - [null, null, null, null, null] +37595 - null - [null, null, null, null, null] +37596 - Torch - [null, null, null, null, null] +37597 - Fire - [null, null, null, null, null] +37598 - Puddle - [null, null, null, null, null] +37599 - Puddle - [null, null, null, null, null] +37600 - Puddle - [null, null, null, null, null] +37601 - Puddle - [null, null, null, null, null] +37602 - Puddle - [null, null, null, null, null] +37603 - null - [null, null, null, null, null] +37604 - null - [null, null, null, null, null] +37605 - null - [null, null, null, null, null] +37606 - null - [null, null, null, null, null] +37607 - null - [null, null, null, null, null] +37608 - null - [null, null, null, null, null] +37609 - null - [null, null, null, null, null] +37610 - null - [null, null, null, null, null] +37611 - null - [null, null, null, null, null] +37612 - Buffers - [null, null, null, null, null] +37613 - null - [null, null, null, null, null] +37614 - null - [null, null, null, null, null] +37615 - null - [null, null, null, null, null] +37616 - null - [null, null, null, null, null] +37617 - null - [null, null, null, null, null] +37618 - Mine Cart - [null, null, null, null, null] +37619 - Rock - [null, null, null, null, null] +37620 - Rock - [null, null, null, null, null] +37621 - Rock - [null, null, null, null, null] +37622 - Anvil - [null, null, null, null, null] +37623 - Crate - [Search, null, null, null, null] +37624 - Ladder - [Climb-up, null, null, null, null] +37625 - Ladder - [Climb-down, null, null, null, null] +37626 - Archery target - [Shoot-at, null, null, null, null] +37627 - Archery target - [Shoot-at, null, null, null, null] +37628 - Sword and shield - [null, null, null, null, null] +37629 - Range - [null, null, null, null, null] +37630 - Altar - [Pray, null, null, null, null] +37631 - Mine entrance - [Enter, null, null, null, null] +37632 - Mine entrance - [Enter, null, null, null, null] +37633 - Caved-in mine - [null, null, null, null, null] +37634 - Caved-in mine - [null, null, null, null, null] +37635 - null - [null, null, null, null, null] +37636 - Steps - [Exit, null, null, null, null] +37637 - Rocks - [Mine, Prospect, hidden, null, null] +37638 - Rocks - [Mine, Prospect, hidden, null, null] +37639 - Rocks - [Mine, Prospect, hidden, null, null] +37640 - null - [null, null, null, null, null] +37641 - null - [null, null, null, null, null] +37642 - Rocks - [Mine, Prospect, hidden, null, null] +37643 - Rocks - [Mine, Prospect, hidden, null, null] +37644 - Rocks - [Mine, Prospect, hidden, null, null] +37645 - Rocks - [Mine, Prospect, hidden, null, null] +37646 - Rocks - [Mine, Prospect, hidden, null, null] +37647 - Rocks - [Mine, Prospect, hidden, null, null] +37648 - Rocks - [Mine, Prospect, hidden, null, null] +37649 - Rocks - [Mine, Prospect, hidden, null, null] +37650 - Rocks - [Mine, Prospect, hidden, null, null] +37651 - Furnace - [null, Smelt, null, null, null] +37652 - Tree - [Chop down, null, hidden, null, null] +37653 - Tree stump - [null, null, null, null, null] +37654 - null - [null, null, null, null, null] +37655 - Lumbridge map - [View, null, null, null, null] +37656 - Rock column - [null, null, null, null, null] +37657 - Rock column - [null, null, null, null, null] +37658 - Rock column - [null, null, null, null, null] +37659 - null - [null, null, null, null, null] +37660 - null - [null, null, null, null, null] +37661 - null - [null, null, null, null, null] +37662 - null - [null, null, null, null, null] +37663 - null - [null, null, null, null, null] +37664 - null - [null, null, null, null, null] +37665 - null - [null, null, null, null, null] +37666 - null - [null, null, null, null, null] +37667 - null - [null, null, null, null, null] +37668 - Railing - [Taunt-through, null, null, null, null] +37669 - Rocks - [null, null, null, null, null] +37670 - Rocks - [Mine, Prospect, hidden, null, null] +37671 - Globe table - [null, null, null, null, null] +37672 - Chart table - [null, null, null, null, null] +37673 - Compass table - [null, null, null, null, null] +37674 - null - [null, null, null, null, null] +37675 - Kalphite Queen head - [null, null, null, null, null] +37676 - Big vase - [null, null, null, null, null] +37677 - null - [null, null, null, null, null] +37678 - null - [null, null, null, null, null] +37679 - null - [null, null, null, null, null] +37680 - null - [null, null, null, null, null] +37681 - null - [null, null, null, null, null] +37682 - Flag - [null, null, null, null, null] +37683 - Ladder - [Climb-down, null, null, null, null] +37684 - Ladder - [Climb-up, null, null, null, null] +37685 - Rocks - [Mine, Prospect, hidden, null, null] +37686 - Rocks - [Mine, Prospect, hidden, null, null] +37687 - Rocks - [Mine, Prospect, hidden, null, null] +37688 - Rocks - [Mine, Prospect, hidden, null, null] +37689 - Rocks - [Mine, Prospect, hidden, null, null] +37690 - Rocks - [Mine, Prospect, hidden, null, null] +37691 - Rocks - [Mine, Prospect, hidden, null, null] +37692 - Rocks - [Mine, Prospect, hidden, null, null] +37693 - Rocks - [Mine, Prospect, hidden, null, null] +37694 - Rocks - [Mine, Prospect, hidden, null, null] +37695 - Rocks - [Mine, Prospect, hidden, null, null] +37696 - Rocks - [Mine, Prospect, hidden, null, null] +37697 - Rocks - [Mine, Prospect, hidden, null, null] +37698 - Rocks - [Mine, Prospect, hidden, null, null] +37699 - Rocks - [Mine, Prospect, hidden, null, null] +37700 - Rocks - [Mine, Prospect, hidden, null, null] +37701 - Rocks - [Mine, Prospect, hidden, null, null] +37702 - Rocks - [Mine, Prospect, hidden, null, null] +37703 - Broken railing - [Squeeze-through, null, null, null, null] +37704 - Stepping stone - [Cross, null, null, null, null] +37705 - null - [null, null, null, null, null] +37706 - null - [null, null, null, null, null] +37707 - null - [null, null, null, null, null] +37708 - null - [null, null, null, null, null] +37709 - null - [null, null, null, null, null] +37710 - Trapdoor - [null, null, null, null, null] +37711 - Rope bridge - [null, null, null, null, null] +37712 - Rope bridge - [null, null, null, null, null] +37713 - Rope bridge - [null, null, null, null, null] +37714 - null - [null, null, null, null, null] +37715 - null - [null, null, null, null, null] +37716 - null - [null, null, null, null, null] +37717 - null - [null, null, null, null, null] +37718 - Wall - [null, null, null, null, Lean against] +37719 - Wall - [null, null, null, null, Lean against] +37720 - Wall - [null, null, null, null, Lean against] +37721 - Wall - [null, null, null, null, Lean against] +37722 - Wall - [null, null, null, null, Lean against] +37723 - Wall - [null, null, null, null, Lean against] +37724 - Stuffed swordfish - [null, null, null, null, null] +37725 - Stuffed swordfish - [null, null, null, null, null] +37726 - Fire - [null, null, null, null, null] +37727 - Fairy ring - [Use, null, null, null, null] +37728 - null - [null, null, null, null, null] +37729 - null - [null, null, null, null, null] +37730 - null - [null, null, null, null, null] +37731 - null - [null, null, null, null, null] +37732 - null - [null, null, null, null, null] +37733 - null - [null, null, null, null, null] +37734 - null - [null, null, null, null, null] +37735 - Obstacle pipe - [Squeeze-through, null, null, null, null] +37736 - null - [null, null, null, null, null] +37737 - Lever - [Pull, null, null, null, null] +37738 - Door - [null, null, null, null, null] +37739 - Gate - [null, null, null, null, null] +37740 - Gate - [null, null, null, null, null] +37741 - Gate - [null, null, null, null, null] +37742 - Gate - [null, null, null, null, null] +37743 - Rubble - [Search, null, null, null, null] +37744 - null - [null, null, null, null, null] +37745 - Trapdoor - [Open, null, null, null, null] +37746 - Ladder - [Climb-down, Close, null, null, null] +37747 - null - [null, null, null, null, null] +37748 - null - [null, null, null, null, null] +37749 - Entrance - [Go-through, null, null, null, null] +37750 - Entrance - [null, null, null, null, null] +37751 - Tree Stump - [null, null, null, null, null] +37752 - Disc - [null, null, null, null, null] +37753 - Disc - [null, null, null, null, null] +37754 - Disc - [null, null, null, null, null] +37755 - Disc - [null, null, null, null, null] +37756 - Disc - [null, null, null, null, null] +37757 - Disc - [null, null, null, null, null] +37758 - Disc - [null, null, null, null, null] +37759 - Disc - [null, null, null, null, null] +37760 - Disc - [null, null, null, null, null] +37761 - Disc - [null, null, null, null, null] +37762 - Disc - [null, null, null, null, null] +37763 - Disc - [null, null, null, null, null] +37764 - Disc - [null, null, null, null, null] +37765 - Disc - [null, null, null, null, null] +37766 - Disc - [null, null, null, null, null] +37767 - Disc - [null, null, null, null, null] +37768 - Disc - [null, null, null, null, null] +37769 - Disc - [null, null, null, null, null] +37770 - Disc - [null, null, null, null, null] +37771 - Disc - [null, null, null, null, null] +37772 - Disc - [null, null, null, null, null] +37773 - Disc - [null, null, null, null, null] +37774 - Disc - [null, null, null, null, null] +37775 - Disc - [null, null, null, null, null] +37776 - Disc - [null, null, null, null, null] +37777 - Disc - [null, null, null, null, null] +37778 - Disc - [null, null, null, null, null] +37779 - Disc - [null, null, null, null, null] +37780 - Disc - [null, null, null, null, null] +37781 - Disc - [null, null, null, null, null] +37782 - Disc - [null, null, null, null, null] +37783 - Disc - [null, null, null, null, null] +37784 - Disc - [null, null, null, null, null] +37785 - Disc - [null, null, null, null, null] +37786 - Disc - [null, null, null, null, null] +37787 - Disc - [null, null, null, null, null] +37788 - Disc - [null, null, null, null, null] +37789 - Disc - [null, null, null, null, null] +37790 - Disc - [null, null, null, null, null] +37791 - Disc - [null, null, null, null, null] +37792 - Disc - [null, null, null, null, null] +37793 - Disc - [null, null, null, null, null] +37794 - Disc - [null, null, null, null, null] +37795 - Disc - [null, null, null, null, null] +37796 - Disc - [null, null, null, null, null] +37797 - Disc - [null, null, null, null, null] +37798 - Disc - [null, null, null, null, null] +37799 - Disc - [null, null, null, null, null] +37800 - Disc - [null, null, null, null, null] +37801 - Disc - [null, null, null, null, null] +37802 - Disc - [null, null, null, null, null] +37803 - Disc - [null, null, null, null, null] +37804 - Disc - [null, null, null, null, null] +37805 - Disc - [null, null, null, null, null] +37806 - Disc - [null, null, null, null, null] +37807 - Barrel - [null, null, null, null, null] +37808 - Barrel - [null, null, null, null, null] +37809 - Crate - [Search, null, null, null, null] +37810 - Crate - [Search, null, null, null, null] +37811 - Crate - [Search, null, null, null, null] +37812 - Sack - [Search, null, null, null, null] +37813 - Stool - [null, null, null, null, null] +37814 - Stool - [null, null, null, null, null] +37815 - Table - [null, null, null, null, null] +37816 - Shelf - [null, null, null, null, null] +37817 - Wardrobe - [null, null, null, null, null] +37818 - Bed - [null, null, null, null, null] +37819 - Statue - [null, null, null, null, null] +37820 - Standing torch - [null, null, null, null, null] +37821 - Cursed magic tree - [Chop down, null, hidden, null, null] +37822 - Tree Stump - [null, null, hidden, null, null] +37823 - Magic tree - [Chop down, null, hidden, null, null] +37824 - Tree Stump - [null, null, hidden, null, null] +37825 - Barrel - [null, null, null, null, null] +37826 - Barrel - [null, null, null, null, null] +37827 - null - [null, null, null, null, null] +37828 - null - [null, null, null, null, null] +37829 - Hollow log - [null, null, null, null, null] +37830 - Hollow log - [Pick, null, null, null, null] +37831 - Hollow log - [null, null, null, null, null] +37832 - null - [null, null, null, null, null] +37833 - null - [null, null, null, null, null] +37834 - Wardrobe - [Open, null, null, null, null] +37835 - Wardrobe - [null, null, null, null, null] +37836 - Wardrobe - [null, null, null, null, null] +37837 - Wardrobe - [null, null, null, null, null] +37838 - null - [null, null, null, null, null] +37839 - null - [null, null, null, null, null] +37840 - null - [null, null, null, null, null] +37841 - null - [null, null, null, null, null] +37842 - Plant - [null, Inspect, null, null, null] +37843 - Plant - [null, Inspect, null, null, null] +37844 - Flower patch - [null, Inspect, null, null, null] +37845 - null - [null, null, null, null, null] +37846 - Flower patch - [null, Inspect, null, Guide, null] +37847 - Flower patch - [null, Inspect, null, Guide, null] +37848 - Flower patch - [null, Inspect, null, Guide, null] +37849 - Flower patch - [null, Inspect, null, Guide, null] +37850 - null - [null, null, null, null, null] +37851 - null - [null, null, null, null, null] +37852 - null - [null, null, null, null, null] +37853 - null - [null, null, null, null, null] +37854 - null - [null, null, null, null, null] +37855 - null - [null, null, null, null, null] +37856 - null - [null, null, null, null, null] +37857 - null - [null, null, null, null, null] +37858 - null - [null, null, null, null, null] +37859 - null - [null, null, null, null, null] +37860 - null - [null, null, null, null, null] +37861 - null - [null, null, null, null, null] +37862 - null - [null, null, null, null, null] +37863 - null - [null, null, null, null, null] +37864 - null - [null, null, null, null, null] +37865 - null - [null, null, null, null, null] +37866 - null - [null, null, null, null, null] +37867 - null - [null, null, null, null, null] +37868 - null - [null, null, null, null, null] +37869 - null - [null, null, null, null, null] +37870 - null - [null, null, null, null, null] +37871 - null - [null, null, null, null, null] +37872 - null - [null, null, null, null, null] +37873 - null - [null, null, null, null, null] +37874 - null - [null, null, null, null, null] +37875 - null - [null, null, null, null, null] +37876 - null - [null, null, null, null, null] +37877 - null - [null, null, null, null, null] +37878 - null - [null, null, null, null, null] +37879 - null - [null, null, null, null, null] +37880 - null - [null, null, null, null, null] +37881 - Stones - [null, null, null, null, null] +37882 - Stones - [null, null, null, null, null] +37883 - Stones - [null, null, null, null, null] +37884 - Stones - [null, null, null, null, null] +37885 - null - [null, null, null, null, null] +37886 - null - [null, null, null, null, null] +37887 - null - [null, null, null, null, null] +37888 - null - [null, null, null, null, null] +37889 - null - [null, null, null, null, null] +37890 - null - [null, null, null, null, null] +37891 - null - [null, null, null, null, null] +37892 - Stones - [null, null, null, null, null] +37893 - Stones - [null, null, null, null, null] +37894 - null - [null, null, null, null, null] +37895 - null - [null, null, null, null, null] +37896 - null - [null, null, null, null, null] +37897 - null - [null, null, null, null, null] +37898 - null - [null, null, null, null, null] +37899 - null - [null, null, null, null, null] +37900 - Ladder - [Climb-up, null, null, null, null] +37901 - Altar - [null, null, null, null, null] +37902 - Altar - [null, null, null, null, null] +37903 - Altar - [null, null, null, null, null] +37904 - Altar - [null, null, null, null, null] +37905 - Altar - [null, null, null, null, null] +37906 - Altar - [null, null, null, null, null] +37907 - Altar - [null, null, null, null, null] +37908 - Altar - [null, null, null, null, null] +37909 - Altar - [null, null, null, null, null] +37910 - Altar - [null, null, null, null, null] +37911 - Altar - [null, null, null, null, null] +37912 - Altar - [null, null, null, null, null] +37913 - null - [null, null, null, null, null] +37914 - Coffin - [Open, null, null, null, null] +37915 - Coffin - [Close, Search, null, null, null] +37916 - null - [null, null, null, null, null] +37917 - null - [null, null, null, null, null] +37918 - null - [null, null, null, null, null] +37919 - null - [null, null, null, null, null] +37920 - null - [null, null, null, null, null] +37921 - null - [null, null, null, null, null] +37922 - null - [null, null, null, null, null] +37923 - null - [null, null, null, null, null] +37924 - Portal - [null, null, null, null, null] +37925 - Portal - [null, null, null, null, null] +37926 - null - [null, null, null, null, null] +37927 - null - [null, null, null, null, null] +37928 - Exit - [Go-through, null, null, null, null] +37929 - Passage - [Go-through, null, null, null, null] +37930 - null - [null, null, null, null, null] +37931 - null - [null, null, null, null, null] +37932 - null - [null, null, null, null, null] +37933 - null - [null, null, null, null, null] +37934 - null - [null, null, null, null, null] +37935 - null - [null, null, null, null, null] +37936 - null - [null, null, null, null, null] +37937 - null - [null, null, null, null, null] +37938 - null - [null, null, null, null, null] +37939 - null - [null, null, null, null, null] +37940 - null - [null, null, null, null, null] +37941 - null - [null, null, null, null, null] +37942 - null - [null, null, null, null, null] +37943 - null - [null, null, null, null, null] +37944 - null - [null, null, null, null, null] +37945 - null - [null, null, null, null, null] +37946 - null - [null, null, null, null, null] +37947 - null - [null, null, null, null, null] +37948 - null - [null, null, null, null, null] +37949 - null - [null, null, null, null, null] +37950 - null - [null, null, null, null, null] +37951 - null - [null, null, null, null, null] +37952 - Roots - [null, null, null, null, null] +37953 - Roots - [null, null, null, null, null] +37954 - Roots - [null, null, null, null, null] +37955 - Roots - [null, null, null, null, null] +37956 - Roots - [null, null, null, null, null] +37957 - Roots - [null, null, null, null, null] +37958 - Roots - [null, null, null, null, null] +37959 - Roots - [Chop, null, hidden, null, null] +37960 - Roots - [null, null, null, null, null] +37961 - Roots - [Chop, null, hidden, null, null] +37962 - Roots - [null, null, null, null, null] +37963 - Roots - [Chop, null, hidden, null, null] +37964 - Puddle - [null, null, null, null, null] +37965 - Puddle - [null, null, null, null, null] +37966 - Puddle - [null, null, null, null, null] +37967 - Hole - [null, null, null, null, null] +37968 - Hole - [null, null, null, null, null] +37969 - Soft soil - [null, null, null, null, null] +37970 - Fire pit - [null, null, null, null, null] +37971 - Gravestone - [null, null, null, null, null] +37972 - null - [null, null, null, null, null] +37973 - Grave marker - [null, null, null, null, null] +37974 - null - [null, null, null, null, null] +37975 - Grave marker - [null, null, null, null, null] +37976 - null - [null, null, null, null, null] +37977 - Grave marker - [null, null, null, null, null] +37978 - null - [null, null, null, null, null] +37979 - Grave marker - [null, null, null, null, null] +37980 - null - [null, null, null, null, null] +37981 - null - [null, null, null, null, null] +37982 - null - [null, null, null, null, null] +37983 - null - [null, null, null, null, null] +37984 - null - [null, null, null, null, null] +37985 - Decayed altar - [Pray, null, null, null, null] +37986 - null - [null, null, null, null, null] +37987 - null - [null, null, null, null, null] +37988 - null - [null, null, null, null, null] +37989 - Invisible Portal - [null, null, null, null, null] +37990 - Chaos altar - [Pray-at, null, null, null, null] +37991 - null - [null, null, null, null, null] +37992 - null - [null, null, null, null, null] +37993 - null - [null, null, null, null, null] +37994 - null - [null, null, null, null, null] +37995 - Door - [Open, null, null, null, null] +37996 - Door - [Close, null, null, null, null] +37997 - Rift - [null, null, null, null, null] +37998 - Rift - [null, null, null, null, null] +37999 - Rift - [null, null, null, null, null] +38000 - Rift - [null, null, null, null, null] +38001 - null - [null, null, null, null, null] +38002 - null - [null, null, null, null, null] +38003 - null - [null, null, null, null, null] +38004 - null - [null, null, null, null, null] +38005 - null - [null, null, null, null, null] +38006 - null - [null, null, null, null, null] +38007 - null - [null, null, null, null, null] +38008 - null - [null, null, null, null, null] +38009 - null - [null, null, null, null, null] +38010 - null - [null, null, null, null, null] +38011 - null - [null, null, null, null, null] +38012 - Staircase - [Climb, Climb-up, Climb-down, null, null] +38013 - Pear seedling - [Inspect, null, null, null, null] +38014 - Mango seedling - [Inspect, null, null, null, null] +38015 - Quince seedling - [Inspect, null, null, null, null] +38016 - Lemon seedling - [Inspect, null, null, null, null] +38017 - Avocado seedling - [Inspect, null, null, null, null] +38018 - Plum seedling - [Inspect, null, null, null, null] +38019 - Fruit tree patch - [Inspect, null, null, null, null] +38020 - Table - [null, null, null, null, null] +38021 - Table - [null, null, null, null, null] +38022 - null - [null, null, null, null, null] +38023 - null - [null, null, null, null, null] +38024 - null - [null, null, null, null, null] +38025 - Food trough - [null, null, null, null, null] +38026 - Beehive - [null, null, null, null, null] +38027 - Rocks - [null, null, null, null, null] +38028 - null - [null, null, null, null, null] +38029 - null - [null, null, null, null, null] +38030 - null - [null, null, null, null, null] +38031 - null - [null, null, null, null, null] +38032 - null - [null, null, null, null, null] +38033 - null - [null, null, null, null, null] +38034 - null - [null, null, null, null, null] +38035 - null - [null, null, null, null, null] +38036 - null - [null, null, null, null, null] +38037 - null - [null, null, null, null, null] +38038 - null - [null, null, null, null, null] +38039 - Reeds - [null, null, null, null, null] +38040 - Reeds - [null, null, null, null, null] +38041 - Reeds - [null, null, null, null, null] +38042 - Reeds - [null, null, null, null, null] +38043 - Fire pit - [null, null, null, null, null] +38044 - null - [null, null, null, null, null] +38045 - null - [null, null, null, null, null] +38046 - null - [null, null, null, null, null] +38047 - Grave - [Read, null, null, null, null] +38048 - Crate - [null, null, null, null, null] +38049 - Bucket - [null, null, null, null, null] +38050 - Barrel - [null, null, null, null, null] +38051 - Avocado tree - [Inspect, null, null, null, null] +38052 - Dead avocado tree - [Inspect, null, null, null, null] +38053 - Lemon tree - [Inspect, null, null, null, null] +38054 - Dead lemon tree - [Inspect, null, null, null, null] +38055 - Mango tree - [Inspect, null, null, null, null] +38056 - Dead mango tree - [Inspect, null, null, null, null] +38057 - Pear tree - [Inspect, null, null, null, null] +38058 - Dead pear tree - [Inspect, null, null, null, null] +38059 - Plum tree - [Inspect, null, null, null, null] +38060 - Dead plum tree - [Inspect, null, null, null, null] +38061 - Quince tree - [Inspect, null, null, null, null] +38062 - Dead quince tree - [Inspect, null, null, null, null] +38063 - null - [null, null, null, null, null] +38064 - null - [null, null, null, null, null] +38065 - null - [null, null, null, null, null] +38066 - null - [null, null, null, null, null] +38067 - null - [null, null, null, null, null] +38068 - null - [null, null, null, null, null] +38069 - null - [null, null, null, null, null] +38070 - null - [null, null, null, null, null] +38071 - null - [null, null, null, null, null] +38072 - null - [null, null, null, null, null] +38073 - null - [null, null, null, null, null] +38074 - null - [null, null, null, null, null] +38075 - null - [null, null, null, null, null] +38076 - null - [null, null, null, null, null] +38077 - null - [null, null, null, null, null] +38078 - null - [null, null, null, null, null] +38079 - null - [null, null, null, null, null] +38080 - null - [null, null, null, null, null] +38081 - null - [null, null, null, null, null] +38082 - null - [null, null, null, null, null] +38083 - null - [null, null, null, null, null] +38084 - null - [null, null, null, null, null] +38085 - null - [null, null, null, null, null] +38086 - null - [null, null, null, null, null] +38087 - null - [null, null, null, null, null] +38088 - null - [null, null, null, null, null] +38089 - null - [null, null, null, null, null] +38090 - null - [null, null, null, null, null] +38091 - null - [null, null, null, null, null] +38092 - null - [null, null, null, null, null] +38093 - null - [null, null, null, null, null] +38094 - null - [null, null, null, null, null] +38095 - null - [null, null, null, null, null] +38096 - null - [null, null, null, null, null] +38097 - null - [null, null, null, null, null] +38098 - null - [null, null, null, null, null] +38099 - null - [null, null, null, null, null] +38100 - Bedside table - [Search, null, null, null, null] +38101 - Side table - [Search, null, null, null, null] +38102 - Table - [null, null, null, null, null] +38103 - null - [null, null, null, null, null] +38104 - null - [null, null, null, null, null] +38105 - Shelves - [Search, null, null, null, null] +38106 - Shelves - [Search, null, null, null, null] +38107 - Basket - [null, null, null, null, null] +38108 - Bed - [null, null, null, null, null] +38109 - Bed - [null, null, null, null, null] +38110 - Pot - [null, null, null, null, null] +38111 - Pots - [null, null, null, null, null] +38112 - Pots - [null, null, null, null, null] +38113 - Pot - [null, null, null, null, null] +38114 - Pots - [Collect, null, null, null, null] +38115 - null - [null, null, null, null, null] +38116 - null - [null, null, null, null, null] +38117 - Shelf - [null, null, null, null, null] +38118 - Shelf - [null, null, null, null, null] +38119 - Bed - [null, null, null, null, null] +38120 - Bed - [null, null, null, null, null] +38121 - Basket - [null, null, null, null, null] +38122 - Basket - [null, null, null, null, null] +38123 - Door - [Close, null, null, null, null] +38124 - Door - [Open, null, null, null, null] +38125 - Cooking pot - [null, null, null, null, null] +38126 - Soil mound - [Inspect, null, null, null, null] +38127 - null - [null, null, null, null, null] +38128 - null - [null, null, null, null, null] +38129 - null - [null, null, null, null, null] +38130 - null - [null, null, null, null, null] +38131 - null - [null, null, null, null, null] +38132 - null - [null, null, null, null, null] +38133 - null - [null, null, null, null, null] +38134 - null - [null, null, null, null, null] +38135 - null - [null, null, null, null, null] +38136 - null - [null, null, null, null, null] +38137 - null - [null, null, null, null, null] +38138 - null - [null, null, null, null, null] +38139 - null - [null, null, null, null, null] +38140 - null - [null, null, null, null, null] +38141 - Door - [Open, null, null, null, null] +38142 - Door - [Close, null, null, null, null] +38143 - null - [null, null, null, null, null] +38144 - Barrier - [Pass, null, null, null, null] +38145 - Barrier - [Pass, null, null, null, null] +38146 - Barrier. - [null, null, null, null, null] +38147 - Barrier. - [null, null, null, null, null] +38148 - Barrier. - [null, null, null, null, null] +38149 - Barrier. - [null, null, null, null, null] +38150 - Portal - [null, null, null, null, null] +38151 - null - [null, null, null, null, null] +38152 - null - [null, null, null, null, null] +38153 - null - [null, null, null, null, null] +38154 - null - [null, null, null, null, null] +38155 - null - [null, null, null, null, null] +38156 - null - [null, null, null, null, null] +38157 - null - [null, null, null, null, null] +38158 - null - [null, null, null, null, null] +38159 - null - [null, null, null, null, null] +38160 - null - [null, null, null, null, null] +38161 - null - [null, null, null, null, null] +38162 - null - [null, null, null, null, null] +38163 - null - [null, null, null, null, null] +38164 - null - [null, null, null, null, null] +38165 - Campfire - [null, null, null, null, null] +38166 - Campfire - [null, null, null, null, null] +38167 - null - [null, null, null, null, null] +38168 - null - [null, null, null, null, null] +38169 - null - [null, null, null, null, null] +38170 - null - [null, null, null, null, null] +38171 - null - [null, null, null, null, null] +38172 - null - [null, null, null, null, null] +38173 - Display case - [Study, null, null, null, null] +38174 - null - [null, null, null, null, null] +38175 - null - [null, null, null, null, null] +38176 - null - [null, null, null, null, null] +38177 - null - [null, null, null, null, null] +38178 - null - [null, null, null, null, null] +38179 - null - [null, null, null, null, null] +38180 - null - [null, null, null, null, null] +38181 - null - [null, null, null, null, null] +38182 - Dead tree - [null, null, null, null, null] +38183 - Rubble - [null, null, null, null, null] +38184 - Rubble - [null, null, null, null, null] +38185 - Rubble - [null, null, null, null, null] +38186 - Rubble - [null, null, null, null, null] +38187 - null - [null, null, null, null, null] +38188 - null - [null, null, null, null, null] +38189 - null - [null, null, null, null, null] +38190 - null - [null, null, null, null, null] +38191 - null - [null, null, null, null, null] +38192 - null - [null, null, null, null, null] +38193 - null - [null, null, null, null, null] +38194 - null - [null, null, null, null, null] +38195 - null - [null, null, null, null, null] +38196 - null - [null, null, null, null, null] +38197 - null - [null, null, null, null, null] +38198 - null - [null, null, null, null, null] +38199 - null - [null, null, null, null, null] +38200 - null - [null, null, null, null, null] +38201 - null - [null, null, null, null, null] +38202 - null - [null, null, null, null, null] +38203 - null - [null, null, null, null, null] +38204 - null - [null, null, null, null, null] +38205 - null - [null, null, null, null, null] +38206 - null - [null, null, null, null, null] +38207 - null - [null, null, null, null, null] +38208 - null - [null, null, null, null, null] +38209 - null - [null, null, null, null, null] +38210 - null - [null, null, null, null, null] +38211 - null - [null, null, null, null, null] +38212 - null - [null, null, null, null, null] +38213 - null - [null, null, null, null, null] +38214 - null - [null, null, null, null, null] +38215 - null - [null, null, null, null, null] +38216 - null - [null, null, null, null, null] +38217 - null - [null, null, null, null, null] +38218 - null - [null, null, null, null, null] +38219 - null - [null, null, null, null, null] +38220 - null - [null, null, null, null, null] +38221 - Ladder - [Climb-up, null, null, null, null] +38222 - Ladder - [Climb-down, null, null, null, null] +38223 - null - [null, null, null, null, null] +38224 - null - [null, null, null, null, null] +38225 - null - [null, null, null, null, null] +38226 - null - [null, null, null, null, null] +38227 - null - [null, null, null, null, null] +38228 - null - [null, null, null, null, null] +38229 - null - [null, null, null, null, null] +38230 - null - [null, null, null, null, null] +38231 - null - [null, null, null, null, null] +38232 - null - [null, null, null, null, null] +38233 - null - [null, null, null, null, null] +38234 - null - [null, null, null, null, null] +38235 - null - [null, null, null, null, null] +38236 - null - [null, null, null, null, null] +38237 - null - [null, null, null, null, null] +38238 - null - [null, null, null, null, null] +38239 - null - [null, null, null, null, null] +38240 - null - [null, null, null, null, null] +38241 - null - [null, null, null, null, null] +38242 - null - [null, null, null, null, null] +38243 - null - [null, null, null, null, null] +38244 - null - [null, null, null, null, null] +38245 - null - [null, null, null, null, null] +38246 - null - [null, null, null, null, null] +38247 - null - [null, null, null, null, null] +38248 - null - [null, null, null, null, null] +38249 - null - [null, null, null, null, null] +38250 - null - [null, null, null, null, null] +38251 - null - [null, null, null, null, null] +38252 - null - [null, null, null, null, null] +38253 - null - [null, null, null, null, null] +38254 - null - [null, null, null, null, null] +38255 - null - [null, null, null, null, null] +38256 - Column - [null, null, null, null, null] +38257 - Column - [null, null, null, null, null] +38258 - Column - [null, null, null, null, null] +38259 - null - [null, null, null, null, null] +38260 - null - [null, null, null, null, null] +38261 - null - [null, null, null, null, null] +38262 - null - [null, null, null, null, null] +38263 - null - [null, null, null, null, null] +38264 - null - [null, null, null, null, null] +38265 - null - [null, null, null, null, null] +38266 - Beacon - [null, null, null, null, null] +38267 - Flames - [null, null, null, null, null] +38268 - null - [null, null, null, null, null] +38269 - null - [null, null, null, null, null] +38270 - null - [null, null, null, null, null] +38271 - null - [null, null, null, null, null] +38272 - null - [null, null, null, null, null] +38273 - null - [null, null, null, null, null] +38274 - null - [null, null, null, null, null] +38275 - null - [null, null, null, null, null] +38276 - null - [null, null, null, null, null] +38277 - null - [null, null, null, null, null] +38278 - null - [null, null, null, null, null] +38279 - Portal - [Enter, null, null, null, null] +38280 - Runes - [null, null, null, null, null] +38281 - null - [null, null, null, null, null] +38282 - null - [null, null, null, null, null] +38283 - null - [null, null, null, null, null] +38284 - null - [null, null, null, null, null] +38285 - null - [null, null, null, null, null] +38286 - null - [null, null, null, null, null] +38287 - null - [null, null, null, null, null] +38288 - null - [null, null, null, null, null] +38289 - null - [null, null, null, null, null] +38290 - null - [null, null, null, null, null] +38291 - null - [null, null, null, null, null] +38292 - null - [null, null, null, null, null] +38293 - null - [null, null, null, null, null] +38294 - null - [null, null, null, null, null] +38295 - null - [null, null, null, null, null] +38296 - null - [null, null, null, null, null] +38297 - null - [null, null, null, null, null] +38298 - null - [null, null, null, null, null] +38299 - null - [null, null, null, null, null] +38300 - null - [null, null, null, null, null] +38301 - null - [null, null, null, null, null] +38302 - null - [null, null, null, null, null] +38303 - null - [null, null, null, null, null] +38304 - null - [null, null, null, null, null] +38305 - null - [null, null, null, null, null] +38306 - null - [null, null, null, null, null] +38307 - null - [null, null, null, null, null] +38308 - null - [null, null, null, null, null] +38309 - null - [null, null, null, null, null] +38310 - null - [null, null, null, null, null] +38311 - null - [null, null, null, null, null] +38312 - null - [null, null, null, null, null] +38313 - null - [null, null, null, null, null] +38314 - null - [null, null, null, null, null] +38315 - Map table - [Study, null, null, null, null] +38316 - Table - [null, null, null, null, null] +38317 - Table - [null, null, null, null, null] +38318 - Table - [null, null, null, null, null] +38319 - Table - [null, null, null, null, null] +38320 - Table - [null, null, null, null, null] +38321 - Workbench - [null, null, null, null, null] +38322 - Bookcase - [Search, null, null, null, null] +38323 - Bookcase - [Search, null, null, null, null] +38324 - Bookcase - [Search, null, null, null, null] +38325 - Tube - [null, null, null, null, null] +38326 - Tube - [null, null, null, null, null] +38327 - Containment unit - [Activate, null, null, null, null] +38328 - Storage unit - [null, null, null, null, null] +38329 - Runestone accelerator - [Activate, null, null, null, null] +38330 - Gyroscope - [Activate, null, null, null, null] +38331 - Glass spheres - [Activate, null, null, null, null] +38332 - Trapdoor - [null, null, null, null, null] +38333 - null - [null, null, null, null, null] +38334 - Map - [Study, null, null, null, null] +38335 - Map - [Study, null, null, null, null] +38336 - null - [null, null, null, null, null] +38337 - null - [null, null, null, null, null] +38338 - null - [null, null, null, null, null] +38339 - null - [null, null, null, null, null] +38340 - null - [null, null, null, null, null] +38341 - null - [null, null, null, null, null] +38342 - null - [null, null, null, null, null] +38343 - null - [null, null, null, null, null] +38344 - null - [null, null, null, null, null] +38345 - null - [null, null, null, null, null] +38346 - null - [null, null, null, null, null] +38347 - null - [null, null, null, null, null] +38348 - null - [null, null, null, null, null] +38349 - null - [null, null, null, null, null] +38350 - null - [null, null, null, null, null] +38351 - null - [null, null, null, null, null] +38352 - Pillar - [null, null, null, null, null] +38353 - Pillar - [null, null, null, null, null] +38354 - Pillar - [null, null, null, null, null] +38355 - Pillar - [null, null, null, null, null] +38356 - Pillar - [null, null, null, null, null] +38357 - Pillar - [null, null, null, null, null] +38358 - Pillar - [null, null, null, null, null] +38359 - Pillar - [null, null, null, null, null] +38360 - Pillar - [null, null, null, null, null] +38361 - Pillar - [null, null, null, null, null] +38362 - Pillar - [null, null, null, null, null] +38363 - Pillar - [null, null, null, null, null] +38364 - null - [null, null, null, null, null] +38365 - null - [null, null, null, null, null] +38366 - null - [null, null, null, null, null] +38367 - null - [null, null, null, null, null] +38368 - null - [null, null, null, null, null] +38369 - null - [null, null, null, null, null] +38370 - null - [null, null, null, null, null] +38371 - null - [null, null, null, null, null] +38372 - null - [null, null, null, null, null] +38373 - null - [null, null, null, null, null] +38374 - null - [null, null, null, null, null] +38375 - null - [null, null, null, null, null] +38376 - null - [null, null, null, null, null] +38377 - Barrier - [Pass-through, Destroy, null, null, null] +38378 - Barrier - [Pass-through, Destroy, null, null, null] +38379 - Tree - [null, null, null, null, null] +38380 - Tree - [null, null, null, null, null] +38381 - Oak - [null, null, null, null, null] +38382 - Dead tree - [null, null, null, null, null] +38383 - Dead tree - [null, null, null, null, null] +38384 - null - [null, null, null, null, null] +38385 - null - [null, null, null, null, null] +38386 - null - [null, null, null, null, null] +38387 - null - [null, null, null, null, null] +38388 - null - [null, null, null, null, null] +38389 - null - [null, null, null, null, null] +38390 - null - [null, null, null, null, null] +38391 - null - [null, null, null, null, null] +38392 - null - [null, null, null, null, null] +38393 - null - [null, null, null, null, null] +38394 - null - [null, null, null, null, null] +38395 - null - [null, null, null, null, null] +38396 - null - [null, null, null, null, null] +38397 - null - [null, null, null, null, null] +38398 - null - [null, null, null, null, null] +38399 - null - [null, null, null, null, null] +38400 - null - [null, null, null, null, null] +38401 - null - [null, null, null, null, null] +38402 - null - [null, null, null, null, null] +38403 - null - [null, null, null, null, null] +38404 - null - [null, null, null, null, null] +38405 - null - [null, null, null, null, null] +38406 - null - [null, null, null, null, null] +38407 - null - [null, null, null, null, null] +38408 - null - [null, null, null, null, null] +38409 - null - [null, null, null, null, null] +38410 - null - [null, null, null, null, null] +38411 - null - [null, null, null, null, null] +38412 - null - [null, null, null, null, null] +38413 - null - [null, null, null, null, null] +38414 - null - [null, null, null, null, null] +38415 - null - [null, null, null, null, null] +38416 - null - [null, null, null, null, null] +38417 - null - [null, null, null, null, null] +38418 - null - [null, null, null, null, null] +38419 - null - [null, null, null, null, null] +38420 - Pillar - [null, null, null, null, null] +38421 - Map - [Study, null, null, null, null] +38422 - Map - [Study, null, null, null, null] +38423 - null - [null, null, null, null, null] +38424 - Painting - [null, null, null, null, null] +38425 - null - [null, null, null, null, null] +38426 - null - [null, null, null, null, null] diff --git a/dumps/530/530_interface_names.txt b/dumps/530/530_interface_names.txt new file mode 100644 index 000000000..8013a2693 --- /dev/null +++ b/dumps/530/530_interface_names.txt @@ -0,0 +1,760 @@ +0 100guide_eggs_overlay +1 100guide_flour_overlay +2 100guide_inv_flour +3 100guide_milk_overlay +4 tog_water_bowl +5 agilityarena_overlay +6 agilityarena_trade +7 ahoy_blackout +8 ahoy_islandmap +9 ahoy_runedraw +10 ahoy_windspeed +11 bank_deposit_box +13 bankpin_main +14 bankpin_settings +15 banner_padlock_keys +16 banner_anti_virus +21 banner_scamming +22 banner_security +23 banner_xmas +24 barrows_overlay +25 barrows_puzzle +26 fancy_book +27 fancy_book_2 +28 blast_furnace_bar_stock +29 blast_furnace_plan_scroll +30 blast_furnace_temp_gauge +31 boardgames_challenge +32 boardgames_draughts +33 boardgames_draughts_options +34 boardgames_draughts_overlay +35 boardgames_draughts_view +36 boardgames_runelink +37 boardgames_runelink_options +38 boardgames_runelink_overlay +39 boardgames_runelink_view +40 boardgames_runesquares +41 boardgames_runesquares_options +42 boardgames_runesquares_overlay +43 boardgames_runesquares_view +44 boardgames_runeversi +45 boardgames_runeversi_options +46 boardgames_runeversi_overlay +47 boardgames_runeversi_view +48 bob_locator_amulet +49 fancy_book_3 +50 brooch +51 burgh_map +52 canoe +53 canoe_stations_map +54 castlewars_catapult +55 castlewars_score +56 castlewars_shopside +57 castlewars_status_overlay +58 castlewars_status_overlay_saradomin +59 castlewars_status_overlay_zamorak +60 castlewars_trade +61 cat_naming +62 cave_goblin_markers +63 champions_scroll +64 chat1 +65 chat2 +66 chat3 +67 chat4 +68 chat_np1 +69 chat_np2 +70 chat_np3 +71 chat_np4 +72 Cheese churning? +73 Cheese and butter churning? +74 Churn cream, churn butter, churn cheese +75 borderless-attack-styles +76 same but hammers +77 same but bows +78 same but claws +79 bows again +80 aim and fire or kick +81 slash chop etc +82 2h +83 pickaxe +84 halberd +85 staff with no cast options +86 reap chop jab +87 spear +88 mace +89 stab slash lunge block +90 staff with autocast +91 darts or knives +93 whip +94 confirm_destroy +95 sailing_transport_world_map +96 darkness_dark +97 darkness_light +98 darkness_medium +99 death_dice +100 deep_blue +101 scroll with blood +102 items kept on death +103 pattern_next +104 star charts +105 stockmarket +106 GE tutorial +107 stockside +108 GE tutorial confirm offer +109 stockcollect +110 ge tutorial buy offer +111 dwarf_rock_book +112 dwarf_rock_cannon +113 dwarf_rock_schematics +114 dwarf_rock_schematics_control +115 fade to black +116 scroll with title +117 enakh_film +118 enakh_smoke_overlay +119 fade to black v2 +120 fade_to_black +121 fade_to_light_blue +122 fade_to_white +123 fairy_certificate +124 symptoms list fairy queen +125 farming_tools +126 farming_tools_side +127 favour_keyring +128 junction map +129 junction map 2 +130 junction map 3 +131 doubleobjbox +132 garden_list +133 garden_quiz +134 stat advancement interface +135 aide_compass +136 "Both" +137 chatdefault +138 glidermap +139 gnomeball +140 Select an Option +141 coffin with grave +142 horror_metaldoor +143 grave digger item +144 hauntedmine_controls +145 RFD miniquest list +146 spinning black hole +147 golden puzzle +148 Select an option at the top +149 inventory +150 keldagrim_map +151 keldagrim_story1 +152 keldagrim_titles +153 aide_death +154 leather_crafting +155 legends_mirror +156 scroll_with_title +157 quickchat_tutorial +158 spining black hole part 2 +159 hand builder? +160 rocko_kittens +161 smki_assignment +162 black hole but it fades this time +163 smki_learn +164 smki_buy +165 smki_smoke_overlay +166 rocko_cannonball +167 rocko_underwater +168 rocko_seagull +169 puro puro interface +170 fade_from_black +171 fade black-to-white +172 coin slot? +173 chatlarge +174 wom_scroll +175 heat_overlay +176 white box in chat box +177 fade_from_white +178 light2 +179 light_blue +180 lightning_flash +181 rotate mirror +182 logout +183 history of the goblin race +184 is this a... +185 macro_combilock +186 macro_evil_bob +187 music_v3 +188 macro_mime_emotes +189 lockpicking? +190 shape 1 shape 2 shape 3 +191 macro_quizshow +192 magic +193 magic_zaros +194 mta points +195 enchantment pizazz poitns +196 magictraining_grave +197 magictraining_shop +198 magictraining_tele +199 hardresser beard +200 Yrsa's Shoe Store confirm (500 gold) +201 Thessalia's legs +202 thesallia's torso +203 hardresser female +204 hairdresser male +205 skin color & gender +206 thesallia's legs again +207thesallia's torso again +208 blank black screen +209 mazetimer +210 message1 +211 message2 +212 message3 +213 message4 +214 message5 +215 message_np1 +216 message_np2 +217 message_np3 +218 message_np4 +219 message_np5 +220 messagescroll +221 messagescroll2 +222 blank scroll +223 peng_emote +224 misc_shipjourney +225 mm_message +226 mole_mud +227 mourning_deathalter_list +228 multi2 +229 multi2_chat +230 multi3 +231 multi3_chat +232 multi4 +233 multi4_chat +234 multi5 +235 multi5_chat +236 multivar2 +237 multivar4 +238 multivar5 +239 engineer claus mousetrap +240 joystick with button +241 npcchat1 +242 npcchat2 +243 npcchat3 +244 npcchat4 +245 npcchat_np1 +246 npcchat_np2 +247 npcchat_np3 +248 npcchat_np4 +249 surok_letter1 +250 surok_letter2 +251 beacon ring instructions -zaff +252 olaf2_lock_gate +253 olaf2_skull_puzzle +254 olaf2_treasuremap +255 blank tattered scroll +256 team list +257 white flash and fade +258 train passing camera +259 area_task +260 dream_armour +261 options +262 attach/detach pipe +263 pinball_interface +264 paint_cannon +265 clanwars_overlay +266 sing --- +267 pest_rewards +268 glowing box +269 buttons cogs pinion counter 20 +270 newcomer map? +271 prayer +272 priestperil_gravemonument +273 prisonpete +274 questjournal_v2 +275 questjournal_scroll +276 blank +277 quest comletion scroll +278 ranging guild ticket exchange +279 cat fight +280 do you really want to bet x? +281 cat hp meters +282 ratcatcher_flute +283 ratcatcher_flute_music +284 ratcatcher_overlay +285 rd_combolock +286 regicide_still +287 grid on table? +288 rogue trader rune sudoku +289 another rune thing with open casket +290 roguesden_dials +291 roguesden_gear_select +292 roguesden_gears +293 roguesden_puzzle +294 rum deal bob yarn +295 rum_deal_title +296 sandstorm +297 sandwich lady +298 seer_combolock +299 ship travel +300 smithing_new +301 xp assist system +302 scroll with gold badge +303 what would you like to make +304 same +305 same +306 same +307 skill_cookmany +308 lotr_scroll +309 skill_multi1 +310 slayer_staff_spells +311 smelting +312 goblinch +313 smokeoverlay +314 blank chatbox +315 soulbane_angerbar +316 soulbane_cut +317 soulbane_darkness +318 soulbane_scare +319 staff_spells +320 stats +321 swamp_boatjourney +322 swamp_boatjourney_back +324 tanner +325 target +326 teleport_other +327 cws_warning_11 +328 temple_screen +329 templetrek_map +330 safe with lock +331 combo for lock note +332 staff enchanting +333 black screen +334 tradeconfirm +335 trademain +336 tradeside +337 tral_map001 +338 trail_map002 +339 tral_map003 +340 trail_map004 +341 trail_map005 +342 trail_map006 +343 trail_map007 +344 trail_map008 +345 trail_cluelong +346 trail_map01 +347 trail_map02 +348 trail_map03 +349 trail_map04 +350 trail_map05 +351 trail_map06 +352 trail_map07 +353 trail_map08 +354 trail_map09 +355 trail_map10 +356 trail_map11 +357 trail_map12 +358 trail_map13 +359 trail_map14 +360 trail_map15 +361 trail_map16 +362 trail_map17 +363 trail_puzzle +364 trail_reward +365 trail_sextant +366 trawler_overlay +367 trawler_reward +368 trawler_start +369 combination lock door +370 snow +371 tutorial_progress +372 tutorial_text +373 tzhaar_fightpit +374 fight pits spectator +375 unmorph +376 something with water and coins +377 Tai Bwo Bwannai favor +378 welcome_screen +379 werewolf_goal +380 welcome_final_tex +381 wilderness_overlay +382 wilderness_warning +383 pick a colour +384 womscroll +385 cracked screen +386 wom_telescope +387 wornitems +388 ancients +389 objdialog +390 show riddle with furniture +391 kingdoms of misc +392 resources collected misc +393 poh_hangman +394 furniture creation menu +395 green flash in chatbox +396 furniture creation menu 2 +397 furniture creation menu fancy +398 poh_house_options +399 home loading screen +400 poh_magic_tablets +401 poh_ranging +402 room build screen +403 poh_sawmill +404 poh_scrying_pool +405 banner_poh +406 pest_mace +407 pest_lander_overlay +408 pest_status_overlay +409 mcannon_interface +410 warguild_defence +411 warguild_defence_mini +412 warguild_dummy +413 brew_telescope_overlay +414 brew_game_over +415 brew_overlay +416 brew_worktable +417 brew_tools +418 castle wars players waiting +419 accessory combiner +420 bee house +421 tutorial_text2 +422 dark and pulsating red +423 fairy2_certificate_broken +424 fairy2_message +425 fair_wall_plaque +426 falling snow? +427 scroll_godfather +428 ntk_overlay +429 Choose a character??? +430 magic_lunar +431 ship circling pirate cove +432 xbows_enchant_bolt +433 xbows_pouch +434 gnome battas +435 gnome bowls +436 gnome cocktails +437 gnome crunchies +438 crafting_silver_casting +439 banners moving on map and colliding +440 certificate of qualification earth sciences +441 earth sciences 2 +442 coin slot +443 multicolor box stack +444 earch sciences 3 +445 openurl +446 crafting_gold +447 banner_chatheads +448 brain_water_overlay +449 nothing +450 light coming in from left side of screen +451 multivar3 +452 myq3_statue_painting +453 myq3_blackout +454 myq3_boat_map +455 scroll with tower on it +456 scroll with towers 2nd half +457 more towers +458 select an option +459 crafting_spinning +460 green overlay with X +461 seaslug_boat_travel +462 idk control panel of some kidn piece 1 piece 2 piece 3 +463 kings_letter_v2 +464 emotes +465 ooglog ogress opens health spa +466 switch diagram +467 menu with big buttons +468 diango item return +469 zep_balloon_map +470 zep_interface +471 zep_interface_side +472 hot air balloon diagram +473 chinchompa attack options +474 salamander attack options +475 chins again +476 salamanders again +477 custom fur clothingclothin +478 imp release negotiation form +479 weird tubes bro +480 anma_rgb +481 thicc snow +482 less thicc snow +483 back to thicc snow +484 barbassault_horn +485 barbassault_over_att +486 barbassault_over_col +487 barbassault_over_def +488 barbassault_over_heal +489 players in room attackers defenders etc +490 barbassault_playerstat +491 barbassault_reward_shop +492 barb assault role accept +493 barb assault role select +494 barbassault_timer_overlay +495 barbassault_turret +496 barbassault_tutorial +497 barbassault_wavecomplete +498 contact_scroll_blood +499 skill_guide_v2 +500 medallion with a $ on it +501 box with cannonball ramrod etc +502 box with rope hammer nails plank +503 clockwork mechanism, chapter 1.0 +504 peeking through planks +505 map of rellekka and others +506 jester controls +507 poh_hangman_german +508 tol_homonculus_overlay +509 tol_cage_puzzle +510 tol_pressure_machine +511 tol_pipe_machine +512 inventory_ranging +513 inventory_wear +514 brain_cat_overlay +515 brain_gas_overlay +516 black +517 turn off black +518 old follower inv? +519 objbox +521 dream_cyrisus +522 dream_monster_stat +523 dream_player_stats +524 dream_title +525 half a scroll +526 the full scroll +527 vm_museum_map +528 vm_digsite +529 other half of scroll +530 whiteb ook +531 VTAM +532 vm_kudos +533 display number 03 +534 vm_timeline +535 piano +536 shrink-me-quick recipe +537 piano instructions +538 grim_tasklist +539 noexit +540 impling exchange +541 flash to white +542 crafting_glass +543 dragon_slayer_qip_clouds +544 dragon_slayer_qip_cr_journey +545 dragon_slayer_qip_elvarg +546 dragon_slayer_qip_elvarg_fly +547 dragon_slayer_qip_map +548 toplevel +549 toplevel_full +550 friends2 +551 ignore2 +552 telescope +553 snapshot_main +554 select an option +555 nothing +556 nothing +557 multi2_mes +558 skill_multi6 +559 pattern_cards +560 cws_warning_9 +561 cws_warning_21 +562 cws_warning_2 +563 cws_warning_5 +564 cws_warning_23 +565 cws_warning_10 +566 cws_warning_6 +567 cws_warning_14 +568 cws_warning_3 +569 cws_warning_16 +570 cws_warning_17 +571 cws_warning_19 +572 cws_warning_13 +573 cws_warning_12 +574 cws_warning_1 +576 cws_warning_8 +577 cws_warning_18 +578 cws_warning_15 +579 cws_warning_4 +580 cws_warning_20 +581 cws_warning_24 +582 skill_multi1_small +583 cws_doomsayer +584 kr_king_statue +585 kr_pyramid_escape +588 kr_picklock +589 clanjoin +590 clansetup +591 Thessalias Makeovers +592 Hairdressers salon +593 Reinalds Smithing Emporium +594 Thessalias Makeovers +595 Reinalds Smithing Emporium +596 Hairdressers salon +597 godwars kill count +598 godwars kill count +599 godwars kill count +600 cws_warning_25 +601 godwars_overlay +602 nothing +603 pulsating ball in hand +604 map with banners +605 peer into cabinet +606 hatching ball +607 putting up posters +608 spinning spirit tree +609 taking down left poster +610 slide to left +611 show posters +612 nothing +613 hand with slots +614 posters with background +615 zoom in on gnome king +616 map with banners +617 bolrie's diary +618 left poster missing +619 pay bank charge with... +620 shop_template +621 shop_template_side +622 banner_group +623 banner_group_assist +624 fairy ring power relay +625 select your goblin +626 duel stake windows +627 cws_warning_26 +628 duel2_side +629 tournament value +630 fucking slot machine hand +631 stacke windows +632 duel2_scoreboard +633 you are victorious +634 victorious but with money +635 nothing +636 tournament rules +637 duel confirmation +638 duel2_challengeoverlay +639 more duel windows +640 duel2_select_type +641 tournament overlay +642 logs item costs +643 exchange_history +644 exchange_sets_side +645 exchange_itemsets +646 exchange_sand_timer +647 falador party chest +648 no tabs +649 clanwars_viewing_orb +650 cws_warning_30 +651 bork i think? +652 gravestone_shop +653 bounty_overlay +654 bounty hunters leaderboard +655 rogues leaderboard +656 bounty_overlay_waiting +657 bounty_warning +658 snowman hat +659 snowglobe lumbridge +660 white circle +661 runes must be in sets of three +662 lore_stats_side +663 lore_cats_side +664 bash focus summon +665 lore_bank_side +666 summoning creation screen +667 equip_screen2 +668 pick a puppy +669 pouch creation +670 inventory_wear2 +671 lore_bank +672 pouch creation again +673 scroll creation again +674 tutorial2_mesbox +675 mould selection +676 cws_warning_27 +677 cws_warning_28 +678 cws_warning_29 +679 banner_summoning +680 triangle at the bottom of screen +681 catapult builder +682 fire catapult +683 catapult viewer control panel +684 rabbit_tutorial +685 Vinesweeper instructions +686 rabbit_shop +687 vinesweeper_tutorial +688 vinesweeper_tutorial_2 +689 rabbit_overlay +690 vinesweeper_tutorial_3 +691 things crawling out of the ground +692 actually bork +693 congrats you have slain bork +694 player safety test +695 naught gublinchette +696 p safety 2 +697 p safety 3 +698 gublinch again +699 p safety 4 +700 report abuse +701 gublinc again again again again +702 more gublinc +703 gublinccc +704 p safety 6 +705 p safety 7 +706 fuck this +715 banner_easter08 +722 summoning_side +723 carpet_info +724 carpet_runesquares +725 carpet_runelink +726 carpet_runeversi +727 carpet_draughts +728 carpet_main +729 carpet_ticket +742 graphics_options +743 sound_options +744 loginscreen +745 statusicons +746 toplevel_fullscreen +747 topstat_lore +748 topstat_hitpoints +749 topstat_prayer +750 topstat_run +751 filterbuttons +752 chattop +754 pmchat +755 worldmap +756 boardgames_options +757 npcchatlarge +758 canoe_travel +760 tutorial2_objbox +762 bank_v2_main +763 bank_v2_side +765 tutorial2_switch_task +766 tutorial2_death +767 bank_v2_help +769 tutorial2_text +778 rcguild_side +779 rcguild_rewards +780 rcguild_map +781 rcguild_overlay +783 crcs_tightrope +784 crcs_side +785 crcs_rewards +786 crcs_equipment +788 crcs_scoreboard +790 clanwars_end +791 clanwars_setup +792 clanwars_setup_side +800 banner_halloween +801 quickchat_locked +802 sc_tutorial_overlay +803 sc_scores_border +805 sc_item_transfer +806 sc_remaining_clay +810 sc_scores +811 sc_reward_shop +813 sc_processing +814 luc2_chapter2 +816 luc2_telescope_view +822 luc2_chapter3 +826 luc2_chapter1 +827 luc2_lucien_projectiles +828 journal with map? +829 Goblin language further access prohibited +830 drawings on ice +831 drawings on ice again +832 again +833 again ALL SEEM TO BE FOR BARB ASSAULT diff --git a/dumps/530/530_npcs_after_498 b/dumps/530/530_npcs_after_498 new file mode 100644 index 000000000..00011b4b6 --- /dev/null +++ b/dumps/530/530_npcs_after_498 @@ -0,0 +1,269 @@ +7774 Skeleton +7775 Skeleton +7776 Skeleton +7777 Skeleton +7778 Skeleton +7779 null +7780 Sumona +7781 Jesmona +7782 Catolax +7783 null +7784 null +7785 Ali Cat +7786 Mighty banshee +7787 Cave crawler +7788 Skeleton +7789 Zombie +7790 Zombie +7791 Zombie +7792 Zombie +7793 Banshee mistress +7794 Banshee mistress +7795 Insectoid assassin +7796 Insectoid assassin +7797 Kurask overlord +7798 Monstrous cave crawler +7799 Basilisk boss +7800 Mightiest turoth +7801 Aberrant spectre +7802 Aberrant spectre +7803 Aberrant spectre +7804 Aberrant spectre +7805 Kurask minion +7806 Mummy warrior +7807 Mummy warrior +7808 Mummy warrior +7809 Cat +7810 Banshee +7811 Kurask +7812 Cave crawler +7813 Basilisk +7814 Turoth +7815 Skeleton +7816 Master +7817 Zombie +7818 Zombie +7819 Zombie +7820 Zombie +7821 A wanderer. +7822 A wanderer. +7823 Wall beast +7824 Osman +7825 50 Ships Mufassah +7826 Karamthulu +7827 Karamthulu +7828 Giant lobster +7829 Giant crab +7830 Customs sergeant +7831 Customs sergeant +7832 Young Ralph +7833 Young Ralph +7834 Young Ralph +7835 Young Ralph +7836 Young Ralph +7837 Customs officer +7838 Customs officer +7839 Customs officer +7840 Heavy-Handed Harry +7841 Player +7842 Locker Officer +7843 Locker Officer +7844 Ex-ex-parrot +7845 Pirate impling +7846 Pirate impling +7847 Captain Rabid Jack +7848 Jack +7849 Bosun Giles +7850 Pirate +7851 Lizzie +7852 Cap'n Izzie No-beard +7853 Ralph +7854 Brass Hand Harry +7855 Bill Teach +7856 Pirate +7857 Brass Hand Harry +7858 Karamthulu +7859 Young Ralph +7860 Gull +7861 Jack +7862 Fishing spot +7863 Fishing spot +7864 Fishing spot +7865 Guardsman Dante +7866 Guardsman DeShawn +7867 Guardsman Brawn +7868 Iain +7869 Julian +7870 Lachtopher +7871 Samuel +7872 Victoria +7873 Man +7874 Man +7875 Man +7876 Man +7877 Man +7878 Man +7879 Man +7880 Woman +7881 Woman +7882 Woman +7883 Woman +7884 Woman +7885 Guardsman Dante +7886 Guardsman DeShawn +7887 Guardsman Brawn +7888 Sergeant Abram +7889 Guardsman Pazel +7890 Guardsman Peale +7891 Melee dummy +7892 General Wartface +7893 General Bentnoze +7894 null +7895 General Wartface +7896 null +7897 General Wartface +7898 Afflicted(Ulsquire) +7899 Afflicted(Razmire) +7900 Loar Shadow +7901 Loar Shadow +7902 Sergeant Abram +7903 Guardsman Pazel +7904 Guardsman Peale +7905 Barricade guard +7906 Barricade guard +7907 Barricade guard +7908 Barricade guard +7909 Barricade guard +7910 Barricade guard +7911 Barricade guard +7912 Border guard +7913 Iain +7914 Julian +7915 Lachtopher +7916 Samuel +7917 Victoria +7918 Man +7919 Man +7920 Man +7921 Man +7922 Man +7923 Man +7924 Man +7925 Woman +7926 Woman +7927 Woman +7928 Woman +7929 Lumbridge Guide +7930 Doomsayer +7931 Donie +7932 Gee +7933 Duke Horacio +7934 Sigmund +7935 Hans +7936 Cook +7937 Father Aereck +7938 Sir Vant +7939 Sir Vant +7940 Sir Vant +7941 Sir Vant +7942 Sir Vant +7943 Dragon +7944 Dragon +7945 Dragon +7946 Dragon +7947 Dragon +7948 Dragon +7949 Lumbridge Guide +7950 Melee tutor +7951 Ranged tutor +7952 Magic tutor +7953 Cooking tutor +7954 Crafting tutor +7955 Fishing tutor +7956 Mining tutor +7957 Prayer tutor +7958 Smelting tutor +7959 Smithing tutor +7960 Woodcutting tutor +7961 Bank tutor +7962 Gee +7963 Spirit +7964 Goblin +7965 Goblin +7966 Chaos druid +7967 Shopkeeper +7968 null +7969 Explorer Jack +7970 Smithing tutor +7971 Mining tutor +7972 null +7973 null +7974 null +7975 null +7976 Spirit +7977 Spirit +7978 Spirit +7979 Spirit +7980 Spirit +7981 Spirit +7982 Spirit +7983 Spirit +7984 Spirit +7985 +7986 Summer Bonde +7987 Spirit +7988 Spirit +7989 Erik Bonde +7990 Spirit +7991 Jallek Lenkin +7992 Spirit +7993 Meranek Thanatos +7994 Ghostly warrior +7995 Spirit beast +7996 Spirit beast +7997 Spirit beast +7998 Ghost +7999 Ghost +8000 Goth Leprechaun +8001 null +8002 Jack +8003 Sarah +8004 Laura +8005 Laura +8006 Roger +8007 Jorral +8008 Guthix +8009 Max the traveller +8010 Man +8011 Man +8012 Woman +8013 Woman +8014 Haluned +8015 Jack +8016 Baby Sarah +8017 Snowy +8018 Roger +8019 Portal +8020 Portal +8021 Yellow orb +8022 Yellow orb +8023 Yellow orb +8024 Yellow orb +8025 Green orb +8026 Green orb +8027 Green orb +8028 Green orb +8029 Wizard Korvak +8030 Wizard Vief +8031 Wizard Acantha +8032 Wizard Elriss +8033 Wizard +8034 Wizard +8035 Wizard +8036 Wizard +8037 Wizard +8038 Wizard +8039 Wizard +8040 Wizard +8041 Imiago +8042 Squire Fyre diff --git a/dumps/530/animations b/dumps/530/animations new file mode 100644 index 000000000..93aed80c7 --- /dev/null +++ b/dumps/530/animations @@ -0,0 +1,2755 @@ +anim 3 - Look side to side +anim 5 - Cooking on range +anim 13 - Old ghost walk +anim 15 - Old ghost stand +anim 37 - Hammering object +anim 38 - Mending Burst Pipe (Artisan’s Workshop) +anim 39 - Hammering object (advanced) +anim 40 - Hammering ground +anim 41 - Standing with hammer +anim 42 - Hammering object +anim 45 - Joining bonfire, then leaving. +anim 70 - Walking with right arm down and leaning slightly. +anim 71 - Holding onto something, pushing, or leaning on something while breathing hard. +anim 72 - Mining with Gilded Rune Pickaxe +anim 74 - Mining with Gilded Bronze Pickaxe +anim 75 - Mining with Gilded Steel Pickaxe +anim 76 - Mining with Gilded Iron Pickaxe +anim 77 - Mining with Gilded Mithril Pickaxe +anim 78 - Mining with Gilded Adamant Pickaxe +anim 87 - Border Guard Holding Axe +anim 88 - Border Guard Lifts Axe +anim 108 - Mining and struggling with Gilded Dragon Pickaxe +anim 111 - Mining and struggling with Gilded Rune Pickaxe +animGFX 122 1471 - Classic Cape (emote) (e) +anim 132 - Mining and struggling with Gilded Bronze Pickaxe +anim 133 - Mining and struggling with Gilded Steel Pickaxe +anim 134 - Mining and struggling with Gilded Iron Pickaxe +anim 135 - Mining and struggling with Gilded Mithril Pickaxe +anim 148 - Mining and struggling with Gilded Rune Pickaxe +anim 151 - Pulling Christmas Cracker +anim 157 - Mining and struggling with Gilded Dragon Pickaxe +anim 158 - One Hammer hit +anim 159 - One Hammer hit +anim 160 - One Sacred Clay hammer hit +anim 161 - One Sacred Clay hammer hit +anim 173 - Use Bull-Roarer (Legend’s Quest) +anim 210 - One Sacred Clay Hammer hit +anim 226 - On floor holding legs as if hurt +anim 227 - Limping (DR-1622) +anim 228 - Limping walk (DR-1622) +anim 230 - One Sacred Clay hammer hit +anim 231 - One Golden hammer hit +anim 233 - One Golden hammer hit +anim 234 - Rock Mining and struggling with Gilded Bronze Pickaxe +anim 235 - Rock Mining and struggling with Gilded Steel Pickaxe +anim 236 - Rock Mining and struggling with Gilded Iron Pickaxe +anim 237 - Rock Mining and struggling with Gilded Adamant Pickaxe +anim 238 - Rock Mining and struggling with Gilded Mithril Pickaxe +anim 249 - Rock Mining and struggling with Gilded Rune Pickaxe +anim 250 - Rock Mining and struggling with Gilded Dragon Pickaxe +anim 251 - Rock Mining and struggling with Gilded Bronze Pickaxe +anim 252 - Rock Mining and struggling with Gilded Steel Pickaxe +anim 253 - Rock Mining and struggling with Gilded Iron Pickaxe +anim 269 - Rock Mining and struggling with Gilded Mithril Pickaxe +anim 270 - Rock Mining and struggling with Gilded Adamant Pickaxe +anim 271 - Rock Mining and struggling with Gilded Rune Pickaxe +anim 272 - Rock Mining and struggling with Gilded Dragon Pickaxe +anim 273 - Mining and struggling with Gilded Rune Pickaxe +anim 282 - Mining and struggling with Gilded Bronze Pickaxe +anim 294 - Mining and struggling with Gilded Steel Pickaxe +anim 295 - Mining and struggling with Gilded Iron Pickaxe +anim 297 - Mining and struggling with Gilded Adamant Pickaxe +anim 308 - Mining and struggling with Gilded Mithril Pickaxe +anim 316 - Idle Animation (DR-2025) +anim 317 - Duellist Cap Brag (Version One) (T1) +anim 318 - Duellist Cap Brag (Version Two) (T2) +anim 329 - Salty Claws Hat Dance (e) +anim 330 - Magic Carpet flight +anim 331 - Magic Carpet landing +anim 346 - Sitting with hands behind back +anim 347 - Sitting while casting a spell +animGFX 352 1446 - Veteran’s Cape Emote (5 Years) +animGFX 356 307 - Completionist Cape (Begin) (Turn into Dragon) (NPC-ID: 1830) +animGFX 361 122 - Wildstalker Helmet Brag (Version Three) +anim 363 - Mix potion +anim 364 - Pestle mortar +anim 365 - Potion explosion (Glitched on RS3) +anim 376 - Attack +anim 377 - Attack +anim 378 - Defend +anim 380 - Attack +anim 381 - Stab Attack +anim 382 - Stab Attack +anim 383 - Defend +anim 385 - Tramp Throw Rotten Tomato (Projectile GFX 29) (Tile GFX 31) +anim 386 - Stab attack +anim 387 - Defend +anim 388 - Defend +anim 389 - Ice Warrior Defend +anim 390 - Attack +anim 391 - Ice Warrior Attack (transparent) +anim 393 - Auto Attack with Claws (Legacy) +anim 394 - Attack transparent +anim 395 - Attack +anim 396 - Dagger attack +anim 397 - Defend With Claws (Legacy) +anim 398 - Defend +anim 399 - Defend transparent +anim 400 - Attack +anim 401 - Mace Auto Attack (Legacy) +anim 403 - Defend with Mace (Legacy) +anim 404 - Defend with Mace and Shield +anim 406 - Attack with 2H Sword +anim 409 - Marion Polishing Her Trophy at the Bar +anim 410 - Attack with 2H Sword +animGFX 412 121 - Wildstalker Helmet Brag (Version Two) +anim 413 - Moving arms to the side while holding staff? +anim 414 - Attack with Staff (IE Mourner in West Ardy) +anim 415 - Defend Holding Staff (IE Mourner in West Ardy) +anim 416 - Sticking arm out, as if holding a staff for a few seconds +anim 419 - Attack with staff? +anim 420 - Defend +anim 421 - Lunge attack (or rolling a ball?) +anim 422 - Punch +anim 423 - Kick +anim 424 - Defend unarmed +anim 425 - Defend +anim 426 - Fire bow +anim 428 - Attack with Spear +anim 429 - Attack melee with Spear +anim 430 - Defend with 2H Spear +anim 431 - Defend with Spear +anim 433 - Attack +anim 434 - Defend +anim 435 - Defend +anim 436 - Candle Seller Idle (NPC-ID 1834) (DR-1978) +anim 437 - Attack +anim 438 - Attack +anim 440 - Attack +animGFX 442 23 - Climbing Falador Wall With Grapple +animGFX 445 56 - Spread ashes +anim 451 - Pick something off ground +anim 471 - Holding arm out (Border guard?) +anim 473 - Finish Monkey bars +anim 482 - Climb onto monkey bar +anim 483 - Climb across monkey bar +anim 484 - Fire crossbow +anim 487 - Fletch something? +animGFX 507 91 - Duellist Cap Brag (Version Two) (T1) +animGFX 508 91 - Duellist Cap Brag (Version Two) (T2) +animGFX 509 91 - Duellist Cap Brag (Version Two) (T3) +animGFX 510 91 - Duellist Cap Brag (Version Two) (T4) +animGFX 511 91 - Duellist Cap Brag (Version Two) (T5) +animGFX 512 92 - Duellist Cap Brag (Version Three) (T1) +animGFX 513 92 - Duellist Cap Brag (Version Three) (T2) +anim 528 - Whirlpool +anim 529 - Cover head with hands +animGFX 530 92 - Duellist Cap Brag (Version Three) (T3) +animGFX 531 92 - Duellist Cap Brag (Version Three) (T4) +animGFX 532 92 - Duellist Cap Brag (Version Three) (T5) +animGFX 533 92 - Duellist Cap Brag (Version Three) (T6) +anim 534 - Wildstalker Helmet Brag (Version One) +anim 535 - Open PoH Wardrobe +anim 536 - Open Chest +anim 537 - Putting Object on Table +anim 538 - Take something from chest +anim 539 - Close chest +anim 540 - Crawl into Lumbridge Swamp Dungeon Tree +anim 541 - Close Wardrobe +anim 542 - Open Wardrobe +anim 545 - Open Wardrobe +anim 546 - Estocada Idle (DR-683) (NPC-ID 3670) +anim 547 - Dagger attack? +anim 550 - Dagger attack? +anim 551 - Dagger attack? +anim 552 - Mr. Ex Idle (DR-689) (NPC-ID 3709) +anim 553 - Swipe attack +anim 582 - Throw dart +anim 618 - Harpoon fishing +anim 619 - Lobster cage fishing +anim 620 - Net fishing +anim 621 - Net fishing +anim 622 - Rod Fishing +anim 623 - Rod fishing +anim 624 - Mining with Rune Pickaxe +anim 625 - Mining with Bronze Pickaxe +anim 626 - Mining with Iron Pickaxe +anim 627 - Mining with Steel Pickaxe +anim 628 - Mining with Adamant Pickaxe +anim 629 - Mining with Mithril Pickaxe +anim 642 - Step back startled +anim 645 - Praying at altar/gravestone +anim 654 - Getting on magic carpet +anim 661 - Hands Together [Banker Idle (DR-2026) (NPC-ID 4456)] +anim 691 - Banker Idle (DR-2026) (NPC-ID 4456) +anim 692 - Banker Idle (DR-2028) (NPC-ID 4458) +anim 707 - Cast Spell? +anim 708 - Iban staff +anim 709 - Hands Together +anim 710 - Cast Spell (Wise Old Man uses it) +anim 711 - Cast Spell +animGFX 711 108 - Casting Spell +anim 712 - Old Low Alchemy +anim 713 - Old High Alchemy +animGFX 716 102 - Casting Weaken +anim 717 - Cast Spell +anim 718 - Cast Spell +anim 719 - Raise one hand in air, raise other to the side (Enchant Jewelry?) +anim 720 - Raise one hand in air, raise other to the side (Enchant Jewelry?) +anim 721 - Raise one hand in air, raise other to the side (Enchant Jewelry?) +anim 722 - Raise one hand in air, raise other to the side (Enchant Jewelry?) +anim 723 - Stick both arms in air, pointing upwards +anim 724 - Cast spell/push +anim 727 - Idle (Brushing knees) +anim 728 - Cast a spell +anim 729 - Cast a spell +anim 733 - Tinderbox +anim 734 - Thrown back (Like with the Fire Wall in Legends Quest) +anim 735 - In air while being thrown back (Like with the Fire Wall in Legends Quest) +anim 736 - Land on bottom (Like with the Fire Wall in Legends Quest) +anim 737 - Climbing wall +anim 738 - Climbing wall +anim 739 - Climbing down wall +anim 740 - Climbing down wall +anim 741 - Jump short gap (Has sound effect) +anim 742 - Jump up to grab monkey bars +anim 743 - Finish crossing monkey bars +anim 744 - Crossing monkey bars +anim 745 - Holding on to monkey bar +anim 746 - Idle +anim 748 - Run +anim 749 - Walk +anim 751 - Rope Swing +anim 752 - Move to cross wall obstacle +anim 753 - Move to cross wall obstacle +anim 754 - Crossing wall obstacle +anim 755 - On wall obstacle +anim 756 - Crossing wall obstacle +anim 757 - On wall obstacle +anim 758 - Finish crossing wall obstacle +anim 759 - Finish crossing wall obstacle +anim 760 - Fall onto floor face down +anim 761 - Fall onto floor face down +anim 762 - Crossing log obstacle +anim 763 - Standing on log obstacle +anim 764 - Falling off log +anim 765 - Drowning +anim 766 - Falling +anim 767 - Landing on stomach +anim 768 - Falling After Failing Plank Obstacle (Brimhaven Agility) +anim 769 - Jump Bridge +anim 770 - Lose Balance and Fall +anim 771 - Lose Balance and Fall +anim 772 - Swim (DR-188) +anim 773 - Swim Idle (DR-188) +anim 774 - Idle (leaning forward) +anim 775 - Summon rope swing +anim 776 - Crossing low water +anim 777 - Standing in low water +anim 778 - Tackle Gnomeballer +anim 779 - Hurt foot/knee +anim 780 - Bend forward +anim 782 - Cheer and then move hands together +anim 783 - Throw Gnome Ball +anim 784 - Nod head, twirl, dance +anim 787 - Plop on belly and fade away +anim 789 - Throw Bolas? +anim 791 - Old runecrafting +anim 792 - Standing holding something with both hands while boat rocks? +anim 794 - Stomp on balloon? +anim 795 - Start to fall but then catch self +anim 796 - one frame of catching self? +anim 797 - Holding on to edge, then going into a crawl +anim 798 - Pull lever? +anim 799 - Stab with cattle prod +anim 800 - On knees, playing game? +anim 802 - Flappy cheer +anim 803 - Grow from nothing +anim 804 - Shrink into nothing +anim 805 - Move hand as if opening slidey door lock +anim 806 - Idle standing, looking and limping +anim 807 - Jump obstacle (in air for several frames) +anim 808 - Standard Idle (Used in Many Default Renders) +anim 809 - Idle (looks tense) +anim 810 - Push open Compost Bin +anim 811 - Cast Spell (Nature Spirit) +anim 812 - Walk +anim 813 - Idle +anim 814 - Invisible +anim 815 - Crawling (tiny) +anim 816 - Crawling pose idle (tiny) +anim 817 - Fill bucket +anim 818 - Old Dance Emote +anim 819 - Standard Walk (Used in Many Default Renders) +anim 820 - Standard Walking Backwards (Used in Many Default Renders) +anim 821 - Standard Side Step A (Used in Many Default Renders) +anim 822 - Standard Side Step B (Used in Many Default Renders) +anim 823 - Standard Turning (Used in Many Default Renders) +anim 824 - Standard Run (Used in Many Default Renders) +anim 825 - Holding weapon +anim 826 - Walking with weapon +anim 827 - Multi-Use “Bend Over†+anim 828 - Use ladder +anim 829 - Eat (old) +anim 830 - Dig with spade +anim 831 - Dig with spade (loop) +anim 832 - Multi-Use “Take†+anim 833 - Multi-Use “Put†+anim 834 - Move forward and grab something? +anim 835 - Move forward and grab something? +anim 836 - Death +anim 837 - Fall on Back and Die +anim 838 - On Back Dead +anim 839 - Climb Over Object +anim 840 - Reading map +anim 841 - Transparent walking +anim 842 - Transparent standing +anim 843 - Ice Warrior Death +anim 844 - Crawling +anim 845 - Crawl to enter Plain of Mud cave +anim 846 - Startled step back +anim 847 - Stand holding weapon +anim 848 - Mind controlled/dizzy +anim 854 - Alternate looking at both hands in confused manner, looped +anim 855 - Nod head +anim 856 - Shake head no +anim 857 - Think +anim 858 - Bow +anim 859 - Angry +anim 860 - Cry +anim 861 - Laugh +anim 862 - Cheer +anim 863 - Wave Emote +anim 864 - Beckon +anim 865 - Clap +anim 866 - Dance +anim 867 - Woodcutting with Rune hatchet +anim 869 - Woodcutting with Adamant hatchet +anim 870 - Woodcutting with Dragon hatchet +anim 871 - Woodcutting with Mithril hatchet +anim 872 - Woodcutting with Rune hatchet +anim 873 - Woodcutting with Black hatchet +anim 874 - Woodcutting with Adamant hatchet +anim 875 - Woodcutting with Steel hatchet +anim 876 - Woodcutting with Mithril hatchet +anim 877 - Woodcutting with Iron hatchet +anim 878 - Woodcutting with Black hatchet +anim 879 - Woodcutting with Bronze hatchet +anim 880 - Woodcutting with Steel hatchet +anim 881 - Pick pocket +anim 883 - Spin Potter's Wheel +anim 884 - Glass blowing +anim 885 - Cut Dragonstone +anim 886 - Cut Diamond +anim 887 - Cut Ruby +anim 888 - Cut Sapphire +anim 889 - Cut Emerald +anim 890 - Cut Opal +anim 891 - Cut Jade +anim 892 - Cut Topaz +anim 893 - Shearing sheep +anim 894 - NPC standing at bar drinking and turning around +anim 895 - Fill bucket with sand +anim 896 - Old cooking on range animation +anim 897 - Old cooking on fire +anim 898 - Smithing with Hammer +anim 899 - Old Furnace animation +anim 902 - Sidestep with weapon +anim 903 - Sidestep with weapon +anim 904 - Walking backwards with weapon +anim 908 - Use bullroarer (Legends Quest) +anim 909 - Write something +anim 910 - Machete +anim 911 - Cut Spider Web +anim 915 - Look over duel arena +anim 916 - Overlooking duel arena +anim 918 - Brown Toy Horse +anim 919 - White Toy Horse +anim 920 - Black Toy Horse +anim 921 - Grey Toy Horse +anim 923 - Big attack +anim 929 - Throw something (slowly) +anim 931 - Holding something (shakes hand like a salt shaker?) +anim 1017 - Stuck in mud +anim 1024 - Ogre bellows +anim 1025 - On back dead +anim 1032 - Idle +anim 1033 - Walk +anim 1034 - Pull Lever (Elemental Workshop III) +anim 1035 - Pull Lever (Elemental Workshop III) +anim 1036 - Pull lever +anim 1037 - Pull lever +anim 1056 - Dragon Battleaxe special attack? +anim 1057 - Old excalibur +anim 1058 - Walk backwards +anim 1059 - Walk with weapon +animGFX 1060 251 - Dragon Mace Special Attack +animGFX 1062 252 H92 - Dragon Dagger Special [EoC] +anim 1064 - Tiptoe +anim 1065 - Walk +anim 1067 - Big lunge attack +anim 1074 - Fire bow (sound effect sounds like two arrows are being fired) +anim 1077 - Use Bucket on Coffin (Priest in Peril) +anim 1078 - Tiptoe backwards +anim 1079 - Tiptoe run +anim 1080 - Idle +anim 1081 - Walk slowly +anim 1082 - Walk slowly (backwards) +anim 1083 - Run slowly +animGFX 1084 1009 H30 - Surok Casts Spell +anim 1100 - Silver sickle +anim 1105 - Fail agility obstacle and fall +anim 1106 - Try to climb wall obstacle but fail +anim 1110 - Brimhaven Agility Course Darts “Matrix†+anim 1115 - Pressure Pads Brimhaven Agility +anim 1117 - Handholds +anim 1118 - Handholds +anim 1119 - Fail handholds +anim 1120 - Finish handholds +anim 1121 - Crossing handholds +anim 1122 - Crossing handholds +anim 1123 - Fail handholds +anim 1124 - Finish handholds +anim 1125 - Step forward, then step back +anim 1128 - Glass wall (emote) (e) +anim 1129 - Lean (emote) (e) +anim 1130 - Climb Rope (emote) (e) +anim 1131 - Glass box (emote) (e) +anim 1133 - Jump belly first to cross obstacle +anim 1137 - Standing (facing other way) +anim 1138 - Walking backwards +anim 1142 - Idle +anim 1144 - Standing (below ground) +anim 1145 - Shake fist (below ground) +anim 1146 - Walk (choppy) +anim 1147 - Lean back (below ground) +anim 1148 - Walk backwards then climb down wall +anim 1156 - Defend While Holding 1H Weapon and Shield (Legacy) +anim 1157 - Electrocute? +anim 1161 - Cast spell +anim 1162 - Walk +anim 1163 - Cast spell +anim 1164 - Cast spell +anim 1165 - Cast spell +anim 1166 - Cast spell +anim 1167 - Cast spell +anim 1168 - Cast spell +anim 1169 - Cast spell +animGFX 1174 1443 - Completionist Cape Emote (Middle) (As Dragon) (NPC-ID: 1830) +anim 1175 - Completionist Cape Emote (End) (Turn Back From Being Dragon) +anim 1177 - Walk backwards +anim 1179 - Max Cape Emote (Step One) +anim 1180 - Max Cape Emote (Step Two) (Inferno adze and Saw) +anim 1181 - Max Cape Emote (Step Three) (Crystal Pick) +anim 1182 - Max Cape Emote (Step Four) (Hatchet and Watering Can) +anim 1191 - Running +anim 1192 - Slice banana +anim 1193 - Fishing with Karambwan Vessel +anim 1194 - Drink Karamja Rum +anim 1195 - Use Banana with Karamja Rum +anim 1196 - Cough repeating +anim 1198 - Side step +anim 1201 - Side step +anim 1203 - Attack with weapon +anim 1205 - Walk +anim 1206 - Walk backwards +anim 1207 - Side step +anim 1208 - Side step +anim 1209 - Shake hips cutely +anim 1210 - Running +anim 1217 - Idle with hands together in front of hips, standing in one square ahead +anim 1233 - Scratch hips (part of same idle as 1217) +anim 1236 - Cross tripwire? +anim 1237 - Walk, the turn to dodge something, then continue walking +anim 1238 - Mining with gilded rune pickaxe +anim 1239 - Mining with gilded bronze pickaxe +anim 1240 - Step back and wave arm +anim 1241 - Invisible +anim 1248 - Fletch logs +anim 1249 - Craft leather +anim 1250 - Max Cape Emote (Step Five) (Smithing and Crafting) +animGFX 1251 4253 - Max Cape Emote (Step Six) (Prepare For Battle) +anim 1252 - Climb Over obstacle +anim 1254 - Mining with gilded iron pickaxe +anim 1256 - Mining with gilded steel pickaxe +anim 1258 - Plop on belly, get on knees (choppy) +anim 1259 - Mining with gilded adamant pickaxe +anim 1263 - Try to push open lock? +anim 1264 - Throw something forward? +anim 1267 - Cover head with hands irritated? +anim 1275 - Two frames of limping stance +anim 1280 - Craft something? +animGFX 1291 1505 1686 - Max Cape Emote (Step Seven) (Fighting) +anim 1306 - Walking with both hands out forward +anim 1307 - Bend back slightly +anim 1309 - Craft something +anim 1316 - Mining with gilded mithril pickaxe +anim 1318 - Hold lyre +anim 1319 - Hold lyre +anim 1320 - Play lyre +anim 1321 - Play lyre +anim 1322 - Hold tankard of beer +anim 1323 - Walk with tankard of beer +anim 1324 - Walk backwards with tankard of beer +anim 1325 - Side step with tankard of beer +anim 1326 - Side step with tankard of beer +anim 1327 - Drink beer +anim 1328 - Mining with gilded dragon pickaxe +anim 1329 - Sitting on ground, pretzel position +anim 1330 - Drink keg of beer +anim 1331 - Get on knees as if showing respect +anim 1332 - Getting off knees +anim 1333 - Petting rock +anim 1334 - Idle, hand on hip, +anim 1335 - Preach White book +anim 1336 - Preach Red book +anim 1337 - Preach Green book +anim 1350 - Read book +anim 1351 - Sit on stool +anim 1352 - Scratch head on stool +anim 1353 - Cover mouth on stool +anim 1354 - Move hand sitting on stool +anim 1363 - Eat +anim 1364 - Sitting (no chair or stool appears) +anim 1365 - Daemonheim Wilderness Guard +anim 1366 - Daemonheim Wilderness Guard Letting Player Pass +anim 1367 - Craft Dramen Staff +anim 1368 - Running with weapon +animGFX 1374 1702 - Blow Kiss (emote) (e) +anim 1376 - Linza Smithing? +anim 1379 - Electrocute, then go on knees? +anim 1406 - Bucket +anim 1407 - On knees in dead position +anim 1408 - Lying dead stretched out +anim 1409 - Getting up from Lying dead stretched out +anim 1421 - Idle +anim 1422 - Walk +anim 1423 - Walk backwards +anim 1424 - Side step +anim 1425 - Side step +anim 1426 - Walk +anim 1427 - Run +anim 1428 - Attack +anim 1429 - Defend +anim 1441 - Startled step back +anim 1457 - Yo-yo +anim 1458 - Yo-yo +anim 1459 - Yo-yo +anim 1460 - Yo-yo +anim 1461 - Sitting on sled +anim 1462 - Riding sled +anim 1463 - Riding sled +anim 1464 - Crash on sled? +anim 1465 - Get off sled? +anim 1466 - Defend on sled? +anim 1467 - Riding sled +anim 1468 - Walking on sled +anim 1469 - Eat on sled +anim 1470 - Wax sled +anim 1479 - Walk, looking side to side +anim 1481 - Shake fist on sled +anim 1482 - Cheer on sled +anim 1483 - Wave on sled +anim 1484 - Beckon on sled +anim 1485 - Clap on sled +anim 1486 - Pick Trollweiss Flower (A) +anim 1487 - Pick Trollweiss Flower (B) +anim 1493 - Sweep broom? +anim 1494 - Walk sweeping broom? +anim 1504 - Blood Runs Deep Wedding Kiss (A) +anim 1505 - Blood Runs Deep Wedding Kiss (B) +anim 1506 - Floating (glitched) +anim 1507 - Lunar Floating +anim 1508 - Lunar Floating +anim 1509 - Lunar Floating Eat? +anim 1510 - Lunar Floating Attack? +anim 1511 - Mining with Bronze Pickaxe +anim 1514 - Headache on floor +anim 1531 - Barbarian Cheering (Gunnar’s Ground) +anim 1544 - Lunar Floating Climb Rope? +anim 1548 - Pull Lever on Wall +anim 1551 - Idle +anim 1552 - Climb out of ground +anim 1560 - Climb Stile +anim 1563 - Use Spinning Wheel +anim 1565 - Drunk? +anim 1567 - Idle (turned around) +anim 1572 - Bend knees and cover ears +anim 1575 - Stick arm out +anim 1601 - Werewolf Agility Zipline +anim 1602 - Zipline +anim 1603 - Jump obstacle (Werewolf Agility) +anim 1604 - Jump short obstacle (Werewolf Agility) +anim 1605 - Cheering +anim 1606 - Kick skull ball +anim 1633 - Use extended brush (Creature of Fenkenstrain) +anim 1638 - Bend over to use something? +anim 1648 - Turning Wheel (Ectofuntus) +anim 1649 - Fill Hopper with Bones (Ectofuntus) +anim 1650 - Fill Pot With Bonemeal +anim 1651 - Ectofuntus Praying +animGFX 1652 2685 - Electrocute (Elemental Workshop III) +anim 1653 - Spasms +anim 1658 - Throw weapon? +anim 1659 - Defend (spazzy) +anim 1660 - Walk +anim 1661 - Run +anim 1662 - Hold weapon +anim 1663 - Walk with weapon +anim 1664 - Run with weapon +animGFX 1665 340 - Maul Swipe Attack +anim 1666 - Defend with Maul +anim 1667 - Attack with Maul +anim 1669 - Idle +anim 1670 - Old Angry Emote +anim 1671 - Old Cheer Emote +anim 1672 - Old Beckon Emote +anim 1673 - Walk +anim 1705 - Idle (Turned Around) +anim 1722 - Old Home Teleport Start +anim 1723 - Old Home Teleport Half-Turn +anim 1724 - Old Home Teleport Next Half-Turn +anim 1728 - Digging with rock pick +anim 1735 - Tower of Life “The Guns†lifting weight +anim 1736 - Sitting in seat with hands in lap +anim 1739 - Walking with arms behind back +anim 1740 - Standing with arms behind back +anim 1743 - Angry +anim 1744 - Angry +anim 1745 - Angry stomping +anim 1746 - Angry fists in air then kicking +anim 1755 - Hit with hammer +anim 1765 - Look to the side +anim 1766 - Pole jumping (Mountain Daughter) +anim 1767 - Pick something off ground +anim 1768 - Doing something to object on ground +anim 1772 - Looking to the side +anim 1774 - Looking to the side and pointing +anim 1775 - Idle +anim 1776 - Idle +anim 1777 - On floor on back +anim 1778 - Place hand on pocket and then realize you’ve been pickpocketed +anim 1779 - Look behind you (has a sound effect that sounds like photo being taken) +anim 1780 - Looking at map in hand (item in hand can’t be seen) (same sound effect as above) +anim 1787 - Smithing then showing off weapon +anim 1809 - hands out bend (glitchy) +anim 1810 - Head being held by swamp monster? +anim 1811 - Single frame (glitchy) +anim 1816 - Old shrink and rise up teleport +anim 1818 - Clap and raise fist in air +animGFX 1819 108 H92 - Zaff Seals Varrock Palace Library (What Lies Below) +anim 1820 - Looks same as above +anim 1823 - Festive Mistletoe Kiss +anim 1830 - Walking +anim 1831 - Balancing +anim 1832 - Standing +anim 1833 - Rubber chicken +anim 1834 - Rubber chicken +anim 1835 - Chicken dance +anim 1836 - Skipping (DR-594) +anim 1837 - Idle (DR-594) +anim 1850 - Stand +anim 1851 - Superman flying +anim 1852 - Flying land +anim 1871 - Defend? +anim 1872 - Give a dog a bone +anim 1873 - Linza Idle (DR-2111) (Looks like checking to see if wrist is broken) +anim 1877 - Snake charm +anim 1878 - Snake charm +anim 1879 - Snake charm (below ground) +anim 1880 - Hold weapon? +anim 1882 - Attack +anim 1884 - Attack +anim 1894 - Look side to side while looking at lectern? +anim 1895 - Look side to side while looking at lectern? +anim 1897 - Crawling position +anim 1902 - Spinning plate +anim 1903 - Net fishing +anim 1904 - Plate +anim 1905 - Woodcutting with Sacred Clay hatchet +anim 1906 - Drop Plate +anim 1907 - Woodcutting with Volatile Clay hatchet +anim 1910 - Walk with 2H weapon +anim 1911 - Walk backwards with 2H weapon +anim 1914 - Desert Treasure Vampire +anim 1917 - Sidestep with 2H weapon +anim 1919 - Walk +anim 1920 - Sidestep with 2H weapon +anim 1925 - Run with 2h weapon +anim 1926 - Defend with 2H weapon +anim 1936 - Ozan Idle (DR-2114) +anim 1950 - Fall down trapdoor +anim 1952 - Facing sideways +anim 1953 - Facing the other way +anim 1954 - Facing sideways +anim 1955 - Holding knee +anim 1968 - Ozan Walk (DR-2114) +anim 1978 - Cast spell? +anim 1979 - Cast spell? +anim 1988 - Running +anim 1989 - Cutting chocolate bar +anim 1992 - Jump down something +anim 1993 - Climb up something +anim 1994 - Jump down and fading away +anim 1995 - Running (OSRS Style) +anim 1996 - Come out portal? Face first on stomach +anim 2009 - Bucket and knife (Tree wax?) +anim 2010 - Bucket +anim 2033 - Sitting +anim 2034 - Sitting +anim 2036 - Get up from sitting on floor +anim 2037 - Standing +anim 2040 - Hold bowl +anim 2041 - Walk with ToG Bowl +anim 2043 - Fill ToG bowl +anim 2044 - Finish filling from ToG +anim 2045 - Drink from bowl +anim 2046 - Light Creature +anim 2047 - End Light Creature +anim 2049 - Climb up wall +anim 2050 - Climb down wall +anim 2060 - Walk +anim 2061 - Idle +anim 2062 - Attack +anim 2063 - Defend +anim 2064 - Walk with Weapon +anim 2065 - Idle with Weapon +anim 2066 - Attack with Two Handed Axe +anim 2067 - Attack +anim 2068 - Attack with both hands alternating +anim 2074 - Stand holding weapon +anim 2076 - Walk holding weapon +anim 2077 - Run holding weapon +anim 2078 - Attack? +anim 2079 - Defend? +anim 2080 - Attack? +anim 2081 - Attack? +anim 2082 - Attack +anim 2094 - Search for Snake Weed (Jungle Potion) +anim 2096 - Arms out +anim 2097 - Arms out as if trying to solve puzzle? +anim 2098 - Open Cell Door (Fight Arena) +anim 2105 - Panic +anim 2106 - Jig Emote +anim 2107 - Twirl +anim 2108 - Headbang Emote +anim 2109 - Jump for joy +anim 2110 - Raspberry +anim 2111 - Yawn +anim 2112 - Salute +anim 2113 - Shrug +anim 2118 - Climb stairs +anim 2119 - Turn valve +anim 2120 - Turn valve +anim 2127 - Goblin Bow (emote) (e) +anim 2128 - Goblin Salute (emote) (e) +anim 2136 - Put something in pocket? +anim 2139 - Pull Up Lever +anim 2140 - Pull Down Lever +anim 2141 - Pull Lever +anim 2142 - Bend and pick something on ground? +anim 2143 - Bend and pick something on ground? +anim 2144 - Dwarven Battle-Axe +anim 2145 - Dwarven Battle-Axe +anim 2146 - Climb up something then climb down? +anim 2148 - Ride Minecart +anim 2149 - Chanting spell? +anim 2161 - Pet Red Pet Rock +anim 2162 - Pet Green Pet Rock +anim 2163 - Walk then stand holding broom thing? (glitchy) +anim 2164 - Walk +anim 2171 - Look Through Telescope in WoM’s House +anim 2206 - Pet Blue Pet Rock +anim 2213 - Pet Yellow Pet Rock +anim 2214 - Pet Rock Fetch +anim 2215 - Green Pet Rock Fetch +anim 2216 - Blue Pet Rock Fetch +anim 2217 - Yellow Pet Rock Fetch +animGFX 2231 370 - Activate Aura +animGFX 2238 358 - Breathe Fire (emote) (e) (LP) +anim 2239 - Jump up high teleport +anim 2240 - Duck under obstacle? +anim 2241 - Fall on ground and die +anim 2242 - Thrown back and fall on back +anim 2243 - Clap (glitchy) +anim 2244 - Clean something on ground? +anim 2246 - Trying to open door? +anim 2247 - Cracking safe? +anim 2248 - Cracking safe? +anim 2249 - Pickpocket safe? +anim 2251 - Running one arm out +anim 2252 - Cat Fight (emote) (e) (LP) +anim 2253 - Standing one arm out +anim 2254 - Face-Palm (emote) (e) (LP) +anim 2255 - Sitting in chair +anim 2256 - Standing Arms Crossed +anim 2257 - Standing one arm out +anim 2258 - Walking one arm out +anim 2259 - Pour vial +anim 2261 - Death +anim 2262 - Walking and looking back and forth +anim 2267 - Touch something up high? +anim 2269 - Cut Watermelon +anim 2270 - Pulling rope? +anim 2271 - Trowel (loop) +anim 2272 - Gardening trowel +anim 2273 - Rake +anim 2274 - Secutars +anim 2275 - Secutars +anim 2276 - Secutars +anim 2277 - Secutars +anim 2278 - Secutars +anim 2279 - Secutars +anim 2280 - Pick from fruit tree +anim 2281 - Pick from fruit tree +anim 2282 - Pick something up from ground +anim 2283 - Pour bucket over ground +anim 2284 - Fill Calquat Keg +anim 2285 - Fill Beer Glass +anim 2286 - Bend on ground and pick something +anim 2288 - Pour Plant Cure +anim 2289 - Drink From Calquat Keg +anim 2290 - Carve Calquat Keg +anim 2291 - Seed Dibber +anim 2292 - Bend and pick something +anim 2293 - Watering Can +anim 2295 - Pick something up high +anim 2303 - Shake Hands (emote) (e) (LP) +anim 2304 - Death +anim 2305 - Milking Cow +anim 2306 - Jumping on Apple Mush +anim 2311 - Fall into trapdoor +anim 2312 - High Five (emote) (e) (LP) +anim 2313 - Trying to open door? +anim 2316 - Holding something with both hands? +anim 2317 - Walk holding something with both hands +anim 2318 - Walk backwards something with both hands +anim 2319 - Side step +anim 2320 - Side step +anim 2321 - Walk +anim 2322 - Run holding one arm up +anim 2323 - Attack holding thing (kick) +anim 2324 - Defend +anim 2326 - Lose balance holding thing? +anim 2327 - Levitate (emote) (e) (LP) +anim 2332 - Tickling with feather +anim 2333 - Ghost Walk +anim 2334 - Ghost Idle +anim 2338 - On Knees +anim 2339 - Sitting on Stool with Beer Glass +anim 2340 - Fall backwards on stool +anim 2343 - Raise beer glass +anim 2347 - ROFL (Male) (emote) (e) (LP) +anim 2359 - ROFL (Female) (emote) (e) (LP) +anim 2360 - Surrender (emote) (e) (LP) +anim 2376 - About to jump +anim 2377 - Get into frog position +anim 2378 - Sitting in Therapist Chair (from Random Event) +anim 2382 - Swipe with machete (Tai Bwo Wannai Cleanup) +anim 2383 - Accidentally disturb jungle (Tai Bwo Wannai Cleanup) +anim 2384 - Repairing fence (Tai Bwo Wannai Cleanup) +anim 2385 - Repairing fence (Tai Bwo Wannai Cleanup) +anim 2386 - Finish repairing fence (Tai Bwo Wannai Cleanup) +anim 2387 - Successfully cut dense jungle (Tai Bwo Wannai Cleanup) +anim 2388 - Exhausted (Tai Bwo Wannai Cleanup) +anim 2389 - Make skewer (Tai Bwo Wannai Cleanup) +anim 2390 - Knocked back from disturbing jungle (Tai Bwo Wannai Cleanup) +anim 2394 - Stab +anim 2400 - Broodoo Victim Cheering +anim 2401 - Idle +anim 2403 - Defend +anim 2406 - Chillin’ (Teplin Macagan Idle (DR-2406)) [NPC ID-3404] +anim 2407 - Teplin Macagan Walk (DR-2406) [NPC ID-3404] +anim 2409 - Craft Broodoo Shield (White) +anim 2410 - Craft Broodoo Shield (Green) +anim 2411 - Craft Broodoo Shield (Orange) +anim 2413 - Climb out of ladder in Draynor Sewer +animGFX 2414 1537 - Original Air Guitar (emote) (e) +anim 2416 - Talk to the Hand (emote) (e) (LP) +animGFX 2417 364 - Snow (emote) (e) (LP) +anim 2420 - Using Thatch Spar Medium with Opal Machete +anim 2421 - Opal Machete Tai Bwo Wannai Cleanup +anim 2422 - Opal Machete Tai Bwo Wannai Cleanup End +anim 2423 - Jade Machete Tai Bwo Wannai Cleanup End +anim 2424 - Jade Machete +anim 2425 - Jade Machete +anim 2426 - Red Topaz Machete +anim 2427 - Red Topaz Machete +anim 2428 - End Red Topaz Machete +anim 2429 - Opal Machete +anim 2430 - Jade Machete +anim 2431 - Red Topaz Machete +anim 2432 - Pulling Machine (Blast Furnace) +anim 2433 - Using Bike Machine (Blast Furnace) +anim 2441 - Use Spade (Blast Furnace) +anim 2442 - Use Spadeful of Coke (Blast Furnace) +anim 2443 - Use Spade (Blast Furnace) +anim 2450 - Use Bucket +animGFX 2553 432 - Elemental Wizard Death +anim 2554 - Elemental Wizard Death GFX +anim 2556 - Thrown Back, land on knees +anim 2557 - On knees +anim 2561 - Hold Weapon +anim 2562 - Walk with Weapon +animGFX 2563 365 - Storm (emote) (e) (LP) +anim 2566 - Muscle-man Pose (emote) (e) (LP) +anim 2569 - Using Compost Potion on Compost Bin +anim 2570 - Use Secuatars +anim 2572 - Push +anim 2573 - Laugh +anim 2574 - Pushing something +anim 2577 - Head to side, using something +anim 2578 - Hands Together Idle +anim 2579 - Grab something +anim 2580 - Gesture head backwards +anim 2581 - Fall off log +anim 2582 - Fall off log +anim 2583 - Jump forward and land on stomach +anim 2584 - Alison Elmshaper Idle (Taverly Fletching Tutor) +anim 2585 - Climb up something +anim 2586 - Jump off ledge (begin) +anim 2588 - Jump off ledge (end) +anim 2589 - Crawl under wall (a) +anim 2590 - Crawl under wall (b) +anim 2591 - Crawl under wall (c) +anim 2592 - Get stuck Start +anim 2593 - Get stuck +anim 2594 - Balancing ledge disappear (begin) +anim 2595 - Balancing ledge disappear (end) +anim 2607 - look to the side, thrown back and die +anim 2608 - Arm to the side, (looks like you’re cutting your wrist) +anim 2609 - Put arm in front of yourself +anim 2610 - Rub the ground +anim 2612 - Jump back scared +anim 2613 - Pestle and Mortar +anim 2614 - Attack +anim 2616 - Doing an “A-OK†pose? +anim 2617 - Ozan Playing Guitar (DR-2113) (NPC-ID-13962) +anim 2624 - Push something +anim 2625 - Pull something back +anim 2633 - Floating +anim 2637 - Going insane then floating +anim 2638 - Floating +anim 2639 - Being thrown around like a puppet +anim 2644 - Throw something +anim 2645 - Death falling on back +anim 2646 - Death idle on back +anim 2647 - Standing then being pulled up into air +anim 2648 - Ozan Walk Animation (DR-2113) (NPC-ID-13962) +anim 2649 - Ozan Idle Animation (DR-2115) (NPC-ID 13967) +anim 2651 - Floating and almost landing, but floating again +anim 2654 - Jump up and attack, then walk down stairs +anim 2658 - On knees fiddling with something/looking through telescope? +anim 2659 - Get up off knees +anim 2661 - Attack +anim 2664 - Floating +anim 2665 - Fall on knees about to die +anim 2673 - On knees about to die +anim 2692 - Very slowly bending to pick something +anim 2693 - Fall on knees +anim 2694 - On knees +anim 2695 - Clip with shears +anim 2696 - Old Death Emote +anim 2697 - Pick something up +anim 2700 - bending backwards (glitched) +anim 2701 - Old Beckon Emote +anim 2702 - Old Cry Emote +anim 2709 - On knees +anim 2710 - Roll ball/attack? +anim 2712 - Standing +anim 2713 - Stand (below ground) +anim 2716 - Sit down, legs out +anim 2717 - Chisel onyx +anim 2720 - Stick arm up and out +anim 2721 - Commorb Scan +anim 2724 - Get on knees to grovel +anim 2726 - Get on knees to grovel +anim 2727 - Old Teletab Teleport +anim 2728 - Hands out +anim 2735 - Push something +anim 2741 - Attack +anim 2745 - Attack +anim 2749 - Up in air in scarecrow pose +anim 2755 - Disappear +anim 2757 - Appear +anim 2762 - Push Ups from Drill Demon Event +anim 2763 - Sit Ups from Drill Demon Event +anim 2764 - Running in Place from Drill Demon Event +anim 2765 - Stand +anim 2766 - Normal Walk +anim 2769 - Dizzy Walk +anim 2770 - Dizzy +anim 2771 - Pour Bucket +anim 2773 - Normal Run +anim 2779 - Attack +anim 2780 - Play with fishbowl +anim 2781 - Feeding fishbowl +anim 2782 - Nodding at fishbowl +anim 2783 - Play with fishbowl +anim 2784 - Feed pet fish +anim 2785 - Fish bowl +anim 2786 - Fish bowl +anim 2787 - Fish bowl +anim 2788 - Talk to Fish +anim 2789 - Dwarven Army Axe +anim 2790 - Bend on ground +animGFX 2791 2728 - Cast Fire Spell +anim 2793 - Churn butter +anim 2794 - Dwarven army axe +anim 2795 - The Raptor Attack with Flail +anim 2796 - Crawling +anim 2797 - Stand +anim 2798 - Cast Old Home Teleport +anim 2799 - Cast Old Home Teleport +anim 2800 - Cast Old Home Teleport +anim 2810 - Holy Wrench +anim 2811 - Holy Wrench +anim 2813 - Catch Karamthulhu (Pirate Quest) +anim 2815 - Walk (below ground) +anim 2816 - Glitched frame (below ground) +anim 2817 - Slash +anim 2818 - Walking (below ground) +anim 2819 - Flatten disappear (below ground) +anim 2820 - Raptor Attack +anim 2821 - Combo Attack +anim 2822 - Sir Owen Idle? +anim 2828 - Defend +anim 2829 - Floating +anim 2830 - Look around +anim 2831 - Dwarven Army Axe +anim 2832 - Walk +anim 2833 - Dwarven Army Axe +anim 2834 - Idle +anim 2835 - Put hands next to head +anim 2836 - Scared (emote) (e) +anim 2837 - Dwarven Army Axe +anim 2838 - Dwarven Army Axe +anim 2839 - Dwarven Army Axe +anim 2840 - Zombie Head “Alas!†+anim 2844 - Zombie Head +anim 2845 - Take something and look at it? +anim 2846 - Dragon Hatchet +anim 2847 - Iron Hatchet +anim 2875 - Walk +animGFX 2876 479 - Dragon Hatchet Special Attack (c-SA) +anim 2879 - Demonic Sigil (i) (e) (Shadow of the Storm) +anim 2880 - Demonic Sigil (i) (e) (Shadow of the Storm) +anim 2888 - Old Shrink Teleport +animGFX 2890 483 - Darklight Special +anim 2891 - Stick hand out +anim 2902 - Smouldering Pot +anim 2903 - Snake Charm +anim 2909 - Walking, bent back +anim 2910 - Wrangling rope +anim 2911 - Idle +anim 2912 - Walk +anim 2913 - Fix Torn Robe Top (Spirits of The Elid) +anim 2914 - Fix Torn Robe Bottom (Spirits of The Elid) +anim 2920 - On floor listening to music +anim 2921 - Getting up off the floor +anim 2922 - Running Across the Board Obstacle on the Advanced Gnome Agility Course +anim 2923 - Jumping over Barrier Obstacle on the Advanced Gnome Agility Course +anim 2924 - Come out Other End of the Barrier Pipe from Advanced Gnome Course +anim 2925 - Kick +anim 2926 - Shake Snowglobe +anim 2927 - On knees +anim 2928 - Pushed back +anim 2929 - Running Across the Signpost from Advanced Gnome Course +anim 2930 - Silverlight attack? +anim 2934 - Standing +anim 2936 - Use Magnifying Glass Emote +anim 2937 - Throw thing? +anim 2938 - Defend +anim 2939 - Sitting +anim 2940 - Sitting (faced other way) +anim 2944 - Walking +anim 2953 - Put hands in front of face +anim 2967 - Throw thing? +anim 2968 - Throw thing? +anim 2972 - Open thing? +anim 2984 - Holding weapon? +anim 2985 - Standing +anim 2986 - Defend +anim 2987 - Walking +anim 2988 - Bend onto ground +anim 2991 - Pushing Open Count Draynor’s Coffin +anim 2992 - Missing the Stake in Count Draynor +anim 2993 - Idle Holding Crate? +anim 2994 - Walking Holding Crate? +anim 2999 - Mithril 2H Sword +anim 3000 - Standing leaned against wall +anim 3001 - Run with Bolas +anim 3002 - Walk with Bolas +animGFX 3003 507 - Red Marionette Jump +animGFX 3003 511 - Blue Marionette Jump +animGFX 3003 515 - Green Marionette Jump +animGFX 3004 508 - Red Marionette Walk +animGFX 3004 512 - Blue Marionette Walk +animGFX 3004 516 - Green Marionette Walk +animGFX 3005 509 - Red Marionette Bow +animGFX 3005 513 - Blue Marionette Bow +animGFX 3005 517 - Green Marionette Bow +animGFX 3006 510 - Red Marionette Dance +animGFX 3006 514 - Blue Marionette Dance no +animGFX 3006 518 - Green Marionette Dance +anim 3007 - Cutting Hardened Straight Root +anim 3032 - Attack something on table? +anim 3036 - Looking around with hand shielding face from sun (Turned around) +anim 3039 - Drunk Walk While Holding Beer (DR-290) +anim 3040 - Drunk stand While Holding Beer (DR-290) +anim 3041 - Old Shrink Teleport +anim 3042 - Walking holding something +anim 3043 - Holding something idle +anim 3044 - Finish reading scroll +anim 3045 - Attack with dagger? +anim 3053 - Climbing right and hanging (begin) +anim 3054 - Covering head and shaking in fear, as if about to be hit, +anim 3055 - Climbing right and hanging (fail) +anim 3056 - Climbing left and hanging (fail) +anim 3057 - Climbing left and hanging (begin) +anim 3058 - Climbing left and hanging (end) +anim 3059 - Climbing right, moving +anim 3060 - Climbing left, moving +anim 3061 - Scrubbing something on side? +anim 3062 - Scrubbing something on side? +anim 3063 - Climbing Up Something then Climb Down +anim 3064 - Falling and flailing on butt +anim 3067 - Jumping over something +anim 3068 - Jumping over something and failing, then falling +anim 3069 - Falling off beam +anim 3071 - Stick arms out and put them together +anim 3079 - Look down and check wrist held close to body +anim 3080 - Checking wrist held close to body +anim 3081 - Lowering arm as if lowering sword +anim 3082 - lift arm as if holding sword +anim 3083 - Walk looking side to side +anim 3084 - Idle, hold hips and look around +anim 3085 - seated, arms in lap +anim 3086 - looking down, touching head, cape blown back idle +anim 3087 - lift arm up as if holding sword +anim 3090 - raise fists in air +anim 3091 - flap +anim 3094 - lean forward and begin to fall forward (into rabbit hole?) +anim 3097 - walking +anim 3102 - on knees using chisel upward +anim 3103 - on ground, get up, rub wrist +anim 3108 - Count Draynor Knocking you Back +anim 3109 - On Floor After Being Knocked Down +anim 3110 - get up while holding stomach +anim 3113 - take something out of pocket and use/enchant it +anim 3114 - bending down to squat then getting up +anim 3115 - idle +anim 3116 - run +anim 3119 - walk +anim 3128 - throw +anim 3130 - swing across obstacle? +anim 3131 - swing across zipine thing? +anim 3132 - lean forward and hands up grabbing thing +anim 3133 - Canister (Cabin Fever) +anim 3134 - Cannonball (Cabin Fever) +anim 3135 - Grab thing +anim 3136 - Use Ramrod +anim 3137 - hit with repair plank +anim 3140 - Read book +anim 3141 - Turn page in book +anim 3150 - lift hand +anim 3151 - hands out grabbing something (or using furnace) +anim 3153 - Linza Smithing? +anim 3158 - Linza Smithing? +anim 3170 - flicker fade in combat stance +anim 3171 - electrocute +anim 3175 - idle +anim 3176 - defend +anim 3177 - walk +anim 3178 - run +anim 3181 - bend forward, do thing +anim 3182 - bend, do thing +anim 3184 - sit then look to side +anim 3185 - do thing with hands +anim 3186 - bend back and shake thing with hands +anim 3187 - Removing Sewer Grate (Plague City) +anim 3191 - Tie Rope to Sewer Grate (Plague City) +anim 3192 - Attempt to Remove Sewer Grate (Plague City) +anim 3195 - sitting legs crossed with stick +anim 3218 - linza smithing? +anim 3219 - Ancient teleport? +anim 3235 - Wiggle straight jadinko root +anim 3236 - throw attack +anim 3238 - defend +anim 3239 - defend +anim 3240 - Barbarian Defend +anim 3243 - use furnace? +anim 3248 - teleport +animGFX 3254 2670 - Fairy Ring Leave +animGFX 3255 2671 - Fairy Ring Arrive +anim 3256 - one knee forward hand on it, other knee bend backwards, then get up +anim 3257 - idle, lift hands up to cast spell? +anim 3260 - Woodcutting dragon hatchet +anim 3261 - woodcutting rune hatchet +anim 3262 - woodcutting adamant hatchet +anim 3263 - woodcutting mithril hatchet +anim 3265 - stand then ghostly fade +anim 3266 - ghostly appear fade +anim 3269 - idle holding weapon +anim 3270 - walk holding weapon +anim 3271 - sidestep +anim 3272 - sidestep +anim 3274 - finish agility obstacle? +anim 3275 - finish agility obstacle? +anim 3276 - start agility obstacle? +anim 3277 - start agility obstacle? +anim 3278 - start agility obstacle? +anim 3279 - start agility obstacle? +anim 3280 - on knees face down +anim 3281 - lying back reclined idle? +anim 3283 - mix potion on hand +anim 3284 - woodcutting with black hatchet +anim 3292 - woodcutting with steel hatchet +anim 3296 - woodcutting? +anim 3297 - noose wand +anim 3301 - hands forward do something +anim 3303 - climb obstacle +anim 3307 - juju hunter potion +anim 3323 - woodcutting with iron hatchet +anim 3324 - woodcutting with bronze hatchet +anim 3325 - Woodcutting with inferno adze +anim 3326 - Woodcutting with sacred clay hatchet +anim 3327 - Dr. Harlow Hitting his Head with Hand +anim 3334 - Opening Chest +anim 3335 - Closing Chest +anim 3337 - Pruning with Magic Secuatars +anim 3338 - Pruning with Magic Secuatars +anim 3339 - Pruning with Magic Secuatars +anim 3340 - Pruning with Magic Secuatars +anim 3341 - Pruning with Magic Secuatars +anim 3342 - Pruning with Magic Secuatars +anim 3345 - Grab thing? +anim 3348 - Brulee +anim 3353 - Do thing with hands? +anim 3361 - Seated shrug clap +anim 3362 - Frozen seated arms shrug +anim 3364 - Jump out of ground into air in t pose with one knee bent +anim 3365 - In air in t pose 1 knee bent +anim 3366 - land on ground +anim 3367 - seated getting up jump stuck in air +anim 3370 - Get out of seated place hands on hip +anim 3371 - Freeze frame hand on hip +anim 3373 - seated, collapse on chair +anim 3374 - seated, collapse on chair +anim 3377 - climb up over thing +anim 3378 - climb up onto thing +anim 3381 - climb up onto thing +anim 3382 - climb up over thing jump down +anim 3386 - climb, jump to next thing, climb more +anim 3389 - climb over thing, jump down +anim 3393 - punch climb thing +anim 3394 - Woodcutting sacred clay hatchet +anim 3396 - seated +anim 3399 - Touching Dwarven Rock Cake, it’s so hot to handle +anim 3414 - Climb into Vine (Jadinko Habitat) +anim 3415 - Swimming underwater Diving +anim 3416 - Land from swimming +anim 3417 - Float back up swimming diving +anim 3418 - Swimming underwater +anim 3419 - float up swimming underwater +anim 3420 - grab underwater rock (RFD) +anim 3421 - Ascend from swimming underwater +anim 3422 - Descend swimming under water +anim 3423 - Jump +anim 3439 - Lunar teleport squeezing +anim 3450 - Squat, get up, do brag poses? +anim 3451 - Squat, get up do bragging strongman poses +anim 3452 - Squat, get up, do brag poses? +anim 3461 - Idle holding heavy weapon +anim 3463 - Climb up thing +anim 3464 - Climb down thing +anim 3465 - Climb under obstacle +anim 3466 - Climb under obstacle +anim 3471 - step back swirl crank? +anim 3475 - Teleport +anim 3480 - Lunar Floating +anim 3482 - Sad Lunar Floating +anim 3526 - Teleport +anim 3527 - Jump into hole (Jadino Habitat) +anim 3533 - Begin to climb Vine (Jadinko Habitat) +anim 3536 - Hardened straight root +anim 3543 - Zombie Dance (emote) (e) +anim 3544 - Zombie Walk (emote) (e) +anim 3547 - twirling +anim 3550 - twitching +anim 3551 - flailing as if arms been grabbed +anim 3552 - stop flailing +anim 3553 - lift hand up +anim 3554 - NPC teleport +anim 3555 - Teleport +anim 3557 - idle +anim 3563 - fall over into push up pose +anim 3564 - use empty pot +animGFX 3566 609 - Silvthril Rod Enchant +anim 3572 - touch thing +anim 3589 - limping hurt walk +anim 3592 - get up from underground +anim 3593 - idle hands to side holding thing +anim 3594 - standing up holding thing +anim 3595 - attack standing above ground +anim 3596 - defend standing above ground +anim 3597 - fall down on butt, legs out +anim 3598 - standing up, jumping +anim 3599 - climbing up on +anim 3600 - standing up +anim 3602 - hoop +anim 3603 - hand out +anim 3605 - defend/idle +anim 3606 - walk holding thing +anim 3607 - Will (Lumberyard Worker) +anim 3610 - Lunar floating spell attack +anim 3611 - Pull Lever (PoH) +anim 3614 - Lunar floating attack +anim 3622 - Grab and holding onto something big? +anim 3623 - Let go of something big? +anim 3624 - Climb past obstacle (GWD Rock?) +anim 3625 - Kettle +anim 3626 - Spell/defend? +anim 3627 - Jump something +anim 3630 - MWAH hands up then cry +anim 3634 - Hands out wide shrug +anim 3635 - Jittery laugh +anim 3636 - Jittery laugh loop +anim 3639 - Walk and then fall on butt and get up +anim 3640 - Fall down from sky on butt +anim 3641 - Fall down from sky into water +anim 3645 - Hands up then together +anim 3649 - Telescope (PoH) +anim 3651 - Lunar floating attack +anim 3652 - Read Lectern (PoH) +anim 3653 - Thinking hmmm +anim 3654 - Churn? (Pluming stand?) +anim 3655 - Red Paintbrush +anim 3657 - Rusty sword +anim 3658 - Tinderbox +anim 3659 - Using object in Poh*? +anim 3660 - Filling beer glass from tap +anim 3661 - Filling beer mug from tap +anim 3662 - Filling Asgarnian Ale +anim 3663 - Filling Greenman's ale +anim 3664 - Filling Dragon’s Bitter +anim 3665 - Filling Moonlight Mead +anim 3666 - Filling Cider +anim 3667 - Take something drunk? +anim 3668 - Take something drunk? +animGFX 3669 530 - Sir Owen Teleports Away +anim 3670 - Preen option to check self in mirror (PoH) +anim 3671 - Lunar Sad Floating Down +anim 3672 - Lunar Sad Floating Up +anim 3674 - Play Instrument in Chapel (PoH) +anim 3675 - Play Bells in Chapel (PoH) +anim 3676 - Build with hammer +anim 3677 - Boxing Stance (PoH) (DR-1386) +anim 3678 - Boxing Punch +anim 3679 - Boxing Defend +anim 3680 - Boxing Walk (DR-1386) +anim 3683 - Hit floor with hammer +anim 3684 - Build with hammer fast +anim 3685 - Remove Furniture (PoH) +anim 3686 - Sit in chair and raise fist +anim 3687 - Use tinderbox +anim 3688 - Jump over boxing ring fence +anim 3689 - Jump over boxing ring fence with red gloves +anim 3690 - Jump over boxing ring fence with blue gloves +animGFX 3691 531 - Lunar Teleport +anim 3692 - Trying to open lock? +anim 3693 - Trying to open lock by banging fist? +anim 3694 - Swimming, trying to open lock +anim 3695 - Swimming, trying to open lock by banging +anim 3696 - Get on knees and lift hands up, (emote ends short) +anim 3697 - One frame of standing +anim 3702 - Drinking tea from yellow cup +anim 3703 - Drinking tea from white cup +anim 3704 - Drinking tea from Porcelain cup +anim 3705 - Making tele tab? +anim 3715 - Getting seated in citadel chair +anim 3719 - Sitting in seat sideways +anim 3725 - Lifting GWD Rock +anim 3734 - Poking swamp with branch (Temple Trekking) +anim 3735 - Falling into swamp +anim 3739 - Wrangling rope (Temple Trekking) +anim 3740 - Checking rope (Temple Trekking) +anim 3741 - Cutting tree branches temple trekking? +anim 3745 - Pulling rope thing? +anim 3747 - Cut with knife +animGFX 3804 630 - Get Angry In Tolna’s Rift +anim 3807 - Tolna Awakens From Nightmare +anim 3838 - Crawl Into Tolna’s Rift +anim 3844 - Side Step to Crawl Through McGrubor’s Woods Fence +anim 3845 - Fiddling with thing sideways, slightly below ground +anim 3846 - Holding swamp lizard? (Frozen frame) +anim 3855 - Turning into bunny? (Easter) +anim 3857 - Growing from being small/tiny +anim 3859 - Chicken Suit Flap (emote) (e) +anim 3860 - Roll Blue easter egg +anim 3861 - Roll Yellow easter egg +anim 3862 - Roll Green easter egg +anim 3863 - Roll Red easter egg +anim 3864 - Take item from table +anim 3865 - Running wide holding something +anim 3866 - Standing shaking head holding something idle +anim 3868 - Walking holding something +anim 3869 - Running holding something? +anim 3870 - Attack +anim 3873 - Attack then cheer? +anim 3875 - Defend? +anim 3876 - Attack? +anim 3877 - Hit with hammer +anim 3896 - Sidestep +anim 3900 - Sidestep +anim 3923 - Hit with sacred clay hammer +anim 3931 - hit with hammer +anim 3934 - Climb Up Obstacle (Clan Battlefield) +anim 3940 - Attack +anim 3943 - Smithing with Volatile Clay Hammer +anim 3945 - Climb Down Obstacle (Clan Battlefield) +anim 3950 - Milkmaid Idle? +anim 3970 - One frame dead +anim 3971 - Hitting with hammer up high and down low +anim 3972 - Trying to lift open something on ground (like a grate?) +anim 3973 - Doing something on ground (like washing laundry?) +anim 3979 - Clan Battlefield Frame Bar Obstacle (A) +anim 3980 - Clan Battlefield Frame Bar Obstacle (B) +anim 3981 - Clan Battlefield Frame Swing Obstacle (A) +anim 3982 - Clan Battlefield Frame Swing Obstacle (B) +anim 3985 - Slipping backwards +anim 3986 - Smash wall with elbow? +anim 3988 - Big Kick +anim 3996 - Standing +anim 3997 - Milkmaid walk? +anim 3999 - Evil Twin being held by claw? +animGFX 4001 666 - Claw Picks You Up (Old Random Event) +animGFX 4003 667 - Claw Drops You +anim 4004 - move forward to grab? +anim 4008 - hit with Dragon hatchet +anim 4011 - hit with Rune Hatchet +anim 4012 - Hit with Adamant Hatchet +anim 4017 - Hit with Mithril hatchet +anim 4018 - Restless Ghost Ascends +anim 4019 - Restless Ghost Awakens +anim 4023 - Rise up from below ground +anim 4024 - Sink below ground +anim 4028 - Look down, cape goes up +anim 4029 - Trying to run on treadmill but fall down? +anim 4030 - Hit with golden hammer +anim 4031 - Hit with Steel Hatchet +anim 4036 - Hit with Iron Hatchet +anim 4043 - Staff of Air +anim 4044 - Staff of Air +anim 4045 - Staff of Earth +anim 4046 - Staff of Earth +anim 4047 - Staff of Water +anim 4048 - Staff of Water +anim 4049 - Staff of Fire +anim 4050 - Staff of FIre +anim 4051 - Air Battlestaff +anim 4052 - Air Battlestaff +anim 4053 - Earth Battlestaff +anim 4054 - Earth Battlestaff +anim 4055 - Water Battlestaff +anim 4056 - Water Battlestaff +anim 4057 - Fire Battlestaff +anim 4058 - Fire Battlestaff +anim 4059 - Mystic Air Staff +anim 4060 - Mystic Air Staff +anim 4061 - Mystic Earth Staff +anim 4062 - Mystic Earth Staff +anim 4063 - Mystic Water Staff +anim 4064 - Mystic Water Staff +anim 4065 - Mystic Fire Staff +anim 4066 - Mystic Fire Staff +anim 4067 - Investigate Ancient Effigy Without Proper Skills +anim 4068 - Investigate Ancient Effigy +anim 4069 - Break Spell Tablet (a) +anim 4070 - Break Spell Tablet (b) +anim 4071 - Teletab +anim 4073 - Sitting in crude chair +anim 4074 - Sitting in crude chair +anim 4075 - Sitting in chair +anim 4076 - Sitting in chair +anim 4077 - Hit with Bronze hatchet +anim 4078 - Hit with Sacred clay hatchet +anim 4079 - Rocking chair +anim 4080 - Rocking chair +anim 4081 - Oak chair +anim 4082 - Oak chair +anim 4083 - Oak chair +anim 4084 - Oak chair +anim 4085 - Teak Chair +anim 4086 - Teak Chair +anim 4087 - Mahogany Chair +anim 4088 - Mahogany chair +anim 4089 - Bench +anim 4090 - Shake fist sitting on bench +anim 4091 - Oak bench +anim 4092 - Shake fist sitting on oak bench +anim 4093 - Sit on Carved Oak Bench +anim 4094 - Shake fist sitting on Carved Oak Bench +anim 4095 - Sitting on Teak Bench +anim 4096 - Shake fist sitting on Teak Bench +anim 4097 - Sitting on Carved Teak Bench +anim 4098 - Shake fist sitting on Carved Teak Bench +anim 4099 - Sitting on Mahogany Bench +anim 4100 - Shake fist sitting on Mahogany Bench +anim 4101 - SItting on Gilded Mahogany Bench +anim 4102 - Shake Fist Sitting on Gilded Mahogany Bench +anim 4103 - Sitting Down on PoH Workbench +anim 4104 - Sitting down? +anim 4105 - Getting out of seat +anim 4106 - Sitting down? +anim 4107 - Sitting at PoH workbench +anim 4108 - Sitting at PoH Workbench Oak Stool +anim 4109 - Crafting at PoH Workbench +anim 4110 - Crafting at PoH Workbench Oak Stool +anim 4111 - Sitting in Throne +anim 4112 - Sitting in Throne (B) +anim 4113 - Sitting in Throne (C) +anim 4114 - SItting in Throne (D) +anim 4115 - Sitting in Skeleton Throne +anim 4116 - Sitting in Crystal Throne +anim 4117 - Sitting in Demonic Throne +anim 4136 - Pouch Repair? +anim 4137 - Hit with Volatile Clay Hatchet +anim 4141 - Shake fist in crude chair +anim 4142 - Shake fist in crude chair (angle) +anim 4143 - Shake fist in chair +anim 4144 - Shake fist in chair (angle) +anim 4145 - Shake fist in rocking chair +anim 4146 - Shake fist in rocking chair (angle) +anim 4147 - Shake fist in oak chair +anim 4148 - Shake fist in oak chair (angle) +anim 4149 - Shake fist in nice oak chair +anim 4150 - Shake fist in nice oak chair (angle) +anim 4151 - Shake fist in teak chair +anim 4152 - Shake fist in teak chair (angle) +anim 4153 - Shake fist in mahogany chair +anim 4154 - Shake fist in mahogany chair (angle) +anim 4158 - Thinking leaning forward +anim 4159 - Sitting sideways +anim 4160 - Sitting sideways, looking head right and left +anim 4162 - Sitting sideways, lifting hand +anim 4166 - Dead face down, then getting up +anim 4167 - Dying (pretend) +anim 4168 - Move head to listen on door? +anim 4169 - bend down on knees, hand in front of face +anim 4170 - Stretching, knee forward +anim 4171 - Covering head with hands +anim 4172 - Fall back on butt +anim 4173 - Fall down on back, knees bent +anim 4174 - Bending/bowing in pain? +anim 4175 - Bending on knees in pain? +anim 4176 - Hitting ground with sacred clay hammer +anim 4177 - Fist out punch? +anim 4178 - Walking drunk +anim 4179 - Drunk idle +anim 4180 - Slowly bending on knees arms flap +anim 4181 - hit with Dragon Pickaxe +anim 4182 - Hit with rune pickaxe +anim 4183 - hit with adamant pickaxe +anim 4184 - Bend and cover face with hands +anim 4185 - Pulling rope? +anim 4188 - Trying to open door with elbows? +anim 4189 - Fire Spring Device (Barbarian Advanced) +anim 4190 - Hammering (Repairing Fence Dwarf Cannon Quest) +anim 4191 - Get Up From Being Face Down on Floor (Dragon Slayer) +anim 4192 - Duck under obstacle to cross? +anim 4193 - Holding crate +anim 4194 - Walking with crate +anim 4195 - On ground listening to door? +anim 4197 - Get up from listening to door? +anim 4199 - Fire crossbow +anim 4200 - Death +anim 4208 - Idle holding? +anim 4209 - Thing holding? +anim 4223 - Spider climb on ceiling? +anim 4226 - Walk +anim 4227 - Walk backwards +anim 4228 - Run +anim 4230 - Fire crossbow +anim 4238 - Touch something +anim 4243 - Hit with Mithril Pickaxe +anim 4250 - Pull lever? +anim 4254 - Pull something (loop) +anim 4255 - Use bucket +anim 4256 - Walk shaking head +anim 4257 - Idle +anim 4258 - Poke with torch +anim 4275 - Slap Head (emote) (e) +animGFX 4276 712 - Idea (emote) (e) +animGFX 4278 713 - Stomp (emote) (e) +anim 4280 - Flap (emote) (e) +anim 4285 - Wizard Mizgog Collects Beads (Imp Catcher) +anim 4292 - Teleport Impious Urn +anim 4293 - Stand arms like chicken then do stretches and thing (idle?) +anim 4316 - Grab something off ground? +anim 4321 - hit with steel pickaxe +anim 4326 - Balance +anim 4327 - Balance walk +anim 4329 - hit with iron pickaxe +anim 4330 - hit with bronze pickaxe +anim 4340 - bend to get something (lift leg up) +anim 4341 - Jump up and hit +anim 4342 - bend forward, then lift hand up in victory +anim 4343 - Mining Strike Gilded Dragon Pickaxe +anim 4344 - Pushing +anim 4345 - Pushing +anim 4348 - Combining Dye Colors +anim 4349 - Combining Dye Colors +anim 4350 - Combining Dye Colors +anim 4352 - Aggie Mixing Dye in Cauldron +anim 4362 - Mining Strike Gilded Rune Pickaxe +anim 4365 - Float thrown up in air +anim 4366 - Fall down in floor +anim 4367 - Fall down face down +anim 4368 - Emerald Lantern +anim 4369 - Using Emerald Lantern (Lunar Diplomacy) +anim 4370 - Mining Strike Gilded Adamant Pickaxe +anim 4371 - Lunar Floating Watering Plants +anim 4373 - Mining Strike Gilded Mithril Pickaxe +anim 4376 - Mining Strike Gilded Steel Pickaxe +anim 4378 - Mining Strike Gilded Iron Pickaxe +anim 4379 - Mining Strike Gilded Bronze Pickaxe +anim 4380 - Jump up float over obstacle +anim 4381 - Jump up over obstacle but get electrocuted +anim 4382 - Lunar Diplomacy Electrocute +anim 4400 - Mining Strike Sacred Clay Pickaxe +anim 4401 - Mining Strike Volatile Clay Pickaxe +anim 4402 - Mining Strike Inferno Adze +anim 4405 - Mining Strike Dwarven Army Axe +anim 4406 - Hit with Dramen Staff +anim 4409 - Heal Group +animGFX 4410 726 - Vengeance Self +anim 4411 - Vengeance Other +anim 4412 - Superglass Make +anim 4413 - Fertile Soil +anim 4424 - Lunar Floating +anim 4426 - Lunar Floating +anim 4427 - Lunar Floating +anim 4428 - Lunar Floating +anim 4429 - Lunar Floating +anim 4430 - Panic +anim 4432 - Cure Plant +anim 4433 - Fletch Logs +anim 4434 - Banshee without earmuffs? +anim 4435 - Scaling Cliff Wall +anim 4436 - Bronze Crossbow Limbs +anim 4437 - Blurite Crossbow limbs +anim 4438 - Iron Crossbow Limbs +anim 4439 - Steel Crossbow Limbs +anim 4440 - Mithril Crossbow Limbs +anim 4441 - Adamant Crossbow Limbs +anim 4442 - Rune Crossbow Limbs +animGFX 4454 761 - Ardougne Cloak Farm Teleport (leave) +anim 4455 - Fire Steel Crossbow to Climb Wall +anim 4460 - Fire Crossbow +anim 4462 - Craft and enchant a thing? +anim 4464 - Pull self through water +anim 4465 - Pull self through water +anim 4466 - Pull self through water +anim 4467 - Pull self through water +anim 4468 - Pull self through water +anim 4470 - Chisel Oyster Pearl +anim 4471 - Fill bucket +anim 4479 - Low Alch on Chair +anim 4480 - High Alch on Chair +anim 4481 - Low Alch on Chair (angle) +anim 4482 - High Alch on Chair (angle) +anim 4483 - Low Alch on Chair +anim 4484 - High Alch on Chair +anim 4485 - Low Alch on Chair (angle) +anim 4486 - High Alch on Chair (angle) +anim 4487 - Low Alch on Chair +anim 4488 - High Alch on Chair +anim 4489 - Low Alch on Chair (angle) +anim 4490 - High Alch on Chair (angle) +anim 4491 - Low Alch on Oak Chair +anim 4492 - High Alch on Oak Chair +anim 4493 - Low Alch on Oak Chair (angle) +anim 4494 - High Alch on Oak Chair (angle) +anim 4495 - Low Alch on Oak Chair +anim 4496 - High Alch on Oak Chair +anim 4497 - Low Alch on Oak Chair (angle) +anim 4498 - High Alch on Oak Chair (angle) +anim 4499 - Low Alch on Teak Chair +anim 4500 - High Alch on Teak Chair +anim 4501 - Low Alch on Teak Chair (angle) +anim 4502 - High Alch on Teak Chair (angle) +anim 4503 - Alch Workbench Stool +anim 4504 - Alch on Teak Chair +anim 4505 - Alch on Teak Chair (Angle) +anim 4506 - Alch on Teak Chair (Angle) +anim 4507 - Alch on Bench +anim 4508 - Alch on Bench +anim 4509 - Alch on Bench +anim 4510 - Alch on Bench +anim 4511 - Alch on Bench +anim 4512 - Alch on Bench +anim 4513 - Alch on Bench +anim 4514 - Alch on Bench +anim 4515 - Alch on Bench +anim 4516 - Alch on Bench +anim 4517 - Alch on Bench +anim 4518 - Alch on Bench +anim 4519 - Alch on Bench +anim 4520 - Alch on Bench +anim 4521 - Alch in throne +anim 4522 - Alch in throne +anim 4523 - Alch in throne +anim 4524 - Alch in throne +anim 4525 - Alch in throne +anim 4526 - Alch in throne +anim 4527 - Alch in throne +anim 4528 - Alch in throne +anim 4529 - Low Alch in Skeleton throne +anim 4530 - High Alch in Skeleton Throne +anim 4531 - Low Alch in Crystal Throne +anim 4532 - High Alch in Crystal throne +anim 4533 - Low Alch in Demonic Throne +anim 4534 - High Alch in Demonic Throne +anim 4540 - Take thing out of pocket and give it +anim 4541 - Teleport Accursed Urn +anim 4542 - Teleport Infernal Urn +anim 4544 - Look down then get tense/agitated +anim 4546 - Tense/agitated +anim 4547 - Use Grand Seed Pod +anim 4549 - Read note while shaking head +anim 4551 - Burn note +anim 4552 - Crouched hiding position +anim 4553 - Put hand out +anim 4558 - Swirl Crystal Bowl? +anim 4567 - Put rune on Impious Urn +anim 4569 - Put rune on Accursed urn +anim 4578 - Put rune on Infernal prayer urn +anim 4580 - Teleport Cracked Smelting Urn +anim 4581 - Bend forward touch +anim 4586 - Hazelmere Memory Meld? +anim 4591 - Idle +anim 4592 - Hit floor with rock pick +anim 4593 - Panning tray +anim 4594 - Look at tray river +anim 4597 - Lift Open Varrock Sewer Manhole +anim 4602 - Lift big thing, cast epll with it? +anim 4603 - Three combo attack +anim 4611 - Grab take thing with left hand +anim 4612 - Look down to the left +anim 4613 - Look back forward +anim 4614 - Look down to the right +anim 4615 - Look back forward +anim 4617 - Cast praying spell thing +anim 4622 - Ozan idle? +anim 4634 - Sideways take thing +anim 4636 - Sideways arm out (border guard?) +anim 4640 - Sideways move are back (border guard?) +anim 4641 - Idle like thing? +anim 4643 - Old home teleport read book +anim 4644 - Seated +anim 4645 - Old home teleport piece +anim 4646 - Old home teleport piece +anim 4647 - Get out of seat +anim 4648 - Idle +anim 4709 - Weak attack/woodcutting? +anim 4712 - Huddling in fetal position +anim 4713 - Look up to the sky with hand shield eyes +anim 4718 - Jump up and fall onto back (a bit blocky) +anim 4719 - On back, getting up (a bit blocky) +anim 4721 - Jump obstacle +anim 4722 - Jump up and climb thing +anim 4723 - Climb thing, turn to look back +anim 4724 - Bend backwards and jump obstacle? +anim 4725 - Look up, then look down and do “motorboat†with face? +anim 4727 - Climb two things +anim 4728 - Jump obstacle and slide down +anim 4731 - Teletab teleport? +anim 4733 - Teleport? +anim 4750 - Stamp twice (with cracking/breaking sound effect) +anim 4757 - Use hammer to repair thing? +anim 4760 - Mining with rune pickaxe +anim 4761 - Mining with bronze pickaxe +anim 4762 - Mining with iron pickaxe +anim 4763 - Mining with steel pickaxe +anim 4764 - Mining with adamant pickaxe +anim 4765 - Mining with mithril pickaxe +anim 4766 - Mining with dragon pickaxe +anim 4771 - Getting slightly irritated +anim 4772 - walking balancing +anim 4779 - walking dizzy/drunk +anim 4780 - stand moving leg back and forth on ground (slightly below ground) +anim 4785 - Climb up ladder but fail and fall down +anim 4786 - On knees looking/stretching, then turn around +anim 4787 - bend onto knees +anim 4788 - On one knee (turned around) +anim 4790 - On one knee, get up +anim 4791 - Holding unlit torch, looking side to side +anim 4793 - Poke ground with torch +anim 4794 - Using volatile clay hammer +anim 4795 - bend slightly forward and look around +anim 4797 - fiddle with door like thing? +anim 4804 - kick +anim 4807 - lift hand up then throw something on ground and step on it +anim 4809 - take something and put it on ground, then turn wheel, then pick it off ground +anim 4823 - Hands on ears like doing telekinetic attack, bending forward +anim 4824 - walking with slight limp +anim 4825 - looking up slightly dizzy/drunk +anim 4826 - hurt knee +anim 4834 - take thing out of pocket and use it with something in front of you +anim 4835 - step back startled +anim 4838 - hammer floor with volatile clay hammer +anim 4839 - Commorb v2 Scan +anim 4841 - Look behind you, jump up and spin +anim 4847 - sitting on floor +anim 4848 - sitting on floor +anim 4849 - Sitting legs pretzel +anim 4850 - Sitting legs pretzel +anim 4851 - sit on floor disappearing (A) +anim 4852 - sit on floor disappearing (B) +anim 4853 - Crawl over Low Wall +anim 4855 - Go into Obstacle Pipe +anim 4857 - idle +anim 4858 - walk +anim 4859 - idle, with glassblowing? +anim 4861 - Turn Water Wheel (Elemental Workshop) +anim 4862 - Using a Stone Bowl With Lava Trough (Elemental Workshop) +anim 4863 - Fixing Bellows With Needle (Elemental Workshop) +anim 4873 - take thing +anim 4874 - throw flare (Castle Wars?) +animGFX 4884 807 - Using Extractor Hat Chair (Elemental Workshop II) (GFX on delay) +animGFX 4885 808 - Improperly Using Extractor Hat Electric Chair (Elemental Workshop II) +anim 4905 - Pull Corkscrew Lever (Elemental Workshop II) +anim 4909 - Pull Lever (Elemental Workshop II) +animGFX 4937 812 - Fletching Cape Emote +animGFX 4939 813 - Magic Cape Emote +animGFX 4941 814 - Mining Cape Emote +animGFX 4943 815 - Smithing Cape Emote +animGFX 4945 816 - Quest Cape Emote +animGFX 4947 817 - RuneCrafting Cape Emote +animGFX 4949 818 - Crafting Cape Emote +animGFX 4951 819 - Fishing Cape Emote +animGFX 4953 820 - Construction Cape Emote +animGFX 4955 821 - Cooking Cape Emote +animGFX 4957 822 - Woodcutting Cape Emote +animGFX 4959 823 - Attack Cape Emote +animGFX 4961 824 - Defence Cape Emote +animGFX 4963 825 - Farming Cape Emote +animGFX 4965 826 - Thieving Cape Emote +animGFX 4967 1656 - Slayer Cape Emote +animGFX 4969 835 - Herblore Cape Emote +animGFX 4973 832 - Ranged Cape Emote +animGFX 4975 831 - Firemaking Cape Emote +animGFX 4977 830 - Agility Cape Emote +animGFX 4979 829 - Prayer Cape Emote +animGFX 4981 828 - Strength Cape Emote +anim 5006 - Place object on table? +anim 5015 - Move forward and do thing with wall up and down +anim 5037 - Try to pull open door? +anim 5038 - Climb over thing +anim 5039 - Jump on hang things and climb up +anim 5040 - Climb down +anim 5043 - Jump on hanging over thing +anim 5046 - Jump obstacle, hurt leg +anim 5047 - Jump on obstacle, but lose balance and fall back +anim 5048 - Try to jump but hit head? +anim 5049 - Jump +anim 5050 - Holding barrel +anim 5052 - Put +anim 5054 - Untying thing? +anim 5056 - On back, get up, brush self +anim 5059 - Reindeer Hat emote? +anim 5063 - Throw Snowball +anim 5067 - Create snowball +anim 5074 - Agile Pickpocket +anim 5075 - Agile Pickpocket +anim 5078 - Agile Pickpocket +anim 5080 - Catch Barehanded Butterfly and Release +anim 5083 - Try to catch Barehanded Butterfly +anim 5088 - Writing/crafting thing? +anim 5108 - Fishing with barb tail harpoon +anim 5140 - Crafting Bongos (Cold War) +anim 5142 - Letting Origami Balloon Fly +anim 5146 - Cheering with one fist? +anim 5147 - Cheering with one fist? +anim 5148 - Cheering with one fist? +anim 5149 - Angry mob? +anim 5150 - Angry mob walk? +anim 5151 - Angry mob walk? +anim 5152 - Angry mob walk? +anim 5153 - Angry mob walk? +anim 5155 - Using sandbag (Enlightened Journey) +animGFX 5158 907 - Hunter Cape Emote +anim 5160 - Idle +anim 5161 - Walk +anim 5162 - Attack? +anim 5163 - Defend +anim 5164 - Walk +anim 5165 - Walk backwards +anim 5166 - Sidestep +anim 5167 - Sidestep +anim 5168 - Running +anim 5206 - Step back +anim 5207 - Step forward and do thing +anim 5208 - Set up hunter trap +anim 5210 - Wrangling Eagle with Rope +anim 5211 - Flying Behind Eagle (Cutscene) +anim 5212 - Dismantle hunter trap +anim 5213 - Release butterfly from jar +anim 5215 - Setting up net trap? +anim 5216 - Inspect Burrow +anim 5236 - Poke with teasing stick +anim 5243 - Craft with needle +anim 5244 - Craft with knife +anim 5245 - Walk holding salamander? +anim 5246 - Idle holding salamander +anim 5247 - Attack with salamander +anim 5249 - Mix with mortar and pestle +anim 5250 - Walk +anim 5251 - walk backwards +anim 5252 - walk +anim 5253 - run +anim 5254 - Idle +anim 5255 - Use noose wand +anim 5256 - Catch Polar Kebbit with Noose Wand +anim 5257 - Catch Kebbit with Noose Wand +anim 5258 - Catch Kebbit with Noose Wand +anim 5259 - Catch Kebbit with Noose Wand +anim 5293 - Walk backwards then fall +anim 5298 - Fall onto butt and get up +anim 5299 - Fall onto butt and get up +anim 5311 - Walk pushing something forward +anim 5312 - Pantaloons Bow (emote) (e) +animGFX 5313 967 - Sleeping Cap Yawn (emote) (e) +anim 5315 - Powdered Wig Angry (emote) (e) +anim 5316 - Flared Trousers Dance (emote) (e) +anim 5349 - Barbed Kebbit Noose wand +anim 5352 - Climb jump up +anim 5354 - Reading scroll (displaced) (Watch Tower) +anim 5355 - Jump obstacle +anim 5361 - Pouring Magic Ogre Potion (Watch Tower) +anim 5362 - Get up off knees +anim 5363 - Holding Undead Chicken +anim 5364 - Walking with Undead Chicken +anim 5365 - Making Iron Magnet (Animal Magnetism) +anim 5366 - Blessed Mithril Hatchet Bounces Off Draynor Manor Tree (Animal Magnetism) +anim 5367 - Adamant Hatchet Bounces Off Draynor Manor Tree +anim 5368 - Rune Hatchet Bounces Off Draynor Manor Tree +anim 5369 - Dragon Hatchet Bounces Off Draynor Manor Tree +anim 5370 - Alice’s Husband Idle +anim 5371 - Alice’s Husband Idle (Chasing Chicken) +anim 5372 - Alice’s Husband Walk (Chasing Chicken) +anim 5373 - Alice’s Husband Walk +animGFX 5376 973 - Alice’s Husband Catches Chicken +anim 5377 - Alice’s Husband Tries to Catch Chicken (Animal Magnetism) +anim 5378 - Alice’s Husband Tries to Catch Chicken (Animal Magnetism) +anim 5383 - Blessed Mithril Hatchet +anim 5384 - Blessed Mithril Hatchet +anim 5400 - Filling Healing Vial (Barbarian Assault) +anim 5407 - Pick stuff off ground +anim 5416 - Hammer ground +anim 5417 - Hammer medium height +anim 5418 - Kick, smash attack, smash attack kick +anim 5419 - Take thing, bend down, use it +anim 5428 - Push thing downwards +anim 5429 - Idle +anim 5436 - Listen/hold on to thing? +anim 5438 - Walk with chicken bag +anim 5439 - hit with chicken bag +anim 5441 - defend +anim 5474 - bend forward touch knees +anim 5562 - Clan Citadel Loom +anim 5602 - walk +anim 5606 - walk dejected (below ground) +anim 5607 - stand dejected/scratch head (below ground) +anim 5608 - bend backwards, then throw something or hit? +anim 5609 - Lift hands up +anim 5611 - Tarn grow big to turn into monster? +anim 5620 - appear on knees, cock head, and get it +animGFX 5633 1006 - Zaff Saves the King (What Lies Below) +anim 5637 - Lift hands up (enchant salve amulet e?) +anim 5713 - Sit down into resting legs crossed pretzel +animGFX 5714 1015 - Shrunk into Penguin Suit +animGFX 5716 1016 - Exit Penguin Suit +anim 5718 - Scared +anim 5732 - Sitting/resting knees crossed pretzel +anim 5739 - Walking +anim 5746 - Building Hide-Out (Cold War) +anim 5748 - Get up from resting knees crossed +anim 5749 - seated, looking sideways +anim 5752 - one frame sitting down legs out +anim 5754 - Hammer thing in hand +anim 5756 - cut thing with knife in hand +animGFX 5759 1020 - Juggling (Fremennik Isles) +anim 5760 - Dance a jolly jig +anim 5761 - Skipping +anim 5762 - Jester Staff +anim 5763 - Pie self in face +anim 5776 - bend down on ground +anim 5777 - Troll king head? +anim 5778 - Troll king head? +anim 5783 - Cast spell and throw it +anim 5796 - Drink water from fountain? (Sorcerer’s Garden) +anim 5798 - Collapse and die +anim 5799 - Walk holding broom? +anim 5800 - Clan Citadel Obelisk? (this animation keeps showing up everywhere) +anim 5805 - Defend +anim 5812 - Attack with severed leg (Shadow of Khazard) +anim 5814 - ‘Bonafide’ Resting on ground (Tower of Life) +anim 5815 - ‘No Fingers’ Leaning against building (Tower of Life) +anim 5816 - ‘Gummy’ Paddycake (Tower of Life) +anim 5817 - ‘Black Eye’ Paddycake (Tower of Life) +anim 5818 - ‘The Guns’ Military Press with Log (Tower of Life) +anim 5819 - Hands drooping doing thing +anim 5822 - Walk +anim 5823 - Stamp, scratch head +anim 5827 - Tea Flask (Tower of Life) +anim 5836 - Stand with back leaning backwards +anim 5845 - Builder Outfit Beckon (Tower of Life) +anim 5846 - Building (Tower of Life) +anim 5860 - Trying to pull something (statue?) that is really heavy +anim 5862 - Choking on Toxic Gas and Collapse (Great Brain Robbery) +anim 5863 - Blowing Wolf Whistle (i) (Great Brain Robbery) +anim 5864 - Saradomin Prayer Book Cure Poison (i) (e) (Great Brain Robbery) +anim 5865 - Swinging Barrelchest Anchor +anim 5866 - Defend with anchor +anim 5867 - walk with anchor +anim 5868 - Running with anchor +anim 5869 - Idle holding anchor +animGFX 5870 1027 - Barrelchest Anchor Special Attack (c-SA) +anim 5907 - Hammering +anim 5968 - Walking slowly dejectedly +animGFX 6064 1034 - Moving Over Distance Sphere Goblin Teleport +anim 6067 - Swing with crossbow (Bandos Throne Room?) +anim 6068 - Use Crossbow to cross obstacle +anim 6075 - Shaking thing in hand +anim 6076 - Walking holding thing +anim 6083 - Ring Molanisk Slayer Bell +anim 6085 - Swing with opal machete +anim 6086 - Swing with Jade Machete +anim 6087 - Swing with Red Topaz Machete +anim 6095 - Stab attack +animGFX 6096 1037 H5 - Surok Destroys Letter (What Lies Below) +anim 6098 - Surok is Defeated +animGFX 6099 1008 H30 - Evil King Roald is Defeated +anim 6100 - Evil King Roald Defend +anim 6101 - Evil King Roald Attack +anim 6102 - Excavating Saradomin Statue (What Lies Below) +anim 6103 - bend on ground, arms out +animGFX 6104 1038 - Enchant Runecrafting Wand (What Lies Below) +anim 6106 - Sitting (rotates sideway) +anim 6109 - Look behind you twice then sit down +anim 6111 - Bunny Hop (emote) (e) +anim 6112 - limp walk +anim 6113 - limp idle +anim 6122 - Scratch head as if itchy +anim 6124 - Fall off bridge (Olaf’s Quest?) +anim 6128 - Attack +anim 6129 - Defend +anim 6130 - Slide thing with hands (like door?) +anim 6131 - Push cheer walk thing? +anim 6132 - Jump over obstacle +anim 6133 - Throw Wood Chips Into Furnace (Clan Citadel) +anim 6134 - Throw Wood Chips Into Furnace (Clan Citadel) +anim 6135 - Throw Wood Chips Into Furnace (Clan Citadel) +anim 6143 - Firing Bow? +animGFX 6147 1052 - Bandos Mace Special Attack +anim 6194 - Throw Wood Chips Into Furnace (Clan Citadel) +anim 6197 - Sit and turn around? +anim 6198 - Get up from sit and turn around +anim 6217 - Clean specimen with brush? +anim 6281 - Cyrisus on Ground +anim 6282 - Cyrisus on Ground +anim 6283 - Cyrisus on Ground +anim 6285 - Touch something +anim 6287 - Checking yourself (Cyrisus Dream Mentor) +anim 6289 - Helping Cyrisus on the ground? +anim 6290 - Helping Cyrisus when he’s on the ground +anim 6291 S30 - Getting/Giving Item To/From NPC +animGFX 6292 2964 - Anniversary Cake +animGFX 6293 1060 - Stat Spy +animGFX 6294 1061 - Humidify +animGFX 6294 3298 - Humidify (Summer Storm) +anim 6295 - Dream Spell +anim 6296 - Sleeping (Dream Spell) +anim 6297 - Get up from Sleeping (Dream Spell) +animGFX 6298 1063 - Plank Make +animGFX 6299 1062 - Spellbook Swap +anim 6300 - bend to touch something on ground +animGFX 6303 1074 - Make Hunter Kit +anim 6304 - Land from T pose +anim 6305 - Lift hand up and out +anim 6362 - Cooling Molten Bar (Clan Citadel) +anim 6364 - Chop Log black axe +anim 6367 - Bars Into Hatch (Clan Citadel) +anim 6380 - Teleport Fragile Smelting Urn +anim 6381 - Teleport Smelting Urn +anim 6382 - Teleport Strong Smelting Urn +anim 6383 - hands on hips looking at ground +anim 6384 - Put Rune on Cracked Smelting Urn +anim 6385 - Put Rune on Fragile Smelting Urn +anim 6386 - Put Rune on Smelting Urn +anim 6387 - Put Rune on Strong Smelting Urn +anim 6388 - walking with hands behind back +anim 6389 - hands behind back +anim 6390 - hands behind back, facing sideways +anim 6391 - hands behind back sideways, do a motion +anim 6392 - hands behind back sideways, do a motion +anim 6393 - hands on hip +anim 6394 - Teleport Cracked Fishing Urn +anim 6395 - Spunky walk +anim 6396 - bird pose jumping jacks thing? +anim 6397 - weird jump side to side? +anim 6398 - bury head in sand and flail? +anim 6399 - weird animal dance? +anim 6400 - Turkey dance +anim 6401 - slither on ground like snake +anim 6402 - weird animal dance? +anim 6403 - downward dog yoga? +anim 6404 - Birdman pose +anim 6405 - Get on ground and slither like a snake +anim 6406 - Get on ground and slither like a snake +anim 6408 - head twist yoga? +anim 6409 - woodpecker dance? +anim 6424 - Digsite Workman Picking up and Throwing Rocks +anim 6425 - Digsite Workman Idle (DR-537) +anim 6446 - Clan Citadel Cooled Bars Into Hatch +anim 6459 - Digsite Cleaning Varrock Museum +anim 6462 - Pushing Button in Varrock Natural History Museum +anim 6463 - Teleport Fragile Fishing Urn +anim 6464 - Hands behind back +anim 6465 - Hands behind back, shake head +anim 6468 - Walk +anim 6469 - Stand +anim 6471 - Teleport Fishing Urn +anim 6472 - Teleport Strong Fishing Urn +anim 6473 - Teleport Decorated Fishing Urn +anim 6474 - Put Rune on Cracked Fishing Urn +anim 6475 - Put Rune on Fragile Fishing Urn +anim 6478 - Rocking in chair +anim 6480 - Clan Citadel Cooled Bars Into Hatch +anim 6483 - Clan Citadel Cooled Bars Into Hatch +anim 6486 - Walk +anim 6487 - Holding thing +anim 6488 - Defend +anim 6489 - Attack +anim 6490 - Death +anim 6525 - Drinking Shrink Me Quick at wrong time +anim 6526 - Cheering Thing? +anim 6527 - Open door +anim 6528 - Kick +anim 6529 - Shrink Me Quick +anim 6530 - Regrowing +anim 6531 - walk +anim 6532 - walk +anim 6554 - Canifis NPC turning into Werewolf +anim 6584 - Seed dibber +anim 6587 - Shoveling Gold Into Furnace (Clan Citadel) +animGFX 6592 1117 - Jar Generator (i) (e) +anim 6593 - Walk through the grass impetuous impulses +anim 6594 - Walk through the grass +anim 6595 - Walk through the grass +anim 6600 - Throw dart +animGFX 6601 1118 - Puro Puro Crop Circle +anim 6603 - Swimming +anim 6605 - Swing butterfly net +anim 6606 - Catch impling +anim 6608 - Catch impling +anim 6609 - Sidestep +anim 6610 - Sidestep +anim 6611 - Sidestep +anim 6616 - Put on statue piece +anim 6631 - Shoveling Gold Ore Into Furnace (Clan Citadel) +anim 6632 - Shoveling Silver Ore Into Furnace (Clan Citadel)l +anim 6633 - Shoveling Ore Into Furnace (Clan Citadel) +anim 6642 - Lift hand up in air +anim 6649 - Cabin Boy Jenkins Panic +anim 6650 - Melzar the Mad Crazy +anim 6651 - Melzar the Mad Stumble +anim 6654 - Taking off Elvarg’s Head +anim 6655 - Elvarg’s head +anim 6657 - hold thing? +anim 6658 - walk while hold thing? +anim 6659 - walk backwards holding thing? +anim 6660 - run +anim 6661 - step step +anim 6662 - side step +anim 6663 - side step +anim 6664 - Pet rock fetch +anim 6671 - Fletch bow +anim 6672 - Fletch bow +anim 6673 - Fletch bow +anim 6674 - Fletch bow +anim 6675 - Fletch bow +anim 6676 - Fletch bow +anim 6677 - Fletch bow +anim 6678 - Fletch Shortbow +anim 6679 - Fletch Oak Shortbow +anim 6680 - Fletch Willow Shortbow +anim 6681 - Fletch Maple Shortbow +anim 6682 - Fletch Yew Shortbow +anim 6683 - Fletch Magic Shortbow +anim 6684 - Fletch Shieldbow +anim 6685 - Fletch Oak Shieldbow +anim 6686 - Fletch Willow Shieldbow +anim 6687 - Fletch Maple Shieldbow +anim 6688 - Fletch Yew Shieldbow +anim 6689 - Fletch Magic Shieldbow +anim 6700 - Dragonfire Shield +anim 6702 - Cut thing +anim 6703 - Jump Over Wilderness Wall +anim 6704 - Clan Citadel Chopping Board +anim 6705 - Bare Hand Shark +anim 6706 - Bare Hand Shark +anim 6707 - Bare Hand Swordfish +anim 6708 - Bare Hand Swordfish +anim 6709 - Reassuring Dororan While Listening In On Longhall (Gunnar’s Ground) +anim 6710 - Bare Hand Tuna +anim 6711 - Bare Hand Tuna +anim 6712 - Hammer +anim 6713 - Light fire with bow +anim 6714 - Light fire with bow +anim 6715 - light fire with bow +anim 6716 - light fire with bow +anim 6717 - light fire with bow +anim 6718 - light fire with bow +anim 6719 - light fire with magic bow +anim 6720 - light fire with bow +anim 6723 - Jump into Ancient Cavern Whirlpool +anim 6724 - Ghost spirit ascending? +anim 6738 - Rune hatchet +anim 6739 - Adamant hatchet +anim 6740 - Mithril hatchet +anim 6741 - Black Hatchet +anim 6742 - Steel hatchet +anim 6743 - Iron Hatchet +anim 6744 - Bronze Hatchet +anim 6745 - Dragon Hatchet +anim 6746 - Rune Pickaxe +anim 6747 - Bronze Pickaxe +anim 6748 - Iron Pickaxe +anim 6749 - Steel Pickaxe +anim 6750 - Adamant Pickaxe +anim 6751 - Mithril Pickaxe +anim 6752 - Rune Pickaxe +anim 6753 - Mine With Bronze Pickaxe +anim 6754 - Iron Pickaxe +anim 6755 - Steel Pickaxe +anim 6756 - Adamant Pickaxe +anim 6757 - Mithril Pickaxe +anim 6758 - Dragon Pickaxe +anim 6769 - Put Rune on Fishing Urn +anim 6770 - Put Rune on Strong Fishing Urn +anim 6784 - Clan Citadel Grill with Spatula +anim 6786 - Clan Citadel Stew +anim 6788 - Seated +anim 6789 - Put Rune on Decorated Fishing Urn +anim 6794 - Teleport Cracked Cooking Urn +anim 6795 - Teleport Fragile Cooking Urn +anim 6814 - slide off seat +anim 6816 - Sit down +anim 6820 - Sitting +anim 6838 - attack +anim 6840 - Searching Crates +anim 6841 - Observatory Assistant Idle +anim 6842 - Get up from sitting +anim 6843 - Grab a Seat +anim 6844 - Observatory Professor Scratches Head +anim 6845 - Observatory Professor Fixes Telescope +anim 6846 - Sitting +anim 6847 - Observatory Professor Fixes Telescope +anim 6848 - Observatory Professor Fixes Telescope +anim 6849 - Looking Through Observatory Telescope +anim 6863 - Town Crier Scratches Head +anim 6864 - Stand +anim 6865 - Town Crier Ring Bell +animGFX 6866 1178 - Town Crier Gives Player a Book +anim 6867 - Walk +anim 6887 - Holding chest in pain +anim 6896 - Throw something +anim 6897 - Collapse on ground +anim 6912 - Lean against wall +anim 6913 - Lean against wall, arms crossed +anim 6914 - Lean against wall +anim 6915 - Hands out and up, as if banging on door +anim 6918 - Banging on door? +anim 6919 - Walking arms tied behind back +anim 6922 - About to teleport, lift hand up in protest? +anim 6923 - Shield self with elbow +anim 6926 - Walk hand covering head +anim 6927 - Stand breathing heavily +anim 6928 - Walking heavily +anim 6929 - Defend +anim 6933 - Pull switch? +anim 6935 - Mining +anim 6939 - Disappear +anim 6941 - Appear +anim 6978 - Lift really heavy rock +anim 6979 - Lift really heavy rock +anim 6988 - Swimming +anim 6999 - Dive jump +anim 7002 - Hit with hammer +anim 7003 - Sitting on floor in pain +anim 7023 - Crawling +anim 7039 - Run Holding 2H Sword (Legacy) (DR-124) +anim 7040 - Turning Holding 2H Sword (Legacy) (DR-124) +anim 7041 - Auto-Attack with 2H Sword +anim 7042 - Attack with weapon +anim 7043 - Side Step Holding 2H Sword (Legacy) (DR-124) +anim 7044 - Side Step Holding 2H Sword (Legacy) (DR-124) +anim 7045 - Back Step Holding 2H Sword (Legacy) (DR-124) +anim 7046 - Walk Holding 2H Sword (Legacy) (DR-124) +anim 7047 - Idle Holding 2H Sword (Legacy) (DR-124) +anim 7048 - Attack with 2H Sword +anim 7049 - Attack +anim 7050 - Defend with 2H Sword (Legacy) +anim 7056 - Get up from seat +anim 7057 - Sitting +animGFX 7070 1221 - Zamorak Godsword Special (Ice Cleave) [gfx 2104 on Target] +anim 7071 - Clan Citadel Dance +anim 7076 - Rope swing +animGFX 7078 1225 - Dragon 2H Sword Special (Power Stab) +anim 7081 - Swing Across Crossbow +anim 7082 - Old Spirit Tree Teleport (Leave) +anim 7084 - Old Spirit tree Teleport Arrive) +anim 7095 - Flailing around +anim 7096 - Covering face with elbow +anim 7126 - Teleport Cooking urn +anim 7133 - Teleport Strong Cooking urn +anim 7139 - Glouphrie Bowl +anim 7151 - Hammering Ground +anim 7152 - Stomp on balloon +anim 7159 - Clan Citadel Dance +anim 7161 - Clan Citadel Dance Walk +anim 7162 - Clan Citadel Dance Run +anim 7181 - Attack +anim 7182 - Pirate Attack With Hook Arm +anim 7183 - Punch +anim 7185 - Death +anim 7186 - Defend +anim 7187 - Defend +anim 7188 - Hands on hip, shake head +anim 7189 - limpy walk +anim 7190 - limpy walk +anim 7191 - walk +anim 7192 - back step +anim 7193 - side step +anim 7194 - side step +anim 7197 - Death +anim 7198 - Defend +anim 7199 - Idle +anim 7200 - Walk +anim 7201 - Back step +anim 7202 - Side step +anim 7203 - Side step +anim 7211 - Cut magic logs +anim 7212 - Pull something back with secateurs? +anim 7227 - Secutars +anim 7228 - Magic Secateurs +anim 7230 - Defend (snake sounds) +anim 7232 - Do weird thing +anim 7253 - Bend over backwards getting bitten by Snake Tree +anim 7255 - Climb up something then teleport (Clan Portal HW event 2011?) +anim 7261 - Fishing? +anim 7264 - Attack +anim 7265 - Stand idle +anim 7266 - Swimming (under ground) +anim 7267 - Wading through water (under ground) +anim 7268 - Jump over +anim 7269 - Jump into water +anim 7270 - Pick something off ground +anim 7271 - Step forward, then jump back +anim 7272 - Zombie Hand (emote) (e) +anim 7273 - Climb up out of water? +anim 7274 - Slide +anim 7275 - Walk through Spider Web +anim 7277 - Crazy (or shake some bowl?) +animGFX 7299 1247 - Request Assistance +anim 7301 - Defend with hands together above head +anim 7302 - Lower hands from above emote +anim 7307 - Twist something +animGFX 7312 538 - Clan Vexillum Teleport (arrive) +animGFX 7312 1767 - World Window Teleport (arrive) +anim 7321 - Open Strange Box on Yubuisk +anim 7363 - Look over wall? +anim 7364 - Fiddling with thing idle? +anim 7365 - Hands crossed shaking head idle +anim 7366 - Idle +anim 7368 - Idle +anim 7369 - Idle +anim 7376 - Walk and disappear +anim 7377 - Walk and appear +anim 7383 - Inferno Adze +animGFX 7389 537 - Clan Vexillum Teleport (leave) +animGFX 7389 1767 - World Window Teleport (leave) +anim 7392 - Lift hand and thing (electric sounds) +anim 7425 - Stand idle, then do thing put sideways +anim 7477 - Grab thing then roll it to other side +anim 7491 - Take thing pull back (or climb rope) +anim 7493 - Climb up rope +anim 7525 - Walk on Clan Citadel Dance Floor +anim 7526 - Run on Clan Citadel Dance Floor +animGFX 7528 1284 - Snowglobe (e) (item) +anim 7529 - Collect snow +anim 7530 - Throw Snowball +anim 7531 - Snowman Dance (emote) (e) +anim 7532 - Do thing +anim 7533 - Do thing pull +anim 7534 - Defend laugh then teleport +anim 7578 - Sitting on ground +anim 7579 - Sitting on knees +anim 7597 - Balance walk +anim 7599 - Get up brush self +anim 7628 - Pull switch? +anim 7629 - Hand up dizzy +anim 7633 - Step forward, open thing with hands (like window shades?) +anim 7640 - Climb up over obstacle +anim 7641 - Hands up casting spell (like Dungeoneering RuneCrafting) +anim 7643 - Walk +anim 7644 - Stand +anim 7645 - Antsy +anim 7650 - Walk +anim 7651 - Stand +anim 7652 - “FAIRY GOD PARENTS!†+anim 7660 - Cast familiar scroll +anim 7664 - Clan Citadel Guard Lowers Axe to Block Entry +anim 7665 - Clan Citadel Guard Lowers Axe to Block Entry +anim 7666 - Clan Citadel Guard Idle +anim 7672 - Clan Citadel Guard Lifts Axe to Allow Player Entry +anim 7700 - Raise fist high in pride +anim 7717 - Clan Citadel Guard Lifts Axe to Allow Player Entry +anim 7731 - Clan Citadel Guard Idle +anim 7745 - Take thing throw it up in air? +anim 7756 - Pouch Repair +anim 7774 - Bucket +anim 7823 - Disruption Shield +anim 7892 - Glitchy bucket +anim 7898 - Make Lunar Lumber +anim 7918 - Reading big open book lectern? +anim 7959 - Pick box up? +anim 8055 - Teleport lunar npc +anim 8107 - Lunar Farm Npc Defend +animGFX 8137 2006 - Exit Portal from Bandos Throne Room +anim 8165 - Lunar Floating Kick +anim 8170 - Stab lunge attack? +anim 8177 - Pull switch thing? +anim 8178 - Pull lever? +anim 8227 - Run +anim 8232 - Walk +anim 8239 - Walk +anim 8242 - Sidestep +anim 8263 - Sidestep +anim 8264 - Stand +anim 8289 - Pull lever? +anim 8323 - Pull lever up +anim 8371 - Force palm? +anim 8407 - Make speech (loop) +anim 8408 - Sit and nod +anim 8409 - Sit and cheer +anim 8410 - Sit and whistle +anim 8495 - Sit and point +anim 8496 - Walk +anim 8497 - Stand looking at the ground +anim 8499 - Shiver in fear (Wolf Whistle) +anim 8500 - Infuse Summoning Pouch +anim 8501 - Do something on knees? +animGFX 8502 1517 - Recharge Summoning Points (Old) +anim 8503 - “ACK!â€â€ +animGFX 8525 1515 - Summoning Skillcape Emote +anim 8528 - Using Some machine? +anim 8562 - stand idle +anim 8591 - attack +anim 8592 - walk +anim 8593 - stand idle +anim 8594 - Some sort of teleport? +anim 8595 - Same as above +anim 8629 - Teleport Decorated Cooking Urn +anim 8649 - Put Rune on Cracked Cooking Urn +anim 8651 - Put Rune on Fragile Cooking Urn +anim 8652 - Put Rune on Cooking Urn +anim 8654 - Put Rune on Strong Cooking Urn +anim 8681 - Walk holding hand in air +anim 8682 - Stand holding hand in air +anim 8683 - Stand +anim 8684 - Walk +anim 8685 - Run +anim 8686 - Lift hands up +anim 8687 - Get on knees +anim 8688 - Do something on knees +anim 8690 - Run hand in air +anim 8691 - Put Rune on Decorated Cooking Urn +anim 8694 - Get out of water +anim 8695 - In water +anim 8698 - Jump in water +anim 8699 - In water +anim 8701 - Turn crank around and around? +anim 8702 - Lift Big boulder? +anim 8704 - Hammer L shaped block +anim 8705 - Zombie dazed? +anim 8707 - Wipe head and do excercise +animGFX 8709 1543 - Digging in Vinesweeper +anim 8710 - Investigating ground (Dungeoneering Spike puzzle room) +animGFX 8711 1541 - VineSweeper Place Flag +anim 8713 - Teleport Cracked Woodcutting Urn +anim 8727 - Teleport Fragile Woodcutting Urn +anim 8729 - Teleport Woodcutting Urn +anim 8730 - Teleport Strong woodcutting Urn +anim 8736 - Flash and shrink from being large +anim 8758 - Stand +anim 8765 - Kick +animGFX 8767 1546 - Dagon’Hai Monk Magic Attack +anim 8768 - Look back scared +animGFX 8770 1553 - Safety First (emote) (e) +anim 8804 - Pull door thing? +anim 8805 - Push door thing? +anim 8820 - “No no no no no†+anim 8821 - “No no no, of course not...†+anim 8829 - Combat pose? +anim 8830 - Defend/pull lever? +anim 8831 - Run +anim 8832 - Crouch +anim 8833 - Crouch sit +anim 8834 - Lift hands up and arrange shelf? +anim 8835 - Lean forward and look to see if coast is clear +anim 8836 - Mining with Bronze Pickaxe +anim 8837 - Mining with Iron Pickaxe +anim 8838 - Mining with Steel Pickaxe +anim 8839 - Mining with Adamant Pickaxe +anim 8840 - Mining with Mithril Pickaxe +anim 8841 - Mining with Rune Pickaxe +anim 8842 - Walking backwards +animGFX 8847 1557 - Electrocution +animGFX 8848 1557 - Electrocution +anim 8849 - Throw snowball? +anim 8858 - Walk and fade +anim 8859 - Fade and walk +anim 8860 - Idle hands behind back +anim 8861 - Hammer ground +anim 8862 - Walking drunk +anim 8863 - Stand drunk +anim 8864 - Sacred clay hammer ground +anim 8865 - Sacred clay hammer +anim 8866 - Wipe head, drunk collapse onto knees +anim 8868 - Drunk banging head +anim 8869 - Drunk, trying to keep balance +anim 8870 - Drunk reaching arm out +anim 8871 - Drunk reaching arm out +anim 8872 - Drunk fall over on knees and catch balance +anim 8873 - Stand up get drunk +anim 8874 - Drunk attack +anim 8875 - Walking holding anchor? +anim 8877 - On knees +anim 8878 - Standing holding anchor? +anim 8887 - Golden hammer +anim 8888 - Golden hammer +anim 8889 - Sacred Clay hammer +anim 8890 - Sacred Clay hammer +anim 8891 - Golden hammer +anim 8893 - Regular hammer +animGFX 8901 1567 - Turn into Rabbit (Easter Event) +anim 8902 - Turn back from rabbit +animGFX 8903 1566 - Chocatrice Cape Emote +anim 8904 - Reach up to something on high shelf? +anim 8905 - Bucket +anim 8906 - Chocatrice egg +anim 8907 - Shake chocatrice egg +anim 8908 - Bend over to ground +anim 8909 - Bucket +animGFX 8939 1864 - Drakan’s Medallion Teleport (t-L) +animGFX 8941 1864 - Drakan’s Medallion Teleport (t-A) +animGFX 8939 1678 - Ectofuntus Green Teleport (t-L) +animGFX 8941 1679 - Ectofuntus Green Teleport (t-A) +animGFX 8939 1576 - Standard Teleport (t-L) +animGFX 8941 1577 - Standard Teleport (t-A) +anim 8943 - Sacred clay hammer up high +anim 8950 - Volatile clay hammer up high +anim 8953 - Invisible, appear as if teleport +anim 8973 - Raise hand in air +anim 8975 - Raise hand in air +anim 8976 - Raise hand in air +anim 8977 - Idle +anim 8979 - Walk +anim 8980 - Idle +anim 8981 - Idle +anim 8982 - Walk +anim 8983 - Side step +anim 8984 - Side step +anim 8985 - Back step +anim 8986 - Run +anim 8987 - Balance slightly +anim 8988 - Defend +anim 8989 - Punch +anim 8990 - Fly Kite +anim 8991 - Kick +anim 8996 - Strong pose +anim 8997 - Walk holding FoG bowl? +anim 8998 - Idle holding FoG bowl +anim 8999 - Defend holding FoG bowl +anim 9000 - Balance holding Fog bowl +anim 9001 - Back step holding FoG bowl +anim 9002 - Side step holding FoG bowl +anim 9003 - Side step holding FoG bowl +anim 9004 - Run holding FoG bowl +anim 9012 - Throw teleorb on ground (Fist of Guthix) +anim 9013 - Appear +anim 9016 - Disappear holding FoG bowl +anim 9018 - Appear holding FoG bowl +anim 9021 - Emerald sickle bloom (Legacy of Seergaze) +anim 9022 - Hammer up high Golden Hammer +anim 9024 - Shake head spazzy and get off knees +anim 9025 - Get on knees +anim 9031 - Use saw to open door? +anim 9039 - Walk dejected +anim 9040 - Dejected idle +anim 9044 - Dejected pull rope? +anim 9046 - Lean forward and touch thing +anim 9047 - Attack with Ivandis Flail +anim 9049 - Idle +anim 9050 - Run +anim 9051 - Walk +anim 9052 - back walk +anim 9053 - Side step +anim 9054 - Side step +anim 9055 - Throw thing +anim 9057 - Throw thing +anim 9058 - hands on hip nodding +anim 9059 - Touch things then moves arms back +anim 9060 - Turn to side and cock head +anim 9061 - Opening thing with hand sideways? +anim 9062 - Finish opening thing +anim 9063 - hands out +anim 9064 - put sickle on ground +anim 9065 - emerald sickle on ground +anim 9067 - hands out +anim 9069 - leaning sideways with hands on stomach +anim 9070 - walking dejected +anim 9072 - get hit with hands on stomach +anim 9075 - lift into air and BLECK +anim 9076 - in air BLECK +anim 9077 - Bleck then relax +anim 9078 - Take damage from failing Gnome Course Board +anim 9085 - Get off ground +anim 9086 - Pull rope on knees? +anim 9087 - Pull rope on knees +anim 9091 - move to the side to duck obstacle? +anim 9092 - move to the side to duck obstacle? +anim 9096 - Keg Cannon +anim 9097 - Use Ivandis Flail +anim 9098 - Lift arms up (bloom?) +anim 9099 - In pain +anim 9100 - Bend in pain +anim 9104 - Enchant silver sickle +anim 9105 - Knock on Door (Priest in Peril) +anim 9107 - Fall plop down on belly +anim 9109 - Idle, thinking +anim 9110 - Idle nodding head +anim 9111 - Idle clapping +anim 9116 - Keg Cannon +anim 9119 - shaking head +anim 9121 - Defend +anim 9136 - Move forward to climb up ladder +anim 9141 - attack +anim 9151 - Saw +anim 9164 - leaning forward +anim 9174 - Listen to Glimmering Shell +anim 9176 - Listen to Shimmering shell +anim 9195 - Trying to open door/chest +anim 9204 - Trying to open thing +anim 9211 - Trying to open thing, snap off lever +anim 9214 - Gertrude Shaking Player’s Hand +anim 9215 - Getting Hand Shaked By Gertrude +anim 9218 - Will (Lumber Yard Employee) +anim 9220 - Enter Lumber Yard +anim 9221 - Enter Lumber Yard +anim 9224 - Stroking Kitten +anim 9227 - Tapping toe and dance +anim 9304 - Put up planks +anim 9305 - Put plank +anim 9306 - Jolly run +anim 9307 - Defend/attack +anim 9308 - barge attack +anim 9309 - Step forward do pose +anim 9310 - Jump over obstacle +anim 9350 - Hammer thing +anim 9359 - Fall onto back +anim 9360 - Hit With Bronze Pickaxe +anim 9361 - hit with Iron Pickaxe +anim 9362 - Hit with steel pickaxe +anim 9363 - hit with mithril Pickaxe +anim 9364 - Hit with adamant pickaxe +anim 9365 - Hit with rune pickaxe +anim 9367 - walk then shrink and disappear +anim 9429 - Opening Drawers +anim 9497 - Pull open +anim 9499 - Defend/do whittle diddle +animGFX 9502 327 - Salt Shaker on Rock Slugs +anim 9504 - Using charcoal +anim 9516 - Walk, bending back +anim 9519 - Collapse +anim 9523 - Look around you as if there’s bugs or stuff bothering you +anim 9526 - Crazy thing blowing into hands +anim 9534 - Sitting laid back in chair +anim 9536 - Idle +anim 9537 - Limp walk +anim 9542 - Tin Cup +anim 9544 - Attack +anim 9547 - rub ground +anim 9549 - Lever +anim 9551 - Walk holding thing +anim 9552 - back walk +anim 9553 - Hold thing +anim 9554 - Side step hold thing +anim 9555 - Side step hold thing +anim 9557 - Dive off Prison Island Pier (Rocking Out) +anim 9558 - Lift hands up then down +anim 9561 - Rub thing on knees +anim 9562 - hitting thing +anim 9564 - On ground collapsed +anim 9565 - Playing accordion (Rocking Out) +anim 9566 - Accordion (Rocking Out) +animGFX 9568 1668 - Resurrect Ex-Ex Parrot +anim 9570 - walk +anim 9571 - idle +anim 9573 - uproot/pull thing +anim 9575 - Fall on back +anim 9579 - Fiddling with Accordion (Rocking Out) (June 2008) +anim 9591 - crouched on knees +anim 9595 - Get in seat +anim 9596 - Teleport +animGFX 9597 1680 - Tele Tab +anim 9598 - Arrive from teleport +animGFX 9599 1681 - Ancient Teleport +animGFX 9600 1682 - Lyre teleport +animGFX 9601 1683 - Skull Scepter Teleport +animGFX 9602 1690 - Wilderness Obelisk Teleport +animGFX 9603 1684 - Jewelry Teleport +anim 9604 - Blue Rum bottle +anim 9605 - Red rum bottle +anim 9606 - Lunar tele +anim 9607 - Zamorak Mage Teleports You to Abyss +animGFX 9609 1688 - Ectophial Teleport +anim 9610 - Teleport +anim 9633 - Alch with staff +anim 9640 - Look +anim 9648 - Pick cabbage +anim 9649 - Push rock +anim 9663 - Shy +anim 9664 - Shy +anim 9668 - Shy +anim 9676 - walking +anim 9677 - idle, pull up +anim 9678 - limping walk +anim 9679 - Standing arms out fiddling hitting something +anim 9680 - hunched limp walk +anim 9705 - throw something +anim 9709 - take/touch something +anim 9710 - arms out looking through something? +anim 9711 - take/touch something +anim 9712 - looking at something, questioning it, then look again +anim 9713 - teleport +anim 9714 - take something out of pocket and put it on ground +anim 9715 - throw something on ground? +anim 9716 - Death +anim 9717 - On floor +anim 9718 - Get off floor \ No newline at end of file diff --git a/dumps/530/condata.txt b/dumps/530/condata.txt new file mode 100644 index 000000000..df7763aa0 --- /dev/null +++ b/dumps/530/condata.txt @@ -0,0 +1,227 @@ +/* +item=Gazebo, id=8192, option=[null, null, null, null, drop] +item=Small fountain, id=8193, option=[null, null, null, null, drop] +item=Large fountain, id=8194, option=[null, null, null, null, drop] +item=Posh fountain, id=8195, option=[null, null, null, null, drop] +item=Boundary stones, id=8196, option=[null, null, null, null, drop] +item=Wooden fence, id=8197, option=[null, null, null, null, drop] +item=Stone wall, id=8198, option=[null, null, null, null, drop] +item=Iron railings, id=8199, option=[null, null, null, null, drop] +item=Picket fence, id=8200, option=[null, null, null, null, drop] +item=Garden fence, id=8201, option=[null, null, null, null, drop] +item=Marble wall, id=8202, option=[null, null, null, null, drop] +item=Thorny hedge, id=8203, option=[null, null, null, null, drop] +item=Nice hedge, id=8204, option=[null, null, null, null, drop] +item=Small box hedge, id=8205, option=[null, null, null, null, drop] +item=Topiary hedge, id=8206, option=[null, null, null, null, drop] +item=Fancy hedge, id=8207, option=[null, null, null, null, drop] +item=Tall fancy hedge, id=8208, option=[null, null, null, null, drop] +item=Tall box hedge, id=8209, option=[null, null, null, null, drop] +item=Rosemary, id=8210, option=[null, null, null, null, drop] +item=Daffodils, id=8211, option=[null, null, null, null, drop] +item=Bluebells, id=8212, option=[null, null, null, null, drop] +item=Sunflower, id=8213, option=[null, null, null, null, drop] +item=Marigolds, id=8214, option=[null, null, null, null, drop] +item=Roses, id=8215, option=[null, null, null, null, drop] +item=Firepit, id=8216, option=[null, null, null, null, drop] +item=Firepit with hook, id=8217, option=[null, null, null, null, drop] +item=Firepit with pot, id=8218, option=[null, null, null, null, drop] +item=Small oven, id=8219, option=[null, null, null, null, drop] +item=Large oven, id=8220, option=[null, null, null, null, drop] +item=Steel range, id=8221, option=[null, null, null, null, drop] +item=Fancy range, id=8222, option=[null, null, null, null, drop] +item=Wooden shelves 1, id=8223, option=[null, null, null, null, drop] +item=Wooden shelves 2, id=8224, option=[null, null, null, null, drop] +item=Wooden shelves 3, id=8225, option=[null, null, null, null, drop] +item=Oak shelves 1, id=8226, option=[null, null, null, null, drop] +item=Oak shelves 2, id=8227, option=[null, null, null, null, drop] +item=Teak shelves 1, id=8228, option=[null, null, null, null, drop] +item=Teak shelves 2, id=8229, option=[null, null, null, null, drop] +item=Pump and drain, id=8230, option=[null, null, null, null, drop] +item=Pump and tub, id=8231, option=[null, null, null, null, drop] +item=Sink, id=8232, option=[null, null, null, null, drop] +item=Wooden larder, id=8233, option=[null, null, null, null, drop] +item=Oak larder, id=8234, option=[null, null, null, null, drop] +item=Teak larder, id=8235, option=[null, null, null, null, drop] +item=Cat blanket, id=8236, option=[null, null, null, null, drop] +item=Cat basket, id=8237, option=[null, null, null, null, drop] +item=Cushioned basket, id=8238, option=[null, null, null, null, drop] +item=Beer barrel, id=8239, option=[null, null, null, null, drop] +item=Cider barrel, id=8240, option=[null, null, null, null, drop] +item=Asgarnian ale, id=8241, option=[null, null, null, null, drop] +item=Greenman's ale, id=8242, option=[null, null, null, null, drop] +item=Dragon bitter, id=8243, option=[null, null, null, null, drop] +item=Chef's delight, id=8244, option=[null, null, null, null, drop] +item=Blank poh entity, id=8245, option=[null, null, null, null, drop] +item=Wood kitchen table, id=8246, option=[null, null, null, null, drop] +item=Oak kitchen table, id=8247, option=[null, null, null, null, drop] +item=Teak kitchen table, id=8248, option=[null, null, null, null, drop] +item=Oak staircase, id=8249, option=[null, null, null, null, drop] +item=Oak staircase, id=8250, option=[null, null, null, null, drop] +item=Oak staircase, id=8251, option=[null, null, null, null, drop] +item=Teak staircase, id=8252, option=[null, null, null, null, drop] +item=Teak staircase, id=8253, option=[null, null, null, null, drop] +item=Teak staircase, id=8254, option=[null, null, null, null, drop] +item=Marble staircase, id=8255, option=[null, null, null, null, drop] +item=Marble staircase, id=8256, option=[null, null, null, null, drop] +item=Marble staircase, id=8257, option=[null, null, null, null, drop] +item=Spiral staircase, id=8258, option=[null, null, null, null, drop] +item=Marble spiral, id=8259, option=[null, null, null, null, drop] +item=Crawling hand, id=8260, option=[null, null, null, null, drop] +item=Cockatrice head, id=8261, option=[null, null, null, null, drop] +item=Basilisk head, id=8262, option=[null, null, null, null, drop] +item=Kurask head, id=8263, option=[null, null, null, null, drop] +item=Abyssal head, id=8264, option=[null, null, null, null, drop] +item=Kbd heads, id=8265, option=[null, null, null, null, drop] +item=Kq head, id=8266, option=[null, null, null, null, drop] +item=Mounted bass, id=8267, option=[null, null, null, null, drop] +item=Mounted swordfish, id=8268, option=[null, null, null, null, drop] +item=Mounted shark, id=8269, option=[null, null, null, null, drop] +item=Mithril armour, id=8270, option=[null, null, null, null, drop] +item=Adamantite armour, id=8271, option=[null, null, null, null, drop] +item=Runite armour, id=8272, option=[null, null, null, null, drop] +item=Cw armour 1, id=8273, option=[null, null, null, null, drop] +item=Cw armour 2, id=8274, option=[null, null, null, null, drop] +item=Cw armour 3, id=8275, option=[null, null, null, null, drop] +item=Rune case 1, id=8276, option=[null, null, null, null, drop] +item=Rune case 2, id=8277, option=[null, null, null, null, drop] +item=Rune case 3, id=8278, option=[null, null, null, null, drop] +item=Silverlight, id=8279, option=[null, null, null, null, drop] +item=Excalibur, id=8280, option=[null, null, null, null, drop] +item=Darklight, id=8281, option=[null, null, null, null, drop] +item=Anti-dragon shield, id=8282, option=[null, null, null, null, drop] +item=Amulet of glory, id=8283, option=[null, null, null, null, drop] +item=Cape of legends, id=8284, option=[null, null, null, null, drop] +item=King arthur, id=8285, option=[null, null, null, null, drop] +item=Elena, id=8286, option=[null, null, null, null, drop] +item=Giant dwarf, id=8287, option=[null, null, null, null, drop] +item=Miscellanians, id=8288, option=[null, null, null, null, drop] +item=Lumbridge, id=8289, option=[null, null, null, null, drop] +item=The desert, id=8290, option=[null, null, null, null, drop] +item=Morytania, id=8291, option=[null, null, null, null, drop] +item=Karamja, id=8292, option=[null, null, null, null, drop] +item=Isafdar, id=8293, option=[null, null, null, null, drop] +item=Small map, id=8294, option=[null, null, null, null, drop] +item=Medium map, id=8295, option=[null, null, null, null, drop] +item=Large map, id=8296, option=[null, null, null, null, drop] +item=Oak cage, id=8297, option=[null, null, null, null, drop] +item=Oak and steel cage, id=8298, option=[null, null, null, null, drop] +item=Steel cage, id=8299, option=[null, null, null, null, drop] +item=Spiked cage, id=8300, option=[null, null, null, null, drop] +item=Bone cage, id=8301, option=[null, null, null, null, drop] +item=Spikes, id=8302, option=[null, null, null, null, drop] +item=Tentacle pool, id=8303, option=[null, null, null, null, drop] +item=Flame pit, id=8304, option=[null, null, null, null, drop] +item=Rocnar, id=8305, option=[null, null, null, null, drop] +item=Oak ladder, id=8306, option=[null, null, null, null, drop] +item=Teak ladder, id=8307, option=[null, null, null, null, drop] +item=Mahogany ladder, id=8308, option=[null, null, null, null, drop] +item=Crude wooden chair, id=8309, option=[null, null, null, null, drop] +item=Wooden chair, id=8310, option=[null, null, null, null, drop] +item=Rocking chair, id=8311, option=[null, null, null, null, drop] +item=Oak chair, id=8312, option=[null, null, null, null, drop] +item=Oak armchair, id=8313, option=[null, null, null, null, drop] +item=Teak armchair, id=8314, option=[null, null, null, null, drop] +item=Mahogany armchair, id=8315, option=[null, null, null, null, drop] +item=Brown rug, id=8316, option=[null, null, null, null, drop] +item=Rug, id=8317, option=[null, null, null, null, drop] +item=Opulent rug, id=8318, option=[null, null, null, null, drop] +item=Wooden bookcase, id=8319, option=[null, null, null, null, drop] +item=Oak bookcase, id=8320, option=[null, null, null, null, drop] +item=Mahogany b'kcase, id=8321, option=[null, null, null, null, drop] +item=Torn curtains, id=8322, option=[null, null, null, null, drop] +item=Curtains, id=8323, option=[null, null, null, null, drop] +item=Opulent curtains, id=8324, option=[null, null, null, null, drop] +item=Clay fireplace, id=8325, option=[null, null, null, null, drop] +item=Stone fireplace, id=8326, option=[null, null, null, null, drop] +item=Marble fireplace, id=8327, option=[null, null, null, null, drop] +item=Teak portal, id=8328, option=[null, null, null, null, drop] +item=Mahogany portal, id=8329, option=[null, null, null, null, drop] +item=Marble portal, id=8330, option=[null, null, null, null, drop] +item=Teleport focus, id=8331, option=[null, null, null, null, drop] +item=Greater focus, id=8332, option=[null, null, null, null, drop] +item=Scrying pool, id=8333, option=[null, null, null, null, drop] +item=Oak lectern, id=8334, option=[null, null, null, null, drop] +item=Eagle lectern, id=8335, option=[null, null, null, null, drop] +item=Demon lectern, id=8336, option=[null, null, null, null, drop] +item=Teak eagle lectern, id=8337, option=[null, null, null, null, drop] +item=Teak demon lectern, id=8338, option=[null, null, null, null, drop] +item=Mahogany eagle, id=8339, option=[null, null, null, null, drop] +item=Mahogany demon, id=8340, option=[null, null, null, null, drop] +item=Globe, id=8341, option=[null, null, null, null, drop] +item=Ornamental globe, id=8342, option=[null, null, null, null, drop] +item=Lunar globe, id=8343, option=[null, null, null, null, drop] +item=Celestial globe, id=8344, option=[null, null, null, null, drop] +item=Armillary sphere, id=8345, option=[null, null, null, null, drop] +item=Small orrery, id=8346, option=[null, null, null, null, drop] +item=Large orrery, id=8347, option=[null, null, null, null, drop] +item=Wooden telescope, id=8348, option=[null, null, null, null, drop] +item=Teak telescope, id=8349, option=[null, null, null, null, drop] +item=Mahogany 'scope, id=8350, option=[null, null, null, null, drop] +item=Crystal ball, id=8351, option=[null, null, null, null, drop] +item=Elemental sphere, id=8352, option=[null, null, null, null, drop] +item=Crystal of power, id=8353, option=[null, null, null, null, drop] +item=Alchemical chart, id=8354, option=[null, null, null, null, drop] +item=Astronomical chart, id=8355, option=[null, null, null, null, drop] +item=Infernal chart, id=8356, option=[null, null, null, null, drop] +item=Oak throne, id=8357, option=[null, null, null, null, drop] +item=Teak throne, id=8358, option=[null, null, null, null, drop] +item=Mahogany throne, id=8359, option=[null, null, null, null, drop] +item=Gilded throne, id=8360, option=[null, null, null, null, drop] +item=Skeleton throne, id=8361, option=[null, null, null, null, drop] +item=Crystal throne, id=8362, option=[null, null, null, null, drop] +item=Demonic throne, id=8363, option=[null, null, null, null, drop] +item=Oak lever, id=8364, option=[null, null, null, null, drop] +item=Teak lever, id=8365, option=[null, null, null, null, drop] +item=Mahogany lever, id=8366, option=[null, null, null, null, drop] +item=Trapdoor, id=8367, option=[null, null, null, null, drop] +item=Trapdoor, id=8368, option=[null, null, null, null, drop] +item=Trapdoor, id=8369, option=[null, null, null, null, drop] +item=Floor decoration, id=8370, option=[null, null, null, null, drop] +item=Steel cage, id=8371, option=[null, null, null, null, drop] +item=Trapdoor, id=8372, option=[null, null, null, null, drop] +item=Lesser magic cage, id=8373, option=[null, null, null, null, drop] +item=Greater magic cage, id=8374, option=[null, null, null, null, drop] +item=Wooden workbench, id=8375, option=[null, null, null, null, drop] +item=Oak workbench, id=8376, option=[null, null, null, null, drop] +item=Steel framed bench, id=8377, option=[null, null, null, null, drop] +item=Bench with vice, id=8378, option=[null, null, null, null, drop] +item=Bench with lathe, id=8379, option=[null, null, null, null, drop] +item=Crafting table 1, id=8380, option=[null, null, null, null, drop] +item=Crafting table 2, id=8381, option=[null, null, null, null, drop] +item=Crafting table 3, id=8382, option=[null, null, null, null, drop] +item=Crafting table 4, id=8383, option=[null, null, null, null, drop] +item=Tool store 1, id=8384, option=[null, null, null, null, drop] +item=Tool store 2, id=8385, option=[null, null, null, null, drop] +item=Tool store 3, id=8386, option=[null, null, null, null, drop] +item=Tool store 4, id=8387, option=[null, null, null, null, drop] +item=Tool store 5, id=8388, option=[null, null, null, null, drop] +item=Repair bench, id=8389, option=[null, null, null, null, drop] +item=Whetstone, id=8390, option=[null, null, null, null, drop] +item=Armour stand, id=8391, option=[null, null, null, null, drop] +item=Pluming stand, id=8392, option=[null, null, null, null, drop] +item=Shield easel, id=8393, option=[null, null, null, null, drop] +item=Banner easel, id=8394, option=[null, null, null, null, drop] +item=Parlour, id=8395, option=[null, null, null, null, drop] +item=Kitchen, id=8396, option=[null, null, null, null, drop] +item=Dining room, id=8397, option=[null, null, null, null, drop] +item=Bedroom, id=8398, option=[null, null, null, null, drop] +item=Games room, id=8399, option=[null, null, null, null, drop] +item=Combat room, id=8400, option=[null, null, null, null, drop] +item=Hall, id=8401, option=[null, null, null, null, drop] +item=Hall, id=8402, option=[null, null, null, null, drop] +item=Hall, id=8403, option=[null, null, null, null, drop] +item=Hall, id=8404, option=[null, null, null, null, drop] +item=Chapel, id=8405, option=[null, null, null, null, drop] +item=Workshop, id=8406, option=[null, null, null, null, drop] +item=Study, id=8407, option=[null, null, null, null, drop] +item=Portal chamber, id=8408, option=[null, null, null, null, drop] +item=Throne room, id=8409, option=[null, null, null, null, drop] +item=Oubliette, id=8410, option=[null, null, null, null, drop] +item=Dungeon corridor, id=8411, option=[null, null, null, null, drop] +item=Dungeon cross, id=8412, option=[null, null, null, null, drop] +item=Dungeon stairs, id=8413, option=[null, null, null, null, drop] +item=Treasure room, id=8414, option=[null, null, null, null, drop] +item=Garden, id=8415, option=[null, null, null, null, drop] +item=Formal garden, id=8416, option=[null, null, null, null, drop] + */ \ No newline at end of file diff --git a/dumps/530/falador_npc_scripts.txt b/dumps/530/falador_npc_scripts.txt new file mode 100644 index 000000000..6968477d2 --- /dev/null +++ b/dumps/530/falador_npc_scripts.txt @@ -0,0 +1,841 @@ +Cassie - Cassie's Shield Shop + +Consists of + +10 of each +Wooden shield(20), Bronze sq shield(48), bronze kiteshield(68) +iron sq shield(168), iron kiteshield(238), steel sq shield(600) +steel kiteshield(850), mithril sq shield(1560) + +---------------------------------------------------------------- + +Cassie + +I buy and sell shields; do you want to trade? + + +---- +Options + +Yes, please. + +No, thank you. + +____________________________________________________________________________ + + +Emily (bartender, Falador) + +--- +Options + +What would you like to say? + +What ales are you serving? + +What can you tell me about dwarves and ale? [QUEST] P2P + +- - - +Emily + +Well, we've got Asgarnian Ale, Wizard's Mind Bomb and Dwarven Stout, all for 3 coins. + +--- +Options + +One Asgarnian Ale, please. +I'll try the Mind Bomb. +Can I have a Dwarven Stout? +I don't feel like any of those. +What can you tell me about dwarves and ale [Quest] P2P + + +Thanks, Emily. + +{ + +Kaylee/ Tina into is + + + +Hi! What can I get you? + +} + + +________________________________ + + +Drunken Man + + +--- +Hello. + +- - - + +... whassup? + +--- +Are you alright? (confuse) + +- - - +... see... two of you... why there two of you? + +--- +There's only one of me, friend. (confused) + +- - - +... no, two of you... you can't count... + ...maybe you drunk too much... + +--- +Whatever you say, friend. (laughter) + +- - - +... giant hairy cabbages...(shocked) + +[END] + +___________________________________________________ + +HairDresser (Has a mullet) + +Good afternoon, (madam/sir). Are you interested in a new haircut? + + +--- +Yes, please. + +No, thank you. + + + +____________________________________________________ +Herquin (Jewelry) + +--- +Do you wish to trade? + +Sorry, I don't want to talk to you, actually. + +- - - +Why, yes, this is a jewel shop after all. + + + + +Herqiuin's Gems { + +0 of each +Uncut Sapphire(25) Emerald(50) Ruby(100) +Diamond(200) Sapphire(250) Emerald(500) +Ruby(1000) Diamond(2000) + +} + +________________________________________________________ +Wayne + +Welcome to Wayne's Chains, Do you wanna buy or sell some chainmail? + +--- + +Yes, please. +No, thanks. + +Wayne's Chains - Chainmail Specialist { + +10 of each + +Chainbody +bronze(60), iron(210), steel(750), +black(1440), mithril(1950), adamant(4800) + +} + +________________________________________________________ + +Falador Gardener(s) + +--- +Hello. + +- - - + +(pissed) +Oi'm Busy. If tha' wants owt, tha' can go find Wyson. He's + ta boss 'round here. And KEEP YER TRAMPIN' FEET ORFF +MA' FLOWERS + +--- +Right... (surprised) +_________________________________________________________ + +Wyson the gardener + + +I'm the head gardener around here. +If you're looking for woad leaves, or if you need help with +owt, I'm yer man. + + +--- +Yes please, I need woad leaves. +Sorry, but I'm not interested. + +- - - +How much are you willing to pay? (Shady shaking) + +--- +{ +How about 5 coins? +How about 10 coins? + + +No no, that's far too little. Woad leaves are hard to get. I +used to have plenty but someone kept stealing them of +me. + +} +How about 15 coins? { +Mmmm... ok, that sounds fair. + +--- +Thanks. +- - - +I'll be around if you have any more gardening needs. + +} +How about 20 coins? +{ +(Boner) +Ok that's more than fair. + +Here, have two, you're a generous person. +--- +Thanks. +} + +______________________________ + + + +Dwarfe (mining guild, gold shield) && without + +- - - +Welcome to the mining guild. +Can I help you with anything? + +--- + +What have you got in the Guild? + +What do you dwarves do with the ore you mine? + +No thanks, I'm fine. + +- - - +1) +Ooh, it's WONDERFUL! There are lots of coal rocks, +and even a few mithril rocks in the guild, +all exclusively for people with at least 60 mining +There's no better mining site anywhere near here. + +--- + +It's a good thing I have level - mining. (excited) +//Find low persons response + - - - + +Yes, that's pretty good. Did you want anything else?(smiley) + +--- + + +What do you dwarves do with the ore you mine? (smiley) + + +No thanks, I'm fine. + + +- - - +1) +What do you think? We smelt it into bars, smith the metal + to make armour and weapons, then we exchange them for +goods and services. (hahaha) + +--- + +I don't see many dwarves +sellin armour or weapons here. (shady shaking) + +- - - +No, this is only a mining outpost. We dwarves don't much +like to settle in human cities. Most of the ore is carted off +to Keldagrim, the great dwarven city. They've got a + special blast furnace up there - it makes smelting the ore + +so much easier. There are plenty of dwarven traders +working in Keldagrim. Anyway, can I help you with anything +else? + +(smiley) + +//FINISHed + +Mining cape dwarfe + +Can you tell me about your skillcape? (confused) { + Sure, this is a Skillcape of Mining. It shows my stature as + a master minger! It has all sorts of uses including a skill + boost to my mining skill. When you get to level 99 come + and talk to me and I'll sell you one. Is there anything else I + + > + can help you with? + + --- + Yes. { + (happy_ + So what can I help you with, then? + } + No. + +} +_____________________________ + +Man (blue cap - between fally castle and garden) + + +PISSED + +What are you doing in my house? + +--- + +I was just exploring. (happy) + +- - - + +You're exploring my house? (up and down confused thinking) + +--- +You don't mind, do you? + +- - - + +But... why are you exploring in my house? + +--- + +Oh, I don't know. I just wandered in, saw you and thought +It'd be fun to speak to you. + +- - - +... you are very strange... + +--- +Perhaps I should go now. + +- - - +Yes, please go away now. (sad) + + +_____________________________________________________________________ + +Permit Officer/Real estage agent + +Can't you see I'm busy? (grind teeth) + +__________________________________________ + + +Flynn's Mace Market + +Mace { +10 of each + +Bronze(18), iron(63), Steel(225) +Mithril(585), Adamant(1440) +} + +- - - +Hello. Do you want to buy or sell any maces? (friendly) + +--- + +No, thanks. +Well, I'll have a look, at least. + + +___________________________________________ +Gen store + +Can I help you at all? + +--- +Yes, please. What are you selling? + +How should I use your shop? { + +I'm glad you ask! You can buy as many of the items + stocked as you wish. You can also sell most items to the +shop. + +} + +No, thanks. + + +______________________________________________________ + + + +Squire Asrol (sounds like ass role) + +Hello. I am the squire to Sir Vyvin. (calm) + +--- +And how is life as a squire? { +Well, Sir Vyvin is a good guy to work for, however, I'm in + a spot of trouble today. I've gone and lost Sir Vyvin's sword! (depressed) + + --- +Do you know where you lost it? { + (confused) + Well now, if I knew THAT it wouldn't be lost, now would it? +} + +I can make a new sword if you like.. + + Is he angry? { + He doesn't know yet. I was hoping I could think of +something to do before he does find out, But I find myself +at a loss.(Depressed) + +} + + =========================================================================== + Well, do you know the VAGUE AREA you lost it? { + (Depressed) + No, I was carrying it for him all the way from where he + had it stored in Lumbridge. It must have slipped from my + pack during the trip, and you know what people are like +these days... + +> + +Someone will have just picked it up and kept it for +themselves. + } + + I can make a new sword if you like... { + //TODO knights sword + } + + + + Well, the kingdom is fairly abundant with swords... { + Yes. You can get bronze swords anywhere, But THIS isn't + any old sword. + > + The thing is, this sword is a family heirloom. It has been + passed down through Vyvin's family for five generations! + It was originally made by the Imcando dwarves, who were + > + a particularly skilled tribe of dwarven smiths. I doubt + anyone could make it in the style they do. + } + + Well, I hope you find it soon. { + Yes, me too. I'm not looking forward to telling Vyvin I've + lost it. He's going to want it for the parade next week as + well. + [END] + } + + } + +} + +Wouldn't you prefer to be a squire for me? { + +No, sorry, I'm loyal to Sir Vyvin. (fine) + +} + +________________________________________________________ + +Silif + +Who are you? + +- - - +Who, me? Oh, no one, I assure you. No one that you want + to tangle with. +[end] + +_________________________________________________________ +Akrisae + +Hello, adventurer. + +--- + +Hello, cleric. (joyous) + [END] + + +___________________________________________________________ +Ambassador Spanfipple + +- - - + +It's all very white round here, isn't it? + +--- + +Well, it is the White Knight's Castle. + +- - - + +I think it would all look better in pink. At least then I + wouldn't be squinting all the time. +--- + +Yes, but then they'd have to become the Pink Knights. I + think they'd have some problems recruiting then. +- - - + +You're probably right. Maybe brown, then. + +--- + +I think that may be worse... +- - - + +Bah, humans have no sense of style... +[END] + +____________________________________________________________ + + +Sir Vyvin + +--- +Hello. + +- - - +Greetings traveller. + +--- + +Do you have anything to trade? { + + No, I'm sorry. + +} + +Why are there so many knights in this city? { + + We are the White Knights of Falador. We are the most + powerful order of knights in the land. We are helping the + king Valliance rule the kingdom as he is getting old and + tired. +} + +Can I just distract you for a minute? { + + Can I just talk to you very slowly for a few minutes, while + I distract you, so that my friend over there can do + something while you're busy being distracted by me? + + - - - + ... ...what? (confused) + + > + + I'm... not sure what you're asking me... you want to join + the White Knights? + + --- + + Nope. I'm just trying to distract you. (happy) + + - - - + + ... ...you are very odd. + + --- + + So can I distract you some more? + - - - + + ... ...I don't think I want to talk to you anymore. + --- + + Ok. My work here is done. 'Bye! + + [END] +} + +______________________________________________________________________ + +Sir Amik Varze + + +--- + +I seek a quest! + +I don't, I'm just looking around. + +Do you know anything about the seige of Falador? { + + +Ah yes, the Kinshra siege was a close-run thing indeed. (astonishment) + +> + +All hope seemed lost. Then she returned - Kara-Meir - with + Sir Theodore at her side. (happy talk) + +--- + +Sir Theodore? I haven't seen anyone of that name around here.(confused) +- - - + +No, you wouldn't have. He is...no longer with us. (remorsful bowing) + +--- + +Oh, I'm sorry. (sad) + +- - - +So am I, young man. So am I. +[END] + +_______________________________________________________________________ + +Woman (red head green skirt pink blouse) + +Hello. + +- - - + +Greetings! Have you come to gaze in rapture at the + natural beauty of Falador's parkland? (happy) +--- +Um, yes, very nice. Lots of... trees and stuff. + +- - - +Trees! I do so love trees! And flowers! And squirrels! + +--- + +Sorry, I have a strange urge to be somewhere else. (confused) + +- - - + +|force walk south of garden| + +Come back to me soon and we can talk about trees!(sad) + +--- + +...[END] + +____________________________________________________________________ +Ikis Krum + +--- + +Hello. + +- - - + +Good day, sir. What brings you to this end of town? (confused) + +--- + +Well, what is there to do around here? + +- - - + +If you're into Mining, plenty!! The dwarves have on of the +largest mines in the world just under our feet. There's an +entrance in the building just north-east of my house. + +> + +If you're one of these young, loud, hipster sorts you could + visit the Party Room, just north of here. That blasted + Pete parties all night and I never get any sleep!(pissed) + +--- + +Thanks. (confused) + + +______________________________________________________________________ +Town crier + +Hear ye!Hear ye! Player Moderators massive help to + RuneSc + +> + Oh, hello citizen. Are you here to find out about Player + Moderators? Or perhaps would you like to know about the + laws of the land? + +--- + +Tell me about Player Moderators. (confused) { + Of course. What would you like to know?(happy) + + --- (confused questions) + What is a Player Moderator? { + + Player Moderators are the normal players of the game, just + like you. However, since they have shown themselves to be + trustworthy and active reporters, they have been invited + by Jagex to monitor the game and take appropriate + + > + + action when they see rule breaking. You can spot a Player + Moderator in game by looking at the chat screen - when a + Player Moderator speaks, a silver crown appears to the + left of their name. Remember, if there's no silver crown + + > + + there, they are not a Player Moderator! You can check + out the website if you'd like more information. + + --- + Thanks!(happy) + }//fuck + + What can Player Moderators do? { + Player Moderators, or 'P-mods', have the ability to mute + rule breakers and Jagex view their reports as a priority so + that action is taken as quickly as possible. P-Mods also + have access to the Player Moderator Centre. Within the + + > + + Centre are tools to help them Moderate RuneScape. + These tools include dedicated forums, the Player + Moderator Guidelines and the Player Moderator Code of + Conduct. + --- + Thanks!(happy) + + } //not bad + + How do I become a Player Moderator? { + Jagex picks players who spend their time and effort to + help better the RuneScape community. To increase your + chances of becomming a Player Moderator: + > + + Keep your account secure! This is very important, as a + player with poor security will never be a P-Mod. Read our + Security Tips for more information. + + > + + Play by the rules! The rules of RuneScape are enforced + for a reason, to make the game a fair and enjoyable + environment for all. + + > + + Report accurately! When Jagex consider an account for + review they look for quality, not quantity. Ensure your + reports are of a high qualit by following the report + guidelines. + + > + + Be excellent to each Other! Treat others as you would + want to be treated yourself. Respect your fellow player. + More information can be found on the website. + + + --- + Thanks!(happy) + }//jesus christ + + What can Player Moderators not do? { + + P-Mods cannot ban your account - they can only report + offences. Jagex then take action based on the evidence + received. If you lose your password or get scammed by + another player, P-Mods cannot help you get your account + + > + + back. All they can do is recommend you to go to Player + Support. They cannot retrieve any items you may have lost + and they certainly do not recieve any free items + from Jagex for moderating the game. They are players + + > + + who give their all to help the community, out of the + goodness of their hearts! P-mods do not work for Jagex + and so cannot make you a Moderator, or recommend + other accounts to become Moderators. If you wish to + + > + + become a Moderator, feel free to ask me! + + + --- + Thanks!(happy) + }//$#%%^%%$^ Diabeetus + Something else. + + Is there anything else you'd like to know? (confused) + + Tell me about Player Moderators. + + Tell me about something else. + + No thanks. + +} + +Tell me about the Rules of RuneScape. (happy) +{ +At once. Take a look at my book here. +|does animation with book outward| +|player reads book| + + +} + +Can you give me a handy tip please? (happy) +{ +Did you know you burn food less often on the range in + Lumbridge castle than other ranges? + +Be careful when fighting wizards! Wearing heavy armour + can lower your magic resistance! + +Don't use your RuneScape password on other sites. Keep + your account safe! + +There are no cheats in RuneScape! Never visit websites + promising otherwise! + +Melee armour actually gives you disadvantages when using +magic attacks. It may be better to take off your armour + entirely! + + +} \ No newline at end of file diff --git a/dumps/530/gfxs.txt b/dumps/530/gfxs.txt new file mode 100644 index 000000000..dbdcb7606 --- /dev/null +++ b/dumps/530/gfxs.txt @@ -0,0 +1,1700 @@ +0: Green blob shattering +1: single dragon breath +2: steel pickaxe +3: lumber +4: delright when defeated +5: Cyan/blue/green flames +6: rainbow ring goes upwards +7: spiraling rainbow +8: vines like at draynor manner ( they atk you ) +9: Iron arrow on ground +10: Bronze arrow on ground +11: Steel arrow on ground +12: Mithril arrow on ground +13: Adamant arrow on ground +14: Mithril Grapple +15: Rune arrow on ground +16: Ice arrow on ground +17: Fire arrow on ground +18: Iron arrows draw back +19: Bronze arrow draw back +20: Steel arrow draw back +21: Mith arrow draw back +22: Addy arrow draw back +23: Mithril Grapple +24: Rune arrow draw back +25: Ice arrow draw back +26: Fire arrow draw +27: Some type of bolt on ground +28: Puff of smoke +29: rotten tomatoe - projectile +30: rotten tomatoe - throw +31: rotten tomatoe - contact with target/White splash +32: Tiny rock +33: Tiny Rock +34: Black dart on ground +35: Iron throw axe +36: Bronze throw axe +37: Steel throwing axe +38: Mith throwing axe +39: Addy throwing axe +40: Puff of red smoke +41: Rune throwing axe +42: Iron throwing axe +43: Bronze throwing axe +44: Steel throwing axe +45: Mithril throwing axe +46: Adamant throwing axe +47: Green puff of smoke +48: Rune throwing axe +49: Spinning Vial +50: Moving Vial +51: Spinning exploding vial? +52: Moving exploding vial? +53: Boulder/stone +54: Giant orange blast +55: Gnome ball projectile +56: Yellow puff of smoke +57: Rope +58: Ball of lava +59: Nothing +60: Falling rocks +61: Nothing +62: Nothing +63: Nothing +64: Nothing +65: Spinning blue circles +66: Spinning brown circles +67: Rope going across river/long rope/pole shooting +68: huge water splash +69: huge water splash +70: Grey boulder/stone +71: Earth blast +72: Seagull/bird flying over you +73: Mud particles? +74: Random event/puff of smoke +75: Purple spikes +76: Saradomin strike +77: Claws of Guthix +78: Flames of Zamorak +79: 3 green blobs floating up +0: 'stun' birdies above head +81: bull roarer ( from legends quest ) +82: two purple squiggles in front of you, like what the spinners do in pest control +83: giant tentical - blood red +84: stars around you - monks healing +85: magic spell splash +86: puff of smoke, whan a random appears \ disapears +87: Iban's blast +88: iban blast - projectile skull +89: iban blast - contact with target +90: Weird tiny rocks (citadel teaser?) +91: Tier 3 Duelist Cap (blue skulls) +92: Tier 6 Duelist Cap (blue skulls/ghost) +93: Blue spirals +94: Blue spirals with yellow sparkles/stars +95: Guthix Arrow drawback +96: Saradomin Arrow drawback +97: Zamorak Arrow drawback +98: Guthix Arrow projectile +99: Saradomin Arrow projectile +100: Zamorak Arrow projecile +101: Bat staff emote +102: confuse cast +103: confuse projectile +104: confuse impact +105: Weaken cast +106: Weaken projectile +107: Weaken impact +108: Curse cast +109: Curse projectile +110: Curse impact +111: Brown spiral +112: Low alchemy +114: enchant low level necklace +115: enchant medium level necklace +116: enchant high level necklace +117: Cat staff emote +118: Dragon staff emote +119: Penguin staff emote +120: Wolf staff emote +121: Windstalker tier 5 (duelist stuff) +122: Windstalker tier 6 +123: Blue stuff +124: Double Guthix Arrow drawback +125: Double Saradomin Arrow drawback +126: Double Zamorak Arrow drawback +127: Green points spiraling upwards (Guthix) +128: Blue points spiraling upwards (Saradomin) +129: Red points spiraling upwards (Zamorak) +130: Shaking and breaking mysterious box (quest box from Falador) +131: Shaking mysterious box (quest box from Falador) +132: Clan citadel falling rock teaser +133: Lot of purple/pink circles that glow +134: Lightening and a purple/pink circle +135: Projectile for purple/pink circle thing +136: Lightening and a purple/pink circle +137: Rope +138: Rope +139: Prayer book +140: Prayer book projectile +141: Bones to Bananas +142: Telegrab cast +143: Telegrab projectile +144: Telegrab impact +145: Crumble Undead cast +146: Crumble Undead projectile +147: Crumble Undead impact +148: Super heat +149: Powering water orb +150: Powering air orb +151: Powering earth orb +152: Powering fire orb +153: Enchant necklace - 1 glow +154: Enchant necklace - 2 glow +155: Gold star sparkles +156: Prayer book +157: Prayer book projectile +158: Blue sparkles/puff of smoke, delay of about 4-5 secs +159: Prayer book +160: Prayer book projectile +161: Continuous splashes of sparkles/puffs of smoke, looks like water +162: Prayer book +163: Prayer book projectile +164: Blue sparkles/puff of smoke +165: Blue sphear with lightening? +166: Blue sphear with lightening, eventually popping +167: Vulnerability cast +168: Vulnerability projectile +169: Vulnerability impact +170: Enfeeble cast +171: Enfeeble projectile +172: Enfeeble impact +173: Stun cast +174: Stun projectile +175: Tiny rock/stone splitting/breaking +176: Vial with red thing? +177: Bind/Snare/Entangle cast +178: Bind/Snare/Entangle projectile +179: Entangle impact +180: Snare impact +181: Bind impact +182: Spear projectile - giant gnome cross-bow +183: Spear shattering - giant gnome cross-bow +184: Puff of smoke +185: Shooting star +186: runecrafting graphic +187: claws of guthix - yellow o.O +188: big puff of smoke, fatter lol +189: small puff of smoke, old detail +190: Blues splashes of something +191: massive teleport above head, round +192: enchanted vial - projectile +193: enchanted vial - pre-launch +194: BLACK SPELL - pre-launch +195: BLACK SPELL - projectile +196: BLACK SPELL - contact +197: Purple fire with orange flames +198: big blue and white wave spell contact +199: Fireworks ( when a lvl is gained ) +200: Bronze Javalin +201: Iron Javalin on ground +202: Steel Javalin on ground +203: Mithril Javalin on ground +204: Adamant Javalin on ground +205: Rune Javalin on ground +206: Bronze Javalin throw +207: Iron Javalin throw +208: Steel Javalin throw +209: Mithril Javalin throw +210: Adamant Javalin throw +211: Rune Javalin throw +212: Bronze knife on ground +213: Iron knife on ground +214: Steek knife on ground +215: black knife on ground +216: Mithril knife on ground +217: Adamant knife on ground +218: Rune knife on ground +219: Nothing +220: Nothing +221: Nothing +222: Nothing +223: Nothing +224: Nothing +225: Nothing +226: Bronze dart on ground +232-237: throwing darts graphics +238: enchant ring +239: barrel falling apart +240: exploding toad +241: filling toad with bellows +243: giant ogre arrow - draw back +244: elemental shield appearing +245: birdies above head +246: Dragon Battle Axe special (Original Animation) +247: blue purple glow - sara - Excaliber Special +248: Dragon Longsword SPECIAL +250: Magic Longbow SPECIAL +251: Dragon Mace SPECIAL +252: Dragon Dagger SPECIAL +253: Dragon Spear SPECIAL +254: Stun birdies again, from dragon spear special +255: green protection graphic - from morytania swamps +256: Magic Shortbow SPECIAL +257: steel throwing axe - different attack mode +258: Throwing Axe SPECIAL +259: same as 255 +263: smalls stars - silver sickle(b) +264: smalls stars 2 - silver sickle(b) +265: white ghost flys in air - ghasts - morytania swamps +266: big green blast - ghasts - morytania swamps +267: bright green puff of stuff +268: projectile - ghast atk's and you have a pouch - pouch attacks +269: first contact - goes with above +270: karamja agility course - poison darts +271: karamja agility course - falling rocks +274: Rune Claw SPECIAL +275: big rock flying away? o.O +277: "Zzz" l0l above your head +278: huge blue jaws in front - like bug jaws +279: small blue jaws above head - like bug +280: small white star projectile - like weaken ( instead of purple its white ) +281: small white star contact - same as above +282: Dragon Halberd SPECIAL - in front +283: Dragon Halberd SPECIAL - behind you o.O +284: Dragon Halberd SPECIAL - to your left +285: Dragon Halberd SPECIAL - to your right +286: big tar barrel - steaming +287: big tar barrel - EXPLOSION - awsomenesssss +291: more birdies +292: dim'ish flames of zammy +293: white ghost body - goes spread eagle - fades away +301: light teleport graphic +302: rocks falling on head +303: medium sized stone falling down on head +305: dark grey and greenish blast - ew +306: Dragon Dagger SPECIAL - in PURPLE - pimp +307: Completionist cape start +308: teleport graphic +309: spinning steel pickaxe +310: dust cloud around head +311: two blood red orbs go up then combine, almost like bones to bananas +325: broad arrow drawback +327: white stuff *looks like dandrif* falls out of air +328: slayer dart - projectile +329: slayer dart - contact +330: slayer dart - projectile - slightly better looking +331: slayer dart - contact - same as above - slight color change +332: Purple portal glow +333: redish looking special att thing that is all around you and rises into the air? +334: small green glow +335: medium green glow +336: large green glow +337: white bar or something goes through you? +338: stick goes in air and falls +339: big splash - magic spell failure +340: Granite Maul special +341: Abyssal Whip SPECIAL +342: Teleother - person accepts teleport +343: Teleother - person casts on another player +344: Teleblock - Projectile +345: Teleblock - Contact on target +346: um.. fire blast with a ring around it? +347: Dragon Scimitar SPECIAL +348: once again.. birdies +349: "Zzz" tired thing +350: Flock of black birds +351: zombie jumps in the air and lands and looks forward +352: zombie laying down - jumps up - lands and looks forward +353: white transparent cylinder above head +354: two puffs of smoke above head, join together and go down body +358: Breathe fire +359: huge air wave - contact +360-361: Ancients - Ice Rush +362-363: Ancients - Ice Burst +364: Snow emote +365: Storm emote +366-368: Ancients - Ice Blitz +369: Ancients - Ice barrage (normal) +370: Ancients - Ice barrage (huge) +373-377: Ancients - Blood Spells +378-382: Ancients - Shadow Spells +383-391: Ancients - Smoke Spells +392: Ancients - Teleport +393: KBD: red projectile +394: KBD: green projectile +395: KBD: white projectile +396: KBD: blue projectile +398: Guthan Special +399: Torags Special +400: Ahrims Special +401: Karils Special +402: green puff of smoke +405: dark green rocks falling +406: Huge rock falls on you +409: Abyssal demons teleport +410: small water drops +412: Big Apple barrel lol +413: Big Rotten Apple barrel +414: Big Apple barrel turns turns to mush +415: Big rotten apple barrel turns to much +416: Toad floating and spinning +417: toad exploding +418: blue toad floading a spinning +419: blue toad exploding +420: red toad spinning +421: red toad exploding +422: yellow toad spinning +423: yellow toad exploding +424: green toad spinning +425: green toad exploding +426: Stars spinning around head +427: something exploding, small peices +429: small bright green spell contact? +430: small bright red spell contact +431: small white spell contact +432: skeleton dying - bank robbery vid +433: old mans spell - bank robbery vid +434: old mans spell - same as above +435: old mans spell - same as above +436: Redemption prayer +437: Retribution prayer +438: miniature dragon fire breath - sprays on your buttocks +439: miniature dragon fire breath - originates from groin area +440: KBD - Big red ball +441: Retribution - going upward +442: Toktz-xil-ul( obby rings ) - projectile +444: Healing graphic from a monster in fight pits +445: 3 small fire gets shotting backward +446: fire coming down from sky ( not as exciting as you think ) +447: another fire from groin area effect +448: meteorite shotting forward +449: smaller fireball directed forward +450: even smaller fireball going forward +451: big meteorite crashing down on you +452: Onyx Ammy Enchanting? +453: fire +454: scanning area - from that quest +455: Ancients - Backwards Teleport +456: small splash +457-464: Butter churns lol +465: Huge North star-looking thing blinks above head +466: zombie (splitting in half) +467: zombie (head falls off) +468: releasing inner zombie +469: steam out of ears +470: small puddle thing +472: Bow special - WHITE? +473: Sparkling spinning arrow tip +474: colorless fireworks heading towards ground? +479: Dragon Hatchet special +480: big north star thing again +481: awsome red shock wave under +482: red rings around you +483: Dark Light special +486: bunny? +492: red starts spinning under you +497: two balls of fire on each side of you +498: big ball of fire under you +500: projectile water blast +502: water bolt contact +503: graphic from abyss thing +504: same as above +505: pink blast under you +506: bones to bananas graphic i think +507: Jump marionette: red +508: Walk marionette: red +509: Bow marionette: red +510: Dance marionette: red +511: Jump marionette: blue +512: Walk marionette: blue +513: Bow marionette: blue +514: Dance marionette: blue +515: Jump marionette: green +516: Walk marionette: green +517: Bow marionette: green +518: Dance marionette: green +519: in a door way +520: bones drop on you +524: white spikey ball under you? +521: Same As 520 Dif Color Bones +522: Same As 520, 521 Dif Color Bones +523: Same As 520, 521, 522, Dif Color Bones +524: White Spike Ball Pops +536: entering clan citadel blue portal +537: Smoke Projectile +538: Smoke Rize +539: Ice Block +540: Smoke Rize?? +541: Green Splash +542: Explosion +545: Barrow With A Lit Fuze +546: Fuze Lit +547: Barrow Explode +548: tiny white feather? +549: tiny white feather? +550: Green Balls... +551: Green Balls Spin +552: Green Balls Sonicly Explode +553: Red 550 +554: Red Flying +555: Nothing +556: MultiColors +557: MultiColors 2 +558: MultiColors 3 +559: Blood Spell Finish // dragon 2h special +560: Skeleton Chained Up? +563: Roasting Chicken On Rotater Over Fire +566: Roasting Pig Same As 563 +567: Smoke Cloud +568: Flowers above head +569: Flowers Around Player +570: Rolling Rock +571: Buncha Smoke Brown Colored +572: Hole opens In Ground +573: 572 shorter +574: Heart +575: Blue Sparkles Everywhere +576: Black Sparkles Everywhere +577: Mushroom Dude +578: Huge Mushroom Dude +579: Weired Fire Ball +580: Imp Teleport +581: Couldren Spinning +582: Explosion +583: Egg? Crack Open? +584: Egg? Lid Fall Off +585: egg +586: Egg lid +587: explosion +588: Huge Arrow? +589: bunch of arrows stuck into you? +590: Perminit Book +591: Perminit Book Vanish +592: Scroll? +593: Flowers +594: Jellow??? +595: IceCream Shake? +596: Yellow Whimsical Thing... +599: Bowl Of Food? +600: Nothing +601: White Rings +602: Cake? +603: White puff coming up +604: Grey swivels +605: Blue swivels +606: A bit like collecting fist of guthix things +607: Ghost flys upwards +608: Man turns to ash +609: Er, lantern? +610: Jester box opening (house) +611: Jester box closing (house) +612: Hoops (house) +613: white puffy slash? +614: white balls come together +615: Spike trap coming up (house) +616: Snare trap coming up (house) +617: Plant trap coming up (house) +618: Plant trap going down (house) +619: Plant trap struggle (house) +620: Marbles? (lol) +621: Marbles? (lol) +622: Splah from falling into swamp (house) +623: Sparkles from jester? Dunno +624: Using bones on an altar (prayer) +625: Puddle? +626: Flashing portal/glow +627: Yellow blob +628: Nothing? +629: Splash +630: Nothing? +631: Demon head lol +632: Kenith dying (rift in varrock) +633: Nothing? +634: Nothing? +635: Nothing? +636: Nothing? +637: Nothing? +638: Nothing? +639: Nothing? +640: Nothing? +641: Nothing? +642: Nothing? +643: Nothing? +644: Nothing? +645: Nothing? +646: Nothing? +647: Nothing? +648: Nothing? +649: Nothing? +650: Nothing? +651: Nothing? +652: Nothing? +653: Nothing? +654: Nothing? +655: Nothing? +656: Nothing? +657: Sepia line +658: Turmoil?? +659: Explosion +660: Explosion wire projectile +661: wilderness obelisk teleport +662: bubbles? +663: black dots? +664: pot with lid, explodes +665: lightning? +666: Molly machine grabber +667: Nothing +668: swirley grey smoke +669: rope splitting?? +670: rope closing?? +671: glow +672: rock falls +673: rock falls +674: rock falls +675: rock falls +676: green blob +677: very quick black and red thing +678: blue glow +679: spikey ball from warriors guild catapult +680: anvil from warriors guild catapult +681: blades from warriors guild catapult +682: orange ball from warriors guild catapult +683: blue bubbles +684: Kegs falling from failing the keg thing in warriors guild +685: Kegs falling from failing the keg thing in warriors guild +686: Kegs falling from failing the keg thing in warriors guild +687: Kegs falling from failing the keg thing in warriors guild +688: Kegs falling from failing the keg thing in warriors guild +689: tiny puff of smoke +690: rock. +691: H.A.M member fading out +692: bowl breaking +693: zanik shooting from crate +694: zanik's crossbow +695: cloak with bones? +696: bone bolt +697: bone bolt +698: bone bolt +699: purple spinning balls +700: brown spinning balls +707: very weird smoke +709: red monkey +710: blue monkey +712: light bulb/idea emote +713: stomp emote +715: white box with brown beads (teleport) +721: bubble maker +723: brain in a jar +725: white vengeance skull +726: red vengeance skull +731: puff of smoke +735: grapple +738: vecnas skull +739: explosion +757: hole with zombies hands? +760: mithril grapple +761: clan tree marker thing disappearing +762: clan tree marker thing appearing +763: low alchemy by hand +764: high alchemy by hand +767: cactus plant thing comes up over you (teleport) +768: grand tree pod (teleport) +769: cactus plant thing comes up over you (teleport) +780: dramatic point emote +785: dark meyer quest thing, blood +799: communicator/telecom orb thing? +800: Home teleport circle drawing +801: Home teleport circle finished +802: Grab book +803: Start Teleporting +804: Outer rim of home port final step +805: CRASHS CLIENT - UNKNOWN +806: Training Bow Arrow pullback +807: Electric chair +808: Electric chair +809: Elemental Shield, pulse brown +810: Elemental Helmet, don't know brown +811: Elemental Helmet, don't know purple +812: Fletching Skillcape +813: Magic Skillcape +814: Mining Skillcape +815: Smithing Skillcape +816: Quest cape +817: Runecrafting Skillcape +818: Crafting Skillcape +819: Fishing Skillcape +820: Construction Skillcape +821: Cooking Skillcape +822: Woodcutting Skillcape +823: Attack Skillcape +824: Defence Skillcape +825: Farming Skillcape +826: Thieving Skillcape +827: Slayer Skillcape +828: Strength Skillcape +829: Prayer Skillcape +830: Agility Skillcape +831: Firemaking Skillcape +832: Ranged Skillcape +833: Hitpoint Skillcape (male) +834: Hitpoint Skillcape (female) +835: Herblore Skillcape +836: Dragonplatelegs drop model +837: Walking Troll +838: Running Troll +839: Spinning Vines/Bush - Tai bwo wanni cleanup maybe +840: Spinning Rake head +841: Dropping dirt +842: Handing over a(n) 'Vial' +843: Hold up, then put to side 'Vial' +844: Dump 'Vial' contents on floor +845: Hold up the empty 'Vial' +846: Rake, then break the rake top, hold stick up +847: Rake Stick, moves forward +848: Flies, flying around head +849: Bucket, scoops something, then vanishes +850: Throwing Troll rock throw? +851: Drunken Dwarf, Backflip +852: Drunken Dwarf Backflip cont. +853: Beer drop model +854: Kebab drop model +855: Dirt flies into the air +856: Rolling boulder +857: Boulder toss +858: Small white water splash +859: Rhudolf red nose (EMOTE GFX) +860: Falling snow +861: undescribable +862: Snow crushes and falls +863: Penance Healers poison smog attack +864: Penance Healers healing smog attack +865: Penance Rangers hit gfx/endgfx +866: Penance Rangers projectile +867: Green Egg explosion +868: Red Egg explosion +869: Blue Egg explosion +870: Penance Queens attack projectile, purple ring +871: Penance Queens hit gfx/endgfx +872: Penance Queen hit gfx/endgfx cont. +873: Green Egg splurt, when bad pickup for collector +874: Red Egg splurt, when bad pickup for collector +875: Blue Egg splurt, when bad pickup for collector +876: Green Egg Explosion / Same as 867 +877: Hot Air Balloon, letting it float away, let it go +878: Hot Air Balloon, flying +879: Hot Air Balloon on fire, and falls +880: Hot Air Balloon fly upwards +881: Hot Air Balloon floating +882: Hot Air Balloon flying, then bursts into fire and falls +883: Yellow Hot Air Balloon fly upwards +884: Yellow Hot Air Balloon floating +885: Yellow Hot Air Balloon flying, then bursts into fire and falls +886: Blue Hot Air Balloon fly upwards +887: Blue Hot Air Balloon floating +888: Blue Hot Air Balloon flying, then bursts into fire and falls +889: Red Hot Air Balloon fly upwards +890: Red Hot Air Balloon floating +891: Red Hot Air Balloon flying, then bursts into fire and falls +892: Orange Hot Air Balloon fly upwards +893: Orange Hot Air Balloon floating +894: Orange Hot Air Balloon flying, then bursts into fire and falls +895: Green Hot Air Balloon fly upwards +896: Green Hot Air Balloon floating +897: Green Hot Air Balloon flying, then bursts into fire and falls +898: Purple Hot Air Balloon fly upwards +899: Purple Hot Air Balloon floating +900: Purple Hot Air Balloon flying, then bursts into fire and falls +901: Pink Hot Air Balloon fly upwards +902: Pink Hot Air Balloon floating +903: Pink Hot Air Balloon flying, then bursts into fire and falls +904: Black Hot Air Balloon fly upwards +905: Black Hot Air Balloon floating +906: Black Hot Air Balloon flying, then bursts into fire and falls +907: Hunter Skillcape Emote +908: Regular Chinchompa projectile range +909: Red Chinchompa projectile range +910: Using/Releasing a butterfly - Black w/ swirling vortex +911: Using/Releasing a butterfly - White w/ swirling vortex +912: Using/Releasing a butterfly - Blue w/ swirling vortex +913: Using/Releasing a butterfly - Red w/ swirling vortex +914: Using/Releasing a butterfly - Black no vortex +915: Using/Releasing a butterfly - White no vortex +916: Using/Releasing a butterfly - Blue no vortex +917: Using/Releasing a butterfly - Red no vortex +918: Falconry - bird float off a bit +919: Falconry - bird float off a bit +920: Falconry - bird float off a bit +921: Falconry - bird float off a bit +922: Falconry - bird flying projectile +923: Falconry - bird landing after good catch +924: Falconry - bird landing after failed catch +925: Falconry - bird landing after failed catch +926: Falconry - bird landing after failed catch +927: Falconry - bird landing after failed catch +928: Brown hopping kebbit body +929: Black hopping kebbit body +930: Tan hopping kebbit body +931: White puff of smoke fly upwards +932: Imp getting caught by imp trap +933: Pitfall trap +934: Pitfall trap +935: Pitfall trap +936: Pitfall trap +937: Polar sabre tooth falling into pitfall +938: Polar sabre tooth jumping over pitfall +939: Larupia falling into pitfall +940: Larupia jumping over pitfall +941: Graahk falling into pitfall +942: Graahk jumping over pitfall +943: Rabbit walking/running +944: Rabbit caught by rabbit snare +945: Rabbit caught by rabbit snare +946: Rabbit caught by rabbit snare +947: Brown hopping kebbit body +948: Brown hopping kebbit body +949: Polar kebbit hopping body +950: Yellow/tan kebbit hopping body +951: Spiked kebbit hopping body +952: Dragon Fire Breath / regular +953: Dragon Fire Breath / darker color +954: exploding, star looking, dragon, breath +955: Crossbow bolt shooting +956: Bird statue +957: Bird statue +958: Bird statue +959: Bird statue +960: Bird above your head, looks like smaller version of statue +961: Bird statue +962: Bird statue, facing South, positioned south +963: Bird statue, facing North, positioned north +964: Bird statue, facing North, positioned south +965: Giant kebbit, hopping, brown +966: Giant kebbit, standing, brown +967: Sleeping, zZzZzZ, Sleeping cap +968: UNKNOWN - looks like a rolling pink diamond looking thing +969: Big blue orb, shrinks downwards +970: Green projectile +971: Green projectile endGfx, hit, explosion +972: Hold up Ghost Speak amulet, then looks like wield it +973: Hold up undead chicken (green, sick looking) +974: Puff of black smoke, looks like Egg Exploding in Barbarian Assault +975: Cool looking implosion, unknown (Maybe Omega egg explosion) +976: Yellow spike projectile, has a smoke trail +977: Green Egg projectile, spinning +978: Red Egg projectile, spinning +979: Blue Egg projectile, spinning +980: Omage Egg Projectile, spinning +981: Confused Birds above head +982: Looks like a 'bolt of lightning'(it's black) hitting the ground +983: Looks like, "low alch" but the GFX is black +984: Black Vortex above head, Spiked black stars floating downwards +985: Black explosion, looks like a bolt spell hit/endGFX +986: Black Spiked Star falling +987: Scared Swarm floating upwards / Harbie bugs +988: Scared Swarm/Harpie Bugs, GIANT swarm float upwards and expand +989: Scared Swarm/Harpie Bugs, regular swarm float upwards and expand +990: Scared Swarm/Harpie Bugs, regular swarm float downwards and shrink +991: Scared Swarm/Harpie Bugs, GIANT swarm float downwards and shrink +992: Scared Swarm/Harpie Bugs, float downwards +993: Small bug/orb float and disappear +994: Giant Arrow Throw/shot +995: Giant Arrow projectile +996: brown gfx, orb looking, unknown +997: red gfx, orb looking, unknown +998: Stun/Vulnerability/Enfeeble, player start GFX +999: Green orb(s), big, they fly inwards and shrink +1000: Green orb(s), big, they just stay there +1001: Green orb(s), big, looks like it hits a wall? +1002: Giant red orb with red tentacles coming out ot it +1003: 2 red orbs on both hand sides, with tentacles coming out of it +1004: BORK, growing +1005: BORK, looks like a statue of him breaking +1006: Yellow orb(s), big, they fly inwards and shrink +1007: Yellow orb(s), big, they just stay there +1008: Yellow orb(s), big, looks like it hits a wall? +1009: 2 purple orbs on both hand sides, with tentacles coming out of it +1010: Giant purple orb with tentacles coming out of it +1011: Giant purple orb with tentacles, expands and disapears +1012: Enchanting a necklace, ISN'T the original one +1013: Giant red orb with tentacles coming out of it +1014: Falling Ice shard, penguin quest/island +1015: Enter clockwork penguin suit +1016: Leave clockworkpenguin suit +1017: 2 Ice shard projectiles +1018: Snow chunks flipping +1019: Snow particles flipping, looks like someone digging and tossing snow +1020: Juggling 3 balls, one red, one blue, one green (jester controls, neitiznot quest, fremmy isles) +1021: UNKNOWN +1022: Throwing a giant ice ball? +1023: CRASHS CLIENT - UNKNOWN +1024: Flying human leg, spinning - Soul's Bane +1025: UNKNOWN - looks like a pulsating web +1026: Circular water puddle below feet, pulsating, water drops floating upwards +1027: Barrelchest Anchor special GFX +1028: Explosion, with a puff of smoke +1029: Insects outer body shedding, like Kalphite Queens first form +1030: An animal, looks like it dies, UNKNOWN +1031: An animal, looks like it dies, UNKNOWN +1032: An animal, looks like it dies, UNKNOWN +1033: An animal, looks like it dies, UNKNOWN +1034: Dorgshenkan Teleporting, breaking a teleport ORB +1035: Bouncing red, ball looking thing +1036: Mithril Grapple, about to shoot +1037: Yellow Orb, with spiky trail, shoots into a piece of paper your holding +1038: Yellow Orb, runes show above it, then get sucked into it, then disapears +1039: Rabbit, floats upward slowly, then disapears (Rabbit egg?) +1040: Blue Easter egg breaks open +1041: Blue Easter egg breaks open +1042: Green Easter egg breaks open +1043: Red Easter egg breaks open +1044: Pink/Purple Easter egg breaks open +1045: Yellow Easter egg breaks open +1046: UNKNOWN - Can't see it +1047: Easter Basket by your side +1048: Brine Sabre, special attack GFX +1049: Arrow shoots into the ground form a high height, then disapears +1050: Arrow with purple feathers, pullback GFX +1051: Arrow with purple feathers, projectile +1052: Ancient Mace, special attack GFX +1053: Arrow with purple feathers, UNKNOWN +1054: Transparent brown orb forms infront of you +1055: Kalphite Queen first form, outer shell breaking, after death +1056: Sleeping, zZzZzZzZ +1057: A snow hole forms below you, looks like a burrow +1058: A snow hole forms below you, looks like a burrow +1059: Stat Spy GFX +1060: Stat Spy GFX +1061: Humidify GFX +1062: Spellbook Swap GFX +1063: Plankmake GFX +1064: Transparent purple slime falls, then forms The Inadequacy +1065: Transparent purple slime expands, and pulses, then forms The Inadequacy +1066: The Inadequacy magic Attack +1067: The Inadequacy magic projectile +1068: The Inadequacy Death GFX +1069: A Doubt - It's spawning GFX +1070: A Doubt - when it teleports +1071: Transparent slime, forms into The Everlasting +1072: The Everlasting Death GFX +1073: The Illusive Death GFX +1074: Make Hunter Kit +1075: UNKNOWN +1076: UNKNOWN +1077: Brown hole forming below you +1078: A beat spinning +1079: Werewolf transformation +1080: Werewolf transformation +1081: Werewolf transformation +1082: Werewolf transformation +1083: Werewolf transformation +1084: Werewolf transformation +1085: Werewolf transformation +1086: Werewolf transformation +1087: Werewolf transformation +1088: Werewolf transformation +1089: Werewolf transformation +1090: Werewolf transformation +1091: Werewolf transformation +1092: Werewolf transformation +1093: Werewolf transformation +1094: Werewolf transformation +1095: Werewolf transformation +1096: Werewolf transformation +1097: Werewolf transformation +1098: Werewolf transformation +1099: Dark Bow dragon arrow special attack GFX +1100: Dark Bow arrow impact small black explosion, endGFX/hit +1101: Dark Bow arrow smoke trail +1102: Dark Bow arrow smoke trail +1103: Dark Bow arrow impact smoke hit, endGFX/hit +1104: Double Arrow pullback - Bronze Arrows +1105: Double Arrow pullback - Iron Arrows +1106: Double Arrow pullback - Steel Arrows +1107: Double Arrow pullback - Mithril Arrows +1108: Double Arrow pullback - Adamant Arrows +1109: Double Arrow pullback - Rune Arrows +1110: Double Arrow pullback - Ice Arrows +1111: Double Arrow pullback - Dragon Arrows +1112: Double Arrow pullback - Broad Arrows +1113: Double Arrow pullback - Fire Arrows or something +1114: Double Arrow pullback - Fire Arrows or something +1115: CLIENT CRASH - UNKNOWN +1116: Single Arrow pullback - Dragon Arrow +1117: Sachel emote +1118: Teleport to Impetuous Implings Minigame - Wheat Field beam +1119: Impling teleporting to a different location GFX - White smoke puff +1120: Dragon Arrow w/ Fire projectile +1121: Dragon Arrow w/ Fire projectile +1122: UNKNOWN - makes character turn invisible for a second +1123: Dragon Dart throwing +1124: Impling jar breaking w/ impling inside +1125: Impling jar breaking w/ impling inside +1126: Impling jar breaking w/ impling inside +1127: Impling jar breaking w/ impling inside +1128: Impling jar breaking w/ impling inside +1129: Impling jar breaking w/ impling inside +1130: Impling jar breaking w/ impling inside +1131: Impling jar breaking w/ impling inside +1132: Impling jar breaking w/ impling inside +1133: Impling jar breaking w/ impling inside +1134: Exchanging an impling jar w/ impling inside +1135: Exchanging an impling jar w/ impling inside +1136: Exchanging an impling jar w/ impling inside +1137: Exchanging an impling jar w/ impling inside +1138: Exchanging an impling jar w/ impling inside +1139: Exchanging an impling jar w/ impling inside +1140: Exchanging an impling jar w/ impling inside +1141: Exchanging an impling jar w/ impling inside +1142: Exchanging an impling jar w/ impling inside +1143: Exchanging an impling jar w/ impling inside +1144: Spinning impling jar w/ impling inside +1145: Spinning impling jar w/ impling inside +1146: Spinning impling jar w/ impling inside +1147: Spinning impling jar w/ impling inside +1148: Spinning impling jar w/ impling inside +1149: Spinning impling jar w/ impling inside +1150: Spinning impling jar w/ impling inside +1151: Spinning impling jar w/ impling inside +1152: Spinning impling jar w/ impling inside +1153: Spinning impling jar w/ impling inside +1154: Burst of Fire below your feet - looks amazing! +1155: Fireball GFX +1156: Pet Rock - +1157: Pet Rock - Throw Stick +1158: Throwing the Stick projectile +1159: Stick falling and hitting the ground GFX, disapears +1160: Dragonfire Shield - swirling fire around the shield, looks like its charging +1161: Dragonfire Shield - swirling fire around the shield, looks like its charging +1162: Dragonfire Shield - swirling fire around the shield, looks like its charging +1163: Dragonfire Shield - swirling fire around the shield, looks like its charging +1164: Dragonfire Shield - swirling fire around the shield, looks like its charging +1165: Dragonfire Shield - Sucking in fire, getting ready to shoot projectile +1166: Dragonfire Shield - projectile +1167: Dragonfire Shield - burst from the shield +1168: Dragonfire Shield - small swirling fire +1169: Lighting a log with a stick and some rope, log lights on fire (barbarian firemaking) +1170: Some bouncing red looking thing, circular LOOKS like a cupcake +1171: Wierd green vines doing a, very, buggy looking animation +1172: Picks up 2 parts of a 'bowl' and throws it behind yourself +1173: Fire erupts from the ground upwards, till above the character +1174: Completionist cape, middle +1175: Completionist cape, end +1176: Red swirling GFX encircles the character +1177: Green swirling GFX encircles the chacracter +1178: Broken Pest Control Barricades +1179: Green something like glass, falls downwards +1180: Giant circle of white smoke, like something vanished +1181: Changing character clothes, dressing room falls downward +1182: Changing character clothes, dressing room stays still +1183: Changing character clothes, dressing room disappears +1184: Saradomin: Minion: Growler: Start of it's magic attack GFX +1185: Saradomin: Minion: Growler: Projectile +1186: Saradomin: Minion: Growler: endGFX/hit GFX +1187: Yellow 'Guthix Claws' grab below your feet +1188: Saradomin: Minion: Bree: Ranging Projectile +1189: Zamorak: Minion: Lava spot opens below you, and fire spews upwards +1190: Armadyl: Minion: Aviansie javelin projectile +1191: Armadyl: Minion: Aviansie throwing-axe projectile +1192: Armadyl: Minion: Aviansie Dual Javelins, look like on fire +1193: Looks like a brown fog around your head +1194: Saradomin: Zilyana: Magic based: Lightning GFX - Sarasword GFX +1195: Bandos Minion: Ranger: Throwing axe projectile +1196: Armadyl: Kree'ara: Blue/lightning spinning tornado +1197: Armadyl: Kree'ara: Brown/white spinning tornado +1198: Armadyl: Kree'ara: Blue spinning tornado +1199: Armadyl: Minion: UNKNOWN +1200: Bandos: Graardor: Ranging projectile +1201: Nex stuff +1202: Bandos: Minion: Magic start GFX +1203: Bandos: Minion: Magic projectile +1204: Nex stuff +1205: Bandos: Minion: Ranger minion GFX, looks like the NPC +1206: Bandos: Minion: Throwing axe projectile +1207: Wierd lightning pattern +1208: Like something slid in the snow +1209: Rolling snowball +1210: Zamorak: K'ril: Ranging start GFX +1211: Zamorak: K'ril: Ranging projectile +1212: Zamorak: Minion: Mage start GFX +1213: Zamorak: Minion: Mage projectile +1214: Blue sword uppercut, looks like saradomin special, but isn't +1215: Nex stuff +1216: Nex stuff +1217: Nex stuff +1218: Bandos: Graardor: smash, small +1219: Bandos: Graardor: smash, big +1220: Saradomin Godsword special attack +1221: Zamorak Godsword special attack +1222: Armadyl Godsword special attack +1223: Bandos Godsword special attack +1224: Saradomin Sword special attack, PLAYER +1225: Looks like Dragon 2h special, small red smash into the ground +1226: Crossbow bolt shot, plays it 2 times +1227: 4 white rings, pulse, looks like Growlers mage attack +1228: Teleporting with the Grand Tree GFX Start +1229: Teleporting with the Grand Tree GFX End +1230: Teleporting using a Grand Tree Pod Start +1231: 2 Spheres, white, look like lightning // Looks random +1232: Teleporting using a Grand Tree Pod End +1234: Throwing Dart - Bronze +1235: Throwing Dart - Iron +1236: Throwing Dart - Steel +1237: Throwing Dart - Black +1238: Throwing Dart - Mithril +1239: Throwing Dart - Adamant +1240: Throwing Dart - Rune +1241: Spinning green looking thing, projectile //Looks random +1242: Throwing Dart - Dragon +1243: An explosion, makes a greenish white sphere, and a spikey looking explosion +1244: Zombie Hand - Emote Tab +1245: A Fish, flys downwards, then flys back upwards +1246: Green circular ring forms below you +1247: Assist Levels +1248: Goblin sprouting up +1249: Goblin sprouting up +1250: Goblin sprouting up +1251: Goblin sprouting up +1252: Goblin sprouting up +1253: Goblin sprouting up +1254: Goblin sprouting down +1255: Goblin sprouting down +1256: Goblin sprouting down +1257: Goblin sprouting down +1258: Goblin sprouting down +1259: Goblin sprouting down +1260: White rings with yellow lines pouring down +1261: White rings with yellow lines pouring down +1262: White rings spinning +1263: Tiny white lines beneath feet +1264: Red lines hit and form a target +1265: Blue circle above you and rains down +1266: Blue lines +1267: White and green lines forming a bow +1268: Green arrow +1269: White scattering ash? +1270: White brushes? +1271: Cloud of smoke +1272: White explosion +1273: White sparkly ball flying +1274: Beams of light (rabbit hole area), Gravestone repair graphic. +1275: Blue squiggles form a dragon shape figure +1276: Puff of grey +1277: Puff of dark grey +1278: Bit of water +1279: Ice and topples over +1280: Gnome glider crashing (possibly MA) +1281: Short white blast +1282: Pelted snow melting off +1283: 2010 Snowman spinning +1284: Snow falling from snow globe +1285: snow globe continued +1286: snow globe continued +1287: Seal of approval white smoke +1288: Air spell +1289: Air spell +1290: White sword thing? +1291: White thing +1292: Snow going upwards +1293: Iron arrow +1294: Nothing +1295: White Familiar graphic +1296: Blue Familiar graphic +1297: White Familiar graphic +1298: White Familiar graphic +1299: Orange Familiar graphic +1300: White Familiar graphic +1301: White Familiar graphic +1302: Bronze Familiar graphic +1303: White Familiar graphic +1304: White Familiar graphic +1305: White Familiar graphic +1306: White Familiar graphic +1307: Orange Familiar graphic +1308: Green Familiar graphic +1309: Pink Familiar graphic +1310: Yellow Familiar graphic +1311: Brown Familiar graphic +1312: Brown smoke and a spade +1313: White Familiar graphic +1314: Small Blue summon familiar graphic +1315: Big Blue summon familiar graphic +1316: Fruit bat special +1317: Silver stars float down? +1318: Silver lines +1319: Small Blue summon familiar graphic +1320: Green orbs and lines +1322: Stars floating up +1333: Tornado +1334: Tornado Continued +1341: Confetti (for the confetti item) +1349: Gold Tornado +1350: Gold tornado, continued +1351: White ice stuff in circle on ground +1352: Two blackthingies projectiles +1353: Something "electric" in head, can't exactly see +1355: Purple ball rolling, projectile +1356: electric ball over head +1357: White ball at feet, projectile +1358: Light beams in different directions +1359: Stack of Green Squares spinning +1360: Green blocks smashing into something, wierd o.0 +1361: Light green ball slowly raising into air +1364: Shadow Sword Special :P +1365: Ice Beast next to you +1366: Ice Beast next to you +1367: "" similar to above +1368: Blue thingy comes from ground to surrond you +1369: Ice beast attacking +1384: Making cheese wheel +1390: Fire works blow around you? +1391: Invoke spring +1393: Raining Fire on you +1414: Spinning Turtle Shell then goes flying +1415: Smaller turtle shell projectile +1443: Some Titan (summoning) +1450: Flashing big skeleton thing? +1458: Beaver Cutting Down tree +1459: "" same as above +1463: Raining Flames +1466: Classic Cape +1447: Classic Cape +1471: Classic Cape +1499: Pest Control Portal +1500: Portal +1501: pest control creature +1502: Portal +1503: Portal +1504: Summoning, big +1512: tele into mini? +1515: Summoning skillcape emote +1516: Fairy rings teleport +1521: white seagals +1524: dug hole +1525: dug hole +1529: platypus thing diving and retrieving a chest +1530: platypus thing diving and retrieving an oyster +1523: baby platypus thing diving and retrieving a chest +1530: platypus thing diving and retrieving an oyster +1533: Safety first emote +1537: Air guitar +1541: Farming minigame (minesweeper) placing flag +1544: Zombie hand +1545: Zombie hand +1549: loads of tiny blue squares surround you +1551: Crack +1552: Fairy rings teleport +1554: safety first emote +1566: Chocatrice cape easter egg emote +1567: Player transforms into a rabbit/bunny +1576: Normal teleport, upwards +1577: Normal teleport, downwards +1578: King (yeti guy) growing +1579: Yeti (king guy) growing +1584: Fists of guthix, earning point rings +1585: Taking damage in fist of guthix +1587: Big ice block breaks +1594: Mime spotlight +1586: Winning fist of guthix +1604: Sickle Enchantment +1605: Imp relocation +1606: Pink spotlight +1607: White bead being picked up and thrown +1608: Green/white spotlight +1609: White bead being picked up and thrown +1610: Cat being lifted and moved +1611: Cat being lifted and moved +1612: Cat being lifted and moved +1613: Cat being lifted and moved +1614: Cat being lifted and moved +1615: Cat being lifted and moved +1616: Rocks pulled together? +1617: Lava rock +1618: Circle of fire and flames burst up +1619: Red to orange bubbles +1620: Red to orange bubbles +1621: Pelting stars? +1622: jad fight caves 360 atk +1623: Tzhaar +1624: Tzhaar +1625: Jad stomp +1626: Jad rock +1627: Jad rock +1628: Jad something lol +1629: Rocks shattering +1630: Small blue rocket speeding across floor (New level 99 graphics) +1631: Bigger blue rocket speeding across floor (New level 99 graphics) +1632: Blue Rocket speeding across floor (New level 99 graphics) +1633: Blue rocket flying upwards (New level 99 graphics) +1634: Sparkly blue rocket flying upwards (New level 99 graphics) +1635: Sparkles (New level 99 graphics) +1636: Sparkles and confetti (New level 99 graphics) +1637: Sparkles and falling stars (New level 99 graphics) +1638: Big red circle thing/pit curse +1639: Smaller red circle thing +1640: Fire and a burnt cockroach thing (those things in desert) +1641: Red thing +1642: Red thing +1643: Red thing +1644: Banshee head being used on red wall +1645: Coffin opening and shutting +1678: Green tele up +1679: Green tele down +1680: Tablet teleport +1681: Ancients teleport +1682: Lyre Teleport +1683: Skull Sceptre teleport +1684: Dueling Ring teleport +1685: Lunar teleport +1687: teleport +1688: Ectofungus teleport +1689: Monkey Madness teleport +1691: alch +1692: low alchemy +1693: high alchemy +1694: Crude Wood Chair (alch) +1695: Crude Wood Chair (alch) +1694: Wooden Chair (alch) +1695: Wooden Chair (alch) +1695: Rocking Chair (alch) +1694: Oak Chair (alch) +1695: Oak Chair (alch) +1694: Oak ArmChair (alch) +1695: Oak ArmChair (alch) +1694: Teak Chair (alch) +1695: Teak Chair (alch) +1694: Mahogany ArmChair (alch) +1695: Mahogany ArmChair (alch) +1694: Wooden Dining Bench (alch) +1694: Oak Dining Bench (alch) +1694: Carved Oak Dining Bench (alch) +1694: Carved Teak Dining Bench (alch) +1694: Mahogany Dining Bench (alch) +1694: Gilded Mahogany Dining Bench (alch) +1694: Oak Throne (alch) +1694: Teak Throne (alch) +1694: Mahogany Throne (alch) +1694: Gilded mahogany Throne (alch) +1694: Skeleton Throne (alch) +1694: Crystal Throne (alch) +1694: Demonic Throne (alch) +1702: Kiss emote (original) +1729: korasi special attack +1731: Cabbage teleport (explorer's ring) +1732: Cabbage teleport (explorer's ring) +1733: Recharge run +1734: Explore emote +1735: Explore emote +1737: energy ball floats to you, disappears when close +1738: corporal beast eats summoning creature +1740: thunder thingy +1744: cage made of light +1745: purple bolts and white rings (teleport) +1746: ring around you floats up +1747: purple teleport ring thingy +1760: Puff of smoke, leaves a black aura (disappear emote) +1761: Head in sand emote +1762: Ghost emote +1763: Red aura thing +1764: Green aura thing +1765: Fireworks (deathcon) +1766: Living on borrowed time emote +1768: entering deathcon red portal +1767: coming out of deathcon red portal +1774: Runes floating around +1778: summoning bird going to find fruit or whatever +1781: Jugging balls +1782: Juggling balls fail +1783: Juggling knives +1784: Juggling knives fail +1785: Juggling torches +1786: Juggling torches fail +1787: Juggling cannonballs +1788: Juggling cannonballs fail +1789: Juggling plates +1790: Juggling plates fail +1791: Juggling soap +1792: Juggling soap fail +1793: Juggling spades +1794: Juggling spades fail +1795: Juggling tuna +1796: Juggling tuna fail +1797: Juggling eggs +1798: Juggling eggs fail +1799: Juggling chinchompas +1800: Juggling chinchompas fail +1801: Bronze arrow +1802: Nothing +1803: Tearing circus ticket +1817: coming out of deathcon red portal +1834: corp stomp +1835: Vesta's Spear +1836: Morrigan's javelin +1837: Morrigan's javelin projectile +1838: Morrigan's throwing axe +1840: Statius's warhammer +1847: purple, red and more around you? +1845: Miasmic Spell? +1847: Miasmic Spell? +1848: Puff of red smoke up and down +1849: Puff of red smoke up and down +1853: Miasmic Barrage +1854: Some Spell +1855: Morrigans javelin drawback +1856: Morrigans throwing axe +1864: Scare emote +1866: Dust broom emote +1890: Wierd black Thing +1896: Black Wierd thing comes down on you? +1897: Black Wierd thing comes down on you? +1898: Death/Black skull swirl? +1901: dark energy +1918: Balance Elemental Range drawback +1932: While Guthix Sleeps/lummy caves strange light npc +1933: While Guthix Sleeps/lummy caves strange light creature/npc +1935: dark energy +1936: Balance Elemental rock drawback +1937: Balance Elemental rock projectile +1938: Balance Elemental rock impact +1939: Balance Elemental Magic drawback +1940: Balance Elemental Magic projectile +1941: Balance Elemental Magic impact +1943: balanced elemental +1944: Balance Elemental Battle entrance? +1946: Balance Elemental Death? +1950: dragon claw special +1964: falador shield pray restore +1965: falador shield 3 emote +1966: falador shield 1 emote +1973: Freeze emote +2000: Blue swirl +2001: Blue and White Swirling at feet, spell? +2002: Breaking Glass ball (Dorguushun teleport) +2003: Dorguushun teleport +2004: Dorguushun teleport +2006: electric portal +2007: bluish spike thingy +2008: corp stomp on wall +2009: wind blowing round you +2011: wind blowing round you +2015: blue shield with blue oval bouble +2018: broken black bouble thing +2019: black explosion +2021: black tele thing that opens up +2029: sand/bug type monster +2035: bunny take head off +2036: giant Easter egg +2037: Around the world in eggty days +2039: raining fire +2040: light portal comes up +2044: same as 2040 +2045: black spiral spike thingy falls down +2047: giant saws falling (skeletons?) +2048: Sleeping, zzz +2049: Penguin head floating +2050: Penguin sliding on ice +2051: explosion from beneath +2052: cannon +2053: cannon +2054: cannon +2059: giant chin(mb) +2060: Multi Color Squirl, then Puff of smoke +2061: Multi Color Squirl, then Puff of smoke +2062: tiny puff of smoke +2063: black dot? +2064: falling rocks? +2065: falling rocks? +2066: falling rocks? +2067: falling rocks? +2068: Dice +2069: Dice +2070: Dice +2071: Dice +2072: Dice +2073: Dice +2074: Dice +2075: Dice +2076: Dice +2077: Dice +2078: Dice +2079: Dice +2080: Dice +2081: Dice +2082: Dice +2083: Dice +2084: Dice +2085: Dice +2086: Dice +2087: Dice +2088: Dice +2089: Dice +2090: Dice +2091: Dice +2092: Dice +2093: Dice +2094: Dice +2095: Dice +2096: Dice +2097: Dice +2098: Dice +2099: Dice +2100: white slash +2101: purple lightening ball +2102: electrical shock and puff of smoke +2103: mithril grapple +2104: zamorak godsword ice special +2105: zamorak godsword ice special attack +2106: tiny arrow? +2107: arrow +2108: old abyssal whip special, red rings +2109: saradomin godsword special attack +2110: null +2111: null +2112: null +2113: armadyl godsword special attack +2114: bandos godsword special attack +2115: saradomin sword special attack +2116: zamorak spear/zamorakian spear special attack +2117: dragon sword special attack +2118: some sort of dragon special, idk +2119: icey colored magic projectile +2120: very quick icey colored ball +2121: very quick icey colored ball +2122: icey coloured splash +2123: sparks from an anvil +2124: nothing? +2125: nothing? +2126: white and black swirley ball? +2127: white swirley ball? +2128: white and black rings/spiral +2129: null +2130: white and black things +2131: white thing +2132: white thing +2133: hole appears with a hand dragging you in (teleport) +2134: hole appears with hand pushing you out (teleport) +2135: fire +2136: fire +2140: hand cannon explode +2141: hand cannon explode +2143: Hand cannon ball projectile +2144: red slash with explosion? +2145: Squirrel Ears (holiday reward item) +2146: ice +2147: puff of smoke +2148: fireball on floor +2149: rocks falling +2150: rocks falling +2151: guard turns to ash and falls +2152: null +2153: null +2154: null +2155: null +2156: weird stuff +2157: wooden planks +2158: wooden planks +2159: wooden planks +2160: wooden planks +2161: wooden planks +2162: wooden planks +2163: wooden planks +2164: wooden planks +2165: weird rainbowy/white thing +2166: streaks of light float upwards? +2167: colorful little balls with 2 big white balls +2168: colorful little balls with 1 big white ball +2169: streaks of light flush towards you? +2170: purple roots? +2171: null +2172: Ardougne Cape teleport +2173: ardougne cape teleport return +2174: Grand Tree teleport +2175: Grand tree return +2176: Ardougne Cape teleport +2177: ardougne cape teleport return +2177: null +2178: eek the spider +2179: eek the spider +2180: Throwing Eek the spider +2181: fire ball? +2182: purple ball +2183: purple spikey ball +2184: small flash of light +2185: medium flash of light +2186: large flash of light +2187: fire? +2188: purple fire? +2189: quick purple flames +2190: purple puff of smoke +2191: null +2192: null +2193: null +2194: null +2195: null +2196: null +2197: null +2198: null +2199: fire surge +2200: null +2201: fire surge +2202: fire surge +2203: fire surge +2204: fire rings +2205: yellow floating guy (explorer or something near piscatoris) +2213: Protect Item +2214: Sap Warrior Shoot +2215: Sap Warrior Projectile +2216: Sap Warrior Impact +2217: Sap Ranged Shoot +2218: Sap Ranged Projectile +2219: Sap Ranged Impact +2220: Sap Mage Shoot +2221: Sap Mage Projectile +2222: Sap Mage Impact +2223: Sap Spirit Shoot +2224: Sap Spirit Projectile +2225: Sap Spirit Impact +2226: turmoil +2227: Deflect Summoning +2228: Deflect Magic +2229: Deflect Ranged +2230: deflect melee +2231: Leech Attack Projectile +2232: Leech Attack Impact +2233: Leech Attack Impact +2236: Leech Range Projectile +2237: Leech Range Impact +2238: Leech Range Impact +2240: Leech Magic Projectile +2241: Leech Magic Impact +2242: Leech Magic Impact +2244: Leech Defence Projectile +2245: Leech Defence Impact +2246: Leech Defence Impact +2248: Leech Strength Projectile +2249: Leech Strength Impact +2250: Leech Strength Impact +2252: Leech Energy Projectile +2253: Leech Energy Impact +2254: Leech Energy Impact +2256: Leech Special Projectile +2257: Leech Special Impact +2258: Leech Special Impact +2263: Soulsplit Projectile +2264: Soulsplit Impact +2266: Berserker +2280: Green twirley vines? +2281: Green twirley vines? +2282: Green blast +2283: White mage projectile +2284: Barbarian assault defender icon +2285: Barbarian assault attacker icon +2286: Barbarian assault healer icon +2287: Barbarian assault collector icon +2288: Barbarian assault attacker and collector icon +2289: Barbarian assault defender and attacker icon +2290: Barbarian assault defender and collector icon +2291: Barbarian assault defender and healer icon +2292: Barbarian assault attacker and healer icon +2293: Barbarian assault collector and healer icon +2294: Barbarian assault collector, attacker and healer icon +2295: Barbarian assault collector, defender and healer icon +2296: Barbarian assault attacker, healer and defender icon +2297: Barbarian assault collector, attacker and defender icon +2298: Barbarian assault collector, attacker, healer and defender icon +2299: butterfly? +2300: butterfly? +2301: butterfly? +2302: butterfly? +2303: rock golem? +2304: rock golem? +2305: rock golem? +2306: rock golem? +2307: purple bubbles/sparkles +2308: rock golem pet? +2319: staff of light special +2320: staff of light special? +2321: Staff of light +2345: red stuff like blood barrage +2350: rune guardian +2391: blue spinning thingy that explodes +2393: crystals around ur legs +2436: orange explosion +2437: orange explosion +2437: white explosion +2442: Dungeoneering skillcape +2451: lighting around you +2400+: dungeoneering +2517: To Player Return (Dungoneernig teleport) +2516: To Player(Dungeoneering teleport) +2584: dungeoneering poison dropping +2602: Home (Dungeoneering teleport) +2603: Home Return (Dungoneering teleport) +2688: red castle wars smoke +2689: blue castle wars smoke +2691: teletab? +2692: effigy +2693: Void stares back ghost +2694: Void stares back ghost +2695: Void stares back ghost +2696: Void stares back ghost +2697: Void stares back ghost +2701: Water +2702: Water +2728: Fire +2713: Earth +2714: Earth +2715: Earth +2716: Earth +2717: Earth +2743: wise old man walking +2744: very large summoning graphic +2745: constitution skillcape male +2746: constitution skillcape female +2777: master dungeoneering cape +2778: master dungeoneering cape +2779: master dungeoneering cape +2780: master dungeoneering cape +2781: master dungeoneering cape +2782: master dungeoneering cape +2783: master dungeoneering cape +2792: leveling up to 99? +2795: korasi special attack +2837: Puppet master +2838: bone brooch +2845: blue light +2846: grey explode +2898: jadinko +2899: jadinko +2900: jadinko +2901: jadinko +2902: jadinko +2903: jadinko +2904: jadinko +2905: jadinko +2906: jadinko +2907: jadinko +2908: jadinko +2909: jadinko +2910: jadinko +2911: jadinko +2912: jadinko +2913: jadinko +2914: jadinko +2915: jadinko +2916: jadinko +2917: jadinko +2918: jadinko +2919: jadinko +2920: jadinko +2930: Task master emote +2931: magic carpet taking off +2932: magic carpet flying +2933: magic carpet landing +2952: golden cracker +2953: golden hammer twirl +2964: 10th anniversary cake +2969: Rope +2970: Rope +2971: Grand tree pod \ No newline at end of file diff --git a/dumps/530/music_location_unlocks.txt b/dumps/530/music_location_unlocks.txt new file mode 100644 index 000000000..902d9bf01 --- /dev/null +++ b/dumps/530/music_location_unlocks.txt @@ -0,0 +1,633 @@ +TrackDefinition [arrayId=0, trackset=Trackset: Varrock, , fileId=177, name=Adventure, unlock=at Varrock Palace.] +TrackDefinition [arrayId=1, trackset=Trackset: Kharidian, , fileId=50, name=Al Kharid, unlock=at Al Kharid.] +TrackDefinition [arrayId=2, trackset=Trackset: "Only defined", , fileId=102, name=Alone, unlock=at the Clock Tower Dungeon.] +TrackDefinition [arrayId=3, trackset=Trackset: Jungle, , fileId=90, name=Ambient Jungle, unlock=at Shilo Village.] +TrackDefinition [arrayId=4, trackset=Trackset: Kharidian, , fileId=36, name=Arabian, unlock=in the Kharidian Desert.] +TrackDefinition [arrayId=5, trackset=Trackset: Kharidian, , fileId=123, name=Arabian2, unlock=at Al Kharid mine.] +TrackDefinition [arrayId=6, trackset=Trackset: Kharidian, , fileId=124, name=Arabian3, unlock=at the desert entrance to the Kalphite Lair.] +TrackDefinition [arrayId=7, trackset=Trackset: Cave, , fileId=19, name=Arabique, unlock=at the hellhounds in Taverley Dungeon.] +TrackDefinition [arrayId=8, trackset=Trackset: Wilderness, , fileId=160, name=Army of Darkness, unlock=at the Dark Warrior's Fortress.] +TrackDefinition [arrayId=9, trackset=Trackset: Falador, , fileId=186, name=Arrival, unlock=at the gem trader in Falador.] +TrackDefinition [arrayId=10, trackset=Trackset: Castle wars, , fileId=24, name=Attack1, unlock=at the Battlefield north of Tree Gnome Village.] +TrackDefinition [arrayId=11, trackset=Trackset: Castle wars, , fileId=25, name=Attack2, unlock=at Elvarg's lair or during Grand Tree Quest.] +TrackDefinition [arrayId=12, trackset=Trackset: Castle wars, , fileId=26, name=Attack3, unlock=to the north of the Lava Maze.] +TrackDefinition [arrayId=13, trackset=Trackset: Castle wars, , fileId=27, name=Attack4, unlock=at the Fight Arena.] +TrackDefinition [arrayId=14, trackset=Trackset: Castle wars, , fileId=28, name=Attack5, unlock=at the King Black Dragon.] +TrackDefinition [arrayId=15, trackset=Trackset: Castle wars, , fileId=29, name=Attack6, unlock=at Gu'Tanoth Ogre Enclave.] +TrackDefinition [arrayId=16, trackset=Trackset: Falador, , fileId=180, name=Attention, unlock=at the coastline below Rimmington.] +TrackDefinition [arrayId=17, trackset=Trackset: Lumbridge, , fileId=2, name=Autumn Voyage, unlock=at Lumbridge farm.] +TrackDefinition [arrayId=18, trackset=Trackset: Falador, , fileId=324, name=Background, unlock=on Entrana.] +TrackDefinition [arrayId=19, trackset=Trackset: Eastern ardougne, , fileId=152, name=Ballad of Enchantment, unlock=at the Monastery.] +TrackDefinition [arrayId=20, trackset=Trackset: Eastern ardougne, , fileId=99, name=Baroque, unlock=in Ardougne.] +TrackDefinition [arrayId=21, trackset=Trackset: Dwarf, , fileId=100, name=Beyond, unlock=at the ice dungeon under Wolf Mountain.] +TrackDefinition [arrayId=22, trackset=Trackset: Yanille(?) , , fileId=83, name=Big Chords, unlock=to the west of Yanille.] +TrackDefinition [arrayId=23, trackset=Trackset: Lumbridge, , fileId=64, name=Book of Spells, unlock=at Lumbridge Swamp.] +TrackDefinition [arrayId=24, trackset=Trackset: Seers Village & Camelot, , fileId=104, name=Camelot, unlock=at Camelot Castle.] +TrackDefinition [arrayId=25, trackset=Trackset: Dwarf, , fileId=325, name=Cave Background, unlock=at the Dwarven Mine.] +TrackDefinition [arrayId=26, trackset=Trackset: Cave, , fileId=68, name=Cavern, unlock=at Yanille Agility Dungeon.] +TrackDefinition [arrayId=27, trackset=Trackset: Cave, , fileId=63, name=Chain of Command, unlock=during Temple of Ikov.] +TrackDefinition [arrayId=28, trackset=Trackset: Zanaris, , fileId=181, name=Crystal Cave, unlock=at Zanaris market.] +TrackDefinition [arrayId=29, trackset=Trackset: Wilderness, , fileId=169, name=Crystal Sword, unlock=at the Wilderness, north of Varrock.] +TrackDefinition [arrayId=30, trackset=Trackset: Wilderness, , fileId=182, name=Dangerous, unlock=to the north of Edgeville.] +TrackDefinition [arrayId=31, trackset=Trackset: Wilderness, , fileId=326, name=Dark, unlock=in the south-east of the Wilderness.] +TrackDefinition [arrayId=32, trackset=Trackset: Wilderness, , fileId=37, name=Deep Wildy, unlock=in the north-west of the Wilderness.] +TrackDefinition [arrayId=33, trackset=Trackset: Kharidian, , fileId=174, name=Desert Voyage, unlock=around the Desert Mining Camp.] +TrackDefinition [arrayId=34, trackset=Trackset: Wilderness, , fileId=56, name=Doorways, unlock=to the north of the Grand Exchange.] +TrackDefinition [arrayId=35, trackset=Trackset: Lumbridge, , fileId=327, name=Dream, unlock=on the path between Lumbridge and Draynor.] +TrackDefinition [arrayId=36, trackset=Trackset: "Only defined", , fileId=173, name=Dunjun, unlock=in Taverley Dungeon.] +TrackDefinition [arrayId=37, trackset=Trackset: Kharidian, , fileId=69, name=Egypt, unlock=at Shantay Pass.] +TrackDefinition [arrayId=38, trackset=Trackset: Tree Gnome Stronghold, , fileId=148, name=Emotion, unlock=in the Tree Gnome Village maze.] +TrackDefinition [arrayId=39, trackset=Trackset: Falador, , fileId=138, name=Emperor, unlock=in Melzar's Maze.] +TrackDefinition [arrayId=40, trackset=Trackset: Varrock, , fileId=106, name=Expanse, unlock=at the stone circle in Varrock.] +TrackDefinition [arrayId=41, trackset=Trackset: Yanille(?) , , fileId=41, name=Expecting, unlock=at the unholy altar north of the Observatory.] +TrackDefinition [arrayId=42, trackset=Trackset: Cave, , fileId=153, name=Expedition, unlock=in the caverns below the Observatory.] +TrackDefinition [arrayId=43, trackset=Trackset: Zanaris, , fileId=118, name=Faerie, unlock=at Zanaris.] +TrackDefinition [arrayId=44, trackset=Trackset: Falador, , fileId=72, name=Fanfare, unlock=at Falador Castle.] +TrackDefinition [arrayId=45, trackset=Trackset: Port, , fileId=167, name=Fanfare3, unlock=at Port Khazard.] +TrackDefinition [arrayId=46, trackset=Trackset: Seers Village & Camelot, , fileId=119, name=Fishing, unlock=at Catherby beach.] +TrackDefinition [arrayId=47, trackset=Trackset: Lumbridge, , fileId=163, name=Flute Salad, unlock=at the Lumbridge windmill area.] +TrackDefinition [arrayId=48, trackset=Trackset: Varrock, , fileId=98, name=Forever, unlock=at Edgeville.] +TrackDefinition [arrayId=49, trackset=Trackset: Feldip hills, , fileId=159, name=Gaol, unlock=to the north of the Bandit Camp in the Wilderness.] +TrackDefinition [arrayId=50, trackset=Trackset: Varrock, , fileId=125, name=Garden, unlock=at Varrock city centre.] +TrackDefinition [arrayId=51, trackset=Trackset: Tree Gnome Stronghold, , fileId=22, name=Gnome King, unlock=at the Tree Gnome Stronghold.] +TrackDefinition [arrayId=52, trackset=Trackset: "Only defined", , fileId=310, name=Dwarf Theme, unlock=at the Dwarven Mine.] +TrackDefinition [arrayId=53, trackset=Trackset: Tree Gnome Stronghold, , fileId=33, name=Gnome Village, unlock=at the Tree Gnome Stronghold's Agility Training Area.] +TrackDefinition [arrayId=54, trackset=Trackset: Tree Gnome Stronghold, , fileId=101, name=Gnome Village2, unlock=to the south-west of the Tree Gnome Stronghold.] +TrackDefinition [arrayId=55, trackset=Trackset: "Only defined", , fileId=313, name=Goblin Village, unlock=at Goblin Village.] +TrackDefinition [arrayId=56, trackset=Trackset: Tree Gnome Stronghold, , fileId=112, name=Gnomeball, unlock=at the Gnome Ball Field.] +TrackDefinition [arrayId=57, trackset=Trackset: Varrock, , fileId=116, name=Greatness, unlock=at the Champions' Guild.] +TrackDefinition [arrayId=58, trackset=Trackset: Lumbridge, , fileId=76, name=Harmony, unlock=at Lumbridge Castle.] +TrackDefinition [arrayId=59, trackset=Trackset: Port, , fileId=55, name=High Seas, unlock=at Brimhaven.] +TrackDefinition [arrayId=60, trackset=Trackset: Falador, , fileId=18, name=Horizon, unlock=in Taverley.] +TrackDefinition [arrayId=61, trackset=Trackset: "Only defined", , fileId=1, name=Iban, unlock=at Iban's lair in the Underground Pass.] +TrackDefinition [arrayId=62, trackset=Trackset: Yanille(?) , , fileId=188, name=In the Manor, unlock=at the ogre island, west of Yanille.] +TrackDefinition [arrayId=63, trackset=Trackset: Wilderness, , fileId=96, name=Inspiration, unlock=at the area north of the Black Knights' Fortress.] +TrackDefinition [arrayId=64, trackset=Trackset: Cave, , fileId=95, name=Intrepid, unlock=in the Underground Pass caverns.] +TrackDefinition [arrayId=65, trackset=Trackset: Port, , fileId=6, name=Jolly-R, unlock=at the north dock of Brimhaven.] +TrackDefinition [arrayId=66, trackset=Trackset: Jungle, , fileId=172, name=Jungle Island, unlock=on Karamja.] +TrackDefinition [arrayId=67, trackset=Trackset: Jungle, , fileId=114, name=Jungly1, unlock=at Cairn Isle.] +TrackDefinition [arrayId=68, trackset=Trackset: Jungle, , fileId=115, name=Jungly2, unlock=to the north-west of Brimhaven.] +TrackDefinition [arrayId=69, trackset=Trackset: Jungle, , fileId=117, name=Jungly3, unlock=at Tai Bwo Wannai Village.] +TrackDefinition [arrayId=70, trackset=Trackset: Eastern ardougne, , fileId=191, name=Knightly, unlock=at Ardougne Castle.] +TrackDefinition [arrayId=71, trackset=Trackset: Seers Village & Camelot, , fileId=60, name=Lasting, unlock=at Hemenster.] +TrackDefinition [arrayId=72, trackset=Trackset: Fremennik, , fileId=66, name=Legion, unlock=at the Barbarian Outpost.] +TrackDefinition [arrayId=73, trackset=Trackset: Wilderness, , fileId=113, name=Lightness, unlock=to the north of Edgeville.] +TrackDefinition [arrayId=74, trackset=Trackset: Seers Village & Camelot, , fileId=74, name=Lightwalk, unlock=at Keep Le Faye.] +TrackDefinition [arrayId=75, trackset=Trackset: Yanille(?) , , fileId=161, name=Long Ago, unlock=at the Fishing Platform.] +TrackDefinition [arrayId=76, trackset=Trackset: Falador, , fileId=12, name=Long Way Home, unlock=at Rimmington] +TrackDefinition [arrayId=77, trackset=Trackset: Seers Village & Camelot, , fileId=20, name=Lullaby, unlock=at the area south-west of Rellekka.] +TrackDefinition [arrayId=78, trackset=Trackset: Wilderness, , fileId=13, name=Mage Arena, unlock=at the Mage Arena.] +TrackDefinition [arrayId=79, trackset=Trackset: Yanille(?) , , fileId=185, name=Magic Dance, unlock=in the east of Yanille.] +TrackDefinition [arrayId=80, trackset=Trackset: Seers Village & Camelot, , fileId=184, name=Magical Journey, unlock=at the Sorcerer's Tower.] +TrackDefinition [arrayId=81, trackset=Trackset: Northwest Ardougne, , fileId=328, name=March, unlock=at King Lathas's Combat Training Camp.] +TrackDefinition [arrayId=82, trackset=Trackset: Varrock, , fileId=157, name=Medieval, unlock=to the west of the Dig Site.] +TrackDefinition [arrayId=83, trackset=Trackset: Waterfall (?), , fileId=193, name=Mellow, unlock=at the Fishing Guild.] +TrackDefinition [arrayId=84, trackset=Trackset: Falador, , fileId=107, name=Miles Away, unlock=at the Crafting Guild.] +TrackDefinition [arrayId=85, trackset=, fileId=65, name=Miracle Dance, unlock=at the Mind Altar.] +TrackDefinition [arrayId=86, trackset=Trackset: Seers Village & Camelot, , fileId=21, name=Monarch Waltz, unlock=at the Sinclair Mansion.] +TrackDefinition [arrayId=87, trackset=Trackset: Northwest Ardougne, , fileId=10, name=Moody, unlock=at the entrance to the Underground Pass.] +TrackDefinition [arrayId=88, trackset=Trackset: Tree Gnome Stronghold, , fileId=155, name=Neverland, unlock=to the south of Tree Gnome Village.] +TrackDefinition [arrayId=89, trackset=Trackset: Lumbridge, , fileId=62, name=Newbie Melody, unlock=on Tutorial Island.] +TrackDefinition [arrayId=90, trackset=Trackset: Falador, , fileId=127, name=Nightfall, unlock=at the north of Rimmington] +TrackDefinition [arrayId=91, trackset=Trackset: Cave, , fileId=103, name=Oriental, unlock=in the Waterfall Dungeon, East of Shilo Village.] +TrackDefinition [arrayId=92, trackset=Trackset: Seers Village & Camelot, , fileId=7, name=Overture, unlock=at Seers' Village.] +TrackDefinition [arrayId=93, trackset=Trackset: Varrock, , fileId=93, name=Parade, unlock=at the Jolly Boar Inn.] +TrackDefinition [arrayId=94, trackset=, fileId=158, name=Quest, unlock=at the Fire Altar.] +TrackDefinition [arrayId=95, trackset=Trackset: Wilderness, , fileId=329, name=Regal, unlock=at the Rogues' Castle.] +TrackDefinition [arrayId=96, trackset=Trackset: Jungle, , fileId=78, name=Reggae, unlock=to the south-east of the Kharazi Jungle.] +TrackDefinition [arrayId=97, trackset=Trackset: Jungle, , fileId=89, name=Reggae2, unlock=to the east of Karamja Jungle.] +TrackDefinition [arrayId=98, trackset=Trackset: Elven, , fileId=91, name=Riverside, unlock=to the west of Tyras Camp.] +TrackDefinition [arrayId=99, trackset=Trackset: Cave, , fileId=53, name=Royale, unlock=at the Black Knight base in Taverley Dungeon.] +TrackDefinition [arrayId=100, trackset=, fileId=57, name=Rune Essence, unlock=at the rune essence mine.] +TrackDefinition [arrayId=101, trackset=Trackset: Northwest Ardougne, , fileId=5, name=Sad Meadow, unlock=at West Ardougne.] +TrackDefinition [arrayId=102, trackset=Trackset: Cave, , fileId=144, name=Scape Cave, unlock=during the Lumbridge Tutorial and in Varrock Sewers.] +TrackDefinition [arrayId=103, trackset=Trackset: "Only defined", , fileId=400, name=Scape Original, unlock=automatically.] +TrackDefinition [arrayId=104, trackset=Trackset: Wilderness, , fileId=331, name=Scape Sad, unlock=at the Demonic Ruins in the Wilderness.] +TrackDefinition [arrayId=105, trackset=Trackset: Wilderness, , fileId=332, name=Scape Wild, unlock=in the Wilderness.] +TrackDefinition [arrayId=106, trackset=Trackset: Port, , fileId=92, name=Sea Shanty, unlock=at Karamja port.] +TrackDefinition [arrayId=107, trackset=Trackset: Port, , fileId=35, name=Sea Shanty2, unlock=at Port Sarim] +TrackDefinition [arrayId=108, trackset=Trackset: Yanille(?) , , fileId=110, name=Serenade, unlock=at the Observatory.] +TrackDefinition [arrayId=109, trackset=, fileId=52, name=Serene, unlock=at the Air Altar.] +TrackDefinition [arrayId=110, trackset=Trackset: Varrock, , fileId=122, name=Shine, unlock=at the Duel Arena hospital.] +TrackDefinition [arrayId=111, trackset=Trackset: Cave, , fileId=80, name=Soundscape, unlock=at the Feldip Hills glider area.] +TrackDefinition [arrayId=112, trackset=Trackset: Varrock, , fileId=175, name=Spirit, unlock=at the Cooks' Guild.] +TrackDefinition [arrayId=113, trackset=Trackset: Falador, , fileId=77, name=Splendour, unlock=at the Heroes' Guild.] +TrackDefinition [arrayId=114, trackset=Trackset: Spooky, , fileId=333, name=Spooky, unlock=at Draynor Manor.] +TrackDefinition [arrayId=115, trackset=Trackset: Jungle, , fileId=129, name=Spookyjungle, unlock=to the north-east of Karamja.] +TrackDefinition [arrayId=116, trackset=Trackset: Iceberg/Asgarnian ice dungeon/muspah's tomb, , fileId=108, name=Starlight, unlock=at the Asgarnian Ice Dungeon north of Mudskipper Point.] +TrackDefinition [arrayId=117, trackset=Trackset: Lumbridge, , fileId=151, name=Start, unlock=at Draynor Village.] +TrackDefinition [arrayId=118, trackset=Trackset: Varrock, , fileId=111, name=Still Night, unlock=at the Mining area south-east of Varrock.] +TrackDefinition [arrayId=119, trackset=Trackset: Seers Village & Camelot, , fileId=140, name=Talking Forest, unlock=at McGrubor's Wood.] +TrackDefinition [arrayId=120, trackset=Trackset: Kharidian, , fileId=79, name=The Desert, unlock=to the west of the Kharidian Desert.] +TrackDefinition [arrayId=121, trackset=Trackset: "Only defined", , fileId=170, name=The Shadow, unlock=on Crandor.] +TrackDefinition [arrayId=122, trackset=Trackset: Northwest Ardougne, , fileId=133, name=The Tower, unlock=to the north-west of Ardougne.] +TrackDefinition [arrayId=123, trackset=Trackset: Seers Village & Camelot, , fileId=109, name=Theme, unlock=at the Coal Trucks.] +TrackDefinition [arrayId=124, trackset=Trackset: Port, , fileId=38, name=Trawler, unlock=during the Fishing Trawler minigame.] +TrackDefinition [arrayId=125, trackset=Trackset: Port, , fileId=51, name=Trawler Minor, unlock=during the Fishing Trawler minigame.] +TrackDefinition [arrayId=126, trackset=Trackset: Tree Gnome Stronghold, , fileId=130, name=Tree Spirits, unlock=to the west of the Tree Gnome Stronghold.] +TrackDefinition [arrayId=127, trackset=Trackset: Jungle, , fileId=162, name=Tribal Background, unlock=in the south-east Kharazi Jungle.] +TrackDefinition [arrayId=128, trackset=Trackset: Jungle, , fileId=165, name=Tribal, unlock=to the east of Tai Bwo Wannai Village.] +TrackDefinition [arrayId=129, trackset=Trackset: Jungle, , fileId=94, name=Tribal2, unlock=at the gnome glider on Karamja.] +TrackDefinition [arrayId=130, trackset=Trackset: Eastern ardougne, , fileId=192, name=Trinity, unlock=at the Legends' Guild.] +TrackDefinition [arrayId=131, trackset=Trackset: Wilderness, , fileId=183, name=Troubled, unlock=to the west of the Bandit Camp in the Wilderness.] +TrackDefinition [arrayId=132, trackset=Trackset: Cave, , fileId=179, name=Underground, unlock=at the dramen tree in Entrana Dungeon.] +TrackDefinition [arrayId=133, trackset=Trackset: Lumbridge, , fileId=3, name=Unknown Land, unlock=at Draynor Market.] +TrackDefinition [arrayId=134, trackset=Trackset: Cave, , fileId=323, name=Underground Pass, unlock=during Underground Pass.] +TrackDefinition [arrayId=135, trackset=Trackset: Eastern ardougne, , fileId=70, name=Upcoming, unlock=at the tower of the Necromancer.] +TrackDefinition [arrayId=136, trackset=Trackset: Varrock, , fileId=75, name=Venture, unlock=at the Dig Site.] +TrackDefinition [arrayId=137, trackset=Trackset: Lumbridge, , fileId=85, name=Vision, unlock=at the Wizards' Tower.] +TrackDefinition [arrayId=138, trackset=Trackset: "Only defined", , fileId=30, name=Voodoo Cult, unlock=at the cave under the Kharazi Jungle.] +TrackDefinition [arrayId=139, trackset=Trackset: Waterfall (?), , fileId=32, name=Voyage, unlock=at the top of Baxtorian Falls.] +TrackDefinition [arrayId=140, trackset=Trackset: Falador, , fileId=49, name=Wander, unlock=at the farm area south of Falador.] +TrackDefinition [arrayId=141, trackset=Trackset: Waterfall (?), , fileId=82, name=Waterfall, unlock=at Baxtorian Falls.] +TrackDefinition [arrayId=142, trackset=Trackset: Wilderness, , fileId=435, name=Wilderness, unlock=in the Wilderness.] +TrackDefinition [arrayId=143, trackset=Trackset: Wilderness, , fileId=42, name=Wilderness2, unlock=to the south of the Lava Maze in the Wilderness.] +TrackDefinition [arrayId=144, trackset=Trackset: Wilderness, , fileId=43, name=Wilderness3, unlock=to the west of Bounty Hunter in the Wilderness.] +TrackDefinition [arrayId=145, trackset=Trackset: Wilderness, , fileId=14, name=Witching, unlock=on the east side of the Wilderness.] +TrackDefinition [arrayId=146, trackset=Trackset: Wilderness, , fileId=34, name=Wonder, unlock=to the north-west of the Black Knights' Fortress.] +TrackDefinition [arrayId=147, trackset=Trackset: Eastern ardougne, , fileId=81, name=Wonderous, unlock=near the Legends' Guild.] +TrackDefinition [arrayId=148, trackset=Trackset: Falador, , fileId=15, name=Workshop, unlock=at the Mining Guild in Falador.] +TrackDefinition [arrayId=149, trackset=Trackset: Cave, , fileId=168, name=Lonesome, unlock=at the Desert Mining Camp.] +TrackDefinition [arrayId=150, trackset=Trackset: "Only defined", , fileId=16, name=Scape Main, unlock=automatically.] +TrackDefinition [arrayId=151, trackset=Trackset: "Only defined", , fileId=466, name=Ground Scape, unlock=automatically.] +TrackDefinition [arrayId=152, trackset=Trackset: "Only defined", , fileId=321, name=Scape Scared, unlock=automatically.] +TrackDefinition [arrayId=153, trackset=Trackset: Christmas, , fileId=547, name=Scape Santa, unlock=automatically.] +TrackDefinition [arrayId=154, trackset=Trackset: Christmas, , fileId=189, name=Land of Snow, unlock=during or after the Christmas 2007 holiday event.] +TrackDefinition [arrayId=155, trackset=Trackset: "Only defined", , fileId=468, name=Shaping Up, unlock=during As a First Resort...] +TrackDefinition [arrayId=156, trackset=Trackset: "Only defined", , fileId=492, name=Exam Conditions, unlock=at the Stronghold of Player Safety.] +TrackDefinition [arrayId=157, trackset=Trackset: Jungle, , fileId=429, name=Roots and Flutes, unlock=during Back to my Roots.] +TrackDefinition [arrayId=158, trackset=Trackset: "Only defined", , fileId=494, name=Incarceration, unlock=at the Stronghold of Player Safety.] +TrackDefinition [arrayId=159, trackset=Trackset: Falador, , fileId=54, name=Scape Soft, unlock=to the north of Falador.] +TrackDefinition [arrayId=160, trackset=Trackset: Wilderness, , fileId=120, name=Shining, unlock=in the Wilderness north of the Graveyard.] +TrackDefinition [arrayId=161, trackset=Trackset: Lumbridge, , fileId=145, name=Yesteryear, unlock=to the east of Lumbridge Swamp.] +TrackDefinition [arrayId=162, trackset=Trackset: Port, , fileId=166, name=Fanfare2, unlock=at the Shipyard on Karamja.] +TrackDefinition [arrayId=163, trackset=Trackset: Falador, , fileId=105, name=Tomorrow, unlock=at the coastline south of Port Sarim.] +TrackDefinition [arrayId=164, trackset=Trackset: "Only defined", , fileId=47, name=Duel Arena, unlock=at the Duel Arena.] +TrackDefinition [arrayId=165, trackset=Trackset: "Only defined", , fileId=87, name=Ice Melody, unlock=at White Wolf Mountain.] +TrackDefinition [arrayId=166, trackset=Trackset: Wilderness, , fileId=449, name=Wild Isle, unlock=to the south of Red Dragon Isle in the Wilderness.] +TrackDefinition [arrayId=167, trackset=Trackset: Lumbridge, , fileId=46, name=Harmony2, unlock=in Lumbridge Castle's basement.] +TrackDefinition [arrayId=168, trackset=Trackset: Varrock, , fileId=45, name=Venture2, unlock=during Dig Site.] +TrackDefinition [arrayId=169, trackset=Trackset: Port, , fileId=164, name=Landlubber, unlock=to the west of Brimhaven.] +TrackDefinition [arrayId=170, trackset=Trackset: Wilderness, , fileId=176, name=Undercurrent, unlock=in the south-east of the Wilderness.] +TrackDefinition [arrayId=171, trackset=Trackset: Kharidian, , fileId=58, name=Nomad, unlock=to the east of the Bedabin Camp.] +TrackDefinition [arrayId=172, trackset=, fileId=146, name=Zealot, unlock=at the Water Altar.] +TrackDefinition [arrayId=173, trackset=Trackset: Cave, , fileId=330, name=Cellar Song, unlock=at the bank vault west of Varrock.] +TrackDefinition [arrayId=174, trackset=, fileId=190, name=Heart and Mind, unlock=at the Body Altar.] +TrackDefinition [arrayId=175, trackset=Trackset: Wilderness, , fileId=67, name=Close Quarters, unlock=at the entrance to Bounty Hunter in the Wilderness.] +TrackDefinition [arrayId=176, trackset=Trackset: Cave, , fileId=17, name=Escape, unlock=at the perfect gold mine under Ardougne.] +TrackDefinition [arrayId=177, trackset=Trackset: Feldip hills, , fileId=128, name=Grumpy, unlock=at the swamp toad pond in the Feldip Hills.] +TrackDefinition [arrayId=178, trackset=Trackset: Feldip hills, , fileId=71, name=Chompy Hunt, unlock=at the chompy hunt area near Rantz the ogre.] +TrackDefinition [arrayId=179, trackset=Trackset: "Only defined", , fileId=88, name=Twilight, unlock=during Elemental Workshop.] +TrackDefinition [arrayId=180, trackset=Trackset: Morytania, , fileId=48, name=Morytania, unlock=to the east of Paterdomus.] +TrackDefinition [arrayId=181, trackset=Trackset: Morytania, , fileId=84, name=Dead Quiet, unlock=to the north of the Mort Myre area.] +TrackDefinition [arrayId=182, trackset=Trackset: Morytania, , fileId=61, name=Village, unlock=at Canifis in Morytania.] +TrackDefinition [arrayId=183, trackset=Trackset: Feldip hills, , fileId=154, name=Bone Dance, unlock=to the west of Mort'ton.] +TrackDefinition [arrayId=184, trackset=Trackset: Morytania, , fileId=156, name=Mausoleum, unlock=under Paterdomus.] +TrackDefinition [arrayId=185, trackset=Trackset: Wilderness, , fileId=121, name=Forbidden, unlock=to the north of the Lumber Yard.] +TrackDefinition [arrayId=186, trackset=Trackset: Cave, , fileId=59, name=Cursed, unlock=during Underground Pass.] +TrackDefinition [arrayId=187, trackset=, fileId=131, name=Understanding, unlock=at the Nature Altar.] +TrackDefinition [arrayId=188, trackset=Trackset: Falador, , fileId=149, name=Principality, unlock=at Burthorpe's training ground.] +TrackDefinition [arrayId=189, trackset=Trackset: Ogre, , fileId=187, name=Tremble, unlock=during Death Plateau.] +TrackDefinition [arrayId=190, trackset=Trackset: Ogre, , fileId=9, name=Kingdom, unlock=on the way to Death Plateau.] +TrackDefinition [arrayId=191, trackset=Trackset: Ogre, , fileId=97, name=Hermit, unlock=at the hermit's cave north-west of Burthorpe.] +TrackDefinition [arrayId=192, trackset=, fileId=134, name=La Mort, unlock=at the Death Altar.] +TrackDefinition [arrayId=193, trackset=Trackset: Morytania, , fileId=241, name=Stagnant, unlock=at the Hollows in the Mort Myre Swamp.] +TrackDefinition [arrayId=194, trackset=Trackset: Elven, , fileId=132, name=Breeze, unlock=at Isafdar near the Underground Pass.] +TrackDefinition [arrayId=195, trackset=, fileId=243, name=Stratosphere, unlock=at the Cosmic Altar.] +TrackDefinition [arrayId=196, trackset=Trackset: "Only defined", , fileId=242, name=Time Out, unlock=during the Maze random event.] +TrackDefinition [arrayId=197, trackset=Trackset: Morytania, , fileId=245, name=Natural, unlock=at the nature spirit's island in Mort Myre Swamp.] +TrackDefinition [arrayId=198, trackset=Trackset: Cave, , fileId=246, name=Grotto, unlock=at the nature spirit's grotto in Mort Myre Swamp.] +TrackDefinition [arrayId=199, trackset=Trackset: Morytania, , fileId=244, name=Waterlogged, unlock=to the south of Canifis.] +TrackDefinition [arrayId=200, trackset=Trackset: "Only defined", , fileId=247, name=Artistry, unlock=during the Mime random event.] +TrackDefinition [arrayId=201, trackset=Trackset: Kharidian, , fileId=248, name=Aztec, unlock=at the Brimhaven Agility Arena.] +TrackDefinition [arrayId=202, trackset=Trackset: Elven, , fileId=252, name=Elven Mist, unlock=at the exit of the Underground Pass.] +TrackDefinition [arrayId=203, trackset=Trackset: Elven, , fileId=251, name=Forest, unlock=to the south-east of Isafdar.] +TrackDefinition [arrayId=204, trackset=Trackset: Tirannwn, , fileId=253, name=Lost Soul, unlock=at the Poison Waste in south Isafdar.] +TrackDefinition [arrayId=205, trackset=Trackset: Elven, , fileId=254, name=Meridian, unlock=at the area around Tyras Camp in Isafdar.] +TrackDefinition [arrayId=206, trackset=Trackset: Elven, , fileId=255, name=Woodland, unlock=at the Elf Camp in Tirannwn.] +TrackDefinition [arrayId=207, trackset=Trackset: Elven, , fileId=256, name=Overpass, unlock=at Arandar, east of Tirannwn.] +TrackDefinition [arrayId=208, trackset=Trackset: Ogre, , fileId=258, name=Contest, unlock=in Trollheim.] +TrackDefinition [arrayId=209, trackset=Trackset: Ogre, , fileId=257, name=Sojourn, unlock=at the troll champion arena.] +TrackDefinition [arrayId=210, trackset=Trackset: Elven, , fileId=259, name=Crystal Castle, unlock=to the south-east of Prifddinas.] +TrackDefinition [arrayId=211, trackset=Trackset: Ogre, , fileId=261, name=Marzipan, unlock=at the Trollheim cave.] +TrackDefinition [arrayId=212, trackset=Trackset: "Only defined", , fileId=260, name=Insect Queen, unlock=at the Kalphite Queen.] +TrackDefinition [arrayId=213, trackset=Trackset: "Only defined", , fileId=264, name=Mad Eadgar, unlock=at Eadgar's cave atop Trollheim.] +TrackDefinition [arrayId=214, trackset=Trackset: Kharidian, , fileId=263, name=Bandit Camp, unlock=at the Bandit Camp in the Kharidian Desert.] +TrackDefinition [arrayId=215, trackset=Trackset: Kharidian, , fileId=267, name=Sunburn, unlock=in the desert north of Jaldraocht Pyramid.] +TrackDefinition [arrayId=216, trackset=Trackset: Kharidian, , fileId=266, name=Bone Dry, unlock=in the smoky well near Pollnivneach.] +TrackDefinition [arrayId=217, trackset=Trackset: "Only defined", , fileId=269, name=Competition, unlock=at Burthorpe Games Room.] +TrackDefinition [arrayId=218, trackset=Trackset: Spooky, , fileId=11, name=Spooky2, unlock=at the entrance to the Haunted Mine.] +TrackDefinition [arrayId=219, trackset=Trackset: Elven, , fileId=268, name=Everywhere, unlock=to the south-west of Prifddinas.] +TrackDefinition [arrayId=220, trackset=Trackset: Tirannwn, , fileId=270, name=Exposed, unlock=to the south of Tyras Camp in Isafdar.] +TrackDefinition [arrayId=221, trackset=Trackset: Tirannwn, , fileId=271, name=Well of Voyage, unlock=in the passage between Iban's Temple and Isafdar.] +TrackDefinition [arrayId=222, trackset=Trackset: "Only defined", , fileId=277, name=Haunted Mine, unlock=at the boss area of the Haunted Mine.] +TrackDefinition [arrayId=223, trackset=, fileId=262, name=Righteousness, unlock=at the Law Altar.] +TrackDefinition [arrayId=224, trackset=Trackset: Cave, , fileId=278, name=Deep Down, unlock=on the bottom floor of the Haunted Mine.] +TrackDefinition [arrayId=225, trackset=Trackset: Cave, , fileId=282, name=Chamber, unlock=on the middle floor of the Haunted Mine.] +TrackDefinition [arrayId=226, trackset=Trackset: Miscellania, , fileId=284, name=Miscellania, unlock=on Miscellania.] +TrackDefinition [arrayId=227, trackset=Trackset: Miscellania, , fileId=285, name=Etcetera, unlock=on Etceteria.] +TrackDefinition [arrayId=228, trackset=Trackset: Morytania, , fileId=286, name=Shadowland, unlock=to the east of Mort'ton.] +TrackDefinition [arrayId=229, trackset=Trackset: Cave, , fileId=287, name=Lair, unlock=at the shade catacombs below Mort'ton.] +TrackDefinition [arrayId=230, trackset=Trackset: Morytania, , fileId=288, name=Deadlands, unlock=at the Haunted Woods of Morytania.] +TrackDefinition [arrayId=231, trackset=Trackset: Fremennik, , fileId=289, name=Rellekka, unlock=at Rellekka.] +TrackDefinition [arrayId=232, trackset=Trackset: Fremennik, , fileId=290, name=Saga, unlock=to the south of Rellekka.] +TrackDefinition [arrayId=233, trackset=Trackset: Fremennik, , fileId=291, name=Borderland, unlock=to the east of Rellekka.] +TrackDefinition [arrayId=234, trackset=Trackset: Unknown. Troll?, , fileId=292, name=Stranded, unlock=at the gate to the Ice Path, north of Trollheim.] +TrackDefinition [arrayId=235, trackset=Trackset: Fremennik, , fileId=293, name=Legend, unlock=to the south-east of Rellekka.] +TrackDefinition [arrayId=236, trackset=Trackset: Unknown. Troll?, , fileId=294, name=Frostbite, unlock=at the Ice Path north of Trollheim.] +TrackDefinition [arrayId=237, trackset=Trackset: Cave, , fileId=295, name=Warrior, unlock=during Fremennik Trials.] +TrackDefinition [arrayId=238, trackset=Trackset: "Only defined", , fileId=296, name=Technology, unlock=at the gnome glider hanger.] +TrackDefinition [arrayId=239, trackset=Trackset: Jungle, , fileId=303, name=Monkey Madness, unlock=on Ape Atoll.] +TrackDefinition [arrayId=240, trackset=Trackset: Jungle, , fileId=305, name=Anywhere, unlock=at Marim's main gate.] +TrackDefinition [arrayId=241, trackset=Trackset: Jungle, , fileId=304, name=Marooned, unlock=on Crash Island during Monkey Madness.] +TrackDefinition [arrayId=242, trackset=Trackset: Jungle, , fileId=306, name=Island Life, unlock=at the southern part of Ape Atoll.] +TrackDefinition [arrayId=243, trackset=Trackset: Cave, , fileId=307, name=Temple, unlock=on Ape Atoll.] +TrackDefinition [arrayId=244, trackset=Trackset: "Only defined", , fileId=308, name=Suspicious, unlock=during Monkey Madness.] +TrackDefinition [arrayId=245, trackset=Trackset: "Only defined", , fileId=311, name=Showdown, unlock=during the boss fight in Monkey Madness.] +TrackDefinition [arrayId=246, trackset=Trackset: Cave, , fileId=312, name=Find My Way, unlock=at the gnome tunnel in Monkey Madness.] +TrackDefinition [arrayId=247, trackset=Trackset: "Only defined", , fileId=314, name=Castlewars, unlock=during the Castle Wars minigame.] +TrackDefinition [arrayId=248, trackset=Trackset: Yanille(?) , , fileId=317, name=Melodrama, unlock=during the Castle Wars minigame.] +TrackDefinition [arrayId=249, trackset=Trackset: Castle wars, , fileId=318, name=Ready For Battle, unlock=during the Castle Wars minigame.] +TrackDefinition [arrayId=250, trackset=Trackset: Cave, , fileId=319, name=Stillness, unlock=at the Myreque area under Mort Myre.] +TrackDefinition [arrayId=251, trackset=Trackset: "Only defined", , fileId=320, name=Lighthouse, unlock=at the Lighthouse.] +TrackDefinition [arrayId=252, trackset=Trackset: Goblin, , fileId=346, name=Goblin Game, unlock=at the goblin cave near the Fishing Guild.] +TrackDefinition [arrayId=253, trackset=Trackset: "Only defined", , fileId=322, name=Out of the Deep, unlock=at the dagannoth cave under the Lighthouse.] +TrackDefinition [arrayId=254, trackset=Trackset: Unknown. Troll?, , fileId=4, name=Hell's Bells, unlock=during the Troll Romance quest.] +TrackDefinition [arrayId=255, trackset=Trackset: Fremennik, , fileId=316, name=The Navigator, unlock=during Fremennik Trials.] +TrackDefinition [arrayId=256, trackset=Trackset: Wilderness, , fileId=8, name=Wildwood, unlock=to the south of Bounty Hunter.] +TrackDefinition [arrayId=257, trackset=Trackset: Fremennik, , fileId=141, name=Barbarianism, unlock=at Barbarian Village.] +TrackDefinition [arrayId=258, trackset=, fileId=142, name=Complication, unlock=at the Chaos Altar.] +TrackDefinition [arrayId=259, trackset=, fileId=143, name=Down to Earth, unlock=at the Earth Altar.] +TrackDefinition [arrayId=260, trackset=Trackset: Cave, , fileId=178, name=Courage, unlock=at Taverley Dungeon.] +TrackDefinition [arrayId=261, trackset=Trackset: Cave, , fileId=265, name=Superstition, unlock=at the cave below the Kharazi Jungle.] +TrackDefinition [arrayId=262, trackset=Trackset: Port, , fileId=334, name=Pirates of Peril, unlock=at the Pirates' Hideout in the Wilderness.] +TrackDefinition [arrayId=263, trackset=Trackset: Cave, , fileId=336, name=Dangerous Road, unlock=at the caves below Crandor.] +TrackDefinition [arrayId=264, trackset=Trackset: Unknown. Troll?, , fileId=335, name=Romancing the Crone, unlock=during the Troll Romance quest.] +TrackDefinition [arrayId=265, trackset=Trackset: Wilderness, , fileId=337, name=Faithless, unlock=at the Chaos Temple in the Wilderness.] +TrackDefinition [arrayId=266, trackset=Trackset: Cave, , fileId=338, name=Tiptoe, unlock=at Draynor Manor's cellar.] +TrackDefinition [arrayId=267, trackset=Trackset: Morytania, , fileId=339, name=The Terrible Tower, unlock=at the Slayer Tower.] +TrackDefinition [arrayId=268, trackset=Trackset: Cave, , fileId=340, name=Masquerade, unlock=on the west side of the Fremennik Slayer Dungeon.] +TrackDefinition [arrayId=269, trackset=Trackset: Cave, , fileId=341, name=The Slayer, unlock=on the east side of the Fremennik Slayer Dungeon.] +TrackDefinition [arrayId=270, trackset=Trackset: Morytania, , fileId=342, name=Body Parts, unlock=at the dungeon south-east of Fenkenstrain's Castle.] +TrackDefinition [arrayId=271, trackset=Trackset: Morytania, , fileId=344, name=Fenkenstrain's Refrain, unlock=at Fenkenstrain's Castle.] +TrackDefinition [arrayId=272, trackset=Trackset: "Only defined", , fileId=343, name=Monster Melee, unlock=at the H.A.M. cave.] +TrackDefinition [arrayId=273, trackset=Trackset: Port, , fileId=347, name=Fruits de Mer, unlock=at the Fishing Platform.] +TrackDefinition [arrayId=274, trackset=Trackset: "Only defined", , fileId=345, name=Barking Mad, unlock=at the Werewolf Agility Course.] +TrackDefinition [arrayId=275, trackset=Trackset: Kharidian, , fileId=351, name=Dynasty, unlock=at the town of Pollnivneach.] +TrackDefinition [arrayId=276, trackset=Trackset: Port, , fileId=353, name=Shipwrecked, unlock=at the shipwreck on the north coast of Morytania.] +TrackDefinition [arrayId=277, trackset=Trackset: Morytania, , fileId=354, name=Phasmatys, unlock=at the pool of ectoplasm underneath the Ectofuntus.] +TrackDefinition [arrayId=278, trackset=Trackset: Morytania, , fileId=355, name=The Other Side, unlock=at Port Phasmatys.] +TrackDefinition [arrayId=279, trackset=Trackset: Fremennik, , fileId=356, name=Settlement, unlock=at the Mountain Camp.] +TrackDefinition [arrayId=280, trackset=Trackset: "Only defined", , fileId=357, name=Cave of Beasts, unlock=during Mountain Daughter.] +TrackDefinition [arrayId=281, trackset=Trackset: Port, , fileId=358, name=Dragontooth Island, unlock=on Dragontooth Island.] +TrackDefinition [arrayId=282, trackset=Trackset: Kharidian, , fileId=352, name=Scarab, unlock=at Jaldraocht, the pyramid visited in Desert Treasure.] +TrackDefinition [arrayId=283, trackset=Trackset: Kharidian, , fileId=359, name=Sarcophagus, unlock=inside Jaldraocht, the pyramid visited in Desert Treasure.] +TrackDefinition [arrayId=284, trackset=Trackset: Cave, , fileId=361, name=Down Below, unlock=at the dungeon below Draynor Village.] +TrackDefinition [arrayId=285, trackset=Trackset: Cave, , fileId=363, name=7th Realm, unlock=at Brimhaven Dungeon.] +TrackDefinition [arrayId=286, trackset=Trackset: Jungle, , fileId=362, name=Karamja Jam, unlock=at the dragon area of Brimhaven Dungeon.] +TrackDefinition [arrayId=287, trackset=Trackset: Cave, , fileId=364, name=Pathways, unlock=at Brimhaven Dungeon's entrance.] +TrackDefinition [arrayId=288, trackset=Trackset: Hunter (?), , fileId=366, name=Eagle Peak, unlock=during Eagles' Peak.] +TrackDefinition [arrayId=289, trackset=Trackset: Dwarf, , fileId=369, name=Time to Mine, unlock=during Between a Rock...] +TrackDefinition [arrayId=290, trackset=Trackset: "Only defined", , fileId=370, name=In Between, unlock=during Between a Rock...] +TrackDefinition [arrayId=291, trackset=Trackset: "Only defined", , fileId=373, name=Claustrophobia, unlock=during Between a Rock...] +TrackDefinition [arrayId=292, trackset=Trackset: Elven, , fileId=372, name=Far Away, unlock=at Lletya.] +TrackDefinition [arrayId=293, trackset=Trackset: Cave, , fileId=375, name=Fight or Flight, unlock=at the slave mine under West Ardougne.] +TrackDefinition [arrayId=294, trackset=Trackset: Zanaris, , fileId=376, name=Temple of Light, unlock=during Mourning's Ends Part II.] +TrackDefinition [arrayId=295, trackset=Trackset: Kharidian, , fileId=377, name=The Golem, unlock=at the Ruins of Uzer.] +TrackDefinition [arrayId=296, trackset=Trackset: "Only defined", , fileId=378, name=Forgotten, unlock=during the Golem.] +TrackDefinition [arrayId=297, trackset=Trackset: "Only defined", , fileId=379, name=Throne of the Demon, unlock=during Shadow of the Storm.] +TrackDefinition [arrayId=298, trackset=Trackset: Morytania, , fileId=380, name=Dance of the Undead, unlock=at the Barrows.] +TrackDefinition [arrayId=299, trackset=Trackset: Morytania, , fileId=381, name=Dangerous Way, unlock=beneath the Barrows.] +TrackDefinition [arrayId=300, trackset=Trackset: Kharidian, , fileId=383, name=City of the Dead, unlock=to the north of (and at) Menaphos.] +TrackDefinition [arrayId=301, trackset=Trackset: "Only defined", , fileId=384, name=Hypnotized, unlock=during Icthlarin's Little Helper.] +TrackDefinition [arrayId=302, trackset=Trackset: Kharidian, , fileId=387, name=Sphinx, unlock=to the north of Sophanem.] +TrackDefinition [arrayId=303, trackset=Trackset: Kharidian, , fileId=388, name=Mirage, unlock=during Icthlarin's Little Helper.] +TrackDefinition [arrayId=304, trackset=Trackset: Goblin, , fileId=389, name=Cave of the Goblins, unlock=at the caves beneath Lumbridge Swamp.] +TrackDefinition [arrayId=305, trackset=Trackset: "Only defined", , fileId=474, name=Bish Bash Bosh, unlock=during As a First Resort...] +TrackDefinition [arrayId=306, trackset=Trackset: Feldip hills, , fileId=392, name=Zogre Dance, unlock=at the zogre area.] +TrackDefinition [arrayId=307, trackset=Trackset: Cave, , fileId=393, name=Path of Peril, unlock=in Damis's Shadow Dungeon.] +TrackDefinition [arrayId=308, trackset=Trackset: Cave, , fileId=394, name=Wayward, unlock=at the zogre dungeon.] +TrackDefinition [arrayId=309, trackset=Trackset: Dwarf, , fileId=395, name=Tale of Keldagrim, unlock=on the east side of Keldagrim.] +TrackDefinition [arrayId=310, trackset=Trackset: Dwarf, , fileId=396, name=Land of the Dwarves, unlock=on the west side of Keldagrim.] +TrackDefinition [arrayId=311, trackset=Trackset: "Only defined", , fileId=397, name=Tears of Guthix, unlock=during Tears of Guthix.] +TrackDefinition [arrayId=312, trackset=Trackset: Feldip hills, , fileId=390, name=Romper Chomper, unlock=at the ogre area south of Castle Wars.] +TrackDefinition [arrayId=313, trackset=Trackset: "Only defined", , fileId=402, name=The Rogues' Den, unlock=at the Rogues' Den.] +TrackDefinition [arrayId=314, trackset=Trackset: "Only defined", , fileId=403, name=The Far Side, unlock=at the Rogues' Den training area.] +TrackDefinition [arrayId=315, trackset=Trackset: Goblin, , fileId=407, name=The Lost Melody, unlock=at the Dorgesh-Kaan mine.] +TrackDefinition [arrayId=316, trackset=Trackset: "Only defined", , fileId=411, name=Evil Bob's Island, unlock=during the Evil Bob random event.] +TrackDefinition [arrayId=317, trackset=Trackset: Abyss, , fileId=412, name=Into the Abyss, unlock=in abyssal space.] +TrackDefinition [arrayId=318, trackset=Trackset: "Only defined", , fileId=413, name=The Quiz Master, unlock=during the Quiz Master random event.] +TrackDefinition [arrayId=319, trackset=Trackset: "Only defined", , fileId=398, name=The Power of Tears, unlock=during the Tears of Guthix quest.] +TrackDefinition [arrayId=320, trackset=, fileId=147, name= , unlock=default info] +TrackDefinition [arrayId=321, trackset=Trackset: "Only defined", , fileId=419, name=Pheasant Peasant, unlock=during the Freaky Forester random event.] +TrackDefinition [arrayId=322, trackset=Trackset: Goblin, , fileId=420, name=The Lost Tribe, unlock=at the goblin mines under Lumbridge.] +TrackDefinition [arrayId=323, trackset=Trackset: "Only defined", , fileId=418, name=Corporal Punishment, unlock=during the Drill Demon random event.] +TrackDefinition [arrayId=324, trackset=Trackset: "Only defined", , fileId=425, name=The Chosen, unlock=during Recruitment Drive.] +TrackDefinition [arrayId=325, trackset=Trackset: Dwarf, , fileId=434, name=Have a Blast, unlock=during the Blast Furnace minigame.] +TrackDefinition [arrayId=326, trackset=Trackset: Dwarf, , fileId=436, name=Forgettable Melody, unlock=during Forgettable Tale...] +TrackDefinition [arrayId=327, trackset=Trackset: Dwarf, , fileId=44, name=Right On Track, unlock=during Forgettable Tale...] +TrackDefinition [arrayId=328, trackset=Trackset: Kharidian, , fileId=447, name=Over To Nardah, unlock=at Nardah.] +TrackDefinition [arrayId=329, trackset=Trackset: "Only defined", , fileId=448, name=The Monsters Below, unlock=in Waterbirth Island Dungeon.] +TrackDefinition [arrayId=330, trackset=Trackset: Miscellania, , fileId=461, name=The Desolate Isle, unlock=on Waterbirth Island.] +TrackDefinition [arrayId=331, trackset=Trackset: Kharidian, , fileId=462, name=Spirits of Elid, unlock=during the Spirits of Elid.] +TrackDefinition [arrayId=332, trackset=Trackset: "Only defined", , fileId=464, name=The Genie, unlock=at the genie's cave west of Nardah.] +TrackDefinition [arrayId=333, trackset=Trackset: Kharidian, , fileId=465, name=Desert Heat, unlock=in the desert north of Nardah.] +TrackDefinition [arrayId=334, trackset=Trackset: TzHaar, , fileId=463, name=Fire and Brimstone, unlock=in the TzHaar Fight Pit minigame.] +TrackDefinition [arrayId=335, trackset=Trackset: TzHaar, , fileId=469, name=In the Pits, unlock=in TzHaar.] +TrackDefinition [arrayId=336, trackset=Trackset: "Only defined", , fileId=409, name=Frogland, unlock=during the Frog random event.] +TrackDefinition [arrayId=337, trackset=Trackset: "Only defined", , fileId=470, name=Strange Place, unlock=during the Tale of Two Cats.] +TrackDefinition [arrayId=338, trackset=Trackset: "Only defined", , fileId=471, name=Brew Hoo Hoo, unlock=at Port Phasmatys brewery.] +TrackDefinition [arrayId=339, trackset=Trackset: TzHaar, , fileId=473, name=TzHaar!, unlock=in the TzHaar Fight Cave minigame.] +TrackDefinition [arrayId=340, trackset=Trackset: Wilderness, , fileId=475, name=Wild Side, unlock=to the north of the Lava Maze in the Wilderness.] +TrackDefinition [arrayId=341, trackset=Trackset: Wilderness, , fileId=476, name=Dead Can Dance, unlock=to the east of Bounty Hunter.] +TrackDefinition [arrayId=342, trackset=Trackset: "Only defined", , fileId=478, name=The Cellar Dwellers, unlock=during the Hazeel Cult.] +TrackDefinition [arrayId=343, trackset=Trackset: Jungle, , fileId=479, name=Jungle Troubles, unlock=in the jungle of north-east Karamja.] +TrackDefinition [arrayId=344, trackset=Trackset: "Only defined", , fileId=481, name=Catch Me If You Can, unlock=at the Ardougne Rat Pits.] +TrackDefinition [arrayId=345, trackset=Trackset: "Only defined", , fileId=482, name=Rat a Tat Tat, unlock=at the Varrock Rat Pits.] +TrackDefinition [arrayId=346, trackset=Trackset: "Only defined", , fileId=485, name=The Noble Rodent, unlock=during Rat Catchers.] +TrackDefinition [arrayId=347, trackset=Trackset: "Only defined", , fileId=489, name=Bubble and Squeak, unlock=at the Keldagrim Rat Pits.] +TrackDefinition [arrayId=348, trackset=Trackset: "Only defined", , fileId=490, name=Sarim's Vermin, unlock=at Port Sarim Rat Pits.] +TrackDefinition [arrayId=349, trackset=Trackset: "Only defined", , fileId=491, name=Rat Hunt, unlock=during Rat Catchers.] +TrackDefinition [arrayId=350, trackset=Trackset: "Only defined", , fileId=621, name=Homescape, unlock=automatically.] +TrackDefinition [arrayId=351, trackset=Trackset: Port, , fileId=497, name=Aye Car Rum Ba, unlock=on Braindeath Island.] +TrackDefinition [arrayId=352, trackset=Trackset: Port, , fileId=498, name=Blistering Barnacles, unlock=on Braindeath Island's mountain.] +TrackDefinition [arrayId=353, trackset=Trackset: Morytania, , fileId=501, name=Distant Land, unlock=at Burgh de Rott.] +TrackDefinition [arrayId=354, trackset=Trackset: "Only defined", , fileId=504, name=Fangs For the Memory, unlock=during In Aid of the Myreque.] +TrackDefinition [arrayId=355, trackset=Trackset: "Only defined", , fileId=505, name=Pharaoh's Tomb, unlock=at the Agility Pyramid.] +TrackDefinition [arrayId=356, trackset=Trackset: "Only defined", , fileId=506, name=Land Down Under, unlock=during Royal Trouble.] +TrackDefinition [arrayId=357, trackset=Trackset: "Only defined", , fileId=508, name=Meddling Kids, unlock=during Royal Trouble.] +TrackDefinition [arrayId=358, trackset=Trackset: "Only defined", , fileId=509, name=Corridors of Power, unlock=during Royal Trouble.] +TrackDefinition [arrayId=359, trackset=Trackset: "Only defined", , fileId=510, name=Slither and Thither, unlock=at the sea snake cave in Royal Trouble.] +TrackDefinition [arrayId=360, trackset=Trackset: "Only defined", , fileId=511, name=In the Clink, unlock=during the Prison Pete random event.] +TrackDefinition [arrayId=361, trackset=Trackset: Port, , fileId=515, name=Mudskipper Melody, unlock=at Mudskipper Point.] +TrackDefinition [arrayId=362, trackset=Trackset: "Only defined", , fileId=517, name=Subterranea, unlock=in Waterbirth Island Dungeon.] +TrackDefinition [arrayId=363, trackset=Trackset: Cave, , fileId=519, name=Incantation, unlock=during Shadow of the Storm.] +TrackDefinition [arrayId=364, trackset=Trackset: "Only defined", , fileId=520, name=Grip of the Talon, unlock=during Shadow of the Storm.] +TrackDefinition [arrayId=365, trackset=Trackset: "Only defined", , fileId=198, name=Dagannoth Dawn, unlock=in Waterbirth Island Dungeon.] +TrackDefinition [arrayId=366, trackset=Trackset: "Only defined", , fileId=524, name=Xenophobe, unlock=in Waterbirth Island Dungeon.] +TrackDefinition [arrayId=367, trackset=Trackset: "Only defined", , fileId=525, name=Title Fight, unlock=at the Champion's Challenge underground area.] +TrackDefinition [arrayId=368, trackset=Trackset: "Only defined", , fileId=528, name=Victory is Mine, unlock=at the Champion's Challenge arena.] +TrackDefinition [arrayId=369, trackset=Trackset: "Only defined", , fileId=529, name=Woe of the Wyvern, unlock=at the Asgarnian Ice Dungeon's wyvern area.] +TrackDefinition [arrayId=370, trackset=Trackset: Port, , fileId=530, name=In the Brine, unlock=on Mos Le'Harmless.] +TrackDefinition [arrayId=371, trackset=Trackset: Christmas, , fileId=532, name=Diango's Little Helpers, unlock=at Diango's Christmas workshop.] +TrackDefinition [arrayId=372, trackset=Trackset: "Only defined", , fileId=533, name=Roll the Bones, unlock=at the Mage Training Arena's Creature Graveyard.] +TrackDefinition [arrayId=373, trackset=Trackset: "Only defined", , fileId=534, name=Mind Over Matter, unlock=at the Mage Training Arena's Telekinetic Theatre.] +TrackDefinition [arrayId=374, trackset=Trackset: "Only defined", , fileId=535, name=Golden Touch, unlock=at the Mage Training Arena's Alchemists' Playground.] +TrackDefinition [arrayId=375, trackset=, fileId=147, name= , unlock=default info] +TrackDefinition [arrayId=376, trackset=Trackset: "Only defined", , fileId=541, name=The Enchanter, unlock=at the Mage Training Arena's Enchanting Chamber.] +TrackDefinition [arrayId=377, trackset=Trackset: "Only defined", , fileId=207, name=Scape Hunter, unlock=automatically.] +TrackDefinition [arrayId=378, trackset=Trackset: Hunter (?), , fileId=544, name=Making Waves, unlock=during Swan Song.] +TrackDefinition [arrayId=379, trackset=Trackset: Port, , fileId=545, name=Cabin Fever, unlock=during Cabin Fever.] +TrackDefinition [arrayId=380, trackset=Trackset: "Only defined", , fileId=546, name=Last Stand, unlock=during Swan Song.] +TrackDefinition [arrayId=381, trackset=Trackset: "Only defined", , fileId=542, name=Lament, unlock=during Enakhra's Lament.] +TrackDefinition [arrayId=382, trackset=Trackset: Unknown. Troll?, , fileId=548, name=Poles Apart, unlock=at the Trollweiss and Rellekka Hunter area.] +TrackDefinition [arrayId=383, trackset=Trackset: "Only defined", , fileId=455, name=Scarabaeoidea, unlock=during Dealing with Scabaras.] +TrackDefinition [arrayId=384, trackset=Trackset: Hunter (?), , fileId=453, name=Jungle Hunt, unlock=at the Feldip Hunter area.] +TrackDefinition [arrayId=385, trackset=Trackset: Construction, , fileId=454, name=Home Sweet Home, unlock=at your player-owned house.] +TrackDefinition [arrayId=386, trackset=Trackset: Hunter (?), , fileId=460, name=Joy of the Hunt, unlock=at the Feldip Hunter area cave.] +TrackDefinition [arrayId=387, trackset=Trackset: Cave, , fileId=537, name=Dogs of War, unlock=at the Vault of War in the Stronghold of Security.] +TrackDefinition [arrayId=388, trackset=Trackset: "Only defined", , fileId=558, name=Food For Thought, unlock=at the Catacomb of Famine in the Stronghold of Security.] +TrackDefinition [arrayId=389, trackset=Trackset: "Only defined", , fileId=559, name=Malady, unlock=at the Pit of Pestilence in the Stronghold of Security.] +TrackDefinition [arrayId=390, trackset=Trackset: "Only defined", , fileId=560, name=Dance of Death, unlock=at the Sepulchre of Death in the Stronghold of Security.] +TrackDefinition [arrayId=391, trackset=Trackset: "Only defined", , fileId=565, name=Wrath and Ruin, unlock=at the anger room of Tolna's rift.] +TrackDefinition [arrayId=392, trackset=Trackset: "Only defined", , fileId=568, name=Storm Brew, unlock=at the killerwatt plane.] +TrackDefinition [arrayId=393, trackset=Trackset: "Only defined", , fileId=573, name=The Mad Mole, unlock=at Falador Mole Lair.] +TrackDefinition [arrayId=394, trackset=Trackset: Port, , fileId=576, name=Davy Jones's Locker, unlock=during Recipe for Disaster.] +TrackDefinition [arrayId=395, trackset=Trackset: "Only defined", , fileId=575, name=Chickened Out, unlock=at the Evil Chicken's lair.] +TrackDefinition [arrayId=396, trackset=Trackset: Kharidian, , fileId=477, name=Hot 'n' Bothered, unlock=during As a First Resort...] +TrackDefinition [arrayId=397, trackset=Trackset: "Only defined", , fileId=577, name=Mastermindless, unlock=during Recipe for Disaster.] +TrackDefinition [arrayId=398, trackset=Trackset: "Only defined", , fileId=582, name=Too Many Cooks..., unlock=during Recipe for Disaster.] +TrackDefinition [arrayId=399, trackset=Trackset: "Only defined", , fileId=583, name=Chef Surprize, unlock=during Recipe for Disaster.] +TrackDefinition [arrayId=400, trackset=Trackset: "Only defined", , fileId=587, name=Null and Void, unlock=at the Pest Control minigame landing area.] +TrackDefinition [arrayId=401, trackset=Trackset: "Only defined", , fileId=588, name=Pest Control, unlock=during the Pest Control minigame.] +TrackDefinition [arrayId=402, trackset=Trackset: Kharidian, , fileId=591, name=Tomb Raider, unlock=during the Pyramid Plunder minigame.] +TrackDefinition [arrayId=403, trackset=Trackset: "Only defined", , fileId=594, name=No Way Out, unlock=at the hopelessness room of Tolna's rift area.] +TrackDefinition [arrayId=404, trackset=Trackset: "Only defined", , fileId=600, name=Method of Madness, unlock=at the confusion room of Tolna's rift area.] +TrackDefinition [arrayId=405, trackset=Trackset: "Only defined", , fileId=602, name=Fear and Loathing, unlock=at the fear room of Tolna's rift area.] +TrackDefinition [arrayId=406, trackset=Trackset: Easter, , fileId=603, name=Funny Bunnies, unlock=during or after the Easter 2006 holiday event.] +TrackDefinition [arrayId=407, trackset=Trackset: "Only defined", , fileId=604, name=Assault and Battery, unlock=during the Barbarian Assault minigame.] +TrackDefinition [arrayId=408, trackset=Trackset: "Only defined", , fileId=606, name=The Depths, unlock=during Contact!] +TrackDefinition [arrayId=409, trackset=Trackset: Port, , fileId=610, name=Distillery Hilarity, unlock=at Trouble Brewing's distillery.] +TrackDefinition [arrayId=410, trackset=Trackset: Port, , fileId=611, name=Trouble Brewing, unlock=during the Trouble Brewing minigame.] +TrackDefinition [arrayId=411, trackset=Trackset: "Only defined", , fileId=612, name=Head to Head, unlock=during the Evil Twin random event.] +TrackDefinition [arrayId=412, trackset=Trackset: "Only defined", , fileId=614, name=Pinball Wizard, unlock=during the Pinball random event.] +TrackDefinition [arrayId=413, trackset=Trackset: "Only defined", , fileId=615, name=Beetle Juice, unlock=during Contact!] +TrackDefinition [arrayId=414, trackset=Trackset: Kharidian, , fileId=616, name=Back to Life, unlock=during Contact!] +TrackDefinition [arrayId=415, trackset=Trackset: Cave, , fileId=213, name=Labyrinth, unlock=during Contact!] +TrackDefinition [arrayId=416, trackset=Trackset: Cave, , fileId=493, name=Safety in Numbers, unlock=at the Stronghold of Player Safety.] +TrackDefinition [arrayId=417, trackset=Trackset: Wilderness, , fileId=586, name=Everlasting Fire, unlock=in the north-east corner of the Wilderness.] +TrackDefinition [arrayId=418, trackset=Trackset: Miscellania, , fileId=622, name=Waking Dream, unlock=during your dream in Lunar Diplomacy.] +TrackDefinition [arrayId=419, trackset=Trackset: Miscellania, , fileId=623, name=Dreamstate, unlock=during your dream in Lunar Diplomacy.] +TrackDefinition [arrayId=420, trackset=Trackset: Miscellania, , fileId=625, name=The Lunar Isle, unlock=at Lunar Isle.] +TrackDefinition [arrayId=421, trackset=Trackset: Miscellania, , fileId=627, name=Isle of Everywhere, unlock=on the east coast of Lunar Isle.] +TrackDefinition [arrayId=422, trackset=Trackset: Miscellania, , fileId=626, name=Way of the Enchanter, unlock=in the dungeon beneath Lunar Isle.] +TrackDefinition [arrayId=423, trackset=Trackset: "Only defined", , fileId=634, name=Warriors' Guild, unlock=at the Warriors' Guild.] +TrackDefinition [arrayId=424, trackset=Trackset: Port, , fileId=631, name=Life's a Beach!, unlock=at the coastal area of Mos Le'Harmless.] +TrackDefinition [arrayId=425, trackset=Trackset: Hunter (?), , fileId=633, name=On the Wing, unlock=during Fairy Tale Part II.] +TrackDefinition [arrayId=426, trackset=Trackset: "Only defined", , fileId=632, name=Little Cave of Horrors, unlock=in the cave horror dungeon beneath Mos Le'Harmless.] +TrackDefinition [arrayId=427, trackset=Trackset: "Only defined", , fileId=200, name=The Mollusc Menace, unlock=during Slug Menace.] +TrackDefinition [arrayId=428, trackset=Trackset: Port, , fileId=630, name=The Galleon, unlock=during Lunar Diplomacy.] +TrackDefinition [arrayId=429, trackset=Trackset: "Only defined", , fileId=638, name=H.A.M. Fisted, unlock=during Death to the Dorgeshuun.] +TrackDefinition [arrayId=430, trackset=Trackset: Morytania, , fileId=197, name=Lament of Meiyerditch, unlock=during the Darkness of Hallowvale.] +TrackDefinition [arrayId=431, trackset=Trackset: "Only defined", , fileId=640, name=Sigmund's Showdown, unlock=during Death to the Dorgeshuun.] +TrackDefinition [arrayId=432, trackset=Trackset: Port, , fileId=643, name=The Last Shanty, unlock=during the Darkness of Hallowvale.] +TrackDefinition [arrayId=433, trackset=Trackset: Morytania, , fileId=646, name=Night of the Vampyre, unlock=during the Darkness of Hallowvale.] +TrackDefinition [arrayId=434, trackset=Trackset: Zanaris, , fileId=126, name=We are the Fairies, unlock=on the cosmic entity plane during Fairy Tale Part II.] +TrackDefinition [arrayId=435, trackset=Trackset: "Only defined", , fileId=86, name=Dimension X, unlock=on the gorak plane in Fairy Tale Part II.] +TrackDefinition [arrayId=436, trackset=Trackset: Zanaris, , fileId=73, name=All's Fairy in Love and War, unlock=at the fairy resistance hideout in Fairy Tale Part II.] +TrackDefinition [arrayId=437, trackset=Trackset: "Only defined", , fileId=222, name=Major Miner, unlock=during Fremennik Isles.] +TrackDefinition [arrayId=438, trackset=Trackset: "Only defined", , fileId=221, name=Jester Minute, unlock=during Fremennik Isles.] +TrackDefinition [arrayId=439, trackset=Trackset: Fremennik Isles, , fileId=223, name=Norse Code, unlock=during Fremennik Isles.] +TrackDefinition [arrayId=440, trackset=Trackset: Fremennik Isles, , fileId=225, name=Volcanic Vikings, unlock=during Fremennik Isles.] +TrackDefinition [arrayId=441, trackset=Trackset: Ogre, , fileId=220, name=Island of the Trolls, unlock=during Fremennik Isles.] +TrackDefinition [arrayId=442, trackset=Trackset: "Only defined", , fileId=211, name=Pirates of Penance, unlock=during the Barbarian Assault minigame.] +TrackDefinition [arrayId=443, trackset=Trackset: "Only defined", , fileId=194, name=Brimstail's Scales, unlock=at Brimstail's cave.] +TrackDefinition [arrayId=444, trackset=Trackset: Port, , fileId=203, name=My Arm's Journey, unlock=during My Arm's Big Adventure.] +TrackDefinition [arrayId=445, trackset=Trackset: "Only defined", , fileId=201, name=Slug a Bug Ball, unlock=during the Slug Menace Quest.] +TrackDefinition [arrayId=446, trackset=Trackset: "Only defined", , fileId=202, name=Prime Time, unlock=during Elemental Workshop II.] +TrackDefinition [arrayId=447, trackset=Trackset: "Only defined", , fileId=274, name=Rising Damp, unlock=during Olaf's Quest.] +TrackDefinition [arrayId=448, trackset=Trackset: "Only defined", , fileId=620, name=Where Eagles Lair, unlock=during Eagles' Peak.] +TrackDefinition [arrayId=449, trackset=Trackset: Ogre, , fileId=224, name=Ogre the Top, unlock=during Fremennik Isles.] +TrackDefinition [arrayId=450, trackset=Trackset: "Only defined", , fileId=237, name=Work Work Work, unlock=during Tower of Life.] +TrackDefinition [arrayId=451, trackset=Trackset: "Only defined", , fileId=235, name=Magic Magic Magic, unlock=during Tower of Life.] +TrackDefinition [arrayId=452, trackset=Trackset: "Only defined", , fileId=236, name=Mutant Medley, unlock=during Tower of Life.] +TrackDefinition [arrayId=453, trackset=Trackset: "Only defined", , fileId=240, name=Dorgeshuun City, unlock=at Dorgesh-Kaan.] +TrackDefinition [arrayId=454, trackset=Trackset: Goblin, , fileId=249, name=Dorgeshuun Deep, unlock=at the Dorgesh-Kaan caves.] +TrackDefinition [arrayId=455, trackset=Trackset: "Only defined", , fileId=206, name=Floating Free, unlock=during An Enlightened Journey.] +TrackDefinition [arrayId=456, trackset=Trackset: "Only defined", , fileId=204, name=Roc and Roll, unlock=during My Arm's Big Adventure.] +TrackDefinition [arrayId=457, trackset=Trackset: Halloween, , fileId=205, name=High Spirits, unlock=during or after the Halloween 2006 holiday event.] +TrackDefinition [arrayId=458, trackset=Trackset: "Only defined", , fileId=309, name=Looking Back, unlock=at Varrock Museum.] +TrackDefinition [arrayId=459, trackset=Trackset: Christmas, , fileId=208, name=Jungle Island XMAS, unlock=during or after the Christmas 2006 holiday event.] +TrackDefinition [arrayId=460, trackset=Trackset: Christmas, , fileId=210, name=Sea Shanty XMAS, unlock=during or after the Christmas 2006 holiday event.] +TrackDefinition [arrayId=461, trackset=Trackset: Christmas, , fileId=209, name=Jungle Bells, unlock=during or after the Christmas 2006 holiday event.] +TrackDefinition [arrayId=462, trackset=, fileId=230, name=Garden of Summer, unlock=during the Sorceress's Garden minigame.] +TrackDefinition [arrayId=463, trackset=, fileId=229, name=Garden of Spring, unlock=during the Sorceress's Garden minigame.] +TrackDefinition [arrayId=464, trackset=, fileId=231, name=Garden of Winter, unlock=during the Sorceress's Garden minigame.] +TrackDefinition [arrayId=465, trackset=, fileId=228, name=Garden of Autumn, unlock=during the Sorceress's Garden minigame.] +TrackDefinition [arrayId=466, trackset=Trackset: Iceberg/Asgarnian ice dungeon/muspah's tomb, , fileId=217, name=Have an Ice Day, unlock=during Cold War.] +TrackDefinition [arrayId=467, trackset=Trackset: "Only defined", , fileId=238, name=Zombiism, unlock=during The Great Brain Robbery.] +TrackDefinition [arrayId=468, trackset=Trackset: "Only defined", , fileId=234, name=Creature Cruelty, unlock=during Tower of Life.] +TrackDefinition [arrayId=469, trackset=Trackset: Cave, , fileId=272, name=Alternative Root, unlock=during What Lies Below.] +TrackDefinition [arrayId=470, trackset=Trackset: "Only defined", , fileId=216, name=Espionage, unlock=during Cold War.] +TrackDefinition [arrayId=471, trackset=Trackset: "Only defined", , fileId=214, name=Undead Dungeon, unlock=in Tarn's Lair.] +TrackDefinition [arrayId=472, trackset=Trackset: "Only defined", , fileId=275, name=Slice of Station, unlock=during Another Slice of H.A.M..] +TrackDefinition [arrayId=473, trackset=Trackset: "Only defined", , fileId=367, name=Barb Wire, unlock=while learning barbarian skills.] +TrackDefinition [arrayId=474, trackset=Trackset: "Only defined", , fileId=349, name=Impetuous, unlock=during the Impetuous Impulses minigame.] +TrackDefinition [arrayId=475, trackset=Trackset: Easter, , fileId=273, name=Easter Jig, unlock=during or after the Easter 2007 holiday event.] +TrackDefinition [arrayId=476, trackset=, fileId=279, name=Ham Attack, unlock=during Another Slice of H.A.M..] +TrackDefinition [arrayId=477, trackset=Trackset: "Only defined", , fileId=281, name=Slice of Silent Movie, unlock=during Another Slice of H.A.M..] +TrackDefinition [arrayId=478, trackset=Trackset: "Only defined", , fileId=276, name=Ham and Seek, unlock=during Another Slice of H.A.M..] +TrackDefinition [arrayId=479, trackset=Trackset: Wilderness, , fileId=450, name=Venomous, unlock=at the Scorpion Pit in the Wilderness.] +TrackDefinition [arrayId=480, trackset=Trackset: "Only defined", , fileId=150, name=Mouse Trap, unlock=during Grim Tales.] +TrackDefinition [arrayId=481, trackset=Trackset: "Only defined", , fileId=23, name=Fe Fi Fo Fum, unlock=during Grim Tales.] +TrackDefinition [arrayId=482, trackset=Trackset: "Only defined", , fileId=371, name=School's Out, unlock=during the Pattern Recognition random event.] +TrackDefinition [arrayId=483, trackset=Trackset: "Only defined", , fileId=299, name=Inadequacy, unlock=during Dream Mentor.] +TrackDefinition [arrayId=484, trackset=Trackset: "Only defined", , fileId=298, name=Illusive, unlock=during Dream Mentor.] +TrackDefinition [arrayId=485, trackset=Trackset: "Only defined", , fileId=283, name=Everlasting, unlock=during Dream Mentor.] +TrackDefinition [arrayId=486, trackset=Trackset: "Only defined", , fileId=300, name=Untouchable, unlock=during Dream Mentor.] +TrackDefinition [arrayId=487, trackset=Trackset: "Only defined", , fileId=301, name=Down and Out, unlock=during Dream Mentor.] +TrackDefinition [arrayId=488, trackset=Trackset: "Only defined", , fileId=302, name=On the Up, unlock=during Dream Mentor.] +TrackDefinition [arrayId=489, trackset=Trackset: "Only defined", , fileId=365, name=Melzar's Maze, unlock=during Dragon Slayer.] +TrackDefinition [arrayId=490, trackset=Trackset: "Only defined", , fileId=391, name=Zamorak Zoo, unlock=in the God Wars Dungeon.] +TrackDefinition [arrayId=491, trackset=Trackset: "Only defined", , fileId=408, name=Strength of Saradomin, unlock=in the God Wars Dungeon.] +TrackDefinition [arrayId=492, trackset=Trackset: "Only defined", , fileId=386, name=Bandos Battalion, unlock=in the God Wars Dungeon.] +TrackDefinition [arrayId=493, trackset=Trackset: "Only defined", , fileId=404, name=Armadyl Alliance, unlock=in the God Wars Dungeon.] +TrackDefinition [arrayId=494, trackset=Trackset: "Only defined", , fileId=399, name=Armageddon, unlock=in the God Wars Dungeon.] +TrackDefinition [arrayId=495, trackset=Trackset: "Only defined", , fileId=421, name=Storeroom Shuffle, unlock=during Path of Glouphrie.] +TrackDefinition [arrayId=496, trackset=Trackset: Tirannwn, , fileId=414, name=The Longramble Scramble, unlock=during Path of Glouphrie.] +TrackDefinition [arrayId=497, trackset=Trackset: Tirannwn, , fileId=426, name=Waste Defaced, unlock=during Path of Glouphrie.] +TrackDefinition [arrayId=498, trackset=Trackset: "Only defined", , fileId=374, name=Knightmare, unlock=at the Black Knights' Fortress.] +TrackDefinition [arrayId=499, trackset=Trackset: "Only defined", , fileId=382, name=Lore and Order, unlock=during King's Ransom.] +TrackDefinition [arrayId=500, trackset=Trackset: "Only defined", , fileId=417, name=Terrorbird Tussle, unlock=during Path of Glouphrie.] +TrackDefinition [arrayId=501, trackset=Trackset: "Only defined", , fileId=428, name=Altar Ego, unlock=at Ourania Altar.] +TrackDefinition [arrayId=502, trackset=Trackset: "Only defined", , fileId=427, name=Bolrie's Diary, unlock=during Path of Glouphrie.] +TrackDefinition [arrayId=503, trackset=Trackset: "Only defined", , fileId=416, name=Healin' Feelin', unlock=during Path of Glouphrie.] +TrackDefinition [arrayId=504, trackset=, fileId=456, name=Animal Apogee, unlock=during Wolf Whistle.] +TrackDefinition [arrayId=505, trackset=Trackset: "Only defined", , fileId=440, name=Temple of Tribes, unlock=during Land of the Goblins.] +TrackDefinition [arrayId=506, trackset=Trackset: "Only defined", , fileId=439, name=Catacombs and Tombs, unlock=during Land of the Goblins.] +TrackDefinition [arrayId=507, trackset=Trackset: "Only defined", , fileId=437, name=Zanik's Theme, unlock=during Land of the Goblins.] +TrackDefinition [arrayId=508, trackset=Trackset: "Only defined", , fileId=433, name=Dusk in Yu'biusk, unlock=during Land of the Goblins.] +TrackDefinition [arrayId=509, trackset=Trackset: "Only defined", , fileId=432, name=Grimly Fiendish, unlock=during or after the Halloween 2007 holiday event.] +TrackDefinition [arrayId=510, trackset=Trackset: "Only defined", , fileId=451, name=Tune from the Dune, unlock=during Dealing with Scabaras.] +TrackDefinition [arrayId=511, trackset=Trackset: "Only defined", , fileId=472, name=Spa Bizarre, unlock=during As a First Resort...] +TrackDefinition [arrayId=512, trackset=Trackset: "Only defined", , fileId=452, name=Copris Lunaris, unlock=during Dealing with Scabaras.] +TrackDefinition [arrayId=513, trackset=Trackset: Tree Gnome Stronghold, , fileId=348, name=Narnode's Theme, unlock=beneath the Grand Tree.] +TrackDefinition [arrayId=514, trackset=Trackset: "Only defined", , fileId=441, name=Tournament!, unlock=during a Duel Arena Tournament.] +TrackDefinition [arrayId=515, trackset=Trackset: "Only defined", , fileId=442, name=Clan Wars, unlock=during the Clan Wars minigame.] +TrackDefinition [arrayId=516, trackset=Trackset: "Only defined", , fileId=487, name=Charmin' Farmin', unlock=during the Vinesweeper minigame.] +TrackDefinition [arrayId=517, trackset=Trackset: "Only defined", , fileId=444, name=Bounty Hunter Level 1, unlock=while playing Bounty Hunter.] +TrackDefinition [arrayId=518, trackset=Trackset: "Only defined", , fileId=443, name=Bounty Hunter Level 2, unlock=while playing Bounty Hunter.] +TrackDefinition [arrayId=519, trackset=Trackset: "Only defined", , fileId=445, name=Bounty Hunter Level 3, unlock=while playing Bounty Hunter.] +TrackDefinition [arrayId=520, trackset=Trackset: "Only defined", , fileId=401, name=The Adventurer, unlock=automatically.] +TrackDefinition [arrayId=521, trackset=Trackset: "Only defined", , fileId=499, name=Creepy, unlock=during Kennith's Concerns.] +TrackDefinition [arrayId=522, trackset=Trackset: "Only defined", , fileId=500, name=A New Menace, unlock=during Kennith's Concerns.] +TrackDefinition [arrayId=523, trackset=Trackset: "Only defined", , fileId=147, name= , unlock=automatically.] +TrackDefinition [arrayId=524, trackset=Trackset: "Only defined", , fileId=350, name= , unlock=not unlockable!] +TrackDefinition [arrayId=525, trackset=Trackset: "Only defined", , fileId=360, name= , unlock=not unlockable!] +TrackDefinition [arrayId=526, trackset=Trackset: "Only defined", , fileId=195, name= , unlock=not unlockable!] +TrackDefinition [arrayId=527, trackset=Trackset: "Only defined", , fileId=219, name= , unlock=not unlockable!] +TrackDefinition [arrayId=528, trackset=Trackset: "Only defined", , fileId=218, name= , unlock=not unlockable!] +TrackDefinition [arrayId=529, trackset=Trackset: "Only defined", , fileId=227, name= , unlock=not unlockable!] +TrackDefinition [arrayId=530, trackset=Trackset: "Only defined", , fileId=196, name= , unlock=not unlockable!] +TrackDefinition [arrayId=531, trackset=Trackset: Jungle, , fileId=431, name= , unlock=not unlockable!] +TrackDefinition [arrayId=532, trackset=Trackset: "Only defined", , fileId=574, name= , unlock=not unlockable!] +TrackDefinition [arrayId=533, trackset=Trackset: "Only defined", , fileId=239, name=Brain Battle, unlock=on completion of The Great Brain Robbery.] +TrackDefinition [arrayId=534, trackset=Trackset: "Only defined", , fileId=406, name= , unlock=not unlockable!] +TrackDefinition [arrayId=535, trackset=Trackset: "Only defined", , fileId=226, name= , unlock=not unlockable!] +TrackDefinition [arrayId=536, trackset=Trackset: "Only defined", , fileId=250, name=Surok's Theme, unlock=on completion of What Lies Below.] +TrackDefinition [arrayId=537, trackset=Trackset: "Only defined", , fileId=233, name= , unlock=not unlockable!] +TrackDefinition [arrayId=538, trackset=Trackset: "Only defined", , fileId=215, name= , unlock=not unlockable!] +TrackDefinition [arrayId=539, trackset=Trackset: "Only defined", , fileId=315, name= , unlock=not unlockable!] +TrackDefinition [arrayId=540, trackset=Trackset: "Only defined", , fileId=410, name= , unlock=not unlockable!] +TrackDefinition [arrayId=541, trackset=Trackset: "Only defined", , fileId=405, name= , unlock=not unlockable!] +TrackDefinition [arrayId=542, trackset=Trackset: "Only defined", , fileId=484, name= , unlock=not unlockable!] +TrackDefinition [arrayId=543, trackset=Trackset: "Only defined", , fileId=199, name= , unlock=not unlockable!] +TrackDefinition [arrayId=544, trackset=Trackset: "Only defined", , fileId=212, name= , unlock=not unlockable!] +TrackDefinition [arrayId=545, trackset=Trackset: "Only defined", , fileId=297, name= , unlock=not unlockable!] +TrackDefinition [arrayId=546, trackset=Trackset: "Only defined", , fileId=480, name= , unlock=not unlockable!] +TrackDefinition [arrayId=547, trackset=Trackset: Track 547, , fileId=232, name= , unlock=not unlockable!] +TrackDefinition [arrayId=548, trackset=Trackset: "Only defined", , fileId=368, name= , unlock=not unlockable!] +TrackDefinition [arrayId=549, trackset=Trackset: "Only defined", , fileId=458, name= , unlock=not unlockable!] +TrackDefinition [arrayId=550, trackset=Trackset: "Only defined", , fileId=430, name= , unlock=not unlockable!] +TrackDefinition [arrayId=551, trackset=Trackset: "Only defined", , fileId=422, name= , unlock=not unlockable!] +TrackDefinition [arrayId=552, trackset=Trackset: "Only defined", , fileId=423, name= , unlock=not unlockable!] +TrackDefinition [arrayId=553, trackset=Trackset: "Only defined", , fileId=424, name= , unlock=not unlockable!] +TrackDefinition [arrayId=554, trackset=Trackset: "Only defined", , fileId=446, name= , unlock=not unlockable!] +TrackDefinition [arrayId=555, trackset=Trackset: Varrock, , fileId=496, name=The Trade Parade, unlock=at the Grand Exchange.] +TrackDefinition [arrayId=556, trackset=Trackset: Jungle, , fileId=483, name=Jungle Community, unlock=to the north of Tai Bwo Wannai Village.] +TrackDefinition [arrayId=557, trackset=Trackset: "Only defined", , fileId=495, name= , unlock=not unlockable!] +TrackDefinition [arrayId=558, trackset=Trackset: "Only defined", , fileId=523, name=Icy Trouble Ahead, unlock=during the Perils of Ice Mountain.] +TrackDefinition [arrayId=559, trackset=Trackset: "Only defined", , fileId=522, name=Icy a Worried Gnome, unlock=during the Perils of Ice Mountain.] +TrackDefinition [arrayId=560, trackset=Trackset: "Only defined", , fileId=385, name= , unlock=not unlockable!] +TrackDefinition [arrayId=561, trackset=Trackset: "Only defined", , fileId=39, name= , unlock=not unlockable!] +TrackDefinition [arrayId=562, trackset=Trackset: "Only defined", , fileId=40, name= , unlock=not unlockable!] +TrackDefinition [arrayId=563, trackset=Trackset: "Only defined", , fileId=79, name= , unlock=not unlockable!] +TrackDefinition [arrayId=564, trackset=Trackset: "Only defined", , fileId=332, name= , unlock=not unlockable!] +TrackDefinition [arrayId=565, trackset=Trackset: "Only defined", , fileId=260, name= , unlock=not unlockable!] +TrackDefinition [arrayId=566, trackset=Trackset: "Only defined", , fileId=288, name= , unlock=not unlockable!] +TrackDefinition [arrayId=567, trackset=Trackset: "Only defined", , fileId=174, name= , unlock=not unlockable!] +TrackDefinition [arrayId=568, trackset=Trackset: "Only defined", , fileId=573, name= , unlock=not unlockable!] +TrackDefinition [arrayId=569, trackset=Trackset: "Only defined", , fileId=165, name= , unlock=not unlockable!] +TrackDefinition [arrayId=570, trackset=Trackset: "Only defined", , fileId=548, name= , unlock=not unlockable!] +TrackDefinition [arrayId=571, trackset=Trackset: "Only defined", , fileId=347, name= , unlock=not unlockable!] +TrackDefinition [arrayId=572, trackset=Trackset: "Only defined", , fileId=529, name= , unlock=not unlockable!] +TrackDefinition [arrayId=573, trackset=Trackset: "Only defined", , fileId=241, name= , unlock=not unlockable!] +TrackDefinition [arrayId=574, trackset=Trackset: "Only defined", , fileId=172, name= , unlock=not unlockable!] +TrackDefinition [arrayId=575, trackset=Trackset: "Only defined", , fileId=33, name= , unlock=not unlockable!] +TrackDefinition [arrayId=576, trackset=Trackset: "Only defined", , fileId=24, name= , unlock=not unlockable!] +TrackDefinition [arrayId=577, trackset=Trackset: "Only defined", , fileId=501, name=Distant Land, unlock=not unlockable!] +TrackDefinition [arrayId=578, trackset=Trackset: "Only defined", , fileId=314, name=Castle Wars, unlock=not unlockable!] +TrackDefinition [arrayId=579, trackset=Trackset: "Only defined", , fileId=588, name=Pest Control, unlock=not unlockable!] +TrackDefinition [arrayId=580, trackset=Trackset: "Only defined", , fileId=269, name=Competition, unlock=not unlockable!] +TrackDefinition [arrayId=581, trackset=Trackset: "Only defined", , fileId=548, name=Poles Apart, unlock=not unlockable!] +TrackDefinition [arrayId=582, trackset=Trackset: "Only defined", , fileId=372, name=Far Away, unlock=not unlockable!] +TrackDefinition [arrayId=583, trackset=Trackset: "Only defined", , fileId=4, name=Hell's Bells, unlock=not unlockable!] +TrackDefinition [arrayId=584, trackset=, fileId=512, name=Bloodbath, unlock=at the Blood Altar.] +TrackDefinition [arrayId=585, trackset=Trackset: Cave, , fileId=459, name=The Route of All Evil, unlock=in the Chaos Tunnels.] +TrackDefinition [arrayId=586, trackset=Trackset: Cave, , fileId=467, name=The Route of the Problem, unlock=in the Chaos Tunnels.] +TrackDefinition [arrayId=587, trackset=Trackset: "Only defined", , fileId=488, name=The Wrong Path, unlock=in the Chaos Tunnels.] +TrackDefinition [arrayId=588, trackset=, fileId=514, name=The Columbarium, unlock=during Myreque Part IV.] +TrackDefinition [arrayId=589, trackset=Trackset: "Only defined", , fileId=518, name=The Terrible Tunnels, unlock=during Myreque Part IV.] +TrackDefinition [arrayId=590, trackset=Trackset: Cave, , fileId=521, name=The Terrible Caverns, unlock=during Myreque Part IV.] +TrackDefinition [arrayId=591, trackset=Trackset: "Only defined", , fileId=527, name=Dillo-gence is Key, unlock=during TokTz-Ket-Dill.] +TrackDefinition [arrayId=592, trackset=Trackset: "Only defined", , fileId=526, name=Arma Gonna Get You, unlock=during TokTz-Ket-Dill.] +TrackDefinition [arrayId=593, trackset=Trackset: "Only defined", , fileId=531, name=TokTz-Ket-Ek-Mack, unlock=during TokTz-Ket-Dill.] +TrackDefinition [arrayId=594, trackset=Trackset: Port, , fileId=549, name=Jailbird, unlock=during Rocking Out.] +TrackDefinition [arrayId=595, trackset=Trackset: "Only defined", , fileId=502, name=Bittersweet Bunny, unlock=during or after the Easter 2008 holiday event.] +TrackDefinition [arrayId=596, trackset=Trackset: Port, , fileId=550, name=Something Fishy, unlock=during Rocking Out.] +TrackDefinition [arrayId=597, trackset=Trackset: "Only defined", , fileId=539, name=Under the Sand, unlock=during Smoking Kills.] +TrackDefinition [arrayId=598, trackset=Trackset: "Only defined", , fileId=540, name=Desert Smoke, unlock=during Smoking Kills.] +TrackDefinition [arrayId=599, trackset=Trackset: "Only defined", , fileId=551, name=A Pirate's Life for Me, unlock=during Rocking Out.] +TrackDefinition [arrayId=600, trackset=Trackset: "Only defined", , fileId=513, name=Conspiracy: Part 1, unlock=during Myreque Part IV.] +TrackDefinition [arrayId=601, trackset=Trackset: "Only defined", , fileId=516, name=Conspiracy: Part 2, unlock=during Myreque Part IV.] +TrackDefinition [arrayId=602, trackset=Trackset: "Only defined", , fileId=457, name=Scape Summon, unlock=automatically.] +TrackDefinition [arrayId=603, trackset=Trackset: "Only defined", , fileId=507, name=Guthix's Hunter, unlock=during the Fist of Guthix minigame.] +TrackDefinition [arrayId=604, trackset=Trackset: "Only defined", , fileId=503, name=Waiting for the Hunt, unlock=in the Fist of Guthix minigame waiting room.] +TrackDefinition [arrayId=605, trackset=Trackset: "Only defined", , fileId=536, name=Cool for Ali Cats, unlock=during Smoking Kills.] +TrackDefinition [arrayId=606, trackset=Trackset: "Only defined", , fileId=561, name=Second Vision, unlock=at the Runecrafting Guild.] +TrackDefinition [arrayId=607, trackset=Trackset: "Only defined", , fileId=569, name=Undead Army, unlock=during Defender of Varrock.] +TrackDefinition [arrayId=608, trackset=Trackset: "Only defined", , fileId=566, name=Zombie Invasion, unlock=during Defender of Varrock.] +TrackDefinition [arrayId=609, trackset=Trackset: "Only defined", , fileId=570, name=The Ruins of Camdozaal, unlock=during Defender of Varrock.] +TrackDefinition [arrayId=610, trackset=Trackset: "Only defined", , fileId=567, name=Dream Theatre, unlock=during Defender of Varrock.] +TrackDefinition [arrayId=611, trackset=Trackset: "Only defined", , fileId=552, name=The Mentor, unlock=automatically.] +TrackDefinition [arrayId=612, trackset=Trackset: "Only defined", , fileId=543, name=Slain to Waste, unlock=during Smoking Kills.] +TrackDefinition [arrayId=613, trackset=Trackset: "Only defined", , fileId=555, name=Ardougne Ago, unlock=during Meeting History.] +TrackDefinition [arrayId=614, trackset=Trackset: "Only defined", , fileId=556, name=Sarah's Lullaby, unlock=not unlockable!] +TrackDefinition [arrayId=615, trackset=Trackset: "Only defined", , fileId=553, name=Shining Spirit, unlock=during Spirit of Summer.] +TrackDefinition [arrayId=616, trackset=Trackset: "Only defined", , fileId=554, name=Troubled Spirit, unlock=during Spirit of Summer.] +TrackDefinition [arrayId=617, trackset=Trackset: "Only defined", , fileId=564, name=Bane of Summer, unlock=during Summer's End.] +TrackDefinition [arrayId=618, trackset=Trackset: "Only defined", , fileId=563, name=The Vacant Abyss, unlock=during Summer's End.] +TrackDefinition [arrayId=619, trackset=Trackset: "Only defined", , fileId=557, name=Historic Memories, unlock=not unlockable!] +TrackDefinition [arrayId=620, trackset=Trackset: "Only defined", , fileId=578, name=Stealing Creation, unlock=during the Stealing Creation minigame.] +TrackDefinition [arrayId=621, trackset=Trackset: "Only defined", , fileId=562, name=Circus, unlock=during the Circus minigame.] +TrackDefinition [arrayId=622, trackset=Trackset: "Only defined", , fileId=579, name=Dangerous Logic, unlock=during the While Guthix Sleeps Quest.] +TrackDefinition [arrayId=623, trackset=Trackset: "Only defined", , fileId=585, name=Black of Knight, unlock=during the While Guthix Sleeps Quest.] +TrackDefinition [arrayId=624, trackset=, fileId=571, name=The Art of Hocus-Pocus, unlock=during or after the Halloween 2008 holiday event.] +TrackDefinition [arrayId=625, trackset=Trackset: "Only defined", , fileId=572, name=Magic and Mystery, unlock=during or after the Halloween 2008 holiday event.] +TrackDefinition [arrayId=626, trackset=Trackset: "Only defined", , fileId=589, name=The Sound of Guthix, unlock=during the While Guthix Sleeps Quest.] +TrackDefinition [arrayId=627, trackset=, fileId=580, name= , unlock=not unlockable!] +TrackDefinition [arrayId=628, trackset=Trackset: "Only defined", , fileId=584, name=Temple Desecrated, unlock=during the While Guthix Sleeps Quest.] +TrackDefinition [arrayId=629, trackset=, fileId=147, name= , unlock=default info] +TrackDefinition [arrayId=630, trackset=Trackset: "Only defined", , fileId=596, name=The Phoenix, unlock=during the In Pyre Need quest.] +TrackDefinition [arrayId=631, trackset=, fileId=147, name= , unlock=default info] +TrackDefinition [arrayId=632, trackset=Trackset: "Only defined", , fileId=581, name=The Evil Within, unlock=during the While Guthix Sleeps Quest.] \ No newline at end of file diff --git a/dumps/530/quest_configs_script.txt b/dumps/530/quest_configs_script.txt new file mode 100644 index 000000000..e5a5f858d --- /dev/null +++ b/dumps/530/quest_configs_script.txt @@ -0,0 +1,491 @@ +(Thanks to Cjay0091 on Rune-server) +(May work with our revision have to implement to test) + +All available quests: +/* + * Script decompiled by jagdecs2 v3.5 + * Decompiler opts: + * -------------- + * t1LocalAnalyzer:true + * t2LocalAnalyzer:true + * beautifier:true + * -------------- + * Made by mgi125 ;) + */ + + +int script_2193(int a0) { + switch (a0) { + case 147: + return script_2157(vars['cfg1295'], 1000); + case 159: + return script_2157(vars['cfg3820'].bitcfg19966, 170); + case 1: + return script_2157(vars['cfg2492'], 2); + case 2: + return script_2157(vars['cfg3518'].bitcfg17841, 9); + case 4: + return script_2157(vars['cfg2268'], 10); + case 5: + return script_2157(vars['cfg2183'], 3); + case 6: + return script_2157(vars['cfg2137'].bitcfg9363, 6); + case 7: + return script_2157(vars['cfg2669'], 2); + case 8: + return script_2157(vars['cfg2547'], 7); + case 9: + return script_2157(vars['cfg2227'], 4); + case 11: + return script_2157(vars['cfg2324'], 5); + case 13: + return script_2157(vars['cfg2689'], 6); + case 15: + return script_2159(vars['cfg2738'], 7, vars['cfg2739'], 4); + case 16: + return script_2157(vars['cfg2170'].bitcfg9655, 3); + case 18: + return script_2157(vars['cfg2409'].bitcfg11411, 240); + case 19: + return script_2157(vars['cfg2598'].bitcfg12797, 110); + case 20: + return script_2157(vars['cfg2772'], 65); + case 21: + return script_2157(vars['cfg2535'], 16); + case 22: + return script_2157(vars['cfg2326'], 140); + case 23: + return script_2157(vars['cfg2197'], 8); + case 24: + return script_2157(vars['cfg2260'].bitcfg10292, 130); + case 25: + return script_2157(vars['cfg2272'].bitcfg10448, 14); + case 26: + if (vars['cfg2615'] > 6) + return 2; + if (vars['cfg2615'] == 0 && vars['cfg2616'].bitcfg12894 == 0) + return 0; + return 1; + case 27: + return script_2157(vars['cfg2250'].bitcfg10204, 320); + case 28: + return script_2157(vars['cfg2422'].bitcfg11533, 13); + case 29: + if (vars['cfg2339'] >= 80) + return 2; + return script_2157(vars['cfg2337'].bitcfg10848, 65); + case 30: + return script_2157(vars['cfg2151'].bitcfg9482, 15); + case 31: + return script_2157(vars['cfg2453'].bitcfg11914, 80); + case 32: + return script_2157(vars['cfg2205'], 9); + case 33: + if (vars['cfg2695'] >= 4) + return 2; + return script_2157(vars['cfg2694'].bitcfg13366, 8); + case 34: + return script_2157(vars['cfg2732'], 11); + case 35: + return script_2157(vars['cfg2549'], 110); + case 36: + return script_2157(vars['cfg2785'].bitcfg13931, 40); + case 37: + if (_testbit(vars['cfg2675'], 20) == 1) + return 2; + if (_testbit(vars['cfg2675'], 1) == 0) + return 0; + return 1; + case 38: + return script_2157(vars['cfg2744'].bitcfg13674, 11); + case 39: + return script_2157(vars['cfg2187'].bitcfg9740, 70); + case 40: + return script_2157(vars['cfg2541'].bitcfg12529, 200); + case 41: + return script_2157(vars['cfg2599'].bitcfg12813, 60); + case 42: + return script_2157(vars['cfg2680'].bitcfg13286, 90); + case 43: + return script_2157(vars['cfg2474'].bitcfg12056, 90); + case 44: + return script_2157(vars['cfg2663'], 11); + case 45: + return script_2157(vars['cfg2181'].bitcfg9712, 28); + case 46: + return script_2157(vars['cfg2595'], 14); + case 47: + return script_2157(vars['cfg2331'], 5); + case 48: + return script_2157(vars['cfg2454'].bitcfg11917, 140); + case 49: + return script_2157(vars['cfg2262'], 10); + case 50: + return script_2157(vars['cfg2353'], 10); + case 51: + return script_2157(vars['cfg2703'].bitcfg13397, 60); + case 52: + return script_2157(vars['cfg2175'], 6); + case 53: + return script_2157(vars['cfg2715'].bitcfg13497, 8); + case 54: + return script_2157(vars['cfg2676'].bitcfg13266, 50); + case 55: + return script_2157(vars['cfg2728'].bitcfg13639, 10); + case 56: + return script_2157(vars['cfg2740'], 160); + case 57: + return script_2157(vars['cfg2799'].bitcfg14030, 160); + case 58: + return script_2157(vars['cfg2201'], 11); + case 59: + return script_2157(vars['cfg2592'], 9); + case 60: + return script_2157(vars['cfg2618'], 15); + case 61: + return script_2157(vars['cfg2330'], 10); + case 62: + return script_2157(vars['cfg2411'].bitcfg11413, 10); + case 63: + return script_2157(vars['cfg2357'].bitcfg10987, 26); + case 64: + return script_2157(vars['cfg2417'].bitcfg11498, 430); + case 65: + return script_2157(vars['cfg2696'], 105); + case 66: + return script_2157(vars['cfg2484'], 12); + case 67: + return script_2157(vars['cfg2265'], 75); + case 68: + return script_2157(vars['cfg2551'], 6); + case 69: + return script_2157(vars['cfg2787'].bitcfg13963, 11); + case 70: + return script_2157(vars['cfg2253'].bitcfg10236, 190); + case 71: + return script_2157(vars['cfg2173'].bitcfg9664, 4); + case 72: + return script_2157(vars['cfg2178'], 7); + case 73: + return script_2158(vars['cfg2762'], 1, 9); + case 74: + return script_2157(vars['cfg2370'], 80); + case 75: + return script_2157(vars['cfg2690'].bitcfg13349, 70); + case 76: + return script_2157(vars['cfg2777'], 8); + case 77: + return script_2158(vars['cfg2303'].bitcfg10560, 9, 60); + case 78: + return script_2157(vars['cfg2364'], 2); + case 79: + return script_2157(vars['cfg2230'].bitcfg9987, 320); + case 80: + return script_2157(vars['cfg2355'], 110); + case 81: + return script_2157(vars['cfg2796'], 7); + case 82: + return script_2157(vars['cfg2671'], 280); + case 83: + return script_2157(vars['cfg2386'], 29); + case 84: + return script_2157(vars['cfg2171'], 60); + case 85: + return script_2157(vars['cfg2612'].bitcfg12837, 4); + case 86: + return script_2157(vars['cfg2460'].bitcfg11975, 127); + case 87: + return script_2157(vars['cfg2579'].bitcfg12708, 5); + case 88: + return script_2157(vars['cfg2508'].bitcfg12355, 2); + case 89: + return script_2157(vars['cfg2102'], 15); + case 90: + return script_2157(vars['cfg2286'], 6); + case 91: + return script_2157(vars['cfg2515'].bitcfg12425, 30); + case 92: + return script_2157(vars['cfg2100'], 19); + case 93: + return script_2157(vars['cfg2747'], 6); + case 94: + return script_2157(vars['cfg2700'], 12); + case 95: + return script_2157(vars['cfg2554'].bitcfg12626, 14); + case 96: + return script_2157(vars['cfg2620'], 85); + case 97: + return script_2157(vars['cfg2290'].bitcfg10495, 125); + case 98: + return script_2157(vars['cfg2274'], 3); + case 99: + return script_2157(vars['cfg2793'], 15); + case 100: + return script_2157(vars['cfg2511'].bitcfg12392, 13); + case 101: + return script_2157(vars['cfg2548'].bitcfg12609, 60); + case 102: + return script_2157(vars['cfg2390'].bitcfg11269, 200); + case 103: + return script_2158(vars['cfg2523'], 3, 6); + case 104: + return script_2157(vars['cfg2369'].bitcfg11085, 70); + case 105: + return script_2157(vars['cfg1573'].bitcfg4909, 2); + case 106: + return script_2157(vars['cfg2148'], 80); + case 107: + return script_2157(vars['cfg2236'], 100); + case 108: + return script_2157(vars['cfg2501'], 30); + case 109: + return script_2157(vars['cfg2276'], 7); + case 110: + return script_2157(vars['cfg2661'], 9); + case 111: + return script_2157(vars['cfg2783'], 5); + case 112: + return script_2157(vars['cfg2135'], 45); + case 113: + return script_2157(vars['cfg2347'], 50); + case 114: + if (vars['cfg2426'] == 10) + return 2; + if (_testbit(vars['cfg2427'], 11) == 0) + return 0; + return 1; + case 115: + return script_2157(vars['cfg2628'].bitcfg12923, 11); + case 116: + return script_2157(vars['cfg2397'], 13); + case 117: + return script_2157(vars['cfg2270'].bitcfg10430, 135); + case 118: + return script_2157(vars['cfg2666'].bitcfg13178, 340); + case 119: + return script_2157(vars['cfg2190'].bitcfg9803, 18); + case 120: + return script_2157(vars['cfg2082'], 130); + case 121: + return script_2157(vars['cfg2352'].bitcfg10939, 150); + case 122: + return script_2157(vars['cfg2419'].bitcfg11517, 80); + case 123: + return script_2157(vars['cfg2729'].bitcfg13650, 11); + case 124: + return script_2157(vars['cfg2155'].bitcfg9530, 28); + case 125: + return script_2157(vars['cfg2726'].bitcfg13606, 60); + case 126: + return script_2157(vars['cfg2392'].bitcfg11298, 90); + case 127: + return script_2157(vars['cfg2277'].bitcfg10474, 200); + case 128: + return script_2157(vars['cfg2670'].bitcfg13194, 65); + case 129: + return script_2157(vars['cfg2682'].bitcfg13322, 18); + case 130: + return script_2157(vars['cfg2706'].bitcfg13430, 700); + case 131: + if (vars['cfg2507'].bitcfg12349 >= 110) + return 2; + return script_2157(vars['cfg2506'].bitcfg12334, 35); + case 132: + return script_2158(vars['cfg2802'].bitcfg14041, 10, 200); + case 133: + return script_2157(vars['cfg2494'].bitcfg12210, 60); + case 134: + return script_2157(vars['cfg2395'].bitcfg11334, 100); + case 135: + return script_2157(vars['cfg2788'].bitcfg13978, 500); + case 136: + return script_2157(vars['cfg2371'].bitcfg11095, 150); + case 137: + return script_2157(vars['cfg2407'].bitcfg11386, 63); + case 138: + return script_2157(vars['cfg2091'].bitcfg9054, 250); + case 139: + return script_2157(vars['cfg2531'].bitcfg12462, 100); + case 140: + return script_2157(vars['cfg2470'].bitcfg12013, 80); + case 141: + return script_2157(vars['cfg2749'].bitcfg13718, 20); + case 142: + return script_2157(vars['cfg2719'].bitcfg13518, 90); + case 143: + return script_2157(vars['cfg2412'].bitcfg11428, 35); + case 144: + return script_2157(vars['cfg2485'].bitcfg12163, 250); + case 145: + return script_2157(vars['cfg2441'].bitcfg11858, 910); + case 146: + return script_2157(vars['cfg2248'].bitcfg10188, 30); + case 148: + return script_2157(vars['cfg2774'].bitcfg13876, 60); + case 149: + return script_2158(vars['cfg2627'].bitcfg12906, 3, 45); + case 150: + return script_2158(vars['cfg2383'].bitcfg11228, 10, 250); + case 155: + return script_2157(vars['cfg2379'].bitcfg11167, 60); + case 156: + return script_2157(vars['cfg2377'].bitcfg11151, 240); + case 157: + return script_2157(vars['cfg2372'].bitcfg11105, 90); + case 151: + return script_2158(vars['cfg2759'].bitcfg13734, 2, 140); + case 152: + return script_2157(vars['cfg2107'].bitcfg9136, 110); + case 153: + return script_2157(vars['cfg2198'].bitcfg9847, 50); + case 154: + return script_2158(vars['cfg2612'].bitcfg9902, 2, 5); + case 158: + return script_2158(vars['cfg2214'].bitcfg9928, 10, 180); + case 160: + return script_2157(vars['cfg2300'].bitcfg10544, 90); + case 161: + return script_2157(vars['cfg2297'].bitcfg10506, 46); + case 162: + return script_2157(vars['cfg2243'].bitcfg10095, 12); + case 163: + return script_2158(vars['cfg2342'].bitcfg10871, 3, 147); + case 165: + return script_2157(vars['cfg2349'].bitcfg10919, 35); + case 167: + return script_2157(vars['cfg2085'].bitcfg9023, 30); + case 168: + return script_2157(vars['cfg2543'].bitcfg12598, 150); + case 170: + return script_2157(vars['cfg2334'].bitcfg10826, 60); + case 171: + return script_2157(vars['cfg2635'].bitcfg13034, 90); + case 172: + return script_2157(vars['cfg2539'].bitcfg12504, 5); + case 173: + return script_2158(vars['cfg2638'].bitcfg13080, 2, 63); + case 14: + return script_2157(vars['cfg2780'].bitcfg13904, 90); + case 174: + return script_2157(vars['cfg2657'].bitcfg13118, 40); + case 17: + return script_2157(vars['cfg2111'].bitcfg9188, 100); + case 176: + return script_2157(vars['cfg2430'].bitcfg11610, 400); + case 179: + return script_2158(vars['cfg2130'].bitcfg9324, 10, 315); + case 12: + return script_2157(vars['cfg2160'].bitcfg9547, 120); + case 180: + return script_2157(vars['cfg2487'].bitcfg12170, 9); + case 181: + return script_2158(vars['cfg2165'].bitcfg9602, 10, 210); + case 182: + return script_2157(vars['cfg2124'].bitcfg9212, 50); + case 183: + return script_2158(vars['cfg2112'].bitcfg9199, 5, 250); + case 184: + return script_2157(vars['cfg2360'].bitcfg11020, 170); + case 187: + return script_2157(vars['cfg2498'].bitcfg12258, 100); + case 188: + return script_2157(vars['cfg2674'].bitcfg13240, 40); + case 190: + return script_2157(vars['cfg2095'].bitcfg9091, 170); + case 191: + return script_2157(vars['cfg2437'].bitcfg11683, 270); + case 178: + return script_2158(vars['cfg2632'].bitcfg12989, 5, 100); + case 164: + return 2; + case 192: + return script_2157(vars['cfg2570'].bitcfg12689, 75); + case 193: + return script_2158(vars['cfg2141'].bitcfg9391, 5, 175); + case 175: + return script_2157(vars['cfg2449'].bitcfg11870, 105); + case 177: + return script_2157(vars['cfg2449'].bitcfg9429, 120); + case 3: + return script_2158(vars['cfg2231'].bitcfg9998, 4, 55); + case 194: + return script_2157(vars['cfg3294'].bitcfg16863, 170); + case 195: + return script_2157(vars['cfg3289'].bitcfg16834, 120); + case 196: + return script_2157(vars['cfg3299'].bitcfg16905, 225); + case 197: + return script_2157(vars['cfg3527'].bitcfg18021, 250); + case 198: + return script_2157(vars['cfg3631'].bitcfg18565, 75); + case 199: + return script_2157(vars['cfg3872'].bitcfg20561, 300); + case 200: + return script_2157(vars['cfg3885'].bitcfg20621, 100); + case 201: + return script_2157(vars['cfg4170'].bitcfg21714, 190); + case 10: + return script_2158(vars['cfg4260'].bitcfg21841, 5, 175); + case 202: + return script_2157(vars['cfg4390'].bitcfg22270, 100); + case 203: + return script_2157(vars['cfg4484'].bitcfg4291, 200); + case 204: + return script_2157(vars['cfg4670'].bitcfg23198, 400); + case 205: + return script_2157(vars['cfg4854'].bitcfg25561, 50); + case 206: + return script_2158(vars['cfg5015'].bitcfg26245, 10, 200); + case 207: + return script_2157(vars['cfg5114'].bitcfg27012, 120); + case 208: + return script_2158(vars['cfg5157'].bitcfg27209, 5, 50); + case 209: + return script_2158(vars['cfg5157'].bitcfg27209, 5, 40); + case 210: + return script_2158(vars['cfg5159'].bitcfg27264, 5, 15); + case 211: + return script_2158(vars['cfg5160'].bitcfg27272, 5, 70); + case 212: + return script_2158(vars['cfg5161'].bitcfg27284, 5, 45); + case 213: + return script_2158(vars['cfg5162'].bitcfg27291, 5, 110); + case 214: + return script_2157(vars['cfg5743'].bitcfg28509, 105); + case 215: + return script_2157(vars['cfg5840'].bitcfg29077, 120); + case 216: + return script_2157(vars['cfg5869'].bitcfg29424, 250); + case 217: + return script_2157(vars['cfg5892'].bitcfg20929, 200); + case 218: + return script_2157(vars['cfg5952'].bitcfg30071, 200); + case 219: + return script_2157(vars['cfg6120'].bitcfg30520, 170); + } + return 0; +} + + + +Test Bit Code: + + + public void sendTestBit(int shift, int var, int value) { + for (int id = VarbitDef.size() - 1; id >= 0; id--) { + VarbitDef def = VarbitDef.get(id); + + if (def.baseVar == var && def.startBit == shift && def.endBit == shift) { + sendVarBit(id, value); + return; + } + } + + sendVar(var, getValue(var) ^ (1 << shift)); // This just inverts the bit. + } + + +Var values and what they represent: +0 - Unstarted +1 - Started +2 - Completed \ No newline at end of file diff --git a/dumps/562/562_interface_configs.txt b/dumps/562/562_interface_configs.txt new file mode 100644 index 000000000..c2c78bf7d --- /dev/null +++ b/dumps/562/562_interface_configs.txt @@ -0,0 +1,45832 @@ +INTERFACE:0 +Hidden child:1 +Hidden child:3 +Hidden child:5 +Hidden child:7 +Hidden child:9 +INTERFACE:1 +Hidden child:1 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +INTERFACE:2 +INTERFACE:3 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +INTERFACE:4 +Found:Related BITconfig:ID:449, bitoffs:12, length:20 +Found:Related BITconfig:ID:449, bitoffs:7, length:11 +INTERFACE:5 +Found:Related BITconfig:ID:309, bitoffs:2, length:2 +INTERFACE:6 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:7 +INTERFACE:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:9 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:10 +INTERFACE:11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related config:115 +INTERFACE:12 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:13 +Found:Related GlobalIntVar(ButtonGraphics):98 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:563, bitoffs:0, length:2 +INTERFACE:14 +Found:Related GlobalIntVar(ButtonGraphics):98 +Found:Related GlobalStringVar(InfoString):344 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:13 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:29 +Hidden child:31 +INTERFACE:15 +Found:Related GlobalIntVar(ButtonGraphics):816 +Found:Related GlobalIntVar(ButtonGraphics):817 +Found:Related BITconfig:ID:1436, bitoffs:0, length:9 +Found:Related GlobalIntVar(ButtonGraphics):818 +Found:Related GlobalIntVar(ButtonGraphics):819 +Found:Related GlobalIntVar(ButtonGraphics):820 +INTERFACE:16 +Found:Related GlobalIntVar(ButtonGraphics):1514 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:1 +Hidden child:4 +Hidden child:18 +Hidden child:37 +Hidden child:52 +Hidden child:59 +Hidden child:64 +Hidden child:76 +INTERFACE:17 +Found:Indirect-related BITconfig:ID:1747, bitoffs:24, length:25 +Found:Indirect-related BITconfig:ID:1747, bitoffs:26, length:28 +Found:Indirect-related BITconfig:ID:1747, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1747, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1747, bitoffs:6, length:11 +Found:Indirect-related BITconfig:ID:1747, bitoffs:12, length:17 +Found:Indirect-related BITconfig:ID:1747, bitoffs:18, length:23 +Found:Indirect-related GlobalStringVar(InfoString):351 +Found:Indirect-related GlobalStringVar(InfoString):352 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:24 +Hidden child:27 +Hidden child:28 +INTERFACE:18 +Found:Indirect-related config:105 +Found:Indirect-related BITconfig:ID:1747, bitoffs:26, length:28 +Found:Indirect-related BITconfig:ID:1747, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1747, bitoffs:6, length:11 +Found:Indirect-related BITconfig:ID:1747, bitoffs:12, length:17 +Found:Indirect-related BITconfig:ID:1747, bitoffs:18, length:23 +Found:Indirect-related BITconfig:ID:1737, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:496, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1050, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1600, bitoffs:30, length:30 +Found:Indirect-related BITconfig:ID:1747, bitoffs:29, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:18 +Hidden child:26 +Hidden child:42 +Hidden child:46 +INTERFACE:19 +Found:Related config:2174 +Found:Related BITconfig:ID:2174, bitoffs:7, length:9 +Found:Related BITconfig:ID:2174, bitoffs:0, length:6 +Found:Related BITconfig:ID:2174, bitoffs:10, length:15 +Found:Related GlobalIntVar(ButtonGraphics):1497 +Hidden child:41 +INTERFACE:20 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related BITconfig:ID:2172, bitoffs:0, length:15 +Found:Related BITconfig:ID:2172, bitoffs:16, length:31 +Found:Related BITconfig:ID:2173, bitoffs:0, length:15 +Found:Related BITconfig:ID:2173, bitoffs:16, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:117 +INTERFACE:21 +Found:Indirect-related config:2185 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1520 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1521 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1522 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1524 +Found:Indirect-related GlobalStringVar(InfoString):127 +Found:Related GlobalIntVar(ButtonGraphics):1519 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:22 +Found:Related config:2201 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Related config:2202 +Found:Related config:2203 +Hidden child:34 +Hidden child:44 +Hidden child:45 +Hidden child:58 +Hidden child:68 +Hidden child:69 +Hidden child:90 +Hidden child:100 +Hidden child:101 +INTERFACE:23 +Found:Indirect-related config:2192 +Hidden child:15 +INTERFACE:24 +Found:Related BITconfig:ID:453, bitoffs:0, length:0 +Found:Related BITconfig:ID:453, bitoffs:1, length:1 +Found:Related BITconfig:ID:453, bitoffs:2, length:2 +Found:Related BITconfig:ID:453, bitoffs:3, length:3 +Found:Related BITconfig:ID:453, bitoffs:4, length:4 +Found:Related BITconfig:ID:453, bitoffs:5, length:5 +Found:Related BITconfig:ID:2221, bitoffs:0, length:0 +Found:Related BITconfig:ID:453, bitoffs:17, length:31 +Found:Related GlobalIntVar(ButtonGraphics):1043 +INTERFACE:25 +INTERFACE:26 +INTERFACE:27 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:28 +Found:Related BITconfig:ID:547, bitoffs:0, length:7 +Found:Related BITconfig:ID:543, bitoffs:12, length:29 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:545, bitoffs:0, length:7 +Found:Related BITconfig:ID:545, bitoffs:8, length:15 +Found:Related BITconfig:ID:545, bitoffs:16, length:23 +Found:Related BITconfig:ID:545, bitoffs:24, length:31 +Found:Related BITconfig:ID:546, bitoffs:0, length:7 +Found:Related BITconfig:ID:546, bitoffs:8, length:15 +Found:Related BITconfig:ID:546, bitoffs:24, length:31 +Found:Related BITconfig:ID:546, bitoffs:16, length:23 +Found:Related BITconfig:ID:549, bitoffs:8, length:15 +Hidden child:53 +INTERFACE:29 +INTERFACE:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:32 +Found:Related GlobalStringVar(InfoString):130 +Found:Related GlobalStringVar(InfoString):142 +Found:Related GlobalStringVar(InfoString):147 +Found:Related GlobalStringVar(InfoString):146 +Found:Related GlobalStringVar(InfoString):143 +Found:Related GlobalStringVar(InfoString):144 +Found:Related GlobalStringVar(InfoString):145 +Found:Related GlobalIntVar(ButtonGraphics):809 +Found:Related GlobalIntVar(ButtonGraphics):810 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):811 +Hidden child:13 +INTERFACE:33 +Found:Related GlobalIntVar(ButtonGraphics):1534 +INTERFACE:34 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalStringVar(InfoString):149 +Found:Related GlobalStringVar(InfoString):150 +Found:Related GlobalStringVar(InfoString):151 +Found:Related GlobalStringVar(InfoString):152 +Found:Related GlobalStringVar(InfoString):153 +Found:Related GlobalStringVar(InfoString):154 +Found:Related GlobalStringVar(InfoString):155 +Found:Related GlobalStringVar(InfoString):156 +Found:Related GlobalStringVar(InfoString):157 +Found:Related GlobalStringVar(InfoString):158 +Found:Related GlobalStringVar(InfoString):159 +Found:Related GlobalStringVar(InfoString):160 +Found:Related GlobalStringVar(InfoString):161 +Found:Related GlobalStringVar(InfoString):162 +Found:Related GlobalStringVar(InfoString):163 +Found:Related GlobalStringVar(InfoString):164 +Found:Related GlobalStringVar(InfoString):165 +Found:Related GlobalStringVar(InfoString):166 +Found:Related GlobalStringVar(InfoString):167 +Found:Related GlobalStringVar(InfoString):168 +Found:Related GlobalStringVar(InfoString):169 +Found:Related GlobalStringVar(InfoString):170 +Found:Related GlobalStringVar(InfoString):171 +Found:Related GlobalStringVar(InfoString):172 +Found:Related GlobalStringVar(InfoString):173 +Found:Related GlobalStringVar(InfoString):174 +Found:Related GlobalStringVar(InfoString):175 +Found:Related GlobalStringVar(InfoString):176 +Found:Related GlobalStringVar(InfoString):177 +Found:Related GlobalStringVar(InfoString):178 +Hidden child:3 +Hidden child:10 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:16 +Hidden child:44 +INTERFACE:35 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:36 +Found:Related GlobalStringVar(InfoString):130 +Found:Related GlobalStringVar(InfoString):142 +Found:Related GlobalStringVar(InfoString):146 +Found:Related GlobalStringVar(InfoString):147 +Found:Related GlobalStringVar(InfoString):143 +Found:Related GlobalStringVar(InfoString):144 +Found:Related GlobalStringVar(InfoString):145 +Found:Related GlobalIntVar(ButtonGraphics):809 +Found:Related GlobalIntVar(ButtonGraphics):810 +Found:Related GlobalIntVar(ButtonGraphics):811 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:43 +INTERFACE:37 +Found:Related GlobalIntVar(ButtonGraphics):834 +Found:Related GlobalIntVar(ButtonGraphics):835 +Found:Related GlobalIntVar(ButtonGraphics):836 +Found:Related GlobalIntVar(ButtonGraphics):833 +Found:Related BITconfig:ID:1450, bitoffs:13, length:17 +Found:Related BITconfig:ID:1451, bitoffs:15, length:18 +Found:Related BITconfig:ID:1451, bitoffs:19, length:21 +Found:Related BITconfig:ID:1451, bitoffs:15, length:15 +Found:Related BITconfig:ID:1451, bitoffs:17, length:17 +Found:Related BITconfig:ID:1451, bitoffs:18, length:18 +Found:Related BITconfig:ID:1451, bitoffs:16, length:16 +Found:Related BITconfig:ID:1453, bitoffs:0, length:5 +Hidden child:21 +Hidden child:44 +Hidden child:49 +INTERFACE:38 +INTERFACE:39 +Found:Related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):917 +Found:Related GlobalIntVar(ButtonGraphics):927 +Found:Indirect-related GlobalIntVar(ButtonGraphics):915 +Found:Related GlobalIntVar(ButtonGraphics):925 +Found:Indirect-related GlobalIntVar(ButtonGraphics):916 +Found:Related GlobalIntVar(ButtonGraphics):926 +Found:Indirect-related GlobalIntVar(ButtonGraphics):914 +Found:Related GlobalIntVar(ButtonGraphics):924 +Found:Indirect-related GlobalIntVar(ButtonGraphics):913 +Found:Related GlobalIntVar(ButtonGraphics):923 +Found:Indirect-related GlobalIntVar(ButtonGraphics):911 +Found:Related GlobalIntVar(ButtonGraphics):921 +Found:Indirect-related GlobalIntVar(ButtonGraphics):912 +Found:Related GlobalIntVar(ButtonGraphics):922 +Found:Indirect-related GlobalIntVar(ButtonGraphics):910 +Found:Related GlobalIntVar(ButtonGraphics):920 +Found:Indirect-related GlobalIntVar(ButtonGraphics):909 +Found:Related GlobalIntVar(ButtonGraphics):919 +Found:Indirect-related GlobalIntVar(ButtonGraphics):908 +Found:Related GlobalIntVar(ButtonGraphics):918 +INTERFACE:40 +Found:Related GlobalStringVar(InfoString):130 +Found:Related GlobalStringVar(InfoString):142 +Found:Related GlobalStringVar(InfoString):146 +Found:Related GlobalStringVar(InfoString):147 +Found:Related GlobalStringVar(InfoString):143 +Found:Related GlobalStringVar(InfoString):144 +Found:Related GlobalStringVar(InfoString):145 +Found:Related GlobalIntVar(ButtonGraphics):809 +Found:Related GlobalIntVar(ButtonGraphics):810 +Found:Related GlobalIntVar(ButtonGraphics):811 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:302 +INTERFACE:41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:1448 +Found:Related GlobalIntVar(ButtonGraphics):875 +INTERFACE:42 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:43 +Found:Related GlobalStringVar(InfoString):143 +Found:Related GlobalStringVar(InfoString):144 +Found:Related GlobalStringVar(InfoString):145 +Found:Related GlobalStringVar(InfoString):218 +Found:Related GlobalStringVar(InfoString):130 +Found:Related GlobalStringVar(InfoString):142 +Found:Related GlobalIntVar(ButtonGraphics):809 +Found:Related GlobalIntVar(ButtonGraphics):810 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:646, bitoffs:0, length:0 +Found:Related BITconfig:ID:646, bitoffs:1, length:1 +Found:Related BITconfig:ID:646, bitoffs:2, length:2 +Found:Related BITconfig:ID:646, bitoffs:3, length:3 +Found:Related BITconfig:ID:646, bitoffs:4, length:4 +Found:Related BITconfig:ID:646, bitoffs:5, length:5 +Found:Related BITconfig:ID:646, bitoffs:6, length:6 +Found:Related BITconfig:ID:646, bitoffs:7, length:7 +Found:Related BITconfig:ID:646, bitoffs:8, length:8 +Found:Related BITconfig:ID:646, bitoffs:9, length:9 +Found:Related BITconfig:ID:646, bitoffs:10, length:10 +Found:Related BITconfig:ID:646, bitoffs:11, length:11 +Found:Related BITconfig:ID:646, bitoffs:12, length:12 +Found:Related BITconfig:ID:646, bitoffs:13, length:13 +Found:Related BITconfig:ID:646, bitoffs:14, length:14 +Found:Related BITconfig:ID:646, bitoffs:15, length:15 +Found:Related BITconfig:ID:646, bitoffs:16, length:16 +Found:Related BITconfig:ID:646, bitoffs:17, length:17 +Found:Related BITconfig:ID:646, bitoffs:18, length:18 +Found:Related BITconfig:ID:646, bitoffs:19, length:19 +Found:Related BITconfig:ID:646, bitoffs:20, length:20 +Found:Related BITconfig:ID:646, bitoffs:21, length:21 +Found:Related BITconfig:ID:646, bitoffs:22, length:22 +Found:Related BITconfig:ID:646, bitoffs:23, length:23 +Found:Related BITconfig:ID:646, bitoffs:24, length:24 +Found:Related BITconfig:ID:646, bitoffs:25, length:25 +Found:Related BITconfig:ID:646, bitoffs:26, length:26 +Found:Related BITconfig:ID:646, bitoffs:27, length:27 +Found:Related BITconfig:ID:646, bitoffs:28, length:28 +Found:Related BITconfig:ID:646, bitoffs:29, length:29 +Found:Related BITconfig:ID:646, bitoffs:30, length:30 +Found:Related BITconfig:ID:646, bitoffs:31, length:31 +Found:Related BITconfig:ID:647, bitoffs:0, length:0 +Found:Related BITconfig:ID:647, bitoffs:1, length:1 +Found:Related BITconfig:ID:647, bitoffs:2, length:2 +Found:Related BITconfig:ID:647, bitoffs:3, length:3 +Found:Related BITconfig:ID:647, bitoffs:4, length:4 +Found:Related BITconfig:ID:647, bitoffs:5, length:5 +Found:Related BITconfig:ID:647, bitoffs:6, length:6 +Found:Related BITconfig:ID:647, bitoffs:7, length:7 +Found:Related BITconfig:ID:647, bitoffs:8, length:8 +Found:Related BITconfig:ID:647, bitoffs:9, length:9 +Found:Related BITconfig:ID:647, bitoffs:10, length:10 +Found:Related BITconfig:ID:647, bitoffs:11, length:11 +Found:Related BITconfig:ID:647, bitoffs:12, length:12 +Found:Related BITconfig:ID:647, bitoffs:13, length:13 +Found:Related BITconfig:ID:647, bitoffs:14, length:14 +Found:Related BITconfig:ID:647, bitoffs:15, length:15 +Found:Related BITconfig:ID:647, bitoffs:16, length:16 +Found:Related BITconfig:ID:647, bitoffs:17, length:17 +Found:Related BITconfig:ID:647, bitoffs:18, length:18 +Found:Related BITconfig:ID:647, bitoffs:19, length:19 +Found:Related BITconfig:ID:647, bitoffs:20, length:20 +Found:Related BITconfig:ID:647, bitoffs:21, length:21 +Found:Related BITconfig:ID:647, bitoffs:22, length:22 +Found:Related BITconfig:ID:647, bitoffs:23, length:23 +Found:Related BITconfig:ID:644, bitoffs:0, length:0 +Found:Related BITconfig:ID:644, bitoffs:1, length:1 +Found:Related BITconfig:ID:644, bitoffs:2, length:2 +Found:Related BITconfig:ID:644, bitoffs:3, length:3 +Found:Related BITconfig:ID:644, bitoffs:4, length:4 +Found:Related BITconfig:ID:644, bitoffs:5, length:5 +Found:Related BITconfig:ID:644, bitoffs:6, length:6 +Found:Related BITconfig:ID:644, bitoffs:7, length:7 +Found:Related BITconfig:ID:644, bitoffs:8, length:8 +Found:Related BITconfig:ID:644, bitoffs:9, length:9 +Found:Related BITconfig:ID:644, bitoffs:10, length:10 +Found:Related BITconfig:ID:644, bitoffs:11, length:11 +Found:Related BITconfig:ID:644, bitoffs:12, length:12 +Found:Related BITconfig:ID:644, bitoffs:13, length:13 +Found:Related BITconfig:ID:644, bitoffs:14, length:14 +Found:Related BITconfig:ID:644, bitoffs:15, length:15 +Found:Related BITconfig:ID:644, bitoffs:16, length:16 +Found:Related BITconfig:ID:644, bitoffs:17, length:17 +Found:Related BITconfig:ID:644, bitoffs:18, length:18 +Found:Related BITconfig:ID:644, bitoffs:19, length:19 +Found:Related BITconfig:ID:644, bitoffs:20, length:20 +Found:Related BITconfig:ID:644, bitoffs:21, length:21 +Found:Related BITconfig:ID:644, bitoffs:22, length:22 +Found:Related BITconfig:ID:644, bitoffs:23, length:23 +Found:Related BITconfig:ID:644, bitoffs:24, length:24 +Found:Related BITconfig:ID:644, bitoffs:25, length:25 +Found:Related BITconfig:ID:644, bitoffs:26, length:26 +Found:Related BITconfig:ID:644, bitoffs:27, length:27 +Found:Related BITconfig:ID:644, bitoffs:28, length:28 +Found:Related BITconfig:ID:644, bitoffs:29, length:29 +Found:Related BITconfig:ID:644, bitoffs:30, length:30 +Found:Related BITconfig:ID:644, bitoffs:31, length:31 +Found:Related BITconfig:ID:645, bitoffs:0, length:0 +Found:Related BITconfig:ID:645, bitoffs:1, length:1 +Found:Related BITconfig:ID:645, bitoffs:2, length:2 +Found:Related BITconfig:ID:645, bitoffs:3, length:3 +Found:Related BITconfig:ID:645, bitoffs:4, length:4 +Found:Related BITconfig:ID:645, bitoffs:5, length:5 +Found:Related BITconfig:ID:645, bitoffs:6, length:6 +Found:Related BITconfig:ID:645, bitoffs:7, length:7 +Found:Related BITconfig:ID:645, bitoffs:8, length:8 +Found:Related BITconfig:ID:645, bitoffs:9, length:9 +Found:Related BITconfig:ID:645, bitoffs:10, length:10 +Found:Related BITconfig:ID:645, bitoffs:11, length:11 +Found:Related BITconfig:ID:645, bitoffs:12, length:12 +Found:Related BITconfig:ID:645, bitoffs:13, length:13 +Found:Related BITconfig:ID:645, bitoffs:14, length:14 +Found:Related BITconfig:ID:645, bitoffs:15, length:15 +Found:Related BITconfig:ID:645, bitoffs:16, length:16 +Found:Related BITconfig:ID:645, bitoffs:17, length:17 +Found:Related BITconfig:ID:645, bitoffs:18, length:18 +Found:Related BITconfig:ID:645, bitoffs:19, length:19 +Found:Related BITconfig:ID:645, bitoffs:20, length:20 +Found:Related BITconfig:ID:645, bitoffs:21, length:21 +Found:Related BITconfig:ID:645, bitoffs:22, length:22 +Found:Related BITconfig:ID:645, bitoffs:23, length:23 +INTERFACE:44 +Found:Related GlobalStringVar(InfoString):143 +Found:Related GlobalStringVar(InfoString):144 +Found:Related GlobalStringVar(InfoString):145 +Found:Related GlobalStringVar(InfoString):130 +Found:Related GlobalStringVar(InfoString):142 +Found:Related GlobalStringVar(InfoString):146 +Found:Related GlobalStringVar(InfoString):147 +Found:Related GlobalIntVar(ButtonGraphics):809 +Found:Related GlobalIntVar(ButtonGraphics):810 +Found:Related GlobalIntVar(ButtonGraphics):811 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:139 +Hidden child:141 +INTERFACE:45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):837 +Found:Related BITconfig:ID:1444, bitoffs:17, length:20 +Found:Indirect-related config:1447 +INTERFACE:46 +INTERFACE:47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:49 +INTERFACE:50 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:51 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:28 +Hidden child:29 +INTERFACE:52 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +Hidden child:3 +Hidden child:5 +Hidden child:12 +INTERFACE:53 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:19 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:30 +INTERFACE:54 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1280 +Found:Related GlobalIntVar(ButtonGraphics):1278 +Found:Related BITconfig:ID:379, bitoffs:5, length:9 +Found:Related BITconfig:ID:379, bitoffs:0, length:4 +INTERFACE:55 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:56 +INTERFACE:57 +Found:Related config:380 +INTERFACE:58 +Found:Related config:380 +Found:Related BITconfig:ID:377, bitoffs:24, length:31 +Found:Related BITconfig:ID:378, bitoffs:24, length:31 +Found:Related BITconfig:ID:378, bitoffs:0, length:6 +Found:Related BITconfig:ID:378, bitoffs:21, length:22 +Found:Related BITconfig:ID:377, bitoffs:21, length:22 +Found:Related BITconfig:ID:378, bitoffs:7, length:7 +Found:Related BITconfig:ID:378, bitoffs:8, length:8 +Found:Related BITconfig:ID:378, bitoffs:9, length:9 +Found:Related BITconfig:ID:378, bitoffs:10, length:10 +INTERFACE:59 +Found:Related config:380 +Found:Related BITconfig:ID:377, bitoffs:24, length:31 +Found:Related BITconfig:ID:378, bitoffs:24, length:31 +Found:Related BITconfig:ID:377, bitoffs:0, length:6 +Found:Related BITconfig:ID:378, bitoffs:21, length:22 +Found:Related BITconfig:ID:377, bitoffs:21, length:22 +Found:Related BITconfig:ID:377, bitoffs:7, length:7 +Found:Related BITconfig:ID:377, bitoffs:8, length:8 +Found:Related BITconfig:ID:377, bitoffs:9, length:9 +Found:Related BITconfig:ID:377, bitoffs:10, length:10 +INTERFACE:60 +Found:Related GlobalIntVar(ButtonGraphics):1279 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:14 +Hidden child:17 +Hidden child:46 +Hidden child:87 +INTERFACE:61 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:40 +INTERFACE:62 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:63 +Found:Related config:620 +Found:Related config:621 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:64 +INTERFACE:65 +INTERFACE:66 +INTERFACE:67 +INTERFACE:68 +INTERFACE:69 +INTERFACE:70 +INTERFACE:71 +INTERFACE:72 +Found:Related BITconfig:ID:1934, bitoffs:0, length:0 +Found:Related BITconfig:ID:1934, bitoffs:7, length:7 +Found:Related BITconfig:ID:1934, bitoffs:8, length:8 +Found:Related BITconfig:ID:1934, bitoffs:9, length:9 +Found:Related BITconfig:ID:1934, bitoffs:5, length:5 +Found:Related BITconfig:ID:1934, bitoffs:1, length:1 +Found:Related BITconfig:ID:1934, bitoffs:2, length:2 +Found:Related BITconfig:ID:1934, bitoffs:4, length:4 +Found:Related BITconfig:ID:1934, bitoffs:3, length:3 +Found:Related BITconfig:ID:1934, bitoffs:6, length:6 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:1 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:58 +INTERFACE:73 +Found:Related GlobalIntVar(ButtonGraphics):1406 +INTERFACE:74 +INTERFACE:75 +INTERFACE:76 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +INTERFACE:77 +Found:Related BITconfig:ID:1775, bitoffs:16, length:19 +Found:Related GlobalIntVar(ButtonGraphics):1233 +Found:Related GlobalStringVar(InfoString):315 +Hidden child:0 +Hidden child:1 +Hidden child:2 +Hidden child:19 +INTERFACE:78 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related config:448 +INTERFACE:79 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related config:448 +Found:Related BITconfig:ID:1493, bitoffs:4, length:4 +INTERFACE:80 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:81 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:82 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:83 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:84 +Found:Indirect-related BITconfig:ID:1572, bitoffs:27, length:31 +Found:Indirect-related BITconfig:ID:1573, bitoffs:26, length:31 +Found:Indirect-related config:617 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:85 +INTERFACE:86 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:87 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1040 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1041 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1042 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related config:359 +Found:Indirect-related config:492 +Found:Indirect-related BITconfig:ID:635, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1330, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:445, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1348, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1003, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1348, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:968, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1420, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2088, bitoffs:18, length:21 +INTERFACE:89 +INTERFACE:90 +INTERFACE:91 +INTERFACE:92 +INTERFACE:93 +INTERFACE:94 +INTERFACE:95 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:96 +INTERFACE:97 +INTERFACE:98 +INTERFACE:99 +Found:Related GlobalStringVar(InfoString):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:9 +Hidden child:11 +INTERFACE:100 +INTERFACE:101 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:102 +Found:Indirect-related BITconfig:ID:2187, bitoffs:5, length:10 +Found:Indirect-related BITconfig:ID:2187, bitoffs:11, length:14 +Found:Related GlobalIntVar(ButtonGraphics):1526 +Found:Related GlobalIntVar(ButtonGraphics):1527 +Found:Related GlobalIntVar(ButtonGraphics):1528 +Found:Related GlobalIntVar(ButtonGraphics):1529 +Found:Related GlobalIntVar(ButtonGraphics):1530 +Found:Related GlobalIntVar(ButtonGraphics):1531 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:56 +Hidden child:61 +Hidden child:66 +Hidden child:67 +Hidden child:70 +Hidden child:80 +INTERFACE:103 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:104 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:105 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related config:1112 +Found:Indirect-related config:1113 +Found:Indirect-related config:1109 +Found:Indirect-related config:1111 +Found:Indirect-related config:1110 +Found:Indirect-related GlobalIntVar(ButtonGraphics):83 +Found:Indirect-related GlobalIntVar(ButtonGraphics):82 +Found:Indirect-related config:1118 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related config:1114 +Found:Indirect-related GlobalIntVar(ButtonGraphics):84 +Found:Indirect-related GlobalIntVar(ButtonGraphics):85 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:20 +Hidden child:36 +Hidden child:52 +Hidden child:67 +Hidden child:71 +Hidden child:86 +Hidden child:90 +Hidden child:105 +Hidden child:109 +Hidden child:124 +Hidden child:127 +Hidden child:154 +Hidden child:188 +Hidden child:193 +Hidden child:197 +INTERFACE:106 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:1108 +Hidden child:19 +Hidden child:33 +Hidden child:47 +Hidden child:60 +Hidden child:64 +Hidden child:77 +Hidden child:81 +Hidden child:94 +Hidden child:98 +Hidden child:111 +Hidden child:126 +Hidden child:131 +Hidden child:140 +INTERFACE:107 +INTERFACE:108 +INTERFACE:109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related config:1267 +Found:Indirect-related config:1269 +Hidden child:45 +INTERFACE:110 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:1108 +INTERFACE:111 +INTERFACE:112 +Hidden child:6 +INTERFACE:113 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:9 +INTERFACE:114 +Found:Related config:261 +Found:Related BITconfig:ID:433, bitoffs:13, length:13 +Found:Related config:262 +Found:Related config:263 +Found:Related config:264 +Found:Related config:265 +Found:Related config:266 +INTERFACE:115 +INTERFACE:116 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:117 +INTERFACE:118 +INTERFACE:119 +INTERFACE:120 +Found:Related BITconfig:ID:425, bitoffs:1, length:2 +INTERFACE:121 +INTERFACE:122 +INTERFACE:123 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:125 +Found:Related BITconfig:ID:615, bitoffs:0, length:0 +Found:Related BITconfig:ID:615, bitoffs:1, length:1 +Found:Related BITconfig:ID:615, bitoffs:2, length:2 +Found:Related BITconfig:ID:615, bitoffs:8, length:8 +Found:Related BITconfig:ID:1357, bitoffs:3, length:5 +Found:Related BITconfig:ID:615, bitoffs:9, length:13 +Found:Related BITconfig:ID:615, bitoffs:14, length:21 +Found:Related BITconfig:ID:615, bitoffs:22, length:29 +Found:Related BITconfig:ID:615, bitoffs:3, length:3 +Found:Related BITconfig:ID:615, bitoffs:30, length:30 +Found:Related BITconfig:ID:615, bitoffs:4, length:7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:126 +INTERFACE:127 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:128 +Found:Related BITconfig:ID:525, bitoffs:6, length:13 +Found:Related BITconfig:ID:525, bitoffs:14, length:21 +Found:Related BITconfig:ID:524, bitoffs:0, length:1 +Found:Related BITconfig:ID:524, bitoffs:2, length:3 +Found:Related BITconfig:ID:524, bitoffs:4, length:5 +Found:Related BITconfig:ID:524, bitoffs:6, length:7 +Found:Related BITconfig:ID:524, bitoffs:8, length:9 +Found:Related BITconfig:ID:524, bitoffs:10, length:11 +Found:Related BITconfig:ID:524, bitoffs:12, length:13 +Found:Related BITconfig:ID:524, bitoffs:14, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:129 +Found:Related BITconfig:ID:525, bitoffs:6, length:13 +Found:Related BITconfig:ID:525, bitoffs:14, length:21 +Found:Related BITconfig:ID:524, bitoffs:0, length:1 +Found:Related BITconfig:ID:524, bitoffs:2, length:3 +Found:Related BITconfig:ID:524, bitoffs:4, length:5 +Found:Related BITconfig:ID:524, bitoffs:6, length:7 +Found:Related BITconfig:ID:524, bitoffs:8, length:9 +Found:Related BITconfig:ID:524, bitoffs:10, length:11 +Found:Related BITconfig:ID:524, bitoffs:12, length:13 +Found:Related BITconfig:ID:524, bitoffs:14, length:15 +Found:Related BITconfig:ID:524, bitoffs:16, length:17 +Found:Related BITconfig:ID:524, bitoffs:18, length:19 +Found:Related BITconfig:ID:524, bitoffs:20, length:21 +Found:Related BITconfig:ID:524, bitoffs:22, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:130 +Found:Related BITconfig:ID:525, bitoffs:6, length:13 +Found:Related BITconfig:ID:525, bitoffs:14, length:21 +Found:Related BITconfig:ID:524, bitoffs:0, length:1 +Found:Related BITconfig:ID:524, bitoffs:2, length:3 +Found:Related BITconfig:ID:524, bitoffs:4, length:5 +Found:Related BITconfig:ID:524, bitoffs:6, length:7 +Found:Related BITconfig:ID:524, bitoffs:8, length:9 +Found:Related BITconfig:ID:524, bitoffs:10, length:11 +Found:Related BITconfig:ID:524, bitoffs:12, length:13 +Found:Related BITconfig:ID:524, bitoffs:14, length:15 +Found:Related BITconfig:ID:524, bitoffs:16, length:17 +Found:Related BITconfig:ID:524, bitoffs:18, length:19 +Found:Related BITconfig:ID:524, bitoffs:20, length:21 +Found:Related BITconfig:ID:524, bitoffs:22, length:23 +Found:Related BITconfig:ID:524, bitoffs:24, length:25 +Found:Related BITconfig:ID:524, bitoffs:26, length:27 +Found:Related BITconfig:ID:524, bitoffs:28, length:29 +Found:Related BITconfig:ID:524, bitoffs:30, length:31 +Found:Related BITconfig:ID:525, bitoffs:0, length:1 +Found:Related BITconfig:ID:525, bitoffs:2, length:3 +Found:Related BITconfig:ID:525, bitoffs:4, length:5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:131 +INTERFACE:132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:133 +INTERFACE:134 +Found:Related BITconfig:ID:1476, bitoffs:0, length:2 +Found:Related BITconfig:ID:1476, bitoffs:22, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1476, bitoffs:24, length:27 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:45 +Hidden child:49 +Hidden child:52 +Hidden child:55 +Hidden child:58 +Hidden child:61 +Hidden child:65 +Hidden child:66 +Hidden child:67 +Hidden child:68 +Hidden child:69 +Hidden child:70 +Hidden child:71 +Hidden child:72 +Hidden child:73 +Hidden child:76 +Hidden child:79 +INTERFACE:135 +Found:Related GlobalIntVar(ButtonGraphics):179 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:136 +INTERFACE:137 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):43 +Found:Related GlobalIntVar(ButtonGraphics):3 +Found:Related GlobalIntVar(ButtonGraphics):4 +Found:Related GlobalStringVar(InfoString):2 +Found:Related GlobalStringVar(InfoString):3 +Found:Related GlobalStringVar(InfoString):4 +Found:Related GlobalStringVar(InfoString):5 +Found:Related GlobalStringVar(InfoString):6 +Found:Related GlobalStringVar(InfoString):7 +Found:Related GlobalStringVar(InfoString):8 +Found:Related GlobalStringVar(InfoString):9 +Found:Related GlobalStringVar(InfoString):10 +Found:Related GlobalStringVar(InfoString):11 +Found:Related GlobalStringVar(InfoString):12 +Found:Related GlobalStringVar(InfoString):13 +Found:Related GlobalStringVar(InfoString):14 +Found:Related GlobalStringVar(InfoString):15 +Found:Related GlobalStringVar(InfoString):16 +Found:Related GlobalStringVar(InfoString):17 +Found:Related GlobalStringVar(InfoString):18 +Found:Related GlobalStringVar(InfoString):19 +Found:Related GlobalStringVar(InfoString):20 +Found:Related GlobalStringVar(InfoString):21 +Found:Indirect-related GlobalIntVar(ButtonGraphics):126 +Found:Indirect-related GlobalIntVar(ButtonGraphics):127 +Found:Indirect-related GlobalStringVar(InfoString):27 +Found:Indirect-related BITconfig:ID:1231, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1231, bitoffs:8, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):128 +Found:Indirect-related GlobalIntVar(ButtonGraphics):11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related GlobalStringVar(InfoString):23 +Found:Related GlobalStringVar(InfoString):24 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1029 +Found:Indirect-related GlobalStringVar(InfoString):22 +Hidden child:0 +Hidden child:3 +Hidden child:7 +Hidden child:9 +Hidden child:13 +Hidden child:56 +Hidden child:60 +Hidden child:68 +Hidden child:69 +Hidden child:70 +Hidden child:74 +Hidden child:75 +Hidden child:76 +Hidden child:77 +Hidden child:78 +Hidden child:79 +Hidden child:80 +Hidden child:81 +Hidden child:82 +Hidden child:167 +INTERFACE:138 +Found:Indirect-related BITconfig:ID:2046, bitoffs:0, length:6 +Found:Related config:153 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +Hidden child:32 +Hidden child:33 +Hidden child:34 +Hidden child:35 +Hidden child:36 +Hidden child:37 +Hidden child:38 +Hidden child:39 +Hidden child:40 +Hidden child:41 +INTERFACE:139 +Found:Related config:143 +INTERFACE:140 +INTERFACE:141 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:142 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:10 +INTERFACE:143 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:144 +Found:Related config:383 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:171 +Hidden child:173 +Hidden child:175 +Hidden child:179 +Hidden child:181 +Hidden child:182 +Hidden child:184 +INTERFACE:145 +Found:Related BITconfig:ID:681, bitoffs:0, length:10 +Found:Related BITconfig:ID:679, bitoffs:9, length:14 +Found:Related BITconfig:ID:683, bitoffs:0, length:11 +Found:Related BITconfig:ID:683, bitoffs:12, length:15 +Found:Related BITconfig:ID:680, bitoffs:0, length:2 +Found:Related BITconfig:ID:684, bitoffs:19, length:25 +Found:Related BITconfig:ID:684, bitoffs:3, length:10 +Found:Related BITconfig:ID:685, bitoffs:0, length:6 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:146 +INTERFACE:147 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:148 +INTERFACE:149 +Hidden child:185 +Hidden child:186 +Hidden child:187 +Hidden child:188 +Hidden child:189 +Hidden child:190 +Hidden child:191 +Hidden child:192 +Hidden child:193 +Hidden child:194 +Hidden child:195 +Hidden child:196 +Hidden child:197 +Hidden child:198 +Hidden child:199 +Hidden child:200 +Hidden child:201 +Hidden child:202 +Hidden child:203 +Hidden child:204 +Hidden child:205 +Hidden child:206 +Hidden child:207 +Hidden child:221 +Hidden child:233 +Hidden child:254 +INTERFACE:150 +INTERFACE:151 +Hidden child:1 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +INTERFACE:152 +Hidden child:0 +Hidden child:1 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +INTERFACE:153 +Found:Indirect-related config:2189 +Found:Indirect-related BITconfig:ID:2188, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:2188, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:2188, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:2188, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:2188, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:2188, bitoffs:4, length:4 +Found:Related config:2192 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:1 +Hidden child:2 +Hidden child:4 +Hidden child:5 +Hidden child:7 +Hidden child:8 +Hidden child:10 +Hidden child:11 +Hidden child:13 +Hidden child:14 +Hidden child:16 +Hidden child:20 +Hidden child:64 +Hidden child:102 +Hidden child:115 +Hidden child:128 +Hidden child:141 +Hidden child:143 +Hidden child:155 +Hidden child:157 +Hidden child:169 +Hidden child:171 +INTERFACE:154 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:155 +INTERFACE:156 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalStringVar(InfoString):211 +INTERFACE:157 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):155 +Found:Related BITconfig:ID:1231, bitoffs:18, length:19 +Hidden child:17 +Hidden child:35 +INTERFACE:158 +INTERFACE:159 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:18 +Hidden child:31 +Hidden child:32 +Hidden child:33 +Hidden child:34 +Hidden child:35 +INTERFACE:160 +INTERFACE:161 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:162 +INTERFACE:163 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:164 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:165 +INTERFACE:166 +INTERFACE:167 +INTERFACE:168 +INTERFACE:169 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:1018, bitoffs:0, length:7 +INTERFACE:170 +Found:Related BITconfig:ID:425, bitoffs:1, length:2 +INTERFACE:171 +INTERFACE:172 +Found:Related config:850 +Found:Related BITconfig:ID:845, bitoffs:0, length:5 +Found:Related BITconfig:ID:848, bitoffs:6, length:11 +Found:Related config:851 +Found:Related config:852 +Found:Related BITconfig:ID:845, bitoffs:6, length:11 +Found:Related BITconfig:ID:848, bitoffs:12, length:18 +Found:Related config:853 +Found:Related config:854 +Found:Related config:855 +Found:Related BITconfig:ID:845, bitoffs:12, length:17 +Found:Related BITconfig:ID:848, bitoffs:19, length:25 +Found:Related config:856 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:173 +Found:Indirect-related config:2194 +Found:Indirect-related BITconfig:ID:2193, bitoffs:24, length:27 +Found:Related BITconfig:ID:2187, bitoffs:5, length:10 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:1 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:8 +Hidden child:83 +INTERFACE:174 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:175 +INTERFACE:176 +INTERFACE:177 +INTERFACE:178 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1502, bitoffs:29, length:29 +Hidden child:4 +Hidden child:28 +Hidden child:58 +Hidden child:63 +Hidden child:65 +INTERFACE:179 +INTERFACE:180 +Hidden child:1 +INTERFACE:181 +Found:Related GlobalIntVar(ButtonGraphics):180 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:182 +Hidden child:8 +Hidden child:14 +INTERFACE:183 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:14 +Hidden child:15 +Hidden child:38 +Hidden child:42 +Hidden child:46 +Hidden child:49 +INTERFACE:184 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:807, bitoffs:2, length:5 +Found:Related BITconfig:ID:807, bitoffs:6, length:9 +Found:Related BITconfig:ID:807, bitoffs:12, length:15 +Found:Related BITconfig:ID:807, bitoffs:19, length:22 +Found:Related BITconfig:ID:807, bitoffs:10, length:11 +Found:Related BITconfig:ID:807, bitoffs:26, length:29 +Found:Related BITconfig:ID:807, bitoffs:16, length:18 +Found:Related BITconfig:ID:807, bitoffs:23, length:25 +Found:Related BITconfig:ID:807, bitoffs:30, length:31 +INTERFACE:185 +Found:Related BITconfig:ID:809, bitoffs:0, length:1 +Found:Related BITconfig:ID:809, bitoffs:2, length:5 +Found:Related BITconfig:ID:809, bitoffs:6, length:7 +Found:Related BITconfig:ID:809, bitoffs:8, length:11 +Found:Related BITconfig:ID:809, bitoffs:12, length:13 +Found:Related BITconfig:ID:809, bitoffs:14, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:186 +Found:Related GlobalIntVar(ButtonGraphics):679 +INTERFACE:187 +Found:Indirect-related BITconfig:ID:1621, bitoffs:0, length:14 //musics +Found:Indirect-related GlobalIntVar(ButtonGraphics):1077 //swich palay list +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related BITconfig:ID:1621, bitoffs:15, length:29 +Found:Indirect-related BITconfig:ID:1622, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:1622, bitoffs:15, length:29 +Found:Indirect-related BITconfig:ID:1623, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:1623, bitoffs:15, length:29 +Found:Indirect-related BITconfig:ID:1624, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:1624, bitoffs:15, length:29 +Found:Indirect-related BITconfig:ID:1625, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:1625, bitoffs:15, length:29 +Found:Indirect-related BITconfig:ID:1626, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:1626, bitoffs:15, length:29 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalStringVar(InfoString):196 +Found:Indirect-related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related config:20 +Found:Indirect-related config:21 +Found:Indirect-related config:22 +Found:Indirect-related config:23 +Found:Indirect-related config:24 +Found:Indirect-related config:25 +Found:Indirect-related config:298 +Found:Indirect-related config:311 +Found:Indirect-related config:346 +Found:Indirect-related config:414 +Found:Indirect-related config:464 +Found:Indirect-related config:598 +Found:Indirect-related config:662 +Found:Indirect-related config:721 +Found:Indirect-related config:906 +Found:Indirect-related config:1009 +Found:Indirect-related config:1104 +Found:Indirect-related config:1136 +Found:Indirect-related config:1180 +Found:Indirect-related config:1202 +Found:Indirect-related config:1381 +Found:Indirect-related config:1394 +Found:Indirect-related config:1434 +Found:Indirect-related config:1596 +Found:Indirect-related config:1618 +Found:Indirect-related config:1619 +Found:Indirect-related config:1620 +Found:Indirect-related config:1864 +Found:Indirect-related config:1865 +Found:Indirect-related config:2019 +Found:Indirect-related config:2246 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1189, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:1621, bitoffs:30, length:30 +Found:Related GlobalIntVar(ButtonGraphics):89 +Found:Related BITconfig:ID:297, bitoffs:1, length:1 +Found:Related BITconfig:ID:1621, bitoffs:31, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1029 +Found:Indirect-related GlobalStringVar(InfoString):22 +INTERFACE:188 +INTERFACE:189 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:190 +Found:Indirect-related BITconfig:ID:1384, bitoffs:5, length:8 +Found:Indirect-related BITconfig:ID:1384, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1384, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1384, bitoffs:9, length:9 +Found:Indirect-related GlobalIntVar(ButtonGraphics):693 +Found:Indirect-related GlobalIntVar(ButtonGraphics):694 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1103 +Found:Indirect-related GlobalIntVar(ButtonGraphics):692 +Found:Indirect-related GlobalIntVar(ButtonGraphics):272 +Found:Indirect-related GlobalIntVar(ButtonGraphics):273 +Found:Indirect-related config:281 +Found:Indirect-related config:130 +Found:Indirect-related config:29 +Found:Indirect-related config:31 +Found:Indirect-related config:176 +Found:Indirect-related config:32 +Found:Indirect-related config:160 +Found:Indirect-related config:122 +Found:Indirect-related config:71 +Found:Indirect-related config:273 +Found:Indirect-related config:107 +Found:Indirect-related config:63 +Found:Indirect-related config:145 +Found:Indirect-related config:146 +Found:Indirect-related config:293 +Found:Indirect-related config:68 +Found:Indirect-related config:655 +Found:Indirect-related config:10 +Found:Indirect-related config:399 +Found:Indirect-related config:314 +Found:Indirect-related config:131 +Found:Indirect-related config:80 +Found:Indirect-related config:0 +Found:Indirect-related config:335 +Found:Indirect-related config:299 +Found:Indirect-related config:148 +Found:Indirect-related config:17 +Found:Indirect-related config:11 +Found:Indirect-related config:347 +Found:Indirect-related config:65 +Found:Indirect-related config:180 +Found:Indirect-related config:150 +Found:Indirect-related config:382 +Found:Indirect-related config:223 +Found:Indirect-related config:188 +Found:Indirect-related config:5 +Found:Indirect-related config:387 +Found:Indirect-related config:175 +Found:Indirect-related config:139 +Found:Indirect-related config:147 +Found:Indirect-related config:14 +Found:Indirect-related config:365 +Found:Indirect-related config:30 +Found:Indirect-related config:517 +Found:Indirect-related config:192 +Found:Indirect-related config:307 +Found:Indirect-related config:112 +Found:Indirect-related config:416 +Found:Indirect-related config:165 +Found:Indirect-related config:302 +Found:Indirect-related config:328 +Found:Indirect-related config:402 +Found:Indirect-related config:600 +Found:Indirect-related config:76 +Found:Indirect-related config:159 +Found:Indirect-related config:339 +Found:Indirect-related config:60 +Found:Indirect-related config:116 +Found:Indirect-related config:320 +Found:Indirect-related config:26 +Found:Indirect-related config:359 +Found:Indirect-related config:197 +Found:Indirect-related config:226 +Found:Indirect-related config:111 +Found:Indirect-related config:200 +Found:Indirect-related config:385 +Found:Indirect-related config:317 +Found:Indirect-related config:161 +Found:Indirect-related config:162 +Found:Indirect-related config:212 +Found:Indirect-related config:980 +Found:Indirect-related BITconfig:ID:222, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:62, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:178, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:939, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:433, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:964, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:455, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:400, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:869, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:794, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:440, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:622, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:934, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:896, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:641, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:912, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:844, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:671, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:810, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:435, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:521, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:553, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:408, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:482, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:437, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:635, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:351, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:445, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:705, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:465, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:823, bitoffs:0, length:19 +Found:Indirect-related BITconfig:ID:604, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:423, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:574, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:905, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:714, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:607, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:678, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:496, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:730, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:874, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:602, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:709, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:616, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:723, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:568, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:449, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:571, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:968, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:970, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:977, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:992, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:994, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:997, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1003, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1016, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1049, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1063, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1077, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1094, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1165, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1178, bitoffs:1, length:10 +Found:Indirect-related BITconfig:ID:1184, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1190, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1204, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1218, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1225, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1227, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1232, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1236, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1271, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1274, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1282, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1306, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1311, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1330, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1370, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1365, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1403, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1407, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1415, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1475, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1577, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1420, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1390, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1327, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:714, bitoffs:3, length:6 +Found:Indirect-related BITconfig:ID:1819, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1498, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:1558, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1600, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1588, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1610, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1811, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1849, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1646, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1844, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1834, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1861, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2037, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1906, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1889, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2217, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2020, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2046, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:2051, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2079, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2208, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2234, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2376, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1593, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1402, bitoffs:4, length:13 +Found:Indirect-related GlobalIntVar(ButtonGraphics):698 +Found:Indirect-related GlobalIntVar(ButtonGraphics):699 +Found:Indirect-related GlobalIntVar(ButtonGraphics):695 +Found:Indirect-related BITconfig:ID:1255, bitoffs:0, length:1 +Found:Indirect-related config:101 +Found:Indirect-related BITconfig:ID:533, bitoffs:21, length:23 +Found:Indirect-related BITconfig:ID:1011, bitoffs:21, length:22 +Found:Indirect-related BITconfig:ID:1181, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:318, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:683, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1010, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1050, bitoffs:1, length:4 +Found:Indirect-related BITconfig:ID:1377, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1377, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1359, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:684, bitoffs:19, length:25 +Found:Indirect-related BITconfig:ID:1844, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1874, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:685, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1950, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1958, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1415, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1415, bitoffs:8, length:11 +Found:Indirect-related BITconfig:ID:1415, bitoffs:12, length:13 +Found:Indirect-related BITconfig:ID:1415, bitoffs:14, length:15 +Found:Indirect-related BITconfig:ID:1415, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1415, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1415, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1415, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1415, bitoffs:20, length:21 +Found:Indirect-related BITconfig:ID:1415, bitoffs:22, length:23 +Found:Indirect-related BITconfig:ID:1415, bitoffs:24, length:26 +Found:Indirect-related BITconfig:ID:1415, bitoffs:27, length:28 +Found:Indirect-related BITconfig:ID:1415, bitoffs:29, length:30 +Found:Indirect-related BITconfig:ID:1417, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1417, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1417, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1417, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1417, bitoffs:5, length:5 +Found:Related config:904 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:14 +Hidden child:15 +INTERFACE:191 +INTERFACE:192 +Found:Indirect-related BITconfig:ID:108, bitoffs:1, length:31 +Found:Indirect-related BITconfig:ID:439, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1510, bitoffs:5, length:13 +Found:Indirect-related BITconfig:ID:108, bitoffs:0, length:0 +Found:Related BITconfig:ID:439, bitoffs:8, length:8 +Found:Related GlobalIntVar(ButtonGraphics):993 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:1376, bitoffs:9, length:9 +Found:Related BITconfig:ID:1376, bitoffs:12, length:12 +Found:Related BITconfig:ID:1376, bitoffs:11, length:11 +Found:Related BITconfig:ID:1376, bitoffs:10, length:10 +Found:Related BITconfig:ID:1376, bitoffs:13, length:13 +Found:Related BITconfig:ID:1376, bitoffs:14, length:14 +Found:Related BITconfig:ID:1376, bitoffs:15, length:15 +Found:Related BITconfig:ID:1376, bitoffs:16, length:16 +Found:Related BITconfig:ID:1376, bitoffs:17, length:17 +Found:Related BITconfig:ID:1376, bitoffs:21, length:21 +Found:Related BITconfig:ID:1376, bitoffs:24, length:24 +Found:Related BITconfig:ID:1376, bitoffs:23, length:23 +Found:Related BITconfig:ID:1376, bitoffs:22, length:22 +Found:Related GlobalIntVar(ButtonGraphics):988 +Found:Related GlobalIntVar(ButtonGraphics):989 +Found:Related GlobalIntVar(ButtonGraphics):990 +Found:Related GlobalIntVar(ButtonGraphics):991 +Found:Related GlobalIntVar(ButtonGraphics):631 +Found:Indirect-related BITconfig:ID:1376, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1376, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:1376, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:1376, bitoffs:18, length:20 +Found:Indirect-related config:1092 +Found:Indirect-related BITconfig:ID:2089, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1087, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1209, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1331, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1334 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1335 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1402 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1403 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1235 +Found:Related GlobalIntVar(ButtonGraphics):1024 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):992 +Hidden child:92 +Hidden child:93 +INTERFACE:193 +Found:Indirect-related BITconfig:ID:108, bitoffs:1, length:31 +Found:Indirect-related BITconfig:ID:439, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1510, bitoffs:5, length:13 +Found:Indirect-related BITconfig:ID:108, bitoffs:0, length:0 +Found:Related BITconfig:ID:1376, bitoffs:9, length:9 +Found:Related BITconfig:ID:1376, bitoffs:12, length:12 +Found:Related BITconfig:ID:1376, bitoffs:11, length:11 +Found:Related BITconfig:ID:1376, bitoffs:10, length:10 +Found:Related BITconfig:ID:1376, bitoffs:13, length:13 +Found:Related BITconfig:ID:1376, bitoffs:14, length:14 +Found:Related BITconfig:ID:1376, bitoffs:15, length:15 +Found:Related BITconfig:ID:1376, bitoffs:16, length:16 +Found:Related BITconfig:ID:1376, bitoffs:17, length:17 +Found:Related BITconfig:ID:1376, bitoffs:21, length:21 +Found:Related BITconfig:ID:1376, bitoffs:24, length:24 +Found:Related BITconfig:ID:1376, bitoffs:23, length:23 +Found:Related BITconfig:ID:1376, bitoffs:22, length:22 +Found:Related GlobalIntVar(ButtonGraphics):988 +Found:Related GlobalIntVar(ButtonGraphics):989 +Found:Related GlobalIntVar(ButtonGraphics):990 +Found:Related GlobalIntVar(ButtonGraphics):991 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalIntVar(ButtonGraphics):631 +Found:Indirect-related BITconfig:ID:1376, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1376, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:1376, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:1376, bitoffs:18, length:20 +Found:Related BITconfig:ID:439, bitoffs:8, length:8 +Found:Related GlobalIntVar(ButtonGraphics):993 +Found:Indirect-related config:1092 +Found:Indirect-related BITconfig:ID:2089, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1087, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1209, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1331, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1334 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1335 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1402 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1403 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1235 +Found:Related GlobalIntVar(ButtonGraphics):992 +Hidden child:49 +Hidden child:50 +INTERFACE:194 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +INTERFACE:195 +Hidden child:1 +Hidden child:2 +Hidden child:3 +Hidden child:4 +INTERFACE:196 +INTERFACE:197 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:624, bitoffs:0, length:12 +Found:Related BITconfig:ID:625, bitoffs:15, length:27 +Found:Related BITconfig:ID:625, bitoffs:0, length:14 +Found:Related BITconfig:ID:624, bitoffs:13, length:26 +INTERFACE:198 +INTERFACE:199 +INTERFACE:200 +Found:Related config:170 +Found:Related GlobalStringVar(InfoString):320 +Found:Related GlobalStringVar(InfoString):319 +INTERFACE:201 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1383, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1383, bitoffs:3, length:4 +Found:Indirect-related BITconfig:ID:1383, bitoffs:5, length:7 +Found:Indirect-related BITconfig:ID:1383, bitoffs:8, length:9 +Found:Indirect-related BITconfig:ID:1383, bitoffs:10, length:11 +Found:Indirect-related BITconfig:ID:900, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:903, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:900, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:900, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:900, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:900, bitoffs:9, length:9 +INTERFACE:202 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:27 +INTERFACE:203 +Found:Related GlobalIntVar(ButtonGraphics):1007 +INTERFACE:204 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:77 +Hidden child:86 +Hidden child:87 +Hidden child:89 +Hidden child:98 +Hidden child:99 +Hidden child:101 +Hidden child:110 +Hidden child:111 +Hidden child:113 +INTERFACE:205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:27 +INTERFACE:206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):728 +Found:Indirect-related GlobalIntVar(ButtonGraphics):700 +Found:Indirect-related GlobalIntVar(ButtonGraphics):701 +Found:Indirect-related GlobalIntVar(ButtonGraphics):702 +Found:Indirect-related GlobalIntVar(ButtonGraphics):703 +Found:Indirect-related GlobalIntVar(ButtonGraphics):704 +Found:Indirect-related GlobalIntVar(ButtonGraphics):705 +Found:Indirect-related GlobalIntVar(ButtonGraphics):706 +Found:Indirect-related GlobalIntVar(ButtonGraphics):707 +Found:Indirect-related GlobalIntVar(ButtonGraphics):708 +Found:Indirect-related GlobalIntVar(ButtonGraphics):709 +Found:Indirect-related GlobalIntVar(ButtonGraphics):710 +Found:Indirect-related GlobalIntVar(ButtonGraphics):711 +Found:Indirect-related GlobalIntVar(ButtonGraphics):712 +Found:Indirect-related GlobalIntVar(ButtonGraphics):713 +Found:Indirect-related GlobalIntVar(ButtonGraphics):714 +Found:Indirect-related GlobalIntVar(ButtonGraphics):715 +Found:Indirect-related GlobalIntVar(ButtonGraphics):716 +Found:Indirect-related GlobalIntVar(ButtonGraphics):717 +Found:Indirect-related GlobalIntVar(ButtonGraphics):718 +Found:Indirect-related GlobalIntVar(ButtonGraphics):719 +Found:Indirect-related GlobalIntVar(ButtonGraphics):720 +Found:Indirect-related GlobalIntVar(ButtonGraphics):721 +Found:Indirect-related GlobalIntVar(ButtonGraphics):722 +Found:Indirect-related GlobalIntVar(ButtonGraphics):723 +Found:Indirect-related GlobalIntVar(ButtonGraphics):724 +Found:Indirect-related GlobalIntVar(ButtonGraphics):725 +Found:Indirect-related GlobalIntVar(ButtonGraphics):726 +Found:Indirect-related GlobalIntVar(ButtonGraphics):727 +INTERFACE:207 +INTERFACE:208 +INTERFACE:209 +Found:Related config:531 +INTERFACE:210 +INTERFACE:211 +INTERFACE:212 +INTERFACE:213 +INTERFACE:214 +INTERFACE:215 +INTERFACE:216 +INTERFACE:217 +INTERFACE:218 +INTERFACE:219 +INTERFACE:220 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:221 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:222 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:223 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:224 +INTERFACE:225 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:15 +INTERFACE:226 +Found:Indirect-related BITconfig:ID:425, bitoffs:1, length:2 +INTERFACE:227 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:55 +INTERFACE:228 +Hidden child:9 +INTERFACE:229 +Hidden child:9 +INTERFACE:230 +Hidden child:10 +INTERFACE:231 +Hidden child:10 +INTERFACE:232 +Hidden child:9 +INTERFACE:233 +Hidden child:9 +INTERFACE:234 +Hidden child:10 +INTERFACE:235 +Hidden child:10 +INTERFACE:236 +Hidden child:6 +INTERFACE:237 +Hidden child:8 +INTERFACE:238 +Hidden child:9 +INTERFACE:239 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:8 +INTERFACE:240 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:7 +Hidden child:12 +Hidden child:17 +Hidden child:22 +Hidden child:26 +INTERFACE:241 +INTERFACE:242 +INTERFACE:243 +INTERFACE:244 +INTERFACE:245 +INTERFACE:246 +INTERFACE:247 +INTERFACE:248 +INTERFACE:249 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:250 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:251 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:252 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +INTERFACE:253 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:254 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:3 +INTERFACE:255 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +INTERFACE:256 +INTERFACE:257 +INTERFACE:258 +INTERFACE:259 +Found:Related GlobalIntVar(ButtonGraphics):1525 +INTERFACE:260 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:47 +INTERFACE:261 +Found:Indirect-related config:170 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related config:171 +Found:Indirect-related config:427 +Found:Indirect-related BITconfig:ID:1438, bitoffs:5, length:5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:262 +Found:Related BITconfig:ID:898, bitoffs:6, length:8 +Found:Related GlobalIntVar(ButtonGraphics):163 +Found:Related GlobalIntVar(ButtonGraphics):164 +Found:Related GlobalIntVar(ButtonGraphics):162 +Found:Related GlobalIntVar(ButtonGraphics):165 +Found:Related GlobalIntVar(ButtonGraphics):166 +Found:Related GlobalIntVar(ButtonGraphics):167 +Found:Related BITconfig:ID:898, bitoffs:9, length:13 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +INTERFACE:263 +Found:Related BITconfig:ID:727, bitoffs:9, length:18 +INTERFACE:264 +Found:Related BITconfig:ID:518, bitoffs:16, length:18 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:265 +Found:Related BITconfig:ID:1305, bitoffs:9, length:9 +Found:Indirect-related GlobalIntVar(ButtonGraphics):267 +Found:Indirect-related GlobalStringVar(InfoString):38 +Found:Indirect-related GlobalStringVar(InfoString):39 +Found:Related GlobalIntVar(ButtonGraphics):266 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1029 +Found:Indirect-related GlobalStringVar(InfoString):22 +Found:Related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related config:287 +Found:Indirect-related config:1054 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:266 +Found:Related BITconfig:ID:1146, bitoffs:5, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:267 +Found:Related config:261 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:268 +INTERFACE:269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):105 +Found:Related GlobalIntVar(ButtonGraphics):106 +Found:Related GlobalIntVar(ButtonGraphics):99 +Found:Related GlobalIntVar(ButtonGraphics):100 +Found:Related GlobalIntVar(ButtonGraphics):101 +Found:Related GlobalIntVar(ButtonGraphics):104 +Found:Related GlobalIntVar(ButtonGraphics):102 +Found:Indirect-related BITconfig:ID:1161, bitoffs:5, length:18 +Found:Indirect-related GlobalIntVar(ButtonGraphics):103 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Related config:1163 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:1164 +Found:Related BITconfig:ID:1161, bitoffs:19, length:25 +INTERFACE:270 +Found:Related config:106 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:271 +Found:Indirect-related BITconfig:ID:2382, bitoffs:0, length:14 +Found:Indirect-related GlobalIntVar(ButtonGraphics):181 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1052 +Found:Related GlobalIntVar(ButtonGraphics):1063 +Found:Indirect-related BITconfig:ID:1510, bitoffs:5, length:13 +Found:Indirect-related BITconfig:ID:1587, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1587, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1587, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1587, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1587, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1587, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1587, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1587, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1587, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1587, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1587, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1587, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1587, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1587, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1587, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1587, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1587, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1587, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1587, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1587, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1397, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1397, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1397, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1397, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1397, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1397, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1397, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1397, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1397, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1397, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1397, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1397, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1397, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1397, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1397, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1397, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1397, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1397, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1397, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1397, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1397, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1397, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1397, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1397, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1397, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1397, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1397, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1397, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1397, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1397, bitoffs:29, length:29 +Hidden child:24 +Hidden child:42 +INTERFACE:272 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:273 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:274 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:275 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalIntVar(ButtonGraphics):771 +Hidden child:15 +Hidden child:316 +INTERFACE:276 +Found:Related BITconfig:ID:1377, bitoffs:2, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:78 +Hidden child:79 +INTERFACE:277 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:278 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:279 +Found:Related GlobalStringVar(InfoString):207 +Found:Related GlobalStringVar(InfoString):208 +INTERFACE:280 +INTERFACE:281 +Hidden child:7 +INTERFACE:282 +Found:Related BITconfig:ID:607, bitoffs:13, length:18 +Found:Related BITconfig:ID:607, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:283 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:284 +INTERFACE:285 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:286 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:331 +Found:Related config:330 +INTERFACE:287 +Found:Related GlobalIntVar(ButtonGraphics):1032 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:31 +INTERFACE:288 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:289 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:290 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:291 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):838 +Found:Related GlobalStringVar(InfoString):180 +Found:Related GlobalStringVar(InfoString):181 +Found:Related GlobalIntVar(ButtonGraphics):837 +Hidden child:55 +Hidden child:56 +Hidden child:57 +Hidden child:58 +INTERFACE:292 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1455, bitoffs:20, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):930 +Found:Indirect-related GlobalIntVar(ButtonGraphics):931 +Found:Indirect-related GlobalIntVar(ButtonGraphics):932 +Found:Indirect-related GlobalIntVar(ButtonGraphics):933 +Found:Indirect-related GlobalIntVar(ButtonGraphics):934 +Found:Indirect-related GlobalIntVar(ButtonGraphics):935 +Found:Indirect-related GlobalIntVar(ButtonGraphics):936 +Found:Indirect-related GlobalIntVar(ButtonGraphics):937 +Found:Indirect-related GlobalIntVar(ButtonGraphics):938 +Found:Indirect-related GlobalIntVar(ButtonGraphics):939 +Found:Indirect-related GlobalIntVar(ButtonGraphics):929 +Found:Indirect-related BITconfig:ID:1454, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1454, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1454, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1454, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1454, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1454, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1454, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1454, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1454, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1454, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1445, bitoffs:0, length:18 +Found:Indirect-related GlobalIntVar(ButtonGraphics):928 +Found:Indirect-related BITconfig:ID:1453, bitoffs:10, length:11 +Found:Indirect-related BITconfig:ID:1453, bitoffs:12, length:13 +Found:Indirect-related BITconfig:ID:1453, bitoffs:14, length:15 +Found:Indirect-related BITconfig:ID:1453, bitoffs:16, length:17 +Found:Indirect-related BITconfig:ID:1453, bitoffs:18, length:19 +Found:Indirect-related BITconfig:ID:1453, bitoffs:20, length:21 +Found:Indirect-related BITconfig:ID:1453, bitoffs:22, length:23 +Found:Indirect-related BITconfig:ID:1453, bitoffs:24, length:25 +Found:Indirect-related BITconfig:ID:1453, bitoffs:26, length:27 +Found:Indirect-related BITconfig:ID:1453, bitoffs:28, length:29 +Found:Indirect-related BITconfig:ID:1454, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1454, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1454, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1454, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1454, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1454, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1454, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1454, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1454, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1454, bitoffs:29, length:29 +Hidden child:130 +INTERFACE:293 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:294 +INTERFACE:295 +INTERFACE:296 +INTERFACE:297 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:23 +INTERFACE:298 +Found:Indirect-related GlobalIntVar(ButtonGraphics):618 +Found:Indirect-related GlobalIntVar(ButtonGraphics):619 +Found:Indirect-related GlobalIntVar(ButtonGraphics):620 +Found:Indirect-related GlobalIntVar(ButtonGraphics):621 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:299 +Found:Related config:75 +Hidden child:32 +Hidden child:33 +Hidden child:34 +Hidden child:35 +Hidden child:36 +Hidden child:37 +Hidden child:38 +Hidden child:39 +Hidden child:40 +Hidden child:41 +Hidden child:42 +Hidden child:43 +Hidden child:44 +Hidden child:45 +Hidden child:46 +Hidden child:47 +Hidden child:55 +Hidden child:71 +Hidden child:72 +INTERFACE:300 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:65 +Hidden child:81 +Hidden child:89 +Hidden child:97 +Hidden child:161 +Hidden child:169 +Hidden child:209 +Hidden child:249 +Hidden child:266 +INTERFACE:301 +Found:Indirect-related BITconfig:ID:1087, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1087, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1087, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1087, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1087, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1087, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1087, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1087, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1087, bitoffs:15, length:15 +Found:Related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1088, bitoffs:0, length:18 +Found:Related GlobalIntVar(ButtonGraphics):54 +Found:Related GlobalIntVar(ButtonGraphics):55 +Found:Related GlobalIntVar(ButtonGraphics):57 +Found:Related GlobalIntVar(ButtonGraphics):58 +Found:Related GlobalIntVar(ButtonGraphics):60 +Found:Related GlobalIntVar(ButtonGraphics):61 +Found:Related GlobalIntVar(ButtonGraphics):64 +Found:Related GlobalIntVar(ButtonGraphics):66 +Found:Related GlobalIntVar(ButtonGraphics):62 +Hidden child:13 +Hidden child:15 +Hidden child:17 +Hidden child:19 +Hidden child:21 +Hidden child:23 +Hidden child:25 +Hidden child:27 +Hidden child:29 +INTERFACE:302 +Found:Related GlobalIntVar(ButtonGraphics):1536 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:2208, bitoffs:15, length:18 +Found:Related BITconfig:ID:2209, bitoffs:9, length:12 +Found:Related GlobalIntVar(ButtonGraphics):1535 +INTERFACE:303 +INTERFACE:304 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:305 +INTERFACE:306 +Found:Related GlobalIntVar(ButtonGraphics):767 +Found:Related GlobalIntVar(ButtonGraphics):761 +Found:Related GlobalIntVar(ButtonGraphics):762 +Found:Related GlobalIntVar(ButtonGraphics):763 +Found:Related GlobalIntVar(ButtonGraphics):764 +Found:Related GlobalIntVar(ButtonGraphics):765 +Found:Related GlobalIntVar(ButtonGraphics):766 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:25 +Hidden child:27 +INTERFACE:307 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:308 +Found:Related BITconfig:ID:1393, bitoffs:19, length:21 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +Hidden child:32 +INTERFACE:309 +Found:Indirect-related GlobalIntVar(ButtonGraphics):779 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1008 +Found:Indirect-related GlobalIntVar(ButtonGraphics):774 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1009 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1015 +Found:Related BITconfig:ID:1057, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:11 +Hidden child:17 +INTERFACE:310 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1606 +Found:Indirect-related GlobalStringVar(InfoString):139 +Found:Indirect-related GlobalStringVar(InfoString):141 +Found:Indirect-related GlobalStringVar(InfoString):191 +Found:Indirect-related GlobalStringVar(InfoString):192 +Found:Indirect-related GlobalStringVar(InfoString):193 +Found:Indirect-related GlobalStringVar(InfoString):289 +Found:Indirect-related GlobalStringVar(InfoString):290 +Found:Indirect-related GlobalStringVar(InfoString):291 +Found:Indirect-related GlobalStringVar(InfoString):297 +Found:Indirect-related GlobalStringVar(InfoString):298 +Found:Indirect-related GlobalStringVar(InfoString):299 +Found:Indirect-related GlobalStringVar(InfoString):300 +Found:Indirect-related GlobalStringVar(InfoString):301 +Found:Indirect-related GlobalStringVar(InfoString):302 +Found:Indirect-related GlobalStringVar(InfoString):303 +INTERFACE:311 +Found:Related BITconfig:ID:1934, bitoffs:0, length:0 +Found:Related BITconfig:ID:1934, bitoffs:2, length:2 +Found:Related BITconfig:ID:1934, bitoffs:4, length:4 +Found:Related BITconfig:ID:1934, bitoffs:6, length:6 +Found:Related BITconfig:ID:1934, bitoffs:1, length:1 +Found:Related BITconfig:ID:1934, bitoffs:9, length:9 +Found:Related BITconfig:ID:1934, bitoffs:5, length:5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +Hidden child:3 +Hidden child:6 +Hidden child:7 +Hidden child:10 +Hidden child:11 +Hidden child:14 +Hidden child:15 +Hidden child:18 +Hidden child:19 +Hidden child:22 +Hidden child:23 +Hidden child:26 +INTERFACE:312 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:313 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related config:850 +Found:Related config:855 +Found:Related GlobalIntVar(ButtonGraphics):1437 +Found:Related GlobalIntVar(ButtonGraphics):1438 +Found:Related GlobalIntVar(ButtonGraphics):1439 +Found:Related GlobalIntVar(ButtonGraphics):1440 +Found:Related GlobalIntVar(ButtonGraphics):1449 +Found:Related config:851 +Found:Related config:852 +Found:Related GlobalIntVar(ButtonGraphics):1441 +Found:Related GlobalIntVar(ButtonGraphics):1442 +Found:Related GlobalIntVar(ButtonGraphics):1443 +Found:Related GlobalIntVar(ButtonGraphics):1444 +Found:Related GlobalIntVar(ButtonGraphics):1450 +Found:Related config:853 +Found:Related config:854 +Found:Related GlobalIntVar(ButtonGraphics):1445 +Found:Related GlobalIntVar(ButtonGraphics):1446 +Found:Related GlobalIntVar(ButtonGraphics):1447 +Found:Related GlobalIntVar(ButtonGraphics):1448 +Found:Related GlobalIntVar(ButtonGraphics):1451 +Found:Related config:856 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:56 +Hidden child:57 +Hidden child:58 +Hidden child:59 +Hidden child:60 +Hidden child:61 +Hidden child:62 +Hidden child:63 +Hidden child:65 +Hidden child:66 +Hidden child:69 +Hidden child:78 +Hidden child:81 +Hidden child:132 +Hidden child:133 +Hidden child:134 +Hidden child:135 +Hidden child:136 +Hidden child:137 +Hidden child:138 +Hidden child:139 +Hidden child:142 +Hidden child:143 +Hidden child:146 +Hidden child:155 +Hidden child:158 +Hidden child:209 +Hidden child:210 +Hidden child:211 +Hidden child:212 +Hidden child:213 +Hidden child:214 +Hidden child:215 +Hidden child:216 +Hidden child:218 +Hidden child:219 +Hidden child:222 +Hidden child:231 +Hidden child:234 +INTERFACE:314 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:2212, bitoffs:0, length:0 +Found:Related BITconfig:ID:2212, bitoffs:1, length:1 +Found:Related BITconfig:ID:2212, bitoffs:2, length:2 +Found:Related BITconfig:ID:2212, bitoffs:3, length:3 +Found:Related BITconfig:ID:2212, bitoffs:4, length:4 +Found:Related BITconfig:ID:2212, bitoffs:5, length:5 +Found:Related BITconfig:ID:2212, bitoffs:6, length:6 +Found:Related BITconfig:ID:2212, bitoffs:7, length:7 +Found:Related BITconfig:ID:2212, bitoffs:8, length:8 +Found:Related BITconfig:ID:2212, bitoffs:9, length:9 +Found:Related BITconfig:ID:2212, bitoffs:10, length:10 +Found:Related BITconfig:ID:2212, bitoffs:11, length:11 +Found:Related BITconfig:ID:2212, bitoffs:12, length:12 +Found:Related BITconfig:ID:2212, bitoffs:13, length:13 +Found:Related BITconfig:ID:2212, bitoffs:14, length:14 +Found:Related BITconfig:ID:2212, bitoffs:15, length:15 +Found:Related BITconfig:ID:2212, bitoffs:16, length:16 +Found:Related BITconfig:ID:2212, bitoffs:17, length:17 +Found:Related BITconfig:ID:2212, bitoffs:18, length:18 +Found:Related BITconfig:ID:2212, bitoffs:19, length:19 +Found:Related BITconfig:ID:2212, bitoffs:20, length:20 +Found:Related BITconfig:ID:2212, bitoffs:21, length:21 +Found:Related BITconfig:ID:2212, bitoffs:22, length:22 +Found:Related BITconfig:ID:2212, bitoffs:23, length:23 +Found:Related BITconfig:ID:2212, bitoffs:24, length:24 +Found:Related BITconfig:ID:2212, bitoffs:25, length:25 +Found:Related BITconfig:ID:2212, bitoffs:26, length:26 +INTERFACE:315 +INTERFACE:316 +Found:Related BITconfig:ID:639, bitoffs:0, length:5 +Hidden child:1 +Hidden child:2 +INTERFACE:317 +INTERFACE:318 +INTERFACE:319 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1607 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1608 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1609 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1610 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1611 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1612 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1613 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1614 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1615 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1616 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1617 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1618 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1619 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1620 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1621 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1622 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1623 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1624 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1625 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1626 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1627 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1628 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1629 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1630 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1631 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1632 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1633 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1634 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1635 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1636 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1637 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1638 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1639 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1640 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1641 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1642 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1643 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1644 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1645 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1646 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1647 +Hidden child:4 +Hidden child:53 +Hidden child:68 +INTERFACE:320 +Found:Indirect-related BITconfig:ID:1179, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1179, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1179, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1179, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1179, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1179, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1179, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1179, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1179, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1179, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1179, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1179, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1179, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1179, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1179, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1179, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1179, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1179, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1179, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1179, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1179, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1179, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1179, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1179, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1179, bitoffs:24, length:24 +Found:Related GlobalIntVar(ButtonGraphics):80 +Found:Indirect-related config:1966 +Found:Indirect-related config:1968 +Found:Indirect-related config:1969 +Found:Indirect-related config:1970 +Found:Indirect-related config:1971 +Found:Indirect-related config:1972 +Found:Indirect-related config:1973 +Found:Indirect-related config:1974 +Found:Indirect-related config:1975 +Found:Indirect-related config:1976 +Found:Indirect-related config:1977 +Found:Indirect-related config:1978 +Found:Indirect-related config:1979 +Found:Indirect-related config:1980 +Found:Indirect-related config:1981 +Found:Indirect-related config:1982 +Found:Indirect-related config:1983 +Found:Indirect-related config:1984 +Found:Indirect-related config:1985 +Found:Indirect-related config:1986 +Found:Indirect-related config:1987 +Found:Indirect-related config:1988 +Found:Indirect-related config:1989 +Found:Indirect-related config:1990 +Found:Indirect-related config:1991 +Found:Indirect-related config:1992 +Found:Indirect-related config:1993 +Found:Indirect-related config:1994 +Found:Indirect-related config:1995 +Found:Indirect-related config:1996 +Found:Indirect-related config:1997 +Found:Indirect-related config:1998 +Found:Indirect-related config:1999 +Found:Indirect-related config:2000 +Found:Indirect-related config:2001 +Found:Indirect-related config:2002 +Found:Indirect-related config:2003 +Found:Indirect-related config:2004 +Found:Indirect-related config:2005 +Found:Indirect-related config:2006 +Found:Indirect-related config:2007 +Found:Indirect-related config:2008 +Found:Indirect-related config:2009 +Found:Indirect-related config:2010 +Found:Indirect-related config:2011 +Found:Indirect-related config:2012 +Found:Indirect-related config:2013 +Found:Indirect-related config:2014 +Found:Indirect-related config:2015 +Found:Indirect-related config:2016 +Found:Indirect-related config:2017 +Found:Indirect-related config:2018 +Hidden child:203 +INTERFACE:321 +INTERFACE:322 +INTERFACE:323 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:324 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):617 +INTERFACE:325 +Found:Related config:158 +Found:Related config:156 +Found:Related config:157 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +INTERFACE:326 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:327 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:19 +INTERFACE:328 +Found:Related config:343 +Found:Related config:344 +Found:Related config:345 +INTERFACE:329 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:330 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:331 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:332 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:333 +INTERFACE:334 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):12 +Found:Indirect-related GlobalIntVar(ButtonGraphics):13 +Found:Indirect-related GlobalIntVar(ButtonGraphics):14 +Found:Indirect-related GlobalIntVar(ButtonGraphics):15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):16 +Found:Indirect-related GlobalIntVar(ButtonGraphics):17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):18 +Found:Indirect-related GlobalIntVar(ButtonGraphics):19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):20 +Found:Indirect-related GlobalIntVar(ButtonGraphics):21 +Found:Indirect-related GlobalIntVar(ButtonGraphics):22 +Found:Indirect-related GlobalIntVar(ButtonGraphics):23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):24 +Found:Indirect-related GlobalIntVar(ButtonGraphics):25 +Found:Indirect-related GlobalIntVar(ButtonGraphics):26 +Found:Indirect-related GlobalIntVar(ButtonGraphics):27 +Found:Indirect-related GlobalIntVar(ButtonGraphics):28 +Found:Indirect-related GlobalIntVar(ButtonGraphics):29 +Found:Indirect-related GlobalIntVar(ButtonGraphics):30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):32 +Found:Indirect-related GlobalIntVar(ButtonGraphics):33 +Found:Indirect-related GlobalIntVar(ButtonGraphics):34 +Found:Indirect-related GlobalIntVar(ButtonGraphics):35 +Found:Indirect-related GlobalIntVar(ButtonGraphics):36 +Found:Indirect-related GlobalIntVar(ButtonGraphics):37 +Found:Indirect-related GlobalIntVar(ButtonGraphics):38 +Found:Indirect-related GlobalIntVar(ButtonGraphics):39 +Found:Indirect-related GlobalIntVar(ButtonGraphics):212 +Found:Related GlobalStringVar(InfoString):203 +Hidden child:48 +Hidden child:51 +Hidden child:55 +INTERFACE:335 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):12 +Found:Related GlobalIntVar(ButtonGraphics):13 +Found:Related GlobalIntVar(ButtonGraphics):14 +Found:Related GlobalIntVar(ButtonGraphics):15 +Found:Related GlobalIntVar(ButtonGraphics):16 +Found:Related GlobalIntVar(ButtonGraphics):17 +Found:Related GlobalIntVar(ButtonGraphics):18 +Found:Related GlobalIntVar(ButtonGraphics):19 +Found:Related GlobalIntVar(ButtonGraphics):20 +Found:Related GlobalIntVar(ButtonGraphics):21 +Found:Related GlobalIntVar(ButtonGraphics):22 +Found:Related GlobalIntVar(ButtonGraphics):23 +Found:Related GlobalIntVar(ButtonGraphics):24 +Found:Related GlobalIntVar(ButtonGraphics):25 +Found:Related GlobalIntVar(ButtonGraphics):26 +Found:Related GlobalIntVar(ButtonGraphics):27 +Found:Related GlobalIntVar(ButtonGraphics):28 +Found:Related GlobalIntVar(ButtonGraphics):29 +Found:Related GlobalIntVar(ButtonGraphics):30 +Found:Related GlobalIntVar(ButtonGraphics):31 +Found:Related GlobalIntVar(ButtonGraphics):32 +Found:Related GlobalIntVar(ButtonGraphics):33 +Found:Related GlobalIntVar(ButtonGraphics):34 +Found:Related GlobalIntVar(ButtonGraphics):35 +Found:Related GlobalIntVar(ButtonGraphics):36 +Found:Related GlobalIntVar(ButtonGraphics):37 +Found:Related GlobalIntVar(ButtonGraphics):38 +Found:Related GlobalIntVar(ButtonGraphics):39 +Found:Related GlobalIntVar(ButtonGraphics):212 +Found:Related config:1042 +Found:Related config:1043 +Found:Related GlobalStringVar(InfoString):203 +Found:Related GlobalIntVar(ButtonGraphics):729 +Found:Related GlobalIntVar(ButtonGraphics):697 +Found:Indirect-related BITconfig:ID:259, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:259, bitoffs:7, length:13 +Hidden child:38 +Hidden child:39 +Hidden child:40 +Hidden child:46 +INTERFACE:336 +INTERFACE:337 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:338 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:339 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:340 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:341 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:342 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:343 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:344 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:345 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:346 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:347 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:348 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:349 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:350 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:351 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:352 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:353 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:354 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:355 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:356 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:357 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:358 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:359 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:360 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:361 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:362 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:363 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:5 +INTERFACE:364 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:5 +INTERFACE:365 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:14 +INTERFACE:366 +Found:Related config:391 +INTERFACE:367 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:368 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:369 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:370 +Found:Indirect-related config:294 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:371 +Found:Related config:406 +INTERFACE:372 +INTERFACE:373 +Found:Related config:560 +INTERFACE:374 +INTERFACE:375 +INTERFACE:376 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:10 +INTERFACE:377 +Found:Related BITconfig:ID:535, bitoffs:2, length:11 +INTERFACE:378 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:379 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:380 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:381 +Found:Related BITconfig:ID:1410, bitoffs:0, length:5 +Hidden child:3 +Hidden child:6 +INTERFACE:382 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:31 +INTERFACE:383 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:6 +Hidden child:9 +Hidden child:12 +Hidden child:15 +Hidden child:18 +INTERFACE:384 +Found:Related BITconfig:ID:425, bitoffs:1, length:2 +INTERFACE:385 +INTERFACE:386 +INTERFACE:387 +INTERFACE:388 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related BITconfig:ID:1734, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:2387, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:2387, bitoffs:26, length:31 +Hidden child:17 +Hidden child:30 +Hidden child:43 +Hidden child:56 +Hidden child:69 +Hidden child:90 +Hidden child:107 +Hidden child:121 +Hidden child:135 +Hidden child:148 +Hidden child:163 +Hidden child:177 +Hidden child:191 +Hidden child:205 +INTERFACE:389 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:0 +INTERFACE:390 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:3 +INTERFACE:391 +Found:Related config:1888 +Found:Related BITconfig:ID:730, bitoffs:0, length:9 +Found:Related BITconfig:ID:362, bitoffs:0, length:26 +Found:Related BITconfig:ID:363, bitoffs:8, length:11 +Found:Related BITconfig:ID:363, bitoffs:12, length:15 +Found:Related BITconfig:ID:363, bitoffs:4, length:7 +Found:Related BITconfig:ID:363, bitoffs:0, length:3 +Found:Related BITconfig:ID:729, bitoffs:0, length:3 +Found:Related BITconfig:ID:729, bitoffs:4, length:7 +Found:Related BITconfig:ID:729, bitoffs:10, length:10 +Found:Related BITconfig:ID:729, bitoffs:8, length:9 +Found:Related BITconfig:ID:362, bitoffs:27, length:27 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:22 +Hidden child:24 +Hidden child:28 +Hidden child:32 +INTERFACE:392 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:393 +INTERFACE:394 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:1485 +Found:Related config:1486 +Found:Related config:1487 +Found:Related config:1488 +Found:Related config:1489 +Found:Related config:1490 +Found:Related config:1491 +INTERFACE:395 +INTERFACE:396 +Found:Related config:1485 +Found:Related config:1486 +Found:Related config:1487 +Found:Related config:1488 +Found:Related config:1489 +Found:Related config:1490 +Found:Related config:1491 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:397 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:398 +Found:Related BITconfig:ID:740, bitoffs:10, length:10 +Found:Related GlobalIntVar(ButtonGraphics):944 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:738, bitoffs:29, length:29 +INTERFACE:399 +INTERFACE:400 +Found:Related GlobalIntVar(ButtonGraphics):943 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:401 +Found:Related GlobalStringVar(InfoString):220 +Found:Related GlobalStringVar(InfoString):221 +Found:Related GlobalStringVar(InfoString):222 +Found:Related GlobalStringVar(InfoString):223 +INTERFACE:402 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:403 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:50 +INTERFACE:404 +INTERFACE:405 +INTERFACE:406 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:407 +INTERFACE:408 +INTERFACE:409 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:410 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:411 +INTERFACE:412 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:413 +Found:Related BITconfig:ID:425, bitoffs:1, length:2 +INTERFACE:414 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:415 +Found:Related GlobalIntVar(ButtonGraphics):219 +Found:Related GlobalIntVar(ButtonGraphics):218 +Found:Related GlobalIntVar(ButtonGraphics):220 +Found:Related GlobalIntVar(ButtonGraphics):228 +Found:Related GlobalIntVar(ButtonGraphics):229 +Found:Related GlobalIntVar(ButtonGraphics):230 +Found:Related GlobalIntVar(ButtonGraphics):223 +Found:Related GlobalIntVar(ButtonGraphics):224 +Found:Related GlobalIntVar(ButtonGraphics):226 +Found:Related GlobalIntVar(ButtonGraphics):227 +Found:Related GlobalIntVar(ButtonGraphics):225 +Found:Related GlobalIntVar(ButtonGraphics):221 +Found:Related GlobalIntVar(ButtonGraphics):222 +Found:Related GlobalIntVar(ButtonGraphics):231 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:21 +Hidden child:23 +Hidden child:25 +Hidden child:27 +Hidden child:29 +INTERFACE:416 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:5 +Hidden child:6 +Hidden child:7 +INTERFACE:417 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:418 +INTERFACE:419 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:30 +Hidden child:36 +Hidden child:41 +Hidden child:46 +Hidden child:51 +Hidden child:56 +Hidden child:62 +Hidden child:68 +Hidden child:73 +Hidden child:78 +Hidden child:83 +Hidden child:91 +Hidden child:96 +Hidden child:101 +Hidden child:107 +Hidden child:112 +Hidden child:117 +Hidden child:122 +Hidden child:127 +Hidden child:132 +Hidden child:137 +Hidden child:142 +Hidden child:148 +Hidden child:153 +Hidden child:158 +Hidden child:163 +Hidden child:168 +Hidden child:173 +INTERFACE:420 +Found:Indirect-related BITconfig:ID:805, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:805, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:805, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:805, bitoffs:9, length:11 +Found:Indirect-related BITconfig:ID:805, bitoffs:12, length:14 +Found:Indirect-related BITconfig:ID:805, bitoffs:15, length:17 +Found:Indirect-related BITconfig:ID:805, bitoffs:18, length:20 +Found:Indirect-related BITconfig:ID:805, bitoffs:21, length:23 +Found:Related GlobalIntVar(ButtonGraphics):681 +Found:Related GlobalIntVar(ButtonGraphics):684 +Found:Related GlobalIntVar(ButtonGraphics):687 +Found:Related GlobalIntVar(ButtonGraphics):690 +Found:Related GlobalIntVar(ButtonGraphics):680 +Found:Related GlobalIntVar(ButtonGraphics):682 +Found:Related GlobalIntVar(ButtonGraphics):683 +Found:Related GlobalIntVar(ButtonGraphics):685 +Found:Related GlobalIntVar(ButtonGraphics):686 +Found:Related GlobalIntVar(ButtonGraphics):688 +Found:Related GlobalIntVar(ButtonGraphics):689 +Found:Related GlobalIntVar(ButtonGraphics):691 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:421 +INTERFACE:422 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:77 +Hidden child:79 +Hidden child:81 +Hidden child:83 +Hidden child:85 +Hidden child:87 +Hidden child:89 +Hidden child:91 +Hidden child:93 +Hidden child:95 +Hidden child:97 +Hidden child:99 +Hidden child:101 +Hidden child:103 +Hidden child:105 +Hidden child:107 +Hidden child:109 +Hidden child:111 +Hidden child:113 +Hidden child:115 +Hidden child:117 +Hidden child:119 +Hidden child:121 +Hidden child:123 +Hidden child:125 +Hidden child:127 +Hidden child:129 +Hidden child:131 +Hidden child:133 +Hidden child:135 +INTERFACE:423 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:424 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:425 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:426 +INTERFACE:427 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:428 +Found:Related BITconfig:ID:822, bitoffs:9, length:12 +Found:Related BITconfig:ID:822, bitoffs:0, length:8 +Found:Related BITconfig:ID:821, bitoffs:22, length:31 +INTERFACE:429 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:16 +Hidden child:20 +Hidden child:26 +Hidden child:34 +Hidden child:50 +INTERFACE:430 +Found:Related BITconfig:ID:1376, bitoffs:9, length:9 +Found:Related BITconfig:ID:1376, bitoffs:12, length:12 +Found:Related BITconfig:ID:1376, bitoffs:11, length:11 +Found:Related BITconfig:ID:1376, bitoffs:10, length:10 +Found:Related BITconfig:ID:1376, bitoffs:13, length:13 +Found:Related BITconfig:ID:1376, bitoffs:14, length:14 +Found:Related BITconfig:ID:1376, bitoffs:15, length:15 +Found:Related BITconfig:ID:1376, bitoffs:16, length:16 +Found:Related BITconfig:ID:1376, bitoffs:17, length:17 +Found:Related BITconfig:ID:1376, bitoffs:21, length:21 +Found:Related BITconfig:ID:1376, bitoffs:24, length:24 +Found:Related BITconfig:ID:1376, bitoffs:23, length:23 +Found:Related BITconfig:ID:1376, bitoffs:22, length:22 +Found:Related GlobalIntVar(ButtonGraphics):988 +Found:Related GlobalIntVar(ButtonGraphics):989 +Found:Related GlobalIntVar(ButtonGraphics):990 +Found:Related GlobalIntVar(ButtonGraphics):991 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:439, bitoffs:0, length:1 +Found:Related GlobalIntVar(ButtonGraphics):631 +Found:Indirect-related BITconfig:ID:1376, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1376, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:1376, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:1376, bitoffs:18, length:20 +Found:Indirect-related BITconfig:ID:108, bitoffs:1, length:31 +Found:Indirect-related BITconfig:ID:1510, bitoffs:5, length:13 +Found:Indirect-related BITconfig:ID:108, bitoffs:0, length:0 +Found:Related BITconfig:ID:439, bitoffs:8, length:8 +Found:Related GlobalIntVar(ButtonGraphics):993 +Found:Indirect-related config:1092 +Found:Indirect-related BITconfig:ID:2089, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1087, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1209, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1331, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1334 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1335 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1402 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1403 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1235 +Found:Related BITconfig:ID:2375, bitoffs:30, length:30 +Found:Related BITconfig:ID:2375, bitoffs:29, length:29 +Hidden child:78 +Hidden child:79 +INTERFACE:431 +INTERFACE:432 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:1092 +Found:Related BITconfig:ID:1087, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1209, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1331, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1334 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1335 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1402 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1403 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1235 +INTERFACE:433 +Found:Related BITconfig:ID:834, bitoffs:0, length:7 +Found:Related BITconfig:ID:834, bitoffs:8, length:15 +Found:Related BITconfig:ID:835, bitoffs:0, length:7 +Found:Related BITconfig:ID:835, bitoffs:8, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:434 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:13 +Hidden child:24 +Hidden child:33 +Hidden child:46 +Hidden child:53 +INTERFACE:435 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:11 +Hidden child:20 +Hidden child:33 +Hidden child:40 +INTERFACE:436 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:15 +Hidden child:22 +Hidden child:31 +Hidden child:40 +Hidden child:49 +Hidden child:60 +Hidden child:73 +INTERFACE:437 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:9 +Hidden child:16 +Hidden child:25 +Hidden child:32 +INTERFACE:438 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:1093 +Found:Related BITconfig:ID:1087, bitoffs:2, length:2 +Hidden child:19 +Hidden child:26 +Hidden child:33 +Hidden child:40 +Hidden child:47 +Hidden child:55 +Hidden child:62 +Hidden child:69 +Hidden child:77 +INTERFACE:439 +INTERFACE:440 +Found:Related GlobalStringVar(InfoString):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:441 +Found:Related GlobalStringVar(InfoString):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:442 +Found:Related config:856 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:443 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:444 +Found:Related GlobalStringVar(InfoString):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:445 +INTERFACE:446 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:46 +INTERFACE:447 +Found:Related BITconfig:ID:2215, bitoffs:0, length:4 +Found:Related GlobalIntVar(ButtonGraphics):1537 +Found:Related GlobalIntVar(ButtonGraphics):1538 +Found:Related GlobalIntVar(ButtonGraphics):1539 +Hidden child:14 +Hidden child:15 +INTERFACE:448 +INTERFACE:449 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Related GlobalIntVar(ButtonGraphics):10 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related config:1109 +Found:Indirect-related config:1111 +Found:Indirect-related config:1110 +Found:Indirect-related GlobalIntVar(ButtonGraphics):742 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1241 +Found:Indirect-related GlobalIntVar(ButtonGraphics):743 +Found:Indirect-related GlobalIntVar(ButtonGraphics):744 +Found:Indirect-related GlobalIntVar(ButtonGraphics):741 +Found:Indirect-related GlobalStringVar(InfoString):25 +Found:Indirect-related GlobalStringVar(InfoString):26 +Found:Indirect-related GlobalStringVar(InfoString):34 +Found:Indirect-related GlobalStringVar(InfoString):35 +Found:Indirect-related GlobalStringVar(InfoString):36 +Found:Indirect-related GlobalStringVar(InfoString):52 +Found:Indirect-related GlobalIntVar(ButtonGraphics):746 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1242 +Found:Indirect-related BITconfig:ID:678, bitoffs:11, length:20 +Found:Indirect-related BITconfig:ID:1023, bitoffs:15, length:16 +Found:Indirect-related BITconfig:ID:1181, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:705, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:678, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:997, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:2051, bitoffs:0, length:8 +Found:Indirect-related config:281 +Found:Indirect-related config:130 +Found:Indirect-related config:29 +Found:Indirect-related config:31 +Found:Indirect-related config:176 +Found:Indirect-related config:32 +Found:Indirect-related config:160 +Found:Indirect-related config:122 +Found:Indirect-related config:71 +Found:Indirect-related config:273 +Found:Indirect-related config:107 +Found:Indirect-related config:63 +Found:Indirect-related config:145 +Found:Indirect-related config:146 +Found:Indirect-related config:293 +Found:Indirect-related config:68 +Found:Indirect-related config:655 +Found:Indirect-related config:10 +Found:Indirect-related config:399 +Found:Indirect-related config:314 +Found:Indirect-related config:131 +Found:Indirect-related config:80 +Found:Indirect-related config:0 +Found:Indirect-related config:335 +Found:Indirect-related config:299 +Found:Indirect-related config:148 +Found:Indirect-related config:17 +Found:Indirect-related config:11 +Found:Indirect-related config:347 +Found:Indirect-related config:65 +Found:Indirect-related config:180 +Found:Indirect-related config:150 +Found:Indirect-related config:382 +Found:Indirect-related config:223 +Found:Indirect-related config:188 +Found:Indirect-related config:5 +Found:Indirect-related config:387 +Found:Indirect-related config:175 +Found:Indirect-related config:139 +Found:Indirect-related config:147 +Found:Indirect-related config:14 +Found:Indirect-related config:365 +Found:Indirect-related config:30 +Found:Indirect-related config:517 +Found:Indirect-related config:192 +Found:Indirect-related config:307 +Found:Indirect-related config:112 +Found:Indirect-related config:416 +Found:Indirect-related config:165 +Found:Indirect-related config:302 +Found:Indirect-related config:328 +Found:Indirect-related config:402 +Found:Indirect-related config:600 +Found:Indirect-related config:76 +Found:Indirect-related config:159 +Found:Indirect-related config:339 +Found:Indirect-related config:60 +Found:Indirect-related config:116 +Found:Indirect-related config:320 +Found:Indirect-related config:26 +Found:Indirect-related config:359 +Found:Indirect-related config:197 +Found:Indirect-related config:226 +Found:Indirect-related config:111 +Found:Indirect-related config:200 +Found:Indirect-related config:385 +Found:Indirect-related config:317 +Found:Indirect-related config:161 +Found:Indirect-related config:162 +Found:Indirect-related config:212 +Found:Indirect-related config:980 +Found:Indirect-related BITconfig:ID:222, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:62, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:178, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:939, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:433, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:964, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:455, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:400, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:869, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:794, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:440, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:622, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:934, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:896, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:641, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:912, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:844, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:671, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:810, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:435, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:521, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:553, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:408, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:482, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:437, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:635, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:351, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:445, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:465, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:823, bitoffs:0, length:19 +Found:Indirect-related BITconfig:ID:604, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:423, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:574, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:905, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:714, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:607, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:496, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:730, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:874, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:602, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:709, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:616, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:723, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:568, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:449, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:571, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:968, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:970, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:977, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:992, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:994, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1003, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1016, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1049, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1063, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1077, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1094, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1165, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1178, bitoffs:1, length:10 +Found:Indirect-related BITconfig:ID:1184, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1190, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1204, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1218, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1225, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1227, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1232, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1236, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1271, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1274, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1282, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1306, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1311, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1330, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1370, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1365, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1403, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1407, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1415, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1475, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1577, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1420, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1390, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1327, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:714, bitoffs:3, length:6 +Found:Indirect-related BITconfig:ID:1819, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1498, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:1558, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1600, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1588, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1610, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1811, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1849, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1646, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1844, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1834, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1861, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2037, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1906, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1889, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2217, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2020, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2046, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:2079, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2208, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2234, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2376, bitoffs:0, length:7 +Found:Indirect-related config:322 +Hidden child:15 +INTERFACE:450 +INTERFACE:451 +Hidden child:7 +INTERFACE:452 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:453 +INTERFACE:454 +INTERFACE:455 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:456 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:457 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:458 +Hidden child:9 +INTERFACE:459 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1404 +Found:Related GlobalIntVar(ButtonGraphics):1405 +INTERFACE:460 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +Hidden child:4 +Hidden child:6 +Hidden child:8 +Hidden child:10 +Hidden child:12 +Hidden child:14 +Hidden child:17 +INTERFACE:461 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +INTERFACE:462 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:463 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:464 +Found:Related BITconfig:ID:802, bitoffs:0, length:0 +Found:Related BITconfig:ID:802, bitoffs:1, length:1 +Found:Related BITconfig:ID:802, bitoffs:2, length:2 +Found:Related BITconfig:ID:802, bitoffs:3, length:3 +Found:Related BITconfig:ID:465, bitoffs:0, length:10 +Found:Related BITconfig:ID:313, bitoffs:0, length:0 +Found:Related BITconfig:ID:313, bitoffs:1, length:1 +Found:Related BITconfig:ID:313, bitoffs:2, length:2 +Found:Related BITconfig:ID:313, bitoffs:3, length:3 +Found:Related BITconfig:ID:313, bitoffs:4, length:4 +Found:Related BITconfig:ID:313, bitoffs:5, length:5 +Found:Related BITconfig:ID:313, bitoffs:6, length:6 +Found:Related BITconfig:ID:313, bitoffs:7, length:7 +Found:Related BITconfig:ID:313, bitoffs:8, length:8 +Found:Related BITconfig:ID:1085, bitoffs:0, length:3 +Found:Related BITconfig:ID:313, bitoffs:9, length:9 +Found:Related BITconfig:ID:313, bitoffs:10, length:10 +Found:Related BITconfig:ID:313, bitoffs:11, length:11 +Found:Related BITconfig:ID:313, bitoffs:12, length:12 +Found:Related BITconfig:ID:313, bitoffs:13, length:13 +Found:Related BITconfig:ID:313, bitoffs:15, length:15 +Found:Related BITconfig:ID:313, bitoffs:14, length:14 +Found:Related BITconfig:ID:1404, bitoffs:0, length:6 +Found:Related BITconfig:ID:1669, bitoffs:0, length:5 +Found:Related BITconfig:ID:1597, bitoffs:24, length:24 +Found:Related BITconfig:ID:1842, bitoffs:5, length:5 +Found:Related BITconfig:ID:1921, bitoffs:0, length:4 +Found:Related BITconfig:ID:2033, bitoffs:26, length:26 +Found:Related BITconfig:ID:1958, bitoffs:0, length:11 +Found:Related BITconfig:ID:2169, bitoffs:18, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:465 +INTERFACE:466 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:467 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:77 +Hidden child:79 +Hidden child:81 +Hidden child:83 +Hidden child:85 +Hidden child:87 +Hidden child:89 +Hidden child:91 +Hidden child:93 +Hidden child:95 +Hidden child:97 +Hidden child:99 +Hidden child:101 +Hidden child:103 +Hidden child:105 +Hidden child:107 +Hidden child:109 +Hidden child:111 +Hidden child:113 +Hidden child:115 +Hidden child:117 +Hidden child:119 +Hidden child:121 +Hidden child:123 +Hidden child:125 +Hidden child:127 +Hidden child:129 +Hidden child:131 +Hidden child:133 +Hidden child:135 +INTERFACE:468 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:469 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:12 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +INTERFACE:470 +INTERFACE:471 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:913, bitoffs:0, length:3 +Found:Related BITconfig:ID:913, bitoffs:4, length:7 +INTERFACE:472 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:4 +INTERFACE:473 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:946, bitoffs:28, length:30 +Found:Related BITconfig:ID:947, bitoffs:9, length:17 +Found:Related BITconfig:ID:947, bitoffs:0, length:2 +Found:Related BITconfig:ID:948, bitoffs:19, length:27 +Found:Related BITconfig:ID:947, bitoffs:3, length:5 +Found:Related BITconfig:ID:948, bitoffs:0, length:8 +Found:Related BITconfig:ID:947, bitoffs:6, length:8 +Found:Related BITconfig:ID:948, bitoffs:9, length:18 +Found:Related BITconfig:ID:945, bitoffs:29, length:29 +Found:Related BITconfig:ID:1605, bitoffs:26, length:26 +Found:Related BITconfig:ID:1605, bitoffs:28, length:28 +Found:Related BITconfig:ID:1605, bitoffs:25, length:25 +Found:Related BITconfig:ID:1605, bitoffs:27, length:27 +Hidden child:37 +Hidden child:39 +Hidden child:131 +Hidden child:176 +Hidden child:222 +Hidden child:225 +INTERFACE:474 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:10 +INTERFACE:475 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1281 +Found:Related GlobalIntVar(ButtonGraphics):1069 +Found:Related GlobalIntVar(ButtonGraphics):1070 +Found:Related GlobalIntVar(ButtonGraphics):1071 +Found:Related GlobalIntVar(ButtonGraphics):1072 +Found:Related GlobalIntVar(ButtonGraphics):1073 +Found:Related GlobalIntVar(ButtonGraphics):1074 +Found:Related GlobalIntVar(ButtonGraphics):1282 +Found:Related GlobalIntVar(ButtonGraphics):1075 +Found:Related GlobalIntVar(ButtonGraphics):1076 +Hidden child:2 +Hidden child:7 +Hidden child:33 +Hidden child:54 +Hidden child:56 +Hidden child:58 +Hidden child:100 +INTERFACE:476 +Found:Related BITconfig:ID:1633, bitoffs:6, length:21 +Found:Related GlobalIntVar(ButtonGraphics):1078 +Found:Related GlobalIntVar(ButtonGraphics):1086 +Found:Related BITconfig:ID:1629, bitoffs:2, length:5 +Found:Related GlobalIntVar(ButtonGraphics):1079 +Found:Related config:1632 +Found:Related GlobalIntVar(ButtonGraphics):1080 +Found:Related GlobalIntVar(ButtonGraphics):1081 +Found:Related GlobalIntVar(ButtonGraphics):1082 +Found:Related GlobalIntVar(ButtonGraphics):1083 +Found:Related GlobalIntVar(ButtonGraphics):1084 +Found:Related GlobalIntVar(ButtonGraphics):1085 +Found:Related BITconfig:ID:1628, bitoffs:0, length:5 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:17 +Hidden child:58 +INTERFACE:477 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:478 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:479 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:480 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +INTERFACE:481 +Found:Related GlobalIntVar(ButtonGraphics):1494 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:2077, bitoffs:0, length:3 +Hidden child:23 +Hidden child:37 +Hidden child:51 +Hidden child:65 +Hidden child:79 +INTERFACE:482 +INTERFACE:483 +INTERFACE:484 +INTERFACE:485 +INTERFACE:486 +INTERFACE:487 +INTERFACE:488 +Found:Related GlobalStringVar(InfoString):212 +Found:Related GlobalStringVar(InfoString):213 +Found:Related GlobalStringVar(InfoString):214 +Found:Related GlobalStringVar(InfoString):215 +Found:Related GlobalStringVar(InfoString):216 +Hidden child:5 +Hidden child:10 +Hidden child:15 +Hidden child:20 +INTERFACE:489 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +INTERFACE:490 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:491 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:492 +Found:Related GlobalStringVar(InfoString):212 +Found:Related GlobalStringVar(InfoString):213 +Found:Related GlobalStringVar(InfoString):214 +Found:Related GlobalStringVar(InfoString):215 +Found:Related GlobalStringVar(InfoString):216 +INTERFACE:493 +Found:Related GlobalStringVar(InfoString):212 +Found:Related GlobalStringVar(InfoString):213 +Found:Related GlobalStringVar(InfoString):214 +Found:Related GlobalStringVar(InfoString):215 +Found:Related GlobalStringVar(InfoString):216 +Hidden child:19 +Hidden child:20 +Hidden child:52 +Hidden child:53 +Hidden child:54 +INTERFACE:494 +INTERFACE:495 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:34 +Hidden child:35 +Hidden child:36 +Hidden child:47 +Hidden child:48 +Hidden child:49 +Hidden child:55 +INTERFACE:496 +Found:Related BITconfig:ID:948, bitoffs:28, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:497 +Hidden child:61 +Hidden child:62 +Hidden child:72 +Hidden child:84 +INTERFACE:498 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:4 +INTERFACE:499 +Found:Indirect-related BITconfig:ID:965, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:965, bitoffs:10, length:14 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:500 +Found:Related GlobalIntVar(ButtonGraphics):1548 +Hidden child:0 +Hidden child:1 +Hidden child:10 +Hidden child:51 +INTERFACE:501 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +INTERFACE:502 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +INTERFACE:503 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:504 +Hidden child:1 +INTERFACE:505 +INTERFACE:506 +INTERFACE:507 +INTERFACE:508 +Hidden child:9 +Hidden child:11 +Hidden child:13 +Hidden child:15 +Hidden child:17 +Hidden child:19 +Hidden child:21 +Hidden child:23 +Hidden child:25 +Hidden child:27 +Hidden child:29 +Hidden child:31 +Hidden child:33 +Hidden child:35 +INTERFACE:509 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:3 +Hidden child:4 +Hidden child:6 +Hidden child:7 +Hidden child:10 +Hidden child:12 +Hidden child:14 +Hidden child:20 +Hidden child:22 +Hidden child:26 +Hidden child:28 +INTERFACE:510 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:6 +Hidden child:11 +Hidden child:27 +Hidden child:29 +Hidden child:31 +Hidden child:33 +Hidden child:35 +Hidden child:37 +Hidden child:38 +Hidden child:40 +Hidden child:41 +Hidden child:43 +Hidden child:44 +Hidden child:46 +Hidden child:47 +Hidden child:50 +Hidden child:52 +Hidden child:53 +Hidden child:55 +Hidden child:57 +Hidden child:60 +Hidden child:64 +Hidden child:66 +Hidden child:68 +Hidden child:70 +Hidden child:74 +Hidden child:75 +Hidden child:76 +Hidden child:77 +Hidden child:78 +Hidden child:81 +Hidden child:90 +Hidden child:91 +Hidden child:94 +Hidden child:95 +INTERFACE:511 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:11 +Hidden child:16 +Hidden child:18 +Hidden child:20 +Hidden child:22 +INTERFACE:512 +INTERFACE:513 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1935, bitoffs:0, length:4 +Found:Related BITconfig:ID:1935, bitoffs:5, length:9 +Found:Related BITconfig:ID:1935, bitoffs:20, length:24 +Found:Related BITconfig:ID:1935, bitoffs:15, length:19 +Found:Related BITconfig:ID:1935, bitoffs:25, length:29 +Found:Related BITconfig:ID:1935, bitoffs:10, length:14 +INTERFACE:514 +INTERFACE:515 +INTERFACE:516 +INTERFACE:517 +INTERFACE:518 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:519 +INTERFACE:520 +Hidden child:0 +Hidden child:2 +Hidden child:4 +Hidden child:6 +Hidden child:8 +Hidden child:10 +Hidden child:12 +Hidden child:14 +Hidden child:16 +Hidden child:18 +INTERFACE:521 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:15 +Hidden child:72 +Hidden child:74 +Hidden child:76 +INTERFACE:522 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:7 +INTERFACE:523 +Found:Related GlobalStringVar(InfoString):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:524 +Found:Related GlobalIntVar(ButtonGraphics):1007 +Hidden child:1 +INTERFACE:525 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:526 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:527 +INTERFACE:528 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:529 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:530 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:5 +INTERFACE:531 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:532 +Found:Related BITconfig:ID:1010, bitoffs:0, length:10 +INTERFACE:533 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:26 +Hidden child:27 +INTERFACE:534 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:65 +INTERFACE:535 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:3 +Hidden child:22 +Hidden child:23 +INTERFACE:536 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:537 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:538 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:539 +INTERFACE:540 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1087 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:21 +Hidden child:23 +Hidden child:25 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +Hidden child:60 +Hidden child:61 +Hidden child:62 +Hidden child:63 +INTERFACE:541 +INTERFACE:542 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1452 +INTERFACE:543 +INTERFACE:544 +INTERFACE:545 +INTERFACE:546 +INTERFACE:547 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:548 +Found:Related BITconfig:ID:1644, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1243 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1244 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1245 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1246 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1247 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1248 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1249 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1250 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1251 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1252 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1253 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1254 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1255 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1256 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1257 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1258 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1259 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1260 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1261 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1262 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1263 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1264 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1265 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1266 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1267 +Found:Indirect-related config:1878 +Found:Indirect-related BITconfig:ID:1644, bitoffs:1, length:31 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:1255, bitoffs:0, length:1 +Found:Related GlobalIntVar(ButtonGraphics):173 +Found:Related GlobalStringVar(InfoString):148 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related GlobalIntVar(ButtonGraphics):616 +Found:Related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related config:2044 +Found:Related config:1801 +Found:Related GlobalIntVar(ButtonGraphics):1602 +Found:Related GlobalIntVar(ButtonGraphics):1427 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Related GlobalIntVar(ButtonGraphics):10 +Found:Related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related GlobalIntVar(ButtonGraphics):232 +Found:Indirect-related GlobalIntVar(ButtonGraphics):822 +Found:Indirect-related GlobalIntVar(ButtonGraphics):233 +Found:Indirect-related GlobalIntVar(ButtonGraphics):234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):235 +Found:Indirect-related GlobalIntVar(ButtonGraphics):236 +Found:Indirect-related GlobalIntVar(ButtonGraphics):237 +Found:Indirect-related GlobalIntVar(ButtonGraphics):238 +Found:Indirect-related GlobalIntVar(ButtonGraphics):823 +Found:Indirect-related GlobalIntVar(ButtonGraphics):240 +Found:Indirect-related GlobalIntVar(ButtonGraphics):241 +Found:Indirect-related GlobalIntVar(ButtonGraphics):242 +Found:Indirect-related GlobalIntVar(ButtonGraphics):243 +Found:Indirect-related GlobalIntVar(ButtonGraphics):244 +Found:Indirect-related GlobalIntVar(ButtonGraphics):245 +Found:Indirect-related GlobalIntVar(ButtonGraphics):824 +Found:Indirect-related BITconfig:ID:1021, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Related config:1159 +Found:Related BITconfig:ID:638, bitoffs:30, length:31 +Found:Related GlobalIntVar(ButtonGraphics):814 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1034 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1027 +Found:Indirect-related GlobalStringVar(InfoString):202 +Hidden child:1 +Hidden child:12 +Hidden child:13 +Hidden child:15 +Hidden child:19 +Hidden child:21 +Hidden child:23 +Hidden child:39 +Hidden child:41 +Hidden child:53 +Hidden child:68 +Hidden child:106 +Hidden child:114 +Hidden child:162 +Hidden child:188 +Hidden child:190 +Hidden child:193 +Hidden child:195 +Hidden child:199 +Hidden child:201 +Hidden child:202 +Hidden child:203 +Hidden child:204 +Hidden child:205 +Hidden child:206 +Hidden child:208 +Hidden child:209 +Hidden child:210 +Hidden child:211 +Hidden child:212 +Hidden child:213 +Hidden child:214 +Hidden child:215 +Hidden child:216 +Hidden child:217 +Hidden child:218 +Hidden child:219 +Hidden child:220 +Hidden child:221 +Hidden child:236 +Hidden child:239 +INTERFACE:549 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:15 +INTERFACE:550 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1036 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1029 +Found:Indirect-related GlobalStringVar(InfoString):22 +Found:Related GlobalIntVar(ButtonGraphics):1413 +Found:Related GlobalIntVar(ButtonGraphics):11 +Found:Related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related config:287 +Found:Indirect-related config:1054 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:0 +Hidden child:2 +Hidden child:7 +Hidden child:10 +Hidden child:14 +Hidden child:30 +Hidden child:46 +Hidden child:50 +INTERFACE:551 +Found:Related BITconfig:ID:2216, bitoffs:4, length:13 +Found:Related GlobalIntVar(ButtonGraphics):1549 +Found:Related GlobalIntVar(ButtonGraphics):1550 +Found:Related GlobalIntVar(ButtonGraphics):1551 +Found:Related GlobalIntVar(ButtonGraphics):1552 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:23 +Hidden child:44 +Hidden child:45 +Hidden child:46 +Hidden child:58 +Hidden child:59 +Hidden child:60 +Hidden child:72 +Hidden child:73 +Hidden child:74 +INTERFACE:552 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:553 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:1 +Hidden child:3 +Hidden child:5 +Hidden child:7 +Hidden child:9 +Hidden child:11 +Hidden child:13 +Hidden child:15 +Hidden child:17 +Hidden child:19 +Hidden child:21 +Hidden child:23 +Hidden child:25 +Hidden child:27 +Hidden child:29 +Hidden child:31 +Hidden child:33 +Hidden child:35 +Hidden child:37 +Hidden child:39 +Hidden child:41 +Hidden child:43 +Hidden child:45 +Hidden child:47 +Hidden child:49 +Hidden child:51 +Hidden child:53 +Hidden child:55 +Hidden child:57 +Hidden child:59 +INTERFACE:554 +INTERFACE:555 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:0 +Hidden child:1 +Hidden child:48 +INTERFACE:556 +INTERFACE:557 +Hidden child:9 +INTERFACE:558 +Found:Related GlobalIntVar(ButtonGraphics):769 +INTERFACE:559 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1037, bitoffs:0, length:0 +Found:Related BITconfig:ID:1037, bitoffs:1, length:1 +Found:Related BITconfig:ID:1037, bitoffs:2, length:2 +Found:Related BITconfig:ID:1037, bitoffs:3, length:3 +Found:Related BITconfig:ID:1037, bitoffs:4, length:4 +Found:Related BITconfig:ID:1037, bitoffs:5, length:5 +Found:Related BITconfig:ID:1037, bitoffs:6, length:6 +Found:Related BITconfig:ID:1037, bitoffs:7, length:7 +Found:Related BITconfig:ID:1037, bitoffs:8, length:8 +Found:Related BITconfig:ID:1037, bitoffs:9, length:9 +Found:Related BITconfig:ID:1037, bitoffs:10, length:10 +Found:Related BITconfig:ID:1037, bitoffs:11, length:11 +Found:Related BITconfig:ID:1037, bitoffs:12, length:12 +Found:Related BITconfig:ID:1037, bitoffs:13, length:13 +Found:Related BITconfig:ID:1037, bitoffs:14, length:14 +INTERFACE:560 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:561 +Found:Related GlobalStringVar(InfoString):343 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:562 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:563 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:564 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:565 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:566 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:567 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:568 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:569 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:570 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:571 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:572 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:573 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:574 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:575 +Found:Indirect-related BITconfig:ID:1283, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1283, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:1283, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:1283, bitoffs:9, length:11 +Found:Indirect-related BITconfig:ID:1283, bitoffs:12, length:14 +Found:Indirect-related BITconfig:ID:1283, bitoffs:15, length:17 +Found:Indirect-related BITconfig:ID:1283, bitoffs:18, length:20 +Found:Indirect-related BITconfig:ID:1283, bitoffs:21, length:23 +Found:Indirect-related BITconfig:ID:1283, bitoffs:24, length:26 +Found:Indirect-related BITconfig:ID:1288, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1288, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:1288, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:1288, bitoffs:9, length:11 +Found:Indirect-related BITconfig:ID:1288, bitoffs:12, length:14 +Found:Related BITconfig:ID:1283, bitoffs:28, length:31 +Found:Related BITconfig:ID:1282, bitoffs:17, length:17 +Found:Related BITconfig:ID:1282, bitoffs:18, length:18 +Found:Related BITconfig:ID:1282, bitoffs:19, length:19 +Found:Related BITconfig:ID:1282, bitoffs:20, length:20 +Found:Related BITconfig:ID:1282, bitoffs:21, length:21 +Found:Related BITconfig:ID:1282, bitoffs:22, length:22 +Found:Related BITconfig:ID:1282, bitoffs:23, length:23 +Found:Related BITconfig:ID:1282, bitoffs:24, length:24 +Found:Related BITconfig:ID:1282, bitoffs:25, length:25 +Found:Related BITconfig:ID:1282, bitoffs:26, length:26 +Found:Related BITconfig:ID:1282, bitoffs:27, length:27 +Found:Related BITconfig:ID:1282, bitoffs:28, length:28 +Found:Related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +INTERFACE:576 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:577 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:578 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:579 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:580 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:581 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:19 +INTERFACE:582 +Found:Related GlobalIntVar(ButtonGraphics):769 +INTERFACE:583 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +INTERFACE:584 +INTERFACE:585 +INTERFACE:586 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:587 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:588 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1051, bitoffs:12, length:14 +Found:Related BITconfig:ID:1051, bitoffs:0, length:2 +Found:Related BITconfig:ID:1051, bitoffs:3, length:5 +Found:Related BITconfig:ID:1051, bitoffs:6, length:8 +Found:Related BITconfig:ID:1051, bitoffs:9, length:11 +INTERFACE:589 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):6 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1094 +Found:Indirect-related GlobalStringVar(InfoString):279 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1097 +Found:Indirect-related GlobalStringVar(InfoString):277 +Found:Indirect-related GlobalStringVar(InfoString):278 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):349 +Hidden child:4 +Hidden child:28 +Hidden child:34 +Hidden child:50 +Hidden child:54 +INTERFACE:590 +Found:Indirect-related config:2230 +Found:Indirect-related BITconfig:ID:313, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:313, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:313, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:313, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:313, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:802, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:802, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:802, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:802, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:313, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:313, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:313, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:313, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1085, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:313, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:313, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:313, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:313, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:313, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:313, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:313, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1597, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1842, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1921, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:2033, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1958, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:465, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1404, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1669, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2169, bitoffs:0, length:0 +Found:Related config:281 +Hidden child:12 +Hidden child:13 +Hidden child:15 +Hidden child:16 +Hidden child:17 +INTERFACE:591 +Found:Related BITconfig:ID:1410, bitoffs:0, length:5 +INTERFACE:592 +Found:Related BITconfig:ID:1018, bitoffs:22, length:24 +Found:Related BITconfig:ID:1018, bitoffs:12, length:12 +Found:Related BITconfig:ID:1018, bitoffs:25, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:593 +Hidden child:8 +Hidden child:45 +Hidden child:48 +Hidden child:57 +Hidden child:59 +Hidden child:97 +Hidden child:110 +INTERFACE:594 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):790 +Found:Indirect-related GlobalStringVar(InfoString):24 +Found:Related GlobalIntVar(ButtonGraphics):6 +Found:Indirect-related GlobalIntVar(ButtonGraphics):11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related GlobalStringVar(InfoString):22 +Found:Related GlobalIntVar(ButtonGraphics):792 +Found:Related GlobalIntVar(ButtonGraphics):799 +Found:Related GlobalIntVar(ButtonGraphics):798 +Hidden child:8 +Hidden child:34 +Hidden child:49 +Hidden child:52 +Hidden child:62 +Hidden child:66 +Hidden child:104 +Hidden child:117 +Hidden child:120 +Hidden child:121 +Hidden child:148 +Hidden child:149 +Hidden child:150 +Hidden child:151 +Hidden child:165 +Hidden child:166 +Hidden child:210 +Hidden child:212 +INTERFACE:595 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:596 +Found:Related GlobalIntVar(ButtonGraphics):174 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1100 +Found:Indirect-related GlobalIntVar(ButtonGraphics):547 +Found:Indirect-related GlobalIntVar(ButtonGraphics):200 +Found:Indirect-related GlobalIntVar(ButtonGraphics):201 +Found:Indirect-related GlobalStringVar(InfoString):32 +Found:Indirect-related GlobalStringVar(InfoString):33 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1099 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1089 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1092 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1414 +Found:Indirect-related GlobalIntVar(ButtonGraphics):175 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1090 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1091 +Found:Indirect-related GlobalStringVar(InfoString):122 +Found:Indirect-related GlobalStringVar(InfoString):124 +Found:Indirect-related GlobalStringVar(InfoString):125 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1277 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1240 +Found:Indirect-related GlobalIntVar(ButtonGraphics):986 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1411 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1407 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1408 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1101 +Found:Indirect-related GlobalStringVar(InfoString):326 +Found:Indirect-related GlobalStringVar(InfoString):123 +Found:Indirect-related GlobalStringVar(InfoString):327 +Found:Indirect-related GlobalStringVar(InfoString):328 +Found:Indirect-related GlobalStringVar(InfoString):329 +Found:Indirect-related GlobalIntVar(ButtonGraphics):987 +Found:Indirect-related GlobalIntVar(ButtonGraphics):178 +Found:Related GlobalIntVar(ButtonGraphics):1088 +Hidden child:7 +Hidden child:9 +Hidden child:15 +Hidden child:63 +Hidden child:74 +Hidden child:80 +INTERFACE:597 +Found:Indirect-related BITconfig:ID:2040, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1048, bitoffs:19, length:30 +Found:Indirect-related BITconfig:ID:1058, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1048, bitoffs:7, length:18 +Found:Indirect-related BITconfig:ID:1058, bitoffs:12, length:23 +Found:Related GlobalIntVar(ButtonGraphics):1435 +INTERFACE:598 +Found:Indirect-related BITconfig:ID:2040, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1048, bitoffs:19, length:30 +Found:Indirect-related BITconfig:ID:1058, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1048, bitoffs:7, length:18 +Found:Indirect-related BITconfig:ID:1058, bitoffs:12, length:23 +Found:Related GlobalIntVar(ButtonGraphics):1435 +INTERFACE:599 +Found:Indirect-related BITconfig:ID:2040, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1048, bitoffs:19, length:30 +Found:Indirect-related BITconfig:ID:1058, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1048, bitoffs:7, length:18 +Found:Indirect-related BITconfig:ID:1058, bitoffs:12, length:23 +Found:Related GlobalIntVar(ButtonGraphics):1435 +INTERFACE:600 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:601 +Found:Indirect-related BITconfig:ID:2040, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1048, bitoffs:19, length:30 +Found:Indirect-related BITconfig:ID:1058, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1048, bitoffs:7, length:18 +Found:Indirect-related BITconfig:ID:1058, bitoffs:12, length:23 +Found:Related GlobalIntVar(ButtonGraphics):1435 +INTERFACE:602 +INTERFACE:603 +INTERFACE:604 +INTERFACE:605 +Found:Related GlobalIntVar(ButtonGraphics):51 +INTERFACE:606 +INTERFACE:607 +INTERFACE:608 +INTERFACE:609 +INTERFACE:610 +Found:Related GlobalIntVar(ButtonGraphics):51 +INTERFACE:611 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:612 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:613 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related config:1068 +Found:Related config:1069 +Found:Related config:1070 +Found:Related config:1065 +Found:Related config:1066 +Found:Related config:1067 +Found:Related config:856 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:14 +INTERFACE:614 +INTERFACE:615 +Found:Related GlobalIntVar(ButtonGraphics):51 +Found:Related GlobalIntVar(ButtonGraphics):50 +Found:Related GlobalIntVar(ButtonGraphics):52 +INTERFACE:616 +INTERFACE:617 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:618 +INTERFACE:619 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:45 +Hidden child:46 +Hidden child:47 +Hidden child:48 +Hidden child:49 +Hidden child:50 +Hidden child:51 +Hidden child:52 +Hidden child:53 +Hidden child:54 +Hidden child:55 +Hidden child:56 +Hidden child:57 +Hidden child:58 +INTERFACE:620 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related config:532 +Found:Related config:118 +Found:Related config:1496 +Found:Indirect-related BITconfig:ID:678, bitoffs:11, length:20 +Found:Indirect-related BITconfig:ID:1023, bitoffs:15, length:16 +Found:Indirect-related BITconfig:ID:1181, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:705, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:678, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:997, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:2051, bitoffs:0, length:8 +Found:Indirect-related config:130 +Found:Indirect-related config:29 +Found:Indirect-related config:31 +Found:Indirect-related config:176 +Found:Indirect-related config:32 +Found:Indirect-related config:160 +Found:Indirect-related config:122 +Found:Indirect-related config:71 +Found:Indirect-related config:273 +Found:Indirect-related config:107 +Found:Indirect-related config:63 +Found:Indirect-related config:145 +Found:Indirect-related config:146 +Found:Indirect-related config:293 +Found:Indirect-related config:68 +Found:Indirect-related config:655 +Found:Indirect-related config:10 +Found:Indirect-related config:399 +Found:Indirect-related config:314 +Found:Indirect-related config:131 +Found:Indirect-related config:80 +Found:Indirect-related config:0 +Found:Indirect-related config:335 +Found:Indirect-related config:299 +Found:Indirect-related config:148 +Found:Indirect-related config:17 +Found:Indirect-related config:11 +Found:Indirect-related config:347 +Found:Indirect-related config:65 +Found:Indirect-related config:180 +Found:Indirect-related config:150 +Found:Indirect-related config:382 +Found:Indirect-related config:223 +Found:Indirect-related config:188 +Found:Indirect-related config:5 +Found:Indirect-related config:387 +Found:Indirect-related config:175 +Found:Indirect-related config:139 +Found:Indirect-related config:147 +Found:Indirect-related config:14 +Found:Indirect-related config:365 +Found:Indirect-related config:30 +Found:Indirect-related config:517 +Found:Indirect-related config:192 +Found:Indirect-related config:307 +Found:Indirect-related config:112 +Found:Indirect-related config:416 +Found:Indirect-related config:165 +Found:Indirect-related config:302 +Found:Indirect-related config:328 +Found:Indirect-related config:402 +Found:Indirect-related config:600 +Found:Indirect-related config:76 +Found:Indirect-related config:159 +Found:Indirect-related config:339 +Found:Indirect-related config:60 +Found:Indirect-related config:116 +Found:Indirect-related config:320 +Found:Indirect-related config:26 +Found:Indirect-related config:359 +Found:Indirect-related config:197 +Found:Indirect-related config:226 +Found:Indirect-related config:111 +Found:Indirect-related config:200 +Found:Indirect-related config:385 +Found:Indirect-related config:317 +Found:Indirect-related config:161 +Found:Indirect-related config:162 +Found:Indirect-related config:212 +Found:Indirect-related config:980 +Found:Indirect-related BITconfig:ID:222, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:62, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:178, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:939, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:433, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:964, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:455, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:400, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:869, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:794, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:440, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:622, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:934, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:896, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:641, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:912, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:844, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:671, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:810, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:435, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:521, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:553, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:408, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:482, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:437, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:635, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:351, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:445, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:465, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:823, bitoffs:0, length:19 +Found:Indirect-related BITconfig:ID:604, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:423, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:574, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:905, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:714, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:607, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:496, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:730, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:874, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:602, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:709, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:616, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:723, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:568, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:449, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:571, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:968, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:970, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:977, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:992, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:994, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1003, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1016, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1049, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1063, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1077, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1094, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1165, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1178, bitoffs:1, length:10 +Found:Indirect-related BITconfig:ID:1184, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1190, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1204, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1218, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1225, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1227, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1232, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1236, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1271, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1274, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1282, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1306, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1311, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1330, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1370, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1365, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1403, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1407, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1415, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1475, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1577, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1420, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1390, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1327, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:714, bitoffs:3, length:6 +Found:Indirect-related BITconfig:ID:1819, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1498, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:1558, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1600, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1588, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1610, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1811, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1849, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1646, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1844, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1834, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1861, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2037, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1906, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1889, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2217, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2020, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2046, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:2079, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2208, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2234, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2376, bitoffs:0, length:7 +Found:Indirect-related config:322 +Found:Indirect-related GlobalIntVar(ButtonGraphics):946 +Found:Indirect-related GlobalIntVar(ButtonGraphics):947 +Found:Indirect-related GlobalIntVar(ButtonGraphics):948 +Found:Indirect-related GlobalIntVar(ButtonGraphics):949 +Found:Indirect-related GlobalIntVar(ButtonGraphics):950 +Found:Indirect-related GlobalIntVar(ButtonGraphics):951 +Found:Indirect-related GlobalIntVar(ButtonGraphics):952 +Found:Indirect-related GlobalIntVar(ButtonGraphics):953 +Found:Indirect-related GlobalIntVar(ButtonGraphics):954 +Found:Indirect-related GlobalIntVar(ButtonGraphics):955 +Found:Indirect-related GlobalIntVar(ButtonGraphics):956 +Found:Indirect-related GlobalIntVar(ButtonGraphics):957 +Found:Indirect-related GlobalIntVar(ButtonGraphics):958 +Found:Indirect-related GlobalIntVar(ButtonGraphics):959 +Found:Indirect-related GlobalIntVar(ButtonGraphics):960 +Found:Indirect-related GlobalIntVar(ButtonGraphics):961 +Found:Indirect-related GlobalIntVar(ButtonGraphics):962 +Found:Indirect-related GlobalIntVar(ButtonGraphics):963 +Found:Indirect-related GlobalIntVar(ButtonGraphics):964 +Found:Indirect-related GlobalIntVar(ButtonGraphics):965 +Found:Indirect-related GlobalIntVar(ButtonGraphics):966 +Found:Indirect-related GlobalIntVar(ButtonGraphics):967 +Found:Indirect-related GlobalIntVar(ButtonGraphics):968 +Found:Indirect-related GlobalIntVar(ButtonGraphics):969 +Found:Indirect-related GlobalIntVar(ButtonGraphics):970 +Found:Indirect-related GlobalIntVar(ButtonGraphics):971 +Found:Indirect-related GlobalIntVar(ButtonGraphics):972 +Found:Indirect-related GlobalIntVar(ButtonGraphics):973 +Found:Indirect-related GlobalIntVar(ButtonGraphics):974 +Found:Indirect-related GlobalIntVar(ButtonGraphics):975 +Found:Indirect-related GlobalIntVar(ButtonGraphics):976 +Found:Indirect-related GlobalIntVar(ButtonGraphics):977 +Found:Indirect-related GlobalIntVar(ButtonGraphics):978 +Found:Indirect-related GlobalIntVar(ButtonGraphics):979 +Found:Indirect-related GlobalIntVar(ButtonGraphics):980 +Found:Indirect-related GlobalIntVar(ButtonGraphics):981 +Found:Indirect-related GlobalIntVar(ButtonGraphics):982 +Found:Indirect-related GlobalIntVar(ButtonGraphics):983 +Found:Indirect-related GlobalIntVar(ButtonGraphics):984 +Found:Indirect-related GlobalIntVar(ButtonGraphics):985 +Hidden child:19 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +INTERFACE:621 +INTERFACE:622 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +INTERFACE:623 +INTERFACE:624 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1094, bitoffs:8, length:11 +Found:Related BITconfig:ID:1094, bitoffs:12, length:15 +Found:Related BITconfig:ID:1094, bitoffs:16, length:19 +Hidden child:35 +Hidden child:37 +Hidden child:39 +Hidden child:48 +Hidden child:50 +Hidden child:52 +Hidden child:54 +Hidden child:56 +Hidden child:58 +INTERFACE:625 +Found:Related BITconfig:ID:1095, bitoffs:11, length:13 +Found:Related GlobalIntVar(ButtonGraphics):773 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:626 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:286, bitoffs:14, length:27 +Found:Related BITconfig:ID:286, bitoffs:9, length:9 +Found:Related BITconfig:ID:286, bitoffs:0, length:0 +Found:Related BITconfig:ID:286, bitoffs:1, length:1 +Found:Related BITconfig:ID:286, bitoffs:28, length:28 +Found:Related BITconfig:ID:286, bitoffs:4, length:4 +Found:Related BITconfig:ID:286, bitoffs:5, length:5 +Found:Related BITconfig:ID:286, bitoffs:6, length:6 +Found:Related BITconfig:ID:286, bitoffs:13, length:13 +Found:Related BITconfig:ID:286, bitoffs:12, length:12 +Found:Related BITconfig:ID:286, bitoffs:7, length:7 +Found:Related BITconfig:ID:286, bitoffs:8, length:8 +Found:Related BITconfig:ID:286, bitoffs:10, length:10 +Found:Related GlobalIntVar(ButtonGraphics):1453 +Found:Related GlobalIntVar(ButtonGraphics):1454 +Found:Related GlobalIntVar(ButtonGraphics):1464 +Found:Related GlobalIntVar(ButtonGraphics):1455 +Found:Related GlobalIntVar(ButtonGraphics):1456 +Found:Related GlobalIntVar(ButtonGraphics):1457 +Found:Related GlobalIntVar(ButtonGraphics):1463 +Found:Related GlobalIntVar(ButtonGraphics):1462 +Found:Related GlobalIntVar(ButtonGraphics):1458 +Found:Related GlobalIntVar(ButtonGraphics):1459 +Found:Related GlobalIntVar(ButtonGraphics):1460 +Found:Related GlobalIntVar(ButtonGraphics):1461 +Found:Related GlobalIntVar(ButtonGraphics):1465 +Found:Related GlobalIntVar(ButtonGraphics):1466 +Found:Related GlobalIntVar(ButtonGraphics):1467 +Found:Related GlobalIntVar(ButtonGraphics):740 +Found:Related GlobalIntVar(ButtonGraphics):745 +Found:Related GlobalIntVar(ButtonGraphics):780 +Found:Related GlobalIntVar(ButtonGraphics):781 +Found:Related GlobalIntVar(ButtonGraphics):782 +Found:Related GlobalIntVar(ButtonGraphics):789 +Found:Related GlobalIntVar(ButtonGraphics):1409 +Found:Related GlobalIntVar(ButtonGraphics):1410 +Hidden child:30 +Hidden child:34 +INTERFACE:627 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:19 +INTERFACE:628 +INTERFACE:629 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:14 +Hidden child:27 +Hidden child:40 +Hidden child:53 +INTERFACE:630 +Found:Related config:856 +Found:Related config:849 +Found:Related BITconfig:ID:844, bitoffs:26, length:31 +Found:Related BITconfig:ID:848, bitoffs:0, length:5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:631 +Found:Related GlobalIntVar(ButtonGraphics):12 +Found:Related GlobalIntVar(ButtonGraphics):13 +Found:Related GlobalIntVar(ButtonGraphics):14 +Found:Related GlobalIntVar(ButtonGraphics):15 +Found:Related GlobalIntVar(ButtonGraphics):16 +Found:Related GlobalIntVar(ButtonGraphics):17 +Found:Related GlobalIntVar(ButtonGraphics):18 +Found:Related GlobalIntVar(ButtonGraphics):19 +Found:Related GlobalIntVar(ButtonGraphics):20 +Found:Related GlobalIntVar(ButtonGraphics):21 +Found:Related GlobalIntVar(ButtonGraphics):22 +Found:Related GlobalIntVar(ButtonGraphics):23 +Found:Related GlobalIntVar(ButtonGraphics):24 +Found:Related GlobalIntVar(ButtonGraphics):25 +Found:Related GlobalIntVar(ButtonGraphics):26 +Found:Related GlobalIntVar(ButtonGraphics):27 +Found:Related GlobalIntVar(ButtonGraphics):28 +Found:Related GlobalIntVar(ButtonGraphics):29 +Found:Related GlobalIntVar(ButtonGraphics):30 +Found:Related GlobalIntVar(ButtonGraphics):31 +Found:Related GlobalIntVar(ButtonGraphics):32 +Found:Related GlobalIntVar(ButtonGraphics):33 +Found:Related GlobalIntVar(ButtonGraphics):34 +Found:Related GlobalIntVar(ButtonGraphics):35 +Found:Related GlobalIntVar(ButtonGraphics):36 +Found:Related GlobalIntVar(ButtonGraphics):37 +Found:Related GlobalIntVar(ButtonGraphics):38 +Found:Related GlobalIntVar(ButtonGraphics):39 +Found:Related GlobalIntVar(ButtonGraphics):212 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1465 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1466 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1467 +Found:Indirect-related GlobalIntVar(ButtonGraphics):740 +Found:Indirect-related GlobalIntVar(ButtonGraphics):745 +Found:Indirect-related GlobalIntVar(ButtonGraphics):780 +Found:Indirect-related GlobalIntVar(ButtonGraphics):781 +Found:Indirect-related GlobalIntVar(ButtonGraphics):782 +Found:Indirect-related GlobalIntVar(ButtonGraphics):789 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1409 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1410 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1453 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1454 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1455 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1456 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1457 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1458 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1459 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1460 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1461 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1462 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1463 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1464 +Found:Indirect-related BITconfig:ID:286, bitoffs:14, length:27 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalStringVar(InfoString):274 +Found:Indirect-related config:286 +INTERFACE:632 +Found:Related GlobalStringVar(InfoString):224 +Found:Related GlobalStringVar(InfoString):225 +Found:Related GlobalStringVar(InfoString):226 +Found:Related GlobalStringVar(InfoString):227 +Found:Related GlobalStringVar(InfoString):228 +Found:Related GlobalStringVar(InfoString):229 +Found:Related GlobalStringVar(InfoString):230 +Found:Related GlobalStringVar(InfoString):231 +Found:Related GlobalStringVar(InfoString):232 +Found:Related GlobalStringVar(InfoString):233 +Found:Related GlobalStringVar(InfoString):234 +Found:Related GlobalStringVar(InfoString):235 +Found:Related GlobalStringVar(InfoString):236 +Found:Related GlobalStringVar(InfoString):237 +Found:Related GlobalStringVar(InfoString):238 +Found:Related GlobalStringVar(InfoString):239 +Found:Related GlobalStringVar(InfoString):240 +Found:Related GlobalStringVar(InfoString):241 +Found:Related GlobalStringVar(InfoString):242 +Found:Related GlobalStringVar(InfoString):243 +Found:Related GlobalStringVar(InfoString):244 +Found:Related GlobalStringVar(InfoString):245 +Found:Related GlobalStringVar(InfoString):246 +Found:Related GlobalStringVar(InfoString):247 +Found:Related GlobalStringVar(InfoString):248 +Found:Related GlobalStringVar(InfoString):249 +Found:Related GlobalStringVar(InfoString):250 +Found:Related GlobalStringVar(InfoString):251 +Found:Related GlobalStringVar(InfoString):252 +Found:Related GlobalStringVar(InfoString):253 +Found:Related GlobalStringVar(InfoString):254 +Found:Related GlobalStringVar(InfoString):255 +Found:Related GlobalStringVar(InfoString):256 +Found:Related GlobalStringVar(InfoString):257 +Found:Related GlobalStringVar(InfoString):258 +Found:Related GlobalStringVar(InfoString):259 +Found:Related GlobalStringVar(InfoString):260 +Found:Related GlobalStringVar(InfoString):261 +Found:Related GlobalStringVar(InfoString):262 +Found:Related GlobalStringVar(InfoString):263 +Found:Related GlobalStringVar(InfoString):264 +Found:Related GlobalStringVar(InfoString):265 +Found:Related GlobalStringVar(InfoString):266 +Found:Related GlobalStringVar(InfoString):267 +Found:Related GlobalStringVar(InfoString):268 +Found:Related GlobalStringVar(InfoString):269 +Found:Related GlobalStringVar(InfoString):270 +Found:Related GlobalStringVar(InfoString):271 +Found:Related GlobalStringVar(InfoString):272 +Found:Related GlobalStringVar(InfoString):273 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:633 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalStringVar(InfoString):274 +Hidden child:26 +INTERFACE:634 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalStringVar(InfoString):274 +Hidden child:27 +INTERFACE:635 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:285, bitoffs:0, length:20 +Found:Related BITconfig:ID:1561, bitoffs:0, length:4 +Found:Related BITconfig:ID:286, bitoffs:7, length:12 +Found:Related BITconfig:ID:286, bitoffs:13, length:13 +Found:Related BITconfig:ID:286, bitoffs:14, length:14 +Found:Related BITconfig:ID:286, bitoffs:15, length:15 +Found:Related BITconfig:ID:286, bitoffs:16, length:16 +Found:Related BITconfig:ID:286, bitoffs:20, length:20 +Found:Related BITconfig:ID:286, bitoffs:21, length:21 +Found:Related BITconfig:ID:286, bitoffs:22, length:22 +Found:Related BITconfig:ID:286, bitoffs:17, length:17 +Found:Related BITconfig:ID:286, bitoffs:18, length:18 +Found:Related BITconfig:ID:286, bitoffs:19, length:19 +Found:Related BITconfig:ID:1561, bitoffs:5, length:7 +Found:Related config:1105 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +INTERFACE:636 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:13 +Hidden child:25 +Hidden child:42 +Hidden child:56 +INTERFACE:637 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalStringVar(InfoString):274 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1465 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1466 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1467 +Found:Indirect-related GlobalIntVar(ButtonGraphics):740 +Found:Indirect-related GlobalIntVar(ButtonGraphics):745 +Found:Indirect-related GlobalIntVar(ButtonGraphics):780 +Found:Indirect-related GlobalIntVar(ButtonGraphics):781 +Found:Indirect-related GlobalIntVar(ButtonGraphics):782 +Found:Indirect-related GlobalIntVar(ButtonGraphics):789 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1409 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1410 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1453 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1454 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1455 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1456 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1457 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1458 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1459 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1460 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1461 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1462 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1463 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1464 +Found:Indirect-related config:286 +Found:Indirect-related BITconfig:ID:286, bitoffs:14, length:27 +INTERFACE:638 +INTERFACE:639 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:286, bitoffs:14, length:27 +Found:Related BITconfig:ID:286, bitoffs:9, length:9 +Found:Related BITconfig:ID:286, bitoffs:0, length:0 +Found:Related BITconfig:ID:286, bitoffs:1, length:1 +Found:Related BITconfig:ID:286, bitoffs:28, length:28 +Found:Related BITconfig:ID:286, bitoffs:4, length:4 +Found:Related BITconfig:ID:286, bitoffs:5, length:5 +Found:Related BITconfig:ID:286, bitoffs:6, length:6 +Found:Related BITconfig:ID:286, bitoffs:13, length:13 +Found:Related BITconfig:ID:286, bitoffs:12, length:12 +Found:Related BITconfig:ID:286, bitoffs:7, length:7 +Found:Related BITconfig:ID:286, bitoffs:8, length:8 +Found:Related BITconfig:ID:286, bitoffs:10, length:10 +Found:Related GlobalIntVar(ButtonGraphics):1453 +Found:Related GlobalIntVar(ButtonGraphics):1454 +Found:Related GlobalIntVar(ButtonGraphics):1464 +Found:Related GlobalIntVar(ButtonGraphics):1455 +Found:Related GlobalIntVar(ButtonGraphics):1456 +Found:Related GlobalIntVar(ButtonGraphics):1457 +Found:Related GlobalIntVar(ButtonGraphics):1463 +Found:Related GlobalIntVar(ButtonGraphics):1462 +Found:Related GlobalIntVar(ButtonGraphics):1458 +Found:Related GlobalIntVar(ButtonGraphics):1459 +Found:Related GlobalIntVar(ButtonGraphics):1460 +Found:Related GlobalIntVar(ButtonGraphics):1461 +Found:Related GlobalIntVar(ButtonGraphics):1465 +Found:Related GlobalIntVar(ButtonGraphics):1466 +Found:Related GlobalIntVar(ButtonGraphics):1467 +Found:Related GlobalIntVar(ButtonGraphics):740 +Found:Related GlobalIntVar(ButtonGraphics):745 +Found:Related GlobalIntVar(ButtonGraphics):780 +Found:Related GlobalIntVar(ButtonGraphics):781 +Found:Related GlobalIntVar(ButtonGraphics):782 +Found:Related GlobalIntVar(ButtonGraphics):789 +Found:Related GlobalIntVar(ButtonGraphics):1409 +Found:Related GlobalIntVar(ButtonGraphics):1410 +Hidden child:18 +Hidden child:22 +INTERFACE:640 +Found:Related BITconfig:ID:283, bitoffs:26, length:29 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:641 +Found:Related config:1105 +Found:Related GlobalStringVar(InfoString):274 +Found:Related BITconfig:ID:286, bitoffs:7, length:12 +Found:Related BITconfig:ID:286, bitoffs:13, length:13 +Found:Related BITconfig:ID:286, bitoffs:14, length:14 +Found:Related BITconfig:ID:286, bitoffs:15, length:15 +Found:Related BITconfig:ID:286, bitoffs:16, length:16 +Found:Related BITconfig:ID:286, bitoffs:20, length:20 +Found:Related BITconfig:ID:286, bitoffs:21, length:21 +Found:Related BITconfig:ID:286, bitoffs:22, length:22 +Found:Related BITconfig:ID:286, bitoffs:17, length:17 +Found:Related BITconfig:ID:286, bitoffs:18, length:18 +Found:Related BITconfig:ID:286, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:37 +INTERFACE:642 +Found:Related config:2243 +Found:Related config:2244 +Found:Related config:2245 +Hidden child:16 +Hidden child:19 +Hidden child:20 +Hidden child:22 +Hidden child:23 +Hidden child:57 +Hidden child:70 +Hidden child:81 +Hidden child:94 +Hidden child:113 +Hidden child:122 +Hidden child:139 +Hidden child:146 +Hidden child:149 +Hidden child:150 +Hidden child:151 +Hidden child:159 +Hidden child:193 +Hidden child:194 +Hidden child:202 +INTERFACE:643 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:644 +INTERFACE:645 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:646 +INTERFACE:647 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:648 +INTERFACE:649 +Found:Related GlobalIntVar(ButtonGraphics):269 +INTERFACE:650 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:651 +INTERFACE:652 +Found:Indirect-related BITconfig:ID:1146, bitoffs:0, length:4 +Found:Related BITconfig:ID:1146, bitoffs:5, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:653 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalStringVar(InfoString):184 +Found:Related GlobalStringVar(InfoString):185 +Found:Related GlobalStringVar(InfoString):186 +Found:Related GlobalStringVar(InfoString):187 +Found:Related GlobalStringVar(InfoString):188 +Found:Related GlobalStringVar(InfoString):189 +Found:Related BITconfig:ID:1452, bitoffs:0, length:19 +INTERFACE:654 +Found:Related GlobalIntVar(ButtonGraphics):852 +Found:Related GlobalIntVar(ButtonGraphics):853 +Found:Related GlobalIntVar(ButtonGraphics):854 +Found:Related GlobalIntVar(ButtonGraphics):855 +Found:Related GlobalIntVar(ButtonGraphics):856 +Found:Related GlobalIntVar(ButtonGraphics):847 +Found:Related GlobalIntVar(ButtonGraphics):848 +Found:Related GlobalIntVar(ButtonGraphics):849 +Found:Related GlobalIntVar(ButtonGraphics):850 +Found:Related GlobalIntVar(ButtonGraphics):851 +Found:Related GlobalIntVar(ButtonGraphics):839 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1451, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:1451, bitoffs:9, length:11 +Found:Indirect-related BITconfig:ID:1451, bitoffs:12, length:14 +Found:Indirect-related BITconfig:ID:1451, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1451, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:1445, bitoffs:0, length:18 +INTERFACE:655 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1444, bitoffs:3, length:7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):838 +Found:Indirect-related GlobalIntVar(ButtonGraphics):882 +Found:Indirect-related GlobalIntVar(ButtonGraphics):887 +Found:Indirect-related GlobalIntVar(ButtonGraphics):892 +Found:Indirect-related GlobalIntVar(ButtonGraphics):897 +INTERFACE:656 +INTERFACE:657 +Found:Indirect-related GlobalIntVar(ButtonGraphics):840 +Found:Indirect-related config:1447 +Found:Related GlobalIntVar(ButtonGraphics):839 +Found:Related BITconfig:ID:1445, bitoffs:0, length:18 +Found:Related BITconfig:ID:1455, bitoffs:0, length:14 +INTERFACE:658 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:53 +INTERFACE:659 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:660 +INTERFACE:661 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:662 +Found:Indirect-related BITconfig:ID:1493, bitoffs:0, length:3 +Found:Related config:1174 +Found:Related config:448 +Found:Related BITconfig:ID:1160, bitoffs:25, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related config:1177 +Found:Related BITconfig:ID:1176, bitoffs:7, length:31 +Found:Related BITconfig:ID:1176, bitoffs:6, length:6 +Found:Related BITconfig:ID:1175, bitoffs:9, length:16 +Found:Related BITconfig:ID:1175, bitoffs:1, length:8 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalStringVar(InfoString):204 +Found:Indirect-related GlobalStringVar(InfoString):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1436 +Found:Indirect-related BITconfig:ID:1175, bitoffs:23, length:27 +Found:Indirect-related BITconfig:ID:1209, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1331, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1334 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1335 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1402 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1403 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1235 +Hidden child:71 +Hidden child:72 +INTERFACE:663 +Found:Indirect-related BITconfig:ID:569, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:569, bitoffs:5, length:9 +Found:Indirect-related BITconfig:ID:569, bitoffs:10, length:14 +Found:Indirect-related BITconfig:ID:569, bitoffs:15, length:19 +Found:Indirect-related BITconfig:ID:569, bitoffs:20, length:24 +Found:Indirect-related BITconfig:ID:569, bitoffs:25, length:29 +Found:Related config:1174 +Found:Related config:448 +Found:Related BITconfig:ID:569, bitoffs:30, length:30 +Found:Related BITconfig:ID:1160, bitoffs:25, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:1175, bitoffs:9, length:16 +Found:Related BITconfig:ID:1175, bitoffs:1, length:8 +INTERFACE:664 +Hidden child:25 +Hidden child:37 +Hidden child:56 +INTERFACE:665 +INTERFACE:666 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related config:448 +INTERFACE:667 +Found:Indirect-related GlobalIntVar(ButtonGraphics):779 +Found:Indirect-related GlobalStringVar(InfoString):321 +Found:Indirect-related GlobalStringVar(InfoString):322 +Found:Indirect-related GlobalStringVar(InfoString):323 +Found:Indirect-related GlobalStringVar(InfoString):324 +Found:Indirect-related GlobalStringVar(InfoString):325 +Found:Related BITconfig:ID:1248, bitoffs:31, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related config:287 +Found:Indirect-related config:1054 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Hidden child:49 +Hidden child:52 +INTERFACE:668 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:669 +Hidden child:13 +INTERFACE:670 +Hidden child:1 +INTERFACE:671 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:672 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related config:448 +INTERFACE:673 +Found:Related GlobalIntVar(ButtonGraphics):1411 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1100 +Found:Indirect-related GlobalIntVar(ButtonGraphics):547 +Found:Indirect-related GlobalIntVar(ButtonGraphics):174 +Found:Indirect-related GlobalIntVar(ButtonGraphics):200 +Found:Indirect-related GlobalIntVar(ButtonGraphics):201 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1089 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1092 +Found:Indirect-related GlobalIntVar(ButtonGraphics):175 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1090 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1091 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1099 +Found:Indirect-related GlobalStringVar(InfoString):122 +Found:Indirect-related GlobalStringVar(InfoString):32 +Found:Indirect-related GlobalStringVar(InfoString):124 +Found:Indirect-related GlobalStringVar(InfoString):33 +Found:Indirect-related GlobalStringVar(InfoString):125 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1277 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1240 +Found:Indirect-related GlobalIntVar(ButtonGraphics):986 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1407 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1408 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1101 +Found:Indirect-related GlobalStringVar(InfoString):326 +Found:Indirect-related GlobalStringVar(InfoString):123 +Found:Indirect-related GlobalStringVar(InfoString):327 +Found:Indirect-related GlobalStringVar(InfoString):328 +Found:Indirect-related GlobalStringVar(InfoString):329 +Found:Indirect-related GlobalIntVar(ButtonGraphics):987 +Found:Indirect-related GlobalIntVar(ButtonGraphics):178 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1414 +Hidden child:31 +Hidden child:58 +Hidden child:79 +Hidden child:82 +Hidden child:89 +Hidden child:92 +Hidden child:99 +Hidden child:101 +Hidden child:118 +Hidden child:121 +Hidden child:125 +Hidden child:127 +Hidden child:137 +Hidden child:138 +Hidden child:139 +Hidden child:140 +Hidden child:141 +INTERFACE:674 +Found:Related GlobalIntVar(ButtonGraphics):737 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:5 +Hidden child:11 +Hidden child:18 +INTERFACE:675 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:676 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:677 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:678 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:679 +Found:Related GlobalIntVar(ButtonGraphics):1031 +Found:Indirect-related BITconfig:ID:1560, bitoffs:14, length:14 +INTERFACE:680 +Found:Related GlobalIntVar(ButtonGraphics):217 +Found:Related GlobalIntVar(ButtonGraphics):216 +Found:Related GlobalIntVar(ButtonGraphics):215 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:681 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:9 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +Hidden child:32 +Hidden child:33 +Hidden child:34 +Hidden child:35 +Hidden child:37 +Hidden child:38 +Hidden child:39 +Hidden child:40 +Hidden child:41 +Hidden child:42 +Hidden child:43 +Hidden child:44 +Hidden child:45 +Hidden child:46 +Hidden child:47 +Hidden child:48 +Hidden child:49 +Hidden child:50 +Hidden child:51 +Hidden child:52 +Hidden child:53 +Hidden child:54 +Hidden child:55 +Hidden child:107 +Hidden child:108 +Hidden child:109 +INTERFACE:682 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:29 +Hidden child:31 +INTERFACE:683 +Found:Related BITconfig:ID:1190, bitoffs:7, length:10 +Found:Indirect-related BITconfig:ID:1190, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1190, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1190, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1191, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1191, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1192, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1192, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1192, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1192, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1193, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1193, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1190, bitoffs:12, length:15 +Found:Indirect-related BITconfig:ID:1190, bitoffs:23, length:26 +Found:Indirect-related BITconfig:ID:1191, bitoffs:2, length:5 +Found:Indirect-related BITconfig:ID:1191, bitoffs:13, length:16 +Found:Indirect-related BITconfig:ID:1191, bitoffs:24, length:27 +Found:Indirect-related BITconfig:ID:1192, bitoffs:3, length:6 +Found:Indirect-related BITconfig:ID:1192, bitoffs:14, length:17 +Found:Indirect-related BITconfig:ID:1192, bitoffs:25, length:28 +Found:Indirect-related BITconfig:ID:1193, bitoffs:4, length:7 +Found:Indirect-related BITconfig:ID:1193, bitoffs:15, length:18 +Found:Indirect-related BITconfig:ID:1190, bitoffs:16, length:19 +Found:Indirect-related BITconfig:ID:1190, bitoffs:27, length:30 +Found:Indirect-related BITconfig:ID:1191, bitoffs:6, length:9 +Found:Indirect-related BITconfig:ID:1191, bitoffs:17, length:20 +Found:Indirect-related BITconfig:ID:1191, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1192, bitoffs:7, length:10 +Found:Indirect-related BITconfig:ID:1192, bitoffs:18, length:21 +Found:Indirect-related BITconfig:ID:1193, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1193, bitoffs:8, length:11 +Found:Indirect-related BITconfig:ID:1193, bitoffs:19, length:22 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +Hidden child:32 +Hidden child:33 +Hidden child:43 +INTERFACE:684 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:685 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:686 +Found:Indirect-related BITconfig:ID:1195, bitoffs:6, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:7 +Hidden child:9 +INTERFACE:687 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:688 +Found:Related BITconfig:ID:1195, bitoffs:6, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:689 +Found:Related BITconfig:ID:1195, bitoffs:6, length:31 +INTERFACE:690 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:691 +INTERFACE:692 +INTERFACE:693 +INTERFACE:694 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:15 +Hidden child:16 +Hidden child:40 +INTERFACE:695 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:696 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:20 +Hidden child:31 +Hidden child:34 +INTERFACE:697 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:26 +Hidden child:37 +Hidden child:40 +Hidden child:43 +INTERFACE:698 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:699 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:20 +Hidden child:31 +Hidden child:34 +INTERFACE:700 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:701 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:702 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:703 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:704 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:26 +Hidden child:37 +Hidden child:40 +Hidden child:43 +INTERFACE:705 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:26 +Hidden child:37 +Hidden child:40 +Hidden child:43 +INTERFACE:706 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:707 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:20 +Hidden child:31 +Hidden child:35 +INTERFACE:708 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:29 +Hidden child:40 +Hidden child:43 +INTERFACE:709 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:18 +INTERFACE:710 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:20 +Hidden child:31 +Hidden child:34 +INTERFACE:711 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:712 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:6 +INTERFACE:713 +INTERFACE:714 +Hidden child:0 +Hidden child:2 +Hidden child:4 +Hidden child:6 +INTERFACE:715 +Found:Related BITconfig:ID:1010, bitoffs:0, length:10 +Found:Related BITconfig:ID:2250, bitoffs:4, length:20 +INTERFACE:716 +Found:Related GlobalIntVar(ButtonGraphics):116 +Found:Related GlobalIntVar(ButtonGraphics):117 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:39 +INTERFACE:717 +Found:Indirect-related BITconfig:ID:1201, bitoffs:22, length:25 +Found:Indirect-related BITconfig:ID:1201, bitoffs:18, length:21 +Found:Related BITconfig:ID:1205, bitoffs:18, length:22 +Found:Related BITconfig:ID:1205, bitoffs:0, length:7 +Found:Related GlobalIntVar(ButtonGraphics):111 +Found:Related GlobalIntVar(ButtonGraphics):112 +Found:Related GlobalIntVar(ButtonGraphics):114 +Found:Related GlobalIntVar(ButtonGraphics):113 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:21 +Hidden child:33 +Hidden child:35 +INTERFACE:718 +INTERFACE:719 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:720 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:721 +Found:Related BITconfig:ID:1201, bitoffs:28, length:28 +Found:Related GlobalIntVar(ButtonGraphics):118 +INTERFACE:722 +INTERFACE:723 +Found:Related BITconfig:ID:1407, bitoffs:0, length:9 +Found:Related BITconfig:ID:1415, bitoffs:0, length:5 +Found:Related BITconfig:ID:1475, bitoffs:0, length:7 +Found:Related BITconfig:ID:1577, bitoffs:0, length:6 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:724 +INTERFACE:725 +Found:Indirect-related GlobalIntVar(ButtonGraphics):783 +Found:Related GlobalIntVar(ButtonGraphics):785 +Found:Related GlobalIntVar(ButtonGraphics):784 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:86 +INTERFACE:726 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +Hidden child:32 +Hidden child:33 +Hidden child:34 +Hidden child:35 +Hidden child:36 +Hidden child:37 +Hidden child:38 +Hidden child:39 +Hidden child:40 +Hidden child:41 +Hidden child:42 +Hidden child:43 +Hidden child:44 +Hidden child:45 +Hidden child:47 +Hidden child:48 +Hidden child:49 +Hidden child:50 +Hidden child:51 +Hidden child:52 +Hidden child:53 +Hidden child:54 +Hidden child:55 +Hidden child:56 +Hidden child:57 +Hidden child:58 +Hidden child:59 +Hidden child:60 +Hidden child:61 +Hidden child:62 +Hidden child:63 +Hidden child:64 +Hidden child:65 +Hidden child:66 +Hidden child:67 +Hidden child:68 +Hidden child:69 +Hidden child:70 +Hidden child:71 +INTERFACE:727 +Hidden child:13 +Hidden child:15 +INTERFACE:728 +Found:Indirect-related GlobalIntVar(ButtonGraphics):779 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1014 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1018 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:8 +Hidden child:13 +INTERFACE:729 +Found:Indirect-related GlobalIntVar(ButtonGraphics):779 +Found:Indirect-related GlobalIntVar(ButtonGraphics):778 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1010 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1016 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1011 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1012 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1013 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1017 +Found:Related BITconfig:ID:1057, bitoffs:23, length:24 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:13 +Hidden child:18 +INTERFACE:730 +Found:Related BITconfig:ID:1209, bitoffs:6, length:7 +Found:Related GlobalStringVar(InfoString):217 +Found:Related BITconfig:ID:1215, bitoffs:0, length:9 +Hidden child:20 +INTERFACE:731 +INTERFACE:732 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:733 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:734 +Found:Related BITconfig:ID:816, bitoffs:0, length:2 +Found:Related BITconfig:ID:816, bitoffs:3, length:5 +Found:Related BITconfig:ID:816, bitoffs:6, length:8 +Found:Related GlobalIntVar(ButtonGraphics):122 +Found:Related GlobalIntVar(ButtonGraphics):123 +Found:Related GlobalIntVar(ButtonGraphics):124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):125 +Found:Related GlobalIntVar(ButtonGraphics):156 +Found:Related GlobalIntVar(ButtonGraphics):157 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:22 +INTERFACE:735 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Related BITconfig:ID:816, bitoffs:19, length:20 +INTERFACE:736 +INTERFACE:737 +INTERFACE:738 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:739 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:740 +Found:Related BITconfig:ID:1179, bitoffs:26, length:31 +INTERFACE:741 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1230, bitoffs:3, length:8 +Found:Indirect-related BITconfig:ID:1230, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1230, bitoffs:27, length:31 +Found:Indirect-related BITconfig:ID:1230, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1230, bitoffs:23, length:26 +Found:Indirect-related BITconfig:ID:1230, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1469 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1470 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1471 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1472 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1473 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1474 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1475 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1476 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1477 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1478 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1479 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1480 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1481 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1482 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1483 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1484 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1485 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1486 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1487 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1488 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1489 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1490 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1491 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1492 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1493 +Found:Indirect-related config:122 +Found:Indirect-related config:293 +Found:Indirect-related config:655 +Found:Indirect-related config:399 +Found:Indirect-related config:131 +Found:Indirect-related config:335 +Found:Indirect-related config:299 +Found:Indirect-related config:148 +Found:Indirect-related config:11 +Found:Indirect-related config:347 +Found:Indirect-related config:150 +Found:Indirect-related config:382 +Found:Indirect-related config:188 +Found:Indirect-related config:175 +Found:Indirect-related config:139 +Found:Indirect-related config:147 +Found:Indirect-related config:517 +Found:Indirect-related config:387 +Found:Indirect-related config:307 +Found:Indirect-related config:416 +Found:Indirect-related config:328 +Found:Indirect-related config:76 +Found:Indirect-related config:159 +Found:Indirect-related config:339 +Found:Indirect-related config:116 +Found:Indirect-related config:320 +Found:Indirect-related config:26 +Found:Indirect-related config:197 +Found:Indirect-related config:200 +Found:Indirect-related config:385 +Found:Indirect-related config:317 +Found:Indirect-related config:161 +Found:Indirect-related config:212 +Found:Indirect-related config:5 +Found:Indirect-related config:980 +Found:Indirect-related config:600 +Found:Indirect-related BITconfig:ID:997, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:433, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:869, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:440, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:622, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:934, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:641, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:810, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:521, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:553, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:408, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:482, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:437, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:635, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:351, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:705, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:465, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:823, bitoffs:0, length:19 +Found:Indirect-related BITconfig:ID:604, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:435, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:423, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:905, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:730, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:602, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:616, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:723, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:449, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:844, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:794, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:939, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:896, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:912, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:874, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:968, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:970, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:977, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:992, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:994, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1016, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1049, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1063, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1077, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1094, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:678, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:683, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:683, bitoffs:12, length:15 +Found:Indirect-related BITconfig:ID:680, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:684, bitoffs:3, length:10 +Found:Indirect-related BITconfig:ID:685, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1184, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1204, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1190, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1165, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1218, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1227, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1225, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1232, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1236, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1271, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1282, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1306, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1311, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1330, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1370, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1390, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1403, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1407, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1415, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1420, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1498, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:1558, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1577, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1588, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1600, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1610, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1811, bitoffs:11, length:14 +Found:Indirect-related BITconfig:ID:1811, bitoffs:15, length:16 +Found:Indirect-related BITconfig:ID:1811, bitoffs:17, length:21 +Found:Indirect-related BITconfig:ID:1819, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1834, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1844, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1849, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1861, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1906, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2037, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2046, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:2051, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2079, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2208, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2234, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2376, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2217, bitoffs:0, length:8 +INTERFACE:742 +Found:Indirect-related GlobalIntVar(ButtonGraphics):178 +Hidden child:20 +INTERFACE:743 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:744 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1394 +Found:Indirect-related GlobalIntVar(ButtonGraphics):996 +Found:Indirect-related GlobalIntVar(ButtonGraphics):997 +Found:Indirect-related GlobalIntVar(ButtonGraphics):998 +Found:Indirect-related GlobalIntVar(ButtonGraphics):999 +Found:Indirect-related GlobalIntVar(ButtonGraphics):176 +Found:Indirect-related GlobalIntVar(ButtonGraphics):547 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1093 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1090 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1091 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1240 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1273 +Found:Indirect-related GlobalStringVar(InfoString):32 +Found:Indirect-related GlobalStringVar(InfoString):33 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1414 +Found:Indirect-related GlobalIntVar(ButtonGraphics):994 +Found:Indirect-related GlobalIntVar(ButtonGraphics):986 +Found:Indirect-related GlobalIntVar(ButtonGraphics):177 +Found:Indirect-related GlobalIntVar(ButtonGraphics):987 +Found:Indirect-related GlobalIntVar(ButtonGraphics):175 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):174 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1099 +Found:Indirect-related GlobalStringVar(InfoString):122 +Found:Indirect-related GlobalStringVar(InfoString):124 +Found:Indirect-related GlobalStringVar(InfoString):125 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1277 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1089 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1411 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1407 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1408 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1101 +Found:Indirect-related GlobalStringVar(InfoString):326 +Found:Indirect-related GlobalStringVar(InfoString):123 +Found:Indirect-related GlobalStringVar(InfoString):327 +Found:Indirect-related GlobalStringVar(InfoString):328 +Found:Indirect-related GlobalStringVar(InfoString):329 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1100 +Found:Indirect-related GlobalIntVar(ButtonGraphics):200 +Found:Indirect-related GlobalIntVar(ButtonGraphics):201 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1092 +Found:Indirect-related GlobalIntVar(ButtonGraphics):178 +Found:Indirect-related GlobalIntVar(ButtonGraphics):533 +Found:Indirect-related GlobalIntVar(ButtonGraphics):523 +Found:Indirect-related GlobalIntVar(ButtonGraphics):534 +Found:Indirect-related GlobalIntVar(ButtonGraphics):524 +Found:Indirect-related GlobalIntVar(ButtonGraphics):535 +Found:Indirect-related GlobalIntVar(ButtonGraphics):525 +Found:Indirect-related GlobalIntVar(ButtonGraphics):536 +Found:Indirect-related GlobalIntVar(ButtonGraphics):526 +Found:Indirect-related GlobalIntVar(ButtonGraphics):537 +Found:Indirect-related GlobalIntVar(ButtonGraphics):527 +Found:Indirect-related GlobalIntVar(ButtonGraphics):538 +Found:Indirect-related GlobalIntVar(ButtonGraphics):528 +Found:Indirect-related GlobalIntVar(ButtonGraphics):539 +Found:Indirect-related GlobalIntVar(ButtonGraphics):529 +Found:Indirect-related GlobalIntVar(ButtonGraphics):540 +Found:Indirect-related GlobalIntVar(ButtonGraphics):530 +Found:Indirect-related GlobalIntVar(ButtonGraphics):541 +Found:Indirect-related GlobalIntVar(ButtonGraphics):531 +Found:Indirect-related GlobalIntVar(ButtonGraphics):542 +Found:Indirect-related GlobalIntVar(ButtonGraphics):532 +Hidden child:18 +Hidden child:20 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:48 +Hidden child:49 +Hidden child:50 +Hidden child:51 +Hidden child:52 +Hidden child:77 +Hidden child:85 +Hidden child:86 +Hidden child:87 +Hidden child:88 +Hidden child:89 +Hidden child:90 +Hidden child:91 +Hidden child:92 +Hidden child:93 +Hidden child:94 +Hidden child:95 +Hidden child:103 +Hidden child:104 +Hidden child:117 +Hidden child:118 +Hidden child:119 +Hidden child:120 +Hidden child:121 +Hidden child:122 +Hidden child:123 +Hidden child:124 +INTERFACE:745 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related GlobalIntVar(ButtonGraphics):616 +Found:Related GlobalIntVar(ButtonGraphics):1 +Found:Related config:1414 +Found:Related GlobalIntVar(ButtonGraphics):548 +Hidden child:1 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +INTERFACE:746 +Found:Related GlobalIntVar(ButtonGraphics):173 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:1255, bitoffs:0, length:1 +Found:Related config:1241 +Found:Related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1021, bitoffs:0, length:4 +Found:Indirect-related GlobalIntVar(ButtonGraphics):232 +Found:Indirect-related GlobalIntVar(ButtonGraphics):822 +Found:Indirect-related GlobalIntVar(ButtonGraphics):233 +Found:Indirect-related GlobalIntVar(ButtonGraphics):234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):235 +Found:Indirect-related GlobalIntVar(ButtonGraphics):236 +Found:Indirect-related GlobalIntVar(ButtonGraphics):237 +Found:Indirect-related GlobalIntVar(ButtonGraphics):238 +Found:Indirect-related GlobalIntVar(ButtonGraphics):823 +Found:Indirect-related GlobalIntVar(ButtonGraphics):240 +Found:Indirect-related GlobalIntVar(ButtonGraphics):241 +Found:Indirect-related GlobalIntVar(ButtonGraphics):242 +Found:Indirect-related GlobalIntVar(ButtonGraphics):243 +Found:Indirect-related GlobalIntVar(ButtonGraphics):244 +Found:Indirect-related GlobalIntVar(ButtonGraphics):245 +Found:Indirect-related GlobalIntVar(ButtonGraphics):824 +Found:Related GlobalIntVar(ButtonGraphics):10 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1034 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1027 +Found:Indirect-related GlobalStringVar(InfoString):202 +Found:Related GlobalIntVar(ButtonGraphics):814 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related GlobalIntVar(ButtonGraphics):616 +Found:Related GlobalIntVar(ButtonGraphics):1 +Found:Related config:1159 +Found:Related BITconfig:ID:638, bitoffs:30, length:31 +Found:Indirect-related config:2044 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1243 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1244 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1245 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1246 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1247 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1248 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1249 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1250 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1251 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1252 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1253 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1254 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1255 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1256 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1257 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1258 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1259 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1260 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1261 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1262 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1263 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1264 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1265 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1266 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1267 +Found:Related config:1801 +Found:Related GlobalIntVar(ButtonGraphics):1602 +Found:Indirect-related BITconfig:ID:1644, bitoffs:0, length:0 +Found:Indirect-related config:1878 +Found:Indirect-related BITconfig:ID:1644, bitoffs:1, length:31 +Hidden child:15 +Hidden child:30 +Hidden child:76 +Hidden child:80 +Hidden child:81 +Hidden child:85 +Hidden child:87 +Hidden child:89 +Hidden child:90 +Hidden child:91 +Hidden child:92 +Hidden child:94 +Hidden child:95 +Hidden child:96 +Hidden child:97 +Hidden child:98 +Hidden child:99 +Hidden child:100 +Hidden child:101 +Hidden child:102 +Hidden child:103 +Hidden child:104 +Hidden child:105 +Hidden child:106 +Hidden child:107 +Hidden child:167 +Hidden child:168 +Hidden child:183 +Hidden child:184 +Hidden child:186 +Hidden child:202 +Hidden child:216 +Hidden child:227 +Hidden child:229 +Hidden child:241 +Hidden child:244 +INTERFACE:747 +Found:Indirect-related BITconfig:ID:2382, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:1493, bitoffs:0, length:3 +Found:Related config:1174 +Found:Related config:448 +Found:Related BITconfig:ID:1160, bitoffs:25, length:31 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Related GlobalIntVar(ButtonGraphics):10 +Found:Related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related GlobalStringVar(InfoString):204 +Found:Indirect-related GlobalStringVar(InfoString):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1436 +Found:Indirect-related BITconfig:ID:1175, bitoffs:23, length:27 +Found:Indirect-related BITconfig:ID:1209, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1331, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1334 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1335 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1402 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1403 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1235 +Hidden child:8 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:26 +INTERFACE:748 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1533 +Found:Related config:102 +Found:Related config:456 +Found:Related BITconfig:ID:1240, bitoffs:1, length:15 +Found:Indirect-related config:281 +Found:Indirect-related config:1647 +Found:Indirect-related BITconfig:ID:1510, bitoffs:5, length:13 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1025 +Found:Indirect-related GlobalIntVar(ButtonGraphics):94 +Found:Related GlobalIntVar(ButtonGraphics):615 +INTERFACE:749 +Found:Indirect-related BITconfig:ID:2382, bitoffs:0, length:14 +Found:Related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Related GlobalIntVar(ButtonGraphics):181 +Found:Related config:1397 +INTERFACE:750 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Related config:173 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:2382, bitoffs:0, length:14 +INTERFACE:751 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Related GlobalStringVar(InfoString):24 +INTERFACE:752 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Hidden child:3 +Hidden child:6 +Hidden child:7 +INTERFACE:753 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +Hidden child:32 +Hidden child:33 +Hidden child:35 +INTERFACE:754 +INTERFACE:755 +Found:Indirect-related config:281 +Found:Indirect-related GlobalIntVar(ButtonGraphics):172 +Found:Related BITconfig:ID:463, bitoffs:0, length:1 +Found:Related BITconfig:ID:463, bitoffs:3, length:3 +Found:Related GlobalIntVar(ButtonGraphics):622 +Found:Related GlobalStringVar(InfoString):31 +Found:Indirect-related config:1159 +Found:Indirect-related BITconfig:ID:463, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:463, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:463, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):623 +Found:Indirect-related GlobalIntVar(ButtonGraphics):624 +Found:Indirect-related GlobalIntVar(ButtonGraphics):625 +Found:Indirect-related GlobalIntVar(ButtonGraphics):626 +Found:Indirect-related GlobalIntVar(ButtonGraphics):627 +Found:Indirect-related GlobalIntVar(ButtonGraphics):628 +Found:Indirect-related GlobalIntVar(ButtonGraphics):629 +Found:Indirect-related GlobalIntVar(ButtonGraphics):630 +Found:Indirect-related GlobalIntVar(ButtonGraphics):940 +Found:Indirect-related GlobalIntVar(ButtonGraphics):941 +Found:Indirect-related GlobalIntVar(ButtonGraphics):674 +Found:Related GlobalStringVar(InfoString):53 +Found:Related GlobalStringVar(InfoString):54 +Found:Related GlobalStringVar(InfoString):55 +Found:Related GlobalStringVar(InfoString):56 +Found:Related GlobalStringVar(InfoString):190 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:31 +Hidden child:45 +INTERFACE:756 +Found:Indirect-related BITconfig:ID:355, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:355, bitoffs:2, length:5 +Found:Indirect-related BITconfig:ID:356, bitoffs:15, length:15 +Found:Related BITconfig:ID:1431, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:4 +Hidden child:6 +Hidden child:8 +INTERFACE:757 +INTERFACE:758 +INTERFACE:759 +Found:Indirect-related BITconfig:ID:563, bitoffs:0, length:2 +INTERFACE:760 +INTERFACE:761 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1255, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1253, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1253, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1253, bitoffs:11, length:15 +Found:Indirect-related BITconfig:ID:1253, bitoffs:16, length:20 +Found:Indirect-related BITconfig:ID:1254, bitoffs:12, length:16 +Found:Indirect-related BITconfig:ID:1254, bitoffs:17, length:21 +INTERFACE:762 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related config:304 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):188 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalStringVar(InfoString):138 +Found:Related GlobalIntVar(ButtonGraphics):190 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1246, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1246, bitoffs:10, length:19 +Found:Indirect-related BITconfig:ID:1246, bitoffs:20, length:29 +Found:Indirect-related BITconfig:ID:1247, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1247, bitoffs:10, length:19 +Found:Indirect-related BITconfig:ID:1247, bitoffs:20, length:29 +Found:Indirect-related BITconfig:ID:1248, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1248, bitoffs:10, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1029 +Found:Indirect-related GlobalStringVar(InfoString):22 +Found:Indirect-related config:115 +Found:Related GlobalIntVar(ButtonGraphics):169 +Found:Indirect-related config:1249 +Hidden child:22 +Hidden child:23 +Hidden child:40 +Hidden child:41 +Hidden child:42 +Hidden child:46 +Hidden child:74 +Hidden child:75 +Hidden child:84 +Hidden child:85 +Hidden child:86 +Hidden child:87 +Hidden child:88 +Hidden child:89 +Hidden child:90 +Hidden child:91 +Hidden child:92 +Hidden child:115 +Hidden child:116 +INTERFACE:763 +Found:Indirect-related config:1249 +Found:Indirect-related GlobalIntVar(ButtonGraphics):96 +Found:Indirect-related GlobalIntVar(ButtonGraphics):95 +Hidden child:1 +Hidden child:3 +INTERFACE:764 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:765 +Found:Related BITconfig:ID:1420, bitoffs:0, length:7 +Found:Related BITconfig:ID:1422, bitoffs:8, length:11 +Found:Related GlobalIntVar(ButtonGraphics):806 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalIntVar(ButtonGraphics):805 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:4 +Hidden child:6 +Hidden child:7 +Hidden child:19 +INTERFACE:766 +Found:Related BITconfig:ID:1554, bitoffs:31, length:31 +Found:Related BITconfig:ID:1554, bitoffs:0, length:5 +Found:Related BITconfig:ID:1553, bitoffs:0, length:3 +Found:Related BITconfig:ID:1554, bitoffs:6, length:11 +Found:Related BITconfig:ID:1553, bitoffs:4, length:7 +Found:Related BITconfig:ID:1554, bitoffs:12, length:18 +Found:Related BITconfig:ID:1553, bitoffs:8, length:11 +Found:Related BITconfig:ID:1554, bitoffs:19, length:24 +Found:Related BITconfig:ID:1553, bitoffs:12, length:15 +Found:Related BITconfig:ID:1554, bitoffs:25, length:30 +Found:Related BITconfig:ID:1553, bitoffs:16, length:19 +Found:Related BITconfig:ID:1555, bitoffs:0, length:5 +Found:Related BITconfig:ID:1553, bitoffs:20, length:23 +Hidden child:45 +Hidden child:55 +Hidden child:65 +Hidden child:75 +Hidden child:85 +Hidden child:95 +INTERFACE:767 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1038 +Found:Indirect-related GlobalIntVar(ButtonGraphics):192 +Found:Indirect-related BITconfig:ID:638, bitoffs:17, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1324 +Hidden child:26 +Hidden child:34 +Hidden child:45 +Hidden child:46 +Hidden child:47 +Hidden child:76 +INTERFACE:768 +Found:Related config:354 +Found:Related config:353 +Found:Related config:648 +Found:Related config:649 +Found:Related GlobalIntVar(ButtonGraphics):808 +Hidden child:1 +Hidden child:2 +Hidden child:3 +Hidden child:4 +INTERFACE:769 +Found:Related GlobalStringVar(InfoString):130 +Found:Related GlobalStringVar(InfoString):142 +Found:Related GlobalStringVar(InfoString):146 +Found:Related GlobalStringVar(InfoString):143 +Found:Related GlobalStringVar(InfoString):144 +Found:Related GlobalStringVar(InfoString):145 +Found:Related GlobalStringVar(InfoString):218 +Found:Related GlobalIntVar(ButtonGraphics):809 +Found:Related GlobalIntVar(ButtonGraphics):810 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:16 +Hidden child:18 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:32 +Hidden child:33 +Hidden child:34 +INTERFACE:770 +INTERFACE:771 +INTERFACE:772 +Found:Indirect-related BITconfig:ID:2052, bitoffs:16, length:17 +Found:Indirect-related BITconfig:ID:2052, bitoffs:18, length:19 +Found:Indirect-related BITconfig:ID:2052, bitoffs:20, length:21 +Found:Indirect-related BITconfig:ID:2052, bitoffs:22, length:23 +Found:Indirect-related BITconfig:ID:2052, bitoffs:24, length:25 +Found:Indirect-related BITconfig:ID:2052, bitoffs:26, length:27 +Found:Indirect-related BITconfig:ID:2052, bitoffs:28, length:29 +Found:Indirect-related BITconfig:ID:2052, bitoffs:30, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:773 +Hidden child:6 +INTERFACE:774 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:775 +Found:Related BITconfig:ID:1271, bitoffs:0, length:6 +Found:Related BITconfig:ID:1306, bitoffs:0, length:5 +INTERFACE:776 +INTERFACE:777 +INTERFACE:778 +INTERFACE:779 +Found:Related config:1278 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:4 +Hidden child:136 +INTERFACE:780 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:781 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:1495, bitoffs:0, length:9 +Found:Related BITconfig:ID:1276, bitoffs:7, length:9 +Hidden child:1 +Hidden child:13 +Hidden child:14 +INTERFACE:782 +INTERFACE:783 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):232 +Found:Indirect-related GlobalIntVar(ButtonGraphics):822 +Found:Indirect-related GlobalIntVar(ButtonGraphics):233 +Found:Indirect-related GlobalIntVar(ButtonGraphics):234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):235 +Found:Indirect-related GlobalIntVar(ButtonGraphics):236 +Found:Indirect-related GlobalIntVar(ButtonGraphics):237 +Found:Indirect-related GlobalIntVar(ButtonGraphics):238 +Found:Indirect-related GlobalIntVar(ButtonGraphics):823 +Found:Indirect-related GlobalIntVar(ButtonGraphics):240 +Found:Indirect-related GlobalIntVar(ButtonGraphics):241 +Found:Indirect-related GlobalIntVar(ButtonGraphics):242 +Found:Indirect-related GlobalIntVar(ButtonGraphics):243 +Found:Indirect-related GlobalIntVar(ButtonGraphics):244 +Found:Indirect-related GlobalIntVar(ButtonGraphics):245 +Found:Indirect-related GlobalIntVar(ButtonGraphics):824 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:784 +INTERFACE:785 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:786 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:787 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:788 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:789 +Found:Indirect-related GlobalIntVar(ButtonGraphics):267 +Found:Indirect-related GlobalStringVar(InfoString):38 +Found:Indirect-related GlobalStringVar(InfoString):39 +Found:Related GlobalIntVar(ButtonGraphics):266 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1029 +Found:Indirect-related GlobalStringVar(InfoString):22 +Found:Related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related config:287 +Found:Indirect-related config:1054 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:790 +Found:Related GlobalIntVar(ButtonGraphics):268 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:791 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):252 +Found:Indirect-related GlobalIntVar(ButtonGraphics):253 +Found:Related GlobalIntVar(ButtonGraphics):246 +Found:Related GlobalIntVar(ButtonGraphics):247 +Found:Related GlobalIntVar(ButtonGraphics):248 +Found:Related GlobalIntVar(ButtonGraphics):249 +Found:Related GlobalIntVar(ButtonGraphics):250 +Found:Related GlobalIntVar(ButtonGraphics):251 +Found:Related GlobalIntVar(ButtonGraphics):254 +Found:Related GlobalIntVar(ButtonGraphics):255 +Found:Related GlobalIntVar(ButtonGraphics):256 +Found:Related GlobalIntVar(ButtonGraphics):257 +Found:Related GlobalIntVar(ButtonGraphics):258 +Found:Related GlobalIntVar(ButtonGraphics):259 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related config:1149 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:114 +INTERFACE:792 +Found:Indirect-related GlobalIntVar(ButtonGraphics):248 +Found:Indirect-related GlobalIntVar(ButtonGraphics):246 +Found:Indirect-related GlobalIntVar(ButtonGraphics):247 +Found:Indirect-related GlobalIntVar(ButtonGraphics):249 +Found:Indirect-related GlobalIntVar(ButtonGraphics):250 +Found:Indirect-related GlobalIntVar(ButtonGraphics):252 +Found:Indirect-related GlobalIntVar(ButtonGraphics):251 +Found:Indirect-related GlobalIntVar(ButtonGraphics):256 +Found:Indirect-related GlobalIntVar(ButtonGraphics):253 +Found:Indirect-related GlobalIntVar(ButtonGraphics):254 +Found:Indirect-related GlobalIntVar(ButtonGraphics):255 +Found:Indirect-related GlobalIntVar(ButtonGraphics):257 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +INTERFACE:793 +Found:Indirect-related BITconfig:ID:1147, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:794 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1311, bitoffs:14, length:15 +INTERFACE:795 +INTERFACE:796 +Found:Related BITconfig:ID:1311, bitoffs:10, length:13 +Hidden child:5 +Hidden child:7 +Hidden child:9 +Hidden child:16 +Hidden child:38 +INTERFACE:797 +Found:Related BITconfig:ID:2387, bitoffs:0, length:9 +Hidden child:14 +Hidden child:31 +Hidden child:45 +Hidden child:59 +Hidden child:72 +Hidden child:87 +Hidden child:101 +Hidden child:115 +Hidden child:129 +INTERFACE:798 +INTERFACE:799 +Found:Related BITconfig:ID:1328, bitoffs:11, length:13 +Found:Related BITconfig:ID:1328, bitoffs:14, length:16 +Found:Related BITconfig:ID:1328, bitoffs:17, length:19 +Found:Related BITconfig:ID:1328, bitoffs:20, length:22 +Found:Related BITconfig:ID:1328, bitoffs:23, length:25 +Found:Related BITconfig:ID:1328, bitoffs:26, length:28 +Found:Related BITconfig:ID:1328, bitoffs:29, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:800 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +INTERFACE:801 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:802 +Found:Related config:1332 +Found:Related config:1334 +Found:Related config:1337 +Found:Related config:1333 +Found:Related config:1335 +Found:Related GlobalIntVar(ButtonGraphics):581 +Found:Related GlobalStringVar(InfoString):43 +Hidden child:19 +INTERFACE:803 +INTERFACE:804 +Hidden child:2 +INTERFACE:805 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:1042 +Found:Related config:1043 +Found:Related GlobalStringVar(InfoString):219 +Found:Related GlobalIntVar(ButtonGraphics):12 +Found:Related GlobalIntVar(ButtonGraphics):13 +Found:Related GlobalIntVar(ButtonGraphics):14 +Found:Related GlobalIntVar(ButtonGraphics):15 +Found:Related GlobalIntVar(ButtonGraphics):16 +Found:Related GlobalIntVar(ButtonGraphics):17 +Found:Related GlobalIntVar(ButtonGraphics):18 +Found:Related GlobalIntVar(ButtonGraphics):19 +Found:Related GlobalIntVar(ButtonGraphics):20 +Found:Related GlobalIntVar(ButtonGraphics):21 +Found:Related GlobalIntVar(ButtonGraphics):22 +Found:Related GlobalIntVar(ButtonGraphics):23 +Found:Related GlobalIntVar(ButtonGraphics):24 +Found:Related GlobalIntVar(ButtonGraphics):25 +Found:Related GlobalIntVar(ButtonGraphics):26 +Found:Related GlobalIntVar(ButtonGraphics):27 +Found:Related GlobalIntVar(ButtonGraphics):28 +Found:Related GlobalIntVar(ButtonGraphics):29 +Found:Related GlobalIntVar(ButtonGraphics):30 +Found:Related GlobalIntVar(ButtonGraphics):31 +Found:Related GlobalIntVar(ButtonGraphics):32 +Found:Related GlobalIntVar(ButtonGraphics):33 +Found:Related GlobalIntVar(ButtonGraphics):34 +Found:Related GlobalIntVar(ButtonGraphics):35 +Found:Related GlobalIntVar(ButtonGraphics):36 +Found:Related GlobalIntVar(ButtonGraphics):37 +Found:Related GlobalIntVar(ButtonGraphics):38 +Found:Related GlobalIntVar(ButtonGraphics):39 +Found:Related GlobalIntVar(ButtonGraphics):212 +Hidden child:34 +INTERFACE:806 +Found:Related GlobalIntVar(ButtonGraphics):583 +Found:Related GlobalIntVar(ButtonGraphics):584 +Found:Related GlobalIntVar(ButtonGraphics):585 +Found:Related GlobalIntVar(ButtonGraphics):586 +Found:Related GlobalIntVar(ButtonGraphics):587 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:122 +INTERFACE:807 +INTERFACE:808 +INTERFACE:809 +Found:Related GlobalIntVar(ButtonGraphics):556 +Found:Related GlobalIntVar(ButtonGraphics):559 +Found:Related GlobalIntVar(ButtonGraphics):560 +Found:Related GlobalIntVar(ButtonGraphics):561 +Found:Related GlobalIntVar(ButtonGraphics):562 +Found:Related config:1332 +Found:Related config:1334 +Found:Related config:1337 +Found:Related config:1333 +Found:Related config:1335 +Found:Related GlobalIntVar(ButtonGraphics):557 +Found:Related GlobalIntVar(ButtonGraphics):558 +Hidden child:18 +INTERFACE:810 +Found:Related GlobalIntVar(ButtonGraphics):600 +Found:Related GlobalIntVar(ButtonGraphics):603 +Found:Related GlobalIntVar(ButtonGraphics):589 +Found:Related GlobalIntVar(ButtonGraphics):588 +Found:Related GlobalIntVar(ButtonGraphics):597 +Found:Related GlobalIntVar(ButtonGraphics):598 +Found:Related GlobalIntVar(ButtonGraphics):590 +Found:Related GlobalIntVar(ButtonGraphics):591 +Found:Related GlobalIntVar(ButtonGraphics):592 +Found:Related GlobalIntVar(ButtonGraphics):593 +Found:Related GlobalIntVar(ButtonGraphics):594 +Found:Related GlobalIntVar(ButtonGraphics):595 +Found:Related GlobalIntVar(ButtonGraphics):596 +Found:Related GlobalIntVar(ButtonGraphics):599 +Found:Related GlobalIntVar(ButtonGraphics):601 +Found:Related GlobalIntVar(ButtonGraphics):602 +Found:Related GlobalIntVar(ButtonGraphics):604 +Found:Related GlobalIntVar(ButtonGraphics):605 +Found:Related GlobalIntVar(ButtonGraphics):606 +Found:Related GlobalIntVar(ButtonGraphics):607 +Found:Related GlobalIntVar(ButtonGraphics):608 +Found:Related GlobalIntVar(ButtonGraphics):609 +Found:Related GlobalIntVar(ButtonGraphics):610 +Found:Related GlobalIntVar(ButtonGraphics):611 +Found:Related GlobalIntVar(ButtonGraphics):612 +Found:Related GlobalIntVar(ButtonGraphics):613 +Found:Related GlobalIntVar(ButtonGraphics):614 +Found:Related GlobalStringVar(InfoString):44 +Found:Related GlobalStringVar(InfoString):45 +Found:Related GlobalStringVar(InfoString):46 +Found:Related GlobalStringVar(InfoString):47 +Found:Related GlobalStringVar(InfoString):48 +Found:Related GlobalStringVar(InfoString):49 +Found:Related GlobalStringVar(InfoString):50 +Found:Related GlobalStringVar(InfoString):51 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:85 +Hidden child:144 +INTERFACE:811 +Found:Related GlobalIntVar(ButtonGraphics):544 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalIntVar(ButtonGraphics):549 +Hidden child:3 +Hidden child:4 +Hidden child:38 +Hidden child:52 +Hidden child:67 +Hidden child:81 +Hidden child:95 +Hidden child:110 +INTERFACE:812 +Found:Related GlobalIntVar(ButtonGraphics):551 +Found:Related GlobalIntVar(ButtonGraphics):552 +Found:Related GlobalIntVar(ButtonGraphics):553 +Found:Related GlobalStringVar(InfoString):40 +Found:Related GlobalStringVar(InfoString):41 +Found:Related GlobalStringVar(InfoString):42 +INTERFACE:813 +Found:Related GlobalIntVar(ButtonGraphics):582 +Found:Indirect-related GlobalIntVar(ButtonGraphics):583 +Found:Indirect-related GlobalIntVar(ButtonGraphics):584 +Found:Indirect-related GlobalIntVar(ButtonGraphics):585 +Found:Indirect-related GlobalIntVar(ButtonGraphics):586 +Found:Indirect-related GlobalIntVar(ButtonGraphics):587 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:75 +Hidden child:77 +Hidden child:78 +Hidden child:79 +Hidden child:98 +Hidden child:100 +Hidden child:102 +Hidden child:104 +Hidden child:106 +INTERFACE:814 +Found:Related BITconfig:ID:425, bitoffs:1, length:2 +INTERFACE:815 +INTERFACE:816 +INTERFACE:817 +INTERFACE:818 +Found:Related BITconfig:ID:425, bitoffs:1, length:2 +Found:Related GlobalIntVar(ButtonGraphics):97 +Hidden child:0 +INTERFACE:819 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:820 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:821 +INTERFACE:822 +Found:Related BITconfig:ID:425, bitoffs:1, length:2 +INTERFACE:823 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:8 +Hidden child:25 +Hidden child:36 +INTERFACE:824 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related BITconfig:ID:2387, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:2387, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:2387, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:2387, bitoffs:13, length:13 +Found:Related BITconfig:ID:2387, bitoffs:14, length:16 +Found:Related BITconfig:ID:2387, bitoffs:17, length:19 +Found:Related BITconfig:ID:2387, bitoffs:20, length:22 +Found:Related BITconfig:ID:2387, bitoffs:23, length:25 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:44 +Hidden child:51 +Hidden child:60 +Hidden child:102 +Hidden child:112 +Hidden child:121 +Hidden child:155 +Hidden child:165 +Hidden child:174 +Hidden child:192 +Hidden child:202 +Hidden child:211 +INTERFACE:825 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:68 +Hidden child:70 +Hidden child:90 +INTERFACE:826 +Found:Related BITconfig:ID:425, bitoffs:1, length:2 +INTERFACE:827 +INTERFACE:828 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:829 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:830 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:831 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:832 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:833 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:834 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalIntVar(ButtonGraphics):642 +Found:Related GlobalIntVar(ButtonGraphics):645 +Found:Related GlobalIntVar(ButtonGraphics):654 +Found:Related config:1380 +Found:Related GlobalIntVar(ButtonGraphics):655 +Hidden child:46 +Hidden child:48 +Hidden child:52 +Hidden child:56 +Hidden child:60 +Hidden child:61 +Hidden child:62 +Hidden child:63 +Hidden child:67 +Hidden child:68 +INTERFACE:835 +INTERFACE:836 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related BITconfig:ID:1377, bitoffs:29, length:29 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalIntVar(ButtonGraphics):643 +Found:Related GlobalIntVar(ButtonGraphics):639 +Found:Related GlobalIntVar(ButtonGraphics):641 +Found:Related GlobalIntVar(ButtonGraphics):644 +Found:Related GlobalIntVar(ButtonGraphics):640 +Found:Related GlobalIntVar(ButtonGraphics):642 +Found:Related GlobalIntVar(ButtonGraphics):636 +Found:Related GlobalIntVar(ButtonGraphics):645 +Found:Related GlobalIntVar(ButtonGraphics):649 +Found:Related GlobalIntVar(ButtonGraphics):647 +Found:Related config:1380 +Found:Related GlobalIntVar(ButtonGraphics):655 +Hidden child:47 +Hidden child:49 +Hidden child:50 +INTERFACE:837 +Found:Related GlobalIntVar(ButtonGraphics):632 +Found:Related GlobalIntVar(ButtonGraphics):633 +Found:Related GlobalIntVar(ButtonGraphics):637 +Found:Related GlobalIntVar(ButtonGraphics):634 +Found:Related GlobalIntVar(ButtonGraphics):638 +Found:Related GlobalIntVar(ButtonGraphics):635 +Found:Related GlobalIntVar(ButtonGraphics):636 +INTERFACE:838 +Found:Indirect-related GlobalIntVar(ButtonGraphics):656 +Found:Indirect-related GlobalIntVar(ButtonGraphics):657 +Found:Indirect-related GlobalIntVar(ButtonGraphics):658 +Found:Indirect-related GlobalIntVar(ButtonGraphics):659 +Found:Indirect-related GlobalIntVar(ButtonGraphics):660 +Found:Indirect-related GlobalIntVar(ButtonGraphics):661 +Found:Indirect-related GlobalIntVar(ButtonGraphics):662 +Found:Indirect-related GlobalIntVar(ButtonGraphics):663 +Found:Indirect-related GlobalIntVar(ButtonGraphics):664 +Found:Indirect-related GlobalIntVar(ButtonGraphics):665 +Found:Indirect-related GlobalIntVar(ButtonGraphics):666 +Found:Indirect-related GlobalIntVar(ButtonGraphics):667 +Found:Indirect-related GlobalIntVar(ButtonGraphics):668 +Found:Indirect-related GlobalIntVar(ButtonGraphics):669 +Found:Indirect-related GlobalIntVar(ButtonGraphics):670 +Found:Indirect-related GlobalIntVar(ButtonGraphics):672 +Found:Indirect-related GlobalIntVar(ButtonGraphics):673 +Found:Indirect-related GlobalIntVar(ButtonGraphics):671 +Found:Indirect-related GlobalStringVar(InfoString):73 +Found:Indirect-related GlobalStringVar(InfoString):74 +Found:Indirect-related GlobalStringVar(InfoString):75 +Found:Indirect-related GlobalStringVar(InfoString):76 +Found:Indirect-related GlobalStringVar(InfoString):77 +Found:Indirect-related GlobalStringVar(InfoString):78 +Found:Indirect-related GlobalStringVar(InfoString):79 +Found:Indirect-related GlobalStringVar(InfoString):80 +Found:Indirect-related GlobalStringVar(InfoString):81 +Found:Indirect-related GlobalStringVar(InfoString):82 +Found:Indirect-related GlobalStringVar(InfoString):83 +Found:Indirect-related GlobalStringVar(InfoString):84 +Found:Indirect-related GlobalStringVar(InfoString):85 +Found:Indirect-related GlobalStringVar(InfoString):86 +Found:Indirect-related GlobalStringVar(InfoString):87 +Found:Indirect-related GlobalStringVar(InfoString):88 +Found:Indirect-related GlobalStringVar(InfoString):89 +Found:Indirect-related GlobalStringVar(InfoString):90 +Found:Indirect-related GlobalStringVar(InfoString):91 +Found:Indirect-related GlobalStringVar(InfoString):92 +Found:Indirect-related GlobalStringVar(InfoString):93 +Found:Indirect-related GlobalStringVar(InfoString):94 +Found:Indirect-related GlobalStringVar(InfoString):95 +Found:Indirect-related GlobalStringVar(InfoString):96 +Found:Indirect-related GlobalStringVar(InfoString):97 +Found:Indirect-related GlobalStringVar(InfoString):98 +Found:Indirect-related GlobalStringVar(InfoString):99 +Found:Indirect-related GlobalStringVar(InfoString):100 +Found:Indirect-related GlobalStringVar(InfoString):101 +Found:Indirect-related GlobalStringVar(InfoString):102 +Found:Indirect-related GlobalStringVar(InfoString):103 +Found:Indirect-related GlobalStringVar(InfoString):104 +Found:Indirect-related GlobalStringVar(InfoString):105 +Found:Indirect-related GlobalStringVar(InfoString):106 +Found:Indirect-related GlobalStringVar(InfoString):107 +Found:Indirect-related GlobalStringVar(InfoString):108 +Found:Indirect-related GlobalStringVar(InfoString):109 +Found:Indirect-related GlobalStringVar(InfoString):110 +Found:Indirect-related GlobalStringVar(InfoString):111 +Found:Indirect-related GlobalStringVar(InfoString):112 +Found:Indirect-related GlobalStringVar(InfoString):113 +Found:Indirect-related GlobalStringVar(InfoString):114 +Found:Indirect-related GlobalStringVar(InfoString):115 +Found:Indirect-related GlobalStringVar(InfoString):116 +Found:Indirect-related GlobalStringVar(InfoString):117 +Found:Indirect-related GlobalStringVar(InfoString):118 +Found:Indirect-related GlobalStringVar(InfoString):119 +Found:Indirect-related GlobalStringVar(InfoString):120 +Found:Indirect-related GlobalStringVar(InfoString):121 +Found:Indirect-related GlobalStringVar(InfoString):57 +Found:Indirect-related GlobalStringVar(InfoString):58 +Found:Indirect-related GlobalStringVar(InfoString):59 +Found:Indirect-related GlobalStringVar(InfoString):60 +Found:Indirect-related GlobalStringVar(InfoString):61 +Found:Indirect-related GlobalStringVar(InfoString):62 +Found:Indirect-related GlobalStringVar(InfoString):63 +Found:Indirect-related GlobalStringVar(InfoString):64 +Found:Indirect-related GlobalStringVar(InfoString):65 +Found:Indirect-related GlobalStringVar(InfoString):66 +Found:Indirect-related GlobalStringVar(InfoString):67 +Found:Indirect-related GlobalStringVar(InfoString):68 +Found:Indirect-related GlobalStringVar(InfoString):69 +Found:Indirect-related GlobalStringVar(InfoString):70 +Found:Indirect-related GlobalStringVar(InfoString):71 +Found:Indirect-related GlobalStringVar(InfoString):72 +INTERFACE:839 +INTERFACE:840 +Found:Indirect-related GlobalIntVar(ButtonGraphics):906 +Found:Indirect-related GlobalIntVar(ButtonGraphics):907 +Found:Related BITconfig:ID:1450, bitoffs:13, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):904 +Hidden child:4 +INTERFACE:841 +INTERFACE:842 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):857 +Found:Related GlobalIntVar(ButtonGraphics):858 +Found:Related GlobalIntVar(ButtonGraphics):859 +Found:Related GlobalIntVar(ButtonGraphics):860 +Found:Related GlobalIntVar(ButtonGraphics):861 +Found:Related GlobalIntVar(ButtonGraphics):862 +Found:Related GlobalIntVar(ButtonGraphics):863 +Found:Related GlobalIntVar(ButtonGraphics):864 +Found:Related GlobalIntVar(ButtonGraphics):865 +Found:Related GlobalIntVar(ButtonGraphics):866 +Found:Related GlobalIntVar(ButtonGraphics):867 +Found:Related GlobalIntVar(ButtonGraphics):868 +Found:Related GlobalIntVar(ButtonGraphics):869 +Found:Related GlobalIntVar(ButtonGraphics):870 +Found:Related GlobalIntVar(ButtonGraphics):871 +Found:Related GlobalIntVar(ButtonGraphics):872 +Found:Related GlobalIntVar(ButtonGraphics):873 +Found:Related GlobalIntVar(ButtonGraphics):874 +INTERFACE:843 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):945 +Found:Related GlobalStringVar(InfoString):182 +Found:Related GlobalStringVar(InfoString):183 +INTERFACE:844 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):826 +Found:Indirect-related GlobalIntVar(ButtonGraphics):827 +INTERFACE:845 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):828 +Found:Related GlobalIntVar(ButtonGraphics):829 +Found:Related GlobalIntVar(ButtonGraphics):830 +Found:Related GlobalIntVar(ButtonGraphics):831 +Found:Related GlobalIntVar(ButtonGraphics):832 +INTERFACE:846 +INTERFACE:847 +INTERFACE:848 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):875 +Found:Related GlobalIntVar(ButtonGraphics):876 +Found:Related GlobalIntVar(ButtonGraphics):877 +Found:Related GlobalIntVar(ButtonGraphics):878 +Found:Related GlobalIntVar(ButtonGraphics):879 +Found:Related GlobalIntVar(ButtonGraphics):880 +Found:Related BITconfig:ID:1451, bitoffs:27, length:27 +Found:Related BITconfig:ID:1451, bitoffs:28, length:28 +Found:Related BITconfig:ID:1451, bitoffs:29, length:29 +Found:Related BITconfig:ID:1451, bitoffs:30, length:30 +Found:Related BITconfig:ID:1451, bitoffs:31, length:31 +INTERFACE:849 +Found:Related GlobalIntVar(ButtonGraphics):837 +Hidden child:54 +INTERFACE:850 +Found:Related BITconfig:ID:1445, bitoffs:19, length:21 +Found:Related GlobalStringVar(InfoString):179 +Hidden child:1 +INTERFACE:851 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:852 +Found:Indirect-related config:1447 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):838 +Found:Related GlobalStringVar(InfoString):180 +Found:Related GlobalStringVar(InfoString):181 +Found:Indirect-related GlobalIntVar(ButtonGraphics):840 +Found:Related GlobalIntVar(ButtonGraphics):839 +Found:Related BITconfig:ID:1445, bitoffs:0, length:18 +Found:Related BITconfig:ID:1455, bitoffs:0, length:14 +Hidden child:80 +INTERFACE:853 +Found:Related GlobalIntVar(ButtonGraphics):834 +Found:Related GlobalIntVar(ButtonGraphics):835 +Found:Related GlobalIntVar(ButtonGraphics):836 +Found:Related GlobalIntVar(ButtonGraphics):833 +Found:Related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:854 +Found:Related BITconfig:ID:1444, bitoffs:8, length:13 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:855 +Found:Related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:856 +INTERFACE:857 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +INTERFACE:858 +INTERFACE:859 +Found:Related BITconfig:ID:1450, bitoffs:13, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):906 +Found:Indirect-related GlobalIntVar(ButtonGraphics):907 +Found:Indirect-related GlobalIntVar(ButtonGraphics):904 +Found:Indirect-related GlobalIntVar(ButtonGraphics):905 +Found:Related GlobalIntVar(ButtonGraphics):902 +Found:Related GlobalIntVar(ButtonGraphics):903 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:18 +Hidden child:19 +INTERFACE:860 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):842 +INTERFACE:861 +INTERFACE:862 +Found:Related BITconfig:ID:1452, bitoffs:0, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalStringVar(InfoString):184 +Found:Related GlobalStringVar(InfoString):185 +Found:Related GlobalStringVar(InfoString):186 +Found:Related GlobalStringVar(InfoString):187 +Found:Related GlobalStringVar(InfoString):188 +Found:Related GlobalStringVar(InfoString):189 +Hidden child:30 +INTERFACE:863 +Found:Indirect-related BITconfig:ID:1452, bitoffs:0, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):846 +Found:Indirect-related GlobalIntVar(ButtonGraphics):839 +Found:Related BITconfig:ID:1445, bitoffs:0, length:18 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):844 +Found:Related GlobalIntVar(ButtonGraphics):845 +INTERFACE:864 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related config:1469 +Found:Indirect-related BITconfig:ID:507, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:507, bitoffs:8, length:13 +Found:Indirect-related BITconfig:ID:507, bitoffs:16, length:21 +Found:Indirect-related BITconfig:ID:1063, bitoffs:14, length:16 +INTERFACE:865 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:1442 +INTERFACE:866 +Found:Related BITconfig:ID:1476, bitoffs:0, length:2 +Found:Related BITconfig:ID:1476, bitoffs:22, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1476, bitoffs:24, length:27 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:45 +Hidden child:49 +Hidden child:52 +Hidden child:55 +Hidden child:58 +Hidden child:61 +Hidden child:65 +Hidden child:66 +Hidden child:67 +Hidden child:68 +Hidden child:69 +Hidden child:70 +Hidden child:71 +Hidden child:72 +Hidden child:73 +Hidden child:76 +Hidden child:79 +INTERFACE:867 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:868 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:869 +INTERFACE:870 +INTERFACE:871 +Found:Related BITconfig:ID:425, bitoffs:1, length:2 +INTERFACE:872 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:873 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:874 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:875 +INTERFACE:876 +Found:Related BITconfig:ID:1476, bitoffs:19, length:21 +Found:Related BITconfig:ID:1475, bitoffs:8, length:11 +Hidden child:3 +INTERFACE:877 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:878 +INTERFACE:879 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:880 +Found:Related BITconfig:ID:1494, bitoffs:0, length:3 +INTERFACE:881 +INTERFACE:882 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1394 +Hidden child:5 +Hidden child:23 +INTERFACE:883 +INTERFACE:884 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1000 +Found:Related config:300 +Found:Related config:301 +Found:Related config:172 +Found:Related config:43 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +INTERFACE:885 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1001 +INTERFACE:886 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1002 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:887 +Found:Related BITconfig:ID:1498, bitoffs:0, length:15 +Found:Related BITconfig:ID:1498, bitoffs:27, length:28 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:888 +INTERFACE:889 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:890 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1099 +Found:Related GlobalIntVar(ButtonGraphics):1412 +Found:Related GlobalStringVar(InfoString):330 +Found:Indirect-related GlobalIntVar(ButtonGraphics):174 +Found:Indirect-related GlobalIntVar(ButtonGraphics):175 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1407 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1408 +Found:Indirect-related GlobalStringVar(InfoString):122 +Found:Indirect-related GlobalStringVar(InfoString):326 +Found:Indirect-related GlobalStringVar(InfoString):124 +Found:Indirect-related GlobalStringVar(InfoString):125 +Found:Indirect-related GlobalStringVar(InfoString):123 +Found:Indirect-related GlobalStringVar(InfoString):327 +Found:Indirect-related GlobalStringVar(InfoString):328 +Found:Indirect-related GlobalStringVar(InfoString):329 +Hidden child:35 +Hidden child:43 +Hidden child:54 +Hidden child:61 +INTERFACE:891 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:0 +Hidden child:1 +Hidden child:61 +Hidden child:62 +Hidden child:63 +Hidden child:64 +Hidden child:65 +INTERFACE:892 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1045, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1045, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1045, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1045, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1045, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1045, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1045, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1045, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1045, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1045, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:1, length:3 +Found:Indirect-related BITconfig:ID:1046, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1046, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1046, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1046, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1046, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1046, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1046, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1046, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1046, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1045, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1047, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1047, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1047, bitoffs:13, length:15 +Found:Indirect-related BITconfig:ID:1047, bitoffs:16, length:18 +Found:Indirect-related BITconfig:ID:1047, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1047, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1047, bitoffs:25, length:27 +Found:Indirect-related BITconfig:ID:1047, bitoffs:28, length:30 +Found:Indirect-related BITconfig:ID:1046, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1501, bitoffs:0, length:2 +Hidden child:21 +INTERFACE:893 +Found:Related GlobalStringVar(InfoString):197 +Found:Related GlobalStringVar(InfoString):198 +Found:Related GlobalStringVar(InfoString):199 +Found:Related GlobalStringVar(InfoString):200 +Hidden child:13 +INTERFACE:894 +Found:Related GlobalStringVar(InfoString):197 +Found:Related GlobalStringVar(InfoString):198 +Found:Related GlobalStringVar(InfoString):199 +Found:Related GlobalStringVar(InfoString):200 +INTERFACE:895 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:896 +Found:Related config:281 +Found:Related config:170 +Found:Related BITconfig:ID:1805, bitoffs:2, length:2 +Found:Related GlobalIntVar(ButtonGraphics):1003 +Found:Related GlobalIntVar(ButtonGraphics):1004 +Found:Related GlobalIntVar(ButtonGraphics):1005 +Found:Related GlobalIntVar(ButtonGraphics):1006 +Found:Related GlobalStringVar(InfoString):194 +Found:Related GlobalStringVar(InfoString):195 +Hidden child:4 +INTERFACE:897 +Found:Related config:281 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +INTERFACE:898 +INTERFACE:899 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1007 +INTERFACE:900 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1057, bitoffs:0, length:0 +Found:Related BITconfig:ID:1057, bitoffs:1, length:4 +Hidden child:32 +INTERFACE:901 +Hidden child:30 +Hidden child:31 +Hidden child:39 +Hidden child:40 +INTERFACE:902 +INTERFACE:903 +Hidden child:0 +INTERFACE:904 +Found:Related GlobalStringVar(InfoString):130 +Found:Related GlobalStringVar(InfoString):142 +Found:Related GlobalStringVar(InfoString):146 +Found:Related GlobalStringVar(InfoString):147 +Found:Related GlobalStringVar(InfoString):143 +Found:Related GlobalStringVar(InfoString):144 +Found:Related GlobalStringVar(InfoString):145 +Found:Related GlobalIntVar(ButtonGraphics):809 +Found:Related GlobalIntVar(ButtonGraphics):810 +Found:Related GlobalIntVar(ButtonGraphics):811 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:44 +INTERFACE:905 +Found:Indirect-related GlobalIntVar(ButtonGraphics):754 +Found:Indirect-related BITconfig:ID:1363, bitoffs:26, length:31 +Found:Indirect-related BITconfig:ID:1363, bitoffs:20, length:25 +Found:Indirect-related GlobalIntVar(ButtonGraphics):93 +Found:Related GlobalIntVar(ButtonGraphics):92 +Found:Related GlobalIntVar(ButtonGraphics):755 +Found:Related GlobalIntVar(ButtonGraphics):756 +Found:Related GlobalIntVar(ButtonGraphics):757 +Found:Related GlobalIntVar(ButtonGraphics):758 +Found:Related GlobalIntVar(ButtonGraphics):759 +Found:Related GlobalIntVar(ButtonGraphics):760 +Found:Related GlobalIntVar(ButtonGraphics):1139 +Found:Related GlobalIntVar(ButtonGraphics):1140 +Found:Related GlobalIntVar(ButtonGraphics):1141 +Found:Related GlobalIntVar(ButtonGraphics):1142 +Found:Related GlobalIntVar(ButtonGraphics):120 +Found:Related GlobalIntVar(ButtonGraphics):185 +Found:Related GlobalIntVar(ButtonGraphics):87 +Found:Related GlobalIntVar(ButtonGraphics):90 +Found:Related GlobalStringVar(InfoString):132 +Found:Related GlobalStringVar(InfoString):133 +Found:Related GlobalStringVar(InfoString):134 +Found:Related GlobalStringVar(InfoString):135 +Found:Related GlobalStringVar(InfoString):136 +Found:Related GlobalStringVar(InfoString):137 +Found:Related GlobalStringVar(InfoString):280 +Found:Related GlobalStringVar(InfoString):281 +Found:Related GlobalStringVar(InfoString):282 +Found:Related GlobalStringVar(InfoString):283 +Found:Related GlobalStringVar(InfoString):275 +Found:Related GlobalStringVar(InfoString):316 +Found:Related GlobalStringVar(InfoString):317 +Found:Related GlobalStringVar(InfoString):318 +Hidden child:28 +INTERFACE:906 +Found:Related GlobalIntVar(ButtonGraphics):1100 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1414 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1322 +Found:Indirect-related GlobalIntVar(ButtonGraphics):200 +Found:Indirect-related GlobalIntVar(ButtonGraphics):547 +Found:Indirect-related GlobalStringVar(InfoString):32 +Found:Indirect-related GlobalStringVar(InfoString):277 +Found:Indirect-related GlobalIntVar(ButtonGraphics):994 +Found:Indirect-related GlobalIntVar(ButtonGraphics):986 +Found:Indirect-related GlobalIntVar(ButtonGraphics):177 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1092 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1510 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1276 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1275 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1315 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1316 +Found:Indirect-related GlobalIntVar(ButtonGraphics):998 +Found:Indirect-related GlobalIntVar(ButtonGraphics):999 +Found:Indirect-related GlobalStringVar(InfoString):278 +Found:Indirect-related GlobalStringVar(InfoString):349 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1098 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1507 +Found:Indirect-related GlobalIntVar(ButtonGraphics):178 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1508 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1509 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1125 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1123 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1274 +Found:Indirect-related GlobalIntVar(ButtonGraphics):176 +Found:Indirect-related GlobalIntVar(ButtonGraphics):533 +Found:Indirect-related GlobalIntVar(ButtonGraphics):523 +Found:Indirect-related GlobalIntVar(ButtonGraphics):534 +Found:Indirect-related GlobalIntVar(ButtonGraphics):524 +Found:Indirect-related GlobalIntVar(ButtonGraphics):535 +Found:Indirect-related GlobalIntVar(ButtonGraphics):525 +Found:Indirect-related GlobalIntVar(ButtonGraphics):536 +Found:Indirect-related GlobalIntVar(ButtonGraphics):526 +Found:Indirect-related GlobalIntVar(ButtonGraphics):537 +Found:Indirect-related GlobalIntVar(ButtonGraphics):527 +Found:Indirect-related GlobalIntVar(ButtonGraphics):538 +Found:Indirect-related GlobalIntVar(ButtonGraphics):528 +Found:Indirect-related GlobalIntVar(ButtonGraphics):539 +Found:Indirect-related GlobalIntVar(ButtonGraphics):529 +Found:Indirect-related GlobalIntVar(ButtonGraphics):540 +Found:Indirect-related GlobalIntVar(ButtonGraphics):530 +Found:Indirect-related GlobalIntVar(ButtonGraphics):541 +Found:Indirect-related GlobalIntVar(ButtonGraphics):531 +Found:Indirect-related GlobalIntVar(ButtonGraphics):542 +Found:Indirect-related GlobalIntVar(ButtonGraphics):532 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:29 +Hidden child:30 +Hidden child:40 +Hidden child:41 +Hidden child:42 +Hidden child:43 +Hidden child:44 +Hidden child:45 +Hidden child:46 +Hidden child:55 +Hidden child:56 +Hidden child:152 +Hidden child:185 +Hidden child:186 +Hidden child:187 +Hidden child:188 +Hidden child:189 +Hidden child:190 +Hidden child:220 +Hidden child:236 +Hidden child:242 +INTERFACE:907 +Hidden child:12 +Hidden child:13 +Hidden child:24 +Hidden child:25 +Hidden child:36 +Hidden child:37 +Hidden child:50 +Hidden child:51 +INTERFACE:908 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:15 +Hidden child:30 +Hidden child:34 +Hidden child:36 +INTERFACE:909 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1097 +Found:Indirect-related GlobalStringVar(InfoString):277 +Found:Indirect-related GlobalStringVar(InfoString):278 +Found:Indirect-related GlobalStringVar(InfoString):349 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):6 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1094 +Found:Indirect-related GlobalStringVar(InfoString):279 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:32 +Hidden child:43 +Hidden child:80 +Hidden child:85 +INTERFACE:910 +Hidden child:13 +Hidden child:14 +Hidden child:19 +Hidden child:65 +Hidden child:66 +Hidden child:67 +INTERFACE:911 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1394 +Hidden child:3 +Hidden child:23 +Hidden child:50 +Hidden child:59 +INTERFACE:912 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):6 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1094 +Found:Indirect-related GlobalStringVar(InfoString):279 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1097 +Found:Indirect-related GlobalStringVar(InfoString):277 +Found:Indirect-related GlobalStringVar(InfoString):278 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Hidden child:2 +Hidden child:26 +Hidden child:31 +Hidden child:44 +Hidden child:48 +INTERFACE:913 +Found:Related GlobalIntVar(ButtonGraphics):1094 +Found:Related GlobalStringVar(InfoString):279 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1097 +Found:Indirect-related GlobalStringVar(InfoString):277 +Found:Indirect-related GlobalStringVar(InfoString):278 +Found:Indirect-related GlobalStringVar(InfoString):349 +Hidden child:2 +INTERFACE:914 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1094 +Found:Indirect-related GlobalStringVar(InfoString):277 +Found:Indirect-related GlobalStringVar(InfoString):278 +Found:Related GlobalIntVar(ButtonGraphics):6 +Hidden child:21 +Hidden child:28 +INTERFACE:915 +Found:Indirect-related GlobalIntVar(ButtonGraphics):6 +Found:Indirect-related GlobalStringVar(InfoString):279 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1094 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1097 +Found:Indirect-related GlobalStringVar(InfoString):277 +Found:Indirect-related GlobalStringVar(InfoString):278 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):349 +Hidden child:102 +INTERFACE:916 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +INTERFACE:917 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1419 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1418 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1420 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1960, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1960, bitoffs:27, length:27 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1429 +Found:Indirect-related BITconfig:ID:2083, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1958, bitoffs:0, length:11 +Found:Related BITconfig:ID:1961, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1960, bitoffs:0, length:6 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1422 +Found:Indirect-related BITconfig:ID:1960, bitoffs:7, length:18 +Found:Indirect-related BITconfig:ID:1562, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1562, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1562, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1562, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1562, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1562, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1562, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1562, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1562, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1562, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1562, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1562, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1562, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1562, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1562, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1562, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1562, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1562, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1562, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1562, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1562, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1562, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1562, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1563, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1563, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1563, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1563, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1563, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1563, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1563, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1563, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1563, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1563, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1563, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1563, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1563, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1563, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1563, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1563, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1564, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1564, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1564, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1564, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1564, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1564, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1564, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1564, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1564, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1564, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1564, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1564, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1564, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1564, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1564, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1564, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1564, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1565, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1565, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1565, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1565, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1565, bitoffs:5, length:10 +Found:Indirect-related BITconfig:ID:1256, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1256, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1256, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1256, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1256, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1256, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1256, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1256, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1256, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1256, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1256, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1256, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1256, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1256, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1256, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1256, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1256, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1256, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1256, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1256, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1256, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1256, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1256, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1257, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1257, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1257, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1257, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1257, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1257, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1257, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1257, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1257, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1257, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1257, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1257, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1257, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1257, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1257, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1257, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1257, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1257, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1257, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1258, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1258, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1258, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1258, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1258, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1258, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1258, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1258, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1258, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1258, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1258, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1258, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1886, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1886, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1886, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1886, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1886, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1886, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1886, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1360, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1360, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1360, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1360, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1360, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1360, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1360, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1360, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1360, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1360, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1360, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1360, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1360, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1360, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1360, bitoffs:18, length:19 +Found:Indirect-related BITconfig:ID:1360, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1360, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1361, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1360, bitoffs:23, length:24 +Found:Indirect-related BITconfig:ID:1360, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1360, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1360, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1360, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1360, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1360, bitoffs:30, length:30 +Found:Indirect-related BITconfig:ID:1360, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1361, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1361, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1361, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1361, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1361, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1361, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1360, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1361, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1361, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1361, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1361, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1361, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1361, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1361, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1361, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1361, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1361, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1361, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1358, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1358, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1358, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1358, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1358, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1358, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1358, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1358, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1358, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1358, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1358, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1358, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1358, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1358, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1358, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1358, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1358, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1358, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1358, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1358, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1358, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1358, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1358, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1358, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1358, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1358, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1358, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1358, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1358, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1358, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:2088, bitoffs:18, length:21 +Found:Indirect-related BITconfig:ID:1359, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1359, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1359, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1359, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1359, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1359, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1359, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1359, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1359, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1000, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1000, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1000, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1000, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1000, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1000, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1000, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1000, bitoffs:9, length:11 +Found:Indirect-related BITconfig:ID:1000, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1000, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1001, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1001, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1001, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1001, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1001, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1001, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1001, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1001, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1001, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1001, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1001, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1001, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1001, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1001, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1001, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1001, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1001, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1001, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1001, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1002, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1002, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1002, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1002, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1002, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1002, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1002, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1002, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1002, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1002, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1000, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1000, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1000, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1000, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1000, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1000, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1000, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1000, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1372, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1372, bitoffs:7, length:8 +Found:Indirect-related BITconfig:ID:1372, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1372, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1372, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1372, bitoffs:12, length:14 +Found:Indirect-related BITconfig:ID:1372, bitoffs:15, length:17 +Found:Indirect-related BITconfig:ID:1372, bitoffs:18, length:20 +Found:Indirect-related BITconfig:ID:1372, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1372, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1372, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1372, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1372, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1372, bitoffs:30, length:30 +Found:Indirect-related BITconfig:ID:1372, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1373, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1373, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1373, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1373, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1373, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1373, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1373, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1373, bitoffs:10, length:11 +Found:Indirect-related BITconfig:ID:1373, bitoffs:12, length:15 +Found:Indirect-related BITconfig:ID:1373, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1373, bitoffs:17, length:19 +Found:Indirect-related BITconfig:ID:1373, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1373, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1373, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1373, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1373, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1373, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1374, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1374, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:1374, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:1887, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1887, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1887, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1887, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1887, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1071, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1071, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1071, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1071, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1071, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1071, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1071, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1071, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1071, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1071, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1071, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1071, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1071, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1071, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1071, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1071, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1071, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1071, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1071, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1071, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1072, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1072, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1072, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1072, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1072, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1072, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1072, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1072, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1072, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1072, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1072, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1072, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1072, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1072, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1072, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1072, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1072, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1072, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1072, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1072, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1073, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1073, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1073, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1073, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1073, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1073, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1073, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1073, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1073, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1073, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1073, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1073, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1073, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1073, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1073, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1073, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1073, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1073, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1073, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1073, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1073, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1073, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1956, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1956, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1956, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1956, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1956, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1956, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1956, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1956, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1956, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1956, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1956, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1956, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1956, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1956, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1956, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1956, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1956, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1956, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1956, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1956, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1956, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1956, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1956, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1956, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1956, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1956, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1956, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1956, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1956, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1956, bitoffs:30, length:30 +Found:Indirect-related BITconfig:ID:1956, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1957, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1957, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1957, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1957, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1957, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1957, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1957, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1957, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1957, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1957, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1957, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1957, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1957, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1957, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1957, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1957, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1957, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1957, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1957, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1957, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1957, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1957, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1957, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1957, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1957, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1957, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1957, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1957, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1261, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:2082, bitoffs:5, length:6 +Found:Indirect-related BITconfig:ID:2082, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:2082, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:2082, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:2082, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:2082, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:2082, bitoffs:2, length:3 +Found:Indirect-related BITconfig:ID:2082, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:2082, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:2082, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:2082, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:2082, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:2082, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:2082, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:2082, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1957, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1957, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1957, bitoffs:30, length:30 +Found:Indirect-related BITconfig:ID:1957, bitoffs:31, length:31 +Found:Indirect-related config:63 +Found:Indirect-related config:165 +Found:Indirect-related config:68 +Found:Indirect-related config:180 +Found:Indirect-related config:30 +Found:Indirect-related config:212 +Found:Indirect-related config:159 +Found:Indirect-related config:139 +Found:Indirect-related config:365 +Found:Indirect-related config:492 +Found:Indirect-related config:107 +Found:Indirect-related config:29 +Found:Indirect-related config:176 +Found:Indirect-related config:122 +Found:Indirect-related config:347 +Found:Indirect-related config:76 +Found:Indirect-related config:116 +Found:Indirect-related config:175 +Found:Indirect-related config:320 +Found:Indirect-related config:150 +Found:Indirect-related config:192 +Found:Indirect-related config:416 +Found:Indirect-related config:148 +Found:Indirect-related config:101 +Found:Indirect-related config:111 +Found:Indirect-related config:451 +Found:Indirect-related config:1199 +Found:Indirect-related config:302 +Found:Indirect-related config:339 +Found:Indirect-related config:273 +Found:Indirect-related BITconfig:ID:977, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1303, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1178, bitoffs:1, length:10 +Found:Indirect-related BITconfig:ID:810, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1204, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:912, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:635, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1274, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:823, bitoffs:0, length:19 +Found:Indirect-related BITconfig:ID:1077, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:313, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1190, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:177, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:553, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:571, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:607, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:496, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:874, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1577, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:77, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1023, bitoffs:17, length:18 +Found:Indirect-related BITconfig:ID:1023, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:730, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1023, bitoffs:15, length:16 +Found:Indirect-related BITconfig:ID:1023, bitoffs:11, length:12 +Found:Indirect-related BITconfig:ID:1588, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1330, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:299, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1050, bitoffs:1, length:4 +Found:Indirect-related BITconfig:ID:992, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:802, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:802, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:802, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:802, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:709, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1010, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:440, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:1600, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1282, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:449, bitoffs:22, length:31 +Found:Indirect-related BITconfig:ID:1303, bitoffs:16, length:19 +Found:Indirect-related BITconfig:ID:1303, bitoffs:10, length:15 +Found:Indirect-related BITconfig:ID:1386, bitoffs:18, length:19 +Found:Indirect-related BITconfig:ID:1289, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1289, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1289, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:714, bitoffs:3, length:6 +Found:Indirect-related BITconfig:ID:1242, bitoffs:1, length:31 +Found:Indirect-related BITconfig:ID:1049, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1261, bitoffs:3, length:4 +Found:Indirect-related config:131 +Found:Indirect-related config:223 +Found:Indirect-related config:14 +Found:Indirect-related config:112 +Found:Indirect-related config:145 +Found:Indirect-related config:146 +Found:Indirect-related config:26 +Found:Indirect-related BITconfig:ID:1311, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:222, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1403, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:705, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:604, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:568, bitoffs:0, length:6 +Found:Indirect-related config:2068 +Found:Indirect-related config:450 +Found:Indirect-related config:130 +Found:Indirect-related config:31 +Found:Indirect-related config:32 +Found:Indirect-related config:160 +Found:Indirect-related config:71 +Found:Indirect-related config:293 +Found:Indirect-related config:655 +Found:Indirect-related config:10 +Found:Indirect-related config:399 +Found:Indirect-related config:314 +Found:Indirect-related config:80 +Found:Indirect-related config:0 +Found:Indirect-related config:335 +Found:Indirect-related config:299 +Found:Indirect-related config:17 +Found:Indirect-related config:11 +Found:Indirect-related config:65 +Found:Indirect-related config:382 +Found:Indirect-related config:188 +Found:Indirect-related config:5 +Found:Indirect-related config:387 +Found:Indirect-related config:147 +Found:Indirect-related config:517 +Found:Indirect-related config:307 +Found:Indirect-related config:328 +Found:Indirect-related config:402 +Found:Indirect-related config:600 +Found:Indirect-related config:60 +Found:Indirect-related config:359 +Found:Indirect-related config:197 +Found:Indirect-related config:226 +Found:Indirect-related config:200 +Found:Indirect-related config:385 +Found:Indirect-related config:317 +Found:Indirect-related config:161 +Found:Indirect-related config:162 +Found:Indirect-related config:980 +Found:Indirect-related BITconfig:ID:62, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:178, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:939, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:433, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:964, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:455, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:400, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:869, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:794, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:622, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:934, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:896, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:641, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:844, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:671, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:810, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:435, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:521, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:408, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:482, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:437, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:351, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:445, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:465, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:423, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:574, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:905, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:714, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:678, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:602, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:616, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:723, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:449, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:968, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:970, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:994, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:997, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1003, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1016, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1063, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1094, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1165, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1184, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1218, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1225, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1227, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1232, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1236, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1271, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1306, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1370, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1365, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1407, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1415, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1475, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1420, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1390, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1327, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1819, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1498, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:1558, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1610, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1811, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1849, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1646, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1844, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1834, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1861, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2037, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1906, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1889, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2217, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2020, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2046, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:2051, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2079, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2208, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2234, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2376, bitoffs:0, length:7 +Found:Related GlobalIntVar(ButtonGraphics):1423 +Found:Related GlobalIntVar(ButtonGraphics):1424 +Hidden child:82 +Hidden child:83 +Hidden child:84 +Hidden child:86 +Hidden child:92 +Hidden child:102 +Hidden child:119 +INTERFACE:918 +Found:Related config:1652 +Found:Related config:1653 +Found:Related config:1654 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:919 +INTERFACE:920 +Found:Indirect-related BITconfig:ID:1661, bitoffs:4, length:8 +Found:Indirect-related BITconfig:ID:1661, bitoffs:9, length:13 +Found:Indirect-related BITconfig:ID:1661, bitoffs:14, length:18 +Found:Indirect-related BITconfig:ID:1661, bitoffs:19, length:23 +Found:Indirect-related BITconfig:ID:1661, bitoffs:24, length:28 +Found:Indirect-related BITconfig:ID:1660, bitoffs:18, length:21 +Found:Indirect-related BITconfig:ID:1664, bitoffs:20, length:23 +Found:Indirect-related BITconfig:ID:1661, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1660, bitoffs:12, length:14 +Found:Indirect-related BITconfig:ID:1660, bitoffs:15, length:17 +Found:Indirect-related BITconfig:ID:1662, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1662, bitoffs:10, length:19 +Found:Indirect-related BITconfig:ID:1662, bitoffs:20, length:29 +Found:Indirect-related BITconfig:ID:1661, bitoffs:29, length:31 +INTERFACE:921 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:922 +Hidden child:10 +Hidden child:106 +Hidden child:110 +INTERFACE:923 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1111 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1112 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1113 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1114 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1115 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1116 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1117 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:924 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:925 +Found:Related BITconfig:ID:1658, bitoffs:0, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:926 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:927 +Found:Related config:1674 +Found:Related config:1688 +Found:Related config:1687 +Found:Related config:1686 +Found:Related config:1681 +Found:Related BITconfig:ID:1669, bitoffs:7, length:7 +Found:Related BITconfig:ID:1669, bitoffs:8, length:8 +Found:Related BITconfig:ID:1669, bitoffs:9, length:9 +Found:Related BITconfig:ID:1670, bitoffs:0, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:946, bitoffs:28, length:30 +Found:Related BITconfig:ID:947, bitoffs:9, length:17 +Found:Related BITconfig:ID:947, bitoffs:0, length:2 +Found:Related BITconfig:ID:948, bitoffs:19, length:27 +Found:Related BITconfig:ID:947, bitoffs:3, length:5 +Found:Related BITconfig:ID:948, bitoffs:0, length:8 +Found:Related BITconfig:ID:947, bitoffs:6, length:8 +Found:Related BITconfig:ID:948, bitoffs:9, length:18 +Found:Related BITconfig:ID:945, bitoffs:29, length:29 +Found:Related BITconfig:ID:1605, bitoffs:26, length:26 +Found:Related BITconfig:ID:1605, bitoffs:28, length:28 +Found:Related BITconfig:ID:1605, bitoffs:25, length:25 +Found:Related BITconfig:ID:1605, bitoffs:27, length:27 +INTERFACE:928 +INTERFACE:929 +Found:Related config:1693 +Found:Related config:1687 +Found:Related config:1692 +Found:Related config:1686 +Found:Related config:1694 +Found:Related config:1688 +Found:Related config:1695 +Found:Related config:1689 +Found:Related config:1697 +Found:Related config:1690 +Found:Related config:1696 +Found:Related config:1691 +Found:Related config:1698 +Found:Related BITconfig:ID:1669, bitoffs:7, length:7 +Found:Related BITconfig:ID:1669, bitoffs:8, length:8 +Found:Related BITconfig:ID:1669, bitoffs:9, length:9 +Found:Related GlobalIntVar(ButtonGraphics):1135 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:946, bitoffs:28, length:30 +Found:Related BITconfig:ID:947, bitoffs:9, length:17 +Found:Related BITconfig:ID:947, bitoffs:0, length:2 +Found:Related BITconfig:ID:948, bitoffs:19, length:27 +Found:Related BITconfig:ID:947, bitoffs:3, length:5 +Found:Related BITconfig:ID:948, bitoffs:0, length:8 +Found:Related BITconfig:ID:947, bitoffs:6, length:8 +Found:Related BITconfig:ID:948, bitoffs:9, length:18 +Found:Related BITconfig:ID:945, bitoffs:29, length:29 +Found:Related BITconfig:ID:1605, bitoffs:26, length:26 +Found:Related BITconfig:ID:1605, bitoffs:28, length:28 +Found:Related BITconfig:ID:1605, bitoffs:25, length:25 +Found:Related BITconfig:ID:1605, bitoffs:27, length:27 +INTERFACE:930 +INTERFACE:931 +Found:Indirect-related config:1687 +Found:Indirect-related config:1688 +Found:Indirect-related config:1686 +Found:Indirect-related config:1689 +Found:Indirect-related config:1690 +Found:Indirect-related config:1691 +Found:Indirect-related config:1674 +Found:Indirect-related BITconfig:ID:1669, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1669, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1669, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1126 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1127 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1128 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1129 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1131 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1130 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1135 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1134 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1133 +Found:Related config:1675 +Found:Related config:1676 +Found:Related config:1677 +Found:Related config:1678 +Found:Related config:1680 +Found:Related config:1679 +Found:Related config:1682 +Found:Related config:1684 +Found:Related config:1683 +Found:Related config:1681 +Found:Indirect-related config:1685 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:932 +Found:Related GlobalIntVar(ButtonGraphics):767 +Found:Related GlobalIntVar(ButtonGraphics):761 +Found:Related GlobalIntVar(ButtonGraphics):762 +Found:Related GlobalIntVar(ButtonGraphics):763 +Found:Related GlobalIntVar(ButtonGraphics):764 +Found:Related GlobalIntVar(ButtonGraphics):765 +Found:Related GlobalIntVar(ButtonGraphics):766 +Found:Related config:1700 +Found:Related GlobalIntVar(ButtonGraphics):1137 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:20 +Hidden child:22 +INTERFACE:933 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1198 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1208 +Found:Indirect-related GlobalStringVar(InfoString):310 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1199 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1212 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1213 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1214 +Found:Indirect-related GlobalStringVar(InfoString):311 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1200 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1215 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1216 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1217 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1218 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1219 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1220 +Found:Indirect-related GlobalStringVar(InfoString):312 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1201 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1221 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1222 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1223 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1224 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1225 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1226 +Found:Indirect-related GlobalStringVar(InfoString):313 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1202 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1227 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1228 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1229 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1230 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1231 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1232 +Found:Indirect-related GlobalStringVar(InfoString):314 +Found:Related GlobalIntVar(ButtonGraphics):1184 +Found:Related GlobalIntVar(ButtonGraphics):1185 +Found:Related GlobalIntVar(ButtonGraphics):1186 +Found:Related GlobalIntVar(ButtonGraphics):1189 +Found:Related GlobalIntVar(ButtonGraphics):1190 +Found:Related GlobalIntVar(ButtonGraphics):1397 +Found:Related GlobalIntVar(ButtonGraphics):1398 +Found:Related GlobalIntVar(ButtonGraphics):1399 +Found:Related GlobalIntVar(ButtonGraphics):1400 +Found:Related GlobalIntVar(ButtonGraphics):1401 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1191 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1320 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1196 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1188 +Found:Indirect-related BITconfig:ID:1775, bitoffs:16, length:19 +Found:Related config:1780 +Found:Related BITconfig:ID:1775, bitoffs:0, length:5 +Found:Related BITconfig:ID:1775, bitoffs:6, length:11 +Found:Related GlobalIntVar(ButtonGraphics):1195 +Found:Related GlobalIntVar(ButtonGraphics):1192 +Found:Related GlobalIntVar(ButtonGraphics):1187 +Found:Related GlobalIntVar(ButtonGraphics):1319 +Found:Related GlobalIntVar(ButtonGraphics):1270 +Found:Related GlobalIntVar(ButtonGraphics):1237 +Found:Related GlobalIntVar(ButtonGraphics):1238 +Found:Related GlobalIntVar(ButtonGraphics):1239 +Found:Related GlobalIntVar(ButtonGraphics):1236 +Found:Related GlobalIntVar(ButtonGraphics):1321 +Hidden child:84 +Hidden child:274 +Hidden child:284 +Hidden child:294 +Hidden child:297 +Hidden child:300 +Hidden child:316 +INTERFACE:934 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:1 +INTERFACE:935 +Hidden child:22 +Hidden child:26 +INTERFACE:936 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:937 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1186 +Hidden child:44 +Hidden child:45 +Hidden child:46 +Hidden child:47 +Hidden child:48 +Hidden child:49 +Hidden child:50 +Hidden child:51 +Hidden child:52 +Hidden child:53 +Hidden child:54 +Hidden child:55 +Hidden child:56 +Hidden child:57 +Hidden child:58 +Hidden child:59 +Hidden child:60 +Hidden child:61 +Hidden child:62 +Hidden child:63 +Hidden child:64 +Hidden child:65 +Hidden child:68 +INTERFACE:938 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:57 +Hidden child:62 +Hidden child:67 +Hidden child:72 +Hidden child:77 +Hidden child:82 +INTERFACE:939 +Found:Related GlobalStringVar(InfoString):292 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1175 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalStringVar(InfoString):293 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1176 +Found:Related GlobalStringVar(InfoString):294 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1177 +Found:Related GlobalStringVar(InfoString):295 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1178 +Found:Related GlobalStringVar(InfoString):296 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1179 +Found:Related GlobalIntVar(ButtonGraphics):1181 +Found:Related GlobalIntVar(ButtonGraphics):1182 +Found:Related GlobalIntVar(ButtonGraphics):1183 +Found:Related GlobalIntVar(ButtonGraphics):1180 +Hidden child:31 +Hidden child:34 +Hidden child:37 +Hidden child:38 +Hidden child:39 +Hidden child:59 +Hidden child:60 +Hidden child:62 +Hidden child:63 +Hidden child:65 +Hidden child:66 +Hidden child:68 +Hidden child:69 +Hidden child:71 +Hidden child:72 +Hidden child:88 +Hidden child:93 +INTERFACE:940 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:41 +Hidden child:42 +Hidden child:43 +Hidden child:44 +Hidden child:49 +Hidden child:67 +Hidden child:68 +INTERFACE:941 +INTERFACE:942 +Found:Related GlobalIntVar(ButtonGraphics):1149 +Found:Related GlobalIntVar(ButtonGraphics):1150 +Found:Related GlobalIntVar(ButtonGraphics):1151 +Found:Related GlobalIntVar(ButtonGraphics):1152 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:943 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:944 +Found:Related GlobalIntVar(ButtonGraphics):754 +Found:Related config:170 +Found:Related GlobalStringVar(InfoString):131 +Found:Related GlobalIntVar(ButtonGraphics):755 +Found:Related GlobalIntVar(ButtonGraphics):756 +Found:Related GlobalIntVar(ButtonGraphics):757 +Found:Related GlobalIntVar(ButtonGraphics):758 +Found:Related GlobalIntVar(ButtonGraphics):759 +Found:Related GlobalIntVar(ButtonGraphics):760 +Found:Related GlobalIntVar(ButtonGraphics):1139 +Found:Related GlobalIntVar(ButtonGraphics):1140 +Found:Related GlobalIntVar(ButtonGraphics):1141 +Found:Related GlobalIntVar(ButtonGraphics):1142 +Found:Related GlobalStringVar(InfoString):132 +Found:Related GlobalStringVar(InfoString):133 +Found:Related GlobalStringVar(InfoString):134 +Found:Related GlobalStringVar(InfoString):135 +Found:Related GlobalStringVar(InfoString):136 +Found:Related GlobalStringVar(InfoString):137 +Found:Related GlobalStringVar(InfoString):280 +Found:Related GlobalStringVar(InfoString):281 +Found:Related GlobalStringVar(InfoString):282 +Found:Related GlobalStringVar(InfoString):283 +INTERFACE:945 +Found:Related BITconfig:ID:1775, bitoffs:16, length:19 +Found:Related GlobalIntVar(ButtonGraphics):1233 +Found:Related GlobalStringVar(InfoString):315 +Hidden child:2 +INTERFACE:946 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:4 +INTERFACE:947 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:48 +Hidden child:49 +Hidden child:50 +Hidden child:51 +Hidden child:52 +Hidden child:53 +Hidden child:54 +Hidden child:55 +Hidden child:56 +Hidden child:57 +Hidden child:58 +Hidden child:59 +Hidden child:60 +Hidden child:61 +Hidden child:62 +Hidden child:63 +Hidden child:64 +Hidden child:65 +Hidden child:66 +Hidden child:67 +Hidden child:68 +Hidden child:69 +Hidden child:70 +Hidden child:71 +Hidden child:72 +Hidden child:73 +Hidden child:74 +Hidden child:75 +Hidden child:76 +Hidden child:77 +Hidden child:78 +Hidden child:79 +Hidden child:80 +Hidden child:81 +Hidden child:82 +Hidden child:83 +Hidden child:84 +Hidden child:85 +Hidden child:86 +Hidden child:87 +Hidden child:88 +Hidden child:89 +Hidden child:90 +Hidden child:91 +Hidden child:92 +Hidden child:93 +Hidden child:94 +Hidden child:95 +Hidden child:96 +Hidden child:97 +Hidden child:98 +Hidden child:99 +Hidden child:100 +Hidden child:101 +Hidden child:102 +Hidden child:103 +Hidden child:104 +Hidden child:105 +Hidden child:106 +Hidden child:107 +Hidden child:120 +Hidden child:121 +Hidden child:122 +Hidden child:123 +Hidden child:124 +Hidden child:125 +Hidden child:126 +Hidden child:127 +Hidden child:128 +Hidden child:129 +Hidden child:130 +Hidden child:131 +Hidden child:132 +Hidden child:133 +Hidden child:134 +Hidden child:135 +Hidden child:136 +Hidden child:137 +Hidden child:138 +Hidden child:139 +Hidden child:140 +Hidden child:141 +Hidden child:142 +Hidden child:143 +Hidden child:144 +Hidden child:145 +Hidden child:146 +Hidden child:147 +Hidden child:148 +Hidden child:149 +Hidden child:150 +Hidden child:151 +Hidden child:152 +Hidden child:153 +Hidden child:154 +Hidden child:155 +Hidden child:156 +Hidden child:157 +Hidden child:158 +Hidden child:159 +Hidden child:160 +Hidden child:161 +Hidden child:162 +Hidden child:163 +Hidden child:164 +Hidden child:165 +Hidden child:166 +Hidden child:167 +Hidden child:168 +Hidden child:169 +Hidden child:170 +Hidden child:171 +Hidden child:172 +Hidden child:173 +Hidden child:174 +Hidden child:175 +Hidden child:176 +Hidden child:177 +Hidden child:178 +Hidden child:179 +Hidden child:181 +Hidden child:182 +Hidden child:183 +Hidden child:184 +Hidden child:185 +Hidden child:186 +Hidden child:187 +Hidden child:188 +Hidden child:189 +Hidden child:190 +Hidden child:191 +Hidden child:192 +Hidden child:193 +Hidden child:194 +Hidden child:195 +Hidden child:196 +Hidden child:197 +Hidden child:198 +Hidden child:199 +Hidden child:200 +Hidden child:201 +Hidden child:202 +Hidden child:203 +Hidden child:204 +Hidden child:205 +Hidden child:206 +Hidden child:207 +Hidden child:208 +Hidden child:209 +Hidden child:210 +Hidden child:211 +Hidden child:212 +Hidden child:213 +Hidden child:214 +Hidden child:215 +Hidden child:216 +Hidden child:217 +Hidden child:218 +Hidden child:219 +Hidden child:220 +Hidden child:221 +Hidden child:222 +Hidden child:223 +Hidden child:224 +Hidden child:225 +Hidden child:226 +Hidden child:227 +Hidden child:228 +Hidden child:229 +Hidden child:230 +Hidden child:231 +Hidden child:232 +Hidden child:233 +Hidden child:234 +Hidden child:235 +Hidden child:236 +Hidden child:237 +Hidden child:238 +Hidden child:239 +Hidden child:240 +Hidden child:242 +Hidden child:243 +Hidden child:244 +Hidden child:245 +Hidden child:246 +Hidden child:247 +Hidden child:248 +Hidden child:249 +Hidden child:250 +Hidden child:251 +Hidden child:252 +Hidden child:253 +Hidden child:254 +Hidden child:255 +Hidden child:256 +Hidden child:257 +Hidden child:258 +Hidden child:259 +Hidden child:260 +Hidden child:261 +Hidden child:262 +Hidden child:263 +Hidden child:264 +Hidden child:265 +Hidden child:266 +Hidden child:267 +Hidden child:268 +Hidden child:269 +Hidden child:270 +Hidden child:271 +Hidden child:272 +Hidden child:273 +Hidden child:274 +Hidden child:275 +Hidden child:276 +Hidden child:277 +Hidden child:278 +Hidden child:279 +Hidden child:280 +Hidden child:281 +Hidden child:282 +Hidden child:283 +Hidden child:284 +Hidden child:285 +Hidden child:286 +Hidden child:287 +Hidden child:288 +Hidden child:289 +Hidden child:290 +Hidden child:291 +Hidden child:292 +Hidden child:293 +Hidden child:294 +Hidden child:295 +Hidden child:296 +Hidden child:297 +Hidden child:298 +Hidden child:299 +Hidden child:300 +Hidden child:301 +Hidden child:303 +Hidden child:304 +Hidden child:305 +Hidden child:306 +Hidden child:307 +Hidden child:308 +Hidden child:309 +Hidden child:310 +Hidden child:311 +Hidden child:312 +Hidden child:313 +Hidden child:314 +Hidden child:315 +Hidden child:316 +Hidden child:317 +Hidden child:318 +Hidden child:319 +Hidden child:320 +Hidden child:321 +Hidden child:322 +Hidden child:323 +Hidden child:324 +Hidden child:325 +Hidden child:326 +Hidden child:327 +Hidden child:328 +Hidden child:329 +Hidden child:330 +Hidden child:331 +Hidden child:332 +Hidden child:333 +Hidden child:334 +Hidden child:335 +Hidden child:336 +Hidden child:337 +Hidden child:338 +Hidden child:339 +Hidden child:340 +Hidden child:341 +Hidden child:342 +Hidden child:343 +Hidden child:344 +Hidden child:345 +Hidden child:346 +Hidden child:347 +Hidden child:348 +Hidden child:349 +Hidden child:350 +Hidden child:351 +Hidden child:352 +Hidden child:353 +Hidden child:354 +Hidden child:355 +Hidden child:356 +Hidden child:357 +Hidden child:358 +Hidden child:359 +Hidden child:360 +Hidden child:361 +Hidden child:362 +Hidden child:364 +Hidden child:365 +Hidden child:366 +Hidden child:367 +Hidden child:368 +Hidden child:369 +Hidden child:370 +Hidden child:371 +Hidden child:372 +Hidden child:373 +Hidden child:374 +Hidden child:375 +Hidden child:376 +Hidden child:377 +Hidden child:378 +Hidden child:379 +Hidden child:380 +Hidden child:381 +Hidden child:382 +Hidden child:383 +Hidden child:384 +Hidden child:385 +Hidden child:386 +Hidden child:387 +Hidden child:388 +Hidden child:389 +Hidden child:390 +Hidden child:391 +Hidden child:392 +Hidden child:393 +Hidden child:394 +Hidden child:395 +Hidden child:396 +Hidden child:397 +Hidden child:398 +Hidden child:399 +Hidden child:400 +Hidden child:401 +Hidden child:402 +Hidden child:403 +Hidden child:404 +Hidden child:405 +Hidden child:406 +Hidden child:407 +Hidden child:408 +Hidden child:409 +Hidden child:410 +Hidden child:411 +Hidden child:412 +Hidden child:413 +Hidden child:414 +Hidden child:415 +Hidden child:416 +Hidden child:417 +Hidden child:418 +Hidden child:419 +Hidden child:420 +Hidden child:421 +Hidden child:422 +Hidden child:423 +Hidden child:425 +Hidden child:426 +Hidden child:427 +Hidden child:428 +Hidden child:429 +Hidden child:430 +Hidden child:431 +Hidden child:432 +Hidden child:433 +Hidden child:434 +Hidden child:435 +Hidden child:436 +Hidden child:437 +Hidden child:438 +Hidden child:439 +Hidden child:440 +Hidden child:441 +Hidden child:442 +Hidden child:443 +Hidden child:444 +Hidden child:445 +Hidden child:446 +Hidden child:447 +Hidden child:448 +Hidden child:449 +Hidden child:450 +Hidden child:451 +Hidden child:452 +Hidden child:453 +Hidden child:454 +Hidden child:455 +Hidden child:456 +Hidden child:457 +Hidden child:458 +Hidden child:459 +Hidden child:460 +Hidden child:461 +Hidden child:462 +Hidden child:463 +Hidden child:464 +Hidden child:465 +Hidden child:466 +Hidden child:467 +Hidden child:468 +Hidden child:469 +Hidden child:470 +Hidden child:471 +Hidden child:472 +Hidden child:473 +Hidden child:474 +Hidden child:475 +Hidden child:476 +Hidden child:477 +Hidden child:478 +Hidden child:479 +Hidden child:480 +Hidden child:481 +Hidden child:482 +Hidden child:483 +Hidden child:484 +Hidden child:486 +Hidden child:487 +Hidden child:488 +Hidden child:489 +Hidden child:490 +Hidden child:491 +Hidden child:492 +Hidden child:493 +Hidden child:494 +Hidden child:495 +Hidden child:496 +Hidden child:497 +Hidden child:498 +Hidden child:499 +Hidden child:500 +Hidden child:501 +Hidden child:502 +Hidden child:503 +Hidden child:504 +Hidden child:505 +Hidden child:506 +Hidden child:507 +Hidden child:508 +Hidden child:509 +Hidden child:510 +Hidden child:511 +Hidden child:512 +Hidden child:513 +Hidden child:514 +Hidden child:515 +Hidden child:516 +Hidden child:517 +Hidden child:518 +Hidden child:519 +Hidden child:520 +Hidden child:521 +Hidden child:522 +Hidden child:523 +Hidden child:524 +Hidden child:525 +Hidden child:526 +Hidden child:527 +Hidden child:528 +Hidden child:529 +Hidden child:530 +Hidden child:531 +Hidden child:532 +Hidden child:533 +Hidden child:534 +Hidden child:535 +Hidden child:536 +Hidden child:537 +Hidden child:538 +Hidden child:539 +Hidden child:540 +Hidden child:541 +Hidden child:542 +Hidden child:543 +Hidden child:544 +Hidden child:545 +Hidden child:547 +Hidden child:548 +Hidden child:549 +Hidden child:550 +Hidden child:551 +Hidden child:552 +Hidden child:553 +Hidden child:554 +Hidden child:555 +Hidden child:556 +Hidden child:557 +Hidden child:558 +Hidden child:559 +Hidden child:560 +Hidden child:561 +Hidden child:562 +Hidden child:563 +Hidden child:564 +Hidden child:565 +Hidden child:566 +Hidden child:567 +Hidden child:568 +Hidden child:569 +Hidden child:570 +Hidden child:571 +Hidden child:572 +Hidden child:573 +Hidden child:574 +Hidden child:575 +Hidden child:576 +Hidden child:577 +Hidden child:578 +Hidden child:579 +Hidden child:580 +Hidden child:581 +Hidden child:582 +Hidden child:583 +Hidden child:584 +Hidden child:585 +Hidden child:586 +Hidden child:587 +Hidden child:588 +Hidden child:589 +Hidden child:590 +Hidden child:591 +Hidden child:592 +Hidden child:593 +Hidden child:594 +Hidden child:595 +Hidden child:596 +Hidden child:597 +Hidden child:598 +Hidden child:599 +Hidden child:600 +Hidden child:601 +Hidden child:602 +Hidden child:603 +Hidden child:604 +Hidden child:605 +Hidden child:606 +Hidden child:608 +Hidden child:609 +Hidden child:610 +Hidden child:611 +Hidden child:612 +Hidden child:613 +Hidden child:614 +Hidden child:615 +Hidden child:616 +Hidden child:617 +Hidden child:618 +Hidden child:619 +Hidden child:620 +Hidden child:621 +Hidden child:622 +Hidden child:623 +Hidden child:624 +Hidden child:625 +Hidden child:626 +Hidden child:627 +Hidden child:628 +Hidden child:629 +Hidden child:630 +Hidden child:631 +Hidden child:632 +Hidden child:633 +Hidden child:634 +Hidden child:635 +Hidden child:636 +Hidden child:637 +Hidden child:638 +Hidden child:639 +Hidden child:640 +Hidden child:641 +Hidden child:642 +Hidden child:643 +Hidden child:644 +Hidden child:645 +Hidden child:646 +Hidden child:647 +Hidden child:648 +Hidden child:649 +Hidden child:650 +Hidden child:651 +Hidden child:652 +Hidden child:653 +Hidden child:654 +Hidden child:655 +Hidden child:656 +Hidden child:657 +Hidden child:658 +Hidden child:659 +Hidden child:660 +Hidden child:661 +Hidden child:662 +Hidden child:663 +Hidden child:664 +Hidden child:665 +Hidden child:666 +Hidden child:667 +Hidden child:669 +Hidden child:670 +Hidden child:671 +Hidden child:672 +Hidden child:673 +Hidden child:674 +Hidden child:675 +Hidden child:676 +Hidden child:677 +Hidden child:678 +Hidden child:679 +Hidden child:680 +Hidden child:681 +Hidden child:682 +Hidden child:683 +Hidden child:684 +Hidden child:685 +Hidden child:686 +Hidden child:687 +Hidden child:688 +Hidden child:689 +Hidden child:690 +Hidden child:691 +Hidden child:692 +Hidden child:693 +Hidden child:694 +Hidden child:695 +Hidden child:696 +Hidden child:697 +Hidden child:698 +Hidden child:699 +Hidden child:700 +Hidden child:701 +Hidden child:702 +Hidden child:703 +Hidden child:704 +Hidden child:705 +Hidden child:706 +Hidden child:707 +Hidden child:708 +Hidden child:709 +Hidden child:710 +Hidden child:711 +Hidden child:712 +Hidden child:713 +Hidden child:714 +Hidden child:715 +Hidden child:716 +Hidden child:717 +Hidden child:718 +Hidden child:719 +Hidden child:720 +Hidden child:721 +Hidden child:722 +Hidden child:723 +Hidden child:724 +Hidden child:725 +Hidden child:726 +Hidden child:727 +Hidden child:728 +INTERFACE:948 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:109 +Hidden child:110 +Hidden child:111 +Hidden child:112 +Hidden child:113 +Hidden child:114 +Hidden child:115 +Hidden child:116 +Hidden child:117 +Hidden child:118 +Hidden child:119 +Hidden child:120 +Hidden child:121 +Hidden child:122 +Hidden child:123 +Hidden child:124 +Hidden child:157 +Hidden child:158 +Hidden child:159 +Hidden child:160 +Hidden child:161 +Hidden child:174 +Hidden child:175 +Hidden child:176 +Hidden child:177 +Hidden child:178 +Hidden child:191 +Hidden child:192 +Hidden child:193 +Hidden child:194 +Hidden child:195 +Hidden child:208 +Hidden child:209 +Hidden child:210 +Hidden child:211 +Hidden child:212 +Hidden child:213 +Hidden child:214 +Hidden child:215 +Hidden child:234 +Hidden child:235 +Hidden child:236 +Hidden child:237 +Hidden child:238 +Hidden child:239 +Hidden child:240 +Hidden child:241 +Hidden child:242 +Hidden child:243 +Hidden child:244 +Hidden child:245 +Hidden child:246 +Hidden child:247 +Hidden child:248 +Hidden child:249 +Hidden child:250 +Hidden child:251 +Hidden child:252 +Hidden child:253 +Hidden child:254 +Hidden child:255 +Hidden child:256 +Hidden child:257 +Hidden child:258 +Hidden child:259 +Hidden child:260 +Hidden child:261 +Hidden child:262 +Hidden child:263 +Hidden child:264 +Hidden child:265 +Hidden child:338 +Hidden child:341 +Hidden child:344 +Hidden child:349 +Hidden child:352 +Hidden child:355 +INTERFACE:949 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalStringVar(InfoString):284 +Found:Related GlobalIntVar(ButtonGraphics):1153 +Found:Related GlobalIntVar(ButtonGraphics):1158 +Found:Related GlobalIntVar(ButtonGraphics):1163 +Found:Related GlobalIntVar(ButtonGraphics):1168 +Found:Related GlobalStringVar(InfoString):285 +Found:Related GlobalIntVar(ButtonGraphics):1154 +Found:Related GlobalIntVar(ButtonGraphics):1159 +Found:Related GlobalIntVar(ButtonGraphics):1164 +Found:Related GlobalIntVar(ButtonGraphics):1169 +Found:Related GlobalStringVar(InfoString):286 +Found:Related GlobalIntVar(ButtonGraphics):1155 +Found:Related GlobalIntVar(ButtonGraphics):1160 +Found:Related GlobalIntVar(ButtonGraphics):1165 +Found:Related GlobalIntVar(ButtonGraphics):1170 +Found:Related GlobalStringVar(InfoString):287 +Found:Related GlobalIntVar(ButtonGraphics):1156 +Found:Related GlobalIntVar(ButtonGraphics):1161 +Found:Related GlobalIntVar(ButtonGraphics):1166 +Found:Related GlobalIntVar(ButtonGraphics):1171 +Found:Related GlobalStringVar(InfoString):288 +Found:Related GlobalIntVar(ButtonGraphics):1157 +Found:Related GlobalIntVar(ButtonGraphics):1162 +Found:Related GlobalIntVar(ButtonGraphics):1167 +Found:Related GlobalIntVar(ButtonGraphics):1172 +Found:Related GlobalIntVar(ButtonGraphics):1174 +Found:Related GlobalIntVar(ButtonGraphics):1173 +Hidden child:66 +INTERFACE:950 +Found:Indirect-related BITconfig:ID:108, bitoffs:1, length:31 +Found:Indirect-related BITconfig:ID:439, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1510, bitoffs:5, length:13 +Found:Indirect-related BITconfig:ID:108, bitoffs:0, length:0 +Found:Related BITconfig:ID:439, bitoffs:8, length:8 +Found:Related GlobalIntVar(ButtonGraphics):993 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:1376, bitoffs:9, length:9 +Found:Related BITconfig:ID:1376, bitoffs:12, length:12 +Found:Related BITconfig:ID:1376, bitoffs:11, length:11 +Found:Related BITconfig:ID:1376, bitoffs:10, length:10 +Found:Related BITconfig:ID:1376, bitoffs:13, length:13 +Found:Related BITconfig:ID:1376, bitoffs:14, length:14 +Found:Related BITconfig:ID:1376, bitoffs:15, length:15 +Found:Related BITconfig:ID:1376, bitoffs:16, length:16 +Found:Related BITconfig:ID:1376, bitoffs:17, length:17 +Found:Related BITconfig:ID:1376, bitoffs:21, length:21 +Found:Related BITconfig:ID:1376, bitoffs:24, length:24 +Found:Related BITconfig:ID:1376, bitoffs:23, length:23 +Found:Related BITconfig:ID:1376, bitoffs:22, length:22 +Found:Related GlobalIntVar(ButtonGraphics):988 +Found:Related GlobalIntVar(ButtonGraphics):989 +Found:Related GlobalIntVar(ButtonGraphics):990 +Found:Related GlobalIntVar(ButtonGraphics):991 +Found:Related GlobalIntVar(ButtonGraphics):631 +Found:Indirect-related BITconfig:ID:1376, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1376, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:1376, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:1376, bitoffs:18, length:20 +Found:Indirect-related config:1092 +Found:Indirect-related BITconfig:ID:2089, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1087, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1209, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1331, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1334 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1335 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1402 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1403 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1234 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1235 +Found:Indirect-related config:1795 +Found:Related GlobalIntVar(ButtonGraphics):992 +Hidden child:68 +Hidden child:69 +INTERFACE:951 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1191 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1320 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1196 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1188 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1198 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1199 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1200 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1201 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1202 +Found:Related config:1780 +Found:Related BITconfig:ID:1775, bitoffs:16, length:19 +Found:Related BITconfig:ID:1775, bitoffs:0, length:5 +Found:Related BITconfig:ID:1775, bitoffs:6, length:11 +Found:Related GlobalIntVar(ButtonGraphics):1186 +Found:Related GlobalIntVar(ButtonGraphics):1185 +Found:Related GlobalIntVar(ButtonGraphics):1195 +Found:Related GlobalIntVar(ButtonGraphics):1187 +Found:Related GlobalIntVar(ButtonGraphics):1319 +Found:Related GlobalIntVar(ButtonGraphics):1237 +Found:Related GlobalIntVar(ButtonGraphics):1238 +Found:Related GlobalIntVar(ButtonGraphics):1239 +Found:Related GlobalIntVar(ButtonGraphics):1236 +Found:Related GlobalIntVar(ButtonGraphics):1321 +Found:Related GlobalIntVar(ButtonGraphics):1184 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1208 +Found:Indirect-related GlobalStringVar(InfoString):310 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1212 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1213 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1214 +Found:Indirect-related GlobalStringVar(InfoString):311 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1215 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1216 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1217 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1218 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1219 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1220 +Found:Indirect-related GlobalStringVar(InfoString):312 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1221 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1222 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1223 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1224 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1225 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1226 +Found:Indirect-related GlobalStringVar(InfoString):313 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1227 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1228 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1229 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1230 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1231 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1232 +Found:Indirect-related GlobalStringVar(InfoString):314 +Hidden child:222 +Hidden child:223 +Hidden child:224 +Hidden child:225 +Hidden child:226 +Hidden child:227 +Hidden child:228 +Hidden child:229 +Hidden child:230 +Hidden child:231 +INTERFACE:952 +INTERFACE:953 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:954 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:7 +INTERFACE:955 +INTERFACE:956 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1320 +Hidden child:20 +Hidden child:21 +Hidden child:22 +INTERFACE:957 +INTERFACE:958 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:39 +Hidden child:40 +Hidden child:41 +Hidden child:42 +Hidden child:43 +Hidden child:44 +Hidden child:45 +Hidden child:46 +Hidden child:47 +Hidden child:48 +Hidden child:49 +Hidden child:50 +Hidden child:51 +Hidden child:52 +Hidden child:53 +Hidden child:54 +Hidden child:55 +Hidden child:56 +Hidden child:57 +Hidden child:58 +Hidden child:59 +Hidden child:60 +Hidden child:61 +Hidden child:62 +Hidden child:63 +Hidden child:64 +Hidden child:65 +Hidden child:66 +Hidden child:67 +Hidden child:68 +INTERFACE:959 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +INTERFACE:960 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:0 +Hidden child:1 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +Hidden child:29 +Hidden child:31 +INTERFACE:961 +Found:Related BITconfig:ID:1819, bitoffs:17, length:18 +INTERFACE:962 +Found:Related BITconfig:ID:1819, bitoffs:17, length:18 +INTERFACE:963 +Found:Related BITconfig:ID:1819, bitoffs:17, length:18 +INTERFACE:964 +Found:Related BITconfig:ID:1819, bitoffs:17, length:18 +INTERFACE:965 +INTERFACE:966 +Found:Related BITconfig:ID:1819, bitoffs:17, length:18 +INTERFACE:967 +Found:Related BITconfig:ID:1819, bitoffs:17, length:18 +INTERFACE:968 +Found:Related BITconfig:ID:1819, bitoffs:17, length:18 +INTERFACE:969 +INTERFACE:970 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +INTERFACE:971 +Found:Related BITconfig:ID:1819, bitoffs:17, length:18 +INTERFACE:972 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +INTERFACE:973 +INTERFACE:974 +Found:Related BITconfig:ID:1819, bitoffs:17, length:18 +INTERFACE:975 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1100 +Found:Indirect-related GlobalIntVar(ButtonGraphics):547 +Found:Indirect-related GlobalIntVar(ButtonGraphics):174 +Found:Indirect-related GlobalIntVar(ButtonGraphics):200 +Found:Indirect-related GlobalIntVar(ButtonGraphics):201 +Found:Indirect-related GlobalStringVar(InfoString):32 +Found:Indirect-related GlobalStringVar(InfoString):33 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1099 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1089 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1092 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1414 +Hidden child:1 +Hidden child:5 +Hidden child:6 +Hidden child:26 +INTERFACE:976 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1240 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1277 +Found:Indirect-related GlobalIntVar(ButtonGraphics):178 +Found:Indirect-related GlobalIntVar(ButtonGraphics):175 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):174 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1090 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1091 +Found:Indirect-related GlobalIntVar(ButtonGraphics):547 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1099 +Found:Indirect-related GlobalStringVar(InfoString):122 +Found:Indirect-related GlobalStringVar(InfoString):32 +Found:Indirect-related GlobalStringVar(InfoString):124 +Found:Indirect-related GlobalStringVar(InfoString):33 +Found:Indirect-related GlobalStringVar(InfoString):125 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1089 +Found:Indirect-related GlobalIntVar(ButtonGraphics):986 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1411 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1407 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1408 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1101 +Found:Indirect-related GlobalStringVar(InfoString):326 +Found:Indirect-related GlobalStringVar(InfoString):123 +Found:Indirect-related GlobalStringVar(InfoString):327 +Found:Indirect-related GlobalStringVar(InfoString):328 +Found:Indirect-related GlobalStringVar(InfoString):329 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1100 +Found:Indirect-related GlobalIntVar(ButtonGraphics):200 +Found:Indirect-related GlobalIntVar(ButtonGraphics):201 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1092 +Found:Indirect-related GlobalIntVar(ButtonGraphics):987 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1414 +Found:Related GlobalIntVar(ButtonGraphics):1273 +INTERFACE:977 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1394 +INTERFACE:978 +INTERFACE:979 +Found:Related GlobalIntVar(ButtonGraphics):6 +Found:Indirect-related GlobalStringVar(InfoString):278 +Hidden child:7 +Hidden child:43 +INTERFACE:980 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:981 +INTERFACE:982 +Found:Indirect-related GlobalIntVar(ButtonGraphics):91 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related config:287 +Hidden child:15 +Hidden child:40 +Hidden child:43 +Hidden child:45 +Hidden child:67 +Hidden child:70 +Hidden child:95 +INTERFACE:983 +INTERFACE:984 +INTERFACE:985 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:26 +Hidden child:30 +Hidden child:33 +Hidden child:36 +Hidden child:39 +INTERFACE:986 +Found:Related BITconfig:ID:1841, bitoffs:10, length:10 +Found:Related BITconfig:ID:1840, bitoffs:20, length:20 +Found:Related BITconfig:ID:1840, bitoffs:9, length:12 +Found:Related BITconfig:ID:1840, bitoffs:13, length:14 +Found:Related BITconfig:ID:1841, bitoffs:0, length:4 +Found:Related BITconfig:ID:1841, bitoffs:17, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:5 +INTERFACE:987 +Found:Related BITconfig:ID:1840, bitoffs:15, length:18 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:988 +INTERFACE:989 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:990 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1007 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1065 +Hidden child:1 +Hidden child:4 +INTERFACE:991 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1317 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1318 +Found:Indirect-related BITconfig:ID:1506, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1506, bitoffs:2, length:3 +Found:Indirect-related BITconfig:ID:1506, bitoffs:4, length:5 +Found:Indirect-related BITconfig:ID:1506, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1506, bitoffs:8, length:9 +Found:Indirect-related BITconfig:ID:1506, bitoffs:10, length:11 +Found:Indirect-related BITconfig:ID:1506, bitoffs:12, length:13 +Found:Indirect-related BITconfig:ID:1506, bitoffs:14, length:15 +Found:Indirect-related BITconfig:ID:1506, bitoffs:16, length:17 +Found:Indirect-related BITconfig:ID:1506, bitoffs:18, length:19 +Found:Indirect-related BITconfig:ID:1506, bitoffs:20, length:21 +Found:Indirect-related BITconfig:ID:1506, bitoffs:22, length:23 +Found:Indirect-related BITconfig:ID:1506, bitoffs:24, length:25 +Found:Indirect-related BITconfig:ID:1506, bitoffs:26, length:27 +Found:Indirect-related BITconfig:ID:1506, bitoffs:28, length:29 +Found:Indirect-related BITconfig:ID:1506, bitoffs:30, length:31 +Found:Indirect-related BITconfig:ID:1507, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1507, bitoffs:2, length:3 +Found:Indirect-related BITconfig:ID:1507, bitoffs:4, length:5 +Found:Indirect-related BITconfig:ID:1507, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1507, bitoffs:8, length:9 +Found:Indirect-related BITconfig:ID:1507, bitoffs:10, length:11 +Found:Indirect-related BITconfig:ID:1507, bitoffs:12, length:13 +Found:Indirect-related BITconfig:ID:1507, bitoffs:14, length:15 +Found:Indirect-related BITconfig:ID:1507, bitoffs:16, length:17 +Found:Indirect-related BITconfig:ID:1507, bitoffs:18, length:19 +Found:Indirect-related BITconfig:ID:1507, bitoffs:20, length:21 +Found:Indirect-related BITconfig:ID:1507, bitoffs:22, length:23 +Found:Indirect-related BITconfig:ID:1507, bitoffs:24, length:25 +Found:Indirect-related BITconfig:ID:1507, bitoffs:26, length:27 +Found:Indirect-related BITconfig:ID:1507, bitoffs:28, length:29 +Found:Indirect-related BITconfig:ID:1507, bitoffs:30, length:31 +Found:Indirect-related BITconfig:ID:1508, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1508, bitoffs:2, length:3 +Found:Indirect-related BITconfig:ID:1508, bitoffs:4, length:5 +Found:Indirect-related BITconfig:ID:1508, bitoffs:6, length:7 +Found:Indirect-related BITconfig:ID:1508, bitoffs:8, length:9 +Found:Indirect-related BITconfig:ID:1508, bitoffs:10, length:11 +Found:Indirect-related BITconfig:ID:1508, bitoffs:12, length:13 +Found:Indirect-related BITconfig:ID:1508, bitoffs:14, length:15 +Found:Indirect-related BITconfig:ID:1508, bitoffs:16, length:17 +Found:Indirect-related BITconfig:ID:1508, bitoffs:18, length:19 +Found:Indirect-related BITconfig:ID:1508, bitoffs:20, length:21 +Found:Indirect-related BITconfig:ID:1508, bitoffs:22, length:23 +Found:Indirect-related BITconfig:ID:1508, bitoffs:24, length:25 +Found:Indirect-related BITconfig:ID:1508, bitoffs:26, length:27 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:992 +Hidden child:7 +INTERFACE:993 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related BITconfig:ID:1776, bitoffs:16, length:19 +Found:Related BITconfig:ID:1776, bitoffs:20, length:23 +Found:Related BITconfig:ID:1776, bitoffs:24, length:27 +Found:Related BITconfig:ID:1776, bitoffs:28, length:31 +Found:Related BITconfig:ID:1851, bitoffs:0, length:3 +Found:Related BITconfig:ID:1851, bitoffs:4, length:7 +Found:Related BITconfig:ID:1851, bitoffs:8, length:11 +Found:Related BITconfig:ID:1851, bitoffs:12, length:15 +Found:Related BITconfig:ID:1851, bitoffs:16, length:19 +Found:Related BITconfig:ID:1851, bitoffs:20, length:23 +Found:Related BITconfig:ID:1851, bitoffs:24, length:27 +Found:Related BITconfig:ID:1851, bitoffs:28, length:31 +Found:Related GlobalIntVar(ButtonGraphics):1184 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalIntVar(ButtonGraphics):1186 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1779, bitoffs:3, length:6 +Hidden child:23 +Hidden child:44 +Hidden child:86 +Hidden child:137 +Hidden child:191 +Hidden child:261 +INTERFACE:994 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:41 +Hidden child:43 +Hidden child:45 +Hidden child:47 +Hidden child:49 +Hidden child:51 +Hidden child:53 +Hidden child:55 +Hidden child:57 +Hidden child:59 +Hidden child:61 +Hidden child:63 +Hidden child:65 +Hidden child:67 +Hidden child:69 +Hidden child:71 +INTERFACE:995 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:39 +Hidden child:57 +Hidden child:73 +Hidden child:90 +Hidden child:107 +Hidden child:125 +INTERFACE:996 +Hidden child:0 +Hidden child:4 +INTERFACE:997 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:7 +INTERFACE:998 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:7 +INTERFACE:999 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:8 +Hidden child:16 +Hidden child:21 +Hidden child:27 +Hidden child:32 +Hidden child:37 +INTERFACE:1000 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1038 +Found:Indirect-related GlobalIntVar(ButtonGraphics):192 +Found:Indirect-related BITconfig:ID:638, bitoffs:17, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1324 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1856, bitoffs:25, length:31 +Found:Indirect-related BITconfig:ID:1856, bitoffs:5, length:9 +Found:Indirect-related BITconfig:ID:1856, bitoffs:15, length:19 +Found:Indirect-related BITconfig:ID:1856, bitoffs:10, length:14 +Found:Related BITconfig:ID:1856, bitoffs:0, length:4 +Hidden child:150 +INTERFACE:1001 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1038 +Found:Indirect-related GlobalIntVar(ButtonGraphics):192 +Found:Indirect-related BITconfig:ID:638, bitoffs:17, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1324 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1856, bitoffs:25, length:31 +Found:Indirect-related BITconfig:ID:1856, bitoffs:5, length:9 +Found:Indirect-related BITconfig:ID:1856, bitoffs:10, length:14 +Found:Indirect-related BITconfig:ID:1856, bitoffs:15, length:19 +Found:Related BITconfig:ID:1856, bitoffs:0, length:4 +Hidden child:146 +INTERFACE:1002 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1038 +Found:Indirect-related GlobalIntVar(ButtonGraphics):192 +Found:Indirect-related BITconfig:ID:638, bitoffs:17, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1324 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1856, bitoffs:25, length:31 +Found:Indirect-related BITconfig:ID:1856, bitoffs:5, length:9 +Found:Indirect-related BITconfig:ID:1856, bitoffs:10, length:14 +Found:Indirect-related BITconfig:ID:1856, bitoffs:15, length:19 +Found:Related BITconfig:ID:1856, bitoffs:0, length:4 +Hidden child:142 +INTERFACE:1003 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1038 +Found:Indirect-related GlobalIntVar(ButtonGraphics):192 +Found:Indirect-related BITconfig:ID:638, bitoffs:17, length:17 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1324 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1856, bitoffs:25, length:31 +Found:Indirect-related BITconfig:ID:1856, bitoffs:15, length:19 +Found:Indirect-related BITconfig:ID:1856, bitoffs:10, length:14 +Found:Indirect-related BITconfig:ID:1856, bitoffs:5, length:9 +Found:Related BITconfig:ID:1856, bitoffs:0, length:4 +Hidden child:154 +INTERFACE:1004 +Found:Related GlobalIntVar(ButtonGraphics):1327 +Found:Related GlobalIntVar(ButtonGraphics):1326 +Found:Related GlobalIntVar(ButtonGraphics):1330 +Found:Related GlobalIntVar(ButtonGraphics):1325 +Found:Related GlobalIntVar(ButtonGraphics):1328 +Found:Related GlobalIntVar(ButtonGraphics):1329 +Found:Related GlobalIntVar(ButtonGraphics):1331 +Hidden child:63 +Hidden child:64 +Hidden child:65 +Hidden child:66 +Hidden child:75 +INTERFACE:1005 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1006 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related GlobalIntVar(ButtonGraphics):1336 +Found:Related GlobalIntVar(ButtonGraphics):1337 +Found:Related GlobalIntVar(ButtonGraphics):1338 +Found:Related GlobalIntVar(ButtonGraphics):1339 +Found:Related GlobalIntVar(ButtonGraphics):1340 +Found:Related GlobalIntVar(ButtonGraphics):1341 +Found:Related GlobalIntVar(ButtonGraphics):1342 +Found:Related GlobalIntVar(ButtonGraphics):1343 +Found:Related GlobalIntVar(ButtonGraphics):1344 +Found:Related GlobalIntVar(ButtonGraphics):1345 +Found:Related GlobalIntVar(ButtonGraphics):1346 +Found:Related GlobalIntVar(ButtonGraphics):1347 +Found:Related GlobalIntVar(ButtonGraphics):1348 +Found:Related GlobalIntVar(ButtonGraphics):1349 +Found:Related GlobalIntVar(ButtonGraphics):1350 +Found:Related GlobalIntVar(ButtonGraphics):1605 +Found:Related GlobalIntVar(ButtonGraphics):1351 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +INTERFACE:1007 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1352 +INTERFACE:1008 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1874, bitoffs:7, length:7 +INTERFACE:1009 +Found:Related config:1875 +INTERFACE:1010 +Found:Related BITconfig:ID:1870, bitoffs:1, length:1 +Found:Related BITconfig:ID:1870, bitoffs:2, length:2 +Found:Related GlobalIntVar(ButtonGraphics):1361 +Found:Related GlobalIntVar(ButtonGraphics):1363 +Found:Related GlobalIntVar(ButtonGraphics):1391 +Found:Related GlobalIntVar(ButtonGraphics):1364 +Hidden child:7 +Hidden child:24 +Hidden child:32 +Hidden child:33 +INTERFACE:1011 +Found:Related config:1875 +Found:Related BITconfig:ID:719, bitoffs:0, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1178, bitoffs:1, length:10 +Hidden child:48 +Hidden child:69 +Hidden child:70 +Hidden child:71 +Hidden child:386 +INTERFACE:1012 +Found:Related GlobalIntVar(ButtonGraphics):1372 +Found:Related GlobalIntVar(ButtonGraphics):1373 +Found:Related GlobalIntVar(ButtonGraphics):1374 +Found:Related GlobalIntVar(ButtonGraphics):1375 +Found:Related GlobalIntVar(ButtonGraphics):1376 +Found:Related GlobalIntVar(ButtonGraphics):1377 +Found:Related GlobalIntVar(ButtonGraphics):1367 +Found:Related GlobalIntVar(ButtonGraphics):1368 +Found:Related GlobalIntVar(ButtonGraphics):1369 +Found:Related GlobalIntVar(ButtonGraphics):1370 +Found:Related GlobalIntVar(ButtonGraphics):1371 +Hidden child:7 +Hidden child:14 +Hidden child:20 +Hidden child:30 +INTERFACE:1013 +Found:Related GlobalIntVar(ButtonGraphics):1353 +Found:Related GlobalIntVar(ButtonGraphics):1359 +Found:Related GlobalIntVar(ButtonGraphics):1360 +Found:Related GlobalIntVar(ButtonGraphics):1354 +Found:Related GlobalIntVar(ButtonGraphics):1357 +Found:Related GlobalIntVar(ButtonGraphics):1358 +Found:Related GlobalIntVar(ButtonGraphics):1355 +Found:Related GlobalIntVar(ButtonGraphics):1356 +Found:Related BITconfig:ID:1870, bitoffs:1, length:1 +Found:Related GlobalIntVar(ButtonGraphics):1363 +Found:Related GlobalIntVar(ButtonGraphics):1389 +Found:Related GlobalIntVar(ButtonGraphics):1390 +Found:Related BITconfig:ID:1870, bitoffs:2, length:2 +Found:Related GlobalIntVar(ButtonGraphics):1362 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +INTERFACE:1014 +INTERFACE:1015 +Found:Related BITconfig:ID:1870, bitoffs:9, length:18 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1870, bitoffs:29, length:31 +Found:Related BITconfig:ID:1874, bitoffs:9, length:12 +Found:Related BITconfig:ID:1874, bitoffs:13, length:16 +Found:Related BITconfig:ID:1874, bitoffs:17, length:20 +Found:Related BITconfig:ID:1874, bitoffs:21, length:24 +Found:Indirect-related BITconfig:ID:1870, bitoffs:1, length:1 +Found:Related BITconfig:ID:1870, bitoffs:5, length:8 +Found:Related BITconfig:ID:1871, bitoffs:24, length:27 +Found:Related BITconfig:ID:1871, bitoffs:28, length:31 +Found:Related BITconfig:ID:1872, bitoffs:24, length:27 +Found:Related BITconfig:ID:1872, bitoffs:28, length:31 +Found:Related BITconfig:ID:1873, bitoffs:12, length:15 +Found:Related BITconfig:ID:1873, bitoffs:16, length:19 +Found:Related BITconfig:ID:1873, bitoffs:20, length:23 +Found:Related BITconfig:ID:1873, bitoffs:24, length:27 +Found:Related BITconfig:ID:1873, bitoffs:28, length:31 +Found:Related BITconfig:ID:1874, bitoffs:0, length:3 +Hidden child:23 +Hidden child:33 +Hidden child:48 +Hidden child:49 +Hidden child:55 +Hidden child:78 +Hidden child:84 +Hidden child:90 +Hidden child:96 +Hidden child:115 +Hidden child:116 +INTERFACE:1016 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1877, bitoffs:7, length:9 +INTERFACE:1017 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related BITconfig:ID:1871, bitoffs:24, length:27 +Found:Indirect-related BITconfig:ID:1871, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1872, bitoffs:24, length:27 +Found:Indirect-related BITconfig:ID:1872, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1873, bitoffs:12, length:15 +Found:Indirect-related BITconfig:ID:1873, bitoffs:16, length:19 +Found:Indirect-related BITconfig:ID:1873, bitoffs:20, length:23 +Found:Indirect-related BITconfig:ID:1873, bitoffs:24, length:27 +Found:Indirect-related BITconfig:ID:1873, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1874, bitoffs:0, length:3 +Found:Related BITconfig:ID:1871, bitoffs:0, length:5 +Found:Related BITconfig:ID:1871, bitoffs:6, length:11 +Found:Related BITconfig:ID:1871, bitoffs:12, length:17 +Found:Related BITconfig:ID:1871, bitoffs:18, length:23 +Found:Related BITconfig:ID:1872, bitoffs:0, length:5 +Found:Related BITconfig:ID:1872, bitoffs:6, length:11 +Found:Related BITconfig:ID:1872, bitoffs:12, length:17 +Found:Related BITconfig:ID:1872, bitoffs:18, length:23 +Found:Related BITconfig:ID:1873, bitoffs:0, length:5 +Found:Related BITconfig:ID:1873, bitoffs:6, length:11 +Found:Related GlobalIntVar(ButtonGraphics):1387 +Found:Indirect-related BITconfig:ID:1870, bitoffs:1, length:1 +Hidden child:19 +Hidden child:226 +INTERFACE:1018 +INTERFACE:1019 +Found:Related BITconfig:ID:1874, bitoffs:7, length:7 +Hidden child:14 +INTERFACE:1020 +INTERFACE:1021 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1877, bitoffs:7, length:9 +INTERFACE:1022 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1877, bitoffs:7, length:9 +Hidden child:31 +INTERFACE:1023 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1877, bitoffs:7, length:9 +Hidden child:12 +Hidden child:19 +Hidden child:33 +INTERFACE:1024 +Found:Related BITconfig:ID:1874, bitoffs:9, length:12 +Found:Related BITconfig:ID:1874, bitoffs:13, length:16 +Found:Related BITconfig:ID:1874, bitoffs:17, length:20 +Found:Related BITconfig:ID:1874, bitoffs:21, length:24 +Found:Related BITconfig:ID:1870, bitoffs:19, length:28 +Found:Related GlobalIntVar(ButtonGraphics):1388 +Found:Related GlobalIntVar(ButtonGraphics):1378 +Found:Related GlobalIntVar(ButtonGraphics):1379 +Found:Related GlobalIntVar(ButtonGraphics):1380 +Found:Related GlobalIntVar(ButtonGraphics):1386 +Found:Related GlobalIntVar(ButtonGraphics):1381 +Found:Related GlobalIntVar(ButtonGraphics):1383 +Found:Related GlobalIntVar(ButtonGraphics):1384 +Found:Related GlobalIntVar(ButtonGraphics):1385 +Found:Related GlobalIntVar(ButtonGraphics):1382 +Hidden child:2 +Hidden child:12 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:45 +Hidden child:46 +Hidden child:47 +Hidden child:62 +Hidden child:63 +Hidden child:64 +Hidden child:79 +Hidden child:80 +Hidden child:81 +Hidden child:85 +INTERFACE:1025 +Found:Related GlobalIntVar(ButtonGraphics):1387 +INTERFACE:1026 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1870, bitoffs:0, length:0 +INTERFACE:1027 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1365 +Found:Related GlobalIntVar(ButtonGraphics):1366 +INTERFACE:1028 +Found:Indirect-related BITconfig:ID:1158, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1363, bitoffs:13, length:13 +Found:Indirect-related GlobalIntVar(ButtonGraphics):543 +Found:Indirect-related GlobalIntVar(ButtonGraphics):196 +Found:Indirect-related GlobalIntVar(ButtonGraphics):197 +Found:Related BITconfig:ID:1363, bitoffs:12, length:12 +Found:Related BITconfig:ID:1158, bitoffs:0, length:4 +Found:Related BITconfig:ID:1363, bitoffs:0, length:2 +Found:Related BITconfig:ID:1363, bitoffs:6, length:8 +Found:Related GlobalIntVar(ButtonGraphics):86 +Found:Related GlobalIntVar(ButtonGraphics):1020 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1019 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1008 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1015 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1009 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1010 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1016 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1013 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1017 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1014 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1018 +Found:Indirect-related GlobalIntVar(ButtonGraphics):773 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):174 +Found:Indirect-related GlobalIntVar(ButtonGraphics):175 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1099 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1407 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1408 +Found:Indirect-related GlobalStringVar(InfoString):122 +Found:Indirect-related GlobalStringVar(InfoString):326 +Found:Indirect-related GlobalStringVar(InfoString):124 +Found:Indirect-related GlobalStringVar(InfoString):125 +Found:Indirect-related GlobalStringVar(InfoString):123 +Found:Indirect-related GlobalStringVar(InfoString):327 +Found:Indirect-related GlobalStringVar(InfoString):328 +Found:Indirect-related GlobalStringVar(InfoString):329 +Hidden child:37 +Hidden child:48 +Hidden child:49 +Hidden child:50 +Hidden child:51 +Hidden child:52 +Hidden child:53 +Hidden child:54 +Hidden child:55 +Hidden child:56 +Hidden child:57 +Hidden child:58 +Hidden child:59 +Hidden child:60 +Hidden child:61 +Hidden child:62 +Hidden child:63 +Hidden child:64 +Hidden child:65 +Hidden child:66 +Hidden child:67 +Hidden child:68 +Hidden child:69 +Hidden child:70 +Hidden child:71 +Hidden child:83 +Hidden child:84 +Hidden child:85 +Hidden child:86 +Hidden child:87 +Hidden child:88 +Hidden child:89 +Hidden child:90 +Hidden child:115 +Hidden child:116 +Hidden child:117 +Hidden child:125 +Hidden child:156 +Hidden child:164 +Hidden child:176 +Hidden child:183 +INTERFACE:1029 +INTERFACE:1030 +INTERFACE:1031 +INTERFACE:1032 +INTERFACE:1033 +INTERFACE:1034 +INTERFACE:1035 +INTERFACE:1036 +INTERFACE:1037 +INTERFACE:1038 +INTERFACE:1039 +INTERFACE:1040 +INTERFACE:1041 +INTERFACE:1042 +INTERFACE:1043 +INTERFACE:1044 +INTERFACE:1045 +INTERFACE:1046 +INTERFACE:1047 +INTERFACE:1048 +INTERFACE:1049 +INTERFACE:1050 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related config:532 +Found:Related config:118 +Found:Indirect-related BITconfig:ID:1073, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1081, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1073, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1072, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1071, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:678, bitoffs:11, length:20 +Found:Indirect-related BITconfig:ID:1023, bitoffs:15, length:16 +Found:Indirect-related BITconfig:ID:1181, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:705, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:678, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:997, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:2051, bitoffs:0, length:8 +Found:Indirect-related config:130 +Found:Indirect-related config:29 +Found:Indirect-related config:31 +Found:Indirect-related config:176 +Found:Indirect-related config:32 +Found:Indirect-related config:160 +Found:Indirect-related config:122 +Found:Indirect-related config:71 +Found:Indirect-related config:273 +Found:Indirect-related config:107 +Found:Indirect-related config:63 +Found:Indirect-related config:145 +Found:Indirect-related config:146 +Found:Indirect-related config:293 +Found:Indirect-related config:68 +Found:Indirect-related config:655 +Found:Indirect-related config:10 +Found:Indirect-related config:399 +Found:Indirect-related config:314 +Found:Indirect-related config:131 +Found:Indirect-related config:80 +Found:Indirect-related config:0 +Found:Indirect-related config:335 +Found:Indirect-related config:299 +Found:Indirect-related config:148 +Found:Indirect-related config:17 +Found:Indirect-related config:11 +Found:Indirect-related config:347 +Found:Indirect-related config:65 +Found:Indirect-related config:180 +Found:Indirect-related config:150 +Found:Indirect-related config:382 +Found:Indirect-related config:223 +Found:Indirect-related config:188 +Found:Indirect-related config:5 +Found:Indirect-related config:387 +Found:Indirect-related config:175 +Found:Indirect-related config:139 +Found:Indirect-related config:147 +Found:Indirect-related config:14 +Found:Indirect-related config:365 +Found:Indirect-related config:30 +Found:Indirect-related config:517 +Found:Indirect-related config:192 +Found:Indirect-related config:307 +Found:Indirect-related config:112 +Found:Indirect-related config:416 +Found:Indirect-related config:165 +Found:Indirect-related config:302 +Found:Indirect-related config:328 +Found:Indirect-related config:402 +Found:Indirect-related config:600 +Found:Indirect-related config:76 +Found:Indirect-related config:159 +Found:Indirect-related config:339 +Found:Indirect-related config:60 +Found:Indirect-related config:116 +Found:Indirect-related config:320 +Found:Indirect-related config:26 +Found:Indirect-related config:359 +Found:Indirect-related config:197 +Found:Indirect-related config:226 +Found:Indirect-related config:111 +Found:Indirect-related config:200 +Found:Indirect-related config:385 +Found:Indirect-related config:317 +Found:Indirect-related config:161 +Found:Indirect-related config:162 +Found:Indirect-related config:212 +Found:Indirect-related config:980 +Found:Indirect-related BITconfig:ID:222, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:62, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:178, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:939, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:433, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:964, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:455, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:400, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:869, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:794, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:440, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:622, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:934, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:896, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:641, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:912, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:844, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:671, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:810, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:435, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:521, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:553, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:408, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:482, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:437, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:635, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:351, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:445, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:465, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:823, bitoffs:0, length:19 +Found:Indirect-related BITconfig:ID:604, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:423, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:574, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:905, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:714, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:607, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:496, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:730, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:874, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:602, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:709, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:616, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:723, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:568, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:449, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:571, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:968, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:970, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:977, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:992, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:994, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1003, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1016, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1049, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1063, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1077, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1094, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1165, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1178, bitoffs:1, length:10 +Found:Indirect-related BITconfig:ID:1184, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1190, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1204, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1218, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1225, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1227, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1232, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1236, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1271, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1274, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1282, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1306, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1311, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1330, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1370, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1365, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1403, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1407, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1415, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1475, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1577, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1420, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1390, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1327, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:714, bitoffs:3, length:6 +Found:Indirect-related BITconfig:ID:1819, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1498, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:1558, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1600, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1588, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1610, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1811, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1849, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1646, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1844, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1834, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1861, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2037, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1906, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1889, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2217, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2020, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2046, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:2079, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2208, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2234, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2376, bitoffs:0, length:7 +Found:Indirect-related config:322 +Found:Indirect-related GlobalIntVar(ButtonGraphics):946 +Found:Indirect-related GlobalIntVar(ButtonGraphics):947 +Found:Indirect-related GlobalIntVar(ButtonGraphics):948 +Found:Indirect-related GlobalIntVar(ButtonGraphics):949 +Found:Indirect-related GlobalIntVar(ButtonGraphics):950 +Found:Indirect-related GlobalIntVar(ButtonGraphics):951 +Found:Indirect-related GlobalIntVar(ButtonGraphics):952 +Found:Indirect-related GlobalIntVar(ButtonGraphics):953 +Found:Indirect-related GlobalIntVar(ButtonGraphics):954 +Found:Indirect-related GlobalIntVar(ButtonGraphics):955 +Found:Indirect-related GlobalIntVar(ButtonGraphics):956 +Found:Indirect-related GlobalIntVar(ButtonGraphics):957 +Found:Indirect-related GlobalIntVar(ButtonGraphics):958 +Found:Indirect-related GlobalIntVar(ButtonGraphics):959 +Found:Indirect-related GlobalIntVar(ButtonGraphics):960 +Found:Indirect-related GlobalIntVar(ButtonGraphics):961 +Found:Indirect-related GlobalIntVar(ButtonGraphics):962 +Found:Indirect-related GlobalIntVar(ButtonGraphics):963 +Found:Indirect-related GlobalIntVar(ButtonGraphics):964 +Found:Indirect-related GlobalIntVar(ButtonGraphics):965 +Found:Indirect-related GlobalIntVar(ButtonGraphics):966 +Found:Indirect-related GlobalIntVar(ButtonGraphics):967 +Found:Indirect-related GlobalIntVar(ButtonGraphics):968 +Found:Indirect-related GlobalIntVar(ButtonGraphics):969 +Found:Indirect-related GlobalIntVar(ButtonGraphics):970 +Found:Indirect-related GlobalIntVar(ButtonGraphics):971 +Found:Indirect-related GlobalIntVar(ButtonGraphics):972 +Found:Indirect-related GlobalIntVar(ButtonGraphics):973 +Found:Indirect-related GlobalIntVar(ButtonGraphics):974 +Found:Indirect-related GlobalIntVar(ButtonGraphics):975 +Found:Indirect-related GlobalIntVar(ButtonGraphics):976 +Found:Indirect-related GlobalIntVar(ButtonGraphics):977 +Found:Indirect-related GlobalIntVar(ButtonGraphics):978 +Found:Indirect-related GlobalIntVar(ButtonGraphics):979 +Found:Indirect-related GlobalIntVar(ButtonGraphics):980 +Found:Indirect-related GlobalIntVar(ButtonGraphics):981 +Found:Indirect-related GlobalIntVar(ButtonGraphics):982 +Found:Indirect-related GlobalIntVar(ButtonGraphics):983 +Found:Indirect-related GlobalIntVar(ButtonGraphics):984 +Found:Indirect-related GlobalIntVar(ButtonGraphics):985 +Hidden child:20 +Hidden child:21 +INTERFACE:1051 +Found:Related config:1652 +Found:Related config:1653 +Found:Related config:1654 +INTERFACE:1052 +Found:Related config:1893 +Found:Related config:1890 +Found:Related config:1891 +Found:Related config:1892 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:122 +Hidden child:123 +Hidden child:124 +Hidden child:125 +Hidden child:126 +Hidden child:127 +Hidden child:128 +Hidden child:129 +Hidden child:130 +Hidden child:131 +Hidden child:132 +Hidden child:133 +INTERFACE:1053 +Found:Related config:1893 +Found:Related config:1890 +Found:Related config:1891 +Found:Related config:1892 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:70 +Hidden child:71 +Hidden child:72 +Hidden child:73 +Hidden child:74 +Hidden child:75 +Hidden child:76 +Hidden child:77 +Hidden child:78 +Hidden child:79 +Hidden child:80 +Hidden child:81 +Hidden child:93 +INTERFACE:1054 +Hidden child:46 +Hidden child:47 +Hidden child:48 +Hidden child:49 +Hidden child:50 +Hidden child:51 +Hidden child:52 +Hidden child:53 +INTERFACE:1055 +Found:Related GlobalIntVar(ButtonGraphics):1427 +Found:Related config:281 +Found:Related GlobalIntVar(ButtonGraphics):1429 +Found:Related GlobalIntVar(ButtonGraphics):1425 +Found:Related GlobalIntVar(ButtonGraphics):1426 +Hidden child:1 +Hidden child:12 +INTERFACE:1056 +Found:Related config:281 +Found:Related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related BITconfig:ID:1960, bitoffs:19, length:21 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Related BITconfig:ID:1960, bitoffs:0, length:6 +Found:Related BITconfig:ID:1963, bitoffs:12, length:24 +Found:Related BITconfig:ID:1964, bitoffs:0, length:11 +Found:Related BITconfig:ID:1964, bitoffs:12, length:24 +Found:Related BITconfig:ID:1965, bitoffs:0, length:11 +Found:Related BITconfig:ID:1965, bitoffs:12, length:24 +Found:Related BITconfig:ID:1255, bitoffs:0, length:1 +Found:Related BITconfig:ID:1261, bitoffs:0, length:2 +Found:Related BITconfig:ID:1960, bitoffs:7, length:18 +Found:Indirect-related BITconfig:ID:1562, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1562, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1562, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1562, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1562, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1562, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1562, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1562, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1562, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1562, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1562, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1562, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1562, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1562, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1562, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1562, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1562, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1562, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1562, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1562, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1562, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1562, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1562, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1563, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1563, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1563, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1563, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1563, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1563, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1563, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1563, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1563, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1563, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1563, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1563, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1563, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1563, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1563, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1563, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1564, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1564, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1564, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1564, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1564, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1564, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1564, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1564, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1564, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1564, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1564, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1564, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1564, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1564, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1564, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1564, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1564, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1565, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1565, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1565, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1565, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1565, bitoffs:5, length:10 +Found:Indirect-related BITconfig:ID:1256, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1256, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1256, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1256, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1256, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1256, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1256, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1256, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1256, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1256, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1256, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1256, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1256, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1256, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1256, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1256, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1256, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1256, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1256, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1256, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1256, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1256, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1256, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1257, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1257, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1257, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1257, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1257, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1257, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1257, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1257, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1257, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1257, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1257, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1257, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1257, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1257, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1257, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1257, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1257, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1257, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1257, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1258, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1258, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1258, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1258, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1258, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1258, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1258, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1258, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1258, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1258, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1258, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1258, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1886, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1886, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1886, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1886, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1886, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1886, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1886, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1360, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1360, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1360, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1360, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1360, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1360, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1360, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1360, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1360, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1360, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1360, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1360, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1360, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1360, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1360, bitoffs:18, length:19 +Found:Indirect-related BITconfig:ID:1360, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1360, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1361, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1360, bitoffs:23, length:24 +Found:Indirect-related BITconfig:ID:1360, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1360, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1360, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1360, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1360, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1360, bitoffs:30, length:30 +Found:Indirect-related BITconfig:ID:1360, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1361, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1361, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1361, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1361, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1361, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1361, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1360, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1361, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1361, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1361, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1361, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1361, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1361, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1361, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1361, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1361, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1361, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1361, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1358, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1358, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1358, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1358, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1358, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1358, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1358, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1358, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1358, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1358, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1358, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1358, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1358, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1358, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1358, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1358, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1358, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1358, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1358, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1358, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1358, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1358, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1358, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1358, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1358, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1358, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1358, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1358, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1358, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1358, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:2088, bitoffs:18, length:21 +Found:Indirect-related BITconfig:ID:1359, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1359, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1359, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1359, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1359, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1359, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1359, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1359, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1359, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1000, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1000, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1000, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1000, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1000, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1000, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1000, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1000, bitoffs:9, length:11 +Found:Indirect-related BITconfig:ID:1000, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1000, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1001, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1001, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1001, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1001, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1001, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1001, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1001, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1001, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1001, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1001, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1001, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1001, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1001, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1001, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1001, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1001, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1001, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1001, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1001, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1002, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1002, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1002, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1002, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1002, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1002, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1002, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1002, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1002, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1002, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1000, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1000, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1000, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1000, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1000, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1000, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1000, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1000, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1372, bitoffs:4, length:6 +Found:Indirect-related BITconfig:ID:1372, bitoffs:7, length:8 +Found:Indirect-related BITconfig:ID:1372, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1372, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1372, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1372, bitoffs:12, length:14 +Found:Indirect-related BITconfig:ID:1372, bitoffs:15, length:17 +Found:Indirect-related BITconfig:ID:1372, bitoffs:18, length:20 +Found:Indirect-related BITconfig:ID:1372, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1372, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1372, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1372, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1372, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1372, bitoffs:30, length:30 +Found:Indirect-related BITconfig:ID:1372, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1373, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1373, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1373, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1373, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1373, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1373, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1373, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1373, bitoffs:10, length:11 +Found:Indirect-related BITconfig:ID:1373, bitoffs:12, length:15 +Found:Indirect-related BITconfig:ID:1373, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1373, bitoffs:17, length:19 +Found:Indirect-related BITconfig:ID:1373, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1373, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1373, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1373, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1373, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1373, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1374, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1374, bitoffs:3, length:5 +Found:Indirect-related BITconfig:ID:1374, bitoffs:6, length:8 +Found:Indirect-related BITconfig:ID:1887, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1887, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1887, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1887, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1887, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1071, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1071, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1071, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1071, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1071, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1071, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1071, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1071, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1071, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1071, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1071, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1071, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1071, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1071, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1071, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1071, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1071, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1071, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1071, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1071, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1072, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1072, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1072, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1072, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1072, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1072, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:1072, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1072, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1072, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1072, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1072, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1072, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1072, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1072, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1072, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1072, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1072, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1072, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1072, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1072, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1073, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1073, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1073, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1073, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1073, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1073, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1073, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1073, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1073, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1073, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1073, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1073, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1073, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1073, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1073, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1073, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1073, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1073, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1073, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1073, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1073, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1073, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1956, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1956, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1956, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1956, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1956, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1956, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1956, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1956, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1956, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1956, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1956, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1956, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1956, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1956, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1956, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1956, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1956, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1956, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1956, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1956, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1956, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1956, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1956, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1956, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1956, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1956, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1956, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1956, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1956, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1956, bitoffs:30, length:30 +Found:Indirect-related BITconfig:ID:1956, bitoffs:31, length:31 +Found:Indirect-related BITconfig:ID:1957, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1957, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1957, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1957, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:1957, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:1957, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:1957, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:1957, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1957, bitoffs:8, length:8 +Found:Indirect-related BITconfig:ID:1957, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1957, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1957, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:1957, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:1957, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1957, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1957, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:1957, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:1957, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1957, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1957, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:1957, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:1957, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1957, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1957, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1957, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1957, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:1957, bitoffs:24, length:24 +Found:Indirect-related BITconfig:ID:1957, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:2082, bitoffs:5, length:6 +Found:Indirect-related BITconfig:ID:2082, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:2082, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:2082, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:2082, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:2082, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:2082, bitoffs:2, length:3 +Found:Indirect-related BITconfig:ID:2082, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:2082, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:2082, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:2082, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:2082, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:2082, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:2082, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:2082, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1957, bitoffs:28, length:28 +Found:Indirect-related BITconfig:ID:1957, bitoffs:29, length:29 +Found:Indirect-related BITconfig:ID:1957, bitoffs:30, length:30 +Found:Indirect-related BITconfig:ID:1957, bitoffs:31, length:31 +Found:Indirect-related config:63 +Found:Indirect-related config:165 +Found:Indirect-related config:68 +Found:Indirect-related config:180 +Found:Indirect-related config:30 +Found:Indirect-related config:212 +Found:Indirect-related config:159 +Found:Indirect-related config:139 +Found:Indirect-related config:365 +Found:Indirect-related config:492 +Found:Indirect-related config:107 +Found:Indirect-related config:29 +Found:Indirect-related config:176 +Found:Indirect-related config:122 +Found:Indirect-related config:347 +Found:Indirect-related config:76 +Found:Indirect-related config:116 +Found:Indirect-related config:175 +Found:Indirect-related config:320 +Found:Indirect-related config:150 +Found:Indirect-related config:192 +Found:Indirect-related config:416 +Found:Indirect-related config:148 +Found:Indirect-related config:101 +Found:Indirect-related config:111 +Found:Indirect-related config:451 +Found:Indirect-related config:1199 +Found:Indirect-related config:302 +Found:Indirect-related config:339 +Found:Indirect-related config:273 +Found:Indirect-related BITconfig:ID:977, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1303, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1178, bitoffs:1, length:10 +Found:Indirect-related BITconfig:ID:810, bitoffs:9, length:9 +Found:Indirect-related BITconfig:ID:1204, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:912, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:635, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1274, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:823, bitoffs:0, length:19 +Found:Indirect-related BITconfig:ID:1077, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:313, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:1190, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:177, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:553, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:571, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:607, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:496, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:874, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1577, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:77, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1023, bitoffs:17, length:18 +Found:Indirect-related BITconfig:ID:1023, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:730, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1023, bitoffs:15, length:16 +Found:Indirect-related BITconfig:ID:1023, bitoffs:11, length:12 +Found:Indirect-related BITconfig:ID:1588, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1330, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:299, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1050, bitoffs:1, length:4 +Found:Indirect-related BITconfig:ID:992, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:802, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:802, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:802, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:802, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:709, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1010, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:440, bitoffs:0, length:14 +Found:Indirect-related BITconfig:ID:1600, bitoffs:0, length:3 +Found:Indirect-related BITconfig:ID:1282, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:449, bitoffs:22, length:31 +Found:Indirect-related BITconfig:ID:1303, bitoffs:16, length:19 +Found:Indirect-related BITconfig:ID:1303, bitoffs:10, length:15 +Found:Indirect-related BITconfig:ID:1386, bitoffs:18, length:19 +Found:Indirect-related BITconfig:ID:1289, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1289, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:1289, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:714, bitoffs:3, length:6 +Found:Indirect-related BITconfig:ID:1242, bitoffs:1, length:31 +Found:Indirect-related BITconfig:ID:1049, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1261, bitoffs:3, length:4 +Found:Indirect-related config:131 +Found:Indirect-related config:223 +Found:Indirect-related config:14 +Found:Indirect-related config:112 +Found:Indirect-related config:145 +Found:Indirect-related config:146 +Found:Indirect-related config:26 +Found:Indirect-related BITconfig:ID:1311, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:222, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1403, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:705, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:604, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:568, bitoffs:0, length:6 +Found:Indirect-related config:2068 +Found:Indirect-related config:450 +Found:Indirect-related config:130 +Found:Indirect-related config:31 +Found:Indirect-related config:32 +Found:Indirect-related config:160 +Found:Indirect-related config:71 +Found:Indirect-related config:293 +Found:Indirect-related config:655 +Found:Indirect-related config:10 +Found:Indirect-related config:399 +Found:Indirect-related config:314 +Found:Indirect-related config:80 +Found:Indirect-related config:0 +Found:Indirect-related config:335 +Found:Indirect-related config:299 +Found:Indirect-related config:17 +Found:Indirect-related config:11 +Found:Indirect-related config:65 +Found:Indirect-related config:382 +Found:Indirect-related config:188 +Found:Indirect-related config:5 +Found:Indirect-related config:387 +Found:Indirect-related config:147 +Found:Indirect-related config:517 +Found:Indirect-related config:307 +Found:Indirect-related config:328 +Found:Indirect-related config:402 +Found:Indirect-related config:600 +Found:Indirect-related config:60 +Found:Indirect-related config:359 +Found:Indirect-related config:197 +Found:Indirect-related config:226 +Found:Indirect-related config:200 +Found:Indirect-related config:385 +Found:Indirect-related config:317 +Found:Indirect-related config:161 +Found:Indirect-related config:162 +Found:Indirect-related config:980 +Found:Indirect-related BITconfig:ID:62, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:178, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:939, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:433, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:964, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:455, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:400, bitoffs:23, length:23 +Found:Indirect-related BITconfig:ID:869, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:794, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:622, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:934, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:896, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:641, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:844, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:671, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:810, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:435, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:521, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:408, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:482, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:437, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:351, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:445, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:465, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:423, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:574, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:905, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:714, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:678, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:602, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:616, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:723, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:449, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:968, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:970, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:994, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:997, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1003, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1016, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1063, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1094, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1165, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1184, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1218, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1225, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1227, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1232, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1236, bitoffs:0, length:10 +Found:Indirect-related BITconfig:ID:1271, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1306, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1370, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1365, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1407, bitoffs:0, length:9 +Found:Indirect-related BITconfig:ID:1415, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1475, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1420, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1390, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1327, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1819, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:1498, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:1558, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:1610, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1811, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1849, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1646, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1844, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1834, bitoffs:28, length:31 +Found:Indirect-related BITconfig:ID:1861, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2037, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1906, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1889, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2217, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2020, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2046, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:2051, bitoffs:0, length:8 +Found:Indirect-related BITconfig:ID:2079, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2208, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:2234, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2376, bitoffs:0, length:7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1425 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1421 +Found:Related GlobalIntVar(ButtonGraphics):1428 +Found:Indirect-related BITconfig:ID:1958, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1958, bitoffs:12, length:23 +Found:Indirect-related BITconfig:ID:2083, bitoffs:7, length:7 +Found:Indirect-related BITconfig:ID:1960, bitoffs:22, length:24 +Found:Indirect-related BITconfig:ID:1962, bitoffs:11, length:22 +Found:Related BITconfig:ID:2083, bitoffs:0, length:6 +Found:Related GlobalIntVar(ButtonGraphics):1424 +Found:Related GlobalIntVar(ButtonGraphics):1423 +Hidden child:92 +Hidden child:94 +Hidden child:103 +Hidden child:122 +Hidden child:125 +Hidden child:130 +Hidden child:171 +INTERFACE:1057 +Found:Related BITconfig:ID:2030, bitoffs:16, length:31 +Found:Related BITconfig:ID:788, bitoffs:16, length:31 +Found:Related BITconfig:ID:2030, bitoffs:0, length:15 +Found:Related BITconfig:ID:787, bitoffs:0, length:15 +Found:Related BITconfig:ID:787, bitoffs:16, length:31 +Found:Related BITconfig:ID:788, bitoffs:13, length:15 +Found:Related BITconfig:ID:793, bitoffs:5, length:7 +Found:Related BITconfig:ID:793, bitoffs:8, length:10 +Found:Related BITconfig:ID:793, bitoffs:11, length:13 +Found:Related BITconfig:ID:793, bitoffs:14, length:16 +Found:Related BITconfig:ID:793, bitoffs:17, length:19 +Found:Related BITconfig:ID:793, bitoffs:24, length:24 +Found:Related BITconfig:ID:793, bitoffs:25, length:25 +Found:Related BITconfig:ID:793, bitoffs:26, length:26 +Found:Related BITconfig:ID:793, bitoffs:27, length:27 +Found:Related BITconfig:ID:793, bitoffs:28, length:28 +Hidden child:12 +Hidden child:15 +Hidden child:18 +Hidden child:21 +Hidden child:24 +Hidden child:34 +Hidden child:35 +Hidden child:36 +Hidden child:37 +Hidden child:38 +Hidden child:39 +INTERFACE:1058 +Found:Indirect-related BITconfig:ID:788, bitoffs:16, length:31 +Found:Indirect-related BITconfig:ID:787, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:787, bitoffs:16, length:31 +Found:Indirect-related BITconfig:ID:2030, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:2030, bitoffs:16, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1432 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1431 +Found:Related BITconfig:ID:791, bitoffs:4, length:4 +Found:Related BITconfig:ID:791, bitoffs:1, length:3 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:9 +Hidden child:10 +Hidden child:31 +Hidden child:35 +Hidden child:39 +INTERFACE:1059 +Found:Related GlobalIntVar(ButtonGraphics):1433 +INTERFACE:1060 +INTERFACE:1061 +INTERFACE:1062 +INTERFACE:1063 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +INTERFACE:1064 +Found:Related BITconfig:ID:2034, bitoffs:23, length:27 +INTERFACE:1065 +Found:Related GlobalIntVar(ButtonGraphics):1434 +INTERFACE:1066 +INTERFACE:1067 +INTERFACE:1068 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1069 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1070 +INTERFACE:1071 +INTERFACE:1072 +Found:Related BITconfig:ID:2064, bitoffs:5, length:9 +Found:Related BITconfig:ID:2064, bitoffs:3, length:4 +Found:Related BITconfig:ID:2060, bitoffs:20, length:31 +Found:Related BITconfig:ID:2063, bitoffs:0, length:12 +Found:Related BITconfig:ID:2061, bitoffs:17, length:28 +Found:Related BITconfig:ID:2062, bitoffs:0, length:11 +Found:Related BITconfig:ID:2062, bitoffs:12, length:24 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:77 +Hidden child:85 +Hidden child:90 +Hidden child:229 +Hidden child:241 +Hidden child:253 +INTERFACE:1073 +INTERFACE:1074 +Found:Related BITconfig:ID:2067, bitoffs:0, length:0 +Found:Related BITconfig:ID:2067, bitoffs:1, length:1 +Found:Related BITconfig:ID:2067, bitoffs:2, length:2 +Found:Related BITconfig:ID:2067, bitoffs:3, length:3 +Found:Related BITconfig:ID:2067, bitoffs:4, length:4 +Found:Related BITconfig:ID:2067, bitoffs:5, length:5 +Found:Related BITconfig:ID:2067, bitoffs:6, length:6 +Found:Related BITconfig:ID:2067, bitoffs:7, length:7 +Found:Related BITconfig:ID:2067, bitoffs:8, length:8 +Found:Related BITconfig:ID:2067, bitoffs:9, length:9 +Found:Related BITconfig:ID:2067, bitoffs:10, length:10 +Found:Related BITconfig:ID:2067, bitoffs:11, length:11 +Found:Related BITconfig:ID:2067, bitoffs:12, length:12 +Found:Related BITconfig:ID:2067, bitoffs:13, length:13 +Found:Related BITconfig:ID:2067, bitoffs:14, length:14 +Found:Related BITconfig:ID:2067, bitoffs:15, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1075 +Found:Related GlobalIntVar(ButtonGraphics):1468 +INTERFACE:1076 +Hidden child:44 +Hidden child:59 +Hidden child:72 +Hidden child:85 +Hidden child:98 +INTERFACE:1077 +Hidden child:11 +Hidden child:18 +Hidden child:24 +Hidden child:30 +Hidden child:36 +INTERFACE:1078 +Found:Related BITconfig:ID:2077, bitoffs:0, length:3 +Found:Related BITconfig:ID:2077, bitoffs:4, length:6 +Found:Related GlobalIntVar(ButtonGraphics):1495 +Hidden child:21 +Hidden child:43 +INTERFACE:1079 +Found:Related config:281 +Hidden child:2 +Hidden child:3 +Hidden child:4 +Hidden child:5 +INTERFACE:1080 +INTERFACE:1081 +INTERFACE:1082 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:40 +Hidden child:61 +Hidden child:78 +Hidden child:87 +Hidden child:96 +Hidden child:103 +Hidden child:112 +Hidden child:113 +Hidden child:114 +Hidden child:179 +INTERFACE:1083 +Found:Related BITconfig:ID:2088, bitoffs:18, length:21 +Found:Indirect-related BITconfig:ID:2088, bitoffs:0, length:16 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:12 +Hidden child:17 +Hidden child:22 +Hidden child:27 +Hidden child:32 +Hidden child:37 +Hidden child:42 +Hidden child:47 +Hidden child:52 +Hidden child:57 +Hidden child:62 +Hidden child:67 +Hidden child:72 +Hidden child:95 +Hidden child:96 +Hidden child:97 +Hidden child:98 +Hidden child:99 +Hidden child:100 +Hidden child:101 +Hidden child:102 +Hidden child:103 +Hidden child:104 +Hidden child:105 +Hidden child:106 +Hidden child:107 +Hidden child:157 +Hidden child:158 +Hidden child:159 +Hidden child:160 +Hidden child:161 +Hidden child:164 +Hidden child:165 +Hidden child:385 +Hidden child:431 +Hidden child:442 +Hidden child:453 +Hidden child:460 +Hidden child:470 +Hidden child:480 +Hidden child:493 +Hidden child:502 +Hidden child:512 +Hidden child:518 +Hidden child:528 +Hidden child:538 +Hidden child:552 +Hidden child:558 +INTERFACE:1084 +Hidden child:105 +INTERFACE:1085 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1086 +Hidden child:30 +Hidden child:42 +INTERFACE:1087 +Hidden child:24 +INTERFACE:1088 +INTERFACE:1089 +Hidden child:33 +INTERFACE:1090 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1091 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1092 +Found:Indirect-related BITconfig:ID:2256, bitoffs:20, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:2256, bitoffs:3, length:8 +Found:Indirect-related BITconfig:ID:2256, bitoffs:15, length:18 +Found:Indirect-related BITconfig:ID:2260, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:2262, bitoffs:15, length:22 +Found:Indirect-related BITconfig:ID:2264, bitoffs:15, length:22 +Found:Indirect-related BITconfig:ID:2266, bitoffs:15, length:22 +Found:Indirect-related BITconfig:ID:2261, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2261, bitoffs:20, length:21 +Found:Indirect-related BITconfig:ID:2263, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2263, bitoffs:20, length:21 +Found:Indirect-related BITconfig:ID:2265, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2265, bitoffs:20, length:21 +Found:Indirect-related BITconfig:ID:2261, bitoffs:8, length:9 +Found:Indirect-related BITconfig:ID:2263, bitoffs:8, length:9 +Found:Indirect-related BITconfig:ID:2265, bitoffs:8, length:9 +Found:Indirect-related BITconfig:ID:2260, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:2260, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:2260, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:2262, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:2262, bitoffs:5, length:9 +Found:Indirect-related BITconfig:ID:2262, bitoffs:10, length:14 +Found:Indirect-related BITconfig:ID:2264, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:2264, bitoffs:5, length:9 +Found:Indirect-related BITconfig:ID:2264, bitoffs:10, length:14 +Found:Indirect-related BITconfig:ID:2266, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:2266, bitoffs:5, length:9 +Found:Indirect-related BITconfig:ID:2266, bitoffs:10, length:14 +Found:Indirect-related BITconfig:ID:2256, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:2256, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:2261, bitoffs:16, length:17 +Found:Indirect-related BITconfig:ID:2263, bitoffs:16, length:17 +Found:Indirect-related BITconfig:ID:2265, bitoffs:16, length:17 +Found:Related GlobalIntVar(ButtonGraphics):1557 +Found:Related GlobalIntVar(ButtonGraphics):1558 +Found:Related GlobalIntVar(ButtonGraphics):1559 +Hidden child:42 +Hidden child:43 +Hidden child:45 +Hidden child:46 +Hidden child:48 +Hidden child:49 +Hidden child:51 +Hidden child:52 +Hidden child:55 +Hidden child:58 +Hidden child:60 +Hidden child:61 +Hidden child:69 +Hidden child:71 +Hidden child:73 +Hidden child:75 +Hidden child:77 +Hidden child:79 +Hidden child:81 +Hidden child:83 +Hidden child:85 +Hidden child:87 +Hidden child:88 +Hidden child:209 +Hidden child:212 +Hidden child:216 +Hidden child:217 +Hidden child:234 +Hidden child:236 +Hidden child:238 +Hidden child:256 +Hidden child:259 +Hidden child:260 +Hidden child:271 +Hidden child:276 +Hidden child:289 +Hidden child:302 +Hidden child:303 +Hidden child:304 +Hidden child:313 +Hidden child:436 +Hidden child:445 +Hidden child:453 +Hidden child:461 +Hidden child:559 +Hidden child:566 +Hidden child:573 +Hidden child:580 +Hidden child:590 +Hidden child:600 +Hidden child:602 +Hidden child:652 +Hidden child:702 +Hidden child:743 +Hidden child:754 +Hidden child:765 +Hidden child:776 +Hidden child:787 +Hidden child:798 +Hidden child:809 +Hidden child:820 +Hidden child:831 +Hidden child:843 +Hidden child:847 +Hidden child:986 +Hidden child:1053 +Hidden child:1069 +Hidden child:1072 +Hidden child:1133 +Hidden child:1149 +Hidden child:1207 +Hidden child:1223 +Hidden child:1254 +Hidden child:1255 +Hidden child:1273 +Hidden child:1280 +Hidden child:1287 +Hidden child:1294 +Hidden child:1301 +Hidden child:1308 +Hidden child:1315 +Hidden child:1322 +Hidden child:1329 +Hidden child:1336 +Hidden child:1343 +Hidden child:1350 +Hidden child:1357 +Hidden child:1364 +Hidden child:1371 +Hidden child:1378 +Hidden child:1384 +Hidden child:1390 +Hidden child:1396 +Hidden child:1402 +Hidden child:1408 +Hidden child:1415 +Hidden child:1421 +Hidden child:1427 +Hidden child:1433 +Hidden child:1439 +Hidden child:1445 +Hidden child:1451 +Hidden child:1457 +Hidden child:1463 +Hidden child:1469 +Hidden child:1475 +Hidden child:1481 +Hidden child:1487 +Hidden child:1495 +Hidden child:1503 +Hidden child:1511 +Hidden child:1519 +Hidden child:1527 +Hidden child:1535 +Hidden child:1543 +Hidden child:1551 +Hidden child:1559 +Hidden child:1567 +Hidden child:1575 +Hidden child:1583 +Hidden child:1591 +Hidden child:1599 +Hidden child:1772 +Hidden child:1792 +Hidden child:1804 +Hidden child:1816 +Hidden child:1818 +Hidden child:1819 +Hidden child:1820 +Hidden child:1821 +Hidden child:1822 +Hidden child:1823 +Hidden child:1824 +Hidden child:1825 +Hidden child:1826 +INTERFACE:1093 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1094 +Found:Indirect-related GlobalStringVar(InfoString):348 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:13 +Hidden child:18 +Hidden child:20 +Hidden child:42 +INTERFACE:1095 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:92 +INTERFACE:1096 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1500 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1568 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1565 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1566 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1567 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1564 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1501 +Found:Indirect-related GlobalStringVar(InfoString):347 +Found:Indirect-related BITconfig:ID:2143, bitoffs:10, length:10 +Found:Indirect-related BITconfig:ID:2143, bitoffs:12, length:12 +Found:Indirect-related BITconfig:ID:2143, bitoffs:11, length:11 +Found:Indirect-related BITconfig:ID:2143, bitoffs:13, length:13 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related GlobalIntVar(ButtonGraphics):1516 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1572 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1574 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1576 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1577 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1578 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1579 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1580 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1581 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1582 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1583 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1584 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1585 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1586 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1587 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1588 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1589 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1590 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1569 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1571 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1570 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1573 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1575 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:61 +Hidden child:62 +Hidden child:68 +Hidden child:81 +Hidden child:82 +Hidden child:84 +Hidden child:100 +Hidden child:114 +Hidden child:126 +Hidden child:137 +Hidden child:169 +Hidden child:196 +Hidden child:201 +Hidden child:209 +Hidden child:224 +Hidden child:242 +Hidden child:264 +Hidden child:278 +Hidden child:292 +Hidden child:310 +Hidden child:328 +Hidden child:340 +Hidden child:357 +Hidden child:361 +Hidden child:362 +Hidden child:373 +Hidden child:385 +Hidden child:397 +Hidden child:402 +Hidden child:409 +Hidden child:416 +Hidden child:424 +Hidden child:432 +Hidden child:440 +Hidden child:448 +Hidden child:456 +Hidden child:464 +Hidden child:472 +Hidden child:480 +Hidden child:488 +Hidden child:496 +Hidden child:506 +Hidden child:556 +Hidden child:569 +Hidden child:580 +Hidden child:592 +Hidden child:603 +Hidden child:614 +Hidden child:625 +Hidden child:636 +Hidden child:647 +Hidden child:658 +Hidden child:670 +Hidden child:681 +Hidden child:693 +Hidden child:706 +Hidden child:718 +Hidden child:730 +Hidden child:742 +Hidden child:761 +Hidden child:774 +Hidden child:804 +INTERFACE:1097 +Found:Related BITconfig:ID:2138, bitoffs:0, length:5 +Found:Related BITconfig:ID:2138, bitoffs:6, length:15 +Found:Related BITconfig:ID:2138, bitoffs:16, length:21 +Found:Related BITconfig:ID:2138, bitoffs:22, length:31 +Found:Related BITconfig:ID:2139, bitoffs:0, length:5 +Found:Related BITconfig:ID:2139, bitoffs:6, length:15 +Found:Related BITconfig:ID:2139, bitoffs:16, length:21 +Found:Related BITconfig:ID:2139, bitoffs:22, length:31 +Found:Related BITconfig:ID:2140, bitoffs:0, length:5 +Found:Related BITconfig:ID:2140, bitoffs:6, length:15 +Found:Related BITconfig:ID:2140, bitoffs:16, length:21 +Found:Related BITconfig:ID:2140, bitoffs:22, length:31 +Found:Related BITconfig:ID:2141, bitoffs:0, length:5 +Found:Related BITconfig:ID:2141, bitoffs:6, length:15 +Found:Related BITconfig:ID:2141, bitoffs:16, length:21 +Found:Related BITconfig:ID:2141, bitoffs:22, length:31 +Found:Related BITconfig:ID:2142, bitoffs:0, length:5 +Found:Related BITconfig:ID:2142, bitoffs:6, length:15 +Found:Related BITconfig:ID:2142, bitoffs:16, length:21 +Found:Related BITconfig:ID:2142, bitoffs:22, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related config:2136 +Hidden child:22 +Hidden child:54 +Hidden child:66 +Hidden child:205 +Hidden child:230 +INTERFACE:1098 +Found:Indirect-related config:2128 +Found:Indirect-related BITconfig:ID:2111, bitoffs:8, length:11 +Found:Indirect-related BITconfig:ID:2111, bitoffs:13, length:13 +Found:Indirect-related BITconfig:ID:2111, bitoffs:14, length:14 +Found:Indirect-related BITconfig:ID:2111, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:2111, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:2111, bitoffs:17, length:17 +Found:Indirect-related BITconfig:ID:2111, bitoffs:18, length:18 +Found:Indirect-related BITconfig:ID:2111, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:2111, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:2099, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2099, bitoffs:8, length:15 +Found:Indirect-related BITconfig:ID:2099, bitoffs:16, length:23 +Found:Indirect-related BITconfig:ID:2099, bitoffs:24, length:31 +Found:Indirect-related BITconfig:ID:2100, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:2100, bitoffs:8, length:15 +Found:Indirect-related BITconfig:ID:2100, bitoffs:16, length:23 +Found:Indirect-related BITconfig:ID:2100, bitoffs:24, length:31 +Found:Indirect-related BITconfig:ID:2116, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:2116, bitoffs:16, length:31 +Found:Indirect-related BITconfig:ID:2117, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:2117, bitoffs:16, length:31 +Found:Indirect-related BITconfig:ID:2118, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:2118, bitoffs:16, length:31 +Found:Indirect-related BITconfig:ID:2119, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:2119, bitoffs:16, length:31 +Found:Related config:2120 +Found:Related config:2121 +Found:Related config:2122 +Found:Related config:2123 +Found:Related config:2124 +Found:Related config:2125 +Found:Related config:2126 +Found:Related config:2127 +Found:Related BITconfig:ID:2111, bitoffs:12, length:12 +Found:Related BITconfig:ID:2107, bitoffs:0, length:15 +Found:Related BITconfig:ID:2112, bitoffs:0, length:11 +Found:Related BITconfig:ID:2105, bitoffs:0, length:7 +Found:Related BITconfig:ID:2101, bitoffs:0, length:15 +Found:Related BITconfig:ID:2107, bitoffs:16, length:31 +Found:Related BITconfig:ID:2112, bitoffs:12, length:23 +Found:Related BITconfig:ID:2105, bitoffs:8, length:15 +Found:Related BITconfig:ID:2101, bitoffs:16, length:31 +Found:Related BITconfig:ID:2108, bitoffs:0, length:15 +Found:Related BITconfig:ID:2113, bitoffs:0, length:11 +Found:Related BITconfig:ID:2105, bitoffs:16, length:23 +Found:Related BITconfig:ID:2102, bitoffs:0, length:15 +Found:Related BITconfig:ID:2108, bitoffs:16, length:31 +Found:Related BITconfig:ID:2113, bitoffs:12, length:23 +Found:Related BITconfig:ID:2105, bitoffs:24, length:31 +Found:Related BITconfig:ID:2102, bitoffs:16, length:31 +Found:Related BITconfig:ID:2109, bitoffs:0, length:15 +Found:Related BITconfig:ID:2114, bitoffs:0, length:11 +Found:Related BITconfig:ID:2106, bitoffs:0, length:7 +Found:Related BITconfig:ID:2103, bitoffs:0, length:15 +Found:Related BITconfig:ID:2109, bitoffs:16, length:31 +Found:Related BITconfig:ID:2114, bitoffs:12, length:23 +Found:Related BITconfig:ID:2106, bitoffs:8, length:15 +Found:Related BITconfig:ID:2103, bitoffs:16, length:31 +Found:Related BITconfig:ID:2110, bitoffs:0, length:15 +Found:Related BITconfig:ID:2115, bitoffs:0, length:11 +Found:Related BITconfig:ID:2106, bitoffs:16, length:23 +Found:Related BITconfig:ID:2104, bitoffs:0, length:15 +Found:Related BITconfig:ID:2110, bitoffs:16, length:31 +Found:Related BITconfig:ID:2115, bitoffs:12, length:23 +Found:Related BITconfig:ID:2106, bitoffs:24, length:31 +Found:Related BITconfig:ID:2104, bitoffs:16, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:64 +Hidden child:76 +Hidden child:89 +Hidden child:102 +Hidden child:149 +Hidden child:164 +Hidden child:179 +Hidden child:205 +Hidden child:212 +Hidden child:224 +Hidden child:238 +Hidden child:261 +Hidden child:263 +Hidden child:272 +Hidden child:281 +Hidden child:290 +Hidden child:299 +Hidden child:308 +Hidden child:317 +Hidden child:326 +Hidden child:335 +Hidden child:347 +INTERFACE:1099 +Found:Indirect-related config:2128 +Found:Indirect-related BITconfig:ID:2175, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:2175, bitoffs:1, length:1 +Found:Indirect-related BITconfig:ID:2175, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:2175, bitoffs:3, length:3 +Found:Indirect-related BITconfig:ID:2175, bitoffs:4, length:4 +Found:Indirect-related BITconfig:ID:2175, bitoffs:5, length:5 +Found:Indirect-related BITconfig:ID:2175, bitoffs:6, length:6 +Found:Indirect-related BITconfig:ID:2175, bitoffs:7, length:7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:108 +Hidden child:110 +Hidden child:156 +Hidden child:168 +INTERFACE:1100 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1498 +Found:Related GlobalStringVar(InfoString):346 +Hidden child:4 +Hidden child:6 +Hidden child:28 +Hidden child:29 +Hidden child:30 +Hidden child:31 +Hidden child:32 +Hidden child:33 +Hidden child:34 +Hidden child:35 +Hidden child:39 +Hidden child:54 +Hidden child:66 +Hidden child:78 +INTERFACE:1101 +Found:Related config:2134 +Found:Related BITconfig:ID:2133, bitoffs:0, length:0 +Found:Related BITconfig:ID:2133, bitoffs:14, length:18 +Found:Related BITconfig:ID:2132, bitoffs:0, length:12 +Found:Related BITconfig:ID:2132, bitoffs:13, length:25 +Found:Related GlobalIntVar(ButtonGraphics):1499 +Hidden child:32 +Hidden child:53 +INTERFACE:1102 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:2 +Hidden child:48 +Hidden child:57 +Hidden child:70 +INTERFACE:1103 +Found:Indirect-related GlobalStringVar(InfoString):345 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:13 +Hidden child:17 +Hidden child:19 +Hidden child:41 +INTERFACE:1104 +Found:Related GlobalIntVar(ButtonGraphics):1007 +INTERFACE:1105 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related config:2094 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related config:2097 +Found:Related config:2095 +Found:Related config:2096 +Found:Indirect-related BITconfig:ID:2093, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:2093, bitoffs:16, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:126 +INTERFACE:1106 +Found:Indirect-related config:2347 +Found:Indirect-related BITconfig:ID:2347, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:2347, bitoffs:0, length:6 +Found:Related GlobalIntVar(ButtonGraphics):1592 +Found:Related GlobalIntVar(ButtonGraphics):1593 +Found:Indirect-related BITconfig:ID:2347, bitoffs:10, length:15 +Found:Related GlobalIntVar(ButtonGraphics):1591 +Hidden child:41 +INTERFACE:1107 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:80 +Hidden child:149 +Hidden child:164 +Hidden child:188 +INTERFACE:1108 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related BITconfig:ID:1083, bitoffs:18, length:18 +Hidden child:34 +INTERFACE:1109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1505 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Related BITconfig:ID:1083, bitoffs:1, length:1 +Found:Related BITconfig:ID:1083, bitoffs:2, length:2 +Found:Related BITconfig:ID:1083, bitoffs:0, length:0 +Found:Related BITconfig:ID:1083, bitoffs:17, length:17 +Found:Related GlobalIntVar(ButtonGraphics):53 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1029 +Found:Indirect-related GlobalStringVar(InfoString):22 +Found:Related GlobalIntVar(ButtonGraphics):1413 +Found:Related GlobalIntVar(ButtonGraphics):11 +Found:Related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related config:287 +Found:Indirect-related config:1054 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1027 +Found:Indirect-related GlobalStringVar(InfoString):202 +Hidden child:0 +Hidden child:4 +Hidden child:11 +Hidden child:20 +Hidden child:22 +INTERFACE:1110 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1512 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1035 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1518 +Found:Indirect-related GlobalStringVar(InfoString):126 +Found:Related GlobalIntVar(ButtonGraphics):53 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1513 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1506 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1029 +Found:Indirect-related GlobalStringVar(InfoString):22 +Found:Related GlobalIntVar(ButtonGraphics):1413 +Found:Related GlobalIntVar(ButtonGraphics):11 +Found:Related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related config:287 +Found:Indirect-related config:1054 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Hidden child:4 +Hidden child:10 +Hidden child:12 +Hidden child:13 +Hidden child:23 +Hidden child:27 +Hidden child:29 +Hidden child:35 +Hidden child:36 +Hidden child:38 +Hidden child:45 +Hidden child:55 +Hidden child:59 +INTERFACE:1111 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1396 +Found:Indirect-related GlobalIntVar(ButtonGraphics):768 +Found:Indirect-related BITconfig:ID:1736, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:1736, bitoffs:8, length:15 +Found:Indirect-related BITconfig:ID:1736, bitoffs:16, length:23 +Found:Indirect-related BITconfig:ID:1736, bitoffs:24, length:31 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:1 +Hidden child:21 +INTERFACE:1112 +Found:Indirect-related BITconfig:ID:1735, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1736, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1736, bitoffs:2, length:5 +Found:Indirect-related BITconfig:ID:1735, bitoffs:2, length:17 +Found:Indirect-related BITconfig:ID:1736, bitoffs:6, length:9 +Found:Indirect-related BITconfig:ID:1736, bitoffs:23, length:24 +Found:Indirect-related BITconfig:ID:1736, bitoffs:10, length:12 +Found:Indirect-related GlobalIntVar(ButtonGraphics):788 +Found:Indirect-related GlobalIntVar(ButtonGraphics):786 +Found:Indirect-related GlobalIntVar(ButtonGraphics):787 +Found:Indirect-related GlobalIntVar(ButtonGraphics):995 +Found:Indirect-related GlobalIntVar(ButtonGraphics):267 +Found:Indirect-related GlobalStringVar(InfoString):38 +Found:Indirect-related GlobalStringVar(InfoString):39 +Found:Related GlobalIntVar(ButtonGraphics):266 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1029 +Found:Indirect-related GlobalStringVar(InfoString):22 +Found:Related GlobalIntVar(ButtonGraphics):5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related config:287 +Found:Indirect-related config:1054 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1113 +Found:Indirect-related BITconfig:ID:1260, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1735, bitoffs:0, length:1 +Found:Indirect-related GlobalStringVar(InfoString):129 +INTERFACE:1114 +Found:Indirect-related BITconfig:ID:1260, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1095 +Found:Indirect-related GlobalStringVar(InfoString):129 +Found:Related BITconfig:ID:1734, bitoffs:0, length:2 +Found:Indirect-related BITconfig:ID:1736, bitoffs:29, length:30 +Found:Indirect-related BITconfig:ID:1736, bitoffs:25, length:25 +Found:Indirect-related BITconfig:ID:1736, bitoffs:26, length:26 +Found:Indirect-related BITconfig:ID:1736, bitoffs:23, length:24 +Found:Indirect-related BITconfig:ID:1736, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1736, bitoffs:2, length:5 +Found:Indirect-related BITconfig:ID:1736, bitoffs:6, length:9 +Found:Indirect-related BITconfig:ID:1736, bitoffs:10, length:12 +Found:Indirect-related BITconfig:ID:1736, bitoffs:13, length:14 +Found:Indirect-related BITconfig:ID:1736, bitoffs:15, length:15 +Found:Indirect-related BITconfig:ID:1736, bitoffs:16, length:16 +Found:Indirect-related BITconfig:ID:1736, bitoffs:17, length:18 +Found:Indirect-related BITconfig:ID:1736, bitoffs:19, length:19 +Found:Indirect-related BITconfig:ID:1736, bitoffs:20, length:20 +Found:Indirect-related BITconfig:ID:1736, bitoffs:21, length:21 +Found:Indirect-related BITconfig:ID:1736, bitoffs:22, length:22 +Found:Indirect-related BITconfig:ID:1736, bitoffs:27, length:27 +Found:Indirect-related BITconfig:ID:1736, bitoffs:28, length:28 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Hidden child:28 +INTERFACE:1115 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1561 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1562 +Hidden child:0 +Hidden child:2 +Hidden child:9 +Hidden child:27 +Hidden child:33 +Hidden child:34 +Hidden child:42 +Hidden child:46 +Hidden child:48 +Hidden child:50 +Hidden child:61 +Hidden child:80 +Hidden child:83 +Hidden child:87 +Hidden child:91 +Hidden child:118 +Hidden child:171 +Hidden child:183 +INTERFACE:1116 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related config:2317 +Found:Indirect-related config:2307 +Found:Indirect-related config:2308 +Found:Indirect-related config:2309 +Found:Indirect-related config:2310 +Found:Indirect-related config:2311 +Found:Indirect-related config:2312 +Found:Indirect-related config:2313 +Found:Indirect-related config:2314 +Found:Indirect-related config:2315 +Hidden child:3 +Hidden child:4 +Hidden child:35 +Hidden child:40 +Hidden child:136 +Hidden child:145 +Hidden child:163 +Hidden child:212 +Hidden child:261 +Hidden child:310 +Hidden child:359 +Hidden child:408 +Hidden child:457 +Hidden child:506 +INTERFACE:1117 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:13 +Hidden child:15 +Hidden child:27 +INTERFACE:1118 +Found:Related GlobalIntVar(ButtonGraphics):1007 +INTERFACE:1119 +Found:Indirect-related BITconfig:ID:1734, bitoffs:3, length:9 +Found:Indirect-related GlobalIntVar(ButtonGraphics):777 +Found:Indirect-related GlobalIntVar(ButtonGraphics):696 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1120 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:6 +INTERFACE:1121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:65 +Hidden child:86 +Hidden child:107 +Hidden child:128 +Hidden child:149 +Hidden child:170 +Hidden child:191 +Hidden child:212 +Hidden child:233 +Hidden child:254 +Hidden child:275 +Hidden child:296 +Hidden child:317 +Hidden child:338 +Hidden child:359 +Hidden child:380 +Hidden child:382 +Hidden child:417 +Hidden child:424 +Hidden child:505 +Hidden child:509 +Hidden child:642 +Hidden child:646 +Hidden child:650 +Hidden child:665 +INTERFACE:1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related BITconfig:ID:2356, bitoffs:0, length:15 +Found:Related BITconfig:ID:2356, bitoffs:16, length:31 +Found:Related BITconfig:ID:2357, bitoffs:0, length:15 +Found:Indirect-related BITconfig:ID:2357, bitoffs:16, length:19 +Found:Indirect-related BITconfig:ID:2357, bitoffs:20, length:23 +Found:Indirect-related BITconfig:ID:2349, bitoffs:0, length:3 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1597 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1598 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1599 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1600 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1601 +Found:Indirect-related config:2347 +Found:Indirect-related BITconfig:ID:2347, bitoffs:10, length:15 +Found:Indirect-related BITconfig:ID:2347, bitoffs:7, length:9 +Found:Indirect-related BITconfig:ID:2347, bitoffs:0, length:6 +Found:Indirect-related config:145 +Found:Indirect-related config:146 +Found:Indirect-related config:122 +Found:Indirect-related config:130 +Found:Indirect-related config:176 +Found:Indirect-related BITconfig:ID:1646, bitoffs:0, length:5 +Found:Indirect-related BITconfig:ID:1365, bitoffs:0, length:6 +Found:Indirect-related BITconfig:ID:178, bitoffs:0, length:1 +Found:Indirect-related BITconfig:ID:1889, bitoffs:0, length:7 +Found:Indirect-related BITconfig:ID:222, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:62, bitoffs:0, length:5 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1594 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:61 +Hidden child:72 +Hidden child:87 +Hidden child:129 +Hidden child:233 +Hidden child:242 +Hidden child:252 +Hidden child:264 +Hidden child:276 +Hidden child:288 +Hidden child:367 +INTERFACE:1123 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:8 +Hidden child:21 +Hidden child:44 +INTERFACE:1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:81 +Hidden child:82 +Hidden child:83 +Hidden child:86 +Hidden child:89 +INTERFACE:1125 +INTERFACE:1126 +Found:Related BITconfig:ID:984, bitoffs:28, length:31 +Found:Related GlobalIntVar(ButtonGraphics):1186 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Related GlobalIntVar(ButtonGraphics):1184 +Hidden child:47 +Hidden child:80 +Hidden child:108 +Hidden child:121 +Hidden child:139 +Hidden child:161 +Hidden child:194 +Hidden child:196 +INTERFACE:1127 +Found:Related config:2373 +Found:Indirect-related BITconfig:ID:1734, bitoffs:3, length:9 +Found:Indirect-related GlobalIntVar(ButtonGraphics):777 +Found:Indirect-related GlobalIntVar(ButtonGraphics):696 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:30 +Hidden child:43 +Hidden child:56 +Hidden child:61 +Hidden child:62 +Hidden child:63 +Hidden child:64 +Hidden child:65 +Hidden child:66 +Hidden child:67 +Hidden child:68 +Hidden child:69 +Hidden child:70 +Hidden child:71 +Hidden child:72 +INTERFACE:1128 +Found:Indirect-related BITconfig:ID:1343, bitoffs:1, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:59 +Hidden child:101 +Hidden child:131 +Hidden child:169 +Hidden child:206 +Hidden child:243 +Hidden child:280 +Hidden child:317 +INTERFACE:1129 +INTERFACE:1130 +INTERFACE:1131 +INTERFACE:1132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Hidden child:22 +Hidden child:23 +Hidden child:27 +Hidden child:28 +INTERFACE:1133 +Found:Related BITconfig:ID:2376, bitoffs:13, length:19 +Found:Related BITconfig:ID:2377, bitoffs:4, length:10 +INTERFACE:1134 +INTERFACE:1135 +INTERFACE:1136 +INTERFACE:1137 +Found:Related BITconfig:ID:1733, bitoffs:14, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:5 +Hidden child:7 +Hidden child:16 +Hidden child:17 +INTERFACE:1138 +Found:Related BITconfig:ID:2385, bitoffs:30, length:31 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1139 +Found:Related config:261 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1 +Found:Related config:80 +Found:Related BITconfig:ID:1178, bitoffs:1, length:10 +Found:Related BITconfig:ID:738, bitoffs:0, length:4 +Hidden child:4 +Hidden child:5 +Hidden child:6 +Hidden child:7 +Hidden child:8 +Hidden child:9 +Hidden child:10 +Hidden child:11 +Hidden child:12 +Hidden child:13 +Hidden child:14 +Hidden child:15 +Hidden child:16 +Hidden child:17 +Hidden child:18 +Hidden child:19 +Hidden child:20 +Hidden child:21 +Hidden child:22 +Hidden child:23 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:27 +Hidden child:28 +INTERFACE:1140 +INTERFACE:1141 +Found:Related BITconfig:ID:1476, bitoffs:0, length:2 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +Hidden child:4 +INTERFACE:1142 +Found:Indirect-related GlobalIntVar(ButtonGraphics):199 +Found:Indirect-related config:281 +Found:Indirect-related BITconfig:ID:466, bitoffs:0, length:0 +Found:Indirect-related BITconfig:ID:466, bitoffs:2, length:2 +Found:Indirect-related BITconfig:ID:1160, bitoffs:23, length:23 +Found:Indirect-related GlobalIntVar(ButtonGraphics):41 +Found:Indirect-related GlobalIntVar(ButtonGraphics):168 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1028 +Found:Indirect-related GlobalStringVar(InfoString):1 +Found:Indirect-related BITconfig:ID:1438, bitoffs:0, length:4 +Found:Indirect-related BITconfig:ID:1438, bitoffs:6, length:10 +Found:Indirect-related BITconfig:ID:1438, bitoffs:11, length:15 +Found:Indirect-related GlobalIntVar(ButtonGraphics):7 +Found:Indirect-related GlobalIntVar(ButtonGraphics):8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):132 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1269 +Found:Indirect-related GlobalIntVar(ButtonGraphics):133 +Found:Indirect-related GlobalStringVar(InfoString):29 +Found:Indirect-related GlobalStringVar(InfoString):276 +Found:Indirect-related BITconfig:ID:2083, bitoffs:8, length:8 +Found:Indirect-related GlobalIntVar(ButtonGraphics):42 +Found:Indirect-related config:287 +Found:Indirect-related BITconfig:ID:638, bitoffs:19, length:19 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1037 +Found:Indirect-related GlobalIntVar(ButtonGraphics):193 +Found:Indirect-related BITconfig:ID:1584, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):182 +Found:Indirect-related GlobalIntVar(ButtonGraphics):119 +Found:Indirect-related GlobalIntVar(ButtonGraphics):44 +Found:Indirect-related GlobalIntVar(ButtonGraphics):45 +Found:Indirect-related GlobalIntVar(ButtonGraphics):46 +Found:Indirect-related GlobalIntVar(ButtonGraphics):47 +Found:Indirect-related GlobalIntVar(ButtonGraphics):48 +Found:Indirect-related GlobalIntVar(ButtonGraphics):49 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1511 +Found:Indirect-related config:2159 +Found:Indirect-related config:1055 +Found:Indirect-related config:1054 +Found:Indirect-related BITconfig:ID:1056, bitoffs:0, length:0 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1413 +Found:Indirect-related BITconfig:ID:1963, bitoffs:0, length:11 +Found:Indirect-related BITconfig:ID:1248, bitoffs:27, length:30 +Found:Indirect-related GlobalIntVar(ButtonGraphics):109 +Found:Indirect-related GlobalIntVar(ButtonGraphics):121 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1122 +Found:Indirect-related GlobalIntVar(ButtonGraphics):1124 +Found:Indirect-related GlobalIntVar(ButtonGraphics):88 +Found:Indirect-related GlobalIntVar(ButtonGraphics):203 +Found:Indirect-related GlobalIntVar(ButtonGraphics):204 +Found:Indirect-related GlobalIntVar(ButtonGraphics):205 +Found:Indirect-related GlobalIntVar(ButtonGraphics):206 +Found:Indirect-related GlobalIntVar(ButtonGraphics):207 +Found:Indirect-related GlobalIntVar(ButtonGraphics):208 +Found:Indirect-related GlobalIntVar(ButtonGraphics):209 +Found:Indirect-related GlobalIntVar(ButtonGraphics):210 +Found:Indirect-related GlobalIntVar(ButtonGraphics):211 +Found:Indirect-related GlobalIntVar(ButtonGraphics):160 +Found:Indirect-related GlobalStringVar(InfoString):0 +INTERFACE:1143 +Found:Indirect-related config:2391 +Found:Indirect-related config:2392 +Found:Indirect-related config:2393 +Found:Indirect-related config:2394 +Found:Indirect-related BITconfig:ID:2226, bitoffs:0, length:3 +Found:Indirect-related config:2229 +Found:Indirect-related config:2230 +Found:Indirect-related config:2231 +Found:Indirect-related config:2232 +Found:Related GlobalIntVar(ButtonGraphics):1648 +Hidden child:24 +Hidden child:25 +Hidden child:26 +Hidden child:50 +Hidden child:146 +Hidden child:167 \ No newline at end of file diff --git a/dumps/scripts/0.cs2 b/dumps/scripts/0.cs2 new file mode 100644 index 000000000..90a48ca70 --- /dev/null +++ b/dumps/scripts/0.cs2 @@ -0,0 +1,32 @@ +void script_0(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar3 = divide(add(arg1, arg2), 2); + ivar4 = globalarray_0[ivar3]; + globalarray_0[ivar3] = globalarray_0[arg2]; + globalarray_0[arg2] = ivar4; + ivar5 = arg1; + ivar6 = arg1; + ivar7 = -1; + while (ivar6 < arg2) { + if (stringMethod4107(lower(getWidgetText(new WidgetPointer(globalarray_0[ivar6]))), lower(getWidgetText(new WidgetPointer(ivar4)))) < bitAnd(ivar6, 1)) { + ivar7 = globalarray_0[ivar6]; + globalarray_0[ivar6] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar7; + ivar5 = add(ivar5, 1); + } + ivar6 = add(ivar6, 1); + } + globalarray_0[arg2] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar4; + if (arg1 < subtract(ivar5, 1)) { + script_0(0, arg1, subtract(ivar5, 1)); + } + if (add(ivar5, 1) < arg2) { + script_0(0, add(ivar5, 1), arg2); + } + return; +} diff --git a/dumps/scripts/1.cs2 b/dumps/scripts/1.cs2 new file mode 100644 index 000000000..69e32898e --- /dev/null +++ b/dumps/scripts/1.cs2 @@ -0,0 +1,6 @@ +int script_1(int arg0,int arg1) { + if (isMembersItem(arg1) && isMember()) { + return 0; + } + return getItemAmtInContainer(arg0, arg1); +} diff --git a/dumps/scripts/10.cs2 b/dumps/scripts/10.cs2 new file mode 100644 index 000000000..20b0de2f8 --- /dev/null +++ b/dumps/scripts/10.cs2 @@ -0,0 +1,135 @@ +void script_10(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,string arg11,string arg12) { + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar11 = add(2, multiply(13, getLineCount(177, 495, "Level " + intToStr(arg2) + ": " + arg11))); + ivar12 = add(2, multiply(13, getLineCount(177, 494, arg12))); + ivar13 = add(add(add(add(add(2, ivar11), ivar12), 32), 14), 2); + if (arg3 == -1) { + ivar13 = subtract(subtract(ivar13, 32), 14); + } + ivar14 = 5; + if (getWidgetActualY(new WidgetPointer(arg0)) < 130) { + ivar14 = subtract(subtract(261, ivar13), 5); + } + createExtraChild(new WidgetPointer(arg1), 3, 0); + setWidgetPosition(5, ivar14, 0, 0); + setWidgetSize(180, ivar13, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(42); + createExtraChild(new WidgetPointer(arg1), 3, 1); + setWidgetPosition(6, add(ivar14, 1), 0, 0); + setWidgetSize(179, subtract(ivar13, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(46, 43, 35)); + createExtraChild(new WidgetPointer(arg1), 3, 2); + setWidgetPosition(5, ivar14, 0, 0); + setWidgetSize(179, subtract(ivar13, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(114, 100, 81)); + createExtraChild(new WidgetPointer(arg1), 4, 3); + setWidgetPosition(7, add(ivar14, 2), 0, 0); + setWidgetSize(177, ivar11, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(false); + setWidgetText("Level " + intToStr(arg2) + ": " + arg11); + createExtraChild(new WidgetPointer(arg1), 4, 4); + setWidgetPosition(7, add(add(ivar14, 2), ivar11), 0, 0); + setWidgetSize(177, ivar12, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + setWidgetRGB(new Color(175, 106, 26)); + setWidgetUnknownBoolean(false); + setWidgetText(arg12); + ivar15 = 1; + if (arg5 != -1) { + ivar15 = 2; + } + if (arg7 != -1) { + ivar15 = 3; + } + if (arg9 != -1) { + ivar15 = 4; + } + ivar16 = divide(subtract(190, multiply(ivar15, 35)), add(ivar15, 1)); + if (arg3 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 5); + setWidgetPosition(ivar16, add(add(add(ivar14, 2), ivar11), ivar12), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg3, -1); + createExtraChild(new WidgetPointer(arg1), 4, 6); + setWidgetPosition(ivar16, add(add(add(add(ivar14, 2), ivar11), ivar12), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_19(arg3, arg0) >= arg4) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_20(script_19(arg3, arg0)) + "/" + intToStr(arg4)); + } + if (arg5 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 7); + setWidgetPosition(add(multiply(ivar16, 2), 35), add(add(add(ivar14, 2), ivar11), ivar12), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg5, -1); + createExtraChild(new WidgetPointer(arg1), 4, 8); + setWidgetPosition(add(multiply(ivar16, 2), 35), add(add(add(add(ivar14, 2), ivar11), ivar12), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_19(arg5, arg0) >= arg6) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_20(script_19(arg5, arg0)) + "/" + intToStr(arg6)); + } + if (arg7 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 9); + setWidgetPosition(add(multiply(ivar16, 3), 70), add(add(add(ivar14, 2), ivar11), ivar12), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg7, -1); + createExtraChild(new WidgetPointer(arg1), 4, 10); + setWidgetPosition(add(multiply(ivar16, 3), 70), add(add(add(add(ivar14, 2), ivar11), ivar12), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_19(arg7, arg0) >= arg8) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_20(script_19(arg7, arg0)) + "/" + intToStr(arg8)); + } + if (arg9 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 11); + setWidgetPosition(add(multiply(ivar16, 4), 105), add(add(add(ivar14, 2), ivar11), ivar12), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg9, -1); + createExtraChild(new WidgetPointer(arg1), 4, 12); + setWidgetPosition(add(multiply(ivar16, 4), 105), add(add(add(add(ivar14, 2), ivar11), ivar12), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_19(arg9, arg0) >= arg10) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_20(script_19(arg9, arg0)) + "/" + intToStr(arg10)); + } + return; +} diff --git a/dumps/scripts/100.cs2 b/dumps/scripts/100.cs2 new file mode 100644 index 000000000..17f416e98 --- /dev/null +++ b/dumps/scripts/100.cs2 @@ -0,0 +1,4 @@ +void script_100(int arg0) { + script_559(arg0); + return; +} diff --git a/dumps/scripts/1000.cs2 b/dumps/scripts/1000.cs2 new file mode 100644 index 000000000..09c203421 --- /dev/null +++ b/dumps/scripts/1000.cs2 @@ -0,0 +1,716 @@ +cs2func_script_1000_struct(2,2,0) script_1000(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(10, 3224, "Members: Cloth", "Members can now weave " + "" + "cloth" + "" + " on a loom."); + case 1: + return newstruct cs2func_script_1000_struct(10, 20754, "Members: Milestone cape (10)", "Members can now weave a " + "" + "Milestone cape (10)" + "" + " on a loom."); + case 2: + return newstruct cs2func_script_1000_struct(20, 20755, "Members: Milestone cape (20)", "Members can now weave a " + "" + "Milestone cape (20)" + "" + " on a loom."); + case 3: + return newstruct cs2func_script_1000_struct(21, 5418, "Members: Vegetable sack", "Members can now weave " + "" + "vegetable sacks" + "" + " on a loom."); + case 4: + return newstruct cs2func_script_1000_struct(30, 20756, "Members: Milestone cape (30)", "Members can now weave a " + "" + "Milestone cape (30)" + "" + " on a loom."); + case 5: + return newstruct cs2func_script_1000_struct(36, 5376, "Members: Fruit basket", "Members can now weave " + "" + "fruit baskets" + "" + " on a loom."); + case 6: + return newstruct cs2func_script_1000_struct(40, 20757, "Members: Milestone cape (40)", "Members can now weave a " + "" + "Milestone cape (40)" + "" + " on a loom."); + case 7: + return newstruct cs2func_script_1000_struct(50, 20758, "Members: Milestone cape (50)", "Members can now weave a " + "" + "Milestone cape (50)" + "" + " on a loom."); + case 8: + return newstruct cs2func_script_1000_struct(52, 14859, "Members: Seaweed net", "Members can now weave " + "" + "seaweed nets" + "" + " on a loom."); + case 9: + return newstruct cs2func_script_1000_struct(60, 20759, "Members: Milestone cape (60)", "Members can now weave a " + "" + "Milestone cape (60)" + "" + " on a loom."); + case 10: + return newstruct cs2func_script_1000_struct(70, 20760, "Members: Milestone cape (70)", "Members can now weave a " + "" + "Milestone cape (70)" + "" + " on a loom."); + case 11: + return newstruct cs2func_script_1000_struct(80, 20761, "Members: Milestone cape (80)", "Members can now weave a " + "" + "Milestone cape (80)" + "" + " on a loom."); + case 12: + return newstruct cs2func_script_1000_struct(90, 20762, "Members: Milestone cape (90)", "Members can now weave a " + "" + "Milestone cape (90)" + "" + " on a loom."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(1, 1059, "Leather gloves", "You can now craft " + "" + "leather gloves" + "" + "."); + case 1: + return newstruct cs2func_script_1000_struct(7, 1061, "Leather boots", "You can now craft " + "" + "leather boots" + "" + "."); + case 2: + return newstruct cs2func_script_1000_struct(9, 1167, "Leather cowl", "You can now craft " + "" + "leather cowls" + "" + "."); + case 3: + return newstruct cs2func_script_1000_struct(11, 1063, "Leather vambraces", "You can now craft " + "" + "leather vambraces" + "" + "."); + case 4: + return newstruct cs2func_script_1000_struct(14, 1129, "Leather body", "You can now craft " + "" + "leather bodies" + "" + "."); + case 5: + return newstruct cs2func_script_1000_struct(15, 3327, "Members: Snail helmet", "Members can now craft " + "" + "snail helmets" + "" + "."); + case 6: + return newstruct cs2func_script_1000_struct(15, 7539, "Members: Crab shell armour", "Members can now craft " + "" + "crab shell armour" + "" + "."); + case 7: + return newstruct cs2func_script_1000_struct(18, 1095, "Leather chaps", "You can now craft " + "" + "leather chaps" + "" + "."); + case 8: + return newstruct cs2func_script_1000_struct(28, 1131, "Hard leather body", "You can now craft " + "" + "hard leather bodies" + "" + "."); + case 9: + return newstruct cs2func_script_1000_struct(32, 10077, "Members: Spiked vambraces", "Members can now craft " + "" + "spiked vambraces" + "" + "."); + case 10: + return newstruct cs2func_script_1000_struct(35, 6259, "Members: Broodoo shield", "Members can now craft " + "" + "broodoo shields" + "" + "."); + case 11: + return newstruct cs2func_script_1000_struct(38, 1169, "Members: Coif", "Members can now craft " + "" + "coifs" + "" + "."); + case 12: + return newstruct cs2func_script_1000_struct(41, 1133, "Members: Studded body", "Members can now craft " + "" + "studded bodies" + "" + "."); + case 13: + return newstruct cs2func_script_1000_struct(43, 10824, "Members: Yak-hide leg armour", "Members can now craft " + "" + "yak-hide leg armour" + "" + "."); + case 14: + return newstruct cs2func_script_1000_struct(44, 1097, "Members: Studded chaps", "Members can now craft " + "" + "studded chaps" + "" + "."); + case 15: + return newstruct cs2func_script_1000_struct(45, 6328, "Members: Snakeskin boots", "Members can now craft " + "" + "snakeskin boots" + "" + "."); + case 16: + return newstruct cs2func_script_1000_struct(46, 10822, "Members: Yak-hide body armour", "Members can now craft " + "" + "yak-hide body armour" + "" + "."); + case 17: + return newstruct cs2func_script_1000_struct(47, 6330, "Members: Snakeskin vambraces", "Members can now craft " + "" + "snakeskin vambraces" + "" + "."); + case 18: + return newstruct cs2func_script_1000_struct(48, 6326, "Members: Snakeskin bandana", "Members can now craft " + "" + "snakeskin bandanas" + "" + "."); + case 19: + return newstruct cs2func_script_1000_struct(51, 6324, "Members: Snakeskin chaps", "Members can now craft " + "" + "snakeskin chaps" + "" + "."); + case 20: + return newstruct cs2func_script_1000_struct(53, 6322, "Members: Snakeskin body", "Members can now craft " + "" + "snakeskin bodies" + "" + "."); + case 21: + return newstruct cs2func_script_1000_struct(55, 13263, "Members: Slayer helmet" + "
" + " (after Smoking Kills)", "Members can now craft " + "" + "Slayer helmets" + "" + " (after Smoking Kills)."); + case 22: + return newstruct cs2func_script_1000_struct(57, 1065, "Members: Green dragonhide vambraces", "Members can now craft " + "" + "green dragonhide vambraces" + "" + "."); + case 23: + return newstruct cs2func_script_1000_struct(60, 1099, "Members: Green dragonhide chaps", "Members can now craft " + "" + "green dragonhide chaps" + "" + "."); + case 24: + return newstruct cs2func_script_1000_struct(63, 1135, "Members: Green dragonhide body", "Members can now craft " + "" + "green dragonhide bodies" + "" + "."); + case 25: + return newstruct cs2func_script_1000_struct(64, 10075, "Members: Repairing gloves of silence", "Members can now repair " + "" + "gloves of silence" + "" + " with dark kebbit fur."); + case 26: + return newstruct cs2func_script_1000_struct(66, 2487, "Members: Blue dragonhide vambraces", "Members can now craft " + "" + "blue dragonhide vambraces" + "" + "."); + case 27: + return newstruct cs2func_script_1000_struct(68, 2493, "Members: Blue dragonhide chaps", "Members can now craft " + "" + "blue dragonhide chaps" + "" + "."); + case 28: + return newstruct cs2func_script_1000_struct(71, 2499, "Members: Blue dragonhide body", "Members can now craft " + "" + "blue dragonhide bodies" + "" + "."); + case 29: + return newstruct cs2func_script_1000_struct(73, 2489, "Members: Red dragonhide vambraces", "Members can now craft " + "" + "red dragonhide vambraces" + "" + "."); + case 30: + return newstruct cs2func_script_1000_struct(75, 2495, "Members: Red dragonhide chaps", "Members can now craft " + "" + "red dragonhide chaps" + "" + "."); + case 31: + return newstruct cs2func_script_1000_struct(77, 2501, "Members: Red dragonhide body", "Members can now craft " + "" + "red dragonhide bodies" + "" + "."); + case 32: + return newstruct cs2func_script_1000_struct(79, 12210, "Members: Feathered headdress", "Members can now craft " + "" + "feathered headdresses" + "" + "."); + case 33: + return newstruct cs2func_script_1000_struct(79, 2491, "Members: Black dragonhide vambraces", "Members can now craft " + "" + "black dragonhide vambraces" + "" + "."); + case 34: + return newstruct cs2func_script_1000_struct(82, 2497, "Members: Black dragonhide chaps", "Members can now craft " + "" + "black dragonhide chaps" + "" + "."); + case 35: + return newstruct cs2func_script_1000_struct(84, 2503, "Members: Black dragonhide body", "Members can now craft " + "" + "black dragonhide bodies" + "" + "."); + case 36: + return newstruct cs2func_script_1000_struct(85, 21508, "Members: Necromancer robes", "Members can now craft " + "" + "necromancer robes" + "" + " by using necromancer kits on Dagon'hai robes."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(1, 1759, "Wool", "You can now spin wool from a sheep into " + "" + "balls of wool" + "" + "."); + case 1: + return newstruct cs2func_script_1000_struct(10, 1777, "Members: Flax into bow strings", "Members can now spin flax into " + "" + "bow strings" + "" + "."); + case 2: + return newstruct cs2func_script_1000_struct(10, 9438, "Members: Sinew into crossbow strings", "Members can now spin sinew into " + "" + "crossbow strings" + "" + "."); + case 3: + return newstruct cs2func_script_1000_struct(19, 6038, "Members: Magic tree roots into magic strings", "Members can now spin magic tree roots into " + "" + "magic strings" + "" + "."); + case 4: + return newstruct cs2func_script_1000_struct(30, 954, "Members: Yak hair into rope", "Members can now spin yak hair into " + "" + "rope."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(1, 1931, "Pot", "You can now craft and fire " + "" + "clay pots" + "" + "."); + case 1: + return newstruct cs2func_script_1000_struct(1, 20382, "Cracked mining urn", "You can now craft, fire and attach runes to " + "" + "cracked mining urns" + "" + "."); + case 2: + return newstruct cs2func_script_1000_struct(2, 20352, "Cracked cooking urn", "You can now craft, fire and attach runes to " + "" + "cracked cooking urns" + "" + "."); + case 3: + return newstruct cs2func_script_1000_struct(2, 20322, "Cracked fishing urn", "You can now craft, fire and attach runes to " + "" + "cracked fishing urns" + "" + "."); + case 4: + return newstruct cs2func_script_1000_struct(2, 20412, "Impious urn", "You can now craft, fire and attach runes to " + "" + "impious urns" + "" + "."); + case 5: + return newstruct cs2func_script_1000_struct(4, 20053, "Clay ring", "You can now craft and fire " + "" + "clay rings" + "" + "."); + case 6: + return newstruct cs2func_script_1000_struct(4, 20298, "Cracked woodcutting urn", "You can now craft, fire and attach runes to " + "" + "cracked woodcutting urns" + "" + "."); + case 7: + return newstruct cs2func_script_1000_struct(4, 20274, "Cracked smelting urn", "You can now craft, fire and attach runes to " + "" + "cracked smelting urns" + "" + "."); + case 8: + return newstruct cs2func_script_1000_struct(7, 2313, "Pie dish", "You can now craft and fire " + "" + "clay pie dishes" + "" + "."); + case 9: + return newstruct cs2func_script_1000_struct(8, 1923, "Bowl", "You can now craft and fire " + "" + "clay bowls" + "" + "."); + case 10: + return newstruct cs2func_script_1000_struct(12, 20358, "Fragile cooking urn", "You can now craft, fire and attach runes to " + "" + "fragile cooking urns" + "" + "."); + case 11: + return newstruct cs2func_script_1000_struct(15, 20328, "Fragile fishing urn", "You can now craft, fire and attach runes to " + "" + "fragile fishing urns" + "" + "."); + case 12: + return newstruct cs2func_script_1000_struct(15, 20304, "Fragile woodcutting urn", "You can now craft, fire and attach runes to " + "" + "fragile woodcutting urns" + "" + "."); + case 13: + return newstruct cs2func_script_1000_struct(17, 20388, "Fragile mining urn", "You can now craft, fire and attach runes to " + "" + "fragile mining urns" + "" + "."); + case 14: + return newstruct cs2func_script_1000_struct(17, 20280, "Fragile smelting urn", "You can now craft, fire and attach runes to " + "" + "fragile smelting urns" + "" + "."); + case 15: + return newstruct cs2func_script_1000_struct(19, 5350, "Members: Plant pot", "Members can now craft and fire " + "" + "clay plant pots" + "" + "."); + case 16: + return newstruct cs2func_script_1000_struct(25, 4440, "Members: Pot lid" + "
" + " (after starting One Small Favour)", "Members can now craft and fire " + "" + "clay pot lids" + "" + " (after starting One Small Favour.)"); + case 17: + return newstruct cs2func_script_1000_struct(26, 20418, "Accursed urn", "You can now craft, fire and attach runes to " + "" + "accursed urns" + "" + "."); + case 18: + return newstruct cs2func_script_1000_struct(32, 20394, "Mining urn", "You can now craft, fire and attach runes to " + "" + "mining urns" + "" + "."); + case 19: + return newstruct cs2func_script_1000_struct(35, 20286, "Smelting urn", "You can now craft, fire and attach runes to " + "" + "smelting urns" + "" + "."); + case 20: + return newstruct cs2func_script_1000_struct(36, 20364, "Cooking urn", "You can now craft, fire and attach runes to " + "" + "cooking urns" + "" + "."); + case 21: + return newstruct cs2func_script_1000_struct(41, 20334, "Fishing urn", "You can now craft, fire and attach runes to " + "" + "fishing urns" + "" + "."); + case 22: + return newstruct cs2func_script_1000_struct(44, 20310, "Woodcutting urn", "You can now craft, fire and attach runes to " + "" + "woodcutting urns" + "" + "."); + case 23: + return newstruct cs2func_script_1000_struct(48, 20400, "Members: Strong mining urn", "Members can now craft, fire and attach runes to " + "" + "strong mining urns" + "" + "."); + case 24: + return newstruct cs2func_script_1000_struct(49, 20292, "Members: Strong smelting urn", "Members can now craft, fire and attach runes to " + "" + "strong smelting urns" + "" + "."); + case 25: + return newstruct cs2func_script_1000_struct(51, 20370, "Members: Strong cooking urn", "Members can now craft, fire and attach runes to " + "" + "strong cooking urns" + "" + "."); + case 26: + return newstruct cs2func_script_1000_struct(53, 20340, "Members: Strong fishing urn", "Members can now craft, fire and attach runes to " + "" + "strong fishing urns" + "" + "."); + case 27: + return newstruct cs2func_script_1000_struct(59, 20406, "Members: Decorated mining urn", "Members can now craft, fire and attach runes to " + "" + "decorated mining urns" + "" + "."); + case 28: + return newstruct cs2func_script_1000_struct(61, 20316, "Members: Strong woodcutting urn", "Members can now craft, fire and attach runes to " + "" + "strong woodcutting urns" + "" + "."); + case 29: + return newstruct cs2func_script_1000_struct(62, 20424, "Members: Infernal urn", "Members can now craft, fire and attach runes to " + "" + "infernal urns" + "" + "."); + case 30: + return newstruct cs2func_script_1000_struct(76, 20346, "Members: Decorated fishing urn", "Members can now craft, fire and attach runes to " + "" + "decorated fishing urns" + "" + "."); + case 31: + return newstruct cs2func_script_1000_struct(81, 20376, "Members: Decorated cooking urn", "Members can now craft, fire and attach runes to " + "" + "decorated cooking urns" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(1, 1919, "Members: Beer glass", "Members can now craft " + "" + "beer glasses" + "" + "."); + case 1: + return newstruct cs2func_script_1000_struct(4, 4527, "Members: Candle lantern", "Members can now craft " + "" + "candle lanterns" + "" + "."); + case 2: + return newstruct cs2func_script_1000_struct(12, 4525, "Members: Oil lamp", "Members can now craft " + "" + "oil lamps" + "" + "."); + case 3: + return newstruct cs2func_script_1000_struct(26, 4535, "Members: Oil lantern", "Members can now craft " + "" + "oil lanterns" + "" + "."); + case 4: + return newstruct cs2func_script_1000_struct(33, 229, "Members: Vial", "Members can now craft " + "" + "vials" + "" + "."); + case 5: + return newstruct cs2func_script_1000_struct(42, 6667, "Members: Fishbowl", "Members can now craft " + "" + "fishbowls" + "" + "."); + case 6: + return newstruct cs2func_script_1000_struct(46, 567, "Members: Glass orb", "Members can now craft " + "" + "glass orbs" + "" + "."); + case 7: + return newstruct cs2func_script_1000_struct(49, 4542, "Members: Bullseye lantern lens", "Members can now craft " + "" + "bullseye lantern lenses" + "" + "."); + case 8: + return newstruct cs2func_script_1000_struct(87, 10973, "Members: Dorgeshuun light orb", "Members can now craft " + "" + "Dorgeshuun light orbs" + "" + "."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(1, 21347, "Members: Lapis lazuli brooch", "Members can now craft a " + "" + "lapis lazuli brooch" + "" + "."); + case 1: + return newstruct cs2func_script_1000_struct(1, 1609, "Members: Cut opal", "Members can now cut " + "" + "opals" + "" + "."); + case 2: + return newstruct cs2func_script_1000_struct(3, 10496, "Polished buttons", "You can now craft " + "" + "polished buttons" + "" + "."); + case 3: + return newstruct cs2func_script_1000_struct(5, 1635, "Gold ring", "You can now craft " + "" + "gold rings" + "" + "."); + case 4: + return newstruct cs2func_script_1000_struct(6, 1654, "Gold necklace", "You can now craft " + "" + "gold necklaces" + "" + "."); + case 5: + return newstruct cs2func_script_1000_struct(7, 11069, "Members: Gold bracelet", "Members can now craft " + "" + "gold bracelets" + "" + "."); + case 6: + return newstruct cs2func_script_1000_struct(8, 1692, "Gold amulet", "You can now craft " + "" + "gold amulets" + "" + "."); + case 7: + return newstruct cs2func_script_1000_struct(13, 1611, "Members: Cut jade", "Members can now cut " + "" + "jade" + "" + "."); + case 8: + return newstruct cs2func_script_1000_struct(16, 1716, "Holy symbol", "You can now craft " + "" + "holy symbols" + "" + "."); + case 9: + return newstruct cs2func_script_1000_struct(16, 1613, "Members: Cut red topaz", "Members can now cut " + "" + "red topaz" + "" + "."); + case 10: + return newstruct cs2func_script_1000_struct(17, 1722, "Members: Unholy symbol", "Members can now craft " + "" + "unholy symbols" + "" + "."); + case 11: + return newstruct cs2func_script_1000_struct(20, 1607, "Cut sapphire", "You can now craft " + "" + "sapphires" + "" + "."); + case 12: + return newstruct cs2func_script_1000_struct(20, 1637, "Sapphire ring", "You can now craft " + "" + "sapphire rings" + "" + "."); + case 13: + return newstruct cs2func_script_1000_struct(22, 1656, "Sapphire necklace", "You can now craft " + "" + "sapphire necklaces" + "" + "."); + case 14: + return newstruct cs2func_script_1000_struct(23, 5525, "Tiara", "You can now craft " + "" + "tiaras" + "" + "."); + case 15: + return newstruct cs2func_script_1000_struct(23, 11072, "Members: Sapphire bracelet", "Members can now craft " + "" + "sapphire bracelets" + "" + "."); + case 16: + return newstruct cs2func_script_1000_struct(24, 1694, "Sapphire amulet", "You can now craft " + "" + "sapphire amulets" + "" + "."); + case 17: + return newstruct cs2func_script_1000_struct(27, 1605, "Cut emerald", "You can now cut " + "" + "emeralds" + "" + "."); + case 18: + return newstruct cs2func_script_1000_struct(27, 1639, "Emerald ring", "You can now craft " + "" + "emerald rings" + "" + "."); + case 19: + return newstruct cs2func_script_1000_struct(29, 1658, "Emerald necklace", "You can now craft " + "" + "emerald necklaces" + "" + "."); + case 20: + return newstruct cs2func_script_1000_struct(30, 11076, "Members: Emerald bracelet", "Members can now craft " + "" + "emerald bracelets" + "" + "."); + case 21: + return newstruct cs2func_script_1000_struct(31, 1696, "Emerald amulet", "You can now craft " + "" + "emerald amulets" + "" + "."); + case 22: + return newstruct cs2func_script_1000_struct(34, 1603, "Cut ruby", "You can now cut " + "" + "rubies" + "" + "."); + case 23: + return newstruct cs2func_script_1000_struct(34, 1641, "Ruby ring", "You can now craft " + "" + "ruby rings" + "" + "."); + case 24: + return newstruct cs2func_script_1000_struct(37, 10132, "Members: Rabbit-foot necklaces", "Members can now craft " + "" + "rabbit-foot necklaces" + "" + "."); + case 25: + return newstruct cs2func_script_1000_struct(40, 1660, "Ruby necklace", "You can now craft " + "" + "ruby necklaces" + "" + "."); + case 26: + return newstruct cs2func_script_1000_struct(42, 11085, "Members: Ruby bracelet", "Members can now craft " + "" + "ruby bracelets" + "" + "."); + case 27: + return newstruct cs2func_script_1000_struct(43, 1601, "Cut diamond", "You can now cut " + "" + "diamonds" + "" + "."); + case 28: + return newstruct cs2func_script_1000_struct(43, 1643, "Diamond ring", "You can now craft " + "" + "diamond rings" + "" + "."); + case 29: + return newstruct cs2func_script_1000_struct(50, 1698, "Ruby amulet", "You can now craft " + "" + "ruby amulets" + "" + "."); + case 30: + return newstruct cs2func_script_1000_struct(55, 1615, "Members: Cut dragonstone", "Members can now cut " + "" + "dragonstones" + "" + "."); + case 31: + return newstruct cs2func_script_1000_struct(55, 1645, "Members: Dragonstone ring", "Members can now craft " + "" + "dragonstone rings" + "" + "."); + case 32: + return newstruct cs2func_script_1000_struct(56, 1662, "Diamond necklace", "You can now craft " + "" + "diamond necklaces" + "" + "."); + case 33: + return newstruct cs2func_script_1000_struct(58, 11092, "Members: Diamond bracelet", "Members can now craft " + "" + "diamond bracelets" + "" + "."); + case 34: + return newstruct cs2func_script_1000_struct(67, 6573, "Members: Cut onyx", "Members can now cut " + "" + "onyx" + "" + "."); + case 35: + return newstruct cs2func_script_1000_struct(67, 6575, "Members: Onyx ring", "Members can now craft " + "" + "onyx rings" + "" + "."); + case 36: + return newstruct cs2func_script_1000_struct(70, 1700, "Diamond amulet", "You can now craft " + "" + "diamond amulets" + "" + "."); + case 37: + return newstruct cs2func_script_1000_struct(72, 1664, "Members: Dragonstone necklace", "Members can now craft " + "" + "dragonstone necklaces" + "" + "."); + case 38: + return newstruct cs2func_script_1000_struct(74, 11115, "Members: Dragonstone bracelet", "Members can now craft " + "" + "dragonstone bracelets" + "" + "."); + case 39: + return newstruct cs2func_script_1000_struct(75, 13281, "Members: Ring of slaying" + "
" + " (after Smoking Kills)", "Members can now craft " + "" + "rings of slaying" + "" + " (after Smoking Kills)."); + case 40: + return newstruct cs2func_script_1000_struct(80, 1702, "Members: Dragonstone amulet", "Members can now craft " + "" + "dragonstone amulets" + "" + "."); + case 41: + return newstruct cs2func_script_1000_struct(82, 6577, "Members: Onyx necklace", "Members can now craft " + "" + "onyx necklaces" + "" + "."); + case 42: + return newstruct cs2func_script_1000_struct(84, 11130, "Members: Onyx bracelet", "Members can now craft " + "" + "onyx bracelets" + "" + "."); + case 43: + return newstruct cs2func_script_1000_struct(90, 6581, "Members: Onyx amulet", "Members can now craft " + "" + "onyx amulets" + "" + "."); + case 44: + return newstruct cs2func_script_1000_struct(91, 21526, "Members: Shark's tooth necklace", "Members can now craft " + "" + "shark's tooth necklaces" + "" + "."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(18, 2961, "Members: Silver sickle", "Members can now craft silver sickles."); + case 1: + return newstruct cs2func_script_1000_struct(21, 9145, "Silver crossbow bolt", "Members can now craft " + "" + "silver crossbow bolts" + "" + "."); + case 2: + return newstruct cs2func_script_1000_struct(54, 1395, "Members: Water battlestaff", "Members can now craft " + "" + "water battlestaves" + "" + "."); + case 3: + return newstruct cs2func_script_1000_struct(58, 1399, "Members: Earth battlestaff", "Members can now craft " + "" + "earth battlestaves" + "" + "."); + case 4: + return newstruct cs2func_script_1000_struct(62, 1393, "Members: Fire battlestaff", "Members can now craft " + "" + "fire battlestaves" + "" + "."); + case 5: + return newstruct cs2func_script_1000_struct(66, 1397, "Members: Air battlestaff", "Members can now craft " + "" + "air battlestaves" + "" + "."); + case 6: + return newstruct cs2func_script_1000_struct(77, 21777, "Members: Armadyl battlestaff" + "
" + " (after Ritual of the Mahjarrat)", "Members can now craft " + "" + "Armadyl battlestaves" + "" + " (after Ritual of the Mahjarrat)."); + case 7: + return newstruct cs2func_script_1000_struct(85, 21490, "Members: Skeletal and Necromancer Staves", "Members can now use shade skulls to create " + "" + "skeletal" + "" + " and " + "" + "necromancer staves" + "" + " from Shades of Mort'ton."); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(-1, 7620, "To start Firemaking in the manner of the barbarians, talk to Otto Godblessed when you have level 35 Firemaking or higher. Pyre ships can only be constructed and burnt where the ground is charred around the lake next to Otto's hut.", ""); + case 1: + return newstruct cs2func_script_1000_struct(11, 1511, "Members: Wood" + "
" + " (with 11 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "wood pyre ships" + "" + ". (They also need level 11 Firemaking.)"); + case 2: + return newstruct cs2func_script_1000_struct(11, 2862, "Members: Achey" + "
" + " (with 11 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "achey log pyre ships" + "" + ". (They also need level 11 Firemaking.)"); + case 3: + return newstruct cs2func_script_1000_struct(25, 1521, "Members: Oak" + "
" + " (with 25 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "oak pyre ships" + "" + ". (They also need level 25 Firemaking.)"); + case 4: + return newstruct cs2func_script_1000_struct(40, 1519, "Members: Willow" + "
" + " (with 40 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "willow pyre ships" + "" + ". (They also need level 40 Firemaking.)"); + case 5: + return newstruct cs2func_script_1000_struct(45, 6333, "Members: Teak" + "
" + " (with 45 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "teak pyre ships" + "" + ". (They also need level 45 Firemaking.)"); + case 6: + return newstruct cs2func_script_1000_struct(52, 10810, "Members: Arctic pine" + "
" + " (with 52 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "arctic pine pyre ships" + "" + ". (They also need level 52 Firemaking.)"); + case 7: + return newstruct cs2func_script_1000_struct(55, 1517, "Members: Maple" + "
" + " (with 55 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "maple pyre ships" + "" + ". (They also need level 55 Firemaking.)"); + case 8: + return newstruct cs2func_script_1000_struct(60, 6332, "Members: Mahogany" + "
" + " (with 60 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "mahogany pyre ships" + "" + ". (They also need level 60 Firemaking.)"); + case 9: + return newstruct cs2func_script_1000_struct(68, 12581, "Members: Eucalyptus" + "
" + " (with 68 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "eucalyptus pyre ships" + "" + ". (They also need level 68 Firemaking.)"); + case 10: + return newstruct cs2func_script_1000_struct(70, 1515, "Members: Yew" + "
" + " (with 70 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "yew pyre ships" + "" + ". (They also need level 70 Firemaking.)"); + case 11: + return newstruct cs2func_script_1000_struct(85, 1513, "Members: Magic" + "
" + " (with 85 Firemaking)", "Members versed in the art of barbarian firemaking now have the Crafting level required to make " + "" + "magic log pyre ships" + "" + ". (They also need level 85 Firemaking.)"); + } + break; + case 8: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(8, 8792, "Members: Clockwork mechanism", "Members can now craft " + "" + "clockwork mechanisms" + "" + " in the workshop of their player-owned house."); + case 1: + return newstruct cs2func_script_1000_struct(10, 2522, "Members: Toy horsey", "Members can now craft " + "" + "toy horseys" + "" + " in the workshop of their player-owned house."); + case 2: + return newstruct cs2func_script_1000_struct(13, 7761, "Members: Clockwork soldier", "Members can now craft " + "" + "clockwork soldiers" + "" + " in the workshop of their player-owned house."); + case 3: + return newstruct cs2func_script_1000_struct(18, 7765, "Members: Clockwork doll", "Members can now craft " + "" + "clockwork dolls" + "" + " in the workshop of their player-owned house."); + case 4: + return newstruct cs2func_script_1000_struct(20, 4201, "Members: Conductor" + "
" + " (after starting Creature of Fenkenstrain)", "Members can now make " + "" + "lightning conductors" + "" + " (after starting Creature of Fenkenstrain)."); + case 5: + return newstruct cs2func_script_1000_struct(23, 2574, "Members: Sextant", "Members can now craft " + "" + "sextants" + "" + " in the workshop of their player-owned house."); + case 6: + return newstruct cs2func_script_1000_struct(25, 18338, "Gem bag" + "
" + " (with 25 Dungeoneering)", "You can now use " + "" + "gem bags" + "" + ". (You also need level 25 Dungeoneering.)"); + case 7: + return newstruct cs2func_script_1000_struct(28, 2575, "Members: Watch", "Members can now craft " + "" + "watches" + "" + " in the workshop of their player-owned house."); + case 8: + return newstruct cs2func_script_1000_struct(30, 10595, "Members: Clockwork penguins", "Members can now craft " + "" + "clockwork penguins" + "" + " in the workshop of their player-owned house."); + case 9: + return newstruct cs2func_script_1000_struct(33, 7769, "Members: Clockwork mouse", "Members can now craft " + "" + "clockwork mice" + "" + " in the workshop of their player-owned house."); + case 10: + return newstruct cs2func_script_1000_struct(43, 13246, "Members: Pillar" + "
" + " (after starting TokTz-Ket-Dill)", "Members can now make " + "" + "pillars" + "" + " (after starting TokTz-Ket-Dill)."); + case 11: + return newstruct cs2func_script_1000_struct(85, 7771, "Members: Clockwork cat", "Members can now craft " + "" + "clockwork cats" + "" + " in the workshop of their player-owned house."); + } + break; + case 9: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(60, 20704, "Members: access to the Livid Farm (with 70 Magic, 60 Agility, 60 Farming, 50 Construction and Lunar Diplomacy)", "Members can access " + "" + "Livid Farm" + "" + " (with 70 Magic, 60 Agility, 60 Farming, 50 Construction and Lunar Diplomacy)."); + case 1: + return newstruct cs2func_script_1000_struct(91, 18778, "Members: Starved ancient effigies", "Members can now investigate " + "" + "starved ancient effigies" + "" + " using their knowledge of Crafting."); + case 2: + return newstruct cs2func_script_1000_struct(93, 18779, "Members: Nourished ancient effigies", "Members can now investigate " + "" + "nourished ancient effigies" + "" + " using their knowledge of Crafting."); + case 3: + return newstruct cs2func_script_1000_struct(95, 18780, "Members: Sated ancient effigies", "Members can now investigate " + "" + "sated ancient effigies" + "" + " using their knowledge of Crafting."); + case 4: + return newstruct cs2func_script_1000_struct(97, 18781, "Members: Gorged ancient effigies", "Members can now investigate " + "" + "gorged ancient effigies" + "" + " using their knowledge of Crafting."); + } + break; + case 10: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(1, 14152, "Members: Stealing Creation - class 1 butterfly net", "Members can now craft " + "" + "class 1 butterfly nets" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_1000_struct(1, 14142, "Members: Stealing Creation - class 1 harpoon", "Members can now craft " + "" + "class 1 harpoons" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_1000_struct(1, 14377, "Members: Stealing Creation - class 1 staff", "Members can now craft " + "" + "class 1 staves" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_1000_struct(1, 14391, "Members: Stealing Creation - class 1 leather body", "Members can now craft " + "" + "class 1 leather bodies" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_1000_struct(1, 14401, "Members: Stealing Creation - class 1 chaps", "Members can now craft " + "" + "class 1 chaps" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_1000_struct(1, 14411, "Members: Stealing Creation - class 1 coif", "Members can now craft " + "" + "class 1 coifs" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_1000_struct(1, 14317, "Members: Stealing Creation - class 1 robe top", "Members can now craft " + "" + "class 1 robe tops" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_1000_struct(1, 14327, "Members: Stealing Creation - class 1 robe bottom", "Members can now craft " + "" + "class 1 robe bottoms" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_1000_struct(1, 14337, "Members: Stealing Creation - class 1 hat", "Members can now craft " + "" + "class 1 hats" + "" + " in Stealing Creation."); + case 9: + return newstruct cs2func_script_1000_struct(20, 14154, "Members: Stealing Creation - class 2 butterfly net", "Members can now craft " + "" + "class 2 butterfly nets" + "" + " in Stealing Creation."); + case 10: + return newstruct cs2func_script_1000_struct(20, 14144, "Members: Stealing Creation - class 2 harpoon", "Members can now craft " + "" + "class 2 harpoons" + "" + " in Stealing Creation."); + case 11: + return newstruct cs2func_script_1000_struct(20, 14379, "Members: Stealing Creation - class 2 staff", "Members can now craft " + "" + "class 2 staves" + "" + " in Stealing Creation."); + case 12: + return newstruct cs2func_script_1000_struct(20, 14393, "Members: Stealing Creation - class 2 leather body", "Members can now craft " + "" + "class 2 leather bodies" + "" + " in Stealing Creation."); + case 13: + return newstruct cs2func_script_1000_struct(20, 14403, "Members: Stealing Creation - class 2 chaps", "Members can now craft " + "" + "class 2 chaps" + "" + " in Stealing Creation."); + case 14: + return newstruct cs2func_script_1000_struct(20, 14413, "Members: Stealing Creation - class 2 coif", "Members can now craft " + "" + "class 2 coifs" + "" + " in Stealing Creation."); + case 15: + return newstruct cs2func_script_1000_struct(20, 14319, "Members: Stealing Creation - class 2 robe top", "Members can now craft " + "" + "class 2 robe tops" + "" + " in Stealing Creation."); + case 16: + return newstruct cs2func_script_1000_struct(20, 14329, "Members: Stealing Creation - class 2 robe bottom", "Members can now craft " + "" + "class 2 robe bottoms" + "" + " in Stealing Creation."); + case 17: + return newstruct cs2func_script_1000_struct(20, 14339, "Members: Stealing Creation - class 2 hat", "Members can now craft " + "" + "class 2 hats" + "" + " in Stealing Creation."); + case 18: + return newstruct cs2func_script_1000_struct(40, 14156, "Members: Stealing Creation - class 3 butterfly net", "Members can now craft " + "" + "class 3 butterfly nets" + "" + " in Stealing Creation."); + case 19: + return newstruct cs2func_script_1000_struct(40, 14146, "Members: Stealing Creation - class 3 harpoon", "Members can now craft " + "" + "class 3 harpoons" + "" + " in Stealing Creation."); + case 20: + return newstruct cs2func_script_1000_struct(40, 14381, "Members: Stealing Creation - class 3 staff", "Members can now craft " + "" + "class 3 staves" + "" + " in Stealing Creation."); + case 21: + return newstruct cs2func_script_1000_struct(40, 14395, "Members: Stealing Creation - class 3 leather body", "Members can now craft " + "" + "class 3 leather bodies" + "" + " in Stealing Creation."); + case 22: + return newstruct cs2func_script_1000_struct(40, 14405, "Members: Stealing Creation - class 3 chaps", "Members can now craft " + "" + "class 3 chaps" + "" + " in Stealing Creation."); + case 23: + return newstruct cs2func_script_1000_struct(40, 14415, "Members: Stealing Creation - class 3 coif", "Members can now craft " + "" + "class 3 coifs" + "" + " in Stealing Creation."); + case 24: + return newstruct cs2func_script_1000_struct(40, 14321, "Members: Stealing Creation - class 3 robe top", "Members can now craft " + "" + "class 3 robe tops" + "" + " in Stealing Creation."); + case 25: + return newstruct cs2func_script_1000_struct(40, 14331, "Members: Stealing Creation - class 3 robe bottom", "Members can now craft " + "" + "class 3 robe bottoms" + "" + " in Stealing Creation."); + case 26: + return newstruct cs2func_script_1000_struct(40, 14341, "Members: Stealing Creation - class 3 hat", "Members can now craft " + "" + "class 3 hats" + "" + " in Stealing Creation."); + case 27: + return newstruct cs2func_script_1000_struct(52, 14619, "Members: Phoenix lair - funeral pyre", "Members can now craft the phoenix's " + "" + "funeral pyre" + "" + " in the phoenix lair."); + case 28: + return newstruct cs2func_script_1000_struct(60, 14158, "Members: Stealing Creation - class 4 butterfly net", "Members can now craft " + "" + "class 4 butterfly nets" + "" + " in Stealing Creation."); + case 29: + return newstruct cs2func_script_1000_struct(60, 14148, "Members: Stealing Creation - class 4 harpoon", "Members can now craft " + "" + "class 4 harpoons" + "" + " in Stealing Creation."); + case 30: + return newstruct cs2func_script_1000_struct(60, 14383, "Members: Stealing Creation - class 4 staff", "Members can now craft " + "" + "class 4 staves" + "" + " in Stealing Creation."); + case 31: + return newstruct cs2func_script_1000_struct(60, 14397, "Members: Stealing Creation - class 4 leather body", "Members can now craft " + "" + "class 4 leather bodies" + "" + " in Stealing Creation."); + case 32: + return newstruct cs2func_script_1000_struct(60, 14407, "Members: Stealing Creation - class 4 chaps", "Members can now craft " + "" + "class 4 chaps" + "" + " in Stealing Creation."); + case 33: + return newstruct cs2func_script_1000_struct(60, 14417, "Members: Stealing Creation - class 4 coif", "Members can now craft " + "" + "class 4 coifs" + "" + " in Stealing Creation."); + case 34: + return newstruct cs2func_script_1000_struct(60, 14323, "Members: Stealing Creation - class 4 robe top", "Members can now craft " + "" + "class 4 robe tops" + "" + " in Stealing Creation."); + case 35: + return newstruct cs2func_script_1000_struct(60, 14333, "Members: Stealing Creation - class 4 robe bottom", "Members can now craft " + "" + "class 4 robe bottoms" + "" + " in Stealing Creation."); + case 36: + return newstruct cs2func_script_1000_struct(60, 14343, "Members: Stealing Creation - class 4 hat", "Members can now craft " + "" + "class 4 hats" + "" + " in Stealing Creation."); + case 37: + return newstruct cs2func_script_1000_struct(80, 14160, "Members: Stealing Creation - class 5 butterfly net", "Members can now craft " + "" + "class 5 butterfly nets" + "" + " in Stealing Creation."); + case 38: + return newstruct cs2func_script_1000_struct(80, 14150, "Members: Stealing Creation - class 5 harpoon", "Members can now craft " + "" + "class 5 harpoons" + "" + " in Stealing Creation."); + case 39: + return newstruct cs2func_script_1000_struct(80, 14385, "Members: Stealing Creation - class 5 staff", "Members can now craft " + "" + "class 5 staves" + "" + " in Stealing Creation."); + case 40: + return newstruct cs2func_script_1000_struct(80, 14399, "Members: Stealing Creation - class 5 leather body", "Members can now craft " + "" + "class 5 leather bodies" + "" + " in Stealing Creation."); + case 41: + return newstruct cs2func_script_1000_struct(80, 14409, "Members: Stealing Creation - class 5 chaps", "Members can now craft " + "" + "class 5 chaps" + "" + " in Stealing Creation."); + case 42: + return newstruct cs2func_script_1000_struct(80, 14419, "Members: Stealing Creation - class 5 coif", "Members can now craft " + "" + "class 5 coifs" + "" + " in Stealing Creation."); + case 43: + return newstruct cs2func_script_1000_struct(80, 14325, "Members: Stealing Creation - class 5 robe top", "Members can now craft " + "" + "class 5 robe tops" + "" + " in Stealing Creation."); + case 44: + return newstruct cs2func_script_1000_struct(80, 14335, "Members: Stealing Creation - class 5 robe bottom", "Members can now craft " + "" + "class 5 robe bottoms" + "" + " in Stealing Creation."); + case 45: + return newstruct cs2func_script_1000_struct(80, 14345, "Members: Stealing Creation - class 5 hat", "Members can now craft " + "" + "class 5 hats" + "" + " in Stealing Creation."); + } + break; + case 11: + switch (arg1) { + case 0: + return newstruct cs2func_script_1000_struct(-1, 15707, "Dungeoneering skill tasks (Levels 1-99)" + "
" + "As your Crafting level increases, you will be able to attempt higher-level crafting tasks within Daemonheim. You will also be more likely to succeed when attempting crafting tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1000_struct(1, 17151, "Salve gloves (Tier 1)", "You can now craft " + "" + "salve gloves" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1000_struct(1, 17195, "Protoleather vambraces (Tier 1)", "You can now craft " + "" + "protoleather vambraces" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_1000_struct(2, 16911, "Salve shoes (Tier 1)", "You can now craft " + "" + "salve shoes" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1000_struct(3, 17297, "Protoleather boots (Tier 1)", "You can now craft " + "" + "protoleather boots" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_1000_struct(4, 16735, "Salve hood (Tier 1)", "You can now craft " + "" + "salve hoods" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_1000_struct(5, 17041, "Protoleather coif (Tier 1)", "You can now craft " + "" + "protoleather coifs" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_1000_struct(6, 16845, "Salve robe bottom (Tier 1)", "You can now craft " + "" + "salve robe bottoms" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_1000_struct(7, 17319, "Protoleather chaps (Tier 1)", "You can now craft " + "" + "protoleather chaps" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_1000_struct(8, 17217, "Salve robe top (Tier 1)", "You can now craft " + "" + "salve robe tops" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1000_struct(9, 17173, "Protoleather body (Tier 1)", "You can now craft " + "" + "protoleather bodies" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_1000_struct(10, 17153, "Wildercress gloves (Tier 2)", "You can now craft " + "" + "wildercress gloves" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_1000_struct(11, 17197, "Subleather vambraces (Tier 2)", "You can now craft " + "" + "subleather vambraces" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_1000_struct(12, 16913, "Wildercress shoes (Tier 2)", "You can now craft " + "" + "wildercress shoes" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_1000_struct(13, 17299, "Subleather boots (Tier 2)", "You can now craft " + "" + "subleather boots" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_1000_struct(14, 16737, "Wildercress hood (Tier 2)", "You can now craft " + "" + "wildercress hoods" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_1000_struct(15, 17043, "Subleather coif (Tier 2)", "You can now craft " + "" + "subleather coifs" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_1000_struct(16, 16847, "Wildercress robe bottom (Tier 2)", "You can now craft " + "" + "wildercress robe bottoms" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_1000_struct(17, 17321, "Subleather chaps (Tier 2)", "You can now craft " + "" + "subleather chaps" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_1000_struct(18, 17219, "Wildercress robe top (Tier 2)", "You can now craft " + "" + "wildercress robe tops" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_1000_struct(19, 17175, "Subleather body (Tier 2)", "You can now craft " + "" + "subleather bodies" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_1000_struct(20, 17155, "Blightleaf gloves (Tier 3)", "You can now craft " + "" + "blightleaf gloves" + "" + " within Daemonheim."); + case 22: + return newstruct cs2func_script_1000_struct(21, 17199, "Paraleather vambraces (Tier 3)", "You can now craft " + "" + "paraleather vambraces" + "" + " within Daemonheim."); + case 23: + return newstruct cs2func_script_1000_struct(22, 16915, "Blightleaf shoes (Tier 3)", "You can now craft " + "" + "blightleaf shoes" + "" + " within Daemonheim."); + case 24: + return newstruct cs2func_script_1000_struct(23, 17301, "Paraleather boots (Tier 3)", "You can now craft " + "" + "paraleather boots" + "" + " within Daemonheim."); + case 25: + return newstruct cs2func_script_1000_struct(24, 16739, "Blightleaf hood (Tier 3)", "You can now craft " + "" + "blightleaf hoods" + "" + " within Daemonheim."); + case 26: + return newstruct cs2func_script_1000_struct(25, 17045, "Paraleather coif (Tier 3)", "You can now craft " + "" + "paraleather coifs" + "" + " within Daemonheim."); + case 27: + return newstruct cs2func_script_1000_struct(26, 16849, "Blightleaf robe bottom (Tier 3)", "You can now craft " + "" + "blightleaf robe bottoms" + "" + " within Daemonheim."); + case 28: + return newstruct cs2func_script_1000_struct(27, 17323, "Paraleather chaps (Tier 3)", "You can now craft " + "" + "paraleather chaps" + "" + " within Daemonheim."); + case 29: + return newstruct cs2func_script_1000_struct(28, 17221, "Blightleaf robe top (Tier 3)", "You can now craft " + "" + "blightleaf robe tops" + "" + " within Daemonheim."); + case 30: + return newstruct cs2func_script_1000_struct(29, 17177, "Paraleather body (Tier 3)", "You can now craft " + "" + "paraleather bodies" + "" + " within Daemonheim."); + case 31: + return newstruct cs2func_script_1000_struct(30, 17157, "Roseblood gloves (Tier 4)", "You can now craft " + "" + "roseblood gloves" + "" + " within Daemonheim."); + case 32: + return newstruct cs2func_script_1000_struct(31, 17201, "Archleather vambraces (Tier 4)", "You can now craft " + "" + "archleather vambraces" + "" + " within Daemonheim."); + case 33: + return newstruct cs2func_script_1000_struct(32, 16917, "Roseblood shoes (Tier 4)", "You can now craft " + "" + "roseblood shoes" + "" + " within Daemonheim."); + case 34: + return newstruct cs2func_script_1000_struct(33, 17303, "Archleather boots (Tier 4)", "You can now craft " + "" + "archleather boots" + "" + " within Daemonheim."); + case 35: + return newstruct cs2func_script_1000_struct(34, 16741, "Roseblood hood (Tier 4)", "You can now craft " + "" + "roseblood hoods" + "" + " within Daemonheim."); + case 36: + return newstruct cs2func_script_1000_struct(35, 17047, "Archleather coif (Tier 4)", "You can now craft " + "" + "archleather coifs" + "" + " within Daemonheim."); + case 37: + return newstruct cs2func_script_1000_struct(36, 16851, "Roseblood robe bottom (Tier 4)", "You can now craft " + "" + "roseblood robe bottoms" + "" + " within Daemonheim."); + case 38: + return newstruct cs2func_script_1000_struct(37, 17325, "Archleather chaps (Tier 4)", "You can now craft " + "" + "archleather chaps" + "" + " within Daemonheim."); + case 39: + return newstruct cs2func_script_1000_struct(38, 17223, "Roseblood robe top (Tier 4)", "You can now craft " + "" + "roseblood robe tops" + "" + " within Daemonheim."); + case 40: + return newstruct cs2func_script_1000_struct(39, 17179, "Archleather body (Tier 4)", "You can now craft " + "" + "archleather bodies" + "" + " within Daemonheim."); + case 41: + return newstruct cs2func_script_1000_struct(40, 17159, "Bryll gloves (Tier 5)", "You can now craft " + "" + "bryll gloves" + "" + " within Daemonheim."); + case 42: + return newstruct cs2func_script_1000_struct(41, 17203, "Dromoleather vambraces (Tier 5)", "You can now craft " + "" + "dromoleather vambraces" + "" + " within Daemonheim."); + case 43: + return newstruct cs2func_script_1000_struct(42, 16919, "Bryll shoes (Tier 5)", "You can now craft " + "" + "bryll shoes" + "" + " within Daemonheim."); + case 44: + return newstruct cs2func_script_1000_struct(43, 17305, "Dromoleather boots (Tier 5)", "You can now craft " + "" + "dromoleather boots" + "" + " within Daemonheim."); + case 45: + return newstruct cs2func_script_1000_struct(44, 16743, "Bryll hood (Tier 5)", "You can now craft " + "" + "bryll hoods" + "" + " within Daemonheim."); + case 46: + return newstruct cs2func_script_1000_struct(45, 17049, "Dromoleather coif (Tier 5)", "You can now craft " + "" + "dromoleather coifs" + "" + " within Daemonheim."); + case 47: + return newstruct cs2func_script_1000_struct(46, 16853, "Bryll robe bottom (Tier 5)", "You can now craft " + "" + "bryll robe bottoms" + "" + " within Daemonheim."); + case 48: + return newstruct cs2func_script_1000_struct(47, 17327, "Dromoleather chaps (Tier 5)", "You can now craft " + "" + "dromoleather chaps" + "" + " within Daemonheim."); + case 49: + return newstruct cs2func_script_1000_struct(48, 17225, "Bryll robe top (Tier 5)", "You can now craft " + "" + "bryll robe tops" + "" + " within Daemonheim."); + case 50: + return newstruct cs2func_script_1000_struct(49, 17181, "Dromoleather body (Tier 5)", "You can now craft " + "" + "dromoleather bodies" + "" + " within Daemonheim."); + case 51: + return newstruct cs2func_script_1000_struct(50, 17161, "Members: Duskweed gloves (Tier 6)", "Members can now craft " + "" + "duskweed gloves" + "" + " within Daemonheim."); + case 52: + return newstruct cs2func_script_1000_struct(51, 17205, "Members: Spinoleather vambraces (Tier 6)", "Members can now craft " + "" + "spinoleather vambraces" + "" + " within Daemonheim."); + case 53: + return newstruct cs2func_script_1000_struct(52, 16921, "Members: Duskweed shoes (Tier 6)", "Members can now craft " + "" + "duskweed shoes" + "" + " within Daemonheim."); + case 54: + return newstruct cs2func_script_1000_struct(53, 17307, "Members: Spinoleather boots (Tier 6)", "Members can now craft " + "" + "spinoleather boots" + "" + " within Daemonheim."); + case 55: + return newstruct cs2func_script_1000_struct(54, 16745, "Members: Duskweed hood (Tier 6)", "Members can now craft " + "" + "duskweed hoods" + "" + " within Daemonheim."); + case 56: + return newstruct cs2func_script_1000_struct(55, 17051, "Members: Spinoleather coif (Tier 6)", "Members can now craft " + "" + "spinoleather coifs" + "" + " within Daemonheim."); + case 57: + return newstruct cs2func_script_1000_struct(56, 16855, "Members: Duskweed robe bottom (Tier 6)", "Members can now craft " + "" + "duskweed robe bottoms" + "" + " within Daemonheim."); + case 58: + return newstruct cs2func_script_1000_struct(57, 17329, "Members: Spinoleather chaps (Tier 6)", "Members can now craft " + "" + "spinoleather chaps" + "" + " within Daemonheim."); + case 59: + return newstruct cs2func_script_1000_struct(58, 17227, "Members: Duskweed robe top (Tier 6)", "Members can now craft " + "" + "duskweed robe tops" + "" + " within Daemonheim."); + case 60: + return newstruct cs2func_script_1000_struct(59, 17183, "Members: Spinoleather body (Tier 6)", "Members can now craft " + "" + "spinoleather bodies" + "" + " within Daemonheim."); + case 61: + return newstruct cs2func_script_1000_struct(60, 17163, "Members: Soulbell gloves (Tier 7)", "Members can now craft " + "" + "soulbell gloves" + "" + " within Daemonheim."); + case 62: + return newstruct cs2func_script_1000_struct(61, 17207, "Members: Gallileather vambraces (Tier 7)", "Members can now craft " + "" + "gallileather vambraces" + "" + " within Daemonheim."); + case 63: + return newstruct cs2func_script_1000_struct(62, 16923, "Members: Soulbell shoes (Tier 7)", "Members can now craft " + "" + "soulbell shoes" + "" + " within Daemonheim."); + case 64: + return newstruct cs2func_script_1000_struct(63, 17309, "Members: Gallileather boots (Tier 7)", "Members can now craft " + "" + "gallileather boots" + "" + " within Daemonheim."); + case 65: + return newstruct cs2func_script_1000_struct(64, 16747, "Members: Soulbell hood (Tier 7)", "Members can now craft " + "" + "soulbell hoods" + "" + " within Daemonheim."); + case 66: + return newstruct cs2func_script_1000_struct(65, 17053, "Members: Gallileather coif (Tier 7)", "Members can now craft " + "" + "gallileather coifs" + "" + " within Daemonheim."); + case 67: + return newstruct cs2func_script_1000_struct(66, 16857, "Members: Soulbell robe bottom (Tier 7)", "Members can now craft " + "" + "soulbell robe bottoms" + "" + " within Daemonheim."); + case 68: + return newstruct cs2func_script_1000_struct(67, 17331, "Members: Gallileather chaps (Tier 7)", "Members can now craft " + "" + "gallileather chaps" + "" + " within Daemonheim."); + case 69: + return newstruct cs2func_script_1000_struct(68, 17229, "Members: Soulbell robe top (Tier 7)", "Members can now craft " + "" + "soulbell robe tops" + "" + " within Daemonheim."); + case 70: + return newstruct cs2func_script_1000_struct(69, 17185, "Members: Gallileather body (Tier 7)", "Members can now craft " + "" + "gallileather bodies" + "" + " within Daemonheim."); + case 71: + return newstruct cs2func_script_1000_struct(70, 17165, "Members: Ectogloves (Tier 8)", "Members can now craft " + "" + "ectogloves" + "" + " within Daemonheim."); + case 72: + return newstruct cs2func_script_1000_struct(71, 17209, "Members: Stegoleather vambraces (Tier 8)", "Members can now craft " + "" + "stegoleather vambraces" + "" + " within Daemonheim."); + case 73: + return newstruct cs2func_script_1000_struct(72, 16925, "Members: Ectoshoes (Tier 8)", "Members can now craft " + "" + "ectoshoes" + "" + " within Daemonheim."); + case 74: + return newstruct cs2func_script_1000_struct(73, 17311, "Members: Stegoleather boots (Tier 8)", "Members can now craft " + "" + "stegoleather boots" + "" + " within Daemonheim."); + case 75: + return newstruct cs2func_script_1000_struct(74, 16749, "Members: Ectohood (Tier 8)", "Members can now craft " + "" + "ectohoods" + "" + " within Daemonheim."); + case 76: + return newstruct cs2func_script_1000_struct(75, 17055, "Members: Stegoleather coif (Tier 8)", "Members can now craft " + "" + "stegoleather coifs" + "" + " within Daemonheim."); + case 77: + return newstruct cs2func_script_1000_struct(76, 16859, "Members: Ectorobe bottom (Tier 8)", "Members can now craft " + "" + "ectorobe bottoms" + "" + " within Daemonheim."); + case 78: + return newstruct cs2func_script_1000_struct(77, 17333, "Members: Stegoleather chaps (Tier 8)", "Members can now craft " + "" + "stegoleather chaps" + "" + " within Daemonheim."); + case 79: + return newstruct cs2func_script_1000_struct(78, 17231, "Members: Ectorobe top (Tier 8)", "Members can now craft " + "" + "ectorobe tops" + "" + " within Daemonheim."); + case 80: + return newstruct cs2func_script_1000_struct(79, 17187, "Members: Stegoleather body (Tier 8)", "Members can now craft " + "" + "stegoleather bodies" + "" + " within Daemonheim."); + case 81: + return newstruct cs2func_script_1000_struct(80, 17167, "Members: Runic gloves (Tier 9)", "Members can now craft " + "" + "runic gloves" + "" + " within Daemonheim."); + case 82: + return newstruct cs2func_script_1000_struct(81, 17211, "Members: Megaleather vambraces (Tier 9)", "Members can now craft " + "" + "megaleather vambraces" + "" + " within Daemonheim."); + case 83: + return newstruct cs2func_script_1000_struct(82, 16927, "Members: Runic shoes (Tier 9)", "Members can now craft " + "" + "runic shoes" + "" + " within Daemonheim."); + case 84: + return newstruct cs2func_script_1000_struct(83, 17313, "Members: Megaleather boots (Tier 9)", "Members can now craft " + "" + "megaleather boots" + "" + " within Daemonheim."); + case 85: + return newstruct cs2func_script_1000_struct(84, 16751, "Members: Runic hood (Tier 9)", "Members can now craft " + "" + "runic hoods" + "" + " within Daemonheim."); + case 86: + return newstruct cs2func_script_1000_struct(85, 17057, "Members: Megaleather coif (Tier 9)", "Members can now craft " + "" + "megaleather coifs" + "" + " within Daemonheim."); + case 87: + return newstruct cs2func_script_1000_struct(86, 16861, "Members: Runic robe bottom (Tier 9)", "Members can now craft " + "" + "runic robe bottoms" + "" + " within Daemonheim."); + case 88: + return newstruct cs2func_script_1000_struct(87, 17335, "Members: Megaleather chaps (Tier 9)", "Members can now craft " + "" + "megaleather chaps" + "" + " within Daemonheim."); + case 89: + return newstruct cs2func_script_1000_struct(88, 17233, "Members: Runic robe top (Tier 9)", "Members can now craft " + "" + "runic robe tops" + "" + " within Daemonheim."); + case 90: + return newstruct cs2func_script_1000_struct(89, 17189, "Members: Megaleather body (Tier 9)", "Members can now craft " + "" + "megaleather bodies" + "" + " within Daemonheim."); + case 91: + return newstruct cs2func_script_1000_struct(90, 17169, "Members: Spiritbloom gloves (Tier 10)", "Members can now craft " + "" + "spiritbloom gloves" + "" + " within Daemonheim."); + case 92: + return newstruct cs2func_script_1000_struct(91, 17213, "Members: Tyrannoleather vambraces (Tier 10)", "Members can now craft " + "" + "tyrannoleather vambraces" + "" + " within Daemonheim."); + case 93: + return newstruct cs2func_script_1000_struct(92, 16929, "Members: Spiritbloom shoes (Tier 10)", "Members can now craft " + "" + "spiritbloom shoes" + "" + " within Daemonheim."); + case 94: + return newstruct cs2func_script_1000_struct(93, 17315, "Members: Tyrannoleather boots (Tier 10)", "Members can now craft " + "" + "tyrannoleather boots" + "" + " within Daemonheim."); + case 95: + return newstruct cs2func_script_1000_struct(94, 16753, "Members: Spiritbloom hood (Tier 10)", "Members can now craft " + "" + "spiritbloom hoods" + "" + " within Daemonheim."); + case 96: + return newstruct cs2func_script_1000_struct(95, 17059, "Members: Tyrannoleather coif (Tier 10)", "Members can now craft " + "" + "tyrannoleather coifs" + "" + " within Daemonheim."); + case 97: + return newstruct cs2func_script_1000_struct(96, 16863, "Members: Spiritbloom robe bottom (Tier 10)", "Members can now craft " + "" + "spiritbloom robe bottoms" + "" + " within Daemonheim."); + case 98: + return newstruct cs2func_script_1000_struct(97, 17337, "Members: Tyrannoleather chaps (Tier 10)", "Members can now craft " + "" + "tyrannoleather chaps" + "" + " within Daemonheim."); + case 99: + return newstruct cs2func_script_1000_struct(98, 17235, "Members: Spiritbloom robe top (Tier 10)", "Members can now craft " + "" + "spiritbloom robe tops" + "" + " within Daemonheim."); + case 100: + return newstruct cs2func_script_1000_struct(99, 17191, "Members: Tyrannoleather body (Tier 10)", "Members can now craft " + "" + "tyrannoleather bodies" + "" + " within Daemonheim."); + } + break; + case 12: + SWITCH (arg1) { + case 0: + GOTO flow_351 + case 1: + GOTO flow_352 + } + break; + flow_351: + return newstruct cs2func_script_1000_struct(40, 1757, "Crafting Guild", "You can now enter the " + "" + "Crafting Guild" + "" + "."); + flow_352: + return newstruct cs2func_script_1000_struct(99, 9780, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Crafting" + "" + ". Members can visit the " + "" + "Master Craftsman" + "" + " at the " + "" + "Crafting Guild" + "" + ". He has something special that is only available to true masters of the " + "" + "Crafting" + "" + " skill!"); + } + return newstruct cs2func_script_1000_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1001.cs2 b/dumps/scripts/1001.cs2 new file mode 100644 index 000000000..73f2c088f --- /dev/null +++ b/dumps/scripts/1001.cs2 @@ -0,0 +1,21 @@ +cs2func_script_1001_struct(1,1,0) script_1001(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1001_struct(1, "Potions"); + case 1: + return newstruct cs2func_script_1001_struct(1, "Herbs"); + case 2: + return newstruct cs2func_script_1001_struct(1, "Barbarian potions"); + case 3: + return newstruct cs2func_script_1001_struct(1, "Equipment"); + case 4: + return newstruct cs2func_script_1001_struct(1, "Other"); + case 5: + return newstruct cs2func_script_1001_struct(1, "Minigames"); + case 6: + return newstruct cs2func_script_1001_struct(1, "Dungeoneering"); + case 7: + return newstruct cs2func_script_1001_struct(1, "Milestones"); + } + return newstruct cs2func_script_1001_struct(-1, ""); +} diff --git a/dumps/scripts/1002.cs2 b/dumps/scripts/1002.cs2 new file mode 100644 index 000000000..f7775aea6 --- /dev/null +++ b/dumps/scripts/1002.cs2 @@ -0,0 +1,385 @@ +cs2func_script_1002_struct(2,2,0) script_1002(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1002_struct(-1, 7620, "You must complete Druidic Ritual before you can use Herblore.", ""); + case 1: + return newstruct cs2func_script_1002_struct(3, 121, "Attack potion" + "
" + "Guam & eye of newt", "You can now make " + "" + "attack potions" + "" + "."); + case 2: + return newstruct cs2func_script_1002_struct(5, 175, "Anti-poison" + "
" + "Marrentill & ground unicorn horn", "You can now make " + "" + "anti-poison" + "" + "."); + case 3: + return newstruct cs2func_script_1002_struct(8, 4844, "Relicym's balm" + "
" + "Rogue's Purse and snake weed (after starting Zogre Flesh Eaters)", "You now have the Herblore level required to make " + "" + "Relicym's balms" + "" + " (after starting Zogre Flesh Eaters)."); + case 4: + return newstruct cs2func_script_1002_struct(12, 115, "Strength potion" + "
" + "Tarromin & limpwurt root", "You can now make " + "" + "strength potions" + "" + "."); + case 5: + return newstruct cs2func_script_1002_struct(19, 10142, "Guam tar" + "
" + "Guam & swamp tar", "You can now make " + "" + "guam tar" + "" + "."); + case 6: + return newstruct cs2func_script_1002_struct(22, 127, "Stat restore potion" + "
" + "Harralander & red spiders' eggs", "You can now make " + "" + "stat restore potions" + "" + "."); + case 7: + return newstruct cs2func_script_1002_struct(22, 7662, "Guthix Balance potion" + "
" + "Harralander, red spiders' eggs, garlic and silver dust", "You can now make " + "" + "Guthix balance potions" + "" + "."); + case 8: + return newstruct cs2func_script_1002_struct(25, 1582, "Blamish oil" + "
" + "Harralander & blamish snail slime", "You can now make " + "" + "blamish oil" + "" + "."); + case 9: + return newstruct cs2func_script_1002_struct(26, 3010, "Energy potion" + "
" + "Harralander & chocolate dust", "You can now make " + "" + "energy potions" + "" + "."); + case 10: + return newstruct cs2func_script_1002_struct(30, 133, "Defence potion" + "
" + "Ranarr & white berries", "You can now make " + "" + "defence potions" + "" + "."); + case 11: + return newstruct cs2func_script_1002_struct(31, 10143, "Marrentill tar" + "
" + "Marrentill & swamp tar", "You can now make " + "" + "marrentill tar" + "" + "."); + case 12: + return newstruct cs2func_script_1002_struct(31, 12633, "Super fishing explosive" + "
" + "Guam & rubium (after Kennith's Concerns)", "You now have the Herblore level required to make " + "" + "super fishing explosives" + "" + " (after Kennith's Concerns)."); + case 13: + return newstruct cs2func_script_1002_struct(34, 3034, "Agility potion" + "
" + "Toadflax & toad legs", "You can now make " + "" + "agility potions" + "" + "."); + case 14: + return newstruct cs2func_script_1002_struct(36, 9741, "Combat potion" + "
" + "Harralander & ground desert goat horn", "You can now make " + "" + "combat potions" + "" + "."); + case 15: + return newstruct cs2func_script_1002_struct(38, 139, "Prayer restore potion" + "
" + "Ranarr & snape grass", "You can now make " + "" + "prayer restore potions" + "" + "."); + case 16: + return newstruct cs2func_script_1002_struct(39, 10144, "Tarromin tar" + "
" + "Tarromin & swamp tar", "You can now make " + "" + "tarromin tar" + "" + "."); + case 17: + return newstruct cs2func_script_1002_struct(40, 12142, "Summoning Potion" + "
" + "Spirit weed & cockatrice egg", "You can now make " + "" + "summoning potions" + "" + "."); + case 18: + return newstruct cs2func_script_1002_struct(42, 14840, "Crafting potion" + "
" + "Wergali & giant frogspawn", "You can now make " + "" + "crafting potions" + "" + "."); + case 19: + return newstruct cs2func_script_1002_struct(44, 10145, "Harralander tar" + "
" + "Harralander & swamp tar", "You can now make " + "" + "harralander tar" + "" + "."); + case 20: + return newstruct cs2func_script_1002_struct(45, 145, "Super Attack potion" + "
" + "Irit & eye of newt", "You can now make " + "" + "super attack potions" + "" + "."); + case 21: + return newstruct cs2func_script_1002_struct(46, 18662, "Vial of stench" + "
" + "Irit & chopped onion (after starting Buyers & Cellars: A Guild of our Own)", "You can now make " + "" + "a vial of stench" + "" + " with Robin's help (after starting Buyers & Cellars: A Guild of our Own)."); + case 22: + return newstruct cs2func_script_1002_struct(48, 181, "Super anti-poison" + "
" + "Irit & ground unicorn horn", "You can now make " + "" + "super anti-poison" + "" + "."); + case 23: + return newstruct cs2func_script_1002_struct(50, 151, "Fishing potion" + "
" + "Avantoe & snape grass", "You can now make " + "" + "fishing potions" + "" + "."); + case 24: + return newstruct cs2func_script_1002_struct(52, 3018, "Super energy potion" + "
" + "Avantoe & Mort Myre fungi", "You can now make " + "" + "super energy potions" + "" + "."); + case 25: + return newstruct cs2func_script_1002_struct(53, 10000, "Hunter potion - Avantoe & ground sabre-toothed kebbit teeth", "You can now make " + "" + "hunter potions" + "" + "."); + case 26: + return newstruct cs2func_script_1002_struct(54, 20024, "Juju hunter potion" + "
" + "Erzille & corrupt vine", "You can now make " + "" + "juju hunter potions" + "" + "."); + case 27: + return newstruct cs2func_script_1002_struct(55, 157, "Super Strength potion" + "
" + "Kwuarm & limpwurt root", "You can now make " + "" + "super strength potions" + "" + "."); + case 28: + return newstruct cs2func_script_1002_struct(57, 9022, "Magic essence potion" + "
" + "Starflower & ground gorak claw", "You can now make " + "" + "magic essence potions" + "" + "."); + case 29: + return newstruct cs2func_script_1002_struct(58, 14848, "Fletching potion" + "
" + "Wergali & wimpy bird feather", "You can now make " + "" + "fletching potions" + "" + "."); + case 30: + return newstruct cs2func_script_1002_struct(59, 20028, "Scentless potion" + "
" + "Argway & shadow vine", "You can now make " + "" + "scentless potions" + "" + "."); + case 31: + return newstruct cs2func_script_1002_struct(60, 187, "Weapon poison" + "
" + "Kwuarm & ground blue dragon scale", "You can now make " + "" + "weapon poisons" + "" + "."); + case 32: + return newstruct cs2func_script_1002_struct(63, 3026, "Super restore potion" + "
" + "Snapdragon & red spiders' eggs", "You can now make " + "" + "super restore potions" + "" + "."); + case 33: + return newstruct cs2func_script_1002_struct(64, 20012, "Juju farming potion" + "
" + "Ugune & marble vine", "You can now make " + "" + "juju farming potions" + "" + "."); + case 34: + return newstruct cs2func_script_1002_struct(65, 10927, "Sanfew Serum" + "
" + "Super restore potion, snake weed, ground unicorn horn and nail beast nails.", "You can now make " + "" + "Sanfew serums" + "" + "."); + case 35: + return newstruct cs2func_script_1002_struct(66, 163, "Super Defence potion" + "
" + "Cadantine & white berries", "You can now make " + "" + "super defence potions" + "" + "."); + case 36: + return newstruct cs2func_script_1002_struct(67, 20008, "Juju cooking potion" + "
" + "Shengo & plant teeth", "You can now make " + "" + "juju cooking potions" + "" + "."); + case 37: + return newstruct cs2func_script_1002_struct(68, 5945, "Anti-poison+" + "
" + "Coconut milk, toadflax & yew roots", "You can now make " + "" + "anti-poison+ potions" + "" + "."); + case 38: + return newstruct cs2func_script_1002_struct(69, 2454, "Anti fire-breath potion" + "
" + "Lantadyme & ground blue dragon scale", "You can now make " + "" + "anti fire-breath potions" + "" + "."); + case 39: + return newstruct cs2func_script_1002_struct(70, 20020, "Juju fishing potion" + "
" + "Shengo & aquatic vine", "You can now make " + "" + "juju fishing potions" + "" + "."); + case 40: + return newstruct cs2func_script_1002_struct(71, 20016, "Juju woodcutting potion" + "
" + "Samaden & oily vine", "You can now make " + "" + "juju woodcutting potions" + "" + "."); + case 41: + return newstruct cs2func_script_1002_struct(72, 169, "Ranging potion" + "
" + "Dwarf weed & wine of Zamorak", "You can now make " + "" + "ranging potions" + "" + "."); + case 42: + return newstruct cs2func_script_1002_struct(73, 5937, "Weapon poison+" + "
" + "Coconut milk, cactus spine & red spiders' eggs", "You can now make " + "" + "weapon poison+ potions" + "" + "."); + case 43: + return newstruct cs2func_script_1002_struct(74, 20004, "Juju mining potion" + "
" + "Samaden & draconic vine", "You can now make " + "" + "juju mining potions" + "" + "."); + case 44: + return newstruct cs2func_script_1002_struct(75, 20032, "Saradomin's blessing" + "
" + "Samaden & Saradomin vine", "You can now make " + "" + "Saradomin's blessings" + "" + "."); + case 45: + return newstruct cs2func_script_1002_struct(75, 20036, "Guthix's gift" + "
" + "Samaden & Guthix vine", "You can now make " + "" + "Guthix's gifts" + "" + "."); + case 46: + return newstruct cs2func_script_1002_struct(75, 20040, "Zamorak's favour" + "
" + "Samaden & Zamorak vine", "You can now make " + "" + "Zamorak's favours" + "" + "."); + case 47: + return newstruct cs2func_script_1002_struct(76, 3042, "Magic potion" + "
" + "Lantadyme & potato cactus", "You can now make " + "" + "magic potions" + "" + "."); + case 48: + return newstruct cs2func_script_1002_struct(78, 189, "Zamorak brew" + "
" + "Torstol & jangerberries", "You can now make " + "" + "Zamorak brews" + "" + "."); + case 49: + return newstruct cs2func_script_1002_struct(79, 5954, "Anti-poison++" + "
" + "Coconut milk, irit & magic tree roots", "You can now make " + "" + "anti-poison++ potions" + "" + "."); + case 50: + return newstruct cs2func_script_1002_struct(81, 6687, "Saradomin Brew" + "
" + "Toadflax & crushed bird nest", "You can now make " + "" + "Saradomin brews" + "" + "."); + case 51: + return newstruct cs2func_script_1002_struct(82, 5940, "Weapon poison++" + "
" + "Coconut milk, nightshade & poison ivy berries", "You can now make " + "" + "weapon poison++ potions" + "" + "."); + case 52: + return newstruct cs2func_script_1002_struct(84, 15301, "Recover special" + "
" + "Super energy potion & papaya", "You can now make " + "" + "recover special potions" + "" + "."); + case 53: + return newstruct cs2func_script_1002_struct(85, 15305, "Super antifire" + "
" + "Antifire potion & desert phoenix feather", "You can now make " + "" + "super antifire potions" + "" + "."); + case 54: + return newstruct cs2func_script_1002_struct(88, 15309, "Extreme attack" + "
" + "Super attack potion & avantoe", "You can now make " + "" + "extreme attack potions" + "" + "."); + case 55: + return newstruct cs2func_script_1002_struct(89, 15313, "Extreme strength" + "
" + "Super strength potion & dwarf weed", "You can now make " + "" + "extreme strength potions" + "" + "."); + case 56: + return newstruct cs2func_script_1002_struct(90, 15317, "Extreme defence" + "
" + "Super defence potion & lantadyme", "You can now make " + "" + "extreme defence potions" + "" + "."); + case 57: + return newstruct cs2func_script_1002_struct(91, 15321, "Extreme magic" + "
" + "Magic potion & ground mud runes", "You can now make " + "" + "extreme magic potions" + "" + "."); + case 58: + return newstruct cs2func_script_1002_struct(92, 15325, "Extreme ranging" + "
" + "Ranging potion & 5 grenwall spikes", "You can now make " + "" + "extreme ranging potions" + "" + "."); + case 59: + return newstruct cs2func_script_1002_struct(94, 15329, "Super prayer restore" + "
" + "Prayer restore potion & wyvern bonemeal", "You can now make " + "" + "super prayer potions" + "" + "."); + case 60: + return newstruct cs2func_script_1002_struct(94, 21632, "Prayer renewal" + "
" + "Fellstalk & morchella mushroom", "You can now make " + "" + "prayer renewal potions" + "" + "."); + case 61: + return newstruct cs2func_script_1002_struct(96, 15333, "Overload" + "
" + "Extreme attack, extreme strength, extreme defence, extreme magic, extreme ranging potions & torstol", "You can now make " + "" + "overload potions" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1002_struct(-1, 7620, "You must complete Druidic Ritual before you can use Herblore", ""); + case 1: + return newstruct cs2func_script_1002_struct(3, 249, "Guam leaf", "You can now clean " + "" + "guam" + "" + "."); + case 2: + return newstruct cs2func_script_1002_struct(3, 1534, "Rogue's purse", "You can now clean " + "" + "rogue's purse" + "" + "."); + case 3: + return newstruct cs2func_script_1002_struct(3, 1526, "Snake weed", "You can now clean " + "" + "snake weed" + "" + "."); + case 4: + return newstruct cs2func_script_1002_struct(5, 251, "Marrentill", "You can now clean " + "" + "marrentill" + "" + "."); + case 5: + return newstruct cs2func_script_1002_struct(11, 253, "Tarromin", "You can now clean " + "" + "tarromin" + "" + "."); + case 6: + return newstruct cs2func_script_1002_struct(20, 255, "Harralander", "You can now clean " + "" + "harralander" + "" + "."); + case 7: + return newstruct cs2func_script_1002_struct(25, 257, "Ranarr", "You can now clean " + "" + "ranarr" + "" + "."); + case 8: + return newstruct cs2func_script_1002_struct(30, 2998, "Toadflax", "You can now clean " + "" + "toadflax" + "" + "."); + case 9: + return newstruct cs2func_script_1002_struct(35, 12172, "Spirit weed", "You can now clean " + "" + "spirit weed" + "" + "."); + case 10: + return newstruct cs2func_script_1002_struct(40, 259, "Irit leaf", "You can now clean " + "" + "irit leaf" + "" + "."); + case 11: + return newstruct cs2func_script_1002_struct(41, 14854, "Wergali", "You can now clean " + "" + "wergali" + "" + "."); + case 12: + return newstruct cs2func_script_1002_struct(48, 261, "Avantoe", "You can now clean " + "" + "avantoe" + "" + "."); + case 13: + return newstruct cs2func_script_1002_struct(54, 263, "Kwuarm", "You can now clean " + "" + "kwuarm" + "" + "."); + case 14: + return newstruct cs2func_script_1002_struct(54, 19989, "Erzille", "You can now clean " + "" + "erzille" + "" + "."); + case 15: + return newstruct cs2func_script_1002_struct(56, 19991, "Ugune", "You can now clean " + "" + "ugune" + "" + "."); + case 16: + return newstruct cs2func_script_1002_struct(57, 19990, "Argway", "You can now clean " + "" + "argway" + "" + "."); + case 17: + return newstruct cs2func_script_1002_struct(58, 19992, "Shengo", "You can now clean " + "" + "shengo" + "" + "."); + case 18: + return newstruct cs2func_script_1002_struct(59, 3000, "Snapdragon", "You can now clean " + "" + "snapdragon" + "" + "."); + case 19: + return newstruct cs2func_script_1002_struct(59, 19993, "Samaden", "You can now clean " + "" + "samaden" + "" + "."); + case 20: + return newstruct cs2func_script_1002_struct(65, 265, "Cadantine", "You can now clean " + "" + "cadantine" + "" + "."); + case 21: + return newstruct cs2func_script_1002_struct(67, 2481, "Lantadyme", "You can now clean " + "" + "lantadyme" + "" + "."); + case 22: + return newstruct cs2func_script_1002_struct(70, 267, "Dwarf weed", "You can now clean " + "" + "dwarf weed" + "" + "."); + case 23: + return newstruct cs2func_script_1002_struct(75, 269, "Torstol", "You can now clean " + "" + "torstol" + "" + "."); + case 24: + return newstruct cs2func_script_1002_struct(91, 21624, "Fellstalk", "You can now clean " + "" + "fellstalk" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1002_struct(-1, 7620, "You must complete barbarian Herblore training before you can make these potions.", " "); + case 1: + return newstruct cs2func_script_1002_struct(4, 11429, "Attack mix", "You can now make " + "" + "attack mixes" + "" + "."); + case 2: + return newstruct cs2func_script_1002_struct(6, 11433, "Anti-poison mix", "You can now make " + "" + "anti-poison mixes" + "" + "."); + case 3: + return newstruct cs2func_script_1002_struct(9, 11437, "Relicym's Balm mix", "You can now make " + "" + "Relicym's balm mixes" + "" + "."); + case 4: + return newstruct cs2func_script_1002_struct(14, 11443, "Strength mix", "You can now make " + "" + "strength mixes" + "" + "."); + case 5: + return newstruct cs2func_script_1002_struct(24, 11449, "Stat restore mix", "You can now make " + "" + "stat restore mixes" + "" + "."); + case 6: + return newstruct cs2func_script_1002_struct(29, 11453, "Energy mix", "You can now make " + "" + "energy mixes" + "" + "."); + case 7: + return newstruct cs2func_script_1002_struct(33, 11457, "Defence mix", "You can now make " + "" + "defence mixes" + "" + "."); + case 8: + return newstruct cs2func_script_1002_struct(37, 11461, "Agility mix", "You can now make " + "" + "agility mixes" + "" + "."); + case 9: + return newstruct cs2func_script_1002_struct(40, 11445, "Combat mix", "You can now make " + "" + "combat mixes" + "" + "."); + case 10: + return newstruct cs2func_script_1002_struct(42, 11465, "Prayer restore mix", "You can now make " + "" + "prayer restore mixes" + "" + "."); + case 11: + return newstruct cs2func_script_1002_struct(47, 11469, "Super Attack mix", "You can now make " + "" + "super attack mixes" + "" + "."); + case 12: + return newstruct cs2func_script_1002_struct(51, 11473, "Super anti-poison mix", "You can now make " + "" + "super anti-poison mixes" + "" + "."); + case 13: + return newstruct cs2func_script_1002_struct(53, 11477, "Fishing mix", "You can now make " + "" + "fishing mixes" + "" + "."); + case 14: + return newstruct cs2func_script_1002_struct(56, 11481, "Super energy mix", "You can now make " + "" + "super energy mixes" + "" + "."); + case 15: + return newstruct cs2func_script_1002_struct(58, 11517, "Hunter mix", "You can now make " + "" + "hunter mixes" + "" + "."); + case 16: + return newstruct cs2func_script_1002_struct(59, 11485, "Super Strength mix", "You can now make " + "" + "super strength mixes" + "" + "."); + case 17: + return newstruct cs2func_script_1002_struct(61, 11489, "Magic essence mix", "You can now make " + "" + "magic essence mixes" + "" + "."); + case 18: + return newstruct cs2func_script_1002_struct(67, 11493, "Super restore mix", "You can now make " + "" + "super restore mix" + "" + "."); + case 19: + return newstruct cs2func_script_1002_struct(71, 11497, "Super Defence mix", "You can now make " + "" + "super defence mix" + "" + "."); + case 20: + return newstruct cs2func_script_1002_struct(74, 11501, "Anti-poison+ mix", "You can now make " + "" + "anti-poison+ mix" + "" + "."); + case 21: + return newstruct cs2func_script_1002_struct(75, 11505, "Anti fire-breath mix", "You can now make " + "" + "anti fire-breath mix" + "" + "."); + case 22: + return newstruct cs2func_script_1002_struct(80, 11509, "Ranging mix", "You can now make " + "" + "ranging mix" + "" + "."); + case 23: + return newstruct cs2func_script_1002_struct(83, 11513, "Magic mix", "You can now make " + "" + "magic mix" + "" + "."); + case 24: + return newstruct cs2func_script_1002_struct(85, 11521, "Zamorak mix", "You can now make " + "" + "Zamorak mix" + "" + "."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1002_struct(21, 19675, "Members: Herbicide" + "
" + " (with 21 Dungeoneering)", "Members can now use " + "" + "herbicide" + "" + ". (They also need level 21 Dungeoneering.)"); + case 1: + return newstruct cs2func_script_1002_struct(50, 12856, "Irit gloves", "You can now wear " + "" + "irit gloves."); + case 2: + return newstruct cs2func_script_1002_struct(60, 12857, "Avantoe gloves", "You can now wear " + "" + "avantoe gloves."); + case 3: + return newstruct cs2func_script_1002_struct(70, 12858, "Kwuarm gloves", "You can now wear " + "" + "kwuarm gloves."); + case 4: + return newstruct cs2func_script_1002_struct(70, 18340, "Members: Anti-poison totem" + "
" + " (with 60 Defence and 60 Dungeoneering)", "Members can now wield " + "" + "anti-poison totems" + "" + ". (They also need level 60 Defence and level 60 Dungeoneering.)"); + case 5: + return newstruct cs2func_script_1002_struct(80, 12859, "Cadantine gloves", "You can now wear " + "" + "cadantine gloves."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1002_struct(49, 19890, "Scroll of Cleansing" + "
" + " (with 49 Dungeoneering)", "You can now use the " + "" + "Scroll of cleansing" + "" + ". (You also need level 49 Dungeoneering.)"); + case 1: + return newstruct cs2func_script_1002_struct(91, 18778, "Starved ancient effigies", "You can now investigate " + "" + "starved ancient effigies" + "" + " using your knowledge of Herblore."); + case 2: + return newstruct cs2func_script_1002_struct(93, 18779, "Nourished ancient effigies", "You can now investigate " + "" + "nourished ancient effigies" + "" + " using your knowledge of Herblore."); + case 3: + return newstruct cs2func_script_1002_struct(95, 18780, "Sated ancient effigies", "You can now investigate " + "" + "sated ancient effigies" + "" + " using your knowledge of Herblore."); + case 4: + return newstruct cs2func_script_1002_struct(97, 18781, "Gorged ancient effigies", "You can now investigate " + "" + "gorged ancient effigies" + "" + " using your knowledge of Herblore."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1002_struct(1, 14215, "Stealing Creation - class 1 sacred clay", "Members can now make " + "" + "1-dose potions out of class 1 sacred clay" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_1002_struct(20, 14213, "Stealing Creation - class 2 sacred clay", "Members can now make " + "" + "2-dose potions out of class 2 sacred clay" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_1002_struct(40, 14211, "Stealing Creation - class 3 sacred clay", "Members can now make " + "" + "3-dose potions out of class 3 sacred clay" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_1002_struct(60, 14209, "Stealing Creation - class 4 sacred clay", "Members can now make " + "" + "4-dose potions out of class 4 sacred clay" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_1002_struct(80, 14207, "Stealing Creation - class 5 sacred clay", "Members can now make " + "" + "5-dose potions out of class 5 sacred clay" + "" + " in Stealing Creation."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_1002_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Herblore level increases, you will be able to attempt higher-level herblore tasks within Daemonheim. You will also be more likely to succeed when attempting herblore tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1002_struct(3, 17556, "Weak magic potion" + "
" + " Sagewort & void dust", "You can now make " + "" + "weak magic potions" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1002_struct(3, 17512, "Sagewort", "You can now clean " + "" + "sagewort" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_1002_struct(4, 17514, "Valerian", "You can now clean " + "" + "valerian" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1002_struct(5, 17558, "Weak ranged potion" + "
" + " Valerian & void dust", "You can now make " + "" + "weak ranged potions" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_1002_struct(7, 17560, "Weak melee potion" + "
" + " Valerian & misshapen claw", "You can now make " + "" + "weak melee potions" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_1002_struct(8, 17516, "Aloe", "You can now clean " + "" + "aloe" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_1002_struct(9, 17562, "Weak defence potion" + "
" + " Aloe & void dust", "You can now make " + "" + "weak defence potions" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_1002_struct(12, 17564, "Weak stat restore potion" + "
" + " Aloe & red moss", "You can now make " + "" + "weak stat restore potions" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_1002_struct(15, 17568, "Weak cure potion" + "
" + " Aloe & firebreath whiskey", "You can now make " + "" + "weak cure potions" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1002_struct(18, 17570, "Weak rejuvenation potion" + "
" + " Aloe & misshapen claw", "You can now make " + "" + "weak rejuvenation potions" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_1002_struct(21, 17572, "Weak poison" + "
" + " Sagewort & firebreath whiskey", "You can now make " + "" + "weak poisons" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_1002_struct(24, 17574, "Weak gatherer's potion" + "
" + " Sagewort & red moss", "You can now make " + "" + "weak gatherer's potions" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_1002_struct(27, 17576, "Weak artisan's potion" + "
" + " Valerian & red moss", "You can now make " + "" + "weak artisan's potions" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_1002_struct(30, 17578, "Weak naturalist's potion" + "
" + " Sagewort & misshapen claw", "You can now make " + "" + "weak naturalist's potions" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_1002_struct(33, 17580, "Weak survivalist's potion" + "
" + " Valerian and firebreath whiskey", "You can now make " + "" + "weak survivalist's potions" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_1002_struct(34, 17518, "Wormwood leaf", "You can now clean " + "" + "wormwood leaf" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_1002_struct(36, 17582, "Magic potion" + "
" + " Wormwood leaf & void dust", "You can now make " + "" + "magic potions" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_1002_struct(37, 17520, "Magebane", "You can now clean " + "" + "magebane" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_1002_struct(38, 17584, "Ranged potion" + "
" + " Magebane & void dust", "You can now make " + "" + "ranged potions" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_1002_struct(40, 17586, "Melee potion" + "
" + " Magebane & misshapen claw", "You can now make " + "" + "melee potions" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_1002_struct(41, 17522, "Featherfoil", "You can now clean " + "" + "featherfoil" + "" + " within Daemonheim."); + case 22: + return newstruct cs2func_script_1002_struct(42, 17588, "Defence potion" + "
" + " Featherfoil & void dust", "You can now make " + "" + "defence potions" + "" + " within Daemonheim."); + case 23: + return newstruct cs2func_script_1002_struct(45, 17590, "Stat restore potion" + "
" + " Featherfoil & red moss", "You can now make " + "" + "stat restore potions" + "" + " within Daemonheim."); + case 24: + return newstruct cs2func_script_1002_struct(48, 17592, "Cure potion" + "
" + " Featherfoil & firebreath whiskey", "You can now make " + "" + "cure potions" + "" + " within Daemonheim."); + case 25: + return newstruct cs2func_script_1002_struct(51, 17594, "Rejuvenation potion" + "
" + " Featherfoil & misshapen claw", "You can now make " + "" + "rejuvenation potions" + "" + " within Daemonheim."); + case 26: + return newstruct cs2func_script_1002_struct(54, 17596, "Poison" + "
" + " Wormwood leaf & firebreath whiskey", "You can now make " + "" + "poisons" + "" + " within Daemonheim."); + case 27: + return newstruct cs2func_script_1002_struct(57, 17598, "Gatherer's potion" + "
" + " Wormwood leaf & red moss", "You can now make " + "" + "gatherer's potions" + "" + " within Daemonheim."); + case 28: + return newstruct cs2func_script_1002_struct(60, 17600, "Artisan's potion" + "
" + " Magebane & red moss", "You can now make " + "" + "artisan's potions" + "" + " within Daemonheim."); + case 29: + return newstruct cs2func_script_1002_struct(63, 17602, "Naturalist's potion" + "
" + " Wormwood leaf & misshapen claw", "You can now make " + "" + "naturalist's potions" + "" + " within Daemonheim."); + case 30: + return newstruct cs2func_script_1002_struct(66, 17604, "Survivalist's potion" + "
" + " Magebane & firebreath whiskey", "You can now make " + "" + "survivalist's potions" + "" + " within Daemonheim."); + case 31: + return newstruct cs2func_script_1002_struct(67, 17524, "Winter's Grip", "You can now clean " + "" + "winter's grip" + "" + " within Daemonheim."); + case 32: + return newstruct cs2func_script_1002_struct(69, 17606, "Strong magic potion" + "
" + " Winter's grip & void dust", "You can now make " + "" + "strong magic potions" + "" + " within Daemonheim."); + case 33: + return newstruct cs2func_script_1002_struct(70, 17526, "Lycopus", "You can now clean " + "" + "lycopus" + "" + " within Daemonheim."); + case 34: + return newstruct cs2func_script_1002_struct(71, 17608, "Strong ranged potion" + "
" + " Lycopus & void dust", "You can now make " + "" + "strong ranged potions" + "" + " within Daemonheim."); + case 35: + return newstruct cs2func_script_1002_struct(73, 17610, "Strong melee potion" + "
" + " Lycopus & misshapen claw", "You can now make " + "" + "strong melee potions" + "" + " within Daemonheim."); + case 36: + return newstruct cs2func_script_1002_struct(74, 17528, "Buckthorn", "You can now clean " + "" + "buckthorn" + "" + " within Daemonheim."); + case 37: + return newstruct cs2func_script_1002_struct(75, 17612, "Strong defence potion" + "
" + " Buckthorn & void dust", "You can now make " + "" + "strong defence potions" + "" + " within Daemonheim."); + case 38: + return newstruct cs2func_script_1002_struct(78, 17614, "Strong stat restore potion" + "
" + " Buckthorn & red moss", "You can now make " + "" + "strong stat restore potions" + "" + " within Daemonheim."); + case 39: + return newstruct cs2func_script_1002_struct(81, 17616, "Strong cure potion" + "
" + " Buckthorn & firebreath whiskey", "You can now make " + "" + "strong cure potions" + "" + " within Daemonheim."); + case 40: + return newstruct cs2func_script_1002_struct(84, 17618, "Strong rejuvenation potion" + "
" + " Buckthorn & misshapen claw", "You can now make " + "" + "strong rejuvenation potions" + "" + " within Daemonheim."); + case 41: + return newstruct cs2func_script_1002_struct(87, 17620, "Strong poison" + "
" + " Winter's grip & firebreath whiskey", "You can now make " + "" + "strong poisons" + "" + " within Daemonheim."); + case 42: + return newstruct cs2func_script_1002_struct(90, 17622, "Strong gatherer's potion" + "
" + " Winter's grip & red moss", "You can now make " + "" + "strong gatherer's potions" + "" + " within Daemonheim."); + case 43: + return newstruct cs2func_script_1002_struct(93, 17624, "Strong artisan's potion" + "
" + " Lycopus & red moss", "You can now make " + "" + "strong artisan's potions" + "" + " within Daemonheim."); + case 44: + return newstruct cs2func_script_1002_struct(96, 17626, "Strong naturalist's potion" + "
" + " Winter's grip & misshapen claw", "You can now make " + "" + "strong naturalist's potions" + "" + " within Daemonheim."); + case 45: + return newstruct cs2func_script_1002_struct(99, 17628, "Strong survivalist's potion" + "
" + " Lycopus & firebreath whiskey", "You can now make " + "" + "strong survivalist's potions" + "" + " within Daemonheim."); + } + break; + case 7: + if (((boolean)arg1)) { + return newstruct cs2func_script_1002_struct(99, 9774, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Herblore" + "" + ". Why not visit " + "" + "Kaqemeex" + "" + ", near " + "" + "Taverley" + "" + "? He has something special that is only available to true masters of the " + "" + "Herblore" + "" + " skill!"); + } + } + return newstruct cs2func_script_1002_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1003.cs2 b/dumps/scripts/1003.cs2 new file mode 100644 index 000000000..76f821ec7 --- /dev/null +++ b/dumps/scripts/1003.cs2 @@ -0,0 +1,13 @@ +cs2func_script_1003_struct(1,1,0) script_1003(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1003_struct(0, "Prayers"); + case 1: + return newstruct cs2func_script_1003_struct(1, "Equipment"); + case 2: + return newstruct cs2func_script_1003_struct(0, "Dungeoneering"); + case 3: + return newstruct cs2func_script_1003_struct(0, "Milestones"); + } + return newstruct cs2func_script_1003_struct(-1, ""); +} diff --git a/dumps/scripts/1004.cs2 b/dumps/scripts/1004.cs2 new file mode 100644 index 000000000..aca55c544 --- /dev/null +++ b/dumps/scripts/1004.cs2 @@ -0,0 +1,214 @@ +cs2func_script_1004_struct(2,2,0) script_1004(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1004_struct(10, 5574, "Members: Initiate sallet" + "
" + " (after Recruitment Drive and with 20 Defence)", "Members now have the Prayer level required to wear " + "" + "initiate sallets" + "" + " (after Recruitment Drive, with level 20 Defence)."); + case 1: + return newstruct cs2func_script_1004_struct(10, 5575, "Members: Initiate hauberk" + "
" + " (after Recruitment Drive and with 20 Defence)", "Members now have the Prayer level required to wear " + "" + "initiate hauberks" + "" + " (after Recruitment Drive, with level 20 Defence)."); + case 2: + return newstruct cs2func_script_1004_struct(10, 5576, "Members: Initiate cuisse" + "
" + " (after Recruitment Drive and with 20 Defence)", "Members now have the Prayer level required to wear " + "" + "initiate cuisses" + "" + " (after Recruitment Drive, with level 20 Defence)."); + case 3: + return newstruct cs2func_script_1004_struct(20, 9672, "Members: Proselyte sallet" + "
" + " (after Slug Menace and with 30 Defence)", "Members now have the Prayer level required to wear " + "" + "proselyte sallets" + "" + " (after Slug Menace, with level 30 Defence)."); + case 4: + return newstruct cs2func_script_1004_struct(20, 9674, "Members: Proselyte hauberk" + "
" + " (after Slug Menace and with 30 Defence)", "Members now have the Prayer level required to wear " + "" + "proselyte hauberks" + "" + " (after Slug Menace, with level 30 Defence)."); + case 5: + return newstruct cs2func_script_1004_struct(20, 9676, "Members: Proselyte cuisse" + "
" + " (after Slug Menace and with 30 Defence)", "Members now have the Prayer level required to wear " + "" + "proselyte cuisses" + "" + " (after Slug Menace, with level 30 Defence)."); + case 6: + return newstruct cs2func_script_1004_struct(20, 9678, "Members: Proselyte plateskirt" + "
" + " (after Slug Menace and with 30 Defence)", "Members now have the Prayer level required to wear " + "" + "proselyte plateskirts" + "" + " (after Slug Menace, with level 30 Defence)."); + case 7: + return newstruct cs2func_script_1004_struct(20, 10462, "Members: Guthix robe top", "Members can now wear " + "" + "Guthix robe tops" + "" + "."); + case 8: + return newstruct cs2func_script_1004_struct(20, 10466, "Members: Guthix robe legs", "Members can now wear " + "" + "Guthix robe legs" + "" + "."); + case 9: + return newstruct cs2func_script_1004_struct(20, 10458, "Members: Saradomin robe top", "Members can now wear " + "" + "Saradomin robe tops" + "" + "."); + case 10: + return newstruct cs2func_script_1004_struct(20, 10464, "Members: Saradomin robe legs", "Members can now wear " + "" + "Saradomin robe legs" + "" + "."); + case 11: + return newstruct cs2func_script_1004_struct(20, 10460, "Members: Zamorak robe top", "Members can now wear " + "" + "Zamorak robe tops" + "" + "."); + case 12: + return newstruct cs2func_script_1004_struct(20, 10468, "Members: Zamorak robe legs", "Members can now wear " + "" + "Zamorak robe legs" + "" + "."); + case 13: + return newstruct cs2func_script_1004_struct(20, 19380, "Members: Armadyl robe top", "Members can now wear " + "" + "Armadyl robe tops" + "" + "."); + case 14: + return newstruct cs2func_script_1004_struct(20, 19386, "Members: Armadyl robe legs", "Members can now wear " + "" + "Armadyl robe legs" + "" + "."); + case 15: + return newstruct cs2func_script_1004_struct(20, 19384, "Members: Bandos robe top", "Members can now wear " + "" + "Bandos robe tops" + "" + "."); + case 16: + return newstruct cs2func_script_1004_struct(20, 19388, "Members: Bandos robe legs", "Members can now wear " + "" + "Bandos robe legs" + "" + "."); + case 17: + return newstruct cs2func_script_1004_struct(20, 19382, "Members: Ancient robe top", "Members can now wear " + "" + "Ancient robe tops" + "" + "."); + case 18: + return newstruct cs2func_script_1004_struct(20, 19390, "Members: Ancient robe legs", "Members can now wear " + "" + "Ancient robe legs" + "" + "."); + case 19: + return newstruct cs2func_script_1004_struct(21, 18337, "Members: Bonecrusher" + "
" + " (with 21 Dungeoneering)", "Members can now use " + "" + "bonecrushers" + "" + ". (They also need level 21 Dungeoneering.)"); + case 20: + return newstruct cs2func_script_1004_struct(22, 11665, "Members: Void melee helm", "Members now have the Prayer level required to wear " + "" + "Void melee helms" + "" + "."); + case 21: + return newstruct cs2func_script_1004_struct(22, 11664, "Members: Void ranger helm", "Members now have the Prayer level required to wear " + "" + "Void ranger helms" + "" + "."); + case 22: + return newstruct cs2func_script_1004_struct(22, 11663, "Members: Void mage helm", "Members now have the Prayer level required to wear " + "" + "Void mage helms" + "" + "."); + case 23: + return newstruct cs2func_script_1004_struct(22, 8839, "Members: Void knight top", "Members now have the Prayer level required to wear " + "" + "Void knight tops" + "" + "."); + case 24: + return newstruct cs2func_script_1004_struct(22, 8840, "Members: Void knight robe", "Members now have the Prayer level required to wear " + "" + "Void knight robes" + "" + "."); + case 25: + return newstruct cs2func_script_1004_struct(22, 8842, "Members: Void knight gloves", "Members now have the Prayer level required to wear " + "" + "Void knight gloves" + "" + "."); + case 26: + return newstruct cs2func_script_1004_struct(22, 19712, "Members: Void knight deflector", "Members now have the Prayer level required to wear " + "" + "Void knight deflectors" + "" + "."); + case 27: + return newstruct cs2func_script_1004_struct(22, 8841, "Members: Void knight mace", "Members now have the Prayer level required to wield " + "" + "Void knight maces" + "" + "."); + case 28: + return newstruct cs2func_script_1004_struct(22, 7620, "Void knight equipment requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer.", "" + "Void knight equipment" + "" + " requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer."); + case 29: + return newstruct cs2func_script_1004_struct(25, 11061, "Members: Ancient Mace" + "
" + " (after Another Slice of H.A.M., with 15 Attack)", "Members now have the Prayer level required to wield the " + "" + "Ancient Mace" + "" + " (after Another Slice of H.A.M. with level 15 Attack)."); + case 30: + return newstruct cs2func_script_1004_struct(30, 19886, "Twisted bird skull necklace" + "
" + " (with 30 Dungeoneering)", "You now have the Prayer level required to wear " + "" + "Twisted bird skull necklaces" + "" + ". (You also need level 30 Dungeoneering.)"); + case 31: + return newstruct cs2func_script_1004_struct(40, 10448, "Members: Guthix cloak", "Members can now wear " + "" + "Guthix cloaks" + "" + "."); + case 32: + return newstruct cs2func_script_1004_struct(40, 10454, "Members: Guthix mitre" + "
" + " (with 40 Magic)", "Members now have the Prayer level required to wear " + "" + "Guthix mitres" + "" + ". (They also need level 40 Magic.)"); + case 33: + return newstruct cs2func_script_1004_struct(40, 10446, "Members: Saradomin cloak", "Members can now wear " + "" + "Saradomin cloaks" + "" + "."); + case 34: + return newstruct cs2func_script_1004_struct(40, 10452, "Members: Saradomin mitre" + "
" + " (with 40 Magic)", "Members now have the Prayer level required to wear " + "" + "Saradomin mitres" + "" + ". (They also need level 40 Magic.)"); + case 35: + return newstruct cs2func_script_1004_struct(40, 10450, "Members: Zamorak cloak", "Members can now wear " + "" + "Zamorak cloaks" + "" + "."); + case 36: + return newstruct cs2func_script_1004_struct(40, 10456, "Members: Zamorak mitre" + "
" + " (with 40 Magic)", "Members now have the Prayer level required to wear " + "" + "Zamorak mitres" + "" + ". (They also need level 40 Magic.)"); + case 37: + return newstruct cs2func_script_1004_struct(40, 19368, "Members: Armadyl cloak", "Members can now wear " + "" + "Armadyl cloaks" + "" + "."); + case 38: + return newstruct cs2func_script_1004_struct(40, 19374, "Members: Armadyl mitre" + "
" + " (with 40 Magic)", "Members now have the Prayer level required to wear " + "" + "Armadyl mitres" + "" + ". (They also need level 40 Magic.)"); + case 39: + return newstruct cs2func_script_1004_struct(40, 19370, "Members: Bandos cloak", "Members can now wear " + "" + "Bandos cloaks" + "" + "."); + case 40: + return newstruct cs2func_script_1004_struct(40, 19376, "Members: Bandos mitre" + "
" + " (with 40 Magic)", "Members now have the Prayer level required to wear " + "" + "Bandos mitres" + "" + ". (They also need level 40 Magic.)"); + case 41: + return newstruct cs2func_script_1004_struct(40, 19372, "Members: Ancient cloak", "Members can now wear " + "" + "Ancient cloaks" + "" + "."); + case 42: + return newstruct cs2func_script_1004_struct(40, 19378, "Members: Ancient mitre" + "
" + " (with 40 Magic)", "Members now have the Prayer level required to wear " + "" + "Ancient mitres" + "" + ". (They also need level 40 Magic.)"); + case 43: + return newstruct cs2func_script_1004_struct(48, 19892, "Amulet of zealots" + "
" + " (with 48 Dungeoneering)", "You now have the Prayer level required to wear " + "" + "Amulets of zealots" + "" + ". (You also need level 48 Dungeoneering.)"); + case 44: + return newstruct cs2func_script_1004_struct(50, 1716, "Members: Use completed Prayer books" + "
" + "to bless holy and unholy symbols" + "
" + " (after Horror from the Deep)", "Members now have the Prayer level required to use completed prayer books to bless " + "" + "holy" + "" + " and " + "" + "unholy symbols" + "" + " (after Horror from the Deep)."); + case 45: + return newstruct cs2func_script_1004_struct(55, 13734, "Members: Spirit shield" + "
" + " (after Summer's End and with 40 Defence)", "Members now have the Prayer level required to wield " + "" + "spirit shields" + "" + " (after Summer's End, with level 40 Defence)."); + case 46: + return newstruct cs2func_script_1004_struct(60, 10472, "Members: Guthix stole", "Members can now wear " + "" + "Guthix stoles" + "" + "."); + case 47: + return newstruct cs2func_script_1004_struct(60, 10442, "Members: Guthix crozier", "Members can now wield " + "" + "Guthix croziers" + "" + "."); + case 48: + return newstruct cs2func_script_1004_struct(60, 10470, "Members: Saradomin stole", "Members can now wear " + "" + "Saradomin stoles" + "" + "."); + case 49: + return newstruct cs2func_script_1004_struct(60, 10440, "Members: Saradomin crozier", "Members can now wield " + "" + "Saradomin croziers" + "" + "."); + case 50: + return newstruct cs2func_script_1004_struct(60, 10474, "Members: Zamorak stole", "Members can now wear " + "" + "Zamorak stoles" + "" + "."); + case 51: + return newstruct cs2func_script_1004_struct(60, 10444, "Members: Zamorak crozier", "Members can now wield " + "" + "Zamorak croziers" + "" + "."); + case 52: + return newstruct cs2func_script_1004_struct(60, 19392, "Members: Armadyl stole", "Members can now wear " + "" + "Armadyl stoles" + "" + "."); + case 53: + return newstruct cs2func_script_1004_struct(60, 19362, "Members: Armadyl crozier", "Members can now wield " + "" + "Armadyl croziers" + "" + "."); + case 54: + return newstruct cs2func_script_1004_struct(60, 19394, "Members: Bandos stole", "Members can now wear " + "" + "Bandos stoles" + "" + "."); + case 55: + return newstruct cs2func_script_1004_struct(60, 19364, "Members: Bandos crozier", "Members can now wield " + "" + "Bandos croziers" + "" + "."); + case 56: + return newstruct cs2func_script_1004_struct(60, 19396, "Members: Ancient stole", "Members can now wear " + "" + "Ancient stoles" + "" + "."); + case 57: + return newstruct cs2func_script_1004_struct(60, 19366, "Members: Ancient crozier", "Members can now wield " + "" + "Ancient croziers" + "" + "."); + case 58: + return newstruct cs2func_script_1004_struct(60, 19323, "Members: Dragon staff" + "
" + " (with 40 Magic, 40 Attack and 20 Defence)", "Members now have the Prayer level required to wield " + "" + "dragon staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 20 Defence.)"); + case 59: + return newstruct cs2func_script_1004_struct(60, 19325, "Members: Penguin staff" + "
" + " (with 40 Magic, 40 Attack and 20 Defence)", "Members now have the Prayer level required to wield " + "" + "penguin staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 20 Defence.)"); + case 60: + return newstruct cs2func_script_1004_struct(60, 19327, "Members: Bat staff" + "
" + " (with 40 Magic, 40 Attack and 20 Defence)", "Members now have the Prayer level required to wield " + "" + "bat staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 20 Defence.)"); + case 61: + return newstruct cs2func_script_1004_struct(60, 19329, "Members: Wolf staff" + "
" + " (with 40 Magic, 40 Attack and 20 Defence)", "Members now have the Prayer level required to wield " + "" + "wolf staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 20 Defence.)"); + case 62: + return newstruct cs2func_script_1004_struct(60, 19331, "Members: Cat staff" + "
" + " (with 40 Magic, 40 Attack and 20 Defence)", "Members now have the Prayer level required to wield " + "" + "cat staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 20 Defence.)"); + case 63: + return newstruct cs2func_script_1004_struct(60, 13736, "Members: Blessed spirit shield" + "
" + " (after Summer's End and with 70 Defence)", "Members now have the Prayer level required to wield " + "" + "blessed spirit shields" + "" + " (after Summer's End, with level 70 Defence)."); + case 64: + return newstruct cs2func_script_1004_struct(60, 19887, "Members: Split dragon tooth necklace" + "
" + " (with 60 Dungeoneering)", "Members now have the Prayer level required to wear " + "" + "Split dragon tooth necklaces" + "" + ". (They also need level 60 Dungeoneering.)"); + case 65: + return newstruct cs2func_script_1004_struct(65, 19308, "Members: Third-Age druidic staff", "Members can now wield " + "" + "Third-Age druidic staves" + "" + "."); + case 66: + return newstruct cs2func_script_1004_struct(65, 19311, "Members: Third-Age druidic cloak", "Members can now wear " + "" + "Third-Age druidic cloaks" + "" + "."); + case 67: + return newstruct cs2func_script_1004_struct(65, 19314, "Members: Third-Age druidic wreath", "Members can now wear " + "" + "Third-Age druidic wreaths" + "" + "."); + case 68: + return newstruct cs2func_script_1004_struct(65, 19317, "Members: Third-Age Druidic robe top", "Members can now wear " + "" + "Third-Age druidic robe tops" + "" + "."); + case 69: + return newstruct cs2func_script_1004_struct(65, 19320, "Members: Third-Age Druidic robe bottoms", "Members can now wear " + "" + "Third-Age druidic bottoms" + "" + "."); + case 70: + return newstruct cs2func_script_1004_struct(70, 13738, "Members: Arcane spirit shield" + "
" + " (after Summer's End and with 65 Magic and 75 Defence)", "Members now have the Prayer level required to wield " + "" + "arcane spirit shields" + "" + " (after Summer's End, with level 65 Magic and 75 Defence)."); + case 71: + return newstruct cs2func_script_1004_struct(70, 13744, "Members: Spectral spirit shield" + "
" + " (after Summer's End and with 65 Magic and 75 Defence)", "Members now have the Prayer level required to wield " + "" + "spectral spirit shields" + "" + " (after Summer's End, with level 65 Magic and 75 Defence)."); + case 72: + return newstruct cs2func_script_1004_struct(70, 21736, "Members: Akrisae's hood" + "
" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Magic)", "Members now have the Prayer level required to wear " + "" + "Akrisae's hood" + "" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Magic)."); + case 73: + return newstruct cs2func_script_1004_struct(70, 21752, "Members: Akrisae's robe top" + "
" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Magic)", "Members now have the Prayer level required to wear " + "" + "Akrisae's robe top" + "" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Magic)."); + case 74: + return newstruct cs2func_script_1004_struct(70, 21760, "Members: Akrisae's robe skirt" + "
" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Magic)", "Members now have the Prayer level required to wear " + "" + "Akrisae's robe skirt" + "" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Magic)."); + case 75: + return newstruct cs2func_script_1004_struct(70, 21744, "Members: Akrisae's war mace" + "
" + " (after Ritual of the Mahjarrat and with level 70 Attack and 70 Magic)", "Members now have the Prayer level required to use " + "" + "Akrisae's war mace" + "" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Magic)."); + case 76: + return newstruct cs2func_script_1004_struct(75, 13740, "Members: Divine spirit shield" + "
" + " (after Summer's End and with 75 Defence)", "Members now have the Prayer level required to wield " + "" + "divine spirit shields" + "" + " (after Summer's End, with level 75 Defence)."); + case 77: + return newstruct cs2func_script_1004_struct(75, 13742, "Members: Elysian spirit shield" + "
" + " (after Summer's End and with 75 Defence)", "Members now have the Prayer level required to wield " + "" + "elysian spirit shields" + "" + " (after Summer's End, with level 75 Defence)."); + case 78: + return newstruct cs2func_script_1004_struct(90, 19888, "Members: Demon horn necklace" + "
" + " (with 90 Dungeoneering)", "Members now have the Prayer level required to wear " + "" + "Demon horn necklaces" + "" + ". (They also need level 90 Dungeoneering.)"); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1004_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Prayer level increases, you will be able to attempt higher-level prayer tasks within Daemonheim. You will also be more likely to succeed when attempting prayer tasks within Daemonheim.", ""); + } + break; + case 3: + SWITCH (arg1) { + case 0: + GOTO flow_86 + case 1: + GOTO flow_87 + case 2: + GOTO flow_88 + case 3: + GOTO flow_89 + case 4: + GOTO flow_90 + case 5: + GOTO flow_91 + case 6: + GOTO flow_92 + case 7: + GOTO flow_93 + case 8: + GOTO flow_94 + } + break; + flow_86: + return newstruct cs2func_script_1004_struct(2, 11948, "Repair somebody else's gravestone", "You can now " + "" + "repair" + "" + " somebody else's " + "" + "gravestone" + "" + "!"); + flow_87: + return newstruct cs2func_script_1004_struct(31, 13253, "Monastery", "Abbot Langley will now let you enter the " + "" + "Monastery" + "" + " west of " + "" + "Edgeville" + "" + "."); + flow_88: + return newstruct cs2func_script_1004_struct(70, 11948, "Bless somebody else's gravestone", "You can now " + "" + "bless somebody else's " + "" + "gravestone" + "" + "!"); + flow_89: + return newstruct cs2func_script_1004_struct(85, 13754, "Members: Bless spirit shields" + "
" + " (after Summer's End)", "Members can now " + "" + "bless spirit shields" + "" + " (after Summer's End)."); + flow_90: + return newstruct cs2func_script_1004_struct(90, 13746, "Members: Create arcane spirit shields" + "
" + " (after Summer's End and with 85 Smithing)", "Members can now create " + "" + "arcane spirit shields" + "" + " (after Summer's End, with level 85 Smithing)."); + flow_91: + return newstruct cs2func_script_1004_struct(90, 13748, "Members: Create divine spirit shields" + "
" + " (after Summer's End and with 85 Smithing)", "Members can now create " + "" + "divine spirit shields" + "" + " (after Summer's End, with level 85 Smithing)."); + flow_92: + return newstruct cs2func_script_1004_struct(90, 13750, "Members: Create elysian spirit shields" + "
" + " (after Summer's End and with 85 Smithing)", "Members can now create " + "" + "elysian spirit shields" + "" + " (after Summer's End, with level 85 Smithing)."); + flow_93: + return newstruct cs2func_script_1004_struct(90, 13752, "Members: Create spectral spirit shields" + "
" + " (after Summer's End and with 85 Smithing)", "Members can now create " + "" + "spectral spirit shields" + "" + " (after Summer's End, with level 85 Smithing)."); + flow_94: + return newstruct cs2func_script_1004_struct(99, 9759, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Prayer" + "" + ". Members can visit " + "" + "Brother Jared" + "" + " upstairs at the " + "" + "Monastery" + "" + ". He has something special that is only available to true masters of the " + "" + "Prayer" + "" + " skill!"); + } + return newstruct cs2func_script_1004_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1005.cs2 b/dumps/scripts/1005.cs2 new file mode 100644 index 000000000..d93303ab9 --- /dev/null +++ b/dumps/scripts/1005.cs2 @@ -0,0 +1,37 @@ +cs2func_script_1005_struct(1,1,0) script_1005(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1005_struct(1, "Traps"); + case 1: + return newstruct cs2func_script_1005_struct(1, "Tracking"); + case 2: + return newstruct cs2func_script_1005_struct(1, "Birds"); + case 3: + return newstruct cs2func_script_1005_struct(1, "Butterfly net"); + case 4: + return newstruct cs2func_script_1005_struct(1, "Deadfall"); + case 5: + return newstruct cs2func_script_1005_struct(1, "Box trap"); + case 6: + return newstruct cs2func_script_1005_struct(1, "Net trap"); + case 7: + return newstruct cs2func_script_1005_struct(1, "Pitfalls"); + case 8: + return newstruct cs2func_script_1005_struct(1, "Falconry"); + case 9: + return newstruct cs2func_script_1005_struct(1, "Imp box"); + case 10: + return newstruct cs2func_script_1005_struct(1, "Other"); + case 11: + return newstruct cs2func_script_1005_struct(1, "Clothing"); + case 12: + return newstruct cs2func_script_1005_struct(1, "Barehanded"); + case 13: + return newstruct cs2func_script_1005_struct(1, "Minigames"); + case 14: + return newstruct cs2func_script_1005_struct(1, "Dungeoneering"); + case 15: + return newstruct cs2func_script_1005_struct(1, "Milestones"); + } + return newstruct cs2func_script_1005_struct(-1, ""); +} diff --git a/dumps/scripts/1006.cs2 b/dumps/scripts/1006.cs2 new file mode 100644 index 000000000..193b2a656 --- /dev/null +++ b/dumps/scripts/1006.cs2 @@ -0,0 +1,382 @@ +cs2func_script_1006_struct(2,2,0) script_1006(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(1, 9951, "Lay 1 trap at a time", "You can now lay " + "" + "1 trap" + "" + " at a time."); + case 1: + return newstruct cs2func_script_1006_struct(1, 10006, "Bird snare setting", "You can now set " + "" + "bird snares" + "" + "."); + case 2: + return newstruct cs2func_script_1006_struct(1, 10150, "Noose wand", "You can now use a " + "" + "noose wand" + "" + " when tracking."); + case 3: + return newstruct cs2func_script_1006_struct(15, 10010, "Butterfly netting", "You can now use a " + "" + "butterfly net" + "" + " and " + "" + "butterfly jar" + "" + " to catch " + "" + "butterflies" + "" + "."); + case 4: + return newstruct cs2func_script_1006_struct(20, 9951, "Lay up to 2 traps at a time", "You can now lay up to " + "" + "2 traps" + "" + " at a time."); + case 5: + return newstruct cs2func_script_1006_struct(23, 1511, "Set a deadfall trap (limit of 1)", "You can now set a " + "" + "deadfall trap" + "" + " up to a limit of 1."); + case 6: + return newstruct cs2func_script_1006_struct(27, 10008, "Set a box trap", "You can now set a " + "" + "box trap" + "" + "."); + case 7: + return newstruct cs2func_script_1006_struct(27, 10031, "Set a rabbit snare", "You can now set a " + "" + "rabbit snare" + "" + "."); + case 8: + return newstruct cs2func_script_1006_struct(29, 303, "Set a net trap", "You can now set a " + "" + "net trap" + "" + "."); + case 9: + return newstruct cs2func_script_1006_struct(31, 10029, "Set a pitfall trap", "You can now set a " + "" + "pitfall trap" + "" + "."); + case 10: + return newstruct cs2func_script_1006_struct(39, 594, "Use smoke to mask the scent on a trap", "You can now use " + "" + "smoke" + "" + " to mask the scent on a trap."); + case 11: + return newstruct cs2func_script_1006_struct(40, 9951, "Lay up to 3 traps at a time", "You can now lay up to " + "" + "3 traps" + "" + " at a time."); + case 12: + return newstruct cs2func_script_1006_struct(40, 14110, "Sacred clay butterfly net", "You can now use " + "" + "sacred clay butterfly nets" + ""); + case 13: + return newstruct cs2func_script_1006_struct(40, 14102, "Volatile butterfly net", "You can now use " + "" + "volatile butterfly nets" + ""); + case 14: + return newstruct cs2func_script_1006_struct(43, 10023, "Hunt with a falcon", "You can now hunt with a " + "" + "falcon" + "" + "."); + case 15: + return newstruct cs2func_script_1006_struct(60, 9951, "Lay up to 4 traps at a time", "You can now lay up to " + "" + "4 traps" + "" + " at a time."); + case 16: + return newstruct cs2func_script_1006_struct(70, 19965, "Marasamaw plants (herblore habitat)", "You can now set a " + "" + "marasamaw plant" + "" + " trap."); + case 17: + return newstruct cs2func_script_1006_struct(71, 10025, "Magical imp box", "You can now set a " + "" + "magical imp box" + "" + " trap."); + case 18: + return newstruct cs2func_script_1006_struct(80, 9951, "Lay up to 5 traps at a time", "You can now lay up to " + "" + " 5 traps" + "" + " at a time."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(1, 9953, "Polar kebbit (polar)", "You can now track " + "" + "polar kebbits" + "" + "."); + case 1: + return newstruct cs2func_script_1006_struct(3, 9954, "Common kebbit (woodland)", "You can now track " + "" + "common kebbits" + "" + "."); + case 2: + return newstruct cs2func_script_1006_struct(7, 9955, "Feldip weasel (jungle)", "You can now track " + "" + "feldip weasels" + "" + "."); + case 3: + return newstruct cs2func_script_1006_struct(13, 9956, "Desert devil (desert)", "You can now track " + "" + "desert devils" + "" + "."); + case 4: + return newstruct cs2func_script_1006_struct(45, 14832, "Penguins (polar)" + "
" + " (after Hunt for Red Raktuber)", "You can now track " + "" + "penguins" + "" + " (after Hunt for Red Raktuber)."); + case 5: + return newstruct cs2func_script_1006_struct(49, 9961, "Razor-backed kebbit (woodland)", "You can now track " + "" + "razor-backed kebbits" + "" + "."); + case 6: + return newstruct cs2func_script_1006_struct(71, 19954, "Shadow jadinko (herblore habitat)", "You can now track " + "" + "shadow jadinkos" + "" + "."); + case 7: + return newstruct cs2func_script_1006_struct(78, 19958, "Diseased jadinko (herblore habitat)", "You can now track " + "" + "diseased jadinkos" + "" + "."); + case 8: + return newstruct cs2func_script_1006_struct(79, 19955, "Camouflaged jadinko (herblore habitat)", "You can now track " + "" + "camouflaged jadinkos" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(1, 9965, "Crimson swift (jungle)", "You can now trap " + "" + "crimson swifts" + "" + "."); + case 1: + return newstruct cs2func_script_1006_struct(5, 9968, "Golden warbler (desert)", "You can now trap " + "" + "golden warblers" + "" + "."); + case 2: + return newstruct cs2func_script_1006_struct(9, 9966, "Copper longtail (woodland)", "You can now trap " + "" + "copper longtails" + "" + "."); + case 3: + return newstruct cs2func_script_1006_struct(11, 9967, "Cerulean twitch (polar)", "You can now trap " + "" + "cerulean twitches" + "" + "."); + case 4: + return newstruct cs2func_script_1006_struct(19, 9969, "Tropical wagtail (jungle)", "You can now trap " + "" + "tropical wagtails" + "" + "."); + case 5: + return newstruct cs2func_script_1006_struct(39, 12586, "Wimpy bird (jungle)" + "
" + " (after starting As a First Resort...)" + "
" + " Required lure: smouldering tansymum", "You can now trap " + "" + "wimpy birds" + "" + " (after starting As a First Resort...)."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(15, 9970, "Ruby harvest butterfly (woodland)", "You can now net " + "" + "ruby harvest butterflies" + "" + "."); + case 1: + return newstruct cs2func_script_1006_struct(17, 11238, "Baby impling", "You can now net " + "" + "baby implings" + "" + "."); + case 2: + return newstruct cs2func_script_1006_struct(22, 11240, "Young impling", "You can now net " + "" + "young implings" + "" + "."); + case 3: + return newstruct cs2func_script_1006_struct(25, 9971, "Sapphire glacialis butterfly (polar)", "You can now net " + "" + "sapphire glacialis butterflies" + "" + "."); + case 4: + return newstruct cs2func_script_1006_struct(28, 11242, "Gourmet impling", "You can now net " + "" + "gourmet implings" + "" + "."); + case 5: + return newstruct cs2func_script_1006_struct(35, 9972, "Snowy knight butterfly (polar)", "You can now net " + "" + "snowy knight butterflies" + "" + "."); + case 6: + return newstruct cs2func_script_1006_struct(36, 11244, "Earth impling", "You can now net " + "" + "earth implings" + "" + "."); + case 7: + return newstruct cs2func_script_1006_struct(42, 11246, "Essence impling", "You can now net " + "" + "essence implings" + "" + "."); + case 8: + return newstruct cs2func_script_1006_struct(45, 9973, "Black warlock butterfly (jungle)", "You can now net " + "" + "black warlock butterflies" + "" + "."); + case 9: + return newstruct cs2func_script_1006_struct(50, 11248, "Eclectic impling", "You can now net " + "" + "eclectic implings" + "" + "."); + case 10: + return newstruct cs2func_script_1006_struct(54, 15513, "Spirit impling", "You can now net " + "" + "spirit implings" + "" + "."); + case 11: + return newstruct cs2func_script_1006_struct(58, 11250, "Nature impling", "You can now net " + "" + "nature implings" + "" + "."); + case 12: + return newstruct cs2func_script_1006_struct(65, 11252, "Magpie impling", "You can now net " + "" + "magpie implings" + "" + "."); + case 13: + return newstruct cs2func_script_1006_struct(74, 11254, "Ninja impling", "You can now net " + "" + "ninja implings" + "" + "."); + case 14: + return newstruct cs2func_script_1006_struct(76, 13337, "Pirate impling" + "
" + " (after Rocking Out)", "You can now net " + "" + "pirate implings" + "" + " (after Rocking Out)."); + case 15: + return newstruct cs2func_script_1006_struct(83, 11256, "Dragon impling", "You can now net " + "" + "dragon implings" + "" + "."); + case 16: + return newstruct cs2func_script_1006_struct(87, 15515, "Zombie impling", "You can now net " + "" + "zombie implings" + "" + "."); + case 17: + return newstruct cs2func_script_1006_struct(91, 15517, "Kingly impling", "You can now net " + "" + "kingly implings" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(23, 9962, "Wild kebbit (woodland)" + "
" + " Preferred bait: Raw meat", "You can now use deadfall traps to hunt " + "" + "wild kebbits" + "" + "."); + case 1: + return newstruct cs2func_script_1006_struct(33, 9958, "Barb-tailed kebbit (jungle)" + "
" + " Preferred bait: Raw rainbow fish", "You can now use deadfall traps to hunt " + "" + "barb-tailed kebbits" + "" + "."); + case 2: + return newstruct cs2func_script_1006_struct(37, 9957, "Prickly kebbit (northern woodland)" + "
" + " Preferred bait: Barley", "You can now use deadfall traps to hunt " + "" + "prickly kebbits" + "" + "."); + case 3: + return newstruct cs2func_script_1006_struct(44, 12587, "Diseased kebbit (jungle)" + "
" + " (after starting As a First Resort...)" + "
" + " Required lure: smouldering fever grass", "You now have the Hunter level required to use deadfall traps to hunt " + "" + "diseased kebbits" + "" + " (after starting As a First Resort...)."); + case 4: + return newstruct cs2func_script_1006_struct(51, 9959, "Sabre-toothed kebbit (polar)" + "
" + " Preferred bait: Raw meat", "You can now use deadfall traps to hunt " + "" + "sabre-toothed kebbits" + "" + "."); + case 5: + return newstruct cs2func_script_1006_struct(51, 14832, "Penguins (polar)" + "
" + " (after Hunt for Red Raktuber)" + "
" + " Preferred bait: Raw cod", "You can now use deadfall traps to hunt " + "" + "penguins" + "" + " (after Hunt for Red Raktuber)."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(27, 10092, "Ferret (woodland)" + "
" + " (after Eagles' Peak)", "You can now catch " + "" + "ferrets" + "" + " with box traps (after Eagles' Peak)."); + case 1: + return newstruct cs2func_script_1006_struct(27, 12184, "Gecko" + "
" + " (with 10 Summoning)", "You now have the Hunter level required to catch " + "" + "geckos" + "" + " with box traps. (You also need level 10 Summoning.)"); + case 2: + return newstruct cs2func_script_1006_struct(27, 12199, "Raccoon" + "
" + " (with 80 Summoning)", "You now have the Hunter level required to catch " + "" + "raccoons" + "" + " with box traps. (You also need level 80 Summoning.)"); + case 3: + return newstruct cs2func_script_1006_struct(27, 12201, "Monkey" + "
" + " (with 95 Summoning)" + "
" + " Preferred bait: Bananas", "You now have the Hunter level required to catch " + "" + "monkeys" + "" + " with box traps. (You also need level 95 Summoning.)"); + case 4: + return newstruct cs2func_script_1006_struct(48, 12585, "Platypus (jungle)" + "
" + " (with 10 Summoning)" + "
" + " (after starting As a First Resort...)" + "
" + " Required lure: Smouldering lavender", "You now have the Hunter level required to catch " + "" + "platypodes" + "" + " with box traps (after As a First Resort... and with level 10 Summoning)."); + case 5: + return newstruct cs2func_script_1006_struct(53, 9976, "Chinchompa (woodland)" + "
" + " Preferred bait: Spicy chopped tomatoes", "You can now catch " + "" + "chinchompas" + "" + " with box traps."); + case 6: + return newstruct cs2func_script_1006_struct(56, 14832, "Penguin (polar)" + "
" + " (after Hunt for Red Raktuber)" + "
" + " Preferred bait: Raw cod", "You can now catch " + "" + "penguins" + "" + " with box traps (after Hunt for Red Raktuber)."); + case 7: + return newstruct cs2func_script_1006_struct(63, 9977, "Red chinchompa (jungle)" + "
" + " Preferred bait: Spicy minced meat", "You can now catch " + "" + "red chinchompas" + "" + " with box traps."); + case 8: + return newstruct cs2func_script_1006_struct(66, 12544, "Pawya (Isafdar)" + "
" + " Required bait: Papaya fruit", "You can now catch " + "" + "pawyas" + "" + " with box traps."); + case 9: + return newstruct cs2func_script_1006_struct(70, 19951, "Common jadinko (using marasamaw plants)" + "
" + " Preferred bait: Withered vines", "You can now catch " + "" + "common jadinkos" + "" + " with marasamaw plants."); + case 10: + return newstruct cs2func_script_1006_struct(74, 19957, "Igneous jadinko (using marasamaw plants)" + "
" + " Preferred bait: Withered vines", "You can now catch " + "" + "igneous jadinkos" + "" + " with marasamaw plants."); + case 11: + return newstruct cs2func_script_1006_struct(75, 19960, "Cannibal jadinko (using marasamaw plants)" + "
" + " Preferred bait: Withered vines", "You can now catch " + "" + "cannibal jadinkos" + "" + " with marasamaw plants."); + case 12: + return newstruct cs2func_script_1006_struct(76, 19953, "Aquatic jadinko (using marasamaw plants)" + "
" + " Preferred bait: Withered vines", "You can now catch " + "" + "aquatic jadinkos" + "" + " with marasamaw plants."); + case 13: + return newstruct cs2func_script_1006_struct(77, 19952, "Amphibious jadinko (using marasamaw plants)" + "
" + " Preferred bait: Withered vines", "You can now catch " + "" + "amphibious jadinkos" + "" + " with marasamaw plants."); + case 14: + return newstruct cs2func_script_1006_struct(77, 12537, "Grenwall (Isafdar)" + "
" + " Required bait: Raw pawya meat", "You can now catch " + "" + "grenwall" + "" + " with box traps."); + case 15: + return newstruct cs2func_script_1006_struct(78, 19959, "Carrion jadinko (using marasamaw plants)" + "
" + " Preferred bait: Withered vines", "You can now catch " + "" + "carrion jadinkos" + "" + " with marasamaw plants."); + case 16: + return newstruct cs2func_script_1006_struct(80, 19956, "Draconic jadinko (using marasamaw plants)" + "
" + " Preferred bait: Withered vines", "You can now catch " + "" + "draconic jadinkos" + "" + " with marasamaw plants."); + case 17: + return newstruct cs2func_script_1006_struct(81, 19961, "Saradomin, Guthix and Zamorak jadinko (using marasamaw plants)" + "
" + " Preferred bait: Withered vines", "You can now catch " + "" + "Saradomin, Guthix and Zamorak jadinkos" + "" + " with marasamaw plants."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(29, 10149, "Swamp lizard (swamp)" + "
" + " Preferred bait: Guam tar", "You can now catch " + "" + "swamp lizards" + "" + " with net traps."); + case 1: + return newstruct cs2func_script_1006_struct(29, 12200, "Squirrel" + "
" + " (with 60 Summoning)" + "
" + " Preferred bait: Nuts", "You now have the Hunter level required to catch " + "" + "squirrels" + "" + " with net traps. (You also need level 60 Summoning.)"); + case 2: + return newstruct cs2func_script_1006_struct(47, 10146, "Orange salamander (desert)" + "
" + " Preferred bait: Marrentill tar", "You can now catch " + "" + "orange salamanders" + "" + " with net traps."); + case 3: + return newstruct cs2func_script_1006_struct(50, 14832, "Penguin (polar)" + "
" + " (after Hunt for Red Raktuber)", "You can now catch " + "" + "penguins" + "" + " with net traps (after Hunt for Red Raktuber)."); + case 4: + return newstruct cs2func_script_1006_struct(59, 10147, "Red salamander (lava)" + "
" + " Preferred bait: Tarromin tar", "You can now catch " + "" + "red salamanders" + "" + " with net traps."); + case 5: + return newstruct cs2func_script_1006_struct(67, 10148, "Black salamander (lava)" + "
" + " Preferred bait: Harralander tar", "You can now catch " + "" + "black salamanders" + "" + " with net traps."); + } + break; + case 7: + if (((boolean)arg1)) { + return newstruct cs2func_script_1006_struct(31, 10045, "Spined larupia (jungle)", "You can now catch " + "" + "spined larupias" + "" + " with pit traps."); + } + if (((boolean)arg1)) { + return newstruct cs2func_script_1006_struct(41, 10051, "Horned graahk (Karamja)", "You can now catch " + "" + "horned graahks" + "" + " with pit traps."); + } + if (arg1 == 2) { + return newstruct cs2func_script_1006_struct(55, 10039, "Sabre-toothed kyatt (polar)", "You can now catch " + "" + "sabre-toothed kyatts" + "" + " with pit traps."); + } + break; + case 8: + if (((boolean)arg1)) { + return newstruct cs2func_script_1006_struct(43, 9960, "Spotted kebbit (woodland)", "You can now hunt " + "" + "spotted kebbits" + "" + " with a falcon."); + } + if (((boolean)arg1)) { + return newstruct cs2func_script_1006_struct(57, 9963, "Dark kebbit (woodland)", "You can now hunt " + "" + "dark kebbits" + "" + " with a falcon."); + } + if (arg1 == 2) { + return newstruct cs2func_script_1006_struct(69, 9964, "Dashing kebbit (woodland)", "You can now hunt " + "" + "dashing kebbits" + "" + " with a falcon."); + } + break; + case 9: + if (((boolean)arg1)) { + return newstruct cs2func_script_1006_struct(71, 9952, "Imp (worldwide)" + "
" + " Preferred bait: Magical beads", "You can now catch " + "" + "imps" + "" + " in " + "" + "imp boxes" + "" + "."); + } + break; + case 10: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(27, 9975, "White rabbit (woodland)" + "
" + " Use a ferret to flush the rabbit out of its hole" + "
" + " (after Eagles' Peak)", "You now have the Hunter level required to use a " + "" + "ferret" + "" + " to hunt " + "" + "white rabbits" + "" + " (after Eagles' Peak)."); + case 1: + return newstruct cs2func_script_1006_struct(27, 9974, "Giant eagle (various)" + "
" + " (after Eagles' Peak)", "You now have the Hunter level required to lasso " + "" + "giant eagles" + "" + " (after Eagles' Peak)."); + case 2: + return newstruct cs2func_script_1006_struct(72, 19808, "Charm sprites (south of the Tree Gnome Stronghold)" + "
" + " Use Hunter skill to catch charm sprites and gain Summoning charms", "You now have the Hunter level required to transmute " + "" + "charm sprites" + "" + " into Summoning charm slices."); + case 3: + return newstruct cs2func_script_1006_struct(91, 18778, "Starved ancient effigies", "You can now investigate " + "" + "starved ancient effigies" + "" + " using your knowledge of Hunter."); + case 4: + return newstruct cs2func_script_1006_struct(93, 18779, "Nourished ancient effigies", "You can now investigate " + "" + "nourished ancient effigies" + "" + " using your knowledge of Hunter."); + case 5: + return newstruct cs2func_script_1006_struct(95, 18780, "Sated ancient effigies", "You can now investigate " + "" + "sated ancient effigies" + "" + " using your knowledge of Hunter."); + case 6: + return newstruct cs2func_script_1006_struct(97, 18781, "Gorged ancient effigies", "You can now investigate " + "" + "gorged ancient effigies" + "" + " using your knowledge of Hunter."); + } + break; + case 11: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(1, 10065, "Polar kebbit fur clothing (polar)", "You can now wear " + "" + "polar kebbit fur clothing" + "" + "."); + case 1: + return newstruct cs2func_script_1006_struct(1, 10053, "Common kebbit fur clothing (woodland)", "You can now wear " + "" + "common kebbit fur clothing" + "" + "."); + case 2: + return newstruct cs2func_script_1006_struct(4, 10057, "Feldip weasel fur clothing (jungle)", "You can now wear " + "" + "feldip weasel fur clothing" + "" + "."); + case 3: + return newstruct cs2func_script_1006_struct(10, 10061, "Desert devil fur clothing (desert)", "You can now wear " + "" + "desert devil fur clothing" + "" + "."); + case 4: + return newstruct cs2func_script_1006_struct(24, 10132, "Lucky rabbit's foot", "You can now wear a " + "" + "lucky rabbit's foot" + "" + "."); + case 5: + return newstruct cs2func_script_1006_struct(28, 10045, "Larupia fur clothing", "You can now wear " + "" + "larupia fur clothing" + "" + "."); + case 6: + return newstruct cs2func_script_1006_struct(38, 10051, "Graahk-hide clothing", "You can now wear " + "" + "graahk-hide clothing" + "" + "."); + case 7: + return newstruct cs2func_script_1006_struct(40, 10069, "Spotted capes", "You can now wear " + "" + "spotted capes" + "" + "."); + case 8: + return newstruct cs2func_script_1006_struct(52, 10039, "Kyatt fur clothing", "You can now wear " + "" + "kyatt fur clothing" + "" + "."); + case 9: + return newstruct cs2func_script_1006_struct(54, 10075, "Gloves of silence", "You can now wear " + "" + "gloves of silence" + "" + "."); + case 10: + return newstruct cs2func_script_1006_struct(66, 10071, "Spottier capes", "You can now wear " + "" + "spottier capes" + "" + "."); + case 11: + return newstruct cs2func_script_1006_struct(70, 20046, "Witchdoctor clothing", "You can now wear " + "" + "witchdoctor clothing" + "" + "."); + } + break; + case 12: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(17, 11238, "Baby impling", "You can now catch " + "" + "baby implings" + "" + " barehanded."); + case 1: + return newstruct cs2func_script_1006_struct(22, 11240, "Young impling", "You can now catch " + "" + "young implings" + "" + " barehanded."); + case 2: + return newstruct cs2func_script_1006_struct(28, 11242, "Gourmet impling", "You can now catch " + "" + "gourmet implings" + "" + " barehanded."); + case 3: + return newstruct cs2func_script_1006_struct(36, 11244, "Earth impling", "You can now catch " + "" + "earth implings" + "" + " barehanded."); + case 4: + return newstruct cs2func_script_1006_struct(42, 11246, "Essence impling", "You can now catch " + "" + "essence implings" + "" + " barehanded."); + case 5: + return newstruct cs2func_script_1006_struct(50, 11248, "Eclectic impling", "You can now catch " + "" + "eclectic implings" + "" + " barehanded."); + case 6: + return newstruct cs2func_script_1006_struct(54, 15513, "Spirit impling", "You can now catch " + "" + "spirit implings" + "" + " barehanded."); + case 7: + return newstruct cs2func_script_1006_struct(58, 11250, "Nature impling", "You can now catch " + "" + "nature implings" + "" + " barehanded."); + case 8: + return newstruct cs2func_script_1006_struct(65, 11252, "Magpie impling", "You can now catch " + "" + "magpie implings" + "" + " barehanded."); + case 9: + return newstruct cs2func_script_1006_struct(74, 11254, "Ninja impling", "You can now catch " + "" + "ninja implings" + "" + " barehanded."); + case 10: + return newstruct cs2func_script_1006_struct(76, 13337, "Pirate impling" + "
" + " (after Rocking Out)", "You can now catch " + "" + "pirate implings" + "" + " barehanded (after Rocking Out)."); + case 11: + return newstruct cs2func_script_1006_struct(80, 9970, "Catch ruby harvest butterfly barehanded (woodland)" + "
" + " (with 75 Agility)", "You now have the Hunter level to catch " + "" + "ruby harvest butterflies" + "" + " barehanded. This feat will give you Hunter and Agility experience upon a successful catch. (You also need level 75 Agility.)"); + case 12: + return newstruct cs2func_script_1006_struct(83, 11256, "Dragon impling", "You can now catch " + "" + "dragon implings" + "" + " barehanded."); + case 13: + return newstruct cs2func_script_1006_struct(85, 9971, "Catch sapphire glacialis butterfly barehanded (polar)" + "
" + " (with 80 Agility)", "You now have the Hunter level to catch " + "" + "sapphire glacialis butterflies" + "" + " barehanded. This feat will give you Hunter and Agility experience upon a successful catch. (You also need level 80 Agility.)"); + case 14: + return newstruct cs2func_script_1006_struct(87, 15515, "Zombie impling", "You can now catch " + "" + "zombie implings" + "" + " barehanded."); + case 15: + return newstruct cs2func_script_1006_struct(90, 9972, "Catch snowy knight butterfly barehanded (polar)" + "
" + " (with 85 Agility)", "You now have the Hunter level to catch " + "" + "snowy knight butterflies" + "" + " barehanded. This feat will give you Hunter and Agility experience upon a successful catch. (You also need level 85 Agility.)"); + case 16: + return newstruct cs2func_script_1006_struct(91, 15517, "Kingly impling", "You can now catch " + "" + "kingly implings" + "" + " barehanded."); + case 17: + return newstruct cs2func_script_1006_struct(95, 9973, "Catch black warlock butterfly barehanded (jungle)" + "
" + " (with 90 Agility)", "You now have the Hunter level to catch " + "" + "black warlock butterflies" + "" + " barehanded. This feat will give you Hunter and Agility experience upon a successful catch. (You also need level 90 Agility.)"); + } + break; + case 13: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(1, 14152, "Stealing Creation - class 1 butterfly net", "Members can now use " + "" + "class 1 butterfly nets" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_1006_struct(20, 14184, "Stealing Creation - net class 2 sacred clay", "Members can now net " + "" + "class 2 sacred clay" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_1006_struct(20, 14154, "Stealing Creation - class 2 butterfly net", "Members can now use " + "" + "class 2 butterfly nets" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_1006_struct(40, 14186, "Stealing Creation - net class 3 sacred clay", "Members can now net " + "" + "class 3 sacred clay" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_1006_struct(40, 14156, "Stealing Creation - class 3 butterfly net", "Members can now use " + "" + "class 3 butterfly nets" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_1006_struct(60, 14188, "Stealing Creation - net class 4 sacred clay", "Members can now net " + "" + "class 4 sacred clay" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_1006_struct(60, 14158, "Stealing Creation - class 4 butterfly net", "Members can now use " + "" + "class 4 butterfly nets" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_1006_struct(80, 14190, "Stealing Creation - net class 5 sacred clay", "Members can now net " + "" + "class 5 sacred clay" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_1006_struct(80, 14160, "Stealing Creation - class 5 butterfly net", "Members can now use " + "" + "class 5 butterfly nets" + "" + " in Stealing Creation."); + } + break; + case 14: + switch (arg1) { + case 0: + return newstruct cs2func_script_1006_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Hunter level increases, you will be able to attempt higher-level hunter tasks within Daemonheim. You will also be more likely to succeed when attempting hunter tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1006_struct(1, 17756, "Tangle gum trap (Tier 1)", "You can now place " + "" + "tangle gum traps" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1006_struct(1, 17424, "Protomastyx hide (Tier 1)", "You can now gain " + "" + "protomastyx hides" + "" + " from protomastyx carcasses within Daemonheim."); + case 3: + return newstruct cs2func_script_1006_struct(10, 17758, "Seeping elm trap (Tier 2)", "You can now place " + "" + "seeping elm traps" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1006_struct(10, 17426, "Submastyx hide (Tier 2)", "You can now gain " + "" + "submastyx hides" + "" + " from submastyx carcasses within Daemonheim."); + case 5: + return newstruct cs2func_script_1006_struct(20, 17760, "Blood spindle trap (Tier 3)", "You can now place " + "" + "blood spindle traps" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_1006_struct(20, 17428, "Paramastyx hide (Tier 3)", "You can now gain " + "" + "paramastyx hides" + "" + " from paramastyx carcasses within Daemonheim."); + case 7: + return newstruct cs2func_script_1006_struct(30, 17762, "Utuku trap (Tier 4)", "You can now place " + "" + "utuku traps" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_1006_struct(30, 17430, "Archaemastyx hide (Tier 4)", "You can now gain " + "" + "archaemastyx hides" + "" + " from archaemastyx carcasses within Daemonheim."); + case 9: + return newstruct cs2func_script_1006_struct(40, 17764, "Spinebeam trap (Tier 5)", "You can now place " + "" + "spinebeam traps" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1006_struct(40, 17432, "Dromomastyx hide (Tier 5)", "You can now gain " + "" + "dromomastyx hides" + "" + " from dromomastyx carcasses within Daemonheim."); + case 11: + return newstruct cs2func_script_1006_struct(50, 17766, "Bovistrangler trap (Tier 6)", "You can now place " + "" + "bovistrangler traps" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_1006_struct(50, 17434, "Spinomastyx hide (Tier 6)", "You can now gain " + "" + "spinomastyx hides" + "" + " from spinomastyx carcasses within Daemonheim."); + case 13: + return newstruct cs2func_script_1006_struct(60, 17768, "Thigat trap (Tier 7)", "You can now place " + "" + "thigat traps" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_1006_struct(60, 17436, "Gallimastyx hide (Tier 7)", "You can now gain " + "" + "gallimastyx hides" + "" + " from gallimastyx carcasses within Daemonheim."); + case 15: + return newstruct cs2func_script_1006_struct(70, 17770, "Corpsethorn trap (Tier 8)", "You can now place " + "" + "corpsethorn traps" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_1006_struct(70, 17438, "Stegomastyx hide (Tier 8)", "You can now gain " + "" + "stegomastyx hides" + "" + " from stegomastyx carcasses within Daemonheim."); + case 17: + return newstruct cs2func_script_1006_struct(80, 17772, "Entgallow trap (Tier 9)", "You can now place " + "" + "entgallow traps" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_1006_struct(80, 17440, "Megamastyx hide (Tier 9)", "You can now gain " + "" + "megamastyx hides" + "" + " from megamastyx carcasses within Daemonheim."); + case 19: + return newstruct cs2func_script_1006_struct(90, 17774, "Grave creeper trap (Tier 10)", "You can now place " + "" + "grave creeper traps" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_1006_struct(90, 17442, "Tyrannomastyx hide (Tier 10)", "You can now gain " + "" + "tyrannomastyx hides" + "" + " from tyrannomastyx carcasses within Daemonheim."); + } + break; + case 15: + if (((boolean)arg1)) { + return newstruct cs2func_script_1006_struct(99, 9948, "Skill mastery", "" + "Congratulations! You are now a master " + "" + "Hunter" + "" + ". Why not visit the " + "" + "Hunter Expert" + "" + ", south of the " + "" + "Feldip Hills" + "" + "? She has something special that is only available to true masters of the " + "" + "Hunter" + "" + " skill!"); + } + } + return newstruct cs2func_script_1006_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1007.cs2 b/dumps/scripts/1007.cs2 new file mode 100644 index 000000000..3406f7366 --- /dev/null +++ b/dumps/scripts/1007.cs2 @@ -0,0 +1,25 @@ +cs2func_script_1007_struct(1,1,0) script_1007(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1007_struct(1, "Courses"); + case 1: + return newstruct cs2func_script_1007_struct(1, "Areas"); + case 2: + return newstruct cs2func_script_1007_struct(1, "Shortcuts"); + case 3: + return newstruct cs2func_script_1007_struct(1, "Barbarian"); + case 4: + return newstruct cs2func_script_1007_struct(1, "Multiple Catch"); + case 5: + return newstruct cs2func_script_1007_struct(1, "Multiple Pickpocket"); + case 6: + return newstruct cs2func_script_1007_struct(1, "Barehanded"); + case 7: + return newstruct cs2func_script_1007_struct(1, "Other"); + case 8: + return newstruct cs2func_script_1007_struct(1, "Dungeoneering"); + case 9: + return newstruct cs2func_script_1007_struct(1, "Milestones"); + } + return newstruct cs2func_script_1007_struct(-1, ""); +} diff --git a/dumps/scripts/1008.cs2 b/dumps/scripts/1008.cs2 new file mode 100644 index 000000000..3efe38ba2 --- /dev/null +++ b/dumps/scripts/1008.cs2 @@ -0,0 +1,342 @@ +cs2func_script_1008_struct(2,2,0) script_1008(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1008_struct(1, 2150, "Gnome Stronghold Agility Course", "You can now use the " + "" + "Gnome Stronghold Agility Course" + "" + "."); + case 1: + return newstruct cs2func_script_1008_struct(1, 751, "Gnome Ball", "You can now play " + "" + "Gnome Ball" + "" + " at the " + "" + "Tree Gnome Stronghold" + "" + "."); + case 2: + return newstruct cs2func_script_1008_struct(1, 2996, "Low-level Agility arena obstacles", "You can now attempt " + "" + "low-level Agility arena obstacles" + "" + "."); + case 3: + return newstruct cs2func_script_1008_struct(20, 2996, "Medium-level Agility arena obstacles", "You can now attempt " + "" + "medium-level Agility arena obstacles" + "" + "."); + case 4: + return newstruct cs2func_script_1008_struct(25, 1061, "Werewolf skullball game" + "
" + " (after Creature of Fenkenstrain)", "You can now play " + "" + "werewolf skullball" + "" + " at the " + "" + "skullball course" + "" + " east of " + "" + "Canifis" + "" + " (after Creature of Fenkenstrain)."); + case 5: + return newstruct cs2func_script_1008_struct(30, 6970, "Agility Pyramid", "You can now enter the " + "" + "Agility Pyramid" + "" + "."); + case 6: + return newstruct cs2func_script_1008_struct(30, 10595, "Penguin Agility Course" + "
" + " (after starting Cold War)", "You can now use the " + "" + "Penguin Agility Course" + "" + " (after starting Cold War)."); + case 7: + return newstruct cs2func_script_1008_struct(35, 1365, "Barbarian Outpost Agility Course", "You can now use the " + "" + "Barbarian Outpost Agility Course" + "" + "."); + case 8: + return newstruct cs2func_script_1008_struct(40, 2996, "High-level Agility arena obstacles", "You can now attempt" + "" + " high-level Agility arena obstacles" + "" + "."); + case 9: + return newstruct cs2func_script_1008_struct(48, 4024, "Ape Atoll Agility Course" + "
" + " (after Monkey Madness)", "You can now use the " + "" + "Ape Atoll Agility Course" + "" + " (after Monkey Madness)."); + case 10: + return newstruct cs2func_script_1008_struct(52, 964, "Wilderness Agility Course", "You can now use the " + "" + "Wilderness Agility Course" + "" + "."); + case 11: + return newstruct cs2func_script_1008_struct(60, 4179, "Werewolf Agility Course" + "
" + " (after Creature of Fenkenstrain)", "You can now use the " + "" + "Werewolf Agility Course" + "" + " (after Creature of Fenkenstrain)."); + case 12: + return newstruct cs2func_script_1008_struct(60, 14683, "Statues in Bandos's Throne Room" + "
" + " (after The Chosen Commander)", "You can now use the " + "" + "statues in Bandos's throne room" + "" + " (after The Chosen Commander)."); + case 13: + return newstruct cs2func_script_1008_struct(80, 4550, "Dorgesh-Kaan Agility Course" + "
" + " (after Death to the Dorgeshuun)", "You can now use the " + "" + "Dorgesh-Kaan Agility Course" + "" + " (after Death to the Dorgeshuun)."); + case 14: + return newstruct cs2func_script_1008_struct(85, 2150, "Advanced Gnome Stronghold Course", "You can now use the " + "" + "Advanced Gnome Stronghold Course" + "" + "."); + case 15: + return newstruct cs2func_script_1008_struct(90, 1365, "Advanced Barbarian Outpost Course", "You can now use the " + "" + "Advanced Barbarian Outpost Course" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1008_struct(10, 6518, "Moss Giant Island rope swing", "You can now use the " + "" + "Moss Giant Island rope-swing" + "" + "."); + case 1: + return newstruct cs2func_script_1008_struct(12, 6518, "Karamja Dungeon stepping stones", "You can now cross the " + "" + "Karamja Dungeon stepping stones" + "" + "."); + case 2: + return newstruct cs2func_script_1008_struct(15, 6518, "Edgeville Dungeon monkey bars", "You can now use the " + "" + "Edgeville Dungeon monkey bars" + "" + "."); + case 3: + return newstruct cs2func_script_1008_struct(18, 6521, "Watchtower wall climb", "You can now use the " + "" + "Watchtower wall climb" + "" + "."); + case 4: + return newstruct cs2func_script_1008_struct(22, 6520, "Karamja Dungeon pipe contortion", "You can now squeeze through the " + "" + "Karamja Dungeon pipe contortion" + "" + "."); + case 5: + return newstruct cs2func_script_1008_struct(30, 6518, "South-east Karamja stepping stones", "You can now cross the " + "" + "south-east Karamja stepping stones" + "" + "."); + case 6: + return newstruct cs2func_script_1008_struct(34, 6520, "Karamja Dungeon pipe contortion", "You can now squeeze through the " + "" + "Karamja Dungeon pipe contortion" + "" + "."); + case 7: + return newstruct cs2func_script_1008_struct(45, 6519, "Isafdar log balance", "You can now cross the " + "" + "Isafdar log balance" + "" + "."); + case 8: + return newstruct cs2func_script_1008_struct(49, 6520, "Yanille Dungeon contortion", "You can now squeeze through the " + "" + "Yanille Dungeon contortion" + "" + "."); + case 9: + return newstruct cs2func_script_1008_struct(50, 6518, "Rogues' Den" + "
" + " (with 50 Thieving)", "You now have the Agility level required to attempt the " + "" + "Rogues' Den" + "" + ", located below the Toad and Chicken pub in Burthorpe. (You also need level 50 Thieving.)"); + case 10: + return newstruct cs2func_script_1008_struct(60, 6520, "God Wars Dungeon access", "You can now use the " + "" + "God Wars Dungeon access" + "" + "."); + case 11: + return newstruct cs2func_script_1008_struct(67, 6521, "Yanille Dungeon rubble climb", "You can now attempt the " + "" + "Yanille Dungeon rubble climb" + "" + "."); + case 12: + return newstruct cs2func_script_1008_struct(70, 6521, "Saradomin Encampment rope descent", "You can now use the " + "" + "Saradomin Encampment rope descent" + "" + " in the " + "" + "God Wars Dungeon" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1008_struct(5, 6517, "Falador Agility shortcut", "You can now use the Falador Agility shortcut" + "" + "."); + case 1: + return newstruct cs2func_script_1008_struct(8, 6515, "River crossing to Al Kharid" + "
" + " (with 37 Ranged and 19 Strength)", "You now have the Agility level required to use the " + "" + "river crossing to Al Kharid" + "" + ". (You also need level 37 Ranged and level 19 Strength.)"); + case 2: + return newstruct cs2func_script_1008_struct(11, 6517, "Falador wall" + "
" + " (with 19 Ranged and 37 Strength)", "You now have the Agility level required to scale " + "" + "Falador wall" + "" + ". (You also need level 19 Ranged and level 37 Strength.)"); + case 3: + return newstruct cs2func_script_1008_struct(13, 6514, "Varrock south fence jump", "You can now use the " + "" + "Varrock south fence jump" + "" + "."); + case 4: + return newstruct cs2func_script_1008_struct(16, 6516, "Yanille Agility shortcut", "You can now use the " + "" + "Yanille Agility shortcut" + "" + "."); + case 5: + return newstruct cs2func_script_1008_struct(20, 6515, "Coal truck log balance", "You can now use the " + "" + "coal truck log balance" + "" + "."); + case 6: + return newstruct cs2func_script_1008_struct(21, 6516, "Varrock Agility shortcut", "You can now use the " + "" + "Varrock Agility shortcut" + "" + "."); + case 7: + return newstruct cs2func_script_1008_struct(25, 6517, "Eagles' Peak Agility shortcut", "You can now use the " + "" + "Eagles' Peak Agility shortcut" + "" + "."); + case 8: + return newstruct cs2func_script_1008_struct(26, 6516, "Falador wall crawl", "You can now use the " + "" + "Falador Agility shortcut" + "" + "."); + case 9: + return newstruct cs2func_script_1008_struct(28, 6516, "Draynor Manor broken railing", "You can now fit through the " + "" + "Draynor Manor broken railing" + "" + "."); + case 10: + return newstruct cs2func_script_1008_struct(29, 6516, "Oo'glog Agility shortcut", "You can now use the " + "" + "Oo'glog Agility shortcut" + "" + "."); + case 11: + return newstruct cs2func_script_1008_struct(31, 6515, "Draynor Manor stones to the Champions' Guild", "You can now use the " + "" + "Draynor Manor stones to the Champions' Guild" + "" + "."); + case 12: + return newstruct cs2func_script_1008_struct(32, 6517, "Catherby cliff" + "
" + " (after Fishing Contest, with 35 Strength and 35 Ranged)", "You now have the Agility level required to scale the " + "" + "Catherby cliff" + "" + ". (You must have completed Fishing Contest and have level 35 Strength and level 35 Ranged.)"); + case 13: + return newstruct cs2func_script_1008_struct(33, 6515, "Ardougne log balance shortcut", "You can now use the " + "" + "Ardougne log balance shortcut" + "" + "."); + case 14: + return newstruct cs2func_script_1008_struct(36, 6517, "Water Obelisk Island escape" + "
" + " (with 39 Ranged and 22 Strength)", "You now have the Agility level required to use the " + "" + "Water Obelisk Island escape" + "" + ". (You also need level 39 Ranged and level 22 Strength.)"); + case 15: + return newstruct cs2func_script_1008_struct(37, 6517, "Gnome Stronghold shortcut", "You can now use the " + "" + "Gnome Stronghold shortcut" + "" + "."); + case 16: + return newstruct cs2func_script_1008_struct(38, 6517, "Al Kharid mining pit cliffside scramble", "You can now manage the " + "" + "Al Kharid mining pit cliffside scramble" + "" + "."); + case 17: + return newstruct cs2func_script_1008_struct(39, 6517, "Yanille wall" + "
" + " (with 21 Ranged and 38 Strength)", "You now have the Agility level required to scale " + "" + "Yanille wall" + "" + ". (You also need level 21 Ranged and level 38 Strength.)"); + case 18: + return newstruct cs2func_script_1008_struct(40, 6517, "Rope climb south-east of the Agility Pyramid", "You can now use the " + "" + "rope climb south-east of the Agility Pyramid" + "" + "."); + case 19: + return newstruct cs2func_script_1008_struct(41, 6517, "Trollheim easy cliffside scramble", "You can now manage the " + "" + "Trollheim easy cliffside scramble" + "" + "."); + case 20: + return newstruct cs2func_script_1008_struct(42, 6516, "Dwarven Mine narrow crevice", "You can now manage the " + "" + "Dwarven Mine narrow crevice" + "" + "."); + case 21: + return newstruct cs2func_script_1008_struct(43, 6517, "Trollheim medium cliffside scramble", "You can now manage the " + "" + "Trollheim medium cliffside scramble" + "" + "."); + case 22: + return newstruct cs2func_script_1008_struct(44, 6517, "Trollheim advanced cliffside scramble", "You can now manage the " + "" + "Trollheim advanced cliffside scramble" + "" + "."); + case 23: + return newstruct cs2func_script_1008_struct(46, 6516, "Cosmic Temple medium narrow walkway", "You can now use the " + "" + "Cosmic Temple medium narrow walkway" + "" + "."); + case 24: + return newstruct cs2func_script_1008_struct(47, 6517, "Trollheim hard cliffside scramble", "You can now manage the " + "" + "Trollheim hard cliffside scramble" + "" + "."); + case 25: + return newstruct cs2func_script_1008_struct(48, 6515, "Log balance to the Fremennik Province", "You can now use the " + "" + "log balance to the Fremennik Province" + "" + "."); + case 26: + return newstruct cs2func_script_1008_struct(51, 6516, "Edgeville Dungeon to Varrock Sewers pipe", "You can now use the " + "" + "Edgeville Dungeon to Varrock Sewers pipe" + "" + "."); + case 27: + return newstruct cs2func_script_1008_struct(53, 6517, "Karamja crossing, south of the volcano" + "
" + " (with 42 Ranged and 21 Strength)", "You now have the Agility level required to manage the " + "" + "Karamja crossing, south of the volcano" + "" + ". (You also need level 42 Ranged and level 21 Strength)."); + case 28: + return newstruct cs2func_script_1008_struct(58, 6517, "Port Phasmatys ectopool shortcut", "You can now use the " + "" + "Port Phasmatys ectopool shortcut" + "" + "."); + case 29: + return newstruct cs2func_script_1008_struct(59, 6517, "Elven overpass easy cliffside scramble", "You can now manage the " + "" + "Elven Overpass easy cliffside scramble" + "" + "."); + case 30: + return newstruct cs2func_script_1008_struct(60, 6517, "God Wars temple escape to the Wilderness", "You can now manage the " + "" + "God Wars temple escape to the Wilderness" + "" + "."); + case 31: + return newstruct cs2func_script_1008_struct(61, 6517, "Slayer Tower medium spiked chain climb", "You can now manage the " + "" + "Slayer Tower medium spiked chain climb" + "" + "."); + case 32: + return newstruct cs2func_script_1008_struct(62, 6516, "Slayer Dungeon narrow crevice", "You can now manage the " + "" + "Slayer Dungeon narrow crevice" + "" + "."); + case 33: + return newstruct cs2func_script_1008_struct(64, 6517, "Trollheim Wilderness route", "You can now use the " + "" + "Trollheim Wilderness route" + "" + "."); + case 34: + return newstruct cs2func_script_1008_struct(65, 6517, "Paterdomus Temple to Morytania shortcut", "You can now use the " + "" + "Paterdomus Temple to Morytania shortcut" + "" + "."); + case 35: + return newstruct cs2func_script_1008_struct(66, 6516, "Cosmic Temple advanced narrow walkway", "You can now use the " + "" + "Cosmic Temple advanced narrow walkway" + "" + "."); + case 36: + return newstruct cs2func_script_1008_struct(68, 6517, "Elven overpass medium cliffside scramble", "You can now manage the " + "" + "elven overpass medium cliffside scramble" + "" + "."); + case 37: + return newstruct cs2func_script_1008_struct(70, 6516, "Taverley Dungeon pipe squeeze", "You can now use the " + "" + "Taverley Dungeon pipe squeeze" + "" + " to the blue dragons."); + case 38: + return newstruct cs2func_script_1008_struct(71, 6517, "Slayer Tower advanced spiked chain climb", "You can now manage the " + "" + "Slayer Tower advanced spiked chain climb" + "" + "."); + case 39: + return newstruct cs2func_script_1008_struct(74, 6514, "Shilo Village stepping stone", "You can now use the " + "" + "Shilo Village stepping stone" + "" + "."); + case 40: + return newstruct cs2func_script_1008_struct(80, 6515, "Cross cave, south of Dorgesh-Kaan " + "
" + " (with 80 Ranged and 80 Strength)", "You now have the Agility level required to cross the " + "" + "cave south of Dorgesh-Kaan" + "" + ". (You also need level 80 Ranged and 80 Strength."); + case 41: + return newstruct cs2func_script_1008_struct(80, 6514, "Taverley Dungeon spiked blade jump", "You can now manage the " + "" + "Taverley Dungeon spiked blade jump" + "" + "."); + case 42: + return newstruct cs2func_script_1008_struct(81, 6514, "Slayer Dungeon chasm jump", "You can now manage the " + "" + "Slayer Dungeon chasm jump" + "" + "."); + case 43: + return newstruct cs2func_script_1008_struct(85, 6517, "Elven overpass advanced cliffside scramble", "You can now manage the " + "" + "elven Overpass advanced cliffside scramble" + "" + "."); + case 44: + return newstruct cs2func_script_1008_struct(86, 6517, "Kuradal's Dungeon wall climb", "You can now manage the " + "" + "wall climb in Kuradal's Slayer Dungeon" + "" + "."); + case 45: + return newstruct cs2func_script_1008_struct(90, 6514, "Kuradal's Dungeon wall run", "You can now manage the " + "" + "wall run in Kuradal's Slayer Dungeon" + "" + "."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1008_struct(-1, 7620, "To start Fishing like a barbarian, talk to Otto Godblessed when you have at least level 48 Fishing and level 15 Strength.", ""); + case 1: + return newstruct cs2func_script_1008_struct(15, 11323, "Heavy rod" + "
" + " (with 48 Fishing and 15 Strength)", "You now have the Agility level required to fish with a " + "" + "heavy rod" + "" + ". (You also need level 48 Fishing and level 15 Strength.)"); + case 2: + return newstruct cs2func_script_1008_struct(15, 11328, "Leaping trout" + "
" + " (with 48 Fishing and 15 Strength)", "You now have the Agility level required to catch " + "" + "leaping trout" + "" + ". (You also need level 48 Fishing and level 15 Strength.)"); + case 3: + return newstruct cs2func_script_1008_struct(30, 11330, "Leaping salmon" + "
" + " (with 58 Fishing and 30 Strength)", "You now have the Agility level required to catch " + "" + "leaping salmon" + "" + ". (You also need level 58 Fishing and level 30 Strength.)"); + case 4: + return newstruct cs2func_script_1008_struct(45, 11332, "Leaping sturgeon" + "
" + " (with 70 Fishing and 45 Strength)", "You now have the Agility level required to catch " + "" + "leaping sturgeon" + "" + ". (You also need level 70 Fishing and level 45 Strength.)"); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1008_struct(35, 359, "Possibility of catching two tuna in one fishing attempt" + "
" + " (with 35 Fishing)", "You now have the Agility level required to potentially catch two " + "" + "tuna" + "" + " in one fishing attempt. (You also need level 35 Fishing.)"); + case 1: + return newstruct cs2func_script_1008_struct(50, 371, "Possibility of catching two swordfish in one fishing attempt" + "
" + " (with 50 Fishing)", "You now have the Agility level required to potentially catch two " + "" + "swordfish" + "" + " in one fishing attempt. (You also need level 50 Fishing.)"); + case 2: + return newstruct cs2func_script_1008_struct(76, 383, "Possibility of catching two sharks in one fishing attempt" + "
" + " (with 76 Fishing)", "You now have the Agility level required to potentially catch two " + "" + "sharks" + "" + " in one fishing attempt. (You also need level 76 Fishing.)"); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1008_struct(1, 3241, "Possibility of stealing double loot from a man" + "
" + " (with 11 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "men" + "" + " and " + "" + "women" + "" + ". (You also need level 11 Thieving.)"); + case 1: + return newstruct cs2func_script_1008_struct(10, 3243, "Possibility of stealing double loot from a farmer" + "
" + " (with 20 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "farmers" + "" + ". (You also need level 20 Thieving.)"); + case 2: + return newstruct cs2func_script_1008_struct(11, 3241, "Possibility of stealing triple loot from a man" + "
" + " (with 21 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "men" + "" + " and " + "" + "women" + "" + ". (You also need level 21 Thieving.)"); + case 3: + return newstruct cs2func_script_1008_struct(15, 4295, "Possibility of stealing double loot from a female H.A.M.follower" + "
" + " (with 25 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "female H.A.M. followers" + "" + ". (You also need level 25 Thieving.)"); + case 4: + return newstruct cs2func_script_1008_struct(20, 3243, "Possibility of stealing triple loot from a farmer" + "
" + " (with 30 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "farmers" + "" + ". (You also need level 30 Thieving.)"); + case 5: + return newstruct cs2func_script_1008_struct(20, 4297, "Possibility of stealing double loot from a male H.A.M. follower" + "
" + " (with 30 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "male H.A.M. followers" + "" + ". (You also need level 30 Thieving.)"); + case 6: + return newstruct cs2func_script_1008_struct(21, 3241, "Possibility of stealing quadruple loot from a man" + "
" + " (with 31 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "men" + "" + " and " + "" + "women" + "" + ". (You also need level 31 Thieving.)"); + case 7: + return newstruct cs2func_script_1008_struct(25, 4295, "Possibility of stealing triple loot from a female H.A.M.follower" + "
" + " (with 35 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "female H.A.M. followers" + "" + ". (You also need level 35 Thieving.)"); + case 8: + return newstruct cs2func_script_1008_struct(25, 3245, "Possibility of stealing double loot from a warrior" + "
" + " (with 35 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "warriors" + "" + ". (You also need level 35 Thieving.)"); + case 9: + return newstruct cs2func_script_1008_struct(30, 3243, "Possibility of stealing quadruple loot from a farmer" + "
" + " (with 40 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "farmers" + "" + ". (You also need level 40 Thieving.)"); + case 10: + return newstruct cs2func_script_1008_struct(30, 4297, "Possibility of stealing triple loot from a male H.A.M. follower" + "
" + " (with 40 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "male H.A.M. followers" + "" + ". (You also need level 40 Thieving.)"); + case 11: + return newstruct cs2func_script_1008_struct(32, 3247, "Possibility of stealing double loot from a rogue" + "
" + " (with 42 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "rogues" + "" + ". (You also need level 42 Thieving.)"); + case 12: + return newstruct cs2func_script_1008_struct(35, 4295, "Possibility of stealing quadruple loot from a female H.A.M. follower" + "
" + " (with 45 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "female H.A.M. followers" + "" + ". (You also need level 45 Thieving.)"); + case 13: + return newstruct cs2func_script_1008_struct(35, 3245, "Possibility of stealing triple loot from a warrior" + "
" + " (with 45 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "warriors" + "" + ". (You also need level 45 Thieving.)"); + case 14: + return newstruct cs2func_script_1008_struct(36, 10998, "Possibility of stealing double loot from a cave goblin" + "
" + " (with 46 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "cave goblins" + "" + ". (You also need level 46 Thieving.)"); + case 15: + return newstruct cs2func_script_1008_struct(38, 5068, "Possibility of stealing double loot from a master farmer" + "
" + " (with 48 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "master farmers" + "" + ". (You also need level 48 Thieving.)"); + case 16: + return newstruct cs2func_script_1008_struct(40, 4297, "Possibility of stealing quadruple loot from a male H.A.M. follower" + "
" + " (with 50 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "male H.A.M. followers" + "" + ". (You also need level 50 Thieving.)"); + case 17: + return newstruct cs2func_script_1008_struct(40, 3249, "Possibility of stealing double loot from a guard" + "
" + " (with 50 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "guards" + "" + ". (You also need level 50 Thieving.)"); + case 18: + return newstruct cs2func_script_1008_struct(42, 3247, "Possibility of stealing triple loot from a rogue" + "
" + " (with 52 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "rogues" + "" + ". (You also need level 52 Thieving.)"); + case 19: + return newstruct cs2func_script_1008_struct(45, 3245, "Possibility of stealing quadruple loot from a warrior" + "
" + " (with 55 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "warriors" + "" + ". (You also need level 55 Thieving.)"); + case 20: + return newstruct cs2func_script_1008_struct(45, 3686, "Possibility of stealing double loot from a Fremennik citizen" + "
" + " (with 55 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "Fremennik citizens" + "" + ". (You also need level 55 Thieving.)"); + case 21: + return newstruct cs2func_script_1008_struct(45, 6782, "Possibility of stealing double loot from a bearded Pollnivnian bandit" + "
" + " (with 55 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "bearded Pollnivnian bandits" + "" + ". (You also need level 55 Thieving.)"); + case 22: + return newstruct cs2func_script_1008_struct(46, 10998, "Possibility of stealing triple loot from a cave goblin" + "
" + " (with 56 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "cave goblins" + "" + ". (You also need level 56 Thieving.)"); + case 23: + return newstruct cs2func_script_1008_struct(48, 5068, "Possibility of stealing triple loot from a master farmer" + "
" + " (with 58 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "master farmers" + "" + ". (You also need level 58 Thieving.)"); + case 24: + return newstruct cs2func_script_1008_struct(50, 3249, "Possibility of stealing triple loot from a guard" + "
" + " (with 60 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "guards" + "" + ". (You also need level 60 Thieving.)"); + case 25: + return newstruct cs2func_script_1008_struct(52, 3247, "Possibility of stealing quadruple loot from a rogue" + "
" + " (with 62 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "rogues" + "" + ". (You also need level 62 Thieving.)"); + case 26: + return newstruct cs2func_script_1008_struct(53, 4625, "Possibility of stealing double loot from a desert bandit" + "
" + " (with 63 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "desert bandits" + "" + ". (You also need level 63 Thieving.)"); + case 27: + return newstruct cs2func_script_1008_struct(55, 3686, "Possibility of stealing triple loot from a Fremennik citizen" + "
" + " (with 65 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "Fremennik citizens" + "" + ". (You also need level 65 Thieving.)"); + case 28: + return newstruct cs2func_script_1008_struct(55, 6782, "Possibility of stealing triple loot from a Bearded Pollnivnian bandit" + "
" + " (with 65 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "bearded Pollnivnian bandits" + "" + ". (You also need level 65 Thieving.)"); + case 29: + return newstruct cs2func_script_1008_struct(55, 3251, "Possibility of stealing double loot from a knight" + "
" + " (with 65 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "knights" + "" + ". (You also need level 65 Thieving.)"); + case 30: + return newstruct cs2func_script_1008_struct(55, 6781, "Possibility of stealing double loot from a Pollnivnian bandit" + "
" + " (with 65 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "Pollnivnian bandits" + "" + ". (You also need level 65 Thieving.)"); + case 31: + return newstruct cs2func_script_1008_struct(56, 10998, "Possibility of stealing quadruple loot from a cave goblin" + "
" + " (with 66 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "cave goblins" + "" + ". (You also need level 66 Thieving.)"); + case 32: + return newstruct cs2func_script_1008_struct(58, 5068, "Possibility of stealing quadruple loot from a master farmer" + "
" + " (with 68 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "master farmers" + "" + ". (You also need level 68 Thieving.)"); + case 33: + return newstruct cs2func_script_1008_struct(60, 3249, "Possibility of stealing quadruple loot from a guard" + "
" + " (with 70 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "guards" + "" + ". (You also need level 70 Thieving.)"); + case 34: + return newstruct cs2func_script_1008_struct(63, 4625, "Possibility of stealing triple loot from a desert bandit" + "
" + " (with 73 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "desert bandits" + "" + ". (You also need level 73 Thieving.)"); + case 35: + return newstruct cs2func_script_1008_struct(65, 3686, "Possibility of stealing quadruple loot from a Fremennik citizen" + "
" + " (with 75 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "Fremennik citizens" + "" + ". (You also need level 75 Thieving.)"); + case 36: + return newstruct cs2func_script_1008_struct(65, 6782, "Possibility of stealing quadruple loot from a bearded Pollnivnian bandit" + "
" + " (with 75 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "bearded Pollnivnian bandits" + "" + ". (You also need level 75 Thieving.)"); + case 37: + return newstruct cs2func_script_1008_struct(65, 3251, "Possibility of stealing triple loot from a knight" + "
" + " (with 75 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "knights" + "" + ". (You also need level 75 Thieving.)"); + case 38: + return newstruct cs2func_script_1008_struct(65, 6781, "Possibility of stealing triple loot from a Pollnivnian bandit" + "
" + " (with 75 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "Pollnivnian bandits" + "" + ". (You also need level 75 Thieving.)"); + case 39: + return newstruct cs2func_script_1008_struct(65, 3253, "Possibility of stealing double loot from a watchman" + "
" + " (with 75 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "watchmen" + "" + ". (You also need level 75 Thieving.)"); + case 40: + return newstruct cs2func_script_1008_struct(65, 6780, "Possibility of stealing double loot from a Menaphite thug" + "
" + " (with 75 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "Menaphite thugs" + "" + ". (You also need level 75 Thieving.)"); + case 41: + return newstruct cs2func_script_1008_struct(70, 3255, "Possibility of stealing double loot from a paladin" + "
" + " (with 80 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "paladins" + "" + ". (You also need level 80 Thieving.)"); + case 42: + return newstruct cs2func_script_1008_struct(73, 4625, "Possibility of stealing quadruple loot from a desert bandit" + "
" + " (with 83 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "desert bandits" + "" + ". (You also need level 83 Thieving.)"); + case 43: + return newstruct cs2func_script_1008_struct(75, 3251, "Possibility of stealing quadruple loot from a knight" + "
" + " (with 85 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "knights" + "" + ". (You also need level 85 Thieving.)"); + case 44: + return newstruct cs2func_script_1008_struct(75, 6781, "Possibility of stealing quadruple loot from a Pollnivnian bandit" + "
" + " (with 85 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "Pollnivnian bandits" + "" + ". (You also need level 85 Thieving.)"); + case 45: + return newstruct cs2func_script_1008_struct(75, 3253, "Possibility of stealing triple loot from a watchman" + "
" + " (with 85 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "watchmen" + "" + ". (You also need level 85 Thieving.)"); + case 46: + return newstruct cs2func_script_1008_struct(75, 6780, "Possibility of stealing triple loot from a Menaphite thug" + "
" + " (with 85 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "Menaphite thugs" + "" + ". (You also need level 85 Thieving.)"); + case 47: + return newstruct cs2func_script_1008_struct(75, 3257, "Possibility of stealing double loot from a gnome" + "
" + " (with 85 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "gnomes" + "" + ". (You also need level 85 Thieving.)"); + case 48: + return newstruct cs2func_script_1008_struct(80, 3255, "Possibility of stealing triple loot from a paladin" + "
" + " (with 90 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "paladins" + "" + ". (You also need level 90 Thieving.)"); + case 49: + return newstruct cs2func_script_1008_struct(80, 3259, "Possibility of stealing double loot from a hero" + "
" + " (with 90 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "heroes" + "" + ". (You also need level 90 Thieving.)"); + case 50: + return newstruct cs2func_script_1008_struct(85, 3253, "Possibility of stealing quadruple loot from a watchman" + "
" + " (with 95 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "watchmen" + "" + ". (You also need level 95 Thieving.)"); + case 51: + return newstruct cs2func_script_1008_struct(85, 6780, "Possibility of stealing quadruple loot from a Menaphite thug" + "
" + " (with 95 Thieving)", "You now have the Agility level required to potentially steal quadruple loot from " + "" + "Menaphite thugs" + "" + ". (You also need level 95 Thieving.)"); + case 52: + return newstruct cs2func_script_1008_struct(85, 3257, "Possibility of stealing triple loot from a gnome" + "
" + " (with 95 Thieving)", "You now have the Agility level required to potentially steal triple loot from " + "" + "gnomes" + "" + ". (You also need level 95 Thieving.)"); + case 53: + return newstruct cs2func_script_1008_struct(85, 6105, "Possibility of stealing double loot from an elf" + "
" + " (with 95 Thieving)", "You now have the Agility level required to potentially steal double loot from " + "" + "elves" + "" + ". (You also need level 95 Thieving.)"); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_1008_struct(75, 9970, "Catch ruby harvest barehanded (woodland)" + "
" + " (with 80 Hunter)", "You now have the Agility level to catch " + "" + "ruby harvest butterflies" + "" + " barehanded. This feat will give you Hunter and Agility experience upon a successful catch. (You also need level 80 Hunter.)"); + case 1: + return newstruct cs2func_script_1008_struct(80, 9971, "Catch sapphire glacialis barehanded (polar)" + "
" + " (with 85 Hunter)", "You now have the Agility level to catch " + "" + "sapphire glacialis butterflies" + "" + " barehanded. This feat will give you Hunter and Agility experience upon a successful catch. (You also need level 85 Hunter.)"); + case 2: + return newstruct cs2func_script_1008_struct(85, 9972, "Catch snowy knights barehanded (polar)" + "
" + " (with 90 Hunter)", "You now have the Agility level to catch " + "" + "snowy knight butterflies" + "" + " barehanded. This feat will give you Hunter and Agility experience upon a successful catch. (You also need level 90 Hunter.)"); + case 3: + return newstruct cs2func_script_1008_struct(90, 9973, "Catch black warlocks barehanded (jungle)" + "
" + " (with 95 Hunter)", "You now have the Agility level to catch " + "" + "black warlock butterflies" + "" + " barehanded. This feat will give you Hunter and Agility experience upon a succesful catch. (You also need level 95 Hunter.)"); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_1008_struct(60, 20704, "Members: access to the Livid Farm (with 70 Magic, 60 Crafting, 60 Farming, 50 Construction and Lunar Diplomacy)", "Members can access the " + "" + "Livid Farm" + "" + " (with 70 Magic, 60 Crafting, 60 Farming, 50 Construction and Lunar Diplomacy)."); + case 1: + return newstruct cs2func_script_1008_struct(91, 18778, "Starved ancient effigies", "You can now investigate " + "" + "starved ancient effigies" + "" + " using your knowledge of Agility."); + case 2: + return newstruct cs2func_script_1008_struct(93, 18779, "Nourished ancient effigies", "You can now investigate " + "" + "nourished ancient effigies" + "" + " using your knowledge of Agility."); + case 3: + return newstruct cs2func_script_1008_struct(95, 18780, "Sated ancient effigies", "You can now investigate " + "" + "sated ancient effigies" + "" + " using your knowledge of Agility."); + case 4: + return newstruct cs2func_script_1008_struct(97, 18781, "Gorged ancient effigies", "You can now investigate " + "" + "gorged ancient effigies" + "" + " using your knowledge of Agility."); + } + break; + case 8: + switch (arg1) { + case 0: + return newstruct cs2func_script_1008_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Agility level increases, you will be able to attempt higher-level Agility tasks within Daemonheim. You will also be more likely to succeed when attempting Agility tasks within Daemonheim.", ""); + } + break; + case 9: + if (((boolean)arg1)) { + return newstruct cs2func_script_1008_struct(50, 4211, "Crystal equipment", "You now have the Agility level required to use " + "" + "crystal equipment" + "" + ". (You may need further requirements.)"); + } + if (((boolean)arg1)) { + return newstruct cs2func_script_1008_struct(99, 9771, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Agility" + "" + ". Why not visit " + "" + "Cap'n Izzy No-beard" + "" + " at the " + "" + "Brimhaven Agility Arena" + "" + "? He has something special that is only available to true masters of the " + "" + "Agility" + "" + " skill!"); + } + } + return newstruct cs2func_script_1008_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1009.cs2 b/dumps/scripts/1009.cs2 new file mode 100644 index 000000000..f7b55eb7d --- /dev/null +++ b/dumps/scripts/1009.cs2 @@ -0,0 +1,27 @@ +cs2func_script_1009_struct(1,1,0) script_1009(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1009_struct(0, "Bows"); + case 1: + return newstruct cs2func_script_1009_struct(1, "Thrown"); + case 2: + return newstruct cs2func_script_1009_struct(0, "Armour"); + case 3: + return newstruct cs2func_script_1009_struct(0, "Crossbows"); + case 4: + return newstruct cs2func_script_1009_struct(1, "Shortcuts"); + case 5: + return newstruct cs2func_script_1009_struct(1, "Salamanders"); + case 6: + return newstruct cs2func_script_1009_struct(1, "Areas"); + case 7: + return newstruct cs2func_script_1009_struct(0, "Other"); + case 8: + return newstruct cs2func_script_1009_struct(1, "Minigames"); + case 9: + return newstruct cs2func_script_1009_struct(0, "Dungeoneering"); + case 10: + return newstruct cs2func_script_1009_struct(0, "Milestones"); + } + return newstruct cs2func_script_1009_struct(-1, ""); +} diff --git a/dumps/scripts/101.cs2 b/dumps/scripts/101.cs2 new file mode 100644 index 000000000..d623c1ef0 --- /dev/null +++ b/dumps/scripts/101.cs2 @@ -0,0 +1,4 @@ +void script_101() { + script_1548(0); + return; +} diff --git a/dumps/scripts/1010.cs2 b/dumps/scripts/1010.cs2 new file mode 100644 index 000000000..d31b0a9b7 --- /dev/null +++ b/dumps/scripts/1010.cs2 @@ -0,0 +1,635 @@ +cs2func_script_1010_struct(2,2,0) script_1010(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1010_struct(1, 841, "Standard bow" + "
" + " Ammo: Arrows up to iron", "You can now use " + "" + "standard bows" + "" + "."); + case 1: + return newstruct cs2func_script_1010_struct(5, 843, "Oak bow" + "
" + " Ammo: Arrows up to steel", "You can now use " + "" + "oak bows" + "" + "."); + case 2: + return newstruct cs2func_script_1010_struct(20, 849, "Willow bow" + "
" + " Ammo: Arrows up to mithril", "You can now use " + "" + "willow bows" + "" + "."); + case 3: + return newstruct cs2func_script_1010_struct(30, 853, "Maple bow" + "
" + " Ammo: Arrows up to adamant", "You can now use " + "" + "maple bows" + "" + "."); + case 4: + return newstruct cs2func_script_1010_struct(30, 2883, "Members: Ogre bow (after Big Chompy Bird Hunting)" + "
" + " Ammo: Ogre arrows", "Members now have the Ranged level to use " + "" + "ogre bows" + "" + " (after Big Chompy Bird Hunting)."); + case 5: + return newstruct cs2func_script_1010_struct(30, 4827, "Members: Ogre composite bow (after Zogre Flesh Eaters)" + "
" + " Ammo: 'Brutal' arrows up to rune", "Members now have the Ranged level to use " + "" + "ogre composite bows" + "" + " (after Zogre Flesh Eaters)."); + case 6: + return newstruct cs2func_script_1010_struct(40, 857, "Members: Yew bow" + "
" + " Ammo: Arrows up to rune", "Members can now use " + "" + "yew bows" + "" + "."); + case 7: + return newstruct cs2func_script_1010_struct(40, 14121, "Members: Sacred clay bow" + "
" + " Ammo: Arrows up to rune", "Members can now wield " + "" + "sacred clay bows" + "" + "."); + case 8: + return newstruct cs2func_script_1010_struct(45, 18331, "Maple longbow (focused)" + "
" + " Ammo: Arrows up to rune" + "
" + " (with 45 Dungeoneering)", "You can now use " + "" + "maple longbows (focused)" + "" + ". (You also need level 45 Dungeoneering.)"); + case 9: + return newstruct cs2func_script_1010_struct(45, 18373, "Gravite shortbow" + "
" + " Ammo: Arrows up to rune" + "
" + " (with 45 Dungeoneering)", "You can now wield " + "" + "gravite shortbows" + "" + ". (You also need level 45 Dungeoneering.)"); + case 10: + return newstruct cs2func_script_1010_struct(50, 861, "Members: Magic bow" + "
" + " Ammo: Arrows up to rune", "Members can now use " + "" + "magic bows" + "" + "."); + case 11: + return newstruct cs2func_script_1010_struct(50, 6724, "Members: Seercull" + "
" + " Ammo: Arrows up to rune", "Members can now use the " + "" + "Seercull" + "" + "."); + case 12: + return newstruct cs2func_script_1010_struct(55, 18332, "Members: Magic longbow (focused)" + "
" + " Ammo: Arrows up to rune" + "
" + " (with 45 Dungeoneering)", "Members can now use " + "" + "magic longbows (focused)" + "" + ". (They also need level 45 Dungeoneering.)"); + case 13: + return newstruct cs2func_script_1010_struct(55, 19143, "Members: Saradomin bow" + "
" + " Ammo: Arrows up to rune", "Members can now wield " + "" + "Saradomin bows" + "" + "."); + case 14: + return newstruct cs2func_script_1010_struct(55, 19146, "Members: Guthix bow" + "
" + " Ammo: Arrows up to rune", "Members can now wield " + "" + "Guthix bows" + "" + "."); + case 15: + return newstruct cs2func_script_1010_struct(55, 19149, "Members: Zamorak bow" + "
" + " Ammo: Arrows up to rune", "Members can now wield " + "" + "Zamorak bows" + "" + "."); + case 16: + return newstruct cs2func_script_1010_struct(60, 11235, "Members: Dark bow" + "
" + " Ammo: Arrows up to dragon", "Members can now use " + "" + "dark bows" + "" + "."); + case 17: + return newstruct cs2func_script_1010_struct(70, 4212, "Members: Crystal bow (after Roving Elves and with 50 Agility)" + "
" + " Ammo: None", "Members now have the Ranged level to use " + "" + "crystal bows" + "" + " (after Roving Elves, with level 50 Agility)."); + case 18: + return newstruct cs2func_script_1010_struct(80, 20171, "Members: Zaryte bow" + "
" + " Ammo: None", "Members now have the Ranged level to use " + "" + "Zaryte bows" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1010_struct(1, 806, "Members: Bronze dart", "Members can now throw " + "" + "bronze darts" + "" + "."); + case 1: + return newstruct cs2func_script_1010_struct(1, 825, "Members: Bronze javelin", "Members can now throw " + "" + "bronze javelins" + "" + "."); + case 2: + return newstruct cs2func_script_1010_struct(1, 800, "Members: Bronze throwing axe", "Members can now throw " + "" + "bronze throwing axes" + "" + "."); + case 3: + return newstruct cs2func_script_1010_struct(1, 864, "Members: Bronze throwing knife", "Members can now throw " + "" + "bronze throwing knives" + "" + "."); + case 4: + return newstruct cs2func_script_1010_struct(1, 807, "Members: Iron dart", "Members can now throw " + "" + "iron darts" + "" + "."); + case 5: + return newstruct cs2func_script_1010_struct(1, 826, "Members: Iron javelin", "Members can now throw " + "" + "iron javelins" + "" + "."); + case 6: + return newstruct cs2func_script_1010_struct(1, 801, "Members: Iron throwing axe", "Members can now throw " + "" + "iron throwing axes" + "" + "."); + case 7: + return newstruct cs2func_script_1010_struct(1, 863, "Members: Iron throwing knife", "Members can now throw " + "" + "iron throwing knives" + "" + "."); + case 8: + return newstruct cs2func_script_1010_struct(5, 808, "Members: Steel dart", "Members can now throw " + "" + "steel darts" + "" + "."); + case 9: + return newstruct cs2func_script_1010_struct(5, 827, "Members: Steel javelin", "Members can now throw " + "" + "steel javelins" + "" + "."); + case 10: + return newstruct cs2func_script_1010_struct(5, 802, "Members: Steel throwing axe", "Members can now throw " + "" + "steel throwing axes" + "" + "."); + case 11: + return newstruct cs2func_script_1010_struct(5, 865, "Members: Steel throwing knife", "Members can now throw " + "" + "steel throwing knives" + "" + "."); + case 12: + return newstruct cs2func_script_1010_struct(10, 3093, "Members: Black dart", "Members can now throw " + "" + "black darts" + "" + "."); + case 13: + return newstruct cs2func_script_1010_struct(10, 869, "Members: Black throwing knife", "Members can now throw " + "" + "black throwing knives" + "" + "."); + case 14: + return newstruct cs2func_script_1010_struct(20, 809, "Members: Mithril dart", "Members can now throw " + "" + "mithril darts" + "" + "."); + case 15: + return newstruct cs2func_script_1010_struct(20, 828, "Members: Mithril javelin", "Members can now throw " + "" + "mithril javelins" + "" + "."); + case 16: + return newstruct cs2func_script_1010_struct(20, 803, "Members: Mithril throwing axe", "Members can now throw " + "" + "mithril throwing axes" + "" + "."); + case 17: + return newstruct cs2func_script_1010_struct(20, 866, "Members: Mithril throwing knife", "Members can now throw " + "" + "mithril throwing knives" + "" + "."); + case 18: + return newstruct cs2func_script_1010_struct(20, 13953, "Members: Corrupt Morrigan's javelin", "Members can now throw " + "" + "corrupt Morrigan's javelin" + "" + "."); + case 19: + return newstruct cs2func_script_1010_struct(20, 13957, "Members: Corrupt Morrigan's throwing axe", "Members can now throw " + "" + "corrupt Morrigan's throwing axe" + "" + "."); + case 20: + return newstruct cs2func_script_1010_struct(30, 810, "Members: Adamant dart", "Members can now throw " + "" + "adamant darts."); + case 21: + return newstruct cs2func_script_1010_struct(30, 829, "Members: Adamant javelin", "Members can now throw " + "" + "adamant javelins" + "" + "."); + case 22: + return newstruct cs2func_script_1010_struct(30, 804, "Members: Adamant throwing axe", "Members can now throw " + "" + "adamant throwing axes" + "" + "."); + case 23: + return newstruct cs2func_script_1010_struct(30, 867, "Members: Adamant throwing knife", "Members can now throw " + "" + "adamant throwing knives" + "" + "."); + case 24: + return newstruct cs2func_script_1010_struct(40, 811, "Members: Rune dart", "Members can now throw " + "" + "rune darts" + "" + "."); + case 25: + return newstruct cs2func_script_1010_struct(40, 830, "Members: Rune javelin", "Members can now throw " + "" + "rune javelins" + "" + "."); + case 26: + return newstruct cs2func_script_1010_struct(40, 805, "Members: Rune throwing axe", "Members can now throw " + "" + "rune throwing axes" + "" + "."); + case 27: + return newstruct cs2func_script_1010_struct(40, 868, "Members: Rune throwing knife", "Members can now throw " + "" + "rune throwing knives" + "" + "."); + case 28: + return newstruct cs2func_script_1010_struct(45, 10033, "Members: Chinchompa", "Members can now throw " + "" + "chinchompas" + "" + "."); + case 29: + return newstruct cs2func_script_1010_struct(55, 10034, "Members: Red chinchompa", "Members can now throw " + "" + "red chinchompas" + "" + "."); + case 30: + return newstruct cs2func_script_1010_struct(60, 11230, "Members: Dragon dart", "Members can now throw " + "" + "dragon darts" + "" + "."); + case 31: + return newstruct cs2func_script_1010_struct(60, 6522, "Members: Toktz-Xil-Ul", "Members can now throw " + "" + "Toktz-Xil-Ul" + "" + "."); + case 32: + return newstruct cs2func_script_1010_struct(70, 21581, "Members: Blisterwood stake (after The Branches of Darkmeyer)", "Members can now throw " + "" + "blisterwood stakes" + "" + " (after The Branches of Darkmeyer)."); + case 33: + return newstruct cs2func_script_1010_struct(72, 21364, "Members: Sagaie", "Members can now throw " + "" + "sagaies" + "" + "."); + case 34: + return newstruct cs2func_script_1010_struct(76, 21365, "Members: Bolas", "Members can now throw " + "" + "bolas" + "" + "."); + case 35: + return newstruct cs2func_script_1010_struct(78, 13879, "Members: Morrigan's javelin", "Members can now throw " + "" + "Morrigan's javelin" + "" + "."); + case 36: + return newstruct cs2func_script_1010_struct(78, 13883, "Members: Morrigan's throwing axe", "Members can now throw " + "" + "Morrigan's throwing axe" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1010_struct(1, 1129, "Plain leather items", "You can now wear " + "" + "plain leather" + "" + " items."); + case 1: + return newstruct cs2func_script_1010_struct(1, 1131, "Hard leather body" + "
" + " (with 10 Defence)", "You now have the Ranged level required to wear " + "" + "hard leather" + "" + " bodies. (You also need level 10 Defence.)"); + case 2: + return newstruct cs2func_script_1010_struct(1, 6143, "Members: Spined boots", "Members can now wear " + "" + "spined boots" + "" + "."); + case 3: + return newstruct cs2func_script_1010_struct(1, 6149, "Members: Spined gloves", "Members can now wear " + "" + "spined gloves" + "" + "."); + case 4: + return newstruct cs2func_script_1010_struct(1, 3749, "Members: Archer helm (after Fremennik Trials and with 45 Defence)", "Members now have the Ranged level required to wear " + "" + "archer helms" + "" + " (after Fremennik Trials and with level 45 Defence)."); + case 5: + return newstruct cs2func_script_1010_struct(20, 1133, "Studded leather body" + "
" + " (with 20 Defence)", "You now have the Ranged level required to wear " + "" + "studded leather bodies" + "" + ". (You also need level 20 Defence.)"); + case 6: + return newstruct cs2func_script_1010_struct(20, 1097, "Studded leather chaps", "You can now wear " + "" + "studded leather chaps" + "" + "."); + case 7: + return newstruct cs2func_script_1010_struct(20, 1169, "Coif", "You can now wear " + "" + "coifs" + "" + "."); + case 8: + return newstruct cs2func_script_1010_struct(20, 13950, "Members: Corrupt Morrigan's coif" + "
" + " (with 20 Defence)", "Members now have the Ranged level required to wield " + "" + "corrupt Morrigan's coif" + "" + ". (They also need level 20 Defence)"); + case 9: + return newstruct cs2func_script_1010_struct(20, 13944, "Members: Corrupt Morrigan's leather body" + "
" + " (with 20 Defence)", "Members now have the Ranged level required to wield " + "" + "corrupt Morrigan's leather body" + "" + ". (They also need level 20 Defence)"); + case 10: + return newstruct cs2func_script_1010_struct(20, 13947, "Members: Corrupt Morrigan's leather chaps" + "
" + " (with 20 Defence)", "Members now have the Ranged level required to wield " + "" + "corrupt Morrigan's leather chaps" + "" + ". (They also need level 20 Defence)"); + case 11: + return newstruct cs2func_script_1010_struct(20, 15490, "Members: Focus sight" + "
" + " (with 10 Defence)", "Members can now wear " + "" + "focus sights" + "" + "."); + case 12: + return newstruct cs2func_script_1010_struct(20, 15492, "Members: Full Slayer helmet" + "
" + " (after Smoking Kills with 10 Defence, 20 Magic and Strength)", "Members can now wear " + "" + "full slayer helmets" + "" + " (after Smoking Kills with 10 Defence, 20 Magic and Strength)."); + case 13: + return newstruct cs2func_script_1010_struct(25, 10954, "Members: Frog-leather body" + "
" + " (with 25 Defence)", "Members now have the Ranged level required to wear " + "" + "frog-leather bodies" + "" + ". (They also need level 25 Defence.)"); + case 14: + return newstruct cs2func_script_1010_struct(25, 10956, "Members: Frog-leather chaps" + "
" + " (with 25 Defence)", "Members now have the Ranged level required to wear " + "" + "frog-leather chaps" + "" + ". (They also need level 25 Defence.)"); + case 15: + return newstruct cs2func_script_1010_struct(25, 10958, "Members: Frog-leather boots" + "
" + " (with 25 Defence)", "Members now have the Ranged level required to wear " + "" + "frog-leather boots" + "" + ". (They also need level 25 Defence.)."); + case 16: + return newstruct cs2func_script_1010_struct(30, 6322, "Members: Snakeskin body" + "
" + " (with 30 Defence)", "Members now have the Ranged level required to wear " + "" + "snakeskin bodies" + "" + ". (They also need level 30 Defence.)"); + case 17: + return newstruct cs2func_script_1010_struct(30, 6324, "Members: Snakeskin chaps" + "
" + " (with 30 Defence)", "Members now have the Ranged level required to wear " + "" + "snakeskin chaps" + "" + ". (They also need level 30 Defence.)"); + case 18: + return newstruct cs2func_script_1010_struct(30, 6330, "Members: Snakeskin vambraces" + "
" + " (with 30 Defence)", "Members now have the Ranged level required to wear " + "" + "snakeskin vambraces" + "" + ". (They also need level 30 Defence.)"); + case 19: + return newstruct cs2func_script_1010_struct(30, 6326, "Members: Snakeskin bandana" + "
" + " (with 30 Defence)", "Members now have the Ranged level required to wear " + "" + "snakeskin bandanas" + "" + ". (They also need level 30 Defence.)"); + case 20: + return newstruct cs2func_script_1010_struct(30, 6328, "Members: Snakeskin boots" + "
" + " (with 30 Defence)", "Members now have the Ranged level required to wear " + "" + "snakeskin boots" + "" + ". (They also need level 30 Defence.)"); + case 21: + return newstruct cs2func_script_1010_struct(40, 2577, "Members: Ranger boots", "Members can now wear " + "" + "ranger boots" + "" + "."); + case 22: + return newstruct cs2func_script_1010_struct(40, 2581, "Members: Robin Hood hat", "Members can now wear " + "" + "Robin Hood hats" + "" + "."); + case 23: + return newstruct cs2func_script_1010_struct(40, 1065, "Green dragonhide vambraces", "You can now wear " + "" + "green dragonhide vambraces" + "" + "."); + case 24: + return newstruct cs2func_script_1010_struct(40, 1099, "Green dragonhide chaps", "You can now wear " + "" + "green dragonhide chaps" + "" + "."); + case 25: + return newstruct cs2func_script_1010_struct(40, 1135, "Green dragonhide body" + "
" + " (after Dragon Slayer and with 40 Defence)", "You now have the Ranged level required to wear " + "" + "green dragonhide bodies" + "" + ". (You also need to have completed Dragon Slayer and have level 40 Defence.)"); + case 26: + return newstruct cs2func_script_1010_struct(40, 12936, "Green dragonhide coif" + "
" + " (with 40 Defence)", "You now have the Ranged level required to wear " + "" + "green dragonhide coifs" + "" + ". (You also need level 40 Defence.)"); + case 27: + return newstruct cs2func_script_1010_struct(40, 6133, "Members: Spined body" + "
" + " (after Fremennik Trials and with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "spined bodies" + "" + " (after Fremennik Trials, with level 40 Defence)."); + case 28: + return newstruct cs2func_script_1010_struct(40, 6135, "Members: Spined chaps" + "
" + " (after Fremennik Trials and with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "spined chaps" + "" + " (after Fremennik Trials, with level 40 Defence)."); + case 29: + return newstruct cs2func_script_1010_struct(40, 6131, "Members: Spined helm" + "
" + " (after Fremennik Trials and with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "spined helms" + "" + " (after Fremennik Trials, with level 40 Defence)."); + case 30: + return newstruct cs2func_script_1010_struct(40, 14120, "Members: Sacred clay coif" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "sacred clay coifs" + "" + ". (They also need level 40 Defence.)"); + case 31: + return newstruct cs2func_script_1010_struct(40, 14118, "Members: Sacred clay body" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "sacred clay bodies" + "" + ". (They also need level 40 Defence.)"); + case 32: + return newstruct cs2func_script_1010_struct(40, 14119, "Members: Sacred clay chaps" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "sacred clay chaps" + "" + ". (They also need level 40 Defence.)"); + case 33: + return newstruct cs2func_script_1010_struct(42, 11665, "Members: Void melee helm", "Members now have the Ranged level required to wear " + "" + "Void melee helms" + "" + "."); + case 34: + return newstruct cs2func_script_1010_struct(42, 11664, "Members: Void ranger helm", "Members now have the Ranged level required to wear " + "" + "Void ranger helms" + "" + "."); + case 35: + return newstruct cs2func_script_1010_struct(42, 11663, "Members: Void mage helm", "Members now have the Ranged level required to wear " + "" + "Void mage helms" + "" + "."); + case 36: + return newstruct cs2func_script_1010_struct(42, 8839, "Members: Void knight top", "Members now have the Ranged level required to wear " + "" + "Void knight tops" + "" + "."); + case 37: + return newstruct cs2func_script_1010_struct(42, 8840, "Members: Void knight robe", "Members now have the Ranged level required to wear " + "" + "Void knight robes" + "" + "."); + case 38: + return newstruct cs2func_script_1010_struct(42, 8842, "Members: Void knight gloves", "Members now have the Ranged level required to wear " + "" + "Void knight gloves" + "" + "."); + case 39: + return newstruct cs2func_script_1010_struct(42, 19712, "Members: Void knight deflector", "Members now have the Ranged level required to wear " + "" + "Void knight deflectors" + "" + "."); + case 40: + return newstruct cs2func_script_1010_struct(42, 7620, "Void knight equipment requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer.", "" + "Void knight equipment" + "" + " requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer."); + case 41: + return newstruct cs2func_script_1010_struct(50, 2487, "Members: Blue dragonhide vambraces", "Members can now wear " + "" + "blue dragonhide vambraces" + "" + "."); + case 42: + return newstruct cs2func_script_1010_struct(50, 2493, "Members: Blue dragonhide chaps", "Members can now wear " + "" + "blue dragonhide chaps" + "" + "."); + case 43: + return newstruct cs2func_script_1010_struct(50, 2499, "Members: Blue dragonhide body" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "blue dragonhide bodies" + "" + ". (They also need level 40 Defence.)"); + case 44: + return newstruct cs2func_script_1010_struct(50, 12943, "Members: Blue dragonhide coif" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "blue dragonhide coifs" + "" + ". (They also need level 40 Defence.)"); + case 45: + return newstruct cs2func_script_1010_struct(60, 2489, "Members: Red dragonhide vambraces", "Members can now wear " + "" + "red dragonhide vambraces" + "" + "."); + case 46: + return newstruct cs2func_script_1010_struct(60, 2495, "Members: Red dragonhide chaps", "Members can now wear " + "" + "red dragonhide chaps" + "" + "."); + case 47: + return newstruct cs2func_script_1010_struct(60, 2501, "Members: Red dragonhide body" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "red dragonhide bodies" + "" + ". (They also need level 40 Defence.)"); + case 48: + return newstruct cs2func_script_1010_struct(60, 12950, "Members: Red dragonhide coif" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "red dragonhide coifs" + "" + ". (They also need level 40 Defence.)"); + case 49: + return newstruct cs2func_script_1010_struct(65, 10334, "Members: Third-Age range coif" + "
" + " (with 45 Defence)", "Members now have the Ranged level required to wear " + "" + "Third-Age range coifs" + "" + ". (They also need level 45 Defence.)"); + case 50: + return newstruct cs2func_script_1010_struct(65, 10330, "Members: Third-Age range top" + "
" + " (with 45 Defence)", "Members now have the Ranged level required to wear " + "" + "Third-Age range tops" + "" + ". (They also need level 45 Defence.)"); + case 51: + return newstruct cs2func_script_1010_struct(65, 10332, "Members: Third-Age range legs" + "
" + " (with 45 Defence)", "Members now have the Ranged level required to wear " + "" + "Third-Age range legs" + "" + ". (They also need level 45 Defence.)"); + case 52: + return newstruct cs2func_script_1010_struct(65, 10336, "Members: Third-Age range vambraces" + "
" + " (with 45 Defence)", "Members now have the Ranged level required to wear " + "" + "Third-Age range vambraces" + "" + ". (They also need level 45 Defence.)"); + case 53: + return newstruct cs2func_script_1010_struct(70, 2491, "Members: Black dragonhide vambraces", "Members can now wear " + "" + "black dragonhide vambraces" + "" + "."); + case 54: + return newstruct cs2func_script_1010_struct(70, 2497, "Members: Black dragonhide chaps", "Members can now wear " + "" + "black dragonhide chaps" + "" + "."); + case 55: + return newstruct cs2func_script_1010_struct(70, 2503, "Members: Black dragonhide body" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "black dragonhide bodies" + "" + ". (They also need level 40 Defence.)"); + case 56: + return newstruct cs2func_script_1010_struct(70, 12957, "Members: Black dragonhide coif" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "black dragonhide coifs" + "" + ". (They also need level 40 Defence.)"); + case 57: + return newstruct cs2func_script_1010_struct(70, 10374, "Members: Blessed dragonhide coif" + "
" + " (with 40 Defence)", "Members now have the Ranged level required to wear " + "" + "blessed dragonhide coifs" + "" + ". (They also need level 40 Defence.)"); + case 58: + return newstruct cs2func_script_1010_struct(70, 4732, "Members: Karil's coif" + "
" + " (with 70 Defence)", "Members now have the Ranged level required to wear " + "" + "Karil's Coif" + "" + ". (They also need level 70 Defence.)"); + case 59: + return newstruct cs2func_script_1010_struct(70, 4736, "Members: Karil's leather top" + "
" + " (with 70 Defence)", "Members now have the Ranged level required to wear " + "" + "Karil's leather top" + "" + ". (They also need level 70 Defence.)"); + case 60: + return newstruct cs2func_script_1010_struct(70, 4738, "Members: Karil's leather skirt" + "
" + " (with 70 Defence)", "Members now have the Ranged level required to wear " + "" + "Karil's leather skirt" + "" + ". (They also need level 70 Defence.)"); + case 61: + return newstruct cs2func_script_1010_struct(70, 11718, "Members: Armadyl helmet" + "
" + " (with 70 Defence)", "Members now have the Ranged level required to wear Armadyl helmets. (They also need level 70 Defence.)"); + case 62: + return newstruct cs2func_script_1010_struct(70, 11720, "Members: Armadyl chestplate" + "
" + " (with 70 Defence)", "Members now have the Ranged level required to wear Armadyl chestplates. (They also need level 70 Defence.)"); + case 63: + return newstruct cs2func_script_1010_struct(70, 11722, "Members: Armadyl chainskirt" + "
" + " (with 70 Defence)", "Members now have the Ranged level required to wear Armadyl chainskirts. (They also need level 70 Defence.)"); + case 64: + return newstruct cs2func_script_1010_struct(73, 18347, "Members: Mercenary's gloves" + "
" + " (with 73 Dungeoneering)", "Members can now wear " + "" + "mercenary's gloves" + "" + ". (They also need level 73 Dungeoneering.)"); + case 65: + return newstruct cs2func_script_1010_struct(75, 21790, "Members: Glaiven boots" + "
" + " (with 75 Defence)", "Members now have the Ranged level required to wear " + "" + "glaiven boots" + "" + " (with 75 Defence)."); + case 66: + return newstruct cs2func_script_1010_struct(78, 13876, "Members: Morrigan's coif" + "
" + " (with 78 Defence)", "Members now have the Ranged level required to wield " + "" + "Morrigan's coif" + "" + ". (They also need level 78 Defence)"); + case 67: + return newstruct cs2func_script_1010_struct(78, 13870, "Members: Morrigan's leather body" + "
" + " (with 78 Defence)", "Members now have the Ranged level required to wield " + "" + "Morrigan's leather body" + "" + ". (They also need level 78 Defence)"); + case 68: + return newstruct cs2func_script_1010_struct(78, 13873, "Members: Morrigan's leather chaps" + "
" + " (with 78 Defence)", "Members now have the Ranged level required to wield " + "" + "Morrigan's leather chaps" + "" + ". (They also need level 78 Defence)"); + case 69: + return newstruct cs2func_script_1010_struct(80, 20147, "Members: Pernix cowl" + "
" + " (with 80 Defence and Constitution)", "Members can now wear " + "" + "pernix cowls" + "" + ". (They also need level 80 Defence and Constitution.)"); + case 70: + return newstruct cs2func_script_1010_struct(80, 20151, "Members: Pernix body" + "
" + " (with 80 Defence and Constitution)", "Members can now wear " + "" + "pernix bodies" + "" + ". (They also need level 80 Defence and Constitution.)"); + case 71: + return newstruct cs2func_script_1010_struct(80, 20155, "Members: Pernix chaps" + "
" + " (with 80 Defence and Constitution)", "Members can now wear " + "" + "pernix chaps" + "" + ". (They also need level 80 Defence and Constitution.)"); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1010_struct(1, 837, "Crossbow" + "
" + " Ammo: Bronze crossbow bolts", "You can now " + "" + "fire crossbows" + "" + "."); + case 1: + return newstruct cs2func_script_1010_struct(1, 767, "Phoenix crossbow" + "
" + " Ammo: Bronze crossbow bolts", "You can now fire " + "" + "phoenix crossbows" + "" + "."); + case 2: + return newstruct cs2func_script_1010_struct(1, 9174, "Members: Bronze crossbow" + "
" + " Ammo: Bronze crossbow bolts", "Members can now fire " + "" + "bronze crossbows" + "" + "."); + case 3: + return newstruct cs2func_script_1010_struct(16, 9176, "Members: Blurite crossbow" + "
" + " Ammo: Bolts up to blurite", "Members can now fire " + "" + "blurite crossbows" + "" + "."); + case 4: + return newstruct cs2func_script_1010_struct(26, 9177, "Members: Iron crossbow" + "
" + " Ammo: Bolts up to iron", "Members can now fire " + "" + "iron crossbows" + "" + "."); + case 5: + return newstruct cs2func_script_1010_struct(28, 8880, "Members: Dorgeshuun crossbow" + "
" + " Ammo: Bolts up to iron", "Members can now fire " + "" + "Dorgeshuun crossbows" + "" + "."); + case 6: + return newstruct cs2func_script_1010_struct(31, 9179, "Members: Steel crossbow" + "
" + " Ammo: Bolts up to steel", "Members can now fire " + "" + "steel crossbows" + "" + "."); + case 7: + return newstruct cs2func_script_1010_struct(33, 13081, "Members: Black crossbow" + "
" + " Ammo: Bolts up to black", "Members can now fire " + "" + "black crossbows" + "" + "."); + case 8: + return newstruct cs2func_script_1010_struct(36, 9181, "Members: Mithril crossbow" + "
" + " Ammo: Bolts up to mithril", "Members can now fire " + "" + "mithril crossbows" + "" + "."); + case 9: + return newstruct cs2func_script_1010_struct(46, 9183, "Members: Adamant crossbow" + "
" + " Ammo: Bolts up to adamant", "Members can now fire " + "" + "adamant crossbows" + "" + "."); + case 10: + return newstruct cs2func_script_1010_struct(48, 14684, "Members: Zanik's crossbow (after The Chosen Commander)" + "
" + " Ammo: Bolts up to adamant", "Members can now fire " + "" + "Zanik's crossbow" + "" + " (after The Chosen Commander)."); + case 11: + return newstruct cs2func_script_1010_struct(50, 10156, "Members: Hunters' crossbow" + "
" + " Ammo: Kebbit and long kebbit bolts", "Members can now fire " + "" + "hunters' crossbows" + "" + "."); + case 12: + return newstruct cs2func_script_1010_struct(61, 9185, "Members: Runite crossbow" + "
" + " Ammo: Bolts up to rune", "Members can now fire " + "" + "runite crossbows" + "" + "."); + case 13: + return newstruct cs2func_script_1010_struct(70, 4734, "Members: Karil's crossbow" + "
" + " Ammo: Bolt racks", "Members can now use " + "" + "Karil's crossbow" + "" + "."); + case 14: + return newstruct cs2func_script_1010_struct(80, 18358, "Members: Chaotic crossbow" + "
" + " Ammo: Bolts up to rune" + "
" + " (with 80 Dungeoneering)", "Members can now wield " + "" + "chaotic crossbows" + "" + ". (They also need level 80 Dungeoneering.)"); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1010_struct(19, 6517, "Members: Falador wall" + "
" + " (with 11 Agility and 37 Strength)", "Members now have the Ranged level required to scale the " + "" + "Falador wall" + "" + ". (They also need level 11 Agility and level 37 Strength.)"); + case 1: + return newstruct cs2func_script_1010_struct(21, 6517, "Members: Yanille wall " + "
" + " (with 39 Agility and 38 Strength)", "Members now have the Ranged level required to scale the " + "" + "Yanille wall" + "" + ". (You also need level 39 Agility and level 38 Strength.)"); + case 2: + return newstruct cs2func_script_1010_struct(35, 6517, "Members: Catherby cliff " + "
" + " (after Fishing Contest, with 32 Agility and 35 Strength)", "Members now have the Ranged level required to scale the " + "" + "Catherby cliff" + "" + " (after Fishing Contest, with level 32 Agility and 35 Strength)."); + case 3: + return newstruct cs2func_script_1010_struct(37, 6515, "Members: River crossing to Al Kharid " + "
" + " (with 8 Agility and 19 Strength)", "Members now have the Ranged level required to cross the " + "" + "River Lum" + "" + " to " + "" + "Al Kharid" + "" + ". (You also need level 8 Agility and level 19 Strength.)"); + case 4: + return newstruct cs2func_script_1010_struct(39, 6515, "Members: Water Obelisk Island escape " + "
" + " (with 36 Agility and 22 Strength)", "Members now have the Ranged level required to complete the " + "" + "Water Obelisk Island escape" + "" + ". (You also need level 36 Agility and level 22 Strength)."); + case 5: + return newstruct cs2func_script_1010_struct(42, 6515, "Members: Karamja crossing, south of the volcano " + "
" + " (with 53 Agility and 21 Strength)", "Members now have the Ranged level required to use the " + "" + "Karamja Agility shortcut" + "" + ". (You also need level 53 Agility and level 21 Strength.)"); + case 6: + return newstruct cs2func_script_1010_struct(60, 6515, "Members: Cross Bandos's throne room " + "
" + " (after The Chosen Commander and with 60 Agility and 60 Strength)", "Members now have the Ranged level required to cross " + "" + "Bandos's throne room" + "" + " (after The Chosen Commander and with 60 Agility and 60 Strength."); + case 7: + return newstruct cs2func_script_1010_struct(80, 6515, "Members: Cross cave, south of Dorgesh-Kaan " + "
" + " (with 80 Agility and 80 Strength)", "Members now have the Ranged level required to cross the " + "" + "cave south of Dorgesh-Kaan" + "" + ". (You also need level 80 Agility and 80 Strength."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1010_struct(30, 10149, "Members: Swamp lizard" + "
" + " (with 30 Attack and 30 Magic)", "Members now have the Ranged level required to use " + "" + "swamp lizards" + "" + ". (They also need level 30 Attack and level 30 Magic.)"); + case 1: + return newstruct cs2func_script_1010_struct(50, 10146, "Members: Orange salamander" + "
" + " (with 50 Attack and 50 Magic)", "Members now have the Ranged level required to use " + "" + "orange salamanders" + "" + ". (They also need level 50 Attack and level 50 Magic.)"); + case 2: + return newstruct cs2func_script_1010_struct(60, 10147, "Members: Red salamander" + "
" + " (with 60 Attack and 60 Magic)", "Members now have the Ranged level required to use " + "" + "red salamanders" + "" + ". (They also need level 60 Attack and level 60 Magic.)"); + case 3: + return newstruct cs2func_script_1010_struct(70, 10148, "Members: Black salamander" + "
" + " (with 70 Attack and 70 Magic)", "Members now have the Ranged level required to use " + "" + "black salamanders" + "" + ". (They also need level 70 Attack and level 70 Magic.)"); + } + break; + case 6: + if (((boolean)arg1)) { + return newstruct cs2func_script_1010_struct(70, 9419, "Members: Armadyl's Eyrie in the God Wars Dungeon", "Members can now enter " + "" + "Armadyl's Eyrie" + "" + " in the " + "" + "God Wars Dungeon" + "" + "."); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_1010_struct(1, 19830, "Sling" + "
" + " Ammo: None needed", "You can now use a " + "" + "sling" + "" + "."); + case 1: + return newstruct cs2func_script_1010_struct(1, 15597, "Kayle's sling (after The Blood Pact)" + "
" + " Ammo: None needed", "You can now use " + "" + "Kayle's sling" + "" + " (after The Blood Pact)."); + case 2: + return newstruct cs2func_script_1010_struct(30, 10498, "Members: Ava's Attractor (after Animal Magnetism)", "Members now have the Ranged level required to use " + "" + "Ava's Attractor" + "" + " (after Animal Magnetism)."); + case 3: + return newstruct cs2func_script_1010_struct(42, 8841, "Members: Void knight mace", "Members now have the Ranged level required to wield " + "" + "Void knight maces" + "" + "."); + case 4: + return newstruct cs2func_script_1010_struct(45, 18330, "Longbow sight" + "
" + " (with 45 Dungeoneering)", "You can now use " + "" + "longbow sights" + "" + ". (You also need level 45 Dungeoneering.)"); + case 5: + return newstruct cs2func_script_1010_struct(50, 10499, "Members: Ava's Accumulator (after Animal Magnetism)", "Members now have the Ranged level required to use " + "" + "Ava's Accumulator" + "" + " (after Animal Magnetism)."); + case 6: + return newstruct cs2func_script_1010_struct(50, 20068, "Members: Ava's Alerter (after Do No Evil)", "Members now have the Ranged level required to use " + "" + "Ava's Alerter" + "" + " (after Do No Evil)."); + case 7: + return newstruct cs2func_script_1010_struct(50, 4150, "Members: Broad arrows" + "
" + " (with 55 Slayer)", "Members now have the Ranged level required to shoot " + "" + "broad arrows" + "" + ", Ranged weapons used for killing turoth and kurask. (You also need level 55 Slayer.)"); + case 8: + return newstruct cs2func_script_1010_struct(50, 13280, "Members: Broad-tipped bolts" + "
" + " (with 55 Slayer)", "Members now have the Ranged level required to shoot " + "" + "broad-tipped bolts" + "" + ", Ranged weapons used for killing turoth and kurask. (You also need level 55 Slayer.)"); + case 9: + return newstruct cs2func_script_1010_struct(50, 21640, "Members: Bane arrows" + "
" + " (after Ritual of the Mahjarrat)", "Members now have the Ranged level required to shoot " + "" + "bane arrows" + "" + ", Ranged weapons used for effectively killing specific creatures. (after Ritual of the Mahjarrat.)"); + case 10: + return newstruct cs2func_script_1010_struct(50, 21660, "Members: Bane bolts" + "
" + " (after Ritual of the Mahjarrat)", "Members now have the Ranged level required to shoot " + "" + "bane bolts" + "" + ", Ranged weapons used for effectively killing specific creatures. (after Ritual of the Mahjarrat.)"); + case 11: + return newstruct cs2func_script_1010_struct(75, 15241, "Members: Chaos dwarf hand cannon" + "
" + " (with 61 Firemaking and after Forgiveness of a Chaos Dwarf)", "Members now have the Ranged level required to fire the " + "" + "chaos dwarf hand cannon" + "" + " (after Forgiveness of a Chaos Dwarf and with 61 Firemaking)."); + } + break; + case 8: + switch (arg1) { + case 0: + return newstruct cs2func_script_1010_struct(1, 14192, "Members: Stealing Creation - class 1 bow", "Members can now wield " + "" + "class 1 bows" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_1010_struct(1, 14411, "Members: Stealing Creation - class 1 coif", "Members can now wear " + "" + "class 1 coifs" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_1010_struct(1, 14391, "Members: Stealing Creation - class 1 leather body", "Members can now wear " + "" + "class 1 leather bodies" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_1010_struct(1, 14401, "Members: Stealing Creation - class 1 chaps", "Members can now wear " + "" + "class 1 chaps" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_1010_struct(20, 14194, "Members: Stealing Creation - class 2 bow", "Members can now wield " + "" + "class 2 bows" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_1010_struct(20, 14413, "Members: Stealing Creation - class 2 coif", "Members can now wear " + "" + "class 2 coifs" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_1010_struct(20, 14393, "Members: Stealing Creation - class 2 leather body", "Members can now wear " + "" + "class 2 leather bodies" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_1010_struct(20, 14403, "Members: Stealing Creation - class 2 chaps", "Members can now wear " + "" + "class 2 chaps" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_1010_struct(40, 14196, "Members: Stealing Creation - class 3 bow", "Members can now wield " + "" + "class 3 bows" + "" + " in Stealing Creation."); + case 9: + return newstruct cs2func_script_1010_struct(40, 14415, "Members: Stealing Creation - class 3 coif", "Members can now wear " + "" + "class 3 coifs" + "" + " in Stealing Creation."); + case 10: + return newstruct cs2func_script_1010_struct(40, 14395, "Members: Stealing Creation - class 3 leather body", "Members can now wear " + "" + "class 3 leather bodies" + "" + " in Stealing Creation."); + case 11: + return newstruct cs2func_script_1010_struct(40, 14405, "Members: Stealing Creation - class 3 chaps", "Members can now wear " + "" + "class 3 chaps" + "" + " in Stealing Creation."); + case 12: + return newstruct cs2func_script_1010_struct(60, 14198, "Members: Stealing Creation - class 4 bow", "Members can now wield " + "" + "class 4 bows" + "" + " in Stealing Creation."); + case 13: + return newstruct cs2func_script_1010_struct(60, 14417, "Members: Stealing Creation - class 4 coif", "Members can now wear " + "" + "class 4 coifs" + "" + " in Stealing Creation."); + case 14: + return newstruct cs2func_script_1010_struct(60, 14397, "Members: Stealing Creation - class 4 leather body", "Members can now wear " + "" + "class 4 leather bodies" + "" + " in Stealing Creation."); + case 15: + return newstruct cs2func_script_1010_struct(60, 14407, "Members: Stealing Creation - class 4 chaps", "Members can now wear " + "" + "class 4 chaps" + "" + " in Stealing Creation."); + case 16: + return newstruct cs2func_script_1010_struct(80, 14200, "Members: Stealing Creation - class 5 bow", "Members can now wield " + "" + "class 5 bows" + "" + " in Stealing Creation."); + case 17: + return newstruct cs2func_script_1010_struct(80, 14419, "Members: Stealing Creation - class 5 coif", "Members can now wear " + "" + "class 5 coifs" + "" + " in Stealing Creation."); + case 18: + return newstruct cs2func_script_1010_struct(80, 14399, "Members: Stealing Creation - class 5 leather body", "Members can now wear " + "" + "class 5 leather bodies" + "" + " in Stealing Creation."); + case 19: + return newstruct cs2func_script_1010_struct(80, 14409, "Members: Stealing Creation - class 5 chaps", "Members can now wear " + "" + "class 5 chaps" + "" + " in Stealing Creation."); + case 20: + return newstruct cs2func_script_1010_struct(85, 21547, "Members: Trickster hood" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Ranged requirement to wear " + "" + "Trickster hoods" + "" + ". (They also need level 85 Defence and level 85 Magic)"); + case 21: + return newstruct cs2func_script_1010_struct(85, 21549, "Members: Trickster robe" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Ranged requirement to wear " + "" + "Trickster robes" + "" + ". (They also need level 85 Defence and level 85 Magic)"); + case 22: + return newstruct cs2func_script_1010_struct(85, 21551, "Members: Trickster legs" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Ranged requirement to wear " + "" + "Trickster legs" + "" + ". (They also need level 85 Defence and level 85 Magic)"); + case 23: + return newstruct cs2func_script_1010_struct(85, 21553, "Members: Trickster gloves" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Ranged requirement to wear " + "" + "Trickster gloves" + "" + ". (They also need level 85 Defence and level 85 Magic)"); + case 24: + return newstruct cs2func_script_1010_struct(85, 21555, "Members: Trickster boots" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Ranged requirement to wear " + "" + "Trickster boots" + "" + ". (They also need level 85 Defence and level 85 Magic)"); + case 25: + return newstruct cs2func_script_1010_struct(85, 21557, "Members: Vanguard helm" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the Ranged requirement to wear " + "" + "Vanguard helms" + "" + ". (They also need level 85 Defence and level 85 Strength.)"); + case 26: + return newstruct cs2func_script_1010_struct(85, 21559, "Members: Vanguard body" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the Ranged requirement to wear " + "" + "Vanguard body armour" + "" + ". (They also need level 85 Defence and level 85 Strength.)"); + case 27: + return newstruct cs2func_script_1010_struct(85, 21561, "Members: Vanguard legs" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the Ranged requirement to wear " + "" + "Vanguard leg armour" + "" + ". (They also need level 85 Defence and level 85 Strength.)"); + case 28: + return newstruct cs2func_script_1010_struct(85, 21563, "Members: Vanguard gloves" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the Ranged requirement to wear " + "" + "Vanguard gloves" + "" + ". (They also need level 85 Defence and level 85 Strength.)"); + case 29: + return newstruct cs2func_script_1010_struct(85, 21565, "Members: Vanguard boots" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the Ranged requirement to wear " + "" + "Vanguard boots" + "" + ". (They also need level 85 Defence and level 85 Strength.)"); + } + break; + case 9: + switch (arg1) { + case 0: + return newstruct cs2func_script_1010_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Ranged level increases, you will be able to attempt higher-level ranged tasks within Daemonheim. You will also be more likely to succeed when attempting ranged tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1010_struct(1, 16867, "Tangle gum shortbow (Tier 1)", "You can now wield " + "" + "tangle gum shortbows" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1010_struct(1, 16317, "Tangle gum longbow (Tier 1)", "You can now wield " + "" + "tangle gum shortbows" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_1010_struct(1, 16427, "Novite arrows (Tier 1)", "You can now use " + "" + "novite arrows" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1010_struct(1, 17041, "Protoleather coifs (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "protoleather coif" + "" + " within Daemonheim. (You also need level 1 Defence.)"); + case 5: + return newstruct cs2func_script_1010_struct(1, 17173, "Protoleather body (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "protoleather bodies" + "" + " within Daemonheim. (You also need level 1 Defence)."); + case 6: + return newstruct cs2func_script_1010_struct(1, 17319, "Protoleather chaps (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "protoleather chaps" + "" + " within Daemonheim. (You also need level 1 Defence)."); + case 7: + return newstruct cs2func_script_1010_struct(1, 17195, "Protoleather vambraces (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "protoleather vambraces" + "" + " within Daemonheim. (You also need level 1 Defence)."); + case 8: + return newstruct cs2func_script_1010_struct(1, 17297, "Protoleather boots (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "protoleather boots" + "" + " within Daemonheim. (You also need level 1 Defence)."); + case 9: + return newstruct cs2func_script_1010_struct(10, 16869, "Seeping elm shortbow (Tier 2)", "You can now wield " + "" + "seeping elm shortbows" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1010_struct(10, 16319, "Seeping elm longbow (Tier 2)", "You can now wield " + "" + "seeping elm longbows" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_1010_struct(10, 16432, "Bathus arrows (Tier 2)", "You can now use " + "" + "bathus arrows" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_1010_struct(10, 17043, "Subleather coifs (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "subleather coif" + "" + " within Daemonheim. (You also need level 10 Defence)."); + case 13: + return newstruct cs2func_script_1010_struct(10, 17175, "Subleather body (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "subleather bodies" + "" + " within Daemonheim. (You also need level 10 Defence)."); + case 14: + return newstruct cs2func_script_1010_struct(10, 17321, "Subleather chaps (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "subleather chaps" + "" + " within Daemonheim. (You also need level 10 Defence)."); + case 15: + return newstruct cs2func_script_1010_struct(10, 17197, "Subleather vambraces (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "subleather vambraces" + "" + " within Daemonheim. (You also need level 10 Defence)."); + case 16: + return newstruct cs2func_script_1010_struct(10, 17299, "Subleather boots (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "subleather boots" + "" + " within Daemonheim. (You also need level 10 Defence)."); + case 17: + return newstruct cs2func_script_1010_struct(20, 16871, "Blood spindle shortbow (Tier 3)", "You can now wield " + "" + "blood spindle shortbows" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_1010_struct(20, 16321, "Blood spindle longbow (Tier 3)", "You can now wield " + "" + "blood spindle longbows" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_1010_struct(20, 16437, "Marmaros arrows (Tier 3)", "You can now use " + "" + "marmaros arrows" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_1010_struct(20, 17045, "Paraleather coif (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "paraleather coifs" + "" + " within Daemonheim. (You also need level 20 Defence)."); + case 21: + return newstruct cs2func_script_1010_struct(20, 17177, "Paraleather body (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "paraleather bodies" + "" + " within Daemonheim. (You also need level 20 Defence)."); + case 22: + return newstruct cs2func_script_1010_struct(20, 17323, "Paraleather chaps (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "paraleather chaps" + "" + " within Daemonheim. (You also need level 20 Defence)."); + case 23: + return newstruct cs2func_script_1010_struct(20, 17199, "Paraleather vambraces (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "paraleather vambraces" + "" + " within Daemonheim. (You also need level 20 Defence)."); + case 24: + return newstruct cs2func_script_1010_struct(20, 17301, "Paraleather boots (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "paraleather boots" + "" + " within Daemonheim. (You also need level 20 Defence)."); + case 25: + return newstruct cs2func_script_1010_struct(30, 16873, "Utuku shortbow (Tier 4)", "You can now wield " + "" + "utuku shortbows" + "" + " within Daemonheim."); + case 26: + return newstruct cs2func_script_1010_struct(30, 16323, "Utuku longbow (Tier 4)", "You can now wield " + "" + "utuku longbows" + "" + " within Daemonheim."); + case 27: + return newstruct cs2func_script_1010_struct(30, 16442, "Kratonite arrows (Tier 4)", "You can now use " + "" + "kratonite arrows" + "" + " within Daemonheim."); + case 28: + return newstruct cs2func_script_1010_struct(30, 17047, "Archleather coif (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "archleather coifs" + "" + " within Daemonheim. (You also need level 30 Defence)."); + case 29: + return newstruct cs2func_script_1010_struct(30, 17179, "Archleather body (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "archleather bodies" + "" + " within Daemonheim. (You also need level 30 Defence)."); + case 30: + return newstruct cs2func_script_1010_struct(30, 17325, "Archleather chaps (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "archleather chaps" + "" + " within Daemonheim. (You also need level 30 Defence)."); + case 31: + return newstruct cs2func_script_1010_struct(30, 17201, "Archleather vambraces (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "archleather vambraces" + "" + " within Daemonheim. (You also need level 30 Defence)."); + case 32: + return newstruct cs2func_script_1010_struct(30, 17303, "Archleather boots (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "archleather boots" + "" + " within Daemonheim. (You also need level 30 Defence)."); + case 33: + return newstruct cs2func_script_1010_struct(40, 16875, "Spinebeam shortbow (Tier 5)", "You can now wield " + "" + "spinebeam shortbows" + "" + " within Daemonheim."); + case 34: + return newstruct cs2func_script_1010_struct(40, 16325, "Spinebeam longbow (Tier 5)", "You can now wield " + "" + "spinebeam longbows" + "" + " within Daemonheim."); + case 35: + return newstruct cs2func_script_1010_struct(40, 16447, "Fractite arrows (Tier 5)", "You can now use " + "" + "fractite arrows" + "" + " within Daemonheim."); + case 36: + return newstruct cs2func_script_1010_struct(40, 17049, "Dromoleather coif (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "dromoleather coifs" + "" + " within Daemonheim. (You also need level 40 Defence)."); + case 37: + return newstruct cs2func_script_1010_struct(40, 17181, "Dromoleather body (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "dromoleather bodies" + "" + " within Daemonheim. (You also need level 40 Defence)."); + case 38: + return newstruct cs2func_script_1010_struct(40, 17327, "Dromoleather chaps (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "dromoleather chaps" + "" + " within Daemonheim. (You also need level 40 Defence)."); + case 39: + return newstruct cs2func_script_1010_struct(40, 17203, "Dromoleather vambraces (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "dromoleather vambraces" + "" + " within Daemonheim. (You also need level 40 Defence)."); + case 40: + return newstruct cs2func_script_1010_struct(40, 17305, "Dromoleather boots (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "dromoleather boots" + "" + " within Daemonheim. (You also need level 40 Defence)."); + case 41: + return newstruct cs2func_script_1010_struct(50, 16877, "Members: Bovistrangler shortbow (Tier 6)", "Members can now wield " + "" + "bovistrangler shortbows" + "" + " within Daemonheim."); + case 42: + return newstruct cs2func_script_1010_struct(50, 16327, "Members: Bovistrangler longbow (Tier 6)", "Members can now wield " + "" + "bovistrangler longbows" + "" + " within Daemonheim."); + case 43: + return newstruct cs2func_script_1010_struct(50, 16452, "Members: Zephyrium arrows (Tier 6)", "Members can now use " + "" + "zephyrium arrows" + "" + " within Daemonheim."); + case 44: + return newstruct cs2func_script_1010_struct(50, 17051, "Members: Spinoleather coif (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "spinoleather coifs" + "" + " within Daemonheim. (They also need level 50 Defence)."); + case 45: + return newstruct cs2func_script_1010_struct(50, 17183, "Members: Spinoleather body (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "spinoleather bodies" + "" + " within Daemonheim. (They also need level 50 Defence)."); + case 46: + return newstruct cs2func_script_1010_struct(50, 17329, "Members: Spinoleather chaps (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "spinoleather chaps" + "" + " within Daemonheim. (They also need level 50 Defence)."); + case 47: + return newstruct cs2func_script_1010_struct(50, 17205, "Members: Spinoleather vambraces (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "spinoleather vambraces" + "" + " within Daemonheim. (They also need level 50 Defence)."); + case 48: + return newstruct cs2func_script_1010_struct(50, 17307, "Members: Spinoleather boots (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "spinoleather boots" + "" + " within Daemonheim. (They also need level 50 Defence)."); + case 49: + return newstruct cs2func_script_1010_struct(60, 16879, "Members: Thigat shortbow (Tier 7)", "Members can now wield " + "" + "thigat shortbows" + "" + " within Daemonheim."); + case 50: + return newstruct cs2func_script_1010_struct(60, 16329, "Members: Thigat longbow (Tier 7)", "Members can now wield " + "" + "thigat longbows" + "" + " within Daemonheim."); + case 51: + return newstruct cs2func_script_1010_struct(60, 16457, "Members: Argonite arrows (Tier 7)", "Members can now use " + "" + "argonite arrows" + "" + " within Daemonheim."); + case 52: + return newstruct cs2func_script_1010_struct(60, 17053, "Members: Gallileather coif (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "gallileather coifs" + "" + " within Daemonheim. (They also need level 60 Defence)."); + case 53: + return newstruct cs2func_script_1010_struct(60, 17185, "Members: Gallileather body (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "gallileather bodies" + "" + " within Daemonheim. (They also need level 60 Defence)."); + case 54: + return newstruct cs2func_script_1010_struct(60, 17331, "Members: Gallileather chaps (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "gallileather chaps" + "" + " within Daemonheim. (They also need level 60 Defence)."); + case 55: + return newstruct cs2func_script_1010_struct(60, 17207, "Members: Gallileather vambraces (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "gallileather vambraces" + "" + " within Daemonheim. (They also need level 60 Defence)."); + case 56: + return newstruct cs2func_script_1010_struct(60, 17309, "Members: Gallileather boots (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "gallileather boots" + "" + " within Daemonheim. (They also need level 60 Defence)."); + case 57: + return newstruct cs2func_script_1010_struct(70, 16881, "Members: Corpsethorn shortbow (Tier 8)", "Members can now wield " + "" + "corpsethorn shortbows" + "" + " within Daemonheim."); + case 58: + return newstruct cs2func_script_1010_struct(70, 16331, "Members: Corpsethorn longbow (Tier 8)", "Members can now wield " + "" + "corpsethorn longbows" + "" + " within Daemonheim."); + case 59: + return newstruct cs2func_script_1010_struct(70, 16462, "Members: Katagon arrows (Tier 8)", "Members can now use " + "" + "katagon arrows" + "" + " within Daemonheim."); + case 60: + return newstruct cs2func_script_1010_struct(70, 17055, "Members: Stegoleather coif (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "stegoleather coifs" + "" + " within Daemonheim. (They also need level 70 Defence)."); + case 61: + return newstruct cs2func_script_1010_struct(70, 17187, "Members: Stegoleather body (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "stegoleather bodies" + "" + " within Daemonheim. (They also need level 70 Defence)."); + case 62: + return newstruct cs2func_script_1010_struct(70, 17333, "Members: Stegoleather chaps (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "stegoleather chaps" + "" + " within Daemonheim. (They also need level 70 Defence)."); + case 63: + return newstruct cs2func_script_1010_struct(70, 17209, "Members: Stegoleather vambraces (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "stegoleather vambraces" + "" + " within Daemonheim. (They also need level 70 Defence)."); + case 64: + return newstruct cs2func_script_1010_struct(70, 17311, "Members: Stegoleather boots (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "stegoleather boots" + "" + " within Daemonheim. (They also need level 70 Defence)."); + case 65: + return newstruct cs2func_script_1010_struct(80, 16883, "Members: Entgallow shortbow (Tier 9)", "Members can now wield " + "" + "entgallow shortbows" + "" + " within Daemonheim."); + case 66: + return newstruct cs2func_script_1010_struct(80, 16333, "Members: Entgallow longbow (Tier 9)", "Members can now wield " + "" + "entgallow longbows" + "" + " within Daemonheim."); + case 67: + return newstruct cs2func_script_1010_struct(80, 16467, "Members: Gorgonite arrows (Tier 9)", "Members can now use " + "" + "gorgonite arrows" + "" + " within Daemonheim."); + case 68: + return newstruct cs2func_script_1010_struct(80, 17057, "Members: Megaleather coif (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "megaleather coifs" + "" + " within Daemonheim. (They also need level 80 Defence)."); + case 69: + return newstruct cs2func_script_1010_struct(80, 17189, "Members: Megaleather body (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "megaleather bodies" + "" + " within Daemonheim. (They also need level 80 Defence)."); + case 70: + return newstruct cs2func_script_1010_struct(80, 17335, "Members: Megaleather chaps (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "megaleather chaps" + "" + " within Daemonheim. (They also need level 80 Defence)."); + case 71: + return newstruct cs2func_script_1010_struct(80, 17211, "Members: Megaleather vambraces (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "megaleather vambraces" + "" + " within Daemonheim. (They also need level 80 Defence)."); + case 72: + return newstruct cs2func_script_1010_struct(80, 17313, "Members: Megaleather boots (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "megaleather boots" + "" + " within Daemonheim. (They also need level 80 Defence)."); + case 73: + return newstruct cs2func_script_1010_struct(83, 17283, "Members: Grounding boots" + "
" + " (with 83 Defence)", "Members can now wear " + "" + "grounding boots" + "" + " within Daemonheim. (They also need level 83 Defence.)"); + case 74: + return newstruct cs2func_script_1010_struct(90, 16885, "Members: Grave creeper shortbow (Tier 10)", "Members can now wield " + "" + "grave creeper shortbows" + "" + " within Daemonheim."); + case 75: + return newstruct cs2func_script_1010_struct(90, 16335, "Members: Grave creeper longbow (Tier 10)", "Members can now wield " + "" + "grave creeper longbows" + "" + " within Daemonheim."); + case 76: + return newstruct cs2func_script_1010_struct(90, 16472, "Members: Promethium arrows (Tier 10)", "Members can now use " + "" + "promethium arrows" + "" + " within Daemonheim."); + case 77: + return newstruct cs2func_script_1010_struct(90, 17059, "Members: Tyrannoleather coif (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "tyrannoleather coifs" + "" + " within Daemonheim. (They also need level 90 Defence)."); + case 78: + return newstruct cs2func_script_1010_struct(90, 17191, "Members: Tyrannoleather body (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "tyrannoleather bodies" + "" + " within Daemonheim. (They also need level 90 Defence)."); + case 79: + return newstruct cs2func_script_1010_struct(90, 17337, "Members: Tyrannoleather chaps (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "tyrannoleather chaps" + "" + " within Daemonheim. (They also need level 90 Defence)."); + case 80: + return newstruct cs2func_script_1010_struct(90, 17213, "Members: Tyrannoleather vambraces (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "tyrannoleather vambraces" + "" + " within Daemonheim. (They also need level 90 Defence)."); + case 81: + return newstruct cs2func_script_1010_struct(90, 17315, "Members: Tyrannoleather boots (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "tyrannoleather boots" + "" + " within Daemonheim. (They also need level 90 Defence)."); + case 82: + return newstruct cs2func_script_1010_struct(98, 17295, "Members: Hexhunter bow", "Members can now wield " + "" + "hexhunter shortbows" + "" + " within Daemonheim."); + case 83: + return newstruct cs2func_script_1010_struct(99, 16887, "Members: Sagittarian shortbow (Tier 11)", "Members can now wield " + "" + "sagittarian shortbows" + "" + " within Daemonheim."); + case 84: + return newstruct cs2func_script_1010_struct(99, 16337, "Members: Sagittarian longbow (Tier 11)", "Members can now wield " + "" + "sagittarian longbows" + "" + " within Daemonheim."); + case 85: + return newstruct cs2func_script_1010_struct(99, 16477, "Members: Sagittarian arrows (Tier 11)", "Members can now use " + "" + "sagittarian arrows" + "" + " within Daemonheim."); + case 86: + return newstruct cs2func_script_1010_struct(99, 17061, "Members: Sagittarian coif (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "sagittarian coifs" + "" + " within Daemonheim. (They also need level 99 Defence)."); + case 87: + return newstruct cs2func_script_1010_struct(99, 17193, "Members: Sagittarian body (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "sagittarian bodies" + "" + " within Daemonheim. (They also need level 99 Defence)."); + case 88: + return newstruct cs2func_script_1010_struct(99, 17339, "Members: Sagittarian chaps (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "sagittarian chaps" + "" + " within Daemonheim. (They also need level 99 Defence)."); + case 89: + return newstruct cs2func_script_1010_struct(99, 17215, "Members: Sagittarian vambraces (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "sagittarian vambraces" + "" + " within Daemonheim. (They also need level 99 Defence)."); + case 90: + return newstruct cs2func_script_1010_struct(99, 17317, "Members: Sagittarian boots (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "sagittarian boots" + "" + " within Daemonheim. (They also need level 99 Defence)."); + } + break; + case 10: + SWITCH (arg1) { + case 0: + GOTO flow_311 + case 1: + GOTO flow_312 + } + break; + flow_311: + return newstruct cs2func_script_1010_struct(40, 8164, "Members: Ranging Guild", "Members can now enter the prestigious " + "" + "Ranging Guild" + "" + " in Hemenster and play the " + "" + "Target Practice" + "" + " game there."); + flow_312: + return newstruct cs2func_script_1010_struct(99, 9756, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Ranged" + "" + ". Members can visit the " + "" + "armour salesman" + "" + " at the " + "" + "Ranging Guild" + "" + ". He has something special only available to true masters of the " + "" + "Ranged" + "" + " skill!"); + } + return newstruct cs2func_script_1010_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1011.cs2 b/dumps/scripts/1011.cs2 new file mode 100644 index 000000000..3cd01a926 --- /dev/null +++ b/dumps/scripts/1011.cs2 @@ -0,0 +1,19 @@ +cs2func_script_1011_struct(1,1,0) script_1011(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1011_struct(0, "Runes"); + case 1: + return newstruct cs2func_script_1011_struct(0, "Multiple Runes"); + case 2: + return newstruct cs2func_script_1011_struct(0, "Equipment"); + case 3: + return newstruct cs2func_script_1011_struct(0, "Other"); + case 4: + return newstruct cs2func_script_1011_struct(0, "Minigames"); + case 5: + return newstruct cs2func_script_1011_struct(0, "Dungeoneering"); + case 6: + return newstruct cs2func_script_1011_struct(0, "Milestones"); + } + return newstruct cs2func_script_1011_struct(-1, ""); +} diff --git a/dumps/scripts/1012.cs2 b/dumps/scripts/1012.cs2 new file mode 100644 index 000000000..410e83540 --- /dev/null +++ b/dumps/scripts/1012.cs2 @@ -0,0 +1,220 @@ +cs2func_script_1012_struct(2,2,0) script_1012(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1012_struct(-1, 7620, "To mine rune essence, you must have started Rune Mysteries.", ""); + case 1: + return newstruct cs2func_script_1012_struct(1, 556, "Air runes", "You can now craft " + "" + "air runes" + "" + "."); + case 2: + return newstruct cs2func_script_1012_struct(2, 558, "Mind runes", "You can now craft " + "" + "mind runes" + "" + "."); + case 3: + return newstruct cs2func_script_1012_struct(5, 555, "Water runes", "You can now craft " + "" + "water runes" + "" + "."); + case 4: + return newstruct cs2func_script_1012_struct(6, 4695, "Members: Mist runes", "Members can now craft " + "" + "mist runes" + "" + "."); + case 5: + return newstruct cs2func_script_1012_struct(9, 557, "Earth runes", "You can now craft " + "" + "earth runes" + "" + "."); + case 6: + return newstruct cs2func_script_1012_struct(10, 4696, "Members: Dust runes", "Members can now craft " + "" + "dust runes" + "" + "."); + case 7: + return newstruct cs2func_script_1012_struct(13, 4698, "Members: Mud runes", "Members can now craft " + "" + "mud runes" + "" + "."); + case 8: + return newstruct cs2func_script_1012_struct(14, 554, "Fire runes", "You can now craft " + "" + "fire runes" + "" + "."); + case 9: + return newstruct cs2func_script_1012_struct(15, 4697, "Members: Smoke runes", "Members can now craft " + "" + "smoke runes" + "" + "."); + case 10: + return newstruct cs2func_script_1012_struct(19, 4694, "Members: Steam runes", "Members can now craft " + "" + "steam runes" + "" + "."); + case 11: + return newstruct cs2func_script_1012_struct(20, 559, "Body runes", "You can now craft " + "" + "body runes" + "" + "."); + case 12: + return newstruct cs2func_script_1012_struct(23, 4699, "Members: Lava runes", "Members can now craft " + "" + "lava runes" + "" + "."); + case 13: + return newstruct cs2func_script_1012_struct(27, 564, "Members: Cosmic runes", "Members can now craft " + "" + "cosmic runes" + "" + "."); + case 14: + return newstruct cs2func_script_1012_struct(35, 562, "Members: Chaos runes", "Members can now craft " + "" + "chaos runes" + "" + "."); + case 15: + return newstruct cs2func_script_1012_struct(40, 9075, "Members: Astral runes" + "
" + " (after Lunar Diplomacy)", "Members now have the Runecrafting level required to craft " + "" + "astral runes" + "" + " (after Lunar Diplomacy, or when in Daemonheim)."); + case 16: + return newstruct cs2func_script_1012_struct(44, 561, "Members: Nature runes", "Members can now craft " + "" + "nature runes" + "" + "."); + case 17: + return newstruct cs2func_script_1012_struct(54, 563, "Members: Law runes", "Members can now craft " + "" + "law runes" + "" + "."); + case 18: + return newstruct cs2func_script_1012_struct(65, 560, "Members: Death runes" + "
" + " (after Mourning's Ends Part II)", "Members now have the Runecrafting level required to craft " + "" + "death runes" + "" + " (after Mourning's Ends Part II, or when in Daemonheim)."); + case 19: + return newstruct cs2func_script_1012_struct(72, 21773, "Members: Armadyl runes" + "
" + " (after Ritual of the Mahjarrat)", "Members can now craft " + "" + "Armadyl runes" + "" + " (after Ritual of the Mahjarrat)."); + case 20: + return newstruct cs2func_script_1012_struct(77, 565, "Members: Blood runes" + "
" + " (after Legacy of Seergaze)", "Members now have the Runecrafting level required to craft " + "" + "blood runes" + "" + " (after Legacy of Seergaze, or when in Daemonheim)."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1012_struct(-1, 7620, "As your Runecrafting skill develops, you will be able to craft multiple runes from one piece of essence. You only receive experience for each piece of essence crafted, not each rune crafted.", " "); + case 1: + return newstruct cs2func_script_1012_struct(11, 556, "2 Air runes per essence", "You can now craft " + "" + "2 air runes" + "" + " from one piece of essence."); + case 2: + return newstruct cs2func_script_1012_struct(14, 558, "2 Mind runes per essence", "You can now craft " + "" + "2 mind runes" + "" + " from one piece of essence."); + case 3: + return newstruct cs2func_script_1012_struct(19, 555, "2 Water runes per essence", "You can now craft " + "" + "2 water runes" + "" + " from one piece of essence."); + case 4: + return newstruct cs2func_script_1012_struct(22, 556, "3 Air runes per essence", "You can now craft " + "" + "3 air runes" + "" + " from one piece of essence."); + case 5: + return newstruct cs2func_script_1012_struct(26, 557, "2 Earth runes per essence", "You can now craft " + "" + "2 earth runes" + "" + " from one piece of essence."); + case 6: + return newstruct cs2func_script_1012_struct(28, 558, "3 Mind runes per essence", "You can now craft " + "" + "3 mind runes" + "" + " from one piece of essence."); + case 7: + return newstruct cs2func_script_1012_struct(33, 556, "4 Air runes per essence", "You can now craft " + "" + "4 air runes" + "" + " from one piece of essence."); + case 8: + return newstruct cs2func_script_1012_struct(35, 554, "2 Fire runes per essence", "You can now craft " + "" + "2 fire runes" + "" + " from one piece of essence."); + case 9: + return newstruct cs2func_script_1012_struct(38, 555, "3 Water runes per essence", "You can now craft " + "" + "3 water runes" + "" + " from one piece of essence."); + case 10: + return newstruct cs2func_script_1012_struct(42, 558, "4 Mind runes per essence", "You can now craft " + "" + "4 mind runes" + "" + " from one piece of essence."); + case 11: + return newstruct cs2func_script_1012_struct(44, 556, "5 Air runes per essence", "You can now craft " + "" + "5 air runes" + "" + " from one piece of essence."); + case 12: + return newstruct cs2func_script_1012_struct(46, 559, "2 Body runes per essence", "You can now craft " + "" + "2 body runes" + "" + " from one piece of essence."); + case 13: + return newstruct cs2func_script_1012_struct(52, 557, "3 Earth runes per essence", "You can now craft " + "" + "3 earth runes" + "" + " from one piece of essence."); + case 14: + return newstruct cs2func_script_1012_struct(55, 556, "6 Air runes per essence", "You can now craft " + "" + "6 air runes" + "" + " from one piece of essence."); + case 15: + return newstruct cs2func_script_1012_struct(56, 558, "5 Mind runes per essence", "You can now craft " + "" + "5 mind runes" + "" + " from one piece of essence."); + case 16: + return newstruct cs2func_script_1012_struct(57, 555, "4 Water runes per essence", "You can now craft " + "" + "4 water runes" + "" + " from one piece of essence."); + case 17: + return newstruct cs2func_script_1012_struct(59, 564, "Members: 2 Cosmic runes per essence", "Members can now craft " + "" + "2 cosmic runes" + "" + " from one piece of essence."); + case 18: + return newstruct cs2func_script_1012_struct(66, 556, "7 Air runes per essence", "You can now craft " + "" + "7 air runes" + "" + " from one piece of essence."); + case 19: + return newstruct cs2func_script_1012_struct(70, 558, "6 Mind runes per essence", "You can now craft " + "" + "6 mind runes" + "" + " from one piece of essence."); + case 20: + return newstruct cs2func_script_1012_struct(70, 554, "3 Fire runes per essence", "You can now craft " + "" + "3 fire runes" + "" + " from one piece of essence."); + case 21: + return newstruct cs2func_script_1012_struct(74, 562, "Members: 2 Chaos runes per essence", "Members can now craft " + "" + "2 chaos runes" + "" + " from one piece of essence."); + case 22: + return newstruct cs2func_script_1012_struct(76, 555, "5 Water runes per essence", "You can now craft " + "" + "5 water runes" + "" + " from one piece of essence."); + case 23: + return newstruct cs2func_script_1012_struct(77, 556, "8 Air runes per essence", "You can now craft " + "" + "8 air runes" + "" + " from one piece of essence."); + case 24: + return newstruct cs2func_script_1012_struct(78, 557, "4 Earth runes per essence", "You can now craft " + "" + "4 earth runes" + "" + " from one piece of essence."); + case 25: + return newstruct cs2func_script_1012_struct(82, 9075, "Members: 2 Astral runes per essence", "Members can now craft " + "" + "2 astral runes" + "" + " from one piece of essence."); + case 26: + return newstruct cs2func_script_1012_struct(84, 558, "7 Mind runes per essence", "You can now craft " + "" + "7 mind runes" + "" + " from one piece of essence."); + case 27: + return newstruct cs2func_script_1012_struct(88, 556, "9 Air runes per essence", "You can now craft " + "" + "9 air runes" + "" + " from one piece of essence."); + case 28: + return newstruct cs2func_script_1012_struct(91, 561, "Members: 2 Nature runes per essence", "Members can now craft " + "" + "2 nature runes" + "" + " from one piece of essence."); + case 29: + return newstruct cs2func_script_1012_struct(92, 559, "3 Body runes per essence", "You can now craft " + "" + "3 body runes" + "" + " from one piece of essence."); + case 30: + return newstruct cs2func_script_1012_struct(95, 555, "6 Water runes per essence", "You can now craft " + "" + "6 water runes" + "" + " from one piece of essence."); + case 31: + return newstruct cs2func_script_1012_struct(98, 558, "8 Mind runes per essence", "You can now craft " + "" + "8 mind runes" + "" + " from one piece of essence."); + case 32: + return newstruct cs2func_script_1012_struct(99, 556, "10 Air runes per essence", "You can now craft " + "" + "10 air runes" + "" + " from one piece of essence."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1012_struct(-1, 7620, "Pouches allow you to carry extra essence in them and they come in various sizes. As you use the pouches, they degrade and store less essence. Speak to the Dark Mage at the centre of the Abyss to restore them.", ""); + case 1: + return newstruct cs2func_script_1012_struct(1, 5509, "Members: Small pouch" + "
" + "Holds 3 extra essence", "Members can now use " + "" + "small pouches" + "" + " to store 3 essence."); + case 2: + return newstruct cs2func_script_1012_struct(10, 12863, "Air rune crafting gloves", "You can now wear " + "" + "air rune crafting gloves" + "" + "."); + case 3: + return newstruct cs2func_script_1012_struct(20, 12864, "Water rune crafting gloves", "You can now wear " + "" + "water rune crafting gloves" + "" + "."); + case 4: + return newstruct cs2func_script_1012_struct(25, 5510, "Members: Medium pouch" + "
" + "Holds 6 extra essence", "Members can now use " + "" + "medium pouches" + "" + " to store 6 essence."); + case 5: + return newstruct cs2func_script_1012_struct(30, 12865, "Earth rune crafting gloves", "You can now wear " + "" + "earth rune crafting gloves" + "" + "."); + case 6: + return newstruct cs2func_script_1012_struct(35, 19671, "Magical blastbox" + "
" + " (with 30 Dungeoneering and 30 Magic)", "You can now use " + "" + "magical blastboxes" + "" + ". (You also need level 30 Dungeoneering and 30 Magic.)"); + case 7: + return newstruct cs2func_script_1012_struct(50, 5512, "Members: Large pouch" + "
" + "Holds 9 extra essence", "Members can now use " + "" + "large pouches" + "" + " to store 9 essence."); + case 8: + return newstruct cs2func_script_1012_struct(50, 21517, "Members: Master Runecrafter hat", "Members can now wear " + "" + "Master Runecrafter hats" + "" + "."); + case 9: + return newstruct cs2func_script_1012_struct(50, 21516, "Members: Master Runecrafter robe", "Members can now wear " + "" + "Master Runecrafter robes" + "" + "."); + case 10: + return newstruct cs2func_script_1012_struct(50, 21518, "Members: Master Runecrafter legs", "Members can now wear " + "" + "Master Runecrafter legs" + "" + "."); + case 11: + return newstruct cs2func_script_1012_struct(50, 21519, "Members: Master Runecrafter boots", "Members can now wear " + "" + "Master Runecrafter boots" + "" + "."); + case 12: + return newstruct cs2func_script_1012_struct(70, 19889, "Members: Celestial surgebox" + "
" + " (with 70 Magic and 70 Dungeoneering)", "Members can now use " + "" + "celestial surgeboxes" + "" + ". (They also need level 70 Magic and level 70 Dungeoneering.)"); + case 13: + return newstruct cs2func_script_1012_struct(75, 5514, "Members: Giant pouch" + "
" + "Holds 12 extra essence", "Members can now use " + "" + "giant pouches" + "" + " to store 12 essence."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1012_struct(91, 18778, "Members: Starved ancient effigies", "Members can now investigate " + "" + "starved ancient effigies" + "" + " using their knowledge of Runecrafting."); + case 1: + return newstruct cs2func_script_1012_struct(93, 18779, "Members: Nourished ancient effigies", "Members can now investigate " + "" + "nourished ancient effigies" + "" + " using their knowledge of Runecrafting."); + case 2: + return newstruct cs2func_script_1012_struct(95, 18780, "Members: Sated ancient effigies", "Members can now investigate " + "" + "sated ancient effigies" + "" + " using their knowledge of Runecrafting."); + case 3: + return newstruct cs2func_script_1012_struct(97, 18781, "Members: Gorged ancient effigies", "Members can now investigate " + "" + "gorged ancient effigies" + "" + " using their knowledge of Runecrafting."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1012_struct(1, 12851, "Members: Stealing Creation - class 1 sacred clay", "Members can now craft runes from class 1 sacred clay in Stealing Creation."); + case 1: + return newstruct cs2func_script_1012_struct(20, 12851, "Members: Stealing Creation - class 2 sacred clay", "Members can now craft runes from class 2 sacred clay in Stealing Creation."); + case 2: + return newstruct cs2func_script_1012_struct(40, 12851, "Members: Stealing Creation - class 3 sacred clay", "Members can now craft runes from class 3 sacred clay in Stealing Creation."); + case 3: + return newstruct cs2func_script_1012_struct(60, 12851, "Members: Stealing Creation - class 4 sacred clay", "Members can now craft runes from class 4 sacred clay in Stealing Creation."); + case 4: + return newstruct cs2func_script_1012_struct(75, 21536, "Members: Pyramid Plunder - Engraved Sarcophagus", "Members can now open the engraved sarcophagus in Pyramid Plunder."); + case 5: + return newstruct cs2func_script_1012_struct(80, 12851, "Members: Stealing Creation - class 5 sacred clay", "Members can now craft runes from class 5 sacred clay in Stealing Creation."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1012_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Runecrafting level increases, you will be able to attempt higher-level runecrafting tasks within Daemonheim. You will also be more likely to succeed when attempting runecrafting tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1012_struct(10, 16997, "Water staff", "You can now craft " + "" + "water staves" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1012_struct(20, 17001, "Earth staff", "You can now craft " + "" + "earth staves" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_1012_struct(30, 17005, "Fire staff", "You can now craft " + "" + "fire staves" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1012_struct(40, 17009, "Air staff", "You can now craft " + "" + "air staves" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_1012_struct(50, 17013, "Catalytic staff", "You can now craft " + "" + "catalytic staves" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_1012_struct(60, 16999, "Members: Empowered water staff", "Members can now craft " + "" + "empowered water staves" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_1012_struct(70, 17003, "Members: Empowered earth staff", "Members can now craft " + "" + "empowered earth staves" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_1012_struct(80, 17007, "Members: Empowered fire staff", "Members can now craft " + "" + "empowered fire staves" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_1012_struct(90, 17011, "Members: Empowered air staff", "Members can now craft " + "" + "empowered air staves" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1012_struct(99, 17015, "Members: Empowered catalytic staff", "Members can now craft " + "" + "empowered catalytic staves" + "" + " within Daemonheim."); + } + break; + case 6: + SWITCH (arg1) { + case 0: + GOTO flow_103 + case 1: + GOTO flow_104 + } + break; + flow_103: + return newstruct cs2func_script_1012_struct(50, 13625, "Runecrafting Guild", "You can now enter the prestigious " + "" + "Runecrafting Guild" + "" + " and play the " + "" + "Great Orb Project" + "" + "."); + flow_104: + return newstruct cs2func_script_1012_struct(99, 9765, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Runecrafting" + "" + ". Members can visit " + "" + "Larriar" + "" + " in the " + "" + "Runecrafting Guild" + "" + ". She has something special that is only available to true masters of the " + "" + "Runecrafting" + "" + " skill!"); + } + return newstruct cs2func_script_1012_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1013.cs2 b/dumps/scripts/1013.cs2 new file mode 100644 index 000000000..75851b2c5 --- /dev/null +++ b/dumps/scripts/1013.cs2 @@ -0,0 +1,31 @@ +cs2func_script_1013_struct(1,1,0) script_1013(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1013_struct(1, "Allotments"); + case 1: + return newstruct cs2func_script_1013_struct(1, "Hops"); + case 2: + return newstruct cs2func_script_1013_struct(1, "Trees"); + case 3: + return newstruct cs2func_script_1013_struct(1, "Fruit Trees"); + case 4: + return newstruct cs2func_script_1013_struct(1, "Bushes"); + case 5: + return newstruct cs2func_script_1013_struct(1, "Flowers"); + case 6: + return newstruct cs2func_script_1013_struct(1, "Herbs"); + case 7: + return newstruct cs2func_script_1013_struct(1, "Special"); + case 8: + return newstruct cs2func_script_1013_struct(1, "Equipment"); + case 9: + return newstruct cs2func_script_1013_struct(1, "Other"); + case 10: + return newstruct cs2func_script_1013_struct(1, "Minigames"); + case 11: + return newstruct cs2func_script_1013_struct(1, "Dungeoneering"); + case 12: + return newstruct cs2func_script_1013_struct(1, "Milestones"); + } + return newstruct cs2func_script_1013_struct(-1, ""); +} diff --git a/dumps/scripts/1014.cs2 b/dumps/scripts/1014.cs2 new file mode 100644 index 000000000..8f75a1a71 --- /dev/null +++ b/dumps/scripts/1014.cs2 @@ -0,0 +1,291 @@ +cs2func_script_1014_struct(2,2,0) script_1014(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(1, 1942, "Potato", "You can now plant " + "" + "potatoes" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(5, 1957, "Onion", "You can now plant " + "" + "onions" + "" + "."); + case 2: + return newstruct cs2func_script_1014_struct(7, 1965, "Cabbage", "You can now plant " + "" + "cabbages" + "" + "."); + case 3: + return newstruct cs2func_script_1014_struct(12, 1982, "Tomato", "You can now plant " + "" + "tomatoes" + "" + "."); + case 4: + return newstruct cs2func_script_1014_struct(20, 5986, "Sweetcorn", "You can now plant " + "" + "sweetcorn" + "" + "."); + case 5: + return newstruct cs2func_script_1014_struct(31, 5504, "Strawberry", "You can now plant " + "" + "strawberries" + "" + "."); + case 6: + return newstruct cs2func_script_1014_struct(47, 5982, "Watermelon", "You can now plant " + "" + "watermelons" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(3, 6006, "Barley", "You can now plant " + "" + "barley" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(4, 5994, "Hammerstone hop", "You can now plant " + "" + "hammerstone hops" + "" + "."); + case 2: + return newstruct cs2func_script_1014_struct(8, 5996, "Asgarnian hop", "You can now plant " + "" + "Asgarnian hops" + "" + "."); + case 3: + return newstruct cs2func_script_1014_struct(13, 5931, "Jute plant", "You can now plant " + "" + "jute plants" + "" + "."); + case 4: + return newstruct cs2func_script_1014_struct(16, 5998, "Yanillian hop", "You can now plant " + "" + "Yanillian hops" + "" + "."); + case 5: + return newstruct cs2func_script_1014_struct(21, 6000, "Krandorian hop", "You can now plant " + "" + "Krandorian hops" + "" + "."); + case 6: + return newstruct cs2func_script_1014_struct(28, 6002, "Wildblood hop", "You can now plant " + "" + "wildblood hops" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(15, 1521, "Oak tree", "You can now plant " + "" + "oak trees" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(30, 1519, "Willow tree", "You can now plant " + "" + "willow trees" + "" + "."); + case 2: + return newstruct cs2func_script_1014_struct(45, 1517, "Maple tree", "You can now plant " + "" + "maple trees" + "" + "."); + case 3: + return newstruct cs2func_script_1014_struct(60, 1515, "Yew tree", "You can now plant " + "" + "yew trees" + "" + "."); + case 4: + return newstruct cs2func_script_1014_struct(75, 1513, "Magic tree", "You can now plant " + "" + "magic trees" + "" + "."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(27, 1955, "Apple tree", "You can now plant " + "" + "apple trees" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(33, 1963, "Banana tree", "You can now plant " + "" + "banana trees" + "" + "."); + case 2: + return newstruct cs2func_script_1014_struct(39, 2108, "Orange tree", "You can now plant " + "" + "orange trees" + "" + "."); + case 3: + return newstruct cs2func_script_1014_struct(42, 5970, "Curry tree", "You can now plant " + "" + "curry trees" + "" + "."); + case 4: + return newstruct cs2func_script_1014_struct(51, 2114, "Pineapple plant", "You can now plant " + "" + "pineapple plants" + "" + "."); + case 5: + return newstruct cs2func_script_1014_struct(57, 5972, "Papaya tree", "You can now plant " + "" + "papaya trees" + "" + "."); + case 6: + return newstruct cs2func_script_1014_struct(68, 5974, "Palm tree", "You can now plant " + "" + "palm trees" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(10, 1951, "Redberry bush", "You can now plant " + "" + "redberry bushes" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(22, 753, "Cadavaberry bush", "You can now plant " + "" + "cadavaberry bushes" + "" + "."); + case 2: + return newstruct cs2func_script_1014_struct(36, 2126, "Dwellberry bush", "You can now plant " + "" + "dwellberry bushes" + "" + "."); + case 3: + return newstruct cs2func_script_1014_struct(48, 247, "Jangerberry bush", "You can now plant " + "" + "jangerberry bushes" + "" + "."); + case 4: + return newstruct cs2func_script_1014_struct(59, 239, "White berry bush", "You can now plant " + "" + "white berry bushes" + "" + "."); + case 5: + return newstruct cs2func_script_1014_struct(70, 6018, "Poison ivy bush", "You can now plant " + "" + "poison ivy bushes" + "" + "."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(2, 6010, "Marigold" + "
" + " Protects onions, tomatoes and potatoes from disease", "You can now " + "" + "plant marigolds" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(11, 6014, "Rosemary" + "
" + " Protects cabbages from disease", "You can now plant " + "" + "rosemary" + "" + "."); + case 2: + return newstruct cs2func_script_1014_struct(24, 6012, "Nasturtium" + "
" + " Protects watermelons from disease", "You can now plant " + "" + "nasturtiums" + "" + "."); + case 3: + return newstruct cs2func_script_1014_struct(25, 5738, "Woad", "You can now plant " + "" + "woad" + "" + "."); + case 4: + return newstruct cs2func_script_1014_struct(26, 225, "Limpwurt", "You can now plant " + "" + "limpwurt" + "" + "."); + case 5: + return newstruct cs2func_script_1014_struct(52, 14583, "White lily" + "
" + " Protects all neighbouring fruit and vegetables from disease", "You can now plant " + "" + "white lilies" + "" + "."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(9, 249, "Guam", "You can now plant " + "" + "guam" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(14, 251, "Marrentill", "You can now plant " + "" + "marrentill" + "" + "."); + case 2: + return newstruct cs2func_script_1014_struct(19, 253, "Tarromin", "You can now plant " + "" + "tarromin" + "" + "."); + case 3: + return newstruct cs2func_script_1014_struct(26, 255, "Harralander", "You can now plant " + "" + "harralander" + "" + "."); + case 4: + return newstruct cs2func_script_1014_struct(29, 3261, "Goutweed" + "
" + " (after Eadgar's Ruse)", "You now have the Farming level required to plant " + "" + "goutweed" + "" + " (after Eadgar's Ruse)."); + case 5: + return newstruct cs2func_script_1014_struct(32, 257, "Ranarr", "You can now plant " + "" + "ranarr" + "" + "."); + case 6: + return newstruct cs2func_script_1014_struct(36, 12172, "Spirit weed", "You can now plant " + "" + "spirit weed" + "" + "."); + case 7: + return newstruct cs2func_script_1014_struct(38, 2998, "Toadflax", "You can now plant " + "" + "toadflax" + "" + "."); + case 8: + return newstruct cs2func_script_1014_struct(44, 259, "Irit", "You can now plant " + "" + "irit" + "" + "."); + case 9: + return newstruct cs2func_script_1014_struct(46, 14854, "Wergali", "You can now plant " + "" + "wergali" + "" + "."); + case 10: + return newstruct cs2func_script_1014_struct(50, 261, "Avantoe", "You can now plant " + "" + "avantoe" + "" + "."); + case 11: + return newstruct cs2func_script_1014_struct(56, 263, "Kwuarm", "You can now plant " + "" + "kwuarm" + "" + "."); + case 12: + return newstruct cs2func_script_1014_struct(58, 19989, "Erzille", "You can now plant " + "" + "erzille" + "" + " (in a vine herb patch)."); + case 13: + return newstruct cs2func_script_1014_struct(62, 3000, "Snapdragon", "You can now plant " + "" + "snapdragon" + "" + "."); + case 14: + return newstruct cs2func_script_1014_struct(65, 19990, "Argway", "You can now plant " + "" + "argway" + "" + " (in a vine herb patch)."); + case 15: + return newstruct cs2func_script_1014_struct(67, 265, "Cadantine", "You can now plant " + "" + "cadantine" + "" + "."); + case 16: + return newstruct cs2func_script_1014_struct(70, 19991, "Ugune", "You can now plant " + "" + "ugune" + "" + " (in a vine herb patch)."); + case 17: + return newstruct cs2func_script_1014_struct(73, 2481, "Lantadyme", "You can now plant " + "" + "lantadyme" + "" + "."); + case 18: + return newstruct cs2func_script_1014_struct(76, 19992, "Shengo", "You can now plant " + "" + "shengo" + "" + " (in a vine herb patch)."); + case 19: + return newstruct cs2func_script_1014_struct(79, 267, "Dwarf weed", "You can now plant " + "" + "dwarf weed" + "" + "."); + case 20: + return newstruct cs2func_script_1014_struct(80, 19993, "Samaden", "You can now plant " + "" + "samaden" + "" + " (in a vine herb patch)."); + case 21: + return newstruct cs2func_script_1014_struct(85, 269, "Torstol", "You can now plant " + "" + "torstol" + "" + "."); + case 22: + return newstruct cs2func_script_1014_struct(91, 21624, "Fellstalk", "You can now plant fellstalk" + "" + "."); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(42, 12134, "Evil turnip", "You can now plant " + "" + "evil turnips" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(53, 6004, "Bittercap mushroom", "You can now plant " + "" + "bittercap mushrooms" + "" + "."); + case 2: + return newstruct cs2func_script_1014_struct(53, 11779, "Jade vine" + "
" + " (after Back to My Roots)", "You now have the Farming level required to plant " + "" + "jade vines" + "" + " (after Back to my Roots)."); + case 3: + return newstruct cs2func_script_1014_struct(54, 19962, "Vine blossoms", "You can now plant " + "" + "vine blossoms" + "" + " (in a vine flower patch)."); + case 4: + return newstruct cs2func_script_1014_struct(55, 6016, "Cactus", "You can now plant " + "" + "cacti" + "" + "."); + case 5: + return newstruct cs2func_script_1014_struct(61, 19969, "Lergberry bush", "You can now plant " + "" + "lergberry bushes" + "" + " (in a vine bush patch)."); + case 6: + return newstruct cs2func_script_1014_struct(63, 2398, "Belladonna", "You can now plant " + "" + "belladonna" + "" + "."); + case 7: + return newstruct cs2func_script_1014_struct(72, 5980, "Calquat tree", "You can now plant " + "" + "calquat trees" + "" + "."); + case 8: + return newstruct cs2func_script_1014_struct(74, 21622, "Morchella mushroom", "You can now plant " + "" + "morchella mushrooms" + "" + "."); + case 9: + return newstruct cs2func_script_1014_struct(77, 19970, "Kalferberry bush", "You can now plant " + "" + "kalferberry bushes" + "" + " (in a vine bush patch)."); + case 10: + return newstruct cs2func_script_1014_struct(83, 6063, "Spirit tree" + "
" + " (only 1 planted at a time)", "You can now plant " + "" + "spirit trees" + "" + "."); + case 11: + return newstruct cs2func_script_1014_struct(86, 6063, "Spirit tree" + "
" + " (only 2 planted at a time, after Prisoner of Glouphrie)", "You now have the Farming level required to plant " + "" + "2 spirit trees" + "" + " (after Prisoner of Glouphrie)."); + } + break; + case 8: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(23, 6059, "Able to make and place a scarecrow", "You now have the ability to make and place a " + "" + "scarecrow" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(-1, 7620, "Scarecrows help to stop sweetcorn from being attacked by birds, while also helping to prevent disease.", ""); + case 2: + return newstruct cs2func_script_1014_struct(-1, 7620, "How to make a scarecrow:", ""); + case 3: + return newstruct cs2func_script_1014_struct(-1, 7620, "1. Fill an empty sack with straw from a haystack.", ""); + case 4: + return newstruct cs2func_script_1014_struct(-1, 7620, "2. Drive the hay sack onto a bronze spear.", ""); + case 5: + return newstruct cs2func_script_1014_struct(-1, 7620, "3. Place a watermelon at the very top as a head.", ""); + case 6: + return newstruct cs2func_script_1014_struct(-1, 7620, "4. Stand the scarecrow in an empty flower patch.", ""); + case 7: + return newstruct cs2func_script_1014_struct(25, 18336, "Scroll of life" + "
" + " (with 25 Dungeoneering)", "You can now use the " + "" + "scroll of life" + "" + ". (You also need level 25 Dungeoneering.)"); + } + break; + case 9: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(60, 20704, "Members: access to the Livid Farm (with 70 Magic, 60 Agility, 60 Crafting, 50 Construction and Lunar Diplomacy)", "Members can access the " + "" + "Livid Farm" + "" + " (with 70 Magic, 60 Agility, 60 Crafting, 50 Construction and Lunar Diplomacy)."); + case 1: + return newstruct cs2func_script_1014_struct(91, 18778, "Starved ancient effigies", "You can now investigate " + "" + "starved ancient effigies" + "" + " using your knowledge of Farming."); + case 2: + return newstruct cs2func_script_1014_struct(93, 18779, "Nourished ancient effigies", "You can now investigate " + "" + "nourished ancient effigies" + "" + " using your knowledge of Farming."); + case 3: + return newstruct cs2func_script_1014_struct(95, 18780, "Sated ancient effigies", "You can now investigate " + "" + "sated ancient effigies" + "" + " using your knowledge of Farming."); + case 4: + return newstruct cs2func_script_1014_struct(97, 18781, "Gorged ancient effigies", "You can now investigate " + "" + "gorged ancient effigies" + "" + " using your knowledge of Farming."); + } + break; + case 10: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(1, 12625, "Vinesweeper", "You can now play " + "" + "Vinesweeper" + "" + "."); + case 1: + return newstruct cs2func_script_1014_struct(1, 14667, "Nurture basic evil tree saplings", "You can now nurture " + "" + "basic evil tree saplings" + "" + "."); + case 2: + return newstruct cs2func_script_1014_struct(7, 14667, "Nurture evil oak tree saplings", "You can now nurture " + "" + "evil oak tree saplings" + "" + "."); + case 3: + return newstruct cs2func_script_1014_struct(15, 14667, "Nurture evil willow tree saplings", "You can now nurture " + "" + "evil willow tree saplings" + "" + "."); + case 4: + return newstruct cs2func_script_1014_struct(22, 14667, "Nurture evil maple tree saplings", "You can now nurture " + "" + "evil maple tree saplings" + "" + "."); + case 5: + return newstruct cs2func_script_1014_struct(30, 14667, "Nurture evil yew tree saplings", "You can now nurture " + "" + "evil yew tree saplings" + "" + "."); + case 6: + return newstruct cs2func_script_1014_struct(37, 14667, "Nurture evil magic tree saplings", "You can now nurture " + "" + "evil magic tree saplings" + "" + "."); + case 7: + return newstruct cs2func_script_1014_struct(42, 14667, "Nurture elder evil tree saplings", "You can now nurture " + "" + "elder evil tree saplings" + "" + "."); + } + break; + case 11: + switch (arg1) { + case 0: + return newstruct cs2func_script_1014_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Farming level increases, you will be able to attempt higher-level farming tasks within Daemonheim. You will also be more likely to succeed when attempting farming tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1014_struct(1, 17448, "Salve nettles", "You can now harvest " + "" + "salve nettles" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1014_struct(1, 17823, "Cave potato", "You can now plant " + "" + "cave potatoes" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_1014_struct(7, 17826, "Sagewort", "You can now plant " + "" + "sagewort" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1014_struct(10, 17450, "Wildercress", "You can now harvest " + "" + "wildercress" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_1014_struct(18, 17827, "Valerian", "You can now plant " + "" + "valerian" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_1014_struct(20, 17452, "Blightleaf", "You can now harvest " + "" + "blightleaves" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_1014_struct(29, 17828, "Aloe", "You can now plant " + "" + "aloe" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_1014_struct(30, 17454, "Roseblood", "You can now harvest " + "" + "roseblood" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_1014_struct(34, 17824, "Gissel mushroom", "You can now plant " + "" + "gissel mushrooms" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1014_struct(40, 17829, "Wormwood", "You can now plant " + "" + "wormwood" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_1014_struct(40, 17456, "Bryll", "You can now harvest " + "" + "bryll" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_1014_struct(50, 17458, "Duskweed", "You can now plant " + "" + "duskweed" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_1014_struct(51, 17830, "Magebane", "You can now plant " + "" + "magebane" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_1014_struct(60, 17460, "Soulbell", "You can now harvest " + "" + "soulbells" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_1014_struct(62, 17831, "Featherfoil", "You can now plant " + "" + "featherfoil" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_1014_struct(68, 17825, "Edicap mushroom", "You can now plant " + "" + "edicap mushrooms" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_1014_struct(70, 17462, "Ectograss", "You can now harvest " + "" + "ectograss" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_1014_struct(73, 17832, "Winter's grip", "You can now plant " + "" + "winter's grip" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_1014_struct(80, 17464, "Runeleaf", "You can now harvest " + "" + "runeleaves" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_1014_struct(84, 17833, "Lycopus", "You can now plant " + "" + "lycopus" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_1014_struct(90, 17466, "Spiritbloom", "You can now harvest " + "" + "spiritbloom" + "" + " within Daemonheim."); + case 22: + return newstruct cs2func_script_1014_struct(95, 17834, "Buckthorn", "You can now plant " + "" + "buckthorn" + "" + " within Daemonheim."); + } + break; + case 12: + if (((boolean)arg1)) { + return newstruct cs2func_script_1014_struct(99, 9810, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Farming" + "" + ". Why not visit " + "" + "Martin the Master Gardener" + "" + " in " + "" + "Draynor Village" + "" + "? He has something special that is only available to true masters of the " + "" + "Farming" + "" + " skill!"); + } + } + return newstruct cs2func_script_1014_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1015.cs2 b/dumps/scripts/1015.cs2 new file mode 100644 index 000000000..ac94c61a2 --- /dev/null +++ b/dumps/scripts/1015.cs2 @@ -0,0 +1,19 @@ +cs2func_script_1015_struct(1,1,0) script_1015(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1015_struct(0, "Ores"); + case 1: + return newstruct cs2func_script_1015_struct(0, "Equipment"); + case 2: + return newstruct cs2func_script_1015_struct(0, "Other"); + case 3: + return newstruct cs2func_script_1015_struct(1, "Shooting Stars"); + case 4: + return newstruct cs2func_script_1015_struct(1, "Minigames"); + case 5: + return newstruct cs2func_script_1015_struct(0, "Dungeoneering"); + case 6: + return newstruct cs2func_script_1015_struct(0, "Milestones"); + } + return newstruct cs2func_script_1015_struct(-1, ""); +} diff --git a/dumps/scripts/1016.cs2 b/dumps/scripts/1016.cs2 new file mode 100644 index 000000000..d27558ec9 --- /dev/null +++ b/dumps/scripts/1016.cs2 @@ -0,0 +1,202 @@ +cs2func_script_1016_struct(2,2,0) script_1016(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1016_struct(1, 1436, "Rune essence" + "
" + " (after Rune Mysteries)", "You now have the Mining level required to mine " + "" + "rune essence" + "" + " (after Rune Mysteries)."); + case 1: + return newstruct cs2func_script_1016_struct(1, 434, "Clay", "You can now mine " + "" + "clay" + "" + "."); + case 2: + return newstruct cs2func_script_1016_struct(1, 436, "Copper ore", "You can now mine " + "" + "copper ore" + "" + "."); + case 3: + return newstruct cs2func_script_1016_struct(1, 438, "Tin ore", "You can now mine " + "" + "tin ore" + "" + "."); + case 4: + return newstruct cs2func_script_1016_struct(10, 3211, "Members: Limestone", "Members can now mine " + "" + "limestone" + "" + "."); + case 5: + return newstruct cs2func_script_1016_struct(10, 668, "Blurite ore", "You can now mine " + "" + "blurite ore" + "" + "."); + case 6: + return newstruct cs2func_script_1016_struct(15, 440, "Iron ore", "You can now mine " + "" + "iron ore" + "" + "."); + case 7: + return newstruct cs2func_script_1016_struct(20, 2892, "Members: Elemental ore" + "
" + " (after starting Elemental Workshop)", "Members now have the Mining level required to mine " + "" + "elemental ore" + "" + " (after starting Elemental Workshop)."); + case 8: + return newstruct cs2func_script_1016_struct(20, 442, "Silver ore", "You can now mine " + "" + "silver ore" + "" + "."); + case 9: + return newstruct cs2func_script_1016_struct(30, 453, "Coal", "You can now mine " + "" + "coal" + "" + "."); + case 10: + return newstruct cs2func_script_1016_struct(30, 7936, "Members: Pure essence" + "
" + " (after Rune Mysteries)", "Members now have the Mining level required to mine " + "" + "pure essence" + "" + " (after Rune Mysteries)."); + case 11: + return newstruct cs2func_script_1016_struct(35, 6977, "Members: Sandstone", "Members can now mine " + "" + "sandstone" + "" + "."); + case 12: + return newstruct cs2func_script_1016_struct(40, 444, "Gold", "You can now mine " + "" + "gold" + "" + "."); + case 13: + return newstruct cs2func_script_1016_struct(45, 6983, "Members: Granite", "Members can now mine " + "" + "granite."); + case 14: + return newstruct cs2func_script_1016_struct(46, 12630, "Members: Rubium ore" + "
" + " (after Kennith's Concerns)", "Members can now mine " + "" + "rubium ore" + "" + " (after Kennith's Concerns)."); + case 15: + return newstruct cs2func_script_1016_struct(55, 447, "Mithril ore", "You can now mine " + "" + "mithril ore" + "" + "."); + case 16: + return newstruct cs2func_script_1016_struct(70, 449, "Adamantite ore", "You can now mine " + "" + "adamantite ore" + "" + "."); + case 17: + return newstruct cs2func_script_1016_struct(77, 21778, "Members: Bane ore" + "
" + " (after Ritual of the Mahjarrat)", "Members can now mine " + "" + "bane ore" + "" + " (after Ritual of the Mahjarrat)."); + case 18: + return newstruct cs2func_script_1016_struct(85, 451, "Runite ore", "You can now mine " + "" + "runite ore" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1016_struct(1, 21340, "Members: Dwarven Army Axe", "Members can now use a " + "" + "Dwarven Army Axe" + "" + "."); + case 1: + return newstruct cs2func_script_1016_struct(1, 1265, "Bronze pickaxe", "You can now use " + "" + "bronze pickaxes" + "" + "."); + case 2: + return newstruct cs2func_script_1016_struct(1, 1267, "Iron pickaxe", "You can now use " + "" + "iron pickaxes" + "" + "."); + case 3: + return newstruct cs2func_script_1016_struct(6, 1269, "Steel pickaxe", "You can now use " + "" + "steel pickaxes" + "" + "."); + case 4: + return newstruct cs2func_script_1016_struct(21, 1273, "Mithril pickaxe", "You can now use " + "" + "mithril pickaxes" + "" + "."); + case 5: + return newstruct cs2func_script_1016_struct(31, 1271, "Adamant pickaxe", "You can now use " + "" + "adamant pickaxes" + "" + "."); + case 6: + return newstruct cs2func_script_1016_struct(35, 18339, "Coal bag" + "
" + " (with 35 Dungeoneering)", "You can now use " + "" + "coal bags" + "" + ". (You also need level 35 Dungeoneering.)"); + case 7: + return newstruct cs2func_script_1016_struct(40, 14107, "Members: Sacred clay pickaxe", "Members can now use " + "" + "sacred clay pickaxes" + "" + "."); + case 8: + return newstruct cs2func_script_1016_struct(40, 14099, "Members: Volatile pickaxe", "Members can now use " + "" + "volatile pickaxes" + "" + "."); + case 9: + return newstruct cs2func_script_1016_struct(41, 1275, "Rune pickaxe", "You can now use " + "" + "rune pickaxes" + "" + "."); + case 10: + return newstruct cs2func_script_1016_struct(41, 13661, "Members: Inferno Adze" + "
" + " (after All Fired Up, with 92 Firemaking)", "Members can now use the " + "" + "Inferno Adze" + "" + " to mine with (after All Fired Up and with level 92 Firemaking)."); + case 11: + return newstruct cs2func_script_1016_struct(61, 15259, "Members: Dragon pickaxe", "Members can now use " + "" + "dragon pickaxes" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1016_struct(40, 1603, "Members: Gem rocks" + "
" + " (after Shilo Village)", "Members now have the Mining level required to mine " + "" + "gem rocks" + "" + " (after Shilo Village)."); + case 1: + return newstruct cs2func_script_1016_struct(41, 13245, "Members: Stone slab" + "
" + " (with rune pickaxe, after starting TokTz-Ket-Dill)", "Members now have the Mining level required to mine " + "" + "stone slabs" + "" + " with rune pickaxes (after starting TokTz-Ket-Dill)."); + case 2: + return newstruct cs2func_script_1016_struct(73, 15263, "Members: Living rock remains", "Members now have the Mining level required to mine " + "" + "living rock remains" + "" + "."); + case 3: + return newstruct cs2func_script_1016_struct(77, 453, "Members: Concentrated coal deposits", "Members now have the Mining level required to mine " + "" + "concentrated coal deposits" + "" + "."); + case 4: + return newstruct cs2func_script_1016_struct(80, 444, "Members: Concentrated gold deposits", "Members now have the Mining level required to mine " + "" + "concentrated gold deposits" + "" + "."); + case 5: + return newstruct cs2func_script_1016_struct(91, 18778, "Members: Starved ancient effigies", "Members can now investigate " + "" + "starved ancient effigies" + "" + " using their knowledge of Mining."); + case 6: + return newstruct cs2func_script_1016_struct(93, 18779, "Members: Nourished ancient effigies", "Members can now investigate " + "" + "nourished ancient effigies" + "" + " using their knowledge of Mining."); + case 7: + return newstruct cs2func_script_1016_struct(95, 18780, "Members: Sated ancient effigies", "Members can now investigate " + "" + "sated ancient effigies" + "" + " using their knowledge of Mining."); + case 8: + return newstruct cs2func_script_1016_struct(97, 18781, "Members: Gorged ancient effigies", "Members can now investigate " + "" + "gorged ancient effigies" + "" + " using their knowledge of Mining."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1016_struct(10, 13727, "Members: Size-1 stars", "Members can now mine size-1 " + "" + "crashed stars" + "" + "."); + case 1: + return newstruct cs2func_script_1016_struct(20, 13727, "Members: Size-2 stars", "Members can now mine size-2 " + "" + "crashed stars" + "" + "."); + case 2: + return newstruct cs2func_script_1016_struct(30, 13727, "Members: Size-3 stars", "Members can now mine size-3 " + "" + "crashed stars" + "" + "."); + case 3: + return newstruct cs2func_script_1016_struct(40, 13727, "Members: Size-4 stars", "Members can now mine size-4 " + "" + "crashed stars" + "" + "."); + case 4: + return newstruct cs2func_script_1016_struct(50, 13727, "Members: Size-5 stars", "Members can now mine size-5 " + "" + "crashed stars" + "" + "."); + case 5: + return newstruct cs2func_script_1016_struct(60, 13727, "Members: Size-6 stars", "Members can now mine size-6 " + "" + "crashed stars" + "" + "."); + case 6: + return newstruct cs2func_script_1016_struct(70, 13727, "Members: Size-7 stars", "Members can now mine size-7 " + "" + "crashed stars" + "" + "."); + case 7: + return newstruct cs2func_script_1016_struct(80, 13727, "Members: Size-8 stars", "Members can now mine size-8 " + "" + "crashed stars" + "" + "."); + case 8: + return newstruct cs2func_script_1016_struct(90, 13727, "Members: Size-9 stars", "Members can now mine size-9 " + "" + "crashed stars" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1016_struct(1, 14122, "Members: Stealing Creation - class 1 pickaxe", "Members can now use " + "" + "class 1 pickaxes" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_1016_struct(20, 14184, "Members: Stealing Creation - mine class 2 sacred clay", "Members can now mine " + "" + "class 2 sacred clay" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_1016_struct(20, 14124, "Members: Stealing Creation - class 2 pickaxe", "Members can now use " + "" + "class 2 pickaxes" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_1016_struct(40, 14186, "Members: Stealing Creation - mine class 3 sacred clay", "Members can now mine " + "" + "class 3 sacred clay" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_1016_struct(40, 14126, "Members: Stealing Creation - class 3 pickaxe", "Members can now use " + "" + "class 3 pickaxes" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_1016_struct(60, 14188, "Members: Stealing Creation - mine class 4 sacred clay", "Members can now mine " + "" + "class 4 sacred clay" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_1016_struct(60, 14128, "Members: Stealing Creation - class 4 pickaxe", "Members can now use " + "" + "class 4 pickaxes" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_1016_struct(80, 14190, "Members: Stealing Creation - mine class 5 sacred clay", "Members can now mine " + "" + "class 5 sacred clay" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_1016_struct(80, 14130, "Members: Stealing Creation - class 5 pickaxe", "Members can now use " + "" + "class 5 pickaxes" + "" + " in Stealing Creation."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1016_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Mining level increases, you will be able to attempt higher-level mining tasks within Daemonheim. You will also be more likely to succeed when attempting mining tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1016_struct(1, 17630, "Novite ore (Tier 1)", "You can now mine " + "" + "novite ore" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1016_struct(1, 16295, "Novite pickaxe (Tier 1)", "You can now use " + "" + "novite pickaxes" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_1016_struct(10, 17632, "Bathus ore (Tier 2)", "You can now mine " + "" + "bathus ore" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1016_struct(10, 16297, "Bathus pickaxe (Tier 2)", "You can now use " + "" + "bathus pickaxes" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_1016_struct(20, 17634, "Marmaros ore (Tier 3)", "You can now mine " + "" + "marmaros ore" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_1016_struct(20, 16299, "Marmaros pickaxe (Tier 3)", "You can now use " + "" + "marmaros pickaxes" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_1016_struct(30, 17636, "Kratonium ore (Tier 4)", "You can now mine " + "" + "kratonite ore" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_1016_struct(30, 16301, "Kratonite pickaxe (Tier 4)", "You can now use " + "" + "kratonite pickaxes" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_1016_struct(40, 17638, "Fractite ore (Tier 5)", "You can now mine " + "" + "fractite ore" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1016_struct(40, 16303, "Fractite pickaxe (Tier 5)", "You can now use " + "" + "fractite pickaxes" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_1016_struct(50, 17640, "Members: Zephyrium ore (Tier 6)", "Members can now mine " + "" + "zephyrium ore" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_1016_struct(50, 16305, "Members: Zephyrium pickaxe (Tier 6)", "Members can now use " + "" + "zephyrium pickaxes" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_1016_struct(60, 17642, "Members: Argonite ore (Tier 7)", "Members can now mine " + "" + "argonite ore" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_1016_struct(60, 16307, "Members: Argonite pickaxe (Tier 7)", "Members can now use " + "" + "argonite pickaxes" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_1016_struct(70, 17644, "Members: Katagon ore (Tier 8)", "Members can now mine " + "" + "katagon ore" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_1016_struct(70, 16309, "Members: Katagon pickaxe (Tier 8)", "Members can now use " + "" + "katagon pickaxes" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_1016_struct(80, 17646, "Members: Gorgonite ore (Tier 9)", "Members can now mine " + "" + "gorgonite ore" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_1016_struct(80, 16311, "Members: Gorgonite pickaxe (Tier 9)", "Members can now use " + "" + "gorgonite pickaxes" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_1016_struct(90, 17648, "Members: Promethium ore (Tier 10)", "Members can now mine " + "" + "promethium ore" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_1016_struct(90, 16313, "Members: Promethium pickaxe (Tier 10)", "Members can now use " + "" + "promethium pickaxes" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_1016_struct(99, 16315, "Members: Primal pickaxe (Tier 11)", "Members can now use primal pickaxes" + "" + " within Daemonheim."); + } + break; + case 6: + SWITCH (arg1) { + case 0: + GOTO flow_94 + case 1: + GOTO flow_95 + } + break; + flow_94: + return newstruct cs2func_script_1016_struct(60, 447, "Mining Guild", "You can now enter the world-famous " + "" + "Mining Guild" + "" + "."); + flow_95: + return newstruct cs2func_script_1016_struct(99, 9792, "Skill mastery", "" + "Congratulations! You are now a master miner. Members can visit the " + "" + "dwarf" + "" + " who guards the entrance to the " + "" + "Mining Guild" + "" + ". He has something special that is only available to true masters of the " + "" + "Mining" + "" + " skill!"); + } + return newstruct cs2func_script_1016_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1017.cs2 b/dumps/scripts/1017.cs2 new file mode 100644 index 000000000..01e1e60bf --- /dev/null +++ b/dumps/scripts/1017.cs2 @@ -0,0 +1,37 @@ +cs2func_script_1017_struct(1,1,0) script_1017(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1017_struct(0, "Meats"); + case 1: + return newstruct cs2func_script_1017_struct(0, "Bread"); + case 2: + return newstruct cs2func_script_1017_struct(0, "Pies"); + case 3: + return newstruct cs2func_script_1017_struct(0, "Stews"); + case 4: + return newstruct cs2func_script_1017_struct(0, "Pizzas"); + case 5: + return newstruct cs2func_script_1017_struct(0, "Cakes"); + case 6: + return newstruct cs2func_script_1017_struct(0, "Wine"); + case 7: + return newstruct cs2func_script_1017_struct(1, "Hot Drinks"); + case 8: + return newstruct cs2func_script_1017_struct(1, "Brewing"); + case 9: + return newstruct cs2func_script_1017_struct(1, "Potatoes & Toppings"); + case 10: + return newstruct cs2func_script_1017_struct(1, "Dairy"); + case 11: + return newstruct cs2func_script_1017_struct(1, "Gnome"); + case 12: + return newstruct cs2func_script_1017_struct(0, "Other"); + case 13: + return newstruct cs2func_script_1017_struct(1, "Minigames"); + case 14: + return newstruct cs2func_script_1017_struct(0, "Dungeoneering"); + case 15: + return newstruct cs2func_script_1017_struct(0, "Milestones"); + } + return newstruct cs2func_script_1017_struct(-1, ""); +} diff --git a/dumps/scripts/1018.cs2 b/dumps/scripts/1018.cs2 new file mode 100644 index 000000000..f129f784a --- /dev/null +++ b/dumps/scripts/1018.cs2 @@ -0,0 +1,514 @@ +cs2func_script_1018_struct(2,2,0) script_1018(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(1, 2142, "Meat", "You can now cook " + "" + "meat" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(1, 9436, "Members: Sinew", "You can now make " + "" + "sinew" + "" + " by drying beef or bear meat on a range."); + case 2: + return newstruct cs2func_script_1018_struct(1, 315, "Shrimp", "You can now cook " + "" + "shrimp" + "" + "."); + case 3: + return newstruct cs2func_script_1018_struct(1, 13433, "Crayfish", "You can now cook " + "" + "crayfish" + "" + "."); + case 4: + return newstruct cs2func_script_1018_struct(1, 2140, "Chicken", "You can now cook " + "" + "chicken" + "" + "."); + case 5: + return newstruct cs2func_script_1018_struct(1, 3228, "Members: Rabbit", "Members can now cook " + "" + "rabbits" + "" + "."); + case 6: + return newstruct cs2func_script_1018_struct(1, 319, "Anchovies", "You can now cook " + "" + "anchovies" + "" + "."); + case 7: + return newstruct cs2func_script_1018_struct(1, 325, "Sardine", "You can now cook " + "" + "sardines" + "" + "."); + case 8: + return newstruct cs2func_script_1018_struct(1, 3151, "Members: Karambwanji", "Members can now cook " + "" + "karambwanji" + "" + "."); + case 9: + return newstruct cs2func_script_1018_struct(1, 3146, "Members: Karambwan", "Members can now cook " + "" + "karambwan" + "" + "."); + case 10: + return newstruct cs2func_script_1018_struct(1, 1885, "Members: Ugthanki kebab", "Members can now cook " + "" + "ugthanki kebabs" + "" + "."); + case 11: + return newstruct cs2func_script_1018_struct(5, 347, "Herring", "You can now cook " + "" + "herring" + "" + "."); + case 12: + return newstruct cs2func_script_1018_struct(10, 355, "Members: Mackerel", "Members can now cook " + "" + "mackerel" + "" + "."); + case 13: + return newstruct cs2func_script_1018_struct(11, 9980, "Members: Roasted bird meat", "Members can now roast " + "" + "bird meat" + "" + " on an iron spit."); + case 14: + return newstruct cs2func_script_1018_struct(12, 3369, "Members: Thin snail", "Members can now cook " + "" + "thin snails" + "" + "."); + case 15: + return newstruct cs2func_script_1018_struct(15, 333, "Trout", "You can now cook " + "" + "trout" + "" + "."); + case 16: + return newstruct cs2func_script_1018_struct(16, 6297, "Members: Spider", "Members can now cook " + "" + "spiders" + "" + "."); + case 17: + return newstruct cs2func_script_1018_struct(16, 7223, "Members: Roasted rabbit", "Members can now roast " + "" + "rabbits" + "" + " on a spit."); + case 18: + return newstruct cs2func_script_1018_struct(17, 3371, "Members: Lean snail", "Members can now cook " + "" + "lean snails" + "" + "."); + case 19: + return newstruct cs2func_script_1018_struct(18, 339, "Members: Cod", "Members can now cook " + "" + "cod" + "" + "."); + case 20: + return newstruct cs2func_script_1018_struct(20, 351, "Pike", "You can now cook " + "" + "pike" + "" + "."); + case 21: + return newstruct cs2func_script_1018_struct(21, 9988, "Members: Roasted beast meat", "Members can now roast " + "" + "beast meat" + "" + " on a spit."); + case 22: + return newstruct cs2func_script_1018_struct(21, 7521, "Members: Giant crab meat", "Members can now cook " + "" + "giant crab meat" + "" + "."); + case 23: + return newstruct cs2func_script_1018_struct(22, 3373, "Members: Fat snail", "Members can now cook " + "" + "fat snails" + "" + "."); + case 24: + return newstruct cs2func_script_1018_struct(25, 329, "Salmon", "You can now cook " + "" + "salmon" + "" + "."); + case 25: + return newstruct cs2func_script_1018_struct(28, 3381, "Members: Slimy eel", "Members can now cook " + "" + "slimy eels" + "" + "."); + case 26: + return newstruct cs2func_script_1018_struct(30, 361, "Tuna", "You can now cook " + "" + "tuna" + "" + "."); + case 27: + return newstruct cs2func_script_1018_struct(30, 2878, "Members: Roasted chompy", "Members can now roast " + "" + "chompies" + "" + " on a spit."); + case 28: + return newstruct cs2func_script_1018_struct(31, 7530, "Members: Fishcake", "Members can now cook " + "" + "fishcakes" + "" + "."); + case 29: + return newstruct cs2func_script_1018_struct(35, 10136, "Members: Rainbow fish", "Members can now cook " + "" + "rainbow fish" + "" + "."); + case 30: + return newstruct cs2func_script_1018_struct(38, 5003, "Members: Cave eel", "Members can now cook " + "" + "cave eels" + "" + "."); + case 31: + return newstruct cs2func_script_1018_struct(40, 379, "Lobster", "You can now cook " + "" + "lobsters" + "" + "."); + case 32: + return newstruct cs2func_script_1018_struct(41, 7568, "Members: Jubbly", "Members can now cook " + "" + "jubblies" + "" + "."); + case 33: + return newstruct cs2func_script_1018_struct(43, 365, "Members: Bass", "Members can now cook " + "" + "bass" + "" + "."); + case 34: + return newstruct cs2func_script_1018_struct(45, 373, "Swordfish", "You can now cook " + "" + "swordfish" + "" + "."); + case 35: + return newstruct cs2func_script_1018_struct(50, 2343, "Members: Oomlie wrap", "Members can now cook " + "" + "oomlie wraps" + "" + "."); + case 36: + return newstruct cs2func_script_1018_struct(53, 2149, "Members: Lava eel", "Members can now cook " + "" + "lava eels" + "" + "."); + case 37: + return newstruct cs2func_script_1018_struct(62, 7946, "Members: Monkfish", "Members can now cook " + "" + "monkfish" + "" + "."); + case 38: + return newstruct cs2func_script_1018_struct(80, 385, "Members: Shark", "Members can now cook " + "" + "sharks" + "" + "."); + case 39: + return newstruct cs2func_script_1018_struct(82, 397, "Members: Sea turtle", "Members can now cook " + "" + "sea turtles" + "" + "."); + case 40: + return newstruct cs2func_script_1018_struct(88, 15266, "Members: Cavefish", "Members can now cook " + "" + "cavefish" + "" + "."); + case 41: + return newstruct cs2func_script_1018_struct(91, 391, "Members: Manta ray", "Members can now cook " + "" + "manta rays" + "" + "."); + case 42: + return newstruct cs2func_script_1018_struct(93, 15272, "Members: Rocktail", "Members can now cook " + "" + "rocktails" + "" + "."); + case 43: + return newstruct cs2func_script_1018_struct(95, 21521, "Members: Tiger shark", "Members can now cook " + "" + "tiger sharks" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(1, 2309, "Bread", "You can now bake " + "" + "bread" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(58, 1865, "Members: Pitta bread", "Members can now bake " + "" + "pitta bread" + "" + "."); + case 2: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make bread:", ""); + case 3: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Pick some grain and take it to a windmill to make flour.", ""); + case 4: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Use a pot to collect the flour you have made.", ""); + case 5: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. Fill a bucket or jug with water from a sink or fountain.", ""); + case 6: + return newstruct cs2func_script_1018_struct(-1, 7620, "4. Mix the flour and water to make some bread dough.", ""); + case 7: + return newstruct cs2func_script_1018_struct(-1, 7620, "5. Cook the dough by using it with a stove.", ""); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(10, 2325, "Redberry pie", "You can now bake " + "" + "redberry pies" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(20, 2327, "Meat pie", "You can now bake " + "" + "meat pies" + "" + "."); + case 2: + return newstruct cs2func_script_1018_struct(29, 7170, "Members: Mud pie", "Members can now bake " + "" + "mud pies" + "" + "."); + case 3: + return newstruct cs2func_script_1018_struct(30, 2323, "Apple pie", "You can now bake " + "" + "apple pies" + "" + "."); + case 4: + return newstruct cs2func_script_1018_struct(34, 7178, "Members: Garden pie", "Members can now bake " + "" + "garden pies" + "" + "."); + case 5: + return newstruct cs2func_script_1018_struct(47, 7188, "Members: Fish pie", "Members can now bake " + "" + "fish pies" + "" + "."); + case 6: + return newstruct cs2func_script_1018_struct(70, 7198, "Members: Admiral pie", "Members can now bake " + "" + "admiral pies" + "" + "."); + case 7: + return newstruct cs2func_script_1018_struct(85, 7208, "Members: Wild pie", "Members can now bake " + "" + "wild pies" + "" + "."); + case 8: + return newstruct cs2func_script_1018_struct(95, 7218, "Members: Summer pie", "Members can now bake " + "" + "summer pies" + "" + "."); + case 9: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make a pie:", ""); + case 10: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Mix flour and water to make pastry dough.", ""); + case 11: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Place the dough in an empty pie dish.", ""); + case 12: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. Use your choice of filling with the empty pie (refer to pie recipe book).", ""); + case 13: + return newstruct cs2func_script_1018_struct(-1, 7620, "4. Cook the pie by using it with a stove.", ""); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(25, 2003, "Stew", "You can now make " + "" + "stews" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(60, 2011, "Members: Curry", "Members can now make " + "" + "curries" + "" + "."); + case 2: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make stew:", ""); + case 3: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Obtain a bowl and fill it with water from a sink or fountain.", ""); + case 4: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Pick a potato and place it in the bowl.", ""); + case 5: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. Cook some meat and place it in the bowl.", ""); + case 6: + return newstruct cs2func_script_1018_struct(-1, 7620, "4. Cook the stew by using it with a stove or fire.", ""); + case 7: + return newstruct cs2func_script_1018_struct(-1, 7620, "After completing Evil Dave's subquest from Recipe for Disaster, I can add spices to cooked stew.", ""); + case 8: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make curry: make uncooked stew as above. Before cooking, add some spices or 3 curry leaves.", ""); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(35, 2289, "Plain pizza", "You can now cook " + "" + "plain pizzas" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(45, 2293, "Meat pizza", "You can now cook " + "" + "meat pizzas" + "" + "."); + case 2: + return newstruct cs2func_script_1018_struct(55, 2297, "Anchovy pizza", "You can now cook " + "" + "anchovy pizzas" + "" + "."); + case 3: + return newstruct cs2func_script_1018_struct(65, 2301, "Members: Pineapple pizza", "Members can now make " + "" + "pineapple pizzas" + "" + "."); + case 4: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make a pizza:", ""); + case 5: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Mix flour and water to make a pizza base.", ""); + case 6: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Add a tomato to the pizza.", ""); + case 7: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. Add some cheese to the pizza.", ""); + case 8: + return newstruct cs2func_script_1018_struct(-1, 7620, "4. Cook the pizza by using it with a stove.", ""); + case 9: + return newstruct cs2func_script_1018_struct(-1, 7620, "5. Add your choice of topping to the pizza.", ""); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(40, 1891, "Cake", "You can now bake " + "" + "cakes" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(50, 1897, "Chocolate cake", "You can now bake " + "" + "chocolate cakes" + "" + "."); + case 2: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make a cake:", ""); + case 3: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Mix flour, eggs and milk together in a cake tin.", ""); + case 4: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Cook the cake by using it with a stove.", ""); + case 5: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. Optional: Buy some chocolate and add it to the cake to make a chocolate cake.", ""); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(35, 1993, "Wine", "You can now ferment " + "" + "wine" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make wine:", ""); + case 2: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Fill a jug with water.", ""); + case 3: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Use grapes with the jug of water.", ""); + case 4: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. Wait until the wine ferments.", ""); + case 5: + return newstruct cs2func_script_1018_struct(-1, 7620, "The wine will ferment while left in your inventory or the bank.", ""); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(20, 4242, "Nettle tea", "Members can now make " + "" + "nettle tea" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make nettle tea:", ""); + case 2: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Fill a bowl with water.", ""); + case 3: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Put some picked nettles into the bowl of water.", ""); + case 4: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. Boil the nettle-water by using it with a range or a fire.", ""); + case 5: + return newstruct cs2func_script_1018_struct(-1, 7620, "4. Use the bowl of nettle tea with a cup.", ""); + case 6: + return newstruct cs2func_script_1018_struct(-1, 7620, "5. If you take milk, use a bucket of milk on the nettle tea.", ""); + } + break; + case 8: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(14, 5763, "Members: Cider" + "
" + "4 Apple mush", "Members can now make " + "" + "apple mush" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(19, 1913, "Members: Dwarven Stout" + "
" + "4 Hammerstone hops", "Members can now brew " + "" + "Dwarven Stout" + "" + "."); + case 2: + return newstruct cs2func_script_1018_struct(24, 1905, "Members: Asgarnian Ale" + "
" + "4 Asgarnian hops", "Members can now brew " + "" + "Asgarnian Ale" + "" + "."); + case 3: + return newstruct cs2func_script_1018_struct(29, 1909, "Members: Greenman's Ale" + "
" + "4 Harralander leaves", "Members can now brew " + "" + "Greenman's Ale" + "" + "."); + case 4: + return newstruct cs2func_script_1018_struct(34, 1907, "Members: Wizard's mind bomb" + "
" + "4 Yanillian hops", "Members can now brew " + "" + "Wizard's Mind Bomb" + "" + "."); + case 5: + return newstruct cs2func_script_1018_struct(39, 1911, "Members: Dragon Bitter" + "
" + "4 Krandorian hops", "Members can now brew " + "" + "Dragon Bitter" + "" + "."); + case 6: + return newstruct cs2func_script_1018_struct(44, 2955, "Members: Moonlight Mead" + "
" + "4 Bittercap mushrooms", "Members can now brew " + "" + "Moonlight Mead" + "" + "."); + case 7: + return newstruct cs2func_script_1018_struct(49, 5751, "Members: Axeman's folly" + "
" + "1 Oak root", "Members can now brew " + "" + "Axeman's Folly" + "" + "."); + case 8: + return newstruct cs2func_script_1018_struct(54, 5755, "Members: Chef's Delight" + "
" + "4 Portions of chocolate dust", "Members can now brew " + "" + "Chef's Delight" + "" + "."); + case 9: + return newstruct cs2func_script_1018_struct(59, 5759, "Members: Slayer's Respite" + "
" + "4 Wildblood hops", "Members can now brew " + "" + "Slayer's Respite" + "" + "."); + } + break; + case 9: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(7, 6701, "Members: Baked potato", "Members can now cook " + "" + "baked potatoes" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(9, 7072, "Members: Spicy sauce (topping ingredient)", "Members can now make " + "" + "spicy sauce" + "" + " toppings."); + case 2: + return newstruct cs2func_script_1018_struct(11, 7062, "Members: Chilli con carne (topping)", "Members can now make " + "" + "chilli con carne" + "" + " toppings."); + case 3: + return newstruct cs2func_script_1018_struct(13, 7078, "Members: Scrambled egg (topping ingredient)", "Members can now make " + "" + "scrambled egg" + "" + " toppings."); + case 4: + return newstruct cs2func_script_1018_struct(23, 7064, "Members: Scrambled egg and tomato (topping)", "Members can now make " + "" + "scrambled egg and tomato" + "" + " toppings."); + case 5: + return newstruct cs2func_script_1018_struct(28, 5988, "Members: Sweetcorn", "Members can now cook " + "" + "sweetcorn" + "" + "."); + case 6: + return newstruct cs2func_script_1018_struct(39, 6703, "Members: Baked potato with butter", "Members can now cook " + "" + "baked potatoes with butter" + "" + "."); + case 7: + return newstruct cs2func_script_1018_struct(41, 7054, "Members: Baked potato with chilli con carne", "Members can now cook " + "" + "baked potatoes with chilli con carne" + "" + "."); + case 8: + return newstruct cs2func_script_1018_struct(42, 7084, "Members: Fried onion (topping ingredient)", "Members can now make " + "" + "fried onion" + "" + " toppings."); + case 9: + return newstruct cs2func_script_1018_struct(46, 7082, "Members: Fried mushroom (topping ingredient)", "Members can now make " + "" + "fried mushroom" + "" + " toppings."); + case 10: + return newstruct cs2func_script_1018_struct(47, 6705, "Members: Baked potato with butter and cheese", "Members can now cook " + "" + "baked potatoes with butter and cheese" + "" + "."); + case 11: + return newstruct cs2func_script_1018_struct(51, 7056, "Members: Baked potato with egg and tomato", "Members can now cook " + "" + "baked potatoes with egg and tomato" + "" + "."); + case 12: + return newstruct cs2func_script_1018_struct(57, 7066, "Members: Fried mushroom and onion (topping)", "Members can now make " + "" + "fried mushroom and onion" + "" + " toppings."); + case 13: + return newstruct cs2func_script_1018_struct(64, 7058, "Members: Baked potato with mushroom and onion", "Members can now cook " + "" + "baked potatoes with mushroom and onion" + "" + "."); + case 14: + return newstruct cs2func_script_1018_struct(67, 7068, "Members: Tuna and sweetcorn (topping)", "Members can now make " + "" + "tuna and sweetcorn" + "" + " toppings."); + case 15: + return newstruct cs2func_script_1018_struct(68, 7060, "Members: Baked potato with tuna and sweetcorn", "Members can now cook " + "" + "baked potatoes with tuna and sweetcorn" + "" + "."); + case 16: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make baked potatoes with toppings:", ""); + case 17: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Bake the potato on a range.", ""); + case 18: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Add some butter.", ""); + case 19: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. If needed, combine topping ingredients by chopping them into a bowl.", ""); + case 20: + return newstruct cs2func_script_1018_struct(-1, 7620, "Ingredients for toppings:", ""); + case 21: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Chilli con carne: meat and spicy sauce (made from garlic and gnome spice)", ""); + case 22: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Egg and tomato: scrambled egg and tomato", ""); + case 23: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. Mushroom and onion: fried bittercap mushroom and fried onion", ""); + case 24: + return newstruct cs2func_script_1018_struct(-1, 7620, "4. Tuna and sweetcorn: tuna and cooked sweetcorn", ""); + } + break; + case 10: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(4, 1977, "Members: Chocolate milk", "Members can now make " + "" + "chocolate milk" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(21, 2130, "Members: Cream", "Members can now churn " + "" + "cream" + "" + "."); + case 2: + return newstruct cs2func_script_1018_struct(38, 6697, "Members: Butter", "Members can now churn " + "" + "butter" + "" + "."); + case 3: + return newstruct cs2func_script_1018_struct(48, 1985, "Members: Cheese", "Members can now churn " + "" + "cheese" + "" + "."); + case 4: + return newstruct cs2func_script_1018_struct(-1, 7620, "To make churned dairy products:", " "); + case 5: + return newstruct cs2func_script_1018_struct(-1, 7620, "1. Get a bucket of milk, a pot of cream or a pot of butter.", " "); + case 6: + return newstruct cs2func_script_1018_struct(-1, 7620, "2. Use the milk, cream or butter in a churn.", " "); + case 7: + return newstruct cs2func_script_1018_struct(-1, 7620, "3. Milk can be churned into cream, then into butter, then into cheese.", " "); + } + break; + case 11: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(6, 2084, "Members: Fruit Blast", "Members can now mix " + "" + "Fruit Blasts" + "" + "."); + case 1: + return newstruct cs2func_script_1018_struct(8, 2048, "Members: Pineapple punch", "Members can now mix " + "" + "pineapple punch" + "" + "."); + case 2: + return newstruct cs2func_script_1018_struct(10, 2217, "Members: Toad crunchies", "Members can now cook " + "" + "toad crunchies" + "" + "."); + case 3: + return newstruct cs2func_script_1018_struct(12, 2213, "Members: Spicy crunchies", "Members can now cook " + "" + "spicy crunchies" + "" + "."); + case 4: + return newstruct cs2func_script_1018_struct(14, 2205, "Members: Worm crunchies", "Members can now cook " + "" + "worm crunchies" + "" + "."); + case 5: + return newstruct cs2func_script_1018_struct(16, 2209, "Members: Chocolate chip crunchies", "Members can now cook " + "" + "chocolate chip crunchies" + "" + "."); + case 6: + return newstruct cs2func_script_1018_struct(18, 2054, "Members: Wizard Blizzard", "Members can now mix " + "" + "Wizard Blizzards" + "" + "."); + case 7: + return newstruct cs2func_script_1018_struct(20, 2080, "Members: Short Green Guy (SGG)", "Members can now mix " + "" + "Short Green Guys" + "" + "."); + case 8: + return newstruct cs2func_script_1018_struct(25, 2277, "Members: Fruit batta", "Members can now cook " + "" + "fruit battas" + "" + "."); + case 9: + return newstruct cs2func_script_1018_struct(26, 2255, "Members: Toad batta", "Members can now cook " + "" + "toad battas" + "" + "."); + case 10: + return newstruct cs2func_script_1018_struct(27, 2253, "Members: Worm batta", "Members can now cook " + "" + "worm battas" + "" + "."); + case 11: + return newstruct cs2func_script_1018_struct(28, 2281, "Members: Vegetable batta", "Members can now cook " + "" + "vegetable battas" + "" + "."); + case 12: + return newstruct cs2func_script_1018_struct(29, 2259, "Members: Cheese and tomato batta", "Members can now cook " + "" + "cheese and tomato battas" + "" + "."); + case 13: + return newstruct cs2func_script_1018_struct(30, 2191, "Members: Worm hole", "Members can now cook " + "" + "worm holes" + "" + "."); + case 14: + return newstruct cs2func_script_1018_struct(32, 2092, "Members: Drunk Dragon", "Members can now mix " + "" + "Drunk Dragons" + "" + "."); + case 15: + return newstruct cs2func_script_1018_struct(33, 2074, "Members: Chocolate Saturday", "Members can now mix " + "" + "Chocolate Saturdays" + "" + "."); + case 16: + return newstruct cs2func_script_1018_struct(35, 2195, "Members: Vegetable ball", "Members can now cook " + "" + "vegetable balls" + "" + "."); + case 17: + return newstruct cs2func_script_1018_struct(37, 2064, "Members: Blurberry Special", "Members can now mix " + "" + "Blurberry Specials" + "" + "."); + case 18: + return newstruct cs2func_script_1018_struct(40, 2187, "Members: Tangled toads' legs", "Members can now cook " + "" + "tangled toads' legs" + "" + "."); + case 19: + return newstruct cs2func_script_1018_struct(42, 2185, "Members: Chocolate bomb", "Members can now cook " + "" + "chocolate bombs" + "" + "."); + } + break; + case 12: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(91, 18778, "Members: Starved ancient effigies", "Members can now investigate " + "" + "starved ancient effigies" + "" + " using their knowledge of Cooking."); + case 1: + return newstruct cs2func_script_1018_struct(93, 18779, "Members: Nourished ancient effigies", "Members can now investigate " + "" + "nourished ancient effigies" + "" + " using their knowledge of Cooking." + "" + "."); + case 2: + return newstruct cs2func_script_1018_struct(95, 18780, "Members: Sated ancient effigies", "Members can now investigate " + "" + "sated ancient effigies" + "" + " using their knowledge of Cooking." + "" + "."); + case 3: + return newstruct cs2func_script_1018_struct(97, 18781, "Members: Gorged ancient effigies", "Members can now investigate " + "" + "gorged ancient effigies" + "" + " using their knowledge of Cooking." + "" + "."); + } + break; + case 13: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(1, 14162, "Members: Stealing Creation - class 1 food", "Members can now cook " + "" + "class 1 food" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_1018_struct(20, 14164, "Members: Stealing Creation - class 2 food", "Members can now cook " + "" + "class 2 food" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_1018_struct(40, 14166, "Members: Stealing Creation - class 3 food", "Members can now cook " + "" + "class 3 food" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_1018_struct(60, 14168, "Members: Stealing Creation - class 4 food", "Members can now cook " + "" + "class 4 food" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_1018_struct(80, 14170, "Members: Stealing Creation - class 5 food", "Members can now cook " + "" + "class 5 food" + "" + " in Stealing Creation."); + } + break; + case 14: + switch (arg1) { + case 0: + return newstruct cs2func_script_1018_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Cooking level increases, you will be able to attempt higher-level cooking tasks within Daemonheim. You will also be more likely to succeed when attempting cooking tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1018_struct(1, 18093, "Members: Cave potato", "Members can now cook " + "" + "cave potatoes" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1018_struct(1, 18159, "Heim crab (Tier 1)", "You can now cook " + "" + "heim crabs" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_1018_struct(3, 18099, "Members: Heim crab potato (Tier 1)", "Members can now cook " + "" + "heim crab potatoes" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1018_struct(6, 18119, "Members: Heim crab & gissel potato (Tier 1)", "Members can now cook " + "" + "heim crab & gissel potatoes" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_1018_struct(9, 18139, "Members: Heim crab & edicap potato (Tier 1)", "Members can now cook " + "" + "heim crab & edicap potatoes" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_1018_struct(10, 18161, "Red-eye (Tier 2)", "You can now cook " + "" + "red-eyes" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_1018_struct(13, 18101, "Members: Red-eye potato (Tier 2)", "Members can now cook " + "" + "red-eye potatoes" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_1018_struct(16, 18121, "Members: Red-eye & gissel potato (Tier 2)", "Members can now cook " + "" + "red-eye & gissel potatoes" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_1018_struct(19, 18141, "Members: Red-eye & edicap potato (Tier 2)", "Members can now cook " + "" + "red-eye & edicap potatoes" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1018_struct(20, 18163, "Dusk eel (Tier 3)", "You can now cook " + "" + "dusk eels" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_1018_struct(23, 18103, "Members: Dusk eel potato (Tier 3)", "Members can now cook " + "" + "dusk eel potatoes" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_1018_struct(26, 18123, "Members: Dusk eel & gissel potato (Tier 3)", "Members can now cook " + "" + "dusk eel & gissel potatoes" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_1018_struct(29, 18143, "Members: Dusk eel & edicap potato (Tier 3)", "Members can now cook " + "" + "dusk eel & edicap potatoes" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_1018_struct(30, 18165, "Giant flatfish (Tier 4)", "You can now cook " + "" + "giant flatfish" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_1018_struct(33, 18105, "Members: Flatfish potato (Tier 4)", "Members can now cook " + "" + "flatfish potatoes" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_1018_struct(36, 18125, "Members: Flatfish & gissel potato (Tier 4)", "Members can now cook " + "" + "flatfish & gissel potatoes" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_1018_struct(39, 18145, "Members: Flatfish & edicap potato (Tier 4)", "Members can now cook " + "" + "flatfish & edicap potatoes" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_1018_struct(40, 18167, "Short-finned eel (Tier 5)", "You can now cook " + "" + "short-finned eels" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_1018_struct(43, 18107, "Members: Short-fin potato (Tier 5)", "Members can now cook " + "" + "short-fin potatoes" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_1018_struct(46, 18127, "Members: Short-fin & gissel potato (Tier 5)", "Members can now cook " + "" + "short-fin & gissel potatoes" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_1018_struct(49, 18147, "Members: Short-fin & edicap potato (Tier 5)", "Members can now cook " + "" + "short-fin & edicap potatoes" + "" + " within Daemonheim."); + case 22: + return newstruct cs2func_script_1018_struct(50, 18169, "Members: Web snipper (Tier 6)", "Members can now cook " + "" + "web snippers" + "" + " within Daemonheim."); + case 23: + return newstruct cs2func_script_1018_struct(53, 18109, "Members: Snipper potato (Tier 6)", "Members can now cook " + "" + "spinner potatoes" + "" + " within Daemonheim."); + case 24: + return newstruct cs2func_script_1018_struct(56, 18129, "Members: Snipper & gissel potato (Tier 6)", "Members can now cook " + "" + "snipper & gissel potatoes" + "" + " within Daemonheim."); + case 25: + return newstruct cs2func_script_1018_struct(59, 18149, "Members: Snipper & edicap potato (Tier 6)", "Members can now cook " + "" + "snipper & edicap potatoes" + "" + " within Daemonheim."); + case 26: + return newstruct cs2func_script_1018_struct(60, 18171, "Members: Bouldabass (Tier 7)", "Members can now cook " + "" + "bouldabass" + "" + " within Daemonheim."); + case 27: + return newstruct cs2func_script_1018_struct(63, 18111, "Members: Bouldabass potato (Tier 7)", "Members can now cook " + "" + "bouldabass potatoes" + "" + " within Daemonheim."); + case 28: + return newstruct cs2func_script_1018_struct(66, 18131, "Members: Bouldabass & gissel potato (Tier 7)", "Members can now cook " + "" + "bouldabass & gissel potatoes" + "" + " within Daemonheim."); + case 29: + return newstruct cs2func_script_1018_struct(69, 18151, "Members: Bouldabass & edicap potato (Tier 7)", "Members can now cook " + "" + "bouldabass & edicap potatoes" + "" + " within Daemonheim."); + case 30: + return newstruct cs2func_script_1018_struct(70, 18173, "Members: Salve eel (Tier 8)", "Members can now cook " + "" + "salve eels" + "" + " within Daemonheim."); + case 31: + return newstruct cs2func_script_1018_struct(73, 18113, "Members: Salve eel potato (Tier 8)", "Members can now cook " + "" + "salve eel potatoes" + "" + " within Daemonheim."); + case 32: + return newstruct cs2func_script_1018_struct(76, 18133, "Members: Salve eel & gissel potato (Tier 8)", "Members can now cook " + "" + "salve eel & gissel potatoes" + "" + " within Daemonheim."); + case 33: + return newstruct cs2func_script_1018_struct(79, 18153, "Members: Salve eel & edicap potato (Tier 8)", "Members can now cook " + "" + "salve eel & edicap potatoes" + "" + " within Daemonheim."); + case 34: + return newstruct cs2func_script_1018_struct(80, 18175, "Members: Blue crab (Tier 9)", "Members can now cook " + "" + "blue crabs" + "" + " within Daemonheim."); + case 35: + return newstruct cs2func_script_1018_struct(83, 18115, "Members: Blue crab potato (Tier 9)", "Members can now cook " + "" + "blue crab potatoes" + "" + " within Daemonheim."); + case 36: + return newstruct cs2func_script_1018_struct(86, 18135, "Members: Blue crab & gissel potato (Tier 9)", "Members can now cook " + "" + "blue crab & gissel potatoes" + "" + " within Daemonheim."); + case 37: + return newstruct cs2func_script_1018_struct(89, 18155, "Members: Blue crab & edicap potato (Tier 9)", "Members can now cook " + "" + "blue crab & edicap potatoes" + "" + " within Daemonheim."); + case 38: + return newstruct cs2func_script_1018_struct(90, 18177, "Members: Cave moray (Tier 10)", "Members can now cook " + "" + "cave morays" + "" + " within Daemonheim."); + case 39: + return newstruct cs2func_script_1018_struct(93, 18117, "Members: Moray potato (Tier 10)", "Members can now cook " + "" + "moray potatoes" + "" + " within Daemonheim."); + case 40: + return newstruct cs2func_script_1018_struct(96, 18137, "Members: Moray & gissel potato (Tier 10)", "Members can now cook " + "" + "moray & gissel potatoes" + "" + " within Daemonheim."); + case 41: + return newstruct cs2func_script_1018_struct(99, 18157, "Members: Moray & edicap potato (Tier 10)", "Members can now cook " + "" + "moray & edicap potatoes" + "" + " within Daemonheim."); + } + break; + case 15: + SWITCH (arg1) { + case 0: + GOTO flow_250 + case 1: + GOTO flow_251 + } + break; + flow_250: + return newstruct cs2func_script_1018_struct(32, 1949, "Chefs' Guild", "You are now qualified to enter the prestigious " + "" + "Chefs' Guild" + "" + "."); + flow_251: + return newstruct cs2func_script_1018_struct(99, 9801, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Cooking" + "" + ". Members can visit the " + "" + "head chef" + "" + " at the " + "" + "Cooking Guild" + "" + ". He has something special that is only available to true masters of the " + "" + "Cooking" + "" + " skill!"); + } + return newstruct cs2func_script_1018_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1019.cs2 b/dumps/scripts/1019.cs2 new file mode 100644 index 000000000..009f505fa --- /dev/null +++ b/dumps/scripts/1019.cs2 @@ -0,0 +1,21 @@ +cs2func_script_1019_struct(1,1,0) script_1019(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1019_struct(1, "Familiars"); + case 1: + return newstruct cs2func_script_1019_struct(1, "Summoning Scrolls"); + case 2: + return newstruct cs2func_script_1019_struct(1, "Pets"); + case 3: + return newstruct cs2func_script_1019_struct(1, "Equipment"); + case 4: + return newstruct cs2func_script_1019_struct(1, "Other"); + case 5: + return newstruct cs2func_script_1019_struct(1, "Minigames"); + case 6: + return newstruct cs2func_script_1019_struct(1, "Dungeoneering"); + case 7: + return newstruct cs2func_script_1019_struct(1, "Milestones"); + } + return newstruct cs2func_script_1019_struct(-1, ""); +} diff --git a/dumps/scripts/102.cs2 b/dumps/scripts/102.cs2 new file mode 100644 index 000000000..70f212cd7 --- /dev/null +++ b/dumps/scripts/102.cs2 @@ -0,0 +1,31 @@ +void script_102(string arg0) { + if (globalint_5 > 1) { + return; + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetFont(497, new WidgetPointer(752,4)); + setWidgetFont(497, new WidgetPointer(752,5)); + setWidgetSize(0, 20, 1, 1, new WidgetPointer(752,4)); + setWidgetSize(0, 20, 1, 0, new WidgetPointer(752,5)); + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(752,4)); + setWidgetPosition(0, 0, 1, 2, new WidgetPointer(752,5)); + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), arg0); + setWidgetText(new WidgetPointer(752,5), "Click here to continue"); + globalint_5 = 1; + setScriptCallOnMousePressed(101, "", new WidgetPointer(752,3)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(752,5)); + setWidgetRGB(new Color(0, 0, 128), new WidgetPointer(752,5)); + setScriptCallOnMouseOver(45, new WidgetPointer(-32768,3), 16777215, "Ii", new WidgetPointer(752,5)); + setScriptCallOnMouseExit(45, new WidgetPointer(-32768,3), 128, "Ii", new WidgetPointer(752,5)); + script_1188(); + setWidgetIsHidden(true, new WidgetPointer(752,6)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(752,5)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,5)); + setScriptCallOnAnyWidgetOpenAndClose(3450, 1, "i", new WidgetPointer(752,5)); + return; +} diff --git a/dumps/scripts/1020.cs2 b/dumps/scripts/1020.cs2 new file mode 100644 index 000000000..25aa563d9 --- /dev/null +++ b/dumps/scripts/1020.cs2 @@ -0,0 +1,691 @@ +cs2func_script_1020_struct(2,2,0) script_1020(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1020_struct(1, 12047, "Spirit wolf - Attack XP" + "
" + "Gold charm, wolf bones, 7 shards", "You can now infuse " + "" + "spirit wolf pouches" + "" + "."); + case 1: + return newstruct cs2func_script_1020_struct(4, 12043, "Dreadfowl - Magic XP" + "
" + "Gold charm, raw chicken, 8 shards", "You can now infuse " + "" + "dreadfowl pouches" + "" + "."); + case 2: + return newstruct cs2func_script_1020_struct(4, 19622, "Meerkats" + "
" + "Obtained from Treasure Trails.", "You can now summon " + "" + "meerkats" + "" + "."); + case 3: + return newstruct cs2func_script_1020_struct(10, 12059, "Spirit spider - Controlled XP" + "
" + "Gold charm, spider carcass, 8 shards", "You can now infuse " + "" + "spirit spider pouches" + "" + "."); + case 4: + return newstruct cs2func_script_1020_struct(13, 12019, "Thorny snail - Ranged XP" + "
" + "Gold charm, raw thin snail, 9 shards", "You can now infuse " + "" + "thorny snail pouches" + "" + "."); + case 5: + return newstruct cs2func_script_1020_struct(16, 12009, "Granite crab - Defence XP" + "
" + "Gold charm, iron ore, 7 shards", "You can now infuse " + "" + "granite crab pouches" + "" + "."); + case 6: + return newstruct cs2func_script_1020_struct(17, 12778, "Spirit mosquito - Attack XP" + "
" + "Gold charm, proboscis, 1 shard", "You can now infuse " + "" + "spirit mosquito pouches" + "" + "."); + case 7: + return newstruct cs2func_script_1020_struct(18, 12049, "Desert wyrm - Strength XP" + "
" + "Green charm, bucket of sand, 45 shards", "You can now infuse " + "" + "desert wyrm pouches" + "" + "."); + case 8: + return newstruct cs2func_script_1020_struct(19, 12055, "Spirit scorpion - Controlled XP" + "
" + "Crimson charm, bronze claws, 57 shards", "You can now infuse " + "" + "spirit scorpion pouches" + "" + "."); + case 9: + return newstruct cs2func_script_1020_struct(22, 12808, "Spirit Tz-Kih - Magic XP" + "
" + "Crimson charm, obsidian charm, 64 shards", "You can now infuse " + "" + "spirit Tz-Kih pouches" + "" + "."); + case 10: + return newstruct cs2func_script_1020_struct(23, 12067, "Albino rat - Attack XP" + "
" + "Blue charm, raw rat meat, 75 shards", "You can now infuse " + "" + "albino rat pouches" + "" + "."); + case 11: + return newstruct cs2func_script_1020_struct(25, 12063, "Spirit kalphite - Defence XP" + "
" + "Blue charm, potato cactus, 51 shards", "You can now infuse " + "" + "spirit kalphite pouches" + "" + "."); + case 12: + return newstruct cs2func_script_1020_struct(28, 12091, "Compost mound - Strength XP" + "
" + "Green charm, compost, 47 shards", "You can now infuse " + "" + "compost mound pouches" + "" + "."); + case 13: + return newstruct cs2func_script_1020_struct(29, 12800, "Giant chinchompa - Ranged XP" + "
" + "Blue charm, chinchompa, 84 shards", "You can now infuse " + "" + "giant chinchompa pouches" + "" + "."); + case 14: + return newstruct cs2func_script_1020_struct(31, 12053, "Vampyre bat - Controlled XP" + "
" + "Crimson charm, vampyre dust, 81 shards", "You can now infuse " + "" + "vampyre bat pouches" + "" + "."); + case 15: + return newstruct cs2func_script_1020_struct(32, 12065, "Honey badger - Strength XP" + "
" + "Crimson charm, honeycomb, 84 shards", "You can now infuse " + "" + "honey badger pouches" + "" + "."); + case 16: + return newstruct cs2func_script_1020_struct(33, 12021, "Beaver" + "
" + "Green charm, willow logs, 72 shards", "You can now infuse " + "" + "beaver pouches" + "" + "."); + case 17: + return newstruct cs2func_script_1020_struct(34, 12818, "Void ravager - Strength XP" + "
" + "Green charm, ravager charm, 74 shards", "You can now infuse " + "" + "void ravager pouches" + "" + "."); + case 18: + return newstruct cs2func_script_1020_struct(34, 12780, "Void spinner - Defence XP" + "
" + "Blue charm, spinner charm, 74 shards", "You can now infuse " + "" + "void spinner pouches" + "" + "."); + case 19: + return newstruct cs2func_script_1020_struct(34, 12798, "Void torcher - Magic XP" + "
" + "Blue charm, torcher charm, 74 shards", "You can now infuse " + "" + "void torcher pouches" + "" + "."); + case 20: + return newstruct cs2func_script_1020_struct(34, 12814, "Void shifter - Attack XP" + "
" + "Blue charm, shifter charm, 74 shards", "You can now infuse " + "" + "void shifter pouches" + "" + "."); + case 21: + return newstruct cs2func_script_1020_struct(36, 12073, "Bronze minotaur - Defence XP" + "
" + "Blue charm, bronze bar, 102 shards", "You can now infuse " + "" + "bronze minotaur pouches" + "" + "."); + case 22: + return newstruct cs2func_script_1020_struct(40, 12087, "Bull ant - Controlled XP" + "
" + "Gold charm, marigolds, 11 shards", "You can now infuse " + "" + "bull ant pouches" + "" + "."); + case 23: + return newstruct cs2func_script_1020_struct(41, 12071, "Macaw" + "
" + "Green charm, guam, 78 shards", "You can now infuse " + "" + "macaw pouches" + "" + "."); + case 24: + return newstruct cs2func_script_1020_struct(42, 12051, "Evil turnip - Ranged XP" + "
" + "Crimson charm, carved turnip, 104 shards", "You can now infuse " + "" + "evil turnip pouches" + "" + "."); + case 25: + return newstruct cs2func_script_1020_struct(43, 12095, "Spirit cockatrice - Magic XP" + "
" + "Green charm, cockatrice egg, 88 shards", "You can now infuse " + "" + "spirit cockatrice pouches" + "" + "."); + case 26: + return newstruct cs2func_script_1020_struct(43, 12097, "Spirit guthatrice - Magic XP" + "
" + "Green charm, guthatrice egg, 88 shards", "You can now infuse " + "" + "spirit guthatrice pouches" + "" + "."); + case 27: + return newstruct cs2func_script_1020_struct(43, 12099, "Spirit saratrice - Magic XP" + "
" + "Green charm, saratrice egg, 88 shards", "You can now infuse " + "" + "spirit saratrice pouches" + "" + "."); + case 28: + return newstruct cs2func_script_1020_struct(43, 12101, "Spirit zamatrice - Magic XP" + "
" + "Green charm, zamatrice egg, 88 shards", "You can now infuse " + "" + "spirit zamatrice pouches" + "" + "."); + case 29: + return newstruct cs2func_script_1020_struct(43, 12103, "Spirit pengatrice - Magic XP" + "
" + "Green charm, pengatrice egg, 88 shards", "You can now infuse " + "" + "spirit pengatrice pouches" + "" + "."); + case 30: + return newstruct cs2func_script_1020_struct(43, 12105, "Spirit coraxatrice - Magic XP" + "
" + "Green charm, coraxatrice egg, 88 shards", "You can now infuse " + "" + "spirit coraxatrice pouches" + "" + "."); + case 31: + return newstruct cs2func_script_1020_struct(43, 12107, "Spirit vulatrice - Magic XP" + "
" + "Green charm, vulatrice egg, 88 shards", "You can now infuse " + "" + "spirit vulatrice pouches" + "" + "."); + case 32: + return newstruct cs2func_script_1020_struct(46, 12075, "Iron minotaur - Defence XP" + "
" + "Blue charm, iron bar, 125 shards", "You can now infuse " + "" + "iron minotaur pouches" + "" + "."); + case 33: + return newstruct cs2func_script_1020_struct(46, 12816, "Pyrelord - Strength XP" + "
" + "Crimson charm, tinderbox, 111 shards", "You can now infuse " + "" + "pyrelord" + "" + " pouches."); + case 34: + return newstruct cs2func_script_1020_struct(47, 12041, "Magpie" + "
" + "Green charm, gold ring, 88 shards", "You can now infuse " + "" + "magpie pouches" + "" + "."); + case 35: + return newstruct cs2func_script_1020_struct(49, 12061, "Bloated leech - Attack XP" + "
" + "Crimson charm, raw beef, 117 shards", "You can now infuse " + "" + "bloated leech pouches" + "" + "."); + case 36: + return newstruct cs2func_script_1020_struct(52, 12007, "Spirit terrorbird - Controlled XP" + "
" + "Gold charm, raw bird meat, 12 shards", "You can now infuse " + "" + "spirit terrorbird pouches" + "" + "."); + case 37: + return newstruct cs2func_script_1020_struct(54, 12035, "Abyssal parasite - Magic XP" + "
" + "Green charm, abyssal charm, 106 shards", "You can now infuse " + "" + "abyssal parasite pouches" + "" + "."); + case 38: + return newstruct cs2func_script_1020_struct(55, 12027, "Spirit jelly - Strength XP" + "
" + "Blue charm, jug of water, 151 shards", "You can now infuse " + "" + "spirit jelly pouches" + "" + "."); + case 39: + return newstruct cs2func_script_1020_struct(56, 12077, "Steel minotaur - Defence XP" + "
" + "Blue charm, steel bar, 141 shards", "You can now infuse " + "" + "steel minotaur pouches" + "" + "."); + case 40: + return newstruct cs2func_script_1020_struct(56, 12531, "Ibis" + "
" + "Green charm, harpoon, 109 shards", "You can now infuse " + "" + "ibis pouches" + "" + "."); + case 41: + return newstruct cs2func_script_1020_struct(57, 12812, "Spirit kyatt - Attack XP" + "
" + "Blue charm, kyatt fur, 153 shards", "You can now infuse " + "" + "spirit kyatt pouches" + "" + "."); + case 42: + return newstruct cs2func_script_1020_struct(57, 12784, "Spirit larupia - Controlled XP" + "
" + "Blue charm, larupia fur, 155 shards", "You can now infuse " + "" + "spirit larupia pouches" + "" + "."); + case 43: + return newstruct cs2func_script_1020_struct(57, 12810, "Spirit graahk - Strength XP" + "
" + "Blue charm, graahk fur, 154 shards", "You can now infuse " + "" + "spirit graahk pouches" + "" + "."); + case 44: + return newstruct cs2func_script_1020_struct(58, 12023, "Karamthulhu overlord - Ranged XP" + "
" + "Blue charm, empty fishbowl, 144 shards", "You can now infuse " + "" + "karamthulhu overlord pouches" + "" + "."); + case 45: + return newstruct cs2func_script_1020_struct(61, 12085, "Smoke devil - Magic XP" + "
" + "Crimson charm, goat's horn dust, 141 shards", "You can now infuse " + "" + "smoke devil pouches" + "" + "."); + case 46: + return newstruct cs2func_script_1020_struct(62, 12037, "Abyssal lurker - Controlled XP" + "
" + "Green charm, abyssal charm, 119 shards", "You can now infuse " + "" + "abyssal lurker pouches" + "" + "."); + case 47: + return newstruct cs2func_script_1020_struct(63, 12015, "Spirit cobra - Attack XP" + "
" + "Crimson charm, snake hide, 116 shards", "You can now infuse " + "" + "spirit cobra pouches" + "" + "."); + case 48: + return newstruct cs2func_script_1020_struct(64, 12045, "Stranger plant - Controlled XP" + "
" + "Crimson charm, bagged plant, 128 shards", "You can now infuse " + "" + "stranger plant pouches" + "" + "."); + case 49: + return newstruct cs2func_script_1020_struct(66, 12079, "Mithril minotaur - Defence XP" + "
" + "Blue charm, mithril bar, 152 shards", "You can now infuse " + "" + "mithril minotaur pouches" + "" + "."); + case 50: + return newstruct cs2func_script_1020_struct(66, 12123, "Barker toad - Strength XP" + "
" + "Gold charm, swamp toad, 11 shards", "You can now infuse " + "" + "barker toad pouches" + "" + "."); + case 51: + return newstruct cs2func_script_1020_struct(67, 12031, "War tortoise - Defence XP" + "
" + "Gold charm, tortoise shell, 1 shard", "You can now infuse " + "" + "war tortoise pouches" + "" + "."); + case 52: + return newstruct cs2func_script_1020_struct(68, 12029, "Bunyip - Attack XP" + "
" + "Green charm, raw shark, 110 shards", "You can now infuse " + "" + "bunyip pouches" + "" + "."); + case 53: + return newstruct cs2func_script_1020_struct(69, 12033, "Fruit bat" + "
" + "Green charm, banana, 130 shards", "You can now infuse " + "" + "fruit bat pouches" + "" + "."); + case 54: + return newstruct cs2func_script_1020_struct(70, 12820, "Ravenous locust - Attack XP" + "
" + "Crimson charm, pot of flour, 79 shards", "You can now infuse " + "" + "ravenous locust pouches" + "" + "."); + case 55: + return newstruct cs2func_script_1020_struct(71, 12057, "Arctic bear - Controlled XP" + "
" + "Gold charm, polar kebbit fur, 14 shards", "You can now infuse " + "" + "arctic bear pouches" + "" + "."); + case 56: + return newstruct cs2func_script_1020_struct(72, 14623, "Phoenix - Magic XP" + "
" + "Crimson charm, phoenix quill, 165 shards (after In Pyre Need)", "You can now infuse " + "" + "phoenix pouches" + "" + " (after In Pyre Need)" + "" + "."); + case 57: + return newstruct cs2func_script_1020_struct(73, 12792, "Obsidian golem - Strength XP" + "
" + "Blue charm, obsidian charm, 195 shards", "You can now infuse " + "" + "obsidian golem pouches" + "" + "."); + case 58: + return newstruct cs2func_script_1020_struct(74, 12069, "Granite lobster - Defence XP" + "
" + "Crimson charm, granite (500g, 2kg or 5kg), 166 shards", "You can now infuse " + "" + "granite lobster pouches" + "" + "."); + case 59: + return newstruct cs2func_script_1020_struct(75, 12011, "Praying mantis - Attack XP" + "
" + "Crimson charm, flowers (any except black or white), 168 shards", "You can now infuse " + "" + "praying mantis pouches" + "" + "."); + case 60: + return newstruct cs2func_script_1020_struct(76, 12782, "Forge regent - Ranged XP" + "
" + "Green charm, ruby harvest, 141 shards", "You can now infuse " + "" + "forge regent pouches" + "" + "."); + case 61: + return newstruct cs2func_script_1020_struct(76, 12081, "Adamant minotaur - Defence XP" + "
" + "Blue charm, adamant bar, 144 shards", "You can now infuse " + "" + "adamant minotaur pouches" + "" + "."); + case 62: + return newstruct cs2func_script_1020_struct(77, 12794, "Talon beast - Strength XP" + "
" + "Crimson charm, talon beast charm, 174 shards", "You can now infuse " + "" + "talon beast pouches" + "" + "."); + case 63: + return newstruct cs2func_script_1020_struct(78, 12013, "Giant ent - Controlled XP" + "
" + "Green charm, willow branch, 124 shards", "You can now infuse " + "" + "giant ent pouches" + "" + "."); + case 64: + return newstruct cs2func_script_1020_struct(79, 12802, "Fire titan - Magic XP" + "
" + "Blue charm, fire talisman, 198 shards", "You can now infuse " + "" + "fire titan pouches" + "" + "."); + case 65: + return newstruct cs2func_script_1020_struct(79, 12804, "Moss titan - Strength XP" + "
" + "Blue charm, earth talisman, 202 shards", "You can now infuse " + "" + "moss titan pouches" + "" + "."); + case 66: + return newstruct cs2func_script_1020_struct(79, 12806, "Ice titan - Attack XP" + "
" + "Blue charm, air talisman, water talisman, 198 shards", "You can now infuse " + "" + "ice titan pouches" + "" + "."); + case 67: + return newstruct cs2func_script_1020_struct(80, 12025, "Hydra - Ranged XP" + "
" + "Green charm, water orb, 128 shards", "You can now infuse " + "" + "hydra pouches" + "" + "."); + case 68: + return newstruct cs2func_script_1020_struct(83, 12017, "Spirit dagannoth - Controlled XP" + "
" + "Crimson charm, dagannoth hide, 1 shard", "You can now infuse " + "" + "spirit dagannoth pouches" + "" + "."); + case 69: + return newstruct cs2func_script_1020_struct(83, 12788, "Lava titan - Strength XP" + "
" + "Blue charm, obsidian charm, 219 shards", "You can now infuse " + "" + "lava titan pouches" + "" + "."); + case 70: + return newstruct cs2func_script_1020_struct(85, 12776, "Swamp titan - Attack XP" + "
" + "Crimson charm, swamp lizard, 150 shards", "You can now infuse " + "" + "swamp titan pouches" + "" + "."); + case 71: + return newstruct cs2func_script_1020_struct(86, 12083, "Rune minotaur - Defence XP" + "
" + "Blue charm, rune bar, 1 shard", "You can now infuse " + "" + "rune minotaur pouches" + "" + "."); + case 72: + return newstruct cs2func_script_1020_struct(88, 12039, "Unicorn stallion - Controlled XP" + "
" + "Green charm, unicorn horn, 140 shards", "You can now infuse " + "" + "unicorn stallion pouches" + "" + "."); + case 73: + return newstruct cs2func_script_1020_struct(89, 12786, "Geyser titan - Ranged XP" + "
" + "Blue charm, water talisman, 222 shards", "You can now infuse " + "" + "geyser titan pouches" + "" + "."); + case 74: + return newstruct cs2func_script_1020_struct(92, 12089, "Wolpertinger - Magic XP" + "
" + "Crimson charm, raw rabbit, wolf bones, 203 shards", "You can now infuse " + "" + "wolpertinger pouches" + "" + "."); + case 75: + return newstruct cs2func_script_1020_struct(93, 12796, "Abyssal titan - Attack XP" + "
" + "Green charm, abyssal charm, 113 shards", "You can now infuse " + "" + "abyssal titan pouches" + "" + "."); + case 76: + return newstruct cs2func_script_1020_struct(95, 12822, "Iron titan - Defence XP" + "
" + "Crimson charm, iron platebody, 198 shards", "You can now infuse " + "" + "iron titan pouches" + "" + "."); + case 77: + return newstruct cs2func_script_1020_struct(96, 12093, "Pack yak - Strength XP" + "
" + "Crimson charm, yak hide, 211 shards", "You can now infuse " + "" + "pack yak pouches" + "" + "."); + case 78: + return newstruct cs2func_script_1020_struct(99, 12790, "Steel titan - Ranged XP" + "
" + "Crimson charm, steel platebody, 178 shards", "You can now infuse " + "" + "steel titan pouches" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1020_struct(1, 12425, "Howl", "You can now use " + "" + "Howl scrolls" + "" + "."); + case 1: + return newstruct cs2func_script_1020_struct(4, 12445, "Dreadfowl Strike", "You can now use " + "" + "Dreadfowl Strike scrolls" + "" + "."); + case 2: + return newstruct cs2func_script_1020_struct(4, 19621, "Fetch Casket", "You can now use " + "" + "Fetch Casket scrolls" + "" + "."); + case 3: + return newstruct cs2func_script_1020_struct(10, 12428, "Egg Spawn", "You can now use " + "" + "Egg Spawn scrolls" + "" + "."); + case 4: + return newstruct cs2func_script_1020_struct(13, 12459, "Slime Spray", "You can now use " + "" + "Slime Spray scrolls" + "" + "."); + case 5: + return newstruct cs2func_script_1020_struct(16, 12533, "Stony Shell", "You can now use " + "" + "Stony Shell scrolls" + "" + "."); + case 6: + return newstruct cs2func_script_1020_struct(17, 12838, "Pester", "You can now use " + "" + "Pester scrolls" + "" + "."); + case 7: + return newstruct cs2func_script_1020_struct(18, 12460, "Electric Lash", "You can now use " + "" + "Electric Lash scrolls" + "" + "."); + case 8: + return newstruct cs2func_script_1020_struct(19, 12432, "Venom Shot", "You can now use " + "" + "Venom Shot scrolls" + "" + "."); + case 9: + return newstruct cs2func_script_1020_struct(22, 12839, "Fireball Assault", "You can now use " + "" + "Fireball Assault scrolls" + "" + "."); + case 10: + return newstruct cs2func_script_1020_struct(23, 12430, "Cheese Feast", "You can now use " + "" + "Cheese Feast scrolls" + "" + "."); + case 11: + return newstruct cs2func_script_1020_struct(25, 12446, "Sandstorm", "You can now use " + "" + "Sandstorm scrolls" + "" + "."); + case 12: + return newstruct cs2func_script_1020_struct(28, 12440, "Generate Compost", "You can now use " + "" + "Generate Compost scrolls" + "" + "."); + case 13: + return newstruct cs2func_script_1020_struct(29, 12834, "Explode", "You can now use " + "" + "Explode scrolls" + "" + "."); + case 14: + return newstruct cs2func_script_1020_struct(31, 12447, "Vampyre Touch", "You can now use " + "" + "Vampyre Touch scrolls" + "" + "."); + case 15: + return newstruct cs2func_script_1020_struct(32, 12433, "Insane Ferocity", "You can now use " + "" + "Insane Ferocity scrolls" + "" + "."); + case 16: + return newstruct cs2func_script_1020_struct(33, 12429, "Multichop", "You can now use " + "" + "Multichop scrolls" + "" + "."); + case 17: + return newstruct cs2func_script_1020_struct(34, 12443, "Call to Arms", "You can now use " + "" + "Call to Arms scrolls" + "" + "."); + case 18: + return newstruct cs2func_script_1020_struct(36, 12461, "Bronze Bull Rush", "You can now use " + "" + "Bronze Bull Rush scrolls" + "" + "."); + case 19: + return newstruct cs2func_script_1020_struct(40, 12431, "Unburden", "You can now use " + "" + "Unburden scrolls" + "" + "."); + case 20: + return newstruct cs2func_script_1020_struct(41, 12422, "Herbcall", "You can now use " + "" + "Herbcall scrolls" + "" + "."); + case 21: + return newstruct cs2func_script_1020_struct(42, 12448, "Evil Flames", "You can now use " + "" + "Evil Flames scrolls" + "" + "."); + case 22: + return newstruct cs2func_script_1020_struct(43, 12458, "Petrifying Gaze", "You can now use " + "" + "Petrifying Gaze scrolls" + "" + "."); + case 23: + return newstruct cs2func_script_1020_struct(46, 12462, "Iron Bull Rush", "You can now use " + "" + "Iron Bull Rush scrolls" + "" + "."); + case 24: + return newstruct cs2func_script_1020_struct(46, 12829, "Immense Heat", "You can now use " + "" + "Immense Heat scrolls" + "" + "."); + case 25: + return newstruct cs2func_script_1020_struct(47, 12426, "Thieving Fingers", "You can now use " + "" + "Thieving Fingers scrolls" + "" + "."); + case 26: + return newstruct cs2func_script_1020_struct(49, 12444, "Blood Drain", "You can now use " + "" + "Blood Drain scrolls" + "" + "."); + case 27: + return newstruct cs2func_script_1020_struct(52, 12441, "Tireless Run", "You can now use " + "" + "Tireless Run scrolls" + "" + "."); + case 28: + return newstruct cs2func_script_1020_struct(54, 12454, "Abyssal Drain", "You can now use " + "" + "Abyssal Drain scrolls" + "" + "."); + case 29: + return newstruct cs2func_script_1020_struct(55, 12453, "Dissolve", "You can now use " + "" + "Dissolve scrolls" + "" + "."); + case 30: + return newstruct cs2func_script_1020_struct(56, 12463, "Steel Bull Rush", "You can now use " + "" + "Steel Bull Rush scrolls" + "" + "."); + case 31: + return newstruct cs2func_script_1020_struct(56, 12424, "Fish Rain", "You can now use " + "" + "Fish Rain scrolls" + "" + "."); + case 32: + return newstruct cs2func_script_1020_struct(57, 12836, "Ambush", "You can now use " + "" + "Ambush scrolls" + "" + "."); + case 33: + return newstruct cs2func_script_1020_struct(57, 12840, "Rending", "You can now use " + "" + "Rending scrolls" + "" + "."); + case 34: + return newstruct cs2func_script_1020_struct(57, 12835, "Goad", "You can now use " + "" + "Goad scrolls" + "" + "."); + case 35: + return newstruct cs2func_script_1020_struct(58, 12455, "Doomsphere Device", "You can now use " + "" + "Doomsphere Device scrolls" + "" + "."); + case 36: + return newstruct cs2func_script_1020_struct(61, 12468, "Dust Cloud", "You can now use " + "" + "Dust Cloud scrolls" + "" + "."); + case 37: + return newstruct cs2func_script_1020_struct(62, 12427, "Abyssal Stealth", "You can now use " + "" + "Abyssal Stealth scrolls" + "" + "."); + case 38: + return newstruct cs2func_script_1020_struct(63, 12436, "Ophidian Incubation", "You can now use " + "" + "Ophidian Incubation scrolls" + "" + "."); + case 39: + return newstruct cs2func_script_1020_struct(64, 12467, "Poisonous Blast", "You can now use " + "" + "Poisonous Blast scrolls" + "" + "."); + case 40: + return newstruct cs2func_script_1020_struct(66, 12464, "Mithril Bull Rush", "You can now use " + "" + "Mithril Bull Rush scrolls" + "" + "."); + case 41: + return newstruct cs2func_script_1020_struct(66, 12452, "Toad Bark", "You can now use " + "" + "Toad Bark scrolls" + "" + "."); + case 42: + return newstruct cs2func_script_1020_struct(67, 12439, "Testudo", "You can now use " + "" + "Testudo scrolls" + "" + "."); + case 43: + return newstruct cs2func_script_1020_struct(68, 12438, "Swallow Whole", "You can now use " + "" + "Swallow Whole scrolls" + "" + "."); + case 44: + return newstruct cs2func_script_1020_struct(69, 12423, "Fruitfall", "You can now use " + "" + "Fruitfall scrolls" + "" + "."); + case 45: + return newstruct cs2func_script_1020_struct(70, 12830, "Famine", "You can now use " + "" + "Famine scrolls" + "" + "."); + case 46: + return newstruct cs2func_script_1020_struct(71, 12451, "Arctic Blast", "You can now use " + "" + "Arctic Blast scrolls" + "" + "."); + case 47: + return newstruct cs2func_script_1020_struct(72, 14622, "Rise from the Ashes (after In Pyre Need)", "You can now use " + "" + "Rise from the Ashes scrolls" + "" + " (after In Pyre Need)."); + case 48: + return newstruct cs2func_script_1020_struct(73, 12826, "Volcanic Strength", "You can now use " + "" + "Volcanic Strength scrolls" + "" + "."); + case 49: + return newstruct cs2func_script_1020_struct(74, 12449, "Crushing Claw", "You can now use " + "" + "Crushing Claw scrolls" + "" + "."); + case 50: + return newstruct cs2func_script_1020_struct(75, 12450, "Mantis Strike", "You can now use " + "" + "Mantis Strike scrolls" + "" + "."); + case 51: + return newstruct cs2func_script_1020_struct(76, 12841, "Inferno", "You can now use " + "" + "Inferno scrolls" + "" + "."); + case 52: + return newstruct cs2func_script_1020_struct(76, 12465, "Adamant Bull Rush", "You can now use " + "" + "Adamant Bull Rush scrolls" + "" + "."); + case 53: + return newstruct cs2func_script_1020_struct(77, 12831, "Deadly Claw", "You can now use " + "" + "Deadly Claw scrolls" + "" + "."); + case 54: + return newstruct cs2func_script_1020_struct(78, 12457, "Acorn Missile", "You can now use " + "" + "Acorn Missile scrolls" + "" + "."); + case 55: + return newstruct cs2func_script_1020_struct(79, 12824, "Titan's Constitution", "You can now use " + "" + "Titan's Constitution scrolls" + "" + "."); + case 56: + return newstruct cs2func_script_1020_struct(80, 12442, "Regrowth", "You can now use " + "" + "Regrowth scrolls" + "" + "."); + case 57: + return newstruct cs2func_script_1020_struct(83, 12456, "Spike Shot", "You can now use " + "" + "Spike Shot scrolls" + "" + "."); + case 58: + return newstruct cs2func_script_1020_struct(83, 12837, "Ebon Thunder", "You can now use " + "" + "Ebon Thunder scrolls" + "" + "."); + case 59: + return newstruct cs2func_script_1020_struct(85, 12832, "Swamp Plague", "You can now use " + "" + "Swamp Plague scrolls" + "" + "."); + case 60: + return newstruct cs2func_script_1020_struct(86, 12466, "Rune Bull Rush", "You can now use " + "" + "Rune Bull Rush scrolls" + "" + "."); + case 61: + return newstruct cs2func_script_1020_struct(88, 12434, "Healing Aura", "You can now use " + "" + "Healing Aura scrolls" + "" + "."); + case 62: + return newstruct cs2func_script_1020_struct(89, 12833, "Boil", "You can now use " + "" + "Boil scrolls" + "" + "."); + case 63: + return newstruct cs2func_script_1020_struct(92, 12437, "Magic Focus", "You can now use " + "" + "Magic Focus scrolls" + "" + "."); + case 64: + return newstruct cs2func_script_1020_struct(93, 12827, "Essence Shipment", "You can now use " + "" + "Essence Shipment scrolls" + "" + "."); + case 65: + return newstruct cs2func_script_1020_struct(95, 12828, "Iron Within", "You can now use " + "" + "Iron Within scrolls" + "" + "."); + case 66: + return newstruct cs2func_script_1020_struct(96, 12435, "Winter Storage", "You can now use " + "" + "Winter Storage scrolls" + "" + "."); + case 67: + return newstruct cs2func_script_1020_struct(99, 12825, "Steel of Legends", "You can now use " + "" + "Steel of Legends scrolls" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_1020_struct(4, 12196, "Bulldog", "You can now raise " + "" + "bulldogs" + "" + "."); + case 1: + return newstruct cs2func_script_1020_struct(4, 12194, "Dalmatian", "You can now raise " + "" + "dalmatians" + "" + "."); + case 2: + return newstruct cs2func_script_1020_struct(4, 12192, "Greyhound", "You can now raise " + "" + "greyhounds" + "" + "."); + case 3: + return newstruct cs2func_script_1020_struct(4, 12193, "Labrador", "You can now raise " + "" + "labradors" + "" + "."); + case 4: + return newstruct cs2func_script_1020_struct(4, 12195, "Sheepdog", "You can now raise " + "" + "sheepdogs" + "" + "."); + case 5: + return newstruct cs2func_script_1020_struct(4, 12191, "Terrier", "You can now raise " + "" + "terriers" + "" + "."); + case 6: + return newstruct cs2func_script_1020_struct(4, 14652, "Creeping hand", "You can now keep " + "" + "creeping hands" + "" + "."); + case 7: + return newstruct cs2func_script_1020_struct(4, 14653, "Minitrice", "You can now keep " + "" + "minitrices" + "" + "."); + case 8: + return newstruct cs2func_script_1020_struct(4, 14654, "Baby basilisk", "You can now keep " + "" + "baby basilisks" + "" + "."); + case 9: + return newstruct cs2func_script_1020_struct(4, 14655, "Baby kurask", "You can now keep " + "" + "baby kurasks" + "" + "."); + case 10: + return newstruct cs2func_script_1020_struct(4, 14651, "Abyssal minion", "You can now keep " + "" + "abyssal minions" + "" + "."); + case 11: + return newstruct cs2func_script_1020_struct(4, 15483, "Rune guardian" + "
" + " (after Rune Mechanics)", "You can now keep " + "" + "rune guardians" + "" + " (after Rune Mechanics)"); + case 12: + return newstruct cs2func_script_1020_struct(10, 12488, "Gecko", "You can now raise " + "" + "geckos" + "" + "."); + case 13: + return newstruct cs2func_script_1020_struct(10, 12547, "Platypus" + "
" + " (after As a First Resort...)", "You can now raise " + "" + "platypodes" + "" + " (after As a First Resort...)."); + case 14: + return newstruct cs2func_script_1020_struct(23, 14533, "Broav" + "
" + " (after While Guthix Sleeps...)", "You can now raise " + "" + "broavs" + "" + " " + "
" + " (after While Guthix Sleeps...)."); + case 15: + return newstruct cs2func_script_1020_struct(30, 12188, "Penguin", "You can now raise " + "" + "penguins" + "" + "."); + case 16: + return newstruct cs2func_script_1020_struct(37, 18668, "Tooth pet", "You can now raise " + "" + "tooth pets" + "" + "."); + case 17: + return newstruct cs2func_script_1020_struct(40, 12198, "Giant crab", "You can now raise " + "" + "giant crabs" + "" + "."); + case 18: + return newstruct cs2func_script_1020_struct(50, 12485, "Raven", "You can now raise " + "" + "ravens" + "" + "."); + case 19: + return newstruct cs2func_script_1020_struct(60, 12200, "Squirrel", "You can now raise " + "" + "squirrels" + "" + "."); + case 20: + return newstruct cs2func_script_1020_struct(70, 12185, "Saradomin owl", "You can now raise " + "" + "Saradomin owls" + "" + "."); + case 21: + return newstruct cs2func_script_1020_struct(70, 12187, "Guthix raptor", "You can now raise " + "" + "Guthix raptors" + "" + "."); + case 22: + return newstruct cs2func_script_1020_struct(70, 12186, "Zamorak hawk", "You can now raise " + "" + "Zamorak hawks" + "" + "."); + case 23: + return newstruct cs2func_script_1020_struct(71, 13336, "Ex-ex-parrot" + "
" + " (after Rocking Out)", "You can now raise " + "" + "ex-ex-parrots" + "" + " (after Rocking Out)."); + case 24: + return newstruct cs2func_script_1020_struct(72, 14627, "Cute phoenix eggling" + "
" + " (after In Pyre Need)", "You can now raise " + "" + "cute phoenix egglings" + "" + " (after In Pyre Need)."); + case 25: + return newstruct cs2func_script_1020_struct(72, 14626, "Mean phoenix eggling" + "
" + " (after In Pyre Need)", "You can now raise " + "" + "mean phoenix egglings" + "" + " (after In Pyre Need)."); + case 26: + return newstruct cs2func_script_1020_struct(80, 12199, "Raccoon", "You can now raise " + "" + "raccoons" + "" + "."); + case 27: + return newstruct cs2func_script_1020_struct(80, 19894, "Sneakerpeeper" + "
" + " (with 80 Dungeoneering)", "You can now raise " + "" + "sneakerpeepers" + "" + ". (You also need level 80 Dungeoneering.)"); + case 28: + return newstruct cs2func_script_1020_struct(85, 12190, "Vulture", "You can now raise " + "" + "vultures" + "" + "."); + case 29: + return newstruct cs2func_script_1020_struct(90, 12203, "Chameleon", "You can now raise " + "" + "chameleons" + "" + "."); + case 30: + return newstruct cs2func_script_1020_struct(95, 12201, "Monkey", "You can now raise " + "" + "monkeys" + "" + "."); + case 31: + return newstruct cs2func_script_1020_struct(99, 12197, "Dragon", "You can now raise " + "" + "dragons" + "" + "."); + case 32: + return newstruct cs2func_script_1020_struct(99, 21512, "TzRek Jad", "You can now keep " + "" + "TzRek Jad" + "" + "."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1020_struct(10, 12204, "Antlers", "You can now use " + "" + "antlers" + "" + "."); + case 1: + return newstruct cs2func_script_1020_struct(20, 1161, "Adamant full helm" + "
" + " (with 30 Defence)", "You can now have " + "" + "adamant full helms" + "" + " enchanted to hold Summoning scrolls. (You also need level 30 Defence)."); + case 2: + return newstruct cs2func_script_1020_struct(20, 6326, "Snakeskin bandana" + "
" + " (with 30 Defence and 30 Ranged)", "You can now have " + "" + "snakeskin bandanas" + "" + " enchanted to hold Summoning scrolls. (You also need level 30 Defence and level 30 Ranged)."); + case 3: + return newstruct cs2func_script_1020_struct(20, 14636, "Slayer helmet" + "
" + " (with 10 Defence)", "You can now have " + "" + "Slayer helmets" + "" + " enchanted to hold Summoning scrolls. (You also need level 10 Defence)."); + case 4: + return newstruct cs2func_script_1020_struct(30, 12207, "Lizard skull", "You can now use " + "" + "lizard skulls" + "" + "."); + case 5: + return newstruct cs2func_script_1020_struct(30, 3385, "Splitbark helm" + "
" + " (with 40 Defence and 40 Magic)", "You can now have " + "" + "splitbark helms" + "" + " enchanted to hold Summoning scrolls. (You also need level 40 Defence and level 40 Magic)."); + case 6: + return newstruct cs2func_script_1020_struct(30, 1163, "Rune full helm" + "
" + " (with 40 Defence)", "You can now have " + "" + "rune full helms" + "" + " enchanted to hold Summoning scrolls. (You also need level 40 Defence)."); + case 7: + return newstruct cs2func_script_1020_struct(35, 3751, "Berserker helm" + "
" + " (after Fremennik Trials with 45 Defence)", "You can now have " + "" + "Berserker helms" + "" + " enchanted to hold Summoning scrolls. (After Fremennik Trials and with level 45 Defence)."); + case 8: + return newstruct cs2func_script_1020_struct(35, 3755, "Farseer helm" + "
" + " (after Fremennik Trials with 45 Defence)", "You can now have " + "" + "Farseer helms" + "" + " enchanted to hold Summoning scrolls. (After Fremennik Trials and with level 45 Defence)."); + case 9: + return newstruct cs2func_script_1020_struct(35, 3749, "Archer helm" + "
" + " (after Fremennik Trials with 45 Defence)", "You can now have " + "" + "Archer helms" + "" + " enchanted to hold Summoning scrolls. (After Fremennik Trials and with level 45 Defence)."); + case 10: + return newstruct cs2func_script_1020_struct(35, 3753, "Warrior helm" + "
" + " (after Fremennik Trials with 45 Defence)", "You can now have " + "" + "Warrior helms" + "" + " enchanted to hold Summoning scrolls. (After Fremennik Trials and with level 45 Defence)."); + case 11: + return newstruct cs2func_script_1020_struct(45, 10828, "Helm of Neitiznot" + "
" + " (after Fremennik Isles)", "You can now have the " + "" + "Helm of Neitiznot" + "" + " enchanted to hold Summoning scrolls (after Fremennik Isles)."); + case 12: + return newstruct cs2func_script_1020_struct(50, 12210, "Feather headdress", "You can now use " + "" + "feather headdresses" + "" + ". (You also need Level 79 Crafting to make feather headdresses)."); + case 13: + return newstruct cs2func_script_1020_struct(50, 1149, "Dragon medium helm" + "
" + " (with 60 Defence)", "You can now have " + "" + "dragon medium helms" + "" + " enchanted to hold Summoning scrolls. (You also need level 60 Defence.)"); + case 14: + return newstruct cs2func_script_1020_struct(50, 19893, "Spirit cape" + "
" + " (with 50 Defence and 50 Dungeoneering)", "You can now wear " + "" + "spirit capes" + "" + ". (You also need level 50 Defence and 50 Dungeoneering.)"); + case 15: + return newstruct cs2func_script_1020_struct(55, 9096, "Lunar helm" + "
" + " (with 40 Defence and 65 Magic)", "You can now have " + "" + "lunar helms" + "" + " enchanted to hold Summoning scrolls. (You also need level 40 Defence and level 65 Magic.)"); + case 16: + return newstruct cs2func_script_1020_struct(60, 11718, "Armadyl helm" + "
" + " (with 70 Defence and 70 Ranged)", "You can now have " + "" + "Armadyl helms" + "" + " enchanted to hold Summoning scrolls. (You also need level 70 Defence and level 70 Ranged.)"); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1020_struct(91, 18778, "Starved ancient effigies", "You can now investigate " + "" + "starved ancient effigies" + "" + " using your knowledge of Summoning."); + case 1: + return newstruct cs2func_script_1020_struct(93, 18779, "Nourished ancient effigies", "You can now investigate " + "" + "nourished ancient effigies" + "" + " using your knowledge of Summoning."); + case 2: + return newstruct cs2func_script_1020_struct(95, 18780, "Sated ancient effigies", "You can now investigate " + "" + "sated ancient effigies" + "" + " using your knowledge of Summoning."); + case 3: + return newstruct cs2func_script_1020_struct(97, 18781, "Gorged ancient effigies", "You can now investigate " + "" + "gorged ancient effigies" + "" + " using your knowledge of Summoning."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1020_struct(1, 14422, "Stealing Creation - class 1 clay being - Strength XP", "You can now summon " + "" + "class 1 clay beings" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_1020_struct(20, 14424, "Stealing Creation - class 2 clay being - Strength XP", "You can now summon " + "" + "class 2 clay beings" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_1020_struct(40, 14426, "Stealing Creation - class 3 clay being - Strength XP", "You can now summon " + "" + "class 3 clay beings" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_1020_struct(60, 14428, "Stealing Creation - class 4 clay being - Strength XP", "You can now summon " + "" + "class 4 clay beings" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_1020_struct(80, 14430, "Stealing Creation - class 5 clay being - Strength XP", "You can now summon " + "" + "class 5 clay beings" + "" + " in Stealing Creation."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_1020_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Summoning level increases, you will be able to attempt higher-level summoning tasks within Daemonheim. You will also be more likely to succeed when attempting summoning tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1020_struct(1, 17935, "Cub bloodrager (Melee, tier 1)" + "
" + "Gold charm, novite ore", "You can now infuse " + "" + "cub bloodrager pouches" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1020_struct(1, 18027, "Sundering Strike (Tier 1) scroll", "You can now use " + "" + "Sundering Strike (Tier 1) scrolls" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_1020_struct(2, 17985, "Cub deathslinger (Ranged, tier 1)" + "
" + "Gold charm, tangle gum branches", "You can now infuse " + "" + "cub deathslinger pouches" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1020_struct(2, 18037, "Poisonous Shot (Tier 1) scroll", "You can now use " + "" + " Poisonous Shot (Tier 1) scrolls" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_1020_struct(3, 17945, "Cub stormbringer (Magic, tier 1)" + "
" + "Gold charm, salve nettles", "You can now infuse " + "" + "cub stormbringer pouches" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_1020_struct(3, 18047, "Snaring Wave (Tier 1) scroll", "You can now use " + "" + " Snaring Wave (Tier 1) scrolls" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_1020_struct(5, 17955, "Cub hoardstalker (Forager, tier 1)" + "
" + "Gold charm, protomastyx hide", "You can now infuse " + "" + "cub hoardstalker pouches" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_1020_struct(5, 18057, "Aptitude (Tier 1) scroll", "You can now use " + "" + " Aptitude (Tier 1) scrolls" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_1020_struct(7, 17975, "Cub worldbearer (Beast of burden, tier 1)" + "
" + "Gold charm, protoleather torn bag", "You can now infuse " + "" + "cub worldbearer pouches" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1020_struct(7, 18067, "Second Wind (Tier 1) scroll", "You can now use " + "" + " Second Wind (Tier 1) scrolls" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_1020_struct(9, 17965, "Cub skinweaver (Healer, tier 1)" + "
" + "Gold charm, 2 cooked heim crabs", "You can now infuse " + "" + "cub skinweaver pouches" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_1020_struct(9, 18077, "Glimmer of Light (Tier 1) scroll", "You can now use " + "" + " Glimmer of Light (Tier 1) scrolls" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_1020_struct(11, 17936, "Little bloodrager (Melee, tier 2)" + "
" + "Gold charm, bathus ore", "You can now infuse " + "" + "little bloodrager pouches" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_1020_struct(11, 18028, "Sundering Strike (Tier 2) scroll", "You can now use " + "" + " Sundering Strike (Tier 2) scrolls" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_1020_struct(12, 17986, "Little deathslinger (Ranged, tier 2)" + "
" + "Gold charm, seeping elm branches", "You can now infuse " + "" + "little deathslinger pouches" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_1020_struct(12, 18038, "Poisonous Shot (Tier 2) scroll", "You can now use " + "" + " Poisonous Shot (Tier 2) scrolls" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_1020_struct(13, 17946, "Little stormbringer (Magic, tier 2)" + "
" + "Gold charm, wildercress stems", "You can now infuse " + "" + "little stormbringer pouches" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_1020_struct(13, 18048, "Snaring Wave (Tier 2) scroll", "You can now use " + "" + " Snaring Wave (Tier 2) scrolls" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_1020_struct(15, 17956, "Little hoardstalker (Forager, tier 2)" + "
" + "Gold charm, submastyx hide", "You can now infuse " + "" + "little hoardstalker pouches" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_1020_struct(15, 18058, "Aptitude (Tier 2) scroll", "You can now use " + "" + " Aptitude (Tier 2) scrolls" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_1020_struct(17, 17976, "Little worldbearer (Beast of burden, tier 2)" + "
" + "Gold charm, subleather torn bag", "You can now infuse " + "" + "little worldbearer pouches" + "" + " within Daemonheim."); + case 22: + return newstruct cs2func_script_1020_struct(17, 18068, "Second Wind (Tier 2) scroll", "You can now use " + "" + " Second Wind (Tier 2) scrolls" + "" + " within Daemonheim."); + case 23: + return newstruct cs2func_script_1020_struct(19, 17966, "Little skinweaver (Healer, tier 2)" + "
" + "Gold charm, 2 cooked red-eye", "You can now infuse " + "" + "little skinweaver pouches" + "" + " within Daemonheim."); + case 24: + return newstruct cs2func_script_1020_struct(19, 18078, "Glimmer of Light (Tier 2) scroll", "You can now use " + "" + " Glimmer of Light (Tier 2) scrolls" + "" + " within Daemonheim."); + case 25: + return newstruct cs2func_script_1020_struct(21, 17937, "Na\u00efve bloodrager (Melee, tier 3)" + "
" + "Gold charm, marmaros ore", "You can now infuse " + "" + "na\u00efve bloodrager pouches" + "" + " within Daemonheim."); + case 26: + return newstruct cs2func_script_1020_struct(21, 18029, "Sundering Strike (Tier 3) scroll", "You can now use " + "" + " Sundering Strike (Tier 3) scrolls" + "" + " within Daemonheim."); + case 27: + return newstruct cs2func_script_1020_struct(22, 17987, "Na\u00efve deathslinger (Ranged, tier 3)" + "
" + "Gold charm, blood spindle branches", "You can now infuse " + "" + "na\u00efve deathslinger pouches" + "" + " within Daemonheim."); + case 28: + return newstruct cs2func_script_1020_struct(22, 18039, "Poisonous Shot (Tier 3) scroll", "You can now use " + "" + " Poisonous Shot (Tier 3) scrolls" + "" + " within Daemonheim."); + case 29: + return newstruct cs2func_script_1020_struct(23, 17947, "Na\u00efve stormbringer (Magic, tier 3)" + "
" + "Gold charm, blightleaf gauze", "You can now infuse " + "" + "na\u00efve stormbringer pouches" + "" + " within Daemonheim."); + case 30: + return newstruct cs2func_script_1020_struct(23, 18049, "Snaring Wave (Tier 3) scroll", "You can now use " + "" + " Snaring Wave (Tier 3) scrolls" + "" + " within Daemonheim."); + case 31: + return newstruct cs2func_script_1020_struct(25, 17957, "Na\u00efve hoardstalker (Forager, tier 3)" + "
" + "Gold charm, paramastyx hide", "You can now infuse " + "" + "na\u00efve hoardstalker pouches" + "" + " within Daemonheim."); + case 32: + return newstruct cs2func_script_1020_struct(25, 18059, "Aptitude (Tier 3) scroll", "You can now use " + "" + " Aptitude (Tier 3) scrolls" + "" + " within Daemonheim."); + case 33: + return newstruct cs2func_script_1020_struct(27, 17977, "Na\u00efve worldbearer (Beast of burden, tier 3)" + "
" + "Gold charm, paraleather torn bag", "You can now infuse " + "" + "na\u00efve worldbearer pouches" + "" + " within Daemonheim."); + case 34: + return newstruct cs2func_script_1020_struct(27, 18069, "Second Wind (Tier 3) scroll", "You can now use " + "" + " Second Wind (Tier 3) scrolls" + "" + " within Daemonheim."); + case 35: + return newstruct cs2func_script_1020_struct(29, 17967, "Na\u00efve skinweaver (Healer, tier 3)" + "
" + "Gold charm, 2 cooked dusk eels", "You can now infuse " + "" + "na\u00efve skinweaver pouches" + "" + " within Daemonheim."); + case 36: + return newstruct cs2func_script_1020_struct(29, 18079, "Glimmer of Light (Tier 3) scroll", "You can now use " + "" + " Glimmer of Light (Tier 3) scrolls" + "" + " within Daemonheim."); + case 37: + return newstruct cs2func_script_1020_struct(31, 17938, "Keen bloodrager (Melee, tier 4)" + "
" + "Green charm, kratonite ore", "You can now infuse " + "" + "keen bloodrager pouches" + "" + " within Daemonheim."); + case 38: + return newstruct cs2func_script_1020_struct(31, 18030, "Sundering Strike (Tier 4) scroll", "You can now use " + "" + " Sundering Strike (Tier 4) scrolls" + "" + " within Daemonheim."); + case 39: + return newstruct cs2func_script_1020_struct(32, 17988, "Keen deathslinger (Ranged, tier 4)" + "
" + "Green charm, utuku branches", "You can now infuse " + "" + "keen deathslinger pouches" + "" + " within Daemonheim."); + case 40: + return newstruct cs2func_script_1020_struct(32, 18040, "Poisonous Shot (Tier 4) scroll", "You can now use " + "" + " Poisonous Shot (Tier 4) scrolls" + "" + " within Daemonheim."); + case 41: + return newstruct cs2func_script_1020_struct(33, 17948, "Keen stormbringer (Magic, tier 4)" + "
" + "Green charm, roseblood stems", "You can now infuse " + "" + "keen stormbringer pouches" + "" + " within Daemonheim."); + case 42: + return newstruct cs2func_script_1020_struct(33, 18050, "Snaring Wave (Tier 4) scroll", "You can now use " + "" + " Snaring Wave (Tier 4) scrolls" + "" + " within Daemonheim."); + case 43: + return newstruct cs2func_script_1020_struct(35, 17958, "Keen hoardstalker (Forager, tier 4)" + "
" + "Green charm, archaemastyx hide", "You can now infuse " + "" + "keen hoardstalker pouches" + "" + " within Daemonheim."); + case 44: + return newstruct cs2func_script_1020_struct(35, 18060, "Aptitude (Tier 4) scroll", "You can now use " + "" + " Aptitude (Tier 4) scrolls" + "" + " within Daemonheim."); + case 45: + return newstruct cs2func_script_1020_struct(37, 17978, "Keen worldbearer (Beast of burden, tier 4)" + "
" + "Green charm, archleather torn bag", "You can now infuse " + "" + "keen worldbearer pouches" + "" + " within Daemonheim."); + case 46: + return newstruct cs2func_script_1020_struct(37, 18070, "Second Wind (Tier 4) scroll", "You can now use " + "" + " Second Wind (Tier 4) scrolls" + "" + " within Daemonheim."); + case 47: + return newstruct cs2func_script_1020_struct(39, 17968, "Keen skinweaver (Healer, tier 4)" + "
" + "Green charm, 2 cooked giant flatfish", "You can now infuse " + "" + "keen skinweaver pouches" + "" + " within Daemonheim."); + case 48: + return newstruct cs2func_script_1020_struct(39, 18080, "Glimmer of Light (Tier 4) scroll", "You can now use " + "" + " Glimmer of Light (Tier 4) scrolls" + "" + " within Daemonheim."); + case 49: + return newstruct cs2func_script_1020_struct(41, 17939, "Brave bloodrager (Melee, tier 5)" + "
" + "Green charm, fractite ore", "You can now infuse " + "" + "brave bloodrager pouches" + "" + " within Daemonheim."); + case 50: + return newstruct cs2func_script_1020_struct(41, 18031, "Sundering Strike (Tier 5) scroll", "You can now use " + "" + " Sundering Strike (Tier 5) scrolls" + "" + " within Daemonheim."); + case 51: + return newstruct cs2func_script_1020_struct(42, 17989, "Brave deathslinger (Ranged, tier 5)" + "
" + "Green charm, spinebeam branches", "You can now infuse " + "" + "brave deathslinger pouches" + "" + " within Daemonheim."); + case 52: + return newstruct cs2func_script_1020_struct(42, 18041, "Poisonous Shot (Tier 5) scroll", "You can now use " + "" + " Poisonous Shot (Tier 5) scrolls" + "" + " within Daemonheim."); + case 53: + return newstruct cs2func_script_1020_struct(43, 17949, "Brave stormbringer (Magic, tier 5)" + "
" + "Green charm, bryll reeds", "You can now infuse " + "" + "brave stormbringer pouches" + "" + " within Daemonheim."); + case 54: + return newstruct cs2func_script_1020_struct(43, 18051, "Snaring Wave (Tier 5) scroll", "You can now use " + "" + " Snaring Wave (Tier 5) scrolls" + "" + " within Daemonheim."); + case 55: + return newstruct cs2func_script_1020_struct(45, 17959, "Brave hoardstalker (Forager, tier 5)" + "
" + "Green charm, dromomastyx hide", "You can now infuse " + "" + "brave hoardstalker pouches" + "" + " within Daemonheim."); + case 56: + return newstruct cs2func_script_1020_struct(45, 18061, "Aptitude (Tier 5) scroll", "You can now use " + "" + " Aptitude (Tier 5) scrolls" + "" + " within Daemonheim."); + case 57: + return newstruct cs2func_script_1020_struct(47, 17979, "Brave worldbearer (Beast of burden, tier 5)" + "
" + "Green charm, dromoleather torn bag", "You can now infuse " + "" + "brave worldbearer pouches" + "" + " within Daemonheim."); + case 58: + return newstruct cs2func_script_1020_struct(47, 18071, "Second Wind (Tier 5) scroll", "You can now use " + "" + " Second Wind (Tier 5) scrolls" + "" + " within Daemonheim."); + case 59: + return newstruct cs2func_script_1020_struct(49, 17969, "Brave skinweaver (Healer, tier 5)" + "
" + "Green charm, 2 cooked short-finned eels", "You can now infuse " + "" + "brave skinweaver pouches" + "" + " within Daemonheim."); + case 60: + return newstruct cs2func_script_1020_struct(49, 18081, "Glimmer of Light (Tier 5) scroll", "You can now use " + "" + " Glimmer of Light (Tier 5) scrolls" + "" + " within Daemonheim."); + case 61: + return newstruct cs2func_script_1020_struct(51, 17940, "Brah bloodrager (Melee, tier 6)" + "
" + "Green charm, zephyrium ore", "You can now infuse " + "" + "brah bloodrager pouches" + "" + " within Daemonheim."); + case 62: + return newstruct cs2func_script_1020_struct(51, 18032, "Sundering Strike (Tier 6) scroll", "You can now use " + "" + " Sundering Strike (Tier 6) scrolls" + "" + " within Daemonheim."); + case 63: + return newstruct cs2func_script_1020_struct(52, 17990, "Brah deathslinger (Ranged, tier 6)" + "
" + "Green charm, bovistrangler branches", "You can now infuse " + "" + "brah deathslinger pouches" + "" + " within Daemonheim."); + case 64: + return newstruct cs2func_script_1020_struct(52, 18042, "Poisonous Shot (Tier 6) scroll", "You can now use " + "" + " Poisonous Shot (Tier 6) scrolls" + "" + " within Daemonheim."); + case 65: + return newstruct cs2func_script_1020_struct(53, 17950, "Brah stormbringer (Magic, tier 6)" + "
" + "Green charm, duskweed sproutings", "You can now infuse " + "" + "brah stormbringer pouches" + "" + " within Daemonheim."); + case 66: + return newstruct cs2func_script_1020_struct(53, 18052, "Snaring Wave (Tier 6) scroll", "You can now use " + "" + " Snaring Wave (Tier 6) scrolls" + "" + " within Daemonheim."); + case 67: + return newstruct cs2func_script_1020_struct(55, 17960, "Brah hoardstalker (Forager, tier 6)" + "
" + "Green charm, spinomastyx hide", "You can now infuse " + "" + "brah hoardstalker pouches" + "" + " within Daemonheim."); + case 68: + return newstruct cs2func_script_1020_struct(55, 18062, "Aptitude (Tier 6) scroll", "You can now use " + "" + " Aptitude (Tier 6) scrolls" + "" + " within Daemonheim."); + case 69: + return newstruct cs2func_script_1020_struct(57, 17980, "Brah worldbearer (Beast of burden, tier 6)" + "
" + "Green charm, spinoleather torn bag", "You can now infuse " + "" + "brah worldbearer pouches" + "" + " within Daemonheim."); + case 70: + return newstruct cs2func_script_1020_struct(57, 18072, "Second Wind (Tier 6) scroll", "You can now use " + "" + " Second Wind (Tier 6) scrolls" + "" + " within Daemonheim."); + case 71: + return newstruct cs2func_script_1020_struct(59, 17970, "Brah skinweaver (Healer, tier 6)" + "
" + "Green charm, 2 cooked web snippers", "You can now infuse " + "" + "brah skinweaver pouches" + "" + " within Daemonheim."); + case 72: + return newstruct cs2func_script_1020_struct(59, 18082, "Glimmer of Light (Tier 6) scroll", "You can now use " + "" + " Glimmer of Light (Tier 6) scrolls" + "" + " within Daemonheim."); + case 73: + return newstruct cs2func_script_1020_struct(61, 17941, "Naabe bloodrager (Melee, tier 7)" + "
" + "Crimson charm, argonite ore", "You can now infuse " + "" + "naabe bloodrager pouches" + "" + " within Daemonheim."); + case 74: + return newstruct cs2func_script_1020_struct(61, 18033, "Sundering Strike (Tier 7) scroll", "You can now use " + "" + " Sundering Strike (Tier 7) scrolls" + "" + " within Daemonheim."); + case 75: + return newstruct cs2func_script_1020_struct(62, 17991, "Naabe deathslinger (Ranged, tier 7)" + "
" + "Crimson charm, thigat branches", "You can now infuse " + "" + "naabe deathslinger pouches" + "" + " within Daemonheim."); + case 76: + return newstruct cs2func_script_1020_struct(62, 18043, "Poisonous Shot (Tier 7) scroll", "You can now use " + "" + " Poisonous Shot (Tier 7) scrolls" + "" + " within Daemonheim."); + case 77: + return newstruct cs2func_script_1020_struct(63, 17951, "Naabe stormbringer (Magic, tier 7)" + "
" + "Crimson charm, soulbell roots", "You can now infuse " + "" + "naabe stormbringer pouches" + "" + " within Daemonheim."); + case 78: + return newstruct cs2func_script_1020_struct(63, 18053, "Snaring Wave (Tier 7) scroll", "You can now use " + "" + " Snaring Wave (Tier 7) scrolls" + "" + " within Daemonheim."); + case 79: + return newstruct cs2func_script_1020_struct(65, 17961, "Naabe hoardstalker (Forager, tier 7)" + "
" + "Crimson charm, gallimastyx hide", "You can now infuse " + "" + "naabe hoardstalker pouches" + "" + " within Daemonheim."); + case 80: + return newstruct cs2func_script_1020_struct(65, 18063, "Aptitude (Tier 7) scroll", "You can now use " + "" + " Aptitude (Tier 7) scrolls" + "" + " within Daemonheim."); + case 81: + return newstruct cs2func_script_1020_struct(67, 17981, "Naabe worldbearer (Beast of burden, tier 7)" + "
" + "Crimson charm, gallileather torn bag", "You can now infuse " + "" + "naabe worldbearer pouches" + "" + " within Daemonheim."); + case 82: + return newstruct cs2func_script_1020_struct(67, 18073, "Second Wind (Tier 7) scroll", "You can now use " + "" + " Second Wind (Tier 7) scrolls" + "" + " within Daemonheim."); + case 83: + return newstruct cs2func_script_1020_struct(69, 17971, "Naabe skinweaver (Healer, tier 7)" + "
" + "Crimson charm, 2 cooked bouldabass", "You can now infuse " + "" + "naabe skinweaver pouches" + "" + " within Daemonheim."); + case 84: + return newstruct cs2func_script_1020_struct(69, 18083, "Glimmer of Light (Tier 7) scroll", "You can now use " + "" + " Glimmer of Light (Tier 7) scrolls" + "" + " within Daemonheim."); + case 85: + return newstruct cs2func_script_1020_struct(71, 17942, "Wise bloodrager (Melee, tier 8)" + "
" + "Crimson charm, katagon ore", "You can now infuse " + "" + "wise bloodrager pouches" + "" + " within Daemonheim."); + case 86: + return newstruct cs2func_script_1020_struct(71, 18034, "Sundering Strike (Tier 8) scroll", "You can now use " + "" + " Sundering Strike (Tier 8) scrolls" + "" + " within Daemonheim."); + case 87: + return newstruct cs2func_script_1020_struct(72, 17992, "Wise deathslinger (Ranged, tier 8)" + "
" + "Crimson charm, corpsethorn branches", "You can now infuse " + "" + "wise deathslinger pouches" + "" + " within Daemonheim."); + case 88: + return newstruct cs2func_script_1020_struct(72, 18044, "Poisonous Shot (Tier 8) scroll", "You can now use " + "" + " Poisonous Shot (Tier 8) scrolls" + "" + " within Daemonheim."); + case 89: + return newstruct cs2func_script_1020_struct(73, 17952, "Wise stormbringer (Magic, tier 8)" + "
" + "Crimson charm, ectograss blades", "You can now infuse " + "" + "wise stormbringer pouches" + "" + " within Daemonheim."); + case 90: + return newstruct cs2func_script_1020_struct(73, 18054, "Snaring Wave (Tier 8) scroll", "You can now use " + "" + " Snaring Wave (Tier 8) scrolls" + "" + " within Daemonheim."); + case 91: + return newstruct cs2func_script_1020_struct(75, 17962, "Wise hoardstalker (Forager, tier 8)" + "
" + "Crimson charm, stegomastyx hide", "You can now infuse " + "" + "wise hoardstalker pouches" + "" + " within Daemonheim."); + case 92: + return newstruct cs2func_script_1020_struct(75, 18064, "Aptitude (Tier 8) scroll", "You can now use " + "" + " Aptitude (Tier 8) scrolls" + "" + " within Daemonheim."); + case 93: + return newstruct cs2func_script_1020_struct(77, 17982, "Wise worldbearer (Beast of burden, tier 8)" + "
" + "Crimson charm, stegoleather torn bag", "You can now infuse " + "" + "wise worldbearer pouches" + "" + " within Daemonheim."); + case 94: + return newstruct cs2func_script_1020_struct(77, 18074, "Second Wind (Tier 8) scroll", "You can now use " + "" + " Second Wind (Tier 8) scrolls" + "" + " within Daemonheim."); + case 95: + return newstruct cs2func_script_1020_struct(79, 17972, "Wise skinweaver (Healer, tier 8)" + "
" + "Crimson charm, 2 cooked salve eels", "You can now infuse " + "" + "wise skinweaver pouches" + "" + " within Daemonheim."); + case 96: + return newstruct cs2func_script_1020_struct(79, 18084, "Glimmer of Light (Tier 8) scroll", "You can now use " + "" + " Glimmer of Light (Tier 8) scrolls" + "" + " within Daemonheim."); + case 97: + return newstruct cs2func_script_1020_struct(81, 17943, "Adept bloodrager (Melee, tier 9)" + "
" + "Blue charm, gorgonite ore", "You can now infuse " + "" + "adept bloodrager pouches" + "" + " within Daemonheim."); + case 98: + return newstruct cs2func_script_1020_struct(81, 18035, "Sundering Strike (Tier 9) scroll", "You can now use " + "" + " Sundering Strike (Tier 9) scrolls" + "" + " within Daemonheim."); + case 99: + return newstruct cs2func_script_1020_struct(82, 17993, "Adept deathslinger (Ranged, tier 9)" + "
" + "Blue charm, entgallow branches", "You can now infuse " + "" + "adept deathslinger pouches" + "" + " within Daemonheim."); + case 100: + return newstruct cs2func_script_1020_struct(82, 18045, "Poisonous Shot (Tier 9) scroll", "You can now use " + "" + " Poisonous Shot (Tier 9) scrolls" + "" + " within Daemonheim."); + case 101: + return newstruct cs2func_script_1020_struct(83, 17953, "Adept stormbringer (Magic, tier 9)" + "
" + "Blue charm, runeleaf fibres", "You can now infuse " + "" + "adept stormbringer pouches" + "" + " within Daemonheim."); + case 102: + return newstruct cs2func_script_1020_struct(83, 18055, "Snaring Wave (Tier 9) scroll", "You can now use " + "" + " Snaring Wave (Tier 9) scrolls" + "" + " within Daemonheim."); + case 103: + return newstruct cs2func_script_1020_struct(85, 17963, "Adept hoardstalker (Forager, tier 9)" + "
" + "Blue charm, megamastyx hide", "You can now infuse " + "" + "adept hoardstalker pouches" + "" + " within Daemonheim."); + case 104: + return newstruct cs2func_script_1020_struct(85, 18065, "Aptitude (Tier 9) scroll", "You can now use " + "" + " Aptitude (Tier 9) scrolls" + "" + " within Daemonheim."); + case 105: + return newstruct cs2func_script_1020_struct(87, 17983, "Adept worldbearer (Beast of burden, tier 9)" + "
" + "Blue charm, megaleather torn bag", "You can now infuse " + "" + "adept worldbearer pouches" + "" + " within Daemonheim."); + case 106: + return newstruct cs2func_script_1020_struct(87, 18075, "Second Wind (Tier 9) scroll", "You can now use " + "" + " Second Wind (Tier 9) scrolls" + "" + " within Daemonheim."); + case 107: + return newstruct cs2func_script_1020_struct(89, 17973, "Adept skinweaver (Healer, tier 9)" + "
" + "Blue charm, 2 cooked blue crabs", "You can now infuse " + "" + "adept skinweaver pouches" + "" + " within Daemonheim."); + case 108: + return newstruct cs2func_script_1020_struct(89, 18085, "Glimmer of Light (Tier 9) scroll", "You can now use " + "" + " Glimmer of Light (Tier 9) scrolls" + "" + " within Daemonheim."); + case 109: + return newstruct cs2func_script_1020_struct(91, 17944, "Sachem bloodrager (Melee, tier 10)" + "
" + "Blue charm, promethium ore", "You can now infuse " + "" + "sachem bloodrager pouches" + "" + " within Daemonheim."); + case 110: + return newstruct cs2func_script_1020_struct(91, 18036, "Sundering Strike (Tier 10) scroll", "You can now use " + "" + " Sundering Strike (Tier 10) scrolls" + "" + " within Daemonheim."); + case 111: + return newstruct cs2func_script_1020_struct(92, 17994, "Sachem deathslinger (Ranged, tier 10)" + "
" + "Blue charm, grave creeper branches", "You can now infuse " + "" + "sachem deathslinger pouches" + "" + " within Daemonheim."); + case 112: + return newstruct cs2func_script_1020_struct(92, 18046, "Poisonous Shot (Tier 10) scroll", "You can now use " + "" + " Poisonous Shot (Tier 10) scrolls" + "" + " within Daemonheim."); + case 113: + return newstruct cs2func_script_1020_struct(93, 17954, "Sachem stormbringer (Magic, tier 10)" + "
" + "Blue charm, spiritbloom fibres", "You can now infuse " + "" + "sachem stormbringer pouches" + "" + " within Daemonheim."); + case 114: + return newstruct cs2func_script_1020_struct(93, 18056, "Snaring Wave (Tier 10) scroll", "You can now use " + "" + " Snaring Wave (Tier 10) scrolls" + "" + " within Daemonheim."); + case 115: + return newstruct cs2func_script_1020_struct(95, 17964, "Sachem hoardstalker (Forager, tier 10)" + "
" + "Blue charm, tyrannomastyx hide", "You can now infuse " + "" + "sachem hoardstalker pouches" + "" + " within Daemonheim."); + case 116: + return newstruct cs2func_script_1020_struct(95, 18066, "Aptitude (Tier 10) scroll", "You can now use " + "" + " Aptitude (Tier 10) scrolls" + "" + " within Daemonheim."); + case 117: + return newstruct cs2func_script_1020_struct(97, 17984, "Sachem worldbearer (Beast of burden, tier 10)" + "
" + "Blue charm, tyrannoleather torn bag", "You can now infuse " + "" + "sachem worldbearer pouches" + "" + " within Daemonheim."); + case 118: + return newstruct cs2func_script_1020_struct(97, 18076, "Second Wind (Tier 10) scroll", "You can now use " + "" + " Second Wind (Tier 10) scrolls" + "" + " within Daemonheim."); + case 119: + return newstruct cs2func_script_1020_struct(99, 17974, "Sachem skinweaver (Healer, tier 10)" + "
" + "Blue charm, 2 cooked cave morays", "You can now infuse " + "" + "sachem skinweaver pouches" + "" + " within Daemonheim."); + case 120: + return newstruct cs2func_script_1020_struct(99, 18086, "Glimmer of Light (Tier 10) scroll", "You can now use " + "" + " Glimmer of Light (Tier 10) scrolls" + "" + " within Daemonheim."); + } + break; + case 7: + if (((boolean)arg1)) { + return newstruct cs2func_script_1020_struct(99, 12169, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Summoning" + "" + ". Why not visit " + "" + "Pikkupstix" + "" + " in " + "" + "Taverley" + "" + "? He has something special only available to true masters of the " + "" + "Summoning" + "" + " skill!"); + } + } + return newstruct cs2func_script_1020_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1021.cs2 b/dumps/scripts/1021.cs2 new file mode 100644 index 000000000..8c99d2e26 --- /dev/null +++ b/dumps/scripts/1021.cs2 @@ -0,0 +1,37 @@ +cs2func_script_1021_struct(1,1,0) script_1021(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1021_struct(0, "Smelting"); + case 1: + return newstruct cs2func_script_1021_struct(0, "Bronze"); + case 2: + return newstruct cs2func_script_1021_struct(1, "Blurite"); + case 3: + return newstruct cs2func_script_1021_struct(0, "Iron"); + case 4: + return newstruct cs2func_script_1021_struct(0, "Steel"); + case 5: + return newstruct cs2func_script_1021_struct(0, "Mithril"); + case 6: + return newstruct cs2func_script_1021_struct(0, "Adamantite"); + case 7: + return newstruct cs2func_script_1021_struct(0, "Rune"); + case 8: + return newstruct cs2func_script_1021_struct(1, "Gold"); + case 9: + return newstruct cs2func_script_1021_struct(1, "Elemental"); + case 10: + return newstruct cs2func_script_1021_struct(1, "Bane"); + case 11: + return newstruct cs2func_script_1021_struct(0, "Artisan Workshop"); + case 12: + return newstruct cs2func_script_1021_struct(0, "Other"); + case 13: + return newstruct cs2func_script_1021_struct(1, "Minigames"); + case 14: + return newstruct cs2func_script_1021_struct(0, "Dungeoneering"); + case 15: + return newstruct cs2func_script_1021_struct(0, "Milestones"); + } + return newstruct cs2func_script_1021_struct(-1, ""); +} diff --git a/dumps/scripts/1022.cs2 b/dumps/scripts/1022.cs2 new file mode 100644 index 000000000..93915a873 --- /dev/null +++ b/dumps/scripts/1022.cs2 @@ -0,0 +1,1113 @@ +cs2func_script_1022_struct(2,2,0) script_1022(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(1, 2349, "Bronze" + "
" + " 1 tin ore and 1 copper ore", "You can now smelt " + "" + "bronze" + "" + "."); + case 1: + return newstruct cs2func_script_1022_struct(8, 9467, "Blurite" + "
" + " (after The Knight's Sword)", "You now have the Smithing level required to smelt " + "" + "blurite" + "" + " (after The Knight's Sword)."); + case 2: + return newstruct cs2func_script_1022_struct(15, 2351, "Iron" + "
" + " 50% chance of success, rising until level 45", "You can now smelt " + "" + "iron" + "" + "."); + case 3: + return newstruct cs2func_script_1022_struct(20, 2893, "Members: Elemental metal" + "
" + " (after Elemental Workshop)", "Members now have the Smithing level required to smelt " + "" + "elemental metal" + "" + " (after Elemental Workshop)."); + case 4: + return newstruct cs2func_script_1022_struct(20, 2355, "Silver", "You can now smelt " + "" + "silver" + "" + "."); + case 5: + return newstruct cs2func_script_1022_struct(30, 2353, "Steel" + "
" + " 2 coal and 1 iron ore", "You can now smelt " + "" + "steel" + "" + "."); + case 6: + return newstruct cs2func_script_1022_struct(40, 2357, "Gold", "You can now smelt " + "" + "gold" + "" + "."); + case 7: + return newstruct cs2func_script_1022_struct(45, 2351, "Iron" + "
" + " 80% chance of success", "Your chance of successfully smelting " + "" + "iron" + "" + " has reached its maximum."); + case 8: + return newstruct cs2func_script_1022_struct(50, 2359, "Mithril" + "
" + " 4 coal and 1 mithril ore", "You can now smelt " + "" + "mithril" + "" + "."); + case 9: + return newstruct cs2func_script_1022_struct(70, 2361, "Adamant" + "
" + " 6 coal and 1 adamantite ore", "You can now smelt " + "" + "adamantite" + "" + "."); + case 10: + return newstruct cs2func_script_1022_struct(77, 21778, "Members: Bane ore" + "
" + " (after Ritual of the Mahjarrat)", "Members now have the Smithing level required to smelt " + "" + "bane ore" + "" + " (after Ritual of the Mahjarrat)."); + case 11: + return newstruct cs2func_script_1022_struct(85, 2363, "Rune" + "
" + " 8 coal and 1 runite ore", "You can now smelt " + "" + "runite" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(1, 1205, "Bronze dagger" + "
" + " 1 bar", "You can now smith " + "" + "bronze daggers" + "" + "."); + case 1: + return newstruct cs2func_script_1022_struct(1, 1351, "Bronze hatchet" + "
" + " 1 bar", "You can now smith " + "" + "bronze hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_1022_struct(2, 1422, "Bronze mace" + "
" + " 1 bar", "You can now smith " + "" + "bronze maces" + "" + "."); + case 3: + return newstruct cs2func_script_1022_struct(3, 1139, "Bronze medium helm" + "
" + " 1 bar", "You can now smith " + "" + "bronze medium helms" + "" + "."); + case 4: + return newstruct cs2func_script_1022_struct(3, 9375, "Members: Bronze crossbow bolt" + "
" + " 1 bar makes 10", "Members can now smith " + "" + "bronze crossbow bolts" + "" + "."); + case 5: + return newstruct cs2func_script_1022_struct(4, 1277, "Bronze sword" + "
" + " 1 bar", "You can now smith " + "" + "bronze swords" + "" + "."); + case 6: + return newstruct cs2func_script_1022_struct(4, 819, "Members: Bronze dart tip" + "
" + " (after Tourist Trap)" + "
" + " 1 bar makes 10", "Members now have the Smithing level required to smith bronze dart tips" + "" + " (after Tourist Trap)."); + case 7: + return newstruct cs2func_script_1022_struct(4, 1794, "Members: Bronze wire" + "
" + " 1 bar", "Members can now smith " + "" + "bronze wire" + "" + "."); + case 8: + return newstruct cs2func_script_1022_struct(4, 4819, "Members: Bronze nails" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "bronze nails" + "" + "."); + case 9: + return newstruct cs2func_script_1022_struct(5, 1321, "Bronze scimitar" + "
" + " 2 bars", "You can now smith " + "" + "bronze scimitars" + "" + "."); + case 10: + return newstruct cs2func_script_1022_struct(5, 1237, "Members: Bronze spear" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "bronze spears" + "" + " (after Tai Bwo Wannai Trio)."); + case 11: + return newstruct cs2func_script_1022_struct(5, 11367, "Members: Bronze hasta" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "bronze hastae" + "" + " (after Tai Bwo Wannai Trio)."); + case 12: + return newstruct cs2func_script_1022_struct(5, 39, "Members: Bronze arrowhead" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "bronze arrowheads" + "" + "."); + case 13: + return newstruct cs2func_script_1022_struct(5, 1265, "Members: Bronze pickaxe" + "
" + " (after Perils of Ice Mountain)" + "
" + " 2 bars", "Members now have the Smithing level required to smith bronze " + "" + "pickaxes" + "" + " (after Perils of Ice Mountain)."); + case 14: + return newstruct cs2func_script_1022_struct(6, 9420, "Members: Bronze crossbow limbs" + "
" + " 1 bar", "Members can now smith " + "" + "bronze crossbow limbs" + "" + "."); + case 15: + return newstruct cs2func_script_1022_struct(6, 1291, "Bronze longsword" + "
" + " 2 bars", "You can now smith " + "" + "bronze longswords" + "" + "."); + case 16: + return newstruct cs2func_script_1022_struct(7, 1155, "Bronze full helm" + "
" + " 2 bars", "You can now smith " + "" + "bronze full helms" + "" + "."); + case 17: + return newstruct cs2func_script_1022_struct(7, 864, "Members: Bronze throwing knife" + "
" + " 1 bar makes 5", "Members can now smith " + "" + "bronze throwing knives" + "" + "."); + case 18: + return newstruct cs2func_script_1022_struct(8, 1173, "Bronze square shield" + "
" + " 2 bars", "You can now smith " + "" + "bronze square shields" + "" + "."); + case 19: + return newstruct cs2func_script_1022_struct(9, 1337, "Bronze warhammer" + "
" + " 3 bars", "You can now smith " + "" + "bronze warhammers" + "" + "."); + case 20: + return newstruct cs2func_script_1022_struct(10, 1375, "Bronze battleaxe" + "
" + " 3 bars", "You can now smith " + "" + "bronze battleaxes" + "" + "."); + case 21: + return newstruct cs2func_script_1022_struct(11, 1103, "Bronze chainbody" + "
" + " 3 bars", "You can now smith " + "" + "bronze chainbodies" + "" + "."); + case 22: + return newstruct cs2func_script_1022_struct(12, 1189, "Bronze kiteshield" + "
" + " 3 bars", "You can now smith " + "" + "bronze kiteshields" + "" + "."); + case 23: + return newstruct cs2func_script_1022_struct(13, 3095, "Members: Bronze claws" + "
" + " (after Death Plateau)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "bronze claws" + "" + " (after Death Plateau)."); + case 24: + return newstruct cs2func_script_1022_struct(14, 1307, "Bronze two-handed sword" + "
" + " 3 bars", "You can now smith " + "" + "bronze two-handed swords" + "" + "."); + case 25: + return newstruct cs2func_script_1022_struct(16, 1075, "Bronze platelegs" + "
" + " 3 bars", "You can now smith " + "" + "bronze platelegs" + "" + "."); + case 26: + return newstruct cs2func_script_1022_struct(16, 1087, "Bronze plateskirt" + "
" + " 3 bars", "You can now smith " + "" + "bronze plateskirts" + "" + "."); + case 27: + return newstruct cs2func_script_1022_struct(18, 1117, "Bronze platebody" + "
" + " 5 bars", "You can now smith " + "" + "bronze platebodies" + "" + "."); + } + break; + case 2: + if (((boolean)arg1)) { + return newstruct cs2func_script_1022_struct(-1, 7620, "You will not be able to smith blurite until you have completed The Knight's Sword.", ""); + } + if (((boolean)arg1)) { + return newstruct cs2func_script_1022_struct(8, 9376, "Blurite crossbow bolts" + "
" + " 1 bar makes 10", "Members now have the Smithing level required to smith " + "" + "blurite crossbow bolts" + "" + " (after the Knight's Sword)."); + } + if (arg1 == 2) { + return newstruct cs2func_script_1022_struct(13, 9422, "Blurite crossbow limbs" + "
" + " 1 bar", "Members now have the Smithing level required to smith " + "" + "blurite crossbow limbs" + "" + " (after The Knight's Sword)."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(15, 1203, "Iron dagger" + "
" + " 1 bar", "You can now smith " + "" + "iron daggers" + "" + "."); + case 1: + return newstruct cs2func_script_1022_struct(16, 1349, "Iron hatchet" + "
" + " 1 bar", "You can now smith " + "" + "iron hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_1022_struct(17, 1420, "Iron mace" + "
" + " 1 bar", "You can now smith " + "" + "iron maces" + "" + "."); + case 3: + return newstruct cs2func_script_1022_struct(17, 7225, "Members: Iron spit" + "
" + " 1 bar", "Members can now smith " + "" + "iron spits" + "" + "."); + case 4: + return newstruct cs2func_script_1022_struct(18, 1137, "Iron medium helm" + "
" + " 1 bar", "You can now smith " + "" + "iron medium helms" + "" + "."); + case 5: + return newstruct cs2func_script_1022_struct(18, 9377, "Members: Iron crossbow bolt" + "
" + " 1 bar makes 10", "Members can now smith " + "" + "iron crossbow bolts" + "" + "."); + case 6: + return newstruct cs2func_script_1022_struct(19, 1279, "Iron sword" + "
" + " 1 bar", "You can now smith " + "" + "iron swords" + "" + "."); + case 7: + return newstruct cs2func_script_1022_struct(19, 820, "Members: Iron dart tip" + "
" + " (after Tourist Trap)" + "
" + " 1 bar makes 10", "Members now have the Smithing level required to smith " + "" + "iron dart tips" + "" + " (after Tourist Trap)."); + case 8: + return newstruct cs2func_script_1022_struct(19, 4820, "Members: Iron nails" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "iron nails" + "" + "."); + case 9: + return newstruct cs2func_script_1022_struct(20, 1323, "Iron scimitar" + "
" + " 2 bars", "You can now smith " + "" + "iron scimitars" + "" + "."); + case 10: + return newstruct cs2func_script_1022_struct(20, 1239, "Members: Iron spear" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 oak log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "iron spears" + "" + " (after Tai Bwo Wannai Trio)."); + case 11: + return newstruct cs2func_script_1022_struct(20, 11369, "Members: Iron hasta" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 oak log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "iron hastae" + "" + " (after Tai Bwo Wannai Trio)."); + case 12: + return newstruct cs2func_script_1022_struct(20, 40, "Members: Iron arrowhead" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "iron arrowheads" + "" + "."); + case 13: + return newstruct cs2func_script_1022_struct(20, 1267, "Members: Iron pickaxe" + "
" + " (after Perils of Ice Mountain)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "iron pickaxes" + "" + " (after Perils of Ice Mountain)."); + case 14: + return newstruct cs2func_script_1022_struct(21, 1293, "Iron longsword" + "
" + " 2 bars", "You can now smith " + "" + "iron longswords" + "" + "."); + case 15: + return newstruct cs2func_script_1022_struct(22, 1153, "Iron full helm" + "
" + " 2 bars", "You can now smith " + "" + "iron full helms" + "" + "."); + case 16: + return newstruct cs2func_script_1022_struct(22, 863, "Members: Iron throwing knife" + "
" + " 1 bar makes 5", "Members can now smith " + "" + "iron throwing knives" + "" + "."); + case 17: + return newstruct cs2func_script_1022_struct(23, 1175, "Iron square shield" + "
" + " 2 bars", "You can now smith " + "" + "iron square shields" + "" + "."); + case 18: + return newstruct cs2func_script_1022_struct(23, 9423, "Members: Iron crossbow limbs" + "
" + " 1 bar", "Members can now smith " + "" + "iron crossbow limbs" + "" + "."); + case 19: + return newstruct cs2func_script_1022_struct(24, 1335, "Iron warhammer" + "
" + " 3 bars", "You can now smith " + "" + "iron warhammers" + "" + "."); + case 20: + return newstruct cs2func_script_1022_struct(25, 1363, "Iron battleaxe" + "
" + " 3 bars", "You can now smith " + "" + "iron battleaxes" + "" + "."); + case 21: + return newstruct cs2func_script_1022_struct(26, 1101, "Iron chainbody" + "
" + " 3 bars", "You can now smith " + "" + "iron chainbodies" + "" + "."); + case 22: + return newstruct cs2func_script_1022_struct(26, 4540, "Members: Oil lantern frame" + "
" + " 1 bar", "Members can now smith " + "" + "oil lantern frames" + "" + "."); + case 23: + return newstruct cs2func_script_1022_struct(27, 1191, "Iron kiteshield" + "
" + " 3 bars", "You can now smith " + "" + "iron kiteshields" + "" + "."); + case 24: + return newstruct cs2func_script_1022_struct(28, 3096, "Members: Iron claws" + "
" + " (after Death Plateau)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "iron claws" + "" + " (after Death Plateau)."); + case 25: + return newstruct cs2func_script_1022_struct(29, 1309, "Iron two-handed sword" + "
" + " 3 bars", "You can now smith " + "" + "iron two-handed swords" + "" + "."); + case 26: + return newstruct cs2func_script_1022_struct(31, 1067, "Iron platelegs" + "
" + " 3 bars", "You can now smith " + "" + "iron platelegs" + "" + "."); + case 27: + return newstruct cs2func_script_1022_struct(31, 1081, "Iron plateskirt" + "
" + " 3 bars", "You can now smith " + "" + "iron plateskirts" + "" + "."); + case 28: + return newstruct cs2func_script_1022_struct(33, 1115, "Iron platebody" + "
" + " 5 bars", "You can now smith " + "" + "iron platebodies" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(30, 1207, "Steel dagger" + "
" + " 1 bar", "You can now smith " + "" + "steel daggers" + "" + "."); + case 1: + return newstruct cs2func_script_1022_struct(31, 1353, "Steel hatchet" + "
" + " 1 bar", "You can now smith " + "" + "steel hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_1022_struct(32, 1424, "Steel mace" + "
" + " 1 bar", "You can now smith " + "" + "steel maces" + "" + "."); + case 3: + return newstruct cs2func_script_1022_struct(33, 1141, "Steel medium helm" + "
" + " 1 bar", "You can now smith " + "" + "steel medium helms" + "" + "."); + case 4: + return newstruct cs2func_script_1022_struct(33, 9378, "Members: Steel crossbow bolt" + "
" + " 1 bar makes 10", "Members can now smith " + "" + "steel crossbow bolts" + "" + "."); + case 5: + return newstruct cs2func_script_1022_struct(34, 1281, "Steel sword" + "
" + " 1 bar", "You can now smith " + "" + "steel swords" + "" + "."); + case 6: + return newstruct cs2func_script_1022_struct(34, 1539, "Steel nails" + "
" + " 1 bar makes 15", "You can now smith " + "" + "steel nails" + "" + "."); + case 7: + return newstruct cs2func_script_1022_struct(34, 821, "Members: Steel dart tip" + "
" + " (after Tourist Trap)" + "
" + " 1 bar makes 10", "Members now have the Smithing level required to smith " + "" + "steel dart tips" + "" + " (after Tourist Trap)."); + case 8: + return newstruct cs2func_script_1022_struct(35, 1325, "Steel scimitar" + "
" + " 2 bars", "You can now smith " + "" + "steel scimitars" + "" + "."); + case 9: + return newstruct cs2func_script_1022_struct(35, 1241, "Members: Steel spear" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 willow log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "steel spears" + "" + " (after Tai Bwo Wannai Trio)."); + case 10: + return newstruct cs2func_script_1022_struct(35, 11371, "Members: Steel hasta" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 willow log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "steel hastae" + "" + " (after Tai Bwo Wannai Trio)."); + case 11: + return newstruct cs2func_script_1022_struct(35, 41, "Members: Steel arrowhead" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "steel arrowheads" + "" + "."); + case 12: + return newstruct cs2func_script_1022_struct(35, 2, "Members: Cannonball" + "
" + " (after Dwarf Cannon)" + "
" + " 1 bar makes 4", "Members now have the Smithing level required to smith " + "" + "steel cannonballs" + "" + " (after Dwarf Cannon)."); + case 13: + return newstruct cs2func_script_1022_struct(35, 1269, "Members: Steel pickaxe" + "
" + " (after Perils of Ice Mountain)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "steel pickaxes" + "" + " (after Perils of Ice Mountain)."); + case 14: + return newstruct cs2func_script_1022_struct(36, 9425, "Members: Steel crossbow limbs" + "
" + " 1 bar", "Members can now smith " + "" + "steel crossbow limbs" + "" + "."); + case 15: + return newstruct cs2func_script_1022_struct(36, 1295, "Steel longsword" + "
" + " 2 bars", "You can now smith " + "" + "steel longswords" + "" + "."); + case 16: + return newstruct cs2func_script_1022_struct(36, 2370, "Members: Steel studs" + "
" + " 1 bar", "Members can now smith " + "" + "steel studs" + "" + "."); + case 17: + return newstruct cs2func_script_1022_struct(37, 1157, "Steel full helm" + "
" + " 2 bars", "You can now smith " + "" + "steel full helms" + "" + "."); + case 18: + return newstruct cs2func_script_1022_struct(37, 865, "Members: Steel throwing knife" + "
" + " 1 bar makes 5", "Members can now smith " + "" + "steel throwing knives" + "" + "."); + case 19: + return newstruct cs2func_script_1022_struct(38, 1177, "Steel square shield" + "
" + " 2 bars", "You can now smith " + "" + "steel square shields" + "" + "."); + case 20: + return newstruct cs2func_script_1022_struct(39, 1339, "Steel warhammer" + "
" + " 3 bars", "You can now smith " + "" + "steel warhammers" + "" + "."); + case 21: + return newstruct cs2func_script_1022_struct(40, 1365, "Steel battleaxe" + "
" + " 3 bars", "You can now smith " + "" + "steel battleaxes" + "" + "."); + case 22: + return newstruct cs2func_script_1022_struct(41, 1105, "Steel chainbody" + "
" + " 3 bars", "You can now smith " + "" + "steel chainbodies" + "" + "."); + case 23: + return newstruct cs2func_script_1022_struct(42, 1193, "Steel kiteshield" + "
" + " 3 bars", "You can now smith " + "" + "steel kiteshields" + "" + "."); + case 24: + return newstruct cs2func_script_1022_struct(43, 3097, "Members: Steel claws" + "
" + " (after Death Plateau)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "steel claws" + "" + " (after Death Plateau)."); + case 25: + return newstruct cs2func_script_1022_struct(44, 1311, "Steel two-handed sword" + "
" + " 3 bars", "You can now smith " + "" + "steel two-handed swords" + "" + "."); + case 26: + return newstruct cs2func_script_1022_struct(46, 1069, "Steel platelegs" + "
" + " 3 bars", "You can now smith " + "" + "steel platelegs" + "" + "."); + case 27: + return newstruct cs2func_script_1022_struct(46, 1083, "Steel plateskirt" + "
" + " 3 bars", "You can now smith " + "" + "steel plateskirts" + "" + "."); + case 28: + return newstruct cs2func_script_1022_struct(48, 1119, "Steel platebody" + "
" + " 5 bars", "You can now smith " + "" + "steel platebodies" + "" + "."); + case 29: + return newstruct cs2func_script_1022_struct(49, 4544, "Members: Bullseye lantern frame" + "
" + " 1 bar", "Members can now smith " + "" + "bullseye lantern frames" + "" + "."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(50, 1209, "Mithril dagger" + "
" + " 1 bar", "You can now smith " + "" + "mithril daggers" + "" + "."); + case 1: + return newstruct cs2func_script_1022_struct(51, 1355, "Mithril hatchet" + "
" + " 1 bar", "You can now smith " + "" + "mithril hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_1022_struct(52, 1428, "Mithril mace" + "
" + " 1 bar", "You can now smith " + "" + "mithril maces" + "" + "."); + case 3: + return newstruct cs2func_script_1022_struct(53, 1143, "Mithril medium helm" + "
" + " 1 bar", "You can now smith " + "" + "mithril medium helms" + "" + "."); + case 4: + return newstruct cs2func_script_1022_struct(53, 9379, "Members: Mithril crossbow bolt" + "
" + " 1 bar makes 10", "Members can now smith " + "" + "mithril crossbow bolts" + "" + "."); + case 5: + return newstruct cs2func_script_1022_struct(54, 1285, "Mithril sword" + "
" + " 1 bar", "You can now smith " + "" + "mithril swords" + "" + "."); + case 6: + return newstruct cs2func_script_1022_struct(54, 822, "Members: Mithril dart tip" + "
" + " (after Tourist Trap)" + "
" + " 1 bar makes 10", "Members now have the Smithing level required to smith " + "" + "mithril dart tips" + "" + " (after Tourist Trap)."); + case 7: + return newstruct cs2func_script_1022_struct(54, 4822, "Members: Mithril nail" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "mithril nails" + "" + "."); + case 8: + return newstruct cs2func_script_1022_struct(55, 1329, "Mithril scimitar" + "
" + " 2 bars", "You can now smith " + "" + "mithril scimitars" + "" + "."); + case 9: + return newstruct cs2func_script_1022_struct(55, 1243, "Members: Mithril spear" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 maple log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "mithril spears" + "" + " (after Tai Bwo Wannai Trio)."); + case 10: + return newstruct cs2func_script_1022_struct(55, 11373, "Members: Mithril hasta" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 maple log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "mithril hastae" + "" + " (after Tai Bwo Wannai Trio)."); + case 11: + return newstruct cs2func_script_1022_struct(55, 42, "Members: Mithril arrowhead" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "mithril arrowheads" + "" + "."); + case 12: + return newstruct cs2func_script_1022_struct(55, 1273, "Members: Mithril pickaxe" + "
" + " (after Perils of Ice Mountain)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "mithril pickaxes" + "" + " (after Perils of Ice Mountain)."); + case 13: + return newstruct cs2func_script_1022_struct(56, 9427, "Members: Mithril crossbow limbs" + "
" + " 1 bar", "Members can now smith " + "" + "mithril crossbow limbs" + "" + "."); + case 14: + return newstruct cs2func_script_1022_struct(56, 1299, "Mithril longsword" + "
" + " 2 bars", "You can now smith " + "" + "mithril longswords" + "" + "."); + case 15: + return newstruct cs2func_script_1022_struct(57, 1159, "Mithril full helm" + "
" + " 2 bars", "You can now smith " + "" + "mithril full helms" + "" + "."); + case 16: + return newstruct cs2func_script_1022_struct(57, 866, "Members: Mithril throwing knife" + "
" + " 1 bar makes 5", "Members can now smith " + "" + "mithril throwing knives" + "" + "."); + case 17: + return newstruct cs2func_script_1022_struct(58, 1181, "Mithril square shield" + "
" + " 2 bars", "You can now smith " + "" + "mithril square shields" + "" + "."); + case 18: + return newstruct cs2func_script_1022_struct(59, 1343, "Mithril warhammer" + "
" + " 3 bars", "You can now smith " + "" + "mithril warhammers" + "" + "."); + case 19: + return newstruct cs2func_script_1022_struct(59, 9416, "Members: Mithril crossbow grapple tip" + "
" + " 1 bar", "Members can now smith " + "" + "mithril crossbow grapple tips" + "" + "."); + case 20: + return newstruct cs2func_script_1022_struct(60, 1369, "Mithril battleaxe" + "
" + " 3 bars", "You can now smith " + "" + "mithril battleaxes" + "" + "."); + case 21: + return newstruct cs2func_script_1022_struct(61, 1109, "Mithril chainbody" + "
" + " 3 bars", "You can now smith" + "" + " mithril chainbodies" + "" + "."); + case 22: + return newstruct cs2func_script_1022_struct(62, 1197, "Mithril kiteshield" + "
" + " 3 bars", "You can now smith " + "" + "mithril kiteshields" + "" + "."); + case 23: + return newstruct cs2func_script_1022_struct(63, 3099, "Members: Mithril claws" + "
" + " (after Death Plateau)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "mithril claws" + "" + " (after Death Plateau)."); + case 24: + return newstruct cs2func_script_1022_struct(64, 1315, "Mithril two-handed sword" + "
" + " 3 bars", "You can now smith " + "" + "mithril two-handed swords" + "" + "."); + case 25: + return newstruct cs2func_script_1022_struct(66, 1071, "Mithril platelegs" + "
" + " 3 bars", "You can now smith " + "" + "mithril platelegs" + "" + "."); + case 26: + return newstruct cs2func_script_1022_struct(66, 1085, "Mithril plateskirt" + "
" + " 3 bars", "You can now smith " + "" + "mithril plateskirts" + "" + "."); + case 27: + return newstruct cs2func_script_1022_struct(68, 1121, "Mithril platebody" + "
" + " 5 bars", "You can now smith " + "" + "mithril platebodies" + "" + "."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(70, 1211, "Adamant dagger" + "
" + " 1 bar", "You can now smith " + "" + "adamant daggers" + "" + "."); + case 1: + return newstruct cs2func_script_1022_struct(71, 1357, "Adamant hatchet" + "
" + " 1 bar", "You can now smith " + "" + "adamant hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_1022_struct(72, 1430, "Adamant mace" + "
" + " 1 bar", "You can now smith " + "" + "adamant maces" + "" + "."); + case 3: + return newstruct cs2func_script_1022_struct(73, 1145, "Adamant medium helm" + "
" + " 1 bar", "You can now smith " + "" + "adamant medium helms" + "" + "."); + case 4: + return newstruct cs2func_script_1022_struct(73, 9380, "Members: Adamant crossbow bolt" + "
" + " 1 bar makes 10", "Members can now smith " + "" + "adamant crossbow bolts" + "" + "."); + case 5: + return newstruct cs2func_script_1022_struct(74, 1287, "Adamant sword" + "
" + " 1 bar", "You can now smith " + "" + "adamant swords" + "" + "."); + case 6: + return newstruct cs2func_script_1022_struct(74, 823, "Members: Adamant dart tip" + "
" + " (after Tourist Trap)" + "
" + " 1 bar makes 10", "Members now have the Smithing level required to smith " + "" + "adamant dart tips" + "" + " (after Tourist Trap)."); + case 7: + return newstruct cs2func_script_1022_struct(74, 4823, "Members: Adamant nail" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "adamant nails" + "" + "."); + case 8: + return newstruct cs2func_script_1022_struct(75, 1331, "Adamant scimitar" + "
" + " 2 bars", "You can now smith " + "" + "adamant scimitars" + "" + "."); + case 9: + return newstruct cs2func_script_1022_struct(75, 1245, "Members: Adamant spear" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 yew log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "adamant spears" + "" + " (after Tai Bwo Wannai Trio)."); + case 10: + return newstruct cs2func_script_1022_struct(75, 11375, "Members: Adamant hasta" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 yew log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "adamant hastae" + "" + " (after Tai Bwo Wannai Trio)."); + case 11: + return newstruct cs2func_script_1022_struct(75, 43, "Members: Adamant arrowhead" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "adamant arrowheads" + "" + "."); + case 12: + return newstruct cs2func_script_1022_struct(75, 1271, "Members: Adamant pickaxe" + "
" + " (after Perils of Ice Mountain)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "adamant pickaxes" + "" + " (after Perils of Ice Mountain)."); + case 13: + return newstruct cs2func_script_1022_struct(76, 9429, "Members: Adamant crossbow limbs" + "
" + " 1 bar", "Members can now smith " + "" + "adamant crossbow limbs" + "" + "."); + case 14: + return newstruct cs2func_script_1022_struct(76, 1301, "Adamant longsword" + "
" + " 2 bars", "You can now smith " + "" + "adamant longswords" + "" + "."); + case 15: + return newstruct cs2func_script_1022_struct(77, 1161, "Adamant full helm" + "
" + " 2 bars", "You can now smith " + "" + "adamant full helms" + "" + "."); + case 16: + return newstruct cs2func_script_1022_struct(77, 867, "Member: Adamant throwing knives" + "
" + " 1 bar makes 5", "Members can now smith " + "" + "adamant throwing knives" + "" + "."); + case 17: + return newstruct cs2func_script_1022_struct(78, 1183, "Adamant square shield" + "
" + " 2 bars", "You can now smith " + "" + "adamant square shields" + "" + "."); + case 18: + return newstruct cs2func_script_1022_struct(79, 1345, "Adamant warhammer" + "
" + " 3 bars", "You can now smith " + "" + "adamant warhammers" + "" + "."); + case 19: + return newstruct cs2func_script_1022_struct(80, 1371, "Adamant battleaxe" + "
" + " 3 bars", "You can now smith " + "" + "adamant battleaxes" + "" + "."); + case 20: + return newstruct cs2func_script_1022_struct(81, 1111, "Adamant chainbody" + "
" + " 3 bars", "You can now smith " + "" + "adamant chainbodies" + "" + "."); + case 21: + return newstruct cs2func_script_1022_struct(82, 1199, "Adamant kiteshield" + "
" + " 3 bars", "You can now smith " + "" + "adamant kiteshields" + "" + "."); + case 22: + return newstruct cs2func_script_1022_struct(83, 3100, "Members: Adamant claws" + "
" + " (after Death Plateau)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "adamant claws" + "" + " (after Death Plateau)."); + case 23: + return newstruct cs2func_script_1022_struct(84, 1317, "Adamant two-handed sword" + "
" + " 3 bars", "You can now smith " + "" + "adamant two-handed swords" + "" + "."); + case 24: + return newstruct cs2func_script_1022_struct(86, 1073, "Adamant platelegs" + "
" + " 3 bars", "You can now smith " + "" + "adamant platelegs" + "" + "."); + case 25: + return newstruct cs2func_script_1022_struct(86, 1091, "Adamant plateskirt" + "
" + " 3 bars", "You can now smith " + "" + "adamant plateskirts" + "" + "."); + case 26: + return newstruct cs2func_script_1022_struct(88, 1123, "Adamant platebody" + "
" + " 5 bars", "You can now smith " + "" + "adamant platebodies" + "" + "."); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(85, 1213, "Rune dagger" + "
" + " 1 bar", "You can now smith " + "" + "rune daggers" + "" + "."); + case 1: + return newstruct cs2func_script_1022_struct(86, 1359, "Rune hatchet" + "
" + " 1 bar", "You can now smith " + "" + "rune hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_1022_struct(87, 1432, "Rune mace" + "
" + " 1 bar", "You can now smith " + "" + "rune maces" + "" + "."); + case 3: + return newstruct cs2func_script_1022_struct(88, 1147, "Rune medium helm" + "
" + " 1 bar", "You can now smith " + "" + "rune medium helms" + "" + "."); + case 4: + return newstruct cs2func_script_1022_struct(88, 9381, "Members: Rune crossbow bolt" + "
" + " 1 bar makes 10", "Members can now smith " + "" + "rune crossbow bolts" + "" + "."); + case 5: + return newstruct cs2func_script_1022_struct(89, 1289, "Rune sword" + "
" + " 1 bar", "You can now smith " + "" + "rune swords" + "" + "."); + case 6: + return newstruct cs2func_script_1022_struct(89, 824, "Members: Rune dart tip " + "
" + " (after Tourist Trap)" + "
" + " 1 bar makes 10", "Members now have the Smithing level required to smith " + "" + "rune dart tips" + "" + " (after Tourist Trap)."); + case 7: + return newstruct cs2func_script_1022_struct(89, 4824, "Members: Rune nails" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "rune nails" + "" + "."); + case 8: + return newstruct cs2func_script_1022_struct(90, 1333, "Rune scimitar" + "
" + " 2 bars", "You can now smith " + "" + "rune scimitars" + "" + "."); + case 9: + return newstruct cs2func_script_1022_struct(90, 1247, "Members: Rune spear" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 magic log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "rune spears" + "" + " (after Tai Bwo Wannai Trio)."); + case 10: + return newstruct cs2func_script_1022_struct(90, 11377, "Members: Rune hasta" + "
" + " (after Tai Bwo Wannai Trio and learning barbarian smithing)" + "
" + " 1 bar, 1 magic log", "Members who are versed in the art of barbarian smithing now have the Smithing level required to smith " + "" + "rune hastae" + "" + " (after Tai Bwo Wannai Trio)."); + case 11: + return newstruct cs2func_script_1022_struct(90, 44, "Members: Rune arrowhead" + "
" + " 1 bar makes 15", "Members can now smith " + "" + "rune arrowheads" + "" + "."); + case 12: + return newstruct cs2func_script_1022_struct(90, 1275, "Members: Rune pickaxe" + "
" + " (after Perils of Ice Mountain)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "rune pickaxes" + "" + " (after Perils of Ice Mountain)."); + case 13: + return newstruct cs2func_script_1022_struct(91, 9431, "Members: Rune crossbow limbs" + "
" + " 1 bar", "Members can now smith " + "" + "rune crossbow limbs" + "" + "."); + case 14: + return newstruct cs2func_script_1022_struct(91, 1303, "Rune longsword" + "
" + " 2 bars", "You can now smith " + "" + "rune longswords" + "" + "."); + case 15: + return newstruct cs2func_script_1022_struct(92, 1163, "Rune full helm" + "
" + " 2 bars", "You can now smith " + "" + "rune full helms" + "" + "."); + case 16: + return newstruct cs2func_script_1022_struct(92, 868, "Members: Rune throwing knife" + "
" + " 1 bar makes 5", "Members can now smith " + "" + "rune throwing knives" + "" + "."); + case 17: + return newstruct cs2func_script_1022_struct(93, 1185, "Rune square shield" + "
" + " 2 bars", "You can now smith " + "" + "rune square shields" + "" + "."); + case 18: + return newstruct cs2func_script_1022_struct(94, 1347, "Rune warhammer" + "
" + " 3 bars", "You can now smith " + "" + "rune warhammers" + "" + "."); + case 19: + return newstruct cs2func_script_1022_struct(95, 1373, "Rune battleaxe" + "
" + " 3 bars", "You can now smith " + "" + "rune battleaxes" + "" + "."); + case 20: + return newstruct cs2func_script_1022_struct(96, 1113, "Rune chainbody" + "
" + " 3 bars", "You can now smith " + "" + "rune chainbodies" + "" + "."); + case 21: + return newstruct cs2func_script_1022_struct(97, 1201, "Rune kiteshield" + "
" + " 3 bars", "You can now smith " + "" + "rune kiteshields" + "" + "."); + case 22: + return newstruct cs2func_script_1022_struct(98, 3101, "Members: Rune claws" + "
" + " (after Death Plateau)" + "
" + " 2 bars", "Members now have the Smithing level required to smith " + "" + "rune claws" + "" + " (after Death Plateau)."); + case 23: + return newstruct cs2func_script_1022_struct(99, 1319, "Rune two-handed sword" + "
" + " 3 bars", "You can now smith " + "" + "rune two-handed swords" + "" + "."); + case 24: + return newstruct cs2func_script_1022_struct(99, 1079, "Rune platelegs" + "
" + " 3 bars", "You can now smith " + "" + "rune platelegs" + "" + "."); + case 25: + return newstruct cs2func_script_1022_struct(99, 1093, "Rune plateskirt" + "
" + " 3 bars", "You can now smith " + "" + "rune plateskirts" + "" + "."); + case 26: + return newstruct cs2func_script_1022_struct(99, 1127, "Rune platebody" + "
" + " 5 bars", "You can now smith " + "" + "rune platebodies" + "" + "."); + } + break; + case 8: + if (((boolean)arg1)) { + return newstruct cs2func_script_1022_struct(50, 721, "Members: Gold bowl" + "
" + " (after starting Legends' Quest)", "Members now have the Smithing level required to smith " + "" + "gold bowls" + "" + " (after starting Legends' Quest)."); + } + if (((boolean)arg1)) { + return newstruct cs2func_script_1022_struct(50, 4567, "Members: Gold helmet" + "
" + " (after starting Between a Rock...)", "Members now have the Smithing level required to smith " + "" + "gold helmets" + "" + " (after starting Between a Rock...)."); + } + break; + case 9: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(20, 2890, "Members: Elemental shield" + "
" + " (after Elemental Workshop I)", "Members now have the Smithing level required to smith " + "" + "elemental shields" + "" + " (after Elemental Workshop I)."); + case 1: + return newstruct cs2func_script_1022_struct(30, 9729, "Members: Elemental helmet" + "
" + " (after Elemental Workshop II)", "Members now have the Smithing level required to smith " + "" + "elemental helms" + "" + " (after Elemental Workshop II)."); + case 2: + return newstruct cs2func_script_1022_struct(30, 9731, "Members: Mind shield" + "
" + " (after Elemental Workshop II)", "Members now have the Smithing level required to smith " + "" + "mind shields" + "" + " (after Elemental Workshop II)."); + case 3: + return newstruct cs2func_script_1022_struct(30, 9733, "Members: Mind helmet" + "
" + " (after Elemental Workshop II)", "Members now have the Smithing level required to smith " + "" + "mind helmets" + "" + " (after Elemental Workshop II)."); + case 4: + return newstruct cs2func_script_1022_struct(33, 18691, "Members: Body shield" + "
" + " (after Elemental Workshop III)", "Members now have the Smithing level required to smith " + "" + "body shields" + "" + " (after Elemental Workshop III)."); + case 5: + return newstruct cs2func_script_1022_struct(33, 18693, "Members: Body helmet" + "
" + " (after Elemental Workshop III)", "Members now have the Smithing level required to smith " + "" + "body helmets" + "" + " (after Elemental Workshop III)."); + case 6: + return newstruct cs2func_script_1022_struct(33, 18699, "Members: Elemental body" + "
" + " (after Elemental Workshop III)", "Members now have the Smithing level required to smith " + "" + "elemental bodies" + "" + " (after Elemental Workshop III)."); + case 7: + return newstruct cs2func_script_1022_struct(33, 18697, "Members: Mind body" + "
" + " (after Elemental Workshop III)", "Members now have the Smithing level required to smith " + "" + "mind bodies" + "" + " (after Elemental Workshop III)."); + case 8: + return newstruct cs2func_script_1022_struct(33, 18695, "Members: Body body" + "
" + " (after Elemental Workshop III)", "Members now have the Smithing level required to smith " + "" + "body bodies" + "" + " (after Elemental Workshop III)."); + case 9: + return newstruct cs2func_script_1022_struct(38, 20458, "Members: Elemental gloves" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "elemental gloves" + "" + " (after Elemental Workshop IV)."); + case 10: + return newstruct cs2func_script_1022_struct(38, 20460, "Members: Mind gloves" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "mind gloves" + "" + " (after Elemental Workshop IV)."); + case 11: + return newstruct cs2func_script_1022_struct(38, 20462, "Members: Body gloves" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "body gloves" + "" + " (after Elemental Workshop IV)."); + case 12: + return newstruct cs2func_script_1022_struct(38, 20436, "Members: Cosmic shield" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "cosmic shields" + "" + " (after Elemental Workshop IV)."); + case 13: + return newstruct cs2func_script_1022_struct(38, 20440, "Members: Cosmic helmet" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "cosmic helmets" + "" + " (after Elemental Workshop IV)."); + case 14: + return newstruct cs2func_script_1022_struct(38, 20444, "Members: Cosmic body" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "cosmic bodies" + "" + " (after Elemental Workshop IV)."); + case 15: + return newstruct cs2func_script_1022_struct(38, 20464, "Members: Cosmic gloves" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "cosmic gloves" + "" + " (after Elemental Workshop IV)."); + case 16: + return newstruct cs2func_script_1022_struct(42, 20448, "Members: Elemental boots" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "elemental boots" + "" + " (after Elemental Workshop IV)."); + case 17: + return newstruct cs2func_script_1022_struct(42, 20450, "Members: Mind boots" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "mind boots" + "" + " (after Elemental Workshop IV)."); + case 18: + return newstruct cs2func_script_1022_struct(42, 20452, "Members: Body boots" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "body boots" + "" + " (after Elemental Workshop IV)."); + case 19: + return newstruct cs2func_script_1022_struct(42, 20454, "Members: Cosmic boots" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "cosmic boots" + "" + " (after Elemental Workshop IV)."); + case 20: + return newstruct cs2func_script_1022_struct(42, 20438, "Members: Chaos shield" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "chaos shields" + "" + " (after Elemental Workshop IV)."); + case 21: + return newstruct cs2func_script_1022_struct(42, 20442, "Members: Chaos helmet" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "chaos helmets" + "" + " (after Elemental Workshop IV)."); + case 22: + return newstruct cs2func_script_1022_struct(42, 20446, "Members: Chaos body" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "chaos bodies" + "" + " (after Elemental Workshop IV)."); + case 23: + return newstruct cs2func_script_1022_struct(42, 20466, "Members: Chaos gloves" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "chaos gloves" + "" + " (after Elemental Workshop IV)."); + case 24: + return newstruct cs2func_script_1022_struct(42, 20456, "Members: Chaos boots" + "
" + " (after Elemental Workshop IV)", "Members now have the Smithing level required to smith " + "" + "chaos boots" + "" + " (after Elemental Workshop IV)."); + } + break; + case 10: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(80, 21823, "Members: Dragonbane arrowtips (after Ritual of the Mahjarrat)", "Members now have the Smithing level required to smith " + "" + "dragonbane arrowtips" + "" + " (after Ritual of the Mahjarrat)."); + case 1: + return newstruct cs2func_script_1022_struct(80, 21828, "Members: Wallasalkibane arrowtips (after Ritual of the Mahjarrat)", "Members now have the Smithing level required to smith " + "" + "wallasalkibane arrowtips" + "" + " (after Ritual of the Mahjarrat)."); + case 2: + return newstruct cs2func_script_1022_struct(80, 21833, "Members: Basiliskbane arrowtips (after Ritual of the Mahjarrat)", "Members now have the Smithing level required to smith " + "" + "basiliskbane arrowtips" + "" + " (after Ritual of the Mahjarrat)."); + case 3: + return newstruct cs2func_script_1022_struct(80, 21838, "Members: Abyssalbane arrowtips (after Ritual of the Mahjarrat)", "Members now have the Smithing level required to smith " + "" + "abyssalbane arrowtips" + "" + " (after Ritual of the Mahjarrat)."); + case 4: + return newstruct cs2func_script_1022_struct(82, 21843, "Members: Dragonbane bolts (unf) (after Ritual of the Mahjarrat)", "Members now have the Smithing level required to smith " + "" + "dragonbane bolts" + "" + " (after Ritual of the Mahjarrat)."); + case 5: + return newstruct cs2func_script_1022_struct(82, 21853, "Members: Wallasalkibane bolts (unf) (after Ritual of the Mahjarrat)", "Members now have the Smithing level required to smith " + "" + "wallasalkibane bolts" + "" + " (after Ritual of the Mahjarrat)."); + case 6: + return newstruct cs2func_script_1022_struct(82, 21848, "Members: Basiliskbane bolts (unf) (after Ritual of the Mahjarrat)", "Members now have the Smithing level required to smith " + "" + "basiliskbane bolts" + "" + " (after Ritual of the Mahjarrat)."); + case 7: + return newstruct cs2func_script_1022_struct(82, 21858, "Members: Abyssalbane bolts (unf) (after Ritual of the Mahjarrat)", "Members now have the Smithing level required to smith " + "" + "abyssalbane bolts" + "" + " (after Ritual of the Mahjarrat)."); + } + break; + case 11: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(1, 20506, "Bronze rails", "You can now smith " + "" + "bronze rails" + "" + "."); + case 1: + return newstruct cs2func_script_1022_struct(2, 20507, "Bronze base plate", "You can now smith " + "" + "bronze base plates" + "" + "."); + case 2: + return newstruct cs2func_script_1022_struct(3, 20511, "Bronze track (40% complete)", "You can now combine bronze rails with bronze base plates to make " + "" + "bronze track (40% complete)" + "" + "."); + case 3: + return newstruct cs2func_script_1022_struct(5, 20508, "Bronze spikes", "You can now smith " + "" + "bronze spikes" + "" + "."); + case 4: + return newstruct cs2func_script_1022_struct(6, 20512, "Bronze track (60% complete)", "You can now combine bronze track (40% complete) with bronze spikes to make " + "" + "bronze track (60% complete)" + "" + "."); + case 5: + return newstruct cs2func_script_1022_struct(8, 20509, "Bronze joint", "You can now smith " + "" + "bronze joints" + "" + "."); + case 6: + return newstruct cs2func_script_1022_struct(9, 20513, "Bronze track (80% complete)", "You can now combine bronze track (60% complete) with a bronze joint to make " + "" + "bronze track (80% complete)" + "" + "."); + case 7: + return newstruct cs2func_script_1022_struct(11, 20510, "Bronze ties", "You can now smith " + "" + "bronze ties" + "" + "."); + case 8: + return newstruct cs2func_script_1022_struct(12, 20514, "Bronze track (100% complete)", "You can now combine bronze track (80% complete) with bronze ties to make " + "" + "bronze track (100% complete)" + "" + "."); + case 9: + return newstruct cs2func_script_1022_struct(15, 20515, "Iron rails", "You can now smith " + "" + "iron rails" + "" + "."); + case 10: + return newstruct cs2func_script_1022_struct(19, 20516, "Iron base plate", "You can now smith " + "" + "iron base plates" + "" + "."); + case 11: + return newstruct cs2func_script_1022_struct(20, 20525, "Iron track (40% complete)", "You can now combine iron rails with iron base plates to make " + "" + "iron track (40% complete)" + "" + "."); + case 12: + return newstruct cs2func_script_1022_struct(24, 20517, "Iron spikes", "You can now smith " + "" + "iron spikes" + "" + "."); + case 13: + return newstruct cs2func_script_1022_struct(25, 20526, "Iron track (60% complete)", "You can now combine iron track (40% complete) with iron spikes to make " + "" + "iron track (60% complete)" + "" + "."); + case 14: + return newstruct cs2func_script_1022_struct(29, 20518, "Iron joint", "You can now smith " + "" + "iron joints" + "" + "."); + case 15: + return newstruct cs2func_script_1022_struct(30, 20572, "Iron burial armour", "You can now smith iron burial armour for miners, warriors and smiths."); + case 16: + return newstruct cs2func_script_1022_struct(30, 20527, "Iron track (80% complete)", "You can now combine iron track (60% complete) with an iron joint to make " + "" + "iron track (80% complete)" + "" + "."); + case 17: + return newstruct cs2func_script_1022_struct(34, 20519, "Iron ties", "You can now smith " + "" + "iron ties" + "" + "."); + case 18: + return newstruct cs2func_script_1022_struct(35, 20528, "Iron track (100% complete)", "You can now combine iron track (80% complete) with iron ties to make " + "" + "iron track (100% complete)" + "" + "."); + case 19: + return newstruct cs2func_script_1022_struct(39, 20520, "Members: Steel rails", "Members can now smith " + "" + "steel rails" + "" + "."); + case 20: + return newstruct cs2func_script_1022_struct(44, 20521, "Members: Steel base plate", "Members can now smith " + "" + "steel base plates" + "" + "."); + case 21: + return newstruct cs2func_script_1022_struct(45, 20573, "Steel burial armour", "You can now smith steel burial armour for miners, warriors and smiths."); + case 22: + return newstruct cs2func_script_1022_struct(45, 20529, "Members: Steel track (40% complete)", "Members can now combine steel rails with steel base plates to make " + "" + "steel track (40% complete)" + "" + "."); + case 23: + return newstruct cs2func_script_1022_struct(49, 20522, "Members: Steel spikes", "Members can now smith " + "" + "steel spikes" + "" + "."); + case 24: + return newstruct cs2func_script_1022_struct(50, 2347, "Members: Fix pipes", "Members can now fix burst pipes in the Artisans Workshop."); + case 25: + return newstruct cs2func_script_1022_struct(50, 20530, "Members: Steel track (60% complete)", "Members can now combine steel track (40% complete) with steel spikes to make " + "" + "steel track (60% complete)" + "" + "."); + case 26: + return newstruct cs2func_script_1022_struct(54, 20523, "Members: Steel joint", "Members can now smith " + "" + "steel joints" + "" + "."); + case 27: + return newstruct cs2func_script_1022_struct(55, 20531, "Members: Steel track (80% complete)", "Members can now combine steel track (60% complete) with a steel joint to make " + "" + "steel track (80% complete)" + "" + "."); + case 28: + return newstruct cs2func_script_1022_struct(59, 20524, "Members: Steel ties", "Members can now smith " + "" + "steel ties" + "" + "."); + case 29: + return newstruct cs2func_script_1022_struct(60, 20574, "Members: Mithril burial armour", "Members can now smith mithril burial armour for miners, warriors and smiths."); + case 30: + return newstruct cs2func_script_1022_struct(60, 20532, "Members: Steel track (100% complete)", "Members can now combine steel track (80% complete) with steel ties to make " + "" + "steel track (100% complete)" + "" + "."); + case 31: + return newstruct cs2func_script_1022_struct(62, 20480, "Members: Cannon repair", "Members can now repair cannons in the cannon repair workshop."); + case 32: + return newstruct cs2func_script_1022_struct(70, 20560, "Members: Iron ceremonial swords", "Members can now smith iron ceremonial swords."); + case 33: + return newstruct cs2func_script_1022_struct(70, 20575, "Members: Adamant burial armour", "Members can now smith adamant burial armour for miners, warriors and smiths."); + case 34: + return newstruct cs2func_script_1022_struct(75, 20561, "Members: Steel ceremonial swords", "Members can now smith steel ceremonial swords."); + case 35: + return newstruct cs2func_script_1022_struct(78, 2347, "Members: Greater precision", "Members will now smith ceremonial swords more precisely, hitting fewer 0s and generally being more precise."); + case 36: + return newstruct cs2func_script_1022_struct(80, 20562, "Members: Mithril ceremonial swords", "Members can now smith mithril ceremonial swords."); + case 37: + return newstruct cs2func_script_1022_struct(83, 2347, "Members: Greater precision", "Members will now smith ceremonial swords more precisely, hitting fewer 0s and generally being more precise."); + case 38: + return newstruct cs2func_script_1022_struct(85, 20563, "Members: Adamant ceremonial swords", "Members can now smith adamant ceremonial swords."); + case 39: + return newstruct cs2func_script_1022_struct(88, 2347, "Members: Greater precision", "Members will now smith ceremonial swords more precisely, hitting fewer 0s and generally being more precise."); + case 40: + return newstruct cs2func_script_1022_struct(90, 20576, "Members: Rune burial armour", "Members can now smith rune burial armour for miners, warriors and smiths."); + case 41: + return newstruct cs2func_script_1022_struct(90, 20564, "Members: Rune ceremonial swords", "Members can now smith rune ceremonial swords"); + case 42: + return newstruct cs2func_script_1022_struct(93, 2347, "Members: Greater precision", "Members will now smith ceremonial swords more precisely, hitting fewer 0s and generally being more precise."); + case 43: + return newstruct cs2func_script_1022_struct(97, 2347, "Members: Greater precision", "Members will now smith ceremonial swords more precisely, hitting fewer 0s and generally being more precise."); + case 44: + return newstruct cs2func_script_1022_struct(99, 2347, "Members: Greater precision", "Members will now smith ceremonial swords more precisely, hitting fewer 0s and generally being more precise."); + } + break; + case 12: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(55, 19670, "Scroll of efficiency" + "
" + " (with 55 Dungeoneering)", "You can now use " + "" + "scrolls of efficiency" + "" + ". (You also need level 55 Dungeoneering.)"); + case 1: + return newstruct cs2func_script_1022_struct(60, 1187, "Members: Dragon square shield", "Members can now make " + "" + "dragon square shields" + "" + "."); + case 2: + return newstruct cs2func_script_1022_struct(80, 11690, "Members: Godsword blade", "Members can now make " + "" + "godsword blades" + "" + "."); + case 3: + return newstruct cs2func_script_1022_struct(85, 13746, "Members: Arcane spirit shields" + "
" + " (after Summer's End and with 90 Prayer)", "Members can now create " + "" + "arcane spirit shields" + "" + " (after Summer's End, with level 90 Prayer)."); + case 4: + return newstruct cs2func_script_1022_struct(85, 13748, "Members: Divine spirit shields" + "
" + " (after Summer's End and with 90 Prayer)", "Members can now create " + "" + "divine spirit shields" + "" + " (after Summer's End, with level 90 Prayer)."); + case 5: + return newstruct cs2func_script_1022_struct(85, 13750, "Members: Elysian spirit shields" + "
" + " (after Summer's End and with 90 Prayer)", "Members can now create " + "" + "elysian spirit shields" + "" + " (after Summer's End, with level 90 Prayer)."); + case 6: + return newstruct cs2func_script_1022_struct(85, 13752, "Members: Spectral spirit shields" + "
" + " (after Summer's End and with 90 Prayer)", "Members can now create " + "" + "spectral spirit shields" + "" + " (after Summer's End, with level 90 Prayer)."); + case 7: + return newstruct cs2func_script_1022_struct(90, 11283, "Members: Dragonfire shield", "Members can now make " + "" + "dragonfire shields" + "" + " from anti-dragonbreath shields and draconic visages."); + case 8: + return newstruct cs2func_script_1022_struct(91, 18778, "Members: Starved ancient effigies", "Members can now investigate " + "" + "starved ancient effigies" + "" + " using their knowledge of Smithing."); + case 9: + return newstruct cs2func_script_1022_struct(92, 14479, "Members: Repair dragon platebody", "Members can now repair " + "" + "dragon platebodies" + "" + " (after While Guthix Sleeps)."); + case 10: + return newstruct cs2func_script_1022_struct(93, 18779, "Members: Nourished ancient effigies", "Members can now investigate " + "" + "nourished ancient effigies" + "" + " using their knowledge of Smithing."); + case 11: + return newstruct cs2func_script_1022_struct(95, 18780, "Members: Sated ancient effigies", "Members can now investigate " + "" + "sated ancient effigies" + "" + " using their knowledge of Smithing."); + case 12: + return newstruct cs2func_script_1022_struct(97, 18781, "Members: Gorged ancient effigies", "Members can now investigate " + "" + "gorged ancient effigies" + "" + " using their knowledge of Smithing."); + } + break; + case 13: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(1, 14297, "Members: Stealing Creation - class 1 dagger", "Members can now make " + "" + "class 1 daggers" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_1022_struct(1, 14132, "Members: Stealing Creation - class 1 hatchet", "Members can now make " + "" + "class 1 hatchets" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_1022_struct(1, 14367, "Members: Stealing Creation - class 1 helmet", "Members can now make " + "" + "class 1 helmets" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_1022_struct(1, 14287, "Members: Stealing Creation - class 1 scimitar", "Members can now make " + "" + "class 1 scimitars" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_1022_struct(1, 14122, "Members: Stealing Creation - class 1 pickaxe", "Members can now make " + "" + "class 1 pickaxes" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_1022_struct(1, 14307, "Members: Stealing Creation - class 1 warhammer", "Members can now make " + "" + "class 1 warhammers" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_1022_struct(1, 14357, "Members: Stealing Creation - class 1 platelegs", "Members can now make " + "" + "class 1 platelegs" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_1022_struct(1, 14347, "Members: Stealing Creation - class 1 platebody", "Members can now make " + "" + "class 1 platebodies" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_1022_struct(20, 14299, "Members: Stealing Creation - class 2 dagger", "Members can now make " + "" + "class 2 daggers" + "" + " in Stealing Creation."); + case 9: + return newstruct cs2func_script_1022_struct(20, 14134, "Members: Stealing Creation - class 2 hatchet", "Members can now make " + "" + "class 2 hatchets" + "" + " in Stealing Creation."); + case 10: + return newstruct cs2func_script_1022_struct(20, 14369, "Members: Stealing Creation - class 2 helmet", "Members can now make " + "" + "class 2 helmets" + "" + " in Stealing Creation."); + case 11: + return newstruct cs2func_script_1022_struct(20, 14289, "Members: Stealing Creation - class 2 scimitar", "Members can now make " + "" + "class 2 scimitars" + "" + " in Stealing Creation."); + case 12: + return newstruct cs2func_script_1022_struct(20, 14124, "Members: Stealing Creation - class 2 pickaxe", "Members can now make " + "" + "class 2 pickaxes" + "" + " in Stealing Creation."); + case 13: + return newstruct cs2func_script_1022_struct(20, 14309, "Members: Stealing Creation - class 2 warhammer", "Members can now make " + "" + "class 2 warhammers" + "" + " in Stealing Creation."); + case 14: + return newstruct cs2func_script_1022_struct(20, 14359, "Members: Stealing Creation - class 2 platelegs", "Members can now make " + "" + "class 2 platelegs" + "" + " in Stealing Creation."); + case 15: + return newstruct cs2func_script_1022_struct(20, 14349, "Members: Stealing Creation - class 2 platebody", "Members can now make " + "" + "class 2 platebodies" + "" + " in Stealing Creation."); + case 16: + return newstruct cs2func_script_1022_struct(40, 14301, "Members: Stealing Creation - class 3 dagger", "Members can now make " + "" + "class 3 daggers" + "" + " in Stealing Creation."); + case 17: + return newstruct cs2func_script_1022_struct(40, 14136, "Members: Stealing Creation - class 3 hatchet", "Members can now make " + "" + "class 3 hatchets" + "" + " in Stealing Creation."); + case 18: + return newstruct cs2func_script_1022_struct(40, 14371, "Members: Stealing Creation - class 3 helmet", "Members can now make " + "" + "class 3 helmets" + "" + " in Stealing Creation."); + case 19: + return newstruct cs2func_script_1022_struct(40, 14291, "Members: Stealing Creation - class 3 scimitar", "Members can now make " + "" + "class 3 scimitars" + "" + " in Stealing Creation."); + case 20: + return newstruct cs2func_script_1022_struct(40, 14126, "Members: Stealing Creation - class 3 pickaxe", "Members can now make " + "" + "class 3 pickaxes" + "" + " in Stealing Creation."); + case 21: + return newstruct cs2func_script_1022_struct(40, 14311, "Members: Stealing Creation - class 3 warhammer", "Members can now make " + "" + "class 3 warhammers" + "" + " in Stealing Creation."); + case 22: + return newstruct cs2func_script_1022_struct(40, 14361, "Members: Stealing Creation - class 3 platelegs", "Members can now make " + "" + "class 3 platelegs" + "" + " in Stealing Creation."); + case 23: + return newstruct cs2func_script_1022_struct(40, 14351, "Members: Stealing Creation - class 3 platebody", "Members can now make " + "" + "class 3 platebodies" + "" + " in Stealing Creation."); + case 24: + return newstruct cs2func_script_1022_struct(60, 13256, "Members: Blast Furnace - Anvils", "Members can now use the " + "" + "anvils" + "" + " at the Blast Furnace."); + case 25: + return newstruct cs2func_script_1022_struct(60, 14303, "Members: Stealing Creation - class 4 dagger", "Members can now make " + "" + "class 4 daggers" + "" + " in Stealing Creation."); + case 26: + return newstruct cs2func_script_1022_struct(60, 14138, "Members: Stealing Creation - class 4 hatchet", "Members can now make " + "" + "class 4 hatchets" + "" + " in Stealing Creation."); + case 27: + return newstruct cs2func_script_1022_struct(60, 14373, "Members: Stealing Creation - class 4 helmet", "Members can now make " + "" + "class 4 helmets" + "" + " in Stealing Creation."); + case 28: + return newstruct cs2func_script_1022_struct(60, 14293, "Members: Stealing Creation - class 4 scimitar", "Members can now make " + "" + "class 4 scimitars" + "" + " in Stealing Creation."); + case 29: + return newstruct cs2func_script_1022_struct(60, 14128, "Members: Stealing Creation - class 4 pickaxe", "Members can now make " + "" + "class 4 pickaxes" + "" + " in Stealing Creation."); + case 30: + return newstruct cs2func_script_1022_struct(60, 14313, "Members: Stealing Creation - class 4 warhammer", "Members can now make " + "" + "class 4 warhammers" + "" + " in Stealing Creation."); + case 31: + return newstruct cs2func_script_1022_struct(60, 14363, "Members: Stealing Creation - class 4 platelegs", "Members can now make " + "" + "class 4 platelegs" + "" + " in Stealing Creation."); + case 32: + return newstruct cs2func_script_1022_struct(60, 14353, "Members: Stealing Creation - class 4 platebody", "Members can now make " + "" + "class 4 platebodies" + "" + " in Stealing Creation."); + case 33: + return newstruct cs2func_script_1022_struct(80, 14305, "Members: Stealing Creation - class 5 dagger", "Members can now make " + "" + "class 5 daggers" + "" + " in Stealing Creation."); + case 34: + return newstruct cs2func_script_1022_struct(80, 14140, "Members: Stealing Creation - class 5 hatchet", "Members can now make " + "" + "class 5 hatchets" + "" + " in Stealing Creation."); + case 35: + return newstruct cs2func_script_1022_struct(80, 14375, "Members: Stealing Creation - class 5 helmet", "Members can now make " + "" + "class 5 helmets" + "" + " in Stealing Creation."); + case 36: + return newstruct cs2func_script_1022_struct(80, 14295, "Members: Stealing Creation - class 5 scimitar", "Members can now make " + "" + "class 5 scimitars" + "" + " in Stealing Creation."); + case 37: + return newstruct cs2func_script_1022_struct(80, 14130, "Members: Stealing Creation - class 5 pickaxe", "Members can now make " + "" + "class 5 pickaxes" + "" + " in Stealing Creation."); + case 38: + return newstruct cs2func_script_1022_struct(80, 14315, "Members: Stealing Creation - class 5 warhammer", "Members can now make " + "" + "class 5 warhammers" + "" + " in Stealing Creation."); + case 39: + return newstruct cs2func_script_1022_struct(80, 14365, "Members: Stealing Creation - class 5 platelegs", "Members can now make " + "" + "class 5 platelegs" + "" + " in Stealing Creation."); + case 40: + return newstruct cs2func_script_1022_struct(80, 14355, "Members: Stealing Creation - class 5 platebody", "Members can now make " + "" + "class 5 platebodies" + "" + " in Stealing Creation."); + } + break; + case 14: + switch (arg1) { + case 0: + return newstruct cs2func_script_1022_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Smithing level increases, you will be able to attempt higher-level smithing tasks within Daemonheim. You will also be more likely to succeed when attempting smithing tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_1022_struct(1, 17650, "Novite (Tier 1)", "You can now smelt " + "" + "novite" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_1022_struct(1, 17885, "Novite arrowheads (Tier 1) (15)" + "
" + " 1 bar", "You can now smith " + "" + "novite arrowheads" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_1022_struct(1, 16757, "Novite dagger (Tier 1)" + "
" + " 1 bar", "You can now smith " + "" + "novite daggers" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_1022_struct(1, 16339, "Novite boots (Tier 1)" + "
" + " 1 bar", "You can now smith " + "" + "novite boots" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_1022_struct(1, 16273, "Novite gauntlets (Tier 1)" + "
" + " 1 bar", "You can now smith " + "" + "novite gauntlets" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_1022_struct(2, 16361, "Novite hatchet (Tier 1)" + "
" + " 1 bar", "You can now smith " + "" + "novite hatchets" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_1022_struct(2, 16295, "Novite pickaxe (Tier 1)" + "
" + " 1 bar", "You can now smith " + "" + "novite pickaxes" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_1022_struct(3, 17019, "Novite warhammer (Tier 1)" + "
" + " 2 bars", "You can now smith " + "" + "novite warhammers" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_1022_struct(3, 16935, "Novite rapier (Tier 1)" + "
" + " 2 bars", "You can now smith " + "" + "novite rapiers" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_1022_struct(4, 16383, "Novite longsword (Tier 1)" + "
" + " 2 bars", "You can now smith " + "" + "novite longswords" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_1022_struct(5, 16691, "Novite full helm (Tier 1)" + "
" + " 2 bars", "You can now smith " + "" + "novite full helms" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_1022_struct(5, 15753, "Novite battleaxe (Tier 1)" + "
" + " 2 bars", "You can now smith " + "" + "novite battleaxes" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_1022_struct(6, 17341, "Novite kiteshield (Tier 1)" + "
" + " 3 bars", "You can now smith " + "" + "novite kiteshields" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_1022_struct(6, 16713, "Novite chainbody (Tier 1)" + "
" + " 3 bars", "You can now smith " + "" + "novite chainbodies" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_1022_struct(7, 16669, "Novite platelegs (Tier 1)" + "
" + " 3 bars", "You can now smith " + "" + "novite platelegs" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_1022_struct(7, 16647, "Novite plateskirt (Tier 1)" + "
" + " 3 bars", "You can now smith " + "" + "novite plateskirts" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_1022_struct(7, 17063, "Novite spear (Tier 1)" + "
" + " 4 bars", "You can now smith " + "" + "novite spears" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_1022_struct(8, 16405, "Novite maul (Tier 1)" + "
" + " 4 bars", "You can now smith " + "" + "novite mauls" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_1022_struct(8, 16889, "Novite 2h sword (Tier 1)" + "
" + " 4 bars", "You can now smith " + "" + "novite 2h swords" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_1022_struct(9, 17239, "Novite platebody (Tier 1)" + "
" + " 5 bars", "You can now smith " + "" + "novite platebodies" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_1022_struct(10, 17652, "Bathus (Tier 2)", "You can now smelt " + "" + "bathus" + "" + " within Daemonheim."); + case 22: + return newstruct cs2func_script_1022_struct(10, 17890, "Bathus arrowheads (Tier 2) (15)" + "
" + " 1 bar", "You can now smith " + "" + "bathus arrowheads" + "" + " within Daemonheim."); + case 23: + return newstruct cs2func_script_1022_struct(10, 16765, "Bathus dagger (Tier 2)" + "
" + " 1 bar", "You can now smith " + "" + "bathus daggers" + "" + " within Daemonheim."); + case 24: + return newstruct cs2func_script_1022_struct(11, 16341, "Bathus boots (Tier 2)" + "
" + " 1 bar", "You can now smith " + "" + "bathus boots" + "" + " within Daemonheim."); + case 25: + return newstruct cs2func_script_1022_struct(11, 16275, "Bathus gauntlets (Tier 2)" + "
" + " 1 bar", "You can now smith " + "" + "bathus gauntlets" + "" + " within Daemonheim."); + case 26: + return newstruct cs2func_script_1022_struct(12, 16363, "Bathus hatchet (Tier 2)" + "
" + " 1 bar", "You can now smith " + "" + "bathus hatchets" + "" + " within Daemonheim."); + case 27: + return newstruct cs2func_script_1022_struct(12, 16297, "Bathus pickaxe (Tier 2)" + "
" + " 1 bar", "You can now smith " + "" + "bathus pickaxes" + "" + " within Daemonheim."); + case 28: + return newstruct cs2func_script_1022_struct(13, 17021, "Bathus warhammer (Tier 2)" + "
" + " 2 bars", "You can now smith " + "" + "bathus warhammers" + "" + " within Daemonheim."); + case 29: + return newstruct cs2func_script_1022_struct(13, 16937, "Bathus rapier (Tier 2)" + "
" + " 2 bars", "You can now smith " + "" + "bathus rapiers" + "" + " within Daemonheim."); + case 30: + return newstruct cs2func_script_1022_struct(14, 16385, "Bathus longsword (Tier 2)" + "
" + " 2 bars", "You can now smith " + "" + "bathus longswords" + "" + " within Daemonheim."); + case 31: + return newstruct cs2func_script_1022_struct(15, 16693, "Bathus full helm (Tier 2)" + "
" + " 2 bars", "You can now smith " + "" + "bathus full helms" + "" + " within Daemonheim."); + case 32: + return newstruct cs2func_script_1022_struct(15, 15755, "Bathus battleaxe (Tier 2)" + "
" + " 2 bars", "You can now smith " + "" + "bathus battleaxes" + "" + " within Daemonheim."); + case 33: + return newstruct cs2func_script_1022_struct(16, 17343, "Bathus kiteshield (Tier 2)" + "
" + " 3 bars", "You can now smith " + "" + "bathus kiteshields" + "" + " within Daemonheim."); + case 34: + return newstruct cs2func_script_1022_struct(16, 16715, "Bathus chainbody (Tier 2)" + "
" + " 3 bars", "You can now smith " + "" + "bathus chainbodies" + "" + " within Daemonheim."); + case 35: + return newstruct cs2func_script_1022_struct(17, 16671, "Bathus platelegs (Tier 2)" + "
" + " 3 bars", "You can now smith " + "" + "bathus platelegs" + "" + " within Daemonheim."); + case 36: + return newstruct cs2func_script_1022_struct(17, 16649, "Bathus plateskirt (Tier 2)" + "
" + " 3 bars", "You can now smith " + "" + "bathus plateskirts" + "" + " within Daemonheim."); + case 37: + return newstruct cs2func_script_1022_struct(17, 17071, "Bathus spear (Tier 2)" + "
" + " 4 bars", "You can now smith " + "" + "bathus spears" + "" + " within Daemonheim."); + case 38: + return newstruct cs2func_script_1022_struct(18, 16407, "Bathus maul (Tier 2)" + "
" + " 4 bars", "You can now smith " + "" + "bathus mauls" + "" + " within Daemonheim."); + case 39: + return newstruct cs2func_script_1022_struct(18, 16891, "Bathus 2h sword (Tier 2)" + "
" + " 4 bars", "You can now smith " + "" + "bathus 2h swords" + "" + " within Daemonheim."); + case 40: + return newstruct cs2func_script_1022_struct(19, 17241, "Bathus platebody (Tier 2)" + "
" + " 5 bars", "You can now smith " + "" + "bathus platebodies" + "" + " within Daemonheim."); + case 41: + return newstruct cs2func_script_1022_struct(20, 17654, "Marmaros (Tier 3)", "You can now smelt " + "" + "marmaros" + "" + " within Daemonheim."); + case 42: + return newstruct cs2func_script_1022_struct(20, 17895, "Marmaros arrowheads (Tier 3) (15)" + "
" + " 1 bar", "You can now smith " + "" + "marmaros arrowheads" + "" + " within Daemonheim."); + case 43: + return newstruct cs2func_script_1022_struct(20, 16773, "Marmaros dagger (Tier 3)" + "
" + " 1 bar", "You can now smith " + "" + "marmaros daggers" + "" + " within Daemonheim."); + case 44: + return newstruct cs2func_script_1022_struct(21, 16343, "Marmaros boots (Tier 3)" + "
" + " 1 bar", "You can now smith " + "" + "marmaros boots" + "" + " within Daemonheim."); + case 45: + return newstruct cs2func_script_1022_struct(21, 16277, "Marmaros gauntlets (Tier 3)" + "
" + " 1 bar", "You can now smith " + "" + "marmaros gauntlets" + "" + " within Daemonheim."); + case 46: + return newstruct cs2func_script_1022_struct(22, 16365, "Marmaros hatchet (Tier 3)" + "
" + " 1 bar", "You can now smith " + "" + "marmaros hatchets" + "" + " within Daemonheim."); + case 47: + return newstruct cs2func_script_1022_struct(22, 16299, "Marmaros pickaxe (Tier 3)" + "
" + " 1 bar", "You can now smith " + "" + "marmaros pickaxes" + "" + " within Daemonheim."); + case 48: + return newstruct cs2func_script_1022_struct(23, 17023, "Marmaros warhammer (Tier 3)" + "
" + " 2 bars", "You can now smith " + "" + "marmaros warhammers" + "" + " within Daemonheim."); + case 49: + return newstruct cs2func_script_1022_struct(23, 16939, "Marmaros rapier (Tier 3)" + "
" + " 2 bars", "You can now smith " + "" + "marmaros rapiers" + "" + " within Daemonheim."); + case 50: + return newstruct cs2func_script_1022_struct(24, 16387, "Marmaros longsword (Tier 3)" + "
" + " 2 bars", "You can now smith " + "" + "marmaros longswords" + "" + " within Daemonheim."); + case 51: + return newstruct cs2func_script_1022_struct(25, 16695, "Marmaros full helm (Tier 3)" + "
" + " 2 bars", "You can now smith " + "" + "marmaros full helms" + "" + " within Daemonheim."); + case 52: + return newstruct cs2func_script_1022_struct(25, 15757, "Marmaros battleaxe (Tier 3)" + "
" + " 2 bars", "You can now smith " + "" + "marmaros battleaxes" + "" + " within Daemonheim."); + case 53: + return newstruct cs2func_script_1022_struct(26, 17345, "Marmaros kiteshield (Tier 3)" + "
" + " 3 bars", "You can now smith " + "" + "marmaros kiteshields" + "" + " within Daemonheim."); + case 54: + return newstruct cs2func_script_1022_struct(26, 16717, "Marmaros chainbody (Tier 3)" + "
" + " 3 bars", "You can now smith " + "" + "marmaros chainbodies" + "" + " within Daemonheim."); + case 55: + return newstruct cs2func_script_1022_struct(27, 16673, "Marmaros platelegs (Tier 3)" + "
" + " 3 bars", "You can now smith " + "" + "marmaros platelegs" + "" + " within Daemonheim."); + case 56: + return newstruct cs2func_script_1022_struct(27, 16651, "Marmaros plateskirt (Tier 3)" + "
" + " 3 bars", "You can now smith " + "" + "marmaros plateskirts" + "" + " within Daemonheim."); + case 57: + return newstruct cs2func_script_1022_struct(27, 17079, "Marmaros spear (Tier 3)" + "
" + " 4 bars", "You can now smith " + "" + "marmaros spears" + "" + " within Daemonheim."); + case 58: + return newstruct cs2func_script_1022_struct(28, 16409, "Marmaros maul (Tier 3)" + "
" + " 4 bars", "You can now smith " + "" + "marmaros mauls" + "" + " within Daemonheim."); + case 59: + return newstruct cs2func_script_1022_struct(28, 16893, "Marmaros 2h sword (Tier 3)" + "
" + " 4 bars", "You can now smith " + "" + "marmaros 2h swords" + "" + " within Daemonheim."); + case 60: + return newstruct cs2func_script_1022_struct(29, 17243, "Marmaros platebody (Tier 3)" + "
" + " 5 bars", "You can now smith " + "" + "marmaros platebodies" + "" + " within Daemonheim."); + case 61: + return newstruct cs2func_script_1022_struct(30, 17656, "Kratonite (Tier 4)", "You can now smelt " + "" + "kratonite" + "" + " within Daemonheim."); + case 62: + return newstruct cs2func_script_1022_struct(30, 17900, "Kratonite arrowheads (Tier 4) (15)" + "
" + " 1 bar", "You can now smith " + "" + "kratonite arrowheads" + "" + " within Daemonheim."); + case 63: + return newstruct cs2func_script_1022_struct(30, 16781, "Kratonite dagger (Tier 4)" + "
" + " 1 bar", "You can now smith " + "" + "kratonite daggers" + "" + " within Daemonheim."); + case 64: + return newstruct cs2func_script_1022_struct(31, 16345, "Kratonite boots (Tier 4)" + "
" + " 1 bar", "You can now smith " + "" + "kratonite boots" + "" + " within Daemonheim."); + case 65: + return newstruct cs2func_script_1022_struct(31, 16279, "Kratonite gauntlets (Tier 4)" + "
" + " 1 bar", "You can now smith " + "" + "kratonite gauntlets" + "" + " within Daemonheim."); + case 66: + return newstruct cs2func_script_1022_struct(32, 16367, "Kratonite hatchet (Tier 4)" + "
" + " 1 bar", "You can now smith " + "" + "kratonite hatchets" + "" + " within Daemonheim."); + case 67: + return newstruct cs2func_script_1022_struct(32, 16301, "Kratonite pickaxe (Tier 4)" + "
" + " 1 bar", "You can now smith " + "" + "kratonite pickaxes" + "" + " within Daemonheim."); + case 68: + return newstruct cs2func_script_1022_struct(33, 17025, "Kratonite warhammer (Tier 4)" + "
" + " 2 bars", "You can now smith " + "" + "kratonite warhammers" + "" + " within Daemonheim."); + case 69: + return newstruct cs2func_script_1022_struct(33, 16941, "Kratonite rapier (Tier 4)" + "
" + " 2 bars", "You can now smith " + "" + "kratonite rapiers" + "" + " within Daemonheim."); + case 70: + return newstruct cs2func_script_1022_struct(34, 16389, "Kratonite longsword (Tier 4)" + "
" + " 2 bars", "You can now smith " + "" + "kratonite longswords" + "" + " within Daemonheim."); + case 71: + return newstruct cs2func_script_1022_struct(35, 16697, "Kratonite full helm (Tier 4)" + "
" + " 2 bars", "You can now smith " + "" + "kratonite full helms" + "" + " within Daemonheim."); + case 72: + return newstruct cs2func_script_1022_struct(35, 15759, "Kratonite battleaxe (Tier 4)" + "
" + " 2 bars", "You can now smith " + "" + "kratonite battleaxes" + "" + " within Daemonheim."); + case 73: + return newstruct cs2func_script_1022_struct(36, 17347, "Kratonite kiteshield (Tier 4)" + "
" + " 3 bars", "You can now smith " + "" + "kratonite kiteshields" + "" + " within Daemonheim."); + case 74: + return newstruct cs2func_script_1022_struct(36, 16719, "Kratonite chainbody (Tier 4)" + "
" + " 3 bars", "You can now smith " + "" + "kratonite chainbodies" + "" + " within Daemonheim."); + case 75: + return newstruct cs2func_script_1022_struct(37, 16675, "Kratonite platelegs (Tier 4)" + "
" + " 3 bars", "You can now smith " + "" + "kratonite platelegs" + "" + " within Daemonheim."); + case 76: + return newstruct cs2func_script_1022_struct(37, 16653, "Kratonite plateskirt (Tier 4)" + "
" + " 3 bars", "You can now smith " + "" + "kratonite plateskirts" + "" + " within Daemonheim."); + case 77: + return newstruct cs2func_script_1022_struct(37, 17087, "Kratonite spear (Tier 4)" + "
" + " 4 bars", "You can now smith " + "" + "kratonite spears" + "" + " within Daemonheim."); + case 78: + return newstruct cs2func_script_1022_struct(38, 16411, "Kratonite maul (Tier 4)" + "
" + " 4 bars", "You can now smith " + "" + "kratonite mauls" + "" + " within Daemonheim."); + case 79: + return newstruct cs2func_script_1022_struct(38, 16895, "Kratonite 2h sword (Tier 4)" + "
" + " 4 bars", "You can now smith " + "" + "kratonite 2h swords" + "" + " within Daemonheim."); + case 80: + return newstruct cs2func_script_1022_struct(39, 17245, "Kratonite platebody (Tier 4)" + "
" + " 5 bars", "You can now smith " + "" + "kratonite platebodies" + "" + " within Daemonheim."); + case 81: + return newstruct cs2func_script_1022_struct(40, 17658, "Fractite (Tier 5)", "You can now smelt " + "" + "fractite" + "" + " within Daemonheim."); + case 82: + return newstruct cs2func_script_1022_struct(40, 17905, "Fractite arrowheads (Tier 5) (15)" + "
" + " 1 bar", "You can now smith " + "" + "fractite arrowheads" + "" + " within Daemonheim."); + case 83: + return newstruct cs2func_script_1022_struct(40, 16789, "Fractite dagger (Tier 5)" + "
" + " 1 bar", "You can now smith " + "" + "fractite daggers" + "" + " within Daemonheim."); + case 84: + return newstruct cs2func_script_1022_struct(41, 16347, "Fractite boots (Tier 5)" + "
" + " 1 bar", "You can now smith " + "" + "fractite boots" + "" + " within Daemonheim."); + case 85: + return newstruct cs2func_script_1022_struct(41, 16281, "Fractite gauntlets (Tier 5)" + "
" + " 1 bar", "You can now smith " + "" + "fractite gauntlets" + "" + " within Daemonheim."); + case 86: + return newstruct cs2func_script_1022_struct(42, 16369, "Fractite hatchet (Tier 5)" + "
" + " 1 bar", "You can now smith " + "" + "fractite hatchets" + "" + " within Daemonheim."); + case 87: + return newstruct cs2func_script_1022_struct(42, 16303, "Fractite pickaxe (Tier 5)" + "
" + " 1 bar", "You can now smith " + "" + "fractite pickaxes" + "" + " within Daemonheim."); + case 88: + return newstruct cs2func_script_1022_struct(43, 17027, "Fractite warhammer (Tier 5)" + "
" + " 2 bars", "You can now smith " + "" + "fractite warhammers" + "" + " within Daemonheim."); + case 89: + return newstruct cs2func_script_1022_struct(43, 16943, "Fractite rapier (Tier 5)" + "
" + " 2 bars", "You can now smith " + "" + "fractite rapiers" + "" + " within Daemonheim."); + case 90: + return newstruct cs2func_script_1022_struct(44, 16391, "Fractite longsword (Tier 5)" + "
" + " 2 bars", "You can now smith " + "" + "fractite longswords" + "" + " within Daemonheim."); + case 91: + return newstruct cs2func_script_1022_struct(45, 16699, "Fractite full helm (Tier 5)" + "
" + " 2 bars", "You can now smith " + "" + "fractite full helms" + "" + " within Daemonheim."); + case 92: + return newstruct cs2func_script_1022_struct(45, 15761, "Fractite battleaxe (Tier 5)" + "
" + " 2 bars", "You can now smith " + "" + "fractite battleaxes" + "" + " within Daemonheim."); + case 93: + return newstruct cs2func_script_1022_struct(46, 17349, "Fractite kiteshield (Tier 5)" + "
" + " 3 bars", "You can now smith " + "" + "fractite kiteshields" + "" + " within Daemonheim."); + case 94: + return newstruct cs2func_script_1022_struct(46, 16721, "Fractite chainbody (Tier 5)" + "
" + " 3 bars", "You can now smith " + "" + "fractite chainbodies" + "" + " within Daemonheim."); + case 95: + return newstruct cs2func_script_1022_struct(47, 16677, "Fractite platelegs (Tier 5)" + "
" + " 3 bars", "You can now smith " + "" + "fractite platelegs" + "" + " within Daemonheim."); + case 96: + return newstruct cs2func_script_1022_struct(47, 16655, "Fractite plateskirt (Tier 5)" + "
" + " 3 bars", "You can now smith " + "" + "fractite plateskirts" + "" + " within Daemonheim."); + case 97: + return newstruct cs2func_script_1022_struct(47, 17095, "Fractite spear (Tier 5)" + "
" + " 4 bars", "You can now smith " + "" + "fractite spears" + "" + " within Daemonheim."); + case 98: + return newstruct cs2func_script_1022_struct(48, 16413, "Fractite maul (Tier 5)" + "
" + " 4 bars", "You can now smith " + "" + "fractite mauls" + "" + " within Daemonheim."); + case 99: + return newstruct cs2func_script_1022_struct(48, 16897, "Fractite 2h sword (Tier 5)" + "
" + " 4 bars", "You can now smith " + "" + "fractite 2h swords" + "" + " within Daemonheim."); + case 100: + return newstruct cs2func_script_1022_struct(49, 17247, "Fractite platebody (Tier 5)" + "
" + " 5 bars", "You can now smith " + "" + "fractite platebodies" + "" + " within Daemonheim."); + case 101: + return newstruct cs2func_script_1022_struct(50, 17660, "Members: Zephyrium (Tier 6)", "Members can now smelt " + "" + "zephyrium" + "" + " within Daemonheim."); + case 102: + return newstruct cs2func_script_1022_struct(50, 17910, "Members: Zephyrium arrowheads (Tier 6) (15)" + "
" + " 1 bar", "Members can now smith " + "" + "zephyrium arrowheads" + "" + " within Daemonheim."); + case 103: + return newstruct cs2func_script_1022_struct(50, 16797, "Members: Zephyrium dagger (Tier 6)" + "
" + " 1 bar", "Members can now smith " + "" + "zephyrium daggers" + "" + " within Daemonheim."); + case 104: + return newstruct cs2func_script_1022_struct(51, 16349, "Members: Zephyrium boots (Tier 6)" + "
" + " 1 bar", "Members can now smith " + "" + "zephyrium boots" + "" + " within Daemonheim."); + case 105: + return newstruct cs2func_script_1022_struct(51, 16283, "Members: Zephyrium gauntlets (Tier 6)" + "
" + " 1 bar", "Members can now smith " + "" + "zephyrium gauntlets" + "" + " within Daemonheim."); + case 106: + return newstruct cs2func_script_1022_struct(52, 16371, "Members: Zephyrium hatchet (Tier 6)" + "
" + " 1 bar", "Members can now smith " + "" + "zephyrium hatchets" + "" + " within Daemonheim."); + case 107: + return newstruct cs2func_script_1022_struct(52, 16305, "Members: Zephyrium pickaxe (Tier 6)" + "
" + " 1 bar", "Members can now smith " + "" + "zephyrium pickaxes" + "" + " within Daemonheim."); + case 108: + return newstruct cs2func_script_1022_struct(53, 17029, "Members: Zephyrium warhammer (Tier 6)" + "
" + " 2 bars", "Members can now smith " + "" + "zephyrium warhammers" + "" + " within Daemonheim."); + case 109: + return newstruct cs2func_script_1022_struct(53, 16945, "Members: Zephyrium rapier (Tier 6)" + "
" + " 2 bars", "Members can now smith " + "" + "zephyrium rapiers" + "" + " within Daemonheim."); + case 110: + return newstruct cs2func_script_1022_struct(54, 16393, "Members: Zephyrium longsword (Tier 6)" + "
" + " 2 bars", "Members can now smith " + "" + "zephyrium longswords" + "" + " within Daemonheim."); + case 111: + return newstruct cs2func_script_1022_struct(55, 16701, "Members: Zephyrium full helm (Tier 6)" + "
" + " 2 bars", "Members can now smith " + "" + "zephyrium full helms" + "" + " within Daemonheim."); + case 112: + return newstruct cs2func_script_1022_struct(55, 15763, "Members: Zephyrium battleaxe (Tier 6)" + "
" + " 2 bars", "Members can now smith " + "" + "zephyrium battleaxes" + "" + " within Daemonheim."); + case 113: + return newstruct cs2func_script_1022_struct(56, 17351, "Members: Zephyrium kiteshield (Tier 6)" + "
" + " 3 bars", "Members can now smith " + "" + "zephyrium kiteshields" + "" + " within Daemonheim."); + case 114: + return newstruct cs2func_script_1022_struct(56, 16723, "Members: Zephyrium chainbody (Tier 6)" + "
" + " 3 bars", "Members can now smith " + "" + "zephyrium chainbodies" + "" + " within Daemonheim."); + case 115: + return newstruct cs2func_script_1022_struct(57, 16679, "Members: Zephyrium platelegs (Tier 6)" + "
" + " 3 bars", "Members can now smith " + "" + "zephyrium platelegs" + "" + " within Daemonheim."); + case 116: + return newstruct cs2func_script_1022_struct(57, 16657, "Members: Zephyrium plateskirt (Tier 6)" + "
" + " 3 bars", "Members can now smith " + "" + "zephyrium plateskirts" + "" + " within Daemonheim."); + case 117: + return newstruct cs2func_script_1022_struct(57, 17103, "Members: Zephyrium spear (Tier 6)" + "
" + " 4 bars", "Members can now smith " + "" + "zephyrium spears" + "" + " within Daemonheim."); + case 118: + return newstruct cs2func_script_1022_struct(58, 16415, "Members: Zephyrium maul (Tier 6)" + "
" + " 4 bars", "Members can now smith " + "" + "zephyrium mauls" + "" + " within Daemonheim."); + case 119: + return newstruct cs2func_script_1022_struct(58, 16899, "Members: Zephyrium 2h sword (Tier 6)" + "
" + " 4 bars", "Members can now smith " + "" + "zephyrium 2h swords" + "" + " within Daemonheim."); + case 120: + return newstruct cs2func_script_1022_struct(59, 17249, "Members: Zephyrium platebody (Tier 6)" + "
" + " 5 bars", "Members can now smith " + "" + "zephyrium platebodies" + "" + " within Daemonheim."); + case 121: + return newstruct cs2func_script_1022_struct(60, 17662, "Members: Argonite (Tier 7)", "Members can now smelt " + "" + "argonite" + "" + " within Daemonheim."); + case 122: + return newstruct cs2func_script_1022_struct(60, 17915, "Members: Argonite arrowheads (Tier 7) (15)" + "
" + " 1 bar", "Members can now smith " + "" + "argonite arrowheads" + "" + " within Daemonheim."); + case 123: + return newstruct cs2func_script_1022_struct(60, 16805, "Members: Argonite dagger (Tier 7)" + "
" + " 1 bar", "Members can now smith " + "" + "argonite daggers" + "" + " within Daemonheim."); + case 124: + return newstruct cs2func_script_1022_struct(61, 16351, "Members: Argonite boots (Tier 7)" + "
" + " 1 bar", "Members can now smith " + "" + "argonite boots" + "" + " within Daemonheim."); + case 125: + return newstruct cs2func_script_1022_struct(61, 16285, "Members: Argonite gauntlets (Tier 7)" + "
" + " 1 bar", "Members can now smith " + "" + "argonite gauntlets" + "" + " within Daemonheim."); + case 126: + return newstruct cs2func_script_1022_struct(62, 16373, "Members: Argonite hatchet (Tier 7)" + "
" + " 1 bar", "Members can now smith " + "" + "argonite hatchets" + "" + " within Daemonheim."); + case 127: + return newstruct cs2func_script_1022_struct(62, 16307, "Members: Argonite pickaxe (Tier 7)" + "
" + " 1 bar", "Members can now smith " + "" + "argonite pickaxes" + "" + " within Daemonheim."); + case 128: + return newstruct cs2func_script_1022_struct(63, 17031, "Members: Argonite warhammer (Tier 7)" + "
" + " 2 bars", "Members can now smith " + "" + "argonite warhammers" + "" + " within Daemonheim."); + case 129: + return newstruct cs2func_script_1022_struct(63, 16947, "Members: Argonite rapier (Tier 7)" + "
" + " 2 bars", "Members can now smith " + "" + "argonite rapiers" + "" + " within Daemonheim."); + case 130: + return newstruct cs2func_script_1022_struct(64, 16395, "Members: Argonite longsword (Tier 7)" + "
" + " 2 bars", "Members can now smith " + "" + "argonite longswords" + "" + " within Daemonheim."); + case 131: + return newstruct cs2func_script_1022_struct(65, 16703, "Members: Argonite full helm (Tier 7)" + "
" + " 2 bars", "Members can now smith " + "" + "argonite full helms" + "" + " within Daemonheim."); + case 132: + return newstruct cs2func_script_1022_struct(65, 15765, "Members: Argonite battleaxe (Tier 7)" + "
" + " 2 bars", "Members can now smith " + "" + "argonite battleaxes" + "" + " within Daemonheim."); + case 133: + return newstruct cs2func_script_1022_struct(66, 17353, "Members: Argonite kiteshield (Tier 7)" + "
" + " 3 bars", "Members can now smith " + "" + "argonite kiteshields" + "" + " within Daemonheim."); + case 134: + return newstruct cs2func_script_1022_struct(66, 16725, "Members: Argonite chainbody (Tier 7)" + "
" + " 3 bars", "Members can now smith " + "" + "argonite chainbodies" + "" + " within Daemonheim."); + case 135: + return newstruct cs2func_script_1022_struct(67, 16681, "Members: Argonite platelegs (Tier 7)" + "
" + " 3 bars", "Members can now smith " + "" + "argonite platelegs" + "" + " within Daemonheim."); + case 136: + return newstruct cs2func_script_1022_struct(67, 16659, "Members: Argonite plateskirt (Tier 7)" + "
" + " 3 bars", "Members can now smith " + "" + "argonite plateskirts" + "" + " within Daemonheim."); + case 137: + return newstruct cs2func_script_1022_struct(67, 17111, "Members: Argonite spear (Tier 7)" + "
" + " 4 bars", "Members can now smith " + "" + "argonite spears" + "" + " within Daemonheim."); + case 138: + return newstruct cs2func_script_1022_struct(68, 16417, "Members: Argonite maul (Tier 7)" + "
" + " 4 bars", "Members can now smith " + "" + "argonite mauls" + "" + " within Daemonheim."); + case 139: + return newstruct cs2func_script_1022_struct(68, 16901, "Members: Argonite 2h sword (Tier 7)" + "
" + " 4 bars", "Members can now smith " + "" + "argonite 2h swords" + "" + " within Daemonheim."); + case 140: + return newstruct cs2func_script_1022_struct(69, 17251, "Members: Argonite platebody (Tier 7)" + "
" + " 5 bars", "Members can now smith " + "" + "argonite platebodies" + "" + " within Daemonheim."); + case 141: + return newstruct cs2func_script_1022_struct(70, 17664, "Members: Katagon (Tier 8)", "Members can now smelt " + "" + "katagon" + "" + " within Daemonheim."); + case 142: + return newstruct cs2func_script_1022_struct(70, 17920, "Members: Katagon arrowheads (Tier 8) (15)" + "
" + " 1 bar", "Members can now smith " + "" + "katagon arrowheads" + "" + " within Daemonheim."); + case 143: + return newstruct cs2func_script_1022_struct(70, 16813, "Members: Katagon dagger (Tier 8)" + "
" + " 1 bar", "Members can now smith " + "" + "katagon daggers" + "" + " within Daemonheim."); + case 144: + return newstruct cs2func_script_1022_struct(71, 16353, "Members: Katagon boots (Tier 8)" + "
" + " 1 bar", "Members can now smith " + "" + "katagon boots" + "" + " within Daemonheim."); + case 145: + return newstruct cs2func_script_1022_struct(71, 16287, "Members: Katagon gauntlets (Tier 8)" + "
" + " 1 bar", "Members can now smith " + "" + "katagon gauntlets" + "" + " within Daemonheim."); + case 146: + return newstruct cs2func_script_1022_struct(72, 16375, "Members: Katagon hatchet (Tier 8)" + "
" + " 1 bar", "Members can now smith " + "" + "katagon hatchets" + "" + " within Daemonheim."); + case 147: + return newstruct cs2func_script_1022_struct(72, 16309, "Members: Katagon pickaxe (Tier 8)" + "
" + " 1 bar", "Members can now smith " + "" + "katagon pickaxes" + "" + " within Daemonheim."); + case 148: + return newstruct cs2func_script_1022_struct(73, 17033, "Members: Katagon warhammer (Tier 8)" + "
" + " 2 bars", "Members can now smith " + "" + "katagon warhammers" + "" + " within Daemonheim."); + case 149: + return newstruct cs2func_script_1022_struct(73, 16949, "Members: Katagon rapier (Tier 8)" + "
" + " 2 bars", "Members can now smith " + "" + "katagon rapiers" + "" + " within Daemonheim."); + case 150: + return newstruct cs2func_script_1022_struct(74, 16397, "Members: Katagon longsword (Tier 8)" + "
" + " 2 bars", "Members can now smith " + "" + "katagon longswords" + "" + " within Daemonheim."); + case 151: + return newstruct cs2func_script_1022_struct(75, 16705, "Members: Katagon full helm (Tier 8)" + "
" + " 2 bars", "Members can now smith " + "" + "katagon full helms" + "" + " within Daemonheim."); + case 152: + return newstruct cs2func_script_1022_struct(75, 15767, "Members: Katagon battleaxe (Tier 8)" + "
" + " 2 bars", "Members can now smith " + "" + "katagon battleaxes" + "" + " within Daemonheim."); + case 153: + return newstruct cs2func_script_1022_struct(76, 17355, "Members: Katagon kiteshield (Tier 8)" + "
" + " 3 bars", "Members can now smith " + "" + "katagon kiteshields" + "" + " within Daemonheim."); + case 154: + return newstruct cs2func_script_1022_struct(76, 16727, "Members: Katagon chainbody (Tier 8)" + "
" + " 3 bars", "Members can now smith " + "" + "katagon chainbodies" + "" + " within Daemonheim."); + case 155: + return newstruct cs2func_script_1022_struct(77, 16683, "Members: Katagon platelegs (Tier 8)" + "
" + " 3 bars", "Members can now smith " + "" + "katagon platelegs" + "" + " within Daemonheim."); + case 156: + return newstruct cs2func_script_1022_struct(77, 16661, "Members: Katagon plateskirt (Tier 8)" + "
" + " 3 bars", "Members can now smith " + "" + "katagon plateskirts" + "" + " within Daemonheim."); + case 157: + return newstruct cs2func_script_1022_struct(77, 17119, "Members: Katagon spear (Tier 8)" + "
" + " 4 bars", "Members can now smith " + "" + "katagon spears" + "" + " within Daemonheim."); + case 158: + return newstruct cs2func_script_1022_struct(78, 16419, "Members: Katagon maul (Tier 8)" + "
" + " 4 bars", "Members can now smith " + "" + "katagon mauls" + "" + " within Daemonheim."); + case 159: + return newstruct cs2func_script_1022_struct(78, 16903, "Members: Katagon 2h sword (Tier 8)" + "
" + " 4 bars", "Members can now smith " + "" + "katagon 2h swords" + "" + " within Daemonheim."); + case 160: + return newstruct cs2func_script_1022_struct(79, 17253, "Members: Katagon platebody (Tier 8)" + "
" + " 5 bars", "Members can now smith " + "" + "katagon platebodies" + "" + " within Daemonheim."); + case 161: + return newstruct cs2func_script_1022_struct(80, 17666, "Members: Gorgonite (Tier 9)", "Members can now smelt " + "" + "gorgonite" + "" + " within Daemonheim."); + case 162: + return newstruct cs2func_script_1022_struct(80, 17925, "Members: Gorgonite arrowheads (Tier 9) (15)" + "
" + " 1 bar", "Members can now smith " + "" + "gorgonite arrowheads" + "" + " within Daemonheim."); + case 163: + return newstruct cs2func_script_1022_struct(80, 16821, "Members: Gorgonite dagger (Tier 9)" + "
" + " 1 bar", "Members can now smith " + "" + "gorgonite daggers" + "" + " within Daemonheim."); + case 164: + return newstruct cs2func_script_1022_struct(81, 16355, "Members: Gorgonite boots (Tier 9)" + "
" + " 1 bar", "Members can now smith " + "" + "gorgonite boots" + "" + " within Daemonheim."); + case 165: + return newstruct cs2func_script_1022_struct(81, 16289, "Members: Gorgonite gauntlets (Tier 9)" + "
" + " 1 bar", "Members can now smith " + "" + "gorgonite gauntlets" + "" + " within Daemonheim."); + case 166: + return newstruct cs2func_script_1022_struct(82, 16377, "Members: Gorgonite hatchet (Tier 9)" + "
" + " 1 bar", "Members can now smith " + "" + "gorgonite hatchets" + "" + " within Daemonheim."); + case 167: + return newstruct cs2func_script_1022_struct(82, 16311, "Members: Gorgonite pickaxe (Tier 9)" + "
" + " 1 bar", "Members can now smith " + "" + "gorgonite pickaxes" + "" + " within Daemonheim."); + case 168: + return newstruct cs2func_script_1022_struct(83, 17035, "Members: Gorgonite warhammer (Tier 9)" + "
" + " 2 bars", "Members can now smith " + "" + "gorgonite warhammers" + "" + " within Daemonheim."); + case 169: + return newstruct cs2func_script_1022_struct(83, 16951, "Members: Gorgonite rapier (Tier 9)" + "
" + " 2 bars", "Members can now smith " + "" + "gorgonite rapiers" + "" + " within Daemonheim."); + case 170: + return newstruct cs2func_script_1022_struct(84, 16399, "Members: Gorgonite longsword (Tier 9)" + "
" + " 2 bars", "Members can now smith " + "" + "gorgonite longswords" + "" + " within Daemonheim."); + case 171: + return newstruct cs2func_script_1022_struct(85, 16707, "Members: Gorgonite full helm (Tier 9)" + "
" + " 2 bars", "Members can now smith " + "" + "gorgonite full helms" + "" + " within Daemonheim."); + case 172: + return newstruct cs2func_script_1022_struct(85, 15769, "Members: Gorgonite battleaxe (Tier 9)" + "
" + " 2 bars", "Members can now smith " + "" + "gorgonite battleaxes" + "" + " within Daemonheim."); + case 173: + return newstruct cs2func_script_1022_struct(86, 17357, "Members: Gorgonite kiteshield (Tier 9)" + "
" + " 3 bars", "Members can now smith " + "" + "gorgonite kiteshields" + "" + " within Daemonheim."); + case 174: + return newstruct cs2func_script_1022_struct(86, 16729, "Members: Gorgonite chainbody (Tier 9)" + "
" + " 3 bars", "Members can now smith " + "" + "gorgonite chainbodies" + "" + " within Daemonheim."); + case 175: + return newstruct cs2func_script_1022_struct(87, 16685, "Members: Gorgonite platelegs (Tier 9)" + "
" + " 3 bars", "Members can now smith " + "" + "gorgonite platelegs" + "" + " within Daemonheim."); + case 176: + return newstruct cs2func_script_1022_struct(87, 16663, "Members: Gorgonite plateskirt (Tier 9)" + "
" + " 3 bars", "Members can now smith " + "" + "gorgonite plateskirts" + "" + " within Daemonheim."); + case 177: + return newstruct cs2func_script_1022_struct(87, 17127, "Members: Gorgonite spear (Tier 9)" + "
" + " 4 bars", "Members can now smith " + "" + "gorgonite spears" + "" + " within Daemonheim."); + case 178: + return newstruct cs2func_script_1022_struct(88, 16421, "Members: Gorgonite maul (Tier 9)" + "
" + " 4 bars", "Members can now smith " + "" + "gorgonite mauls" + "" + " within Daemonheim."); + case 179: + return newstruct cs2func_script_1022_struct(88, 16905, "Members: Gorgonite 2h sword (Tier 9)" + "
" + " 4 bars", "Members can now smith " + "" + "gorgonite 2h swords" + "" + " within Daemonheim."); + case 180: + return newstruct cs2func_script_1022_struct(89, 17255, "Members: Gorgonite platebody (Tier 9)" + "
" + " 5 bars", "Members can now smith " + "" + "gorgonite platebodies" + "" + " within Daemonheim."); + case 181: + return newstruct cs2func_script_1022_struct(90, 17668, "Members: Promethium (Tier 10)", "Members can now smelt " + "" + "Promethium" + "" + " within Daemonheim."); + case 182: + return newstruct cs2func_script_1022_struct(90, 17930, "Members: Promethium arrowheads (Tier 10) (15)" + "
" + " 1 bar", "Members can now smith " + "" + "promethium arrowheads" + "" + " within Daemonheim."); + case 183: + return newstruct cs2func_script_1022_struct(90, 16829, "Members: Promethium dagger (Tier 10)" + "
" + " 1 bar", "Members can now smith " + "" + "promethium daggers" + "" + " within Daemonheim."); + case 184: + return newstruct cs2func_script_1022_struct(91, 16357, "Members: Promethium boots (Tier 10)" + "
" + " 1 bar", "Members can now smith " + "" + "promethium boots" + "" + " within Daemonheim."); + case 185: + return newstruct cs2func_script_1022_struct(91, 16291, "Members: Promethium gauntlets (Tier 10)" + "
" + " 1 bar", "Members can now smith " + "" + "promethium gauntlets" + "" + " within Daemonheim."); + case 186: + return newstruct cs2func_script_1022_struct(92, 16379, "Members: Promethium hatchet (Tier 10)" + "
" + " 1 bar", "Members can now smith " + "" + "promethium hatchets" + "" + " within Daemonheim."); + case 187: + return newstruct cs2func_script_1022_struct(92, 16313, "Members: Promethium pickaxe (Tier 10)" + "
" + " 1 bar", "Members can now smith " + "" + "promethium pickaxes" + "" + " within Daemonheim."); + case 188: + return newstruct cs2func_script_1022_struct(93, 17037, "Members: Promethium warhammer (Tier 10)" + "
" + " 2 bars", "Members can now smith " + "" + "promethium warhammers" + "" + " within Daemonheim."); + case 189: + return newstruct cs2func_script_1022_struct(93, 16953, "Members: Promethium rapier (Tier 10)" + "
" + " 2 bars", "Members can now smith " + "" + "promethium rapiers" + "" + " within Daemonheim."); + case 190: + return newstruct cs2func_script_1022_struct(94, 16401, "Members: Promethium longsword (Tier 10)" + "
" + " 2 bars", "Members can now smith " + "" + "promethium longswords" + "" + " within Daemonheim."); + case 191: + return newstruct cs2func_script_1022_struct(95, 16709, "Members: Promethium full helm (Tier 10)" + "
" + " 2 bars", "Members can now smith " + "" + "promethium full helms" + "" + " within Daemonheim."); + case 192: + return newstruct cs2func_script_1022_struct(95, 15771, "Members: Promethium battleaxe (Tier 10)" + "
" + " 2 bars", "Members can now smith " + "" + "promethium battleaxes" + "" + " within Daemonheim."); + case 193: + return newstruct cs2func_script_1022_struct(96, 17359, "Members: Promethium kiteshield (Tier 10)" + "
" + " 3 bars", "Members can now smith " + "" + "promethium kiteshields" + "" + " within Daemonheim."); + case 194: + return newstruct cs2func_script_1022_struct(96, 16731, "Members: Promethium chainbody (Tier 10)" + "
" + " 3 bars", "Members can now smith " + "" + "promethium chainbodies" + "" + " within Daemonheim."); + case 195: + return newstruct cs2func_script_1022_struct(97, 16687, "Members: Promethium platelegs (Tier 10)" + "
" + " 3 bars", "Members can now smith " + "" + "promethium platelegs" + "" + " within Daemonheim."); + case 196: + return newstruct cs2func_script_1022_struct(97, 16665, "Members: Promethium plateskirt (Tier 10)" + "
" + " 3 bars", "Members can now smith " + "" + "promethium plateskirts" + "" + " within Daemonheim."); + case 197: + return newstruct cs2func_script_1022_struct(97, 17135, "Members: Promethium spear (Tier 10)" + "
" + " 4 bars", "Members can now smith " + "" + "promethium spears" + "" + " within Daemonheim."); + case 198: + return newstruct cs2func_script_1022_struct(98, 16423, "Members: Promethium maul (Tier 10)" + "
" + " 4 bars", "Members can now smith " + "" + "promethium mauls" + "" + " within Daemonheim."); + case 199: + return newstruct cs2func_script_1022_struct(98, 16907, "Members: Promethium 2h sword (Tier 10)" + "
" + " 4 bars", "Members can now smith " + "" + "promethium 2h swords" + "" + " within Daemonheim."); + case 200: + return newstruct cs2func_script_1022_struct(99, 17257, "Members: Promethium platebody (Tier 10)" + "
" + " 5 bars", "Members can now smith " + "" + "promethium platebodies" + "" + " within Daemonheim."); + } + break; + case 15: + SWITCH (arg1) { + case 0: + GOTO flow_554 + } + break; + flow_554: + return newstruct cs2func_script_1022_struct(99, 9795, "Skill mastery", "" + "Congratulations! You are now a master smith. Members can visit " + "" + "Thurgo" + "" + ", who lives near " + "" + "Mudskipper Point" + "" + ". He has something special that is only available to true masters of the " + "" + "Smithing" + "" + " skill!"); + } + return newstruct cs2func_script_1022_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1023.cs2 b/dumps/scripts/1023.cs2 new file mode 100644 index 000000000..20bea902c --- /dev/null +++ b/dumps/scripts/1023.cs2 @@ -0,0 +1,4603 @@ +cs2func_script_1023_struct(2,1,0) script_1023(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + string svar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_1025_struct(2,1,0) structdump_3; + cs2func_script_1025_struct(2,1,0) structdump_4; + cs2func_script_1025_struct(2,1,0) structdump_5; + cs2func_script_1025_struct(2,1,0) structdump_6; + cs2func_script_1025_struct(2,1,0) structdump_7; + cs2func_script_1025_struct(2,1,0) structdump_8; + cs2func_script_1025_struct(2,1,0) structdump_9; + cs2func_script_1025_struct(2,1,0) structdump_10; + cs2func_script_1025_struct(2,1,0) structdump_11; + cs2func_script_1025_struct(2,1,0) structdump_12; + cs2func_script_1025_struct(2,1,0) structdump_13; + cs2func_script_1025_struct(2,1,0) structdump_14; + cs2func_script_1025_struct(2,1,0) structdump_15; + cs2func_script_1025_struct(2,1,0) structdump_16; + cs2func_script_1025_struct(2,1,0) structdump_17; + cs2func_script_1025_struct(2,1,0) structdump_18; + cs2func_script_1025_struct(2,1,0) structdump_19; + cs2func_script_1025_struct(2,1,0) structdump_20; + cs2func_script_1025_struct(2,1,0) structdump_21; + cs2func_script_1025_struct(2,1,0) structdump_22; + cs2func_script_1025_struct(2,1,0) structdump_23; + cs2func_script_1025_struct(2,1,0) structdump_24; + cs2func_script_1025_struct(2,1,0) structdump_25; + cs2func_script_1025_struct(2,1,0) structdump_26; + cs2func_script_1025_struct(2,1,0) structdump_27; + cs2func_script_1025_struct(2,1,0) structdump_28; + cs2func_script_1025_struct(2,1,0) structdump_29; + cs2func_script_1025_struct(2,1,0) structdump_30; + cs2func_script_1025_struct(2,1,0) structdump_31; + cs2func_script_1025_struct(2,1,0) structdump_32; + cs2func_script_1025_struct(2,1,0) structdump_33; + cs2func_script_1025_struct(2,1,0) structdump_34; + cs2func_script_1025_struct(2,1,0) structdump_35; + cs2func_script_1025_struct(2,1,0) structdump_36; + cs2func_script_1025_struct(2,1,0) structdump_37; + cs2func_script_1025_struct(2,1,0) structdump_38; + cs2func_script_1025_struct(2,1,0) structdump_39; + cs2func_script_1025_struct(2,1,0) structdump_40; + cs2func_script_1025_struct(2,1,0) structdump_41; + cs2func_script_1025_struct(2,1,0) structdump_42; + cs2func_script_1025_struct(2,1,0) structdump_43; + cs2func_script_1025_struct(2,1,0) structdump_44; + cs2func_script_1025_struct(2,1,0) structdump_45; + cs2func_script_1025_struct(2,1,0) structdump_46; + cs2func_script_1025_struct(2,1,0) structdump_47; + cs2func_script_1025_struct(2,1,0) structdump_48; + cs2func_script_1025_struct(2,1,0) structdump_49; + cs2func_script_1025_struct(2,1,0) structdump_50; + cs2func_script_1025_struct(2,1,0) structdump_51; + cs2func_script_1025_struct(2,1,0) structdump_52; + cs2func_script_1025_struct(2,1,0) structdump_53; + cs2func_script_1025_struct(2,1,0) structdump_54; + cs2func_script_1025_struct(2,1,0) structdump_55; + cs2func_script_1025_struct(2,1,0) structdump_56; + cs2func_script_1025_struct(2,1,0) structdump_57; + cs2func_script_1025_struct(2,1,0) structdump_58; + cs2func_script_1025_struct(2,1,0) structdump_59; + cs2func_script_1025_struct(2,1,0) structdump_60; + cs2func_script_1025_struct(2,1,0) structdump_61; + cs2func_script_1025_struct(2,1,0) structdump_62; + cs2func_script_1025_struct(2,1,0) structdump_63; + cs2func_script_1025_struct(2,1,0) structdump_64; + cs2func_script_1025_struct(2,1,0) structdump_65; + cs2func_script_1025_struct(2,1,0) structdump_66; + cs2func_script_1025_struct(2,1,0) structdump_67; + cs2func_script_1025_struct(2,1,0) structdump_68; + cs2func_script_1025_struct(2,1,0) structdump_69; + cs2func_script_1025_struct(2,1,0) structdump_70; + cs2func_script_1025_struct(2,1,0) structdump_71; + cs2func_script_1025_struct(2,1,0) structdump_72; + cs2func_script_1025_struct(2,1,0) structdump_73; + cs2func_script_1025_struct(2,1,0) structdump_74; + cs2func_script_1025_struct(2,1,0) structdump_75; + cs2func_script_1025_struct(2,1,0) structdump_76; + cs2func_script_1025_struct(2,1,0) structdump_77; + cs2func_script_1025_struct(2,1,0) structdump_78; + cs2func_script_1025_struct(2,1,0) structdump_79; + cs2func_script_1025_struct(2,1,0) structdump_80; + cs2func_script_1025_struct(2,1,0) structdump_81; + cs2func_script_1025_struct(2,1,0) structdump_82; + cs2func_script_1025_struct(2,1,0) structdump_83; + cs2func_script_1025_struct(2,1,0) structdump_84; + cs2func_script_1025_struct(2,1,0) structdump_85; + cs2func_script_1025_struct(2,1,0) structdump_86; + cs2func_script_1025_struct(2,1,0) structdump_87; + cs2func_script_1025_struct(2,1,0) structdump_88; + cs2func_script_1025_struct(2,1,0) structdump_89; + cs2func_script_1025_struct(2,1,0) structdump_90; + cs2func_script_1025_struct(2,1,0) structdump_91; + cs2func_script_1025_struct(2,1,0) structdump_92; + cs2func_script_1025_struct(2,1,0) structdump_93; + cs2func_script_1025_struct(2,1,0) structdump_94; + cs2func_script_1025_struct(2,1,0) structdump_95; + cs2func_script_1025_struct(2,1,0) structdump_96; + cs2func_script_1025_struct(2,1,0) structdump_97; + cs2func_script_1025_struct(2,1,0) structdump_98; + cs2func_script_1025_struct(2,1,0) structdump_99; + cs2func_script_1025_struct(2,1,0) structdump_100; + cs2func_script_1025_struct(2,1,0) structdump_101; + cs2func_script_1025_struct(2,1,0) structdump_102; + cs2func_script_1025_struct(2,1,0) structdump_103; + cs2func_script_1025_struct(2,1,0) structdump_104; + cs2func_script_1025_struct(2,1,0) structdump_105; + cs2func_script_1025_struct(2,1,0) structdump_106; + cs2func_script_1025_struct(2,1,0) structdump_107; + cs2func_script_1025_struct(2,1,0) structdump_108; + cs2func_script_1025_struct(2,1,0) structdump_109; + cs2func_script_1025_struct(2,1,0) structdump_110; + cs2func_script_1025_struct(2,1,0) structdump_111; + cs2func_script_1025_struct(2,1,0) structdump_112; + cs2func_script_1025_struct(2,1,0) structdump_113; + cs2func_script_1025_struct(2,1,0) structdump_114; + cs2func_script_1025_struct(2,1,0) structdump_115; + cs2func_script_1025_struct(2,1,0) structdump_116; + cs2func_script_1025_struct(2,1,0) structdump_117; + cs2func_script_1025_struct(2,1,0) structdump_118; + cs2func_script_1025_struct(2,1,0) structdump_119; + cs2func_script_1025_struct(2,1,0) structdump_120; + cs2func_script_1025_struct(2,1,0) structdump_121; + cs2func_script_1025_struct(2,1,0) structdump_122; + cs2func_script_1025_struct(2,1,0) structdump_123; + cs2func_script_1025_struct(2,1,0) structdump_124; + cs2func_script_1025_struct(2,1,0) structdump_125; + cs2func_script_1025_struct(2,1,0) structdump_126; + cs2func_script_1025_struct(2,1,0) structdump_127; + cs2func_script_1025_struct(2,1,0) structdump_128; + cs2func_script_1025_struct(2,1,0) structdump_129; + cs2func_script_1025_struct(2,1,0) structdump_130; + cs2func_script_1025_struct(2,1,0) structdump_131; + cs2func_script_1025_struct(2,1,0) structdump_132; + cs2func_script_1025_struct(2,1,0) structdump_133; + cs2func_script_1025_struct(2,1,0) structdump_134; + cs2func_script_1025_struct(2,1,0) structdump_135; + cs2func_script_1025_struct(2,1,0) structdump_136; + cs2func_script_1025_struct(2,1,0) structdump_137; + cs2func_script_1025_struct(2,1,0) structdump_138; + cs2func_script_1025_struct(2,1,0) structdump_139; + cs2func_script_1025_struct(2,1,0) structdump_140; + cs2func_script_1025_struct(2,1,0) structdump_141; + cs2func_script_1025_struct(2,1,0) structdump_142; + cs2func_script_1025_struct(2,1,0) structdump_143; + cs2func_script_1025_struct(2,1,0) structdump_144; + cs2func_script_1025_struct(2,1,0) structdump_145; + cs2func_script_1025_struct(2,1,0) structdump_146; + cs2func_script_1025_struct(2,1,0) structdump_147; + cs2func_script_1025_struct(2,1,0) structdump_148; + cs2func_script_1025_struct(2,1,0) structdump_149; + cs2func_script_1025_struct(2,1,0) structdump_150; + cs2func_script_1025_struct(2,1,0) structdump_151; + cs2func_script_1025_struct(2,1,0) structdump_152; + cs2func_script_1025_struct(2,1,0) structdump_153; + cs2func_script_1025_struct(2,1,0) structdump_154; + cs2func_script_1025_struct(2,1,0) structdump_155; + cs2func_script_1025_struct(2,1,0) structdump_156; + cs2func_script_1025_struct(2,1,0) structdump_157; + cs2func_script_1025_struct(2,1,0) structdump_158; + cs2func_script_1025_struct(2,1,0) structdump_159; + cs2func_script_1025_struct(2,1,0) structdump_160; + cs2func_script_1025_struct(2,1,0) structdump_161; + cs2func_script_1025_struct(2,1,0) structdump_162; + cs2func_script_1025_struct(2,1,0) structdump_163; + cs2func_script_1025_struct(2,1,0) structdump_164; + cs2func_script_1025_struct(2,1,0) structdump_165; + cs2func_script_1025_struct(2,1,0) structdump_166; + cs2func_script_1025_struct(2,1,0) structdump_167; + cs2func_script_1025_struct(2,1,0) structdump_168; + cs2func_script_1025_struct(2,1,0) structdump_169; + cs2func_script_1025_struct(2,1,0) structdump_170; + cs2func_script_1025_struct(2,1,0) structdump_171; + cs2func_script_1025_struct(2,1,0) structdump_172; + cs2func_script_1025_struct(2,1,0) structdump_173; + cs2func_script_1025_struct(2,1,0) structdump_174; + cs2func_script_1025_struct(2,1,0) structdump_175; + cs2func_script_1025_struct(2,1,0) structdump_176; + cs2func_script_1025_struct(2,1,0) structdump_177; + cs2func_script_1025_struct(2,1,0) structdump_178; + cs2func_script_1025_struct(2,1,0) structdump_179; + cs2func_script_1025_struct(2,1,0) structdump_180; + cs2func_script_1025_struct(2,1,0) structdump_181; + cs2func_script_1025_struct(2,1,0) structdump_182; + cs2func_script_1025_struct(2,1,0) structdump_183; + cs2func_script_1025_struct(2,1,0) structdump_184; + cs2func_script_1025_struct(2,1,0) structdump_185; + cs2func_script_1025_struct(2,1,0) structdump_186; + cs2func_script_1025_struct(2,1,0) structdump_187; + cs2func_script_1025_struct(2,1,0) structdump_188; + cs2func_script_1025_struct(2,1,0) structdump_189; + cs2func_script_1025_struct(2,1,0) structdump_190; + cs2func_script_1025_struct(2,1,0) structdump_191; + cs2func_script_1025_struct(2,1,0) structdump_192; + cs2func_script_1025_struct(2,1,0) structdump_193; + cs2func_script_1025_struct(2,1,0) structdump_194; + cs2func_script_1025_struct(2,1,0) structdump_195; + cs2func_script_1025_struct(2,1,0) structdump_196; + cs2func_script_1025_struct(2,1,0) structdump_197; + cs2func_script_1025_struct(2,1,0) structdump_198; + cs2func_script_1025_struct(2,1,0) structdump_199; + cs2func_script_1025_struct(2,1,0) structdump_200; + cs2func_script_1025_struct(2,1,0) structdump_201; + cs2func_script_1025_struct(2,1,0) structdump_202; + cs2func_script_1025_struct(2,1,0) structdump_203; + cs2func_script_1025_struct(2,1,0) structdump_204; + cs2func_script_1025_struct(2,1,0) structdump_205; + cs2func_script_1025_struct(2,1,0) structdump_206; + cs2func_script_1025_struct(2,1,0) structdump_207; + cs2func_script_1025_struct(2,1,0) structdump_208; + cs2func_script_1025_struct(2,1,0) structdump_209; + cs2func_script_1025_struct(2,1,0) structdump_210; + cs2func_script_1025_struct(2,1,0) structdump_211; + cs2func_script_1025_struct(2,1,0) structdump_212; + cs2func_script_1025_struct(2,1,0) structdump_213; + cs2func_script_1025_struct(2,1,0) structdump_214; + cs2func_script_1025_struct(2,1,0) structdump_215; + cs2func_script_1025_struct(2,1,0) structdump_216; + cs2func_script_1025_struct(2,1,0) structdump_217; + cs2func_script_1025_struct(2,1,0) structdump_218; + cs2func_script_1025_struct(2,1,0) structdump_219; + cs2func_script_1025_struct(2,1,0) structdump_220; + cs2func_script_1025_struct(2,1,0) structdump_221; + cs2func_script_1025_struct(2,1,0) structdump_222; + cs2func_script_1025_struct(2,1,0) structdump_223; + cs2func_script_1025_struct(2,1,0) structdump_224; + cs2func_script_1025_struct(2,1,0) structdump_225; + cs2func_script_1025_struct(2,1,0) structdump_226; + cs2func_script_1025_struct(2,1,0) structdump_227; + cs2func_script_1025_struct(2,1,0) structdump_228; + cs2func_script_1025_struct(2,1,0) structdump_229; + cs2func_script_1025_struct(2,1,0) structdump_230; + cs2func_script_1025_struct(2,1,0) structdump_231; + cs2func_script_1025_struct(2,1,0) structdump_232; + cs2func_script_1025_struct(2,1,0) structdump_233; + cs2func_script_1025_struct(2,1,0) structdump_234; + cs2func_script_1025_struct(2,1,0) structdump_235; + cs2func_script_1025_struct(2,1,0) structdump_236; + cs2func_script_1025_struct(2,1,0) structdump_237; + cs2func_script_1025_struct(2,1,0) structdump_238; + cs2func_script_1025_struct(2,1,0) structdump_239; + cs2func_script_1025_struct(2,1,0) structdump_240; + cs2func_script_1025_struct(2,1,0) structdump_241; + cs2func_script_1025_struct(2,1,0) structdump_242; + cs2func_script_1025_struct(2,1,0) structdump_243; + cs2func_script_1025_struct(2,1,0) structdump_244; + cs2func_script_1025_struct(2,1,0) structdump_245; + cs2func_script_1025_struct(2,1,0) structdump_246; + cs2func_script_1025_struct(2,1,0) structdump_247; + cs2func_script_1025_struct(2,1,0) structdump_248; + cs2func_script_1025_struct(2,1,0) structdump_249; + cs2func_script_1025_struct(2,1,0) structdump_250; + cs2func_script_1025_struct(2,1,0) structdump_251; + cs2func_script_1025_struct(2,1,0) structdump_252; + cs2func_script_1025_struct(2,1,0) structdump_253; + cs2func_script_1025_struct(2,1,0) structdump_254; + cs2func_script_1025_struct(2,1,0) structdump_255; + cs2func_script_1025_struct(2,1,0) structdump_256; + cs2func_script_1025_struct(2,1,0) structdump_257; + cs2func_script_1025_struct(2,1,0) structdump_258; + cs2func_script_1025_struct(2,1,0) structdump_259; + cs2func_script_1025_struct(2,1,0) structdump_260; + cs2func_script_1025_struct(2,1,0) structdump_261; + cs2func_script_1025_struct(2,1,0) structdump_262; + cs2func_script_1025_struct(2,1,0) structdump_263; + cs2func_script_1025_struct(2,1,0) structdump_264; + cs2func_script_1025_struct(2,1,0) structdump_265; + cs2func_script_1025_struct(2,1,0) structdump_266; + cs2func_script_1025_struct(2,1,0) structdump_267; + cs2func_script_1025_struct(2,1,0) structdump_268; + cs2func_script_1025_struct(2,1,0) structdump_269; + cs2func_script_1025_struct(2,1,0) structdump_270; + cs2func_script_1025_struct(2,1,0) structdump_271; + cs2func_script_1025_struct(2,1,0) structdump_272; + cs2func_script_1025_struct(2,1,0) structdump_273; + cs2func_script_1025_struct(2,1,0) structdump_274; + cs2func_script_1025_struct(2,1,0) structdump_275; + cs2func_script_1025_struct(2,1,0) structdump_276; + cs2func_script_2042_struct(2,1,0) structdump_277; + cs2func_script_1025_struct(2,1,0) structdump_278; + cs2func_script_1025_struct(2,1,0) structdump_279; + cs2func_script_1025_struct(2,1,0) structdump_280; + cs2func_script_1025_struct(2,1,0) structdump_281; + cs2func_script_1025_struct(2,1,0) structdump_282; + cs2func_script_1025_struct(2,1,0) structdump_283; + cs2func_script_1025_struct(2,1,0) structdump_284; + cs2func_script_1025_struct(2,1,0) structdump_285; + cs2func_script_1025_struct(2,1,0) structdump_286; + cs2func_script_1025_struct(2,1,0) structdump_287; + cs2func_script_1025_struct(2,1,0) structdump_288; + cs2func_script_1025_struct(2,1,0) structdump_289; + cs2func_script_1025_struct(2,1,0) structdump_290; + cs2func_script_1025_struct(2,1,0) structdump_291; + cs2func_script_1025_struct(2,1,0) structdump_292; + cs2func_script_1025_struct(2,1,0) structdump_293; + cs2func_script_1025_struct(2,1,0) structdump_294; + cs2func_script_1025_struct(2,1,0) structdump_295; + cs2func_script_1025_struct(2,1,0) structdump_296; + cs2func_script_1025_struct(2,1,0) structdump_297; + cs2func_script_1025_struct(2,1,0) structdump_298; + cs2func_script_1025_struct(2,1,0) structdump_299; + cs2func_script_1025_struct(2,1,0) structdump_300; + cs2func_script_1025_struct(2,1,0) structdump_301; + cs2func_script_1025_struct(2,1,0) structdump_302; + cs2func_script_1025_struct(2,1,0) structdump_303; + cs2func_script_1025_struct(2,1,0) structdump_304; + cs2func_script_1025_struct(2,1,0) structdump_305; + cs2func_script_1025_struct(2,1,0) structdump_306; + cs2func_script_1025_struct(2,1,0) structdump_307; + cs2func_script_1025_struct(2,1,0) structdump_308; + cs2func_script_1025_struct(2,1,0) structdump_309; + cs2func_script_1025_struct(2,1,0) structdump_310; + cs2func_script_1025_struct(2,1,0) structdump_311; + cs2func_script_1025_struct(2,1,0) structdump_312; + cs2func_script_1025_struct(2,1,0) structdump_313; + cs2func_script_1025_struct(2,1,0) structdump_314; + cs2func_script_1025_struct(2,1,0) structdump_315; + cs2func_script_1025_struct(2,1,0) structdump_316; + cs2func_script_1025_struct(2,1,0) structdump_317; + cs2func_script_1025_struct(2,1,0) structdump_318; + cs2func_script_1025_struct(2,1,0) structdump_319; + cs2func_script_1025_struct(2,1,0) structdump_320; + cs2func_script_1025_struct(2,1,0) structdump_321; + cs2func_script_1025_struct(2,1,0) structdump_322; + cs2func_script_1025_struct(2,1,0) structdump_323; + cs2func_script_1025_struct(2,1,0) structdump_324; + cs2func_script_1025_struct(2,1,0) structdump_325; + cs2func_script_1025_struct(2,1,0) structdump_326; + cs2func_script_1025_struct(2,1,0) structdump_327; + cs2func_script_1025_struct(2,1,0) structdump_328; + cs2func_script_1025_struct(2,1,0) structdump_329; + cs2func_script_1025_struct(2,1,0) structdump_330; + cs2func_script_1025_struct(2,1,0) structdump_331; + cs2func_script_1025_struct(2,1,0) structdump_332; + cs2func_script_1025_struct(2,1,0) structdump_333; + cs2func_script_1025_struct(2,1,0) structdump_334; + cs2func_script_1025_struct(2,1,0) structdump_335; + cs2func_script_1025_struct(2,1,0) structdump_336; + cs2func_script_1025_struct(2,1,0) structdump_337; + cs2func_script_1025_struct(2,1,0) structdump_338; + cs2func_script_1025_struct(2,1,0) structdump_339; + cs2func_script_1025_struct(2,1,0) structdump_340; + cs2func_script_1025_struct(2,1,0) structdump_341; + cs2func_script_1025_struct(2,1,0) structdump_342; + cs2func_script_1025_struct(2,1,0) structdump_343; + cs2func_script_1025_struct(2,1,0) structdump_344; + cs2func_script_1025_struct(2,1,0) structdump_345; + cs2func_script_1025_struct(2,1,0) structdump_346; + cs2func_script_1025_struct(2,1,0) structdump_347; + cs2func_script_1025_struct(2,1,0) structdump_348; + cs2func_script_1025_struct(2,1,0) structdump_349; + cs2func_script_1025_struct(2,1,0) structdump_350; + cs2func_script_1025_struct(2,1,0) structdump_351; + cs2func_script_1025_struct(2,1,0) structdump_352; + cs2func_script_1025_struct(2,1,0) structdump_353; + cs2func_script_1025_struct(2,1,0) structdump_354; + cs2func_script_1025_struct(2,1,0) structdump_355; + cs2func_script_1025_struct(2,1,0) structdump_356; + cs2func_script_1025_struct(2,1,0) structdump_357; + cs2func_script_1025_struct(2,1,0) structdump_358; + cs2func_script_1025_struct(2,1,0) structdump_359; + cs2func_script_1025_struct(2,1,0) structdump_360; + cs2func_script_1025_struct(2,1,0) structdump_361; + cs2func_script_1025_struct(2,1,0) structdump_362; + cs2func_script_1025_struct(2,1,0) structdump_363; + cs2func_script_1025_struct(2,1,0) structdump_364; + cs2func_script_1025_struct(2,1,0) structdump_365; + cs2func_script_1025_struct(2,1,0) structdump_366; + cs2func_script_1025_struct(2,1,0) structdump_367; + cs2func_script_1025_struct(2,1,0) structdump_368; + cs2func_script_1025_struct(2,1,0) structdump_369; + cs2func_script_1025_struct(2,1,0) structdump_370; + cs2func_script_1025_struct(2,1,0) structdump_371; + cs2func_script_1025_struct(2,1,0) structdump_372; + cs2func_script_1025_struct(2,1,0) structdump_373; + cs2func_script_1025_struct(2,1,0) structdump_374; + cs2func_script_1025_struct(2,1,0) structdump_375; + cs2func_script_1025_struct(2,1,0) structdump_376; + cs2func_script_1025_struct(2,1,0) structdump_377; + cs2func_script_1025_struct(2,1,0) structdump_378; + cs2func_script_1025_struct(2,1,0) structdump_379; + cs2func_script_1025_struct(2,1,0) structdump_380; + cs2func_script_1025_struct(2,1,0) structdump_381; + cs2func_script_1025_struct(2,1,0) structdump_382; + cs2func_script_1025_struct(2,1,0) structdump_383; + cs2func_script_1025_struct(2,1,0) structdump_384; + cs2func_script_1025_struct(2,1,0) structdump_385; + cs2func_script_1025_struct(2,1,0) structdump_386; + cs2func_script_1025_struct(2,1,0) structdump_387; + cs2func_script_1025_struct(2,1,0) structdump_388; + cs2func_script_1025_struct(2,1,0) structdump_389; + cs2func_script_1025_struct(2,1,0) structdump_390; + cs2func_script_1025_struct(2,1,0) structdump_391; + cs2func_script_1025_struct(2,1,0) structdump_392; + cs2func_script_1025_struct(2,1,0) structdump_393; + cs2func_script_1025_struct(2,1,0) structdump_394; + cs2func_script_1025_struct(2,1,0) structdump_395; + cs2func_script_1025_struct(2,1,0) structdump_396; + ivar2 = getSkillActualLvl(arg0); + svar0 = "null"; + ivar3 = -1; + ivar4 = 0; + switch (arg1) { + case 0: + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_3 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_3.intpart_1; + ivar3 = structdump_3.intpart_0; + svar0 = structdump_3.stringpart_0; + } + if (standart_config_122 == 7) { + ivar4 = 0; + } + break; + case 1: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 15)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_4 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_4.intpart_1; + ivar3 = structdump_4.intpart_0; + svar0 = structdump_4.stringpart_0; + } + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_5 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_5.intpart_1; + ivar3 = structdump_5.intpart_0; + svar0 = structdump_5.stringpart_0; + } + if (bitconfig_3550 == 11) { + ivar4 = 0; + } + break; + case 2: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_6 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_6.intpart_1; + ivar3 = structdump_6.intpart_0; + svar0 = structdump_6.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_7 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_7.intpart_1; + ivar3 = structdump_7.intpart_0; + svar0 = structdump_7.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_8 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_8.intpart_1; + ivar3 = structdump_8.intpart_0; + svar0 = structdump_8.stringpart_0; + } + if (bitconfig_299 > 109) { + ivar4 = 0; + } + break; + case 3: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_9 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_9.intpart_1; + ivar3 = structdump_9.intpart_0; + svar0 = structdump_9.stringpart_0; + } + if ((arg0 == 9) && (getSkillActualLvl(arg0) == 5)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_10 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_10.intpart_1; + ivar3 = structdump_10.intpart_0; + svar0 = structdump_10.stringpart_0; + } + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_11 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_11.intpart_1; + ivar3 = structdump_11.intpart_0; + svar0 = structdump_11.stringpart_0; + } + if (standart_config_293 == 65) { + ivar4 = 0; + } + break; + case 4: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 42)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_12 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_12.intpart_1; + ivar3 = structdump_12.intpart_0; + svar0 = structdump_12.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_13 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_13.intpart_1; + ivar3 = structdump_13.intpart_0; + svar0 = structdump_13.stringpart_0; + } + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_14 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_14.intpart_1; + ivar3 = structdump_14.intpart_0; + svar0 = structdump_14.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_15 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_15.intpart_1; + ivar3 = structdump_15.intpart_0; + svar0 = structdump_15.stringpart_0; + } + if (standart_config_655 > 130) { + ivar4 = 0; + } + break; + case 5: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_16 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_16.intpart_1; + ivar3 = structdump_16.intpart_0; + svar0 = structdump_16.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_17 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_17.intpart_1; + ivar3 = structdump_17.intpart_0; + svar0 = structdump_17.stringpart_0; + } + if (standart_config_399 > 6) { + ivar4 = 0; + } + break; + case 6: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 26)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_18 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_18.intpart_1; + ivar3 = structdump_18.intpart_0; + svar0 = structdump_18.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 5)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_19 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_19.intpart_1; + ivar3 = structdump_19.intpart_0; + svar0 = structdump_19.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 32)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_20 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_20.intpart_1; + ivar3 = structdump_20.intpart_0; + svar0 = structdump_20.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 33)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_21 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_21.intpart_1; + ivar3 = structdump_21.intpart_0; + svar0 = structdump_21.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_22 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_22.intpart_1; + ivar3 = structdump_22.intpart_0; + svar0 = structdump_22.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_23 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_23.intpart_1; + ivar3 = structdump_23.intpart_0; + svar0 = structdump_23.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 22)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_24 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_24.intpart_1; + ivar3 = structdump_24.intpart_0; + svar0 = structdump_24.stringpart_0; + } + if (bitconfig_2573 == 320) { + ivar4 = 0; + } + break; + case 7: + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_25 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_25.intpart_1; + ivar3 = structdump_25.intpart_0; + svar0 = structdump_25.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_26 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_26.intpart_1; + ivar3 = structdump_26.intpart_0; + svar0 = structdump_26.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_27 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_27.intpart_1; + ivar3 = structdump_27.intpart_0; + svar0 = structdump_27.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 53)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_28 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_28.intpart_1; + ivar3 = structdump_28.intpart_0; + svar0 = structdump_28.stringpart_0; + } + if (bitconfig_358 == 15) { + ivar4 = 0; + } + break; + case 8: + if ((arg0 == 9) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_29 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_29.intpart_1; + ivar3 = structdump_29.intpart_0; + svar0 = structdump_29.stringpart_0; + } + if ((arg0 == 20) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_30 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_30.intpart_1; + ivar3 = structdump_30.intpart_0; + svar0 = structdump_30.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 65)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_31 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_31.intpart_1; + ivar3 = structdump_31.intpart_0; + svar0 = structdump_31.stringpart_0; + } + if (bitconfig_1465 == 80) { + ivar4 = 0; + } + break; + case 9: + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_32 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_32.intpart_1; + ivar3 = structdump_32.intpart_0; + svar0 = structdump_32.stringpart_0; + } + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_33 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_33.intpart_1; + ivar3 = structdump_33.intpart_0; + svar0 = structdump_33.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_34 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_34.intpart_1; + ivar3 = structdump_34.intpart_0; + svar0 = structdump_34.stringpart_0; + } + if (standart_config_131 == 9) { + ivar4 = 0; + } + break; + case 10: + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 31)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_35 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_35.intpart_1; + ivar3 = structdump_35.intpart_0; + svar0 = structdump_35.stringpart_0; + } + if (standart_config_335 == 110) { + ivar4 = 0; + } + break; + case 11: + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 27)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_36 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_36.intpart_1; + ivar3 = structdump_36.intpart_0; + svar0 = structdump_36.stringpart_0; + } + if (bitconfig_2780 == 40) { + ivar4 = 0; + } + break; + case 12: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_37 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_37.intpart_1; + ivar3 = structdump_37.intpart_0; + svar0 = structdump_37.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_38 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_38.intpart_1; + ivar3 = structdump_38.intpart_0; + svar0 = structdump_38.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_39 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_39.intpart_1; + ivar3 = structdump_39.intpart_0; + svar0 = structdump_39.stringpart_0; + } + if (isBitFlagged(standart_config_299, 20)) { + ivar4 = 0; + } + break; + case 13: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_40 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_40.intpart_1; + ivar3 = structdump_40.intpart_0; + svar0 = structdump_40.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_41 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_41.intpart_1; + ivar3 = structdump_41.intpart_0; + svar0 = structdump_41.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 39)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_42 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_42.intpart_1; + ivar3 = structdump_42.intpart_0; + svar0 = structdump_42.stringpart_0; + } + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 43)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_43 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_43.intpart_1; + ivar3 = structdump_43.intpart_0; + svar0 = structdump_43.stringpart_0; + } + if (bitconfig_1560 > 69) { + ivar4 = 0; + } + break; + case 14: + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 49)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_44 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_44.intpart_1; + ivar3 = structdump_44.intpart_0; + svar0 = structdump_44.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 57)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_45 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_45.intpart_1; + ivar3 = structdump_45.intpart_0; + svar0 = structdump_45.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_46 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_46.intpart_1; + ivar3 = structdump_46.intpart_0; + svar0 = structdump_46.stringpart_0; + } + if (bitconfig_2326 > 80) { + ivar4 = 0; + } + break; + case 15: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_47 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_47.intpart_1; + ivar3 = structdump_47.intpart_0; + svar0 = structdump_47.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 59)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_48 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_48.intpart_1; + ivar3 = structdump_48.intpart_0; + svar0 = structdump_48.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_49 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_49.intpart_1; + ivar3 = structdump_49.intpart_0; + svar0 = structdump_49.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_50 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_50.intpart_1; + ivar3 = structdump_50.intpart_0; + svar0 = structdump_50.stringpart_0; + } + if (standart_config_148 == 11) { + ivar4 = 0; + } + break; + case 16: + if ((arg0 == 10) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_51 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_51.intpart_1; + ivar3 = structdump_51.intpart_0; + svar0 = structdump_51.stringpart_0; + } + if (standart_config_11 == 5) { + ivar4 = 0; + } + break; + case 17: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 22)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_52 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_52.intpart_1; + ivar3 = structdump_52.intpart_0; + svar0 = structdump_52.stringpart_0; + } + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 17)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_53 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_53.intpart_1; + ivar3 = structdump_53.intpart_0; + svar0 = structdump_53.stringpart_0; + } + if (bitconfig_822 >= 140) { + ivar4 = 0; + } + break; + case 18: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_54 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_54.intpart_1; + ivar3 = structdump_54.intpart_0; + svar0 = structdump_54.stringpart_0; + } + if ((arg0 == 9) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_55 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_55.intpart_1; + ivar3 = structdump_55.intpart_0; + svar0 = structdump_55.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_56 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_56.intpart_1; + ivar3 = structdump_56.intpart_0; + svar0 = structdump_56.stringpart_0; + } + if (standart_config_347 > 9) { + ivar4 = 0; + } + break; + case 19: + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_57 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_57.intpart_1; + ivar3 = structdump_57.intpart_0; + svar0 = structdump_57.stringpart_0; + } + if (bitconfig_961 == 60) { + ivar4 = 0; + } + break; + case 20: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_58 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_58.intpart_1; + ivar3 = structdump_58.intpart_0; + svar0 = structdump_58.stringpart_0; + } + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_59 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_59.intpart_1; + ivar3 = structdump_59.intpart_0; + svar0 = structdump_59.stringpart_0; + } + if (bitconfig_217 > 7) { + ivar4 = 0; + } + break; + case 21: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 12)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_60 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_60.intpart_1; + ivar3 = structdump_60.intpart_0; + svar0 = structdump_60.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 16)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_61 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_61.intpart_1; + ivar3 = structdump_61.intpart_0; + svar0 = structdump_61.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 33)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_62 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_62.intpart_1; + ivar3 = structdump_62.intpart_0; + svar0 = structdump_62.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 14)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_63 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_63.intpart_1; + ivar3 = structdump_63.intpart_0; + svar0 = structdump_63.stringpart_0; + } + if (bitconfig_571 > 49) { + ivar4 = 0; + } + break; + case 22: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_64 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_64.intpart_1; + ivar3 = structdump_64.intpart_0; + svar0 = structdump_64.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_65 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_65.intpart_1; + ivar3 = structdump_65.intpart_0; + svar0 = structdump_65.stringpart_0; + } + if (bitconfig_346 > 9) { + ivar4 = 0; + } + break; + case 23: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_66 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_66.intpart_1; + ivar3 = structdump_66.intpart_0; + svar0 = structdump_66.stringpart_0; + } + if (standart_config_150 >= 160) { + ivar4 = 0; + } + break; + case 24: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 49)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_67 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_67.intpart_1; + ivar3 = structdump_67.intpart_0; + svar0 = structdump_67.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 17)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_68 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_68.intpart_1; + ivar3 = structdump_68.intpart_0; + svar0 = structdump_68.stringpart_0; + } + if (bitconfig_1527 > 159) { + ivar4 = 0; + } + break; + case 25: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 15)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_69 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_69.intpart_1; + ivar3 = structdump_69.intpart_0; + svar0 = structdump_69.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_70 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_70.intpart_1; + ivar3 = structdump_70.intpart_0; + svar0 = structdump_70.stringpart_0; + } + if (standart_config_382 == 11) { + ivar4 = 0; + } + break; + case 26: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 53)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_71 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_71.intpart_1; + ivar3 = structdump_71.intpart_0; + svar0 = structdump_71.stringpart_0; + } + if ((arg0 == 10) && (getSkillActualLvl(arg0) == 53)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_72 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_72.intpart_1; + ivar3 = structdump_72.intpart_0; + svar0 = structdump_72.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_73 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_73.intpart_1; + ivar3 = structdump_73.intpart_0; + svar0 = structdump_73.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_74 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_74.intpart_1; + ivar3 = structdump_74.intpart_0; + svar0 = structdump_74.stringpart_0; + } + if (standart_config_188 == 15) { + ivar4 = 0; + } + break; + case 27: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_75 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_75.intpart_1; + ivar3 = structdump_75.intpart_0; + svar0 = structdump_75.stringpart_0; + } + if (bitconfig_34 > 9) { + ivar4 = 0; + } + break; + case 28: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_76 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_76.intpart_1; + ivar3 = structdump_76.intpart_0; + svar0 = structdump_76.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 7)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_77 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_77.intpart_1; + ivar3 = structdump_77.intpart_0; + svar0 = structdump_77.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 15)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_78 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_78.intpart_1; + ivar3 = structdump_78.intpart_0; + svar0 = structdump_78.stringpart_0; + } + if (bitconfig_1990 > 420) { + ivar4 = 0; + } + break; + case 29: + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 3)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_79 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_79.intpart_1; + ivar3 = structdump_79.intpart_0; + svar0 = structdump_79.stringpart_0; + } + if (standart_config_175 > 11) { + ivar4 = 0; + } + break; + case 30: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_80 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_80.intpart_1; + ivar3 = structdump_80.intpart_0; + svar0 = structdump_80.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_81 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_81.intpart_1; + ivar3 = structdump_81.intpart_0; + svar0 = structdump_81.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_82 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_82.intpart_1; + ivar3 = structdump_82.intpart_0; + svar0 = structdump_82.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 56)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_83 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_83.intpart_1; + ivar3 = structdump_83.intpart_0; + svar0 = structdump_83.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 52)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_84 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_84.intpart_1; + ivar3 = structdump_84.intpart_0; + svar0 = structdump_84.stringpart_0; + } + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 42)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_85 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_85.intpart_1; + ivar3 = structdump_85.intpart_0; + svar0 = structdump_85.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_86 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_86.intpart_1; + ivar3 = structdump_86.intpart_0; + svar0 = structdump_86.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_87 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_87.intpart_1; + ivar3 = structdump_87.intpart_0; + svar0 = structdump_87.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_88 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_88.intpart_1; + ivar3 = structdump_88.intpart_0; + svar0 = structdump_88.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_89 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_89.intpart_1; + ivar3 = structdump_89.intpart_0; + svar0 = structdump_89.stringpart_0; + } + if (standart_config_139 == 75) { + ivar4 = 0; + } + break; + case 31: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 31)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_90 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_90.intpart_1; + ivar3 = structdump_90.intpart_0; + svar0 = structdump_90.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 36)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_91 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_91.intpart_1; + ivar3 = structdump_91.intpart_0; + svar0 = structdump_91.stringpart_0; + } + if (standart_config_147 == 6) { + ivar4 = 0; + } + break; + case 32: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 13)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_92 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_92.intpart_1; + ivar3 = structdump_92.intpart_0; + svar0 = structdump_92.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 17)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_93 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_93.intpart_1; + ivar3 = structdump_93.intpart_0; + svar0 = structdump_93.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 13)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_94 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_94.intpart_1; + ivar3 = structdump_94.intpart_0; + svar0 = structdump_94.stringpart_0; + } + if (bitconfig_532 > 10) { + ivar4 = 0; + } + break; + case 33: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 61)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_95 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_95.intpart_1; + ivar3 = structdump_95.intpart_0; + svar0 = structdump_95.stringpart_0; + } + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_96 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_96.intpart_1; + ivar3 = structdump_96.intpart_0; + svar0 = structdump_96.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 49)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_97 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_97.intpart_1; + ivar3 = structdump_97.intpart_0; + svar0 = structdump_97.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 5)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_98 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_98.intpart_1; + ivar3 = structdump_98.intpart_0; + svar0 = structdump_98.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 65)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_99 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_99.intpart_1; + ivar3 = structdump_99.intpart_0; + svar0 = structdump_99.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 60)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_100 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_100.intpart_1; + ivar3 = structdump_100.intpart_0; + svar0 = structdump_100.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 55)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_101 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_101.intpart_1; + ivar3 = structdump_101.intpart_0; + svar0 = structdump_101.stringpart_0; + } + if (bitconfig_2448 == 190) { + ivar4 = 0; + } + break; + case 34: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_102 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_102.intpart_1; + ivar3 = structdump_102.intpart_0; + svar0 = structdump_102.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 7)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_103 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_103.intpart_1; + ivar3 = structdump_103.intpart_0; + svar0 = structdump_103.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_104 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_104.intpart_1; + ivar3 = structdump_104.intpart_0; + svar0 = structdump_104.stringpart_0; + } + if (bitconfig_1383 > 3) { + ivar4 = 0; + } + break; + case 35: + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_105 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_105.intpart_1; + ivar3 = structdump_105.intpart_0; + svar0 = structdump_105.stringpart_0; + } + if (bitconfig_334 > 27) { + ivar4 = 0; + } + break; + case 36: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_106 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_106.intpart_1; + ivar3 = structdump_106.intpart_0; + svar0 = structdump_106.stringpart_0; + } + if (bitconfig_260 > 69) { + ivar4 = 0; + } + break; + case 37: + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 60)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_107 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_107.intpart_1; + ivar3 = structdump_107.intpart_0; + svar0 = structdump_107.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_108 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_108.intpart_1; + ivar3 = structdump_108.intpart_0; + svar0 = structdump_108.stringpart_0; + } + if (standart_config_517 > 7) { + ivar4 = 0; + } + break; + case 38: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_109 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_109.intpart_1; + ivar3 = structdump_109.intpart_0; + svar0 = structdump_109.stringpart_0; + } + if (standart_config_387 > 100) { + ivar4 = 0; + } + break; + case 39: + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 29)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_110 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_110.intpart_1; + ivar3 = structdump_110.intpart_0; + svar0 = structdump_110.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_111 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_111.intpart_1; + ivar3 = structdump_111.intpart_0; + svar0 = structdump_111.stringpart_0; + } + if (bitconfig_2790 > 310) { + ivar4 = 0; + } + break; + case 40: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 18)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_112 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_112.intpart_1; + ivar3 = structdump_112.intpart_0; + svar0 = structdump_112.stringpart_0; + } + if (standart_config_307 == 110) { + ivar4 = 0; + } + break; + case 41: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 36)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_113 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_113.intpart_1; + ivar3 = structdump_113.intpart_0; + svar0 = structdump_113.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_114 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_114.intpart_1; + ivar3 = structdump_114.intpart_0; + svar0 = structdump_114.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 18)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_115 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_115.intpart_1; + ivar3 = structdump_115.intpart_0; + svar0 = structdump_115.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_116 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_116.intpart_1; + ivar3 = structdump_116.intpart_0; + svar0 = structdump_116.stringpart_0; + } + if (standart_config_416 > 275) { + ivar4 = 0; + } + break; + case 42: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 56)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_117 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_117.intpart_1; + ivar3 = structdump_117.intpart_0; + svar0 = structdump_117.stringpart_0; + } + if (standart_config_328 > 14) { + ivar4 = 0; + } + break; + case 43: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_118 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_118.intpart_1; + ivar3 = structdump_118.intpart_0; + svar0 = structdump_118.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_119 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_119.intpart_1; + ivar3 = structdump_119.intpart_0; + svar0 = structdump_119.stringpart_0; + } + if (bitconfig_2140 > 20) { + ivar4 = 0; + } + break; + case 44: + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 31)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_120 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_120.intpart_1; + ivar3 = structdump_120.intpart_0; + svar0 = structdump_120.stringpart_0; + } + if (standart_config_76 == 6) { + ivar4 = 0; + } + break; + case 45: + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_121 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_121.intpart_1; + ivar3 = structdump_121.intpart_0; + svar0 = structdump_121.stringpart_0; + } + if (standart_config_159 >= 12) { + ivar4 = 0; + } + break; + case 46: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_122 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_122.intpart_1; + ivar3 = structdump_122.intpart_0; + svar0 = structdump_122.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 15)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_123 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_123.intpart_1; + ivar3 = structdump_123.intpart_0; + svar0 = structdump_123.stringpart_0; + } + if (standart_config_339 == 85) { + ivar4 = 0; + } + break; + case 47: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_124 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_124.intpart_1; + ivar3 = structdump_124.intpart_0; + svar0 = structdump_124.stringpart_0; + } + if (bitconfig_1372 > 124) { + ivar4 = 0; + } + break; + case 48: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 32)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_125 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_125.intpart_1; + ivar3 = structdump_125.intpart_0; + svar0 = structdump_125.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_126 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_126.intpart_1; + ivar3 = structdump_126.intpart_0; + svar0 = structdump_126.stringpart_0; + } + if (standart_config_116 > 14) { + ivar4 = 0; + } + break; + case 49: + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 33)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_127 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_127.intpart_1; + ivar3 = structdump_127.intpart_0; + svar0 = structdump_127.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 37)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_128 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_128.intpart_1; + ivar3 = structdump_128.intpart_0; + svar0 = structdump_128.stringpart_0; + } + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 37)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_129 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_129.intpart_1; + ivar3 = structdump_129.intpart_0; + svar0 = structdump_129.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 37)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_130 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_130.intpart_1; + ivar3 = structdump_130.intpart_0; + svar0 = structdump_130.stringpart_0; + } + if (bitconfig_1444 > 59) { + ivar4 = 0; + } + break; + case 50: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 62)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_131 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_131.intpart_1; + ivar3 = structdump_131.intpart_0; + svar0 = structdump_131.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_132 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_132.intpart_1; + ivar3 = structdump_132.intpart_0; + svar0 = structdump_132.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 42)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_133 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_133.intpart_1; + ivar3 = structdump_133.intpart_0; + svar0 = structdump_133.stringpart_0; + } + if ((arg0 == 10) && (getSkillActualLvl(arg0) == 62)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_134 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_134.intpart_1; + ivar3 = structdump_134.intpart_0; + svar0 = structdump_134.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 66)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_135 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_135.intpart_1; + ivar3 = structdump_135.intpart_0; + svar0 = structdump_135.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_136 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_136.intpart_1; + ivar3 = structdump_136.intpart_0; + svar0 = structdump_136.stringpart_0; + } + if (bitconfig_2098 >= 200) { + ivar4 = 0; + } + break; + case 51: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 15)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_137 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_137.intpart_1; + ivar3 = structdump_137.intpart_0; + svar0 = structdump_137.stringpart_0; + } + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_138 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_138.intpart_1; + ivar3 = structdump_138.intpart_0; + svar0 = structdump_138.stringpart_0; + } + if ((arg0 == 10) && (getSkillActualLvl(arg0) == 5)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_139 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_139.intpart_1; + ivar3 = structdump_139.intpart_0; + svar0 = structdump_139.stringpart_0; + } + if (standart_config_320 == 6) { + ivar4 = 0; + } + break; + case 52: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_140 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_140.intpart_1; + ivar3 = structdump_140.intpart_0; + svar0 = structdump_140.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 49)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_141 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_141.intpart_1; + ivar3 = structdump_141.intpart_0; + svar0 = structdump_141.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_142 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_142.intpart_1; + ivar3 = structdump_142.intpart_0; + svar0 = structdump_142.stringpart_0; + } + if (bitconfig_451 > 1) { + ivar4 = 0; + } + break; + case 53: + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_143 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_143.intpart_1; + ivar3 = structdump_143.intpart_0; + svar0 = structdump_143.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 42)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_144 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_144.intpart_1; + ivar3 = structdump_144.intpart_0; + svar0 = structdump_144.stringpart_0; + } + if ((standart_config_26 == 80) || (standart_config_26 == 90)) { + ivar4 = 0; + } + break; + case 54: + if ((arg0 == 9) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_145 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_145.intpart_1; + ivar3 = structdump_145.intpart_0; + svar0 = structdump_145.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_146 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_146.intpart_1; + ivar3 = structdump_146.intpart_0; + svar0 = structdump_146.stringpart_0; + } + if (standart_config_197 == 30) { + ivar4 = 0; + } + break; + case 55: + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 21)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_147 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_147.intpart_1; + ivar3 = structdump_147.intpart_0; + svar0 = structdump_147.stringpart_0; + } + if (standart_config_200 == 5) { + ivar4 = 0; + } + break; + case 56: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 28)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_148 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_148.intpart_1; + ivar3 = structdump_148.intpart_0; + svar0 = structdump_148.stringpart_0; + } + if (standart_config_385 > 44) { + ivar4 = 0; + } + break; + case 57: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 15)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_149 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_149.intpart_1; + ivar3 = structdump_149.intpart_0; + svar0 = structdump_149.stringpart_0; + } + if (standart_config_317 == 50) { + ivar4 = 0; + } + break; + case 58: + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_150 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_150.intpart_1; + ivar3 = structdump_150.intpart_0; + svar0 = structdump_150.stringpart_0; + } + if (standart_config_161 == 10) { + ivar4 = 0; + } + break; + case 59: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_151 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_151.intpart_1; + ivar3 = structdump_151.intpart_0; + svar0 = structdump_151.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 14)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_152 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_152.intpart_1; + ivar3 = structdump_152.intpart_0; + svar0 = structdump_152.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 14)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_153 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_153.intpart_1; + ivar3 = structdump_153.intpart_0; + svar0 = structdump_153.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_154 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_154.intpart_1; + ivar3 = structdump_154.intpart_0; + svar0 = structdump_154.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 15)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_155 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_155.intpart_1; + ivar3 = structdump_155.intpart_0; + svar0 = structdump_155.stringpart_0; + } + if (standart_config_212 > 12) { + ivar4 = 0; + } + break; + case 60: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_156 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_156.intpart_1; + ivar3 = structdump_156.intpart_0; + svar0 = structdump_156.stringpart_0; + } + if (standart_config_5 == 10) { + ivar4 = 0; + } + break; + case 61: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 5)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_157 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_157.intpart_1; + ivar3 = structdump_157.intpart_0; + svar0 = structdump_157.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 46)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_158 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_158.intpart_1; + ivar3 = structdump_158.intpart_0; + svar0 = structdump_158.stringpart_0; + } + if (bitconfig_2497 == 60) { + ivar4 = 0; + } + break; + case 62: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 23)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_159 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_159.intpart_1; + ivar3 = structdump_159.intpart_0; + svar0 = structdump_159.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 23)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_160 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_160.intpart_1; + ivar3 = structdump_160.intpart_0; + svar0 = structdump_160.stringpart_0; + } + if (bitconfig_2258 == 13) { + ivar4 = 0; + } + break; + case 63: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 19)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_161 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_161.intpart_1; + ivar3 = structdump_161.intpart_0; + svar0 = structdump_161.stringpart_0; + } + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_162 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_162.intpart_1; + ivar3 = structdump_162.intpart_0; + svar0 = structdump_162.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 18)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_163 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_163.intpart_1; + ivar3 = structdump_163.intpart_0; + svar0 = structdump_163.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_164 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_164.intpart_1; + ivar3 = structdump_164.intpart_0; + svar0 = structdump_164.stringpart_0; + } + if (bitconfig_3185 == 240) { + ivar4 = 0; + } + break; + case 64: + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_165 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_165.intpart_1; + ivar3 = structdump_165.intpart_0; + svar0 = structdump_165.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_166 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_166.intpart_1; + ivar3 = structdump_166.intpart_0; + svar0 = structdump_166.stringpart_0; + } + if (bitconfig_2639 == 11) { + ivar4 = 0; + } + break; + case 65: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 36)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_167 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_167.intpart_1; + ivar3 = structdump_167.intpart_0; + svar0 = structdump_167.stringpart_0; + } + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_168 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_168.intpart_1; + ivar3 = structdump_168.intpart_0; + svar0 = structdump_168.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_169 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_169.intpart_1; + ivar3 = structdump_169.intpart_0; + svar0 = structdump_169.stringpart_0; + } + if (bitconfig_2866 == 200) { + ivar4 = 0; + } + break; + case 66: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_170 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_170.intpart_1; + ivar3 = structdump_170.intpart_0; + svar0 = structdump_170.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 16)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_171 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_171.intpart_1; + ivar3 = structdump_171.intpart_0; + svar0 = structdump_171.stringpart_0; + } + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_172 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_172.intpart_1; + ivar3 = structdump_172.intpart_0; + svar0 = structdump_172.stringpart_0; + } + if (standart_config_980 > 129) { + ivar4 = 0; + } + break; + case 67: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_173 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_173.intpart_1; + ivar3 = structdump_173.intpart_0; + svar0 = structdump_173.stringpart_0; + } + if ((arg0 == 20) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_174 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_174.intpart_1; + ivar3 = structdump_174.intpart_0; + svar0 = structdump_174.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_175 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_175.intpart_1; + ivar3 = structdump_175.intpart_0; + svar0 = structdump_175.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_176 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_176.intpart_1; + ivar3 = structdump_176.intpart_0; + svar0 = structdump_176.stringpart_0; + } + if (bitconfig_2610 >= 14) { + ivar4 = 0; + } + break; + case 68: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_177 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_177.intpart_1; + ivar3 = structdump_177.intpart_0; + svar0 = structdump_177.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 34)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_178 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_178.intpart_1; + ivar3 = structdump_178.intpart_0; + svar0 = structdump_178.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_179 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_179.intpart_1; + ivar3 = structdump_179.intpart_0; + svar0 = structdump_179.stringpart_0; + } + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_180 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_180.intpart_1; + ivar3 = structdump_180.intpart_0; + svar0 = structdump_180.stringpart_0; + } + if (bitconfig_3293 == 135) { + ivar4 = 0; + } + break; + case 69: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_181 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_181.intpart_1; + ivar3 = structdump_181.intpart_0; + svar0 = structdump_181.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_182 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_182.intpart_1; + ivar3 = structdump_182.intpart_0; + svar0 = structdump_182.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 46)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_183 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_183.intpart_1; + ivar3 = structdump_183.intpart_0; + svar0 = structdump_183.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 56)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_184 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_184.intpart_1; + ivar3 = structdump_184.intpart_0; + svar0 = structdump_184.stringpart_0; + } + if (bitconfig_3311 == 340) { + ivar4 = 0; + } + break; + case 70: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_185 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_185.intpart_1; + ivar3 = structdump_185.intpart_0; + svar0 = structdump_185.stringpart_0; + } + if (bitconfig_3337 == 18) { + ivar4 = 0; + } + break; + case 71: + if ((arg0 == 20) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_186 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_186.intpart_1; + ivar3 = structdump_186.intpart_0; + svar0 = structdump_186.stringpart_0; + } + if (bitconfig_3523 > 149) { + ivar4 = 0; + } + break; + case 72: + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_187 = script_1025(stack_dump0, stack_dump1, stack_dump2); + stack_dump0 = structdump_187.intpart_0; + stack_dump1 = structdump_187.intpart_1; + structdump_187.stringpart_0; + stack_dump0 = stack_dump0; + stack_dump1; + stack_dump0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_188 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_188.intpart_1; + ivar3 = structdump_188.intpart_0; + svar0 = structdump_188.stringpart_0; + } + if (bitconfig_3534 == 80) { + ivar4 = 0; + } + break; + case 73: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 59)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_189 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_189.intpart_1; + ivar3 = structdump_189.intpart_0; + svar0 = structdump_189.stringpart_0; + } + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_190 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_190.intpart_1; + ivar3 = structdump_190.intpart_0; + svar0 = structdump_190.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 52)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_191 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_191.intpart_1; + ivar3 = structdump_191.intpart_0; + svar0 = structdump_191.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 58)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_192 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_192.intpart_1; + ivar3 = structdump_192.intpart_0; + svar0 = structdump_192.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 71)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_193 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_193.intpart_1; + ivar3 = structdump_193.intpart_0; + svar0 = structdump_193.stringpart_0; + } + if (bitconfig_2783 == 60) { + ivar4 = 0; + } + break; + case 74: + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_194 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_194.intpart_1; + ivar3 = structdump_194.intpart_0; + svar0 = structdump_194.stringpart_0; + } + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 65)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_195 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_195.intpart_1; + ivar3 = structdump_195.intpart_0; + svar0 = structdump_195.stringpart_0; + } + if (bitconfig_3888 == 90) { + ivar4 = 0; + } + break; + case 75: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_196 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_196.intpart_1; + ivar3 = structdump_196.intpart_0; + svar0 = structdump_196.stringpart_0; + } + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 47)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_197 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_197.intpart_1; + ivar3 = structdump_197.intpart_0; + svar0 = structdump_197.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 56)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_198 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_198.intpart_1; + ivar3 = structdump_198.intpart_0; + svar0 = structdump_198.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 56)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_199 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_199.intpart_1; + ivar3 = structdump_199.intpart_0; + svar0 = structdump_199.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 60)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_200 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_200.intpart_1; + ivar3 = structdump_200.intpart_0; + svar0 = structdump_200.stringpart_0; + } + if (bitconfig_3954 == 200) { + ivar4 = 0; + } + break; + case 76: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 55)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_201 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_201.intpart_1; + ivar3 = structdump_201.intpart_0; + svar0 = structdump_201.stringpart_0; + } + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 53)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_202 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_202.intpart_1; + ivar3 = structdump_202.intpart_0; + svar0 = structdump_202.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 59)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_203 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_203.intpart_1; + ivar3 = structdump_203.intpart_0; + svar0 = structdump_203.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 72)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_204 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_204.intpart_1; + ivar3 = structdump_204.intpart_0; + svar0 = structdump_204.stringpart_0; + } + if (bitconfig_4055 == 65) { + ivar4 = 0; + } + break; + case 77: + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 30)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_205 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_205.intpart_1; + ivar3 = structdump_205.intpart_0; + svar0 = structdump_205.stringpart_0; + } + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 36)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_206 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_206.intpart_1; + ivar3 = structdump_206.intpart_0; + svar0 = structdump_206.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 36)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_207 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_207.intpart_1; + ivar3 = structdump_207.intpart_0; + svar0 = structdump_207.stringpart_0; + } + if ((arg0 == 10) && (getSkillActualLvl(arg0) == 36)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_208 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_208.intpart_1; + ivar3 = structdump_208.intpart_0; + svar0 = structdump_208.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 37)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_209 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_209.intpart_1; + ivar3 = structdump_209.intpart_0; + svar0 = structdump_209.stringpart_0; + } + if (bitconfig_4105 == 18) { + ivar4 = 0; + } + break; + case 78: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_210 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_210.intpart_1; + ivar3 = structdump_210.intpart_0; + svar0 = structdump_210.stringpart_0; + } + if (((boolean)bitconfig_1850)) { + ivar4 = 0; + } + break; + case 79: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 31)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_211 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_211.intpart_1; + ivar3 = structdump_211.intpart_0; + svar0 = structdump_211.stringpart_0; + } + if (bitconfig_1895 == 110) { + ivar4 = 0; + } + break; + case 80: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_212 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_212.intpart_1; + ivar3 = structdump_212.intpart_0; + svar0 = structdump_212.stringpart_0; + } + if (bitconfig_1896 == 5) { + ivar4 = 0; + } + break; + case 81: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_213 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_213.intpart_1; + ivar3 = structdump_213.intpart_0; + svar0 = structdump_213.stringpart_0; + } + if (bitconfig_1878 == 5) { + ivar4 = 0; + } + break; + case 82: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 41)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_214 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_214.intpart_1; + ivar3 = structdump_214.intpart_0; + svar0 = structdump_214.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_215 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_215.intpart_1; + ivar3 = structdump_215.intpart_0; + svar0 = structdump_215.stringpart_0; + } + if (bitconfig_1904 == 170) { + ivar4 = 0; + } + break; + case 83: + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_216 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_216.intpart_1; + ivar3 = structdump_216.intpart_0; + svar0 = structdump_216.stringpart_0; + } + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 48)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_217 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_217.intpart_1; + ivar3 = structdump_217.intpart_0; + svar0 = structdump_217.stringpart_0; + } + if (bitconfig_1914 == 50) { + ivar4 = 0; + } + break; + case 84: + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 48)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_218 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_218.intpart_1; + ivar3 = structdump_218.intpart_0; + svar0 = structdump_218.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 51)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_219 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_219.intpart_1; + ivar3 = structdump_219.intpart_0; + svar0 = structdump_219.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 58)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_220 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_220.intpart_1; + ivar3 = structdump_220.intpart_0; + svar0 = structdump_220.stringpart_0; + } + if (bitconfig_4321 == 200) { + ivar4 = 0; + } + break; + case 85: + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 46)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_221 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_221.intpart_1; + ivar3 = structdump_221.intpart_0; + svar0 = structdump_221.stringpart_0; + } + if (bitconfig_4505 == 100) { + ivar4 = 0; + } + break; + case 86: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 44)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_222 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_222.intpart_1; + ivar3 = structdump_222.intpart_0; + svar0 = structdump_222.stringpart_0; + } + if ((arg0 == 9) && (getSkillActualLvl(arg0) == 42)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_223 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_223.intpart_1; + ivar3 = structdump_223.intpart_0; + svar0 = structdump_223.stringpart_0; + } + if (bitconfig_4396 == 60) { + ivar4 = 0; + } + break; + case 87: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_224 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_224.intpart_1; + ivar3 = structdump_224.intpart_0; + svar0 = structdump_224.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 21)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_225 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_225.intpart_1; + ivar3 = structdump_225.intpart_0; + svar0 = structdump_225.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 60)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_226 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_226.intpart_1; + ivar3 = structdump_226.intpart_0; + svar0 = structdump_226.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 60)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_227 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_227.intpart_1; + ivar3 = structdump_227.intpart_0; + svar0 = structdump_227.stringpart_0; + } + if (bitconfig_4230 == 700) { + ivar4 = 0; + } + break; + case 88: + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 42)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_228 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_228.intpart_1; + ivar3 = structdump_228.intpart_0; + svar0 = structdump_228.stringpart_0; + } + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_229 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_229.intpart_1; + ivar3 = structdump_229.intpart_0; + svar0 = structdump_229.stringpart_0; + } + if ((arg0 == 10) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_230 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_230.intpart_1; + ivar3 = structdump_230.intpart_0; + svar0 = structdump_230.stringpart_0; + } + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 47)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_231 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_231.intpart_1; + ivar3 = structdump_231.intpart_0; + svar0 = structdump_231.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 42)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_232 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_232.intpart_1; + ivar3 = structdump_232.intpart_0; + svar0 = structdump_232.stringpart_0; + } + if (standart_config_600 > 18) { + ivar4 = 0; + } + break; + case 89: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_233 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_233.intpart_1; + ivar3 = structdump_233.intpart_0; + svar0 = structdump_233.stringpart_0; + } + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 29)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_234 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_234.intpart_1; + ivar3 = structdump_234.intpart_0; + svar0 = structdump_234.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 47)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_235 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_235.intpart_1; + ivar3 = structdump_235.intpart_0; + svar0 = structdump_235.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 49)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_236 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_236.intpart_1; + ivar3 = structdump_236.intpart_0; + svar0 = structdump_236.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_237 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_237.intpart_1; + ivar3 = structdump_237.intpart_0; + svar0 = structdump_237.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 31)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_238 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_238.intpart_1; + ivar3 = structdump_238.intpart_0; + svar0 = structdump_238.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_239 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_239.intpart_1; + ivar3 = structdump_239.intpart_0; + svar0 = structdump_239.stringpart_0; + } + if (bitconfig_4569 == 500) { + ivar4 = 0; + } + break; + case 90: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_240 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_240.intpart_1; + ivar3 = structdump_240.intpart_0; + svar0 = structdump_240.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 41)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_241 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_241.intpart_1; + ivar3 = structdump_241.intpart_0; + svar0 = structdump_241.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 43)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_242 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_242.intpart_1; + ivar3 = structdump_242.intpart_0; + svar0 = structdump_242.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_243 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_243.intpart_1; + ivar3 = structdump_243.intpart_0; + svar0 = structdump_243.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_244 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_244.intpart_1; + ivar3 = structdump_244.intpart_0; + svar0 = structdump_244.stringpart_0; + } + if (bitconfig_4700 == 63) { + ivar4 = 0; + } + break; + case 91: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_245 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_245.intpart_1; + ivar3 = structdump_245.intpart_0; + svar0 = structdump_245.stringpart_0; + } + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_246 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_246.intpart_1; + ivar3 = structdump_246.intpart_0; + svar0 = structdump_246.stringpart_0; + } + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_247 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_247.intpart_1; + ivar3 = structdump_247.intpart_0; + svar0 = structdump_247.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 11)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_248 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_248.intpart_1; + ivar3 = structdump_248.intpart_0; + svar0 = structdump_248.stringpart_0; + } + if (bitconfig_4684 == 150) { + ivar4 = 0; + } + break; + case 92: + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_249 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_249.intpart_1; + ivar3 = structdump_249.intpart_0; + svar0 = structdump_249.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_250 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_250.intpart_1; + ivar3 = structdump_250.intpart_0; + svar0 = structdump_250.stringpart_0; + } + if (bitconfig_4764 == 250) { + ivar4 = 0; + } + break; + case 93: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 60)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_251 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_251.intpart_1; + ivar3 = structdump_251.intpart_0; + svar0 = structdump_251.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 63)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_252 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_252.intpart_1; + ivar3 = structdump_252.intpart_0; + svar0 = structdump_252.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 66)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_253 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_253.intpart_1; + ivar3 = structdump_253.intpart_0; + svar0 = structdump_253.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 69)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_254 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_254.intpart_1; + ivar3 = structdump_254.intpart_0; + svar0 = structdump_254.stringpart_0; + } + if (bitconfig_4797 == 100) { + ivar4 = 0; + } + break; + case 94: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_255 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_255.intpart_1; + ivar3 = structdump_255.intpart_0; + svar0 = structdump_255.stringpart_0; + } + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 26)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_256 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_256.intpart_1; + ivar3 = structdump_256.intpart_0; + svar0 = structdump_256.stringpart_0; + } + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_257 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_257.intpart_1; + ivar3 = structdump_257.intpart_0; + svar0 = structdump_257.stringpart_0; + } + if ((arg0 == 23) && (getSkillActualLvl(arg0) == 19)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_258 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_258.intpart_1; + ivar3 = structdump_258.intpart_0; + svar0 = structdump_258.stringpart_0; + } + if (bitconfig_5032 == 80) { + ivar4 = 0; + } + break; + case 95: + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 43)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_259 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_259.intpart_1; + ivar3 = structdump_259.intpart_0; + svar0 = structdump_259.stringpart_0; + } + if (bitconfig_5133 >= 90) { + ivar4 = 0; + } + break; + case 96: + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 47)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_260 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_260.intpart_1; + ivar3 = structdump_260.intpart_0; + svar0 = structdump_260.stringpart_0; + } + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_261 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_261.intpart_1; + ivar3 = structdump_261.intpart_0; + svar0 = structdump_261.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_262 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_262.intpart_1; + ivar3 = structdump_262.intpart_0; + svar0 = structdump_262.stringpart_0; + } + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 55)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_263 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_263.intpart_1; + ivar3 = structdump_263.intpart_0; + svar0 = structdump_263.stringpart_0; + } + if ((arg0 == 23) && (getSkillActualLvl(arg0) == 23)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_264 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_264.intpart_1; + ivar3 = structdump_264.intpart_0; + svar0 = structdump_264.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 37)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_265 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_265.intpart_1; + ivar3 = structdump_265.intpart_0; + svar0 = structdump_265.stringpart_0; + } + if (bitconfig_5331 == 35) { + ivar4 = 0; + } + break; + case 97: + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 51)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_266 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_266.intpart_1; + ivar3 = structdump_266.intpart_0; + svar0 = structdump_266.stringpart_0; + } + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 51)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_267 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_267.intpart_1; + ivar3 = structdump_267.intpart_0; + svar0 = structdump_267.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 54)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_268 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_268.intpart_1; + ivar3 = structdump_268.intpart_0; + svar0 = structdump_268.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 59)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_269 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_269.intpart_1; + ivar3 = structdump_269.intpart_0; + svar0 = structdump_269.stringpart_0; + } + if (bitconfig_5387 >= 250) { + ivar4 = 0; + } + break; + case 98: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 65)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_270 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_270.intpart_1; + ivar3 = structdump_270.intpart_0; + svar0 = structdump_270.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 75)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_271 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_271.intpart_1; + ivar3 = structdump_271.intpart_0; + svar0 = structdump_271.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 65)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_272 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_272.intpart_1; + ivar3 = structdump_272.intpart_0; + svar0 = structdump_272.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 60)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_273 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_273.intpart_1; + ivar3 = structdump_273.intpart_0; + svar0 = structdump_273.stringpart_0; + } + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 55)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_274 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_274.intpart_1; + ivar3 = structdump_274.intpart_0; + svar0 = structdump_274.stringpart_0; + } + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 65)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_275 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_275.intpart_1; + ivar3 = structdump_275.intpart_0; + svar0 = structdump_275.stringpart_0; + } + if ((arg0 == 23) && (getSkillActualLvl(arg0) == 23)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_276 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_276.intpart_1; + ivar3 = structdump_276.intpart_0; + svar0 = structdump_276.stringpart_0; + } + if (((boolean)script_395()) && ((arg0 == 2) || ((boolean)arg0))) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_277 = script_2042(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_277.intpart_1; + ivar3 = structdump_277.intpart_0; + svar0 = structdump_277.stringpart_0; + } + if (bitconfig_5491 >= 910) { + ivar4 = 0; + } + break; + case 99: + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 55)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_278 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_278.intpart_1; + ivar3 = structdump_278.intpart_0; + svar0 = structdump_278.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 52)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_279 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_279.intpart_1; + ivar3 = structdump_279.intpart_0; + svar0 = structdump_279.stringpart_0; + } + if ((arg0 == 9) && (getSkillActualLvl(arg0) == 53)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_280 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_280.intpart_1; + ivar3 = structdump_280.intpart_0; + svar0 = structdump_280.stringpart_0; + } + if (bitconfig_5761 == 30) { + ivar4 = 0; + } + break; + case 100: + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 46)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_281 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_281.intpart_1; + ivar3 = structdump_281.intpart_0; + svar0 = structdump_281.stringpart_0; + } + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 46)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_282 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_282.intpart_1; + ivar3 = structdump_282.intpart_0; + svar0 = structdump_282.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 46)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_283 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_283.intpart_1; + ivar3 = structdump_283.intpart_0; + svar0 = structdump_283.stringpart_0; + } + if (bitconfig_1938 >= 110) { + ivar4 = 0; + } + break; + case 101: + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 41)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_284 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_284.intpart_1; + ivar3 = structdump_284.intpart_0; + svar0 = structdump_284.stringpart_0; + } + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_285 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_285.intpart_1; + ivar3 = structdump_285.intpart_0; + svar0 = structdump_285.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 57)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_286 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_286.intpart_1; + ivar3 = structdump_286.intpart_0; + svar0 = structdump_286.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 43)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_287 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_287.intpart_1; + ivar3 = structdump_287.intpart_0; + svar0 = structdump_287.stringpart_0; + } + if (bitconfig_6001 >= 45) { + ivar4 = 0; + } + break; + case 102: + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 8)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_288 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_288.intpart_1; + ivar3 = structdump_288.intpart_0; + svar0 = structdump_288.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_289 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_289.intpart_1; + ivar3 = structdump_289.intpart_0; + svar0 = structdump_289.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 6)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_290 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_290.intpart_1; + ivar3 = structdump_290.intpart_0; + svar0 = structdump_290.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_291 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_291.intpart_1; + ivar3 = structdump_291.intpart_0; + svar0 = structdump_291.stringpart_0; + } + if (bitconfig_6048 == 250) { + ivar4 = 0; + } + break; + case 103: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_292 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_292.intpart_1; + ivar3 = structdump_292.intpart_0; + svar0 = structdump_292.stringpart_0; + } + if ((arg0 == 7) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_293 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_293.intpart_1; + ivar3 = structdump_293.intpart_0; + svar0 = structdump_293.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_294 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_294.intpart_1; + ivar3 = structdump_294.intpart_0; + svar0 = structdump_294.stringpart_0; + } + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_295 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_295.intpart_1; + ivar3 = structdump_295.intpart_0; + svar0 = structdump_295.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_296 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_296.intpart_1; + ivar3 = structdump_296.intpart_0; + svar0 = structdump_296.stringpart_0; + } + if (bitconfig_6112 == 60) { + ivar4 = 0; + } + break; + case 104: + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 38)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_297 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_297.intpart_1; + ivar3 = structdump_297.intpart_0; + svar0 = structdump_297.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_298 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_298.intpart_1; + ivar3 = structdump_298.intpart_0; + svar0 = structdump_298.stringpart_0; + } + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_299 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_299.intpart_1; + ivar3 = structdump_299.intpart_0; + svar0 = structdump_299.stringpart_0; + } + if (bitconfig_6180 == 140) { + ivar4 = 0; + } + break; + case 105: + if ((arg0 == 23) && (getSkillActualLvl(arg0) == 41)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_300 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_300.intpart_1; + ivar3 = structdump_300.intpart_0; + svar0 = structdump_300.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 64)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_301 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_301.intpart_1; + ivar3 = structdump_301.intpart_0; + svar0 = structdump_301.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 37)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_302 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_302.intpart_1; + ivar3 = structdump_302.intpart_0; + svar0 = structdump_302.stringpart_0; + } + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 61)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_303 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_303.intpart_1; + ivar3 = structdump_303.intpart_0; + svar0 = structdump_303.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 64)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_304 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_304.intpart_1; + ivar3 = structdump_304.intpart_0; + svar0 = structdump_304.stringpart_0; + } + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 64)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_305 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_305.intpart_1; + ivar3 = structdump_305.intpart_0; + svar0 = structdump_305.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 66)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_306 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_306.intpart_1; + ivar3 = structdump_306.intpart_0; + svar0 = structdump_306.stringpart_0; + } + break; + case 106: + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 61)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_307 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_307.intpart_1; + ivar3 = structdump_307.intpart_0; + svar0 = structdump_307.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 61)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_308 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_308.intpart_1; + ivar3 = structdump_308.intpart_0; + svar0 = structdump_308.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 69)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_309 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_309.intpart_1; + ivar3 = structdump_309.intpart_0; + svar0 = structdump_309.stringpart_0; + } + if (bitconfig_6471 == 90) { + ivar4 = 0; + } + break; + case 107: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 69)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_310 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_310.intpart_1; + ivar3 = structdump_310.intpart_0; + svar0 = structdump_310.stringpart_0; + } + if ((arg0 == 9) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_311 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_311.intpart_1; + ivar3 = structdump_311.intpart_0; + svar0 = structdump_311.stringpart_0; + } + if ((arg0 == 4) && (getSkillActualLvl(arg0) == 75)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_312 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_312.intpart_1; + ivar3 = structdump_312.intpart_0; + svar0 = structdump_312.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 75)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_313 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_313.intpart_1; + ivar3 = structdump_313.intpart_0; + svar0 = structdump_313.stringpart_0; + } + if (bitconfig_6553 == 46) { + ivar4 = 0; + } + break; + case 108: + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_314 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_314.intpart_1; + ivar3 = structdump_314.intpart_0; + svar0 = structdump_314.stringpart_0; + } + if (bitconfig_6775 == 90) { + ivar4 = 0; + } + break; + case 109: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 75)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_315 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_315.intpart_1; + ivar3 = structdump_315.intpart_0; + svar0 = structdump_315.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 75)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_316 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_316.intpart_1; + ivar3 = structdump_316.intpart_0; + svar0 = structdump_316.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 65)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_317 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_317.intpart_1; + ivar3 = structdump_317.intpart_0; + svar0 = structdump_317.stringpart_0; + } + if (bitconfig_6883 >= 147) { + ivar4 = 0; + } + break; + case 110: + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 75)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_318 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_318.intpart_1; + ivar3 = structdump_318.intpart_0; + svar0 = structdump_318.stringpart_0; + } + if ((arg0 == 5) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_319 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_319.intpart_1; + ivar3 = structdump_319.intpart_0; + svar0 = structdump_319.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 66)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_320 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_320.intpart_1; + ivar3 = structdump_320.intpart_0; + svar0 = structdump_320.stringpart_0; + } + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 65)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_321 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_321.intpart_1; + ivar3 = structdump_321.intpart_0; + svar0 = structdump_321.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 60)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_322 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_322.intpart_1; + ivar3 = structdump_322.intpart_0; + svar0 = structdump_322.stringpart_0; + } + if (bitconfig_6962 == 12) { + ivar4 = 0; + } + break; + case 111: + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 27)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_323 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_323.intpart_1; + ivar3 = structdump_323.intpart_0; + svar0 = structdump_323.stringpart_0; + } + if ((arg0 == 20) && (getSkillActualLvl(arg0) == 20)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_324 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_324.intpart_1; + ivar3 = structdump_324.intpart_0; + svar0 = structdump_324.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 25)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_325 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_325.intpart_1; + ivar3 = structdump_325.intpart_0; + svar0 = structdump_325.stringpart_0; + } + if (bitconfig_7050 == 35) { + ivar4 = 0; + } + break; + case 112: + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 24)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_326 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_326.intpart_1; + ivar3 = structdump_326.intpart_0; + svar0 = structdump_326.stringpart_0; + } + if (bitconfig_7794 == 15) { + ivar4 = 0; + } + break; + case 113: + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 41)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_327 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_327.intpart_1; + ivar3 = structdump_327.intpart_0; + svar0 = structdump_327.stringpart_0; + } + if (bitconfig_7795 == 2) { + ivar4 = 0; + } + break; + case 114: + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 62)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_328 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_328.intpart_1; + ivar3 = structdump_328.intpart_0; + svar0 = structdump_328.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 46)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_329 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_329.intpart_1; + ivar3 = structdump_329.intpart_0; + svar0 = structdump_329.stringpart_0; + } + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_330 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_330.intpart_1; + ivar3 = structdump_330.intpart_0; + svar0 = structdump_330.stringpart_0; + } + if (bitconfig_7796 == 30) { + ivar4 = 0; + } + break; + case 115: + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 54)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_331 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_331.intpart_1; + ivar3 = structdump_331.intpart_0; + svar0 = structdump_331.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 51)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_332 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_332.intpart_1; + ivar3 = structdump_332.intpart_0; + svar0 = structdump_332.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 59)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_333 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_333.intpart_1; + ivar3 = structdump_333.intpart_0; + svar0 = structdump_333.stringpart_0; + } + if ((arg0 == 23) && (getSkillActualLvl(arg0) == 37)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_334 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_334.intpart_1; + ivar3 = structdump_334.intpart_0; + svar0 = structdump_334.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 36)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_335 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_335.intpart_1; + ivar3 = structdump_335.intpart_0; + svar0 = structdump_335.stringpart_0; + } + if (bitconfig_7826 > 170) { + ivar4 = 0; + } + break; + case 116: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 33)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_336 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_336.intpart_1; + ivar3 = structdump_336.intpart_0; + svar0 = structdump_336.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 33)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_337 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_337.intpart_1; + ivar3 = structdump_337.intpart_0; + svar0 = structdump_337.stringpart_0; + } + if (bitconfig_7871 == 11) { + ivar4 = 0; + } + break; + case 117: + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 42)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_338 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_338.intpart_1; + ivar3 = structdump_338.intpart_0; + svar0 = structdump_338.stringpart_0; + } + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_339 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_339.intpart_1; + ivar3 = structdump_339.intpart_0; + svar0 = structdump_339.stringpart_0; + } + if (bitconfig_7958 == 90) { + ivar4 = 0; + } + break; + case 118: + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 77)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_340 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_340.intpart_1; + ivar3 = structdump_340.intpart_0; + svar0 = structdump_340.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 68)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_341 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_341.intpart_1; + ivar3 = structdump_341.intpart_0; + svar0 = structdump_341.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 68)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_342 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_342.intpart_1; + ivar3 = structdump_342.intpart_0; + svar0 = structdump_342.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 67)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_343 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_343.intpart_1; + ivar3 = structdump_343.intpart_0; + svar0 = structdump_343.stringpart_0; + } + if (bitconfig_8045 >= 150) { + ivar4 = 0; + } + break; + case 119: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 47)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_344 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_344.intpart_1; + ivar3 = structdump_344.intpart_0; + svar0 = structdump_344.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 49)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_345 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_345.intpart_1; + ivar3 = structdump_345.intpart_0; + svar0 = structdump_345.stringpart_0; + } + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 46)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_346 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_346.intpart_1; + ivar3 = structdump_346.intpart_0; + svar0 = structdump_346.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 47)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_347 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_347.intpart_1; + ivar3 = structdump_347.intpart_0; + svar0 = structdump_347.stringpart_0; + } + if ((arg0 == 23) && (getSkillActualLvl(arg0) == 48)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_348 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_348.intpart_1; + ivar3 = structdump_348.intpart_0; + svar0 = structdump_348.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 54)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_349 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_349.intpart_1; + ivar3 = structdump_349.intpart_0; + svar0 = structdump_349.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 52)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_350 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_350.intpart_1; + ivar3 = structdump_350.intpart_0; + svar0 = structdump_350.stringpart_0; + } + if (bitconfig_7451 == 63) { + ivar4 = 0; + } + break; + case 120: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 78)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_351 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_351.intpart_1; + ivar3 = structdump_351.intpart_0; + svar0 = structdump_351.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_352 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_352.intpart_1; + ivar3 = structdump_352.intpart_0; + svar0 = structdump_352.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_353 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_353.intpart_1; + ivar3 = structdump_353.intpart_0; + svar0 = structdump_353.stringpart_0; + } + if ((arg0 == 11) && (getSkillActualLvl(arg0) == 71)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_354 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_354.intpart_1; + ivar3 = structdump_354.intpart_0; + svar0 = structdump_354.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 80)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_355 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_355.intpart_1; + ivar3 = structdump_355.intpart_0; + svar0 = structdump_355.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_356 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_356.intpart_1; + ivar3 = structdump_356.intpart_0; + svar0 = structdump_356.stringpart_0; + } + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 78)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_357 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_357.intpart_1; + ivar3 = structdump_357.intpart_0; + svar0 = structdump_357.stringpart_0; + } + if ((arg0 == 23) && (getSkillActualLvl(arg0) == 55)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_358 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_358.intpart_1; + ivar3 = structdump_358.intpart_0; + svar0 = structdump_358.stringpart_0; + } + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 10)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_359 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_359.intpart_1; + ivar3 = structdump_359.intpart_0; + svar0 = structdump_359.stringpart_0; + } + if (bitconfig_8248 == 40) { + ivar4 = 0; + } + break; + case 121: + if ((arg0 == 2) && (getSkillActualLvl(arg0) == 77)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_360 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_360.intpart_1; + ivar3 = structdump_360.intpart_0; + svar0 = structdump_360.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_361 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_361.intpart_1; + ivar3 = structdump_361.intpart_0; + svar0 = structdump_361.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 68)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_362 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_362.intpart_1; + ivar3 = structdump_362.intpart_0; + svar0 = structdump_362.stringpart_0; + } + if (bitconfig_8704 == 90) { + ivar4 = 0; + } + break; + case 122: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 64)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_363 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_363.intpart_1; + ivar3 = structdump_363.intpart_0; + svar0 = structdump_363.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 64)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_364 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_364.intpart_1; + ivar3 = structdump_364.intpart_0; + svar0 = structdump_364.stringpart_0; + } + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 62)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_365 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_365.intpart_1; + ivar3 = structdump_365.intpart_0; + svar0 = structdump_365.stringpart_0; + } + if ((arg0 == 20) && (getSkillActualLvl(arg0) == 61)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_366 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_366.intpart_1; + ivar3 = structdump_366.intpart_0; + svar0 = structdump_366.stringpart_0; + } + if (bitconfig_5332 >= 120) { + ivar4 = 0; + } + break; + case 123: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 40)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_367 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_367.intpart_1; + ivar3 = structdump_367.intpart_0; + svar0 = structdump_367.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 41)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_368 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_368.intpart_1; + ivar3 = structdump_368.intpart_0; + svar0 = structdump_368.stringpart_0; + } + if ((arg0 == 20) && (getSkillActualLvl(arg0) == 39)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_369 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_369.intpart_1; + ivar3 = structdump_369.intpart_0; + svar0 = structdump_369.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 42)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_370 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_370.intpart_1; + ivar3 = structdump_370.intpart_0; + svar0 = structdump_370.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 39)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_371 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_371.intpart_1; + ivar3 = structdump_371.intpart_0; + svar0 = structdump_371.stringpart_0; + } + if (bitconfig_998 >= 9) { + ivar4 = 0; + } + break; + case 124: + if ((arg0 == 22) && (getSkillActualLvl(arg0) == 62)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_372 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_372.intpart_1; + ivar3 = structdump_372.intpart_0; + svar0 = structdump_372.stringpart_0; + } + if ((arg0 == 24) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_373 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_373.intpart_1; + ivar3 = structdump_373.intpart_0; + svar0 = structdump_373.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 61)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_374 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_374.intpart_1; + ivar3 = structdump_374.intpart_0; + svar0 = structdump_374.stringpart_0; + } + if ((arg0 == 23) && (getSkillActualLvl(arg0) == 65)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_375 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_375.intpart_1; + ivar3 = structdump_375.intpart_0; + svar0 = structdump_375.stringpart_0; + } + if ((arg0 == 13) && (getSkillActualLvl(arg0) == 74)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_376 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_376.intpart_1; + ivar3 = structdump_376.intpart_0; + svar0 = structdump_376.stringpart_0; + } + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 76)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_377 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_377.intpart_1; + ivar3 = structdump_377.intpart_0; + svar0 = structdump_377.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 74)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_378 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_378.intpart_1; + ivar3 = structdump_378.intpart_0; + svar0 = structdump_378.stringpart_0; + } + if (bitconfig_8961 >= 200) { + ivar4 = 0; + } + break; + case 125: + if ((arg0 == 10) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_379 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_379.intpart_1; + ivar3 = structdump_379.intpart_0; + svar0 = structdump_379.stringpart_0; + } + if ((arg0 == 21) && (getSkillActualLvl(arg0) == 67)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_380 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_380.intpart_1; + ivar3 = structdump_380.intpart_0; + svar0 = structdump_380.stringpart_0; + } + if ((arg0 == 17) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_381 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_381.intpart_1; + ivar3 = structdump_381.intpart_0; + svar0 = structdump_381.stringpart_0; + } + if (bitconfig_9369 == 50) { + ivar4 = 0; + } + break; + case 126: + if (((boolean)arg0) && (getSkillActualLvl(arg0) == 60)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_382 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_382.intpart_1; + ivar3 = structdump_382.intpart_0; + svar0 = structdump_382.stringpart_0; + } + if ((arg0 == 3) && (getSkillActualLvl(arg0) == 50)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_383 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_383.intpart_1; + ivar3 = structdump_383.intpart_0; + svar0 = structdump_383.stringpart_0; + } + if ((arg0 == 15) && (getSkillActualLvl(arg0) == 47)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_384 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_384.intpart_1; + ivar3 = structdump_384.intpart_0; + svar0 = structdump_384.stringpart_0; + } + if ((arg0 == 23) && (getSkillActualLvl(arg0) == 45)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_385 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_385.intpart_1; + ivar3 = structdump_385.intpart_0; + svar0 = structdump_385.stringpart_0; + } + if ((arg0 == 24) && (getSkillActualLvl(arg0) == 35)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_386 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_386.intpart_1; + ivar3 = structdump_386.intpart_0; + svar0 = structdump_386.stringpart_0; + } + if (bitconfig_9491 == 250) { + ivar4 = 0; + } + break; + case 127: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 63)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_387 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_387.intpart_1; + ivar3 = structdump_387.intpart_0; + svar0 = structdump_387.stringpart_0; + } + if ((arg0 == 8) && (getSkillActualLvl(arg0) == 76)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_388 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_388.intpart_1; + ivar3 = structdump_388.intpart_0; + svar0 = structdump_388.stringpart_0; + } + if ((arg0 == 19) && (getSkillActualLvl(arg0) == 63)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_389 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_389.intpart_1; + ivar3 = structdump_389.intpart_0; + svar0 = structdump_389.stringpart_0; + } + if ((arg0 == 9) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_390 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_390.intpart_1; + ivar3 = structdump_390.intpart_0; + svar0 = structdump_390.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 64)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_391 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_391.intpart_1; + ivar3 = structdump_391.intpart_0; + svar0 = structdump_391.stringpart_0; + } + if ((arg0 == 18) && (getSkillActualLvl(arg0) == 67)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_392 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_392.intpart_1; + ivar3 = structdump_392.intpart_0; + svar0 = structdump_392.stringpart_0; + } + if ((arg0 == 6) && (getSkillActualLvl(arg0) == 70)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_393 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_393.intpart_1; + ivar3 = structdump_393.intpart_0; + svar0 = structdump_393.stringpart_0; + } + if (bitconfig_9757 == 170) { + ivar4 = 0; + } + break; + case 128: + if ((arg0 == 16) && (getSkillActualLvl(arg0) == 77)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_394 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_394.intpart_1; + ivar3 = structdump_394.intpart_0; + svar0 = structdump_394.stringpart_0; + } + if ((arg0 == 12) && (getSkillActualLvl(arg0) == 76)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_395 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_395.intpart_1; + ivar3 = structdump_395.intpart_0; + svar0 = structdump_395.stringpart_0; + } + if ((arg0 == 14) && (getSkillActualLvl(arg0) == 76)) { + stack_dump0 = arg0; + stack_dump1 = ivar2; + stack_dump2 = arg1; + structdump_396 = script_1025(stack_dump0, stack_dump1, stack_dump2); + ivar4 = structdump_396.intpart_1; + ivar3 = structdump_396.intpart_0; + svar0 = structdump_396.stringpart_0; + } + if (bitconfig_9829 == 400) { + ivar4 = 0; + } + break; + default: + ivar4 = -1; + } + return newstruct cs2func_script_1023_struct(ivar3, ivar4, svar0); +} diff --git a/dumps/scripts/1024.cs2 b/dumps/scripts/1024.cs2 new file mode 100644 index 000000000..4ed9f4add --- /dev/null +++ b/dumps/scripts/1024.cs2 @@ -0,0 +1,652 @@ +int script_1024(int arg0) { + switch (arg0) { + case 0: + if (getSkillActualLvl(14) >= 10) { + return 1; + } + break; + case 1: + if ((getSkillActualLvl(0) >= 15) && (getSkillActualLvl(5) >= 25)) { + return 1; + } + break; + case 2: + if (((getSkillActualLvl(1) >= 30) && (getSkillActualLvl(14) >= 40)) && (getSkillActualLvl(13) >= 50)) { + return 1; + } + break; + case 3: + if (((getSkillActualLvl(7) >= 30) && (getSkillActualLvl(9) >= 5)) && (getSkillActualLvl(4) >= 30)) { + return 1; + } + break; + case 4: + if (((getSkillActualLvl(16) >= 42) && (getSkillActualLvl(12) >= 45)) && ((getSkillActualLvl(4) >= 40) && (getSkillActualLvl(13) >= 50))) { + return 1; + } + break; + case 5: + if ((getSkillActualLvl(12) >= 20) && (getSkillActualLvl(17) >= 25)) { + return 1; + } + break; + case 6: + if ((((getSkillActualLvl(16) >= 26) && (getSkillActualLvl(22) >= 5)) && ((getSkillActualLvl(12) >= 32) && (getSkillActualLvl(6) >= 33))) && (((getSkillActualLvl(14) >= 20) && (getSkillActualLvl(2) >= 40)) && (getSkillActualLvl(17) >= 22))) { + return 1; + } + break; + case 7: + if (((getSkillActualLvl(11) >= 50) && (getSkillActualLvl(6) >= 50)) && ((getSkillActualLvl(18) >= 10) && (getSkillActualLvl(17) >= 53))) { + return 1; + } + break; + case 8: + if (((getSkillActualLvl(9) >= 50) && (getSkillActualLvl(20) >= 50)) && (getSkillActualLvl(13) >= 65)) { + return 1; + } + break; + case 9: + if (((getSkillActualLvl(16) >= 10) && (getSkillActualLvl(15) >= 10)) && (getSkillActualLvl(17) >= 25)) { + return 1; + } + break; + case 10: + if (getSkillActualLvl(15) >= 31) { + return 1; + } + break; + case 11: + if (getSkillActualLvl(21) >= 27) { + return 1; + } + break; + case 12: + if (((getSkillActualLvl(12) >= 20) && (getSkillActualLvl(14) >= 20)) && (getSkillActualLvl(13) >= 20)) { + return 1; + } + break; + case 13: + if (((getSkillActualLvl(12) >= 50) && (getSkillActualLvl(11) >= 45)) && ((getSkillActualLvl(6) >= 39) && (getSkillActualLvl(5) >= 43))) { + return 1; + } + break; + case 14: + if (((getSkillActualLvl(19) >= 49) && (getSkillActualLvl(15) >= 57)) && (getSkillActualLvl(17) >= 40)) { + return 1; + } + break; + case 15: + if (((getSkillActualLvl(12) >= 40) && (getSkillActualLvl(6) >= 59)) && ((getSkillActualLvl(14) >= 40) && (getSkillActualLvl(13) >= 40))) { + return 1; + } + break; + case 16: + if (getSkillActualLvl(10) >= 10) { + return 1; + } + break; + case 17: + if ((getSkillActualLvl(7) >= 22) && (getSkillActualLvl(19) >= 17)) { + return 1; + } + break; + case 18: + if (((getSkillActualLvl(12) >= 40) && (getSkillActualLvl(9) >= 25)) && (getSkillActualLvl(8) >= 40)) { + return 1; + } + break; + case 19: + if (getSkillActualLvl(19) >= 25) { + return 1; + } + break; + case 20: + if ((getSkillActualLvl(16) >= 25) && (getSkillActualLvl(7) >= 20)) { + return 1; + } + break; + case 21: + if (((getSkillActualLvl(12) >= 12) && (getSkillActualLvl(11) >= 16)) && ((getSkillActualLvl(6) >= 33) && (getSkillActualLvl(17) >= 14))) { + return 1; + } + break; + case 22: + if ((getSkillActualLvl(12) >= 20) && (getSkillActualLvl(17) >= 25)) { + return 1; + } + break; + case 23: + if (getSkillActualLvl(16) >= 25) { + return 1; + } + break; + case 24: + if ((getSkillActualLvl(12) >= 49) && (getSkillActualLvl(17) >= 17)) { + return 1; + } + break; + case 25: + if ((getSkillActualLvl(16) >= 15) && (getSkillActualLvl(12) >= 35)) { + return 1; + } + break; + case 26: + if (((getSkillActualLvl(7) >= 53) && (getSkillActualLvl(10) >= 53)) && ((getSkillActualLvl(15) >= 25) && (getSkillActualLvl(14) >= 50))) { + return 1; + } + break; + case 27: + if (getSkillActualLvl(16) >= 35) { + return 1; + } + break; + case 28: + if (((getSkillActualLvl(12) >= 25) && (getSkillActualLvl(6) >= 7)) && (getSkillActualLvl(14) >= 15)) { + return 1; + } + break; + case 29: + if (getSkillActualLvl(15) >= 3) { + return 1; + } + break; + case 30: + if (((((getSkillActualLvl(16) >= 50) && (getSkillActualLvl(12) >= 50)) && ((getSkillActualLvl(15) >= 45) && (getSkillActualLvl(6) >= 56))) && (((getSkillActualLvl(14) >= 52) && (getSkillActualLvl(5) >= 42)) && ((getSkillActualLvl(13) >= 50) && (getSkillActualLvl(2) >= 50)))) && ((getSkillActualLvl(17) >= 50) && (getSkillActualLvl(8) >= 50))) { + return 1; + } + break; + case 31: + if ((getSkillActualLvl(12) >= 31) && (getSkillActualLvl(8) >= 36)) { + return 1; + } + break; + case 32: + if (((getSkillActualLvl(16) >= 13) && (getSkillActualLvl(14) >= 17)) && (getSkillActualLvl(17) >= 13)) { + return 1; + } + break; + case 33: + if ((((getSkillActualLvl(12) >= 61) && (getSkillActualLvl(1) >= 40)) && ((getSkillActualLvl(11) >= 49) && (getSkillActualLvl(15) >= 5))) && (((getSkillActualLvl(6) >= 65) && (getSkillActualLvl(14) >= 60)) && (getSkillActualLvl(8) >= 55))) { + return 1; + } + break; + case 34: + if (((getSkillActualLvl(12) >= 20) && (getSkillActualLvl(6) >= 7)) && (getSkillActualLvl(13) >= 40)) { + return 1; + } + break; + case 35: + if (getSkillActualLvl(17) >= 30) { + return 1; + } + break; + case 36: + if (getSkillActualLvl(16) >= 20) { + return 1; + } + break; + case 37: + if ((getSkillActualLvl(4) >= 60) && (getSkillActualLvl(17) >= 50)) { + return 1; + } + break; + case 38: + if (getSkillActualLvl(16) >= 25) { + return 1; + } + break; + case 39: + if ((getSkillActualLvl(19) >= 29) && (getSkillActualLvl(8) >= 10)) { + return 1; + } + break; + case 40: + if (getSkillActualLvl(12) >= 18) { + return 1; + } + break; + case 41: + if (((getSkillActualLvl(16) >= 36) && (getSkillActualLvl(12) >= 25)) && ((getSkillActualLvl(15) >= 18) && (getSkillActualLvl(13) >= 30))) { + return 1; + } + break; + case 42: + if (getSkillActualLvl(16) >= 56) { + return 1; + } + break; + case 43: + if ((getSkillActualLvl(16) >= 40) && (getSkillActualLvl(18) >= 40)) { + return 1; + } + break; + case 44: + if (getSkillActualLvl(5) >= 31) { + return 1; + } + break; + case 45: + if (getSkillActualLvl(11) >= 30) { + return 1; + } + break; + case 46: + if ((getSkillActualLvl(12) >= 20) && (getSkillActualLvl(15) >= 15)) { + return 1; + } + break; + case 47: + if (getSkillActualLvl(12) >= 30) { + return 1; + } + break; + case 48: + if ((getSkillActualLvl(16) >= 32) && (getSkillActualLvl(12) >= 20)) { + return 1; + } + break; + case 49: + if (((getSkillActualLvl(6) >= 33) && (getSkillActualLvl(14) >= 37)) && ((getSkillActualLvl(4) >= 37) && (getSkillActualLvl(17) >= 37))) { + return 1; + } + break; + case 50: + if ((((getSkillActualLvl(7) >= 62) && (getSkillActualLvl(12) >= 40)) && ((getSkillActualLvl(11) >= 42) && (getSkillActualLvl(10) >= 62))) && ((getSkillActualLvl(6) >= 66) && (getSkillActualLvl(13) >= 45))) { + return 1; + } + break; + case 51: + if (((getSkillActualLvl(16) >= 15) && (getSkillActualLvl(7) >= 30)) && (getSkillActualLvl(10) >= 5)) { + return 1; + } + break; + case 52: + if (((getSkillActualLvl(12) >= 20) && (getSkillActualLvl(11) >= 49)) && (getSkillActualLvl(14) >= 20)) { + return 1; + } + break; + case 53: + if ((getSkillActualLvl(4) >= 40) && (getSkillActualLvl(17) >= 42)) { + return 1; + } + break; + case 54: + if ((getSkillActualLvl(9) >= 10) && (getSkillActualLvl(13) >= 20)) { + return 1; + } + break; + case 55: + if (getSkillActualLvl(17) >= 21) { + return 1; + } + break; + case 56: + if (getSkillActualLvl(16) >= 28) { + return 1; + } + break; + case 57: + if (getSkillActualLvl(16) >= 15) { + return 1; + } + break; + case 58: + if (getSkillActualLvl(4) >= 25) { + return 1; + } + break; + case 59: + if ((((getSkillActualLvl(16) >= 25) && (getSkillActualLvl(15) >= 14)) && ((getSkillActualLvl(6) >= 14) && (getSkillActualLvl(14) >= 40))) && (getSkillActualLvl(17) >= 15)) { + return 1; + } + break; + case 60: + if (getSkillActualLvl(0) >= 20) { + return 1; + } + break; + case 61: + if ((getSkillActualLvl(22) >= 5) && (getSkillActualLvl(6) >= 46)) { + return 1; + } + break; + case 62: + if ((getSkillActualLvl(16) >= 23) && (getSkillActualLvl(17) >= 23)) { + return 1; + } + break; + case 63: + if (((getSkillActualLvl(12) >= 19) && (getSkillActualLvl(4) >= 30)) && ((getSkillActualLvl(18) >= 18) && (getSkillActualLvl(8) >= 35))) { + return 1; + } + break; + case 64: + if ((getSkillActualLvl(6) >= 20) && (getSkillActualLvl(13) >= 30)) { + return 1; + } + break; + case 65: + if (((getSkillActualLvl(12) >= 36) && (getSkillActualLvl(19) >= 30)) && (getSkillActualLvl(11) >= 20)) { + return 1; + } + break; + case 66: + if (((getSkillActualLvl(22) >= 30) && (getSkillActualLvl(12) >= 16)) && (getSkillActualLvl(5) >= 50)) { + return 1; + } + break; + case 67: + if (((getSkillActualLvl(12) >= 30) && (getSkillActualLvl(20) >= 30)) && ((getSkillActualLvl(18) >= 30) && (getSkillActualLvl(17) >= 30))) { + return 1; + } + break; + case 68: + if (((getSkillActualLvl(16) >= 30) && (getSkillActualLvl(22) >= 34)) && ((getSkillActualLvl(12) >= 30) && (getSkillActualLvl(21) >= 10))) { + return 1; + } + break; + case 69: + if (((getSkillActualLvl(16) >= 40) && (getSkillActualLvl(22) >= 20)) && ((getSkillActualLvl(12) >= 46) && (getSkillActualLvl(8) >= 56))) { + return 1; + } + break; + case 70: + if (getSkillActualLvl(22) >= 10) { + return 1; + } + break; + case 71: + if (getSkillActualLvl(20) >= 35) { + return 1; + } + break; + case 72: + if ((getSkillActualLvl(11) >= 40) && (getSkillActualLvl(8) >= 50)) { + return 1; + } + break; + case 73: + if ((((getSkillActualLvl(16) >= 59) && (getSkillActualLvl(19) >= 45)) && ((getSkillActualLvl(15) >= 52) && (getSkillActualLvl(17) >= 58))) && (getSkillActualLvl(8) >= 71)) { + return 1; + } + break; + case 74: + if ((getSkillActualLvl(6) >= 45) && (getSkillActualLvl(1) >= 65)) { + return 1; + } + break; + case 75: + if ((((getSkillActualLvl(16) >= 45) && (getSkillActualLvl(4) >= 47)) && ((getSkillActualLvl(18) >= 56) && (getSkillActualLvl(17) >= 56))) && (getSkillActualLvl(2) >= 60)) { + return 1; + } + break; + case 76: + if (((getSkillActualLvl(16) >= 55) && (getSkillActualLvl(19) >= 53)) && ((getSkillActualLvl(18) >= 59) && (getSkillActualLvl(8) >= 72))) { + return 1; + } + break; + case 77: + if ((((getSkillActualLvl(5) >= 30) && (getSkillActualLvl(16) >= 36)) && ((getSkillActualLvl(17) >= 36) && (getSkillActualLvl(10) >= 36))) && (getSkillActualLvl(15) >= 37)) { + return 1; + } + break; + case 78: + if (getSkillActualLvl(7) >= 10) { + return 1; + } + break; + case 79: + if (getSkillActualLvl(7) >= 31) { + return 1; + } + break; + case 80: + if (getSkillActualLvl(7) >= 40) { + return 1; + } + break; + case 81: + if (getSkillActualLvl(7) >= 25) { + return 1; + } + break; + case 82: + if ((getSkillActualLvl(7) >= 41) && (getSkillActualLvl(11) >= 20)) { + return 1; + } + break; + case 83: + if ((getSkillActualLvl(7) >= 70) && (getSkillActualLvl(16) >= 48)) { + return 1; + } + break; + case 84: + if (((getSkillActualLvl(21) >= 48) && (getSkillActualLvl(11) >= 51)) && (getSkillActualLvl(8) >= 58)) { + return 1; + } + break; + case 85: + if (getSkillActualLvl(14) >= 46) { + return 1; + } + break; + case 86: + if ((getSkillActualLvl(22) >= 44) && (getSkillActualLvl(9) >= 42)) { + return 1; + } + break; + case 87: + if (((getSkillActualLvl(16) >= 50) && (getSkillActualLvl(11) >= 21)) && ((getSkillActualLvl(17) >= 60) && (getSkillActualLvl(2) >= 60))) { + return 1; + } + break; + case 88: + if ((((getSkillActualLvl(12) >= 42) && (getSkillActualLvl(19) >= 40)) && ((getSkillActualLvl(10) >= 50) && (getSkillActualLvl(5) >= 47))) && (getSkillActualLvl(18) >= 42)) { + return 1; + } + break; + case 89: + if ((((getSkillActualLvl(22) >= 20) && (getSkillActualLvl(16) >= 29)) && ((getSkillActualLvl(12) >= 47) && (getSkillActualLvl(6) >= 49))) && (((getSkillActualLvl(14) >= 35) && (getSkillActualLvl(18) >= 31)) && (getSkillActualLvl(11) >= 40))) { + return 1; + } + break; + case 90: + if ((((getSkillActualLvl(0) >= 40) && (getSkillActualLvl(14) >= 41)) && ((getSkillActualLvl(12) >= 43) && (getSkillActualLvl(2) >= 45))) && (getSkillActualLvl(22) >= 50)) { + return 1; + } + break; + case 91: + if (((getSkillActualLvl(22) >= 10) && (getSkillActualLvl(19) >= 10)) && ((getSkillActualLvl(21) >= 10) && (getSkillActualLvl(17) >= 11))) { + return 1; + } + break; + case 92: + if (((getSkillActualLvl(18) >= 35) && (getSkillActualLvl(12) >= 25)) && (script_1432() >= 85)) { + return 1; + } + break; + case 93: + if (((getSkillActualLvl(16) >= 60) && (getSkillActualLvl(17) >= 63)) && ((getSkillActualLvl(12) >= 66) && (getSkillActualLvl(13) >= 69))) { + return 1; + } + break; + case 94: + if (((getSkillActualLvl(22) >= 40) && (getSkillActualLvl(19) >= 26)) && ((getSkillActualLvl(5) >= 35) && (getSkillActualLvl(23) >= 19))) { + return 1; + } + break; + case 95: + if (getSkillActualLvl(11) >= 43) { + return 1; + } + break; + case 96: + if ((((getSkillActualLvl(11) >= 47) && (getSkillActualLvl(21) >= 35)) && ((getSkillActualLvl(14) >= 45) && (getSkillActualLvl(5) >= 55))) && ((getSkillActualLvl(23) >= 23) && (getSkillActualLvl(8) >= 37))) { + return 1; + } + break; + case 97: + if (((getSkillActualLvl(21) >= 51) && (getSkillActualLvl(16) >= 51)) && ((getSkillActualLvl(13) >= 54) && (getSkillActualLvl(14) >= 59))) { + return 1; + } + break; + case 98: + if ((((getSkillActualLvl(1) >= 65) && (getSkillActualLvl(6) >= 75)) && ((getSkillActualLvl(15) >= 65) && (getSkillActualLvl(17) >= 60))) && (((getSkillActualLvl(21) >= 55) && (getSkillActualLvl(19) >= 65)) && ((getSkillActualLvl(23) >= 23) && ((boolean)script_395())))) { + return 1; + } + break; + case 99: + if (((getSkillActualLvl(11) >= 55) && (getSkillActualLvl(9) >= 53)) && (getSkillActualLvl(12) >= 52)) { + return 1; + } + break; + case 100: + if (((getSkillActualLvl(17) >= 46) && (getSkillActualLvl(16) >= 46)) && (getSkillActualLvl(2) >= 46)) { + return 1; + } + break; + case 101: + if (((getSkillActualLvl(21) >= 41) && (getSkillActualLvl(16) >= 50)) && ((getSkillActualLvl(6) >= 57) && (getSkillActualLvl(15) >= 43))) { + return 1; + } + break; + case 102: + if (((getSkillActualLvl(8) >= 10) && (getSkillActualLvl(6) >= 10)) && ((getSkillActualLvl(14) >= 8) && (getSkillActualLvl(11) >= 6))) { + return 1; + } + break; + case 103: + if ((((getSkillActualLvl(22) >= 35) && (getSkillActualLvl(7) >= 35)) && ((getSkillActualLvl(12) >= 35) && (getSkillActualLvl(5) >= 35))) && (getSkillActualLvl(6) >= 35)) { + return 1; + } + break; + case 104: + if (((getSkillActualLvl(17) >= 38) && (getSkillActualLvl(22) >= 45)) && (getSkillActualLvl(21) >= 45)) { + return 1; + } + break; + case 105: + if ((((getSkillActualLvl(23) >= 41) && (getSkillActualLvl(14) >= 64)) && ((getSkillActualLvl(18) >= 37) && (getSkillActualLvl(16) >= 61))) && (((getSkillActualLvl(2) >= 64) && (getSkillActualLvl(4) >= 64)) && (getSkillActualLvl(17) >= 66))) { + return 1; + } + break; + case 106: + if (((getSkillActualLvl(21) >= 61) && (getSkillActualLvl(11) >= 61)) && (getSkillActualLvl(2) >= 69)) { + return 1; + } + break; + case 107: + if (((getSkillActualLvl(16) >= 69) && (getSkillActualLvl(9) >= 70)) && ((getSkillActualLvl(4) >= 75) && (getSkillActualLvl(8) >= 75))) { + return 1; + } + break; + case 108: + if (getSkillActualLvl(5) >= 50) { + return 1; + } + break; + case 109: + if (((getSkillActualLvl(0) >= 75) && (getSkillActualLvl(2) >= 75)) && (getSkillActualLvl(18) >= 65)) { + return 1; + } + break; + case 110: + if ((((getSkillActualLvl(6) >= 75) && (getSkillActualLvl(5) >= 70)) && ((getSkillActualLvl(14) >= 66) && (getSkillActualLvl(21) >= 65))) && (getSkillActualLvl(22) >= 60)) { + return 1; + } + break; + case 111: + if (((getSkillActualLvl(6) >= 27) && (getSkillActualLvl(20) >= 20)) && (getSkillActualLvl(22) >= 25)) { + return 1; + } + break; + case 112: + if (getSkillActualLvl(17) >= 24) { + return 1; + } + break; + case 113: + if (getSkillActualLvl(17) >= 41) { + return 1; + } + break; + case 114: + if (((getSkillActualLvl(17) >= 62) && (getSkillActualLvl(15) >= 45)) && (getSkillActualLvl(16) >= 40)) { + return 1; + } + break; + case 115: + if ((((getSkillActualLvl(19) >= 54) && (getSkillActualLvl(17) >= 51)) && ((getSkillActualLvl(6) >= 59) && (getSkillActualLvl(23) >= 37))) && (getSkillActualLvl(12) >= 36)) { + return 1; + } + break; + case 116: + if ((getSkillActualLvl(1) >= 33) && (getSkillActualLvl(13) >= 33)) { + return 1; + } + break; + case 117: + if ((getSkillActualLvl(2) >= 42) && (getSkillActualLvl(0) >= 35)) { + return 1; + } + break; + case 118: + if (((getSkillActualLvl(6) >= 77) && (getSkillActualLvl(22) >= 68)) && ((getSkillActualLvl(13) >= 68) && (getSkillActualLvl(12) >= 67))) { + return 1; + } + break; + case 119: + if ((((getSkillActualLvl(22) >= 47) && (getSkillActualLvl(15) >= 49)) && ((getSkillActualLvl(21) >= 46) && (getSkillActualLvl(14) >= 47))) && (((getSkillActualLvl(23) >= 48) && (getSkillActualLvl(17) >= 54)) && (getSkillActualLvl(8) >= 52))) { + return 1; + } + break; + case 120: + if (((((getSkillActualLvl(0) >= 78) && (getSkillActualLvl(22) >= 70)) && ((getSkillActualLvl(12) >= 70) && (getSkillActualLvl(11) >= 71))) && (((getSkillActualLvl(6) >= 80) && (getSkillActualLvl(13) >= 70)) && ((getSkillActualLvl(2) >= 78) && (getSkillActualLvl(23) >= 55)))) && (getSkillActualLvl(1) >= 10)) { + return 1; + } + break; + case 121: + if (((getSkillActualLvl(2) >= 77) && (getSkillActualLvl(13) >= 70)) && (getSkillActualLvl(14) >= 68)) { + return 1; + } + break; + case 122: + if (((getSkillActualLvl(16) >= 64) && (getSkillActualLvl(17) >= 64)) && ((getSkillActualLvl(22) >= 62) && (getSkillActualLvl(20) >= 61))) { + return 1; + } + break; + case 123: + if ((((getSkillActualLvl(1) >= 40) && (getSkillActualLvl(12) >= 41)) && ((getSkillActualLvl(20) >= 39) && (getSkillActualLvl(13) >= 42))) && (getSkillActualLvl(17) >= 39)) { + return 1; + } + break; + case 124: + if ((((getSkillActualLvl(22) >= 62) && (getSkillActualLvl(24) >= 50)) && ((getSkillActualLvl(18) >= 61) && (getSkillActualLvl(23) >= 65))) && (((getSkillActualLvl(13) >= 74) && (getSkillActualLvl(1) >= 76)) && (getSkillActualLvl(17) >= 74))) { + return 1; + } + break; + case 125: + if (((getSkillActualLvl(10) >= 70) && (getSkillActualLvl(21) >= 67)) && (getSkillActualLvl(17) >= 70)) { + return 1; + } + break; + case 126: + if ((((getSkillActualLvl(1) >= 60) && (getSkillActualLvl(3) >= 50)) && ((getSkillActualLvl(15) >= 47) && (getSkillActualLvl(23) >= 45))) && (getSkillActualLvl(24) >= 35)) { + return 1; + } + break; + case 127: + if ((((getSkillActualLvl(16) >= 63) && (getSkillActualLvl(8) >= 76)) && ((getSkillActualLvl(19) >= 63) && (getSkillActualLvl(9) >= 70))) && (((getSkillActualLvl(12) >= 64) && (getSkillActualLvl(18) >= 67)) && (getSkillActualLvl(6) == 70))) { + return 1; + } + break; + case 128: + if (((getSkillActualLvl(16) >= 77) && (getSkillActualLvl(14) >= 76)) && (getSkillActualLvl(12) >= 76)) { + return 1; + } + break; + default: + return 0; + } + return 0; +} diff --git a/dumps/scripts/1025.cs2 b/dumps/scripts/1025.cs2 new file mode 100644 index 000000000..33f922880 --- /dev/null +++ b/dumps/scripts/1025.cs2 @@ -0,0 +1,17 @@ +cs2func_script_1025_struct(2,1,0) script_1025(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + string svar0; + svar0 = "null"; + ivar3 = -1; + ivar4 = 1; + if (((boolean)script_1024(arg2))) { + svar0 = "" + "Level " + intToStr(arg1) + " " + "" + getCommonString(680, arg0) + "" + " is one of the requirements for " + "" + getCommonString(1481, arg2) + "" + "."; + } else { + svar0 = "" + "You now have all the levels you need to complete " + "" + getCommonString(1481, arg2) + "" + "."; + } + if (ivar3 == -1) { + ivar3 = 6513; + } + return newstruct cs2func_script_1025_struct(ivar3, ivar4, svar0); +} diff --git a/dumps/scripts/1026.cs2 b/dumps/scripts/1026.cs2 new file mode 100644 index 000000000..628f5d128 --- /dev/null +++ b/dumps/scripts/1026.cs2 @@ -0,0 +1,4 @@ +void script_1026() { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(157,30)); + return; +} diff --git a/dumps/scripts/1027.cs2 b/dumps/scripts/1027.cs2 new file mode 100644 index 000000000..e057437ed --- /dev/null +++ b/dumps/scripts/1027.cs2 @@ -0,0 +1,4 @@ +void script_1027() { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(157,30)); + return; +} diff --git a/dumps/scripts/1028.cs2 b/dumps/scripts/1028.cs2 new file mode 100644 index 000000000..afc14b0ee --- /dev/null +++ b/dumps/scripts/1028.cs2 @@ -0,0 +1,4 @@ +void script_1028() { + script_1029(1484, 9); + return; +} diff --git a/dumps/scripts/1029.cs2 b/dumps/scripts/1029.cs2 new file mode 100644 index 000000000..47c140583 --- /dev/null +++ b/dumps/scripts/1029.cs2 @@ -0,0 +1,48 @@ +void script_1029(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar0; + deleteAllExtraChilds(new WidgetPointer(157,23)); + deleteAllExtraChilds(new WidgetPointer(157,25)); + setWidgetText(new WidgetPointer(157,14), "Quick-chat - Shortcut Reference"); + setWidgetIsHidden(false, new WidgetPointer(157,35)); + setWidgetIsHidden(true, new WidgetPointer(157,17)); + setScriptCallOnMousePressed(784, 1486, 0, 7, "gii", new WidgetPointer(157,30)); + setWidgetText(new WidgetPointer(157,30), "User Guide"); + ivar2 = 0; + ivar3 = 20; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + svar0 = ""; + createExtraChild(new WidgetPointer(157,25), 5, ivar4); + setWidgetSprite(1074); + setWidgetPosition(35, subtract(ivar3, 22), 0, 0); + setWidgetSize(400, 32, 0, 0); + ivar4 = add(ivar4, 1); + while (ivar2 < arg1) { + ivar2 = add(ivar2, 1); + script_1034(ivar4, 35, ivar3, 400, 100, 16776960, cs2method_3408(105, 115, arg0, ivar5)); + ivar4 = add(ivar4, 1); + ivar5 = add(ivar5, 1); + svar0 = cs2method_3408(105, 115, arg0, ivar5); + ivar6 = multiply(getLineCount(300, 495, svar0), 12); + script_1034(ivar4, 150, ivar3, 300, ivar6, 16777215, svar0); + ivar4 = add(ivar4, 1); + ivar5 = add(ivar5, 1); + ivar3 = add(add(ivar3, ivar6), 10); + createExtraChild(new WidgetPointer(157,25), 5, ivar4); + setWidgetSprite(1074); + setWidgetPosition(35, subtract(ivar3, 20), 0, 0); + setWidgetSize(400, 32, 0, 0); + ivar4 = add(ivar4, 1); + } + if (ivar3 > getWidgetActualHeight(new WidgetPointer(157,25))) { + setWidgetScrollMax(0, ivar3, new WidgetPointer(157,25)); + script_31(10289176, 10289177, 792, 789, 790, 791, 773, 788); + } + return; +} diff --git a/dumps/scripts/103.cs2 b/dumps/scripts/103.cs2 new file mode 100644 index 000000000..e4b440742 --- /dev/null +++ b/dumps/scripts/103.cs2 @@ -0,0 +1,22 @@ +void script_103() { + if (((boolean)globalint_1413)) { + return; + } + if (((boolean)globalint_11)) { + script_675(); + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter name of friend to add to list"); + globalint_5 = 2; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/1030.cs2 b/dumps/scripts/1030.cs2 new file mode 100644 index 000000000..8125b250f --- /dev/null +++ b/dumps/scripts/1030.cs2 @@ -0,0 +1,10 @@ +void script_1030(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(157,17)); + setWidgetIsHidden(false, new WidgetPointer(157,35)); + deleteAllExtraChilds(new WidgetPointer(157,23)); + deleteAllExtraChilds(new WidgetPointer(157,25)); + setScriptCallOnMousePressed(1031, "", new WidgetPointer(157,30)); + setWidgetText(new WidgetPointer(157,30), "Safety Guide"); + script_1033(cs2method_3408(105, 115, 1485, 0)); + return; +} diff --git a/dumps/scripts/1031.cs2 b/dumps/scripts/1031.cs2 new file mode 100644 index 000000000..96e41ca89 --- /dev/null +++ b/dumps/scripts/1031.cs2 @@ -0,0 +1,4 @@ +void script_1031() { + cs2method5400(0, "www", "kbase/viewcategory.ws?cat_id=827"); + return; +} diff --git a/dumps/scripts/1032.cs2 b/dumps/scripts/1032.cs2 new file mode 100644 index 000000000..e31186da3 --- /dev/null +++ b/dumps/scripts/1032.cs2 @@ -0,0 +1,31 @@ +void script_1032(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + cs2method2100(0, 0, new WidgetPointer(157,25)); + deleteAllExtraChilds(new WidgetPointer(157,24)); + setWidgetIsHidden(false, new WidgetPointer(157,17)); + setWidgetIsHidden(false, new WidgetPointer(157,35)); + setScriptCallOnMousePressed(1028, "", new WidgetPointer(157,30)); + setWidgetText(new WidgetPointer(157,30), "Shortcut keys"); + deleteAllExtraChilds(new WidgetPointer(157,23)); + deleteAllExtraChilds(new WidgetPointer(157,25)); + script_1033(cs2method_3408(105, 115, arg0, arg1)); + setWidgetText(new WidgetPointer(157,20), "Page " + intToStr(add(arg1, 1)) + " of " + intToStr(arg2)); + ivar3 = add(arg1, 1); + ivar4 = subtract(arg1, 1); + if (arg1 != subtract(arg2, 1)) { + setScriptCallOnMousePressed(784, arg0, ivar3, arg2, "gii", new WidgetPointer(157,21)); + cs2method2103(0, new WidgetPointer(157,21)); + } else { + setScriptCallOnMousePressed(-1, "", new WidgetPointer(157,21)); + cs2method2103(200, new WidgetPointer(157,21)); + } + if (arg1 != 0) { + setScriptCallOnMousePressed(784, arg0, ivar4, arg2, "gii", new WidgetPointer(157,22)); + cs2method2103(0, new WidgetPointer(157,22)); + } else { + setScriptCallOnMousePressed(-1, "", new WidgetPointer(157,22)); + cs2method2103(200, new WidgetPointer(157,22)); + } + return; +} diff --git a/dumps/scripts/1033.cs2 b/dumps/scripts/1033.cs2 new file mode 100644 index 000000000..e0e9c28ef --- /dev/null +++ b/dumps/scripts/1033.cs2 @@ -0,0 +1,30 @@ +void script_1033(string arg0) { + int ivar0; + int ivar1; + int ivar2; + string svar1; + svar1 = ""; + ivar0 = 0; + ivar0 = strIndexof(0, arg0, "|"); + if (ivar0 != -1) { + svar1 = substr(add(ivar0, 1), strLength(arg0), arg0); + } else { + svar1 = arg0; + } + setWidgetText(new WidgetPointer(157,14), substr(0, ivar0, arg0)); + ivar1 = 0; + ivar2 = 0; + ivar1 = multiply(getLineCount(400, 495, svar1), 12); + ivar2 = getWidgetActualHeight(new WidgetPointer(157,25)); + ivar2 = subtract(divide(getWidgetActualHeight(new WidgetPointer(157,25)), 2), divide(ivar1, 2)); + script_1034(0, 35, ivar2, 400, 100, 16777215, svar1); + createExtraChild(new WidgetPointer(157,25), 5, 1); + setWidgetSprite(1074); + setWidgetPosition(35, subtract(ivar2, 25), 0, 0); + setWidgetSize(400, 32, 0, 0); + createExtraChild(new WidgetPointer(157,25), 5, 2); + setWidgetSprite(1074); + setWidgetPosition(35, add(ivar2, ivar1), 0, 0); + setWidgetSize(400, 32, 0, 0); + return; +} diff --git a/dumps/scripts/1034.cs2 b/dumps/scripts/1034.cs2 new file mode 100644 index 000000000..dcfb4a600 --- /dev/null +++ b/dumps/scripts/1034.cs2 @@ -0,0 +1,10 @@ +void script_1034(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6) { + createExtraChild(new WidgetPointer(157,25), 4, arg0); + setWidgetPosition(arg1, arg2, 0, 0); + setWidgetSize(arg3, arg4, 0, 0); + setWidgetRGB(new Color(arg5)); + setWidgetUnknownBoolean(true); + setWidgetFont(495); + setWidgetText(arg6); + return; +} diff --git a/dumps/scripts/1035.cs2 b/dumps/scripts/1035.cs2 new file mode 100644 index 000000000..5a03df424 --- /dev/null +++ b/dumps/scripts/1035.cs2 @@ -0,0 +1,65 @@ +void script_1035(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + ivar4 = 0; + createExtraChild(new WidgetPointer(157,23), 5, ivar4); + setWidgetSprite(846); + setWidgetPosition(arg0, arg1, 0, 0); + setWidgetSize(32, 32, 0, 0); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 5, ivar4); + setWidgetSprite(828); + setWidgetPosition(arg0, subtract(arg1, 14), 0, 0); + setWidgetSize(arg2, 32, 0, 0); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 5, ivar4); + setWidgetSprite(847); + setWidgetPosition(subtract(add(arg2, arg0), 32), arg1, 0, 0); + setWidgetSize(32, 32, 0, 0); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 5, ivar4); + setWidgetSprite(841); + setWidgetPosition(subtract(arg0, 14), arg1, 0, 0); + setWidgetSize(32, arg3, 0, 0); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 5, ivar4); + setWidgetSprite(841); + setWidgetPosition(subtract(add(arg0, arg2), 20), arg1, 0, 0); + setWidgetSize(32, arg3, 0, 0); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 5, ivar4); + setWidgetSprite(848); + setWidgetPosition(arg0, subtract(add(arg1, arg3), 32), 0, 0); + setWidgetSize(32, 32, 0, 0); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 5, ivar4); + setWidgetSprite(849); + setWidgetPosition(subtract(add(arg0, arg2), 32), subtract(add(arg1, arg3), 32), 0, 0); + setWidgetSize(32, 32, 0, 0); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 5, ivar4); + setWidgetSprite(828); + setWidgetPosition(arg0, subtract(add(arg1, arg3), 20), 0, 0); + setWidgetSize(arg2, 32, 0, 0); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 3, ivar4); + setWidgetPosition(add(arg0, 6), add(arg1, 6), 0, 0); + setWidgetSize(subtract(arg2, 12), subtract(arg3, 12), 0, 0); + setWidgetRGB(new Color(131, 118, 94)); + setWidgetFilled(1); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 3, ivar4); + setWidgetPosition(add(arg0, 3), add(arg1, 3), 0, 0); + setWidgetSize(arg2, arg3, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFilled(1); + cs2method2103(200); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(157,23), 4, ivar4); + setWidgetPosition(10, 10, 0, 0); + setWidgetSize(400, 50, 0, 0); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetFont(495); + setWidgetText(arg4); + return; +} diff --git a/dumps/scripts/1036.cs2 b/dumps/scripts/1036.cs2 new file mode 100644 index 000000000..67bb58e1a --- /dev/null +++ b/dumps/scripts/1036.cs2 @@ -0,0 +1,11 @@ +int script_1036() { + int ivar0; + ivar0 = -1; + if (cs2method_3408(105, 105, 1548, bitconfig_4758) > 0) { + ivar0 = cs2method_3408(105, 107, 1549, bitconfig_4758); + if (ivar0 != -1) { + return ivar0; + } + } + return cs2method_3408(105, 107, 1483, bitconfig_4759); +} diff --git a/dumps/scripts/1037.cs2 b/dumps/scripts/1037.cs2 new file mode 100644 index 000000000..bdd58713a --- /dev/null +++ b/dumps/scripts/1037.cs2 @@ -0,0 +1,43 @@ +void script_1037(int arg0,int arg1) { + string svar0; + globalint_161 = arg1; + globalint_128 = -1; + globalint_129 = 0; + globalstring_30 = ""; + svar0 = cs2method5055(arg0); + if (((boolean)globalint_126)) { + svar0 = "To " + globalstring_27 + ": " + "" + svar0; + } else if (globalint_126 == 2) { + svar0 = "[" + "" + cs2method3611() + "" + "]: " + "" + svar0; + } else if (globalint_126 == 8) { + if (cs2method3751()) { + svar0 = "[" + "" + cs2method3752() + "" + "]: " + "" + svar0; + } + } else if (globalint_126 == 10) { + if (cs2method3750()) { + svar0 = "[" + "" + cs2method3752() + "" + "]: " + "" + svar0; + } + } else { + svar0 = "" + svar0; + } + setWidgetIsHidden(true, new WidgetPointer(137,50)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(false, new WidgetPointer(137,0)); + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(false, new WidgetPointer(137,13)); + setWidgetIsHidden(true, new WidgetPointer(137,17)); + setWidgetIsHidden(true, new WidgetPointer(137,1)); + setWidgetIsHidden(false, new WidgetPointer(137,3)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(137,3)); + setWidgetFont(495, new WidgetPointer(137,3)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(137,3)); + setWidgetText(new WidgetPointer(137,3), svar0); + setWidgetUnknownBoolean(false, new WidgetPointer(137,3)); + deleteAllExtraChilds(new WidgetPointer(137,16)); + setWidgetText(new WidgetPointer(137,14), "Search for: *"); + setScriptCallOnKeyPress(1038, -2147483640, false, new WidgetPointer(137,1), new WidgetPointer(137,14), new WidgetPointer(137,16), new WidgetPointer(137,15), arg0, 0, "izIIIIei", new WidgetPointer(137,13)); + setWidgetScrollMax(0, 0, new WidgetPointer(137,16)); + script_72(8978447, 8978448, 0); + return; +} diff --git a/dumps/scripts/1038.cs2 b/dumps/scripts/1038.cs2 new file mode 100644 index 000000000..e29555c6b --- /dev/null +++ b/dumps/scripts/1038.cs2 @@ -0,0 +1,117 @@ +void script_1038(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + int ivar8; + int ivar9; + int ivar10; + int ivar11; + if (arg0 == 104) { + if (((boolean)arg7)) { + return; + } + if (globalint_128 <= 0) { + globalint_128 = subtract(arg7, 1); + } else { + globalint_128 = subtract(globalint_128, 1); + } + if (setWidgetRegister(new WidgetPointer(arg4), add(globalint_128, 1))) { + if (setWidgetRegister(new WidgetPointer(arg4), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + } + if (getWidgetActualY() < cs2method2601(new WidgetPointer(arg4))) { + script_72(arg5, arg4, subtract(cs2method2601(new WidgetPointer(arg4)), getWidgetActualHeight())); + } else { + if (add(getWidgetActualY(), getWidgetActualHeight()) > add(getWidgetActualHeight(new WidgetPointer(arg4)), cs2method2601(new WidgetPointer(arg4)))) { + script_72(arg5, arg4, getWidgetScrollMaxV(new WidgetPointer(arg4))); + } + } + } + return; + } + if (arg0 == 105) { + if (((boolean)arg7)) { + return; + } + if (globalint_128 == subtract(arg7, 1)) { + globalint_128 = 0; + } else { + globalint_128 = add(globalint_128, 1); + } + if (setWidgetRegister(new WidgetPointer(arg4), add(globalint_128, 1))) { + if (setWidgetRegister(new WidgetPointer(arg4), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + } + if (add(getWidgetActualY(), getWidgetActualHeight()) > add(getWidgetActualHeight(new WidgetPointer(arg4)), cs2method2601(new WidgetPointer(arg4)))) { + script_72(arg5, arg4, add(cs2method2601(new WidgetPointer(arg4)), getWidgetActualHeight())); + } else { + if (getWidgetActualY() < cs2method2601(new WidgetPointer(arg4))) { + script_72(arg5, arg4, 0); + } + } + } + return; + } + if (arg0 == 102) { + script_1050(globalint_126, globalstring_27); + return; + } + if (arg0 == 13) { + script_1054(); + return; + } + ivar8 = strLength(globalstring_30); + ivar9 = cs2method4210(globalint_161, globalstring_30); + ivar10 = 0; + ivar11 = -1; + if (arg0 == 84) { + if (globalint_128 < 0) { + if (ivar8 > 0) { + globalint_129 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg3)); + script_1041(arg2, arg4, arg5, arg6); + } else { + script_1054(); + } + } else { + if (((ivar9 > 0) && setWidgetRegister(new WidgetPointer(arg4), add(globalint_128, 1))) && (ivar10 < ivar9)) { + while (true) { + ivar11 = cs2method4211(); + if (((boolean)stringMethod4107(getWidgetText(), getItemName(ivar11)))) { + script_1076(arg2, arg6, ivar11); + return; + } + ivar10 = add(ivar10, 1); + } + } + } + return; + } + if (arg0 == 85) { + if (ivar8 > 0) { + globalstring_30 = substr(0, subtract(ivar8, 1), globalstring_30); + } else if (((boolean)globalint_127)) { + script_1054(); + } else { + globalint_128 = -1; + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(false, new WidgetPointer(137,17)); + setWidgetIsHidden(false, new WidgetPointer(137,1)); + setWidgetIsHidden(true, new WidgetPointer(137,3)); + return; + } + } else if (isValidChar(((char)arg1)) && (ivar8 < 80)) { + globalstring_30 = strRemoveEntities(concatChar(((char)arg1), globalstring_30)); + } else { + return; + } + setWidgetText(new WidgetPointer(arg3), "Search for: " + globalstring_30 + "*"); + globalint_129 = 50; + setScriptCallOnGameloop(1040, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), arg6, "IIIIe", new WidgetPointer(arg3)); + return; +} diff --git a/dumps/scripts/1039.cs2 b/dumps/scripts/1039.cs2 new file mode 100644 index 000000000..4d4008735 --- /dev/null +++ b/dumps/scripts/1039.cs2 @@ -0,0 +1,75 @@ +void script_1039(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + globalint_128 = -1; + ivar4 = cs2method4210(globalint_161, globalstring_30); + ivar5 = getWidgetActualWidth(new WidgetPointer(arg1)); + ivar6 = subtract(ivar5, 8); + if (ivar4 == -1) { + createExtraChild(new WidgetPointer(arg1), 4, 0); + setWidgetPosition(0, 48, 0, 0); + setWidgetSize(ivar5, 14, 0, 0); + setWidgetFont(495); + setWidgetText("Too many results. Please refine your search."); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + script_1042(arg1, arg2); + return; + } + if (((boolean)ivar4)) { + createExtraChild(new WidgetPointer(arg1), 4, 0); + setWidgetPosition(0, 48, 0, 0); + setWidgetSize(ivar5, 14, 0, 0); + setWidgetFont(495); + setWidgetText("No matching items found."); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + script_1042(arg1, arg2); + return; + } + ivar7 = 1; + ivar8 = cs2method4211(); + svar0 = ""; + createExtraChild(new WidgetPointer(arg1), 3, 0); + while (ivar8 != -1) { + if (((stringMethod4107(svar0, getItemName(ivar8)) != 0) && ((boolean)cs2method_3408(111, 105, 1547, ivar8))) && (stringMethod4107(lower(getItemName(ivar8)), "null") != 0)) { + svar0 = getItemName(ivar8); + createExtraChild(new WidgetPointer(arg1), 4, ivar7); + setWidgetPosition(4, multiply(14, subtract(ivar7, 1)), 0, 0); + setWidgetSize(ivar6, 14, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetText(getItemName(ivar8)); + setWidgetFont(495); + setWidgetUnknownBoolean(false); + setScriptCallOnMouseEntered(1043, ivar7, new WidgetPointer(arg1), "iI"); + setScriptCallOnMousePressed(1075, new WidgetPointer(arg0), arg3, ivar8, "Ieo"); + ivar7 = add(ivar7, 1); + } + ivar8 = cs2method4211(); + } + if (((boolean)ivar7)) { + createExtraChild(new WidgetPointer(arg1), 4, 0); + setWidgetPosition(0, 48, 0, 0); + setWidgetSize(ivar5, 14, 0, 0); + setWidgetFont(495); + setWidgetText("No matching items found."); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + script_1042(arg1, arg2); + return; + } + setScriptCallOnKeyPress(1038, -2147483640, false, new WidgetPointer(137,1), new WidgetPointer(137,14), new WidgetPointer(137,16), new WidgetPointer(137,15), arg3, subtract(ivar7, 1), "izIIIIei", new WidgetPointer(137,13)); + setWidgetScrollMax(0, multiply(14, subtract(ivar7, 1)), new WidgetPointer(arg1)); + script_1042(arg1, arg2); + return; +} diff --git a/dumps/scripts/104.cs2 b/dumps/scripts/104.cs2 new file mode 100644 index 000000000..c994d38bf --- /dev/null +++ b/dumps/scripts/104.cs2 @@ -0,0 +1,22 @@ +void script_104() { + if (((boolean)globalint_1413)) { + return; + } + if (((boolean)globalint_11)) { + script_675(); + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter name of friend to delete from list"); + globalint_5 = 3; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/1040.cs2 b/dumps/scripts/1040.cs2 new file mode 100644 index 000000000..6c4acd973 --- /dev/null +++ b/dumps/scripts/1040.cs2 @@ -0,0 +1,9 @@ +void script_1040(int arg0,int arg1,int arg2,int arg3,int arg4) { + globalint_129 = subtract(globalint_129, 1); + if (globalint_129 > 0) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + script_1041(arg0, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/1041.cs2 b/dumps/scripts/1041.cs2 new file mode 100644 index 000000000..d1ffae9e6 --- /dev/null +++ b/dumps/scripts/1041.cs2 @@ -0,0 +1,10 @@ +void script_1041(int arg0,int arg1,int arg2,int arg3) { + deleteAllExtraChilds(new WidgetPointer(arg1)); + if (strLength(globalstring_30) > 0) { + script_1039(arg0, arg1, arg2, arg3); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + script_1042(arg1, arg2); + } + return; +} diff --git a/dumps/scripts/1042.cs2 b/dumps/scripts/1042.cs2 new file mode 100644 index 000000000..6aa23a585 --- /dev/null +++ b/dumps/scripts/1042.cs2 @@ -0,0 +1,19 @@ +void script_1042(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = getWidgetScrollMaxV(new WidgetPointer(arg0)); + ivar4 = subtract(ivar3, ivar2); + if (ivar4 < 0) { + ivar4 = 0; + } + ivar5 = cs2method2601(new WidgetPointer(arg0)); + if (ivar5 > ivar4) { + ivar5 = ivar4; + } + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + script_72(arg1, arg0, ivar5); + return; +} diff --git a/dumps/scripts/1043.cs2 b/dumps/scripts/1043.cs2 new file mode 100644 index 000000000..f56b3a148 --- /dev/null +++ b/dumps/scripts/1043.cs2 @@ -0,0 +1,12 @@ +void script_1043(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + globalint_128 = subtract(arg0, 1); + if (setWidgetRegister(new WidgetPointer(arg1), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + } + } + return; +} diff --git a/dumps/scripts/1044.cs2 b/dumps/scripts/1044.cs2 new file mode 100644 index 000000000..321b68176 --- /dev/null +++ b/dumps/scripts/1044.cs2 @@ -0,0 +1,87 @@ +void script_1044(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar0; + globalint_128 = -1; + svar0 = cs2method5055(arg0); + if (((boolean)globalint_126)) { + svar0 = "To " + globalstring_27 + ": " + "" + svar0; + } else if (globalint_126 == 2) { + svar0 = "[" + "" + cs2method3611() + "" + "]: " + "" + svar0; + } else if (globalint_126 == 8) { + if (cs2method3751()) { + svar0 = "[" + "" + cs2method3752() + "" + "]: " + "" + svar0; + } + } else if (globalint_126 == 10) { + if (cs2method3750()) { + svar0 = "[" + "" + cs2method3752() + "" + "]: " + "" + svar0; + } + } else { + svar0 = "" + svar0; + } + setWidgetIsHidden(true, new WidgetPointer(137,50)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(false, new WidgetPointer(137,0)); + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(false, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(true, new WidgetPointer(137,17)); + setWidgetIsHidden(true, new WidgetPointer(137,1)); + setWidgetIsHidden(false, new WidgetPointer(137,3)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(137,3)); + setWidgetFont(495, new WidgetPointer(137,3)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(137,3)); + setWidgetText(new WidgetPointer(137,3), svar0); + setWidgetUnknownBoolean(false, new WidgetPointer(137,3)); + deleteAllExtraChilds(new WidgetPointer(137,12)); + ivar1 = cs2method5070(arg0, globalint_134, 0); + createExtraChild(new WidgetPointer(137,12), 3, 0); + ivar2 = getWidgetActualWidth(new WidgetPointer(137,12)); + ivar3 = subtract(ivar2, 8); + ivar4 = 1; + ivar5 = 0; + globalarray_0 = new int[250]; + ivar6 = 0; + svar0 = cs2method_3408(105, 115, ivar1, 0); + while ((stringMethod4107("", svar0) != 0) && (ivar4 < 250)) { + createExtraChild(new WidgetPointer(137,12), 4, ivar4); + setWidgetPosition(4, multiply(14, ivar5), 0, 0); + setWidgetSize(ivar3, 14, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetText(svar0); + setWidgetFont(495); + setWidgetUnknownBoolean(false); + setScriptCallOnMouseEntered(1045, ivar4, new WidgetPointer(137,12), ivar5, "iIi"); + setScriptCallOnMousePressed(1073, new WidgetPointer(137,1), arg0, subtract(ivar4, 1), "Iei"); + globalarray_0[ivar5] = ivar5; + svar0 = cs2method_3408(105, 115, ivar1, ivar4); + ivar4 = add(ivar4, 1); + ivar5 = add(ivar5, 1); + } + ivar6 = subtract(ivar5, 1); + if (stringMethod4107(cs2method_3408(105, 115, ivar1, 1000), "non-alpha") != 0) { + script_520(0, 0, ivar6, ivar1); + ivar5 = 0; + while (ivar5 <= ivar6) { + if (setWidgetRegister(new WidgetPointer(137,12), add(globalarray_0[ivar5], 1))) { + setWidgetPosition(4, multiply(14, ivar5), 0, 0); + setScriptCallOnMouseEntered(1045, add(globalarray_0[ivar5], 1), new WidgetPointer(137,12), ivar5, "iIi"); + } + ivar5 = add(ivar5, 1); + } + } + ivar5 = 0; + while (ivar5 < 250) { + script_1384(ivar5, globalarray_0[ivar5]); + ivar5 = add(ivar5, 1); + } + setScriptCallOnKeyPress(1046, -2147483640, false, new WidgetPointer(137,1), new WidgetPointer(137,12), new WidgetPointer(137,11), arg0, subtract(ivar4, 1), "izIIIei", new WidgetPointer(137,12)); + setWidgetScrollMax(0, multiply(14, subtract(ivar4, 1)), new WidgetPointer(137,12)); + script_31(8978443, 8978444, 792, 789, 790, 791, 773, 788); + script_72(8978443, 8978444, 0); + return; +} diff --git a/dumps/scripts/1045.cs2 b/dumps/scripts/1045.cs2 new file mode 100644 index 000000000..37b7540bc --- /dev/null +++ b/dumps/scripts/1045.cs2 @@ -0,0 +1,12 @@ +void script_1045(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + globalint_128 = arg2; + if (setWidgetRegister(new WidgetPointer(arg1), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + } + } + return; +} diff --git a/dumps/scripts/1046.cs2 b/dumps/scripts/1046.cs2 new file mode 100644 index 000000000..cc9b9688d --- /dev/null +++ b/dumps/scripts/1046.cs2 @@ -0,0 +1,114 @@ +void script_1046(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + ivar7 = 1; + ivar8 = 0; + ivar9 = 1000; + ivar10 = -1; + if (isAlphaNumeric(((char)arg1))) { + while (ivar8 < arg6) { + if ((setWidgetRegister(new WidgetPointer(arg3), add(script_1844(ivar8), 1)) && ((boolean)strIndexof(((char)lower(((char)arg1))), 0, lower(getWidgetText())))) && setWidgetRegister(new WidgetPointer(arg3), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + if (ivar8 < globalint_128) { + if (getWidgetActualY() < cs2method2601(new WidgetPointer(arg3))) { + script_72(arg4, arg3, getWidgetActualY()); + } + } else { + if ((ivar8 > globalint_128) && (add(getWidgetActualY(), getWidgetActualHeight()) > add(getWidgetActualHeight(new WidgetPointer(arg3)), cs2method2601(new WidgetPointer(arg3))))) { + script_72(arg4, arg3, subtract(add(getWidgetActualY(), getWidgetActualHeight()), getWidgetActualHeight(new WidgetPointer(arg3)))); + } + } + globalint_128 = ivar8; + return; + } + ivar8 = add(ivar8, 1); + } + return; + } + if (arg0 == 104) { + if (((boolean)arg6)) { + return; + } + if (globalint_128 <= 0) { + globalint_128 = subtract(arg6, 1); + } else { + globalint_128 = subtract(globalint_128, 1); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(script_1844(globalint_128), 1))) { + if (setWidgetRegister(new WidgetPointer(arg3), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + } + if (getWidgetActualY() < cs2method2601(new WidgetPointer(arg3))) { + script_72(arg4, arg3, subtract(cs2method2601(new WidgetPointer(arg3)), getWidgetActualHeight())); + } else { + if (add(getWidgetActualY(), getWidgetActualHeight()) > add(getWidgetActualHeight(new WidgetPointer(arg3)), cs2method2601(new WidgetPointer(arg3)))) { + script_72(arg4, arg3, getWidgetScrollMaxV(new WidgetPointer(arg3))); + } + } + } + return; + } + if (arg0 == 105) { + if (((boolean)arg6)) { + return; + } + if (globalint_128 == subtract(arg6, 1)) { + globalint_128 = 0; + } else { + globalint_128 = add(globalint_128, 1); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(script_1844(globalint_128), 1))) { + if (setWidgetRegister(new WidgetPointer(arg3), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + } + if (add(getWidgetActualY(), getWidgetActualHeight()) > add(getWidgetActualHeight(new WidgetPointer(arg3)), cs2method2601(new WidgetPointer(arg3)))) { + script_72(arg4, arg3, add(cs2method2601(new WidgetPointer(arg3)), getWidgetActualHeight())); + } else { + if (getWidgetActualY() < cs2method2601(new WidgetPointer(arg3))) { + script_72(arg4, arg3, 0); + } + } + } + return; + } + if (arg0 == 102) { + script_1050(globalint_126, globalstring_27); + return; + } + if (arg0 == 13) { + script_1054(); + return; + } + if (arg0 == 84) { + if ((globalint_128 >= 0) && setWidgetRegister(new WidgetPointer(arg3), add(globalint_128, 1))) { + script_1074(arg2, arg5, script_1844(globalint_128)); + } + return; + } + if (arg0 == 85) { + if (((boolean)globalint_127)) { + script_1054(); + } else { + globalint_128 = -1; + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(false, new WidgetPointer(137,17)); + setWidgetIsHidden(false, new WidgetPointer(137,1)); + setWidgetIsHidden(true, new WidgetPointer(137,3)); + } + return; + } + return; +} diff --git a/dumps/scripts/1047.cs2 b/dumps/scripts/1047.cs2 new file mode 100644 index 000000000..3157e4d9e --- /dev/null +++ b/dumps/scripts/1047.cs2 @@ -0,0 +1,38 @@ +void script_1047(int arg0) { + string svar0; + globalint_129 = 0; + svar0 = cs2method5055(arg0); + if (((boolean)globalint_126)) { + svar0 = "To " + globalstring_27 + ": " + "" + svar0; + } else if (globalint_126 == 2) { + svar0 = "[" + "" + cs2method3611() + "" + "]: " + "" + svar0; + } else if (globalint_126 == 8) { + if (cs2method3751()) { + svar0 = "[" + "" + cs2method3752() + "" + "]: " + "" + svar0; + } + } else if (globalint_126 == 10) { + if (cs2method3750()) { + svar0 = "[" + "" + cs2method3752() + "" + "]: " + "" + svar0; + } + } else { + svar0 = "" + svar0; + } + setWidgetIsHidden(true, new WidgetPointer(137,50)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(false, new WidgetPointer(137,0)); + setWidgetIsHidden(false, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(true, new WidgetPointer(137,17)); + setWidgetIsHidden(true, new WidgetPointer(137,1)); + setWidgetIsHidden(false, new WidgetPointer(137,3)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(137,3)); + setWidgetFont(495, new WidgetPointer(137,3)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(137,3)); + setWidgetText(new WidgetPointer(137,3), svar0); + setWidgetUnknownBoolean(false, new WidgetPointer(137,3)); + deleteAllExtraChilds(new WidgetPointer(137,7)); + setWidgetText(new WidgetPointer(137,8), "Please enter a value: *"); + setScriptCallOnKeyPress(1048, -2147483640, false, new WidgetPointer(137,1), new WidgetPointer(137,8), arg0, "izIIe", new WidgetPointer(137,7)); + return; +} diff --git a/dumps/scripts/1048.cs2 b/dumps/scripts/1048.cs2 new file mode 100644 index 000000000..64f402b54 --- /dev/null +++ b/dumps/scripts/1048.cs2 @@ -0,0 +1,47 @@ +void script_1048(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + if (arg0 == 13) { + script_1054(); + return; + } + if (arg0 == 102) { + script_1050(globalint_126, globalstring_27); + return; + } + ivar5 = strLength(intToStr(globalint_129)); + ivar6 = strIndexof(((char)arg1), 0, "0123456789"); + if (arg0 == 84) { + if (ivar5 > 0) { + script_1074(arg2, arg4, globalint_129); + } else { + script_1054(); + } + return; + } + if (arg0 == 85) { + if (ivar5 > 0) { + globalint_129 = divide(globalint_129, 10); + } else if (((boolean)globalint_127)) { + script_1054(); + } else { + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(false, new WidgetPointer(137,17)); + setWidgetIsHidden(false, new WidgetPointer(137,1)); + setWidgetIsHidden(true, new WidgetPointer(137,3)); + return; + } + } else { + if (((ivar6 >= 0) && (ivar5 < 10)) && (add(multiply(globalint_129, 10), ivar6) > 0)) { + globalint_129 = add(multiply(globalint_129, 10), ivar6); + } + } + if (globalint_129 > 0) { + setWidgetText(new WidgetPointer(arg3), "Please enter a value: " + intToStr(globalint_129) + "*"); + } else { + setWidgetText(new WidgetPointer(arg3), "Please enter a value: *"); + } + return; +} diff --git a/dumps/scripts/1049.cs2 b/dumps/scripts/1049.cs2 new file mode 100644 index 000000000..e3b5d408d --- /dev/null +++ b/dumps/scripts/1049.cs2 @@ -0,0 +1,98 @@ +void script_1049(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + cs2func_script_4590_struct(6,0,0) structdump_0; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + structdump_0 = script_4590(); + ivar6 = structdump_0.intpart_5; + ivar5 = structdump_0.intpart_4; + ivar4 = structdump_0.intpart_3; + ivar3 = structdump_0.intpart_2; + ivar2 = structdump_0.intpart_1; + ivar1 = structdump_0.intpart_0; + if (((boolean)arg0)) { + globalint_1651 = 0; + cs2method5006(0); + script_1558(0); + return; + } + if (arg0 == 2) { + script_1050(0, ""); + } else if (arg0 == 4) { + if (cs2method3612() > 0) { + script_1050(2, ""); + } else { + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Friends Chat channel."); + return; + } + } else if (arg0 == 6) { + if (ivar1 >= 0) { + if (ivar2 >= ivar3) { + script_1050(8, ""); + } else { + message(43, 0, "Your rank is not high enough to chat in the Clan Chat."); + return; + } + } else { + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Clan Chat channel."); + return; + } + } else { + if (arg0 == 7) { + globalint_1651 = 3; + cs2method5006(3); + script_1558(0); + return; + } + if (arg0 == 8) { + if (ivar4 >= 0) { + if (ivar5 >= ivar6) { + script_1050(10, ""); + } else { + message(43, 0, "Guests cannot chat in this visited Clan channel."); + return; + } + } else { + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't a guest in a Clan Chat channel."); + return; + } + } + } + if (arg0 == 3) { + globalint_1651 = 1; + cs2method5006(1); + script_1558(0); + return; + } + if (arg0 == 5) { + globalint_1651 = 2; + cs2method5006(2); + script_1558(0); + return; + } + return; +} diff --git a/dumps/scripts/105.cs2 b/dumps/scripts/105.cs2 new file mode 100644 index 000000000..88271a62b --- /dev/null +++ b/dumps/scripts/105.cs2 @@ -0,0 +1,22 @@ +void script_105() { + if (((boolean)globalint_1413)) { + return; + } + if (((boolean)globalint_11)) { + script_675(); + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter name of player to add to list"); + globalint_5 = 4; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/1050.cs2 b/dumps/scripts/1050.cs2 new file mode 100644 index 000000000..730afb567 --- /dev/null +++ b/dumps/scripts/1050.cs2 @@ -0,0 +1,51 @@ +void script_1050(int arg0,string arg1) { + int ivar1; + int ivar2; + int ivar3; + if (((boolean)globalint_1413)) { + return; + } + if ((arg0 == 2) && ((boolean)stringMethod4107("", cs2method3611()))) { + messageType0("You need to be in a Friends Chat channel to use Friends Channel Quick Chat."); + return; + } + if ((arg0 == 8) && cs2method3751()) { + messageType0("You need to be in a Clan to use Clan Channel Quick Chat."); + return; + } + if ((arg0 == 10) && cs2method3750()) { + messageType0("You need to be a guest in a Clan Channel to use Guest Clan Quick Chat."); + return; + } + if (getDisplayMode() >= 2) { + setWidgetSprite(1017, new WidgetPointer(752,1)); + cs2method2122(0, 49283073); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + script_1652(0); + setWidgetIsHidden(true, new WidgetPointer(746,75)); + } + setWidgetIsHidden(true, new WidgetPointer(137,50)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(false, new WidgetPointer(137,0)); + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(false, new WidgetPointer(137,17)); + setWidgetIsHidden(false, new WidgetPointer(137,1)); + setWidgetIsHidden(true, new WidgetPointer(137,3)); + cs2method2100(0, 0, new WidgetPointer(137,17)); + ivar1 = 85; + ivar2 = script_1036(); + ivar3 = 1; + if (arg0 == 3) { + ivar1 = 32769; + ivar2 = -1; + ivar3 = 0; + } + globalint_126 = arg0; + globalstring_27 = arg1; + globalint_127 = 1; + script_1062(8978433, 0, ivar1, ivar2, ivar3); + return; +} diff --git a/dumps/scripts/1051.cs2 b/dumps/scripts/1051.cs2 new file mode 100644 index 000000000..64509b61f --- /dev/null +++ b/dumps/scripts/1051.cs2 @@ -0,0 +1,25 @@ +void script_1051(int arg0,string arg1) { + globalint_126 = arg0; + globalstring_27 = arg1; + globalint_127 = 1; + if (getDisplayMode() >= 2) { + setWidgetSprite(1017, new WidgetPointer(752,1)); + cs2method2122(0, 49283073); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + script_1652(0); + setWidgetIsHidden(true, new WidgetPointer(746,75)); + } + setWidgetIsHidden(true, new WidgetPointer(137,50)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(false, new WidgetPointer(137,0)); + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(false, new WidgetPointer(137,17)); + setWidgetIsHidden(false, new WidgetPointer(137,1)); + setWidgetIsHidden(true, new WidgetPointer(137,3)); + cs2method2100(0, 0, new WidgetPointer(137,17)); + script_1062(8978433, 0, script_1036(), -1, 0); + return; +} diff --git a/dumps/scripts/1052.cs2 b/dumps/scripts/1052.cs2 new file mode 100644 index 000000000..bd7479454 --- /dev/null +++ b/dumps/scripts/1052.cs2 @@ -0,0 +1,28 @@ +void script_1052(int arg0,int arg1,string arg2) { + if ((arg1 == -1) || ((boolean)cs2method5056(arg1))) { + return; + } + globalint_126 = arg0; + globalstring_27 = arg2; + globalint_127 = 1; + if (getDisplayMode() >= 2) { + setWidgetSprite(1017, new WidgetPointer(752,1)); + cs2method2122(0, 49283073); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + script_1652(0); + setWidgetIsHidden(true, new WidgetPointer(746,75)); + } + setWidgetIsHidden(true, new WidgetPointer(137,50)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(false, new WidgetPointer(137,0)); + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(false, new WidgetPointer(137,17)); + setWidgetIsHidden(false, new WidgetPointer(137,1)); + setWidgetIsHidden(true, new WidgetPointer(137,3)); + cs2method2100(0, 0, new WidgetPointer(137,17)); + script_1063(8978433, arg1); + return; +} diff --git a/dumps/scripts/1053.cs2 b/dumps/scripts/1053.cs2 new file mode 100644 index 000000000..b26629b08 --- /dev/null +++ b/dumps/scripts/1053.cs2 @@ -0,0 +1,4 @@ +void script_1053() { + script_1054(); + return; +} diff --git a/dumps/scripts/1054.cs2 b/dumps/scripts/1054.cs2 new file mode 100644 index 000000000..9e9824fd1 --- /dev/null +++ b/dumps/scripts/1054.cs2 @@ -0,0 +1,15 @@ +void script_1054() { + int ivar0; + setWidgetIsHidden(false, new WidgetPointer(137,50)); + setScriptCallOnKeyPress(73, -2147483640, false, "iz", new WidgetPointer(137,56)); + setWidgetIsHidden(true, new WidgetPointer(137,0)); + ivar0 = 0; + while (((int)cs2method_3408(105, 73, 1550, ivar0)) != -1) { + setScriptCallOnKeyPress(-1, "", cs2method_3408(105, 73, 1550, ivar0)); + ivar0 = add(ivar0, 1); + } + if (getDisplayMode() >= 2) { + script_1364(); + } + return; +} diff --git a/dumps/scripts/1055.cs2 b/dumps/scripts/1055.cs2 new file mode 100644 index 000000000..d70fc9a3e --- /dev/null +++ b/dumps/scripts/1055.cs2 @@ -0,0 +1,4 @@ +void script_1055(int arg0) { + setWidgetSprite(416, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1056.cs2 b/dumps/scripts/1056.cs2 new file mode 100644 index 000000000..5aa25d257 --- /dev/null +++ b/dumps/scripts/1056.cs2 @@ -0,0 +1,4 @@ +void script_1056(int arg0) { + setWidgetSprite(415, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1057.cs2 b/dumps/scripts/1057.cs2 new file mode 100644 index 000000000..8c93e9861 --- /dev/null +++ b/dumps/scripts/1057.cs2 @@ -0,0 +1,4 @@ +void script_1057(int arg0) { + setWidgetSprite(418, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1058.cs2 b/dumps/scripts/1058.cs2 new file mode 100644 index 000000000..120efeeb3 --- /dev/null +++ b/dumps/scripts/1058.cs2 @@ -0,0 +1,4 @@ +void script_1058(int arg0) { + setWidgetSprite(417, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1059.cs2 b/dumps/scripts/1059.cs2 new file mode 100644 index 000000000..7750feafb --- /dev/null +++ b/dumps/scripts/1059.cs2 @@ -0,0 +1,141 @@ +void script_1059(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + if (isWidgetHidden(cs2method_3408(105, 73, 1550, add(arg3, 1)))) { + return; + } + ivar7 = ((int)cs2method_3408(105, 73, 1551, arg3)); + if (arg0 == 104) { + if (((boolean)arg6)) { + return; + } + if (setWidgetRegister(new WidgetPointer(ivar7), globalint_128)) { + setWidgetHidden(1); + } + if (globalint_128 <= 0) { + globalint_128 = subtract(arg6, 1); + } else { + globalint_128 = subtract(globalint_128, 1); + } + if (setWidgetRegister(new WidgetPointer(ivar7), globalint_128) && isWidgetHidden()) { + setWidgetHidden(0); + setWidgetRGB(new Color(87, 126, 69)); + } + return; + } + if (arg0 == 105) { + if (((boolean)arg6)) { + return; + } + if (setWidgetRegister(new WidgetPointer(ivar7), globalint_128)) { + setWidgetHidden(1); + } + if (globalint_128 == subtract(arg6, 1)) { + globalint_128 = 0; + } else { + globalint_128 = add(globalint_128, 1); + } + if (setWidgetRegister(new WidgetPointer(ivar7), globalint_128) && isWidgetHidden()) { + setWidgetHidden(0); + setWidgetRGB(new Color(87, 126, 69)); + } + return; + } + ivar8 = 0; + ivar9 = 0; + if (arg0 == 84) { + if (globalint_128 < 0) { + if ((arg4 != 32769) && ((boolean)arg3)) { + script_1900(((int)cs2method_3408(105, 73, 1550, arg3)), ((int)cs2method_3408(105, 73, 1551, arg3)), globalint_128, add(arg3, 1)); + } + } else if (arg4 != -1) { + ivar8 = cs2method5051(arg4); + ivar9 = cs2method5053(arg4); + if (globalint_128 == add(ivar8, ivar9)) { + if ((((boolean)arg3) && (script_1036() != -1)) && setWidgetRegister(cs2method_3408(105, 73, 1550, arg3), globalint_128)) { + script_1061(((int)cs2method_3408(105, 73, 1550, arg3)), ((int)cs2method_3408(105, 73, 1551, arg3)), globalint_128, arg2, add(arg3, 1), script_1036()); + } + } else if (globalint_128 < ivar8) { + script_1061(((int)cs2method_3408(105, 73, 1550, arg3)), ((int)cs2method_3408(105, 73, 1551, arg3)), globalint_128, arg2, add(arg3, 1), cs2method5052(arg4, globalint_128)); + } else if (globalint_128 < add(ivar8, ivar9)) { + script_1071(arg2, cs2method5054(arg4, subtract(globalint_128, ivar8)), arg3); + } else { + script_1900(((int)cs2method_3408(105, 73, 1550, arg3)), ((int)cs2method_3408(105, 73, 1551, arg3)), globalint_128, add(arg3, 1)); + } + } else { + if (arg5 != -1) { + ivar8 = 0; + ivar9 = cs2method5056(arg5); + script_1071(arg2, cs2method5057(arg5, globalint_128), arg3); + } + } + return; + } + if (arg0 == 102) { + script_1050(globalint_126, globalstring_27); + return; + } + if (arg0 == 13) { + script_1054(); + return; + } + if ((arg0 == 85) && (arg3 > 0)) { + script_1068(arg2, subtract(arg3, 1)); + return; + } + if (isAlphaNumeric(((char)arg1))) { + return; + } + arg1 = upper(((char)arg1)); + ivar10 = 0; + ivar11 = 0; + ivar12 = -1; + if (arg4 != -1) { + ivar8 = cs2method5051(arg4); + ivar9 = cs2method5053(arg4); + if ((((boolean)arg3) && ((boolean)stringMethod4107("X", concatChar(((char)arg1), "")))) && (script_1036() != -1)) { + ivar10 = add(ivar8, ivar9); + if (setWidgetRegister(cs2method_3408(105, 73, 1550, arg3), ivar10)) { + script_1061(((int)cs2method_3408(105, 73, 1550, arg3)), ((int)cs2method_3408(105, 73, 1551, arg3)), ivar10, arg2, add(arg3, 1), script_1036()); + } + return; + } + ivar10 = 0; + while (ivar11 < ivar8) { + ivar12 = upper(((char)cs2method5062(arg4, ivar11))); + if (ivar12 == arg1) { + script_1061(((int)cs2method_3408(105, 73, 1550, arg3)), ((int)cs2method_3408(105, 73, 1551, arg3)), ivar10, arg2, add(arg3, 1), cs2method5052(arg4, ivar10)); + return; + } + ivar10 = add(ivar10, 1); + ivar11 = add(ivar11, 1); + } + } else { + ivar8 = 0; + ivar9 = cs2method5056(arg5); + } + if (isDigit(((char)arg1))) { + return; + } + ivar13 = strIndexof(((char)arg1), 0, "0123456789"); + if (((boolean)ivar13)) { + ivar13 = 10; + } + if (ivar13 > ivar9) { + return; + } + ivar10 = subtract(ivar13, 1); + if (arg4 != -1) { + script_1071(arg2, cs2method5054(arg4, ivar10), arg3); + } else { + if (arg5 != -1) { + script_1071(arg2, cs2method5057(arg5, ivar10), arg3); + } + } + return; +} diff --git a/dumps/scripts/106.cs2 b/dumps/scripts/106.cs2 new file mode 100644 index 000000000..1a7c804f8 --- /dev/null +++ b/dumps/scripts/106.cs2 @@ -0,0 +1,48 @@ +void script_106(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + if (arg2 != 1) { + return; + } + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + while (ivar3 < getItemContainerLength(140)) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar3) && isWidgetHidden()) { + ivar4 = ivar3; + } + ivar3 = add(ivar3, 1); + } + ivar6 = divide(arg1, 5); + ivar5 = subtract(arg1, multiply(ivar6, 5)); + if (((ivar4 == subtract(arg1, 1)) && (ivar5 > 0)) && (setWidgetRegister(new WidgetPointer(arg0), arg1) && setWidgetRegister(new WidgetPointer(arg0), ivar4))) { + playSoundEffect(1859, 1, 0); + setWidgetPosition(multiply(56, subtract(ivar5, 1)), multiply(56, ivar6), 0, 0); + setWidgetPosition(multiply(56, ivar5), multiply(56, ivar6), 0, 0); + return; + } + if (((ivar4 == add(arg1, 1)) && (ivar5 < 5)) && (setWidgetRegister(new WidgetPointer(arg0), arg1) && setWidgetRegister(new WidgetPointer(arg0), ivar4))) { + playSoundEffect(1859, 1, 0); + setWidgetPosition(multiply(56, add(ivar5, 1)), multiply(56, ivar6), 0, 0); + setWidgetPosition(multiply(56, ivar5), multiply(56, ivar6), 0, 0); + return; + } + if (((ivar4 == subtract(arg1, 5)) && (ivar6 > 0)) && (setWidgetRegister(new WidgetPointer(arg0), arg1) && setWidgetRegister(new WidgetPointer(arg0), ivar4))) { + playSoundEffect(1859, 1, 0); + setWidgetPosition(multiply(56, ivar5), multiply(56, subtract(ivar6, 1)), 0, 0); + setWidgetPosition(multiply(56, ivar5), multiply(56, ivar6), 0, 0); + return; + } + if (((ivar4 == add(arg1, 5)) && (ivar6 < 5)) && (setWidgetRegister(new WidgetPointer(arg0), arg1) && setWidgetRegister(new WidgetPointer(arg0), ivar4))) { + playSoundEffect(1859, 1, 0); + setWidgetPosition(multiply(56, ivar5), multiply(56, add(ivar6, 1)), 0, 0); + setWidgetPosition(multiply(56, ivar5), multiply(56, ivar6), 0, 0); + return; + } + return; +} diff --git a/dumps/scripts/1060.cs2 b/dumps/scripts/1060.cs2 new file mode 100644 index 000000000..4e362ea52 --- /dev/null +++ b/dumps/scripts/1060.cs2 @@ -0,0 +1,4 @@ +void script_1060(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_1061(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/1061.cs2 b/dumps/scripts/1061.cs2 new file mode 100644 index 000000000..60e8d2ad5 --- /dev/null +++ b/dumps/scripts/1061.cs2 @@ -0,0 +1,25 @@ +void script_1061(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + globalint_159 = 0; + globalint_158 = 0; + ivar6 = 0; + while (setWidgetRegister(new WidgetPointer(arg0), ivar6)) { + if (ivar6 == arg2) { + setScriptCallOnMouseEntered(-1, ""); + setScriptCallOnMouseExit(-1, ""); + if (setWidgetRegister(new WidgetPointer(arg1), ivar6)) { + setWidgetHidden(0); + setWidgetRGB(new Color(150, 151, 119)); + } + } else { + setScriptCallOnMouseEntered(1082, subtract(arg4, 1), new WidgetPointer(arg1), ivar6, "iIi"); + setScriptCallOnMouseExit(1083, subtract(arg4, 1), new WidgetPointer(arg1), ivar6, "iIi"); + if (setWidgetRegister(new WidgetPointer(arg1), ivar6)) { + setWidgetHidden(1); + } + } + ivar6 = add(ivar6, 1); + } + script_1062(arg3, arg4, arg5, -1, 0); + return; +} diff --git a/dumps/scripts/1062.cs2 b/dumps/scripts/1062.cs2 new file mode 100644 index 000000000..a51ee3df8 --- /dev/null +++ b/dumps/scripts/1062.cs2 @@ -0,0 +1,186 @@ +void script_1062(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + string svar0; + ivar5 = ((int)cs2method_3408(105, 73, 1550, arg1)); + ivar6 = ((int)cs2method_3408(105, 73, 1551, arg1)); + deleteAllExtraChilds(new WidgetPointer(ivar5)); + deleteAllExtraChilds(new WidgetPointer(ivar6)); + if (ivar5 == -1) { + return; + } + createExtraChild(new WidgetPointer(arg0), 4, arg1); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(495); + setWidgetTextAlignment(1, 1, 0); + svar0 = cs2method5050(arg2); + cs2method1305(svar0); + setScriptCallOnClickContextMenu(1067, new WidgetPointer(arg0), arg1, "Ii"); + setWidgetContextMenuOption(1, "Return to: "); + if (arg1 > 0) { + svar0 = " " + "" + svar0 + " " + ""; + } else if (((boolean)globalint_126)) { + svar0 = " To " + globalstring_27 + ": " + "" + svar0 + " " + ""; + } else if (globalint_126 == 2) { + svar0 = " [" + "" + cs2method3611() + "" + "]: " + "" + svar0 + " " + ""; + } else if (globalint_126 == 8) { + if (cs2method3751()) { + svar0 = " [" + "" + cs2method3752() + "" + "]: " + "" + svar0 + " " + ""; + } + } else if (globalint_126 == 10) { + if (cs2method3750()) { + svar0 = " [" + "" + cs2method3752() + "" + "]: " + "" + svar0 + " " + ""; + } + } else { + svar0 = " " + "" + svar0 + " " + ""; + } + setWidgetText(svar0); + setWidgetUnknownBoolean(false); + setWidgetSize(add(getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg0)), 495, svar0), 4), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0); + setScriptCallOnMouseEntered(1080, new WidgetPointer(137,2), arg1, "Ii"); + setScriptCallOnMouseExit(1081, new WidgetPointer(137,2), arg1, "Ii"); + createExtraChild(new WidgetPointer(137,2), 3, arg1); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + setWidgetHidden(1); + setWidgetIsHidden(false, new WidgetPointer(ivar5)); + ivar7 = cs2method5051(arg2); + ivar8 = cs2method5053(arg2); + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = -1; + ivar14 = -1; + ivar15 = -1; + ivar16 = 0; + while (ivar9 < ivar7) { + createExtraChild(new WidgetPointer(ivar5), 4, ivar10); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + ivar13 = cs2method5052(arg2, ivar9); + svar0 = cs2method5050(ivar13); + setScriptCallOnClickContextMenu(1060, new WidgetPointer(ivar5), new WidgetPointer(ivar6), ivar10, new WidgetPointer(arg0), add(arg1, 1), ivar13, "IIiIik"); + cs2method1305(svar0); + setWidgetContextMenuOption(1, "Select: "); + setScriptCallOnMouseEntered(1082, arg1, new WidgetPointer(ivar6), ivar10, "iIi"); + setScriptCallOnMouseExit(1083, arg1, new WidgetPointer(ivar6), ivar10, "iIi"); + ivar15 = upper(((char)cs2method5062(arg2, ivar9))); + if (isAlphaNumeric(((char)ivar15))) { + svar0 = "" + concatChar(((char)ivar15), "") + ". " + "" + svar0 + " " + ""; + } else { + svar0 = svar0 + " " + ""; + } + setWidgetText(svar0); + setWidgetUnknownBoolean(false); + ivar11 = getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg0)), 495, svar0); + if (ivar11 > ivar12) { + ivar12 = ivar11; + } + ivar9 = add(ivar9, 1); + ivar10 = add(ivar10, 1); + } + ivar9 = 0; + while (ivar9 < ivar8) { + createExtraChild(new WidgetPointer(ivar5), 4, ivar10); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + ivar14 = cs2method5054(arg2, ivar9); + svar0 = cs2method5055(ivar14); + setScriptCallOnClickContextMenu(1070, new WidgetPointer(arg0), ivar14, arg1, "Iei"); + cs2method1305(svar0); + setWidgetContextMenuOption(1, "Send: "); + setScriptCallOnMouseEntered(1082, arg1, new WidgetPointer(ivar6), ivar10, "iIi"); + setScriptCallOnMouseExit(1083, arg1, new WidgetPointer(ivar6), ivar10, "iIi"); + if (ivar9 < 10) { + svar0 = "" + intToStr(mod(add(ivar9, 1), 10)) + ". " + "" + svar0; + } + setWidgetText(svar0); + setWidgetUnknownBoolean(false); + ivar11 = getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg0)), 495, svar0); + if (ivar11 > ivar12) { + ivar12 = ivar11; + } + ivar9 = add(ivar9, 1); + ivar10 = add(ivar10, 1); + } + if (arg3 != -1) { + createExtraChild(new WidgetPointer(ivar5), 4, ivar10); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + svar0 = cs2method5050(arg3); + setScriptCallOnClickContextMenu(1060, new WidgetPointer(ivar5), new WidgetPointer(ivar6), ivar10, new WidgetPointer(arg0), add(arg1, 1), arg3, "IIiIik"); + cs2method1305(svar0); + setWidgetContextMenuOption(1, "Select: "); + setScriptCallOnMouseEntered(1082, arg1, new WidgetPointer(ivar6), ivar10, "iIi"); + setScriptCallOnMouseExit(1083, arg1, new WidgetPointer(ivar6), ivar10, "iIi"); + svar0 = "" + "X. " + "" + svar0 + " " + ""; + setWidgetText(svar0); + setWidgetUnknownBoolean(false); + ivar11 = getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg0)), 495, svar0); + if (ivar11 > ivar12) { + ivar12 = ivar11; + } + ivar10 = add(ivar10, 1); + } + if (((boolean)arg4)) { + createExtraChild(new WidgetPointer(ivar5), 4, ivar10); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + setScriptCallOnClickContextMenu(1877, new WidgetPointer(ivar5), new WidgetPointer(ivar6), ivar10, arg1, "IIii"); + cs2method1305("Search phrases"); + setWidgetContextMenuOption(1, "Select: "); + setScriptCallOnMouseEntered(1082, arg1, new WidgetPointer(ivar6), ivar10, "iIi"); + setScriptCallOnMouseExit(1083, arg1, new WidgetPointer(ivar6), ivar10, "iIi"); + setWidgetText("" + "Enter. " + "" + "Search " + ""); + setWidgetUnknownBoolean(false); + ivar11 = getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg0)), 495, svar0); + if (ivar11 > ivar12) { + ivar12 = ivar11; + } + ivar10 = add(ivar10, 1); + } + setScriptCallOnKeyPress(1059, -2147483640, false, new WidgetPointer(arg0), arg1, arg2, -1, ivar10, "izIikei", new WidgetPointer(ivar5)); + ivar9 = 0; + ivar17 = 0; + while (setWidgetRegister(new WidgetPointer(ivar5), ivar9)) { + if (add(multiply(ivar16, 14), 14) > getWidgetActualHeight(new WidgetPointer(ivar5))) { + ivar17 = add(add(ivar17, ivar12), 4); + ivar16 = 0; + } + setWidgetSize(ivar12, 14, 0, 0); + setWidgetPosition(add(ivar17, 2), multiply(ivar16, 14), 0, 0); + createExtraChild(new WidgetPointer(ivar6), 3, ivar9); + setWidgetSize(add(getWidgetActualWidth(), 4), getWidgetActualHeight(), 0, 0); + setWidgetPosition(subtract(getWidgetActualX(), 2), getWidgetActualY(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + setWidgetHidden(1); + ivar9 = add(ivar9, 1); + ivar16 = add(ivar16, 1); + } + ivar17 = add(add(ivar17, ivar12), 4); + ivar18 = getWidgetParentId(new WidgetPointer(ivar5)); + setWidgetSize(ivar17, getWidgetActualHeight(new WidgetPointer(ivar18)), 0, 0, new WidgetPointer(ivar5)); + setWidgetSize(ivar17, getWidgetActualHeight(new WidgetPointer(ivar18)), 0, 0, new WidgetPointer(ivar6)); + setWidgetPosition(add(getWidgetActualX(new WidgetPointer(ivar5)), ivar17), 0, 0, 0, cs2method_3408(105, 73, 1550, add(arg1, 1))); + script_1068(arg0, arg1); + return; +} diff --git a/dumps/scripts/1063.cs2 b/dumps/scripts/1063.cs2 new file mode 100644 index 000000000..366d47a32 --- /dev/null +++ b/dumps/scripts/1063.cs2 @@ -0,0 +1,99 @@ +void script_1063(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + string svar0; + ivar2 = ((int)cs2method_3408(105, 73, 1550, 0)); + ivar3 = ((int)cs2method_3408(105, 73, 1551, 0)); + deleteAllExtraChilds(new WidgetPointer(ivar2)); + deleteAllExtraChilds(new WidgetPointer(ivar3)); + createExtraChild(new WidgetPointer(arg0), 4, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + setWidgetPosition(0, 0, 0, 0); + svar0 = cs2method5055(arg1); + if (((boolean)globalint_126)) { + svar0 = "From " + globalstring_27 + ": " + "" + svar0; + } else if (globalint_126 == 2) { + svar0 = "[" + "" + cs2method3611() + "" + "] " + globalstring_27 + ": " + "" + svar0; + } else if (globalint_126 == 8) { + if (cs2method3751()) { + svar0 = "[" + "" + cs2method3752() + "" + "] " + globalstring_27 + ": " + "" + svar0; + } + } else if (globalint_126 == 10) { + if (cs2method3750()) { + svar0 = "[" + "" + cs2method3752() + "" + "] " + globalstring_27 + ": " + "" + svar0; + } + } else { + svar0 = globalstring_27 + ": " + "" + svar0; + } + setWidgetText(svar0); + setWidgetUnknownBoolean(false); + setWidgetSize(getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg0)), 495, svar0), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0); + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + ivar4 = cs2method5056(arg1); + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = -1; + ivar10 = 0; + while (ivar5 < ivar4) { + createExtraChild(new WidgetPointer(ivar2), 4, ivar6); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + ivar9 = cs2method5057(arg1, ivar5); + svar0 = cs2method5055(ivar9); + setScriptCallOnClickContextMenu(1070, new WidgetPointer(arg0), ivar9, 0, "Iei"); + cs2method1305(svar0); + setWidgetContextMenuOption(1, "Send: "); + setScriptCallOnMouseEntered(1082, 0, new WidgetPointer(ivar3), ivar6, "iIi"); + setScriptCallOnMouseExit(1083, 0, new WidgetPointer(ivar3), ivar6, "iIi"); + if (ivar5 < 10) { + svar0 = "" + intToStr(mod(add(ivar5, 1), 10)) + ". " + "" + svar0; + } + setWidgetText(svar0); + setWidgetUnknownBoolean(false); + ivar7 = getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg0)), 495, svar0); + if (ivar7 > ivar8) { + ivar8 = ivar7; + } + ivar5 = add(ivar5, 1); + ivar6 = add(ivar6, 1); + } + setScriptCallOnKeyPress(1059, -2147483640, false, new WidgetPointer(arg0), 0, -1, arg1, ivar6, "izIikei", new WidgetPointer(ivar2)); + ivar5 = 0; + ivar11 = 0; + while (setWidgetRegister(new WidgetPointer(ivar2), ivar5)) { + if (add(multiply(ivar10, 14), 14) > getWidgetActualHeight(new WidgetPointer(ivar2))) { + ivar11 = add(add(ivar11, ivar8), 4); + ivar10 = 0; + } + setWidgetSize(ivar8, 14, 0, 0); + setWidgetPosition(add(ivar11, 2), multiply(ivar10, 14), 0, 0); + createExtraChild(new WidgetPointer(ivar3), 3, ivar5); + setWidgetSize(add(getWidgetActualWidth(), 4), getWidgetActualHeight(), 0, 0); + setWidgetPosition(subtract(getWidgetActualX(), 2), getWidgetActualY(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + setWidgetHidden(1); + ivar5 = add(ivar5, 1); + ivar10 = add(ivar10, 1); + } + ivar11 = add(add(ivar11, ivar8), 4); + ivar12 = getWidgetParentId(new WidgetPointer(ivar2)); + setWidgetSize(ivar11, getWidgetActualHeight(new WidgetPointer(ivar12)), 0, 0, new WidgetPointer(ivar2)); + setWidgetSize(ivar11, getWidgetActualHeight(new WidgetPointer(ivar12)), 0, 0, new WidgetPointer(ivar3)); + script_1068(arg0, 0); + return; +} diff --git a/dumps/scripts/1064.cs2 b/dumps/scripts/1064.cs2 new file mode 100644 index 000000000..da39f5be6 --- /dev/null +++ b/dumps/scripts/1064.cs2 @@ -0,0 +1,29 @@ +void script_1064(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar1 = ((int)cs2method_3408(105, 73, 1550, arg0)); + ivar2 = getWidgetParentId(new WidgetPointer(ivar1)); + if (((boolean)getWidgetScrollMaxH(new WidgetPointer(ivar2)))) { + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar2)), 0, new WidgetPointer(ivar2)); + } + ivar3 = getWidgetActualWidth(new WidgetPointer(ivar1)); + ivar4 = getWidgetActualX(new WidgetPointer(ivar1)); + while (arg0 > 0) { + arg0 = subtract(arg0, 1); + ivar1 = ((int)cs2method_3408(105, 73, 1550, arg0)); + if (isWidgetHidden(new WidgetPointer(ivar1)) && (add(ivar3, getWidgetActualWidth(new WidgetPointer(ivar1))) <= getWidgetActualWidth(new WidgetPointer(ivar2)))) { + ivar3 = add(ivar3, getWidgetActualWidth(new WidgetPointer(ivar1))); + ivar4 = getWidgetActualX(new WidgetPointer(ivar1)); + } else { + arg0 = -1; + } + } + if (cs2method2600(new WidgetPointer(ivar2)) == ivar4) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar2)); + } else { + setScriptCallOnGameloop(1065, new WidgetPointer(ivar2), ivar4, "Ii", new WidgetPointer(ivar2)); + } + return; +} diff --git a/dumps/scripts/1065.cs2 b/dumps/scripts/1065.cs2 new file mode 100644 index 000000000..9376210e0 --- /dev/null +++ b/dumps/scripts/1065.cs2 @@ -0,0 +1,25 @@ +void script_1065(int arg0,int arg1) { + if (cs2method2600(new WidgetPointer(arg0)) > arg1) { + setWidgetScrollMax(subtract(getWidgetScrollMaxH(new WidgetPointer(arg0)), 10), 0, new WidgetPointer(arg0)); + cs2method2100(subtract(cs2method2600(new WidgetPointer(arg0)), 10), 0, new WidgetPointer(arg0)); + if (cs2method2600(new WidgetPointer(arg0)) < arg1) { + setWidgetScrollMax(add(arg1, getWidgetActualWidth(new WidgetPointer(arg0))), 0, new WidgetPointer(arg0)); + cs2method2100(arg1, 0, new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + } + } else if (cs2method2600(new WidgetPointer(arg0)) < arg1) { + setWidgetScrollMax(add(getWidgetScrollMaxH(new WidgetPointer(arg0)), 10), 0, new WidgetPointer(arg0)); + cs2method2100(add(cs2method2600(new WidgetPointer(arg0)), 10), 0, new WidgetPointer(arg0)); + if (cs2method2600(new WidgetPointer(arg0)) > arg1) { + setWidgetScrollMax(add(arg1, getWidgetActualWidth(new WidgetPointer(arg0))), 0, new WidgetPointer(arg0)); + cs2method2100(arg1, 0, new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + } + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + } + return; +} diff --git a/dumps/scripts/1066.cs2 b/dumps/scripts/1066.cs2 new file mode 100644 index 000000000..8ba760828 --- /dev/null +++ b/dumps/scripts/1066.cs2 @@ -0,0 +1,80 @@ +void script_1066(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + while (setWidgetRegister(new WidgetPointer(arg0), ivar4)) { + ivar3 = add(ivar3, getWidgetActualWidth()); + ivar4 = add(ivar4, 1); + } + if (ivar3 <= ivar2) { + ivar4 = 0; + ivar5 = 0; + while (setWidgetRegister(new WidgetPointer(arg0), ivar4)) { + setWidgetHidden(0); + setWidgetPosition(ivar5, 0, 0, 0); + if (setWidgetRegister(new WidgetPointer(137,2), ivar4)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + } + ivar5 = add(ivar5, getWidgetActualWidth()); + ivar4 = add(ivar4, 1); + } + return; + } + createExtraChild(new WidgetPointer(arg0), 4, add(arg1, 1)); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(" ... " + ""); + setWidgetUnknownBoolean(false); + setWidgetSize(getMaxLineWidth(ivar2, 495, " ... " + ""), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0); + ivar3 = getWidgetActualWidth(); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar3 = add(ivar3, getWidgetActualWidth()); + } + ivar4 = 0; + while (ivar4 < arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar4)) { + if (add(ivar3, getWidgetActualWidth()) <= ivar2) { + setWidgetHidden(0); + ivar3 = add(ivar3, getWidgetActualWidth()); + } else { + setWidgetHidden(1); + } + } + ivar4 = add(ivar4, 1); + } + ivar4 = 0; + ivar5 = 0; + while (ivar4 < arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar4)) { + if (isWidgetHidden()) { + setWidgetPosition(ivar5, 0, 0, 0); + if (setWidgetRegister(new WidgetPointer(137,2), ivar4)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + } + ivar5 = add(ivar5, getWidgetActualWidth()); + } else { + if (setWidgetRegister(new WidgetPointer(137,2), ivar4)) { + setWidgetHidden(1); + } + } + } + ivar4 = add(ivar4, 1); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 1))) { + setWidgetPosition(ivar5, 0, 0, 0); + ivar5 = add(ivar5, getWidgetActualWidth()); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetPosition(ivar5, 0, 0, 0); + if (setWidgetRegister(new WidgetPointer(137,2), ivar4)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + } + } + return; +} diff --git a/dumps/scripts/1067.cs2 b/dumps/scripts/1067.cs2 new file mode 100644 index 000000000..378a56bb4 --- /dev/null +++ b/dumps/scripts/1067.cs2 @@ -0,0 +1,4 @@ +void script_1067(int arg0,int arg1) { + script_1068(arg0, arg1); + return; +} diff --git a/dumps/scripts/1068.cs2 b/dumps/scripts/1068.cs2 new file mode 100644 index 000000000..1aac1c979 --- /dev/null +++ b/dumps/scripts/1068.cs2 @@ -0,0 +1,40 @@ +void script_1068(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = add(arg1, 1); + ivar3 = ((int)cs2method_3408(105, 73, 1550, ivar2)); + ivar4 = ((int)cs2method_3408(105, 73, 1551, ivar2)); + while (ivar3 != -1) { + deleteAllExtraChilds(new WidgetPointer(ivar3)); + deleteAllExtraChilds(new WidgetPointer(ivar4)); + setWidgetIsHidden(true, new WidgetPointer(ivar3)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(ivar3)); + ivar3 = ((int)cs2method_3408(105, 73, 1550, ivar2)); + ivar4 = ((int)cs2method_3408(105, 73, 1551, ivar2)); + ivar2 = add(ivar2, 1); + } + ivar2 = add(arg1, 1); + while (setWidgetRegister(new WidgetPointer(arg0), ivar2)) { + deleteExtraChild(); + if (setWidgetRegister(new WidgetPointer(137,2), ivar2)) { + deleteExtraChild(); + } + ivar2 = add(ivar2, 1); + } + ivar2 = 0; + ivar3 = ((int)cs2method_3408(105, 73, 1550, arg1)); + ivar4 = ((int)cs2method_3408(105, 73, 1551, arg1)); + while (setWidgetRegister(new WidgetPointer(ivar3), ivar2)) { + setScriptCallOnMouseEntered(1082, arg1, new WidgetPointer(ivar4), ivar2, "iIi"); + setScriptCallOnMouseExit(1083, arg1, new WidgetPointer(ivar4), ivar2, "iIi"); + if (setWidgetRegister(new WidgetPointer(ivar4), ivar2)) { + setWidgetHidden(1); + } + ivar2 = add(ivar2, 1); + } + globalint_128 = -1; + script_1064(arg1); + script_1066(arg0, arg1); + return; +} diff --git a/dumps/scripts/1069.cs2 b/dumps/scripts/1069.cs2 new file mode 100644 index 000000000..0df720e1d --- /dev/null +++ b/dumps/scripts/1069.cs2 @@ -0,0 +1,25 @@ +void script_1069() { + globalint_126 = globalint_131; + globalstring_27 = globalstring_28; + globalint_127 = 0; + if (isWidgetHidden(new WidgetPointer(137,0))) { + if (getDisplayMode() >= 2) { + setWidgetSprite(1017, new WidgetPointer(752,1)); + cs2method2122(0, 49283073); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } + setWidgetIsHidden(true, new WidgetPointer(137,50)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(false, new WidgetPointer(137,0)); + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(false, new WidgetPointer(137,17)); + setWidgetIsHidden(false, new WidgetPointer(137,1)); + setWidgetIsHidden(true, new WidgetPointer(137,3)); + cs2method2100(0, 0, new WidgetPointer(137,17)); + } + script_1071(8978433, globalint_130, -1); + return; +} diff --git a/dumps/scripts/107.cs2 b/dumps/scripts/107.cs2 new file mode 100644 index 000000000..2ecc1bd91 --- /dev/null +++ b/dumps/scripts/107.cs2 @@ -0,0 +1,24 @@ +void script_107(string arg0) { + if (((boolean)globalint_1413)) { + return; + } + if (((boolean)globalint_11)) { + messageType0("You can't do that while you're reporting abuse."); + return; + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + globalstring_23 = arg0; + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter message to send to " + globalstring_23); + globalint_5 = 6; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/1070.cs2 b/dumps/scripts/1070.cs2 new file mode 100644 index 000000000..41629e9cd --- /dev/null +++ b/dumps/scripts/1070.cs2 @@ -0,0 +1,4 @@ +void script_1070(int arg0,int arg1,int arg2) { + script_1071(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1071.cs2 b/dumps/scripts/1071.cs2 new file mode 100644 index 000000000..e97b93d32 --- /dev/null +++ b/dumps/scripts/1071.cs2 @@ -0,0 +1,12 @@ +void script_1071(int arg0,int arg1,int arg2) { + if (arg2 >= 0) { + script_1068(arg0, arg2); + } + globalint_134 = 0; + if (cs2method5066(arg1) > 0) { + script_1072(arg0, arg1); + } else { + script_1077(arg1); + } + return; +} diff --git a/dumps/scripts/1072.cs2 b/dumps/scripts/1072.cs2 new file mode 100644 index 000000000..fe7a07bcf --- /dev/null +++ b/dumps/scripts/1072.cs2 @@ -0,0 +1,38 @@ +void script_1072(int arg0,int arg1) { + int ivar2; + int ivar3; + flow_0: + ivar2 = cs2method5066(arg1); + ivar3 = 0; + IF ((ivar2 > 0) && (globalint_134 < ivar2)) + GOTO flow_2 + GOTO flow_12 + flow_1: + flow_2: + IF (globalint_134 < 10) + GOTO flow_3 + GOTO flow_12 + flow_3: + ivar3 = cs2method5067(arg1, globalint_134); + if (((boolean)ivar3)) { + script_1044(arg1); + return; + } + if (((boolean)ivar3)) { + script_1037(arg1, 0); + return; + } + if (ivar3 == 10) { + script_1037(arg1, 1); + return; + } + if (ivar3 == 2) { + script_1047(arg1); + return; + } + globalint_134 = add(globalint_134, 1); + GOTO flow_1 + flow_12: + script_1077(arg1); + return; +} diff --git a/dumps/scripts/1073.cs2 b/dumps/scripts/1073.cs2 new file mode 100644 index 000000000..bca4fe8f8 --- /dev/null +++ b/dumps/scripts/1073.cs2 @@ -0,0 +1,4 @@ +void script_1073(int arg0,int arg1,int arg2) { + script_1074(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1074.cs2 b/dumps/scripts/1074.cs2 new file mode 100644 index 000000000..c748f8dc7 --- /dev/null +++ b/dumps/scripts/1074.cs2 @@ -0,0 +1,36 @@ +void script_1074(int arg0,int arg1,int arg2) { + switch (globalint_134) { + case 0: + globalint_135 = arg2; + break; + case 1: + globalint_136 = arg2; + break; + case 2: + globalint_137 = arg2; + break; + case 3: + globalint_138 = arg2; + break; + case 4: + globalint_139 = arg2; + break; + case 5: + globalint_140 = arg2; + break; + case 6: + globalint_141 = arg2; + break; + case 7: + globalint_142 = arg2; + break; + case 8: + globalint_143 = arg2; + break; + case 9: + globalint_144 = arg2; + } + globalint_134 = add(globalint_134, 1); + script_1072(arg0, arg1); + return; +} diff --git a/dumps/scripts/1075.cs2 b/dumps/scripts/1075.cs2 new file mode 100644 index 000000000..9908993a4 --- /dev/null +++ b/dumps/scripts/1075.cs2 @@ -0,0 +1,4 @@ +void script_1075(int arg0,int arg1,int arg2) { + script_1076(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1076.cs2 b/dumps/scripts/1076.cs2 new file mode 100644 index 000000000..80735fbfc --- /dev/null +++ b/dumps/scripts/1076.cs2 @@ -0,0 +1,36 @@ +void script_1076(int arg0,int arg1,int arg2) { + switch (globalint_134) { + case 0: + globalint_145 = arg2; + break; + case 1: + globalint_146 = arg2; + break; + case 2: + globalint_147 = arg2; + break; + case 3: + globalint_148 = arg2; + break; + case 4: + globalint_149 = arg2; + break; + case 5: + globalint_150 = arg2; + break; + case 6: + globalint_151 = arg2; + break; + case 7: + globalint_152 = arg2; + break; + case 8: + globalint_153 = arg2; + break; + case 9: + globalint_154 = arg2; + } + globalint_134 = add(globalint_134, 1); + script_1072(arg0, arg1); + return; +} diff --git a/dumps/scripts/1077.cs2 b/dumps/scripts/1077.cs2 new file mode 100644 index 000000000..f5c7b3a97 --- /dev/null +++ b/dumps/scripts/1077.cs2 @@ -0,0 +1,105 @@ +void script_1077(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + flow_0: + ivar1 = arg0; + if (arg0 == 105) { + if (bitconfig_7774 != 0) { + arg0 = 1021; + } else { + if (((boolean)standart_config_394)) { + arg0 = 561; + } + } + } + cs2method5058(arg0); + ivar2 = 0; + ivar3 = cs2method5066(arg0); + ivar4 = -1; + while ((ivar2 < ivar3) && (ivar2 < 10)) { + switch (cs2method5067(arg0, ivar2)) { + case 0: + script_1078(ivar2); + break; + case 1: + script_1079(ivar2); + break; + case 10: + script_1079(ivar2); + break; + case 2: + script_1078(ivar2); + } + ivar2 = add(ivar2, 1); + } + IF (((boolean)globalint_126) || (globalint_126 == 4)) + GOTO flow_15 + GOTO flow_16 + flow_15: + cs2method5059(); + GOTO flow_36 + flow_16: + IF (((boolean)globalint_126)) + GOTO flow_17 + GOTO flow_23 + flow_17: + ivar4 = script_1090(globalstring_27); + if (((boolean)ivar4)) { + cs2method5060(strRemoveEntities(globalstring_27)); + script_1089(); + } else if (ivar4 == -1) { + messageType0("Sorry, this user is not on your Friends List."); + } else { + messageType0("Sorry, your friend is no longer playing RuneScape."); + } + GOTO flow_36 + flow_23: + IF (globalint_126 == 5) + GOTO flow_24 + GOTO flow_25 + flow_24: + cs2method5060(strRemoveEntities(globalstring_27)); + script_1089(); + GOTO flow_36 + flow_25: + IF ((globalint_126 == 3) || (globalint_126 == 7)) + GOTO flow_26 + GOTO flow_27 + flow_26: + cs2method5060(strRemoveEntities(globalstring_27)); + script_1089(); + GOTO flow_36 + flow_27: + IF ((globalint_126 == 2) || (globalint_126 == 6)) + GOTO flow_28 + GOTO flow_29 + flow_28: + cs2method5061(); + GOTO flow_36 + flow_29: + IF ((globalint_126 == 8) || (globalint_126 == 9)) + GOTO flow_30 + GOTO flow_33 + flow_30: + if (cs2method3751()) { + cs2method5074(); + } + GOTO flow_36 + flow_33: + IF (globalint_126 == 10) + GOTO flow_34 + IF ((globalint_126 == 11) && cs2method3750()) + GOTO flow_35 + GOTO flow_36 + flow_34: + flow_35: + cs2method5075(); + flow_36: + globalint_130 = ivar1; + globalint_131 = globalint_126; + globalstring_28 = globalstring_27; + script_1054(); + return; +} diff --git a/dumps/scripts/1078.cs2 b/dumps/scripts/1078.cs2 new file mode 100644 index 000000000..04d665bbe --- /dev/null +++ b/dumps/scripts/1078.cs2 @@ -0,0 +1,34 @@ +void script_1078(int arg0) { + switch (arg0) { + case 0: + cs2method5068(0, globalint_135); + break; + case 1: + cs2method5068(1, globalint_136); + break; + case 2: + cs2method5068(2, globalint_137); + break; + case 3: + cs2method5068(3, globalint_138); + break; + case 4: + cs2method5068(4, globalint_139); + break; + case 5: + cs2method5068(5, globalint_140); + break; + case 6: + cs2method5068(6, globalint_141); + break; + case 7: + cs2method5068(7, globalint_142); + break; + case 8: + cs2method5068(8, globalint_143); + break; + case 9: + cs2method5068(9, globalint_144); + } + return; +} diff --git a/dumps/scripts/1079.cs2 b/dumps/scripts/1079.cs2 new file mode 100644 index 000000000..16ae40e52 --- /dev/null +++ b/dumps/scripts/1079.cs2 @@ -0,0 +1,34 @@ +void script_1079(int arg0) { + switch (arg0) { + case 0: + cs2method5069(0, globalint_145); + break; + case 1: + cs2method5069(1, globalint_146); + break; + case 2: + cs2method5069(2, globalint_147); + break; + case 3: + cs2method5069(3, globalint_148); + break; + case 4: + cs2method5069(4, globalint_149); + break; + case 5: + cs2method5069(5, globalint_150); + break; + case 6: + cs2method5069(6, globalint_151); + break; + case 7: + cs2method5069(7, globalint_152); + break; + case 8: + cs2method5069(8, globalint_153); + break; + case 9: + cs2method5069(9, globalint_154); + } + return; +} diff --git a/dumps/scripts/108.cs2 b/dumps/scripts/108.cs2 new file mode 100644 index 000000000..e5d3ef513 --- /dev/null +++ b/dumps/scripts/108.cs2 @@ -0,0 +1,17 @@ +void script_108(string arg0) { + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), arg0); + globalint_5 = 7; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + setScriptCallOnWindowPaneRefresh(138, "", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/1080.cs2 b/dumps/scripts/1080.cs2 new file mode 100644 index 000000000..365039541 --- /dev/null +++ b/dumps/scripts/1080.cs2 @@ -0,0 +1,7 @@ +void script_1080(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetHidden(0); + setWidgetRGB(new Color(87, 126, 69)); + } + return; +} diff --git a/dumps/scripts/1081.cs2 b/dumps/scripts/1081.cs2 new file mode 100644 index 000000000..ce5207db0 --- /dev/null +++ b/dumps/scripts/1081.cs2 @@ -0,0 +1,6 @@ +void script_1081(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetHidden(1); + } + return; +} diff --git a/dumps/scripts/1082.cs2 b/dumps/scripts/1082.cs2 new file mode 100644 index 000000000..20e18667a --- /dev/null +++ b/dumps/scripts/1082.cs2 @@ -0,0 +1,35 @@ +void script_1082(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = add(arg0, 1); + if (isWidgetHidden(cs2method_3408(105, 73, 1550, ivar3))) { + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetHidden(0); + setWidgetRGB(new Color(150, 151, 119)); + } + if (globalint_128 >= 0) { + ivar3 = add(ivar3, 1); + while (isWidgetHidden(cs2method_3408(105, 73, 1550, ivar3))) { + ivar3 = add(ivar3, 1); + } + if (setWidgetRegister(cs2method_3408(105, 73, 1551, subtract(ivar3, 1)), globalint_128)) { + setWidgetHidden(1); + } + globalint_128 = -1; + } + return; + } + if (globalint_128 == arg2) { + return; + } + if ((globalint_128 >= 0) && setWidgetRegister(new WidgetPointer(arg1), globalint_128)) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + if (isWidgetHidden()) { + setWidgetHidden(0); + setWidgetRGB(new Color(87, 126, 69)); + } + globalint_128 = arg2; + } + return; +} diff --git a/dumps/scripts/1083.cs2 b/dumps/scripts/1083.cs2 new file mode 100644 index 000000000..a52d438f1 --- /dev/null +++ b/dumps/scripts/1083.cs2 @@ -0,0 +1,4 @@ +void script_1083(int arg0,int arg1,int arg2) { + script_1084(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1084.cs2 b/dumps/scripts/1084.cs2 new file mode 100644 index 000000000..9a66443c4 --- /dev/null +++ b/dumps/scripts/1084.cs2 @@ -0,0 +1,9 @@ +void script_1084(int arg0,int arg1,int arg2) { + if (isWidgetHidden(cs2method_3408(105, 73, 1550, add(arg0, 1)))) { + return; + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetHidden(1); + } + return; +} diff --git a/dumps/scripts/1085.cs2 b/dumps/scripts/1085.cs2 new file mode 100644 index 000000000..91ea5ee63 --- /dev/null +++ b/dumps/scripts/1085.cs2 @@ -0,0 +1,4 @@ +void script_1085(int arg0,int arg1,int arg2,int arg3) { + script_1086(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/1086.cs2 b/dumps/scripts/1086.cs2 new file mode 100644 index 000000000..fba93219f --- /dev/null +++ b/dumps/scripts/1086.cs2 @@ -0,0 +1,60 @@ +void script_1086(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar4 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar5 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar6 = 0; + if (arg1 > 0) { + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, arg1, 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + ivar6 = add(ivar6, 1); + } + if (arg2 > 0) { + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, arg2, 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + ivar6 = add(ivar6, 1); + } + if (arg3 > 0) { + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, arg3, 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + ivar6 = add(ivar6, 1); + } + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + ivar6 = add(ivar6, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, subtract(ivar5, 32), 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + setWidgetVFlip(1); + ivar6 = add(ivar6, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, 1, 0, 0); + setWidgetSize(32, subtract(ivar5, 2), 0, 0); + setWidgetSprite(1077); + cs2method1107(1); + ivar6 = add(ivar6, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(subtract(ivar4, 32), 1, 0, 0); + setWidgetSize(32, subtract(ivar5, 2), 0, 0); + setWidgetSprite(1077); + cs2method1107(1); + setWidgetHFlip(1); + ivar6 = add(ivar6, 1); + return; +} diff --git a/dumps/scripts/1087.cs2 b/dumps/scripts/1087.cs2 new file mode 100644 index 000000000..191ee0933 --- /dev/null +++ b/dumps/scripts/1087.cs2 @@ -0,0 +1,4 @@ +void script_1087(int arg0,int arg1) { + script_1088(arg0, arg1); + return; +} diff --git a/dumps/scripts/1088.cs2 b/dumps/scripts/1088.cs2 new file mode 100644 index 000000000..0b4c0a780 --- /dev/null +++ b/dumps/scripts/1088.cs2 @@ -0,0 +1,71 @@ +void script_1088(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar3 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar4 = getExtraChildGap(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(0, -13, 1, 0); + setWidgetSize(4, 32, 1, 0); + setWidgetSprite(820); + cs2method1107(1); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(0, -12, 1, 2); + setWidgetSize(4, 32, 1, 0); + setWidgetSprite(822); + cs2method1107(1); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(-13, 0, 0, 1); + setWidgetSize(32, 4, 0, 1); + setWidgetSprite(821); + cs2method1107(1); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(-12, 0, 2, 1); + setWidgetSize(32, 4, 0, 1); + setWidgetSprite(823); + cs2method1107(1); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(824); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(825); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(826); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(827); + ivar4 = add(ivar4, 1); + if (arg1 > 0) { + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(0, subtract(arg1, 5), 1, 0); + setWidgetSize(4, 32, 1, 0); + setWidgetSprite(828); + cs2method1107(1); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(0, subtract(arg1, 3), 0, 0); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(829); + ivar4 = add(ivar4, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetPosition(0, subtract(arg1, 3), 2, 0); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(830); + ivar4 = add(ivar4, 1); + } + return; +} diff --git a/dumps/scripts/1089.cs2 b/dumps/scripts/1089.cs2 new file mode 100644 index 000000000..0ede81f8e --- /dev/null +++ b/dumps/scripts/1089.cs2 @@ -0,0 +1,9 @@ +void script_1089() { + if (cs2method5005() == 2) { + cs2method5001(cs2method5000(), 1, cs2method5016()); + script_178(); + script_84(); + script_89(); + } + return; +} diff --git a/dumps/scripts/109.cs2 b/dumps/scripts/109.cs2 new file mode 100644 index 000000000..7573f41de --- /dev/null +++ b/dumps/scripts/109.cs2 @@ -0,0 +1,28 @@ +void script_109(string arg0) { + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), arg0); + globalint_5 = 8; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + setScriptCallOnWindowPaneRefresh(138, "", new WidgetPointer(752,5)); + if (((boolean)globalint_1026) && (strLength(globalstring_201) > 0)) { + createExtraChild(new WidgetPointer(752,3), 4, 0); + script_2752(); + setWidgetText("Last name entered: " + globalstring_201); + setWidgetContextMenuOption(1, "Use:"); + cs2method1305("" + strRemoveEntities(globalstring_201) + ""); + setScriptCallOnClickContextMenu(2753, globalint_5, -2147483644, new WidgetPointer(-32768,3), -2147483643, globalstring_201, "iiIis"); + } else { + globalstring_201 = ""; + globalint_1026 = 1; + } + script_1188(); + return; +} diff --git a/dumps/scripts/1090.cs2 b/dumps/scripts/1090.cs2 new file mode 100644 index 000000000..cb159c16f --- /dev/null +++ b/dumps/scripts/1090.cs2 @@ -0,0 +1,14 @@ +int script_1090(string arg0) { + int ivar0; + ivar0 = cs2method3628(arg0); + if (ivar0 == -1) { + return -1; + } + if (((boolean)getFriendWorld(ivar0))) { + return 0; + } + if (cs2method3627(ivar0)) { + return 1; + } + return 2; +} diff --git a/dumps/scripts/1091.cs2 b/dumps/scripts/1091.cs2 new file mode 100644 index 000000000..3b3d57871 --- /dev/null +++ b/dumps/scripts/1091.cs2 @@ -0,0 +1,4 @@ +void script_1091(int arg0,int arg1) { + setWidgetText(new WidgetPointer(arg0), intToStr(getItemAmtInContainer(93, arg1))); + return; +} diff --git a/dumps/scripts/1092.cs2 b/dumps/scripts/1092.cs2 new file mode 100644 index 000000000..5232d0f9c --- /dev/null +++ b/dumps/scripts/1092.cs2 @@ -0,0 +1,70 @@ +void script_1092(int arg0) { + if (((boolean)arg0)) { + if (bitconfig_1892 == 60) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(145,2)); + } else if (((boolean)bitconfig_1892)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(145,2)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(145,2)); + } + } else if (arg0 == 2) { + if (bitconfig_1867 == 40) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(145,3)); + } else if (((boolean)bitconfig_1867)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(145,3)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(145,3)); + } + } else if (arg0 == 3) { + if (bitconfig_1895 == 110) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(145,4)); + } else if (((boolean)bitconfig_1895)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(145,4)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(145,4)); + } + } else if (arg0 == 4) { + if (bitconfig_1896 == 5) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(145,5)); + } else if (((boolean)bitconfig_1896)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(145,5)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(145,5)); + } + } else if (arg0 == 5) { + if (bitconfig_1878 == 5) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(145,6)); + } else if (((boolean)bitconfig_1878)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(145,6)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(145,6)); + } + } else if (arg0 == 6) { + if (bitconfig_1910 == 20) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(145,7)); + } else if (((boolean)bitconfig_1910)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(145,7)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(145,7)); + } + } else if (arg0 == 7) { + if (bitconfig_1904 == 170) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(145,8)); + } else if (((boolean)bitconfig_1904)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(145,8)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(145,8)); + } + } else { + if (arg0 == 8) { + if (bitconfig_1914 == 50) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(145,9)); + } else if (((boolean)bitconfig_1914)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(145,9)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(145,9)); + } + } + } + return; +} diff --git a/dumps/scripts/1093.cs2 b/dumps/scripts/1093.cs2 new file mode 100644 index 000000000..f64a5e54f --- /dev/null +++ b/dumps/scripts/1093.cs2 @@ -0,0 +1,4 @@ +void script_1093(int arg0,int arg1) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1094.cs2 b/dumps/scripts/1094.cs2 new file mode 100644 index 000000000..2b6a4a27d --- /dev/null +++ b/dumps/scripts/1094.cs2 @@ -0,0 +1,8 @@ +void script_1094() { + if (((boolean)standart_config_1241)) { + script_1095(); + } else { + script_1096(); + } + return; +} diff --git a/dumps/scripts/1095.cs2 b/dumps/scripts/1095.cs2 new file mode 100644 index 000000000..1ff60a6d3 --- /dev/null +++ b/dumps/scripts/1095.cs2 @@ -0,0 +1,7 @@ +void script_1095() { + opcStruct6203(2,0,0) structdump_0; + script_1097(); + structdump_0 = cs2method6203(); + setWidgetSize(structdump_0.intpart_0, structdump_0.intpart_1, 0, 0, new WidgetPointer(746,9)); + return; +} diff --git a/dumps/scripts/1096.cs2 b/dumps/scripts/1096.cs2 new file mode 100644 index 000000000..ed256bbc6 --- /dev/null +++ b/dumps/scripts/1096.cs2 @@ -0,0 +1,7 @@ +void script_1096() { + opcStruct6203(2,0,0) structdump_0; + script_1098(); + structdump_0 = cs2method6203(); + setWidgetSize(structdump_0.intpart_0, structdump_0.intpart_1, 0, 0, new WidgetPointer(746,9)); + return; +} diff --git a/dumps/scripts/1097.cs2 b/dumps/scripts/1097.cs2 new file mode 100644 index 000000000..ff989822c --- /dev/null +++ b/dumps/scripts/1097.cs2 @@ -0,0 +1,6 @@ +void script_1097() { + cs2method6200(256, 256); + cs2method6201(256, 256); + cs2method6202(256, 256, 256, 256); + return; +} diff --git a/dumps/scripts/1098.cs2 b/dumps/scripts/1098.cs2 new file mode 100644 index 000000000..d8db0f017 --- /dev/null +++ b/dumps/scripts/1098.cs2 @@ -0,0 +1,6 @@ +void script_1098() { + cs2method6200(0, 0); + cs2method6201(0, 0); + cs2method6202(0, 0, 0, 0); + return; +} diff --git a/dumps/scripts/1099.cs2 b/dumps/scripts/1099.cs2 new file mode 100644 index 000000000..458a684ef --- /dev/null +++ b/dumps/scripts/1099.cs2 @@ -0,0 +1,4 @@ +void script_1099() { + script_1264(); + return; +} diff --git a/dumps/scripts/11.cs2 b/dumps/scripts/11.cs2 new file mode 100644 index 000000000..e4b4669f8 --- /dev/null +++ b/dumps/scripts/11.cs2 @@ -0,0 +1,4 @@ +void script_11(int arg0) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/110.cs2 b/dumps/scripts/110.cs2 new file mode 100644 index 000000000..d48137040 --- /dev/null +++ b/dumps/scripts/110.cs2 @@ -0,0 +1,37 @@ +void script_110(string arg0) { + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), arg0); + globalint_5 = 9; + if (((boolean)stringMethod4107("null", globalstring_350))) { + globalstring_350 = ""; + } + if (stringMethod4107("", globalstring_350) != 0) { + script_1564(globalstring_350); + globalstring_350 = ""; + } else { + script_1564(""); + } + if (((boolean)stringMethod4107("null", globalstring_354))) { + globalstring_354 = ""; + } + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + setScriptCallOnWindowPaneRefresh(138, "", new WidgetPointer(752,5)); + if (stringMethod4107(globalstring_354, "") != 0) { + createExtraChild(new WidgetPointer(752,3), 4, 0); + script_2752(); + setWidgetText("Last entered: " + globalstring_354); + setWidgetContextMenuOption(1, "Use:"); + cs2method1305("" + strRemoveEntities(globalstring_354) + ""); + setScriptCallOnClickContextMenu(2753, globalint_5, -2147483644, new WidgetPointer(-32768,3), -2147483643, globalstring_354, "iiIis"); + globalstring_354 = ""; + } + script_1188(); + return; +} diff --git a/dumps/scripts/1100.cs2 b/dumps/scripts/1100.cs2 new file mode 100644 index 000000000..255f9eb84 --- /dev/null +++ b/dumps/scripts/1100.cs2 @@ -0,0 +1,15 @@ +int script_1100() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_3600); + ivar0 = add(ivar0, bitconfig_3601); + ivar0 = add(ivar0, bitconfig_3602); + ivar0 = add(ivar0, bitconfig_3603); + ivar0 = add(ivar0, bitconfig_3604); + ivar0 = add(ivar0, bitconfig_3605); + ivar0 = add(ivar0, bitconfig_3606); + ivar0 = add(ivar0, bitconfig_3607); + ivar0 = add(ivar0, bitconfig_3608); + ivar0 = add(ivar0, bitconfig_3609); + return ivar0; +} diff --git a/dumps/scripts/1101.cs2 b/dumps/scripts/1101.cs2 new file mode 100644 index 000000000..6ed1a15b0 --- /dev/null +++ b/dumps/scripts/1101.cs2 @@ -0,0 +1,4 @@ +void script_1101() { + script_1265(); + return; +} diff --git a/dumps/scripts/1102.cs2 b/dumps/scripts/1102.cs2 new file mode 100644 index 000000000..ffd32ea15 --- /dev/null +++ b/dumps/scripts/1102.cs2 @@ -0,0 +1,4 @@ +void script_1102() { + setWidgetText(new WidgetPointer(377,4), intToStr(bitconfig_907) + "%"); + return; +} diff --git a/dumps/scripts/1103.cs2 b/dumps/scripts/1103.cs2 new file mode 100644 index 000000000..38e7bcd44 --- /dev/null +++ b/dumps/scripts/1103.cs2 @@ -0,0 +1,12 @@ +int script_1103() { + if (((boolean)globalint_754)) { + return 0; + } + if (globalint_754 == 9) { + return 0; + } + if (globalint_754 == 12) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/1104.cs2 b/dumps/scripts/1104.cs2 new file mode 100644 index 000000000..0a629319f --- /dev/null +++ b/dumps/scripts/1104.cs2 @@ -0,0 +1,16 @@ +void script_1104() { + if (((boolean)cs2method5420())) { + setWidgetText(new WidgetPointer(182,1), "When you have finished playing" + "
" + "RuneScape, always use a" + "
" + "button below to exit the game and logout safely."); + setWidgetText(new WidgetPointer(182,6), "Exit to Lobby"); + setWidgetContextMenuOption(1, new WidgetPointer(182,6), "Exit to Lobby"); + setWidgetIsHidden(false, new WidgetPointer(182,7)); + setWidgetText(new WidgetPointer(182,13), "Exit to Login"); + setWidgetContextMenuOption(1, new WidgetPointer(182,13), "Exit to Login"); + } else { + setWidgetText(new WidgetPointer(182,1), "When you have finished playing" + "
" + "RuneScape, always use the" + "
" + "button below to exit the game and logout safely."); + setWidgetText(new WidgetPointer(182,6), "Click here to log out"); + setWidgetContextMenuOption(1, new WidgetPointer(182,6), "Logout"); + setWidgetIsHidden(true, new WidgetPointer(182,7)); + } + return; +} diff --git a/dumps/scripts/1105.cs2 b/dumps/scripts/1105.cs2 new file mode 100644 index 000000000..bebf12120 --- /dev/null +++ b/dumps/scripts/1105.cs2 @@ -0,0 +1,4 @@ +void script_1105() { + script_1269(); + return; +} diff --git a/dumps/scripts/1106.cs2 b/dumps/scripts/1106.cs2 new file mode 100644 index 000000000..5dc274ffe --- /dev/null +++ b/dumps/scripts/1106.cs2 @@ -0,0 +1,15 @@ +int script_1106() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1107.cs2 b/dumps/scripts/1107.cs2 new file mode 100644 index 000000000..fa9566f18 --- /dev/null +++ b/dumps/scripts/1107.cs2 @@ -0,0 +1,4 @@ +void script_1107() { + script_1271(1); + return; +} diff --git a/dumps/scripts/1108.cs2 b/dumps/scripts/1108.cs2 new file mode 100644 index 000000000..81d0455a0 --- /dev/null +++ b/dumps/scripts/1108.cs2 @@ -0,0 +1,24 @@ +int script_1108() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_3986); + ivar0 = add(ivar0, bitconfig_3987); + ivar0 = add(ivar0, bitconfig_3988); + ivar0 = add(ivar0, bitconfig_3989); + ivar0 = add(ivar0, bitconfig_3990); + ivar0 = add(ivar0, bitconfig_3991); + ivar0 = add(ivar0, bitconfig_3992); + ivar0 = add(ivar0, bitconfig_3993); + ivar0 = add(ivar0, bitconfig_3994); + ivar0 = add(ivar0, bitconfig_3995); + ivar0 = add(ivar0, bitconfig_3996); + ivar0 = add(ivar0, bitconfig_3997); + ivar0 = add(ivar0, bitconfig_3998); + ivar0 = add(ivar0, bitconfig_3999); + ivar0 = add(ivar0, bitconfig_4000); + ivar0 = add(ivar0, bitconfig_4001); + ivar0 = add(ivar0, bitconfig_4002); + ivar0 = add(ivar0, bitconfig_4005); + ivar0 = add(ivar0, bitconfig_4004); + return ivar0; +} diff --git a/dumps/scripts/1109.cs2 b/dumps/scripts/1109.cs2 new file mode 100644 index 000000000..c5d055336 --- /dev/null +++ b/dumps/scripts/1109.cs2 @@ -0,0 +1,4 @@ +void script_1109() { + script_1271(0); + return; +} diff --git a/dumps/scripts/111.cs2 b/dumps/scripts/111.cs2 new file mode 100644 index 000000000..d634aa3b3 --- /dev/null +++ b/dumps/scripts/111.cs2 @@ -0,0 +1,34 @@ +void script_111() { + if (((boolean)globalint_1413)) { + return; + } + if (((boolean)globalint_11)) { + script_675(); + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter the player name whose channel you wish to join:"); + globalint_5 = 10; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + createExtraChild(new WidgetPointer(752,3), 4, 0); + script_2752(); + if (((boolean)globalint_1027) && (strLength(globalstring_202) > 0)) { + setWidgetText("Last name entered: " + globalstring_202); + } else { + globalstring_202 = strRemoveEntities(cs2method5015()); + globalint_1027 = 1; + setWidgetText("Your name: " + globalstring_202); + } + setWidgetContextMenuOption(1, "Use:"); + cs2method1305("" + strRemoveEntities(globalstring_202) + ""); + setScriptCallOnClickContextMenu(2753, globalint_5, -2147483644, new WidgetPointer(-32768,3), -2147483643, globalstring_202, "iiIis"); + script_1188(); + return; +} diff --git a/dumps/scripts/1110.cs2 b/dumps/scripts/1110.cs2 new file mode 100644 index 000000000..6728faaed --- /dev/null +++ b/dumps/scripts/1110.cs2 @@ -0,0 +1,9 @@ +void script_1110(int arg0) { + if (arg0 != 1) { + return; + } + bitconfig_1010 = min(add(bitconfig_1010, 1), 3); + playSoundEffect(1041, 1, 0); + script_1271(1); + return; +} diff --git a/dumps/scripts/1111.cs2 b/dumps/scripts/1111.cs2 new file mode 100644 index 000000000..d57961dcb --- /dev/null +++ b/dumps/scripts/1111.cs2 @@ -0,0 +1,86 @@ +string script_1111() { + switch (globalint_754) { + case 0: + case 9: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Make All"; + } + return "Make " + intToStr(bitconfig_8095); + case 1: + if (((boolean)bitconfig_8095)) { + return "Make 1 set"; + } + return "Make " + intToStr(bitconfig_8095) + " sets"; + case 2: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Cook All"; + } + return "Cook " + intToStr(bitconfig_8095); + case 3: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Roast All"; + } + return "Roast " + intToStr(bitconfig_8095); + case 4: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Offer All"; + } + return "Offer " + intToStr(bitconfig_8095); + case 5: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Sell All"; + } + return "Sell " + intToStr(bitconfig_8095); + case 6: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Bake All"; + } + return "Bake " + intToStr(bitconfig_8095); + case 7: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Cut All"; + } + return "Cut " + intToStr(bitconfig_8095); + case 8: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Deposit All"; + } + return "Deposit " + intToStr(bitconfig_8095); + case 10: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Teleport All"; + } + return "Teleport " + intToStr(bitconfig_8095); + case 11: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Select All"; + } + break; + case 12: + if (((boolean)bitconfig_8095)) { + return "Make 1 set"; + } + return "Make " + intToStr(bitconfig_8095) + " sets"; + case 13: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Take All"; + } + return "Take " + intToStr(bitconfig_8095); + case 14: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Return All"; + } + return "Return " + intToStr(bitconfig_8095); + case 15: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Heat All"; + } + return "Heat " + intToStr(bitconfig_8095); + case 16: + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + return "Add All"; + } + return "Add " + intToStr(bitconfig_8095); + } + return "Select"; +} diff --git a/dumps/scripts/1112.cs2 b/dumps/scripts/1112.cs2 new file mode 100644 index 000000000..adb034f33 --- /dev/null +++ b/dumps/scripts/1112.cs2 @@ -0,0 +1,24 @@ +int script_1112() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1113.cs2 b/dumps/scripts/1113.cs2 new file mode 100644 index 000000000..597b4930e --- /dev/null +++ b/dumps/scripts/1113.cs2 @@ -0,0 +1,26 @@ +int script_1113() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_4003); + ivar0 = add(ivar0, bitconfig_4007); + ivar0 = add(ivar0, bitconfig_4008); + ivar0 = add(ivar0, bitconfig_4009); + ivar0 = add(ivar0, bitconfig_4010); + ivar0 = add(ivar0, bitconfig_4011); + ivar0 = add(ivar0, bitconfig_4012); + ivar0 = add(ivar0, bitconfig_4013); + ivar0 = add(ivar0, bitconfig_4014); + ivar0 = add(ivar0, bitconfig_4015); + ivar0 = add(ivar0, bitconfig_4016); + ivar0 = add(ivar0, bitconfig_4017); + ivar0 = add(ivar0, bitconfig_4018); + ivar0 = add(ivar0, bitconfig_4019); + ivar0 = add(ivar0, bitconfig_4020); + ivar0 = add(ivar0, bitconfig_4021); + ivar0 = add(ivar0, bitconfig_4022); + ivar0 = add(ivar0, bitconfig_4023); + ivar0 = add(ivar0, bitconfig_4024); + ivar0 = add(ivar0, bitconfig_4025); + ivar0 = add(ivar0, bitconfig_4026); + return ivar0; +} diff --git a/dumps/scripts/1114.cs2 b/dumps/scripts/1114.cs2 new file mode 100644 index 000000000..98e35e062 --- /dev/null +++ b/dumps/scripts/1114.cs2 @@ -0,0 +1,26 @@ +int script_1114() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 4); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1115.cs2 b/dumps/scripts/1115.cs2 new file mode 100644 index 000000000..a8d98d640 --- /dev/null +++ b/dumps/scripts/1115.cs2 @@ -0,0 +1,18 @@ +int script_1115() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_4028); + ivar0 = add(ivar0, bitconfig_4027); + ivar0 = add(ivar0, bitconfig_4029); + ivar0 = add(ivar0, bitconfig_4030); + ivar0 = add(ivar0, bitconfig_4031); + ivar0 = add(ivar0, bitconfig_4032); + ivar0 = add(ivar0, bitconfig_4033); + ivar0 = add(ivar0, bitconfig_4034); + ivar0 = add(ivar0, bitconfig_4035); + ivar0 = add(ivar0, bitconfig_4036); + ivar0 = add(ivar0, bitconfig_4037); + ivar0 = add(ivar0, bitconfig_4038); + ivar0 = add(ivar0, bitconfig_4039); + return ivar0; +} diff --git a/dumps/scripts/1116.cs2 b/dumps/scripts/1116.cs2 new file mode 100644 index 000000000..041ab1c69 --- /dev/null +++ b/dumps/scripts/1116.cs2 @@ -0,0 +1,18 @@ +int script_1116() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1117.cs2 b/dumps/scripts/1117.cs2 new file mode 100644 index 000000000..3592226eb --- /dev/null +++ b/dumps/scripts/1117.cs2 @@ -0,0 +1,116 @@ +void script_1117(int arg0) { + int ivar1; + string svar0; + ivar1 = -1; + svar0 = ""; + switch (arg0) { + case 12582919: + if (((boolean)bitconfig_6459)) { + svar0 = "Hide combat spells."; + } else { + svar0 = "Show combat spells."; + } + ivar1 = 12583008; + break; + case 12582921: + if (((boolean)bitconfig_6462)) { + svar0 = "Hide teleport spells."; + } else { + svar0 = "Show teleport spells."; + } + ivar1 = 12583008; + break; + case 12582923: + if (((boolean)bitconfig_6461)) { + svar0 = "Hide miscellaneous spells."; + } else { + svar0 = "Show miscellaneous spells."; + } + ivar1 = 12583008; + break; + case 12582925: + if (((boolean)bitconfig_6460)) { + svar0 = "Hide skill spells."; + } else { + svar0 = "Show skill spells."; + } + ivar1 = 12583008; + break; + case 28180485: + if (((boolean)bitconfig_6463)) { + svar0 = "Hide combat spells."; + } else { + svar0 = "Show combat spells."; + } + ivar1 = 28180545; + break; + case 28180489: + if (((boolean)bitconfig_6464)) { + svar0 = "Hide miscellaneous spells."; + } else { + svar0 = "Show miscellaneous spells."; + } + ivar1 = 28180545; + break; + case 28180487: + if (((boolean)bitconfig_6465)) { + svar0 = "Hide teleport spells."; + } else { + svar0 = "Show teleport spells."; + } + ivar1 = 28180545; + break; + case 12648453: + if (((boolean)bitconfig_6466)) { + svar0 = "Hide combat spells."; + } else { + svar0 = "Show combat spells."; + } + ivar1 = 12648501; + break; + case 12648455: + if (((boolean)bitconfig_6467)) { + svar0 = "Hide teleport spells."; + } else { + svar0 = "Show teleport spells."; + } + ivar1 = 12648501; + break; + case 62259207: + if (((boolean)bitconfig_7348)) { + svar0 = "Hide combat spells."; + } else { + svar0 = "Show combat spells."; + } + ivar1 = 62259272; + break; + case 62259209: + if (((boolean)bitconfig_7351)) { + svar0 = "Hide teleport spells."; + } else { + svar0 = "Show teleport spells."; + } + ivar1 = 62259272; + break; + case 62259211: + if (((boolean)bitconfig_7350)) { + svar0 = "Hide miscellaneous spells."; + } else { + svar0 = "Show miscellaneous spells."; + } + ivar1 = 62259272; + break; + case 62259213: + if (((boolean)bitconfig_7349)) { + svar0 = "Hide skill spells."; + } else { + svar0 = "Show skill spells."; + } + ivar1 = 62259272; + break; + default: + return; + } + script_39(arg0, ivar1, 25, getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(ivar1)))), svar0); + return; +} diff --git a/dumps/scripts/1118.cs2 b/dumps/scripts/1118.cs2 new file mode 100644 index 000000000..8cf5e34bc --- /dev/null +++ b/dumps/scripts/1118.cs2 @@ -0,0 +1,121 @@ +void script_1118(int arg0) { + switch (arg0) { + case 12582919: + if (((boolean)bitconfig_6459)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_988)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12582921: + if (((boolean)bitconfig_6462)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_989)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12582923: + if (((boolean)bitconfig_6461)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_990)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12582925: + if (((boolean)bitconfig_6460)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_991)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 28180485: + if (((boolean)bitconfig_6463)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_988)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 28180489: + if (((boolean)bitconfig_6464)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_990)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 28180487: + if (((boolean)bitconfig_6465)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_989)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12648453: + if (((boolean)bitconfig_6466)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_988)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12648455: + if (((boolean)bitconfig_6467)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_989)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 62259207: + if (((boolean)bitconfig_7348)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_988)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 62259209: + if (((boolean)bitconfig_7351)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_989)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 62259211: + if (((boolean)bitconfig_7350)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_990)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 62259213: + if (((boolean)bitconfig_7349)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_991)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/1119.cs2 b/dumps/scripts/1119.cs2 new file mode 100644 index 000000000..202c423bf --- /dev/null +++ b/dumps/scripts/1119.cs2 @@ -0,0 +1,92 @@ +int script_1119() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + ivar0 = cs2method_3408(105, 74, 2162, bitconfig_357); + ivar1 = 0; + globalarray_0 = new int[4]; + switch (bitconfig_357) { + case 0: + ivar1 = bitconfig_5822; + globalarray_0[0] = bitconfig_6459; + globalarray_0[1] = bitconfig_6460; + globalarray_0[2] = bitconfig_6461; + globalarray_0[3] = bitconfig_6462; + break; + case 1: + ivar1 = bitconfig_5823; + globalarray_0[0] = bitconfig_6466; + globalarray_0[1] = 0; + globalarray_0[2] = 0; + globalarray_0[3] = bitconfig_6467; + break; + case 2: + ivar1 = bitconfig_5824; + globalarray_0[0] = bitconfig_6463; + globalarray_0[1] = 0; + globalarray_0[2] = bitconfig_6464; + globalarray_0[3] = bitconfig_6465; + break; + case 3: + ivar1 = bitconfig_7347; + globalarray_0[0] = bitconfig_7348; + globalarray_0[1] = bitconfig_7349; + globalarray_0[2] = bitconfig_7350; + globalarray_0[3] = bitconfig_7351; + } + ivar2 = cs2method_3408(105, 103, getOtherCommonData(ivar0, 662), ivar1); + ivar3 = getOtherCommonData(ivar0, 654); + ivar4 = getOtherCommonData(ivar0, 655); + ivar5 = getCommonDefinitionSize(ivar2); + ivar6 = 0; + ivar7 = 0; + ivar8 = -1; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = -1; + ivar13 = -1; + while (ivar7 < ivar5) { + ivar8 = cs2method_3408(105, 103, ivar2, ivar7); + if (ivar8 != -1) { + ivar6 = getCommonDefinitionSize(ivar8); + ivar9 = 0; + ivar11 = 0; + while (ivar9 < ivar6) { + ivar12 = ((int)cs2method_3408(105, 73, ivar8, ivar11)); + if (ivar12 != -1) { + ivar9 = add(ivar9, 1); + ivar13 = cs2method_3408(73, 105, 727, ivar12); + if ((ivar13 == -1) || (((boolean)globalarray_0[ivar13]) && (isMember() || ((boolean)cs2method_3408(73, 105, 743, ivar12))))) { + ivar10 = add(ivar10, 1); + ivar4 = add(ivar4, add(getOtherCommonData(ivar0, 657), getOtherCommonData(ivar0, 658))); + if (((boolean)mod(ivar10, getOtherCommonData(ivar0, 660)))) { + ivar3 = add(ivar3, add(getOtherCommonData(ivar0, 656), getOtherCommonData(ivar0, 659))); + ivar4 = getOtherCommonData(ivar0, 655); + } + } + } + ivar11 = add(ivar11, 1); + if (ivar11 > 997) { + return 1; + } + } + } + ivar7 = add(ivar7, 1); + } + if (add(ivar3, getOtherCommonData(ivar0, 656)) >= 229) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/112.cs2 b/dumps/scripts/112.cs2 new file mode 100644 index 000000000..c07983c3d --- /dev/null +++ b/dumps/scripts/112.cs2 @@ -0,0 +1,204 @@ +void script_112(int arg0,int arg1) { + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_802_struct(1,1,0) structdump_5; + cs2func_script_802_struct(1,1,0) structdump_6; + cs2func_script_802_struct(1,1,0) structdump_7; + cs2func_script_802_struct(1,1,0) structdump_8; + cs2func_script_802_struct(1,1,0) structdump_9; + switch (arg0) { + flow_1: + case 84: + if (globalint_5 == 12) { + script_1806(globalstring_22); + return; + } + IF (strLength(globalstring_22) > 0) + GOTO flow_4 + GOTO flow_51 + flow_4: + if (globalint_5 == 13) { + sendStringInput(globalstring_22); + } else if ((globalint_5 == 4) || (globalint_5 == 5)) { + if (getIgnoreCount() < 0) { + messageType0("Unable to update Ignore List: system busy"); + } else if (globalint_5 == 4) { + cs2method3607(globalstring_22); + } else { + if (globalint_5 == 5) { + if (cs2method3623(script_4591(globalstring_22))) { + cs2method3608(script_4591(globalstring_22)); + } else { + messageType0("That player is not on your ignore list."); + } + } + } + } else if (globalint_5 < 7) { + if (getFriendlistSize() < 0) { + messageType0("Unable to complete action - system busy"); + } else if (globalint_5 == 2) { + cs2method3605(globalstring_22); + } else if (globalint_5 == 3) { + if (isFriend(script_4591(globalstring_22))) { + cs2method3606(script_4591(globalstring_22)); + } else { + messageType0("That player is not on your friends list."); + } + } else { + if (globalint_5 == 6) { + if (cs2method5005() == 2) { + cs2method5001(cs2method5000(), 1, cs2method5016()); + script_178(); + script_84(); + script_89(); + } + cs2method5009(globalstring_23, globalstring_22); + } + } + } else if (globalint_5 == 11) { + script_1478(); + } else if (globalint_5 == 7) { + globalstring_22 = script_2332(globalstring_22, "K", "000"); + globalstring_22 = script_2332(globalstring_22, "k", "000"); + globalstring_22 = script_2332(globalstring_22, "M", "000000"); + globalstring_22 = script_2332(globalstring_22, "m", "000000"); + if (((boolean)getLanguage())) { + globalstring_22 = script_2332(globalstring_22, "T", "000"); + globalstring_22 = script_2332(globalstring_22, "t", "000"); + } + sendIntegerInput(globalstring_22); + } else if (globalint_5 == 8) { + globalstring_201 = replaceLtGt(globalstring_22); + globalint_1026 = 1; + sendNameInput(globalstring_22); + } else if (globalint_5 == 9) { + if (stringMethod4107(lower(globalstring_22), lower(globalstring_33)) != 0) { + sendStringInput(globalstring_22); + } else { + messageType0("Please do not enter your password here!"); + } + } else if (globalint_5 == 10) { + globalstring_202 = replaceLtGt(globalstring_22); + globalint_1027 = 1; + sendUnknownFriendPacketMethod3619(globalstring_22); + } else if (globalint_5 == 15) { + script_1633(globalstring_22); + } else { + if (globalint_5 == 16) { + script_4465(globalstring_22); + } + } + GOTO flow_54 + flow_51: + if (globalint_5 == 14) { + script_3683(); + return; + } + IF (globalint_5 == 7) + GOTO flow_54 + GOTO flow_54 + flow_54: + setWidgetIsHidden(true, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(false, new WidgetPointer(752,8)); + globalint_5 = 0; + if (getDisplayMode() >= 2) { + script_1364(); + } + return; + case 13: + if (globalint_5 == 12) { + script_1806(globalstring_38); + script_1548(0); + } else { + if (globalint_5 == 14) { + script_3683(); + } + } + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + if (isHoldingCtrl()) { + return; + } + globalint_1029 = script_1553(arg0, globalint_1029, globalstring_22); + break; + default: + switch (globalint_5) { + case 9: + case 11: + case 6: + stack_dump0 = globalint_1029; + stack_dump1 = 0; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_22; + structdump_5 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_5.stringpart_0; + globalint_1029 = structdump_5.intpart_0; + globalstring_22 = stack_dump4; + break; + case 7: + stack_dump0 = globalint_1029; + stack_dump1 = 6; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_22; + structdump_6 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_6.stringpart_0; + globalint_1029 = structdump_6.intpart_0; + globalstring_22 = stack_dump4; + break; + case 13: + stack_dump0 = globalint_1029; + stack_dump1 = 5; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_22; + structdump_7 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_7.stringpart_0; + globalint_1029 = structdump_7.intpart_0; + globalstring_22 = stack_dump4; + break; + case 14: + stack_dump0 = globalint_1029; + stack_dump1 = 4; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_22; + structdump_8 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_8.stringpart_0; + globalint_1029 = structdump_8.intpart_0; + globalstring_22 = stack_dump4; + break; + } + stack_dump0 = globalint_1029; + stack_dump1 = 2; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_22; + structdump_9 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_9.stringpart_0; + globalint_1029 = structdump_9.intpart_0; + globalstring_22 = stack_dump4; + } + setWidgetText(new WidgetPointer(752,5), replaceLtGt(globalstring_22)); + script_1557(); + if (globalint_5 == 11) { + script_1475(); + } else { + if (globalint_5 == 14) { + globalstring_196 = lower(globalstring_22); + globalint_89 = 1; + script_3680(); + } + } + return; +} diff --git a/dumps/scripts/1120.cs2 b/dumps/scripts/1120.cs2 new file mode 100644 index 000000000..9f0a6930d --- /dev/null +++ b/dumps/scripts/1120.cs2 @@ -0,0 +1,4 @@ +void script_1120() { + script_1121(); + return; +} diff --git a/dumps/scripts/1121.cs2 b/dumps/scripts/1121.cs2 new file mode 100644 index 000000000..b8db800f1 --- /dev/null +++ b/dumps/scripts/1121.cs2 @@ -0,0 +1,49 @@ +void script_1121() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = ((int)cs2method_3408(105, 73, 729, bitconfig_276)); + ivar1 = 0; + ivar2 = 0; + ivar3 = -1; + ivar4 = -1; + switch (bitconfig_357) { + case 0: + ivar3 = 12583005; + ivar4 = 12583004; + break; + case 1: + ivar3 = 12648498; + ivar4 = 12648497; + break; + case 3: + ivar3 = 62259269; + ivar4 = 62259268; + break; + default: + return; + } + if (((boolean)bitconfig_276)) { + if (bitconfig_6521 == 3) { + script_948(); + } else { + if (bitconfig_6521 == 28) { + script_1331(); + } + } + } + if ((ivar0 != -1) && ((boolean)bitconfig_275)) { + ivar1 = subtract(getWidgetActualX(new WidgetPointer(ivar0)), 2); + ivar2 = subtract(getWidgetActualY(new WidgetPointer(ivar0)), 2); + setWidgetPosition(ivar1, ivar2, 0, 0, new WidgetPointer(ivar3)); + setWidgetPosition(ivar1, ivar2, 0, 0, new WidgetPointer(ivar4)); + setWidgetIsHidden(false, new WidgetPointer(ivar3)); + setWidgetIsHidden(false, new WidgetPointer(ivar4)); + return; + } + setWidgetIsHidden(true, new WidgetPointer(ivar3)); + setWidgetIsHidden(true, new WidgetPointer(ivar4)); + return; +} diff --git a/dumps/scripts/1122.cs2 b/dumps/scripts/1122.cs2 new file mode 100644 index 000000000..d5f7015ee --- /dev/null +++ b/dumps/scripts/1122.cs2 @@ -0,0 +1,4 @@ +void script_1122() { + script_1952(); + return; +} diff --git a/dumps/scripts/1123.cs2 b/dumps/scripts/1123.cs2 new file mode 100644 index 000000000..904404606 --- /dev/null +++ b/dumps/scripts/1123.cs2 @@ -0,0 +1,19 @@ +void script_1123(int arg0) { + switch (bitconfig_804) { + case 1: + setItemOnWidgetMethod2200(6090, 300, new WidgetPointer(arg0)); + break; + case 2: + setItemOnWidgetMethod2200(6092, 300, new WidgetPointer(arg0)); + break; + case 3: + setItemOnWidgetMethod2200(6089, 300, new WidgetPointer(arg0)); + break; + case 4: + setItemOnWidgetMethod2200(6091, 300, new WidgetPointer(arg0)); + break; + default: + setItemOnWidgetMethod2200(-1, 300, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1124.cs2 b/dumps/scripts/1124.cs2 new file mode 100644 index 000000000..5d8510901 --- /dev/null +++ b/dumps/scripts/1124.cs2 @@ -0,0 +1,24 @@ +void script_1124(int arg0) { + int ivar1; + ivar1 = getWidgetShadeColor(new WidgetPointer(arg0)); + if (((boolean)globalint_992)) { + ivar1 = add(ivar1, 1); + if (ivar1 >= 255) { + globalint_992 = 0; + } + } else { + ivar1 = subtract(ivar1, 1); + if (ivar1 <= 0) { + globalint_992 = 1; + } + } + if (ivar1 > 255) { + ivar1 = 255; + } else { + if (ivar1 < 0) { + ivar1 = 0; + } + } + cs2method2103(ivar1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1125.cs2 b/dumps/scripts/1125.cs2 new file mode 100644 index 000000000..7aacff22f --- /dev/null +++ b/dumps/scripts/1125.cs2 @@ -0,0 +1,7 @@ +void script_1125(int arg0) { + globalint_993 = 1; + if (((boolean)bitconfig_2668)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1126.cs2 b/dumps/scripts/1126.cs2 new file mode 100644 index 000000000..31a6a6e41 --- /dev/null +++ b/dumps/scripts/1126.cs2 @@ -0,0 +1,29 @@ +void script_1126(int arg0) { + globalint_993 = 0; + switch (arg0) { + case 12582914: + script_41(12583008); + if (((boolean)bitconfig_2668)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12648466: + script_41(12648501); + if (((boolean)bitconfig_2668)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 28180500: + script_41(28180545); + if (((boolean)bitconfig_2668)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 62259202: + script_41(62259272); + if (((boolean)bitconfig_2668)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/1127.cs2 b/dumps/scripts/1127.cs2 new file mode 100644 index 000000000..eff5c1898 --- /dev/null +++ b/dumps/scripts/1127.cs2 @@ -0,0 +1,25 @@ +void script_1127(int arg0) { + int ivar1; + string svar0; + ivar1 = -1; + svar0 = ""; + switch (arg0) { + case 12582914: + svar0 = "Toggle defensive casting."; + ivar1 = 12583008; + break; + case 12648466: + svar0 = "Toggle defensive casting."; + ivar1 = 12648501; + break; + case 28180500: + svar0 = "Toggle defensive casting."; + ivar1 = 28180545; + break; + case 62259202: + svar0 = "Toggle defensive casting."; + ivar1 = 62259272; + } + script_39(arg0, ivar1, 25, getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(ivar1)))), svar0); + return; +} diff --git a/dumps/scripts/1128.cs2 b/dumps/scripts/1128.cs2 new file mode 100644 index 000000000..6be3904dc --- /dev/null +++ b/dumps/scripts/1128.cs2 @@ -0,0 +1,10 @@ +void script_1128(int arg0) { + if (((boolean)bitconfig_2668)) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else if (((boolean)globalint_993)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1129.cs2 b/dumps/scripts/1129.cs2 new file mode 100644 index 000000000..9b1b3b451 --- /dev/null +++ b/dumps/scripts/1129.cs2 @@ -0,0 +1,11 @@ +void script_1129() { + cs2method5426(36, 41); + cs2method5427(46, -1); + if (((boolean)globalint_987) || ((boolean)globalint_987)) { + cs2method6028(((boolean)globalint_987)); + } else { + globalint_987 = 1; + cs2method6028(((boolean)globalint_987)); + } + return; +} diff --git a/dumps/scripts/113.cs2 b/dumps/scripts/113.cs2 new file mode 100644 index 000000000..cdd19bbad --- /dev/null +++ b/dumps/scripts/113.cs2 @@ -0,0 +1,22 @@ +void script_113(int arg0) { + int ivar1; + int ivar2; + ivar1 = 0; + ivar2 = 0; + if (((boolean)rndExcl(2))) { + ivar1 = add(5, rndExcl(12)); + } else { + ivar1 = subtract(-5, rndExcl(12)); + } + if (((boolean)rndExcl(2))) { + ivar2 = add(5, rndExcl(12)); + } else { + ivar2 = subtract(-5, rndExcl(12)); + } + if (((boolean)rndExcl(2))) { + setScriptCallOnGameloop(66, ivar1, ivar2, 0, new WidgetPointer(arg0), "iiiI", new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(66, ivar1, 0, ivar2, new WidgetPointer(arg0), "iiiI", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1130.cs2 b/dumps/scripts/1130.cs2 new file mode 100644 index 000000000..53decda46 --- /dev/null +++ b/dumps/scripts/1130.cs2 @@ -0,0 +1,4 @@ +void script_1130(int arg0) { + script_1131(arg0); + return; +} diff --git a/dumps/scripts/1131.cs2 b/dumps/scripts/1131.cs2 new file mode 100644 index 000000000..4a6857cf8 --- /dev/null +++ b/dumps/scripts/1131.cs2 @@ -0,0 +1,8 @@ +void script_1131(int arg0) { + if (globalint_1000 > getMyCombat()) { + setWidgetText(new WidgetPointer(arg0), "Combat Lvl: " + intToStr(getMyCombat()) + "+" + intToStr(subtract(globalint_1000, getMyCombat()))); + } else { + setWidgetText(new WidgetPointer(arg0), "Combat Lvl: " + intToStr(getMyCombat())); + } + return; +} diff --git a/dumps/scripts/1132.cs2 b/dumps/scripts/1132.cs2 new file mode 100644 index 000000000..843f7b678 --- /dev/null +++ b/dumps/scripts/1132.cs2 @@ -0,0 +1,4 @@ +void script_1132(int arg0) { + script_1133(arg0); + return; +} diff --git a/dumps/scripts/1133.cs2 b/dumps/scripts/1133.cs2 new file mode 100644 index 000000000..43f474287 --- /dev/null +++ b/dumps/scripts/1133.cs2 @@ -0,0 +1,10 @@ +void script_1133(int arg0) { + int ivar1; + ivar1 = getItemIdInSlot(94, 3); + if ((ivar1 != -1) && (isMembersItem(ivar1) || isMember())) { + setWidgetText(new WidgetPointer(arg0), getItemName(ivar1)); + } else { + setWidgetText(new WidgetPointer(arg0), "Unarmed"); + } + return; +} diff --git a/dumps/scripts/1134.cs2 b/dumps/scripts/1134.cs2 new file mode 100644 index 000000000..b3197076d --- /dev/null +++ b/dumps/scripts/1134.cs2 @@ -0,0 +1,8 @@ +void script_1134(int arg0,int arg1) { + if (standart_config_43 == arg1) { + setWidgetSprite(654, new WidgetPointer(arg0)); + } else { + setWidgetSprite(653, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1135.cs2 b/dumps/scripts/1135.cs2 new file mode 100644 index 000000000..816e322b9 --- /dev/null +++ b/dumps/scripts/1135.cs2 @@ -0,0 +1,94 @@ +void script_1135(int arg0) { + int ivar1; + flow_0: + ivar1 = script_284(getMyPositionHash()); + SWITCH (globalint_1007) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_8 + case 6: + GOTO flow_12 + case 7: + GOTO flow_16 + case 8: + GOTO flow_20 + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + cs2method5512(); + GOTO flow_21 + flow_1: + script_2766(16777215, 50, arg0); + playSoundEffect(3641, 1, 0); + GOTO flow_21 + flow_2: + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_1145(25, 25, ivar1), 750, script_1145(25, 25, ivar1), 750, 0); + cs2method5406(0, 1, script_1145(25, 26, ivar1), 750, script_1145(25, 26, ivar1), 750, 0); + cs2method5406(1, 0, script_1145(25, 29, ivar1), 600, script_1145(25, 29, ivar1), 600, 0); + cs2method5406(1, 1, script_1145(25, 30, ivar1), 600, script_1145(25, 30, ivar1), 600, 0); + cameraMethod5502(0, 0, 100, 0, 1, 0); + script_2768(45, arg0); + playSoundEffect(3641, 1, 0); + GOTO flow_21 + flow_3: + cs2method5405(0, 7); + cs2method5405(1, 7); + cs2method5406(0, 0, script_1145(25, 26, ivar1), 750, script_1145(25, 26, ivar1), 1200, 0); + cs2method5406(0, 1, script_1145(16, 9, ivar1), 2175, script_1145(18, 11, ivar1), 2175, 0); + cs2method5406(0, 2, script_1145(31, 9, ivar1), 2275, script_1145(31, 9, ivar1), 2450, 0); + cs2method5406(0, 3, script_1145(39, 20, ivar1), 1950, script_1145(39, 20, ivar1), 1950, 0); + cs2method5406(0, 4, script_1145(40, 34, ivar1), 1550, script_1145(40, 34, ivar1), 1550, 0); + cs2method5406(0, 5, script_1145(31, 40, ivar1), 1125, script_1145(31, 40, ivar1), 1125, 0); + cs2method5406(0, 6, script_1145(24, 38, ivar1), 900, script_1145(24, 38, ivar1), 900, 0); + cs2method5406(1, 0, script_1145(25, 30, ivar1), 600, script_1145(25, 30, ivar1), 600, 0); + cs2method5406(1, 1, script_1145(25, 23, ivar1), 1150, script_1145(25, 23, ivar1), 1150, 0); + cs2method5406(1, 2, script_1145(25, 23, ivar1), 1150, script_1145(25, 23, ivar1), 1150, 0); + cs2method5406(1, 3, script_1145(25, 23, ivar1), 950, script_1145(25, 23, ivar1), 950, 0); + cs2method5406(1, 4, script_1145(25, 23, ivar1), 950, script_1145(25, 23, ivar1), 950, 0); + cs2method5406(1, 5, script_1145(25, 23, ivar1), 850, script_1145(25, 23, ivar1), 850, 0); + cs2method5406(1, 6, script_1145(26, 23, ivar1), 725, script_1145(26, 23, ivar1), 725, 0); + cameraMethod5502(0, 0, 800, 400, 1, 0); + GOTO flow_21 + flow_4: + if (cs2method5407(0) == 7) { + cameraMethod5502(0, 1, 400, 400, 1, 1); + } else { + cs2method5512(); + } + GOTO flow_21 + flow_8: + if (cs2method5407(0) == 7) { + cameraMethod5502(0, 2, 400, 400, 1, 2); + } else { + cs2method5512(); + } + GOTO flow_21 + flow_12: + if (cs2method5407(0) == 7) { + cameraMethod5502(0, 3, 400, 400, 1, 3); + } else { + cs2method5512(); + } + GOTO flow_21 + flow_16: + if (cs2method5407(0) == 7) { + cameraMethod5502(0, 4, 400, 600, 1, 4); + setScriptCallOnMinimapRelatedSetting3(1144, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } else { + cs2method5512(); + } + GOTO flow_21 + flow_20: + script_2768(50, arg0); + playSoundEffect(3641, 1, 0); + flow_21: + return; +} diff --git a/dumps/scripts/1136.cs2 b/dumps/scripts/1136.cs2 new file mode 100644 index 000000000..4f4e1c66f --- /dev/null +++ b/dumps/scripts/1136.cs2 @@ -0,0 +1,9 @@ +void script_1136(int arg0) { + if (isMember() && (getItemHashmapData(getItemIdInSlot(94, 3), 687) != 0)) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; + } + setWidgetIsHidden(true, new WidgetPointer(arg0)); + script_41(57933843); + return; +} diff --git a/dumps/scripts/1137.cs2 b/dumps/scripts/1137.cs2 new file mode 100644 index 000000000..59f0519fe --- /dev/null +++ b/dumps/scripts/1137.cs2 @@ -0,0 +1,5 @@ +void script_1137(int arg0,int arg1) { + setWidgetSize(multiplyDivide(standart_config_300, 1000, 143), 13, 0, 0, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg1), "Special Attack (" + intToStr(divide(standart_config_300, 10)) + "%)"); + return; +} diff --git a/dumps/scripts/1138.cs2 b/dumps/scripts/1138.cs2 new file mode 100644 index 000000000..bedc7881c --- /dev/null +++ b/dumps/scripts/1138.cs2 @@ -0,0 +1,8 @@ +void script_1138(int arg0) { + if (standart_config_301 > 0) { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1139.cs2 b/dumps/scripts/1139.cs2 new file mode 100644 index 000000000..b21eeaaa1 --- /dev/null +++ b/dumps/scripts/1139.cs2 @@ -0,0 +1,8 @@ +void script_1139(int arg0) { + if (((boolean)standart_config_172)) { + setWidgetText(new WidgetPointer(arg0), "Auto Retaliate " + "
" + "(Off)"); + } else { + setWidgetText(new WidgetPointer(arg0), "Auto Retaliate " + "
" + "(On)"); + } + return; +} diff --git a/dumps/scripts/114.cs2 b/dumps/scripts/114.cs2 new file mode 100644 index 000000000..d22fafee3 --- /dev/null +++ b/dumps/scripts/114.cs2 @@ -0,0 +1,13 @@ +void script_114() { + setScriptCallOnGlobalConfigChange(1302, 168, 747, 2, "Y", new WidgetPointer(548,195)); + setScriptCallOnGlobalConfigChange(1302, 168, 747, 2, "Y", new WidgetPointer(746,79)); + if (getDisplayMode() >= 2) { + setScriptCallOnConfigChange(117, 1021, 1, "Y", new WidgetPointer(746,22)); + script_1309(1); + } else { + setScriptCallOnConfigChange(117, 1021, 1, "Y", new WidgetPointer(548,128)); + script_2756(); + script_1312(1); + } + return; +} diff --git a/dumps/scripts/1140.cs2 b/dumps/scripts/1140.cs2 new file mode 100644 index 000000000..9e0f69aaf --- /dev/null +++ b/dumps/scripts/1140.cs2 @@ -0,0 +1,8 @@ +void script_1140(int arg0) { + if (((boolean)standart_config_172)) { + setWidgetSprite(1409, new WidgetPointer(arg0)); + } else { + setWidgetSprite(656, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1141.cs2 b/dumps/scripts/1141.cs2 new file mode 100644 index 000000000..7bf255262 --- /dev/null +++ b/dumps/scripts/1141.cs2 @@ -0,0 +1,10 @@ +void script_1141() { + if (((boolean)script_1431())) { + if (getDisplayMode() < 2) { + setScriptCallOnGameloop(1175, "", new WidgetPointer(548,10)); + } else { + setScriptCallOnGameloop(1175, "", new WidgetPointer(746,17)); + } + } + return; +} diff --git a/dumps/scripts/1142.cs2 b/dumps/scripts/1142.cs2 new file mode 100644 index 000000000..7f8919ec8 --- /dev/null +++ b/dumps/scripts/1142.cs2 @@ -0,0 +1,94 @@ +void script_1142() { + int ivar0; + int ivar1; + ivar0 = getItemIdInSlot(94, 3); + if ((ivar0 == -1) || (isMembersItem(ivar0) && isMember())) { + script_1143(247, 248, 249, -1, "Punch", "Accurate" + "
" + "Crush" + "
" + "Attack XP", "Kick", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Crush" + "
" + "Defence XP", "", ""); + return; + } + ivar1 = getItemHashmapData(ivar0, 686); + switch (ivar1) { + case 1: + script_1143(266, 267, 252, -1, "Bash", "Accurate" + "
" + "Crush" + "
" + "Attack XP", "Pound", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Focus", "Defensive" + "
" + "Crush" + "
" + "Defence XP", "", ""); + break; + case 23: + script_1143(266, 267, 252, -1, "Slash", "Accurate" + "
" + "Slash" + "
" + "Attack XP", "Crush", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Slash", "Defensive" + "
" + "Slash" + "
" + "Defence XP", "", ""); + break; + case 2: + script_1143(234, 235, 236, 233, "Chop", "Accurate" + "
" + "Slash" + "
" + "Attack XP", "Hack", "Aggressive" + "
" + "Slash" + "
" + "Strength XP", "Smash", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Slash" + "
" + "Defence XP"); + break; + case 3: + script_1143(266, 267, 252, -1, "Bash", "Accurate" + "
" + "Crush" + "
" + "Attack XP", "Pound", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Crush" + "
" + "Defence XP", "", ""); + break; + case 4: + script_1143(274, 276, 275, 273, "Spike", "Accurate" + "
" + "Stab" + "
" + "Attack XP", "Impale", "Aggressive" + "
" + "Stab" + "
" + "Strength XP", "Smash", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Stab" + "
" + "Defence XP"); + break; + case 5: + script_1143(240, 239, 238, 237, "Stab", "Accurate" + "
" + "Stab" + "
" + "Attack XP", "Lunge", "Aggressive" + "
" + "Stab" + "
" + "Strength XP", "Slash", "Aggressive" + "
" + "Slash" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Stab" + "
" + "Defence XP"); + break; + case 6: + script_1143(239, 238, 240, 237, "Chop", "Accurate" + "
" + "Slash" + "
" + "Attack XP", "Slash", "Aggressive" + "
" + "Slash" + "
" + "Strength XP", "Lunge", "Controlled" + "
" + "Stab" + "
" + "Shared XP", "Block", "Defensive" + "
" + "Slash" + "
" + "Defence XP"); + break; + case 7: + script_1143(239, 238, 238, 237, "Chop", "Accurate" + "
" + "Slash" + "
" + "Attack XP", "Slash", "Aggressive" + "
" + "Slash" + "
" + "Strength XP", "Smash", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Slash" + "
" + "Defence XP"); + break; + case 8: + script_1143(246, 244, 245, 243, "Pound", "Accurate" + "
" + "Crush" + "
" + "Attack XP", "Pummel", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Spike", "Controlled" + "
" + "Stab" + "
" + "Shared XP", "Block", "Defensive" + "
" + "Crush" + "
" + "Defence XP"); + break; + case 9: + script_1143(279, 278, 277, 280, "Chop", "Accurate" + "
" + "Slash" + "
" + "Attack XP", "Slash", "Aggressive" + "
" + "Slash" + "
" + "Strength XP", "Lunge", "Controlled" + "
" + "Stab" + "
" + "Shared XP", "Block", "Defensive" + "
" + "Slash" + "
" + "Defence XP"); + break; + case 10: + script_1143(255, 256, 253, -1, "Pound", "Accurate" + "
" + "Crush" + "
" + "Attack XP", "Pummel", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Crush" + "
" + "Defence XP", "", ""); + break; + case 11: + script_1143(286, 287, 286, -1, "Flick", "Accurate" + "
" + "Slash" + "
" + "Attack XP", "Lash", "Controlled" + "
" + "Slash" + "
" + "Shared XP", "Deflect", "Defensive" + "
" + "Slash" + "
" + "Defence XP", "", ""); + break; + case 12: + script_1143(255, 256, 253, -1, "Pound", "Accurate" + "
" + "Crush" + "
" + "Attack XP", "Pummel", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Crush" + "
" + "Defence XP", "", ""); + break; + case 13: + script_1143(263, 264, 265, -1, "Accurate", "Accurate" + "
" + "Ranged XP", "Rapid", "Rapid" + "
" + "Ranged XP", "Long range", "Long range" + "
" + "Ranged XP" + "
" + "Defence XP", "", ""); + break; + case 14: + script_1143(241, 251, 242, 250, "Lunge", "Controlled" + "
" + "Stab" + "
" + "Shared XP", "Swipe", "Controlled" + "
" + "Slash" + "
" + "Shared XP", "Pound", "Controlled" + "
" + "Crush" + "
" + "Shared XP", "Block", "Defensive" + "
" + "Stab" + "
" + "Defence XP"); + break; + case 15: + script_1143(284, 285, 283, -1, "Jab", "Controlled" + "
" + "Stab" + "
" + "Shared XP", "Swipe", "Aggressive" + "
" + "Slash" + "
" + "Strength XP", "Fend", "Defensive" + "
" + "Stab" + "
" + "Defence XP", "", ""); + break; + case 16: + script_1143(268, 269, 270, -1, "Accurate", "Accurate" + "
" + "Ranged XP", "Rapid", "Rapid" + "
" + "Ranged XP", "Long range", "Long range" + "
" + "Ranged XP" + "
" + "Defence XP", "", ""); + break; + case 17: + script_1143(258, 259, 260, -1, "Accurate", "Accurate" + "
" + "Ranged XP", "Rapid", "Rapid" + "
" + "Ranged XP", "Long range", "Long range" + "
" + "Ranged XP" + "
" + "Defence XP", "", ""); + break; + case 18: + script_1143(263, 264, 265, -1, "Accurate", "Accurate" + "
" + "Ranged XP", "Rapid", "Rapid" + "
" + "Ranged XP", "Long range", "Long range" + "
" + "Ranged XP" + "
" + "Defence XP", "", ""); + break; + case 19: + script_1143(288, 282, 281, -1, "Short fuse", "Short fuse" + "
" + "Ranged XP", "Medium fuse", "Medium fuse" + "
" + "Ranged XP", "Long fuse", "Long fuse" + "
" + "Ranged XP" + "
" + "Defence XP", "", ""); + break; + case 20: + script_1143(128, 248, -1, -1, "Aim and fire", "Aim and fire", "Kick", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "", "", "", ""); + break; + case 21: + script_1143(289, 290, 291, -1, "Scorch", "Aggressive" + "
" + "Slash" + "
" + "Strength XP", "Flare", "Accurate" + "
" + "Ranged" + "
" + "Ranged XP", "Blaze", "Defensive" + "
" + "Magic" + "
" + "Magic XP", "", ""); + break; + case 22: + script_1143(272, 262, 271, 261, "Reap", "Accurate" + "
" + "Slash" + "
" + "Attack XP", "Chop", "Aggressive" + "
" + "Stab" + "
" + "Strength XP", "Jab", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Slash" + "
" + "Defence XP"); + break; + case 24: + script_1143(263, 264, 265, -1, "Sling", "Accurate" + "
" + "Ranged XP", "Chuck", "Rapid" + "
" + "Ranged XP", "Lob", "Long range" + "
" + "Ranged XP" + "
" + "Defence XP", "", ""); + break; + case 25: + case 26: + script_1143(266, 267, 252, -1, "Jab", "Accurate" + "
" + "Stab" + "
" + "Attack XP", "Swipe", "Aggressive" + "
" + "Slash" + "
" + "Strength XP", "Fend", "Defensive" + "
" + "Crush" + "
" + "Defence XP", "", ""); + break; + case 27: + script_1143(234, 235, 236, -1, "Hack!", "Controlled" + "
" + "Slash" + "
" + "Shared XP", "Gouge!", "Controlled" + "
" + "Stab" + "
" + "Shared XP", "Smash!", "Controlled" + "
" + "Crush" + "
" + "Shared XP", "", ""); + break; + default: + script_1143(247, 248, 249, -1, "Punch", "Accurate" + "
" + "Crush" + "
" + "Attack XP", "Kick", "Aggressive" + "
" + "Crush" + "
" + "Strength XP", "Block", "Defensive" + "
" + "Crush" + "
" + "Defence XP", "", ""); + } + return; +} diff --git a/dumps/scripts/1143.cs2 b/dumps/scripts/1143.cs2 new file mode 100644 index 000000000..ec805e129 --- /dev/null +++ b/dumps/scripts/1143.cs2 @@ -0,0 +1,54 @@ +void script_1143(int arg0,int arg1,int arg2,int arg3,string arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11) { + string svar8; + if ((stringMethod4107(arg4, "") != 0) && (arg0 != -1)) { + setWidgetSprite(arg0, new WidgetPointer(884,30)); + setWidgetText(new WidgetPointer(884,31), arg4); + setWidgetIsHidden(false, new WidgetPointer(884,11)); + setWidgetContextMenuOption(1, new WidgetPointer(884,11), arg4); + setScriptCallOnMouseOver(38, new WidgetPointer(884,11), new WidgetPointer(884,19), arg5, 25, 190, "IIsii", new WidgetPointer(884,11)); + setScriptCallOnMouseExit(40, new WidgetPointer(884,19), "I", new WidgetPointer(884,11)); + } else { + setWidgetNoOptions(new WidgetPointer(884,11)); + setWidgetIsHidden(true, new WidgetPointer(884,11)); + } + if ((stringMethod4107(arg6, "") != 0) && (arg1 != -1)) { + setWidgetSprite(arg1, new WidgetPointer(884,28)); + setWidgetText(new WidgetPointer(884,27), arg6); + setWidgetIsHidden(false, new WidgetPointer(884,12)); + setWidgetContextMenuOption(1, new WidgetPointer(884,12), arg6); + setScriptCallOnMouseOver(38, new WidgetPointer(884,12), new WidgetPointer(884,19), arg7, 25, 190, "IIsii", new WidgetPointer(884,12)); + setScriptCallOnMouseExit(40, new WidgetPointer(884,19), "I", new WidgetPointer(884,12)); + } else { + setWidgetNoOptions(new WidgetPointer(884,12)); + setWidgetIsHidden(true, new WidgetPointer(884,12)); + } + if ((stringMethod4107(arg8, "") != 0) && (arg2 != -1)) { + setWidgetSprite(arg2, new WidgetPointer(884,24)); + setWidgetText(new WidgetPointer(884,25), arg8); + setWidgetIsHidden(false, new WidgetPointer(884,13)); + setWidgetContextMenuOption(1, new WidgetPointer(884,13), arg8); + setScriptCallOnMouseOver(38, new WidgetPointer(884,13), new WidgetPointer(884,19), arg9, 25, 190, "IIsii", new WidgetPointer(884,13)); + setScriptCallOnMouseExit(40, new WidgetPointer(884,19), "I", new WidgetPointer(884,13)); + } else { + setWidgetNoOptions(new WidgetPointer(884,13)); + setWidgetIsHidden(true, new WidgetPointer(884,13)); + } + if ((stringMethod4107(arg10, "") != 0) && (arg3 != -1)) { + setWidgetSprite(arg3, new WidgetPointer(884,21)); + setWidgetText(new WidgetPointer(884,22), arg10); + setWidgetIsHidden(false, new WidgetPointer(884,14)); + setWidgetContextMenuOption(1, new WidgetPointer(884,14), arg10); + setScriptCallOnMouseOver(38, new WidgetPointer(884,14), new WidgetPointer(884,19), arg11, 25, 190, "IIsii", new WidgetPointer(884,14)); + setScriptCallOnMouseExit(40, new WidgetPointer(884,19), "I", new WidgetPointer(884,14)); + } else { + setWidgetNoOptions(new WidgetPointer(884,14)); + setWidgetIsHidden(true, new WidgetPointer(884,14)); + } + svar8 = "When active, you will automatically fight back if attacked."; + setScriptCallOnMouseOver(38, new WidgetPointer(884,15), new WidgetPointer(884,19), svar8, 25, 190, "IIsii", new WidgetPointer(884,15)); + setScriptCallOnMouseExit(40, new WidgetPointer(884,19), "I", new WidgetPointer(884,15)); + svar8 = "Select to perform a special attack."; + setScriptCallOnMouseOver(38, new WidgetPointer(884,3), new WidgetPointer(884,19), svar8, 25, 190, "IIsii", new WidgetPointer(884,3)); + setScriptCallOnMouseExit(40, new WidgetPointer(884,19), "I", new WidgetPointer(884,3)); + return; +} diff --git a/dumps/scripts/1144.cs2 b/dumps/scripts/1144.cs2 new file mode 100644 index 000000000..f4165704c --- /dev/null +++ b/dumps/scripts/1144.cs2 @@ -0,0 +1,7 @@ +void script_1144(int arg0) { + if (cs2method5407(0) == 7) { + cameraMethod5502(0, 5, 600, 400, 1, 5); + } + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1145.cs2 b/dumps/scripts/1145.cs2 new file mode 100644 index 000000000..867ae1c07 --- /dev/null +++ b/dumps/scripts/1145.cs2 @@ -0,0 +1,3 @@ +int script_1145(int arg0,int arg1,int arg2) { + return addToCoordinate(arg2, arg0, 2, arg1); +} diff --git a/dumps/scripts/1146.cs2 b/dumps/scripts/1146.cs2 new file mode 100644 index 000000000..3b3dce4aa --- /dev/null +++ b/dumps/scripts/1146.cs2 @@ -0,0 +1,9 @@ +int script_1146(int arg0) { + if (arg0 >= 10000000) { + return 65408; + } + if (arg0 >= 100000) { + return 16777215; + } + return 16776960; +} diff --git a/dumps/scripts/1147.cs2 b/dumps/scripts/1147.cs2 new file mode 100644 index 000000000..fbebb30ab --- /dev/null +++ b/dumps/scripts/1147.cs2 @@ -0,0 +1,112 @@ +void script_1147(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + ivar6 = -1; + ivar7 = -1; + if (arg1 == arg0) { + setWidgetSize(106, 27, 0, 0, new WidgetPointer(arg3)); + switch (arg0) { + flow_2: + case 0: + ivar6 = 3095; + break; + case 2: + SWITCH (getLanguage()) { + case 1: + GOTO flow_4 + case 2: + GOTO flow_5 + case 3: + GOTO flow_6 + } + ivar6 = 3098; + GOTO flow_7 + flow_4: + ivar6 = 3104; + GOTO flow_7 + flow_5: + ivar6 = 3110; + GOTO flow_7 + flow_6: + ivar6 = 3098; + flow_7: + break; + case 1: + ivar6 = 3119; + break; + case 3: + ivar6 = 3122; + } + setWidgetSprite(ivar6, new WidgetPointer(arg4)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg3)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(arg3)); + } else { + setWidgetSize(106, 27, 0, 0, new WidgetPointer(arg3)); + switch (arg0) { + flow_12: + case 0: + SWITCH (getLanguage()) { + case 1: + GOTO flow_13 + case 2: + GOTO flow_14 + case 3: + GOTO flow_15 + } + ivar6 = 3093; + ivar7 = 3094; + GOTO flow_16 + flow_13: + ivar6 = 3099; + ivar7 = 3100; + GOTO flow_16 + flow_14: + ivar6 = 3105; + ivar7 = 3106; + GOTO flow_16 + flow_15: + ivar6 = 3111; + ivar7 = 3112; + flow_16: + break; + case 2: + SWITCH (getLanguage()) { + case 1: + GOTO flow_18 + case 2: + GOTO flow_19 + case 3: + GOTO flow_20 + } + ivar6 = 3096; + ivar7 = 3097; + GOTO flow_21 + flow_18: + ivar6 = 3102; + ivar7 = 3103; + GOTO flow_21 + flow_19: + ivar6 = 3108; + ivar7 = 3109; + GOTO flow_21 + flow_20: + ivar6 = 3096; + ivar7 = 3097; + flow_21: + break; + case 1: + ivar6 = 3117; + ivar7 = 3118; + break; + case 3: + ivar6 = 3120; + ivar7 = 3121; + } + setWidgetSprite(ivar6, new WidgetPointer(arg4)); + setScriptCallOnMouseEntered(1148, arg0, new WidgetPointer(arg4), ivar6, ivar7, 1, "iIdd1", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(1148, arg0, new WidgetPointer(arg4), ivar6, ivar7, 0, "iIdd1", new WidgetPointer(arg3)); + setScriptCallOnMousePressed(2697, arg0, arg5, "ii", new WidgetPointer(arg3)); + } + return; +} diff --git a/dumps/scripts/1148.cs2 b/dumps/scripts/1148.cs2 new file mode 100644 index 000000000..0cf63526c --- /dev/null +++ b/dumps/scripts/1148.cs2 @@ -0,0 +1,8 @@ +void script_1148(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (((boolean)arg4)) { + setWidgetSprite(arg3, new WidgetPointer(arg1)); + } else { + setWidgetSprite(arg2, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1149.cs2 b/dumps/scripts/1149.cs2 new file mode 100644 index 000000000..e27e79f3d --- /dev/null +++ b/dumps/scripts/1149.cs2 @@ -0,0 +1,16 @@ +void script_1149(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + if (arg1 == arg0) { + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(arg4)); + setWidgetSprite(cs2method_3408(105, 100, 736, arg0), new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(3933, new WidgetPointer(arg4), 15458492, 1, arg0, new WidgetPointer(arg3), arg1, "Ii1iIi", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(3933, new WidgetPointer(arg4), 11709087, 0, arg0, new WidgetPointer(arg3), arg1, "Ii1iIi", new WidgetPointer(arg2)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(arg2)); + } else { + setWidgetRGB(new Color(178, 170, 159), new WidgetPointer(arg4)); + setWidgetSprite(cs2method_3408(105, 100, 735, arg0), new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(3933, new WidgetPointer(arg4), 15458492, 1, arg0, new WidgetPointer(arg3), arg1, "Ii1iIi", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(3933, new WidgetPointer(arg4), 11709087, 0, arg0, new WidgetPointer(arg3), arg1, "Ii1iIi", new WidgetPointer(arg2)); + setScriptCallOnMousePressed(2698, arg0, arg5, arg6, arg7, arg8, "iiiii", new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/115.cs2 b/dumps/scripts/115.cs2 new file mode 100644 index 000000000..1248da9b2 --- /dev/null +++ b/dumps/scripts/115.cs2 @@ -0,0 +1,5 @@ +void script_115(int arg0) { + globalint_10 = 0; + script_71(arg0); + return; +} diff --git a/dumps/scripts/1150.cs2 b/dumps/scripts/1150.cs2 new file mode 100644 index 000000000..48129989c --- /dev/null +++ b/dumps/scripts/1150.cs2 @@ -0,0 +1,4 @@ +void script_1150(int arg0) { + script_1151(arg0); + return; +} diff --git a/dumps/scripts/1151.cs2 b/dumps/scripts/1151.cs2 new file mode 100644 index 000000000..1c5d970c4 --- /dev/null +++ b/dumps/scripts/1151.cs2 @@ -0,0 +1,47 @@ +void script_1151(int arg0) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 3, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(4, 4, 1, 1); + setWidgetRGB(new Color(83, 72, 58)); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(4, 4, 1, 0); + setWidgetSprite(2231); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(4, 4, 1, 0); + setWidgetSprite(2232); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(3, 4, 0, 1); + setWidgetSprite(2235); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(3, 4, 0, 1); + setWidgetSprite(2236); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(9, 9, 0, 0); + setWidgetSprite(2239); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(9, 9, 0, 0); + setWidgetSprite(2239); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(9, 9, 0, 0); + setWidgetSprite(2240); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(9, 9, 0, 0); + setWidgetSprite(2240); + setWidgetHFlip(1); + return; +} diff --git a/dumps/scripts/1152.cs2 b/dumps/scripts/1152.cs2 new file mode 100644 index 000000000..860947bfb --- /dev/null +++ b/dumps/scripts/1152.cs2 @@ -0,0 +1,4 @@ +void script_1152(int arg0) { + script_1166(arg0); + return; +} diff --git a/dumps/scripts/1153.cs2 b/dumps/scripts/1153.cs2 new file mode 100644 index 000000000..9ec35827f --- /dev/null +++ b/dumps/scripts/1153.cs2 @@ -0,0 +1,5 @@ +void script_1153() { + cs2method6017(false); + script_1156(); + return; +} diff --git a/dumps/scripts/1154.cs2 b/dumps/scripts/1154.cs2 new file mode 100644 index 000000000..b5502a58e --- /dev/null +++ b/dumps/scripts/1154.cs2 @@ -0,0 +1,5 @@ +void script_1154() { + cs2method6017(true); + script_1156(); + return; +} diff --git a/dumps/scripts/1155.cs2 b/dumps/scripts/1155.cs2 new file mode 100644 index 000000000..f4b1973d5 --- /dev/null +++ b/dumps/scripts/1155.cs2 @@ -0,0 +1,4 @@ +void script_1155() { + script_1156(); + return; +} diff --git a/dumps/scripts/1156.cs2 b/dumps/scripts/1156.cs2 new file mode 100644 index 000000000..0bec08645 --- /dev/null +++ b/dumps/scripts/1156.cs2 @@ -0,0 +1,10 @@ +void script_1156() { + if (cs2method6117()) { + setWidgetSprite(1134, new WidgetPointer(743,51)); + setWidgetSprite(1135, new WidgetPointer(743,49)); + } else { + setWidgetSprite(1134, new WidgetPointer(743,49)); + setWidgetSprite(1135, new WidgetPointer(743,51)); + } + return; +} diff --git a/dumps/scripts/1157.cs2 b/dumps/scripts/1157.cs2 new file mode 100644 index 000000000..ff2abf9bc --- /dev/null +++ b/dumps/scripts/1157.cs2 @@ -0,0 +1,28 @@ +void script_1157(int arg0) { + if (arg0 != 1) { + return; + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + if (((boolean)script_42(globalint_266))) { + globalstring_38 = ""; + globalstring_39 = ""; + globalint_266 = 1; + } + if (strLength(globalstring_38) > 0) { + setWidgetText(new WidgetPointer(752,4), "Edit the name of your caller:" + "
" + "(Delete it to disable this feature.)"); + } else { + setWidgetText(new WidgetPointer(752,4), "Enter the name of your caller:"); + } + globalint_5 = 12; + script_1564(globalstring_38); + setScriptCallOnMousePressed(1805, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/1158.cs2 b/dumps/scripts/1158.cs2 new file mode 100644 index 000000000..eb2fa3e47 --- /dev/null +++ b/dumps/scripts/1158.cs2 @@ -0,0 +1,4 @@ +void script_1158() { + script_1159(); + return; +} diff --git a/dumps/scripts/1159.cs2 b/dumps/scripts/1159.cs2 new file mode 100644 index 000000000..ffe6d41b2 --- /dev/null +++ b/dumps/scripts/1159.cs2 @@ -0,0 +1,8 @@ +void script_1159() { + int ivar0; + int ivar1; + ivar0 = subtract(getWidgetActualWidth(new WidgetPointer(743,30)), getWidgetActualWidth(new WidgetPointer(743,9))); + ivar1 = multiplyDivide(cs2method6119(), 255, ivar0); + setWidgetPosition(ivar1, 0, 0, 0, new WidgetPointer(743,9)); + return; +} diff --git a/dumps/scripts/116.cs2 b/dumps/scripts/116.cs2 new file mode 100644 index 000000000..e94f8e785 --- /dev/null +++ b/dumps/scripts/116.cs2 @@ -0,0 +1,4 @@ +void script_116() { + setWidgetText(new WidgetPointer(209,4), intToStr(standart_config_531) + " %"); + return; +} diff --git a/dumps/scripts/1160.cs2 b/dumps/scripts/1160.cs2 new file mode 100644 index 000000000..ecce0d505 --- /dev/null +++ b/dumps/scripts/1160.cs2 @@ -0,0 +1,4 @@ +void script_1160(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + script_1163(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/1161.cs2 b/dumps/scripts/1161.cs2 new file mode 100644 index 000000000..9ef424305 --- /dev/null +++ b/dumps/scripts/1161.cs2 @@ -0,0 +1,4 @@ +void script_1161() { + script_1162(); + return; +} diff --git a/dumps/scripts/1162.cs2 b/dumps/scripts/1162.cs2 new file mode 100644 index 000000000..4256cfb62 --- /dev/null +++ b/dumps/scripts/1162.cs2 @@ -0,0 +1,8 @@ +void script_1162() { + int ivar0; + int ivar1; + ivar0 = subtract(getWidgetActualWidth(new WidgetPointer(743,48)), getWidgetActualWidth(new WidgetPointer(743,7))); + ivar1 = multiplyDivide(cs2method6120(), 127, ivar0); + setWidgetPosition(ivar1, 0, 0, 0, new WidgetPointer(743,7)); + return; +} diff --git a/dumps/scripts/1163.cs2 b/dumps/scripts/1163.cs2 new file mode 100644 index 000000000..7785a3d4a --- /dev/null +++ b/dumps/scripts/1163.cs2 @@ -0,0 +1,99 @@ +void script_1163(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + flow_0: + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = -1; + ivar14 = 0; + IF (arg1 == -1) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (setWidgetRegister(new WidgetPointer(arg0))) + GOTO flow_3 + flow_2: + IF (setWidgetRegister(new WidgetPointer(arg0), arg1)) + GOTO flow_3 + GOTO flow_24 + flow_3: + if (((boolean)script_4761(arg3))) { + return; + } + if (globalint_2 != 1) { + ivar5 = add(script_1743(), 5); + ivar14 = script_1744(); + ivar6 = add(add(ivar14, getWidgetActualHeight()), 5); + ivar13 = getWidgetParentId(new WidgetPointer(arg2)); + if ((ivar13 != -1) && (arg4 >= getWidgetActualWidth(new WidgetPointer(ivar13)))) { + arg4 = getWidgetActualWidth(new WidgetPointer(ivar13)); + } + ivar11 = add(4, getMaxLineWidth(subtract(arg4, 4), 495, arg5)); + ivar12 = add(add(4, multiply(13, getLineCount(subtract(arg4, 4), 495, arg5))), 3); + if (ivar13 != -1) { + ivar7 = subtract(ivar5, cs2method2600(new WidgetPointer(ivar13))); + ivar8 = subtract(ivar6, cs2method2601(new WidgetPointer(ivar13))); + if (ivar7 < 0) { + ivar5 = cs2method2600(new WidgetPointer(ivar13)); + ivar7 = 0; + } + if (ivar8 < 0) { + ivar6 = cs2method2601(new WidgetPointer(ivar13)); + ivar8 = 0; + } + if (ivar7 > 0) { + ivar9 = add(subtract(ivar7, getWidgetActualWidth(new WidgetPointer(ivar13))), ivar11); + if (ivar9 > 0) { + ivar5 = subtract(ivar5, ivar9); + } + } + if (ivar8 > 0) { + ivar10 = add(subtract(ivar8, getWidgetActualHeight(new WidgetPointer(ivar13))), ivar12); + if (ivar10 > 0) { + if ((ivar14 > ivar12) && (getWidgetActualHeight() < ivar12)) { + ivar6 = subtract(ivar14, ivar12); + } else { + ivar6 = subtract(subtract(subtract(ivar6, ivar10), getWidgetActualHeight()), 10); + } + } + } + } + ivar5 = max(ivar5, 0); + ivar6 = max(ivar6, 0); + setWidgetSize(ivar11, ivar12, 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(ivar5, ivar6, 0, 0, new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 3, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 160)); + createExtraChild(new WidgetPointer(arg2), 3, 1); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg2), 4, 2); + setWidgetSize(subtract(arg4, 4), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetPosition(2, 0, 0, 0); + setWidgetText(arg5); + setWidgetTextAlignment(0, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(0, 0, 0)); + globalint_2 = 1; + } + flow_24: + return; +} diff --git a/dumps/scripts/1164.cs2 b/dumps/scripts/1164.cs2 new file mode 100644 index 000000000..ab242725a --- /dev/null +++ b/dumps/scripts/1164.cs2 @@ -0,0 +1,4 @@ +void script_1164() { + script_1165(); + return; +} diff --git a/dumps/scripts/1165.cs2 b/dumps/scripts/1165.cs2 new file mode 100644 index 000000000..2dff9ea19 --- /dev/null +++ b/dumps/scripts/1165.cs2 @@ -0,0 +1,8 @@ +void script_1165() { + int ivar0; + int ivar1; + ivar0 = subtract(getWidgetActualWidth(new WidgetPointer(743,39)), getWidgetActualWidth(new WidgetPointer(743,8))); + ivar1 = multiplyDivide(cs2method6118(), 127, ivar0); + setWidgetPosition(ivar1, 0, 0, 0, new WidgetPointer(743,8)); + return; +} diff --git a/dumps/scripts/1166.cs2 b/dumps/scripts/1166.cs2 new file mode 100644 index 000000000..2f89c25fa --- /dev/null +++ b/dumps/scripts/1166.cs2 @@ -0,0 +1,47 @@ +void script_1166(int arg0) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 3, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(4, 4, 1, 1); + setWidgetRGB(new Color(60, 52, 40)); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(4, 4, 1, 0); + setWidgetSprite(2233); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(4, 4, 1, 0); + setWidgetSprite(2234); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(3, 4, 0, 1); + setWidgetSprite(2237); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(3, 4, 0, 1); + setWidgetSprite(2238); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(9, 9, 0, 0); + setWidgetSprite(2241); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(9, 9, 0, 0); + setWidgetSprite(2241); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(9, 9, 0, 0); + setWidgetSprite(2242); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(9, 9, 0, 0); + setWidgetSprite(2242); + setWidgetHFlip(1); + return; +} diff --git a/dumps/scripts/1167.cs2 b/dumps/scripts/1167.cs2 new file mode 100644 index 000000000..c2bf52132 --- /dev/null +++ b/dumps/scripts/1167.cs2 @@ -0,0 +1,84 @@ +void script_1167() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + ivar0 = -1; + switch (globalint_1001) { + case 1: + ivar0 = 738; + break; + case 2: + ivar0 = 739; + break; + case 3: + ivar0 = 740; + break; + case 4: + ivar0 = 741; + break; + case 5: + ivar0 = 742; + break; + default: + return; + } + setWidgetText(new WidgetPointer(885,14), cs2method_3408(105, 115, 205, globalint_1001)); + ivar1 = 0; + ivar2 = 0; + ivar3 = 16; + ivar4 = 16; + ivar5 = 56; + ivar6 = 50; + ivar7 = getCommonDefinitionSize(ivar0); + ivar8 = 5; + ivar9 = -1; + deleteAllExtraChilds(new WidgetPointer(885,16)); + while (ivar1 < ivar7) { + ivar9 = cs2method_3408(105, 111, ivar0, ivar1); + if (ivar9 != -1) { + createExtraChild(new WidgetPointer(885,16), 5, ivar2); + setWidgetSize(36, 32, 0, 0); + setItemOnWidgetMethod1208(cs2method_3408(105, 111, ivar0, ivar1), -1); + setWidgetPosition(add(11, add(ivar3, multiply(add(36, ivar5), mod(ivar1, ivar8)))), add(6, add(ivar4, multiply(divide(ivar1, ivar8), add(32, ivar6)))), 0, 0); + setWidgetContextMenuOption(1, "Examine"); + cs2method1305("" + getItemName(ivar9)); + createExtraChild(new WidgetPointer(885,16), 4, add(ivar2, 1)); + setWidgetSize(56, 10, 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(204, 153, 0)); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(1, 0, 0); + if (((boolean)stringMethod4107(getWidgetText(), ""))) { + setWidgetText("Getting data..."); + } + setWidgetPosition(add(ivar3, multiply(add(ivar5, 36), mod(ivar1, ivar8))), add(47, add(ivar4, multiply(divide(ivar1, ivar8), add(32, ivar6)))), 0, 0); + setWidgetIsHidden(false, cs2method_3408(105, 73, 737, ivar1)); + setWidgetPosition(add(ivar3, multiply(add(36, ivar5), mod(ivar1, ivar8))), add(ivar4, multiply(divide(ivar1, ivar8), add(32, ivar6))), 0, 0, cs2method_3408(105, 73, 737, ivar1)); + ivar2 = add(ivar2, 2); + } + ivar1 = add(ivar1, 1); + } + while (ivar1 < getCommonDefinitionSize(737)) { + setWidgetIsHidden(true, cs2method_3408(105, 73, 737, ivar1)); + ivar1 = add(ivar1, 1); + } + if (ivar7 <= 15) { + cs2method2100(0, 0, new WidgetPointer(885,16)); + setWidgetScrollMax(0, 0, new WidgetPointer(885,16)); + deleteAllExtraChilds(new WidgetPointer(885,48)); + setWidgetIsHidden(true, new WidgetPointer(885,48)); + } else { + setWidgetIsHidden(false, new WidgetPointer(885,48)); + cs2method2100(0, 0, new WidgetPointer(885,16)); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(885,16)), add(60, add(ivar4, multiply(divide(ivar7, ivar8), add(32, ivar6)))), new WidgetPointer(885,16)); + script_31(57999408, 57999376, 792, 789, 790, 791, 773, 788); + } + return; +} diff --git a/dumps/scripts/1168.cs2 b/dumps/scripts/1168.cs2 new file mode 100644 index 000000000..54ce48d6c --- /dev/null +++ b/dumps/scripts/1168.cs2 @@ -0,0 +1,9 @@ +void script_1168(int arg0,int arg1,string arg2) { + if (mod(getClientCycle(), 50) != 0) { + return; + } + if (setWidgetRegister(new WidgetPointer(885,16), arg0)) { + setWidgetText(arg2); + } + return; +} diff --git a/dumps/scripts/1169.cs2 b/dumps/scripts/1169.cs2 new file mode 100644 index 000000000..bfb5571a8 --- /dev/null +++ b/dumps/scripts/1169.cs2 @@ -0,0 +1,6 @@ +void script_1169(int arg0,int arg1,string arg2) { + int ivar2; + ivar2 = ((int)cs2method_3408(105, 73, 737, arg1)); + setScriptCallOnGameloop(1168, arg0, arg2, new WidgetPointer(ivar2), "isI", new WidgetPointer(ivar2)); + return; +} diff --git a/dumps/scripts/117.cs2 b/dumps/scripts/117.cs2 new file mode 100644 index 000000000..cc4454df5 --- /dev/null +++ b/dumps/scripts/117.cs2 @@ -0,0 +1,13 @@ +void script_117() { + if (((bitconfig_3756 < 1) || (bitconfig_3756 > 20)) || ((boolean)script_1314(subtract(bitconfig_3756, 1)))) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(746,22)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(548,128)); + script_736(-1, -1, -1, -1); + script_1364(); + return; + } + script_2756(); + setScriptCallOnGameloop(1420, "", new WidgetPointer(746,22)); + setScriptCallOnGameloop(1420, "", new WidgetPointer(548,128)); + return; +} diff --git a/dumps/scripts/1170.cs2 b/dumps/scripts/1170.cs2 new file mode 100644 index 000000000..b5a5eb631 --- /dev/null +++ b/dumps/scripts/1170.cs2 @@ -0,0 +1,8 @@ +void script_1170() { + if (getWidgetShadeColor(new WidgetPointer(601,1)) > globalint_1435) { + cs2method2103(max(50, subtract(getWidgetShadeColor(new WidgetPointer(601,1)), 1)), new WidgetPointer(601,1)); + } else { + cs2method2103(min(255, add(getWidgetShadeColor(new WidgetPointer(601,1)), 1)), new WidgetPointer(601,1)); + } + return; +} diff --git a/dumps/scripts/1171.cs2 b/dumps/scripts/1171.cs2 new file mode 100644 index 000000000..9c2393452 --- /dev/null +++ b/dumps/scripts/1171.cs2 @@ -0,0 +1,4 @@ +void script_1171() { + setWidgetSize(100, 90, 0, 0, new WidgetPointer(601,0)); + return; +} diff --git a/dumps/scripts/1172.cs2 b/dumps/scripts/1172.cs2 new file mode 100644 index 000000000..e1fa92427 --- /dev/null +++ b/dumps/scripts/1172.cs2 @@ -0,0 +1,5 @@ +void script_1172(int arg0,int arg1,int arg2) { + script_25(); + script_2708(arg0, arg1, arg2, 57802828, 57802830, 57802829); + return; +} diff --git a/dumps/scripts/1173.cs2 b/dumps/scripts/1173.cs2 new file mode 100644 index 000000000..fdfb50434 --- /dev/null +++ b/dumps/scripts/1173.cs2 @@ -0,0 +1,4 @@ +void script_1173(int arg0) { + script_1174(arg0); + return; +} diff --git a/dumps/scripts/1174.cs2 b/dumps/scripts/1174.cs2 new file mode 100644 index 000000000..b802a9801 --- /dev/null +++ b/dumps/scripts/1174.cs2 @@ -0,0 +1,4 @@ +void script_1174(int arg0) { + script_3239(arg0, 0, 0); + return; +} diff --git a/dumps/scripts/1175.cs2 b/dumps/scripts/1175.cs2 new file mode 100644 index 000000000..6145c38aa --- /dev/null +++ b/dumps/scripts/1175.cs2 @@ -0,0 +1,68 @@ +void script_1175() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + if (mod(getClientCycle(), 10) != 0) { + return; + } + ivar0 = 0; + ivar1 = extractY(getMyPositionHash()); + ivar2 = extractX(getMyPositionHash()); + if (((ivar1 > 9919) && (ivar1 < 10368)) && ((ivar2 > 3007) && (ivar2 < 3136))) { + ivar0 = add(divide(subtract(ivar1, 9920), 8), 1); + } else { + if ((((ivar1 > 3524) && (ivar1 < 3968)) && ((ivar2 > 2943) && (ivar2 < 3393))) && ((boolean)bitconfig_5447)) { + ivar0 = add(divide(subtract(ivar1, 3520), 8), 1); + } + } + if (ivar0 < 0) { + ivar0 = 0; + } else { + if (ivar0 > 60) { + ivar0 = 60; + } + } + ivar3 = getMyCombat(); + ivar4 = 0; + ivar5 = 0; + if (((boolean)script_208())) { + ivar4 = subtract(ivar3, ivar0); + if (ivar4 < 20) { + ivar4 = 20; + } + ivar5 = add(ivar3, ivar0); + if (ivar5 > 138) { + ivar5 = 138; + } + if (ivar4 == ivar5) { + if (getDisplayMode() < 2) { + setWidgetText(new WidgetPointer(548,10), " "); + } else { + setWidgetText(new WidgetPointer(746,17), " "); + } + return; + } + } else { + ivar4 = subtract(ivar3, add(ivar0, add(5, divide(ivar3, 10)))); + if (ivar4 < 20) { + ivar4 = 20; + } + ivar5 = add(ivar3, add(ivar0, add(5, divide(ivar3, 10)))); + if (ivar5 > 138) { + ivar5 = 138; + } + while ((ivar5 < 139) && (subtract(ivar5, add(ivar0, add(5, divide(ivar5, 10)))) <= ivar3)) { + ivar5 = add(ivar5, 1); + } + ivar5 = subtract(ivar5, 1); + } + if (getDisplayMode() < 2) { + setWidgetText(new WidgetPointer(548,10), intToStr(ivar4) + " - " + intToStr(ivar5)); + } else { + setWidgetText(new WidgetPointer(746,17), intToStr(ivar4) + " - " + intToStr(ivar5)); + } + return; +} diff --git a/dumps/scripts/1176.cs2 b/dumps/scripts/1176.cs2 new file mode 100644 index 000000000..5d22be50d --- /dev/null +++ b/dumps/scripts/1176.cs2 @@ -0,0 +1,22 @@ +void script_1176(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + if (arg1 < add(arg7, multiplyDivide(1, 3, arg9))) { + if (arg2 < add(arg8, multiplyDivide(1, 3, arg10))) { + setWidget3DRotation(0, 0, 512, 768, 0, 1000, new WidgetPointer(arg0)); + setWidgetSize(50, 50, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(max(add(arg5, arg3), 0), max(add(arg6, arg4), 22), 0, 0, new WidgetPointer(arg0)); + } else { + setWidget3DRotation(0, 0, 512, 256, 0, 1000, new WidgetPointer(arg0)); + setWidgetSize(50, 50, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(max(add(arg5, arg3), 0), subtract(min(arg6, arg10), getWidgetActualHeight(new WidgetPointer(arg0))), 0, 0, new WidgetPointer(arg0)); + } + } else if (arg2 < add(arg8, multiplyDivide(1, 3, arg10))) { + setWidget3DRotation(0, 0, 512, 1280, 0, 1000, new WidgetPointer(arg0)); + setWidgetSize(50, 50, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(min(subtract(arg5, getWidgetActualWidth(new WidgetPointer(arg0))), arg9), max(add(arg6, arg4), 22), 0, 0, new WidgetPointer(arg0)); + } else { + setWidget3DRotation(0, 0, 512, 1792, 0, 1000, new WidgetPointer(arg0)); + setWidgetSize(50, 50, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(min(subtract(arg5, getWidgetActualWidth(new WidgetPointer(arg0))), arg9), subtract(min(arg6, arg10), getWidgetActualHeight(new WidgetPointer(arg0))), 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1177.cs2 b/dumps/scripts/1177.cs2 new file mode 100644 index 000000000..03b4481cc --- /dev/null +++ b/dumps/scripts/1177.cs2 @@ -0,0 +1,9 @@ +void script_1177() { + if (((boolean)standart_config_1414)) { + return; + } + globalint_548 = 540; + setWidgetText(new WidgetPointer(745,5), "10"); + setScriptCallOnGameloop(1178, "", new WidgetPointer(745,5)); + return; +} diff --git a/dumps/scripts/1178.cs2 b/dumps/scripts/1178.cs2 new file mode 100644 index 000000000..87c567587 --- /dev/null +++ b/dumps/scripts/1178.cs2 @@ -0,0 +1,8 @@ +void script_1178() { + globalint_548 = max(0, subtract(globalint_548, 1)); + setWidgetText(new WidgetPointer(745,5), intToStr(divide(multiply(globalint_548, 2), 100))); + if (globalint_548 <= 0) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(745,5)); + } + return; +} diff --git a/dumps/scripts/1179.cs2 b/dumps/scripts/1179.cs2 new file mode 100644 index 000000000..7b1528385 --- /dev/null +++ b/dumps/scripts/1179.cs2 @@ -0,0 +1,18 @@ +void script_1179() { + if (((boolean)bitconfig_7232)) { + if (((boolean)getLanguage())) { + setWidgetSprite(5571, new WidgetPointer(548,0)); + setWidgetSprite(5571, new WidgetPointer(746,229)); + } else { + setWidgetSprite(5569, new WidgetPointer(548,0)); + setWidgetSprite(5569, new WidgetPointer(746,229)); + } + } else if (((boolean)getLanguage())) { + setWidgetSprite(2715, new WidgetPointer(548,0)); + setWidgetSprite(2715, new WidgetPointer(746,229)); + } else { + setWidgetSprite(2731, new WidgetPointer(548,0)); + setWidgetSprite(2731, new WidgetPointer(746,229)); + } + return; +} diff --git a/dumps/scripts/118.cs2 b/dumps/scripts/118.cs2 new file mode 100644 index 000000000..dae044982 --- /dev/null +++ b/dumps/scripts/118.cs2 @@ -0,0 +1,4 @@ +void script_118() { + script_1667(); + return; +} diff --git a/dumps/scripts/1180.cs2 b/dumps/scripts/1180.cs2 new file mode 100644 index 000000000..711beebcc --- /dev/null +++ b/dumps/scripts/1180.cs2 @@ -0,0 +1,18 @@ +void script_1180() { + if (((boolean)bitconfig_7232)) { + if (((boolean)getLanguage())) { + setWidgetSprite(5570, new WidgetPointer(548,0)); + setWidgetSprite(5570, new WidgetPointer(746,229)); + } else { + setWidgetSprite(5568, new WidgetPointer(548,0)); + setWidgetSprite(5568, new WidgetPointer(746,229)); + } + } else if (((boolean)getLanguage())) { + setWidgetSprite(2714, new WidgetPointer(548,0)); + setWidgetSprite(2714, new WidgetPointer(746,229)); + } else { + setWidgetSprite(2730, new WidgetPointer(548,0)); + setWidgetSprite(2730, new WidgetPointer(746,229)); + } + return; +} diff --git a/dumps/scripts/1181.cs2 b/dumps/scripts/1181.cs2 new file mode 100644 index 000000000..2a831cd8c --- /dev/null +++ b/dumps/scripts/1181.cs2 @@ -0,0 +1,4 @@ +void script_1181(int arg0) { + script_1182(arg0); + return; +} diff --git a/dumps/scripts/1182.cs2 b/dumps/scripts/1182.cs2 new file mode 100644 index 000000000..c8d0a7fac --- /dev/null +++ b/dumps/scripts/1182.cs2 @@ -0,0 +1,37 @@ +void script_1182(int arg0) { + int ivar1; + int ivar2; + string svar0; + string svar1; + int stack_dump0; + opcStruct6506(4,3,0) structdump_1; + if (cs2method6500()) { + setScriptCallOnGameloop(1181, arg0, "i", new WidgetPointer(909,14)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(909,14)); + ivar1 = 0; + svar0 = ""; + ivar2 = 0; + svar1 = ""; + stack_dump0 = arg0; + structdump_1 = cs2method6506(stack_dump0); + svar1 = structdump_1.stringpart_2; + ivar1 = structdump_1.intpart_3; + ivar1 = structdump_1.intpart_2; + svar0 = structdump_1.stringpart_1; + ivar1 = structdump_1.intpart_1; + svar0 = structdump_1.stringpart_0; + ivar2 = structdump_1.intpart_0; + if (ivar2 == -1) { + messageType0("Sorry, you can't join that person."); + } else if (setWorldHost(arg0, svar1)) { + globalint_547 = 0; + script_3143(0, "Switched to game world " + intToStr(arg0)); + script_3062(59375787); + } else { + script_3143(1, "Sorry, we couldn't contact world " + intToStr(arg0) + "." + "
" + "Please choose a different world."); + messageType0("Sorry, we couldn't contact world " + intToStr(arg0) + ". Please choose a different world."); + } + return; +} diff --git a/dumps/scripts/1183.cs2 b/dumps/scripts/1183.cs2 new file mode 100644 index 000000000..eba647017 --- /dev/null +++ b/dumps/scripts/1183.cs2 @@ -0,0 +1,44 @@ +void script_1183(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + switch (globalint_808) { + case 1: + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetText(new WidgetPointer(arg0), "Draughts"); + setWidgetText(new WidgetPointer(arg1), intToStr(standart_config_354)); + break; + case 2: + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetText(new WidgetPointer(arg0), "Runelink"); + setWidgetText(new WidgetPointer(arg1), intToStr(standart_config_353)); + break; + case 3: + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + setWidgetIsHidden(false, new WidgetPointer(arg4)); + setWidgetText(new WidgetPointer(arg0), "Runesquares"); + setWidgetText(new WidgetPointer(arg1), intToStr(standart_config_648)); + break; + case 4: + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(false, new WidgetPointer(arg5)); + setWidgetText(new WidgetPointer(arg0), "Runeversi"); + setWidgetText(new WidgetPointer(arg1), intToStr(standart_config_649)); + break; + default: + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetText(new WidgetPointer(arg0), ""); + setWidgetText(new WidgetPointer(arg1), ""); + } + return; +} diff --git a/dumps/scripts/1184.cs2 b/dumps/scripts/1184.cs2 new file mode 100644 index 000000000..6d4dfcad1 --- /dev/null +++ b/dumps/scripts/1184.cs2 @@ -0,0 +1,5 @@ +void script_1184(int arg0) { + setWidgetRGB(new Color(script_806()), new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), intToStr(getRunEnergy())); + return; +} diff --git a/dumps/scripts/1185.cs2 b/dumps/scripts/1185.cs2 new file mode 100644 index 000000000..4c495572f --- /dev/null +++ b/dumps/scripts/1185.cs2 @@ -0,0 +1,6 @@ +void script_1185(int arg0,int arg1) { + int ivar2; + ivar2 = subtract(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg1))); + setWidgetPosition(multiply(subtract(cs2method6101(), 1), divide(ivar2, 3)), 0, 0, 0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/1186.cs2 b/dumps/scripts/1186.cs2 new file mode 100644 index 000000000..748f3cfba --- /dev/null +++ b/dumps/scripts/1186.cs2 @@ -0,0 +1,62 @@ +void script_1186() { + int ivar0; + if (getDisplayMode() >= 2) { + if (isWidgetOpen(new WidgetPointer(752,13))) { + setWidgetIsHidden(false, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + if (((boolean)bitconfig_542)) { + setWidgetSprite(1204, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } else { + setWidgetSprite(1205, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(752,2)); + } + } else if (isWidgetOpen(new WidgetPointer(752,12))) { + setWidgetIsHidden(false, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + if (((boolean)bitconfig_542)) { + setWidgetSprite(1204, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } else { + setWidgetSprite(1205, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(752,2)); + } + } else if (isWidgetOpen(new WidgetPointer(752,11))) { + setWidgetIsHidden(false, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + if (((boolean)bitconfig_542)) { + setWidgetSprite(1204, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } else { + setWidgetSprite(1205, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(752,2)); + } + } else { + if (isWidgetOpen(new WidgetPointer(752,10))) { + setWidgetIsHidden(false, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + if (((boolean)bitconfig_542)) { + setWidgetSprite(1204, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } else { + setWidgetSprite(1205, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(752,2)); + } + } + } + } + ivar0 = script_734(bitconfig_6448); + setWidgetIsHidden(((boolean)ivar0), new WidgetPointer(548,15)); + setWidgetIsHidden(((boolean)ivar0), new WidgetPointer(548,10)); + setWidgetIsHidden(((boolean)ivar0), new WidgetPointer(746,15)); + setWidgetIsHidden(((boolean)ivar0), new WidgetPointer(746,17)); + if (((boolean)script_1569())) { + setWidgetIsHidden(((boolean)ivar0), new WidgetPointer(746,71)); + setWidgetIsHidden(((boolean)ivar0), new WidgetPointer(746,79)); + } else { + setWidgetIsHidden(true, new WidgetPointer(746,71)); + setWidgetIsHidden(false, new WidgetPointer(746,79)); + } + setWidgetIsHidden(((boolean)ivar0), new WidgetPointer(746,20)); + return; +} diff --git a/dumps/scripts/1187.cs2 b/dumps/scripts/1187.cs2 new file mode 100644 index 000000000..869e932fe --- /dev/null +++ b/dumps/scripts/1187.cs2 @@ -0,0 +1,4 @@ +void script_1187() { + sendCloseWidgetPacket(); + return; +} diff --git a/dumps/scripts/1188.cs2 b/dumps/scripts/1188.cs2 new file mode 100644 index 000000000..84e4d10a9 --- /dev/null +++ b/dumps/scripts/1188.cs2 @@ -0,0 +1,11 @@ +void script_1188() { + if (getDisplayMode() >= 2) { + setWidgetSprite(1017, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + script_1652(0); + setWidgetIsHidden(true, new WidgetPointer(746,75)); + } + return; +} diff --git a/dumps/scripts/1189.cs2 b/dumps/scripts/1189.cs2 new file mode 100644 index 000000000..6da395b27 --- /dev/null +++ b/dumps/scripts/1189.cs2 @@ -0,0 +1,4 @@ +void script_1189(int arg0,int arg1) { + setWidgetIsHidden(((boolean)arg1), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/119.cs2 b/dumps/scripts/119.cs2 new file mode 100644 index 000000000..068225aae --- /dev/null +++ b/dumps/scripts/119.cs2 @@ -0,0 +1,4 @@ +void script_119(int arg0) { + script_1365(arg0); + return; +} diff --git a/dumps/scripts/1190.cs2 b/dumps/scripts/1190.cs2 new file mode 100644 index 000000000..a5029edc1 --- /dev/null +++ b/dumps/scripts/1190.cs2 @@ -0,0 +1,25 @@ +void script_1190() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + while (ivar0 < getItemContainerLength(482)) { + createExtraChild(new WidgetPointer(477,26), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + ivar1 = script_1425(ivar0); + ivar2 = script_1426(ivar0); + setWidgetPosition(ivar1, ivar2, 0, 0); + if (getItemIdInSlot(482, ivar0) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(482, ivar0), getItemAmtInSlot(482, ivar0)); + cs2method1305(getItemName(getItemIdInSlot(482, ivar0))); + setWidgetContextMenuOption(1, "Value"); + setWidgetContextMenuOption(2, "Buy 1"); + setWidgetContextMenuOption(3, "Buy 5"); + setWidgetContextMenuOption(4, "Buy 10"); + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/1191.cs2 b/dumps/scripts/1191.cs2 new file mode 100644 index 000000000..9ecb43bd6 --- /dev/null +++ b/dumps/scripts/1191.cs2 @@ -0,0 +1,6 @@ +void script_1191(int arg0,int arg1) { + if (getLanguage() != 0) { + setWidgetFont(arg1, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1192.cs2 b/dumps/scripts/1192.cs2 new file mode 100644 index 000000000..40a5b0743 --- /dev/null +++ b/dumps/scripts/1192.cs2 @@ -0,0 +1,7 @@ +void script_1192(int arg0,int arg1) { + setWidgetSize(add(getMaxLineWidth(512, 495, getWidgetText(new WidgetPointer(arg1))), 34), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + setScriptCallOnGlobalConfigChange(1193, 1, 1002, 1, "1Y", new WidgetPointer(arg0)); + setScriptCallOnGameloop(1193, 0, "1", new WidgetPointer(arg0)); + script_1194(); + return; +} diff --git a/dumps/scripts/1193.cs2 b/dumps/scripts/1193.cs2 new file mode 100644 index 000000000..a21769ce2 --- /dev/null +++ b/dumps/scripts/1193.cs2 @@ -0,0 +1,6 @@ +void script_1193(int arg0) { + if (((boolean)arg0) || ((boolean)mod(getClientCycle(), 50))) { + script_1194(); + } + return; +} diff --git a/dumps/scripts/1194.cs2 b/dumps/scripts/1194.cs2 new file mode 100644 index 000000000..eda9e6249 --- /dev/null +++ b/dumps/scripts/1194.cs2 @@ -0,0 +1,17 @@ +void script_1194() { + int ivar0; + int ivar1; + if (globalint_1002 == -1) { + return; + } + ivar0 = subtract(extractX(globalint_1002), extractX(getMyPositionHash())); + if ((ivar0 > 10) || (ivar0 < -10)) { + return; + } + ivar1 = subtract(extractY(globalint_1002), extractY(getMyPositionHash())); + if ((ivar1 > 10) || (ivar1 < -10)) { + return; + } + cameraMethod5511(globalint_1002); + return; +} diff --git a/dumps/scripts/1195.cs2 b/dumps/scripts/1195.cs2 new file mode 100644 index 000000000..29796091f --- /dev/null +++ b/dumps/scripts/1195.cs2 @@ -0,0 +1,20 @@ +void script_1195() { + cs2method5405(0, 7); + cs2method5405(1, 7); + cs2method5406(0, 0, 46295015, 858, 46278629, 858, 0); + cs2method5406(1, 0, 46327781, 690, 46295013, 690, 0); + cs2method5406(0, 1, 46311394, 858, 46360545, 858, 0); + cs2method5406(1, 1, 46327780, 690, 46344164, 690, 0); + cs2method5406(0, 2, 46475237, 1400, 46573541, 1445, 0); + cs2method5406(1, 2, 46557155, 530, 46622690, 530, 0); + cs2method5406(0, 3, 46737378, 1075, 46786527, 830, 0); + cs2method5406(1, 3, 46786524, 290, 46819288, 290, 0); + cs2method5406(0, 4, 46770130, 875, 46770125, 885, 0); + cs2method5406(1, 4, 46819275, 410, 46819271, 410, 0); + cs2method5406(0, 5, 46852037, 915, 46901187, 905, 0); + cs2method5406(1, 5, 46950339, 585, 46983106, 695, 0); + cs2method5406(0, 6, 47081411, 900, 47130563, 835, 0); + cs2method5406(1, 6, 47130563, 750, 47163331, 740, 0); + script_1197(0); + return; +} diff --git a/dumps/scripts/1196.cs2 b/dumps/scripts/1196.cs2 new file mode 100644 index 000000000..a9940c910 --- /dev/null +++ b/dumps/scripts/1196.cs2 @@ -0,0 +1,6 @@ +void script_1196(int arg0,int arg1) { + if (getClientCycle() > add(arg1, 50)) { + script_1197(arg0); + } + return; +} diff --git a/dumps/scripts/1197.cs2 b/dumps/scripts/1197.cs2 new file mode 100644 index 000000000..70792863d --- /dev/null +++ b/dumps/scripts/1197.cs2 @@ -0,0 +1,16 @@ +void script_1197(int arg0) { + if (arg0 >= 6) { + return; + } + if (((boolean)arg0)) { + cameraMethod5502(0, arg0, 100, 400, 1, arg0); + setScriptCallOnMinimapRelatedSetting3(1196, add(arg0, 1), getClientCycle(), "ii", new WidgetPointer(888,0)); + } else if (arg0 == 5) { + cameraMethod5502(0, arg0, 400, 10, 1, arg0); + setScriptCallOnMinimapRelatedSetting3(1196, add(arg0, 1), getClientCycle(), "ii", new WidgetPointer(888,0)); + } else { + cameraMethod5502(0, arg0, 400, 400, 1, arg0); + setScriptCallOnMinimapRelatedSetting3(1196, add(arg0, 1), getClientCycle(), "ii", new WidgetPointer(888,0)); + } + return; +} diff --git a/dumps/scripts/1198.cs2 b/dumps/scripts/1198.cs2 new file mode 100644 index 000000000..93eeb37c3 --- /dev/null +++ b/dumps/scripts/1198.cs2 @@ -0,0 +1,38 @@ +void script_1198() { + if (((getItemAmtInContainer(93, 15249) > 0) || (getItemAmtInContainer(95, 15249) > 0)) || (bitconfig_6471 >= 44)) { + setWidgetIsHidden(true, new WidgetPointer(887,5)); + } else { + setWidgetIsHidden(false, new WidgetPointer(887,5)); + } + if ((getItemAmtInContainer(93, 15253) > 0) || (getItemAmtInContainer(95, 15253) > 0)) { + setWidgetIsHidden(true, new WidgetPointer(887,6)); + } else { + setWidgetIsHidden(false, new WidgetPointer(887,6)); + } + if (((getItemAmtInContainer(93, 15248) > 0) || (getItemAmtInContainer(95, 15248) > 0)) || (bitconfig_6471 == 42)) { + setWidgetIsHidden(true, new WidgetPointer(887,2)); + } else { + setWidgetIsHidden(false, new WidgetPointer(887,2)); + } + if ((getItemAmtInContainer(93, 15247) > 0) || (getItemAmtInContainer(95, 15247) > 0)) { + setWidgetIsHidden(true, new WidgetPointer(887,4)); + } else { + setWidgetIsHidden(false, new WidgetPointer(887,4)); + } + if ((((getItemAmtInContainer(93, 15251) > 0) || (getItemAmtInContainer(95, 15251) > 0)) || (bitconfig_6471 >= 52)) || ((boolean)bitconfig_6481)) { + setWidgetIsHidden(true, new WidgetPointer(887,8)); + } else { + setWidgetIsHidden(false, new WidgetPointer(887,8)); + } + if ((((getItemAmtInContainer(93, 15250) > 0) || (getItemAmtInContainer(95, 15250) > 0)) || (bitconfig_6471 >= 52)) || (bitconfig_6481 == 2)) { + setWidgetIsHidden(true, new WidgetPointer(887,7)); + } else { + setWidgetIsHidden(false, new WidgetPointer(887,7)); + } + if ((getItemAmtInContainer(93, 15252) > 0) || (getItemAmtInContainer(95, 15252) > 0)) { + setWidgetIsHidden(true, new WidgetPointer(887,3)); + } else { + setWidgetIsHidden(false, new WidgetPointer(887,3)); + } + return; +} diff --git a/dumps/scripts/1199.cs2 b/dumps/scripts/1199.cs2 new file mode 100644 index 000000000..73079ba97 --- /dev/null +++ b/dumps/scripts/1199.cs2 @@ -0,0 +1,13 @@ +void script_1199() { + switch (globalint_1401) { + case 0: + setWidgetRGB(new Color(255, 180, 0), new WidgetPointer(933,327)); + break; + case 1: + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(933,327)); + break; + case 2: + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(933,327)); + } + return; +} diff --git a/dumps/scripts/12.cs2 b/dumps/scripts/12.cs2 new file mode 100644 index 000000000..9f86f3a28 --- /dev/null +++ b/dumps/scripts/12.cs2 @@ -0,0 +1,55 @@ +cs2func_script_12_struct(1,1,0) script_12(int arg0) { + switch (arg0) { + case 1: + return newstruct cs2func_script_12_struct(15, "Attack"); + case 2: + return newstruct cs2func_script_12_struct(8, "Strength"); + case 5: + return newstruct cs2func_script_12_struct(15, "Defence"); + case 3: + return newstruct cs2func_script_12_struct(11, "Ranged"); + case 7: + return newstruct cs2func_script_12_struct(4, "Prayer"); + case 4: + return newstruct cs2func_script_12_struct(11, "Magic"); + case 6: + return newstruct cs2func_script_12_struct(3, "Constitution"); + case 8: + return newstruct cs2func_script_12_struct(10, "Agility"); + case 9: + return newstruct cs2func_script_12_struct(8, "Herblore"); + case 10: + return newstruct cs2func_script_12_struct(9, "Thieving"); + case 11: + return newstruct cs2func_script_12_struct(13, "Crafting"); + case 19: + return newstruct cs2func_script_12_struct(9, "Fletching"); + case 13: + return newstruct cs2func_script_12_struct(7, "Mining"); + case 14: + return newstruct cs2func_script_12_struct(16, "Smithing"); + case 15: + return newstruct cs2func_script_12_struct(8, "Fishing"); + case 16: + return newstruct cs2func_script_12_struct(16, "Cooking"); + case 17: + return newstruct cs2func_script_12_struct(9, "Firemaking"); + case 18: + return newstruct cs2func_script_12_struct(8, "Woodcutting"); + case 12: + return newstruct cs2func_script_12_struct(7, "Runecrafting"); + case 20: + return newstruct cs2func_script_12_struct(5, "Slayer"); + case 21: + return newstruct cs2func_script_12_struct(13, "Farming"); + case 22: + return newstruct cs2func_script_12_struct(16, "Construction"); + case 23: + return newstruct cs2func_script_12_struct(16, "Hunter"); + case 24: + return newstruct cs2func_script_12_struct(8, "Summoning"); + case 25: + return newstruct cs2func_script_12_struct(6, "Dungeoneering"); + } + return newstruct cs2func_script_12_struct(-1, ""); +} diff --git a/dumps/scripts/120.cs2 b/dumps/scripts/120.cs2 new file mode 100644 index 000000000..a3a2ee742 --- /dev/null +++ b/dumps/scripts/120.cs2 @@ -0,0 +1,8 @@ +void script_120(int arg0) { + int ivar1; + int ivar2; + ivar1 = add(rnd(25), 10); + ivar2 = add(rnd(25), 20); + setScriptCallOnGameloop(66, ivar1, ivar2, 0, new WidgetPointer(arg0), "iiiI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1200.cs2 b/dumps/scripts/1200.cs2 new file mode 100644 index 000000000..9434aaa04 --- /dev/null +++ b/dumps/scripts/1200.cs2 @@ -0,0 +1,7 @@ +void script_1200(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = 100; + globalint_1186 = mod(add(globalint_1186, 1), 360); + setWidget3DRotation(cs2method2610(new WidgetPointer(arg0)), cs2method2611(new WidgetPointer(arg0)), arg1, mod(add(arg2, multiplyDivide(ivar4, 10000, cs2method_3408(105, 105, 3384, globalint_1186))), 2048), mod(add(arg3, multiplyDivide(ivar4, 10000, cs2method_3408(105, 105, 3385, globalint_1186))), 2048), getWidget3DDistance(new WidgetPointer(arg0)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1201.cs2 b/dumps/scripts/1201.cs2 new file mode 100644 index 000000000..8dd9ae7fe --- /dev/null +++ b/dumps/scripts/1201.cs2 @@ -0,0 +1,5 @@ +void script_1201(int arg0,int arg1,int arg2,int arg3,int arg4) { + globalint_1186 = mod(add(globalint_1186, 1), 360); + setWidget3DRotation(cs2method2610(new WidgetPointer(arg0)), cs2method2611(new WidgetPointer(arg0)), arg1, mod(add(arg2, multiplyDivide(arg4, 10000, cs2method_3408(105, 105, 3384, globalint_1186))), 2048), mod(add(arg3, multiplyDivide(arg4, 10000, cs2method_3408(105, 105, 3385, globalint_1186))), 2048), getWidget3DDistance(new WidgetPointer(arg0)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1202.cs2 b/dumps/scripts/1202.cs2 new file mode 100644 index 000000000..f7760eb46 --- /dev/null +++ b/dumps/scripts/1202.cs2 @@ -0,0 +1,7 @@ +void script_1202(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = 100; + globalint_1186 = mod(add(globalint_1186, 1), 360); + setWidget3DRotation(cs2method2610(new WidgetPointer(arg0)), cs2method2611(new WidgetPointer(arg0)), arg1, mod(add(arg2, multiplyDivide(ivar4, 10000, cs2method_3408(105, 105, 3384, globalint_1186))), 2048), mod(add(arg3, multiplyDivide(ivar4, 10000, cs2method_3408(105, 105, 3385, globalint_1186))), 2048), getWidget3DDistance(new WidgetPointer(arg0)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1203.cs2 b/dumps/scripts/1203.cs2 new file mode 100644 index 000000000..8d9edd906 --- /dev/null +++ b/dumps/scripts/1203.cs2 @@ -0,0 +1,5 @@ +void script_1203(int arg0,int arg1,int arg2,int arg3,int arg4) { + globalint_1186 = mod(add(globalint_1186, 1), 360); + setWidget3DRotation(cs2method2610(new WidgetPointer(arg0)), cs2method2611(new WidgetPointer(arg0)), arg1, mod(add(arg2, multiplyDivide(arg4, 10000, cs2method_3408(105, 105, 3384, globalint_1186))), 2048), mod(add(arg3, multiplyDivide(arg4, 10000, cs2method_3408(105, 105, 3385, globalint_1186))), 2048), getWidget3DDistance(new WidgetPointer(arg0)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1204.cs2 b/dumps/scripts/1204.cs2 new file mode 100644 index 000000000..e9e75781f --- /dev/null +++ b/dumps/scripts/1204.cs2 @@ -0,0 +1,7 @@ +void script_1204(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = 100; + globalint_1186 = mod(add(globalint_1186, 1), 360); + setWidget3DRotation(cs2method2610(new WidgetPointer(arg0)), cs2method2611(new WidgetPointer(arg0)), arg1, mod(add(arg2, multiplyDivide(ivar4, 10000, cs2method_3408(105, 105, 3384, globalint_1186))), 2048), mod(add(arg3, multiplyDivide(ivar4, 10000, cs2method_3408(105, 105, 3385, globalint_1186))), 2048), getWidget3DDistance(new WidgetPointer(arg0)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1205.cs2 b/dumps/scripts/1205.cs2 new file mode 100644 index 000000000..f254407b0 --- /dev/null +++ b/dumps/scripts/1205.cs2 @@ -0,0 +1,4 @@ +void script_1205(int arg0,int arg1,int arg2,int arg3) { + script_1298(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/1206.cs2 b/dumps/scripts/1206.cs2 new file mode 100644 index 000000000..898f27b98 --- /dev/null +++ b/dumps/scripts/1206.cs2 @@ -0,0 +1,5 @@ +void script_1206(int arg0,int arg1,int arg2,int arg3,int arg4) { + globalint_1186 = mod(add(globalint_1186, 1), 360); + setWidget3DRotation(cs2method2610(new WidgetPointer(arg0)), cs2method2611(new WidgetPointer(arg0)), arg1, mod(add(arg2, multiplyDivide(arg4, 10000, cs2method_3408(105, 105, 3384, globalint_1186))), 2048), mod(add(arg3, multiplyDivide(arg4, 10000, cs2method_3408(105, 105, 3385, globalint_1186))), 2048), getWidget3DDistance(new WidgetPointer(arg0)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1207.cs2 b/dumps/scripts/1207.cs2 new file mode 100644 index 000000000..a25c6637b --- /dev/null +++ b/dumps/scripts/1207.cs2 @@ -0,0 +1,12 @@ +void script_1207(int arg0,int arg1) { + if (arg0 <= 11) { + setWidgetScrollMax(404, 215, new WidgetPointer(275,6)); + script_72(18022407, 18022406, 0); + } else if (((boolean)arg1)) { + script_72(18022407, 18022406, 0); + } else { + script_72(18022407, 18022406, subtract(multiply(arg0, 20), 180)); + } + setWidgetScrollMax(404, multiply(arg0, 20), new WidgetPointer(275,6)); + return; +} diff --git a/dumps/scripts/1208.cs2 b/dumps/scripts/1208.cs2 new file mode 100644 index 000000000..e4c1aca06 --- /dev/null +++ b/dumps/scripts/1208.cs2 @@ -0,0 +1,9 @@ +void script_1208(int arg0,int arg1,int arg2,int arg3) { + if (((boolean)arg3)) { + setWidgetScrollMax(0, add(arg2, getWidgetActualHeight(new WidgetPointer(arg1))), new WidgetPointer(arg1)); + } else { + setWidgetScrollMax(0, arg2, new WidgetPointer(arg1)); + } + script_72(arg0, arg1, cs2method2601(new WidgetPointer(arg1))); + return; +} diff --git a/dumps/scripts/1209.cs2 b/dumps/scripts/1209.cs2 new file mode 100644 index 000000000..1eba003d9 --- /dev/null +++ b/dumps/scripts/1209.cs2 @@ -0,0 +1,5 @@ +void script_1209(int arg0,int arg1) { + script_1540(arg0); + script_2739(arg1, -1); + return; +} diff --git a/dumps/scripts/121.cs2 b/dumps/scripts/121.cs2 new file mode 100644 index 000000000..61fb6b81e --- /dev/null +++ b/dumps/scripts/121.cs2 @@ -0,0 +1,44 @@ +int script_121(int arg0) { + if (getDisplayMode() >= 2) { + return script_1742(arg0); + } + switch (arg0) { + case 0: + return 35913866; + case 1: + return 35913867; + case 2: + return 35913868; + case 3: + return 35913869; + case 4: + return 35913870; + case 5: + return 35913871; + case 6: + return 35913872; + case 7: + return 35913873; + case 8: + return 35913835; + case 9: + return 35913836; + case 10: + return 35913837; + case 11: + return 35913838; + case 12: + return 35913839; + case 13: + return 35913840; + case 14: + return 35913841; + case 15: + return 35913842; + case 95: + return 48955400; + case 99: + return 35913910; + } + return -1; +} diff --git a/dumps/scripts/1210.cs2 b/dumps/scripts/1210.cs2 new file mode 100644 index 000000000..d6cede82d --- /dev/null +++ b/dumps/scripts/1210.cs2 @@ -0,0 +1,15 @@ +int script_1210(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + ivar4 = mod(subtract(add(getClientCycle(), arg3), arg2), arg1); + ivar5 = divide(arg1, 2); + ivar6 = subtract(ivar5, ivar4); + if (((boolean)ivar6)) { + return arg0; + } + if (ivar6 > 0) { + return subtract(arg0, multiplyDivide(ivar6, ivar5, arg0)); + } + return add(arg0, multiplyDivide(ivar6, ivar5, arg0)); +} diff --git a/dumps/scripts/1211.cs2 b/dumps/scripts/1211.cs2 new file mode 100644 index 000000000..cbd216e05 --- /dev/null +++ b/dumps/scripts/1211.cs2 @@ -0,0 +1,5 @@ +void script_1211() { + setScriptCallOnGameloop(1213, "", new WidgetPointer(894,5)); + setWidgetIsHidden(false, new WidgetPointer(894,7)); + return; +} diff --git a/dumps/scripts/1212.cs2 b/dumps/scripts/1212.cs2 new file mode 100644 index 000000000..29531bcfc --- /dev/null +++ b/dumps/scripts/1212.cs2 @@ -0,0 +1,4 @@ +void script_1212() { + script_948(); + return; +} diff --git a/dumps/scripts/1213.cs2 b/dumps/scripts/1213.cs2 new file mode 100644 index 000000000..0ef4e8acc --- /dev/null +++ b/dumps/scripts/1213.cs2 @@ -0,0 +1,12 @@ +void script_1213() { + if (script_1305() == 7) { + setWidgetText(new WidgetPointer(894,7), "To cast Wind Strike, click on the flashing spell icon, then click on a chicken. You can hover over spell icons to read a brief description of the spell and the runes required to cast it."); + setWidgetText(new WidgetPointer(894,6), ""); + setWidgetSprite(15, new WidgetPointer(894,4)); + } else { + setWidgetText(new WidgetPointer(894,7), "Click on the Magic icon to open your magic spellbook."); + setWidgetText(new WidgetPointer(894,6), ""); + setWidgetSprite(1824, new WidgetPointer(894,4)); + } + return; +} diff --git a/dumps/scripts/1214.cs2 b/dumps/scripts/1214.cs2 new file mode 100644 index 000000000..477ac77e4 --- /dev/null +++ b/dumps/scripts/1214.cs2 @@ -0,0 +1,4 @@ +void script_1214(int arg0,int arg1,int arg2,int arg3) { + script_2005(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/1215.cs2 b/dumps/scripts/1215.cs2 new file mode 100644 index 000000000..022f2483e --- /dev/null +++ b/dumps/scripts/1215.cs2 @@ -0,0 +1,27 @@ +void script_1215(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = max(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg1))), 1); + arg2 = min(max(arg2, 0), ivar4); + switch (arg3) { + case 0: + cs2method6018(multiplyDivide(arg2, ivar4, 127)); + script_1217(arg0, arg1); + break; + case 1: + cs2method6019(multiplyDivide(arg2, ivar4, 255)); + script_1216(arg0, arg1); + break; + case 2: + cs2method6020(multiplyDivide(arg2, ivar4, 127)); + script_1218(arg0, arg1); + break; + case 3: + cs2method6001(add(min(multiplyDivide(arg2, ivar4, 4), 3), 1)); + script_1185(arg0, arg1); + break; + case 4: + cs2method6038(multiplyDivide(arg2, ivar4, 255)); + script_2007(arg0, arg1, 1, 1); + } + return; +} diff --git a/dumps/scripts/1216.cs2 b/dumps/scripts/1216.cs2 new file mode 100644 index 000000000..0861adef5 --- /dev/null +++ b/dumps/scripts/1216.cs2 @@ -0,0 +1,9 @@ +void script_1216(int arg0,int arg1) { + int ivar2; + int ivar3; + cs2method2301(arg0, -1, new WidgetPointer(arg1)); + ivar2 = subtract(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg1))); + ivar3 = multiplyDivide(cs2method6119(), 255, ivar2); + setWidgetPosition(ivar3, 0, 0, 0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/1217.cs2 b/dumps/scripts/1217.cs2 new file mode 100644 index 000000000..f08087a70 --- /dev/null +++ b/dumps/scripts/1217.cs2 @@ -0,0 +1,9 @@ +void script_1217(int arg0,int arg1) { + int ivar2; + int ivar3; + cs2method2301(arg0, -1, new WidgetPointer(arg1)); + ivar2 = subtract(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg1))); + ivar3 = multiplyDivide(cs2method6118(), 127, ivar2); + setWidgetPosition(ivar3, 0, 0, 0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/1218.cs2 b/dumps/scripts/1218.cs2 new file mode 100644 index 000000000..3f9fa254a --- /dev/null +++ b/dumps/scripts/1218.cs2 @@ -0,0 +1,9 @@ +void script_1218(int arg0,int arg1) { + int ivar2; + int ivar3; + cs2method2301(arg0, -1, new WidgetPointer(arg1)); + ivar2 = subtract(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg1))); + ivar3 = multiplyDivide(cs2method6120(), 127, ivar2); + setWidgetPosition(ivar3, 0, 0, 0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/1219.cs2 b/dumps/scripts/1219.cs2 new file mode 100644 index 000000000..3a6404d7b --- /dev/null +++ b/dumps/scripts/1219.cs2 @@ -0,0 +1,5 @@ +void script_1219(int arg0,int arg1,int arg2) { + cs2method6017(((boolean)arg0)); + script_1220(arg1, arg2); + return; +} diff --git a/dumps/scripts/122.cs2 b/dumps/scripts/122.cs2 new file mode 100644 index 000000000..8bf91e82a --- /dev/null +++ b/dumps/scripts/122.cs2 @@ -0,0 +1,11 @@ +void script_122(int arg0) { + int ivar1; + ivar1 = 0; + ivar1 = mod(getClientCycle(), 100); + if (ivar1 > 50) { + ivar1 = subtract(100, ivar1); + } + ivar1 = subtract(255, ivar1); + cs2method2103(ivar1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1220.cs2 b/dumps/scripts/1220.cs2 new file mode 100644 index 000000000..c24a25665 --- /dev/null +++ b/dumps/scripts/1220.cs2 @@ -0,0 +1,10 @@ +void script_1220(int arg0,int arg1) { + if (cs2method6117()) { + setWidgetSprite(4086, new WidgetPointer(arg1)); + setWidgetSprite(4084, new WidgetPointer(arg0)); + } else { + setWidgetSprite(4086, new WidgetPointer(arg0)); + setWidgetSprite(4084, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1221.cs2 b/dumps/scripts/1221.cs2 new file mode 100644 index 000000000..04344d870 --- /dev/null +++ b/dumps/scripts/1221.cs2 @@ -0,0 +1,178 @@ +void script_1221(int arg0,int arg1) { + int ivar2; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_802_struct(1,1,0) structdump_5; + cs2func_script_802_struct(1,1,0) structdump_6; + if (globalint_174 == 11) { + return; + } + ivar2 = script_2948(); + switch (globalint_174) { + flow_3: + case 12: + if (arg0 == 13) { + script_2936(0); + return; + } + return; + case 2: + switch (ivar2) { + case 21: + case 1: + case -3: + return; + } + if (arg0 == 13) { + script_1174(11); + return; + } + return; + case 3: + switch (ivar2) { + case 21: + case 1: + case -3: + return; + } + switch (arg0) { + case 13: + script_1174(11); + return; + case 84: + case 80: + if (globalint_175 >= getClientCycle()) { + return; + } + globalint_174 = 4; + globalint_175 = getClientCycle(); + globalint_1099 = strLength(script_2949(globalstring_33)); + script_3237(39059534, 39059535, 39059536, 4, script_2949(globalstring_33)); + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1099 = script_1553(arg0, globalint_1099, globalstring_32); + script_3237(39059528, 39059529, 39059530, 3, globalstring_32); + return; + } + IF ((strLength(globalstring_32) >= 320) && (arg0 != 85)) + GOTO flow_21 + GOTO flow_22 + flow_21: + IF (arg0 != 101) + GOTO flow_23 + flow_22: + IF (((boolean)strLength(strRemoveEntities(concatChar(((char)arg1), ""))))) + GOTO flow_23 + GOTO flow_24 + flow_23: + return; + flow_24: + stack_dump0 = globalint_1099; + stack_dump1 = 0; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_32; + structdump_5 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_5.stringpart_0; + globalint_1099 = structdump_5.intpart_0; + globalstring_32 = stack_dump4; + setWidgetText(new WidgetPointer(596,73), globalstring_32); + script_3237(39059528, 39059529, 39059530, 3, globalstring_32); + return; + case 4: + switch (ivar2) { + case 21: + case 1: + case -3: + return; + } + switch (arg0) { + case 13: + script_1174(11); + return; + case 84: + case 80: + if (globalint_175 >= getClientCycle()) { + return; + } + if ((arg0 == 84) && (strLength(globalstring_32) > 0)) { + script_2945(); + return; + } + globalint_174 = 3; + globalint_175 = getClientCycle(); + globalint_1099 = strLength(globalstring_32); + script_3237(39059528, 39059529, 39059530, 3, globalstring_32); + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1099 = script_1553(arg0, globalint_1099, script_2949(globalstring_33)); + script_3237(39059534, 39059535, 39059536, 4, script_2949(globalstring_33)); + return; + } + if (((strLength(globalstring_33) >= 20) && (arg0 != 85)) && (arg0 != 101)) { + return; + } + stack_dump0 = globalint_1099; + stack_dump1 = 0; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_33; + structdump_6 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_6.stringpart_0; + globalint_1099 = structdump_6.intpart_0; + globalstring_33 = stack_dump4; + setWidgetText(new WidgetPointer(596,79), script_2949(globalstring_33)); + script_3237(39059534, 39059535, 39059536, 4, script_2949(globalstring_33)); + return; + case 5: + switch (ivar2) { + case -3: + case 1: + return; + } + if ((ivar2 == 21) && (arg0 == 13)) { + script_3235(); + return; + } + if (arg0 == 13) { + script_2954(); + return; + } + return; + case 10: + script_2222(arg0); + return; + case 6: + case 7: + case 8: + case 14: + case 15: + script_3216(arg0, arg1); + return; + case 13: + if (arg0 == 13) { + script_1174(globalint_1091); + return; + } + return; + case 17: + if (arg0 == 84) { + script_2206(); + } + return; + } + return; +} diff --git a/dumps/scripts/1222.cs2 b/dumps/scripts/1222.cs2 new file mode 100644 index 000000000..7fa39267c --- /dev/null +++ b/dumps/scripts/1222.cs2 @@ -0,0 +1,5 @@ +void script_1222() { + setScriptCallOnGameloop(1329, "", new WidgetPointer(894,5)); + setWidgetIsHidden(false, new WidgetPointer(894,7)); + return; +} diff --git a/dumps/scripts/1223.cs2 b/dumps/scripts/1223.cs2 new file mode 100644 index 000000000..e541d463d --- /dev/null +++ b/dumps/scripts/1223.cs2 @@ -0,0 +1,34 @@ +void script_1223() { + if (IsFemale()) { + setWidgetIsHidden(false, new WidgetPointer(308,20)); + setWidgetIsHidden(false, new WidgetPointer(308,22)); + setWidgetIsHidden(false, new WidgetPointer(308,24)); + setWidgetIsHidden(false, new WidgetPointer(308,26)); + setWidgetIsHidden(false, new WidgetPointer(308,28)); + setWidgetIsHidden(false, new WidgetPointer(308,30)); + setWidgetIsHidden(false, new WidgetPointer(308,32)); + setWidgetIsHidden(true, new WidgetPointer(308,19)); + setWidgetIsHidden(true, new WidgetPointer(308,21)); + setWidgetIsHidden(true, new WidgetPointer(308,23)); + setWidgetIsHidden(true, new WidgetPointer(308,25)); + setWidgetIsHidden(true, new WidgetPointer(308,27)); + setWidgetIsHidden(true, new WidgetPointer(308,29)); + setWidgetIsHidden(true, new WidgetPointer(308,31)); + } else { + setWidgetIsHidden(true, new WidgetPointer(308,20)); + setWidgetIsHidden(true, new WidgetPointer(308,22)); + setWidgetIsHidden(true, new WidgetPointer(308,24)); + setWidgetIsHidden(true, new WidgetPointer(308,26)); + setWidgetIsHidden(true, new WidgetPointer(308,28)); + setWidgetIsHidden(true, new WidgetPointer(308,30)); + setWidgetIsHidden(true, new WidgetPointer(308,32)); + setWidgetIsHidden(false, new WidgetPointer(308,19)); + setWidgetIsHidden(false, new WidgetPointer(308,21)); + setWidgetIsHidden(false, new WidgetPointer(308,23)); + setWidgetIsHidden(false, new WidgetPointer(308,25)); + setWidgetIsHidden(false, new WidgetPointer(308,27)); + setWidgetIsHidden(false, new WidgetPointer(308,29)); + setWidgetIsHidden(false, new WidgetPointer(308,31)); + } + return; +} diff --git a/dumps/scripts/1224.cs2 b/dumps/scripts/1224.cs2 new file mode 100644 index 000000000..82105b407 --- /dev/null +++ b/dumps/scripts/1224.cs2 @@ -0,0 +1,4 @@ +void script_1224(int arg0) { + script_1226(arg0); + return; +} diff --git a/dumps/scripts/1225.cs2 b/dumps/scripts/1225.cs2 new file mode 100644 index 000000000..589521ae0 --- /dev/null +++ b/dumps/scripts/1225.cs2 @@ -0,0 +1,4 @@ +void script_1225() { + script_1226(bitconfig_5939); + return; +} diff --git a/dumps/scripts/1226.cs2 b/dumps/scripts/1226.cs2 new file mode 100644 index 000000000..17f421de4 --- /dev/null +++ b/dumps/scripts/1226.cs2 @@ -0,0 +1,116 @@ +void script_1226(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(308,15)); + setWidgetIsHidden(true, new WidgetPointer(308,14)); + setWidgetSprite(1134, new WidgetPointer(308,35)); + setWidgetIsHidden(true, new WidgetPointer(308,13)); + setWidgetIsHidden(true, new WidgetPointer(308,12)); + setWidgetSprite(1134, new WidgetPointer(308,34)); + setWidgetIsHidden(true, new WidgetPointer(308,11)); + setWidgetIsHidden(true, new WidgetPointer(308,10)); + setWidgetSprite(1134, new WidgetPointer(308,33)); + setWidgetIsHidden(true, new WidgetPointer(308,9)); + setWidgetIsHidden(true, new WidgetPointer(308,8)); + setWidgetSprite(1134, new WidgetPointer(308,39)); + setWidgetIsHidden(true, new WidgetPointer(308,7)); + setWidgetIsHidden(true, new WidgetPointer(308,6)); + setWidgetSprite(1134, new WidgetPointer(308,37)); + setWidgetIsHidden(true, new WidgetPointer(308,5)); + setWidgetIsHidden(true, new WidgetPointer(308,4)); + setWidgetSprite(1134, new WidgetPointer(308,36)); + setWidgetIsHidden(true, new WidgetPointer(308,3)); + setWidgetIsHidden(true, new WidgetPointer(308,2)); + setWidgetSprite(1134, new WidgetPointer(308,38)); + if (IsFemale()) { + switch (arg0) { + case 0: + setWidgetIsHidden(false, new WidgetPointer(308,15)); + setWidgetSprite(1135, new WidgetPointer(308,35)); + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(308,13)); + setWidgetSprite(1135, new WidgetPointer(308,34)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(308,11)); + setWidgetSprite(1135, new WidgetPointer(308,33)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(308,9)); + setWidgetSprite(1135, new WidgetPointer(308,39)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(308,7)); + setWidgetSprite(1135, new WidgetPointer(308,37)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(308,5)); + setWidgetSprite(1135, new WidgetPointer(308,36)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(308,3)); + setWidgetSprite(1135, new WidgetPointer(308,38)); + } + } else { + switch (arg0) { + case 0: + setWidgetIsHidden(false, new WidgetPointer(308,14)); + setWidgetSprite(1135, new WidgetPointer(308,35)); + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(308,12)); + setWidgetSprite(1135, new WidgetPointer(308,34)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(308,10)); + setWidgetSprite(1135, new WidgetPointer(308,33)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(308,8)); + setWidgetSprite(1135, new WidgetPointer(308,39)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(308,6)); + setWidgetSprite(1135, new WidgetPointer(308,37)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(308,4)); + setWidgetSprite(1135, new WidgetPointer(308,36)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(308,2)); + setWidgetSprite(1135, new WidgetPointer(308,38)); + } + } + if (IsFemale()) { + setWidgetIsHidden(false, new WidgetPointer(308,20)); + setWidgetIsHidden(false, new WidgetPointer(308,22)); + setWidgetIsHidden(false, new WidgetPointer(308,24)); + setWidgetIsHidden(false, new WidgetPointer(308,26)); + setWidgetIsHidden(false, new WidgetPointer(308,28)); + setWidgetIsHidden(false, new WidgetPointer(308,30)); + setWidgetIsHidden(false, new WidgetPointer(308,32)); + setWidgetIsHidden(true, new WidgetPointer(308,19)); + setWidgetIsHidden(true, new WidgetPointer(308,21)); + setWidgetIsHidden(true, new WidgetPointer(308,23)); + setWidgetIsHidden(true, new WidgetPointer(308,25)); + setWidgetIsHidden(true, new WidgetPointer(308,27)); + setWidgetIsHidden(true, new WidgetPointer(308,29)); + setWidgetIsHidden(true, new WidgetPointer(308,31)); + } else { + setWidgetIsHidden(true, new WidgetPointer(308,20)); + setWidgetIsHidden(true, new WidgetPointer(308,22)); + setWidgetIsHidden(true, new WidgetPointer(308,24)); + setWidgetIsHidden(true, new WidgetPointer(308,26)); + setWidgetIsHidden(true, new WidgetPointer(308,28)); + setWidgetIsHidden(true, new WidgetPointer(308,30)); + setWidgetIsHidden(true, new WidgetPointer(308,32)); + setWidgetIsHidden(false, new WidgetPointer(308,19)); + setWidgetIsHidden(false, new WidgetPointer(308,21)); + setWidgetIsHidden(false, new WidgetPointer(308,23)); + setWidgetIsHidden(false, new WidgetPointer(308,25)); + setWidgetIsHidden(false, new WidgetPointer(308,27)); + setWidgetIsHidden(false, new WidgetPointer(308,29)); + setWidgetIsHidden(false, new WidgetPointer(308,31)); + } + return; +} diff --git a/dumps/scripts/1227.cs2 b/dumps/scripts/1227.cs2 new file mode 100644 index 000000000..ca2494a5a --- /dev/null +++ b/dumps/scripts/1227.cs2 @@ -0,0 +1,22 @@ +void script_1227(int arg0,int arg1,int arg2) { + int ivar3; + if ((bitconfig_1549 < 1) || (bitconfig_1549 > 63)) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + return; + } + if (bitconfig_1549 == 63) { + setWidgetText(new WidgetPointer(arg2), "Final" + "
" + "Challenge"); + } else { + setWidgetText(new WidgetPointer(arg2), "Wave " + intToStr(bitconfig_1549)); + } + ivar3 = subtract(0, getWidgetActualHeight(new WidgetPointer(arg0))); + setWidgetPosition(0, ivar3, 1, 1, new WidgetPointer(arg1)); + setWidgetPosition(0, ivar3, 1, 1, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setScriptCallOnGameloop(1228, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), getClientCycle(), "IIIi", new WidgetPointer(arg0)); + setWidgetContextMenuOption(1, new WidgetPointer(arg1), "Dismiss"); + setScriptCallOnClickContextMenu(1229, -2147483644, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), "iIII", new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/1228.cs2 b/dumps/scripts/1228.cs2 new file mode 100644 index 000000000..8b325ca54 --- /dev/null +++ b/dumps/scripts/1228.cs2 @@ -0,0 +1,35 @@ +void script_1228(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + ivar4 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar5 = subtract(getClientCycle(), arg3); + ivar6 = 0; + if (ivar5 <= 30) { + if (ivar5 == 5) { + playSoundEffect(2871, 1, 0); + } + ivar6 = subtract(multiplyDivide(ivar5, 30, ivar4), ivar4); + setWidgetPosition(0, ivar6, 1, 1, new WidgetPointer(arg1)); + setWidgetPosition(0, ivar6, 1, 1, new WidgetPointer(arg2)); + return; + } + if (ivar5 < 170) { + return; + } + if (ivar5 < 200) { + if (ivar5 == 170) { + playSoundEffect(2871, 1, 0); + } + ivar6 = subtract(0, multiplyDivide(subtract(ivar5, 170), 30, ivar4)); + setWidgetPosition(0, ivar6, 1, 1, new WidgetPointer(arg1)); + setWidgetPosition(0, ivar6, 1, 1, new WidgetPointer(arg2)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1229.cs2 b/dumps/scripts/1229.cs2 new file mode 100644 index 000000000..31ccdcdbc --- /dev/null +++ b/dumps/scripts/1229.cs2 @@ -0,0 +1,12 @@ +void script_1229(int arg0,int arg1,int arg2,int arg3) { + if (arg0 != 1) { + return; + } + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg2)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + setWidgetNoOptions(new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/123.cs2 b/dumps/scripts/123.cs2 new file mode 100644 index 000000000..95709992b --- /dev/null +++ b/dumps/scripts/123.cs2 @@ -0,0 +1,4 @@ +void script_123() { + script_4552(); + return; +} diff --git a/dumps/scripts/1230.cs2 b/dumps/scripts/1230.cs2 new file mode 100644 index 000000000..fddad32fd --- /dev/null +++ b/dumps/scripts/1230.cs2 @@ -0,0 +1,56 @@ +void script_1230() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + ivar3 = 0; + while (ivar3 < 16) { + flow_1: + ivar0 = getItemIdInSlot(308, ivar3); + switch (ivar0) { + case 6422: + case 556: + ivar1 = 8975; + break; + case 6424: + case 555: + ivar1 = 8987; + break; + case 6426: + case 557: + ivar1 = 8979; + break; + case 554: + case 6428: + ivar1 = 8980; + break; + default: + ivar1 = -1; + } + ivar2 = ((int)cs2method_3408(105, 73, 2273, ivar3)); + IF (setWidgetRegister(new WidgetPointer(ivar2))) + GOTO flow_9 + GOTO flow_10 + flow_9: + setWidgetModel(ivar1); + GOTO flow_10 + flow_10: + IF (((((ivar0 == 6422) || (ivar0 == 6422)) || (ivar0 == 6424)) || (ivar0 == 6426)) || (ivar0 == 6428)) + GOTO flow_11 + GOTO flow_13 + flow_11: + ivar2 = ((int)cs2method_3408(105, 73, 2276, ivar3)); + IF (setWidgetRegister(new WidgetPointer(ivar2))) + GOTO flow_12 + GOTO flow_13 + flow_12: + setWidgetRGB(new Color(68, 0, 0)); + GOTO flow_13 + flow_13: + ivar3 = add(ivar3, 1); + } + return; +} diff --git a/dumps/scripts/1231.cs2 b/dumps/scripts/1231.cs2 new file mode 100644 index 000000000..aed35cecf --- /dev/null +++ b/dumps/scripts/1231.cs2 @@ -0,0 +1,76 @@ +void script_1231() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + ivar3 = 0; + while (ivar3 < 81) { + flow_1: + ivar0 = getItemIdInSlot(308, ivar3); + switch (ivar0) { + case 556: + case 6422: + ivar1 = 8975; + break; + case 555: + case 6424: + ivar1 = 8987; + break; + case 557: + case 6426: + ivar1 = 8979; + break; + case 554: + case 6428: + ivar1 = 8980; + break; + case 6436: + case 558: + ivar1 = 8982; + break; + case 6438: + case 559: + ivar1 = 8976; + break; + case 6432: + case 560: + ivar1 = 8978; + break; + case 562: + case 6430: + ivar1 = 8977; + break; + case 6434: + case 563: + ivar1 = 8981; + break; + default: + ivar1 = -1; + } + ivar2 = ((int)cs2method_3408(105, 73, 2274, ivar3)); + IF (setWidgetRegister(new WidgetPointer(ivar2))) + GOTO flow_14 + GOTO flow_15 + flow_14: + setWidgetModel(ivar1); + GOTO flow_15 + flow_15: + IF ((((((((((ivar0 == 6422) || (ivar0 == 6422)) || (ivar0 == 6424)) || (ivar0 == 6426)) || (ivar0 == 6428)) || (ivar0 == 6436)) || (ivar0 == 6438)) || (ivar0 == 6432)) || (ivar0 == 6430)) || (ivar0 == 6434)) + GOTO flow_16 + GOTO flow_18 + flow_16: + ivar2 = ((int)cs2method_3408(105, 73, 2275, ivar3)); + IF (setWidgetRegister(new WidgetPointer(ivar2))) + GOTO flow_17 + GOTO flow_18 + flow_17: + setWidgetRGB(new Color(68, 0, 0)); + GOTO flow_18 + flow_18: + ivar3 = add(ivar3, 1); + } + return; +} diff --git a/dumps/scripts/1232.cs2 b/dumps/scripts/1232.cs2 new file mode 100644 index 000000000..d7fc0d9d7 --- /dev/null +++ b/dumps/scripts/1232.cs2 @@ -0,0 +1,32 @@ +void script_1232(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(arg2)), 494, getWidgetText(new WidgetPointer(arg2))), 12), 3), 0, 0, new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar3 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(36, 8)), 7); + ivar4 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(32, 5)), 4); + ivar5 = 0; + while (ivar5 < getItemContainerLength(0)) { + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar3), mod(ivar5, 8)), multiply(divide(ivar5, 8), add(32, ivar4)), 0, 0); + setWidgetHidden(0); + if (getItemIdInSlot(0, ivar5) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(0, ivar5), getItemAmtInSlot(0, ivar5)); + cs2method1305("" + getItemName(getItemIdInSlot(0, ivar5))); + setWidgetContextMenuOption(1, "Withdraw" + ""); + setWidgetContextMenuOption(2, "Withdraw-All" + ""); + setWidgetContextMenuOption(10, "Examine" + ""); + cs2method1303(5); + cs2method1304(10); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + setScriptCallOnMouseDragReleased(1233, new WidgetPointer(arg0), -2147483643, new WidgetPointer(-32768,6), -2147483641, new WidgetPointer(arg1), new WidgetPointer(arg2), "IiIiII"); + } else { + setItemOnWidgetMethod1205(-1, 0); + } + ivar5 = add(ivar5, 1); + } + return; +} diff --git a/dumps/scripts/1233.cs2 b/dumps/scripts/1233.cs2 new file mode 100644 index 000000000..3affd7d59 --- /dev/null +++ b/dumps/scripts/1233.cs2 @@ -0,0 +1,25 @@ +void script_1233(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int stack_dump0; + ivar6 = 0; + ivar7 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (arg2 == arg0) { + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + stack_dump0 = getWidgetActualX(); + ivar7 = getWidgetActualY(); + ivar6 = stack_dump0; + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetPosition(ivar6, ivar7, 0, 0); + } + return; + } + if ((arg2 == arg4) || (arg2 == arg5)) { + setWidgetHidden(1); + return; + } + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + } + return; +} diff --git a/dumps/scripts/1234.cs2 b/dumps/scripts/1234.cs2 new file mode 100644 index 000000000..ef7ca28f4 --- /dev/null +++ b/dumps/scripts/1234.cs2 @@ -0,0 +1,21 @@ +void script_1234(int arg0) { + if (isHoldingCtrl()) { + return; + } + if (globalint_173 != 1) { + switch (arg0) { + case 1: + cs2method5507(); + break; + case 2: + cs2method5508(); + break; + case 3: + cs2method5509(); + break; + case 4: + cs2method5510(); + } + } + return; +} diff --git a/dumps/scripts/1235.cs2 b/dumps/scripts/1235.cs2 new file mode 100644 index 000000000..9359e33ef --- /dev/null +++ b/dumps/scripts/1235.cs2 @@ -0,0 +1,26 @@ +void script_1235(int arg0) { + setWidgetIsHidden(false, new WidgetPointer(181,1)); + switch (globalint_180) { + case 1: + setWidget3DRotation(0, 0, 510, 762, 0, 410, new WidgetPointer(arg0)); + break; + case 2: + setWidget3DRotation(0, 0, 514, 1241, 0, 410, new WidgetPointer(arg0)); + break; + case 3: + setWidget3DRotation(0, 0, 512, 1536, 1250, 410, new WidgetPointer(arg0)); + break; + case 4: + setWidget3DRotation(0, 0, 512, 0, 1250, 410, new WidgetPointer(arg0)); + break; + case 5: + setWidget3DRotation(0, 0, 512, 512, 1250, 410, new WidgetPointer(arg0)); + break; + case 6: + setWidget3DRotation(0, 0, 512, 1024, 1250, 410, new WidgetPointer(arg0)); + break; + default: + setWidgetIsHidden(true, new WidgetPointer(181,1)); + } + return; +} diff --git a/dumps/scripts/1236.cs2 b/dumps/scripts/1236.cs2 new file mode 100644 index 000000000..77fba7333 --- /dev/null +++ b/dumps/scripts/1236.cs2 @@ -0,0 +1,9 @@ +void script_1236() { + globalint_1063 = -1; + setScriptCallOnConfigChange(1716, 1584, 1, "Y", new WidgetPointer(271,8)); + setScriptCallOnSkillChange(1705, 0, 2, 1, 4, 6, 5, "Y", new WidgetPointer(271,8)); + script_1717(); + deleteAllExtraChilds(new WidgetPointer(271,6)); + script_1704(); + return; +} diff --git a/dumps/scripts/1237.cs2 b/dumps/scripts/1237.cs2 new file mode 100644 index 000000000..46db0d37b --- /dev/null +++ b/dumps/scripts/1237.cs2 @@ -0,0 +1,81 @@ +void script_1237(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + string svar0; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = 5; + ivar2 = 30; + ivar3 = 30; + ivar4 = 0; + ivar5 = 8; + ivar6 = ivar5; + ivar7 = 6; + ivar8 = add(30, 7); + if (((boolean)globalint_1052) && ((boolean)bitconfig_6840)) { + ivar5 = 5; + ivar6 = ivar5; + ivar8 = add(30, 4); + } + ivar9 = add(30, 6); + if (((boolean)globalint_181)) { + ivar5 = 8; + ivar6 = ivar5; + ivar7 = 30; + ivar8 = add(30, 7); + ivar9 = add(30, 5); + } + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + svar0 = ""; + ivar13 = 0; + ivar14 = 30; + if (((boolean)bitconfig_6840)) { + ivar14 = 20; + } + while (ivar4 < ivar14) { + ivar10 = cs2method_3408(105, 74, 2279, ivar4); + if (((boolean)bitconfig_6840)) { + ivar10 = cs2method_3408(105, 74, 863, ivar4); + } + ivar12 = getOtherCommonData(ivar10, 736); + ivar11 = getOtherCommonData(ivar10, 735); + svar0 = getOtherCommonData(ivar10, 734); + ivar13 = getOtherCommonData(ivar10, 737); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetSize(ivar2, ivar3, 0, 0); + setWidgetPosition(ivar6, ivar7, 0, 0); + setWidgetSprite(ivar12); + doWidgetType21Task(0); + if (((boolean)globalint_181)) { + setWidgetContextMenuOption(1, "Activate" + ""); + setScriptCallOnConfigChange(49, new WidgetPointer(-32768,3), new WidgetPointer(271,7), ivar4, 1395, 1582, 2, "IIiY"); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(271,49), svar0, 25, 190, "IiIsii"); + if (((boolean)ivar4) && (bitconfig_6521 == 10)) { + setScriptCallOnGlobalConfigChange(1428, new WidgetPointer(-32768,3), -2147483643, 1024, 1, "IiY"); + } + } + setScriptCallOnSkillChange(52, ivar13, ivar12, ivar11, new WidgetPointer(-32768,3), -2147483643, 5, 1, "iddIiY"); + setScriptCallOnMouseExit(40, new WidgetPointer(271,49), "I"); + ivar4 = add(ivar4, 1); + if (((boolean)mod(ivar4, ivar1))) { + ivar6 = ivar5; + ivar7 = add(ivar7, ivar9); + } else { + ivar6 = add(ivar6, ivar8); + } + } + return; +} diff --git a/dumps/scripts/1238.cs2 b/dumps/scripts/1238.cs2 new file mode 100644 index 000000000..728ccc2d1 --- /dev/null +++ b/dumps/scripts/1238.cs2 @@ -0,0 +1,4 @@ +void script_1238(int arg0) { + script_1293(arg0); + return; +} diff --git a/dumps/scripts/1239.cs2 b/dumps/scripts/1239.cs2 new file mode 100644 index 000000000..44248e3fb --- /dev/null +++ b/dumps/scripts/1239.cs2 @@ -0,0 +1,51 @@ +cs2func_script_1239_struct(2,0,0) script_1239(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int stack_dump0; + cs2func_script_3415_struct(2,0,0) structdump_1; + cs2func_script_3371_struct(2,0,0) structdump_2; + cs2func_script_3372_struct(2,0,0) structdump_3; + cs2func_script_3373_struct(2,0,0) structdump_4; + cs2func_script_3374_struct(2,0,0) structdump_5; + ivar1 = divide(globalint_176, 10); + if (ivar1 > 5) { + ivar1 = 1; + globalint_176 = multiply(ivar1, 10); + } + ivar2 = -1; + ivar3 = 0; + switch (ivar1) { + case 0: + case 1: + stack_dump0 = arg0; + structdump_1 = script_3415(stack_dump0); + ivar3 = structdump_1.intpart_1; + ivar2 = structdump_1.intpart_0; + break; + case 2: + stack_dump0 = arg0; + structdump_2 = script_3371(stack_dump0); + ivar3 = structdump_2.intpart_1; + ivar2 = structdump_2.intpart_0; + break; + case 3: + stack_dump0 = arg0; + structdump_3 = script_3372(stack_dump0); + ivar3 = structdump_3.intpart_1; + ivar2 = structdump_3.intpart_0; + break; + case 4: + stack_dump0 = arg0; + structdump_4 = script_3373(stack_dump0); + ivar3 = structdump_4.intpart_1; + ivar2 = structdump_4.intpart_0; + break; + case 5: + stack_dump0 = arg0; + structdump_5 = script_3374(stack_dump0); + ivar3 = structdump_5.intpart_1; + ivar2 = structdump_5.intpart_0; + } + return newstruct cs2func_script_1239_struct(ivar2, ivar3); +} diff --git a/dumps/scripts/124.cs2 b/dumps/scripts/124.cs2 new file mode 100644 index 000000000..dceb67c65 --- /dev/null +++ b/dumps/scripts/124.cs2 @@ -0,0 +1,4 @@ +void script_124() { + script_125(globalint_1036); + return; +} diff --git a/dumps/scripts/1240.cs2 b/dumps/scripts/1240.cs2 new file mode 100644 index 000000000..3dfcfb060 --- /dev/null +++ b/dumps/scripts/1240.cs2 @@ -0,0 +1,24 @@ +cs2func_script_1240_struct(2,0,0) script_1240(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 6); + cs2method5405(1, 6); + cs2method5406(0, 0, 40930087, 800, 40930082, 810, 0); + cs2method5406(1, 0, 41110311, 120, 41110307, 120, 0); + cs2method5406(0, 1, 41175822, 1310, 41470726, 1210, 0); + cs2method5406(1, 1, 41388823, -120, 41634581, -120, 0); + script_1899(0, 100, 150); + cs2method5406(0, 2, 41798417, 1235, 41896725, 1235, 0); + cs2method5406(1, 2, 41749278, 120, 41749278, 120, 0); + script_1899(1, 100, 150); + cs2method5406(0, 3, 41945893, 1190, 41913134, 1190, 0); + cs2method5406(1, 3, 41749280, 120, 41749280, 120, 0); + script_1899(2, 100, 150); + cs2method5406(0, 4, 41503520, 1000, 41470733, 975, 0); + cs2method5406(1, 4, 41716512, 120, 41716512, 120, 0); + script_1899(3, 100, 150); + cs2method5406(0, 5, 41470732, 1000, 41470732, 975, 0); + cs2method5406(1, 5, 41716511, 200, 41716511, 200, 0); + script_1899(4, 100, 150); + } + return newstruct cs2func_script_1240_struct(41437980, 1250324); +} diff --git a/dumps/scripts/1241.cs2 b/dumps/scripts/1241.cs2 new file mode 100644 index 000000000..dadd639b6 --- /dev/null +++ b/dumps/scripts/1241.cs2 @@ -0,0 +1,21 @@ +cs2func_script_1241_struct(2,0,0) script_1241(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 5); + cs2method5405(1, 5); + cs2method5406(0, 0, 54299787, 1300, 54185099, 1300, 0); + cs2method5406(1, 0, 54185096, 425, 54004874, 425, 0); + cs2method5406(0, 1, 54119572, 1250, 54103191, 1240, 0); + cs2method5406(1, 1, 53972124, 425, 53988515, 425, 0); + script_1899(0, 100, 150); + cs2method5406(0, 2, 54185119, 1025, 54234274, 870, 0); + cs2method5406(1, 2, 54168747, 425, 54234286, 425, 0); + script_1899(1, 100, 150); + cs2method5406(0, 3, 54299810, 640, 54299810, 480, 0); + cs2method5406(1, 3, 54299829, 185, 54299834, 120, 0); + script_1899(2, 100, 150); + cs2method5406(0, 4, 54299819, 500, 54299819, 495, 0); + cs2method5406(1, 4, 54299835, 185, 54299835, 115, 0); + script_1899(3, 100, 150); + } + return newstruct cs2func_script_1241_struct(54299813, 1250324); +} diff --git a/dumps/scripts/1242.cs2 b/dumps/scripts/1242.cs2 new file mode 100644 index 000000000..057c2c5c9 --- /dev/null +++ b/dumps/scripts/1242.cs2 @@ -0,0 +1,10 @@ +void script_1242(int arg0) { + int ivar1; + setWidgetSprite(3152, new WidgetPointer(arg0)); + setScriptCallOnMousePressed(1950, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + ivar1 = addToCoordinate(0, add(subtract(extractX(getMyPositionHash()), mod(extractX(getMyPositionHash()), 64)), 13), 0, add(subtract(extractY(getMyPositionHash()), mod(extractY(getMyPositionHash()), 64)), 23)); + cameraMethod5511(ivar1); + cameraPointAt(ivar1, 25, 100, 10); + cameraMoveTo(addToCoordinate(ivar1, 11, 0, 0), 2600, 100, 10); + return; +} diff --git a/dumps/scripts/1243.cs2 b/dumps/scripts/1243.cs2 new file mode 100644 index 000000000..4166b8fcc --- /dev/null +++ b/dumps/scripts/1243.cs2 @@ -0,0 +1,33 @@ +cs2func_script_1243_struct(2,0,0) script_1243(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 9); + cs2method5405(1, 9); + cs2method5406(0, 0, 61934340, 1600, 62065411, 1580, 0); + cs2method5406(1, 0, 62032653, 470, 62065419, 460, 0); + cs2method5406(0, 1, 62491394, 1215, 62622468, 1095, 0); + cs2method5406(1, 1, 62507787, 375, 62606095, 360, 0); + script_1899(0, 100, 150); + cs2method5406(0, 2, 62786321, 965, 62819097, 940, 0); + cs2method5406(1, 2, 62638873, 350, 62638879, 330, 0); + script_1899(1, 100, 150); + cs2method5406(0, 3, 62671661, 970, 62491442, 985, 0); + cs2method5406(1, 3, 62524197, 330, 62425893, 330, 0); + script_1899(2, 100, 150); + cs2method5406(0, 4, 62163741, 950, 62147342, 980, 0); + cs2method5406(1, 4, 62442266, 240, 62507800, 195, 0); + script_1899(3, 100, 150); + cs2method5406(0, 5, 62556943, 1445, 62720791, 1420, 0); + cs2method5406(1, 5, 62573344, 190, 62589733, 160, 0); + script_1899(4, 100, 150); + cs2method5406(0, 6, 62524203, 1070, 62393138, 1070, 0); + cs2method5406(1, 6, 62475056, 100, 62376759, 65, 0); + script_1899(5, 100, 150); + cs2method5406(0, 7, 62278449, 1115, 62278449, 1115, 0); + cs2method5406(1, 7, 62212916, 45, 62212916, 45, 0); + script_1899(6, 100, 150); + cs2method5406(0, 8, 62032690, 1420, 62032690, 1395, 0); + cs2method5406(1, 8, 62212916, -245, 62212916, -245, 0); + script_1899(7, 100, 150); + } + return newstruct cs2func_script_1243_struct(62343961, 1250324); +} diff --git a/dumps/scripts/1244.cs2 b/dumps/scripts/1244.cs2 new file mode 100644 index 000000000..723629643 --- /dev/null +++ b/dumps/scripts/1244.cs2 @@ -0,0 +1,27 @@ +cs2func_script_1244_struct(2,0,0) script_1244(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 7); + cs2method5405(1, 7); + cs2method5406(0, 0, 47468174, 1500, 47533710, 1500, 0); + cs2method5406(1, 0, 47746712, 500, 47828637, 500, 0); + cs2method5406(0, 1, 47648414, 1400, 47648429, 1400, 0); + cs2method5406(1, 1, 47828643, 400, 47828643, 400, 0); + script_1899(0, 100, 150); + cs2method5406(0, 2, 47861423, 1300, 47959727, 1300, 0); + cs2method5406(1, 2, 47828643, 390, 47828643, 395, 0); + script_1899(1, 100, 150); + cs2method5406(0, 3, 48008869, 1200, 48008866, 1200, 0); + cs2method5406(1, 3, 47828643, 395, 47828643, 395, 0); + script_1899(2, 100, 150); + cs2method5406(0, 4, 47861404, 1100, 47763100, 1100, 0); + cs2method5406(1, 4, 47828643, 395, 47828643, 395, 0); + script_1899(3, 100, 150); + cs2method5406(0, 5, 47763107, 1000, 47763110, 1000, 0); + cs2method5406(1, 5, 47828643, 395, 47828643, 395, 0); + script_1899(4, 100, 150); + cs2method5406(0, 6, 47877796, 698, 47910560, 698, 0); + cs2method5406(1, 6, 47828643, 395, 47828643, 395, 0); + script_1899(5, 100, 150); + } + return newstruct cs2func_script_1244_struct(47648414, 1250324); +} diff --git a/dumps/scripts/1245.cs2 b/dumps/scripts/1245.cs2 new file mode 100644 index 000000000..b0dcd8f92 --- /dev/null +++ b/dumps/scripts/1245.cs2 @@ -0,0 +1,24 @@ +cs2func_script_1245_struct(2,0,0) script_1245(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 6); + cs2method5405(1, 6); + cs2method5406(0, 0, 44111061, 1500, 44143822, 1450, 0); + cs2method5406(1, 0, 44274901, 250, 44274894, 250, 0); + cs2method5406(0, 1, 44291266, 1400, 44405952, 1350, 0); + cs2method5406(1, 1, 44405963, 250, 44487882, 250, 0); + script_1899(0, 100, 150); + cs2method5406(0, 2, 44733639, 1300, 44831951, 1250, 0); + cs2method5406(1, 2, 44553428, 250, 44553433, 250, 0); + script_1899(1, 100, 150); + cs2method5406(0, 3, 44618971, 900, 44569824, 900, 0); + cs2method5406(1, 3, 44569833, 250, 44586224, 250, 0); + script_1899(2, 100, 150); + cs2method5406(0, 4, 44586225, 700, 44586228, 700, 0); + cs2method5406(1, 4, 44586233, 250, 44586234, 250, 0); + script_1899(3, 100, 150); + cs2method5406(0, 5, 44586231, 700, 44586231, 700, 0); + cs2method5406(1, 5, 44586236, 250, 44586236, 250, 0); + script_1899(4, 100, 150); + } + return newstruct cs2func_script_1245_struct(44405978, 1250324); +} diff --git a/dumps/scripts/1246.cs2 b/dumps/scripts/1246.cs2 new file mode 100644 index 000000000..fafdf2f74 --- /dev/null +++ b/dumps/scripts/1246.cs2 @@ -0,0 +1,27 @@ +cs2func_script_1246_struct(2,0,0) script_1246(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 7); + cs2method5405(1, 7); + cs2method5406(0, 0, 59172405, 900, 59172403, 900, 0); + cs2method5406(1, 0, 59139632, 350, 59123243, 300, 0); + cs2method5406(0, 1, 59205161, 800, 59254307, 800, 0); + cs2method5406(1, 1, 59237922, 350, 59303454, 300, 0); + script_1899(0, 100, 150); + cs2method5406(0, 2, 59401754, 800, 59418132, 800, 0); + cs2method5406(1, 2, 59319831, 300, 59319827, 300, 0); + script_1899(1, 100, 150); + cs2method5406(0, 3, 59287050, 800, 59188742, 800, 0); + cs2method5406(1, 3, 59123212, 300, 58975755, 300, 0); + script_1899(2, 100, 150); + cs2method5406(0, 4, 58877450, 945, 58811918, 1130, 0); + cs2method5406(1, 4, 58942991, 300, 58942991, 300, 0); + script_1899(3, 100, 150); + cs2method5406(0, 5, 58828309, 1355, 58844696, 1355, 0); + cs2method5406(1, 5, 58942991, 300, 58942991, 300, 0); + script_1899(4, 100, 150); + cs2method5406(0, 6, 58959386, 1355, 59024922, 1355, 0); + cs2method5406(1, 6, 58942991, 300, 58942991, 300, 0); + script_1899(5, 100, 150); + } + return newstruct cs2func_script_1246_struct(59090457, 1250324); +} diff --git a/dumps/scripts/1247.cs2 b/dumps/scripts/1247.cs2 new file mode 100644 index 000000000..6471820b6 --- /dev/null +++ b/dumps/scripts/1247.cs2 @@ -0,0 +1,24 @@ +cs2func_script_1247_struct(2,0,0) script_1247(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 6); + cs2method5405(1, 6); + cs2method5406(0, 0, 52546917, 900, 52546914, 900, 0); + cs2method5406(1, 0, 52645221, 300, 52645221, 300, 0); + cs2method5406(0, 1, 52645215, 900, 52694367, 900, 0); + cs2method5406(1, 1, 52645221, 300, 52645221, 300, 0); + script_1899(0, 100, 150); + cs2method5406(0, 2, 52743525, 900, 52743528, 900, 0); + cs2method5406(1, 2, 52645221, 300, 52645221, 300, 0); + script_1899(1, 100, 150); + cs2method5406(0, 3, 52645227, 900, 52596075, 900, 0); + cs2method5406(1, 3, 52645221, 300, 52645221, 300, 0); + script_1899(2, 100, 150); + cs2method5406(0, 4, 52546917, 900, 52546914, 900, 0); + cs2method5406(1, 4, 52645221, 300, 52645221, 300, 0); + script_1899(3, 100, 150); + cs2method5406(0, 5, 52645215, 900, 52694367, 900, 0); + cs2method5406(1, 5, 52645221, 300, 52645221, 300, 0); + script_1899(4, 100, 150); + } + return newstruct cs2func_script_1247_struct(52890976, 1250324); +} diff --git a/dumps/scripts/1248.cs2 b/dumps/scripts/1248.cs2 new file mode 100644 index 000000000..5a662c50c --- /dev/null +++ b/dumps/scripts/1248.cs2 @@ -0,0 +1,6 @@ +void script_1248() { + setScriptCallOnGameloop(-1, "", new WidgetPointer(894,5)); + setWidgetIsHidden(true, new WidgetPointer(894,7)); + setWidgetSprite(-1, new WidgetPointer(894,4)); + return; +} diff --git a/dumps/scripts/1249.cs2 b/dumps/scripts/1249.cs2 new file mode 100644 index 000000000..12e58a314 --- /dev/null +++ b/dumps/scripts/1249.cs2 @@ -0,0 +1,41 @@ +void script_1249(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int stack_dump0; + cs2func_script_1239_struct(2,0,0) structdump_1; + cs2func_script_1239_struct(2,0,0) structdump_2; + if (getClientCycle() < globalint_177) { + return; + } + ivar3 = mod(globalint_176, 10); + ivar4 = -1; + ivar5 = 0; + if (((boolean)ivar3)) { + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg2)); + cs2method2103(0, new WidgetPointer(arg2)); + stack_dump0 = 0; + structdump_1 = script_1239(stack_dump0); + ivar5 = structdump_1.intpart_1; + ivar4 = structdump_1.intpart_0; + cameraMoveTo(ivar4, 1000, 100, 100); + cameraPointAt(ivar4, 0, 100, 100); + globalint_177 = add(getClientCycle(), 30); + globalint_176 = add(globalint_176, 2); + } else { + if (ivar3 == 2) { + if (isWidgetHidden(new WidgetPointer(arg1))) { + setScriptCallOnGameloop(1252, new WidgetPointer(arg1), 3, "Ii", new WidgetPointer(arg1)); + } + setScriptCallOnGameloop(1252, new WidgetPointer(arg2), 1, "Ii", new WidgetPointer(arg2)); + stack_dump0 = 1; + structdump_2 = script_1239(stack_dump0); + ivar5 = structdump_2.intpart_1; + ivar4 = structdump_2.intpart_0; + script_1251(0, arg0, arg1, arg2, ivar5); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/125.cs2 b/dumps/scripts/125.cs2 new file mode 100644 index 000000000..1d54f20d6 --- /dev/null +++ b/dumps/scripts/125.cs2 @@ -0,0 +1,252 @@ +void script_125(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + int stack_dump0; + previousAndCurrentName(0,2,0) structdump_1; + ivar1 = 36044806; + ivar2 = 36044853; + ivar3 = 36044805; + ivar4 = 36044801; + ivar5 = 36044811; + ivar6 = 36044812; + ivar7 = 36044818; + ivar8 = 36044846; + ivar9 = 36044814; + ivar10 = 36044813; + ivar11 = 36044800; + ivar12 = getWidgetActualWidth(new WidgetPointer(ivar9)); + if (arg0 <= -1) { + arg0 = getWidgetActualX(new WidgetPointer(ivar9)); + } + arg0 = max(min(arg0, subtract(getWidgetActualWidth(new WidgetPointer(ivar10)), ivar12)), 0); + globalint_1036 = arg0; + setWidgetPosition(arg0, 0, 0, 1, new WidgetPointer(ivar9)); + deleteAllExtraChilds(new WidgetPointer(ivar1)); + deleteAllExtraChilds(new WidgetPointer(ivar2)); + deleteAllExtraChilds(new WidgetPointer(ivar3)); + deleteAllExtraChilds(new WidgetPointer(ivar4)); + ivar13 = getFriendlistSize(); + if (ivar13 == -2) { + setWidgetText(new WidgetPointer(ivar8), "Loading Friends List." + "
" + "Please wait."); + setWidgetIsHidden(false, new WidgetPointer(ivar8)); + setWidgetIsHidden(true, new WidgetPointer(ivar9)); + setWidgetIsHidden(true, new WidgetPointer(ivar7)); + return; + } + if (ivar13 == -1) { + setWidgetText(new WidgetPointer(ivar8), "Connecting to Friend Server." + "
" + "Please wait."); + setWidgetIsHidden(false, new WidgetPointer(ivar8)); + setWidgetIsHidden(true, new WidgetPointer(ivar9)); + setWidgetIsHidden(true, new WidgetPointer(ivar7)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(ivar9)); + cs2method2314(149, new WidgetPointer(ivar9)); + setWidgetText(new WidgetPointer(ivar8), ""); + setWidgetIsHidden(true, new WidgetPointer(ivar8)); + setWidgetIsHidden(false, new WidgetPointer(ivar7)); + setWidgetText(new WidgetPointer(ivar7), intToStr(ivar13) + " / " + intToStr(200)); + ivar14 = 0; + ivar15 = getWidgetActualWidth(new WidgetPointer(ivar1)); + ivar16 = add(arg0, subtract(script_3365(ivar10), script_3365(ivar1))); + ivar17 = subtract(ivar15, add(ivar16, ivar12)); + svar0 = ""; + svar1 = ""; + svar2 = ""; + ivar18 = 0; + svar3 = ""; + ivar19 = 0; + ivar20 = 0; + svar4 = ""; + ivar21 = 0; + ivar22 = 0; + ivar23 = 15; + ivar24 = 5; + ivar25 = 10787197; + ivar26 = 0; + ivar27 = 0; + ivar28 = 0; + ivar29 = 0; + svar5 = ""; + while (ivar14 < ivar13) { + ivar21 = add(multiply(ivar14, ivar23), ivar24); + stack_dump0 = ivar14; + structdump_1 = getFriendName(stack_dump0); + svar3 = structdump_1.stringpart_1; + svar0 = structdump_1.stringpart_0; + if (stringMethod4107(svar3, "") != 0) { + ivar19 = 1; + } else { + ivar19 = 0; + } + if (((boolean)ivar19)) { + svar1 = " " + svar0; + } else { + svar1 = svar0; + } + ivar20 = getFriendWorld(ivar14); + if (cs2method3634(ivar14)) { + ivar25 = 8961267; + createExtraChild(new WidgetPointer(ivar1), 5, getExtraChildGap(new WidgetPointer(ivar1))); + setWidgetSize(9, 9, 0, 0); + setWidgetPosition(93, add(ivar21, 3), 0, 0); + setWidgetSprite(6980); + } else { + ivar25 = 10787197; + } + createExtraChild(new WidgetPointer(ivar1), 4, getExtraChildGap(new WidgetPointer(ivar1))); + setWidgetSize(ivar16, ivar23, 0, 0); + setWidgetPosition(0, ivar21, 0, 0); + setWidgetRGB(new Color(ivar25)); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + cs2method1305("" + svar0); + setWidgetTextAlignment(0, 0, 0); + if (ivar20 != 0) { + if (isMuteRelatedMethod3329() && cs2method6900()) { + setWidgetContextMenuOption(1, "Message"); + } + setWidgetContextMenuOption(2, "Quick Message"); + } else { + if (isMuteRelatedMethod3329() && cs2method6900()) { + setWidgetContextMenuOption(3, "Message"); + } + setWidgetContextMenuOption(4, "Quick Message"); + } + setWidgetContextMenuOption(5, "Delete"); + setScriptCallOnClickContextMenu(126, -2147483644, "event_opbase", ivar14, "isi"); + if (getTextWidth(3793, svar1) > ivar16) { + while ((getTextWidth(3793, svar1 + "...") > ivar16) && (strLength(svar1) > 0)) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1); + } + setWidgetText(svar1 + "..."); + if (((boolean)ivar19)) { + if (getLineCount(subtract(ivar15, 8), 3793, "Last known as: " + svar3) > 1) { + svar2 = svar0 + "
" + "Last known as:" + "
" + svar3; + } else { + svar2 = svar0 + "
" + "Last known as: " + svar3; + } + } else { + svar2 = svar0; + } + setScriptCallOnMouseOver(1594, new WidgetPointer(550,52), new WidgetPointer(-32768,3), -2147483643, svar2, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(550,52), "I"); + } else { + setWidgetText(svar1); + if (((boolean)ivar19)) { + if (getLineCount(subtract(ivar15, 8), 3793, "Last known as: " + svar3) > 1) { + svar2 = "Last known as:" + "
" + svar3; + } else { + svar2 = "Last known as: " + svar3; + } + setScriptCallOnMouseOver(1594, new WidgetPointer(550,52), new WidgetPointer(-32768,3), -2147483643, svar2, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(550,52), "I"); + } + } + createExtraChild(new WidgetPointer(ivar2), 5, getExtraChildGap(new WidgetPointer(ivar2))); + setWidgetSprite(2313); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, ivar21, 0, 0); + if (((boolean)ivar19)) { + setWidgetHidden(1); + } + setWidgetSize(ivar17, 0, 0, 1, new WidgetPointer(ivar3)); + setWidgetSize(ivar17, 0, 0, 1, new WidgetPointer(ivar4)); + if (((boolean)ivar20)) { + svar4 = "Offline"; + svar5 = "Offline"; + ivar29 = 0; + } else if (strIndexof(0, cs2method3610(ivar14), "RuneScape") != -1) { + svar4 = intToStr(ivar20); + svar5 = cs2method3610(ivar14); + ivar29 = add(add(2, 24), 2); + } else { + svar4 = cs2method3610(ivar14); + svar5 = svar4; + ivar29 = 0; + } + ivar26 = getTextWidth(3793, svar4); + if (ivar17 >= add(ivar26, ivar29)) { + if (ivar29 > 0) { + createExtraChild(new WidgetPointer(ivar4), 5, getExtraChildGap(new WidgetPointer(ivar4))); + setWidgetSprite(2173); + setWidgetSize(24, 12, 0, 0); + setWidgetPosition(2, add(ivar21, 1), 0, 0); + ivar27 = 0; + } + } else { + ivar27 = 1; + ivar29 = 0; + } + if (ivar17 >= ivar26) { + } else { + setScriptCallOnMouseOver(1594, new WidgetPointer(550,52), new WidgetPointer(-32768,3), -2147483643, svar5, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(550,52), "I"); + svar4 = "..."; + } + createExtraChild(new WidgetPointer(ivar3), 4, getExtraChildGap(new WidgetPointer(ivar3))); + setWidgetSize(ivar17, ivar23, 0, 0); + setWidgetPosition(add(ivar29, 2), ivar21, 0, 0); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 0, 0); + setWidgetText(svar4); + if (((boolean)ivar20)) { + setWidgetRGB(new Color(221, 92, 62)); + } else if (ivar20 == getWorldId()) { + setWidgetRGB(new Color(60, 183, 30)); + } else { + setWidgetRGB(new Color(255, 255, 100)); + } + setScriptCallOnMouseOver(1594, new WidgetPointer(550,52), new WidgetPointer(-32768,3), -2147483643, svar5, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(550,52), "I"); + ivar14 = add(ivar14, 1); + } + ivar21 = add(add(ivar21, 15), 5); + ivar30 = 0; + if (ivar21 > getWidgetActualHeight(new WidgetPointer(ivar5))) { + ivar30 = min(cs2method2601(new WidgetPointer(ivar5)), ivar21); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar5)), ivar21, new WidgetPointer(ivar5)); + script_72(ivar6, ivar5, ivar30); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(ivar5)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(ivar11)); + cs2method2100(0, 0, new WidgetPointer(ivar5)); + script_72(ivar6, ivar5, 0); + } + return; +} diff --git a/dumps/scripts/1250.cs2 b/dumps/scripts/1250.cs2 new file mode 100644 index 000000000..4c01bdd97 --- /dev/null +++ b/dumps/scripts/1250.cs2 @@ -0,0 +1,4 @@ +void script_1250(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_1251(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/1251.cs2 b/dumps/scripts/1251.cs2 new file mode 100644 index 000000000..f515082bf --- /dev/null +++ b/dumps/scripts/1251.cs2 @@ -0,0 +1,28 @@ +void script_1251(int arg0,int arg1,int arg2,int arg3,int arg4) { + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_1898_struct(2,0,0) structdump_3; + stack_dump0 = 0; + stack_dump1 = arg0; + stack_dump2 = arg0; + structdump_3 = script_1898(stack_dump2); + cameraMethod5502(stack_dump0, stack_dump1, structdump_3.intpart_0, structdump_3.intpart_1, 1, arg0); + if (cs2method5407(0) <= add(arg0, 2)) { + setWidgetRGB(new Color(arg4), new WidgetPointer(arg3)); + cs2method2103(255, new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setScriptCallOnGameloop(1253, new WidgetPointer(arg3), "I", new WidgetPointer(arg3)); + setScriptCallOnGameloop(1249, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), "III", new WidgetPointer(arg1)); + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg1)); + if (globalint_176 == 2) { + globalint_176 = add(add(globalint_176, 8), multiply(10, add(rndExcl(subtract(5, 1)), 1))); + } else { + globalint_176 = add(globalint_176, 8); + } + globalint_177 = add(getClientCycle(), 30); + return; + } + setScriptCallOnMinimapRelatedSetting3(1250, add(arg0, 1), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), arg4, "iIIIi", new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/1252.cs2 b/dumps/scripts/1252.cs2 new file mode 100644 index 000000000..af0fe9aef --- /dev/null +++ b/dumps/scripts/1252.cs2 @@ -0,0 +1,12 @@ +void script_1252(int arg0,int arg1) { + int ivar2; + ivar2 = getWidgetShadeColor(new WidgetPointer(arg0)); + ivar2 = min(add(ivar2, divide(multiply(255, arg1), 30)), 255); + cs2method2103(ivar2, new WidgetPointer(arg0)); + if (ivar2 >= 255) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; + } + return; +} diff --git a/dumps/scripts/1253.cs2 b/dumps/scripts/1253.cs2 new file mode 100644 index 000000000..0adb8da6d --- /dev/null +++ b/dumps/scripts/1253.cs2 @@ -0,0 +1,11 @@ +void script_1253(int arg0) { + int ivar1; + ivar1 = getWidgetShadeColor(new WidgetPointer(arg0)); + ivar1 = max(subtract(ivar1, divide(255, 30)), 0); + cs2method2103(ivar1, new WidgetPointer(arg0)); + if (ivar1 <= 0) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + } + return; +} diff --git a/dumps/scripts/1254.cs2 b/dumps/scripts/1254.cs2 new file mode 100644 index 000000000..e7c5cccd5 --- /dev/null +++ b/dumps/scripts/1254.cs2 @@ -0,0 +1,6 @@ +void script_1254() { + setWidgetText(new WidgetPointer(328,1), intToStr(standart_config_343)); + setWidgetText(new WidgetPointer(328,3), intToStr(standart_config_344)); + setWidgetText(new WidgetPointer(328,5), intToStr(standart_config_345)); + return; +} diff --git a/dumps/scripts/1255.cs2 b/dumps/scripts/1255.cs2 new file mode 100644 index 000000000..fbd75b36b --- /dev/null +++ b/dumps/scripts/1255.cs2 @@ -0,0 +1,11 @@ +void script_1255() { + if (((boolean)bitconfig_305)) { + return; + } + if (((boolean)standart_config_261)) { + setWidgetSprite(180, new WidgetPointer(114,24)); + } else { + setWidgetSprite(181, new WidgetPointer(114,24)); + } + return; +} diff --git a/dumps/scripts/1256.cs2 b/dumps/scripts/1256.cs2 new file mode 100644 index 000000000..507d94515 --- /dev/null +++ b/dumps/scripts/1256.cs2 @@ -0,0 +1,11 @@ +void script_1256() { + if (((boolean)bitconfig_305)) { + return; + } + if (((boolean)standart_config_262)) { + setWidgetSprite(180, new WidgetPointer(114,25)); + } else { + setWidgetSprite(181, new WidgetPointer(114,25)); + } + return; +} diff --git a/dumps/scripts/1257.cs2 b/dumps/scripts/1257.cs2 new file mode 100644 index 000000000..49e2e540b --- /dev/null +++ b/dumps/scripts/1257.cs2 @@ -0,0 +1,11 @@ +void script_1257() { + if (((boolean)bitconfig_305)) { + return; + } + if (((boolean)standart_config_263)) { + setWidgetSprite(180, new WidgetPointer(114,26)); + } else { + setWidgetSprite(181, new WidgetPointer(114,26)); + } + return; +} diff --git a/dumps/scripts/1258.cs2 b/dumps/scripts/1258.cs2 new file mode 100644 index 000000000..890faec3a --- /dev/null +++ b/dumps/scripts/1258.cs2 @@ -0,0 +1,11 @@ +void script_1258() { + if (((boolean)bitconfig_305)) { + return; + } + if (((boolean)standart_config_264)) { + setWidgetSprite(180, new WidgetPointer(114,27)); + } else { + setWidgetSprite(181, new WidgetPointer(114,27)); + } + return; +} diff --git a/dumps/scripts/1259.cs2 b/dumps/scripts/1259.cs2 new file mode 100644 index 000000000..7189ee444 --- /dev/null +++ b/dumps/scripts/1259.cs2 @@ -0,0 +1,11 @@ +void script_1259() { + if (((boolean)bitconfig_305)) { + return; + } + if (((boolean)standart_config_265)) { + setWidgetSprite(180, new WidgetPointer(114,28)); + } else { + setWidgetSprite(181, new WidgetPointer(114,28)); + } + return; +} diff --git a/dumps/scripts/126.cs2 b/dumps/scripts/126.cs2 new file mode 100644 index 000000000..1af982dad --- /dev/null +++ b/dumps/scripts/126.cs2 @@ -0,0 +1,28 @@ +void script_126(int arg0,int arg1,string arg2) { + string svar1; + if (((boolean)globalint_1413)) { + return; + } + svar1 = strRemoveEntities(arg2); + switch (arg0) { + case 1: + globalint_1650 = 1; + globalstring_23 = svar1; + script_1558(0); + return; + case 2: + if (cs2method3627(arg1)) { + script_1050(1, svar1); + } else { + script_1050(3, svar1); + } + break; + case 3: + case 4: + messageType0("That player is currently offline."); + break; + case 5: + cs2method3606(svar1); + } + return; +} diff --git a/dumps/scripts/1260.cs2 b/dumps/scripts/1260.cs2 new file mode 100644 index 000000000..8c7b35d1f --- /dev/null +++ b/dumps/scripts/1260.cs2 @@ -0,0 +1,11 @@ +void script_1260() { + if (((boolean)bitconfig_305)) { + return; + } + if (((boolean)standart_config_266)) { + setWidgetSprite(180, new WidgetPointer(114,29)); + } else { + setWidgetSprite(181, new WidgetPointer(114,29)); + } + return; +} diff --git a/dumps/scripts/1261.cs2 b/dumps/scripts/1261.cs2 new file mode 100644 index 000000000..0bfb99ce1 --- /dev/null +++ b/dumps/scripts/1261.cs2 @@ -0,0 +1,5 @@ +void script_1261() { + setWidgetText(new WidgetPointer(471,14), intToStr(bitconfig_2880)); + setWidgetText(new WidgetPointer(471,6), intToStr(bitconfig_2881)); + return; +} diff --git a/dumps/scripts/1262.cs2 b/dumps/scripts/1262.cs2 new file mode 100644 index 000000000..a3d3e9e27 --- /dev/null +++ b/dumps/scripts/1262.cs2 @@ -0,0 +1,7 @@ +void script_1262(int arg0,int arg1) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + if (arg1 != -1) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1263.cs2 b/dumps/scripts/1263.cs2 new file mode 100644 index 000000000..b854a2bea --- /dev/null +++ b/dumps/scripts/1263.cs2 @@ -0,0 +1,7 @@ +void script_1263(int arg0,int arg1) { + setWidgetRGB(new Color(45, 36, 6), new WidgetPointer(arg0)); + if (arg1 != -1) { + setWidgetRGB(new Color(45, 36, 6), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1264.cs2 b/dumps/scripts/1264.cs2 new file mode 100644 index 000000000..0ac26079f --- /dev/null +++ b/dumps/scripts/1264.cs2 @@ -0,0 +1,17 @@ +void script_1264() { + string svar0; + svar0 = "null"; + if (((boolean)standart_config_170)) { + setWidgetSprite(762, new WidgetPointer(261,6)); + svar0 = "Mouse buttons" + "
" + "(currently 2)"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(261,22), svar0, 25, 180, "IIsii", new WidgetPointer(261,6)); + } else { + if (((boolean)standart_config_170)) { + setWidgetSprite(761, new WidgetPointer(261,6)); + svar0 = "Mouse buttons" + "
" + "(currently 1)"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(261,22), svar0, 25, 180, "IIsii", new WidgetPointer(261,6)); + } + } + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/1265.cs2 b/dumps/scripts/1265.cs2 new file mode 100644 index 000000000..c9ea564cc --- /dev/null +++ b/dumps/scripts/1265.cs2 @@ -0,0 +1,18 @@ +void script_1265() { + string svar0; + svar0 = "null"; + if (((boolean)standart_config_171)) { + setWidgetSprite(761, new WidgetPointer(261,4)); + svar0 = "Chat effects" + "
" + "(currently off)"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(261,22), svar0, 25, 180, "IIsii", new WidgetPointer(261,4)); + globalint_2 = 0; + } else { + if (((boolean)standart_config_171)) { + setWidgetSprite(762, new WidgetPointer(261,4)); + svar0 = "Chat effects" + "
" + "(currently on)"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(261,22), svar0, 25, 180, "IIsii", new WidgetPointer(261,4)); + globalint_2 = 0; + } + } + return; +} diff --git a/dumps/scripts/1266.cs2 b/dumps/scripts/1266.cs2 new file mode 100644 index 000000000..f9d24ede4 --- /dev/null +++ b/dumps/scripts/1266.cs2 @@ -0,0 +1,4 @@ +void script_1266() { + script_1407(); + return; +} diff --git a/dumps/scripts/1267.cs2 b/dumps/scripts/1267.cs2 new file mode 100644 index 000000000..f7328b73f --- /dev/null +++ b/dumps/scripts/1267.cs2 @@ -0,0 +1,47 @@ +void script_1267() { + string svar0; + deleteAllExtraChilds(new WidgetPointer(309,1)); + script_1088(20250625, 22); + deleteAllExtraChilds(new WidgetPointer(309,9)); + script_333(20250633, 4734771, 3156258, 0, 0); + script_2647(20250633); + deleteAllExtraChilds(new WidgetPointer(309,12)); + script_333(20250636, 4734771, 3156258, 0, 0); + script_1516(20250636, 380, 100); + script_2647(20250636); + svar0 = "Choose a hairstyle"; + if (IsFemale()) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(309,8)), getWidgetActualHeight(new WidgetPointer(309,13)), 0, 0, new WidgetPointer(309,13)); + setWidgetIsHidden(true, new WidgetPointer(309,5)); + setScriptCallOnGlobalConfigChange(2789, 1008, 1015, 2, "Y", new WidgetPointer(309,1)); + setScriptCallOnConfigChange(-1, "", new WidgetPointer(309,1)); + } else { + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(309,8)), add(getWidgetActualWidth(new WidgetPointer(309,5)), 5)), getWidgetActualHeight(new WidgetPointer(309,13)), 0, 0, new WidgetPointer(309,13)); + setWidgetIsHidden(false, new WidgetPointer(309,5)); + globalint_774 = script_734(bitconfig_6084); + setWidgetSprite(1048, new WidgetPointer(309,6)); + setWidgetSprite(1055, new WidgetPointer(309,7)); + setScriptCallOnClickContextMenu(2830, -2147483644, 0, "i1", new WidgetPointer(309,6)); + setScriptCallOnClickContextMenu(2830, -2147483644, 1, "i1", new WidgetPointer(309,7)); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(309,22), svar0, 25, 512, "IiIsii", new WidgetPointer(309,6)); + setScriptCallOnMouseExit(40, new WidgetPointer(309,22), "I", new WidgetPointer(309,6)); + svar0 = "Choose your facial hair"; + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(309,22), svar0, 25, 512, "IiIsii", new WidgetPointer(309,7)); + setScriptCallOnMouseExit(40, new WidgetPointer(309,22), "I", new WidgetPointer(309,7)); + setScriptCallOnGlobalConfigChange(2789, 1008, 1009, 1015, 3, "Y", new WidgetPointer(309,1)); + setScriptCallOnConfigChange(2736, 1057, 1, "Y", new WidgetPointer(309,1)); + } + deleteAllExtraChilds(new WidgetPointer(309,13)); + script_333(20250637, 4734771, 3156258, 0, 0); + createExtraChild(new WidgetPointer(309,13), 6, getExtraChildGap(new WidgetPointer(309,13))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + cs2method1202(); + setWidget3DRotation(5, 15, 40, 1870, 0, 2400); + setWidgetAnimation(9804); + script_2647(20250637); + deleteAllExtraChilds(new WidgetPointer(309,15)); + script_2647(20250639); + script_2790(); + return; +} diff --git a/dumps/scripts/1268.cs2 b/dumps/scripts/1268.cs2 new file mode 100644 index 000000000..2f88c1882 --- /dev/null +++ b/dumps/scripts/1268.cs2 @@ -0,0 +1,4 @@ +void script_1268() { + script_1408(); + return; +} diff --git a/dumps/scripts/1269.cs2 b/dumps/scripts/1269.cs2 new file mode 100644 index 000000000..1c22e8567 --- /dev/null +++ b/dumps/scripts/1269.cs2 @@ -0,0 +1,18 @@ +void script_1269() { + string svar0; + svar0 = "null"; + if (((boolean)standart_config_427)) { + setWidgetSprite(761, new WidgetPointer(261,7)); + svar0 = "Accept aid" + "
" + "(currently off)"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(261,22), svar0, 25, 180, "IIsii", new WidgetPointer(261,7)); + globalint_2 = 0; + } else { + if (((boolean)standart_config_427)) { + setWidgetSprite(762, new WidgetPointer(261,7)); + svar0 = "Accept aid" + "
" + "(currently on)"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(261,22), svar0, 25, 180, "IIsii", new WidgetPointer(261,7)); + globalint_2 = 0; + } + } + return; +} diff --git a/dumps/scripts/127.cs2 b/dumps/scripts/127.cs2 new file mode 100644 index 000000000..e38178a2c --- /dev/null +++ b/dumps/scripts/127.cs2 @@ -0,0 +1,4 @@ +void script_127() { + script_4551(); + return; +} diff --git a/dumps/scripts/1270.cs2 b/dumps/scripts/1270.cs2 new file mode 100644 index 000000000..46cf8a370 --- /dev/null +++ b/dumps/scripts/1270.cs2 @@ -0,0 +1,4 @@ +void script_1270() { + script_1409(); + return; +} diff --git a/dumps/scripts/1271.cs2 b/dumps/scripts/1271.cs2 new file mode 100644 index 000000000..5ea21dffc --- /dev/null +++ b/dumps/scripts/1271.cs2 @@ -0,0 +1,119 @@ +void script_1271(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int stack_dump0; + ivar1 = 1; + ivar2 = 0; + switch (bitconfig_1010) { + case 0: + setWidgetText(new WidgetPointer(13,28), "First click the FIRST digit."); + setWidgetText(new WidgetPointer(13,1), "?"); + setWidgetText(new WidgetPointer(13,2), "?"); + setWidgetText(new WidgetPointer(13,3), "?"); + setWidgetText(new WidgetPointer(13,4), "?"); + break; + case 1: + setWidgetText(new WidgetPointer(13,28), "Now click the SECOND digit."); + setWidgetText(new WidgetPointer(13,1), "*"); + setWidgetText(new WidgetPointer(13,2), "?"); + setWidgetText(new WidgetPointer(13,3), "?"); + setWidgetText(new WidgetPointer(13,4), "?"); + break; + case 2: + setWidgetText(new WidgetPointer(13,28), "Time for the THIRD digit."); + setWidgetText(new WidgetPointer(13,1), "*"); + setWidgetText(new WidgetPointer(13,2), "*"); + setWidgetText(new WidgetPointer(13,3), "?"); + setWidgetText(new WidgetPointer(13,4), "?"); + break; + case 3: + setWidgetText(new WidgetPointer(13,28), "Finally, the FOURTH digit."); + setWidgetText(new WidgetPointer(13,1), "*"); + setWidgetText(new WidgetPointer(13,2), "*"); + setWidgetText(new WidgetPointer(13,3), "*"); + setWidgetText(new WidgetPointer(13,4), "?"); + stack_dump0 = 0; + ivar2 = 1; + ivar1 = stack_dump0; + break; + default: + setWidgetText(new WidgetPointer(13,28), "Please wait..."); + setWidgetText(new WidgetPointer(13,1), "*"); + setWidgetText(new WidgetPointer(13,2), "*"); + setWidgetText(new WidgetPointer(13,3), "*"); + setWidgetText(new WidgetPointer(13,4), "*"); + stack_dump0 = 1; + ivar2 = 1; + ivar1 = stack_dump0; + } + ivar3 = 0; + if (((boolean)arg0)) { + while (ivar3 < 10) { + setWidgetIsHidden(((boolean)ivar1), cs2method_3408(105, 73, 3555, ivar3)); + setWidgetIsHidden(((boolean)ivar2), cs2method_3408(105, 73, 3554, ivar3)); + ivar3 = add(ivar3, 1); + } + return; + } + ivar4 = rndExcl(10); + globalarray_0 = new int[10]; + globalarray_0[0] = ivar4; + globalarray_0[1] = mod(add(ivar4, 1), 10); + globalarray_0[2] = mod(add(ivar4, 2), 10); + globalarray_0[3] = mod(add(ivar4, 3), 10); + globalarray_0[4] = mod(add(ivar4, 4), 10); + globalarray_0[5] = mod(add(ivar4, 5), 10); + globalarray_0[6] = mod(add(ivar4, 6), 10); + globalarray_0[7] = mod(add(ivar4, 7), 10); + globalarray_0[8] = mod(add(ivar4, 8), 10); + globalarray_0[9] = mod(add(ivar4, 9), 10); + ivar5 = 0; + while (ivar3 < 10) { + ivar5 = rndExcl(9); + ivar4 = globalarray_0[9]; + globalarray_0[9] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar4; + setWidgetPosition(subtract(25, rnd(50)), subtract(20, rnd(40)), 1, 1, cs2method_3408(105, 73, 3557, ivar3)); + setWidgetIsHidden(((boolean)ivar1), cs2method_3408(105, 73, 3555, ivar3)); + setWidgetIsHidden(((boolean)ivar2), cs2method_3408(105, 73, 3554, ivar3)); + ivar3 = add(ivar3, 1); + } + ivar6 = getWidgetActualWidth(new WidgetPointer(13,6)); + ivar7 = getWidgetActualHeight(new WidgetPointer(13,6)); + ivar8 = divide(subtract(getWidgetActualWidth(new WidgetPointer(13,5)), ivar6), 3); + ivar9 = divide(subtract(getWidgetActualHeight(new WidgetPointer(13,5)), ivar7), 2); + ivar10 = multiply(ivar8, 2); + ivar11 = multiply(ivar9, 2); + ivar12 = multiply(ivar8, 3); + setWidgetPosition(0, 0, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[0])); + setWidgetPosition(0, 0, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[0])); + setWidgetPosition(ivar8, 0, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[1])); + setWidgetPosition(ivar8, 0, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[1])); + setWidgetPosition(ivar10, 0, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[2])); + setWidgetPosition(ivar10, 0, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[2])); + setWidgetPosition(ivar12, 0, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[3])); + setWidgetPosition(ivar12, 0, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[3])); + setWidgetPosition(0, ivar9, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[4])); + setWidgetPosition(0, ivar9, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[4])); + setWidgetPosition(ivar8, ivar9, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[5])); + setWidgetPosition(ivar8, ivar9, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[5])); + setWidgetPosition(ivar10, ivar9, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[6])); + setWidgetPosition(ivar10, ivar9, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[6])); + setWidgetPosition(0, ivar11, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[7])); + setWidgetPosition(0, ivar11, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[7])); + setWidgetPosition(ivar8, ivar11, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[8])); + setWidgetPosition(ivar8, ivar11, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[8])); + setWidgetPosition(ivar10, ivar11, 0, 0, cs2method_3408(105, 73, 3556, globalarray_0[9])); + setWidgetPosition(ivar10, ivar11, 0, 0, cs2method_3408(105, 73, 3555, globalarray_0[9])); + return; +} diff --git a/dumps/scripts/1272.cs2 b/dumps/scripts/1272.cs2 new file mode 100644 index 000000000..cdc037b83 --- /dev/null +++ b/dumps/scripts/1272.cs2 @@ -0,0 +1,8 @@ +void script_1272() { + string svar0; + svar0 = "null"; + svar0 = "House options"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(261,22), svar0, 25, 180, "IIsii", new WidgetPointer(261,8)); + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/1273.cs2 b/dumps/scripts/1273.cs2 new file mode 100644 index 000000000..bffd13ac9 --- /dev/null +++ b/dumps/scripts/1273.cs2 @@ -0,0 +1,5 @@ +void script_1273(int arg0) { + script_2410(getItemDefOpcode129Or130Method4209(arg0, 1), getItemDefOpcode129Or130Method4209(arg0, 2), getItemDefOpcode129Or130Method4209(arg0, 3), -1, getItemDefOpcode129Or130Method4209(arg0, 5), getItemOption(arg0, 1), getItemOption(arg0, 2), getItemOption(arg0, 3), "", getItemOption(arg0, 5), getItemName(arg0)); + setScriptCallOnConfigChange(-1, ""); + return; +} diff --git a/dumps/scripts/1274.cs2 b/dumps/scripts/1274.cs2 new file mode 100644 index 000000000..d8cf8e62f --- /dev/null +++ b/dumps/scripts/1274.cs2 @@ -0,0 +1,4 @@ +void script_1274(int arg0) { + setItemOnWidgetMethod2200(14854, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1275.cs2 b/dumps/scripts/1275.cs2 new file mode 100644 index 000000000..2902ceff8 --- /dev/null +++ b/dumps/scripts/1275.cs2 @@ -0,0 +1,4 @@ +void script_1275(int arg0) { + setScriptCallOnGameloop(1410, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1276.cs2 b/dumps/scripts/1276.cs2 new file mode 100644 index 000000000..573210234 --- /dev/null +++ b/dumps/scripts/1276.cs2 @@ -0,0 +1,5 @@ +void script_1276(int arg0) { + globalint_814 = 0; + cs2method2103(255, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1277.cs2 b/dumps/scripts/1277.cs2 new file mode 100644 index 000000000..0a93720f8 --- /dev/null +++ b/dumps/scripts/1277.cs2 @@ -0,0 +1,5 @@ +void script_1277(int arg0,int arg1,int arg2,int arg3) { + script_1279(arg0, arg1, arg2, arg3); + setScriptCallOnItemContainerUpdate(1278, new WidgetPointer(arg0), arg1, arg2, arg3, arg1, 1, "IviiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1278.cs2 b/dumps/scripts/1278.cs2 new file mode 100644 index 000000000..aa3bb1b58 --- /dev/null +++ b/dumps/scripts/1278.cs2 @@ -0,0 +1,4 @@ +void script_1278(int arg0,int arg1,int arg2,int arg3) { + script_1279(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/1279.cs2 b/dumps/scripts/1279.cs2 new file mode 100644 index 000000000..8d9ac0b45 --- /dev/null +++ b/dumps/scripts/1279.cs2 @@ -0,0 +1,19 @@ +void script_1279(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar4 = 0; + ivar5 = 0; + ivar4 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(36, arg2)), subtract(arg2, 1)); + ivar5 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(32, arg3)), subtract(arg3, 1)); + ivar6 = 0; + while (ivar6 <= multiply(arg2, arg3)) { + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar4), mod(ivar6, arg2)), multiply(divide(ivar6, arg2), add(32, ivar5)), 0, 0); + script_1280(arg1, ivar6, arg0, ivar6); + ivar6 = add(ivar6, 1); + } + return; +} diff --git a/dumps/scripts/128.cs2 b/dumps/scripts/128.cs2 new file mode 100644 index 000000000..8711f2c69 --- /dev/null +++ b/dumps/scripts/128.cs2 @@ -0,0 +1,4 @@ +void script_128() { + script_129(); + return; +} diff --git a/dumps/scripts/1280.cs2 b/dumps/scripts/1280.cs2 new file mode 100644 index 000000000..34e400006 --- /dev/null +++ b/dumps/scripts/1280.cs2 @@ -0,0 +1,23 @@ +void script_1280(int arg0,int arg1,int arg2,int arg3) { + string svar0; + svar0 = ""; + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + if (getItemIdInSlot(arg0, arg1) != -1) { + svar0 = "" + getItemName(getItemIdInSlot(arg0, arg1)); + setItemOnWidgetMethod1200(getItemIdInSlot(arg0, arg1), getItemAmtInSlot(arg0, arg1)); + cs2method1305(svar0); + setWidgetContextMenuOption(10, "Examine" + ""); + cs2method1303(5); + cs2method1304(10); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + } else { + setWidgetModel(-1); + setWidgetNoOptions(); + cs2method1303(0); + cs2method1304(0); + setScriptCallOnMouseDragReleased(-1, ""); + } + } + return; +} diff --git a/dumps/scripts/1281.cs2 b/dumps/scripts/1281.cs2 new file mode 100644 index 000000000..ff1ae6c85 --- /dev/null +++ b/dumps/scripts/1281.cs2 @@ -0,0 +1,9 @@ +void script_1281(int arg0,int arg1,int arg2,int arg3) { + if (arg2 == -1) { + script_1280(arg0, arg1, arg3, arg1); + return; + } + script_1280(arg0, arg1, arg3, arg2); + script_1280(arg0, arg2, arg3, arg1); + return; +} diff --git a/dumps/scripts/1282.cs2 b/dumps/scripts/1282.cs2 new file mode 100644 index 000000000..b14cc25ac --- /dev/null +++ b/dumps/scripts/1282.cs2 @@ -0,0 +1,5 @@ +void script_1282(int arg0) { + script_1284(); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1283.cs2 b/dumps/scripts/1283.cs2 new file mode 100644 index 000000000..f944582ea --- /dev/null +++ b/dumps/scripts/1283.cs2 @@ -0,0 +1,4 @@ +void script_1283() { + script_1284(); + return; +} diff --git a/dumps/scripts/1284.cs2 b/dumps/scripts/1284.cs2 new file mode 100644 index 000000000..15dcdd2da --- /dev/null +++ b/dumps/scripts/1284.cs2 @@ -0,0 +1,8 @@ +void script_1284() { + setWidgetIsHidden(true, new WidgetPointer(501,8)); + setWidgetIsHidden(true, new WidgetPointer(501,9)); + setWidgetIsHidden(true, new WidgetPointer(501,10)); + setWidgetIsHidden(true, new WidgetPointer(501,11)); + setWidgetIsHidden(true, new WidgetPointer(501,12)); + return; +} diff --git a/dumps/scripts/1285.cs2 b/dumps/scripts/1285.cs2 new file mode 100644 index 000000000..d4ca67bd7 --- /dev/null +++ b/dumps/scripts/1285.cs2 @@ -0,0 +1,5 @@ +void script_1285(int arg0) { + script_1287(); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1286.cs2 b/dumps/scripts/1286.cs2 new file mode 100644 index 000000000..57eb460db --- /dev/null +++ b/dumps/scripts/1286.cs2 @@ -0,0 +1,4 @@ +void script_1286() { + script_1287(); + return; +} diff --git a/dumps/scripts/1287.cs2 b/dumps/scripts/1287.cs2 new file mode 100644 index 000000000..e66020e16 --- /dev/null +++ b/dumps/scripts/1287.cs2 @@ -0,0 +1,8 @@ +void script_1287() { + setWidgetIsHidden(true, new WidgetPointer(502,8)); + setWidgetIsHidden(true, new WidgetPointer(502,9)); + setWidgetIsHidden(true, new WidgetPointer(502,10)); + setWidgetIsHidden(true, new WidgetPointer(502,11)); + setWidgetIsHidden(true, new WidgetPointer(502,12)); + return; +} diff --git a/dumps/scripts/1288.cs2 b/dumps/scripts/1288.cs2 new file mode 100644 index 000000000..27ecaf545 --- /dev/null +++ b/dumps/scripts/1288.cs2 @@ -0,0 +1,109 @@ +void script_1288() { + setWidgetText(new WidgetPointer(128,37), intToStr(bitconfig_861)); + setWidgetText(new WidgetPointer(128,38), intToStr(bitconfig_862)); + if (bitconfig_842 == 2) { + setWidgetModel(8398, new WidgetPointer(128,1)); + setWidgetModel(8399, new WidgetPointer(128,2)); + setWidgetModel(8430, new WidgetPointer(128,19)); + } else if (((boolean)bitconfig_842)) { + setWidgetModel(8397, new WidgetPointer(128,1)); + setWidgetModel(8400, new WidgetPointer(128,2)); + setWidgetModel(8429, new WidgetPointer(128,19)); + } else { + setWidgetModel(-1, new WidgetPointer(128,19)); + setWidgetModel(8398, new WidgetPointer(128,1)); + setWidgetModel(8400, new WidgetPointer(128,2)); + } + if (bitconfig_843 == 2) { + setWidgetModel(8402, new WidgetPointer(128,3)); + setWidgetModel(8403, new WidgetPointer(128,4)); + setWidgetModel(8430, new WidgetPointer(128,20)); + } else if (((boolean)bitconfig_843)) { + setWidgetModel(8401, new WidgetPointer(128,3)); + setWidgetModel(8404, new WidgetPointer(128,4)); + setWidgetModel(8429, new WidgetPointer(128,20)); + } else { + setWidgetModel(-1, new WidgetPointer(128,20)); + setWidgetModel(8402, new WidgetPointer(128,3)); + setWidgetModel(8404, new WidgetPointer(128,4)); + } + if (bitconfig_844 == 2) { + setWidgetModel(8406, new WidgetPointer(128,5)); + setWidgetModel(8407, new WidgetPointer(128,6)); + setWidgetModel(8430, new WidgetPointer(128,21)); + } else if (((boolean)bitconfig_844)) { + setWidgetModel(8405, new WidgetPointer(128,5)); + setWidgetModel(8408, new WidgetPointer(128,6)); + setWidgetModel(8429, new WidgetPointer(128,21)); + } else { + setWidgetModel(-1, new WidgetPointer(128,21)); + setWidgetModel(8406, new WidgetPointer(128,5)); + setWidgetModel(8408, new WidgetPointer(128,6)); + } + if (bitconfig_845 == 2) { + setWidgetModel(8410, new WidgetPointer(128,7)); + setWidgetModel(8411, new WidgetPointer(128,8)); + setWidgetModel(8430, new WidgetPointer(128,22)); + } else if (((boolean)bitconfig_845)) { + setWidgetModel(8409, new WidgetPointer(128,7)); + setWidgetModel(8412, new WidgetPointer(128,8)); + setWidgetModel(8429, new WidgetPointer(128,22)); + } else { + setWidgetModel(-1, new WidgetPointer(128,22)); + setWidgetModel(8410, new WidgetPointer(128,7)); + setWidgetModel(8412, new WidgetPointer(128,8)); + } + if (bitconfig_846 == 2) { + setWidgetModel(8414, new WidgetPointer(128,9)); + setWidgetModel(8415, new WidgetPointer(128,10)); + setWidgetModel(8430, new WidgetPointer(128,23)); + } else if (((boolean)bitconfig_846)) { + setWidgetModel(8413, new WidgetPointer(128,9)); + setWidgetModel(8416, new WidgetPointer(128,10)); + setWidgetModel(8429, new WidgetPointer(128,23)); + } else { + setWidgetModel(-1, new WidgetPointer(128,23)); + setWidgetModel(8414, new WidgetPointer(128,9)); + setWidgetModel(8416, new WidgetPointer(128,10)); + } + if (bitconfig_847 == 2) { + setWidgetModel(8418, new WidgetPointer(128,11)); + setWidgetModel(8419, new WidgetPointer(128,12)); + setWidgetModel(8430, new WidgetPointer(128,24)); + } else if (((boolean)bitconfig_847)) { + setWidgetModel(8417, new WidgetPointer(128,11)); + setWidgetModel(8420, new WidgetPointer(128,12)); + setWidgetModel(8429, new WidgetPointer(128,24)); + } else { + setWidgetModel(-1, new WidgetPointer(128,24)); + setWidgetModel(8418, new WidgetPointer(128,11)); + setWidgetModel(8420, new WidgetPointer(128,12)); + } + if (bitconfig_848 == 2) { + setWidgetModel(8422, new WidgetPointer(128,13)); + setWidgetModel(8423, new WidgetPointer(128,14)); + setWidgetModel(8430, new WidgetPointer(128,25)); + } else if (((boolean)bitconfig_848)) { + setWidgetModel(8421, new WidgetPointer(128,13)); + setWidgetModel(8424, new WidgetPointer(128,14)); + setWidgetModel(8429, new WidgetPointer(128,25)); + } else { + setWidgetModel(-1, new WidgetPointer(128,25)); + setWidgetModel(8422, new WidgetPointer(128,13)); + setWidgetModel(8424, new WidgetPointer(128,14)); + } + if (bitconfig_849 == 2) { + setWidgetModel(8426, new WidgetPointer(128,15)); + setWidgetModel(8427, new WidgetPointer(128,16)); + setWidgetModel(8430, new WidgetPointer(128,26)); + } else if (((boolean)bitconfig_849)) { + setWidgetModel(8425, new WidgetPointer(128,15)); + setWidgetModel(8428, new WidgetPointer(128,16)); + setWidgetModel(8429, new WidgetPointer(128,26)); + } else { + setWidgetModel(-1, new WidgetPointer(128,26)); + setWidgetModel(8426, new WidgetPointer(128,15)); + setWidgetModel(8428, new WidgetPointer(128,16)); + } + return; +} diff --git a/dumps/scripts/1289.cs2 b/dumps/scripts/1289.cs2 new file mode 100644 index 000000000..d37b7e6f4 --- /dev/null +++ b/dumps/scripts/1289.cs2 @@ -0,0 +1,161 @@ +void script_1289() { + setWidgetText(new WidgetPointer(129,52), intToStr(bitconfig_861)); + setWidgetText(new WidgetPointer(129,53), intToStr(bitconfig_862)); + if (bitconfig_842 == 2) { + setWidgetModel(8448, new WidgetPointer(129,0)); + setWidgetModel(8449, new WidgetPointer(129,1)); + setWidgetModel(8496, new WidgetPointer(129,26)); + } else if (((boolean)bitconfig_842)) { + setWidgetModel(8447, new WidgetPointer(129,0)); + setWidgetModel(8450, new WidgetPointer(129,1)); + setWidgetModel(8495, new WidgetPointer(129,26)); + } else { + setWidgetModel(-1, new WidgetPointer(129,26)); + setWidgetModel(8448, new WidgetPointer(129,0)); + setWidgetModel(8450, new WidgetPointer(129,1)); + } + if (bitconfig_843 == 2) { + setWidgetModel(8452, new WidgetPointer(129,2)); + setWidgetModel(8453, new WidgetPointer(129,3)); + setWidgetModel(8498, new WidgetPointer(129,27)); + } else if (((boolean)bitconfig_843)) { + setWidgetModel(8451, new WidgetPointer(129,2)); + setWidgetModel(8454, new WidgetPointer(129,3)); + setWidgetModel(8497, new WidgetPointer(129,27)); + } else { + setWidgetModel(-1, new WidgetPointer(129,27)); + setWidgetModel(8452, new WidgetPointer(129,2)); + setWidgetModel(8454, new WidgetPointer(129,3)); + } + if (bitconfig_844 == 2) { + setWidgetModel(8456, new WidgetPointer(129,4)); + setWidgetModel(8457, new WidgetPointer(129,5)); + setWidgetModel(8500, new WidgetPointer(129,28)); + } else if (((boolean)bitconfig_844)) { + setWidgetModel(8455, new WidgetPointer(129,4)); + setWidgetModel(8458, new WidgetPointer(129,5)); + setWidgetModel(8499, new WidgetPointer(129,28)); + } else { + setWidgetModel(-1, new WidgetPointer(129,28)); + setWidgetModel(8456, new WidgetPointer(129,4)); + setWidgetModel(8458, new WidgetPointer(129,5)); + } + if (bitconfig_845 == 2) { + setWidgetModel(8460, new WidgetPointer(129,6)); + setWidgetModel(8461, new WidgetPointer(129,7)); + setWidgetModel(8502, new WidgetPointer(129,29)); + } else if (((boolean)bitconfig_845)) { + setWidgetModel(8459, new WidgetPointer(129,6)); + setWidgetModel(8462, new WidgetPointer(129,7)); + setWidgetModel(8501, new WidgetPointer(129,29)); + } else { + setWidgetModel(-1, new WidgetPointer(129,29)); + setWidgetModel(8460, new WidgetPointer(129,6)); + setWidgetModel(8462, new WidgetPointer(129,7)); + } + if (bitconfig_846 == 2) { + setWidgetModel(8464, new WidgetPointer(129,8)); + setWidgetModel(8465, new WidgetPointer(129,9)); + setWidgetModel(8504, new WidgetPointer(129,30)); + } else if (((boolean)bitconfig_846)) { + setWidgetModel(8463, new WidgetPointer(129,8)); + setWidgetModel(8466, new WidgetPointer(129,9)); + setWidgetModel(8503, new WidgetPointer(129,30)); + } else { + setWidgetModel(-1, new WidgetPointer(129,30)); + setWidgetModel(8464, new WidgetPointer(129,8)); + setWidgetModel(8466, new WidgetPointer(129,9)); + } + if (bitconfig_847 == 2) { + setWidgetModel(8468, new WidgetPointer(129,10)); + setWidgetModel(8469, new WidgetPointer(129,11)); + setWidgetModel(8506, new WidgetPointer(129,31)); + } else if (((boolean)bitconfig_847)) { + setWidgetModel(8467, new WidgetPointer(129,10)); + setWidgetModel(8470, new WidgetPointer(129,11)); + setWidgetModel(8505, new WidgetPointer(129,31)); + } else { + setWidgetModel(-1, new WidgetPointer(129,31)); + setWidgetModel(8468, new WidgetPointer(129,10)); + setWidgetModel(8470, new WidgetPointer(129,11)); + } + if (bitconfig_848 == 2) { + setWidgetModel(8472, new WidgetPointer(129,12)); + setWidgetModel(8473, new WidgetPointer(129,13)); + setWidgetModel(8508, new WidgetPointer(129,32)); + } else if (((boolean)bitconfig_848)) { + setWidgetModel(8471, new WidgetPointer(129,12)); + setWidgetModel(8474, new WidgetPointer(129,13)); + setWidgetModel(8507, new WidgetPointer(129,32)); + } else { + setWidgetModel(-1, new WidgetPointer(129,32)); + setWidgetModel(8472, new WidgetPointer(129,12)); + setWidgetModel(8474, new WidgetPointer(129,13)); + } + if (bitconfig_849 == 2) { + setWidgetModel(8476, new WidgetPointer(129,14)); + setWidgetModel(8477, new WidgetPointer(129,15)); + setWidgetModel(8510, new WidgetPointer(129,33)); + } else if (((boolean)bitconfig_849)) { + setWidgetModel(8475, new WidgetPointer(129,14)); + setWidgetModel(8478, new WidgetPointer(129,15)); + setWidgetModel(8509, new WidgetPointer(129,33)); + } else { + setWidgetModel(-1, new WidgetPointer(129,33)); + setWidgetModel(8476, new WidgetPointer(129,14)); + setWidgetModel(8478, new WidgetPointer(129,15)); + } + if (bitconfig_850 == 2) { + setWidgetModel(8480, new WidgetPointer(129,16)); + setWidgetModel(8481, new WidgetPointer(129,17)); + setWidgetModel(8512, new WidgetPointer(129,34)); + } else if (((boolean)bitconfig_850)) { + setWidgetModel(8479, new WidgetPointer(129,16)); + setWidgetModel(8482, new WidgetPointer(129,17)); + setWidgetModel(8511, new WidgetPointer(129,34)); + } else { + setWidgetModel(-1, new WidgetPointer(129,34)); + setWidgetModel(8480, new WidgetPointer(129,16)); + setWidgetModel(8482, new WidgetPointer(129,17)); + } + if (bitconfig_851 == 2) { + setWidgetModel(8484, new WidgetPointer(129,18)); + setWidgetModel(8485, new WidgetPointer(129,19)); + setWidgetModel(8514, new WidgetPointer(129,35)); + } else if (((boolean)bitconfig_851)) { + setWidgetModel(8483, new WidgetPointer(129,18)); + setWidgetModel(8486, new WidgetPointer(129,19)); + setWidgetModel(8513, new WidgetPointer(129,35)); + } else { + setWidgetModel(-1, new WidgetPointer(129,35)); + setWidgetModel(8484, new WidgetPointer(129,18)); + setWidgetModel(8486, new WidgetPointer(129,19)); + } + if (bitconfig_852 == 2) { + setWidgetModel(8488, new WidgetPointer(129,20)); + setWidgetModel(8489, new WidgetPointer(129,21)); + setWidgetModel(8516, new WidgetPointer(129,36)); + } else if (((boolean)bitconfig_852)) { + setWidgetModel(8487, new WidgetPointer(129,20)); + setWidgetModel(8490, new WidgetPointer(129,21)); + setWidgetModel(8515, new WidgetPointer(129,36)); + } else { + setWidgetModel(-1, new WidgetPointer(129,36)); + setWidgetModel(8488, new WidgetPointer(129,20)); + setWidgetModel(8490, new WidgetPointer(129,21)); + } + if (bitconfig_853 == 2) { + setWidgetModel(8492, new WidgetPointer(129,22)); + setWidgetModel(8493, new WidgetPointer(129,23)); + setWidgetModel(8518, new WidgetPointer(129,37)); + } else if (((boolean)bitconfig_853)) { + setWidgetModel(8491, new WidgetPointer(129,22)); + setWidgetModel(8494, new WidgetPointer(129,23)); + setWidgetModel(8517, new WidgetPointer(129,37)); + } else { + setWidgetModel(-1, new WidgetPointer(129,37)); + setWidgetModel(8492, new WidgetPointer(129,22)); + setWidgetModel(8494, new WidgetPointer(129,23)); + } + return; +} diff --git a/dumps/scripts/129.cs2 b/dumps/scripts/129.cs2 new file mode 100644 index 000000000..331dfd4f4 --- /dev/null +++ b/dumps/scripts/129.cs2 @@ -0,0 +1,132 @@ +void script_129() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + string svar0; + string svar1; + string svar2; + string svar3; + int stack_dump0; + opcStruct3622(0,2,0) structdump_1; + deleteAllExtraChilds(new WidgetPointer(550,4)); + ivar0 = getIgnoreCount(); + if (ivar0 < 0) { + setWidgetText(new WidgetPointer(550,46), "Loading Ignore List." + "
" + "Please wait."); + setWidgetIsHidden(false, new WidgetPointer(550,46)); + setWidgetText(new WidgetPointer(550,35), ""); + return; + } + setWidgetText(new WidgetPointer(550,35), intToStr(ivar0) + " / " + intToStr(100)); + setWidgetText(new WidgetPointer(550,46), ""); + setWidgetIsHidden(true, new WidgetPointer(550,46)); + ivar1 = 36044804; + ivar2 = 36044802; + ivar3 = 36044803; + ivar4 = 36044831; + ivar5 = 0; + svar0 = ""; + svar1 = ""; + svar2 = ""; + ivar6 = 0; + ivar7 = 0; + svar3 = ""; + ivar8 = 0; + ivar9 = 0; + ivar10 = 15; + ivar11 = divide(getWidgetActualHeight(new WidgetPointer(ivar3)), ivar10); + deleteAllExtraChilds(new WidgetPointer(ivar1)); + deleteAllExtraChilds(new WidgetPointer(ivar2)); + while (ivar5 < ivar0) { + ivar8 = multiply(ivar5, 2); + ivar9 = multiply(ivar5, ivar10); + stack_dump0 = ivar5; + structdump_1 = cs2method3622(stack_dump0); + svar1 = structdump_1.stringpart_1; + svar0 = structdump_1.stringpart_0; + if (stringMethod4107(svar1, "") != 0) { + ivar6 = 1; + } else { + ivar6 = 0; + } + if (((boolean)ivar6)) { + svar2 = " " + svar0; + } else { + svar2 = svar0; + } + createExtraChild(new WidgetPointer(550,4), 4, ivar8); + setWidgetSize(168, ivar10, 0, 0); + setWidgetPosition(0, ivar9, 0, 0); + setWidgetRGB(new Color(164, 153, 125)); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 0, 0); + if (((boolean)ivar6)) { + setWidgetText(" " + svar2); + } else { + setWidgetText(svar2); + } + setWidgetText(svar2); + cs2method1305("" + svar0); + setWidgetContextMenuOption(1, "Remove"); + setScriptCallOnClickContextMenu(130, cs2method3633(ivar5), "s"); + if (((boolean)ivar6)) { + ivar7 = add(getTextWidth(3793, "Last known as: " + svar1), 8); + if (ivar7 > getWidgetActualWidth(new WidgetPointer(550,4))) { + svar3 = "Last known as:" + "
" + svar1; + } else { + svar3 = "Last known as: " + svar1; + } + setScriptCallOnMouseOver(1594, new WidgetPointer(550,52), new WidgetPointer(-32768,3), -2147483643, svar3, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(550,52), "I"); + } + createExtraChild(new WidgetPointer(550,4), 5, add(ivar8, 1)); + setWidgetSprite(2313); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, ivar9, 0, 0); + if (((boolean)ivar6)) { + setWidgetHidden(1); + } + if (mod(ivar5, 2) != 0) { + createExtraChild(new WidgetPointer(550,2), 3, getExtraChildGap(new WidgetPointer(ivar2))); + setWidgetSize(16384, ivar10, 2, 0); + setWidgetPosition(0, ivar9, 0, 0); + setWidgetRGB(new Color(35, 34, 32)); + setWidgetFilled(1); + cs2method2103(128); + } + ivar5 = add(ivar5, 1); + } + while (ivar5 < ivar11) { + ivar9 = multiply(ivar5, ivar10); + if (mod(ivar5, 2) != 0) { + createExtraChild(new WidgetPointer(550,2), 3, getExtraChildGap(new WidgetPointer(ivar2))); + setWidgetSize(16384, ivar10, 2, 0); + setWidgetPosition(0, ivar9, 0, 0); + setWidgetRGB(new Color(35, 34, 32)); + setWidgetFilled(1); + cs2method2103(128); + } + ivar5 = add(ivar5, 1); + } + ivar12 = 0; + ivar13 = 0; + ivar12 = cs2method2601(new WidgetPointer(ivar3)); + ivar13 = multiply(ivar5, ivar10); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar3)), ivar13, new WidgetPointer(ivar3)); + if (ivar12 > ivar13) { + ivar12 = ivar13; + } + script_72(ivar4, ivar3, ivar12); + return; +} diff --git a/dumps/scripts/1290.cs2 b/dumps/scripts/1290.cs2 new file mode 100644 index 000000000..ca5e03781 --- /dev/null +++ b/dumps/scripts/1290.cs2 @@ -0,0 +1,252 @@ +void script_1290() { + setWidgetText(new WidgetPointer(130,81), intToStr(bitconfig_861)); + setWidgetText(new WidgetPointer(130,80), intToStr(bitconfig_862)); + if (bitconfig_842 == 2) { + setWidgetModel(8522, new WidgetPointer(130,0)); + setWidgetModel(8523, new WidgetPointer(130,1)); + setWidgetModel(8598, new WidgetPointer(130,40)); + } else if (((boolean)bitconfig_842)) { + setWidgetModel(8521, new WidgetPointer(130,0)); + setWidgetModel(8524, new WidgetPointer(130,1)); + setWidgetModel(8597, new WidgetPointer(130,40)); + } else { + setWidgetModel(-1, new WidgetPointer(130,40)); + setWidgetModel(8522, new WidgetPointer(130,0)); + setWidgetModel(8524, new WidgetPointer(130,1)); + } + if (bitconfig_843 == 2) { + setWidgetModel(8526, new WidgetPointer(130,2)); + setWidgetModel(8527, new WidgetPointer(130,3)); + setWidgetModel(8600, new WidgetPointer(130,41)); + } else if (((boolean)bitconfig_843)) { + setWidgetModel(8525, new WidgetPointer(130,2)); + setWidgetModel(8528, new WidgetPointer(130,3)); + setWidgetModel(8599, new WidgetPointer(130,41)); + } else { + setWidgetModel(-1, new WidgetPointer(130,41)); + setWidgetModel(8526, new WidgetPointer(130,2)); + setWidgetModel(8528, new WidgetPointer(130,3)); + } + if (bitconfig_844 == 2) { + setWidgetModel(8530, new WidgetPointer(130,4)); + setWidgetModel(8531, new WidgetPointer(130,5)); + setWidgetModel(8602, new WidgetPointer(130,42)); + } else if (((boolean)bitconfig_844)) { + setWidgetModel(8529, new WidgetPointer(130,4)); + setWidgetModel(8532, new WidgetPointer(130,5)); + setWidgetModel(8601, new WidgetPointer(130,42)); + } else { + setWidgetModel(-1, new WidgetPointer(130,42)); + setWidgetModel(8530, new WidgetPointer(130,4)); + setWidgetModel(8532, new WidgetPointer(130,5)); + } + if (bitconfig_845 == 2) { + setWidgetModel(8534, new WidgetPointer(130,6)); + setWidgetModel(8535, new WidgetPointer(130,7)); + setWidgetModel(8604, new WidgetPointer(130,43)); + } else if (((boolean)bitconfig_845)) { + setWidgetModel(8533, new WidgetPointer(130,6)); + setWidgetModel(8536, new WidgetPointer(130,7)); + setWidgetModel(8603, new WidgetPointer(130,43)); + } else { + setWidgetModel(-1, new WidgetPointer(130,43)); + setWidgetModel(8534, new WidgetPointer(130,6)); + setWidgetModel(8536, new WidgetPointer(130,7)); + } + if (bitconfig_846 == 2) { + setWidgetModel(8538, new WidgetPointer(130,8)); + setWidgetModel(8539, new WidgetPointer(130,9)); + setWidgetModel(8606, new WidgetPointer(130,44)); + } else if (((boolean)bitconfig_846)) { + setWidgetModel(8537, new WidgetPointer(130,8)); + setWidgetModel(8540, new WidgetPointer(130,9)); + setWidgetModel(8605, new WidgetPointer(130,44)); + } else { + setWidgetModel(-1, new WidgetPointer(130,44)); + setWidgetModel(8538, new WidgetPointer(130,8)); + setWidgetModel(8540, new WidgetPointer(130,9)); + } + if (bitconfig_847 == 2) { + setWidgetModel(8542, new WidgetPointer(130,10)); + setWidgetModel(8543, new WidgetPointer(130,11)); + setWidgetModel(8608, new WidgetPointer(130,45)); + } else if (((boolean)bitconfig_847)) { + setWidgetModel(8541, new WidgetPointer(130,10)); + setWidgetModel(8544, new WidgetPointer(130,11)); + setWidgetModel(8607, new WidgetPointer(130,45)); + } else { + setWidgetModel(-1, new WidgetPointer(130,45)); + setWidgetModel(8542, new WidgetPointer(130,10)); + setWidgetModel(8544, new WidgetPointer(130,11)); + } + if (bitconfig_848 == 2) { + setWidgetModel(8546, new WidgetPointer(130,12)); + setWidgetModel(8547, new WidgetPointer(130,13)); + setWidgetModel(8610, new WidgetPointer(130,46)); + } else if (((boolean)bitconfig_848)) { + setWidgetModel(8545, new WidgetPointer(130,12)); + setWidgetModel(8548, new WidgetPointer(130,13)); + setWidgetModel(8609, new WidgetPointer(130,46)); + } else { + setWidgetModel(-1, new WidgetPointer(130,46)); + setWidgetModel(8546, new WidgetPointer(130,12)); + setWidgetModel(8548, new WidgetPointer(130,13)); + } + if (bitconfig_849 == 2) { + setWidgetModel(8550, new WidgetPointer(130,14)); + setWidgetModel(8551, new WidgetPointer(130,15)); + setWidgetModel(8612, new WidgetPointer(130,47)); + } else if (((boolean)bitconfig_849)) { + setWidgetModel(8549, new WidgetPointer(130,14)); + setWidgetModel(8552, new WidgetPointer(130,15)); + setWidgetModel(8611, new WidgetPointer(130,47)); + } else { + setWidgetModel(-1, new WidgetPointer(130,47)); + setWidgetModel(8550, new WidgetPointer(130,14)); + setWidgetModel(8552, new WidgetPointer(130,15)); + } + if (bitconfig_850 == 2) { + setWidgetModel(8554, new WidgetPointer(130,16)); + setWidgetModel(8555, new WidgetPointer(130,17)); + setWidgetModel(8614, new WidgetPointer(130,48)); + } else if (((boolean)bitconfig_850)) { + setWidgetModel(8553, new WidgetPointer(130,16)); + setWidgetModel(8556, new WidgetPointer(130,17)); + setWidgetModel(8613, new WidgetPointer(130,48)); + } else { + setWidgetModel(-1, new WidgetPointer(130,48)); + setWidgetModel(8554, new WidgetPointer(130,16)); + setWidgetModel(8556, new WidgetPointer(130,17)); + } + if (bitconfig_851 == 2) { + setWidgetModel(8558, new WidgetPointer(130,18)); + setWidgetModel(8559, new WidgetPointer(130,19)); + setWidgetModel(8616, new WidgetPointer(130,49)); + } else if (((boolean)bitconfig_851)) { + setWidgetModel(8557, new WidgetPointer(130,18)); + setWidgetModel(8560, new WidgetPointer(130,19)); + setWidgetModel(8615, new WidgetPointer(130,49)); + } else { + setWidgetModel(-1, new WidgetPointer(130,49)); + setWidgetModel(8558, new WidgetPointer(130,18)); + setWidgetModel(8560, new WidgetPointer(130,19)); + } + if (bitconfig_852 == 2) { + setWidgetModel(8562, new WidgetPointer(130,20)); + setWidgetModel(8563, new WidgetPointer(130,21)); + setWidgetModel(8618, new WidgetPointer(130,50)); + } else if (((boolean)bitconfig_852)) { + setWidgetModel(8561, new WidgetPointer(130,20)); + setWidgetModel(8564, new WidgetPointer(130,21)); + setWidgetModel(8617, new WidgetPointer(130,50)); + } else { + setWidgetModel(-1, new WidgetPointer(130,50)); + setWidgetModel(8562, new WidgetPointer(130,20)); + setWidgetModel(8564, new WidgetPointer(130,21)); + } + if (bitconfig_853 == 2) { + setWidgetModel(8566, new WidgetPointer(130,22)); + setWidgetModel(8567, new WidgetPointer(130,23)); + setWidgetModel(8620, new WidgetPointer(130,51)); + } else if (((boolean)bitconfig_853)) { + setWidgetModel(8565, new WidgetPointer(130,22)); + setWidgetModel(8568, new WidgetPointer(130,23)); + setWidgetModel(8619, new WidgetPointer(130,51)); + } else { + setWidgetModel(-1, new WidgetPointer(130,51)); + setWidgetModel(8566, new WidgetPointer(130,22)); + setWidgetModel(8568, new WidgetPointer(130,23)); + } + if (bitconfig_854 == 2) { + setWidgetModel(8570, new WidgetPointer(130,24)); + setWidgetModel(8571, new WidgetPointer(130,25)); + setWidgetModel(8622, new WidgetPointer(130,52)); + } else if (((boolean)bitconfig_854)) { + setWidgetModel(8569, new WidgetPointer(130,24)); + setWidgetModel(8572, new WidgetPointer(130,25)); + setWidgetModel(8621, new WidgetPointer(130,52)); + } else { + setWidgetModel(-1, new WidgetPointer(130,52)); + setWidgetModel(8570, new WidgetPointer(130,24)); + setWidgetModel(8572, new WidgetPointer(130,25)); + } + if (bitconfig_855 == 2) { + setWidgetModel(8574, new WidgetPointer(130,26)); + setWidgetModel(8575, new WidgetPointer(130,27)); + setWidgetModel(8624, new WidgetPointer(130,53)); + } else if (((boolean)bitconfig_855)) { + setWidgetModel(8573, new WidgetPointer(130,26)); + setWidgetModel(8576, new WidgetPointer(130,27)); + setWidgetModel(8623, new WidgetPointer(130,53)); + } else { + setWidgetModel(-1, new WidgetPointer(130,53)); + setWidgetModel(8574, new WidgetPointer(130,26)); + setWidgetModel(8576, new WidgetPointer(130,27)); + } + if (bitconfig_856 == 2) { + setWidgetModel(8578, new WidgetPointer(130,28)); + setWidgetModel(8579, new WidgetPointer(130,29)); + setWidgetModel(8626, new WidgetPointer(130,54)); + } else if (((boolean)bitconfig_856)) { + setWidgetModel(8577, new WidgetPointer(130,28)); + setWidgetModel(8580, new WidgetPointer(130,29)); + setWidgetModel(8625, new WidgetPointer(130,54)); + } else { + setWidgetModel(-1, new WidgetPointer(130,54)); + setWidgetModel(8578, new WidgetPointer(130,28)); + setWidgetModel(8580, new WidgetPointer(130,29)); + } + if (bitconfig_857 == 2) { + setWidgetModel(8582, new WidgetPointer(130,30)); + setWidgetModel(8583, new WidgetPointer(130,31)); + setWidgetModel(8628, new WidgetPointer(130,55)); + } else if (((boolean)bitconfig_857)) { + setWidgetModel(8581, new WidgetPointer(130,30)); + setWidgetModel(8584, new WidgetPointer(130,31)); + setWidgetModel(8627, new WidgetPointer(130,55)); + } else { + setWidgetModel(-1, new WidgetPointer(130,55)); + setWidgetModel(8582, new WidgetPointer(130,30)); + setWidgetModel(8584, new WidgetPointer(130,31)); + } + if (bitconfig_858 == 2) { + setWidgetModel(8586, new WidgetPointer(130,32)); + setWidgetModel(8587, new WidgetPointer(130,33)); + setWidgetModel(8630, new WidgetPointer(130,56)); + } else if (((boolean)bitconfig_858)) { + setWidgetModel(8585, new WidgetPointer(130,32)); + setWidgetModel(8588, new WidgetPointer(130,33)); + setWidgetModel(8629, new WidgetPointer(130,56)); + } else { + setWidgetModel(-1, new WidgetPointer(130,56)); + setWidgetModel(8586, new WidgetPointer(130,32)); + setWidgetModel(8588, new WidgetPointer(130,33)); + } + if (bitconfig_859 == 2) { + setWidgetModel(8590, new WidgetPointer(130,34)); + setWidgetModel(8591, new WidgetPointer(130,35)); + setWidgetModel(8632, new WidgetPointer(130,57)); + } else if (((boolean)bitconfig_859)) { + setWidgetModel(8589, new WidgetPointer(130,34)); + setWidgetModel(8592, new WidgetPointer(130,35)); + setWidgetModel(8631, new WidgetPointer(130,57)); + } else { + setWidgetModel(-1, new WidgetPointer(130,57)); + setWidgetModel(8590, new WidgetPointer(130,34)); + setWidgetModel(8592, new WidgetPointer(130,35)); + } + if (bitconfig_860 == 2) { + setWidgetModel(8594, new WidgetPointer(130,36)); + setWidgetModel(8595, new WidgetPointer(130,37)); + setWidgetModel(8634, new WidgetPointer(130,58)); + } else if (((boolean)bitconfig_860)) { + setWidgetModel(8593, new WidgetPointer(130,36)); + setWidgetModel(8596, new WidgetPointer(130,37)); + setWidgetModel(8633, new WidgetPointer(130,58)); + } else { + setWidgetModel(-1, new WidgetPointer(130,58)); + setWidgetModel(8594, new WidgetPointer(130,36)); + setWidgetModel(8596, new WidgetPointer(130,37)); + } + return; +} diff --git a/dumps/scripts/1291.cs2 b/dumps/scripts/1291.cs2 new file mode 100644 index 000000000..c14e78a5d --- /dev/null +++ b/dumps/scripts/1291.cs2 @@ -0,0 +1,121 @@ +void script_1291(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + ivar4 = getWidgetParentId(new WidgetPointer(arg0)); + ivar5 = 0; + switch (arg1) { + case 5341: + ivar5 = bitconfig_1435; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 5343: + ivar5 = bitconfig_1436; + setWidgetText(new WidgetPointer(arg3), "Dibber" + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 952: + ivar5 = bitconfig_1437; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 5325: + ivar5 = bitconfig_1440; + setWidgetText(new WidgetPointer(arg3), "Trowel" + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 6059: + ivar5 = bitconfig_1778; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 1925: + ivar5 = bitconfig_1441; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 6032: + ivar5 = bitconfig_1442; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 6034: + ivar5 = bitconfig_1443; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 5329: + ivar5 = bitconfig_1438; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + if (((boolean)bitconfig_1848)) { + arg1 = 7409; + } + break; + case 6797: + switch (bitconfig_1439) { + case 10: + arg1 = 18682; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Magic watering can" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Magic watering can"); + break; + case 9: + arg1 = 5340; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Watering can (8)" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (8)"); + break; + case 8: + arg1 = 5339; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Watering can (7)" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (7)"); + break; + case 7: + arg1 = 5338; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Watering can (6)" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (6)"); + break; + case 6: + arg1 = 5337; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Watering can (5)" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (5)"); + break; + case 5: + arg1 = 5336; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Watering can (4)" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (4)"); + break; + case 4: + arg1 = 5335; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Watering can (3)" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (3)"); + break; + case 3: + arg1 = 5334; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Watering can (2)" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (2)"); + break; + case 2: + arg1 = 5333; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Watering can (1)" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (1)"); + break; + case 1: + arg1 = 5331; + ivar5 = 1; + setWidgetText(new WidgetPointer(arg3), "Watering can (0)" + "
" + "(1/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (0)"); + break; + } + ivar5 = 0; + setWidgetText(new WidgetPointer(arg3), "Watering can" + "
" + "(0/1)"); + cs2method2305(new WidgetPointer(arg0), "" + "Watering can"); + } + setItemOnWidgetMethod2205(arg1, -1, new WidgetPointer(arg0)); + setWidgetBorderThickness(1, new WidgetPointer(arg0)); + if (ivar5 > 0) { + setWidgetRGB(new Color(125, 215, 100), new WidgetPointer(arg3)); + } else { + setWidgetRGB(new Color(135, 35, 0), new WidgetPointer(arg3)); + } + return; +} diff --git a/dumps/scripts/1292.cs2 b/dumps/scripts/1292.cs2 new file mode 100644 index 000000000..c58a367a1 --- /dev/null +++ b/dumps/scripts/1292.cs2 @@ -0,0 +1,76 @@ +void script_1292(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = getWidgetParentId(new WidgetPointer(arg0)); + if (arg1 == 5329) { + if (getItemAmtInContainer(93, 7409) > 0) { + arg1 = 7409; + } + } else { + if (arg1 == 6797) { + if (getItemAmtInContainer(93, 18682) > 0) { + arg1 = 18682; + cs2method2305(new WidgetPointer(arg0), "" + "Magic watering can"); + } else if (getItemAmtInContainer(93, 5340) > 0) { + arg1 = 5340; + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (8)"); + } else if (getItemAmtInContainer(93, 5339) > 0) { + arg1 = 5339; + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (7)"); + } else if (getItemAmtInContainer(93, 5338) > 0) { + arg1 = 5338; + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (6)"); + } else if (getItemAmtInContainer(93, 5337) > 0) { + arg1 = 5337; + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (5)"); + } else if (getItemAmtInContainer(93, 5336) > 0) { + arg1 = 5336; + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (4)"); + } else if (getItemAmtInContainer(93, 5335) > 0) { + arg1 = 5335; + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (3)"); + } else if (getItemAmtInContainer(93, 5334) > 0) { + arg1 = 5334; + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (2)"); + } else if (getItemAmtInContainer(93, 5333) > 0) { + arg1 = 5333; + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (1)"); + } else if (getItemAmtInContainer(93, 5331) > 0) { + arg1 = 5331; + cs2method2305(new WidgetPointer(arg0), "" + "Watering can (0)"); + } else { + cs2method2305(new WidgetPointer(arg0), "" + "Watering can"); + } + } + } + ivar4 = 0; + switch (arg1) { + case 5329: + case 7409: + ivar4 = add(getItemAmtInContainer(93, 5329), getItemAmtInContainer(93, 7409)); + break; + case 5333: + case 6797: + case 5335: + case 5334: + case 5331: + case 5340: + case 5337: + case 5336: + case 5339: + case 5338: + ivar4 = add(add(add(add(add(add(add(add(add(getItemAmtInContainer(93, 18682), getItemAmtInContainer(93, 5340)), getItemAmtInContainer(93, 5339)), getItemAmtInContainer(93, 5338)), getItemAmtInContainer(93, 5337)), getItemAmtInContainer(93, 5336)), getItemAmtInContainer(93, 5335)), getItemAmtInContainer(93, 5334)), getItemAmtInContainer(93, 5333)), getItemAmtInContainer(93, 5331)); + break; + default: + ivar4 = getItemAmtInContainer(93, arg1); + } + if (ivar4 > 0) { + setWidgetRGB(new Color(125, 215, 100), new WidgetPointer(arg2)); + setItemOnWidgetMethod2200(arg1, ivar4, new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(135, 35, 0), new WidgetPointer(arg2)); + setItemOnWidgetMethod2200(arg1, -1, new WidgetPointer(arg0)); + } + setWidgetBorderThickness(1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1293.cs2 b/dumps/scripts/1293.cs2 new file mode 100644 index 000000000..eb38b33a5 --- /dev/null +++ b/dumps/scripts/1293.cs2 @@ -0,0 +1,51 @@ +void script_1293(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = 5; + ivar2 = 34; + ivar3 = 34; + ivar4 = 0; + ivar5 = 6; + ivar6 = ivar5; + ivar7 = 3; + ivar8 = add(34, 3); + if (((boolean)globalint_1052) && ((boolean)bitconfig_6840)) { + ivar5 = 3; + ivar6 = ivar5; + ivar8 = add(34, 0); + } + ivar9 = add(34, 2); + if (((boolean)globalint_181)) { + ivar5 = 6; + ivar6 = ivar5; + ivar7 = 28; + ivar8 = add(34, 5); + ivar9 = add(34, 3); + } + ivar10 = 30; + if (((boolean)bitconfig_6840)) { + ivar10 = 20; + } + while (ivar4 < ivar10) { + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetSize(ivar2, ivar3, 0, 0); + setWidgetPosition(ivar6, ivar7, 0, 0); + ivar4 = add(ivar4, 1); + if (((boolean)mod(ivar4, ivar1))) { + ivar6 = ivar5; + ivar7 = add(ivar7, ivar9); + } else { + ivar6 = add(ivar6, ivar8); + } + } + return; +} diff --git a/dumps/scripts/1294.cs2 b/dumps/scripts/1294.cs2 new file mode 100644 index 000000000..9c228f5b0 --- /dev/null +++ b/dumps/scripts/1294.cs2 @@ -0,0 +1,59 @@ +void script_1294() { + if (isBitFlagged(standart_config_383, 1)) { + setWidgetModel(4912, new WidgetPointer(144,134)); + } + if (isBitFlagged(standart_config_383, 2)) { + setWidgetModel(4912, new WidgetPointer(144,135)); + } + if (isBitFlagged(standart_config_383, 3)) { + setWidgetModel(4913, new WidgetPointer(144,136)); + } + if (isBitFlagged(standart_config_383, 4)) { + setWidgetModel(4912, new WidgetPointer(144,137)); + } + if (isBitFlagged(standart_config_383, 5)) { + setWidgetModel(4912, new WidgetPointer(144,138)); + } + if (isBitFlagged(standart_config_383, 6)) { + setWidgetModel(4913, new WidgetPointer(144,139)); + } + if (isBitFlagged(standart_config_383, 7)) { + setWidgetModel(4913, new WidgetPointer(144,140)); + } + if (isBitFlagged(standart_config_383, 8)) { + setWidgetModel(4912, new WidgetPointer(144,141)); + } + if (standart_config_383 > 8191) { + setWidgetIsHidden(true, new WidgetPointer(144,186)); + setWidgetSprite(296, new WidgetPointer(144,146)); + } + if (isBitFlagged(standart_config_383, 14)) { + setWidgetModel(4910, new WidgetPointer(144,174)); + setWidgetAnimation(1456, new WidgetPointer(144,174)); + } + if (isBitFlagged(standart_config_383, 15)) { + setWidgetModel(4910, new WidgetPointer(144,172)); + setWidgetAnimation(1456, new WidgetPointer(144,172)); + } + if (isBitFlagged(standart_config_383, 16)) { + setWidgetModel(4910, new WidgetPointer(144,176)); + setWidgetAnimation(1456, new WidgetPointer(144,176)); + } + if (isBitFlagged(standart_config_383, 17)) { + setWidgetModel(4910, new WidgetPointer(144,178)); + setWidgetAnimation(1455, new WidgetPointer(144,178)); + } + if (isBitFlagged(standart_config_383, 18)) { + setWidgetModel(4910, new WidgetPointer(144,180)); + setWidgetAnimation(1455, new WidgetPointer(144,180)); + } + if (isBitFlagged(standart_config_383, 19)) { + setWidgetModel(4910, new WidgetPointer(144,183)); + setWidgetAnimation(1453, new WidgetPointer(144,183)); + } + if (isBitFlagged(standart_config_383, 20)) { + setWidgetModel(4910, new WidgetPointer(144,185)); + setWidgetAnimation(1453, new WidgetPointer(144,185)); + } + return; +} diff --git a/dumps/scripts/1295.cs2 b/dumps/scripts/1295.cs2 new file mode 100644 index 000000000..da59cf994 --- /dev/null +++ b/dumps/scripts/1295.cs2 @@ -0,0 +1,8 @@ +void script_1295() { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(144,147)); + setScriptCallOnMouseExit(45, new WidgetPointer(-32768,3), 16711680, "Ii", new WidgetPointer(144,147)); + setWidgetIsHidden(true, new WidgetPointer(144,186)); + setWidgetModel(4910, new WidgetPointer(144,187)); + setWidgetAnimation(1453, new WidgetPointer(144,187)); + return; +} diff --git a/dumps/scripts/1296.cs2 b/dumps/scripts/1296.cs2 new file mode 100644 index 000000000..392620b45 --- /dev/null +++ b/dumps/scripts/1296.cs2 @@ -0,0 +1,7 @@ +void script_1296() { + if (getDisplayMode() >= 2) { + setWidget3DRotation(0, 0, 89, 67, 0, 300, new WidgetPointer(584,2)); + setWidget3DRotation(0, 0, 89, 67, 0, 300, new WidgetPointer(584,1)); + } + return; +} diff --git a/dumps/scripts/1297.cs2 b/dumps/scripts/1297.cs2 new file mode 100644 index 000000000..e7afa6e02 --- /dev/null +++ b/dumps/scripts/1297.cs2 @@ -0,0 +1,8 @@ +void script_1297() { + script_1264(); + script_1265(); + script_1269(); + script_1272(); + script_4143(); + return; +} diff --git a/dumps/scripts/1298.cs2 b/dumps/scripts/1298.cs2 new file mode 100644 index 000000000..82f24d175 --- /dev/null +++ b/dumps/scripts/1298.cs2 @@ -0,0 +1,5 @@ +void script_1298(int arg0,int arg1,int arg2,int arg3) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_2786(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/1299.cs2 b/dumps/scripts/1299.cs2 new file mode 100644 index 000000000..2b3f29c1b --- /dev/null +++ b/dumps/scripts/1299.cs2 @@ -0,0 +1,86 @@ +void script_1299(int arg0,int arg1) { + int ivar2; + string svar0; + flow_0: + if (((boolean)arg1)) { + script_2710(59375640, 59375641, 59375642, 59703312, 59703318, 59703317); + } + setWidgetSprite(4140, new WidgetPointer(906,248)); + setWidgetSprite(4139, new WidgetPointer(906,249)); + setWidgetSprite(4141, new WidgetPointer(906,250)); + setWidgetSprite(4142, new WidgetPointer(906,251)); + setWidgetSprite(4144, new WidgetPointer(906,252)); + setWidgetSprite(4143, new WidgetPointer(906,253)); + setWidgetSprite(4145, new WidgetPointer(906,254)); + setWidgetSprite(4146, new WidgetPointer(906,255)); + setWidgetSprite(4129, new WidgetPointer(906,257)); + setWidgetSprite(4129, new WidgetPointer(906,259)); + setWidgetSprite(4129, new WidgetPointer(906,262)); + setWidgetSprite(4065, new WidgetPointer(906,226)); + setWidgetVFlip(1, new WidgetPointer(906,226)); + setWidgetHFlip(1, new WidgetPointer(906,226)); + setWidgetSprite(4065, new WidgetPointer(906,230)); + setWidgetVFlip(1, new WidgetPointer(906,230)); + setWidgetHFlip(0, new WidgetPointer(906,230)); + setWidgetSprite(4065, new WidgetPointer(906,227)); + setWidgetVFlip(0, new WidgetPointer(906,227)); + setWidgetHFlip(1, new WidgetPointer(906,227)); + setWidgetSprite(4065, new WidgetPointer(906,231)); + setWidgetVFlip(0, new WidgetPointer(906,231)); + setWidgetHFlip(0, new WidgetPointer(906,231)); + setScriptCallOnWidgetResize(4040, "", new WidgetPointer(906,23)); + ivar2 = strIndexof(0, globalstring_32, "@"); + if (ivar2 == -1) { + globalint_1414 = 1; + } else { + globalint_1414 = 2; + } + IF (((boolean)cs2method6912())) + GOTO flow_6 + IF (((boolean)stringMethod4107(substr(0, 1, cs2method5020()), "#")) && ((boolean)arg0)) + GOTO flow_7 + GOTO flow_12 + flow_6: + flow_7: + globalint_1322 = 1; + globalint_200 = 0; + script_3093(-3, 0, 1, -1, 0, -1, 0, "Logging In - Please Wait", "", "", "", ""); + globalint_1100 = -3; + if (arg1 < 50) { + arg1 = add(arg1, 1); + setScriptCallOnGameloop(3057, 0, arg1, "1i", new WidgetPointer(906,23)); + return; + } + if (cs2method6500()) { + setScriptCallOnGameloop(3057, 0, arg1, "1i", new WidgetPointer(906,23)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(906,23)); + cs2method5612(0); + setScriptCallOnGameloop(3063, new WidgetPointer(906,23), getWorldId(), "Ii", new WidgetPointer(906,23)); + return; + flow_12: + setWidgetIsHidden(false, new WidgetPointer(906,27)); + setWidgetIsHidden(true, new WidgetPointer(906,41)); + script_3097(); + script_3058(); + script_3060(0); + script_3064(1); + globalstring_277 = ""; + globalint_547 = 0; + messageType0("Welcome to the RuneScape Lobby."); + message(43, 0, "Welcome to the RuneScape Lobby."); + if (cs2method6900()) { + messageType0("Users restricted to quick-chat cannot send messages from the Lobby."); + message(43, 0, "Users restricted to quick-chat cannot send messages from the Lobby."); + } + script_51(); + setScriptCallOnKeyPress(1328, -2147483640, "i", new WidgetPointer(906,23)); + svar0 = script_2781(); + if (strLength(svar0) > 0) { + script_2779(-3000, 0, 0, 2607, 1, 0, 1, 350, svar0 + "
" + " ", "Re-Subscribe Now", "Re-Subscribe Now", "Close", "Close"); + } + setScriptCallOnGameloop(1868, new WidgetPointer(906,28), "I", new WidgetPointer(906,28)); + script_4041(); + return; +} diff --git a/dumps/scripts/13.cs2 b/dumps/scripts/13.cs2 new file mode 100644 index 000000000..494cb5c76 --- /dev/null +++ b/dumps/scripts/13.cs2 @@ -0,0 +1,131 @@ +cs2func_script_13_struct(1,1,0) script_13(int arg0,int arg1) { + int stack_dump0; + cs2func_script_981_struct(1,1,0) structdump_1; + cs2func_script_983_struct(1,1,0) structdump_2; + cs2func_script_977_struct(1,1,0) structdump_3; + cs2func_script_1009_struct(1,1,0) structdump_4; + cs2func_script_1003_struct(1,1,0) structdump_5; + cs2func_script_995_struct(1,1,0) structdump_6; + cs2func_script_993_struct(1,1,0) structdump_7; + cs2func_script_1007_struct(1,1,0) structdump_8; + cs2func_script_1001_struct(1,1,0) structdump_9; + cs2func_script_991_struct(1,1,0) structdump_10; + cs2func_script_999_struct(1,1,0) structdump_11; + cs2func_script_979_struct(1,1,0) structdump_12; + cs2func_script_1015_struct(1,1,0) structdump_13; + cs2func_script_1021_struct(1,1,0) structdump_14; + cs2func_script_997_struct(1,1,0) structdump_15; + cs2func_script_1017_struct(1,1,0) structdump_16; + cs2func_script_985_struct(1,1,0) structdump_17; + cs2func_script_989_struct(1,1,0) structdump_18; + cs2func_script_1011_struct(1,1,0) structdump_19; + cs2func_script_987_struct(1,1,0) structdump_20; + cs2func_script_1013_struct(1,1,0) structdump_21; + cs2func_script_2_struct(1,1,0) structdump_22; + cs2func_script_1005_struct(1,1,0) structdump_23; + cs2func_script_1019_struct(1,1,0) structdump_24; + cs2func_script_3354_struct(1,1,0) structdump_25; + switch (arg0) { + case 1: + stack_dump0 = arg1; + structdump_1 = script_981(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_1.intpart_0, structdump_1.stringpart_0); + case 2: + stack_dump0 = arg1; + structdump_2 = script_983(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_2.intpart_0, structdump_2.stringpart_0); + case 5: + stack_dump0 = arg1; + structdump_3 = script_977(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_3.intpart_0, structdump_3.stringpart_0); + case 3: + stack_dump0 = arg1; + structdump_4 = script_1009(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_4.intpart_0, structdump_4.stringpart_0); + case 7: + stack_dump0 = arg1; + structdump_5 = script_1003(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_5.intpart_0, structdump_5.stringpart_0); + case 4: + stack_dump0 = arg1; + structdump_6 = script_995(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_6.intpart_0, structdump_6.stringpart_0); + case 6: + stack_dump0 = arg1; + structdump_7 = script_993(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_7.intpart_0, structdump_7.stringpart_0); + case 8: + stack_dump0 = arg1; + structdump_8 = script_1007(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_8.intpart_0, structdump_8.stringpart_0); + case 9: + stack_dump0 = arg1; + structdump_9 = script_1001(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_9.intpart_0, structdump_9.stringpart_0); + case 10: + stack_dump0 = arg1; + structdump_10 = script_991(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_10.intpart_0, structdump_10.stringpart_0); + case 11: + stack_dump0 = arg1; + structdump_11 = script_999(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_11.intpart_0, structdump_11.stringpart_0); + case 19: + stack_dump0 = arg1; + structdump_12 = script_979(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_12.intpart_0, structdump_12.stringpart_0); + case 13: + stack_dump0 = arg1; + structdump_13 = script_1015(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_13.intpart_0, structdump_13.stringpart_0); + case 14: + stack_dump0 = arg1; + structdump_14 = script_1021(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_14.intpart_0, structdump_14.stringpart_0); + case 15: + stack_dump0 = arg1; + structdump_15 = script_997(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_15.intpart_0, structdump_15.stringpart_0); + case 16: + stack_dump0 = arg1; + structdump_16 = script_1017(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_16.intpart_0, structdump_16.stringpart_0); + case 17: + stack_dump0 = arg1; + structdump_17 = script_985(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_17.intpart_0, structdump_17.stringpart_0); + case 18: + stack_dump0 = arg1; + structdump_18 = script_989(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_18.intpart_0, structdump_18.stringpart_0); + case 12: + stack_dump0 = arg1; + structdump_19 = script_1011(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_19.intpart_0, structdump_19.stringpart_0); + case 20: + stack_dump0 = arg1; + structdump_20 = script_987(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_20.intpart_0, structdump_20.stringpart_0); + case 21: + stack_dump0 = arg1; + structdump_21 = script_1013(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_21.intpart_0, structdump_21.stringpart_0); + case 22: + stack_dump0 = arg1; + structdump_22 = script_2(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_22.intpart_0, structdump_22.stringpart_0); + case 23: + stack_dump0 = arg1; + structdump_23 = script_1005(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_23.intpart_0, structdump_23.stringpart_0); + case 24: + stack_dump0 = arg1; + structdump_24 = script_1019(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_24.intpart_0, structdump_24.stringpart_0); + case 25: + stack_dump0 = arg1; + structdump_25 = script_3354(stack_dump0); + return newstruct cs2func_script_13_struct(structdump_25.intpart_0, structdump_25.stringpart_0); + } + return newstruct cs2func_script_13_struct(-1, ""); +} diff --git a/dumps/scripts/130.cs2 b/dumps/scripts/130.cs2 new file mode 100644 index 000000000..4bcd9dda3 --- /dev/null +++ b/dumps/scripts/130.cs2 @@ -0,0 +1,4 @@ +void script_130(string arg0) { + cs2method3608(strRemoveEntities(arg0)); + return; +} diff --git a/dumps/scripts/1300.cs2 b/dumps/scripts/1300.cs2 new file mode 100644 index 000000000..a6217039c --- /dev/null +++ b/dumps/scripts/1300.cs2 @@ -0,0 +1,4 @@ +void script_1300(int arg0,int arg1) { + script_1301(arg0, arg1); + return; +} diff --git a/dumps/scripts/1301.cs2 b/dumps/scripts/1301.cs2 new file mode 100644 index 000000000..6e39efe57 --- /dev/null +++ b/dumps/scripts/1301.cs2 @@ -0,0 +1,22 @@ +void script_1301(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (getDisplayMode() >= 2) { + script_31(arg0, arg1, 883, 802, 881, 882, 641, 642); + while (ivar2 < getExtraChildGap(new WidgetPointer(arg0))) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar2)) { + cs2method1122(1); + } + ivar2 = add(ivar2, 1); + } + } else { + script_31(arg0, arg1, 792, 789, 790, 791, 773, 788); + while (ivar2 < getExtraChildGap(new WidgetPointer(arg0))) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar2)) { + cs2method1122(0); + } + ivar2 = add(ivar2, 1); + } + } + return; +} diff --git a/dumps/scripts/1302.cs2 b/dumps/scripts/1302.cs2 new file mode 100644 index 000000000..e9f9028ca --- /dev/null +++ b/dumps/scripts/1302.cs2 @@ -0,0 +1,4 @@ +void script_1302() { + script_71(globalint_168); + return; +} diff --git a/dumps/scripts/1303.cs2 b/dumps/scripts/1303.cs2 new file mode 100644 index 000000000..d034d3c2e --- /dev/null +++ b/dumps/scripts/1303.cs2 @@ -0,0 +1,10 @@ +void script_1303(int arg0) { + globalint_10 = 0; + script_1304(arg0); + if (globalint_168 == arg0) { + globalint_168 = -1; + } else { + globalint_168 = arg0; + } + return; +} diff --git a/dumps/scripts/1304.cs2 b/dumps/scripts/1304.cs2 new file mode 100644 index 000000000..e37441eec --- /dev/null +++ b/dumps/scripts/1304.cs2 @@ -0,0 +1,27 @@ +void script_1304(int arg0) { + int ivar1; + ivar1 = script_1305(); + if (((boolean)script_2709()) && (((arg0 == 9) || (arg0 == 11)) || (arg0 == 10))) { + return; + } + if ((arg0 == ivar1) && ((boolean)bitconfig_9030)) { + arg0 = 1; + script_4089(); + } + if (ivar1 > -1) { + if (ivar1 == arg0) { + if ((getDisplayMode() >= 2) && ((boolean)bitconfig_9030)) { + script_1306(); + } else { + return; + } + } else { + script_1306(); + script_1387(arg0); + } + } else { + script_1306(); + script_1387(arg0); + } + return; +} diff --git a/dumps/scripts/1305.cs2 b/dumps/scripts/1305.cs2 new file mode 100644 index 000000000..8ca17f88f --- /dev/null +++ b/dumps/scripts/1305.cs2 @@ -0,0 +1,20 @@ +int script_1305() { + int ivar0; + ivar0 = 0; + if (((boolean)script_1314(99))) { + return 99; + } + if (((boolean)script_1314(95))) { + return 95; + } + if (((boolean)script_1314(98))) { + return 98; + } + while (ivar0 < 16) { + if (((boolean)script_1314(ivar0))) { + return ivar0; + } + ivar0 = add(ivar0, 1); + } + return -1; +} diff --git a/dumps/scripts/1306.cs2 b/dumps/scripts/1306.cs2 new file mode 100644 index 000000000..6a80992da --- /dev/null +++ b/dumps/scripts/1306.cs2 @@ -0,0 +1,8 @@ +void script_1306() { + if (getDisplayMode() >= 2) { + script_1385(); + } else { + script_1386(); + } + return; +} diff --git a/dumps/scripts/1307.cs2 b/dumps/scripts/1307.cs2 new file mode 100644 index 000000000..636972135 --- /dev/null +++ b/dumps/scripts/1307.cs2 @@ -0,0 +1,6 @@ +void script_1307(int arg0) { + if (((boolean)bitconfig_7912) || (((bitconfig_7904 == 8) && ((boolean)bitconfig_7921)) && ((boolean)bitconfig_7916))) { + setWidgetModel(getWidgetModelId(new WidgetPointer(arg0)), new WidgetPointer(986,3)); + } + return; +} diff --git a/dumps/scripts/1308.cs2 b/dumps/scripts/1308.cs2 new file mode 100644 index 000000000..e5604e5f7 --- /dev/null +++ b/dumps/scripts/1308.cs2 @@ -0,0 +1,23 @@ +void script_1308() { + setWidgetIsHidden(true, new WidgetPointer(746,90)); + setWidgetIsHidden(true, new WidgetPointer(746,91)); + setWidgetIsHidden(true, new WidgetPointer(746,92)); + setWidgetIsHidden(true, new WidgetPointer(746,93)); + setWidgetIsHidden(true, new WidgetPointer(746,94)); + setWidgetIsHidden(true, new WidgetPointer(746,95)); + setWidgetIsHidden(true, new WidgetPointer(746,96)); + setWidgetIsHidden(true, new WidgetPointer(746,97)); + setWidgetIsHidden(true, new WidgetPointer(746,98)); + setWidgetIsHidden(true, new WidgetPointer(746,99)); + setWidgetIsHidden(true, new WidgetPointer(746,100)); + setWidgetIsHidden(true, new WidgetPointer(746,101)); + setWidgetIsHidden(true, new WidgetPointer(746,102)); + setWidgetIsHidden(true, new WidgetPointer(746,103)); + setWidgetIsHidden(true, new WidgetPointer(746,104)); + setWidgetIsHidden(true, new WidgetPointer(746,105)); + setWidgetIsHidden(true, new WidgetPointer(746,107)); + setWidgetIsHidden(true, new WidgetPointer(746,108)); + setWidgetIsHidden(true, new WidgetPointer(746,86)); + setWidgetIsHidden(true, new WidgetPointer(746,88)); + return; +} diff --git a/dumps/scripts/1309.cs2 b/dumps/scripts/1309.cs2 new file mode 100644 index 000000000..a741e56f7 --- /dev/null +++ b/dumps/scripts/1309.cs2 @@ -0,0 +1,136 @@ +void script_1309(int arg0) { + int ivar1; + ivar1 = script_1305(); + if (((boolean)arg0)) { + if (ivar1 != 0) { + setWidgetSprite(-1, new WidgetPointer(746,39)); + setWidgetSprite(-1, new WidgetPointer(746,132)); + setWidgetSprite(-1, new WidgetPointer(746,133)); + } + if (ivar1 != 2) { + setWidgetSprite(-1, new WidgetPointer(746,40)); + setWidgetSprite(-1, new WidgetPointer(746,134)); + setWidgetSprite(-1, new WidgetPointer(746,135)); + } + if (ivar1 != 3) { + setWidgetSprite(-1, new WidgetPointer(746,41)); + setWidgetSprite(-1, new WidgetPointer(746,136)); + setWidgetSprite(-1, new WidgetPointer(746,137)); + } + if (ivar1 != 1) { + setWidgetSprite(-1, new WidgetPointer(746,42)); + setWidgetSprite(-1, new WidgetPointer(746,138)); + setWidgetSprite(-1, new WidgetPointer(746,139)); + } + if (ivar1 != 4) { + setWidgetSprite(-1, new WidgetPointer(746,43)); + setWidgetSprite(-1, new WidgetPointer(746,140)); + setWidgetSprite(-1, new WidgetPointer(746,141)); + } + if (ivar1 != 5) { + setWidgetSprite(-1, new WidgetPointer(746,44)); + setWidgetSprite(-1, new WidgetPointer(746,142)); + setWidgetSprite(-1, new WidgetPointer(746,143)); + } + if (ivar1 != 6) { + setWidgetSprite(-1, new WidgetPointer(746,45)); + setWidgetSprite(-1, new WidgetPointer(746,144)); + setWidgetSprite(-1, new WidgetPointer(746,145)); + } + if (ivar1 != 7) { + setWidgetSprite(-1, new WidgetPointer(746,46)); + setWidgetSprite(-1, new WidgetPointer(746,146)); + setWidgetSprite(-1, new WidgetPointer(746,147)); + } + if (ivar1 != 8) { + setWidgetSprite(-1, new WidgetPointer(746,47)); + setWidgetSprite(-1, new WidgetPointer(746,148)); + setWidgetSprite(-1, new WidgetPointer(746,149)); + } + if (ivar1 != 9) { + setWidgetSprite(-1, new WidgetPointer(746,48)); + setWidgetSprite(-1, new WidgetPointer(746,150)); + setWidgetSprite(-1, new WidgetPointer(746,151)); + } + if (ivar1 != 10) { + setWidgetSprite(-1, new WidgetPointer(746,49)); + setWidgetSprite(-1, new WidgetPointer(746,152)); + setWidgetSprite(-1, new WidgetPointer(746,153)); + } + if (ivar1 != 11) { + setWidgetSprite(-1, new WidgetPointer(746,50)); + setWidgetSprite(-1, new WidgetPointer(746,154)); + setWidgetSprite(-1, new WidgetPointer(746,155)); + } + if (ivar1 != 12) { + setWidgetSprite(-1, new WidgetPointer(746,51)); + setWidgetSprite(-1, new WidgetPointer(746,156)); + setWidgetSprite(-1, new WidgetPointer(746,157)); + } + if (ivar1 != 13) { + setWidgetSprite(-1, new WidgetPointer(746,52)); + setWidgetSprite(-1, new WidgetPointer(746,158)); + setWidgetSprite(-1, new WidgetPointer(746,159)); + } + if (ivar1 != 14) { + setWidgetSprite(-1, new WidgetPointer(746,53)); + setWidgetSprite(-1, new WidgetPointer(746,160)); + setWidgetSprite(-1, new WidgetPointer(746,161)); + } + if (ivar1 != 15) { + setWidgetSprite(-1, new WidgetPointer(746,54)); + setWidgetSprite(-1, new WidgetPointer(746,162)); + setWidgetSprite(-1, new WidgetPointer(746,163)); + } + } else { + setWidgetSprite(-1, new WidgetPointer(746,39)); + setWidgetSprite(-1, new WidgetPointer(746,132)); + setWidgetSprite(-1, new WidgetPointer(746,133)); + setWidgetSprite(-1, new WidgetPointer(746,40)); + setWidgetSprite(-1, new WidgetPointer(746,134)); + setWidgetSprite(-1, new WidgetPointer(746,135)); + setWidgetSprite(-1, new WidgetPointer(746,41)); + setWidgetSprite(-1, new WidgetPointer(746,136)); + setWidgetSprite(-1, new WidgetPointer(746,137)); + setWidgetSprite(-1, new WidgetPointer(746,42)); + setWidgetSprite(-1, new WidgetPointer(746,138)); + setWidgetSprite(-1, new WidgetPointer(746,139)); + setWidgetSprite(-1, new WidgetPointer(746,43)); + setWidgetSprite(-1, new WidgetPointer(746,140)); + setWidgetSprite(-1, new WidgetPointer(746,141)); + setWidgetSprite(-1, new WidgetPointer(746,44)); + setWidgetSprite(-1, new WidgetPointer(746,142)); + setWidgetSprite(-1, new WidgetPointer(746,143)); + setWidgetSprite(-1, new WidgetPointer(746,45)); + setWidgetSprite(-1, new WidgetPointer(746,144)); + setWidgetSprite(-1, new WidgetPointer(746,145)); + setWidgetSprite(-1, new WidgetPointer(746,46)); + setWidgetSprite(-1, new WidgetPointer(746,146)); + setWidgetSprite(-1, new WidgetPointer(746,147)); + setWidgetSprite(-1, new WidgetPointer(746,47)); + setWidgetSprite(-1, new WidgetPointer(746,148)); + setWidgetSprite(-1, new WidgetPointer(746,149)); + setWidgetSprite(-1, new WidgetPointer(746,48)); + setWidgetSprite(-1, new WidgetPointer(746,150)); + setWidgetSprite(-1, new WidgetPointer(746,151)); + setWidgetSprite(-1, new WidgetPointer(746,49)); + setWidgetSprite(-1, new WidgetPointer(746,152)); + setWidgetSprite(-1, new WidgetPointer(746,153)); + setWidgetSprite(-1, new WidgetPointer(746,50)); + setWidgetSprite(-1, new WidgetPointer(746,154)); + setWidgetSprite(-1, new WidgetPointer(746,155)); + setWidgetSprite(-1, new WidgetPointer(746,51)); + setWidgetSprite(-1, new WidgetPointer(746,156)); + setWidgetSprite(-1, new WidgetPointer(746,157)); + setWidgetSprite(-1, new WidgetPointer(746,52)); + setWidgetSprite(-1, new WidgetPointer(746,158)); + setWidgetSprite(-1, new WidgetPointer(746,159)); + setWidgetSprite(-1, new WidgetPointer(746,53)); + setWidgetSprite(-1, new WidgetPointer(746,160)); + setWidgetSprite(-1, new WidgetPointer(746,161)); + setWidgetSprite(-1, new WidgetPointer(746,54)); + setWidgetSprite(-1, new WidgetPointer(746,162)); + setWidgetSprite(-1, new WidgetPointer(746,163)); + } + return; +} diff --git a/dumps/scripts/131.cs2 b/dumps/scripts/131.cs2 new file mode 100644 index 000000000..af791ae7f --- /dev/null +++ b/dumps/scripts/131.cs2 @@ -0,0 +1,4 @@ +void script_131(string arg0) { + globalstring_24 = arg0; + return; +} diff --git a/dumps/scripts/1310.cs2 b/dumps/scripts/1310.cs2 new file mode 100644 index 000000000..b15cc26db --- /dev/null +++ b/dumps/scripts/1310.cs2 @@ -0,0 +1,37 @@ +void script_1310(int arg0) { + switch (arg0) { + case 21561344: + if (setWidgetRegister(new WidgetPointer(329,2))) { + setWidgetSprite(6364); + } + if (setWidgetRegister(new WidgetPointer(329,3))) { + setWidgetSprite(6365); + } + if (setWidgetRegister(new WidgetPointer(329,4))) { + setWidgetSprite(6366); + } + break; + case 33947660: + if (setWidgetRegister(new WidgetPointer(518,0))) { + setWidgetSprite(6364); + } + if (setWidgetRegister(new WidgetPointer(518,1))) { + setWidgetSprite(6365); + } + if (setWidgetRegister(new WidgetPointer(518,2))) { + setWidgetSprite(6366); + } + break; + case 21561345: + if (setWidgetRegister(new WidgetPointer(329,40))) { + setWidgetSprite(6364); + } + if (setWidgetRegister(new WidgetPointer(329,41))) { + setWidgetSprite(6365); + } + if (setWidgetRegister(new WidgetPointer(329,42))) { + setWidgetSprite(6366); + } + } + return; +} diff --git a/dumps/scripts/1311.cs2 b/dumps/scripts/1311.cs2 new file mode 100644 index 000000000..0025b134d --- /dev/null +++ b/dumps/scripts/1311.cs2 @@ -0,0 +1,22 @@ +void script_1311() { + setWidgetIsHidden(true, new WidgetPointer(548,204)); + setWidgetIsHidden(true, new WidgetPointer(548,205)); + setWidgetIsHidden(true, new WidgetPointer(548,206)); + setWidgetIsHidden(true, new WidgetPointer(548,207)); + setWidgetIsHidden(true, new WidgetPointer(548,208)); + setWidgetIsHidden(true, new WidgetPointer(548,209)); + setWidgetIsHidden(true, new WidgetPointer(548,210)); + setWidgetIsHidden(true, new WidgetPointer(548,211)); + setWidgetIsHidden(true, new WidgetPointer(548,212)); + setWidgetIsHidden(true, new WidgetPointer(548,213)); + setWidgetIsHidden(true, new WidgetPointer(548,214)); + setWidgetIsHidden(true, new WidgetPointer(548,215)); + setWidgetIsHidden(true, new WidgetPointer(548,216)); + setWidgetIsHidden(true, new WidgetPointer(548,217)); + setWidgetIsHidden(true, new WidgetPointer(548,218)); + setWidgetIsHidden(true, new WidgetPointer(548,219)); + setWidgetIsHidden(true, new WidgetPointer(548,221)); + setWidgetIsHidden(true, new WidgetPointer(548,222)); + setWidgetIsHidden(true, new WidgetPointer(548,200)); + return; +} diff --git a/dumps/scripts/1312.cs2 b/dumps/scripts/1312.cs2 new file mode 100644 index 000000000..a391d5f6e --- /dev/null +++ b/dumps/scripts/1312.cs2 @@ -0,0 +1,136 @@ +void script_1312(int arg0) { + int ivar1; + ivar1 = script_1305(); + if (((boolean)arg0)) { + if (ivar1 != 0) { + setWidgetSprite(-1, new WidgetPointer(548,129)); + setWidgetSprite(-1, new WidgetPointer(548,147)); + setWidgetSprite(-1, new WidgetPointer(548,148)); + } + if (ivar1 != 2) { + setWidgetSprite(-1, new WidgetPointer(548,130)); + setWidgetSprite(-1, new WidgetPointer(548,149)); + setWidgetSprite(-1, new WidgetPointer(548,150)); + } + if (ivar1 != 3) { + setWidgetSprite(-1, new WidgetPointer(548,131)); + setWidgetSprite(-1, new WidgetPointer(548,151)); + setWidgetSprite(-1, new WidgetPointer(548,152)); + } + if (ivar1 != 1) { + setWidgetSprite(-1, new WidgetPointer(548,132)); + setWidgetSprite(-1, new WidgetPointer(548,153)); + setWidgetSprite(-1, new WidgetPointer(548,154)); + } + if (ivar1 != 4) { + setWidgetSprite(-1, new WidgetPointer(548,133)); + setWidgetSprite(-1, new WidgetPointer(548,155)); + setWidgetSprite(-1, new WidgetPointer(548,156)); + } + if (ivar1 != 5) { + setWidgetSprite(-1, new WidgetPointer(548,134)); + setWidgetSprite(-1, new WidgetPointer(548,157)); + setWidgetSprite(-1, new WidgetPointer(548,158)); + } + if (ivar1 != 6) { + setWidgetSprite(-1, new WidgetPointer(548,135)); + setWidgetSprite(-1, new WidgetPointer(548,159)); + setWidgetSprite(-1, new WidgetPointer(548,160)); + } + if (ivar1 != 7) { + setWidgetSprite(-1, new WidgetPointer(548,136)); + setWidgetSprite(-1, new WidgetPointer(548,161)); + setWidgetSprite(-1, new WidgetPointer(548,162)); + } + if (ivar1 != 8) { + setWidgetSprite(-1, new WidgetPointer(548,99)); + setWidgetSprite(-1, new WidgetPointer(548,83)); + setWidgetSprite(-1, new WidgetPointer(548,84)); + } + if (ivar1 != 9) { + setWidgetSprite(-1, new WidgetPointer(548,100)); + setWidgetSprite(-1, new WidgetPointer(548,85)); + setWidgetSprite(-1, new WidgetPointer(548,86)); + } + if (ivar1 != 10) { + setWidgetSprite(-1, new WidgetPointer(548,101)); + setWidgetSprite(-1, new WidgetPointer(548,87)); + setWidgetSprite(-1, new WidgetPointer(548,88)); + } + if (ivar1 != 11) { + setWidgetSprite(-1, new WidgetPointer(548,102)); + setWidgetSprite(-1, new WidgetPointer(548,89)); + setWidgetSprite(-1, new WidgetPointer(548,90)); + } + if (ivar1 != 12) { + setWidgetSprite(-1, new WidgetPointer(548,103)); + setWidgetSprite(-1, new WidgetPointer(548,91)); + setWidgetSprite(-1, new WidgetPointer(548,92)); + } + if (ivar1 != 13) { + setWidgetSprite(-1, new WidgetPointer(548,104)); + setWidgetSprite(-1, new WidgetPointer(548,93)); + setWidgetSprite(-1, new WidgetPointer(548,94)); + } + if (ivar1 != 14) { + setWidgetSprite(-1, new WidgetPointer(548,105)); + setWidgetSprite(-1, new WidgetPointer(548,95)); + setWidgetSprite(-1, new WidgetPointer(548,96)); + } + if (ivar1 != 15) { + setWidgetSprite(-1, new WidgetPointer(548,106)); + setWidgetSprite(-1, new WidgetPointer(548,97)); + setWidgetSprite(-1, new WidgetPointer(548,98)); + } + } else { + setWidgetSprite(-1, new WidgetPointer(548,129)); + setWidgetSprite(-1, new WidgetPointer(548,147)); + setWidgetSprite(-1, new WidgetPointer(548,148)); + setWidgetSprite(-1, new WidgetPointer(548,130)); + setWidgetSprite(-1, new WidgetPointer(548,149)); + setWidgetSprite(-1, new WidgetPointer(548,150)); + setWidgetSprite(-1, new WidgetPointer(548,131)); + setWidgetSprite(-1, new WidgetPointer(548,151)); + setWidgetSprite(-1, new WidgetPointer(548,152)); + setWidgetSprite(-1, new WidgetPointer(548,132)); + setWidgetSprite(-1, new WidgetPointer(548,153)); + setWidgetSprite(-1, new WidgetPointer(548,154)); + setWidgetSprite(-1, new WidgetPointer(548,133)); + setWidgetSprite(-1, new WidgetPointer(548,155)); + setWidgetSprite(-1, new WidgetPointer(548,156)); + setWidgetSprite(-1, new WidgetPointer(548,134)); + setWidgetSprite(-1, new WidgetPointer(548,157)); + setWidgetSprite(-1, new WidgetPointer(548,158)); + setWidgetSprite(-1, new WidgetPointer(548,135)); + setWidgetSprite(-1, new WidgetPointer(548,159)); + setWidgetSprite(-1, new WidgetPointer(548,160)); + setWidgetSprite(-1, new WidgetPointer(548,136)); + setWidgetSprite(-1, new WidgetPointer(548,161)); + setWidgetSprite(-1, new WidgetPointer(548,162)); + setWidgetSprite(-1, new WidgetPointer(548,99)); + setWidgetSprite(-1, new WidgetPointer(548,83)); + setWidgetSprite(-1, new WidgetPointer(548,84)); + setWidgetSprite(-1, new WidgetPointer(548,100)); + setWidgetSprite(-1, new WidgetPointer(548,85)); + setWidgetSprite(-1, new WidgetPointer(548,86)); + setWidgetSprite(-1, new WidgetPointer(548,101)); + setWidgetSprite(-1, new WidgetPointer(548,87)); + setWidgetSprite(-1, new WidgetPointer(548,88)); + setWidgetSprite(-1, new WidgetPointer(548,102)); + setWidgetSprite(-1, new WidgetPointer(548,89)); + setWidgetSprite(-1, new WidgetPointer(548,90)); + setWidgetSprite(-1, new WidgetPointer(548,103)); + setWidgetSprite(-1, new WidgetPointer(548,91)); + setWidgetSprite(-1, new WidgetPointer(548,92)); + setWidgetSprite(-1, new WidgetPointer(548,104)); + setWidgetSprite(-1, new WidgetPointer(548,93)); + setWidgetSprite(-1, new WidgetPointer(548,94)); + setWidgetSprite(-1, new WidgetPointer(548,105)); + setWidgetSprite(-1, new WidgetPointer(548,95)); + setWidgetSprite(-1, new WidgetPointer(548,96)); + setWidgetSprite(-1, new WidgetPointer(548,106)); + setWidgetSprite(-1, new WidgetPointer(548,97)); + setWidgetSprite(-1, new WidgetPointer(548,98)); + } + return; +} diff --git a/dumps/scripts/1313.cs2 b/dumps/scripts/1313.cs2 new file mode 100644 index 000000000..90d9e2eaa --- /dev/null +++ b/dumps/scripts/1313.cs2 @@ -0,0 +1,11 @@ +void script_1313() { + script_2654(); + setWidgetSprite(1207, new WidgetPointer(747,2)); + setWidgetPosition(25, 1, 0, 0, new WidgetPointer(747,3)); + setWidgetPosition(25, 1, 0, 0, new WidgetPointer(747,4)); + setWidgetPosition(3, 15, 0, 0, new WidgetPointer(747,5)); + setWidgetPosition(31, 7, 0, 0, new WidgetPointer(747,6)); + script_2303(); + script_1741(49152001); + return; +} diff --git a/dumps/scripts/1314.cs2 b/dumps/scripts/1314.cs2 new file mode 100644 index 000000000..4b540d076 --- /dev/null +++ b/dumps/scripts/1314.cs2 @@ -0,0 +1,92 @@ +int script_1314(int arg0) { + if (getDisplayMode() >= 2) { + switch (arg0) { + case 0: + return isWidgetHidden(new WidgetPointer(746,90)); + case 1: + return isWidgetHidden(new WidgetPointer(746,91)); + case 2: + return isWidgetHidden(new WidgetPointer(746,92)); + case 3: + return isWidgetHidden(new WidgetPointer(746,93)); + case 4: + return isWidgetHidden(new WidgetPointer(746,94)); + case 5: + return isWidgetHidden(new WidgetPointer(746,95)); + case 6: + return isWidgetHidden(new WidgetPointer(746,96)); + case 7: + return isWidgetHidden(new WidgetPointer(746,97)); + case 8: + return isWidgetHidden(new WidgetPointer(746,98)); + case 9: + return isWidgetHidden(new WidgetPointer(746,99)); + case 10: + return isWidgetHidden(new WidgetPointer(746,100)); + case 11: + return isWidgetHidden(new WidgetPointer(746,101)); + case 12: + return isWidgetHidden(new WidgetPointer(746,102)); + case 13: + return isWidgetHidden(new WidgetPointer(746,103)); + case 14: + return isWidgetHidden(new WidgetPointer(746,104)); + case 15: + return isWidgetHidden(new WidgetPointer(746,105)); + case 95: + return isWidgetHidden(new WidgetPointer(746,107)); + case 99: + return isWidgetHidden(new WidgetPointer(746,108)); + case 98: + if (isWidgetOpen(new WidgetPointer(746,88))) { + return isWidgetHidden(new WidgetPointer(746,88)); + } + return 1; + } + } else { + switch (arg0) { + case 0: + return isWidgetHidden(new WidgetPointer(548,204)); + case 1: + return isWidgetHidden(new WidgetPointer(548,205)); + case 2: + return isWidgetHidden(new WidgetPointer(548,206)); + case 3: + return isWidgetHidden(new WidgetPointer(548,207)); + case 4: + return isWidgetHidden(new WidgetPointer(548,208)); + case 5: + return isWidgetHidden(new WidgetPointer(548,209)); + case 6: + return isWidgetHidden(new WidgetPointer(548,210)); + case 7: + return isWidgetHidden(new WidgetPointer(548,211)); + case 8: + return isWidgetHidden(new WidgetPointer(548,212)); + case 9: + return isWidgetHidden(new WidgetPointer(548,213)); + case 10: + return isWidgetHidden(new WidgetPointer(548,214)); + case 11: + return isWidgetHidden(new WidgetPointer(548,215)); + case 12: + return isWidgetHidden(new WidgetPointer(548,216)); + case 13: + return isWidgetHidden(new WidgetPointer(548,217)); + case 14: + return isWidgetHidden(new WidgetPointer(548,218)); + case 15: + return isWidgetHidden(new WidgetPointer(548,219)); + case 95: + return isWidgetHidden(new WidgetPointer(548,221)); + case 99: + return isWidgetHidden(new WidgetPointer(548,222)); + case 98: + if (isWidgetOpen(new WidgetPointer(548,200))) { + return isWidgetHidden(new WidgetPointer(548,200)); + } + return 1; + } + } + return -1; +} diff --git a/dumps/scripts/1315.cs2 b/dumps/scripts/1315.cs2 new file mode 100644 index 000000000..71f401d23 --- /dev/null +++ b/dumps/scripts/1315.cs2 @@ -0,0 +1,9 @@ +void script_1315(int arg0) { + globalint_119 = standart_config_173; + setScriptCallOnConfigChange(1316, new WidgetPointer(arg0), 173, 1, "IY", new WidgetPointer(arg0)); + setScriptCallOnMouseOver(1533, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(2307, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnClickContextMenu(1534, new WidgetPointer(arg0), -2147483644, "Ii", new WidgetPointer(arg0)); + script_1741(arg0); + return; +} diff --git a/dumps/scripts/1316.cs2 b/dumps/scripts/1316.cs2 new file mode 100644 index 000000000..860c6a1eb --- /dev/null +++ b/dumps/scripts/1316.cs2 @@ -0,0 +1,5 @@ +void script_1316(int arg0) { + globalint_119 = standart_config_173; + script_1741(arg0); + return; +} diff --git a/dumps/scripts/1317.cs2 b/dumps/scripts/1317.cs2 new file mode 100644 index 000000000..cee4775e2 --- /dev/null +++ b/dumps/scripts/1317.cs2 @@ -0,0 +1,15 @@ +void script_1317() { + setWidgetModel(18789, new WidgetPointer(262,0)); + setWidgetModel(18813, new WidgetPointer(262,28)); + setWidgetModel(18814, new WidgetPointer(262,29)); + if (bitconfig_4835 < 1) { + setWidgetModel(-1, new WidgetPointer(262,29)); + } + if (bitconfig_4835 < 2) { + setWidgetModel(-1, new WidgetPointer(262,28)); + } + if (bitconfig_4835 < 3) { + setWidgetModel(-1, new WidgetPointer(262,0)); + } + return; +} diff --git a/dumps/scripts/1318.cs2 b/dumps/scripts/1318.cs2 new file mode 100644 index 000000000..386395290 --- /dev/null +++ b/dumps/scripts/1318.cs2 @@ -0,0 +1,54 @@ +void script_1318(int arg0) { + if (arg0 == 17170456) { + if (((boolean)globalint_163)) { + setWidgetModel(18796, new WidgetPointer(262,24)); + globalint_163 = 1; + } else { + setWidgetModel(18794, new WidgetPointer(262,24)); + globalint_163 = 0; + } + } else if (arg0 == 17170457) { + if (((boolean)globalint_164)) { + setWidgetModel(18796, new WidgetPointer(262,25)); + globalint_164 = 1; + } else { + setWidgetModel(18794, new WidgetPointer(262,25)); + globalint_164 = 0; + } + } else if (arg0 == 17170452) { + if (((boolean)globalint_162)) { + setWidgetModel(18796, new WidgetPointer(262,20)); + globalint_162 = 1; + } else { + setWidgetModel(18794, new WidgetPointer(262,20)); + globalint_162 = 0; + } + } else if (arg0 == 17170453) { + if (((boolean)globalint_165)) { + setWidgetModel(18792, new WidgetPointer(262,21)); + globalint_165 = 1; + } else { + setWidgetModel(18790, new WidgetPointer(262,21)); + globalint_165 = 0; + } + } else if (arg0 == 17170454) { + if (((boolean)globalint_166)) { + setWidgetModel(18792, new WidgetPointer(262,22)); + globalint_166 = 1; + } else { + setWidgetModel(18790, new WidgetPointer(262,22)); + globalint_166 = 0; + } + } else { + if (arg0 == 17170455) { + if (((boolean)globalint_167)) { + setWidgetModel(18792, new WidgetPointer(262,23)); + globalint_167 = 1; + } else { + setWidgetModel(18790, new WidgetPointer(262,23)); + globalint_167 = 0; + } + } + } + return; +} diff --git a/dumps/scripts/1319.cs2 b/dumps/scripts/1319.cs2 new file mode 100644 index 000000000..94531b0e5 --- /dev/null +++ b/dumps/scripts/1319.cs2 @@ -0,0 +1,45 @@ +void script_1319() { + if (((boolean)bitconfig_4834)) { + setWidgetModel(18796, new WidgetPointer(262,24)); + globalint_163 = 1; + } else { + setWidgetModel(18794, new WidgetPointer(262,24)); + globalint_163 = 0; + } + if (bitconfig_4834 == 2) { + setWidgetModel(18796, new WidgetPointer(262,25)); + globalint_164 = 1; + } else { + setWidgetModel(18794, new WidgetPointer(262,25)); + globalint_164 = 0; + } + if (bitconfig_4834 == 3) { + setWidgetModel(18796, new WidgetPointer(262,20)); + globalint_162 = 1; + } else { + setWidgetModel(18794, new WidgetPointer(262,20)); + globalint_162 = 0; + } + if (bitconfig_4834 == 4) { + setWidgetModel(18792, new WidgetPointer(262,21)); + globalint_165 = 1; + } else { + setWidgetModel(18790, new WidgetPointer(262,21)); + globalint_165 = 0; + } + if (bitconfig_4834 == 5) { + setWidgetModel(18792, new WidgetPointer(262,22)); + globalint_166 = 1; + } else { + setWidgetModel(18790, new WidgetPointer(262,22)); + globalint_166 = 0; + } + if (bitconfig_4834 == 6) { + setWidgetModel(18792, new WidgetPointer(262,23)); + globalint_167 = 1; + } else { + setWidgetModel(18790, new WidgetPointer(262,23)); + globalint_167 = 0; + } + return; +} diff --git a/dumps/scripts/132.cs2 b/dumps/scripts/132.cs2 new file mode 100644 index 000000000..b98f87292 --- /dev/null +++ b/dumps/scripts/132.cs2 @@ -0,0 +1,4 @@ +void script_132() { + setScriptCallOnKeyPress(73, -2147483640, false, "iz", new WidgetPointer(137,56)); + return; +} diff --git a/dumps/scripts/1320.cs2 b/dumps/scripts/1320.cs2 new file mode 100644 index 000000000..d629fb4c1 --- /dev/null +++ b/dumps/scripts/1320.cs2 @@ -0,0 +1,8 @@ +void script_1320(int arg0,int arg1) { + if (((boolean)arg1)) { + setWidgetSprite(181, new WidgetPointer(arg0)); + } else { + setWidgetSprite(180, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1321.cs2 b/dumps/scripts/1321.cs2 new file mode 100644 index 000000000..37be66cb5 --- /dev/null +++ b/dumps/scripts/1321.cs2 @@ -0,0 +1,8 @@ +void script_1321(int arg0,int arg1) { + if (((boolean)arg1)) { + setWidgetSprite(181, new WidgetPointer(arg0)); + } else { + setWidgetSprite(180, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1322.cs2 b/dumps/scripts/1322.cs2 new file mode 100644 index 000000000..0407427c9 --- /dev/null +++ b/dumps/scripts/1322.cs2 @@ -0,0 +1,24 @@ +void script_1322(int arg0,int arg1,int arg2) { + if (getItemIdInSlot(438, 0) != -1) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setItemOnWidgetMethod2205(getItemIdInSlot(438, 0), 1, new WidgetPointer(arg0)); + cs2method2305(new WidgetPointer(arg0), "" + getItemName(getItemIdInSlot(438, 0))); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + if (getItemIdInSlot(438, 1) != -1) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setItemOnWidgetMethod2205(getItemIdInSlot(438, 1), 1, new WidgetPointer(arg1)); + cs2method2305(new WidgetPointer(arg1), "" + getItemName(getItemIdInSlot(438, 1))); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + if (getItemIdInSlot(438, 2) != -1) { + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setItemOnWidgetMethod2205(getItemIdInSlot(438, 2), 1, new WidgetPointer(arg2)); + cs2method2305(new WidgetPointer(arg2), "" + getItemName(getItemIdInSlot(438, 2))); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/1323.cs2 b/dumps/scripts/1323.cs2 new file mode 100644 index 000000000..37481d044 --- /dev/null +++ b/dumps/scripts/1323.cs2 @@ -0,0 +1,31 @@ +void script_1323(int arg0,int arg1,int arg2,int arg3) { + if (getItemIdInSlot(439, 0) != -1) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setItemOnWidgetMethod2205(getItemIdInSlot(439, 0), 1, new WidgetPointer(arg0)); + cs2method2305(new WidgetPointer(arg0), "" + getItemName(getItemIdInSlot(439, 0))); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + if (getItemIdInSlot(439, 1) != -1) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setItemOnWidgetMethod2205(getItemIdInSlot(439, 1), 1, new WidgetPointer(arg1)); + cs2method2305(new WidgetPointer(arg1), "" + getItemName(getItemIdInSlot(439, 1))); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + if (getItemIdInSlot(439, 2) != -1) { + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setItemOnWidgetMethod2205(getItemIdInSlot(439, 2), 1, new WidgetPointer(arg2)); + cs2method2305(new WidgetPointer(arg2), "" + getItemName(getItemIdInSlot(439, 2))); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } + if (getItemIdInSlot(439, 3) != -1) { + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setItemOnWidgetMethod2205(getItemIdInSlot(439, 3), 1, new WidgetPointer(arg3)); + cs2method2305(new WidgetPointer(arg3), "" + getItemName(getItemIdInSlot(439, 3))); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg3)); + } + return; +} diff --git a/dumps/scripts/1324.cs2 b/dumps/scripts/1324.cs2 new file mode 100644 index 000000000..a4d3e6078 --- /dev/null +++ b/dumps/scripts/1324.cs2 @@ -0,0 +1,27 @@ +void script_1324(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetModel(cs2method_3408(105, 109, 1595, divide(bitconfig_2510, 10)), new WidgetPointer(arg0)); + setWidgetModel(cs2method_3408(105, 109, 1595, mod(bitconfig_2510, 10)), new WidgetPointer(arg1)); + setItemOnWidgetMethod2205(standart_config_849, 1, new WidgetPointer(arg5)); + if (((boolean)bitconfig_2539)) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(-1, new WidgetPointer(arg2)); + setWidgetModel(-1, new WidgetPointer(arg4)); + return; + } + if (bitconfig_2539 > bitconfig_2510) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(17221, new WidgetPointer(arg2)); + setWidgetModel(17217, new WidgetPointer(arg4)); + return; + } + if (bitconfig_2539 < bitconfig_2510) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(17220, new WidgetPointer(arg2)); + setWidgetModel(17218, new WidgetPointer(arg4)); + return; + } + setWidgetModel(17216, new WidgetPointer(arg3)); + setWidgetModel(-1, new WidgetPointer(arg2)); + setWidgetModel(-1, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/1325.cs2 b/dumps/scripts/1325.cs2 new file mode 100644 index 000000000..10667f9c5 --- /dev/null +++ b/dumps/scripts/1325.cs2 @@ -0,0 +1,27 @@ +void script_1325(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetModel(cs2method_3408(105, 109, 1595, divide(bitconfig_2511, 10)), new WidgetPointer(arg0)); + setWidgetModel(cs2method_3408(105, 109, 1595, mod(bitconfig_2511, 10)), new WidgetPointer(arg1)); + setItemOnWidgetMethod2205(standart_config_850, 1, new WidgetPointer(arg5)); + if (((boolean)bitconfig_2540)) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(-1, new WidgetPointer(arg2)); + setWidgetModel(-1, new WidgetPointer(arg4)); + return; + } + if (bitconfig_2540 > bitconfig_2511) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(17221, new WidgetPointer(arg2)); + setWidgetModel(17217, new WidgetPointer(arg4)); + return; + } + if (bitconfig_2540 < bitconfig_2511) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(17220, new WidgetPointer(arg2)); + setWidgetModel(17218, new WidgetPointer(arg4)); + return; + } + setWidgetModel(17216, new WidgetPointer(arg3)); + setWidgetModel(-1, new WidgetPointer(arg2)); + setWidgetModel(-1, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/1326.cs2 b/dumps/scripts/1326.cs2 new file mode 100644 index 000000000..2d44ff0b8 --- /dev/null +++ b/dumps/scripts/1326.cs2 @@ -0,0 +1,28 @@ +void script_1326(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + setWidgetModel(cs2method_3408(105, 109, 1595, divide(bitconfig_2512, 10)), new WidgetPointer(arg0)); + setWidgetModel(cs2method_3408(105, 109, 1595, mod(bitconfig_2512, 10)), new WidgetPointer(arg1)); + setItemOnWidgetMethod2205(standart_config_851, 1, new WidgetPointer(arg5)); + setItemOnWidgetMethod2205(standart_config_852, 1, new WidgetPointer(arg6)); + if (((boolean)bitconfig_2541)) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(-1, new WidgetPointer(arg2)); + setWidgetModel(-1, new WidgetPointer(arg4)); + return; + } + if (bitconfig_2541 > bitconfig_2512) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(17221, new WidgetPointer(arg2)); + setWidgetModel(17217, new WidgetPointer(arg4)); + return; + } + if (bitconfig_2541 < bitconfig_2512) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(17220, new WidgetPointer(arg2)); + setWidgetModel(17218, new WidgetPointer(arg4)); + return; + } + setWidgetModel(17216, new WidgetPointer(arg3)); + setWidgetModel(-1, new WidgetPointer(arg2)); + setWidgetModel(-1, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/1327.cs2 b/dumps/scripts/1327.cs2 new file mode 100644 index 000000000..2eafcfa91 --- /dev/null +++ b/dumps/scripts/1327.cs2 @@ -0,0 +1,29 @@ +void script_1327(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + setWidgetModel(cs2method_3408(105, 109, 1595, divide(bitconfig_2513, 10)), new WidgetPointer(arg0)); + setWidgetModel(cs2method_3408(105, 109, 1595, mod(bitconfig_2513, 10)), new WidgetPointer(arg1)); + setItemOnWidgetMethod2205(standart_config_853, 1, new WidgetPointer(arg5)); + setItemOnWidgetMethod2205(standart_config_854, 1, new WidgetPointer(arg6)); + setItemOnWidgetMethod2205(standart_config_855, 1, new WidgetPointer(arg7)); + if (((boolean)bitconfig_2542)) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(-1, new WidgetPointer(arg2)); + setWidgetModel(-1, new WidgetPointer(arg4)); + return; + } + if (bitconfig_2542 > bitconfig_2513) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(17221, new WidgetPointer(arg2)); + setWidgetModel(17217, new WidgetPointer(arg4)); + return; + } + if (bitconfig_2542 < bitconfig_2513) { + setWidgetModel(17219, new WidgetPointer(arg3)); + setWidgetModel(17220, new WidgetPointer(arg2)); + setWidgetModel(17218, new WidgetPointer(arg4)); + return; + } + setWidgetModel(17216, new WidgetPointer(arg3)); + setWidgetModel(-1, new WidgetPointer(arg2)); + setWidgetModel(-1, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/1328.cs2 b/dumps/scripts/1328.cs2 new file mode 100644 index 000000000..797ff8f79 --- /dev/null +++ b/dumps/scripts/1328.cs2 @@ -0,0 +1,107 @@ +void script_1328(int arg0) { + int ivar1; + int ivar2; + string svar0; + string svar1; + int stack_dump0; + previousAndCurrentName(0,2,0) structdump_1; + if ((((((isWidgetHidden(new WidgetPointer(906,41)) || isWidgetHidden(new WidgetPointer(906,42))) || isWidgetHidden(new WidgetPointer(906,43))) || isWidgetHidden(new WidgetPointer(906,29))) || isWidgetHidden(new WidgetPointer(906,45))) || isWidgetHidden(new WidgetPointer(906,55))) || isWidgetHidden(new WidgetPointer(906,56))) { + return; + } + ivar1 = -1; + if (arg0 == 80) { + if (isWidgetHidden(new WidgetPointer(906,185))) { + ivar1 = 0; + } + if (isWidgetHidden(new WidgetPointer(906,186))) { + ivar1 = 1; + } + if (isWidgetHidden(new WidgetPointer(906,187))) { + ivar1 = 2; + } + if (isWidgetHidden(new WidgetPointer(906,188))) { + ivar1 = 3; + } + if (isWidgetHidden(new WidgetPointer(906,189))) { + ivar1 = 5; + } + if (isWidgetHidden(new WidgetPointer(906,190))) { + ivar1 = 4; + } + if (isHoldingCtrl()) { + switch (ivar1) { + case 0: + script_3060(1); + return; + case 1: + script_3060(2); + return; + case 2: + script_3060(3); + return; + case 3: + script_3060(5); + return; + case 5: + script_3060(4); + return; + case 4: + script_3060(0); + return; + } + script_3060(0); + return; + } + switch (ivar1) { + case 0: + script_3060(4); + return; + case 1: + script_3060(0); + return; + case 2: + script_3060(1); + return; + case 3: + script_3060(2); + return; + case 5: + script_3060(3); + return; + case 4: + script_3060(5); + return; + } + script_3060(0); + return; + } + ivar2 = 0; + svar0 = ""; + svar1 = ""; + if ((arg0 == 84) && isWidgetHidden(new WidgetPointer(906,187))) { + if (strLength(globalstring_276) > 0) { + ivar2 = cs2method3628(globalstring_276); + if ((ivar2 != -1) && cs2method6900()) { + stack_dump0 = ivar2; + structdump_1 = getFriendName(stack_dump0); + svar1 = structdump_1.stringpart_1; + svar0 = structdump_1.stringpart_0; + script_3015(0, "Send message to " + svar0, "", globalstring_276, ""); + return; + } + if (globalint_1271 > subtract(getClientCycle(), 100)) { + return; + } + messageType0("That player is not on your Friends list."); + globalint_1271 = getClientCycle(); + return; + } + if (globalint_1271 > subtract(getClientCycle(), 100)) { + return; + } + messageType0("You haven't received any messages to which you can reply."); + globalint_1271 = getClientCycle(); + return; + } + return; +} diff --git a/dumps/scripts/1329.cs2 b/dumps/scripts/1329.cs2 new file mode 100644 index 000000000..bb22c2592 --- /dev/null +++ b/dumps/scripts/1329.cs2 @@ -0,0 +1,14 @@ +void script_1329() { + if (script_1305() == 6) { + if (((boolean)bitconfig_6522)) { + setWidgetText(new WidgetPointer(894,7), "Click the flashing Prayer icon to activate the Thick Skin prayer. This prayer increases your Defence by 5%, which can be seen if you hover your mouse over the flashing Prayer icon."); + setWidgetText(new WidgetPointer(894,6), ""); + setWidgetSprite(115, new WidgetPointer(894,4)); + } + } else { + setWidgetText(new WidgetPointer(894,7), "Click on the stone with the Prayer icon to open the Prayer side interface."); + setWidgetText(new WidgetPointer(894,6), ""); + setWidgetSprite(1823, new WidgetPointer(894,4)); + } + return; +} diff --git a/dumps/scripts/133.cs2 b/dumps/scripts/133.cs2 new file mode 100644 index 000000000..7e26ed4e5 --- /dev/null +++ b/dumps/scripts/133.cs2 @@ -0,0 +1,6 @@ +int script_133(int arg0,int arg1,int arg2) { + if ((((extractX(arg2) >= min(extractX(arg0), extractX(arg1))) && (extractY(arg2) >= min(extractY(arg0), extractY(arg1)))) && ((extractZ(arg2) >= min(extractZ(arg0), extractZ(arg1))) && (extractX(arg2) <= max(extractX(arg0), extractX(arg1))))) && ((extractY(arg2) <= max(extractY(arg0), extractY(arg1))) && (extractZ(arg2) <= max(extractZ(arg0), extractZ(arg1))))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/1330.cs2 b/dumps/scripts/1330.cs2 new file mode 100644 index 000000000..0b5e41eb2 --- /dev/null +++ b/dumps/scripts/1330.cs2 @@ -0,0 +1,5 @@ +void script_1330() { + setScriptCallOnGameloop(1332, "", new WidgetPointer(894,5)); + setWidgetIsHidden(false, new WidgetPointer(894,7)); + return; +} diff --git a/dumps/scripts/1331.cs2 b/dumps/scripts/1331.cs2 new file mode 100644 index 000000000..a6336fcae --- /dev/null +++ b/dumps/scripts/1331.cs2 @@ -0,0 +1,6 @@ +void script_1331() { + setScriptCallOnGameloop(-1, "", new WidgetPointer(894,5)); + setWidgetIsHidden(true, new WidgetPointer(894,7)); + setWidgetSprite(-1, new WidgetPointer(894,4)); + return; +} diff --git a/dumps/scripts/1332.cs2 b/dumps/scripts/1332.cs2 new file mode 100644 index 000000000..f8efa4f81 --- /dev/null +++ b/dumps/scripts/1332.cs2 @@ -0,0 +1,16 @@ +void script_1332() { + if (((boolean)bitconfig_275)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(894,5)); + setWidgetIsHidden(true, new WidgetPointer(894,7)); + setWidgetSprite(-1, new WidgetPointer(894,4)); + } else if (script_1305() == 7) { + setWidgetText(new WidgetPointer(894,7), "To set Wind Rush to auto-cast, click on the flashing spell icon. You can hover over spell icons to read a brief description of the spell and the runes required to cast it."); + setWidgetText(new WidgetPointer(894,6), ""); + setWidgetSprite(3759, new WidgetPointer(894,4)); + } else { + setWidgetText(new WidgetPointer(894,7), "Click on the Magic icon to open your magic spellbook."); + setWidgetText(new WidgetPointer(894,6), ""); + setWidgetSprite(1824, new WidgetPointer(894,4)); + } + return; +} diff --git a/dumps/scripts/1333.cs2 b/dumps/scripts/1333.cs2 new file mode 100644 index 000000000..fb9d18c62 --- /dev/null +++ b/dumps/scripts/1333.cs2 @@ -0,0 +1,4 @@ +void script_1333(int arg0,int arg1,string arg2) { + script_1334(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1334.cs2 b/dumps/scripts/1334.cs2 new file mode 100644 index 000000000..ff183496e --- /dev/null +++ b/dumps/scripts/1334.cs2 @@ -0,0 +1,12 @@ +void script_1334(int arg0,int arg1,string arg2) { + if (arg0 != -1) { + if (((boolean)arg1)) { + setWidgetText(new WidgetPointer(arg0), "" + arg2 + ""); + setWidgetRGB(new Color(145, 177, 244), new WidgetPointer(arg0)); + } else { + setWidgetText(new WidgetPointer(arg0), "" + arg2 + ""); + setWidgetRGB(new Color(44, 111, 248), new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/1335.cs2 b/dumps/scripts/1335.cs2 new file mode 100644 index 000000000..4c76088ba --- /dev/null +++ b/dumps/scripts/1335.cs2 @@ -0,0 +1,5 @@ +void script_1335(int arg0,int arg1,int arg2) { + globalint_1098 = script_1401(arg0, 494, getWidgetActualX(new WidgetPointer(arg1)), globalstring_278); + script_1390(arg1, arg2, globalstring_278); + return; +} diff --git a/dumps/scripts/1336.cs2 b/dumps/scripts/1336.cs2 new file mode 100644 index 000000000..2bce8d948 --- /dev/null +++ b/dumps/scripts/1336.cs2 @@ -0,0 +1,5 @@ +void script_1336() { + setWidgetScrollMax(400, 1810, new WidgetPointer(156,2)); + script_31(10223617, 10223618, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/1337.cs2 b/dumps/scripts/1337.cs2 new file mode 100644 index 000000000..94c1fc186 --- /dev/null +++ b/dumps/scripts/1337.cs2 @@ -0,0 +1,11 @@ +void script_1337() { + script_2654(); + setWidgetSprite(1206, new WidgetPointer(747,2)); + setWidgetPosition(1, 1, 0, 0, new WidgetPointer(747,3)); + setWidgetPosition(1, 1, 0, 0, new WidgetPointer(747,4)); + setWidgetPosition(31, 15, 0, 0, new WidgetPointer(747,5)); + setWidgetPosition(7, 7, 0, 0, new WidgetPointer(747,6)); + script_2303(); + script_1741(49152001); + return; +} diff --git a/dumps/scripts/1338.cs2 b/dumps/scripts/1338.cs2 new file mode 100644 index 000000000..4f3dac8b6 --- /dev/null +++ b/dumps/scripts/1338.cs2 @@ -0,0 +1,4 @@ +void script_1338(int arg0,string arg1,string arg2) { + cs2method5400(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1339.cs2 b/dumps/scripts/1339.cs2 new file mode 100644 index 000000000..0ed669a1f --- /dev/null +++ b/dumps/scripts/1339.cs2 @@ -0,0 +1,4 @@ +void script_1339(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + script_1346(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 897, 788, 788, 1040, 16777215, 16776960, 494, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/134.cs2 b/dumps/scripts/134.cs2 new file mode 100644 index 000000000..c614ee72b --- /dev/null +++ b/dumps/scripts/134.cs2 @@ -0,0 +1,26 @@ +void script_134() { + if ((getBlackmarks() == 5) || (getBlackmarks() == 6)) { + setWidgetText(new WidgetPointer(594,83), "Suggest to mute this player for 48 hours"); + setWidgetText(new WidgetPointer(594,10), "Suggest to mute this player for 48 hours"); + setWidgetText(new WidgetPointer(594,60), "Suggest to mute this player for 48 hours"); + } else { + setWidgetText(new WidgetPointer(594,83), "Mute this player for 48 hours"); + setWidgetText(new WidgetPointer(594,10), "Mute this player for 48 hours"); + setWidgetText(new WidgetPointer(594,60), "Mute this player for 48 hours"); + } + if (((boolean)globalint_6)) { + globalint_6 = 0; + } else { + globalint_6 = 1; + } + if (((boolean)globalint_6)) { + setWidgetSprite(1768, new WidgetPointer(594,82)); + setWidgetSprite(1768, new WidgetPointer(594,9)); + setWidgetSprite(1768, new WidgetPointer(594,59)); + } else { + setWidgetSprite(1770, new WidgetPointer(594,82)); + setWidgetSprite(1770, new WidgetPointer(594,9)); + setWidgetSprite(1770, new WidgetPointer(594,59)); + } + return; +} diff --git a/dumps/scripts/1340.cs2 b/dumps/scripts/1340.cs2 new file mode 100644 index 000000000..cdea78b09 --- /dev/null +++ b/dumps/scripts/1340.cs2 @@ -0,0 +1,4 @@ +void script_1340(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12) { + script_1346(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg8, arg9, arg10, arg11, arg12, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/1341.cs2 b/dumps/scripts/1341.cs2 new file mode 100644 index 000000000..08e73f1a3 --- /dev/null +++ b/dumps/scripts/1341.cs2 @@ -0,0 +1,4 @@ +void script_1341(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18) { + script_1346(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); + return; +} diff --git a/dumps/scripts/1342.cs2 b/dumps/scripts/1342.cs2 new file mode 100644 index 000000000..d17d773a0 --- /dev/null +++ b/dumps/scripts/1342.cs2 @@ -0,0 +1,4 @@ +void script_1342(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_1346(arg0, 0, arg1, arg2, arg3, arg4, arg5, 897, 788, 788, 1040, 16777215, 16776960, 494, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/1343.cs2 b/dumps/scripts/1343.cs2 new file mode 100644 index 000000000..e3b557526 --- /dev/null +++ b/dumps/scripts/1343.cs2 @@ -0,0 +1,4 @@ +void script_1343(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11) { + script_1346(arg0, 0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg7, arg8, arg9, arg10, arg11, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/1344.cs2 b/dumps/scripts/1344.cs2 new file mode 100644 index 000000000..91051e45d --- /dev/null +++ b/dumps/scripts/1344.cs2 @@ -0,0 +1,4 @@ +void script_1344(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17) { + script_1346(arg0, 0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17); + return; +} diff --git a/dumps/scripts/1345.cs2 b/dumps/scripts/1345.cs2 new file mode 100644 index 000000000..203ba0825 --- /dev/null +++ b/dumps/scripts/1345.cs2 @@ -0,0 +1,5 @@ +int script_1345(int arg0,int arg1) { + int ivar2; + ivar2 = divide(add(arg0, cs2method2601(new WidgetPointer(arg1))), 15); + return ivar2; +} diff --git a/dumps/scripts/1346.cs2 b/dumps/scripts/1346.cs2 new file mode 100644 index 000000000..8bbf4d444 --- /dev/null +++ b/dumps/scripts/1346.cs2 @@ -0,0 +1,4 @@ +void script_1346(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19) { + script_1436(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); + return; +} diff --git a/dumps/scripts/1347.cs2 b/dumps/scripts/1347.cs2 new file mode 100644 index 000000000..3db3f04ad --- /dev/null +++ b/dumps/scripts/1347.cs2 @@ -0,0 +1,9 @@ +void script_1347(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18) { + if (isWidgetHidden(new WidgetPointer(arg2))) { + cs2method2100(0, 0, new WidgetPointer(arg4)); + script_1348(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); + } else { + script_1349(arg6, arg2, arg4, arg5, arg12); + } + return; +} diff --git a/dumps/scripts/1348.cs2 b/dumps/scripts/1348.cs2 new file mode 100644 index 000000000..083931745 --- /dev/null +++ b/dumps/scripts/1348.cs2 @@ -0,0 +1,50 @@ +void script_1348(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18) { + int ivar19; + int ivar20; + string svar0; + if (setWidgetRegister(new WidgetPointer(arg6), arg12)) { + setWidgetVFlip(1); + } + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetSprite(arg3); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg2), 3, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(arg4)), multiply(arg1, 15), new WidgetPointer(arg4)); + ivar19 = 0; + ivar20 = -1; + svar0 = ""; + while (ivar19 <= arg1) { + ivar20 = getExtraChildGap(new WidgetPointer(arg4)); + svar0 = cs2method_3408(105, 115, arg0, ivar19); + createExtraChild(new WidgetPointer(arg4), 4, ivar20); + setWidgetText(svar0); + setWidgetTextAlignment(0, 1, 0); + setWidgetPosition(5, multiply(ivar19, 15), 0, 0); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg4)), 16), 15, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(arg10); + if (ivar19 >= arg1) { + setWidgetRGB(new Color(arg8)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg4), ivar20, arg8, "Iii"); + setScriptCallOnMousePressed(1350, new WidgetPointer(arg2), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), arg11, arg12, svar0, arg8, "IIIIiisi"); + } else { + setWidgetRGB(new Color(arg7)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg4), ivar20, arg7, "Iii"); + setScriptCallOnMousePressed(1350, new WidgetPointer(arg2), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), arg11, arg12, svar0, arg7, "IIIIiisi"); + } + setScriptCallOnMouseEntered(1353, new WidgetPointer(arg4), ivar20, arg9, "Iii"); + ivar19 = add(ivar19, 1); + } + if (arg5 != -1) { + script_31(arg5, arg4, arg13, arg14, arg15, arg16, arg17, arg18); + setWidgetIsHidden(false, new WidgetPointer(arg5)); + } + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/1349.cs2 b/dumps/scripts/1349.cs2 new file mode 100644 index 000000000..b6c34515a --- /dev/null +++ b/dumps/scripts/1349.cs2 @@ -0,0 +1,16 @@ +void script_1349(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (setWidgetRegister(new WidgetPointer(arg0), arg4)) { + setWidgetVFlip(0); + } + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + if (arg3 != -1) { + setWidgetIsHidden(true, new WidgetPointer(arg3)); + } + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + if (arg3 != -1) { + deleteAllExtraChilds(new WidgetPointer(arg3)); + } + return; +} diff --git a/dumps/scripts/135.cs2 b/dumps/scripts/135.cs2 new file mode 100644 index 000000000..95deddf7d --- /dev/null +++ b/dumps/scripts/135.cs2 @@ -0,0 +1,17 @@ +void script_135(int arg0) { + int ivar1; + ivar1 = -1; + if (strLength(globalstring_24) > 0) { + cs2method5002(arg0, globalint_6, globalstring_24, ""); + } + if (((boolean)stringMethod4107(globalstring_24, cs2method5015()))) { + script_675(); + return; + } + if (cs2method3623(globalstring_24) && (stringMethod4107(globalstring_24, cs2method5015()) != 0)) { + script_221(); + } else { + script_675(); + } + return; +} diff --git a/dumps/scripts/1350.cs2 b/dumps/scripts/1350.cs2 new file mode 100644 index 000000000..2e9dadf86 --- /dev/null +++ b/dumps/scripts/1350.cs2 @@ -0,0 +1,9 @@ +void script_1350(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,string arg7) { + if (setWidgetRegister(new WidgetPointer(arg3), arg4)) { + setWidgetText(arg7); + setWidgetRGB(new Color(arg6)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg3), arg4, arg6, "Iii"); + } + script_1349(arg3, arg0, arg1, arg2, arg5); + return; +} diff --git a/dumps/scripts/1351.cs2 b/dumps/scripts/1351.cs2 new file mode 100644 index 000000000..92abce8ed --- /dev/null +++ b/dumps/scripts/1351.cs2 @@ -0,0 +1,6 @@ +void script_1351(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(arg2); + } + return; +} diff --git a/dumps/scripts/1352.cs2 b/dumps/scripts/1352.cs2 new file mode 100644 index 000000000..e3b14fa4a --- /dev/null +++ b/dumps/scripts/1352.cs2 @@ -0,0 +1,6 @@ +void script_1352(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(arg2); + } + return; +} diff --git a/dumps/scripts/1353.cs2 b/dumps/scripts/1353.cs2 new file mode 100644 index 000000000..edc53c5ab --- /dev/null +++ b/dumps/scripts/1353.cs2 @@ -0,0 +1,6 @@ +void script_1353(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetRGB(new Color(arg2)); + } + return; +} diff --git a/dumps/scripts/1354.cs2 b/dumps/scripts/1354.cs2 new file mode 100644 index 000000000..3a57f065e --- /dev/null +++ b/dumps/scripts/1354.cs2 @@ -0,0 +1,6 @@ +void script_1354(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetRGB(new Color(arg2)); + } + return; +} diff --git a/dumps/scripts/1355.cs2 b/dumps/scripts/1355.cs2 new file mode 100644 index 000000000..a8d0beac1 --- /dev/null +++ b/dumps/scripts/1355.cs2 @@ -0,0 +1,26 @@ +void script_1355(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,string arg7) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + if (arg3 != -1) { + setWidgetIsHidden(true, new WidgetPointer(arg3)); + } + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0); + setWidgetSprite(arg4); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 3, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetText(arg7); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(arg6); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(arg5)); + return; +} diff --git a/dumps/scripts/1356.cs2 b/dumps/scripts/1356.cs2 new file mode 100644 index 000000000..723b79776 --- /dev/null +++ b/dumps/scripts/1356.cs2 @@ -0,0 +1,6 @@ +void script_1356(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetRGB(new Color(arg2)); + } + return; +} diff --git a/dumps/scripts/1357.cs2 b/dumps/scripts/1357.cs2 new file mode 100644 index 000000000..64b1355f2 --- /dev/null +++ b/dumps/scripts/1357.cs2 @@ -0,0 +1,4 @@ +void script_1357(int arg0,int arg1) { + cs2method2103(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1358.cs2 b/dumps/scripts/1358.cs2 new file mode 100644 index 000000000..13b0d4567 --- /dev/null +++ b/dumps/scripts/1358.cs2 @@ -0,0 +1,6 @@ +void script_1358(int arg0,int arg1) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + globalint_2 = 0; + script_680(arg1); + return; +} diff --git a/dumps/scripts/1359.cs2 b/dumps/scripts/1359.cs2 new file mode 100644 index 000000000..ddb6f8d59 --- /dev/null +++ b/dumps/scripts/1359.cs2 @@ -0,0 +1,16 @@ +void script_1359(int arg0) { + if ((globalint_1024 == bitconfig_6521) && (globalint_1024 != 0)) { + if ((arg0 == 12582937) || (arg0 == 12583010)) { + if (globalint_1024 == 28) { + setScriptCallOnGameloop(1427, new WidgetPointer(arg0), "I", new WidgetPointer(192,98)); + } else { + setScriptCallOnGameloop(1427, new WidgetPointer(arg0), "I", new WidgetPointer(192,25)); + } + } else { + setScriptCallOnGameloop(1427, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/136.cs2 b/dumps/scripts/136.cs2 new file mode 100644 index 000000000..1f6e0b548 --- /dev/null +++ b/dumps/scripts/136.cs2 @@ -0,0 +1,24 @@ +void script_136(int arg0) { + string svar0; + svar0 = ""; + if (arg0 == 40173583) { + svar0 = getItemName(standart_config_1068); + if (standart_config_1068 == -1) { + svar0 = "Empty"; + } + } else if (arg0 == 40173584) { + svar0 = getItemName(standart_config_1069); + if (standart_config_1069 == -1) { + svar0 = "Empty"; + } + } else { + if (arg0 == 40173585) { + svar0 = getItemName(standart_config_1070); + if (standart_config_1070 == -1) { + svar0 = "Empty"; + } + } + } + script_39(arg0, 40173591, 25, 199, svar0); + return; +} diff --git a/dumps/scripts/1360.cs2 b/dumps/scripts/1360.cs2 new file mode 100644 index 000000000..bdff81343 --- /dev/null +++ b/dumps/scripts/1360.cs2 @@ -0,0 +1,30 @@ +void script_1360(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + createExtraChild(new WidgetPointer(arg0), 3, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(ivar1, ivar2, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(48, 32, 28)); + cs2method2103(200); + script_98(arg0, 1, 921, 0, 0, 9, 9); + script_98(arg0, 2, 922, ivar3, 0, 9, 9); + script_98(arg0, 3, 923, 0, ivar4, 9, 9); + script_98(arg0, 4, 924, ivar3, ivar4, 9, 9); + script_98(arg0, 5, 925, 0, 9, 9, ivar6); + script_98(arg0, 6, 926, 9, 0, ivar5, 9); + script_98(arg0, 7, 927, ivar3, 9, 9, ivar6); + script_98(arg0, 8, 928, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/1361.cs2 b/dumps/scripts/1361.cs2 new file mode 100644 index 000000000..2e2d64810 --- /dev/null +++ b/dumps/scripts/1361.cs2 @@ -0,0 +1,25 @@ +void script_1361(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + script_98(arg0, 0, 897, 0, 0, ivar1, ivar2); + script_98(arg0, 1, 921, 0, 0, 9, 9); + script_98(arg0, 2, 922, ivar3, 0, 9, 9); + script_98(arg0, 3, 923, 0, ivar4, 9, 9); + script_98(arg0, 4, 924, ivar3, ivar4, 9, 9); + script_98(arg0, 5, 925, 0, 9, 9, ivar6); + script_98(arg0, 6, 926, 9, 0, ivar5, 9); + script_98(arg0, 7, 927, ivar3, 9, 9, ivar6); + script_98(arg0, 8, 928, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/1362.cs2 b/dumps/scripts/1362.cs2 new file mode 100644 index 000000000..dc7f00f26 --- /dev/null +++ b/dumps/scripts/1362.cs2 @@ -0,0 +1,64 @@ +void script_1362() { + int ivar0; + ivar0 = 0; + setScriptCallOnKeyPress(73, -2147483640, false, "iz", new WidgetPointer(137,56)); + setScriptCallOnMessage(81, 1, "1", new WidgetPointer(751,0)); + setScriptCallOnClanListChange(81, 1, "1", new WidgetPointer(751,0)); + setScriptCallOnFriendListChange(81, 0, "1", new WidgetPointer(751,0)); + setScriptCallOnGeneralDataChange(82, "", new WidgetPointer(751,0)); + setScriptCallOnGlobalStringChange(710, 0, 1, "Y", new WidgetPointer(751,0)); + globalstring_1 = ""; + globalint_1028 = 0; + globalint_42 = -1; + globalint_41 = 0; + globalint_43 = cs2method5017(); + globalint_3 = -1; + globalint_4 = 0; + globalstring_2 = ""; + globalstring_3 = ""; + globalstring_4 = ""; + globalstring_5 = ""; + globalstring_6 = ""; + globalstring_7 = ""; + globalstring_8 = ""; + globalstring_9 = ""; + globalstring_10 = ""; + globalstring_11 = ""; + globalstring_12 = ""; + globalstring_13 = ""; + globalstring_14 = ""; + globalstring_15 = ""; + globalstring_16 = ""; + globalstring_17 = ""; + globalstring_18 = ""; + globalstring_19 = ""; + globalstring_20 = ""; + globalstring_21 = ""; + globalstring_276 = ""; + script_1558(1); + setWidgetIsHidden(false, new WidgetPointer(137,56)); + if (getDisplayMode() >= 2) { + setWidgetIsHidden(true, new WidgetPointer(752,2)); + setWidgetSprite(1247, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(137,51)); + setWidgetIsHidden(false, new WidgetPointer(137,52)); + setWidgetIsHidden(false, new WidgetPointer(137,53)); + setWidgetUnknownBoolean(true, new WidgetPointer(137,56)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(137,56)); + } else { + setWidgetSprite(1017, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + setWidgetIsHidden(false, new WidgetPointer(137,51)); + setWidgetIsHidden(true, new WidgetPointer(137,52)); + setWidgetIsHidden(true, new WidgetPointer(137,53)); + setWidgetUnknownBoolean(false, new WidgetPointer(137,56)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(137,56)); + } + globalint_7 = getWidgetActualHeight(new WidgetPointer(137,58)); + script_178(); + globalstring_0 = ""; + return; +} diff --git a/dumps/scripts/1363.cs2 b/dumps/scripts/1363.cs2 new file mode 100644 index 000000000..84d0ea503 --- /dev/null +++ b/dumps/scripts/1363.cs2 @@ -0,0 +1,30 @@ +void script_1363(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + createExtraChild(new WidgetPointer(arg0), 3, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(ivar1, ivar2, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 255)); + cs2method2103(240); + script_98(arg0, 1, 929, 0, 0, 9, 9); + script_98(arg0, 2, 930, ivar3, 0, 9, 9); + script_98(arg0, 3, 931, 0, ivar4, 9, 9); + script_98(arg0, 4, 932, ivar3, ivar4, 9, 9); + script_98(arg0, 5, 933, 0, 9, 9, ivar6); + script_98(arg0, 6, 934, 9, 0, ivar5, 9); + script_98(arg0, 7, 935, ivar3, 9, 9, ivar6); + script_98(arg0, 8, 936, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/1364.cs2 b/dumps/scripts/1364.cs2 new file mode 100644 index 000000000..d404b1d56 --- /dev/null +++ b/dumps/scripts/1364.cs2 @@ -0,0 +1,359 @@ +void script_1364() { + int ivar0; + ivar0 = 0; + if (getDisplayMode() >= 2) { + flow_1: + if (isWidgetHidden(new WidgetPointer(752,8)) && (isWidgetHidden(new WidgetPointer(752,3)) || isWidgetHidden(new WidgetPointer(752,7)))) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + setWidgetSprite(1017, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + cs2method2122(0, 49283073); + } else if (isWidgetOpen(new WidgetPointer(752,13))) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + setWidgetIsHidden(false, new WidgetPointer(752,13)); + setWidgetIsHidden(true, new WidgetPointer(752,12)); + setWidgetIsHidden(true, new WidgetPointer(752,11)); + setWidgetIsHidden(true, new WidgetPointer(752,10)); + setWidgetIsHidden(true, new WidgetPointer(752,9)); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + if (((boolean)bitconfig_542)) { + setWidgetSprite(1204, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } else { + setWidgetSprite(1205, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(752,2)); + } + } else if (isWidgetOpen(new WidgetPointer(752,12))) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + setWidgetIsHidden(true, new WidgetPointer(752,13)); + setWidgetIsHidden(false, new WidgetPointer(752,12)); + setWidgetIsHidden(true, new WidgetPointer(752,11)); + setWidgetIsHidden(true, new WidgetPointer(752,10)); + setWidgetIsHidden(true, new WidgetPointer(752,9)); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + if (((boolean)bitconfig_542)) { + setWidgetSprite(1204, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } else { + setWidgetSprite(1205, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(752,2)); + } + } else if (isWidgetOpen(new WidgetPointer(752,11))) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + setWidgetIsHidden(true, new WidgetPointer(752,13)); + setWidgetIsHidden(true, new WidgetPointer(752,12)); + setWidgetIsHidden(false, new WidgetPointer(752,11)); + setWidgetIsHidden(true, new WidgetPointer(752,10)); + setWidgetIsHidden(true, new WidgetPointer(752,9)); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + if (((boolean)bitconfig_542)) { + setWidgetSprite(1204, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } else { + setWidgetSprite(1205, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(752,2)); + } + } else if (isWidgetOpen(new WidgetPointer(752,10))) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + setWidgetIsHidden(true, new WidgetPointer(752,13)); + setWidgetIsHidden(true, new WidgetPointer(752,12)); + setWidgetIsHidden(true, new WidgetPointer(752,11)); + setWidgetIsHidden(false, new WidgetPointer(752,10)); + setWidgetIsHidden(true, new WidgetPointer(752,9)); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + if (((boolean)bitconfig_542)) { + setWidgetSprite(1204, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } else { + setWidgetSprite(1205, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(752,2)); + } + } else { + if (isWidgetOpen(new WidgetPointer(752,9))) { + if (globalint_41 == -1) { + setWidgetIsHidden(true, new WidgetPointer(746,73)); + setWidgetIsHidden(true, new WidgetPointer(746,75)); + } else { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + setWidgetIsHidden(false, new WidgetPointer(746,75)); + } + setWidgetIsHidden(true, new WidgetPointer(752,13)); + setWidgetIsHidden(true, new WidgetPointer(752,12)); + setWidgetIsHidden(true, new WidgetPointer(752,11)); + setWidgetIsHidden(true, new WidgetPointer(752,10)); + setWidgetIsHidden(false, new WidgetPointer(752,9)); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + if (isWidgetHidden(new WidgetPointer(137,0))) { + setWidgetSprite(1017, new WidgetPointer(752,1)); + cs2method2122(0, 49283073); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + } else { + setWidgetIsHidden(true, new WidgetPointer(752,2)); + setWidgetSprite(1247, new WidgetPointer(752,1)); + cs2method2122(1, 49283073); + cs2method2107(0, new WidgetPointer(752,1)); + setWidgetIsHidden(true, new WidgetPointer(137,51)); + setWidgetIsHidden(false, new WidgetPointer(137,52)); + setWidgetIsHidden(false, new WidgetPointer(137,53)); + script_1301(8978491, 8978490); + setWidgetUnknownBoolean(true, new WidgetPointer(137,56)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(137,56)); + script_1558(0); + script_84(); + } + } + } + if (isWidgetOpen(new WidgetPointer(746,87))) { + setWidgetIsHidden(true, new WidgetPointer(746,22)); + setWidgetIsHidden(true, new WidgetPointer(746,23)); + setWidgetIsHidden(true, new WidgetPointer(746,71)); + setWidgetIsHidden(false, new WidgetPointer(746,87)); + setWidgetIsHidden(true, new WidgetPointer(746,88)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + setWidgetIsHidden(true, new WidgetPointer(746,89)); + setWidgetIsHidden(true, new WidgetPointer(746,176)); + } else { + setWidgetIsHidden(false, new WidgetPointer(746,22)); + setWidgetIsHidden(false, new WidgetPointer(746,23)); + if (((boolean)bitconfig_6448)) { + setWidgetIsHidden(false, new WidgetPointer(746,71)); + } + setWidgetIsHidden(false, new WidgetPointer(746,89)); + setWidgetIsHidden(false, new WidgetPointer(746,176)); + if (isWidgetOpen(new WidgetPointer(746,88))) { + setWidgetIsHidden(true, new WidgetPointer(746,87)); + } + script_71(globalint_168); + if (((((((((((((((((isWidgetHidden(new WidgetPointer(746,90)) || isWidgetHidden(new WidgetPointer(746,91))) || isWidgetHidden(new WidgetPointer(746,92))) || isWidgetHidden(new WidgetPointer(746,93))) || isWidgetHidden(new WidgetPointer(746,94))) || isWidgetHidden(new WidgetPointer(746,95))) || isWidgetHidden(new WidgetPointer(746,96))) || isWidgetHidden(new WidgetPointer(746,97))) || isWidgetHidden(new WidgetPointer(746,98))) || isWidgetHidden(new WidgetPointer(746,99))) || isWidgetHidden(new WidgetPointer(746,100))) || isWidgetHidden(new WidgetPointer(746,101))) || isWidgetHidden(new WidgetPointer(746,102))) || isWidgetHidden(new WidgetPointer(746,103))) || isWidgetHidden(new WidgetPointer(746,104))) || isWidgetHidden(new WidgetPointer(746,105))) || isWidgetHidden(new WidgetPointer(746,107))) || isWidgetHidden(new WidgetPointer(746,108))) { + setWidgetIsHidden(false, new WidgetPointer(746,86)); + } else { + setWidgetIsHidden(true, new WidgetPointer(746,86)); + } + setScriptCallOnGameloop(2464, getClientCycle(), new WidgetPointer(-32768,3), "iI", new WidgetPointer(746,73)); + } + setWidgetIsHidden(true, new WidgetPointer(548,200)); + ivar0 = 0; + while (ivar0 <= 15) { + if (isWidgetOpen(new WidgetPointer(script_8(ivar0)))) { + setWidgetIsHidden(false, new WidgetPointer(script_121(ivar0))); + setWidgetIsHidden(false, new WidgetPointer(script_2458(ivar0))); + } else { + setWidgetIsHidden(true, new WidgetPointer(script_121(ivar0))); + setWidgetIsHidden(true, new WidgetPointer(script_2458(ivar0))); + } + ivar0 = add(ivar0, 1); + } + if (isWidgetOpen(new WidgetPointer(script_8(95))) && ((boolean)bitconfig_4280)) { + setWidgetIsHidden(false, new WidgetPointer(747,8)); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,8)); + } + ivar0 = 0; + IF (isWidgetHidden(new WidgetPointer(746,23))) + GOTO flow_52 + GOTO flow_55 + flow_52: + IF (ivar0 <= 15) + GOTO flow_53 + GOTO flow_54 + flow_53: + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(script_2459(ivar0))); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(script_2459(ivar0))); + setWidgetSprite(1835, new WidgetPointer(script_2459(ivar0))); + ivar0 = add(ivar0, 1); + GOTO flow_52 + flow_54: + GOTO flow_60 + flow_55: + IF (ivar0 <= 15) + GOTO flow_56 + GOTO flow_60 + flow_56: + if (isWidgetHidden(new WidgetPointer(script_121(ivar0)))) { + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(script_2459(ivar0))); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(script_2459(ivar0))); + setWidgetSprite(1835, new WidgetPointer(script_2459(ivar0))); + } else { + setScriptCallOnMouseEntered(2462, new WidgetPointer(-32768,3), 1, "I1", new WidgetPointer(script_2459(ivar0))); + setScriptCallOnMouseExit(2462, new WidgetPointer(-32768,3), 0, "I1", new WidgetPointer(script_2459(ivar0))); + } + ivar0 = add(ivar0, 1); + GOTO flow_55 + flow_60: + script_1313(); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,0)); + setWidgetSize(115, 35, 0, 0, new WidgetPointer(745,0)); + setWidgetPosition(80, 0, 0, 0, new WidgetPointer(745,1)); + setWidgetPosition(40, 0, 0, 0, new WidgetPointer(745,2)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,3)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,4)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,5)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,6)); + setWidgetSize(35, 35, 0, 0, new WidgetPointer(745,1)); + setWidgetSize(35, 35, 0, 0, new WidgetPointer(745,2)); + setWidgetSize(35, 35, 0, 0, new WidgetPointer(745,3)); + setWidgetSize(35, 35, 0, 0, new WidgetPointer(745,4)); + setWidgetSize(35, 35, 0, 0, new WidgetPointer(745,5)); + setWidgetSize(35, 35, 0, 0, new WidgetPointer(745,6)); + setWidgetSprite(1563, new WidgetPointer(745,1)); + setWidgetSprite(1562, new WidgetPointer(745,2)); + setWidgetSprite(1579, new WidgetPointer(745,3)); + setWidgetSprite(1580, new WidgetPointer(745,4)); + setWidgetSprite(1581, new WidgetPointer(745,6)); + } else { + flow_61: + if ((globalint_41 == -1) && (standart_config_281 >= 1000)) { + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + } + setWidgetSprite(1017, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,1)); + setWidgetIsHidden(false, new WidgetPointer(752,2)); + cs2method2122(0, 49283073); + cs2method2107(1, new WidgetPointer(752,1)); + if (isWidgetOpen(new WidgetPointer(752,13))) { + setWidgetIsHidden(false, new WidgetPointer(752,13)); + setWidgetIsHidden(true, new WidgetPointer(752,12)); + setWidgetIsHidden(true, new WidgetPointer(752,11)); + setWidgetIsHidden(true, new WidgetPointer(752,10)); + setWidgetIsHidden(true, new WidgetPointer(752,9)); + } else if (isWidgetOpen(new WidgetPointer(752,12))) { + setWidgetIsHidden(true, new WidgetPointer(752,13)); + setWidgetIsHidden(false, new WidgetPointer(752,12)); + setWidgetIsHidden(true, new WidgetPointer(752,11)); + setWidgetIsHidden(true, new WidgetPointer(752,10)); + setWidgetIsHidden(true, new WidgetPointer(752,9)); + } else if (isWidgetOpen(new WidgetPointer(752,11))) { + setWidgetIsHidden(true, new WidgetPointer(752,13)); + setWidgetIsHidden(true, new WidgetPointer(752,12)); + setWidgetIsHidden(false, new WidgetPointer(752,11)); + setWidgetIsHidden(true, new WidgetPointer(752,10)); + setWidgetIsHidden(true, new WidgetPointer(752,9)); + } else if (isWidgetOpen(new WidgetPointer(752,10))) { + setWidgetIsHidden(true, new WidgetPointer(752,13)); + setWidgetIsHidden(true, new WidgetPointer(752,12)); + setWidgetIsHidden(true, new WidgetPointer(752,11)); + setWidgetIsHidden(false, new WidgetPointer(752,10)); + setWidgetIsHidden(true, new WidgetPointer(752,9)); + } else { + if (isWidgetOpen(new WidgetPointer(752,9))) { + setWidgetIsHidden(true, new WidgetPointer(752,13)); + setWidgetIsHidden(true, new WidgetPointer(752,12)); + setWidgetIsHidden(true, new WidgetPointer(752,11)); + setWidgetIsHidden(true, new WidgetPointer(752,10)); + setWidgetIsHidden(false, new WidgetPointer(752,9)); + setWidgetIsHidden(false, new WidgetPointer(137,51)); + setWidgetIsHidden(true, new WidgetPointer(137,52)); + setWidgetIsHidden(true, new WidgetPointer(137,53)); + script_1301(8978491, 8978490); + setWidgetUnknownBoolean(false, new WidgetPointer(137,56)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(137,56)); + script_1558(0); + script_84(); + } + } + if (isWidgetOpen(new WidgetPointer(548,199))) { + setWidgetIsHidden(true, new WidgetPointer(548,81)); + setWidgetIsHidden(true, new WidgetPointer(548,82)); + setWidgetIsHidden(true, new WidgetPointer(548,128)); + setWidgetIsHidden(true, new WidgetPointer(548,146)); + setWidgetIsHidden(false, new WidgetPointer(548,199)); + setWidgetIsHidden(true, new WidgetPointer(548,200)); + setWidgetIsHidden(true, new WidgetPointer(548,201)); + setWidgetIsHidden(true, new WidgetPointer(548,182)); + } else { + setWidgetIsHidden(false, new WidgetPointer(548,81)); + setWidgetIsHidden(false, new WidgetPointer(548,82)); + setWidgetIsHidden(false, new WidgetPointer(548,128)); + setWidgetIsHidden(false, new WidgetPointer(548,146)); + setWidgetIsHidden(false, new WidgetPointer(548,201)); + setWidgetIsHidden(false, new WidgetPointer(548,182)); + setWidgetIsHidden(true, new WidgetPointer(746,87)); + if (isWidgetOpen(new WidgetPointer(548,200))) { + setWidgetIsHidden(true, new WidgetPointer(548,200)); + } + script_71(globalint_168); + setScriptCallOnGameloop(2464, getClientCycle(), new WidgetPointer(-32768,3), "iI", new WidgetPointer(548,193)); + } + ivar0 = 0; + while (ivar0 <= 15) { + if (isWidgetOpen(new WidgetPointer(script_8(ivar0)))) { + setWidgetIsHidden(false, new WidgetPointer(script_121(ivar0))); + setWidgetIsHidden(false, new WidgetPointer(script_2458(ivar0))); + } else { + setWidgetIsHidden(true, new WidgetPointer(script_121(ivar0))); + setWidgetIsHidden(true, new WidgetPointer(script_2458(ivar0))); + } + ivar0 = add(ivar0, 1); + } + if (isWidgetOpen(new WidgetPointer(script_8(95))) && ((boolean)bitconfig_4280)) { + setWidgetIsHidden(false, new WidgetPointer(747,8)); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,8)); + } + ivar0 = 0; + IF (isWidgetHidden(new WidgetPointer(548,81)) && isWidgetHidden(new WidgetPointer(548,128))) + GOTO flow_91 + GOTO flow_94 + flow_91: + IF (ivar0 <= 15) + GOTO flow_92 + GOTO flow_93 + flow_92: + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(script_2459(ivar0))); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(script_2459(ivar0))); + setWidgetSprite(1835, new WidgetPointer(script_2459(ivar0))); + ivar0 = add(ivar0, 1); + GOTO flow_91 + flow_93: + GOTO flow_99 + flow_94: + IF (ivar0 <= 15) + GOTO flow_95 + GOTO flow_99 + flow_95: + if (isWidgetHidden(new WidgetPointer(script_121(ivar0)))) { + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(script_2459(ivar0))); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(script_2459(ivar0))); + setWidgetSprite(1835, new WidgetPointer(script_2459(ivar0))); + } else { + setScriptCallOnMouseEntered(2462, new WidgetPointer(-32768,3), 1, "I1", new WidgetPointer(script_2459(ivar0))); + setScriptCallOnMouseExit(2462, new WidgetPointer(-32768,3), 0, "I1", new WidgetPointer(script_2459(ivar0))); + } + ivar0 = add(ivar0, 1); + GOTO flow_94 + flow_99: + script_1658(); + script_1337(); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,0)); + setWidgetSize(82, 25, 0, 0, new WidgetPointer(745,0)); + setWidgetPosition(57, 0, 0, 0, new WidgetPointer(745,1)); + setWidgetPosition(28, 0, 0, 0, new WidgetPointer(745,2)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,3)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,4)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,5)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(745,6)); + setWidgetSize(25, 25, 0, 0, new WidgetPointer(745,1)); + setWidgetSize(25, 25, 0, 0, new WidgetPointer(745,2)); + setWidgetSize(25, 25, 0, 0, new WidgetPointer(745,3)); + setWidgetSize(25, 25, 0, 0, new WidgetPointer(745,4)); + setWidgetSize(25, 25, 0, 0, new WidgetPointer(745,5)); + setWidgetSize(25, 25, 0, 0, new WidgetPointer(745,6)); + setWidgetSprite(442, new WidgetPointer(745,1)); + setWidgetSprite(1073, new WidgetPointer(745,2)); + setWidgetSprite(1576, new WidgetPointer(745,3)); + setWidgetSprite(1578, new WidgetPointer(745,4)); + setWidgetSprite(1577, new WidgetPointer(745,6)); + } + script_5341(); + script_722(); + return; +} diff --git a/dumps/scripts/1365.cs2 b/dumps/scripts/1365.cs2 new file mode 100644 index 000000000..7b343a174 --- /dev/null +++ b/dumps/scripts/1365.cs2 @@ -0,0 +1,5 @@ +void script_1365(int arg0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setScriptCallOnGameloop(122, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1366.cs2 b/dumps/scripts/1366.cs2 new file mode 100644 index 000000000..e922f426d --- /dev/null +++ b/dumps/scripts/1366.cs2 @@ -0,0 +1,10 @@ +void script_1366() { + if (standart_config_380 == 25) { + setWidgetText(new WidgetPointer(57,0), "Time until next game starts: 0"); + } else if (standart_config_380 > 0) { + setWidgetText(new WidgetPointer(57,0), "Time until next game starts: " + intToStr(standart_config_380)); + } else { + setWidgetText(new WidgetPointer(57,0), "Waiting for players to join the other team."); + } + return; +} diff --git a/dumps/scripts/1367.cs2 b/dumps/scripts/1367.cs2 new file mode 100644 index 000000000..ac9b73e9e --- /dev/null +++ b/dumps/scripts/1367.cs2 @@ -0,0 +1,72 @@ +void script_1367() { + setWidgetText(new WidgetPointer(58,0), "Zamorak = " + intToStr(bitconfig_155)); + setWidgetText(new WidgetPointer(58,1), intToStr(bitconfig_145) + " = Saradomin"); + setWidgetText(new WidgetPointer(58,6), intToStr(standart_config_380) + " Min"); + if (((boolean)bitconfig_136)) { + setWidgetText(new WidgetPointer(58,9), "Health: " + intToStr(bitconfig_136) + "%"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(58,9)); + } else { + setWidgetText(new WidgetPointer(58,9), "Health " + intToStr(bitconfig_136) + "%"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(58,9)); + } + if (((boolean)bitconfig_143)) { + setWidgetText(new WidgetPointer(58,2), "Safe"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(58,2)); + } else if (((boolean)bitconfig_143)) { + setWidgetText(new WidgetPointer(58,2), "Taken"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(58,2)); + } else { + if (bitconfig_143 == 2) { + setWidgetText(new WidgetPointer(58,2), "Dropped"); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(58,2)); + } + } + if (((boolean)bitconfig_153)) { + setWidgetText(new WidgetPointer(58,3), "Safe"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(58,3)); + } else if (((boolean)bitconfig_153)) { + setWidgetText(new WidgetPointer(58,3), "Taken"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(58,3)); + } else { + if (bitconfig_153 == 2) { + setWidgetText(new WidgetPointer(58,3), "Dropped"); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(58,3)); + } + } + if (((boolean)bitconfig_137)) { + setWidgetText(new WidgetPointer(58,10), "Unlocked"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(58,10)); + } else { + setWidgetText(new WidgetPointer(58,10), "Locked"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(58,10)); + } + if (((boolean)bitconfig_138)) { + setWidgetText(new WidgetPointer(58,11), "Cleared"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(58,11)); + } else { + setWidgetText(new WidgetPointer(58,11), "Collapsed"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(58,11)); + } + if (((boolean)bitconfig_139)) { + setWidgetText(new WidgetPointer(58,12), "Cleared"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(58,12)); + } else { + setWidgetText(new WidgetPointer(58,12), "Collapsed"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(58,12)); + } + if (((boolean)bitconfig_140)) { + setWidgetText(new WidgetPointer(58,13), "Destroyed"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(58,13)); + } else { + setWidgetText(new WidgetPointer(58,13), "Operational"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(58,13)); + } + setItemOnWidgetMethod2200(18748, -1, new WidgetPointer(58,4)); + setItemOnWidgetMethod2200(18749, -1, new WidgetPointer(58,5)); + setItemOnWidgetMethod2200(18750, -1, new WidgetPointer(58,14)); + setItemOnWidgetMethod2200(18751, -1, new WidgetPointer(58,15)); + setItemOnWidgetMethod2200(18752, -1, new WidgetPointer(58,16)); + setItemOnWidgetMethod2200(18753, -1, new WidgetPointer(58,17)); + setItemOnWidgetMethod2200(18754, -1, new WidgetPointer(58,18)); + return; +} diff --git a/dumps/scripts/1368.cs2 b/dumps/scripts/1368.cs2 new file mode 100644 index 000000000..16b2b4c6e --- /dev/null +++ b/dumps/scripts/1368.cs2 @@ -0,0 +1,72 @@ +void script_1368() { + setWidgetText(new WidgetPointer(59,0), "Zamorak = " + intToStr(bitconfig_155)); + setWidgetText(new WidgetPointer(59,1), intToStr(bitconfig_145) + " = Saradomin"); + setWidgetText(new WidgetPointer(59,6), intToStr(standart_config_380) + " min"); + if (((boolean)bitconfig_146)) { + setWidgetText(new WidgetPointer(59,9), "Health: " + intToStr(bitconfig_146) + "%"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(59,9)); + } else { + setWidgetText(new WidgetPointer(59,9), "Health " + intToStr(bitconfig_146) + "%"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(59,9)); + } + if (((boolean)bitconfig_143)) { + setWidgetText(new WidgetPointer(59,2), "Safe"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(59,2)); + } else if (((boolean)bitconfig_143)) { + setWidgetText(new WidgetPointer(59,2), "Taken"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(59,2)); + } else { + if (bitconfig_143 == 2) { + setWidgetText(new WidgetPointer(59,2), "Dropped"); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(59,2)); + } + } + if (((boolean)bitconfig_153)) { + setWidgetText(new WidgetPointer(59,3), "Safe"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(59,3)); + } else if (((boolean)bitconfig_153)) { + setWidgetText(new WidgetPointer(59,3), "Taken"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(59,3)); + } else { + if (bitconfig_153 == 2) { + setWidgetText(new WidgetPointer(59,3), "Dropped"); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(59,3)); + } + } + if (((boolean)bitconfig_147)) { + setWidgetText(new WidgetPointer(59,10), "Unlocked"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(59,10)); + } else { + setWidgetText(new WidgetPointer(59,10), "Locked"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(59,10)); + } + if (((boolean)bitconfig_148)) { + setWidgetText(new WidgetPointer(59,11), "Cleared"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(59,11)); + } else { + setWidgetText(new WidgetPointer(59,11), "Collapsed"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(59,11)); + } + if (((boolean)bitconfig_149)) { + setWidgetText(new WidgetPointer(59,12), "Cleared"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(59,12)); + } else { + setWidgetText(new WidgetPointer(59,12), "Collapsed"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(59,12)); + } + if (((boolean)bitconfig_150)) { + setWidgetText(new WidgetPointer(59,13), "Destroyed"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(59,13)); + } else { + setWidgetText(new WidgetPointer(59,13), "Operational"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(59,13)); + } + setItemOnWidgetMethod2200(18748, -1, new WidgetPointer(59,4)); + setItemOnWidgetMethod2200(18749, -1, new WidgetPointer(59,5)); + setItemOnWidgetMethod2200(18750, -1, new WidgetPointer(59,14)); + setItemOnWidgetMethod2200(18751, -1, new WidgetPointer(59,15)); + setItemOnWidgetMethod2200(18752, -1, new WidgetPointer(59,16)); + setItemOnWidgetMethod2200(18753, -1, new WidgetPointer(59,17)); + setItemOnWidgetMethod2200(18754, -1, new WidgetPointer(59,18)); + return; +} diff --git a/dumps/scripts/1369.cs2 b/dumps/scripts/1369.cs2 new file mode 100644 index 000000000..ca9eb0493 --- /dev/null +++ b/dumps/scripts/1369.cs2 @@ -0,0 +1,62 @@ +void script_1369(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9) { + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int stack_dump0; + opcStruct5224(2,0,0) structdump_1; + opcStruct5224(2,0,0) structdump_2; + opcStruct5224(2,0,0) structdump_3; + script_1088(arg0, 0); + ivar10 = -1; + if (globalint_622 != -1) { + ivar10 = getDungeonmap(globalint_622); + if (ivar10 == -1) { + ivar10 = 28; + } + } + ivar10 = script_2785(ivar10); + if (dungeonmapContains(globalint_622, ivar10)) { + cs2method5227(ivar10, globalint_622); + } else { + loadDungeonmap(ivar10); + } + globalint_172 = cs2method5218(ivar10); + script_1372(); + script_1374(0); + script_1376(0, arg5, arg9); + script_291(0, arg6, arg7, arg8, arg4, arg5); + script_1839(bitconfig_5367, arg1, arg2, arg3); + setScriptCallOnGlobalConfigChange(1369, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), new WidgetPointer(arg8), new WidgetPointer(arg9), 622, 1, "IIIIIIIIIIY", new WidgetPointer(arg0)); + setScriptCallOnConfigChange(1404, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg5), new WidgetPointer(arg0), bitconfig_6175, 463, 1159, 2, "IIIIIiY", new WidgetPointer(arg0)); + setScriptCallOnKeyPress(1382, -2147483640, false, new WidgetPointer(arg4), -1, "izIc", new WidgetPointer(arg4)); + globalstring_31 = ""; + ivar11 = 0; + ivar12 = 0; + ivar13 = globalint_622; + if (ivar13 != -1) { + stack_dump0 = ivar13; + structdump_1 = cs2method5224(stack_dump0); + ivar12 = structdump_1.intpart_1; + ivar11 = structdump_1.intpart_0; + if ((ivar11 < 0) || (ivar12 < 0)) { + ivar13 = addToCoordinate(0, extractX(ivar13), script_686(subtract(extractZ(ivar13), 1), 4), extractY(ivar13)); + stack_dump0 = ivar13; + structdump_2 = cs2method5224(stack_dump0); + ivar12 = structdump_2.intpart_1; + ivar11 = structdump_2.intpart_0; + if ((ivar11 < 0) || (ivar12 < 0)) { + ivar13 = addToCoordinate(0, extractX(ivar13), script_686(subtract(extractZ(ivar13), 1), 4), extractY(ivar13)); + stack_dump0 = ivar13; + structdump_3 = cs2method5224(stack_dump0); + ivar12 = structdump_3.intpart_1; + ivar11 = structdump_3.intpart_0; + if ((ivar11 < 0) || (ivar12 < 0)) { + return; + } + } + } + setScriptCallOnGameloop(2054, add(getClientCycle(), 4), new WidgetPointer(arg0), ivar13, "iIc", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/137.cs2 b/dumps/scripts/137.cs2 new file mode 100644 index 000000000..edbbedf65 --- /dev/null +++ b/dumps/scripts/137.cs2 @@ -0,0 +1,5 @@ +void script_137(int arg0,int arg1) { + setScriptCallOnGameloop(250, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + script_251(arg1); + return; +} diff --git a/dumps/scripts/1370.cs2 b/dumps/scripts/1370.cs2 new file mode 100644 index 000000000..0abb477cd --- /dev/null +++ b/dumps/scripts/1370.cs2 @@ -0,0 +1,93 @@ +void script_1370(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + opcStruct5208(2,0,0) structdump_0; + int stack_dump1; + opcStruct5209(2,0,0) structdump_2; + if (cs2method5220()) { + return; + } + ivar4 = 1; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = globalint_172; + if (arg2 > 0) { + switch (globalint_172) { + case 50: + globalint_172 = 37; + break; + case 75: + globalint_172 = 50; + break; + case 100: + globalint_172 = 75; + break; + case 200: + globalint_172 = 100; + break; + default: + globalint_172 = 37; + ivar4 = 0; + } + } else { + switch (globalint_172) { + case 37: + globalint_172 = 50; + break; + case 50: + globalint_172 = 75; + break; + case 75: + globalint_172 = 100; + break; + case 100: + globalint_172 = 200; + break; + default: + globalint_172 = 200; + ivar4 = 0; + } + if (((boolean)arg3) && (ivar15 < 200)) { + structdump_0 = cs2method5208(); + ivar6 = structdump_0.intpart_1; + ivar5 = structdump_0.intpart_0; + stack_dump1 = getWidgetActualWidth(new WidgetPointer(arg1)); + ivar10 = getWidgetActualHeight(new WidgetPointer(arg1)); + ivar9 = stack_dump1; + if ((ivar5 > 0) && (ivar6 > 0)) { + structdump_2 = cs2method5209(); + ivar8 = structdump_2.intpart_1; + ivar7 = structdump_2.intpart_0; + ivar11 = subtract(subtract(getLastMouseY(), script_3365(arg1)), divide(ivar9, 2)); + ivar12 = subtract(subtract(getLastMouseX(), script_3366(arg1)), divide(ivar10, 2)); + stack_dump1 = multiplyDivide(ivar5, ivar9, ivar11); + ivar14 = multiplyDivide(ivar6, ivar10, ivar12); + ivar13 = stack_dump1; + ivar7 = add(ivar7, ivar13); + ivar8 = subtract(ivar8, ivar14); + setScriptCallOnGameloop(2054, add(getClientCycle(), 1), new WidgetPointer(arg0), addToCoordinate(0, ivar7, 0, ivar8), "iIc", new WidgetPointer(arg0)); + } + } + } + script_1372(); + script_305(ivar4); + return; +} diff --git a/dumps/scripts/1371.cs2 b/dumps/scripts/1371.cs2 new file mode 100644 index 000000000..17653c80c --- /dev/null +++ b/dumps/scripts/1371.cs2 @@ -0,0 +1,53 @@ +void script_1371() { + if (((boolean)bitconfig_7520)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,156)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,156)); + } + if (((boolean)bitconfig_7521)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,157)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,157)); + } + if (((boolean)bitconfig_7526)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,158)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,158)); + } + if (((boolean)bitconfig_7527)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,159)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,159)); + } + if (((boolean)bitconfig_7530)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,160)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,160)); + } + if (((boolean)bitconfig_7531)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,161)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,161)); + } + if (((boolean)bitconfig_7532)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,162)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,162)); + } + if (((boolean)bitconfig_7533)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,163)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,163)); + } + if (((boolean)bitconfig_7534)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,164)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,164)); + } + if (((boolean)bitconfig_7535)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1017,165)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1017,165)); + } + return; +} diff --git a/dumps/scripts/1372.cs2 b/dumps/scripts/1372.cs2 new file mode 100644 index 000000000..bc8c6cde2 --- /dev/null +++ b/dumps/scripts/1372.cs2 @@ -0,0 +1,5 @@ +void script_1372() { + setWorldmapZoom(globalint_172); + setWidgetText(new WidgetPointer(755,14), intToStr(globalint_172) + "%"); + return; +} diff --git a/dumps/scripts/1373.cs2 b/dumps/scripts/1373.cs2 new file mode 100644 index 000000000..1dc9f71ef --- /dev/null +++ b/dumps/scripts/1373.cs2 @@ -0,0 +1,8 @@ +void script_1373() { + if (isWidgetHidden(new WidgetPointer(755,46))) { + script_1374(1); + } else { + script_1374(0); + } + return; +} diff --git a/dumps/scripts/1374.cs2 b/dumps/scripts/1374.cs2 new file mode 100644 index 000000000..7529b594d --- /dev/null +++ b/dumps/scripts/1374.cs2 @@ -0,0 +1,11 @@ +void script_1374(int arg0) { + if (((boolean)arg0)) { + setWidgetIsHidden(false, new WidgetPointer(755,46)); + setWidgetContextMenuOption(1, new WidgetPointer(755,6), "Hide overview"); + } else { + setWidgetIsHidden(true, new WidgetPointer(755,46)); + setWidgetContextMenuOption(1, new WidgetPointer(755,6), "Show overview"); + } + setScriptCallOnClickContextMenu(1373, "", new WidgetPointer(755,6)); + return; +} diff --git a/dumps/scripts/1375.cs2 b/dumps/scripts/1375.cs2 new file mode 100644 index 000000000..e11515812 --- /dev/null +++ b/dumps/scripts/1375.cs2 @@ -0,0 +1,8 @@ +void script_1375(int arg0,int arg1) { + if (isWidgetHidden(new WidgetPointer(755,47))) { + script_1376(1, arg0, arg1); + } else { + script_1376(0, arg0, arg1); + } + return; +} diff --git a/dumps/scripts/1376.cs2 b/dumps/scripts/1376.cs2 new file mode 100644 index 000000000..4283ae7db --- /dev/null +++ b/dumps/scripts/1376.cs2 @@ -0,0 +1,14 @@ +void script_1376(int arg0,int arg1,int arg2) { + if (((boolean)arg0)) { + setWidgetIsHidden(false, new WidgetPointer(755,47)); + setWidgetContextMenuOption(1, new WidgetPointer(755,5), "Hide key"); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(755,47)), 0, 1, 1, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(755,47)); + setWidgetContextMenuOption(1, new WidgetPointer(755,5), "Show key"); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(arg1)); + } + script_2046(arg1); + setScriptCallOnClickContextMenu(1375, new WidgetPointer(arg1), new WidgetPointer(arg2), "II", new WidgetPointer(755,5)); + return; +} diff --git a/dumps/scripts/1377.cs2 b/dumps/scripts/1377.cs2 new file mode 100644 index 000000000..7c394097d --- /dev/null +++ b/dumps/scripts/1377.cs2 @@ -0,0 +1,33 @@ +void script_1377(int arg0,int arg1) { + int ivar2; + ivar2 = -1; + if (bitconfig_7516 == arg1) { + ivar2 = script_486(bitconfig_7520); + } else if (bitconfig_7517 == arg1) { + ivar2 = script_486(bitconfig_7521); + } else if (bitconfig_7518 == arg1) { + ivar2 = script_486(bitconfig_7526); + } else if (bitconfig_7519 == arg1) { + ivar2 = script_486(bitconfig_7527); + } else if (bitconfig_7522 == arg1) { + ivar2 = script_486(bitconfig_7530); + } else if (bitconfig_7523 == arg1) { + ivar2 = script_486(bitconfig_7531); + } else if (bitconfig_7524 == arg1) { + ivar2 = script_486(bitconfig_7532); + } else if (bitconfig_7525 == arg1) { + ivar2 = script_486(bitconfig_7533); + } else if (bitconfig_7528 == arg1) { + ivar2 = script_486(bitconfig_7534); + } else { + if (bitconfig_7529 == arg1) { + ivar2 = script_486(bitconfig_7535); + } + } + if (ivar2 != -1) { + setWidgetText(new WidgetPointer(arg0), getNpcNodemapData(ivar2, 1140)); + } else { + setWidgetText(new WidgetPointer(arg0), ""); + } + return; +} diff --git a/dumps/scripts/1378.cs2 b/dumps/scripts/1378.cs2 new file mode 100644 index 000000000..14920f92c --- /dev/null +++ b/dumps/scripts/1378.cs2 @@ -0,0 +1,138 @@ +void script_1378(int arg0,int arg1) { + string svar0; + string svar1; + svar0 = getWidgetText(new WidgetPointer(arg0)); + svar1 = ""; + if (strLength(svar0) > 0) { + flow_1: + SWITCH (arg1) { + case 66650279: + GOTO flow_2 + case 66650278: + GOTO flow_2 + case 66650281: + GOTO flow_2 + case 66650280: + GOTO flow_2 + case 66650283: + GOTO flow_2 + case 66650282: + GOTO flow_2 + case 66650285: + GOTO flow_2 + case 66650284: + GOTO flow_2 + case 66650287: + GOTO flow_2 + case 66650286: + GOTO flow_2 + case 66650288: + GOTO flow_2 + case 66650289: + GOTO flow_2 + case 66650290: + GOTO flow_2 + case 66650291: + GOTO flow_2 + case 66650292: + GOTO flow_2 + case 66650293: + GOTO flow_2 + case 66650294: + GOTO flow_2 + case 66650295: + GOTO flow_2 + case 66650296: + GOTO flow_2 + case 66650297: + GOTO flow_2 + case 66650298: + GOTO flow_2 + case 66650299: + GOTO flow_2 + case 66650300: + GOTO flow_2 + case 66650301: + GOTO flow_2 + case 66650302: + GOTO flow_2 + case 66650303: + GOTO flow_2 + case 66650337: + GOTO flow_2 + case 66650336: + GOTO flow_2 + case 66650311: + GOTO flow_2 + case 66650310: + GOTO flow_2 + case 66650309: + GOTO flow_2 + case 66650308: + GOTO flow_2 + case 66650307: + GOTO flow_2 + case 66650306: + GOTO flow_2 + case 66650305: + GOTO flow_2 + case 66650304: + GOTO flow_2 + case 66650319: + GOTO flow_2 + case 66650318: + GOTO flow_2 + case 66650317: + GOTO flow_2 + case 66650316: + GOTO flow_2 + case 66650315: + GOTO flow_2 + case 66650314: + GOTO flow_2 + case 66650313: + GOTO flow_2 + case 66650312: + GOTO flow_2 + case 66650326: + GOTO flow_2 + case 66650327: + GOTO flow_2 + case 66650324: + GOTO flow_2 + case 66650325: + GOTO flow_2 + case 66650322: + GOTO flow_2 + case 66650323: + GOTO flow_2 + case 66650320: + GOTO flow_2 + case 66650321: + GOTO flow_2 + case 66650334: + GOTO flow_2 + case 66650335: + GOTO flow_2 + case 66650332: + GOTO flow_2 + case 66650333: + GOTO flow_2 + case 66650330: + GOTO flow_2 + case 66650331: + GOTO flow_2 + case 66650328: + GOTO flow_2 + case 66650329: + GOTO flow_2 + } + return; + flow_2: + svar1 = getWidgetText(new WidgetPointer(arg1)); + setWidgetText(new WidgetPointer(arg1), svar0); + setWidgetText(new WidgetPointer(arg0), svar1); + globalint_1387 = 1; + } + return; +} diff --git a/dumps/scripts/1379.cs2 b/dumps/scripts/1379.cs2 new file mode 100644 index 000000000..062108f13 --- /dev/null +++ b/dumps/scripts/1379.cs2 @@ -0,0 +1,34 @@ +void script_1379() { + switch (bitconfig_5389) { + case 1: + setWidgetAnimation(10439, new WidgetPointer(796,10)); + break; + case 2: + setWidgetIsHidden(true, new WidgetPointer(796,11)); + setWidgetIsHidden(false, new WidgetPointer(796,7)); + break; + case 3: + setWidgetAnimation(10439, new WidgetPointer(796,6)); + break; + case 4: + setWidgetIsHidden(true, new WidgetPointer(796,7)); + setWidgetIsHidden(false, new WidgetPointer(796,9)); + break; + case 5: + setWidgetAnimation(10443, new WidgetPointer(796,8)); + break; + case 6: + setWidgetIsHidden(true, new WidgetPointer(796,9)); + setWidgetIsHidden(false, new WidgetPointer(796,5)); + break; + case 7: + setWidgetAnimation(10437, new WidgetPointer(796,4)); + break; + case 8: + setWidgetIsHidden(true, new WidgetPointer(796,5)); + setWidgetIsHidden(true, new WidgetPointer(796,3)); + setWidgetIsHidden(false, new WidgetPointer(796,30)); + setWidgetIsHidden(false, new WidgetPointer(796,1)); + } + return; +} diff --git a/dumps/scripts/138.cs2 b/dumps/scripts/138.cs2 new file mode 100644 index 000000000..504bcfb50 --- /dev/null +++ b/dumps/scripts/138.cs2 @@ -0,0 +1,21 @@ +void script_138() { + switch (globalint_5) { + case 7: + script_1548(7); + break; + case 8: + script_1548(8); + break; + case 9: + script_1548(9); + break; + case 13: + script_1548(13); + break; + default: + if (getDisplayMode() >= 2) { + script_1364(); + } + } + return; +} diff --git a/dumps/scripts/1380.cs2 b/dumps/scripts/1380.cs2 new file mode 100644 index 000000000..2e406b159 --- /dev/null +++ b/dumps/scripts/1380.cs2 @@ -0,0 +1,4 @@ +void script_1380(int arg0) { + setScriptCallOnGameloop(709, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1381.cs2 b/dumps/scripts/1381.cs2 new file mode 100644 index 000000000..295f92366 --- /dev/null +++ b/dumps/scripts/1381.cs2 @@ -0,0 +1,57 @@ +void script_1381() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (((boolean)bitconfig_7520)) { + ivar1 = script_1416(66650268, ivar1); + } else { + ivar0 = script_1403(66650268, ivar0); + } + if (((boolean)bitconfig_7521)) { + ivar1 = script_1416(66650269, ivar1); + } else { + ivar0 = script_1403(66650269, ivar0); + } + if (((boolean)bitconfig_7526)) { + ivar1 = script_1416(66650270, ivar1); + } else { + ivar0 = script_1403(66650270, ivar0); + } + if (((boolean)bitconfig_7527)) { + ivar1 = script_1416(66650271, ivar1); + } else { + ivar0 = script_1403(66650271, ivar0); + } + if (((boolean)bitconfig_7530)) { + ivar1 = script_1416(66650272, ivar1); + } else { + ivar0 = script_1403(66650272, ivar0); + } + if (((boolean)bitconfig_7531)) { + ivar1 = script_1416(66650273, ivar1); + } else { + ivar0 = script_1403(66650273, ivar0); + } + if (((boolean)bitconfig_7532)) { + ivar1 = script_1416(66650274, ivar1); + } else { + ivar0 = script_1403(66650274, ivar0); + } + if (((boolean)bitconfig_7533)) { + ivar1 = script_1416(66650275, ivar1); + } else { + ivar0 = script_1403(66650275, ivar0); + } + if (((boolean)bitconfig_7534)) { + ivar1 = script_1416(66650276, ivar1); + } else { + ivar0 = script_1403(66650276, ivar0); + } + if (((boolean)bitconfig_7535)) { + ivar1 = script_1416(66650277, ivar1); + } else { + ivar0 = script_1403(66650277, ivar0); + } + return; +} diff --git a/dumps/scripts/1382.cs2 b/dumps/scripts/1382.cs2 new file mode 100644 index 000000000..cec7bf6df --- /dev/null +++ b/dumps/scripts/1382.cs2 @@ -0,0 +1,101 @@ +void script_1382(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + string svar0; + string svar1; + opcStruct5212(2,0,0) structdump_0; + string stack_dump1; + int stack_dump2; + opcStruct5213(2,0,0) structdump_3; + switch (arg0) { + case 84: + if (arg3 != -1) { + cs2method5221(arg3); + } + globalstring_31 = ""; + script_308(arg2); + return; + case 96: + script_1603(-1, 0); + return; + case 97: + script_1603(1, 0); + return; + case 98: + script_1603(0, 1); + return; + case 99: + script_1603(0, -1); + return; + } + svar0 = strRemoveEntities(script_74(4, arg0, arg1, globalstring_31)); + if (strIndexof(0, svar0, " ") != -1) { + return; + } + if (((boolean)stringMethod4107(svar0, " "))) { + return; + } + if (getLineCount(getWidgetActualWidth(new WidgetPointer(arg2)), 494, svar0) > 1) { + return; + } + globalstring_31 = lower(svar0); + ivar4 = strLength(globalstring_31); + if (ivar4 <= 0) { + script_308(arg2); + return; + } + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = 0; + svar1 = ""; + ivar9 = -1; + ivar10 = 2147483647; + ivar11 = 2147483647; + structdump_0 = cs2method5212(); + ivar6 = structdump_0.intpart_1; + ivar5 = structdump_0.intpart_0; + while (ivar5 != -1) { + svar0 = strRemoveEntities(script_2332(getWorldmapLabelName(ivar5), "
", " ")); + ivar7 = strIndexof(0, lower(svar0), globalstring_31); + if ((ivar7 != -1) && (ivar7 <= ivar10)) { + ivar8 = strLength(svar0); + if (ivar8 < ivar11) { + stack_dump1 = svar0; + ivar9 = ivar6; + svar1 = stack_dump1; + stack_dump2 = ivar7; + ivar11 = ivar8; + ivar10 = stack_dump2; + } + } + structdump_3 = cs2method5213(); + ivar6 = structdump_3.intpart_1; + ivar5 = structdump_3.intpart_0; + } + if (ivar9 == -1) { + setScriptCallOnKeyPress(1382, -2147483640, false, new WidgetPointer(arg2), -1, "izIc", new WidgetPointer(arg2)); + if (getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg2)), 494, globalstring_31) > getWidgetActualWidth(new WidgetPointer(arg2))) { + setWidgetTextAlignment(2, 1, 0, new WidgetPointer(arg2)); + } else { + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(arg2)); + } + setWidgetText(new WidgetPointer(arg2), "" + globalstring_31 + ""); + return; + } + svar0 = ""; + if (ivar10 > 0) { + svar0 = substr(0, ivar10, svar1); + } + svar0 = concat(svar0, "" + substr(ivar10, add(ivar10, ivar4), svar1) + ""); + svar0 = concat(svar0, substr(add(ivar10, ivar4), strLength(svar1), svar1)); + setWidgetText(new WidgetPointer(arg2), svar0); + setScriptCallOnKeyPress(1382, -2147483640, false, new WidgetPointer(arg2), ivar9, "izIc", new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/1383.cs2 b/dumps/scripts/1383.cs2 new file mode 100644 index 000000000..1e51170ec --- /dev/null +++ b/dumps/scripts/1383.cs2 @@ -0,0 +1,27 @@ +void script_1383() { + if (((boolean)bitconfig_5390)) { + setWidgetText(new WidgetPointer(794,5), "" + "Varrock Census - year 160" + "
" + "" + "Citizen's name" + "
" + "Gryff Aldock" + "
" + "Raminme Altrodor" + "
" + "Layte Aubury" + "
" + "Ingald Belger" + "
" + "Asyff Bymajique" + "
" + "Baraek Brigson" + "
" + "Brugsen Bursen" + "
" + "Jeremy Clerksin" + "
" + "Daerig Clod" + "
" + "Phillipa DeMarne" + "
" + "Trista Donaldson" + "
" + "Straven Enroy" + "
" + "Gertrude Fairweather" + "
" + "Shilop Fairweather" + "
" + "Walter Fairweather" + "
" + "Wilough Fairweather"); + setWidgetText(new WidgetPointer(794,4), "
" + "
" + "" + "Profession" + "
" + "Town crier" + "
" + "Cook" + "
" + "Rune seller" + "
" + "Apothecary" + "
" + "Fancy dress store owner" + "
" + "Fur seller" + "
" + "Economist" + "
" + "Cart expert" + "
" + "Unemployed" + "
" + "Minor noble" + "
" + "Banker" + "
" + "Legitimate businessman" + "
" + "Housewife" + "
" + "Baby" + "
" + "Travelling merchant" + "
" + "Baby"); + setWidgetIsHidden(true, new WidgetPointer(794,3)); + setWidgetIsHidden(false, new WidgetPointer(794,2)); + } + if (((boolean)bitconfig_5390)) { + setWidgetText(new WidgetPointer(794,5), "" + "Varrock Census - year 160" + "
" + "" + "Citizen's name" + "
" + "Dimintheis Fitzharmon" + "
" + "Eustace Forthwright" + "
" + "Everard Grafham" + "
" + "Matthew Grey" + "
" + "Grimesquit Grime" + "
" + "Phingspet Grime" + "
" + "Benny Gutenberg" + "
" + "Haig Halen" + "
" + "Ritchard Haring" + "
" + "Randulf Harlow" + "
" + "Tobias Hills" + "
" + "Louisiana Jones" + "
" + "Lawrence Lambare" + "
" + "Wimock Landsdown" + "
" + "Stuart Lea" + "
" + "Draul Leptoc"); + setWidgetText(new WidgetPointer(794,4), "
" + "
" + "" + "Profession" + "
" + "Former Noble" + "
" + "Guard" + "
" + "Natural Historian" + "
" + "Sailor" + "
" + "Profession Withheld" + "
" + "Profession Withheld" + "
" + "Journalist" + "
" + "Curator" + "
" + "Dietician" + "
" + "Vampyre Hunter" + "
" + "Guard" + "
" + "Student" + "
" + "Priest" + "
" + "Teacher" + "
" + "Playwright" + "
" + "Lord"); + setWidgetIsHidden(false, new WidgetPointer(794,3)); + setWidgetIsHidden(false, new WidgetPointer(794,2)); + } + if (bitconfig_5390 == 2) { + setWidgetText(new WidgetPointer(794,5), "" + "Varrock Census - year 160" + "
" + "" + "Citizen's name" + "
" + "Phearthee Levalsyx" + "
" + "Charles Lyeman" + "
" + "Surok Magis" + "
" + "Gaffit Malore" + "
" + "Mabel Malore" + "
" + "Alfi Marino" + "
" + "Aris Maye" + "
" + "Iffie Nitter" + "
" + "Thessalia Nitter" + "
" + "Elsie Parks" + "
" + "Fred Parks" + "
" + "Ethel Prim" + "
" + "Hartwin Prim" + "
" + "Enhtor Prysin" + "
" + "Idonea Ramlock" + "
" + "Trevick Ramlock"); + setWidgetText(new WidgetPointer(794,4), "
" + "
" + "" + "Profession" + "
" + "Mugger" + "
" + "Unemployed" + "
" + "Mage" + "
" + "Librarian" + "
" + "Information Clerk" + "
" + "Chef" + "
" + "Gypsy" + "
" + "Retired" + "
" + "Clothes Shop Owner" + "
" + "Retired" + "
" + "Retired" + "
" + "Servant" + "
" + "Student" + "
" + "Knight" + "
" + "Teacher" + "
" + "Banker"); + setWidgetIsHidden(false, new WidgetPointer(794,2)); + setWidgetIsHidden(false, new WidgetPointer(794,3)); + } + if (bitconfig_5390 == 3) { + setWidgetText(new WidgetPointer(794,5), "" + "Varrock Census - year 160" + "
" + "" + "Citizen's name" + "
" + "Aeonisig Raispher" + "
" + "Katrine Raven" + "
" + "Horvik Ravitz" + "
" + "Roald Remanis" + "
" + "Milo Rovin" + "
" + "Martina Scorsby" + "
" + "Stephan Scorsby" + "
" + "Sani Semiv" + "
" + "Herbert Spiccanspan" + "
" + "Brana Talvoy" + "
" + "Launa Talvoy" + "
" + "Reldo Trimmly" + "
" + "Jack Tylner" + "
" + "Romily Weeklax" + "
" + "Treznor Withings"); + setWidgetText(new WidgetPointer(794,4), "
" + "
" + "" + "Profession" + "
" + "Royal Advisor" + "
" + "Wallet Relocator" + "
" + "Apprentice Blacksmith" + "
" + "Our Glorious King" + "
" + "Captain of the guard" + "
" + "Washerwoman" + "
" + "Guard" + "
" + "Master Smith" + "
" + "Street Cleaner" + "
" + "Farmer" + "
" + "Farmer" + "
" + "Assistant Librarian" + "
" + "Rat Exterminator" + "
" + "Pie Salesman" + "
" + "Kitchen Boy"); + setWidgetIsHidden(true, new WidgetPointer(794,2)); + setWidgetIsHidden(false, new WidgetPointer(794,3)); + } + return; +} diff --git a/dumps/scripts/1384.cs2 b/dumps/scripts/1384.cs2 new file mode 100644 index 000000000..705ef7083 --- /dev/null +++ b/dumps/scripts/1384.cs2 @@ -0,0 +1,754 @@ +void script_1384(int arg0,int arg1) { + switch (arg0) { + case 0: + globalint_0 = arg1; + break; + case 1: + globalint_274 = arg1; + break; + case 2: + globalint_275 = arg1; + break; + case 3: + globalint_276 = arg1; + break; + case 4: + globalint_277 = arg1; + break; + case 5: + globalint_278 = arg1; + break; + case 6: + globalint_279 = arg1; + break; + case 7: + globalint_280 = arg1; + break; + case 8: + globalint_281 = arg1; + break; + case 9: + globalint_282 = arg1; + break; + case 10: + globalint_283 = arg1; + break; + case 11: + globalint_284 = arg1; + break; + case 12: + globalint_285 = arg1; + break; + case 13: + globalint_286 = arg1; + break; + case 14: + globalint_287 = arg1; + break; + case 15: + globalint_288 = arg1; + break; + case 16: + globalint_289 = arg1; + break; + case 17: + globalint_290 = arg1; + break; + case 18: + globalint_291 = arg1; + break; + case 19: + globalint_292 = arg1; + break; + case 20: + globalint_293 = arg1; + break; + case 21: + globalint_294 = arg1; + break; + case 22: + globalint_295 = arg1; + break; + case 23: + globalint_296 = arg1; + break; + case 24: + globalint_297 = arg1; + break; + case 25: + globalint_298 = arg1; + break; + case 26: + globalint_299 = arg1; + break; + case 27: + globalint_300 = arg1; + break; + case 28: + globalint_301 = arg1; + break; + case 29: + globalint_302 = arg1; + break; + case 30: + globalint_303 = arg1; + break; + case 31: + globalint_304 = arg1; + break; + case 32: + globalint_305 = arg1; + break; + case 33: + globalint_306 = arg1; + break; + case 34: + globalint_307 = arg1; + break; + case 35: + globalint_308 = arg1; + break; + case 36: + globalint_309 = arg1; + break; + case 37: + globalint_310 = arg1; + break; + case 38: + globalint_311 = arg1; + break; + case 39: + globalint_312 = arg1; + break; + case 40: + globalint_313 = arg1; + break; + case 41: + globalint_314 = arg1; + break; + case 42: + globalint_315 = arg1; + break; + case 43: + globalint_316 = arg1; + break; + case 44: + globalint_317 = arg1; + break; + case 45: + globalint_318 = arg1; + break; + case 46: + globalint_319 = arg1; + break; + case 47: + globalint_320 = arg1; + break; + case 48: + globalint_321 = arg1; + break; + case 49: + globalint_322 = arg1; + break; + case 50: + globalint_323 = arg1; + break; + case 51: + globalint_324 = arg1; + break; + case 52: + globalint_325 = arg1; + break; + case 53: + globalint_326 = arg1; + break; + case 54: + globalint_327 = arg1; + break; + case 55: + globalint_328 = arg1; + break; + case 56: + globalint_329 = arg1; + break; + case 57: + globalint_330 = arg1; + break; + case 58: + globalint_331 = arg1; + break; + case 59: + globalint_332 = arg1; + break; + case 60: + globalint_333 = arg1; + break; + case 61: + globalint_334 = arg1; + break; + case 62: + globalint_335 = arg1; + break; + case 63: + globalint_336 = arg1; + break; + case 64: + globalint_337 = arg1; + break; + case 65: + globalint_338 = arg1; + break; + case 66: + globalint_339 = arg1; + break; + case 67: + globalint_340 = arg1; + break; + case 68: + globalint_341 = arg1; + break; + case 69: + globalint_342 = arg1; + break; + case 70: + globalint_343 = arg1; + break; + case 71: + globalint_344 = arg1; + break; + case 72: + globalint_345 = arg1; + break; + case 73: + globalint_346 = arg1; + break; + case 74: + globalint_347 = arg1; + break; + case 75: + globalint_348 = arg1; + break; + case 76: + globalint_349 = arg1; + break; + case 77: + globalint_350 = arg1; + break; + case 78: + globalint_351 = arg1; + break; + case 79: + globalint_352 = arg1; + break; + case 80: + globalint_353 = arg1; + break; + case 81: + globalint_354 = arg1; + break; + case 82: + globalint_355 = arg1; + break; + case 83: + globalint_356 = arg1; + break; + case 84: + globalint_357 = arg1; + break; + case 85: + globalint_358 = arg1; + break; + case 86: + globalint_359 = arg1; + break; + case 87: + globalint_360 = arg1; + break; + case 88: + globalint_361 = arg1; + break; + case 89: + globalint_362 = arg1; + break; + case 90: + globalint_363 = arg1; + break; + case 91: + globalint_364 = arg1; + break; + case 92: + globalint_365 = arg1; + break; + case 93: + globalint_366 = arg1; + break; + case 94: + globalint_367 = arg1; + break; + case 95: + globalint_368 = arg1; + break; + case 96: + globalint_369 = arg1; + break; + case 97: + globalint_370 = arg1; + break; + case 98: + globalint_371 = arg1; + break; + case 99: + globalint_372 = arg1; + break; + case 100: + globalint_373 = arg1; + break; + case 101: + globalint_374 = arg1; + break; + case 102: + globalint_375 = arg1; + break; + case 103: + globalint_376 = arg1; + break; + case 104: + globalint_377 = arg1; + break; + case 105: + globalint_378 = arg1; + break; + case 106: + globalint_379 = arg1; + break; + case 107: + globalint_380 = arg1; + break; + case 108: + globalint_381 = arg1; + break; + case 109: + globalint_382 = arg1; + break; + case 110: + globalint_383 = arg1; + break; + case 111: + globalint_384 = arg1; + break; + case 112: + globalint_385 = arg1; + break; + case 113: + globalint_386 = arg1; + break; + case 114: + globalint_387 = arg1; + break; + case 115: + globalint_388 = arg1; + break; + case 116: + globalint_389 = arg1; + break; + case 117: + globalint_390 = arg1; + break; + case 118: + globalint_391 = arg1; + break; + case 119: + globalint_392 = arg1; + break; + case 120: + globalint_393 = arg1; + break; + case 121: + globalint_394 = arg1; + break; + case 122: + globalint_395 = arg1; + break; + case 123: + globalint_396 = arg1; + break; + case 124: + globalint_397 = arg1; + break; + case 125: + globalint_398 = arg1; + break; + case 126: + globalint_399 = arg1; + break; + case 127: + globalint_400 = arg1; + break; + case 128: + globalint_401 = arg1; + break; + case 129: + globalint_402 = arg1; + break; + case 130: + globalint_403 = arg1; + break; + case 131: + globalint_404 = arg1; + break; + case 132: + globalint_405 = arg1; + break; + case 133: + globalint_406 = arg1; + break; + case 134: + globalint_407 = arg1; + break; + case 135: + globalint_408 = arg1; + break; + case 136: + globalint_409 = arg1; + break; + case 137: + globalint_410 = arg1; + break; + case 138: + globalint_411 = arg1; + break; + case 139: + globalint_412 = arg1; + break; + case 140: + globalint_413 = arg1; + break; + case 141: + globalint_414 = arg1; + break; + case 142: + globalint_415 = arg1; + break; + case 143: + globalint_416 = arg1; + break; + case 144: + globalint_417 = arg1; + break; + case 145: + globalint_418 = arg1; + break; + case 146: + globalint_419 = arg1; + break; + case 147: + globalint_420 = arg1; + break; + case 148: + globalint_421 = arg1; + break; + case 149: + globalint_422 = arg1; + break; + case 150: + globalint_423 = arg1; + break; + case 151: + globalint_424 = arg1; + break; + case 152: + globalint_425 = arg1; + break; + case 153: + globalint_426 = arg1; + break; + case 154: + globalint_427 = arg1; + break; + case 155: + globalint_428 = arg1; + break; + case 156: + globalint_429 = arg1; + break; + case 157: + globalint_430 = arg1; + break; + case 158: + globalint_431 = arg1; + break; + case 159: + globalint_432 = arg1; + break; + case 160: + globalint_433 = arg1; + break; + case 161: + globalint_434 = arg1; + break; + case 162: + globalint_435 = arg1; + break; + case 163: + globalint_436 = arg1; + break; + case 164: + globalint_437 = arg1; + break; + case 165: + globalint_438 = arg1; + break; + case 166: + globalint_439 = arg1; + break; + case 167: + globalint_440 = arg1; + break; + case 168: + globalint_441 = arg1; + break; + case 169: + globalint_442 = arg1; + break; + case 170: + globalint_443 = arg1; + break; + case 171: + globalint_444 = arg1; + break; + case 172: + globalint_445 = arg1; + break; + case 173: + globalint_446 = arg1; + break; + case 174: + globalint_447 = arg1; + break; + case 175: + globalint_448 = arg1; + break; + case 176: + globalint_449 = arg1; + break; + case 177: + globalint_450 = arg1; + break; + case 178: + globalint_451 = arg1; + break; + case 179: + globalint_452 = arg1; + break; + case 180: + globalint_453 = arg1; + break; + case 181: + globalint_454 = arg1; + break; + case 182: + globalint_455 = arg1; + break; + case 183: + globalint_456 = arg1; + break; + case 184: + globalint_457 = arg1; + break; + case 185: + globalint_458 = arg1; + break; + case 186: + globalint_459 = arg1; + break; + case 187: + globalint_460 = arg1; + break; + case 188: + globalint_461 = arg1; + break; + case 189: + globalint_462 = arg1; + break; + case 190: + globalint_463 = arg1; + break; + case 191: + globalint_464 = arg1; + break; + case 192: + globalint_465 = arg1; + break; + case 193: + globalint_466 = arg1; + break; + case 194: + globalint_467 = arg1; + break; + case 195: + globalint_468 = arg1; + break; + case 196: + globalint_469 = arg1; + break; + case 197: + globalint_470 = arg1; + break; + case 198: + globalint_471 = arg1; + break; + case 199: + globalint_472 = arg1; + break; + case 200: + globalint_473 = arg1; + break; + case 201: + globalint_474 = arg1; + break; + case 202: + globalint_475 = arg1; + break; + case 203: + globalint_476 = arg1; + break; + case 204: + globalint_477 = arg1; + break; + case 205: + globalint_478 = arg1; + break; + case 206: + globalint_479 = arg1; + break; + case 207: + globalint_480 = arg1; + break; + case 208: + globalint_481 = arg1; + break; + case 209: + globalint_482 = arg1; + break; + case 210: + globalint_483 = arg1; + break; + case 211: + globalint_484 = arg1; + break; + case 212: + globalint_485 = arg1; + break; + case 213: + globalint_486 = arg1; + break; + case 214: + globalint_487 = arg1; + break; + case 215: + globalint_488 = arg1; + break; + case 216: + globalint_489 = arg1; + break; + case 217: + globalint_490 = arg1; + break; + case 218: + globalint_491 = arg1; + break; + case 219: + globalint_492 = arg1; + break; + case 220: + globalint_493 = arg1; + break; + case 221: + globalint_494 = arg1; + break; + case 222: + globalint_495 = arg1; + break; + case 223: + globalint_496 = arg1; + break; + case 224: + globalint_497 = arg1; + break; + case 225: + globalint_498 = arg1; + break; + case 226: + globalint_499 = arg1; + break; + case 227: + globalint_500 = arg1; + break; + case 228: + globalint_501 = arg1; + break; + case 229: + globalint_502 = arg1; + break; + case 230: + globalint_503 = arg1; + break; + case 231: + globalint_504 = arg1; + break; + case 232: + globalint_505 = arg1; + break; + case 233: + globalint_506 = arg1; + break; + case 234: + globalint_507 = arg1; + break; + case 235: + globalint_508 = arg1; + break; + case 236: + globalint_509 = arg1; + break; + case 237: + globalint_510 = arg1; + break; + case 238: + globalint_511 = arg1; + break; + case 239: + globalint_512 = arg1; + break; + case 240: + globalint_513 = arg1; + break; + case 241: + globalint_514 = arg1; + break; + case 242: + globalint_515 = arg1; + break; + case 243: + globalint_516 = arg1; + break; + case 244: + globalint_517 = arg1; + break; + case 245: + globalint_518 = arg1; + break; + case 246: + globalint_519 = arg1; + break; + case 247: + globalint_520 = arg1; + break; + case 248: + globalint_521 = arg1; + break; + case 249: + globalint_522 = arg1; + } + return; +} diff --git a/dumps/scripts/1385.cs2 b/dumps/scripts/1385.cs2 new file mode 100644 index 000000000..b0e498703 --- /dev/null +++ b/dumps/scripts/1385.cs2 @@ -0,0 +1,6 @@ +void script_1385() { + script_1309(0); + setWidgetSprite(2201, new WidgetPointer(746,176)); + script_1308(); + return; +} diff --git a/dumps/scripts/1386.cs2 b/dumps/scripts/1386.cs2 new file mode 100644 index 000000000..1d84e0717 --- /dev/null +++ b/dumps/scripts/1386.cs2 @@ -0,0 +1,6 @@ +void script_1386() { + script_1312(0); + setWidgetSprite(2201, new WidgetPointer(548,182)); + script_1311(); + return; +} diff --git a/dumps/scripts/1387.cs2 b/dumps/scripts/1387.cs2 new file mode 100644 index 000000000..9fdb99828 --- /dev/null +++ b/dumps/scripts/1387.cs2 @@ -0,0 +1,274 @@ +void script_1387(int arg0) { + if (((boolean)globalint_1413) && (arg0 != 99)) { + return; + } + script_4249(arg0); + if (getDisplayMode() >= 2) { + if (isWidgetOpen(new WidgetPointer(746,87))) { + if ((arg0 != 98) || isWidgetOpen(new WidgetPointer(746,88))) { + setWidgetIsHidden(false, new WidgetPointer(746,87)); + setWidgetIsHidden(true, new WidgetPointer(746,88)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + setWidgetIsHidden(true, new WidgetPointer(746,89)); + } else { + setWidgetIsHidden(true, new WidgetPointer(746,87)); + setWidgetIsHidden(false, new WidgetPointer(746,88)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + setWidgetIsHidden(true, new WidgetPointer(746,89)); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(746,87)); + setWidgetIsHidden(false, new WidgetPointer(746,89)); + if (arg0 != 2) { + script_1659(); + } + switch (arg0) { + case 0: + setWidgetSprite(1836, new WidgetPointer(746,39)); + setWidgetIsHidden(false, new WidgetPointer(746,90)); + setWidgetSprite(1841, new WidgetPointer(746,132)); + setWidgetSprite(1840, new WidgetPointer(746,133)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 1: + setWidgetSprite(1836, new WidgetPointer(746,40)); + setWidgetIsHidden(false, new WidgetPointer(746,91)); + setWidgetSprite(1841, new WidgetPointer(746,134)); + setWidgetSprite(1840, new WidgetPointer(746,135)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 2: + setWidgetSprite(1836, new WidgetPointer(746,41)); + setWidgetSprite(1841, new WidgetPointer(746,136)); + setWidgetSprite(1840, new WidgetPointer(746,137)); + setWidgetIsHidden(false, new WidgetPointer(746,92)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + script_1658(); + break; + case 3: + setWidgetSprite(1836, new WidgetPointer(746,42)); + setWidgetSprite(1841, new WidgetPointer(746,138)); + setWidgetSprite(1840, new WidgetPointer(746,139)); + setWidgetIsHidden(false, new WidgetPointer(746,93)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 4: + setWidgetSprite(1836, new WidgetPointer(746,43)); + setWidgetSprite(1841, new WidgetPointer(746,140)); + setWidgetSprite(1840, new WidgetPointer(746,141)); + setWidgetIsHidden(false, new WidgetPointer(746,94)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 5: + setWidgetSprite(1836, new WidgetPointer(746,44)); + setWidgetSprite(1841, new WidgetPointer(746,142)); + setWidgetSprite(1840, new WidgetPointer(746,143)); + setWidgetIsHidden(false, new WidgetPointer(746,95)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 6: + setWidgetSprite(1836, new WidgetPointer(746,45)); + setWidgetSprite(1841, new WidgetPointer(746,144)); + setWidgetSprite(1840, new WidgetPointer(746,145)); + setWidgetIsHidden(false, new WidgetPointer(746,96)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 7: + setWidgetSprite(1836, new WidgetPointer(746,46)); + setWidgetSprite(1841, new WidgetPointer(746,146)); + setWidgetSprite(1840, new WidgetPointer(746,147)); + setWidgetIsHidden(false, new WidgetPointer(746,97)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 8: + setWidgetSprite(1836, new WidgetPointer(746,47)); + setWidgetSprite(1841, new WidgetPointer(746,148)); + setWidgetSprite(1840, new WidgetPointer(746,149)); + setWidgetIsHidden(false, new WidgetPointer(746,98)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 9: + setWidgetSprite(1836, new WidgetPointer(746,48)); + setWidgetSprite(1841, new WidgetPointer(746,150)); + setWidgetSprite(1840, new WidgetPointer(746,151)); + setWidgetIsHidden(false, new WidgetPointer(746,99)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 10: + setWidgetSprite(1836, new WidgetPointer(746,49)); + setWidgetSprite(1841, new WidgetPointer(746,152)); + setWidgetSprite(1840, new WidgetPointer(746,153)); + setWidgetIsHidden(false, new WidgetPointer(746,100)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 11: + setWidgetSprite(1836, new WidgetPointer(746,50)); + setWidgetSprite(1841, new WidgetPointer(746,154)); + setWidgetSprite(1840, new WidgetPointer(746,155)); + setWidgetIsHidden(false, new WidgetPointer(746,101)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 12: + setWidgetSprite(1836, new WidgetPointer(746,51)); + setWidgetSprite(1841, new WidgetPointer(746,156)); + setWidgetSprite(1840, new WidgetPointer(746,157)); + setWidgetIsHidden(false, new WidgetPointer(746,102)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 13: + setWidgetSprite(1836, new WidgetPointer(746,52)); + setWidgetSprite(1841, new WidgetPointer(746,158)); + setWidgetSprite(1840, new WidgetPointer(746,159)); + setWidgetIsHidden(false, new WidgetPointer(746,103)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 14: + setWidgetSprite(1836, new WidgetPointer(746,53)); + setWidgetSprite(1841, new WidgetPointer(746,160)); + setWidgetSprite(1840, new WidgetPointer(746,161)); + setWidgetIsHidden(false, new WidgetPointer(746,104)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 15: + setWidgetSprite(1836, new WidgetPointer(746,54)); + setWidgetSprite(1841, new WidgetPointer(746,162)); + setWidgetSprite(1840, new WidgetPointer(746,163)); + setWidgetIsHidden(false, new WidgetPointer(746,105)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 98: + setWidgetIsHidden(false, new WidgetPointer(746,88)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 95: + setWidgetIsHidden(false, new WidgetPointer(746,107)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + break; + case 99: + setWidgetIsHidden(false, new WidgetPointer(746,108)); + setWidgetIsHidden(false, new WidgetPointer(746,86)); + } + } + } else if (isWidgetOpen(new WidgetPointer(548,199))) { + if ((arg0 != 98) || isWidgetOpen(new WidgetPointer(548,200))) { + setWidgetIsHidden(false, new WidgetPointer(548,199)); + setWidgetIsHidden(true, new WidgetPointer(548,200)); + setWidgetIsHidden(true, new WidgetPointer(548,201)); + } else { + setWidgetIsHidden(true, new WidgetPointer(548,199)); + setWidgetIsHidden(false, new WidgetPointer(548,200)); + setWidgetIsHidden(true, new WidgetPointer(548,201)); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(548,199)); + setWidgetIsHidden(false, new WidgetPointer(548,201)); + switch (arg0) { + case 0: + setWidgetSprite(1836, new WidgetPointer(548,129)); + setWidgetSprite(1841, new WidgetPointer(548,147)); + setWidgetSprite(1840, new WidgetPointer(548,148)); + setWidgetIsHidden(false, new WidgetPointer(548,204)); + break; + case 1: + setWidgetSprite(1836, new WidgetPointer(548,130)); + setWidgetSprite(1841, new WidgetPointer(548,149)); + setWidgetSprite(1840, new WidgetPointer(548,150)); + setWidgetIsHidden(false, new WidgetPointer(548,205)); + break; + case 2: + setWidgetSprite(1836, new WidgetPointer(548,131)); + setWidgetSprite(1841, new WidgetPointer(548,151)); + setWidgetSprite(1840, new WidgetPointer(548,152)); + setWidgetIsHidden(false, new WidgetPointer(548,206)); + script_1659(); + break; + case 3: + setWidgetSprite(1836, new WidgetPointer(548,132)); + setWidgetSprite(1841, new WidgetPointer(548,153)); + setWidgetSprite(1840, new WidgetPointer(548,154)); + setWidgetIsHidden(false, new WidgetPointer(548,207)); + break; + case 4: + setWidgetSprite(1836, new WidgetPointer(548,133)); + setWidgetSprite(1841, new WidgetPointer(548,155)); + setWidgetSprite(1840, new WidgetPointer(548,156)); + setWidgetIsHidden(false, new WidgetPointer(548,208)); + break; + case 5: + setWidgetSprite(1836, new WidgetPointer(548,134)); + setWidgetSprite(1841, new WidgetPointer(548,157)); + setWidgetSprite(1840, new WidgetPointer(548,158)); + setWidgetIsHidden(false, new WidgetPointer(548,209)); + break; + case 6: + setWidgetSprite(1836, new WidgetPointer(548,135)); + setWidgetSprite(1841, new WidgetPointer(548,159)); + setWidgetSprite(1840, new WidgetPointer(548,160)); + setWidgetIsHidden(false, new WidgetPointer(548,210)); + break; + case 7: + setWidgetSprite(1836, new WidgetPointer(548,136)); + setWidgetSprite(1841, new WidgetPointer(548,161)); + setWidgetSprite(1840, new WidgetPointer(548,162)); + setWidgetIsHidden(false, new WidgetPointer(548,211)); + break; + case 8: + setWidgetSprite(1836, new WidgetPointer(548,99)); + setWidgetSprite(1841, new WidgetPointer(548,83)); + setWidgetSprite(1840, new WidgetPointer(548,84)); + setWidgetIsHidden(false, new WidgetPointer(548,212)); + break; + case 9: + setWidgetSprite(1836, new WidgetPointer(548,100)); + setWidgetSprite(1841, new WidgetPointer(548,85)); + setWidgetSprite(1840, new WidgetPointer(548,86)); + setWidgetIsHidden(false, new WidgetPointer(548,213)); + break; + case 10: + setWidgetSprite(1836, new WidgetPointer(548,101)); + setWidgetSprite(1841, new WidgetPointer(548,87)); + setWidgetSprite(1840, new WidgetPointer(548,88)); + setWidgetIsHidden(false, new WidgetPointer(548,214)); + break; + case 11: + setWidgetSprite(1836, new WidgetPointer(548,102)); + setWidgetSprite(1841, new WidgetPointer(548,89)); + setWidgetSprite(1840, new WidgetPointer(548,90)); + setWidgetIsHidden(false, new WidgetPointer(548,215)); + break; + case 12: + setWidgetSprite(1836, new WidgetPointer(548,103)); + setWidgetSprite(1841, new WidgetPointer(548,91)); + setWidgetSprite(1840, new WidgetPointer(548,92)); + setWidgetIsHidden(false, new WidgetPointer(548,216)); + break; + case 13: + setWidgetSprite(1836, new WidgetPointer(548,104)); + setWidgetSprite(1841, new WidgetPointer(548,93)); + setWidgetSprite(1840, new WidgetPointer(548,94)); + setWidgetIsHidden(false, new WidgetPointer(548,217)); + break; + case 14: + setWidgetSprite(1836, new WidgetPointer(548,105)); + setWidgetSprite(1841, new WidgetPointer(548,95)); + setWidgetSprite(1840, new WidgetPointer(548,96)); + setWidgetIsHidden(false, new WidgetPointer(548,218)); + break; + case 15: + setWidgetSprite(1836, new WidgetPointer(548,106)); + setWidgetSprite(1841, new WidgetPointer(548,97)); + setWidgetSprite(1840, new WidgetPointer(548,98)); + setWidgetIsHidden(false, new WidgetPointer(548,219)); + break; + case 98: + setWidgetIsHidden(false, new WidgetPointer(548,200)); + break; + case 95: + setWidgetIsHidden(false, new WidgetPointer(548,221)); + break; + case 99: + setWidgetIsHidden(false, new WidgetPointer(548,222)); + } + } + return; +} diff --git a/dumps/scripts/1388.cs2 b/dumps/scripts/1388.cs2 new file mode 100644 index 000000000..6756fd4ee --- /dev/null +++ b/dumps/scripts/1388.cs2 @@ -0,0 +1,44 @@ +void script_1388(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(271,6)); + ivar1 = 5; + ivar2 = 15; + ivar3 = 15; + ivar4 = 0; + ivar5 = 6; + ivar6 = 28; + ivar7 = 30; + if (((boolean)bitconfig_6840)) { + ivar7 = 20; + } + while (ivar4 < ivar7) { + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetSize(ivar2, ivar3, 0, 0); + cs2method1107(1); + setWidgetPosition(ivar5, ivar6, 0, 0); + if (((boolean)script_2297(ivar4))) { + setWidgetContextMenuOption(1, "Select" + ""); + setWidgetSprite(180); + } else { + setWidgetContextMenuOption(1, "Deselect" + ""); + setWidgetSprite(181); + } + setScriptCallOnClickContextMenu(2290, new WidgetPointer(-32768,3), -2147483643, "Ii"); + setScriptCallOnConfigChange(2291, new WidgetPointer(-32768,3), -2147483643, 1397, 1587, 2, "IiY"); + ivar4 = add(ivar4, 1); + if (((boolean)mod(ivar4, ivar1))) { + ivar5 = 6; + ivar6 = add(ivar6, 35); + } else { + ivar5 = add(ivar5, 37); + } + } + return; +} diff --git a/dumps/scripts/1389.cs2 b/dumps/scripts/1389.cs2 new file mode 100644 index 000000000..fc86f259c --- /dev/null +++ b/dumps/scripts/1389.cs2 @@ -0,0 +1,4 @@ +void script_1389() { + script_1186(); + return; +} diff --git a/dumps/scripts/139.cs2 b/dumps/scripts/139.cs2 new file mode 100644 index 000000000..3abbf8112 --- /dev/null +++ b/dumps/scripts/139.cs2 @@ -0,0 +1,5 @@ +void script_139(int arg0) { + setScriptCallOnAnyWidgetOpenAndClose(140, "", new WidgetPointer(arg0)); + script_1364(); + return; +} diff --git a/dumps/scripts/1390.cs2 b/dumps/scripts/1390.cs2 new file mode 100644 index 000000000..d0b67066c --- /dev/null +++ b/dumps/scripts/1390.cs2 @@ -0,0 +1,10 @@ +void script_1390(int arg0,int arg1,string arg2) { + setWidgetPosition(script_1551(globalint_1098, 494, getWidgetActualX(new WidgetPointer(arg0)), arg2), 1, 0, 1, new WidgetPointer(arg1)); + if (hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + setScriptCallOnGameloop(1391, getClientCycle(), new WidgetPointer(arg1), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1391.cs2 b/dumps/scripts/1391.cs2 new file mode 100644 index 000000000..687c60029 --- /dev/null +++ b/dumps/scripts/1391.cs2 @@ -0,0 +1,13 @@ +void script_1391(int arg0,int arg1) { + if (cs2method3751()) { + setWidgetText(new WidgetPointer(912,24), ""); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + return; + } + if ((mod(subtract(getClientCycle(), arg0), 40) < 20) && hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1392.cs2 b/dumps/scripts/1392.cs2 new file mode 100644 index 000000000..b079c54b9 --- /dev/null +++ b/dumps/scripts/1392.cs2 @@ -0,0 +1,49 @@ +void script_1392() { + int ivar0; + ivar0 = rndExcl(4); + if (((boolean)ivar0)) { + setWidgetPosition(59, 9, 0, 0, new WidgetPointer(188,2)); + setWidgetPosition(59, 50, 0, 0, new WidgetPointer(188,3)); + setWidgetPosition(139, 9, 0, 0, new WidgetPointer(188,4)); + setWidgetPosition(139, 50, 0, 0, new WidgetPointer(188,5)); + setWidgetPosition(219, 9, 0, 0, new WidgetPointer(188,6)); + setWidgetPosition(219, 50, 0, 0, new WidgetPointer(188,7)); + setWidgetPosition(319, 9, 0, 0, new WidgetPointer(188,8)); + setWidgetPosition(319, 50, 0, 0, new WidgetPointer(188,9)); + return; + } + if (((boolean)ivar0)) { + setWidgetPosition(59, 9, 0, 0, new WidgetPointer(188,3)); + setWidgetPosition(59, 50, 0, 0, new WidgetPointer(188,4)); + setWidgetPosition(139, 9, 0, 0, new WidgetPointer(188,5)); + setWidgetPosition(139, 50, 0, 0, new WidgetPointer(188,2)); + setWidgetPosition(219, 9, 0, 0, new WidgetPointer(188,7)); + setWidgetPosition(219, 50, 0, 0, new WidgetPointer(188,8)); + setWidgetPosition(319, 9, 0, 0, new WidgetPointer(188,9)); + setWidgetPosition(319, 50, 0, 0, new WidgetPointer(188,6)); + return; + } + if (ivar0 == 2) { + setWidgetPosition(59, 9, 0, 0, new WidgetPointer(188,4)); + setWidgetPosition(59, 50, 0, 0, new WidgetPointer(188,5)); + setWidgetPosition(139, 9, 0, 0, new WidgetPointer(188,2)); + setWidgetPosition(139, 50, 0, 0, new WidgetPointer(188,3)); + setWidgetPosition(219, 9, 0, 0, new WidgetPointer(188,8)); + setWidgetPosition(219, 50, 0, 0, new WidgetPointer(188,9)); + setWidgetPosition(319, 9, 0, 0, new WidgetPointer(188,6)); + setWidgetPosition(319, 50, 0, 0, new WidgetPointer(188,7)); + return; + } + if (ivar0 == 3) { + setWidgetPosition(59, 9, 0, 0, new WidgetPointer(188,5)); + setWidgetPosition(59, 50, 0, 0, new WidgetPointer(188,2)); + setWidgetPosition(139, 9, 0, 0, new WidgetPointer(188,3)); + setWidgetPosition(139, 50, 0, 0, new WidgetPointer(188,4)); + setWidgetPosition(219, 9, 0, 0, new WidgetPointer(188,9)); + setWidgetPosition(219, 50, 0, 0, new WidgetPointer(188,6)); + setWidgetPosition(319, 9, 0, 0, new WidgetPointer(188,7)); + setWidgetPosition(319, 50, 0, 0, new WidgetPointer(188,8)); + return; + } + return; +} diff --git a/dumps/scripts/1393.cs2 b/dumps/scripts/1393.cs2 new file mode 100644 index 000000000..cff71d83b --- /dev/null +++ b/dumps/scripts/1393.cs2 @@ -0,0 +1,16 @@ +int script_1393(int arg0) { + int ivar1; + if (arg0 <= 0) { + return -1; + } + arg0 = subtract(arg0, 1); + ivar1 = getItemContainerLength(94); + if (arg0 < ivar1) { + return getItemAmtInSlot(94, arg0); + } + arg0 = subtract(arg0, ivar1); + if (arg0 < getItemContainerLength(93)) { + return getItemAmtInSlot(93, arg0); + } + return -1; +} diff --git a/dumps/scripts/1394.cs2 b/dumps/scripts/1394.cs2 new file mode 100644 index 000000000..53a82f05b --- /dev/null +++ b/dumps/scripts/1394.cs2 @@ -0,0 +1,53 @@ +void script_1394() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + svar0 = ""; + ivar0 = 0; + ivar1 = 0; + if (((boolean)bitconfig_457)) { + svar0 = concat(svar0, "Ahrim" + "
"); + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + } + if (((boolean)bitconfig_458)) { + svar0 = concat(svar0, "Dharok" + "
"); + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + } + if (((boolean)bitconfig_459)) { + svar0 = concat(svar0, "Guthan" + "
"); + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + } + if (((boolean)bitconfig_460)) { + svar0 = concat(svar0, "Karil" + "
"); + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + } + if (((boolean)bitconfig_461)) { + svar0 = concat(svar0, "Torag" + "
"); + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + } + if (((boolean)bitconfig_462)) { + svar0 = concat(svar0, "Verac" + "
"); + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + } + if (((boolean)bitconfig_9873)) { + svar0 = concat(svar0, "Akrisae" + "
"); + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + } + if (((boolean)stringMethod4107(svar0, ""))) { + svar0 = "None"; + ivar0 = 1; + } + ivar2 = add(52, multiply(ivar0, 12)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(24,1)), ivar2, 0, 0, new WidgetPointer(24,1)); + setWidgetText(new WidgetPointer(24,3), svar0); + setWidgetText(new WidgetPointer(24,6), intToStr(max(0, subtract(bitconfig_464, ivar1)))); + return; +} diff --git a/dumps/scripts/1395.cs2 b/dumps/scripts/1395.cs2 new file mode 100644 index 000000000..b99b5be5c --- /dev/null +++ b/dumps/scripts/1395.cs2 @@ -0,0 +1,411 @@ +void script_1395() { + if (bitconfig_2140 >= 30) { + setWidgetIsHidden(false, new WidgetPointer(391,22)); + setWidgetIsHidden(false, new WidgetPointer(391,24)); + } else { + setWidgetIsHidden(true, new WidgetPointer(391,22)); + setWidgetIsHidden(true, new WidgetPointer(391,24)); + } + setWidgetText(new WidgetPointer(391,115), intToStr(bitconfig_74)); + if (bitconfig_83 > 0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,87)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,87)); + } + if (bitconfig_83 > 1) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,88)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,88)); + } + if (bitconfig_83 > 2) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,89)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,89)); + } + if (bitconfig_83 > 3) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,91)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,91)); + } + if (bitconfig_83 > 4) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,92)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,92)); + } + if (bitconfig_83 > 5) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,93)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,93)); + } + if (bitconfig_83 > 6) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,94)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,94)); + } + if (bitconfig_83 > 7) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,95)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,95)); + } + if (bitconfig_83 > 8) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,96)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,96)); + } + if (bitconfig_83 > 9) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,97)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,97)); + } + if (bitconfig_84 > 0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,44)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,44)); + } + if (bitconfig_84 > 1) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,45)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,45)); + } + if (bitconfig_84 > 2) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,46)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,46)); + } + if (bitconfig_84 > 3) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,47)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,47)); + } + if (bitconfig_84 > 4) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,48)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,48)); + } + if (bitconfig_84 > 5) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,49)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,49)); + } + if (bitconfig_84 > 6) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,50)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,50)); + } + if (bitconfig_84 > 7) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,51)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,51)); + } + if (bitconfig_84 > 8) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,52)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,52)); + } + if (bitconfig_84 > 9) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,53)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,53)); + } + if (bitconfig_82 > 0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,74)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,74)); + } + if (bitconfig_82 > 1) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,75)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,75)); + } + if (bitconfig_82 > 2) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,76)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,76)); + } + if (bitconfig_82 > 3) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,77)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,77)); + } + if (bitconfig_82 > 4) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,78)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,78)); + } + if (bitconfig_82 > 5) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,79)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,79)); + } + if (bitconfig_82 > 6) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,80)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,80)); + } + if (bitconfig_82 > 7) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,81)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,81)); + } + if (bitconfig_82 > 8) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,82)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,82)); + } + if (bitconfig_82 > 9) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,83)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,83)); + } + if (bitconfig_81 > 0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,58)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,58)); + } + if (bitconfig_81 > 1) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,59)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,59)); + } + if (bitconfig_81 > 2) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,60)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,60)); + } + if (bitconfig_81 > 3) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,61)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,61)); + } + if (bitconfig_81 > 4) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,62)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,62)); + } + if (bitconfig_81 > 5) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,63)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,63)); + } + if (bitconfig_81 > 6) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,64)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,64)); + } + if (bitconfig_81 > 7) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,65)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,65)); + } + if (bitconfig_81 > 8) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,66)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,66)); + } + if (bitconfig_81 > 9) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,70)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,70)); + } + if (bitconfig_2131 > 0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,124)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,124)); + } + if (bitconfig_2131 > 1) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,125)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,125)); + } + if (bitconfig_2131 > 2) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,126)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,126)); + } + if (bitconfig_2131 > 3) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,127)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,127)); + } + if (bitconfig_2131 > 4) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,128)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,128)); + } + if (bitconfig_2131 > 5) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,129)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,129)); + } + if (bitconfig_2131 > 6) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,130)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,130)); + } + if (bitconfig_2131 > 7) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,131)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,131)); + } + if (bitconfig_2131 > 8) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,132)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,132)); + } + if (bitconfig_2131 > 9) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,133)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,133)); + } + if (bitconfig_2132 > 0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,145)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,145)); + } + if (bitconfig_2132 > 1) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,146)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,146)); + } + if (bitconfig_2132 > 2) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,147)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,147)); + } + if (bitconfig_2132 > 3) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,148)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,148)); + } + if (bitconfig_2132 > 4) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,149)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,149)); + } + if (bitconfig_2132 > 5) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,150)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,150)); + } + if (bitconfig_2132 > 6) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,151)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,151)); + } + if (bitconfig_2132 > 7) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,152)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,152)); + } + if (bitconfig_2132 > 8) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,153)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,153)); + } + if (bitconfig_2132 > 9) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,154)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,154)); + } + if (standart_config_1888 > 0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,98)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,98)); + } + if (standart_config_1888 > 1) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,99)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,99)); + } + if (standart_config_1888 > 2) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,100)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,100)); + } + if (standart_config_1888 > 3) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,101)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,101)); + } + if (standart_config_1888 > 4) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,104)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,104)); + } + if (standart_config_1888 > 5) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,105)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,105)); + } + if (standart_config_1888 > 6) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,106)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,106)); + } + if (standart_config_1888 > 7) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,107)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,107)); + } + if (standart_config_1888 > 8) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,108)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,108)); + } + if (standart_config_1888 > 9) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,109)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,109)); + } + if (standart_config_1888 > 10) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,110)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,110)); + } + if (standart_config_1888 > 11) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,111)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,111)); + } + if (standart_config_1888 > 12) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,112)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,112)); + } + if (standart_config_1888 > 13) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,113)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,113)); + } + if (standart_config_1888 > 14) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(391,114)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(391,114)); + } + if (((boolean)bitconfig_2134)) { + setWidgetSprite(180, new WidgetPointer(391,155)); + setWidgetSprite(181, new WidgetPointer(391,157)); + } else { + setWidgetSprite(181, new WidgetPointer(391,155)); + setWidgetSprite(180, new WidgetPointer(391,157)); + } + if (((boolean)bitconfig_2133)) { + setWidgetSprite(181, new WidgetPointer(391,134)); + setWidgetSprite(180, new WidgetPointer(391,135)); + setWidgetSprite(180, new WidgetPointer(391,136)); + } else if (((boolean)bitconfig_2133)) { + setWidgetSprite(180, new WidgetPointer(391,134)); + setWidgetSprite(181, new WidgetPointer(391,135)); + setWidgetSprite(180, new WidgetPointer(391,136)); + } else { + setWidgetSprite(180, new WidgetPointer(391,134)); + setWidgetSprite(180, new WidgetPointer(391,135)); + setWidgetSprite(181, new WidgetPointer(391,136)); + } + if (((boolean)bitconfig_135)) { + setWidgetSprite(180, new WidgetPointer(391,120)); + } else { + setWidgetSprite(181, new WidgetPointer(391,120)); + } + return; +} diff --git a/dumps/scripts/1396.cs2 b/dumps/scripts/1396.cs2 new file mode 100644 index 000000000..25986361f --- /dev/null +++ b/dumps/scripts/1396.cs2 @@ -0,0 +1,4 @@ +void script_1396(int arg0,string arg1,string arg2) { + setScriptCallOnMousePressed(1338, arg1, arg2, arg0, "ss1", new WidgetPointer(445,2)); + return; +} diff --git a/dumps/scripts/1397.cs2 b/dumps/scripts/1397.cs2 new file mode 100644 index 000000000..608ca95e1 --- /dev/null +++ b/dumps/scripts/1397.cs2 @@ -0,0 +1,48 @@ +void script_1397() { + if (((boolean)bitconfig_1412)) { + setWidgetModel(10112, new WidgetPointer(282,19)); + } else { + setWidgetModel(10111, new WidgetPointer(282,19)); + } + if (bitconfig_1412 == 24) { + setWidgetModel(10114, new WidgetPointer(282,20)); + } else { + setWidgetModel(10113, new WidgetPointer(282,20)); + } + if (bitconfig_1412 == 32) { + setWidgetModel(10110, new WidgetPointer(282,18)); + } else { + setWidgetModel(10109, new WidgetPointer(282,18)); + } + if (bitconfig_1412 == 48) { + setWidgetModel(10108, new WidgetPointer(282,17)); + } else { + setWidgetModel(10107, new WidgetPointer(282,17)); + } + if (bitconfig_1412 == 56) { + setWidgetModel(10106, new WidgetPointer(282,16)); + } else { + setWidgetModel(10105, new WidgetPointer(282,16)); + } + if (bitconfig_1412 == 60) { + setWidgetModel(10104, new WidgetPointer(282,15)); + } else { + setWidgetModel(10103, new WidgetPointer(282,15)); + } + if (bitconfig_1412 == 62) { + setWidgetModel(10102, new WidgetPointer(282,14)); + } else { + setWidgetModel(10101, new WidgetPointer(282,14)); + } + if (bitconfig_1412 == 63) { + setWidgetModel(10100, new WidgetPointer(282,13)); + } else { + setWidgetModel(10099, new WidgetPointer(282,13)); + } + if (((boolean)bitconfig_1413)) { + setWidgetModel(10116, new WidgetPointer(282,12)); + } else { + setWidgetModel(10115, new WidgetPointer(282,12)); + } + return; +} diff --git a/dumps/scripts/1398.cs2 b/dumps/scripts/1398.cs2 new file mode 100644 index 000000000..557e43915 --- /dev/null +++ b/dumps/scripts/1398.cs2 @@ -0,0 +1,12 @@ +void script_1398(int arg0,int arg1) { + setWidgetModel(10111, new WidgetPointer(282,19)); + setWidgetModel(10113, new WidgetPointer(282,20)); + setWidgetModel(10109, new WidgetPointer(282,18)); + setWidgetModel(10107, new WidgetPointer(282,17)); + setWidgetModel(10105, new WidgetPointer(282,16)); + setWidgetModel(10103, new WidgetPointer(282,15)); + setWidgetModel(10101, new WidgetPointer(282,14)); + setWidgetModel(10099, new WidgetPointer(282,13)); + setWidgetModel(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1399.cs2 b/dumps/scripts/1399.cs2 new file mode 100644 index 000000000..6315a18d4 --- /dev/null +++ b/dumps/scripts/1399.cs2 @@ -0,0 +1,4 @@ +void script_1399(int arg0,int arg1) { + setWidgetModel(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/14.cs2 b/dumps/scripts/14.cs2 new file mode 100644 index 000000000..7c750cfa7 --- /dev/null +++ b/dumps/scripts/14.cs2 @@ -0,0 +1,157 @@ +cs2func_script_14_struct(2,2,0) script_14(int arg0,int arg1,int arg2) { + int stack_dump0; + int stack_dump1; + cs2func_script_982_struct(2,2,0) structdump_2; + cs2func_script_984_struct(2,2,0) structdump_3; + cs2func_script_978_struct(2,2,0) structdump_4; + cs2func_script_1010_struct(2,2,0) structdump_5; + cs2func_script_1004_struct(2,2,0) structdump_6; + cs2func_script_996_struct(2,2,0) structdump_7; + cs2func_script_994_struct(2,2,0) structdump_8; + cs2func_script_1008_struct(2,2,0) structdump_9; + cs2func_script_1002_struct(2,2,0) structdump_10; + cs2func_script_992_struct(2,2,0) structdump_11; + cs2func_script_1000_struct(2,2,0) structdump_12; + cs2func_script_980_struct(2,2,0) structdump_13; + cs2func_script_1016_struct(2,2,0) structdump_14; + cs2func_script_1022_struct(2,2,0) structdump_15; + cs2func_script_998_struct(2,2,0) structdump_16; + cs2func_script_1018_struct(2,2,0) structdump_17; + cs2func_script_986_struct(2,2,0) structdump_18; + cs2func_script_990_struct(2,2,0) structdump_19; + cs2func_script_1012_struct(2,2,0) structdump_20; + cs2func_script_988_struct(2,2,0) structdump_21; + cs2func_script_1014_struct(2,2,0) structdump_22; + cs2func_script_3_struct(2,2,0) structdump_23; + cs2func_script_1006_struct(2,2,0) structdump_24; + cs2func_script_1020_struct(2,2,0) structdump_25; + cs2func_script_3355_struct(2,2,0) structdump_26; + switch (arg0) { + case 1: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_2 = script_982(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_2.intpart_0, structdump_2.intpart_1, structdump_2.stringpart_0, structdump_2.stringpart_1); + case 2: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_3 = script_984(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_3.intpart_0, structdump_3.intpart_1, structdump_3.stringpart_0, structdump_3.stringpart_1); + case 5: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_4 = script_978(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_4.intpart_0, structdump_4.intpart_1, structdump_4.stringpart_0, structdump_4.stringpart_1); + case 3: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_5 = script_1010(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_5.intpart_0, structdump_5.intpart_1, structdump_5.stringpart_0, structdump_5.stringpart_1); + case 7: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_6 = script_1004(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_6.intpart_0, structdump_6.intpart_1, structdump_6.stringpart_0, structdump_6.stringpart_1); + case 4: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_7 = script_996(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_7.intpart_0, structdump_7.intpart_1, structdump_7.stringpart_0, structdump_7.stringpart_1); + case 6: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_8 = script_994(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_8.intpart_0, structdump_8.intpart_1, structdump_8.stringpart_0, structdump_8.stringpart_1); + case 8: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_9 = script_1008(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_9.intpart_0, structdump_9.intpart_1, structdump_9.stringpart_0, structdump_9.stringpart_1); + case 9: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_10 = script_1002(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_10.intpart_0, structdump_10.intpart_1, structdump_10.stringpart_0, structdump_10.stringpart_1); + case 10: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_11 = script_992(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_11.intpart_0, structdump_11.intpart_1, structdump_11.stringpart_0, structdump_11.stringpart_1); + case 11: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_12 = script_1000(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_12.intpart_0, structdump_12.intpart_1, structdump_12.stringpart_0, structdump_12.stringpart_1); + case 19: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_13 = script_980(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_13.intpart_0, structdump_13.intpart_1, structdump_13.stringpart_0, structdump_13.stringpart_1); + case 13: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_14 = script_1016(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_14.intpart_0, structdump_14.intpart_1, structdump_14.stringpart_0, structdump_14.stringpart_1); + case 14: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_15 = script_1022(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_15.intpart_0, structdump_15.intpart_1, structdump_15.stringpart_0, structdump_15.stringpart_1); + case 15: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_16 = script_998(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_16.intpart_0, structdump_16.intpart_1, structdump_16.stringpart_0, structdump_16.stringpart_1); + case 16: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_17 = script_1018(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_17.intpart_0, structdump_17.intpart_1, structdump_17.stringpart_0, structdump_17.stringpart_1); + case 17: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_18 = script_986(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_18.intpart_0, structdump_18.intpart_1, structdump_18.stringpart_0, structdump_18.stringpart_1); + case 18: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_19 = script_990(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_19.intpart_0, structdump_19.intpart_1, structdump_19.stringpart_0, structdump_19.stringpart_1); + case 12: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_20 = script_1012(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_20.intpart_0, structdump_20.intpart_1, structdump_20.stringpart_0, structdump_20.stringpart_1); + case 20: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_21 = script_988(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_21.intpart_0, structdump_21.intpart_1, structdump_21.stringpart_0, structdump_21.stringpart_1); + case 21: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_22 = script_1014(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_22.intpart_0, structdump_22.intpart_1, structdump_22.stringpart_0, structdump_22.stringpart_1); + case 22: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_23 = script_3(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_23.intpart_0, structdump_23.intpart_1, structdump_23.stringpart_0, structdump_23.stringpart_1); + case 23: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_24 = script_1006(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_24.intpart_0, structdump_24.intpart_1, structdump_24.stringpart_0, structdump_24.stringpart_1); + case 24: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_25 = script_1020(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_25.intpart_0, structdump_25.intpart_1, structdump_25.stringpart_0, structdump_25.stringpart_1); + case 25: + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_26 = script_3355(stack_dump0, stack_dump1); + return newstruct cs2func_script_14_struct(structdump_26.intpart_0, structdump_26.intpart_1, structdump_26.stringpart_0, structdump_26.stringpart_1); + } + return newstruct cs2func_script_14_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/140.cs2 b/dumps/scripts/140.cs2 new file mode 100644 index 000000000..258e4c968 --- /dev/null +++ b/dumps/scripts/140.cs2 @@ -0,0 +1,4 @@ +void script_140() { + script_1364(); + return; +} diff --git a/dumps/scripts/1400.cs2 b/dumps/scripts/1400.cs2 new file mode 100644 index 000000000..446fa8c3d --- /dev/null +++ b/dumps/scripts/1400.cs2 @@ -0,0 +1,8 @@ +void script_1400(int arg0,int arg1) { + if ((mod(subtract(getClientCycle(), arg0), 40) < 20) && hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1401.cs2 b/dumps/scripts/1401.cs2 new file mode 100644 index 000000000..3ad30c5d6 --- /dev/null +++ b/dumps/scripts/1401.cs2 @@ -0,0 +1,53 @@ +int script_1401(int arg0,int arg1,int arg2,string arg3) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int stack_dump0; + arg3 = script_1602(arg3); + ivar3 = strLength(arg3); + arg0 = subtract(arg0, arg2); + if (arg0 <= 0) { + return 0; + } + if (arg0 >= getTextWidth(arg1, arg3)) { + return ivar3; + } + ivar4 = 0; + ivar5 = strLength(arg3); + ivar6 = -1; + ivar7 = 0; + ivar8 = 0; + while (ivar4 != ivar5) { + ivar6 = add(divide(subtract(ivar5, ivar4), 2), ivar4); + if (ivar6 == ivar4) { + ivar7 = getTextWidth(arg1, substr(0, ivar5, arg3)); + if (ivar5 > 1) { + ivar8 = getTextWidth(arg1, substr(0, subtract(ivar5, 1), arg3)); + } + if (subtract(ivar7, arg0) < subtract(arg0, ivar8)) { + return ivar5; + } + return subtract(ivar5, 1); + } + if (arg0 <= getTextWidth(arg1, substr(0, ivar6, arg3))) { + stack_dump0 = ivar4; + ivar5 = ivar6; + ivar4 = stack_dump0; + } else { + stack_dump0 = ivar6; + ivar5 = ivar5; + ivar4 = stack_dump0; + } + } + ivar7 = getTextWidth(arg1, substr(0, ivar5, arg3)); + if (ivar5 > 1) { + ivar8 = getTextWidth(arg1, substr(0, subtract(ivar5, 1), arg3)); + } + if (subtract(ivar7, arg0) < subtract(arg0, ivar8)) { + return ivar5; + } + return subtract(ivar5, 1); +} diff --git a/dumps/scripts/1402.cs2 b/dumps/scripts/1402.cs2 new file mode 100644 index 000000000..61e451ec5 --- /dev/null +++ b/dumps/scripts/1402.cs2 @@ -0,0 +1,135 @@ +void script_1402() { + if (standart_config_106 == -1) { + return; + } + if (((boolean)standart_config_106)) { + setWidgetModel(3062, new WidgetPointer(270,5)); + setWidgetAnimation(646, new WidgetPointer(270,5)); + } else if (((boolean)standart_config_106)) { + setWidgetModel(3062, new WidgetPointer(270,6)); + setWidgetAnimation(646, new WidgetPointer(270,6)); + } else if (standart_config_106 == 2) { + setWidgetModel(3062, new WidgetPointer(270,7)); + setWidgetAnimation(646, new WidgetPointer(270,7)); + } else if (standart_config_106 == 3) { + setWidgetModel(3062, new WidgetPointer(270,8)); + setWidgetAnimation(646, new WidgetPointer(270,8)); + } else if (standart_config_106 == 4) { + setWidgetModel(3062, new WidgetPointer(270,9)); + setWidgetAnimation(646, new WidgetPointer(270,9)); + } else if (standart_config_106 == 5) { + setWidgetModel(3062, new WidgetPointer(270,10)); + setWidgetAnimation(646, new WidgetPointer(270,10)); + } else if (standart_config_106 == 6) { + setWidgetModel(3062, new WidgetPointer(270,11)); + setWidgetAnimation(646, new WidgetPointer(270,11)); + } else if (standart_config_106 == 7) { + setWidgetModel(3062, new WidgetPointer(270,12)); + setWidgetAnimation(646, new WidgetPointer(270,12)); + } else if (standart_config_106 == 8) { + setWidgetModel(3062, new WidgetPointer(270,13)); + setWidgetAnimation(646, new WidgetPointer(270,13)); + } else if (standart_config_106 == 9) { + setWidgetModel(3062, new WidgetPointer(270,14)); + setWidgetAnimation(646, new WidgetPointer(270,14)); + } else if (standart_config_106 == 10) { + setWidgetModel(3062, new WidgetPointer(270,15)); + setWidgetAnimation(646, new WidgetPointer(270,15)); + } else if (standart_config_106 == 11) { + setWidgetModel(3062, new WidgetPointer(270,16)); + setWidgetAnimation(646, new WidgetPointer(270,16)); + } else if (standart_config_106 == 12) { + setWidgetModel(3062, new WidgetPointer(270,17)); + setWidgetAnimation(646, new WidgetPointer(270,17)); + } else if (standart_config_106 == 13) { + setWidgetModel(3062, new WidgetPointer(270,18)); + setWidgetAnimation(646, new WidgetPointer(270,18)); + } else if (standart_config_106 == 14) { + setWidgetModel(3062, new WidgetPointer(270,19)); + setWidgetAnimation(646, new WidgetPointer(270,19)); + } else if (standart_config_106 == 15) { + setWidgetModel(3062, new WidgetPointer(270,20)); + setWidgetAnimation(646, new WidgetPointer(270,20)); + } else if (standart_config_106 == 16) { + setWidgetModel(3062, new WidgetPointer(270,21)); + setWidgetAnimation(646, new WidgetPointer(270,21)); + } else if (standart_config_106 == 17) { + setWidgetModel(3062, new WidgetPointer(270,22)); + setWidgetAnimation(646, new WidgetPointer(270,22)); + } else if (standart_config_106 == 18) { + setWidgetModel(3062, new WidgetPointer(270,23)); + setWidgetAnimation(646, new WidgetPointer(270,23)); + } else if (standart_config_106 == 19) { + setWidgetModel(3062, new WidgetPointer(270,24)); + setWidgetAnimation(646, new WidgetPointer(270,24)); + } else if (standart_config_106 == 20) { + setWidgetModel(3062, new WidgetPointer(270,25)); + setWidgetAnimation(646, new WidgetPointer(270,25)); + } else if (standart_config_106 == 21) { + setWidgetModel(3062, new WidgetPointer(270,26)); + setWidgetAnimation(646, new WidgetPointer(270,26)); + } else if (standart_config_106 == 22) { + setWidgetModel(3062, new WidgetPointer(270,27)); + setWidgetAnimation(646, new WidgetPointer(270,27)); + } else if (standart_config_106 == 23) { + setWidgetModel(3062, new WidgetPointer(270,28)); + setWidgetAnimation(646, new WidgetPointer(270,28)); + } else if (standart_config_106 == 24) { + setWidgetModel(3062, new WidgetPointer(270,29)); + setWidgetAnimation(646, new WidgetPointer(270,29)); + } else if (standart_config_106 == 25) { + setWidgetModel(3062, new WidgetPointer(270,30)); + setWidgetAnimation(646, new WidgetPointer(270,30)); + } else if (standart_config_106 == 26) { + setWidgetModel(3062, new WidgetPointer(270,31)); + setWidgetAnimation(646, new WidgetPointer(270,31)); + } else if (standart_config_106 == 27) { + setWidgetModel(3062, new WidgetPointer(270,32)); + setWidgetAnimation(646, new WidgetPointer(270,32)); + } else if (standart_config_106 == 28) { + setWidgetModel(3062, new WidgetPointer(270,33)); + setWidgetAnimation(646, new WidgetPointer(270,33)); + } else if (standart_config_106 == 29) { + setWidgetModel(3062, new WidgetPointer(270,34)); + setWidgetAnimation(646, new WidgetPointer(270,34)); + } else if (standart_config_106 == 30) { + setWidgetModel(3062, new WidgetPointer(270,35)); + setWidgetAnimation(646, new WidgetPointer(270,35)); + } else if (standart_config_106 == 31) { + setWidgetModel(3062, new WidgetPointer(270,36)); + setWidgetAnimation(646, new WidgetPointer(270,36)); + } else if (standart_config_106 == 32) { + setWidgetModel(3062, new WidgetPointer(270,37)); + setWidgetAnimation(646, new WidgetPointer(270,37)); + } else if (standart_config_106 == 33) { + setWidgetModel(3062, new WidgetPointer(270,38)); + setWidgetAnimation(646, new WidgetPointer(270,38)); + } else if (standart_config_106 == 34) { + setWidgetModel(3062, new WidgetPointer(270,39)); + setWidgetAnimation(646, new WidgetPointer(270,39)); + } else if (standart_config_106 == 35) { + setWidgetModel(3062, new WidgetPointer(270,40)); + setWidgetAnimation(646, new WidgetPointer(270,40)); + } else if (standart_config_106 == 36) { + setWidgetModel(3062, new WidgetPointer(270,41)); + setWidgetAnimation(646, new WidgetPointer(270,41)); + } else if (standart_config_106 == 37) { + setWidgetModel(3062, new WidgetPointer(270,42)); + setWidgetAnimation(646, new WidgetPointer(270,42)); + } else if (standart_config_106 == 38) { + setWidgetModel(3062, new WidgetPointer(270,43)); + setWidgetAnimation(646, new WidgetPointer(270,43)); + } else if (standart_config_106 == 39) { + setWidgetModel(3062, new WidgetPointer(270,44)); + setWidgetAnimation(646, new WidgetPointer(270,44)); + } else if (standart_config_106 == 40) { + setWidgetModel(3062, new WidgetPointer(270,45)); + setWidgetAnimation(646, new WidgetPointer(270,45)); + } else { + if (standart_config_106 == 41) { + setWidgetModel(3062, new WidgetPointer(270,46)); + setWidgetAnimation(646, new WidgetPointer(270,46)); + } + } + return; +} diff --git a/dumps/scripts/1403.cs2 b/dumps/scripts/1403.cs2 new file mode 100644 index 000000000..311e44f07 --- /dev/null +++ b/dumps/scripts/1403.cs2 @@ -0,0 +1,5 @@ +int script_1403(int arg0,int arg1) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), multiply(arg1, getWidgetActualHeight(new WidgetPointer(arg0))), 0, 0, new WidgetPointer(arg0)); + arg1 = add(arg1, 1); + return arg1; +} diff --git a/dumps/scripts/1404.cs2 b/dumps/scripts/1404.cs2 new file mode 100644 index 000000000..7619928c8 --- /dev/null +++ b/dumps/scripts/1404.cs2 @@ -0,0 +1,9 @@ +void script_1404(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_1839(bitconfig_5367, arg0, arg1, arg2); + if (arg5 != bitconfig_6175) { + setScriptCallOnConfigChange(1404, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), bitconfig_6175, 463, 1, "IIIIIiY", new WidgetPointer(arg4)); + script_2046(arg3); + } + script_307(); + return; +} diff --git a/dumps/scripts/1405.cs2 b/dumps/scripts/1405.cs2 new file mode 100644 index 000000000..1374a9a9e --- /dev/null +++ b/dumps/scripts/1405.cs2 @@ -0,0 +1,21 @@ +void script_1405() { + if (((boolean)bitconfig_61)) { + setWidgetText(new WidgetPointer(756,10), "Draughts: Options"); + script_1406(49545219); + } else if (bitconfig_61 == 2) { + setWidgetText(new WidgetPointer(756,10), "Runelink: Options"); + script_1406(49545220); + } else if (bitconfig_61 == 3) { + setWidgetText(new WidgetPointer(756,10), "Runesquares: Options"); + script_1406(49545224); + } else { + if (bitconfig_61 == 4) { + setWidgetText(new WidgetPointer(756,10), "Runeversi: Options"); + script_1406(49545222); + } + } + script_1407(); + script_1408(); + script_1409(); + return; +} diff --git a/dumps/scripts/1406.cs2 b/dumps/scripts/1406.cs2 new file mode 100644 index 000000000..e633322a6 --- /dev/null +++ b/dumps/scripts/1406.cs2 @@ -0,0 +1,8 @@ +void script_1406(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(756,3)); + setWidgetIsHidden(true, new WidgetPointer(756,4)); + setWidgetIsHidden(true, new WidgetPointer(756,6)); + setWidgetIsHidden(true, new WidgetPointer(756,8)); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1407.cs2 b/dumps/scripts/1407.cs2 new file mode 100644 index 000000000..c583d572f --- /dev/null +++ b/dumps/scripts/1407.cs2 @@ -0,0 +1,8 @@ +void script_1407() { + if (((boolean)bitconfig_68)) { + setWidgetSprite(181, new WidgetPointer(756,50)); + } else { + setWidgetSprite(180, new WidgetPointer(756,50)); + } + return; +} diff --git a/dumps/scripts/1408.cs2 b/dumps/scripts/1408.cs2 new file mode 100644 index 000000000..fbef8d70f --- /dev/null +++ b/dumps/scripts/1408.cs2 @@ -0,0 +1,18 @@ +void script_1408() { + setWidgetSprite(180, new WidgetPointer(756,12)); + setWidgetSprite(180, new WidgetPointer(756,13)); + setWidgetSprite(180, new WidgetPointer(756,15)); + setWidgetSprite(180, new WidgetPointer(756,16)); + if (((boolean)bitconfig_49)) { + setWidgetSprite(181, new WidgetPointer(756,12)); + } else if (((boolean)bitconfig_49)) { + setWidgetSprite(181, new WidgetPointer(756,13)); + } else if (bitconfig_49 == 2) { + setWidgetSprite(181, new WidgetPointer(756,15)); + } else { + if (bitconfig_49 == 3) { + setWidgetSprite(181, new WidgetPointer(756,16)); + } + } + return; +} diff --git a/dumps/scripts/1409.cs2 b/dumps/scripts/1409.cs2 new file mode 100644 index 000000000..30422f4bb --- /dev/null +++ b/dumps/scripts/1409.cs2 @@ -0,0 +1,42 @@ +void script_1409() { + setWidgetSprite(180, new WidgetPointer(756,36)); + setWidgetSprite(180, new WidgetPointer(756,37)); + setWidgetSprite(180, new WidgetPointer(756,38)); + setWidgetSprite(180, new WidgetPointer(756,39)); + setWidgetSprite(180, new WidgetPointer(756,40)); + setWidgetSprite(180, new WidgetPointer(756,41)); + setWidgetSprite(180, new WidgetPointer(756,42)); + setWidgetSprite(180, new WidgetPointer(756,43)); + setWidgetSprite(180, new WidgetPointer(756,44)); + setWidgetSprite(180, new WidgetPointer(756,45)); + setWidgetSprite(180, new WidgetPointer(756,46)); + setWidgetSprite(180, new WidgetPointer(756,47)); + if (((boolean)bitconfig_50)) { + setWidgetSprite(181, new WidgetPointer(756,36)); + } else if (bitconfig_50 == 2) { + setWidgetSprite(181, new WidgetPointer(756,37)); + } else if (bitconfig_50 == 3) { + setWidgetSprite(181, new WidgetPointer(756,38)); + } else if (bitconfig_50 == 4) { + setWidgetSprite(181, new WidgetPointer(756,39)); + } else if (bitconfig_50 == 5) { + setWidgetSprite(181, new WidgetPointer(756,40)); + } else if (bitconfig_50 == 6) { + setWidgetSprite(181, new WidgetPointer(756,41)); + } else if (bitconfig_50 == 7) { + setWidgetSprite(181, new WidgetPointer(756,42)); + } else if (bitconfig_50 == 8) { + setWidgetSprite(181, new WidgetPointer(756,43)); + } else if (bitconfig_50 == 9) { + setWidgetSprite(181, new WidgetPointer(756,44)); + } else if (bitconfig_50 == 10) { + setWidgetSprite(181, new WidgetPointer(756,45)); + } else if (bitconfig_50 == 11) { + setWidgetSprite(181, new WidgetPointer(756,46)); + } else { + if (bitconfig_50 == 12) { + setWidgetSprite(181, new WidgetPointer(756,47)); + } + } + return; +} diff --git a/dumps/scripts/141.cs2 b/dumps/scripts/141.cs2 new file mode 100644 index 000000000..3f824f72f --- /dev/null +++ b/dumps/scripts/141.cs2 @@ -0,0 +1,9 @@ +void script_141() { + if (((boolean)standart_config_1042)) { + setWidgetIsHidden(false, new WidgetPointer(335,39)); + } + if (((boolean)standart_config_1043)) { + setWidgetIsHidden(false, new WidgetPointer(335,40)); + } + return; +} diff --git a/dumps/scripts/1410.cs2 b/dumps/scripts/1410.cs2 new file mode 100644 index 000000000..8de44a966 --- /dev/null +++ b/dumps/scripts/1410.cs2 @@ -0,0 +1,26 @@ +void script_1410(int arg0) { + int ivar1; + int ivar2; + ivar1 = 255; + ivar2 = 0; + if (globalint_814 < 256) { + ivar1 = subtract(255, globalint_814); + } else if (globalint_814 < 510) { + ivar1 = mod(globalint_814, 255); + } else { + ivar1 = 255; + } + if (globalint_119 == 4) { + ivar2 = 8; + } else if (globalint_119 == 3) { + ivar2 = 4; + } else { + ivar1 = 255; + } + cs2method2103(ivar1, new WidgetPointer(arg0)); + globalint_814 = add(globalint_814, ivar2); + if (globalint_814 > 510) { + globalint_814 = 0; + } + return; +} diff --git a/dumps/scripts/1411.cs2 b/dumps/scripts/1411.cs2 new file mode 100644 index 000000000..ab9420b77 --- /dev/null +++ b/dumps/scripts/1411.cs2 @@ -0,0 +1,11 @@ +void script_1411() { + int ivar0; + ivar0 = 20054022; + globalint_761 = cs2method_3408(105, 109, 208, rndExcl(getCommonDefinitionSize(208))); + if (globalint_761 != -1) { + setWidgetModel(globalint_761, new WidgetPointer(ivar0)); + } + setWidgetPosition(subtract(0, getWidgetActualWidth(new WidgetPointer(ivar0))), 120, 0, 0, new WidgetPointer(ivar0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,19)); + return; +} diff --git a/dumps/scripts/1412.cs2 b/dumps/scripts/1412.cs2 new file mode 100644 index 000000000..782b4a17b --- /dev/null +++ b/dumps/scripts/1412.cs2 @@ -0,0 +1,25 @@ +void script_1412(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + script_98(arg0, 0, 297, 0, 0, ivar1, ivar2); + script_98(arg0, 1, 1259, 0, 0, 9, 9); + script_98(arg0, 2, 1260, ivar3, 0, 9, 9); + script_98(arg0, 3, 1261, 0, ivar4, 9, 9); + script_98(arg0, 4, 1262, ivar3, ivar4, 9, 9); + script_98(arg0, 5, 1263, 0, 9, 9, ivar6); + script_98(arg0, 6, 1264, 9, 0, ivar5, 9); + script_98(arg0, 7, 1265, ivar3, 9, 9, ivar6); + script_98(arg0, 8, 1266, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/1413.cs2 b/dumps/scripts/1413.cs2 new file mode 100644 index 000000000..a950df4b6 --- /dev/null +++ b/dumps/scripts/1413.cs2 @@ -0,0 +1,25 @@ +void script_1413(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + script_98(arg0, 0, 897, 0, 0, ivar1, ivar2); + script_98(arg0, 1, 1267, 0, 0, 9, 9); + script_98(arg0, 2, 1268, ivar3, 0, 9, 9); + script_98(arg0, 3, 1269, 0, ivar4, 9, 9); + script_98(arg0, 4, 1270, ivar3, ivar4, 9, 9); + script_98(arg0, 5, 1271, 0, 9, 9, ivar6); + script_98(arg0, 6, 1272, 9, 0, ivar5, 9); + script_98(arg0, 7, 1273, ivar3, 9, 9, ivar6); + script_98(arg0, 8, 1274, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/1414.cs2 b/dumps/scripts/1414.cs2 new file mode 100644 index 000000000..d8ffb798a --- /dev/null +++ b/dumps/scripts/1414.cs2 @@ -0,0 +1,25 @@ +void script_1414(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + script_98(arg0, 0, 1040, 0, 0, ivar1, ivar2); + script_98(arg0, 1, 1275, 0, 0, 9, 9); + script_98(arg0, 2, 1276, ivar3, 0, 9, 9); + script_98(arg0, 3, 1277, 0, ivar4, 9, 9); + script_98(arg0, 4, 1278, ivar3, ivar4, 9, 9); + script_98(arg0, 5, 1279, 0, 9, 9, ivar6); + script_98(arg0, 6, 1280, 9, 0, ivar5, 9); + script_98(arg0, 7, 1281, ivar3, 9, 9, ivar6); + script_98(arg0, 8, 1282, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/1415.cs2 b/dumps/scripts/1415.cs2 new file mode 100644 index 000000000..6ed988e86 --- /dev/null +++ b/dumps/scripts/1415.cs2 @@ -0,0 +1,30 @@ +void script_1415() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + while (ivar0 <= getItemContainerLength(93)) { + createExtraChild(new WidgetPointer(323,5), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(5, multiply(40, ivar1)), multiply(40, ivar2), 0, 0); + if (getItemIdInSlot(93, ivar0) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(93, ivar0), getItemAmtInSlot(93, ivar0)); + cs2method1305("" + getItemName(getItemIdInSlot(93, ivar0))); + setWidgetContextMenuOption(1, "" + "Value"); + setWidgetContextMenuOption(2, "Pack " + "" + "1"); + setWidgetContextMenuOption(3, "Pack " + "" + "5"); + setWidgetContextMenuOption(4, "Pack " + "" + "All"); + setWidgetContextMenuOption(5, "Pack " + "" + "X"); + setWidgetContextMenuOption(10, "Examine"); + } + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + if (ivar1 > 6) { + ivar1 = 0; + ivar2 = add(ivar2, 1); + } + } + return; +} diff --git a/dumps/scripts/1416.cs2 b/dumps/scripts/1416.cs2 new file mode 100644 index 000000000..037555cc0 --- /dev/null +++ b/dumps/scripts/1416.cs2 @@ -0,0 +1,5 @@ +int script_1416(int arg0,int arg1) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), subtract(225, multiply(arg1, getWidgetActualHeight(new WidgetPointer(arg0)))), 0, 0, new WidgetPointer(arg0)); + arg1 = add(arg1, 1); + return arg1; +} diff --git a/dumps/scripts/1417.cs2 b/dumps/scripts/1417.cs2 new file mode 100644 index 000000000..73d9635f6 --- /dev/null +++ b/dumps/scripts/1417.cs2 @@ -0,0 +1,50 @@ +void script_1417(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + if (((boolean)globalint_1387)) { + return; + } + ivar1 = script_1502(arg0); + ivar2 = -1; + ivar3 = getWidgetActualX(new WidgetPointer(arg0)); + ivar4 = getWidgetActualY(new WidgetPointer(arg0)); + if (bitconfig_7516 == ivar1) { + ivar2 = script_486(bitconfig_7520); + } else if (bitconfig_7517 == ivar1) { + ivar2 = script_486(bitconfig_7521); + } else if (bitconfig_7518 == ivar1) { + ivar2 = script_486(bitconfig_7526); + } else if (bitconfig_7519 == ivar1) { + ivar2 = script_486(bitconfig_7527); + } else if (bitconfig_7522 == ivar1) { + ivar2 = script_486(bitconfig_7530); + } else if (bitconfig_7523 == ivar1) { + ivar2 = script_486(bitconfig_7531); + } else if (bitconfig_7524 == ivar1) { + ivar2 = script_486(bitconfig_7532); + } else if (bitconfig_7525 == ivar1) { + ivar2 = script_486(bitconfig_7533); + } else if (bitconfig_7528 == ivar1) { + ivar2 = script_486(bitconfig_7534); + } else { + if (bitconfig_7529 == ivar1) { + ivar2 = script_486(bitconfig_7535); + } + } + if (ivar2 != -1) { + setWidgetText(new WidgetPointer(1017,241), getNpcNodemapData(ivar2, 1139)); + setWidgetSize(add(getTextWidth(2710, getNpcNodemapData(ivar2, 1139)), 10), getWidgetActualHeight(new WidgetPointer(1017,226)), 0, 0, new WidgetPointer(1017,226)); + ivar3 = subtract(add(ivar3, getWidgetActualWidth(new WidgetPointer(arg0))), 3); + ivar4 = subtract(ivar4, getWidgetActualHeight(new WidgetPointer(arg0))); + if (add(ivar3, getWidgetActualWidth(new WidgetPointer(1017,226))) >= add(getWidgetActualX(new WidgetPointer(1017,31)), getWidgetActualWidth(new WidgetPointer(1017,31)))) { + ivar3 = add(subtract(getWidgetActualX(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(1017,226))), 3); + } + setWidgetPosition(ivar3, ivar4, 0, 0, new WidgetPointer(1017,226)); + setWidgetIsHidden(false, new WidgetPointer(1017,226)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,226)); + } + return; +} diff --git a/dumps/scripts/1418.cs2 b/dumps/scripts/1418.cs2 new file mode 100644 index 000000000..aa24c0e36 --- /dev/null +++ b/dumps/scripts/1418.cs2 @@ -0,0 +1,4 @@ +void script_1418() { + setWidgetIsHidden(true, new WidgetPointer(1017,226)); + return; +} diff --git a/dumps/scripts/1419.cs2 b/dumps/scripts/1419.cs2 new file mode 100644 index 000000000..58826f261 --- /dev/null +++ b/dumps/scripts/1419.cs2 @@ -0,0 +1,22 @@ +void script_1419() { + if (((boolean)globalint_1413)) { + return; + } + if (((boolean)globalint_11)) { + script_675(); + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter name of player to delete from list"); + globalint_5 = 5; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/142.cs2 b/dumps/scripts/142.cs2 new file mode 100644 index 000000000..7d8b73ea0 --- /dev/null +++ b/dumps/scripts/142.cs2 @@ -0,0 +1,203 @@ +void script_142() { + int ivar0; + int ivar1; + int ivar2; + if (((boolean)getLanguage())) { + setWidgetFont(495, new WidgetPointer(334,50)); + setWidgetFont(495, new WidgetPointer(334,52)); + setWidgetTextAlignment(1, 1, 17, new WidgetPointer(334,50)); + setWidgetTextAlignment(1, 1, 17, new WidgetPointer(334,52)); + } else { + setWidgetFont(494, new WidgetPointer(334,50)); + setWidgetFont(494, new WidgetPointer(334,52)); + setWidgetTextAlignment(1, 1, 0, new WidgetPointer(334,50)); + setWidgetTextAlignment(1, 1, 0, new WidgetPointer(334,52)); + } + deleteAllExtraChilds(new WidgetPointer(334,38)); + deleteAllExtraChilds(new WidgetPointer(334,39)); + deleteAllExtraChilds(new WidgetPointer(334,40)); + ivar0 = 0; + ivar1 = -1; + if ((((((((((((((getItemIdInSlot(90, 14) != -1) || (getItemIdInSlot(90, 15) != -1)) || (getItemIdInSlot(90, 16) != -1)) || (getItemIdInSlot(90, 17) != -1)) || (getItemIdInSlot(90, 18) != -1)) || (getItemIdInSlot(90, 19) != -1)) || (getItemIdInSlot(90, 20) != -1)) || (getItemIdInSlot(90, 21) != -1)) || (getItemIdInSlot(90, 22) != -1)) || (getItemIdInSlot(90, 23) != -1)) || (getItemIdInSlot(90, 24) != -1)) || (getItemIdInSlot(90, 25) != -1)) || (getItemIdInSlot(90, 26) != -1)) || (getItemIdInSlot(90, 27) != -1)) { + setWidgetIsHidden(false, new WidgetPointer(334,39)); + setWidgetIsHidden(false, new WidgetPointer(334,40)); + setWidgetIsHidden(false, new WidgetPointer(334,41)); + while (ivar0 < 14) { + ivar1 = getItemIdInSlot(90, ivar0); + if (ivar1 != -1) { + createExtraChild(new WidgetPointer(334,39), 4, getExtraChildGap(new WidgetPointer(334,39))); + setWidgetPosition(0, multiply(ivar0, 12), 1, 0); + setWidgetSize(0, 12, 1, 0); + setWidgetTextAlignment(0, 0, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetText(script_4107(ivar1, getItemAmtInSlot(90, ivar0))); + } + ivar0 = add(ivar0, 1); + } + while (ivar0 < 28) { + ivar1 = getItemIdInSlot(90, ivar0); + if (ivar1 != -1) { + createExtraChild(new WidgetPointer(334,40), 4, getExtraChildGap(new WidgetPointer(334,40))); + setWidgetPosition(0, multiply(subtract(ivar0, 14), 12), 1, 0); + setWidgetSize(0, 12, 1, 0); + setWidgetTextAlignment(0, 0, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetText(script_4107(ivar1, getItemAmtInSlot(90, ivar0))); + } + ivar0 = add(ivar0, 1); + } + script_4109(114, 21889062, 21889063, 21889064, 21889065, 21889066); + setScriptCallOnMouseDragged(4108, -2147483647, new WidgetPointer(334,38), new WidgetPointer(334,39), new WidgetPointer(334,40), new WidgetPointer(334,41), new WidgetPointer(334,42), "iIIIII", new WidgetPointer(334,42)); + setScriptCallOnMouseDragReleased(4108, -2147483647, new WidgetPointer(334,38), new WidgetPointer(334,39), new WidgetPointer(334,40), new WidgetPointer(334,41), new WidgetPointer(334,42), "iIIIII", new WidgetPointer(334,42)); + cs2method2314(149, new WidgetPointer(334,42)); + } else { + setWidgetIsHidden(true, new WidgetPointer(334,39)); + setWidgetIsHidden(true, new WidgetPointer(334,40)); + setWidgetIsHidden(true, new WidgetPointer(334,41)); + while (ivar0 < 14) { + ivar1 = getItemIdInSlot(90, ivar0); + if (ivar1 != -1) { + createExtraChild(new WidgetPointer(334,38), 4, getExtraChildGap(new WidgetPointer(334,38))); + setWidgetPosition(0, multiply(ivar0, 12), 1, 0); + setWidgetSize(0, 12, 1, 0); + setWidgetTextAlignment(1, 0, 0); + setWidgetFont(496); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetText(script_4107(ivar1, getItemAmtInSlot(90, ivar0))); + } + ivar0 = add(ivar0, 1); + } + } + deleteAllExtraChilds(new WidgetPointer(334,49)); + deleteAllExtraChilds(new WidgetPointer(334,58)); + deleteAllExtraChilds(new WidgetPointer(334,59)); + ivar0 = 0; + ivar2 = 0; + if ((((((((((((((getItemIdInSlotSplit(90, 14) != -1) || (getItemIdInSlotSplit(90, 15) != -1)) || (getItemIdInSlotSplit(90, 16) != -1)) || (getItemIdInSlotSplit(90, 17) != -1)) || (getItemIdInSlotSplit(90, 18) != -1)) || (getItemIdInSlotSplit(90, 19) != -1)) || (getItemIdInSlotSplit(90, 20) != -1)) || (getItemIdInSlotSplit(90, 21) != -1)) || (getItemIdInSlotSplit(90, 22) != -1)) || (getItemIdInSlotSplit(90, 23) != -1)) || (getItemIdInSlotSplit(90, 24) != -1)) || (getItemIdInSlotSplit(90, 25) != -1)) || (getItemIdInSlotSplit(90, 26) != -1)) || (getItemIdInSlotSplit(90, 27) != -1)) { + setWidgetIsHidden(false, new WidgetPointer(334,58)); + setWidgetIsHidden(false, new WidgetPointer(334,59)); + setWidgetIsHidden(false, new WidgetPointer(334,60)); + while (ivar0 < 14) { + ivar2 = script_148(ivar0); + if ((ivar2 > 0) && (ivar2 > subtract(getClientCycle(), 750))) { + setWidgetIsHidden(false, new WidgetPointer(334,55)); + createExtraChild(new WidgetPointer(334,58), 3, getExtraChildGap(new WidgetPointer(334,58))); + createExtraChild(new WidgetPointer(334,58), 3, getExtraChildGap(new WidgetPointer(334,58))); + setWidgetPosition(0, multiply(ivar0, 12), 1, 0); + setWidgetPosition(0, multiply(ivar0, 12), 1, 0); + setWidgetSize(0, 13, 1, 0); + setWidgetSize(0, 13, 1, 0); + setWidgetRGB(new Color(255, 0, 0)); + setWidgetRGB(new Color(153, 0, 0)); + setWidgetFilled(1); + setWidgetFilled(0); + setScriptCallOnGameloop(144, new WidgetPointer(-32768,3), -2147483643, ivar2, add(ivar2, 750), "Iiii"); + setScriptCallOnGameloop(144, new WidgetPointer(-32768,3), -2147483643, ivar2, add(ivar2, 750), "Iiii"); + } + ivar1 = getItemIdInSlotSplit(90, ivar0); + if (ivar1 != -1) { + createExtraChild(new WidgetPointer(334,58), 4, getExtraChildGap(new WidgetPointer(334,58))); + setWidgetPosition(0, multiply(ivar0, 12), 1, 0); + setWidgetSize(0, 12, 1, 0); + setWidgetTextAlignment(0, 0, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetText(script_4107(ivar1, getItemAmtInSlotSplit(90, ivar0))); + } + ivar0 = add(ivar0, 1); + } + while (ivar0 < 28) { + ivar2 = script_148(ivar0); + if ((ivar2 > 0) && (ivar2 > subtract(getClientCycle(), 750))) { + setWidgetIsHidden(false, new WidgetPointer(334,55)); + createExtraChild(new WidgetPointer(334,59), 3, getExtraChildGap(new WidgetPointer(334,59))); + createExtraChild(new WidgetPointer(334,59), 3, getExtraChildGap(new WidgetPointer(334,59))); + setWidgetPosition(0, multiply(subtract(ivar0, 14), 12), 1, 0); + setWidgetPosition(0, multiply(subtract(ivar0, 14), 12), 1, 0); + setWidgetSize(0, 13, 1, 0); + setWidgetSize(0, 13, 1, 0); + setWidgetRGB(new Color(255, 0, 0)); + setWidgetRGB(new Color(153, 0, 0)); + setWidgetFilled(1); + setWidgetFilled(0); + setScriptCallOnGameloop(144, new WidgetPointer(-32768,3), -2147483643, ivar2, add(ivar2, 750), "Iiii"); + setScriptCallOnGameloop(144, new WidgetPointer(-32768,3), -2147483643, ivar2, add(ivar2, 750), "Iiii"); + } + ivar1 = getItemIdInSlotSplit(90, ivar0); + if (ivar1 != -1) { + createExtraChild(new WidgetPointer(334,59), 4, getExtraChildGap(new WidgetPointer(334,59))); + setWidgetPosition(0, multiply(subtract(ivar0, 14), 12), 1, 0); + setWidgetSize(0, 12, 1, 0); + setWidgetTextAlignment(0, 0, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetText(script_4107(ivar1, getItemAmtInSlotSplit(90, ivar0))); + } + ivar0 = add(ivar0, 1); + } + script_4109(114, 21889073, 21889082, 21889083, 21889084, 21889085); + setScriptCallOnMouseDragged(4108, -2147483647, new WidgetPointer(334,49), new WidgetPointer(334,58), new WidgetPointer(334,59), new WidgetPointer(334,60), new WidgetPointer(334,61), "iIIIII", new WidgetPointer(334,61)); + setScriptCallOnMouseDragReleased(4108, -2147483647, new WidgetPointer(334,49), new WidgetPointer(334,58), new WidgetPointer(334,59), new WidgetPointer(334,60), new WidgetPointer(334,61), "iIIIII", new WidgetPointer(334,61)); + cs2method2314(149, new WidgetPointer(334,61)); + } else { + setWidgetIsHidden(true, new WidgetPointer(334,58)); + setWidgetIsHidden(true, new WidgetPointer(334,59)); + setWidgetIsHidden(true, new WidgetPointer(334,60)); + while (ivar0 < 14) { + ivar2 = script_148(ivar0); + if ((ivar2 > 0) && (ivar2 > subtract(getClientCycle(), 750))) { + setWidgetIsHidden(false, new WidgetPointer(334,55)); + createExtraChild(new WidgetPointer(334,49), 3, getExtraChildGap(new WidgetPointer(334,49))); + createExtraChild(new WidgetPointer(334,49), 3, getExtraChildGap(new WidgetPointer(334,49))); + setWidgetPosition(0, multiply(ivar0, 12), 1, 0); + setWidgetPosition(0, multiply(ivar0, 12), 1, 0); + setWidgetSize(0, 13, 1, 0); + setWidgetSize(0, 13, 1, 0); + setWidgetRGB(new Color(255, 0, 0)); + setWidgetRGB(new Color(153, 0, 0)); + setWidgetFilled(1); + setWidgetFilled(0); + setScriptCallOnGameloop(144, new WidgetPointer(-32768,3), -2147483643, ivar2, add(ivar2, 750), "Iiii"); + setScriptCallOnGameloop(144, new WidgetPointer(-32768,3), -2147483643, ivar2, add(ivar2, 750), "Iiii"); + } + ivar1 = getItemIdInSlotSplit(90, ivar0); + if (ivar1 != -1) { + createExtraChild(new WidgetPointer(334,49), 4, getExtraChildGap(new WidgetPointer(334,49))); + setWidgetPosition(0, multiply(ivar0, 12), 1, 0); + setWidgetSize(0, 12, 1, 0); + setWidgetTextAlignment(1, 0, 0); + setWidgetFont(496); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetText(script_4107(ivar1, getItemAmtInSlotSplit(90, ivar0))); + } + ivar0 = add(ivar0, 1); + } + } + ivar2 = script_148(-1); + if (ivar2 > 0) { + setWidgetIsHidden(false, new WidgetPointer(334,55)); + createExtraChild(new WidgetPointer(334,51), 3, 0); + setWidgetHidden(0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(0, 0, 1, 1); + setWidgetRGB(new Color(255, 0, 0)); + setWidgetFilled(1); + setScriptCallOnGameloop(144, new WidgetPointer(-32768,3), -2147483643, ivar2, add(ivar2, 750), "Iiii"); + createExtraChild(new WidgetPointer(334,51), 3, 1); + setWidgetHidden(0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(0, 0, 1, 1); + setWidgetRGB(new Color(153, 0, 0)); + setWidgetFilled(0); + setScriptCallOnGameloop(144, new WidgetPointer(-32768,3), -2147483643, ivar2, add(ivar2, 750), "Iiii"); + } + return; +} diff --git a/dumps/scripts/1420.cs2 b/dumps/scripts/1420.cs2 new file mode 100644 index 000000000..cf953a589 --- /dev/null +++ b/dumps/scripts/1420.cs2 @@ -0,0 +1,15 @@ +void script_1420() { + int ivar0; + ivar0 = script_121(subtract(bitconfig_3756, 1)); + if (ivar0 != -1) { + if (mod(getClientCycle(), 40) > 20) { + setWidgetIsHidden(false, new WidgetPointer(ivar0)); + if (mod(getClientCycle(), 40) == 21) { + playSoundEffect(5009, 1, 0); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar0)); + } + } + return; +} diff --git a/dumps/scripts/1421.cs2 b/dumps/scripts/1421.cs2 new file mode 100644 index 000000000..92d57865f --- /dev/null +++ b/dumps/scripts/1421.cs2 @@ -0,0 +1,63 @@ +void script_1421(int arg0) { + string svar0; + svar0 = ""; + switch (arg0) { + case 1: + svar0 = cs2method_3408(105, 115, 1697, bitconfig_5146); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 130, "IIsii", new WidgetPointer(575,3)); + break; + case 2: + svar0 = cs2method_3408(105, 115, 1698, bitconfig_5147); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 160, "IIsii", new WidgetPointer(575,4)); + break; + case 3: + svar0 = cs2method_3408(105, 115, 1699, bitconfig_5148); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,5)); + break; + case 4: + svar0 = cs2method_3408(105, 115, 1700, bitconfig_5149); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,6)); + break; + case 5: + svar0 = cs2method_3408(105, 115, 1701, bitconfig_5150); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,7)); + break; + case 6: + svar0 = cs2method_3408(105, 115, 1702, bitconfig_5151); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,8)); + break; + case 7: + svar0 = cs2method_3408(105, 115, 1703, bitconfig_5152); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,9)); + break; + case 8: + svar0 = cs2method_3408(105, 115, 1704, bitconfig_5153); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,10)); + break; + case 9: + svar0 = cs2method_3408(105, 115, 1705, bitconfig_5154); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,11)); + break; + case 10: + svar0 = cs2method_3408(105, 115, 1706, bitconfig_5155); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,12)); + break; + case 11: + svar0 = cs2method_3408(105, 115, 1707, bitconfig_5156); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,13)); + break; + case 12: + svar0 = cs2method_3408(105, 115, 1708, bitconfig_5157); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,14)); + break; + case 13: + svar0 = cs2method_3408(105, 115, 1709, bitconfig_5158); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,15)); + break; + case 14: + svar0 = cs2method_3408(105, 115, 1710, bitconfig_5159); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,16)); + } + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/1422.cs2 b/dumps/scripts/1422.cs2 new file mode 100644 index 000000000..8266a89e1 --- /dev/null +++ b/dumps/scripts/1422.cs2 @@ -0,0 +1,7 @@ +void script_1422(int arg0,int arg1,int arg2,int arg3) { + setWidgetSprite(181, new WidgetPointer(arg0)); + setWidgetSprite(180, new WidgetPointer(arg1)); + setWidgetSprite(180, new WidgetPointer(arg2)); + setWidgetSprite(180, new WidgetPointer(arg3)); + return; +} diff --git a/dumps/scripts/1423.cs2 b/dumps/scripts/1423.cs2 new file mode 100644 index 000000000..83add84f4 --- /dev/null +++ b/dumps/scripts/1423.cs2 @@ -0,0 +1,15 @@ +void script_1423(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11) { + setWidgetSprite(181, new WidgetPointer(arg0)); + setWidgetSprite(180, new WidgetPointer(arg1)); + setWidgetSprite(180, new WidgetPointer(arg2)); + setWidgetSprite(180, new WidgetPointer(arg3)); + setWidgetSprite(180, new WidgetPointer(arg4)); + setWidgetSprite(180, new WidgetPointer(arg5)); + setWidgetSprite(180, new WidgetPointer(arg6)); + setWidgetSprite(180, new WidgetPointer(arg7)); + setWidgetSprite(180, new WidgetPointer(arg8)); + setWidgetSprite(180, new WidgetPointer(arg9)); + setWidgetSprite(180, new WidgetPointer(arg10)); + setWidgetSprite(180, new WidgetPointer(arg11)); + return; +} diff --git a/dumps/scripts/1424.cs2 b/dumps/scripts/1424.cs2 new file mode 100644 index 000000000..dd3ae3acb --- /dev/null +++ b/dumps/scripts/1424.cs2 @@ -0,0 +1,10 @@ +void script_1424() { + if (((boolean)bitconfig_4456)) { + setWidgetRGB(new Color(0, 35, 0), new WidgetPointer(5,3)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(5,2)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(5,3)); + setWidgetRGB(new Color(35, 0, 0), new WidgetPointer(5,2)); + } + return; +} diff --git a/dumps/scripts/1425.cs2 b/dumps/scripts/1425.cs2 new file mode 100644 index 000000000..117b0e1f2 --- /dev/null +++ b/dumps/scripts/1425.cs2 @@ -0,0 +1,63 @@ +int script_1425(int arg0) { + if (((boolean)arg0)) { + return 14; + } + if (((boolean)arg0)) { + return 58; + } + if (arg0 == 2) { + return 138; + } + if (arg0 == 3) { + return 172; + } + if (arg0 == 4) { + return 262; + } + if (arg0 == 5) { + return 296; + } + if (arg0 == 6) { + return 376; + } + if (arg0 == 7) { + return 410; + } + if (arg0 == 8) { + return 48; + } + if (arg0 == 9) { + return 216; + } + if (arg0 == 10) { + return 14; + } + if (arg0 == 11) { + return 48; + } + if (arg0 == 12) { + return 82; + } + if (arg0 == 13) { + return 172; + } + if (arg0 == 14) { + return 216; + } + if (arg0 == 15) { + return 250; + } + if (arg0 == 16) { + return 345; + } + if (arg0 == 17) { + return 379; + } + if (arg0 == 18) { + return 409; + } + if (arg0 == 19) { + return 379; + } + return 0; +} diff --git a/dumps/scripts/1426.cs2 b/dumps/scripts/1426.cs2 new file mode 100644 index 000000000..74d60c414 --- /dev/null +++ b/dumps/scripts/1426.cs2 @@ -0,0 +1,63 @@ +int script_1426(int arg0) { + if (((boolean)arg0)) { + return 10; + } + if (((boolean)arg0)) { + return 10; + } + if (arg0 == 2) { + return 10; + } + if (arg0 == 3) { + return 10; + } + if (arg0 == 4) { + return 10; + } + if (arg0 == 5) { + return 10; + } + if (arg0 == 6) { + return 10; + } + if (arg0 == 7) { + return 10; + } + if (arg0 == 8) { + return 160; + } + if (arg0 == 9) { + return 160; + } + if (arg0 == 10) { + return 90; + } + if (arg0 == 11) { + return 90; + } + if (arg0 == 12) { + return 90; + } + if (arg0 == 13) { + return 90; + } + if (arg0 == 14) { + return 90; + } + if (arg0 == 15) { + return 90; + } + if (arg0 == 16) { + return 90; + } + if (arg0 == 17) { + return 90; + } + if (arg0 == 18) { + return 90; + } + if (arg0 == 19) { + return 160; + } + return 0; +} diff --git a/dumps/scripts/1427.cs2 b/dumps/scripts/1427.cs2 new file mode 100644 index 000000000..612f958a9 --- /dev/null +++ b/dumps/scripts/1427.cs2 @@ -0,0 +1,20 @@ +void script_1427(int arg0) { + int ivar1; + ivar1 = mod(getClientCycle(), 32); + if ((globalint_1024 == bitconfig_6521) && (globalint_1024 != 0)) { + if (ivar1 < 8) { + cs2method2103(0, new WidgetPointer(arg0)); + } else if (ivar1 < 16) { + cs2method2103(85, new WidgetPointer(arg0)); + } else if (ivar1 < 24) { + cs2method2103(255, new WidgetPointer(arg0)); + } else { + cs2method2103(85, new WidgetPointer(arg0)); + } + } else if (getWidgetShadeColor(new WidgetPointer(arg0)) != 0) { + cs2method2103(0, new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1428.cs2 b/dumps/scripts/1428.cs2 new file mode 100644 index 000000000..f8982d445 --- /dev/null +++ b/dumps/scripts/1428.cs2 @@ -0,0 +1,11 @@ +void script_1428(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if ((globalint_1024 == bitconfig_6521) && (globalint_1024 != 0)) { + setScriptCallOnGameloop(1429, new WidgetPointer(arg0), arg1, "Ii"); + } else { + setScriptCallOnGameloop(-1, ""); + cs2method2103(0); + } + } + return; +} diff --git a/dumps/scripts/1429.cs2 b/dumps/scripts/1429.cs2 new file mode 100644 index 000000000..2cfaea1ee --- /dev/null +++ b/dumps/scripts/1429.cs2 @@ -0,0 +1,21 @@ +void script_1429(int arg0,int arg1) { + int ivar2; + ivar2 = mod(getClientCycle(), 32); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if ((globalint_1024 == bitconfig_6521) && (globalint_1024 != 0)) { + if (ivar2 < 8) { + cs2method2103(0); + } else if (ivar2 < 16) { + cs2method2103(85); + } else if (ivar2 < 24) { + cs2method2103(255); + } else { + cs2method2103(85); + } + } else { + setScriptCallOnGameloop(-1, ""); + cs2method2103(0); + } + } + return; +} diff --git a/dumps/scripts/143.cs2 b/dumps/scripts/143.cs2 new file mode 100644 index 000000000..997d12065 --- /dev/null +++ b/dumps/scripts/143.cs2 @@ -0,0 +1,27 @@ +void script_143(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + if (getWidgetScrollMaxH(new WidgetPointer(arg0)) > 0) { + ivar6 = divide(subtract(getWidgetScrollMaxH(new WidgetPointer(arg0)), multiply(36, arg1)), subtract(arg1, 1)); + } else { + ivar6 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(36, arg1)), subtract(arg1, 1)); + } + if (getWidgetScrollMaxV(new WidgetPointer(arg0)) > 0) { + ivar7 = divide(subtract(getWidgetScrollMaxV(new WidgetPointer(arg0)), multiply(32, arg2)), subtract(arg2, 1)); + } else { + ivar7 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(32, arg2)), subtract(arg2, 1)); + } + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSprite(937); + setWidgetSize(10, 32, 0, 0); + setWidgetPosition(add(multiply(add(36, ivar6), mod(arg3, arg1)), 13), multiply(divide(arg3, arg1), add(32, ivar7)), 0, 0); + setWidgetHidden(0); + setScriptCallOnGameloop(144, new WidgetPointer(arg0), -2147483643, getClientCycle(), add(getClientCycle(), 750), "Iiii"); + return; +} diff --git a/dumps/scripts/1430.cs2 b/dumps/scripts/1430.cs2 new file mode 100644 index 000000000..c79fd68d5 --- /dev/null +++ b/dumps/scripts/1430.cs2 @@ -0,0 +1,27 @@ +cs2func_script_1430_struct(2,0,0) script_1430(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 7); + cs2method5405(1, 7); + cs2method5406(0, 0, 41716938, 740, 41569480, 740, 0); + cs2method5406(1, 0, 41766092, 460, 41733324, 460, 0); + cs2method5406(0, 1, 41192647, 985, 40996042, 980, 0); + cs2method5406(1, 1, 41307341, 460, 41192655, 450, 0); + script_1899(0, 100, 150); + cs2method5406(0, 2, 40946906, 945, 40946910, 930, 0); + cs2method5406(1, 2, 41110746, 470, 41094368, 465, 0); + script_1899(1, 100, 150); + cs2method5406(0, 3, 41110760, 980, 41274607, 955, 0); + cs2method5406(1, 3, 41290988, 195, 41405680, 185, 0); + script_1899(2, 100, 150); + cs2method5406(0, 4, 41618664, 705, 41667815, 665, 0); + cs2method5406(1, 4, 41667821, 405, 41749739, 390, 0); + script_1899(3, 100, 150); + cs2method5406(0, 5, 41848036, 640, 41946339, 625, 0); + cs2method5406(1, 5, 41913572, 375, 41929956, 370, 0); + script_1899(4, 100, 150); + cs2method5406(0, 6, 41946339, 370, 41946339, 370, 0); + cs2method5406(1, 6, 41946340, 314, 41946340, 314, 0); + script_1899(5, 100, 150); + } + return newstruct cs2func_script_1430_struct(41716978, 1250324); +} diff --git a/dumps/scripts/1431.cs2 b/dumps/scripts/1431.cs2 new file mode 100644 index 000000000..b6529d4de --- /dev/null +++ b/dumps/scripts/1431.cs2 @@ -0,0 +1,3 @@ +int script_1431() { + return 0; +} diff --git a/dumps/scripts/1432.cs2 b/dumps/scripts/1432.cs2 new file mode 100644 index 000000000..81f9d8a5e --- /dev/null +++ b/dumps/scripts/1432.cs2 @@ -0,0 +1,23 @@ +int script_1432() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = add(getSkillActualLvl(0), getSkillActualLvl(2)); + ivar1 = divide(multiply(getSkillActualLvl(4), 3), 2); + ivar2 = divide(multiply(getSkillActualLvl(6), 3), 2); + ivar3 = ivar0; + if (ivar1 > ivar3) { + ivar3 = ivar1; + } + if (ivar2 > ivar3) { + ivar3 = ivar2; + } + ivar3 = divide(multiply(ivar3, 13), 10); + if (isMember()) { + ivar3 = divide(add(add(add(add(ivar3, getSkillActualLvl(1)), getSkillActualLvl(3)), divide(getSkillActualLvl(5), 2)), divide(getSkillActualLvl(23), 2)), 4); + } else { + ivar3 = divide(add(add(add(ivar3, getSkillActualLvl(1)), getSkillActualLvl(3)), divide(getSkillActualLvl(5), 2)), 4); + } + return ivar3; +} diff --git a/dumps/scripts/1433.cs2 b/dumps/scripts/1433.cs2 new file mode 100644 index 000000000..dd886048b --- /dev/null +++ b/dumps/scripts/1433.cs2 @@ -0,0 +1,17 @@ +void script_1433() { + if (getDisplayMode() >= 1) { + setScriptCallOnGlobalConfigChange(1434, 184, 1, "Y", new WidgetPointer(746,9)); + setScriptCallOnGlobalConfigChange(1434, 184, 1, "Y", new WidgetPointer(548,2)); + } + setScriptCallOnGlobalConfigChange(1547, 5, 1, "Y", new WidgetPointer(752,3)); + setScriptCallOnWidgetResize(721, "", new WidgetPointer(746,3)); + if (getDisplayMode() >= 2) { + setScriptCallOnConfigChange(1850, new WidgetPointer(746,175), 281, 1255, 2, "IY", new WidgetPointer(746,13)); + script_1886(48890031); + } else { + setScriptCallOnConfigChange(1850, new WidgetPointer(548,184), 281, 1255, 2, "IY", new WidgetPointer(548,66)); + script_1886(35913912); + } + script_51(); + return; +} diff --git a/dumps/scripts/1434.cs2 b/dumps/scripts/1434.cs2 new file mode 100644 index 000000000..662965a17 --- /dev/null +++ b/dumps/scripts/1434.cs2 @@ -0,0 +1,4 @@ +void script_1434() { + cs2method6200(globalint_184, globalint_184); + return; +} diff --git a/dumps/scripts/1435.cs2 b/dumps/scripts/1435.cs2 new file mode 100644 index 000000000..51b889510 --- /dev/null +++ b/dumps/scripts/1435.cs2 @@ -0,0 +1,4 @@ +void script_1435(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20) { + script_1436(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20); + return; +} diff --git a/dumps/scripts/1436.cs2 b/dumps/scripts/1436.cs2 new file mode 100644 index 000000000..e8dd8a92b --- /dev/null +++ b/dumps/scripts/1436.cs2 @@ -0,0 +1,41 @@ +void script_1436(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20) { + int ivar21; + int ivar22; + deleteAllExtraChilds(new WidgetPointer(arg3)); + createExtraChild(new WidgetPointer(arg3), 5, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg3)), getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0); + setWidgetSprite(arg7); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg3), 3, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg3)), getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + ivar21 = 1; + createExtraChild(new WidgetPointer(arg3), 5, ivar21); + setWidgetPosition(subtract(getWidgetActualWidth(new WidgetPointer(arg3)), 16), 0, 0, 0); + setWidgetSize(16, getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0); + setWidgetSprite(arg8); + cs2method1107(0); + setScriptCallOnMouseEntered(1351, new WidgetPointer(arg3), ivar21, arg9, "Iid"); + setScriptCallOnMouseExit(1352, new WidgetPointer(arg3), ivar21, arg8, "Iid"); + ivar22 = getExtraChildGap(new WidgetPointer(arg3)); + setScriptCallOnMousePressed(1347, arg0, arg2, new WidgetPointer(arg4), arg10, new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg3), arg11, arg12, arg13, arg14, ivar22, ivar21, arg15, arg16, arg17, arg18, arg19, arg20, "giIdIIIiiidiidddddd"); + createExtraChild(new WidgetPointer(arg3), 4, ivar22); + setWidgetText(cs2method_3408(105, 115, arg0, arg1)); + setWidgetPosition(5, 0, 0, 0); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg3)), 22), getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(arg14); + setWidgetTextAlignment(0, 1, 0); + if (arg1 >= arg2) { + setWidgetRGB(new Color(arg12)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg3), ivar22, arg12, "Iii"); + } else { + setWidgetRGB(new Color(arg11)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg3), ivar22, arg11, "Iii"); + } + setScriptCallOnMouseEntered(1353, new WidgetPointer(arg3), ivar22, arg13, "Iii"); + setScriptCallOnMousePressed(1347, arg0, arg2, new WidgetPointer(arg4), arg10, new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg3), arg11, arg12, arg13, arg14, ivar22, ivar21, arg15, arg16, arg17, arg18, arg19, arg20, "giIdIIIiiidiidddddd"); + return; +} diff --git a/dumps/scripts/1437.cs2 b/dumps/scripts/1437.cs2 new file mode 100644 index 000000000..ea07ba24c --- /dev/null +++ b/dumps/scripts/1437.cs2 @@ -0,0 +1,103 @@ +void script_1437() { + if (standart_config_406 > 1) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,5)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,5)); + } + if (standart_config_406 > 2) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,6)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,6)); + } + if (standart_config_406 > 3) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,7)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,7)); + } + if (standart_config_406 > 4) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,8)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,8)); + } + if (standart_config_406 > 5) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,9)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,9)); + } + if (standart_config_406 > 6) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,10)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,10)); + } + if (standart_config_406 > 7) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,11)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,11)); + } + if (standart_config_406 > 8) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,12)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,12)); + } + if (standart_config_406 > 9) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,13)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,13)); + } + if (standart_config_406 > 10) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,14)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,14)); + } + if (standart_config_406 > 11) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,15)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,15)); + } + if (standart_config_406 > 12) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,16)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,16)); + } + if (standart_config_406 > 13) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,17)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,17)); + } + if (standart_config_406 > 14) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,18)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,18)); + } + if (standart_config_406 > 15) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,19)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,19)); + } + if (standart_config_406 > 16) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,20)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,20)); + } + if (standart_config_406 > 17) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,21)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,21)); + } + if (standart_config_406 > 18) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,22)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,22)); + } + if (standart_config_406 > 19) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,23)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,23)); + } + if (standart_config_406 > 20) { + setWidgetRGB(new Color(128, 128, 255), new WidgetPointer(371,24)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(371,24)); + } + return; +} diff --git a/dumps/scripts/1438.cs2 b/dumps/scripts/1438.cs2 new file mode 100644 index 000000000..59aef36cf --- /dev/null +++ b/dumps/scripts/1438.cs2 @@ -0,0 +1,7 @@ +void script_1438(int arg0,int arg1,int arg2) { + if (globalint_657 <= 0) { + return; + } + script_1439(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1439.cs2 b/dumps/scripts/1439.cs2 new file mode 100644 index 000000000..512494c05 --- /dev/null +++ b/dumps/scripts/1439.cs2 @@ -0,0 +1,279 @@ +void script_1439(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + string svar0; + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + globalint_656 = min(globalint_656, subtract(globalint_657, 1)); + ivar3 = 0; + if ((((((((((((((((globalint_658 > 0) || (globalint_659 > 0)) || (globalint_660 > 0)) || (globalint_661 > 0)) || (globalint_662 > 0)) || (globalint_663 > 0)) || (globalint_664 > 0)) || (globalint_665 > 0)) || (globalint_666 > 0)) || (globalint_667 > 0)) || (globalint_668 > 0)) || (globalint_669 > 0)) || (globalint_670 > 0)) || (globalint_658 > 13)) || (globalint_672 > 0)) || (globalint_673 > 0)) { + ivar3 = 1; + } + if (((boolean)ivar3) || (globalint_656 > 0)) { + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(2, 14, 1, 0); + setWidgetPosition(0, 0, 1, 2); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 152, 31)); + if (((boolean)ivar3)) { + setWidgetText(intToStr(add(globalint_656, 1)) + " / " + intToStr(globalint_657)); + } else { + setWidgetText(intToStr(globalint_656) + " / " + intToStr(subtract(globalint_657, 1))); + } + } + if (globalint_656 > 0) { + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(2, 17, 1, 1); + setWidgetPosition(0, 1, 1, 0); + setWidgetTextAlignment(0, 0, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 152, 31)); + switch (globalint_656) { + case 1: + setWidgetText(globalstring_73); + break; + case 2: + setWidgetText(globalstring_74); + break; + case 3: + setWidgetText(globalstring_75); + break; + case 4: + setWidgetText(globalstring_76); + break; + case 5: + setWidgetText(globalstring_77); + break; + case 6: + setWidgetText(globalstring_78); + break; + case 7: + setWidgetText(globalstring_79); + break; + case 8: + setWidgetText(globalstring_80); + break; + case 9: + setWidgetText(globalstring_81); + break; + case 10: + setWidgetText(globalstring_82); + break; + case 11: + setWidgetText(globalstring_83); + break; + case 12: + setWidgetText(globalstring_84); + break; + case 13: + setWidgetText(globalstring_85); + break; + case 14: + setWidgetText(globalstring_86); + break; + case 15: + setWidgetText(globalstring_87); + break; + case 16: + setWidgetText(globalstring_88); + break; + case 17: + setWidgetText(globalstring_89); + break; + case 18: + setWidgetText(globalstring_90); + break; + case 19: + setWidgetText(globalstring_91); + break; + case 20: + setWidgetText(globalstring_92); + break; + case 21: + setWidgetText(globalstring_93); + break; + case 22: + setWidgetText(globalstring_94); + break; + case 23: + setWidgetText(globalstring_95); + break; + case 24: + setWidgetText(globalstring_96); + break; + case 25: + setWidgetText(globalstring_97); + break; + case 26: + setWidgetText(globalstring_98); + break; + case 27: + setWidgetText(globalstring_99); + break; + case 28: + setWidgetText(globalstring_100); + break; + case 29: + setWidgetText(globalstring_101); + break; + case 30: + setWidgetText(globalstring_102); + break; + case 31: + setWidgetText(globalstring_103); + break; + case 32: + setWidgetText(globalstring_104); + break; + case 33: + setWidgetText(globalstring_105); + break; + case 34: + setWidgetText(globalstring_106); + break; + case 35: + setWidgetText(globalstring_107); + break; + case 36: + setWidgetText(globalstring_108); + break; + case 37: + setWidgetText(globalstring_109); + break; + case 38: + setWidgetText(globalstring_110); + break; + case 39: + setWidgetText(globalstring_111); + break; + case 40: + setWidgetText(globalstring_112); + break; + case 41: + setWidgetText(globalstring_113); + break; + case 42: + setWidgetText(globalstring_114); + break; + case 43: + setWidgetText(globalstring_115); + break; + case 44: + setWidgetText(globalstring_116); + break; + case 45: + setWidgetText(globalstring_117); + break; + case 46: + setWidgetText(globalstring_118); + break; + case 47: + setWidgetText(globalstring_119); + break; + case 48: + setWidgetText(globalstring_120); + break; + case 49: + setWidgetText(globalstring_121); + } + return; + } + ivar4 = 0; + svar0 = ""; + ivar5 = 0; + while (ivar4 < 16) { + switch (ivar4) { + case 0: + svar0 = globalstring_57; + ivar5 = globalint_658; + break; + case 1: + svar0 = globalstring_58; + ivar5 = globalint_659; + break; + case 2: + svar0 = globalstring_59; + ivar5 = globalint_660; + break; + case 3: + svar0 = globalstring_60; + ivar5 = globalint_661; + break; + case 4: + svar0 = globalstring_61; + ivar5 = globalint_662; + break; + case 5: + svar0 = globalstring_62; + ivar5 = globalint_663; + break; + case 6: + svar0 = globalstring_63; + ivar5 = globalint_664; + break; + case 7: + svar0 = globalstring_64; + ivar5 = globalint_665; + break; + case 8: + svar0 = globalstring_65; + ivar5 = globalint_666; + break; + case 9: + svar0 = globalstring_66; + ivar5 = globalint_667; + break; + case 10: + svar0 = globalstring_67; + ivar5 = globalint_668; + break; + case 11: + svar0 = globalstring_68; + ivar5 = globalint_669; + break; + case 12: + svar0 = globalstring_69; + ivar5 = globalint_670; + break; + case 13: + svar0 = globalstring_70; + ivar5 = globalint_671; + break; + case 14: + svar0 = globalstring_71; + ivar5 = globalint_672; + break; + case 15: + svar0 = globalstring_72; + ivar5 = globalint_673; + break; + default: + svar0 = ""; + ivar5 = 0; + } + if (strLength(svar0) > 0) { + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + if (ivar4 == subtract(16, 1)) { + setWidgetSize(6, 17, 1, 0); + } else { + setWidgetSize(2, 12, 1, 0); + } + setWidgetPosition(0, add(multiply(ivar4, 12), 1), 1, 0); + setWidgetTextAlignment(0, 0, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetText(svar0); + if (ivar5 > 0) { + setWidgetContextMenuOption(1, "Go"); + setScriptCallOnClickContextMenu(2065, -2147483644, ivar5, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), "iiIII"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16750623, "Iii"); + } + } + ivar4 = add(ivar4, 1); + } + return; +} diff --git a/dumps/scripts/144.cs2 b/dumps/scripts/144.cs2 new file mode 100644 index 000000000..e4e02bdf4 --- /dev/null +++ b/dumps/scripts/144.cs2 @@ -0,0 +1,19 @@ +void script_144(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (getClientCycle() >= arg3) { + deleteExtraChild(); + return; + } + if (mod(getClientCycle(), 40) < 20) { + ivar4 = subtract(getClientCycle(), arg2); + ivar4 = multiply(ivar4, 255); + ivar4 = divide(ivar4, subtract(arg3, arg2)); + cs2method2103(ivar4); + } else { + cs2method2103(255); + } + } + return; +} diff --git a/dumps/scripts/1440.cs2 b/dumps/scripts/1440.cs2 new file mode 100644 index 000000000..79ac6dd77 --- /dev/null +++ b/dumps/scripts/1440.cs2 @@ -0,0 +1,25 @@ +void script_1440(int arg0) { + switch (arg0) { + case 40173583: + setItemOnWidgetMethod2205(standart_config_1068, 1, new WidgetPointer(613,15)); + break; + case 40173584: + setItemOnWidgetMethod2205(standart_config_1069, 1, new WidgetPointer(613,16)); + break; + case 40173585: + setItemOnWidgetMethod2205(standart_config_1070, 1, new WidgetPointer(613,17)); + break; + case 40173577: + setItemOnWidgetMethod2205(standart_config_1065, 1, new WidgetPointer(613,9)); + break; + case 40173578: + setItemOnWidgetMethod2205(standart_config_1066, 1, new WidgetPointer(613,10)); + break; + case 40173579: + setItemOnWidgetMethod2205(standart_config_1067, 1, new WidgetPointer(613,11)); + break; + case 40173580: + setItemOnWidgetMethod2205(standart_config_856, 1, new WidgetPointer(613,12)); + } + return; +} diff --git a/dumps/scripts/1441.cs2 b/dumps/scripts/1441.cs2 new file mode 100644 index 000000000..814bca1a0 --- /dev/null +++ b/dumps/scripts/1441.cs2 @@ -0,0 +1,19 @@ +void script_1441() { + setWidgetIsHidden(true, new WidgetPointer(299,32)); + setWidgetIsHidden(true, new WidgetPointer(299,33)); + setWidgetIsHidden(true, new WidgetPointer(299,34)); + setWidgetIsHidden(true, new WidgetPointer(299,35)); + setWidgetIsHidden(true, new WidgetPointer(299,36)); + setWidgetIsHidden(true, new WidgetPointer(299,40)); + setWidgetIsHidden(true, new WidgetPointer(299,41)); + setWidgetIsHidden(true, new WidgetPointer(299,42)); + setWidgetIsHidden(true, new WidgetPointer(299,43)); + setWidgetIsHidden(true, new WidgetPointer(299,44)); + setWidgetIsHidden(true, new WidgetPointer(299,45)); + setWidgetIsHidden(true, new WidgetPointer(299,46)); + setWidgetIsHidden(true, new WidgetPointer(299,55)); + setWidgetIsHidden(true, new WidgetPointer(299,47)); + setWidgetIsHidden(true, new WidgetPointer(299,32)); + setWidgetIsHidden(true, new WidgetPointer(299,33)); + return; +} diff --git a/dumps/scripts/1442.cs2 b/dumps/scripts/1442.cs2 new file mode 100644 index 000000000..aaed070e8 --- /dev/null +++ b/dumps/scripts/1442.cs2 @@ -0,0 +1,66 @@ +void script_1442() { + switch (standart_config_75) { + case 0: + return; + case 1: + setWidgetIsHidden(false, new WidgetPointer(299,55)); + setWidgetAnimation(632, new WidgetPointer(299,54)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(299,47)); + setWidgetAnimation(633, new WidgetPointer(299,53)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(299,45)); + setWidgetAnimation(630, new WidgetPointer(299,56)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(299,44)); + setWidgetAnimation(634, new WidgetPointer(299,58)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(299,43)); + setWidgetAnimation(635, new WidgetPointer(299,59)); + break; + case 7: + setWidgetIsHidden(false, new WidgetPointer(299,42)); + setWidgetAnimation(636, new WidgetPointer(299,60)); + break; + case 8: + setWidgetIsHidden(false, new WidgetPointer(299,41)); + setWidgetAnimation(637, new WidgetPointer(299,61)); + break; + case 10: + setWidgetIsHidden(false, new WidgetPointer(299,39)); + setWidgetAnimation(638, new WidgetPointer(299,63)); + break; + case 11: + setWidgetIsHidden(false, new WidgetPointer(299,38)); + setWidgetAnimation(639, new WidgetPointer(299,64)); + break; + case 12: + setWidgetIsHidden(false, new WidgetPointer(299,37)); + setWidgetAnimation(640, new WidgetPointer(299,65)); + break; + case 13: + setWidgetIsHidden(false, new WidgetPointer(299,36)); + setWidgetAnimation(641, new WidgetPointer(299,66)); + break; + case 14: + setWidgetIsHidden(false, new WidgetPointer(299,35)); + setWidgetAnimation(3545, new WidgetPointer(299,67)); + break; + case 15: + setWidgetIsHidden(false, new WidgetPointer(299,34)); + setWidgetAnimation(3546, new WidgetPointer(299,68)); + break; + case 16: + setWidgetIsHidden(false, new WidgetPointer(299,33)); + setWidgetAnimation(3476, new WidgetPointer(299,69)); + break; + case 17: + setWidgetIsHidden(false, new WidgetPointer(299,32)); + setWidgetAnimation(3477, new WidgetPointer(299,52)); + } + return; +} diff --git a/dumps/scripts/1443.cs2 b/dumps/scripts/1443.cs2 new file mode 100644 index 000000000..6c07a5c98 --- /dev/null +++ b/dumps/scripts/1443.cs2 @@ -0,0 +1,50 @@ +void script_1443() { + setWidgetText(new WidgetPointer(4,8), intToStr(bitconfig_455)); + if (((boolean)bitconfig_455)) { + setWidgetModel(-1, new WidgetPointer(4,4)); + } else if (((boolean)bitconfig_455)) { + setWidgetModel(6545, new WidgetPointer(4,4)); + } else if (bitconfig_455 < 4) { + setWidgetModel(6547, new WidgetPointer(4,4)); + } else if (bitconfig_455 < 7) { + setWidgetModel(6548, new WidgetPointer(4,4)); + } else if (bitconfig_455 < 11) { + setWidgetModel(6549, new WidgetPointer(4,4)); + } else if (bitconfig_455 < 16) { + setWidgetModel(6550, new WidgetPointer(4,4)); + } else if (bitconfig_455 < 22) { + setWidgetModel(6551, new WidgetPointer(4,4)); + } else if (bitconfig_455 < 29) { + setWidgetModel(6552, new WidgetPointer(4,4)); + } else if (bitconfig_455 < 37) { + setWidgetModel(6553, new WidgetPointer(4,4)); + } else if (bitconfig_455 < 46) { + setWidgetModel(6554, new WidgetPointer(4,4)); + } else { + setWidgetModel(6546, new WidgetPointer(4,4)); + } + if (((boolean)bitconfig_454)) { + setWidgetModel(-1, new WidgetPointer(4,2)); + } else if (((boolean)bitconfig_454)) { + setWidgetModel(6557, new WidgetPointer(4,2)); + } else if (bitconfig_454 == 2) { + setWidgetModel(6559, new WidgetPointer(4,2)); + } else if (bitconfig_454 == 3) { + setWidgetModel(6560, new WidgetPointer(4,2)); + } else if (bitconfig_454 == 4) { + setWidgetModel(6561, new WidgetPointer(4,2)); + } else if (bitconfig_454 == 5) { + setWidgetModel(6562, new WidgetPointer(4,2)); + } else if (bitconfig_454 == 6) { + setWidgetModel(6563, new WidgetPointer(4,2)); + } else if (bitconfig_454 == 7) { + setWidgetModel(6564, new WidgetPointer(4,2)); + } else if (bitconfig_454 == 8) { + setWidgetModel(6565, new WidgetPointer(4,2)); + } else if (bitconfig_454 == 9) { + setWidgetModel(6566, new WidgetPointer(4,2)); + } else { + setWidgetModel(6558, new WidgetPointer(4,2)); + } + return; +} diff --git a/dumps/scripts/1444.cs2 b/dumps/scripts/1444.cs2 new file mode 100644 index 000000000..82b5004e3 --- /dev/null +++ b/dumps/scripts/1444.cs2 @@ -0,0 +1,9 @@ +void script_1444() { + script_1447(0); + script_1665(50266153, 50266154, 50266155, 50266156); + script_2957(50266164); + setScriptCallOnGlobalConfigChange(1445, new WidgetPointer(767,41), new WidgetPointer(767,42), new WidgetPointer(767,43), new WidgetPointer(767,44), 192, 1038, 1324, 3, "IIIIY", new WidgetPointer(767,13)); + setScriptCallOnConfigChange(1655, 638, 1, "Y", new WidgetPointer(767,13)); + script_1656(); + return; +} diff --git a/dumps/scripts/1445.cs2 b/dumps/scripts/1445.cs2 new file mode 100644 index 000000000..fb264846c --- /dev/null +++ b/dumps/scripts/1445.cs2 @@ -0,0 +1,4 @@ +void script_1445(int arg0,int arg1,int arg2,int arg3) { + script_1665(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/1446.cs2 b/dumps/scripts/1446.cs2 new file mode 100644 index 000000000..17c89b539 --- /dev/null +++ b/dumps/scripts/1446.cs2 @@ -0,0 +1,4 @@ +void script_1446(int arg0) { + script_1447(arg0); + return; +} diff --git a/dumps/scripts/1447.cs2 b/dumps/scripts/1447.cs2 new file mode 100644 index 000000000..98fa264d3 --- /dev/null +++ b/dumps/scripts/1447.cs2 @@ -0,0 +1,31 @@ +void script_1447(int arg0) { + int ivar1; + int ivar2; + ivar1 = 0; + ivar2 = ((int)cs2method_3408(105, 73, 1617, ivar1)); + while (ivar2 != -1) { + if (ivar1 == arg0) { + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar2)); + } + ivar1 = add(ivar1, 1); + ivar2 = ((int)cs2method_3408(105, 73, 1617, ivar1)); + } + if (arg0 > 0) { + setScriptCallOnClickContextMenu(1446, subtract(arg0, 1), "i", new WidgetPointer(767,64)); + cs2method2103(0, new WidgetPointer(767,64)); + } else { + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(767,64)); + cs2method2103(200, new WidgetPointer(767,64)); + } + if (arg0 < subtract(ivar1, 1)) { + setScriptCallOnClickContextMenu(1446, add(arg0, 1), "i", new WidgetPointer(767,63)); + cs2method2103(0, new WidgetPointer(767,63)); + } else { + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(767,63)); + cs2method2103(200, new WidgetPointer(767,63)); + } + setWidgetText(new WidgetPointer(767,62), "Page " + intToStr(add(arg0, 1)) + " of " + intToStr(ivar1)); + return; +} diff --git a/dumps/scripts/1448.cs2 b/dumps/scripts/1448.cs2 new file mode 100644 index 000000000..9082226cf --- /dev/null +++ b/dumps/scripts/1448.cs2 @@ -0,0 +1,4 @@ +void script_1448(int arg0) { + script_1540(arg0); + return; +} diff --git a/dumps/scripts/1449.cs2 b/dumps/scripts/1449.cs2 new file mode 100644 index 000000000..200be2db4 --- /dev/null +++ b/dumps/scripts/1449.cs2 @@ -0,0 +1,15 @@ +void script_1449() { + globalint_188 = 0; + script_1487(); + script_1490(); + script_1450(); + script_1464(); + script_1455(); + script_1459(); + script_1463(bitconfig_4893); + setScriptCallOnGlobalConfigChange(1472, 190, 1, "Y", new WidgetPointer(762,17)); + setScriptCallOnGlobalConfigChange(1465, 192, 1038, 1324, 3, "Y", new WidgetPointer(762,21)); + cs2method2100(0, script_704(bitconfig_4893), new WidgetPointer(762,93)); + script_157(49938546, 49938525, cs2method2601(new WidgetPointer(762,93)), 1); + return; +} diff --git a/dumps/scripts/145.cs2 b/dumps/scripts/145.cs2 new file mode 100644 index 000000000..eac3b2921 --- /dev/null +++ b/dumps/scripts/145.cs2 @@ -0,0 +1,7 @@ +void script_145(int arg0,int arg1) { + if (getClientCycle() >= arg1) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1450.cs2 b/dumps/scripts/1450.cs2 new file mode 100644 index 000000000..77b483493 --- /dev/null +++ b/dumps/scripts/1450.cs2 @@ -0,0 +1,21 @@ +void script_1450() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = getItemContainerLength(95); + while (ivar0 < ivar1) { + createExtraChild(new WidgetPointer(762,93), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetHidden(1); + if (getItemIdInSlot(95, ivar0) != -1) { + script_1453(ivar0); + } + setWidgetBorderThickness(1); + setWidgetShadowColor(new Color(51, 51, 51)); + setScriptCallOnMouseOver(1480, new WidgetPointer(762,93), ivar0, "Ii"); + setScriptCallOnMouseExit(40, new WidgetPointer(762,97), "I"); + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/1451.cs2 b/dumps/scripts/1451.cs2 new file mode 100644 index 000000000..4d0f71700 --- /dev/null +++ b/dumps/scripts/1451.cs2 @@ -0,0 +1,4 @@ +void script_1451() { + script_1654(); + return; +} diff --git a/dumps/scripts/1452.cs2 b/dumps/scripts/1452.cs2 new file mode 100644 index 000000000..5efc9726a --- /dev/null +++ b/dumps/scripts/1452.cs2 @@ -0,0 +1,4 @@ +void script_1452(int arg0) { + script_1664(arg0); + return; +} diff --git a/dumps/scripts/1453.cs2 b/dumps/scripts/1453.cs2 new file mode 100644 index 000000000..91bf8e6a4 --- /dev/null +++ b/dumps/scripts/1453.cs2 @@ -0,0 +1,20 @@ +void script_1453(int arg0) { + int ivar1; + ivar1 = getItemIdInSlot(95, arg0); + setItemOnWidgetMethod1200(ivar1, getItemAmtInSlot(95, arg0)); + cs2method1305("" + getItemName(getItemIdInSlot(95, arg0))); + setWidgetContextMenuOption(1, "Withdraw-1"); + setWidgetContextMenuOption(2, "Withdraw-5"); + setWidgetContextMenuOption(3, "Withdraw-10"); + setWidgetContextMenuOption(4, "Withdraw-" + intToStr(standart_config_1249)); + setWidgetContextMenuOption(5, "Withdraw-X"); + setWidgetContextMenuOption(6, "Withdraw-All"); + setWidgetContextMenuOption(7, "Withdraw-All but one"); + setWidgetContextMenuOption(10, "Examine" + ""); + cs2method1301(49938432, -1); + cs2method1303(5); + cs2method1304(5); + setScriptCallOnMouseDragged(1454, -2147483646, "i"); + setScriptCallOnMouseDragReleased(1482, new WidgetPointer(-32768,6), "I"); + return; +} diff --git a/dumps/scripts/1454.cs2 b/dumps/scripts/1454.cs2 new file mode 100644 index 000000000..d3becbda1 --- /dev/null +++ b/dumps/scripts/1454.cs2 @@ -0,0 +1,22 @@ +void script_1454(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = subtract(getWidgetActualY(new WidgetPointer(762,93)), 25); + ivar3 = subtract(add(getWidgetActualY(new WidgetPointer(762,93)), getWidgetActualHeight(new WidgetPointer(762,93))), 16); + if ((arg0 > ivar2) && (arg0 < add(ivar2, 25))) { + ivar1 = -4; + } else if ((arg0 < ivar3) && (arg0 > subtract(ivar3, 30))) { + ivar1 = 4; + } else { + globalint_189 = 0; + return; + } + globalint_189 = add(globalint_189, 1); + if (globalint_189 > 5) { + script_705(bitconfig_4893, add(cs2method2601(new WidgetPointer(762,93)), ivar1)); + script_157(49938546, 49938525, add(cs2method2601(new WidgetPointer(762,93)), ivar1), 1); + } + return; +} diff --git a/dumps/scripts/1455.cs2 b/dumps/scripts/1455.cs2 new file mode 100644 index 000000000..d712da5f7 --- /dev/null +++ b/dumps/scripts/1455.cs2 @@ -0,0 +1,12 @@ +void script_1455() { + int ivar0; + ivar0 = 0; + while (ivar0 < getItemContainerLength(95)) { + if (setWidgetRegister(new WidgetPointer(762,93), ivar0)) { + setWidgetHidden(1); + setWidgetPosition(0, 0, 0, 0); + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/1456.cs2 b/dumps/scripts/1456.cs2 new file mode 100644 index 000000000..07503c95b --- /dev/null +++ b/dumps/scripts/1456.cs2 @@ -0,0 +1,79 @@ +void script_1456() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int stack_dump0; + cs2func_script_1467_struct(2,0,0) structdump_1; + cs2func_script_1467_struct(2,0,0) structdump_2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 8; + ivar4 = 5; + ivar5 = 0; + ivar6 = getItemContainerLength(95); + script_1464(); + stack_dump0 = ivar5; + structdump_1 = script_1467(stack_dump0); + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + while (ivar5 <= 9) { + ivar0 = ivar1; + if (ivar5 != 0) { + setWidgetIsHidden(false, cs2method_3408(105, 73, 1611, ivar5)); + setWidgetPosition(subtract(ivar3, 2), subtract(ivar4, 2), 0, 0, cs2method_3408(105, 73, 1611, ivar5)); + } + while (ivar0 < ivar2) { + if (setWidgetRegister(new WidgetPointer(762,93), ivar0)) { + if (getItemAmtInSlot(95, ivar0) != 0) { + setWidgetPosition(ivar3, ivar4, 0, 0); + setWidgetHidden(0); + ivar3 = add(ivar3, 44); + if (ivar3 >= multiply(44, 10)) { + ivar3 = 8; + ivar4 = add(ivar4, 44); + } + } else { + ivar0 = 1000; + } + } + ivar0 = add(ivar0, 1); + } + if (ivar3 != 8) { + setWidgetPosition(ivar3, ivar4, 0, 0, cs2method_3408(105, 73, 1612, ivar5)); + setWidgetSize(subtract(multiply(44, 10), ivar3), 32, 0, 0, cs2method_3408(105, 73, 1612, ivar5)); + setWidgetIsHidden(false, cs2method_3408(105, 73, 1612, ivar5)); + ivar4 = add(ivar4, 44); + } + if (((boolean)ivar5)) { + ivar5 = 2; + } else { + ivar5 = add(ivar5, 1); + } + stack_dump0 = ivar5; + structdump_2 = script_1467(stack_dump0); + ivar2 = structdump_2.intpart_1; + ivar1 = structdump_2.intpart_0; + if (ivar1 == ivar2) { + ivar5 = 100; + } + if (((int)cs2method_3408(105, 73, 1610, ivar5)) != -1) { + setWidgetIsHidden(false, cs2method_3408(105, 73, 1610, ivar5)); + setWidgetPosition(0, ivar4, 0, 0, cs2method_3408(105, 73, 1610, ivar5)); + ivar4 = add(ivar4, 15); + ivar3 = 0; + } + } + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(762,93)), ivar4, new WidgetPointer(762,93)); + cs2method2100(0, globalint_203, new WidgetPointer(762,93)); + deleteAllExtraChilds(new WidgetPointer(762,114)); + if (ivar4 > getWidgetActualHeight(new WidgetPointer(762,93))) { + script_31(49938546, 49938525, 792, 789, 790, 791, 773, 788); + script_157(49938546, 49938525, cs2method2601(new WidgetPointer(762,93)), 1); + } + return; +} diff --git a/dumps/scripts/1457.cs2 b/dumps/scripts/1457.cs2 new file mode 100644 index 000000000..d882a825a --- /dev/null +++ b/dumps/scripts/1457.cs2 @@ -0,0 +1,19 @@ +void script_1457(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 0; + ivar3 = arg0; + while (ivar3 < arg1) { + if (setWidgetRegister(new WidgetPointer(762,93), ivar3)) { + setWidgetPosition(add(multiply(44, mod(ivar2, 10)), 8), add(multiply(divide(ivar2, 10), 44), 5), 0, 0); + setWidgetHidden(0); + ivar2 = add(ivar2, 1); + } + ivar3 = add(ivar3, 1); + } + script_1464(); + setWidgetIsHidden(false, new WidgetPointer(762,84)); + setWidgetPosition(subtract(8, 2), subtract(5, 2), 0, 0, new WidgetPointer(762,84)); + script_1458(ivar2); + return; +} diff --git a/dumps/scripts/1458.cs2 b/dumps/scripts/1458.cs2 new file mode 100644 index 000000000..b01b1f2de --- /dev/null +++ b/dumps/scripts/1458.cs2 @@ -0,0 +1,14 @@ +void script_1458(int arg0) { + int ivar1; + ivar1 = multiply(divide(arg0, 10), 44); + if (mod(arg0, 10) != 0) { + ivar1 = add(ivar1, 44); + } + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(762,93)), ivar1, new WidgetPointer(762,93)); + deleteAllExtraChilds(new WidgetPointer(762,114)); + if (ivar1 > getWidgetActualHeight(new WidgetPointer(762,93))) { + script_31(49938546, 49938525, 792, 789, 790, 791, 773, 788); + } + script_157(49938546, 49938525, cs2method2601(new WidgetPointer(762,93)), 1); + return; +} diff --git a/dumps/scripts/1459.cs2 b/dumps/scripts/1459.cs2 new file mode 100644 index 000000000..ee8494f01 --- /dev/null +++ b/dumps/scripts/1459.cs2 @@ -0,0 +1,46 @@ +void script_1459() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 2; + ivar1 = 0; + ivar2 = 0; + while (ivar0 <= 9) { + switch (ivar0) { + case 2: + ivar1 = bitconfig_4885; + break; + case 3: + ivar1 = bitconfig_4886; + break; + case 4: + ivar1 = bitconfig_4887; + break; + case 5: + ivar1 = bitconfig_4888; + break; + case 6: + ivar1 = bitconfig_4889; + break; + case 7: + ivar1 = bitconfig_4890; + break; + case 8: + ivar1 = bitconfig_4891; + break; + case 9: + ivar1 = bitconfig_4892; + } + if (ivar1 > 0) { + script_1460(ivar0, script_1470(ivar0)); + } else if (((boolean)ivar2)) { + script_1461(ivar0); + ivar2 = 1; + } else { + script_1462(ivar0); + } + ivar0 = add(ivar0, 1); + } + script_1463(bitconfig_4893); + return; +} diff --git a/dumps/scripts/146.cs2 b/dumps/scripts/146.cs2 new file mode 100644 index 000000000..8c4b57022 --- /dev/null +++ b/dumps/scripts/146.cs2 @@ -0,0 +1,4 @@ +void script_146(int arg0) { + script_147(arg0, getClientCycle()); + return; +} diff --git a/dumps/scripts/1460.cs2 b/dumps/scripts/1460.cs2 new file mode 100644 index 000000000..d40673da8 --- /dev/null +++ b/dumps/scripts/1460.cs2 @@ -0,0 +1,20 @@ +void script_1460(int arg0,int arg1) { + int ivar2; + int ivar3; + string svar0; + ivar2 = ((int)cs2method_3408(105, 73, 1614, arg0)); + ivar3 = ((int)cs2method_3408(105, 73, 1615, arg0)); + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + setWidgetIsHidden(false, new WidgetPointer(ivar3)); + setItemOnWidgetMethod2205(getItemIdInSlot(95, arg1), getItemAmtInSlot(95, arg1), new WidgetPointer(ivar3)); + setWidgetBorderThickness(1, new WidgetPointer(ivar3)); + setWidgetShadowColor(new Color(51, 51, 51), new WidgetPointer(ivar3)); + setWidgetNoOptions(new WidgetPointer(ivar2)); + setWidgetContextMenuOption(1, new WidgetPointer(ivar2), "View tab " + intToStr(arg0)); + setWidgetContextMenuOption(2, new WidgetPointer(ivar2), "Collapse tab " + intToStr(arg0)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar2)); + svar0 = "Click here to select tab " + intToStr(arg0); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(762,119), svar0, 25, 150, "IIsii", new WidgetPointer(ivar2)); + setScriptCallOnMouseExit(40, new WidgetPointer(762,119), "I", new WidgetPointer(ivar2)); + return; +} diff --git a/dumps/scripts/1461.cs2 b/dumps/scripts/1461.cs2 new file mode 100644 index 000000000..8191739f8 --- /dev/null +++ b/dumps/scripts/1461.cs2 @@ -0,0 +1,19 @@ +void script_1461(int arg0) { + int ivar1; + int ivar2; + string svar0; + ivar1 = ((int)cs2method_3408(105, 73, 1614, arg0)); + ivar2 = ((int)cs2method_3408(105, 73, 1615, arg0)); + setWidgetIsHidden(false, new WidgetPointer(ivar1)); + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + setItemOnWidgetMethod2200(-1, -1, new WidgetPointer(ivar2)); + setWidgetSprite(1435, new WidgetPointer(ivar2)); + setWidgetBorderThickness(0, new WidgetPointer(ivar2)); + setWidgetShadowColor(new Color(0, 0, 0), new WidgetPointer(ivar2)); + setWidgetNoOptions(new WidgetPointer(ivar1)); + setScriptCallOnMousePressed(1481, "", new WidgetPointer(ivar1)); + svar0 = "Drag an item here to create a new tab"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(762,119), svar0, 25, 150, "IIsii", new WidgetPointer(ivar1)); + setScriptCallOnMouseExit(40, new WidgetPointer(762,119), "I", new WidgetPointer(ivar1)); + return; +} diff --git a/dumps/scripts/1462.cs2 b/dumps/scripts/1462.cs2 new file mode 100644 index 000000000..b168d3b2f --- /dev/null +++ b/dumps/scripts/1462.cs2 @@ -0,0 +1,5 @@ +void script_1462(int arg0) { + setWidgetIsHidden(true, cs2method_3408(105, 73, 1614, arg0)); + setWidgetIsHidden(true, cs2method_3408(105, 73, 1615, arg0)); + return; +} diff --git a/dumps/scripts/1463.cs2 b/dumps/scripts/1463.cs2 new file mode 100644 index 000000000..62e15afa1 --- /dev/null +++ b/dumps/scripts/1463.cs2 @@ -0,0 +1,40 @@ +void script_1463(int arg0) { + setWidgetSprite(1421, new WidgetPointer(762,62)); + setWidgetSprite(1421, new WidgetPointer(762,60)); + setWidgetSprite(1421, new WidgetPointer(762,58)); + setWidgetSprite(1421, new WidgetPointer(762,56)); + setWidgetSprite(1421, new WidgetPointer(762,54)); + setWidgetSprite(1421, new WidgetPointer(762,52)); + setWidgetSprite(1421, new WidgetPointer(762,50)); + setWidgetSprite(1421, new WidgetPointer(762,48)); + setWidgetSprite(1421, new WidgetPointer(762,46)); + switch (arg0) { + case 1: + setWidgetSprite(1419, new WidgetPointer(762,62)); + break; + case 2: + setWidgetSprite(1419, new WidgetPointer(762,60)); + break; + case 3: + setWidgetSprite(1419, new WidgetPointer(762,58)); + break; + case 4: + setWidgetSprite(1419, new WidgetPointer(762,56)); + break; + case 5: + setWidgetSprite(1419, new WidgetPointer(762,54)); + break; + case 6: + setWidgetSprite(1419, new WidgetPointer(762,52)); + break; + case 7: + setWidgetSprite(1419, new WidgetPointer(762,50)); + break; + case 8: + setWidgetSprite(1419, new WidgetPointer(762,48)); + break; + case 9: + setWidgetSprite(1419, new WidgetPointer(762,46)); + } + return; +} diff --git a/dumps/scripts/1464.cs2 b/dumps/scripts/1464.cs2 new file mode 100644 index 000000000..586f3c62a --- /dev/null +++ b/dumps/scripts/1464.cs2 @@ -0,0 +1,31 @@ +void script_1464() { + setWidgetIsHidden(true, new WidgetPointer(762,64)); + setWidgetIsHidden(true, new WidgetPointer(762,65)); + setWidgetIsHidden(true, new WidgetPointer(762,66)); + setWidgetIsHidden(true, new WidgetPointer(762,67)); + setWidgetIsHidden(true, new WidgetPointer(762,68)); + setWidgetIsHidden(true, new WidgetPointer(762,69)); + setWidgetIsHidden(true, new WidgetPointer(762,70)); + setWidgetIsHidden(true, new WidgetPointer(762,71)); + setWidgetIsHidden(true, new WidgetPointer(762,72)); + setWidgetIsHidden(true, new WidgetPointer(762,73)); + setWidgetIsHidden(true, new WidgetPointer(762,74)); + setWidgetIsHidden(true, new WidgetPointer(762,75)); + setWidgetIsHidden(true, new WidgetPointer(762,76)); + setWidgetIsHidden(true, new WidgetPointer(762,77)); + setWidgetIsHidden(true, new WidgetPointer(762,78)); + setWidgetIsHidden(true, new WidgetPointer(762,79)); + setWidgetIsHidden(true, new WidgetPointer(762,80)); + setWidgetIsHidden(true, new WidgetPointer(762,81)); + setWidgetIsHidden(true, new WidgetPointer(762,82)); + setWidgetIsHidden(true, new WidgetPointer(762,84)); + setWidgetIsHidden(true, new WidgetPointer(762,85)); + setWidgetIsHidden(true, new WidgetPointer(762,86)); + setWidgetIsHidden(true, new WidgetPointer(762,87)); + setWidgetIsHidden(true, new WidgetPointer(762,88)); + setWidgetIsHidden(true, new WidgetPointer(762,89)); + setWidgetIsHidden(true, new WidgetPointer(762,90)); + setWidgetIsHidden(true, new WidgetPointer(762,91)); + setWidgetIsHidden(true, new WidgetPointer(762,92)); + return; +} diff --git a/dumps/scripts/1465.cs2 b/dumps/scripts/1465.cs2 new file mode 100644 index 000000000..f17c0112b --- /dev/null +++ b/dumps/scripts/1465.cs2 @@ -0,0 +1,57 @@ +void script_1465() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + string svar1; + string svar2; + svar0 = "Total number of " + "" + "free" + "" + " bank slots used"; + svar1 = "Total number of " + "" + "member" + "" + " bank slots used"; + svar2 = "Total number of " + "" + "demo" + "" + " bank slots used"; + ivar0 = 0; + ivar1 = 0; + if (((boolean)script_3287())) { + ivar0 = add(subtract(516, 439), 1); + ivar1 = subtract(516, ivar0); + } else { + ivar0 = subtract(add(subtract(516, 439), 1), 10); + ivar1 = subtract(subtract(516, 10), ivar0); + } + ivar2 = globalint_1038; + ivar3 = subtract(globalint_192, ivar2); + ivar4 = multiply(subtract(ivar0, ivar2), -1); + ivar5 = subtract(ivar3, subtract(439, 1)); + setWidgetIsHidden(false, new WidgetPointer(762,22)); + setWidgetIsHidden(true, new WidgetPointer(762,23)); + if (ivar5 > 0) { + ivar2 = add(ivar2, ivar5); + ivar3 = subtract(439, 1); + if (((boolean)ivar5)) { + svar0 = "Total number of " + "" + "free" + "" + " bank slots used" + "
" + "" + "Note: this includes an overflow of 1 member item" + ""; + } else { + svar0 = "Total number of " + "" + "free" + "" + " bank slots used" + "
" + "" + "Note: this includes an overflow of " + intToStr(ivar5) + " member items" + ""; + } + svar1 = "Total number of " + "" + "member" + "" + " bank slots used"; + } else { + if (ivar4 > 0) { + ivar3 = add(ivar3, ivar4); + ivar2 = ivar0; + svar0 = "Total number of " + "" + "free" + "" + " bank slots used"; + if (((boolean)ivar4)) { + svar1 = "Total number of " + "" + "member" + "" + " bank slots used" + "
" + "" + "Note: this includes an overflow of 1 free item" + ""; + } else { + svar1 = "Total number of " + "" + "member" + "" + " bank slots used" + "
" + "" + "Note: this includes an overflow of " + intToStr(ivar4) + " free items" + ""; + } + } + } + setWidgetText(new WidgetPointer(762,29), intToStr(ivar2)); + setWidgetText(new WidgetPointer(762,31), intToStr(ivar3)); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(762,119), svar0, 25, 150, "IiIsii", new WidgetPointer(762,29)); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(762,119), svar1, 25, 150, "IiIsii", new WidgetPointer(762,31)); + setWidgetText(new WidgetPointer(762,30), intToStr(ivar0)); + setWidgetText(new WidgetPointer(762,32), intToStr(ivar1)); + return; +} diff --git a/dumps/scripts/1466.cs2 b/dumps/scripts/1466.cs2 new file mode 100644 index 000000000..2fe754bef --- /dev/null +++ b/dumps/scripts/1466.cs2 @@ -0,0 +1,12 @@ +int script_1466() { + if (isSiteSettingsMembers()) { + if (((boolean)script_3287())) { + return 516; + } + return subtract(516, 10); + } + if (((boolean)script_3287())) { + return add(subtract(516, 439), 1); + } + return subtract(add(subtract(516, 439), 1), 10); +} diff --git a/dumps/scripts/1467.cs2 b/dumps/scripts/1467.cs2 new file mode 100644 index 000000000..2df587eca --- /dev/null +++ b/dumps/scripts/1467.cs2 @@ -0,0 +1,57 @@ +cs2func_script_1467_struct(2,0,0) script_1467(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int stack_dump0; + cs2func_script_1467_struct(2,0,0) structdump_1; + cs2func_script_1467_struct(2,0,0) structdump_2; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + if (((boolean)arg0)) { + stack_dump0 = 9; + structdump_1 = script_1467(stack_dump0); + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + ivar1 = ivar2; + stack_dump0 = 1; + structdump_2 = script_1467(stack_dump0); + ivar2 = structdump_2.intpart_1; + ivar3 = structdump_2.intpart_0; + return newstruct cs2func_script_1467_struct(ivar1, ivar2); + } + if (((boolean)arg0)) { + return newstruct cs2func_script_1467_struct(0, 516); + } + ivar1 = 0; + ivar2 = bitconfig_4885; + if (arg0 >= 3) { + ivar1 = ivar2; + ivar2 = add(ivar1, bitconfig_4886); + } + if (arg0 >= 4) { + ivar1 = ivar2; + ivar2 = add(ivar1, bitconfig_4887); + } + if (arg0 >= 5) { + ivar1 = ivar2; + ivar2 = add(ivar1, bitconfig_4888); + } + if (arg0 >= 6) { + ivar1 = ivar2; + ivar2 = add(ivar1, bitconfig_4889); + } + if (arg0 >= 7) { + ivar1 = ivar2; + ivar2 = add(ivar1, bitconfig_4890); + } + if (arg0 >= 8) { + ivar1 = ivar2; + ivar2 = add(ivar1, bitconfig_4891); + } + if (arg0 >= 9) { + ivar1 = ivar2; + ivar2 = add(ivar1, bitconfig_4892); + } + return newstruct cs2func_script_1467_struct(ivar1, ivar2); +} diff --git a/dumps/scripts/1468.cs2 b/dumps/scripts/1468.cs2 new file mode 100644 index 000000000..ef3be34ea --- /dev/null +++ b/dumps/scripts/1468.cs2 @@ -0,0 +1,28 @@ +int script_1468(int arg0) { + arg0 = add(arg0, 1); + if (arg0 <= bitconfig_4885) { + return 2; + } + if (arg0 <= add(bitconfig_4885, bitconfig_4886)) { + return 3; + } + if (arg0 <= add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887)) { + return 4; + } + if (arg0 <= add(add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887), bitconfig_4888)) { + return 5; + } + if (arg0 <= add(add(add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887), bitconfig_4888), bitconfig_4889)) { + return 6; + } + if (arg0 <= add(add(add(add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887), bitconfig_4888), bitconfig_4889), bitconfig_4890)) { + return 7; + } + if (arg0 <= add(add(add(add(add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887), bitconfig_4888), bitconfig_4889), bitconfig_4890), bitconfig_4891)) { + return 8; + } + if (arg0 <= add(add(add(add(add(add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887), bitconfig_4888), bitconfig_4889), bitconfig_4890), bitconfig_4891), bitconfig_4892)) { + return 9; + } + return 1; +} diff --git a/dumps/scripts/1469.cs2 b/dumps/scripts/1469.cs2 new file mode 100644 index 000000000..03ca91c22 --- /dev/null +++ b/dumps/scripts/1469.cs2 @@ -0,0 +1,27 @@ +int script_1469() { + if (((boolean)bitconfig_4885)) { + return 2; + } + if (((boolean)bitconfig_4886)) { + return 3; + } + if (((boolean)bitconfig_4887)) { + return 4; + } + if (((boolean)bitconfig_4888)) { + return 5; + } + if (((boolean)bitconfig_4889)) { + return 6; + } + if (((boolean)bitconfig_4890)) { + return 7; + } + if (((boolean)bitconfig_4891)) { + return 8; + } + if (((boolean)bitconfig_4892)) { + return 9; + } + return -1; +} diff --git a/dumps/scripts/147.cs2 b/dumps/scripts/147.cs2 new file mode 100644 index 000000000..11e54b5bb --- /dev/null +++ b/dumps/scripts/147.cs2 @@ -0,0 +1,91 @@ +void script_147(int arg0,int arg1) { + switch (arg0) { + case 0: + globalint_12 = arg1; + break; + case 1: + globalint_13 = arg1; + break; + case 2: + globalint_14 = arg1; + break; + case 3: + globalint_15 = arg1; + break; + case 4: + globalint_16 = arg1; + break; + case 5: + globalint_17 = arg1; + break; + case 6: + globalint_18 = arg1; + break; + case 7: + globalint_19 = arg1; + break; + case 8: + globalint_20 = arg1; + break; + case 9: + globalint_21 = arg1; + break; + case 10: + globalint_22 = arg1; + break; + case 11: + globalint_23 = arg1; + break; + case 12: + globalint_24 = arg1; + break; + case 13: + globalint_25 = arg1; + break; + case 14: + globalint_26 = arg1; + break; + case 15: + globalint_27 = arg1; + break; + case 16: + globalint_28 = arg1; + break; + case 17: + globalint_29 = arg1; + break; + case 18: + globalint_30 = arg1; + break; + case 19: + globalint_31 = arg1; + break; + case 20: + globalint_32 = arg1; + break; + case 21: + globalint_33 = arg1; + break; + case 22: + globalint_34 = arg1; + break; + case 23: + globalint_35 = arg1; + break; + case 24: + globalint_36 = arg1; + break; + case 25: + globalint_37 = arg1; + break; + case 26: + globalint_38 = arg1; + break; + case 27: + globalint_39 = arg1; + break; + case -1: + globalint_212 = arg1; + } + return; +} diff --git a/dumps/scripts/1470.cs2 b/dumps/scripts/1470.cs2 new file mode 100644 index 000000000..6e3045111 --- /dev/null +++ b/dumps/scripts/1470.cs2 @@ -0,0 +1,21 @@ +int script_1470(int arg0) { + switch (arg0) { + case 2: + return 0; + case 3: + return bitconfig_4885; + case 4: + return add(bitconfig_4885, bitconfig_4886); + case 5: + return add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887); + case 6: + return add(add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887), bitconfig_4888); + case 7: + return add(add(add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887), bitconfig_4888), bitconfig_4889); + case 8: + return add(add(add(add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887), bitconfig_4888), bitconfig_4889), bitconfig_4890); + case 9: + return add(add(add(add(add(add(bitconfig_4885, bitconfig_4886), bitconfig_4887), bitconfig_4888), bitconfig_4889), bitconfig_4890), bitconfig_4891); + } + return 0; +} diff --git a/dumps/scripts/1471.cs2 b/dumps/scripts/1471.cs2 new file mode 100644 index 000000000..9a15958cf --- /dev/null +++ b/dumps/scripts/1471.cs2 @@ -0,0 +1,13 @@ +void script_1471() { + setWidgetNoOptions(new WidgetPointer(762,17)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(762,17)); + globalint_190 = 0; + if (((boolean)globalint_188)) { + bitconfig_4893 = 0; + script_1473(); + } else { + bitconfig_4893 = 1; + script_1474(); + } + return; +} diff --git a/dumps/scripts/1472.cs2 b/dumps/scripts/1472.cs2 new file mode 100644 index 000000000..ad93b82f7 --- /dev/null +++ b/dumps/scripts/1472.cs2 @@ -0,0 +1,7 @@ +void script_1472() { + if (((boolean)globalint_190)) { + setWidgetContextMenuOption(1, new WidgetPointer(762,17), "Search"); + setScriptCallOnClickContextMenu(1471, "", new WidgetPointer(762,17)); + } + return; +} diff --git a/dumps/scripts/1473.cs2 b/dumps/scripts/1473.cs2 new file mode 100644 index 000000000..7a6b123a1 --- /dev/null +++ b/dumps/scripts/1473.cs2 @@ -0,0 +1,9 @@ +void script_1473() { + setWidgetSprite(1424, new WidgetPointer(762,18)); + setWidgetSprite(1433, new WidgetPointer(762,17)); + script_1463(0); + script_1456(); + script_1549(); + globalint_188 = 1; + return; +} diff --git a/dumps/scripts/1474.cs2 b/dumps/scripts/1474.cs2 new file mode 100644 index 000000000..75739de54 --- /dev/null +++ b/dumps/scripts/1474.cs2 @@ -0,0 +1,16 @@ +void script_1474() { + setWidgetIsHidden(true, new WidgetPointer(762,115)); + setWidgetIsHidden(true, new WidgetPointer(762,116)); + setWidgetSprite(1423, new WidgetPointer(762,18)); + setWidgetSprite(1431, new WidgetPointer(762,17)); + if (((boolean)bitconfig_4893)) { + script_1456(); + } + script_1463(1); + globalstring_138 = ""; + script_1548(11); + globalint_188 = 0; + setWidgetText(new WidgetPointer(762,45), "Bank of RuneScape"); + setScriptCallOnGameloop(-1, "", new WidgetPointer(762,17)); + return; +} diff --git a/dumps/scripts/1475.cs2 b/dumps/scripts/1475.cs2 new file mode 100644 index 000000000..53891995e --- /dev/null +++ b/dumps/scripts/1475.cs2 @@ -0,0 +1,11 @@ +void script_1475() { + globalstring_138 = globalstring_22; + if (getClientCycle() > globalint_191) { + script_1479(globalstring_138); + setScriptCallOnGameloop(-1, "", new WidgetPointer(762,17)); + globalint_191 = add(getClientCycle(), 10); + } else { + setScriptCallOnGameloop(1476, globalint_191, "i", new WidgetPointer(762,17)); + } + return; +} diff --git a/dumps/scripts/1476.cs2 b/dumps/scripts/1476.cs2 new file mode 100644 index 000000000..ff031d48e --- /dev/null +++ b/dumps/scripts/1476.cs2 @@ -0,0 +1,9 @@ +void script_1476(int arg0) { + if (getClientCycle() >= arg0) { + if (globalint_5 == 11) { + script_1479(globalstring_138); + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(762,17)); + } + return; +} diff --git a/dumps/scripts/1477.cs2 b/dumps/scripts/1477.cs2 new file mode 100644 index 000000000..30acc0780 --- /dev/null +++ b/dumps/scripts/1477.cs2 @@ -0,0 +1,20 @@ +void script_1477() { + if (((boolean)bitconfig_5007)) { + setWidgetText(new WidgetPointer(766,36), "Quick task:"); + } else { + setWidgetText(new WidgetPointer(766,36), "Large task:"); + } + setWidgetText(new WidgetPointer(766,100), intToStr(bitconfig_4216)); + setWidgetText(new WidgetPointer(766,102), intToStr(multiply(add(bitconfig_4208, 1), 5))); + setWidgetText(new WidgetPointer(766,91), intToStr(bitconfig_4217)); + setWidgetText(new WidgetPointer(766,93), intToStr(multiply(add(bitconfig_4209, 1), 5))); + setWidgetText(new WidgetPointer(766,81), intToStr(bitconfig_4218)); + setWidgetText(new WidgetPointer(766,83), intToStr(multiply(add(bitconfig_4210, 1), 5))); + setWidgetText(new WidgetPointer(766,71), intToStr(bitconfig_4219)); + setWidgetText(new WidgetPointer(766,73), intToStr(multiply(add(bitconfig_4211, 1), 5))); + setWidgetText(new WidgetPointer(766,61), intToStr(bitconfig_4220)); + setWidgetText(new WidgetPointer(766,63), intToStr(multiply(add(bitconfig_4212, 1), 5))); + setWidgetText(new WidgetPointer(766,51), intToStr(bitconfig_5008)); + setWidgetText(new WidgetPointer(766,53), intToStr(multiply(add(bitconfig_4213, 1), 5))); + return; +} diff --git a/dumps/scripts/1478.cs2 b/dumps/scripts/1478.cs2 new file mode 100644 index 000000000..ae7c6cf99 --- /dev/null +++ b/dumps/scripts/1478.cs2 @@ -0,0 +1,13 @@ +void script_1478() { + int ivar0; + globalstring_138 = globalstring_22; + ivar0 = script_1479(globalstring_138); + if (ivar0 > 1) { + messageType0("Search for '" + replaceLtGt(globalstring_138) + "' returned " + intToStr(ivar0) + " results."); + } else if (((boolean)ivar0)) { + messageType0("Search for '" + replaceLtGt(globalstring_138) + "' returned " + intToStr(ivar0) + " result."); + } else { + messageType0("Search for '" + replaceLtGt(globalstring_138) + "' returned 0 results."); + } + return; +} diff --git a/dumps/scripts/1479.cs2 b/dumps/scripts/1479.cs2 new file mode 100644 index 000000000..abf074427 --- /dev/null +++ b/dumps/scripts/1479.cs2 @@ -0,0 +1,42 @@ +int script_1479(string arg0) { + int ivar0; + int ivar1; + int ivar2; + arg0 = replaceLtGt(arg0); + script_41(49938529); + globalint_1 = 0; + script_1464(); + setWidgetIsHidden(true, new WidgetPointer(762,115)); + if (((boolean)strLength(arg0))) { + setWidgetText(new WidgetPointer(762,45), "Bank of RuneScape (no search entered)"); + setWidgetIsHidden(false, new WidgetPointer(762,116)); + script_1455(); + return 0; + } + setWidgetText(new WidgetPointer(762,45), "Bank of RuneScape (search: '" + arg0 + "')"); + setWidgetIsHidden(true, new WidgetPointer(762,116)); + ivar0 = getItemContainerLength(95); + ivar1 = 0; + ivar2 = 0; + cs2method2100(0, 0, new WidgetPointer(762,93)); + while (ivar1 < ivar0) { + if (strIndexof(0, lower(getItemName(getItemIdInSlot(95, ivar1))), lower(arg0)) != -1) { + if (setWidgetRegister(new WidgetPointer(762,93), ivar1)) { + setWidgetPosition(add(multiply(44, mod(ivar2, 10)), 8), add(multiply(divide(ivar2, 10), 44), 5), 0, 0); + setWidgetHidden(0); + ivar2 = add(ivar2, 1); + } + } else { + if (setWidgetRegister(new WidgetPointer(762,93), ivar1)) { + setWidgetPosition(0, 0, 0, 0); + setWidgetHidden(1); + } + } + ivar1 = add(ivar1, 1); + } + if (((boolean)ivar2)) { + setWidgetIsHidden(false, new WidgetPointer(762,115)); + } + script_1458(ivar2); + return ivar2; +} diff --git a/dumps/scripts/148.cs2 b/dumps/scripts/148.cs2 new file mode 100644 index 000000000..8f8d68cb6 --- /dev/null +++ b/dumps/scripts/148.cs2 @@ -0,0 +1,63 @@ +int script_148(int arg0) { + switch (arg0) { + case 0: + return globalint_12; + case 1: + return globalint_13; + case 2: + return globalint_14; + case 3: + return globalint_15; + case 4: + return globalint_16; + case 5: + return globalint_17; + case 6: + return globalint_18; + case 7: + return globalint_19; + case 8: + return globalint_20; + case 9: + return globalint_21; + case 10: + return globalint_22; + case 11: + return globalint_23; + case 12: + return globalint_24; + case 13: + return globalint_25; + case 14: + return globalint_26; + case 15: + return globalint_27; + case 16: + return globalint_28; + case 17: + return globalint_29; + case 18: + return globalint_30; + case 19: + return globalint_31; + case 20: + return globalint_32; + case 21: + return globalint_33; + case 22: + return globalint_34; + case 23: + return globalint_35; + case 24: + return globalint_36; + case 25: + return globalint_37; + case 26: + return globalint_38; + case 27: + return globalint_39; + case -1: + return globalint_212; + } + return 0; +} diff --git a/dumps/scripts/1480.cs2 b/dumps/scripts/1480.cs2 new file mode 100644 index 000000000..f752fb47d --- /dev/null +++ b/dumps/scripts/1480.cs2 @@ -0,0 +1,8 @@ +void script_1480(int arg0,int arg1) { + if (((boolean)globalint_188)) { + script_41(49938529); + return; + } + script_569(arg0, arg1, 49938529, 25, 150, "Item is in tab " + intToStr(script_1468(arg1))); + return; +} diff --git a/dumps/scripts/1481.cs2 b/dumps/scripts/1481.cs2 new file mode 100644 index 000000000..6ec82362c --- /dev/null +++ b/dumps/scripts/1481.cs2 @@ -0,0 +1,4 @@ +void script_1481() { + messageType0("Please drag an item here to create a new tab."); + return; +} diff --git a/dumps/scripts/1482.cs2 b/dumps/scripts/1482.cs2 new file mode 100644 index 000000000..bba070633 --- /dev/null +++ b/dumps/scripts/1482.cs2 @@ -0,0 +1,9 @@ +void script_1482(int arg0) { + int ivar1; + ivar1 = cs2method_3408(73, 105, 1613, arg0); + if ((ivar1 != -1) && (ivar1 != bitconfig_4893)) { + script_1463(ivar1); + setScriptCallOnGameloop(1483, add(getClientCycle(), 15), new WidgetPointer(-32768,3), "iI", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1483.cs2 b/dumps/scripts/1483.cs2 new file mode 100644 index 000000000..f5fd99cda --- /dev/null +++ b/dumps/scripts/1483.cs2 @@ -0,0 +1,7 @@ +void script_1483(int arg0,int arg1) { + if (getClientCycle() >= arg0) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + script_1463(bitconfig_4893); + } + return; +} diff --git a/dumps/scripts/1484.cs2 b/dumps/scripts/1484.cs2 new file mode 100644 index 000000000..4778bf0da --- /dev/null +++ b/dumps/scripts/1484.cs2 @@ -0,0 +1,7 @@ +void script_1484() { + if (((boolean)globalint_188)) { + script_1474(); + } + script_675(); + return; +} diff --git a/dumps/scripts/1485.cs2 b/dumps/scripts/1485.cs2 new file mode 100644 index 000000000..3a2f0c462 --- /dev/null +++ b/dumps/scripts/1485.cs2 @@ -0,0 +1,9 @@ +void script_1485() { + if (((boolean)standart_config_115)) { + standart_config_115 = 1; + } else { + standart_config_115 = 0; + } + script_1487(); + return; +} diff --git a/dumps/scripts/1486.cs2 b/dumps/scripts/1486.cs2 new file mode 100644 index 000000000..8b4e2c4d3 --- /dev/null +++ b/dumps/scripts/1486.cs2 @@ -0,0 +1,4 @@ +void script_1486() { + script_1487(); + return; +} diff --git a/dumps/scripts/1487.cs2 b/dumps/scripts/1487.cs2 new file mode 100644 index 000000000..a870490f6 --- /dev/null +++ b/dumps/scripts/1487.cs2 @@ -0,0 +1,16 @@ +void script_1487() { + string svar0; + svar0 = ""; + if (((boolean)standart_config_115)) { + setWidgetSprite(1431, new WidgetPointer(762,19)); + setWidgetSprite(1427, new WidgetPointer(762,20)); + svar0 = "Switch to note withdrawal mode"; + } else { + setWidgetSprite(1433, new WidgetPointer(762,19)); + setWidgetSprite(1428, new WidgetPointer(762,20)); + svar0 = "Switch to item withdrawal mode"; + } + setWidgetContextMenuOption(1, new WidgetPointer(762,19), svar0); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(762,119), svar0, 25, 150, "IIsii", new WidgetPointer(762,19)); + return; +} diff --git a/dumps/scripts/1488.cs2 b/dumps/scripts/1488.cs2 new file mode 100644 index 000000000..d43278f50 --- /dev/null +++ b/dumps/scripts/1488.cs2 @@ -0,0 +1,9 @@ +void script_1488() { + if (((boolean)standart_config_304)) { + standart_config_304 = 1; + } else { + standart_config_304 = 0; + } + script_1490(); + return; +} diff --git a/dumps/scripts/1489.cs2 b/dumps/scripts/1489.cs2 new file mode 100644 index 000000000..21e0cc014 --- /dev/null +++ b/dumps/scripts/1489.cs2 @@ -0,0 +1,4 @@ +void script_1489() { + script_1490(); + return; +} diff --git a/dumps/scripts/149.cs2 b/dumps/scripts/149.cs2 new file mode 100644 index 000000000..e830b221d --- /dev/null +++ b/dumps/scripts/149.cs2 @@ -0,0 +1,5 @@ +void script_149(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + script_153(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, "null", "null", "null", "null"); + setScriptCallOnItemContainerUpdate(151, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, "null", "null", "null", "null", arg1, 1, "IviiiIsssssssssY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1490.cs2 b/dumps/scripts/1490.cs2 new file mode 100644 index 000000000..657309a3a --- /dev/null +++ b/dumps/scripts/1490.cs2 @@ -0,0 +1,16 @@ +void script_1490() { + string svar0; + svar0 = ""; + if (((boolean)standart_config_304)) { + setWidgetSprite(1431, new WidgetPointer(762,15)); + setWidgetSprite(1425, new WidgetPointer(762,16)); + svar0 = "Switch to insert items mode"; + } else { + setWidgetSprite(1433, new WidgetPointer(762,15)); + setWidgetSprite(1426, new WidgetPointer(762,16)); + svar0 = "Switch to swap items mode"; + } + setWidgetContextMenuOption(1, new WidgetPointer(762,15), svar0); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(762,119), svar0, 25, 150, "IIsii", new WidgetPointer(762,15)); + return; +} diff --git a/dumps/scripts/1491.cs2 b/dumps/scripts/1491.cs2 new file mode 100644 index 000000000..7fb36c1ec --- /dev/null +++ b/dumps/scripts/1491.cs2 @@ -0,0 +1,8 @@ +void script_1491(int arg0) { + script_1455(); + script_1456(); + script_1463(1); + script_1474(); + bitconfig_4893 = 1; + return; +} diff --git a/dumps/scripts/1492.cs2 b/dumps/scripts/1492.cs2 new file mode 100644 index 000000000..8afede9a6 --- /dev/null +++ b/dumps/scripts/1492.cs2 @@ -0,0 +1,4 @@ +void script_1492(int arg0) { + script_1500(arg0, 2); + return; +} diff --git a/dumps/scripts/1493.cs2 b/dumps/scripts/1493.cs2 new file mode 100644 index 000000000..367d07e47 --- /dev/null +++ b/dumps/scripts/1493.cs2 @@ -0,0 +1,4 @@ +void script_1493(int arg0) { + script_1500(arg0, 3); + return; +} diff --git a/dumps/scripts/1494.cs2 b/dumps/scripts/1494.cs2 new file mode 100644 index 000000000..6fd61a815 --- /dev/null +++ b/dumps/scripts/1494.cs2 @@ -0,0 +1,4 @@ +void script_1494(int arg0) { + script_1500(arg0, 4); + return; +} diff --git a/dumps/scripts/1495.cs2 b/dumps/scripts/1495.cs2 new file mode 100644 index 000000000..293824074 --- /dev/null +++ b/dumps/scripts/1495.cs2 @@ -0,0 +1,4 @@ +void script_1495(int arg0) { + script_1500(arg0, 5); + return; +} diff --git a/dumps/scripts/1496.cs2 b/dumps/scripts/1496.cs2 new file mode 100644 index 000000000..365e1eeae --- /dev/null +++ b/dumps/scripts/1496.cs2 @@ -0,0 +1,4 @@ +void script_1496(int arg0) { + script_1500(arg0, 6); + return; +} diff --git a/dumps/scripts/1497.cs2 b/dumps/scripts/1497.cs2 new file mode 100644 index 000000000..23e54ecb0 --- /dev/null +++ b/dumps/scripts/1497.cs2 @@ -0,0 +1,4 @@ +void script_1497(int arg0) { + script_1500(arg0, 7); + return; +} diff --git a/dumps/scripts/1498.cs2 b/dumps/scripts/1498.cs2 new file mode 100644 index 000000000..ba755b432 --- /dev/null +++ b/dumps/scripts/1498.cs2 @@ -0,0 +1,4 @@ +void script_1498(int arg0) { + script_1500(arg0, 8); + return; +} diff --git a/dumps/scripts/1499.cs2 b/dumps/scripts/1499.cs2 new file mode 100644 index 000000000..e7276ffa7 --- /dev/null +++ b/dumps/scripts/1499.cs2 @@ -0,0 +1,4 @@ +void script_1499(int arg0) { + script_1500(arg0, 9); + return; +} diff --git a/dumps/scripts/15.cs2 b/dumps/scripts/15.cs2 new file mode 100644 index 000000000..c409e2e0e --- /dev/null +++ b/dumps/scripts/15.cs2 @@ -0,0 +1,4 @@ +void script_15() { + globalint_155 = 0; + return; +} diff --git a/dumps/scripts/150.cs2 b/dumps/scripts/150.cs2 new file mode 100644 index 000000000..b610bd409 --- /dev/null +++ b/dumps/scripts/150.cs2 @@ -0,0 +1,5 @@ +void script_150(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + script_153(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + setScriptCallOnItemContainerUpdate(151, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg1, 1, "IviiiIsssssssssY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1500.cs2 b/dumps/scripts/1500.cs2 new file mode 100644 index 000000000..27178d6cd --- /dev/null +++ b/dumps/scripts/1500.cs2 @@ -0,0 +1,47 @@ +void script_1500(int arg0,int arg1) { + int stack_dump0; + cs2func_script_1467_struct(2,0,0) structdump_1; + if (script_706(arg1) > 0) { + if (((boolean)arg0)) { + if (((boolean)globalint_188)) { + script_1474(); + } + script_1455(); + stack_dump0 = arg1; + structdump_1 = script_1467(stack_dump0); + script_1457(structdump_1.intpart_0, structdump_1.intpart_1); + script_1463(arg1); + cs2method2100(0, script_704(arg1), new WidgetPointer(762,93)); + script_157(49938546, 49938525, cs2method2601(new WidgetPointer(762,93)), 1); + bitconfig_4893 = arg1; + } else { + if (arg0 == 2) { + if (arg1 == 2) { + globalint_204 = globalint_205; + } + if (arg1 <= 3) { + globalint_205 = globalint_206; + } + if (arg1 <= 4) { + globalint_206 = globalint_207; + } + if (arg1 <= 5) { + globalint_207 = globalint_208; + } + if (arg1 <= 6) { + globalint_208 = globalint_209; + } + if (arg1 <= 7) { + globalint_209 = globalint_210; + } + if (arg1 <= 8) { + globalint_210 = globalint_211; + } + if (arg1 <= 9) { + globalint_211 = 0; + } + } + } + } + return; +} diff --git a/dumps/scripts/1501.cs2 b/dumps/scripts/1501.cs2 new file mode 100644 index 000000000..a5a532d21 --- /dev/null +++ b/dumps/scripts/1501.cs2 @@ -0,0 +1,5 @@ +void script_1501(int arg0,int arg1) { + script_41(arg1); + cs2method2103(0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1502.cs2 b/dumps/scripts/1502.cs2 new file mode 100644 index 000000000..be86b54dd --- /dev/null +++ b/dumps/scripts/1502.cs2 @@ -0,0 +1,246 @@ +int script_1502(int arg0) { + flow_0: + SWITCH (arg0) { + case 66650278: + GOTO flow_1 + case 66650279: + GOTO flow_2 + case 66650280: + GOTO flow_3 + case 66650281: + GOTO flow_4 + case 66650282: + GOTO flow_5 + case 66650283: + GOTO flow_6 + case 66650284: + GOTO flow_7 + case 66650285: + GOTO flow_8 + case 66650286: + GOTO flow_9 + case 66650287: + GOTO flow_10 + case 66650288: + GOTO flow_11 + case 66650289: + GOTO flow_12 + case 66650290: + GOTO flow_13 + case 66650291: + GOTO flow_14 + case 66650292: + GOTO flow_15 + case 66650293: + GOTO flow_16 + case 66650294: + GOTO flow_17 + case 66650295: + GOTO flow_18 + case 66650296: + GOTO flow_19 + case 66650297: + GOTO flow_20 + case 66650298: + GOTO flow_21 + case 66650299: + GOTO flow_22 + case 66650300: + GOTO flow_23 + case 66650301: + GOTO flow_24 + case 66650302: + GOTO flow_25 + case 66650303: + GOTO flow_26 + case 66650304: + GOTO flow_27 + case 66650305: + GOTO flow_28 + case 66650306: + GOTO flow_29 + case 66650307: + GOTO flow_30 + case 66650308: + GOTO flow_31 + case 66650309: + GOTO flow_32 + case 66650310: + GOTO flow_33 + case 66650311: + GOTO flow_34 + case 66650312: + GOTO flow_35 + case 66650313: + GOTO flow_36 + case 66650314: + GOTO flow_37 + case 66650315: + GOTO flow_38 + case 66650316: + GOTO flow_39 + case 66650317: + GOTO flow_40 + case 66650318: + GOTO flow_41 + case 66650319: + GOTO flow_42 + case 66650320: + GOTO flow_43 + case 66650321: + GOTO flow_44 + case 66650322: + GOTO flow_45 + case 66650323: + GOTO flow_46 + case 66650324: + GOTO flow_47 + case 66650325: + GOTO flow_48 + case 66650326: + GOTO flow_49 + case 66650327: + GOTO flow_50 + case 66650328: + GOTO flow_51 + case 66650329: + GOTO flow_52 + case 66650330: + GOTO flow_53 + case 66650331: + GOTO flow_54 + case 66650332: + GOTO flow_55 + case 66650333: + GOTO flow_56 + case 66650334: + GOTO flow_57 + case 66650335: + GOTO flow_58 + case 66650336: + GOTO flow_59 + case 66650337: + GOTO flow_60 + } + return -1; + flow_1: + return 1; + flow_2: + return 2; + flow_3: + return 3; + flow_4: + return 4; + flow_5: + return 5; + flow_6: + return 6; + flow_7: + return 7; + flow_8: + return 8; + flow_9: + return 9; + flow_10: + return 10; + flow_11: + return 11; + flow_12: + return 12; + flow_13: + return 13; + flow_14: + return 14; + flow_15: + return 15; + flow_16: + return 16; + flow_17: + return 17; + flow_18: + return 18; + flow_19: + return 19; + flow_20: + return 20; + flow_21: + return 21; + flow_22: + return 22; + flow_23: + return 23; + flow_24: + return 24; + flow_25: + return 25; + flow_26: + return 26; + flow_27: + return 27; + flow_28: + return 28; + flow_29: + return 29; + flow_30: + return 30; + flow_31: + return 31; + flow_32: + return 32; + flow_33: + return 33; + flow_34: + return 34; + flow_35: + return 35; + flow_36: + return 36; + flow_37: + return 37; + flow_38: + return 38; + flow_39: + return 39; + flow_40: + return 40; + flow_41: + return 41; + flow_42: + return 42; + flow_43: + return 43; + flow_44: + return 44; + flow_45: + return 45; + flow_46: + return 46; + flow_47: + return 47; + flow_48: + return 48; + flow_49: + return 49; + flow_50: + return 50; + flow_51: + return 51; + flow_52: + return 52; + flow_53: + return 53; + flow_54: + return 54; + flow_55: + return 55; + flow_56: + return 56; + flow_57: + return 57; + flow_58: + return 58; + flow_59: + return 59; + flow_60: + return 60; +} diff --git a/dumps/scripts/1503.cs2 b/dumps/scripts/1503.cs2 new file mode 100644 index 000000000..472a21a3e --- /dev/null +++ b/dumps/scripts/1503.cs2 @@ -0,0 +1,16 @@ +void script_1503() { + deleteAllExtraChilds(new WidgetPointer(728,1)); + script_1088(47710209, 22); + deleteAllExtraChilds(new WidgetPointer(728,6)); + script_333(47710214, 4734771, 3156258, 0, 0); + script_2647(47710214); + deleteAllExtraChilds(new WidgetPointer(728,9)); + script_333(47710217, 4734771, 3156258, 0, 0); + script_1516(47710217, 380, 100); + script_2647(47710217); + deleteAllExtraChilds(new WidgetPointer(728,11)); + script_2647(47710219); + script_1506(); + setScriptCallOnGlobalConfigChange(1505, 1014, 1018, 2, "Y", new WidgetPointer(728,1)); + return; +} diff --git a/dumps/scripts/1504.cs2 b/dumps/scripts/1504.cs2 new file mode 100644 index 000000000..bde22d775 --- /dev/null +++ b/dumps/scripts/1504.cs2 @@ -0,0 +1,9 @@ +int script_1504(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg2), arg3) || ((arg3 == -1) && setWidgetRegister(new WidgetPointer(arg2)))) { + ivar4 = divide(subtract(getWidgetActualWidth(), getTextWidth(arg1, script_1602(arg4))), 2); + return script_1401(arg0, arg1, ivar4, arg4); + } + return strLength(arg4); +} diff --git a/dumps/scripts/1505.cs2 b/dumps/scripts/1505.cs2 new file mode 100644 index 000000000..1a1a42eb3 --- /dev/null +++ b/dumps/scripts/1505.cs2 @@ -0,0 +1,4 @@ +void script_1505() { + script_1506(); + return; +} diff --git a/dumps/scripts/1506.cs2 b/dumps/scripts/1506.cs2 new file mode 100644 index 000000000..d6237d37b --- /dev/null +++ b/dumps/scripts/1506.cs2 @@ -0,0 +1,146 @@ +void script_1506() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + string svar0; + ivar0 = -1; + ivar1 = -1; + if (IsFemale()) { + ivar0 = 1137; + ivar1 = 3294; + } else { + ivar0 = 1136; + ivar1 = 3291; + } + deleteAllExtraChilds(new WidgetPointer(728,7)); + ivar2 = 0; + ivar3 = getCommonDefinitionSize(ivar0); + ivar4 = -1; + svar0 = ""; + ivar5 = 0; + ivar6 = 0; + while (ivar2 < ivar3) { + ivar4 = cs2method_3408(105, 75, ivar0, ivar2); + svar0 = cs2method_3408(105, 115, ivar1, ivar2); + createExtraChild(new WidgetPointer(728,7), 5, getExtraChildGap(new WidgetPointer(728,7))); + setWidgetSize(17, 17, 0, 0); + setWidgetPosition(0, add(ivar5, 1), 0, 0); + createExtraChild(new WidgetPointer(728,7), 4, getExtraChildGap(new WidgetPointer(728,7))); + setWidgetSize(20, 19, 1, 0); + setWidgetPosition(0, ivar5, 2, 0); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetFont(495); + setWidgetText(svar0); + if (ivar4 == globalint_1014) { + setWidgetSprite(699); + ivar6 = ivar5; + } else { + setWidgetSprite(697); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16750623, "Iii"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16750623, "Iii"); + setWidgetContextMenuOption(1, svar0); + setWidgetContextMenuOption(1, svar0); + setScriptCallOnClickContextMenu(1507, -2147483644, ivar4, "iK"); + setScriptCallOnClickContextMenu(1507, -2147483644, ivar4, "iK"); + } + ivar2 = add(ivar2, 1); + ivar5 = add(ivar5, 19); + } + if (ivar5 > getWidgetActualHeight(new WidgetPointer(728,7))) { + setWidgetSize(20, 4, 1, 1, new WidgetPointer(728,7)); + setWidgetScrollMax(0, ivar5, new WidgetPointer(728,7)); + if (ivar6 < cs2method2601(new WidgetPointer(728,7))) { + cs2method2100(0, subtract(ivar6, 5), new WidgetPointer(728,7)); + } else { + if (add(ivar6, 19) >= add(cs2method2601(new WidgetPointer(728,7)), getWidgetActualHeight(new WidgetPointer(728,7)))) { + cs2method2100(0, subtract(add(ivar6, 25), getWidgetActualHeight(new WidgetPointer(728,7))), new WidgetPointer(728,7)); + } + } + setWidgetIsHidden(false, new WidgetPointer(728,8)); + script_31(47710216, 47710215, 792, 789, 790, 791, 773, 788); + } else { + setWidgetSize(4, 4, 1, 1, new WidgetPointer(728,7)); + setWidgetScrollMax(0, 0, new WidgetPointer(728,7)); + cs2method2100(0, 0, new WidgetPointer(728,7)); + deleteAllExtraChilds(new WidgetPointer(728,8)); + setWidgetIsHidden(true, new WidgetPointer(728,8)); + } + deleteAllExtraChilds(new WidgetPointer(728,12)); + ivar3 = getCommonDefinitionSize(3297); + ivar7 = 6; + if (multiply(add(divide(subtract(ivar3, 1), ivar7), 1), 21) > getWidgetActualHeight(new WidgetPointer(728,12))) { + ivar7 = 5; + } + ivar2 = 0; + ivar5 = 0; + ivar8 = 0; + ivar9 = -1; + ivar10 = 0; + while (ivar2 < ivar3) { + svar0 = cs2method_3408(105, 115, 3296, ivar2); + ivar10 = cs2method_3408(105, 105, 3297, ivar2); + createExtraChild(new WidgetPointer(728,12), 3, getExtraChildGap(new WidgetPointer(728,12))); + setWidgetSize(21, 21, 0, 0); + setWidgetFilled(1); + setWidgetPosition(multiply(ivar8, getWidgetActualWidth()), ivar5, 0, 0); + setWidgetRGB(new Color(cs2method_3408(105, 105, 753, ivar2))); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(728,18), svar0, 0, 512, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(728,18), "I"); + createExtraChild(new WidgetPointer(728,12), 5, getExtraChildGap(new WidgetPointer(728,12))); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + if (ivar10 == globalint_1018) { + setWidgetSprite(1043); + ivar6 = ivar5; + } else { + ivar9 = 1041; + setWidgetSprite(ivar9); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar9, "Iid"); + ivar9 = 1042; + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar9, "Iid"); + setWidgetContextMenuOption(1, svar0); + setScriptCallOnClickContextMenu(1508, -2147483644, ivar10, "ii"); + } + ivar2 = add(ivar2, 1); + if (ivar8 < subtract(ivar7, 1)) { + ivar8 = add(ivar8, 1); + } else { + ivar8 = 0; + ivar5 = add(ivar5, getWidgetActualHeight()); + } + } + if (ivar8 != 0) { + ivar5 = add(ivar5, 21); + } + if ((ivar5 > getWidgetActualHeight(new WidgetPointer(728,12))) || (ivar7 < 6)) { + setWidgetSize(20, 4, 1, 1, new WidgetPointer(728,12)); + setWidgetScrollMax(0, ivar5, new WidgetPointer(728,12)); + if (ivar6 < cs2method2601(new WidgetPointer(728,12))) { + cs2method2100(0, subtract(ivar6, 5), new WidgetPointer(728,12)); + } else { + if (add(ivar6, 21) >= add(cs2method2601(new WidgetPointer(728,12)), getWidgetActualHeight(new WidgetPointer(728,12)))) { + cs2method2100(0, subtract(add(ivar6, 25), getWidgetActualHeight(new WidgetPointer(728,12))), new WidgetPointer(728,12)); + } + } + setWidgetIsHidden(false, new WidgetPointer(728,13)); + script_31(47710221, 47710220, 792, 789, 790, 791, 773, 788); + } else { + setWidgetSize(4, 4, 1, 1, new WidgetPointer(728,12)); + setWidgetScrollMax(0, 0, new WidgetPointer(728,12)); + cs2method2100(0, 0, new WidgetPointer(728,12)); + deleteAllExtraChilds(new WidgetPointer(728,13)); + setWidgetIsHidden(true, new WidgetPointer(728,13)); + } + return; +} diff --git a/dumps/scripts/1507.cs2 b/dumps/scripts/1507.cs2 new file mode 100644 index 000000000..b43cec172 --- /dev/null +++ b/dumps/scripts/1507.cs2 @@ -0,0 +1,13 @@ +void script_1507(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + if (IsFemale()) { + cs2method403(13, arg1); + } else { + cs2method403(6, arg1); + } + globalint_1014 = arg1; + script_1506(); + return; +} diff --git a/dumps/scripts/1508.cs2 b/dumps/scripts/1508.cs2 new file mode 100644 index 000000000..8ca781d77 --- /dev/null +++ b/dumps/scripts/1508.cs2 @@ -0,0 +1,9 @@ +void script_1508(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + cs2method404(3, arg1); + globalint_1018 = arg1; + script_1506(); + return; +} diff --git a/dumps/scripts/1509.cs2 b/dumps/scripts/1509.cs2 new file mode 100644 index 000000000..c2c8c1791 --- /dev/null +++ b/dumps/scripts/1509.cs2 @@ -0,0 +1,35 @@ +void script_1509() { + string svar0; + deleteAllExtraChilds(new WidgetPointer(729,1)); + script_1088(47775745, 22); + deleteAllExtraChilds(new WidgetPointer(729,11)); + script_333(47775755, 4734771, 3156258, 0, 0); + script_2647(47775755); + deleteAllExtraChilds(new WidgetPointer(729,14)); + script_333(47775758, 4734771, 3156258, 0, 0); + script_1516(47775758, 380, 100); + script_2647(47775758); + deleteAllExtraChilds(new WidgetPointer(729,16)); + script_2647(47775760); + globalint_778 = bitconfig_6091; + script_1513(); + setScriptCallOnConfigChange(1510, 1057, 1, "Y", new WidgetPointer(729,1)); + setScriptCallOnGlobalConfigChange(1511, 1010, 1011, 1012, 1013, 1016, 1017, 6, "Y", new WidgetPointer(729,1)); + setScriptCallOnClickContextMenu(1512, -2147483644, 0, "ii", new WidgetPointer(729,6)); + setScriptCallOnClickContextMenu(1512, -2147483644, 1, "ii", new WidgetPointer(729,7)); + setScriptCallOnClickContextMenu(1512, -2147483644, 2, "ii", new WidgetPointer(729,8)); + setScriptCallOnClickContextMenu(1512, -2147483644, 3, "ii", new WidgetPointer(729,9)); + svar0 = "Choose a top"; + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(729,23), svar0, 25, 512, "IiIsii", new WidgetPointer(729,6)); + setScriptCallOnMouseExit(40, new WidgetPointer(729,23), "I", new WidgetPointer(729,6)); + svar0 = "Choose some sleeves"; + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(729,23), svar0, 25, 512, "IiIsii", new WidgetPointer(729,7)); + setScriptCallOnMouseExit(40, new WidgetPointer(729,23), "I", new WidgetPointer(729,7)); + svar0 = "Decorate your wrists"; + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(729,23), svar0, 25, 512, "IiIsii", new WidgetPointer(729,8)); + setScriptCallOnMouseExit(40, new WidgetPointer(729,23), "I", new WidgetPointer(729,8)); + svar0 = "Choose some leggings"; + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(729,23), svar0, 25, 512, "IiIsii", new WidgetPointer(729,9)); + setScriptCallOnMouseExit(40, new WidgetPointer(729,23), "I", new WidgetPointer(729,9)); + return; +} diff --git a/dumps/scripts/151.cs2 b/dumps/scripts/151.cs2 new file mode 100644 index 000000000..8830c210d --- /dev/null +++ b/dumps/scripts/151.cs2 @@ -0,0 +1,4 @@ +void script_151(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + script_153(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + return; +} diff --git a/dumps/scripts/1510.cs2 b/dumps/scripts/1510.cs2 new file mode 100644 index 000000000..95edbb3a8 --- /dev/null +++ b/dumps/scripts/1510.cs2 @@ -0,0 +1,7 @@ +void script_1510() { + if (bitconfig_6091 != globalint_778) { + globalint_778 = bitconfig_6091; + script_1513(); + } + return; +} diff --git a/dumps/scripts/1511.cs2 b/dumps/scripts/1511.cs2 new file mode 100644 index 000000000..d8e10dbd4 --- /dev/null +++ b/dumps/scripts/1511.cs2 @@ -0,0 +1,4 @@ +void script_1511() { + script_1513(); + return; +} diff --git a/dumps/scripts/1512.cs2 b/dumps/scripts/1512.cs2 new file mode 100644 index 000000000..23842fd5d --- /dev/null +++ b/dumps/scripts/1512.cs2 @@ -0,0 +1,15 @@ +void script_1512(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + switch (arg1) { + case 1: + case 2: + if (script_361(globalint_1010, 3) != -1) { + return; + } + } + globalint_778 = arg1; + script_1513(); + return; +} diff --git a/dumps/scripts/1513.cs2 b/dumps/scripts/1513.cs2 new file mode 100644 index 000000000..55549a439 --- /dev/null +++ b/dumps/scripts/1513.cs2 @@ -0,0 +1,262 @@ +void script_1513() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + string svar0; + int stack_dump0; + flow_0: + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + SWITCH (globalint_778) { + case 1: + GOTO flow_4 + case 2: + GOTO flow_8 + case 3: + GOTO flow_12 + } + globalint_778 = 0; + setWidgetSprite(1044, new WidgetPointer(729,6)); + setWidgetSprite(1053, new WidgetPointer(729,7)); + setWidgetSprite(1057, new WidgetPointer(729,8)); + setWidgetSprite(1054, new WidgetPointer(729,9)); + if (IsFemale()) { + stack_dump0 = 1591; + ivar2 = 9; + ivar0 = stack_dump0; + ivar1 = 1590; + } else { + stack_dump0 = 690; + ivar2 = 2; + ivar0 = stack_dump0; + ivar1 = 689; + } + flow_3: + ivar3 = globalint_1010; + ivar4 = 3282; + ivar5 = 2347; + ivar6 = 2348; + ivar7 = 1; + ivar8 = globalint_1016; + GOTO flow_16 + flow_4: + setWidgetSprite(1052, new WidgetPointer(729,6)); + setWidgetSprite(1045, new WidgetPointer(729,7)); + setWidgetSprite(1057, new WidgetPointer(729,8)); + setWidgetSprite(1054, new WidgetPointer(729,9)); + if (IsFemale()) { + stack_dump0 = 693; + ivar2 = 10; + ivar0 = stack_dump0; + ivar1 = 1593; + } else { + stack_dump0 = 711; + ivar2 = 3; + ivar0 = stack_dump0; + ivar1 = 702; + } + ivar3 = globalint_1011; + ivar4 = 3282; + ivar5 = 2347; + ivar6 = 2348; + ivar7 = 1; + ivar8 = globalint_1016; + GOTO flow_16 + flow_8: + setWidgetSprite(1052, new WidgetPointer(729,6)); + setWidgetSprite(1053, new WidgetPointer(729,7)); + setWidgetSprite(1049, new WidgetPointer(729,8)); + setWidgetSprite(1054, new WidgetPointer(729,9)); + if (IsFemale()) { + stack_dump0 = 751; + ivar2 = 11; + ivar0 = stack_dump0; + } else { + stack_dump0 = 749; + ivar2 = 4; + ivar0 = stack_dump0; + } + ivar1 = 750; + ivar3 = globalint_1012; + GOTO flow_16 + flow_12: + setWidgetSprite(1052, new WidgetPointer(729,6)); + setWidgetSprite(1053, new WidgetPointer(729,7)); + setWidgetSprite(1057, new WidgetPointer(729,8)); + setWidgetSprite(1046, new WidgetPointer(729,9)); + if (IsFemale()) { + stack_dump0 = 1607; + ivar2 = 12; + ivar0 = stack_dump0; + ivar1 = 1606; + } else { + stack_dump0 = 1586; + ivar2 = 5; + ivar0 = stack_dump0; + ivar1 = 1585; + } + ivar3 = globalint_1013; + ivar4 = 3284; + ivar5 = 2347; + ivar6 = 2348; + ivar7 = 2; + ivar8 = globalint_1017; + flow_16: + deleteAllExtraChilds(new WidgetPointer(729,12)); + ivar9 = 0; + ivar10 = getCommonDefinitionSize(ivar0); + ivar11 = -1; + svar0 = ""; + ivar12 = 0; + ivar13 = 0; + while (ivar9 < ivar10) { + ivar11 = cs2method_3408(105, 75, ivar0, ivar9); + svar0 = cs2method_3408(105, 115, ivar1, ivar9); + createExtraChild(new WidgetPointer(729,12), 5, getExtraChildGap(new WidgetPointer(729,12))); + setWidgetSize(17, 17, 0, 0); + setWidgetPosition(0, add(ivar12, 1), 0, 0); + createExtraChild(new WidgetPointer(729,12), 4, getExtraChildGap(new WidgetPointer(729,12))); + setWidgetSize(20, 19, 1, 0); + setWidgetPosition(0, ivar12, 2, 0); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetFont(495); + setWidgetText(svar0); + if (ivar11 == ivar3) { + setWidgetSprite(699); + ivar13 = ivar12; + } else { + setWidgetSprite(697); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16750623, "Iii"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16750623, "Iii"); + setWidgetContextMenuOption(1, svar0); + setWidgetContextMenuOption(1, svar0); + setScriptCallOnClickContextMenu(1514, -2147483644, ivar11, ivar2, "iKi"); + setScriptCallOnClickContextMenu(1514, -2147483644, ivar11, ivar2, "iKi"); + } + ivar9 = add(ivar9, 1); + ivar12 = add(ivar12, 19); + } + if (ivar12 > getWidgetActualHeight(new WidgetPointer(729,12))) { + setWidgetSize(20, 4, 1, 1, new WidgetPointer(729,12)); + setWidgetScrollMax(0, ivar12, new WidgetPointer(729,12)); + if (ivar13 < cs2method2601(new WidgetPointer(729,12))) { + cs2method2100(0, subtract(ivar13, 5), new WidgetPointer(729,12)); + } else { + if (add(ivar13, 19) >= add(cs2method2601(new WidgetPointer(729,12)), getWidgetActualHeight(new WidgetPointer(729,12)))) { + cs2method2100(0, subtract(add(ivar13, 25), getWidgetActualHeight(new WidgetPointer(729,12))), new WidgetPointer(729,12)); + } + } + setWidgetIsHidden(false, new WidgetPointer(729,13)); + script_31(47775757, 47775756, 792, 789, 790, 791, 773, 788); + } else { + setWidgetSize(4, 4, 1, 1, new WidgetPointer(729,12)); + setWidgetScrollMax(0, 0, new WidgetPointer(729,12)); + cs2method2100(0, 0, new WidgetPointer(729,12)); + deleteAllExtraChilds(new WidgetPointer(729,13)); + setWidgetIsHidden(true, new WidgetPointer(729,13)); + } + deleteAllExtraChilds(new WidgetPointer(729,17)); + if (ivar5 == -1) { + setWidgetSize(4, 4, 1, 1, new WidgetPointer(729,17)); + setWidgetScrollMax(0, 0, new WidgetPointer(729,17)); + cs2method2100(0, 0, new WidgetPointer(729,17)); + deleteAllExtraChilds(new WidgetPointer(729,18)); + setWidgetIsHidden(true, new WidgetPointer(729,18)); + return; + } + ivar10 = getCommonDefinitionSize(ivar5); + ivar14 = 5; + ivar15 = 0; + if (multiply(add(divide(subtract(ivar10, 1), ivar14), 1), 21) > getWidgetActualHeight(new WidgetPointer(729,17))) { + stack_dump0 = 4; + ivar15 = 2; + ivar14 = stack_dump0; + } + ivar9 = 0; + ivar12 = 0; + ivar16 = 0; + ivar17 = -1; + ivar18 = 0; + while (ivar9 < ivar10) { + ivar18 = cs2method_3408(105, 105, ivar4, ivar9); + svar0 = cs2method_3408(105, 115, ivar6, ivar9); + createExtraChild(new WidgetPointer(729,17), 3, getExtraChildGap(new WidgetPointer(729,17))); + setWidgetSize(21, 21, 0, 0); + setWidgetFilled(1); + setWidgetPosition(add(multiply(ivar16, getWidgetActualWidth()), ivar15), ivar12, 0, 0); + setWidgetRGB(new Color(cs2method_3408(105, 105, ivar5, ivar9))); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(729,23), svar0, 0, 512, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(729,23), "I"); + createExtraChild(new WidgetPointer(729,17), 5, getExtraChildGap(new WidgetPointer(729,17))); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + if (ivar18 == ivar8) { + setWidgetSprite(1043); + ivar13 = ivar12; + } else { + ivar17 = 1041; + setWidgetSprite(ivar17); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar17, "Iid"); + ivar17 = 1042; + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar17, "Iid"); + setWidgetContextMenuOption(1, svar0); + setScriptCallOnClickContextMenu(1515, -2147483644, ivar18, ivar7, "iii"); + } + ivar9 = add(ivar9, 1); + if (ivar16 < subtract(ivar14, 1)) { + ivar16 = add(ivar16, 1); + } else { + ivar16 = 0; + ivar12 = add(ivar12, getWidgetActualHeight()); + } + } + if (ivar16 != 0) { + ivar12 = add(ivar12, 21); + } + if ((ivar12 > getWidgetActualHeight(new WidgetPointer(729,17))) || (ivar14 < 5)) { + setWidgetSize(20, 4, 1, 1, new WidgetPointer(729,17)); + setWidgetScrollMax(0, ivar12, new WidgetPointer(729,17)); + if (ivar13 < cs2method2601(new WidgetPointer(729,17))) { + cs2method2100(0, subtract(ivar13, 5), new WidgetPointer(729,17)); + } else { + if (add(ivar13, 21) >= add(cs2method2601(new WidgetPointer(729,17)), getWidgetActualHeight(new WidgetPointer(729,17)))) { + cs2method2100(0, subtract(add(ivar13, 25), getWidgetActualHeight(new WidgetPointer(729,17))), new WidgetPointer(729,17)); + } + } + setWidgetIsHidden(false, new WidgetPointer(729,18)); + script_31(47775762, 47775761, 792, 789, 790, 791, 773, 788); + } else { + setWidgetSize(4, 4, 1, 1, new WidgetPointer(729,17)); + setWidgetScrollMax(0, 0, new WidgetPointer(729,17)); + cs2method2100(0, 0, new WidgetPointer(729,17)); + deleteAllExtraChilds(new WidgetPointer(729,18)); + setWidgetIsHidden(true, new WidgetPointer(729,18)); + } + return; +} diff --git a/dumps/scripts/1514.cs2 b/dumps/scripts/1514.cs2 new file mode 100644 index 000000000..457ef9fac --- /dev/null +++ b/dumps/scripts/1514.cs2 @@ -0,0 +1,80 @@ +void script_1514(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int stack_dump0; + int stack_dump1; + if (arg0 != 1) { + return; + } + ivar3 = -1; + ivar4 = 2; + ivar5 = 3; + ivar6 = 4; + if (IsFemale()) { + stack_dump0 = 9; + stack_dump1 = 10; + ivar6 = 11; + stack_dump0 = stack_dump0; + ivar5 = stack_dump1; + ivar4 = stack_dump0; + } + ivar7 = -1; + switch (arg2) { + case 2: + case 9: + ivar3 = script_361(arg1, 3); + if (ivar3 != -1) { + globalint_1010 = getOtherCommonData(ivar3, 1182); + cs2method403(ivar4, globalint_1010); + globalint_1011 = getOtherCommonData(ivar3, 1183); + cs2method403(ivar5, globalint_1011); + globalint_1012 = getOtherCommonData(ivar3, 1184); + cs2method403(ivar6, globalint_1012); + } else { + cs2method403(arg2, arg1); + globalint_1010 = arg1; + if ((globalint_1011 == -1) || (script_361(globalint_1011, 4) != -1)) { + if (IsFemale()) { + ivar7 = 61; + } else { + ivar7 = 26; + } + cs2method403(ivar5, ivar7); + globalint_1011 = ivar7; + } + if ((globalint_1012 == -1) || (script_361(globalint_1012, 5) != -1)) { + if (IsFemale()) { + ivar7 = 68; + } else { + ivar7 = 34; + } + cs2method403(ivar6, ivar7); + globalint_1012 = ivar7; + } + } + break; + case 3: + case 10: + if (script_361(globalint_1010, 3) == -1) { + cs2method403(arg2, arg1); + globalint_1011 = arg1; + } + break; + case 4: + case 11: + if (script_361(globalint_1010, 3) == -1) { + cs2method403(arg2, arg1); + globalint_1012 = arg1; + } + break; + case 5: + case 12: + cs2method403(arg2, arg1); + globalint_1013 = arg1; + } + script_1513(); + return; +} diff --git a/dumps/scripts/1515.cs2 b/dumps/scripts/1515.cs2 new file mode 100644 index 000000000..02ff591ab --- /dev/null +++ b/dumps/scripts/1515.cs2 @@ -0,0 +1,16 @@ +void script_1515(int arg0,int arg1,int arg2) { + if (arg0 != 1) { + return; + } + if (((boolean)arg2)) { + cs2method404(1, arg1); + globalint_1016 = arg1; + } else { + if (arg2 == 2) { + cs2method404(2, arg1); + globalint_1017 = arg1; + } + } + script_1513(); + return; +} diff --git a/dumps/scripts/1516.cs2 b/dumps/scripts/1516.cs2 new file mode 100644 index 000000000..8938551cf --- /dev/null +++ b/dumps/scripts/1516.cs2 @@ -0,0 +1,15 @@ +void script_1516(int arg0,int arg1,int arg2) { + createExtraChild(new WidgetPointer(arg0), 6, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSelfFull(); + setWidget3DRotation(0, arg2, 0, 0, 0, arg1); + if (globalint_779 != -1) { + setWidgetAnimation(getRenderEmoteMaxSomethingMethod4600(globalint_779)); + } else { + setWidgetAnimation(getRenderEmoteMaxSomethingMethod4600(1426)); + } + setScriptCallOnGlobalConfigChange(1517, new WidgetPointer(-32768,3), -2147483643, 779, 1, "IiY"); + setScriptCallOnMousePressed(347, new WidgetPointer(-32768,3), -2147483643, -2147483647, "Iii"); + return; +} diff --git a/dumps/scripts/1517.cs2 b/dumps/scripts/1517.cs2 new file mode 100644 index 000000000..3f09e10cb --- /dev/null +++ b/dumps/scripts/1517.cs2 @@ -0,0 +1,10 @@ +void script_1517(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (globalint_779 != -1) { + setWidgetAnimation(getRenderEmoteMaxSomethingMethod4600(globalint_779)); + } else { + setWidgetAnimation(getRenderEmoteMaxSomethingMethod4600(1426)); + } + } + return; +} diff --git a/dumps/scripts/1518.cs2 b/dumps/scripts/1518.cs2 new file mode 100644 index 000000000..6b922c70a --- /dev/null +++ b/dumps/scripts/1518.cs2 @@ -0,0 +1,25 @@ +void script_1518(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = 0; + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (arg2 > 0) { + setWidget3DRotation(cs2method1610(), cs2method1611(), getWidgetRotateX(), script_686(subtract(getWidgetRotateY(), 10), 2048), cs2method1607(), getWidget3DDistance()); + } else if (arg2 < 0) { + setWidget3DRotation(cs2method1610(), cs2method1611(), getWidgetRotateX(), mod(add(getWidgetRotateY(), 10), 2048), cs2method1607(), getWidget3DDistance()); + } else if (ivar3 > 1024) { + ivar4 = add(ivar3, 15); + if (ivar4 >= 2048) { + ivar4 = 0; + } + setWidget3DRotation(cs2method1610(), cs2method1611(), getWidgetRotateX(), ivar4, cs2method1607(), getWidget3DDistance()); + } else if (ivar3 > 0) { + setWidget3DRotation(cs2method1610(), cs2method1611(), getWidgetRotateX(), max(subtract(ivar3, 15), 0), cs2method1607(), getWidget3DDistance()); + } else { + setScriptCallOnGameloop(-1, ""); + } + ivar3 = getWidgetRotateY(); + } + return; +} diff --git a/dumps/scripts/1519.cs2 b/dumps/scripts/1519.cs2 new file mode 100644 index 000000000..26e7ce40b --- /dev/null +++ b/dumps/scripts/1519.cs2 @@ -0,0 +1,9 @@ +int script_1519() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(bitconfig_6658, bitconfig_6659), bitconfig_6660), bitconfig_6661); + if (bitconfig_6662 == 63) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/152.cs2 b/dumps/scripts/152.cs2 new file mode 100644 index 000000000..762dc5181 --- /dev/null +++ b/dumps/scripts/152.cs2 @@ -0,0 +1,31 @@ +void script_152(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + int ivar6; + int ivar7; + int ivar8; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar6 = 0; + ivar7 = 0; + if (arg2 > 1) { + if (getWidgetScrollMaxH(new WidgetPointer(arg0)) > 0) { + ivar6 = divide(subtract(getWidgetScrollMaxH(new WidgetPointer(arg0)), multiply(36, arg2)), subtract(arg2, 1)); + } else { + ivar6 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(36, arg2)), subtract(arg2, 1)); + } + } + if (arg3 > 1) { + if (getWidgetScrollMaxV(new WidgetPointer(arg0)) > 0) { + ivar7 = divide(subtract(getWidgetScrollMaxV(new WidgetPointer(arg0)), multiply(32, arg3)), subtract(arg3, 1)); + } else { + ivar7 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(32, arg3)), subtract(arg3, 1)); + } + } + ivar8 = 0; + while (ivar8 <= multiply(arg2, arg3)) { + createExtraChild(new WidgetPointer(arg0), 5, ivar8); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar6), mod(ivar8, arg2)), multiply(divide(ivar8, arg2), add(32, ivar7)), 0, 0); + script_154(arg1, ivar8, arg0, ivar8, arg4, arg5, arg6, arg7, arg8, arg9, arg10, "null", "null", "null", "null"); + ivar8 = add(ivar8, 1); + } + return; +} diff --git a/dumps/scripts/1520.cs2 b/dumps/scripts/1520.cs2 new file mode 100644 index 000000000..39e22fe93 --- /dev/null +++ b/dumps/scripts/1520.cs2 @@ -0,0 +1,12 @@ +void script_1520() { + script_1522(49872906); + script_1522(49872907); + script_1522(49872908); + script_1522(49872909); + script_1522(49872910); + script_1522(49872911); + script_1522(49872915); + script_1522(49872916); + script_1522(49872917); + return; +} diff --git a/dumps/scripts/1521.cs2 b/dumps/scripts/1521.cs2 new file mode 100644 index 000000000..c975e790e --- /dev/null +++ b/dumps/scripts/1521.cs2 @@ -0,0 +1,4 @@ +void script_1521(int arg0) { + script_1522(arg0); + return; +} diff --git a/dumps/scripts/1522.cs2 b/dumps/scripts/1522.cs2 new file mode 100644 index 000000000..9ba2ca72b --- /dev/null +++ b/dumps/scripts/1522.cs2 @@ -0,0 +1,96 @@ +void script_1522(int arg0) { + if (bitconfig_4895 != 2) { + return; + } + if (standart_config_281 == 1000) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + return; + } + if (((boolean)standart_config_281)) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + return; + } + switch (arg0) { + case 49872906: + if (standart_config_281 >= 90) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + } else if (((boolean)standart_config_281)) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 102), new WidgetPointer(arg0)); + } + break; + case 49872907: + if (standart_config_281 >= 180) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + } else if (standart_config_281 < 100) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 102), new WidgetPointer(arg0)); + } + break; + case 49872908: + if (bitconfig_4926 >= 50) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_4926)) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 102), new WidgetPointer(arg0)); + } + break; + case 49872909: + if (bitconfig_4927 >= 20) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_4927)) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 102), new WidgetPointer(arg0)); + } + break; + case 49872910: + if (bitconfig_4928 >= 25) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_4928)) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 102), new WidgetPointer(arg0)); + } + break; + case 49872911: + if (bitconfig_4929 >= 25) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_4929)) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 102), new WidgetPointer(arg0)); + } + break; + case 49872915: + if (bitconfig_4935 >= 15) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_4935)) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 102), new WidgetPointer(arg0)); + } + break; + case 49872916: + if (bitconfig_4936 >= 20) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_4936)) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 102), new WidgetPointer(arg0)); + } + break; + case 49872917: + if (standart_config_281 == 1000) { + setWidgetRGB(new Color(153, 255, 0), new WidgetPointer(arg0)); + } else if (standart_config_281 < 190) { + setWidgetRGB(new Color(255, 30, 30), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 102), new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/1523.cs2 b/dumps/scripts/1523.cs2 new file mode 100644 index 000000000..783175dee --- /dev/null +++ b/dumps/scripts/1523.cs2 @@ -0,0 +1,16 @@ +void script_1523() { + if (bitconfig_4895 == 2) { + createExtraChild(new WidgetPointer(275,9), 4, 0); + setWidgetPosition(0, -2, 0, 0); + setWidgetSize(102, 23, 0, 0); + setWidgetFont(645); + setWidgetTextAlignment(0, 1, 0); + setWidgetText("Back"); + setWidgetRGB(new Color(70, 50, 10)); + setWidgetUnknownBoolean(false); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 4600330, "Iii"); + setWidgetContextMenuOption(1, new WidgetPointer(275,9), "Back to Index"); + } + return; +} diff --git a/dumps/scripts/1524.cs2 b/dumps/scripts/1524.cs2 new file mode 100644 index 000000000..8750ff729 --- /dev/null +++ b/dumps/scripts/1524.cs2 @@ -0,0 +1,7 @@ +void script_1524() { + if (setWidgetRegister(new WidgetPointer(275,9), 0)) { + deleteAllExtraChilds(new WidgetPointer(275,9)); + setWidgetContextMenuOption(1, new WidgetPointer(275,9), "null"); + } + return; +} diff --git a/dumps/scripts/1525.cs2 b/dumps/scripts/1525.cs2 new file mode 100644 index 000000000..e2985dca7 --- /dev/null +++ b/dumps/scripts/1525.cs2 @@ -0,0 +1,9 @@ +int script_1525() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(add(add(add(add(add(add(add(add(add(add(bitconfig_5691, bitconfig_5692), bitconfig_5693), bitconfig_5694), bitconfig_5695), bitconfig_5696), bitconfig_5697), bitconfig_5698), bitconfig_5699), bitconfig_5700), bitconfig_5701), bitconfig_5702), bitconfig_5703), bitconfig_5704); + if (bitconfig_5705 == 3) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/1526.cs2 b/dumps/scripts/1526.cs2 new file mode 100644 index 000000000..2220c043f --- /dev/null +++ b/dumps/scripts/1526.cs2 @@ -0,0 +1,9 @@ +int script_1526() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(add(add(add(add(add(add(add(bitconfig_5706, bitconfig_5707), bitconfig_5723), bitconfig_5710), bitconfig_5711), bitconfig_5712), bitconfig_5713), bitconfig_5714), bitconfig_5715), bitconfig_5716), bitconfig_5717); + if (bitconfig_5709 == 3) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/1527.cs2 b/dumps/scripts/1527.cs2 new file mode 100644 index 000000000..e1c3c6d89 --- /dev/null +++ b/dumps/scripts/1527.cs2 @@ -0,0 +1,3 @@ +int script_1527() { + return add(add(add(add(add(add(bitconfig_8114, bitconfig_8115), bitconfig_8116), bitconfig_8117), bitconfig_8118), bitconfig_8119), bitconfig_8120); +} diff --git a/dumps/scripts/1528.cs2 b/dumps/scripts/1528.cs2 new file mode 100644 index 000000000..57c648b18 --- /dev/null +++ b/dumps/scripts/1528.cs2 @@ -0,0 +1,12 @@ +int script_1528() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1529.cs2 b/dumps/scripts/1529.cs2 new file mode 100644 index 000000000..e5d8c1b3e --- /dev/null +++ b/dumps/scripts/1529.cs2 @@ -0,0 +1,12 @@ +int script_1529() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(add(add(add(add(bitconfig_3567, bitconfig_3568), bitconfig_3569), bitconfig_3570), bitconfig_3571), bitconfig_3572), bitconfig_3574), bitconfig_3575); + if (bitconfig_3566 == 5) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_3573 == 5) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/153.cs2 b/dumps/scripts/153.cs2 new file mode 100644 index 000000000..1763fdd74 --- /dev/null +++ b/dumps/scripts/153.cs2 @@ -0,0 +1,31 @@ +void script_153(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + int ivar6; + int ivar7; + int ivar8; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar6 = 0; + ivar7 = 0; + if (arg2 > 1) { + if (getWidgetScrollMaxH(new WidgetPointer(arg0)) > 0) { + ivar6 = divide(subtract(getWidgetScrollMaxH(new WidgetPointer(arg0)), multiply(36, arg2)), subtract(arg2, 1)); + } else { + ivar6 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(36, arg2)), subtract(arg2, 1)); + } + } + if (arg3 > 1) { + if (getWidgetScrollMaxV(new WidgetPointer(arg0)) > 0) { + ivar7 = divide(subtract(getWidgetScrollMaxV(new WidgetPointer(arg0)), multiply(32, arg3)), subtract(arg3, 1)); + } else { + ivar7 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(32, arg3)), subtract(arg3, 1)); + } + } + ivar8 = 0; + while (ivar8 <= multiply(arg2, arg3)) { + createExtraChild(new WidgetPointer(arg0), 5, ivar8); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar6), mod(ivar8, arg2)), multiply(divide(ivar8, arg2), add(32, ivar7)), 0, 0); + script_154(arg1, ivar8, arg0, ivar8, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + ivar8 = add(ivar8, 1); + } + return; +} diff --git a/dumps/scripts/1530.cs2 b/dumps/scripts/1530.cs2 new file mode 100644 index 000000000..c2b2fa09f --- /dev/null +++ b/dumps/scripts/1530.cs2 @@ -0,0 +1,9 @@ +int script_1530() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(add(add(add(add(add(bitconfig_3600, bitconfig_3601), bitconfig_3602), bitconfig_3603), bitconfig_3604), bitconfig_3605), bitconfig_3606), bitconfig_3608), bitconfig_3609); + if (bitconfig_3607 == 5) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/1531.cs2 b/dumps/scripts/1531.cs2 new file mode 100644 index 000000000..d128023e0 --- /dev/null +++ b/dumps/scripts/1531.cs2 @@ -0,0 +1,13 @@ +int script_1531() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_8121); + ivar0 = add(ivar0, bitconfig_8122); + ivar0 = add(ivar0, bitconfig_8123); + ivar0 = add(ivar0, bitconfig_8124); + ivar0 = add(ivar0, bitconfig_8125); + ivar0 = add(ivar0, bitconfig_8126); + ivar0 = add(ivar0, bitconfig_8127); + ivar0 = add(ivar0, bitconfig_8128); + return ivar0; +} diff --git a/dumps/scripts/1532.cs2 b/dumps/scripts/1532.cs2 new file mode 100644 index 000000000..838b3463e --- /dev/null +++ b/dumps/scripts/1532.cs2 @@ -0,0 +1,13 @@ +int script_1532() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1533.cs2 b/dumps/scripts/1533.cs2 new file mode 100644 index 000000000..5300c0e1b --- /dev/null +++ b/dumps/scripts/1533.cs2 @@ -0,0 +1,4 @@ +void script_1533(int arg0) { + script_2308(arg0, globalint_119); + return; +} diff --git a/dumps/scripts/1534.cs2 b/dumps/scripts/1534.cs2 new file mode 100644 index 000000000..c9e935af8 --- /dev/null +++ b/dumps/scripts/1534.cs2 @@ -0,0 +1,15 @@ +void script_1534(int arg0,int arg1) { + if (arg1 != 1) { + return; + } + if (((boolean)globalint_1413)) { + return; + } + if (((boolean)globalint_119)) { + globalint_119 = 0; + } else { + globalint_119 = 1; + } + script_1741(arg0); + return; +} diff --git a/dumps/scripts/1535.cs2 b/dumps/scripts/1535.cs2 new file mode 100644 index 000000000..ede060f58 --- /dev/null +++ b/dumps/scripts/1535.cs2 @@ -0,0 +1,16 @@ +void script_1535(int arg0,int arg1) { + switch (arg0) { + case 0: + bitconfig_9222 = arg1; + break; + case 1: + bitconfig_9223 = arg1; + break; + case 2: + bitconfig_9224 = arg1; + break; + case 3: + bitconfig_9225 = arg1; + } + return; +} diff --git a/dumps/scripts/1536.cs2 b/dumps/scripts/1536.cs2 new file mode 100644 index 000000000..5cf32112d --- /dev/null +++ b/dumps/scripts/1536.cs2 @@ -0,0 +1,8 @@ +void script_1536(int arg0) { + setScriptCallOnConfigChange(1537, 1747, 1, "Y", new WidgetPointer(arg0)); + setScriptCallOnItemContainerUpdate(1538, 93, 94, 530, 3, "Y", new WidgetPointer(arg0)); + setScriptCallOnGlobalStringChange(1539, 352, 1, "Y", new WidgetPointer(arg0)); + script_4592(); + script_4597(); + return; +} diff --git a/dumps/scripts/1537.cs2 b/dumps/scripts/1537.cs2 new file mode 100644 index 000000000..9c5668347 --- /dev/null +++ b/dumps/scripts/1537.cs2 @@ -0,0 +1,5 @@ +void script_1537() { + script_4592(); + script_4597(); + return; +} diff --git a/dumps/scripts/1538.cs2 b/dumps/scripts/1538.cs2 new file mode 100644 index 000000000..6d0ee9d5b --- /dev/null +++ b/dumps/scripts/1538.cs2 @@ -0,0 +1,4 @@ +void script_1538() { + script_4592(); + return; +} diff --git a/dumps/scripts/1539.cs2 b/dumps/scripts/1539.cs2 new file mode 100644 index 000000000..2d626d53f --- /dev/null +++ b/dumps/scripts/1539.cs2 @@ -0,0 +1,4 @@ +void script_1539() { + script_4597(); + return; +} diff --git a/dumps/scripts/154.cs2 b/dumps/scripts/154.cs2 new file mode 100644 index 000000000..bc2907b84 --- /dev/null +++ b/dumps/scripts/154.cs2 @@ -0,0 +1,46 @@ +void script_154(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + string svar9; + svar9 = ""; + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + if (getItemIdInSlot(arg0, arg1) != -1) { + svar9 = "" + getItemName(getItemIdInSlot(arg0, arg1)); + setItemOnWidgetMethod1200(getItemIdInSlot(arg0, arg1), getItemAmtInSlot(arg0, arg1)); + cs2method1305(svar9); + setWidgetContextMenuOption(1, arg6); + setWidgetContextMenuOption(2, arg7); + setWidgetContextMenuOption(3, arg8); + setWidgetContextMenuOption(4, arg9); + setWidgetContextMenuOption(5, arg10); + setWidgetContextMenuOption(6, arg11); + setWidgetContextMenuOption(7, arg12); + setWidgetContextMenuOption(8, arg13); + setWidgetContextMenuOption(9, arg14); + setWidgetContextMenuOption(10, "Examine" + ""); + if (arg4 > 0) { + cs2method1303(5); + cs2method1304(10); + } + if (((boolean)arg4)) { + setScriptCallOnMouseDragReleased(155, arg0, -2147483643, -2147483641, new WidgetPointer(-32768,3), arg4, new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, "viiIiIsssssssss"); + } else { + if (arg4 == 2) { + setScriptCallOnMouseDragReleased(156, arg0, -2147483643, -2147483641, new WidgetPointer(-32768,3), arg4, new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, "viiIiIsssssssss"); + } + } + if ((arg4 != 0) && (arg5 != -1)) { + setScriptCallOnMouseDragged(162, arg1, new WidgetPointer(arg2), new WidgetPointer(arg5), -2147483646, "iIIi"); + } + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + } else { + setItemOnWidgetMethod1205(-1, 0); + setWidgetNoOptions(); + if (arg4 > 0) { + cs2method1303(0); + cs2method1304(0); + } + setScriptCallOnMouseDragReleased(-1, ""); + } + } + return; +} diff --git a/dumps/scripts/1540.cs2 b/dumps/scripts/1540.cs2 new file mode 100644 index 000000000..1e7098cb0 --- /dev/null +++ b/dumps/scripts/1540.cs2 @@ -0,0 +1,60 @@ +void script_1540(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar0; + string svar1; + string stack_dump0; + int stack_dump1; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = 0; + ivar2 = 0; + ivar1 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(36, 4)), 3); + ivar2 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(32, 7)), 6); + ivar3 = 0; + ivar4 = getItemContainerLength(93); + ivar5 = -1; + ivar6 = 0; + svar0 = ""; + svar1 = ""; + while (ivar3 < ivar4) { + createExtraChild(new WidgetPointer(arg0), 5, ivar3); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar1), mod(ivar3, 4)), multiply(divide(ivar3, 4), add(32, ivar2)), 0, 0); + ivar5 = getItemIdInSlot(93, ivar3); + if (ivar5 != -1) { + ivar6 = getItemAmtInContainer(93, ivar5); + stack_dump0 = getItemHashmapData(ivar5, 1264); + svar1 = getItemHashmapData(ivar5, 1265); + svar0 = stack_dump0; + if (strLength(svar0) <= 0) { + if (isBitFlagged(globalint_96, ivar3)) { + svar0 = getItemOption(ivar5, 2); + } else { + if (isBitFlagged(globalint_95, ivar3)) { + svar0 = "Eat"; + } + } + } + } else { + stack_dump1 = 0; + stack_dump0 = ""; + svar1 = ""; + stack_dump1 = stack_dump1; + svar0 = stack_dump0; + ivar6 = stack_dump1; + } + if (ivar6 > 5) { + script_154(93, ivar3, arg0, ivar3, 1, -1, "Deposit-1", "Deposit-5", "Deposit-10", "Deposit-" + intToStr(standart_config_1249), "Deposit-X", "Deposit-All", "", svar0, svar1); + } else if (ivar6 > 1) { + script_154(93, ivar3, arg0, ivar3, 1, -1, "Deposit-1", "Deposit-5", "", "Deposit-" + intToStr(standart_config_1249), "Deposit-X", "Deposit-All", "", svar0, svar1); + } else { + script_154(93, ivar3, arg0, ivar3, 1, -1, "Deposit", "", "", "", "", "", "", svar0, svar1); + } + ivar3 = add(ivar3, 1); + } + return; +} diff --git a/dumps/scripts/1541.cs2 b/dumps/scripts/1541.cs2 new file mode 100644 index 000000000..c6ba593b9 --- /dev/null +++ b/dumps/scripts/1541.cs2 @@ -0,0 +1,28 @@ +int script_1541() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_4949); + ivar0 = add(ivar0, bitconfig_4950); + ivar0 = add(ivar0, bitconfig_4951); + ivar0 = add(ivar0, bitconfig_4952); + ivar0 = add(ivar0, bitconfig_4953); + ivar0 = add(ivar0, bitconfig_4954); + ivar0 = add(ivar0, bitconfig_4955); + ivar0 = add(ivar0, bitconfig_4956); + ivar0 = add(ivar0, bitconfig_4957); + ivar0 = add(ivar0, bitconfig_4958); + ivar0 = add(ivar0, bitconfig_4959); + ivar0 = add(ivar0, bitconfig_4960); + ivar0 = add(ivar0, bitconfig_4961); + ivar0 = add(ivar0, bitconfig_4962); + ivar0 = add(ivar0, bitconfig_4963); + ivar0 = add(ivar0, bitconfig_4964); + ivar0 = add(ivar0, bitconfig_4965); + ivar0 = add(ivar0, bitconfig_4966); + ivar0 = add(ivar0, bitconfig_4967); + ivar0 = add(ivar0, bitconfig_4968); + ivar0 = add(ivar0, bitconfig_4969); + ivar0 = add(ivar0, bitconfig_4970); + ivar0 = add(ivar0, bitconfig_4971); + return ivar0; +} diff --git a/dumps/scripts/1542.cs2 b/dumps/scripts/1542.cs2 new file mode 100644 index 000000000..7e51c37d6 --- /dev/null +++ b/dumps/scripts/1542.cs2 @@ -0,0 +1,28 @@ +int script_1542() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1543.cs2 b/dumps/scripts/1543.cs2 new file mode 100644 index 000000000..bbcd09e97 --- /dev/null +++ b/dumps/scripts/1543.cs2 @@ -0,0 +1,24 @@ +int script_1543() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_4972); + ivar0 = add(ivar0, bitconfig_4973); + ivar0 = add(ivar0, bitconfig_4974); + ivar0 = add(ivar0, bitconfig_4975); + ivar0 = add(ivar0, bitconfig_4976); + ivar0 = add(ivar0, bitconfig_4977); + ivar0 = add(ivar0, bitconfig_4978); + ivar0 = add(ivar0, bitconfig_4979); + ivar0 = add(ivar0, bitconfig_4980); + ivar0 = add(ivar0, bitconfig_4981); + ivar0 = add(ivar0, bitconfig_4982); + ivar0 = add(ivar0, bitconfig_4983); + ivar0 = add(ivar0, bitconfig_4984); + ivar0 = add(ivar0, bitconfig_4985); + ivar0 = add(ivar0, bitconfig_4986); + ivar0 = add(ivar0, bitconfig_4987); + ivar0 = add(ivar0, bitconfig_4988); + ivar0 = add(ivar0, bitconfig_4989); + ivar0 = add(ivar0, bitconfig_4991); + return ivar0; +} diff --git a/dumps/scripts/1544.cs2 b/dumps/scripts/1544.cs2 new file mode 100644 index 000000000..d3bdf1531 --- /dev/null +++ b/dumps/scripts/1544.cs2 @@ -0,0 +1,24 @@ +int script_1544() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1545.cs2 b/dumps/scripts/1545.cs2 new file mode 100644 index 000000000..ac85130c5 --- /dev/null +++ b/dumps/scripts/1545.cs2 @@ -0,0 +1,17 @@ +int script_1545() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_4992); + ivar0 = add(ivar0, bitconfig_4993); + ivar0 = add(ivar0, bitconfig_4994); + ivar0 = add(ivar0, bitconfig_4995); + ivar0 = add(ivar0, bitconfig_4996); + ivar0 = add(ivar0, bitconfig_4997); + ivar0 = add(ivar0, bitconfig_4998); + ivar0 = add(ivar0, bitconfig_4999); + ivar0 = add(ivar0, bitconfig_5998); + ivar0 = add(ivar0, bitconfig_5001); + ivar0 = add(ivar0, bitconfig_5002); + ivar0 = add(ivar0, bitconfig_5003); + return ivar0; +} diff --git a/dumps/scripts/1546.cs2 b/dumps/scripts/1546.cs2 new file mode 100644 index 000000000..24a0319ef --- /dev/null +++ b/dumps/scripts/1546.cs2 @@ -0,0 +1,17 @@ +int script_1546() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1547.cs2 b/dumps/scripts/1547.cs2 new file mode 100644 index 000000000..e31bb22e0 --- /dev/null +++ b/dumps/scripts/1547.cs2 @@ -0,0 +1,6 @@ +void script_1547() { + if (((boolean)globalint_5)) { + script_1548(0); + } + return; +} diff --git a/dumps/scripts/1548.cs2 b/dumps/scripts/1548.cs2 new file mode 100644 index 000000000..0c1484135 --- /dev/null +++ b/dumps/scripts/1548.cs2 @@ -0,0 +1,13 @@ +void script_1548(int arg0) { + if (((boolean)arg0) || (arg0 == globalint_5)) { + setWidgetIsHidden(true, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(false, new WidgetPointer(752,8)); + script_2026(); + globalint_5 = 0; + } + if (getDisplayMode() >= 2) { + script_1364(); + } + return; +} diff --git a/dumps/scripts/1549.cs2 b/dumps/scripts/1549.cs2 new file mode 100644 index 000000000..34ead919e --- /dev/null +++ b/dumps/scripts/1549.cs2 @@ -0,0 +1,19 @@ +void script_1549() { + if (((boolean)globalint_11)) { + script_675(); + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter the name of the item you wish to search for:"); + globalint_5 = 11; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/155.cs2 b/dumps/scripts/155.cs2 new file mode 100644 index 000000000..9834ab48b --- /dev/null +++ b/dumps/scripts/155.cs2 @@ -0,0 +1,9 @@ +void script_155(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + if (arg2 == -1) { + script_154(arg0, arg1, arg3, arg1, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + return; + } + script_154(arg0, arg1, arg3, arg2, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + script_154(arg0, arg2, arg3, arg1, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + return; +} diff --git a/dumps/scripts/1550.cs2 b/dumps/scripts/1550.cs2 new file mode 100644 index 000000000..66d12c157 --- /dev/null +++ b/dumps/scripts/1550.cs2 @@ -0,0 +1,11 @@ +void script_1550(int arg0) { + if (getWidgetActualX(new WidgetPointer(arg0)) < subtract(getWidgetActualWidth(new WidgetPointer(306,1)), 1)) { + if (getWidgetActualX(new WidgetPointer(arg0)) == add(140, getWidgetActualWidth(new WidgetPointer(arg0)))) { + setScriptCallOnGameloop(2321, new WidgetPointer(306,8), "I", new WidgetPointer(306,21)); + } + setWidgetPosition(add(1, getWidgetActualX(new WidgetPointer(arg0))), getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } else { + script_2056(); + } + return; +} diff --git a/dumps/scripts/1551.cs2 b/dumps/scripts/1551.cs2 new file mode 100644 index 000000000..48526224f --- /dev/null +++ b/dumps/scripts/1551.cs2 @@ -0,0 +1,8 @@ +int script_1551(int arg0,int arg1,int arg2,string arg3) { + arg3 = script_1602(arg3); + arg0 = min(strLength(arg3), arg0); + if (arg0 <= 0) { + return arg2; + } + return add(getTextWidth(arg1, substr(0, arg0, arg3)), arg2); +} diff --git a/dumps/scripts/1552.cs2 b/dumps/scripts/1552.cs2 new file mode 100644 index 000000000..bacc66d68 --- /dev/null +++ b/dumps/scripts/1552.cs2 @@ -0,0 +1,10 @@ +int script_1552(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg2), arg3) || ((arg3 == -1) && setWidgetRegister(new WidgetPointer(arg2)))) { + ivar4 = add(getWidgetActualX(), divide(getWidgetActualWidth(), 2)); + } else { + return 0; + } + return script_1551(arg0, arg1, subtract(ivar4, divide(getTextWidth(arg1, script_1602(arg4)), 2)), arg4); +} diff --git a/dumps/scripts/1553.cs2 b/dumps/scripts/1553.cs2 new file mode 100644 index 000000000..e9faa27ed --- /dev/null +++ b/dumps/scripts/1553.cs2 @@ -0,0 +1,46 @@ +int script_1553(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + switch (arg0) { + case 96: + return max(subtract(arg1, 1), 0); + case 97: + return min(add(arg1, 1), strLength(arg2)); + case 98: + ivar2 = subtract(arg1, 1); + if ((arg1 > 0) && (strIndexof(ivar2, arg2, " ") == ivar2)) { + return ivar2; + } + ivar2 = -1; + ivar3 = -1; + while (ivar4 != 1) { + ivar2 = strIndexof(add(ivar2, 1), arg2, " "); + if ((ivar2 == -1) || (ivar2 >= subtract(arg1, 1))) { + ivar4 = 1; + } else { + ivar3 = ivar2; + } + } + return min(add(ivar3, 1), strLength(arg2)); + case 99: + if (strIndexof(arg1, arg2, " ") == arg1) { + return min(add(arg1, 1), strLength(arg2)); + } + ivar2 = strLength(arg2); + if (arg1 < ivar2) { + ivar3 = strIndexof(add(arg1, 1), arg2, " "); + if (ivar3 != -1) { + return ivar3; + } + return ivar2; + } + break; + case 102: + return 0; + } + return strLength(arg2); +} diff --git a/dumps/scripts/1554.cs2 b/dumps/scripts/1554.cs2 new file mode 100644 index 000000000..68c2678a1 --- /dev/null +++ b/dumps/scripts/1554.cs2 @@ -0,0 +1,5 @@ +void script_1554(int arg0,int arg1) { + globalint_1028 = script_1401(arg0, 495, arg1, globalstring_1); + script_1555(arg1); + return; +} diff --git a/dumps/scripts/1555.cs2 b/dumps/scripts/1555.cs2 new file mode 100644 index 000000000..08a618cf6 --- /dev/null +++ b/dumps/scripts/1555.cs2 @@ -0,0 +1,32 @@ +void script_1555(int arg0) { + int ivar1; + int ivar2; + int ivar3; + string svar0; + setWidgetPosition(script_1551(globalint_1028, 495, arg0, globalstring_1), getWidgetActualY(new WidgetPointer(137,57)), 0, 0, new WidgetPointer(137,57)); + ivar1 = getWidgetActualWidth(new WidgetPointer(137,55)); + ivar2 = strLength(globalstring_1); + svar0 = ""; + if (globalint_1028 > 0) { + svar0 = substr(0, min(globalint_1028, ivar2), globalstring_1); + } + ivar3 = subtract(getTextWidth(495, svar0), ivar1); + setWidgetPosition(0, 0, 0, 2, new WidgetPointer(137,56)); + setWidgetSize(max(getTextWidth(495, getWidgetText(new WidgetPointer(137,56))), ivar1), getWidgetActualHeight(new WidgetPointer(137,56)), 0, 0, new WidgetPointer(137,56)); + if (ivar3 > 0) { + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(137,56)), ivar3), 0, 0, 2, new WidgetPointer(137,56)); + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(137,57)), ivar3), 0, 0, 1, new WidgetPointer(137,57)); + } + if (strLength(globalstring_1) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(137,57)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(137,56)); + } else { + if (hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(137,57)); + } else { + setWidgetIsHidden(true, new WidgetPointer(137,57)); + } + setScriptCallOnGameloop(1400, getClientCycle(), new WidgetPointer(137,57), "iI", new WidgetPointer(137,56)); + } + return; +} diff --git a/dumps/scripts/1556.cs2 b/dumps/scripts/1556.cs2 new file mode 100644 index 000000000..d672646ad --- /dev/null +++ b/dumps/scripts/1556.cs2 @@ -0,0 +1,5 @@ +void script_1556(int arg0,int arg1,int arg2) { + globalint_1029 = script_1504(arg0, 496, arg1, arg2, globalstring_22); + script_1557(); + return; +} diff --git a/dumps/scripts/1557.cs2 b/dumps/scripts/1557.cs2 new file mode 100644 index 000000000..3f5b17981 --- /dev/null +++ b/dumps/scripts/1557.cs2 @@ -0,0 +1,10 @@ +void script_1557() { + setWidgetPosition(script_1552(globalint_1029, 496, 49283077, -1, globalstring_22), getWidgetActualY(new WidgetPointer(752,6)), 0, 0, new WidgetPointer(752,6)); + if (hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(752,6)); + } else { + setWidgetIsHidden(true, new WidgetPointer(752,6)); + } + setScriptCallOnGameloop(1400, getClientCycle(), new WidgetPointer(752,6), "iI", new WidgetPointer(752,5)); + return; +} diff --git a/dumps/scripts/1558.cs2 b/dumps/scripts/1558.cs2 new file mode 100644 index 000000000..4417ebee0 --- /dev/null +++ b/dumps/scripts/1558.cs2 @@ -0,0 +1,68 @@ +void script_1558(int arg0) { + if (((boolean)script_2709()) && (standart_config_281 == 1000)) { + setWidgetText(new WidgetPointer(137,56), ""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(137,56)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(true, new WidgetPointer(137,57)); + setWidgetPosition(0, 72, 0, 0, new WidgetPointer(137,58)); + setWidgetSize(488, 72, 0, 1, new WidgetPointer(137,58)); + setWidgetPosition(0, 72, 2, 0, new WidgetPointer(137,59)); + setWidgetSize(16, 72, 0, 1, new WidgetPointer(137,59)); + setWidgetIsHidden(true, new WidgetPointer(137,51)); + setWidgetIsHidden(true, new WidgetPointer(137,52)); + setWidgetIsHidden(true, new WidgetPointer(137,53)); + setWidgetIsHidden(true, new WidgetPointer(137,56)); + setWidgetIsHidden(false, new WidgetPointer(137,60)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(137,57)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(137,58)); + setWidgetSize(488, 18, 0, 1, new WidgetPointer(137,58)); + setWidgetPosition(0, 0, 2, 0, new WidgetPointer(137,59)); + setWidgetSize(16, 18, 0, 1, new WidgetPointer(137,59)); + setWidgetIsHidden(false, new WidgetPointer(137,51)); + setWidgetIsHidden(false, new WidgetPointer(137,52)); + setWidgetIsHidden(false, new WidgetPointer(137,53)); + setWidgetIsHidden(false, new WidgetPointer(137,56)); + setWidgetIsHidden(true, new WidgetPointer(137,60)); + if (((boolean)arg0) && (cs2method6900() || isMuteRelatedMethod3329())) { + setWidgetText(new WidgetPointer(137,56), "Left-click here to enter Public Quick Chat or right-click for Friends Channel Quick Chat."); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(137,54)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(137,54)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(137,56)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(true, new WidgetPointer(137,57)); + return; + } + if (((boolean)globalint_1650)) { + setWidgetText(new WidgetPointer(137,54), "To " + globalstring_23 + ":"); + } else if (globalint_1651 == 2) { + setWidgetText(new WidgetPointer(137,54), "Clan Chat" + "" + ":"); + } else if (globalint_1651 == 3) { + setWidgetText(new WidgetPointer(137,54), "Guest Clan Chat" + "" + ":"); + } else if (((boolean)globalint_1651)) { + setWidgetText(new WidgetPointer(137,54), "Friends Chat" + "" + ":"); + } else { + setWidgetText(new WidgetPointer(137,54), cs2method5015() + "" + ":"); + } + if (getDisplayMode() >= 2) { + setWidgetRGB(new Color(127, 169, 255), new WidgetPointer(137,56)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(137,54)); + } else { + setWidgetRGB(new Color(0, 0, 255), new WidgetPointer(137,56)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(137,54)); + } + setWidgetText(new WidgetPointer(137,56), replaceLtGt(globalstring_1)); + setWidgetSize(getTextWidth(495, getWidgetText(new WidgetPointer(137,54))), getWidgetActualHeight(new WidgetPointer(137,54)), 0, 0, new WidgetPointer(137,54)); + setWidgetPosition(add(add(getWidgetActualX(new WidgetPointer(137,54)), getWidgetActualWidth(new WidgetPointer(137,54))), 2), 0, 0, 2, new WidgetPointer(137,55)); + setWidgetSize(subtract(subtract(getWidgetActualWidth(new WidgetPointer(137,50)), getWidgetActualX(new WidgetPointer(137,55))), 5), getWidgetActualHeight(new WidgetPointer(137,55)), 0, 0, new WidgetPointer(137,55)); + setScriptCallOnMousePressed(1554, -2147483647, 0, "ii", new WidgetPointer(137,56)); + globalint_1028 = max(min(globalint_1028, strLength(replaceLtGt(globalstring_1))), 0); + script_1555(0); + if (strLength(cs2method5015()) > 0) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(137,58)); + } else { + setScriptCallOnGameloop(4308, arg0, "1", new WidgetPointer(137,58)); + } + return; +} diff --git a/dumps/scripts/1559.cs2 b/dumps/scripts/1559.cs2 new file mode 100644 index 000000000..511821f1f --- /dev/null +++ b/dumps/scripts/1559.cs2 @@ -0,0 +1,8 @@ +void script_1559(int arg0) { + if (cs2method5428(49283081, -1)) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(752,9)); + script_1560(arg0); + return; +} diff --git a/dumps/scripts/156.cs2 b/dumps/scripts/156.cs2 new file mode 100644 index 000000000..63011eb91 --- /dev/null +++ b/dumps/scripts/156.cs2 @@ -0,0 +1,21 @@ +void script_156(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + int ivar6; + if (arg2 == -1) { + script_154(arg0, arg1, arg3, arg1, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + return; + } + ivar6 = arg1; + while (ivar6 != arg2) { + if (ivar6 > arg2) { + script_154(arg0, subtract(ivar6, 1), arg3, ivar6, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + ivar6 = subtract(ivar6, 1); + } else { + if (ivar6 < arg2) { + script_154(arg0, add(ivar6, 1), arg3, ivar6, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + ivar6 = add(ivar6, 1); + } + } + } + script_154(arg0, arg1, arg3, arg2, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + return; +} diff --git a/dumps/scripts/1560.cs2 b/dumps/scripts/1560.cs2 new file mode 100644 index 000000000..6d7ef8736 --- /dev/null +++ b/dumps/scripts/1560.cs2 @@ -0,0 +1,10 @@ +void script_1560(int arg0) { + if ((((boolean)arg0) && (isWidgetOpen(new WidgetPointer(752,10)) || isWidgetOpen(new WidgetPointer(752,11)))) && (((((((((boolean)cs2method5004(0)) || (cs2method5004(0) == 4)) || (cs2method5004(0) == 27)) || (cs2method5004(0) == 28)) || (cs2method5004(0) == 29)) || (cs2method5004(0) == 26)) || (cs2method5004(0) == 30)) || (cs2method5004(0) == 31))) { + script_1561(); + } + script_84(); + script_89(); + script_192(); + script_178(); + return; +} diff --git a/dumps/scripts/1561.cs2 b/dumps/scripts/1561.cs2 new file mode 100644 index 000000000..69ea7162c --- /dev/null +++ b/dumps/scripts/1561.cs2 @@ -0,0 +1,25 @@ +void script_1561() { + int ivar0; + int ivar1; + string svar0; + string svar1; + svar0 = cs2method5003(0); + ivar0 = 1; + ivar1 = 0; + svar1 = ""; + while (((boolean)ivar1) && (ivar0 < cs2method5017())) { + svar1 = cs2method5003(ivar0); + if ((((cs2method5004(ivar0) != 0) && (cs2method5004(ivar0) != 4)) && ((cs2method5004(ivar0) != 27) && (cs2method5004(ivar0) != 28))) && (((cs2method5004(ivar0) != 29) && (cs2method5004(ivar0) != 26)) && ((cs2method5004(ivar0) != 30) && (cs2method5004(ivar0) != 31)))) { + ivar1 = 1; + } else if (cs2method5024(ivar0) <= globalint_1269) { + ivar1 = 1; + } else if (strLength(strRemoveEntities(svar1)) > 0) { + svar0 = concat(concat(svar1, "
"), svar0); + } else { + svar0 = concat("
", svar0); + } + ivar0 = add(ivar0, 1); + } + script_102(svar0); + return; +} diff --git a/dumps/scripts/1562.cs2 b/dumps/scripts/1562.cs2 new file mode 100644 index 000000000..5487a798c --- /dev/null +++ b/dumps/scripts/1562.cs2 @@ -0,0 +1,8 @@ +void script_1562() { + if (cs2method5428(49414144, -1)) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(754,0)); + script_89(); + return; +} diff --git a/dumps/scripts/1563.cs2 b/dumps/scripts/1563.cs2 new file mode 100644 index 000000000..ce681f298 --- /dev/null +++ b/dumps/scripts/1563.cs2 @@ -0,0 +1,76 @@ +int script_1563(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + cs2func_script_296_struct(2,0,0) structdump_7; + cs2func_script_296_struct(2,0,0) structdump_8; + ivar11 = 0; + ivar12 = 0; + stack_dump0 = arg0; + stack_dump1 = arg2; + stack_dump2 = arg5; + stack_dump3 = arg6; + stack_dump4 = arg7; + stack_dump5 = arg8; + stack_dump6 = arg9; + structdump_7 = script_296(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6); + ivar12 = structdump_7.intpart_1; + ivar11 = structdump_7.intpart_0; + ivar13 = 0; + ivar14 = 0; + stack_dump0 = arg1; + stack_dump1 = arg2; + stack_dump2 = arg5; + stack_dump3 = arg6; + stack_dump4 = arg7; + stack_dump5 = arg8; + stack_dump6 = arg9; + structdump_8 = script_296(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6); + ivar14 = structdump_8.intpart_1; + ivar13 = structdump_8.intpart_0; + ivar15 = add(ivar11, divide(subtract(ivar13, ivar11), 2)); + ivar16 = add(ivar12, divide(subtract(ivar14, ivar12), 2)); + ivar17 = subtract(ivar13, ivar11); + ivar18 = subtract(ivar14, ivar12); + stack_dump0 = max(ivar17, subtract(0, ivar17)); + ivar18 = max(ivar18, subtract(0, ivar18)); + ivar17 = stack_dump0; + if (setWidgetRegister(new WidgetPointer(arg5), arg10)) { + setWidgetPosition(ivar15, ivar16, 1, 1); + setWidgetSize(ivar17, ivar18, 0, 0); + } else { + createExtraChild(new WidgetPointer(arg5), 3, arg10); + setWidgetPosition(ivar15, ivar16, 1, 1); + setWidgetSize(ivar17, ivar18, 0, 0); + setWidgetRGB(new Color(arg3)); + setWidgetFilled(0); + cs2method2103(0); + } + arg10 = add(arg10, 1); + ivar17 = add(ivar17, multiply(2, arg4)); + ivar18 = add(ivar18, multiply(2, arg4)); + if (setWidgetRegister(new WidgetPointer(arg5), arg10)) { + setWidgetPosition(ivar15, ivar16, 1, 1); + setWidgetSize(ivar17, ivar18, 0, 0); + } else { + createExtraChild(new WidgetPointer(arg5), 3, arg10); + setWidgetPosition(ivar15, ivar16, 1, 1); + setWidgetSize(ivar17, ivar18, 0, 0); + setWidgetRGB(new Color(arg3)); + setWidgetFilled(0); + cs2method2103(0); + } + return add(arg10, 1); +} diff --git a/dumps/scripts/1564.cs2 b/dumps/scripts/1564.cs2 new file mode 100644 index 000000000..1108c7a59 --- /dev/null +++ b/dumps/scripts/1564.cs2 @@ -0,0 +1,8 @@ +void script_1564(string arg0) { + setWidgetText(new WidgetPointer(752,5), replaceLtGt(arg0)); + globalstring_22 = arg0; + globalint_1029 = strLength(arg0); + setScriptCallOnMousePressed(1556, -2147483647, new WidgetPointer(-32768,3), -2147483643, "iIi", new WidgetPointer(752,5)); + script_1557(); + return; +} diff --git a/dumps/scripts/1565.cs2 b/dumps/scripts/1565.cs2 new file mode 100644 index 000000000..be9baaae4 --- /dev/null +++ b/dumps/scripts/1565.cs2 @@ -0,0 +1,18 @@ +void script_1565() { + setWidgetFont(307, new WidgetPointer(210,1)); + setWidgetFont(307, new WidgetPointer(211,1)); + setWidgetFont(307, new WidgetPointer(211,2)); + setWidgetFont(307, new WidgetPointer(212,1)); + setWidgetFont(307, new WidgetPointer(212,2)); + setWidgetFont(307, new WidgetPointer(212,3)); + setWidgetFont(307, new WidgetPointer(213,1)); + setWidgetFont(307, new WidgetPointer(213,2)); + setWidgetFont(307, new WidgetPointer(213,3)); + setWidgetFont(307, new WidgetPointer(213,4)); + setWidgetFont(307, new WidgetPointer(214,1)); + setWidgetFont(307, new WidgetPointer(214,2)); + setWidgetFont(307, new WidgetPointer(214,3)); + setWidgetFont(307, new WidgetPointer(214,4)); + setWidgetFont(307, new WidgetPointer(214,5)); + return; +} diff --git a/dumps/scripts/1566.cs2 b/dumps/scripts/1566.cs2 new file mode 100644 index 000000000..93509d7a7 --- /dev/null +++ b/dumps/scripts/1566.cs2 @@ -0,0 +1,14 @@ +int script_1566(int arg0,int arg1) { + if ((arg0 == 7) && ((boolean)arg1)) { + return 1; + } + if (arg0 == 4) { + switch (arg1) { + case 0: + case 1: + case 2: + return 1; + } + } + return 0; +} diff --git a/dumps/scripts/1567.cs2 b/dumps/scripts/1567.cs2 new file mode 100644 index 000000000..7199697e9 --- /dev/null +++ b/dumps/scripts/1567.cs2 @@ -0,0 +1,19 @@ +cs2func_script_1567_struct(2,2,0) script_1567(int arg0,int arg1,int arg2) { + int stack_dump0; + int stack_dump1; + cs2func_script_2788_struct(2,2,0) structdump_2; + cs2func_script_2787_struct(2,2,0) structdump_3; + if (arg0 == 7) { + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_2 = script_2788(stack_dump0, stack_dump1); + return newstruct cs2func_script_1567_struct(structdump_2.intpart_0, structdump_2.intpart_1, structdump_2.stringpart_0, structdump_2.stringpart_1); + } + if (arg0 == 4) { + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_3 = script_2787(stack_dump0, stack_dump1); + return newstruct cs2func_script_1567_struct(structdump_3.intpart_0, structdump_3.intpart_1, structdump_3.stringpart_0, structdump_3.stringpart_1); + } + return newstruct cs2func_script_1567_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/1568.cs2 b/dumps/scripts/1568.cs2 new file mode 100644 index 000000000..363b334a4 --- /dev/null +++ b/dumps/scripts/1568.cs2 @@ -0,0 +1,8 @@ +void script_1568(int arg0) { + if (((boolean)getLanguage())) { + setWidgetSprite(2295, new WidgetPointer(arg0)); + } else { + setWidgetSprite(2281, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1569.cs2 b/dumps/scripts/1569.cs2 new file mode 100644 index 000000000..6b2514714 --- /dev/null +++ b/dumps/scripts/1569.cs2 @@ -0,0 +1,12 @@ +int script_1569() { + if (getDisplayMode() >= 2) { + if (isWidgetOpen(new WidgetPointer(746,87))) { + return 1; + } + } else { + if (isWidgetOpen(new WidgetPointer(548,199))) { + return 1; + } + } + return 0; +} diff --git a/dumps/scripts/157.cs2 b/dumps/scripts/157.cs2 new file mode 100644 index 000000000..a6e8373d1 --- /dev/null +++ b/dumps/scripts/157.cs2 @@ -0,0 +1,27 @@ +void script_157(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + ivar4 = subtract(getWidgetScrollMaxV(new WidgetPointer(arg1)), getWidgetActualHeight(new WidgetPointer(arg1))); + if (((boolean)ivar4)) { + ivar4 = 1; + } + if (arg2 < 0) { + arg2 = 0; + } + if (arg2 > ivar4) { + arg2 = ivar4; + } + cs2method2100(0, arg2, new WidgetPointer(arg1)); + ivar5 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), 1) && ((boolean)arg3)) { + ivar5 = subtract(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), 32), getWidgetActualHeight()); + setWidgetPosition(0, add(16, divide(multiply(ivar5, arg2), ivar4)), 0, 0); + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetPosition(0, getWidgetActualY(), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetPosition(0, subtract(add(getWidgetActualY(), getWidgetActualHeight()), 5), 0, 0); + } + } + return; +} diff --git a/dumps/scripts/1570.cs2 b/dumps/scripts/1570.cs2 new file mode 100644 index 000000000..c814bfa9e --- /dev/null +++ b/dumps/scripts/1570.cs2 @@ -0,0 +1,4 @@ +void script_1570(int arg0,int arg1) { + cs2method2103(arg0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/1571.cs2 b/dumps/scripts/1571.cs2 new file mode 100644 index 000000000..af59525b6 --- /dev/null +++ b/dumps/scripts/1571.cs2 @@ -0,0 +1,19 @@ +void script_1571(int arg0,int arg1,int arg2) { + int ivar3; + string svar0; + svar0 = globalstring_203; + ivar3 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(ivar3, arg2, svar0 + " ") > ivar3) { + while (getTextWidth(arg2, svar0 + "... ") > ivar3) { + svar0 = substr(0, subtract(strLength(svar0), 1), svar0); + } + svar0 = svar0 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), globalstring_203, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar0); + return; +} diff --git a/dumps/scripts/1572.cs2 b/dumps/scripts/1572.cs2 new file mode 100644 index 000000000..d10bbbe44 --- /dev/null +++ b/dumps/scripts/1572.cs2 @@ -0,0 +1,19 @@ +void script_1572(int arg0,int arg1) { + int ivar2; + string svar0; + svar0 = globalstring_206; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(2147483647, 496, svar0) > ivar2) { + while (getMaxLineWidth(2147483647, 496, svar0 + "...") > ivar2) { + svar0 = substr(0, subtract(strLength(svar0), 1), svar0); + } + svar0 = svar0 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), globalstring_206, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar0); + return; +} diff --git a/dumps/scripts/1573.cs2 b/dumps/scripts/1573.cs2 new file mode 100644 index 000000000..fd5cfb525 --- /dev/null +++ b/dumps/scripts/1573.cs2 @@ -0,0 +1,4 @@ +void script_1573(int arg0,int arg1) { + script_1575(arg0, arg1, globalstring_207); + return; +} diff --git a/dumps/scripts/1574.cs2 b/dumps/scripts/1574.cs2 new file mode 100644 index 000000000..6a8332aa5 --- /dev/null +++ b/dumps/scripts/1574.cs2 @@ -0,0 +1,4 @@ +void script_1574(int arg0,int arg1) { + script_1575(arg0, arg1, globalstring_208); + return; +} diff --git a/dumps/scripts/1575.cs2 b/dumps/scripts/1575.cs2 new file mode 100644 index 000000000..b1b203469 --- /dev/null +++ b/dumps/scripts/1575.cs2 @@ -0,0 +1,19 @@ +void script_1575(int arg0,int arg1,string arg2) { + int ivar2; + string svar1; + svar1 = arg2; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(2147483647, 497, svar1) > ivar2) { + while (getMaxLineWidth(2147483647, 497, svar1 + "...") > ivar2) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1); + } + svar1 = svar1 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), arg2, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar1); + return; +} diff --git a/dumps/scripts/1576.cs2 b/dumps/scripts/1576.cs2 new file mode 100644 index 000000000..164f79814 --- /dev/null +++ b/dumps/scripts/1576.cs2 @@ -0,0 +1,19 @@ +void script_1576(int arg0,int arg1) { + int ivar2; + string svar0; + svar0 = globalstring_209; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(2147483647, 497, svar0) > ivar2) { + while (getMaxLineWidth(2147483647, 497, svar0 + "...") > ivar2) { + svar0 = substr(0, subtract(strLength(svar0), 1), svar0); + } + svar0 = svar0 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), globalstring_209, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar0); + return; +} diff --git a/dumps/scripts/1577.cs2 b/dumps/scripts/1577.cs2 new file mode 100644 index 000000000..ab60e4dff --- /dev/null +++ b/dumps/scripts/1577.cs2 @@ -0,0 +1,19 @@ +void script_1577(int arg0,int arg1) { + int ivar2; + string svar0; + svar0 = globalstring_210; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(ivar2, 497, svar0) > ivar2) { + while (getMaxLineWidth(2147483647, 497, svar0 + "...") > ivar2) { + svar0 = substr(0, subtract(strLength(svar0), 1), svar0); + } + svar0 = svar0 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), globalstring_210, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar0); + return; +} diff --git a/dumps/scripts/1578.cs2 b/dumps/scripts/1578.cs2 new file mode 100644 index 000000000..2608afd4d --- /dev/null +++ b/dumps/scripts/1578.cs2 @@ -0,0 +1,19 @@ +void script_1578(int arg0,int arg1) { + int ivar2; + string svar0; + svar0 = globalstring_211; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(2147483647, 645, svar0) > ivar2) { + while (getMaxLineWidth(2147483647, 645, svar0 + "...") > ivar2) { + svar0 = substr(0, subtract(strLength(svar0), 1), svar0); + } + svar0 = svar0 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), globalstring_211, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar0); + return; +} diff --git a/dumps/scripts/1579.cs2 b/dumps/scripts/1579.cs2 new file mode 100644 index 000000000..34f6c1fbc --- /dev/null +++ b/dumps/scripts/1579.cs2 @@ -0,0 +1,4 @@ +void script_1579(int arg0) { + script_125(arg0); + return; +} diff --git a/dumps/scripts/158.cs2 b/dumps/scripts/158.cs2 new file mode 100644 index 000000000..3b15b56ed --- /dev/null +++ b/dumps/scripts/158.cs2 @@ -0,0 +1,5 @@ +void script_158(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + script_160(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, "null", "null", "null", "null"); + setScriptCallOnItemContainerUpdate(159, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, "null", "null", "null", "null", arg1, 1, "IviiiIsssssssssY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1580.cs2 b/dumps/scripts/1580.cs2 new file mode 100644 index 000000000..d55ab675b --- /dev/null +++ b/dumps/scripts/1580.cs2 @@ -0,0 +1,13 @@ +void script_1580() { + setWidgetText(new WidgetPointer(972,29), "Bre'egth: " + "
" + "
" + "Aggressive female ork found patrolling Zanaris near the windmill." + "
" + "
" + " Intelligence leads us to believe that a recent fist fight with a subordinate left Bre'egth with one less tooth in her head, and one subordinate"); + setWidgetText(new WidgetPointer(972,30), "permanently relocated somewhere else. " + "
" + "
" + "Her bragging is well known throughout Zanaris, however, she is important to 'Bad Daddy's' plans. Without her, the ork warrior grunts would simply be fighting each other and their superiors. She keeps them in check." + "
" + " " + "
" + "Suggest first talking to Bre'egth - she's likely to recount the entire story to you if you ask. The trouble might be in getting away again afterwards."); + setWidgetText(new WidgetPointer(972,23), "Gromblod: " + "
" + "
" + "Mango-mad ork found in the Enchanted Valley. " + "
" + "
" + "His teeth are so rotten that he can only eat soft fruit, hence his preference for mangos."); + setWidgetText(new WidgetPointer(972,24), "According to reports, he's creating a bit of a nuisance of himself in the Enchanted Valley. " + "
" + "
" + "The locals don't want to give him the secret to where the magic mango tree is. " + "
" + "
" + "They're afraid he'll consume the entire harvest and they're probably right." + "
" + "
" + " Fairy ring code: BKQ."); + setWidgetText(new WidgetPointer(972,18), "Shredflesh: " + "
" + "
" + "A complete brute to look at, but suspect he's a real teddy bear inside. " + "
" + "
" + "Last reports place him in a cavern in the Gu'Tanoth region. He's searching for herbs to control his excruciating toothache."); + setWidgetText(new WidgetPointer(972,19), "He needs a dentist, so you may be able to convince him that it's the right thing to do." + "
" + "
" + "Fairy ring code: ALP."); + setWidgetText(new WidgetPointer(972,13), "Fairy Godfather " + "
" + "Code name: 'Bad Daddy':" + "
" + "The main villain; he needs to be stopped." + "
" + "
" + " Located in a separated off section of Zanaris, he's discovered a weakness in the interplanar fabric. This is really bad news for us!"); + setWidgetText(new WidgetPointer(972,14), "'Bad Daddy' has used his magic and the magic of the Fairy Queen to make a rift between this plane and another seemingly filled with orks. He's using the rift to transport orks through to use as henchmen." + "
" + "
" + "The Godfather is invulnerable to any standard attack. His magic is somehow linked to orks, so we suspect some sort of weakness there."); + setWidgetText(new WidgetPointer(972,9), "Ork teeth: Crude and brutal, these masticating marvels convey a feeling of basic primal energy." + "
" + "
" + "What they lack in quality, they more than make up for in their wonderfully coarse, brutal and businesslike functionality."); + setWidgetText(new WidgetPointer(972,10), "In the host's early years, the tooth comes to an excessively tantalising point! " + "
" + "
" + "As the host grazes most of the time, this quickly gets worn down. " + "
" + "
" + "Opinion is divided, but many believe the more interesting teeth come from those orks more accustomed to combat. A broken tooth sometimes creates a sublime 'organic' structure - smooth and discoloured, but dense."); + return; +} diff --git a/dumps/scripts/1581.cs2 b/dumps/scripts/1581.cs2 new file mode 100644 index 000000000..386817f03 --- /dev/null +++ b/dumps/scripts/1581.cs2 @@ -0,0 +1,89 @@ +void script_1581(int arg0) { + int ivar1; + int ivar2; + int ivar3; + string svar0; + string svar1; + svar0 = ""; + ivar1 = 494; + ivar2 = 32243761; + switch (arg0) { + case 32243727: + case 32309275: + case 31981571: + svar0 = globalstring_212; + break; + case 32309276: + case 31981576: + case 32243728: + svar0 = globalstring_213; + break; + case 32309277: + case 31981581: + case 32243729: + svar0 = globalstring_214; + break; + case 32309278: + case 31981586: + case 32243730: + svar0 = globalstring_215; + break; + case 32309279: + case 32243731: + svar0 = globalstring_216; + } + switch (arg0) { + case 32309278: + case 32309279: + case 32309276: + case 32309277: + case 32309275: + ivar1 = 495; + ivar2 = 32309304; + break; + case 31981576: + case 31981581: + case 31981586: + case 31981571: + ivar1 = 495; + ivar2 = 31981595; + } + svar1 = svar0; + ivar3 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(2147483647, ivar1, svar1 + " ") > ivar3) { + while (getMaxLineWidth(2147483647, ivar1, svar1 + "... ") > ivar3) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1); + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(ivar2), svar0, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(ivar2), "I", new WidgetPointer(arg0)); + svar0 = svar1 + "..."; + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + switch (arg0) { + case 32309278: + case 32243727: + case 32309279: + case 32309276: + case 32309277: + case 32309275: + case 32243731: + case 32243730: + case 32243729: + case 32243728: + if (((boolean)stringMethod4107(svar0, "")) || ((boolean)stringMethod4107(svar0, "null"))) { + svar0 = "none set"; + } + break; + case 31981576: + case 31981581: + case 31981571: + case 31981586: + if (((boolean)stringMethod4107(svar0, "")) || ((boolean)stringMethod4107(svar0, "null"))) { + svar0 = "---"; + } + } + setWidgetText(new WidgetPointer(arg0), svar0); + return; +} diff --git a/dumps/scripts/1582.cs2 b/dumps/scripts/1582.cs2 new file mode 100644 index 000000000..d2534a6f7 --- /dev/null +++ b/dumps/scripts/1582.cs2 @@ -0,0 +1,19 @@ +void script_1582(int arg0,int arg1) { + int ivar2; + string svar0; + svar0 = globalstring_217; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(2147483647, 495, svar0 + " ") > ivar2) { + while (getMaxLineWidth(2147483647, 495, svar0 + "... ") > ivar2) { + svar0 = substr(0, subtract(strLength(svar0), 1), svar0); + } + svar0 = svar0 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), globalstring_217, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar0); + return; +} diff --git a/dumps/scripts/1583.cs2 b/dumps/scripts/1583.cs2 new file mode 100644 index 000000000..f06318a31 --- /dev/null +++ b/dumps/scripts/1583.cs2 @@ -0,0 +1,19 @@ +void script_1583(int arg0,int arg1,string arg2) { + int ivar2; + string svar1; + svar1 = arg2; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(ivar2, 495, svar1 + " ") > ivar2) { + while (getMaxLineWidth(2147483647, 495, svar1 + "... ") > ivar2) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1); + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), arg2, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + arg2 = svar1 + "..."; + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), arg2); + return; +} diff --git a/dumps/scripts/1584.cs2 b/dumps/scripts/1584.cs2 new file mode 100644 index 000000000..beec7c33c --- /dev/null +++ b/dumps/scripts/1584.cs2 @@ -0,0 +1,4 @@ +void script_1584(int arg0,int arg1) { + script_1585(arg0, arg1, globalstring_218); + return; +} diff --git a/dumps/scripts/1585.cs2 b/dumps/scripts/1585.cs2 new file mode 100644 index 000000000..025b2841c --- /dev/null +++ b/dumps/scripts/1585.cs2 @@ -0,0 +1,19 @@ +void script_1585(int arg0,int arg1,string arg2) { + int ivar2; + string svar1; + svar1 = arg2; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(ivar2, 496, svar1 + " ") > ivar2) { + while (getMaxLineWidth(2147483647, 496, svar1 + "... ") > ivar2) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1); + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), arg2, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + svar1 = svar1 + "..."; + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar1); + return; +} diff --git a/dumps/scripts/1586.cs2 b/dumps/scripts/1586.cs2 new file mode 100644 index 000000000..3c5a8910b --- /dev/null +++ b/dumps/scripts/1586.cs2 @@ -0,0 +1,4 @@ +void script_1586(int arg0,int arg1,int arg2) { + script_1587(arg0, arg1, arg2, globalstring_219); + return; +} diff --git a/dumps/scripts/1587.cs2 b/dumps/scripts/1587.cs2 new file mode 100644 index 000000000..db44cbb0c --- /dev/null +++ b/dumps/scripts/1587.cs2 @@ -0,0 +1,19 @@ +void script_1587(int arg0,int arg1,int arg2,string arg3) { + int ivar3; + string svar1; + svar1 = arg3; + ivar3 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(ivar3, arg2, svar1 + " ") > ivar3) { + while (getMaxLineWidth(2147483647, arg2, svar1 + "... ") > ivar3) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1); + } + svar1 = svar1 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), arg3, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar1); + return; +} diff --git a/dumps/scripts/1588.cs2 b/dumps/scripts/1588.cs2 new file mode 100644 index 000000000..65d084787 --- /dev/null +++ b/dumps/scripts/1588.cs2 @@ -0,0 +1,4 @@ +void script_1588() { + script_1592(26279942, 26279960, globalstring_220); + return; +} diff --git a/dumps/scripts/1589.cs2 b/dumps/scripts/1589.cs2 new file mode 100644 index 000000000..4fc95267c --- /dev/null +++ b/dumps/scripts/1589.cs2 @@ -0,0 +1,4 @@ +void script_1589() { + script_1592(26279943, 26279960, globalstring_221); + return; +} diff --git a/dumps/scripts/159.cs2 b/dumps/scripts/159.cs2 new file mode 100644 index 000000000..80a855d25 --- /dev/null +++ b/dumps/scripts/159.cs2 @@ -0,0 +1,4 @@ +void script_159(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + script_160(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + return; +} diff --git a/dumps/scripts/1590.cs2 b/dumps/scripts/1590.cs2 new file mode 100644 index 000000000..6bd0c0e93 --- /dev/null +++ b/dumps/scripts/1590.cs2 @@ -0,0 +1,4 @@ +void script_1590() { + script_1592(26279944, 26279960, globalstring_222); + return; +} diff --git a/dumps/scripts/1591.cs2 b/dumps/scripts/1591.cs2 new file mode 100644 index 000000000..f57e05114 --- /dev/null +++ b/dumps/scripts/1591.cs2 @@ -0,0 +1,4 @@ +void script_1591() { + script_1592(26279945, 26279960, globalstring_223); + return; +} diff --git a/dumps/scripts/1592.cs2 b/dumps/scripts/1592.cs2 new file mode 100644 index 000000000..6380c123c --- /dev/null +++ b/dumps/scripts/1592.cs2 @@ -0,0 +1,19 @@ +void script_1592(int arg0,int arg1,string arg2) { + int ivar2; + string svar1; + svar1 = arg2; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(2147483647, 495, svar1) > ivar2) { + while (getMaxLineWidth(2147483647, 495, svar1 + "...") > ivar2) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1); + } + svar1 = svar1 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), arg2, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar1); + return; +} diff --git a/dumps/scripts/1593.cs2 b/dumps/scripts/1593.cs2 new file mode 100644 index 000000000..fa48d4dbc --- /dev/null +++ b/dumps/scripts/1593.cs2 @@ -0,0 +1,218 @@ +void script_1593(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + ivar1 = 72679435; + ivar2 = 72679434; + ivar3 = 72679429; + ivar4 = 72679430; + ivar5 = 72679432; + ivar6 = 72679431; + ivar7 = 72679428; + ivar8 = 72679427; + ivar9 = 72679433; + ivar10 = getWidgetActualWidth(new WidgetPointer(ivar1)); + if (arg0 <= -1) { + arg0 = getWidgetActualX(new WidgetPointer(ivar1)); + } + arg0 = max(min(arg0, subtract(getWidgetActualWidth(new WidgetPointer(ivar2)), ivar10)), 0); + globalint_1505 = arg0; + setWidgetPosition(arg0, 0, 0, 1, new WidgetPointer(ivar1)); + cs2method2314(149, new WidgetPointer(ivar1)); + deleteAllExtraChilds(new WidgetPointer(ivar3)); + deleteAllExtraChilds(new WidgetPointer(ivar4)); + deleteAllExtraChilds(new WidgetPointer(ivar5)); + deleteAllExtraChilds(new WidgetPointer(ivar6)); + ivar11 = 0; + ivar12 = script_3365(ivar2); + ivar13 = add(arg0, subtract(ivar12, script_3365(ivar3))); + ivar14 = subtract(getWidgetActualWidth(new WidgetPointer(ivar5)), add(add(arg0, subtract(ivar12, script_3365(ivar5))), ivar10)); + svar0 = ""; + ivar15 = 0; + ivar16 = 0; + svar1 = ""; + svar2 = ""; + ivar17 = 19; + svar3 = ""; + svar4 = ""; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + ivar23 = divide(getWidgetActualHeight(new WidgetPointer(ivar8)), ivar17); + ivar24 = 0; + ivar25 = cs2method3612(); + if (ivar25 > 0) { + setWidgetIsHidden(true, new WidgetPointer(1109,15)); + while (ivar11 < ivar25) { + ivar16 = ivar11; + ivar22 = multiply(ivar11, ivar17); + svar1 = cs2method3613(ivar11); + svar2 = cs2method3632(ivar11); + ivar20 = cs2method3614(ivar11); + ivar21 = cs2method3615(ivar11); + createExtraChild(new WidgetPointer(ivar3), 4, ivar11); + setWidgetTextAlignment(0, 1, 0); + setWidgetPosition(0, ivar22, 0, 0); + setWidgetSize(ivar13, ivar17, 0, 0); + setWidgetRGB(new Color(164, 153, 125)); + setWidgetFont(3793); + setWidgetUnknownBoolean(false); + setScriptCallOnClickContextMenu(202, svar1, svar2, -2147483644, ivar11, "ssii"); + svar0 = "\u00a0\u00a0" + svar1; + if (getTextWidth(3793, svar0) > ivar13) { + while ((getTextWidth(3793, svar0 + "...") > ivar13) && (strLength(svar0) > 0)) { + svar0 = substr(0, subtract(strLength(svar0), 1), svar0); + } + svar0 = svar0 + "..."; + setScriptCallOnMouseOver(1594, new WidgetPointer(1109,36), new WidgetPointer(-32768,3), -2147483643, svar1, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1109,36), "I"); + } + setWidgetText(svar0); + script_1595(ivar11, svar1, svar2); + setWidgetSize(ivar14, 0, 0, 1, new WidgetPointer(ivar5)); + setWidgetSize(ivar14, 0, 0, 1, new WidgetPointer(ivar6)); + createExtraChild(new WidgetPointer(ivar5), 4, getExtraChildGap(new WidgetPointer(ivar5))); + setWidgetFont(3793); + setWidgetPosition(0, ivar22, 2, 0); + setWidgetSize(ivar14, ivar17, 0, 0); + setWidgetUnknownBoolean(true); + if (ivar20 == getWorldId()) { + setWidgetRGB(new Color(60, 183, 30)); + } else { + setWidgetRGB(new Color(255, 255, 100)); + } + setWidgetUnknownBoolean(false); + if ((ivar20 >= 1100) && (ivar20 < 5001)) { + svar3 = "Lobby"; + svar4 = "Lobby"; + ivar18 = 0; + } else if ((ivar20 >= 5001) && (ivar20 < 6000)) { + svar3 = "Classic " + intToStr(subtract(ivar20, 5000)); + svar4 = "Classic " + intToStr(subtract(ivar20, 5000)); + ivar18 = 0; + } else { + svar3 = intToStr(ivar20); + svar4 = "World " + intToStr(ivar20); + ivar18 = add(add(2, 24), 2); + } + ivar19 = getTextWidth(3793, svar3); + if (ivar14 >= add(ivar19, ivar18)) { + if (ivar18 > 0) { + createExtraChild(new WidgetPointer(ivar6), 5, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetSprite(2173); + setWidgetSize(24, 12, 0, 0); + setWidgetPosition(2, add(ivar22, 3), 0, 0); + setScriptCallOnMouseOver(1594, new WidgetPointer(1109,36), new WidgetPointer(-32768,3), -2147483643, svar4, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1109,36), "I"); + } + } else { + ivar18 = 0; + } + if (ivar14 >= ivar19) { + } else { + setScriptCallOnMouseOver(1594, new WidgetPointer(1109,36), new WidgetPointer(-32768,3), -2147483643, svar4, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1109,36), "I"); + svar3 = "..."; + } + createExtraChild(new WidgetPointer(ivar5), 4, getExtraChildGap(new WidgetPointer(ivar5))); + setWidgetSize(ivar14, ivar17, 0, 0); + setWidgetPosition(add(ivar18, 2), add(ivar22, 1), 0, 0); + setWidgetFont(3793); + setWidgetUnknownBoolean(false); + setWidgetTextAlignment(0, 0, 0); + setWidgetText(svar3); + if (((boolean)ivar20)) { + setWidgetRGB(new Color(221, 92, 62)); + } else if (ivar20 == getWorldId()) { + setWidgetRGB(new Color(60, 183, 30)); + } else { + setWidgetRGB(new Color(255, 255, 100)); + } + setScriptCallOnMouseOver(1594, new WidgetPointer(1109,36), new WidgetPointer(-32768,3), -2147483643, svar4, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1109,36), "I"); + createExtraChild(new WidgetPointer(ivar4), 5, getExtraChildGap(new WidgetPointer(ivar4))); + setWidgetPosition(1, add(multiply(ivar11, ivar17), 5), 0, 0); + setWidgetSize(9, 9, 0, 0); + setWidgetSprite(script_1599(ivar21)); + ivar11 = add(ivar11, 1); + } + svar3 = "Talking in: " + "" + cs2method3611(); + svar1 = "Owner: " + "" + cs2method3625(); + ivar12 = getWidgetActualWidth(new WidgetPointer(1109,1)); + if (getTextWidth(494, svar3) > ivar12) { + while ((getTextWidth(494, svar3 + "...") > ivar12) && (strLength(svar3) > 0)) { + svar3 = substr(0, subtract(strLength(svar3), 1), svar3); + ivar24 = 1; + } + svar3 = svar3 + "..."; + } + if (getTextWidth(494, svar1) > ivar12) { + while ((getTextWidth(494, svar1) > ivar12) && (strLength(svar1) > 0)) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1 + "..."); + ivar24 = 1; + } + svar1 = svar1 + "..."; + } + setWidgetText(new WidgetPointer(1109,1), svar3 + "
" + svar1); + if (((boolean)ivar24)) { + svar3 = "Talking in: " + cs2method3611() + "
" + "Owner: " + cs2method3625(); + setScriptCallOnMouseOver(4538, new WidgetPointer(1109,36), new WidgetPointer(-32768,3), -1, svar3, 120, 3793, 3793, 16777215, 13, 4, 2, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1109,1)); + setScriptCallOnMouseExit(40, new WidgetPointer(1109,36), "I", new WidgetPointer(1109,1)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(1109,1)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(1109,1)); + } + setWidgetContextMenuOption(1, new WidgetPointer(1109,27), "Leave chat"); + setWidgetSprite(6243, new WidgetPointer(1109,28)); + setWidgetIsHidden(false, new WidgetPointer(ivar1)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1109,15)); + setWidgetText(new WidgetPointer(1109,1), "Talking in: Not in chat"); + setWidgetContextMenuOption(1, new WidgetPointer(1109,27), "Join chat"); + setWidgetSprite(6242, new WidgetPointer(1109,28)); + setWidgetIsHidden(true, new WidgetPointer(ivar1)); + setWidgetNoOptions(new WidgetPointer(ivar1)); + setScriptCallOnMouseOver(-1, "", new WidgetPointer(1109,1)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(1109,1)); + } + ivar26 = cs2method2601(new WidgetPointer(ivar8)); + ivar27 = multiply(max(ivar11, ivar23), ivar17); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar8)), ivar27, new WidgetPointer(ivar8)); + if (ivar26 > ivar27) { + ivar26 = ivar27; + } + cs2method2100(0, ivar26, new WidgetPointer(ivar8)); + script_31(ivar9, ivar8, 5666, 5663, 5664, 5665, 5686, 5685); + return; +} diff --git a/dumps/scripts/1594.cs2 b/dumps/scripts/1594.cs2 new file mode 100644 index 000000000..52b18e2a5 --- /dev/null +++ b/dumps/scripts/1594.cs2 @@ -0,0 +1,10 @@ +void script_1594(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + if (setWidgetRegister(new WidgetPointer(arg1), arg2) || ((arg2 == -1) && setWidgetRegister(new WidgetPointer(arg1)))) { + if (script_1744() < multiplyDivide(3, 5, 261)) { + script_4539(arg0, arg1, arg2, 120, 3793, 3793, 16777215, 13, 4, 2, arg3, arg4, arg5); + } else { + script_4539(arg0, arg1, arg2, 120, 3793, 3793, 16777215, 13, 4, 0, arg3, arg4, arg5); + } + } + return; +} diff --git a/dumps/scripts/1595.cs2 b/dumps/scripts/1595.cs2 new file mode 100644 index 000000000..b83599b6c --- /dev/null +++ b/dumps/scripts/1595.cs2 @@ -0,0 +1,17 @@ +void script_1595(int arg0,string arg1,string arg2) { + if (cs2method3624(arg0)) { + if (isFriend(arg2)) { + setWidgetContextMenuOption(5, "Message " + arg1); + setWidgetContextMenuOption(7, "Remove friend " + arg1); + } else if (cs2method3623(arg2)) { + setWidgetContextMenuOption(8, "Remove ignore " + arg1); + } else { + setWidgetContextMenuOption(5, "Add friend " + arg1); + setWidgetContextMenuOption(6, "Add ignore " + arg1); + } + } + if ((cs2method3618() >= cs2method3616()) && (cs2method3618() > cs2method3615(arg0))) { + setWidgetContextMenuOption(9, "Kick/ban user " + arg1); + } + return; +} diff --git a/dumps/scripts/1596.cs2 b/dumps/scripts/1596.cs2 new file mode 100644 index 000000000..5a36671fd --- /dev/null +++ b/dumps/scripts/1596.cs2 @@ -0,0 +1,7 @@ +void script_1596(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + setWidgetSprite(1071, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/1597.cs2 b/dumps/scripts/1597.cs2 new file mode 100644 index 000000000..cd787b459 --- /dev/null +++ b/dumps/scripts/1597.cs2 @@ -0,0 +1,14 @@ +void script_1597(int arg0) { + if (((boolean)bitconfig_4072) || ((boolean)bitconfig_4073)) { + setWidgetSprite(1071, new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_4071)) { + if (((boolean)bitconfig_4465)) { + setWidgetSprite(306, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1069, new WidgetPointer(arg0)); + } + } else { + setWidgetSprite(1070, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1598.cs2 b/dumps/scripts/1598.cs2 new file mode 100644 index 000000000..33d3a759d --- /dev/null +++ b/dumps/scripts/1598.cs2 @@ -0,0 +1,17 @@ +void script_1598(int arg0) { + if (globalint_53 < getClientCycle()) { + if (((boolean)bitconfig_4072) || ((boolean)bitconfig_4073)) { + setWidgetSprite(1071, new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_4071)) { + if (((boolean)bitconfig_4465)) { + setWidgetSprite(306, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1069, new WidgetPointer(arg0)); + } + } else { + setWidgetSprite(1070, new WidgetPointer(arg0)); + } + globalint_53 = add(getClientCycle(), 500); + } + return; +} diff --git a/dumps/scripts/1599.cs2 b/dumps/scripts/1599.cs2 new file mode 100644 index 000000000..9da11cf2b --- /dev/null +++ b/dumps/scripts/1599.cs2 @@ -0,0 +1,23 @@ +int script_1599(int arg0) { + switch (arg0) { + case 0: + return 1004; + case 1: + return 6226; + case 2: + return 6225; + case 3: + return 6224; + case 4: + return 6232; + case 5: + return 6233; + case 6: + return 6231; + case 7: + return 6227; + case 127: + return 1005; + } + return -1; +} diff --git a/dumps/scripts/16.cs2 b/dumps/scripts/16.cs2 new file mode 100644 index 000000000..7d0e5ef42 --- /dev/null +++ b/dumps/scripts/16.cs2 @@ -0,0 +1,4 @@ +void script_16(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12) { + script_21(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); + return; +} diff --git a/dumps/scripts/160.cs2 b/dumps/scripts/160.cs2 new file mode 100644 index 000000000..6a6bb5027 --- /dev/null +++ b/dumps/scripts/160.cs2 @@ -0,0 +1,27 @@ +void script_160(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + int ivar6; + int ivar7; + int ivar8; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar6 = 0; + ivar7 = 0; + if (getWidgetScrollMaxH(new WidgetPointer(arg0)) > 0) { + ivar6 = divide(subtract(getWidgetScrollMaxH(new WidgetPointer(arg0)), multiply(36, arg2)), subtract(arg2, 1)); + } else { + ivar6 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(36, arg2)), subtract(arg2, 1)); + } + if (getWidgetScrollMaxV(new WidgetPointer(arg0)) > 0) { + ivar7 = divide(subtract(getWidgetScrollMaxV(new WidgetPointer(arg0)), multiply(32, arg3)), subtract(arg3, 1)); + } else { + ivar7 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(32, arg3)), subtract(arg3, 1)); + } + ivar8 = 0; + while (ivar8 <= multiply(arg2, arg3)) { + createExtraChild(new WidgetPointer(arg0), 5, ivar8); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar6), mod(ivar8, arg2)), multiply(divide(ivar8, arg2), add(32, ivar7)), 0, 0); + script_161(arg1, ivar8, arg0, ivar8, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + ivar8 = add(ivar8, 1); + } + return; +} diff --git a/dumps/scripts/1600.cs2 b/dumps/scripts/1600.cs2 new file mode 100644 index 000000000..c96c24665 --- /dev/null +++ b/dumps/scripts/1600.cs2 @@ -0,0 +1,14 @@ +void script_1600() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (((boolean)script_1891())) { + setWidgetIsHidden(false, new WidgetPointer(1109,20)); + ivar0 = getWidgetActualY(new WidgetPointer(1109,18)); + setWidgetPosition(134, ivar0, 0, 0, new WidgetPointer(1109,18)); + return; + } + script_1632(); + return; +} diff --git a/dumps/scripts/1601.cs2 b/dumps/scripts/1601.cs2 new file mode 100644 index 000000000..bbed3765f --- /dev/null +++ b/dumps/scripts/1601.cs2 @@ -0,0 +1,55 @@ +void script_1601(int arg0) { + int ivar1; + int ivar2; + ivar1 = -1; + ivar2 = -1; + switch (rnd(2)) { + case 0: + playSoundEffect(7813, 1, 0); + break; + case 1: + playSoundEffect(7817, 1, 0); + break; + case 2: + playSoundEffect(7818, 1, 0); + } + switch (arg0) { + case 63701023: + ivar1 = 63700995; + ivar2 = 63700996; + break; + case 63701017: + ivar1 = 63700996; + ivar2 = 63700997; + break; + case 63701012: + ivar1 = 63700997; + ivar2 = 63700998; + break; + case 63701007: + ivar1 = 63700998; + ivar2 = 63700999; + break; + case 63701003: + ivar1 = 63700999; + ivar2 = 63700998; + break; + case 63701008: + ivar1 = 63700998; + ivar2 = 63700997; + break; + case 63701013: + ivar1 = 63700997; + ivar2 = 63700996; + break; + case 63701018: + ivar1 = 63700996; + ivar2 = 63700995; + break; + default: + script_675(); + } + setWidgetIsHidden(true, new WidgetPointer(ivar1)); + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + return; +} diff --git a/dumps/scripts/1602.cs2 b/dumps/scripts/1602.cs2 new file mode 100644 index 000000000..b6bcc91f9 --- /dev/null +++ b/dumps/scripts/1602.cs2 @@ -0,0 +1,3 @@ +string script_1602(string arg0) { + return script_2332(arg0, substr(0, 1, ""), ">"); +} diff --git a/dumps/scripts/1603.cs2 b/dumps/scripts/1603.cs2 new file mode 100644 index 000000000..cb2dd3082 --- /dev/null +++ b/dumps/scripts/1603.cs2 @@ -0,0 +1,31 @@ +void script_1603(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + opcStruct5209(2,0,0) structdump_0; + if (cs2method5220()) { + return; + } + ivar2 = add(15, max(subtract(globalint_1030, getClientCycle()), 0)); + globalint_1030 = min(max(add(globalint_1030, 2), add(getClientCycle(), 2)), add(getClientCycle(), 25)); + switch (globalint_172) { + case 37: + ivar2 = multiply(ivar2, 5); + break; + case 50: + ivar2 = multiply(ivar2, 4); + break; + case 75: + ivar2 = multiply(ivar2, 3); + break; + case 100: + ivar2 = multiply(ivar2, 2); + } + ivar3 = 0; + ivar4 = 0; + structdump_0 = cs2method5209(); + ivar4 = structdump_0.intpart_1; + ivar3 = structdump_0.intpart_0; + cs2method5221(addToCoordinate(0, max(add(ivar3, multiply(arg0, ivar2)), 0), 0, max(add(ivar4, multiply(arg1, ivar2)), 0))); + return; +} diff --git a/dumps/scripts/1604.cs2 b/dumps/scripts/1604.cs2 new file mode 100644 index 000000000..96bc7ece2 --- /dev/null +++ b/dumps/scripts/1604.cs2 @@ -0,0 +1,196 @@ +void script_1604() { + int ivar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_788_struct(2,0,0) structdump_3; + cs2func_script_788_struct(2,0,0) structdump_4; + cs2func_script_788_struct(2,0,0) structdump_5; + cs2func_script_788_struct(2,0,0) structdump_6; + cs2func_script_788_struct(2,0,0) structdump_7; + cs2func_script_788_struct(2,0,0) structdump_8; + cs2func_script_788_struct(2,0,0) structdump_9; + cs2func_script_788_struct(2,0,0) structdump_10; + cs2func_script_788_struct(2,0,0) structdump_11; + cs2func_script_788_struct(2,0,0) structdump_12; + cs2func_script_788_struct(2,0,0) structdump_13; + cs2func_script_788_struct(2,0,0) structdump_14; + cs2func_script_788_struct(2,0,0) structdump_15; + cs2func_script_788_struct(2,0,0) structdump_16; + cs2func_script_788_struct(2,0,0) structdump_17; + cs2func_script_788_struct(2,0,0) structdump_18; + cs2func_script_788_struct(2,0,0) structdump_19; + cs2func_script_788_struct(2,0,0) structdump_20; + cs2func_script_788_struct(2,0,0) structdump_21; + cs2func_script_788_struct(2,0,0) structdump_22; + cs2func_script_788_struct(2,0,0) structdump_23; + cs2func_script_788_struct(2,0,0) structdump_24; + deleteAllExtraChilds(new WidgetPointer(549,110)); + setWidgetIsHidden(true, new WidgetPointer(549,15)); + ivar0 = 0; + while (ivar0 < 14) { + createExtraChild(new WidgetPointer(549,110), 5, ivar0); + if (((ivar0 != 6) && (ivar0 != 8)) && (ivar0 != 11)) { + if (getItemIdInSlot(94, ivar0) != -1) { + setWidgetSize(36, 32, 0, 0); + if (((boolean)ivar0)) { + stack_dump0 = 35979380; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_3 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_3.intpart_0, structdump_3.intpart_1, 0, 0); + } else if (((boolean)ivar0)) { + stack_dump0 = 35979381; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_4 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_4.intpart_0, structdump_4.intpart_1, 0, 0); + } else if (ivar0 == 2) { + stack_dump0 = 35979382; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_5 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_5.intpart_0, structdump_5.intpart_1, 0, 0); + } else if (ivar0 == 3) { + stack_dump0 = 35979384; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_6 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_6.intpart_0, structdump_6.intpart_1, 0, 0); + } else if (ivar0 == 4) { + stack_dump0 = 35979385; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_7 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_7.intpart_0, structdump_7.intpart_1, 0, 0); + } else if (ivar0 == 5) { + stack_dump0 = 35979386; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_8 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_8.intpart_0, structdump_8.intpart_1, 0, 0); + } else if (ivar0 == 7) { + stack_dump0 = 35979387; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_9 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_9.intpart_0, structdump_9.intpart_1, 0, 0); + } else if (ivar0 == 9) { + stack_dump0 = 35979389; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_10 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_10.intpart_0, structdump_10.intpart_1, 0, 0); + } else if (ivar0 == 10) { + stack_dump0 = 35979388; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_11 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_11.intpart_0, structdump_11.intpart_1, 0, 0); + } else if (ivar0 == 12) { + stack_dump0 = 35979390; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_12 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_12.intpart_0, structdump_12.intpart_1, 0, 0); + } else { + if (ivar0 == 13) { + stack_dump0 = 35979383; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_13 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_13.intpart_0, structdump_13.intpart_1, 0, 0); + } + } + setItemOnWidgetMethod1200(getItemIdInSlot(94, ivar0), getItemAmtInSlot(94, ivar0)); + cs2method1305(getItemName(getItemIdInSlot(94, ivar0))); + setWidgetContextMenuOption(1, "Remove" + ""); + setWidgetContextMenuOption(10, "Examine" + ""); + setWidgetShadowColor(new Color(17, 17, 17)); + setWidgetBorderThickness(1); + } else if (((boolean)ivar0)) { + stack_dump0 = 35979380; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_14 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_14.intpart_0, structdump_14.intpart_1, 0, 0); + setWidgetSprite(156); + } else if (((boolean)ivar0)) { + stack_dump0 = 35979381; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_15 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_15.intpart_0, structdump_15.intpart_1, 0, 0); + setWidgetSprite(157); + } else if (ivar0 == 2) { + stack_dump0 = 35979382; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_16 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_16.intpart_0, structdump_16.intpart_1, 0, 0); + setWidgetSprite(158); + } else if (ivar0 == 3) { + stack_dump0 = 35979384; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_17 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_17.intpart_0, structdump_17.intpart_1, 0, 0); + setWidgetSprite(159); + } else if (ivar0 == 4) { + stack_dump0 = 35979385; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_18 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_18.intpart_0, structdump_18.intpart_1, 0, 0); + setWidgetSprite(161); + } else if (ivar0 == 5) { + stack_dump0 = 35979386; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_19 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_19.intpart_0, structdump_19.intpart_1, 0, 0); + setWidgetSprite(162); + } else if (ivar0 == 7) { + stack_dump0 = 35979387; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_20 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_20.intpart_0, structdump_20.intpart_1, 0, 0); + setWidgetSprite(163); + } else if (ivar0 == 9) { + stack_dump0 = 35979389; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_21 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_21.intpart_0, structdump_21.intpart_1, 0, 0); + setWidgetSprite(164); + } else if (ivar0 == 10) { + stack_dump0 = 35979388; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_22 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_22.intpart_0, structdump_22.intpart_1, 0, 0); + setWidgetSprite(165); + } else if (ivar0 == 12) { + stack_dump0 = 35979390; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_23 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_23.intpart_0, structdump_23.intpart_1, 0, 0); + setWidgetSprite(160); + } else { + if (ivar0 == 13) { + stack_dump0 = 35979383; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_24 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_24.intpart_0, structdump_24.intpart_1, 0, 0); + setWidgetSprite(166); + } + } + setWidgetSize(32, 32, 0, 0); + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/1605.cs2 b/dumps/scripts/1605.cs2 new file mode 100644 index 000000000..ecf1937e6 --- /dev/null +++ b/dumps/scripts/1605.cs2 @@ -0,0 +1,4 @@ +void script_1605() { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(549,127)); + return; +} diff --git a/dumps/scripts/1606.cs2 b/dumps/scripts/1606.cs2 new file mode 100644 index 000000000..9d1421013 --- /dev/null +++ b/dumps/scripts/1606.cs2 @@ -0,0 +1,4 @@ +void script_1606() { + setWidgetRGB(new Color(201, 128, 13), new WidgetPointer(549,127)); + return; +} diff --git a/dumps/scripts/1607.cs2 b/dumps/scripts/1607.cs2 new file mode 100644 index 000000000..7c31ea4b8 --- /dev/null +++ b/dumps/scripts/1607.cs2 @@ -0,0 +1,7 @@ +void script_1607() { + int ivar0; + ivar0 = 12411; + setWidgetAnimation(ivar0, new WidgetPointer(549,54)); + cs2method2202(new WidgetPointer(549,54)); + return; +} diff --git a/dumps/scripts/1608.cs2 b/dumps/scripts/1608.cs2 new file mode 100644 index 000000000..30e6dcdff --- /dev/null +++ b/dumps/scripts/1608.cs2 @@ -0,0 +1,7 @@ +void script_1608() { + int ivar0; + ivar0 = getRenderEmoteMaxSomethingMethod4600(getItemHashmapData(getItemIdInSlot(94, 3), 644)); + setWidgetAnimation(ivar0, new WidgetPointer(549,82)); + setWidgetSelfFull(new WidgetPointer(549,82)); + return; +} diff --git a/dumps/scripts/1609.cs2 b/dumps/scripts/1609.cs2 new file mode 100644 index 000000000..da1c8a34f --- /dev/null +++ b/dumps/scripts/1609.cs2 @@ -0,0 +1,4 @@ +void script_1609() { + setWidgetIsHidden(true, new WidgetPointer(549,15)); + return; +} diff --git a/dumps/scripts/161.cs2 b/dumps/scripts/161.cs2 new file mode 100644 index 000000000..71db97f01 --- /dev/null +++ b/dumps/scripts/161.cs2 @@ -0,0 +1,50 @@ +void script_161(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + if (getItemIdInSlotSplit(arg0, arg1) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlotSplit(arg0, arg1), getItemAmtInSlotSplit(arg0, arg1)); + cs2method1305(getItemName(getItemIdInSlotSplit(arg0, arg1))); + setWidgetContextMenuOption(1, arg6); + setWidgetContextMenuOption(2, arg7); + setWidgetContextMenuOption(3, arg8); + setWidgetContextMenuOption(4, arg9); + setWidgetContextMenuOption(5, arg10); + setWidgetContextMenuOption(6, arg11); + setWidgetContextMenuOption(7, arg12); + setWidgetContextMenuOption(8, arg13); + setWidgetContextMenuOption(9, arg14); + setWidgetContextMenuOption(10, "Examine" + ""); + if (arg4 > 0) { + cs2method1303(5); + cs2method1304(10); + } + if (((boolean)arg4)) { + setScriptCallOnMouseDragReleased(155, arg0, -2147483643, -2147483641, new WidgetPointer(-32768,3), arg4, new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, "viiIiIsssssssss"); + } else { + if (arg4 == 2) { + setScriptCallOnMouseDragReleased(156, arg0, -2147483643, -2147483641, new WidgetPointer(-32768,3), arg4, new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, "viiIiIsssssssss"); + } + } + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + } else { + setItemOnWidgetMethod1200(-1, 0); + cs2method1305(""); + setWidgetContextMenuOption(1, ""); + setWidgetContextMenuOption(2, ""); + setWidgetContextMenuOption(3, ""); + setWidgetContextMenuOption(4, ""); + setWidgetContextMenuOption(5, ""); + setWidgetContextMenuOption(6, ""); + setWidgetContextMenuOption(7, ""); + setWidgetContextMenuOption(8, ""); + setWidgetContextMenuOption(9, ""); + setWidgetContextMenuOption(10, ""); + if (arg4 > 0) { + cs2method1303(0); + cs2method1304(0); + } + setScriptCallOnMouseDragReleased(-1, ""); + } + } + return; +} diff --git a/dumps/scripts/1610.cs2 b/dumps/scripts/1610.cs2 new file mode 100644 index 000000000..8af1f532e --- /dev/null +++ b/dumps/scripts/1610.cs2 @@ -0,0 +1,5 @@ +void script_1610() { + setWidgetIsHidden(false, new WidgetPointer(549,15)); + script_679(35979299); + return; +} diff --git a/dumps/scripts/1611.cs2 b/dumps/scripts/1611.cs2 new file mode 100644 index 000000000..7875b7ff9 --- /dev/null +++ b/dumps/scripts/1611.cs2 @@ -0,0 +1,9 @@ +int script_1611() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(bitconfig_4003, bitconfig_4007), bitconfig_4008), bitconfig_4009), bitconfig_4010), bitconfig_4011), bitconfig_4013), bitconfig_4014), bitconfig_4015), bitconfig_4016), bitconfig_4017), bitconfig_4018), bitconfig_4019), bitconfig_4020), bitconfig_4021), bitconfig_4022), bitconfig_4023), bitconfig_4024), bitconfig_4025), bitconfig_4026); + if (bitconfig_4012 == 4) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/1612.cs2 b/dumps/scripts/1612.cs2 new file mode 100644 index 000000000..a973172ee --- /dev/null +++ b/dumps/scripts/1612.cs2 @@ -0,0 +1,49 @@ +void script_1612(int arg0,int arg1) { + int ivar2; + string svar0; + ivar2 = getItemIdInSlot(94, arg1); + if (ivar2 == -1) { + setItemOnWidgetMethod2200(-1, 0, new WidgetPointer(arg0)); + setWidgetSize(32, 32, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(arg0)); + setWidgetSprite(cs2method_3408(105, 100, 796, arg1), new WidgetPointer(arg0)); + setWidgetBorderThickness(0, new WidgetPointer(arg0)); + setWidgetShadowColor(new Color(0, 0, 0), new WidgetPointer(arg0)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg0)); + return; + } + setWidgetSize(36, 32, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(2, 0, 0, 1, new WidgetPointer(arg0)); + setItemOnWidgetMethod2200(ivar2, getItemAmtInSlot(94, arg1), new WidgetPointer(arg0)); + setWidgetBorderThickness(1, new WidgetPointer(arg0)); + setWidgetShadowColor(new Color(48, 32, 32), new WidgetPointer(arg0)); + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -1, 100, 0, 8, "Iiiii", new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg0)); + if (((boolean)getItemHashmapData(ivar2, 1430))) { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Remove"); + } + svar0 = getItemHashmapData(ivar2, 528); + if (strLength(svar0) > 0) { + setWidgetContextMenuOption(2, new WidgetPointer(arg0), svar0); + } + svar0 = getItemHashmapData(ivar2, 529); + if (strLength(svar0) > 0) { + setWidgetContextMenuOption(3, new WidgetPointer(arg0), svar0); + } + svar0 = getItemHashmapData(ivar2, 530); + if (strLength(svar0) > 0) { + setWidgetContextMenuOption(4, new WidgetPointer(arg0), svar0); + } + svar0 = getItemHashmapData(ivar2, 531); + if (strLength(svar0) > 0) { + setWidgetContextMenuOption(5, new WidgetPointer(arg0), svar0); + } + svar0 = getItemHashmapData(ivar2, 1211); + if (strLength(svar0) > 0) { + setWidgetContextMenuOption(6, new WidgetPointer(arg0), svar0); + } + setWidgetContextMenuOption(10, new WidgetPointer(arg0), "Examine"); + cs2method2305(new WidgetPointer(arg0), "" + getItemName(ivar2)); + return; +} diff --git a/dumps/scripts/1613.cs2 b/dumps/scripts/1613.cs2 new file mode 100644 index 000000000..4e8f52c35 --- /dev/null +++ b/dumps/scripts/1613.cs2 @@ -0,0 +1,77 @@ +void script_1613(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + if (((boolean)arg1)) { + globalint_1031 = 0; + } + ivar2 = getItemContainerLength(93); + ivar3 = subtract(multiply(ivar2, 2), 1); + ivar4 = 0; + while (ivar4 <= ivar3) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar4)) { + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetSize(36, 32, 0, 0); + if (ivar4 < ivar2) { + setWidgetShadowColor(new Color(48, 32, 32)); + setScriptCallOnUse(1615, 1, new WidgetPointer(-32768,3), -2147483643, "1Ii"); + setScriptCallOnUseWith(1615, 0, new WidgetPointer(-32768,3), -2147483643, "1Ii"); + cs2method1302(2); + cs2method1303(5); + cs2method1304(5); + setScriptCallOnMouseDragReleased(1616, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(-32768,6), -2147483641, "IiIi"); + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -2147483643, 100, 0, 8, "Iiiii"); + } else { + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(255); + setWidgetHidden(0); + } + } + ivar4 = add(ivar4, 1); + } + ivar5 = divide(ivar2, 4); + ivar6 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(4, 36)), 3); + ivar7 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(ivar5, 32)), 6); + ivar8 = -1; + ivar3 = subtract(globalint_1031, 1); + ivar4 = 0; + while (ivar4 < ivar2) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar4)) { + setWidgetNoOptions(); + setWidgetPosition(multiply(mod(ivar4, 4), add(36, ivar6)), multiply(divide(ivar4, 4), add(32, ivar7)), 0, 0); + ivar8 = getItemIdInSlot(93, ivar4); + if (ivar8 != -1) { + setWidgetHidden(0); + setItemOnWidgetMethod1200(ivar8, getItemAmtInSlot(93, ivar4)); + if (ivar4 == ivar3) { + setWidgetBorderThickness(2); + } else { + setWidgetBorderThickness(1); + } + script_2833(ivar8); + cs2method1301(arg0, -1); + } else { + setWidgetHidden(1); + setScriptCallOnConfigChange(-1, ""); + setItemOnWidgetMethod1200(-1, 0); + setWidgetBorderThickness(1); + if (ivar4 == ivar3) { + globalint_1031 = 0; + } + } + } + ivar4 = add(ivar4, 1); + } + ivar4 = 0; + while (ivar4 < ivar2) { + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar2, ivar4))) { + setWidgetPosition(multiply(mod(ivar4, 4), add(36, ivar6)), multiply(divide(ivar4, 4), add(32, ivar7)), 0, 0); + } + ivar4 = add(ivar4, 1); + } + return; +} diff --git a/dumps/scripts/1614.cs2 b/dumps/scripts/1614.cs2 new file mode 100644 index 000000000..dcd938c0f --- /dev/null +++ b/dumps/scripts/1614.cs2 @@ -0,0 +1,11 @@ +void script_1614(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = -1; + ivar3 = getItemDefOpcode129Or130Method4209(arg2, arg0); + if (ivar3 != -1) { + cs2method1309(arg1, ivar3); + } else { + cs2method1309(arg1, 36); + } + return; +} diff --git a/dumps/scripts/1615.cs2 b/dumps/scripts/1615.cs2 new file mode 100644 index 000000000..70eb7c1de --- /dev/null +++ b/dumps/scripts/1615.cs2 @@ -0,0 +1,14 @@ +void script_1615(int arg0,int arg1,int arg2) { + if (((boolean)arg0)) { + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetBorderThickness(2); + } + globalint_1031 = add(1, arg2); + } else { + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetBorderThickness(1); + } + globalint_1031 = 0; + } + return; +} diff --git a/dumps/scripts/1616.cs2 b/dumps/scripts/1616.cs2 new file mode 100644 index 000000000..de5c2ae75 --- /dev/null +++ b/dumps/scripts/1616.cs2 @@ -0,0 +1,40 @@ +void script_1616(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int stack_dump0; + if (arg0 != arg2) { + return; + } + ivar4 = getItemContainerLength(93); + arg1 = mod(arg1, ivar4); + arg3 = mod(arg3, ivar4); + ivar5 = -1; + ivar6 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1) && setWidgetRegister(new WidgetPointer(arg2), arg3)) { + stack_dump0 = getWidgetItemId(); + ivar6 = getWidgetItemAmt(); + ivar5 = stack_dump0; + setItemOnWidgetMethod1200(getWidgetItemId(), getWidgetItemAmt()); + setItemOnWidgetMethod1200(ivar5, ivar6); + setWidgetNoOptions(); + setWidgetNoOptions(); + if (getWidgetItemId() != -1) { + setWidgetHidden(0); + script_2833(getWidgetItemId()); + } else { + setScriptCallOnConfigChange(-1, ""); + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + if (getWidgetItemId() != -1) { + setWidgetHidden(0); + script_2833(getWidgetItemId()); + } else { + setScriptCallOnConfigChange(-1, ""); + setWidgetHidden(1); + } + } + } + return; +} diff --git a/dumps/scripts/1617.cs2 b/dumps/scripts/1617.cs2 new file mode 100644 index 000000000..8ad779869 --- /dev/null +++ b/dumps/scripts/1617.cs2 @@ -0,0 +1,5 @@ +void script_1617() { + setWidgetText(new WidgetPointer(63,8), intToStr(standart_config_620) + " Constitution XP"); + setWidgetText(new WidgetPointer(63,7), intToStr(standart_config_621) + " Slayer XP"); + return; +} diff --git a/dumps/scripts/1618.cs2 b/dumps/scripts/1618.cs2 new file mode 100644 index 000000000..0c3a87aa5 --- /dev/null +++ b/dumps/scripts/1618.cs2 @@ -0,0 +1,33 @@ +void script_1618() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = -1; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + setWidgetIsHidden(false, new WidgetPointer(287,4)); + if (((boolean)globalint_1032)) { + ivar0 = 221; + } else { + ivar0 = 222; + } + ivar1 = getItemContainerLength(ivar0); + if (ivar1 != multiply(5, 5)) { + messageType0("Nothing happens, as if something is wrong."); + return; + } + while (ivar4 < ivar1) { + script_1619(ivar2, ivar3, getItemIdInSlot(ivar0, ivar4)); + ivar2 = add(ivar2, 1); + if (ivar2 >= 5) { + ivar2 = 0; + ivar3 = add(ivar3, 1); + } + ivar4 = add(ivar4, 1); + } + return; +} diff --git a/dumps/scripts/1619.cs2 b/dumps/scripts/1619.cs2 new file mode 100644 index 000000000..aacd4a648 --- /dev/null +++ b/dumps/scripts/1619.cs2 @@ -0,0 +1,13 @@ +void script_1619(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + if ((((arg0 < 0) || (arg0 >= 5)) || (arg1 < 0)) || (arg1 >= 5)) { + messageType0("Nothing happens, as if something has gone wrong."); + return; + } + ivar3 = cs2method_3408(105, 103, 800, arg1); + ivar4 = ((int)cs2method_3408(105, 73, ivar3, arg0)); + setWidgetModel(cs2method_3408(111, 109, 797, arg2), new WidgetPointer(ivar4)); + setWidget3DRotation(0, 0, 520, 0, 0, 2180, new WidgetPointer(ivar4)); + return; +} diff --git a/dumps/scripts/162.cs2 b/dumps/scripts/162.cs2 new file mode 100644 index 000000000..ce4d3d6a1 --- /dev/null +++ b/dumps/scripts/162.cs2 @@ -0,0 +1,12 @@ +void script_162(int arg0,int arg1,int arg2,int arg3) { + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + arg3 = subtract(arg3, cs2method2601(new WidgetPointer(arg1))); + if (arg3 < 10) { + script_157(arg2, arg1, subtract(cs2method2601(new WidgetPointer(arg1)), 4), 1); + } + if (add(arg3, getWidgetActualHeight()) > subtract(getWidgetActualHeight(new WidgetPointer(arg1)), 10)) { + script_157(arg2, arg1, add(cs2method2601(new WidgetPointer(arg1)), 4), 1); + } + } + return; +} diff --git a/dumps/scripts/1620.cs2 b/dumps/scripts/1620.cs2 new file mode 100644 index 000000000..7ad36d5d2 --- /dev/null +++ b/dumps/scripts/1620.cs2 @@ -0,0 +1,8 @@ +void script_1620(int arg0,int arg1,int arg2,int arg3,int arg4) { + arg4 = add(arg4, getClientCycle()); + if (setWidgetRegister(new WidgetPointer(arg0), arg1) || ((arg1 == -1) && setWidgetRegister(new WidgetPointer(arg0)))) { + cs2method2103(arg2); + setScriptCallOnGameloop(1621, new WidgetPointer(arg0), arg1, arg3, arg4, "Iiii"); + } + return; +} diff --git a/dumps/scripts/1621.cs2 b/dumps/scripts/1621.cs2 new file mode 100644 index 000000000..ea03cfc62 --- /dev/null +++ b/dumps/scripts/1621.cs2 @@ -0,0 +1,10 @@ +void script_1621(int arg0,int arg1,int arg2,int arg3) { + if (getClientCycle() < arg3) { + return; + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1) || ((arg1 == -1) && setWidgetRegister(new WidgetPointer(arg0)))) { + cs2method2103(arg2); + setScriptCallOnGameloop(-1, ""); + } + return; +} diff --git a/dumps/scripts/1622.cs2 b/dumps/scripts/1622.cs2 new file mode 100644 index 000000000..31580de20 --- /dev/null +++ b/dumps/scripts/1622.cs2 @@ -0,0 +1,37 @@ +void script_1622(int arg0) { + switch (arg0) { + case 21561344: + if (setWidgetRegister(new WidgetPointer(329,2))) { + setWidgetSprite(6367); + } + if (setWidgetRegister(new WidgetPointer(329,3))) { + setWidgetSprite(6368); + } + if (setWidgetRegister(new WidgetPointer(329,4))) { + setWidgetSprite(6369); + } + break; + case 33947660: + if (setWidgetRegister(new WidgetPointer(518,0))) { + setWidgetSprite(6367); + } + if (setWidgetRegister(new WidgetPointer(518,1))) { + setWidgetSprite(6368); + } + if (setWidgetRegister(new WidgetPointer(518,2))) { + setWidgetSprite(6369); + } + break; + case 21561345: + if (setWidgetRegister(new WidgetPointer(329,40))) { + setWidgetSprite(6367); + } + if (setWidgetRegister(new WidgetPointer(329,41))) { + setWidgetSprite(6368); + } + if (setWidgetRegister(new WidgetPointer(329,42))) { + setWidgetSprite(6369); + } + } + return; +} diff --git a/dumps/scripts/1623.cs2 b/dumps/scripts/1623.cs2 new file mode 100644 index 000000000..514cf93c8 --- /dev/null +++ b/dumps/scripts/1623.cs2 @@ -0,0 +1,37 @@ +void script_1623(int arg0) { + switch (arg0) { + case 21561344: + if (setWidgetRegister(new WidgetPointer(329,2))) { + setWidgetSprite(6355); + } + if (setWidgetRegister(new WidgetPointer(329,3))) { + setWidgetSprite(6356); + } + if (setWidgetRegister(new WidgetPointer(329,4))) { + setWidgetSprite(6357); + } + break; + case 33947660: + if (setWidgetRegister(new WidgetPointer(518,0))) { + setWidgetSprite(6355); + } + if (setWidgetRegister(new WidgetPointer(518,1))) { + setWidgetSprite(6356); + } + if (setWidgetRegister(new WidgetPointer(518,2))) { + setWidgetSprite(6357); + } + break; + case 21561345: + if (setWidgetRegister(new WidgetPointer(329,40))) { + setWidgetSprite(6355); + } + if (setWidgetRegister(new WidgetPointer(329,41))) { + setWidgetSprite(6356); + } + if (setWidgetRegister(new WidgetPointer(329,42))) { + setWidgetSprite(6357); + } + } + return; +} diff --git a/dumps/scripts/1624.cs2 b/dumps/scripts/1624.cs2 new file mode 100644 index 000000000..4a604f3c0 --- /dev/null +++ b/dumps/scripts/1624.cs2 @@ -0,0 +1,12 @@ +void script_1624() { + if (((boolean)getLanguage())) { + setWidgetSprite(7668, new WidgetPointer(518,6)); + } else if (getLanguage() == 2) { + setWidgetSprite(7667, new WidgetPointer(518,6)); + } else { + if (getLanguage() == 3) { + setWidgetSprite(7669, new WidgetPointer(518,6)); + } + } + return; +} diff --git a/dumps/scripts/1625.cs2 b/dumps/scripts/1625.cs2 new file mode 100644 index 000000000..48dadab83 --- /dev/null +++ b/dumps/scripts/1625.cs2 @@ -0,0 +1,4 @@ +void script_1625() { + script_1626(); + return; +} diff --git a/dumps/scripts/1626.cs2 b/dumps/scripts/1626.cs2 new file mode 100644 index 000000000..f257aa624 --- /dev/null +++ b/dumps/scripts/1626.cs2 @@ -0,0 +1,18 @@ +void script_1626() { + string svar0; + string svar1; + svar0 = "Curtsy"; + svar1 = "Bow"; + if (((int)IsFemale()) > 0) { + setWidgetSprite(2317, new WidgetPointer(464,4)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(464,54), svar0, 50, 150, "IIsii", new WidgetPointer(464,4)); + setWidgetContextMenuOption(1, new WidgetPointer(464,4), svar0); + setWidgetContextMenuOption(2, new WidgetPointer(464,4), svar1); + } else { + setWidgetSprite(703, new WidgetPointer(464,4)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(464,54), svar1, 50, 150, "IIsii", new WidgetPointer(464,4)); + setWidgetContextMenuOption(2, new WidgetPointer(464,4), svar0); + setWidgetContextMenuOption(1, new WidgetPointer(464,4), svar1); + } + return; +} diff --git a/dumps/scripts/1627.cs2 b/dumps/scripts/1627.cs2 new file mode 100644 index 000000000..81219c799 --- /dev/null +++ b/dumps/scripts/1627.cs2 @@ -0,0 +1,4 @@ +void script_1627() { + script_1628(); + return; +} diff --git a/dumps/scripts/1628.cs2 b/dumps/scripts/1628.cs2 new file mode 100644 index 000000000..8a1ea00b4 --- /dev/null +++ b/dumps/scripts/1628.cs2 @@ -0,0 +1,26 @@ +void script_1628() { + int ivar0; + int ivar1; + int ivar2; + globalint_1033 = 0; + ivar0 = subtract(extractX(getMyPositionHash()), mod(extractX(getMyPositionHash()), 64)); + ivar1 = subtract(extractY(getMyPositionHash()), mod(extractY(getMyPositionHash()), 64)); + ivar2 = addToCoordinate(0, ivar0, 0, ivar1); + cs2method5405(0, 6); + cs2method5406(0, 0, addToCoordinate(ivar2, 22, 0, 9), 450, addToCoordinate(ivar2, 22, 0, 9), 400, 0); + cs2method5406(0, 1, addToCoordinate(ivar2, 13, 0, 17), 450, addToCoordinate(ivar2, 13, 0, 7), 400, 0); + cs2method5406(0, 2, addToCoordinate(ivar2, 17, 0, 20), 550, addToCoordinate(ivar2, 17, 0, 20), 600, 0); + cs2method5406(0, 3, addToCoordinate(ivar2, 17, 0, 20), 650, addToCoordinate(ivar2, 17, 0, 20), 700, 0); + cs2method5406(0, 4, addToCoordinate(ivar2, 24, 0, 19), 450, addToCoordinate(ivar2, 24, 0, 19), 500, 0); + cs2method5406(0, 5, addToCoordinate(ivar2, 26, 0, 12), 450, addToCoordinate(ivar2, 26, 0, 12), 500, 0); + cs2method5405(1, 6); + cs2method5406(1, 0, addToCoordinate(ivar2, 8, 0, 12), 300, addToCoordinate(ivar2, 8, 0, 12), 300, 0); + cs2method5406(1, 1, addToCoordinate(ivar2, 8, 0, 20), 300, addToCoordinate(ivar2, 8, 0, 20), 300, 0); + cs2method5406(1, 2, addToCoordinate(ivar2, 8, 0, 12), 300, addToCoordinate(ivar2, 8, 0, 12), 300, 0); + cs2method5406(1, 3, addToCoordinate(ivar2, 8, 0, 28), 300, addToCoordinate(ivar2, 8, 0, 28), 300, 0); + cs2method5406(1, 4, addToCoordinate(ivar2, 30, 0, 16), 300, addToCoordinate(ivar2, 30, 0, 16), 300, 0); + cs2method5406(1, 5, addToCoordinate(ivar2, 30, 0, 16), 400, addToCoordinate(ivar2, 30, 0, 16), 400, 0); + setScriptCallOnMinimapRelatedSetting3(1631, "", new WidgetPointer(75,0)); + cameraMethod5502(0, 0, 200, 200, 1, 0); + return; +} diff --git a/dumps/scripts/1629.cs2 b/dumps/scripts/1629.cs2 new file mode 100644 index 000000000..dd658acf0 --- /dev/null +++ b/dumps/scripts/1629.cs2 @@ -0,0 +1,6 @@ +void script_1629() { + globalint_1033 = 1; + cameraMethod5502(0, globalint_1033, 200, 100, 1, globalint_1033); + setScriptCallOnMinimapRelatedSetting3(1631, "", new WidgetPointer(75,0)); + return; +} diff --git a/dumps/scripts/163.cs2 b/dumps/scripts/163.cs2 new file mode 100644 index 000000000..617584076 --- /dev/null +++ b/dumps/scripts/163.cs2 @@ -0,0 +1,4 @@ +void script_163(int arg0) { + setWidgetSprite(941, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1630.cs2 b/dumps/scripts/1630.cs2 new file mode 100644 index 000000000..4beeae982 --- /dev/null +++ b/dumps/scripts/1630.cs2 @@ -0,0 +1,6 @@ +void script_1630() { + globalint_1033 = 3; + cameraMethod5502(0, globalint_1033, 200, 200, 1, globalint_1033); + setScriptCallOnMinimapRelatedSetting3(1631, "", new WidgetPointer(75,0)); + return; +} diff --git a/dumps/scripts/1631.cs2 b/dumps/scripts/1631.cs2 new file mode 100644 index 000000000..7d9b3d630 --- /dev/null +++ b/dumps/scripts/1631.cs2 @@ -0,0 +1,21 @@ +void script_1631() { + if (globalint_1033 <= cs2method5407(0)) { + flow_1: + globalint_1033 = add(globalint_1033, 1); + SWITCH (globalint_1033) { + case 4: + GOTO flow_2 + case 2: + GOTO flow_2 + } + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(75,0)); + GOTO flow_3 + flow_2: + setScriptCallOnMinimapRelatedSetting3(1631, "", new WidgetPointer(75,0)); + cameraMethod5502(0, globalint_1033, 200, 200, 1, globalint_1033); + flow_3: + } else { + globalint_1033 = 0; + } + return; +} diff --git a/dumps/scripts/1632.cs2 b/dumps/scripts/1632.cs2 new file mode 100644 index 000000000..168b6c509 --- /dev/null +++ b/dumps/scripts/1632.cs2 @@ -0,0 +1,8 @@ +void script_1632() { + int ivar0; + setWidgetIsHidden(true, new WidgetPointer(1109,22)); + setWidgetIsHidden(true, new WidgetPointer(1109,20)); + ivar0 = getWidgetActualY(new WidgetPointer(1109,18)); + setWidgetPosition(148, ivar0, 0, 0, new WidgetPointer(1109,18)); + return; +} diff --git a/dumps/scripts/1633.cs2 b/dumps/scripts/1633.cs2 new file mode 100644 index 000000000..7cfe5d57a --- /dev/null +++ b/dumps/scripts/1633.cs2 @@ -0,0 +1,59 @@ +void script_1633(string arg0) { + int ivar0; + int ivar1; + string svar1; + arg0 = lower(strRemoveEntities(arg0)); + ivar0 = strLength(arg0); + ivar1 = 0; + arg0 = script_2332(arg0, "_", "\u00a0"); + arg0 = script_2332(arg0, "-", "\u00a0"); + arg0 = script_2332(arg0, " ", "\u00a0"); + while (((boolean)strIndexof(0, arg0, " ")) && (ivar0 > 0)) { + arg0 = substr(1, ivar0, arg0); + ivar0 = strLength(arg0); + } + while ((strIndexof(subtract(ivar0, 1), arg0, " ") == subtract(ivar0, 1)) && (ivar0 > 0)) { + arg0 = substr(0, subtract(ivar0, 1), arg0); + ivar0 = strLength(arg0); + } + while (((boolean)strIndexof(0, arg0, "\u00a0")) && (ivar0 > 0)) { + arg0 = substr(1, ivar0, arg0); + ivar0 = strLength(arg0); + } + while ((strIndexof(subtract(ivar0, 1), arg0, "\u00a0") == subtract(ivar0, 1)) && (ivar0 > 0)) { + arg0 = substr(0, subtract(ivar0, 1), arg0); + ivar0 = strLength(arg0); + } + svar1 = lower(strRemoveEntities(cs2method5020())); + ivar0 = strLength(svar1); + svar1 = script_2332(svar1, "_", "\u00a0"); + svar1 = script_2332(svar1, "-", "\u00a0"); + svar1 = script_2332(svar1, " ", "\u00a0"); + while (((boolean)strIndexof(0, svar1, " ")) && (ivar0 > 0)) { + svar1 = substr(1, ivar0, svar1); + ivar0 = strLength(svar1); + } + while ((strIndexof(subtract(ivar0, 1), arg0, " ") == subtract(ivar0, 1)) && (ivar0 > 0)) { + svar1 = substr(0, subtract(ivar0, 1), svar1); + ivar0 = strLength(svar1); + } + while (((boolean)strIndexof(0, svar1, "\u00a0")) && (ivar0 > 0)) { + svar1 = substr(1, ivar0, svar1); + ivar0 = strLength(svar1); + } + while ((strIndexof(subtract(ivar0, 1), svar1, "\u00a0") == subtract(ivar0, 1)) && (ivar0 > 0)) { + svar1 = substr(0, subtract(ivar0, 1), svar1); + ivar0 = strLength(svar1); + } + if (stringMethod4107(arg0, "") != 0) { + if (((boolean)stringMethod4107(arg0, svar1))) { + script_1890("You cannot kick or ban yourself."); + return; + } + cs2method3617(arg0); + arg0 = script_1814(arg0); + cs2method5006(1); + cs2method5008("[Attempting to kick/ban " + arg0 + " from this Friends Chat.]"); + } + return; +} diff --git a/dumps/scripts/1634.cs2 b/dumps/scripts/1634.cs2 new file mode 100644 index 000000000..05fae4047 --- /dev/null +++ b/dumps/scripts/1634.cs2 @@ -0,0 +1,4 @@ +void script_1634(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(standart_config_1105)); + return; +} diff --git a/dumps/scripts/1635.cs2 b/dumps/scripts/1635.cs2 new file mode 100644 index 000000000..9c9e369e9 --- /dev/null +++ b/dumps/scripts/1635.cs2 @@ -0,0 +1,4 @@ +void script_1635(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_6594)); + return; +} diff --git a/dumps/scripts/1636.cs2 b/dumps/scripts/1636.cs2 new file mode 100644 index 000000000..156bbecd0 --- /dev/null +++ b/dumps/scripts/1636.cs2 @@ -0,0 +1,53 @@ +void script_1636(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int stack_dump0; + int stack_dump1; + int stack_dump2; + string stack_dump3; + cs2func_script_1637_struct(2,0,0) structdump_4; + cs2func_script_1637_struct(2,0,0) structdump_5; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + while (ivar4 < 50) { + stack_dump0 = arg0; + stack_dump1 = ivar3; + stack_dump2 = ivar2; + stack_dump3 = script_1638(ivar4); + structdump_4 = script_1637(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar2 = structdump_4.intpart_1; + ivar3 = structdump_4.intpart_0; + ivar4 = add(ivar4, 1); + } + if (((boolean)ivar3)) { + stack_dump0 = arg0; + stack_dump1 = 0; + stack_dump2 = 0; + stack_dump3 = "Loading..."; + structdump_5 = script_1637(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + stack_dump0 = structdump_5.intpart_0; + structdump_5.intpart_1; + stack_dump0; + } + ivar5 = 0; + ivar6 = 0; + if (ivar2 > 15) { + ivar5 = cs2method2601(new WidgetPointer(arg0)); + ivar6 = add(multiply(ivar2, 15), 8); + setWidgetScrollMax(0, ivar6, new WidgetPointer(arg0)); + if (ivar5 > ivar6) { + ivar5 = ivar6; + } + script_72(arg1, arg0, ivar5); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + script_72(arg1, arg0, 0); + } + return; +} diff --git a/dumps/scripts/1637.cs2 b/dumps/scripts/1637.cs2 new file mode 100644 index 000000000..eec92ef97 --- /dev/null +++ b/dumps/scripts/1637.cs2 @@ -0,0 +1,19 @@ +cs2func_script_1637_struct(2,0,0) script_1637(int arg0,int arg1,int arg2,string arg3) { + int ivar3; + if (((boolean)stringMethod4107(arg3, ""))) { + return newstruct cs2func_script_1637_struct(arg1, arg2); + } + createExtraChild(new WidgetPointer(arg0), 4, arg1); + setWidgetText(arg3); + setWidgetFont(495); + ivar3 = getLineCount(430, 495, arg3); + if (ivar3 < 1) { + ivar3 = 1; + } + setWidgetSize(430, multiply(14, ivar3), 0, 0); + setWidgetPosition(3, add(multiply(arg2, 15), 4), 0, 0); + setWidgetTextAlignment(1, 0, 14); + setWidgetRGB(new Color(170, 170, 170)); + setWidgetUnknownBoolean(true); + return newstruct cs2func_script_1637_struct(add(arg1, 1), add(arg2, ivar3)); +} diff --git a/dumps/scripts/1638.cs2 b/dumps/scripts/1638.cs2 new file mode 100644 index 000000000..83313226b --- /dev/null +++ b/dumps/scripts/1638.cs2 @@ -0,0 +1,105 @@ +string script_1638(int arg0) { + switch (arg0) { + case 0: + return globalstring_224; + case 1: + return globalstring_225; + case 2: + return globalstring_226; + case 3: + return globalstring_227; + case 4: + return globalstring_228; + case 5: + return globalstring_229; + case 6: + return globalstring_230; + case 7: + return globalstring_231; + case 8: + return globalstring_232; + case 9: + return globalstring_233; + case 10: + return globalstring_234; + case 11: + return globalstring_235; + case 12: + return globalstring_236; + case 13: + return globalstring_237; + case 14: + return globalstring_238; + case 15: + return globalstring_239; + case 16: + return globalstring_240; + case 17: + return globalstring_241; + case 18: + return globalstring_242; + case 19: + return globalstring_243; + case 20: + return globalstring_244; + case 21: + return globalstring_245; + case 22: + return globalstring_246; + case 23: + return globalstring_247; + case 24: + return globalstring_248; + case 25: + return globalstring_249; + case 26: + return globalstring_250; + case 27: + return globalstring_251; + case 28: + return globalstring_252; + case 29: + return globalstring_253; + case 30: + return globalstring_254; + case 31: + return globalstring_255; + case 32: + return globalstring_256; + case 33: + return globalstring_257; + case 34: + return globalstring_258; + case 35: + return globalstring_259; + case 36: + return globalstring_260; + case 37: + return globalstring_261; + case 38: + return globalstring_262; + case 39: + return globalstring_263; + case 40: + return globalstring_264; + case 41: + return globalstring_265; + case 42: + return globalstring_266; + case 43: + return globalstring_267; + case 44: + return globalstring_268; + case 45: + return globalstring_269; + case 46: + return globalstring_270; + case 47: + return globalstring_271; + case 48: + return globalstring_272; + case 49: + return globalstring_273; + } + return ""; +} diff --git a/dumps/scripts/1639.cs2 b/dumps/scripts/1639.cs2 new file mode 100644 index 000000000..ded3f419b --- /dev/null +++ b/dumps/scripts/1639.cs2 @@ -0,0 +1,67 @@ +void script_1639() { + int stack_dump0; + int stack_dump1; + int stack_dump2; + string stack_dump3; + cs2func_script_1637_struct(2,0,0) structdump_4; + globalstring_224 = ""; + globalstring_225 = ""; + globalstring_226 = ""; + globalstring_227 = ""; + globalstring_228 = ""; + globalstring_229 = ""; + globalstring_230 = ""; + globalstring_231 = ""; + globalstring_232 = ""; + globalstring_233 = ""; + globalstring_234 = ""; + globalstring_235 = ""; + globalstring_236 = ""; + globalstring_237 = ""; + globalstring_238 = ""; + globalstring_239 = ""; + globalstring_240 = ""; + globalstring_241 = ""; + globalstring_242 = ""; + globalstring_243 = ""; + globalstring_244 = ""; + globalstring_245 = ""; + globalstring_246 = ""; + globalstring_247 = ""; + globalstring_248 = ""; + globalstring_249 = ""; + globalstring_250 = ""; + globalstring_251 = ""; + globalstring_252 = ""; + globalstring_253 = ""; + globalstring_254 = ""; + globalstring_255 = ""; + globalstring_256 = ""; + globalstring_257 = ""; + globalstring_258 = ""; + globalstring_259 = ""; + globalstring_260 = ""; + globalstring_261 = ""; + globalstring_262 = ""; + globalstring_263 = ""; + globalstring_264 = ""; + globalstring_265 = ""; + globalstring_266 = ""; + globalstring_267 = ""; + globalstring_268 = ""; + globalstring_269 = ""; + globalstring_270 = ""; + globalstring_271 = ""; + globalstring_272 = ""; + globalstring_273 = ""; + deleteAllExtraChilds(new WidgetPointer(632,15)); + stack_dump0 = 41418767; + stack_dump1 = 0; + stack_dump2 = 0; + stack_dump3 = "Loading..."; + structdump_4 = script_1637(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + stack_dump0 = structdump_4.intpart_0; + structdump_4.intpart_1; + stack_dump0; + return; +} diff --git a/dumps/scripts/164.cs2 b/dumps/scripts/164.cs2 new file mode 100644 index 000000000..718e7ffe4 --- /dev/null +++ b/dumps/scripts/164.cs2 @@ -0,0 +1,8 @@ +void script_164(int arg0,int arg1) { + if (script_166(arg1) == 7) { + setWidgetSprite(942, new WidgetPointer(arg0)); + return; + } + setWidgetSprite(941, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1640.cs2 b/dumps/scripts/1640.cs2 new file mode 100644 index 000000000..04135fcdb --- /dev/null +++ b/dumps/scripts/1640.cs2 @@ -0,0 +1,19 @@ +void script_1640(int arg0,int arg1,int arg2) { + int ivar3; + string svar0; + svar0 = globalstring_274; + ivar3 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (getMaxLineWidth(ivar3, arg2, svar0 + " ") > ivar3) { + while (getMaxLineWidth(2147483647, arg2, svar0 + "... ") > ivar3) { + svar0 = substr(0, subtract(strLength(svar0), 1), svar0); + } + svar0 = svar0 + "..."; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(arg1), globalstring_274, 25, 5000, "IIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg0), svar0); + return; +} diff --git a/dumps/scripts/1641.cs2 b/dumps/scripts/1641.cs2 new file mode 100644 index 000000000..d07b5c1fa --- /dev/null +++ b/dumps/scripts/1641.cs2 @@ -0,0 +1,3 @@ +int script_1641() { + return add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(bitconfig_6598, bitconfig_6599), bitconfig_6600), bitconfig_6601), bitconfig_6602), bitconfig_6603), bitconfig_6604), bitconfig_6605), bitconfig_6606), bitconfig_6607), bitconfig_6608), bitconfig_6609), bitconfig_1421), bitconfig_6611), bitconfig_6612), bitconfig_6613), bitconfig_6614), bitconfig_6615), bitconfig_6616), bitconfig_6617), bitconfig_6618), bitconfig_6619), bitconfig_6620); +} diff --git a/dumps/scripts/1642.cs2 b/dumps/scripts/1642.cs2 new file mode 100644 index 000000000..657255580 --- /dev/null +++ b/dumps/scripts/1642.cs2 @@ -0,0 +1,3 @@ +int script_1642() { + return 23; +} diff --git a/dumps/scripts/1643.cs2 b/dumps/scripts/1643.cs2 new file mode 100644 index 000000000..f8687d4f3 --- /dev/null +++ b/dumps/scripts/1643.cs2 @@ -0,0 +1,3 @@ +int script_1643() { + return add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(bitconfig_6622, bitconfig_6623), bitconfig_6624), bitconfig_6625), bitconfig_6626), bitconfig_6627), bitconfig_6650), bitconfig_6629), bitconfig_6630), bitconfig_6631), bitconfig_6632), bitconfig_6633), bitconfig_6634), bitconfig_6635), bitconfig_6636), bitconfig_6637); +} diff --git a/dumps/scripts/1644.cs2 b/dumps/scripts/1644.cs2 new file mode 100644 index 000000000..a31f8ce70 --- /dev/null +++ b/dumps/scripts/1644.cs2 @@ -0,0 +1,3 @@ +int script_1644() { + return 16; +} diff --git a/dumps/scripts/1645.cs2 b/dumps/scripts/1645.cs2 new file mode 100644 index 000000000..367d51c1e --- /dev/null +++ b/dumps/scripts/1645.cs2 @@ -0,0 +1,3 @@ +int script_1645() { + return add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(bitconfig_6639, bitconfig_6640), bitconfig_6641), bitconfig_6642), bitconfig_6643), bitconfig_6644), bitconfig_6645), bitconfig_6646), bitconfig_6647), bitconfig_6648), bitconfig_6649), bitconfig_6628), bitconfig_6651), bitconfig_6652), bitconfig_6653), bitconfig_6654), bitconfig_6655); +} diff --git a/dumps/scripts/1646.cs2 b/dumps/scripts/1646.cs2 new file mode 100644 index 000000000..677d184ef --- /dev/null +++ b/dumps/scripts/1646.cs2 @@ -0,0 +1,3 @@ +int script_1646() { + return 17; +} diff --git a/dumps/scripts/1647.cs2 b/dumps/scripts/1647.cs2 new file mode 100644 index 000000000..779b9a09d --- /dev/null +++ b/dumps/scripts/1647.cs2 @@ -0,0 +1,3 @@ +int script_1647() { + return add(add(add(add(bitconfig_6658, bitconfig_6659), bitconfig_6660), bitconfig_6661), bitconfig_6662); +} diff --git a/dumps/scripts/1648.cs2 b/dumps/scripts/1648.cs2 new file mode 100644 index 000000000..06e6d586a --- /dev/null +++ b/dumps/scripts/1648.cs2 @@ -0,0 +1,3 @@ +int script_1648() { + return 67; +} diff --git a/dumps/scripts/1649.cs2 b/dumps/scripts/1649.cs2 new file mode 100644 index 000000000..17def6fdf --- /dev/null +++ b/dumps/scripts/1649.cs2 @@ -0,0 +1,11 @@ +void script_1649(int arg0,int arg1) { + if (((boolean)arg1)) { + if (arg0 < 0) { + arg0 = 0; + } else { + arg0 = subtract(arg0, mod(arg0, 14)); + } + } + script_1651(arg0, 1); + return; +} diff --git a/dumps/scripts/165.cs2 b/dumps/scripts/165.cs2 new file mode 100644 index 000000000..4069d0dff --- /dev/null +++ b/dumps/scripts/165.cs2 @@ -0,0 +1,15 @@ +void script_165(int arg0,int arg1) { + int ivar2; + ivar2 = script_166(arg1); + if (ivar2 == 7) { + setWidgetSprite(833, new WidgetPointer(arg0)); + setWidgetRGB(new Color(255, 0, 0), cs2method_3408(105, 73, 688, arg1)); + } else if (ivar2 == 6) { + setWidgetSprite(834, new WidgetPointer(arg0)); + setWidgetRGB(new Color(0, 255, 0), cs2method_3408(105, 73, 688, arg1)); + } else { + setWidgetSprite(943, new WidgetPointer(arg0)); + setWidgetRGB(new Color(204, 204, 204), cs2method_3408(105, 73, 688, arg1)); + } + return; +} diff --git a/dumps/scripts/1650.cs2 b/dumps/scripts/1650.cs2 new file mode 100644 index 000000000..9422d378c --- /dev/null +++ b/dumps/scripts/1650.cs2 @@ -0,0 +1,25 @@ +void script_1650() { + if (((boolean)script_1653())) { + script_1652(0); + setWidgetIsHidden(true, new WidgetPointer(746,75)); + return; + } + if (globalint_41 != -1) { + setWidgetIsHidden(false, new WidgetPointer(746,75)); + } + if (globalint_1037 < 142) { + globalint_1037 = 142; + } else { + if (globalint_1037 > subtract(getWidgetActualHeight(new WidgetPointer(746,3)), 117)) { + script_1651(0, 1); + return; + } + } + setWidgetSize(519, globalint_1037, 0, 0, new WidgetPointer(746,73)); + setWidgetPosition(0, 23, 0, 2, new WidgetPointer(746,73)); + setWidgetPosition(0, subtract(getWidgetActualY(new WidgetPointer(746,73)), 94), 0, 0, new WidgetPointer(746,75)); + setWidgetPosition(0, subtract(getWidgetActualY(new WidgetPointer(746,73)), 69), 0, 0, new WidgetPointer(746,72)); + script_1301(8978491, 8978490); + script_84(); + return; +} diff --git a/dumps/scripts/1651.cs2 b/dumps/scripts/1651.cs2 new file mode 100644 index 000000000..fc59efff1 --- /dev/null +++ b/dumps/scripts/1651.cs2 @@ -0,0 +1,27 @@ +void script_1651(int arg0,int arg1) { + int ivar2; + if (((boolean)script_1653())) { + arg0 = subtract(getWidgetActualHeight(new WidgetPointer(746,3)), 172); + setWidgetIsHidden(true, new WidgetPointer(746,75)); + } else { + if (globalint_41 != -1) { + setWidgetIsHidden(false, new WidgetPointer(746,75)); + } + } + ivar2 = subtract(subtract(subtract(getWidgetActualHeight(new WidgetPointer(746,3)), 87), arg0), 30); + ivar2 = subtract(ivar2, mod(ivar2, 14)); + if (ivar2 < 142) { + ivar2 = 142; + } + globalint_7 = subtract(globalint_7, subtract(ivar2, getWidgetActualHeight(new WidgetPointer(746,73)))); + setWidgetSize(519, ivar2, 0, 0, new WidgetPointer(746,73)); + setWidgetPosition(0, 23, 0, 2, new WidgetPointer(746,73)); + if (((boolean)arg1)) { + globalint_1037 = ivar2; + } + setWidgetPosition(0, subtract(getWidgetActualY(new WidgetPointer(746,73)), 94), 0, 0, new WidgetPointer(746,75)); + setWidgetPosition(0, subtract(getWidgetActualY(new WidgetPointer(746,73)), 69), 0, 0, new WidgetPointer(746,72)); + script_1301(8978491, 8978490); + script_84(); + return; +} diff --git a/dumps/scripts/1652.cs2 b/dumps/scripts/1652.cs2 new file mode 100644 index 000000000..2998d5bf0 --- /dev/null +++ b/dumps/scripts/1652.cs2 @@ -0,0 +1,4 @@ +void script_1652(int arg0) { + script_1651(subtract(getWidgetActualHeight(new WidgetPointer(746,3)), 259), arg0); + return; +} diff --git a/dumps/scripts/1653.cs2 b/dumps/scripts/1653.cs2 new file mode 100644 index 000000000..a72126ef9 --- /dev/null +++ b/dumps/scripts/1653.cs2 @@ -0,0 +1,17 @@ +int script_1653() { + flow_0: + IF (isWidgetHidden(new WidgetPointer(752,8))) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (isWidgetHidden(new WidgetPointer(752,3)) || isWidgetHidden(new WidgetPointer(752,7))) + GOTO flow_3 + flow_2: + IF ((((isWidgetOpen(new WidgetPointer(752,13)) || isWidgetOpen(new WidgetPointer(752,12))) || isWidgetOpen(new WidgetPointer(752,11))) || isWidgetOpen(new WidgetPointer(752,10))) || isWidgetHidden(new WidgetPointer(137,0))) + GOTO flow_3 + GOTO flow_4 + flow_3: + return 1; + flow_4: + return 0; +} diff --git a/dumps/scripts/1654.cs2 b/dumps/scripts/1654.cs2 new file mode 100644 index 000000000..bfaf8bf14 --- /dev/null +++ b/dumps/scripts/1654.cs2 @@ -0,0 +1,7 @@ +void script_1654() { + if (globalint_193 <= getClientCycle()) { + globalint_193 = add(getClientCycle(), 10); + setScriptCallOnGameloop(1452, globalint_193, "i", new WidgetPointer(762,93)); + } + return; +} diff --git a/dumps/scripts/1655.cs2 b/dumps/scripts/1655.cs2 new file mode 100644 index 000000000..27b95681a --- /dev/null +++ b/dumps/scripts/1655.cs2 @@ -0,0 +1,4 @@ +void script_1655() { + script_1656(); + return; +} diff --git a/dumps/scripts/1656.cs2 b/dumps/scripts/1656.cs2 new file mode 100644 index 000000000..980a4b284 --- /dev/null +++ b/dumps/scripts/1656.cs2 @@ -0,0 +1,11 @@ +void script_1656() { + if (((boolean)bitconfig_6673)) { + setScriptCallOnClickContextMenu(29, "", new WidgetPointer(767,10)); + setWidgetIsHidden(true, new WidgetPointer(767,54)); + } else { + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(767,10)); + setWidgetIsHidden(false, new WidgetPointer(767,54)); + script_679(50266167); + } + return; +} diff --git a/dumps/scripts/1657.cs2 b/dumps/scripts/1657.cs2 new file mode 100644 index 000000000..042fed079 --- /dev/null +++ b/dumps/scripts/1657.cs2 @@ -0,0 +1,7 @@ +void script_1657(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_31(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + script_37(arg0, arg1, globalint_107, 1); + } + return; +} diff --git a/dumps/scripts/1658.cs2 b/dumps/scripts/1658.cs2 new file mode 100644 index 000000000..6a9913712 --- /dev/null +++ b/dumps/scripts/1658.cs2 @@ -0,0 +1,3 @@ +void script_1658() { + return; +} diff --git a/dumps/scripts/1659.cs2 b/dumps/scripts/1659.cs2 new file mode 100644 index 000000000..589d33d99 --- /dev/null +++ b/dumps/scripts/1659.cs2 @@ -0,0 +1,3 @@ +void script_1659() { + return; +} diff --git a/dumps/scripts/166.cs2 b/dumps/scripts/166.cs2 new file mode 100644 index 000000000..74c5e4586 --- /dev/null +++ b/dumps/scripts/166.cs2 @@ -0,0 +1,73 @@ +int script_166(int arg0) { + switch (arg0) { + case 1: + return bitconfig_3851; + case 2: + return bitconfig_3852; + case 3: + return bitconfig_3853; + case 4: + return bitconfig_3854; + case 5: + return bitconfig_3855; + case 6: + return bitconfig_3856; + case 7: + return bitconfig_3857; + case 8: + return bitconfig_3858; + case 9: + return bitconfig_3859; + case 10: + return bitconfig_3860; + case 11: + return bitconfig_3861; + case 12: + return bitconfig_3862; + case 13: + return bitconfig_3863; + case 14: + return bitconfig_3864; + case 15: + return bitconfig_3865; + case 16: + return bitconfig_3866; + case 17: + return bitconfig_3867; + case 18: + return bitconfig_3868; + case 19: + return bitconfig_3869; + case 20: + return bitconfig_3870; + case 22: + if (((boolean)bitconfig_5294)) { + return 7; + } + return 0; + case 23: + return bitconfig_3871; + case 24: + return bitconfig_3872; + case 25: + return bitconfig_3946; + case 26: + return bitconfig_4132; + case 27: + return bitconfig_4307; + case 28: + return bitconfig_4308; + case 29: + return bitconfig_4309; + case 30: + return bitconfig_5366; + case 31: + if (((boolean)bitconfig_5295)) { + return 7; + } + return 0; + case 33: + return bitconfig_6500; + } + return 0; +} diff --git a/dumps/scripts/1660.cs2 b/dumps/scripts/1660.cs2 new file mode 100644 index 000000000..3c7ecd308 --- /dev/null +++ b/dumps/scripts/1660.cs2 @@ -0,0 +1,4 @@ +void script_1660(int arg0,int arg1,int arg2) { + script_1661(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1661.cs2 b/dumps/scripts/1661.cs2 new file mode 100644 index 000000000..ecade1e90 --- /dev/null +++ b/dumps/scripts/1661.cs2 @@ -0,0 +1,14 @@ +void script_1661(int arg0,int arg1,int arg2) { + deleteAllExtraChilds(new WidgetPointer(arg2)); + if ((bitconfig_4895 != 3) || (standart_config_281 != 55)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg2)); + return; + } + createExtraChild(new WidgetPointer(arg2), 6, 0); + setWidgetModel(41760); + setWidgetAnimation(10221); + setWidgetSize(43, 43, 0, 0); + script_1663(arg0, arg1, arg2); + setScriptCallOnGameloop(1662, new WidgetPointer(arg0), arg1, new WidgetPointer(arg2), "IiI", new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/1662.cs2 b/dumps/scripts/1662.cs2 new file mode 100644 index 000000000..041e60446 --- /dev/null +++ b/dumps/scripts/1662.cs2 @@ -0,0 +1,6 @@ +void script_1662(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg2), 0)) { + script_1663(arg0, arg1, arg2); + } + return; +} diff --git a/dumps/scripts/1663.cs2 b/dumps/scripts/1663.cs2 new file mode 100644 index 000000000..f96575337 --- /dev/null +++ b/dumps/scripts/1663.cs2 @@ -0,0 +1,28 @@ +void script_1663(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1) && isWidgetHidden()) { + setWidgetHidden(0); + if (add(getWidgetActualY(), getWidgetActualHeight()) < cs2method2601(new WidgetPointer(arg0))) { + setWidget3DRotation(0, 0, 512, 1024, 0, 1500); + setWidgetPosition(0, getWidgetActualY(new WidgetPointer(arg0)), 1, 0); + return; + } + if (getWidgetActualY() >= add(cs2method2601(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0)))) { + setWidget3DRotation(0, 0, 512, 0, 0, 1500); + setWidgetPosition(0, subtract(add(getWidgetActualY(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0))), getWidgetActualHeight()), 1, 0); + return; + } + ivar3 = add(subtract(getWidgetActualY(), cs2method2601(new WidgetPointer(arg0))), getWidgetActualY(new WidgetPointer(arg0))); + if (ivar3 > subtract(getWidgetActualHeight(new WidgetPointer(arg2)), getWidgetActualHeight())) { + setWidget3DRotation(0, 0, 512, 256, 0, 1500); + setWidgetPosition(0, subtract(ivar3, getWidgetActualHeight()), 1, 0); + } else { + setWidget3DRotation(0, 0, 512, 768, 0, 1500); + setWidgetPosition(0, add(ivar3, getWidgetActualHeight()), 1, 0); + } + return; + } + setWidgetHidden(1); + return; +} diff --git a/dumps/scripts/1664.cs2 b/dumps/scripts/1664.cs2 new file mode 100644 index 000000000..cd814904f --- /dev/null +++ b/dumps/scripts/1664.cs2 @@ -0,0 +1,53 @@ +void script_1664(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int stack_dump0; + cs2func_script_1467_struct(2,0,0) structdump_1; + cs2func_script_1467_struct(2,0,0) structdump_2; + if (getClientCycle() < arg0) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(762,93)); + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = getItemContainerLength(95); + script_41(49938529); + stack_dump0 = bitconfig_4893; + structdump_1 = script_1467(stack_dump0); + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + while (ivar3 < ivar5) { + if (setWidgetRegister(new WidgetPointer(762,93), ivar3)) { + setWidgetHidden(1); + if (getItemIdInSlot(95, ivar3) != -1) { + script_1453(ivar3); + } else { + setItemOnWidgetMethod1200(-1, -1); + setWidgetNoOptions(); + } + } + ivar3 = add(ivar3, 1); + } + if (((boolean)bitconfig_4893)) { + if (globalint_5 == 11) { + globalstring_138 = globalstring_22; + } + script_1479(globalstring_138); + } else if (((boolean)bitconfig_4893)) { + script_1456(); + } else { + stack_dump0 = bitconfig_4893; + structdump_2 = script_1467(stack_dump0); + script_1457(structdump_2.intpart_0, structdump_2.intpart_1); + } + if ((bitconfig_4893 != 0) && ((boolean)globalint_188)) { + script_1474(); + } + script_1459(); + return; +} diff --git a/dumps/scripts/1665.cs2 b/dumps/scripts/1665.cs2 new file mode 100644 index 000000000..d2bd334bd --- /dev/null +++ b/dumps/scripts/1665.cs2 @@ -0,0 +1,35 @@ +void script_1665(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + ivar4 = 0; + ivar5 = 0; + if (((boolean)script_3287())) { + ivar4 = add(subtract(516, 439), 1); + ivar5 = subtract(516, ivar4); + } else { + ivar4 = subtract(add(subtract(516, 439), 1), 10); + ivar5 = subtract(subtract(516, 10), ivar4); + } + ivar6 = globalint_1038; + ivar7 = subtract(globalint_192, ivar6); + ivar8 = multiply(subtract(ivar4, ivar6), -1); + ivar9 = subtract(ivar7, subtract(439, 1)); + if (ivar9 > 0) { + ivar6 = add(ivar6, ivar9); + ivar7 = subtract(439, 1); + } else { + if (ivar8 > 0) { + ivar7 = add(ivar7, ivar8); + ivar6 = ivar4; + } + } + setWidgetText(new WidgetPointer(arg0), intToStr(ivar6)); + setWidgetText(new WidgetPointer(arg2), intToStr(ivar7)); + setWidgetText(new WidgetPointer(arg1), intToStr(ivar4)); + setWidgetText(new WidgetPointer(arg3), intToStr(ivar5)); + return; +} diff --git a/dumps/scripts/1666.cs2 b/dumps/scripts/1666.cs2 new file mode 100644 index 000000000..04652f430 --- /dev/null +++ b/dumps/scripts/1666.cs2 @@ -0,0 +1,4 @@ +void script_1666() { + cs2method5421(1, "kbase/view.ws?guid=controls_banks#memberspace"); + return; +} diff --git a/dumps/scripts/1667.cs2 b/dumps/scripts/1667.cs2 new file mode 100644 index 000000000..9fc46d8e8 --- /dev/null +++ b/dumps/scripts/1667.cs2 @@ -0,0 +1,16 @@ +void script_1667() { + int ivar0; + ivar0 = 0; + if (cs2method3701()) { + script_4310(); + if (((boolean)script_4292())) { + setWidgetIsHidden(true, new WidgetPointer(1096,279)); + setWidgetIsHidden(true, new WidgetPointer(1096,265)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,279)); + setWidgetIsHidden(false, new WidgetPointer(1096,265)); + } + } + script_4310(); + return; +} diff --git a/dumps/scripts/1668.cs2 b/dumps/scripts/1668.cs2 new file mode 100644 index 000000000..1adeefcdb --- /dev/null +++ b/dumps/scripts/1668.cs2 @@ -0,0 +1,17 @@ +string script_1668(int arg0) { + switch (arg0) { + case 1: + return "Herring"; + case 2: + return "Cod"; + case 3: + return "Bass"; + case 4: + return "Trout"; + case 5: + return "Pike"; + case 6: + return "Salmon"; + } + return "Fish"; +} diff --git a/dumps/scripts/1669.cs2 b/dumps/scripts/1669.cs2 new file mode 100644 index 000000000..07b08c83b --- /dev/null +++ b/dumps/scripts/1669.cs2 @@ -0,0 +1,7 @@ +void script_1669() { + setScriptCallOnItemContainerUpdate(2175, 93, 1, "Y", new WidgetPointer(920,0)); + setScriptCallOnConfigChange(2175, 1660, 1661, 1662, 1663, 1664, 5, "Y", new WidgetPointer(924,0)); + script_2174(); + script_2186(); + return; +} diff --git a/dumps/scripts/167.cs2 b/dumps/scripts/167.cs2 new file mode 100644 index 000000000..d8eb91117 --- /dev/null +++ b/dumps/scripts/167.cs2 @@ -0,0 +1,4 @@ +void script_167(int arg0,int arg1) { + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1670.cs2 b/dumps/scripts/1670.cs2 new file mode 100644 index 000000000..527b2dc41 --- /dev/null +++ b/dumps/scripts/1670.cs2 @@ -0,0 +1,32 @@ +void script_1670(int arg0,int arg1,int arg2,int arg3,string arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + if (arg0 != -1) { + if (getItemHashmapData(arg1, 599) > 0) { + setItemOnWidgetMethod1212(arg0, getItemHashmapData(arg1, 599)); + } else { + setItemOnWidgetMethod1212(arg0, 1); + } + cs2method1305(getItemName(arg1)); + setWidgetContextMenuOption(1, arg4); + setWidgetContextMenuOption(2, arg5); + setWidgetContextMenuOption(3, arg6); + setWidgetContextMenuOption(4, arg7); + setWidgetContextMenuOption(5, arg8); + setWidgetContextMenuOption(6, "Examine" + ""); + setWidgetContextMenuOption(7, arg9); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + } else { + setItemOnWidgetMethod1200(-1, 0); + cs2method1305(""); + setWidgetContextMenuOption(1, ""); + setWidgetContextMenuOption(2, ""); + setWidgetContextMenuOption(3, ""); + setWidgetContextMenuOption(4, ""); + setWidgetContextMenuOption(5, ""); + setWidgetContextMenuOption(6, ""); + setWidgetContextMenuOption(7, ""); + } + } + return; +} diff --git a/dumps/scripts/1671.cs2 b/dumps/scripts/1671.cs2 new file mode 100644 index 000000000..ca7e7e141 --- /dev/null +++ b/dumps/scripts/1671.cs2 @@ -0,0 +1,18 @@ +void script_1671(int arg0,int arg1) { + string svar0; + svar0 = "Empty display"; + switch (arg1) { + case 0: + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(81,40), svar0, 25, 180, "IIsii", new WidgetPointer(arg0)); + break; + case 1: + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(83,40), svar0, 25, 180, "IIsii", new WidgetPointer(arg0)); + break; + case 2: + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(80,52), svar0, 25, 180, "IIsii", new WidgetPointer(arg0)); + break; + case 3: + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(82,38), svar0, 25, 180, "IIsii", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1672.cs2 b/dumps/scripts/1672.cs2 new file mode 100644 index 000000000..ac7aa6645 --- /dev/null +++ b/dumps/scripts/1672.cs2 @@ -0,0 +1,5 @@ +void script_1672() { + script_1675(bitconfig_6768); + script_1673(); + return; +} diff --git a/dumps/scripts/1673.cs2 b/dumps/scripts/1673.cs2 new file mode 100644 index 000000000..23799e671 --- /dev/null +++ b/dumps/scripts/1673.cs2 @@ -0,0 +1,42 @@ +void script_1673() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int stack_dump0; + cs2func_script_1674_struct(2,0,0) structdump_1; + deleteAllExtraChilds(new WidgetPointer(84,20)); + deleteAllExtraChilds(new WidgetPointer(84,22)); + deleteAllExtraChilds(new WidgetPointer(84,21)); + ivar0 = 0; + ivar1 = 0; + ivar2 = 264; + ivar3 = 0; + setWidgetPosition(getWidgetActualX(new WidgetPointer(84,20)), ivar0, 0, 0, new WidgetPointer(84,20)); + stack_dump0 = bitconfig_6768; + structdump_1 = script_1674(stack_dump0); + ivar3 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + setWidgetScrollMax(0, ivar1, new WidgetPointer(84,22)); + cs2method2100(0, ivar3, new WidgetPointer(84,22)); + ivar1 = add(ivar1, 4); + if (ivar1 > ivar2) { + setWidgetSize(16, 4, 0, 1, new WidgetPointer(84,21)); + setWidgetSize(20, 4, 1, 1, new WidgetPointer(84,22)); + if (setWidgetRegister(new WidgetPointer(84,21), 0)) { + script_31(5505045, 5505046, 792, 789, 790, 791, 773, 788); + } + script_72(5505045, 5505046, cs2method2601(new WidgetPointer(84,22))); + } else { + setWidgetSize(0, 4, 0, 1, new WidgetPointer(84,21)); + setWidgetSize(4, 4, 1, 1, new WidgetPointer(84,22)); + } + if (ivar1 < 111) { + setWidgetSize(350, add(111, 68), 0, 0, new WidgetPointer(84,0)); + } else if (ivar1 < ivar2) { + setWidgetSize(350, add(ivar1, 70), 0, 0, new WidgetPointer(84,0)); + } else { + setWidgetSize(350, add(ivar2, 70), 0, 0, new WidgetPointer(84,0)); + } + return; +} diff --git a/dumps/scripts/1674.cs2 b/dumps/scripts/1674.cs2 new file mode 100644 index 000000000..067a0b657 --- /dev/null +++ b/dumps/scripts/1674.cs2 @@ -0,0 +1,80 @@ +cs2func_script_1674_struct(2,0,0) script_1674(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + ivar1 = 836; + ivar2 = 1; + ivar3 = 2; + svar0 = ""; + ivar4 = 0; + ivar5 = 0; + svar0 = cs2method_3408(105, 115, ivar1, 0); + createExtraChild(new WidgetPointer(84,22), 5, 0); + setWidgetSize(17, 17, 0, 0); + setWidgetPosition(2, ivar3, 0, 0); + if (((boolean)arg0)) { + setWidgetSprite(699); + ivar4 = ivar3; + } else { + setWidgetSprite(697); + } + createExtraChild(new WidgetPointer(84,22), 4, 1); + setWidgetFont(494); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetTextAlignment(0, 1, 0); + setWidgetSize(23, 16, 1, 0); + setWidgetPosition(0, add(ivar3, 2), 2, 0); + setWidgetText(svar0); + createExtraChild(new WidgetPointer(84,22), 3, 2); + setWidgetSize(0, 17, 1, 0); + setWidgetPosition(0, ivar3, 1, 0); + cs2method2103(255); + setWidgetFilled(1); + if (arg0 != 0) { + setWidgetContextMenuOption(1, svar0); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16750623, "Iii"); + setScriptCallOnClickContextMenu(1676, -2147483644, 0, arg0, "iii"); + } + ivar3 = add(ivar3, getWidgetActualHeight()); + ivar5 = 1; + while (ivar2 < getCommonDefinitionSize(ivar1)) { + if (isBitFlagged(standart_config_617, subtract(ivar2, 1))) { + svar0 = cs2method_3408(105, 115, ivar1, ivar2); + createExtraChild(new WidgetPointer(84,22), 5, multiply(ivar5, 3)); + setWidgetSize(17, 17, 0, 0); + setWidgetPosition(2, ivar3, 0, 0); + if (ivar2 == arg0) { + setWidgetSprite(699); + ivar4 = ivar3; + } else { + setWidgetSprite(697); + } + createExtraChild(new WidgetPointer(84,22), 4, add(multiply(ivar5, 3), 1)); + setWidgetFont(494); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetTextAlignment(0, 1, 0); + setWidgetSize(23, 16, 1, 0); + setWidgetPosition(0, add(ivar3, 2), 2, 0); + setWidgetText(svar0); + createExtraChild(new WidgetPointer(84,22), 3, add(multiply(ivar5, 3), 2)); + setWidgetSize(0, 17, 1, 0); + setWidgetPosition(0, ivar3, 1, 0); + cs2method2103(255); + setWidgetFilled(1); + if (ivar2 != arg0) { + setWidgetContextMenuOption(1, svar0); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16750623, "Iii"); + setScriptCallOnClickContextMenu(1676, -2147483644, ivar2, arg0, "iii"); + } + ivar3 = add(ivar3, getWidgetActualHeight()); + ivar5 = add(ivar5, 1); + } + ivar2 = add(ivar2, 1); + } + return newstruct cs2func_script_1674_struct(ivar3, max(subtract(ivar4, 8), 0)); +} diff --git a/dumps/scripts/1675.cs2 b/dumps/scripts/1675.cs2 new file mode 100644 index 000000000..a31782ed6 --- /dev/null +++ b/dumps/scripts/1675.cs2 @@ -0,0 +1,8 @@ +void script_1675(int arg0) { + if (((boolean)arg0)) { + setWidgetModel(cs2method_3408(105, 109, 839, bitconfig_6764), new WidgetPointer(84,19)); + } else { + setWidgetModel(cs2method_3408(105, 109, 838, arg0), new WidgetPointer(84,19)); + } + return; +} diff --git a/dumps/scripts/1676.cs2 b/dumps/scripts/1676.cs2 new file mode 100644 index 000000000..4cb98e1c4 --- /dev/null +++ b/dumps/scripts/1676.cs2 @@ -0,0 +1,19 @@ +void script_1676(int arg0,int arg1,int arg2) { + int stack_dump0; + cs2func_script_1674_struct(2,0,0) structdump_1; + if (arg0 != 1) { + return; + } + if (arg1 == arg2) { + return; + } + script_1675(arg1); + bitconfig_6768 = arg1; + deleteAllExtraChilds(new WidgetPointer(84,22)); + stack_dump0 = arg1; + structdump_1 = script_1674(stack_dump0); + stack_dump0 = structdump_1.intpart_0; + structdump_1.intpart_1; + stack_dump0; + return; +} diff --git a/dumps/scripts/1677.cs2 b/dumps/scripts/1677.cs2 new file mode 100644 index 000000000..12aad19af --- /dev/null +++ b/dumps/scripts/1677.cs2 @@ -0,0 +1,15 @@ +void script_1677() { + setScriptCallOnGameloop(1688, "", new WidgetPointer(85,0)); + globalint_1046 = 0; + globalint_1045 = 0; + globalint_1051 = 0; + globalint_1048 = 0; + globalint_1049 = 255; + globalint_1044 = 0; + cs2method5405(0, 0); + cs2method5405(1, 0); + script_1678(); + cameraMethod5502(0, 0, 200, 200, 1, 0); + setScriptCallOnMinimapRelatedSetting3(1679, "", new WidgetPointer(85,0)); + return; +} diff --git a/dumps/scripts/1678.cs2 b/dumps/scripts/1678.cs2 new file mode 100644 index 000000000..dc381ba72 --- /dev/null +++ b/dumps/scripts/1678.cs2 @@ -0,0 +1,26 @@ +void script_1678() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = -1; + if (((boolean)cs2method5407(0))) { + ivar0 = subtract(extractX(getMyPositionHash()), mod(extractX(getMyPositionHash()), 64)); + ivar1 = subtract(extractY(getMyPositionHash()), mod(extractY(getMyPositionHash()), 64)); + ivar2 = addToCoordinate(0, ivar0, 0, ivar1); + cs2method5405(0, 5); + cs2method5405(1, 5); + cs2method5406(0, 0, addToCoordinate(ivar2, 51, 0, 39), 400, addToCoordinate(ivar2, 51, 0, 39), 400, 0); + cs2method5406(1, 0, addToCoordinate(ivar2, 50, 0, 25), 225, addToCoordinate(ivar2, 50, 0, 25), 225, 0); + cs2method5406(0, 1, addToCoordinate(ivar2, 51, 0, 29), 325, addToCoordinate(ivar2, 51, 0, 29), 225, 0); + cs2method5406(1, 1, addToCoordinate(ivar2, 50, 0, 19), 175, addToCoordinate(ivar2, 50, 0, 19), 175, 0); + cs2method5406(0, 2, addToCoordinate(ivar2, 57, 0, 23), 1200, addToCoordinate(ivar2, 57, 0, 23), 1200, 0); + cs2method5406(1, 2, addToCoordinate(ivar2, 47, 0, 18), 25, addToCoordinate(ivar2, 47, 0, 18), 25, 0); + cs2method5406(0, 3, addToCoordinate(ivar2, 46, 0, 5), 600, addToCoordinate(ivar2, 46, 0, 5), 600, 0); + cs2method5406(1, 3, addToCoordinate(ivar2, 46, 0, 16), 250, addToCoordinate(ivar2, 46, 0, 16), 250, 0); + cs2method5406(0, 4, addToCoordinate(ivar2, 41, 0, 27), 1125, addToCoordinate(ivar2, 41, 0, 27), 1125, 0); + cs2method5406(1, 4, addToCoordinate(ivar2, 44, 0, 19), 275, addToCoordinate(ivar2, 44, 0, 19), 275, 0); + } + return; +} diff --git a/dumps/scripts/1679.cs2 b/dumps/scripts/1679.cs2 new file mode 100644 index 000000000..61d337efd --- /dev/null +++ b/dumps/scripts/1679.cs2 @@ -0,0 +1,11 @@ +void script_1679() { + script_1678(); + switch (globalint_1044) { + case 0: + script_1687(); + break; + default: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(85,0)); + } + return; +} diff --git a/dumps/scripts/168.cs2 b/dumps/scripts/168.cs2 new file mode 100644 index 000000000..326d126a1 --- /dev/null +++ b/dumps/scripts/168.cs2 @@ -0,0 +1,63 @@ +void script_168() { + setWidgetSprite(-1, new WidgetPointer(559,86)); + setWidgetSprite(-1, new WidgetPointer(559,72)); + setWidgetSprite(-1, new WidgetPointer(559,73)); + setWidgetSprite(-1, new WidgetPointer(559,74)); + setWidgetSprite(-1, new WidgetPointer(559,75)); + setWidgetSprite(-1, new WidgetPointer(559,76)); + setWidgetSprite(-1, new WidgetPointer(559,77)); + setWidgetSprite(-1, new WidgetPointer(559,78)); + setWidgetSprite(-1, new WidgetPointer(559,79)); + setWidgetSprite(-1, new WidgetPointer(559,80)); + setWidgetSprite(-1, new WidgetPointer(559,81)); + setWidgetSprite(-1, new WidgetPointer(559,82)); + setWidgetSprite(-1, new WidgetPointer(559,83)); + setWidgetSprite(-1, new WidgetPointer(559,84)); + setWidgetSprite(-1, new WidgetPointer(559,85)); + if (((boolean)bitconfig_3801)) { + setWidgetSprite(442, new WidgetPointer(559,86)); + } + if (((boolean)bitconfig_3802)) { + setWidgetSprite(442, new WidgetPointer(559,72)); + } + if (((boolean)bitconfig_3803)) { + setWidgetSprite(442, new WidgetPointer(559,73)); + } + if (((boolean)bitconfig_3804)) { + setWidgetSprite(442, new WidgetPointer(559,74)); + } + if (((boolean)bitconfig_3805)) { + setWidgetSprite(442, new WidgetPointer(559,75)); + } + if (((boolean)bitconfig_3806)) { + setWidgetSprite(442, new WidgetPointer(559,76)); + } + if (((boolean)bitconfig_3807)) { + setWidgetSprite(442, new WidgetPointer(559,77)); + } + if (((boolean)bitconfig_3808)) { + setWidgetSprite(442, new WidgetPointer(559,78)); + } + if (((boolean)bitconfig_3809)) { + setWidgetSprite(442, new WidgetPointer(559,79)); + } + if (((boolean)bitconfig_3810)) { + setWidgetSprite(442, new WidgetPointer(559,80)); + } + if (((boolean)bitconfig_3811)) { + setWidgetSprite(442, new WidgetPointer(559,81)); + } + if (((boolean)bitconfig_3812)) { + setWidgetSprite(442, new WidgetPointer(559,82)); + } + if (((boolean)bitconfig_3813)) { + setWidgetSprite(442, new WidgetPointer(559,83)); + } + if (((boolean)bitconfig_3814)) { + setWidgetSprite(442, new WidgetPointer(559,84)); + } + if (((boolean)bitconfig_3815)) { + setWidgetSprite(442, new WidgetPointer(559,85)); + } + return; +} diff --git a/dumps/scripts/1680.cs2 b/dumps/scripts/1680.cs2 new file mode 100644 index 000000000..32d6333f6 --- /dev/null +++ b/dumps/scripts/1680.cs2 @@ -0,0 +1,5 @@ +void script_1680() { + script_1678(); + script_1687(); + return; +} diff --git a/dumps/scripts/1681.cs2 b/dumps/scripts/1681.cs2 new file mode 100644 index 000000000..1d2505811 --- /dev/null +++ b/dumps/scripts/1681.cs2 @@ -0,0 +1,4 @@ +void script_1681() { + script_1680(); + return; +} diff --git a/dumps/scripts/1682.cs2 b/dumps/scripts/1682.cs2 new file mode 100644 index 000000000..bce94977c --- /dev/null +++ b/dumps/scripts/1682.cs2 @@ -0,0 +1,5 @@ +void script_1682() { + globalint_1044 = 0; + script_1680(); + return; +} diff --git a/dumps/scripts/1683.cs2 b/dumps/scripts/1683.cs2 new file mode 100644 index 000000000..b35de8bbb --- /dev/null +++ b/dumps/scripts/1683.cs2 @@ -0,0 +1,5 @@ +void script_1683() { + globalint_1044 = 1; + script_1680(); + return; +} diff --git a/dumps/scripts/1684.cs2 b/dumps/scripts/1684.cs2 new file mode 100644 index 000000000..13b011c75 --- /dev/null +++ b/dumps/scripts/1684.cs2 @@ -0,0 +1,5 @@ +void script_1684() { + globalint_1044 = 2; + script_1680(); + return; +} diff --git a/dumps/scripts/1685.cs2 b/dumps/scripts/1685.cs2 new file mode 100644 index 000000000..d7dd6af76 --- /dev/null +++ b/dumps/scripts/1685.cs2 @@ -0,0 +1,5 @@ +void script_1685() { + globalint_1044 = 3; + script_1680(); + return; +} diff --git a/dumps/scripts/1686.cs2 b/dumps/scripts/1686.cs2 new file mode 100644 index 000000000..762722b06 --- /dev/null +++ b/dumps/scripts/1686.cs2 @@ -0,0 +1,5 @@ +void script_1686() { + globalint_1044 = 4; + script_1680(); + return; +} diff --git a/dumps/scripts/1687.cs2 b/dumps/scripts/1687.cs2 new file mode 100644 index 000000000..0f3e8404f --- /dev/null +++ b/dumps/scripts/1687.cs2 @@ -0,0 +1,8 @@ +void script_1687() { + if (globalint_1044 < subtract(cs2method5407(0), 1)) { + globalint_1044 = add(globalint_1044, 1); + cameraMethod5502(0, globalint_1044, 200, 200, 1, globalint_1044); + setScriptCallOnMinimapRelatedSetting3(1679, "", new WidgetPointer(85,0)); + } + return; +} diff --git a/dumps/scripts/1688.cs2 b/dumps/scripts/1688.cs2 new file mode 100644 index 000000000..889e46f77 --- /dev/null +++ b/dumps/scripts/1688.cs2 @@ -0,0 +1,4 @@ +void script_1688() { + script_1689(); + return; +} diff --git a/dumps/scripts/1689.cs2 b/dumps/scripts/1689.cs2 new file mode 100644 index 000000000..e96d71361 --- /dev/null +++ b/dumps/scripts/1689.cs2 @@ -0,0 +1,33 @@ +void script_1689() { + globalint_1047 = add(globalint_1047, 1); + if (globalint_1047 >= subtract(2, 1)) { + globalint_1047 = 0; + if (((boolean)globalint_1045)) { + globalint_1046 = min(add(globalint_1046, 2), 255); + } else { + if (((boolean)globalint_1045)) { + globalint_1046 = max(subtract(globalint_1046, 2), 0); + } + } + cs2method2103(globalint_1046, new WidgetPointer(85,2)); + } + globalint_1050 = add(globalint_1050, 1); + if (globalint_1050 >= subtract(6, 1)) { + globalint_1050 = 0; + if (((boolean)globalint_1048)) { + globalint_1049 = min(add(globalint_1049, 1), 255); + if (globalint_1049 >= 255) { + globalint_1048 = 1; + } + } else { + if (((boolean)globalint_1048) && ((boolean)globalint_1051)) { + globalint_1049 = max(subtract(globalint_1049, 3), 192); + if (globalint_1049 <= 192) { + globalint_1048 = 0; + } + } + } + cs2method2103(globalint_1049, new WidgetPointer(85,1)); + } + return; +} diff --git a/dumps/scripts/169.cs2 b/dumps/scripts/169.cs2 new file mode 100644 index 000000000..3ed40ed6c --- /dev/null +++ b/dumps/scripts/169.cs2 @@ -0,0 +1,8 @@ +void script_169(int arg0,int arg1) { + if (bitconfig_3905 == arg0) { + setWidgetRGB(new Color(221, 80, 50), new WidgetPointer(arg1)); + } else { + setWidgetRGB(new Color(100, 80, 30), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1690.cs2 b/dumps/scripts/1690.cs2 new file mode 100644 index 000000000..f41329e2d --- /dev/null +++ b/dumps/scripts/1690.cs2 @@ -0,0 +1,4 @@ +void script_1690() { + cameraUnlock(); + return; +} diff --git a/dumps/scripts/1691.cs2 b/dumps/scripts/1691.cs2 new file mode 100644 index 000000000..d282d7593 --- /dev/null +++ b/dumps/scripts/1691.cs2 @@ -0,0 +1,59 @@ +void script_1691(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_1692_struct(2,0,0) structdump_3; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar2 = 0; + globalarray_0 = new int[96]; + ivar3 = 0; + ivar4 = 0; + ivar5 = -1; + while (((boolean)ivar4) && (ivar2 < 96)) { + ivar5 = cs2method_3408(105, 74, 845, ivar2); + if (ivar5 == 345) { + ivar4 = 1; + } else if (((boolean)script_1694(ivar2)) && (ivar5 != -1)) { + globalarray_0[ivar3] = ivar2; + ivar3 = add(ivar3, 1); + } else { + setWidgetHidden(1); + } + createExtraChild(new WidgetPointer(arg0), 3, ivar2); + ivar2 = add(ivar2, 1); + } + script_1693(0, 0, subtract(ivar3, 1)); + ivar6 = 0; + ivar7 = -1; + ivar2 = 0; + while (ivar2 < ivar3) { + if (setWidgetRegister(new WidgetPointer(arg0), globalarray_0[ivar2])) { + stack_dump0 = arg0; + stack_dump1 = ivar6; + stack_dump2 = globalarray_0[ivar2]; + structdump_3 = script_1692(stack_dump0, stack_dump1, stack_dump2); + ivar7 = structdump_3.intpart_1; + ivar6 = structdump_3.intpart_0; + } + ivar2 = add(ivar2, 1); + } + if (ivar6 <= getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } else { + if ((ivar7 != -1) && setWidgetRegister(new WidgetPointer(arg0), ivar7)) { + deleteExtraChild(); + } + setWidgetScrollMax(0, ivar6, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + script_31(arg1, arg0, 798, 795, 796, 797, 793, 794); + } + return; +} diff --git a/dumps/scripts/1692.cs2 b/dumps/scripts/1692.cs2 new file mode 100644 index 000000000..2130aaf64 --- /dev/null +++ b/dumps/scripts/1692.cs2 @@ -0,0 +1,71 @@ +cs2func_script_1692_struct(2,0,0) script_1692(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar0; + string svar1; + ivar3 = cs2method_3408(105, 74, 845, arg2); + svar0 = getOtherCommonData(ivar3, 925); + ivar4 = add(multiply(getLineCount(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 22), 495, svar0), 12), 5); + ivar5 = add(add(32, ivar4), 10); + setWidgetSize(0, ivar5, 1, 0); + setWidgetPosition(0, arg1, 1, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(255); + setScriptCallOnMouseEntered(2140, new WidgetPointer(-32768,3), -2147483643, 200, "Iii"); + setScriptCallOnMouseExit(2140, new WidgetPointer(-32768,3), -2147483643, 255, "Iii"); + setWidgetContextMenuOption(1, "Take"); + setWidgetContextMenuOption(10, "Examine"); + cs2method1305("" + getItemName(getOtherCommonData(ivar3, 813))); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(2, add(arg1, 4), 0, 0); + setItemOnWidgetMethod1205(getOtherCommonData(ivar3, 813), 1); + setWidgetBorderThickness(1); + setWidgetShadowColor(new Color(48, 32, 32)); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(2, add(arg1, 4), 2, 0); + setWidgetRGB(new Color(255, 240, 140)); + setWidgetTextAlignment(0, 1, 0); + setWidgetUnknownBoolean(true); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(add(36, 4), 12, 1, 0); + setWidgetPosition(2, add(add(arg1, 4), subtract(32, getWidgetActualHeight())), 2, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetTextAlignment(0, 1, 0); + setWidgetUnknownBoolean(true); + ivar6 = getOtherCommonData(ivar3, 923); + if (ivar6 != -1) { + setWidgetSize(add(36, 4), subtract(32, getWidgetActualHeight()), 1, 0); + setWidgetText(getOtherCommonData(ivar6, 845)); + } else { + setWidgetSize(add(36, 4), 32, 1, 0); + setWidgetHidden(1); + } + svar1 = getOtherCommonData(ivar3, 924); + if (getLineCount(getWidgetActualWidth(), 496, svar1) <= 1) { + setWidgetFont(496); + } else if (getLineCount(getWidgetActualWidth(), 495, svar1) <= 1) { + setWidgetFont(495); + } else { + setWidgetFont(494); + } + setWidgetText(svar1); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(22, ivar4, 1, 0); + setWidgetPosition(2, add(add(arg1, 32), 6), 0, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 240, 140)); + setWidgetTextAlignment(0, 1, 0); + setWidgetUnknownBoolean(true); + setWidgetText(svar0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 32, 1, 0); + setWidgetPosition(0, subtract(add(arg1, ivar5), 16), 0, 0); + setWidgetSprite(995); + cs2method1107(1); + return newstruct cs2func_script_1692_struct(add(arg1, ivar5), getWidgetCustomChildArrayIndex()); +} diff --git a/dumps/scripts/1693.cs2 b/dumps/scripts/1693.cs2 new file mode 100644 index 000000000..bbf191e7f --- /dev/null +++ b/dumps/scripts/1693.cs2 @@ -0,0 +1,60 @@ +void script_1693(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + string svar1; + ivar3 = divide(add(arg1, arg2), 2); + ivar4 = globalarray_0[ivar3]; + globalarray_0[ivar3] = globalarray_0[arg2]; + globalarray_0[arg2] = ivar4; + ivar5 = arg1; + ivar6 = arg1; + ivar7 = 0; + svar0 = ""; + svar1 = ""; + ivar8 = -1; + while (ivar6 < arg2) { + ivar8 = cs2method_3408(105, 74, 845, globalarray_0[ivar6]); + if (ivar8 != -1) { + ivar8 = getOtherCommonData(ivar8, 923); + if (ivar8 != -1) { + svar0 = getOtherCommonData(ivar8, 846); + } else { + svar0 = ""; + } + } else { + svar0 = ""; + } + ivar8 = cs2method_3408(105, 74, 845, ivar4); + if (ivar8 != -1) { + ivar8 = getOtherCommonData(ivar8, 923); + if (ivar8 != -1) { + svar1 = getOtherCommonData(ivar8, 846); + } else { + svar1 = ""; + } + } else { + svar1 = ""; + } + if (stringMethod4107(svar0, svar1) < bitAnd(ivar6, 1)) { + ivar7 = globalarray_0[ivar6]; + globalarray_0[ivar6] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar7; + ivar5 = add(ivar5, 1); + } + ivar6 = add(ivar6, 1); + } + globalarray_0[arg2] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar4; + if (arg1 < subtract(ivar5, 1)) { + script_1693(0, arg1, subtract(ivar5, 1)); + } + if (add(ivar5, 1) < arg2) { + script_1693(0, add(ivar5, 1), arg2); + } + return; +} diff --git a/dumps/scripts/1694.cs2 b/dumps/scripts/1694.cs2 new file mode 100644 index 000000000..19682e57d --- /dev/null +++ b/dumps/scripts/1694.cs2 @@ -0,0 +1,12 @@ +int script_1694(int arg0) { + if (arg0 < 32) { + return isBitFlagged(globalint_1040, arg0); + } + if (arg0 < 64) { + return isBitFlagged(globalint_1041, mod(arg0, 32)); + } + if (arg0 < 96) { + return isBitFlagged(globalint_1042, mod(arg0, 32)); + } + return 0; +} diff --git a/dumps/scripts/1695.cs2 b/dumps/scripts/1695.cs2 new file mode 100644 index 000000000..78f923631 --- /dev/null +++ b/dumps/scripts/1695.cs2 @@ -0,0 +1,45 @@ +int script_1695(int arg0) { + switch (arg0) { + case 0: + if (bitconfig_6852 > 0) { + return 4; + } + if (bitconfig_6847 > 0) { + return 1; + } + return 0; + case 2: + if (bitconfig_6853 > 0) { + return 4; + } + if (bitconfig_6848 > 0) { + return 1; + } + return 0; + case 1: + if (bitconfig_6854 > 0) { + return 4; + } + if (bitconfig_6849 > 0) { + return 1; + } + return 0; + case 4: + if (bitconfig_6855 > 0) { + return 4; + } + if (bitconfig_6850 > 0) { + return 1; + } + return 0; + case 6: + if (bitconfig_6856 > 0) { + return 4; + } + if (bitconfig_6851 > 0) { + return 1; + } + return 0; + } + return 0; +} diff --git a/dumps/scripts/1696.cs2 b/dumps/scripts/1696.cs2 new file mode 100644 index 000000000..8d24cb8aa --- /dev/null +++ b/dumps/scripts/1696.cs2 @@ -0,0 +1,45 @@ +int script_1696(int arg0) { + switch (arg0) { + case 0: + if (bitconfig_6830 > 0) { + return 4; + } + if (bitconfig_6821 > 0) { + return 1; + } + return 0; + case 2: + if (bitconfig_6834 > 0) { + return 4; + } + if (bitconfig_6821 > 0) { + return 1; + } + return 0; + case 1: + if (bitconfig_6833 > 0) { + return 4; + } + if (((bitconfig_6821 > 0) || (bitconfig_6822 > 0)) || (bitconfig_6823 > 0)) { + return 1; + } + return 0; + case 4: + if (bitconfig_6831 > 0) { + return 4; + } + if (bitconfig_6822 > 0) { + return 1; + } + return 0; + case 6: + if (bitconfig_6832 > 0) { + return 4; + } + if (bitconfig_6823 > 0) { + return 1; + } + return 0; + } + return 0; +} diff --git a/dumps/scripts/1697.cs2 b/dumps/scripts/1697.cs2 new file mode 100644 index 000000000..39155ba6e --- /dev/null +++ b/dumps/scripts/1697.cs2 @@ -0,0 +1,15 @@ +int script_1697(int arg0) { + switch (arg0) { + case 0: + return subtract(bitconfig_6857, 30); + case 2: + return subtract(bitconfig_6858, 30); + case 1: + return subtract(bitconfig_6859, 30); + case 4: + return subtract(bitconfig_6860, 30); + case 6: + return subtract(bitconfig_6861, 30); + } + return 0; +} diff --git a/dumps/scripts/1698.cs2 b/dumps/scripts/1698.cs2 new file mode 100644 index 000000000..0dd48ad2b --- /dev/null +++ b/dumps/scripts/1698.cs2 @@ -0,0 +1,27 @@ +void script_1698() { + string svar0; + setScriptCallOnConfigChange(1699, 1583, 1584, 1582, 1395, 4, "Y", new WidgetPointer(271,9)); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(271,8)), getWidgetActualHeight(new WidgetPointer(271,8)), new WidgetPointer(271,5)); + setScriptCallOnClickContextMenu(1701, "", new WidgetPointer(271,12)); + svar0 = "This is the effect that prayers and curses have during combat. It includes curses that have used against you. The adjustment has no effect outside of combat. The percentage shown is relative to your skill level and may vary depending on the enemy you are fighting, and the prayers or curses used. Partial percentages are not shown."; + if (((boolean)globalint_1052)) { + setWidgetSize(16384, 63, 2, 0, new WidgetPointer(271,9)); + setWidgetSize(16384, add(63, getWidgetActualHeight(new WidgetPointer(271,0))), 2, 1, new WidgetPointer(271,5)); + setWidgetSize(16, add(add(63, getWidgetActualHeight(new WidgetPointer(271,0))), 2), 0, 1, new WidgetPointer(271,6)); + setWidgetIsHidden(false, new WidgetPointer(271,24)); + script_1700(); + script_1704(); + setScriptCallOnMouseOver(38, new WidgetPointer(271,13), new WidgetPointer(271,49), svar0, 25, 190, "IIsii", new WidgetPointer(271,13)); + setScriptCallOnMouseExit(40, new WidgetPointer(271,49), "I", new WidgetPointer(271,13)); + } else { + setWidgetSize(16384, 19, 2, 0, new WidgetPointer(271,9)); + setWidgetSize(16384, add(19, getWidgetActualHeight(new WidgetPointer(271,0))), 2, 1, new WidgetPointer(271,5)); + setWidgetSize(16, add(add(19, getWidgetActualHeight(new WidgetPointer(271,0))), 2), 0, 1, new WidgetPointer(271,6)); + setWidgetIsHidden(true, new WidgetPointer(271,24)); + script_1700(); + script_1704(); + setScriptCallOnMouseOver(-1, "", new WidgetPointer(271,13)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(271,13)); + } + return; +} diff --git a/dumps/scripts/1699.cs2 b/dumps/scripts/1699.cs2 new file mode 100644 index 000000000..779d65719 --- /dev/null +++ b/dumps/scripts/1699.cs2 @@ -0,0 +1,5 @@ +void script_1699() { + script_1706(); + script_1704(); + return; +} diff --git a/dumps/scripts/17.cs2 b/dumps/scripts/17.cs2 new file mode 100644 index 000000000..9bb3c0bc2 --- /dev/null +++ b/dumps/scripts/17.cs2 @@ -0,0 +1,7 @@ +void script_17(int arg0) { + setWidgetBorderThickness(2, new WidgetPointer(arg0)); + if (bitAnd(cs2method2800(new WidgetPointer(arg0)), 32) != 0) { + script_71(4); + } + return; +} diff --git a/dumps/scripts/170.cs2 b/dumps/scripts/170.cs2 new file mode 100644 index 000000000..8e14f6e69 --- /dev/null +++ b/dumps/scripts/170.cs2 @@ -0,0 +1,14 @@ +void script_170() { + if (((boolean)bitconfig_3905)) { + setWidgetText(new WidgetPointer(588,7), intToStr(bitconfig_3901) + "/5"); + } else if (bitconfig_3905 == 2) { + setWidgetText(new WidgetPointer(588,7), intToStr(bitconfig_3902) + "/5"); + } else if (bitconfig_3905 == 3) { + setWidgetText(new WidgetPointer(588,7), intToStr(bitconfig_3903) + "/5"); + } else { + if (bitconfig_3905 == 4) { + setWidgetText(new WidgetPointer(588,7), intToStr(bitconfig_3904) + "/5"); + } + } + return; +} diff --git a/dumps/scripts/1700.cs2 b/dumps/scripts/1700.cs2 new file mode 100644 index 000000000..764256925 --- /dev/null +++ b/dumps/scripts/1700.cs2 @@ -0,0 +1,10 @@ +void script_1700() { + if (((boolean)globalint_1052)) { + setWidgetText(new WidgetPointer(271,12), "Hide stat adjustments."); + setWidgetContextMenuOption(1, new WidgetPointer(271,12), "Hide stat adjustments"); + } else { + setWidgetText(new WidgetPointer(271,12), "Show stat adjustments."); + setWidgetContextMenuOption(1, new WidgetPointer(271,12), "Show stat adjustments"); + } + return; +} diff --git a/dumps/scripts/1701.cs2 b/dumps/scripts/1701.cs2 new file mode 100644 index 000000000..d44ee7d61 --- /dev/null +++ b/dumps/scripts/1701.cs2 @@ -0,0 +1,12 @@ +void script_1701() { + if (((boolean)globalint_1052)) { + playSoundEffect(8123, 1, 0); + globalint_1052 = 0; + } else { + playSoundEffect(8096, 1, 0); + globalint_1052 = 1; + } + setScriptCallOnGameloop(1702, 0, "i", new WidgetPointer(271,9)); + script_1700(); + return; +} diff --git a/dumps/scripts/1702.cs2 b/dumps/scripts/1702.cs2 new file mode 100644 index 000000000..ce7cf9d57 --- /dev/null +++ b/dumps/scripts/1702.cs2 @@ -0,0 +1,42 @@ +void script_1702(int arg0) { + int ivar1; + string svar0; + ivar1 = getWidgetActualHeight(new WidgetPointer(271,9)); + svar0 = "This is the effect that prayers and curses have during combat. It includes curses that have been used against you. The adjustment has no effect outside of combat. The percentage shown is relative to your skill level, and may vary depending on the enemy you are fighting, and the prayers or curses used. Partial percentages are not shown."; + if (arg0 >= 0) { + if (((boolean)globalint_1052)) { + if (ivar1 < 63) { + ivar1 = min(add(ivar1, 3), 63); + setScriptCallOnGameloop(1702, 0, "i", new WidgetPointer(271,9)); + setWidgetSize(16384, ivar1, 2, 0, new WidgetPointer(271,9)); + setWidgetSize(16384, add(ivar1, getWidgetActualHeight(new WidgetPointer(271,0))), 2, 1, new WidgetPointer(271,5)); + setWidgetSize(16, add(add(ivar1, getWidgetActualHeight(new WidgetPointer(271,0))), 2), 0, 1, new WidgetPointer(271,6)); + } + if (getWidgetActualHeight(new WidgetPointer(271,9)) >= 63) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(271,9)); + script_1704(); + setWidgetIsHidden(false, new WidgetPointer(271,24)); + setScriptCallOnMouseOver(38, new WidgetPointer(271,13), new WidgetPointer(271,49), svar0, 25, 190, "IIsii", new WidgetPointer(271,13)); + setScriptCallOnMouseExit(40, new WidgetPointer(271,49), "I", new WidgetPointer(271,13)); + } + } else { + if (ivar1 > 19) { + ivar1 = max(subtract(ivar1, 3), 19); + setScriptCallOnGameloop(1702, 0, "i", new WidgetPointer(271,9)); + setWidgetSize(16384, ivar1, 2, 0, new WidgetPointer(271,9)); + setWidgetSize(16384, add(ivar1, getWidgetActualHeight(new WidgetPointer(271,0))), 2, 1, new WidgetPointer(271,5)); + setWidgetSize(16, add(add(ivar1, getWidgetActualHeight(new WidgetPointer(271,0))), 2), 0, 1, new WidgetPointer(271,6)); + setScriptCallOnMouseOver(-1, "", new WidgetPointer(271,13)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(271,13)); + } + if (getWidgetActualHeight(new WidgetPointer(271,9)) <= 19) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(271,9)); + script_1704(); + setWidgetIsHidden(true, new WidgetPointer(271,24)); + } + } + } else { + setScriptCallOnGameloop(1702, add(arg0, 1), "i", new WidgetPointer(271,9)); + } + return; +} diff --git a/dumps/scripts/1703.cs2 b/dumps/scripts/1703.cs2 new file mode 100644 index 000000000..6a85b92d8 --- /dev/null +++ b/dumps/scripts/1703.cs2 @@ -0,0 +1,4 @@ +void script_1703() { + script_1704(); + return; +} diff --git a/dumps/scripts/1704.cs2 b/dumps/scripts/1704.cs2 new file mode 100644 index 000000000..b8dd2ca72 --- /dev/null +++ b/dumps/scripts/1704.cs2 @@ -0,0 +1,36 @@ +void script_1704() { + int ivar0; + ivar0 = 0; + if (((boolean)bitconfig_6840)) { + if (((boolean)globalint_1052)) { + if (((boolean)globalint_181)) { + deleteAllExtraChilds(new WidgetPointer(271,6)); + cs2method2100(0, 0, new WidgetPointer(271,5)); + ivar0 = 1; + } else { + if (((boolean)getExtraChildGap(new WidgetPointer(271,6)))) { + script_31(17760262, 17760261, 792, 789, 790, 791, 773, 788); + ivar0 = 1; + } + } + } else { + if (getExtraChildGap(new WidgetPointer(271,6)) != 0) { + deleteAllExtraChilds(new WidgetPointer(271,6)); + cs2method2100(0, 0, new WidgetPointer(271,5)); + ivar0 = 1; + } + } + } else { + if (getExtraChildGap(new WidgetPointer(271,6)) != 0) { + deleteAllExtraChilds(new WidgetPointer(271,6)); + cs2method2100(0, 0, new WidgetPointer(271,5)); + setWidgetSize(16384, add(19, getWidgetActualHeight(new WidgetPointer(271,0))), 2, 1, new WidgetPointer(271,5)); + ivar0 = 1; + } + } + if (((boolean)ivar0)) { + script_1237(17760264); + script_1293(17760263); + } + return; +} diff --git a/dumps/scripts/1705.cs2 b/dumps/scripts/1705.cs2 new file mode 100644 index 000000000..4b8f314a0 --- /dev/null +++ b/dumps/scripts/1705.cs2 @@ -0,0 +1,4 @@ +void script_1705() { + script_1706(); + return; +} diff --git a/dumps/scripts/1706.cs2 b/dumps/scripts/1706.cs2 new file mode 100644 index 000000000..746214690 --- /dev/null +++ b/dumps/scripts/1706.cs2 @@ -0,0 +1,41 @@ +void script_1706() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 10; + while ((ivar0 != -1) && (ivar2 > 0)) { + ivar1 = script_1708(ivar0); + if (setWidgetRegister(new WidgetPointer(script_1707(ivar0)))) { + if (ivar1 > 0) { + setWidgetRGB(new Color(50, 255, 50)); + setWidgetText(concat(concat(ivar1, "+"), "%")); + } else if (ivar1 < 0) { + setWidgetRGB(new Color(255, 50, 50)); + setWidgetText(concat(intToStr(ivar1), "%")); + } else { + setWidgetRGB(new Color(255, 152, 31)); + setWidgetText(concat(intToStr(ivar1), "%")); + } + } + switch (ivar0) { + case 0: + ivar0 = 2; + break; + case 2: + ivar0 = 1; + break; + case 1: + ivar0 = 4; + break; + case 4: + ivar0 = 6; + break; + case 6: + ivar0 = -1; + } + ivar2 = subtract(ivar2, 1); + } + return; +} diff --git a/dumps/scripts/1707.cs2 b/dumps/scripts/1707.cs2 new file mode 100644 index 000000000..e6690db55 --- /dev/null +++ b/dumps/scripts/1707.cs2 @@ -0,0 +1,15 @@ +int script_1707(int arg0) { + switch (arg0) { + case 0: + return 17760290; + case 2: + return 17760289; + case 1: + return 17760288; + case 4: + return 17760287; + case 6: + return 17760286; + } + return -1; +} diff --git a/dumps/scripts/1708.cs2 b/dumps/scripts/1708.cs2 new file mode 100644 index 000000000..93a3b0843 --- /dev/null +++ b/dumps/scripts/1708.cs2 @@ -0,0 +1,3 @@ +int script_1708(int arg0) { + return add(script_1709(arg0), script_1710(arg0)); +} diff --git a/dumps/scripts/1709.cs2 b/dumps/scripts/1709.cs2 new file mode 100644 index 000000000..6d0f1e28b --- /dev/null +++ b/dumps/scripts/1709.cs2 @@ -0,0 +1,147 @@ +int script_1709(int arg0) { + int ivar1; + ivar1 = 0; + switch (arg0) { + case 0: + if (((boolean)bitconfig_5944)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 5), 5); + } else { + ivar1 = add(ivar1, 5); + } + } else if (((boolean)bitconfig_5947)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 10), 5); + } else { + ivar1 = add(ivar1, 10); + } + } else { + if (((boolean)bitconfig_5953)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 15), 5); + } else { + ivar1 = add(ivar1, 15); + } + } + } + if (((boolean)bitconfig_5967)) { + ivar1 = add(ivar1, 15); + } + if (((boolean)bitconfig_5968)) { + ivar1 = add(ivar1, 20); + } + break; + case 2: + if (((boolean)bitconfig_5943)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 5), 5); + } else { + ivar1 = add(ivar1, 5); + } + } else if (((boolean)bitconfig_5946)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 10), 5); + } else { + ivar1 = add(ivar1, 10); + } + } else { + if (((boolean)bitconfig_5952)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 15), 5); + } else { + ivar1 = add(ivar1, 15); + } + } + } + if (((boolean)bitconfig_5967)) { + ivar1 = add(ivar1, 18); + } + if (((boolean)bitconfig_5968)) { + ivar1 = add(ivar1, 23); + } + break; + case 1: + if (((boolean)bitconfig_5942)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 5), 5); + } else { + ivar1 = add(ivar1, 5); + } + } else if (((boolean)bitconfig_5945)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 10), 5); + } else { + ivar1 = add(ivar1, 10); + } + } else if (((boolean)bitconfig_5951)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 15), 5); + } else { + ivar1 = add(ivar1, 15); + } + } else if (((boolean)bitconfig_7769)) { + ivar1 = add(ivar1, 25); + } else { + if (((boolean)bitconfig_7381)) { + ivar1 = add(ivar1, 25); + } + } + if (((boolean)bitconfig_5967)) { + ivar1 = add(ivar1, 20); + } + if (((boolean)bitconfig_5968)) { + ivar1 = add(ivar1, 25); + } + break; + case 4: + if (((boolean)bitconfig_5960)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 5), 5); + } else { + ivar1 = add(ivar1, 5); + } + } else if (((boolean)bitconfig_5962)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 10), 5); + } else { + ivar1 = add(ivar1, 10); + } + } else if (((boolean)bitconfig_5964)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 15), 5); + } else { + ivar1 = add(ivar1, 15); + } + } else { + if (((boolean)bitconfig_7381)) { + ivar1 = add(ivar1, 20); + } + } + break; + case 6: + if (((boolean)bitconfig_5961)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 5), 5); + } else { + ivar1 = add(ivar1, 5); + } + } else if (((boolean)bitconfig_5963)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 10), 5); + } else { + ivar1 = add(ivar1, 10); + } + } else if (((boolean)bitconfig_5965)) { + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = add(add(ivar1, 15), 5); + } else { + ivar1 = add(ivar1, 15); + } + } else { + if (((boolean)bitconfig_7769)) { + ivar1 = add(ivar1, 20); + } + } + } + return ivar1; +} diff --git a/dumps/scripts/171.cs2 b/dumps/scripts/171.cs2 new file mode 100644 index 000000000..71c615ec9 --- /dev/null +++ b/dumps/scripts/171.cs2 @@ -0,0 +1,36 @@ +void script_171() { + if (((boolean)globalint_40)) { + setWidgetText(new WidgetPointer(390,6), "Show riddle"); + setWidgetContextMenuOption(1, new WidgetPointer(390,6), "Show"); + setWidgetIsHidden(false, new WidgetPointer(390,7)); + setWidgetIsHidden(false, new WidgetPointer(390,8)); + setWidgetIsHidden(false, new WidgetPointer(390,9)); + setWidgetIsHidden(false, new WidgetPointer(390,10)); + setWidgetIsHidden(false, new WidgetPointer(390,11)); + setWidgetIsHidden(false, new WidgetPointer(390,12)); + setWidgetIsHidden(false, new WidgetPointer(390,13)); + setWidgetIsHidden(false, new WidgetPointer(390,14)); + setWidgetIsHidden(true, new WidgetPointer(390,3)); + setWidgetIsHidden(true, new WidgetPointer(390,5)); + globalint_40 = 1; + } else { + setWidgetText(new WidgetPointer(390,6), "Hide riddle"); + setWidgetContextMenuOption(1, new WidgetPointer(390,6), "Hide"); + setWidgetText(new WidgetPointer(390,18), "You seek the grail of old," + "
" + "but no longer is it a goblet of gold." + "
" + "Among these nine will you find what you seek," + "
" + "but be careful and don't peek!" + "
" + "A wrong choice will expel you," + "
" + "so consider carefully each clue." + "
" + "
" + "Three boxes contain only air," + "
" + "beware of three boxes, for danger lurks there." + "
" + "Two hold only rubbish but would fool you with disguise," + "
" + "only one box holds your prize." + "
" + "
" + "Clues will give the information you need," + "
" + "
" + "rubbish always sits to the right of danger, pay heed." + "
" + "There is nothing helpful in boxes great in height," + "
" + "and boxes on either end will not end your plight." + "
" + "A tall or small box will only bring you anger," + "
" + "but a square box will not put you in danger."); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(390,18)); + setWidgetIsHidden(true, new WidgetPointer(390,7)); + setWidgetIsHidden(true, new WidgetPointer(390,8)); + setWidgetIsHidden(true, new WidgetPointer(390,9)); + setWidgetIsHidden(true, new WidgetPointer(390,10)); + setWidgetIsHidden(true, new WidgetPointer(390,11)); + setWidgetIsHidden(true, new WidgetPointer(390,12)); + setWidgetIsHidden(true, new WidgetPointer(390,13)); + setWidgetIsHidden(true, new WidgetPointer(390,14)); + setWidgetIsHidden(false, new WidgetPointer(390,3)); + setWidgetIsHidden(false, new WidgetPointer(390,5)); + setWidgetScrollMax(190, 520, new WidgetPointer(390,19)); + script_31(25559045, 25559059, 792, 789, 790, 791, 773, 788); + globalint_40 = 0; + } + return; +} diff --git a/dumps/scripts/1710.cs2 b/dumps/scripts/1710.cs2 new file mode 100644 index 000000000..be447c71d --- /dev/null +++ b/dumps/scripts/1710.cs2 @@ -0,0 +1,20 @@ +int script_1710(int arg0) { + int ivar1; + ivar1 = script_1711(arg0); + if (bitconfig_6839 > 0) { + switch (arg0) { + case 0: + ivar1 = add(ivar1, 15); + ivar1 = add(ivar1, script_1714(arg0, bitconfig_6844)); + break; + case 2: + ivar1 = add(ivar1, 23); + ivar1 = add(ivar1, script_1714(arg0, bitconfig_6845)); + break; + case 1: + ivar1 = add(ivar1, 15); + ivar1 = add(ivar1, script_1714(arg0, bitconfig_6846)); + } + } + return ivar1; +} diff --git a/dumps/scripts/1711.cs2 b/dumps/scripts/1711.cs2 new file mode 100644 index 000000000..b6e728d00 --- /dev/null +++ b/dumps/scripts/1711.cs2 @@ -0,0 +1,41 @@ +int script_1711(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar1 = -25; + ivar2 = 15; + ivar3 = script_1695(arg0); + ivar4 = script_1696(arg0); + if (ivar3 == 4) { + ivar1 = subtract(0, 25); + } else { + if (((boolean)ivar3)) { + ivar1 = subtract(0, 20); + } + } + ivar5 = script_1714(arg0, script_1697(arg0)); + ivar6 = script_1713(arg0); + ivar7 = script_1712(arg0); + ivar8 = 0; + if (getItemIdInSlot(94, 2) == 19892) { + ivar8 = 5; + } + if ((ivar6 < add(ivar8, 5)) && (ivar4 == 4)) { + ivar6 = add(ivar8, 5); + } + if ((ivar7 < 10) && (ivar3 == 4)) { + if (add(ivar7, ivar5) > subtract(0, 10)) { + ivar7 = subtract(0, 10); + } + } else { + if (((ivar7 < 10) && ((boolean)ivar3)) && (add(ivar7, ivar5) > subtract(0, 10))) { + ivar7 = subtract(0, 10); + } + } + return min(max(add(add(ivar5, ivar6), ivar7), ivar1), ivar2); +} diff --git a/dumps/scripts/1712.cs2 b/dumps/scripts/1712.cs2 new file mode 100644 index 000000000..5af416e7b --- /dev/null +++ b/dumps/scripts/1712.cs2 @@ -0,0 +1,50 @@ +int script_1712(int arg0) { + int ivar1; + ivar1 = 0; + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = multiplyDivide(getSkillActualLvl(arg0), 100, 5); + } + switch (arg0) { + case 0: + if (bitconfig_6852 > 0) { + return subtract(0, script_1714(0, script_1718(0, add(10, ivar1)))); + } + if (bitconfig_6847 > 0) { + return subtract(0, script_1714(0, script_1718(0, add(10, ivar1)))); + } + return 0; + case 2: + if (bitconfig_6853 > 0) { + return subtract(0, script_1714(2, script_1718(2, add(10, ivar1)))); + } + if (bitconfig_6848 > 0) { + return subtract(0, script_1714(2, script_1718(2, add(10, ivar1)))); + } + return 0; + case 1: + if (bitconfig_6854 > 0) { + return subtract(0, script_1714(1, script_1718(1, add(10, ivar1)))); + } + if (bitconfig_6849 > 0) { + return subtract(0, script_1714(1, script_1718(1, add(10, ivar1)))); + } + return 0; + case 4: + if (bitconfig_6855 > 0) { + return subtract(0, script_1714(4, script_1718(4, add(10, ivar1)))); + } + if (bitconfig_6850 > 0) { + return subtract(0, script_1714(4, script_1718(4, add(10, ivar1)))); + } + return 0; + case 6: + if (bitconfig_6856 > 0) { + return subtract(0, script_1714(6, script_1718(0, add(10, ivar1)))); + } + if (bitconfig_6851 > 0) { + return subtract(0, script_1714(6, script_1718(0, add(10, ivar1)))); + } + return 0; + } + return 0; +} diff --git a/dumps/scripts/1713.cs2 b/dumps/scripts/1713.cs2 new file mode 100644 index 000000000..5a0ce1721 --- /dev/null +++ b/dumps/scripts/1713.cs2 @@ -0,0 +1,34 @@ +int script_1713(int arg0) { + int ivar1; + ivar1 = 0; + if (getItemIdInSlot(94, 2) == 19892) { + ivar1 = multiplyDivide(getSkillActualLvl(arg0), 100, 5); + } + switch (arg0) { + case 0: + if (((boolean)bitconfig_6830)) { + return script_1714(0, script_1718(0, add(ivar1, 5))); + } + break; + case 2: + if (((boolean)bitconfig_6834)) { + return script_1714(2, script_1718(2, add(ivar1, 5))); + } + break; + case 1: + if (((boolean)bitconfig_6833)) { + return script_1714(1, script_1718(1, add(ivar1, 5))); + } + break; + case 4: + if (((boolean)bitconfig_6831)) { + return script_1714(4, script_1718(4, add(ivar1, 5))); + } + break; + case 6: + if (((boolean)bitconfig_6832)) { + return script_1714(6, script_1718(6, add(ivar1, 5))); + } + } + return 0; +} diff --git a/dumps/scripts/1714.cs2 b/dumps/scripts/1714.cs2 new file mode 100644 index 000000000..45c27caf4 --- /dev/null +++ b/dumps/scripts/1714.cs2 @@ -0,0 +1,6 @@ +int script_1714(int arg0,int arg1) { + if (getSkillActualLvl(arg0) != 0) { + return divide(multiply(arg1, 100), getSkillActualLvl(arg0)); + } + return 0; +} diff --git a/dumps/scripts/1715.cs2 b/dumps/scripts/1715.cs2 new file mode 100644 index 000000000..dbf9958df --- /dev/null +++ b/dumps/scripts/1715.cs2 @@ -0,0 +1,39 @@ +void script_1715() { + int ivar0; + ivar0 = -1; + if (globalint_1043 == -1) { + return; + } + switch (globalint_1043) { + case 4761: + case 4762: + ivar0 = 1572874; + break; + case 4764: + case 4763: + ivar0 = 1572872; + break; + case 4765: + case 4766: + ivar0 = 1572873; + break; + case 4767: + case 4768: + ivar0 = 1572875; + break; + case 4770: + case 4769: + ivar0 = 1572876; + break; + case 4772: + case 4771: + ivar0 = 1572877; + } + if (ivar0 == -1) { + return; + } + setItemOnWidgetMethod2200(globalint_1043, -1, new WidgetPointer(ivar0)); + setWidget3DViewDistance(1600, new WidgetPointer(ivar0)); + setWidgetAnimation(12554, new WidgetPointer(ivar0)); + return; +} diff --git a/dumps/scripts/1716.cs2 b/dumps/scripts/1716.cs2 new file mode 100644 index 000000000..28b65354a --- /dev/null +++ b/dumps/scripts/1716.cs2 @@ -0,0 +1,7 @@ +void script_1716() { + if (globalint_1063 != bitconfig_6840) { + globalint_1063 = bitconfig_6840; + script_1717(); + } + return; +} diff --git a/dumps/scripts/1717.cs2 b/dumps/scripts/1717.cs2 new file mode 100644 index 000000000..aaf43779e --- /dev/null +++ b/dumps/scripts/1717.cs2 @@ -0,0 +1,24 @@ +void script_1717() { + if (((boolean)globalint_181)) { + deleteAllExtraChilds(new WidgetPointer(271,7)); + deleteAllExtraChilds(new WidgetPointer(271,8)); + setWidgetIsHidden(false, new WidgetPointer(271,42)); + setWidgetIsHidden(true, new WidgetPointer(271,0)); + script_1388(17760298); + script_1237(17760264); + setWidgetIsHidden(true, new WidgetPointer(271,9)); + deleteAllExtraChilds(new WidgetPointer(271,6)); + cs2method2100(0, 0, new WidgetPointer(271,5)); + setWidgetSize(16384, 16384, 2, 2, new WidgetPointer(271,5)); + } else { + deleteAllExtraChilds(new WidgetPointer(271,42)); + setWidgetIsHidden(true, new WidgetPointer(271,42)); + setWidgetIsHidden(false, new WidgetPointer(271,0)); + script_1237(17760264); + script_1293(17760263); + setWidgetIsHidden(false, new WidgetPointer(271,9)); + setWidgetSize(16384, add(getWidgetActualHeight(new WidgetPointer(271,9)), getWidgetActualHeight(new WidgetPointer(271,0))), 2, 1, new WidgetPointer(271,5)); + script_1704(); + } + return; +} diff --git a/dumps/scripts/1718.cs2 b/dumps/scripts/1718.cs2 new file mode 100644 index 000000000..7d5117ede --- /dev/null +++ b/dumps/scripts/1718.cs2 @@ -0,0 +1,3 @@ +int script_1718(int arg0,int arg1) { + return divide(multiply(getSkillActualLvl(arg0), arg1), 100); +} diff --git a/dumps/scripts/1719.cs2 b/dumps/scripts/1719.cs2 new file mode 100644 index 000000000..af7f8b8fe --- /dev/null +++ b/dumps/scripts/1719.cs2 @@ -0,0 +1,14 @@ +int script_1719() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_8136); + ivar0 = add(ivar0, bitconfig_8137); + ivar0 = add(ivar0, bitconfig_8138); + ivar0 = add(ivar0, bitconfig_8139); + ivar0 = add(ivar0, bitconfig_8140); + ivar0 = add(ivar0, bitconfig_8141); + ivar0 = add(ivar0, bitconfig_8145); + ivar0 = add(ivar0, bitconfig_8146); + ivar0 = add(ivar0, bitconfig_8148); + return ivar0; +} diff --git a/dumps/scripts/172.cs2 b/dumps/scripts/172.cs2 new file mode 100644 index 000000000..d4de81eaa --- /dev/null +++ b/dumps/scripts/172.cs2 @@ -0,0 +1,32 @@ +void script_172() { + globalint_12 = 0; + globalint_13 = 0; + globalint_14 = 0; + globalint_15 = 0; + globalint_16 = 0; + globalint_17 = 0; + globalint_18 = 0; + globalint_19 = 0; + globalint_20 = 0; + globalint_21 = 0; + globalint_22 = 0; + globalint_23 = 0; + globalint_24 = 0; + globalint_25 = 0; + globalint_26 = 0; + globalint_27 = 0; + globalint_28 = 0; + globalint_29 = 0; + globalint_30 = 0; + globalint_31 = 0; + globalint_32 = 0; + globalint_33 = 0; + globalint_34 = 0; + globalint_35 = 0; + globalint_36 = 0; + globalint_37 = 0; + globalint_38 = 0; + globalint_39 = 0; + globalint_212 = 0; + return; +} diff --git a/dumps/scripts/1720.cs2 b/dumps/scripts/1720.cs2 new file mode 100644 index 000000000..d2def7745 --- /dev/null +++ b/dumps/scripts/1720.cs2 @@ -0,0 +1,14 @@ +int script_1720() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1721.cs2 b/dumps/scripts/1721.cs2 new file mode 100644 index 000000000..f08edb0ee --- /dev/null +++ b/dumps/scripts/1721.cs2 @@ -0,0 +1,79 @@ +void script_1721() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + string svar0; + int stack_dump0; + cs2func_script_2791_struct(4,1,0) structdump_1; + ivar0 = 0; + ivar1 = 84; + ivar2 = 5; + ivar3 = 0; + ivar4 = 0; + ivar5 = 125; + ivar6 = 64; + ivar7 = 32; + ivar8 = 10; + ivar9 = -1; + ivar10 = 2200; + svar0 = ""; + ivar11 = 0; + ivar12 = -1; + ivar13 = 0; + if (((boolean)mod(getCommonDefinitionSize(869), ivar2))) { + ivar13 = multiply(divide(getCommonDefinitionSize(869), ivar2), ivar5); + } else { + ivar13 = add(multiply(divide(getCommonDefinitionSize(869), ivar2), ivar5), ivar5); + } + deleteAllExtraChilds(new WidgetPointer(88,22)); + deleteAllExtraChilds(new WidgetPointer(88,23)); + setWidgetScrollMax(multiply(ivar2, ivar1), ivar13, new WidgetPointer(88,21)); + while (ivar0 < getCommonDefinitionSize(869)) { + createExtraChild(new WidgetPointer(88,22), 6, ivar0); + setWidgetSize(ivar1, ivar5, 0, 0); + stack_dump0 = ivar0; + structdump_1 = script_2791(stack_dump0); + ivar12 = structdump_1.intpart_3; + ivar10 = structdump_1.intpart_2; + ivar11 = structdump_1.intpart_1; + svar0 = structdump_1.stringpart_0; + ivar9 = structdump_1.intpart_0; + setWidgetModel(ivar9); + setWidget3DRotation(1, 20, 5, 1950, 0, ivar10); + setWidgetPosition(multiply(ivar3, ivar1), multiply(ivar4, ivar5), 0, 0); + if (((boolean)ivar11)) { + setWidgetContextMenuOption(1, "Speak-to"); + setScriptCallOnMouseOver(1860, -2147483643, ivar12, "iA"); + setScriptCallOnMouseExit(2607, -2147483643, "i"); + } + createExtraChild(new WidgetPointer(88,23), 4, ivar0); + setWidgetSize(ivar6, ivar7, 0, 0); + setWidgetRGB(new Color(255, 153, 53)); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetText(svar0); + setWidgetTextAlignment(1, 1, 0); + setWidgetPosition(add(multiply(ivar3, ivar1), ivar8), add(multiply(ivar4, ivar5), ivar8), 0, 0); + ivar3 = add(ivar3, 1); + if (ivar3 >= ivar2) { + ivar3 = 0; + ivar4 = add(ivar4, 1); + } + ivar0 = add(ivar0, 1); + } + if (((boolean)cs2method2601(new WidgetPointer(88,22)))) { + script_31(5767188, 5767189, 792, 789, 790, 791, 773, 788); + } + return; +} diff --git a/dumps/scripts/1722.cs2 b/dumps/scripts/1722.cs2 new file mode 100644 index 000000000..572f2ac65 --- /dev/null +++ b/dumps/scripts/1722.cs2 @@ -0,0 +1,8 @@ +void script_1722(int arg0,int arg1,int arg2,int arg3,int arg4) { + arg4 = add(arg4, getClientCycle()); + if (setWidgetRegister(new WidgetPointer(arg0), arg1) || ((arg1 == -1) && setWidgetRegister(new WidgetPointer(arg0)))) { + setWidgetSprite(arg2); + setScriptCallOnGameloop(1723, new WidgetPointer(arg0), arg1, arg3, arg4, "Iidi"); + } + return; +} diff --git a/dumps/scripts/1723.cs2 b/dumps/scripts/1723.cs2 new file mode 100644 index 000000000..b76c3ea38 --- /dev/null +++ b/dumps/scripts/1723.cs2 @@ -0,0 +1,10 @@ +void script_1723(int arg0,int arg1,int arg2,int arg3) { + if (getClientCycle() < arg3) { + return; + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1) || ((arg1 == -1) && setWidgetRegister(new WidgetPointer(arg0)))) { + setWidgetSprite(arg2); + setScriptCallOnGameloop(-1, ""); + } + return; +} diff --git a/dumps/scripts/1724.cs2 b/dumps/scripts/1724.cs2 new file mode 100644 index 000000000..b08379df3 --- /dev/null +++ b/dumps/scripts/1724.cs2 @@ -0,0 +1,4 @@ +void script_1724(int arg0) { + script_1725(arg0); + return; +} diff --git a/dumps/scripts/1725.cs2 b/dumps/scripts/1725.cs2 new file mode 100644 index 000000000..d49225460 --- /dev/null +++ b/dumps/scripts/1725.cs2 @@ -0,0 +1,5 @@ +void script_1725(int arg0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setScriptCallOnGameloop(1726, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1726.cs2 b/dumps/scripts/1726.cs2 new file mode 100644 index 000000000..a32f5c73f --- /dev/null +++ b/dumps/scripts/1726.cs2 @@ -0,0 +1,13 @@ +void script_1726(int arg0) { + int ivar1; + ivar1 = 0; + if (mod(getClientCycle(), 40) > 20) { + cs2method2103(0, new WidgetPointer(arg0)); + if (mod(getClientCycle(), 40) == 21) { + playSoundEffect(5009, 1, 0); + } + } else { + cs2method2103(255, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1727.cs2 b/dumps/scripts/1727.cs2 new file mode 100644 index 000000000..e8e582c13 --- /dev/null +++ b/dumps/scripts/1727.cs2 @@ -0,0 +1,4 @@ +void script_1727(int arg0) { + script_1728(arg0); + return; +} diff --git a/dumps/scripts/1728.cs2 b/dumps/scripts/1728.cs2 new file mode 100644 index 000000000..1eba2352b --- /dev/null +++ b/dumps/scripts/1728.cs2 @@ -0,0 +1,5 @@ +void script_1728(int arg0) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + cs2method2103(0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1729.cs2 b/dumps/scripts/1729.cs2 new file mode 100644 index 000000000..7c55a9971 --- /dev/null +++ b/dumps/scripts/1729.cs2 @@ -0,0 +1,4 @@ +void script_1729(int arg0) { + script_1730(arg0, -1); + return; +} diff --git a/dumps/scripts/173.cs2 b/dumps/scripts/173.cs2 new file mode 100644 index 000000000..fcf2b6380 --- /dev/null +++ b/dumps/scripts/173.cs2 @@ -0,0 +1,5 @@ +void script_173(int arg0) { + globalint_42 = arg0; + script_178(); + return; +} diff --git a/dumps/scripts/1730.cs2 b/dumps/scripts/1730.cs2 new file mode 100644 index 000000000..577896eea --- /dev/null +++ b/dumps/scripts/1730.cs2 @@ -0,0 +1,20 @@ +void script_1730(int arg0,int arg1) { + flow_0: + IF (arg1 == -1) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (setWidgetRegister(new WidgetPointer(arg0))) + GOTO flow_3 + flow_2: + IF (setWidgetRegister(new WidgetPointer(arg0), arg1) && (globalint_198 != 1)) + GOTO flow_4 + GOTO flow_5 + flow_3: + flow_4: + setWidgetHidden(0); + globalint_198 = 1; + setScriptCallOnGameloop(2196, new WidgetPointer(arg0), arg1, getWidgetText(), "Iis"); + flow_5: + return; +} diff --git a/dumps/scripts/1731.cs2 b/dumps/scripts/1731.cs2 new file mode 100644 index 000000000..e4d658307 --- /dev/null +++ b/dumps/scripts/1731.cs2 @@ -0,0 +1,4 @@ +void script_1731(int arg0,string arg1) { + script_2197(arg0, -1, arg1); + return; +} diff --git a/dumps/scripts/1732.cs2 b/dumps/scripts/1732.cs2 new file mode 100644 index 000000000..5971725cc --- /dev/null +++ b/dumps/scripts/1732.cs2 @@ -0,0 +1,4 @@ +void script_1732(int arg0) { + globalint_198 = 0; + return; +} diff --git a/dumps/scripts/1733.cs2 b/dumps/scripts/1733.cs2 new file mode 100644 index 000000000..e1a1764d0 --- /dev/null +++ b/dumps/scripts/1733.cs2 @@ -0,0 +1,4 @@ +void script_1733(int arg0) { + globalint_198 = 0; + return; +} diff --git a/dumps/scripts/1734.cs2 b/dumps/scripts/1734.cs2 new file mode 100644 index 000000000..06ebbb04c --- /dev/null +++ b/dumps/scripts/1734.cs2 @@ -0,0 +1,4 @@ +void script_1734(int arg0,int arg1) { + script_1735(arg0, arg1); + return; +} diff --git a/dumps/scripts/1735.cs2 b/dumps/scripts/1735.cs2 new file mode 100644 index 000000000..54624d3b1 --- /dev/null +++ b/dumps/scripts/1735.cs2 @@ -0,0 +1,7 @@ +void script_1735(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetHidden(0); + setScriptCallOnGameloop(1736, new WidgetPointer(arg0), arg1, "Ii"); + } + return; +} diff --git a/dumps/scripts/1736.cs2 b/dumps/scripts/1736.cs2 new file mode 100644 index 000000000..c19510bff --- /dev/null +++ b/dumps/scripts/1736.cs2 @@ -0,0 +1,15 @@ +void script_1736(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (mod(getClientCycle(), 40) > 20) { + cs2method2103(0); + if (mod(getClientCycle(), 40) == 21) { + playSoundEffect(5009, 1, 0); + } + } else { + cs2method2103(255); + } + } + return; +} diff --git a/dumps/scripts/1737.cs2 b/dumps/scripts/1737.cs2 new file mode 100644 index 000000000..f36924996 --- /dev/null +++ b/dumps/scripts/1737.cs2 @@ -0,0 +1,4 @@ +void script_1737(int arg0,int arg1) { + script_1738(arg0, arg1); + return; +} diff --git a/dumps/scripts/1738.cs2 b/dumps/scripts/1738.cs2 new file mode 100644 index 000000000..3c0bfd2af --- /dev/null +++ b/dumps/scripts/1738.cs2 @@ -0,0 +1,7 @@ +void script_1738(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + cs2method2103(0); + setScriptCallOnGameloop(-1, ""); + } + return; +} diff --git a/dumps/scripts/1739.cs2 b/dumps/scripts/1739.cs2 new file mode 100644 index 000000000..a643c744a --- /dev/null +++ b/dumps/scripts/1739.cs2 @@ -0,0 +1,4 @@ +void script_1739(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + setScriptCallOnItemContainerUpdate(151, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg1, 1, "IviiiIsssssssssY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/174.cs2 b/dumps/scripts/174.cs2 new file mode 100644 index 000000000..dfebc7678 --- /dev/null +++ b/dumps/scripts/174.cs2 @@ -0,0 +1,7 @@ +void script_174(int arg0) { + if (globalint_42 == arg0) { + globalint_42 = -1; + script_178(); + } + return; +} diff --git a/dumps/scripts/1740.cs2 b/dumps/scripts/1740.cs2 new file mode 100644 index 000000000..0c4cabefb --- /dev/null +++ b/dumps/scripts/1740.cs2 @@ -0,0 +1,4 @@ +void script_1740(int arg0) { + script_1741(arg0); + return; +} diff --git a/dumps/scripts/1741.cs2 b/dumps/scripts/1741.cs2 new file mode 100644 index 000000000..60e6b9688 --- /dev/null +++ b/dumps/scripts/1741.cs2 @@ -0,0 +1,31 @@ +void script_1741(int arg0) { + if (((boolean)globalint_119)) { + setWidgetSprite(781, new WidgetPointer(750,6)); + setWidgetSprite(783, new WidgetPointer(750,3)); + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Turn run mode off"); + } else if (((boolean)globalint_119)) { + setWidgetSprite(1199, new WidgetPointer(750,6)); + setWidgetSprite(1210, new WidgetPointer(750,3)); + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Turn run mode on"); + } else if (globalint_119 == 3) { + setWidgetSprite(1794, new WidgetPointer(750,6)); + } else { + if (globalint_119 == 4) { + setWidgetSprite(1795, new WidgetPointer(750,6)); + } + } + if (getDisplayMode() >= 2) { + setWidgetSprite(1207, new WidgetPointer(arg0)); + setWidgetPosition(25, 1, 0, 0, new WidgetPointer(750,3)); + setWidgetPosition(25, 1, 0, 0, new WidgetPointer(750,4)); + setWidgetPosition(3, 15, 0, 0, new WidgetPointer(750,5)); + setWidgetPosition(31, 7, 0, 0, new WidgetPointer(750,6)); + } else { + setWidgetSprite(1206, new WidgetPointer(arg0)); + setWidgetPosition(1, 1, 0, 0, new WidgetPointer(750,3)); + setWidgetPosition(1, 1, 0, 0, new WidgetPointer(750,4)); + setWidgetPosition(29, 15, 0, 0, new WidgetPointer(750,5)); + setWidgetPosition(7, 7, 0, 0, new WidgetPointer(750,6)); + } + return; +} diff --git a/dumps/scripts/1742.cs2 b/dumps/scripts/1742.cs2 new file mode 100644 index 000000000..a6310a07e --- /dev/null +++ b/dumps/scripts/1742.cs2 @@ -0,0 +1,41 @@ +int script_1742(int arg0) { + switch (arg0) { + case 0: + return 48889880; + case 1: + return 48889987; + case 2: + return 48889881; + case 3: + return 48889882; + case 4: + return 48889883; + case 5: + return 48889884; + case 6: + return 48889885; + case 7: + return 48889886; + case 8: + return 48889887; + case 9: + return 48889888; + case 10: + return 48889889; + case 11: + return 48889890; + case 12: + return 48889891; + case 13: + return 48889892; + case 14: + return 48889893; + case 15: + return 48889894; + case 95: + return 48955400; + case 99: + return 48890032; + } + return -1; +} diff --git a/dumps/scripts/1743.cs2 b/dumps/scripts/1743.cs2 new file mode 100644 index 000000000..475fde77c --- /dev/null +++ b/dumps/scripts/1743.cs2 @@ -0,0 +1,11 @@ +int script_1743() { + int ivar0; + int ivar1; + ivar0 = getWidgetActualX(); + ivar1 = getWidgetParentId(); + while (ivar1 != -1) { + ivar0 = subtract(add(ivar0, getWidgetActualX(new WidgetPointer(ivar1))), cs2method2600(new WidgetPointer(ivar1))); + ivar1 = getWidgetParentId(new WidgetPointer(ivar1)); + } + return ivar0; +} diff --git a/dumps/scripts/1744.cs2 b/dumps/scripts/1744.cs2 new file mode 100644 index 000000000..53ac4f4bf --- /dev/null +++ b/dumps/scripts/1744.cs2 @@ -0,0 +1,11 @@ +int script_1744() { + int ivar0; + int ivar1; + ivar0 = getWidgetActualY(); + ivar1 = getWidgetParentId(); + while (ivar1 != -1) { + ivar0 = subtract(add(ivar0, getWidgetActualY(new WidgetPointer(ivar1))), cs2method2601(new WidgetPointer(ivar1))); + ivar1 = getWidgetParentId(new WidgetPointer(ivar1)); + } + return ivar0; +} diff --git a/dumps/scripts/1745.cs2 b/dumps/scripts/1745.cs2 new file mode 100644 index 000000000..7013d0af0 --- /dev/null +++ b/dumps/scripts/1745.cs2 @@ -0,0 +1,16 @@ +void script_1745() { + if (globalint_217 < 1) { + globalint_217 = add(globalint_217, 1); + return; + } + globalint_217 = 0; + if (((boolean)globalint_216)) { + globalint_215 = subtract(globalint_215, 9); + } else { + globalint_215 = add(globalint_215, 9); + } + globalint_215 = min(globalint_215, 255); + globalint_215 = max(globalint_215, 0); + cs2method2103(globalint_215, new WidgetPointer(680,2)); + return; +} diff --git a/dumps/scripts/1746.cs2 b/dumps/scripts/1746.cs2 new file mode 100644 index 000000000..9f1522809 --- /dev/null +++ b/dumps/scripts/1746.cs2 @@ -0,0 +1,11 @@ +void script_1746(int arg0,int arg1) { + if (globalint_228 > 2) { + setWidgetModel(15678, new WidgetPointer(arg0)); + setWidgetRGB(new Color(51, 255, 0), new WidgetPointer(arg1)); + } else { + setWidgetModel(15677, new WidgetPointer(arg0)); + setWidgetRGB(new Color(145, 0, 0), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_228)); + return; +} diff --git a/dumps/scripts/1747.cs2 b/dumps/scripts/1747.cs2 new file mode 100644 index 000000000..286ee0f01 --- /dev/null +++ b/dumps/scripts/1747.cs2 @@ -0,0 +1,11 @@ +void script_1747(int arg0,int arg1) { + if (globalint_229 > 2) { + setWidgetModel(15680, new WidgetPointer(arg0)); + setWidgetRGB(new Color(51, 255, 0), new WidgetPointer(arg1)); + } else { + setWidgetModel(15679, new WidgetPointer(arg0)); + setWidgetRGB(new Color(145, 0, 0), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_229)); + return; +} diff --git a/dumps/scripts/1748.cs2 b/dumps/scripts/1748.cs2 new file mode 100644 index 000000000..7dcfa58fc --- /dev/null +++ b/dumps/scripts/1748.cs2 @@ -0,0 +1,44 @@ +void script_1748(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13) { + int ivar14; + int ivar15; + int ivar16; + int ivar17; + ivar14 = script_718(globalint_1437); + ivar15 = script_718(globalint_1438); + ivar16 = script_715(ivar14, globalint_1439, ivar15, globalint_1440); + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetStringNode(718, script_4126(ivar16)); + setWidgetRGB(new Color(ivar16)); + } + if (setWidgetRegister(new WidgetPointer(arg8))) { + setWidgetStringNode(718, script_4126(ivar16)); + setWidgetRGB(new Color(ivar16)); + } + if (setWidgetRegister(new WidgetPointer(arg1))) { + setWidgetStringNode(718, script_4126(ivar14)); + setWidgetRGB(new Color(ivar14)); + } + if (setWidgetRegister(new WidgetPointer(arg2))) { + setWidgetStringNode(718, script_4126(ivar15)); + setWidgetRGB(new Color(ivar15)); + } + setWidgetModel(cs2method_3408(105, 109, 1595, divide(globalint_1449, 10)), new WidgetPointer(arg10)); + setWidgetModel(cs2method_3408(105, 109, 1595, mod(globalint_1449, 10)), new WidgetPointer(arg11)); + ivar17 = add(multiply(globalint_1437, globalint_1439), multiply(globalint_1438, globalint_1440)); + if (globalint_1449 < ivar17) { + setWidgetSprite(4567, new WidgetPointer(arg13)); + } else if (globalint_1449 > ivar17) { + setWidgetSprite(4568, new WidgetPointer(arg13)); + } else { + setWidgetSprite(4565, new WidgetPointer(arg13)); + playSoundEffect2False(3559, 1, 0, 255); + } + if (ivar16 == 65535) { + setWidgetSprite(4565, new WidgetPointer(arg12)); + playSoundEffect2False(3559, 1, 10, 255); + } else { + setWidgetSprite(4566, new WidgetPointer(arg12)); + } + script_2472(arg3, arg4, arg5, arg6, arg7, arg9, standart_config_850, standart_config_855, 1108); + return; +} diff --git a/dumps/scripts/1749.cs2 b/dumps/scripts/1749.cs2 new file mode 100644 index 000000000..a776a8ba9 --- /dev/null +++ b/dumps/scripts/1749.cs2 @@ -0,0 +1,11 @@ +void script_1749(int arg0,int arg1) { + if (globalint_230 > 2) { + setWidgetModel(15682, new WidgetPointer(arg0)); + setWidgetRGB(new Color(51, 255, 0), new WidgetPointer(arg1)); + } else { + setWidgetModel(15681, new WidgetPointer(arg0)); + setWidgetRGB(new Color(145, 0, 0), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_230)); + return; +} diff --git a/dumps/scripts/175.cs2 b/dumps/scripts/175.cs2 new file mode 100644 index 000000000..fd6c3f4a0 --- /dev/null +++ b/dumps/scripts/175.cs2 @@ -0,0 +1,76 @@ +void script_175(int arg0,int arg1) { + if (standart_config_281 < 1000) { + messageType0("You can't do this while in the tutorial."); + return; + } + switch (arg0) { + case 1: + if ((globalint_41 == arg1) && (getDisplayMode() >= 2)) { + globalint_41 = -1; + script_1364(); + } else if (globalint_41 == -1) { + globalint_41 = arg1; + script_1364(); + } else { + globalint_41 = arg1; + } + switch (arg1) { + case 0: + case 2: + globalint_1650 = 0; + globalint_1651 = 0; + cs2method5006(0); + globalstring_1 = ""; + globalint_1028 = 0; + script_1558(0); + break; + case 4: + globalint_1650 = 0; + globalint_1651 = 1; + cs2method5006(1); + globalstring_1 = ""; + globalint_1028 = 0; + script_1558(0); + break; + case 7: + globalint_1650 = 0; + globalint_1651 = 2; + cs2method5006(2); + globalstring_1 = ""; + globalint_1028 = 0; + script_1558(0); + } + script_181(globalint_41); + script_178(); + script_84(); + script_89(); + break; + case 2: + script_184(arg1, 0); + script_178(); + script_84(); + script_89(); + break; + case 3: + if ((arg1 == 3) && (getFriendlistSize() < 0)) { + messageType0("The friends list is still loading, your selection won't take effect immediately."); + } + script_184(arg1, 1); + script_178(); + script_84(); + script_89(); + break; + case 4: + script_184(arg1, 2); + script_178(); + script_84(); + script_89(); + break; + case 5: + script_184(arg1, 3); + script_178(); + script_84(); + script_89(); + } + return; +} diff --git a/dumps/scripts/1750.cs2 b/dumps/scripts/1750.cs2 new file mode 100644 index 000000000..d2299dd8d --- /dev/null +++ b/dumps/scripts/1750.cs2 @@ -0,0 +1,151 @@ +void script_1750() { + if (((boolean)bitconfig_2309)) { + setWidgetSprite(731, new WidgetPointer(464,32)); + } else { + setWidgetSprite(751, new WidgetPointer(464,32)); + } + if (((boolean)bitconfig_2310)) { + setWidgetSprite(729, new WidgetPointer(464,30)); + } else { + setWidgetSprite(749, new WidgetPointer(464,30)); + } + if (((boolean)bitconfig_2311)) { + setWidgetSprite(732, new WidgetPointer(464,33)); + } else { + setWidgetSprite(752, new WidgetPointer(464,33)); + } + if (((boolean)bitconfig_2312)) { + setWidgetSprite(730, new WidgetPointer(464,31)); + } else { + setWidgetSprite(750, new WidgetPointer(464,31)); + } + if (bitconfig_532 >= 7) { + setWidgetSprite(726, new WidgetPointer(464,24)); + setWidgetSprite(727, new WidgetPointer(464,25)); + } else { + setWidgetSprite(746, new WidgetPointer(464,24)); + setWidgetSprite(747, new WidgetPointer(464,25)); + } + if (((boolean)bitconfig_1367)) { + setWidgetSprite(725, new WidgetPointer(464,29)); + } else { + setWidgetSprite(745, new WidgetPointer(464,29)); + } + if (((boolean)bitconfig_1368)) { + setWidgetSprite(722, new WidgetPointer(464,26)); + } else { + setWidgetSprite(742, new WidgetPointer(464,26)); + } + if (((boolean)bitconfig_1369)) { + setWidgetSprite(723, new WidgetPointer(464,27)); + } else { + setWidgetSprite(743, new WidgetPointer(464,27)); + } + if (((boolean)bitconfig_1370)) { + setWidgetSprite(724, new WidgetPointer(464,28)); + } else { + setWidgetSprite(744, new WidgetPointer(464,28)); + } + if (((boolean)bitconfig_1371)) { + setWidgetSprite(728, new WidgetPointer(464,37)); + } else { + setWidgetSprite(748, new WidgetPointer(464,37)); + } + if (((boolean)bitconfig_1920)) { + setWidgetSprite(734, new WidgetPointer(464,35)); + } else { + setWidgetSprite(754, new WidgetPointer(464,35)); + } + if (((boolean)bitconfig_1921)) { + setWidgetSprite(733, new WidgetPointer(464,34)); + } else { + setWidgetSprite(753, new WidgetPointer(464,34)); + } + if (((boolean)bitconfig_2055)) { + setWidgetSprite(735, new WidgetPointer(464,38)); + } else { + setWidgetSprite(755, new WidgetPointer(464,38)); + } + if (((boolean)bitconfig_2787)) { + setWidgetSprite(736, new WidgetPointer(464,39)); + } else { + setWidgetSprite(756, new WidgetPointer(464,39)); + } + if (bitconfig_4075 == 12) { + setWidgetSprite(737, new WidgetPointer(464,36)); + } else { + setWidgetSprite(757, new WidgetPointer(464,36)); + } + if (((boolean)bitconfig_4202)) { + setWidgetSprite(738, new WidgetPointer(464,40)); + } else { + setWidgetSprite(758, new WidgetPointer(464,40)); + } + if (((boolean)bitconfig_4394)) { + setWidgetSprite(739, new WidgetPointer(464,41)); + } else { + setWidgetSprite(759, new WidgetPointer(464,41)); + } + if (((boolean)bitconfig_4476)) { + setWidgetSprite(0, new WidgetPointer(464,42)); + } else { + setWidgetSprite(5, new WidgetPointer(464,42)); + } + if (((boolean)bitconfig_4884)) { + setWidgetSprite(1416, new WidgetPointer(464,43)); + } else { + setWidgetSprite(1417, new WidgetPointer(464,43)); + } + if (((boolean)bitconfig_5490)) { + setWidgetSprite(1585, new WidgetPointer(464,44)); + } else { + setWidgetSprite(1588, new WidgetPointer(464,44)); + } + if (((boolean)bitconfig_5732)) { + setWidgetSprite(1587, new WidgetPointer(464,45)); + } else { + setWidgetSprite(1590, new WidgetPointer(464,45)); + } + if (((boolean)bitconfig_5641)) { + setWidgetSprite(1592, new WidgetPointer(464,46)); + } else { + setWidgetSprite(1593, new WidgetPointer(464,46)); + } + if ((bitconfig_6014 == 85) || (bitconfig_7322 == 18)) { + setWidgetSprite(1215, new WidgetPointer(464,47)); + } else { + setWidgetSprite(1742, new WidgetPointer(464,47)); + } + script_1626(); + if (((boolean)bitconfig_6936)) { + setWidgetSprite(2422, new WidgetPointer(464,48)); + } else { + setWidgetSprite(2423, new WidgetPointer(464,48)); + } + if (((boolean)bitconfig_6095)) { + setWidgetSprite(3757, new WidgetPointer(464,49)); + } else { + setWidgetSprite(3758, new WidgetPointer(464,49)); + } + if (bitconfig_8300 == 20) { + setWidgetSprite(3887, new WidgetPointer(464,50)); + } else { + setWidgetSprite(3889, new WidgetPointer(464,50)); + } + if (((boolean)bitconfig_8688)) { + setWidgetSprite(3888, new WidgetPointer(464,52)); + } else { + setWidgetSprite(4408, new WidgetPointer(464,52)); + } + if (bitconfig_8601 == 428) { + setWidgetSprite(4407, new WidgetPointer(464,51)); + } else { + setWidgetSprite(4409, new WidgetPointer(464,51)); + } + if (bitconfig_9198 == 60) { + setWidgetSprite(6559, new WidgetPointer(464,53)); + } else { + setWidgetSprite(6573, new WidgetPointer(464,53)); + } + return; +} diff --git a/dumps/scripts/1751.cs2 b/dumps/scripts/1751.cs2 new file mode 100644 index 000000000..81ef27e15 --- /dev/null +++ b/dumps/scripts/1751.cs2 @@ -0,0 +1,27 @@ +string script_1751(int arg0) { + int ivar1; + if (arg0 < 2) { + return "in a minute"; + } + ivar1 = divide(arg0, 60); + arg0 = mod(arg0, 60); + if (ivar1 > 1) { + if (arg0 > 1) { + return "in " + intToStr(ivar1) + " hours " + intToStr(arg0) + " minutes"; + } + if (((boolean)arg0)) { + return "in " + intToStr(ivar1) + " hours 1 minute"; + } + return "in " + intToStr(ivar1) + " hours"; + } + if (((boolean)ivar1)) { + if (arg0 > 1) { + return "in 1 hour " + intToStr(arg0) + " minutes"; + } + if (((boolean)arg0)) { + return "in 1 hour 1 minute"; + } + return "in 1 hour"; + } + return "in " + intToStr(arg0) + " minutes"; +} diff --git a/dumps/scripts/1752.cs2 b/dumps/scripts/1752.cs2 new file mode 100644 index 000000000..cd55a23cf --- /dev/null +++ b/dumps/scripts/1752.cs2 @@ -0,0 +1,11 @@ +void script_1752(int arg0,int arg1) { + if (globalint_223 > 0) { + setWidgetModel(15669, new WidgetPointer(arg0)); + setWidgetRGB(new Color(51, 255, 0), new WidgetPointer(arg1)); + } else { + setWidgetModel(15666, new WidgetPointer(arg0)); + setWidgetRGB(new Color(145, 0, 0), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_223)); + return; +} diff --git a/dumps/scripts/1753.cs2 b/dumps/scripts/1753.cs2 new file mode 100644 index 000000000..ff037d9c8 --- /dev/null +++ b/dumps/scripts/1753.cs2 @@ -0,0 +1,11 @@ +void script_1753(int arg0,int arg1) { + if (globalint_224 > 0) { + setWidgetModel(15704, new WidgetPointer(arg0)); + setWidgetRGB(new Color(51, 255, 0), new WidgetPointer(arg1)); + } else { + setWidgetModel(15703, new WidgetPointer(arg0)); + setWidgetRGB(new Color(145, 0, 0), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_224)); + return; +} diff --git a/dumps/scripts/1754.cs2 b/dumps/scripts/1754.cs2 new file mode 100644 index 000000000..3ab1acc69 --- /dev/null +++ b/dumps/scripts/1754.cs2 @@ -0,0 +1,11 @@ +void script_1754(int arg0,int arg1) { + if (globalint_226 > 4) { + setWidgetModel(15690, new WidgetPointer(arg0)); + setWidgetRGB(new Color(51, 255, 0), new WidgetPointer(arg1)); + } else { + setWidgetModel(15689, new WidgetPointer(arg0)); + setWidgetRGB(new Color(145, 0, 0), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_226)); + return; +} diff --git a/dumps/scripts/1755.cs2 b/dumps/scripts/1755.cs2 new file mode 100644 index 000000000..9abbda32a --- /dev/null +++ b/dumps/scripts/1755.cs2 @@ -0,0 +1,19 @@ +void script_1755(int arg0,int arg1) { + if (globalint_227 > 2) { + if (getItemIdInSlot(94, 0) == 8950) { + setWidgetModel(15700, new WidgetPointer(arg0)); + } else { + setWidgetModel(15674, new WidgetPointer(arg0)); + } + setWidgetRGB(new Color(51, 255, 0), new WidgetPointer(arg1)); + } else { + if (getItemIdInSlot(94, 0) == 8950) { + setWidgetModel(15699, new WidgetPointer(arg0)); + } else { + setWidgetModel(15673, new WidgetPointer(arg0)); + } + setWidgetRGB(new Color(145, 0, 0), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_227)); + return; +} diff --git a/dumps/scripts/1756.cs2 b/dumps/scripts/1756.cs2 new file mode 100644 index 000000000..f70c722c7 --- /dev/null +++ b/dumps/scripts/1756.cs2 @@ -0,0 +1,11 @@ +void script_1756(int arg0,int arg1) { + if (globalint_225 > 0) { + setWidgetModel(15667, new WidgetPointer(arg0)); + setWidgetRGB(new Color(51, 255, 0), new WidgetPointer(arg1)); + } else { + setWidgetModel(15659, new WidgetPointer(arg0)); + setWidgetRGB(new Color(145, 0, 0), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_225)); + return; +} diff --git a/dumps/scripts/1757.cs2 b/dumps/scripts/1757.cs2 new file mode 100644 index 000000000..ed2954a23 --- /dev/null +++ b/dumps/scripts/1757.cs2 @@ -0,0 +1,9 @@ +void script_1757(int arg0,int arg1) { + if (globalint_219 > 0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_219)); + return; +} diff --git a/dumps/scripts/1758.cs2 b/dumps/scripts/1758.cs2 new file mode 100644 index 000000000..4f7d05e24 --- /dev/null +++ b/dumps/scripts/1758.cs2 @@ -0,0 +1,9 @@ +void script_1758(int arg0,int arg1) { + if (globalint_218 > 0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_218)); + return; +} diff --git a/dumps/scripts/1759.cs2 b/dumps/scripts/1759.cs2 new file mode 100644 index 000000000..064fe66af --- /dev/null +++ b/dumps/scripts/1759.cs2 @@ -0,0 +1,9 @@ +void script_1759(int arg0,int arg1) { + if (globalint_220 > 0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg1), intToStr(globalint_220)); + return; +} diff --git a/dumps/scripts/176.cs2 b/dumps/scripts/176.cs2 new file mode 100644 index 000000000..f0dc8eee1 --- /dev/null +++ b/dumps/scripts/176.cs2 @@ -0,0 +1,5 @@ +void script_176(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_2732(arg0, arg1, standart_config_287, 4); + setScriptCallOnClickContextMenu(3417, -2147483644, arg1, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), "iiIIIIII", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1760.cs2 b/dumps/scripts/1760.cs2 new file mode 100644 index 000000000..06cb2e252 --- /dev/null +++ b/dumps/scripts/1760.cs2 @@ -0,0 +1,4 @@ +void script_1760(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(globalint_221)); + return; +} diff --git a/dumps/scripts/1761.cs2 b/dumps/scripts/1761.cs2 new file mode 100644 index 000000000..d32c18579 --- /dev/null +++ b/dumps/scripts/1761.cs2 @@ -0,0 +1,4 @@ +void script_1761(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(globalint_222)); + return; +} diff --git a/dumps/scripts/1762.cs2 b/dumps/scripts/1762.cs2 new file mode 100644 index 000000000..8f551a1b2 --- /dev/null +++ b/dumps/scripts/1762.cs2 @@ -0,0 +1,10 @@ +void script_1762(int arg0) { + if (globalint_231 > 6) { + setWidgetText(new WidgetPointer(arg0), "Time Left : " + intToStr(subtract(globalint_231, 5)) + " mins"); + } else if (globalint_231 == 6) { + setWidgetText(new WidgetPointer(arg0), "Time Left : 1 min"); + } else { + setWidgetText(new WidgetPointer(arg0), "Time Left : 0 mins"); + } + return; +} diff --git a/dumps/scripts/1763.cs2 b/dumps/scripts/1763.cs2 new file mode 100644 index 000000000..3fd72eb43 --- /dev/null +++ b/dumps/scripts/1763.cs2 @@ -0,0 +1,8 @@ +void script_1763() { + setWidgetText(new WidgetPointer(894,5), globalstring_197); + setWidgetText(new WidgetPointer(894,6), globalstring_198); + setWidgetText(new WidgetPointer(894,8), globalstring_199); + setWidgetText(new WidgetPointer(894,9), globalstring_200); + setWidgetText(new WidgetPointer(894,7), ""); + return; +} diff --git a/dumps/scripts/1764.cs2 b/dumps/scripts/1764.cs2 new file mode 100644 index 000000000..2b8ccb012 --- /dev/null +++ b/dumps/scripts/1764.cs2 @@ -0,0 +1,20 @@ +void script_1764(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = subtract(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg1))); + arg2 = max(arg2, 0); + arg2 = min(arg2, ivar4); + switch (arg3) { + case 0: + cs2method6019(multiplyDivide(arg2, ivar4, 255)); + script_1159(); + break; + case 1: + cs2method6018(multiplyDivide(arg2, ivar4, 127)); + script_1165(); + break; + case 2: + cs2method6020(multiplyDivide(arg2, ivar4, 127)); + script_1162(); + } + return; +} diff --git a/dumps/scripts/1765.cs2 b/dumps/scripts/1765.cs2 new file mode 100644 index 000000000..09b5289a1 --- /dev/null +++ b/dumps/scripts/1765.cs2 @@ -0,0 +1,4 @@ +void script_1765() { + script_1766(); + return; +} diff --git a/dumps/scripts/1766.cs2 b/dumps/scripts/1766.cs2 new file mode 100644 index 000000000..0d88a9f5c --- /dev/null +++ b/dumps/scripts/1766.cs2 @@ -0,0 +1,241 @@ +void script_1766() { + flow_0: + if (((boolean)globalint_232)) { + setWidgetSprite(1817, new WidgetPointer(548,138)); + setWidgetSprite(1817, new WidgetPointer(746,24)); + setWidgetContextMenuOption(1, new WidgetPointer(548,129), "Combat Styles"); + setWidgetContextMenuOption(1, new WidgetPointer(746,39), "Combat Styles"); + } else { + if (((boolean)globalint_232)) { + setWidgetSprite(7710, new WidgetPointer(548,138)); + setWidgetSprite(7710, new WidgetPointer(746,24)); + setWidgetContextMenuOption(1, new WidgetPointer(548,129), "Props"); + setWidgetContextMenuOption(1, new WidgetPointer(746,39), "Props"); + } + } + if (((boolean)globalint_822)) { + script_4089(); + setWidgetSprite(1820, new WidgetPointer(548,139)); + setWidgetSprite(1820, new WidgetPointer(746,131)); + setWidgetContextMenuOption(1, new WidgetPointer(548,130), "Task List"); + setWidgetContextMenuOption(1, new WidgetPointer(746,40), "Task List"); + } else if (((boolean)globalint_822)) { + setWidgetIsHidden(true, new WidgetPointer(746,130)); + setWidgetIsHidden(true, new WidgetPointer(548,137)); + setWidgetSprite(1812, new WidgetPointer(548,139)); + setWidgetSprite(1812, new WidgetPointer(746,131)); + setWidgetContextMenuOption(1, new WidgetPointer(548,130), "Camera"); + setWidgetContextMenuOption(1, new WidgetPointer(746,40), "Camera"); + } else { + if (globalint_822 == 2) { + setWidgetIsHidden(true, new WidgetPointer(746,130)); + setWidgetIsHidden(true, new WidgetPointer(548,137)); + setWidgetSprite(7709, new WidgetPointer(548,139)); + setWidgetSprite(7709, new WidgetPointer(746,131)); + setWidgetContextMenuOption(1, new WidgetPointer(548,130), "Spotlights"); + setWidgetContextMenuOption(1, new WidgetPointer(746,40), "Spotlights"); + } + } + SWITCH (globalint_233) { + case 1: + GOTO flow_11 + case 2: + GOTO flow_12 + case 4: + GOTO flow_13 + case 5: + GOTO flow_14 + } + setWidgetSprite(1818, new WidgetPointer(548,140)); + setWidgetSprite(1818, new WidgetPointer(746,25)); + setWidgetContextMenuOption(1, new WidgetPointer(548,131), "Stats"); + setWidgetContextMenuOption(1, new WidgetPointer(746,41), "Stats"); + GOTO flow_15 + flow_11: + setWidgetSprite(1815, new WidgetPointer(548,140)); + setWidgetSprite(1815, new WidgetPointer(746,25)); + setWidgetContextMenuOption(1, new WidgetPointer(548,131), "Squad Commands"); + setWidgetContextMenuOption(1, new WidgetPointer(746,41), "Squad Commands"); + GOTO flow_15 + flow_12: + setWidgetSprite(7708, new WidgetPointer(548,140)); + setWidgetSprite(7708, new WidgetPointer(746,25)); + setWidgetContextMenuOption(1, new WidgetPointer(548,131), "Sound Effects"); + setWidgetContextMenuOption(1, new WidgetPointer(746,41), "Sound Effects"); + GOTO flow_15 + flow_13: + setWidgetSprite(3248, new WidgetPointer(548,140)); + setWidgetSprite(3248, new WidgetPointer(746,25)); + setWidgetContextMenuOption(1, new WidgetPointer(548,131), "Turn Options"); + setWidgetContextMenuOption(1, new WidgetPointer(746,41), "Turn Options"); + GOTO flow_15 + flow_14: + setWidgetSprite(3248, new WidgetPointer(548,140)); + setWidgetSprite(3248, new WidgetPointer(746,25)); + setWidgetContextMenuOption(1, new WidgetPointer(548,131), "Command Options"); + setWidgetContextMenuOption(1, new WidgetPointer(746,41), "Command Options"); + flow_15: + SWITCH (globalint_234) { + case 1: + GOTO flow_16 + case 2: + GOTO flow_17 + case 3: + GOTO flow_18 + case 4: + GOTO flow_19 + case 5: + GOTO flow_20 + } + setWidgetSprite(1819, new WidgetPointer(548,141)); + setWidgetSprite(1819, new WidgetPointer(746,26)); + setWidgetContextMenuOption(1, new WidgetPointer(548,132), "Quest Journals"); + setWidgetContextMenuOption(1, new WidgetPointer(746,42), "Quest Journals"); + GOTO flow_21 + flow_16: + setWidgetSprite(1813, new WidgetPointer(548,141)); + setWidgetSprite(1813, new WidgetPointer(746,26)); + setWidgetContextMenuOption(1, new WidgetPointer(548,132), "Special Units"); + setWidgetContextMenuOption(1, new WidgetPointer(746,42), "Special Units"); + GOTO flow_21 + flow_17: + setWidgetSprite(3249, new WidgetPointer(548,141)); + setWidgetSprite(3249, new WidgetPointer(746,26)); + setWidgetContextMenuOption(1, new WidgetPointer(548,132), "Troop Details"); + setWidgetContextMenuOption(1, new WidgetPointer(746,42), "Troop Details"); + GOTO flow_21 + flow_18: + setWidgetSprite(3028, new WidgetPointer(548,141)); + setWidgetSprite(3028, new WidgetPointer(746,26)); + setWidgetContextMenuOption(1, new WidgetPointer(548,132), "Party organiser"); + setWidgetContextMenuOption(1, new WidgetPointer(746,42), "Party organiser"); + GOTO flow_21 + flow_19: + setWidgetSprite(1834, new WidgetPointer(548,141)); + setWidgetSprite(1834, new WidgetPointer(746,26)); + setWidgetContextMenuOption(1, new WidgetPointer(548,132), "Book"); + setWidgetContextMenuOption(1, new WidgetPointer(746,42), "Book"); + GOTO flow_21 + flow_20: + setWidgetSprite(7711, new WidgetPointer(548,141)); + setWidgetSprite(7711, new WidgetPointer(746,26)); + setWidgetContextMenuOption(1, new WidgetPointer(548,132), "Actors"); + setWidgetContextMenuOption(1, new WidgetPointer(746,42), "Actors"); + flow_21: + if (((boolean)globalint_235)) { + setWidgetSprite(1821, new WidgetPointer(548,142)); + setWidgetSprite(1821, new WidgetPointer(746,27)); + setWidgetContextMenuOption(1, new WidgetPointer(548,133), "Inventory"); + setWidgetContextMenuOption(1, new WidgetPointer(746,43), "Inventory"); + } else if (((boolean)globalint_235)) { + setWidgetSprite(1814, new WidgetPointer(548,142)); + setWidgetSprite(1814, new WidgetPointer(746,27)); + setWidgetContextMenuOption(1, new WidgetPointer(548,133), "My Squads"); + setWidgetContextMenuOption(1, new WidgetPointer(746,43), "My Squads"); + } else { + if (globalint_235 == 2) { + setWidgetSprite(3247, new WidgetPointer(548,142)); + setWidgetSprite(3247, new WidgetPointer(746,27)); + setWidgetContextMenuOption(1, new WidgetPointer(548,133), "Commands"); + setWidgetContextMenuOption(1, new WidgetPointer(746,43), "Commands"); + } + } + if (((boolean)globalint_236)) { + setWidgetSprite(1822, new WidgetPointer(548,143)); + setWidgetSprite(1822, new WidgetPointer(746,28)); + setWidgetContextMenuOption(1, new WidgetPointer(548,134), "Worn Equipment"); + setWidgetContextMenuOption(1, new WidgetPointer(746,44), "Worn Equipment"); + } else if (((boolean)globalint_236)) { + setWidgetSprite(1833, new WidgetPointer(548,143)); + setWidgetSprite(1833, new WidgetPointer(746,28)); + setWidgetContextMenuOption(1, new WidgetPointer(548,134), "Acrobat Emotes"); + setWidgetContextMenuOption(1, new WidgetPointer(746,44), "Acrobat Emotes"); + } else if (globalint_236 == 2) { + setWidgetSprite(1816, new WidgetPointer(548,143)); + setWidgetSprite(1816, new WidgetPointer(746,28)); + setWidgetContextMenuOption(1, new WidgetPointer(548,134), "Forfeit"); + setWidgetContextMenuOption(1, new WidgetPointer(746,44), "Forfeit"); + } else if (globalint_236 == 3) { + setWidgetSprite(3250, new WidgetPointer(548,143)); + setWidgetSprite(3250, new WidgetPointer(746,28)); + setWidgetContextMenuOption(1, new WidgetPointer(548,134), "Diplomacy"); + setWidgetContextMenuOption(1, new WidgetPointer(746,44), "Diplomacy"); + } else { + if (globalint_236 == 4) { + setWidgetSprite(3250, new WidgetPointer(548,143)); + setWidgetSprite(3250, new WidgetPointer(746,28)); + setWidgetContextMenuOption(1, new WidgetPointer(548,134), "Retreat"); + setWidgetContextMenuOption(1, new WidgetPointer(746,44), "Retreat"); + } + } + if (((boolean)globalint_237)) { + setWidgetSprite(1823, new WidgetPointer(548,144)); + setWidgetSprite(1823, new WidgetPointer(746,29)); + } + if (((boolean)globalint_238)) { + setWidgetSprite(1824, new WidgetPointer(548,145)); + setWidgetSprite(1824, new WidgetPointer(746,30)); + setWidgetContextMenuOption(1, new WidgetPointer(548,136), "Magic Spellbook"); + setWidgetContextMenuOption(1, new WidgetPointer(746,46), "Magic Spellbook"); + } + if (globalint_823 != 2) { + setWidgetSprite(-1, new WidgetPointer(548,107)); + setWidgetSprite(-1, new WidgetPointer(746,31)); + setWidgetNoOptions(new WidgetPointer(746,47)); + setWidgetNoOptions(new WidgetPointer(548,99)); + } else { + if (globalint_823 == 2) { + setWidgetSprite(447, new WidgetPointer(548,107)); + setWidgetSprite(447, new WidgetPointer(746,31)); + setWidgetContextMenuOption(1, new WidgetPointer(548,99), "Production"); + setWidgetContextMenuOption(1, new WidgetPointer(746,47), "Production"); + } + } + if (((boolean)globalint_240)) { + setWidgetSprite(6238, new WidgetPointer(548,108)); + setWidgetSprite(6238, new WidgetPointer(746,32)); + } + if (((boolean)globalint_241)) { + setWidgetSprite(6237, new WidgetPointer(548,109)); + setWidgetSprite(6237, new WidgetPointer(746,33)); + } + if (((boolean)globalint_242)) { + setWidgetSprite(1828, new WidgetPointer(548,110)); + setWidgetSprite(1828, new WidgetPointer(746,34)); + } + if (((boolean)globalint_243)) { + setWidgetSprite(1829, new WidgetPointer(548,111)); + setWidgetSprite(1829, new WidgetPointer(746,35)); + } + if (((boolean)globalint_244)) { + setWidgetSprite(1830, new WidgetPointer(548,112)); + setWidgetSprite(1830, new WidgetPointer(746,36)); + setWidgetContextMenuOption(1, new WidgetPointer(548,104), "Emotes"); + setWidgetContextMenuOption(1, new WidgetPointer(746,52), "Emotes"); + } else { + if (((boolean)globalint_244)) { + setWidgetSprite(3247, new WidgetPointer(548,112)); + setWidgetSprite(3247, new WidgetPointer(746,36)); + setWidgetContextMenuOption(1, new WidgetPointer(548,104), "Special Attacks"); + setWidgetContextMenuOption(1, new WidgetPointer(746,52), "Special Attacks"); + } + } + if (((boolean)globalint_245)) { + setWidgetSprite(1831, new WidgetPointer(548,113)); + setWidgetSprite(1831, new WidgetPointer(746,37)); + setWidgetContextMenuOption(1, new WidgetPointer(548,105), "Music Player"); + setWidgetContextMenuOption(1, new WidgetPointer(746,53), "Music Player"); + } else { + if (((boolean)globalint_245)) { + setWidgetSprite(7707, new WidgetPointer(548,113)); + setWidgetSprite(7707, new WidgetPointer(746,37)); + setWidgetContextMenuOption(1, new WidgetPointer(548,105), "Face Direction"); + setWidgetContextMenuOption(1, new WidgetPointer(746,53), "Face Direction"); + } + } + if (((boolean)globalint_824)) { + setWidgetSprite(1832, new WidgetPointer(548,114)); + setWidgetSprite(1832, new WidgetPointer(746,38)); + } + return; +} diff --git a/dumps/scripts/1767.cs2 b/dumps/scripts/1767.cs2 new file mode 100644 index 000000000..0a8e1de5e --- /dev/null +++ b/dumps/scripts/1767.cs2 @@ -0,0 +1,16 @@ +void script_1767() { + script_71(5); + doWidgetType21Task(0, new WidgetPointer(783,1)); + doWidgetType21Task(0, new WidgetPointer(783,2)); + doWidgetType21Task(0, new WidgetPointer(783,3)); + doWidgetType21Task(0, new WidgetPointer(783,4)); + doWidgetType21Task(0, new WidgetPointer(783,5)); + doWidgetType21Task(0, new WidgetPointer(783,6)); + doWidgetType21Task(0, new WidgetPointer(783,7)); + doWidgetType21Task(0, new WidgetPointer(783,8)); + doWidgetType21Task(0, new WidgetPointer(783,9)); + doWidgetType21Task(0, new WidgetPointer(783,10)); + doWidgetType21Task(0, new WidgetPointer(783,11)); + script_1766(); + return; +} diff --git a/dumps/scripts/1768.cs2 b/dumps/scripts/1768.cs2 new file mode 100644 index 000000000..6ff28253e --- /dev/null +++ b/dumps/scripts/1768.cs2 @@ -0,0 +1,4 @@ +void script_1768() { + script_71(4); + return; +} diff --git a/dumps/scripts/1769.cs2 b/dumps/scripts/1769.cs2 new file mode 100644 index 000000000..a25020996 --- /dev/null +++ b/dumps/scripts/1769.cs2 @@ -0,0 +1,7 @@ +void script_1769(int arg0) { + setWidgetModel(getOtherCommonData(globalint_269, 581), new WidgetPointer(arg0)); + setWidget3DRotation(0, 160, getOtherCommonData(globalint_269, 584), getOtherCommonData(globalint_269, 585), getOtherCommonData(globalint_269, 586), getOtherCommonData(globalint_269, 583), new WidgetPointer(arg0)); + setWidgetAnimation(getOtherCommonData(globalint_269, 582), new WidgetPointer(arg0)); + setWidgetPosition(0, getOtherCommonData(globalint_269, 587), 1, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/177.cs2 b/dumps/scripts/177.cs2 new file mode 100644 index 000000000..5a8fce590 --- /dev/null +++ b/dumps/scripts/177.cs2 @@ -0,0 +1,4 @@ +void script_177() { + script_178(); + return; +} diff --git a/dumps/scripts/1770.cs2 b/dumps/scripts/1770.cs2 new file mode 100644 index 000000000..87a2f81f9 --- /dev/null +++ b/dumps/scripts/1770.cs2 @@ -0,0 +1,76 @@ +void script_1770() { + if (((boolean)globalint_246)) { + setWidgetSprite(699, new WidgetPointer(791,19)); + script_1783(51838998, 51839029, -1, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,19)); + } + if (((boolean)globalint_246)) { + setWidgetSprite(699, new WidgetPointer(791,24)); + script_1783(51838998, 51839029, 51839000, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,24)); + } + if (globalint_246 == 2) { + setWidgetSprite(699, new WidgetPointer(791,27)); + script_1783(51838998, 51839029, 51839003, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,27)); + } + if (globalint_246 == 3) { + setWidgetSprite(699, new WidgetPointer(791,30)); + script_1783(51838998, 51839029, 51839006, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,30)); + } + if (globalint_246 == 4) { + setWidgetSprite(699, new WidgetPointer(791,33)); + script_1783(51838998, 51839029, 51839009, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,33)); + } + if (globalint_246 == 5) { + setWidgetSprite(699, new WidgetPointer(791,36)); + script_1783(51838998, 51839029, 51839012, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,36)); + } + if (globalint_246 == 6) { + setWidgetSprite(699, new WidgetPointer(791,39)); + script_1783(51838998, 51839029, 51839015, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,39)); + } + if (globalint_246 == 7) { + setWidgetSprite(699, new WidgetPointer(791,42)); + script_1783(51838998, 51839029, 51839018, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,42)); + } + if (globalint_246 == 8) { + setWidgetSprite(699, new WidgetPointer(791,45)); + script_1783(51838998, 51839029, 51839021, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,45)); + } + if (globalint_246 == 9) { + setWidgetSprite(699, new WidgetPointer(791,48)); + script_1783(51838998, 51839029, 51839024, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,48)); + } + if (globalint_246 == 10) { + setWidgetSprite(699, new WidgetPointer(791,51)); + script_1783(51838998, 51839029, 51839027, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,51)); + } + if (globalint_246 == 15) { + setWidgetSprite(699, new WidgetPointer(791,55)); + script_1783(51838998, 51839029, -1, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,55)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1771.cs2 b/dumps/scripts/1771.cs2 new file mode 100644 index 000000000..f96d4ed78 --- /dev/null +++ b/dumps/scripts/1771.cs2 @@ -0,0 +1,82 @@ +void script_1771() { + if (((boolean)globalint_247)) { + setWidgetSprite(699, new WidgetPointer(791,99)); + script_1783(51839072, 51839073, -1, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,99)); + } + if (((boolean)globalint_247)) { + setWidgetSprite(699, new WidgetPointer(791,59)); + script_1783(51839072, 51839073, 51839035, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,59)); + } + if (globalint_247 == 2) { + setWidgetSprite(699, new WidgetPointer(791,62)); + script_1783(51839072, 51839073, 51839038, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,62)); + } + if (globalint_247 == 3) { + setWidgetSprite(699, new WidgetPointer(791,65)); + script_1783(51839072, 51839073, 51839041, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,65)); + } + if (globalint_247 == 4) { + setWidgetSprite(699, new WidgetPointer(791,68)); + script_1783(51839072, 51839073, 51839044, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,68)); + } + if (globalint_247 == 5) { + setWidgetSprite(699, new WidgetPointer(791,71)); + script_1783(51839072, 51839073, 51839047, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,71)); + } + if (globalint_247 == 6) { + setWidgetSprite(699, new WidgetPointer(791,74)); + script_1783(51839072, 51839073, 51839050, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,74)); + } + if (globalint_247 == 7) { + setWidgetSprite(699, new WidgetPointer(791,77)); + script_1783(51839072, 51839073, 51839053, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,77)); + } + if (globalint_247 == 8) { + setWidgetSprite(699, new WidgetPointer(791,80)); + script_1783(51839072, 51839073, 51839056, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,80)); + } + if (globalint_247 == 9) { + setWidgetSprite(699, new WidgetPointer(791,83)); + script_1783(51839072, 51839073, 51839059, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,83)); + } + if (globalint_247 == 10) { + setWidgetSprite(699, new WidgetPointer(791,86)); + script_1783(51839072, 51839073, 51839062, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,86)); + } + if (globalint_247 == 11) { + setWidgetSprite(699, new WidgetPointer(791,89)); + script_1783(51839072, 51839073, 51839065, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,89)); + } + if (globalint_247 == 12) { + setWidgetSprite(699, new WidgetPointer(791,92)); + script_1783(51839072, 51839073, 51839068, -1); + } else { + setWidgetSprite(697, new WidgetPointer(791,92)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1772.cs2 b/dumps/scripts/1772.cs2 new file mode 100644 index 000000000..710dd404c --- /dev/null +++ b/dumps/scripts/1772.cs2 @@ -0,0 +1,11 @@ +void script_1772() { + if (((boolean)globalint_248)) { + setWidgetSprite(699, new WidgetPointer(791,105)); + setWidgetSprite(697, new WidgetPointer(791,108)); + } else { + setWidgetSprite(697, new WidgetPointer(791,105)); + setWidgetSprite(699, new WidgetPointer(791,108)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1773.cs2 b/dumps/scripts/1773.cs2 new file mode 100644 index 000000000..d7c42df02 --- /dev/null +++ b/dumps/scripts/1773.cs2 @@ -0,0 +1,17 @@ +void script_1773() { + if (((boolean)globalint_249)) { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(791,111)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(791,112)); + setWidgetIsHidden(true, new WidgetPointer(791,114)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(791,115)); + setWidgetText(new WidgetPointer(791,115), "...you keep" + "
" + "your items."); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(791,111)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(791,112)); + setWidgetIsHidden(false, new WidgetPointer(791,114)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(791,115)); + setWidgetText(new WidgetPointer(791,115), "...you DROP ALL your items."); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1774.cs2 b/dumps/scripts/1774.cs2 new file mode 100644 index 000000000..c535700f1 --- /dev/null +++ b/dumps/scripts/1774.cs2 @@ -0,0 +1,11 @@ +void script_1774() { + if (((boolean)globalint_250)) { + setWidgetSprite(699, new WidgetPointer(791,121)); + cs2method2103(0, new WidgetPointer(791,120)); + } else { + setWidgetSprite(698, new WidgetPointer(791,121)); + cs2method2103(225, new WidgetPointer(791,120)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1775.cs2 b/dumps/scripts/1775.cs2 new file mode 100644 index 000000000..d43b325bd --- /dev/null +++ b/dumps/scripts/1775.cs2 @@ -0,0 +1,41 @@ +void script_1775() { + switch (globalint_252) { + case 0: + setWidgetSprite(699, new WidgetPointer(791,127)); + setWidgetIsHidden(false, new WidgetPointer(791,125)); + setWidgetIsHidden(false, new WidgetPointer(791,126)); + setWidgetIsHidden(false, new WidgetPointer(791,124)); + setWidgetIsHidden(false, new WidgetPointer(791,123)); + cs2method2103(0, new WidgetPointer(791,122)); + break; + case 1: + setWidgetSprite(699, new WidgetPointer(791,127)); + setWidgetIsHidden(true, new WidgetPointer(791,125)); + setWidgetIsHidden(true, new WidgetPointer(791,126)); + setWidgetIsHidden(false, new WidgetPointer(791,124)); + setWidgetIsHidden(false, new WidgetPointer(791,123)); + if (isMember()) { + cs2method2103(225, new WidgetPointer(791,122)); + } else { + cs2method2103(0, new WidgetPointer(791,122)); + } + break; + case 2: + setWidgetSprite(699, new WidgetPointer(791,127)); + setWidgetIsHidden(true, new WidgetPointer(791,125)); + setWidgetIsHidden(true, new WidgetPointer(791,126)); + setWidgetIsHidden(true, new WidgetPointer(791,124)); + setWidgetIsHidden(false, new WidgetPointer(791,123)); + cs2method2103(225, new WidgetPointer(791,122)); + break; + case 3: + setWidgetSprite(698, new WidgetPointer(791,127)); + setWidgetIsHidden(true, new WidgetPointer(791,125)); + setWidgetIsHidden(true, new WidgetPointer(791,126)); + setWidgetIsHidden(true, new WidgetPointer(791,124)); + setWidgetIsHidden(true, new WidgetPointer(791,123)); + cs2method2103(225, new WidgetPointer(791,122)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1776.cs2 b/dumps/scripts/1776.cs2 new file mode 100644 index 000000000..9ca710e6d --- /dev/null +++ b/dumps/scripts/1776.cs2 @@ -0,0 +1,11 @@ +void script_1776() { + if (((boolean)globalint_251)) { + setWidgetSprite(699, new WidgetPointer(791,129)); + cs2method2103(0, new WidgetPointer(791,128)); + } else { + setWidgetSprite(698, new WidgetPointer(791,129)); + cs2method2103(225, new WidgetPointer(791,128)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1777.cs2 b/dumps/scripts/1777.cs2 new file mode 100644 index 000000000..5ec054893 --- /dev/null +++ b/dumps/scripts/1777.cs2 @@ -0,0 +1,11 @@ +void script_1777() { + if (((boolean)globalint_256)) { + setWidgetSprite(699, new WidgetPointer(791,131)); + cs2method2103(0, new WidgetPointer(791,130)); + } else { + setWidgetSprite(698, new WidgetPointer(791,131)); + cs2method2103(225, new WidgetPointer(791,130)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1778.cs2 b/dumps/scripts/1778.cs2 new file mode 100644 index 000000000..efc2a7398 --- /dev/null +++ b/dumps/scripts/1778.cs2 @@ -0,0 +1,11 @@ +void script_1778() { + if (((boolean)globalint_253)) { + setWidgetSprite(699, new WidgetPointer(791,133)); + cs2method2103(0, new WidgetPointer(791,132)); + } else { + setWidgetSprite(698, new WidgetPointer(791,133)); + cs2method2103(225, new WidgetPointer(791,132)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1779.cs2 b/dumps/scripts/1779.cs2 new file mode 100644 index 000000000..1ca271b7b --- /dev/null +++ b/dumps/scripts/1779.cs2 @@ -0,0 +1,11 @@ +void script_1779() { + if (((boolean)globalint_254)) { + setWidgetSprite(699, new WidgetPointer(791,135)); + cs2method2103(0, new WidgetPointer(791,134)); + } else { + setWidgetSprite(698, new WidgetPointer(791,135)); + cs2method2103(225, new WidgetPointer(791,134)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/178.cs2 b/dumps/scripts/178.cs2 new file mode 100644 index 000000000..f80a70c1a --- /dev/null +++ b/dumps/scripts/178.cs2 @@ -0,0 +1,45 @@ +void script_178() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 8; + while (ivar0 < ivar2) { + if ((globalint_42 == ivar0) && (globalint_41 == ivar0)) { + setWidgetSprite(1023, cs2method_3408(105, 73, 683, ivar0)); + } else if (globalint_42 == ivar0) { + setWidgetSprite(1020, cs2method_3408(105, 73, 683, ivar0)); + } else if (globalint_41 == ivar0) { + setWidgetSprite(1022, cs2method_3408(105, 73, 683, ivar0)); + } else if (((boolean)mod(divide(script_179(ivar0), 25), 2))) { + setWidgetSprite(1021, cs2method_3408(105, 73, 683, ivar0)); + } else { + setWidgetSprite(1019, cs2method_3408(105, 73, 683, ivar0)); + } + ivar0 = add(ivar0, 1); + } + if (((boolean)script_185(1))) { + setWidgetText(cs2method_3408(105, 73, 684, 1), "" + "Filter"); + } else { + setWidgetText(cs2method_3408(105, 73, 684, 1), "All"); + } + ivar0 = 2; + while (ivar0 < ivar2) { + ivar1 = script_185(ivar0); + if (((ivar0 == 3) && ((boolean)ivar1)) && (getFriendlistSize() < 0)) { + setWidgetText(cs2method_3408(105, 73, 684, ivar0), "" + "Loading"); + } else if (((boolean)ivar1)) { + setWidgetText(cs2method_3408(105, 73, 684, ivar0), "" + "Friends"); + } else if (ivar1 == 2) { + setWidgetText(cs2method_3408(105, 73, 684, ivar0), "" + "Off"); + } else if (ivar1 == 3) { + setWidgetText(cs2method_3408(105, 73, 684, ivar0), "" + "Hide"); + } else { + setWidgetText(cs2method_3408(105, 73, 684, ivar0), "On"); + } + ivar0 = add(ivar0, 1); + } + setWidgetIsHidden(false, new WidgetPointer(751,1)); + return; +} diff --git a/dumps/scripts/1780.cs2 b/dumps/scripts/1780.cs2 new file mode 100644 index 000000000..448cb1996 --- /dev/null +++ b/dumps/scripts/1780.cs2 @@ -0,0 +1,11 @@ +void script_1780() { + if (((boolean)globalint_255)) { + setWidgetSprite(699, new WidgetPointer(791,137)); + cs2method2103(0, new WidgetPointer(791,136)); + } else { + setWidgetSprite(698, new WidgetPointer(791,137)); + cs2method2103(225, new WidgetPointer(791,136)); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1781.cs2 b/dumps/scripts/1781.cs2 new file mode 100644 index 000000000..fe6524749 --- /dev/null +++ b/dumps/scripts/1781.cs2 @@ -0,0 +1,19 @@ +void script_1781() { + int ivar0; + ivar0 = 0; + while (ivar0 <= 4) { + if (setWidgetRegister(new WidgetPointer(791,141), multiply(ivar0, 4))) { + if (globalint_257 == ivar0) { + setWidgetSprite(699); + script_1783(51839117, 51839118, 51839117, add(multiply(ivar0, 4), 3)); + } else if (isMember() && ((boolean)getOtherCommonData(cs2method_3408(105, 74, 1604, ivar0), 557))) { + setWidgetSprite(698); + } else { + setWidgetSprite(697); + } + } + ivar0 = add(ivar0, 1); + } + script_1784(); + return; +} diff --git a/dumps/scripts/1782.cs2 b/dumps/scripts/1782.cs2 new file mode 100644 index 000000000..ff5b8e6ee --- /dev/null +++ b/dumps/scripts/1782.cs2 @@ -0,0 +1,26 @@ +void script_1782() { + if (standart_config_1149 != -1) { + script_1801(); + if (((boolean)globalint_258)) { + script_1363(51839119); + setScriptCallOnMouseOver(95, new WidgetPointer(-32768,3), "I", new WidgetPointer(791,143)); + setScriptCallOnMouseExit(97, new WidgetPointer(-32768,3), "I", new WidgetPointer(791,143)); + if (((boolean)globalint_259)) { + setWidgetText(new WidgetPointer(791,146), "Accept"); + setWidgetFont(496, new WidgetPointer(791,146)); + } else { + setWidgetText(new WidgetPointer(791,146), "Accept -" + "
" + "Opponent has accepted."); + setWidgetFont(494, new WidgetPointer(791,146)); + } + } else { + script_1360(51839119); + setScriptCallOnMouseOver(-1, "", new WidgetPointer(791,143)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(791,143)); + setWidgetText(new WidgetPointer(791,146), "Waiting for opponent..."); + setWidgetFont(495, new WidgetPointer(791,146)); + } + } else { + script_1802(); + } + return; +} diff --git a/dumps/scripts/1783.cs2 b/dumps/scripts/1783.cs2 new file mode 100644 index 000000000..ecaca4fba --- /dev/null +++ b/dumps/scripts/1783.cs2 @@ -0,0 +1,18 @@ +void script_1783(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + if (arg2 == -1) { + if (setWidgetRegister(new WidgetPointer(arg1), 1)) { + script_157(arg1, arg0, 0, 1); + } + return; + } + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg2), arg3) || ((arg3 == -1) && setWidgetRegister(new WidgetPointer(arg2)))) { + ivar4 = add(getWidgetActualY(), divide(getWidgetActualHeight(), 2)); + ivar4 = subtract(ivar4, divide(getWidgetActualHeight(new WidgetPointer(arg0)), 2)); + if (setWidgetRegister(new WidgetPointer(arg1), 1)) { + script_157(arg1, arg0, ivar4, 1); + } + } + return; +} diff --git a/dumps/scripts/1784.cs2 b/dumps/scripts/1784.cs2 new file mode 100644 index 000000000..5fe72d8e6 --- /dev/null +++ b/dumps/scripts/1784.cs2 @@ -0,0 +1,381 @@ +void script_1784() { + int ivar0; + int ivar1; + int ivar2; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_1785_struct(2,0,0) structdump_5; + cs2func_script_1785_struct(2,0,0) structdump_6; + cs2func_script_1785_struct(2,0,0) structdump_7; + cs2func_script_1785_struct(2,0,0) structdump_8; + cs2func_script_1785_struct(2,0,0) structdump_9; + cs2func_script_1785_struct(2,0,0) structdump_10; + cs2func_script_1785_struct(2,0,0) structdump_11; + cs2func_script_1785_struct(2,0,0) structdump_12; + cs2func_script_1785_struct(2,0,0) structdump_13; + cs2func_script_1785_struct(2,0,0) structdump_14; + cs2func_script_1785_struct(2,0,0) structdump_15; + cs2func_script_1785_struct(2,0,0) structdump_16; + cs2func_script_1785_struct(2,0,0) structdump_17; + cs2func_script_1785_struct(2,0,0) structdump_18; + cs2func_script_1785_struct(2,0,0) structdump_19; + cs2func_script_1785_struct(2,0,0) structdump_20; + cs2func_script_1785_struct(2,0,0) structdump_21; + cs2func_script_1785_struct(2,0,0) structdump_22; + cs2func_script_1785_struct(2,0,0) structdump_23; + cs2func_script_1785_struct(2,0,0) structdump_24; + cs2func_script_1785_struct(2,0,0) structdump_25; + cs2func_script_1785_struct(2,0,0) structdump_26; + cs2func_script_1785_struct(2,0,0) structdump_27; + cs2func_script_1785_struct(2,0,0) structdump_28; + cs2func_script_1785_struct(2,0,0) structdump_29; + cs2func_script_1785_struct(2,0,0) structdump_30; + cs2func_script_1785_struct(2,0,0) structdump_31; + cs2func_script_1785_struct(2,0,0) structdump_32; + cs2func_script_1785_struct(2,0,0) structdump_33; + cs2func_script_1785_struct(2,0,0) structdump_34; + cs2func_script_1785_struct(2,0,0) structdump_35; + cs2func_script_1785_struct(2,0,0) structdump_36; + cs2func_script_1785_struct(2,0,0) structdump_37; + ivar0 = 0; + ivar1 = subtract(getWidgetActualWidth(new WidgetPointer(792,3)), 16); + ivar2 = 0; + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 1; + stack_dump4 = "~ Winning ~"; + structdump_5 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_5.intpart_1; + ivar0 = structdump_5.intpart_0; + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "Victory is awarded..."; + structdump_6 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_6.intpart_1; + ivar0 = structdump_6.intpart_0; + if (((boolean)globalint_248)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "...to the team that defeats all its enemies."; + structdump_7 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_7.intpart_1; + ivar0 = structdump_7.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "...to the team that defeats all its enemies, excluding the last five."; + structdump_8 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_8.intpart_1; + ivar0 = structdump_8.intpart_0; + } + if ((globalint_246 > 0) && (globalint_246 < 15)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "OR" + "
" + "...to the team that first achieves " + intToStr(cs2method_3408(105, 105, 1605, globalint_246)) + " kills."; + structdump_9 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_9.intpart_1; + ivar0 = structdump_9.intpart_0; + } + if (globalint_247 > 0) { + if (globalint_246 > 0) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "OR" + "
" + "...to the team that scores the most kills " + script_1751(cs2method_3408(105, 105, 1800, globalint_247)) + "."; + structdump_10 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_10.intpart_1; + ivar0 = structdump_10.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "OR" + "
" + "...to the team with the most survivors " + script_1751(cs2method_3408(105, 105, 1800, globalint_247)) + "."; + structdump_11 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_11.intpart_1; + ivar0 = structdump_11.intpart_0; + } + } + ivar0 = add(ivar0, 7); + if (((boolean)globalint_246)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "Knock-out mode:" + "" + "
" + "Once war has begun, players may no longer join/rejoin the fight."; + structdump_12 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_12.intpart_1; + ivar0 = structdump_12.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "Run-in mode:" + "" + "
" + "Players may join/rejoin the fight at any time during the war."; + structdump_13 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_13.intpart_1; + ivar0 = structdump_13.intpart_0; + if ((globalint_246 == 15) && ((boolean)globalint_247)) { + ivar0 = add(ivar0, 7); + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "This war has no time limit or kill target, so it might go on for ages!"; + structdump_14 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_14.intpart_1; + ivar0 = structdump_14.intpart_0; + } + } + ivar0 = add(ivar0, 7); + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 1; + stack_dump4 = "~ Item loss ~"; + structdump_15 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_15.intpart_1; + ivar0 = structdump_15.intpart_0; + if (((boolean)globalint_249)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "On death, players keep their items."; + structdump_16 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_16.intpart_1; + ivar0 = structdump_16.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "On death, players DROP their items." + "" + "
" + "Players may not teleport."; + structdump_17 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_17.intpart_1; + ivar0 = structdump_17.intpart_0; + } + ivar0 = add(ivar0, 7); + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 1; + stack_dump4 = "~ Combat rules ~"; + structdump_18 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_18.intpart_1; + ivar0 = structdump_18.intpart_0; + if (((boolean)globalint_250)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "Melee combat is allowed."; + structdump_19 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_19.intpart_1; + ivar0 = structdump_19.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "Melee combat" + "" + " is forbidden."; + structdump_20 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_20.intpart_1; + ivar0 = structdump_20.intpart_0; + } + switch (globalint_252) { + case 0: + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "Magical combat is allowed."; + structdump_21 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_21.intpart_1; + ivar0 = structdump_21.intpart_0; + break; + case 1: + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "Spells from the " + "" + "standard spellbook" + "" + " are allowed."; + structdump_22 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_22.intpart_1; + ivar0 = structdump_22.intpart_0; + break; + case 2: + if (isMember()) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "The " + "" + "Bind" + "" + ", " + "" + "Snare" + "" + " and " + "" + "Entangle" + "" + " spells are allowed."; + structdump_23 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_23.intpart_1; + ivar0 = structdump_23.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "The " + "" + "Bind" + "" + " spell is allowed."; + structdump_24 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_24.intpart_1; + ivar0 = structdump_24.intpart_0; + } + break; + case 3: + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "Magical combat" + "" + " is forbidden."; + structdump_25 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_25.intpart_1; + ivar0 = structdump_25.intpart_0; + } + if (((boolean)globalint_251)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "Ranged combat is allowed."; + structdump_26 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_26.intpart_1; + ivar0 = structdump_26.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "Ranged combat" + "" + " is forbidden."; + structdump_27 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_27.intpart_1; + ivar0 = structdump_27.intpart_0; + } + if (((boolean)globalint_256)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "Prayer is allowed."; + structdump_28 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_28.intpart_1; + ivar0 = structdump_28.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "Prayer" + "" + " is forbidden."; + structdump_29 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_29.intpart_1; + ivar0 = structdump_29.intpart_0; + } + if (isMember()) { + if (((boolean)globalint_253)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "Summoning is allowed."; + structdump_30 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_30.intpart_1; + ivar0 = structdump_30.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "Summoning" + "" + " is forbidden." + "
" + "Familiars will be dismissed."; + structdump_31 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_31.intpart_1; + ivar0 = structdump_31.intpart_0; + } + } + if (((boolean)globalint_254)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "Food is allowed."; + structdump_32 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_32.intpart_1; + ivar0 = structdump_32.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "Food" + "" + " is forbidden."; + structdump_33 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_33.intpart_1; + ivar0 = structdump_33.intpart_0; + } + if (((boolean)globalint_255)) { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "Potions are allowed."; + structdump_34 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_34.intpart_1; + ivar0 = structdump_34.intpart_0; + } else { + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = "" + "Potions" + "" + " are forbidden." + "
" + "Boosted stats will be reset (excluding Prayer boosts)."; + structdump_35 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_35.intpart_1; + ivar0 = structdump_35.intpart_0; + } + ivar0 = add(ivar0, 7); + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 1; + stack_dump4 = "~ Arena ~"; + structdump_36 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_36.intpart_1; + ivar0 = structdump_36.intpart_0; + stack_dump0 = ivar0; + stack_dump1 = ivar2; + stack_dump2 = ivar1; + stack_dump3 = 0; + stack_dump4 = getOtherCommonData(cs2method_3408(105, 74, 1604, globalint_257), 555); + structdump_37 = script_1785(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar2 = structdump_37.intpart_1; + ivar0 = structdump_37.intpart_0; + if (ivar0 > getWidgetActualHeight(new WidgetPointer(792,3))) { + setWidgetIsHidden(false, new WidgetPointer(792,4)); + setWidgetPosition(7, 46, 0, 0, new WidgetPointer(792,3)); + setWidgetScrollMax(0, ivar0, new WidgetPointer(792,3)); + script_31(51904516, 51904515, 792, 789, 790, 791, 773, 788); + if (setWidgetRegister(new WidgetPointer(792,4), 1)) { + script_37(51904516, 51904515, cs2method2601(new WidgetPointer(792,3)), 1); + } + } else { + deleteAllExtraChilds(new WidgetPointer(792,4)); + setWidgetIsHidden(true, new WidgetPointer(792,4)); + setWidgetPosition(15, 46, 0, 0, new WidgetPointer(792,3)); + setWidgetScrollMax(0, 0, new WidgetPointer(792,3)); + cs2method2100(0, 0, new WidgetPointer(792,3)); + } + return; +} diff --git a/dumps/scripts/1785.cs2 b/dumps/scripts/1785.cs2 new file mode 100644 index 000000000..a14e42e2d --- /dev/null +++ b/dumps/scripts/1785.cs2 @@ -0,0 +1,16 @@ +cs2func_script_1785_struct(2,0,0) script_1785(int arg0,int arg1,int arg2,int arg3,string arg4) { + createExtraChild(new WidgetPointer(792,3), 4, arg1); + setWidgetPosition(0, arg0, 0, 0); + setWidgetFont(495); + setWidgetUnknownBoolean(true); + setWidgetSize(arg2, add(multiply(getLineCount(arg2, 495, arg4), 12), 5), 0, 0); + setWidgetText(arg4); + if (((boolean)arg3)) { + setWidgetTextAlignment(1, 0, 0); + setWidgetRGB(new Color(255, 152, 31)); + return newstruct cs2func_script_1785_struct(add(add(arg0, getWidgetActualHeight()), 12), add(arg1, 1)); + } + setWidgetTextAlignment(0, 0, 0); + setWidgetRGB(new Color(200, 170, 100)); + return newstruct cs2func_script_1785_struct(add(add(arg0, getWidgetActualHeight()), 5), add(arg1, 1)); +} diff --git a/dumps/scripts/1786.cs2 b/dumps/scripts/1786.cs2 new file mode 100644 index 000000000..e6180aebf --- /dev/null +++ b/dumps/scripts/1786.cs2 @@ -0,0 +1,5 @@ +void script_1786(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16) { + setScriptCallOnConfigChange(1787, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), new WidgetPointer(arg8), new WidgetPointer(arg9), new WidgetPointer(arg10), new WidgetPointer(arg11), new WidgetPointer(arg12), new WidgetPointer(arg13), new WidgetPointer(arg14), new WidgetPointer(arg15), new WidgetPointer(arg16), 1305, 1, "IIIIIIIIIIIIIIIIIY", new WidgetPointer(arg0)); + setScriptCallOnGlobalConfigChange(1787, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), new WidgetPointer(arg8), new WidgetPointer(arg9), new WidgetPointer(arg10), new WidgetPointer(arg11), new WidgetPointer(arg12), new WidgetPointer(arg13), new WidgetPointer(arg14), new WidgetPointer(arg15), new WidgetPointer(arg16), 270, 260, 261, 262, 263, 264, 271, 7, "IIIIIIIIIIIIIIIIIY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1787.cs2 b/dumps/scripts/1787.cs2 new file mode 100644 index 000000000..72b9a5dc4 --- /dev/null +++ b/dumps/scripts/1787.cs2 @@ -0,0 +1,128 @@ +void script_1787(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16) { + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + string svar0; + svar0 = ""; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + if (((boolean)globalint_271)) { + setWidgetText(new WidgetPointer(arg3), cs2method3611() + ":"); + } else { + setWidgetText(new WidgetPointer(arg3), "This clan:"); + } + setWidgetText(new WidgetPointer(arg5), intToStr(globalint_261)); + setWidgetText(new WidgetPointer(arg11), intToStr(globalint_262)); + if (bitconfig_5280 > 0) { + if (globalint_263 < 65535) { + setWidgetText(new WidgetPointer(arg7), script_46(globalint_263, ",")); + } else { + setWidgetText(new WidgetPointer(arg7), "" + "You rock!" + ""); + } + if (globalint_264 < 65535) { + setWidgetText(new WidgetPointer(arg13), script_46(globalint_264, ",")); + } else { + setWidgetText(new WidgetPointer(arg13), "" + "They rock!" + ""); + } + setWidgetIsHidden(false, new WidgetPointer(arg6)); + setWidgetIsHidden(false, new WidgetPointer(arg12)); + setWidgetIsHidden(false, new WidgetPointer(arg7)); + setWidgetIsHidden(false, new WidgetPointer(arg13)); + ivar17 = 1; + if (bitconfig_5280 < 15) { + svar0 = "/ " + script_46(cs2method_3408(105, 105, 1605, bitconfig_5280), ","); + setWidgetText(new WidgetPointer(arg8), svar0); + setWidgetText(new WidgetPointer(arg14), svar0); + setWidgetIsHidden(false, new WidgetPointer(arg8)); + setWidgetIsHidden(false, new WidgetPointer(arg14)); + ivar18 = 1; + } else { + setWidgetIsHidden(true, new WidgetPointer(arg8)); + setWidgetIsHidden(true, new WidgetPointer(arg14)); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(arg6)); + setWidgetIsHidden(true, new WidgetPointer(arg12)); + setWidgetIsHidden(true, new WidgetPointer(arg7)); + setWidgetIsHidden(true, new WidgetPointer(arg13)); + setWidgetIsHidden(true, new WidgetPointer(arg8)); + setWidgetIsHidden(true, new WidgetPointer(arg14)); + } + if (((boolean)globalint_260)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg16)); + if (bitconfig_5281 > 0) { + setWidgetText(new WidgetPointer(arg15), "Time remaining:"); + if (globalint_270 > 60) { + script_1791(arg16); + } else if (globalint_270 > 1) { + setWidgetText(new WidgetPointer(arg16), intToStr(globalint_270) + " minutes"); + } else if (((boolean)globalint_270)) { + setWidgetText(new WidgetPointer(arg16), "" + "1 minute" + ""); + } else { + setWidgetText(new WidgetPointer(arg16), "" + "Not much!" + ""); + } + setWidgetIsHidden(false, new WidgetPointer(arg15)); + setWidgetIsHidden(false, new WidgetPointer(arg16)); + ivar19 = 1; + } else { + setWidgetIsHidden(true, new WidgetPointer(arg15)); + setWidgetIsHidden(true, new WidgetPointer(arg16)); + } + } else { + setWidgetText(new WidgetPointer(arg15), "Countdown to battle:"); + if (globalint_265 != globalint_270) { + globalint_265 = globalint_270; + script_1790(arg16); + setScriptCallOnGameloop(1789, new WidgetPointer(arg16), getClientCycle(), globalint_270, "Iii", new WidgetPointer(arg16)); + } + setWidgetIsHidden(false, new WidgetPointer(arg15)); + setWidgetIsHidden(false, new WidgetPointer(arg16)); + ivar19 = 1; + } + ivar20 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg3))); + ivar21 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg9))); + ivar20 = max(add(add(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg4))), 10), getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg5)))), ivar20); + ivar21 = max(add(add(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg10))), 10), getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg11)))), ivar21); + ivar22 = add(getWidgetActualHeight(new WidgetPointer(arg3)), getWidgetActualHeight(new WidgetPointer(arg4))); + if (((boolean)ivar17)) { + ivar20 = max(add(add(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg6))), 10), getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg7)))), ivar20); + ivar21 = max(add(add(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg12))), 10), getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg13)))), ivar21); + ivar22 = add(ivar22, getWidgetActualHeight(new WidgetPointer(arg6))); + if (((boolean)ivar18)) { + ivar20 = max(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg8))), ivar20); + ivar21 = max(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg14))), ivar21); + ivar22 = add(ivar22, getWidgetActualHeight(new WidgetPointer(arg8))); + } + } + ivar23 = add(add(ivar20, 10), ivar21); + if (((boolean)ivar19)) { + setWidgetSize(add(ivar23, 8), add(ivar22, 8), 0, 0, new WidgetPointer(arg0)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg1)); + script_1788(ivar20, arg3, arg4, arg5, arg6, arg7, arg8, ivar21, arg9, arg10, arg11, arg12, arg13, arg14, ivar23); + setWidgetPosition(add(add(4, ivar20), 5), 4, 0, 0, new WidgetPointer(arg2)); + setWidgetSize(0, ivar22, 0, 0, new WidgetPointer(arg2)); + script_1086(arg0, 0, 0, 0); + return; + } + ivar24 = ivar22; + ivar22 = add(add(add(ivar22, 10), getWidgetActualHeight(new WidgetPointer(arg15))), getWidgetActualHeight(new WidgetPointer(arg16))); + ivar23 = max(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg15))), ivar23); + ivar23 = max(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg16))), ivar23); + setWidgetSize(add(ivar23, 8), add(ivar22, 8), 0, 0, new WidgetPointer(arg0)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg1)); + script_1788(ivar20, arg3, arg4, arg5, arg6, arg7, arg8, ivar21, arg9, arg10, arg11, arg12, arg13, arg14, ivar23); + setWidgetPosition(add(add(4, ivar20), divide(subtract(ivar23, add(ivar20, ivar21)), 2)), 4, 0, 0, new WidgetPointer(arg2)); + setWidgetSize(0, ivar24, 0, 0, new WidgetPointer(arg2)); + setWidgetSize(ivar23, getWidgetActualHeight(new WidgetPointer(arg15)), 0, 0, new WidgetPointer(arg15)); + setWidgetSize(ivar23, getWidgetActualHeight(new WidgetPointer(arg16)), 0, 0, new WidgetPointer(arg16)); + setWidgetPosition(4, add(add(4, ivar24), 10), 0, 0, new WidgetPointer(arg15)); + setWidgetPosition(4, add(add(add(4, ivar24), 10), getWidgetActualHeight(new WidgetPointer(arg15))), 0, 0, new WidgetPointer(arg16)); + script_1086(arg0, add(add(4, ivar24), 5), 0, 0); + return; +} diff --git a/dumps/scripts/1788.cs2 b/dumps/scripts/1788.cs2 new file mode 100644 index 000000000..b05385e4a --- /dev/null +++ b/dumps/scripts/1788.cs2 @@ -0,0 +1,23 @@ +void script_1788(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14) { + int ivar15; + setWidgetSize(arg0, getWidgetActualHeight(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + setWidgetSize(arg0, getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0, new WidgetPointer(arg2)); + setWidgetSize(arg0, getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0, new WidgetPointer(arg3)); + setWidgetSize(arg0, getWidgetActualHeight(new WidgetPointer(arg4)), 0, 0, new WidgetPointer(arg4)); + setWidgetSize(arg0, getWidgetActualHeight(new WidgetPointer(arg5)), 0, 0, new WidgetPointer(arg5)); + setWidgetSize(arg0, getWidgetActualHeight(new WidgetPointer(arg6)), 0, 0, new WidgetPointer(arg6)); + setWidgetSize(arg7, getWidgetActualHeight(new WidgetPointer(arg8)), 0, 0, new WidgetPointer(arg8)); + setWidgetSize(arg7, getWidgetActualHeight(new WidgetPointer(arg9)), 0, 0, new WidgetPointer(arg9)); + setWidgetSize(arg7, getWidgetActualHeight(new WidgetPointer(arg10)), 0, 0, new WidgetPointer(arg10)); + setWidgetSize(arg7, getWidgetActualHeight(new WidgetPointer(arg11)), 0, 0, new WidgetPointer(arg11)); + setWidgetSize(arg7, getWidgetActualHeight(new WidgetPointer(arg12)), 0, 0, new WidgetPointer(arg12)); + setWidgetSize(arg7, getWidgetActualHeight(new WidgetPointer(arg13)), 0, 0, new WidgetPointer(arg13)); + ivar15 = subtract(add(4, arg14), arg7); + setWidgetPosition(ivar15, getWidgetActualY(new WidgetPointer(arg8)), 0, 0, new WidgetPointer(arg8)); + setWidgetPosition(ivar15, getWidgetActualY(new WidgetPointer(arg9)), 0, 0, new WidgetPointer(arg9)); + setWidgetPosition(ivar15, getWidgetActualY(new WidgetPointer(arg10)), 0, 0, new WidgetPointer(arg10)); + setWidgetPosition(ivar15, getWidgetActualY(new WidgetPointer(arg11)), 0, 0, new WidgetPointer(arg11)); + setWidgetPosition(ivar15, getWidgetActualY(new WidgetPointer(arg12)), 0, 0, new WidgetPointer(arg12)); + setWidgetPosition(ivar15, getWidgetActualY(new WidgetPointer(arg13)), 0, 0, new WidgetPointer(arg13)); + return; +} diff --git a/dumps/scripts/1789.cs2 b/dumps/scripts/1789.cs2 new file mode 100644 index 000000000..c24ce2cdd --- /dev/null +++ b/dumps/scripts/1789.cs2 @@ -0,0 +1,7 @@ +void script_1789(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = subtract(getClientCycle(), arg1); + globalint_265 = max(subtract(arg2, divide(ivar3, 30)), 0); + script_1790(arg0); + return; +} diff --git a/dumps/scripts/179.cs2 b/dumps/scripts/179.cs2 new file mode 100644 index 000000000..cf4096515 --- /dev/null +++ b/dumps/scripts/179.cs2 @@ -0,0 +1,19 @@ +int script_179(int arg0) { + switch (arg0) { + case 1: + return globalint_44; + case 2: + return globalint_45; + case 3: + return globalint_46; + case 4: + return globalint_47; + case 5: + return globalint_48; + case 6: + return globalint_49; + case 7: + return globalint_1511; + } + return 0; +} diff --git a/dumps/scripts/1790.cs2 b/dumps/scripts/1790.cs2 new file mode 100644 index 000000000..ee3d8db28 --- /dev/null +++ b/dumps/scripts/1790.cs2 @@ -0,0 +1,17 @@ +void script_1790(int arg0) { + int ivar1; + int ivar2; + ivar1 = multiplyDivide(3, 5, globalint_265); + if (ivar1 <= 3) { + setWidgetText(new WidgetPointer(arg0), "" + "GET READY!" + ""); + return; + } + ivar2 = divide(ivar1, 60); + ivar1 = mod(ivar1, 60); + if (ivar1 >= 10) { + setWidgetText(new WidgetPointer(arg0), intToStr(ivar2) + "m " + intToStr(ivar1) + "s"); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(ivar2) + "m 0" + intToStr(ivar1) + "s"); + } + return; +} diff --git a/dumps/scripts/1791.cs2 b/dumps/scripts/1791.cs2 new file mode 100644 index 000000000..956974694 --- /dev/null +++ b/dumps/scripts/1791.cs2 @@ -0,0 +1,12 @@ +void script_1791(int arg0) { + int ivar1; + int ivar2; + ivar1 = divide(globalint_270, 60); + ivar2 = mod(globalint_270, 60); + if (ivar2 >= 10) { + setWidgetText(new WidgetPointer(arg0), intToStr(ivar1) + "h " + intToStr(ivar2) + "m"); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(ivar1) + "h 0" + intToStr(ivar2) + "m"); + } + return; +} diff --git a/dumps/scripts/1792.cs2 b/dumps/scripts/1792.cs2 new file mode 100644 index 000000000..a90fb61df --- /dev/null +++ b/dumps/scripts/1792.cs2 @@ -0,0 +1,38 @@ +void script_1792(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + if (((boolean)bitconfig_5283)) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg3)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg4)); + setWidgetSprite(444, new WidgetPointer(arg1)); + setWidgetText(new WidgetPointer(arg4), "ITEMS ARE" + "
" + "SAFE"); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg3)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg4)); + setWidgetSprite(445, new WidgetPointer(arg1)); + setWidgetText(new WidgetPointer(arg4), "ITEMS ARE" + "
" + "DROPPED"); + } + cs2method2107(1, new WidgetPointer(arg1)); + ivar6 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg3))); + ivar6 = max(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg4))), ivar6); + ivar6 = add(ivar6, 6); + ivar7 = 5; + setWidgetPosition(0, ivar7, 0, 0, new WidgetPointer(arg3)); + ivar8 = getLineCount(ivar6, 494, getWidgetText(new WidgetPointer(arg3))); + ivar8 = add(multiply(ivar8, 10), 3); + setWidgetSize(ivar6, ivar8, 0, 0, new WidgetPointer(arg3)); + ivar7 = subtract(add(ivar7, ivar8), 1); + setWidgetPosition(divide(subtract(ivar6, getWidgetActualWidth(new WidgetPointer(arg2))), 2), ivar7, 0, 0, new WidgetPointer(arg2)); + ivar7 = subtract(add(ivar7, getWidgetActualHeight(new WidgetPointer(arg2))), 1); + setWidgetPosition(0, ivar7, 0, 0, new WidgetPointer(arg4)); + ivar9 = getLineCount(ivar6, 494, getWidgetText(new WidgetPointer(arg4))); + ivar9 = add(multiply(ivar9, 10), 3); + setWidgetSize(ivar6, ivar8, 0, 0, new WidgetPointer(arg4)); + ivar7 = add(add(ivar7, ivar9), 3); + setWidgetSize(ivar6, ivar7, 0, 0, new WidgetPointer(arg0)); + setWidgetSize(ivar6, ivar7, 0, 0, new WidgetPointer(arg1)); + script_1086(arg0, 0, 0, 0); + return; +} diff --git a/dumps/scripts/1793.cs2 b/dumps/scripts/1793.cs2 new file mode 100644 index 000000000..fff49500e --- /dev/null +++ b/dumps/scripts/1793.cs2 @@ -0,0 +1,19 @@ +void script_1793(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + script_1795(arg4, arg5); + if (((boolean)bitconfig_5279)) { + setWidgetText(new WidgetPointer(arg0), "Free-for-all: Dangerous"); + setWidgetText(new WidgetPointer(arg1), "This is a " + "" + "DANGEROUS" + "" + " arena. When players fight each other in here, they drop " + "" + "ALL" + "" + " their items on death. Gravestones do not appear." + "
" + "
" + "A non-combat zone exists at the southern end of the arena. This portal leads into that zone." + "
" + "
" + "You cannot teleport out of this arena unless you're standing in the non-combat zone."); + setScriptCallOnConfigChange(1794, new WidgetPointer(arg4), new WidgetPointer(arg5), 1147, 1046, 2, "IIY", new WidgetPointer(arg4)); + } else { + setWidgetText(new WidgetPointer(arg0), "Free-for-all: Safe"); + setWidgetText(new WidgetPointer(arg1), "This is a SAFE arena. Although players may fight each other in here, items are not dropped on death." + "
" + "
" + "You can teleport out of the arena at any time." + "
" + "
" + "A non-combat zone exists at the southern end of the arena. This portal leads into that zone."); + setScriptCallOnConfigChange(1794, new WidgetPointer(arg4), new WidgetPointer(arg5), 1147, 1045, 2, "IIY", new WidgetPointer(arg4)); + } + ivar6 = getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg0)), 496, getWidgetText(new WidgetPointer(arg0))); + ivar6 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), ivar6), 2); + ivar6 = subtract(ivar6, add(getWidgetActualWidth(new WidgetPointer(arg2)), 10)); + setWidgetPosition(ivar6, getWidgetActualY(new WidgetPointer(arg2)), 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(ivar6, getWidgetActualY(new WidgetPointer(arg3)), 2, 0, new WidgetPointer(arg3)); + return; +} diff --git a/dumps/scripts/1794.cs2 b/dumps/scripts/1794.cs2 new file mode 100644 index 000000000..8b90d2036 --- /dev/null +++ b/dumps/scripts/1794.cs2 @@ -0,0 +1,4 @@ +void script_1794(int arg0,int arg1) { + script_1795(arg0, arg1); + return; +} diff --git a/dumps/scripts/1795.cs2 b/dumps/scripts/1795.cs2 new file mode 100644 index 000000000..de5c0378a --- /dev/null +++ b/dumps/scripts/1795.cs2 @@ -0,0 +1,22 @@ +void script_1795(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 697; + ivar3 = 699; + if (((boolean)bitconfig_5279)) { + if (((boolean)bitconfig_5295)) { + setWidgetSprite(ivar3, new WidgetPointer(arg1)); + setScriptCallOnClickContextMenu(44, new WidgetPointer(arg1), ivar2, "Id", new WidgetPointer(arg0)); + } else { + setWidgetSprite(ivar2, new WidgetPointer(arg1)); + setScriptCallOnClickContextMenu(44, new WidgetPointer(arg1), ivar3, "Id", new WidgetPointer(arg0)); + } + } else if (((boolean)bitconfig_5294)) { + setWidgetSprite(ivar3, new WidgetPointer(arg1)); + setScriptCallOnClickContextMenu(44, new WidgetPointer(arg1), ivar2, "Id", new WidgetPointer(arg0)); + } else { + setWidgetSprite(ivar2, new WidgetPointer(arg1)); + setScriptCallOnClickContextMenu(44, new WidgetPointer(arg1), ivar3, "Id", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1796.cs2 b/dumps/scripts/1796.cs2 new file mode 100644 index 000000000..1307556e9 --- /dev/null +++ b/dumps/scripts/1796.cs2 @@ -0,0 +1,27 @@ +void script_1796(int arg0) { + globalint_246 = 0; + globalint_247 = 0; + globalint_248 = 0; + globalint_249 = 0; + globalint_250 = 0; + globalint_251 = 0; + if (isMember()) { + globalint_252 = 1; + globalint_253 = 0; + script_1775(); + script_1778(); + } else { + globalint_252 = 0; + globalint_253 = 0; + } + globalint_254 = 0; + globalint_255 = 0; + globalint_256 = 0; + globalint_257 = 0; + globalint_258 = 0; + globalint_259 = 0; + setScriptCallOnConfigChange(1836, 1305, 1149, 2, "Y", new WidgetPointer(arg0)); + setScriptCallOnGlobalConfigChange(1837, 259, 1, "Y", new WidgetPointer(arg0)); + setScriptCallOnGlobalStringChange(1838, new WidgetPointer(arg0), 37, 1, "IY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1797.cs2 b/dumps/scripts/1797.cs2 new file mode 100644 index 000000000..90f15ca35 --- /dev/null +++ b/dumps/scripts/1797.cs2 @@ -0,0 +1,65 @@ +void script_1797(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 0; + ivar3 = 0; + while (ivar2 < 10) { + switch (ivar2) { + case 0: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,23)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,24)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,25)); + break; + case 1: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,26)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,27)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,28)); + break; + case 2: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,29)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,30)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,31)); + break; + case 3: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,32)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,33)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,34)); + break; + case 4: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,35)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,36)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,37)); + break; + case 5: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,38)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,39)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,40)); + break; + case 6: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,41)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,42)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,43)); + break; + case 7: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,44)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,45)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,46)); + break; + case 8: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,47)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,48)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,49)); + break; + case 9: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,50)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,51)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,52)); + } + ivar3 = add(ivar3, 17); + ivar2 = add(ivar2, 1); + } + setWidgetScrollMax(0, ivar3, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/1798.cs2 b/dumps/scripts/1798.cs2 new file mode 100644 index 000000000..e2508af12 --- /dev/null +++ b/dumps/scripts/1798.cs2 @@ -0,0 +1,75 @@ +void script_1798(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 0; + ivar3 = 0; + while (ivar2 < 12) { + switch (ivar2) { + case 0: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,58)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,59)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,60)); + break; + case 1: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,61)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,62)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,63)); + break; + case 2: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,64)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,65)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,66)); + break; + case 3: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,67)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,68)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,69)); + break; + case 4: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,70)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,71)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,72)); + break; + case 5: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,73)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,74)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,75)); + break; + case 6: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,76)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,77)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,78)); + break; + case 7: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,79)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,80)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,81)); + break; + case 8: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,82)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,83)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,84)); + break; + case 9: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,85)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,86)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,87)); + break; + case 10: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,88)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,89)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,90)); + break; + case 11: + setWidgetPosition(25, ivar3, 0, 0, new WidgetPointer(791,91)); + setWidgetPosition(4, ivar3, 0, 0, new WidgetPointer(791,92)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(791,93)); + } + ivar3 = add(ivar3, 17); + ivar2 = add(ivar2, 1); + } + setWidgetScrollMax(0, ivar3, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/1799.cs2 b/dumps/scripts/1799.cs2 new file mode 100644 index 000000000..cdebc34ca --- /dev/null +++ b/dumps/scripts/1799.cs2 @@ -0,0 +1,52 @@ +void script_1799(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = 0; + ivar3 = 0; + ivar4 = -1; + while (ivar2 <= 4) { + ivar4 = cs2method_3408(105, 74, 1604, ivar2); + createExtraChild(new WidgetPointer(arg0), 5, multiply(ivar2, 4)); + setWidgetPosition(4, ivar3, 0, 0); + setWidgetSize(17, 17, 0, 0); + if (isMember() && ((boolean)getOtherCommonData(ivar4, 557))) { + setWidgetSprite(698); + } else if (((boolean)ivar2)) { + setWidgetSprite(699); + } else { + setWidgetSprite(697); + } + createExtraChild(new WidgetPointer(arg0), 4, add(multiply(ivar2, 4), 1)); + setWidgetPosition(25, ivar3, 0, 0); + setWidgetSize(25, 17, 1, 0); + setWidgetText(getOtherCommonData(ivar4, 555)); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 0); + setWidgetRGB(new Color(200, 170, 100)); + setWidgetUnknownBoolean(true); + createExtraChild(new WidgetPointer(arg0), 4, add(multiply(ivar2, 4), 2)); + setWidgetPosition(4, add(ivar3, 17), 0, 0); + setWidgetSize(8, add(multiply(getLineCount(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 8), 494, getOtherCommonData(ivar4, 556)), 10), 3), 1, 0); + setWidgetText(getOtherCommonData(ivar4, 556)); + setWidgetFont(494); + setWidgetTextAlignment(0, 0, 0); + setWidgetRGB(new Color(200, 170, 100)); + setWidgetUnknownBoolean(true); + createExtraChild(new WidgetPointer(arg0), 3, add(multiply(ivar2, 4), 3)); + setWidgetPosition(4, ivar3, 0, 0); + setWidgetSize(8, add(17, getWidgetActualHeight()), 1, 0); + cs2method2103(255); + setWidgetContextMenuOption(1, getOtherCommonData(ivar4, 555)); + setScriptCallOnClickContextMenu(1833, -2147483644, ivar2, "ii"); + ivar3 = add(ivar3, getWidgetActualHeight()); + if (ivar2 < 4) { + ivar3 = add(ivar3, 3); + } + ivar2 = add(ivar2, 1); + } + setWidgetScrollMax(0, ivar3, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/18.cs2 b/dumps/scripts/18.cs2 new file mode 100644 index 000000000..bd5aad26e --- /dev/null +++ b/dumps/scripts/18.cs2 @@ -0,0 +1,4 @@ +void script_18(int arg0) { + setWidgetBorderThickness(0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/180.cs2 b/dumps/scripts/180.cs2 new file mode 100644 index 000000000..cd2c48866 --- /dev/null +++ b/dumps/scripts/180.cs2 @@ -0,0 +1,14 @@ +void script_180(int arg0) { + if (arg0 == globalint_41) { + return; + } + if (((arg0 == 3) && (standart_config_287 > 0)) && (globalint_41 != -1)) { + return; + } + if (script_179(arg0) > 24) { + return; + } + script_183(arg0, 249); + setScriptCallOnGameloop(182, arg0, "i", cs2method_3408(105, 73, 683, arg0)); + return; +} diff --git a/dumps/scripts/1800.cs2 b/dumps/scripts/1800.cs2 new file mode 100644 index 000000000..329f5fff6 --- /dev/null +++ b/dumps/scripts/1800.cs2 @@ -0,0 +1,9 @@ +void script_1800(int arg0) { + script_915(arg0); + if (standart_config_1149 != -1) { + script_1801(); + } else { + script_1802(); + } + return; +} diff --git a/dumps/scripts/1801.cs2 b/dumps/scripts/1801.cs2 new file mode 100644 index 000000000..6577dbc56 --- /dev/null +++ b/dumps/scripts/1801.cs2 @@ -0,0 +1,9 @@ +void script_1801() { + setWidgetIsHidden(false, new WidgetPointer(791,143)); + setWidgetIsHidden(false, new WidgetPointer(791,146)); + setWidgetIsHidden(true, new WidgetPointer(791,144)); + setWidgetIsHidden(true, new WidgetPointer(791,147)); + setWidgetIsHidden(true, new WidgetPointer(791,145)); + setWidgetIsHidden(true, new WidgetPointer(791,148)); + return; +} diff --git a/dumps/scripts/1802.cs2 b/dumps/scripts/1802.cs2 new file mode 100644 index 000000000..cd73e5213 --- /dev/null +++ b/dumps/scripts/1802.cs2 @@ -0,0 +1,9 @@ +void script_1802() { + setWidgetIsHidden(true, new WidgetPointer(791,143)); + setWidgetIsHidden(true, new WidgetPointer(791,146)); + setWidgetIsHidden(false, new WidgetPointer(791,144)); + setWidgetIsHidden(false, new WidgetPointer(791,147)); + setWidgetIsHidden(false, new WidgetPointer(791,145)); + setWidgetIsHidden(false, new WidgetPointer(791,148)); + return; +} diff --git a/dumps/scripts/1803.cs2 b/dumps/scripts/1803.cs2 new file mode 100644 index 000000000..4969a518c --- /dev/null +++ b/dumps/scripts/1803.cs2 @@ -0,0 +1,5 @@ +void script_1803(int arg0,int arg1) { + cs2method2100(0, 0, new WidgetPointer(arg0)); + script_1784(); + return; +} diff --git a/dumps/scripts/1804.cs2 b/dumps/scripts/1804.cs2 new file mode 100644 index 000000000..dd4ba6fbc --- /dev/null +++ b/dumps/scripts/1804.cs2 @@ -0,0 +1,8 @@ +void script_1804(int arg0,int arg1,int arg2) { + if (isMember()) { + script_1163(arg0, arg1, arg2, 25, 250, "You may choose:" + "
" + "- Allow all spells" + "
" + "- Standard spellbook only" + "
" + "- Bind/Snare/Entangle only" + "
" + "- No Magic"); + } else { + script_1163(arg0, arg1, arg2, 25, 250, "You may choose:" + "
" + "- Standard spellbook" + "
" + "- Bind only" + "
" + "- No Magic"); + } + return; +} diff --git a/dumps/scripts/1805.cs2 b/dumps/scripts/1805.cs2 new file mode 100644 index 000000000..67e73d2ff --- /dev/null +++ b/dumps/scripts/1805.cs2 @@ -0,0 +1,4 @@ +void script_1805() { + script_1806(globalstring_22); + return; +} diff --git a/dumps/scripts/1806.cs2 b/dumps/scripts/1806.cs2 new file mode 100644 index 000000000..022f1319e --- /dev/null +++ b/dumps/scripts/1806.cs2 @@ -0,0 +1,30 @@ +void script_1806(string arg0) { + int ivar0; + script_1548(12); + arg0 = lower(strRemoveEntities(arg0)); + ivar0 = strLength(arg0); + arg0 = script_2332(arg0, "_", "\u00a0"); + arg0 = script_2332(arg0, " ", "\u00a0"); + while (((boolean)strIndexof(0, arg0, " ")) && (ivar0 > 0)) { + arg0 = substr(1, ivar0, arg0); + ivar0 = strLength(arg0); + } + while ((strIndexof(subtract(ivar0, 1), arg0, " ") == subtract(ivar0, 1)) && (ivar0 > 0)) { + arg0 = substr(0, subtract(ivar0, 1), arg0); + ivar0 = strLength(arg0); + } + if (((boolean)stringMethod4107(globalstring_38, arg0))) { + messageType0("Caller not changed."); + return; + } + globalstring_38 = arg0; + if (strLength(globalstring_38) > 0) { + messageType0("Caller set: " + script_1814(globalstring_38)); + } else { + messageType0("Caller feature disabled."); + } + script_1809(17367062, 17367064, 17367065); + script_1809(51707918, 51707920, 51707921); + script_1809(72876037, 72876039, 72876040); + return; +} diff --git a/dumps/scripts/1807.cs2 b/dumps/scripts/1807.cs2 new file mode 100644 index 000000000..058b2e315 --- /dev/null +++ b/dumps/scripts/1807.cs2 @@ -0,0 +1,11 @@ +void script_1807(int arg0,int arg1,int arg2) { + if (((boolean)script_42(globalint_266))) { + globalstring_38 = ""; + globalstring_39 = ""; + globalint_266 = 1; + } + script_1809(arg0, arg1, arg2); + setScriptCallOnGlobalStringChange(1808, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), 38, 1, "IIIY", new WidgetPointer(arg0)); + setScriptCallOnMessage(1810, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), "III", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1808.cs2 b/dumps/scripts/1808.cs2 new file mode 100644 index 000000000..b4b067925 --- /dev/null +++ b/dumps/scripts/1808.cs2 @@ -0,0 +1,5 @@ +void script_1808(int arg0,int arg1,int arg2) { + script_1548(12); + script_1809(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1809.cs2 b/dumps/scripts/1809.cs2 new file mode 100644 index 000000000..c54fe7e0d --- /dev/null +++ b/dumps/scripts/1809.cs2 @@ -0,0 +1,16 @@ +void script_1809(int arg0,int arg1,int arg2) { + string svar0; + svar0 = ""; + if (strLength(globalstring_38) > 0) { + svar0 = script_1814(globalstring_38); + setWidgetText(new WidgetPointer(arg1), svar0); + setWidgetSize(getMaxLineWidth(512, 496, svar0), 15, 0, 0, new WidgetPointer(arg1)); + } else { + setWidgetText(new WidgetPointer(arg1), ""); + setWidgetSize(0, 15, 0, 0, new WidgetPointer(arg1)); + } + globalint_267 = -1; + globalstring_39 = ""; + script_1811(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/181.cs2 b/dumps/scripts/181.cs2 new file mode 100644 index 000000000..77ca298a5 --- /dev/null +++ b/dumps/scripts/181.cs2 @@ -0,0 +1,13 @@ +void script_181(int arg0) { + script_183(arg0, 0); + if (((boolean)arg0)) { + script_183(1, 0); + script_183(2, 0); + script_183(3, 0); + script_183(4, 0); + script_183(5, 0); + script_183(6, 0); + script_183(7, 0); + } + return; +} diff --git a/dumps/scripts/1810.cs2 b/dumps/scripts/1810.cs2 new file mode 100644 index 000000000..43553f3c6 --- /dev/null +++ b/dumps/scripts/1810.cs2 @@ -0,0 +1,4 @@ +void script_1810(int arg0,int arg1,int arg2) { + script_1811(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/1811.cs2 b/dumps/scripts/1811.cs2 new file mode 100644 index 000000000..2542d1607 --- /dev/null +++ b/dumps/scripts/1811.cs2 @@ -0,0 +1,46 @@ +void script_1811(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + string svar0; + if (((boolean)strLength(globalstring_38))) { + script_1812(arg2, ""); + return; + } + ivar3 = subtract(min(cs2method5017(), 100), 1); + svar0 = ""; + ivar4 = -1; + while (ivar3 >= 0) { + switch (cs2method5004(ivar3)) { + case 1: + case 2: + case 3: + case 7: + case 42: + case 9: + case 11: + case 41: + case 44: + case 45: + case 17: + case 18: + case 20: + case 25: + case 24: + if (((boolean)stringMethod4107(lower(strRemoveEntities(cs2method5010(ivar3))), globalstring_38))) { + svar0 = cs2method5003(ivar3); + ivar4 = ivar3; + } + } + ivar3 = subtract(ivar3, 1); + } + if (ivar4 < 0) { + globalint_267 = -1; + script_1812(arg2, ""); + return; + } + if (((globalint_267 == -1) || (ivar4 <= globalint_267)) || (stringMethod4107(svar0, globalstring_39) != 0)) { + script_1812(arg2, svar0); + } + globalint_267 = ivar4; + return; +} diff --git a/dumps/scripts/1812.cs2 b/dumps/scripts/1812.cs2 new file mode 100644 index 000000000..0072399ff --- /dev/null +++ b/dumps/scripts/1812.cs2 @@ -0,0 +1,12 @@ +void script_1812(int arg0,string arg1) { + if (((boolean)strLength(arg1))) { + setWidgetText(new WidgetPointer(arg0), ""); + globalstring_39 = ""; + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + } + setWidgetText(new WidgetPointer(arg0), arg1); + globalstring_39 = arg1; + setScriptCallOnGameloop(1813, add(getClientCycle(), 1000), new WidgetPointer(arg0), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1813.cs2 b/dumps/scripts/1813.cs2 new file mode 100644 index 000000000..3241d8d36 --- /dev/null +++ b/dumps/scripts/1813.cs2 @@ -0,0 +1,7 @@ +void script_1813(int arg0,int arg1) { + if (getClientCycle() >= arg0) { + setWidgetText(new WidgetPointer(arg1), ""); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1814.cs2 b/dumps/scripts/1814.cs2 new file mode 100644 index 000000000..f9c09b5b4 --- /dev/null +++ b/dumps/scripts/1814.cs2 @@ -0,0 +1,36 @@ +string script_1814(string arg0) { + int ivar0; + string svar1; + ivar0 = strLength(arg0); + if (ivar0 <= 0) { + return arg0; + } + svar1 = concat("\u00a0", arg0); + svar1 = script_2332(svar1, "\u00a0a", "\u00a0A"); + svar1 = script_2332(svar1, "\u00a0b", "\u00a0B"); + svar1 = script_2332(svar1, "\u00a0c", "\u00a0C"); + svar1 = script_2332(svar1, "\u00a0d", "\u00a0D"); + svar1 = script_2332(svar1, "\u00a0e", "\u00a0E"); + svar1 = script_2332(svar1, "\u00a0f", "\u00a0F"); + svar1 = script_2332(svar1, "\u00a0g", "\u00a0G"); + svar1 = script_2332(svar1, "\u00a0h", "\u00a0H"); + svar1 = script_2332(svar1, "\u00a0i", "\u00a0I"); + svar1 = script_2332(svar1, "\u00a0j", "\u00a0J"); + svar1 = script_2332(svar1, "\u00a0k", "\u00a0K"); + svar1 = script_2332(svar1, "\u00a0l", "\u00a0L"); + svar1 = script_2332(svar1, "\u00a0m", "\u00a0M"); + svar1 = script_2332(svar1, "\u00a0n", "\u00a0N"); + svar1 = script_2332(svar1, "\u00a0o", "\u00a0O"); + svar1 = script_2332(svar1, "\u00a0p", "\u00a0P"); + svar1 = script_2332(svar1, "\u00a0q", "\u00a0Q"); + svar1 = script_2332(svar1, "\u00a0r", "\u00a0R"); + svar1 = script_2332(svar1, "\u00a0s", "\u00a0S"); + svar1 = script_2332(svar1, "\u00a0t", "\u00a0T"); + svar1 = script_2332(svar1, "\u00a0u", "\u00a0U"); + svar1 = script_2332(svar1, "\u00a0v", "\u00a0V"); + svar1 = script_2332(svar1, "\u00a0w", "\u00a0W"); + svar1 = script_2332(svar1, "\u00a0x", "\u00a0X"); + svar1 = script_2332(svar1, "\u00a0y", "\u00a0Y"); + svar1 = script_2332(svar1, "\u00a0z", "\u00a0Z"); + return substr(1, add(ivar0, 1), svar1); +} diff --git a/dumps/scripts/1815.cs2 b/dumps/scripts/1815.cs2 new file mode 100644 index 000000000..818f8a157 --- /dev/null +++ b/dumps/scripts/1815.cs2 @@ -0,0 +1,11 @@ +int script_1815() { + int ivar0; + int ivar1; + ivar0 = getWidgetActualX(); + ivar1 = getWidgetParentId(); + while (ivar1 != -1) { + ivar0 = subtract(add(ivar0, getWidgetActualX(new WidgetPointer(ivar1))), cs2method2600(new WidgetPointer(ivar1))); + ivar1 = getWidgetParentId(new WidgetPointer(ivar1)); + } + return ivar0; +} diff --git a/dumps/scripts/1816.cs2 b/dumps/scripts/1816.cs2 new file mode 100644 index 000000000..15e62703d --- /dev/null +++ b/dumps/scripts/1816.cs2 @@ -0,0 +1,56 @@ +void script_1816(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + switch (globalint_268) { + case 4: + script_1817(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "Your clan knocked the enemy right out of the arena."); + break; + case 5: + script_1817(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "Your clan reached the target kill-count."); + break; + case 6: + script_1817(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "Your clan had the highest kill-count when the time expired."); + break; + case 7: + script_1817(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "Your clan had the most survivors when the time expired."); + break; + case 8: + script_1818(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "Your clan was knocked right out of the arena."); + break; + case 9: + script_1818(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "Your enemy reached the target kill-count."); + break; + case 10: + script_1818(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "Your enemy had the highest kill-count when the time expired."); + break; + case 11: + script_1818(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "Your enemy had the most survivors when the time expired."); + break; + case 1: + script_1819(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "The match was aborted due to a lack of fighters."); + break; + case 2: + script_1819(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "Your kill-counts were equal."); + break; + case 3: + script_1819(arg0, arg1, arg2, arg3, arg4, arg5); + setWidgetText(new WidgetPointer(arg2), "You had equal numbers of survivors."); + break; + default: + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + } + return; +} diff --git a/dumps/scripts/1817.cs2 b/dumps/scripts/1817.cs2 new file mode 100644 index 000000000..89359a2b7 --- /dev/null +++ b/dumps/scripts/1817.cs2 @@ -0,0 +1,16 @@ +void script_1817(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetText(new WidgetPointer(arg0), "Victory!"); + setWidgetPosition(75, 89, 0, 0, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg1), "Your clan is victorious."); + setWidgetPosition(79, 130, 0, 0, new WidgetPointer(arg1)); + setWidgetPosition(79, 180, 0, 0, new WidgetPointer(arg2)); + setWidgetSize(175, 125, 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(52, 118, 0, 0, new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + return; +} diff --git a/dumps/scripts/1818.cs2 b/dumps/scripts/1818.cs2 new file mode 100644 index 000000000..ad5094950 --- /dev/null +++ b/dumps/scripts/1818.cs2 @@ -0,0 +1,16 @@ +void script_1818(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetText(new WidgetPointer(arg0), "Defeat!"); + setWidgetPosition(64, 49, 0, 0, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg1), "Your clan has been defeated."); + setWidgetPosition(41, 93, 0, 0, new WidgetPointer(arg1)); + setWidgetPosition(41, 179, 0, 0, new WidgetPointer(arg2)); + setWidgetSize(180, 125, 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(38, 81, 0, 0, new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(false, new WidgetPointer(arg5)); + return; +} diff --git a/dumps/scripts/1819.cs2 b/dumps/scripts/1819.cs2 new file mode 100644 index 000000000..bcae6ed30 --- /dev/null +++ b/dumps/scripts/1819.cs2 @@ -0,0 +1,16 @@ +void script_1819(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetText(new WidgetPointer(arg0), "Draw!"); + setWidgetPosition(75, 89, 0, 0, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg1), "It's a draw."); + setWidgetPosition(79, 130, 0, 0, new WidgetPointer(arg1)); + setWidgetPosition(79, 180, 0, 0, new WidgetPointer(arg2)); + setWidgetSize(175, 125, 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(52, 118, 0, 0, new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + return; +} diff --git a/dumps/scripts/182.cs2 b/dumps/scripts/182.cs2 new file mode 100644 index 000000000..f9b422c44 --- /dev/null +++ b/dumps/scripts/182.cs2 @@ -0,0 +1,18 @@ +void script_182(int arg0) { + int ivar1; + int ivar2; + ivar1 = script_179(arg0); + ivar2 = 0; + if (((boolean)mod(ivar1, 25))) { + script_178(); + ivar2 = divide(ivar1, 25); + if (ivar2 <= 1) { + setScriptCallOnGameloop(-1, "", cs2method_3408(105, 73, 683, arg0)); + } else { + script_183(arg0, subtract(ivar1, 1)); + } + } else { + script_183(arg0, subtract(ivar1, 1)); + } + return; +} diff --git a/dumps/scripts/1820.cs2 b/dumps/scripts/1820.cs2 new file mode 100644 index 000000000..d5c0aee33 --- /dev/null +++ b/dumps/scripts/1820.cs2 @@ -0,0 +1,9 @@ +int script_1820(int arg0) { + if (standart_config_1149 == -1) { + return 0; + } + if (arg0 != 1) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/1821.cs2 b/dumps/scripts/1821.cs2 new file mode 100644 index 000000000..edd123035 --- /dev/null +++ b/dumps/scripts/1821.cs2 @@ -0,0 +1,10 @@ +void script_1821(int arg0,int arg1) { + if (((boolean)script_1820(arg0))) { + return; + } + if (globalint_246 != arg1) { + globalint_246 = arg1; + script_1770(); + } + return; +} diff --git a/dumps/scripts/1822.cs2 b/dumps/scripts/1822.cs2 new file mode 100644 index 000000000..db16fb8c7 --- /dev/null +++ b/dumps/scripts/1822.cs2 @@ -0,0 +1,10 @@ +void script_1822(int arg0,int arg1) { + if (((boolean)script_1820(arg0))) { + return; + } + if (globalint_247 != arg1) { + globalint_247 = arg1; + script_1771(); + } + return; +} diff --git a/dumps/scripts/1823.cs2 b/dumps/scripts/1823.cs2 new file mode 100644 index 000000000..08736acf5 --- /dev/null +++ b/dumps/scripts/1823.cs2 @@ -0,0 +1,10 @@ +void script_1823(int arg0) { + if (((boolean)script_1820(arg0))) { + return; + } + if (((boolean)globalint_248)) { + globalint_248 = 0; + script_1772(); + } + return; +} diff --git a/dumps/scripts/1824.cs2 b/dumps/scripts/1824.cs2 new file mode 100644 index 000000000..ae48c631d --- /dev/null +++ b/dumps/scripts/1824.cs2 @@ -0,0 +1,10 @@ +void script_1824(int arg0) { + if (((boolean)script_1820(arg0))) { + return; + } + if (((boolean)globalint_248)) { + globalint_248 = 1; + script_1772(); + } + return; +} diff --git a/dumps/scripts/1825.cs2 b/dumps/scripts/1825.cs2 new file mode 100644 index 000000000..b6777b7b4 --- /dev/null +++ b/dumps/scripts/1825.cs2 @@ -0,0 +1,12 @@ +void script_1825(int arg0) { + if (((boolean)script_1820(arg0))) { + return; + } + if (((boolean)globalint_249)) { + globalint_249 = 1; + } else { + globalint_249 = 0; + } + script_1773(); + return; +} diff --git a/dumps/scripts/1826.cs2 b/dumps/scripts/1826.cs2 new file mode 100644 index 000000000..cd1db6f1f --- /dev/null +++ b/dumps/scripts/1826.cs2 @@ -0,0 +1,12 @@ +void script_1826(int arg0) { + if (((boolean)script_1820(arg0))) { + return; + } + if (((boolean)globalint_250)) { + globalint_250 = 1; + } else { + globalint_250 = 0; + } + script_1774(); + return; +} diff --git a/dumps/scripts/1827.cs2 b/dumps/scripts/1827.cs2 new file mode 100644 index 000000000..82625ac10 --- /dev/null +++ b/dumps/scripts/1827.cs2 @@ -0,0 +1,18 @@ +void script_1827(int arg0) { + if (((boolean)script_1820(arg0))) { + return; + } + if (isMember()) { + if (((boolean)globalint_252)) { + globalint_252 = 2; + } else if (globalint_252 == 2) { + globalint_252 = 3; + } else { + globalint_252 = 1; + } + } else { + globalint_252 = mod(add(globalint_252, 1), 4); + } + script_1775(); + return; +} diff --git a/dumps/scripts/1828.cs2 b/dumps/scripts/1828.cs2 new file mode 100644 index 000000000..96e588a3c --- /dev/null +++ b/dumps/scripts/1828.cs2 @@ -0,0 +1,12 @@ +void script_1828(int arg0) { + if (((boolean)script_1820(arg0))) { + return; + } + if (((boolean)globalint_251)) { + globalint_251 = 1; + } else { + globalint_251 = 0; + } + script_1776(); + return; +} diff --git a/dumps/scripts/1829.cs2 b/dumps/scripts/1829.cs2 new file mode 100644 index 000000000..d95d002dc --- /dev/null +++ b/dumps/scripts/1829.cs2 @@ -0,0 +1,12 @@ +void script_1829(int arg0) { + if (((boolean)script_1820(arg0))) { + return; + } + if (((boolean)globalint_256)) { + globalint_256 = 1; + } else { + globalint_256 = 0; + } + script_1777(); + return; +} diff --git a/dumps/scripts/183.cs2 b/dumps/scripts/183.cs2 new file mode 100644 index 000000000..200aa5ab7 --- /dev/null +++ b/dumps/scripts/183.cs2 @@ -0,0 +1,25 @@ +void script_183(int arg0,int arg1) { + switch (arg0) { + case 1: + globalint_44 = arg1; + break; + case 2: + globalint_45 = arg1; + break; + case 3: + globalint_46 = arg1; + break; + case 4: + globalint_47 = arg1; + break; + case 5: + globalint_48 = arg1; + break; + case 6: + globalint_49 = arg1; + break; + case 7: + globalint_1511 = arg1; + } + return; +} diff --git a/dumps/scripts/1830.cs2 b/dumps/scripts/1830.cs2 new file mode 100644 index 000000000..f03f65811 --- /dev/null +++ b/dumps/scripts/1830.cs2 @@ -0,0 +1,15 @@ +void script_1830(int arg0) { + if (isMember()) { + return; + } + if (((boolean)script_1820(arg0))) { + return; + } + if (((boolean)globalint_253)) { + globalint_253 = 1; + } else { + globalint_253 = 0; + } + script_1778(); + return; +} diff --git a/dumps/scripts/1831.cs2 b/dumps/scripts/1831.cs2 new file mode 100644 index 000000000..139697a0d --- /dev/null +++ b/dumps/scripts/1831.cs2 @@ -0,0 +1,12 @@ +void script_1831(int arg0) { + if (((boolean)script_1820(arg0))) { + return; + } + if (((boolean)globalint_254)) { + globalint_254 = 1; + } else { + globalint_254 = 0; + } + script_1779(); + return; +} diff --git a/dumps/scripts/1832.cs2 b/dumps/scripts/1832.cs2 new file mode 100644 index 000000000..ad67bed4c --- /dev/null +++ b/dumps/scripts/1832.cs2 @@ -0,0 +1,12 @@ +void script_1832(int arg0) { + if (((boolean)script_1820(arg0))) { + return; + } + if (((boolean)globalint_255)) { + globalint_255 = 1; + } else { + globalint_255 = 0; + } + script_1780(); + return; +} diff --git a/dumps/scripts/1833.cs2 b/dumps/scripts/1833.cs2 new file mode 100644 index 000000000..8be2ee40b --- /dev/null +++ b/dumps/scripts/1833.cs2 @@ -0,0 +1,13 @@ +void script_1833(int arg0,int arg1) { + if (((boolean)script_1820(arg0))) { + return; + } + if (isMember() && ((boolean)getOtherCommonData(cs2method_3408(105, 74, 1604, arg1), 557))) { + return; + } + if (globalint_257 != arg1) { + globalint_257 = arg1; + script_1781(); + } + return; +} diff --git a/dumps/scripts/1834.cs2 b/dumps/scripts/1834.cs2 new file mode 100644 index 000000000..6f4df3c2c --- /dev/null +++ b/dumps/scripts/1834.cs2 @@ -0,0 +1,13 @@ +void script_1834(int arg0) { + if (arg0 != 1) { + return; + } + if (((((boolean)globalint_250) && (globalint_252 >= 2)) && ((boolean)globalint_251)) && (isMember() || ((boolean)globalint_253))) { + return; + } + if (((boolean)globalint_258)) { + globalint_258 = 1; + script_1782(); + } + return; +} diff --git a/dumps/scripts/1835.cs2 b/dumps/scripts/1835.cs2 new file mode 100644 index 000000000..a01cf0ece --- /dev/null +++ b/dumps/scripts/1835.cs2 @@ -0,0 +1,4 @@ +void script_1835(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + script_2784(-1, arg0, arg1, arg2, arg3, arg4, arg5, arg6); + return; +} diff --git a/dumps/scripts/1836.cs2 b/dumps/scripts/1836.cs2 new file mode 100644 index 000000000..57b7bec68 --- /dev/null +++ b/dumps/scripts/1836.cs2 @@ -0,0 +1,53 @@ +void script_1836() { + if (globalint_246 != bitconfig_5280) { + globalint_246 = bitconfig_5280; + script_1770(); + } + if (globalint_247 != bitconfig_5281) { + globalint_247 = bitconfig_5281; + script_1771(); + } + if (script_42(globalint_248) != bitconfig_5282) { + globalint_248 = script_734(bitconfig_5282); + script_1772(); + } + if (script_42(globalint_249) != bitconfig_5283) { + globalint_249 = script_734(bitconfig_5283); + script_1773(); + } + if (script_42(globalint_250) != bitconfig_5284) { + globalint_250 = script_734(bitconfig_5284); + script_1774(); + } + if (globalint_252 != bitconfig_5286) { + globalint_252 = bitconfig_5286; + script_1775(); + } + if (script_42(globalint_251) != bitconfig_5285) { + globalint_251 = script_734(bitconfig_5285); + script_1776(); + } + if (script_42(globalint_256) != bitconfig_5290) { + globalint_256 = script_734(bitconfig_5290); + script_1777(); + } + if (script_42(globalint_253) != bitconfig_5287) { + globalint_253 = script_734(bitconfig_5287); + script_1778(); + } + if (script_42(globalint_254) != bitconfig_5288) { + globalint_254 = script_734(bitconfig_5288); + script_1779(); + } + if (script_42(globalint_255) != bitconfig_5289) { + globalint_255 = script_734(bitconfig_5289); + script_1780(); + } + if (globalint_257 != bitconfig_5292) { + globalint_257 = bitconfig_5292; + script_1781(); + } + globalint_258 = script_734(bitconfig_5293); + script_1782(); + return; +} diff --git a/dumps/scripts/1837.cs2 b/dumps/scripts/1837.cs2 new file mode 100644 index 000000000..38c4d80ca --- /dev/null +++ b/dumps/scripts/1837.cs2 @@ -0,0 +1,4 @@ +void script_1837() { + script_1782(); + return; +} diff --git a/dumps/scripts/1838.cs2 b/dumps/scripts/1838.cs2 new file mode 100644 index 000000000..de39b8102 --- /dev/null +++ b/dumps/scripts/1838.cs2 @@ -0,0 +1,4 @@ +void script_1838(int arg0) { + setWidgetText(new WidgetPointer(arg0), globalstring_37); + return; +} diff --git a/dumps/scripts/1839.cs2 b/dumps/scripts/1839.cs2 new file mode 100644 index 000000000..141e4c130 --- /dev/null +++ b/dumps/scripts/1839.cs2 @@ -0,0 +1,88 @@ +void script_1839(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + flow_0: + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = script_285(arg1, ivar7); + createExtraChild(new WidgetPointer(arg1), 5, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetPosition(0, ivar7, 0, 0); + setWidgetSize(0, 5, 1, 0); + setWidgetSprite(1121); + cs2method1107(1); + ivar7 = add(ivar7, 4); + globalarray_0 = new int[add(105, 1)]; + ivar8 = -1; + ivar9 = -1; + IF (((boolean)arg0)) + GOTO flow_1 + GOTO flow_7 + flow_1: + IF (ivar4 <= 105) + GOTO flow_2 + GOTO flow_6 + flow_2: + ivar8 = cs2method_3408(105, 74, 1805, ivar4); + if ((ivar8 != -1) && (isMember() || ((boolean)getOtherCommonData(ivar8, 478)))) { + ivar7 = script_1840(arg1, ivar4, ivar7); + } + ivar4 = add(ivar4, 1); + GOTO flow_1 + flow_6: + setWidgetText(new WidgetPointer(arg3), "Key order:" + "
" + "Traditional"); + GOTO flow_28 + flow_7: + IF (ivar4 <= 105) + GOTO flow_8 + GOTO flow_12 + flow_8: + ivar8 = cs2method_3408(105, 74, 1805, ivar4); + if ((ivar8 != -1) && (isMember() || ((boolean)getOtherCommonData(ivar8, 478)))) { + globalarray_0[ivar6] = ivar4; + ivar6 = add(ivar6, 1); + } + ivar4 = add(ivar4, 1); + GOTO flow_7 + flow_12: + ivar6 = subtract(ivar6, 1); + ivar4 = 0; + if (((boolean)arg0)) { + script_1842(0, 0, ivar6); + while (ivar4 <= ivar6) { + ivar7 = script_1840(arg1, globalarray_0[ivar4], ivar7); + ivar4 = add(ivar4, 1); + } + setWidgetText(new WidgetPointer(arg3), "Key order:" + "
" + "Alphabetical"); + } else { + if (arg0 == 2) { + script_1843(0, 0, ivar6); + while (ivar9 < getCommonDefinitionSize(1806)) { + ivar7 = script_1841(arg1, ivar9, ivar7); + while (getOtherCommonData(cs2method_3408(105, 74, 1805, globalarray_0[ivar5]), 597) == ivar9) { + ivar5 = add(ivar5, 1); + } + script_1842(0, ivar4, subtract(ivar5, 1)); + while (ivar4 < ivar5) { + ivar7 = script_1840(arg1, globalarray_0[ivar4], ivar7); + ivar4 = add(ivar4, 1); + } + ivar9 = add(ivar9, 1); + } + setWidgetText(new WidgetPointer(arg3), "Key order:" + "
" + "Categorised"); + } + } + flow_28: + ivar7 = add(ivar7, 5); + setWidgetScrollMax(0, ivar7, new WidgetPointer(arg1)); + script_31(arg2, arg1, 792, 789, 790, 791, 773, 788); + if (setWidgetRegister(new WidgetPointer(arg2), 1)) { + script_37(arg2, arg1, cs2method2601(new WidgetPointer(arg1)), 1); + } + return; +} diff --git a/dumps/scripts/184.cs2 b/dumps/scripts/184.cs2 new file mode 100644 index 000000000..7d69db0cc --- /dev/null +++ b/dumps/scripts/184.cs2 @@ -0,0 +1,29 @@ +void script_184(int arg0,int arg1) { + switch (arg0) { + case 1: + if (arg1 > 0) { + bitconfig_6161 = 1; + } else { + bitconfig_6161 = 0; + } + break; + case 2: + cs2method5001(arg1, cs2method5005(), cs2method5016()); + break; + case 3: + cs2method5001(cs2method5000(), arg1, cs2method5016()); + break; + case 4: + standart_config_2159 = arg1; + break; + case 5: + cs2method5001(cs2method5000(), cs2method5005(), arg1); + break; + case 6: + standart_config_1055 = arg1; + break; + case 7: + standart_config_1054 = arg1; + } + return; +} diff --git a/dumps/scripts/1840.cs2 b/dumps/scripts/1840.cs2 new file mode 100644 index 000000000..91e315762 --- /dev/null +++ b/dumps/scripts/1840.cs2 @@ -0,0 +1,36 @@ +int script_1840(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + string svar0; + ivar3 = cs2method_3408(105, 74, 1805, arg1); + if (ivar3 == -1) { + return arg2; + } + svar0 = getOtherCommonData(ivar3, 596); + ivar4 = getOtherCommonData(ivar3, 477); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(3, arg2, 0, 0); + setWidgetSize(15, 15, 0, 0); + setWidgetPosition(add(getWidgetActualX(), getWidgetActualWidth()), arg2, 0, 0); + setWidgetSize(add(getWidgetActualX(), getWidgetActualX()), getWidgetActualHeight(), 1, 0); + setWidgetSprite(getOtherCommonData(ivar3, 595)); + setWidgetRGB(new Color(175, 175, 175)); + setWidgetFont(495); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(svar0); + if (ivar4 != -1) { + cs2method1305("" + svar0 + ""); + cs2method1305("" + svar0 + ""); + setWidgetContextMenuOption(1, "Highlight"); + setWidgetContextMenuOption(1, "Highlight"); + setScriptCallOnClickContextMenu(288, ivar4, "y"); + setScriptCallOnClickContextMenu(288, ivar4, "y"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + } + return add(arg2, getWidgetActualHeight()); +} diff --git a/dumps/scripts/1841.cs2 b/dumps/scripts/1841.cs2 new file mode 100644 index 000000000..4d9f70152 --- /dev/null +++ b/dumps/scripts/1841.cs2 @@ -0,0 +1,11 @@ +int script_1841(int arg0,int arg1,int arg2) { + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetText(cs2method_3408(105, 115, 1806, arg1)); + setWidgetPosition(0, arg2, 0, 0); + setWidgetSize(0, 30, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetFont(496); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(1, 1, 0); + return add(arg2, getWidgetActualHeight()); +} diff --git a/dumps/scripts/1842.cs2 b/dumps/scripts/1842.cs2 new file mode 100644 index 000000000..9a3b332ae --- /dev/null +++ b/dumps/scripts/1842.cs2 @@ -0,0 +1,38 @@ +void script_1842(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + ivar3 = divide(add(arg1, arg2), 2); + ivar4 = globalarray_0[ivar3]; + globalarray_0[ivar3] = globalarray_0[arg2]; + globalarray_0[arg2] = ivar4; + ivar5 = arg1; + ivar6 = arg1; + ivar7 = 0; + ivar8 = -1; + ivar9 = -1; + while (ivar6 < arg2) { + ivar8 = cs2method_3408(105, 74, 1805, globalarray_0[ivar6]); + ivar9 = cs2method_3408(105, 74, 1805, ivar4); + if (stringMethod4107(lower(getOtherCommonData(ivar8, 596)), lower(getOtherCommonData(ivar9, 596))) < bitAnd(ivar6, 1)) { + ivar7 = globalarray_0[ivar6]; + globalarray_0[ivar6] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar7; + ivar5 = add(ivar5, 1); + } + ivar6 = add(ivar6, 1); + } + globalarray_0[arg2] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar4; + if (arg1 < subtract(ivar5, 1)) { + script_1842(0, arg1, subtract(ivar5, 1)); + } + if (add(ivar5, 1) < arg2) { + script_1842(0, add(ivar5, 1), arg2); + } + return; +} diff --git a/dumps/scripts/1843.cs2 b/dumps/scripts/1843.cs2 new file mode 100644 index 000000000..773e2a002 --- /dev/null +++ b/dumps/scripts/1843.cs2 @@ -0,0 +1,38 @@ +void script_1843(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + ivar3 = divide(add(arg1, arg2), 2); + ivar4 = globalarray_0[ivar3]; + globalarray_0[ivar3] = globalarray_0[arg2]; + globalarray_0[arg2] = ivar4; + ivar5 = arg1; + ivar6 = arg1; + ivar7 = 0; + ivar8 = -1; + ivar9 = -1; + while (ivar6 < arg2) { + ivar8 = cs2method_3408(105, 74, 1805, globalarray_0[ivar6]); + ivar9 = cs2method_3408(105, 74, 1805, ivar4); + if (getOtherCommonData(ivar8, 597) < getOtherCommonData(ivar9, 597)) { + ivar7 = globalarray_0[ivar6]; + globalarray_0[ivar6] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar7; + ivar5 = add(ivar5, 1); + } + ivar6 = add(ivar6, 1); + } + globalarray_0[arg2] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar4; + if (arg1 < subtract(ivar5, 1)) { + script_1843(0, arg1, subtract(ivar5, 1)); + } + if (add(ivar5, 1) < arg2) { + script_1843(0, add(ivar5, 1), arg2); + } + return; +} diff --git a/dumps/scripts/1844.cs2 b/dumps/scripts/1844.cs2 new file mode 100644 index 000000000..0996ccdb2 --- /dev/null +++ b/dumps/scripts/1844.cs2 @@ -0,0 +1,505 @@ +int script_1844(int arg0) { + switch (arg0) { + case 0: + return globalint_0; + case 1: + return globalint_274; + case 2: + return globalint_275; + case 3: + return globalint_276; + case 4: + return globalint_277; + case 5: + return globalint_278; + case 6: + return globalint_279; + case 7: + return globalint_280; + case 8: + return globalint_281; + case 9: + return globalint_282; + case 10: + return globalint_283; + case 11: + return globalint_284; + case 12: + return globalint_285; + case 13: + return globalint_286; + case 14: + return globalint_287; + case 15: + return globalint_288; + case 16: + return globalint_289; + case 17: + return globalint_290; + case 18: + return globalint_291; + case 19: + return globalint_292; + case 20: + return globalint_293; + case 21: + return globalint_294; + case 22: + return globalint_295; + case 23: + return globalint_296; + case 24: + return globalint_297; + case 25: + return globalint_298; + case 26: + return globalint_299; + case 27: + return globalint_300; + case 28: + return globalint_301; + case 29: + return globalint_302; + case 30: + return globalint_303; + case 31: + return globalint_304; + case 32: + return globalint_305; + case 33: + return globalint_306; + case 34: + return globalint_307; + case 35: + return globalint_308; + case 36: + return globalint_309; + case 37: + return globalint_310; + case 38: + return globalint_311; + case 39: + return globalint_312; + case 40: + return globalint_313; + case 41: + return globalint_314; + case 42: + return globalint_315; + case 43: + return globalint_316; + case 44: + return globalint_317; + case 45: + return globalint_318; + case 46: + return globalint_319; + case 47: + return globalint_320; + case 48: + return globalint_321; + case 49: + return globalint_322; + case 50: + return globalint_323; + case 51: + return globalint_324; + case 52: + return globalint_325; + case 53: + return globalint_326; + case 54: + return globalint_327; + case 55: + return globalint_328; + case 56: + return globalint_329; + case 57: + return globalint_330; + case 58: + return globalint_331; + case 59: + return globalint_332; + case 60: + return globalint_333; + case 61: + return globalint_334; + case 62: + return globalint_335; + case 63: + return globalint_336; + case 64: + return globalint_337; + case 65: + return globalint_338; + case 66: + return globalint_339; + case 67: + return globalint_340; + case 68: + return globalint_341; + case 69: + return globalint_342; + case 70: + return globalint_343; + case 71: + return globalint_344; + case 72: + return globalint_345; + case 73: + return globalint_346; + case 74: + return globalint_347; + case 75: + return globalint_348; + case 76: + return globalint_349; + case 77: + return globalint_350; + case 78: + return globalint_351; + case 79: + return globalint_352; + case 80: + return globalint_353; + case 81: + return globalint_354; + case 82: + return globalint_355; + case 83: + return globalint_356; + case 84: + return globalint_357; + case 85: + return globalint_358; + case 86: + return globalint_359; + case 87: + return globalint_360; + case 88: + return globalint_361; + case 89: + return globalint_362; + case 90: + return globalint_363; + case 91: + return globalint_364; + case 92: + return globalint_365; + case 93: + return globalint_366; + case 94: + return globalint_367; + case 95: + return globalint_368; + case 96: + return globalint_369; + case 97: + return globalint_370; + case 98: + return globalint_371; + case 99: + return globalint_372; + case 100: + return globalint_373; + case 101: + return globalint_374; + case 102: + return globalint_375; + case 103: + return globalint_376; + case 104: + return globalint_377; + case 105: + return globalint_378; + case 106: + return globalint_379; + case 107: + return globalint_380; + case 108: + return globalint_381; + case 109: + return globalint_382; + case 110: + return globalint_383; + case 111: + return globalint_384; + case 112: + return globalint_385; + case 113: + return globalint_386; + case 114: + return globalint_387; + case 115: + return globalint_388; + case 116: + return globalint_389; + case 117: + return globalint_390; + case 118: + return globalint_391; + case 119: + return globalint_392; + case 120: + return globalint_393; + case 121: + return globalint_394; + case 122: + return globalint_395; + case 123: + return globalint_396; + case 124: + return globalint_397; + case 125: + return globalint_398; + case 126: + return globalint_399; + case 127: + return globalint_400; + case 128: + return globalint_401; + case 129: + return globalint_402; + case 130: + return globalint_403; + case 131: + return globalint_404; + case 132: + return globalint_405; + case 133: + return globalint_406; + case 134: + return globalint_407; + case 135: + return globalint_408; + case 136: + return globalint_409; + case 137: + return globalint_410; + case 138: + return globalint_411; + case 139: + return globalint_412; + case 140: + return globalint_413; + case 141: + return globalint_414; + case 142: + return globalint_415; + case 143: + return globalint_416; + case 144: + return globalint_417; + case 145: + return globalint_418; + case 146: + return globalint_419; + case 147: + return globalint_420; + case 148: + return globalint_421; + case 149: + return globalint_422; + case 150: + return globalint_423; + case 151: + return globalint_424; + case 152: + return globalint_425; + case 153: + return globalint_426; + case 154: + return globalint_427; + case 155: + return globalint_428; + case 156: + return globalint_429; + case 157: + return globalint_430; + case 158: + return globalint_431; + case 159: + return globalint_432; + case 160: + return globalint_433; + case 161: + return globalint_434; + case 162: + return globalint_435; + case 163: + return globalint_436; + case 164: + return globalint_437; + case 165: + return globalint_438; + case 166: + return globalint_439; + case 167: + return globalint_440; + case 168: + return globalint_441; + case 169: + return globalint_442; + case 170: + return globalint_443; + case 171: + return globalint_444; + case 172: + return globalint_445; + case 173: + return globalint_446; + case 174: + return globalint_447; + case 175: + return globalint_448; + case 176: + return globalint_449; + case 177: + return globalint_450; + case 178: + return globalint_451; + case 179: + return globalint_452; + case 180: + return globalint_453; + case 181: + return globalint_454; + case 182: + return globalint_455; + case 183: + return globalint_456; + case 184: + return globalint_457; + case 185: + return globalint_458; + case 186: + return globalint_459; + case 187: + return globalint_460; + case 188: + return globalint_461; + case 189: + return globalint_462; + case 190: + return globalint_463; + case 191: + return globalint_464; + case 192: + return globalint_465; + case 193: + return globalint_466; + case 194: + return globalint_467; + case 195: + return globalint_468; + case 196: + return globalint_469; + case 197: + return globalint_470; + case 198: + return globalint_471; + case 199: + return globalint_472; + case 200: + return globalint_473; + case 201: + return globalint_474; + case 202: + return globalint_475; + case 203: + return globalint_476; + case 204: + return globalint_477; + case 205: + return globalint_478; + case 206: + return globalint_479; + case 207: + return globalint_480; + case 208: + return globalint_481; + case 209: + return globalint_482; + case 210: + return globalint_483; + case 211: + return globalint_484; + case 212: + return globalint_485; + case 213: + return globalint_486; + case 214: + return globalint_487; + case 215: + return globalint_488; + case 216: + return globalint_489; + case 217: + return globalint_490; + case 218: + return globalint_491; + case 219: + return globalint_492; + case 220: + return globalint_493; + case 221: + return globalint_494; + case 222: + return globalint_495; + case 223: + return globalint_496; + case 224: + return globalint_497; + case 225: + return globalint_498; + case 226: + return globalint_499; + case 227: + return globalint_500; + case 228: + return globalint_501; + case 229: + return globalint_502; + case 230: + return globalint_503; + case 231: + return globalint_504; + case 232: + return globalint_505; + case 233: + return globalint_506; + case 234: + return globalint_507; + case 235: + return globalint_508; + case 236: + return globalint_509; + case 237: + return globalint_510; + case 238: + return globalint_511; + case 239: + return globalint_512; + case 240: + return globalint_513; + case 241: + return globalint_514; + case 242: + return globalint_515; + case 243: + return globalint_516; + case 244: + return globalint_517; + case 245: + return globalint_518; + case 246: + return globalint_519; + case 247: + return globalint_520; + case 248: + return globalint_521; + case 249: + return globalint_522; + } + return 0; +} diff --git a/dumps/scripts/1845.cs2 b/dumps/scripts/1845.cs2 new file mode 100644 index 000000000..8c69298d1 --- /dev/null +++ b/dumps/scripts/1845.cs2 @@ -0,0 +1,7 @@ +void script_1845() { + setWidgetText(new WidgetPointer(893,9), globalstring_197); + setWidgetText(new WidgetPointer(893,10), globalstring_198); + setWidgetText(new WidgetPointer(893,11), globalstring_199); + setWidgetText(new WidgetPointer(893,12), globalstring_200); + return; +} diff --git a/dumps/scripts/1846.cs2 b/dumps/scripts/1846.cs2 new file mode 100644 index 000000000..8065c0814 --- /dev/null +++ b/dumps/scripts/1846.cs2 @@ -0,0 +1,8 @@ +void script_1846() { + if ((((script_1305() != 8) && ((boolean)script_1569())) && (isWidgetOpen(new WidgetPointer(script_8(8))) && (bitconfig_6521 != 3))) && (bitconfig_6521 != 10)) { + script_736(script_1742(8), -1, script_121(8), -1); + setScriptCallOnGameloop(1847, "", new WidgetPointer(746,22)); + setScriptCallOnGameloop(1847, "", new WidgetPointer(548,128)); + } + return; +} diff --git a/dumps/scripts/1847.cs2 b/dumps/scripts/1847.cs2 new file mode 100644 index 000000000..d1b8d9a49 --- /dev/null +++ b/dumps/scripts/1847.cs2 @@ -0,0 +1,19 @@ +void script_1847() { + int ivar0; + ivar0 = script_121(8); + if (((script_1305() != 8) && ((boolean)script_1569())) && isWidgetOpen(new WidgetPointer(script_8(8)))) { + if (ivar0 != -1) { + if (mod(getClientCycle(), 40) > 20) { + setWidgetIsHidden(false, new WidgetPointer(ivar0)); + if (mod(getClientCycle(), 40) == 21) { + playSoundEffect(5009, 1, 0); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar0)); + } + } + } else { + script_1849(); + } + return; +} diff --git a/dumps/scripts/1848.cs2 b/dumps/scripts/1848.cs2 new file mode 100644 index 000000000..00983a309 --- /dev/null +++ b/dumps/scripts/1848.cs2 @@ -0,0 +1,4 @@ +void script_1848() { + script_1849(); + return; +} diff --git a/dumps/scripts/1849.cs2 b/dumps/scripts/1849.cs2 new file mode 100644 index 000000000..78817c48b --- /dev/null +++ b/dumps/scripts/1849.cs2 @@ -0,0 +1,7 @@ +void script_1849() { + setScriptCallOnGameloop(-1, "", new WidgetPointer(746,22)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(548,128)); + script_736(-1, -1, -1, -1); + script_1364(); + return; +} diff --git a/dumps/scripts/185.cs2 b/dumps/scripts/185.cs2 new file mode 100644 index 000000000..4534ae60d --- /dev/null +++ b/dumps/scripts/185.cs2 @@ -0,0 +1,19 @@ +int script_185(int arg0) { + switch (arg0) { + case 1: + return bitconfig_6161; + case 2: + return cs2method5000(); + case 3: + return cs2method5005(); + case 4: + return standart_config_2159; + case 5: + return cs2method5016(); + case 6: + return standart_config_1055; + case 7: + return standart_config_1054; + } + return 0; +} diff --git a/dumps/scripts/1850.cs2 b/dumps/scripts/1850.cs2 new file mode 100644 index 000000000..3ab1ebc6f --- /dev/null +++ b/dumps/scripts/1850.cs2 @@ -0,0 +1,4 @@ +void script_1850(int arg0) { + script_1886(arg0); + return; +} diff --git a/dumps/scripts/1851.cs2 b/dumps/scripts/1851.cs2 new file mode 100644 index 000000000..05ecc2143 --- /dev/null +++ b/dumps/scripts/1851.cs2 @@ -0,0 +1,3 @@ +int script_1851() { + return globalint_996; +} diff --git a/dumps/scripts/1852.cs2 b/dumps/scripts/1852.cs2 new file mode 100644 index 000000000..eb450931f --- /dev/null +++ b/dumps/scripts/1852.cs2 @@ -0,0 +1,3 @@ +int script_1852() { + return globalint_997; +} diff --git a/dumps/scripts/1853.cs2 b/dumps/scripts/1853.cs2 new file mode 100644 index 000000000..00866f702 --- /dev/null +++ b/dumps/scripts/1853.cs2 @@ -0,0 +1,3 @@ +int script_1853() { + return globalint_998; +} diff --git a/dumps/scripts/1854.cs2 b/dumps/scripts/1854.cs2 new file mode 100644 index 000000000..a561c5e69 --- /dev/null +++ b/dumps/scripts/1854.cs2 @@ -0,0 +1,3 @@ +int script_1854() { + return globalint_999; +} diff --git a/dumps/scripts/1855.cs2 b/dumps/scripts/1855.cs2 new file mode 100644 index 000000000..a77f7886b --- /dev/null +++ b/dumps/scripts/1855.cs2 @@ -0,0 +1,4 @@ +void script_1855(int arg0) { + globalint_996 = arg0; + return; +} diff --git a/dumps/scripts/1856.cs2 b/dumps/scripts/1856.cs2 new file mode 100644 index 000000000..308cfb21f --- /dev/null +++ b/dumps/scripts/1856.cs2 @@ -0,0 +1,4 @@ +void script_1856(int arg0) { + globalint_997 = arg0; + return; +} diff --git a/dumps/scripts/1857.cs2 b/dumps/scripts/1857.cs2 new file mode 100644 index 000000000..94dbc362b --- /dev/null +++ b/dumps/scripts/1857.cs2 @@ -0,0 +1,4 @@ +void script_1857(int arg0) { + globalint_998 = arg0; + return; +} diff --git a/dumps/scripts/1858.cs2 b/dumps/scripts/1858.cs2 new file mode 100644 index 000000000..9286a2b79 --- /dev/null +++ b/dumps/scripts/1858.cs2 @@ -0,0 +1,4 @@ +void script_1858(int arg0) { + globalint_999 = arg0; + return; +} diff --git a/dumps/scripts/1859.cs2 b/dumps/scripts/1859.cs2 new file mode 100644 index 000000000..111195939 --- /dev/null +++ b/dumps/scripts/1859.cs2 @@ -0,0 +1,21 @@ +cs2func_script_1859_struct(2,0,0) script_1859(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 5); + cs2method5405(1, 5); + cs2method5406(0, 0, 43568355, 1350, 43470051, 1350, 0); + cs2method5406(1, 0, 43568367, 330, 43568367, 330, 0); + cs2method5406(0, 1, 43371759, 1250, 43371765, 1250, 0); + cs2method5406(1, 1, 43568367, 330, 43568367, 330, 0); + script_1899(0, 100, 150); + cs2method5406(0, 2, 43568379, 1150, 43683067, 1150, 0); + cs2method5406(1, 2, 43568367, 330, 43568367, 330, 0); + script_1899(1, 100, 150); + cs2method5406(0, 3, 43764975, 1050, 43764969, 1050, 0); + cs2method5406(1, 3, 43568367, 330, 43568367, 330, 0); + script_1899(2, 100, 150); + cs2method5406(0, 4, 43568355, 950, 43470051, 950, 0); + cs2method5406(1, 4, 43568367, 330, 43568367, 330, 0); + script_1899(3, 100, 150); + } + return newstruct cs2func_script_1859_struct(43568355, 1250324); +} diff --git a/dumps/scripts/186.cs2 b/dumps/scripts/186.cs2 new file mode 100644 index 000000000..1ccc0f4cd --- /dev/null +++ b/dumps/scripts/186.cs2 @@ -0,0 +1,4 @@ +void script_186(int arg0) { + setWidgetSprite(1022, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1860.cs2 b/dumps/scripts/1860.cs2 new file mode 100644 index 000000000..913c83d37 --- /dev/null +++ b/dumps/scripts/1860.cs2 @@ -0,0 +1,6 @@ +void script_1860(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(88,22), arg0)) { + setWidgetAnimation(arg1); + } + return; +} diff --git a/dumps/scripts/1861.cs2 b/dumps/scripts/1861.cs2 new file mode 100644 index 000000000..8bd8e2069 --- /dev/null +++ b/dumps/scripts/1861.cs2 @@ -0,0 +1,10 @@ +void script_1861() { + setWidgetModel(cs2method_3408(105, 109, 1318, bitconfig_5470), new WidgetPointer(799,10)); + setWidgetModel(cs2method_3408(105, 109, 1318, bitconfig_5471), new WidgetPointer(799,11)); + setWidgetModel(cs2method_3408(105, 109, 1318, bitconfig_5472), new WidgetPointer(799,12)); + setWidgetModel(cs2method_3408(105, 109, 1318, bitconfig_5473), new WidgetPointer(799,13)); + setWidgetModel(cs2method_3408(105, 109, 1318, bitconfig_5474), new WidgetPointer(799,14)); + setWidgetModel(cs2method_3408(105, 109, 1318, bitconfig_5475), new WidgetPointer(799,15)); + setWidgetModel(cs2method_3408(105, 109, 1318, bitconfig_5476), new WidgetPointer(799,16)); + return; +} diff --git a/dumps/scripts/1862.cs2 b/dumps/scripts/1862.cs2 new file mode 100644 index 000000000..01d97338b --- /dev/null +++ b/dumps/scripts/1862.cs2 @@ -0,0 +1,6 @@ +void script_1862(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + cs2method2103(100); + } + return; +} diff --git a/dumps/scripts/1863.cs2 b/dumps/scripts/1863.cs2 new file mode 100644 index 000000000..eb89192e2 --- /dev/null +++ b/dumps/scripts/1863.cs2 @@ -0,0 +1,6 @@ +void script_1863(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + cs2method2103(0); + } + return; +} diff --git a/dumps/scripts/1864.cs2 b/dumps/scripts/1864.cs2 new file mode 100644 index 000000000..8da1343da --- /dev/null +++ b/dumps/scripts/1864.cs2 @@ -0,0 +1,170 @@ +void script_1864(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + if (arg0 != 1) { + return; + } + switch (arg2) { + case 12: + switch (arg3) { + case 0: + messageType0("Rick: " + intToStr(cs2method_3408(105, 105, 238, 1)) + " coins."); + break; + case 1: + messageType0("Maid: " + intToStr(cs2method_3408(105, 105, 238, 3)) + " coins."); + break; + case 2: + messageType0("Cook: " + intToStr(cs2method_3408(105, 105, 238, 5)) + " coins."); + break; + case 3: + messageType0("Butler: " + intToStr(cs2method_3408(105, 105, 238, 6)) + " coins."); + break; + case 4: + messageType0("Demon Butler: " + intToStr(cs2method_3408(105, 105, 238, 8)) + " coins."); + } + return; + case 0: + switch (arg1) { + case 8170: + arg1 = 8415; + break; + case 8315: + arg1 = 8395; + break; + case 8222: + arg1 = 8396; + break; + case 8121: + arg1 = 8397; + break; + case 8379: + arg1 = 8406; + break; + case 8037: + arg1 = 8398; + break; + case 8255: + arg1 = 8401; + break; + case 8163: + arg1 = 8399; + break; + case 8027: + arg1 = 8400; + break; + case 8259: + arg1 = 8403; + break; + case 8340: + arg1 = 8407; + break; + case 9822: + arg1 = 9842; + break; + case 8068: + arg1 = 8405; + break; + case 8333: + arg1 = 8408; + break; + case 8195: + arg1 = 8416; + break; + case 8363: + arg1 = 8409; + break; + case 8302: + arg1 = 8410; + break; + case 8123: + arg1 = 8411; + break; + case 8122: + arg1 = 18800; + break; + case 8151: + arg1 = 8414; + } + messageType0(getItemName(arg1) + ": " + formatNumber(getItemValue(arg1), 1) + " coins."); + return; + case 14: + case 15: + return; + } + globalarray_0 = new int[6]; + globalarray_1 = new int[6]; + ivar4 = 0; + if (getItemHashmapData(arg1, 211) != -1) { + globalarray_0[0] = getItemHashmapData(arg1, 211); + globalarray_0[0] = getItemHashmapData(arg1, 212); + ivar4 = add(ivar4, 1); + } + if (getItemHashmapData(arg1, 213) != -1) { + globalarray_0[1] = getItemHashmapData(arg1, 213); + globalarray_0[1] = getItemHashmapData(arg1, 214); + ivar4 = add(ivar4, 1); + } + if (getItemHashmapData(arg1, 215) != -1) { + globalarray_0[2] = getItemHashmapData(arg1, 215); + globalarray_0[2] = getItemHashmapData(arg1, 216); + ivar4 = add(ivar4, 1); + } + if (getItemHashmapData(arg1, 217) != -1) { + globalarray_0[3] = getItemHashmapData(arg1, 217); + globalarray_0[3] = getItemHashmapData(arg1, 218); + ivar4 = add(ivar4, 1); + } + if (getItemHashmapData(arg1, 219) != -1) { + globalarray_0[4] = getItemHashmapData(arg1, 219); + globalarray_0[4] = getItemHashmapData(arg1, 220); + ivar4 = add(ivar4, 1); + } + if (getItemHashmapData(arg1, 221) != -1) { + globalarray_0[5] = getItemHashmapData(arg1, 221); + globalarray_0[5] = getItemHashmapData(arg1, 222); + ivar4 = add(ivar4, 1); + } + switch (ivar4) { + case 1: + messageType0(getItemName(arg1) + ":"); + messageType0(formatNumber(globalarray_1[0], 1) + " x " + getItemName(globalarray_0[0])); + break; + case 2: + messageType0(getItemName(arg1) + ":"); + messageType0(formatNumber(globalarray_1[0], 1) + " x " + getItemName(globalarray_0[0])); + messageType0(formatNumber(globalarray_1[1], 1) + " x " + getItemName(globalarray_0[1])); + break; + case 3: + messageType0(getItemName(arg1) + ":"); + messageType0(formatNumber(globalarray_1[0], 1) + " x " + getItemName(globalarray_0[0])); + messageType0(formatNumber(globalarray_1[1], 1) + " x " + getItemName(globalarray_0[1])); + messageType0(formatNumber(globalarray_1[2], 1) + " x " + getItemName(globalarray_0[2])); + break; + case 4: + messageType0(getItemName(arg1) + ":"); + messageType0(formatNumber(globalarray_1[0], 1) + " x " + getItemName(globalarray_0[0])); + messageType0(formatNumber(globalarray_1[1], 1) + " x " + getItemName(globalarray_0[1])); + messageType0(formatNumber(globalarray_1[2], 1) + " x " + getItemName(globalarray_0[2])); + messageType0(formatNumber(globalarray_1[3], 1) + " x " + getItemName(globalarray_0[3])); + break; + case 5: + messageType0(getItemName(arg1) + ":"); + messageType0(formatNumber(globalarray_1[0], 1) + " x " + getItemName(globalarray_0[0])); + messageType0(formatNumber(globalarray_1[1], 1) + " x " + getItemName(globalarray_0[1])); + messageType0(formatNumber(globalarray_1[2], 1) + " x " + getItemName(globalarray_0[2])); + messageType0(formatNumber(globalarray_1[3], 1) + " x " + getItemName(globalarray_0[3])); + messageType0(formatNumber(globalarray_1[4], 1) + " x " + getItemName(globalarray_0[4])); + break; + case 6: + messageType0(getItemName(arg1) + ":"); + messageType0(formatNumber(globalarray_1[0], 1) + " x " + getItemName(globalarray_0[0])); + messageType0(formatNumber(globalarray_1[1], 1) + " x " + getItemName(globalarray_0[1])); + messageType0(formatNumber(globalarray_1[2], 1) + " x " + getItemName(globalarray_0[2])); + messageType0(formatNumber(globalarray_1[3], 1) + " x " + getItemName(globalarray_0[3])); + messageType0(formatNumber(globalarray_1[4], 1) + " x " + getItemName(globalarray_0[4])); + messageType0(formatNumber(globalarray_1[5], 1) + " x " + getItemName(globalarray_0[5])); + break; + default: + messageType0(getItemName(arg1)); + } + return; +} diff --git a/dumps/scripts/1865.cs2 b/dumps/scripts/1865.cs2 new file mode 100644 index 000000000..d3497b1a4 --- /dev/null +++ b/dumps/scripts/1865.cs2 @@ -0,0 +1,7 @@ +void script_1865(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + messageType0(cs2method_3408(111, 115, 2024, arg1)); + return; +} diff --git a/dumps/scripts/1866.cs2 b/dumps/scripts/1866.cs2 new file mode 100644 index 000000000..a78e0ff30 --- /dev/null +++ b/dumps/scripts/1866.cs2 @@ -0,0 +1,18 @@ +cs2func_script_1866_struct(2,0,0) script_1866(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 4); + cs2method5405(1, 4); + cs2method5406(0, 0, 48417962, 1000, 48385194, 1000, 0); + cs2method5406(1, 0, 48417960, 600, 48401568, 600, 0); + cs2method5406(0, 1, 48417946, 1000, 48434326, 1000, 0); + cs2method5406(1, 1, 48450710, 600, 48467090, 600, 0); + script_1899(0, 100, 100); + cs2method5406(0, 2, 48532612, 1000, 48532610, 1000, 0); + cs2method5406(1, 2, 48581761, 600, 48581760, 600, 0); + script_1899(1, 100, 100); + cs2method5406(0, 3, 48548992, 1000, 48548992, 1000, 0); + cs2method5406(1, 3, 48598144, 600, 48598144, 600, 0); + script_1899(2, 100, 100); + } + return newstruct cs2func_script_1866_struct(48483486, 1250324); +} diff --git a/dumps/scripts/1867.cs2 b/dumps/scripts/1867.cs2 new file mode 100644 index 000000000..2c2b1dce3 --- /dev/null +++ b/dumps/scripts/1867.cs2 @@ -0,0 +1,4 @@ +void script_1867() { + cs2method5400(0, "www", "parents.ws"); + return; +} diff --git a/dumps/scripts/1868.cs2 b/dumps/scripts/1868.cs2 new file mode 100644 index 000000000..88530a69d --- /dev/null +++ b/dumps/scripts/1868.cs2 @@ -0,0 +1,8 @@ +void script_1868(int arg0) { + if (((boolean)mod(getClientCycle(), 50)) && (getSystemUpdateTimer() > 0)) { + setWidgetPosition(0, -8, 1, 1, new WidgetPointer(906,27)); + script_1870(59375650); + setScriptCallOnGameloop(1869, new WidgetPointer(906,34), "I", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1869.cs2 b/dumps/scripts/1869.cs2 new file mode 100644 index 000000000..049eef8b4 --- /dev/null +++ b/dumps/scripts/1869.cs2 @@ -0,0 +1,7 @@ +void script_1869(int arg0) { + if (mod(getClientCycle(), 50) != 0) { + return; + } + script_1870(arg0); + return; +} diff --git a/dumps/scripts/187.cs2 b/dumps/scripts/187.cs2 new file mode 100644 index 000000000..aba3bb957 --- /dev/null +++ b/dumps/scripts/187.cs2 @@ -0,0 +1,4 @@ +void script_187(int arg0) { + setWidgetSprite(1021, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1870.cs2 b/dumps/scripts/1870.cs2 new file mode 100644 index 000000000..de8d2515f --- /dev/null +++ b/dumps/scripts/1870.cs2 @@ -0,0 +1,29 @@ +void script_1870(int arg0) { + int ivar1; + int ivar2; + int ivar3; + string svar0; + ivar1 = 0; + ivar2 = 0; + ivar3 = getSystemUpdateTimer(); + svar0 = "0"; + if (ivar3 > 0) { + ivar1 = mod(divide(ivar3, 50), 60); + ivar2 = divide(ivar3, 3000); + if (ivar1 < 10) { + svar0 = "System update in: " + intToStr(ivar2) + ":0" + intToStr(ivar1); + } else { + svar0 = "System update in: " + intToStr(ivar2) + ":" + intToStr(ivar1); + } + setWidgetText(new WidgetPointer(arg0), svar0); + if (strLength(svar0) > 0) { + setWidgetSize(add(getTextWidth(494, "System update in: "), 40), getWidgetActualHeight(new WidgetPointer(906,30)), 0, 0, new WidgetPointer(906,30)); + setWidgetIsHidden(false, new WidgetPointer(906,30)); + } else { + setWidgetIsHidden(true, new WidgetPointer(906,30)); + } + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1871.cs2 b/dumps/scripts/1871.cs2 new file mode 100644 index 000000000..820108ae7 --- /dev/null +++ b/dumps/scripts/1871.cs2 @@ -0,0 +1,4 @@ +void script_1871(string arg0) { + setWidgetText(new WidgetPointer(906,235), arg0); + return; +} diff --git a/dumps/scripts/1872.cs2 b/dumps/scripts/1872.cs2 new file mode 100644 index 000000000..620c69740 --- /dev/null +++ b/dumps/scripts/1872.cs2 @@ -0,0 +1,4 @@ +void script_1872() { + script_1873(); + return; +} diff --git a/dumps/scripts/1873.cs2 b/dumps/scripts/1873.cs2 new file mode 100644 index 000000000..50167a51a --- /dev/null +++ b/dumps/scripts/1873.cs2 @@ -0,0 +1,8 @@ +void script_1873() { + if (globalint_200 > 0) { + script_3064(1); + setScriptCallOnGameloop(-1, "", new WidgetPointer(906,171)); + script_3097(); + } + return; +} diff --git a/dumps/scripts/1874.cs2 b/dumps/scripts/1874.cs2 new file mode 100644 index 000000000..889816178 --- /dev/null +++ b/dumps/scripts/1874.cs2 @@ -0,0 +1,5 @@ +void script_1874(int arg0,int arg1,int arg2) { + globalint_1097 = script_1401(arg0, 494, 0, globalstring_277); + script_1875(arg1, arg2, globalstring_277); + return; +} diff --git a/dumps/scripts/1875.cs2 b/dumps/scripts/1875.cs2 new file mode 100644 index 000000000..5cd20f2df --- /dev/null +++ b/dumps/scripts/1875.cs2 @@ -0,0 +1,29 @@ +void script_1875(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar1; + ivar2 = 59375766; + setWidgetPosition(script_1551(globalint_1097, 494, subtract(getWidgetActualX(new WidgetPointer(ivar2)), 15), arg2), getWidgetActualY(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + ivar3 = subtract(getWidgetActualWidth(new WidgetPointer(ivar2)), 0); + ivar4 = strLength(arg2); + svar1 = ""; + if (globalint_1097 > 0) { + svar1 = substr(0, min(globalint_1097, ivar4), arg2); + } + ivar5 = subtract(getTextWidth(494, svar1), ivar3); + setWidgetPosition(0, 0, 0, 1, new WidgetPointer(arg0)); + setWidgetSize(max(getTextWidth(494, arg2), ivar3), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + if (ivar5 > 0) { + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(arg0)), ivar5), getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(min(subtract(getWidgetActualX(new WidgetPointer(arg1)), ivar5), subtract(ivar3, 1)), getWidgetActualY(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + } + if (hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + setScriptCallOnGameloop(1876, getClientCycle(), new WidgetPointer(arg1), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1876.cs2 b/dumps/scripts/1876.cs2 new file mode 100644 index 000000000..3bd9dfc6a --- /dev/null +++ b/dumps/scripts/1876.cs2 @@ -0,0 +1,8 @@ +void script_1876(int arg0,int arg1) { + if ((mod(subtract(getClientCycle(), arg0), 40) < 20) && hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1877.cs2 b/dumps/scripts/1877.cs2 new file mode 100644 index 000000000..5d56838e9 --- /dev/null +++ b/dumps/scripts/1877.cs2 @@ -0,0 +1,4 @@ +void script_1877(int arg0,int arg1,int arg2,int arg3) { + script_1900(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/1878.cs2 b/dumps/scripts/1878.cs2 new file mode 100644 index 000000000..0c52b2247 --- /dev/null +++ b/dumps/scripts/1878.cs2 @@ -0,0 +1,5 @@ +void script_1878(int arg0,int arg1,int arg2) { + globalint_1097 = script_1401(add(arg0, getWidgetActualX(new WidgetPointer(arg1))), 3793, getWidgetActualX(new WidgetPointer(arg1)), globalstring_277); + script_1879(arg1, arg2, globalstring_277); + return; +} diff --git a/dumps/scripts/1879.cs2 b/dumps/scripts/1879.cs2 new file mode 100644 index 000000000..a44fd7853 --- /dev/null +++ b/dumps/scripts/1879.cs2 @@ -0,0 +1,10 @@ +void script_1879(int arg0,int arg1,string arg2) { + setWidgetPosition(script_1551(globalint_1097, 3793, getWidgetActualX(new WidgetPointer(arg0)), arg2), 4, 0, 0, new WidgetPointer(arg1)); + if (hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + setScriptCallOnGameloop(1880, getClientCycle(), new WidgetPointer(arg1), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/188.cs2 b/dumps/scripts/188.cs2 new file mode 100644 index 000000000..500a53d8c --- /dev/null +++ b/dumps/scripts/188.cs2 @@ -0,0 +1,4 @@ +void script_188(int arg0) { + setWidgetSprite(1025, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1880.cs2 b/dumps/scripts/1880.cs2 new file mode 100644 index 000000000..0426504d3 --- /dev/null +++ b/dumps/scripts/1880.cs2 @@ -0,0 +1,8 @@ +void script_1880(int arg0,int arg1) { + if ((mod(subtract(getClientCycle(), arg0), 40) < 20) && hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/1881.cs2 b/dumps/scripts/1881.cs2 new file mode 100644 index 000000000..43321944b --- /dev/null +++ b/dumps/scripts/1881.cs2 @@ -0,0 +1,4 @@ +void script_1881() { + script_2172(1); + return; +} diff --git a/dumps/scripts/1882.cs2 b/dumps/scripts/1882.cs2 new file mode 100644 index 000000000..7ffe08689 --- /dev/null +++ b/dumps/scripts/1882.cs2 @@ -0,0 +1,6 @@ +void script_1882(int arg0) { + if (((boolean)arg0)) { + script_2172(1); + } + return; +} diff --git a/dumps/scripts/1883.cs2 b/dumps/scripts/1883.cs2 new file mode 100644 index 000000000..60dd80f0d --- /dev/null +++ b/dumps/scripts/1883.cs2 @@ -0,0 +1,12 @@ +int script_1883(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + deleteAllExtraChilds(new WidgetPointer(arg4)); + if (arg3 == -1) { + setWidgetIsHidden(true, new WidgetPointer(arg4)); + return arg0; + } + script_1885(arg0, arg1, arg3, arg4, arg5); + setWidgetIsHidden(false, new WidgetPointer(arg4)); + setScriptCallOnMouseEntered(1894, subtract(arg0, arg2), add(add(arg1, arg2), arg2), arg3, arg5, new WidgetPointer(arg4), "iiosI", new WidgetPointer(arg4)); + setScriptCallOnMouseExit(1884, arg0, arg1, arg3, arg5, new WidgetPointer(arg4), "iiosI", new WidgetPointer(arg4)); + return add(add(arg0, arg1), arg2); +} diff --git a/dumps/scripts/1884.cs2 b/dumps/scripts/1884.cs2 new file mode 100644 index 000000000..8c3ce9dc6 --- /dev/null +++ b/dumps/scripts/1884.cs2 @@ -0,0 +1,4 @@ +void script_1884(int arg0,int arg1,int arg2,int arg3,string arg4) { + script_1885(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/1885.cs2 b/dumps/scripts/1885.cs2 new file mode 100644 index 000000000..a3beefe5e --- /dev/null +++ b/dumps/scripts/1885.cs2 @@ -0,0 +1,33 @@ +void script_1885(int arg0,int arg1,int arg2,int arg3,string arg4) { + setWidgetSize(arg1, 64, 0, 0, new WidgetPointer(arg3)); + setWidgetPosition(arg0, 0, 0, 1, new WidgetPointer(arg3)); + script_333(arg3, 6116682, 3024411, 2, 4); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(0, 4, 1, 0); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + setItemOnWidgetMethod1205(arg2, 1); + createExtraChild(new WidgetPointer(arg3), 4, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(multiply(4, 2), subtract(add(4, 32), 3), 1, 1); + setWidgetPosition(0, 0, 1, 2); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(true); + setWidgetText(arg4); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(14, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(3872); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(8, 0, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(3871); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(8, 0, 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(3873); + return; +} diff --git a/dumps/scripts/1886.cs2 b/dumps/scripts/1886.cs2 new file mode 100644 index 000000000..1b0654827 --- /dev/null +++ b/dumps/scripts/1886.cs2 @@ -0,0 +1,8 @@ +void script_1886(int arg0) { + if ((bitconfig_4895 == 3) && (standart_config_281 < 125)) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1887.cs2 b/dumps/scripts/1887.cs2 new file mode 100644 index 000000000..aa40280fc --- /dev/null +++ b/dumps/scripts/1887.cs2 @@ -0,0 +1,4 @@ +void script_1887(int arg0,string arg1) { + script_3408(arg0, arg1); + return; +} diff --git a/dumps/scripts/1888.cs2 b/dumps/scripts/1888.cs2 new file mode 100644 index 000000000..062eff03e --- /dev/null +++ b/dumps/scripts/1888.cs2 @@ -0,0 +1,19 @@ +void script_1888() { + if (((boolean)globalint_1025)) { + return; + } + if ((((boolean)script_2728()) && ((boolean)bitconfig_6521)) && (standart_config_281 >= 1000)) { + if (globalint_94 > getClientCycle()) { + return; + } + globalint_94 = add(getClientCycle(), 1500); + if (((boolean)standart_config_1647)) { + messageType0("Your health is low! Run away from your attacker and speak to Xenia."); + } else { + messageType0("Your health is low! Find a safe place away from your attacker"); + messageType0("or eat some food to heal yourself."); + } + } + globalint_1025 = 1; + return; +} diff --git a/dumps/scripts/1889.cs2 b/dumps/scripts/1889.cs2 new file mode 100644 index 000000000..d3ffd03d6 --- /dev/null +++ b/dumps/scripts/1889.cs2 @@ -0,0 +1,6 @@ +string script_1889() { + if (((boolean)script_1431())) { + return "World " + intToStr(getWorldId()) + " (PvP)"; + } + return "World " + intToStr(getWorldId()); +} diff --git a/dumps/scripts/189.cs2 b/dumps/scripts/189.cs2 new file mode 100644 index 000000000..38ab37671 --- /dev/null +++ b/dumps/scripts/189.cs2 @@ -0,0 +1,4 @@ +void script_189(int arg0) { + setWidgetSprite(1025, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1890.cs2 b/dumps/scripts/1890.cs2 new file mode 100644 index 000000000..f7be6c4f9 --- /dev/null +++ b/dumps/scripts/1890.cs2 @@ -0,0 +1,4 @@ +void script_1890(string arg0) { + message(11, 0, arg0); + return; +} diff --git a/dumps/scripts/1891.cs2 b/dumps/scripts/1891.cs2 new file mode 100644 index 000000000..99f84d9f2 --- /dev/null +++ b/dumps/scripts/1891.cs2 @@ -0,0 +1,6 @@ +int script_1891() { + if ((cs2method3612() > 0) && (cs2method3618() >= cs2method3616())) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/1892.cs2 b/dumps/scripts/1892.cs2 new file mode 100644 index 000000000..f5d96e58a --- /dev/null +++ b/dumps/scripts/1892.cs2 @@ -0,0 +1,12 @@ +void script_1892(int arg0,int arg1) { + setScriptCallOnFriendListChange(1893, new WidgetPointer(arg0), new WidgetPointer(arg1), "II", new WidgetPointer(arg0)); + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + script_31(arg1, arg0, 5666, 5663, 5664, 5665, 5686, 5685); + script_1895(arg0, arg1); + if (cs2method6900()) { + setWidgetText(new WidgetPointer(1108,27), "Friends Chat channel:"); + setWidgetContextMenuOption(1, new WidgetPointer(1108,22), "Enable"); + } + return; +} diff --git a/dumps/scripts/1893.cs2 b/dumps/scripts/1893.cs2 new file mode 100644 index 000000000..f85f0c0c7 --- /dev/null +++ b/dumps/scripts/1893.cs2 @@ -0,0 +1,4 @@ +void script_1893(int arg0,int arg1) { + script_1895(arg0, arg1); + return; +} diff --git a/dumps/scripts/1894.cs2 b/dumps/scripts/1894.cs2 new file mode 100644 index 000000000..31acc40c1 --- /dev/null +++ b/dumps/scripts/1894.cs2 @@ -0,0 +1,35 @@ +void script_1894(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + setWidgetSize(arg1, 76, 0, 0, new WidgetPointer(arg3)); + setWidgetPosition(arg0, 0, 0, 1, new WidgetPointer(arg3)); + ivar4 = divide(subtract(76, 64), 2); + script_333(arg3, 6116682, 3024411, 4, 4); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(0, add(4, ivar4), 1, 0); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + setItemOnWidgetMethod1205(arg2, 1); + createExtraChild(new WidgetPointer(arg3), 4, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(subtract(add(multiply(4, 2), 70), 56), subtract(add(add(add(4, ivar4), 32), ivar4), 3), 1, 1); + setWidgetPosition(0, ivar4, 1, 2); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(true); + setWidgetText(arg4); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(58, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(3875); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(30, 0, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(3874); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetSize(30, 0, 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(3876); + return; +} diff --git a/dumps/scripts/1895.cs2 b/dumps/scripts/1895.cs2 new file mode 100644 index 000000000..dd1720ad4 --- /dev/null +++ b/dumps/scripts/1895.cs2 @@ -0,0 +1,144 @@ +void script_1895(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + string svar0; + string svar1; + string svar2; + string svar3; + int stack_dump0; + previousAndCurrentName(0,2,0) structdump_1; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar2 = getFriendlistSize(); + if (ivar2 == -2) { + createExtraChild(new WidgetPointer(arg0), 4, 0); + setWidgetFont(496); + setWidgetText("Loading Friends List - Please wait..."); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(138, 100, 0, 0); + setWidgetRGB(new Color(255, 255, 100)); + setWidgetUnknownBoolean(true); + return; + } + if (ivar2 == -1) { + createExtraChild(new WidgetPointer(arg0), 4, 0); + setWidgetFont(496); + setWidgetText("Connecting to Friend Server - Please wait..."); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(138, 100, 0, 0); + setWidgetRGB(new Color(255, 255, 100)); + setWidgetUnknownBoolean(true); + return; + } + ivar3 = 0; + ivar4 = subtract(subtract(add(add(getWidgetActualX(new WidgetPointer(1108,12)), getWidgetActualX(new WidgetPointer(1108,7))), 14), getMaxLineWidth(2147483647, 496, " ")), getWidgetActualX(new WidgetPointer(1108,13))); + svar0 = ""; + svar1 = ""; + svar2 = ""; + ivar5 = 0; + svar3 = ""; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + while (ivar3 < ivar2) { + ivar8 = multiply(ivar3, 3); + ivar9 = add(multiply(ivar3, 16), 2); + stack_dump0 = ivar3; + structdump_1 = getFriendName(stack_dump0); + svar3 = structdump_1.stringpart_1; + svar0 = structdump_1.stringpart_0; + if (stringMethod4107(svar3, "") != 0) { + ivar6 = 1; + } else { + ivar6 = 0; + } + if (((boolean)ivar6)) { + svar1 = " " + svar0; + } else { + svar1 = svar0; + } + createExtraChild(new WidgetPointer(arg0), 4, ivar8); + setWidgetFont(496); + setWidgetPosition(0, ivar9, 0, 0); + setWidgetSize(ivar4, 15, 0, 0); + setWidgetRGB(new Color(255, 255, 100)); + setWidgetUnknownBoolean(true); + if (getMaxLineWidth(2147483647, 496, svar1) > ivar4) { + while ((getMaxLineWidth(2147483647, 496, svar1 + "...") > ivar4) && (strLength(svar1) > 0)) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1); + } + setWidgetText(svar1 + "..."); + if (((boolean)ivar6)) { + ivar5 = add(getMaxLineWidth(2147483647, 496, "Last known as: " + svar3), 8); + if (ivar5 > getWidgetActualWidth(new WidgetPointer(arg0))) { + svar2 = svar0 + "
" + "Last known as:" + "
" + svar3; + } else { + svar2 = svar0 + "
" + "Last known as: " + svar3; + } + } else { + svar2 = svar0; + } + setScriptCallOnMouseOver(4538, new WidgetPointer(1108,34), new WidgetPointer(-32768,3), -1, svar2, 120, 3793, 3793, 16777215, 13, 4, 2, -2147483647, -2147483646, "IIisifdiiiiii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1108,34), "I"); + } else if (((boolean)ivar6)) { + setWidgetText(svar1); + ivar5 = add(getMaxLineWidth(2147483647, 496, "Last known as: " + svar3), 8); + if (ivar5 > getWidgetActualWidth(new WidgetPointer(arg0))) { + svar2 = "Last known as:" + "
" + svar3; + } else { + svar2 = "Last known as: " + svar3; + } + setScriptCallOnMouseOver(4538, new WidgetPointer(1108,34), new WidgetPointer(-32768,3), ivar3, svar2, 120, 3793, 3793, 16777215, 13, 4, 2, -2147483647, -2147483646, "IIisifdiiiiii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1108,34), "I"); + } else { + setWidgetText(svar0); + } + createExtraChild(new WidgetPointer(arg0), 5, add(ivar8, 1)); + setWidgetSprite(2313); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, ivar9, 0, 0); + if (((boolean)ivar6)) { + setWidgetHidden(1); + } + createExtraChild(new WidgetPointer(arg0), 4, add(ivar8, 2)); + setWidgetFont(496); + setWidgetText(script_196(getFriendRank(ivar3))); + setWidgetPosition(137, ivar9, 0, 0); + setWidgetSize(131, 15, 0, 0); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetContextMenuOption(1, "Not in Friends Chat"); + setWidgetContextMenuOption(2, "Recruit"); + setWidgetContextMenuOption(3, "Corporal"); + setWidgetContextMenuOption(4, "Sergeant"); + setWidgetContextMenuOption(5, "Lieutenant"); + setWidgetContextMenuOption(6, "Captain"); + setWidgetContextMenuOption(7, "General"); + setScriptCallOnClickContextMenu(197, ivar3, -2147483644, "ii"); + ivar3 = add(ivar3, 1); + } + ivar10 = 0; + ivar11 = 0; + if (ivar3 > 12) { + ivar10 = cs2method2601(new WidgetPointer(arg0)); + ivar11 = add(multiply(ivar3, 16), 4); + setWidgetScrollMax(0, ivar11, new WidgetPointer(arg0)); + if (ivar10 > ivar11) { + ivar10 = ivar11; + } + script_72(arg1, arg0, ivar10); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + script_72(arg1, arg0, 0); + } + return; +} diff --git a/dumps/scripts/1896.cs2 b/dumps/scripts/1896.cs2 new file mode 100644 index 000000000..e3d64a725 --- /dev/null +++ b/dumps/scripts/1896.cs2 @@ -0,0 +1,12 @@ +void script_1896() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (((boolean)script_4468())) { + setWidgetIsHidden(false, new WidgetPointer(912,44)); + return; + } + script_2447(); + return; +} diff --git a/dumps/scripts/1897.cs2 b/dumps/scripts/1897.cs2 new file mode 100644 index 000000000..99a894077 --- /dev/null +++ b/dumps/scripts/1897.cs2 @@ -0,0 +1,3 @@ +void script_1897() { + return; +} diff --git a/dumps/scripts/1898.cs2 b/dumps/scripts/1898.cs2 new file mode 100644 index 000000000..1b1c7adf5 --- /dev/null +++ b/dumps/scripts/1898.cs2 @@ -0,0 +1,25 @@ +cs2func_script_1898_struct(2,0,0) script_1898(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_1898_struct(globalint_523, globalint_533); + case 1: + return newstruct cs2func_script_1898_struct(globalint_524, globalint_534); + case 2: + return newstruct cs2func_script_1898_struct(globalint_525, globalint_535); + case 3: + return newstruct cs2func_script_1898_struct(globalint_526, globalint_536); + case 4: + return newstruct cs2func_script_1898_struct(globalint_527, globalint_537); + case 5: + return newstruct cs2func_script_1898_struct(globalint_528, globalint_538); + case 6: + return newstruct cs2func_script_1898_struct(globalint_529, globalint_539); + case 7: + return newstruct cs2func_script_1898_struct(globalint_530, globalint_540); + case 8: + return newstruct cs2func_script_1898_struct(globalint_531, globalint_541); + case 9: + return newstruct cs2func_script_1898_struct(globalint_532, globalint_542); + } + return newstruct cs2func_script_1898_struct(0, 0); +} diff --git a/dumps/scripts/1899.cs2 b/dumps/scripts/1899.cs2 new file mode 100644 index 000000000..54a1515b3 --- /dev/null +++ b/dumps/scripts/1899.cs2 @@ -0,0 +1,55 @@ +void script_1899(int arg0,int arg1,int arg2) { + int stack_dump0; + switch (arg0) { + case 0: + stack_dump0 = arg1; + globalint_533 = arg2; + globalint_523 = stack_dump0; + break; + case 1: + stack_dump0 = arg1; + globalint_534 = arg2; + globalint_524 = stack_dump0; + break; + case 2: + stack_dump0 = arg1; + globalint_535 = arg2; + globalint_525 = stack_dump0; + break; + case 3: + stack_dump0 = arg1; + globalint_536 = arg2; + globalint_526 = stack_dump0; + break; + case 4: + stack_dump0 = arg1; + globalint_537 = arg2; + globalint_527 = stack_dump0; + break; + case 5: + stack_dump0 = arg1; + globalint_538 = arg2; + globalint_528 = stack_dump0; + break; + case 6: + stack_dump0 = arg1; + globalint_539 = arg2; + globalint_529 = stack_dump0; + break; + case 7: + stack_dump0 = arg1; + globalint_540 = arg2; + globalint_530 = stack_dump0; + break; + case 8: + stack_dump0 = arg1; + globalint_541 = arg2; + globalint_531 = stack_dump0; + break; + case 9: + stack_dump0 = arg1; + globalint_542 = arg2; + globalint_532 = stack_dump0; + } + return; +} diff --git a/dumps/scripts/19.cs2 b/dumps/scripts/19.cs2 new file mode 100644 index 000000000..78aa50448 --- /dev/null +++ b/dumps/scripts/19.cs2 @@ -0,0 +1,446 @@ +int script_19(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (arg0 == 556) { + flow_1: + if (getItemAmtInContainer(94, 1381) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 15598) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 17009) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 17011) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16169) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16170) > 0) { + return 99999999; + } + if (script_1(94, 1397) > 0) { + return 99999999; + } + if (script_1(94, 1405) > 0) { + return 99999999; + } + if (script_1(94, 19327) > 0) { + return 99999999; + } + if (script_1(94, 21777) > 0) { + return 99999999; + } + if (script_1(94, 21490) > 0) { + return 99999999; + } + if (script_1(94, 21496) > 0) { + return 99999999; + } + if (script_1(94, 21500) > 0) { + return 99999999; + } + ivar2 = add(add(add(add(add(add(getItemAmtInContainer(93, 556), getItemAmtInContainer(93, 17780)), getItemAmtInContainer(93, 16091)), script_1(93, 4697)), script_1(93, 4695)), script_1(93, 4696)), getItemAmtInContainer(93, 20941)); + IF ((((((arg1 == 12582946) || (arg1 == 12582951)) || (arg1 == 12582954)) || (arg1 == 62259232)) || (arg1 == 62259237)) || (arg1 == 62259236)) + GOTO flow_28 + GOTO flow_31 + flow_28: + IF ((getItemIdInSlot(94, 5) == 19671) || (getItemIdInSlot(94, 5) == 19867)) + GOTO flow_29 + IF ((getItemIdInSlot(94, 5) == 19865) && (globalint_1334 > 0)) + GOTO flow_30 + GOTO flow_31 + flow_29: + flow_30: + ivar2 = add(ivar2, multiply(globalint_1334, 2)); + flow_31: + IF ((arg1 == 12582957) || (arg1 == 62259241)) + GOTO flow_32 + GOTO flow_35 + flow_32: + IF ((getItemIdInSlot(94, 5) == 19671) || (getItemIdInSlot(94, 5) == 19867)) + GOTO flow_33 + IF ((getItemIdInSlot(94, 5) == 19865) && (globalint_1334 > 0)) + GOTO flow_34 + GOTO flow_35 + flow_33: + flow_34: + ivar2 = add(ivar2, multiply(globalint_1334, 3)); + flow_35: + IF ((((((arg1 == 12582961) || (arg1 == 12582964)) || (arg1 == 12582970)) || (arg1 == 62259242)) || (arg1 == 62259245)) || (arg1 == 62259243)) + GOTO flow_36 + GOTO flow_39 + flow_36: + IF ((getItemIdInSlot(94, 5) == 19671) || (getItemIdInSlot(94, 5) == 19867)) + GOTO flow_37 + IF ((getItemIdInSlot(94, 5) == 19865) && (globalint_1335 > 0)) + GOTO flow_38 + GOTO flow_39 + flow_37: + flow_38: + ivar2 = add(ivar2, multiply(globalint_1335, 3)); + flow_39: + IF ((arg1 == 12582975) || (arg1 == 62259247)) + GOTO flow_40 + GOTO flow_43 + flow_40: + IF ((getItemIdInSlot(94, 5) == 19671) || (getItemIdInSlot(94, 5) == 19867)) + GOTO flow_41 + IF ((getItemIdInSlot(94, 5) == 19865) && (globalint_1335 > 0)) + GOTO flow_42 + GOTO flow_43 + flow_41: + flow_42: + ivar2 = add(ivar2, multiply(globalint_1335, 4)); + flow_43: + IF ((((((((arg1 == 12582982) || (arg1 == 12582985)) || (arg1 == 12582989)) || (arg1 == 12582992)) || (arg1 == 62259248)) || (arg1 == 62259254)) || (arg1 == 62259249)) || (arg1 == 62259258)) + GOTO flow_44 + GOTO flow_47 + flow_44: + IF ((getItemIdInSlot(94, 5) == 19889) || (getItemIdInSlot(94, 5) == 19868)) + GOTO flow_45 + IF ((getItemIdInSlot(94, 5) == 19866) && (globalint_1402 > 0)) + GOTO flow_46 + GOTO flow_47 + flow_45: + flow_46: + ivar2 = add(ivar2, multiply(globalint_1402, 5)); + flow_47: + IF ((((((((arg1 == 12582996) || (arg1 == 12582999)) || (arg1 == 12583001)) || (arg1 == 12583003)) || (arg1 == 62259261)) || (arg1 == 62259263)) || (arg1 == 62259262)) || (arg1 == 62259267)) + GOTO flow_48 + GOTO flow_51 + flow_48: + IF ((getItemIdInSlot(94, 5) == 19889) || (getItemIdInSlot(94, 5) == 19868)) + GOTO flow_49 + IF ((getItemIdInSlot(94, 5) == 19866) && (globalint_1403 > 0)) + GOTO flow_50 + GOTO flow_51 + flow_49: + flow_50: + ivar2 = add(ivar2, multiply(globalint_1403, 7)); + flow_51: + if ((((((((bitconfig_4540 == 2) || (bitconfig_4540 == 3)) || (bitconfig_5493 != 0)) || (getItemIdInSlot(94, 1) == 15445)) || (getItemIdInSlot(94, 1) == 15446)) || (getItemIdInSlot(94, 1) == 15447)) || (getItemIdInSlot(94, 1) == 15448)) || (getItemIdInSlot(94, 1) == 15449)) { + ivar2 = add(ivar2, getItemAmtInContainer(93, 12850)); + } + return ivar2; + } + if (arg0 == 555) { + if (getItemAmtInContainer(94, 1383) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16997) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16999) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16163) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16164) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 18346) > 0) { + return 99999999; + } + if (script_1(94, 1395) > 0) { + return 99999999; + } + if (script_1(94, 1403) > 0) { + return 99999999; + } + if (script_1(94, 6562) > 0) { + return 99999999; + } + if (script_1(94, 6563) > 0) { + return 99999999; + } + if (script_1(94, 11736) > 0) { + return 99999999; + } + if (script_1(94, 11738) > 0) { + return 99999999; + } + if (script_1(94, 19325) > 0) { + return 99999999; + } + if (script_1(94, 21491) > 0) { + return 99999999; + } + if (script_1(94, 21495) > 0) { + return 99999999; + } + if (script_1(94, 21499) > 0) { + return 99999999; + } + if (script_1(94, 21506) > 0) { + return 99999999; + } + if (script_1(94, 21507) > 0) { + return 99999999; + } + if (script_1(94, 21504) > 0) { + return 99999999; + } + if (script_1(94, 21505) > 0) { + return 99999999; + } + ivar2 = add(add(add(add(add(add(getItemAmtInContainer(93, 555), getItemAmtInContainer(93, 17781)), getItemAmtInContainer(93, 16092)), script_1(93, 4694)), script_1(93, 4695)), script_1(93, 4698)), getItemAmtInContainer(93, 20940)); + if ((((((((bitconfig_4540 == 2) || (bitconfig_4540 == 3)) || (bitconfig_5493 != 0)) || (getItemIdInSlot(94, 1) == 15445)) || (getItemIdInSlot(94, 1) == 15446)) || (getItemIdInSlot(94, 1) == 15447)) || (getItemIdInSlot(94, 1) == 15448)) || (getItemIdInSlot(94, 1) == 15449)) { + ivar2 = add(ivar2, getItemAmtInContainer(93, 12850)); + } + return ivar2; + } + if (arg0 == 557) { + if (getItemAmtInContainer(94, 1385) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 17001) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 17003) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16165) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16166) > 0) { + return 99999999; + } + if (script_1(94, 1399) > 0) { + return 99999999; + } + if (script_1(94, 1407) > 0) { + return 99999999; + } + if (script_1(94, 3053) > 0) { + return 99999999; + } + if (script_1(94, 3054) > 0) { + return 99999999; + } + if (script_1(94, 6562) > 0) { + return 99999999; + } + if (script_1(94, 6563) > 0) { + return 99999999; + } + if (script_1(94, 19329) > 0) { + return 99999999; + } + if (script_1(94, 21492) > 0) { + return 99999999; + } + if (script_1(94, 21497) > 0) { + return 99999999; + } + if (script_1(94, 21501) > 0) { + return 99999999; + } + if (script_1(94, 21502) > 0) { + return 99999999; + } + if (script_1(94, 21503) > 0) { + return 99999999; + } + if (script_1(94, 21504) > 0) { + return 99999999; + } + if (script_1(94, 21505) > 0) { + return 99999999; + } + ivar2 = add(add(add(add(add(add(getItemAmtInContainer(93, 557), getItemAmtInContainer(93, 17782)), getItemAmtInContainer(93, 16093)), script_1(93, 4696)), script_1(93, 4699)), script_1(93, 4698)), getItemAmtInContainer(93, 20942)); + if ((((((((bitconfig_4540 == 2) || (bitconfig_4540 == 3)) || (bitconfig_5493 != 0)) || (getItemIdInSlot(94, 1) == 15445)) || (getItemIdInSlot(94, 1) == 15446)) || (getItemIdInSlot(94, 1) == 15447)) || (getItemIdInSlot(94, 1) == 15448)) || (getItemIdInSlot(94, 1) == 15449)) { + ivar2 = add(ivar2, getItemAmtInContainer(93, 12850)); + } + return ivar2; + } + if (arg0 == 554) { + if (getItemAmtInContainer(94, 1387) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 17005) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 17007) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16167) > 0) { + return 99999999; + } + if (getItemAmtInContainer(94, 16168) > 0) { + return 99999999; + } + if (script_1(94, 1393) > 0) { + return 99999999; + } + if (script_1(94, 1401) > 0) { + return 99999999; + } + if (script_1(94, 3053) > 0) { + return 99999999; + } + if (script_1(94, 3054) > 0) { + return 99999999; + } + if (script_1(94, 11736) > 0) { + return 99999999; + } + if (script_1(94, 11738) > 0) { + return 99999999; + } + if (script_1(94, 19323) > 0) { + return 99999999; + } + if (script_1(94, 21493) > 0) { + return 99999999; + } + if (script_1(94, 21494) > 0) { + return 99999999; + } + if (script_1(94, 21498) > 0) { + return 99999999; + } + if (script_1(94, 21502) > 0) { + return 99999999; + } + if (script_1(94, 21503) > 0) { + return 99999999; + } + if (script_1(94, 21506) > 0) { + return 99999999; + } + if (script_1(94, 21507) > 0) { + return 99999999; + } + ivar2 = add(add(add(add(add(add(getItemAmtInContainer(93, 554), getItemAmtInContainer(93, 17783)), getItemAmtInContainer(93, 16094)), script_1(93, 4694)), script_1(93, 4697)), script_1(93, 4699)), getItemAmtInContainer(93, 20939)); + if ((((((((bitconfig_4540 == 2) || (bitconfig_4540 == 3)) || (bitconfig_5493 != 0)) || (getItemIdInSlot(94, 1) == 15445)) || (getItemIdInSlot(94, 1) == 15446)) || (getItemIdInSlot(94, 1) == 15447)) || (getItemIdInSlot(94, 1) == 15448)) || (getItemIdInSlot(94, 1) == 15449)) { + ivar2 = add(ivar2, getItemAmtInContainer(93, 12850)); + } + return ivar2; + } + if (arg0 == 8843) { + return add(script_1(94, 2416), script_1(94, 8841)); + } + if (arg0 == 4170) { + return add(add(add(add(add(add(script_1(94, 4170), script_1(94, 15486)), script_1(94, 15502)), script_1(94, 22207)), script_1(94, 22213)), script_1(94, 22211)), script_1(94, 22209)); + } + if (((arg0 == 1409) || (arg0 == 2415)) || (arg0 == 2417)) { + return script_1(94, arg0); + } + if (arg0 == 13867) { + if (script_1(94, 13869) > 0) { + return script_1(94, 13869); + } + if (script_1(94, 13941) > 0) { + return script_1(94, 13941); + } + if (script_1(94, 13943) > 0) { + return script_1(94, 13943); + } + return script_1(94, arg0); + } + if (arg0 == 21514) { + return script_1(94, 21514); + } + if (((((((((bitconfig_4540 == 2) || (bitconfig_4540 == 3)) || (bitconfig_5493 != 0)) || (getItemIdInSlot(94, 1) == 15445)) || (getItemIdInSlot(94, 1) == 15446)) || (getItemIdInSlot(94, 1) == 15447)) || (getItemIdInSlot(94, 1) == 15448)) || (getItemIdInSlot(94, 1) == 15449)) && ((((((((((arg0 == 559) || (arg0 == 558)) || (arg0 == 564)) || (arg0 == 562)) || (arg0 == 561)) || (arg0 == 560)) || (arg0 == 563)) || (arg0 == 566)) || (arg0 == 565)) || (arg0 == 9075))) { + return add(script_1(93, arg0), script_1(93, 12851)); + } + switch (arg0) { + flow_202: + case 559: + return add(add(add(getItemAmtInContainer(93, 559), getItemAmtInContainer(93, 17788)), getItemAmtInContainer(93, 16099)), getItemAmtInContainer(93, 20944)); + case 558: + return add(add(add(getItemAmtInContainer(93, 558), getItemAmtInContainer(93, 17784)), getItemAmtInContainer(93, 16095)), getItemAmtInContainer(93, 20943)); + case 564: + return add(add(getItemAmtInContainer(93, 564), getItemAmtInContainer(93, 17789)), getItemAmtInContainer(93, 16100)); + case 562: + IF ((((((((arg1 == 12582946) || (arg1 == 12582951)) || (arg1 == 12582954)) || (arg1 == 12582957)) || (arg1 == 62259232)) || (arg1 == 62259237)) || (arg1 == 62259236)) || (arg1 == 62259241)) + GOTO flow_206 + GOTO flow_209 + flow_206: + IF ((getItemIdInSlot(94, 5) == 19671) || (getItemIdInSlot(94, 5) == 19867)) + GOTO flow_207 + IF ((getItemIdInSlot(94, 5) == 19865) && (globalint_1334 > 0)) + GOTO flow_208 + GOTO flow_209 + flow_207: + flow_208: + return add(add(add(add(getItemAmtInContainer(93, 562), getItemAmtInContainer(93, 17785)), getItemAmtInContainer(93, 16096)), globalint_1334), getItemAmtInContainer(93, 20947)); + flow_209: + return add(add(add(getItemAmtInContainer(93, 562), getItemAmtInContainer(93, 17785)), getItemAmtInContainer(93, 16096)), getItemAmtInContainer(93, 20947)); + case 561: + if ((getItemIdInSlot(94, 3) == 18341) && (globalint_1234 > 0)) { + return add(add(add(add(getItemAmtInContainer(93, 561), getItemAmtInContainer(93, 17791)), getItemAmtInContainer(93, 16102)), globalint_1234), getItemAmtInContainer(93, 20946)); + } + return add(add(getItemAmtInContainer(93, 561), getItemAmtInContainer(93, 17791)), getItemAmtInContainer(93, 16102)); + case 560: + IF ((((((((arg1 == 12582961) || (arg1 == 12582964)) || (arg1 == 12582970)) || (arg1 == 12582975)) || (arg1 == 62259242)) || (arg1 == 62259245)) || (arg1 == 62259243)) || (arg1 == 62259247)) + GOTO flow_217 + GOTO flow_220 + flow_217: + IF ((getItemIdInSlot(94, 5) == 19671) || (getItemIdInSlot(94, 5) == 19867)) + GOTO flow_218 + IF ((getItemIdInSlot(94, 5) == 19865) && (globalint_1335 > 0)) + GOTO flow_219 + GOTO flow_220 + flow_218: + flow_219: + return add(add(add(add(getItemAmtInContainer(93, 560), getItemAmtInContainer(93, 17786)), getItemAmtInContainer(93, 16097)), globalint_1335), getItemAmtInContainer(93, 20945)); + flow_220: + IF ((((((((arg1 == 12582996) || (arg1 == 12582999)) || (arg1 == 12583001)) || (arg1 == 12583003)) || (arg1 == 62259261)) || (arg1 == 62259263)) || (arg1 == 62259262)) || (arg1 == 62259267)) + GOTO flow_221 + GOTO flow_224 + flow_221: + IF ((getItemIdInSlot(94, 5) == 19889) || (getItemIdInSlot(94, 5) == 19868)) + GOTO flow_222 + IF ((getItemIdInSlot(94, 5) == 19866) && (globalint_1403 > 0)) + GOTO flow_223 + GOTO flow_224 + flow_222: + flow_223: + return add(add(add(getItemAmtInContainer(93, 560), getItemAmtInContainer(93, 17786)), getItemAmtInContainer(93, 16097)), globalint_1403); + flow_224: + return add(add(add(getItemAmtInContainer(93, 560), getItemAmtInContainer(93, 17786)), getItemAmtInContainer(93, 16097)), getItemAmtInContainer(93, 20945)); + case 563: + if ((getItemIdInSlot(94, 3) == 18342) && (globalint_1235 > 0)) { + return add(add(add(add(getItemAmtInContainer(93, 563), getItemAmtInContainer(93, 17792)), getItemAmtInContainer(93, 16103)), globalint_1235), getItemAmtInContainer(93, 20948)); + } + return add(add(getItemAmtInContainer(93, 563), getItemAmtInContainer(93, 17792)), getItemAmtInContainer(93, 16103)); + case 566: + return add(add(script_1(93, 566), script_1(93, 17793)), script_1(93, 16104)); + case 565: + IF ((((((((arg1 == 12582982) || (arg1 == 12582985)) || (arg1 == 12582989)) || (arg1 == 12582992)) || (arg1 == 62259248)) || (arg1 == 62259254)) || (arg1 == 62259249)) || (arg1 == 62259258)) + GOTO flow_233 + GOTO flow_236 + flow_233: + IF ((getItemIdInSlot(94, 5) == 19889) || (getItemIdInSlot(94, 5) == 19868)) + GOTO flow_234 + IF ((getItemIdInSlot(94, 5) == 19866) && (globalint_1402 > 0)) + GOTO flow_235 + GOTO flow_236 + flow_234: + flow_235: + return add(add(add(getItemAmtInContainer(93, 565), getItemAmtInContainer(93, 17787)), getItemAmtInContainer(93, 16098)), globalint_1402); + flow_236: + IF ((((((((arg1 == 12582996) || (arg1 == 12582999)) || (arg1 == 12583001)) || (arg1 == 12583003)) || (arg1 == 62259261)) || (arg1 == 62259263)) || (arg1 == 62259262)) || (arg1 == 62259267)) + GOTO flow_237 + GOTO flow_240 + flow_237: + IF ((getItemIdInSlot(94, 5) == 19889) || (getItemIdInSlot(94, 5) == 19868)) + GOTO flow_238 + IF ((getItemIdInSlot(94, 5) == 19866) && (globalint_1403 > 0)) + GOTO flow_239 + GOTO flow_240 + flow_238: + flow_239: + return add(add(add(getItemAmtInContainer(93, 565), getItemAmtInContainer(93, 17787)), getItemAmtInContainer(93, 16098)), globalint_1403); + flow_240: + return add(add(script_1(93, 565), script_1(93, 17787)), script_1(93, 16098)); + case 9075: + return add(add(script_1(93, 9075), script_1(93, 17790)), script_1(93, 16101)); + } + return script_1(93, arg0); +} diff --git a/dumps/scripts/190.cs2 b/dumps/scripts/190.cs2 new file mode 100644 index 000000000..774647e87 --- /dev/null +++ b/dumps/scripts/190.cs2 @@ -0,0 +1,4 @@ +void script_190(int arg0) { + setWidgetSprite(1024, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1900.cs2 b/dumps/scripts/1900.cs2 new file mode 100644 index 000000000..9533ea8ba --- /dev/null +++ b/dumps/scripts/1900.cs2 @@ -0,0 +1,63 @@ +void script_1900(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + string svar0; + globalint_159 = 0; + globalint_158 = 0; + ivar4 = 0; + while (setWidgetRegister(new WidgetPointer(arg0), ivar4)) { + if (ivar4 == arg2) { + setScriptCallOnMouseEntered(-1, ""); + setScriptCallOnMouseExit(-1, ""); + if (setWidgetRegister(new WidgetPointer(arg1), ivar4)) { + setWidgetHidden(0); + setWidgetRGB(new Color(150, 151, 119)); + } + } else { + setScriptCallOnMouseEntered(1082, subtract(arg3, 1), new WidgetPointer(arg1), ivar4, "iIi"); + setScriptCallOnMouseExit(1083, subtract(arg3, 1), new WidgetPointer(arg1), ivar4, "iIi"); + if (setWidgetRegister(new WidgetPointer(arg1), ivar4)) { + setWidgetHidden(1); + } + } + ivar4 = add(ivar4, 1); + } + globalint_128 = -1; + globalint_129 = 0; + globalstring_30 = ""; + svar0 = "Search phrases..."; + if (((boolean)globalint_126)) { + svar0 = "To " + globalstring_27 + ": " + "" + svar0; + } else if (globalint_126 == 2) { + svar0 = "[" + "" + cs2method3611() + "" + "]: " + "" + svar0; + } else if (globalint_126 == 8) { + if (cs2method3751()) { + svar0 = "[" + "" + cs2method3752() + "" + "]: " + "" + svar0; + } + } else if (globalint_126 == 10) { + if (cs2method3750()) { + svar0 = "[" + "" + cs2method3752() + "" + "]: " + "" + svar0; + } + } else { + svar0 = "" + svar0; + } + setWidgetIsHidden(true, new WidgetPointer(137,50)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + setWidgetIsHidden(false, new WidgetPointer(137,0)); + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(false, new WidgetPointer(137,13)); + setWidgetIsHidden(true, new WidgetPointer(137,17)); + setWidgetIsHidden(true, new WidgetPointer(137,1)); + setWidgetIsHidden(false, new WidgetPointer(137,3)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(137,3)); + setWidgetFont(495, new WidgetPointer(137,3)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(137,3)); + setWidgetText(new WidgetPointer(137,3), svar0); + setWidgetUnknownBoolean(false, new WidgetPointer(137,3)); + deleteAllExtraChilds(new WidgetPointer(137,16)); + setWidgetText(new WidgetPointer(137,14), "Search for: *"); + setScriptCallOnKeyPress(1901, -2147483640, false, new WidgetPointer(137,1), new WidgetPointer(137,14), new WidgetPointer(137,16), new WidgetPointer(137,15), 0, "izIIIIi", new WidgetPointer(137,13)); + setWidgetScrollMax(0, 0, new WidgetPointer(137,16)); + script_72(8978447, 8978448, 0); + return; +} diff --git a/dumps/scripts/1901.cs2 b/dumps/scripts/1901.cs2 new file mode 100644 index 000000000..189789242 --- /dev/null +++ b/dumps/scripts/1901.cs2 @@ -0,0 +1,118 @@ +void script_1901(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + if (arg0 == 104) { + if (((boolean)arg6)) { + return; + } + if (globalint_128 <= 0) { + globalint_128 = subtract(arg6, 1); + } else { + globalint_128 = subtract(globalint_128, 1); + } + if (setWidgetRegister(new WidgetPointer(arg4), add(globalint_128, 1))) { + if (setWidgetRegister(new WidgetPointer(arg4), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + } + if (getWidgetActualY() < cs2method2601(new WidgetPointer(arg4))) { + script_72(arg5, arg4, subtract(cs2method2601(new WidgetPointer(arg4)), getWidgetActualHeight())); + } else { + if (add(getWidgetActualY(), getWidgetActualHeight()) > add(getWidgetActualHeight(new WidgetPointer(arg4)), cs2method2601(new WidgetPointer(arg4)))) { + script_72(arg5, arg4, getWidgetScrollMaxV(new WidgetPointer(arg4))); + } + } + } + return; + } + if (arg0 == 105) { + if (((boolean)arg6)) { + return; + } + if (globalint_128 == subtract(arg6, 1)) { + globalint_128 = 0; + } else { + globalint_128 = add(globalint_128, 1); + } + if (setWidgetRegister(new WidgetPointer(arg4), add(globalint_128, 1))) { + if (setWidgetRegister(new WidgetPointer(arg4), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + } + if (add(getWidgetActualY(), getWidgetActualHeight()) > add(getWidgetActualHeight(new WidgetPointer(arg4)), cs2method2601(new WidgetPointer(arg4)))) { + script_72(arg5, arg4, add(cs2method2601(new WidgetPointer(arg4)), getWidgetActualHeight())); + } else { + if (getWidgetActualY() < cs2method2601(new WidgetPointer(arg4))) { + script_72(arg5, arg4, 0); + } + } + } + return; + } + if (arg0 == 102) { + script_1050(globalint_126, globalstring_27); + return; + } + if (arg0 == 13) { + script_1054(); + return; + } + ivar7 = strLength(globalstring_30); + ivar8 = cs2method5071(0, globalstring_30); + ivar9 = 0; + ivar10 = -1; + if (arg0 == 84) { + if (globalint_128 < 0) { + if (ivar7 > 0) { + globalint_129 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg3)); + script_1904(arg2, arg4, arg5); + } else { + script_1054(); + } + } else { + if (((ivar8 > 0) && setWidgetRegister(new WidgetPointer(arg4), add(globalint_128, 1))) && (ivar9 < ivar8)) { + while (true) { + ivar10 = cs2method5072(); + if (((boolean)stringMethod4107(getWidgetText(), cs2method5055(ivar10)))) { + script_1071(arg2, ivar10, 0); + return; + } + ivar9 = add(ivar9, 1); + } + } + } + return; + } + if (arg0 == 85) { + if (ivar7 > 0) { + globalstring_30 = substr(0, subtract(ivar7, 1), globalstring_30); + } else if (((boolean)globalint_127)) { + script_1054(); + } else { + globalint_128 = -1; + setWidgetIsHidden(true, new WidgetPointer(137,7)); + setWidgetIsHidden(true, new WidgetPointer(137,9)); + setWidgetIsHidden(true, new WidgetPointer(137,13)); + setWidgetIsHidden(false, new WidgetPointer(137,17)); + setWidgetIsHidden(false, new WidgetPointer(137,1)); + setWidgetIsHidden(true, new WidgetPointer(137,3)); + script_1068(arg2, 0); + return; + } + } else if (isValidChar(((char)arg1)) && (ivar7 < 80)) { + globalstring_30 = strRemoveEntities(concatChar(((char)arg1), globalstring_30)); + } else { + return; + } + setWidgetText(new WidgetPointer(arg3), "Search for: " + globalstring_30 + "*"); + globalint_129 = 50; + setScriptCallOnGameloop(1903, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "IIII", new WidgetPointer(arg3)); + return; +} diff --git a/dumps/scripts/1902.cs2 b/dumps/scripts/1902.cs2 new file mode 100644 index 000000000..4cbc4bad1 --- /dev/null +++ b/dumps/scripts/1902.cs2 @@ -0,0 +1,75 @@ +void script_1902(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + globalint_128 = -1; + ivar3 = cs2method5071(0, globalstring_30); + ivar4 = getWidgetActualWidth(new WidgetPointer(arg1)); + ivar5 = subtract(ivar4, 8); + if (ivar3 == -1) { + createExtraChild(new WidgetPointer(arg1), 4, 0); + setWidgetPosition(0, 48, 0, 0); + setWidgetSize(ivar4, 14, 0, 0); + setWidgetFont(495); + setWidgetText("Too many results. Please refine your search."); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + script_1905(arg1, arg2); + return; + } + if (((boolean)ivar3)) { + createExtraChild(new WidgetPointer(arg1), 4, 0); + setWidgetPosition(0, 48, 0, 0); + setWidgetSize(ivar4, 14, 0, 0); + setWidgetFont(495); + setWidgetText("No matching items found."); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + script_1905(arg1, arg2); + return; + } + ivar6 = 1; + ivar7 = cs2method5072(); + svar0 = ""; + createExtraChild(new WidgetPointer(arg1), 3, 0); + while (ivar7 != -1) { + if (stringMethod4107(svar0, cs2method5055(ivar7)) != 0) { + svar0 = cs2method5055(ivar7); + createExtraChild(new WidgetPointer(arg1), 4, ivar6); + setWidgetPosition(4, multiply(14, subtract(ivar6, 1)), 0, 0); + setWidgetSize(ivar5, 14, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetText(cs2method5055(ivar7)); + setWidgetFont(495); + setWidgetUnknownBoolean(false); + setScriptCallOnMouseEntered(1906, ivar6, new WidgetPointer(arg1), "iI"); + setScriptCallOnMousePressed(1070, new WidgetPointer(arg0), ivar7, 0, "Iei"); + ivar6 = add(ivar6, 1); + } + ivar7 = cs2method5072(); + } + if (((boolean)ivar6)) { + createExtraChild(new WidgetPointer(arg1), 4, 0); + setWidgetPosition(0, 48, 0, 0); + setWidgetSize(ivar4, 14, 0, 0); + setWidgetFont(495); + setWidgetText("No matching items found."); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + script_1905(arg1, arg2); + return; + } + setScriptCallOnKeyPress(1901, -2147483640, false, new WidgetPointer(137,1), new WidgetPointer(137,14), new WidgetPointer(137,16), new WidgetPointer(137,15), subtract(ivar6, 1), "izIIIIi", new WidgetPointer(137,13)); + setWidgetScrollMax(0, multiply(14, subtract(ivar6, 1)), new WidgetPointer(arg1)); + script_1905(arg1, arg2); + return; +} diff --git a/dumps/scripts/1903.cs2 b/dumps/scripts/1903.cs2 new file mode 100644 index 000000000..07e87d894 --- /dev/null +++ b/dumps/scripts/1903.cs2 @@ -0,0 +1,9 @@ +void script_1903(int arg0,int arg1,int arg2,int arg3) { + globalint_129 = subtract(globalint_129, 1); + if (globalint_129 > 0) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + script_1904(arg0, arg2, arg3); + return; +} diff --git a/dumps/scripts/1904.cs2 b/dumps/scripts/1904.cs2 new file mode 100644 index 000000000..6e44917d5 --- /dev/null +++ b/dumps/scripts/1904.cs2 @@ -0,0 +1,10 @@ +void script_1904(int arg0,int arg1,int arg2) { + deleteAllExtraChilds(new WidgetPointer(arg1)); + if (strLength(globalstring_30) > 0) { + script_1902(arg0, arg1, arg2); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + script_1905(arg1, arg2); + } + return; +} diff --git a/dumps/scripts/1905.cs2 b/dumps/scripts/1905.cs2 new file mode 100644 index 000000000..438b858f3 --- /dev/null +++ b/dumps/scripts/1905.cs2 @@ -0,0 +1,19 @@ +void script_1905(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = getWidgetScrollMaxV(new WidgetPointer(arg0)); + ivar4 = subtract(ivar3, ivar2); + if (ivar4 < 0) { + ivar4 = 0; + } + ivar5 = cs2method2601(new WidgetPointer(arg0)); + if (ivar5 > ivar4) { + ivar5 = ivar4; + } + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + script_72(arg1, arg0, ivar5); + return; +} diff --git a/dumps/scripts/1906.cs2 b/dumps/scripts/1906.cs2 new file mode 100644 index 000000000..faa7aaa66 --- /dev/null +++ b/dumps/scripts/1906.cs2 @@ -0,0 +1,12 @@ +void script_1906(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + globalint_128 = subtract(arg0, 1); + if (setWidgetRegister(new WidgetPointer(arg1), 0)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetRGB(new Color(87, 126, 69)); + setWidgetFilled(1); + } + } + return; +} diff --git a/dumps/scripts/1907.cs2 b/dumps/scripts/1907.cs2 new file mode 100644 index 000000000..1812be905 --- /dev/null +++ b/dumps/scripts/1907.cs2 @@ -0,0 +1,4 @@ +void script_1907() { + setScriptCallOnGlobalConfigChange(1908, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 17, "Y", new WidgetPointer(806,138)); + return; +} diff --git a/dumps/scripts/1908.cs2 b/dumps/scripts/1908.cs2 new file mode 100644 index 000000000..09f46e83d --- /dev/null +++ b/dumps/scripts/1908.cs2 @@ -0,0 +1,160 @@ +void script_1908() { + int ivar0; + string svar0; + ivar0 = 12; + svar0 = ""; + setWidgetSize(16, divide(multiply(divide(multiply(globalint_564, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,138)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_565, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,139)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_566, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,140)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_567, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,144)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_568, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,148)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_569, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,82)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_570, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,86)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_571, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,90)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_572, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,94)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_573, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,61)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_574, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,65)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_575, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,69)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_576, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,73)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_577, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,103)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_578, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,107)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_579, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,111)); + setWidgetSize(16, divide(multiply(divide(multiply(globalint_580, 100), ivar0), 16384), 100), 0, 2, new WidgetPointer(806,115)); + if (((boolean)globalint_564)) { + svar0 = "There are no class 1 clay locations in the area."; + } else if (((boolean)globalint_564)) { + svar0 = "There is 1 class 1 clay location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_564) + " class 1 clay locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,138)); + if (((boolean)globalint_565)) { + svar0 = "There are no class 2 fishing locations in the area."; + } else if (((boolean)globalint_565)) { + svar0 = "There is 1 class 2 fishing location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_565) + " class 2 fishing locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,139)); + if (((boolean)globalint_566)) { + svar0 = "There are no class 3 fishing locations in the area."; + } else if (((boolean)globalint_566)) { + svar0 = "There is 1 class 3 fishing location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_566) + " class 3 fishing locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,140)); + if (((boolean)globalint_567)) { + svar0 = "There are no class 4 fishing locations in the area."; + } else if (((boolean)globalint_567)) { + svar0 = "There is 1 class 4 fishing location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_567) + " class 4 fishing locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,144)); + if (((boolean)globalint_568)) { + svar0 = "There are no class 5 fishing locations in the area."; + } else if (((boolean)globalint_568)) { + svar0 = "There is 1 class 5 fishing location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_568) + " class 5 fishing locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,148)); + if (((boolean)globalint_569)) { + svar0 = "There are no class 2 mining locations in the area."; + } else if (((boolean)globalint_569)) { + svar0 = "There is 1 class 2 mining location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_569) + " class 2 mining locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,82)); + if (((boolean)globalint_570)) { + svar0 = "There are no class 3 mining locations in the area."; + } else if (((boolean)globalint_570)) { + svar0 = "There is 1 class 3 mining location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_570) + " class 3 mining locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,86)); + if (((boolean)globalint_571)) { + svar0 = "There are no class 4 mining locations in the area."; + } else if (((boolean)globalint_571)) { + svar0 = "There is 1 class 4 mining location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_571) + " class 4 mining locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,90)); + if (((boolean)globalint_572)) { + svar0 = "There are no class 5 mining locations in the area."; + } else if (((boolean)globalint_572)) { + svar0 = "There is 1 class 5 mining location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_572) + " class 5 mining locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,94)); + if (((boolean)globalint_573)) { + svar0 = "There are no class 2 woodcutting locations in the area."; + } else if (((boolean)globalint_573)) { + svar0 = "There is 1 class 2 woodcutting location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_573) + " class 2 woodcutting locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,61)); + if (((boolean)globalint_574)) { + svar0 = "There are no class 3 woodcutting locations in the area."; + } else if (((boolean)globalint_574)) { + svar0 = "There is 1 class 3 woodcutting location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_574) + " class 3 woodcutting locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,65)); + if (((boolean)globalint_575)) { + svar0 = "There are no class 4 woodcutting locations in the area."; + } else if (((boolean)globalint_575)) { + svar0 = "There is 1 class 4 woodcutting location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_575) + " class 4 woodcutting locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,69)); + if (((boolean)globalint_576)) { + svar0 = "There are no class 5 woodcutting locations in the area."; + } else if (((boolean)globalint_576)) { + svar0 = "There is 1 class 5 woodcutting location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_576) + " class 5 woodcutting locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,73)); + if (((boolean)globalint_577)) { + svar0 = "There are no class 2 hunting locations in the area."; + } else if (((boolean)globalint_577)) { + svar0 = "There is 1 class 2 hunting location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_577) + " class 2 hunting locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,103)); + if (((boolean)globalint_578)) { + svar0 = "There are no class 3 hunting locations in the area."; + } else if (((boolean)globalint_578)) { + svar0 = "There is 1 class 3 hunting location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_578) + " class 3 hunting locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,107)); + if (((boolean)globalint_579)) { + svar0 = "There are no class 4 hunting locations in the area."; + } else if (((boolean)globalint_579)) { + svar0 = "There is 1 class 4 hunting location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_579) + " class 4 hunting locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,111)); + if (((boolean)globalint_580)) { + svar0 = "There are no class 5 hunting locations in the area."; + } else if (((boolean)globalint_580)) { + svar0 = "There is 1 class 5 hunting location in the area."; + } else { + svar0 = "There are " + intToStr(globalint_580) + " class 5 hunting locations in the area."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(806,49), svar0, 25, 100, "IIsii", new WidgetPointer(806,115)); + return; +} diff --git a/dumps/scripts/1909.cs2 b/dumps/scripts/1909.cs2 new file mode 100644 index 000000000..9cb40496e --- /dev/null +++ b/dumps/scripts/1909.cs2 @@ -0,0 +1,8 @@ +void script_1909() { + if (isWidgetHidden(new WidgetPointer(806,122))) { + setWidgetIsHidden(false, new WidgetPointer(806,122)); + } else { + setWidgetIsHidden(true, new WidgetPointer(806,122)); + } + return; +} diff --git a/dumps/scripts/191.cs2 b/dumps/scripts/191.cs2 new file mode 100644 index 000000000..29ec58be8 --- /dev/null +++ b/dumps/scripts/191.cs2 @@ -0,0 +1,4 @@ +void script_191(int arg0) { + setWidgetSprite(1024, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1910.cs2 b/dumps/scripts/1910.cs2 new file mode 100644 index 000000000..4036e91dc --- /dev/null +++ b/dumps/scripts/1910.cs2 @@ -0,0 +1,13 @@ +void script_1910() { + setWidgetIsHidden(false, new WidgetPointer(813,16)); + setWidgetIsHidden(false, new WidgetPointer(813,76)); + setWidgetIsHidden(true, new WidgetPointer(813,17)); + setWidgetIsHidden(true, new WidgetPointer(813,77)); + setWidgetIsHidden(true, new WidgetPointer(813,18)); + setWidgetIsHidden(true, new WidgetPointer(813,78)); + setWidgetIsHidden(true, new WidgetPointer(813,19)); + setWidgetIsHidden(true, new WidgetPointer(813,79)); + setWidgetIsHidden(true, new WidgetPointer(813,75)); + globalint_582 = 0; + return; +} diff --git a/dumps/scripts/1911.cs2 b/dumps/scripts/1911.cs2 new file mode 100644 index 000000000..7cd1fe91c --- /dev/null +++ b/dumps/scripts/1911.cs2 @@ -0,0 +1,13 @@ +void script_1911() { + setWidgetIsHidden(true, new WidgetPointer(813,16)); + setWidgetIsHidden(true, new WidgetPointer(813,76)); + setWidgetIsHidden(false, new WidgetPointer(813,17)); + setWidgetIsHidden(false, new WidgetPointer(813,77)); + setWidgetIsHidden(true, new WidgetPointer(813,18)); + setWidgetIsHidden(true, new WidgetPointer(813,78)); + setWidgetIsHidden(true, new WidgetPointer(813,19)); + setWidgetIsHidden(true, new WidgetPointer(813,79)); + setWidgetIsHidden(true, new WidgetPointer(813,75)); + globalint_582 = 0; + return; +} diff --git a/dumps/scripts/1912.cs2 b/dumps/scripts/1912.cs2 new file mode 100644 index 000000000..6c4a7cc3a --- /dev/null +++ b/dumps/scripts/1912.cs2 @@ -0,0 +1,13 @@ +void script_1912() { + setWidgetIsHidden(true, new WidgetPointer(813,16)); + setWidgetIsHidden(true, new WidgetPointer(813,76)); + setWidgetIsHidden(true, new WidgetPointer(813,17)); + setWidgetIsHidden(true, new WidgetPointer(813,77)); + setWidgetIsHidden(false, new WidgetPointer(813,18)); + setWidgetIsHidden(false, new WidgetPointer(813,78)); + setWidgetIsHidden(true, new WidgetPointer(813,19)); + setWidgetIsHidden(true, new WidgetPointer(813,79)); + setWidgetIsHidden(true, new WidgetPointer(813,75)); + globalint_582 = 0; + return; +} diff --git a/dumps/scripts/1913.cs2 b/dumps/scripts/1913.cs2 new file mode 100644 index 000000000..a872578a5 --- /dev/null +++ b/dumps/scripts/1913.cs2 @@ -0,0 +1,13 @@ +void script_1913() { + setWidgetIsHidden(true, new WidgetPointer(813,16)); + setWidgetIsHidden(true, new WidgetPointer(813,76)); + setWidgetIsHidden(true, new WidgetPointer(813,17)); + setWidgetIsHidden(true, new WidgetPointer(813,77)); + setWidgetIsHidden(true, new WidgetPointer(813,18)); + setWidgetIsHidden(true, new WidgetPointer(813,78)); + setWidgetIsHidden(false, new WidgetPointer(813,19)); + setWidgetIsHidden(false, new WidgetPointer(813,79)); + setWidgetIsHidden(true, new WidgetPointer(813,75)); + globalint_582 = 0; + return; +} diff --git a/dumps/scripts/1914.cs2 b/dumps/scripts/1914.cs2 new file mode 100644 index 000000000..8a13dd144 --- /dev/null +++ b/dumps/scripts/1914.cs2 @@ -0,0 +1,3 @@ +void script_1914(int arg0) { + return; +} diff --git a/dumps/scripts/1915.cs2 b/dumps/scripts/1915.cs2 new file mode 100644 index 000000000..2261c5114 --- /dev/null +++ b/dumps/scripts/1915.cs2 @@ -0,0 +1,6 @@ +void script_1915() { + setWidgetIsHidden(true, new WidgetPointer(813,75)); + globalint_582 = 0; + setScriptCallOnGlobalConfigChange(1918, 583, 584, 585, 586, 587, 5, "Y", new WidgetPointer(813,27)); + return; +} diff --git a/dumps/scripts/1916.cs2 b/dumps/scripts/1916.cs2 new file mode 100644 index 000000000..c39aa8458 --- /dev/null +++ b/dumps/scripts/1916.cs2 @@ -0,0 +1,23 @@ +void script_1916(int arg0) { + if ((arg0 == 53280867) && (globalint_583 > 0)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + return; + } + if ((arg0 == 53280869) && (globalint_584 > 0)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + return; + } + if ((arg0 == 53280871) && (globalint_585 > 0)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + return; + } + if ((arg0 == 53280873) && (globalint_586 > 0)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + return; + } + if ((arg0 == 53280875) && (globalint_587 > 0)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + return; + } + return; +} diff --git a/dumps/scripts/1917.cs2 b/dumps/scripts/1917.cs2 new file mode 100644 index 000000000..eba459218 --- /dev/null +++ b/dumps/scripts/1917.cs2 @@ -0,0 +1,38 @@ +void script_1917(int arg0) { + if (arg0 == 53280867) { + if (globalint_583 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(arg0)); + return; + } + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(arg0)); + } + if (arg0 == 53280869) { + if (globalint_584 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(arg0)); + return; + } + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(arg0)); + } + if (arg0 == 53280871) { + if (globalint_585 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(arg0)); + return; + } + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(arg0)); + } + if (arg0 == 53280873) { + if (globalint_586 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(arg0)); + return; + } + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(arg0)); + } + if (arg0 == 53280875) { + if (globalint_587 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(arg0)); + return; + } + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1918.cs2 b/dumps/scripts/1918.cs2 new file mode 100644 index 000000000..28c5b90ac --- /dev/null +++ b/dumps/scripts/1918.cs2 @@ -0,0 +1,4 @@ +void script_1918() { + script_1919(); + return; +} diff --git a/dumps/scripts/1919.cs2 b/dumps/scripts/1919.cs2 new file mode 100644 index 000000000..273c2f147 --- /dev/null +++ b/dumps/scripts/1919.cs2 @@ -0,0 +1,28 @@ +void script_1919() { + if (globalint_583 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(813,99)); + } else { + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(813,99)); + } + if (globalint_584 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(813,101)); + } else { + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(813,101)); + } + if (globalint_585 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(813,103)); + } else { + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(813,103)); + } + if (globalint_586 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(813,105)); + } else { + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(813,105)); + } + if (globalint_587 > 0) { + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(813,107)); + } else { + setWidgetRGB(new Color(51, 51, 51), new WidgetPointer(813,107)); + } + return; +} diff --git a/dumps/scripts/192.cs2 b/dumps/scripts/192.cs2 new file mode 100644 index 000000000..206c8f599 --- /dev/null +++ b/dumps/scripts/192.cs2 @@ -0,0 +1,93 @@ +void script_192() { + int ivar0; + int ivar1; + if (standart_config_281 < 1000) { + return; + } + ivar0 = cs2method5017(); + ivar1 = 0; + if (ivar0 > globalint_43) { + if (((boolean)globalint_41)) { + globalint_43 = ivar0; + return; + } + ivar0 = subtract(subtract(ivar0, globalint_43), 1); + if (ivar0 >= 100) { + ivar0 = 99; + } + while (ivar0 >= 0) { + ivar1 = cs2method5004(ivar0); + if (((boolean)script_90(ivar0, 0)) && ((boolean)script_506(ivar0))) { + switch (ivar1) { + case 0: + case 4: + case 27: + case 26: + case 29: + case 28: + case 110: + case 109: + case 117: + script_180(1); + break; + case 1: + case 2: + case 17: + case 116: + script_180(2); + break; + case 3: + case 5: + case 6: + case 7: + case 19: + case 18: + case 31: + case 30: + script_180(3); + break; + case 9: + case 11: + case 20: + case 107: + script_180(4); + break; + case 103: + case 100: + case 101: + case 111: + case 108: + case 106: + case 105: + case 118: + case 114: + case 113: + case 112: + script_180(5); + break; + case 102: + case 104: + script_180(6); + break; + case 42: + case 43: + case 41: + script_180(7); + break; + case 46: + case 44: + case 45: + script_180(7); + break; + case 115: + if (strLength(cs2method5003(ivar0)) > 1) { + script_180(1); + } + } + } + ivar0 = subtract(ivar0, 1); + } + globalint_43 = cs2method5017(); + } + return; +} diff --git a/dumps/scripts/1920.cs2 b/dumps/scripts/1920.cs2 new file mode 100644 index 000000000..a77526f02 --- /dev/null +++ b/dumps/scripts/1920.cs2 @@ -0,0 +1,15 @@ +void script_1920() { + setScriptCallOnGlobalStringChange(1921, 40, 1, "Y", new WidgetPointer(812,5)); + setScriptCallOnGlobalStringChange(1921, 41, 1, "Y", new WidgetPointer(812,6)); + setScriptCallOnGlobalStringChange(1921, 42, 1, "Y", new WidgetPointer(812,7)); + setScriptCallOnGlobalConfigChange(1921, 551, 1, "Y", new WidgetPointer(812,5)); + setScriptCallOnGlobalConfigChange(1921, 552, 1, "Y", new WidgetPointer(812,6)); + setScriptCallOnGlobalConfigChange(1921, 553, 1, "Y", new WidgetPointer(812,7)); + globalstring_40 = "You have no clan leader."; + globalstring_41 = "You have no allied clans."; + globalstring_42 = ""; + globalint_551 = 0; + globalint_552 = 0; + globalint_553 = 0; + return; +} diff --git a/dumps/scripts/1921.cs2 b/dumps/scripts/1921.cs2 new file mode 100644 index 000000000..1b1cdf402 --- /dev/null +++ b/dumps/scripts/1921.cs2 @@ -0,0 +1,18 @@ +void script_1921() { + if (globalint_551 > 0) { + setWidgetText(new WidgetPointer(812,5), concat(concat(globalint_551, concat(globalstring_40, " (")), ")")); + } else { + setWidgetText(new WidgetPointer(812,5), globalstring_40); + } + if (globalint_552 > 0) { + setWidgetText(new WidgetPointer(812,6), concat(concat(globalint_552, concat(globalstring_41, " (")), ")")); + } else { + setWidgetText(new WidgetPointer(812,6), globalstring_41); + } + if (globalint_553 > 0) { + setWidgetText(new WidgetPointer(812,7), concat(concat(globalint_553, concat(globalstring_42, " (")), ")")); + } else { + setWidgetText(new WidgetPointer(812,7), globalstring_42); + } + return; +} diff --git a/dumps/scripts/1922.cs2 b/dumps/scripts/1922.cs2 new file mode 100644 index 000000000..9be6f35e2 --- /dev/null +++ b/dumps/scripts/1922.cs2 @@ -0,0 +1,4 @@ +void script_1922() { + setScriptCallOnGlobalConfigChange(1923, 550, 554, 555, 3, "Y", new WidgetPointer(804,11)); + return; +} diff --git a/dumps/scripts/1923.cs2 b/dumps/scripts/1923.cs2 new file mode 100644 index 000000000..33ebc96e4 --- /dev/null +++ b/dumps/scripts/1923.cs2 @@ -0,0 +1,28 @@ +void script_1923() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = globalint_550; + ivar1 = globalint_554; + ivar2 = globalint_555; + ivar3 = 0; + if (((boolean)ivar0)) { + ivar1 = max(0, min(subtract(5, ivar1), 5)); + ivar2 = max(0, min(subtract(5, ivar2), 5)); + setWidgetText(new WidgetPointer(804,34), intToStr(ivar1)); + setWidgetText(new WidgetPointer(804,33), intToStr(ivar2)); + setWidgetIsHidden(false, new WidgetPointer(804,2)); + } else { + setWidgetIsHidden(true, new WidgetPointer(804,2)); + if (mod(ivar0, 100) != 0) { + ivar3 = 1; + } + ivar0 = divide(divide(multiply(ivar0, 60), 100), 60); + if (((boolean)ivar3)) { + ivar0 = add(ivar0, 1); + } + setWidgetText(new WidgetPointer(804,1), "Game start : " + intToStr(ivar0) + " mins"); + } + return; +} diff --git a/dumps/scripts/1924.cs2 b/dumps/scripts/1924.cs2 new file mode 100644 index 000000000..6a60b2752 --- /dev/null +++ b/dumps/scripts/1924.cs2 @@ -0,0 +1,13 @@ +void script_1924() { + setWidgetText(new WidgetPointer(811,127), concat(intToStr(20), "
" + "points.")); + setWidgetText(new WidgetPointer(811,65), concat(intToStr(20), "
" + "points.")); + setWidgetText(new WidgetPointer(811,49), concat(intToStr(30), "
" + "points.")); + setWidgetText(new WidgetPointer(811,106), concat(intToStr(28), "
" + "points.")); + setWidgetText(new WidgetPointer(811,92), concat(intToStr(24), "
" + "points.")); + setWidgetText(new WidgetPointer(811,78), concat(intToStr(26), "
" + "points.")); + setItemOnWidgetMethod2200(14385, 1, new WidgetPointer(811,74)); + setWidget3DRotation(0, 0, 1274, 876, 625, 1715, new WidgetPointer(811,74)); + script_1929(); + globalint_544 = 0; + return; +} diff --git a/dumps/scripts/1925.cs2 b/dumps/scripts/1925.cs2 new file mode 100644 index 000000000..67375bb21 --- /dev/null +++ b/dumps/scripts/1925.cs2 @@ -0,0 +1,4 @@ +void script_1925(int arg0) { + script_1927(arg0); + return; +} diff --git a/dumps/scripts/1926.cs2 b/dumps/scripts/1926.cs2 new file mode 100644 index 000000000..fe565221e --- /dev/null +++ b/dumps/scripts/1926.cs2 @@ -0,0 +1,5 @@ +void script_1926(int arg0) { + script_1928(); + script_41(53149804); + return; +} diff --git a/dumps/scripts/1927.cs2 b/dumps/scripts/1927.cs2 new file mode 100644 index 000000000..ec108c89a --- /dev/null +++ b/dumps/scripts/1927.cs2 @@ -0,0 +1,17 @@ +void script_1927(int arg0) { + int ivar1; + ivar1 = 1; + while (ivar1 <= 6) { + if ((ivar1 == cs2method_3408(73, 105, 2027, arg0)) || (ivar1 == globalint_544)) { + setWidgetIsHidden(false, cs2method_3408(105, 73, 2031, ivar1)); + setWidgetRGB(new Color(255, 255, 255), cs2method_3408(105, 73, 2030, ivar1)); + setWidgetRGB(new Color(255, 255, 255), cs2method_3408(105, 73, 2029, ivar1)); + } else { + setWidgetIsHidden(true, cs2method_3408(105, 73, 2031, ivar1)); + setWidgetRGB(new Color(200, 170, 100), cs2method_3408(105, 73, 2030, ivar1)); + setWidgetRGB(new Color(200, 170, 100), cs2method_3408(105, 73, 2029, ivar1)); + } + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/1928.cs2 b/dumps/scripts/1928.cs2 new file mode 100644 index 000000000..43081108a --- /dev/null +++ b/dumps/scripts/1928.cs2 @@ -0,0 +1,17 @@ +void script_1928() { + int ivar0; + ivar0 = 1; + while (ivar0 <= 6) { + if (ivar0 == globalint_544) { + setWidgetIsHidden(false, cs2method_3408(105, 73, 2031, ivar0)); + setWidgetRGB(new Color(255, 255, 255), cs2method_3408(105, 73, 2030, ivar0)); + setWidgetRGB(new Color(255, 255, 255), cs2method_3408(105, 73, 2029, ivar0)); + } else { + setWidgetIsHidden(true, cs2method_3408(105, 73, 2031, ivar0)); + setWidgetRGB(new Color(200, 170, 100), cs2method_3408(105, 73, 2030, ivar0)); + setWidgetRGB(new Color(200, 170, 100), cs2method_3408(105, 73, 2029, ivar0)); + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/1929.cs2 b/dumps/scripts/1929.cs2 new file mode 100644 index 000000000..c48851739 --- /dev/null +++ b/dumps/scripts/1929.cs2 @@ -0,0 +1,21 @@ +void script_1929() { + setWidgetIsHidden(true, new WidgetPointer(811,110)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,126)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,127)); + setWidgetIsHidden(true, new WidgetPointer(811,52)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,63)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,65)); + setWidgetIsHidden(true, new WidgetPointer(811,38)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,48)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,49)); + setWidgetIsHidden(true, new WidgetPointer(811,95)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,105)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,106)); + setWidgetIsHidden(true, new WidgetPointer(811,81)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,91)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,92)); + setWidgetIsHidden(true, new WidgetPointer(811,67)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,77)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,78)); + return; +} diff --git a/dumps/scripts/193.cs2 b/dumps/scripts/193.cs2 new file mode 100644 index 000000000..7a6c94afe --- /dev/null +++ b/dumps/scripts/193.cs2 @@ -0,0 +1,92 @@ +int script_193(int arg0) { + int ivar1; + if (((boolean)globalint_41)) { + return 1; + } + ivar1 = cs2method5004(arg0); + if (ivar1 == -1) { + return 0; + } + if (ivar1 == 115) { + return 1; + } + switch (globalint_41) { + flow_7: + case 1: + if ((((((((((boolean)ivar1) || (ivar1 == 4)) || (ivar1 == 27)) || (ivar1 == 28)) || (ivar1 == 29)) || (ivar1 == 109)) || (ivar1 == 110)) || (ivar1 == 26)) || (ivar1 == 117)) { + return 1; + } + break; + case 2: + if (((((boolean)ivar1) || (ivar1 == 2)) || (ivar1 == 17)) || (ivar1 == 116)) { + return 1; + } + break; + case 3: + switch (ivar1) { + case 19: + case 3: + case 18: + case 5: + case 6: + case 7: + case 31: + case 30: + return 1; + } + break; + case 4: + switch (ivar1) { + case 20: + case 9: + case 11: + return 1; + } + break; + case 5: + switch (ivar1) { + case 118: + case 103: + case 100: + case 101: + case 114: + case 113: + case 112: + case 111: + case 108: + case 106: + case 105: + return 1; + } + if (((boolean)script_506(arg0))) { + return 1; + } + break; + case 6: + if ((ivar1 == 102) || (ivar1 == 104)) { + return 1; + } + break; + case 7: + SWITCH (ivar1) { + case 42: + GOTO flow_28 + case 43: + GOTO flow_28 + case 41: + GOTO flow_28 + case 46: + GOTO flow_28 + case 107: + GOTO flow_28 + case 44: + GOTO flow_28 + case 45: + GOTO flow_28 + } + break; + flow_28: + return 1; + } + return 0; +} diff --git a/dumps/scripts/1930.cs2 b/dumps/scripts/1930.cs2 new file mode 100644 index 000000000..d49276133 --- /dev/null +++ b/dumps/scripts/1930.cs2 @@ -0,0 +1,17 @@ +int script_1930(int arg0) { + switch (arg0) { + case 1: + return 20; + case 2: + return 20; + case 3: + return 30; + case 4: + return 28; + case 5: + return 24; + case 6: + return 26; + } + return -1; +} diff --git a/dumps/scripts/1931.cs2 b/dumps/scripts/1931.cs2 new file mode 100644 index 000000000..be5b719a9 --- /dev/null +++ b/dumps/scripts/1931.cs2 @@ -0,0 +1,21 @@ +int script_1931(int arg0) { + if (arg0 == 53149717) { + return 1; + } + if (arg0 == 53149718) { + return 2; + } + if (arg0 == 53149719) { + return 3; + } + if (arg0 == 53149720) { + return 4; + } + if (arg0 == 53149721) { + return 5; + } + if (arg0 == 53149722) { + return 6; + } + return 0; +} diff --git a/dumps/scripts/1932.cs2 b/dumps/scripts/1932.cs2 new file mode 100644 index 000000000..71e8ad183 --- /dev/null +++ b/dumps/scripts/1932.cs2 @@ -0,0 +1,5 @@ +void script_1932() { + setWidgetIsHidden(false, new WidgetPointer(811,4)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(811,5)); + return; +} diff --git a/dumps/scripts/1933.cs2 b/dumps/scripts/1933.cs2 new file mode 100644 index 000000000..26957cd86 --- /dev/null +++ b/dumps/scripts/1933.cs2 @@ -0,0 +1,6 @@ +void script_1933() { + setWidgetIsHidden(true, new WidgetPointer(811,4)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,5)); + script_41(53149731); + return; +} diff --git a/dumps/scripts/1934.cs2 b/dumps/scripts/1934.cs2 new file mode 100644 index 000000000..ef3aa32a0 --- /dev/null +++ b/dumps/scripts/1934.cs2 @@ -0,0 +1,5 @@ +void script_1934() { + setWidgetIsHidden(false, new WidgetPointer(811,3)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(811,30)); + return; +} diff --git a/dumps/scripts/1935.cs2 b/dumps/scripts/1935.cs2 new file mode 100644 index 000000000..e43e75850 --- /dev/null +++ b/dumps/scripts/1935.cs2 @@ -0,0 +1,6 @@ +void script_1935() { + setWidgetIsHidden(true, new WidgetPointer(811,3)); + setWidgetRGB(new Color(200, 170, 100), new WidgetPointer(811,30)); + script_41(53149731); + return; +} diff --git a/dumps/scripts/1936.cs2 b/dumps/scripts/1936.cs2 new file mode 100644 index 000000000..4ccc333ce --- /dev/null +++ b/dumps/scripts/1936.cs2 @@ -0,0 +1,5 @@ +void script_1936(int arg0) { + globalint_544 = script_1931(arg0); + script_1927(arg0); + return; +} diff --git a/dumps/scripts/1937.cs2 b/dumps/scripts/1937.cs2 new file mode 100644 index 000000000..a80fe6134 --- /dev/null +++ b/dumps/scripts/1937.cs2 @@ -0,0 +1,5 @@ +void script_1937() { + setWidgetText(new WidgetPointer(811,32), intToStr(globalint_549)); + script_1928(); + return; +} diff --git a/dumps/scripts/1938.cs2 b/dumps/scripts/1938.cs2 new file mode 100644 index 000000000..94ac83e16 --- /dev/null +++ b/dumps/scripts/1938.cs2 @@ -0,0 +1,9 @@ +void script_1938() { + globalint_556 = add(getClientCycle(), multiply(2000, 30)); + globalint_559 = 255; + globalint_560 = 0; + globalint_561 = 0; + globalint_562 = 0; + setWidgetUnknownBoolean(false, new WidgetPointer(809,15)); + return; +} diff --git a/dumps/scripts/1939.cs2 b/dumps/scripts/1939.cs2 new file mode 100644 index 000000000..fa4ed8ccf --- /dev/null +++ b/dumps/scripts/1939.cs2 @@ -0,0 +1,4 @@ +void script_1939() { + globalint_556 = add(getClientCycle(), multiply(globalint_558, 30)); + return; +} diff --git a/dumps/scripts/194.cs2 b/dumps/scripts/194.cs2 new file mode 100644 index 000000000..58e6ca43b --- /dev/null +++ b/dumps/scripts/194.cs2 @@ -0,0 +1,10 @@ +void script_194(int arg0) { + if (((boolean)arg0)) { + if (cs2method3612() > 0) { + sendUnknownVarByteEmptyFriendPacketMethod3620(); + } else { + script_111(); + } + } + return; +} diff --git a/dumps/scripts/1940.cs2 b/dumps/scripts/1940.cs2 new file mode 100644 index 000000000..00b1eb788 --- /dev/null +++ b/dumps/scripts/1940.cs2 @@ -0,0 +1,8 @@ +void script_1940() { + int ivar0; + ivar0 = add(getClientCycle(), multiply(globalint_557, 3000)); + if (ivar0 < globalint_556) { + globalint_556 = ivar0; + } + return; +} diff --git a/dumps/scripts/1941.cs2 b/dumps/scripts/1941.cs2 new file mode 100644 index 000000000..922b1cac3 --- /dev/null +++ b/dumps/scripts/1941.cs2 @@ -0,0 +1,35 @@ +void script_1941() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = add(add(add(standart_config_1332, standart_config_1334), standart_config_1337), multiply(2, subtract(standart_config_1333, standart_config_1335))); + setWidgetText(new WidgetPointer(809,17), "Score: " + intToStr(ivar0)); + if (((boolean)globalint_556)) { + return; + } + ivar1 = subtract(globalint_556, getClientCycle()); + ivar2 = divide(ivar1, 3000); + ivar3 = mod(divide(ivar1, 50), 60); + if ((ivar2 < 0) || (ivar3 < 0)) { + setWidgetText(new WidgetPointer(809,15), "Game ending"); + setWidgetUnknownBoolean(true, new WidgetPointer(809,15)); + script_1942(); + } else if (((boolean)ivar2) && ((boolean)ivar3)) { + setWidgetText(new WidgetPointer(809,15), "Game ending"); + } else if (ivar3 < 10) { + setWidgetText(new WidgetPointer(809,15), intToStr(ivar2) + ":0" + intToStr(ivar3)); + } else { + setWidgetText(new WidgetPointer(809,15), intToStr(ivar2) + ":" + intToStr(ivar3)); + } + if (ivar2 < 1) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(809,15)); + setWidgetUnknownBoolean(true, new WidgetPointer(809,15)); + script_1942(); + } else { + if (isWidgetHidden(new WidgetPointer(809,18))) { + setWidgetIsHidden(true, new WidgetPointer(809,18)); + } + } + return; +} diff --git a/dumps/scripts/1942.cs2 b/dumps/scripts/1942.cs2 new file mode 100644 index 000000000..ebcd933e6 --- /dev/null +++ b/dumps/scripts/1942.cs2 @@ -0,0 +1,33 @@ +void script_1942() { + if (((boolean)globalint_560)) { + globalint_559 = min(255, add(globalint_559, 6)); + if (globalint_559 == 255) { + globalint_560 = 1; + } + } else { + if (((boolean)globalint_560)) { + globalint_559 = max(60, subtract(globalint_559, 6)); + if (globalint_559 == 60) { + globalint_560 = 0; + } + } + } + cs2method2103(globalint_559, new WidgetPointer(809,14)); + if (globalint_561 < 4) { + if (isWidgetHidden(new WidgetPointer(809,18))) { + globalint_562 = min(20, add(globalint_562, 1)); + if (globalint_562 == 20) { + globalint_562 = 0; + setWidgetIsHidden(false, new WidgetPointer(809,18)); + } + } else { + globalint_562 = min(35, add(globalint_562, 1)); + if (globalint_562 == 35) { + globalint_562 = 0; + setWidgetIsHidden(true, new WidgetPointer(809,18)); + globalint_561 = min(4, add(globalint_561, 1)); + } + } + } + return; +} diff --git a/dumps/scripts/1943.cs2 b/dumps/scripts/1943.cs2 new file mode 100644 index 000000000..04ea573ba --- /dev/null +++ b/dumps/scripts/1943.cs2 @@ -0,0 +1,6 @@ +void script_1943() { + setWidgetIsHidden(false, new WidgetPointer(802,19)); + setWidgetText(new WidgetPointer(802,16), globalstring_43); + globalint_581 = 1; + return; +} diff --git a/dumps/scripts/1944.cs2 b/dumps/scripts/1944.cs2 new file mode 100644 index 000000000..a306539ef --- /dev/null +++ b/dumps/scripts/1944.cs2 @@ -0,0 +1,6 @@ +void script_1944() { + setWidgetText(new WidgetPointer(802,16), ""); + setWidgetIsHidden(true, new WidgetPointer(802,19)); + globalint_581 = 0; + return; +} diff --git a/dumps/scripts/1945.cs2 b/dumps/scripts/1945.cs2 new file mode 100644 index 000000000..71beea471 --- /dev/null +++ b/dumps/scripts/1945.cs2 @@ -0,0 +1,6 @@ +void script_1945() { + int ivar0; + ivar0 = add(add(add(standart_config_1332, standart_config_1334), standart_config_1337), multiply(2, subtract(standart_config_1333, standart_config_1335))); + setWidgetText(new WidgetPointer(802,8), "Score: " + intToStr(ivar0)); + return; +} diff --git a/dumps/scripts/1946.cs2 b/dumps/scripts/1946.cs2 new file mode 100644 index 000000000..27736f1ee --- /dev/null +++ b/dumps/scripts/1946.cs2 @@ -0,0 +1,99 @@ +void script_1946() { + int ivar0; + string svar0; + ivar0 = 0; + svar0 = ""; + setScriptCallOnMouseExit(40, new WidgetPointer(810,5), "I", new WidgetPointer(810,10)); + if (globalint_589 == 99999992) { + setWidgetText(new WidgetPointer(810,81), "You abandon the game!"); + setWidgetText(new WidgetPointer(810,17), "You abandon the game." + "
" + "
" + "The mystics don't seem happy and scowl at you, muttering unpleasant sentiments under their breath." + "
" + "
" + "You notice that you received no score as a result."); + setWidgetText(new WidgetPointer(810,58), "-100%"); + setWidgetText(new WidgetPointer(810,32), ""); + setWidgetText(new WidgetPointer(810,33), ""); + svar0 = "The awards tab is not available when you leave a game early."; + setScriptCallOnMouseOver(38, new WidgetPointer(810,10), new WidgetPointer(810,5), svar0, 25, 189, "IIsii", new WidgetPointer(810,10)); + } else { + if (((boolean)globalint_588)) { + setWidgetText(new WidgetPointer(810,32), intToStr(globalint_597)); + setWidgetText(new WidgetPointer(810,33), intToStr(globalint_598)); + } else { + setWidgetText(new WidgetPointer(810,32), intToStr(globalint_598)); + setWidgetText(new WidgetPointer(810,33), intToStr(globalint_597)); + } + if (globalint_588 == globalint_589) { + setWidgetText(new WidgetPointer(810,81), "Your valiant team takes the victory!"); + if (((boolean)ivar0)) { + setWidgetText(new WidgetPointer(810,17), "With the heroic conquest of all resources and facilities, your team have ripped success from the feeble fingers of your unworthy foes." + "
" + "
" + "The mystics stand in awe of your power, and you hear them praising you in excited whispers." + "
" + "
" + "You notice that they have increased your score as a reward."); + } else { + setWidgetText(new WidgetPointer(810,17), "The heroic, skillful and brave deeds of your team have ripped success from the feeble fingers of your unworthy foes." + "
" + "
" + "The mystics stand in awe of your power, and you hear them praising you in excited whispers." + "
" + "
" + "You notice that they have increased your score as a reward."); + } + setWidgetText(new WidgetPointer(810,58), "+10%"); + } else if (((boolean)globalint_589)) { + setWidgetText(new WidgetPointer(810,81), "The game was a draw!"); + setWidgetText(new WidgetPointer(810,17), "As if ordained by fate, the teams were equally brave and skillful, resulting in a draw." + "
" + "
" + "The mystics nod knowingly, and you hear them discussing how the balance of the universe is reflected beautifully in the conflict's outcome." + "
" + "
"); + setWidgetText(new WidgetPointer(810,58), "+0%"); + } else { + setWidgetText(new WidgetPointer(810,81), "The enemy team has defeated you!"); + if (((boolean)ivar0)) { + setWidgetText(new WidgetPointer(810,17), "Despite your best efforts, your team was beaten; the victory snatched away as the enemy took control of all resources and facilities." + "
" + "
" + "The mystics frown at you, and shake their heads sadly." + "
" + "
" + "You hear them arguing over whether they overestimated you, or if you were just unlucky."); + } + setWidgetText(new WidgetPointer(810,17), "Despite your best efforts, your team was beaten; the victory snatched away by your fearsome foes." + "
" + "
" + "The mystics frown at you, and shake their heads sadly." + "
" + "
" + "You hear them arguing over whether they overestimated you, or if you were just unlucky."); + setWidgetText(new WidgetPointer(810,58), "+0%"); + } + } + setWidgetText(new WidgetPointer(810,59), intToStr(globalint_590)); + setWidgetText(new WidgetPointer(810,59), intToStr(globalint_590)); + setWidgetText(new WidgetPointer(810,60), intToStr(globalint_591)); + setWidgetText(new WidgetPointer(810,61), intToStr(globalint_592)); + setWidgetText(new WidgetPointer(810,62), intToStr(globalint_593)); + setWidgetText(new WidgetPointer(810,23), intToStr(globalint_594)); + setWidgetText(new WidgetPointer(810,25), intToStr(globalint_595)); + if (globalint_589 != 99999992) { + setWidgetText(new WidgetPointer(810,63), intToStr(globalint_596)); + } else { + setWidgetText(new WidgetPointer(810,63), intToStr(0)); + } + if ((globalint_600 > 0) || (globalint_603 > 0)) { + setWidgetText(new WidgetPointer(810,136), intToStr(globalint_599)); + setWidgetText(new WidgetPointer(810,135), intToStr(globalint_600)); + setWidgetText(new WidgetPointer(810,139), intToStr(globalint_601)); + setWidgetText(new WidgetPointer(810,140), intToStr(globalint_602)); + setWidgetText(new WidgetPointer(810,138), intToStr(globalint_603)); + setWidgetText(new WidgetPointer(810,137), intToStr(globalint_604)); + setWidgetText(new WidgetPointer(810,141), intToStr(globalint_605)); + setWidgetText(new WidgetPointer(810,142), intToStr(globalint_606)); + script_1587(53084278, 53084303, 495, globalstring_44); + script_1587(53084277, 53084303, 495, globalstring_45); + script_1587(53084281, 53084303, 495, globalstring_46); + script_1587(53084282, 53084303, 495, globalstring_47); + script_1587(53084280, 53084303, 495, globalstring_48); + script_1587(53084279, 53084303, 495, globalstring_49); + script_1587(53084283, 53084303, 495, globalstring_50); + script_1587(53084284, 53084303, 495, globalstring_51); + if (globalint_607 > 0) { + setWidgetText(new WidgetPointer(810,127), intToStr(globalint_607)); + } + if (globalint_608 > 0) { + setWidgetText(new WidgetPointer(810,126), intToStr(globalint_608)); + } + if (globalint_609 > 0) { + setWidgetText(new WidgetPointer(810,130), intToStr(globalint_609)); + } + if (globalint_610 > 0) { + setWidgetText(new WidgetPointer(810,131), intToStr(globalint_610)); + } + if (globalint_611 > 0) { + setWidgetText(new WidgetPointer(810,129), intToStr(globalint_611)); + } + if (globalint_612 > 0) { + setWidgetText(new WidgetPointer(810,128), intToStr(globalint_612)); + } + if (globalint_613 > 0) { + setWidgetText(new WidgetPointer(810,132), intToStr(globalint_613)); + } + if (globalint_614 > 0) { + setWidgetText(new WidgetPointer(810,133), intToStr(globalint_614)); + } + } + return; +} diff --git a/dumps/scripts/1947.cs2 b/dumps/scripts/1947.cs2 new file mode 100644 index 000000000..2e89dfd1c --- /dev/null +++ b/dumps/scripts/1947.cs2 @@ -0,0 +1,11 @@ +void script_1947() { + if ((globalint_600 < 1) && (globalint_603 < 1)) { + messageType0("The awards tab is not available for this scoring."); + } else { + setWidgetIsHidden(true, new WidgetPointer(810,84)); + setWidgetIsHidden(false, new WidgetPointer(810,85)); + setWidgetIsHidden(true, new WidgetPointer(810,86)); + setWidgetIsHidden(false, new WidgetPointer(810,144)); + } + return; +} diff --git a/dumps/scripts/1948.cs2 b/dumps/scripts/1948.cs2 new file mode 100644 index 000000000..278b5d6ad --- /dev/null +++ b/dumps/scripts/1948.cs2 @@ -0,0 +1,7 @@ +void script_1948() { + setWidgetIsHidden(false, new WidgetPointer(810,84)); + setWidgetIsHidden(true, new WidgetPointer(810,85)); + setWidgetIsHidden(false, new WidgetPointer(810,86)); + setWidgetIsHidden(true, new WidgetPointer(810,144)); + return; +} diff --git a/dumps/scripts/1949.cs2 b/dumps/scripts/1949.cs2 new file mode 100644 index 000000000..dd053542a --- /dev/null +++ b/dumps/scripts/1949.cs2 @@ -0,0 +1,9 @@ +void script_1949(int arg0,int arg1,int arg2,int arg3) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetRGB(new Color(arg2)); + if (arg3 != -1) { + script_41(arg3); + } + } + return; +} diff --git a/dumps/scripts/195.cs2 b/dumps/scripts/195.cs2 new file mode 100644 index 000000000..3353a8682 --- /dev/null +++ b/dumps/scripts/195.cs2 @@ -0,0 +1,18 @@ +void script_195(int arg0,int arg1) { + int ivar2; + setScriptCallOnClanListChange(203, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnFriendListChange(203, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + script_1600(); + deleteAllExtraChilds(new WidgetPointer(1109,4)); + ivar2 = 0; + while (ivar2 < 50) { + createExtraChild(new WidgetPointer(1109,4), 3, ivar2); + setWidgetSize(0, 19, 1, 0); + setWidgetPosition(0, multiply(multiply(ivar2, 2), 19), 1, 0); + setWidgetRGB(new Color(35, 34, 32)); + setWidgetFilled(1); + cs2method2103(128); + ivar2 = add(ivar2, 1); + } + return; +} diff --git a/dumps/scripts/1950.cs2 b/dumps/scripts/1950.cs2 new file mode 100644 index 000000000..a85a07970 --- /dev/null +++ b/dumps/scripts/1950.cs2 @@ -0,0 +1,6 @@ +void script_1950(int arg0) { + setWidgetSprite(3153, new WidgetPointer(arg0)); + setScriptCallOnMousePressed(1242, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + cs2method5512(); + return; +} diff --git a/dumps/scripts/1951.cs2 b/dumps/scripts/1951.cs2 new file mode 100644 index 000000000..792faad35 --- /dev/null +++ b/dumps/scripts/1951.cs2 @@ -0,0 +1,10 @@ +void script_1951() { + if (((boolean)globalint_616)) { + setWidgetIsHidden(false, new WidgetPointer(745,1)); + } else { + globalint_616 = 0; + setWidgetIsHidden(true, new WidgetPointer(745,1)); + script_1952(); + } + return; +} diff --git a/dumps/scripts/1952.cs2 b/dumps/scripts/1952.cs2 new file mode 100644 index 000000000..83ec40e16 --- /dev/null +++ b/dumps/scripts/1952.cs2 @@ -0,0 +1,17 @@ +void script_1952() { + int ivar0; + int ivar1; + ivar0 = -1; + ivar1 = -1; + if (getDisplayMode() < 2) { + ivar0 = 35913744; + ivar1 = 35913953; + } else { + ivar0 = 48889872; + ivar1 = 48890023; + } + setWidgetText(new WidgetPointer(ivar1), ""); + setWidgetIsHidden(true, new WidgetPointer(ivar0)); + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/1953.cs2 b/dumps/scripts/1953.cs2 new file mode 100644 index 000000000..ed3072940 --- /dev/null +++ b/dumps/scripts/1953.cs2 @@ -0,0 +1,187 @@ +void script_1953() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + ivar0 = getItemAmtInContainer(93, 2015); + ivar1 = getItemAmtInContainer(93, 2019); + ivar2 = getItemAmtInContainer(93, 2017); + ivar3 = getItemAmtInContainer(93, 2108); + ivar4 = getItemAmtInContainer(93, 2102); + ivar5 = getItemAmtInContainer(93, 2128); + ivar6 = getItemAmtInContainer(93, 2120); + ivar7 = getItemAmtInContainer(93, 1973); + ivar8 = getItemAmtInContainer(93, 2114); + ivar9 = getItemAmtInContainer(93, 2126); + ivar10 = getItemAmtInContainer(93, 1927); + ivar11 = getItemAmtInContainer(93, 2021); + if ((((ivar0 >= 2) && (ivar1 >= 1)) && ((ivar3 >= 1) && (ivar6 >= 1))) && (ivar4 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(436,81)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(436,81)); + } + if ((ivar0 >= 1) && (ivar6 >= 3)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(436,82)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(436,82)); + } + if (((ivar8 >= 1) && (ivar4 >= 1)) && (ivar3 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(436,83)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(436,83)); + } + if (((ivar8 >= 2) && (ivar4 >= 1)) && (ivar3 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(436,84)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(436,84)); + } + if (((ivar0 >= 1) && (ivar1 >= 1)) && (ivar9 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(436,85)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(436,85)); + } + if (((ivar2 >= 1) && (ivar5 >= 1)) && ((ivar10 >= 1) && (ivar7 >= 1))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(436,86)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(436,86)); + } + if ((((ivar0 >= 1) && (ivar1 >= 1)) && ((ivar11 >= 1) && (ivar4 >= 2))) && (ivar3 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(436,87)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(436,87)); + } + if (getItemAmtInContainer(93, 2114) > 0) { + setItemOnWidgetMethod2200(2114, 100, new WidgetPointer(436,24)); + } else { + setItemOnWidgetMethod2200(9497, 100, new WidgetPointer(436,24)); + } + if (getItemAmtInContainer(93, 2102) > 0) { + setItemOnWidgetMethod2200(2102, 140, new WidgetPointer(436,25)); + } else { + setItemOnWidgetMethod2200(9492, 140, new WidgetPointer(436,25)); + } + if (getItemAmtInContainer(93, 2108) > 0) { + setItemOnWidgetMethod2200(2108, 140, new WidgetPointer(436,26)); + } else { + setItemOnWidgetMethod2200(9493, 140, new WidgetPointer(436,26)); + } + if (getItemAmtInContainer(93, 2015) > 1) { + setItemOnWidgetMethod2200(2015, 120, new WidgetPointer(436,4)); + } else { + setItemOnWidgetMethod2200(9491, 120, new WidgetPointer(436,4)); + } + if (getItemAmtInContainer(93, 2019) > 0) { + setItemOnWidgetMethod2200(2019, 120, new WidgetPointer(436,5)); + } else { + setItemOnWidgetMethod2200(9491, 120, new WidgetPointer(436,5)); + } + if (getItemAmtInContainer(93, 2108) > 0) { + setItemOnWidgetMethod2200(2108, 140, new WidgetPointer(436,6)); + } else { + setItemOnWidgetMethod2200(9493, 140, new WidgetPointer(436,6)); + } + if (getItemAmtInContainer(93, 2120) > 0) { + setItemOnWidgetMethod2200(2120, 140, new WidgetPointer(436,7)); + } else { + setItemOnWidgetMethod2200(9555, 140, new WidgetPointer(436,7)); + } + if (getItemAmtInContainer(93, 2102) > 0) { + setItemOnWidgetMethod2200(2102, 140, new WidgetPointer(436,8)); + } else { + setItemOnWidgetMethod2200(9492, 140, new WidgetPointer(436,8)); + } + if (getItemAmtInContainer(93, 2015) > 0) { + setItemOnWidgetMethod2200(2015, 120, new WidgetPointer(436,17)); + } else { + setItemOnWidgetMethod2200(9491, 120, new WidgetPointer(436,17)); + } + if (getItemAmtInContainer(93, 2120) > 2) { + setItemOnWidgetMethod2200(2120, 120, new WidgetPointer(436,18)); + } else { + setItemOnWidgetMethod2200(9555, 140, new WidgetPointer(436,18)); + } + if (getItemAmtInContainer(93, 2015) > 0) { + setItemOnWidgetMethod2200(2015, 120, new WidgetPointer(436,62)); + } else { + setItemOnWidgetMethod2200(9491, 120, new WidgetPointer(436,62)); + } + if (getItemAmtInContainer(93, 2019) > 0) { + setItemOnWidgetMethod2200(2019, 120, new WidgetPointer(436,64)); + } else { + setItemOnWidgetMethod2200(9491, 120, new WidgetPointer(436,64)); + } + if (getItemAmtInContainer(93, 2021) > 0) { + setItemOnWidgetMethod2200(2021, 120, new WidgetPointer(436,63)); + } else { + setItemOnWidgetMethod2200(9556, 120, new WidgetPointer(436,63)); + } + if (getItemAmtInContainer(93, 2108) > 0) { + setItemOnWidgetMethod2200(2108, 140, new WidgetPointer(436,65)); + } else { + setItemOnWidgetMethod2200(9493, 140, new WidgetPointer(436,65)); + } + if (getItemAmtInContainer(93, 2102) > 1) { + setItemOnWidgetMethod2200(2102, 140, new WidgetPointer(436,66)); + } else { + setItemOnWidgetMethod2200(9492, 140, new WidgetPointer(436,66)); + } + if (getItemAmtInContainer(93, 2017) > 0) { + setItemOnWidgetMethod2200(2017, 120, new WidgetPointer(436,51)); + } else { + setItemOnWidgetMethod2200(9491, 120, new WidgetPointer(436,51)); + } + if (getItemAmtInContainer(93, 2128) > 0) { + setItemOnWidgetMethod2200(2128, 120, new WidgetPointer(436,52)); + } else { + setItemOnWidgetMethod2200(9494, 120, new WidgetPointer(436,52)); + } + if (getItemAmtInContainer(93, 1973) > 0) { + setItemOnWidgetMethod2200(1973, 140, new WidgetPointer(436,54)); + } else { + setItemOnWidgetMethod2200(9507, 140, new WidgetPointer(436,54)); + } + if (getItemAmtInContainer(93, 1927) > 0) { + setItemOnWidgetMethod2200(1927, 100, new WidgetPointer(436,53)); + } else { + setItemOnWidgetMethod2200(9495, 100, new WidgetPointer(436,53)); + } + if (getItemAmtInContainer(93, 2114) > 1) { + setItemOnWidgetMethod2200(2114, 100, new WidgetPointer(436,33)); + } else { + setItemOnWidgetMethod2200(9497, 100, new WidgetPointer(436,33)); + } + if (getItemAmtInContainer(93, 2102) > 0) { + setItemOnWidgetMethod2200(2102, 140, new WidgetPointer(436,34)); + } else { + setItemOnWidgetMethod2200(9492, 140, new WidgetPointer(436,34)); + } + if (getItemAmtInContainer(93, 2108) > 0) { + setItemOnWidgetMethod2200(2108, 140, new WidgetPointer(436,35)); + } else { + setItemOnWidgetMethod2200(9493, 140, new WidgetPointer(436,35)); + } + if (getItemAmtInContainer(93, 2015) > 0) { + setItemOnWidgetMethod2200(2015, 120, new WidgetPointer(436,42)); + } else { + setItemOnWidgetMethod2200(9491, 120, new WidgetPointer(436,42)); + } + if (getItemAmtInContainer(93, 2019) > 0) { + setItemOnWidgetMethod2200(2019, 120, new WidgetPointer(436,43)); + } else { + setItemOnWidgetMethod2200(9491, 120, new WidgetPointer(436,43)); + } + if (getItemAmtInContainer(93, 2126) > 0) { + setItemOnWidgetMethod2200(2126, 140, new WidgetPointer(436,44)); + } else { + setItemOnWidgetMethod2200(9496, 140, new WidgetPointer(436,44)); + } + return; +} diff --git a/dumps/scripts/1954.cs2 b/dumps/scripts/1954.cs2 new file mode 100644 index 000000000..7546d30fa --- /dev/null +++ b/dumps/scripts/1954.cs2 @@ -0,0 +1,4 @@ +void script_1954() { + setWidgetIsHidden(true, new WidgetPointer(809,18)); + return; +} diff --git a/dumps/scripts/1955.cs2 b/dumps/scripts/1955.cs2 new file mode 100644 index 000000000..ddf28ef0b --- /dev/null +++ b/dumps/scripts/1955.cs2 @@ -0,0 +1,4 @@ +void script_1955(int arg0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1956.cs2 b/dumps/scripts/1956.cs2 new file mode 100644 index 000000000..b674ca7f0 --- /dev/null +++ b/dumps/scripts/1956.cs2 @@ -0,0 +1,4 @@ +void script_1956(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1957.cs2 b/dumps/scripts/1957.cs2 new file mode 100644 index 000000000..82577d028 --- /dev/null +++ b/dumps/scripts/1957.cs2 @@ -0,0 +1,11 @@ +void script_1957(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = getItemAmtInContainer(93, arg1); + setWidgetText(new WidgetPointer(arg0), intToStr(ivar3) + "/" + intToStr(arg2)); + if (ivar3 >= arg2) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1958.cs2 b/dumps/scripts/1958.cs2 new file mode 100644 index 000000000..6bd14a01c --- /dev/null +++ b/dumps/scripts/1958.cs2 @@ -0,0 +1,8 @@ +void script_1958(int arg0,int arg1) { + if (getSkillCurrentLvl(7) >= arg1) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1959.cs2 b/dumps/scripts/1959.cs2 new file mode 100644 index 000000000..31093bfa3 --- /dev/null +++ b/dumps/scripts/1959.cs2 @@ -0,0 +1,142 @@ +void script_1959() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + ivar0 = getItemAmtInContainer(93, 1985); + ivar1 = getItemAmtInContainer(93, 1982); + ivar2 = getItemAmtInContainer(93, 2169); + ivar3 = getItemAmtInContainer(93, 2162); + ivar4 = getItemAmtInContainer(93, 1957); + ivar5 = getItemAmtInContainer(93, 1965); + ivar6 = getItemAmtInContainer(93, 2126); + ivar7 = getItemAmtInContainer(93, 2128); + ivar8 = getItemAmtInContainer(93, 2152); + ivar9 = getItemAmtInContainer(93, 2116); + ivar10 = getItemAmtInContainer(93, 2110); + ivar11 = getItemAmtInContainer(93, 2122); + if (((ivar7 >= 4) && (ivar9 >= 1)) && ((ivar10 >= 1) && (ivar11 >= 1))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(434,59)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(434,59)); + } + if (((ivar7 >= 1) && (ivar2 >= 1)) && ((ivar8 >= 1) && (ivar0 >= 1))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(434,60)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(434,60)); + } + if (((ivar3 >= 1) && (ivar2 >= 1)) && (ivar0 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(434,61)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(434,61)); + } + if ((((ivar1 >= 2) && (ivar4 >= 1)) && ((ivar5 >= 1) && (ivar6 >= 1))) && (ivar0 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(434,62)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(434,62)); + } + if ((ivar1 >= 1) && (ivar0 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(434,63)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(434,63)); + } + if (getItemAmtInContainer(93, 2128) > 3) { + setItemOnWidgetMethod2200(2128, 120, new WidgetPointer(434,4)); + } else { + setItemOnWidgetMethod2200(9494, 120, new WidgetPointer(434,4)); + } + if (getItemAmtInContainer(93, 2116) > 0) { + setItemOnWidgetMethod2200(2116, 120, new WidgetPointer(434,5)); + } else { + setItemOnWidgetMethod2200(9498, 120, new WidgetPointer(434,5)); + } + if (getItemAmtInContainer(93, 2110) > 0) { + setItemOnWidgetMethod2200(2110, 120, new WidgetPointer(434,6)); + } else { + setItemOnWidgetMethod2200(9498, 120, new WidgetPointer(434,6)); + } + if (getItemAmtInContainer(93, 2122) > 0) { + setItemOnWidgetMethod2200(2122, 120, new WidgetPointer(434,7)); + } else { + setItemOnWidgetMethod2200(9498, 120, new WidgetPointer(434,7)); + } + if (getItemAmtInContainer(93, 2128) > 0) { + setItemOnWidgetMethod2200(2128, 120, new WidgetPointer(434,15)); + } else { + setItemOnWidgetMethod2200(9494, 120, new WidgetPointer(434,15)); + } + if (getItemAmtInContainer(93, 2152) > 0) { + setItemOnWidgetMethod2200(2152, 100, new WidgetPointer(434,16)); + } else { + setItemOnWidgetMethod2200(9499, 100, new WidgetPointer(434,16)); + } + if (getItemAmtInContainer(93, 2169) > 0) { + setItemOnWidgetMethod2200(2169, 90, new WidgetPointer(434,17)); + } else { + setItemOnWidgetMethod2200(9500, 90, new WidgetPointer(434,17)); + } + if (getItemAmtInContainer(93, 1985) > 0) { + setItemOnWidgetMethod2200(1985, 140, new WidgetPointer(434,18)); + } else { + setItemOnWidgetMethod2200(9502, 140, new WidgetPointer(434,18)); + } + if (getItemAmtInContainer(93, 2162) > 0) { + setItemOnWidgetMethod2200(2162, 100, new WidgetPointer(434,27)); + } else { + setItemOnWidgetMethod2200(9501, 100, new WidgetPointer(434,27)); + } + if (getItemAmtInContainer(93, 2169) > 0) { + setItemOnWidgetMethod2200(2169, 90, new WidgetPointer(434,26)); + } else { + setItemOnWidgetMethod2200(9500, 90, new WidgetPointer(434,26)); + } + if (getItemAmtInContainer(93, 1985) > 0) { + setItemOnWidgetMethod2200(1985, 140, new WidgetPointer(434,28)); + } else { + setItemOnWidgetMethod2200(9502, 140, new WidgetPointer(434,28)); + } + if (getItemAmtInContainer(93, 1982) > 1) { + setItemOnWidgetMethod2200(1982, 100, new WidgetPointer(434,35)); + } else { + setItemOnWidgetMethod2200(9503, 100, new WidgetPointer(434,35)); + } + if (getItemAmtInContainer(93, 1957) > 0) { + setItemOnWidgetMethod2200(1957, 140, new WidgetPointer(434,36)); + } else { + setItemOnWidgetMethod2200(9504, 140, new WidgetPointer(434,36)); + } + if (getItemAmtInContainer(93, 1965) > 0) { + setItemOnWidgetMethod2200(1965, 90, new WidgetPointer(434,37)); + } else { + setItemOnWidgetMethod2200(9505, 90, new WidgetPointer(434,37)); + } + if (getItemAmtInContainer(93, 2126) > 0) { + setItemOnWidgetMethod2200(2126, 140, new WidgetPointer(434,38)); + } else { + setItemOnWidgetMethod2200(9496, 140, new WidgetPointer(434,38)); + } + if (getItemAmtInContainer(93, 1985) > 0) { + setItemOnWidgetMethod2200(1985, 140, new WidgetPointer(434,39)); + } else { + setItemOnWidgetMethod2200(9502, 140, new WidgetPointer(434,39)); + } + if (getItemAmtInContainer(93, 1982) > 0) { + setItemOnWidgetMethod2200(1982, 100, new WidgetPointer(434,48)); + } else { + setItemOnWidgetMethod2200(9503, 100, new WidgetPointer(434,48)); + } + if (getItemAmtInContainer(93, 1985) > 0) { + setItemOnWidgetMethod2200(1985, 140, new WidgetPointer(434,49)); + } else { + setItemOnWidgetMethod2200(9502, 140, new WidgetPointer(434,49)); + } + return; +} diff --git a/dumps/scripts/196.cs2 b/dumps/scripts/196.cs2 new file mode 100644 index 000000000..b390f1698 --- /dev/null +++ b/dumps/scripts/196.cs2 @@ -0,0 +1,23 @@ +string script_196(int arg0) { + switch (arg0) { + case 0: + return "Not in Friends Chat"; + case 1: + return "Recruit"; + case 2: + return "Corporal"; + case 3: + return "Sergeant"; + case 4: + return "Lieutenant"; + case 5: + return "Captain"; + case 6: + return "General"; + case 7: + return "Channel Owner"; + case 127: + return "Jagex Mod"; + } + return "Not in Friends Chat"; +} diff --git a/dumps/scripts/1960.cs2 b/dumps/scripts/1960.cs2 new file mode 100644 index 000000000..0bc894922 --- /dev/null +++ b/dumps/scripts/1960.cs2 @@ -0,0 +1,13 @@ +void script_1960() { + if (globalint_1279 != 0) { + playSoundEffect(9445, 1, 0); + } + globalint_1279 = 0; + setWidgetIsHidden(false, new WidgetPointer(60,45)); + setWidgetIsHidden(true, new WidgetPointer(60,46)); + setWidgetIsHidden(true, new WidgetPointer(60,87)); + setWidgetIsHidden(false, new WidgetPointer(60,20)); + setWidgetIsHidden(true, new WidgetPointer(60,17)); + setWidgetIsHidden(true, new WidgetPointer(60,14)); + return; +} diff --git a/dumps/scripts/1961.cs2 b/dumps/scripts/1961.cs2 new file mode 100644 index 000000000..9c83ff2d9 --- /dev/null +++ b/dumps/scripts/1961.cs2 @@ -0,0 +1,106 @@ +void script_1961() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar0 = getItemAmtInContainer(93, 1985); + ivar1 = getItemAmtInContainer(93, 2169); + ivar2 = getItemAmtInContainer(93, 2162); + ivar3 = getItemAmtInContainer(93, 1957); + ivar4 = getItemAmtInContainer(93, 2126); + ivar5 = getItemAmtInContainer(93, 2128); + ivar6 = getItemAmtInContainer(93, 2152); + ivar7 = getItemAmtInContainer(93, 1973); + ivar8 = getItemAmtInContainer(93, 1942); + if (((ivar2 >= 4) && (ivar3 >= 2)) && (ivar1 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(435,45)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(435,45)); + } + if (((ivar3 >= 2) && (ivar1 >= 1)) && (ivar8 >= 2)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(435,46)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(435,46)); + } + if ((((ivar6 >= 4) && (ivar1 >= 1)) && ((ivar0 >= 2) && (ivar5 >= 2))) && (ivar4 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(435,47)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(435,47)); + } + if ((ivar7 >= 4) && (ivar5 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(435,48)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(435,48)); + } + if (getItemAmtInContainer(93, 2152) > 3) { + setItemOnWidgetMethod2200(2152, 100, new WidgetPointer(435,22)); + } else { + setItemOnWidgetMethod2200(9499, 100, new WidgetPointer(435,22)); + } + if (getItemAmtInContainer(93, 2128) > 1) { + setItemOnWidgetMethod2200(2128, 120, new WidgetPointer(435,24)); + } else { + setItemOnWidgetMethod2200(9494, 120, new WidgetPointer(435,24)); + } + if (getItemAmtInContainer(93, 1985) > 1) { + setItemOnWidgetMethod2200(1985, 140, new WidgetPointer(435,23)); + } else { + setItemOnWidgetMethod2200(9502, 140, new WidgetPointer(435,23)); + } + if (getItemAmtInContainer(93, 2169) > 0) { + setItemOnWidgetMethod2200(2169, 90, new WidgetPointer(435,25)); + } else { + setItemOnWidgetMethod2200(9500, 90, new WidgetPointer(435,25)); + } + if (getItemAmtInContainer(93, 2126) > 0) { + setItemOnWidgetMethod2200(2126, 140, new WidgetPointer(435,26)); + } else { + setItemOnWidgetMethod2200(9496, 140, new WidgetPointer(435,26)); + } + if (getItemAmtInContainer(93, 2162) > 3) { + setItemOnWidgetMethod2200(2162, 100, new WidgetPointer(435,4)); + } else { + setItemOnWidgetMethod2200(9501, 100, new WidgetPointer(435,4)); + } + if (getItemAmtInContainer(93, 2169) > 0) { + setItemOnWidgetMethod2200(2169, 90, new WidgetPointer(435,6)); + } else { + setItemOnWidgetMethod2200(9500, 90, new WidgetPointer(435,6)); + } + if (getItemAmtInContainer(93, 1957) > 1) { + setItemOnWidgetMethod2200(1957, 140, new WidgetPointer(435,5)); + } else { + setItemOnWidgetMethod2200(9504, 140, new WidgetPointer(435,5)); + } + if (getItemAmtInContainer(93, 1942) > 1) { + setItemOnWidgetMethod2200(1942, 100, new WidgetPointer(435,14)); + } else { + setItemOnWidgetMethod2200(9506, 100, new WidgetPointer(435,14)); + } + if (getItemAmtInContainer(93, 2169) > 0) { + setItemOnWidgetMethod2200(2169, 90, new WidgetPointer(435,15)); + } else { + setItemOnWidgetMethod2200(9500, 90, new WidgetPointer(435,15)); + } + if (getItemAmtInContainer(93, 1957) > 1) { + setItemOnWidgetMethod2200(1957, 140, new WidgetPointer(435,13)); + } else { + setItemOnWidgetMethod2200(9504, 140, new WidgetPointer(435,13)); + } + if (getItemAmtInContainer(93, 1973) > 3) { + setItemOnWidgetMethod2200(1973, 140, new WidgetPointer(435,35)); + } else { + setItemOnWidgetMethod2200(9507, 140, new WidgetPointer(435,35)); + } + if (getItemAmtInContainer(93, 2128) > 0) { + setItemOnWidgetMethod2200(2128, 120, new WidgetPointer(435,36)); + } else { + setItemOnWidgetMethod2200(9494, 120, new WidgetPointer(435,36)); + } + return; +} diff --git a/dumps/scripts/1962.cs2 b/dumps/scripts/1962.cs2 new file mode 100644 index 000000000..76f39c697 --- /dev/null +++ b/dumps/scripts/1962.cs2 @@ -0,0 +1,8 @@ +void script_1962(int arg0,int arg1) { + if (getItemAmtInContainer(93, 2996) >= arg1) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(119, 115, 106), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1963.cs2 b/dumps/scripts/1963.cs2 new file mode 100644 index 000000000..cfcee87bb --- /dev/null +++ b/dumps/scripts/1963.cs2 @@ -0,0 +1,8 @@ +void script_1963(int arg0,int arg1) { + if (standart_config_261 != arg1) { + setWidgetText(new WidgetPointer(arg0), "" + strRemoveEntities(getWidgetText(new WidgetPointer(arg0))) + ""); + } else { + setWidgetText(new WidgetPointer(arg0), strRemoveEntities(getWidgetText(new WidgetPointer(arg0)))); + } + return; +} diff --git a/dumps/scripts/1964.cs2 b/dumps/scripts/1964.cs2 new file mode 100644 index 000000000..116566549 --- /dev/null +++ b/dumps/scripts/1964.cs2 @@ -0,0 +1,4 @@ +void script_1964(int arg0) { + setWidgetText(new WidgetPointer(arg0), strRemoveEntities(getWidgetText(new WidgetPointer(arg0)))); + return; +} diff --git a/dumps/scripts/1965.cs2 b/dumps/scripts/1965.cs2 new file mode 100644 index 000000000..ecc85f595 --- /dev/null +++ b/dumps/scripts/1965.cs2 @@ -0,0 +1,8 @@ +void script_1965(int arg0) { + if (standart_config_261 > 0) { + cs2method2103(255, new WidgetPointer(arg0)); + } else { + cs2method2103(200, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1966.cs2 b/dumps/scripts/1966.cs2 new file mode 100644 index 000000000..ca67f9134 --- /dev/null +++ b/dumps/scripts/1966.cs2 @@ -0,0 +1,8 @@ +void script_1966(int arg0) { + if (standart_config_261 > 0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(150, 150, 150), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1967.cs2 b/dumps/scripts/1967.cs2 new file mode 100644 index 000000000..816ced72f --- /dev/null +++ b/dumps/scripts/1967.cs2 @@ -0,0 +1,23 @@ +void script_1967() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 1; + ivar1 = -1; + ivar2 = -1; + while (ivar0 <= getCommonDefinitionSize(2120)) { + setWidgetText(cs2method_3408(105, 73, 2118, ivar0), cs2method_3408(105, 115, 2023, ivar0)); + ivar1 = cs2method_3408(105, 111, 2019, ivar0); + ivar2 = ((int)cs2method_3408(105, 73, 2120, ivar0)); + setItemOnWidgetMethod2200(ivar1, 1, cs2method_3408(105, 73, 2117, ivar0)); + cs2method2305(new WidgetPointer(ivar2), cs2method_3408(105, 115, 2023, ivar0)); + if (getItemAmtInContainer(93, ivar1) > 0) { + setWidgetRGB(new Color(0, 255, 0), cs2method_3408(105, 73, 2118, ivar0)); + } else { + setWidgetRGB(new Color(255, 0, 0), cs2method_3408(105, 73, 2118, ivar0)); + } + ivar0 = add(ivar0, 1); + } + script_1969(); + return; +} diff --git a/dumps/scripts/1968.cs2 b/dumps/scripts/1968.cs2 new file mode 100644 index 000000000..c392c80d1 --- /dev/null +++ b/dumps/scripts/1968.cs2 @@ -0,0 +1,4 @@ +void script_1968() { + script_1969(); + return; +} diff --git a/dumps/scripts/1969.cs2 b/dumps/scripts/1969.cs2 new file mode 100644 index 000000000..ca09a9ae1 --- /dev/null +++ b/dumps/scripts/1969.cs2 @@ -0,0 +1,22 @@ +void script_1969() { + int ivar0; + int ivar1; + ivar0 = 1; + ivar1 = 0; + while (ivar0 <= getCommonDefinitionSize(2119)) { + if (((boolean)globalint_617)) { + ivar1 = cs2method_3408(105, 105, 2022, ivar0); + setWidgetText(cs2method_3408(105, 73, 2119, ivar0), intToStr(ivar1) + " Coins"); + } else { + ivar1 = cs2method_3408(105, 105, 2021, ivar0); + setWidgetText(cs2method_3408(105, 73, 2119, ivar0), intToStr(ivar1) + " Coins"); + } + if (getItemAmtInContainer(93, 995) >= ivar1) { + setWidgetRGB(new Color(0, 255, 0), cs2method_3408(105, 73, 2119, ivar0)); + } else { + setWidgetRGB(new Color(255, 0, 0), cs2method_3408(105, 73, 2119, ivar0)); + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/197.cs2 b/dumps/scripts/197.cs2 new file mode 100644 index 000000000..7ac3c85ca --- /dev/null +++ b/dumps/scripts/197.cs2 @@ -0,0 +1,19 @@ +void script_197(int arg0,int arg1) { + int ivar2; + string svar0; + string svar1; + int stack_dump0; + previousAndCurrentName(0,2,0) structdump_1; + ivar2 = subtract(arg1, 1); + svar0 = ""; + svar1 = ""; + stack_dump0 = arg0; + structdump_1 = getFriendName(stack_dump0); + svar1 = structdump_1.stringpart_1; + svar0 = structdump_1.stringpart_0; + cs2method3604(ivar2, svar0); + if (setWidgetRegister(new WidgetPointer(1108,13), add(multiply(arg0, 2), 1))) { + setWidgetText(script_196(ivar2)); + } + return; +} diff --git a/dumps/scripts/1970.cs2 b/dumps/scripts/1970.cs2 new file mode 100644 index 000000000..098c8a698 --- /dev/null +++ b/dumps/scripts/1970.cs2 @@ -0,0 +1,4 @@ +void script_1970(int arg0,int arg1) { + script_1971(arg0, arg1); + return; +} diff --git a/dumps/scripts/1971.cs2 b/dumps/scripts/1971.cs2 new file mode 100644 index 000000000..60586e56f --- /dev/null +++ b/dumps/scripts/1971.cs2 @@ -0,0 +1,28 @@ +void script_1971(int arg0,int arg1) { + switch (arg0) { + case 0: + if ((globalint_618 < 0) || (globalint_618 > 25)) { + globalint_618 = 0; + } + setWidgetText(new WidgetPointer(arg1), cs2method_3408(105, 115, 2121, globalint_618)); + break; + case 1: + if ((globalint_619 < 0) || (globalint_619 > 25)) { + globalint_619 = 0; + } + setWidgetText(new WidgetPointer(arg1), cs2method_3408(105, 115, 2121, globalint_619)); + break; + case 2: + if ((globalint_620 < 0) || (globalint_620 > 25)) { + globalint_620 = 0; + } + setWidgetText(new WidgetPointer(arg1), cs2method_3408(105, 115, 2121, globalint_620)); + break; + case 3: + if ((globalint_621 < 0) || (globalint_621 > 25)) { + globalint_621 = 0; + } + setWidgetText(new WidgetPointer(arg1), cs2method_3408(105, 115, 2121, globalint_621)); + } + return; +} diff --git a/dumps/scripts/1972.cs2 b/dumps/scripts/1972.cs2 new file mode 100644 index 000000000..3da2f4514 --- /dev/null +++ b/dumps/scripts/1972.cs2 @@ -0,0 +1,21 @@ +void script_1972(int arg0,int arg1,int arg2) { + if (arg2 != 1) { + return; + } + playSoundEffect(4911, 1, 0); + switch (arg0) { + case 0: + globalint_618 = mod(add(globalint_618, 1), 26); + break; + case 1: + globalint_619 = mod(add(globalint_619, 1), 26); + break; + case 2: + globalint_620 = mod(add(globalint_620, 1), 26); + break; + case 3: + globalint_621 = mod(add(globalint_621, 1), 26); + } + script_1971(arg0, arg1); + return; +} diff --git a/dumps/scripts/1973.cs2 b/dumps/scripts/1973.cs2 new file mode 100644 index 000000000..58694c000 --- /dev/null +++ b/dumps/scripts/1973.cs2 @@ -0,0 +1,21 @@ +void script_1973(int arg0,int arg1,int arg2) { + if (arg2 != 1) { + return; + } + playSoundEffect(4911, 1, 0); + switch (arg0) { + case 0: + globalint_618 = script_686(subtract(globalint_618, 1), 26); + break; + case 1: + globalint_619 = script_686(subtract(globalint_619, 1), 26); + break; + case 2: + globalint_620 = script_686(subtract(globalint_620, 1), 26); + break; + case 3: + globalint_621 = script_686(subtract(globalint_621, 1), 26); + } + script_1971(arg0, arg1); + return; +} diff --git a/dumps/scripts/1974.cs2 b/dumps/scripts/1974.cs2 new file mode 100644 index 000000000..19790ad91 --- /dev/null +++ b/dumps/scripts/1974.cs2 @@ -0,0 +1,5 @@ +void script_1974(int arg0,int arg1,int arg2) { + setWidget3DRotation(0, 0, getWidgetRotateX(new WidgetPointer(arg0)), getWidgetRotateY(new WidgetPointer(arg0)), getWidgetRotateY(new WidgetPointer(arg0)), arg2, new WidgetPointer(arg0)); + setItemOnWidgetMethod2200(arg1, 1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/1975.cs2 b/dumps/scripts/1975.cs2 new file mode 100644 index 000000000..80f711d62 --- /dev/null +++ b/dumps/scripts/1975.cs2 @@ -0,0 +1,3 @@ +int script_1975() { + return add(add(add(add(add(add(add(add(add(add(add(add(add(add(bitconfig_5691, bitconfig_5692), bitconfig_5693), bitconfig_5694), bitconfig_5695), bitconfig_5696), bitconfig_5697), bitconfig_5698), bitconfig_5699), bitconfig_5700), bitconfig_5701), bitconfig_5702), bitconfig_5703), bitconfig_5704), bitconfig_5705); +} diff --git a/dumps/scripts/1976.cs2 b/dumps/scripts/1976.cs2 new file mode 100644 index 000000000..ac1bed16e --- /dev/null +++ b/dumps/scripts/1976.cs2 @@ -0,0 +1,20 @@ +int script_1976() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 3); + return ivar0; +} diff --git a/dumps/scripts/1977.cs2 b/dumps/scripts/1977.cs2 new file mode 100644 index 000000000..919945fde --- /dev/null +++ b/dumps/scripts/1977.cs2 @@ -0,0 +1,3 @@ +int script_1977() { + return add(add(add(add(add(add(add(add(add(add(add(bitconfig_5706, bitconfig_5707), bitconfig_5723), bitconfig_5709), bitconfig_5710), bitconfig_5711), bitconfig_5712), bitconfig_5713), bitconfig_5714), bitconfig_5715), bitconfig_5716), bitconfig_5717); +} diff --git a/dumps/scripts/1978.cs2 b/dumps/scripts/1978.cs2 new file mode 100644 index 000000000..06c8261b2 --- /dev/null +++ b/dumps/scripts/1978.cs2 @@ -0,0 +1,17 @@ +int script_1978() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 3); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1979.cs2 b/dumps/scripts/1979.cs2 new file mode 100644 index 000000000..1c8e327b3 --- /dev/null +++ b/dumps/scripts/1979.cs2 @@ -0,0 +1,3 @@ +int script_1979() { + return add(add(add(add(add(add(add(add(add(bitconfig_5718, bitconfig_5719), bitconfig_5720), bitconfig_5721), bitconfig_5708), bitconfig_5722), bitconfig_5724), bitconfig_5725), bitconfig_5726), bitconfig_5727); +} diff --git a/dumps/scripts/198.cs2 b/dumps/scripts/198.cs2 new file mode 100644 index 000000000..aa1b60376 --- /dev/null +++ b/dumps/scripts/198.cs2 @@ -0,0 +1,4 @@ +void script_198(int arg0) { + script_199(arg0); + return; +} diff --git a/dumps/scripts/1980.cs2 b/dumps/scripts/1980.cs2 new file mode 100644 index 000000000..4b1b8f28a --- /dev/null +++ b/dumps/scripts/1980.cs2 @@ -0,0 +1,15 @@ +int script_1980() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1981.cs2 b/dumps/scripts/1981.cs2 new file mode 100644 index 000000000..13a0eb725 --- /dev/null +++ b/dumps/scripts/1981.cs2 @@ -0,0 +1,3 @@ +int script_1981() { + return add(add(add(add(add(add(add(add(add(bitconfig_5648, bitconfig_5649), bitconfig_5650), bitconfig_5651), bitconfig_5652), bitconfig_5653), bitconfig_5654), bitconfig_5655), bitconfig_5656), bitconfig_5657); +} diff --git a/dumps/scripts/1982.cs2 b/dumps/scripts/1982.cs2 new file mode 100644 index 000000000..fdba5dc67 --- /dev/null +++ b/dumps/scripts/1982.cs2 @@ -0,0 +1,3 @@ +int script_1982() { + return add(add(add(add(add(add(add(add(add(add(bitconfig_5658, bitconfig_5659), bitconfig_5660), bitconfig_5661), bitconfig_5662), bitconfig_5663), bitconfig_5664), bitconfig_5665), bitconfig_5666), bitconfig_5667), bitconfig_5668); +} diff --git a/dumps/scripts/1983.cs2 b/dumps/scripts/1983.cs2 new file mode 100644 index 000000000..ed8d6357e --- /dev/null +++ b/dumps/scripts/1983.cs2 @@ -0,0 +1,3 @@ +int script_1983() { + return add(add(add(add(add(add(add(add(bitconfig_5669, bitconfig_5670), bitconfig_5671), bitconfig_5672), bitconfig_5673), bitconfig_5674), bitconfig_5675), bitconfig_5676), bitconfig_5677); +} diff --git a/dumps/scripts/1984.cs2 b/dumps/scripts/1984.cs2 new file mode 100644 index 000000000..2f739c8b7 --- /dev/null +++ b/dumps/scripts/1984.cs2 @@ -0,0 +1,3 @@ +int script_1984() { + return 10; +} diff --git a/dumps/scripts/1985.cs2 b/dumps/scripts/1985.cs2 new file mode 100644 index 000000000..1e1a1307b --- /dev/null +++ b/dumps/scripts/1985.cs2 @@ -0,0 +1,3 @@ +int script_1985() { + return 11; +} diff --git a/dumps/scripts/1986.cs2 b/dumps/scripts/1986.cs2 new file mode 100644 index 000000000..5cbaae1ef --- /dev/null +++ b/dumps/scripts/1986.cs2 @@ -0,0 +1,3 @@ +int script_1986() { + return 9; +} diff --git a/dumps/scripts/1987.cs2 b/dumps/scripts/1987.cs2 new file mode 100644 index 000000000..48727ea0a --- /dev/null +++ b/dumps/scripts/1987.cs2 @@ -0,0 +1,6 @@ +int script_1987() { + if (add(add(add(script_1995(), script_1983()), script_1982()), script_1981()) == add(add(add(9, 11), 10), 9)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/1988.cs2 b/dumps/scripts/1988.cs2 new file mode 100644 index 000000000..6051982f8 --- /dev/null +++ b/dumps/scripts/1988.cs2 @@ -0,0 +1,12 @@ +int script_1988() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_8180); + ivar0 = add(ivar0, bitconfig_8181); + ivar0 = add(ivar0, bitconfig_8188); + ivar0 = add(ivar0, bitconfig_8191); + ivar0 = add(ivar0, bitconfig_8192); + ivar0 = add(ivar0, bitconfig_8193); + ivar0 = add(ivar0, bitconfig_8194); + return ivar0; +} diff --git a/dumps/scripts/1989.cs2 b/dumps/scripts/1989.cs2 new file mode 100644 index 000000000..8d38baa05 --- /dev/null +++ b/dumps/scripts/1989.cs2 @@ -0,0 +1,12 @@ +int script_1989() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/199.cs2 b/dumps/scripts/199.cs2 new file mode 100644 index 000000000..c85c0106c --- /dev/null +++ b/dumps/scripts/199.cs2 @@ -0,0 +1,30 @@ +void script_199(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + ivar1 = 0; + ivar2 = cs2method3612(); + ivar3 = 2; + ivar4 = 100; + ivar5 = 19; + svar0 = ""; + if (ivar2 > 0) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + while (ivar1 < ivar2) { + svar0 = cs2method3613(ivar1); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetRGB(new Color(164, 153, 125)); + setWidgetFont(3793); + setWidgetUnknownBoolean(false); + setWidgetPosition(0, multiply(ivar1, ivar5), 0, 0); + setWidgetSize(ivar4, ivar5, 0, 0); + setWidgetText(svar0); + ivar1 = add(ivar1, 1); + } + setScriptCallOnClanChatDeltaStuff(198, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/1990.cs2 b/dumps/scripts/1990.cs2 new file mode 100644 index 000000000..d867d3cd1 --- /dev/null +++ b/dumps/scripts/1990.cs2 @@ -0,0 +1,18 @@ +int script_1990() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(add(add(add(add(bitconfig_5783, bitconfig_5785), bitconfig_5786), bitconfig_5790), bitconfig_5791), bitconfig_5793), bitconfig_5792), bitconfig_5784); + if (bitconfig_5782 == 5) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_5787 == 5) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_5788 == 5) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_5789 == 5) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/1991.cs2 b/dumps/scripts/1991.cs2 new file mode 100644 index 000000000..286c05def --- /dev/null +++ b/dumps/scripts/1991.cs2 @@ -0,0 +1,12 @@ +int script_1991() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(add(add(add(add(add(add(bitconfig_5799, bitconfig_5794), bitconfig_5795), bitconfig_5800), bitconfig_5796), bitconfig_5798), bitconfig_5802), bitconfig_5803), bitconfig_5804), bitconfig_5801); + if (bitconfig_5805 == 15) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_5797 == 15) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/1992.cs2 b/dumps/scripts/1992.cs2 new file mode 100644 index 000000000..0ace18f9f --- /dev/null +++ b/dumps/scripts/1992.cs2 @@ -0,0 +1,18 @@ +int script_1992() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(add(add(add(bitconfig_5811, bitconfig_5806), bitconfig_5810), bitconfig_5809), bitconfig_5808), bitconfig_5812), bitconfig_5813); + if (bitconfig_5807 == 5) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_5814 == 5) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_5815 == 5) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_5816 == 5) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/1993.cs2 b/dumps/scripts/1993.cs2 new file mode 100644 index 000000000..46499a1f5 --- /dev/null +++ b/dumps/scripts/1993.cs2 @@ -0,0 +1,3 @@ +int script_1993() { + return add(add(add(add(bitconfig_8205, bitconfig_8212), bitconfig_8217), bitconfig_8221), bitconfig_8224); +} diff --git a/dumps/scripts/1994.cs2 b/dumps/scripts/1994.cs2 new file mode 100644 index 000000000..721ea3bc4 --- /dev/null +++ b/dumps/scripts/1994.cs2 @@ -0,0 +1,10 @@ +int script_1994() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/1995.cs2 b/dumps/scripts/1995.cs2 new file mode 100644 index 000000000..8721281dc --- /dev/null +++ b/dumps/scripts/1995.cs2 @@ -0,0 +1,3 @@ +int script_1995() { + return add(add(add(add(add(add(add(add(bitconfig_8231, bitconfig_8232), bitconfig_8233), bitconfig_8234), bitconfig_8235), bitconfig_8236), bitconfig_8237), bitconfig_8238), bitconfig_8239); +} diff --git a/dumps/scripts/1996.cs2 b/dumps/scripts/1996.cs2 new file mode 100644 index 000000000..da7f8c9d6 --- /dev/null +++ b/dumps/scripts/1996.cs2 @@ -0,0 +1,3 @@ +int script_1996() { + return 9; +} diff --git a/dumps/scripts/1997.cs2 b/dumps/scripts/1997.cs2 new file mode 100644 index 000000000..16beed0c0 --- /dev/null +++ b/dumps/scripts/1997.cs2 @@ -0,0 +1,5 @@ +void script_1997() { + setWidgetIsHidden(false, new WidgetPointer(391,28)); + setWidgetIsHidden(false, new WidgetPointer(391,32)); + return; +} diff --git a/dumps/scripts/1998.cs2 b/dumps/scripts/1998.cs2 new file mode 100644 index 000000000..7d3a3ef09 --- /dev/null +++ b/dumps/scripts/1998.cs2 @@ -0,0 +1,5 @@ +void script_1998() { + setWidgetIsHidden(true, new WidgetPointer(391,28)); + setWidgetIsHidden(true, new WidgetPointer(391,32)); + return; +} diff --git a/dumps/scripts/1999.cs2 b/dumps/scripts/1999.cs2 new file mode 100644 index 000000000..7b64f9566 --- /dev/null +++ b/dumps/scripts/1999.cs2 @@ -0,0 +1,5 @@ +void script_1999(int arg0) { + script_2001(arg0, standart_config_118); + setScriptCallOnConfigChange(2000, new WidgetPointer(arg0), standart_config_118, 1081, 1, "IvY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2.cs2 b/dumps/scripts/2.cs2 new file mode 100644 index 000000000..1d6db9198 --- /dev/null +++ b/dumps/scripts/2.cs2 @@ -0,0 +1,37 @@ +cs2func_script_2_struct(1,1,0) script_2(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_2_struct(1, "Rooms"); + case 1: + return newstruct cs2func_script_2_struct(1, "Skills"); + case 2: + return newstruct cs2func_script_2_struct(1, "Surfaces"); + case 3: + return newstruct cs2func_script_2_struct(1, "Storage"); + case 4: + return newstruct cs2func_script_2_struct(1, "Decorative"); + case 5: + return newstruct cs2func_script_2_struct(1, "Trophies"); + case 6: + return newstruct cs2func_script_2_struct(1, "Games & Sport"); + case 7: + return newstruct cs2func_script_2_struct(1, "Garden"); + case 8: + return newstruct cs2func_script_2_struct(1, "Dungeon"); + case 9: + return newstruct cs2func_script_2_struct(1, "Chapel"); + case 10: + return newstruct cs2func_script_2_struct(1, "Other"); + case 11: + return newstruct cs2func_script_2_struct(1, "Menagerie"); + case 12: + return newstruct cs2func_script_2_struct(1, "Servants"); + case 13: + return newstruct cs2func_script_2_struct(1, "Minigames"); + case 14: + return newstruct cs2func_script_2_struct(1, "Dungeoneering"); + case 15: + return newstruct cs2func_script_2_struct(1, "Milestones"); + } + return newstruct cs2func_script_2_struct(-1, ""); +} diff --git a/dumps/scripts/20.cs2 b/dumps/scripts/20.cs2 new file mode 100644 index 000000000..c65fc2b0a --- /dev/null +++ b/dumps/scripts/20.cs2 @@ -0,0 +1,12 @@ +string script_20(int arg0) { + if (arg0 >= 99999999) { + return "*"; + } + if (arg0 >= 10000000) { + return concat(intToStr(divide(arg0, 1000000)), "M"); + } + if (arg0 >= 10000) { + return concat(intToStr(divide(arg0, 1000)), "K"); + } + return intToStr(arg0); +} diff --git a/dumps/scripts/200.cs2 b/dumps/scripts/200.cs2 new file mode 100644 index 000000000..485037509 --- /dev/null +++ b/dumps/scripts/200.cs2 @@ -0,0 +1,4 @@ +void script_200(int arg0) { + script_201(); + return; +} diff --git a/dumps/scripts/2000.cs2 b/dumps/scripts/2000.cs2 new file mode 100644 index 000000000..2a8a0e79d --- /dev/null +++ b/dumps/scripts/2000.cs2 @@ -0,0 +1,4 @@ +void script_2000(int arg0,int arg1) { + script_2001(arg0, arg1); + return; +} diff --git a/dumps/scripts/2001.cs2 b/dumps/scripts/2001.cs2 new file mode 100644 index 000000000..4d8c6e9b0 --- /dev/null +++ b/dumps/scripts/2001.cs2 @@ -0,0 +1,95 @@ +void script_2001(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + string svar0; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar2 = -1; + ivar3 = 0; + ivar4 = getItemContainerLength(arg1); + ivar5 = 4; + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), 46, 0, 0, new WidgetPointer(arg0)); + setWidgetSize(464, 255, 0, 0, new WidgetPointer(arg0)); + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + ivar5 = 4; + ivar3 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = -1; + ivar10 = 0; + svar0 = ""; + ivar11 = 0; + ivar12 = script_2002(); + ivar9 = getItemIdInSlot(arg1, ivar3); + if (ivar9 != -1) { + ivar7 = add(multiply(mod(ivar3, 9), 48), multiply(mod(ivar3, 9), ivar5)); + ivar8 = add(multiply(divide(ivar3, 9), 52), multiply(divide(ivar3, 9), 13)); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + ivar6 = add(ivar6, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar7, ivar8, 0, 0); + setWidgetSprite(2205); + cs2method1305("" + getItemName(ivar9) + ""); + setWidgetContextMenuOption(1, "Info"); + setWidgetContextMenuOption(2, "Buy 1"); + setWidgetContextMenuOption(3, "Buy 5"); + setWidgetContextMenuOption(4, "Buy 10"); + setWidgetContextMenuOption(5, "Buy 50"); + setWidgetContextMenuOption(6, "Buy 500"); + setWidgetContextMenuOption(10, "Examine"); + setScriptCallOnMouseEntered(2724, new WidgetPointer(-32768,3), ivar6, 0, "Ii1"); + setScriptCallOnMouseExit(2724, new WidgetPointer(-32768,3), ivar6, 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + ivar6 = add(ivar6, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar7, ivar8, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + ivar6 = add(ivar6, 1); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar7, 6), add(ivar8, 4), 0, 0); + setItemOnWidgetMethod1212(ivar9, ivar12); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + ivar6 = add(ivar6, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar7, 2), add(ivar8, 38), 0, 0); + setWidgetSprite(cs2method_3408(111, 100, 200, standart_config_532)); + createExtraChild(new WidgetPointer(arg0), 4, ivar6); + ivar6 = add(ivar6, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar7, 13), add(ivar8, 39), 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(2, 1, 0); + ivar11 = script_2720(ivar9, ivar3); + if (ivar11 == -1) { + setWidgetText("N/A"); + } else { + setWidgetText(script_940(ivar11)); + } + setWidgetRGB(new Color(script_1146(ivar11))); + setWidgetUnknownBoolean(true); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + ivar6 = add(ivar6, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar7, 33), add(ivar8, 4), 0, 0); + setWidgetSprite(2180); + script_812(ivar9); + svar0 = script_2706(ivar9); + setScriptCallOnMouseOver(2707, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(620,34), svar0, 25, 200, -2147483647, -2147483646, "IiIsiiii"); + setScriptCallOnMouseExit(40, new WidgetPointer(620,34), "I"); + } + return; +} diff --git a/dumps/scripts/2002.cs2 b/dumps/scripts/2002.cs2 new file mode 100644 index 000000000..9e972699f --- /dev/null +++ b/dumps/scripts/2002.cs2 @@ -0,0 +1,38 @@ +int script_2002() { + int ivar0; + ivar0 = 0; + if (((boolean)bitconfig_8150)) { + if (bitconfig_4069 > 79) { + ivar0 = 0; + } else { + ivar0 = subtract(80, bitconfig_4069); + } + } else if (((boolean)bitconfig_3976)) { + if (bitconfig_4069 > 63) { + ivar0 = 0; + } else { + ivar0 = subtract(64, bitconfig_4069); + } + } else if (((boolean)bitconfig_3975)) { + if (bitconfig_4069 > 31) { + ivar0 = 0; + } else { + ivar0 = subtract(32, bitconfig_4069); + } + } else if (((boolean)bitconfig_3974)) { + if (bitconfig_4069 > 15) { + ivar0 = 0; + } else { + ivar0 = subtract(16, bitconfig_4069); + } + } else { + if (((boolean)bitconfig_3974)) { + if (bitconfig_4069 > 7) { + ivar0 = 0; + } else { + ivar0 = subtract(8, bitconfig_4069); + } + } + } + return ivar0; +} diff --git a/dumps/scripts/2003.cs2 b/dumps/scripts/2003.cs2 new file mode 100644 index 000000000..257a61387 --- /dev/null +++ b/dumps/scripts/2003.cs2 @@ -0,0 +1,119 @@ +void script_2003() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int stack_dump0; + ivar0 = 0; + if (getSkillActualLvl(19) >= 40) { + ivar0 = bitconfig_4449; + } else { + ivar0 = divide(multiply(bitconfig_4449, cs2method_3408(105, 105, 1369, getSkillActualLvl(19))), 100); + } + if (((boolean)bitconfig_4449)) { + setWidgetText(new WidgetPointer(686,13), "Trade one point" + "
" + "for " + formatNumber(ivar0, 1) + " XP?"); + } else { + setWidgetText(new WidgetPointer(686,13), "Trade " + formatNumber(bitconfig_4449, 1) + " points" + "
" + "for " + formatNumber(ivar0, 1) + " XP?"); + } + deleteAllExtraChilds(new WidgetPointer(686,6)); + ivar1 = getCommonDefinitionSize(1589); + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = -1; + ivar7 = 0; + ivar8 = 0; + while (ivar8 < ivar1) { + ivar6 = cs2method_3408(105, 79, 1589, ivar8); + ivar7 = cs2method_3408(111, 105, 1365, ivar6); + ivar2 = multiply(mod(ivar8, 9), 50); + ivar3 = multiply(divide(ivar8, 9), 54); + stack_dump0 = max(ivar4, ivar2); + ivar5 = max(ivar5, ivar3); + ivar4 = stack_dump0; + createExtraChild(new WidgetPointer(686,6), 5, getExtraChildGap(new WidgetPointer(686,6))); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar2, ivar3, 0, 0); + setWidgetSprite(2205); + if (ivar6 == 11209) { + setWidgetContextMenuOption(1, "Trade points for XP"); + setScriptCallOnClickContextMenu(69, 0, new WidgetPointer(686,9), "1I"); + } else { + cs2method1305("" + getItemName(ivar6) + ""); + setWidgetContextMenuOption(1, "Value"); + setWidgetContextMenuOption(2, "Buy 1"); + setWidgetContextMenuOption(3, "Buy 5"); + setWidgetContextMenuOption(4, "Buy 10"); + if (ivar6 != 12625) { + setWidgetContextMenuOption(5, "Buy X"); + } + setWidgetContextMenuOption(10, "Examine"); + } + setScriptCallOnMouseEntered(2140, new WidgetPointer(-32768,3), add(getWidgetCustomChildArrayIndex(), 1), 0, "Iii"); + setScriptCallOnMouseExit(2140, new WidgetPointer(-32768,3), add(getWidgetCustomChildArrayIndex(), 1), 255, "Iii"); + createExtraChild(new WidgetPointer(686,6), 5, getExtraChildGap(new WidgetPointer(686,6))); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar2, ivar3, 0, 0); + setWidgetSprite(2206); + cs2method2103(255); + createExtraChild(new WidgetPointer(686,6), 5, getExtraChildGap(new WidgetPointer(686,6))); + if (ivar6 == 11209) { + setWidgetSize(34, 34, 0, 0); + setWidgetPosition(add(ivar2, 7), add(ivar3, 2), 0, 0); + if (((boolean)getLanguage())) { + setWidgetSprite(2714); + } else { + setWidgetSprite(2730); + } + } else { + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar2, 6), add(ivar3, 4), 0, 0); + setItemOnWidgetMethod1205(ivar6, 5); + setWidgetBorderThickness(1); + } + setWidgetShadowColor(new Color(48, 32, 32)); + createExtraChild(new WidgetPointer(686,6), 5, getExtraChildGap(new WidgetPointer(686,6))); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar2, 2), add(ivar3, 38), 0, 0); + setItemOnWidgetMethod1205(12625, 1); + createExtraChild(new WidgetPointer(686,6), 4, getExtraChildGap(new WidgetPointer(686,6))); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar2, 13), add(ivar3, 39), 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(2, 1, 0); + if (ivar7 == -1) { + setWidgetText("N/A"); + } else { + setWidgetText(script_940(ivar7)); + } + if (ivar7 <= bitconfig_4449) { + setWidgetRGB(new Color(255, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(true); + ivar8 = add(ivar8, 1); + } + stack_dump0 = add(ivar4, 48); + ivar5 = add(ivar5, 52); + ivar4 = stack_dump0; + ivar9 = getWidgetActualHeight(new WidgetPointer(686,6)); + setWidgetSize(ivar4, ivar9, 0, 0, new WidgetPointer(686,6)); + if (ivar5 > ivar9) { + setWidgetPosition(divide(subtract(subtract(getWidgetActualWidth(new WidgetPointer(686,5)), getWidgetActualWidth(new WidgetPointer(686,7))), ivar4), 2), 0, 0, 1, new WidgetPointer(686,6)); + setWidgetIsHidden(false, new WidgetPointer(686,7)); + setWidgetScrollMax(0, ivar5, new WidgetPointer(686,6)); + script_31(44957703, 44957702, 792, 789, 790, 791, 773, 788); + } else { + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(686,6)); + setWidgetIsHidden(true, new WidgetPointer(686,7)); + } + return; +} diff --git a/dumps/scripts/2004.cs2 b/dumps/scripts/2004.cs2 new file mode 100644 index 000000000..d2531f99b --- /dev/null +++ b/dumps/scripts/2004.cs2 @@ -0,0 +1,13 @@ +void script_2004(int arg0,int arg1) { + int ivar2; + ivar2 = cs2method6143(); + if ((((boolean)ivar2) && (globalint_1394 > 0)) && (globalint_1394 <= 255)) { + cs2method6038(globalint_1394); + } else { + if (ivar2 > 0) { + cs2method6038(0); + } + } + script_2007(arg0, arg1, 0, 1); + return; +} diff --git a/dumps/scripts/2005.cs2 b/dumps/scripts/2005.cs2 new file mode 100644 index 000000000..52c6730d5 --- /dev/null +++ b/dumps/scripts/2005.cs2 @@ -0,0 +1,36 @@ +void script_2005(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + if ((arg2 >= getWidgetActualX(new WidgetPointer(arg1))) && (arg2 <= add(getWidgetActualX(new WidgetPointer(arg1)), getWidgetActualWidth(new WidgetPointer(arg1))))) { + return; + } + ivar4 = subtract(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg1))); + ivar5 = divide(getWidgetActualWidth(new WidgetPointer(arg1)), 2); + if (arg2 == -1) { + arg2 = getWidgetActualWidth(new WidgetPointer(arg0)); + } + arg2 = max(subtract(arg2, ivar5), 0); + arg2 = min(arg2, ivar4); + switch (arg3) { + case 0: + cs2method6018(multiplyDivide(arg2, ivar4, 127)); + script_1217(arg0, arg1); + break; + case 1: + cs2method6019(multiplyDivide(arg2, ivar4, 255)); + script_1216(arg0, arg1); + break; + case 2: + cs2method6020(multiplyDivide(arg2, ivar4, 127)); + script_1218(arg0, arg1); + break; + case 3: + cs2method6001(add(min(multiplyDivide(arg2, ivar4, 4), 3), 1)); + script_1185(arg0, arg1); + break; + case 4: + cs2method6038(multiplyDivide(arg2, ivar4, 255)); + script_2007(arg0, arg1, 1, 1); + } + return; +} diff --git a/dumps/scripts/2006.cs2 b/dumps/scripts/2006.cs2 new file mode 100644 index 000000000..a104dc418 --- /dev/null +++ b/dumps/scripts/2006.cs2 @@ -0,0 +1,9 @@ +void script_2006(int arg0) { + if (arg0 > 0) { + setWidgetSprite(4123, new WidgetPointer(744,108)); + } else { + setWidgetSprite(4124, new WidgetPointer(744,108)); + } + setScriptCallOnGameloop(3961, 0, new WidgetPointer(744,7), "iI", new WidgetPointer(744,7)); + return; +} diff --git a/dumps/scripts/2007.cs2 b/dumps/scripts/2007.cs2 new file mode 100644 index 000000000..eaf3de2cf --- /dev/null +++ b/dumps/scripts/2007.cs2 @@ -0,0 +1,23 @@ +void script_2007(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + cs2method2301(arg0, -1, new WidgetPointer(arg1)); + ivar4 = subtract(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg1))); + ivar5 = multiplyDivide(cs2method6143(), 255, ivar4); + setWidgetPosition(ivar5, 0, 0, 0, new WidgetPointer(arg1)); + if (cs2method6143() > 0) { + if (((boolean)arg3)) { + setWidgetSprite(4123, new WidgetPointer(744,108)); + } else { + setWidgetSprite(4118, new WidgetPointer(744,108)); + } + } else if (((boolean)arg3)) { + setWidgetSprite(4124, new WidgetPointer(744,108)); + } else { + setWidgetSprite(4119, new WidgetPointer(744,108)); + } + if (((boolean)arg2)) { + globalint_1394 = cs2method6143(); + } + return; +} diff --git a/dumps/scripts/2008.cs2 b/dumps/scripts/2008.cs2 new file mode 100644 index 000000000..d79767212 --- /dev/null +++ b/dumps/scripts/2008.cs2 @@ -0,0 +1,4 @@ +void script_2008(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 86 Agility"); + return; +} diff --git a/dumps/scripts/2009.cs2 b/dumps/scripts/2009.cs2 new file mode 100644 index 000000000..a393463f2 --- /dev/null +++ b/dumps/scripts/2009.cs2 @@ -0,0 +1,4 @@ +void script_2009(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 90 Agility"); + return; +} diff --git a/dumps/scripts/201.cs2 b/dumps/scripts/201.cs2 new file mode 100644 index 000000000..544192628 --- /dev/null +++ b/dumps/scripts/201.cs2 @@ -0,0 +1,7 @@ +void script_201() { + if ((((boolean)globalint_1034) && ((boolean)globalint_1027)) && (strLength(globalstring_202) > 0)) { + sendUnknownFriendPacketMethod3619(globalstring_202); + globalint_1034 = 2; + } + return; +} diff --git a/dumps/scripts/2010.cs2 b/dumps/scripts/2010.cs2 new file mode 100644 index 000000000..2025c5f46 --- /dev/null +++ b/dumps/scripts/2010.cs2 @@ -0,0 +1,4 @@ +void script_2010(int arg0,int arg1,string arg2) { + script_311(arg0, arg1, getOtherCommonData(471, 596) + "
" + arg2); + return; +} diff --git a/dumps/scripts/2011.cs2 b/dumps/scripts/2011.cs2 new file mode 100644 index 000000000..7d0ab4792 --- /dev/null +++ b/dumps/scripts/2011.cs2 @@ -0,0 +1,4 @@ +void script_2011(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 26 Agility"); + return; +} diff --git a/dumps/scripts/2012.cs2 b/dumps/scripts/2012.cs2 new file mode 100644 index 000000000..32aa8ac9c --- /dev/null +++ b/dumps/scripts/2012.cs2 @@ -0,0 +1,4 @@ +void script_2012(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 80 Agility"); + return; +} diff --git a/dumps/scripts/2013.cs2 b/dumps/scripts/2013.cs2 new file mode 100644 index 000000000..1cea17563 --- /dev/null +++ b/dumps/scripts/2013.cs2 @@ -0,0 +1,4 @@ +void script_2013(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 70 Agility"); + return; +} diff --git a/dumps/scripts/2014.cs2 b/dumps/scripts/2014.cs2 new file mode 100644 index 000000000..3796e196e --- /dev/null +++ b/dumps/scripts/2014.cs2 @@ -0,0 +1,4 @@ +void script_2014(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 51 Agility"); + return; +} diff --git a/dumps/scripts/2015.cs2 b/dumps/scripts/2015.cs2 new file mode 100644 index 000000000..cfcaf2bc3 --- /dev/null +++ b/dumps/scripts/2015.cs2 @@ -0,0 +1,4 @@ +void script_2015(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 38 Agility"); + return; +} diff --git a/dumps/scripts/2016.cs2 b/dumps/scripts/2016.cs2 new file mode 100644 index 000000000..656d06ee5 --- /dev/null +++ b/dumps/scripts/2016.cs2 @@ -0,0 +1,4 @@ +void script_2016(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 53 Agility, level 42 Ranged, level 21 Strength" + "
" + "Requires a grapple"); + return; +} diff --git a/dumps/scripts/2017.cs2 b/dumps/scripts/2017.cs2 new file mode 100644 index 000000000..5eae92e9e --- /dev/null +++ b/dumps/scripts/2017.cs2 @@ -0,0 +1,4 @@ +void script_2017(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 43 Agility"); + return; +} diff --git a/dumps/scripts/2018.cs2 b/dumps/scripts/2018.cs2 new file mode 100644 index 000000000..c6aee84d1 --- /dev/null +++ b/dumps/scripts/2018.cs2 @@ -0,0 +1,4 @@ +void script_2018(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 41 Agility"); + return; +} diff --git a/dumps/scripts/2019.cs2 b/dumps/scripts/2019.cs2 new file mode 100644 index 000000000..d9056f770 --- /dev/null +++ b/dumps/scripts/2019.cs2 @@ -0,0 +1,4 @@ +void script_2019(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 15 Agility"); + return; +} diff --git a/dumps/scripts/202.cs2 b/dumps/scripts/202.cs2 new file mode 100644 index 000000000..413ed3846 --- /dev/null +++ b/dumps/scripts/202.cs2 @@ -0,0 +1,25 @@ +void script_202(int arg0,int arg1,string arg2,string arg3) { + switch (arg0) { + case 5: + if (isFriend(arg3)) { + globalint_1650 = 1; + globalstring_23 = arg2; + script_1558(0); + return; + } + cs2method3605(arg2); + break; + case 6: + cs2method3607(arg2); + break; + case 7: + cs2method3606(arg2); + break; + case 8: + cs2method3608(arg2); + break; + case 9: + script_1633(arg2); + } + return; +} diff --git a/dumps/scripts/2020.cs2 b/dumps/scripts/2020.cs2 new file mode 100644 index 000000000..28674e4dd --- /dev/null +++ b/dumps/scripts/2020.cs2 @@ -0,0 +1,37 @@ +void script_2020(int arg0,int arg1,int arg2,string arg3) { + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 5, 0); + setWidgetSize(10, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(3859); + createExtraChild(new WidgetPointer(arg2), 5, 1); + setWidgetSize(6, 0, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(3857); + createExtraChild(new WidgetPointer(arg2), 5, 2); + setWidgetSize(6, 0, 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(3858); + createExtraChild(new WidgetPointer(arg2), 4, 3); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(true); + setWidgetText(arg3); + setWidgetSize(arg1, 26, 0, 0, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setScriptCallOnMouseEntered(2021, new WidgetPointer(-32768,3), 1, "I1", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(2021, new WidgetPointer(-32768,3), 0, "I1", new WidgetPointer(arg2)); + if (arg0 == -1) { + setWidgetNoOptions(new WidgetPointer(arg2)); + cs2method2310(new WidgetPointer(arg2), arg3); + setScriptCallOnMousePressed(2022, 1, arg0, "ii", new WidgetPointer(arg2)); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(arg2), arg3); + cs2method2310(new WidgetPointer(arg2), ""); + setScriptCallOnClickContextMenu(2022, -2147483644, arg0, "ii", new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/2021.cs2 b/dumps/scripts/2021.cs2 new file mode 100644 index 000000000..6dcee1632 --- /dev/null +++ b/dumps/scripts/2021.cs2 @@ -0,0 +1,24 @@ +void script_2021(int arg0,int arg1) { + if (((boolean)arg1)) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(3862); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(3860); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(3861); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(3859); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(3857); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(3858); + } + } + return; +} diff --git a/dumps/scripts/2022.cs2 b/dumps/scripts/2022.cs2 new file mode 100644 index 000000000..154c0f421 --- /dev/null +++ b/dumps/scripts/2022.cs2 @@ -0,0 +1,14 @@ +void script_2022(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + if (arg1 <= -1) { + setWidgetText(new WidgetPointer(916,17), ""); + return; + } + bitconfig_8095 = min(arg1, bitconfig_8094); + script_2047(); + setScriptCallOnGameloop(2024, add(getClientCycle(), 15), "i", new WidgetPointer(905,28)); + setWidgetIsHidden(false, new WidgetPointer(905,28)); + return; +} diff --git a/dumps/scripts/2023.cs2 b/dumps/scripts/2023.cs2 new file mode 100644 index 000000000..3b5149a34 --- /dev/null +++ b/dumps/scripts/2023.cs2 @@ -0,0 +1,10 @@ +void script_2023(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + bitconfig_8095 = max(min(add(bitconfig_8095, arg1), bitconfig_8094), 0); + script_2047(); + setScriptCallOnGameloop(2024, add(getClientCycle(), 15), "i", new WidgetPointer(905,28)); + setWidgetIsHidden(false, new WidgetPointer(905,28)); + return; +} diff --git a/dumps/scripts/2024.cs2 b/dumps/scripts/2024.cs2 new file mode 100644 index 000000000..ffa211fa5 --- /dev/null +++ b/dumps/scripts/2024.cs2 @@ -0,0 +1,8 @@ +void script_2024(int arg0) { + if (getClientCycle() < arg0) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(905,28)); + setWidgetIsHidden(true, new WidgetPointer(905,28)); + return; +} diff --git a/dumps/scripts/2025.cs2 b/dumps/scripts/2025.cs2 new file mode 100644 index 000000000..7a24f1a26 --- /dev/null +++ b/dumps/scripts/2025.cs2 @@ -0,0 +1,4 @@ +void script_2025() { + script_2047(); + return; +} diff --git a/dumps/scripts/2026.cs2 b/dumps/scripts/2026.cs2 new file mode 100644 index 000000000..8f54881b4 --- /dev/null +++ b/dumps/scripts/2026.cs2 @@ -0,0 +1,14 @@ +void script_2026() { + setWidgetFont(496, new WidgetPointer(752,4)); + setWidgetFont(496, new WidgetPointer(752,5)); + setWidgetSize(20, 40, 1, 0, new WidgetPointer(752,4)); + setWidgetSize(20, 20, 1, 0, new WidgetPointer(752,5)); + setWidgetPosition(0, 20, 1, 0, new WidgetPointer(752,4)); + setWidgetPosition(0, 60, 1, 0, new WidgetPointer(752,5)); + setScriptCallOnMouseOver(-1, "", new WidgetPointer(752,5)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(752,5)); + setScriptCallOnAnyWidgetOpenAndClose(-1, "", new WidgetPointer(752,5)); + setWidgetRGB(new Color(0, 0, 128), new WidgetPointer(752,5)); + deleteAllExtraChilds(new WidgetPointer(752,3)); + return; +} diff --git a/dumps/scripts/2027.cs2 b/dumps/scripts/2027.cs2 new file mode 100644 index 000000000..5186a1f2d --- /dev/null +++ b/dumps/scripts/2027.cs2 @@ -0,0 +1,32 @@ +void script_2027(int arg0) { + if (isBitFlagged(standart_config_331, 0)) { + setWidget3DRotation(0, 0, 512, 1536, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 1)) { + setWidget3DRotation(0, 0, 512, 1664, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 2)) { + setWidget3DRotation(0, 0, 512, 1792, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 3)) { + setWidget3DRotation(0, 0, 512, 1920, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 4)) { + setWidget3DRotation(0, 0, 512, 0, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 5)) { + setWidget3DRotation(0, 0, 512, 128, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 6)) { + setWidget3DRotation(0, 0, 512, 256, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 7)) { + setWidget3DRotation(0, 0, 512, 384, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 8)) { + setWidget3DRotation(0, 0, 512, 512, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 9)) { + setWidget3DRotation(0, 0, 512, 640, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 10)) { + setWidget3DRotation(0, 0, 512, 768, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 11)) { + setWidget3DRotation(0, 0, 512, 896, 0, 400, new WidgetPointer(arg0)); + } else { + if (isBitFlagged(standart_config_331, 12)) { + setWidget3DRotation(0, 0, 512, 1024, 0, 400, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2028.cs2 b/dumps/scripts/2028.cs2 new file mode 100644 index 000000000..2488326b1 --- /dev/null +++ b/dumps/scripts/2028.cs2 @@ -0,0 +1,32 @@ +void script_2028(int arg0) { + if (isBitFlagged(standart_config_331, 13)) { + setWidget3DRotation(0, 0, 512, 1536, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 14)) { + setWidget3DRotation(0, 0, 512, 1664, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 15)) { + setWidget3DRotation(0, 0, 512, 1792, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 16)) { + setWidget3DRotation(0, 0, 512, 1920, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 17)) { + setWidget3DRotation(0, 0, 512, 0, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 18)) { + setWidget3DRotation(0, 0, 512, 128, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 19)) { + setWidget3DRotation(0, 0, 512, 256, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 20)) { + setWidget3DRotation(0, 0, 512, 384, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 21)) { + setWidget3DRotation(0, 0, 512, 512, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 22)) { + setWidget3DRotation(0, 0, 512, 640, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 23)) { + setWidget3DRotation(0, 0, 512, 768, 0, 400, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 24)) { + setWidget3DRotation(0, 0, 512, 896, 0, 400, new WidgetPointer(arg0)); + } else { + if (isBitFlagged(standart_config_331, 25)) { + setWidget3DRotation(0, 0, 512, 1024, 0, 400, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2029.cs2 b/dumps/scripts/2029.cs2 new file mode 100644 index 000000000..d4ffd52f5 --- /dev/null +++ b/dumps/scripts/2029.cs2 @@ -0,0 +1,8 @@ +void script_2029(int arg0,int arg1) { + if (standart_config_330 > arg1) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/203.cs2 b/dumps/scripts/203.cs2 new file mode 100644 index 000000000..610f27619 --- /dev/null +++ b/dumps/scripts/203.cs2 @@ -0,0 +1,8 @@ +void script_203(int arg0) { + if (cs2method5428(72679429, -1)) { + setScriptCallOnGameloop(204, "", new WidgetPointer(1109,5)); + return; + } + script_518(); + return; +} diff --git a/dumps/scripts/2030.cs2 b/dumps/scripts/2030.cs2 new file mode 100644 index 000000000..a9402feda --- /dev/null +++ b/dumps/scripts/2030.cs2 @@ -0,0 +1,12 @@ +void script_2030(int arg0) { + if (isBitFlagged(standart_config_331, 26)) { + setWidget3DRotation(0, 0, 512, 1024, 0, 1000, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 27)) { + setWidget3DRotation(0, 0, 512, 1536, 0, 1000, new WidgetPointer(arg0)); + } else { + if (isBitFlagged(standart_config_331, 28)) { + setWidget3DRotation(0, 0, 512, 0, 0, 1000, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2031.cs2 b/dumps/scripts/2031.cs2 new file mode 100644 index 000000000..bcea37811 --- /dev/null +++ b/dumps/scripts/2031.cs2 @@ -0,0 +1,12 @@ +void script_2031(int arg0) { + if (isBitFlagged(standart_config_331, 29)) { + setWidget3DRotation(0, 0, 512, 1024, 0, 1000, new WidgetPointer(arg0)); + } else if (isBitFlagged(standart_config_331, 30)) { + setWidget3DRotation(0, 0, 512, 1536, 0, 1000, new WidgetPointer(arg0)); + } else { + if (isBitFlagged(standart_config_331, 31)) { + setWidget3DRotation(0, 0, 512, 0, 0, 1000, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2032.cs2 b/dumps/scripts/2032.cs2 new file mode 100644 index 000000000..c543c618f --- /dev/null +++ b/dumps/scripts/2032.cs2 @@ -0,0 +1,83 @@ +void script_2032() { + setWidgetIsHidden(true, new WidgetPointer(366,2)); + setWidgetIsHidden(true, new WidgetPointer(366,3)); + setWidgetIsHidden(true, new WidgetPointer(366,4)); + setWidgetIsHidden(true, new WidgetPointer(366,5)); + setWidgetIsHidden(true, new WidgetPointer(366,6)); + setWidgetIsHidden(true, new WidgetPointer(366,7)); + setWidgetIsHidden(true, new WidgetPointer(366,8)); + setWidgetIsHidden(true, new WidgetPointer(366,9)); + setWidgetIsHidden(true, new WidgetPointer(366,10)); + setWidgetIsHidden(true, new WidgetPointer(366,11)); + setWidgetIsHidden(true, new WidgetPointer(366,12)); + setWidgetIsHidden(true, new WidgetPointer(366,13)); + setWidgetIsHidden(true, new WidgetPointer(366,14)); + setWidgetIsHidden(true, new WidgetPointer(366,15)); + setWidgetIsHidden(true, new WidgetPointer(366,16)); + setWidgetIsHidden(true, new WidgetPointer(366,17)); + setWidgetIsHidden(true, new WidgetPointer(366,18)); + setWidgetIsHidden(true, new WidgetPointer(366,19)); + setWidgetIsHidden(true, new WidgetPointer(366,20)); + setWidgetIsHidden(true, new WidgetPointer(366,21)); + if (standart_config_391 > 0) { + setWidgetIsHidden(false, new WidgetPointer(366,2)); + } + if (standart_config_391 > 4) { + setWidgetIsHidden(false, new WidgetPointer(366,3)); + } + if (standart_config_391 > 9) { + setWidgetIsHidden(false, new WidgetPointer(366,4)); + } + if (standart_config_391 > 14) { + setWidgetIsHidden(false, new WidgetPointer(366,5)); + } + if (standart_config_391 > 19) { + setWidgetIsHidden(false, new WidgetPointer(366,6)); + } + if (standart_config_391 > 24) { + setWidgetIsHidden(false, new WidgetPointer(366,7)); + } + if (standart_config_391 > 29) { + setWidgetIsHidden(false, new WidgetPointer(366,8)); + } + if (standart_config_391 > 34) { + setWidgetIsHidden(false, new WidgetPointer(366,9)); + } + if (standart_config_391 > 39) { + setWidgetIsHidden(false, new WidgetPointer(366,10)); + } + if (standart_config_391 > 44) { + setWidgetIsHidden(false, new WidgetPointer(366,11)); + } + if (standart_config_391 > 49) { + setWidgetIsHidden(false, new WidgetPointer(366,12)); + } + if (standart_config_391 > 54) { + setWidgetIsHidden(false, new WidgetPointer(366,13)); + } + if (standart_config_391 > 59) { + setWidgetIsHidden(false, new WidgetPointer(366,14)); + } + if (standart_config_391 > 64) { + setWidgetIsHidden(false, new WidgetPointer(366,15)); + } + if (standart_config_391 > 69) { + setWidgetIsHidden(false, new WidgetPointer(366,16)); + } + if (standart_config_391 > 74) { + setWidgetIsHidden(false, new WidgetPointer(366,17)); + } + if (standart_config_391 > 79) { + setWidgetIsHidden(false, new WidgetPointer(366,18)); + } + if (standart_config_391 > 84) { + setWidgetIsHidden(false, new WidgetPointer(366,19)); + } + if (standart_config_391 > 89) { + setWidgetIsHidden(false, new WidgetPointer(366,20)); + } + if (standart_config_391 > 94) { + setWidgetIsHidden(false, new WidgetPointer(366,21)); + } + return; +} diff --git a/dumps/scripts/2033.cs2 b/dumps/scripts/2033.cs2 new file mode 100644 index 000000000..37365ee0e --- /dev/null +++ b/dumps/scripts/2033.cs2 @@ -0,0 +1,78 @@ +void script_2033() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = getItemAmtInContainer(93, 2169); + ivar1 = getItemAmtInContainer(93, 2162); + ivar2 = getItemAmtInContainer(93, 2128); + ivar3 = getItemAmtInContainer(93, 2152); + ivar4 = getItemAmtInContainer(93, 1973); + if ((ivar3 >= 2) && (ivar0 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(437,37)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(437,37)); + } + if ((ivar2 >= 2) && (ivar0 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(437,38)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(437,38)); + } + if (((ivar2 >= 1) && (ivar0 >= 1)) && (ivar1 >= 2)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(437,39)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(437,39)); + } + if ((ivar4 >= 2) && (ivar0 >= 1)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(437,40)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(437,40)); + } + if (getItemAmtInContainer(93, 2152) > 1) { + setItemOnWidgetMethod2200(2152, 100, new WidgetPointer(437,4)); + } else { + setItemOnWidgetMethod2200(9499, 100, new WidgetPointer(437,4)); + } + if (getItemAmtInContainer(93, 2169) > 0) { + setItemOnWidgetMethod2200(2169, 90, new WidgetPointer(437,5)); + } else { + setItemOnWidgetMethod2200(9500, 90, new WidgetPointer(437,5)); + } + if (getItemAmtInContainer(93, 2128) > 1) { + setItemOnWidgetMethod2200(2128, 120, new WidgetPointer(437,12)); + } else { + setItemOnWidgetMethod2200(9494, 120, new WidgetPointer(437,12)); + } + if (getItemAmtInContainer(93, 2169) > 0) { + setItemOnWidgetMethod2200(2169, 90, new WidgetPointer(437,11)); + } else { + setItemOnWidgetMethod2200(9500, 90, new WidgetPointer(437,11)); + } + if (getItemAmtInContainer(93, 1973) > 1) { + setItemOnWidgetMethod2200(1973, 140, new WidgetPointer(437,27)); + } else { + setItemOnWidgetMethod2200(9507, 140, new WidgetPointer(437,27)); + } + if (getItemAmtInContainer(93, 2169) > 0) { + setItemOnWidgetMethod2200(2169, 90, new WidgetPointer(437,28)); + } else { + setItemOnWidgetMethod2200(9500, 90, new WidgetPointer(437,28)); + } + if (getItemAmtInContainer(93, 2162) > 1) { + setItemOnWidgetMethod2200(2162, 100, new WidgetPointer(437,19)); + } else { + setItemOnWidgetMethod2200(9501, 100, new WidgetPointer(437,19)); + } + if (getItemAmtInContainer(93, 2128) > 0) { + setItemOnWidgetMethod2200(2128, 120, new WidgetPointer(437,20)); + } else { + setItemOnWidgetMethod2200(9494, 120, new WidgetPointer(437,20)); + } + if (getItemAmtInContainer(93, 2169) > 0) { + setItemOnWidgetMethod2200(2169, 90, new WidgetPointer(437,18)); + } else { + setItemOnWidgetMethod2200(9500, 90, new WidgetPointer(437,18)); + } + return; +} diff --git a/dumps/scripts/2034.cs2 b/dumps/scripts/2034.cs2 new file mode 100644 index 000000000..4505ac984 --- /dev/null +++ b/dumps/scripts/2034.cs2 @@ -0,0 +1,3 @@ +int script_2034() { + return add(add(add(add(add(add(add(add(add(add(add(bitconfig_5782, bitconfig_5783), bitconfig_5785), bitconfig_5787), bitconfig_5786), bitconfig_5788), bitconfig_5790), bitconfig_5789), bitconfig_5791), bitconfig_5793), bitconfig_5792), bitconfig_5784); +} diff --git a/dumps/scripts/2035.cs2 b/dumps/scripts/2035.cs2 new file mode 100644 index 000000000..1e9ac95b4 --- /dev/null +++ b/dumps/scripts/2035.cs2 @@ -0,0 +1,17 @@ +int script_2035() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/2036.cs2 b/dumps/scripts/2036.cs2 new file mode 100644 index 000000000..06697627d --- /dev/null +++ b/dumps/scripts/2036.cs2 @@ -0,0 +1,3 @@ +int script_2036() { + return add(add(add(add(add(add(add(add(add(add(add(bitconfig_5799, bitconfig_5805), bitconfig_5794), bitconfig_5797), bitconfig_5795), bitconfig_5800), bitconfig_5796), bitconfig_5798), bitconfig_5802), bitconfig_5803), bitconfig_5804), bitconfig_5801); +} diff --git a/dumps/scripts/2037.cs2 b/dumps/scripts/2037.cs2 new file mode 100644 index 000000000..df93719ea --- /dev/null +++ b/dumps/scripts/2037.cs2 @@ -0,0 +1,17 @@ +int script_2037() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 15); + ivar0 = add(ivar0, 15); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/2038.cs2 b/dumps/scripts/2038.cs2 new file mode 100644 index 000000000..cb4a52990 --- /dev/null +++ b/dumps/scripts/2038.cs2 @@ -0,0 +1,3 @@ +int script_2038() { + return add(add(add(add(add(add(add(add(add(add(bitconfig_5811, bitconfig_5806), bitconfig_5810), bitconfig_5809), bitconfig_5807), bitconfig_5808), bitconfig_5812), bitconfig_5814), bitconfig_5815), bitconfig_5816), bitconfig_5813); +} diff --git a/dumps/scripts/2039.cs2 b/dumps/scripts/2039.cs2 new file mode 100644 index 000000000..a04a27cb0 --- /dev/null +++ b/dumps/scripts/2039.cs2 @@ -0,0 +1,16 @@ +int script_2039() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/204.cs2 b/dumps/scripts/204.cs2 new file mode 100644 index 000000000..40362301e --- /dev/null +++ b/dumps/scripts/204.cs2 @@ -0,0 +1,8 @@ +void script_204() { + if (cs2method5428(72679429, -1)) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(1109,5)); + script_518(); + return; +} diff --git a/dumps/scripts/2040.cs2 b/dumps/scripts/2040.cs2 new file mode 100644 index 000000000..5e0bb5d2c --- /dev/null +++ b/dumps/scripts/2040.cs2 @@ -0,0 +1,8 @@ +void script_2040(int arg0) { + if (((boolean)bitconfig_949)) { + setWidgetText(new WidgetPointer(arg0), "Coal to add: " + intToStr(bitconfig_940)); + } else { + setWidgetText(new WidgetPointer(arg0), "Coal in furnace: " + intToStr(bitconfig_949)); + } + return; +} diff --git a/dumps/scripts/2041.cs2 b/dumps/scripts/2041.cs2 new file mode 100644 index 000000000..f08c88087 --- /dev/null +++ b/dumps/scripts/2041.cs2 @@ -0,0 +1,75 @@ +void script_2041() { + setWidgetText(new WidgetPointer(28,42), "Bronze: " + intToStr(bitconfig_941)); + if (bitconfig_941 > 0) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,44)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,42)); + } else { + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,44)); + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,42)); + } + setWidgetText(new WidgetPointer(28,39), "Iron: " + intToStr(bitconfig_942)); + if (bitconfig_942 > 0) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,41)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,39)); + } else { + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,41)); + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,39)); + } + setWidgetText(new WidgetPointer(28,37), "Steel: " + intToStr(bitconfig_943)); + if (bitconfig_943 > 0) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,38)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,37)); + } else { + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,38)); + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,37)); + } + setWidgetText(new WidgetPointer(28,34), "Mithril: " + intToStr(bitconfig_944)); + if (bitconfig_944 > 0) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,35)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,34)); + } else { + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,35)); + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,34)); + } + setWidgetText(new WidgetPointer(28,31), "Adamantite: " + intToStr(bitconfig_945)); + if (bitconfig_945 > 0) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,32)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,31)); + } else { + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,32)); + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,31)); + } + setWidgetText(new WidgetPointer(28,28), "Runite: " + intToStr(bitconfig_946)); + if (bitconfig_946 > 0) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,29)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,28)); + } else { + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,29)); + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,28)); + } + setWidgetText(new WidgetPointer(28,25), "Silver: " + intToStr(bitconfig_948)); + if (bitconfig_948 > 0) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,26)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,25)); + } else { + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,26)); + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,25)); + } + setWidgetText(new WidgetPointer(28,22), "Gold: " + intToStr(bitconfig_947)); + if (bitconfig_947 > 0) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,23)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,22)); + } else { + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,23)); + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,22)); + } + setWidgetText(new WidgetPointer(28,2), "Perfect Gold: " + intToStr(bitconfig_958)); + if (bitconfig_958 > 0) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,4)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(28,2)); + } else { + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,4)); + setWidgetRGB(new Color(153, 153, 153), new WidgetPointer(28,2)); + } + return; +} diff --git a/dumps/scripts/2042.cs2 b/dumps/scripts/2042.cs2 new file mode 100644 index 000000000..5643d9db2 --- /dev/null +++ b/dumps/scripts/2042.cs2 @@ -0,0 +1,17 @@ +cs2func_script_2042_struct(2,1,0) script_2042(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + string svar0; + svar0 = "null"; + ivar3 = -1; + ivar4 = 1; + if (((boolean)script_1024(arg2))) { + svar0 = "" + "130 combined levels in " + "" + "Attack and Strength" + "" + " is one of the requirements for " + "" + getCommonString(1481, arg2) + "" + "."; + } else { + svar0 = "" + "You now have all the levels necessary to complete " + "" + getCommonString(1481, arg2) + "" + "."; + } + if (ivar3 == -1) { + ivar3 = 6513; + } + return newstruct cs2func_script_2042_struct(ivar3, ivar4, svar0); +} diff --git a/dumps/scripts/2043.cs2 b/dumps/scripts/2043.cs2 new file mode 100644 index 000000000..62d85a07c --- /dev/null +++ b/dumps/scripts/2043.cs2 @@ -0,0 +1,4 @@ +void script_2043(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(standart_config_157)); + return; +} diff --git a/dumps/scripts/2044.cs2 b/dumps/scripts/2044.cs2 new file mode 100644 index 000000000..a6a602833 --- /dev/null +++ b/dumps/scripts/2044.cs2 @@ -0,0 +1,88 @@ +void script_2044() { + setWidgetIsHidden(true, new WidgetPointer(325,2)); + setWidgetIsHidden(true, new WidgetPointer(325,3)); + setWidgetIsHidden(true, new WidgetPointer(325,10)); + setWidgetIsHidden(true, new WidgetPointer(325,8)); + setWidgetIsHidden(true, new WidgetPointer(325,4)); + setWidgetIsHidden(true, new WidgetPointer(325,6)); + setWidgetIsHidden(true, new WidgetPointer(325,5)); + setWidgetIsHidden(true, new WidgetPointer(325,11)); + setWidgetIsHidden(true, new WidgetPointer(325,9)); + setWidgetIsHidden(true, new WidgetPointer(325,7)); + setWidgetIsHidden(true, new WidgetPointer(325,12)); + setWidgetIsHidden(true, new WidgetPointer(325,31)); + setWidgetIsHidden(true, new WidgetPointer(325,30)); + setWidgetIsHidden(true, new WidgetPointer(325,29)); + setWidgetIsHidden(true, new WidgetPointer(325,28)); + setWidgetIsHidden(true, new WidgetPointer(325,27)); + setWidgetIsHidden(true, new WidgetPointer(325,26)); + setWidgetIsHidden(true, new WidgetPointer(325,25)); + setWidgetIsHidden(true, new WidgetPointer(325,24)); + setWidgetIsHidden(true, new WidgetPointer(325,23)); + setWidgetIsHidden(true, new WidgetPointer(325,22)); + switch (standart_config_158) { + case 0: + setWidgetIsHidden(false, new WidgetPointer(325,2)); + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(325,3)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(325,10)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(325,8)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(325,4)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(325,6)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(325,5)); + break; + case 7: + setWidgetIsHidden(false, new WidgetPointer(325,11)); + break; + case 8: + setWidgetIsHidden(false, new WidgetPointer(325,9)); + break; + case 9: + setWidgetIsHidden(false, new WidgetPointer(325,7)); + break; + case 10: + setWidgetIsHidden(false, new WidgetPointer(325,12)); + } + if (standart_config_156 < 2) { + setWidgetIsHidden(false, new WidgetPointer(325,31)); + } + if (standart_config_156 < 3) { + setWidgetIsHidden(false, new WidgetPointer(325,30)); + } + if (standart_config_156 < 4) { + setWidgetIsHidden(false, new WidgetPointer(325,29)); + } + if (standart_config_156 < 5) { + setWidgetIsHidden(false, new WidgetPointer(325,28)); + } + if (standart_config_156 < 6) { + setWidgetIsHidden(false, new WidgetPointer(325,27)); + } + if (standart_config_156 < 7) { + setWidgetIsHidden(false, new WidgetPointer(325,26)); + } + if (standart_config_156 < 8) { + setWidgetIsHidden(false, new WidgetPointer(325,25)); + } + if (standart_config_156 < 9) { + setWidgetIsHidden(false, new WidgetPointer(325,24)); + } + if (standart_config_156 < 10) { + setWidgetIsHidden(false, new WidgetPointer(325,23)); + } + if (standart_config_156 < 11) { + setWidgetIsHidden(false, new WidgetPointer(325,22)); + } + return; +} diff --git a/dumps/scripts/2045.cs2 b/dumps/scripts/2045.cs2 new file mode 100644 index 000000000..6c8048d61 --- /dev/null +++ b/dumps/scripts/2045.cs2 @@ -0,0 +1,59 @@ +void script_2045(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + opcStruct5208(2,0,0) structdump_0; + opcStruct5209(2,0,0) structdump_1; + if (cs2method5220()) { + script_2046(arg0); + return; + } + ivar5 = getWidgetActualWidth(new WidgetPointer(arg1)); + if (ivar5 <= 0) { + return; + } + ivar6 = 0; + ivar7 = 0; + structdump_0 = cs2method5208(); + ivar7 = structdump_0.intpart_1; + ivar6 = structdump_0.intpart_0; + if (ivar6 <= 0) { + return; + } + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + structdump_1 = cs2method5209(); + ivar13 = structdump_1.intpart_1; + ivar12 = structdump_1.intpart_0; + ivar8 = add(ivar13, divide(ivar7, 2)); + ivar9 = subtract(ivar13, divide(ivar7, 2)); + ivar10 = add(ivar12, divide(ivar6, 2)); + ivar11 = subtract(ivar12, divide(ivar6, 2)); + ivar11 = add(ivar11, multiplyDivide(ivar6, ivar5, subtract(ivar5, getWidgetActualWidth(new WidgetPointer(arg0))))); + if (((ivar12 != arg2) || (ivar13 != arg3)) || (ivar7 != arg4)) { + setScriptCallOnGameloop(2045, new WidgetPointer(arg0), new WidgetPointer(arg1), ivar12, ivar13, ivar7, "IIiii", new WidgetPointer(arg0)); + script_295(arg0, ivar8, ivar9, ivar10, ivar11); + } + if (((boolean)bitconfig_6174)) { + script_4(49479716, globalint_674, 280, arg0, ivar8, ivar9, ivar10, ivar11, "You are here"); + } else { + deleteAllExtraChilds(new WidgetPointer(755,36)); + } + script_4(49479717, globalint_623, globalint_624, arg0, ivar8, ivar9, ivar10, ivar11, globalstring_53); + script_4(49479718, globalint_625, globalint_626, arg0, ivar8, ivar9, ivar10, ivar11, globalstring_54); + script_4(49479719, globalint_627, globalint_628, arg0, ivar8, ivar9, ivar10, ivar11, globalstring_55); + script_4(49479720, globalint_629, globalint_630, arg0, ivar8, ivar9, ivar10, ivar11, globalstring_56); + script_4(49479721, globalint_940, globalint_941, arg0, ivar8, ivar9, ivar10, ivar11, globalstring_190); + script_4(49479722, standart_config_1159, 972, arg0, ivar8, ivar9, ivar10, ivar11, "Your marker"); + return; +} diff --git a/dumps/scripts/2046.cs2 b/dumps/scripts/2046.cs2 new file mode 100644 index 000000000..04771dad4 --- /dev/null +++ b/dumps/scripts/2046.cs2 @@ -0,0 +1,12 @@ +void script_2046(int arg0) { + setScriptCallOnGameloop(2045, new WidgetPointer(arg0), new WidgetPointer(755,28), 0, 0, 0, "IIiii", new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(755,36)); + deleteAllExtraChilds(new WidgetPointer(755,37)); + deleteAllExtraChilds(new WidgetPointer(755,38)); + deleteAllExtraChilds(new WidgetPointer(755,39)); + deleteAllExtraChilds(new WidgetPointer(755,40)); + deleteAllExtraChilds(new WidgetPointer(755,41)); + deleteAllExtraChilds(new WidgetPointer(755,42)); + return; +} diff --git a/dumps/scripts/2047.cs2 b/dumps/scripts/2047.cs2 new file mode 100644 index 000000000..7311a63b7 --- /dev/null +++ b/dumps/scripts/2047.cs2 @@ -0,0 +1,52 @@ +void script_2047() { + string svar0; + if (((boolean)script_1103()) && (bitconfig_8095 >= bitconfig_8094)) { + setWidgetText(new WidgetPointer(916,17), "All"); + } else { + setWidgetText(new WidgetPointer(916,17), intToStr(bitconfig_8095)); + } + svar0 = script_1111(); + if (isWidgetHidden(new WidgetPointer(905,14))) { + cs2method2310(new WidgetPointer(905,14), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,15))) { + cs2method2310(new WidgetPointer(905,15), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,16))) { + cs2method2310(new WidgetPointer(905,16), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,17))) { + cs2method2310(new WidgetPointer(905,17), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,18))) { + cs2method2310(new WidgetPointer(905,18), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,19))) { + cs2method2310(new WidgetPointer(905,19), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,20))) { + cs2method2310(new WidgetPointer(905,20), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,21))) { + cs2method2310(new WidgetPointer(905,21), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,22))) { + cs2method2310(new WidgetPointer(905,22), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,23))) { + cs2method2310(new WidgetPointer(905,23), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,24))) { + cs2method2310(new WidgetPointer(905,24), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,25))) { + cs2method2310(new WidgetPointer(905,25), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,26))) { + cs2method2310(new WidgetPointer(905,26), svar0); + } + if (isWidgetHidden(new WidgetPointer(905,27))) { + cs2method2310(new WidgetPointer(905,27), svar0); + } + return; +} diff --git a/dumps/scripts/2048.cs2 b/dumps/scripts/2048.cs2 new file mode 100644 index 000000000..4c47e4ccc --- /dev/null +++ b/dumps/scripts/2048.cs2 @@ -0,0 +1,9 @@ +void script_2048(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,string arg13,string arg14) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + script_2049(arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + } else { + createExtraChild(new WidgetPointer(arg0), 5, arg1); + script_2049(arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + } + return; +} diff --git a/dumps/scripts/2049.cs2 b/dumps/scripts/2049.cs2 new file mode 100644 index 000000000..56e915d2e --- /dev/null +++ b/dumps/scripts/2049.cs2 @@ -0,0 +1,33 @@ +void script_2049(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,string arg11,string arg12) { + int ivar11; + int ivar12; + setWidgetHidden(0); + setWidgetSize(arg1, arg2, 0, 0); + setWidgetPosition(arg3, arg4, 1, 1); + cs2method1106(arg5); + cs2method1107(arg6); + setWidgetHFlip(arg7); + setWidgetVFlip(arg8); + setWidgetSprite(arg0); + ivar11 = 0; + ivar12 = 0; + if (((boolean)arg9)) { + cs2method1122(1); + ivar11 = mod(getClientCycle(), 50); + ivar12 = divide(50, 2); + if (ivar11 <= ivar12) { + cs2method2103(subtract(255, multiplyDivide(ivar11, ivar12, 255))); + } else { + cs2method2103(multiplyDivide(subtract(ivar11, ivar12), ivar12, 255)); + } + } + if (arg10 != -1) { + cs2method1305("" + arg11 + ""); + setWidgetContextMenuOption(1, arg12); + setScriptCallOnClickContextMenu(2053, -2147483644, new WidgetPointer(-32768,3), arg10, "iIc"); + } else { + setWidgetContextMenuOption(1, ""); + setScriptCallOnClickContextMenu(-1, ""); + } + return; +} diff --git a/dumps/scripts/205.cs2 b/dumps/scripts/205.cs2 new file mode 100644 index 000000000..9d9787ee4 --- /dev/null +++ b/dumps/scripts/205.cs2 @@ -0,0 +1,98 @@ +void script_205(int arg0) { + if ((bitconfig_8902 > 0) && (bitconfig_8902 < 13)) { + if (getWidgetSpriteId(new WidgetPointer(825,94)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,94)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,94)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,94)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,98)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,98)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,98)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,98)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,102)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,102)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,102)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,102)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,106)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,106)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,106)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,106)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,110)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,110)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,110)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,110)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,114)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,114)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,114)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,114)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,118)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,118)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,118)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,118)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,122)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,122)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,122)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,122)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,126)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,126)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,126)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,126)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,130)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,130)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,130)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,130)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,0)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,0)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,0)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,0)); + } + } + if (getWidgetSpriteId(new WidgetPointer(825,137)) == 5459) { + setWidgetSprite(5457, new WidgetPointer(825,137)); + } else { + if (getWidgetSpriteId(new WidgetPointer(825,137)) == 5458) { + setWidgetSprite(5455, new WidgetPointer(825,137)); + } + } + } + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 5456) { + setWidgetSprite(5458, new WidgetPointer(arg0)); + } + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 5455) { + setWidgetSprite(5458, new WidgetPointer(arg0)); + } + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 5457) { + setWidgetSprite(5459, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2050.cs2 b/dumps/scripts/2050.cs2 new file mode 100644 index 000000000..076a8fe1b --- /dev/null +++ b/dumps/scripts/2050.cs2 @@ -0,0 +1,9 @@ +void script_2050(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetHidden(1); + } else { + createExtraChild(new WidgetPointer(arg0), 5, arg1); + setWidgetHidden(1); + } + return; +} diff --git a/dumps/scripts/2051.cs2 b/dumps/scripts/2051.cs2 new file mode 100644 index 000000000..698e5ead9 --- /dev/null +++ b/dumps/scripts/2051.cs2 @@ -0,0 +1,9 @@ +void script_2051(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,string arg8,string arg9,string arg10) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + script_2052(arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + } else { + createExtraChild(new WidgetPointer(arg0), 4, arg1); + script_2052(arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + } + return; +} diff --git a/dumps/scripts/2052.cs2 b/dumps/scripts/2052.cs2 new file mode 100644 index 000000000..7efbbf877 --- /dev/null +++ b/dumps/scripts/2052.cs2 @@ -0,0 +1,18 @@ +void script_2052(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8) { + setWidgetHidden(0); + setWidgetSize(arg0, arg1, 0, 0); + setWidgetPosition(arg2, arg3, 1, 1); + setWidgetRGB(new Color(arg4)); + setWidgetFont(591); + setWidgetTextAlignment(1, 1, 13); + setWidgetText(arg6); + if (arg5 != -1) { + cs2method1305("" + arg7 + ""); + setWidgetContextMenuOption(1, arg8); + setScriptCallOnClickContextMenu(2053, -2147483644, new WidgetPointer(-32768,3), arg5, "iIc"); + } else { + setWidgetContextMenuOption(1, ""); + setScriptCallOnClickContextMenu(-1, ""); + } + return; +} diff --git a/dumps/scripts/2053.cs2 b/dumps/scripts/2053.cs2 new file mode 100644 index 000000000..1b08412c9 --- /dev/null +++ b/dumps/scripts/2053.cs2 @@ -0,0 +1,6 @@ +void script_2053(int arg0,int arg1,int arg2) { + if (((boolean)arg0)) { + setScriptCallOnGameloop(2054, add(getClientCycle(), 3), new WidgetPointer(arg1), arg2, "iIc", new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2054.cs2 b/dumps/scripts/2054.cs2 new file mode 100644 index 000000000..a19d002a8 --- /dev/null +++ b/dumps/scripts/2054.cs2 @@ -0,0 +1,7 @@ +void script_2054(int arg0,int arg1,int arg2) { + if (getClientCycle() >= arg0) { + cs2method5214(arg2); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2055.cs2 b/dumps/scripts/2055.cs2 new file mode 100644 index 000000000..71846825d --- /dev/null +++ b/dumps/scripts/2055.cs2 @@ -0,0 +1,3 @@ +string script_2055(int arg0) { + return intToStr(extractZ(arg0)) + "_" + intToStr(divide(extractX(arg0), 64)) + "_" + intToStr(divide(extractY(arg0), 64)) + "_" + intToStr(mod(extractX(arg0), 64)) + "_" + intToStr(mod(extractY(arg0), 64)); +} diff --git a/dumps/scripts/2056.cs2 b/dumps/scripts/2056.cs2 new file mode 100644 index 000000000..ceca33af5 --- /dev/null +++ b/dumps/scripts/2056.cs2 @@ -0,0 +1,11 @@ +void script_2056() { + int ivar0; + ivar0 = 20054023; + globalint_762 = cs2method_3408(105, 109, 208, rndExcl(getCommonDefinitionSize(208))); + if (globalint_762 != -1) { + setWidgetModel(globalint_762, new WidgetPointer(ivar0)); + } + setWidgetPosition(subtract(0, getWidgetActualWidth(new WidgetPointer(ivar0))), 120, 0, 0, new WidgetPointer(ivar0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,20)); + return; +} diff --git a/dumps/scripts/2057.cs2 b/dumps/scripts/2057.cs2 new file mode 100644 index 000000000..ba4fd159e --- /dev/null +++ b/dumps/scripts/2057.cs2 @@ -0,0 +1,4 @@ +void script_2057() { + script_2059(-1); + return; +} diff --git a/dumps/scripts/2058.cs2 b/dumps/scripts/2058.cs2 new file mode 100644 index 000000000..254eaa628 --- /dev/null +++ b/dumps/scripts/2058.cs2 @@ -0,0 +1,4 @@ +void script_2058(int arg0) { + script_2059(arg0); + return; +} diff --git a/dumps/scripts/2059.cs2 b/dumps/scripts/2059.cs2 new file mode 100644 index 000000000..f9ac775bd --- /dev/null +++ b/dumps/scripts/2059.cs2 @@ -0,0 +1,141 @@ +void script_2059(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + ivar1 = -1; + ivar2 = 0; + if (((boolean)script_1119())) { + ivar1 = cs2method_3408(105, 74, 728, bitconfig_357); + ivar2 = 1; + } else { + ivar1 = cs2method_3408(105, 74, 2162, bitconfig_357); + } + ivar3 = 0; + globalarray_0 = new int[4]; + switch (bitconfig_357) { + case 0: + ivar3 = bitconfig_5822; + globalarray_0[0] = bitconfig_6459; + globalarray_0[1] = bitconfig_6460; + globalarray_0[2] = bitconfig_6461; + globalarray_0[3] = bitconfig_6462; + break; + case 1: + ivar3 = bitconfig_5823; + globalarray_0[0] = bitconfig_6466; + globalarray_0[1] = 0; + globalarray_0[2] = 0; + globalarray_0[3] = bitconfig_6467; + break; + case 2: + ivar3 = bitconfig_5824; + globalarray_0[0] = bitconfig_6463; + globalarray_0[1] = 0; + globalarray_0[2] = bitconfig_6464; + globalarray_0[3] = bitconfig_6465; + break; + case 3: + ivar3 = bitconfig_7347; + globalarray_0[0] = bitconfig_7348; + globalarray_0[1] = bitconfig_7349; + globalarray_0[2] = bitconfig_7350; + globalarray_0[3] = bitconfig_7351; + } + if (arg0 != -1) { + if (ivar3 != arg0) { + playSoundEffect(5845, 1, 0); + } + ivar3 = arg0; + } + globalint_631 = ivar3; + ivar4 = cs2method_3408(105, 103, getOtherCommonData(ivar1, 662), ivar3); + ivar5 = getOtherCommonData(ivar1, 654); + ivar6 = getOtherCommonData(ivar1, 655); + ivar7 = getCommonDefinitionSize(ivar4); + ivar8 = 0; + ivar9 = 0; + ivar10 = -1; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = -1; + ivar15 = -1; + ivar16 = -1; + while (ivar9 < ivar7) { + ivar10 = cs2method_3408(105, 103, ivar4, ivar9); + if (ivar10 != -1) { + ivar8 = getCommonDefinitionSize(ivar10); + ivar11 = 0; + ivar13 = 0; + while (ivar11 < ivar8) { + ivar14 = ((int)cs2method_3408(105, 73, ivar10, ivar13)); + if (ivar14 != -1) { + ivar11 = add(ivar11, 1); + ivar15 = cs2method_3408(73, 105, 727, ivar14); + if (((ivar15 == -1) || ((boolean)globalarray_0[ivar15])) && (isMember() || ((boolean)cs2method_3408(73, 105, 743, ivar14)))) { + ivar12 = add(ivar12, 1); + setWidgetPosition(ivar6, ivar5, 0, 0, new WidgetPointer(ivar14)); + setWidgetIsHidden(false, new WidgetPointer(ivar14)); + ivar6 = add(ivar6, add(getOtherCommonData(ivar1, 657), getOtherCommonData(ivar1, 658))); + if (((boolean)mod(ivar12, getOtherCommonData(ivar1, 660)))) { + ivar5 = add(ivar5, add(getOtherCommonData(ivar1, 656), getOtherCommonData(ivar1, 659))); + ivar6 = getOtherCommonData(ivar1, 655); + } + ivar16 = cs2method_3408(73, 64, 209, ivar14); + if (ivar16 != -1) { + cs2method2308(ivar16, 36, new WidgetPointer(ivar14)); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar14)); + } + } + ivar13 = add(ivar13, 1); + if (ivar13 > 997) { + return; + } + } + } + ivar9 = add(ivar9, 1); + } + if (((boolean)ivar2)) { + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(getOtherCommonData(ivar1, 316))), add(add(ivar5, getOtherCommonData(ivar1, 656)), getOtherCommonData(ivar1, 654)), new WidgetPointer(getOtherCommonData(ivar1, 316))); + script_31(getOtherCommonData(ivar1, 684), getOtherCommonData(ivar1, 316), 792, 789, 790, 791, 773, 788); + } else { + if (setWidgetRegister(new WidgetPointer(getOtherCommonData(ivar1, 316)))) { + cs2method1100(0, 0); + deleteAllExtraChilds(new WidgetPointer(getOtherCommonData(ivar1, 684))); + } + } + ivar17 = getOtherCommonData(ivar1, 663); + ivar18 = 0; + if (ivar17 != -1) { + ivar18 = getCommonDefinitionSize(ivar17); + ivar13 = 0; + while (ivar13 < ivar18) { + if (ivar13 == ivar3) { + setWidgetSprite(1703, cs2method_3408(105, 73, ivar17, ivar13)); + } else { + setWidgetSprite(1701, cs2method_3408(105, 73, ivar17, ivar13)); + } + ivar13 = add(ivar13, 1); + } + } + script_1121(); + deleteAllExtraChilds(new WidgetPointer(getOtherCommonData(ivar1, 688))); + return; +} diff --git a/dumps/scripts/206.cs2 b/dumps/scripts/206.cs2 new file mode 100644 index 000000000..2559cce1b --- /dev/null +++ b/dumps/scripts/206.cs2 @@ -0,0 +1,110 @@ +void script_206() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar0; + string svar1; + ivar0 = 0; + ivar1 = 0; + ivar2 = -1; + svar0 = ""; + svar1 = ""; + ivar3 = getItemContainerLength(134); + globalarray_0 = new int[ivar3]; + globalarray_1 = new int[ivar3]; + ivar4 = 0; + ivar5 = 99; + ivar6 = 0; + while (ivar0 < ivar3) { + ivar2 = getItemIdInSlot(134, ivar0); + ivar1 = getItemAmtInSlot(134, ivar0); + if (ivar2 != -1) { + ivar5 = 99; + ivar6 = 0; + while (ivar6 < ivar3) { + if (globalarray_0[ivar6] != -1) { + if (globalarray_0[ivar6] == ivar2) { + ivar5 = ivar6; + ivar6 = ivar3; + } + ivar6 = add(ivar6, 1); + } else { + ivar6 = ivar3; + } + } + if (ivar5 == 99) { + globalarray_0[ivar4] = ivar2; + globalarray_0[ivar4] = ivar1; + ivar4 = add(ivar4, 1); + } else { + globalarray_0[ivar5] = add(globalarray_1[ivar5], ivar1); + } + } + ivar0 = add(ivar0, 1); + } + ivar4 = 0; + while (ivar4 < ivar3) { + ivar2 = globalarray_0[ivar4]; + if (ivar2 != -1) { + ivar1 = globalarray_1[ivar4]; + svar0 = concat(svar0, script_207(2, ivar1, ivar2)); + } else { + ivar4 = ivar3; + } + ivar4 = add(ivar4, 1); + } + ivar0 = 0; + ivar4 = 0; + while (ivar4 < ivar3) { + globalarray_0[ivar4] = -1; + globalarray_0[ivar4] = 0; + ivar4 = add(ivar4, 1); + } + ivar4 = 0; + ivar6 = 0; + while (ivar0 < ivar3) { + ivar2 = getItemIdInSlotSplit(134, ivar0); + ivar1 = getItemAmtInSlotSplit(134, ivar0); + if (ivar2 != -1) { + ivar5 = 99; + ivar6 = 0; + while (ivar6 < ivar3) { + if (globalarray_0[ivar6] != -1) { + if (globalarray_0[ivar6] == ivar2) { + ivar5 = ivar6; + ivar6 = ivar3; + } + ivar6 = add(ivar6, 1); + } else { + ivar6 = ivar3; + } + } + if (ivar5 == 99) { + globalarray_0[ivar4] = ivar2; + globalarray_0[ivar4] = ivar1; + ivar4 = add(ivar4, 1); + } else { + globalarray_0[ivar5] = add(globalarray_1[ivar5], ivar1); + } + } + ivar0 = add(ivar0, 1); + } + ivar4 = 0; + while (ivar4 < ivar3) { + ivar2 = globalarray_0[ivar4]; + if (ivar2 != -1) { + ivar1 = globalarray_1[ivar4]; + svar1 = concat(svar1, script_207(2, ivar1, ivar2)); + } else { + ivar4 = ivar3; + } + ivar4 = add(ivar4, 1); + } + setWidgetText(new WidgetPointer(626,36), svar0); + setWidgetText(new WidgetPointer(626,37), svar1); + return; +} diff --git a/dumps/scripts/2060.cs2 b/dumps/scripts/2060.cs2 new file mode 100644 index 000000000..aee935f5a --- /dev/null +++ b/dumps/scripts/2060.cs2 @@ -0,0 +1,17 @@ +void script_2060(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = cs2method_3408(105, 74, 2162, bitconfig_357); + ivar2 = cs2method_3408(73, 105, getOtherCommonData(ivar1, 664), arg0); + ivar3 = getOtherCommonData(ivar1, 661); + if (ivar3 != -1) { + script_41(ivar3); + } + if (ivar2 == globalint_631) { + setWidgetSprite(1703, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2061.cs2 b/dumps/scripts/2061.cs2 new file mode 100644 index 000000000..71c1f2011 --- /dev/null +++ b/dumps/scripts/2061.cs2 @@ -0,0 +1,17 @@ +void script_2061(int arg0) { + int ivar1; + int ivar2; + int ivar3; + string svar0; + ivar1 = cs2method_3408(105, 74, 2162, bitconfig_357); + ivar2 = cs2method_3408(73, 105, getOtherCommonData(ivar1, 664), arg0); + ivar3 = getOtherCommonData(ivar1, 661); + svar0 = cs2method_3408(105, 115, getOtherCommonData(ivar1, 665), ivar2); + if (ivar3 != -1) { + script_39(arg0, ivar3, 25, 300, svar0); + } + if (ivar2 != globalint_631) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2062.cs2 b/dumps/scripts/2062.cs2 new file mode 100644 index 000000000..8778eddda --- /dev/null +++ b/dumps/scripts/2062.cs2 @@ -0,0 +1,4 @@ +void script_2062() { + script_2064(-1); + return; +} diff --git a/dumps/scripts/2063.cs2 b/dumps/scripts/2063.cs2 new file mode 100644 index 000000000..025d7b797 --- /dev/null +++ b/dumps/scripts/2063.cs2 @@ -0,0 +1,4 @@ +void script_2063() { + script_2064(standart_config_153); + return; +} diff --git a/dumps/scripts/2064.cs2 b/dumps/scripts/2064.cs2 new file mode 100644 index 000000000..1057d02d7 --- /dev/null +++ b/dumps/scripts/2064.cs2 @@ -0,0 +1,85 @@ +void script_2064(int arg0) { + int ivar1; + setWidgetIsHidden(true, new WidgetPointer(138,28)); + setWidgetIsHidden(true, new WidgetPointer(138,37)); + setWidgetIsHidden(true, new WidgetPointer(138,36)); + setWidgetIsHidden(true, new WidgetPointer(138,31)); + setWidgetIsHidden(true, new WidgetPointer(138,39)); + setWidgetIsHidden(true, new WidgetPointer(138,38)); + setWidgetIsHidden(true, new WidgetPointer(138,35)); + setWidgetIsHidden(true, new WidgetPointer(138,34)); + setWidgetIsHidden(true, new WidgetPointer(138,33)); + setWidgetIsHidden(true, new WidgetPointer(138,32)); + setWidgetIsHidden(true, new WidgetPointer(138,29)); + setWidgetIsHidden(true, new WidgetPointer(138,30)); + setWidgetIsHidden(true, new WidgetPointer(138,41)); + setWidgetIsHidden(true, new WidgetPointer(138,40)); + ivar1 = 0; + if (bitconfig_5332 < 120) { + ivar1 = 1; + } + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(138,6)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(138,7)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(138,8)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(138,19)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(138,20)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(138,21)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(138,12)); + switch (arg0) { + case 0: + setWidgetIsHidden(false, new WidgetPointer(138,28)); + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(138,37)); + setWidgetAnimation(786, new WidgetPointer(138,37)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(138,36)); + setWidgetAnimation(786, new WidgetPointer(138,36)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(138,31)); + setWidgetAnimation(785, new WidgetPointer(138,31)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(138,39)); + setWidgetAnimation(785, new WidgetPointer(138,39)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(138,38)); + setWidgetAnimation(785, new WidgetPointer(138,38)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(138,35)); + setWidgetAnimation(785, new WidgetPointer(138,35)); + break; + case 7: + setWidgetIsHidden(false, new WidgetPointer(138,34)); + setWidgetAnimation(785, new WidgetPointer(138,34)); + break; + case 8: + setWidgetIsHidden(false, new WidgetPointer(138,32)); + setWidgetAnimation(785, new WidgetPointer(138,32)); + break; + case 9: + setWidgetIsHidden(false, new WidgetPointer(138,33)); + setWidgetAnimation(785, new WidgetPointer(138,33)); + break; + case 10: + setWidgetIsHidden(false, new WidgetPointer(138,29)); + setWidgetAnimation(785, new WidgetPointer(138,29)); + break; + case 11: + setWidgetIsHidden(false, new WidgetPointer(138,30)); + setWidgetAnimation(785, new WidgetPointer(138,30)); + break; + case 12: + setWidgetIsHidden(false, new WidgetPointer(138,41)); + setWidgetAnimation(786, new WidgetPointer(138,41)); + break; + case 13: + setWidgetIsHidden(false, new WidgetPointer(138,40)); + setWidgetAnimation(786, new WidgetPointer(138,40)); + } + return; +} diff --git a/dumps/scripts/2065.cs2 b/dumps/scripts/2065.cs2 new file mode 100644 index 000000000..5d4612f0e --- /dev/null +++ b/dumps/scripts/2065.cs2 @@ -0,0 +1,4 @@ +void script_2065(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_2070(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/2066.cs2 b/dumps/scripts/2066.cs2 new file mode 100644 index 000000000..00efcc5f7 --- /dev/null +++ b/dumps/scripts/2066.cs2 @@ -0,0 +1,4 @@ +void script_2066(int arg0,int arg1,int arg2,int arg3) { + script_2070(arg0, add(globalint_656, 1), arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/2067.cs2 b/dumps/scripts/2067.cs2 new file mode 100644 index 000000000..4411a701b --- /dev/null +++ b/dumps/scripts/2067.cs2 @@ -0,0 +1,4 @@ +void script_2067(int arg0,int arg1,int arg2,int arg3) { + script_2070(arg0, subtract(globalint_656, 1), arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/2068.cs2 b/dumps/scripts/2068.cs2 new file mode 100644 index 000000000..136b379e1 --- /dev/null +++ b/dumps/scripts/2068.cs2 @@ -0,0 +1,4 @@ +void script_2068(int arg0,int arg1,int arg2,int arg3) { + script_2070(arg0, 0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/2069.cs2 b/dumps/scripts/2069.cs2 new file mode 100644 index 000000000..096c7b203 --- /dev/null +++ b/dumps/scripts/2069.cs2 @@ -0,0 +1,4 @@ +void script_2069(int arg0,int arg1,int arg2,int arg3) { + script_2070(arg0, subtract(globalint_657, 1), arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/207.cs2 b/dumps/scripts/207.cs2 new file mode 100644 index 000000000..fd8c0a08b --- /dev/null +++ b/dumps/scripts/207.cs2 @@ -0,0 +1,23 @@ +string script_207(int arg0,int arg1,int arg2) { + string svar0; + string svar1; + string svar2; + svar0 = ""; + svar1 = ""; + svar2 = ""; + if (itemIsStackable(arg2)) { + svar2 = concat(svar2, "" + getItemName(arg2) + " " + "" + "x " + "" + intToStr(arg1) + "
"); + } else if (arg1 < 100000) { + svar0 = formatNumber(arg1, 1); + svar2 = concat(svar2, "" + getItemName(arg2) + "" + " x " + "" + svar0 + "
"); + } else if (arg1 < 10000000) { + svar0 = formatNumber(arg1, 1); + svar1 = formatNumber(divide(arg1, 1000), 1); + svar2 = concat(svar2, "" + getItemName(arg2) + "" + " x " + "" + svar1 + "K (" + svar0 + ")" + "
"); + } else { + svar0 = formatNumber(arg1, 1); + svar1 = formatNumber(divide(arg1, 1000000), 1); + svar2 = concat(svar2, "" + getItemName(arg2) + "" + " x " + "" + svar1 + "M (" + svar0 + ")" + "
"); + } + return svar2; +} diff --git a/dumps/scripts/2070.cs2 b/dumps/scripts/2070.cs2 new file mode 100644 index 000000000..3f10195ff --- /dev/null +++ b/dumps/scripts/2070.cs2 @@ -0,0 +1,12 @@ +void script_2070(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (arg0 != 1) { + return; + } + if ((arg1 >= globalint_657) || (arg1 < 0)) { + return; + } + globalint_656 = arg1; + playSoundEffect2False(3550, 1, 0, 100); + script_1439(arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/2071.cs2 b/dumps/scripts/2071.cs2 new file mode 100644 index 000000000..123c0f9d5 --- /dev/null +++ b/dumps/scripts/2071.cs2 @@ -0,0 +1,30 @@ +cs2func_script_2071_struct(2,0,0) script_2071(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 8); + cs2method5405(1, 8); + cs2method5406(0, 0, 30756001, 1845, 30756002, 1845, 0); + cs2method5406(1, 0, 30903456, 890, 30903456, 890, 0); + cs2method5406(0, 1, 30821543, 1710, 30870697, 1710, 0); + cs2method5406(1, 1, 30903456, 890, 30903456, 890, 0); + script_1899(0, 300, 300); + cs2method5406(0, 2, 30985384, 1620, 31018151, 1620, 0); + cs2method5406(1, 2, 30903456, 890, 30903456, 890, 0); + script_1899(1, 300, 300); + cs2method5406(0, 3, 31067299, 1522, 31083680, 1522, 0); + cs2method5406(1, 3, 30903456, 890, 30903456, 890, 0); + script_1899(2, 400, 400); + cs2method5406(0, 4, 31067292, 1470, 31050906, 1470, 0); + cs2method5406(1, 4, 30903456, 890, 30903456, 890, 0); + script_1899(3, 300, 300); + cs2method5406(0, 5, 30936215, 1450, 30870679, 1450, 0); + cs2method5406(1, 5, 30903456, 890, 30903456, 890, 0); + script_1899(4, 300, 300); + cs2method5406(0, 6, 30821529, 1445, 30788762, 1445, 0); + cs2method5406(1, 6, 30903456, 890, 30903456, 890, 0); + script_1899(5, 300, 300); + cs2method5406(0, 7, 30756001, 1450, 30756002, 1450, 0); + cs2method5406(1, 7, 30903456, 890, 30903456, 890, 0); + script_1899(6, 300, 300); + } + return newstruct cs2func_script_2071_struct(30821543, 1250324); +} diff --git a/dumps/scripts/2072.cs2 b/dumps/scripts/2072.cs2 new file mode 100644 index 000000000..46a3b812b --- /dev/null +++ b/dumps/scripts/2072.cs2 @@ -0,0 +1,4 @@ +void script_2072() { + setWidgetText(new WidgetPointer(276,59), "Zeal: " + intToStr(bitconfig_5827)); + return; +} diff --git a/dumps/scripts/2073.cs2 b/dumps/scripts/2073.cs2 new file mode 100644 index 000000000..efeded142 --- /dev/null +++ b/dumps/scripts/2073.cs2 @@ -0,0 +1,25 @@ +void script_2073(int arg0) { + switch (arg0) { + case 18087988: + case 18087940: + setWidgetIsHidden(false, new WidgetPointer(276,79)); + setWidgetIsHidden(true, new WidgetPointer(276,80)); + setWidgetIsHidden(true, new WidgetPointer(276,78)); + break; + case 18087957: + case 18087987: + setWidgetIsHidden(true, new WidgetPointer(276,79)); + setWidgetIsHidden(true, new WidgetPointer(276,80)); + setWidgetIsHidden(false, new WidgetPointer(276,78)); + break; + case 18087958: + case 18087941: + setWidgetIsHidden(true, new WidgetPointer(276,79)); + setWidgetIsHidden(false, new WidgetPointer(276,80)); + setWidgetIsHidden(true, new WidgetPointer(276,78)); + break; + default: + return; + } + return; +} diff --git a/dumps/scripts/2074.cs2 b/dumps/scripts/2074.cs2 new file mode 100644 index 000000000..e311060f6 --- /dev/null +++ b/dumps/scripts/2074.cs2 @@ -0,0 +1,8 @@ +void script_2074() { + if (((boolean)globalint_632)) { + setWidgetText(new WidgetPointer(837,8), "Players needed"); + } else { + setWidgetText(new WidgetPointer(837,8), "Players in game"); + } + return; +} diff --git a/dumps/scripts/2075.cs2 b/dumps/scripts/2075.cs2 new file mode 100644 index 000000000..52c5475dc --- /dev/null +++ b/dumps/scripts/2075.cs2 @@ -0,0 +1,15 @@ +void script_2075() { + int ivar0; + ivar0 = 0; + if (((boolean)globalint_632)) { + if (subtract(10, globalint_633) > 0) { + ivar0 = subtract(10, globalint_633); + } else { + ivar0 = 0; + } + setWidgetText(new WidgetPointer(837,3), intToStr(ivar0)); + } else { + setWidgetText(new WidgetPointer(837,3), intToStr(globalint_637)); + } + return; +} diff --git a/dumps/scripts/2076.cs2 b/dumps/scripts/2076.cs2 new file mode 100644 index 000000000..7b80e8679 --- /dev/null +++ b/dumps/scripts/2076.cs2 @@ -0,0 +1,15 @@ +void script_2076() { + int ivar0; + ivar0 = 0; + if (((boolean)globalint_632)) { + if (subtract(10, globalint_634) > 0) { + ivar0 = subtract(10, globalint_634); + } else { + ivar0 = 0; + } + setWidgetText(new WidgetPointer(837,5), intToStr(ivar0)); + } else { + setWidgetText(new WidgetPointer(837,5), intToStr(globalint_638)); + } + return; +} diff --git a/dumps/scripts/2077.cs2 b/dumps/scripts/2077.cs2 new file mode 100644 index 000000000..eaa9bd214 --- /dev/null +++ b/dumps/scripts/2077.cs2 @@ -0,0 +1,19 @@ +void script_2077() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (((boolean)globalint_632)) { + ivar0 = subtract(3, globalint_635); + if (((boolean)ivar0)) { + setWidgetText(new WidgetPointer(837,9), "New game: " + intToStr(ivar0) + " min"); + } else { + setWidgetText(new WidgetPointer(837,9), "New game: " + intToStr(ivar0) + " mins"); + } + } else { + ivar1 = subtract(20, globalint_636); + ivar0 = add(ivar1, 3); + setWidgetText(new WidgetPointer(837,9), "New game: " + intToStr(ivar0) + " mins"); + } + return; +} diff --git a/dumps/scripts/2078.cs2 b/dumps/scripts/2078.cs2 new file mode 100644 index 000000000..89965c424 --- /dev/null +++ b/dumps/scripts/2078.cs2 @@ -0,0 +1,11 @@ +void script_2078() { + int ivar0; + ivar0 = 0; + ivar0 = subtract(20, globalint_636); + if (((boolean)ivar0)) { + setWidgetText(new WidgetPointer(836,27), intToStr(ivar0) + " min"); + } else { + setWidgetText(new WidgetPointer(836,27), intToStr(ivar0) + " mins"); + } + return; +} diff --git a/dumps/scripts/2079.cs2 b/dumps/scripts/2079.cs2 new file mode 100644 index 000000000..d59869216 --- /dev/null +++ b/dumps/scripts/2079.cs2 @@ -0,0 +1,4 @@ +void script_2079() { + setWidgetText(new WidgetPointer(836,9), intToStr(globalint_643)); + return; +} diff --git a/dumps/scripts/208.cs2 b/dumps/scripts/208.cs2 new file mode 100644 index 000000000..b7e05e255 --- /dev/null +++ b/dumps/scripts/208.cs2 @@ -0,0 +1,3 @@ +int script_208() { + return 0; +} diff --git a/dumps/scripts/2080.cs2 b/dumps/scripts/2080.cs2 new file mode 100644 index 000000000..9e2413299 --- /dev/null +++ b/dumps/scripts/2080.cs2 @@ -0,0 +1,4 @@ +void script_2080() { + setWidgetText(new WidgetPointer(836,13), intToStr(globalint_644)); + return; +} diff --git a/dumps/scripts/2081.cs2 b/dumps/scripts/2081.cs2 new file mode 100644 index 000000000..4e465b515 --- /dev/null +++ b/dumps/scripts/2081.cs2 @@ -0,0 +1,8 @@ +void script_2081() { + if (globalint_639 > 0) { + setWidgetText(new WidgetPointer(836,10), intToStr(globalint_641)); + } else { + setWidgetText(new WidgetPointer(836,10), "---"); + } + return; +} diff --git a/dumps/scripts/2082.cs2 b/dumps/scripts/2082.cs2 new file mode 100644 index 000000000..ae4a2727b --- /dev/null +++ b/dumps/scripts/2082.cs2 @@ -0,0 +1,8 @@ +void script_2082() { + if (globalint_640 > 0) { + setWidgetText(new WidgetPointer(836,14), intToStr(globalint_642)); + } else { + setWidgetText(new WidgetPointer(836,14), "---"); + } + return; +} diff --git a/dumps/scripts/2083.cs2 b/dumps/scripts/2083.cs2 new file mode 100644 index 000000000..d2bbf944f --- /dev/null +++ b/dumps/scripts/2083.cs2 @@ -0,0 +1,8 @@ +void script_2083() { + if (globalint_639 > 0) { + setWidgetText(new WidgetPointer(836,11), intToStr(globalint_639) + "%"); + } else { + setWidgetText(new WidgetPointer(836,11), "---"); + } + return; +} diff --git a/dumps/scripts/2084.cs2 b/dumps/scripts/2084.cs2 new file mode 100644 index 000000000..0141a31e2 --- /dev/null +++ b/dumps/scripts/2084.cs2 @@ -0,0 +1,8 @@ +void script_2084() { + if (globalint_640 > 0) { + setWidgetText(new WidgetPointer(836,15), intToStr(globalint_640) + "%"); + } else { + setWidgetText(new WidgetPointer(836,15), "---"); + } + return; +} diff --git a/dumps/scripts/2085.cs2 b/dumps/scripts/2085.cs2 new file mode 100644 index 000000000..7d6ef87b7 --- /dev/null +++ b/dumps/scripts/2085.cs2 @@ -0,0 +1,10 @@ +void script_2085() { + if (globalint_645 <= 5) { + setWidgetRGB(new Color(51, 102, 255), new WidgetPointer(836,29)); + } else if (globalint_645 >= 25) { + setWidgetRGB(new Color(225, 35, 35), new WidgetPointer(836,29)); + } else { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(836,29)); + } + return; +} diff --git a/dumps/scripts/2086.cs2 b/dumps/scripts/2086.cs2 new file mode 100644 index 000000000..860edb322 --- /dev/null +++ b/dumps/scripts/2086.cs2 @@ -0,0 +1,10 @@ +void script_2086() { + if (globalint_647 <= 5) { + setWidgetRGB(new Color(51, 102, 255), new WidgetPointer(836,31)); + } else if (globalint_647 >= 25) { + setWidgetRGB(new Color(225, 35, 35), new WidgetPointer(836,31)); + } else { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(836,31)); + } + return; +} diff --git a/dumps/scripts/2087.cs2 b/dumps/scripts/2087.cs2 new file mode 100644 index 000000000..7145f38d5 --- /dev/null +++ b/dumps/scripts/2087.cs2 @@ -0,0 +1,10 @@ +void script_2087() { + if (globalint_649 <= 5) { + setWidgetRGB(new Color(51, 102, 255), new WidgetPointer(836,30)); + } else if (globalint_649 >= 25) { + setWidgetRGB(new Color(225, 35, 35), new WidgetPointer(836,30)); + } else { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(836,30)); + } + return; +} diff --git a/dumps/scripts/2088.cs2 b/dumps/scripts/2088.cs2 new file mode 100644 index 000000000..422881358 --- /dev/null +++ b/dumps/scripts/2088.cs2 @@ -0,0 +1,18 @@ +void script_2088() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + ivar0 = cs2method_3408(105, 105, 723, globalint_645); + ivar1 = cs2method_3408(105, 105, 2196, globalint_645); + if (globalint_645 < 15) { + setWidgetRGB(new Color(51, 102, 255), new WidgetPointer(836,5)); + } else if (globalint_645 > 15) { + setWidgetRGB(new Color(225, 35, 35), new WidgetPointer(836,5)); + } else { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(836,5)); + } + setWidgetPosition(ivar0, 66, 2, 0, new WidgetPointer(836,5)); + setWidgetSize(ivar1, 8, 0, 0, new WidgetPointer(836,5)); + return; +} diff --git a/dumps/scripts/2089.cs2 b/dumps/scripts/2089.cs2 new file mode 100644 index 000000000..abebd87ef --- /dev/null +++ b/dumps/scripts/2089.cs2 @@ -0,0 +1,18 @@ +void script_2089() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + ivar0 = cs2method_3408(105, 105, 723, globalint_647); + ivar1 = cs2method_3408(105, 105, 2196, globalint_647); + if (globalint_647 < 15) { + setWidgetRGB(new Color(51, 102, 255), new WidgetPointer(836,68)); + } else if (globalint_647 > 15) { + setWidgetRGB(new Color(225, 35, 35), new WidgetPointer(836,68)); + } else { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(836,68)); + } + setWidgetPosition(ivar0, 66, 2, 0, new WidgetPointer(836,68)); + setWidgetSize(ivar1, 8, 0, 0, new WidgetPointer(836,68)); + return; +} diff --git a/dumps/scripts/209.cs2 b/dumps/scripts/209.cs2 new file mode 100644 index 000000000..05b13745c --- /dev/null +++ b/dumps/scripts/209.cs2 @@ -0,0 +1,22 @@ +void script_209() { + if (bitconfig_6101 < 8) { + setWidgetSprite(1785, new WidgetPointer(591,10)); + } else if (bitconfig_6101 < 15) { + setWidgetSprite(1786, new WidgetPointer(591,10)); + } else if (bitconfig_6101 < 23) { + setWidgetSprite(1787, new WidgetPointer(591,10)); + } else if (bitconfig_6101 < 30) { + setWidgetSprite(1788, new WidgetPointer(591,10)); + } else if (bitconfig_6101 < 38) { + setWidgetSprite(1789, new WidgetPointer(591,10)); + } else if (bitconfig_6101 < 45) { + setWidgetSprite(1790, new WidgetPointer(591,10)); + } else if (bitconfig_6101 < 53) { + setWidgetSprite(1791, new WidgetPointer(591,10)); + } else if (bitconfig_6101 < 60) { + setWidgetSprite(1792, new WidgetPointer(591,10)); + } else { + setWidgetSprite(1793, new WidgetPointer(591,10)); + } + return; +} diff --git a/dumps/scripts/2090.cs2 b/dumps/scripts/2090.cs2 new file mode 100644 index 000000000..201a98ea9 --- /dev/null +++ b/dumps/scripts/2090.cs2 @@ -0,0 +1,18 @@ +void script_2090() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + ivar0 = cs2method_3408(105, 105, 723, globalint_649); + ivar1 = cs2method_3408(105, 105, 2196, globalint_649); + if (globalint_649 < 15) { + setWidgetRGB(new Color(51, 102, 255), new WidgetPointer(836,61)); + } else if (globalint_649 > 15) { + setWidgetRGB(new Color(225, 35, 35), new WidgetPointer(836,61)); + } else { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(836,61)); + } + setWidgetPosition(ivar0, 66, 2, 0, new WidgetPointer(836,61)); + setWidgetSize(ivar1, 8, 0, 0, new WidgetPointer(836,61)); + return; +} diff --git a/dumps/scripts/2091.cs2 b/dumps/scripts/2091.cs2 new file mode 100644 index 000000000..2fe12d753 --- /dev/null +++ b/dumps/scripts/2091.cs2 @@ -0,0 +1,59 @@ +void script_2091(int arg0,int arg1) { + string svar0; + svar0 = ""; + if (((boolean)bitconfig_5835)) { + return; + } + switch (arg0) { + case 54788124: + case 54788105: + case 54788109: + svar0 = "The number of times that the avatar has been killed."; + break; + case 54788121: + case 54788106: + case 54788110: + svar0 = "The Slayer level required to attack each avatar."; + break; + case 54788120: + case 54788107: + case 54788111: + svar0 = "The remaining health of each avatar."; + break; + case 54788122: + case 54788123: + svar0 = "How much time the game has remaining."; + break; + case 54788104: + svar0 = "This column displays the blue team's statistics."; + break; + case 54788108: + svar0 = "This column displays the red team's statistics."; + break; + case 54788125: + svar0 = "Shows which team controls the soul obelisk."; + break; + case 54788126: + svar0 = "Shows which team controls the western graveyard."; + break; + case 54788127: + svar0 = "Shows which team controls the eastern graveyard."; + break; + case 54788102: + svar0 = "Shows how much control a team has over the soul obelisk."; + break; + case 54788165: + svar0 = "Shows how much control a team has over the eastern graveyard."; + break; + case 54788158: + svar0 = "Shows how much control a team has over the western graveyard."; + break; + case 54788152: + svar0 = "Shows how active you have been during the game."; + break; + default: + return; + } + script_39(arg0, arg1, 25, getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg1)))), svar0); + return; +} diff --git a/dumps/scripts/2092.cs2 b/dumps/scripts/2092.cs2 new file mode 100644 index 000000000..01b26ab1a --- /dev/null +++ b/dumps/scripts/2092.cs2 @@ -0,0 +1,5 @@ +void script_2092(int arg0) { + script_41(arg0); + globalint_655 = 0; + return; +} diff --git a/dumps/scripts/2093.cs2 b/dumps/scripts/2093.cs2 new file mode 100644 index 000000000..fbaf20f68 --- /dev/null +++ b/dumps/scripts/2093.cs2 @@ -0,0 +1,13 @@ +void script_2093() { + if (globalint_654 < 100) { + globalint_654 = add(globalint_654, 1); + } + if (globalint_654 == 50) { + setWidgetIsHidden(true, new WidgetPointer(834,60)); + } + if (globalint_654 == 100) { + setWidgetIsHidden(false, new WidgetPointer(834,60)); + globalint_654 = 0; + } + return; +} diff --git a/dumps/scripts/2094.cs2 b/dumps/scripts/2094.cs2 new file mode 100644 index 000000000..d9598e2f2 --- /dev/null +++ b/dumps/scripts/2094.cs2 @@ -0,0 +1,13 @@ +void script_2094() { + if (globalint_654 < 100) { + globalint_654 = add(globalint_654, 1); + } + if (globalint_654 == 50) { + setWidgetIsHidden(true, new WidgetPointer(834,56)); + } + if (globalint_654 == 100) { + setWidgetIsHidden(false, new WidgetPointer(834,56)); + globalint_654 = 0; + } + return; +} diff --git a/dumps/scripts/2095.cs2 b/dumps/scripts/2095.cs2 new file mode 100644 index 000000000..a1bb046d6 --- /dev/null +++ b/dumps/scripts/2095.cs2 @@ -0,0 +1,17 @@ +void script_2095() { + if (globalint_654 < 100) { + globalint_654 = add(globalint_654, 1); + } + if (globalint_654 == 50) { + setWidgetIsHidden(true, new WidgetPointer(834,48)); + setWidgetIsHidden(true, new WidgetPointer(834,52)); + setWidgetIsHidden(true, new WidgetPointer(834,56)); + } + if (globalint_654 == 100) { + setWidgetIsHidden(false, new WidgetPointer(834,48)); + setWidgetIsHidden(false, new WidgetPointer(834,52)); + setWidgetIsHidden(false, new WidgetPointer(834,56)); + globalint_654 = 0; + } + return; +} diff --git a/dumps/scripts/2096.cs2 b/dumps/scripts/2096.cs2 new file mode 100644 index 000000000..5f26110e0 --- /dev/null +++ b/dumps/scripts/2096.cs2 @@ -0,0 +1,13 @@ +void script_2096() { + if (globalint_654 < 100) { + globalint_654 = add(globalint_654, 1); + } + if (globalint_654 == 50) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(834,13)); + } + if (globalint_654 == 100) { + setWidgetRGB(new Color(255, 35, 35), new WidgetPointer(834,13)); + globalint_654 = 0; + } + return; +} diff --git a/dumps/scripts/2097.cs2 b/dumps/scripts/2097.cs2 new file mode 100644 index 000000000..7d14a548a --- /dev/null +++ b/dumps/scripts/2097.cs2 @@ -0,0 +1,8 @@ +void script_2097() { + if (globalint_645 <= 5) { + setWidgetRGB(new Color(51, 102, 255), new WidgetPointer(834,28)); + } else { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(834,28)); + } + return; +} diff --git a/dumps/scripts/2098.cs2 b/dumps/scripts/2098.cs2 new file mode 100644 index 000000000..51893ee71 --- /dev/null +++ b/dumps/scripts/2098.cs2 @@ -0,0 +1,4 @@ +void script_2098() { + setWidgetText(new WidgetPointer(834,13), intToStr(globalint_642)); + return; +} diff --git a/dumps/scripts/2099.cs2 b/dumps/scripts/2099.cs2 new file mode 100644 index 000000000..75a6344b2 --- /dev/null +++ b/dumps/scripts/2099.cs2 @@ -0,0 +1,18 @@ +void script_2099() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + ivar0 = cs2method_3408(105, 105, 723, globalint_645); + ivar1 = cs2method_3408(105, 105, 2196, globalint_645); + if (globalint_645 < 15) { + setWidgetRGB(new Color(51, 102, 255), new WidgetPointer(834,5)); + } else if (globalint_645 > 15) { + setWidgetRGB(new Color(225, 35, 35), new WidgetPointer(834,5)); + } else { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(834,5)); + } + setWidgetPosition(ivar0, 66, 2, 0, new WidgetPointer(834,5)); + setWidgetSize(ivar1, 8, 0, 0, new WidgetPointer(834,5)); + return; +} diff --git a/dumps/scripts/21.cs2 b/dumps/scripts/21.cs2 new file mode 100644 index 000000000..eb0f664e4 --- /dev/null +++ b/dumps/scripts/21.cs2 @@ -0,0 +1,35 @@ +void script_21(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12) { + if (((getSkillCurrentLvl(6) < arg3) && (((boolean)arg4) || (getSkillActualLvl(6) < arg3))) && (((boolean)bitconfig_9071) || ((((arg0 != 28180504) && (arg0 != 28180507)) && ((arg0 != 28180513) && (arg0 != 28180525))) && (arg0 != 28180522)))) { + if (((boolean)bitconfig_4089)) { + if ((standart_config_1092 < arg3) || ((boolean)cs2method_3408(73, 105, 1061, arg0))) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + } else { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + } + if ((arg5 != -1) && (script_19(arg5, arg0) < arg6)) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + if ((arg7 != -1) && (script_19(arg7, arg0) < arg8)) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + if ((arg9 != -1) && (script_19(arg9, arg0) < arg10)) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + if ((arg11 != -1) && (script_19(arg11, arg0) < arg12)) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + if ((arg0 == 12582939) && isMember()) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + setWidgetSprite(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/210.cs2 b/dumps/scripts/210.cs2 new file mode 100644 index 000000000..1fc617052 --- /dev/null +++ b/dumps/scripts/210.cs2 @@ -0,0 +1,22 @@ +void script_210() { + if (bitconfig_6101 < 8) { + setWidgetSprite(1785, new WidgetPointer(381,16)); + } else if (bitconfig_6101 < 15) { + setWidgetSprite(1786, new WidgetPointer(381,16)); + } else if (bitconfig_6101 < 23) { + setWidgetSprite(1787, new WidgetPointer(381,16)); + } else if (bitconfig_6101 < 30) { + setWidgetSprite(1788, new WidgetPointer(381,16)); + } else if (bitconfig_6101 < 38) { + setWidgetSprite(1789, new WidgetPointer(381,16)); + } else if (bitconfig_6101 < 45) { + setWidgetSprite(1790, new WidgetPointer(381,16)); + } else if (bitconfig_6101 < 53) { + setWidgetSprite(1791, new WidgetPointer(381,16)); + } else if (bitconfig_6101 < 60) { + setWidgetSprite(1792, new WidgetPointer(381,16)); + } else { + setWidgetSprite(1793, new WidgetPointer(381,16)); + } + return; +} diff --git a/dumps/scripts/2100.cs2 b/dumps/scripts/2100.cs2 new file mode 100644 index 000000000..5a67dc930 --- /dev/null +++ b/dumps/scripts/2100.cs2 @@ -0,0 +1,50 @@ +void script_2100(int arg0,int arg1) { + string svar0; + svar0 = ""; + switch (arg0) { + case 54657051: + case 54657036: + case 54657032: + svar0 = "The number of times that the avatar has been killed."; + break; + case 54657048: + case 54657037: + case 54657033: + svar0 = "The Slayer level required to attack each avatar."; + break; + case 54657047: + case 54657038: + case 54657034: + svar0 = "The remaining health of each avatar."; + break; + case 54657049: + case 54657050: + svar0 = "How much time the game has remaining."; + break; + case 54657031: + svar0 = "This column displays the blue team's statistics."; + break; + case 54657035: + svar0 = "This column displays the red team's statistics."; + break; + case 54657052: + svar0 = "Shows which team controls the soul obelisk."; + break; + case 54657053: + svar0 = "Shows which team controls the western graveyard."; + break; + case 54657054: + svar0 = "Shows which team controls the eastern graveyard."; + break; + case 54657092: + svar0 = "Shows how much control a team has over the soul obelisk."; + break; + case 54657098: + svar0 = "Shows how active you have been during the game."; + break; + default: + return; + } + script_39(arg0, arg1, 25, getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg1)))), svar0); + return; +} diff --git a/dumps/scripts/2101.cs2 b/dumps/scripts/2101.cs2 new file mode 100644 index 000000000..5f3add148 --- /dev/null +++ b/dumps/scripts/2101.cs2 @@ -0,0 +1,4 @@ +void script_2101(int arg0) { + setItemOnWidgetMethod2200(standart_config_856, 1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2102.cs2 b/dumps/scripts/2102.cs2 new file mode 100644 index 000000000..365dd4acb --- /dev/null +++ b/dumps/scripts/2102.cs2 @@ -0,0 +1,9 @@ +void script_2102() { + int ivar0; + script_31(19464198, 19464196, 798, 795, 796, 797, 793, 794); + ivar0 = add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(297,7)), 495, getWidgetText(new WidgetPointer(297,7))), 12), 5); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(297,7)), ivar0, 0, 0, new WidgetPointer(297,7)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(297,49)), add(add(getWidgetActualY(new WidgetPointer(297,7)), ivar0), 5), 0, 0, new WidgetPointer(297,49)); + script_2104(0); + return; +} diff --git a/dumps/scripts/2103.cs2 b/dumps/scripts/2103.cs2 new file mode 100644 index 000000000..809eed8c1 --- /dev/null +++ b/dumps/scripts/2103.cs2 @@ -0,0 +1,4 @@ +void script_2103(int arg0) { + script_2104(arg0); + return; +} diff --git a/dumps/scripts/2104.cs2 b/dumps/scripts/2104.cs2 new file mode 100644 index 000000000..b0d126943 --- /dev/null +++ b/dumps/scripts/2104.cs2 @@ -0,0 +1,10 @@ +void script_2104(int arg0) { + if (((boolean)arg0)) { + setWidgetIsHidden(false, new WidgetPointer(297,23)); + setWidgetIsHidden(true, new WidgetPointer(297,9)); + } else { + setWidgetIsHidden(true, new WidgetPointer(297,23)); + setWidgetIsHidden(false, new WidgetPointer(297,9)); + } + return; +} diff --git a/dumps/scripts/2105.cs2 b/dumps/scripts/2105.cs2 new file mode 100644 index 000000000..13bad0e26 --- /dev/null +++ b/dumps/scripts/2105.cs2 @@ -0,0 +1,4 @@ +void script_2105(int arg0,int arg1) { + setScriptCallOnGameloop(2106, new WidgetPointer(arg0), new WidgetPointer(arg1), getWidgetActualX(new WidgetPointer(arg1)), getWidgetActualY(new WidgetPointer(arg1)), 0, 0, "IIiiii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2106.cs2 b/dumps/scripts/2106.cs2 new file mode 100644 index 000000000..3de196ca8 --- /dev/null +++ b/dumps/scripts/2106.cs2 @@ -0,0 +1,7 @@ +void script_2106(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + arg4 = max(min(subtract(add(arg4, rnd(1)), rnd(1)), 5), -5); + arg5 = max(min(subtract(add(arg5, rnd(1)), rnd(1)), 5), -5); + setWidgetPosition(add(arg2, arg4), add(arg3, arg5), 0, 0, new WidgetPointer(arg1)); + setScriptCallOnGameloop(2106, new WidgetPointer(arg0), new WidgetPointer(arg1), arg2, arg3, arg4, arg5, "IIiiii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2107.cs2 b/dumps/scripts/2107.cs2 new file mode 100644 index 000000000..fc8be3584 --- /dev/null +++ b/dumps/scripts/2107.cs2 @@ -0,0 +1,7 @@ +void script_2107(int arg0,int arg1,int arg2,int arg3) { + setWidgetModel(7753, new WidgetPointer(arg0)); + setWidgetModel(7752, new WidgetPointer(arg1)); + setWidgetModel(20104, new WidgetPointer(arg2)); + setWidgetModel(7751, new WidgetPointer(arg3)); + return; +} diff --git a/dumps/scripts/2108.cs2 b/dumps/scripts/2108.cs2 new file mode 100644 index 000000000..e56e5a7e5 --- /dev/null +++ b/dumps/scripts/2108.cs2 @@ -0,0 +1,4 @@ +void script_2108(int arg0,int arg1,int arg2,int arg3) { + script_2112(arg0, arg1, arg2, arg3, bitconfig_693, bitconfig_5851); + return; +} diff --git a/dumps/scripts/2109.cs2 b/dumps/scripts/2109.cs2 new file mode 100644 index 000000000..e8a1385a4 --- /dev/null +++ b/dumps/scripts/2109.cs2 @@ -0,0 +1,4 @@ +void script_2109(int arg0,int arg1,int arg2,int arg3) { + script_2112(arg0, arg1, arg2, arg3, bitconfig_694, bitconfig_5852); + return; +} diff --git a/dumps/scripts/211.cs2 b/dumps/scripts/211.cs2 new file mode 100644 index 000000000..705d6a32f --- /dev/null +++ b/dumps/scripts/211.cs2 @@ -0,0 +1,7 @@ +void script_211() { + if (standart_config_448 == -1) { + script_656(); + } + script_606(); + return; +} diff --git a/dumps/scripts/2110.cs2 b/dumps/scripts/2110.cs2 new file mode 100644 index 000000000..0135ee0c1 --- /dev/null +++ b/dumps/scripts/2110.cs2 @@ -0,0 +1,4 @@ +void script_2110(int arg0,int arg1,int arg2,int arg3) { + script_2112(arg0, arg1, arg2, arg3, bitconfig_695, bitconfig_5853); + return; +} diff --git a/dumps/scripts/2111.cs2 b/dumps/scripts/2111.cs2 new file mode 100644 index 000000000..36f7a768e --- /dev/null +++ b/dumps/scripts/2111.cs2 @@ -0,0 +1,22 @@ +void script_2111(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + if (arg0 != 1) { + return; + } + ivar7 = 0; + ivar8 = 0; + playSoundEffect(4911, 1, 0); + if (((boolean)arg1)) { + ivar7 = script_686(mod(add(bitconfig_693, arg2), 4), 4); + ivar8 = bitconfig_5851; + } else if (arg1 == 2) { + ivar7 = script_686(mod(add(bitconfig_694, arg2), 4), 4); + ivar8 = bitconfig_5852; + } else { + ivar7 = script_686(mod(add(bitconfig_695, arg2), 4), 4); + ivar8 = bitconfig_5853; + } + script_2112(arg3, arg4, arg5, arg6, ivar7, ivar8); + return; +} diff --git a/dumps/scripts/2112.cs2 b/dumps/scripts/2112.cs2 new file mode 100644 index 000000000..3aa294cce --- /dev/null +++ b/dumps/scripts/2112.cs2 @@ -0,0 +1,32 @@ +void script_2112(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidget3DRotation(0, 0, getWidgetRotateX(new WidgetPointer(arg0)), getWidgetRotateY(new WidgetPointer(arg0)), cs2method2607(new WidgetPointer(arg0)), add(add(395, arg5), arg5), new WidgetPointer(arg0)); + setWidget3DRotation(0, 0, getWidgetRotateX(new WidgetPointer(arg1)), getWidgetRotateY(new WidgetPointer(arg1)), cs2method2607(new WidgetPointer(arg1)), add(add(395, arg5), arg5), new WidgetPointer(arg1)); + setWidget3DRotation(0, 0, getWidgetRotateX(new WidgetPointer(arg2)), getWidgetRotateY(new WidgetPointer(arg2)), cs2method2607(new WidgetPointer(arg2)), add(add(395, arg5), arg5), new WidgetPointer(arg2)); + setWidget3DRotation(0, 0, getWidgetRotateX(new WidgetPointer(arg3)), getWidgetRotateY(new WidgetPointer(arg3)), cs2method2607(new WidgetPointer(arg3)), add(add(395, arg5), arg5), new WidgetPointer(arg3)); + switch (arg4) { + case 0: + setWidgetPosition(0, 43, 1, 0, new WidgetPointer(arg0)); + setWidgetPosition(0, 126, 1, 0, new WidgetPointer(arg1)); + setWidgetPosition(0, 210, 1, 0, new WidgetPointer(arg2)); + setWidgetPosition(0, -70, 1, 0, new WidgetPointer(arg3)); + break; + case 1: + setWidgetPosition(0, 43, 1, 0, new WidgetPointer(arg1)); + setWidgetPosition(0, 126, 1, 0, new WidgetPointer(arg2)); + setWidgetPosition(0, 210, 1, 0, new WidgetPointer(arg3)); + setWidgetPosition(0, -70, 1, 0, new WidgetPointer(arg0)); + break; + case 2: + setWidgetPosition(0, 43, 1, 0, new WidgetPointer(arg2)); + setWidgetPosition(0, 126, 1, 0, new WidgetPointer(arg3)); + setWidgetPosition(0, 210, 1, 0, new WidgetPointer(arg0)); + setWidgetPosition(0, -70, 1, 0, new WidgetPointer(arg1)); + break; + default: + setWidgetPosition(0, 43, 1, 0, new WidgetPointer(arg3)); + setWidgetPosition(0, 126, 1, 0, new WidgetPointer(arg0)); + setWidgetPosition(0, 210, 1, 0, new WidgetPointer(arg1)); + setWidgetPosition(0, -70, 1, 0, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/2113.cs2 b/dumps/scripts/2113.cs2 new file mode 100644 index 000000000..0bd7eb787 --- /dev/null +++ b/dumps/scripts/2113.cs2 @@ -0,0 +1,14 @@ +void script_2113(int arg0) { + setWidget3DRotation(0, 0, rndExcl(2048), rndExcl(2048), rndExcl(2048), getWidget3DDistance(new WidgetPointer(arg0)), new WidgetPointer(arg0)); + switch (rndExcl(3)) { + case 0: + setScriptCallOnGameloop(66, add(rndExcl(3), 9), 0, add(rndExcl(3), 9), new WidgetPointer(arg0), "iiiI", new WidgetPointer(arg0)); + break; + case 1: + setScriptCallOnGameloop(66, add(rndExcl(3), 9), add(rndExcl(3), 9), 0, new WidgetPointer(arg0), "iiiI", new WidgetPointer(arg0)); + break; + default: + setScriptCallOnGameloop(66, 0, add(rndExcl(3), 9), add(rndExcl(3), 9), new WidgetPointer(arg0), "iiiI", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2114.cs2 b/dumps/scripts/2114.cs2 new file mode 100644 index 000000000..91111c653 --- /dev/null +++ b/dumps/scripts/2114.cs2 @@ -0,0 +1,7 @@ +void script_2114(int arg0,int arg1) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + globalint_679 = 0; + setScriptCallOnGlobalConfigChange(2115, new WidgetPointer(arg0), new WidgetPointer(arg1), 679, 1, "IIY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2115.cs2 b/dumps/scripts/2115.cs2 new file mode 100644 index 000000000..7a6cdcd40 --- /dev/null +++ b/dumps/scripts/2115.cs2 @@ -0,0 +1,23 @@ +void script_2115(int arg0,int arg1) { + int ivar2; + if (((boolean)script_42(globalint_679))) { + return; + } + setWidgetIsHidden(false, new WidgetPointer(arg1)); + if ((globalint_677 == -1) || (globalint_678 == -1)) { + return; + } + if ((globalint_675 == -1) || (globalint_676 == -1)) { + globalint_675 = 56070889; + globalint_676 = 56087272; + } + ivar2 = add(rnd(50), 50); + cs2method5405(0, 2); + cs2method5406(0, 0, globalint_675, 450, globalint_675, add(450, divide(ivar2, 2)), 0); + cs2method5406(0, 1, globalint_676, add(450, ivar2), globalint_676, add(450, multiply(ivar2, 2)), 0); + cs2method5405(1, 2); + cs2method5406(1, 0, globalint_677, 250, globalint_677, 250, 0); + cs2method5406(1, 1, globalint_678, 150, globalint_678, 150, 0); + cameraMethod5502(0, 0, 200, 200, 1, 0); + return; +} diff --git a/dumps/scripts/2116.cs2 b/dumps/scripts/2116.cs2 new file mode 100644 index 000000000..cb2d9e079 --- /dev/null +++ b/dumps/scripts/2116.cs2 @@ -0,0 +1,36 @@ +void script_2116(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + setWidgetText(new WidgetPointer(arg4), ""); + ivar5 = 0; + ivar6 = 0; + ivar7 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 320), 3); + while (ivar5 < getItemContainerLength(307)) { + if (getItemAmtInSlot(307, ivar5) > 0) { + script_2117(ivar5, ivar6, ivar7, arg0, arg3, arg4); + ivar6 = add(ivar6, 1); + } else { + script_2118(ivar5, arg0); + } + ivar5 = add(ivar5, 1); + } + ivar5 = add(ivar7, multiply(divide(add(ivar6, 1), 2), add(ivar7, 64))); + cs2method2100(0, 0, new WidgetPointer(arg0)); + if (ivar5 > getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetScrollMax(0, ivar5, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + setWidgetPosition(392, getWidgetActualY(new WidgetPointer(arg4)), 0, 0, new WidgetPointer(arg4)); + setWidgetPosition(392, getWidgetActualY(new WidgetPointer(arg3)), 0, 0, new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + setWidgetPosition(384, getWidgetActualY(new WidgetPointer(arg3)), 0, 0, new WidgetPointer(arg3)); + setWidgetPosition(384, getWidgetActualY(new WidgetPointer(arg4)), 0, 0, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/2117.cs2 b/dumps/scripts/2117.cs2 new file mode 100644 index 000000000..c5c032621 --- /dev/null +++ b/dumps/scripts/2117.cs2 @@ -0,0 +1,82 @@ +void script_2117(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + ivar6 = add(arg2, multiply(divide(arg1, 2), add(64, arg2))); + ivar7 = add(arg2, multiply(mod(arg1, 2), add(160, arg2))); + createExtraChild(new WidgetPointer(arg3), 3, multiply(arg0, 7)); + setWidgetSize(160, 64, 0, 0); + setWidgetPosition(ivar7, ivar6, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(200); + setWidgetFilled(1); + setWidgetContextMenuOption(1, "Choose"); + if (arg0 == 26) { + setWidgetContextMenuOption(10, "Explain"); + cs2method1305("" + "Emote" + ""); + } else if (arg0 == 27) { + setWidgetContextMenuOption(10, "Explain"); + cs2method1305("" + "Costume point" + ""); + } else { + setWidgetContextMenuOption(10, "Examine"); + cs2method1305("" + getItemName(getItemIdInSlot(307, arg0)) + ""); + } + setScriptCallOnClickContextMenu(2120, -2147483644, new WidgetPointer(arg3), arg0, new WidgetPointer(arg4), new WidgetPointer(arg5), "iIiII"); + createExtraChild(new WidgetPointer(arg3), 5, add(multiply(arg0, 7), 1)); + setWidgetSize(159, 32, 0, 0); + cs2method1107(1); + setWidgetSprite(1074); + setWidgetPosition(ivar7, subtract(ivar6, 17), 0, 0); + createExtraChild(new WidgetPointer(arg3), 5, add(multiply(arg0, 7), 2)); + setWidgetSize(160, 32, 0, 0); + cs2method1107(1); + setWidgetSprite(1074); + setWidgetVFlip(1); + setWidgetPosition(ivar7, add(ivar6, 49), 0, 0); + createExtraChild(new WidgetPointer(arg3), 5, add(multiply(arg0, 7), 3)); + setWidgetSize(32, 63, 0, 0); + cs2method1107(1); + setWidgetSprite(1075); + setWidgetPosition(subtract(ivar7, 14), ivar6, 0, 0); + createExtraChild(new WidgetPointer(arg3), 5, add(multiply(arg0, 7), 4)); + setWidgetSize(32, 63, 0, 0); + cs2method1107(1); + setWidgetSprite(1075); + setWidgetHFlip(1); + setWidgetPosition(add(ivar7, 142), ivar6, 0, 0); + createExtraChild(new WidgetPointer(arg3), 5, add(multiply(arg0, 7), 5)); + if (arg0 == 26) { + setWidgetSize(22, 22, 0, 0); + setWidgetPosition(add(ivar7, 15), add(ivar6, 20), 0, 0); + setWidgetBorderThickness(0); + setWidgetSprite(1830); + } else if (arg0 == 27) { + setWidgetSize(42, 42, 0, 0); + setWidgetPosition(add(ivar7, 5), add(ivar6, 12), 0, 0); + setWidgetBorderThickness(0); + setWidgetSprite(1044); + } else if ((getItemAmtInSlot(307, arg0) > 1) && itemIsStackable(getItemIdInSlot(307, arg0))) { + setItemOnWidgetMethod1200(getItemIdInSlot(307, arg0), getItemAmtInSlot(307, arg0)); + } else { + setItemOnWidgetMethod1200(getItemIdInSlot(307, arg0), -1); + } + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar7, 8), add(ivar6, 16), 0, 0); + setWidgetBorderThickness(1); + setWidgetShadowColor(new Color(48, 32, 32)); + createExtraChild(new WidgetPointer(arg3), 4, add(multiply(arg0, 7), 6)); + setWidgetFont(496); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetTextAlignment(1, 1, 0); + setWidgetSize(subtract(160, add(add(subtract(getWidgetActualX(), ivar7), getWidgetActualWidth()), 4)), 64, 0, 0); + setWidgetPosition(subtract(subtract(add(ivar7, 160), getWidgetActualWidth()), 2), ivar6, 0, 0); + if (arg0 == 26) { + setWidgetText("Unlock emote!"); + } else if (arg0 == 27) { + setWidgetText("Save up for a costume!"); + } else if (((boolean)getItemAmtInSlot(307, arg0))) { + setWidgetText(cs2method_3408(105, 115, 2238, arg0) + ":" + "
" + getItemName(getItemIdInSlot(307, arg0))); + } else { + setWidgetText(cs2method_3408(105, 115, 2238, arg0) + ":" + "
" + intToStr(getItemAmtInSlot(307, arg0)) + " x " + getItemName(getItemIdInSlot(307, arg0))); + } + return; +} diff --git a/dumps/scripts/2118.cs2 b/dumps/scripts/2118.cs2 new file mode 100644 index 000000000..372a8eb35 --- /dev/null +++ b/dumps/scripts/2118.cs2 @@ -0,0 +1,12 @@ +void script_2118(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + while (ivar2 < 7) { + createExtraChild(new WidgetPointer(arg1), 3, add(multiply(arg0, 7), ivar2)); + setWidgetSize(0, 0, 0, 0); + setWidgetPosition(-1, -1, 0, 0); + setWidgetHidden(1); + ivar2 = add(ivar2, 1); + } + return; +} diff --git a/dumps/scripts/2119.cs2 b/dumps/scripts/2119.cs2 new file mode 100644 index 000000000..75f92cadc --- /dev/null +++ b/dumps/scripts/2119.cs2 @@ -0,0 +1,8 @@ +void script_2119(int arg0,int arg1) { + if ((getWidgetScrollMaxV(new WidgetPointer(arg0)) > 0) && (cs2method2601(new WidgetPointer(arg0)) < 35)) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/212.cs2 b/dumps/scripts/212.cs2 new file mode 100644 index 000000000..043ad6d3a --- /dev/null +++ b/dumps/scripts/212.cs2 @@ -0,0 +1,6 @@ +void script_212(string arg0) { + if (stringMethod4107(arg0, "") != 0) { + cs2method5421(1, arg0); + } + return; +} diff --git a/dumps/scripts/2120.cs2 b/dumps/scripts/2120.cs2 new file mode 100644 index 000000000..d6eb03b0c --- /dev/null +++ b/dumps/scripts/2120.cs2 @@ -0,0 +1,42 @@ +void script_2120(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + if (arg0 != 1) { + return; + } + ivar5 = 0; + while (ivar5 < getItemContainerLength(307)) { + if (setWidgetRegister(new WidgetPointer(arg1), multiply(ivar5, 7))) { + if (ivar5 == arg2) { + cs2method2103(100); + } else { + cs2method2103(200); + } + } + ivar5 = add(ivar5, 1); + } + setWidgetText(new WidgetPointer(arg4), "Confirm:" + "
" + cs2method_3408(105, 115, 2238, arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + ivar6 = 833; + ivar5 = 0; + while (ivar5 < getItemContainerLength(307)) { + if (ivar5 == arg2) { + createExtraChild(new WidgetPointer(arg3), 5, ivar5); + setWidgetSize(90, 56, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(ivar6); + setWidgetHidden(0); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar6, "Iid"); + ivar6 = 834; + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar6, "Iid"); + setWidgetContextMenuOption(1, "Confirm"); + return; + } + createExtraChild(new WidgetPointer(arg3), 3, ivar5); + setWidgetPosition(-1, -1, 0, 0); + setWidgetSize(0, 0, 0, 0); + setWidgetHidden(1); + ivar5 = add(ivar5, 1); + } + return; +} diff --git a/dumps/scripts/2121.cs2 b/dumps/scripts/2121.cs2 new file mode 100644 index 000000000..5027b2f26 --- /dev/null +++ b/dumps/scripts/2121.cs2 @@ -0,0 +1,13 @@ +void script_2121(int arg0,int arg1) { + script_2122(1, arg0, "Mime outfit"); + script_2122(11, arg0, "Frog kit"); + script_2122(21, arg0, "Zombie outfit (Gravedigger reward)"); + script_2122(31, arg0, "Camo kit (Drill Demon reward)"); + script_2122(41, arg0, "Lederhosen outfit (Freaky Forester reward)"); + setWidgetScrollMax(0, 320, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + if (setWidgetRegister(new WidgetPointer(arg1), 1)) { + script_37(arg1, arg0, cs2method2601(new WidgetPointer(arg0)), 1); + } + return; +} diff --git a/dumps/scripts/2122.cs2 b/dumps/scripts/2122.cs2 new file mode 100644 index 000000000..14f02fbc1 --- /dev/null +++ b/dumps/scripts/2122.cs2 @@ -0,0 +1,50 @@ +void script_2122(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + ivar2 = multiply(divide(arg0, 10), 64); + createExtraChild(new WidgetPointer(arg1), 4, subtract(arg0, 1)); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg1)), 10), 17, 0, 0); + setWidgetPosition(5, add(ivar2, 2), 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetText(arg2); + ivar3 = 0; + while (ivar3 < 7) { + script_2123(add(arg0, ivar3), ivar3, arg1, ivar2); + ivar3 = add(ivar3, 1); + } + createExtraChild(new WidgetPointer(arg1), 4, add(arg0, 7)); + setWidgetSize(100, 64, 0, 0); + setWidgetPosition(subtract(getWidgetActualWidth(new WidgetPointer(arg1)), 100), ivar2, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + switch (arg0) { + case 1: + setWidgetText("Points:" + "
" + intToStr(bitconfig_5903)); + break; + case 11: + setWidgetText("Points:" + "
" + intToStr(bitconfig_5904)); + break; + case 21: + setWidgetText("Points:" + "
" + intToStr(bitconfig_5905)); + break; + case 31: + setWidgetText("Points:" + "
" + intToStr(bitconfig_5906)); + break; + case 41: + setWidgetText("Points:" + "
" + intToStr(bitconfig_5907)); + break; + default: + setWidgetText(""); + } + if (add(arg0, 10) < 43) { + createExtraChild(new WidgetPointer(arg1), 5, add(arg0, 8)); + setWidgetSprite(962); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg1)), 32, 0, 0); + cs2method1107(1); + setWidgetPosition(0, add(ivar2, 58), 0, 0); + } + return; +} diff --git a/dumps/scripts/2123.cs2 b/dumps/scripts/2123.cs2 new file mode 100644 index 000000000..282c2fc91 --- /dev/null +++ b/dumps/scripts/2123.cs2 @@ -0,0 +1,57 @@ +void script_2123(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + createExtraChild(new WidgetPointer(arg2), 5, arg0); + setWidgetPosition(add(5, multiply(add(36, 20), arg1)), add(arg3, 22), 0, 0); + setWidgetSize(36, 32, 0, 0); + ivar4 = cs2method_3408(105, 79, 2240, arg0); + if (ivar4 != -1) { + setWidgetBorderThickness(1); + setWidgetShadowColor(new Color(48, 32, 32)); + setItemOnWidgetMethod1200(ivar4, -1); + setWidgetContextMenuOption(1, "Claim"); + setWidgetContextMenuOption(10, "Examine"); + cs2method1305("" + getItemName(ivar4) + ""); + if (add(add(add(getItemAmtInContainer(93, ivar4), getItemAmtInContainer(94, ivar4)), getItemAmtInContainer(95, ivar4)), getItemAmtInContainer(530, ivar4)) > 0) { + cs2method2103(200); + } else if (divide(arg0, 10) == divide(1, 10)) { + if (bitconfig_2698 > 0) { + cs2method2103(200); + } else { + cs2method2103(0); + } + } else if (arg0 == 11) { + if (bitconfig_2776 > 0) { + cs2method2103(200); + } else { + cs2method2103(0); + } + } else if (divide(arg0, 10) == divide(11, 10)) { + if (bitconfig_2699 > 0) { + cs2method2103(200); + } else { + cs2method2103(0); + } + } else if (divide(arg0, 10) == divide(21, 10)) { + if (bitconfig_2700 > 0) { + cs2method2103(200); + } else { + cs2method2103(0); + } + } else if (divide(arg0, 10) == divide(31, 10)) { + if (bitconfig_2701 > 0) { + cs2method2103(200); + } else { + cs2method2103(0); + } + } else if (divide(arg0, 10) == divide(41, 10)) { + if (bitconfig_2702 > 0) { + cs2method2103(200); + } else { + cs2method2103(0); + } + } else { + cs2method2103(0); + } + } + return; +} diff --git a/dumps/scripts/2124.cs2 b/dumps/scripts/2124.cs2 new file mode 100644 index 000000000..ea018eb8d --- /dev/null +++ b/dumps/scripts/2124.cs2 @@ -0,0 +1,17 @@ +void script_2124(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + globalint_681 = rndExcl(2048); + globalint_684 = rndExcl(2048); + globalint_687 = rndExcl(2048); + globalint_690 = rndExcl(2048); + globalint_680 = subtract(25, rnd(50)); + globalint_682 = subtract(25, rnd(50)); + globalint_683 = subtract(25, rnd(50)); + globalint_685 = subtract(25, rnd(50)); + globalint_686 = subtract(25, rnd(50)); + globalint_688 = subtract(25, rnd(50)); + globalint_689 = subtract(25, rnd(50)); + globalint_691 = subtract(25, rnd(50)); + script_2127(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + setScriptCallOnGameloop(2126, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), new WidgetPointer(arg8), "IIIIIIII", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2125.cs2 b/dumps/scripts/2125.cs2 new file mode 100644 index 000000000..b1647bbda --- /dev/null +++ b/dumps/scripts/2125.cs2 @@ -0,0 +1,4 @@ +void script_2125(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + script_2127(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + return; +} diff --git a/dumps/scripts/2126.cs2 b/dumps/scripts/2126.cs2 new file mode 100644 index 000000000..54e02bb42 --- /dev/null +++ b/dumps/scripts/2126.cs2 @@ -0,0 +1,28 @@ +void script_2126(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + globalint_681 = mod(add(add(globalint_681, rndExcl(4)), 2), 2048); + globalint_684 = mod(add(add(globalint_684, rndExcl(4)), 2), 2048); + globalint_687 = mod(add(add(globalint_687, rndExcl(4)), 2), 2048); + globalint_690 = mod(add(add(globalint_690, rndExcl(4)), 2), 2048); + if ((globalint_680 < 20) && ((globalint_680 < -20) || ((boolean)rndExcl(2)))) { + globalint_680 = min(add(add(globalint_680, rndExcl(3)), 1), 25); + } else { + globalint_680 = max(subtract(globalint_680, add(rndExcl(3), 1)), -25); + } + if ((globalint_683 < 20) && ((globalint_683 < -20) || ((boolean)rndExcl(2)))) { + globalint_683 = min(add(add(globalint_683, rndExcl(3)), 1), 25); + } else { + globalint_683 = max(subtract(globalint_683, add(rndExcl(3), 1)), -25); + } + if ((globalint_686 < 20) && ((globalint_686 < -20) || ((boolean)rndExcl(2)))) { + globalint_686 = min(add(add(globalint_686, rndExcl(3)), 1), 25); + } else { + globalint_686 = max(subtract(globalint_686, add(rndExcl(3), 1)), -25); + } + if ((globalint_689 < 20) && ((globalint_689 < -20) || ((boolean)rndExcl(2)))) { + globalint_689 = min(add(add(globalint_689, rndExcl(3)), 1), 25); + } else { + globalint_689 = max(subtract(globalint_689, add(rndExcl(3), 1)), -25); + } + script_2127(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + return; +} diff --git a/dumps/scripts/2127.cs2 b/dumps/scripts/2127.cs2 new file mode 100644 index 000000000..dfa3e533e --- /dev/null +++ b/dumps/scripts/2127.cs2 @@ -0,0 +1,11 @@ +void script_2127(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_2128(arg0, bitconfig_5893); + script_2128(arg1, bitconfig_5894); + script_2128(arg2, bitconfig_5895); + script_2128(arg3, bitconfig_5896); + script_2128(arg4, bitconfig_5897); + script_2128(arg5, bitconfig_5898); + script_2128(arg6, bitconfig_5899); + script_2128(arg7, bitconfig_5900); + return; +} diff --git a/dumps/scripts/2128.cs2 b/dumps/scripts/2128.cs2 new file mode 100644 index 000000000..7d02a671c --- /dev/null +++ b/dumps/scripts/2128.cs2 @@ -0,0 +1,23 @@ +void script_2128(int arg0,int arg1) { + switch (arg1) { + case 1: + setWidgetModel(16036, new WidgetPointer(arg0)); + setWidget3DRotation(0, 0, script_686(globalint_680, 2048), globalint_681, script_686(globalint_682, 2048), 800, new WidgetPointer(arg0)); + break; + case 2: + setWidgetModel(16025, new WidgetPointer(arg0)); + setWidget3DRotation(0, 17, script_686(globalint_683, 2048), globalint_684, script_686(globalint_685, 2048), 800, new WidgetPointer(arg0)); + break; + case 3: + setWidgetModel(16022, new WidgetPointer(arg0)); + setWidget3DRotation(0, 0, script_686(globalint_686, 2048), globalint_687, script_686(globalint_688, 2048), 800, new WidgetPointer(arg0)); + break; + case 4: + setWidgetModel(16034, new WidgetPointer(arg0)); + setWidget3DRotation(0, 0, script_686(globalint_689, 2048), globalint_690, script_686(globalint_691, 2048), 800, new WidgetPointer(arg0)); + break; + default: + setWidgetModel(-1, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2129.cs2 b/dumps/scripts/2129.cs2 new file mode 100644 index 000000000..747fc8808 --- /dev/null +++ b/dumps/scripts/2129.cs2 @@ -0,0 +1,18 @@ +void script_2129(int arg0,int arg1,int arg2) { + switch (arg1) { + case 27525135: + case 27525134: + case 27525133: + case 27525132: + case 27525138: + case 27525139: + case 27525136: + case 27525137: + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg1)), getWidgetActualY(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg0)); + playSoundEffect(5507, 1, 0); + break; + default: + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg2)), getWidgetActualY(new WidgetPointer(arg2)), 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/213.cs2 b/dumps/scripts/213.cs2 new file mode 100644 index 000000000..3728d3a9c --- /dev/null +++ b/dumps/scripts/213.cs2 @@ -0,0 +1,63 @@ +void script_213(int arg0,int arg1,int arg2,int arg3) { + flow_0: + SWITCH (bitconfig_278) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + } + cs2method2103(255, new WidgetPointer(arg2)); + GOTO flow_4 + flow_1: + cs2method2103(200, new WidgetPointer(arg2)); + GOTO flow_4 + flow_2: + cs2method2103(150, new WidgetPointer(arg2)); + GOTO flow_4 + flow_3: + cs2method2103(50, new WidgetPointer(arg2)); + flow_4: + SWITCH (globalint_97) { + case 1: + GOTO flow_5 + case 2: + GOTO flow_6 + case 3: + GOTO flow_7 + case 4: + GOTO flow_8 + case 5: + GOTO flow_9 + } + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + GOTO flow_10 + flow_5: + script_2766(0, 20, arg3); + GOTO flow_10 + flow_6: + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetAnimation(10708, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + script_2768(10, arg3); + GOTO flow_10 + flow_7: + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + script_2768(50, arg3); + GOTO flow_10 + flow_8: + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetAnimation(10712, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + script_2768(115, arg3); + GOTO flow_10 + flow_9: + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + script_2768(50, arg3); + flow_10: + return; +} diff --git a/dumps/scripts/2130.cs2 b/dumps/scripts/2130.cs2 new file mode 100644 index 000000000..07a7f88c4 --- /dev/null +++ b/dumps/scripts/2130.cs2 @@ -0,0 +1,4 @@ +void script_2130(int arg0,int arg1) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg1)), getWidgetActualY(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2131.cs2 b/dumps/scripts/2131.cs2 new file mode 100644 index 000000000..028a4265b --- /dev/null +++ b/dumps/scripts/2131.cs2 @@ -0,0 +1,7 @@ +void script_2131(int arg0,int arg1) { + setScriptCallOnGameloop(2132, new WidgetPointer(arg0), subtract(rndExcl(6), 3), subtract(rndExcl(6), 3), new WidgetPointer(arg1), 0, "IiiIi", new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(2133, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseOver(2135, new WidgetPointer(arg0), -2147483647, -2147483646, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(2134, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2132.cs2 b/dumps/scripts/2132.cs2 new file mode 100644 index 000000000..f30611b3e --- /dev/null +++ b/dumps/scripts/2132.cs2 @@ -0,0 +1,69 @@ +void script_2132(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + flow_0: + ivar5 = add(getWidgetActualX(new WidgetPointer(arg0)), arg1); + ivar6 = add(getWidgetActualY(new WidgetPointer(arg0)), arg2); + if ((getWidgetActualX(new WidgetPointer(arg3)) >= ivar5) && (getWidgetActualX(new WidgetPointer(arg3)) < add(ivar5, getWidgetActualWidth(new WidgetPointer(arg0))))) { + if ((getWidgetActualY(new WidgetPointer(arg3)) >= ivar6) && (getWidgetActualY(new WidgetPointer(arg3)) < add(ivar6, getWidgetActualHeight(new WidgetPointer(arg0))))) { + ivar5 = subtract(ivar5, add(rndExcl(3), 2)); + ivar6 = subtract(ivar6, add(rndExcl(3), 2)); + if (arg4 <= getClientCycle()) { + playSoundEffect(819, 1, 0); + arg4 = add(add(getClientCycle(), 20), rndExcl(40)); + } + } + } else { + if (((ivar5 >= getWidgetActualX(new WidgetPointer(arg3))) && (ivar5 < add(getWidgetActualX(new WidgetPointer(arg3)), getWidgetActualWidth(new WidgetPointer(arg3))))) && ((ivar6 >= getWidgetActualY(new WidgetPointer(arg3))) && (ivar6 < add(getWidgetActualY(new WidgetPointer(arg3)), getWidgetActualHeight(new WidgetPointer(arg3)))))) { + ivar5 = add(add(ivar5, rndExcl(3)), 2); + ivar6 = add(add(ivar6, rndExcl(3)), 2); + if (arg4 <= getClientCycle()) { + playSoundEffect(819, 1, 0); + arg4 = add(add(getClientCycle(), 20), rndExcl(40)); + } + } + } + ivar5 = max(ivar5, 0); + ivar6 = max(ivar6, 0); + ivar7 = subtract(getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg0)))), getWidgetActualWidth(new WidgetPointer(arg0))); + ivar5 = min(ivar5, ivar7); + ivar8 = subtract(getWidgetActualHeight(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg0)))), getWidgetActualHeight(new WidgetPointer(arg0))); + ivar6 = min(ivar6, ivar8); + IF (ivar5 <= 0) + GOTO flow_14 + GOTO flow_15 + flow_14: + IF (arg1 < 0) + GOTO flow_17 + flow_15: + IF ((ivar5 >= ivar7) && (arg1 > 0)) + GOTO flow_17 + GOTO flow_18 + flow_17: + arg1 = subtract(0, arg1); + flow_18: + IF (ivar6 <= 0) + GOTO flow_19 + GOTO flow_20 + flow_19: + IF (arg2 < 0) + GOTO flow_22 + flow_20: + IF ((ivar6 >= ivar8) && (arg2 > 0)) + GOTO flow_22 + GOTO flow_23 + flow_22: + arg2 = subtract(0, arg2); + flow_23: + if (((boolean)arg1)) { + arg1 = add(rndExcl(3), 1); + } + if (((boolean)arg2)) { + arg2 = add(rndExcl(3), 1); + } + setWidgetPosition(ivar5, ivar6, 0, 0, new WidgetPointer(arg0)); + setScriptCallOnGameloop(2132, new WidgetPointer(arg0), arg1, arg2, new WidgetPointer(arg3), arg4, "IiiIi", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2133.cs2 b/dumps/scripts/2133.cs2 new file mode 100644 index 000000000..3f071bded --- /dev/null +++ b/dumps/scripts/2133.cs2 @@ -0,0 +1,5 @@ +void script_2133(int arg0) { + setWidgetAnimation(1, new WidgetPointer(arg0)); + playSoundEffect(819, 1, 0); + return; +} diff --git a/dumps/scripts/2134.cs2 b/dumps/scripts/2134.cs2 new file mode 100644 index 000000000..bc6f11216 --- /dev/null +++ b/dumps/scripts/2134.cs2 @@ -0,0 +1,4 @@ +void script_2134(int arg0) { + setWidgetAnimation(0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2135.cs2 b/dumps/scripts/2135.cs2 new file mode 100644 index 000000000..d29316ffc --- /dev/null +++ b/dumps/scripts/2135.cs2 @@ -0,0 +1,26 @@ +void script_2135(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = getWidgetActualX(new WidgetPointer(arg0)); + ivar4 = getWidgetActualY(new WidgetPointer(arg0)); + if ((arg1 >= 0) && (arg1 <= divide(getWidgetActualWidth(new WidgetPointer(arg0)), 2))) { + ivar3 = subtract(ivar3, add(rndExcl(2), 2)); + } else { + if (arg1 <= getWidgetActualWidth(new WidgetPointer(arg0))) { + ivar3 = add(add(ivar3, rndExcl(2)), 2); + } + } + if ((arg2 >= 0) && (arg2 <= divide(getWidgetActualHeight(new WidgetPointer(arg0)), 2))) { + ivar4 = subtract(ivar4, add(rndExcl(2), 2)); + } else { + if (arg2 <= getWidgetActualHeight(new WidgetPointer(arg0))) { + ivar4 = add(add(ivar4, rndExcl(2)), 2); + } + } + ivar3 = max(ivar3, 0); + ivar4 = max(ivar4, 0); + ivar3 = min(ivar3, subtract(getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg0)))), getWidgetActualWidth(new WidgetPointer(arg0)))); + ivar4 = min(ivar4, subtract(getWidgetActualHeight(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg0)))), getWidgetActualHeight(new WidgetPointer(arg0)))); + setWidgetPosition(ivar3, ivar4, 0, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2136.cs2 b/dumps/scripts/2136.cs2 new file mode 100644 index 000000000..be2e73672 --- /dev/null +++ b/dumps/scripts/2136.cs2 @@ -0,0 +1,110 @@ +void script_2136(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int stack_dump0; + int stack_dump1; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = add(add(118, bitconfig_5855), bitconfig_5855); + createExtraChild(new WidgetPointer(arg0), 4, 0); + setWidgetSize(200, 32, 0, 0); + setWidgetPosition(ivar1, 36, 0, 0); + setWidgetFont(497); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(52, 46, 16)); + setWidgetUnknownBoolean(false); + setWidgetText(cs2method_3408(105, 115, 2224, bitconfig_5856)); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 3419664, "Iii"); + setWidgetContextMenuOption(1, "Select"); + createExtraChild(new WidgetPointer(arg0), 4, 1); + setWidgetSize(200, 32, 0, 0); + setWidgetPosition(ivar1, 70, 0, 0); + setWidgetFont(497); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(52, 46, 16)); + setWidgetUnknownBoolean(false); + setWidgetText(cs2method_3408(105, 115, 2224, bitconfig_5858)); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 3419664, "Iii"); + setWidgetContextMenuOption(1, "Select"); + createExtraChild(new WidgetPointer(arg0), 4, 2); + setWidgetSize(200, 32, 0, 0); + setWidgetPosition(ivar1, 104, 0, 0); + setWidgetFont(497); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(52, 46, 16)); + setWidgetUnknownBoolean(false); + setWidgetText(cs2method_3408(105, 115, 2224, bitconfig_5860)); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 3419664, "Iii"); + setWidgetContextMenuOption(1, "Select"); + createExtraChild(new WidgetPointer(arg0), 6, 3); + setWidgetSize(226, 144, 0, 0); + setWidgetPosition(0, 147, 1, 0); + switch (bitconfig_5857) { + case 0: + setWidgetModel(cs2method_3408(105, 109, 2225, bitconfig_5862)); + break; + case 1: + setWidgetModel(cs2method_3408(105, 109, 2226, bitconfig_5862)); + break; + case 2: + setWidgetModel(cs2method_3408(105, 109, 2227, bitconfig_5862)); + break; + default: + setWidgetModel(cs2method_3408(105, 109, 2228, bitconfig_5862)); + } + ivar2 = multiply(subtract(bitconfig_5855, 5), 4); + ivar3 = multiply(subtract(bitconfig_5859, 4), 4); + setWidget3DRotation(ivar2, ivar3, pow(bitconfig_5861, 2), pow(bitconfig_5861, 2), pow(bitconfig_5861, 2), add(add(400, bitconfig_5863), bitconfig_5863)); + ivar4 = bitconfig_5855; + ivar5 = divide(bitconfig_5859, 2); + ivar6 = 0; + switch (bitconfig_5863) { + case 0: + stack_dump0 = ivar5; + stack_dump1 = ivar6; + ivar6 = ivar4; + stack_dump0 = stack_dump0; + ivar5 = stack_dump1; + ivar4 = stack_dump0; + break; + case 1: + stack_dump0 = ivar6; + stack_dump1 = ivar4; + ivar6 = ivar5; + stack_dump0 = stack_dump0; + ivar5 = stack_dump1; + ivar4 = stack_dump0; + break; + case 2: + stack_dump0 = ivar4; + stack_dump1 = ivar6; + ivar6 = ivar5; + stack_dump0 = stack_dump0; + ivar5 = stack_dump1; + ivar4 = stack_dump0; + } + setScriptCallOnGameloop(2137, ivar4, ivar5, ivar6, ivar2, ivar3, new WidgetPointer(-32768,3), -2147483643, "iiiiiIi"); + createExtraChild(new WidgetPointer(arg0), 3, 4); + setWidgetSize(226, 144, 0, 0); + setWidgetPosition(0, 147, 1, 0); + setWidgetRGB(new Color(script_693(add(bitconfig_5861, 95), add(bitconfig_5859, 85), add(bitconfig_5855, 29)))); + setWidgetFilled(1); + cs2method2103(0); + setScriptCallOnGameloop(2138, new WidgetPointer(-32768,3), -2147483643, 0, "Iii"); + createExtraChild(new WidgetPointer(arg0), 5, 5); + setWidgetSize(19, 16, 0, 0); + setWidgetPosition(349, add(bitconfig_5859, 148), 0, 0); + setWidgetHFlip(1); + setWidgetSprite(1538); + setScriptCallOnMouseEntered(2140, new WidgetPointer(-32768,3), -2147483643, 125, "Iii"); + setScriptCallOnMouseExit(2140, new WidgetPointer(-32768,3), -2147483643, 0, "Iii"); + setWidgetContextMenuOption(1, "Change spin"); + setScriptCallOnClickContextMenu(2139, -2147483644, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), ivar2, ivar3, "iIiii"); + return; +} diff --git a/dumps/scripts/2137.cs2 b/dumps/scripts/2137.cs2 new file mode 100644 index 000000000..bce3c00ed --- /dev/null +++ b/dumps/scripts/2137.cs2 @@ -0,0 +1,6 @@ +void script_2137(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + if (setWidgetRegister(new WidgetPointer(arg5), arg6)) { + setWidget3DRotation(arg3, arg4, bitAnd(add(getWidgetRotateX(), arg0), 2047), bitAnd(add(getWidgetRotateY(), arg1), 2047), bitAnd(add(cs2method1607(), arg2), 2047), getWidget3DDistance()); + } + return; +} diff --git a/dumps/scripts/2138.cs2 b/dumps/scripts/2138.cs2 new file mode 100644 index 000000000..c7530faa8 --- /dev/null +++ b/dumps/scripts/2138.cs2 @@ -0,0 +1,52 @@ +void script_2138(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar3 = add(bitconfig_5861, 95); + ivar4 = add(bitconfig_5859, 85); + ivar5 = add(bitconfig_5855, 29); + ivar6 = 0; + ivar7 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (arg2 < 150) { + arg2 = add(arg2, 10); + cs2method2103(arg2); + setScriptCallOnGameloop(2138, new WidgetPointer(-32768,3), -2147483643, arg2, "Iii"); + } else if (arg2 <= 225) { + arg2 = add(arg2, 2); + cs2method2103(arg2); + setScriptCallOnGameloop(2138, new WidgetPointer(-32768,3), -2147483643, arg2, "Iii"); + } else if (arg2 < 300) { + arg2 = add(arg2, 2); + cs2method2103(subtract(450, arg2)); + setScriptCallOnGameloop(2138, new WidgetPointer(-32768,3), -2147483643, arg2, "Iii"); + } else { + arg2 = 150; + cs2method2103(150); + setScriptCallOnGameloop(2138, new WidgetPointer(-32768,3), -2147483643, arg2, "Iii"); + } + ivar6 = multiplyDivide(cs2method1609(), 255, 100); + ivar7 = divide(ivar6, 2); + switch (bitconfig_5863) { + case 0: + ivar4 = add(ivar4, ivar6); + ivar3 = add(ivar3, ivar7); + break; + case 1: + ivar5 = add(ivar5, ivar6); + ivar3 = add(ivar3, ivar7); + break; + case 2: + ivar5 = add(ivar5, ivar6); + ivar4 = add(ivar4, ivar7); + break; + default: + ivar4 = add(ivar4, ivar6); + ivar5 = add(ivar5, ivar7); + } + setWidgetRGB(new Color(script_693(ivar3, ivar4, ivar5))); + } + return; +} diff --git a/dumps/scripts/2139.cs2 b/dumps/scripts/2139.cs2 new file mode 100644 index 000000000..6571f0c91 --- /dev/null +++ b/dumps/scripts/2139.cs2 @@ -0,0 +1,9 @@ +void script_2139(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (arg0 != 1) { + return; + } + if (setWidgetRegister(new WidgetPointer(arg1), 3)) { + setWidget3DRotation(arg3, arg4, bitAnd(add(getWidgetRotateX(), 25), 2047), bitAnd(add(getWidgetRotateY(), 25), 2047), bitAnd(add(cs2method1607(), 25), 2047), getWidget3DDistance()); + } + return; +} diff --git a/dumps/scripts/214.cs2 b/dumps/scripts/214.cs2 new file mode 100644 index 000000000..38cd39628 --- /dev/null +++ b/dumps/scripts/214.cs2 @@ -0,0 +1,7 @@ +void script_214(int arg0,int arg1) { + int ivar2; + ivar2 = getWidgetParentId(new WidgetPointer(arg0)); + setScriptCallOnConfigChange(1660, new WidgetPointer(arg0), arg1, new WidgetPointer(ivar2), 281, 1255, 2, "IiIY", new WidgetPointer(ivar2)); + script_1661(arg0, arg1, ivar2); + return; +} diff --git a/dumps/scripts/2140.cs2 b/dumps/scripts/2140.cs2 new file mode 100644 index 000000000..4ef0568f5 --- /dev/null +++ b/dumps/scripts/2140.cs2 @@ -0,0 +1,6 @@ +void script_2140(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + cs2method2103(arg2); + } + return; +} diff --git a/dumps/scripts/2141.cs2 b/dumps/scripts/2141.cs2 new file mode 100644 index 000000000..c4a6aee4a --- /dev/null +++ b/dumps/scripts/2141.cs2 @@ -0,0 +1,34 @@ +void script_2141() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + string svar0; + int stack_dump0; + cs2func_script_942_struct(1,1,0) structdump_1; + deleteAllExtraChilds(new WidgetPointer(864,7)); + if (standart_config_1469 == -1) { + return; + } + ivar0 = 0; + ivar1 = 10; + ivar2 = 0; + ivar3 = 0; + svar0 = ""; + while (ivar2 != -1) { + stack_dump0 = ivar3; + structdump_1 = script_942(stack_dump0); + svar0 = structdump_1.stringpart_0; + ivar2 = structdump_1.intpart_0; + if (((boolean)ivar2)) { + ivar1 = add(ivar1, script_2142(ivar0, ivar1, ivar3, svar0)); + ivar0 = add(ivar0, 1); + } + ivar3 = add(ivar3, 1); + } + setWidgetScrollMax(296, ivar1, new WidgetPointer(864,7)); + if (ivar1 > 240) { + script_31(56623112, 56623111, 798, 795, 796, 797, 793, 794); + } + return; +} diff --git a/dumps/scripts/2142.cs2 b/dumps/scripts/2142.cs2 new file mode 100644 index 000000000..9fc39d080 --- /dev/null +++ b/dumps/scripts/2142.cs2 @@ -0,0 +1,18 @@ +int script_2142(int arg0,int arg1,int arg2,string arg3) { + int ivar3; + int ivar4; + ivar3 = getLineCount(390, 495, arg3); + ivar4 = 15; + createExtraChild(new WidgetPointer(864,7), 4, arg0); + setWidgetSize(390, multiply(ivar3, ivar4), 0, 0); + setWidgetText(arg3); + setWidgetPosition(15, arg1, 0, 0); + setWidgetTextAlignment(0, 0, 0); + setWidgetRGB(new Color(70, 50, 10)); + setWidgetFont(495); + setWidgetUnknownBoolean(false); + setWidgetContextMenuOption(1, "Teleport"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 6574120, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 4600330, "Iii"); + return add(multiply(ivar3, ivar4), 5); +} diff --git a/dumps/scripts/2143.cs2 b/dumps/scripts/2143.cs2 new file mode 100644 index 000000000..679812057 --- /dev/null +++ b/dumps/scripts/2143.cs2 @@ -0,0 +1,23 @@ +void script_2143(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 1093; + if (IsFemale()) { + ivar2 = 3872; + } + ivar3 = 0; + while (ivar3 <= getCommonDefinitionSize(ivar2)) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar3)) { + if (((boolean)script_2476(ivar3))) { + setWidgetRGB(new Color(17, 255, 0)); + } else { + setWidgetRGB(new Color(255, 17, 0)); + } + } + ivar3 = add(1, ivar3); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetRGB(new Color(255, 255, 255)); + } + return; +} diff --git a/dumps/scripts/2144.cs2 b/dumps/scripts/2144.cs2 new file mode 100644 index 000000000..d6f22a259 --- /dev/null +++ b/dumps/scripts/2144.cs2 @@ -0,0 +1,13 @@ +void script_2144(int arg0) { + int ivar1; + ivar1 = 1093; + if (IsFemale()) { + ivar1 = 3872; + } + if (((boolean)standart_config_1442)) { + setWidgetText(new WidgetPointer(arg0), "No Prefix"); + } else { + setWidgetText(new WidgetPointer(arg0), cs2method_3408(105, 115, ivar1, standart_config_1442)); + } + return; +} diff --git a/dumps/scripts/2145.cs2 b/dumps/scripts/2145.cs2 new file mode 100644 index 000000000..e82fe72d1 --- /dev/null +++ b/dumps/scripts/2145.cs2 @@ -0,0 +1,218 @@ +cs2func_script_2145_struct(2,1,0) script_2145(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_2146_struct(2,1,0) structdump_5; + cs2func_script_2146_struct(2,1,0) structdump_6; + cs2func_script_2146_struct(2,1,0) structdump_7; + cs2func_script_2146_struct(2,1,0) structdump_8; + cs2func_script_2146_struct(2,1,0) structdump_9; + cs2func_script_2146_struct(2,1,0) structdump_10; + cs2func_script_2146_struct(2,1,0) structdump_11; + cs2func_script_2146_struct(2,1,0) structdump_12; + cs2func_script_2146_struct(2,1,0) structdump_13; + cs2func_script_2146_struct(2,1,0) structdump_14; + cs2func_script_2146_struct(2,1,0) structdump_15; + cs2func_script_2146_struct(2,1,0) structdump_16; + ivar3 = cs2method_3408(105, 74, 169, arg1); + ivar4 = cs2method_3408(105, 74, getOtherCommonData(ivar3, 61), arg2); + ivar5 = getSkillActualLvl(arg0); + svar0 = "null"; + ivar6 = -1; + ivar7 = 0; + if (ivar4 == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if (((boolean)arg1) && (script_2193(arg2) == 2)) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if (getOtherCommonData(ivar4, 871) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 871) == arg0) && (ivar5 == getOtherCommonData(ivar4, 872))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_5 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_5.intpart_1; + ivar6 = structdump_5.intpart_0; + svar0 = structdump_5.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 873) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 873) == arg0) && (ivar5 == getOtherCommonData(ivar4, 874))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_6 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_6.intpart_1; + ivar6 = structdump_6.intpart_0; + svar0 = structdump_6.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 875) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 875) == arg0) && (ivar5 == getOtherCommonData(ivar4, 876))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_7 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_7.intpart_1; + ivar6 = structdump_7.intpart_0; + svar0 = structdump_7.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 877) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 877) == arg0) && (ivar5 == getOtherCommonData(ivar4, 878))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_8 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_8.intpart_1; + ivar6 = structdump_8.intpart_0; + svar0 = structdump_8.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 879) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 879) == arg0) && (ivar5 == getOtherCommonData(ivar4, 880))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_9 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_9.intpart_1; + ivar6 = structdump_9.intpart_0; + svar0 = structdump_9.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 881) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 881) == arg0) && (ivar5 == getOtherCommonData(ivar4, 882))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_10 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_10.intpart_1; + ivar6 = structdump_10.intpart_0; + svar0 = structdump_10.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 883) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 883) == arg0) && (ivar5 == getOtherCommonData(ivar4, 884))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_11 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_11.intpart_1; + ivar6 = structdump_11.intpart_0; + svar0 = structdump_11.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 885) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 885) == arg0) && (ivar5 == getOtherCommonData(ivar4, 886))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_12 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_12.intpart_1; + ivar6 = structdump_12.intpart_0; + svar0 = structdump_12.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 887) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 887) == arg0) && (ivar5 == getOtherCommonData(ivar4, 888))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_13 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_13.intpart_1; + ivar6 = structdump_13.intpart_0; + svar0 = structdump_13.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 889) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 889) == arg0) && (ivar5 == getOtherCommonData(ivar4, 890))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_14 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_14.intpart_1; + ivar6 = structdump_14.intpart_0; + svar0 = structdump_14.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 891) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 891) == arg0) && (ivar5 == getOtherCommonData(ivar4, 892))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_15 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_15.intpart_1; + ivar6 = structdump_15.intpart_0; + svar0 = structdump_15.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + if (getOtherCommonData(ivar4, 893) == -1) { + return newstruct cs2func_script_2145_struct(ivar6, 0, svar0); + } + if ((getOtherCommonData(ivar4, 893) == arg0) && (ivar5 == getOtherCommonData(ivar4, 894))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = ivar5; + stack_dump3 = arg2; + stack_dump4 = getOtherCommonData(ivar4, 845); + structdump_16 = script_2146(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar7 = structdump_16.intpart_1; + ivar6 = structdump_16.intpart_0; + svar0 = structdump_16.stringpart_0; + return newstruct cs2func_script_2145_struct(ivar6, ivar7, svar0); + } + return newstruct cs2func_script_2145_struct(-1, 0, ""); +} diff --git a/dumps/scripts/2146.cs2 b/dumps/scripts/2146.cs2 new file mode 100644 index 000000000..875a90ec9 --- /dev/null +++ b/dumps/scripts/2146.cs2 @@ -0,0 +1,17 @@ +cs2func_script_2146_struct(2,1,0) script_2146(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + string svar1; + svar1 = "null"; + ivar4 = -1; + ivar5 = 1; + if (((boolean)script_2152(arg1, arg3))) { + svar1 = "" + "Level " + intToStr(arg2) + " " + "" + cs2method_3408(83, 115, 680, arg0) + "" + " is one of the requirements for " + "" + arg4 + "" + "."; + } else { + svar1 = "" + "You have all of the levels required to complete " + "" + arg4 + "" + "."; + } + if (ivar4 == -1) { + ivar4 = 6513; + } + return newstruct cs2func_script_2146_struct(ivar4, ivar5, svar1); +} diff --git a/dumps/scripts/2147.cs2 b/dumps/scripts/2147.cs2 new file mode 100644 index 000000000..1e4698e62 --- /dev/null +++ b/dumps/scripts/2147.cs2 @@ -0,0 +1,4 @@ +void script_2147() { + globalint_698 = script_1432(); + return; +} diff --git a/dumps/scripts/2148.cs2 b/dumps/scripts/2148.cs2 new file mode 100644 index 000000000..9438d5555 --- /dev/null +++ b/dumps/scripts/2148.cs2 @@ -0,0 +1,7 @@ +int script_2148(int arg0,int arg1) { + int ivar2; + ivar2 = cs2method_3408(105, 74, 169, arg0); + globalint_699 = cs2method_3408(105, 74, getOtherCommonData(ivar2, 61), arg1); + globalint_698 = script_1432(); + return script_2149(); +} diff --git a/dumps/scripts/2149.cs2 b/dumps/scripts/2149.cs2 new file mode 100644 index 000000000..bb2951480 --- /dev/null +++ b/dumps/scripts/2149.cs2 @@ -0,0 +1,18 @@ +int script_2149() { + if (((boolean)script_2155())) { + return 0; + } + if (standart_config_101 < getOtherCommonData(globalint_699, 895)) { + return 0; + } + if (globalint_698 < getOtherCommonData(globalint_699, 896)) { + return 0; + } + if (((boolean)script_2153())) { + return 0; + } + if (((boolean)getOtherCommonData(globalint_699, 898)) && ((boolean)script_2194(getOtherCommonData(globalint_699, 847)))) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/215.cs2 b/dumps/scripts/215.cs2 new file mode 100644 index 000000000..832e2146a --- /dev/null +++ b/dumps/scripts/215.cs2 @@ -0,0 +1,4 @@ +void script_215() { + script_216(); + return; +} diff --git a/dumps/scripts/2150.cs2 b/dumps/scripts/2150.cs2 new file mode 100644 index 000000000..54cad22da --- /dev/null +++ b/dumps/scripts/2150.cs2 @@ -0,0 +1,9 @@ +int script_2150(int arg0,int arg1) { + int ivar2; + ivar2 = cs2method_3408(105, 74, 169, arg0); + globalint_699 = cs2method_3408(105, 74, getOtherCommonData(ivar2, 61), arg1); + if (standart_config_101 < getOtherCommonData(globalint_699, 895)) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/2151.cs2 b/dumps/scripts/2151.cs2 new file mode 100644 index 000000000..c226bd750 --- /dev/null +++ b/dumps/scripts/2151.cs2 @@ -0,0 +1,9 @@ +int script_2151(int arg0,int arg1) { + int ivar2; + ivar2 = cs2method_3408(105, 74, 169, arg0); + globalint_699 = cs2method_3408(105, 74, getOtherCommonData(ivar2, 61), arg1); + if (script_1432() < getOtherCommonData(globalint_699, 896)) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/2152.cs2 b/dumps/scripts/2152.cs2 new file mode 100644 index 000000000..0257db938 --- /dev/null +++ b/dumps/scripts/2152.cs2 @@ -0,0 +1,6 @@ +int script_2152(int arg0,int arg1) { + int ivar2; + ivar2 = cs2method_3408(105, 74, 169, arg0); + globalint_699 = cs2method_3408(105, 74, getOtherCommonData(ivar2, 61), arg1); + return script_2153(); +} diff --git a/dumps/scripts/2153.cs2 b/dumps/scripts/2153.cs2 new file mode 100644 index 000000000..debe24cf0 --- /dev/null +++ b/dumps/scripts/2153.cs2 @@ -0,0 +1,91 @@ +int script_2153() { + int ivar0; + ivar0 = getOtherCommonData(globalint_699, 871); + if (((boolean)getOtherCommonData(globalint_699, 897)) && (add(getSkillActualLvl(0), getSkillActualLvl(2)) < 130)) { + return 0; + } + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 872)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 873); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 874)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 875); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 876)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 877); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 878)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 879); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 880)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 881); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 882)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 883); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 884)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 885); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 886)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 887); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 888)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 889); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 890)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 891); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 892)) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 893); + if (ivar0 == -1) { + return 1; + } + if (getSkillActualLvl(ivar0) < getOtherCommonData(globalint_699, 894)) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/2154.cs2 b/dumps/scripts/2154.cs2 new file mode 100644 index 000000000..30ff6d596 --- /dev/null +++ b/dumps/scripts/2154.cs2 @@ -0,0 +1,4 @@ +int script_2154(int arg0) { + globalint_699 = cs2method_3408(105, 74, 2252, arg0); + return script_2155(); +} diff --git a/dumps/scripts/2155.cs2 b/dumps/scripts/2155.cs2 new file mode 100644 index 000000000..65ad801bc --- /dev/null +++ b/dumps/scripts/2155.cs2 @@ -0,0 +1,88 @@ +int script_2155() { + int ivar0; + ivar0 = getOtherCommonData(globalint_699, 859); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 860); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 861); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 862); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 863); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 864); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 865); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 866); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 867); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 868); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 869); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + ivar0 = getOtherCommonData(globalint_699, 870); + if (ivar0 == -1) { + return 1; + } + if (((boolean)script_2156(ivar0))) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/2156.cs2 b/dumps/scripts/2156.cs2 new file mode 100644 index 000000000..d6fd5d5a0 --- /dev/null +++ b/dumps/scripts/2156.cs2 @@ -0,0 +1,8 @@ +int script_2156(int arg0) { + int ivar1; + ivar1 = script_2193(arg0); + if (ivar1 == 2) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/2157.cs2 b/dumps/scripts/2157.cs2 new file mode 100644 index 000000000..9925993ff --- /dev/null +++ b/dumps/scripts/2157.cs2 @@ -0,0 +1,3 @@ +int script_2157(int arg0,int arg1) { + return script_2158(arg0, 1, arg1); +} diff --git a/dumps/scripts/2158.cs2 b/dumps/scripts/2158.cs2 new file mode 100644 index 000000000..4737e3f91 --- /dev/null +++ b/dumps/scripts/2158.cs2 @@ -0,0 +1,9 @@ +int script_2158(int arg0,int arg1,int arg2) { + if (arg0 < arg1) { + return 0; + } + if (arg0 < arg2) { + return 1; + } + return 2; +} diff --git a/dumps/scripts/2159.cs2 b/dumps/scripts/2159.cs2 new file mode 100644 index 000000000..f22778b4c --- /dev/null +++ b/dumps/scripts/2159.cs2 @@ -0,0 +1,9 @@ +int script_2159(int arg0,int arg1,int arg2,int arg3) { + if (((boolean)arg0) && ((boolean)arg2)) { + return 0; + } + if ((arg0 < arg1) && (arg2 < arg3)) { + return 1; + } + return 2; +} diff --git a/dumps/scripts/216.cs2 b/dumps/scripts/216.cs2 new file mode 100644 index 000000000..1d0c4131a --- /dev/null +++ b/dumps/scripts/216.cs2 @@ -0,0 +1,24 @@ +void script_216() { + globalint_790 = 1; + setWidgetIsHidden(true, new WidgetPointer(594,61)); + setWidgetIsHidden(true, new WidgetPointer(594,34)); + setWidgetIsHidden(true, new WidgetPointer(594,33)); + setWidgetIsHidden(true, new WidgetPointer(594,148)); + setWidgetIsHidden(true, new WidgetPointer(594,149)); + setWidgetIsHidden(true, new WidgetPointer(594,150)); + setWidgetIsHidden(true, new WidgetPointer(594,151)); + setWidgetIsHidden(true, new WidgetPointer(594,165)); + setWidgetIsHidden(true, new WidgetPointer(594,166)); + setWidgetIsHidden(true, new WidgetPointer(594,104)); + setWidgetIsHidden(true, new WidgetPointer(594,120)); + setWidgetIsHidden(true, new WidgetPointer(594,62)); + setWidgetIsHidden(true, new WidgetPointer(594,117)); + setWidgetIsHidden(true, new WidgetPointer(594,121)); + if (((boolean)getLanguage())) { + setWidgetIsHidden(false, new WidgetPointer(594,61)); + script_217(); + } else { + setWidgetIsHidden(false, new WidgetPointer(594,33)); + } + return; +} diff --git a/dumps/scripts/2160.cs2 b/dumps/scripts/2160.cs2 new file mode 100644 index 000000000..fa7e8663c --- /dev/null +++ b/dumps/scripts/2160.cs2 @@ -0,0 +1,76 @@ +void script_2160(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + ivar1 = cs2method_3408(105, 74, 169, arg0); + if (ivar1 == -1) { + return; + } + ivar2 = getOtherCommonData(ivar1, 61); + if (ivar2 == -1) { + return; + } + ivar3 = getOtherCommonData(ivar1, 152); + ivar4 = getOtherCommonData(ivar1, 153); + deleteAllExtraChilds(new WidgetPointer(ivar3)); + ivar5 = 0; + ivar6 = 0; + ivar7 = -1; + ivar8 = -1; + ivar9 = 0; + if (isMember()) { + globalint_693 = bitconfig_4536; + } else { + globalint_693 = 0; + } + globalint_694 = bitconfig_4538; + globalint_1103 = bitconfig_7264; + globalint_692 = bitconfig_4537; + globalint_272 = getCommonDefinitionSize(ivar2); + while (ivar6 < globalint_272) { + ivar7 = cs2method_3408(105, 74, ivar2, ivar5); + createExtraChild(new WidgetPointer(ivar3), 4, ivar5); + if (ivar7 != -1) { + ivar6 = add(ivar6, 1); + ivar9 = script_2193(ivar5); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(0, 15, 1, 0); + setWidgetRGB(new Color(34, 34, 34)); + setWidgetFont(494); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(true); + setWidgetText(getOtherCommonData(ivar7, 845)); + if (((ivar8 == -1) && (ivar7 == 510)) && ((boolean)arg0)) { + ivar8 = getWidgetCustomChildArrayIndex(); + } + } else { + setWidgetHidden(1); + } + ivar5 = add(ivar5, 1); + } + globalint_273 = subtract(ivar5, 1); + while (ivar5 < add(globalint_273, 10)) { + createExtraChild(new WidgetPointer(ivar3), 4, ivar5); + setWidgetFont(496); + setWidgetSize(0, 30, 1, 0); + setWidgetSize(0, 20, 1, 0); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(""); + setWidgetRGB(new Color(255, 153, 0)); + setWidgetHidden(1); + setWidgetUnknownBoolean(true); + ivar5 = add(ivar5, 1); + } + script_2162(arg0, globalint_693, globalint_694, globalint_692, globalint_1103); + script_31(ivar4, ivar3, 792, 789, 790, 791, 773, 788); + if (ivar8 != -1) { + script_214(ivar3, ivar8); + } + return; +} diff --git a/dumps/scripts/2161.cs2 b/dumps/scripts/2161.cs2 new file mode 100644 index 000000000..3188023ca --- /dev/null +++ b/dumps/scripts/2161.cs2 @@ -0,0 +1,5 @@ +void script_2161(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 0; + return; +} diff --git a/dumps/scripts/2162.cs2 b/dumps/scripts/2162.cs2 new file mode 100644 index 000000000..dd1a78300 --- /dev/null +++ b/dumps/scripts/2162.cs2 @@ -0,0 +1,287 @@ +void script_2162(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + string svar0; + string svar1; + do { + flow_17: + ivar10 = 0; + ivar23 = 0; + if (((boolean)arg2)) { + ivar23 = subtract(ivar18, 1); + } + ivar24 = 5; + ivar25 = 0; + ivar26 = -1; + if (((boolean)arg0)) { + ivar26 = bitconfig_6913; + } else if (getOtherCommonData(ivar5, 693) > 0) { + ivar26 = subtract(bitconfig_697, multiply(1000, subtract(getOtherCommonData(ivar5, 693), 1))); + } else { + ivar26 = subtract(bitconfig_697, multiply(1000, subtract(arg0, 1))); + } + while (true) { + flow_24: + IF (((boolean)arg2)) + GOTO flow_25 + GOTO flow_26 + flow_25: + IF (ivar23 < ivar18) + GOTO flow_28 + flow_26: + IF (((boolean)arg2) && (ivar23 >= 0)) + GOTO flow_28 + break; + flow_28: + ivar21 = cs2method_3408(105, 105, ivar17, ivar23); + if (setWidgetRegister(new WidgetPointer(ivar7), add(add(globalint_273, ivar23), 1))) { + setWidgetPosition(0, ivar24, 0, 0); + svar0 = cs2method_3408(105, 115, ivar15, ivar21); + setWidgetText(svar0); + setWidgetHidden(0); + ivar24 = add(ivar24, getWidgetActualHeight()); + } + ivar13 = 0; + while (ivar11 < globalint_272) { + globalint_699 = cs2method_3408(105, 74, ivar6, globalarray_0[ivar10]); + if (globalint_699 != -1) { + ivar11 = add(ivar11, 1); + switch (arg1) { + flow_34: + case 0: + ivar22 = getOtherCommonData(globalint_699, 856); + if ((ivar22 == 4) && (standart_config_281 == 1000)) { + ivar22 = 0; + } + break; + case 1: + switch (arg0) { + case 1: + ivar22 = globalarray_1[ivar10]; + break; + case 3: + ivar22 = getOtherCommonData(globalint_699, 677); + } + break; + case 2: + SWITCH (arg0) { + case 1: + GOTO flow_43 + case 3: + GOTO flow_44 + } + break; + flow_43: + ivar22 = getOtherCommonData(globalint_699, 848); + break; + flow_44: + ivar22 = getOtherCommonData(globalint_699, 678); + } + if (ivar22 != ivar21) { + ivar14 = 0; + } + if ((((boolean)ivar14) && ((boolean)arg3)) && ((boolean)globalarray_1[ivar10])) { + ivar12 = script_2149(); + if (((boolean)ivar12)) { + ivar14 = 0; + } + } + if ((((boolean)ivar14) && ((boolean)arg4)) && (globalarray_1[ivar10] == 2)) { + ivar14 = 0; + } + if (((boolean)ivar14) && setWidgetRegister(new WidgetPointer(ivar7), globalarray_0[ivar10])) { + setWidgetPosition(10, ivar24, 0, 0); + setWidgetHidden(0); + if (((boolean)getOtherCommonData(globalint_699, 694))) { + if (((boolean)globalarray_1[ivar10])) { + setWidgetContextMenuOption(1, "View Quest Overview"); + setWidgetContextMenuOption(2, "View Quest Journal"); + setWidgetContextMenuOption(3, "Toggle Map Hint"); + } else if (((boolean)globalarray_1[ivar10])) { + setWidgetContextMenuOption(1, "View Quest Journal"); + setWidgetContextMenuOption(2, "View Quest Overview"); + setWidgetContextMenuOption(3, "Toggle Map Hints"); + } else { + setWidgetContextMenuOption(1, "View Quest Journal"); + setWidgetContextMenuOption(2, "View Quest Overview"); + setWidgetContextMenuOption(3, ""); + } + } else if (((boolean)globalarray_1[ivar10])) { + setWidgetContextMenuOption(2, "Toggle Map Hint"); + } else { + setWidgetContextMenuOption(2, ""); + } + setWidgetContextMenuOption(1, "View Quest Journal"); + setWidgetContextMenuOption(3, ""); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + if (globalarray_0[ivar10] == ivar26) { + setWidgetRGB(new Color(0, 255, 255)); + setScriptCallOnMouseExit(1949, new WidgetPointer(-32768,3), -2147483643, 65535, new WidgetPointer(ivar9), "IiiI"); + } else if (((boolean)globalarray_1[ivar10])) { + setWidgetRGB(new Color(255, 0, 0)); + setScriptCallOnMouseExit(1949, new WidgetPointer(-32768,3), -2147483643, 16711680, new WidgetPointer(ivar9), "IiiI"); + } else if (((boolean)globalarray_1[ivar10])) { + setWidgetRGB(new Color(255, 255, 0)); + setScriptCallOnMouseExit(1949, new WidgetPointer(-32768,3), -2147483643, 16776960, new WidgetPointer(ivar9), "IiiI"); + } else { + setWidgetRGB(new Color(0, 255, 0)); + setScriptCallOnMouseExit(1949, new WidgetPointer(-32768,3), -2147483643, 65280, new WidgetPointer(ivar9), "IiiI"); + } + ivar24 = add(ivar24, getWidgetActualHeight()); + ivar13 = add(ivar13, 1); + if ((((boolean)cs2method_3408(105, 105, ivar16, ivar21)) && (stringMethod4107(getOtherCommonData(globalint_699, 857), "") != 0)) && setWidgetRegister(new WidgetPointer(ivar7), add(add(globalint_273, ivar23), 1))) { + setWidgetText(getOtherCommonData(globalint_699, 857)); + } + ivar25 = add(ivar25, 1); + } + ivar14 = 1; + } + ivar10 = add(ivar10, 1); + } + if (ivar13 != 0) { + ivar24 = add(ivar24, 10); + } else { + if (setWidgetRegister(new WidgetPointer(ivar7), add(add(globalint_273, ivar23), 1))) { + setWidgetText(""); + setWidgetHidden(1); + } + ivar24 = subtract(ivar24, 20); + } + ivar10 = 0; + ivar11 = 0; + if (((boolean)arg2)) { + ivar23 = add(ivar23, 1); + } else { + ivar23 = subtract(ivar23, 1); + } + } + svar1 = ""; + if (((boolean)arg0)) { + if (ivar25 == globalint_272) { + svar1 = "Showing all " + intToStr(globalint_272) + " items"; + } else { + svar1 = "Showing " + intToStr(ivar25) + " of " + intToStr(globalint_272) + " items"; + } + if (((boolean)arg2)) { + svar1 = concat(svar1, " (reversed)"); + } + setWidgetText(new WidgetPointer(190,8), svar1); + } + IF (((boolean)globalint_695) || (ivar20 != add(ivar24, 5))) + GOTO flow_102 + IF (((boolean)arg2)) + GOTO flow_99 + GOTO flow_100 + flow_99: + IF (((boolean)globalint_694)) + GOTO flow_102 + flow_100: + IF (((boolean)arg2) && ((boolean)globalint_694)) + GOTO flow_102 + GOTO flow_103 + flow_102: + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar7)), add(ivar24, 5), new WidgetPointer(ivar7)); + ivar20 = ivar24; + cs2method2100(0, 0, new WidgetPointer(ivar7)); + script_31(ivar8, ivar7, 792, 789, 790, 791, 773, 788); + break; + flow_103: + cs2method2100(0, ivar19, new WidgetPointer(ivar7)); + } while (false); + if ((((arg1 == -1) || (arg2 == -1)) || (arg3 == -1)) || (arg4 == -1)) { + return; + } + globalarray_0 = new int[add(globalint_273, 1)]; + globalarray_1 = new int[add(globalint_273, 1)]; + ivar5 = cs2method_3408(105, 74, 169, arg0); + if (ivar5 == -1) { + return; + } + ivar6 = getOtherCommonData(ivar5, 61); + ivar7 = getOtherCommonData(ivar5, 152); + ivar8 = getOtherCommonData(ivar5, 153); + ivar9 = getOtherCommonData(ivar5, 670); + globalint_698 = script_1432(); + ivar10 = 0; + ivar11 = 0; + ivar12 = 1; + ivar13 = 0; + ivar14 = 1; + ivar15 = cs2method_3408(105, 103, getOtherCommonData(ivar5, 673), arg1); + ivar16 = cs2method_3408(105, 103, getOtherCommonData(ivar5, 676), arg1); + ivar17 = cs2method_3408(105, 103, getOtherCommonData(ivar5, 675), arg1); + if (ivar17 == -1) { + ivar17 = 223; + } + if (ivar15 == -1) { + return; + } + ivar18 = getCommonDefinitionSize(ivar15); + ivar19 = cs2method2601(new WidgetPointer(ivar7)); + ivar20 = getWidgetScrollMaxV(new WidgetPointer(ivar7)); + ivar21 = 0; + ivar22 = 0; + svar0 = ""; + script_2164(arg0); + while (ivar10 <= globalint_273) { + globalarray_0[ivar10] = ivar10; + ivar10 = add(ivar10, 1); + } + ivar10 = 0; + script_2163(0, ivar6, 0, globalint_273); + switch (arg0) { + while (true) { + case 1: + if (ivar10 <= globalint_273) { + globalarray_0[ivar10] = script_2193(globalarray_0[ivar10]); + ivar10 = add(ivar10, 1); + } + } + flow_14: + GOTO flow_17 + while (true) { + case 3: + if (ivar10 <= globalint_273) { + globalarray_0[ivar10] = 0; + ivar10 = add(ivar10, 1); + } + } + } + if (((boolean)arg0)) { + globalint_692 = arg3; + globalint_1103 = arg4; + globalint_694 = arg2; + if (((boolean)globalint_692)) { + setWidgetSprite(699, new WidgetPointer(190,10)); + } else { + setWidgetSprite(697, new WidgetPointer(190,10)); + } + if (((boolean)globalint_1103)) { + setWidgetSprite(699, new WidgetPointer(190,12)); + } else { + setWidgetSprite(697, new WidgetPointer(190,12)); + } + } + globalint_695 = 0; + return; +} diff --git a/dumps/scripts/2163.cs2 b/dumps/scripts/2163.cs2 new file mode 100644 index 000000000..24d700637 --- /dev/null +++ b/dumps/scripts/2163.cs2 @@ -0,0 +1,44 @@ +void script_2163(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + string svar1; + ivar4 = divide(add(arg2, arg3), 2); + ivar5 = globalarray_0[ivar4]; + globalarray_0[ivar4] = globalarray_0[arg3]; + globalarray_0[arg3] = ivar5; + ivar6 = arg2; + ivar7 = arg2; + ivar8 = -1; + svar0 = "null"; + svar1 = "null"; + svar1 = lower(getOtherCommonData(cs2method_3408(105, 74, arg1, ivar5), 846)); + if (((boolean)stringMethod4107(svar1, ""))) { + svar1 = lower(getOtherCommonData(cs2method_3408(105, 74, arg1, ivar5), 845)); + } + while (ivar7 < arg3) { + svar0 = lower(getOtherCommonData(cs2method_3408(105, 74, arg1, globalarray_0[ivar7]), 846)); + if (((boolean)stringMethod4107(svar0, ""))) { + svar0 = lower(getOtherCommonData(cs2method_3408(105, 74, arg1, globalarray_0[ivar7]), 845)); + } + if (stringMethod4107(svar0, svar1) < bitAnd(ivar7, 1)) { + ivar8 = globalarray_0[ivar7]; + globalarray_0[ivar7] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar8; + ivar6 = add(ivar6, 1); + } + ivar7 = add(ivar7, 1); + } + globalarray_0[arg3] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar5; + if (arg2 < subtract(ivar6, 1)) { + script_2163(0, arg1, arg2, subtract(ivar6, 1)); + } + if (add(ivar6, 1) < arg3) { + script_2163(0, arg1, add(ivar6, 1), arg3); + } + return; +} diff --git a/dumps/scripts/2164.cs2 b/dumps/scripts/2164.cs2 new file mode 100644 index 000000000..45ac0516d --- /dev/null +++ b/dumps/scripts/2164.cs2 @@ -0,0 +1,18 @@ +void script_2164(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar1 = cs2method_3408(105, 74, 169, arg0); + ivar2 = getOtherCommonData(ivar1, 61); + ivar3 = getOtherCommonData(ivar1, 152); + ivar4 = 0; + while (ivar4 < add(globalint_273, 10)) { + if (setWidgetRegister(new WidgetPointer(ivar3), ivar4)) { + setWidgetPosition(0, 0, 0, 0); + setWidgetHidden(1); + } + ivar4 = add(ivar4, 1); + } + return; +} diff --git a/dumps/scripts/2165.cs2 b/dumps/scripts/2165.cs2 new file mode 100644 index 000000000..b55ab262b --- /dev/null +++ b/dumps/scripts/2165.cs2 @@ -0,0 +1,6 @@ +void script_2165() { + script_2160(1); + setScriptCallOnConfigChange(2169, 1384, 1, "Y", new WidgetPointer(190,18)); + setScriptCallOnGlobalConfigChange(2169, 695, 1, "Y", new WidgetPointer(190,18)); + return; +} diff --git a/dumps/scripts/2166.cs2 b/dumps/scripts/2166.cs2 new file mode 100644 index 000000000..d449da435 --- /dev/null +++ b/dumps/scripts/2166.cs2 @@ -0,0 +1,4 @@ +void script_2166() { + setWidgetText(new WidgetPointer(190,2), "Quest Points: " + intToStr(standart_config_101) + " / " + intToStr(standart_config_904)); + return; +} diff --git a/dumps/scripts/2167.cs2 b/dumps/scripts/2167.cs2 new file mode 100644 index 000000000..03ec3a71e --- /dev/null +++ b/dumps/scripts/2167.cs2 @@ -0,0 +1,4 @@ +void script_2167(int arg0,int arg1) { + script_2161(1, arg0, arg1); + return; +} diff --git a/dumps/scripts/2168.cs2 b/dumps/scripts/2168.cs2 new file mode 100644 index 000000000..281d5027c --- /dev/null +++ b/dumps/scripts/2168.cs2 @@ -0,0 +1,10 @@ +void script_2168() { + if (isMember()) { + messageType0("More advanced sorting options are available on a members' world."); + } else { + if (standart_config_281 < 1000) { + messageType0("More advanced sorting options are available after the Tutorial."); + } + } + return; +} diff --git a/dumps/scripts/2169.cs2 b/dumps/scripts/2169.cs2 new file mode 100644 index 000000000..f5febdb04 --- /dev/null +++ b/dumps/scripts/2169.cs2 @@ -0,0 +1,18 @@ +void script_2169() { + int ivar0; + if (isMember()) { + globalint_693 = bitconfig_4536; + } else { + globalint_693 = 0; + } + globalint_694 = bitconfig_4538; + globalint_692 = bitconfig_4537; + script_2162(1, globalint_693, globalint_694, globalint_692, globalint_1103); + ivar0 = 0; + if (isMember() && (standart_config_281 >= 1000)) { + script_944(1, globalint_693, 2, 12451856, 12451854, 12451855, -1, 897, 788, 788, 1040, 16777215, 16776960, 494, 792, 789, 790, 791, 773, 788); + } else { + script_1355(12451856, 12451854, 12451855, -1, 897, 16776960, 494, "Free/Members"); + } + return; +} diff --git a/dumps/scripts/217.cs2 b/dumps/scripts/217.cs2 new file mode 100644 index 000000000..ca138007a --- /dev/null +++ b/dumps/scripts/217.cs2 @@ -0,0 +1,10 @@ +void script_217() { + setWidgetText(new WidgetPointer(594,106), "Reporting: " + globalstring_24); + setWidgetText(new WidgetPointer(594,71), globalstring_24); + if (stringMethod4107(globalstring_24, "") != 0) { + setWidgetIsHidden(true, new WidgetPointer(594,81)); + } else { + setWidgetIsHidden(false, new WidgetPointer(594,81)); + } + return; +} diff --git a/dumps/scripts/2170.cs2 b/dumps/scripts/2170.cs2 new file mode 100644 index 000000000..1a1e8f150 --- /dev/null +++ b/dumps/scripts/2170.cs2 @@ -0,0 +1,4 @@ +void script_2170() { + script_2172(0); + return; +} diff --git a/dumps/scripts/2171.cs2 b/dumps/scripts/2171.cs2 new file mode 100644 index 000000000..6f99d30f7 --- /dev/null +++ b/dumps/scripts/2171.cs2 @@ -0,0 +1,6 @@ +void script_2171(int arg0) { + if (((boolean)arg0)) { + script_2172(0); + } + return; +} diff --git a/dumps/scripts/2172.cs2 b/dumps/scripts/2172.cs2 new file mode 100644 index 000000000..850dcc11e --- /dev/null +++ b/dumps/scripts/2172.cs2 @@ -0,0 +1,20 @@ +void script_2172(int arg0) { + int ivar1; + int ivar2; + ivar1 = globalint_692; + ivar2 = globalint_1103; + script_41(12451860); + if (((boolean)arg0)) { + if (((boolean)globalint_692)) { + ivar1 = 0; + } else { + ivar1 = 1; + } + } else if (((boolean)globalint_1103)) { + ivar2 = 0; + } else { + ivar2 = 1; + } + script_2162(1, globalint_693, globalint_694, ivar1, ivar2); + return; +} diff --git a/dumps/scripts/2173.cs2 b/dumps/scripts/2173.cs2 new file mode 100644 index 000000000..41c67c836 --- /dev/null +++ b/dumps/scripts/2173.cs2 @@ -0,0 +1,4 @@ +void script_2173() { + script_2174(); + return; +} diff --git a/dumps/scripts/2174.cs2 b/dumps/scripts/2174.cs2 new file mode 100644 index 000000000..996b678bf --- /dev/null +++ b/dumps/scripts/2174.cs2 @@ -0,0 +1,18 @@ +void script_2174() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 141; + ivar2 = getCommonDefinitionSize(964); + while (ivar0 < ivar2) { + if (((boolean)script_2189(ivar0))) { + ivar1 = 255; + } else { + ivar1 = 141; + } + cs2method2103(ivar1, cs2method_3408(105, 73, 964, ivar0)); + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/2175.cs2 b/dumps/scripts/2175.cs2 new file mode 100644 index 000000000..469031f61 --- /dev/null +++ b/dumps/scripts/2175.cs2 @@ -0,0 +1,5 @@ +void script_2175() { + script_2174(); + script_2186(); + return; +} diff --git a/dumps/scripts/2176.cs2 b/dumps/scripts/2176.cs2 new file mode 100644 index 000000000..3105f64eb --- /dev/null +++ b/dumps/scripts/2176.cs2 @@ -0,0 +1,23 @@ +void script_2176(int arg0) { + string svar0; + svar0 = ""; + switch (arg0) { + case 12451850: + case 12451849: + if (((boolean)globalint_692)) { + svar0 = "Click to hide the quests you cannot start." + "
" + "
" + "Some recommended stats and abilities (such as combat levels) are left for you to decide."; + } else { + svar0 = "Click to show all quests regardless of requirements."; + } + break; + case 12451851: + case 12451852: + if (((boolean)globalint_692)) { + svar0 = "Click to hide the quests you have completed."; + } else { + svar0 = "Click to show all quests regardless of completion status."; + } + } + script_569(12451859, -1, 12451860, 25, 450, svar0); + return; +} diff --git a/dumps/scripts/2177.cs2 b/dumps/scripts/2177.cs2 new file mode 100644 index 000000000..1893db8f6 --- /dev/null +++ b/dumps/scripts/2177.cs2 @@ -0,0 +1,6 @@ +void script_2177(int arg0) { + if (setWidgetRegister(new WidgetPointer(190,18), arg0)) { + setScriptCallOnGameloop(2178, arg0, getWidgetText(), "is"); + } + return; +} diff --git a/dumps/scripts/2178.cs2 b/dumps/scripts/2178.cs2 new file mode 100644 index 000000000..9bc28f338 --- /dev/null +++ b/dumps/scripts/2178.cs2 @@ -0,0 +1,13 @@ +void script_2178(int arg0,string arg1) { + if (setWidgetRegister(new WidgetPointer(190,18), arg0)) { + if (mod(getClientCycle(), 20) > 9) { + setWidgetText(""); + if (mod(getClientCycle(), 20) == 10) { + playSoundEffect(5009, 1, 0); + } + } else { + setWidgetText(arg1); + } + } + return; +} diff --git a/dumps/scripts/2179.cs2 b/dumps/scripts/2179.cs2 new file mode 100644 index 000000000..822cd1205 --- /dev/null +++ b/dumps/scripts/2179.cs2 @@ -0,0 +1,4 @@ +void script_2179(int arg0) { + script_2180(arg0); + return; +} diff --git a/dumps/scripts/218.cs2 b/dumps/scripts/218.cs2 new file mode 100644 index 000000000..160c4a3bc --- /dev/null +++ b/dumps/scripts/218.cs2 @@ -0,0 +1,4 @@ +void script_218() { + script_216(); + return; +} diff --git a/dumps/scripts/2180.cs2 b/dumps/scripts/2180.cs2 new file mode 100644 index 000000000..3ae365537 --- /dev/null +++ b/dumps/scripts/2180.cs2 @@ -0,0 +1,9 @@ +void script_2180(int arg0) { + int ivar1; + ivar1 = cs2method_3408(105, 74, 2252, arg0); + if (setWidgetRegister(new WidgetPointer(190,18), arg0)) { + setWidgetText(getOtherCommonData(ivar1, 845)); + setScriptCallOnGameloop(-1, ""); + } + return; +} diff --git a/dumps/scripts/2181.cs2 b/dumps/scripts/2181.cs2 new file mode 100644 index 000000000..a2bd2c58d --- /dev/null +++ b/dumps/scripts/2181.cs2 @@ -0,0 +1,9 @@ +void script_2181() { + int ivar0; + ivar0 = 0; + while (ivar0 <= globalint_273) { + script_2180(ivar0); + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/2182.cs2 b/dumps/scripts/2182.cs2 new file mode 100644 index 000000000..9552f3029 --- /dev/null +++ b/dumps/scripts/2182.cs2 @@ -0,0 +1,5 @@ +void script_2182(int arg0,int arg1,int arg2) { + cs2method2100(0, 0, new WidgetPointer(arg0)); + script_2184(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/2183.cs2 b/dumps/scripts/2183.cs2 new file mode 100644 index 000000000..d6af64dea --- /dev/null +++ b/dumps/scripts/2183.cs2 @@ -0,0 +1,4 @@ +void script_2183(int arg0,int arg1,int arg2) { + script_2184(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/2184.cs2 b/dumps/scripts/2184.cs2 new file mode 100644 index 000000000..fdbbb8499 --- /dev/null +++ b/dumps/scripts/2184.cs2 @@ -0,0 +1,89 @@ +void script_2184(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar3 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(5, 36)), 6); + ivar4 = 0; + ivar5 = -1; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + if (getContainerFreeSlots(90) < getItemContainerLength(90)) { + while (ivar4 < getItemContainerLength(90)) { + ivar6 = getItemAmtInSlot(90, ivar4); + createExtraChild(new WidgetPointer(arg0), 5, multiply(ivar4, 2)); + createExtraChild(new WidgetPointer(arg0), 4, add(multiply(ivar4, 2), 1)); + if (ivar6 > 0) { + ivar5 = getItemIdInSlot(90, ivar4); + setWidgetSize(36, 32, 0, 0); + ivar8 = add(multiply(divide(ivar4, 5), add(32, 40)), 2); + setWidgetPosition(add(multiply(mod(ivar4, 5), add(36, ivar3)), ivar3), ivar8, 0, 0); + setWidgetHidden(0); + setItemOnWidgetMethod1200(ivar5, ivar6); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + setWidgetContextMenuOption(1, "Remove-1"); + setWidgetContextMenuOption(2, "Remove-5"); + setWidgetContextMenuOption(3, "Remove-10"); + setWidgetContextMenuOption(4, "Remove-All"); + setWidgetContextMenuOption(5, "Remove-X"); + setWidgetContextMenuOption(10, "Examine"); + cs2method1305("" + getItemName(ivar5)); + setWidgetSize(subtract(add(36, ivar3), 6), 40, 0, 0); + setWidgetPosition(add(add(multiply(mod(ivar4, 5), add(36, ivar3)), divide(ivar3, 2)), 3), add(ivar8, 32), 0, 0); + setWidgetHidden(0); + setWidgetTextAlignment(1, 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + ivar7 = script_2185(ivar4); + if (ivar6 > 1) { + setWidgetText(formatNumber(ivar6, 1) + " x " + formatNumber(ivar7, 1) + "
" + "= " + formatNumber(multiply(ivar6, ivar7), 1)); + } else { + setWidgetText(formatNumber(ivar7, 1)); + } + } else { + setWidgetSize(0, 0, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetHidden(1); + setWidgetSize(0, 0, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetHidden(1); + } + ivar4 = add(ivar4, 1); + } + } else { + createExtraChild(new WidgetPointer(arg0), 4, 0); + setWidgetSize(0, getWidgetActualHeight(new WidgetPointer(arg0)), 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(495); + setWidgetText("Click on items in your inventory to check their values."); + } + ivar8 = add(add(ivar8, 32), 40); + if (ivar8 > getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetScrollMax(0, ivar8, new WidgetPointer(arg0)); + setWidgetPosition(-8, getWidgetActualY(new WidgetPointer(arg0)), 1, 0, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + if (setWidgetRegister(new WidgetPointer(arg1), 1)) { + script_37(arg1, arg0, cs2method2601(new WidgetPointer(arg0)), 1); + } + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + setWidgetPosition(0, getWidgetActualY(new WidgetPointer(arg0)), 1, 0, new WidgetPointer(arg0)); + } + if (globalint_728 < 0) { + setWidgetText(new WidgetPointer(arg2), "Total value:" + "
" + "---"); + } else { + setWidgetText(new WidgetPointer(arg2), "Total value:" + "
" + formatNumber(globalint_728, 1)); + } + return; +} diff --git a/dumps/scripts/2185.cs2 b/dumps/scripts/2185.cs2 new file mode 100644 index 000000000..c77a5b4b1 --- /dev/null +++ b/dumps/scripts/2185.cs2 @@ -0,0 +1,61 @@ +int script_2185(int arg0) { + switch (arg0) { + case 0: + return globalint_700; + case 1: + return globalint_701; + case 2: + return globalint_702; + case 3: + return globalint_703; + case 4: + return globalint_704; + case 5: + return globalint_705; + case 6: + return globalint_706; + case 7: + return globalint_707; + case 8: + return globalint_708; + case 9: + return globalint_709; + case 10: + return globalint_710; + case 11: + return globalint_711; + case 12: + return globalint_712; + case 13: + return globalint_713; + case 14: + return globalint_714; + case 15: + return globalint_715; + case 16: + return globalint_716; + case 17: + return globalint_717; + case 18: + return globalint_718; + case 19: + return globalint_719; + case 20: + return globalint_720; + case 21: + return globalint_721; + case 22: + return globalint_722; + case 23: + return globalint_723; + case 24: + return globalint_724; + case 25: + return globalint_725; + case 26: + return globalint_726; + case 27: + return globalint_727; + } + return 0; +} diff --git a/dumps/scripts/2186.cs2 b/dumps/scripts/2186.cs2 new file mode 100644 index 000000000..499007341 --- /dev/null +++ b/dumps/scripts/2186.cs2 @@ -0,0 +1,57 @@ +void script_2186() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + ivar0 = 60293120; + deleteAllExtraChilds(new WidgetPointer(ivar0)); + ivar1 = 0; + ivar2 = 0; + ivar1 = divide(subtract(getWidgetActualWidth(new WidgetPointer(ivar0)), multiply(36, 4)), 3); + ivar2 = divide(subtract(getWidgetActualHeight(new WidgetPointer(ivar0)), multiply(32, 7)), 6); + deleteAllExtraChilds(new WidgetPointer(924,35)); + ivar3 = getCommonDefinitionSize(962); + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = -1; + ivar9 = -1; + while (ivar4 < ivar3) { + if (setWidgetRegister(cs2method_3408(105, 73, 962, ivar4))) { + ivar5 = getWidgetActualX(); + ivar6 = getWidgetActualY(); + ivar8 = cs2method_3408(105, 103, 963, ivar4); + ivar7 = script_2187(ivar4); + createExtraChild(new WidgetPointer(924,35), 5, ivar4); + setWidgetPosition(add(ivar5, 0), add(ivar6, 2), 0, 0); + setWidgetSize(36, 32, 0, 0); + setWidgetBorderThickness(1); + if (ivar7 != 0) { + ivar9 = cs2method_3408(105, 79, ivar8, ivar7); + cs2method1305(getItemName(ivar9)); + setWidgetContextMenuOption(1, "Withdraw-1"); + if (ivar8 == 958) { + setWidgetContextMenuOption(2, "Withdraw-5"); + setWidgetContextMenuOption(3, "Withdraw-10"); + setWidgetContextMenuOption(4, "Withdraw-All"); + setWidgetContextMenuOption(5, "Withdraw-X"); + setItemOnWidgetMethod1200(ivar9, script_2188(ivar4)); + } else { + setItemOnWidgetMethod1205(ivar9, 1); + } + } + } else { + messageType0("Nothing happens, as if something is wrong."); + return; + } + ivar4 = add(ivar4, 1); + } + return; +} diff --git a/dumps/scripts/2187.cs2 b/dumps/scripts/2187.cs2 new file mode 100644 index 000000000..b39dcac20 --- /dev/null +++ b/dumps/scripts/2187.cs2 @@ -0,0 +1,25 @@ +int script_2187(int arg0) { + switch (arg0) { + case 0: + return bitconfig_7301; + case 1: + return bitconfig_7302; + case 2: + return bitconfig_7303; + case 3: + return bitconfig_7304; + case 4: + return bitconfig_7305; + case 5: + return bitconfig_7298; + case 6: + return bitconfig_7299; + case 7: + return bitconfig_7300; + case 8: + return bitconfig_7296; + case 9: + return bitconfig_7297; + } + return -1; +} diff --git a/dumps/scripts/2188.cs2 b/dumps/scripts/2188.cs2 new file mode 100644 index 000000000..3d707874f --- /dev/null +++ b/dumps/scripts/2188.cs2 @@ -0,0 +1,11 @@ +int script_2188(int arg0) { + switch (arg0) { + case 5: + return bitconfig_7307; + case 6: + return bitconfig_7308; + case 7: + return bitconfig_7309; + } + return 1; +} diff --git a/dumps/scripts/2189.cs2 b/dumps/scripts/2189.cs2 new file mode 100644 index 000000000..cb1ceae83 --- /dev/null +++ b/dumps/scripts/2189.cs2 @@ -0,0 +1,70 @@ +int script_2189(int arg0) { + switch (bitconfig_7306) { + flow_1: + case 1: + switch (arg0) { + case 0: + case 5: + return 1; + } + break; + case 2: + switch (arg0) { + case 0: + case 5: + case 1: + return 1; + } + break; + case 3: + switch (arg0) { + case 0: + case 1: + case 2: + case 5: + case 6: + return 1; + } + break; + case 4: + switch (arg0) { + case 0: + case 1: + case 2: + case 3: + case 5: + case 6: + case 7: + case 8: + return 1; + } + break; + case 5: + SWITCH (arg0) { + case 0: + GOTO flow_14 + case 1: + GOTO flow_14 + case 2: + GOTO flow_14 + case 3: + GOTO flow_14 + case 4: + GOTO flow_14 + case 5: + GOTO flow_14 + case 6: + GOTO flow_14 + case 7: + GOTO flow_14 + case 8: + GOTO flow_14 + case 9: + GOTO flow_14 + } + break; + flow_14: + return 1; + } + return 0; +} diff --git a/dumps/scripts/219.cs2 b/dumps/scripts/219.cs2 new file mode 100644 index 000000000..c7b95b403 --- /dev/null +++ b/dumps/scripts/219.cs2 @@ -0,0 +1,4 @@ +void script_219() { + script_220(); + return; +} diff --git a/dumps/scripts/2190.cs2 b/dumps/scripts/2190.cs2 new file mode 100644 index 000000000..7e8d26d29 --- /dev/null +++ b/dumps/scripts/2190.cs2 @@ -0,0 +1,91 @@ +void script_2190(int arg0,int arg1,int arg2,string arg3,string arg4,string arg5,string arg6) { + int ivar3; + int ivar4; + if (((arg1 != -1) && (arg1 != 6)) && (strLength(arg3) <= 0)) { + return; + } + script_3018(); + setWidgetText(new WidgetPointer(906,149), arg3); + if (stringMethod4107(arg4, "") != 0) { + if ((arg1 != -1) && (arg1 != 6)) { + globalstring_277 = arg4; + } else { + globalstring_277 = arg4; + } + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(906,151), replaceLtGt(globalstring_277)); + } else { + setWidgetText(new WidgetPointer(906,151), globalstring_277); + } + } + if ((arg1 == 6) || (arg1 == 10)) { + setWidgetText(new WidgetPointer(906,159), "Yes"); + setWidgetContextMenuOption(1, new WidgetPointer(906,159), "Yes"); + setWidgetText(new WidgetPointer(906,161), "No"); + setWidgetContextMenuOption(1, new WidgetPointer(906,161), "No"); + } else { + if (((boolean)arg1)) { + setWidgetSize(386, 136, 0, 0, new WidgetPointer(906,147)); + setWidgetSize(0, 12, 1, 0, new WidgetPointer(906,151)); + globalint_1650 = 1; + } + } + if (((boolean)arg2)) { + setWidgetSize(0, 0, 1, 1, new WidgetPointer(906,155)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(906,159)); + setWidgetIsHidden(true, new WidgetPointer(906,160)); + setWidgetIsHidden(true, new WidgetPointer(906,161)); + } + setWidgetIsHidden(false, new WidgetPointer(906,41)); + ivar3 = 0; + switch (arg1) { + case 0: + ivar3 = 0; + break; + case 1: + case 2: + case 3: + case 4: + case 5: + case 7: + case 9: + ivar3 = 2; + } + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + script_3161(0); + } else { + if (isWidgetHidden(cs2method_3408(105, 73, 941, 3))) { + script_4556(0); + } + } + setScriptCallOnKeyPress(3022, -2147483640, false, new WidgetPointer(-32768,3), ivar3, arg1, arg5, "izIiis", new WidgetPointer(906,151)); + setScriptCallOnClickContextMenu(3019, arg1, arg5, "is", new WidgetPointer(906,155)); + ivar4 = 0; + if ((arg1 != -1) && (arg1 != 6)) { + globalint_1097 = strLength(globalstring_277); + setScriptCallOnMousePressed(1874, -2147483647, new WidgetPointer(906,151), new WidgetPointer(906,152), "iII", new WidgetPointer(906,151)); + script_1875(59375767, 59375768, globalstring_277); + setWidgetIsHidden(true, new WidgetPointer(906,152)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(906,147)), 136, 0, 0, new WidgetPointer(906,147)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(906,153)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(906,153)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(906,153)); + setWidgetIsHidden(true, new WidgetPointer(906,153)); + } else { + globalint_1097 = 0; + setWidgetIsHidden(true, new WidgetPointer(906,152)); + if ((strLength(arg6) > 0) && (strLength(globalstring_277) > 0)) { + ivar4 = max(44, multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(906,150)), 494, globalstring_277), 13)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(906,150)), ivar4, 0, 0, new WidgetPointer(906,150)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(906,147)), add(ivar4, 95), 0, 0, new WidgetPointer(906,147)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(906,153)), add(add(getWidgetActualY(new WidgetPointer(906,150)), ivar4), 5), 0, 0, new WidgetPointer(906,153)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(906,153)), 13, 0, 0, new WidgetPointer(906,153)); + setWidgetText(new WidgetPointer(906,153), "" + arg6 + ""); + setWidgetRGB(new Color(44, 111, 248), new WidgetPointer(906,153)); + setScriptCallOnMouseEntered(1333, new WidgetPointer(906,153), arg6, 1, "Is1", new WidgetPointer(906,153)); + setScriptCallOnMouseExit(1333, new WidgetPointer(906,153), arg6, 0, "Is1", new WidgetPointer(906,153)); + setWidgetIsHidden(false, new WidgetPointer(906,153)); + } + } + return; +} diff --git a/dumps/scripts/2191.cs2 b/dumps/scripts/2191.cs2 new file mode 100644 index 000000000..f89f432c0 --- /dev/null +++ b/dumps/scripts/2191.cs2 @@ -0,0 +1,22 @@ +void script_2191(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11) { + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + ivar12 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg1))); + ivar13 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg2))); + ivar14 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg3))); + ivar15 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg4))); + ivar16 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg5))); + ivar17 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg10))); + script_2337(arg0); + setScriptCallOnGameloop(2336, new WidgetPointer(arg0), getDisplayMode(), "Ii", new WidgetPointer(arg0)); + script_2335(arg0, arg2, arg3, arg4, arg5, ivar12, ivar13, ivar14, ivar15, ivar16, arg6, arg7, arg8, arg9, arg10, arg11, ivar17); + setScriptCallOnConfigChange(2333, new WidgetPointer(arg0), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), ivar12, ivar13, ivar14, ivar15, ivar16, new WidgetPointer(arg6), new WidgetPointer(arg7), new WidgetPointer(arg8), new WidgetPointer(arg9), new WidgetPointer(arg10), new WidgetPointer(arg11), ivar17, 1048, 1058, 2040, 3, "IIIIIiiiiiIIIIIIiY", new WidgetPointer(arg0)); + setWidgetSize(100, 75, 0, 0, new WidgetPointer(601,0)); + cs2method2103(255, new WidgetPointer(601,1)); + globalint_1435 = 255; + return; +} diff --git a/dumps/scripts/2192.cs2 b/dumps/scripts/2192.cs2 new file mode 100644 index 000000000..b60cc6ed6 --- /dev/null +++ b/dumps/scripts/2192.cs2 @@ -0,0 +1,10 @@ +void script_2192(int arg0,int arg1) { + if (((boolean)arg0)) { + setScriptCallOnMousePressed(2355, 1, arg1, "1i", new WidgetPointer(916,21)); + setWidgetHFlip(0, new WidgetPointer(916,22)); + } else { + setScriptCallOnMousePressed(2355, 0, arg1, "1i", new WidgetPointer(916,21)); + setWidgetHFlip(1, new WidgetPointer(916,22)); + } + return; +} diff --git a/dumps/scripts/2193.cs2 b/dumps/scripts/2193.cs2 new file mode 100644 index 000000000..522beff01 --- /dev/null +++ b/dumps/scripts/2193.cs2 @@ -0,0 +1,379 @@ +int script_2193(int arg0) { + switch (arg0) { + case 147: + return script_2157(standart_config_281, 1000); + case 159: + return script_2157(standart_config_130, 4); + case 1: + return script_2157(standart_config_29, 2); + case 2: + return script_2157(bitconfig_2561, 3); + case 3: + return script_2157(standart_config_31, 100); + case 4: + return script_2157(standart_config_176, 10); + case 5: + return script_2157(standart_config_32, 3); + case 6: + return script_2157(bitconfig_2378, 6); + case 7: + return script_2157(standart_config_160, 2); + case 8: + return script_2157(standart_config_122, 7); + case 9: + return script_2157(standart_config_71, 4); + case 10: + return script_2157(standart_config_273, 110); + case 11: + return script_2157(standart_config_107, 5); + case 13: + return script_2157(standart_config_63, 6); + case 15: + return script_2159(standart_config_145, 7, standart_config_146, 4); + case 16: + return script_2157(bitconfig_6914, 3); + case 18: + return script_2157(bitconfig_3185, 240); + case 19: + return script_2157(bitconfig_299, 110); + case 20: + return script_2157(standart_config_293, 65); + case 21: + return script_2157(standart_config_68, 16); + case 22: + return script_2157(standart_config_655, 140); + case 23: + return script_2157(standart_config_10, 8); + case 24: + return script_2157(bitconfig_3274, 130); + case 25: + return script_2157(bitconfig_487, 14); + case 26: + if (standart_config_399 > 6) { + return 2; + } + if (((boolean)standart_config_399) && ((boolean)bitconfig_203)) { + return 0; + } + return 1; + case 27: + return script_2157(bitconfig_2573, 320); + case 28: + return script_2157(bitconfig_2258, 13); + case 29: + return script_2157(standart_config_314, 80); + case 30: + return script_2157(bitconfig_358, 15); + case 31: + return script_2157(bitconfig_1465, 80); + case 32: + return script_2157(standart_config_131, 9); + case 33: + return script_2157(standart_config_80, 4); + case 34: + return script_2157(standart_config_0, 11); + case 35: + return script_2157(standart_config_335, 110); + case 36: + return script_2157(bitconfig_2780, 40); + case 37: + if (isBitFlagged(standart_config_299, 20)) { + return 2; + } + if (isBitFlagged(standart_config_299, 1)) { + return 0; + } + return 1; + case 38: + return script_2157(bitconfig_2639, 11); + case 39: + return script_2157(bitconfig_1560, 70); + case 40: + return script_2157(bitconfig_2866, 200); + case 41: + return script_2157(bitconfig_2497, 60); + case 42: + return script_2157(bitconfig_1803, 90); + case 43: + return script_2157(bitconfig_2326, 90); + case 44: + return script_2157(standart_config_148, 11); + case 45: + return script_2157(bitconfig_334, 28); + case 46: + return script_2157(standart_config_17, 14); + case 47: + return script_2157(standart_config_11, 5); + case 48: + return script_2157(bitconfig_822, 140); + case 49: + return script_2157(standart_config_347, 10); + case 50: + return script_2157(standart_config_65, 10); + case 51: + return script_2157(bitconfig_961, 60); + case 52: + return script_2157(standart_config_180, 6); + case 53: + return script_2157(bitconfig_217, 8); + case 54: + return script_2157(bitconfig_571, 50); + case 55: + return script_2157(bitconfig_346, 10); + case 56: + return script_2157(standart_config_150, 160); + case 57: + return script_2157(bitconfig_1527, 160); + case 58: + return script_2157(standart_config_382, 11); + case 59: + return script_2157(standart_config_223, 9); + case 60: + return script_2157(standart_config_188, 15); + case 61: + return script_2157(standart_config_5, 10); + case 62: + return script_2157(bitconfig_34, 10); + case 63: + return script_2157(bitconfig_418, 26); + case 64: + return script_2157(bitconfig_1990, 430); + case 65: + return script_2157(standart_config_387, 105); + case 66: + return script_2157(standart_config_175, 12); + case 67: + return script_2157(standart_config_139, 75); + case 68: + return script_2157(standart_config_147, 6); + case 69: + return script_2157(bitconfig_532, 11); + case 70: + return script_2157(bitconfig_2448, 190); + case 71: + return script_2157(bitconfig_1383, 4); + case 72: + return script_2157(standart_config_14, 7); + case 73: + return script_2158(standart_config_365, 1, 9); + case 74: + return script_2157(standart_config_30, 80); + case 75: + return script_2157(bitconfig_260, 70); + case 76: + return script_2157(standart_config_517, 8); + case 77: + return script_2158(bitconfig_1103, 9, 60); + case 78: + return script_2157(standart_config_192, 2); + case 79: + return script_2157(bitconfig_2790, 320); + case 80: + return script_2157(standart_config_307, 110); + case 81: + return script_2157(standart_config_112, 7); + case 82: + return script_2157(standart_config_416, 280); + case 83: + return script_2157(standart_config_165, 29); + case 84: + return script_2157(standart_config_302, 60); + case 85: + return script_2157(bitconfig_6178, 4); + case 86: + return script_2157(bitconfig_1404, 127); + case 87: + return script_2157(bitconfig_1850, 5); + case 88: + return script_2157(bitconfig_657, 2); + case 89: + return script_2157(standart_config_328, 15); + case 90: + return script_2157(standart_config_402, 6); + case 91: + return script_2157(bitconfig_2140, 30); + case 92: + return script_2157(standart_config_600, 19); + case 93: + return script_2157(standart_config_76, 6); + case 94: + return script_2157(standart_config_159, 12); + case 95: + return script_2157(bitconfig_2610, 14); + case 96: + return script_2157(standart_config_339, 85); + case 97: + return script_2157(bitconfig_1372, 125); + case 98: + return script_2157(standart_config_60, 3); + case 99: + return script_2157(standart_config_116, 15); + case 100: + return script_2157(bitconfig_2011, 13); + case 101: + return script_2157(bitconfig_1444, 60); + case 102: + return script_2157(bitconfig_2098, 200); + case 103: + return script_2158(standart_config_320, 3, 6); + case 104: + return script_2157(bitconfig_1028, 70); + case 105: + return script_2157(bitconfig_451, 2); + case 106: + return script_2157(standart_config_26, 80); + case 107: + return script_2157(standart_config_359, 100); + case 108: + return script_2157(standart_config_197, 30); + case 109: + return script_2157(standart_config_226, 7); + case 110: + return script_2157(standart_config_111, 9); + case 111: + return script_2157(standart_config_200, 5); + case 112: + return script_2157(standart_config_385, 45); + case 113: + return script_2157(standart_config_317, 50); + case 114: + if (standart_config_161 == 10) { + return 2; + } + if (isBitFlagged(standart_config_162, 11)) { + return 0; + } + return 1; + case 115: + return script_2157(bitconfig_1051, 11); + case 116: + return script_2157(standart_config_212, 13); + case 117: + return script_2157(bitconfig_3293, 135); + case 118: + return script_2157(bitconfig_3311, 340); + case 119: + return script_2157(bitconfig_3337, 18); + case 120: + return script_2157(standart_config_980, 130); + case 121: + return script_2157(bitconfig_3523, 150); + case 122: + return script_2157(bitconfig_3534, 80); + case 123: + return script_2157(bitconfig_3550, 11); + case 124: + return script_2157(bitconfig_3618, 28); + case 125: + return script_2157(bitconfig_2783, 60); + case 126: + return script_2157(bitconfig_3888, 90); + case 127: + return script_2157(bitconfig_3954, 200); + case 128: + return script_2157(bitconfig_4055, 65); + case 129: + return script_2157(bitconfig_4105, 18); + case 130: + return script_2157(bitconfig_4230, 700); + case 131: + return script_2157(bitconfig_4302, 110); + case 132: + return script_2158(bitconfig_4321, 10, 200); + case 133: + return script_2157(bitconfig_4396, 60); + case 134: + return script_2157(bitconfig_4505, 100); + case 135: + return script_2157(bitconfig_4569, 500); + case 136: + return script_2157(bitconfig_4684, 150); + case 137: + return script_2157(bitconfig_4700, 63); + case 138: + return script_2157(bitconfig_4764, 250); + case 139: + return script_2157(bitconfig_4797, 100); + case 140: + return script_2157(bitconfig_5032, 80); + case 141: + return script_2157(bitconfig_5075, 20); + case 142: + return script_2157(bitconfig_5133, 90); + case 143: + return script_2157(bitconfig_5331, 35); + case 144: + return script_2157(bitconfig_5387, 250); + case 145: + return script_2157(bitconfig_5491, 910); + case 146: + return script_2157(bitconfig_5761, 30); + case 148: + return script_2157(bitconfig_5733, 60); + case 149: + return script_2158(bitconfig_6001, 3, 45); + case 150: + return script_2158(bitconfig_6048, 10, 250); + case 155: + return script_2157(bitconfig_6112, 60); + case 156: + return script_2157(bitconfig_6289, 240); + case 157: + return script_2157(bitconfig_6775, 90); + case 151: + return script_2158(bitconfig_6180, 2, 140); + case 152: + return script_2157(bitconfig_1938, 110); + case 153: + return script_2157(bitconfig_5448, 50); + case 154: + return script_2158(bitconfig_6307, 2, 5); + case 158: + return script_2158(bitconfig_7826, 10, 180); + case 160: + return script_2157(bitconfig_6471, 90); + case 161: + return script_2157(bitconfig_6553, 46); + case 162: + return script_2157(bitconfig_6962, 12); + case 163: + return script_2158(bitconfig_6883, 3, 147); + case 165: + return script_2157(bitconfig_7050, 35); + case 167: + return script_2157(bitconfig_7793, 30); + case 168: + return script_2157(bitconfig_8045, 150); + case 170: + return script_2157(bitconfig_7238, 60); + case 171: + return script_2157(bitconfig_7958, 90); + case 172: + return script_2157(bitconfig_7871, 5); + case 173: + return script_2158(bitconfig_7451, 2, 63); + case 14: + return script_2157(bitconfig_8704, 90); + case 174: + return script_2157(bitconfig_8248, 40); + case 17: + return script_2157(bitconfig_5730, 100); + case 176: + return script_2157(bitconfig_9829, 400); + case 179: + return script_2158(bitconfig_8605, 10, 315); + case 12: + return script_2157(bitconfig_5332, 120); + case 180: + return script_2157(bitconfig_998, 9); + case 181: + return script_2158(bitconfig_8961, 10, 210); + case 182: + return script_2157(bitconfig_9369, 50); + case 183: + return script_2158(bitconfig_9491, 5, 250); + case 184: + return script_2157(bitconfig_9757, 170); + } + return 0; +} diff --git a/dumps/scripts/2194.cs2 b/dumps/scripts/2194.cs2 new file mode 100644 index 000000000..9283d713b --- /dev/null +++ b/dumps/scripts/2194.cs2 @@ -0,0 +1,89 @@ +int script_2194(int arg0) { + switch (arg0) { + case 79: + if (((boolean)bitconfig_888)) { + return 0; + } + break; + case 144: + if (((boolean)bitconfig_5394)) { + return 0; + } + break; + case 145: + if (bitconfig_4310 < 10) { + return 0; + } + break; + case 35: + if (((boolean)bitconfig_0)) { + return 0; + } + break; + case 120: + if (bitconfig_1895 < 110) { + return 0; + } + break; + case 157: + if (bitconfig_3637 < 125) { + return 0; + } + break; + case 156: + if (script_2656() < 100) { + return 0; + } + break; + case 162: + if (bitconfig_3909 < 8) { + return 0; + } + if (((boolean)bitconfig_5834)) { + return 0; + } + if (((boolean)bitconfig_5830)) { + return 0; + } + break; + case 163: + if (((boolean)bitconfig_5686)) { + return 0; + } + break; + case 168: + if (bitconfig_1910 < 20) { + return 0; + } + break; + case 171: + if (((boolean)bitconfig_7973)) { + return 0; + } + break; + case 174: + if (((boolean)bitconfig_7544)) { + return 0; + } + break; + case 179: + if (script_2656() < 100) { + return 0; + } + if (bitconfig_1914 < 50) { + return 0; + } + if (bitconfig_8494 < 5) { + return 0; + } + break; + case 148: + if (bitconfig_8601 < 6) { + return 0; + } + break; + default: + return 1; + } + return 1; +} diff --git a/dumps/scripts/2195.cs2 b/dumps/scripts/2195.cs2 new file mode 100644 index 000000000..67a378021 --- /dev/null +++ b/dumps/scripts/2195.cs2 @@ -0,0 +1,4 @@ +void script_2195(int arg0,int arg1) { + script_1730(arg0, arg1); + return; +} diff --git a/dumps/scripts/2196.cs2 b/dumps/scripts/2196.cs2 new file mode 100644 index 000000000..690b98562 --- /dev/null +++ b/dumps/scripts/2196.cs2 @@ -0,0 +1,4 @@ +void script_2196(int arg0,int arg1,string arg2) { + script_2197(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/2197.cs2 b/dumps/scripts/2197.cs2 new file mode 100644 index 000000000..c7b7c09ef --- /dev/null +++ b/dumps/scripts/2197.cs2 @@ -0,0 +1,31 @@ +void script_2197(int arg0,int arg1,string arg2) { + int ivar2; + flow_0: + ivar2 = 0; + IF (arg1 == -1) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (setWidgetRegister(new WidgetPointer(arg0))) + GOTO flow_3 + flow_2: + IF (setWidgetRegister(new WidgetPointer(arg0), arg1)) + GOTO flow_3 + GOTO flow_10 + flow_3: + if (globalint_198 != 1) { + setScriptCallOnGameloop(-1, ""); + setWidgetText(arg2); + return; + } + if (mod(getClientCycle(), 20) > 9) { + setWidgetText(""); + if (mod(getClientCycle(), 20) == 10) { + playSoundEffect(5009, 1, 0); + } + } else { + setWidgetText(arg2); + } + flow_10: + return; +} diff --git a/dumps/scripts/2198.cs2 b/dumps/scripts/2198.cs2 new file mode 100644 index 000000000..ae7678d6e --- /dev/null +++ b/dumps/scripts/2198.cs2 @@ -0,0 +1,4 @@ +void script_2198(int arg0,int arg1) { + globalint_198 = 0; + return; +} diff --git a/dumps/scripts/2199.cs2 b/dumps/scripts/2199.cs2 new file mode 100644 index 000000000..36c3ed43c --- /dev/null +++ b/dumps/scripts/2199.cs2 @@ -0,0 +1,16 @@ +void script_2199() { + switch (rndExcl(4)) { + case 0: + globalint_1136 = 61079562; + break; + case 1: + globalint_1136 = 61079563; + break; + case 2: + globalint_1136 = 61079564; + break; + case 3: + globalint_1136 = 61079565; + } + return; +} diff --git a/dumps/scripts/22.cs2 b/dumps/scripts/22.cs2 new file mode 100644 index 000000000..62af927f1 --- /dev/null +++ b/dumps/scripts/22.cs2 @@ -0,0 +1,4 @@ +void script_22() { + setWidgetText(new WidgetPointer(139,4), intToStr(standart_config_143)); + return; +} diff --git a/dumps/scripts/220.cs2 b/dumps/scripts/220.cs2 new file mode 100644 index 000000000..f86a4206c --- /dev/null +++ b/dumps/scripts/220.cs2 @@ -0,0 +1,22 @@ +void script_220() { + script_217(); + if (((boolean)stringMethod4107(globalstring_24, ""))) { + return; + } + globalint_790 = 2; + setWidgetIsHidden(true, new WidgetPointer(594,33)); + setWidgetIsHidden(true, new WidgetPointer(594,34)); + setWidgetIsHidden(true, new WidgetPointer(594,61)); + setWidgetIsHidden(true, new WidgetPointer(594,148)); + setWidgetIsHidden(true, new WidgetPointer(594,149)); + setWidgetIsHidden(true, new WidgetPointer(594,150)); + setWidgetIsHidden(true, new WidgetPointer(594,151)); + setWidgetIsHidden(true, new WidgetPointer(594,165)); + setWidgetIsHidden(true, new WidgetPointer(594,166)); + setWidgetIsHidden(false, new WidgetPointer(594,104)); + setWidgetIsHidden(true, new WidgetPointer(594,120)); + setWidgetIsHidden(true, new WidgetPointer(594,62)); + setWidgetIsHidden(true, new WidgetPointer(594,117)); + setWidgetIsHidden(true, new WidgetPointer(594,121)); + return; +} diff --git a/dumps/scripts/2200.cs2 b/dumps/scripts/2200.cs2 new file mode 100644 index 000000000..77e42d434 --- /dev/null +++ b/dumps/scripts/2200.cs2 @@ -0,0 +1,16 @@ +void script_2200() { + switch (rndExcl(4)) { + case 0: + globalint_1136 = 61079558; + break; + case 1: + globalint_1136 = 61079559; + break; + case 2: + globalint_1136 = 61079560; + break; + case 3: + globalint_1136 = 61079561; + } + return; +} diff --git a/dumps/scripts/2201.cs2 b/dumps/scripts/2201.cs2 new file mode 100644 index 000000000..506bf156c --- /dev/null +++ b/dumps/scripts/2201.cs2 @@ -0,0 +1,11 @@ +void script_2201() { + if (((boolean)standart_config_1701)) { + script_2200(); + } else { + script_2199(); + } + script_2209(); + setWidgetIsHidden(false, new WidgetPointer(globalint_1136)); + setScriptCallOnGameloop(2210, "", new WidgetPointer(932,1)); + return; +} diff --git a/dumps/scripts/2202.cs2 b/dumps/scripts/2202.cs2 new file mode 100644 index 000000000..1b6ba9253 --- /dev/null +++ b/dumps/scripts/2202.cs2 @@ -0,0 +1,13 @@ +int script_2202(string arg0) { + int ivar0; + int ivar1; + ivar0 = strLength(arg0); + ivar1 = 0; + while (ivar1 < ivar0) { + if (strIndexof(0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", substr(ivar1, add(ivar1, 1), arg0)) == -1) { + return 1; + } + ivar1 = add(ivar1, 1); + } + return 0; +} diff --git a/dumps/scripts/2203.cs2 b/dumps/scripts/2203.cs2 new file mode 100644 index 000000000..2226e820b --- /dev/null +++ b/dumps/scripts/2203.cs2 @@ -0,0 +1,16 @@ +int script_2203(string arg0) { + int ivar0; + int ivar1; + ivar0 = strLength(arg0); + if (ivar0 > 12) { + return 0; + } + ivar1 = 0; + while (ivar1 < ivar0) { + if (strIndexof(0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_@. \u00a0", substr(ivar1, add(ivar1, 1), arg0)) == -1) { + return 0; + } + ivar1 = add(ivar1, 1); + } + return 1; +} diff --git a/dumps/scripts/2204.cs2 b/dumps/scripts/2204.cs2 new file mode 100644 index 000000000..f55095c69 --- /dev/null +++ b/dumps/scripts/2204.cs2 @@ -0,0 +1,4 @@ +void script_2204() { + setScriptCallOnGameloop(2211, "", new WidgetPointer(932,1)); + return; +} diff --git a/dumps/scripts/2205.cs2 b/dumps/scripts/2205.cs2 new file mode 100644 index 000000000..b95d86fc4 --- /dev/null +++ b/dumps/scripts/2205.cs2 @@ -0,0 +1,4 @@ +void script_2205() { + script_2206(); + return; +} diff --git a/dumps/scripts/2206.cs2 b/dumps/scripts/2206.cs2 new file mode 100644 index 000000000..3821720dd --- /dev/null +++ b/dumps/scripts/2206.cs2 @@ -0,0 +1,4 @@ +void script_2206() { + script_1174(11); + return; +} diff --git a/dumps/scripts/2207.cs2 b/dumps/scripts/2207.cs2 new file mode 100644 index 000000000..e411b2cee --- /dev/null +++ b/dumps/scripts/2207.cs2 @@ -0,0 +1,6 @@ +void script_2207() { + if (((boolean)globalint_1137)) { + setScriptCallOnGameloop(2212, "", new WidgetPointer(932,1)); + } + return; +} diff --git a/dumps/scripts/2208.cs2 b/dumps/scripts/2208.cs2 new file mode 100644 index 000000000..2c2c9ba8d --- /dev/null +++ b/dumps/scripts/2208.cs2 @@ -0,0 +1,4 @@ +void script_2208() { + script_2209(); + return; +} diff --git a/dumps/scripts/2209.cs2 b/dumps/scripts/2209.cs2 new file mode 100644 index 000000000..a3c84ef2c --- /dev/null +++ b/dumps/scripts/2209.cs2 @@ -0,0 +1,22 @@ +void script_2209() { + setWidgetText(new WidgetPointer(932,3), "Correct " + intToStr(standart_config_1703) + "/5"); + globalint_1137 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(932,1)); + setWidgetPosition(0, 120, 0, 0, new WidgetPointer(932,10)); + setWidgetPosition(0, 120, 0, 0, new WidgetPointer(932,11)); + setWidgetPosition(0, 120, 0, 0, new WidgetPointer(932,12)); + setWidgetPosition(0, 120, 0, 0, new WidgetPointer(932,13)); + setWidgetPosition(0, 120, 0, 0, new WidgetPointer(932,6)); + setWidgetPosition(0, 120, 0, 0, new WidgetPointer(932,7)); + setWidgetPosition(0, 120, 0, 0, new WidgetPointer(932,8)); + setWidgetPosition(0, 120, 0, 0, new WidgetPointer(932,9)); + setWidgetIsHidden(true, new WidgetPointer(932,10)); + setWidgetIsHidden(true, new WidgetPointer(932,11)); + setWidgetIsHidden(true, new WidgetPointer(932,12)); + setWidgetIsHidden(true, new WidgetPointer(932,13)); + setWidgetIsHidden(true, new WidgetPointer(932,6)); + setWidgetIsHidden(true, new WidgetPointer(932,7)); + setWidgetIsHidden(true, new WidgetPointer(932,8)); + setWidgetIsHidden(true, new WidgetPointer(932,9)); + return; +} diff --git a/dumps/scripts/221.cs2 b/dumps/scripts/221.cs2 new file mode 100644 index 000000000..fdf799712 --- /dev/null +++ b/dumps/scripts/221.cs2 @@ -0,0 +1,23 @@ +void script_221() { + if (((boolean)stringMethod4107(globalstring_24, ""))) { + script_675(); + return; + } + globalint_790 = 3; + setWidgetIsHidden(true, new WidgetPointer(594,33)); + setWidgetIsHidden(true, new WidgetPointer(594,34)); + setWidgetIsHidden(true, new WidgetPointer(594,61)); + setWidgetIsHidden(true, new WidgetPointer(594,148)); + setWidgetIsHidden(true, new WidgetPointer(594,149)); + setWidgetIsHidden(true, new WidgetPointer(594,150)); + setWidgetIsHidden(true, new WidgetPointer(594,151)); + setWidgetIsHidden(true, new WidgetPointer(594,165)); + setWidgetIsHidden(true, new WidgetPointer(594,166)); + setWidgetIsHidden(true, new WidgetPointer(594,104)); + setWidgetIsHidden(false, new WidgetPointer(594,120)); + setWidgetIsHidden(true, new WidgetPointer(594,62)); + setWidgetIsHidden(true, new WidgetPointer(594,117)); + setWidgetIsHidden(true, new WidgetPointer(594,121)); + setWidgetText(new WidgetPointer(594,135), "Ignore " + globalstring_24 + "?"); + return; +} diff --git a/dumps/scripts/2210.cs2 b/dumps/scripts/2210.cs2 new file mode 100644 index 000000000..0c6cf764d --- /dev/null +++ b/dumps/scripts/2210.cs2 @@ -0,0 +1,7 @@ +void script_2210() { + if (getWidgetActualX(new WidgetPointer(globalint_1136)) < 200) { + setScriptCallOnGameloop(2210, "", new WidgetPointer(932,1)); + setWidgetPosition(add(1, getWidgetActualX(new WidgetPointer(globalint_1136))), getWidgetActualY(new WidgetPointer(globalint_1136)), 0, 0, new WidgetPointer(globalint_1136)); + } + return; +} diff --git a/dumps/scripts/2211.cs2 b/dumps/scripts/2211.cs2 new file mode 100644 index 000000000..e737fda05 --- /dev/null +++ b/dumps/scripts/2211.cs2 @@ -0,0 +1,7 @@ +void script_2211() { + if (getWidgetActualX(new WidgetPointer(globalint_1136)) < 339) { + setScriptCallOnGameloop(2211, "", new WidgetPointer(932,1)); + setWidgetPosition(add(1, getWidgetActualX(new WidgetPointer(globalint_1136))), getWidgetActualY(new WidgetPointer(globalint_1136)), 0, 0, new WidgetPointer(globalint_1136)); + } + return; +} diff --git a/dumps/scripts/2212.cs2 b/dumps/scripts/2212.cs2 new file mode 100644 index 000000000..6a844c630 --- /dev/null +++ b/dumps/scripts/2212.cs2 @@ -0,0 +1,10 @@ +void script_2212() { + if (getWidgetActualX(new WidgetPointer(globalint_1136)) < subtract(getWidgetActualWidth(new WidgetPointer(932,1)), 1)) { + setScriptCallOnGameloop(2212, "", new WidgetPointer(932,1)); + setWidgetPosition(add(1, getWidgetActualX(new WidgetPointer(globalint_1136))), getWidgetActualY(new WidgetPointer(globalint_1136)), 0, 0, new WidgetPointer(globalint_1136)); + } else { + setWidgetIsHidden(true, new WidgetPointer(globalint_1136)); + setWidgetPosition(0, 120, 0, 0, new WidgetPointer(globalint_1136)); + } + return; +} diff --git a/dumps/scripts/2213.cs2 b/dumps/scripts/2213.cs2 new file mode 100644 index 000000000..189264bbc --- /dev/null +++ b/dumps/scripts/2213.cs2 @@ -0,0 +1,79 @@ +void script_2213() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + setWidgetSprite(4063, new WidgetPointer(673,102)); + setWidgetVFlip(0, new WidgetPointer(673,102)); + setWidgetHFlip(1, new WidgetPointer(673,102)); + setWidgetSprite(4063, new WidgetPointer(673,109)); + setWidgetVFlip(0, new WidgetPointer(673,109)); + setWidgetHFlip(0, new WidgetPointer(673,109)); + setWidgetSprite(4065, new WidgetPointer(673,103)); + setWidgetVFlip(0, new WidgetPointer(673,103)); + setWidgetHFlip(1, new WidgetPointer(673,103)); + setWidgetSprite(4065, new WidgetPointer(673,110)); + setWidgetVFlip(0, new WidgetPointer(673,110)); + setWidgetHFlip(0, new WidgetPointer(673,110)); + globalint_1411 = 1; + setWidgetSprite(4086, new WidgetPointer(673,41)); + cs2method5431(); + resetAccountCreateRC(); + globalstring_122 = ""; + globalstring_326 = ""; + globalstring_124 = ""; + globalstring_125 = ""; + globalstring_123 = ""; + globalstring_327 = ""; + globalstring_328 = ""; + globalstring_329 = ""; + globalint_1407 = 0; + globalint_1408 = 0; + globalint_1101 = 0; + script_3213(-1, ""); + setWidgetText(new WidgetPointer(673,44), ""); + setWidgetText(new WidgetPointer(673,120), ""); + setWidgetText(new WidgetPointer(673,91), ""); + setWidgetText(new WidgetPointer(673,81), ""); + setWidgetSprite(4057, new WidgetPointer(673,94)); + setWidgetSprite(4057, new WidgetPointer(673,113)); + setWidgetSprite(4057, new WidgetPointer(673,84)); + setWidgetSprite(4057, new WidgetPointer(673,74)); + setWidgetSprite(4057, new WidgetPointer(673,49)); + setWidgetIsHidden(true, new WidgetPointer(673,99)); + setWidgetIsHidden(true, new WidgetPointer(673,118)); + setWidgetIsHidden(true, new WidgetPointer(673,89)); + setWidgetIsHidden(true, new WidgetPointer(673,79)); + setWidgetIsHidden(true, new WidgetPointer(673,125)); + if (globalint_1407 != 0) { + setWidgetText(new WidgetPointer(673,43), intToStr(globalint_1407)); + setWidgetSprite(4059, new WidgetPointer(673,49)); + } else { + setWidgetText(new WidgetPointer(673,43), ""); + } + ivar0 = getTextWidth(3793, getWidgetText(new WidgetPointer(673,71))); + setWidgetSize(ivar0, getWidgetActualHeight(new WidgetPointer(673,61)), 0, 0, new WidgetPointer(673,61)); + ivar1 = getTextWidth(3793, getWidgetText(new WidgetPointer(673,72))); + setWidgetSize(ivar1, getWidgetActualHeight(new WidgetPointer(673,63)), 0, 0, new WidgetPointer(673,63)); + ivar2 = getTextWidth(3793, getWidgetText(new WidgetPointer(673,62))); + setWidgetSize(ivar2, getWidgetActualHeight(new WidgetPointer(673,62)), 0, 0, new WidgetPointer(673,62)); + svar0 = getWidgetText(new WidgetPointer(673,62)); + setWidgetText(new WidgetPointer(673,62), concat(concat(getWidgetText(new WidgetPointer(673,71)), concat(" ", concat(getWidgetText(new WidgetPointer(673,62)), " "))), getWidgetText(new WidgetPointer(673,72)))); + setWidgetPosition(0, getWidgetActualY(new WidgetPointer(673,62)), 1, 0, new WidgetPointer(673,62)); + setWidgetSize(getTextWidth(3793, getWidgetText(new WidgetPointer(673,62))), getWidgetActualHeight(new WidgetPointer(673,62)), 0, 0, new WidgetPointer(673,62)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(673,62)), getWidgetActualY(new WidgetPointer(673,61)), 0, 0, new WidgetPointer(673,61)); + setWidgetText(new WidgetPointer(673,62), svar0); + setWidgetSize(ivar2, getWidgetActualHeight(new WidgetPointer(673,62)), 0, 0, new WidgetPointer(673,62)); + setWidgetPosition(add(add(getWidgetActualX(new WidgetPointer(673,61)), getWidgetActualWidth(new WidgetPointer(673,61))), getTextWidth(3793, " ")), getWidgetActualY(new WidgetPointer(673,62)), 0, 0, new WidgetPointer(673,62)); + setWidgetPosition(add(add(getWidgetActualX(new WidgetPointer(673,62)), getWidgetActualWidth(new WidgetPointer(673,62))), getTextWidth(3793, " ")), getWidgetActualY(new WidgetPointer(673,63)), 0, 0, new WidgetPointer(673,63)); + globalint_1099 = 0; + setScriptCallOnMousePressed(3217, -2147483647, new WidgetPointer(673,100), new WidgetPointer(673,44), new WidgetPointer(673,101), 6, "iIIIi", new WidgetPointer(673,44)); + setScriptCallOnMousePressed(3217, -2147483647, new WidgetPointer(673,119), new WidgetPointer(673,120), new WidgetPointer(673,121), 14, "iIIIi", new WidgetPointer(673,120)); + setScriptCallOnMousePressed(3217, -2147483647, new WidgetPointer(673,90), new WidgetPointer(673,91), new WidgetPointer(673,92), 7, "iIIIi", new WidgetPointer(673,91)); + setScriptCallOnMousePressed(3217, -2147483647, new WidgetPointer(673,80), new WidgetPointer(673,81), new WidgetPointer(673,82), 8, "iIIIi", new WidgetPointer(673,81)); + setScriptCallOnMousePressed(3217, -2147483647, new WidgetPointer(673,126), new WidgetPointer(673,43), new WidgetPointer(673,127), 15, "iIIIi", new WidgetPointer(673,43)); + script_3208(0); + script_2714(6, 1); + globalint_1089 = -1; + return; +} diff --git a/dumps/scripts/2214.cs2 b/dumps/scripts/2214.cs2 new file mode 100644 index 000000000..273cb106e --- /dev/null +++ b/dumps/scripts/2214.cs2 @@ -0,0 +1,19 @@ +void script_2214() { + if (((boolean)globalint_1137)) { + if (getWidgetActualX(new WidgetPointer(globalint_1136)) < 256) { + setWidgetPosition(add(1, getWidgetActualX(new WidgetPointer(globalint_1136))), getWidgetActualY(new WidgetPointer(globalint_1136)), 0, 0, new WidgetPointer(globalint_1136)); + } + if (getWidgetActualX(new WidgetPointer(globalint_1136)) > 256) { + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(globalint_1136)), 1), getWidgetActualY(new WidgetPointer(globalint_1136)), 0, 0, new WidgetPointer(globalint_1136)); + } + if (getWidgetActualY(new WidgetPointer(932,14)) > 70) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(globalint_1136)), subtract(getWidgetActualY(new WidgetPointer(globalint_1136)), 2), 0, 0, new WidgetPointer(globalint_1136)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(932,14)), subtract(getWidgetActualY(new WidgetPointer(932,14)), 2), 0, 0, new WidgetPointer(932,14)); + setScriptCallOnGameloop(2214, "", new WidgetPointer(932,1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(globalint_1136)); + setScriptCallOnGameloop(2215, "", new WidgetPointer(932,1)); + } + } + return; +} diff --git a/dumps/scripts/2215.cs2 b/dumps/scripts/2215.cs2 new file mode 100644 index 000000000..14d0f1731 --- /dev/null +++ b/dumps/scripts/2215.cs2 @@ -0,0 +1,9 @@ +void script_2215() { + if (getWidgetActualY(new WidgetPointer(932,14)) < 180) { + setScriptCallOnGameloop(2215, "", new WidgetPointer(932,1)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(932,14)), add(2, getWidgetActualY(new WidgetPointer(932,14))), 0, 0, new WidgetPointer(932,14)); + } else { + globalint_1137 = 0; + } + return; +} diff --git a/dumps/scripts/2216.cs2 b/dumps/scripts/2216.cs2 new file mode 100644 index 000000000..e984e951b --- /dev/null +++ b/dumps/scripts/2216.cs2 @@ -0,0 +1,12 @@ +void script_2216() { + if (standart_config_1700 == 2) { + if (((boolean)globalint_1137)) { + playSoundEffect(8731, 1, 0); + } + globalint_1137 = 1; + setScriptCallOnGameloop(2214, "", new WidgetPointer(932,1)); + } else { + messageType0("There is nothing to push off!"); + } + return; +} diff --git a/dumps/scripts/2217.cs2 b/dumps/scripts/2217.cs2 new file mode 100644 index 000000000..9dd275f90 --- /dev/null +++ b/dumps/scripts/2217.cs2 @@ -0,0 +1,4 @@ +void script_2217() { + script_31(60948492, 60948495, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/2218.cs2 b/dumps/scripts/2218.cs2 new file mode 100644 index 000000000..173d10cfa --- /dev/null +++ b/dumps/scripts/2218.cs2 @@ -0,0 +1,14 @@ +void script_2218() { + globalint_1126 = standart_config_1675; + globalint_1127 = standart_config_1676; + globalint_1128 = standart_config_1677; + globalint_1129 = standart_config_1678; + globalint_1131 = standart_config_1680; + globalint_1130 = standart_config_1679; + globalint_1132 = standart_config_1682; + globalint_1134 = standart_config_1684; + globalint_1133 = standart_config_1683; + globalint_1135 = standart_config_1681; + script_2220(); + return; +} diff --git a/dumps/scripts/2219.cs2 b/dumps/scripts/2219.cs2 new file mode 100644 index 000000000..988aac32c --- /dev/null +++ b/dumps/scripts/2219.cs2 @@ -0,0 +1,14 @@ +void script_2219() { + globalint_1126 = standart_config_1675; + globalint_1127 = standart_config_1676; + globalint_1128 = standart_config_1677; + globalint_1129 = standart_config_1678; + globalint_1131 = standart_config_1680; + globalint_1130 = standart_config_1679; + globalint_1132 = standart_config_1682; + globalint_1134 = standart_config_1684; + globalint_1133 = standart_config_1683; + globalint_1135 = standart_config_1681; + script_2220(); + return; +} diff --git a/dumps/scripts/222.cs2 b/dumps/scripts/222.cs2 new file mode 100644 index 000000000..d79e386e2 --- /dev/null +++ b/dumps/scripts/222.cs2 @@ -0,0 +1,11 @@ +void script_222() { + if (isFriend(globalstring_24)) { + message(26, 0, "Sorry, you cannot ignore players in your Friends List."); + } else { + cs2method3630(globalstring_24); + message(26, 0, "You are ignoring " + globalstring_24 + " until you log out."); + } + globalint_11 = 0; + script_675(); + return; +} diff --git a/dumps/scripts/2220.cs2 b/dumps/scripts/2220.cs2 new file mode 100644 index 000000000..91c636eb7 --- /dev/null +++ b/dumps/scripts/2220.cs2 @@ -0,0 +1,48 @@ +void script_2220() { + if (((boolean)bitconfig_7324)) { + setWidgetIsHidden(true, new WidgetPointer(931,121)); + } else { + setWidgetIsHidden(false, new WidgetPointer(931,121)); + } + if (((boolean)bitconfig_7325)) { + setWidgetIsHidden(true, new WidgetPointer(931,122)); + } else { + setWidgetIsHidden(false, new WidgetPointer(931,122)); + } + if (((boolean)bitconfig_7326)) { + setWidgetIsHidden(true, new WidgetPointer(931,123)); + } else { + setWidgetIsHidden(false, new WidgetPointer(931,123)); + } + setWidgetText(new WidgetPointer(931,154), intToStr(globalint_1126)); + setWidgetText(new WidgetPointer(931,148), intToStr(globalint_1127)); + setWidgetText(new WidgetPointer(931,142), intToStr(globalint_1128)); + setWidgetText(new WidgetPointer(931,112), intToStr(globalint_1129)); + setWidgetText(new WidgetPointer(931,136), intToStr(globalint_1131)); + setWidgetText(new WidgetPointer(931,130), intToStr(globalint_1130)); + setWidgetText(new WidgetPointer(931,155), "Total Workers: " + intToStr(globalint_1135)); + setWidgetText(new WidgetPointer(931,115), intToStr(standart_config_1687) + "/15"); + setWidgetText(new WidgetPointer(931,117), intToStr(standart_config_1688) + "/15"); + setWidgetText(new WidgetPointer(931,116), intToStr(standart_config_1686) + "/15"); + setWidgetText(new WidgetPointer(931,120), intToStr(standart_config_1689) + "/7"); + setWidgetText(new WidgetPointer(931,118), intToStr(standart_config_1690) + "/7"); + setWidgetText(new WidgetPointer(931,119), intToStr(standart_config_1691) + "/7"); + script_2221(); + setWidgetText(new WidgetPointer(931,20), "Turn " + intToStr(standart_config_1674) + "/15"); + if (((boolean)globalint_1132)) { + setWidgetSprite(941, new WidgetPointer(931,121)); + } else { + setWidgetSprite(942, new WidgetPointer(931,121)); + } + if (((boolean)globalint_1134)) { + setWidgetSprite(941, new WidgetPointer(931,122)); + } else { + setWidgetSprite(942, new WidgetPointer(931,122)); + } + if (((boolean)globalint_1133)) { + setWidgetSprite(941, new WidgetPointer(931,123)); + } else { + setWidgetSprite(942, new WidgetPointer(931,123)); + } + return; +} diff --git a/dumps/scripts/2221.cs2 b/dumps/scripts/2221.cs2 new file mode 100644 index 000000000..09e7550a9 --- /dev/null +++ b/dumps/scripts/2221.cs2 @@ -0,0 +1,16 @@ +void script_2221() { + switch (standart_config_1685) { + case 0: + setWidgetText(new WidgetPointer(931,156), ""); + break; + case 1: + setWidgetText(new WidgetPointer(931,156), "Not enough workers."); + break; + case 2: + setWidgetText(new WidgetPointer(931,156), "Not enough resources."); + break; + case 3: + setWidgetText(new WidgetPointer(931,156), "Worker limit reached."); + } + return; +} diff --git a/dumps/scripts/2222.cs2 b/dumps/scripts/2222.cs2 new file mode 100644 index 000000000..332b6b0da --- /dev/null +++ b/dumps/scripts/2222.cs2 @@ -0,0 +1,18 @@ +void script_2222(int arg0) { + switch (arg0) { + case 13: + script_1174(11); + break; + case 84: + if (isWidgetHidden(new WidgetPointer(669,13))) { + if (((boolean)globalint_1088)) { + script_2932(0, "dob", "set_members_dob.ws"); + } else { + script_1174(12); + } + } else { + script_2715(); + } + } + return; +} diff --git a/dumps/scripts/2223.cs2 b/dumps/scripts/2223.cs2 new file mode 100644 index 000000000..a2c4f695c --- /dev/null +++ b/dumps/scripts/2223.cs2 @@ -0,0 +1,61 @@ +void script_2223() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + string svar1; + string svar2; + string svar3; + openInterface(48758833, 669); + setWidgetSprite(4088, new WidgetPointer(669,27)); + setWidgetSprite(4063, new WidgetPointer(669,28)); + setWidgetVFlip(0, new WidgetPointer(669,28)); + setWidgetHFlip(1, new WidgetPointer(669,28)); + setWidgetSprite(4063, new WidgetPointer(669,29)); + setWidgetVFlip(0, new WidgetPointer(669,29)); + setWidgetHFlip(0, new WidgetPointer(669,29)); + setWidgetSprite(4065, new WidgetPointer(669,21)); + setWidgetVFlip(0, new WidgetPointer(669,21)); + setWidgetHFlip(1, new WidgetPointer(669,21)); + setWidgetSprite(4065, new WidgetPointer(669,26)); + setWidgetVFlip(0, new WidgetPointer(669,26)); + setWidgetHFlip(0, new WidgetPointer(669,26)); + svar0 = ""; + ivar0 = getTextWidth(3793, getWidgetText(new WidgetPointer(669,48))); + setWidgetSize(ivar0, getWidgetActualHeight(new WidgetPointer(669,7)), 0, 0, new WidgetPointer(669,7)); + ivar1 = getTextWidth(3793, getWidgetText(new WidgetPointer(669,49))); + setWidgetSize(ivar1, getWidgetActualHeight(new WidgetPointer(669,9)), 0, 0, new WidgetPointer(669,9)); + ivar2 = getTextWidth(3793, getWidgetText(new WidgetPointer(669,8))); + setWidgetSize(ivar2, getWidgetActualHeight(new WidgetPointer(669,8)), 0, 0, new WidgetPointer(669,8)); + svar1 = getWidgetText(new WidgetPointer(669,8)); + setWidgetText(new WidgetPointer(669,8), concat(concat(getWidgetText(new WidgetPointer(669,48)), concat(" ", concat(getWidgetText(new WidgetPointer(669,8)), " "))), getWidgetText(new WidgetPointer(669,49)))); + setWidgetPosition(0, getWidgetActualY(new WidgetPointer(669,8)), 1, 0, new WidgetPointer(669,8)); + setWidgetSize(getTextWidth(3793, getWidgetText(new WidgetPointer(669,8))), getWidgetActualHeight(new WidgetPointer(669,8)), 0, 0, new WidgetPointer(669,8)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(669,8)), getWidgetActualY(new WidgetPointer(669,7)), 0, 0, new WidgetPointer(669,7)); + setWidgetText(new WidgetPointer(669,8), svar1); + setWidgetSize(ivar2, getWidgetActualHeight(new WidgetPointer(669,8)), 0, 0, new WidgetPointer(669,8)); + setWidgetPosition(add(add(getWidgetActualX(new WidgetPointer(669,7)), getWidgetActualWidth(new WidgetPointer(669,7))), getTextWidth(3793, " ")), getWidgetActualY(new WidgetPointer(669,8)), 0, 0, new WidgetPointer(669,8)); + setWidgetPosition(add(add(getWidgetActualX(new WidgetPointer(669,8)), getWidgetActualWidth(new WidgetPointer(669,8))), getTextWidth(3793, " ")), getWidgetActualY(new WidgetPointer(669,9)), 0, 0, new WidgetPointer(669,9)); + if (globalint_1407 < 13) { + setWidgetIsHidden(true, new WidgetPointer(669,14)); + setWidgetIsHidden(true, new WidgetPointer(669,27)); + setWidgetIsHidden(false, new WidgetPointer(669,13)); + setWidgetText(new WidgetPointer(669,18), "Congratulations, your account has been created successfully!"); + } else { + setWidgetIsHidden(false, new WidgetPointer(669,14)); + setWidgetIsHidden(false, new WidgetPointer(669,27)); + setWidgetIsHidden(true, new WidgetPointer(669,13)); + setWidgetText(new WidgetPointer(669,18), "Congratulations, your account has been successfully created!"); + } + svar2 = "dob"; + svar3 = "set_members_dob.ws"; + if (((boolean)globalint_1088)) { + svar0 = "Continue To Buy"; + setScriptCallOnMousePressed(2931, svar2, svar3, 0, "ss1", new WidgetPointer(669,40)); + } else { + svar0 = "Continue"; + setScriptCallOnMousePressed(1173, 12, "i", new WidgetPointer(669,40)); + } + script_1174(8); + return; +} diff --git a/dumps/scripts/2224.cs2 b/dumps/scripts/2224.cs2 new file mode 100644 index 000000000..828c0cb51 --- /dev/null +++ b/dumps/scripts/2224.cs2 @@ -0,0 +1,11 @@ +void script_2224() { + if ((globalint_1127 < 15) && (script_2240() < globalint_1135)) { + playSoundEffect(8729, 1, 0); + globalint_1126 = add(globalint_1126, 1); + } else { + standart_config_1685 = 1; + playSoundEffect(2277, 1, 0); + } + script_2220(); + return; +} diff --git a/dumps/scripts/2225.cs2 b/dumps/scripts/2225.cs2 new file mode 100644 index 000000000..9332b67cd --- /dev/null +++ b/dumps/scripts/2225.cs2 @@ -0,0 +1,8 @@ +void script_2225() { + if (globalint_1126 > 0) { + playSoundEffect(8729, 1, 0); + globalint_1126 = subtract(globalint_1126, 1); + script_2220(); + } + return; +} diff --git a/dumps/scripts/2226.cs2 b/dumps/scripts/2226.cs2 new file mode 100644 index 000000000..afa05c44d --- /dev/null +++ b/dumps/scripts/2226.cs2 @@ -0,0 +1,11 @@ +void script_2226() { + if ((globalint_1127 < 15) && (script_2240() < globalint_1135)) { + playSoundEffect(8729, 1, 0); + globalint_1127 = add(globalint_1127, 1); + } else { + standart_config_1685 = 1; + playSoundEffect(2277, 1, 0); + } + script_2220(); + return; +} diff --git a/dumps/scripts/2227.cs2 b/dumps/scripts/2227.cs2 new file mode 100644 index 000000000..076b7683c --- /dev/null +++ b/dumps/scripts/2227.cs2 @@ -0,0 +1,8 @@ +void script_2227() { + if (globalint_1127 > 0) { + playSoundEffect(8729, 1, 0); + globalint_1127 = subtract(globalint_1127, 1); + script_2220(); + } + return; +} diff --git a/dumps/scripts/2228.cs2 b/dumps/scripts/2228.cs2 new file mode 100644 index 000000000..f0eebb9b2 --- /dev/null +++ b/dumps/scripts/2228.cs2 @@ -0,0 +1,11 @@ +void script_2228() { + if ((globalint_1127 < 15) && (script_2240() < globalint_1135)) { + playSoundEffect(8729, 1, 0); + globalint_1128 = add(globalint_1128, 1); + } else { + standart_config_1685 = 1; + playSoundEffect(2277, 1, 0); + } + script_2220(); + return; +} diff --git a/dumps/scripts/2229.cs2 b/dumps/scripts/2229.cs2 new file mode 100644 index 000000000..e2bee8fcb --- /dev/null +++ b/dumps/scripts/2229.cs2 @@ -0,0 +1,8 @@ +void script_2229() { + if (globalint_1128 > 0) { + playSoundEffect(8729, 1, 0); + globalint_1128 = subtract(globalint_1128, 1); + script_2220(); + } + return; +} diff --git a/dumps/scripts/223.cs2 b/dumps/scripts/223.cs2 new file mode 100644 index 000000000..e1e6772ec --- /dev/null +++ b/dumps/scripts/223.cs2 @@ -0,0 +1,5 @@ +void script_223() { + globalint_11 = 0; + script_675(); + return; +} diff --git a/dumps/scripts/2230.cs2 b/dumps/scripts/2230.cs2 new file mode 100644 index 000000000..4642e0c23 --- /dev/null +++ b/dumps/scripts/2230.cs2 @@ -0,0 +1,11 @@ +void script_2230() { + if ((globalint_1127 < 15) && (script_2240() < globalint_1135)) { + playSoundEffect(8729, 1, 0); + globalint_1129 = add(globalint_1129, 1); + } else { + standart_config_1685 = 1; + playSoundEffect(2277, 1, 0); + } + script_2220(); + return; +} diff --git a/dumps/scripts/2231.cs2 b/dumps/scripts/2231.cs2 new file mode 100644 index 000000000..e134a866a --- /dev/null +++ b/dumps/scripts/2231.cs2 @@ -0,0 +1,8 @@ +void script_2231() { + if (globalint_1129 > 0) { + playSoundEffect(8729, 1, 0); + globalint_1129 = subtract(globalint_1129, 1); + script_2220(); + } + return; +} diff --git a/dumps/scripts/2232.cs2 b/dumps/scripts/2232.cs2 new file mode 100644 index 000000000..998f4cada --- /dev/null +++ b/dumps/scripts/2232.cs2 @@ -0,0 +1,11 @@ +void script_2232() { + if ((globalint_1127 < 15) && (script_2240() < globalint_1135)) { + playSoundEffect(8729, 1, 0); + globalint_1131 = add(globalint_1131, 1); + } else { + standart_config_1685 = 1; + playSoundEffect(2277, 1, 0); + } + script_2220(); + return; +} diff --git a/dumps/scripts/2233.cs2 b/dumps/scripts/2233.cs2 new file mode 100644 index 000000000..c3621e40d --- /dev/null +++ b/dumps/scripts/2233.cs2 @@ -0,0 +1,8 @@ +void script_2233() { + if (globalint_1131 > 0) { + playSoundEffect(8729, 1, 0); + globalint_1131 = subtract(globalint_1131, 1); + script_2220(); + } + return; +} diff --git a/dumps/scripts/2234.cs2 b/dumps/scripts/2234.cs2 new file mode 100644 index 000000000..45d7af433 --- /dev/null +++ b/dumps/scripts/2234.cs2 @@ -0,0 +1,11 @@ +void script_2234() { + if ((globalint_1127 < 15) && (script_2240() < globalint_1135)) { + playSoundEffect(8729, 1, 0); + globalint_1130 = add(globalint_1130, 1); + } else { + standart_config_1685 = 1; + playSoundEffect(2277, 1, 0); + } + script_2220(); + return; +} diff --git a/dumps/scripts/2235.cs2 b/dumps/scripts/2235.cs2 new file mode 100644 index 000000000..4b6744ee6 --- /dev/null +++ b/dumps/scripts/2235.cs2 @@ -0,0 +1,8 @@ +void script_2235() { + if (globalint_1130 > 0) { + playSoundEffect(8729, 1, 0); + globalint_1130 = subtract(globalint_1130, 1); + script_2220(); + } + return; +} diff --git a/dumps/scripts/2236.cs2 b/dumps/scripts/2236.cs2 new file mode 100644 index 000000000..59069fb17 --- /dev/null +++ b/dumps/scripts/2236.cs2 @@ -0,0 +1,11 @@ +void script_2236() { + if ((globalint_1135 < 15) && (add(add(standart_config_1687, standart_config_1688), standart_config_1686) > 1)) { + playSoundEffect(8729, 1, 0); + globalint_1135 = add(globalint_1135, 1); + } else { + standart_config_1685 = 2; + playSoundEffect(2277, 1, 0); + } + script_2220(); + return; +} diff --git a/dumps/scripts/2237.cs2 b/dumps/scripts/2237.cs2 new file mode 100644 index 000000000..22f83b4b3 --- /dev/null +++ b/dumps/scripts/2237.cs2 @@ -0,0 +1,10 @@ +void script_2237() { + playSoundEffect(8729, 1, 0); + if (((boolean)globalint_1132)) { + globalint_1132 = 1; + } else { + globalint_1132 = 0; + } + script_2220(); + return; +} diff --git a/dumps/scripts/2238.cs2 b/dumps/scripts/2238.cs2 new file mode 100644 index 000000000..dc9ef676a --- /dev/null +++ b/dumps/scripts/2238.cs2 @@ -0,0 +1,10 @@ +void script_2238() { + playSoundEffect(8729, 1, 0); + if (((boolean)globalint_1134)) { + globalint_1134 = 1; + } else { + globalint_1134 = 0; + } + script_2220(); + return; +} diff --git a/dumps/scripts/2239.cs2 b/dumps/scripts/2239.cs2 new file mode 100644 index 000000000..b534f0b21 --- /dev/null +++ b/dumps/scripts/2239.cs2 @@ -0,0 +1,10 @@ +void script_2239() { + playSoundEffect(8729, 1, 0); + if (((boolean)globalint_1133)) { + globalint_1133 = 1; + } else { + globalint_1133 = 0; + } + script_2220(); + return; +} diff --git a/dumps/scripts/224.cs2 b/dumps/scripts/224.cs2 new file mode 100644 index 000000000..e585d62b6 --- /dev/null +++ b/dumps/scripts/224.cs2 @@ -0,0 +1,87 @@ +void script_224() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + string svar0; + ivar0 = ((int)isWidgetHidden(new WidgetPointer(594,61))); + if (((boolean)ivar0)) { + setWidgetIsHidden(false, new WidgetPointer(594,61)); + } + ivar1 = 100; + svar0 = ""; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + deleteAllExtraChilds(new WidgetPointer(594,94)); + deleteAllExtraChilds(new WidgetPointer(594,93)); + deleteAllExtraChilds(new WidgetPointer(594,92)); + setWidgetScrollMax(0, 0, new WidgetPointer(594,94)); + cs2method2100(0, 0, new WidgetPointer(594,94)); + while (ivar1 >= 0) { + ivar3 = cs2method5004(ivar1); + if (((((ivar3 != 0) && (ivar3 != 4)) && ((ivar3 != 27) && (ivar3 != 28))) && (((ivar3 != 29) && (ivar3 != 43)) && ((ivar3 != 103) && (ivar3 != 104)))) && ((((ivar3 != 26) && (ivar3 != 30)) && ((ivar3 != 31) && (stringMethod4107(cs2method5010(ivar1), "") != 0))) && (stringMethod4107(cs2method5003(ivar1), "") != 0))) { + if (((stringMethod4107(strRemoveEntities(cs2method5010(ivar1)), cs2method5015()) != 0) && (ivar3 != 6)) && (ivar3 != 19)) { + ivar4 = 1; + createExtraChild(new WidgetPointer(594,93), 3, getExtraChildGap(new WidgetPointer(594,93))); + setWidgetPosition(0, multiply(ivar2, 14), 0, 0); + setWidgetSize(16384, 14, 2, 0); + setWidgetRGB(new Color(103, 138, 176)); + cs2method2103(255); + setWidgetFilled(1); + setScriptCallOnMouseEntered(237, -2147483643, "i"); + setScriptCallOnMouseExit(238, -2147483643, "i"); + createExtraChild(new WidgetPointer(594,92), 3, getExtraChildGap(new WidgetPointer(594,92))); + setWidgetPosition(0, multiply(ivar2, 14), 0, 0); + setWidgetSize(16384, 14, 2, 0); + setWidgetRGB(new Color(103, 138, 176)); + cs2method2103(255); + setWidgetFilled(1); + setScriptCallOnMouseEntered(239, -2147483643, "i"); + } + createExtraChild(new WidgetPointer(594,94), 4, getExtraChildGap(new WidgetPointer(594,94))); + setWidgetPosition(5, multiply(ivar2, 14), 0, 0); + setWidgetSize(16384, 14, 2, 0); + if ((ivar3 != 6) && (ivar3 != 19)) { + setWidgetText(" " + cs2method5010(ivar1) + ": " + cs2method5003(ivar1)); + } else { + setWidgetText("To " + cs2method5010(ivar1) + ": " + cs2method5003(ivar1)); + } + setWidgetRGB(new Color(119, 119, 119)); + if (((stringMethod4107(strRemoveEntities(cs2method5010(ivar1)), cs2method5015()) != 0) && (ivar3 != 6)) && (ivar3 != 19)) { + cs2method1305(strRemoveEntities(cs2method5019(ivar1))); + setWidgetContextMenuOption(1, "Report"); + setScriptCallOnClickContextMenu(234, -2147483643, "i"); + setWidgetRGB(new Color(0, 0, 0)); + } + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 14); + ivar2 = add(ivar2, 1); + } + ivar1 = subtract(ivar1, 1); + } + if (((boolean)ivar4)) { + createExtraChild(new WidgetPointer(594,94), 4, getExtraChildGap(new WidgetPointer(594,94))); + setWidgetPosition(5, multiply(ivar2, 14), 0, 0); + setWidgetSize(16384, 14, 2, 0); + setWidgetText("There is no chat to report at the moment."); + setWidgetRGB(new Color(0, 0, 153)); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 14); + } + if (ivar2 > divide(getWidgetActualHeight(new WidgetPointer(594,87)), 14)) { + setWidgetSize(63, getWidgetActualHeight(new WidgetPointer(594,87)), 1, 0, new WidgetPointer(594,87)); + setWidgetScrollMax(0, multiply(ivar2, 14), new WidgetPointer(594,91)); + script_31(38928470, 38928475, 792, 789, 790, 791, 773, 788); + if (setWidgetRegister(new WidgetPointer(594,86), 1)) { + script_37(38928470, 38928475, getWidgetScrollMaxV(new WidgetPointer(594,91)), 1); + } + } else { + setWidgetSize(44, getWidgetActualHeight(new WidgetPointer(594,87)), 1, 0, new WidgetPointer(594,87)); + } + if (((boolean)ivar0)) { + setWidgetIsHidden(true, new WidgetPointer(594,61)); + } + return; +} diff --git a/dumps/scripts/2240.cs2 b/dumps/scripts/2240.cs2 new file mode 100644 index 000000000..150c39c25 --- /dev/null +++ b/dumps/scripts/2240.cs2 @@ -0,0 +1,15 @@ +int script_2240() { + int ivar0; + ivar0 = 5; + ivar0 = add(add(add(add(add(globalint_1126, globalint_1127), globalint_1128), globalint_1129), globalint_1131), globalint_1130); + if (((boolean)globalint_1133)) { + ivar0 = add(ivar0, 1); + } + if (((boolean)globalint_1134)) { + ivar0 = add(ivar0, 1); + } + if (((boolean)globalint_1132)) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/2241.cs2 b/dumps/scripts/2241.cs2 new file mode 100644 index 000000000..cfb9f62de --- /dev/null +++ b/dumps/scripts/2241.cs2 @@ -0,0 +1,57 @@ +void script_2241() { + setWidgetText(new WidgetPointer(929,106), "+ " + intToStr(standart_config_1693) + " ( " + intToStr(standart_config_1687) + " )" + "
" + "+ " + intToStr(standart_config_1692) + " ( " + intToStr(standart_config_1686) + " )" + "
" + "+ " + intToStr(standart_config_1694) + " ( " + intToStr(standart_config_1688) + " )" + "
"); + setWidgetText(new WidgetPointer(929,108), "+ " + intToStr(standart_config_1695) + " ( " + intToStr(standart_config_1689) + " )" + "
" + "+ " + intToStr(standart_config_1697) + " ( " + intToStr(standart_config_1690) + " )" + "
" + "+ " + intToStr(standart_config_1696) + " ( " + intToStr(standart_config_1691) + " )" + "
"); + if (((boolean)bitconfig_7324)) { + setWidgetText(new WidgetPointer(929,113), "WORKING"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(929,113)); + } else { + playSoundEffect(8723, 10, 0); + setWidgetText(new WidgetPointer(929,113), "NEEDS REPAIR"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(929,113)); + } + if (((boolean)bitconfig_7326)) { + setWidgetText(new WidgetPointer(929,112), "WORKING"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(929,112)); + } else { + playSoundEffect(8723, 10, 1); + setWidgetText(new WidgetPointer(929,112), "NEEDS REPAIR"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(929,112)); + } + if (((boolean)bitconfig_7325)) { + setWidgetText(new WidgetPointer(929,114), "WORKING"); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(929,114)); + } else { + playSoundEffect(8723, 10, 2); + setWidgetText(new WidgetPointer(929,114), "NEEDS REPAIR"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(929,114)); + } + setWidgetText(new WidgetPointer(929,102), intToStr(divide(globalint_1135, 5))); + switch (standart_config_1698) { + case 5: + setWidgetText(new WidgetPointer(929,104), "Your workers uncover a hidden stash and you receive"); + setWidgetText(new WidgetPointer(929,105), "3 extra resources."); + playSoundEffect(8728, 1, 0); + break; + case 6: + setWidgetText(new WidgetPointer(929,104), "An accident at work has taken place. As a result you have"); + setWidgetText(new WidgetPointer(929,105), "lost 3 resources."); + playSoundEffect(8723, 10, 0); + break; + case 7: + setWidgetText(new WidgetPointer(929,104), "The paint machine is out of glaze and requires a repair to work at full efficiency."); + setWidgetText(new WidgetPointer(929,105), "Painter needs repair."); + break; + case 8: + setWidgetText(new WidgetPointer(929,104), "The conveyor team needs re-training in order to work at full efficiency."); + setWidgetText(new WidgetPointer(929,105), "Conveyor needs repair."); + break; + case 9: + setWidgetText(new WidgetPointer(929,104), "The oven is coated in soot. It requires a repair to work at full efficiency."); + setWidgetText(new WidgetPointer(929,105), "Oven needs repair."); + break; + default: + setWidgetText(new WidgetPointer(929,104), ""); + setWidgetText(new WidgetPointer(929,105), "Nothing unusual happened."); + } + return; +} diff --git a/dumps/scripts/2242.cs2 b/dumps/scripts/2242.cs2 new file mode 100644 index 000000000..4377f0aed --- /dev/null +++ b/dumps/scripts/2242.cs2 @@ -0,0 +1,56 @@ +void script_2242() { + int ivar0; + playSoundEffect(8727, 3, 0); + setWidgetText(new WidgetPointer(927,22), "Turns taken score: " + intToStr(standart_config_1674) + " x 101 = " + intToStr(multiply(standart_config_1674, 101))); + setWidgetText(new WidgetPointer(927,26), "Resources spare: " + intToStr(add(standart_config_1688, add(standart_config_1687, standart_config_1686))) + " x -10 = -" + intToStr(multiply(add(standart_config_1688, add(standart_config_1687, standart_config_1686)), 10))); + if (standart_config_1674 < 16) { + setWidgetText(new WidgetPointer(927,27), "Completed within turn limit: -100"); + } else { + setWidgetText(new WidgetPointer(927,27), "Not completed within turn limit: 0"); + } + setWidgetText(new WidgetPointer(927,28), "Workers employed: " + intToStr(standart_config_1681) + " x -10 = -" + intToStr(multiply(standart_config_1681, 10))); + setWidgetText(new WidgetPointer(927,32), "Turns taken: " + intToStr(standart_config_1674)); + if (((boolean)bitconfig_7324)) { + setWidgetText(new WidgetPointer(927,23), "Oven not repaired: 50"); + } else { + setWidgetText(new WidgetPointer(927,23), "Oven repaired: 0"); + } + if (((boolean)bitconfig_7326)) { + setWidgetText(new WidgetPointer(927,24), "Conveyor not repaired: 50"); + } else { + setWidgetText(new WidgetPointer(927,24), "Conveyor repaired: 0"); + } + if (((boolean)bitconfig_7325)) { + setWidgetText(new WidgetPointer(927,25), "Painter not repaired: 50"); + } else { + setWidgetText(new WidgetPointer(927,25), "Painter repaired: 0"); + } + ivar0 = 0; + ivar0 = multiply(standart_config_1674, 101); + if (((boolean)bitconfig_7325)) { + ivar0 = add(ivar0, 50); + } + if (((boolean)bitconfig_7324)) { + ivar0 = add(ivar0, 50); + } + if (((boolean)bitconfig_7326)) { + ivar0 = add(ivar0, 50); + } + ivar0 = subtract(ivar0, multiply(add(standart_config_1688, add(standart_config_1687, standart_config_1686)), 10)); + if (standart_config_1674 < 16) { + ivar0 = subtract(ivar0, 100); + } + ivar0 = subtract(ivar0, multiply(standart_config_1681, 10)); + if (ivar0 < 0) { + ivar0 = 0; + } + if (ivar0 > 32768) { + ivar0 = 32768; + } + if (ivar0 == bitconfig_7339) { + setWidgetText(new WidgetPointer(927,31), "Final score: " + intToStr(ivar0) + " (New best score)"); + } else { + setWidgetText(new WidgetPointer(927,31), "Final score: " + intToStr(ivar0)); + } + return; +} diff --git a/dumps/scripts/2243.cs2 b/dumps/scripts/2243.cs2 new file mode 100644 index 000000000..ea743b7ec --- /dev/null +++ b/dumps/scripts/2243.cs2 @@ -0,0 +1,7 @@ +void script_2243(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + setWidgetText(new WidgetPointer(935,80), intToStr(arg6)); + setWidgetText(new WidgetPointer(935,85), intToStr(arg7)); + setWidgetText(new WidgetPointer(935,101), intToStr(divide(arg8, 100)) + "." + intToStr(mod(arg8, 100))); + setScriptCallOnGameloop(2244, 0, arg0, arg1, 0, arg2, arg3, 0, arg4, arg5, arg6, arg7, arg8, "iiiiiiiiiiii", new WidgetPointer(935,0)); + return; +} diff --git a/dumps/scripts/2244.cs2 b/dumps/scripts/2244.cs2 new file mode 100644 index 000000000..b04eb47c0 --- /dev/null +++ b/dumps/scripts/2244.cs2 @@ -0,0 +1,17 @@ +void script_2244(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11) { + int ivar12; + arg0 = script_2245(arg1, arg2, arg0, 61276214, 61276209); + arg3 = script_2245(arg4, arg5, arg3, 61276224, 61276219); + arg6 = script_2245(arg7, arg8, arg6, 61276234, 61276229); + ivar12 = add(add(arg0, arg3), arg6); + setWidgetSize(add(1, divide(multiply(223, ivar12), add(add(arg2, arg5), arg8))), 10, 0, 0, new WidgetPointer(935,95)); + ivar12 = add(add(ivar12, arg9), arg10); + setWidgetText(new WidgetPointer(935,90), intToStr(ivar12)); + setWidgetText(new WidgetPointer(935,107), intToStr(divide(multiply(ivar12, arg11), 100))); + if (((arg0 == arg1) && (arg3 == arg4)) && (arg6 == arg7)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(935,0)); + } else { + setScriptCallOnGameloop(2244, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, "iiiiiiiiiiii", new WidgetPointer(935,0)); + } + return; +} diff --git a/dumps/scripts/2245.cs2 b/dumps/scripts/2245.cs2 new file mode 100644 index 000000000..f12fea7cc --- /dev/null +++ b/dumps/scripts/2245.cs2 @@ -0,0 +1,21 @@ +int script_2245(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (arg2 == arg0) { + return arg2; + } + if (arg2 < arg0) { + arg2 = add(arg2, divide(add(arg1, 49), 50)); + if (arg2 > arg0) { + arg2 = arg0; + } + } else { + if (arg2 > arg0) { + arg2 = subtract(arg2, divide(add(arg1, 49), 50)); + if (arg2 < arg0) { + arg2 = arg0; + } + } + } + setWidgetSize(add(1, divide(multiply(223, arg2), arg1)), 10, 0, 0, new WidgetPointer(arg3)); + setWidgetText(new WidgetPointer(arg4), intToStr(arg2)); + return arg2; +} diff --git a/dumps/scripts/2246.cs2 b/dumps/scripts/2246.cs2 new file mode 100644 index 000000000..1c01cc518 --- /dev/null +++ b/dumps/scripts/2246.cs2 @@ -0,0 +1,23 @@ +void script_2246(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = getItemIdInSlot(arg2, arg3); + if (ivar4 == -1) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setItemOnWidgetMethod2200(ivar4, getItemAmtInSlot(94, arg3), new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg0)); + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -1, 100, 0, 8, "Iiiii", new WidgetPointer(arg0)); + if (getItemHashmapData(ivar4, 1047) > 0) { + if ((getItemHashmapData(ivar4, 1050) > 0) || (getItemHashmapData(ivar4, 1051) > 0)) { + setWidgetContextMenuOption(3, new WidgetPointer(arg0), "Destroy"); + } else { + setWidgetContextMenuOption(3, new WidgetPointer(arg0), "Bind"); + } + } + setWidgetContextMenuOption(10, new WidgetPointer(arg0), "Examine"); + cs2method2305(new WidgetPointer(arg0), "" + getItemName(ivar4)); + return; +} diff --git a/dumps/scripts/2247.cs2 b/dumps/scripts/2247.cs2 new file mode 100644 index 000000000..46c7e19bd --- /dev/null +++ b/dumps/scripts/2247.cs2 @@ -0,0 +1,77 @@ +void script_2247() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 3016; + if (isMember()) { + ivar6 = 3015; + } + if (((boolean)mod(getCommonDefinitionSize(ivar6), 5))) { + ivar3 = multiply(divide(getCommonDefinitionSize(ivar6), 5), 67); + } else { + ivar3 = add(multiply(divide(getCommonDefinitionSize(ivar6), 5), 67), 67); + } + deleteAllExtraChilds(new WidgetPointer(940,1)); + setWidgetScrollMax(multiply(5, 60), ivar3, new WidgetPointer(940,1)); + while (ivar0 < getCommonDefinitionSize(ivar6)) { + createExtraChild(new WidgetPointer(940,2), 5, ivar4); + setWidgetContextMenuOption(1, getItemName(getOtherCommonData(cs2method_3408(105, 74, ivar6, ivar0), 1070))); + setScriptCallOnClickContextMenu(2250, ivar4, "i"); + ivar5 = ivar4; + ivar4 = add(ivar4, 1); + setWidgetSprite(2206); + if (getSkillActualLvl(24) < getOtherCommonData(cs2method_3408(105, 74, ivar6, ivar0), 1071)) { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetSize(52, 55, 0, 0); + setWidgetPosition(multiply(ivar1, 60), subtract(multiply(ivar2, 67), 1), 0, 0); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(940,2), 5, ivar4); + ivar4 = add(ivar4, 1); + setWidgetSprite(2205); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(add(multiply(ivar1, 60), 2), add(multiply(ivar2, 67), 1), 0, 0); + setScriptCallOnMouseOver(2248, ivar5, "i"); + setScriptCallOnMouseExit(2249, ivar5, "i"); + createExtraChild(new WidgetPointer(940,2), 5, ivar4); + ivar4 = add(ivar4, 1); + setWidgetSprite(2184); + setWidgetRGB(new Color(200, 0, 0)); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(multiply(ivar1, 60), 5), add(multiply(ivar2, 67), 40), 0, 0); + createExtraChild(new WidgetPointer(940,2), 4, ivar4); + ivar4 = add(ivar4, 1); + setWidgetRGB(new Color(226, 226, 162)); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(1, 1, 0); + setWidgetText(script_940(getOtherCommonData(cs2method_3408(105, 74, ivar6, ivar0), 1072))); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(multiply(ivar1, 60), 18), add(multiply(ivar2, 67), 40), 0, 0); + createExtraChild(new WidgetPointer(940,2), 5, ivar4); + ivar4 = add(ivar4, 1); + setItemOnWidgetMethod1200(getOtherCommonData(cs2method_3408(105, 74, ivar6, divide(subtract(ivar4, 5), 5)), 1070), -1); + setWidgetSize(25, 25, 0, 0); + setWidgetPosition(add(multiply(ivar1, 60), 13), add(multiply(ivar2, 67), 9), 0, 0); + ivar1 = add(ivar1, 1); + if (ivar1 >= 5) { + ivar1 = 0; + ivar2 = add(ivar2, 1); + } + ivar0 = add(ivar0, 1); + } + if (((boolean)cs2method2601(new WidgetPointer(940,1)))) { + script_31(61603875, 61603841, 792, 789, 790, 791, 773, 788); + } + return; +} diff --git a/dumps/scripts/2248.cs2 b/dumps/scripts/2248.cs2 new file mode 100644 index 000000000..13da73d6f --- /dev/null +++ b/dumps/scripts/2248.cs2 @@ -0,0 +1,6 @@ +void script_2248(int arg0) { + if (setWidgetRegister(new WidgetPointer(940,2), arg0)) { + setWidgetHidden(0); + } + return; +} diff --git a/dumps/scripts/2249.cs2 b/dumps/scripts/2249.cs2 new file mode 100644 index 000000000..0d350daee --- /dev/null +++ b/dumps/scripts/2249.cs2 @@ -0,0 +1,6 @@ +void script_2249(int arg0) { + if (setWidgetRegister(new WidgetPointer(940,2), arg0)) { + setWidgetHidden(1); + } + return; +} diff --git a/dumps/scripts/225.cs2 b/dumps/scripts/225.cs2 new file mode 100644 index 000000000..b41451820 --- /dev/null +++ b/dumps/scripts/225.cs2 @@ -0,0 +1,6 @@ +void script_225() { + script_231(); + script_232(); + setWidgetIsHidden(false, new WidgetPointer(594,148)); + return; +} diff --git a/dumps/scripts/2250.cs2 b/dumps/scripts/2250.cs2 new file mode 100644 index 000000000..4d764b2fa --- /dev/null +++ b/dumps/scripts/2250.cs2 @@ -0,0 +1,70 @@ +void script_2250(int arg0) { + int ivar1; + int ivar2; + flow_0: + ivar1 = divide(arg0, 5); + ivar2 = 3016; + if (isMember()) { + ivar2 = 3015; + } + IF (isMember()) + GOTO flow_3 + GOTO flow_4 + flow_3: + IF (ivar1 == 41) + GOTO flow_6 + flow_4: + IF (isMember() && (ivar1 == 17)) + GOTO flow_6 + GOTO flow_7 + flow_6: + setWidgetIsHidden(true, new WidgetPointer(940,42)); + setWidgetText(new WidgetPointer(940,40), getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1078)); + setWidgetIsHidden(false, new WidgetPointer(940,43)); + setWidgetText(new WidgetPointer(940,43), getItemName(getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1070))); + setWidgetIsHidden(false, new WidgetPointer(940,44)); + setItemOnWidgetMethod2200(getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1070), -1, new WidgetPointer(940,44)); + setWidgetIsHidden(false, new WidgetPointer(940,41)); + setWidgetIsHidden(false, new WidgetPointer(940,66)); + setWidgetIsHidden(false, new WidgetPointer(940,64)); + setWidgetIsHidden(false, new WidgetPointer(940,62)); + setWidgetIsHidden(false, new WidgetPointer(940,63)); + setWidgetIsHidden(true, new WidgetPointer(940,67)); + setWidgetIsHidden(true, new WidgetPointer(940,68)); + setWidgetText(new WidgetPointer(940,62), "1 : 1xp"); + GOTO flow_10 + flow_7: + if (getSkillActualLvl(24) < getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1071)) { + setWidgetIsHidden(true, new WidgetPointer(940,42)); + setWidgetText(new WidgetPointer(940,40), getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1078)); + setWidgetIsHidden(false, new WidgetPointer(940,43)); + setWidgetText(new WidgetPointer(940,43), getItemName(getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1070))); + setWidgetIsHidden(false, new WidgetPointer(940,44)); + setItemOnWidgetMethod2200(getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1070), -1, new WidgetPointer(940,44)); + setWidgetIsHidden(false, new WidgetPointer(940,41)); + setWidgetIsHidden(true, new WidgetPointer(940,66)); + setWidgetIsHidden(true, new WidgetPointer(940,64)); + setWidgetIsHidden(true, new WidgetPointer(940,62)); + setWidgetIsHidden(true, new WidgetPointer(940,63)); + setWidgetIsHidden(false, new WidgetPointer(940,67)); + setWidgetIsHidden(false, new WidgetPointer(940,68)); + setWidgetText(new WidgetPointer(940,68), "Dungeoneering " + intToStr(getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1071)) + " required"); + } else { + setWidgetIsHidden(true, new WidgetPointer(940,42)); + setWidgetText(new WidgetPointer(940,40), getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1078)); + setWidgetIsHidden(false, new WidgetPointer(940,43)); + setWidgetText(new WidgetPointer(940,43), getItemName(getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1070))); + setWidgetIsHidden(false, new WidgetPointer(940,44)); + setItemOnWidgetMethod2200(getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1070), -1, new WidgetPointer(940,44)); + setWidgetIsHidden(false, new WidgetPointer(940,41)); + setWidgetIsHidden(false, new WidgetPointer(940,66)); + setWidgetIsHidden(false, new WidgetPointer(940,64)); + setWidgetIsHidden(false, new WidgetPointer(940,62)); + setWidgetIsHidden(false, new WidgetPointer(940,63)); + setWidgetIsHidden(true, new WidgetPointer(940,67)); + setWidgetIsHidden(true, new WidgetPointer(940,68)); + setWidgetText(new WidgetPointer(940,62), intToStr(getOtherCommonData(cs2method_3408(105, 74, ivar2, ivar1), 1072))); + } + flow_10: + return; +} diff --git a/dumps/scripts/2251.cs2 b/dumps/scripts/2251.cs2 new file mode 100644 index 000000000..e319e8f4e --- /dev/null +++ b/dumps/scripts/2251.cs2 @@ -0,0 +1,4 @@ +void script_2251(int arg0) { + setWidgetText(new WidgetPointer(arg0), "Deaths: " + intToStr(bitconfig_7554)); + return; +} diff --git a/dumps/scripts/2252.cs2 b/dumps/scripts/2252.cs2 new file mode 100644 index 000000000..cc0e57a1f --- /dev/null +++ b/dumps/scripts/2252.cs2 @@ -0,0 +1,4 @@ +void script_2252() { + script_2967(0); + return; +} diff --git a/dumps/scripts/2253.cs2 b/dumps/scripts/2253.cs2 new file mode 100644 index 000000000..a5f8e1a15 --- /dev/null +++ b/dumps/scripts/2253.cs2 @@ -0,0 +1,12 @@ +void script_2253() { + int ivar0; + setWidgetText(new WidgetPointer(945,14), globalstring_315); + if (globalint_1233 > 200) { + globalint_1233 = 200; + } + ivar0 = globalint_1233; + ivar0 = add(divide(multiply(ivar0, 37), 40), 14); + setWidgetSize(ivar0, 18, 1, 0, new WidgetPointer(945,16)); + setWidgetPosition(add(ivar0, 1), 15, 0, 0, new WidgetPointer(945,17)); + return; +} diff --git a/dumps/scripts/2254.cs2 b/dumps/scripts/2254.cs2 new file mode 100644 index 000000000..84219ae30 --- /dev/null +++ b/dumps/scripts/2254.cs2 @@ -0,0 +1,4 @@ +void script_2254(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 15 Agility"); + return; +} diff --git a/dumps/scripts/2255.cs2 b/dumps/scripts/2255.cs2 new file mode 100644 index 000000000..340f04d1b --- /dev/null +++ b/dumps/scripts/2255.cs2 @@ -0,0 +1,4 @@ +void script_2255(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 47 Agility"); + return; +} diff --git a/dumps/scripts/2256.cs2 b/dumps/scripts/2256.cs2 new file mode 100644 index 000000000..a36f5a2e2 --- /dev/null +++ b/dumps/scripts/2256.cs2 @@ -0,0 +1,4 @@ +void script_2256(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 64 Agility"); + return; +} diff --git a/dumps/scripts/2257.cs2 b/dumps/scripts/2257.cs2 new file mode 100644 index 000000000..dbe00880c --- /dev/null +++ b/dumps/scripts/2257.cs2 @@ -0,0 +1,4 @@ +void script_2257(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 60 Agility"); + return; +} diff --git a/dumps/scripts/2258.cs2 b/dumps/scripts/2258.cs2 new file mode 100644 index 000000000..7f745aef2 --- /dev/null +++ b/dumps/scripts/2258.cs2 @@ -0,0 +1,4 @@ +void script_2258(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 65 Agility" + "
" + "Requires the Priest in Peril quest"); + return; +} diff --git a/dumps/scripts/2259.cs2 b/dumps/scripts/2259.cs2 new file mode 100644 index 000000000..f2a223ee9 --- /dev/null +++ b/dumps/scripts/2259.cs2 @@ -0,0 +1,4 @@ +void script_2259(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 29 Agility"); + return; +} diff --git a/dumps/scripts/226.cs2 b/dumps/scripts/226.cs2 new file mode 100644 index 000000000..b23b301d2 --- /dev/null +++ b/dumps/scripts/226.cs2 @@ -0,0 +1,13 @@ +void script_226() { + script_231(); + script_232(); + setWidgetIsHidden(false, new WidgetPointer(594,149)); + if (((boolean)getLanguage())) { + setWidgetIsHidden(false, new WidgetPointer(594,210)); + setWidgetIsHidden(true, new WidgetPointer(594,212)); + } else { + setWidgetIsHidden(true, new WidgetPointer(594,210)); + setWidgetIsHidden(false, new WidgetPointer(594,212)); + } + return; +} diff --git a/dumps/scripts/2260.cs2 b/dumps/scripts/2260.cs2 new file mode 100644 index 000000000..66478c851 --- /dev/null +++ b/dumps/scripts/2260.cs2 @@ -0,0 +1,175 @@ +void script_2260(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 2987; + ivar7 = 2988; + if (isMember()) { + if (globalint_1320 == 2) { + ivar6 = 2989; + ivar7 = 2990; + } else if (globalint_1320 == 3) { + ivar6 = 2991; + ivar7 = 2992; + } else if (globalint_1320 == 4) { + ivar6 = 2993; + ivar7 = 2994; + } else { + ivar6 = 2987; + ivar7 = 2988; + } + } else if (globalint_1320 == 2) { + ivar6 = 2997; + ivar7 = 2998; + } else if (globalint_1320 == 3) { + ivar6 = 2999; + ivar7 = 3000; + } else if (globalint_1320 == 4) { + ivar6 = 3001; + ivar7 = 3002; + } else { + ivar6 = 2995; + ivar7 = 2996; + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(956,25)); + createExtraChild(new WidgetPointer(arg0), 4, ivar3); + ivar3 = add(ivar3, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 0); + setWidgetText("Resources:"); + setWidgetRGB(new Color(198, 155, 1)); + setWidgetUnknownBoolean(true); + createExtraChild(new WidgetPointer(arg0), 5, ivar3); + ivar3 = add(ivar3, 1); + setWidgetSize(160, 12, 0, 0); + setWidgetPosition(0, 7, 0, 0); + setWidgetSprite(1074); + ivar5 = add(ivar5, 20); + ivar8 = ivar3; + while (subtract(ivar3, ivar8) < multiply(getCommonDefinitionSize(ivar6), 5)) { + createExtraChild(new WidgetPointer(arg0), 5, ivar3); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSprite(2205); + cs2method1305("" + getItemName(cs2method_3408(105, 79, ivar6, divide(subtract(ivar3, ivar8), 5))) + ""); + setWidgetContextMenuOption(1, "Info"); + setWidgetContextMenuOption(2, "Buy 1"); + setWidgetContextMenuOption(3, "Buy 5"); + setWidgetContextMenuOption(4, "Buy 10"); + setWidgetContextMenuOption(5, "Buy 50"); + setWidgetContextMenuOption(6, "Buy 250"); + setWidgetContextMenuOption(10, "Examine"); + setScriptCallOnMouseEntered(2261, new WidgetPointer(-32768,3), add(ivar3, 1), 0, "Ii1"); + setScriptCallOnMouseExit(2261, new WidgetPointer(-32768,3), add(ivar3, 1), 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, add(ivar3, 1)); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, add(ivar3, 2)); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar4, 6), add(ivar5, 4), 0, 0); + setItemOnWidgetMethod1205(cs2method_3408(105, 79, ivar6, divide(subtract(ivar3, ivar8), 5)), 1); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + createExtraChild(new WidgetPointer(arg0), 5, add(ivar3, 3)); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar4, 2), add(ivar5, 38), 0, 0); + setWidgetSprite(2181); + createExtraChild(new WidgetPointer(arg0), 4, add(ivar3, 4)); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar4, 13), add(ivar5, 39), 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(2, 1, 0); + setWidgetText(script_940(script_2262(cs2method_3408(105, 79, ivar6, divide(subtract(ivar3, ivar8), 5))))); + setWidgetRGB(new Color(226, 226, 162)); + setWidgetUnknownBoolean(true); + ivar4 = add(ivar4, 50); + if (add(ivar4, 48) > ivar1) { + ivar4 = 0; + ivar5 = add(ivar5, 54); + } + ivar3 = add(ivar3, 5); + } + if (ivar4 != 0) { + ivar4 = 0; + ivar5 = add(ivar5, 52); + } + createExtraChild(new WidgetPointer(arg0), 4, ivar3); + ivar3 = add(ivar3, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(0, add(ivar5, 10), 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 0); + setWidgetText("Tools:"); + setWidgetRGB(new Color(198, 155, 1)); + setWidgetUnknownBoolean(true); + createExtraChild(new WidgetPointer(arg0), 5, ivar3); + ivar3 = add(ivar3, 1); + setWidgetSize(160, 12, 0, 0); + setWidgetPosition(0, add(ivar5, 17), 0, 0); + setWidgetSprite(1074); + ivar5 = add(ivar5, 30); + ivar8 = ivar3; + while (subtract(ivar3, ivar8) < multiply(getCommonDefinitionSize(ivar7), 5)) { + createExtraChild(new WidgetPointer(arg0), 5, ivar3); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSprite(2205); + cs2method1305("" + getItemName(cs2method_3408(105, 79, ivar7, divide(subtract(ivar3, ivar8), 5))) + ""); + setWidgetContextMenuOption(1, "Info"); + setWidgetContextMenuOption(2, "Buy 1"); + setWidgetContextMenuOption(3, "Buy 5"); + setWidgetContextMenuOption(4, "Buy 10"); + setWidgetContextMenuOption(5, "Buy 50"); + setWidgetContextMenuOption(6, "Buy 250"); + setWidgetContextMenuOption(10, "Examine"); + setScriptCallOnMouseEntered(2261, new WidgetPointer(-32768,3), add(ivar3, 1), 0, "Ii1"); + setScriptCallOnMouseExit(2261, new WidgetPointer(-32768,3), add(ivar3, 1), 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, add(ivar3, 1)); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, add(ivar3, 2)); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar4, 6), add(ivar5, 4), 0, 0); + setItemOnWidgetMethod1205(cs2method_3408(105, 79, ivar7, divide(subtract(ivar3, ivar8), 5)), 1); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + createExtraChild(new WidgetPointer(arg0), 5, add(ivar3, 3)); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar4, 2), add(ivar5, 38), 0, 0); + setWidgetSprite(2181); + createExtraChild(new WidgetPointer(arg0), 4, add(ivar3, 4)); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar4, 13), add(ivar5, 39), 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(2, 1, 0); + setWidgetText(script_940(script_2262(cs2method_3408(105, 79, ivar7, divide(subtract(ivar3, ivar8), 5))))); + setWidgetRGB(new Color(226, 226, 162)); + setWidgetUnknownBoolean(true); + ivar4 = add(ivar4, 50); + if (add(ivar4, 48) > ivar1) { + ivar4 = 0; + ivar5 = add(ivar5, 54); + } + ivar3 = add(ivar3, 5); + } + setWidgetScrollMax(0, add(ivar5, 52), new WidgetPointer(arg0)); + script_31(62652441, arg0, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/2261.cs2 b/dumps/scripts/2261.cs2 new file mode 100644 index 000000000..4b515b330 --- /dev/null +++ b/dumps/scripts/2261.cs2 @@ -0,0 +1,6 @@ +void script_2261(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetHidden(arg2); + } + return; +} diff --git a/dumps/scripts/2262.cs2 b/dumps/scripts/2262.cs2 new file mode 100644 index 000000000..cdb306dae --- /dev/null +++ b/dumps/scripts/2262.cs2 @@ -0,0 +1,3 @@ +int script_2262(int arg0) { + return multiplyDivide(getItemValue(arg0), 100, getItemHashmapData(arg0, 1046)); +} diff --git a/dumps/scripts/2263.cs2 b/dumps/scripts/2263.cs2 new file mode 100644 index 000000000..f6212e55b --- /dev/null +++ b/dumps/scripts/2263.cs2 @@ -0,0 +1,14 @@ +void script_2263(int arg0,int arg1,string arg2,string arg3) { + if (arg1 != 1) { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Make 1 " + arg3 + "(" + intToStr(arg1) + ") "); + setWidgetContextMenuOption(2, new WidgetPointer(arg0), "Make 5 " + arg3 + "(" + intToStr(multiply(arg1, 5)) + ")"); + setWidgetContextMenuOption(3, new WidgetPointer(arg0), "Make X " + arg3); + setWidgetContextMenuOption(4, new WidgetPointer(arg0), "Make All " + arg3); + return; + } + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Make 1 " + arg2); + setWidgetContextMenuOption(2, new WidgetPointer(arg0), "Make 5 " + arg3); + setWidgetContextMenuOption(3, new WidgetPointer(arg0), "Make X " + arg3); + setWidgetContextMenuOption(4, new WidgetPointer(arg0), "Make All " + arg3); + return; +} diff --git a/dumps/scripts/2264.cs2 b/dumps/scripts/2264.cs2 new file mode 100644 index 000000000..9d4e1e87c --- /dev/null +++ b/dumps/scripts/2264.cs2 @@ -0,0 +1,43 @@ +void script_2264() { + setWidgetIsHidden(true, new WidgetPointer(944,78)); + setWidgetIsHidden(true, new WidgetPointer(944,79)); + setWidgetIsHidden(true, new WidgetPointer(944,80)); + cs2method2310(new WidgetPointer(944,81), "Make"); + setWidgetIsHidden(true, new WidgetPointer(944,25)); + setWidgetIsHidden(true, new WidgetPointer(944,26)); + setWidgetIsHidden(true, new WidgetPointer(944,27)); + cs2method2310(new WidgetPointer(944,28), "Make"); + setWidgetIsHidden(true, new WidgetPointer(944,31)); + setWidgetIsHidden(true, new WidgetPointer(944,32)); + setWidgetIsHidden(true, new WidgetPointer(944,33)); + cs2method2310(new WidgetPointer(944,34), "Make"); + setWidgetIsHidden(true, new WidgetPointer(944,37)); + setWidgetIsHidden(true, new WidgetPointer(944,38)); + setWidgetIsHidden(true, new WidgetPointer(944,39)); + cs2method2310(new WidgetPointer(944,40), "Make"); + setWidgetIsHidden(true, new WidgetPointer(944,43)); + setWidgetIsHidden(true, new WidgetPointer(944,44)); + setWidgetIsHidden(true, new WidgetPointer(944,45)); + cs2method2310(new WidgetPointer(944,46), "Make"); + setWidgetIsHidden(true, new WidgetPointer(944,49)); + setWidgetIsHidden(true, new WidgetPointer(944,50)); + setWidgetIsHidden(true, new WidgetPointer(944,51)); + cs2method2310(new WidgetPointer(944,52), "Make"); + setWidgetIsHidden(true, new WidgetPointer(944,55)); + setWidgetIsHidden(true, new WidgetPointer(944,56)); + setWidgetIsHidden(true, new WidgetPointer(944,57)); + cs2method2310(new WidgetPointer(944,58), "Make"); + setWidgetIsHidden(true, new WidgetPointer(944,61)); + setWidgetIsHidden(true, new WidgetPointer(944,62)); + setWidgetIsHidden(true, new WidgetPointer(944,63)); + cs2method2310(new WidgetPointer(944,64), "Make"); + setWidgetIsHidden(true, new WidgetPointer(944,67)); + setWidgetIsHidden(true, new WidgetPointer(944,68)); + setWidgetIsHidden(true, new WidgetPointer(944,69)); + cs2method2310(new WidgetPointer(944,70), "Make"); + setWidgetIsHidden(true, new WidgetPointer(944,73)); + setWidgetIsHidden(true, new WidgetPointer(944,74)); + setWidgetIsHidden(true, new WidgetPointer(944,75)); + cs2method2310(new WidgetPointer(944,76), "Make"); + return; +} diff --git a/dumps/scripts/2265.cs2 b/dumps/scripts/2265.cs2 new file mode 100644 index 000000000..10610ce1c --- /dev/null +++ b/dumps/scripts/2265.cs2 @@ -0,0 +1,55 @@ +void script_2265(int arg0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + switch (arg0) { + case 61866061: + if (globalint_755 != -1) { + setItemOnWidgetMethod2208(globalint_755, -1, new WidgetPointer(arg0)); + } + break; + case 61866008: + if (globalint_756 != -1) { + setItemOnWidgetMethod2208(globalint_756, -1, new WidgetPointer(arg0)); + } + break; + case 61866014: + if (globalint_757 != -1) { + setItemOnWidgetMethod2208(globalint_757, -1, new WidgetPointer(arg0)); + } + break; + case 61866020: + if (globalint_758 != -1) { + setItemOnWidgetMethod2208(globalint_758, -1, new WidgetPointer(arg0)); + } + break; + case 61866026: + if (globalint_759 != -1) { + setItemOnWidgetMethod2208(globalint_759, -1, new WidgetPointer(arg0)); + } + break; + case 61866032: + if (globalint_760 != -1) { + setItemOnWidgetMethod2208(globalint_760, -1, new WidgetPointer(arg0)); + } + break; + case 61866038: + if (globalint_1139 != -1) { + setItemOnWidgetMethod2208(globalint_1139, -1, new WidgetPointer(arg0)); + } + break; + case 61866044: + if (globalint_1140 != -1) { + setItemOnWidgetMethod2208(globalint_1140, -1, new WidgetPointer(arg0)); + } + break; + case 61866050: + if (globalint_1141 != -1) { + setItemOnWidgetMethod2208(globalint_1141, -1, new WidgetPointer(arg0)); + } + break; + case 61866056: + if (globalint_1142 != -1) { + setItemOnWidgetMethod2208(globalint_1142, -1, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2266.cs2 b/dumps/scripts/2266.cs2 new file mode 100644 index 000000000..24a5b5e75 --- /dev/null +++ b/dumps/scripts/2266.cs2 @@ -0,0 +1,54 @@ +void script_2266(int arg0) { + switch (arg0) { + case 61866061: + if (stringMethod4107("", globalstring_132) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_132); + } + break; + case 61866008: + if (stringMethod4107("", globalstring_133) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_133); + } + break; + case 61866014: + if (stringMethod4107("", globalstring_134) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_134); + } + break; + case 61866020: + if (stringMethod4107("", globalstring_135) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_135); + } + break; + case 61866026: + if (stringMethod4107("", globalstring_136) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_136); + } + break; + case 61866032: + if (stringMethod4107("", globalstring_137) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_137); + } + break; + case 61866038: + if (stringMethod4107("", globalstring_280) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_280); + } + break; + case 61866044: + if (stringMethod4107("", globalstring_281) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_281); + } + break; + case 61866050: + if (stringMethod4107("", globalstring_282) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_282); + } + break; + case 61866056: + if (stringMethod4107("", globalstring_283) != 0) { + setWidgetText(new WidgetPointer(944,15), globalstring_283); + } + } + return; +} diff --git a/dumps/scripts/2267.cs2 b/dumps/scripts/2267.cs2 new file mode 100644 index 000000000..54daf6ae5 --- /dev/null +++ b/dumps/scripts/2267.cs2 @@ -0,0 +1,4 @@ +void script_2267(int arg0) { + setWidgetText(new WidgetPointer(arg0), globalstring_131); + return; +} diff --git a/dumps/scripts/2268.cs2 b/dumps/scripts/2268.cs2 new file mode 100644 index 000000000..2fcff3995 --- /dev/null +++ b/dumps/scripts/2268.cs2 @@ -0,0 +1,8 @@ +void script_2268(int arg0) { + if (((boolean)standart_config_170)) { + setWidgetText(new WidgetPointer(arg0), "Right-click the object to see more options."); + } else { + setWidgetText(new WidgetPointer(arg0), "Click the object to see more options."); + } + return; +} diff --git a/dumps/scripts/2269.cs2 b/dumps/scripts/2269.cs2 new file mode 100644 index 000000000..049facf7a --- /dev/null +++ b/dumps/scripts/2269.cs2 @@ -0,0 +1,190 @@ +void script_2269() { + script_2270(); + switch (globalint_754) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetPosition(0, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetSize(200, 105, 0, 0, new WidgetPointer(944,22)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetIsHidden(false, new WidgetPointer(944,23)); + setWidgetPosition(-130, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetPosition(130, 23, 1, 0, new WidgetPointer(944,23)); + setWidgetSize(150, 105, 0, 0, new WidgetPointer(944,22)); + setWidgetSize(150, 105, 0, 0, new WidgetPointer(944,23)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetIsHidden(false, new WidgetPointer(944,23)); + setWidgetIsHidden(false, new WidgetPointer(944,29)); + setWidgetPosition(-150, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetPosition(0, 23, 1, 0, new WidgetPointer(944,23)); + setWidgetPosition(150, 23, 1, 0, new WidgetPointer(944,29)); + setWidgetSize(120, 105, 0, 0, new WidgetPointer(944,22)); + setWidgetSize(120, 105, 0, 0, new WidgetPointer(944,23)); + setWidgetSize(120, 105, 0, 0, new WidgetPointer(944,29)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetIsHidden(false, new WidgetPointer(944,23)); + setWidgetIsHidden(false, new WidgetPointer(944,29)); + setWidgetIsHidden(false, new WidgetPointer(944,35)); + setWidgetPosition(-180, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetPosition(-60, 23, 1, 0, new WidgetPointer(944,23)); + setWidgetPosition(60, 23, 1, 0, new WidgetPointer(944,29)); + setWidgetPosition(180, 23, 1, 0, new WidgetPointer(944,35)); + setWidgetSize(100, 105, 0, 0, new WidgetPointer(944,22)); + setWidgetSize(100, 105, 0, 0, new WidgetPointer(944,23)); + setWidgetSize(100, 105, 0, 0, new WidgetPointer(944,29)); + setWidgetSize(100, 105, 0, 0, new WidgetPointer(944,35)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetIsHidden(false, new WidgetPointer(944,23)); + setWidgetIsHidden(false, new WidgetPointer(944,29)); + setWidgetIsHidden(false, new WidgetPointer(944,35)); + setWidgetIsHidden(false, new WidgetPointer(944,41)); + setWidgetPosition(-200, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetPosition(-100, 23, 1, 0, new WidgetPointer(944,23)); + setWidgetPosition(0, 23, 1, 0, new WidgetPointer(944,29)); + setWidgetPosition(100, 23, 1, 0, new WidgetPointer(944,35)); + setWidgetPosition(200, 23, 1, 0, new WidgetPointer(944,41)); + setWidgetSize(90, 105, 0, 0, new WidgetPointer(944,22)); + setWidgetSize(90, 105, 0, 0, new WidgetPointer(944,23)); + setWidgetSize(90, 105, 0, 0, new WidgetPointer(944,29)); + setWidgetSize(90, 105, 0, 0, new WidgetPointer(944,35)); + setWidgetSize(90, 105, 0, 0, new WidgetPointer(944,41)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetIsHidden(false, new WidgetPointer(944,23)); + setWidgetIsHidden(false, new WidgetPointer(944,29)); + setWidgetIsHidden(false, new WidgetPointer(944,35)); + setWidgetIsHidden(false, new WidgetPointer(944,41)); + setWidgetIsHidden(false, new WidgetPointer(944,47)); + setWidgetPosition(-210, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetPosition(-124, 23, 1, 0, new WidgetPointer(944,23)); + setWidgetPosition(-42, 23, 1, 0, new WidgetPointer(944,29)); + setWidgetPosition(42, 23, 1, 0, new WidgetPointer(944,35)); + setWidgetPosition(124, 23, 1, 0, new WidgetPointer(944,41)); + setWidgetPosition(210, 23, 1, 0, new WidgetPointer(944,47)); + setWidgetSize(85, 105, 0, 0, new WidgetPointer(944,22)); + setWidgetSize(85, 105, 0, 0, new WidgetPointer(944,23)); + setWidgetSize(85, 105, 0, 0, new WidgetPointer(944,29)); + setWidgetSize(85, 105, 0, 0, new WidgetPointer(944,35)); + setWidgetSize(85, 105, 0, 0, new WidgetPointer(944,41)); + setWidgetSize(85, 105, 0, 0, new WidgetPointer(944,47)); + break; + case 7: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetIsHidden(false, new WidgetPointer(944,23)); + setWidgetIsHidden(false, new WidgetPointer(944,29)); + setWidgetIsHidden(false, new WidgetPointer(944,35)); + setWidgetIsHidden(false, new WidgetPointer(944,41)); + setWidgetIsHidden(false, new WidgetPointer(944,47)); + setWidgetIsHidden(false, new WidgetPointer(944,53)); + setWidgetPosition(-210, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetPosition(-140, 23, 1, 0, new WidgetPointer(944,23)); + setWidgetPosition(-70, 23, 1, 0, new WidgetPointer(944,29)); + setWidgetPosition(0, 23, 1, 0, new WidgetPointer(944,35)); + setWidgetPosition(70, 23, 1, 0, new WidgetPointer(944,41)); + setWidgetPosition(140, 23, 1, 0, new WidgetPointer(944,47)); + setWidgetPosition(210, 23, 1, 0, new WidgetPointer(944,53)); + setWidgetSize(70, 105, 0, 0, new WidgetPointer(944,22)); + setWidgetSize(70, 105, 0, 0, new WidgetPointer(944,23)); + setWidgetSize(70, 105, 0, 0, new WidgetPointer(944,29)); + setWidgetSize(70, 105, 0, 0, new WidgetPointer(944,35)); + setWidgetSize(70, 105, 0, 0, new WidgetPointer(944,41)); + setWidgetSize(70, 105, 0, 0, new WidgetPointer(944,47)); + setWidgetSize(70, 105, 0, 0, new WidgetPointer(944,53)); + break; + case 8: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetIsHidden(false, new WidgetPointer(944,23)); + setWidgetIsHidden(false, new WidgetPointer(944,29)); + setWidgetIsHidden(false, new WidgetPointer(944,35)); + setWidgetIsHidden(false, new WidgetPointer(944,41)); + setWidgetIsHidden(false, new WidgetPointer(944,47)); + setWidgetIsHidden(false, new WidgetPointer(944,53)); + setWidgetIsHidden(false, new WidgetPointer(944,59)); + setWidgetPosition(-210, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetPosition(-150, 23, 1, 0, new WidgetPointer(944,23)); + setWidgetPosition(-90, 23, 1, 0, new WidgetPointer(944,29)); + setWidgetPosition(-30, 23, 1, 0, new WidgetPointer(944,35)); + setWidgetPosition(30, 23, 1, 0, new WidgetPointer(944,41)); + setWidgetPosition(90, 23, 1, 0, new WidgetPointer(944,47)); + setWidgetPosition(150, 23, 1, 0, new WidgetPointer(944,53)); + setWidgetPosition(210, 23, 1, 0, new WidgetPointer(944,59)); + setWidgetSize(60, 105, 0, 0, new WidgetPointer(944,22)); + setWidgetSize(60, 105, 0, 0, new WidgetPointer(944,23)); + setWidgetSize(60, 105, 0, 0, new WidgetPointer(944,29)); + setWidgetSize(60, 105, 0, 0, new WidgetPointer(944,35)); + setWidgetSize(60, 105, 0, 0, new WidgetPointer(944,41)); + setWidgetSize(60, 105, 0, 0, new WidgetPointer(944,47)); + setWidgetSize(60, 105, 0, 0, new WidgetPointer(944,53)); + setWidgetSize(60, 105, 0, 0, new WidgetPointer(944,59)); + break; + case 9: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetIsHidden(false, new WidgetPointer(944,23)); + setWidgetIsHidden(false, new WidgetPointer(944,29)); + setWidgetIsHidden(false, new WidgetPointer(944,35)); + setWidgetIsHidden(false, new WidgetPointer(944,41)); + setWidgetIsHidden(false, new WidgetPointer(944,47)); + setWidgetIsHidden(false, new WidgetPointer(944,53)); + setWidgetIsHidden(false, new WidgetPointer(944,59)); + setWidgetIsHidden(false, new WidgetPointer(944,65)); + setWidgetPosition(-220, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetPosition(-165, 23, 1, 0, new WidgetPointer(944,23)); + setWidgetPosition(-110, 23, 1, 0, new WidgetPointer(944,29)); + setWidgetPosition(-55, 23, 1, 0, new WidgetPointer(944,35)); + setWidgetPosition(0, 23, 1, 0, new WidgetPointer(944,41)); + setWidgetPosition(55, 23, 1, 0, new WidgetPointer(944,47)); + setWidgetPosition(110, 23, 1, 0, new WidgetPointer(944,53)); + setWidgetPosition(165, 23, 1, 0, new WidgetPointer(944,59)); + setWidgetPosition(220, 23, 1, 0, new WidgetPointer(944,65)); + setWidgetSize(55, 105, 0, 0, new WidgetPointer(944,22)); + setWidgetSize(55, 105, 0, 0, new WidgetPointer(944,23)); + setWidgetSize(55, 105, 0, 0, new WidgetPointer(944,29)); + setWidgetSize(55, 105, 0, 0, new WidgetPointer(944,35)); + setWidgetSize(55, 105, 0, 0, new WidgetPointer(944,41)); + setWidgetSize(55, 105, 0, 0, new WidgetPointer(944,47)); + setWidgetSize(55, 105, 0, 0, new WidgetPointer(944,53)); + setWidgetSize(55, 105, 0, 0, new WidgetPointer(944,59)); + setWidgetSize(55, 105, 0, 0, new WidgetPointer(944,65)); + break; + case 10: + setWidgetIsHidden(false, new WidgetPointer(944,22)); + setWidgetIsHidden(false, new WidgetPointer(944,23)); + setWidgetIsHidden(false, new WidgetPointer(944,29)); + setWidgetIsHidden(false, new WidgetPointer(944,35)); + setWidgetIsHidden(false, new WidgetPointer(944,41)); + setWidgetIsHidden(false, new WidgetPointer(944,47)); + setWidgetIsHidden(false, new WidgetPointer(944,53)); + setWidgetIsHidden(false, new WidgetPointer(944,59)); + setWidgetIsHidden(false, new WidgetPointer(944,65)); + setWidgetIsHidden(false, new WidgetPointer(944,71)); + setWidgetPosition(-225, 23, 1, 0, new WidgetPointer(944,22)); + setWidgetPosition(-175, 23, 1, 0, new WidgetPointer(944,23)); + setWidgetPosition(-125, 23, 1, 0, new WidgetPointer(944,29)); + setWidgetPosition(-75, 23, 1, 0, new WidgetPointer(944,35)); + setWidgetPosition(-25, 23, 1, 0, new WidgetPointer(944,41)); + setWidgetPosition(25, 23, 1, 0, new WidgetPointer(944,47)); + setWidgetPosition(75, 23, 1, 0, new WidgetPointer(944,53)); + setWidgetPosition(125, 23, 1, 0, new WidgetPointer(944,59)); + setWidgetPosition(175, 23, 1, 0, new WidgetPointer(944,65)); + setWidgetPosition(225, 23, 1, 0, new WidgetPointer(944,71)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,22)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,23)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,29)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,35)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,41)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,47)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,53)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,59)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,65)); + setWidgetSize(50, 105, 0, 0, new WidgetPointer(944,71)); + } + return; +} diff --git a/dumps/scripts/227.cs2 b/dumps/scripts/227.cs2 new file mode 100644 index 000000000..562dda043 --- /dev/null +++ b/dumps/scripts/227.cs2 @@ -0,0 +1,6 @@ +void script_227() { + script_231(); + script_232(); + setWidgetIsHidden(false, new WidgetPointer(594,150)); + return; +} diff --git a/dumps/scripts/2270.cs2 b/dumps/scripts/2270.cs2 new file mode 100644 index 000000000..fb7be709e --- /dev/null +++ b/dumps/scripts/2270.cs2 @@ -0,0 +1,13 @@ +void script_2270() { + setWidgetIsHidden(true, new WidgetPointer(944,22)); + setWidgetIsHidden(true, new WidgetPointer(944,23)); + setWidgetIsHidden(true, new WidgetPointer(944,29)); + setWidgetIsHidden(true, new WidgetPointer(944,35)); + setWidgetIsHidden(true, new WidgetPointer(944,41)); + setWidgetIsHidden(true, new WidgetPointer(944,47)); + setWidgetIsHidden(true, new WidgetPointer(944,53)); + setWidgetIsHidden(true, new WidgetPointer(944,59)); + setWidgetIsHidden(true, new WidgetPointer(944,65)); + setWidgetIsHidden(true, new WidgetPointer(944,71)); + return; +} diff --git a/dumps/scripts/2271.cs2 b/dumps/scripts/2271.cs2 new file mode 100644 index 000000000..6239ceec5 --- /dev/null +++ b/dumps/scripts/2271.cs2 @@ -0,0 +1,13 @@ +void script_2271(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,string arg14,string arg15) { + cs2method2305(new WidgetPointer(arg0), "" + arg14); + script_2273(arg0, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); + setScriptCallOnMouseOver(2274, new WidgetPointer(arg0), new WidgetPointer(arg1), arg4, arg14, arg15, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, "IIissoioioioi", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(11, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + if (cs2method2800(new WidgetPointer(arg0)) != 0) { + setScriptCallOnUse(17, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnUseWith(18, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } + setScriptCallOnItemContainerUpdate(2272, new WidgetPointer(arg0), arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, 93, 1, "Iddi1oioioioiY", new WidgetPointer(arg0)); + setScriptCallOnSkillChange(2272, new WidgetPointer(arg0), arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, 6, 1, "Iddi1oioioioiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2272.cs2 b/dumps/scripts/2272.cs2 new file mode 100644 index 000000000..c47092cc3 --- /dev/null +++ b/dumps/scripts/2272.cs2 @@ -0,0 +1,4 @@ +void script_2272(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12) { + script_2273(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); + return; +} diff --git a/dumps/scripts/2273.cs2 b/dumps/scripts/2273.cs2 new file mode 100644 index 000000000..58a76a9f9 --- /dev/null +++ b/dumps/scripts/2273.cs2 @@ -0,0 +1,19 @@ +void script_2273(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12) { + if ((getSkillCurrentLvl(6) < arg3) && (((boolean)arg4) || (getSkillActualLvl(6) < arg3))) { + if (((boolean)bitconfig_4089)) { + if ((standart_config_1092 < arg3) || ((boolean)cs2method_3408(73, 105, 1061, arg0))) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + } else { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + } + if (standart_config_1795 == -1) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + return; + } + setWidgetSprite(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2274.cs2 b/dumps/scripts/2274.cs2 new file mode 100644 index 000000000..7fcc63df9 --- /dev/null +++ b/dumps/scripts/2274.cs2 @@ -0,0 +1,74 @@ +void script_2274(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,string arg11,string arg12) { + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar11 = add(2, multiply(13, getLineCount(177, 495, "Level " + intToStr(arg2) + ": " + arg11))); + ivar12 = add(2, multiply(13, getLineCount(177, 494, arg12))); + ivar13 = add(add(add(add(add(2, ivar11), ivar12), 32), 14), 2); + if (arg3 == -1) { + ivar13 = subtract(subtract(ivar13, 32), 14); + } + ivar14 = 5; + if (getWidgetActualY(new WidgetPointer(arg0)) < 130) { + ivar14 = subtract(subtract(261, ivar13), 5); + } + createExtraChild(new WidgetPointer(arg1), 3, 0); + setWidgetPosition(5, ivar14, 0, 0); + setWidgetSize(180, ivar13, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(42); + createExtraChild(new WidgetPointer(arg1), 3, 1); + setWidgetPosition(6, add(ivar14, 1), 0, 0); + setWidgetSize(179, subtract(ivar13, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(46, 43, 35)); + createExtraChild(new WidgetPointer(arg1), 3, 2); + setWidgetPosition(5, ivar14, 0, 0); + setWidgetSize(179, subtract(ivar13, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(114, 100, 81)); + createExtraChild(new WidgetPointer(arg1), 4, 3); + setWidgetPosition(7, add(ivar14, 2), 0, 0); + setWidgetSize(177, ivar11, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(false); + setWidgetText("Level " + intToStr(arg2) + ": " + arg11); + createExtraChild(new WidgetPointer(arg1), 4, 4); + setWidgetPosition(7, add(add(ivar14, 2), ivar11), 0, 0); + setWidgetSize(177, ivar12, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + setWidgetRGB(new Color(175, 106, 26)); + setWidgetUnknownBoolean(false); + setWidgetText(arg12); + ivar15 = 1; + ivar16 = divide(subtract(190, multiply(ivar15, 35)), add(ivar15, 1)); + createExtraChild(new WidgetPointer(arg1), 5, 5); + setWidgetPosition(ivar16, add(add(add(ivar14, 2), ivar11), ivar12), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(17489, -1); + createExtraChild(new WidgetPointer(arg1), 4, 6); + setWidgetPosition(ivar16, add(add(add(add(ivar14, 2), ivar11), ivar12), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (standart_config_1795 != -1) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + if (standart_config_1795 != -1) { + setWidgetText("1/1"); + } else { + setWidgetText("0/1"); + } + return; +} diff --git a/dumps/scripts/2275.cs2 b/dumps/scripts/2275.cs2 new file mode 100644 index 000000000..0241ad0ec --- /dev/null +++ b/dumps/scripts/2275.cs2 @@ -0,0 +1,123 @@ +void script_2275() { + globalint_1184 = 0; + globalint_1185 = 255; + globalint_1186 = 0; + setWidgetIsHidden(true, new WidgetPointer(933,19)); + setWidgetIsHidden(true, new WidgetPointer(933,18)); + setWidgetIsHidden(true, new WidgetPointer(933,17)); + setWidgetIsHidden(true, new WidgetPointer(933,187)); + setWidgetIsHidden(true, new WidgetPointer(933,240)); + setWidgetIsHidden(true, new WidgetPointer(933,241)); + setWidgetIsHidden(true, new WidgetPointer(933,190)); + setWidgetIsHidden(true, new WidgetPointer(933,188)); + setWidgetIsHidden(true, new WidgetPointer(933,227)); + setWidgetIsHidden(true, new WidgetPointer(933,228)); + setWidgetIsHidden(true, new WidgetPointer(933,191)); + setWidgetIsHidden(true, new WidgetPointer(933,189)); + setWidgetIsHidden(true, new WidgetPointer(933,214)); + setWidgetIsHidden(true, new WidgetPointer(933,215)); + setWidgetIsHidden(true, new WidgetPointer(933,54)); + setWidgetIsHidden(true, new WidgetPointer(933,68)); + setWidgetIsHidden(true, new WidgetPointer(933,69)); + setWidgetIsHidden(true, new WidgetPointer(933,70)); + setWidgetIsHidden(true, new WidgetPointer(933,71)); + setWidgetIsHidden(true, new WidgetPointer(933,72)); + setWidgetIsHidden(true, new WidgetPointer(933,73)); + setWidgetIsHidden(true, new WidgetPointer(933,82)); + setWidgetIsHidden(true, new WidgetPointer(933,74)); + cs2method2103(200, new WidgetPointer(933,68)); + cs2method2103(200, new WidgetPointer(933,69)); + cs2method2103(200, new WidgetPointer(933,70)); + setWidgetIsHidden(true, new WidgetPointer(933,55)); + setWidgetIsHidden(true, new WidgetPointer(933,64)); + setWidgetIsHidden(true, new WidgetPointer(933,75)); + setWidgetIsHidden(true, new WidgetPointer(933,56)); + setWidgetIsHidden(true, new WidgetPointer(933,57)); + setWidgetIsHidden(true, new WidgetPointer(933,78)); + setWidgetIsHidden(true, new WidgetPointer(933,80)); + setWidgetIsHidden(true, new WidgetPointer(933,59)); + setWidgetIsHidden(true, new WidgetPointer(933,61)); + setWidgetIsHidden(true, new WidgetPointer(933,76)); + setWidgetIsHidden(true, new WidgetPointer(933,62)); + setWidgetIsHidden(true, new WidgetPointer(933,58)); + setWidgetIsHidden(true, new WidgetPointer(933,79)); + setWidgetIsHidden(true, new WidgetPointer(933,81)); + setWidgetIsHidden(true, new WidgetPointer(933,60)); + setWidgetIsHidden(true, new WidgetPointer(933,63)); + setWidgetIsHidden(true, new WidgetPointer(933,77)); + setWidgetIsHidden(true, new WidgetPointer(933,66)); + setWidgetIsHidden(true, new WidgetPointer(933,65)); + setWidgetIsHidden(true, new WidgetPointer(933,67)); + setWidgetIsHidden(true, new WidgetPointer(933,146)); + setWidgetIsHidden(true, new WidgetPointer(933,147)); + setWidgetIsHidden(true, new WidgetPointer(933,148)); + setWidgetIsHidden(true, new WidgetPointer(933,149)); + setWidgetIsHidden(true, new WidgetPointer(933,150)); + setWidgetIsHidden(true, new WidgetPointer(933,151)); + setWidgetIsHidden(true, new WidgetPointer(933,152)); + setWidgetIsHidden(true, new WidgetPointer(933,153)); + setWidgetIsHidden(true, new WidgetPointer(933,154)); + setWidgetIsHidden(true, new WidgetPointer(933,155)); + setWidgetIsHidden(true, new WidgetPointer(933,156)); + setWidgetIsHidden(true, new WidgetPointer(933,157)); + setWidgetIsHidden(true, new WidgetPointer(933,158)); + setWidgetIsHidden(true, new WidgetPointer(933,159)); + setWidgetIsHidden(true, new WidgetPointer(933,160)); + setWidgetSize(8192, 16384, 2, 2, new WidgetPointer(933,112)); + setWidgetText(new WidgetPointer(933,96), "100%"); + setWidgetIsHidden(false, new WidgetPointer(933,111)); + setWidgetSize(183, 1, 0, 0, new WidgetPointer(933,111)); + cs2method2103(0, new WidgetPointer(933,297)); + cs2method2103(0, new WidgetPointer(933,298)); + cs2method2103(0, new WidgetPointer(933,299)); + setWidgetIsHidden(true, new WidgetPointer(933,84)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(933,84)), 118, 0, 0, new WidgetPointer(933,84)); + setWidgetIsHidden(false, new WidgetPointer(933,13)); + setWidgetIsHidden(false, new WidgetPointer(933,16)); + setWidgetIsHidden(false, new WidgetPointer(933,14)); + setWidgetIsHidden(false, new WidgetPointer(933,15)); + script_2278(); + script_2938(); + script_3184(); + script_3248(); + script_3257(); + globalint_1189 = 5; + globalint_1190 = -10; + setWidgetIsHidden(true, new WidgetPointer(933,192)); + setWidgetIsHidden(true, new WidgetPointer(933,83)); + setWidgetIsHidden(false, new WidgetPointer(933,186)); + setWidgetIsHidden(false, new WidgetPointer(933,53)); + setWidgetIsHidden(false, new WidgetPointer(933,37)); + cs2method2103(255, new WidgetPointer(933,186)); + cs2method2103(255, new WidgetPointer(933,53)); + cs2method2103(255, new WidgetPointer(933,37)); + setWidgetIsHidden(true, new WidgetPointer(933,20)); + setWidgetSize(90, 45, 0, 0, new WidgetPointer(933,25)); + cs2method2103(0, new WidgetPointer(933,25)); + setWidgetIsHidden(true, new WidgetPointer(933,21)); + setWidgetSize(90, 45, 0, 0, new WidgetPointer(933,24)); + cs2method2103(0, new WidgetPointer(933,24)); + setWidgetIsHidden(true, new WidgetPointer(933,22)); + setWidgetSize(90, 45, 0, 0, new WidgetPointer(933,23)); + cs2method2103(0, new WidgetPointer(933,23)); + globalint_1397 = 0; + globalint_1398 = 0; + globalint_1399 = 0; + globalint_1400 = 0; + globalint_1401 = 0; + setWidgetIsHidden(true, new WidgetPointer(933,322)); + setWidgetIsHidden(true, new WidgetPointer(933,323)); + setWidgetIsHidden(true, new WidgetPointer(933,321)); + setWidgetIsHidden(true, new WidgetPointer(933,324)); + setWidgetIsHidden(true, new WidgetPointer(933,320)); + setWidgetIsHidden(true, new WidgetPointer(933,325)); + setWidgetIsHidden(true, new WidgetPointer(933,319)); + setWidgetIsHidden(true, new WidgetPointer(933,326)); + setWidgetIsHidden(true, new WidgetPointer(933,318)); + setWidgetIsHidden(true, new WidgetPointer(933,327)); + setWidgetIsHidden(false, new WidgetPointer(933,330)); + setWidgetText(new WidgetPointer(933,331), "-Calculating-"); + script_4750(); + setScriptCallOnWidgetResize(4749, "", new WidgetPointer(933,0)); + return; +} diff --git a/dumps/scripts/2276.cs2 b/dumps/scripts/2276.cs2 new file mode 100644 index 000000000..28eb52c47 --- /dev/null +++ b/dumps/scripts/2276.cs2 @@ -0,0 +1,25 @@ +void script_2276(int arg0,int arg1,int arg2) { + int ivar3; + string svar0; + string svar1; + svar0 = cs2method_3408(105, 115, 2857, arg1); + ivar3 = cs2method_3408(105, 105, 2858, arg1); + svar1 = cs2method_3408(105, 115, 2859, arg1); + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(arg2), svar0); + if (ivar3 == 2) { + setWidgetRGB(new Color(0, 160, 0), new WidgetPointer(arg2)); + } else if (((boolean)ivar3)) { + setWidgetRGB(new Color(144, 144, 0), new WidgetPointer(arg2)); + } else { + if (((boolean)ivar3)) { + setWidgetRGB(new Color(160, 0, 0), new WidgetPointer(arg2)); + } + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(933,254), svar1, 25, 200, "IIsii", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(40, new WidgetPointer(933,254), "I", new WidgetPointer(arg2)); + } else { + setWidgetText(new WidgetPointer(arg2), ""); + } + return; +} diff --git a/dumps/scripts/2277.cs2 b/dumps/scripts/2277.cs2 new file mode 100644 index 000000000..d9a44f47c --- /dev/null +++ b/dumps/scripts/2277.cs2 @@ -0,0 +1,4 @@ +void script_2277() { + script_2278(); + return; +} diff --git a/dumps/scripts/2278.cs2 b/dumps/scripts/2278.cs2 new file mode 100644 index 000000000..98b1346ed --- /dev/null +++ b/dumps/scripts/2278.cs2 @@ -0,0 +1,20 @@ +void script_2278() { + if (((boolean)globalint_1198)) { + setWidgetText(new WidgetPointer(933,309), globalstring_310); + setWidgetText(new WidgetPointer(933,310), cs2method_3408(105, 115, 2857, globalint_1203)); + setWidgetText(new WidgetPointer(933,311), cs2method_3408(105, 115, 2857, globalint_1204)); + setWidgetText(new WidgetPointer(933,312), cs2method_3408(105, 115, 2857, globalint_1205)); + setWidgetText(new WidgetPointer(933,313), cs2method_3408(105, 115, 2857, globalint_1206)); + setWidgetText(new WidgetPointer(933,314), cs2method_3408(105, 115, 2857, globalint_1207)); + setWidgetText(new WidgetPointer(933,315), cs2method_3408(105, 115, 2857, globalint_1208)); + } else { + setWidgetText(new WidgetPointer(933,309), ""); + setWidgetText(new WidgetPointer(933,310), ""); + setWidgetText(new WidgetPointer(933,311), ""); + setWidgetText(new WidgetPointer(933,312), ""); + setWidgetText(new WidgetPointer(933,313), ""); + setWidgetText(new WidgetPointer(933,314), ""); + setWidgetText(new WidgetPointer(933,315), ""); + } + return; +} diff --git a/dumps/scripts/2279.cs2 b/dumps/scripts/2279.cs2 new file mode 100644 index 000000000..1286bbdfc --- /dev/null +++ b/dumps/scripts/2279.cs2 @@ -0,0 +1,6 @@ +void script_2279() { + if (((boolean)globalint_1198)) { + setWidgetText(new WidgetPointer(933,309), globalstring_310); + } + return; +} diff --git a/dumps/scripts/228.cs2 b/dumps/scripts/228.cs2 new file mode 100644 index 000000000..e87bc21d9 --- /dev/null +++ b/dumps/scripts/228.cs2 @@ -0,0 +1,6 @@ +void script_228() { + script_231(); + script_232(); + setWidgetIsHidden(false, new WidgetPointer(594,151)); + return; +} diff --git a/dumps/scripts/2280.cs2 b/dumps/scripts/2280.cs2 new file mode 100644 index 000000000..3b5c50d9c --- /dev/null +++ b/dumps/scripts/2280.cs2 @@ -0,0 +1,4 @@ +void script_2280() { + script_2276(globalint_1198, globalint_1203, 61145398); + return; +} diff --git a/dumps/scripts/2281.cs2 b/dumps/scripts/2281.cs2 new file mode 100644 index 000000000..da15bd3f3 --- /dev/null +++ b/dumps/scripts/2281.cs2 @@ -0,0 +1,4 @@ +void script_2281() { + script_2276(globalint_1198, globalint_1204, 61145399); + return; +} diff --git a/dumps/scripts/2282.cs2 b/dumps/scripts/2282.cs2 new file mode 100644 index 000000000..bdd076930 --- /dev/null +++ b/dumps/scripts/2282.cs2 @@ -0,0 +1,4 @@ +void script_2282() { + script_2276(globalint_1198, globalint_1205, 61145400); + return; +} diff --git a/dumps/scripts/2283.cs2 b/dumps/scripts/2283.cs2 new file mode 100644 index 000000000..8371e283e --- /dev/null +++ b/dumps/scripts/2283.cs2 @@ -0,0 +1,15 @@ +void script_2283(int arg0,int arg1) { + globalstring_123 = globalstring_122; + if (strLength(globalstring_122) <= 0) { + script_3213(44105822, "Please enter your Email address here."); + return; + } + if (((boolean)script_3936(globalstring_122))) { + script_3213(44105822, "Please enter a valid Email address."); + return; + } + script_3208(1); + sendRequestAccount(globalstring_122); + setScriptCallOnGameloop(2284, arg0, arg1, "11", new WidgetPointer(673,20)); + return; +} diff --git a/dumps/scripts/2284.cs2 b/dumps/scripts/2284.cs2 new file mode 100644 index 000000000..97c4bba90 --- /dev/null +++ b/dumps/scripts/2284.cs2 @@ -0,0 +1,63 @@ +void script_2284(int arg0,int arg1) { + int ivar2; + string svar0; + string svar1; + ivar2 = getAccountCreateRC(); + if (ivar2 == -3) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(673,20)); + script_3208(0); + if (ivar2 == 2) { + setWidgetSprite(4059, new WidgetPointer(673,94)); + setWidgetIsHidden(true, new WidgetPointer(673,99)); + setWidgetIsHidden(true, new WidgetPointer(673,31)); + if (((boolean)arg1) && (strLength(globalstring_326) > 0)) { + script_3953(0); + } + if (strLength(globalstring_124) > 0) { + script_3228(7, 1, 0); + if (strLength(globalstring_125) > 0) { + script_3228(8, 1, 0); + } + } + if (((boolean)arg0)) { + script_2714(14, 1); + } + return; + } + svar0 = "accountappeal"; + svar1 = "passwordchoice.ws"; + switch (ivar2) { + case 3: + case -4: + case -1: + script_3213(44105822, "Error contacting server."); + break; + case -5: + script_3213(44105822, "No response from server."); + break; + case 7: + script_3213(44105822, "The server is currently very busy. Please try again shortly."); + break; + case 38: + case 9: + script_3213(44105822, "You cannot create an account at this time. Please try again later."); + break; + case 20: + script_3213(44105822, "Email already in use. Try a different email or click " + "" + "here" + "" + " to recover this account."); + break; + case 21: + script_3213(44105822, "Please enter a valid Email address."); + break; + case 37: + script_3213(44105822, "RuneScape has been updated. Please reload this page."); + break; + default: + script_3213(44105822, "Unexpected server response."); + } + if (((boolean)arg1) && (strLength(globalstring_326) > 0)) { + script_3953(0); + } + return; +} diff --git a/dumps/scripts/2285.cs2 b/dumps/scripts/2285.cs2 new file mode 100644 index 000000000..eff35a1f5 --- /dev/null +++ b/dumps/scripts/2285.cs2 @@ -0,0 +1,4 @@ +void script_2285() { + script_2276(globalint_1198, globalint_1206, 61145401); + return; +} diff --git a/dumps/scripts/2286.cs2 b/dumps/scripts/2286.cs2 new file mode 100644 index 000000000..55c1b1bc9 --- /dev/null +++ b/dumps/scripts/2286.cs2 @@ -0,0 +1,4 @@ +void script_2286() { + script_2276(globalint_1198, globalint_1207, 61145402); + return; +} diff --git a/dumps/scripts/2287.cs2 b/dumps/scripts/2287.cs2 new file mode 100644 index 000000000..79c7652df --- /dev/null +++ b/dumps/scripts/2287.cs2 @@ -0,0 +1,4 @@ +void script_2287() { + script_2276(globalint_1198, globalint_1208, 61145403); + return; +} diff --git a/dumps/scripts/2288.cs2 b/dumps/scripts/2288.cs2 new file mode 100644 index 000000000..c49fd5cf4 --- /dev/null +++ b/dumps/scripts/2288.cs2 @@ -0,0 +1,4 @@ +void script_2288() { + script_2938(); + return; +} diff --git a/dumps/scripts/2289.cs2 b/dumps/scripts/2289.cs2 new file mode 100644 index 000000000..f116ccde2 --- /dev/null +++ b/dumps/scripts/2289.cs2 @@ -0,0 +1,21 @@ +void script_2289(int arg0,int arg1,int arg2) { + if (((boolean)script_2296(arg2))) { + if (((boolean)script_2295(arg2))) { + return; + } + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + setWidgetContextMenuOption(1, "Deactivate"); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetSprite(155); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + setWidgetContextMenuOption(1, "Activate"); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetSprite(-1); + } + } + return; +} diff --git a/dumps/scripts/229.cs2 b/dumps/scripts/229.cs2 new file mode 100644 index 000000000..f4e32c30a --- /dev/null +++ b/dumps/scripts/229.cs2 @@ -0,0 +1,6 @@ +void script_229() { + script_231(); + script_232(); + setWidgetIsHidden(false, new WidgetPointer(594,165)); + return; +} diff --git a/dumps/scripts/2290.cs2 b/dumps/scripts/2290.cs2 new file mode 100644 index 000000000..3b9bf2d90 --- /dev/null +++ b/dumps/scripts/2290.cs2 @@ -0,0 +1,17 @@ +void script_2290(int arg0,int arg1) { + if (((boolean)script_2297(arg1))) { + if (((boolean)script_2295(arg1))) { + return; + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(181); + setWidgetContextMenuOption(1, "Deselect"); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(180); + setWidgetContextMenuOption(1, "Select"); + } + } + return; +} diff --git a/dumps/scripts/2291.cs2 b/dumps/scripts/2291.cs2 new file mode 100644 index 000000000..efa16a700 --- /dev/null +++ b/dumps/scripts/2291.cs2 @@ -0,0 +1,12 @@ +void script_2291(int arg0,int arg1) { + if (((boolean)script_2297(arg1))) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(181); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(180); + } + } + return; +} diff --git a/dumps/scripts/2292.cs2 b/dumps/scripts/2292.cs2 new file mode 100644 index 000000000..935d5d060 --- /dev/null +++ b/dumps/scripts/2292.cs2 @@ -0,0 +1,5 @@ +void script_2292(int arg0,int arg1) { + setWidgetSprite(939, new WidgetPointer(arg1)); + setWidgetRGB(new Color(255, 100, 30), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2293.cs2 b/dumps/scripts/2293.cs2 new file mode 100644 index 000000000..c4c42bd22 --- /dev/null +++ b/dumps/scripts/2293.cs2 @@ -0,0 +1,5 @@ +void script_2293(int arg0,int arg1) { + setWidgetSprite(938, new WidgetPointer(arg1)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2294.cs2 b/dumps/scripts/2294.cs2 new file mode 100644 index 000000000..3eada7dd4 --- /dev/null +++ b/dumps/scripts/2294.cs2 @@ -0,0 +1,12 @@ +int script_2294(int arg0) { + if (((boolean)bitconfig_6840)) { + if (((boolean)getOtherCommonData(cs2method_3408(105, 74, 863, arg0), 739))) { + return 1; + } + return 0; + } + if (((boolean)getOtherCommonData(cs2method_3408(105, 74, 2279, arg0), 739))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/2295.cs2 b/dumps/scripts/2295.cs2 new file mode 100644 index 000000000..e394eb0af --- /dev/null +++ b/dumps/scripts/2295.cs2 @@ -0,0 +1,27 @@ +int script_2295(int arg0) { + int ivar1; + if (isMember() && ((boolean)script_2294(arg0))) { + return 0; + } + if (((boolean)script_5256())) { + playSoundEffect(2673, 1, 0); + return 0; + } + ivar1 = 2279; + if (((boolean)bitconfig_6840)) { + ivar1 = 863; + } + if (getSkillActualLvl(5) < getOtherCommonData(cs2method_3408(105, 74, ivar1, arg0), 737)) { + playSoundEffect(2673, 1, 0); + return 0; + } + if ((arg0 == 25) && ((getSkillActualLvl(1) < 55) || (bitconfig_3909 != 8))) { + playSoundEffect(2673, 1, 0); + return 0; + } + if ((arg0 == 26) && ((getSkillActualLvl(1) < 70) || (bitconfig_3909 != 8))) { + playSoundEffect(2673, 1, 0); + return 0; + } + return 1; +} diff --git a/dumps/scripts/2296.cs2 b/dumps/scripts/2296.cs2 new file mode 100644 index 000000000..b3586e524 --- /dev/null +++ b/dumps/scripts/2296.cs2 @@ -0,0 +1,113 @@ +int script_2296(int arg0) { + int ivar1; + ivar1 = cs2method_3408(105, 74, 2279, arg0); + if (((boolean)bitconfig_6840)) { + ivar1 = cs2method_3408(105, 74, 863, arg0); + switch (ivar1) { + case 888: + return bitconfig_6820; + case 889: + return bitconfig_6821; + case 890: + return bitconfig_6822; + case 891: + return bitconfig_6823; + case 892: + return bitconfig_6824; + case 893: + return bitconfig_6825; + case 894: + return bitconfig_6826; + case 895: + return bitconfig_6827; + case 896: + return bitconfig_6828; + case 897: + return bitconfig_6829; + case 898: + return bitconfig_6830; + case 899: + return bitconfig_6831; + case 900: + return bitconfig_6832; + case 901: + return bitconfig_6833; + case 902: + return bitconfig_6834; + case 903: + return bitconfig_6835; + case 904: + return bitconfig_6836; + case 905: + return bitconfig_6837; + case 906: + return bitconfig_6838; + case 907: + return bitconfig_6839; + } + return 0; + } + switch (ivar1) { + case 660: + return bitconfig_5942; + case 661: + return bitconfig_5943; + case 662: + return bitconfig_5944; + case 663: + return bitconfig_5945; + case 664: + return bitconfig_5946; + case 665: + return bitconfig_5947; + case 666: + return bitconfig_5948; + case 667: + return bitconfig_5949; + case 668: + return bitconfig_5950; + case 669: + return bitconfig_5951; + case 670: + return bitconfig_5952; + case 671: + return bitconfig_5953; + case 672: + return bitconfig_5954; + case 673: + return bitconfig_5955; + case 674: + return bitconfig_5956; + case 675: + return bitconfig_5957; + case 676: + return bitconfig_5958; + case 677: + return bitconfig_5959; + case 678: + return bitconfig_5960; + case 679: + return bitconfig_5961; + case 680: + return bitconfig_5962; + case 681: + return bitconfig_5963; + case 682: + return bitconfig_5964; + case 683: + return bitconfig_5965; + case 684: + return bitconfig_5966; + case 685: + return bitconfig_5967; + case 1005: + return bitconfig_7768; + case 686: + return bitconfig_5968; + case 1006: + return bitconfig_7769; + case 1029: + return bitconfig_7381; + } + return 0; +} diff --git a/dumps/scripts/2297.cs2 b/dumps/scripts/2297.cs2 new file mode 100644 index 000000000..9e316149b --- /dev/null +++ b/dumps/scripts/2297.cs2 @@ -0,0 +1,113 @@ +int script_2297(int arg0) { + int ivar1; + ivar1 = cs2method_3408(105, 74, 2279, arg0); + if (((boolean)bitconfig_6840)) { + ivar1 = cs2method_3408(105, 74, 863, arg0); + switch (ivar1) { + case 888: + return bitconfig_6862; + case 889: + return bitconfig_6863; + case 890: + return bitconfig_6864; + case 891: + return bitconfig_6865; + case 892: + return bitconfig_6866; + case 893: + return bitconfig_6867; + case 894: + return bitconfig_6868; + case 895: + return bitconfig_6869; + case 896: + return bitconfig_6870; + case 897: + return bitconfig_6871; + case 898: + return bitconfig_6872; + case 899: + return bitconfig_6873; + case 900: + return bitconfig_6874; + case 901: + return bitconfig_6875; + case 902: + return bitconfig_6876; + case 903: + return bitconfig_6877; + case 904: + return bitconfig_6878; + case 905: + return bitconfig_6879; + case 906: + return bitconfig_6880; + case 907: + return bitconfig_6881; + } + return 0; + } + switch (ivar1) { + case 660: + return bitconfig_5971; + case 661: + return bitconfig_5972; + case 662: + return bitconfig_5973; + case 663: + return bitconfig_5974; + case 664: + return bitconfig_5975; + case 665: + return bitconfig_5976; + case 666: + return bitconfig_5977; + case 667: + return bitconfig_5978; + case 668: + return bitconfig_5979; + case 669: + return bitconfig_5980; + case 670: + return bitconfig_5981; + case 671: + return bitconfig_5982; + case 672: + return bitconfig_5983; + case 673: + return bitconfig_5984; + case 674: + return bitconfig_5985; + case 675: + return bitconfig_5986; + case 676: + return bitconfig_5987; + case 677: + return bitconfig_5988; + case 678: + return bitconfig_5989; + case 679: + return bitconfig_5990; + case 680: + return bitconfig_5991; + case 681: + return bitconfig_5992; + case 682: + return bitconfig_5993; + case 683: + return bitconfig_5994; + case 684: + return bitconfig_5995; + case 685: + return bitconfig_5996; + case 1005: + return bitconfig_7770; + case 686: + return bitconfig_5997; + case 1006: + return bitconfig_7771; + case 1029: + return bitconfig_7382; + } + return 0; +} diff --git a/dumps/scripts/2298.cs2 b/dumps/scripts/2298.cs2 new file mode 100644 index 000000000..c20453e71 --- /dev/null +++ b/dumps/scripts/2298.cs2 @@ -0,0 +1,4 @@ +void script_2298() { + script_817(5); + return; +} diff --git a/dumps/scripts/2299.cs2 b/dumps/scripts/2299.cs2 new file mode 100644 index 000000000..82d69dbf7 --- /dev/null +++ b/dumps/scripts/2299.cs2 @@ -0,0 +1,18 @@ +void script_2299(int arg0) { + if (((boolean)globalint_181)) { + if (((boolean)bitconfig_6840)) { + setWidgetContextMenuOption(2, new WidgetPointer(arg0), "Finish quick curse selection"); + setWidgetText(new WidgetPointer(271,46), "Select your quick curses:"); + } else { + setWidgetContextMenuOption(2, new WidgetPointer(arg0), "Finish quick prayer selection"); + setWidgetText(new WidgetPointer(271,46), "Select your quick prayers:"); + } + } else if (((boolean)bitconfig_6840)) { + setWidgetContextMenuOption(2, new WidgetPointer(arg0), "Select quick curses"); + } else { + setWidgetContextMenuOption(2, new WidgetPointer(arg0), "Select quick prayers"); + } + script_817(5); + script_2303(); + return; +} diff --git a/dumps/scripts/23.cs2 b/dumps/scripts/23.cs2 new file mode 100644 index 000000000..fc1638d9c --- /dev/null +++ b/dumps/scripts/23.cs2 @@ -0,0 +1,360 @@ +void script_23() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar0; + string svar1; + string svar2; + string svar3; + int stack_dump0; + cs2func_script_12_struct(1,1,0) structdump_1; + int stack_dump2; + cs2func_script_13_struct(1,1,0) structdump_3; + cs2func_script_13_struct(1,1,0) structdump_4; + cs2func_script_13_struct(1,1,0) structdump_5; + cs2func_script_13_struct(1,1,0) structdump_6; + cs2func_script_13_struct(1,1,0) structdump_7; + cs2func_script_13_struct(1,1,0) structdump_8; + cs2func_script_13_struct(1,1,0) structdump_9; + cs2func_script_13_struct(1,1,0) structdump_10; + cs2func_script_13_struct(1,1,0) structdump_11; + cs2func_script_13_struct(1,1,0) structdump_12; + cs2func_script_13_struct(1,1,0) structdump_13; + cs2func_script_13_struct(1,1,0) structdump_14; + cs2func_script_13_struct(1,1,0) structdump_15; + cs2func_script_13_struct(1,1,0) structdump_16; + cs2func_script_13_struct(1,1,0) structdump_17; + cs2func_script_13_struct(1,1,0) structdump_18; + cs2func_script_13_struct(1,1,0) structdump_19; + int stack_dump20; + cs2func_script_1567_struct(2,2,0) structdump_21; + cs2func_script_14_struct(2,2,0) structdump_22; + flow_0: + ivar0 = 0; + svar0 = ""; + stack_dump0 = bitconfig_3288; + structdump_1 = script_12(stack_dump0); + ivar0 = structdump_1.intpart_0; + svar0 = structdump_1.stringpart_0; + setWidgetText(new WidgetPointer(499,6), svar0); + setScriptCallOnClickContextMenu(212, cs2method_3408(105, 115, 696, bitconfig_3288), "s", new WidgetPointer(499,28)); + svar1 = ""; + ivar1 = 0; + if (ivar0 > 1) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 0; + structdump_3 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_3.intpart_0; + svar1 = structdump_3.stringpart_0; + setWidgetText(new WidgetPointer(499,10), svar1); + setWidgetIsHidden(false, new WidgetPointer(499,10)); + } else { + setWidgetText(new WidgetPointer(499,10), ""); + setWidgetIsHidden(true, new WidgetPointer(499,10)); + } + if (ivar0 >= 2) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 1; + structdump_4 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_4.intpart_0; + svar1 = structdump_4.stringpart_0; + setWidgetText(new WidgetPointer(499,11), svar1); + setWidgetPosition(353, 78, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,11)); + } else { + setWidgetText(new WidgetPointer(499,11), ""); + setWidgetIsHidden(true, new WidgetPointer(499,11)); + } + if (ivar0 >= 3) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 2; + structdump_5 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_5.intpart_0; + svar1 = structdump_5.stringpart_0; + setWidgetText(new WidgetPointer(499,12), svar1); + setWidgetPosition(353, 95, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,12)); + } else { + setWidgetText(new WidgetPointer(499,12), ""); + setWidgetIsHidden(true, new WidgetPointer(499,12)); + } + if (ivar0 >= 4) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 3; + structdump_6 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_6.intpart_0; + svar1 = structdump_6.stringpart_0; + setWidgetText(new WidgetPointer(499,13), svar1); + setWidgetPosition(353, 114, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,13)); + } else { + setWidgetText(new WidgetPointer(499,13), ""); + setWidgetIsHidden(true, new WidgetPointer(499,13)); + } + if (ivar0 >= 5) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 4; + structdump_7 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_7.intpart_0; + svar1 = structdump_7.stringpart_0; + setWidgetText(new WidgetPointer(499,14), svar1); + setWidgetPosition(353, 129, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,14)); + } else { + setWidgetText(new WidgetPointer(499,14), ""); + setWidgetIsHidden(true, new WidgetPointer(499,14)); + } + if (ivar0 >= 6) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 5; + structdump_8 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_8.intpart_0; + svar1 = structdump_8.stringpart_0; + setWidgetText(new WidgetPointer(499,15), svar1); + setWidgetPosition(353, 146, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,15)); + } else { + setWidgetText(new WidgetPointer(499,15), ""); + setWidgetIsHidden(true, new WidgetPointer(499,15)); + } + if (ivar0 >= 7) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 6; + structdump_9 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_9.intpart_0; + svar1 = structdump_9.stringpart_0; + setWidgetText(new WidgetPointer(499,16), svar1); + setWidgetPosition(353, 168, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,16)); + } else { + setWidgetText(new WidgetPointer(499,16), ""); + setWidgetIsHidden(true, new WidgetPointer(499,16)); + } + if (ivar0 >= 8) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 7; + structdump_10 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_10.intpart_0; + svar1 = structdump_10.stringpart_0; + setWidgetText(new WidgetPointer(499,17), svar1); + setWidgetPosition(353, 180, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,17)); + } else { + setWidgetText(new WidgetPointer(499,17), ""); + setWidgetIsHidden(true, new WidgetPointer(499,17)); + } + if (ivar0 >= 9) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 8; + structdump_11 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_11.intpart_0; + svar1 = structdump_11.stringpart_0; + setWidgetText(new WidgetPointer(499,18), svar1); + setWidgetPosition(353, 197, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,18)); + } else { + setWidgetText(new WidgetPointer(499,18), ""); + setWidgetIsHidden(true, new WidgetPointer(499,18)); + } + if (ivar0 >= 10) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 9; + structdump_12 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_12.intpart_0; + svar1 = structdump_12.stringpart_0; + setWidgetText(new WidgetPointer(499,19), svar1); + setWidgetPosition(353, 214, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,19)); + } else { + setWidgetText(new WidgetPointer(499,19), ""); + setWidgetIsHidden(true, new WidgetPointer(499,19)); + } + if (ivar0 >= 11) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 10; + structdump_13 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_13.intpart_0; + svar1 = structdump_13.stringpart_0; + setWidgetText(new WidgetPointer(499,20), svar1); + setWidgetPosition(353, 231, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,20)); + } else { + setWidgetText(new WidgetPointer(499,20), ""); + setWidgetIsHidden(true, new WidgetPointer(499,20)); + } + if (ivar0 >= 12) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 11; + structdump_14 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_14.intpart_0; + svar1 = structdump_14.stringpart_0; + setWidgetText(new WidgetPointer(499,21), svar1); + setWidgetPosition(353, 248, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,21)); + } else { + setWidgetText(new WidgetPointer(499,21), ""); + setWidgetIsHidden(true, new WidgetPointer(499,21)); + } + if (ivar0 >= 13) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 12; + structdump_15 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_15.intpart_0; + svar1 = structdump_15.stringpart_0; + setWidgetText(new WidgetPointer(499,22), svar1); + setWidgetPosition(353, 265, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,22)); + } else { + setWidgetText(new WidgetPointer(499,22), ""); + setWidgetIsHidden(true, new WidgetPointer(499,22)); + } + if (ivar0 >= 14) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 13; + structdump_16 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_16.intpart_0; + svar1 = structdump_16.stringpart_0; + setWidgetText(new WidgetPointer(499,23), svar1); + setWidgetPosition(353, 282, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,23)); + } else { + setWidgetText(new WidgetPointer(499,23), ""); + setWidgetIsHidden(true, new WidgetPointer(499,23)); + } + if (ivar0 >= 15) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 14; + structdump_17 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_17.intpart_0; + svar1 = structdump_17.stringpart_0; + setWidgetText(new WidgetPointer(499,24), svar1); + setWidgetPosition(353, 299, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,24)); + } else { + setWidgetText(new WidgetPointer(499,24), ""); + setWidgetIsHidden(true, new WidgetPointer(499,24)); + } + if (ivar0 >= 16) { + stack_dump0 = bitconfig_3288; + stack_dump2 = 15; + structdump_18 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_18.intpart_0; + svar1 = structdump_18.stringpart_0; + setWidgetText(new WidgetPointer(499,25), svar1); + setWidgetPosition(353, 316, 0, 0, new WidgetPointer(499,5)); + setWidgetIsHidden(false, new WidgetPointer(499,25)); + } else { + setWidgetText(new WidgetPointer(499,25), ""); + setWidgetIsHidden(true, new WidgetPointer(499,25)); + } + if (ivar0 < 2) { + setWidgetIsHidden(true, new WidgetPointer(499,4)); + setWidgetIsHidden(true, new WidgetPointer(499,3)); + setWidgetIsHidden(true, new WidgetPointer(499,5)); + } else { + setWidgetIsHidden(false, new WidgetPointer(499,4)); + setWidgetIsHidden(false, new WidgetPointer(499,3)); + setWidgetIsHidden(false, new WidgetPointer(499,5)); + } + if (ivar0 == 2) { + setWidgetModel(20838, new WidgetPointer(499,3)); + } else if (ivar0 == 3) { + setWidgetModel(20839, new WidgetPointer(499,3)); + } else if (ivar0 == 4) { + setWidgetModel(20840, new WidgetPointer(499,3)); + } else if (ivar0 == 5) { + setWidgetModel(20841, new WidgetPointer(499,3)); + } else if (ivar0 == 6) { + setWidgetModel(20842, new WidgetPointer(499,3)); + } else if (ivar0 == 7) { + setWidgetModel(20843, new WidgetPointer(499,3)); + } else if (ivar0 == 8) { + setWidgetModel(20844, new WidgetPointer(499,3)); + } else if (ivar0 == 9) { + setWidgetModel(20845, new WidgetPointer(499,3)); + } else if (ivar0 == 10) { + setWidgetModel(20846, new WidgetPointer(499,3)); + } else if (ivar0 == 11) { + setWidgetModel(20847, new WidgetPointer(499,3)); + } else if (ivar0 == 12) { + setWidgetModel(20848, new WidgetPointer(499,3)); + } else if (ivar0 == 13) { + setWidgetModel(20849, new WidgetPointer(499,3)); + } else if (ivar0 == 14) { + setWidgetModel(20850, new WidgetPointer(499,3)); + } else if (ivar0 == 15) { + setWidgetModel(43501, new WidgetPointer(499,3)); + } else { + if (ivar0 == 16) { + setWidgetModel(43500, new WidgetPointer(499,3)); + } + } + stack_dump0 = bitconfig_3288; + stack_dump2 = bitconfig_3289; + structdump_19 = script_13(stack_dump0, stack_dump2); + ivar1 = structdump_19.intpart_0; + svar1 = structdump_19.stringpart_0; + setWidgetText(new WidgetPointer(499,9), svar1); + if (((boolean)ivar1)) { + setWidgetText(new WidgetPointer(499,9), svar1); + } else { + setWidgetText(new WidgetPointer(499,9), concat(svar1, " - Members Only")); + } + deleteAllExtraChilds(new WidgetPointer(499,7)); + deleteAllExtraChilds(new WidgetPointer(499,8)); + ivar2 = 0; + ivar3 = 3; + ivar4 = 0; + ivar5 = 7620; + ivar6 = 2287; + svar2 = ""; + svar3 = ""; + IF (((boolean)script_1566(bitconfig_3288, bitconfig_3289))) + GOTO flow_85 + GOTO flow_88 + flow_85: + IF (ivar6 != -1) + GOTO flow_86 + GOTO flow_87 + flow_86: + stack_dump0 = bitconfig_3288; + stack_dump2 = bitconfig_3289; + stack_dump20 = ivar2; + structdump_21 = script_1567(stack_dump0, stack_dump2, stack_dump20); + svar3 = structdump_21.stringpart_1; + svar2 = structdump_21.stringpart_0; + ivar6 = structdump_21.intpart_1; + ivar4 = structdump_21.intpart_0; + ivar3 = add(ivar3, script_24(ivar4, ivar5, ivar6, ivar2, ivar3, svar2)); + ivar2 = add(ivar2, 1); + GOTO flow_85 + flow_87: + GOTO flow_90 + flow_88: + IF (ivar5 != -1) + GOTO flow_89 + GOTO flow_90 + flow_89: + stack_dump0 = bitconfig_3288; + stack_dump2 = bitconfig_3289; + stack_dump20 = ivar2; + structdump_22 = script_14(stack_dump0, stack_dump2, stack_dump20); + svar3 = structdump_22.stringpart_1; + svar2 = structdump_22.stringpart_0; + ivar5 = structdump_22.intpart_1; + ivar4 = structdump_22.intpart_0; + ivar3 = add(ivar3, script_24(ivar4, ivar5, ivar6, ivar2, ivar3, svar2)); + ivar2 = add(ivar2, 1); + GOTO flow_88 + flow_90: + cs2method2100(0, 0, new WidgetPointer(499,7)); + setWidgetScrollMax(296, ivar3, new WidgetPointer(499,7)); + if (ivar3 > 240) { + script_31(32702472, 32702471, 798, 795, 796, 797, 793, 794); + } + return; +} diff --git a/dumps/scripts/230.cs2 b/dumps/scripts/230.cs2 new file mode 100644 index 000000000..156e03392 --- /dev/null +++ b/dumps/scripts/230.cs2 @@ -0,0 +1,6 @@ +void script_230() { + script_231(); + script_232(); + setWidgetIsHidden(false, new WidgetPointer(594,166)); + return; +} diff --git a/dumps/scripts/2300.cs2 b/dumps/scripts/2300.cs2 new file mode 100644 index 000000000..6851972fa --- /dev/null +++ b/dumps/scripts/2300.cs2 @@ -0,0 +1,15 @@ +void script_2300(int arg0) { + if (arg0 != 1) { + return; + } + if (((boolean)standart_config_1397)) { + return; + } + if (((boolean)script_42(globalint_182))) { + globalint_182 = 0; + } else { + globalint_182 = 1; + } + script_2303(); + return; +} diff --git a/dumps/scripts/2301.cs2 b/dumps/scripts/2301.cs2 new file mode 100644 index 000000000..8ab30e171 --- /dev/null +++ b/dumps/scripts/2301.cs2 @@ -0,0 +1,4 @@ +void script_2301(int arg0) { + script_2308(arg0, script_42(globalint_182)); + return; +} diff --git a/dumps/scripts/2302.cs2 b/dumps/scripts/2302.cs2 new file mode 100644 index 000000000..67d55373b --- /dev/null +++ b/dumps/scripts/2302.cs2 @@ -0,0 +1,4 @@ +void script_2302(int arg0) { + script_2309(arg0, script_42(globalint_182)); + return; +} diff --git a/dumps/scripts/2303.cs2 b/dumps/scripts/2303.cs2 new file mode 100644 index 000000000..1cf066d87 --- /dev/null +++ b/dumps/scripts/2303.cs2 @@ -0,0 +1,29 @@ +void script_2303() { + if (((boolean)script_42(globalint_182))) { + setWidgetSprite(782, new WidgetPointer(749,2)); + if (((boolean)bitconfig_6840)) { + setWidgetContextMenuOption(1, new WidgetPointer(749,1), "Turn curses off"); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(749,1), "Turn prayers off"); + } + } else if (((boolean)bitconfig_6840)) { + setWidgetContextMenuOption(1, new WidgetPointer(749,1), "Turn quick curses on"); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(749,1), "Turn quick prayers on"); + } + setWidgetSprite(1209, new WidgetPointer(749,2)); + if (getDisplayMode() >= 2) { + setWidgetSprite(1207, new WidgetPointer(749,1)); + setWidgetPosition(25, 1, 0, 0, new WidgetPointer(749,2)); + setWidgetPosition(25, 1, 0, 0, new WidgetPointer(749,3)); + setWidgetPosition(3, 15, 0, 0, new WidgetPointer(749,4)); + setWidgetPosition(31, 7, 0, 0, new WidgetPointer(749,5)); + } else { + setWidgetSprite(1206, new WidgetPointer(749,1)); + setWidgetPosition(1, 1, 0, 0, new WidgetPointer(749,2)); + setWidgetPosition(1, 1, 0, 0, new WidgetPointer(749,3)); + setWidgetPosition(31, 15, 0, 0, new WidgetPointer(749,4)); + setWidgetPosition(7, 7, 0, 0, new WidgetPointer(749,5)); + } + return; +} diff --git a/dumps/scripts/2304.cs2 b/dumps/scripts/2304.cs2 new file mode 100644 index 000000000..d8315a1ba --- /dev/null +++ b/dumps/scripts/2304.cs2 @@ -0,0 +1,5 @@ +void script_2304() { + setScriptCallOnGeneralDataChange(2305, "", new WidgetPointer(750,1)); + script_2306(); + return; +} diff --git a/dumps/scripts/2305.cs2 b/dumps/scripts/2305.cs2 new file mode 100644 index 000000000..c4a19e48d --- /dev/null +++ b/dumps/scripts/2305.cs2 @@ -0,0 +1,4 @@ +void script_2305() { + script_2306(); + return; +} diff --git a/dumps/scripts/2306.cs2 b/dumps/scripts/2306.cs2 new file mode 100644 index 000000000..d2b67ef2b --- /dev/null +++ b/dumps/scripts/2306.cs2 @@ -0,0 +1,15 @@ +void script_2306() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 31; + ivar1 = 0; + ivar2 = 31; + if (getRunEnergy() >= 100) { + ivar1 = 0; + } else { + ivar1 = subtract(ivar0, divide(multiply(ivar0, getRunEnergy()), 100)); + } + setWidgetSize(ivar2, ivar1, 0, 0, new WidgetPointer(750,4)); + return; +} diff --git a/dumps/scripts/2307.cs2 b/dumps/scripts/2307.cs2 new file mode 100644 index 000000000..fd1d4a727 --- /dev/null +++ b/dumps/scripts/2307.cs2 @@ -0,0 +1,4 @@ +void script_2307(int arg0) { + script_2309(arg0, globalint_119); + return; +} diff --git a/dumps/scripts/2308.cs2 b/dumps/scripts/2308.cs2 new file mode 100644 index 000000000..17aa250df --- /dev/null +++ b/dumps/scripts/2308.cs2 @@ -0,0 +1,8 @@ +void script_2308(int arg0,int arg1) { + if (getDisplayMode() >= 2) { + setWidgetSprite(1127, new WidgetPointer(arg0)); + } else { + setWidgetSprite(784, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2309.cs2 b/dumps/scripts/2309.cs2 new file mode 100644 index 000000000..72d3c8ad7 --- /dev/null +++ b/dumps/scripts/2309.cs2 @@ -0,0 +1,8 @@ +void script_2309(int arg0,int arg1) { + if (getDisplayMode() >= 2) { + setWidgetSprite(1207, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1206, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/231.cs2 b/dumps/scripts/231.cs2 new file mode 100644 index 000000000..db50d8b10 --- /dev/null +++ b/dumps/scripts/231.cs2 @@ -0,0 +1,13 @@ +void script_231() { + setWidgetIsHidden(true, new WidgetPointer(594,148)); + setWidgetIsHidden(true, new WidgetPointer(594,149)); + setWidgetIsHidden(true, new WidgetPointer(594,150)); + setWidgetIsHidden(true, new WidgetPointer(594,151)); + setWidgetIsHidden(true, new WidgetPointer(594,165)); + setWidgetIsHidden(true, new WidgetPointer(594,166)); + setWidgetIsHidden(true, new WidgetPointer(594,117)); + setWidgetIsHidden(true, new WidgetPointer(594,62)); + setWidgetIsHidden(true, new WidgetPointer(594,34)); + setWidgetIsHidden(true, new WidgetPointer(594,121)); + return; +} diff --git a/dumps/scripts/2310.cs2 b/dumps/scripts/2310.cs2 new file mode 100644 index 000000000..e7f65934b --- /dev/null +++ b/dumps/scripts/2310.cs2 @@ -0,0 +1,6 @@ +void script_2310() { + setWidgetSprite(2560, new WidgetPointer(137,157)); + setWidgetSprite(2560, new WidgetPointer(137,155)); + setWidgetSprite(2561, new WidgetPointer(137,156)); + return; +} diff --git a/dumps/scripts/2311.cs2 b/dumps/scripts/2311.cs2 new file mode 100644 index 000000000..6253b9222 --- /dev/null +++ b/dumps/scripts/2311.cs2 @@ -0,0 +1,6 @@ +void script_2311() { + setWidgetSprite(2558, new WidgetPointer(137,157)); + setWidgetSprite(2558, new WidgetPointer(137,155)); + setWidgetSprite(2559, new WidgetPointer(137,156)); + return; +} diff --git a/dumps/scripts/2312.cs2 b/dumps/scripts/2312.cs2 new file mode 100644 index 000000000..a97cc8bd4 --- /dev/null +++ b/dumps/scripts/2312.cs2 @@ -0,0 +1,53 @@ +void script_2312() { + int ivar0; + ivar0 = 0; + while (ivar0 < 31) { + createExtraChild(new WidgetPointer(137,75), 4, ivar0); + setWidgetSize(46, 20, 0, 0); + setWidgetPosition(4, multiply(ivar0, 20), 0, 0); + setWidgetFont(496); + setWidgetTextAlignment(1, 1, 0); + setWidgetText(intToStr(add(ivar0, 1))); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(2316, ivar0, "i"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 65280, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + ivar0 = add(ivar0, 1); + } + setWidgetScrollMax(0, multiply(ivar0, 20), new WidgetPointer(137,75)); + script_31(8978508, 8978507, 792, 789, 790, 791, 773, 788); + ivar0 = 0; + while (ivar0 < 12) { + createExtraChild(new WidgetPointer(137,78), 4, ivar0); + setWidgetSize(158, 20, 0, 0); + setWidgetPosition(4, multiply(ivar0, 20), 0, 0); + setWidgetFont(496); + setWidgetTextAlignment(1, 1, 0); + setWidgetText(cs2method_3408(105, 115, 950, ivar0)); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(2334, ivar0, "i"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 65280, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + ivar0 = add(ivar0, 1); + } + setWidgetScrollMax(0, multiply(ivar0, 20), new WidgetPointer(137,78)); + script_31(8978511, 8978510, 792, 789, 790, 791, 773, 788); + setWidgetIsHidden(true, new WidgetPointer(137,75)); + setWidgetIsHidden(true, new WidgetPointer(137,74)); + setWidgetIsHidden(true, new WidgetPointer(137,76)); + setWidgetIsHidden(true, new WidgetPointer(137,78)); + setWidgetIsHidden(true, new WidgetPointer(137,77)); + setWidgetIsHidden(true, new WidgetPointer(137,79)); + setWidgetIsHidden(true, new WidgetPointer(137,81)); + setWidgetIsHidden(true, new WidgetPointer(137,82)); + setWidgetIsHidden(true, new WidgetPointer(137,80)); + setWidgetIsHidden(true, new WidgetPointer(137,68)); + setWidgetIsHidden(true, new WidgetPointer(137,69)); + setWidgetIsHidden(true, new WidgetPointer(137,70)); + setWidgetIsHidden(false, new WidgetPointer(137,71)); + setWidgetIsHidden(false, new WidgetPointer(137,72)); + setWidgetIsHidden(false, new WidgetPointer(137,73)); + return; +} diff --git a/dumps/scripts/2313.cs2 b/dumps/scripts/2313.cs2 new file mode 100644 index 000000000..6057e1491 --- /dev/null +++ b/dumps/scripts/2313.cs2 @@ -0,0 +1,21 @@ +void script_2313() { + if (isWidgetHidden(new WidgetPointer(137,75))) { + setWidgetVFlip(1, new WidgetPointer(137,146)); + setWidgetIsHidden(false, new WidgetPointer(137,75)); + setWidgetIsHidden(false, new WidgetPointer(137,74)); + setWidgetIsHidden(false, new WidgetPointer(137,76)); + setWidgetIsHidden(false, new WidgetPointer(137,68)); + } else { + setWidgetVFlip(0, new WidgetPointer(137,146)); + setWidgetIsHidden(true, new WidgetPointer(137,75)); + setWidgetIsHidden(true, new WidgetPointer(137,74)); + setWidgetIsHidden(true, new WidgetPointer(137,76)); + setWidgetIsHidden(true, new WidgetPointer(137,68)); + } + setWidgetVFlip(0, new WidgetPointer(137,131)); + setWidgetIsHidden(true, new WidgetPointer(137,78)); + setWidgetIsHidden(true, new WidgetPointer(137,77)); + setWidgetIsHidden(true, new WidgetPointer(137,79)); + setWidgetIsHidden(true, new WidgetPointer(137,69)); + return; +} diff --git a/dumps/scripts/2314.cs2 b/dumps/scripts/2314.cs2 new file mode 100644 index 000000000..8914c9fd0 --- /dev/null +++ b/dumps/scripts/2314.cs2 @@ -0,0 +1,21 @@ +void script_2314() { + if (isWidgetHidden(new WidgetPointer(137,78))) { + setWidgetVFlip(1, new WidgetPointer(137,131)); + setWidgetIsHidden(false, new WidgetPointer(137,78)); + setWidgetIsHidden(false, new WidgetPointer(137,77)); + setWidgetIsHidden(false, new WidgetPointer(137,79)); + setWidgetIsHidden(false, new WidgetPointer(137,69)); + } else { + setWidgetVFlip(0, new WidgetPointer(137,131)); + setWidgetIsHidden(true, new WidgetPointer(137,78)); + setWidgetIsHidden(true, new WidgetPointer(137,77)); + setWidgetIsHidden(true, new WidgetPointer(137,79)); + setWidgetIsHidden(true, new WidgetPointer(137,69)); + } + setWidgetVFlip(0, new WidgetPointer(137,146)); + setWidgetIsHidden(true, new WidgetPointer(137,75)); + setWidgetIsHidden(true, new WidgetPointer(137,74)); + setWidgetIsHidden(true, new WidgetPointer(137,76)); + setWidgetIsHidden(true, new WidgetPointer(137,68)); + return; +} diff --git a/dumps/scripts/2315.cs2 b/dumps/scripts/2315.cs2 new file mode 100644 index 000000000..9f3d8100d --- /dev/null +++ b/dumps/scripts/2315.cs2 @@ -0,0 +1,13 @@ +void script_2315() { + setWidgetVFlip(0, new WidgetPointer(137,146)); + setWidgetIsHidden(true, new WidgetPointer(137,75)); + setWidgetIsHidden(true, new WidgetPointer(137,74)); + setWidgetIsHidden(true, new WidgetPointer(137,76)); + setWidgetIsHidden(true, new WidgetPointer(137,68)); + setWidgetVFlip(0, new WidgetPointer(137,131)); + setWidgetIsHidden(true, new WidgetPointer(137,78)); + setWidgetIsHidden(true, new WidgetPointer(137,77)); + setWidgetIsHidden(true, new WidgetPointer(137,79)); + setWidgetIsHidden(true, new WidgetPointer(137,69)); + return; +} diff --git a/dumps/scripts/2316.cs2 b/dumps/scripts/2316.cs2 new file mode 100644 index 000000000..25e7c7a05 --- /dev/null +++ b/dumps/scripts/2316.cs2 @@ -0,0 +1,9 @@ +void script_2316(int arg0) { + setWidgetText(new WidgetPointer(137,140), intToStr(add(arg0, 1))); + setWidgetVFlip(0, new WidgetPointer(137,146)); + setWidgetIsHidden(true, new WidgetPointer(137,75)); + setWidgetIsHidden(true, new WidgetPointer(137,76)); + setWidgetIsHidden(true, new WidgetPointer(137,74)); + setWidgetIsHidden(true, new WidgetPointer(137,68)); + return; +} diff --git a/dumps/scripts/2317.cs2 b/dumps/scripts/2317.cs2 new file mode 100644 index 000000000..0ee2716df --- /dev/null +++ b/dumps/scripts/2317.cs2 @@ -0,0 +1,4 @@ +void script_2317() { + script_2319(); + return; +} diff --git a/dumps/scripts/2318.cs2 b/dumps/scripts/2318.cs2 new file mode 100644 index 000000000..d505d301f --- /dev/null +++ b/dumps/scripts/2318.cs2 @@ -0,0 +1,9 @@ +void script_2318(int arg0) { + if (arg0 != 1) { + return; + } + playSoundEffect(2266, 1, 0); + bitconfig_8348 = subtract(1, bitconfig_8348); + script_2319(); + return; +} diff --git a/dumps/scripts/2319.cs2 b/dumps/scripts/2319.cs2 new file mode 100644 index 000000000..7043fee67 --- /dev/null +++ b/dumps/scripts/2319.cs2 @@ -0,0 +1,15 @@ +void script_2319() { + if (((boolean)bitconfig_8348)) { + setWidgetIsHidden(true, new WidgetPointer(762,0)); + setWidgetIsHidden(true, new WidgetPointer(763,0)); + setWidgetIsHidden(false, new WidgetPointer(667,0)); + setWidgetIsHidden(false, new WidgetPointer(763,1)); + } else { + setWidgetIsHidden(false, new WidgetPointer(762,0)); + setWidgetIsHidden(false, new WidgetPointer(763,0)); + setWidgetIsHidden(true, new WidgetPointer(667,0)); + setWidgetIsHidden(true, new WidgetPointer(763,1)); + } + script_722(); + return; +} diff --git a/dumps/scripts/232.cs2 b/dumps/scripts/232.cs2 new file mode 100644 index 000000000..fad14d226 --- /dev/null +++ b/dumps/scripts/232.cs2 @@ -0,0 +1,18 @@ +void script_232() { + setWidgetIsHidden(true, new WidgetPointer(594,62)); + setWidgetIsHidden(true, new WidgetPointer(594,117)); + setWidgetIsHidden(true, new WidgetPointer(594,121)); + setWidgetIsHidden(true, new WidgetPointer(594,34)); + if (isWidgetHidden(new WidgetPointer(594,61))) { + setWidgetIsHidden(false, new WidgetPointer(594,62)); + } else if (isWidgetHidden(new WidgetPointer(594,104))) { + setWidgetIsHidden(false, new WidgetPointer(594,117)); + } else if (isWidgetHidden(new WidgetPointer(594,120))) { + setWidgetIsHidden(false, new WidgetPointer(594,121)); + } else { + if (isWidgetHidden(new WidgetPointer(594,33))) { + setWidgetIsHidden(false, new WidgetPointer(594,34)); + } + } + return; +} diff --git a/dumps/scripts/2320.cs2 b/dumps/scripts/2320.cs2 new file mode 100644 index 000000000..0724a66ab --- /dev/null +++ b/dumps/scripts/2320.cs2 @@ -0,0 +1,4 @@ +void script_2320() { + setWidgetAnimation(1378, new WidgetPointer(305,2)); + return; +} diff --git a/dumps/scripts/2321.cs2 b/dumps/scripts/2321.cs2 new file mode 100644 index 000000000..9ed5d5136 --- /dev/null +++ b/dumps/scripts/2321.cs2 @@ -0,0 +1,11 @@ +void script_2321(int arg0) { + if (getWidgetActualX(new WidgetPointer(arg0)) < subtract(getWidgetActualWidth(new WidgetPointer(306,1)), 1)) { + if (getWidgetActualX(new WidgetPointer(arg0)) == add(140, getWidgetActualWidth(new WidgetPointer(arg0)))) { + setScriptCallOnGameloop(2323, new WidgetPointer(306,9), "I", new WidgetPointer(306,22)); + } + setWidgetPosition(add(1, getWidgetActualX(new WidgetPointer(arg0))), getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } else { + script_2322(); + } + return; +} diff --git a/dumps/scripts/2322.cs2 b/dumps/scripts/2322.cs2 new file mode 100644 index 000000000..0a01f4ad2 --- /dev/null +++ b/dumps/scripts/2322.cs2 @@ -0,0 +1,11 @@ +void script_2322() { + int ivar0; + ivar0 = 20054024; + globalint_763 = cs2method_3408(105, 109, 208, rndExcl(getCommonDefinitionSize(208))); + if (globalint_763 != -1) { + setWidgetModel(globalint_763, new WidgetPointer(ivar0)); + } + setWidgetPosition(subtract(0, getWidgetActualWidth(new WidgetPointer(ivar0))), 120, 0, 0, new WidgetPointer(ivar0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,21)); + return; +} diff --git a/dumps/scripts/2323.cs2 b/dumps/scripts/2323.cs2 new file mode 100644 index 000000000..dfc6a018c --- /dev/null +++ b/dumps/scripts/2323.cs2 @@ -0,0 +1,11 @@ +void script_2323(int arg0) { + if (getWidgetActualX(new WidgetPointer(arg0)) < subtract(getWidgetActualWidth(new WidgetPointer(306,1)), 1)) { + if (getWidgetActualX(new WidgetPointer(arg0)) == add(140, getWidgetActualWidth(new WidgetPointer(arg0)))) { + setScriptCallOnGameloop(399, new WidgetPointer(306,6), "I", new WidgetPointer(306,19)); + } + setWidgetPosition(add(1, getWidgetActualX(new WidgetPointer(arg0))), getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } else { + script_2324(); + } + return; +} diff --git a/dumps/scripts/2324.cs2 b/dumps/scripts/2324.cs2 new file mode 100644 index 000000000..eaba8576a --- /dev/null +++ b/dumps/scripts/2324.cs2 @@ -0,0 +1,11 @@ +void script_2324() { + int ivar0; + ivar0 = 20054025; + globalint_764 = cs2method_3408(105, 109, 208, rndExcl(getCommonDefinitionSize(208))); + if (globalint_764 != -1) { + setWidgetModel(globalint_764, new WidgetPointer(ivar0)); + } + setWidgetPosition(subtract(0, getWidgetActualWidth(new WidgetPointer(ivar0))), 120, 0, 0, new WidgetPointer(ivar0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,22)); + return; +} diff --git a/dumps/scripts/2325.cs2 b/dumps/scripts/2325.cs2 new file mode 100644 index 000000000..e7bb79559 --- /dev/null +++ b/dumps/scripts/2325.cs2 @@ -0,0 +1,26 @@ +void script_2325() { + if (((boolean)globalint_766) || (globalint_766 == 2)) { + messageType0("You can't do that right now."); + return; + } + playSoundEffect(6421, 1, 0); + if ((getWidgetActualX(new WidgetPointer(306,6)) >= getWidgetActualX(new WidgetPointer(306,18))) && (getWidgetActualX(new WidgetPointer(306,6)) < add(getWidgetActualX(new WidgetPointer(306,18)), getWidgetActualWidth(new WidgetPointer(306,18))))) { + globalint_765 = 1; + script_2326(globalint_761); + } + if ((getWidgetActualX(new WidgetPointer(306,7)) >= getWidgetActualX(new WidgetPointer(306,18))) && (getWidgetActualX(new WidgetPointer(306,7)) < add(getWidgetActualX(new WidgetPointer(306,18)), getWidgetActualWidth(new WidgetPointer(306,18))))) { + globalint_765 = 2; + script_2326(globalint_762); + } + if ((getWidgetActualX(new WidgetPointer(306,8)) >= getWidgetActualX(new WidgetPointer(306,18))) && (getWidgetActualX(new WidgetPointer(306,8)) < add(getWidgetActualX(new WidgetPointer(306,18)), getWidgetActualWidth(new WidgetPointer(306,18))))) { + globalint_765 = 3; + script_2326(globalint_763); + } + if ((getWidgetActualX(new WidgetPointer(306,9)) >= getWidgetActualX(new WidgetPointer(306,18))) && (getWidgetActualX(new WidgetPointer(306,9)) < add(getWidgetActualX(new WidgetPointer(306,18)), getWidgetActualWidth(new WidgetPointer(306,18))))) { + globalint_765 = 4; + script_2326(globalint_764); + } + globalint_766 = 1; + setScriptCallOnGameloop(2328, new WidgetPointer(-32768,3), "I", new WidgetPointer(306,10)); + return; +} diff --git a/dumps/scripts/2326.cs2 b/dumps/scripts/2326.cs2 new file mode 100644 index 000000000..9a0d95c7b --- /dev/null +++ b/dumps/scripts/2326.cs2 @@ -0,0 +1,32 @@ +void script_2326(int arg0) { + int ivar1; + ivar1 = getClientCycle(); + switch (arg0) { + case 32826: + case 32820: + case 32828: + globalint_767 = 0; + setWidgetIsHidden(false, new WidgetPointer(306,25)); + setWidgetText(new WidgetPointer(306,26), "Incorrect"); + playSoundEffect(6424, 1, 0); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(306,26)); + setScriptCallOnGameloop(2327, ivar1, "i", new WidgetPointer(306,25)); + break; + default: + globalint_767 = add(globalint_767, 1); + if (globalint_767 == 10) { + setWidgetIsHidden(false, new WidgetPointer(306,27)); + setWidgetContextMenuOption(1, new WidgetPointer(306,29), "Train"); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(306,23)); + } else { + setWidgetIsHidden(false, new WidgetPointer(306,25)); + setWidgetText(new WidgetPointer(306,26), "Correct"); + playSoundEffect(6423, 1, 0); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(306,26)); + setScriptCallOnGameloop(2327, ivar1, "i", new WidgetPointer(306,25)); + } + } + setWidgetText(new WidgetPointer(306,3), "Correct: " + intToStr(globalint_767) + "/" + intToStr(10)); + playSoundEffect(6423, 1, 0); + return; +} diff --git a/dumps/scripts/2327.cs2 b/dumps/scripts/2327.cs2 new file mode 100644 index 000000000..b42d8e526 --- /dev/null +++ b/dumps/scripts/2327.cs2 @@ -0,0 +1,7 @@ +void script_2327(int arg0) { + if (getClientCycle() >= add(100, arg0)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,25)); + setWidgetIsHidden(true, new WidgetPointer(306,25)); + } + return; +} diff --git a/dumps/scripts/2328.cs2 b/dumps/scripts/2328.cs2 new file mode 100644 index 000000000..46a9506be --- /dev/null +++ b/dumps/scripts/2328.cs2 @@ -0,0 +1,51 @@ +void script_2328(int arg0) { + if (((boolean)globalint_766)) { + if (getWidgetActualY(new WidgetPointer(arg0)) > 100) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), subtract(getWidgetActualY(new WidgetPointer(arg0)), 2), 0, 0, new WidgetPointer(arg0)); + playSoundEffect(6422, 1, 0); + if (getWidgetActualY(new WidgetPointer(arg0)) < 170) { + switch (globalint_765) { + case 1: + setWidgetPosition(getWidgetActualX(new WidgetPointer(306,6)), subtract(getWidgetActualY(new WidgetPointer(306,6)), 2), 0, 0, new WidgetPointer(306,6)); + break; + case 2: + setWidgetPosition(getWidgetActualX(new WidgetPointer(306,7)), subtract(getWidgetActualY(new WidgetPointer(306,7)), 2), 0, 0, new WidgetPointer(306,7)); + break; + case 3: + setWidgetPosition(getWidgetActualX(new WidgetPointer(306,8)), subtract(getWidgetActualY(new WidgetPointer(306,8)), 2), 0, 0, new WidgetPointer(306,8)); + break; + case 4: + setWidgetPosition(getWidgetActualX(new WidgetPointer(306,9)), subtract(getWidgetActualY(new WidgetPointer(306,9)), 2), 0, 0, new WidgetPointer(306,9)); + } + } + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), 100, 0, 0, new WidgetPointer(arg0)); + globalint_766 = 2; + switch (globalint_765) { + case 1: + script_1411(); + break; + case 2: + script_2056(); + break; + case 3: + script_2322(); + break; + case 4: + script_2324(); + } + } + } else { + if (globalint_766 == 2) { + if (getWidgetActualY(new WidgetPointer(arg0)) < 200) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), add(getWidgetActualY(new WidgetPointer(arg0)), 2), 0, 0, new WidgetPointer(arg0)); + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), 200, 0, 0, new WidgetPointer(arg0)); + globalint_766 = 0; + globalint_765 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + } + } + return; +} diff --git a/dumps/scripts/2329.cs2 b/dumps/scripts/2329.cs2 new file mode 100644 index 000000000..55e25dd5d --- /dev/null +++ b/dumps/scripts/2329.cs2 @@ -0,0 +1,93 @@ +void script_2329() { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,6)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,7)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,8)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,9)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,10)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,11)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,12)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(496,13)); + if (((boolean)bitconfig_3264)) { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,4)); + } else if (bitconfig_3264 == 2) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,5)); + } else if (bitconfig_3264 == 3) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,6)); + } else if (bitconfig_3264 == 4) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,6)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,7)); + } else if (bitconfig_3264 == 5) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,6)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,7)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,8)); + } else if (bitconfig_3264 == 6) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,6)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,7)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,8)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,9)); + } else if (bitconfig_3264 == 7) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,6)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,7)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,8)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,9)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,10)); + } else if (bitconfig_3264 == 8) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,6)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,7)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,8)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,9)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,10)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,11)); + } else if (bitconfig_3264 == 9) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,6)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,7)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,8)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,9)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,10)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,11)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,12)); + } else if (bitconfig_3264 == 10) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,6)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,7)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,8)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,9)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,10)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,11)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,12)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(496,13)); + } else { + if (bitconfig_3264 == 11) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,4)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,5)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,6)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,7)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,8)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,9)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,10)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,11)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,12)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,12)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(496,13)); + } + } + return; +} diff --git a/dumps/scripts/233.cs2 b/dumps/scripts/233.cs2 new file mode 100644 index 000000000..7b744188c --- /dev/null +++ b/dumps/scripts/233.cs2 @@ -0,0 +1,4 @@ +void script_233() { + script_231(); + return; +} diff --git a/dumps/scripts/2330.cs2 b/dumps/scripts/2330.cs2 new file mode 100644 index 000000000..f78bcc7d3 --- /dev/null +++ b/dumps/scripts/2330.cs2 @@ -0,0 +1,4 @@ +void script_2330(int arg0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2331.cs2 b/dumps/scripts/2331.cs2 new file mode 100644 index 000000000..7f1128f31 --- /dev/null +++ b/dumps/scripts/2331.cs2 @@ -0,0 +1,4 @@ +void script_2331(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2332.cs2 b/dumps/scripts/2332.cs2 new file mode 100644 index 000000000..080175db5 --- /dev/null +++ b/dumps/scripts/2332.cs2 @@ -0,0 +1,11 @@ +string script_2332(string arg0,string arg1,string arg2) { + int ivar0; + int ivar1; + ivar0 = strIndexof(0, arg0, arg1); + ivar1 = strLength(arg1); + while (ivar0 != -1) { + arg0 = substr(0, ivar0, arg0) + arg2 + substr(add(ivar0, ivar1), strLength(arg0), arg0); + ivar0 = strIndexof(ivar0, arg0, arg1); + } + return arg0; +} diff --git a/dumps/scripts/2333.cs2 b/dumps/scripts/2333.cs2 new file mode 100644 index 000000000..1bf82fef4 --- /dev/null +++ b/dumps/scripts/2333.cs2 @@ -0,0 +1,4 @@ +void script_2333(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16) { + script_2335(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16); + return; +} diff --git a/dumps/scripts/2334.cs2 b/dumps/scripts/2334.cs2 new file mode 100644 index 000000000..2fabba7f6 --- /dev/null +++ b/dumps/scripts/2334.cs2 @@ -0,0 +1,9 @@ +void script_2334(int arg0) { + setWidgetText(new WidgetPointer(137,125), cs2method_3408(105, 115, 950, arg0)); + setWidgetVFlip(0, new WidgetPointer(137,131)); + setWidgetIsHidden(true, new WidgetPointer(137,78)); + setWidgetIsHidden(true, new WidgetPointer(137,79)); + setWidgetIsHidden(true, new WidgetPointer(137,77)); + setWidgetIsHidden(true, new WidgetPointer(137,69)); + return; +} diff --git a/dumps/scripts/2335.cs2 b/dumps/scripts/2335.cs2 new file mode 100644 index 000000000..5ef7ced1b --- /dev/null +++ b/dumps/scripts/2335.cs2 @@ -0,0 +1,71 @@ +void script_2335(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16) { + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + if (bitconfig_8725 < 4000) { + setWidgetText(new WidgetPointer(arg15), intToStr(bitconfig_8725)); + } else { + setWidgetText(new WidgetPointer(arg15), "Max"); + } + if (bitconfig_3939 < 4000) { + setWidgetText(new WidgetPointer(arg10), intToStr(bitconfig_3939)); + } else { + setWidgetText(new WidgetPointer(arg10), "Max"); + } + if (bitconfig_3941 < 4000) { + setWidgetText(new WidgetPointer(arg11), intToStr(bitconfig_3941)); + } else { + setWidgetText(new WidgetPointer(arg11), "Max"); + } + if (bitconfig_3938 < 4000) { + setWidgetText(new WidgetPointer(arg12), intToStr(bitconfig_3938)); + } else { + setWidgetText(new WidgetPointer(arg12), "Max"); + } + if (bitconfig_3942 < 4000) { + setWidgetText(new WidgetPointer(arg13), intToStr(bitconfig_3942)); + } else { + setWidgetText(new WidgetPointer(arg13), "Max"); + } + ivar17 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg15))); + ivar18 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg10))); + ivar19 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg11))); + ivar20 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg12))); + ivar21 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg13))); + ivar22 = arg5; + ivar22 = max(ivar22, add(add(arg16, 10), ivar17)); + ivar22 = max(ivar22, add(add(arg6, 10), ivar18)); + ivar22 = max(ivar22, add(add(arg7, 10), ivar19)); + ivar22 = max(ivar22, add(add(arg8, 10), ivar20)); + ivar22 = max(ivar22, add(add(arg9, 10), ivar21)); + setWidgetSize(ivar22, getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + if (bitconfig_8725 < 40) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg14)); + } else { + setWidgetRGB(new Color(102, 255, 255), new WidgetPointer(arg14)); + } + if (bitconfig_3939 < 40) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg1)); + } else { + setWidgetRGB(new Color(102, 255, 255), new WidgetPointer(arg1)); + } + if (bitconfig_3941 < 40) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg2)); + } else { + setWidgetRGB(new Color(102, 255, 255), new WidgetPointer(arg2)); + } + if (bitconfig_3938 < 40) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg3)); + } else { + setWidgetRGB(new Color(102, 255, 255), new WidgetPointer(arg3)); + } + if (bitconfig_3942 < 40) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg4)); + } else { + setWidgetRGB(new Color(102, 255, 255), new WidgetPointer(arg4)); + } + return; +} diff --git a/dumps/scripts/2336.cs2 b/dumps/scripts/2336.cs2 new file mode 100644 index 000000000..3823c4bb3 --- /dev/null +++ b/dumps/scripts/2336.cs2 @@ -0,0 +1,7 @@ +void script_2336(int arg0,int arg1) { + if (getDisplayMode() != arg1) { + setScriptCallOnGameloop(2336, new WidgetPointer(arg0), getDisplayMode(), "Ii", new WidgetPointer(arg0)); + script_2337(arg0); + } + return; +} diff --git a/dumps/scripts/2337.cs2 b/dumps/scripts/2337.cs2 new file mode 100644 index 000000000..0e00d1c7f --- /dev/null +++ b/dumps/scripts/2337.cs2 @@ -0,0 +1,8 @@ +void script_2337(int arg0) { + if (getDisplayMode() >= 2) { + setWidgetPosition(add(getWidgetActualWidth(new WidgetPointer(746,13)), 10), 10, 2, 0, new WidgetPointer(arg0)); + } else { + setWidgetPosition(10, 10, 2, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2338.cs2 b/dumps/scripts/2338.cs2 new file mode 100644 index 000000000..e6fd04534 --- /dev/null +++ b/dumps/scripts/2338.cs2 @@ -0,0 +1,4 @@ +void script_2338() { + script_2339(); + return; +} diff --git a/dumps/scripts/2339.cs2 b/dumps/scripts/2339.cs2 new file mode 100644 index 000000000..326db7bd5 --- /dev/null +++ b/dumps/scripts/2339.cs2 @@ -0,0 +1,46 @@ +void script_2339() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + globalint_770 = 0; + ivar0 = subtract(extractX(getMyPositionHash()), mod(extractX(getMyPositionHash()), 64)); + ivar1 = subtract(extractY(getMyPositionHash()), mod(extractY(getMyPositionHash()), 64)); + ivar2 = 574; + ivar3 = 942; + ivar4 = addToCoordinate(0, ivar0, 0, ivar1); + cs2method5405(0, 14); + cs2method5405(1, 14); + cs2method5406(0, 0, addToCoordinate(ivar4, 20, 0, 30), ivar3, addToCoordinate(ivar4, 27, 0, 26), ivar3, 0); + cs2method5406(1, 0, addToCoordinate(ivar4, 25, 0, 36), ivar2, addToCoordinate(ivar4, 31, 0, 33), ivar2, 0); + cs2method5406(0, 1, addToCoordinate(ivar4, 41, 0, 36), ivar3, addToCoordinate(ivar4, 41, 0, 39), ivar3, 0); + cs2method5406(1, 1, addToCoordinate(ivar4, 38, 0, 42), ivar2, addToCoordinate(ivar4, 38, 0, 46), ivar2, 0); + cs2method5406(0, 2, addToCoordinate(ivar4, 35, 0, 49), ivar3, addToCoordinate(ivar4, 37, 0, 51), ivar3, 0); + cs2method5406(1, 2, addToCoordinate(ivar4, 38, 0, 57), ivar2, addToCoordinate(ivar4, 40, 0, 57), ivar2, 0); + cs2method5406(0, 3, addToCoordinate(ivar4, 35, 0, 40), ivar3, addToCoordinate(ivar4, 31, 0, 37), ivar3, 0); + cs2method5406(1, 3, addToCoordinate(ivar4, 38, 0, 54), ivar2, addToCoordinate(ivar4, 37, 0, 54), ivar2, 0); + cs2method5406(0, 4, addToCoordinate(ivar4, 24, 0, 41), ivar3, addToCoordinate(ivar4, 24, 0, 38), ivar3, 0); + cs2method5406(1, 4, addToCoordinate(ivar4, 12, 0, 43), ivar2, addToCoordinate(ivar4, 7, 0, 41), ivar2, 0); + cs2method5406(0, 5, addToCoordinate(ivar4, 30, 0, 43), ivar3, addToCoordinate(ivar4, 31, 0, 43), ivar3, 0); + cs2method5406(1, 5, addToCoordinate(ivar4, 8, 0, 41), ivar2, addToCoordinate(ivar4, 0, 0, 39), ivar2, 0); + cs2method5406(0, 6, addToCoordinate(ivar4, 35, 0, 43), ivar3, addToCoordinate(ivar4, 37, 0, 43), ivar3, 0); + cs2method5406(1, 6, addToCoordinate(ivar4, 36, 0, 27), ivar2, addToCoordinate(ivar4, 27, 0, 28), ivar2, 0); + cs2method5406(0, 7, addToCoordinate(ivar4, 35, 0, 45), ivar3, addToCoordinate(ivar4, 31, 0, 44), ivar3, 0); + cs2method5406(1, 7, addToCoordinate(ivar4, 36, 0, 30), ivar2, addToCoordinate(ivar4, 35, 0, 31), ivar2, 0); + cs2method5406(0, 8, addToCoordinate(ivar4, 41, 0, 40), ivar3, addToCoordinate(ivar4, 42, 0, 40), ivar3, 0); + cs2method5406(1, 8, addToCoordinate(ivar4, 54, 0, 39), ivar2, addToCoordinate(ivar4, 56, 0, 39), ivar2, 0); + cs2method5406(0, 9, addToCoordinate(ivar4, 44, 0, 42), ivar3, addToCoordinate(ivar4, 44, 0, 45), ivar3, 0); + cs2method5406(1, 9, addToCoordinate(ivar4, 54, 0, 40), ivar2, addToCoordinate(ivar4, 53, 0, 39), ivar2, 0); + cs2method5406(0, 10, addToCoordinate(ivar4, 30, 0, 51), ivar3, addToCoordinate(ivar4, 20, 0, 50), ivar3, 0); + cs2method5406(1, 10, addToCoordinate(ivar4, 32, 0, 40), ivar2, addToCoordinate(ivar4, 26, 0, 42), ivar2, 0); + cs2method5406(0, 11, addToCoordinate(ivar4, 22, 0, 39), ivar3, addToCoordinate(ivar4, 22, 0, 36), ivar3, 0); + cs2method5406(1, 11, addToCoordinate(ivar4, 33, 0, 41), ivar2, addToCoordinate(ivar4, 34, 0, 41), ivar2, 0); + cs2method5406(0, 12, addToCoordinate(ivar4, 32, 0, 29), ivar3, addToCoordinate(ivar4, 42, 0, 27), ivar3, 0); + cs2method5406(1, 12, addToCoordinate(ivar4, 32, 0, 42), ivar2, addToCoordinate(ivar4, 32, 0, 43), ivar2, 0); + cs2method5406(0, 13, addToCoordinate(ivar4, 47, 0, 40), 778, addToCoordinate(ivar4, 47, 0, 46), 778, 0); + cs2method5406(1, 13, addToCoordinate(ivar4, 31, 0, 41), ivar2, addToCoordinate(ivar4, 28, 0, 41), ivar2, 0); + setScriptCallOnMinimapRelatedSetting3(2344, "", new WidgetPointer(558,0)); + cameraMethod5502(0, globalint_770, 500, 900, 1, globalint_770); + return; +} diff --git a/dumps/scripts/234.cs2 b/dumps/scripts/234.cs2 new file mode 100644 index 000000000..7cb22515f --- /dev/null +++ b/dumps/scripts/234.cs2 @@ -0,0 +1,13 @@ +void script_234(int arg0) { + int ivar1; + string svar0; + svar0 = ""; + ivar1 = -1; + if (setWidgetRegister(new WidgetPointer(594,94), arg0)) { + globalstring_24 = cs2method1802(); + globalint_792 = globalint_791; + script_240(); + script_217(); + } + return; +} diff --git a/dumps/scripts/2340.cs2 b/dumps/scripts/2340.cs2 new file mode 100644 index 000000000..aa48aadbe --- /dev/null +++ b/dumps/scripts/2340.cs2 @@ -0,0 +1,6 @@ +void script_2340() { + globalint_770 = 2; + cameraMethod5502(0, globalint_770, 500, 900, 1, globalint_770); + setScriptCallOnMinimapRelatedSetting3(2344, "", new WidgetPointer(558,0)); + return; +} diff --git a/dumps/scripts/2341.cs2 b/dumps/scripts/2341.cs2 new file mode 100644 index 000000000..3750ef4fb --- /dev/null +++ b/dumps/scripts/2341.cs2 @@ -0,0 +1,6 @@ +void script_2341() { + globalint_770 = 4; + cameraMethod5502(0, globalint_770, 600, 900, 1, globalint_770); + setScriptCallOnMinimapRelatedSetting3(2344, "", new WidgetPointer(558,0)); + return; +} diff --git a/dumps/scripts/2342.cs2 b/dumps/scripts/2342.cs2 new file mode 100644 index 000000000..7683099a5 --- /dev/null +++ b/dumps/scripts/2342.cs2 @@ -0,0 +1,6 @@ +void script_2342() { + globalint_770 = 6; + cameraMethod5502(0, globalint_770, 600, 900, 1, globalint_770); + setScriptCallOnMinimapRelatedSetting3(2344, "", new WidgetPointer(558,0)); + return; +} diff --git a/dumps/scripts/2343.cs2 b/dumps/scripts/2343.cs2 new file mode 100644 index 000000000..1eb30072b --- /dev/null +++ b/dumps/scripts/2343.cs2 @@ -0,0 +1,6 @@ +void script_2343() { + globalint_770 = 8; + cameraMethod5502(0, globalint_770, 500, 900, 1, globalint_770); + setScriptCallOnMinimapRelatedSetting3(2344, "", new WidgetPointer(558,0)); + return; +} diff --git a/dumps/scripts/2344.cs2 b/dumps/scripts/2344.cs2 new file mode 100644 index 000000000..c82fff2bf --- /dev/null +++ b/dumps/scripts/2344.cs2 @@ -0,0 +1,30 @@ +void script_2344() { + if (globalint_770 < cs2method5407(0)) { + flow_1: + globalint_770 = add(globalint_770, 1); + SWITCH (globalint_770) { + case 9: + GOTO flow_2 + case 10: + GOTO flow_2 + case 11: + GOTO flow_2 + case 12: + GOTO flow_3 + } + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(558,0)); + cameraMethod5502(0, globalint_770, 900, 500, 1, globalint_770); + GOTO flow_4 + flow_2: + setScriptCallOnMinimapRelatedSetting3(2344, "", new WidgetPointer(558,0)); + cameraMethod5502(0, globalint_770, 900, 900, 1, globalint_770); + GOTO flow_4 + flow_3: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(558,0)); + cameraMethod5502(0, globalint_770, 900, 100, 1, globalint_770); + flow_4: + } else { + globalint_770 = 0; + } + return; +} diff --git a/dumps/scripts/2345.cs2 b/dumps/scripts/2345.cs2 new file mode 100644 index 000000000..53c342455 --- /dev/null +++ b/dumps/scripts/2345.cs2 @@ -0,0 +1,26 @@ +void script_2345() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + globalint_769 = 0; + ivar0 = subtract(extractX(getMyPositionHash()), mod(extractX(getMyPositionHash()), 64)); + ivar1 = subtract(extractY(getMyPositionHash()), mod(extractY(getMyPositionHash()), 64)); + ivar2 = addToCoordinate(0, ivar0, 0, ivar1); + ivar3 = addToCoordinate(ivar2, extractX(507944), 0, extractY(507944)); + cs2method5405(0, 5); + cs2method5406(0, 0, addToCoordinate(ivar3, 0, 0, -5), 800, addToCoordinate(ivar3, 0, 0, -5), 900, 0); + cs2method5406(0, 1, addToCoordinate(ivar3, -5, 0, -1), 800, addToCoordinate(ivar3, -5, 0, 0), 900, 0); + cs2method5406(0, 2, addToCoordinate(ivar3, -1, 0, 5), 800, addToCoordinate(ivar3, 0, 0, 5), 900, 0); + cs2method5406(0, 3, addToCoordinate(ivar3, 5, 0, 1), 800, addToCoordinate(ivar3, 5, 0, 0), 900, 0); + cs2method5406(0, 4, addToCoordinate(ivar3, 0, 0, -3), 800, addToCoordinate(ivar3, 0, 0, -3), 900, 0); + cs2method5405(1, 5); + cs2method5406(1, 0, ivar3, 400, ivar3, 400, 0); + cs2method5406(1, 1, ivar3, 400, ivar3, 400, 0); + cs2method5406(1, 2, ivar3, 400, ivar3, 400, 0); + cs2method5406(1, 3, ivar3, 400, ivar3, 400, 0); + cs2method5406(1, 4, ivar3, 500, ivar3, 500, 0); + cameraMethod5502(0, 0, 200, 200, 1, 0); + setScriptCallOnMinimapRelatedSetting3(2346, "", new WidgetPointer(582,0)); + return; +} diff --git a/dumps/scripts/2346.cs2 b/dumps/scripts/2346.cs2 new file mode 100644 index 000000000..dc97147fd --- /dev/null +++ b/dumps/scripts/2346.cs2 @@ -0,0 +1,15 @@ +void script_2346() { + globalint_769 = add(globalint_769, 1); + if (globalint_769 >= subtract(cs2method5407(0), 1)) { + globalint_769 = 0; + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(582,0)); + return; + } + if (globalint_769 == subtract(cs2method5407(0), 2)) { + cameraMethod5502(0, globalint_769, 200, 75, 1, globalint_769); + } else { + cameraMethod5502(0, globalint_769, 200, 200, 1, globalint_769); + } + setScriptCallOnMinimapRelatedSetting3(2346, "", new WidgetPointer(582,0)); + return; +} diff --git a/dumps/scripts/2347.cs2 b/dumps/scripts/2347.cs2 new file mode 100644 index 000000000..13f1e8df2 --- /dev/null +++ b/dumps/scripts/2347.cs2 @@ -0,0 +1,39 @@ +void script_2347(int arg0) { + if (((boolean)arg0)) { + if (bitconfig_6048 >= 250) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(723,6)); + } else if (((boolean)bitconfig_6048)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(723,6)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(723,6)); + } + } + if (arg0 == 2) { + if (bitconfig_6112 >= 60) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(723,7)); + } else if (((boolean)bitconfig_6112)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(723,7)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(723,7)); + } + } + if (arg0 == 3) { + if (bitconfig_6289 >= 240) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(723,8)); + } else if (((boolean)bitconfig_6289)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(723,8)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(723,8)); + } + } + if (arg0 == 4) { + if (bitconfig_6775 >= 100) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(723,9)); + } else if (((boolean)bitconfig_6775)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(723,9)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(723,9)); + } + } + return; +} diff --git a/dumps/scripts/2348.cs2 b/dumps/scripts/2348.cs2 new file mode 100644 index 000000000..1fe4b0323 --- /dev/null +++ b/dumps/scripts/2348.cs2 @@ -0,0 +1,4 @@ +void script_2348(int arg0,int arg1,int arg2) { + script_2349(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/2349.cs2 b/dumps/scripts/2349.cs2 new file mode 100644 index 000000000..fe2113db1 --- /dev/null +++ b/dumps/scripts/2349.cs2 @@ -0,0 +1,10 @@ +void script_2349(int arg0,int arg1,int arg2) { + if (script_19(arg1, -1) >= arg2) { + setWidgetRGB(new Color(0, 204, 0), new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), intToStr(arg2) + "/" + intToStr(arg2)); + } else { + setWidgetRGB(new Color(192, 0, 0), new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), script_20(script_19(arg1, -1)) + "/" + intToStr(arg2)); + } + return; +} diff --git a/dumps/scripts/235.cs2 b/dumps/scripts/235.cs2 new file mode 100644 index 000000000..061cc60ca --- /dev/null +++ b/dumps/scripts/235.cs2 @@ -0,0 +1,8 @@ +void script_235() { + if (stringMethod4107(globalstring_24, "") != 0) { + script_220(); + } else { + message(26, 0, "You must first select a name from the list."); + } + return; +} diff --git a/dumps/scripts/2350.cs2 b/dumps/scripts/2350.cs2 new file mode 100644 index 000000000..a6c9203d2 --- /dev/null +++ b/dumps/scripts/2350.cs2 @@ -0,0 +1,4 @@ +void script_2350(int arg0,int arg1) { + script_2351(arg0, arg1); + return; +} diff --git a/dumps/scripts/2351.cs2 b/dumps/scripts/2351.cs2 new file mode 100644 index 000000000..e0e5d14b8 --- /dev/null +++ b/dumps/scripts/2351.cs2 @@ -0,0 +1,8 @@ +void script_2351(int arg0,int arg1) { + if (getItemAmtInContainer(93, arg1) > 0) { + setWidgetRGB(new Color(0, 204, 0), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2352.cs2 b/dumps/scripts/2352.cs2 new file mode 100644 index 000000000..f7e413ab7 --- /dev/null +++ b/dumps/scripts/2352.cs2 @@ -0,0 +1,10 @@ +void script_2352() { + if ((getLanguage() == 2) || (getLanguage() == 3)) { + setWidgetFont(494, new WidgetPointer(433,16)); + setWidgetFont(494, new WidgetPointer(433,17)); + setWidgetFont(494, new WidgetPointer(433,18)); + setWidgetFont(494, new WidgetPointer(433,19)); + setWidgetFont(494, new WidgetPointer(433,20)); + } + return; +} diff --git a/dumps/scripts/2353.cs2 b/dumps/scripts/2353.cs2 new file mode 100644 index 000000000..1f4072a91 --- /dev/null +++ b/dumps/scripts/2353.cs2 @@ -0,0 +1,11 @@ +void script_2353(int arg0) { + if (((boolean)globalint_771)) { + setScriptCallOnGameloop(2354, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), "Saving your game and loading QuestHelp"); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(275,14)); + } + return; +} diff --git a/dumps/scripts/2354.cs2 b/dumps/scripts/2354.cs2 new file mode 100644 index 000000000..205dc37ec --- /dev/null +++ b/dumps/scripts/2354.cs2 @@ -0,0 +1,20 @@ +void script_2354(int arg0) { + if (((boolean)globalint_772)) { + setWidgetText(new WidgetPointer(arg0), "Saving your game and loading QuestHelp"); + globalint_772 = add(globalint_772, 1); + } else if (globalint_772 == 20) { + setWidgetText(new WidgetPointer(arg0), "Saving your game and loading QuestHelp."); + globalint_772 = add(globalint_772, 1); + } else if (globalint_772 == 40) { + setWidgetText(new WidgetPointer(arg0), "Saving your game and loading QuestHelp.."); + globalint_772 = add(globalint_772, 1); + } else if (globalint_772 == 60) { + setWidgetText(new WidgetPointer(arg0), "Saving your game and loading QuestHelp."); + globalint_772 = add(globalint_772, 1); + } else if (globalint_772 == 80) { + globalint_772 = 1; + } else { + globalint_772 = add(globalint_772, 1); + } + return; +} diff --git a/dumps/scripts/2355.cs2 b/dumps/scripts/2355.cs2 new file mode 100644 index 000000000..81615da32 --- /dev/null +++ b/dumps/scripts/2355.cs2 @@ -0,0 +1,11 @@ +void script_2355(int arg0,int arg1) { + globalint_92 = arg0; + if (((boolean)arg0)) { + setScriptCallOnGameloop(2356, arg1, "i", new WidgetPointer(916,21)); + script_2192(0, arg1); + } else { + setScriptCallOnGameloop(2356, 0, "i", new WidgetPointer(916,21)); + script_2192(1, arg1); + } + return; +} diff --git a/dumps/scripts/2356.cs2 b/dumps/scripts/2356.cs2 new file mode 100644 index 000000000..3948628a4 --- /dev/null +++ b/dumps/scripts/2356.cs2 @@ -0,0 +1,28 @@ +void script_2356(int arg0) { + int ivar1; + int ivar2; + ivar1 = getWidgetActualWidth(new WidgetPointer(905,5)); + ivar2 = 0; + if (ivar1 < arg0) { + ivar2 = add(ivar1, 9); + if (ivar2 >= arg0) { + setWidgetSize(add(arg0, 5), 0, 0, 1, new WidgetPointer(916,2)); + setWidgetSize(arg0, 0, 0, 1, new WidgetPointer(905,5)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(916,21)); + return; + } + setWidgetSize(add(ivar2, 5), 0, 0, 1, new WidgetPointer(916,2)); + setWidgetSize(ivar2, 0, 0, 1, new WidgetPointer(905,5)); + } else { + ivar2 = subtract(ivar1, 9); + if (ivar2 <= arg0) { + setWidgetSize(add(arg0, 5), 0, 0, 1, new WidgetPointer(916,2)); + setWidgetSize(arg0, 0, 0, 1, new WidgetPointer(905,5)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(916,21)); + return; + } + setWidgetSize(add(ivar2, 5), 0, 0, 1, new WidgetPointer(916,2)); + setWidgetSize(ivar2, 0, 0, 1, new WidgetPointer(905,5)); + } + return; +} diff --git a/dumps/scripts/2357.cs2 b/dumps/scripts/2357.cs2 new file mode 100644 index 000000000..68108c763 --- /dev/null +++ b/dumps/scripts/2357.cs2 @@ -0,0 +1,18 @@ +void script_2357(int arg0) { + int ivar1; + int ivar2; + int ivar3; + cs2method202(arg0); + if (standart_config_1893 == -1) { + return; + } + ivar1 = ((int)cs2method_3408(73, 73, 1592, standart_config_1893)); + ivar2 = getWidgetActualX(new WidgetPointer(arg0)); + ivar3 = getWidgetActualY(new WidgetPointer(arg0)); + if (arg0 == 69009490) { + ivar2 = subtract(add(ivar2, divide(getWidgetActualWidth(new WidgetPointer(arg0)), 2)), divide(getWidgetActualWidth(new WidgetPointer(ivar1)), 2)); + ivar3 = subtract(add(ivar3, divide(getWidgetActualHeight(new WidgetPointer(arg0)), 2)), divide(getWidgetActualHeight(new WidgetPointer(ivar1)), 2)); + } + setWidgetPosition(ivar2, ivar3, 0, 0, new WidgetPointer(ivar1)); + return; +} diff --git a/dumps/scripts/2358.cs2 b/dumps/scripts/2358.cs2 new file mode 100644 index 000000000..7a63aaa55 --- /dev/null +++ b/dumps/scripts/2358.cs2 @@ -0,0 +1,31 @@ +void script_2358(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar1 = cs2method_3408(73, 105, 2125, arg0); + ivar2 = cs2method_3408(73, 105, 2124, arg0); + ivar3 = 1; + if (standart_config_1893 == -1) { + if (((boolean)ivar2)) { + ivar3 = ((int)isBitFlagged(standart_config_1890, ivar1)); + } else if (ivar2 == 2) { + ivar3 = ((int)isBitFlagged(standart_config_1891, ivar1)); + } else { + ivar3 = ((int)isBitFlagged(standart_config_1892, ivar1)); + } + if (((boolean)ivar3)) { + cs2method203(arg0); + } + return; + } + ivar4 = cs2method_3408(73, 74, 704, standart_config_1893); + ivar5 = getOtherCommonData(ivar4, 1222); + ivar6 = getOtherCommonData(ivar4, 1223); + ivar7 = ((int)cs2method_3408(73, 73, 1592, standart_config_1893)); + setWidgetPosition(ivar5, ivar6, 0, 0, new WidgetPointer(ivar7)); + return; +} diff --git a/dumps/scripts/2359.cs2 b/dumps/scripts/2359.cs2 new file mode 100644 index 000000000..769c86e99 --- /dev/null +++ b/dumps/scripts/2359.cs2 @@ -0,0 +1,4 @@ +void script_2359() { + setWidgetIsHidden(true, new WidgetPointer(1053,96)); + return; +} diff --git a/dumps/scripts/236.cs2 b/dumps/scripts/236.cs2 new file mode 100644 index 000000000..389b101f3 --- /dev/null +++ b/dumps/scripts/236.cs2 @@ -0,0 +1,4 @@ +void script_236() { + cs2method5400(0, "bugtracker_v4", "index.html"); + return; +} diff --git a/dumps/scripts/2360.cs2 b/dumps/scripts/2360.cs2 new file mode 100644 index 000000000..fc47329fa --- /dev/null +++ b/dumps/scripts/2360.cs2 @@ -0,0 +1,4 @@ +void script_2360() { + setWidgetIsHidden(true, new WidgetPointer(1054,54)); + return; +} diff --git a/dumps/scripts/2361.cs2 b/dumps/scripts/2361.cs2 new file mode 100644 index 000000000..bbe4778ee --- /dev/null +++ b/dumps/scripts/2361.cs2 @@ -0,0 +1,9 @@ +void script_2361(int arg0) { + int ivar1; + if (((boolean)bitconfig_8271)) { + return; + } + ivar1 = ((int)cs2method_3408(105, 73, 2352, bitconfig_8271)); + setWidgetIntegerNode(1224, arg0, new WidgetPointer(ivar1)); + return; +} diff --git a/dumps/scripts/2362.cs2 b/dumps/scripts/2362.cs2 new file mode 100644 index 000000000..8ab8e8a17 --- /dev/null +++ b/dumps/scripts/2362.cs2 @@ -0,0 +1,5 @@ +void script_2362() { + int ivar0; + ivar0 = 0; + return; +} diff --git a/dumps/scripts/2363.cs2 b/dumps/scripts/2363.cs2 new file mode 100644 index 000000000..eed21d92b --- /dev/null +++ b/dumps/scripts/2363.cs2 @@ -0,0 +1,6 @@ +void script_2363(int arg0,int arg1) { + setWidgetScrollMax(200, globalint_773, new WidgetPointer(arg1)); + cs2method2100(0, 0, new WidgetPointer(arg1)); + script_31(arg0, arg1, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/2364.cs2 b/dumps/scripts/2364.cs2 new file mode 100644 index 000000000..cf43609ec --- /dev/null +++ b/dumps/scripts/2364.cs2 @@ -0,0 +1,29 @@ +void script_2364(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int stack_dump0; + ivar1 = 1; + ivar2 = 0; + ivar3 = -1; + ivar4 = -1; + while (ivar1 < 9) { + ivar3 = ((int)cs2method_3408(105, 73, 2352, ivar1)); + if (setWidgetRegister(new WidgetPointer(ivar3))) { + stack_dump0 = 1224; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/2365.cs2 b/dumps/scripts/2365.cs2 new file mode 100644 index 000000000..66781d3ad --- /dev/null +++ b/dumps/scripts/2365.cs2 @@ -0,0 +1,4 @@ +void script_2365(int arg0) { + setWidgetIntegerNode(1224, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2366.cs2 b/dumps/scripts/2366.cs2 new file mode 100644 index 000000000..c23ee65af --- /dev/null +++ b/dumps/scripts/2366.cs2 @@ -0,0 +1,14 @@ +void script_2366(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 0; + while (ivar3 < arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar3)) { + setWidgetSprite(180); + } + ivar3 = add(ivar3, 1); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(181); + } + return; +} diff --git a/dumps/scripts/2367.cs2 b/dumps/scripts/2367.cs2 new file mode 100644 index 000000000..28a52e1ec --- /dev/null +++ b/dumps/scripts/2367.cs2 @@ -0,0 +1,11 @@ +void script_2367() { + setWidgetIntegerNode(1224, 0, new WidgetPointer(1054,30)); + setWidgetIntegerNode(1224, 0, new WidgetPointer(1054,31)); + setWidgetIntegerNode(1224, 0, new WidgetPointer(1054,32)); + setWidgetIntegerNode(1224, 0, new WidgetPointer(1054,33)); + setWidgetIntegerNode(1224, 0, new WidgetPointer(1054,34)); + setWidgetIntegerNode(1224, 0, new WidgetPointer(1054,35)); + setWidgetIntegerNode(1224, 0, new WidgetPointer(1054,36)); + setWidgetIntegerNode(1224, 0, new WidgetPointer(1054,37)); + return; +} diff --git a/dumps/scripts/2368.cs2 b/dumps/scripts/2368.cs2 new file mode 100644 index 000000000..6c4468aaf --- /dev/null +++ b/dumps/scripts/2368.cs2 @@ -0,0 +1,5 @@ +void script_2368() { + globalint_1088 = 0; + script_1174(7); + return; +} diff --git a/dumps/scripts/2369.cs2 b/dumps/scripts/2369.cs2 new file mode 100644 index 000000000..9696eb3a0 --- /dev/null +++ b/dumps/scripts/2369.cs2 @@ -0,0 +1,10 @@ +void script_2369(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = cs2method2600(new WidgetPointer(905,13)); + cs2method2100(add(cs2method2600(new WidgetPointer(905,13)), arg2), 0, new WidgetPointer(905,13)); + if (ivar3 != cs2method2600(new WidgetPointer(905,13))) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + } + script_2370(); + return; +} diff --git a/dumps/scripts/237.cs2 b/dumps/scripts/237.cs2 new file mode 100644 index 000000000..d04c7b530 --- /dev/null +++ b/dumps/scripts/237.cs2 @@ -0,0 +1,6 @@ +void script_237(int arg0) { + if (setWidgetRegister(new WidgetPointer(594,93), arg0)) { + cs2method2103(192); + } + return; +} diff --git a/dumps/scripts/2370.cs2 b/dumps/scripts/2370.cs2 new file mode 100644 index 000000000..f13e0a8aa --- /dev/null +++ b/dumps/scripts/2370.cs2 @@ -0,0 +1,18 @@ +void script_2370() { + int ivar0; + ivar0 = cs2method2600(new WidgetPointer(905,13)); + if (ivar0 <= 0) { + cs2method2103(150, new WidgetPointer(905,11)); + setWidgetSprite(3877, new WidgetPointer(905,11)); + } else { + cs2method2103(0, new WidgetPointer(905,11)); + } + if (ivar0 >= subtract(getWidgetScrollMaxH(new WidgetPointer(905,13)), getWidgetActualWidth(new WidgetPointer(905,13)))) { + cs2method2103(150, new WidgetPointer(905,12)); + setWidgetSprite(3879, new WidgetPointer(905,12)); + } else { + cs2method2103(0, new WidgetPointer(905,12)); + } + globalint_93 = ivar0; + return; +} diff --git a/dumps/scripts/2371.cs2 b/dumps/scripts/2371.cs2 new file mode 100644 index 000000000..d8e8db061 --- /dev/null +++ b/dumps/scripts/2371.cs2 @@ -0,0 +1,8 @@ +void script_2371() { + if (((boolean)bitconfig_4894)) { + setWidgetIsHidden(false, new WidgetPointer(667,49)); + } else { + setWidgetIsHidden(true, new WidgetPointer(667,49)); + } + return; +} diff --git a/dumps/scripts/2372.cs2 b/dumps/scripts/2372.cs2 new file mode 100644 index 000000000..a9762aec0 --- /dev/null +++ b/dumps/scripts/2372.cs2 @@ -0,0 +1,4 @@ +void script_2372(int arg0,int arg1) { + script_2373(arg0, arg1); + return; +} diff --git a/dumps/scripts/2373.cs2 b/dumps/scripts/2373.cs2 new file mode 100644 index 000000000..233cc7212 --- /dev/null +++ b/dumps/scripts/2373.cs2 @@ -0,0 +1,101 @@ +void script_2373(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + string svar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_788_struct(2,0,0) structdump_3; + cs2func_script_788_struct(2,0,0) structdump_4; + deleteAllExtraChilds(new WidgetPointer(667,7)); + ivar2 = 0; + ivar3 = -1; + ivar4 = -1; + svar0 = ""; + while (ivar2 < getItemContainerLength(94)) { + switch (ivar2) { + case 0: + ivar3 = 43712525; + break; + case 1: + ivar3 = 43712527; + break; + case 2: + ivar3 = 43712528; + break; + case 3: + ivar3 = 43712530; + break; + case 4: + ivar3 = 43712531; + break; + case 5: + ivar3 = 43712532; + break; + case 7: + ivar3 = 43712533; + break; + case 9: + ivar3 = 43712535; + break; + case 10: + ivar3 = 43712534; + break; + case 12: + ivar3 = 43712536; + break; + case 13: + ivar3 = 43712529; + break; + case 14: + ivar3 = 43712526; + break; + default: + ivar3 = -1; + } + createExtraChild(new WidgetPointer(667,7), 5, ivar2); + if (ivar3 != -1) { + ivar4 = getItemIdInSlot(94, ivar2); + if (ivar4 != -1) { + setWidgetSize(36, 32, 0, 0); + stack_dump0 = ivar3; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_3 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_3.intpart_0, structdump_3.intpart_1, 0, 0); + setItemOnWidgetMethod1200(ivar4, getItemAmtInSlot(94, ivar2)); + cs2method1305(concat("", getItemName(ivar4))); + setWidgetContextMenuOption(1, "Remove"); + setWidgetContextMenuOption(9, "Stats"); + cs2method1306("Compare"); + setWidgetContextMenuOption(10, "Examine"); + setWidgetShadowColor(new Color(48, 32, 32)); + if (arg1 == ivar2) { + setWidgetBorderThickness(2); + } else { + setWidgetBorderThickness(1); + } + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -2147483643, 100, 0, 8, "Iiiii"); + setScriptCallOnUse(2372, new WidgetPointer(arg0), ivar2, "Ii"); + setScriptCallOnUseWith(2372, new WidgetPointer(arg0), -1, "Ii"); + } else { + setWidgetSize(32, 32, 0, 0); + stack_dump0 = ivar3; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_4 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_4.intpart_0, structdump_4.intpart_1, 0, 0); + setWidgetSprite(cs2method_3408(105, 100, 796, ivar2)); + } + } else { + setWidgetHidden(1); + } + ivar2 = add(ivar2, 1); + } + if ((arg1 != -1) && (getItemIdInSlot(94, arg1) == -1)) { + arg1 = -1; + } + setScriptCallOnItemContainerUpdate(2372, new WidgetPointer(-32768,3), arg1, 94, 1, "IiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2374.cs2 b/dumps/scripts/2374.cs2 new file mode 100644 index 000000000..eaff1b58d --- /dev/null +++ b/dumps/scripts/2374.cs2 @@ -0,0 +1,5 @@ +void script_2374(int arg0,int arg1) { + setWidgetNpcHead(arg1, new WidgetPointer(arg0)); + setWidgetAnimation(9806, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2375.cs2 b/dumps/scripts/2375.cs2 new file mode 100644 index 000000000..f0a2829a4 --- /dev/null +++ b/dumps/scripts/2375.cs2 @@ -0,0 +1,4 @@ +void script_2375(int arg0,int arg1) { + script_2377(bitconfig_6098, arg0, arg1); + return; +} diff --git a/dumps/scripts/2376.cs2 b/dumps/scripts/2376.cs2 new file mode 100644 index 000000000..dd0973061 --- /dev/null +++ b/dumps/scripts/2376.cs2 @@ -0,0 +1,7 @@ +void script_2376(int arg0,int arg1,int arg2,int arg3) { + if (arg0 != 1) { + return; + } + script_2377(arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/2377.cs2 b/dumps/scripts/2377.cs2 new file mode 100644 index 000000000..d648e2456 --- /dev/null +++ b/dumps/scripts/2377.cs2 @@ -0,0 +1,14 @@ +void script_2377(int arg0,int arg1,int arg2) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg1)); + setWidgetUnknownBoolean(true, new WidgetPointer(arg1)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(arg2)); + setWidgetUnknownBoolean(false, new WidgetPointer(arg2)); + } else { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg2)); + setWidgetUnknownBoolean(true, new WidgetPointer(arg2)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(arg1)); + setWidgetUnknownBoolean(false, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2378.cs2 b/dumps/scripts/2378.cs2 new file mode 100644 index 000000000..c5fec0c7b --- /dev/null +++ b/dumps/scripts/2378.cs2 @@ -0,0 +1,43 @@ +void script_2378(int arg0) { + int ivar1; + ivar1 = -1; + switch (bitconfig_6099) { + case 0: + ivar1 = 58982423; + break; + case 1: + ivar1 = 58982424; + break; + case 2: + ivar1 = 58982425; + break; + case 3: + ivar1 = 58982426; + break; + case 4: + ivar1 = 58982427; + break; + case 5: + ivar1 = 58982428; + break; + case 6: + ivar1 = 58982429; + break; + case 7: + ivar1 = 58982422; + break; + case 8: + ivar1 = 58982421; + break; + case 9: + ivar1 = 58982420; + break; + case 10: + ivar1 = 58982430; + break; + case 11: + ivar1 = 58982431; + } + script_2380(ivar1, arg0); + return; +} diff --git a/dumps/scripts/2379.cs2 b/dumps/scripts/2379.cs2 new file mode 100644 index 000000000..9bb8ad6e9 --- /dev/null +++ b/dumps/scripts/2379.cs2 @@ -0,0 +1,8 @@ +void script_2379(int arg0,int arg1,int arg2,int arg3) { + if (arg0 != 1) { + return; + } + bitconfig_6099 = arg3; + script_2380(arg1, arg2); + return; +} diff --git a/dumps/scripts/238.cs2 b/dumps/scripts/238.cs2 new file mode 100644 index 000000000..1c864f0a6 --- /dev/null +++ b/dumps/scripts/238.cs2 @@ -0,0 +1,6 @@ +void script_238(int arg0) { + if (setWidgetRegister(new WidgetPointer(594,93), arg0)) { + cs2method2103(255); + } + return; +} diff --git a/dumps/scripts/2380.cs2 b/dumps/scripts/2380.cs2 new file mode 100644 index 000000000..12945a767 --- /dev/null +++ b/dumps/scripts/2380.cs2 @@ -0,0 +1,9 @@ +void script_2380(int arg0,int arg1) { + if (arg0 == -1) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetPosition(subtract(add(getWidgetActualX(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg0))), getWidgetActualWidth(new WidgetPointer(arg1))), subtract(add(getWidgetActualY(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0))), getWidgetActualHeight(new WidgetPointer(arg1))), 0, 0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/2381.cs2 b/dumps/scripts/2381.cs2 new file mode 100644 index 000000000..bd4a1e60b --- /dev/null +++ b/dumps/scripts/2381.cs2 @@ -0,0 +1,5 @@ +void script_2381(int arg0,int arg1,string arg2) { + setWidgetText(new WidgetPointer(arg0), arg2); + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2382.cs2 b/dumps/scripts/2382.cs2 new file mode 100644 index 000000000..e923462bd --- /dev/null +++ b/dumps/scripts/2382.cs2 @@ -0,0 +1,6 @@ +void script_2382(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetBorderThickness(arg2); + } + return; +} diff --git a/dumps/scripts/2383.cs2 b/dumps/scripts/2383.cs2 new file mode 100644 index 000000000..1c228710e --- /dev/null +++ b/dumps/scripts/2383.cs2 @@ -0,0 +1,4 @@ +void script_2383(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 16 Agility"); + return; +} diff --git a/dumps/scripts/2384.cs2 b/dumps/scripts/2384.cs2 new file mode 100644 index 000000000..607abcfe4 --- /dev/null +++ b/dumps/scripts/2384.cs2 @@ -0,0 +1,4 @@ +void script_2384(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 48 Agility"); + return; +} diff --git a/dumps/scripts/2385.cs2 b/dumps/scripts/2385.cs2 new file mode 100644 index 000000000..f427e323d --- /dev/null +++ b/dumps/scripts/2385.cs2 @@ -0,0 +1,4 @@ +void script_2385(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 35 Ranged, level 35 Strength, level 32 Agility" + "
" + "Requires a grapple"); + return; +} diff --git a/dumps/scripts/2386.cs2 b/dumps/scripts/2386.cs2 new file mode 100644 index 000000000..a45802bad --- /dev/null +++ b/dumps/scripts/2386.cs2 @@ -0,0 +1,4 @@ +void script_2386(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 70 Ranged" + "
" + "Requires a grapple"); + return; +} diff --git a/dumps/scripts/2387.cs2 b/dumps/scripts/2387.cs2 new file mode 100644 index 000000000..c97a20750 --- /dev/null +++ b/dumps/scripts/2387.cs2 @@ -0,0 +1,4 @@ +void script_2387(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 37 Strength, level 19 Ranged, level 11 Agility" + "
" + "Requires a grapple"); + return; +} diff --git a/dumps/scripts/2388.cs2 b/dumps/scripts/2388.cs2 new file mode 100644 index 000000000..91285f8df --- /dev/null +++ b/dumps/scripts/2388.cs2 @@ -0,0 +1,4 @@ +void script_2388(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 28 Agility"); + return; +} diff --git a/dumps/scripts/2389.cs2 b/dumps/scripts/2389.cs2 new file mode 100644 index 000000000..b71ebc38e --- /dev/null +++ b/dumps/scripts/2389.cs2 @@ -0,0 +1,4 @@ +void script_2389(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 13 Agility"); + return; +} diff --git a/dumps/scripts/239.cs2 b/dumps/scripts/239.cs2 new file mode 100644 index 000000000..048654259 --- /dev/null +++ b/dumps/scripts/239.cs2 @@ -0,0 +1,4 @@ +void script_239(int arg0) { + globalint_791 = arg0; + return; +} diff --git a/dumps/scripts/2390.cs2 b/dumps/scripts/2390.cs2 new file mode 100644 index 000000000..2ccd6edb8 --- /dev/null +++ b/dumps/scripts/2390.cs2 @@ -0,0 +1,4 @@ +void script_2390(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 40 Agility" + "
" + "Requires a rope on first passage"); + return; +} diff --git a/dumps/scripts/2391.cs2 b/dumps/scripts/2391.cs2 new file mode 100644 index 000000000..348399754 --- /dev/null +++ b/dumps/scripts/2391.cs2 @@ -0,0 +1,4 @@ +void script_2391(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 61 Agility" + "
" + "Wear a nosepeg or equivalent item"); + return; +} diff --git a/dumps/scripts/2392.cs2 b/dumps/scripts/2392.cs2 new file mode 100644 index 000000000..eabacefc5 --- /dev/null +++ b/dumps/scripts/2392.cs2 @@ -0,0 +1,4 @@ +void script_2392(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 25 Agility" + "
" + "Requires some progress in the In Aid of the Myreque quest"); + return; +} diff --git a/dumps/scripts/2393.cs2 b/dumps/scripts/2393.cs2 new file mode 100644 index 000000000..f23f59133 --- /dev/null +++ b/dumps/scripts/2393.cs2 @@ -0,0 +1,4 @@ +void script_2393(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 39 Agility, level 38 Strength, level 21 Ranged" + "
" + "Requires a grapple"); + return; +} diff --git a/dumps/scripts/2394.cs2 b/dumps/scripts/2394.cs2 new file mode 100644 index 000000000..df85df635 --- /dev/null +++ b/dumps/scripts/2394.cs2 @@ -0,0 +1,4 @@ +void script_2394(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 74 Agility"); + return; +} diff --git a/dumps/scripts/2395.cs2 b/dumps/scripts/2395.cs2 new file mode 100644 index 000000000..77a5757da --- /dev/null +++ b/dumps/scripts/2395.cs2 @@ -0,0 +1,4 @@ +void script_2395(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 81 Agility"); + return; +} diff --git a/dumps/scripts/2396.cs2 b/dumps/scripts/2396.cs2 new file mode 100644 index 000000000..2be991cb8 --- /dev/null +++ b/dumps/scripts/2396.cs2 @@ -0,0 +1,4 @@ +void script_2396(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 85 Agility"); + return; +} diff --git a/dumps/scripts/2397.cs2 b/dumps/scripts/2397.cs2 new file mode 100644 index 000000000..37b6571b6 --- /dev/null +++ b/dumps/scripts/2397.cs2 @@ -0,0 +1,4 @@ +void script_2397(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 68 Agility"); + return; +} diff --git a/dumps/scripts/2398.cs2 b/dumps/scripts/2398.cs2 new file mode 100644 index 000000000..cdb56ae00 --- /dev/null +++ b/dumps/scripts/2398.cs2 @@ -0,0 +1,4 @@ +void script_2398(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 59 Agility"); + return; +} diff --git a/dumps/scripts/2399.cs2 b/dumps/scripts/2399.cs2 new file mode 100644 index 000000000..621a3a60b --- /dev/null +++ b/dumps/scripts/2399.cs2 @@ -0,0 +1,4 @@ +void script_2399(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 25 Agility"); + return; +} diff --git a/dumps/scripts/24.cs2 b/dumps/scripts/24.cs2 new file mode 100644 index 000000000..1262344d8 --- /dev/null +++ b/dumps/scripts/24.cs2 @@ -0,0 +1,75 @@ +int script_24(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int ivar5; + createExtraChild(new WidgetPointer(499,7), 4, multiply(arg3, 3)); + setWidgetSize(26, 32, 0, 0); + if (arg0 > 0) { + setWidgetText(intToStr(arg0)); + } else { + setWidgetText(" "); + } + setWidgetPosition(0, arg4, 0, 0); + setWidgetTextAlignment(2, 0, 0); + setWidgetRGB(new Color(70, 50, 10)); + setWidgetFont(497); + setWidgetUnknownBoolean(false); + createExtraChild(new WidgetPointer(499,7), 5, add(multiply(arg3, 3), 1)); + setWidgetSize(36, 32, 0, 0); + if (((boolean)script_1566(bitconfig_3288, bitconfig_3289))) { + if (bitconfig_3288 == 7) { + setWidgetSize(30, 30, 0, 0); + } else { + if (bitconfig_3288 == 4) { + setWidgetSize(24, 24, 0, 0); + setWidgetPosition(0, arg4, 1, 0); + } + } + setWidgetBorderThickness(0); + if (arg2 != -1) { + setWidgetSprite(arg2); + } else { + setWidgetSprite(2287); + } + } else if (arg1 != -1) { + if ((arg1 == 18637) || (arg1 == 18638)) { + setWidgetSize(24, 24, 0, 0); + setWidgetPosition(0, arg4, 1, 0); + setWidgetBorderThickness(0); + if (arg1 == 18637) { + setWidgetSprite(3057); + } else { + setWidgetSprite(3056); + } + } else if ((bitconfig_3288 == 21) && (bitconfig_3289 != 10)) { + setWidgetContextMenuOption(1, "Check protection price"); + setScriptCallOnClickContextMenu(1865, -2147483644, arg1, "io"); + setScriptCallOnMouseEntered(1862, new WidgetPointer(-32768,3), -2147483643, "Ii"); + setScriptCallOnMouseExit(1863, new WidgetPointer(-32768,3), -2147483643, "Ii"); + } else { + if (((bitconfig_3288 == 22) && (bitconfig_3289 != 13)) && ((bitconfig_3289 != 14) && (bitconfig_3289 != 15))) { + setWidgetContextMenuOption(1, "Check materials"); + setScriptCallOnClickContextMenu(1864, -2147483644, arg1, bitconfig_3289, arg3, "ioii"); + setScriptCallOnMouseEntered(1862, new WidgetPointer(-32768,3), -2147483643, "Ii"); + setScriptCallOnMouseExit(1863, new WidgetPointer(-32768,3), -2147483643, "Ii"); + } + } + setWidgetBorderThickness(1); + setWidgetShadowColor(new Color(96, 78, 50)); + setItemOnWidgetMethod1200(arg1, -1); + } else { + setItemOnWidgetMethod1200(7620, -1); + } + setWidgetPosition(28, arg4, 0, 0); + createExtraChild(new WidgetPointer(499,7), 4, add(multiply(arg3, 3), 2)); + ivar5 = getLineCount(228, 495, arg5); + setWidgetSize(228, multiply(ivar5, 15), 0, 0); + setWidgetText(arg5); + setWidgetPosition(66, arg4, 0, 0); + setWidgetTextAlignment(0, 0, 0); + setWidgetRGB(new Color(70, 50, 10)); + setWidgetFont(495); + setWidgetUnknownBoolean(false); + if (multiply(ivar5, 15) < 32) { + return 32; + } + return add(multiply(ivar5, 15), 5); +} diff --git a/dumps/scripts/240.cs2 b/dumps/scripts/240.cs2 new file mode 100644 index 000000000..8273fd23d --- /dev/null +++ b/dumps/scripts/240.cs2 @@ -0,0 +1,14 @@ +void script_240() { + int ivar0; + ivar0 = 0; + while (ivar0 < getExtraChildGap(new WidgetPointer(594,92))) { + if (setWidgetRegister(new WidgetPointer(594,92), ivar0)) { + cs2method2103(255); + } + ivar0 = add(ivar0, 1); + } + if (setWidgetRegister(new WidgetPointer(594,92), globalint_792)) { + cs2method2103(110); + } + return; +} diff --git a/dumps/scripts/2400.cs2 b/dumps/scripts/2400.cs2 new file mode 100644 index 000000000..4d6f712b1 --- /dev/null +++ b/dumps/scripts/2400.cs2 @@ -0,0 +1,4 @@ +void script_2400(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 37 Agility" + "
" + "Requires the Grand Tree quest"); + return; +} diff --git a/dumps/scripts/2401.cs2 b/dumps/scripts/2401.cs2 new file mode 100644 index 000000000..8abd72852 --- /dev/null +++ b/dumps/scripts/2401.cs2 @@ -0,0 +1,4 @@ +void script_2401(int arg0,int arg1) { + script_2010(arg0, arg1, "Requires a rope for the first crossing"); + return; +} diff --git a/dumps/scripts/2402.cs2 b/dumps/scripts/2402.cs2 new file mode 100644 index 000000000..3128e6787 --- /dev/null +++ b/dumps/scripts/2402.cs2 @@ -0,0 +1,4 @@ +void script_2402(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 20 Agility"); + return; +} diff --git a/dumps/scripts/2403.cs2 b/dumps/scripts/2403.cs2 new file mode 100644 index 000000000..8c8b928fd --- /dev/null +++ b/dumps/scripts/2403.cs2 @@ -0,0 +1,4 @@ +void script_2403(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 62 Agility"); + return; +} diff --git a/dumps/scripts/2404.cs2 b/dumps/scripts/2404.cs2 new file mode 100644 index 000000000..1afd3f658 --- /dev/null +++ b/dumps/scripts/2404.cs2 @@ -0,0 +1,4 @@ +void script_2404(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 5 Agility"); + return; +} diff --git a/dumps/scripts/2405.cs2 b/dumps/scripts/2405.cs2 new file mode 100644 index 000000000..a1b3da739 --- /dev/null +++ b/dumps/scripts/2405.cs2 @@ -0,0 +1,4 @@ +void script_2405(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 70 Agility" + "
" + "Requires a rope on first passage"); + return; +} diff --git a/dumps/scripts/2406.cs2 b/dumps/scripts/2406.cs2 new file mode 100644 index 000000000..983fd9a96 --- /dev/null +++ b/dumps/scripts/2406.cs2 @@ -0,0 +1,4 @@ +void script_2406(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 60 Agility" + "
" + "Only permits west-to-east travel"); + return; +} diff --git a/dumps/scripts/2407.cs2 b/dumps/scripts/2407.cs2 new file mode 100644 index 000000000..801a7ffc1 --- /dev/null +++ b/dumps/scripts/2407.cs2 @@ -0,0 +1,4 @@ +void script_2407(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 42 Agility"); + return; +} diff --git a/dumps/scripts/2408.cs2 b/dumps/scripts/2408.cs2 new file mode 100644 index 000000000..d23784904 --- /dev/null +++ b/dumps/scripts/2408.cs2 @@ -0,0 +1,4 @@ +void script_2408(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 31 Agility"); + return; +} diff --git a/dumps/scripts/2409.cs2 b/dumps/scripts/2409.cs2 new file mode 100644 index 000000000..c3c2fe293 --- /dev/null +++ b/dumps/scripts/2409.cs2 @@ -0,0 +1,4 @@ +void script_2409(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 37 Ranged, level 19 Strength, level 8 Agility" + "
" + "Requires a grapple"); + return; +} diff --git a/dumps/scripts/241.cs2 b/dumps/scripts/241.cs2 new file mode 100644 index 000000000..5e92028d0 --- /dev/null +++ b/dumps/scripts/241.cs2 @@ -0,0 +1,4 @@ +void script_241(int arg0) { + script_243(arg0, 1); + return; +} diff --git a/dumps/scripts/2410.cs2 b/dumps/scripts/2410.cs2 new file mode 100644 index 000000000..2cda8ca0e --- /dev/null +++ b/dumps/scripts/2410.cs2 @@ -0,0 +1,48 @@ +void script_2410(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + if (strLength(arg5) > 0) { + setWidgetContextMenuOption(1, arg5); + if (arg0 != -1) { + cs2method1309(1, arg0); + } else { + cs2method1309(1, 36); + } + } + if (strLength(arg6) > 0) { + setWidgetContextMenuOption(2, arg6); + if (arg1 != -1) { + cs2method1309(2, arg1); + } else { + cs2method1309(2, 36); + } + } + if (strLength(arg7) > 0) { + setWidgetContextMenuOption(3, arg7); + if (arg2 != -1) { + cs2method1309(3, arg2); + } else { + cs2method1309(3, 36); + } + } + cs2method1306("Use"); + cs2method1311(46); + cs2method1308(46, 36); + setWidgetContextMenuOption(10, "Examine"); + if (strLength(arg8) > 0) { + setWidgetContextMenuOption(7, arg8); + if (arg3 != -1) { + cs2method1309(7, arg3); + } else { + cs2method1309(7, 36); + } + } + if (strLength(arg9) > 0) { + setWidgetContextMenuOption(8, arg9); + if (arg4 != -1) { + cs2method1309(8, arg4); + } else { + cs2method1309(8, 36); + } + } + cs2method1305("" + arg10); + return; +} diff --git a/dumps/scripts/2411.cs2 b/dumps/scripts/2411.cs2 new file mode 100644 index 000000000..e1553f723 --- /dev/null +++ b/dumps/scripts/2411.cs2 @@ -0,0 +1,9 @@ +void script_2411(int arg0) { + if (((boolean)bitconfig_995)) { + script_2410(getItemDefOpcode129Or130Method4209(arg0, 1), getItemDefOpcode129Or130Method4209(arg0, 2), -1, getItemDefOpcode129Or130Method4209(arg0, 4), getItemDefOpcode129Or130Method4209(arg0, 5), getItemOption(arg0, 1), getItemOption(arg0, 2), "", getItemOption(arg0, 4), getItemOption(arg0, 5), getItemName(arg0)); + } else { + script_2410(getItemDefOpcode129Or130Method4209(arg0, 1), getItemDefOpcode129Or130Method4209(arg0, 2), getItemDefOpcode129Or130Method4209(arg0, 1), getItemDefOpcode129Or130Method4209(arg0, 4), getItemDefOpcode129Or130Method4209(arg0, 5), "Lletya", getItemOption(arg0, 2), "Temple", getItemOption(arg0, 4), getItemOption(arg0, 5), getItemName(arg0)); + } + setScriptCallOnConfigChange(2412, new WidgetPointer(-32768,3), -2147483643, arg0, 1560, 1, "IioY"); + return; +} diff --git a/dumps/scripts/2412.cs2 b/dumps/scripts/2412.cs2 new file mode 100644 index 000000000..7b3352928 --- /dev/null +++ b/dumps/scripts/2412.cs2 @@ -0,0 +1,7 @@ +void script_2412(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetNoOptions(); + script_2411(arg2); + } + return; +} diff --git a/dumps/scripts/2413.cs2 b/dumps/scripts/2413.cs2 new file mode 100644 index 000000000..b38f993cb --- /dev/null +++ b/dumps/scripts/2413.cs2 @@ -0,0 +1,3 @@ +cs2func_script_2413_struct(3,0,0) script_2413(int arg0) { + return newstruct cs2func_script_2413_struct(divide(arg0, 65536), divide(bitAnd(arg0, 65280), 256), bitAnd(arg0, 255)); +} diff --git a/dumps/scripts/2414.cs2 b/dumps/scripts/2414.cs2 new file mode 100644 index 000000000..13e314d68 --- /dev/null +++ b/dumps/scripts/2414.cs2 @@ -0,0 +1,45 @@ +void script_2414() { + if (bitconfig_6180 == 120) { + setWidgetIsHidden(false, new WidgetPointer(765,4)); + setWidgetIsHidden(true, new WidgetPointer(765,3)); + if (((boolean)getItemAmtInContainer(93, 14831))) { + setWidgetIsHidden(true, new WidgetPointer(765,33)); + } + if (((boolean)getItemAmtInContainer(93, 14824)) && ((boolean)getItemAmtInContainer(94, 14824))) { + setWidgetIsHidden(true, new WidgetPointer(765,39)); + } + if (((boolean)getItemAmtInContainer(93, 14830))) { + setWidgetIsHidden(true, new WidgetPointer(765,37)); + } + if (((boolean)getItemAmtInContainer(93, 14823)) && ((boolean)getItemAmtInContainer(94, 14823))) { + setWidgetIsHidden(true, new WidgetPointer(765,38)); + } + if (((boolean)getItemAmtInContainer(93, 14829))) { + setWidgetIsHidden(true, new WidgetPointer(765,36)); + } + if (((boolean)getItemAmtInContainer(93, 14828))) { + setWidgetIsHidden(true, new WidgetPointer(765,35)); + } + if (((boolean)getItemAmtInContainer(93, 14827))) { + setWidgetIsHidden(true, new WidgetPointer(765,34)); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(765,4)); + setWidgetIsHidden(false, new WidgetPointer(765,3)); + } + setWidgetAnimation(-1, new WidgetPointer(765,10)); + setWidgetIsHidden(false, new WidgetPointer(765,11)); + setWidgetModel(46967, new WidgetPointer(765,5)); + setWidgetAnimation(11762, new WidgetPointer(765,10)); + setWidgetIsHidden(true, new WidgetPointer(765,19)); + setWidgetIsHidden(false, new WidgetPointer(765,20)); + setWidgetIsHidden(true, new WidgetPointer(765,6)); + setWidgetIsHidden(false, new WidgetPointer(765,18)); + setWidgetAnimation(-1, new WidgetPointer(765,20)); + setWidgetIsHidden(true, new WidgetPointer(765,41)); + setWidgetIsHidden(true, new WidgetPointer(765,40)); + setWidgetIsHidden(true, new WidgetPointer(765,7)); + globalint_805 = 0; + globalint_806 = 0; + return; +} diff --git a/dumps/scripts/2415.cs2 b/dumps/scripts/2415.cs2 new file mode 100644 index 000000000..9872c1292 --- /dev/null +++ b/dumps/scripts/2415.cs2 @@ -0,0 +1,42 @@ +void script_2415() { + setWidgetModel(46997, new WidgetPointer(765,14)); + setWidgetModel(46976, new WidgetPointer(765,16)); + setWidgetModel(46974, new WidgetPointer(765,15)); + setWidgetModel(46995, new WidgetPointer(765,17)); + setWidgetModel(46986, new WidgetPointer(765,18)); + setWidgetModel(46987, new WidgetPointer(765,33)); + setWidgetModel(46978, new WidgetPointer(765,34)); + setWidgetModel(46990, new WidgetPointer(765,35)); + setWidgetModel(46991, new WidgetPointer(765,36)); + setWidgetModel(46993, new WidgetPointer(765,37)); + setWidgetModel(46977, new WidgetPointer(765,38)); + setWidgetModel(46975, new WidgetPointer(765,39)); + if (((boolean)globalint_805)) { + setWidgetModel(46982, new WidgetPointer(765,14)); + } else if (globalint_805 == 2) { + setWidgetModel(46979, new WidgetPointer(765,16)); + } else if (globalint_805 == 3) { + setWidgetModel(46989, new WidgetPointer(765,15)); + } else if (globalint_805 == 4) { + setWidgetModel(46981, new WidgetPointer(765,17)); + } else if (globalint_805 == 5) { + setWidgetModel(46996, new WidgetPointer(765,18)); + } else if (globalint_805 == 6) { + setWidgetModel(46983, new WidgetPointer(765,33)); + } else if (globalint_805 == 7) { + setWidgetModel(46980, new WidgetPointer(765,34)); + } else if (globalint_805 == 8) { + setWidgetModel(46984, new WidgetPointer(765,35)); + } else if (globalint_805 == 9) { + setWidgetModel(46992, new WidgetPointer(765,36)); + } else if (globalint_805 == 10) { + setWidgetModel(46994, new WidgetPointer(765,37)); + } else if (globalint_805 == 11) { + setWidgetModel(46985, new WidgetPointer(765,38)); + } else { + if (globalint_805 == 12) { + setWidgetModel(46988, new WidgetPointer(765,39)); + } + } + return; +} diff --git a/dumps/scripts/2416.cs2 b/dumps/scripts/2416.cs2 new file mode 100644 index 000000000..abb3bd828 --- /dev/null +++ b/dumps/scripts/2416.cs2 @@ -0,0 +1,12 @@ +void script_2416(int arg0) { + if ((globalint_805 == 2) || (globalint_805 == 8)) { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Cut wire"); + } else if ((globalint_805 == 3) || (globalint_805 == 9)) { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Replace wire"); + } else if ((globalint_805 == 4) || (globalint_805 == 10)) { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Repair wire"); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Inspect"); + } + return; +} diff --git a/dumps/scripts/2417.cs2 b/dumps/scripts/2417.cs2 new file mode 100644 index 000000000..52d01742c --- /dev/null +++ b/dumps/scripts/2417.cs2 @@ -0,0 +1,8 @@ +void script_2417(int arg0) { + if ((globalint_805 == 5) || (globalint_805 == 11)) { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Pump"); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Inspect"); + } + return; +} diff --git a/dumps/scripts/2418.cs2 b/dumps/scripts/2418.cs2 new file mode 100644 index 000000000..64fe55d88 --- /dev/null +++ b/dumps/scripts/2418.cs2 @@ -0,0 +1,8 @@ +void script_2418(int arg0) { + if (globalint_805 == 6) { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Fix"); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Inspect"); + } + return; +} diff --git a/dumps/scripts/2419.cs2 b/dumps/scripts/2419.cs2 new file mode 100644 index 000000000..67549ee90 --- /dev/null +++ b/dumps/scripts/2419.cs2 @@ -0,0 +1,45 @@ +void script_2419() { + if (globalint_806 > 0) { + setWidgetIsHidden(true, new WidgetPointer(765,11)); + } + if (globalint_806 > 1) { + setWidgetModel(46964, new WidgetPointer(765,5)); + } + if (globalint_806 > 2) { + if (bitconfig_6180 == 75) { + setWidgetModel(46956, new WidgetPointer(765,5)); + setWidgetIsHidden(true, new WidgetPointer(765,15)); + } else { + setWidgetModel(46966, new WidgetPointer(765,5)); + setWidgetIsHidden(true, new WidgetPointer(765,36)); + } + } + if (globalint_806 > 3) { + if (bitconfig_6180 == 75) { + setWidgetModel(46965, new WidgetPointer(765,5)); + setWidgetIsHidden(true, new WidgetPointer(765,17)); + } else { + setWidgetModel(46957, new WidgetPointer(765,5)); + setWidgetIsHidden(true, new WidgetPointer(765,37)); + setWidgetContextMenuOption(1, new WidgetPointer(765,5), "Inspect"); + } + } + if (((boolean)bitconfig_6194)) { + setWidgetAnimation(11762, new WidgetPointer(765,10)); + } else if (((boolean)bitconfig_6194)) { + setWidgetAnimation(11761, new WidgetPointer(765,10)); + } else if (bitconfig_6194 == 2) { + setWidgetAnimation(11760, new WidgetPointer(765,10)); + } else if (bitconfig_6194 == 3) { + setWidgetAnimation(11759, new WidgetPointer(765,10)); + } else if (bitconfig_6194 == 4) { + setWidgetAnimation(11763, new WidgetPointer(765,10)); + } else if (bitconfig_6194 == 5) { + setWidgetAnimation(11764, new WidgetPointer(765,10)); + } else { + if (bitconfig_6194 == 6) { + setWidgetAnimation(11765, new WidgetPointer(765,10)); + } + } + return; +} diff --git a/dumps/scripts/242.cs2 b/dumps/scripts/242.cs2 new file mode 100644 index 000000000..751fe2e83 --- /dev/null +++ b/dumps/scripts/242.cs2 @@ -0,0 +1,4 @@ +void script_242(int arg0) { + script_243(arg0, 0); + return; +} diff --git a/dumps/scripts/2420.cs2 b/dumps/scripts/2420.cs2 new file mode 100644 index 000000000..44c7d05df --- /dev/null +++ b/dumps/scripts/2420.cs2 @@ -0,0 +1,12 @@ +void script_2420() { + setWidgetIsHidden(true, new WidgetPointer(674,18)); + setWidgetIsHidden(false, new WidgetPointer(674,19)); + setWidgetAnimation(-1, new WidgetPointer(674,19)); + setWidgetAnimation(-1, new WidgetPointer(674,9)); + setWidgetIsHidden(false, new WidgetPointer(674,10)); + setWidgetModel(46967, new WidgetPointer(674,6)); + setWidgetIsHidden(true, new WidgetPointer(674,5)); + setWidgetAnimation(11762, new WidgetPointer(674,9)); + globalint_737 = 0; + return; +} diff --git a/dumps/scripts/2421.cs2 b/dumps/scripts/2421.cs2 new file mode 100644 index 000000000..917878a31 --- /dev/null +++ b/dumps/scripts/2421.cs2 @@ -0,0 +1,42 @@ +void script_2421() { + setWidgetModel(46997, new WidgetPointer(674,13)); + setWidgetModel(46976, new WidgetPointer(674,15)); + setWidgetModel(46974, new WidgetPointer(674,14)); + setWidgetModel(46995, new WidgetPointer(674,16)); + setWidgetModel(46986, new WidgetPointer(674,17)); + if (((boolean)globalint_737)) { + setWidgetModel(46982, new WidgetPointer(674,13)); + playSoundEffect(6691, 1, 0); + setWidgetIsHidden(true, new WidgetPointer(674,10)); + } else if (globalint_737 == 2) { + setWidgetModel(46979, new WidgetPointer(674,15)); + playSoundEffect(6694, 1, 0); + setWidgetModel(46964, new WidgetPointer(674,6)); + } else if (globalint_737 == 3) { + setWidgetModel(46989, new WidgetPointer(674,14)); + setWidgetModel(46956, new WidgetPointer(674,6)); + } else if (globalint_737 == 4) { + setWidgetModel(46981, new WidgetPointer(674,16)); + playSoundEffect(6695, 1, 0); + setWidgetModel(46965, new WidgetPointer(674,6)); + } else if (globalint_737 == 5) { + setWidgetModel(46996, new WidgetPointer(674,17)); + playSoundEffect(6690, 1, 0); + setWidgetIsHidden(false, new WidgetPointer(674,5)); + } else if (globalint_737 == 6) { + setWidgetAnimation(11761, new WidgetPointer(674,9)); + } else if (globalint_737 == 7) { + setWidgetAnimation(11760, new WidgetPointer(674,9)); + } else if (globalint_737 == 8) { + setWidgetAnimation(11759, new WidgetPointer(674,9)); + } else if (globalint_737 == 9) { + setWidgetAnimation(11763, new WidgetPointer(674,9)); + } else if (globalint_737 == 10) { + setWidgetAnimation(11764, new WidgetPointer(674,9)); + } else { + if (globalint_737 == 11) { + setWidgetAnimation(11765, new WidgetPointer(674,9)); + } + } + return; +} diff --git a/dumps/scripts/2422.cs2 b/dumps/scripts/2422.cs2 new file mode 100644 index 000000000..f4842179b --- /dev/null +++ b/dumps/scripts/2422.cs2 @@ -0,0 +1,14 @@ +?? script_2422() { + int stack_dump0; + stack_dump0 = 0; + /* + mgi.tools.jagdecs2.DecompilerException: Unknown special opcode:6509 + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:348) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/2423.cs2 b/dumps/scripts/2423.cs2 new file mode 100644 index 000000000..9048c3d23 --- /dev/null +++ b/dumps/scripts/2423.cs2 @@ -0,0 +1,18 @@ +void script_2423(int arg0) { + int ivar1; + ivar1 = -1; + if (((boolean)globalint_811)) { + ivar1 = 1358; + } else if (((boolean)globalint_811)) { + ivar1 = 1359; + } else if (globalint_811 == 2) { + ivar1 = 1360; + } else { + if (globalint_811 == 3) { + ivar1 = 1361; + } + } + setWidgetAnimation(-1, new WidgetPointer(arg0)); + setWidgetAnimation(ivar1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2424.cs2 b/dumps/scripts/2424.cs2 new file mode 100644 index 000000000..601c55d71 --- /dev/null +++ b/dumps/scripts/2424.cs2 @@ -0,0 +1,5 @@ +void script_2424(int arg0,int arg1,int arg2) { + script_1583(arg0, arg2, globalstring_130); + script_1583(arg1, arg2, globalstring_142); + return; +} diff --git a/dumps/scripts/2425.cs2 b/dumps/scripts/2425.cs2 new file mode 100644 index 000000000..aeea23d45 --- /dev/null +++ b/dumps/scripts/2425.cs2 @@ -0,0 +1,4 @@ +void script_2425(int arg0,int arg1) { + script_1583(arg0, arg1, globalstring_147); + return; +} diff --git a/dumps/scripts/2426.cs2 b/dumps/scripts/2426.cs2 new file mode 100644 index 000000000..54cc12e51 --- /dev/null +++ b/dumps/scripts/2426.cs2 @@ -0,0 +1,6 @@ +void script_2426(int arg0,int arg1,int arg2,int arg3) { + setWidgetText(new WidgetPointer(arg0), globalstring_143); + setWidgetText(new WidgetPointer(arg1), globalstring_144); + script_1585(arg2, arg3, globalstring_145); + return; +} diff --git a/dumps/scripts/2427.cs2 b/dumps/scripts/2427.cs2 new file mode 100644 index 000000000..a5d987638 --- /dev/null +++ b/dumps/scripts/2427.cs2 @@ -0,0 +1,4 @@ +void script_2427(int arg0) { + setItemOnWidgetMethod2200(cs2method_3408(105, 111, 172, globalint_809), 72, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2428.cs2 b/dumps/scripts/2428.cs2 new file mode 100644 index 000000000..a0400c734 --- /dev/null +++ b/dumps/scripts/2428.cs2 @@ -0,0 +1,4 @@ +void script_2428(int arg0) { + setItemOnWidgetMethod2200(cs2method_3408(105, 111, 172, globalint_810), 72, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2429.cs2 b/dumps/scripts/2429.cs2 new file mode 100644 index 000000000..40dfa5f0d --- /dev/null +++ b/dumps/scripts/2429.cs2 @@ -0,0 +1,4 @@ +void script_2429(int arg0) { + setWidgetText(new WidgetPointer(arg0), globalstring_146); + return; +} diff --git a/dumps/scripts/243.cs2 b/dumps/scripts/243.cs2 new file mode 100644 index 000000000..68932b17a --- /dev/null +++ b/dumps/scripts/243.cs2 @@ -0,0 +1,205 @@ +void script_243(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + flow_0: + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = 1; + SWITCH (arg0) { + case 38928641: + GOTO flow_1 + case 38928642: + GOTO flow_2 + case 38928643: + GOTO flow_3 + case 38928648: + GOTO flow_4 + case 38928649: + GOTO flow_5 + case 38928650: + GOTO flow_6 + case 38928655: + GOTO flow_7 + case 38928672: + GOTO flow_8 + case 38928673: + GOTO flow_9 + case 38928674: + GOTO flow_10 + case 38928683: + GOTO flow_11 + case 38928684: + GOTO flow_12 + case 38928690: + GOTO flow_13 + case 38928685: + GOTO flow_14 + case 38928386: + GOTO flow_15 + case 38928460: + GOTO flow_16 + case 38928387: + GOTO flow_17 + case 38928438: + GOTO flow_18 + case 38928509: + GOTO flow_19 + case 38928514: + GOTO flow_20 + } + script_675(); + GOTO flow_21 + flow_1: + ivar2 = 38928637; + ivar3 = 38928638; + ivar4 = 38928639; + GOTO flow_21 + flow_2: + ivar2 = 38928668; + ivar3 = 38928669; + ivar4 = 38928670; + GOTO flow_21 + flow_3: + ivar2 = 38928644; + ivar3 = 38928645; + ivar4 = 38928646; + GOTO flow_21 + flow_4: + ivar2 = 38928664; + ivar3 = 38928665; + ivar4 = 38928666; + GOTO flow_21 + flow_5: + ivar2 = 38928660; + ivar3 = 38928661; + ivar4 = 38928662; + GOTO flow_21 + flow_6: + ivar2 = 38928651; + ivar3 = 38928652; + ivar4 = 38928653; + GOTO flow_21 + flow_7: + ivar2 = 38928656; + ivar3 = 38928657; + ivar4 = 38928658; + GOTO flow_21 + flow_8: + ivar2 = 38928621; + ivar3 = 38928622; + ivar4 = 38928623; + GOTO flow_21 + flow_9: + ivar2 = 38928679; + ivar3 = 38928680; + ivar4 = 38928681; + GOTO flow_21 + flow_10: + ivar2 = 38928675; + ivar3 = 38928676; + ivar4 = 38928677; + GOTO flow_21 + flow_11: + ivar2 = 38928625; + ivar3 = 38928626; + ivar4 = 38928627; + GOTO flow_21 + flow_12: + ivar2 = 38928629; + ivar3 = 38928630; + ivar4 = 38928631; + GOTO flow_21 + flow_13: + ivar2 = 38928633; + ivar3 = 38928634; + ivar4 = 38928635; + GOTO flow_21 + flow_14: + ivar2 = 38928686; + ivar3 = 38928687; + ivar4 = 38928688; + GOTO flow_21 + flow_15: + ivar2 = 38928395; + ivar3 = 38928396; + ivar4 = 38928397; + ivar5 = 0; + GOTO flow_21 + flow_16: + ivar2 = 38928461; + ivar3 = 38928462; + ivar4 = 38928463; + ivar5 = 0; + GOTO flow_21 + flow_17: + ivar2 = 38928388; + ivar3 = 38928389; + ivar4 = 38928390; + ivar5 = 0; + GOTO flow_21 + flow_18: + ivar2 = 38928439; + ivar3 = 38928440; + ivar4 = 38928441; + ivar5 = 0; + GOTO flow_21 + flow_19: + ivar2 = 38928510; + ivar3 = 38928511; + ivar4 = 38928512; + ivar5 = 0; + GOTO flow_21 + flow_20: + ivar2 = 38928515; + ivar3 = 38928516; + ivar4 = 38928517; + ivar5 = 0; + flow_21: + if (((boolean)arg1)) { + if (((boolean)ivar5)) { + if (ivar2 != -1) { + setWidgetSprite(1750, new WidgetPointer(ivar2)); + } + if (ivar3 != -1) { + setWidgetSprite(1751, new WidgetPointer(ivar3)); + } + if (ivar4 != -1) { + setWidgetSprite(1752, new WidgetPointer(ivar4)); + } + } else { + if (ivar2 != -1) { + setWidgetSprite(1756, new WidgetPointer(ivar2)); + } + if (ivar3 != -1) { + setWidgetSprite(1757, new WidgetPointer(ivar3)); + } + if (ivar4 != -1) { + setWidgetSprite(1758, new WidgetPointer(ivar4)); + } + } + } else if (((boolean)ivar5)) { + if (ivar2 != -1) { + setWidgetSprite(1753, new WidgetPointer(ivar2)); + } + if (ivar3 != -1) { + setWidgetSprite(1754, new WidgetPointer(ivar3)); + } + if (ivar4 != -1) { + setWidgetSprite(1755, new WidgetPointer(ivar4)); + } + } else { + if (ivar2 != -1) { + setWidgetSprite(1759, new WidgetPointer(ivar2)); + } + if (ivar3 != -1) { + setWidgetSprite(1760, new WidgetPointer(ivar3)); + } + if (ivar4 != -1) { + setWidgetSprite(1761, new WidgetPointer(ivar4)); + } + } + return; +} diff --git a/dumps/scripts/2430.cs2 b/dumps/scripts/2430.cs2 new file mode 100644 index 000000000..7ef481ec2 --- /dev/null +++ b/dumps/scripts/2430.cs2 @@ -0,0 +1,339 @@ +void script_2430() { + if (((boolean)bitconfig_1628)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,56)); + } + if (((boolean)bitconfig_1629)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,57)); + } + if (((boolean)bitconfig_1630)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,58)); + } + if (((boolean)bitconfig_1631)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,59)); + } + if (((boolean)bitconfig_1632)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,60)); + } + if (((boolean)bitconfig_1633)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,61)); + } + if (((boolean)bitconfig_1634)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,62)); + } + if (((boolean)bitconfig_1635)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,63)); + } + if (((boolean)bitconfig_1636)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,64)); + } + if (((boolean)bitconfig_1637)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,65)); + } + if (((boolean)bitconfig_1638)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,66)); + } + if (((boolean)bitconfig_1639)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,67)); + } + if (((boolean)bitconfig_1640)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,68)); + } + if (((boolean)bitconfig_1641)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,69)); + } + if (((boolean)bitconfig_1642)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,70)); + } + if (((boolean)bitconfig_1643)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,71)); + } + if (((boolean)bitconfig_1644)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,72)); + } + if (((boolean)bitconfig_1645)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,73)); + } + if (((boolean)bitconfig_1646)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,74)); + } + if (((boolean)bitconfig_1647)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,75)); + } + if (((boolean)bitconfig_1648)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,76)); + } + if (((boolean)bitconfig_1649)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,77)); + } + if (((boolean)bitconfig_1650)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,78)); + } + if (((boolean)bitconfig_1651)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,79)); + } + if (((boolean)bitconfig_1652)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,80)); + } + if (((boolean)bitconfig_1653)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,81)); + } + if (((boolean)bitconfig_1654)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,82)); + } + if (((boolean)bitconfig_1655)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,83)); + } + if (((boolean)bitconfig_1656)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,84)); + } + if (((boolean)bitconfig_1657)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,85)); + } + if (((boolean)bitconfig_1658)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,86)); + } + if (((boolean)bitconfig_1659)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,87)); + } + if (((boolean)bitconfig_1660)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,88)); + } + if (((boolean)bitconfig_1661)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,89)); + } + if (((boolean)bitconfig_1662)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,90)); + } + if (((boolean)bitconfig_1663)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,91)); + } + if (((boolean)bitconfig_1664)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,92)); + } + if (((boolean)bitconfig_1665)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,93)); + } + if (((boolean)bitconfig_1666)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,94)); + } + if (((boolean)bitconfig_1667)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,95)); + } + if (((boolean)bitconfig_1668)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,96)); + } + if (((boolean)bitconfig_1669)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,97)); + } + if (((boolean)bitconfig_1670)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,98)); + } + if (((boolean)bitconfig_1671)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,99)); + } + if (((boolean)bitconfig_1672)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,100)); + } + if (((boolean)bitconfig_1673)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,101)); + } + if (((boolean)bitconfig_1674)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,102)); + } + if (((boolean)bitconfig_1675)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,103)); + } + if (((boolean)bitconfig_1676)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,104)); + } + if (((boolean)bitconfig_1677)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,105)); + } + if (((boolean)bitconfig_1678)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,106)); + } + if (((boolean)bitconfig_1679)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,107)); + } + if (((boolean)bitconfig_1680)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,108)); + } + if (((boolean)bitconfig_1681)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,109)); + } + if (((boolean)bitconfig_1682)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,110)); + } + if (((boolean)bitconfig_1683)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,111)); + } + if (((boolean)bitconfig_1684)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,0)); + } + if (((boolean)bitconfig_1685)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,1)); + } + if (((boolean)bitconfig_1686)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,2)); + } + if (((boolean)bitconfig_1687)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,3)); + } + if (((boolean)bitconfig_1688)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,4)); + } + if (((boolean)bitconfig_1689)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,5)); + } + if (((boolean)bitconfig_1690)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,6)); + } + if (((boolean)bitconfig_1691)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,7)); + } + if (((boolean)bitconfig_1692)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,8)); + } + if (((boolean)bitconfig_1693)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,9)); + } + if (((boolean)bitconfig_1694)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,10)); + } + if (((boolean)bitconfig_1695)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,11)); + } + if (((boolean)bitconfig_1696)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,12)); + } + if (((boolean)bitconfig_1697)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,13)); + } + if (((boolean)bitconfig_1698)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,14)); + } + if (((boolean)bitconfig_1699)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,15)); + } + if (((boolean)bitconfig_1700)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,16)); + } + if (((boolean)bitconfig_1701)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,17)); + } + if (((boolean)bitconfig_1702)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,18)); + } + if (((boolean)bitconfig_1703)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,19)); + } + if (((boolean)bitconfig_1704)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,20)); + } + if (((boolean)bitconfig_1705)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,21)); + } + if (((boolean)bitconfig_1706)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,22)); + } + if (((boolean)bitconfig_1707)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,23)); + } + if (((boolean)bitconfig_1708)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,24)); + } + if (((boolean)bitconfig_1709)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,25)); + } + if (((boolean)bitconfig_1710)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,26)); + } + if (((boolean)bitconfig_1711)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,27)); + } + if (((boolean)bitconfig_1712)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,28)); + } + if (((boolean)bitconfig_1713)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,29)); + } + if (((boolean)bitconfig_1714)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,30)); + } + if (((boolean)bitconfig_1715)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,31)); + } + if (((boolean)bitconfig_1716)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,32)); + } + if (((boolean)bitconfig_1717)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,33)); + } + if (((boolean)bitconfig_1718)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,34)); + } + if (((boolean)bitconfig_1719)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,35)); + } + if (((boolean)bitconfig_1720)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,36)); + } + if (((boolean)bitconfig_1721)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,37)); + } + if (((boolean)bitconfig_1722)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,38)); + } + if (((boolean)bitconfig_1723)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,39)); + } + if (((boolean)bitconfig_1724)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,40)); + } + if (((boolean)bitconfig_1725)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,41)); + } + if (((boolean)bitconfig_1726)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,42)); + } + if (((boolean)bitconfig_1727)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,43)); + } + if (((boolean)bitconfig_1728)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,44)); + } + if (((boolean)bitconfig_1729)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,45)); + } + if (((boolean)bitconfig_1730)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,46)); + } + if (((boolean)bitconfig_1731)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,47)); + } + if (((boolean)bitconfig_1732)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,48)); + } + if (((boolean)bitconfig_1733)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,49)); + } + if (((boolean)bitconfig_1734)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,50)); + } + if (((boolean)bitconfig_1735)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,51)); + } + if (((boolean)bitconfig_1736)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,52)); + } + if (((boolean)bitconfig_1737)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,53)); + } + if (((boolean)bitconfig_1738)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,54)); + } + if (((boolean)bitconfig_1739)) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(43,55)); + } + return; +} diff --git a/dumps/scripts/2431.cs2 b/dumps/scripts/2431.cs2 new file mode 100644 index 000000000..2d8c3bd48 --- /dev/null +++ b/dumps/scripts/2431.cs2 @@ -0,0 +1,5 @@ +void script_2431(int arg0) { + script_2410(getItemDefOpcode129Or130Method4209(arg0, 2), getItemDefOpcode129Or130Method4209(arg0, 1), getItemDefOpcode129Or130Method4209(arg0, 3), getItemDefOpcode129Or130Method4209(arg0, 4), getItemDefOpcode129Or130Method4209(arg0, 5), getItemOption(arg0, 2), getItemOption(arg0, 1), getItemOption(arg0, 3), getItemOption(arg0, 4), getItemOption(arg0, 5), getItemName(arg0)); + setScriptCallOnConfigChange(-1, ""); + return; +} diff --git a/dumps/scripts/2432.cs2 b/dumps/scripts/2432.cs2 new file mode 100644 index 000000000..e17ca5723 --- /dev/null +++ b/dumps/scripts/2432.cs2 @@ -0,0 +1,3 @@ +void script_2432(int arg0) { + return; +} diff --git a/dumps/scripts/2433.cs2 b/dumps/scripts/2433.cs2 new file mode 100644 index 000000000..5c928ef1c --- /dev/null +++ b/dumps/scripts/2433.cs2 @@ -0,0 +1,11 @@ +void script_2433() { + if (((boolean)script_1431()) || ((boolean)stringMethod4107(globalstring_148, "null"))) { + return; + } + if (getDisplayMode() < 2) { + setWidgetText(new WidgetPointer(548,11), globalstring_148); + } else { + setWidgetText(new WidgetPointer(746,164), globalstring_148); + } + return; +} diff --git a/dumps/scripts/2434.cs2 b/dumps/scripts/2434.cs2 new file mode 100644 index 000000000..c285645fb --- /dev/null +++ b/dumps/scripts/2434.cs2 @@ -0,0 +1,17 @@ +void script_2434(int arg0) { + globalint_815 = divide(multiply(arg0, 300), 10); + if (globalint_815 > 0) { + if (getDisplayMode() < 2) { + setScriptCallOnGameloop(2435, "", new WidgetPointer(548,12)); + setWidgetIsHidden(false, new WidgetPointer(548,13)); + setWidgetIsHidden(false, new WidgetPointer(548,14)); + } else { + setScriptCallOnGameloop(2435, "", new WidgetPointer(746,14)); + setWidgetIsHidden(false, new WidgetPointer(746,169)); + setWidgetIsHidden(false, new WidgetPointer(746,168)); + } + } else { + script_2436(); + } + return; +} diff --git a/dumps/scripts/2435.cs2 b/dumps/scripts/2435.cs2 new file mode 100644 index 000000000..983b35ded --- /dev/null +++ b/dumps/scripts/2435.cs2 @@ -0,0 +1,41 @@ +void script_2435() { + int ivar0; + int ivar1; + string svar0; + string svar1; + if (globalint_815 > 0) { + globalint_815 = subtract(globalint_815, 1); + } else { + script_2436(); + return; + } + ivar0 = divide(globalint_815, 50); + ivar1 = divide(ivar0, 60); + ivar0 = subtract(ivar0, multiply(ivar1, 60)); + svar0 = ""; + svar1 = ""; + if (((boolean)ivar1)) { + svar0 = "00"; + } else if (ivar1 < 10) { + svar0 = "0" + intToStr(ivar1); + } else { + svar0 = intToStr(ivar1); + } + if (((boolean)ivar0)) { + svar1 = "00"; + } else if (ivar0 < 10) { + svar1 = "0" + intToStr(ivar0); + } else { + svar1 = intToStr(ivar0); + } + if (getDisplayMode() < 2) { + setWidgetIsHidden(false, new WidgetPointer(548,14)); + setWidgetIsHidden(false, new WidgetPointer(548,13)); + setWidgetText(new WidgetPointer(548,14), svar0 + ":" + svar1); + } else { + setWidgetIsHidden(false, new WidgetPointer(746,169)); + setWidgetIsHidden(false, new WidgetPointer(746,168)); + setWidgetText(new WidgetPointer(746,169), svar0 + ":" + svar1); + } + return; +} diff --git a/dumps/scripts/2436.cs2 b/dumps/scripts/2436.cs2 new file mode 100644 index 000000000..353c301d4 --- /dev/null +++ b/dumps/scripts/2436.cs2 @@ -0,0 +1,14 @@ +void script_2436() { + globalint_815 = 0; + script_1952(); + if (getDisplayMode() < 2) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(548,12)); + setWidgetIsHidden(true, new WidgetPointer(548,14)); + setWidgetIsHidden(true, new WidgetPointer(548,13)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(746,14)); + setWidgetIsHidden(true, new WidgetPointer(746,169)); + setWidgetIsHidden(true, new WidgetPointer(746,168)); + } + return; +} diff --git a/dumps/scripts/2437.cs2 b/dumps/scripts/2437.cs2 new file mode 100644 index 000000000..30bc1844b --- /dev/null +++ b/dumps/scripts/2437.cs2 @@ -0,0 +1,31 @@ +void script_2437() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + switch (globalint_816) { + case 0: + return; + case 1: + ivar2 = globalint_817; + break; + case 2: + ivar2 = multiplyDivide(globalint_817, 125, 100); + break; + case 3: + ivar2 = multiplyDivide(globalint_817, 150, 100); + break; + default: + ivar2 = multiplyDivide(globalint_817, 175, 100); + } + if (ivar2 > 100) { + ivar2 = 100; + } + ivar0 = cs2method_3408(105, 105, 1090, ivar2); + ivar1 = cs2method_3408(105, 105, 1091, ivar2); + setWidgetPosition(91, ivar0, 2, 0, new WidgetPointer(15,11)); + setWidgetSize(18, ivar1, 0, 0, new WidgetPointer(15,11)); + return; +} diff --git a/dumps/scripts/2438.cs2 b/dumps/scripts/2438.cs2 new file mode 100644 index 000000000..90f5af0c6 --- /dev/null +++ b/dumps/scripts/2438.cs2 @@ -0,0 +1,21 @@ +void script_2438() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = multiplyDivide(bitconfig_651, 1000, 100); + if (ivar2 > 100) { + ivar2 = 100; + } + ivar0 = cs2method_3408(105, 105, 1090, ivar2); + ivar1 = cs2method_3408(105, 105, 1091, ivar2); + setWidgetPosition(40, ivar0, 2, 0, new WidgetPointer(15,14)); + setWidgetSize(18, ivar1, 0, 0, new WidgetPointer(15,14)); + if (ivar2 < 25) { + setWidgetRGB(new Color(255, 153, 0), new WidgetPointer(15,14)); + } else { + setWidgetRGB(new Color(0, 102, 0), new WidgetPointer(15,14)); + } + return; +} diff --git a/dumps/scripts/2439.cs2 b/dumps/scripts/2439.cs2 new file mode 100644 index 000000000..e8ce7a4c4 --- /dev/null +++ b/dumps/scripts/2439.cs2 @@ -0,0 +1,10 @@ +void script_2439() { + if (((boolean)globalint_818)) { + setWidgetText(new WidgetPointer(15,16), "Net: Ripped!"); + setWidgetRGB(new Color(225, 35, 35), new WidgetPointer(15,16)); + } else { + setWidgetText(new WidgetPointer(15,16), "Net: OK"); + setWidgetRGB(new Color(255, 153, 0), new WidgetPointer(15,16)); + } + return; +} diff --git a/dumps/scripts/244.cs2 b/dumps/scripts/244.cs2 new file mode 100644 index 000000000..383e9102b --- /dev/null +++ b/dumps/scripts/244.cs2 @@ -0,0 +1,6 @@ +void script_244() { + script_132(); + globalint_11 = 0; + globalstring_24 = ""; + return; +} diff --git a/dumps/scripts/2440.cs2 b/dumps/scripts/2440.cs2 new file mode 100644 index 000000000..27ec666a5 --- /dev/null +++ b/dumps/scripts/2440.cs2 @@ -0,0 +1,10 @@ +void script_2440() { + int ivar0; + ivar0 = divide(globalint_819, 2); + if (ivar0 < 1) { + setWidgetText(new WidgetPointer(15,17), "Catch: Nothing"); + } else { + setWidgetText(new WidgetPointer(15,17), "Catch: " + intToStr(ivar0) + " Fish"); + } + return; +} diff --git a/dumps/scripts/2441.cs2 b/dumps/scripts/2441.cs2 new file mode 100644 index 000000000..ad0cdc539 --- /dev/null +++ b/dumps/scripts/2441.cs2 @@ -0,0 +1,8 @@ +void script_2441() { + if (globalint_820 < 2) { + setWidgetText(new WidgetPointer(15,18), "Time Left: ~1 Min"); + } else { + setWidgetText(new WidgetPointer(15,18), "Time Left: " + intToStr(globalint_820) + " Mins"); + } + return; +} diff --git a/dumps/scripts/2442.cs2 b/dumps/scripts/2442.cs2 new file mode 100644 index 000000000..f9ea65442 --- /dev/null +++ b/dumps/scripts/2442.cs2 @@ -0,0 +1,41 @@ +void script_2442() { + globalstring_149 = ""; + globalstring_150 = ""; + globalstring_151 = ""; + globalstring_152 = ""; + globalstring_153 = ""; + globalstring_154 = ""; + globalstring_155 = ""; + globalstring_156 = ""; + globalstring_157 = ""; + globalstring_158 = ""; + globalstring_159 = ""; + globalstring_160 = ""; + globalstring_161 = ""; + globalstring_162 = ""; + globalstring_163 = ""; + globalstring_164 = ""; + globalstring_165 = ""; + globalstring_166 = ""; + globalstring_167 = ""; + globalstring_168 = ""; + globalstring_169 = ""; + globalstring_170 = ""; + globalstring_171 = ""; + globalstring_172 = ""; + globalstring_173 = ""; + globalstring_174 = ""; + globalstring_175 = ""; + globalstring_176 = ""; + globalstring_177 = ""; + globalstring_178 = ""; + setScriptCallOnGlobalStringChange(2443, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 30, "Y", new WidgetPointer(34,9)); + setScriptCallOnConfigChange(2448, 1439, 1, "Y", new WidgetPointer(34,9)); + setScriptCallOnConfigChange(2443, 1440, 1441, 2, "Y", new WidgetPointer(34,6)); + setWidgetIsHidden(true, new WidgetPointer(34,16)); + deleteAllExtraChilds(new WidgetPointer(34,15)); + cs2method2100(0, 0, new WidgetPointer(34,15)); + setWidgetScrollMax(0, 0, new WidgetPointer(34,15)); + script_31(2228239, 2228233, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/2443.cs2 b/dumps/scripts/2443.cs2 new file mode 100644 index 000000000..8c77a8135 --- /dev/null +++ b/dumps/scripts/2443.cs2 @@ -0,0 +1,4 @@ +void script_2443() { + script_2444(); + return; +} diff --git a/dumps/scripts/2444.cs2 b/dumps/scripts/2444.cs2 new file mode 100644 index 000000000..0355189a2 --- /dev/null +++ b/dumps/scripts/2444.cs2 @@ -0,0 +1,63 @@ +void script_2444() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + if (((boolean)standart_config_1437)) { + return; + } + if (isWidgetHidden(new WidgetPointer(34,10))) { + setScriptCallOnGameloop(2443, "", new WidgetPointer(34,9)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(34,9)); + script_1548(13); + setWidgetIsHidden(true, new WidgetPointer(34,16)); + globalint_821 = 0; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + svar0 = ""; + deleteAllExtraChilds(new WidgetPointer(34,9)); + if (cs2method6900()) { + setWidgetText(new WidgetPointer(34,13), "The notes system is not available for users restricted to quick-chat."); + setWidgetIsHidden(false, new WidgetPointer(34,13)); + return; + } + setWidgetText(new WidgetPointer(34,13), ""); + setWidgetIsHidden(true, new WidgetPointer(34,13)); + while (ivar1 < 30) { + svar0 = script_2452(ivar1); + if (stringMethod4107(svar0, "") != 0) { + ivar0 = script_2445(ivar0, ivar2, script_2453(ivar1), svar0); + ivar2 = add(ivar2, 1); + } + ivar1 = add(ivar1, 1); + } + if (ivar2 <= 0) { + setWidgetText(new WidgetPointer(34,13), "No notes"); + setWidgetIsHidden(false, new WidgetPointer(34,13)); + setWidgetText(new WidgetPointer(34,1), "Notes"); + } else if ((ivar2 > 0) && (ivar2 <= 30)) { + setWidgetText(new WidgetPointer(34,1), "Notes (" + intToStr(ivar2) + "/" + "30" + ")"); + } else { + setWidgetText(new WidgetPointer(34,1), "Notes"); + } + if ((ivar0 > 0) && (ivar0 < 13)) { + if (setWidgetRegister(new WidgetPointer(34,9), subtract(ivar2, 1))) { + setWidgetSize(getWidgetActualWidth(), subtract(getWidgetActualHeight(new WidgetPointer(34,9)), add(getWidgetActualY(), getWidgetActualHeight())), 0, 0, new WidgetPointer(34,12)); + setWidgetPosition(getWidgetActualX(), add(getWidgetActualY(), getWidgetActualHeight()), 0, 0, new WidgetPointer(34,12)); + setWidgetIsHidden(false, new WidgetPointer(34,12)); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(34,12)); + } + if (ivar0 < 1) { + setWidgetScrollMax(0, 0, new WidgetPointer(34,9)); + } else { + setWidgetScrollMax(0, add(multiply(ivar0, 15), 10), new WidgetPointer(34,9)); + } + script_72(2228239, 2228233, cs2method2601(new WidgetPointer(34,9))); + setWidgetIsHidden(true, new WidgetPointer(34,44)); + return; +} diff --git a/dumps/scripts/2445.cs2 b/dumps/scripts/2445.cs2 new file mode 100644 index 000000000..8f2414e65 --- /dev/null +++ b/dumps/scripts/2445.cs2 @@ -0,0 +1,27 @@ +int script_2445(int arg0,int arg1,int arg2,string arg3) { + int ivar3; + int ivar4; + ivar3 = getWidgetActualWidth(new WidgetPointer(34,9)); + arg3 = replaceLtGt(script_2446(arg3)); + createExtraChild(new WidgetPointer(34,9), 4, arg1); + setWidgetPosition(0, add(multiply(arg0, 15), 5), 0, 0); + ivar4 = getLineCount(ivar3, 494, arg3); + setWidgetSize(0, multiply(ivar4, 14), 1, 0); + setWidgetRGB(new Color(arg2)); + setWidgetText(arg3); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 14); + setWidgetUnknownBoolean(true); + setScriptCallOnMouseDragged(2450, new WidgetPointer(-32768,3), -2147483643, -2147483646, "Iii"); + setScriptCallOnMouseDragReleased(2451, new WidgetPointer(-32768,6), "I"); + if (standart_config_1439 == arg1) { + setWidgetContextMenuOption(1, "Unselect"); + } else { + setWidgetContextMenuOption(1, "Select"); + } + setWidgetContextMenuOption(2, "Edit"); + setWidgetContextMenuOption(3, "Colour"); + setWidgetContextMenuOption(4, "Delete"); + cs2method1303(14); + return add(arg0, ivar4); +} diff --git a/dumps/scripts/2446.cs2 b/dumps/scripts/2446.cs2 new file mode 100644 index 000000000..e2768a2a9 --- /dev/null +++ b/dumps/scripts/2446.cs2 @@ -0,0 +1,56 @@ +string script_2446(string arg0) { + string svar1; + svar1 = lower(arg0); + if (((boolean)stringMethod4107(svar1, "all your base are belong to us"))) { + return "orly?"; + } + if (((boolean)stringMethod4107(svar1, "orly"))) { + return "yarly"; + } + if (((boolean)stringMethod4107(svar1, "bangin'"))) { + return "donk"; + } + if (((boolean)stringMethod4107(svar1, "murder")) || ((boolean)stringMethod4107(svar1, "redrum"))) { + return "All rest and no play makes Guthix a dull boy."; + } + if (((boolean)stringMethod4107(svar1, "humperdinck")) || ((boolean)stringMethod4107(svar1, "humperdink"))) { + return "Have fun storming the castle!"; + } + if (((boolean)stringMethod4107(svar1, "i am your father"))) { + return "Nooooooooooooooooooooooooo!"; + } + if (((boolean)stringMethod4107(svar1, "i'll be back"))) { + return "Come with me if you want to live."; + } + if (((boolean)stringMethod4107(svar1, "there is no spoon"))) { + return "Then you will see, it is not the spoon that bends, it is only yourself."; + } + if (((boolean)stringMethod4107(svar1, "milton waddams"))) { + return "The ratio of people to cake is too big."; + } + if (((boolean)stringMethod4107(svar1, "you fight like a dairy farmer"))) { + return "How appropriate. You fight like a cow."; + } + if (((boolean)stringMethod4107(svar1, "finish the fight"))) { + return "They must love the smell of hero."; + } + if (((boolean)stringMethod4107(svar1, "r.i.p. runescape"))) { + return "Wanna bet?"; + } + if (((boolean)stringMethod4107(svar1, "penso, logo existo"))) { + return "Borboletas salpicadas de goiabada..."; + } + if (((boolean)stringMethod4107(svar1, "le temps passe"))) { + return "L'\u0153uf dur."; + } + if (((boolean)stringMethod4107(svar1, "paul"))) { + return "Rargh, I'm a lava monster!"; + } + if (((boolean)stringMethod4107(svar1, "andrew"))) { + return "Cabbage."; + } + if (((boolean)stringMethod4107(svar1, "sevga"))) { + return "Marmaros had a close encounter with a prayer-eating behemoth."; + } + return arg0; +} diff --git a/dumps/scripts/2447.cs2 b/dumps/scripts/2447.cs2 new file mode 100644 index 000000000..b3d28dd39 --- /dev/null +++ b/dumps/scripts/2447.cs2 @@ -0,0 +1,5 @@ +void script_2447() { + setWidgetIsHidden(true, new WidgetPointer(912,44)); + setWidgetIsHidden(true, new WidgetPointer(912,2)); + return; +} diff --git a/dumps/scripts/2448.cs2 b/dumps/scripts/2448.cs2 new file mode 100644 index 000000000..a2a46c471 --- /dev/null +++ b/dumps/scripts/2448.cs2 @@ -0,0 +1,4 @@ +void script_2448() { + script_2449(1); + return; +} diff --git a/dumps/scripts/2449.cs2 b/dumps/scripts/2449.cs2 new file mode 100644 index 000000000..9d10c8f22 --- /dev/null +++ b/dumps/scripts/2449.cs2 @@ -0,0 +1,30 @@ +void script_2449(int arg0) { + int ivar1; + ivar1 = 0; + while (setWidgetRegister(new WidgetPointer(34,9), ivar1)) { + setWidgetContextMenuOption(1, "Select"); + ivar1 = add(ivar1, 1); + } + if (setWidgetRegister(new WidgetPointer(34,9), standart_config_1439)) { + setWidgetContextMenuOption(1, "Unselect"); + if (isWidgetHidden(new WidgetPointer(34,10))) { + setWidgetIsHidden(true, new WidgetPointer(34,14)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(34,14)); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0, new WidgetPointer(34,14)); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0, new WidgetPointer(34,14)); + if (((boolean)arg0)) { + if (getWidgetActualY() < cs2method2601(new WidgetPointer(34,9))) { + script_157(2228239, 2228233, subtract(getWidgetActualY(), 5), 1); + } else { + if (add(getWidgetActualY(), getWidgetActualHeight()) > add(cs2method2601(new WidgetPointer(34,9)), getWidgetActualHeight(new WidgetPointer(34,9)))) { + script_157(2228239, 2228233, add(add(subtract(getWidgetActualY(), getWidgetActualHeight(new WidgetPointer(34,9))), getWidgetActualHeight()), 5), 1); + } + } + } + } else { + setWidgetIsHidden(true, new WidgetPointer(34,14)); + } + return; +} diff --git a/dumps/scripts/245.cs2 b/dumps/scripts/245.cs2 new file mode 100644 index 000000000..cd3b81e7f --- /dev/null +++ b/dumps/scripts/245.cs2 @@ -0,0 +1,4 @@ +void script_245() { + script_246(); + return; +} diff --git a/dumps/scripts/2450.cs2 b/dumps/scripts/2450.cs2 new file mode 100644 index 000000000..8591ca2f1 --- /dev/null +++ b/dumps/scripts/2450.cs2 @@ -0,0 +1,46 @@ +void script_2450(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + ivar3 = 0; + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetIsHidden(true, new WidgetPointer(34,14)); + setWidgetIsHidden(false, new WidgetPointer(34,10)); + ivar4 = getWidgetActualHeight(); + setWidgetPosition(getWidgetActualX(), arg2, 0, 0, new WidgetPointer(34,10)); + setWidgetSize(getWidgetActualWidth(), ivar4, 0, 0, new WidgetPointer(34,10)); + ivar3 = add(arg2, divide(ivar4, 2)); + } + ivar5 = getWidgetActualY(new WidgetPointer(34,11)); + ivar6 = add(ivar5, getWidgetActualHeight(new WidgetPointer(34,11))); + if ((ivar3 >= ivar5) && (ivar3 <= ivar6)) { + setWidgetSprite(1846, new WidgetPointer(34,8)); + } else { + setWidgetSprite(1845, new WidgetPointer(34,8)); + } + ivar7 = 0; + ivar8 = getWidgetActualY(new WidgetPointer(34,9)); + ivar9 = add(ivar8, ivar4); + ivar10 = add(ivar8, getWidgetActualHeight(new WidgetPointer(34,9))); + ivar11 = subtract(ivar10, ivar4); + if ((ivar3 >= ivar8) && (ivar3 <= ivar9)) { + ivar7 = -4; + } else if ((ivar3 >= ivar11) && (ivar3 <= ivar10)) { + ivar7 = 4; + } else { + globalint_821 = 0; + return; + } + globalint_821 = add(globalint_821, 1); + if (globalint_821 > 5) { + script_157(2228239, 2228233, add(cs2method2601(new WidgetPointer(34,9)), ivar7), 1); + } + return; +} diff --git a/dumps/scripts/2451.cs2 b/dumps/scripts/2451.cs2 new file mode 100644 index 000000000..f5e54870b --- /dev/null +++ b/dumps/scripts/2451.cs2 @@ -0,0 +1,10 @@ +void script_2451(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(34,10)); + setWidgetSprite(1845, new WidgetPointer(34,8)); + globalint_821 = 0; + script_2449(0); + if (arg0 != -1) { + setWidgetIsHidden(false, new WidgetPointer(34,44)); + } + return; +} diff --git a/dumps/scripts/2452.cs2 b/dumps/scripts/2452.cs2 new file mode 100644 index 000000000..d223e0ef9 --- /dev/null +++ b/dumps/scripts/2452.cs2 @@ -0,0 +1,96 @@ +string script_2452(int arg0) { + string svar0; + svar0 = ""; + switch (arg0) { + case 0: + svar0 = globalstring_149; + break; + case 1: + svar0 = globalstring_150; + break; + case 2: + svar0 = globalstring_151; + break; + case 3: + svar0 = globalstring_152; + break; + case 4: + svar0 = globalstring_153; + break; + case 5: + svar0 = globalstring_154; + break; + case 6: + svar0 = globalstring_155; + break; + case 7: + svar0 = globalstring_156; + break; + case 8: + svar0 = globalstring_157; + break; + case 9: + svar0 = globalstring_158; + break; + case 10: + svar0 = globalstring_159; + break; + case 11: + svar0 = globalstring_160; + break; + case 12: + svar0 = globalstring_161; + break; + case 13: + svar0 = globalstring_162; + break; + case 14: + svar0 = globalstring_163; + break; + case 15: + svar0 = globalstring_164; + break; + case 16: + svar0 = globalstring_165; + break; + case 17: + svar0 = globalstring_166; + break; + case 18: + svar0 = globalstring_167; + break; + case 19: + svar0 = globalstring_168; + break; + case 20: + svar0 = globalstring_169; + break; + case 21: + svar0 = globalstring_170; + break; + case 22: + svar0 = globalstring_171; + break; + case 23: + svar0 = globalstring_172; + break; + case 24: + svar0 = globalstring_173; + break; + case 25: + svar0 = globalstring_174; + break; + case 26: + svar0 = globalstring_175; + break; + case 27: + svar0 = globalstring_176; + break; + case 28: + svar0 = globalstring_177; + break; + case 29: + svar0 = globalstring_178; + } + return svar0; +} diff --git a/dumps/scripts/2453.cs2 b/dumps/scripts/2453.cs2 new file mode 100644 index 000000000..786ba7fb4 --- /dev/null +++ b/dumps/scripts/2453.cs2 @@ -0,0 +1,96 @@ +int script_2453(int arg0) { + int ivar1; + ivar1 = 16777215; + switch (arg0) { + case 0: + ivar1 = script_2454(bitconfig_6316); + break; + case 1: + ivar1 = script_2454(bitconfig_6317); + break; + case 2: + ivar1 = script_2454(bitconfig_6318); + break; + case 3: + ivar1 = script_2454(bitconfig_6319); + break; + case 4: + ivar1 = script_2454(bitconfig_6320); + break; + case 5: + ivar1 = script_2454(bitconfig_6321); + break; + case 6: + ivar1 = script_2454(bitconfig_6322); + break; + case 7: + ivar1 = script_2454(bitconfig_6323); + break; + case 8: + ivar1 = script_2454(bitconfig_6324); + break; + case 9: + ivar1 = script_2454(bitconfig_6325); + break; + case 10: + ivar1 = script_2454(bitconfig_6326); + break; + case 11: + ivar1 = script_2454(bitconfig_6327); + break; + case 12: + ivar1 = script_2454(bitconfig_6328); + break; + case 13: + ivar1 = script_2454(bitconfig_6329); + break; + case 14: + ivar1 = script_2454(bitconfig_6330); + break; + case 15: + ivar1 = script_2454(bitconfig_6331); + break; + case 16: + ivar1 = script_2454(bitconfig_6332); + break; + case 17: + ivar1 = script_2454(bitconfig_6333); + break; + case 18: + ivar1 = script_2454(bitconfig_6334); + break; + case 19: + ivar1 = script_2454(bitconfig_6335); + break; + case 20: + ivar1 = script_2454(bitconfig_6336); + break; + case 21: + ivar1 = script_2454(bitconfig_6337); + break; + case 22: + ivar1 = script_2454(bitconfig_6338); + break; + case 23: + ivar1 = script_2454(bitconfig_6339); + break; + case 24: + ivar1 = script_2454(bitconfig_6340); + break; + case 25: + ivar1 = script_2454(bitconfig_6341); + break; + case 26: + ivar1 = script_2454(bitconfig_6342); + break; + case 27: + ivar1 = script_2454(bitconfig_6343); + break; + case 28: + ivar1 = script_2454(bitconfig_6344); + break; + case 29: + ivar1 = script_2454(bitconfig_6345); + } + return ivar1; +} diff --git a/dumps/scripts/2454.cs2 b/dumps/scripts/2454.cs2 new file mode 100644 index 000000000..2ecd6a496 --- /dev/null +++ b/dumps/scripts/2454.cs2 @@ -0,0 +1,18 @@ +int script_2454(int arg0) { + int ivar1; + ivar1 = 16777215; + switch (arg0) { + case 0: + ivar1 = 16777215; + break; + case 1: + ivar1 = 65280; + break; + case 2: + ivar1 = 14064640; + break; + case 3: + ivar1 = 16727871; + } + return ivar1; +} diff --git a/dumps/scripts/2455.cs2 b/dumps/scripts/2455.cs2 new file mode 100644 index 000000000..24f5d9110 --- /dev/null +++ b/dumps/scripts/2455.cs2 @@ -0,0 +1,6 @@ +void script_2455(int arg0,int arg1) { + if (isWidgetHidden(new WidgetPointer(34,16)) && isWidgetHidden(new WidgetPointer(34,44))) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2456.cs2 b/dumps/scripts/2456.cs2 new file mode 100644 index 000000000..cc830f11b --- /dev/null +++ b/dumps/scripts/2456.cs2 @@ -0,0 +1,4 @@ +void script_2456() { + setWidgetIsHidden(true, new WidgetPointer(34,16)); + return; +} diff --git a/dumps/scripts/2457.cs2 b/dumps/scripts/2457.cs2 new file mode 100644 index 000000000..00eeee77b --- /dev/null +++ b/dumps/scripts/2457.cs2 @@ -0,0 +1,16 @@ +void script_2457(int arg0,int arg1) { + if (isWidgetOpen(new WidgetPointer(746,87))) { + return; + } + if (isWidgetOpen(new WidgetPointer(script_8(95)))) { + return; + } + globalint_10 = 0; + script_1304(arg0); + if (globalint_168 == arg0) { + globalint_168 = -1; + } else { + globalint_168 = arg0; + } + return; +} diff --git a/dumps/scripts/2458.cs2 b/dumps/scripts/2458.cs2 new file mode 100644 index 000000000..a3dd6fdc6 --- /dev/null +++ b/dumps/scripts/2458.cs2 @@ -0,0 +1,74 @@ +int script_2458(int arg0) { + if (getDisplayMode() >= 2) { + switch (arg0) { + case 0: + return 48889895; + case 1: + return 48889896; + case 2: + return 48889897; + case 3: + return 48889898; + case 4: + return 48889899; + case 5: + return 48889900; + case 6: + return 48889901; + case 7: + return 48889902; + case 8: + return 48889903; + case 9: + return 48889904; + case 10: + return 48889905; + case 11: + return 48889906; + case 12: + return 48889907; + case 13: + return 48889908; + case 14: + return 48889909; + case 15: + return 48889910; + } + } else { + switch (arg0) { + case 0: + return 35913857; + case 1: + return 35913858; + case 2: + return 35913859; + case 3: + return 35913860; + case 4: + return 35913861; + case 5: + return 35913862; + case 6: + return 35913863; + case 7: + return 35913864; + case 8: + return 35913827; + case 9: + return 35913828; + case 10: + return 35913829; + case 11: + return 35913830; + case 12: + return 35913831; + case 13: + return 35913832; + case 14: + return 35913833; + case 15: + return 35913834; + } + } + return -1; +} diff --git a/dumps/scripts/2459.cs2 b/dumps/scripts/2459.cs2 new file mode 100644 index 000000000..febafecbb --- /dev/null +++ b/dumps/scripts/2459.cs2 @@ -0,0 +1,74 @@ +int script_2459(int arg0) { + if (getDisplayMode() >= 2) { + switch (arg0) { + case 0: + return 48889911; + case 1: + return 48889912; + case 2: + return 48889913; + case 3: + return 48889914; + case 4: + return 48889915; + case 5: + return 48889916; + case 6: + return 48889917; + case 7: + return 48889918; + case 8: + return 48889919; + case 9: + return 48889920; + case 10: + return 48889921; + case 11: + return 48889922; + case 12: + return 48889923; + case 13: + return 48889924; + case 14: + return 48889925; + case 15: + return 48889926; + } + } else { + switch (arg0) { + case 0: + return 35913848; + case 1: + return 35913849; + case 2: + return 35913850; + case 3: + return 35913851; + case 4: + return 35913852; + case 5: + return 35913853; + case 6: + return 35913854; + case 7: + return 35913855; + case 8: + return 35913801; + case 9: + return 35913802; + case 10: + return 35913803; + case 11: + return 35913804; + case 12: + return 35913805; + case 13: + return 35913806; + case 14: + return 35913807; + case 15: + return 35913808; + } + } + return -1; +} diff --git a/dumps/scripts/246.cs2 b/dumps/scripts/246.cs2 new file mode 100644 index 000000000..0cf06bf72 --- /dev/null +++ b/dumps/scripts/246.cs2 @@ -0,0 +1,13 @@ +void script_246() { + setScriptCallOnKeyPress(247, -2147483640, false, "iz", new WidgetPointer(594,53)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + globalint_6 = 0; + globalint_11 = 1; + if (isWidgetHidden(new WidgetPointer(752,3))) { + setWidgetIsHidden(true, new WidgetPointer(752,3)); + setWidgetIsHidden(false, new WidgetPointer(752,8)); + globalint_5 = 0; + globalstring_22 = ""; + } + return; +} diff --git a/dumps/scripts/2460.cs2 b/dumps/scripts/2460.cs2 new file mode 100644 index 000000000..1eb965600 --- /dev/null +++ b/dumps/scripts/2460.cs2 @@ -0,0 +1,4 @@ +void script_2460(int arg0) { + script_2308(arg0, 1); + return; +} diff --git a/dumps/scripts/2461.cs2 b/dumps/scripts/2461.cs2 new file mode 100644 index 000000000..4e3abaff4 --- /dev/null +++ b/dumps/scripts/2461.cs2 @@ -0,0 +1,4 @@ +void script_2461(int arg0) { + script_2309(arg0, 0); + return; +} diff --git a/dumps/scripts/2462.cs2 b/dumps/scripts/2462.cs2 new file mode 100644 index 000000000..4ccea7274 --- /dev/null +++ b/dumps/scripts/2462.cs2 @@ -0,0 +1,8 @@ +void script_2462(int arg0,int arg1) { + if (((boolean)arg1)) { + setWidgetSprite(1837, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1835, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2463.cs2 b/dumps/scripts/2463.cs2 new file mode 100644 index 000000000..728098c36 --- /dev/null +++ b/dumps/scripts/2463.cs2 @@ -0,0 +1,17 @@ +void script_2463(string arg0,string arg1) { + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), arg0); + globalint_5 = 13; + script_1564(arg1); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + setScriptCallOnWindowPaneRefresh(138, "", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/2464.cs2 b/dumps/scripts/2464.cs2 new file mode 100644 index 000000000..cb36d2fd6 --- /dev/null +++ b/dumps/scripts/2464.cs2 @@ -0,0 +1,22 @@ +void script_2464(int arg0,int arg1) { + if (arg0 > subtract(getClientCycle(), 5)) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + if (((boolean)script_2465(script_1305()))) { + if (getDisplayMode() >= 2) { + script_71(-1); + return; + } + if (((boolean)script_2465(4))) { + script_71(4); + } else if (((boolean)script_2465(9))) { + script_71(9); + } else { + if (((boolean)script_2465(12)) && (standart_config_281 > 3)) { + script_71(12); + } + } + } + return; +} diff --git a/dumps/scripts/2465.cs2 b/dumps/scripts/2465.cs2 new file mode 100644 index 000000000..9fde24f4f --- /dev/null +++ b/dumps/scripts/2465.cs2 @@ -0,0 +1,6 @@ +int script_2465(int arg0) { + if (isWidgetOpen(new WidgetPointer(script_8(arg0)))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/2466.cs2 b/dumps/scripts/2466.cs2 new file mode 100644 index 000000000..4ff4516e2 --- /dev/null +++ b/dumps/scripts/2466.cs2 @@ -0,0 +1,24 @@ +cs2func_script_2466_struct(2,0,0) script_2466(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 6); + cs2method5405(1, 6); + cs2method5406(0, 0, 68048581, 710, 67999435, 605, 0); + cs2method5406(1, 0, 67966671, 258, 67917522, 258, 0); + cs2method5406(0, 1, 67901139, 725, 67802842, 875, 0); + cs2method5406(1, 1, 67802841, 474, 67753692, 474, 0); + script_1899(0, 200, 300); + cs2method5406(0, 2, 67753692, 925, 67655393, 915, 0); + cs2method5406(1, 2, 67606243, 530, 67540709, 530, 0); + script_1899(1, 300, 200); + cs2method5406(0, 3, 67524326, 780, 67475176, 700, 0); + cs2method5406(1, 3, 67491561, 444, 67442412, 355, 0); + script_1899(2, 200, 200); + cs2method5406(0, 4, 67393263, 665, 67393268, 645, 0); + cs2method5406(1, 4, 67458806, 190, 67475194, 160, 0); + script_1899(3, 200, 200); + cs2method5406(0, 5, 67475195, 650, 67524350, 640, 0); + cs2method5406(1, 5, 67540734, 70, 67589888, 15, 0); + script_1899(4, 200, 200); + } + return newstruct cs2func_script_2466_struct(67671776, 1250324); +} diff --git a/dumps/scripts/2467.cs2 b/dumps/scripts/2467.cs2 new file mode 100644 index 000000000..a619afec2 --- /dev/null +++ b/dumps/scripts/2467.cs2 @@ -0,0 +1,4 @@ +void script_2467(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,string arg8) { + script_2468(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + return; +} diff --git a/dumps/scripts/2468.cs2 b/dumps/scripts/2468.cs2 new file mode 100644 index 000000000..a4a7d8c4b --- /dev/null +++ b/dumps/scripts/2468.cs2 @@ -0,0 +1,53 @@ +void script_2468(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,string arg8) { + int ivar8; + int ivar9; + int ivar10; + int ivar11; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + if (globalint_1 < add(getClientCycle(), 25)) { + if (globalint_1 < getClientCycle()) { + globalint_1 = getClientCycle(); + } + globalint_1 = add(globalint_1, 2); + return; + } + globalint_1 = add(add(getClientCycle(), 25), 10); + if (globalint_2 != 1) { + ivar10 = add(getMaxLineWidth(2147483647, arg7, arg8), 8); + ivar11 = getLineCount(ivar10, arg7, arg8); + if (ivar11 > 1) { + ivar11 = multiply(ivar11, 15); + } else { + ivar11 = 17; + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar8 = add(add(add(getWidgetActualX(new WidgetPointer(arg4)), getWidgetActualX()), arg2), 3); + ivar9 = subtract(subtract(add(add(getWidgetActualY(new WidgetPointer(arg4)), getWidgetActualY()), arg3), ivar11), cs2method2601(new WidgetPointer(arg4))); + } else { + return; + } + if (ivar8 < 0) { + ivar8 = 0; + } else { + if (add(ivar8, ivar10) > add(getWidgetActualX(new WidgetPointer(arg4)), getWidgetActualWidth(new WidgetPointer(arg4)))) { + ivar8 = subtract(ivar8, subtract(add(ivar8, ivar10), add(getWidgetActualX(new WidgetPointer(arg4)), getWidgetActualWidth(new WidgetPointer(arg4))))); + } + } + if (ivar9 < 0) { + ivar9 = 0; + } else { + if (add(ivar9, ivar11) > add(getWidgetActualY(new WidgetPointer(arg4)), getWidgetActualHeight(new WidgetPointer(arg4)))) { + ivar9 = subtract(ivar9, subtract(add(ivar9, ivar11), add(getWidgetActualY(new WidgetPointer(arg4)), getWidgetActualHeight(new WidgetPointer(arg4))))); + } + } + setWidgetIsHidden(false, new WidgetPointer(arg5)); + setWidgetSize(ivar10, ivar11, 0, 0, new WidgetPointer(arg5)); + setWidgetPosition(ivar8, ivar9, 0, 0, new WidgetPointer(arg5)); + setWidgetText(new WidgetPointer(arg6), arg8); + globalint_2 = 1; + } + return; +} diff --git a/dumps/scripts/2469.cs2 b/dumps/scripts/2469.cs2 new file mode 100644 index 000000000..5bdf565a2 --- /dev/null +++ b/dumps/scripts/2469.cs2 @@ -0,0 +1,4 @@ +void script_2469(int arg0,int arg1) { + script_2470(arg0, arg1); + return; +} diff --git a/dumps/scripts/247.cs2 b/dumps/scripts/247.cs2 new file mode 100644 index 000000000..76cc3876f --- /dev/null +++ b/dumps/scripts/247.cs2 @@ -0,0 +1,4 @@ +void script_247(int arg0,int arg1) { + globalstring_24 = script_74(2, arg0, arg1, globalstring_24); + return; +} diff --git a/dumps/scripts/2470.cs2 b/dumps/scripts/2470.cs2 new file mode 100644 index 000000000..09f49e33d --- /dev/null +++ b/dumps/scripts/2470.cs2 @@ -0,0 +1,7 @@ +void script_2470(int arg0,int arg1) { + setWidgetText(new WidgetPointer(arg1), ""); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + globalint_2 = 0; + globalint_1 = 0; + return; +} diff --git a/dumps/scripts/2471.cs2 b/dumps/scripts/2471.cs2 new file mode 100644 index 000000000..025353290 --- /dev/null +++ b/dumps/scripts/2471.cs2 @@ -0,0 +1,6 @@ +void script_2471() { + setWidgetIsHidden(true, cs2method_3408(110, 73, 1092, standart_config_1174)); + setWidgetSprite(1244, new WidgetPointer(747,3)); + setWidgetIsHidden(true, new WidgetPointer(747,8)); + return; +} diff --git a/dumps/scripts/2472.cs2 b/dumps/scripts/2472.cs2 new file mode 100644 index 000000000..dfa42b4ea --- /dev/null +++ b/dumps/scripts/2472.cs2 @@ -0,0 +1,83 @@ +void script_2472(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + if (arg7 == -1) { + if (arg6 == -1) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + setWidgetPosition(subtract(getWidgetActualX(cs2method_3408(105, 73, arg8, 0)), 10), subtract(getWidgetActualY(cs2method_3408(105, 73, arg8, 0)), 10), 0, 0, new WidgetPointer(arg4)); + return; + } + arg7 = 20210; + } else { + if (arg6 == -1) { + arg6 = 20210; + } + } + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg5)); + ivar9 = getWidgetActualX(cs2method_3408(105, 73, arg8, getItemHashmapData(arg6, 359))); + ivar10 = getWidgetActualX(cs2method_3408(105, 73, arg8, getItemHashmapData(arg7, 359))); + ivar11 = 0; + ivar12 = -1; + if (ivar9 > ivar10) { + ivar12 = arg7; + arg7 = arg6; + arg6 = ivar12; + ivar11 = ivar10; + ivar10 = ivar9; + ivar9 = ivar11; + } + ivar13 = getWidgetActualY(cs2method_3408(105, 73, arg8, getItemHashmapData(arg6, 359))); + ivar14 = getWidgetActualY(cs2method_3408(105, 73, arg8, getItemHashmapData(arg7, 359))); + ivar15 = subtract(ivar10, ivar9); + ivar16 = 0; + setWidgetPosition(subtract(ivar9, 10), subtract(ivar13, 10), 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(subtract(ivar10, 10), subtract(ivar14, 10), 0, 0, new WidgetPointer(arg2)); + if (setWidgetRegister(new WidgetPointer(arg1))) { + setWidgetStringNode(718, script_4126(script_718(getItemHashmapData(arg6, 359)))); + setWidgetRGB(new Color(script_718(getItemHashmapData(arg6, 359)))); + } + if (setWidgetRegister(new WidgetPointer(arg3))) { + setWidgetStringNode(718, script_4126(script_718(getItemHashmapData(arg7, 359)))); + setWidgetRGB(new Color(script_718(getItemHashmapData(arg7, 359)))); + } + ivar17 = 0; + ivar18 = 0; + ivar19 = add(getItemHashmapData(arg6, 358), getItemHashmapData(arg7, 358)); + if (ivar13 < ivar14) { + ivar16 = subtract(ivar14, ivar13); + setWidgetPosition(ivar9, ivar13, 0, 0, new WidgetPointer(arg5)); + cs2method2124(0, new WidgetPointer(arg5)); + ivar11 = 1; + } else { + ivar16 = subtract(ivar13, ivar14); + setWidgetPosition(ivar9, ivar14, 0, 0, new WidgetPointer(arg5)); + cs2method2124(1, new WidgetPointer(arg5)); + ivar11 = -1; + } + setWidgetSize(ivar15, ivar16, 0, 0, new WidgetPointer(arg5)); + if (arg6 == 20210) { + ivar17 = subtract(add(ivar9, divide(multiply(ivar15, getItemHashmapData(arg7, 358)), multiply(2, ivar19))), 10); + ivar18 = subtract(add(ivar13, multiply(ivar11, divide(multiply(ivar16, getItemHashmapData(arg7, 358)), multiply(2, ivar19)))), 10); + } else if (arg7 == 20210) { + ivar17 = subtract(add(ivar9, divide(multiply(ivar15, add(multiply(2, getItemHashmapData(arg7, 358)), getItemHashmapData(arg6, 358))), multiply(2, ivar19))), 10); + ivar18 = subtract(add(ivar13, multiply(ivar11, divide(multiply(ivar16, add(multiply(2, getItemHashmapData(arg7, 358)), getItemHashmapData(arg6, 358))), multiply(2, ivar19)))), 10); + } else { + ivar17 = subtract(add(ivar9, divide(multiply(ivar15, getItemHashmapData(arg7, 358)), ivar19)), 10); + ivar18 = subtract(add(ivar13, multiply(ivar11, divide(multiply(ivar16, getItemHashmapData(arg7, 358)), ivar19))), 10); + } + setWidgetPosition(ivar17, ivar18, 0, 0, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/2473.cs2 b/dumps/scripts/2473.cs2 new file mode 100644 index 000000000..c208e1226 --- /dev/null +++ b/dumps/scripts/2473.cs2 @@ -0,0 +1,6 @@ +void script_2473(int arg0,int arg1,int arg2) { + if (standart_config_850 != -1) { + script_1163(arg0, arg1, arg2, 0, 180, getItemName(standart_config_850)); + } + return; +} diff --git a/dumps/scripts/2474.cs2 b/dumps/scripts/2474.cs2 new file mode 100644 index 000000000..331cb63cc --- /dev/null +++ b/dumps/scripts/2474.cs2 @@ -0,0 +1,6 @@ +void script_2474(int arg0,int arg1,int arg2) { + if (standart_config_855 != -1) { + script_1163(arg0, arg1, arg2, 0, 180, getItemName(standart_config_855)); + } + return; +} diff --git a/dumps/scripts/2475.cs2 b/dumps/scripts/2475.cs2 new file mode 100644 index 000000000..c79ba8cfb --- /dev/null +++ b/dumps/scripts/2475.cs2 @@ -0,0 +1,45 @@ +void script_2475(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + ivar4 = 1093; + if (IsFemale()) { + ivar4 = 3872; + } + ivar5 = 0; + ivar6 = 0; + while (ivar5 <= getCommonDefinitionSize(ivar4)) { + createExtraChild(new WidgetPointer(arg0), 4, ivar5); + if (((boolean)ivar5) || ((ivar5 >= arg2) && (ivar5 <= arg3))) { + if (((boolean)ivar5)) { + setWidgetText("No Prefix"); + } else { + setWidgetText(cs2method_3408(105, 115, ivar4, ivar5)); + } + setWidgetPosition(0, ivar6, 0, 0); + setWidgetSize(165, 17, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(2143, new WidgetPointer(-32768,3), -2147483643, "Ii"); + if (((boolean)script_2476(ivar5))) { + setWidgetRGB(new Color(17, 255, 0)); + } else { + setWidgetRGB(new Color(255, 17, 0)); + } + ivar6 = add(ivar6, 19); + } else { + setWidgetHidden(1); + } + ivar5 = add(1, ivar5); + } + if (ivar6 > getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetScrollMax(0, add(25, ivar6), new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2476.cs2 b/dumps/scripts/2476.cs2 new file mode 100644 index 000000000..72fdffec9 --- /dev/null +++ b/dumps/scripts/2476.cs2 @@ -0,0 +1,124 @@ +int script_2476(int arg0) { + switch (arg0) { + case 1: + if (standart_config_1447 < 1) { + return 0; + } + break; + case 2: + if (standart_config_1447 < cs2method_3408(105, 105, 2461, 2)) { + return 0; + } + break; + case 3: + if (standart_config_1447 < cs2method_3408(105, 105, 2461, 3)) { + return 0; + } + break; + case 4: + if (standart_config_1447 < cs2method_3408(105, 105, 2461, 4)) { + return 0; + } + break; + case 5: + if (isBitFlagged(standart_config_2232, 0)) { + return 0; + } + break; + case 6: + if (isBitFlagged(standart_config_2232, 1)) { + return 0; + } + break; + case 7: + if (isBitFlagged(standart_config_2232, 2)) { + return 0; + } + break; + case 8: + if (isBitFlagged(standart_config_2232, 3)) { + return 0; + } + break; + case 9: + if (isBitFlagged(standart_config_2232, 4)) { + return 0; + } + break; + case 10: + if (isBitFlagged(standart_config_2232, 5)) { + return 0; + } + break; + case 11: + if (isBitFlagged(standart_config_2232, 6)) { + return 0; + } + break; + case 12: + if (isBitFlagged(standart_config_2232, 7)) { + return 0; + } + break; + case 13: + if (isBitFlagged(standart_config_2232, 8)) { + return 0; + } + break; + case 14: + if (isBitFlagged(standart_config_2232, 9)) { + return 0; + } + break; + case 15: + if (isBitFlagged(standart_config_2232, 10)) { + return 0; + } + break; + case 16: + if (isBitFlagged(standart_config_2232, 11)) { + return 0; + } + break; + case 17: + if (isBitFlagged(standart_config_2232, 12)) { + return 0; + } + break; + case 18: + if (isBitFlagged(standart_config_2232, 13)) { + return 0; + } + break; + case 19: + if (isBitFlagged(standart_config_2232, 14)) { + return 0; + } + break; + case 20: + if (isBitFlagged(standart_config_2232, 15)) { + return 0; + } + break; + case 21: + if (((boolean)bitconfig_9809)) { + return 0; + } + break; + case 22: + if (((boolean)bitconfig_9809)) { + return 0; + } + break; + case 23: + if (((boolean)bitconfig_9809)) { + return 0; + } + break; + case 24: + if (((boolean)bitconfig_9809)) { + return 0; + } + } + return 1; +} diff --git a/dumps/scripts/2477.cs2 b/dumps/scripts/2477.cs2 new file mode 100644 index 000000000..19de5a7f8 --- /dev/null +++ b/dumps/scripts/2477.cs2 @@ -0,0 +1,36 @@ +void script_2477() { + if (bitconfig_6348 == 28) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(854,1)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(854,1)); + } + if (bitconfig_6348 < 30) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(854,2)); + } else if (bitconfig_6348 == 30) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(854,2)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(854,2)); + } + if (bitconfig_6348 < 32) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(854,3)); + } else if (bitconfig_6348 == 32) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(854,3)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(854,3)); + } + if (bitconfig_6348 < 34) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(854,4)); + } else if (bitconfig_6348 == 34) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(854,4)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(854,4)); + } + if (bitconfig_6348 < 36) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(854,5)); + } else if (bitconfig_6348 == 36) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(854,5)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(854,5)); + } + return; +} diff --git a/dumps/scripts/2478.cs2 b/dumps/scripts/2478.cs2 new file mode 100644 index 000000000..04a462ff9 --- /dev/null +++ b/dumps/scripts/2478.cs2 @@ -0,0 +1,47 @@ +void script_2478(int arg0) { + switch (arg0) { + case 55967745: + if (bitconfig_6348 == 28) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + } + break; + case 55967746: + if (bitconfig_6348 < 30) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + } else if (bitconfig_6348 == 30) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + } + break; + case 55967747: + if (bitconfig_6348 < 32) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + } else if (bitconfig_6348 == 32) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + } + break; + case 55967748: + if (bitconfig_6348 < 34) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + } else if (bitconfig_6348 == 34) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + } + break; + case 55967749: + if (bitconfig_6348 < 36) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + } else if (bitconfig_6348 == 36) { + setWidgetRGB(new Color(255, 255, 51), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2479.cs2 b/dumps/scripts/2479.cs2 new file mode 100644 index 000000000..c2a6c5f0f --- /dev/null +++ b/dumps/scripts/2479.cs2 @@ -0,0 +1,10 @@ +void script_2479() { + if (globalint_825 < 1) { + globalint_825 = 6; + } + if (globalint_825 > 0) { + globalint_825 = subtract(globalint_825, 1); + } + setWidgetText(new WidgetPointer(37,35), intToStr(globalint_825)); + return; +} diff --git a/dumps/scripts/248.cs2 b/dumps/scripts/248.cs2 new file mode 100644 index 000000000..247d560ea --- /dev/null +++ b/dumps/scripts/248.cs2 @@ -0,0 +1,8 @@ +void script_248(int arg0) { + if (strLength(globalstring_24) > 0) { + cs2method5002(arg0, globalint_6, globalstring_24, ""); + } + script_675(); + globalint_11 = 0; + return; +} diff --git a/dumps/scripts/2480.cs2 b/dumps/scripts/2480.cs2 new file mode 100644 index 000000000..3fbcf8d68 --- /dev/null +++ b/dumps/scripts/2480.cs2 @@ -0,0 +1,61 @@ +void script_2480() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar2 = divide(subtract(getWidgetActualWidth(new WidgetPointer(41,15)), multiply(36, 10)), subtract(10, 1)); + ivar3 = divide(subtract(getWidgetActualHeight(new WidgetPointer(41,15)), 128), 3); + deleteAllExtraChilds(new WidgetPointer(41,15)); + deleteAllExtraChilds(new WidgetPointer(881,0)); + while (((boolean)ivar4)) { + if (cs2method_3408(105, 79, globalint_875, ivar0) != 11760) { + createExtraChild(new WidgetPointer(41,15), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar2), mod(ivar0, 10)), multiply(divide(ivar0, 10), add(32, ivar3)), 0, 0); + setItemOnWidgetMethod1200(cs2method_3408(105, 79, globalint_875, ivar0), -1); + cs2method1305("" + getItemName(cs2method_3408(105, 79, globalint_875, ivar0))); + setWidgetContextMenuOption(1, "Value"); + setWidgetContextMenuOption(2, "Buy 1"); + setWidgetContextMenuOption(3, "Examine"); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + createExtraChild(new WidgetPointer(881,0), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(42, mod(ivar0, 4)), multiply(divide(ivar0, 4), 42), 0, 0); + setItemOnWidgetMethod1200(cs2method_3408(105, 79, globalint_875, ivar0), getItemAmtInContainer(93, cs2method_3408(105, 79, globalint_875, ivar0))); + cs2method1305("" + getItemName(cs2method_3408(105, 79, globalint_875, ivar0))); + setWidgetContextMenuOption(1, "Value"); + setWidgetContextMenuOption(2, "Sell 1"); + setWidgetContextMenuOption(3, "Sell X"); + setWidgetContextMenuOption(4, "Examine"); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + ivar0 = add(ivar0, 1); + } else { + ivar4 = 1; + } + } + ivar1 = ivar0; + ivar0 = 0; + ivar4 = 0; + while (((boolean)ivar4)) { + if (cs2method_3408(105, 79, globalint_875, ivar0) != 11760) { + createExtraChild(new WidgetPointer(41,15), 5, ivar1); + setWidgetSize(12, 6, 0, 0); + setWidgetPosition(multiply(add(36, ivar2), mod(ivar0, 10)), multiply(divide(ivar0, 10), add(32, ivar3)), 0, 0); + setWidgetSprite(1066); + } else { + ivar4 = 1; + } + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + } + setWidgetText(new WidgetPointer(41,17), script_46(standart_config_1448, ",")); + return; +} diff --git a/dumps/scripts/2481.cs2 b/dumps/scripts/2481.cs2 new file mode 100644 index 000000000..1df5fd676 --- /dev/null +++ b/dumps/scripts/2481.cs2 @@ -0,0 +1,14 @@ +void script_2481() { + cs2method2308(14, 15, new WidgetPointer(855,17)); + cs2method2308(16, 17, new WidgetPointer(855,33)); + cs2method2308(18, 19, new WidgetPointer(855,19)); + cs2method2308(20, 21, new WidgetPointer(855,9)); + cs2method2308(26, 27, new WidgetPointer(855,11)); + cs2method2308(22, 23, new WidgetPointer(855,13)); + cs2method2308(24, 25, new WidgetPointer(855,15)); + cs2method2308(28, 29, new WidgetPointer(855,7)); + cs2method2308(30, 31, new WidgetPointer(855,2)); + cs2method2308(32, 33, new WidgetPointer(855,3)); + cs2method2308(34, 35, new WidgetPointer(855,1)); + return; +} diff --git a/dumps/scripts/2482.cs2 b/dumps/scripts/2482.cs2 new file mode 100644 index 000000000..80b6d6d99 --- /dev/null +++ b/dumps/scripts/2482.cs2 @@ -0,0 +1,4 @@ +void script_2482() { + script_2484(); + return; +} diff --git a/dumps/scripts/2483.cs2 b/dumps/scripts/2483.cs2 new file mode 100644 index 000000000..94f54ff92 --- /dev/null +++ b/dumps/scripts/2483.cs2 @@ -0,0 +1,4 @@ +void script_2483() { + script_2484(); + return; +} diff --git a/dumps/scripts/2484.cs2 b/dumps/scripts/2484.cs2 new file mode 100644 index 000000000..1e3791576 --- /dev/null +++ b/dumps/scripts/2484.cs2 @@ -0,0 +1,44 @@ +void script_2484() { + int ivar0; + ivar0 = 1; + globalint_838 = bitconfig_6347; + while ((ivar0 <= 4) && (((int)cs2method_3408(105, 73, 2383, ivar0)) != 42926100)) { + if (ivar0 <= globalint_838) { + setWidgetRGB(new Color(225, 152, 31), cs2method_3408(105, 73, 2384, ivar0)); + setWidgetContextMenuOption(1, cs2method_3408(105, 73, 2383, ivar0), "Select"); + switch (ivar0) { + case 1: + setWidgetText(cs2method_3408(105, 73, 2384, ivar0), "Conflict"); + break; + case 2: + setWidgetText(cs2method_3408(105, 73, 2384, ivar0), "Siege"); + break; + case 3: + setWidgetText(cs2method_3408(105, 73, 2384, ivar0), "Hoard"); + break; + case 4: + setWidgetText(cs2method_3408(105, 73, 2384, ivar0), "Rescue"); + } + } else { + setWidgetRGB(new Color(153, 102, 0), cs2method_3408(105, 73, 2384, ivar0)); + setWidgetContextMenuOption(1, cs2method_3408(105, 73, 2383, ivar0), "Select"); + switch (ivar0) { + case 2: + setWidgetText(cs2method_3408(105, 73, 2384, ivar0), "Siege" + "
" + "- Locked"); + break; + case 3: + setWidgetText(cs2method_3408(105, 73, 2384, ivar0), "Hoard" + "
" + "- Locked"); + break; + case 4: + setWidgetText(cs2method_3408(105, 73, 2384, ivar0), "Rescue" + "
" + "- Locked"); + } + } + ivar0 = add(ivar0, 1); + } + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(655,42)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(655,31)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(655,38)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(655,26)); + script_2486(); + return; +} diff --git a/dumps/scripts/2485.cs2 b/dumps/scripts/2485.cs2 new file mode 100644 index 000000000..54e5e8650 --- /dev/null +++ b/dumps/scripts/2485.cs2 @@ -0,0 +1,4 @@ +void script_2485() { + script_2486(); + return; +} diff --git a/dumps/scripts/2486.cs2 b/dumps/scripts/2486.cs2 new file mode 100644 index 000000000..61d5cd519 --- /dev/null +++ b/dumps/scripts/2486.cs2 @@ -0,0 +1,19 @@ +void script_2486() { + if (globalint_882 != -1) { + setWidgetText(new WidgetPointer(655,42), "Players: " + intToStr(globalint_882)); + } + if (globalint_887 != -1) { + setWidgetText(new WidgetPointer(655,31), "Players: " + intToStr(globalint_887)); + } + if (globalint_892 != -1) { + setWidgetText(new WidgetPointer(655,38), "Players: " + intToStr(globalint_892)); + } + if (globalint_897 != -1) { + setWidgetText(new WidgetPointer(655,26), "Players: " + intToStr(globalint_897)); + } + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(655,42)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(655,31)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(655,38)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(655,26)); + return; +} diff --git a/dumps/scripts/2487.cs2 b/dumps/scripts/2487.cs2 new file mode 100644 index 000000000..3394bd316 --- /dev/null +++ b/dumps/scripts/2487.cs2 @@ -0,0 +1,16 @@ +void script_2487(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(844,10)); + setWidgetIsHidden(true, new WidgetPointer(844,11)); + setWidgetSprite(1421, new WidgetPointer(844,51)); + setWidgetSprite(1421, new WidgetPointer(844,49)); + switch (arg0) { + case 55312435: + setWidgetIsHidden(false, new WidgetPointer(844,10)); + setWidgetSprite(1420, new WidgetPointer(844,51)); + break; + case 55312433: + setWidgetIsHidden(false, new WidgetPointer(844,11)); + setWidgetSprite(1420, new WidgetPointer(844,49)); + } + return; +} diff --git a/dumps/scripts/2488.cs2 b/dumps/scripts/2488.cs2 new file mode 100644 index 000000000..68108ce8a --- /dev/null +++ b/dumps/scripts/2488.cs2 @@ -0,0 +1,10 @@ +void script_2488() { + setWidgetIsHidden(false, new WidgetPointer(844,10)); + setWidgetIsHidden(true, new WidgetPointer(844,11)); + setWidgetSprite(1420, new WidgetPointer(844,51)); + setWidgetSprite(1421, new WidgetPointer(844,49)); + setItemOnWidgetMethod2205(436, 1, new WidgetPointer(844,52)); + setItemOnWidgetMethod2205(1511, 1, new WidgetPointer(844,50)); + script_2490(); + return; +} diff --git a/dumps/scripts/2489.cs2 b/dumps/scripts/2489.cs2 new file mode 100644 index 000000000..a0500b86d --- /dev/null +++ b/dumps/scripts/2489.cs2 @@ -0,0 +1,4 @@ +void script_2489() { + script_2490(); + return; +} diff --git a/dumps/scripts/249.cs2 b/dumps/scripts/249.cs2 new file mode 100644 index 000000000..28e1cec85 --- /dev/null +++ b/dumps/scripts/249.cs2 @@ -0,0 +1,22 @@ +void script_249() { + globalint_799 = add(globalint_799, 1); + if (globalint_799 >= 30) { + globalint_799 = 0; + if (((boolean)globalint_798)) { + globalint_798 = 0; + } else { + globalint_798 = 1; + } + } + if (((boolean)globalint_798)) { + setWidgetText(new WidgetPointer(594,53), replaceLtGt(globalstring_24) + "" + " "); + } else { + setWidgetText(new WidgetPointer(594,53), replaceLtGt(globalstring_24) + "" + "|"); + } + if (((boolean)stringMethod4107(globalstring_24, ""))) { + setWidgetRGB(new Color(187, 187, 187), new WidgetPointer(594,58)); + } else { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(594,58)); + } + return; +} diff --git a/dumps/scripts/2490.cs2 b/dumps/scripts/2490.cs2 new file mode 100644 index 000000000..5d7b811e5 --- /dev/null +++ b/dumps/scripts/2490.cs2 @@ -0,0 +1,98 @@ +void script_2490() { + if (globalint_826 < 0) { + globalint_826 = 0; + } + if (globalint_827 < 0) { + globalint_827 = 1; + } + setWidgetText(new WidgetPointer(844,47), "Charges left: " + intToStr(globalint_826)); + setItemOnWidgetMethod2205(436, 1, new WidgetPointer(844,29)); + setItemOnWidgetMethod2205(438, 1, new WidgetPointer(844,30)); + setItemOnWidgetMethod2205(440, 1, new WidgetPointer(844,31)); + setItemOnWidgetMethod2205(442, 1, new WidgetPointer(844,32)); + setItemOnWidgetMethod2205(434, 1, new WidgetPointer(844,33)); + setItemOnWidgetMethod2205(444, 1, new WidgetPointer(844,34)); + setItemOnWidgetMethod2205(447, 1, new WidgetPointer(844,35)); + setItemOnWidgetMethod2205(449, 1, new WidgetPointer(844,36)); + setItemOnWidgetMethod2205(451, 1, new WidgetPointer(844,37)); + setWidgetText(new WidgetPointer(844,38), getItemName(436)); + setWidgetText(new WidgetPointer(844,39), getItemName(438)); + setWidgetText(new WidgetPointer(844,40), getItemName(440)); + setWidgetText(new WidgetPointer(844,41), getItemName(442)); + setWidgetText(new WidgetPointer(844,42), getItemName(434)); + setWidgetText(new WidgetPointer(844,43), getItemName(444)); + setWidgetText(new WidgetPointer(844,44), getItemName(447)); + setWidgetText(new WidgetPointer(844,45), getItemName(449)); + setWidgetText(new WidgetPointer(844,46), getItemName(451)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,38)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,39)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,40)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,41)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,42)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,43)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,44)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,45)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,46)); + if (globalint_827 >= 2) { + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,41)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,42)); + } + if (globalint_827 >= 3) { + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,43)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,44)); + } + if (globalint_827 >= 4) { + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,45)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,46)); + } + setItemOnWidgetMethod2205(1521, 1, new WidgetPointer(844,13)); + setItemOnWidgetMethod2205(1519, 1, new WidgetPointer(844,14)); + setItemOnWidgetMethod2205(1517, 1, new WidgetPointer(844,15)); + setItemOnWidgetMethod2205(12581, 1, new WidgetPointer(844,16)); + setItemOnWidgetMethod2205(1515, 1, new WidgetPointer(844,17)); + setItemOnWidgetMethod2205(1513, 1, new WidgetPointer(844,18)); + setWidgetText(new WidgetPointer(844,21), getItemName(1521)); + setWidgetText(new WidgetPointer(844,22), getItemName(1519)); + setWidgetText(new WidgetPointer(844,23), getItemName(1517)); + setWidgetText(new WidgetPointer(844,24), "Special logs"); + setWidgetText(new WidgetPointer(844,25), getItemName(1515)); + setWidgetText(new WidgetPointer(844,26), getItemName(1513)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,21)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,22)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,23)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,24)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,25)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,26)); + if (globalint_827 >= 2) { + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,23)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,24)); + } + if (globalint_827 >= 3) { + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,25)); + } + if (globalint_827 >= 4) { + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,26)); + } + setItemOnWidgetMethod2205(317, 1, new WidgetPointer(844,6)); + setItemOnWidgetMethod2205(377, 1, new WidgetPointer(844,8)); + setWidgetText(new WidgetPointer(844,7), "Fish 1"); + setWidgetText(new WidgetPointer(844,9), "Fish 2"); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,7)); + if (globalint_827 >= 3) { + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,9)); + } else { + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,9)); + } + setItemOnWidgetMethod2205(2152, 1, new WidgetPointer(844,2)); + setItemOnWidgetMethod2205(239, 1, new WidgetPointer(844,4)); + setWidgetText(new WidgetPointer(844,3), "Herblore" + "
" + "secondaries 1"); + setWidgetText(new WidgetPointer(844,5), "Herblore" + "
" + "secondaries 2"); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,3)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,5)); + if (globalint_827 >= 3) { + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(844,5)); + } else { + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(844,5)); + } + return; +} diff --git a/dumps/scripts/2491.cs2 b/dumps/scripts/2491.cs2 new file mode 100644 index 000000000..175661531 --- /dev/null +++ b/dumps/scripts/2491.cs2 @@ -0,0 +1,4 @@ +void script_2491() { + setWidgetText(new WidgetPointer(862,8), script_46(bitconfig_6380, ",")); + return; +} diff --git a/dumps/scripts/2492.cs2 b/dumps/scripts/2492.cs2 new file mode 100644 index 000000000..11b4bb3af --- /dev/null +++ b/dumps/scripts/2492.cs2 @@ -0,0 +1,27 @@ +void script_2492() { + if (((boolean)stringMethod4107(globalstring_184, ""))) { + setScriptCallOnMouseOver(38, new WidgetPointer(862,50), new WidgetPointer(862,11), globalstring_184, 50, 250, "IIsii", new WidgetPointer(862,50)); + setScriptCallOnMouseExit(40, new WidgetPointer(862,11), "I", new WidgetPointer(862,50)); + } + if (((boolean)stringMethod4107(globalstring_185, ""))) { + setScriptCallOnMouseOver(38, new WidgetPointer(862,51), new WidgetPointer(862,11), globalstring_185, 50, 250, "IIsii", new WidgetPointer(862,51)); + setScriptCallOnMouseExit(40, new WidgetPointer(862,11), "I", new WidgetPointer(862,51)); + } + if (((boolean)stringMethod4107(globalstring_186, ""))) { + setScriptCallOnMouseOver(38, new WidgetPointer(862,52), new WidgetPointer(862,11), globalstring_186, 50, 250, "IIsii", new WidgetPointer(862,52)); + setScriptCallOnMouseExit(40, new WidgetPointer(862,11), "I", new WidgetPointer(862,52)); + } + if (((boolean)stringMethod4107(globalstring_187, ""))) { + setScriptCallOnMouseOver(38, new WidgetPointer(862,53), new WidgetPointer(862,11), globalstring_187, 50, 250, "IIsii", new WidgetPointer(862,53)); + setScriptCallOnMouseExit(40, new WidgetPointer(862,11), "I", new WidgetPointer(862,53)); + } + if (((boolean)stringMethod4107(globalstring_188, ""))) { + setScriptCallOnMouseOver(38, new WidgetPointer(862,54), new WidgetPointer(862,11), globalstring_188, 50, 250, "IIsii", new WidgetPointer(862,54)); + setScriptCallOnMouseExit(40, new WidgetPointer(862,11), "I", new WidgetPointer(862,54)); + } + if (((boolean)stringMethod4107(globalstring_189, ""))) { + setScriptCallOnMouseOver(38, new WidgetPointer(862,55), new WidgetPointer(862,11), globalstring_189, 50, 250, "IIsii", new WidgetPointer(862,55)); + setScriptCallOnMouseExit(40, new WidgetPointer(862,11), "I", new WidgetPointer(862,55)); + } + return; +} diff --git a/dumps/scripts/2493.cs2 b/dumps/scripts/2493.cs2 new file mode 100644 index 000000000..e8defbaa1 --- /dev/null +++ b/dumps/scripts/2493.cs2 @@ -0,0 +1,9 @@ +void script_2493(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setItemOnWidgetMethod2200(arg0, -1, new WidgetPointer(862,50)); + setItemOnWidgetMethod2200(arg1, -1, new WidgetPointer(862,51)); + setItemOnWidgetMethod2200(arg2, -1, new WidgetPointer(862,52)); + setItemOnWidgetMethod2200(arg3, -1, new WidgetPointer(862,53)); + setItemOnWidgetMethod2200(arg4, -1, new WidgetPointer(862,54)); + setItemOnWidgetMethod2200(arg5, -1, new WidgetPointer(862,55)); + return; +} diff --git a/dumps/scripts/2494.cs2 b/dumps/scripts/2494.cs2 new file mode 100644 index 000000000..c57ead4cb --- /dev/null +++ b/dumps/scripts/2494.cs2 @@ -0,0 +1,9 @@ +void script_2494(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setItemOnWidgetMethod2200(arg0, -1, new WidgetPointer(653,26)); + setItemOnWidgetMethod2200(arg1, -1, new WidgetPointer(653,27)); + setItemOnWidgetMethod2200(arg2, -1, new WidgetPointer(653,28)); + setItemOnWidgetMethod2200(arg3, -1, new WidgetPointer(653,29)); + setItemOnWidgetMethod2200(arg4, -1, new WidgetPointer(653,30)); + setItemOnWidgetMethod2200(arg5, -1, new WidgetPointer(653,31)); + return; +} diff --git a/dumps/scripts/2495.cs2 b/dumps/scripts/2495.cs2 new file mode 100644 index 000000000..4972acbf8 --- /dev/null +++ b/dumps/scripts/2495.cs2 @@ -0,0 +1,10 @@ +void script_2495() { + int ivar0; + ivar0 = 1; + globalint_837 = bitconfig_6350; + script_2496(); + if ((globalint_837 > 0) && (globalint_837 <= 9)) { + script_2500(((int)cs2method_3408(105, 73, 2400, globalint_837))); + } + return; +} diff --git a/dumps/scripts/2496.cs2 b/dumps/scripts/2496.cs2 new file mode 100644 index 000000000..87ca1602e --- /dev/null +++ b/dumps/scripts/2496.cs2 @@ -0,0 +1,33 @@ +void script_2496() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = 1; + ivar1 = script_2497(); + ivar2 = -1; + ivar3 = -1; + while ((ivar0 <= 9) || (((int)cs2method_3408(105, 73, 2400, ivar0)) != 2949145)) { + if (ivar0 <= ivar1) { + ivar2 = ((int)cs2method_3408(105, 73, 2400, ivar0)); + ivar3 = ((int)cs2method_3408(105, 73, 2402, ivar0)); + setScriptCallOnMousePressed(2499, new WidgetPointer(-32768,3), "I", new WidgetPointer(ivar2)); + setScriptCallOnMousePressed(2499, new WidgetPointer(ivar2), "I", new WidgetPointer(ivar3)); + setWidgetRGB(new Color(225, 152, 31), new WidgetPointer(ivar3)); + setWidgetContextMenuOption(1, new WidgetPointer(ivar2), "Select"); + setWidgetContextMenuOption(1, new WidgetPointer(ivar3), "Select"); + setWidgetText(new WidgetPointer(ivar3), cs2method_3408(105, 115, 2403, ivar0)); + } else { + ivar2 = ((int)cs2method_3408(105, 73, 2400, ivar0)); + ivar3 = ((int)cs2method_3408(105, 73, 2402, ivar0)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar2)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar3)); + setWidgetRGB(new Color(153, 102, 0), new WidgetPointer(ivar3)); + setWidgetNoOptions(new WidgetPointer(ivar2)); + setWidgetNoOptions(new WidgetPointer(ivar3)); + setWidgetText(new WidgetPointer(ivar3), cs2method_3408(105, 115, 2403, ivar0) + " - Locked"); + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/2497.cs2 b/dumps/scripts/2497.cs2 new file mode 100644 index 000000000..385d8d481 --- /dev/null +++ b/dumps/scripts/2497.cs2 @@ -0,0 +1,18 @@ +int script_2497() { + if (standart_config_1447 < 51) { + return 3; + } + if (standart_config_1447 < 101) { + return 4; + } + if (standart_config_1447 < 201) { + return 5; + } + if (standart_config_1447 < 301) { + return 7; + } + if (standart_config_1447 < 401) { + return 8; + } + return 9; +} diff --git a/dumps/scripts/2498.cs2 b/dumps/scripts/2498.cs2 new file mode 100644 index 000000000..d5165e1cd --- /dev/null +++ b/dumps/scripts/2498.cs2 @@ -0,0 +1,7 @@ +void script_2498() { + globalint_837 = bitconfig_6350; + if ((globalint_837 > 0) && (globalint_837 <= 9)) { + script_2500(((int)cs2method_3408(105, 73, 2400, globalint_837))); + } + return; +} diff --git a/dumps/scripts/2499.cs2 b/dumps/scripts/2499.cs2 new file mode 100644 index 000000000..909510fa0 --- /dev/null +++ b/dumps/scripts/2499.cs2 @@ -0,0 +1,4 @@ +void script_2499(int arg0) { + script_2500(arg0); + return; +} diff --git a/dumps/scripts/25.cs2 b/dumps/scripts/25.cs2 new file mode 100644 index 000000000..79a9aea74 --- /dev/null +++ b/dumps/scripts/25.cs2 @@ -0,0 +1,94 @@ +void script_25() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (ivar0 != 0) { + if (isBitFlagged(ivar0, 0)) { + ivar1 = flagBit(ivar1, 0); + } + if (isBitFlagged(ivar0, 1)) { + ivar1 = flagBit(ivar1, 1); + } + if (isBitFlagged(ivar0, 2)) { + ivar1 = flagBit(ivar1, 2); + } + if (isBitFlagged(ivar0, 3)) { + ivar1 = flagBit(ivar1, 3); + } + globalint_996 = ivar1; + ivar1 = 0; + if (isBitFlagged(ivar0, 4)) { + ivar1 = flagBit(ivar1, 0); + } + if (isBitFlagged(ivar0, 5)) { + ivar1 = flagBit(ivar1, 1); + } + if (isBitFlagged(ivar0, 6)) { + ivar1 = flagBit(ivar1, 2); + } + if (isBitFlagged(ivar0, 7)) { + ivar1 = flagBit(ivar1, 3); + } + globalint_997 = ivar1; + ivar1 = 0; + if (isBitFlagged(ivar0, 14)) { + ivar1 = flagBit(ivar1, 0); + } + if (isBitFlagged(ivar0, 15)) { + ivar1 = flagBit(ivar1, 1); + } + if (isBitFlagged(ivar0, 16)) { + ivar1 = flagBit(ivar1, 2); + } + if (isBitFlagged(ivar0, 17)) { + ivar1 = flagBit(ivar1, 3); + } + if (isBitFlagged(ivar0, 18)) { + ivar1 = flagBit(ivar1, 4); + } + if (isBitFlagged(ivar0, 19)) { + ivar1 = flagBit(ivar1, 5); + } + if (isBitFlagged(ivar0, 20)) { + ivar1 = flagBit(ivar1, 6); + } + if (isBitFlagged(ivar0, 21)) { + ivar1 = flagBit(ivar1, 7); + } + if (isBitFlagged(ivar0, 22)) { + ivar1 = flagBit(ivar1, 8); + } + globalint_998 = ivar1; + ivar1 = 0; + if (isBitFlagged(ivar0, 23)) { + ivar1 = flagBit(ivar1, 0); + } + if (isBitFlagged(ivar0, 24)) { + ivar1 = flagBit(ivar1, 1); + } + if (isBitFlagged(ivar0, 25)) { + ivar1 = flagBit(ivar1, 2); + } + if (isBitFlagged(ivar0, 26)) { + ivar1 = flagBit(ivar1, 3); + } + if (isBitFlagged(ivar0, 27)) { + ivar1 = flagBit(ivar1, 4); + } + if (isBitFlagged(ivar0, 28)) { + ivar1 = flagBit(ivar1, 5); + } + if (isBitFlagged(ivar0, 29)) { + ivar1 = flagBit(ivar1, 6); + } + if (isBitFlagged(ivar0, 30)) { + ivar1 = flagBit(ivar1, 7); + } + if (isBitFlagged(ivar0, 31)) { + ivar1 = flagBit(ivar1, 8); + } + globalint_999 = ivar1; + } + return; +} diff --git a/dumps/scripts/250.cs2 b/dumps/scripts/250.cs2 new file mode 100644 index 000000000..5678ece71 --- /dev/null +++ b/dumps/scripts/250.cs2 @@ -0,0 +1,6 @@ +void script_250(int arg0) { + if (((boolean)mod(getClientCycle(), 5))) { + script_251(arg0); + } + return; +} diff --git a/dumps/scripts/2500.cs2 b/dumps/scripts/2500.cs2 new file mode 100644 index 000000000..ee1e2e130 --- /dev/null +++ b/dumps/scripts/2500.cs2 @@ -0,0 +1,17 @@ +void script_2500(int arg0) { + int ivar1; + ivar1 = 1; + while ((ivar1 <= 9) || (((int)cs2method_3408(105, 73, 2400, ivar1)) != 2949145)) { + if (((int)cs2method_3408(105, 73, 2400, ivar1)) != arg0) { + setWidgetSprite(1134, cs2method_3408(105, 73, 2400, ivar1)); + } else { + setWidgetSprite(1135, new WidgetPointer(arg0)); + globalint_837 = ivar1; + } + ivar1 = add(ivar1, 1); + } + if ((globalint_837 > 0) && (globalint_837 <= 9)) { + setWidgetModel(cs2method_3408(105, 109, 2399, globalint_837), new WidgetPointer(45,39)); + } + return; +} diff --git a/dumps/scripts/2501.cs2 b/dumps/scripts/2501.cs2 new file mode 100644 index 000000000..42e512032 --- /dev/null +++ b/dumps/scripts/2501.cs2 @@ -0,0 +1,7 @@ +void script_2501() { + setWidgetIsHidden(true, new WidgetPointer(291,55)); + setWidgetIsHidden(true, new WidgetPointer(291,56)); + setWidgetIsHidden(true, new WidgetPointer(291,57)); + setWidgetIsHidden(true, new WidgetPointer(291,58)); + return; +} diff --git a/dumps/scripts/2502.cs2 b/dumps/scripts/2502.cs2 new file mode 100644 index 000000000..a6f2a5373 --- /dev/null +++ b/dumps/scripts/2502.cs2 @@ -0,0 +1,16 @@ +void script_2502() { + switch (globalint_838) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(291,58)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(291,55)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(291,57)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(291,56)); + } + return; +} diff --git a/dumps/scripts/2503.cs2 b/dumps/scripts/2503.cs2 new file mode 100644 index 000000000..41493fa27 --- /dev/null +++ b/dumps/scripts/2503.cs2 @@ -0,0 +1,6 @@ +void script_2503() { + if ((globalint_837 > 0) && (globalint_837 <= 9)) { + setWidgetText(new WidgetPointer(291,33), cs2method_3408(105, 115, 2403, globalint_837)); + } + return; +} diff --git a/dumps/scripts/2504.cs2 b/dumps/scripts/2504.cs2 new file mode 100644 index 000000000..579990663 --- /dev/null +++ b/dumps/scripts/2504.cs2 @@ -0,0 +1,15 @@ +void script_2504() { + int ivar0; + ivar0 = 0; + setWidgetText(new WidgetPointer(291,73), globalstring_180); + setWidgetText(new WidgetPointer(291,28), globalstring_181); + ivar0 = add(multiply(getLineCount(207, 497, globalstring_180), 17), 5); + setWidgetSize(207, ivar0, 0, 0, new WidgetPointer(291,73)); + setWidgetScrollMax(0, ivar0, new WidgetPointer(291,72)); + script_72(19071045, 19071048, 0); + ivar0 = add(multiply(getLineCount(207, 497, globalstring_181), 17), 5); + setWidgetSize(207, ivar0, 0, 0, new WidgetPointer(291,28)); + setWidgetScrollMax(0, ivar0, new WidgetPointer(291,68)); + script_72(19071046, 19071044, 0); + return; +} diff --git a/dumps/scripts/2505.cs2 b/dumps/scripts/2505.cs2 new file mode 100644 index 000000000..acc9d5f54 --- /dev/null +++ b/dumps/scripts/2505.cs2 @@ -0,0 +1,4 @@ +void script_2505(int arg0) { + setWidgetText(new WidgetPointer(arg0), "Limit: " + script_46(script_2687(), ",")); + return; +} diff --git a/dumps/scripts/2506.cs2 b/dumps/scripts/2506.cs2 new file mode 100644 index 000000000..736326062 --- /dev/null +++ b/dumps/scripts/2506.cs2 @@ -0,0 +1,5 @@ +void script_2506(int arg0) { + globalint_839 = subtract(bitconfig_6351, bitconfig_6427); + setWidgetText(new WidgetPointer(arg0), script_46(globalint_839, ",")); + return; +} diff --git a/dumps/scripts/2507.cs2 b/dumps/scripts/2507.cs2 new file mode 100644 index 000000000..2a91b05b4 --- /dev/null +++ b/dumps/scripts/2507.cs2 @@ -0,0 +1,5 @@ +void script_2507(int arg0) { + globalint_840 = bitconfig_6427; + setWidgetText(new WidgetPointer(arg0), script_46(globalint_840, ",")); + return; +} diff --git a/dumps/scripts/2508.cs2 b/dumps/scripts/2508.cs2 new file mode 100644 index 000000000..8c30e3cbb --- /dev/null +++ b/dumps/scripts/2508.cs2 @@ -0,0 +1,50 @@ +void script_2508(int arg0) { + switch (arg0) { + case 55836719: + globalint_840 = 0; + break; + case 55836713: + if (((globalint_840 < subtract(2147483647, 10)) && (globalint_839 >= 10)) && ((boolean)script_2509(10))) { + globalint_840 = add(globalint_840, 10); + globalint_839 = subtract(globalint_839, 10); + } + break; + case 55836715: + if (((globalint_840 < subtract(2147483647, 100)) && (globalint_839 >= 100)) && ((boolean)script_2509(100))) { + globalint_840 = add(globalint_840, 100); + globalint_839 = subtract(globalint_839, 100); + } + break; + case 55836721: + if (((globalint_840 < subtract(2147483647, 500)) && (globalint_839 >= 500)) && ((boolean)script_2509(500))) { + globalint_840 = add(globalint_840, 500); + globalint_839 = subtract(globalint_839, 500); + } + break; + case 55836723: + if (((globalint_840 < subtract(2147483647, 1000)) && (globalint_839 >= 1000)) && ((boolean)script_2509(1000))) { + globalint_840 = add(globalint_840, 1000); + globalint_839 = subtract(globalint_839, 1000); + } + break; + case 55836725: + if (((globalint_840 < subtract(2147483647, 10000)) && (globalint_839 >= 10000)) && ((boolean)script_2509(10000))) { + globalint_840 = add(globalint_840, 10000); + globalint_839 = subtract(globalint_839, 10000); + } + break; + case 55836717: + if (globalint_839 < script_2687()) { + globalint_840 = globalint_839; + globalint_839 = 0; + } else { + if (globalint_840 < script_2687()) { + globalint_840 = script_2687(); + globalint_839 = subtract(globalint_839, script_2687()); + } + } + } + setWidgetText(new WidgetPointer(852,63), script_46(globalint_840, ",")); + setWidgetText(new WidgetPointer(852,62), script_46(globalint_839, ",")); + return; +} diff --git a/dumps/scripts/2509.cs2 b/dumps/scripts/2509.cs2 new file mode 100644 index 000000000..3c2a342c5 --- /dev/null +++ b/dumps/scripts/2509.cs2 @@ -0,0 +1,6 @@ +int script_2509(int arg0) { + if (globalint_840 <= subtract(script_2687(), arg0)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/251.cs2 b/dumps/scripts/251.cs2 new file mode 100644 index 000000000..fa24954bc --- /dev/null +++ b/dumps/scripts/251.cs2 @@ -0,0 +1,12 @@ +void script_251(int arg0) { + if (((boolean)script_133(42996800, 849335423, getMyPositionHash())) && cs2method6108()) { + if (isWidgetHidden(new WidgetPointer(arg0))) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } + } else { + if (isWidgetHidden(new WidgetPointer(arg0))) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2510.cs2 b/dumps/scripts/2510.cs2 new file mode 100644 index 000000000..f348d2829 --- /dev/null +++ b/dumps/scripts/2510.cs2 @@ -0,0 +1,23 @@ +void script_2510() { + if (globalint_852 <= 0) { + globalint_852 = 0; + } + if (globalint_853 <= 0) { + globalint_853 = 0; + } + if (globalint_854 <= 0) { + globalint_854 = 0; + } + if (globalint_855 <= 0) { + globalint_855 = 0; + } + if (globalint_856 <= 0) { + globalint_856 = 0; + } + setWidgetText(new WidgetPointer(654,9), intToStr(globalint_852)); + setWidgetText(new WidgetPointer(654,58), intToStr(globalint_853)); + setWidgetText(new WidgetPointer(654,50), intToStr(globalint_854)); + setWidgetText(new WidgetPointer(654,42), intToStr(globalint_855)); + setWidgetText(new WidgetPointer(654,67), intToStr(globalint_856)); + return; +} diff --git a/dumps/scripts/2511.cs2 b/dumps/scripts/2511.cs2 new file mode 100644 index 000000000..f1e1e93fc --- /dev/null +++ b/dumps/scripts/2511.cs2 @@ -0,0 +1,8 @@ +void script_2511() { + setWidgetText(new WidgetPointer(654,8), cs2method_3408(105, 115, 2385, 1)); + setWidgetText(new WidgetPointer(654,57), cs2method_3408(105, 115, 2385, 2)); + setWidgetText(new WidgetPointer(654,49), cs2method_3408(105, 115, 2385, 3)); + setWidgetText(new WidgetPointer(654,41), cs2method_3408(105, 115, 2385, 4)); + setWidgetText(new WidgetPointer(654,66), cs2method_3408(105, 115, 2385, 5)); + return; +} diff --git a/dumps/scripts/2512.cs2 b/dumps/scripts/2512.cs2 new file mode 100644 index 000000000..d73cd4d4b --- /dev/null +++ b/dumps/scripts/2512.cs2 @@ -0,0 +1,8 @@ +void script_2512() { + setWidgetText(new WidgetPointer(654,10), script_46(cs2method_3408(105, 105, 2454, 1), ",")); + setWidgetText(new WidgetPointer(654,59), script_46(cs2method_3408(105, 105, 2454, 2), ",")); + setWidgetText(new WidgetPointer(654,51), script_46(cs2method_3408(105, 105, 2454, 3), ",")); + setWidgetText(new WidgetPointer(654,43), script_46(cs2method_3408(105, 105, 2454, 4), ",")); + setWidgetText(new WidgetPointer(654,68), script_46(cs2method_3408(105, 105, 2454, 5), ",")); + return; +} diff --git a/dumps/scripts/2513.cs2 b/dumps/scripts/2513.cs2 new file mode 100644 index 000000000..c9648b822 --- /dev/null +++ b/dumps/scripts/2513.cs2 @@ -0,0 +1,23 @@ +void script_2513() { + if (globalint_847 < 0) { + globalint_847 = 0; + } + if (globalint_848 < 0) { + globalint_848 = 0; + } + if (globalint_849 < 0) { + globalint_849 = 0; + } + if (globalint_850 < 0) { + globalint_850 = 0; + } + if (globalint_851 < 0) { + globalint_851 = 0; + } + setWidgetText(new WidgetPointer(654,13), intToStr(globalint_847)); + setWidgetText(new WidgetPointer(654,61), intToStr(globalint_848)); + setWidgetText(new WidgetPointer(654,53), intToStr(globalint_849)); + setWidgetText(new WidgetPointer(654,45), intToStr(globalint_850)); + setWidgetText(new WidgetPointer(654,70), intToStr(globalint_851)); + return; +} diff --git a/dumps/scripts/2514.cs2 b/dumps/scripts/2514.cs2 new file mode 100644 index 000000000..a4a4058aa --- /dev/null +++ b/dumps/scripts/2514.cs2 @@ -0,0 +1,12 @@ +void script_2514() { + setWidgetText(new WidgetPointer(654,11), "0"); + setWidgetText(new WidgetPointer(654,60), "0"); + setWidgetText(new WidgetPointer(654,52), "0"); + setWidgetText(new WidgetPointer(654,44), "0"); + setWidgetText(new WidgetPointer(654,69), "0"); + setWidgetText(new WidgetPointer(654,74), "0"); + if (globalint_839 >= 0) { + setWidgetText(new WidgetPointer(654,77), script_46(globalint_839, ",")); + } + return; +} diff --git a/dumps/scripts/2515.cs2 b/dumps/scripts/2515.cs2 new file mode 100644 index 000000000..3429ebed3 --- /dev/null +++ b/dumps/scripts/2515.cs2 @@ -0,0 +1,4 @@ +void script_2515() { + script_2516(); + return; +} diff --git a/dumps/scripts/2516.cs2 b/dumps/scripts/2516.cs2 new file mode 100644 index 000000000..a6695cc7a --- /dev/null +++ b/dumps/scripts/2516.cs2 @@ -0,0 +1,16 @@ +void script_2516() { + globalint_847 = bitconfig_6364; + globalint_848 = bitconfig_6366; + globalint_849 = bitconfig_6367; + globalint_850 = bitconfig_6363; + globalint_851 = bitconfig_6365; + globalint_839 = bitconfig_6351; + setWidgetText(new WidgetPointer(654,13), intToStr(globalint_847)); + setWidgetText(new WidgetPointer(654,61), intToStr(globalint_848)); + setWidgetText(new WidgetPointer(654,53), intToStr(globalint_849)); + setWidgetText(new WidgetPointer(654,45), intToStr(globalint_850)); + setWidgetText(new WidgetPointer(654,70), intToStr(globalint_851)); + setWidgetText(new WidgetPointer(654,77), script_46(globalint_839, ",")); + script_2517(); + return; +} diff --git a/dumps/scripts/2517.cs2 b/dumps/scripts/2517.cs2 new file mode 100644 index 000000000..3b66dde11 --- /dev/null +++ b/dumps/scripts/2517.cs2 @@ -0,0 +1,29 @@ +void script_2517() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar0 = 0; + ivar1 = 0; + ivar2 = multiply(globalint_847, cs2method_3408(105, 105, 2454, 1)); + ivar3 = multiply(globalint_848, cs2method_3408(105, 105, 2454, 2)); + ivar4 = multiply(globalint_849, cs2method_3408(105, 105, 2454, 3)); + ivar5 = multiply(globalint_850, cs2method_3408(105, 105, 2454, 4)); + ivar6 = multiply(globalint_851, cs2method_3408(105, 105, 2454, 5)); + setWidgetText(new WidgetPointer(654,11), script_46(ivar2, ",")); + setWidgetText(new WidgetPointer(654,60), script_46(ivar3, ",")); + setWidgetText(new WidgetPointer(654,52), script_46(ivar4, ",")); + setWidgetText(new WidgetPointer(654,44), script_46(ivar5, ",")); + setWidgetText(new WidgetPointer(654,69), script_46(ivar6, ",")); + ivar1 = add(ivar2, ivar3); + ivar1 = add(ivar1, ivar4); + ivar1 = add(ivar1, ivar5); + ivar1 = add(ivar1, ivar6); + setWidgetText(new WidgetPointer(654,74), script_46(ivar1, ",")); + ivar0 = subtract(globalint_839, ivar1); + setWidgetText(new WidgetPointer(654,77), script_46(ivar0, ",")); + return; +} diff --git a/dumps/scripts/2518.cs2 b/dumps/scripts/2518.cs2 new file mode 100644 index 000000000..2c8188efe --- /dev/null +++ b/dumps/scripts/2518.cs2 @@ -0,0 +1,37 @@ +void script_2518(int arg0) { + int ivar1; + ivar1 = script_2520(); + switch (arg0) { + case 42860559: + if ((globalint_847 < 5) && (ivar1 < 5)) { + globalint_847 = add(globalint_847, 1); + setWidgetText(new WidgetPointer(654,13), intToStr(globalint_847)); + } + break; + case 42860607: + if ((globalint_848 < 5) && (ivar1 < 5)) { + globalint_848 = add(globalint_848, 1); + setWidgetText(new WidgetPointer(654,61), intToStr(globalint_848)); + } + break; + case 42860599: + if ((globalint_849 < 5) && (ivar1 < 5)) { + globalint_849 = add(globalint_849, 1); + setWidgetText(new WidgetPointer(654,53), intToStr(globalint_849)); + } + break; + case 42860591: + if ((globalint_850 < 5) && (ivar1 < 5)) { + globalint_850 = add(globalint_850, 1); + setWidgetText(new WidgetPointer(654,45), intToStr(globalint_850)); + } + break; + case 42860616: + if ((globalint_851 < 5) && (ivar1 < 5)) { + globalint_851 = add(globalint_851, 1); + setWidgetText(new WidgetPointer(654,70), intToStr(globalint_851)); + } + } + script_2517(); + return; +} diff --git a/dumps/scripts/2519.cs2 b/dumps/scripts/2519.cs2 new file mode 100644 index 000000000..68f9f9136 --- /dev/null +++ b/dumps/scripts/2519.cs2 @@ -0,0 +1,37 @@ +void script_2519(int arg0) { + int ivar1; + ivar1 = script_2520(); + switch (arg0) { + case 42860558: + if (globalint_847 > 0) { + globalint_847 = subtract(globalint_847, 1); + setWidgetText(new WidgetPointer(654,13), intToStr(globalint_847)); + } + break; + case 42860606: + if (globalint_848 > 0) { + globalint_848 = subtract(globalint_848, 1); + setWidgetText(new WidgetPointer(654,61), intToStr(globalint_848)); + } + break; + case 42860598: + if (globalint_849 > 0) { + globalint_849 = subtract(globalint_849, 1); + setWidgetText(new WidgetPointer(654,53), intToStr(globalint_849)); + } + break; + case 42860590: + if (globalint_850 > 0) { + globalint_850 = subtract(globalint_850, 1); + setWidgetText(new WidgetPointer(654,45), intToStr(globalint_850)); + } + break; + case 42860615: + if (globalint_851 > 0) { + globalint_851 = subtract(globalint_851, 1); + setWidgetText(new WidgetPointer(654,70), intToStr(globalint_851)); + } + } + script_2517(); + return; +} diff --git a/dumps/scripts/252.cs2 b/dumps/scripts/252.cs2 new file mode 100644 index 000000000..b03a1d93d --- /dev/null +++ b/dumps/scripts/252.cs2 @@ -0,0 +1,4 @@ +void script_252() { + script_253(); + return; +} diff --git a/dumps/scripts/2520.cs2 b/dumps/scripts/2520.cs2 new file mode 100644 index 000000000..5d247a6e3 --- /dev/null +++ b/dumps/scripts/2520.cs2 @@ -0,0 +1,15 @@ +int script_2520() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, globalint_847); + ivar0 = add(ivar0, globalint_852); + ivar0 = add(ivar0, globalint_848); + ivar0 = add(ivar0, globalint_853); + ivar0 = add(ivar0, globalint_849); + ivar0 = add(ivar0, globalint_854); + ivar0 = add(ivar0, globalint_850); + ivar0 = add(ivar0, globalint_855); + ivar0 = add(ivar0, globalint_851); + ivar0 = add(ivar0, globalint_856); + return ivar0; +} diff --git a/dumps/scripts/2521.cs2 b/dumps/scripts/2521.cs2 new file mode 100644 index 000000000..ad0ae7a74 --- /dev/null +++ b/dumps/scripts/2521.cs2 @@ -0,0 +1,50 @@ +void script_2521() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = -1; + ivar5 = -1; + ivar1 = divide(subtract(getWidgetActualWidth(new WidgetPointer(848,2)), 180), 4); + ivar2 = divide(subtract(getWidgetActualHeight(new WidgetPointer(848,2)), 128), 3); + while ((ivar0 < 5) && (cs2method_3408(105, 79, globalint_875, ivar0) != 11760)) { + ivar5 = cs2method_3408(105, 79, globalint_875, ivar0); + switch (ivar0) { + case 0: + setWidgetText(new WidgetPointer(848,19), getItemName(getRealItem(ivar5))); + ivar3 = globalint_876; + break; + case 1: + setWidgetText(new WidgetPointer(848,20), getItemName(getRealItem(ivar5))); + ivar3 = globalint_877; + break; + case 2: + setWidgetText(new WidgetPointer(848,21), getItemName(getRealItem(ivar5))); + ivar3 = globalint_878; + break; + case 3: + setWidgetText(new WidgetPointer(848,22), getItemName(getRealItem(ivar5))); + ivar3 = globalint_879; + break; + case 4: + setWidgetText(new WidgetPointer(848,23), getItemName(getRealItem(ivar5))); + ivar3 = globalint_880; + } + createExtraChild(new WidgetPointer(848,2), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar1), mod(ivar0, 5)), multiply(divide(ivar0, 5), add(32, ivar2)), 0, 0); + setItemOnWidgetMethod1200(getRealItem(ivar5), ivar3); + cs2method1305("" + getItemName(getRealItem(ivar5))); + setWidgetContextMenuOption(1, "Select"); + setWidgetContextMenuOption(2, "Examine"); + setWidgetShadowColor(new Color(51, 51, 51)); + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/2522.cs2 b/dumps/scripts/2522.cs2 new file mode 100644 index 000000000..08a719361 --- /dev/null +++ b/dumps/scripts/2522.cs2 @@ -0,0 +1,8 @@ +void script_2522(int arg0) { + if (((boolean)bitconfig_6375)) { + setWidgetSprite(1135, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1134, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2523.cs2 b/dumps/scripts/2523.cs2 new file mode 100644 index 000000000..125a772cd --- /dev/null +++ b/dumps/scripts/2523.cs2 @@ -0,0 +1,8 @@ +void script_2523(int arg0) { + if (((boolean)bitconfig_6376)) { + setWidgetSprite(1135, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1134, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2524.cs2 b/dumps/scripts/2524.cs2 new file mode 100644 index 000000000..398c20764 --- /dev/null +++ b/dumps/scripts/2524.cs2 @@ -0,0 +1,8 @@ +void script_2524(int arg0) { + if (((boolean)bitconfig_6377)) { + setWidgetSprite(1135, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1134, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2525.cs2 b/dumps/scripts/2525.cs2 new file mode 100644 index 000000000..4eafcee28 --- /dev/null +++ b/dumps/scripts/2525.cs2 @@ -0,0 +1,8 @@ +void script_2525(int arg0) { + if (((boolean)bitconfig_6378)) { + setWidgetSprite(1135, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1134, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2526.cs2 b/dumps/scripts/2526.cs2 new file mode 100644 index 000000000..08d27384b --- /dev/null +++ b/dumps/scripts/2526.cs2 @@ -0,0 +1,8 @@ +void script_2526(int arg0) { + if (((boolean)bitconfig_6379)) { + setWidgetSprite(1135, new WidgetPointer(arg0)); + } else { + setWidgetSprite(1134, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2527.cs2 b/dumps/scripts/2527.cs2 new file mode 100644 index 000000000..4c60c8531 --- /dev/null +++ b/dumps/scripts/2527.cs2 @@ -0,0 +1,13 @@ +void script_2527() { + script_2529(); + script_2531(); + script_2533(); + script_2535(); + script_2537(); + script_2539(); + script_2541(); + script_2543(); + script_2545(); + script_2547(); + return; +} diff --git a/dumps/scripts/2528.cs2 b/dumps/scripts/2528.cs2 new file mode 100644 index 000000000..0a3102d11 --- /dev/null +++ b/dumps/scripts/2528.cs2 @@ -0,0 +1,4 @@ +void script_2528() { + script_2529(); + return; +} diff --git a/dumps/scripts/2529.cs2 b/dumps/scripts/2529.cs2 new file mode 100644 index 000000000..f6bdd9d8f --- /dev/null +++ b/dumps/scripts/2529.cs2 @@ -0,0 +1,12 @@ +void script_2529() { + if (((boolean)globalint_908)) { + setWidgetSprite(1949, new WidgetPointer(39,68)); + } else if (globalint_908 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,68)); + } else { + if (globalint_908 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,68)); + } + } + return; +} diff --git a/dumps/scripts/253.cs2 b/dumps/scripts/253.cs2 new file mode 100644 index 000000000..4623ef5fe --- /dev/null +++ b/dumps/scripts/253.cs2 @@ -0,0 +1,21 @@ +void script_253() { + setScriptCallOnGlobalConfigChange(260, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 7, "Y", new WidgetPointer(923,0)); + setItemOnWidgetMethod2205(15658, 0, new WidgetPointer(923,80)); + setItemOnWidgetMethod2205(15661, 0, new WidgetPointer(923,81)); + setItemOnWidgetMethod2205(15662, 0, new WidgetPointer(923,82)); + setItemOnWidgetMethod2205(15664, 0, new WidgetPointer(923,83)); + setItemOnWidgetMethod2205(15665, 0, new WidgetPointer(923,84)); + setItemOnWidgetMethod2205(15663, 0, new WidgetPointer(923,85)); + setItemOnWidgetMethod2205(15660, 0, new WidgetPointer(923,86)); + setItemOnWidgetMethod2205(15659, 0, new WidgetPointer(923,87)); + setScriptCallOnGlobalConfigChange(256, 1111, 1113, 1112, 1114, 1115, 1116, 1117, 7, "Y", new WidgetPointer(919,0)); + globalint_1111 = 0; + globalint_1112 = 0; + globalint_1113 = 0; + globalint_1114 = 0; + globalint_1115 = 0; + globalint_1116 = 0; + globalint_1117 = -1; + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(919,6)), getWidgetActualHeight(new WidgetPointer(919,6)), new WidgetPointer(919,6)); + return; +} diff --git a/dumps/scripts/2530.cs2 b/dumps/scripts/2530.cs2 new file mode 100644 index 000000000..146e8f293 --- /dev/null +++ b/dumps/scripts/2530.cs2 @@ -0,0 +1,4 @@ +void script_2530() { + script_2531(); + return; +} diff --git a/dumps/scripts/2531.cs2 b/dumps/scripts/2531.cs2 new file mode 100644 index 000000000..356b7b69f --- /dev/null +++ b/dumps/scripts/2531.cs2 @@ -0,0 +1,12 @@ +void script_2531() { + if (((boolean)globalint_909)) { + setWidgetSprite(1949, new WidgetPointer(39,62)); + } else if (globalint_909 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,62)); + } else { + if (globalint_909 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,62)); + } + } + return; +} diff --git a/dumps/scripts/2532.cs2 b/dumps/scripts/2532.cs2 new file mode 100644 index 000000000..1f20eaa2d --- /dev/null +++ b/dumps/scripts/2532.cs2 @@ -0,0 +1,4 @@ +void script_2532() { + script_2533(); + return; +} diff --git a/dumps/scripts/2533.cs2 b/dumps/scripts/2533.cs2 new file mode 100644 index 000000000..e1235b4d3 --- /dev/null +++ b/dumps/scripts/2533.cs2 @@ -0,0 +1,12 @@ +void script_2533() { + if (((boolean)globalint_910)) { + setWidgetSprite(1949, new WidgetPointer(39,48)); + } else if (globalint_910 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,48)); + } else { + if (globalint_910 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,48)); + } + } + return; +} diff --git a/dumps/scripts/2534.cs2 b/dumps/scripts/2534.cs2 new file mode 100644 index 000000000..30519e83c --- /dev/null +++ b/dumps/scripts/2534.cs2 @@ -0,0 +1,4 @@ +void script_2534() { + script_2535(); + return; +} diff --git a/dumps/scripts/2535.cs2 b/dumps/scripts/2535.cs2 new file mode 100644 index 000000000..0223d10de --- /dev/null +++ b/dumps/scripts/2535.cs2 @@ -0,0 +1,12 @@ +void script_2535() { + if (((boolean)globalint_911)) { + setWidgetSprite(1949, new WidgetPointer(39,36)); + } else if (globalint_911 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,36)); + } else { + if (globalint_911 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,36)); + } + } + return; +} diff --git a/dumps/scripts/2536.cs2 b/dumps/scripts/2536.cs2 new file mode 100644 index 000000000..84337a644 --- /dev/null +++ b/dumps/scripts/2536.cs2 @@ -0,0 +1,4 @@ +void script_2536() { + script_2537(); + return; +} diff --git a/dumps/scripts/2537.cs2 b/dumps/scripts/2537.cs2 new file mode 100644 index 000000000..437ae05f4 --- /dev/null +++ b/dumps/scripts/2537.cs2 @@ -0,0 +1,12 @@ +void script_2537() { + if (((boolean)globalint_912)) { + setWidgetSprite(1949, new WidgetPointer(39,42)); + } else if (globalint_912 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,42)); + } else { + if (globalint_912 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,42)); + } + } + return; +} diff --git a/dumps/scripts/2538.cs2 b/dumps/scripts/2538.cs2 new file mode 100644 index 000000000..e4320793a --- /dev/null +++ b/dumps/scripts/2538.cs2 @@ -0,0 +1,4 @@ +void script_2538() { + script_2539(); + return; +} diff --git a/dumps/scripts/2539.cs2 b/dumps/scripts/2539.cs2 new file mode 100644 index 000000000..3f3781633 --- /dev/null +++ b/dumps/scripts/2539.cs2 @@ -0,0 +1,12 @@ +void script_2539() { + if (((boolean)globalint_913)) { + setWidgetSprite(1949, new WidgetPointer(39,30)); + } else if (globalint_913 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,30)); + } else { + if (globalint_913 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,30)); + } + } + return; +} diff --git a/dumps/scripts/254.cs2 b/dumps/scripts/254.cs2 new file mode 100644 index 000000000..bc2659343 --- /dev/null +++ b/dumps/scripts/254.cs2 @@ -0,0 +1,4 @@ +void script_254() { + script_255(); + return; +} diff --git a/dumps/scripts/2540.cs2 b/dumps/scripts/2540.cs2 new file mode 100644 index 000000000..73c9856b9 --- /dev/null +++ b/dumps/scripts/2540.cs2 @@ -0,0 +1,4 @@ +void script_2540() { + script_2541(); + return; +} diff --git a/dumps/scripts/2541.cs2 b/dumps/scripts/2541.cs2 new file mode 100644 index 000000000..14eb28aaf --- /dev/null +++ b/dumps/scripts/2541.cs2 @@ -0,0 +1,12 @@ +void script_2541() { + if (((boolean)globalint_914)) { + setWidgetSprite(1949, new WidgetPointer(39,24)); + } else if (globalint_914 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,24)); + } else { + if (globalint_914 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,24)); + } + } + return; +} diff --git a/dumps/scripts/2542.cs2 b/dumps/scripts/2542.cs2 new file mode 100644 index 000000000..970f9024c --- /dev/null +++ b/dumps/scripts/2542.cs2 @@ -0,0 +1,4 @@ +void script_2542() { + script_2543(); + return; +} diff --git a/dumps/scripts/2543.cs2 b/dumps/scripts/2543.cs2 new file mode 100644 index 000000000..5400a2e6a --- /dev/null +++ b/dumps/scripts/2543.cs2 @@ -0,0 +1,12 @@ +void script_2543() { + if (((boolean)globalint_915)) { + setWidgetSprite(1949, new WidgetPointer(39,12)); + } else if (globalint_915 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,12)); + } else { + if (globalint_915 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,12)); + } + } + return; +} diff --git a/dumps/scripts/2544.cs2 b/dumps/scripts/2544.cs2 new file mode 100644 index 000000000..ffacb3194 --- /dev/null +++ b/dumps/scripts/2544.cs2 @@ -0,0 +1,4 @@ +void script_2544() { + script_2545(); + return; +} diff --git a/dumps/scripts/2545.cs2 b/dumps/scripts/2545.cs2 new file mode 100644 index 000000000..16ddef1ed --- /dev/null +++ b/dumps/scripts/2545.cs2 @@ -0,0 +1,12 @@ +void script_2545() { + if (((boolean)globalint_916)) { + setWidgetSprite(1949, new WidgetPointer(39,18)); + } else if (globalint_916 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,18)); + } else { + if (globalint_916 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,18)); + } + } + return; +} diff --git a/dumps/scripts/2546.cs2 b/dumps/scripts/2546.cs2 new file mode 100644 index 000000000..e24a6841a --- /dev/null +++ b/dumps/scripts/2546.cs2 @@ -0,0 +1,4 @@ +void script_2546() { + script_2547(); + return; +} diff --git a/dumps/scripts/2547.cs2 b/dumps/scripts/2547.cs2 new file mode 100644 index 000000000..743cd7161 --- /dev/null +++ b/dumps/scripts/2547.cs2 @@ -0,0 +1,12 @@ +void script_2547() { + if (((boolean)globalint_917)) { + setWidgetSprite(1949, new WidgetPointer(39,6)); + } else if (globalint_917 == 2) { + setWidgetSprite(1946, new WidgetPointer(39,6)); + } else { + if (globalint_917 == 3) { + setWidgetSprite(1947, new WidgetPointer(39,6)); + } + } + return; +} diff --git a/dumps/scripts/2548.cs2 b/dumps/scripts/2548.cs2 new file mode 100644 index 000000000..253f7f85c --- /dev/null +++ b/dumps/scripts/2548.cs2 @@ -0,0 +1,14 @@ +void script_2548() { + if (((boolean)globalint_918)) { + setWidgetSprite(1908, new WidgetPointer(39,71)); + } else if (globalint_918 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,71)); + } else if (globalint_918 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,71)); + } else { + if (globalint_918 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,71)); + } + } + return; +} diff --git a/dumps/scripts/2549.cs2 b/dumps/scripts/2549.cs2 new file mode 100644 index 000000000..6eaf3d484 --- /dev/null +++ b/dumps/scripts/2549.cs2 @@ -0,0 +1,14 @@ +void script_2549() { + if (((boolean)globalint_919)) { + setWidgetSprite(1908, new WidgetPointer(39,65)); + } else if (globalint_919 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,65)); + } else if (globalint_919 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,65)); + } else { + if (globalint_919 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,65)); + } + } + return; +} diff --git a/dumps/scripts/255.cs2 b/dumps/scripts/255.cs2 new file mode 100644 index 000000000..637d5a2ff --- /dev/null +++ b/dumps/scripts/255.cs2 @@ -0,0 +1,4 @@ +void script_255() { + setScriptCallOnGlobalConfigChange(256, 1111, 1112, 1113, 1114, 1115, 1116, 6, "Y", new WidgetPointer(919,0)); + return; +} diff --git a/dumps/scripts/2550.cs2 b/dumps/scripts/2550.cs2 new file mode 100644 index 000000000..3c90cb1f9 --- /dev/null +++ b/dumps/scripts/2550.cs2 @@ -0,0 +1,14 @@ +void script_2550() { + if (((boolean)globalint_920)) { + setWidgetSprite(1908, new WidgetPointer(39,51)); + } else if (globalint_920 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,51)); + } else if (globalint_920 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,51)); + } else { + if (globalint_920 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,51)); + } + } + return; +} diff --git a/dumps/scripts/2551.cs2 b/dumps/scripts/2551.cs2 new file mode 100644 index 000000000..1696554b1 --- /dev/null +++ b/dumps/scripts/2551.cs2 @@ -0,0 +1,14 @@ +void script_2551() { + if (((boolean)globalint_921)) { + setWidgetSprite(1908, new WidgetPointer(39,38)); + } else if (globalint_921 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,38)); + } else if (globalint_921 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,38)); + } else { + if (globalint_921 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,38)); + } + } + return; +} diff --git a/dumps/scripts/2552.cs2 b/dumps/scripts/2552.cs2 new file mode 100644 index 000000000..b397cf92b --- /dev/null +++ b/dumps/scripts/2552.cs2 @@ -0,0 +1,14 @@ +void script_2552() { + if (((boolean)globalint_922)) { + setWidgetSprite(1908, new WidgetPointer(39,45)); + } else if (globalint_922 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,45)); + } else if (globalint_922 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,45)); + } else { + if (globalint_922 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,45)); + } + } + return; +} diff --git a/dumps/scripts/2553.cs2 b/dumps/scripts/2553.cs2 new file mode 100644 index 000000000..7de08e6d0 --- /dev/null +++ b/dumps/scripts/2553.cs2 @@ -0,0 +1,14 @@ +void script_2553() { + if (((boolean)globalint_923)) { + setWidgetSprite(1908, new WidgetPointer(39,33)); + } else if (globalint_923 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,33)); + } else if (globalint_923 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,33)); + } else { + if (globalint_923 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,33)); + } + } + return; +} diff --git a/dumps/scripts/2554.cs2 b/dumps/scripts/2554.cs2 new file mode 100644 index 000000000..316f21fcb --- /dev/null +++ b/dumps/scripts/2554.cs2 @@ -0,0 +1,14 @@ +void script_2554() { + if (((boolean)globalint_924)) { + setWidgetSprite(1908, new WidgetPointer(39,27)); + } else if (globalint_924 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,27)); + } else if (globalint_924 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,27)); + } else { + if (globalint_924 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,27)); + } + } + return; +} diff --git a/dumps/scripts/2555.cs2 b/dumps/scripts/2555.cs2 new file mode 100644 index 000000000..8392a13a0 --- /dev/null +++ b/dumps/scripts/2555.cs2 @@ -0,0 +1,14 @@ +void script_2555() { + if (((boolean)globalint_925)) { + setWidgetSprite(1908, new WidgetPointer(39,15)); + } else if (globalint_925 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,15)); + } else if (globalint_925 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,15)); + } else { + if (globalint_925 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,15)); + } + } + return; +} diff --git a/dumps/scripts/2556.cs2 b/dumps/scripts/2556.cs2 new file mode 100644 index 000000000..5b061dd80 --- /dev/null +++ b/dumps/scripts/2556.cs2 @@ -0,0 +1,14 @@ +void script_2556() { + if (((boolean)globalint_926)) { + setWidgetSprite(1908, new WidgetPointer(39,21)); + } else if (globalint_926 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,21)); + } else if (globalint_926 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,21)); + } else { + if (globalint_926 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,21)); + } + } + return; +} diff --git a/dumps/scripts/2557.cs2 b/dumps/scripts/2557.cs2 new file mode 100644 index 000000000..65f34c838 --- /dev/null +++ b/dumps/scripts/2557.cs2 @@ -0,0 +1,14 @@ +void script_2557() { + if (((boolean)globalint_927)) { + setWidgetSprite(1908, new WidgetPointer(39,9)); + } else if (globalint_927 == 2) { + setWidgetSprite(1910, new WidgetPointer(39,9)); + } else if (globalint_927 == 3) { + setWidgetSprite(1911, new WidgetPointer(39,9)); + } else { + if (globalint_927 == 4) { + setWidgetSprite(1909, new WidgetPointer(39,9)); + } + } + return; +} diff --git a/dumps/scripts/2558.cs2 b/dumps/scripts/2558.cs2 new file mode 100644 index 000000000..8989d63db --- /dev/null +++ b/dumps/scripts/2558.cs2 @@ -0,0 +1,12 @@ +void script_2558(int arg0) { + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 1946) { + setWidgetSprite(1951, new WidgetPointer(arg0)); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 1947) { + setWidgetSprite(1952, new WidgetPointer(arg0)); + } else { + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 1949) { + setWidgetSprite(1954, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2559.cs2 b/dumps/scripts/2559.cs2 new file mode 100644 index 000000000..4475c8cfc --- /dev/null +++ b/dumps/scripts/2559.cs2 @@ -0,0 +1,13 @@ +void script_2559(int arg0,int arg1) { + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 1951) { + setWidgetSprite(1946, new WidgetPointer(arg0)); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 1952) { + setWidgetSprite(1947, new WidgetPointer(arg0)); + } else { + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 1954) { + setWidgetSprite(1949, new WidgetPointer(arg0)); + } + } + script_41(arg1); + return; +} diff --git a/dumps/scripts/256.cs2 b/dumps/scripts/256.cs2 new file mode 100644 index 000000000..12e9791f1 --- /dev/null +++ b/dumps/scripts/256.cs2 @@ -0,0 +1,4 @@ +void script_256() { + script_257(); + return; +} diff --git a/dumps/scripts/2560.cs2 b/dumps/scripts/2560.cs2 new file mode 100644 index 000000000..b7c02609f --- /dev/null +++ b/dumps/scripts/2560.cs2 @@ -0,0 +1,13 @@ +void script_2560() { + setWidgetText(new WidgetPointer(845,10), cs2method_3408(105, 115, 2385, 1)); + setWidgetText(new WidgetPointer(845,14), cs2method_3408(105, 115, 2385, 2)); + setWidgetText(new WidgetPointer(845,18), cs2method_3408(105, 115, 2385, 3)); + setWidgetText(new WidgetPointer(845,22), cs2method_3408(105, 115, 2385, 4)); + setWidgetText(new WidgetPointer(845,26), cs2method_3408(105, 115, 2385, 5)); + setWidgetText(new WidgetPointer(845,9), "x " + intToStr(globalint_828)); + setWidgetText(new WidgetPointer(845,13), "x " + intToStr(globalint_829)); + setWidgetText(new WidgetPointer(845,17), "x " + intToStr(globalint_830)); + setWidgetText(new WidgetPointer(845,21), "x " + intToStr(globalint_831)); + setWidgetText(new WidgetPointer(845,25), "x " + intToStr(globalint_832)); + return; +} diff --git a/dumps/scripts/2561.cs2 b/dumps/scripts/2561.cs2 new file mode 100644 index 000000000..0b6ab95f5 --- /dev/null +++ b/dumps/scripts/2561.cs2 @@ -0,0 +1,82 @@ +void script_2561() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + if (((boolean)globalint_844)) { + setWidgetSprite(1135, new WidgetPointer(863,27)); + setWidgetSprite(1134, new WidgetPointer(863,28)); + } else { + setWidgetSprite(1134, new WidgetPointer(863,27)); + setWidgetSprite(1135, new WidgetPointer(863,28)); + } + if (((boolean)globalint_844)) { + if (((boolean)globalint_845)) { + setWidgetText(new WidgetPointer(863,57), "Dwarf"); + ivar0 = 175; + ivar1 = 5300; + ivar2 = 60; + } else if (globalint_845 == 2) { + setWidgetText(new WidgetPointer(863,57), "Goblin"); + ivar0 = 175; + ivar1 = 4800; + ivar2 = 110; + } else { + if (globalint_845 == 3) { + setWidgetText(new WidgetPointer(863,57), "Elf"); + ivar0 = 225; + ivar1 = 4800; + ivar2 = 60; + } + } + } else { + if (((boolean)globalint_844)) { + if (((boolean)globalint_845)) { + setWidgetText(new WidgetPointer(863,57), "Dwarf"); + ivar0 = 350; + ivar1 = 10100; + ivar2 = 60; + } else if (globalint_845 == 2) { + setWidgetText(new WidgetPointer(863,57), "Goblin"); + ivar0 = 350; + ivar1 = 9600; + ivar2 = 110; + } else { + if (globalint_845 == 3) { + setWidgetText(new WidgetPointer(863,57), "Elf"); + ivar0 = 400; + ivar1 = 9600; + ivar2 = 60; + } + } + } + } + ivar3 = 100; + setWidgetText(new WidgetPointer(863,15), script_46(ivar3, ",")); + setWidgetText(new WidgetPointer(863,5), intToStr(ivar0)); + setWidgetText(new WidgetPointer(863,7), intToStr(ivar1)); + setWidgetText(new WidgetPointer(863,9), intToStr(ivar2)); + setWidgetText(new WidgetPointer(863,58), cs2method_3408(105, 115, 2386, globalint_845)); + if (((boolean)globalint_845) && ((boolean)globalint_844)) { + setWidgetModel(47798, new WidgetPointer(863,34)); + } else if ((globalint_845 == 2) && ((boolean)globalint_844)) { + setWidgetModel(47794, new WidgetPointer(863,34)); + } else if ((globalint_845 == 3) && ((boolean)globalint_844)) { + setWidgetModel(47792, new WidgetPointer(863,34)); + } else if (((boolean)globalint_845) && ((boolean)globalint_844)) { + setWidgetModel(47786, new WidgetPointer(863,34)); + } else if ((globalint_845 == 2) && ((boolean)globalint_844)) { + setWidgetModel(47787, new WidgetPointer(863,34)); + } else { + if ((globalint_845 == 3) && ((boolean)globalint_844)) { + setWidgetModel(47796, new WidgetPointer(863,34)); + } + } + globalint_839 = bitconfig_6351; + globalint_846 = bitconfig_6380; + return; +} diff --git a/dumps/scripts/2562.cs2 b/dumps/scripts/2562.cs2 new file mode 100644 index 000000000..9331305ba --- /dev/null +++ b/dumps/scripts/2562.cs2 @@ -0,0 +1,8 @@ +void script_2562() { + if (globalint_846 < 10) { + globalint_846 = add(globalint_846, 1); + } + setWidgetText(new WidgetPointer(863,30), intToStr(globalint_846)); + script_2565(); + return; +} diff --git a/dumps/scripts/2563.cs2 b/dumps/scripts/2563.cs2 new file mode 100644 index 000000000..019670ed2 --- /dev/null +++ b/dumps/scripts/2563.cs2 @@ -0,0 +1,8 @@ +void script_2563() { + if (globalint_846 > 1) { + globalint_846 = subtract(globalint_846, 1); + } + setWidgetText(new WidgetPointer(863,30), intToStr(globalint_846)); + script_2565(); + return; +} diff --git a/dumps/scripts/2564.cs2 b/dumps/scripts/2564.cs2 new file mode 100644 index 000000000..385f266f9 --- /dev/null +++ b/dumps/scripts/2564.cs2 @@ -0,0 +1,5 @@ +void script_2564() { + globalint_839 = bitconfig_6351; + script_2565(); + return; +} diff --git a/dumps/scripts/2565.cs2 b/dumps/scripts/2565.cs2 new file mode 100644 index 000000000..25f67db11 --- /dev/null +++ b/dumps/scripts/2565.cs2 @@ -0,0 +1,9 @@ +void script_2565() { + int ivar0; + ivar0 = 0; + globalint_846 = bitconfig_6380; + setWidgetText(new WidgetPointer(863,30), intToStr(bitconfig_6380)); + ivar0 = subtract(globalint_839, multiply(100, globalint_846)); + setWidgetText(new WidgetPointer(863,14), script_46(ivar0, ",")); + return; +} diff --git a/dumps/scripts/2566.cs2 b/dumps/scripts/2566.cs2 new file mode 100644 index 000000000..35c91da8d --- /dev/null +++ b/dumps/scripts/2566.cs2 @@ -0,0 +1,20 @@ +void script_2566() { + setWidgetText(new WidgetPointer(843,7), globalstring_182); + setWidgetText(new WidgetPointer(843,8), globalstring_183); + if (((boolean)globalint_945)) { + setWidgetModel(47798, new WidgetPointer(843,18)); + } else if (((boolean)globalint_945)) { + setWidgetModel(47794, new WidgetPointer(843,18)); + } else if (globalint_945 == 2) { + setWidgetModel(47792, new WidgetPointer(843,18)); + } else if (globalint_945 == 3) { + setWidgetModel(47786, new WidgetPointer(843,18)); + } else if (globalint_945 == 4) { + setWidgetModel(47787, new WidgetPointer(843,18)); + } else { + if (globalint_945 == 5) { + setWidgetModel(47796, new WidgetPointer(843,18)); + } + } + return; +} diff --git a/dumps/scripts/2567.cs2 b/dumps/scripts/2567.cs2 new file mode 100644 index 000000000..a10c89ecc --- /dev/null +++ b/dumps/scripts/2567.cs2 @@ -0,0 +1,44 @@ +void script_2567() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = -1; + ivar5 = 5; + ivar1 = divide(subtract(getWidgetActualWidth(new WidgetPointer(842,17)), multiply(36, ivar5)), subtract(ivar5, 1)); + ivar2 = divide(subtract(getWidgetActualHeight(new WidgetPointer(842,17)), 128), 3); + if (getItemAmtInContainer(93, 15001) > 0) { + ivar4 = 1991; + } else if (getItemAmtInContainer(93, 15002) > 0) { + ivar4 = 1995; + } else if (getItemAmtInContainer(93, 15003) > 0) { + ivar4 = 1998; + } else { + if (getItemAmtInContainer(93, 15004) > 0) { + ivar4 = 1999; + } + } + while (((boolean)ivar3)) { + if (cs2method_3408(105, 79, ivar4, ivar0) != 1511) { + createExtraChild(new WidgetPointer(842,17), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar1), mod(ivar0, ivar5)), multiply(divide(ivar0, ivar5), add(32, ivar2)), 0, 0); + setItemOnWidgetMethod1200(cs2method_3408(105, 79, ivar4, ivar0), -1); + cs2method1305("" + getItemName(cs2method_3408(105, 79, ivar4, ivar0))); + setWidgetContextMenuOption(1, "Withdraw"); + setWidgetContextMenuOption(2, "Examine"); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + ivar0 = add(ivar0, 1); + } else { + ivar3 = 1; + } + } + return; +} diff --git a/dumps/scripts/2568.cs2 b/dumps/scripts/2568.cs2 new file mode 100644 index 000000000..58dd64f53 --- /dev/null +++ b/dumps/scripts/2568.cs2 @@ -0,0 +1,129 @@ +void script_2568() { + if (setWidgetRegister(new WidgetPointer(842,17), 0)) { + if (((boolean)globalint_857)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 1)) { + if (((boolean)globalint_858)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 2)) { + if (((boolean)globalint_859)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 3)) { + if (((boolean)globalint_860)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 4)) { + if (((boolean)globalint_861)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 5)) { + if (((boolean)globalint_862)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 6)) { + if (((boolean)globalint_863)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 7)) { + if (((boolean)globalint_864)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 8)) { + if (((boolean)globalint_865)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 9)) { + if (((boolean)globalint_866)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 10)) { + if (((boolean)globalint_867)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 11)) { + if (((boolean)globalint_868)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 12)) { + if (((boolean)globalint_869)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 13)) { + if (((boolean)globalint_870)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 14)) { + if (((boolean)globalint_871)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 15)) { + if (((boolean)globalint_872)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 16)) { + if (((boolean)globalint_873)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + if (setWidgetRegister(new WidgetPointer(842,17), 17)) { + if (((boolean)globalint_874)) { + cs2method2103(190); + } else { + cs2method2103(0); + } + } + return; +} diff --git a/dumps/scripts/2569.cs2 b/dumps/scripts/2569.cs2 new file mode 100644 index 000000000..0409a4036 --- /dev/null +++ b/dumps/scripts/2569.cs2 @@ -0,0 +1,10 @@ +void script_2569() { + setWidgetIsHidden(true, new WidgetPointer(292,130)); + if (((boolean)getLanguage())) { + setWidgetFont(496, new WidgetPointer(292,124)); + } else { + setWidgetFont(494, new WidgetPointer(292,124)); + } + script_2570(); + return; +} diff --git a/dumps/scripts/257.cs2 b/dumps/scripts/257.cs2 new file mode 100644 index 000000000..34d22b5c7 --- /dev/null +++ b/dumps/scripts/257.cs2 @@ -0,0 +1,113 @@ +void script_257() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + if ((((((((boolean)globalint_1111) || ((boolean)globalint_1112)) || ((boolean)globalint_1113)) || ((boolean)globalint_1114)) || ((boolean)globalint_1115)) || ((boolean)globalint_1116)) || (globalint_1117 == -1)) { + return; + } + ivar0 = multiply(getExtraChildGap(new WidgetPointer(919,7)), add(18, 4)); + ivar1 = multiply(add(getExtraChildGap(new WidgetPointer(919,7)), 1), add(18, 4)); + setWidgetScrollMax(getWidgetScrollMaxH(new WidgetPointer(919,6)), ivar1, new WidgetPointer(919,6)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(919,8)), ivar1, 0, 0, new WidgetPointer(919,8)); + createExtraChild(new WidgetPointer(919,8), 4, getExtraChildGap(new WidgetPointer(919,8))); + setWidgetRGB(new Color(164, 164, 103)); + setWidgetSize(16384, 18, 2, 0); + setWidgetPosition(0, ivar0, 0, 2); + setWidgetFont(494); + setWidgetText(script_1668(globalint_1111)); + setWidgetTextAlignment(1, 1, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(919,7)), ivar1, 0, 0, new WidgetPointer(919,7)); + createExtraChild(new WidgetPointer(919,7), 4, getExtraChildGap(new WidgetPointer(919,7))); + setWidgetRGB(new Color(164, 164, 103)); + setWidgetSize(16384, 18, 2, 0); + setWidgetPosition(0, ivar0, 0, 2); + setWidgetFont(494); + setWidgetText(script_276(globalint_1113)); + setWidgetTextAlignment(1, 1, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(919,9)), ivar1, 0, 0, new WidgetPointer(919,9)); + createExtraChild(new WidgetPointer(919,9), 4, getExtraChildGap(new WidgetPointer(919,9))); + setWidgetRGB(new Color(164, 164, 103)); + setWidgetSize(16384, 18, 2, 0); + setWidgetPosition(0, ivar0, 0, 2); + setWidgetFont(494); + setWidgetText(intToStr(globalint_1112)); + setWidgetTextAlignment(1, 1, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(919,10)), ivar1, 0, 0, new WidgetPointer(919,10)); + createExtraChild(new WidgetPointer(919,10), 5, getExtraChildGap(new WidgetPointer(919,10))); + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(0, add(ivar0, 2), 1, 2); + svar0 = ""; + ivar2 = -1; + switch (globalint_1114) { + case 1: + ivar2 = 15658; + svar0 = "Worm"; + break; + case 2: + ivar2 = 15659; + svar0 = "Maggot"; + break; + case 3: + ivar2 = 15662; + svar0 = "Cricket"; + break; + case 4: + ivar2 = 15663; + svar0 = "Locust"; + break; + case 5: + ivar2 = 15661; + svar0 = "Crayfish"; + break; + case 6: + ivar2 = 15660; + svar0 = "Shrimp"; + break; + case 7: + ivar2 = 15664; + svar0 = "Green moth"; + break; + case 8: + ivar2 = 15665; + svar0 = "Grey moth"; + } + setItemOnWidgetMethod1205(ivar2, 0); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(919,20), svar0, 25, 128, "IIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(919,20), "I"); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(919,11)), ivar1, 0, 0, new WidgetPointer(919,11)); + createExtraChild(new WidgetPointer(919,11), 4, getExtraChildGap(new WidgetPointer(919,11))); + setWidgetRGB(new Color(164, 164, 103)); + setWidgetSize(16384, 18, 2, 0); + setWidgetPosition(0, ivar0, 0, 2); + setWidgetFont(494); + setWidgetText(script_278(globalint_1115)); + setWidgetTextAlignment(1, 1, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(919,12)), ivar1, 0, 0, new WidgetPointer(919,12)); + createExtraChild(new WidgetPointer(919,12), 4, getExtraChildGap(new WidgetPointer(919,12))); + setWidgetRGB(new Color(164, 164, 103)); + setWidgetSize(16384, 18, 2, 0); + setWidgetPosition(0, ivar0, 0, 2); + setWidgetFont(494); + setWidgetText(intToStr(globalint_1116)); + setWidgetTextAlignment(1, 1, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(919,13)), ivar1, 0, 0, new WidgetPointer(919,13)); + createExtraChild(new WidgetPointer(919,13), 4, getExtraChildGap(new WidgetPointer(919,13))); + setWidgetRGB(new Color(164, 164, 103)); + setWidgetSize(16384, 18, 2, 0); + setWidgetPosition(0, ivar0, 0, 2); + setWidgetFont(494); + setWidgetText(intToStr(globalint_1117) + "%"); + setWidgetTextAlignment(1, 1, 0); + if (getWidgetActualHeight(new WidgetPointer(919,1)) == 185) { + script_31(60227589, 60227590, 792, 789, 790, 791, 773, 788); + } + globalint_1111 = 0; + globalint_1112 = 0; + globalint_1113 = 0; + globalint_1114 = 0; + globalint_1115 = 0; + globalint_1116 = 0; + globalint_1117 = -1; + return; +} diff --git a/dumps/scripts/2570.cs2 b/dumps/scripts/2570.cs2 new file mode 100644 index 000000000..d1ab5ede1 --- /dev/null +++ b/dumps/scripts/2570.cs2 @@ -0,0 +1,97 @@ +void script_2570() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = -1; + globalint_930 = -1; + globalint_931 = -1; + globalint_932 = -1; + globalint_933 = -1; + globalint_934 = -1; + globalint_935 = -1; + globalint_936 = -1; + globalint_937 = -1; + globalint_938 = -1; + globalint_939 = -1; + if ((bitconfig_6429 > 0) && (bitconfig_6429 < 11)) { + globalint_929 = subtract(bitconfig_6429, 1); + } else { + globalint_929 = 0; + } + while ((ivar1 < 10) && (ivar0 < 28)) { + ivar2 = getItemIdInSlot(93, ivar0); + if (((boolean)getItemHashmapData(ivar2, 802)) || ((boolean)getItemHashmapData(ivar2, 803))) { + setWidgetText(cs2method_3408(105, 73, 2423, ivar1), "Squad " + intToStr(add(ivar1, 1))); + if (((boolean)getItemHashmapData(ivar2, 806))) { + setWidgetSprite(2023, cs2method_3408(105, 73, 2427, ivar1)); + } else { + if (((boolean)getItemHashmapData(ivar2, 806))) { + setWidgetSprite(2022, cs2method_3408(105, 73, 2427, ivar1)); + } + } + if (((boolean)getItemHashmapData(ivar2, 805))) { + setWidgetSprite(2016, cs2method_3408(105, 73, 2426, ivar1)); + } else if (getItemHashmapData(ivar2, 805) == 2) { + setWidgetSprite(2018, cs2method_3408(105, 73, 2426, ivar1)); + } else { + if (getItemHashmapData(ivar2, 805) == 3) { + setWidgetSprite(2017, cs2method_3408(105, 73, 2426, ivar1)); + } + } + if (((boolean)getItemHashmapData(ivar2, 803))) { + setWidgetRGB(new Color(204, 0, 0), cs2method_3408(105, 73, 2429, ivar1)); + } else { + setWidgetRGB(new Color(0, 0, 0), cs2method_3408(105, 73, 2429, ivar1)); + } + switch (ivar1) { + case 0: + globalint_930 = ivar0; + break; + case 1: + globalint_931 = ivar0; + break; + case 2: + globalint_932 = ivar0; + break; + case 3: + globalint_933 = ivar0; + break; + case 4: + globalint_934 = ivar0; + break; + case 5: + globalint_935 = ivar0; + break; + case 6: + globalint_936 = ivar0; + break; + case 7: + globalint_937 = ivar0; + break; + case 8: + globalint_938 = ivar0; + break; + case 9: + globalint_939 = ivar0; + } + ivar1 = add(ivar1, 1); + } + ivar0 = add(ivar0, 1); + } + if ((ivar1 < 10) && (ivar1 < 10)) { + while (true) { + setWidgetText(cs2method_3408(105, 73, 2423, ivar1), "No squad"); + setWidgetText(cs2method_3408(105, 73, 2424, ivar1), ""); + setWidgetSprite(-1, cs2method_3408(105, 73, 2427, ivar1)); + setWidgetSprite(-1, cs2method_3408(105, 73, 2426, ivar1)); + setScriptCallOnClickContextMenu(-1, "", cs2method_3408(105, 73, 2422, ivar1)); + setWidgetNoOptions(cs2method_3408(105, 73, 2422, ivar1)); + ivar1 = add(ivar1, 1); + } + } + script_2599(); + script_2573(); + return; +} diff --git a/dumps/scripts/2571.cs2 b/dumps/scripts/2571.cs2 new file mode 100644 index 000000000..bf6b73c30 --- /dev/null +++ b/dumps/scripts/2571.cs2 @@ -0,0 +1,8 @@ +void script_2571(int arg0) { + if (add(getContainerIntNodeCountIgnoreStacks(93, 803), getContainerIntNodeCountIgnoreStacks(93, 802)) < add(1, arg0)) { + return; + } + globalint_929 = arg0; + script_2573(); + return; +} diff --git a/dumps/scripts/2572.cs2 b/dumps/scripts/2572.cs2 new file mode 100644 index 000000000..8b6c852da --- /dev/null +++ b/dumps/scripts/2572.cs2 @@ -0,0 +1,12 @@ +void script_2572() { + if (add(getContainerIntNodeCountIgnoreStacks(93, 803), getContainerIntNodeCountIgnoreStacks(93, 802)) < bitconfig_6429) { + return; + } + if ((bitconfig_6429 > 0) && (bitconfig_6429 < 11)) { + globalint_929 = subtract(bitconfig_6429, 1); + } else { + globalint_929 = 0; + } + script_2573(); + return; +} diff --git a/dumps/scripts/2573.cs2 b/dumps/scripts/2573.cs2 new file mode 100644 index 000000000..dadc61011 --- /dev/null +++ b/dumps/scripts/2573.cs2 @@ -0,0 +1,58 @@ +void script_2573() { + int ivar0; + ivar0 = -1; + switch (globalint_929) { + case 0: + ivar0 = getItemIdInSlot(93, globalint_930); + break; + case 1: + ivar0 = getItemIdInSlot(93, globalint_931); + break; + case 2: + ivar0 = getItemIdInSlot(93, globalint_932); + break; + case 3: + ivar0 = getItemIdInSlot(93, globalint_933); + break; + case 4: + ivar0 = getItemIdInSlot(93, globalint_934); + break; + case 5: + ivar0 = getItemIdInSlot(93, globalint_935); + break; + case 6: + ivar0 = getItemIdInSlot(93, globalint_936); + break; + case 7: + ivar0 = getItemIdInSlot(93, globalint_937); + break; + case 8: + ivar0 = getItemIdInSlot(93, globalint_938); + break; + case 9: + ivar0 = getItemIdInSlot(93, globalint_939); + } + if ((ivar0 == -1) || ((getItemHashmapData(ivar0, 802) != 1) && (getItemHashmapData(ivar0, 803) != 1))) { + return; + } + script_2575(); + setWidgetText(new WidgetPointer(292,99), getItemName(ivar0)); + setItemOnWidgetMethod2200(ivar0, -1, new WidgetPointer(292,112)); + if (((boolean)getItemHashmapData(ivar0, 802))) { + script_2578(); + script_2584(); + script_2585(); + script_2588(); + script_2591(); + } else { + if (((boolean)getItemHashmapData(ivar0, 803))) { + script_2590(); + script_2587(); + script_2579(); + script_2580(); + script_2583(); + script_2597(); + } + } + return; +} diff --git a/dumps/scripts/2574.cs2 b/dumps/scripts/2574.cs2 new file mode 100644 index 000000000..03ad256cc --- /dev/null +++ b/dumps/scripts/2574.cs2 @@ -0,0 +1,41 @@ +void script_2574() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = multiplyDivide(bitconfig_6457, 1000, 100); + if (ivar2 < 1) { + ivar2 = 1; + } + if (ivar2 > 100) { + ivar2 = 100; + } + ivar0 = cs2method_3408(105, 105, 197, ivar2); + ivar1 = cs2method_3408(105, 105, 198, ivar2); + if (((boolean)bitconfig_5095)) { + setWidgetPosition(481, ivar0, 0, 0, new WidgetPointer(781,46)); + setWidgetSize(16, ivar1, 0, 0, new WidgetPointer(781,46)); + } else { + if (bitconfig_5095 == 2) { + setWidgetPosition(481, ivar0, 0, 0, new WidgetPointer(781,37)); + setWidgetSize(16, ivar1, 0, 0, new WidgetPointer(781,37)); + } + } + if (ivar2 < 25) { + if (((boolean)bitconfig_5095)) { + setWidgetRGB(new Color(255, 153, 0), new WidgetPointer(781,46)); + } else { + if (bitconfig_5095 == 2) { + setWidgetRGB(new Color(255, 153, 0), new WidgetPointer(781,37)); + } + } + } else if (((boolean)bitconfig_5095)) { + setWidgetRGB(new Color(102, 102, 0), new WidgetPointer(781,46)); + } else { + if (bitconfig_5095 == 2) { + setWidgetRGB(new Color(40, 70, 5), new WidgetPointer(781,37)); + } + } + return; +} diff --git a/dumps/scripts/2575.cs2 b/dumps/scripts/2575.cs2 new file mode 100644 index 000000000..0ff0cea72 --- /dev/null +++ b/dumps/scripts/2575.cs2 @@ -0,0 +1,10 @@ +void script_2575() { + int ivar0; + ivar0 = 0; + while (ivar0 < getCommonDefinitionSize(2428)) { + setWidgetRGB(new Color(102, 102, 102), cs2method_3408(105, 73, 2428, ivar0)); + ivar0 = add(ivar0, 1); + } + setWidgetRGB(new Color(255, 0, 51), cs2method_3408(105, 73, 2428, globalint_929)); + return; +} diff --git a/dumps/scripts/2576.cs2 b/dumps/scripts/2576.cs2 new file mode 100644 index 000000000..2139b0974 --- /dev/null +++ b/dumps/scripts/2576.cs2 @@ -0,0 +1,26 @@ +void script_2576(int arg0,int arg1) { + string svar0; + svar0 = ""; + switch (arg0) { + case 51183658: + case 51183649: + svar0 = "How much time is left for this round."; + break; + case 51183659: + case 51183650: + svar0 = "How many orbs the green team have captured this round."; + break; + case 51183660: + case 51183651: + svar0 = "How many orbs the yellow team have captured this round."; + break; + case 51183662: + case 51183653: + svar0 = "How active you have been during this round."; + break; + default: + return; + } + script_39(arg0, arg1, 25, getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg1)))), svar0); + return; +} diff --git a/dumps/scripts/2577.cs2 b/dumps/scripts/2577.cs2 new file mode 100644 index 000000000..92c0662a6 --- /dev/null +++ b/dumps/scripts/2577.cs2 @@ -0,0 +1,10 @@ +void script_2577(int arg0,int arg1,int arg2) { + if (getItemAmtInContainer(93, 995) < arg1) { + setWidgetRGB(new Color(204, 0, 0), new WidgetPointer(arg0)); + } else if (getSkillActualLvl(22) < arg2) { + setWidgetRGB(new Color(204, 204, 0), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(0, 204, 0), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2578.cs2 b/dumps/scripts/2578.cs2 new file mode 100644 index 000000000..ed77c09bf --- /dev/null +++ b/dumps/scripts/2578.cs2 @@ -0,0 +1,8 @@ +void script_2578() { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(292,114)); + setWidgetSprite(941, new WidgetPointer(292,113)); + setWidgetNoOptions(new WidgetPointer(292,113)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(292,113)); + setScriptCallOnMousePressed(2606, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,113)); + return; +} diff --git a/dumps/scripts/2579.cs2 b/dumps/scripts/2579.cs2 new file mode 100644 index 000000000..1f82fcba5 --- /dev/null +++ b/dumps/scripts/2579.cs2 @@ -0,0 +1,10 @@ +void script_2579() { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(292,117)); + setWidgetNoOptions(new WidgetPointer(292,102)); + setWidgetNoOptions(new WidgetPointer(292,104)); + setWidgetNoOptions(new WidgetPointer(292,103)); + setScriptCallOnMousePressed(2606, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,102)); + setScriptCallOnMousePressed(2606, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,104)); + setScriptCallOnMousePressed(2606, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,103)); + return; +} diff --git a/dumps/scripts/258.cs2 b/dumps/scripts/258.cs2 new file mode 100644 index 000000000..caf7ee98d --- /dev/null +++ b/dumps/scripts/258.cs2 @@ -0,0 +1,4 @@ +void script_258(int arg0,int arg1) { + cs2method2103(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2580.cs2 b/dumps/scripts/2580.cs2 new file mode 100644 index 000000000..c50fbe5dc --- /dev/null +++ b/dumps/scripts/2580.cs2 @@ -0,0 +1,8 @@ +void script_2580() { + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(292,116)); + setWidgetNoOptions(new WidgetPointer(292,110)); + setWidgetNoOptions(new WidgetPointer(292,111)); + setScriptCallOnMousePressed(2606, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,110)); + setScriptCallOnMousePressed(2606, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,111)); + return; +} diff --git a/dumps/scripts/2581.cs2 b/dumps/scripts/2581.cs2 new file mode 100644 index 000000000..b0a65642e --- /dev/null +++ b/dumps/scripts/2581.cs2 @@ -0,0 +1,50 @@ +int script_2581(int arg0) { + switch (arg0) { + case 830: + if (cs2method6102() || (cs2method6131() != 0)) { + return script_42(((int)cs2method6103())); + } + return -1; + case 831: + return script_42(((int)cs2method6105())); + case 833: + return cs2method6129(); + case 834: + return script_42(((int)cs2method6108())); + case 836: + return script_42(((int)cs2method6110())); + case 837: + return cs2method6111(); + case 838: + return script_42(((int)cs2method6112())); + case 839: + return script_42(((int)cs2method6114())); + case 840: + return script_42(((int)cs2method6115())); + case 841: + return cs2method6116(); + case 842: + return cs2method6123(); + case 843: + return script_42(((int)cs2method6130())); + case 844: + if (cs2method6133()) { + return script_42(globalint_987); + } + return -1; + case 845: + return globalint_178; + case 908: + return cs2method6135(); + case 963: + return script_42(((int)cs2method6136())); + case 1009: + return cs2method6139(); + case 2430: + if (cs2method7215()) { + return cs2method6149(); + } + return -1; + } + return -1; +} diff --git a/dumps/scripts/2582.cs2 b/dumps/scripts/2582.cs2 new file mode 100644 index 000000000..a6d1665f4 --- /dev/null +++ b/dumps/scripts/2582.cs2 @@ -0,0 +1,116 @@ +int script_2582(int arg0,int arg1,int arg2) { + int stack_dump0; + opcStruct5303(2,0,0) structdump_1; + switch (arg0) { + case 830: + cs2method6003(((boolean)script_734(arg1))); + break; + case 831: + cs2method6005(((boolean)script_734(arg1))); + break; + case 833: + cs2method6029(((boolean)arg1)); + break; + case 834: + cs2method6008(((boolean)script_734(arg1))); + break; + case 836: + cs2method6010(((boolean)script_734(arg1))); + break; + case 837: + if ((arg1 > 0) && cs2method6136()) { + cs2method6034(true); + } + cs2method6011(arg1); + break; + case 838: + cs2method6012(((boolean)script_734(arg1))); + break; + case 839: + cs2method6014(((boolean)script_734(arg1))); + break; + case 840: + if (((boolean)arg1) && (((boolean)cs2method6131()) || (cs2method6131() == 2))) { + cs2method6014(false); + cs2method6015(false); + } else { + if (cs2method6130()) { + cs2method6030(true); + } + cs2method6015(((boolean)script_734(arg1))); + } + break; + case 841: + cs2method6016(arg1); + if (((arg1 > 0) && (cs2method6131() != 0)) && (cs2method6131() != 2)) { + script_2700(4, arg2, 0, 1); + return 2; + } + cs2method6024(arg1); + break; + case 842: + if (cs2method7206() || ((boolean)cs2method7306(arg1))) { + return 0; + } + cs2method6023(arg1); + return 1; + case 843: + if (((boolean)arg1) && (((boolean)cs2method6131()) || (cs2method6131() == 2))) { + cs2method6014(false); + cs2method6015(false); + cs2method6034(false); + cs2method6030(false); + } else { + cs2method6030(((boolean)script_734(arg1))); + } + break; + case 844: + globalint_987 = script_734(arg1); + cs2method6028(((boolean)globalint_987)); + break; + case 845: + globalint_178 = arg1; + if (getDisplayMode() == 3) { + stack_dump0 = arg1; + structdump_1 = cs2method5303(stack_dump0); + if (cs2method5300(structdump_1.intpart_0, structdump_1.intpart_1)) { + script_2700(2, arg2, 0, 0); + return 2; + } + return 0; + } + break; + case 908: + cs2method6033(arg1); + break; + case 963: + if (((boolean)arg1)) { + cs2method6011(0); + } else { + if (cs2method6130()) { + cs2method6030(true); + } + } + cs2method6034(((boolean)script_734(arg1))); + break; + case 1009: + if (cs2method7211() && ((boolean)cs2method7311(arg1))) { + cs2method6036(arg1); + return 1; + } + return 0; + case 2430: + if (cs2method7215()) { + if (cs2method7315(arg1) == 3) { + return 0; + } + cs2method6041(arg1); + } else { + return 0; + } + break; + default: + return 0; + } + return 1; +} diff --git a/dumps/scripts/2583.cs2 b/dumps/scripts/2583.cs2 new file mode 100644 index 000000000..b5e23c272 --- /dev/null +++ b/dumps/scripts/2583.cs2 @@ -0,0 +1,7 @@ +void script_2583() { + setWidgetRGB(new Color(255, 153, 53), new WidgetPointer(292,114)); + setWidgetContextMenuOption(1, new WidgetPointer(292,113), "Resupply"); + setScriptCallOnClickContextMenu(2592, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,113)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(292,113)); + return; +} diff --git a/dumps/scripts/2584.cs2 b/dumps/scripts/2584.cs2 new file mode 100644 index 000000000..239d1767c --- /dev/null +++ b/dumps/scripts/2584.cs2 @@ -0,0 +1,13 @@ +void script_2584() { + setWidgetRGB(new Color(255, 153, 53), new WidgetPointer(292,117)); + setWidgetContextMenuOption(1, new WidgetPointer(292,102), "Select dwarf"); + setWidgetContextMenuOption(1, new WidgetPointer(292,104), "Select goblin"); + setWidgetContextMenuOption(1, new WidgetPointer(292,103), "Select elf"); + setScriptCallOnClickContextMenu(2586, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,102)); + setScriptCallOnClickContextMenu(2586, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,104)); + setScriptCallOnClickContextMenu(2586, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,103)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(292,102)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(292,104)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(292,103)); + return; +} diff --git a/dumps/scripts/2585.cs2 b/dumps/scripts/2585.cs2 new file mode 100644 index 000000000..8e09d21fe --- /dev/null +++ b/dumps/scripts/2585.cs2 @@ -0,0 +1,10 @@ +void script_2585() { + setWidgetRGB(new Color(255, 153, 53), new WidgetPointer(292,116)); + setWidgetContextMenuOption(1, new WidgetPointer(292,110), "Select light"); + setWidgetContextMenuOption(1, new WidgetPointer(292,111), "Select heavy"); + setScriptCallOnClickContextMenu(2589, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,110)); + setScriptCallOnClickContextMenu(2589, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,111)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(292,110)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(292,111)); + return; +} diff --git a/dumps/scripts/2586.cs2 b/dumps/scripts/2586.cs2 new file mode 100644 index 000000000..0ca1d5e7b --- /dev/null +++ b/dumps/scripts/2586.cs2 @@ -0,0 +1,5 @@ +void script_2586(int arg0) { + script_2587(); + setWidgetSprite(1135, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2587.cs2 b/dumps/scripts/2587.cs2 new file mode 100644 index 000000000..2304749c0 --- /dev/null +++ b/dumps/scripts/2587.cs2 @@ -0,0 +1,6 @@ +void script_2587() { + setWidgetSprite(1134, new WidgetPointer(292,102)); + setWidgetSprite(1134, new WidgetPointer(292,104)); + setWidgetSprite(1134, new WidgetPointer(292,103)); + return; +} diff --git a/dumps/scripts/2588.cs2 b/dumps/scripts/2588.cs2 new file mode 100644 index 000000000..3024cbd78 --- /dev/null +++ b/dumps/scripts/2588.cs2 @@ -0,0 +1,103 @@ +void script_2588() { + int ivar0; + int ivar1; + script_2587(); + ivar0 = -1; + switch (globalint_929) { + case 0: + ivar0 = getItemIdInSlot(93, globalint_930); + break; + case 1: + ivar0 = getItemIdInSlot(93, globalint_931); + break; + case 2: + ivar0 = getItemIdInSlot(93, globalint_932); + break; + case 3: + ivar0 = getItemIdInSlot(93, globalint_933); + break; + case 4: + ivar0 = getItemIdInSlot(93, globalint_934); + break; + case 5: + ivar0 = getItemIdInSlot(93, globalint_935); + break; + case 6: + ivar0 = getItemIdInSlot(93, globalint_936); + break; + case 7: + ivar0 = getItemIdInSlot(93, globalint_937); + break; + case 8: + ivar0 = getItemIdInSlot(93, globalint_938); + break; + case 9: + ivar0 = getItemIdInSlot(93, globalint_939); + } + if (ivar0 == -1) { + return; + } + ivar1 = getItemHashmapData(ivar0, 805); + switch (globalint_929) { + case 0: + if ((bitconfig_6385 != 0) && (bitconfig_6385 != ivar1)) { + ivar1 = bitconfig_6385; + } + break; + case 1: + if ((bitconfig_6386 != 0) && (bitconfig_6386 != ivar1)) { + ivar1 = bitconfig_6386; + } + break; + case 2: + if ((bitconfig_6387 != 0) && (bitconfig_6387 != ivar1)) { + ivar1 = bitconfig_6387; + } + break; + case 3: + if ((bitconfig_6388 != 0) && (bitconfig_6388 != ivar1)) { + ivar1 = bitconfig_6388; + } + break; + case 4: + if ((bitconfig_6389 != 0) && (bitconfig_6389 != ivar1)) { + ivar1 = bitconfig_6389; + } + break; + case 5: + if ((bitconfig_6390 != 0) && (bitconfig_6390 != ivar1)) { + ivar1 = bitconfig_6390; + } + break; + case 6: + if ((bitconfig_6391 != 0) && (bitconfig_6391 != ivar1)) { + ivar1 = bitconfig_6391; + } + break; + case 7: + if ((bitconfig_6392 != 0) && (bitconfig_6392 != ivar1)) { + ivar1 = bitconfig_6392; + } + break; + case 8: + if ((bitconfig_6393 != 0) && (bitconfig_6393 != ivar1)) { + ivar1 = bitconfig_6393; + } + break; + case 9: + if ((bitconfig_6394 != 0) && (bitconfig_6394 != ivar1)) { + ivar1 = bitconfig_6394; + } + } + switch (ivar1) { + case 1: + setWidgetSprite(1135, new WidgetPointer(292,102)); + break; + case 2: + setWidgetSprite(1135, new WidgetPointer(292,104)); + break; + case 3: + setWidgetSprite(1135, new WidgetPointer(292,103)); + } + return; +} diff --git a/dumps/scripts/2589.cs2 b/dumps/scripts/2589.cs2 new file mode 100644 index 000000000..2b45baa35 --- /dev/null +++ b/dumps/scripts/2589.cs2 @@ -0,0 +1,5 @@ +void script_2589(int arg0) { + script_2590(); + setWidgetSprite(1135, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/259.cs2 b/dumps/scripts/259.cs2 new file mode 100644 index 000000000..e8f30954a --- /dev/null +++ b/dumps/scripts/259.cs2 @@ -0,0 +1,5 @@ +void script_259(int arg0) { + cs2method2103(255, new WidgetPointer(arg0)); + script_41(60489816); + return; +} diff --git a/dumps/scripts/2590.cs2 b/dumps/scripts/2590.cs2 new file mode 100644 index 000000000..df624cd37 --- /dev/null +++ b/dumps/scripts/2590.cs2 @@ -0,0 +1,5 @@ +void script_2590() { + setWidgetSprite(1134, new WidgetPointer(292,110)); + setWidgetSprite(1134, new WidgetPointer(292,111)); + return; +} diff --git a/dumps/scripts/2591.cs2 b/dumps/scripts/2591.cs2 new file mode 100644 index 000000000..ff3fa3d7e --- /dev/null +++ b/dumps/scripts/2591.cs2 @@ -0,0 +1,140 @@ +void script_2591() { + int ivar0; + int ivar1; + script_2590(); + ivar0 = -1; + switch (globalint_929) { + case 0: + ivar0 = getItemIdInSlot(93, globalint_930); + break; + case 1: + ivar0 = getItemIdInSlot(93, globalint_931); + break; + case 2: + ivar0 = getItemIdInSlot(93, globalint_932); + break; + case 3: + ivar0 = getItemIdInSlot(93, globalint_933); + break; + case 4: + ivar0 = getItemIdInSlot(93, globalint_934); + break; + case 5: + ivar0 = getItemIdInSlot(93, globalint_935); + break; + case 6: + ivar0 = getItemIdInSlot(93, globalint_936); + break; + case 7: + ivar0 = getItemIdInSlot(93, globalint_937); + break; + case 8: + ivar0 = getItemIdInSlot(93, globalint_938); + break; + case 9: + ivar0 = getItemIdInSlot(93, globalint_939); + } + if (ivar0 == -1) { + return; + } + ivar1 = getItemHashmapData(ivar0, 806); + switch (globalint_929) { + case 0: + if (((boolean)bitconfig_6415)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + break; + case 1: + if (((boolean)bitconfig_6416)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + break; + case 2: + if (((boolean)bitconfig_6417)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + break; + case 3: + if (((boolean)bitconfig_6418)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + break; + case 4: + if (((boolean)bitconfig_6419)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + break; + case 5: + if (((boolean)bitconfig_6420)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + break; + case 6: + if (((boolean)bitconfig_6421)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + break; + case 7: + if (((boolean)bitconfig_6422)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + break; + case 8: + if (((boolean)bitconfig_6423)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + break; + case 9: + if (((boolean)bitconfig_6424)) { + if (((boolean)ivar1)) { + ivar1 = 1; + } else { + ivar1 = 0; + } + } + } + switch (ivar1) { + case 0: + setWidgetSprite(1135, new WidgetPointer(292,110)); + break; + case 1: + setWidgetSprite(1135, new WidgetPointer(292,111)); + } + return; +} diff --git a/dumps/scripts/2592.cs2 b/dumps/scripts/2592.cs2 new file mode 100644 index 000000000..6b3137f3c --- /dev/null +++ b/dumps/scripts/2592.cs2 @@ -0,0 +1,9 @@ +void script_2592(int arg0) { + playSoundEffect(6784, 1, 0); + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 941) { + setWidgetSprite(942, new WidgetPointer(arg0)); + } else { + setWidgetSprite(941, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2593.cs2 b/dumps/scripts/2593.cs2 new file mode 100644 index 000000000..056e4e866 --- /dev/null +++ b/dumps/scripts/2593.cs2 @@ -0,0 +1,17 @@ +void script_2593(int arg0) { + if (((boolean)arg0) || (arg0 == 2)) { + if (cs2method6130()) { + cs2method6014(false); + cs2method6015(false); + cs2method6034(false); + } else { + if (cs2method6115()) { + cs2method6014(false); + } + } + } + if ((arg0 == 2) && cs2method6136()) { + cs2method6011(0); + } + return; +} diff --git a/dumps/scripts/2594.cs2 b/dumps/scripts/2594.cs2 new file mode 100644 index 000000000..bda8ab897 --- /dev/null +++ b/dumps/scripts/2594.cs2 @@ -0,0 +1,4 @@ +void script_2594() { + script_2595(1); + return; +} diff --git a/dumps/scripts/2595.cs2 b/dumps/scripts/2595.cs2 new file mode 100644 index 000000000..06cde6a46 --- /dev/null +++ b/dumps/scripts/2595.cs2 @@ -0,0 +1,14 @@ +void script_2595(int arg0) { + int ivar1; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_2692_struct(2,0,0) structdump_3; + ivar1 = cs2method6131(); + stack_dump0 = ivar1; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar1; + structdump_3 = script_2692(stack_dump2); + script_2596(stack_dump0, stack_dump1, structdump_3.intpart_0, structdump_3.intpart_1, arg0); + return; +} diff --git a/dumps/scripts/2596.cs2 b/dumps/scripts/2596.cs2 new file mode 100644 index 000000000..446e74b4b --- /dev/null +++ b/dumps/scripts/2596.cs2 @@ -0,0 +1,109 @@ +void script_2596(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar5 = -1; + ivar6 = -1; + switch (arg4) { + case 1: + setWidgetText(new WidgetPointer(742,19), "Graphics Options"); + openInterface(48627718, 978); + ivar5 = 48627716; + ivar6 = 48627732; + setWidgetSize(0, 0, 1, 1, new WidgetPointer(978,5)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(742,4)), 304, 0, 0, new WidgetPointer(742,4)); + setScriptCallOnMousePressed(29, "", new WidgetPointer(742,18)); + setWidgetContextMenuOption(1, new WidgetPointer(742,18), "Close"); + break; + case 0: + openInterface(57802780, 978); + setWidgetSprite(4129, new WidgetPointer(882,11)); + setWidgetSprite(4129, new WidgetPointer(882,12)); + setWidgetSprite(4129, new WidgetPointer(882,14)); + ivar5 = 57802756; + ivar6 = 57802757; + script_1217(57802808, 57802809); + script_1216(57802801, 57802802); + script_1218(57802815, 57802816); + script_1220(57802834, 57802832); + setWidgetPosition(0, 5, 1, 0, new WidgetPointer(978,0)); + setWidgetPosition(0, 5, 1, 0, new WidgetPointer(978,5)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(882,28)), add(add(add(add(getWidgetActualY(new WidgetPointer(978,0)), getWidgetActualY(new WidgetPointer(978,8))), getWidgetActualHeight(new WidgetPointer(978,0))), 5), getWidgetActualHeight(new WidgetPointer(882,29))), 0, 0, new WidgetPointer(882,28)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(882,28)), getWidgetActualHeight(new WidgetPointer(882,28)), 0, 0, new WidgetPointer(882,22)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(882,8)), add(getWidgetActualHeight(new WidgetPointer(882,22)), 47), 0, 0, new WidgetPointer(882,8)); + setWidgetPosition(0, add(getWidgetActualY(new WidgetPointer(882,8)), 33), 1, 0, new WidgetPointer(882,22)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(882,28)); + setWidgetPosition(0, 100, 1, 1, new WidgetPointer(882,29)); + setWidgetPosition(0, -5, 1, 1, new WidgetPointer(978,2)); + setWidgetIsHidden(false, new WidgetPointer(882,29)); + setWidgetIsHidden(true, new WidgetPointer(882,23)); + script_2918(0); + setScriptCallOnWidgetResize(2917, 0, "1", new WidgetPointer(882,4)); + setScriptCallOnWidgetResize(2919, 0, arg4, "1i", new WidgetPointer(744,50)); + break; + case 2: + openInterface(59703298, 978); + ivar5 = 59703296; + ivar6 = 59703355; + setWidgetPosition(0, 5, 1, 0, new WidgetPointer(978,0)); + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(978,5)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(911,2)), add(add(add(add(getWidgetActualY(new WidgetPointer(978,0)), getWidgetActualY(new WidgetPointer(978,8))), getWidgetActualHeight(new WidgetPointer(978,0))), 5), getWidgetActualHeight(new WidgetPointer(911,5))), 0, 0, new WidgetPointer(911,2)); + setWidgetIsHidden(false, new WidgetPointer(911,5)); + setWidgetIsHidden(true, new WidgetPointer(911,3)); + setScriptCallOnWidgetResize(2919, 0, arg4, "1i", new WidgetPointer(906,23)); + script_4041(); + } + setScriptCallOnMousePressed(3383, arg4, "i", new WidgetPointer(978,1)); + script_1149(1, arg1, 64094220, 64094229, 64094230, arg2, arg3, arg0, arg4); + script_1149(2, arg1, 64094221, 64094227, 64094228, arg2, arg3, arg0, arg4); + script_1149(3, arg1, 64094222, 64094225, 64094226, arg2, arg3, arg0, arg4); + setWidgetIsHidden(true, new WidgetPointer(ivar6)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar5)); + if (globalint_178 < 0) { + globalint_178 = max(cs2method5305(), 0); + } + if (globalint_178 >= cs2method5302()) { + globalint_178 = 0; + } + ivar7 = 64094224; + deleteAllExtraChilds(new WidgetPointer(ivar7)); + createExtraChild(new WidgetPointer(ivar7), 3, getExtraChildGap(new WidgetPointer(ivar7))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFilled(1); + setWidgetRGB(new Color(46, 43, 38)); + createExtraChild(new WidgetPointer(ivar7), 3, getExtraChildGap(new WidgetPointer(ivar7))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(95, 91, 82)); + ivar8 = getWidgetCustomChildArrayIndex(); + createExtraChild(new WidgetPointer(ivar7), 4, getExtraChildGap(new WidgetPointer(ivar7))); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + if (cs2method5302() <= 0) { + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetRGB(new Color(235, 224, 188)); + setWidgetText("N/A"); + } else { + setWidgetSize(21, 0, 1, 1); + setWidgetPosition(2, 0, 0, 1); + if (globalint_178 < subtract(cs2method5302(), 1)) { + setWidgetRGB(new Color(235, 224, 188)); + } else { + setWidgetRGB(new Color(0, 177, 225)); + } + setWidgetText(script_2693(globalint_178)); + createExtraChild(new WidgetPointer(ivar7), 5, getExtraChildGap(new WidgetPointer(ivar7))); + setWidgetSize(16, 16, 0, 0); + setWidgetPosition(1, 0, 2, 1); + setWidgetSprite(2554); + setScriptCallOnMouseEntered(2691, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 1, ivar8, 8419437, 1, "Ii1ii1"); + setScriptCallOnMouseExit(2691, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 0, ivar8, 6249298, 1, "Ii1ii1"); + setScriptCallOnMousePressed(2695, new WidgetPointer(-32768,3), -2147483643, getWidgetCustomChildArrayIndex(), ivar8, -1, 845, arg2, arg3, arg0, arg1, arg4, "IiiiiJiiiii"); + } + script_3451(arg4, 0); + return; +} diff --git a/dumps/scripts/2597.cs2 b/dumps/scripts/2597.cs2 new file mode 100644 index 000000000..2cbd93c34 --- /dev/null +++ b/dumps/scripts/2597.cs2 @@ -0,0 +1,99 @@ +void script_2597() { + int ivar0; + int ivar1; + ivar0 = -1; + ivar1 = 0; + switch (globalint_929) { + case 0: + ivar0 = getItemIdInSlot(93, globalint_930); + break; + case 1: + ivar0 = getItemIdInSlot(93, globalint_931); + break; + case 2: + ivar0 = getItemIdInSlot(93, globalint_932); + break; + case 3: + ivar0 = getItemIdInSlot(93, globalint_933); + break; + case 4: + ivar0 = getItemIdInSlot(93, globalint_934); + break; + case 5: + ivar0 = getItemIdInSlot(93, globalint_935); + break; + case 6: + ivar0 = getItemIdInSlot(93, globalint_936); + break; + case 7: + ivar0 = getItemIdInSlot(93, globalint_937); + break; + case 8: + ivar0 = getItemIdInSlot(93, globalint_938); + break; + case 9: + ivar0 = getItemIdInSlot(93, globalint_939); + } + if ((ivar0 == -1) || (getItemHashmapData(ivar0, 803) != 1)) { + return; + } + switch (globalint_929) { + case 0: + if (((boolean)bitconfig_6405)) { + ivar1 = 1; + } + break; + case 1: + if (((boolean)bitconfig_6406)) { + ivar1 = 1; + } + break; + case 2: + if (((boolean)bitconfig_6407)) { + ivar1 = 1; + } + break; + case 3: + if (((boolean)bitconfig_6408)) { + ivar1 = 1; + } + break; + case 4: + if (((boolean)bitconfig_6409)) { + ivar1 = 1; + } + break; + case 5: + if (((boolean)bitconfig_6410)) { + ivar1 = 1; + } + break; + case 6: + if (((boolean)bitconfig_6411)) { + ivar1 = 1; + } + break; + case 7: + if (((boolean)bitconfig_6412)) { + ivar1 = 1; + } + break; + case 8: + if (((boolean)bitconfig_6413)) { + ivar1 = 1; + } + break; + case 9: + if (((boolean)bitconfig_6414)) { + ivar1 = 1; + } + } + switch (ivar1) { + case 0: + setWidgetSprite(941, new WidgetPointer(292,113)); + break; + case 1: + setWidgetSprite(942, new WidgetPointer(292,113)); + } + return; +} diff --git a/dumps/scripts/2598.cs2 b/dumps/scripts/2598.cs2 new file mode 100644 index 000000000..f62b166b0 --- /dev/null +++ b/dumps/scripts/2598.cs2 @@ -0,0 +1,4 @@ +void script_2598() { + script_2599(); + return; +} diff --git a/dumps/scripts/2599.cs2 b/dumps/scripts/2599.cs2 new file mode 100644 index 000000000..e446c4226 --- /dev/null +++ b/dumps/scripts/2599.cs2 @@ -0,0 +1,92 @@ +void script_2599() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = -1; + globalarray_0 = new int[10]; + globalarray_1 = new int[10]; + globalarray_2 = new int[10]; + ivar4 = 0; + while ((ivar1 < 28) && (ivar2 < 10)) { + ivar3 = getItemIdInSlot(93, ivar1); + if ((ivar3 != -1) && (((boolean)getItemHashmapData(ivar3, 802)) || ((boolean)getItemHashmapData(ivar3, 803)))) { + globalarray_0[ivar2] = ivar3; + ivar2 = add(ivar2, 1); + } + ivar1 = add(ivar1, 1); + } + ivar3 = -1; + globalarray_0[0] = bitconfig_6405; + globalarray_0[1] = bitconfig_6406; + globalarray_0[2] = bitconfig_6407; + globalarray_0[3] = bitconfig_6408; + globalarray_0[4] = bitconfig_6409; + globalarray_0[5] = bitconfig_6410; + globalarray_0[6] = bitconfig_6411; + globalarray_0[7] = bitconfig_6412; + globalarray_0[8] = bitconfig_6413; + globalarray_0[9] = bitconfig_6414; + ivar1 = 0; + while (ivar1 < 10) { + if (globalarray_0[ivar1] != -1) { + if (((boolean)getItemHashmapData(ivar3, 803))) { + globalarray_0[ivar1] = multiply(bitconfig_6405, 50); + } + if (((boolean)getItemHashmapData(globalarray_0[ivar1], 803)) && ((boolean)globalarray_1[ivar1])) { + globalarray_0[ivar1] = 50; + ivar4 = add(ivar4, globalarray_2[ivar1]); + } + setWidgetText(cs2method_3408(105, 73, 2424, ivar1), "Cost: " + intToStr(globalarray_2[ivar1])); + } + ivar1 = add(ivar1, 1); + } + setWidgetText(new WidgetPointer(292,101), intToStr(globalarray_2[globalint_929])); + globalint_928 = ivar4; + setWidgetText(new WidgetPointer(292,126), intToStr(globalint_928)); + setWidgetText(new WidgetPointer(292,128), "Remaining investment credits: " + intToStr(subtract(bitconfig_6351, globalint_928))); + if (globalint_928 <= bitconfig_6351) { + setWidgetSprite(1870, new WidgetPointer(292,123)); + setScriptCallOnClickContextMenu(2605, "", new WidgetPointer(292,122)); + setWidgetContextMenuOption(1, new WidgetPointer(292,122), "Apply changes"); + setScriptCallOnMouseEntered(94, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,122)); + setWidgetRGB(new Color(255, 153, 53), new WidgetPointer(292,126)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(292,122)); + } else { + setWidgetSprite(1871, new WidgetPointer(292,123)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(292,122)); + setWidgetNoOptions(new WidgetPointer(292,122)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(292,122)); + setWidgetRGB(new Color(255, 17, 17), new WidgetPointer(292,126)); + setScriptCallOnMousePressed(2606, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,122)); + } + ivar1 = 0; + while (ivar1 < 10) { + if ((globalarray_0[ivar1] != -1) && ((boolean)getItemHashmapData(globalarray_0[ivar1], 803))) { + ivar0 = add(ivar0, 50); + } + ivar1 = add(ivar1, 1); + } + if (ivar0 > 0) { + setWidgetText(new WidgetPointer(292,124), "Resupply all" + "
" + "(" + intToStr(ivar0) + ")"); + } + if ((bitconfig_6351 >= ivar0) && (ivar0 > 0)) { + setWidgetRGB(new Color(255, 153, 53), new WidgetPointer(292,124)); + setScriptCallOnClickContextMenu(2603, "", new WidgetPointer(292,119)); + setWidgetContextMenuOption(1, new WidgetPointer(292,119), "Resupply all"); + setScriptCallOnMouseEntered(94, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,119)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(292,119)); + } else { + setWidgetText(new WidgetPointer(292,124), "Resupply all"); + setWidgetRGB(new Color(102, 102, 102), new WidgetPointer(292,124)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(292,119)); + setWidgetNoOptions(new WidgetPointer(292,119)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(292,119)); + setScriptCallOnMousePressed(2606, new WidgetPointer(-32768,3), "I", new WidgetPointer(292,119)); + } + return; +} diff --git a/dumps/scripts/26.cs2 b/dumps/scripts/26.cs2 new file mode 100644 index 000000000..7b91b74b0 --- /dev/null +++ b/dumps/scripts/26.cs2 @@ -0,0 +1,47 @@ +void script_26() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar0 = 0; + ivar1 = 0; + ivar2 = 25; + ivar3 = 20; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar4 = divide(subtract(getWidgetActualWidth(new WidgetPointer(197,16)), ivar2), add(ivar2, 36)); + while (ivar0 <= getItemContainerLength(347)) { + createExtraChild(new WidgetPointer(197,16), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar2, multiply(add(36, ivar2), subtract(ivar0, multiply(ivar1, ivar4)))), add(ivar3, multiply(ivar1, add(32, ivar3))), 0, 0); + ivar5 = add(ivar2, multiply(add(36, ivar2), subtract(ivar0, multiply(ivar1, ivar4)))); + ivar6 = add(ivar3, multiply(ivar1, add(32, ivar3))); + if (getItemIdInSlot(347, ivar0) != -1) { + if (getItemIdInSlot(347, ivar0) == 6910) { + setWidgetPosition(subtract(ivar5, 8), add(ivar6, 94), 0, 0, new WidgetPointer(197,12)); + } + if (getItemIdInSlot(347, ivar0) == 6912) { + setWidgetPosition(subtract(ivar5, 8), add(ivar6, 94), 0, 0, new WidgetPointer(197,14)); + } + if (getItemIdInSlot(347, ivar0) == 6914) { + setWidgetPosition(subtract(ivar5, 8), add(ivar6, 94), 0, 0, new WidgetPointer(197,13)); + } + setItemOnWidgetMethod1200(getItemIdInSlot(347, ivar0), getItemAmtInSlot(347, ivar0)); + setWidgetShadowColor(new Color(0, 0, 0)); + cs2method1305("" + getItemName(getItemIdInSlot(347, ivar0))); + setWidgetBorderThickness(1); + setWidgetContextMenuOption(1, "Value"); + setWidgetContextMenuOption(2, "Buy"); + setWidgetContextMenuOption(10, "Examine"); + } + ivar0 = add(ivar0, 1); + if (((boolean)mod(ivar0, ivar4))) { + ivar1 = add(ivar1, 1); + } + } + return; +} diff --git a/dumps/scripts/260.cs2 b/dumps/scripts/260.cs2 new file mode 100644 index 000000000..29abd1243 --- /dev/null +++ b/dumps/scripts/260.cs2 @@ -0,0 +1,4 @@ +void script_260() { + script_261(); + return; +} diff --git a/dumps/scripts/2600.cs2 b/dumps/scripts/2600.cs2 new file mode 100644 index 000000000..ecaaeae41 --- /dev/null +++ b/dumps/scripts/2600.cs2 @@ -0,0 +1,5 @@ +void script_2600() { + playSoundEffect(6784, 1, 0); + setWidgetIsHidden(true, new WidgetPointer(292,130)); + return; +} diff --git a/dumps/scripts/2601.cs2 b/dumps/scripts/2601.cs2 new file mode 100644 index 000000000..1b12a9b73 --- /dev/null +++ b/dumps/scripts/2601.cs2 @@ -0,0 +1,15 @@ +int script_2601(int arg0,int arg1,int arg2,string arg3) { + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(211, 16, 0, 0); + if (((boolean)arg0)) { + setWidgetPosition(6, arg1, 2, 0); + } else { + setWidgetPosition(0, arg1, 0, 0); + } + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(235, 224, 188)); + setWidgetUnknownBoolean(true); + setWidgetText(arg3); + return getWidgetCustomChildArrayIndex(); +} diff --git a/dumps/scripts/2602.cs2 b/dumps/scripts/2602.cs2 new file mode 100644 index 000000000..ca28f2bd4 --- /dev/null +++ b/dumps/scripts/2602.cs2 @@ -0,0 +1,3 @@ +void script_2602() { + return; +} diff --git a/dumps/scripts/2603.cs2 b/dumps/scripts/2603.cs2 new file mode 100644 index 000000000..52d2e67f7 --- /dev/null +++ b/dumps/scripts/2603.cs2 @@ -0,0 +1,9 @@ +void script_2603() { + playSoundEffect(6784, 1, 0); + setWidgetIsHidden(false, new WidgetPointer(292,130)); + setWidgetText(new WidgetPointer(292,132), "Are you sure you wish to resupply all defeated squads?"); + setWidgetIsHidden(false, new WidgetPointer(292,135)); + setWidgetIsHidden(true, new WidgetPointer(292,134)); + setWidgetIsHidden(true, new WidgetPointer(292,137)); + return; +} diff --git a/dumps/scripts/2604.cs2 b/dumps/scripts/2604.cs2 new file mode 100644 index 000000000..377ea97d1 --- /dev/null +++ b/dumps/scripts/2604.cs2 @@ -0,0 +1,9 @@ +void script_2604() { + playSoundEffect(6784, 1, 0); + setWidgetIsHidden(false, new WidgetPointer(292,130)); + setWidgetText(new WidgetPointer(292,132), "Are you sure you wish to reset all your squad contract selections?"); + setWidgetIsHidden(true, new WidgetPointer(292,135)); + setWidgetIsHidden(true, new WidgetPointer(292,137)); + setWidgetIsHidden(false, new WidgetPointer(292,134)); + return; +} diff --git a/dumps/scripts/2605.cs2 b/dumps/scripts/2605.cs2 new file mode 100644 index 000000000..1e1a9daef --- /dev/null +++ b/dumps/scripts/2605.cs2 @@ -0,0 +1,9 @@ +void script_2605() { + playSoundEffect(6784, 1, 0); + setWidgetIsHidden(false, new WidgetPointer(292,130)); + setWidgetText(new WidgetPointer(292,132), "Are you sure you wish to apply the selected changes?"); + setWidgetIsHidden(true, new WidgetPointer(292,135)); + setWidgetIsHidden(false, new WidgetPointer(292,137)); + setWidgetIsHidden(true, new WidgetPointer(292,134)); + return; +} diff --git a/dumps/scripts/2606.cs2 b/dumps/scripts/2606.cs2 new file mode 100644 index 000000000..cac570198 --- /dev/null +++ b/dumps/scripts/2606.cs2 @@ -0,0 +1,78 @@ +void script_2606(int arg0) { + int ivar1; + playSoundEffect(2277, 1, 0); + ivar1 = -1; + switch (globalint_929) { + case 0: + if (globalint_930 != -1) { + ivar1 = getItemIdInSlot(93, globalint_930); + } + break; + case 1: + if (globalint_931 != -1) { + ivar1 = getItemIdInSlot(93, globalint_931); + } + break; + case 2: + if (globalint_932 != -1) { + ivar1 = getItemIdInSlot(93, globalint_932); + } + break; + case 3: + if (globalint_933 != -1) { + ivar1 = getItemIdInSlot(93, globalint_933); + } + break; + case 4: + if (globalint_934 != -1) { + ivar1 = getItemIdInSlot(93, globalint_934); + } + break; + case 5: + if (globalint_935 != -1) { + ivar1 = getItemIdInSlot(93, globalint_935); + } + break; + case 6: + if (globalint_936 != -1) { + ivar1 = getItemIdInSlot(93, globalint_936); + } + break; + case 7: + if (globalint_937 != -1) { + ivar1 = getItemIdInSlot(93, globalint_937); + } + break; + case 8: + if (globalint_938 != -1) { + ivar1 = getItemIdInSlot(93, globalint_938); + } + break; + case 9: + if (globalint_939 != -1) { + ivar1 = getItemIdInSlot(93, globalint_939); + } + } + switch (arg0) { + case 19136631: + if (((boolean)getContainerIntNodeCountIgnoreStacks(93, 803))) { + messageType0("You have no squads that need resupplying."); + } else { + messageType0("You do not have sufficient investment credits to resupply all your squads."); + } + break; + case 19136634: + messageType0("You do not have sufficient investment credits to apply the selected changes."); + break; + case 19136615: + case 19136614: + case 19136623: + case 19136622: + case 19136616: + messageType0("You must resupply this squad first."); + break; + case 19136625: + messageType0("This squad does not need resupplying."); + } + return; +} diff --git a/dumps/scripts/2607.cs2 b/dumps/scripts/2607.cs2 new file mode 100644 index 000000000..8d1197eb7 --- /dev/null +++ b/dumps/scripts/2607.cs2 @@ -0,0 +1,6 @@ +void script_2607(int arg0) { + if (setWidgetRegister(new WidgetPointer(88,22), arg0)) { + setWidgetAnimation(-1); + } + return; +} diff --git a/dumps/scripts/2608.cs2 b/dumps/scripts/2608.cs2 new file mode 100644 index 000000000..facc540c5 --- /dev/null +++ b/dumps/scripts/2608.cs2 @@ -0,0 +1,4 @@ +void script_2608(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_6382)); + return; +} diff --git a/dumps/scripts/2609.cs2 b/dumps/scripts/2609.cs2 new file mode 100644 index 000000000..00824d1f4 --- /dev/null +++ b/dumps/scripts/2609.cs2 @@ -0,0 +1,8 @@ +void script_2609(int arg0) { + if ((((boolean)bitconfig_6357) || (bitconfig_6357 == 4)) || (bitconfig_6357 == 3)) { + setWidgetPosition(0, 5, 0, 0, new WidgetPointer(arg0)); + } else { + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/261.cs2 b/dumps/scripts/261.cs2 new file mode 100644 index 000000000..f9922bb69 --- /dev/null +++ b/dumps/scripts/261.cs2 @@ -0,0 +1,6 @@ +void script_261() { + script_266(); + script_263(); + script_265(); + return; +} diff --git a/dumps/scripts/2610.cs2 b/dumps/scripts/2610.cs2 new file mode 100644 index 000000000..c4ab86692 --- /dev/null +++ b/dumps/scripts/2610.cs2 @@ -0,0 +1,91 @@ +void script_2610(int arg0) { + string svar0; + svar0 = ""; + if (bitconfig_6357 == 2) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + if (bitconfig_6372 == 15) { + if (bitconfig_6373 > 0) { + svar0 = "Collected " + intToStr(bitconfig_6373) + " out of 4 rocks"; + setWidgetSprite(1985, new WidgetPointer(37,36)); + } else { + svar0 = "Send a squad to collect rocks"; + setWidgetSprite(1990, new WidgetPointer(37,36)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(37,0), new WidgetPointer(37,41), svar0, 50, 150, "IIsii", new WidgetPointer(37,0)); + setScriptCallOnMouseExit(40, new WidgetPointer(37,41), "I", new WidgetPointer(37,0)); + if (bitconfig_6373 > 1) { + svar0 = "Collected " + intToStr(bitconfig_6373) + " out of 4 rocks"; + setWidgetSprite(1985, new WidgetPointer(37,39)); + } else { + svar0 = "Send a squad to collect rocks."; + setWidgetSprite(1990, new WidgetPointer(37,39)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(37,3), new WidgetPointer(37,41), svar0, 50, 150, "IIsii", new WidgetPointer(37,3)); + setScriptCallOnMouseExit(40, new WidgetPointer(37,41), "I", new WidgetPointer(37,3)); + if (bitconfig_6373 > 2) { + svar0 = "Collected " + intToStr(bitconfig_6373) + " out of 4 rocks"; + setWidgetSprite(1985, new WidgetPointer(37,38)); + } else { + svar0 = "Send a squad to collect rocks."; + setWidgetSprite(1990, new WidgetPointer(37,38)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(37,4), new WidgetPointer(37,41), svar0, 50, 150, "IIsii", new WidgetPointer(37,4)); + setScriptCallOnMouseExit(40, new WidgetPointer(37,41), "I", new WidgetPointer(37,4)); + if (bitconfig_6373 > 3) { + svar0 = "Collected " + intToStr(bitconfig_6373) + " out of 4 rocks"; + setWidgetSprite(1985, new WidgetPointer(37,37)); + } else { + svar0 = "Send a squad to collect rocks."; + setWidgetSprite(1990, new WidgetPointer(37,37)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(37,5), new WidgetPointer(37,41), svar0, 50, 150, "IIsii", new WidgetPointer(37,5)); + setScriptCallOnMouseExit(40, new WidgetPointer(37,41), "I", new WidgetPointer(37,5)); + } else { + if (bitconfig_6368 > 0) { + svar0 = "Collected wheels"; + setWidgetSprite(1981, new WidgetPointer(37,36)); + } else { + svar0 = "Send a squad to collect wheels."; + setWidgetSprite(1986, new WidgetPointer(37,36)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(37,0), new WidgetPointer(37,41), svar0, 50, 150, "IIsii", new WidgetPointer(37,0)); + setScriptCallOnMouseExit(40, new WidgetPointer(37,41), "I", new WidgetPointer(37,0)); + if (bitconfig_6370 > 0) { + svar0 = "Collected logs"; + setWidgetSprite(1982, new WidgetPointer(37,39)); + } else { + svar0 = "Send a squad to collect logs."; + setWidgetSprite(1987, new WidgetPointer(37,39)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(37,3), new WidgetPointer(37,41), svar0, 50, 150, "IIsii", new WidgetPointer(37,3)); + setScriptCallOnMouseExit(40, new WidgetPointer(37,41), "I", new WidgetPointer(37,3)); + if (bitconfig_6371 > 0) { + svar0 = "Collected rope"; + setWidgetSprite(1983, new WidgetPointer(37,38)); + } else { + svar0 = "Send a squad to collect rope."; + setWidgetSprite(1988, new WidgetPointer(37,38)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(37,4), new WidgetPointer(37,41), svar0, 50, 150, "IIsii", new WidgetPointer(37,4)); + setScriptCallOnMouseExit(40, new WidgetPointer(37,41), "I", new WidgetPointer(37,4)); + if (bitconfig_6369 > 0) { + svar0 = "Collected metal limbs"; + setWidgetSprite(1984, new WidgetPointer(37,37)); + } else { + svar0 = "Send a squad to collect metal limbs."; + setWidgetSprite(1989, new WidgetPointer(37,37)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(37,5), new WidgetPointer(37,41), svar0, 50, 150, "IIsii", new WidgetPointer(37,5)); + setScriptCallOnMouseExit(40, new WidgetPointer(37,41), "I", new WidgetPointer(37,5)); + } + } else if (((boolean)bitconfig_6357)) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else if (bitconfig_6357 == 3) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else { + if (bitconfig_6357 == 4) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2611.cs2 b/dumps/scripts/2611.cs2 new file mode 100644 index 000000000..d249271a0 --- /dev/null +++ b/dumps/scripts/2611.cs2 @@ -0,0 +1,8 @@ +void script_2611(int arg0,int arg1) { + if (((boolean)arg1)) { + cs2method6201(256, 320); + cameraMethod5504(383, 0); + } + script_2612(addToCoordinate(getMyPositionHash(), -16, 0, -16), arg0); + return; +} diff --git a/dumps/scripts/2612.cs2 b/dumps/scripts/2612.cs2 new file mode 100644 index 000000000..517234d82 --- /dev/null +++ b/dumps/scripts/2612.cs2 @@ -0,0 +1,20 @@ +void script_2612(int arg0,int arg1) { + cameraMethod5511(addToCoordinate(arg0, 16, 0, 16)); + switch (arg1) { + case 0: + cs2method6201(144, 180); + break; + case 1: + cs2method6201(176, 220); + break; + case 2: + cs2method6201(208, 260); + break; + case 3: + cs2method6201(240, 300); + break; + case 4: + cs2method6201(272, 340); + } + return; +} diff --git a/dumps/scripts/2613.cs2 b/dumps/scripts/2613.cs2 new file mode 100644 index 000000000..79ac3ab79 --- /dev/null +++ b/dumps/scripts/2613.cs2 @@ -0,0 +1,41 @@ +void script_2613() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + switch (script_2617()) { + case 0: + ivar2 = addToCoordinate(globalint_834, 0, 0, 5); + break; + case 7: + ivar2 = addToCoordinate(globalint_834, -4, 0, 4); + break; + case 6: + ivar2 = addToCoordinate(globalint_834, -5, 0, 0); + break; + case 5: + ivar2 = addToCoordinate(globalint_834, -4, 0, -4); + break; + case 4: + ivar2 = addToCoordinate(globalint_834, 0, 0, -5); + break; + case 3: + ivar2 = addToCoordinate(globalint_834, 4, 0, -4); + break; + case 2: + ivar2 = addToCoordinate(globalint_834, 5, 0, 0); + break; + case 1: + ivar2 = addToCoordinate(globalint_834, 4, 0, 4); + } + ivar0 = divide(extractX(ivar2), 64); + ivar1 = divide(extractY(ivar2), 64); + if ((globalint_835 != ivar0) || (globalint_836 != ivar1)) { + return; + } + globalint_834 = ivar2; + script_2612(globalint_834, globalint_833); + return; +} diff --git a/dumps/scripts/2614.cs2 b/dumps/scripts/2614.cs2 new file mode 100644 index 000000000..5009b4a92 --- /dev/null +++ b/dumps/scripts/2614.cs2 @@ -0,0 +1,41 @@ +void script_2614() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + switch (script_2617()) { + case 0: + ivar2 = addToCoordinate(globalint_834, 0, 0, -5); + break; + case 7: + ivar2 = addToCoordinate(globalint_834, 4, 0, -4); + break; + case 6: + ivar2 = addToCoordinate(globalint_834, 5, 0, 0); + break; + case 5: + ivar2 = addToCoordinate(globalint_834, 4, 0, 4); + break; + case 4: + ivar2 = addToCoordinate(globalint_834, 0, 0, 5); + break; + case 3: + ivar2 = addToCoordinate(globalint_834, -4, 0, 4); + break; + case 2: + ivar2 = addToCoordinate(globalint_834, -5, 0, 0); + break; + case 1: + ivar2 = addToCoordinate(globalint_834, -4, 0, -4); + } + ivar0 = divide(extractX(ivar2), 64); + ivar1 = divide(extractY(ivar2), 64); + if ((globalint_835 != ivar0) || (globalint_836 != ivar1)) { + return; + } + globalint_834 = ivar2; + script_2612(globalint_834, globalint_833); + return; +} diff --git a/dumps/scripts/2615.cs2 b/dumps/scripts/2615.cs2 new file mode 100644 index 000000000..cae7da4dc --- /dev/null +++ b/dumps/scripts/2615.cs2 @@ -0,0 +1,41 @@ +void script_2615() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + switch (script_2617()) { + case 0: + ivar2 = addToCoordinate(globalint_834, -5, 0, 0); + break; + case 7: + ivar2 = addToCoordinate(globalint_834, -4, 0, -4); + break; + case 6: + ivar2 = addToCoordinate(globalint_834, 0, 0, -5); + break; + case 5: + ivar2 = addToCoordinate(globalint_834, 4, 0, -4); + break; + case 4: + ivar2 = addToCoordinate(globalint_834, 5, 0, 0); + break; + case 3: + ivar2 = addToCoordinate(globalint_834, 4, 0, 4); + break; + case 2: + ivar2 = addToCoordinate(globalint_834, 0, 0, 5); + break; + case 1: + ivar2 = addToCoordinate(globalint_834, -4, 0, 4); + } + ivar0 = divide(extractX(ivar2), 64); + ivar1 = divide(extractY(ivar2), 64); + if ((globalint_835 != ivar0) || (globalint_836 != ivar1)) { + return; + } + globalint_834 = ivar2; + script_2612(globalint_834, globalint_833); + return; +} diff --git a/dumps/scripts/2616.cs2 b/dumps/scripts/2616.cs2 new file mode 100644 index 000000000..e8b2c7d7e --- /dev/null +++ b/dumps/scripts/2616.cs2 @@ -0,0 +1,41 @@ +void script_2616() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + switch (script_2617()) { + case 0: + ivar2 = addToCoordinate(globalint_834, 5, 0, 0); + break; + case 7: + ivar2 = addToCoordinate(globalint_834, 4, 0, 4); + break; + case 6: + ivar2 = addToCoordinate(globalint_834, 0, 0, 5); + break; + case 5: + ivar2 = addToCoordinate(globalint_834, -4, 0, 4); + break; + case 4: + ivar2 = addToCoordinate(globalint_834, -5, 0, 0); + break; + case 3: + ivar2 = addToCoordinate(globalint_834, -4, 0, -4); + break; + case 2: + ivar2 = addToCoordinate(globalint_834, 0, 0, -5); + break; + case 1: + ivar2 = addToCoordinate(globalint_834, 4, 0, -4); + } + ivar0 = divide(extractX(ivar2), 64); + ivar1 = divide(extractY(ivar2), 64); + if ((globalint_835 != ivar0) || (globalint_836 != ivar1)) { + return; + } + globalint_834 = ivar2; + script_2612(globalint_834, globalint_833); + return; +} diff --git a/dumps/scripts/2617.cs2 b/dumps/scripts/2617.cs2 new file mode 100644 index 000000000..03ab542eb --- /dev/null +++ b/dumps/scripts/2617.cs2 @@ -0,0 +1,29 @@ +int script_2617() { + int ivar0; + ivar0 = cameraGetHrot(); + if ((ivar0 < 128) || (ivar0 >= 1920)) { + return 0; + } + if ((ivar0 < 384) && (ivar0 >= 128)) { + return 7; + } + if ((ivar0 >= 384) && (ivar0 < 650)) { + return 6; + } + if ((ivar0 < 896) && (ivar0 >= 650)) { + return 5; + } + if ((ivar0 >= 896) && (ivar0 < 1152)) { + return 4; + } + if ((ivar0 < 1408) && (ivar0 >= 1152)) { + return 3; + } + if ((ivar0 >= 1408) && (ivar0 < 1664)) { + return 2; + } + if ((ivar0 < 1920) && (ivar0 >= 1664)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/2618.cs2 b/dumps/scripts/2618.cs2 new file mode 100644 index 000000000..4140e9e9d --- /dev/null +++ b/dumps/scripts/2618.cs2 @@ -0,0 +1,16 @@ +void script_2618(int arg0) { + switch (arg0) { + case 1: + cs2method5507(); + break; + case 2: + cs2method5508(); + break; + case 3: + cs2method5509(); + break; + case 4: + cs2method5510(); + } + return; +} diff --git a/dumps/scripts/2619.cs2 b/dumps/scripts/2619.cs2 new file mode 100644 index 000000000..6c3233a01 --- /dev/null +++ b/dumps/scripts/2619.cs2 @@ -0,0 +1,4 @@ +void script_2619() { + cs2method6201(0, 0); + return; +} diff --git a/dumps/scripts/262.cs2 b/dumps/scripts/262.cs2 new file mode 100644 index 000000000..d99b22adf --- /dev/null +++ b/dumps/scripts/262.cs2 @@ -0,0 +1,5 @@ +void script_262(int arg0) { + globalint_1109 = arg0; + script_261(); + return; +} diff --git a/dumps/scripts/2620.cs2 b/dumps/scripts/2620.cs2 new file mode 100644 index 000000000..201469880 --- /dev/null +++ b/dumps/scripts/2620.cs2 @@ -0,0 +1,4 @@ +void script_2620() { + script_2621(); + return; +} diff --git a/dumps/scripts/2621.cs2 b/dumps/scripts/2621.cs2 new file mode 100644 index 000000000..73573046c --- /dev/null +++ b/dumps/scripts/2621.cs2 @@ -0,0 +1,12 @@ +void script_2621() { + if (isWidgetHidden(new WidgetPointer(850,1))) { + setWidgetIsHidden(true, new WidgetPointer(850,1)); + setWidgetIsHidden(false, new WidgetPointer(850,47)); + setWidgetHFlip(0, new WidgetPointer(850,50)); + } else { + setWidgetIsHidden(false, new WidgetPointer(850,1)); + setWidgetIsHidden(true, new WidgetPointer(850,47)); + setWidgetHFlip(1, new WidgetPointer(850,50)); + } + return; +} diff --git a/dumps/scripts/2622.cs2 b/dumps/scripts/2622.cs2 new file mode 100644 index 000000000..e424960b4 --- /dev/null +++ b/dumps/scripts/2622.cs2 @@ -0,0 +1,31 @@ +void script_2622() { + int ivar0; + int ivar1; + ivar0 = -1; + ivar1 = 1; + if (((boolean)stringMethod4107(globalstring_179, "")) || ((boolean)stringMethod4107(globalstring_179, "null"))) { + return; + } + setWidgetText(new WidgetPointer(850,44), getWidgetText(new WidgetPointer(850,43))); + setWidgetText(new WidgetPointer(850,43), getWidgetText(new WidgetPointer(850,42))); + setWidgetText(new WidgetPointer(850,42), getWidgetText(new WidgetPointer(850,41))); + setWidgetText(new WidgetPointer(850,41), getWidgetText(new WidgetPointer(850,40))); + setWidgetText(new WidgetPointer(850,40), getWidgetText(new WidgetPointer(850,39))); + setWidgetText(new WidgetPointer(850,39), getWidgetText(new WidgetPointer(850,38))); + setWidgetText(new WidgetPointer(850,38), getWidgetText(new WidgetPointer(850,37))); + setWidgetText(new WidgetPointer(850,37), getWidgetText(new WidgetPointer(850,36))); + setWidgetText(new WidgetPointer(850,36), getWidgetText(new WidgetPointer(850,35))); + setWidgetText(new WidgetPointer(850,35), getWidgetText(new WidgetPointer(850,34))); + setWidgetText(new WidgetPointer(850,34), getWidgetText(new WidgetPointer(850,33))); + setWidgetText(new WidgetPointer(850,33), getWidgetText(new WidgetPointer(850,32))); + setWidgetText(new WidgetPointer(850,32), getWidgetText(new WidgetPointer(850,31))); + setWidgetText(new WidgetPointer(850,31), getWidgetText(new WidgetPointer(850,30))); + setWidgetText(new WidgetPointer(850,30), getWidgetText(new WidgetPointer(850,29))); + setWidgetText(new WidgetPointer(850,29), getWidgetText(new WidgetPointer(850,28))); + setWidgetText(new WidgetPointer(850,28), getWidgetText(new WidgetPointer(850,27))); + setWidgetText(new WidgetPointer(850,27), getWidgetText(new WidgetPointer(850,26))); + setWidgetText(new WidgetPointer(850,26), getWidgetText(new WidgetPointer(850,25))); + setWidgetText(new WidgetPointer(850,25), globalstring_179); + script_157(55705645, 55705646, getWidgetScrollMaxV(new WidgetPointer(850,46)), 1); + return; +} diff --git a/dumps/scripts/2623.cs2 b/dumps/scripts/2623.cs2 new file mode 100644 index 000000000..e7f56e584 --- /dev/null +++ b/dumps/scripts/2623.cs2 @@ -0,0 +1,25 @@ +void script_2623() { + int ivar0; + ivar0 = 1; + while (((int)cs2method_3408(105, 73, 2451, ivar0)) != 55705624) { + setWidgetText(cs2method_3408(105, 73, 2451, ivar0), ""); + ivar0 = add(ivar0, 1); + } + setWidgetText(new WidgetPointer(850,25), "Welcome to Mobilising Armies."); + switch (bitconfig_6352) { + case 1: + setWidgetSprite(1906, new WidgetPointer(850,50)); + break; + case 2: + setWidgetSprite(1904, new WidgetPointer(850,50)); + break; + case 3: + setWidgetSprite(1905, new WidgetPointer(850,50)); + break; + case 4: + setWidgetSprite(1907, new WidgetPointer(850,50)); + } + script_157(55705645, 55705646, getWidgetScrollMaxV(new WidgetPointer(850,46)), 1); + setScriptCallOnKeyPress(2625, -2147483640, false, "iz", new WidgetPointer(850,48)); + return; +} diff --git a/dumps/scripts/2624.cs2 b/dumps/scripts/2624.cs2 new file mode 100644 index 000000000..034d6e611 --- /dev/null +++ b/dumps/scripts/2624.cs2 @@ -0,0 +1,12 @@ +void script_2624() { + int ivar0; + int ivar1; + ivar0 = 1; + ivar1 = -1; + while (((int)cs2method_3408(105, 73, 2450, ivar0)) != 55705624) { + ivar1 = ((int)cs2method_3408(105, 73, 2450, ivar0)); + setWidgetText(new WidgetPointer(ivar1), "" + cs2method_3408(73, 115, 2449, ivar1) + " " + "" + cs2method_3408(73, 115, 2448, ivar1)); + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/2625.cs2 b/dumps/scripts/2625.cs2 new file mode 100644 index 000000000..ba0c373bd --- /dev/null +++ b/dumps/scripts/2625.cs2 @@ -0,0 +1,14 @@ +void script_2625(int arg0,int arg1) { + if (arg0 == 84) { + script_2621(); + } else { + if (isWidgetHidden(new WidgetPointer(850,1))) { + if (strIndexof(((char)lower(((char)arg1))), 0, "abcdefghijklmnopqrst") != -1) { + script_2621(); + } else { + return; + } + } + } + return; +} diff --git a/dumps/scripts/2626.cs2 b/dumps/scripts/2626.cs2 new file mode 100644 index 000000000..b06b1e83a --- /dev/null +++ b/dumps/scripts/2626.cs2 @@ -0,0 +1,17 @@ +void script_2626() { + cs2method2308(0, 1, new WidgetPointer(859,13)); + cs2method2308(2, 3, new WidgetPointer(859,14)); + if (bitconfig_6357 == 2) { + cs2method2308(4, 5, new WidgetPointer(859,16)); + cs2method2308(12, 13, new WidgetPointer(859,17)); + } else if (bitconfig_6357 == 3) { + cs2method2308(6, 7, new WidgetPointer(859,16)); + } else { + if (bitconfig_6357 == 4) { + cs2method2308(10, 11, new WidgetPointer(859,16)); + cs2method2308(8, 9, new WidgetPointer(859,17)); + } + } + script_2628(); + return; +} diff --git a/dumps/scripts/2627.cs2 b/dumps/scripts/2627.cs2 new file mode 100644 index 000000000..616eabebd --- /dev/null +++ b/dumps/scripts/2627.cs2 @@ -0,0 +1,4 @@ +void script_2627() { + script_2628(); + return; +} diff --git a/dumps/scripts/2628.cs2 b/dumps/scripts/2628.cs2 new file mode 100644 index 000000000..1968e8ce0 --- /dev/null +++ b/dumps/scripts/2628.cs2 @@ -0,0 +1,65 @@ +void script_2628() { + if (((boolean)globalint_906)) { + setWidgetSprite(1868, new WidgetPointer(859,25)); + setWidgetText(new WidgetPointer(859,11), "Idle"); + } else { + if (globalint_906 == 2) { + setWidgetSprite(1867, new WidgetPointer(859,25)); + switch (globalint_907) { + case 0: + globalint_906 = 0; + setWidgetSprite(1868, new WidgetPointer(859,25)); + setWidgetText(new WidgetPointer(859,11), "Idle"); + break; + case 1: + case 2: + setWidgetText(new WidgetPointer(859,11), "Exploring"); + break; + case 3: + case 4: + setWidgetText(new WidgetPointer(859,11), "Attacking wall"); + break; + case 5: + case 6: + case 7: + setWidgetText(new WidgetPointer(859,11), "Rescuing TzHaar"); + break; + case 8: + case 9: + setWidgetText(new WidgetPointer(859,11), "Collecting gold"); + break; + case 10: + case 11: + case 12: + setWidgetText(new WidgetPointer(859,11), "Stealing TzHaar"); + break; + case 13: + case 14: + case 15: + setWidgetText(new WidgetPointer(859,11), "Collecting parts"); + break; + case 17: + case 16: + case 18: + setWidgetText(new WidgetPointer(859,11), "Collecting Rocks"); + break; + case 19: + case 20: + setWidgetText(new WidgetPointer(859,11), "Attacking catapult"); + break; + case 21: + setWidgetText(new WidgetPointer(859,11), "Retaliating"); + break; + case 22: + setWidgetText(new WidgetPointer(859,11), "Moving to destination"); + break; + case 23: + setWidgetText(new WidgetPointer(859,11), "Attacking"); + break; + default: + setWidgetText(new WidgetPointer(859,11), "Busy"); + } + } + } + return; +} diff --git a/dumps/scripts/2629.cs2 b/dumps/scripts/2629.cs2 new file mode 100644 index 000000000..204b979b9 --- /dev/null +++ b/dumps/scripts/2629.cs2 @@ -0,0 +1,9 @@ +void script_2629(int arg0) { + if ((globalint_905 == arg0) && ((boolean)globalint_904)) { + script_2635(); + return; + } + script_2635(); + script_2630(arg0); + return; +} diff --git a/dumps/scripts/263.cs2 b/dumps/scripts/263.cs2 new file mode 100644 index 000000000..071a4700d --- /dev/null +++ b/dumps/scripts/263.cs2 @@ -0,0 +1,31 @@ +void script_263() { + string svar0; + svar0 = "None"; + switch (globalint_1109) { + case 1: + svar0 = "Worm"; + break; + case 2: + svar0 = "Maggot"; + break; + case 4: + svar0 = "Locust"; + break; + case 3: + svar0 = "Cricket"; + break; + case 5: + svar0 = "Cray"; + break; + case 6: + svar0 = "Shrimp"; + break; + case 7: + svar0 = "Green moth"; + break; + case 8: + svar0 = "Grey moth"; + } + setWidgetText(new WidgetPointer(923,51), svar0); + return; +} diff --git a/dumps/scripts/2630.cs2 b/dumps/scripts/2630.cs2 new file mode 100644 index 000000000..4fe78e902 --- /dev/null +++ b/dumps/scripts/2630.cs2 @@ -0,0 +1,55 @@ +void script_2630(int arg0) { + int ivar1; + int ivar2; + ivar1 = -1; + ivar2 = -1; + globalint_905 = arg0; + globalint_904 = 1; + switch (arg0) { + case 56295437: + arg0 = 56295426; + ivar1 = 1914; + ivar2 = 1922; + break; + case 56295438: + arg0 = 56295432; + ivar1 = 1915; + ivar2 = 1923; + break; + case 56295439: + arg0 = 56295431; + ivar1 = 1916; + ivar2 = 1924; + break; + case 56295440: + if (bitconfig_6357 == 2) { + arg0 = 56295446; + ivar1 = 1917; + ivar2 = 1925; + } + if (bitconfig_6357 == 3) { + arg0 = 56295430; + ivar1 = 1918; + ivar2 = 1926; + } + if (bitconfig_6357 == 4) { + arg0 = 56295447; + ivar1 = 1921; + ivar2 = 1929; + } + break; + case 56295441: + if (bitconfig_6357 == 2) { + arg0 = 56295445; + ivar1 = 1920; + ivar2 = 1928; + } + if (bitconfig_6357 == 4) { + arg0 = 56295444; + ivar1 = 1919; + ivar2 = 1927; + } + } + setScriptCallOnGameloop(2631, new WidgetPointer(arg0), ivar1, ivar2, "Idd", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2631.cs2 b/dumps/scripts/2631.cs2 new file mode 100644 index 000000000..aac08aac8 --- /dev/null +++ b/dumps/scripts/2631.cs2 @@ -0,0 +1,8 @@ +void script_2631(int arg0,int arg1,int arg2) { + if (mod(getClientCycle(), 20) < 10) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + } else { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2632.cs2 b/dumps/scripts/2632.cs2 new file mode 100644 index 000000000..f9c531496 --- /dev/null +++ b/dumps/scripts/2632.cs2 @@ -0,0 +1,48 @@ +void script_2632(int arg0) { + if (arg0 != 56295424) { + script_1360(arg0); + } + switch (arg0) { + case 56295424: + setWidgetText(new WidgetPointer(859,28), "Go to"); + setWidgetText(new WidgetPointer(859,29), "Click to view this squad."); + break; + case 56295437: + setWidgetText(new WidgetPointer(859,28), "Attack"); + setWidgetText(new WidgetPointer(859,29), "Select the enemy squad you wish to attack."); + break; + case 56295438: + setWidgetText(new WidgetPointer(859,28), "Move"); + setWidgetText(new WidgetPointer(859,29), "Select the destination for your squad."); + break; + case 56295439: + setWidgetText(new WidgetPointer(859,28), "Explore"); + setWidgetText(new WidgetPointer(859,29), "Send the unit to explore for treasure."); + break; + case 56295440: + if (bitconfig_6357 == 2) { + setWidgetText(new WidgetPointer(859,28), "Attack wall/catapult"); + setWidgetText(new WidgetPointer(859,29), "Select the wall or catapult you want your squad to attack."); + } else if (bitconfig_6357 == 3) { + setWidgetText(new WidgetPointer(859,28), "Collect gold"); + setWidgetText(new WidgetPointer(859,29), "Select the cave entrance from which your squad should gather gold."); + } else { + if (bitconfig_6357 == 4) { + setWidgetText(new WidgetPointer(859,28), "Rescue"); + setWidgetText(new WidgetPointer(859,29), "Select the fissure from which your squad should rescue TzHaar."); + } + } + break; + case 56295441: + if (bitconfig_6357 == 2) { + setWidgetText(new WidgetPointer(859,28), "Collect"); + setWidgetText(new WidgetPointer(859,29), "Select a resource for your squad to collect."); + } else { + if (bitconfig_6357 == 4) { + setWidgetText(new WidgetPointer(859,28), "Steal"); + setWidgetText(new WidgetPointer(859,29), "Select a lander to steal TzHaar from."); + } + } + } + return; +} diff --git a/dumps/scripts/2633.cs2 b/dumps/scripts/2633.cs2 new file mode 100644 index 000000000..538c81ab7 --- /dev/null +++ b/dumps/scripts/2633.cs2 @@ -0,0 +1,8 @@ +void script_2633(int arg0) { + if (arg0 != 56295424) { + script_679(arg0); + } + setWidgetText(new WidgetPointer(859,28), ""); + setWidgetText(new WidgetPointer(859,29), ""); + return; +} diff --git a/dumps/scripts/2634.cs2 b/dumps/scripts/2634.cs2 new file mode 100644 index 000000000..9bda46296 --- /dev/null +++ b/dumps/scripts/2634.cs2 @@ -0,0 +1,4 @@ +void script_2634() { + script_2635(); + return; +} diff --git a/dumps/scripts/2635.cs2 b/dumps/scripts/2635.cs2 new file mode 100644 index 000000000..f12718aaf --- /dev/null +++ b/dumps/scripts/2635.cs2 @@ -0,0 +1,20 @@ +void script_2635() { + globalint_904 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(859,2)); + setWidgetSprite(1914, new WidgetPointer(859,2)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(859,8)); + setWidgetSprite(1915, new WidgetPointer(859,8)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(859,7)); + setWidgetSprite(1916, new WidgetPointer(859,7)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(859,22)); + setWidgetSprite(1917, new WidgetPointer(859,22)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(859,23)); + setWidgetSprite(1921, new WidgetPointer(859,23)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(859,6)); + setWidgetSprite(1918, new WidgetPointer(859,6)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(859,20)); + setWidgetSprite(1919, new WidgetPointer(859,20)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(859,21)); + setWidgetSprite(1920, new WidgetPointer(859,21)); + return; +} diff --git a/dumps/scripts/2636.cs2 b/dumps/scripts/2636.cs2 new file mode 100644 index 000000000..58cd18e4b --- /dev/null +++ b/dumps/scripts/2636.cs2 @@ -0,0 +1,14 @@ +void script_2636() { + if (bitconfig_6357 == 2) { + cs2method2306(new WidgetPointer(859,16), "Attack wall"); + cs2method2306(new WidgetPointer(859,17), "Collect"); + } else if (bitconfig_6357 == 4) { + cs2method2306(new WidgetPointer(859,16), "Rescue"); + cs2method2306(new WidgetPointer(859,17), "Steal"); + } else { + if (bitconfig_6357 == 3) { + cs2method2306(new WidgetPointer(859,16), "Collect gold"); + } + } + return; +} diff --git a/dumps/scripts/2637.cs2 b/dumps/scripts/2637.cs2 new file mode 100644 index 000000000..e82d73369 --- /dev/null +++ b/dumps/scripts/2637.cs2 @@ -0,0 +1,14 @@ +void script_2637() { + if (((boolean)globalint_902)) { + setWidgetSprite(1949, new WidgetPointer(859,24)); + } else if (globalint_902 == 2) { + setWidgetSprite(1946, new WidgetPointer(859,24)); + } else { + if (globalint_902 == 3) { + setWidgetSprite(1947, new WidgetPointer(859,24)); + } + } + setWidgetText(new WidgetPointer(859,28), ""); + setWidgetText(new WidgetPointer(859,29), ""); + return; +} diff --git a/dumps/scripts/2638.cs2 b/dumps/scripts/2638.cs2 new file mode 100644 index 000000000..3ba1f9998 --- /dev/null +++ b/dumps/scripts/2638.cs2 @@ -0,0 +1,12 @@ +void script_2638() { + if (((boolean)globalint_903)) { + setWidgetSprite(2023, new WidgetPointer(859,26)); + setWidgetText(new WidgetPointer(859,10), "Light"); + } else { + if (((boolean)globalint_903)) { + setWidgetSprite(2022, new WidgetPointer(859,26)); + setWidgetText(new WidgetPointer(859,10), "Heavy"); + } + } + return; +} diff --git a/dumps/scripts/2639.cs2 b/dumps/scripts/2639.cs2 new file mode 100644 index 000000000..f92c0749e --- /dev/null +++ b/dumps/scripts/2639.cs2 @@ -0,0 +1,5 @@ +void script_2639() { + globalint_842 = 0; + script_2642(); + return; +} diff --git a/dumps/scripts/264.cs2 b/dumps/scripts/264.cs2 new file mode 100644 index 000000000..a165ad46e --- /dev/null +++ b/dumps/scripts/264.cs2 @@ -0,0 +1,5 @@ +void script_264(int arg0) { + globalint_1110 = arg0; + script_261(); + return; +} diff --git a/dumps/scripts/2640.cs2 b/dumps/scripts/2640.cs2 new file mode 100644 index 000000000..66af74462 --- /dev/null +++ b/dumps/scripts/2640.cs2 @@ -0,0 +1,4 @@ +void script_2640() { + script_2642(); + return; +} diff --git a/dumps/scripts/2641.cs2 b/dumps/scripts/2641.cs2 new file mode 100644 index 000000000..e002f8162 --- /dev/null +++ b/dumps/scripts/2641.cs2 @@ -0,0 +1,4 @@ +void script_2641() { + script_2643(); + return; +} diff --git a/dumps/scripts/2642.cs2 b/dumps/scripts/2642.cs2 new file mode 100644 index 000000000..ff876a637 --- /dev/null +++ b/dumps/scripts/2642.cs2 @@ -0,0 +1,89 @@ +void script_2642() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + globalint_842 = 1; + ivar4 = -1; + script_2645(56360984); + deleteAllExtraChilds(new WidgetPointer(860,23)); + setWidgetText(new WidgetPointer(860,19), "A list of items you can trade with Mal for investment credit." + "
" + "Items highlighted with a green rectangle are present in your bank or inventory."); + ivar1 = divide(subtract(getWidgetActualWidth(new WidgetPointer(860,23)), multiply(36, 10)), 10); + ivar2 = divide(subtract(getWidgetActualHeight(new WidgetPointer(860,23)), 128), 3); + ivar5 = 3; + ivar6 = 3; + ivar7 = 0; + while (((boolean)ivar3) && (ivar0 < 900)) { + ivar4 = cs2method_3408(105, 111, 1939, ivar0); + if ((ivar4 != 11760) && (ivar4 != -1)) { + createExtraChild(new WidgetPointer(860,23), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar5, multiply(add(36, ivar1), mod(ivar0, 10))), add(ivar6, multiply(divide(ivar0, 10), add(32, ivar2))), 0, 0); + setItemOnWidgetMethod1200(ivar4, -1); + cs2method1305("" + getItemName(ivar4)); + setWidgetContextMenuOption(1, "Examine"); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + ivar7 = getWidgetActualY(); + ivar0 = add(ivar0, 1); + } else { + ivar3 = 1; + } + } + ivar8 = 0; + ivar9 = 9999; + ivar10 = 0; + ivar11 = 0; + while (ivar8 <= getItemContainerLength(93)) { + if (getItemIdInSlot(93, ivar8) != -1) { + ivar9 = cs2method_3408(111, 105, 1941, getItemIdInSlot(93, ivar8)); + if (((ivar9 != 9999) && (ivar9 < 900)) && setWidgetRegister(new WidgetPointer(860,23), ivar9)) { + ivar10 = getWidgetActualX(); + ivar11 = getWidgetActualY(); + setWidgetBorderThickness(2); + createExtraChild(new WidgetPointer(860,23), 3, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(subtract(ivar10, 1), subtract(ivar11, 1), 0, 0); + setWidgetRGB(new Color(102, 255, 102)); + cs2method2103(150); + ivar0 = add(ivar0, 1); + } + } + ivar8 = add(ivar8, 1); + } + ivar8 = 0; + ivar9 = 9999; + while (ivar8 <= getItemContainerLength(95)) { + if (getItemIdInSlot(95, ivar8) != -1) { + ivar9 = cs2method_3408(111, 105, 1941, getItemIdInSlot(95, ivar8)); + if (((ivar9 != 9999) && (ivar9 < 900)) && setWidgetRegister(new WidgetPointer(860,23), ivar9)) { + ivar10 = getWidgetActualX(); + ivar11 = getWidgetActualY(); + setWidgetBorderThickness(2); + createExtraChild(new WidgetPointer(860,23), 3, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(subtract(ivar10, 1), subtract(ivar11, 1), 0, 0); + setWidgetRGB(new Color(102, 255, 102)); + cs2method2103(150); + ivar0 = add(ivar0, 1); + } + } + ivar8 = add(ivar8, 1); + } + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(860,23)), add(ivar7, 32), new WidgetPointer(860,23)); + cs2method2100(0, 0, new WidgetPointer(860,23)); + script_31(56360982, 56360983, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/2643.cs2 b/dumps/scripts/2643.cs2 new file mode 100644 index 000000000..21daf4096 --- /dev/null +++ b/dumps/scripts/2643.cs2 @@ -0,0 +1,95 @@ +void script_2643() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + ivar0 = 900; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + globalint_842 = 2; + ivar4 = -1; + script_2645(56360984); + deleteAllExtraChilds(new WidgetPointer(860,23)); + setWidgetText(new WidgetPointer(860,19), "A list of items you can trade with Mal for investment credit." + "
" + "Items highlighted with a green rectangle are present in your bank or inventory."); + ivar1 = divide(subtract(getWidgetActualWidth(new WidgetPointer(860,23)), multiply(36, 10)), 10); + ivar2 = divide(subtract(getWidgetActualHeight(new WidgetPointer(860,23)), 128), 3); + ivar5 = 3; + ivar6 = 3; + ivar7 = 0; + while ((((boolean)ivar3) && (ivar0 >= 900)) && (ivar0 < 1800)) { + ivar4 = cs2method_3408(105, 111, 1939, ivar0); + if ((ivar4 != 11760) && (ivar4 != -1)) { + createExtraChild(new WidgetPointer(860,23), 5, subtract(ivar0, 900)); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar5, multiply(add(36, ivar1), mod(subtract(ivar0, 900), 10))), add(ivar6, multiply(divide(subtract(ivar0, 900), 10), add(32, ivar2))), 0, 0); + setItemOnWidgetMethod1200(ivar4, -1); + cs2method1305("" + getItemName(ivar4)); + setWidgetContextMenuOption(1, "Examine"); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + ivar7 = getWidgetActualY(); + ivar0 = add(ivar0, 1); + } else { + ivar3 = 1; + } + } + ivar8 = 0; + ivar9 = 9999; + ivar10 = 0; + ivar11 = 0; + while (ivar8 <= getItemContainerLength(93)) { + if (getItemIdInSlot(93, ivar8) != -1) { + ivar9 = cs2method_3408(111, 105, 1941, getItemIdInSlot(93, ivar8)); + if ((ivar9 != 9999) && (ivar9 >= 900)) { + ivar9 = subtract(ivar9, 900); + if (setWidgetRegister(new WidgetPointer(860,23), ivar9)) { + ivar10 = getWidgetActualX(); + ivar11 = getWidgetActualY(); + setWidgetBorderThickness(2); + createExtraChild(new WidgetPointer(860,23), 3, subtract(ivar0, 900)); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(subtract(ivar10, 1), subtract(ivar11, 1), 0, 0); + setWidgetRGB(new Color(102, 255, 102)); + cs2method2103(150); + ivar0 = add(ivar0, 1); + } + } + } + ivar8 = add(ivar8, 1); + } + ivar8 = 0; + ivar9 = 9999; + while (ivar8 <= getItemContainerLength(95)) { + if (getItemIdInSlot(95, ivar8) != -1) { + ivar9 = cs2method_3408(111, 105, 1941, getItemIdInSlot(95, ivar8)); + if ((ivar9 != 9999) && (ivar9 >= 900)) { + ivar9 = subtract(ivar9, 900); + if (setWidgetRegister(new WidgetPointer(860,23), ivar9)) { + ivar10 = getWidgetActualX(); + ivar11 = getWidgetActualY(); + setWidgetBorderThickness(2); + createExtraChild(new WidgetPointer(860,23), 3, subtract(ivar0, 900)); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(subtract(ivar10, 1), subtract(ivar11, 1), 0, 0); + setWidgetRGB(new Color(102, 255, 102)); + cs2method2103(150); + ivar0 = add(ivar0, 1); + } + } + } + ivar8 = add(ivar8, 1); + } + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(860,23)), add(ivar7, 32), new WidgetPointer(860,23)); + cs2method2100(0, 0, new WidgetPointer(860,23)); + script_31(56360982, 56360983, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/2644.cs2 b/dumps/scripts/2644.cs2 new file mode 100644 index 000000000..f12f07f22 --- /dev/null +++ b/dumps/scripts/2644.cs2 @@ -0,0 +1,4 @@ +void script_2644(int arg0) { + script_2645(arg0); + return; +} diff --git a/dumps/scripts/2645.cs2 b/dumps/scripts/2645.cs2 new file mode 100644 index 000000000..ec482f68b --- /dev/null +++ b/dumps/scripts/2645.cs2 @@ -0,0 +1,12 @@ +void script_2645(int arg0) { + if (((boolean)globalint_842)) { + setWidgetText(new WidgetPointer(arg0), "Next page"); + setScriptCallOnClickContextMenu(2641, "", new WidgetPointer(860,20)); + } else { + if (globalint_842 == 2) { + setWidgetText(new WidgetPointer(arg0), "Previous page"); + setScriptCallOnClickContextMenu(2640, "", new WidgetPointer(860,20)); + } + } + return; +} diff --git a/dumps/scripts/2646.cs2 b/dumps/scripts/2646.cs2 new file mode 100644 index 000000000..8c686d3a5 --- /dev/null +++ b/dumps/scripts/2646.cs2 @@ -0,0 +1,83 @@ +void script_2646(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + if (globalint_842 == 3) { + globalint_842 = 1; + setWidgetText(new WidgetPointer(arg0), "Check bank & inventory"); + setWidgetText(new WidgetPointer(860,18), "Commodities"); + setWidgetIsHidden(false, new WidgetPointer(860,20)); + script_2645(56360980); + script_2642(); + return; + } + globalint_842 = 3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + globalint_842 = 3; + ivar6 = -1; + setWidgetIsHidden(true, new WidgetPointer(860,20)); + setWidgetText(new WidgetPointer(arg0), "View all commodities"); + setWidgetText(new WidgetPointer(860,18), "Commodities in your bank & inventory"); + deleteAllExtraChilds(new WidgetPointer(860,23)); + setWidgetText(new WidgetPointer(860,19), "A list of items already in your inventory or bank that you can trade with Mal for investment credit."); + ivar3 = divide(subtract(getWidgetActualWidth(new WidgetPointer(860,23)), multiply(36, 10)), subtract(10, 1)); + ivar4 = divide(subtract(getWidgetActualHeight(new WidgetPointer(860,23)), 128), 3); + ivar7 = 0; + while (ivar1 <= getItemContainerLength(95)) { + ivar6 = getItemIdInSlot(95, ivar1); + if ((ivar6 != -1) && commonIntegerExists('o', 1939, ivar6)) { + createExtraChild(new WidgetPointer(860,23), 5, ivar2); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar3), mod(ivar2, 10)), multiply(divide(ivar2, 10), add(32, ivar4)), 0, 0); + setItemOnWidgetMethod1200(ivar6, -1); + cs2method1305("" + getItemName(ivar6)); + setWidgetContextMenuOption(1, "Examine"); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + ivar2 = add(ivar2, 1); + ivar7 = getWidgetActualY(); + } + ivar1 = add(ivar1, 1); + } + ivar8 = 0; + while (ivar8 <= getItemContainerLength(93)) { + ivar6 = getItemIdInSlot(93, ivar8); + if ((ivar6 != -1) && commonIntegerExists('o', 1939, ivar6)) { + createExtraChild(new WidgetPointer(860,23), 5, ivar2); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar3), mod(ivar2, 10)), multiply(divide(ivar2, 10), add(32, ivar4)), 0, 0); + setItemOnWidgetMethod1200(ivar6, -1); + cs2method1305("" + getItemName(ivar6)); + setWidgetContextMenuOption(1, "Examine"); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + ivar2 = add(ivar2, 1); + ivar7 = getWidgetActualY(); + } + ivar8 = add(ivar8, 1); + } + if (((boolean)ivar2)) { + createExtraChild(new WidgetPointer(860,23), 4, ivar2); + setWidgetSize(200, 32, 0, 0); + setWidgetPosition(0, 0, 1, 4); + setWidgetText("No valid commodities were found in your bank or inventory."); + setWidgetFont(496); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(false); + setWidgetRGB(new Color(255, 152, 31)); + ivar2 = 1; + } + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(860,23)), add(ivar7, 32), new WidgetPointer(860,23)); + cs2method2100(0, 0, new WidgetPointer(860,23)); + script_31(56360982, 56360983, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/2647.cs2 b/dumps/scripts/2647.cs2 new file mode 100644 index 000000000..3d3e6aa94 --- /dev/null +++ b/dumps/scripts/2647.cs2 @@ -0,0 +1,25 @@ +void script_2647(int arg0) { + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(0, 32, 1, 0); + setWidgetSprite(1076); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(0, 32, 1, 0); + setWidgetSprite(1076); + cs2method1107(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(32, 2, 0, 1); + setWidgetSprite(1077); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(32, 2, 0, 1); + setWidgetSprite(1077); + cs2method1107(1); + setWidgetHFlip(1); + return; +} diff --git a/dumps/scripts/2648.cs2 b/dumps/scripts/2648.cs2 new file mode 100644 index 000000000..52384a7e2 --- /dev/null +++ b/dumps/scripts/2648.cs2 @@ -0,0 +1,6 @@ +void script_2648(int arg0,int arg1) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + globalint_2 = 0; + script_679(arg1); + return; +} diff --git a/dumps/scripts/2649.cs2 b/dumps/scripts/2649.cs2 new file mode 100644 index 000000000..51d382d92 --- /dev/null +++ b/dumps/scripts/2649.cs2 @@ -0,0 +1,4 @@ +void script_2649(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + script_2670(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + return; +} diff --git a/dumps/scripts/265.cs2 b/dumps/scripts/265.cs2 new file mode 100644 index 000000000..948501cc1 --- /dev/null +++ b/dumps/scripts/265.cs2 @@ -0,0 +1,25 @@ +void script_265() { + string svar0; + svar0 = "None"; + switch (globalint_1110) { + case 1: + svar0 = "Standard"; + break; + case 3: + svar0 = "Large"; + break; + case 2: + svar0 = "Slim"; + break; + case 4: + svar0 = "Bone"; + break; + case 5: + svar0 = "Wooden"; + break; + case 6: + svar0 = "Double"; + } + setWidgetText(new WidgetPointer(923,52), svar0); + return; +} diff --git a/dumps/scripts/2650.cs2 b/dumps/scripts/2650.cs2 new file mode 100644 index 000000000..44ea20327 --- /dev/null +++ b/dumps/scripts/2650.cs2 @@ -0,0 +1,9 @@ +void script_2650() { + int ivar0; + ivar0 = 1093; + if (IsFemale()) { + ivar0 = 3872; + } + setWidgetSize(getTextWidth(495, cs2method_3408(105, 115, ivar0, standart_config_1442) + cs2method5015() + "" + ":"), getWidgetActualHeight(new WidgetPointer(137,54)), 0, 0, new WidgetPointer(137,54)); + return; +} diff --git a/dumps/scripts/2651.cs2 b/dumps/scripts/2651.cs2 new file mode 100644 index 000000000..f1418c6ff --- /dev/null +++ b/dumps/scripts/2651.cs2 @@ -0,0 +1,4 @@ +void script_2651(int arg0) { + script_2308(arg0, 0); + return; +} diff --git a/dumps/scripts/2652.cs2 b/dumps/scripts/2652.cs2 new file mode 100644 index 000000000..f9a60cb3a --- /dev/null +++ b/dumps/scripts/2652.cs2 @@ -0,0 +1,4 @@ +void script_2652(int arg0) { + script_2309(arg0, 0); + return; +} diff --git a/dumps/scripts/2653.cs2 b/dumps/scripts/2653.cs2 new file mode 100644 index 000000000..ae2102dde --- /dev/null +++ b/dumps/scripts/2653.cs2 @@ -0,0 +1,4 @@ +void script_2653() { + setWidgetText(new WidgetPointer(918,7), intToStr(standart_config_1652) + " " + cs2method_3408(105, 115, 950, standart_config_1653) + " " + intToStr(standart_config_1654)); + return; +} diff --git a/dumps/scripts/2654.cs2 b/dumps/scripts/2654.cs2 new file mode 100644 index 000000000..0290273f6 --- /dev/null +++ b/dumps/scripts/2654.cs2 @@ -0,0 +1,14 @@ +void script_2654() { + if (getDisplayMode() >= 2) { + setWidgetSprite(1207, new WidgetPointer(748,1)); + setWidgetSprite(1207, new WidgetPointer(748,2)); + setWidgetPosition(25, 1, 0, 0, new WidgetPointer(748,3)); + setWidgetPosition(3, 15, 0, 0, new WidgetPointer(748,8)); + } else { + setWidgetSprite(1206, new WidgetPointer(748,1)); + setWidgetSprite(1206, new WidgetPointer(748,2)); + setWidgetPosition(1, 1, 0, 0, new WidgetPointer(748,3)); + setWidgetPosition(31, 15, 0, 0, new WidgetPointer(748,8)); + } + return; +} diff --git a/dumps/scripts/2655.cs2 b/dumps/scripts/2655.cs2 new file mode 100644 index 000000000..eeab54fb9 --- /dev/null +++ b/dumps/scripts/2655.cs2 @@ -0,0 +1,12 @@ +void script_2655(int arg0,int arg1) { + if (arg0 <= 11) { + setWidgetScrollMax(404, 215, new WidgetPointer(868,6)); + script_72(56885255, 56885254, 0); + } else if (((boolean)arg1)) { + script_72(56885255, 56885254, 0); + } else { + script_72(56885255, 56885254, subtract(multiply(arg0, 20), 180)); + } + setWidgetScrollMax(404, multiply(arg0, 20), new WidgetPointer(868,6)); + return; +} diff --git a/dumps/scripts/2656.cs2 b/dumps/scripts/2656.cs2 new file mode 100644 index 000000000..20bbd1320 --- /dev/null +++ b/dumps/scripts/2656.cs2 @@ -0,0 +1,31 @@ +int script_2656() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + ivar0 = add(ivar0, bitconfig_6113); + ivar1 = divide(add(1, bitconfig_6114), 2); + ivar0 = add(ivar0, ivar1); + ivar1 = divide(bitconfig_6115, 2); + ivar0 = add(ivar0, ivar1); + ivar1 = divide(bitconfig_6116, 2); + ivar0 = add(ivar0, ivar1); + ivar1 = add(add(bitconfig_6117, bitconfig_6118), add(bitconfig_6119, bitconfig_6120)); + ivar0 = add(ivar0, ivar1); + ivar0 = add(bitconfig_6121, ivar0); + ivar1 = divide(bitconfig_6122, 2); + ivar0 = add(ivar0, ivar1); + ivar1 = divide(bitconfig_6123, 2); + ivar0 = add(ivar0, ivar1); + ivar1 = divide(bitconfig_6124, 2); + ivar0 = add(ivar0, ivar1); + ivar1 = divide(bitconfig_6125, 2); + ivar0 = add(ivar0, ivar1); + ivar1 = add(add(add(bitconfig_6151, bitconfig_6152), add(bitconfig_6153, bitconfig_6154)), bitconfig_6155); + ivar0 = add(ivar0, ivar1); + ivar0 = multiply(ivar0, 4); + if ((bitconfig_6112 == 20) && (ivar0 > 75)) { + bitconfig_6112 = 50; + } + return ivar0; +} diff --git a/dumps/scripts/2657.cs2 b/dumps/scripts/2657.cs2 new file mode 100644 index 000000000..968501a41 --- /dev/null +++ b/dumps/scripts/2657.cs2 @@ -0,0 +1,102 @@ +void script_2657() { + bitconfig_6302 = 0; + if (((boolean)bitconfig_6290)) { + setWidgetIsHidden(false, new WidgetPointer(876,4)); + setWidgetIsHidden(true, new WidgetPointer(876,5)); + } + if (((boolean)bitconfig_6290)) { + setWidgetIsHidden(true, new WidgetPointer(876,4)); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, 53651260, 1450, 53733182, 1385, 0); + cs2method5406(1, 0, 53749565, 700, 53749565, 700, 0); + cs2method5406(0, 1, 53765948, 1125, 53782331, 1000, 0); + cs2method5406(1, 1, 53765942, 600, 53765942, 600, 0); + cameraMethod5502(0, 0, 250, 350, 1, 0); + } + if (bitconfig_6290 == 2) { + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, 53798717, 1065, 53798718, 1130, 0); + cs2method5406(1, 0, 53782326, 600, 53782326, 600, 0); + cs2method5406(0, 1, 53831484, 1140, 53880637, 1105, 0); + cs2method5406(1, 1, 53913403, 600, 53946170, 600, 0); + cs2method5406(0, 2, 53897019, 825, 53913404, 565, 0); + cs2method5406(1, 2, 53897015, 600, 53864247, 600, 0); + cameraMethod5502(0, 0, 250, 350, 1, 0); + setScriptCallOnMinimapRelatedSetting3(2658, "", new WidgetPointer(876,0)); + } + if (bitconfig_6290 == 3) { + setWidgetIsHidden(true, new WidgetPointer(876,4)); + cs2method5405(0, 4); + cs2method5405(1, 4); + cs2method5406(0, 0, 55027504, 805, 54978351, 650, 0); + cs2method5406(1, 0, 55027497, 620, 55027497, 580, 0); + cs2method5406(0, 1, 55043882, 725, 55093034, 650, 0); + cs2method5406(1, 1, 55109414, 555, 55109414, 505, 0); + cs2method5406(0, 2, 55191335, 800, 55207717, 740, 0); + cs2method5406(1, 2, 55207715, 525, 55207714, 505, 0); + cs2method5406(0, 3, 55224098, 745, 55224096, 650, 0); + cs2method5406(1, 3, 55224092, 600, 55240475, 670, 0); + cameraMethod5502(0, 0, 300, 400, 1, 0); + setScriptCallOnMinimapRelatedSetting3(2658, "", new WidgetPointer(876,0)); + } + if (bitconfig_6290 == 4) { + setWidgetIsHidden(true, new WidgetPointer(876,4)); + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, 53782327, 1125, 53798710, 1085, 0); + cs2method5406(1, 0, 53782322, 750, 53782323, 750, 0); + cs2method5406(0, 1, 53798703, 1015, 53782318, 865, 0); + cs2method5406(1, 1, 53733165, 750, 53733167, 750, 0); + cs2method5406(0, 2, 53684015, 980, 53651247, 865, 0); + cs2method5406(1, 2, 53651241, 620, 53651240, 540, 0); + cameraMethod5502(0, 0, 300, 400, 1, 0); + setScriptCallOnMinimapRelatedSetting3(2658, "", new WidgetPointer(876,0)); + } + if (bitconfig_6290 == 5) { + setWidgetIsHidden(false, new WidgetPointer(876,5)); + } + if (bitconfig_6290 == 6) { + cs2method5405(0, 6); + cs2method5405(0, 6); + cs2method5405(1, 6); + cs2method5406(0, 0, 53684015, 980, 53651247, 1185, 0); + cs2method5406(1, 0, 53651241, 620, 53651240, 540, 0); + cs2method5406(0, 1, 53749551, 1190, 53765935, 1165, 0); + cs2method5406(1, 1, 53798702, 750, 53847854, 750, 0); + cs2method5406(0, 2, 53815087, 1220, 53847854, 1190, 0); + cs2method5406(1, 2, 53864237, 750, 53880620, 750, 0); + cs2method5406(0, 3, 53864238, 1160, 53897005, 1135, 0); + cs2method5406(1, 3, 53897001, 750, 53913383, 750, 0); + cs2method5406(0, 4, 53897003, 1045, 53913386, 1005, 0); + cs2method5406(1, 4, 53929766, 750, 53946149, 750, 0); + cs2method5406(0, 5, 53913383, 975, 53913384, 920, 0); + cs2method5406(1, 5, 53978919, 725, 53978920, 725, 0); + cameraMethod5502(0, 0, 500, 600, 1, 0); + setScriptCallOnMinimapRelatedSetting3(2658, "", new WidgetPointer(876,0)); + } + if (bitconfig_6290 == 7) { + setWidgetIsHidden(true, new WidgetPointer(876,5)); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, 53913383, 975, 53929767, 1410, 0); + cs2method5406(1, 0, 53978919, 725, 54011687, 725, 0); + cs2method5406(0, 1, 53978919, 915, 53995303, 800, 0); + cs2method5406(1, 1, 54060839, 650, 54060839, 725, 0); + cameraMethod5502(0, 0, 400, 200, 1, 0); + setScriptCallOnMinimapRelatedSetting3(2658, "", new WidgetPointer(876,0)); + } + if (bitconfig_6290 == 8) { + setWidgetIsHidden(true, new WidgetPointer(876,5)); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, 53978919, 915, 53995303, 960, 0); + cs2method5406(1, 0, 54060839, 650, 54060839, 725, 0); + cs2method5406(0, 1, 54093606, 985, 54093606, 950, 0); + cs2method5406(1, 1, 54142759, 800, 54142759, 800, 0); + cameraMethod5502(0, 0, 400, 200, 1, 0); + setScriptCallOnMinimapRelatedSetting3(2658, "", new WidgetPointer(876,0)); + } + return; +} diff --git a/dumps/scripts/2658.cs2 b/dumps/scripts/2658.cs2 new file mode 100644 index 000000000..a08eb6d04 --- /dev/null +++ b/dumps/scripts/2658.cs2 @@ -0,0 +1,11 @@ +void script_2658() { + bitconfig_6302 = add(bitconfig_6302, 1); + if (bitconfig_6302 >= subtract(cs2method5407(0), 1)) { + bitconfig_6302 = 0; + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(876,0)); + return; + } + cameraMethod5502(0, bitconfig_6302, 600, 400, 1, bitconfig_6302); + setScriptCallOnMinimapRelatedSetting3(2658, "", new WidgetPointer(876,0)); + return; +} diff --git a/dumps/scripts/2659.cs2 b/dumps/scripts/2659.cs2 new file mode 100644 index 000000000..589a43d22 --- /dev/null +++ b/dumps/scripts/2659.cs2 @@ -0,0 +1,11 @@ +void script_2659() { + setWidgetIsHidden(true, new WidgetPointer(866,5)); + setWidgetIsHidden(false, new WidgetPointer(866,10)); + setWidgetIsHidden(false, new WidgetPointer(866,8)); + setWidgetIsHidden(true, new WidgetPointer(866,13)); + setWidgetIsHidden(false, new WidgetPointer(866,7)); + setWidgetIsHidden(true, new WidgetPointer(866,12)); + setWidgetIsHidden(false, new WidgetPointer(866,6)); + setWidgetIsHidden(true, new WidgetPointer(866,11)); + return; +} diff --git a/dumps/scripts/266.cs2 b/dumps/scripts/266.cs2 new file mode 100644 index 000000000..31df83c4b --- /dev/null +++ b/dumps/scripts/266.cs2 @@ -0,0 +1,28 @@ +void script_266() { + string svar0; + globalarray_0 = new int[4]; + globalarray_0[globalint_1104] = add(globalarray_0[globalint_1104], 1); + globalarray_0[globalint_1105] = add(globalarray_0[globalint_1105], 1); + globalarray_0[globalint_1106] = add(globalarray_0[globalint_1106], 1); + globalarray_0[globalint_1107] = add(globalarray_0[globalint_1107], 1); + globalarray_0[globalint_1108] = add(globalarray_0[globalint_1108], 1); + setWidgetText(new WidgetPointer(923,53), "Small x " + intToStr(globalarray_0[1])); + setWidgetText(new WidgetPointer(923,54), "Med. x " + intToStr(globalarray_0[2])); + setWidgetText(new WidgetPointer(923,55), "Large x " + intToStr(globalarray_0[3])); + svar0 = ""; + if (globalarray_0[1] > 0) { + svar0 = "Remove-weight"; + } + setWidgetContextMenuOption(1, new WidgetPointer(923,53), svar0); + svar0 = ""; + if (globalarray_0[2] > 0) { + svar0 = "Remove-weight"; + } + setWidgetContextMenuOption(1, new WidgetPointer(923,54), svar0); + svar0 = ""; + if (globalarray_0[3] > 0) { + svar0 = "Remove-weight"; + } + setWidgetContextMenuOption(1, new WidgetPointer(923,55), svar0); + return; +} diff --git a/dumps/scripts/2660.cs2 b/dumps/scripts/2660.cs2 new file mode 100644 index 000000000..677fbf6a0 --- /dev/null +++ b/dumps/scripts/2660.cs2 @@ -0,0 +1,11 @@ +void script_2660() { + setWidgetIsHidden(false, new WidgetPointer(866,5)); + setWidgetIsHidden(true, new WidgetPointer(866,10)); + setWidgetIsHidden(true, new WidgetPointer(866,8)); + setWidgetIsHidden(false, new WidgetPointer(866,13)); + setWidgetIsHidden(false, new WidgetPointer(866,7)); + setWidgetIsHidden(true, new WidgetPointer(866,12)); + setWidgetIsHidden(false, new WidgetPointer(866,6)); + setWidgetIsHidden(true, new WidgetPointer(866,11)); + return; +} diff --git a/dumps/scripts/2661.cs2 b/dumps/scripts/2661.cs2 new file mode 100644 index 000000000..c41c9e15c --- /dev/null +++ b/dumps/scripts/2661.cs2 @@ -0,0 +1,11 @@ +void script_2661() { + setWidgetIsHidden(false, new WidgetPointer(866,5)); + setWidgetIsHidden(true, new WidgetPointer(866,10)); + setWidgetIsHidden(false, new WidgetPointer(866,8)); + setWidgetIsHidden(true, new WidgetPointer(866,13)); + setWidgetIsHidden(true, new WidgetPointer(866,7)); + setWidgetIsHidden(false, new WidgetPointer(866,12)); + setWidgetIsHidden(false, new WidgetPointer(866,6)); + setWidgetIsHidden(true, new WidgetPointer(866,11)); + return; +} diff --git a/dumps/scripts/2662.cs2 b/dumps/scripts/2662.cs2 new file mode 100644 index 000000000..f99479280 --- /dev/null +++ b/dumps/scripts/2662.cs2 @@ -0,0 +1,11 @@ +void script_2662() { + setWidgetIsHidden(false, new WidgetPointer(866,5)); + setWidgetIsHidden(true, new WidgetPointer(866,10)); + setWidgetIsHidden(false, new WidgetPointer(866,8)); + setWidgetIsHidden(true, new WidgetPointer(866,13)); + setWidgetIsHidden(false, new WidgetPointer(866,7)); + setWidgetIsHidden(true, new WidgetPointer(866,12)); + setWidgetIsHidden(true, new WidgetPointer(866,6)); + setWidgetIsHidden(false, new WidgetPointer(866,11)); + return; +} diff --git a/dumps/scripts/2663.cs2 b/dumps/scripts/2663.cs2 new file mode 100644 index 000000000..14ef341bc --- /dev/null +++ b/dumps/scripts/2663.cs2 @@ -0,0 +1,12 @@ +void script_2663() { + int ivar0; + int ivar1; + ivar0 = ((int)cs2method_3408(105, 73, 2566, bitconfig_6297)); + ivar1 = ((int)cs2method_3408(105, 73, 2565, bitconfig_6297)); + if (getWidgetActualX(new WidgetPointer(ivar0)) > 3) { + playSoundEffect2False(7570, 1, 0, 50); + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(ivar0)), 2), getWidgetActualY(new WidgetPointer(ivar0)), 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(ivar1)), 2), getWidgetActualY(new WidgetPointer(ivar1)), 0, 0, new WidgetPointer(ivar1)); + } + return; +} diff --git a/dumps/scripts/2664.cs2 b/dumps/scripts/2664.cs2 new file mode 100644 index 000000000..2d8d7147b --- /dev/null +++ b/dumps/scripts/2664.cs2 @@ -0,0 +1,12 @@ +void script_2664() { + int ivar0; + int ivar1; + ivar0 = ((int)cs2method_3408(105, 73, 2566, bitconfig_6297)); + ivar1 = ((int)cs2method_3408(105, 73, 2565, bitconfig_6297)); + if (getWidgetActualX(new WidgetPointer(ivar0)) < 353) { + playSoundEffect2False(7570, 1, 0, 50); + setWidgetPosition(add(getWidgetActualX(new WidgetPointer(ivar0)), 2), getWidgetActualY(new WidgetPointer(ivar0)), 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(add(getWidgetActualX(new WidgetPointer(ivar1)), 2), getWidgetActualY(new WidgetPointer(ivar1)), 0, 0, new WidgetPointer(ivar1)); + } + return; +} diff --git a/dumps/scripts/2665.cs2 b/dumps/scripts/2665.cs2 new file mode 100644 index 000000000..deadb7602 --- /dev/null +++ b/dumps/scripts/2665.cs2 @@ -0,0 +1,12 @@ +void script_2665() { + int ivar0; + int ivar1; + ivar0 = ((int)cs2method_3408(105, 73, 2566, bitconfig_6297)); + ivar1 = ((int)cs2method_3408(105, 73, 2565, bitconfig_6297)); + if (getWidgetActualY(new WidgetPointer(ivar0)) > -13) { + playSoundEffect2False(7570, 1, 0, 50); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar0)), subtract(getWidgetActualY(new WidgetPointer(ivar0)), 2), 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar1)), subtract(getWidgetActualY(new WidgetPointer(ivar1)), 2), 0, 0, new WidgetPointer(ivar1)); + } + return; +} diff --git a/dumps/scripts/2666.cs2 b/dumps/scripts/2666.cs2 new file mode 100644 index 000000000..b41a5d744 --- /dev/null +++ b/dumps/scripts/2666.cs2 @@ -0,0 +1,12 @@ +void script_2666() { + int ivar0; + int ivar1; + ivar0 = ((int)cs2method_3408(105, 73, 2566, bitconfig_6297)); + ivar1 = ((int)cs2method_3408(105, 73, 2565, bitconfig_6297)); + if (getWidgetActualY(new WidgetPointer(ivar0)) < 293) { + playSoundEffect2False(7570, 1, 0, 50); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar0)), add(getWidgetActualY(new WidgetPointer(ivar0)), 2), 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar1)), add(getWidgetActualY(new WidgetPointer(ivar1)), 2), 0, 0, new WidgetPointer(ivar1)); + } + return; +} diff --git a/dumps/scripts/2667.cs2 b/dumps/scripts/2667.cs2 new file mode 100644 index 000000000..48f28e129 --- /dev/null +++ b/dumps/scripts/2667.cs2 @@ -0,0 +1,55 @@ +void script_2667() { + int ivar0; + int ivar1; + ivar0 = ((int)cs2method_3408(105, 73, 2566, bitconfig_6297)); + ivar1 = ((int)cs2method_3408(105, 73, 2565, bitconfig_6297)); + if ((getWidgetActualX(new WidgetPointer(ivar0)) < 17) || (getWidgetActualX(new WidgetPointer(ivar0)) > 57)) { + return; + } + if ((getWidgetActualY(new WidgetPointer(ivar0)) > 12) && (getWidgetActualY(new WidgetPointer(ivar0)) < 32)) { + setWidgetPosition(37, 22, 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(37, 22, 0, 0, new WidgetPointer(ivar1)); + return; + } + if ((getWidgetActualY(new WidgetPointer(ivar0)) > 38) && (getWidgetActualY(new WidgetPointer(ivar0)) < 58)) { + setWidgetPosition(37, 48, 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(37, 48, 0, 0, new WidgetPointer(ivar1)); + return; + } + if ((getWidgetActualY(new WidgetPointer(ivar0)) > 70) && (getWidgetActualY(new WidgetPointer(ivar0)) < 90)) { + setWidgetPosition(37, 80, 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(37, 80, 0, 0, new WidgetPointer(ivar1)); + return; + } + if ((getWidgetActualY(new WidgetPointer(ivar0)) > 98) && (getWidgetActualY(new WidgetPointer(ivar0)) < 118)) { + setWidgetPosition(37, 108, 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(37, 108, 0, 0, new WidgetPointer(ivar1)); + return; + } + if ((getWidgetActualY(new WidgetPointer(ivar0)) > 128) && (getWidgetActualY(new WidgetPointer(ivar0)) < 148)) { + setWidgetPosition(37, 138, 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(37, 138, 0, 0, new WidgetPointer(ivar1)); + return; + } + if ((getWidgetActualY(new WidgetPointer(ivar0)) > 156) && (getWidgetActualY(new WidgetPointer(ivar0)) < 176)) { + setWidgetPosition(37, 166, 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(37, 166, 0, 0, new WidgetPointer(ivar1)); + return; + } + if ((getWidgetActualY(new WidgetPointer(ivar0)) > 184) && (getWidgetActualY(new WidgetPointer(ivar0)) < 204)) { + setWidgetPosition(37, 194, 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(37, 194, 0, 0, new WidgetPointer(ivar1)); + return; + } + if ((getWidgetActualY(new WidgetPointer(ivar0)) > 214) && (getWidgetActualY(new WidgetPointer(ivar0)) < 234)) { + setWidgetPosition(37, 224, 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(37, 224, 0, 0, new WidgetPointer(ivar1)); + return; + } + if ((getWidgetActualY(new WidgetPointer(ivar0)) > 242) && (getWidgetActualY(new WidgetPointer(ivar0)) < 262)) { + setWidgetPosition(37, 252, 0, 0, new WidgetPointer(ivar0)); + setWidgetPosition(37, 252, 0, 0, new WidgetPointer(ivar1)); + return; + } + return; +} diff --git a/dumps/scripts/2668.cs2 b/dumps/scripts/2668.cs2 new file mode 100644 index 000000000..4f59a22c4 --- /dev/null +++ b/dumps/scripts/2668.cs2 @@ -0,0 +1,9 @@ +void script_2668() { + if (((boolean)bitconfig_6303)) { + setWidgetIsHidden(true, new WidgetPointer(866,5)); + setWidgetIsHidden(true, new WidgetPointer(866,8)); + setWidgetIsHidden(true, new WidgetPointer(866,7)); + setWidgetIsHidden(true, new WidgetPointer(866,6)); + } + return; +} diff --git a/dumps/scripts/2669.cs2 b/dumps/scripts/2669.cs2 new file mode 100644 index 000000000..d5a4caaf6 --- /dev/null +++ b/dumps/scripts/2669.cs2 @@ -0,0 +1,33 @@ +void script_2669() { + if (((boolean)bitconfig_6304)) { + setWidgetModel(48047, new WidgetPointer(866,64)); + } + if (((boolean)bitconfig_6304)) { + setWidgetModel(48028, new WidgetPointer(866,64)); + } + if (bitconfig_6304 == 2) { + setWidgetModel(48038, new WidgetPointer(866,64)); + } + if (bitconfig_6304 == 3) { + setWidgetModel(48027, new WidgetPointer(866,64)); + } + if (bitconfig_6304 == 4) { + setWidgetModel(48030, new WidgetPointer(866,64)); + } + if (bitconfig_6304 == 5) { + setWidgetModel(48052, new WidgetPointer(866,64)); + } + if (bitconfig_6304 == 6) { + setWidgetModel(48051, new WidgetPointer(866,64)); + } + if (bitconfig_6304 == 7) { + setWidgetModel(48050, new WidgetPointer(866,64)); + } + if (bitconfig_6304 == 8) { + setWidgetModel(48015, new WidgetPointer(866,64)); + } + if (bitconfig_6304 == 9) { + setWidgetModel(48029, new WidgetPointer(866,64)); + } + return; +} diff --git a/dumps/scripts/267.cs2 b/dumps/scripts/267.cs2 new file mode 100644 index 000000000..a50fb5a14 --- /dev/null +++ b/dumps/scripts/267.cs2 @@ -0,0 +1,40 @@ +void script_267(int arg0) { + int ivar1; + int ivar2; + int ivar3; + if (script_269() >= 5) { + return; + } + globalarray_0 = new int[5]; + globalarray_0[0] = globalint_1104; + globalarray_0[1] = globalint_1105; + globalarray_0[2] = globalint_1106; + globalarray_0[3] = globalint_1107; + globalarray_0[4] = globalint_1108; + globalarray_1 = new int[5]; + ivar1 = 0; + ivar2 = 0; + ivar3 = 3; + while (ivar3 > 0) { + if (arg0 == ivar3) { + globalarray_0[ivar2] = arg0; + ivar2 = add(ivar2, 1); + } + ivar1 = 0; + while (ivar1 < 5) { + if (globalarray_0[ivar1] == ivar3) { + globalarray_0[ivar2] = ivar3; + ivar2 = add(ivar2, 1); + } + ivar1 = add(ivar1, 1); + } + ivar3 = subtract(ivar3, 1); + } + globalint_1104 = globalarray_1[0]; + globalint_1105 = globalarray_1[1]; + globalint_1106 = globalarray_1[2]; + globalint_1107 = globalarray_1[3]; + globalint_1108 = globalarray_1[4]; + script_261(); + return; +} diff --git a/dumps/scripts/2670.cs2 b/dumps/scripts/2670.cs2 new file mode 100644 index 000000000..c41e48f99 --- /dev/null +++ b/dumps/scripts/2670.cs2 @@ -0,0 +1,112 @@ +void script_2670(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + int ivar9; + int ivar10; + ivar9 = 952; + ivar10 = 953; + if (((boolean)arg8)) { + globalint_91 = 0; + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg6)); + setWidgetNoOptions(new WidgetPointer(arg3)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg3)); + setWidgetSprite(ivar10, new WidgetPointer(arg7)); + setWidgetSprite(ivar10, new WidgetPointer(arg5)); + setWidgetSprite(ivar10, new WidgetPointer(arg2)); + setWidgetSprite(ivar9, new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg3)); + setWidgetContextMenuOption(1, new WidgetPointer(arg2), "Clan"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 1, "IIIIIIIIi", new WidgetPointer(arg2)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg2)); + setWidgetContextMenuOption(1, new WidgetPointer(arg5), "Friend"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 2, "IIIIIIIIi", new WidgetPointer(arg5)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg5)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg5)); + setWidgetContextMenuOption(1, new WidgetPointer(arg7), "Guest"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 3, "IIIIIIIIi", new WidgetPointer(arg7)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg7)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg7)); + } else if (((boolean)arg8)) { + globalint_91 = 1; + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg6)); + setWidgetNoOptions(new WidgetPointer(arg2)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg2)); + setWidgetSprite(ivar10, new WidgetPointer(arg7)); + setWidgetSprite(ivar10, new WidgetPointer(arg5)); + setWidgetSprite(ivar9, new WidgetPointer(arg2)); + setWidgetSprite(ivar10, new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg2)); + setWidgetContextMenuOption(1, new WidgetPointer(arg3), "Private"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 0, "IIIIIIIIi", new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg3)); + setWidgetContextMenuOption(1, new WidgetPointer(arg5), "Friend"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 2, "IIIIIIIIi", new WidgetPointer(arg5)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg5)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg5)); + setWidgetContextMenuOption(1, new WidgetPointer(arg7), "Guest"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 3, "IIIIIIIIi", new WidgetPointer(arg7)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg7)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg7)); + } else if (arg8 == 2) { + globalint_91 = 2; + setWidgetIsHidden(false, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg6)); + setWidgetNoOptions(new WidgetPointer(arg5)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg5)); + setWidgetSprite(ivar10, new WidgetPointer(arg7)); + setWidgetSprite(ivar9, new WidgetPointer(arg5)); + setWidgetSprite(ivar10, new WidgetPointer(arg2)); + setWidgetSprite(ivar10, new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg5)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg5)); + setWidgetContextMenuOption(1, new WidgetPointer(arg3), "Private"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 0, "IIIIIIIIi", new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg3)); + setWidgetContextMenuOption(1, new WidgetPointer(arg2), "Clan"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 1, "IIIIIIIIi", new WidgetPointer(arg2)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg2)); + setWidgetContextMenuOption(1, new WidgetPointer(arg7), "Guest"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 3, "IIIIIIIIi", new WidgetPointer(arg7)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg7)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg7)); + } else { + globalint_91 = 3; + setWidgetIsHidden(false, new WidgetPointer(arg6)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetNoOptions(new WidgetPointer(arg7)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg7)); + setWidgetSprite(ivar9, new WidgetPointer(arg7)); + setWidgetSprite(ivar10, new WidgetPointer(arg5)); + setWidgetSprite(ivar10, new WidgetPointer(arg2)); + setWidgetSprite(ivar10, new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg7)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg7)); + setWidgetContextMenuOption(1, new WidgetPointer(arg3), "Private"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 0, "IIIIIIIIi", new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg3)); + setWidgetContextMenuOption(1, new WidgetPointer(arg2), "Clan"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 1, "IIIIIIIIi", new WidgetPointer(arg2)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg2)); + setWidgetContextMenuOption(1, new WidgetPointer(arg5), "Friend"); + setScriptCallOnClickContextMenu(2649, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), 2, "IIIIIIIIi", new WidgetPointer(arg5)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar9, "Id", new WidgetPointer(arg5)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(arg5)); + } + return; +} diff --git a/dumps/scripts/2671.cs2 b/dumps/scripts/2671.cs2 new file mode 100644 index 000000000..5c56670f6 --- /dev/null +++ b/dumps/scripts/2671.cs2 @@ -0,0 +1,52 @@ +void script_2671() { + if (((boolean)bitconfig_6454)) { + setWidgetIsHidden(false, new WidgetPointer(747,18)); + setWidgetIsHidden(true, new WidgetPointer(747,9)); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,18)); + setWidgetIsHidden(false, new WidgetPointer(747,9)); + } + if (bitconfig_6454 == 2) { + setWidgetIsHidden(false, new WidgetPointer(747,23)); + setWidgetIsHidden(true, new WidgetPointer(747,14)); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,23)); + setWidgetIsHidden(false, new WidgetPointer(747,14)); + } + if (bitconfig_6454 == 3) { + setWidgetIsHidden(false, new WidgetPointer(747,19)); + setWidgetIsHidden(true, new WidgetPointer(747,10)); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,19)); + setWidgetIsHidden(false, new WidgetPointer(747,10)); + } + if (bitconfig_6454 == 4) { + setWidgetIsHidden(false, new WidgetPointer(747,20)); + setWidgetIsHidden(true, new WidgetPointer(747,11)); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,20)); + setWidgetIsHidden(false, new WidgetPointer(747,11)); + } + if (bitconfig_6454 == 5) { + setWidgetIsHidden(false, new WidgetPointer(747,21)); + setWidgetIsHidden(true, new WidgetPointer(747,12)); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,21)); + setWidgetIsHidden(false, new WidgetPointer(747,12)); + } + if (bitconfig_6454 == 6) { + setWidgetIsHidden(false, new WidgetPointer(747,22)); + setWidgetIsHidden(true, new WidgetPointer(747,13)); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,22)); + setWidgetIsHidden(false, new WidgetPointer(747,13)); + } + if (bitconfig_6454 == 7) { + setWidgetIsHidden(false, new WidgetPointer(747,26)); + setWidgetIsHidden(true, new WidgetPointer(747,15)); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,26)); + setWidgetIsHidden(false, new WidgetPointer(747,15)); + } + return; +} diff --git a/dumps/scripts/2672.cs2 b/dumps/scripts/2672.cs2 new file mode 100644 index 000000000..655923559 --- /dev/null +++ b/dumps/scripts/2672.cs2 @@ -0,0 +1,4 @@ +void script_2672() { + script_2674(bitconfig_6455); + return; +} diff --git a/dumps/scripts/2673.cs2 b/dumps/scripts/2673.cs2 new file mode 100644 index 000000000..6ecc7d79c --- /dev/null +++ b/dumps/scripts/2673.cs2 @@ -0,0 +1,4 @@ +void script_2673(int arg0) { + script_2674(arg0); + return; +} diff --git a/dumps/scripts/2674.cs2 b/dumps/scripts/2674.cs2 new file mode 100644 index 000000000..0a06122b6 --- /dev/null +++ b/dumps/scripts/2674.cs2 @@ -0,0 +1,43 @@ +void script_2674(int arg0) { + if (arg0 != 0) { + setWidgetSprite(2034, new WidgetPointer(880,7)); + } else { + setWidgetSprite(2035, new WidgetPointer(880,7)); + } + if (arg0 != 1) { + setWidgetSprite(2034, new WidgetPointer(880,9)); + } else { + setWidgetSprite(2035, new WidgetPointer(880,9)); + } + if (arg0 != 2) { + setWidgetSprite(2034, new WidgetPointer(880,11)); + } else { + setWidgetSprite(2035, new WidgetPointer(880,11)); + } + if (arg0 != 3) { + setWidgetSprite(2034, new WidgetPointer(880,13)); + } else { + setWidgetSprite(2035, new WidgetPointer(880,13)); + } + if (arg0 != 4) { + setWidgetSprite(2034, new WidgetPointer(880,15)); + } else { + setWidgetSprite(2035, new WidgetPointer(880,15)); + } + if (arg0 != 5) { + setWidgetSprite(2034, new WidgetPointer(880,17)); + } else { + setWidgetSprite(2035, new WidgetPointer(880,17)); + } + if (arg0 != 6) { + setWidgetSprite(2034, new WidgetPointer(880,19)); + } else { + setWidgetSprite(2035, new WidgetPointer(880,19)); + } + if (arg0 != 7) { + setWidgetSprite(2034, new WidgetPointer(880,25)); + } else { + setWidgetSprite(2035, new WidgetPointer(880,25)); + } + return; +} diff --git a/dumps/scripts/2675.cs2 b/dumps/scripts/2675.cs2 new file mode 100644 index 000000000..e8a7bdb76 --- /dev/null +++ b/dumps/scripts/2675.cs2 @@ -0,0 +1,4 @@ +void script_2675(int arg0,int arg1) { + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2676.cs2 b/dumps/scripts/2676.cs2 new file mode 100644 index 000000000..5b59e9b0b --- /dev/null +++ b/dumps/scripts/2676.cs2 @@ -0,0 +1,32 @@ +void script_2676(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + switch (arg1) { + case 1: + ivar2 = standart_config_1485; + break; + case 2: + ivar2 = standart_config_1486; + break; + case 3: + ivar2 = standart_config_1487; + break; + case 4: + ivar2 = standart_config_1488; + break; + case 5: + ivar2 = standart_config_1489; + break; + case 6: + ivar2 = standart_config_1490; + break; + case 7: + ivar2 = standart_config_1491; + } + if (((boolean)ivar2)) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2677.cs2 b/dumps/scripts/2677.cs2 new file mode 100644 index 000000000..45f01a702 --- /dev/null +++ b/dumps/scripts/2677.cs2 @@ -0,0 +1,5 @@ +void script_2677() { + setWidgetScrollMax(431, 1863, new WidgetPointer(467,11)); + script_31(30605325, 30605323, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/2678.cs2 b/dumps/scripts/2678.cs2 new file mode 100644 index 000000000..3ff9283e6 --- /dev/null +++ b/dumps/scripts/2678.cs2 @@ -0,0 +1,155 @@ +void script_2678() { + flow_0: + SWITCH (globalint_943) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + } + setWidgetModel(15185, new WidgetPointer(400,11)); + setWidgetModel(15185, new WidgetPointer(400,8)); + setWidgetModel(15179, new WidgetPointer(400,3)); + setWidgetModel(15185, new WidgetPointer(400,10)); + setWidgetModel(15185, new WidgetPointer(400,6)); + setWidgetModel(15181, new WidgetPointer(400,4)); + setWidgetModel(15185, new WidgetPointer(400,7)); + setWidgetModel(15185, new WidgetPointer(400,9)); + setWidgetModel(15202, new WidgetPointer(400,15)); + setWidgetModel(15187, new WidgetPointer(400,12)); + setWidgetModel(15196, new WidgetPointer(400,13)); + setWidgetModel(15183, new WidgetPointer(400,5)); + setWidgetModel(15177, new WidgetPointer(400,2)); + setWidgetModel(15204, new WidgetPointer(400,16)); + setWidgetModel(15200, new WidgetPointer(400,14)); + GOTO flow_8 + flow_1: + setWidgetModel(15192, new WidgetPointer(400,11)); + setWidgetModel(15185, new WidgetPointer(400,8)); + setWidgetModel(15179, new WidgetPointer(400,3)); + setWidgetModel(15185, new WidgetPointer(400,10)); + setWidgetModel(15185, new WidgetPointer(400,6)); + setWidgetModel(15181, new WidgetPointer(400,4)); + setWidgetModel(15185, new WidgetPointer(400,7)); + setWidgetModel(15185, new WidgetPointer(400,9)); + setWidgetModel(15203, new WidgetPointer(400,15)); + setWidgetModel(15187, new WidgetPointer(400,12)); + setWidgetModel(15196, new WidgetPointer(400,13)); + setWidgetModel(15183, new WidgetPointer(400,5)); + setWidgetModel(15177, new WidgetPointer(400,2)); + setWidgetModel(15204, new WidgetPointer(400,16)); + setWidgetModel(15200, new WidgetPointer(400,14)); + GOTO flow_8 + flow_2: + setWidgetModel(15192, new WidgetPointer(400,11)); + setWidgetModel(15185, new WidgetPointer(400,8)); + setWidgetModel(15179, new WidgetPointer(400,3)); + setWidgetModel(15185, new WidgetPointer(400,10)); + setWidgetModel(15185, new WidgetPointer(400,6)); + setWidgetModel(15181, new WidgetPointer(400,4)); + setWidgetModel(15185, new WidgetPointer(400,7)); + setWidgetModel(15185, new WidgetPointer(400,9)); + setWidgetModel(15203, new WidgetPointer(400,15)); + setWidgetModel(15193, new WidgetPointer(400,12)); + setWidgetModel(15197, new WidgetPointer(400,13)); + setWidgetModel(15183, new WidgetPointer(400,5)); + setWidgetModel(15177, new WidgetPointer(400,2)); + setWidgetModel(15204, new WidgetPointer(400,16)); + setWidgetModel(15200, new WidgetPointer(400,14)); + GOTO flow_8 + flow_3: + setWidgetModel(15192, new WidgetPointer(400,11)); + setWidgetModel(15189, new WidgetPointer(400,8)); + setWidgetModel(15180, new WidgetPointer(400,3)); + setWidgetModel(15185, new WidgetPointer(400,10)); + setWidgetModel(15185, new WidgetPointer(400,6)); + setWidgetModel(15181, new WidgetPointer(400,4)); + setWidgetModel(15185, new WidgetPointer(400,7)); + setWidgetModel(15185, new WidgetPointer(400,9)); + setWidgetModel(15203, new WidgetPointer(400,15)); + setWidgetModel(15187, new WidgetPointer(400,12)); + setWidgetModel(15196, new WidgetPointer(400,13)); + setWidgetModel(15183, new WidgetPointer(400,5)); + setWidgetModel(15177, new WidgetPointer(400,2)); + setWidgetModel(15204, new WidgetPointer(400,16)); + setWidgetModel(15200, new WidgetPointer(400,14)); + GOTO flow_8 + flow_4: + setWidgetModel(15192, new WidgetPointer(400,11)); + setWidgetModel(15185, new WidgetPointer(400,8)); + setWidgetModel(15179, new WidgetPointer(400,3)); + setWidgetModel(15185, new WidgetPointer(400,10)); + setWidgetModel(15185, new WidgetPointer(400,6)); + setWidgetModel(15181, new WidgetPointer(400,4)); + setWidgetModel(15185, new WidgetPointer(400,7)); + setWidgetModel(15185, new WidgetPointer(400,9)); + setWidgetModel(15203, new WidgetPointer(400,15)); + setWidgetModel(15193, new WidgetPointer(400,12)); + setWidgetModel(15197, new WidgetPointer(400,13)); + setWidgetModel(15184, new WidgetPointer(400,5)); + setWidgetModel(15178, new WidgetPointer(400,2)); + setWidgetModel(15204, new WidgetPointer(400,16)); + setWidgetModel(15200, new WidgetPointer(400,14)); + GOTO flow_8 + flow_5: + setWidgetModel(15192, new WidgetPointer(400,11)); + setWidgetModel(15189, new WidgetPointer(400,8)); + setWidgetModel(15180, new WidgetPointer(400,3)); + setWidgetModel(15191, new WidgetPointer(400,10)); + setWidgetModel(15186, new WidgetPointer(400,6)); + setWidgetModel(15181, new WidgetPointer(400,4)); + setWidgetModel(15185, new WidgetPointer(400,7)); + setWidgetModel(15185, new WidgetPointer(400,9)); + setWidgetModel(15203, new WidgetPointer(400,15)); + setWidgetModel(15187, new WidgetPointer(400,12)); + setWidgetModel(15196, new WidgetPointer(400,13)); + setWidgetModel(15183, new WidgetPointer(400,5)); + setWidgetModel(15177, new WidgetPointer(400,2)); + setWidgetModel(15204, new WidgetPointer(400,16)); + setWidgetModel(15200, new WidgetPointer(400,14)); + GOTO flow_8 + flow_6: + setWidgetModel(15192, new WidgetPointer(400,11)); + setWidgetModel(15185, new WidgetPointer(400,8)); + setWidgetModel(15179, new WidgetPointer(400,3)); + setWidgetModel(15185, new WidgetPointer(400,10)); + setWidgetModel(15185, new WidgetPointer(400,6)); + setWidgetModel(15181, new WidgetPointer(400,4)); + setWidgetModel(15185, new WidgetPointer(400,7)); + setWidgetModel(15185, new WidgetPointer(400,9)); + setWidgetModel(15203, new WidgetPointer(400,15)); + setWidgetModel(15193, new WidgetPointer(400,12)); + setWidgetModel(15197, new WidgetPointer(400,13)); + setWidgetModel(15184, new WidgetPointer(400,5)); + setWidgetModel(15178, new WidgetPointer(400,2)); + setWidgetModel(15205, new WidgetPointer(400,16)); + setWidgetModel(15201, new WidgetPointer(400,14)); + GOTO flow_8 + flow_7: + setWidgetModel(15192, new WidgetPointer(400,11)); + setWidgetModel(15189, new WidgetPointer(400,8)); + setWidgetModel(15180, new WidgetPointer(400,3)); + setWidgetModel(15191, new WidgetPointer(400,10)); + setWidgetModel(15186, new WidgetPointer(400,6)); + setWidgetModel(15182, new WidgetPointer(400,4)); + setWidgetModel(15188, new WidgetPointer(400,7)); + setWidgetModel(15190, new WidgetPointer(400,9)); + setWidgetModel(15203, new WidgetPointer(400,15)); + setWidgetModel(15187, new WidgetPointer(400,12)); + setWidgetModel(15196, new WidgetPointer(400,13)); + setWidgetModel(15183, new WidgetPointer(400,5)); + setWidgetModel(15177, new WidgetPointer(400,2)); + setWidgetModel(15204, new WidgetPointer(400,16)); + setWidgetModel(15200, new WidgetPointer(400,14)); + flow_8: + return; +} diff --git a/dumps/scripts/2679.cs2 b/dumps/scripts/2679.cs2 new file mode 100644 index 000000000..d0609294c --- /dev/null +++ b/dumps/scripts/2679.cs2 @@ -0,0 +1,5 @@ +void script_2679() { + setWidgetScrollMax(250, 981, new WidgetPointer(397,11)); + script_31(26017856, 26017803, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/268.cs2 b/dumps/scripts/268.cs2 new file mode 100644 index 000000000..72112f0aa --- /dev/null +++ b/dumps/scripts/268.cs2 @@ -0,0 +1,24 @@ +void script_268(int arg0) { + int ivar1; + globalarray_0 = new int[5]; + globalarray_0[0] = globalint_1104; + globalarray_0[1] = globalint_1105; + globalarray_0[2] = globalint_1106; + globalarray_0[3] = globalint_1107; + globalarray_0[4] = globalint_1108; + ivar1 = 0; + if (globalarray_0[arg0] != 0) { + ivar1 = arg0; + while (ivar1 < subtract(5, 1)) { + globalarray_0[ivar1] = globalarray_0[add(ivar1, 1)]; + } + globalarray_0[subtract(5, 1)] = 0; + } + globalint_1104 = globalarray_0[0]; + globalint_1105 = globalarray_0[1]; + globalint_1106 = globalarray_0[2]; + globalint_1107 = globalarray_0[3]; + globalint_1108 = globalarray_0[4]; + script_261(); + return; +} diff --git a/dumps/scripts/2680.cs2 b/dumps/scripts/2680.cs2 new file mode 100644 index 000000000..d3edf9b1a --- /dev/null +++ b/dumps/scripts/2680.cs2 @@ -0,0 +1,10 @@ +void script_2680() { + if (((boolean)bitconfig_2176)) { + setWidgetSprite(179, new WidgetPointer(398,15)); + setWidgetSprite(170, new WidgetPointer(398,1)); + } else { + setWidgetSprite(170, new WidgetPointer(398,15)); + setWidgetSprite(179, new WidgetPointer(398,1)); + } + return; +} diff --git a/dumps/scripts/2681.cs2 b/dumps/scripts/2681.cs2 new file mode 100644 index 000000000..b04f41d5d --- /dev/null +++ b/dumps/scripts/2681.cs2 @@ -0,0 +1,4 @@ +void script_2681() { + setWidgetText(new WidgetPointer(398,18), "Number of rooms: " + intToStr(globalint_944)); + return; +} diff --git a/dumps/scripts/2682.cs2 b/dumps/scripts/2682.cs2 new file mode 100644 index 000000000..e3f743629 --- /dev/null +++ b/dumps/scripts/2682.cs2 @@ -0,0 +1,4 @@ +void script_2682() { + script_2685(bitconfig_6450); + return; +} diff --git a/dumps/scripts/2683.cs2 b/dumps/scripts/2683.cs2 new file mode 100644 index 000000000..52e68a8e8 --- /dev/null +++ b/dumps/scripts/2683.cs2 @@ -0,0 +1,4 @@ +void script_2683() { + script_2685(1); + return; +} diff --git a/dumps/scripts/2684.cs2 b/dumps/scripts/2684.cs2 new file mode 100644 index 000000000..882056e40 --- /dev/null +++ b/dumps/scripts/2684.cs2 @@ -0,0 +1,4 @@ +void script_2684() { + script_2685(0); + return; +} diff --git a/dumps/scripts/2685.cs2 b/dumps/scripts/2685.cs2 new file mode 100644 index 000000000..2afe3f3d1 --- /dev/null +++ b/dumps/scripts/2685.cs2 @@ -0,0 +1,18 @@ +void script_2685(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(178, new WidgetPointer(398,31)); + setWidgetSprite(177, new WidgetPointer(398,32)); + setWidgetSprite(184, new WidgetPointer(398,33)); + setWidgetSprite(176, new WidgetPointer(398,7)); + setWidgetSprite(174, new WidgetPointer(398,8)); + setWidgetSprite(183, new WidgetPointer(398,23)); + } else { + setWidgetSprite(176, new WidgetPointer(398,31)); + setWidgetSprite(174, new WidgetPointer(398,32)); + setWidgetSprite(183, new WidgetPointer(398,33)); + setWidgetSprite(178, new WidgetPointer(398,7)); + setWidgetSprite(177, new WidgetPointer(398,8)); + setWidgetSprite(184, new WidgetPointer(398,23)); + } + return; +} diff --git a/dumps/scripts/2686.cs2 b/dumps/scripts/2686.cs2 new file mode 100644 index 000000000..541c67ef2 --- /dev/null +++ b/dumps/scripts/2686.cs2 @@ -0,0 +1,5 @@ +void script_2686() { + setWidgetScrollMax(332, 1404, new WidgetPointer(402,12)); + script_31(26345589, 26345484, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/2687.cs2 b/dumps/scripts/2687.cs2 new file mode 100644 index 000000000..6cf4ff4b0 --- /dev/null +++ b/dumps/scripts/2687.cs2 @@ -0,0 +1,15 @@ +int script_2687() { + if (standart_config_1447 < 100) { + return 10000; + } + if (standart_config_1447 < 200) { + return 12500; + } + if (standart_config_1447 < 300) { + return 15000; + } + if (standart_config_1447 < 400) { + return 17500; + } + return 20000; +} diff --git a/dumps/scripts/2688.cs2 b/dumps/scripts/2688.cs2 new file mode 100644 index 000000000..1ef13ff41 --- /dev/null +++ b/dumps/scripts/2688.cs2 @@ -0,0 +1,24 @@ +void script_2688() { + if ((cs2method3612() > 0) && (cs2method3618() >= cs2method3616())) { + if (((boolean)globalint_1413)) { + return; + } + if (((boolean)globalint_11)) { + script_675(); + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter the player to ban from the channel:"); + globalint_5 = 15; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + } + return; +} diff --git a/dumps/scripts/2689.cs2 b/dumps/scripts/2689.cs2 new file mode 100644 index 000000000..1fbe2eb7b --- /dev/null +++ b/dumps/scripts/2689.cs2 @@ -0,0 +1,4 @@ +void script_2689(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(1727, 596)); + return; +} diff --git a/dumps/scripts/269.cs2 b/dumps/scripts/269.cs2 new file mode 100644 index 000000000..7202d642c --- /dev/null +++ b/dumps/scripts/269.cs2 @@ -0,0 +1,20 @@ +int script_269() { + int ivar0; + ivar0 = 0; + if (globalint_1104 != 0) { + ivar0 = add(ivar0, 1); + } + if (globalint_1105 != 0) { + ivar0 = add(ivar0, 1); + } + if (globalint_1106 != 0) { + ivar0 = add(ivar0, 1); + } + if (globalint_1107 != 0) { + ivar0 = add(ivar0, 1); + } + if (globalint_1108 != 0) { + ivar0 = add(ivar0, 1); + } + return ivar0; +} diff --git a/dumps/scripts/2690.cs2 b/dumps/scripts/2690.cs2 new file mode 100644 index 000000000..7351eb6d6 --- /dev/null +++ b/dumps/scripts/2690.cs2 @@ -0,0 +1,25 @@ +void script_2690(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 5; + while (setWidgetRegister(new WidgetPointer(1022,15), ivar1)) { + ivar1 = add(ivar1, 1); + } + if (arg0 > 4) { + ivar3 = add(ivar3, 40); + ivar2 = multiply(subtract(arg0, 5), 40); + } else { + ivar2 = multiply(arg0, 40); + } + ivar2 = add(ivar2, 17); + createExtraChild(new WidgetPointer(1022,15), 5, ivar1); + setWidgetSprite(937); + setWidgetSize(10, 32, 0, 0); + setWidgetPosition(ivar2, ivar3, 0, 0); + setWidgetHidden(0); + setScriptCallOnGameloop(144, new WidgetPointer(1022,15), ivar1, getClientCycle(), add(getClientCycle(), 750), "Iiii"); + return; +} diff --git a/dumps/scripts/2691.cs2 b/dumps/scripts/2691.cs2 new file mode 100644 index 000000000..800d1351f --- /dev/null +++ b/dumps/scripts/2691.cs2 @@ -0,0 +1,23 @@ +void script_2691(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (((boolean)arg5) && setWidgetRegister(new WidgetPointer(arg0), arg3)) { + setWidgetRGB(new Color(arg4)); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (((boolean)arg2)) { + if (getWidgetSpriteId() == 2554) { + setWidgetSprite(2555); + } else { + if (getWidgetSpriteId() == 2556) { + setWidgetSprite(2557); + } + } + } else if (getWidgetSpriteId() == 2555) { + setWidgetSprite(2554); + } else { + if (getWidgetSpriteId() == 2557) { + setWidgetSprite(2556); + } + } + } + return; +} diff --git a/dumps/scripts/2692.cs2 b/dumps/scripts/2692.cs2 new file mode 100644 index 000000000..b32e739d9 --- /dev/null +++ b/dumps/scripts/2692.cs2 @@ -0,0 +1,26 @@ +cs2func_script_2692_struct(2,0,0) script_2692(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar1 = -1; + ivar2 = -1; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = subtract(getCommonDefinitionSize(201), 1); + while (ivar6 >= 0) { + ivar1 = cs2method_3408(105, 74, 201, ivar6); + ivar3 = add(ivar3, 1); + ivar2 = getOtherCommonData(ivar1, 683); + ivar5 = subtract(getCommonDefinitionSize(ivar2), 1); + while (ivar5 >= 0) { + ivar4 = max(getTextWidth(494, cs2method_3408(105, 115, ivar2, ivar5)), ivar4); + ivar5 = subtract(ivar5, 1); + } + ivar6 = subtract(ivar6, 1); + } + return newstruct cs2func_script_2692_struct(ivar3, ivar4); +} diff --git a/dumps/scripts/2693.cs2 b/dumps/scripts/2693.cs2 new file mode 100644 index 000000000..9bd07a301 --- /dev/null +++ b/dumps/scripts/2693.cs2 @@ -0,0 +1,13 @@ +string script_2693(int arg0) { + int ivar1; + int ivar2; + int stack_dump0; + opcStruct5303(2,0,0) structdump_1; + ivar1 = 0; + ivar2 = 0; + stack_dump0 = arg0; + structdump_1 = cs2method5303(stack_dump0); + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + return intToStr(ivar1) + "x" + intToStr(ivar2); +} diff --git a/dumps/scripts/2694.cs2 b/dumps/scripts/2694.cs2 new file mode 100644 index 000000000..5159f1336 --- /dev/null +++ b/dumps/scripts/2694.cs2 @@ -0,0 +1,37 @@ +void script_2694(int arg0,int arg1,string arg2,string arg3,string arg4) { + int ivar2; + ivar2 = 0; + if (((boolean)arg0)) { + if (strLength(arg2) > 0) { + ivar2 = strIndexof(0, arg2, "
"); + if (ivar2 == -1) { + messageType0(arg2); + return; + } + messageType0(substr(0, ivar2, arg2)); + } + return; + } + if (arg0 == 2) { + setWidgetText(new WidgetPointer(978,7), script_400(arg2, "
", " ")); + script_2190(0, -1, 0, "", arg2, "", arg3); + if (strLength(arg3) > 0) { + setScriptCallOnMousePressed(702, arg4, 1, "s1", new WidgetPointer(906,153)); + } else { + setScriptCallOnMousePressed(-1, "", new WidgetPointer(906,153)); + } + return; + } + setWidgetText(new WidgetPointer(978,7), script_400(arg2, "
", " ")); + setWidgetText(new WidgetPointer(744,76), arg2); + setScriptCallOnMousePressed(3452, 6, 0, 1, "i11", new WidgetPointer(744,79)); + if (strLength(arg3) > 0) { + setWidgetText(new WidgetPointer(744,78), arg3); + setScriptCallOnMousePressed(702, arg4, 1, "s1", new WidgetPointer(744,78)); + } else { + setWidgetText(new WidgetPointer(744,78), ""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(744,77)); + } + script_1174(9); + return; +} diff --git a/dumps/scripts/2695.cs2 b/dumps/scripts/2695.cs2 new file mode 100644 index 000000000..82ceb6a21 --- /dev/null +++ b/dumps/scripts/2695.cs2 @@ -0,0 +1,143 @@ +void script_2695(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = -1; + ivar15 = -1; + ivar16 = -1; + ivar17 = -1; + ivar18 = -1; + ivar19 = -1; + if (((boolean)arg10)) { + ivar14 = 48627716; + ivar15 = 48627732; + ivar16 = 48627733; + ivar17 = 48627734; + ivar18 = 48627715; + ivar19 = 48627718; + } else if (arg10 == 2) { + ivar14 = 59703296; + ivar15 = 59703355; + ivar16 = 59703360; + ivar17 = 59703361; + ivar18 = 59703359; + ivar19 = 59703298; + } else { + ivar14 = 57802756; + ivar15 = 57802757; + ivar16 = 57802758; + ivar17 = 57802759; + ivar18 = 57802755; + ivar19 = 57802780; + } + ivar20 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar11 = add(script_1743(), script_3365(ivar19)); + ivar20 = script_1744(); + ivar12 = add(subtract(add(ivar20, getWidgetActualHeight()), 1), script_3366(ivar19)); + ivar13 = getWidgetActualWidth(); + } + if ((isWidgetHidden(new WidgetPointer(ivar15)) && (getWidgetActualX(new WidgetPointer(ivar15)) == ivar11)) && (getWidgetActualY(new WidgetPointer(ivar15)) == ivar12)) { + return; + } + deleteAllExtraChilds(new WidgetPointer(ivar16)); + deleteAllExtraChilds(new WidgetPointer(ivar17)); + cs2method2100(0, 0, new WidgetPointer(ivar16)); + ivar21 = getOtherCommonData(arg5, 683); + ivar22 = script_2581(arg5); + ivar23 = script_829(arg5, ivar21); + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + while (ivar25 <= ivar23) { + if (ivar26 != ivar22) { + createExtraChild(new WidgetPointer(ivar16), 4, getExtraChildGap(new WidgetPointer(ivar16))); + setWidgetSize(2, 15, 1, 0); + setWidgetPosition(0, ivar24, 1, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 2511483, "Iii"); + if (arg5 != 1009) { + if (ivar25 < ivar23) { + setWidgetRGB(new Color(235, 224, 188)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 15458492, "Iii"); + } else { + setWidgetRGB(new Color(0, 177, 225)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 45537, "Iii"); + } + } else if (ivar25 > 0) { + setWidgetRGB(new Color(235, 224, 188)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 15458492, "Iii"); + } else { + setWidgetRGB(new Color(0, 177, 225)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 45537, "Iii"); + } + if (ivar21 != -1) { + setWidgetText(cs2method_3408(105, 115, ivar21, ivar26)); + } else { + setWidgetText(script_2693(ivar25)); + } + setScriptCallOnMousePressed(2699, ivar26, arg5, arg6, arg7, arg8, arg9, arg10, "iJiiiii"); + ivar24 = add(ivar24, getWidgetActualHeight()); + } + ivar25 = add(ivar25, 1); + ivar26 = add(ivar26, 1); + } + ivar24 = add(ivar24, 2); + ivar27 = 0; + if (((boolean)arg10)) { + ivar27 = 334; + } else { + ivar27 = getWidgetActualHeight(new WidgetPointer(ivar14)); + } + ivar28 = 1; + if (ivar27 < add(ivar12, ivar24)) { + ivar12 = add(subtract(add(ivar20, 1), ivar24), script_3366(ivar19)); + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(ivar18)); + ivar28 = 0; + } else { + setWidgetPosition(0, 0, 1, 2, new WidgetPointer(ivar18)); + setWidgetScrollMax(0, 0, new WidgetPointer(ivar16)); + setWidgetIsHidden(true, new WidgetPointer(ivar17)); + } + setWidgetPosition(ivar11, ivar12, 0, 0, new WidgetPointer(ivar15)); + setWidgetSize(ivar13, ivar24, 0, 0, new WidgetPointer(ivar15)); + setWidgetIsHidden(false, new WidgetPointer(ivar15)); + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + setWidgetSprite(2556); + } + if ((arg4 != -1) && setWidgetRegister(new WidgetPointer(arg0), arg4)) { + setWidgetRGB(new Color(178, 170, 159)); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMousePressed(2696, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, "IiiiiJiiiii"); + setScriptCallOnMouseEntered(2691, new WidgetPointer(-32768,3), arg2, 1, arg3, 8419437, 0, "Ii1ii1"); + setScriptCallOnMouseExit(2691, new WidgetPointer(-32768,3), arg2, 0, arg3, 6249298, 0, "Ii1ii1"); + if (setWidgetRegister(new WidgetPointer(arg0), arg3)) { + setWidgetRGB(new Color(178, 170, 159)); + if (((boolean)ivar28)) { + setWidgetSize(getWidgetActualWidth(), add(getWidgetActualHeight(), 5), 0, 0); + } + } + } + setScriptCallOnMousePressed(2696, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, "IiiiiJiiiii", new WidgetPointer(ivar14)); + return; +} diff --git a/dumps/scripts/2696.cs2 b/dumps/scripts/2696.cs2 new file mode 100644 index 000000000..50777d4a3 --- /dev/null +++ b/dumps/scripts/2696.cs2 @@ -0,0 +1,34 @@ +void script_2696(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + if (((boolean)arg10)) { + deleteAllExtraChilds(new WidgetPointer(742,21)); + deleteAllExtraChilds(new WidgetPointer(742,22)); + setWidgetIsHidden(true, new WidgetPointer(742,20)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(742,4)); + } else if (arg10 == 2) { + deleteAllExtraChilds(new WidgetPointer(911,64)); + deleteAllExtraChilds(new WidgetPointer(911,65)); + setWidgetIsHidden(true, new WidgetPointer(911,59)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(911,0)); + } else { + deleteAllExtraChilds(new WidgetPointer(882,6)); + deleteAllExtraChilds(new WidgetPointer(882,7)); + setWidgetIsHidden(true, new WidgetPointer(882,5)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(882,4)); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + setWidgetSprite(2554); + } + if ((arg4 != -1) && setWidgetRegister(new WidgetPointer(arg0), arg4)) { + setWidgetRGB(new Color(235, 224, 188)); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMousePressed(2695, new WidgetPointer(-32768,3), -2147483643, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, "IiiiiJiiiii"); + setScriptCallOnMouseEntered(2691, new WidgetPointer(-32768,3), arg2, 1, arg3, 8419437, 1, "Ii1ii1"); + setScriptCallOnMouseExit(2691, new WidgetPointer(-32768,3), arg2, 0, arg3, 6249298, 1, "Ii1ii1"); + if (setWidgetRegister(new WidgetPointer(arg0), arg3)) { + setWidgetRGB(new Color(95, 91, 82)); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + } + } + return; +} diff --git a/dumps/scripts/2697.cs2 b/dumps/scripts/2697.cs2 new file mode 100644 index 000000000..16cbfc35d --- /dev/null +++ b/dumps/scripts/2697.cs2 @@ -0,0 +1,34 @@ +void script_2697(int arg0,int arg1) { + int ivar2; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_2692_struct(2,0,0) structdump_3; + cs2func_script_2692_struct(2,0,0) structdump_4; + if (arg0 == cs2method6131()) { + return; + } + cs2method6031(arg0); + ivar2 = cs2method6131(); + script_2593(ivar2); + if (arg0 != ivar2) { + cs2method6032(ivar2, 1); + script_2694(arg1, 1, "RuneScape was unable to enter that display mode." + "
" + "
" + "Please visit our Knowledge Base for more information.", "Consult Knowledge Base", "kbase/view.ws?guid=controls_display_options"); + stack_dump0 = ivar2; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar2; + structdump_3 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_3.intpart_0, structdump_3.intpart_1, arg1); + } + stack_dump0 = ivar2; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar2; + structdump_4 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_4.intpart_0, structdump_4.intpart_1, arg1); + if (((boolean)ivar2) || (ivar2 == 3)) { + script_2700(1, arg1, 0, 1); + } else { + cs2method6032(ivar2, 0); + } + return; +} diff --git a/dumps/scripts/2698.cs2 b/dumps/scripts/2698.cs2 new file mode 100644 index 000000000..32594e19e --- /dev/null +++ b/dumps/scripts/2698.cs2 @@ -0,0 +1,44 @@ +void script_2698(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int stack_dump0; + opcStruct5303(2,0,0) structdump_1; + if (arg0 == getDisplayMode()) { + return; + } + ivar5 = -1; + if (arg0 != 3) { + cs2method5307(arg0); + ivar5 = getDisplayMode(); + cs2method5309(ivar5); + if (arg0 != ivar5) { + script_2694(arg4, 0, "RuneScape was unable to enter that display mode." + "
" + "
" + "Please visit our Knowledge Base for more information.", "Consult Knowledge Base", "kbase/view.ws?guid=controls_display_options"); + script_2596(arg3, ivar5, arg1, arg2, arg4); + return; + } + script_2596(arg3, ivar5, arg1, arg2, arg4); + if ((arg0 >= 2) && (ivar5 >= 2)) { + globalint_994 = 2; + } + return; + } + if (isSiteSettingsMembers()) { + script_2694(arg4, 0, "Fullscreen mode is only available to RuneScape members." + "
" + "
" + "Please visit the RuneScape website to learn about other benefits of membership.", "Members' benefits", "members/members.ws"); + return; + } + if (cs2method5302() > globalint_178) { + stack_dump0 = globalint_178; + structdump_1 = cs2method5303(stack_dump0); + if (cs2method5300(structdump_1.intpart_0, structdump_1.intpart_1)) { + script_2596(arg3, arg0, arg1, arg2, arg4); + script_2700(2, arg4, 0, 0); + return; + } + } + arg0 = cs2method5308(); + cs2method5307(arg0); + if (((boolean)arg4)) { + messageType0("Unable to enter fullscreen mode at that resolution."); + } + script_2596(arg3, arg0, arg1, arg2, arg4); + return; +} diff --git a/dumps/scripts/2699.cs2 b/dumps/scripts/2699.cs2 new file mode 100644 index 000000000..4a3ae4d6d --- /dev/null +++ b/dumps/scripts/2699.cs2 @@ -0,0 +1,25 @@ +void script_2699(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + ivar7 = script_2582(arg1, arg0, arg6); + if (((boolean)ivar7)) { + if (arg1 == 845) { + arg5 = cs2method5308(); + cs2method5307(arg5); + script_2694(arg6, 0, "RuneScape was unable to change to that resolution." + "
" + "
" + "Please visit our Knowledge Base for more information.", "Consult Knowledge Base", "kbase/view.ws?guid=controls_display_options"); + } else if (arg1 == 1009) { + script_3413(arg6); + } else { + script_2694(arg6, 1, "RuneScape was unable to implement that setting." + "
" + "
" + "Please visit our Knowledge Base for more information.", "Consult Knowledge Base", "kbase/view.ws?guid=controls_display_options"); + } + } else { + if (cs2method7007() != 0) { + cs2method7005(); + } + } + if (arg1 == 845) { + script_2596(arg4, arg5, arg2, arg3, arg6); + } else { + script_3387(arg4, arg5, arg2, arg3, arg6); + } + return; +} diff --git a/dumps/scripts/27.cs2 b/dumps/scripts/27.cs2 new file mode 100644 index 000000000..2f22b0ebe --- /dev/null +++ b/dumps/scripts/27.cs2 @@ -0,0 +1,7 @@ +void script_27() { + setWidgetText(new WidgetPointer(197,8), intToStr(bitconfig_1485)); + setWidgetText(new WidgetPointer(197,11), intToStr(bitconfig_1489)); + setWidgetText(new WidgetPointer(197,9), intToStr(bitconfig_1488)); + setWidgetText(new WidgetPointer(197,10), intToStr(bitconfig_1486)); + return; +} diff --git a/dumps/scripts/270.cs2 b/dumps/scripts/270.cs2 new file mode 100644 index 000000000..db8138406 --- /dev/null +++ b/dumps/scripts/270.cs2 @@ -0,0 +1,3 @@ +int script_270(int arg0) { + return 0; +} diff --git a/dumps/scripts/2700.cs2 b/dumps/scripts/2700.cs2 new file mode 100644 index 000000000..d7ad1038d --- /dev/null +++ b/dumps/scripts/2700.cs2 @@ -0,0 +1,20 @@ +void script_2700(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = add(getClientCycle(), 750); + if (((boolean)arg1)) { + setScriptCallOnGameloop(2703, ivar4, arg0, arg1, arg2, arg3, "iii11", new WidgetPointer(746,83)); + setScriptCallOnGameloop(2703, ivar4, arg0, arg1, arg2, arg3, "iii11", new WidgetPointer(548,21)); + script_2701(arg0, arg2, arg3); + } else if (arg1 == 2) { + setScriptCallOnGameloop(2703, ivar4, arg0, arg1, arg2, arg3, "iii11", new WidgetPointer(906,23)); + script_3090(); + setScriptCallOnClickContextMenu(2704, 1, arg0, arg1, arg2, arg3, "1ii11", new WidgetPointer(906,127)); + setScriptCallOnClickContextMenu(2704, 0, arg0, arg1, arg2, arg3, "1ii11", new WidgetPointer(906,129)); + } else { + setScriptCallOnGameloop(2703, ivar4, arg0, arg1, arg2, arg3, "iii11", new WidgetPointer(744,17)); + script_1174(10); + setScriptCallOnMousePressed(2704, 1, arg0, arg1, arg2, arg3, "1ii11", new WidgetPointer(744,56)); + setScriptCallOnMousePressed(2704, 0, arg0, arg1, arg2, arg3, "1ii11", new WidgetPointer(744,57)); + } + return; +} diff --git a/dumps/scripts/2701.cs2 b/dumps/scripts/2701.cs2 new file mode 100644 index 000000000..49f2ca8a2 --- /dev/null +++ b/dumps/scripts/2701.cs2 @@ -0,0 +1,24 @@ +void script_2701(int arg0,int arg1,int arg2) { + if (((boolean)getDisplayMode())) { + openInterface(35913749, 883); + } else { + openInterface(48889939, 883); + } + setWidgetIsHidden(false, new WidgetPointer(746,83)); + setWidgetIsHidden(false, new WidgetPointer(548,21)); + script_1151(57868306); + script_1151(57868309); + setScriptCallOnMouseEntered(2702, 1, new WidgetPointer(883,18), new WidgetPointer(883,19), "1II", new WidgetPointer(883,17)); + setScriptCallOnMouseExit(2702, 0, new WidgetPointer(883,18), new WidgetPointer(883,19), "1II", new WidgetPointer(883,17)); + setScriptCallOnMouseEntered(2702, 1, new WidgetPointer(883,21), new WidgetPointer(883,22), "1II", new WidgetPointer(883,20)); + setScriptCallOnMouseExit(2702, 0, new WidgetPointer(883,21), new WidgetPointer(883,22), "1II", new WidgetPointer(883,20)); + setScriptCallOnMousePressed(2704, 1, arg0, 1, arg1, arg2, "1ii11", new WidgetPointer(883,17)); + setScriptCallOnMousePressed(2704, 0, arg0, 1, arg1, arg2, "1ii11", new WidgetPointer(883,20)); + setWidgetIsHidden(false, new WidgetPointer(548,191)); + setWidgetIsHidden(false, new WidgetPointer(548,69)); + setWidgetIsHidden(false, new WidgetPointer(548,194)); + setWidgetIsHidden(false, new WidgetPointer(548,203)); + setWidgetIsHidden(false, new WidgetPointer(548,163)); + setWidgetIsHidden(false, new WidgetPointer(548,115)); + return; +} diff --git a/dumps/scripts/2702.cs2 b/dumps/scripts/2702.cs2 new file mode 100644 index 000000000..74cc54884 --- /dev/null +++ b/dumps/scripts/2702.cs2 @@ -0,0 +1,10 @@ +void script_2702(int arg0,int arg1,int arg2) { + if (((boolean)arg0)) { + script_1166(arg1); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg2)); + } else { + script_1151(arg1); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/2703.cs2 b/dumps/scripts/2703.cs2 new file mode 100644 index 000000000..7d85fdb6f --- /dev/null +++ b/dumps/scripts/2703.cs2 @@ -0,0 +1,30 @@ +void script_2703(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + ivar5 = subtract(arg0, getClientCycle()); + if (ivar5 <= 0) { + script_2705(0, arg1, arg2, 1, arg3, arg4); + return; + } + ivar6 = getDisplayMode(); + if (isBitFlagged(arg1, 1) && (ivar6 != 3)) { + script_2705(0, arg1, arg2, 1, arg3, arg4); + return; + } + ivar7 = 48889939; + if (((boolean)arg2)) { + if (((boolean)ivar6)) { + ivar7 = 35913749; + } + if (isWidgetOpen(new WidgetPointer(ivar7))) { + script_2701(arg1, arg3, arg4); + } + setWidgetText(new WidgetPointer(883,16), "Reverting in: " + intToStr(divide(ivar5, 50))); + } else if (arg2 == 2) { + setWidgetText(new WidgetPointer(906,126), "Reverting in: " + intToStr(divide(ivar5, 50))); + } else { + setWidgetText(new WidgetPointer(744,54), "Reverting in: " + intToStr(divide(ivar5, 50))); + } + return; +} diff --git a/dumps/scripts/2704.cs2 b/dumps/scripts/2704.cs2 new file mode 100644 index 000000000..999962ed6 --- /dev/null +++ b/dumps/scripts/2704.cs2 @@ -0,0 +1,4 @@ +void script_2704(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_2705(arg0, arg1, arg2, 0, arg3, arg4); + return; +} diff --git a/dumps/scripts/2705.cs2 b/dumps/scripts/2705.cs2 new file mode 100644 index 000000000..8b9a8be21 --- /dev/null +++ b/dumps/scripts/2705.cs2 @@ -0,0 +1,177 @@ +void script_2705(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + string svar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_2692_struct(2,0,0) structdump_3; + cs2func_script_2692_struct(2,0,0) structdump_4; + cs2func_script_2692_struct(2,0,0) structdump_5; + cs2func_script_2692_struct(2,0,0) structdump_6; + cs2func_script_2692_struct(2,0,0) structdump_7; + cs2func_script_2692_struct(2,0,0) structdump_8; + cs2func_script_2692_struct(2,0,0) structdump_9; + cs2func_script_2692_struct(2,0,0) structdump_10; + cs2func_script_2692_struct(2,0,0) structdump_11; + if (((boolean)arg2)) { + closeInterface(48889939); + closeInterface(35913749); + setScriptCallOnGameloop(-1, "", new WidgetPointer(746,83)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(548,21)); + setWidgetIsHidden(true, new WidgetPointer(548,191)); + setWidgetIsHidden(true, new WidgetPointer(548,69)); + setWidgetIsHidden(true, new WidgetPointer(548,194)); + setWidgetIsHidden(true, new WidgetPointer(548,203)); + setWidgetIsHidden(true, new WidgetPointer(548,163)); + setWidgetIsHidden(true, new WidgetPointer(548,115)); + } else if (arg2 == 2) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(906,23)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(744,17)); + } + ivar6 = 0; + if (((boolean)arg0)) { + cs2method6032(cs2method6131(), 1); + if (getDisplayMode() != 3) { + cs2method5309(getDisplayMode()); + } + cs2method6024(cs2method6116()); + if (isBitFlagged(arg1, 1)) { + globalint_994 = 2; + } + globalint_1240 = 3; + globalint_1277 = 0; + } else { + if (isBitFlagged(arg1, 0)) { + cs2method7006(); + if (((boolean)arg4)) { + ivar6 = cs2method6132(); + cs2method6031(ivar6); + script_2593(ivar6); + } + } else { + ivar6 = cs2method6131(); + } + if (isBitFlagged(arg1, 1) && (getDisplayMode() != cs2method5308())) { + cs2method5307(cs2method5308()); + } + if (isBitFlagged(arg1, 2)) { + cs2method6016(cs2method6124()); + } + if (isBitFlagged(arg1, 3)) { + cs2method6027(0); + } + if (arg2 == 3) { + script_1174(0); + script_3384(arg2); + return; + } + if (((boolean)arg5)) { + stack_dump0 = ivar6; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar6; + structdump_3 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_3.intpart_0, structdump_3.intpart_1, arg2); + } else if (isBitFlagged(arg1, 1) || ((boolean)arg4)) { + stack_dump0 = ivar6; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar6; + structdump_4 = script_2692(stack_dump2); + script_2596(stack_dump0, stack_dump1, structdump_4.intpart_0, structdump_4.intpart_1, arg2); + } else { + stack_dump0 = ivar6; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar6; + structdump_5 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_5.intpart_0, structdump_5.intpart_1, arg2); + } + if (((boolean)arg2) && ((boolean)arg3)) { + messageType0("The requested change has been cancelled."); + } + } + svar0 = "kbase/view.ws?guid=controls_display_options"; + if (arg2 != 1) { + ivar6 = cs2method6131(); + if (arg2 == 2) { + setWidgetIsHidden(true, new WidgetPointer(906,42)); + if (((boolean)arg5)) { + stack_dump0 = ivar6; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar6; + structdump_6 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_6.intpart_0, structdump_6.intpart_1, arg2); + } else if (isBitFlagged(arg1, 1) || ((boolean)arg4)) { + stack_dump0 = ivar6; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar6; + structdump_7 = script_2692(stack_dump2); + script_2596(stack_dump0, stack_dump1, structdump_7.intpart_0, structdump_7.intpart_1, arg2); + } else { + stack_dump0 = ivar6; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar6; + structdump_8 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_8.intpart_0, structdump_8.intpart_1, arg2); + } + if (((boolean)arg4) && ((boolean)arg3)) { + script_2190(0, -1, 0, "", "The change of detail mode has been cancelled." + "
" + "
" + "Perhaps different graphical settings would work better for you?", "", "Advanced info"); + setScriptCallOnMousePressed(702, svar0, 1, "s1", new WidgetPointer(906,153)); + } + } else if (arg2 == 3) { + if (hasSSKey()) { + script_1174(5); + if (((boolean)globalint_1273)) { + return; + } + setScriptCallOnGameloop(3381, new WidgetPointer(975,44), 0, "Ii", new WidgetPointer(975,44)); + } else if (((boolean)script_3487(3))) { + script_1174(7); + } else { + script_1174(11); + } + } else { + if (((boolean)arg5)) { + stack_dump0 = ivar6; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar6; + structdump_9 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_9.intpart_0, structdump_9.intpart_1, arg2); + } else if (isBitFlagged(arg1, 1) || ((boolean)arg4)) { + stack_dump0 = ivar6; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar6; + structdump_10 = script_2692(stack_dump2); + script_2596(stack_dump0, stack_dump1, structdump_10.intpart_0, structdump_10.intpart_1, arg2); + } else { + stack_dump0 = ivar6; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar6; + structdump_11 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_11.intpart_0, structdump_11.intpart_1, arg2); + } + if (((boolean)arg4) && ((boolean)arg3)) { + setWidgetText(new WidgetPointer(744,76), "The change of detail mode has been cancelled." + "
" + "
" + "Perhaps different graphical settings would work better for you?"); + if (((boolean)arg5)) { + setScriptCallOnMousePressed(3452, 6, 0, 1, "i11", new WidgetPointer(744,79)); + } else if (isBitFlagged(arg1, 1) || ((boolean)arg4)) { + setScriptCallOnMousePressed(1173, 6, "i", new WidgetPointer(744,79)); + } else { + setScriptCallOnMousePressed(3452, 6, 0, 1, "i11", new WidgetPointer(744,79)); + } + setWidgetText(new WidgetPointer(744,78), "Advanced info"); + setScriptCallOnMousePressed(702, svar0, 1, "s1", new WidgetPointer(744,78)); + script_1174(9); + } else if (((boolean)arg5)) { + script_3239(6, 0, 1); + } else if (isBitFlagged(arg1, 1) || ((boolean)arg4)) { + script_1174(6); + } else { + script_3239(6, 0, 1); + } + } + } + if (((boolean)arg0) && ((boolean)arg4)) { + script_3384(arg2); + } + return; +} diff --git a/dumps/scripts/2706.cs2 b/dumps/scripts/2706.cs2 new file mode 100644 index 000000000..dbbbbef4a --- /dev/null +++ b/dumps/scripts/2706.cs2 @@ -0,0 +1,33 @@ +string script_2706(int arg0) { + if (((boolean)script_926(arg0))) { + if (((boolean)script_925(arg0))) { + if (((boolean)stringMethod4107(getItemOption(arg0, 2), "Wield"))) { + return "You do not meet the requirements to use or wield this item." + "
"; + } + return "You do not meet the requirements to use or wear this item." + "
"; + } + if (((boolean)stringMethod4107(getItemOption(arg0, 2), "Wield"))) { + return "You can wield this item but not use it." + "
"; + } + if (((boolean)stringMethod4107(getItemOption(arg0, 2), "Wear"))) { + return "You can wear this item but not use it." + "
"; + } + return "You do not meet the requirements to use this item." + "
"; + } + if (((boolean)script_928(arg0))) { + if (((boolean)script_925(arg0))) { + if (((boolean)stringMethod4107(getItemOption(arg0, 2), "Wield"))) { + return "You can use this item but not wield it." + "
"; + } + return "You can use this item but not wear it." + "
"; + } + } else { + if (((boolean)script_925(arg0))) { + if (((boolean)stringMethod4107(getItemOption(arg0, 2), "Wield"))) { + return "You do not meet the requirements to wield this item." + "
"; + } + return "You do not meet the requirements to wear this item." + "
"; + } + } + return ""; +} diff --git a/dumps/scripts/2707.cs2 b/dumps/scripts/2707.cs2 new file mode 100644 index 000000000..a8ff581c0 --- /dev/null +++ b/dumps/scripts/2707.cs2 @@ -0,0 +1,67 @@ +void script_2707(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,string arg7) { + int ivar7; + int ivar8; + int ivar9; + if (((arg0 == -1) || (arg2 == -1)) || ((boolean)stringMethod4107(arg7, ""))) { + return; + } + if (globalint_1 < add(getClientCycle(), arg3)) { + if (globalint_1 < getClientCycle()) { + globalint_1 = getClientCycle(); + } + globalint_1 = add(globalint_1, 2); + return; + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + arg5 = add(arg5, script_1743()); + arg6 = add(arg6, script_1744()); + } + globalint_1 = add(add(getClientCycle(), arg3), 10); + ivar7 = 0; + ivar8 = 0; + ivar9 = -1; + if (globalint_2 != 1) { + ivar9 = getWidgetParentId(new WidgetPointer(arg2)); + if ((ivar9 != -1) && (arg4 >= getWidgetActualWidth(new WidgetPointer(ivar9)))) { + arg4 = getWidgetActualWidth(new WidgetPointer(ivar9)); + } + ivar7 = add(6, getMaxLineWidth(subtract(arg4, 6), 495, arg7)); + ivar8 = add(6, multiply(16, getLineCount(subtract(arg4, 6), 495, arg7))); + setWidgetSize(ivar7, ivar8, 0, 0, new WidgetPointer(arg2)); + arg5 = subtract(subtract(arg5, 5), ivar7); + arg6 = subtract(subtract(arg6, 3), ivar8); + if (ivar9 != -1) { + if (add(arg5, ivar7) > getWidgetActualWidth(new WidgetPointer(ivar9))) { + arg5 = subtract(getWidgetActualWidth(new WidgetPointer(ivar9)), ivar7); + } + if (add(arg6, ivar8) > getWidgetActualHeight(new WidgetPointer(ivar9))) { + arg6 = subtract(getWidgetActualHeight(new WidgetPointer(ivar9)), ivar8); + } + } + if (arg5 < 0) { + arg5 = 0; + } + if (arg6 < 0) { + arg6 = 0; + } + setWidgetPosition(arg5, arg6, 0, 0, new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 3, 0); + setWidgetSize(ivar7, ivar8, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 160)); + createExtraChild(new WidgetPointer(arg2), 3, 1); + setWidgetSize(ivar7, ivar8, 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg2), 4, 2); + setWidgetSize(subtract(arg4, 6), ivar8, 0, 0); + setWidgetPosition(0, 0, 1, 1); + setWidgetText(arg7); + setWidgetTextAlignment(1, 1, 16); + setWidgetFont(495); + setWidgetRGB(new Color(0, 0, 0)); + globalint_2 = 1; + } + return; +} diff --git a/dumps/scripts/2708.cs2 b/dumps/scripts/2708.cs2 new file mode 100644 index 000000000..a006eb586 --- /dev/null +++ b/dumps/scripts/2708.cs2 @@ -0,0 +1,79 @@ +void script_2708(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + cs2method3115(0, 0, 4, 3, 135, 30, 3791, 3792, 297, 16777215, 3793); + setWidgetSize(278, 90, 0, 0, new WidgetPointer(744,23)); + setWidgetSprite(2498, new WidgetPointer(744,23)); + setWidgetSprite(4140, new WidgetPointer(744,8)); + setWidgetSprite(4139, new WidgetPointer(744,9)); + setWidgetSprite(4141, new WidgetPointer(744,10)); + setWidgetSprite(4142, new WidgetPointer(744,11)); + setWidgetSprite(4144, new WidgetPointer(744,12)); + setWidgetSprite(4143, new WidgetPointer(744,13)); + setWidgetSprite(4145, new WidgetPointer(744,14)); + setWidgetSprite(4146, new WidgetPointer(744,15)); + setWidgetSprite(4129, new WidgetPointer(744,22)); + setWidgetSprite(4129, new WidgetPointer(744,97)); + setWidgetSprite(4129, new WidgetPointer(744,100)); + setWidgetSprite(4067, new WidgetPointer(744,70)); + setWidgetHFlip(1, new WidgetPointer(744,70)); + setWidgetVFlip(1, new WidgetPointer(744,70)); + setWidgetSprite(4067, new WidgetPointer(744,74)); + setWidgetHFlip(0, new WidgetPointer(744,74)); + setWidgetVFlip(1, new WidgetPointer(744,74)); + setWidgetSprite(4067, new WidgetPointer(744,4)); + setWidgetSprite(4067, new WidgetPointer(744,6)); + cs2method6039(rndExcl(18)); + if (globalint_176 <= 0) { + globalint_176 = multiply(add(rndExcl(5), 1), 10); + } + setScriptCallOnWidgetResize(3229, "", new WidgetPointer(744,17)); + script_3964(); + globalstring_32 = ""; + globalstring_33 = ""; + globalint_547 = 0; + globalint_1093 = 0; + openInterface(48758834, 882); + script_2595(0); + setScriptCallOnMousePressed(1173, 11, "i", new WidgetPointer(882,20)); + setScriptCallOnKeyPress(1221, -2147483640, false, "iz", new WidgetPointer(744,17)); + script_2710(arg0, arg1, arg2, arg3, arg4, arg5); + script_1129(); + if (isFromBilling()) { + globalint_1090 = 11; + globalint_1091 = 11; + script_3239(11, 1, 0); + } else { + if ((globalint_1240 == 2) && (cs2method6131() != 0)) { + globalint_1240 = 3; + } + if (((boolean)cs2method5420())) { + globalint_1240 = 3; + } + if ((cs2method6148() && ((boolean)cs2method5420())) && (((globalint_1240 < 3) || cs2method6144()) || ((boolean)cs2method6132()))) { + globalint_1090 = 0; + globalint_1091 = 0; + script_3239(0, 1, 0); + } else if (hasSSKey()) { + globalint_1090 = 5; + globalint_1091 = 5; + script_3239(5, 1, 0); + if (((boolean)globalint_1273)) { + return; + } + setScriptCallOnGameloop(3381, new WidgetPointer(975,44), 0, "Ii", new WidgetPointer(975,44)); + } else if (((boolean)script_3487(3))) { + globalint_1090 = 7; + globalint_1091 = 7; + script_3239(7, 1, 0); + } else { + globalint_1090 = 11; + globalint_1091 = 11; + script_3239(11, 1, 0); + } + } + script_3230(); + if (cs2method5436()) { + openInterface(48758900, 405); + cs2method2005(1, new WidgetPointer(744,116)); + } + return; +} diff --git a/dumps/scripts/2709.cs2 b/dumps/scripts/2709.cs2 new file mode 100644 index 000000000..ba3588dc3 --- /dev/null +++ b/dumps/scripts/2709.cs2 @@ -0,0 +1,6 @@ +int script_2709() { + if (cs2method6910() == 8388605) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/271.cs2 b/dumps/scripts/271.cs2 new file mode 100644 index 000000000..8b9b5b19b --- /dev/null +++ b/dumps/scripts/271.cs2 @@ -0,0 +1,10 @@ +void script_271() { + globalint_1109 = 0; + globalint_1110 = 0; + globalint_1104 = 0; + globalint_1105 = 0; + globalint_1106 = 0; + globalint_1107 = 0; + globalint_1108 = 0; + return; +} diff --git a/dumps/scripts/2710.cs2 b/dumps/scripts/2710.cs2 new file mode 100644 index 000000000..bd677f15c --- /dev/null +++ b/dumps/scripts/2710.cs2 @@ -0,0 +1,56 @@ +void script_2710(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int stack_dump0; + cs2func_script_1239_struct(2,0,0) structdump_1; + cs2method2103(0, new WidgetPointer(arg2)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + cs2method6021(true); + cs2method6035(true); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(arg1)); + cs2method2103(0, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + if (((boolean)globalint_994)) { + globalint_986 = 1; + } else { + if (globalint_994 != 2) { + if (getBenchmarkToolkit() > 400) { + globalint_994 = 1; + globalint_986 = 1; + if (getDisplayMode() > 1) { + cs2method5307(1); + } + if (cs2method5308() > 1) { + cs2method5309(1); + } + } else { + globalint_994 = 2; + } + } + } + setScriptCallOnMousePressed(2713, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "IIIIII", new WidgetPointer(arg3)); + setScriptCallOnMouseOver(2961, new WidgetPointer(arg4), new WidgetPointer(arg5), 1, "II1", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(2961, new WidgetPointer(arg4), new WidgetPointer(arg5), 0, "II1", new WidgetPointer(arg3)); + globalint_986 = 1; + if (((boolean)globalint_986)) { + setWidgetSprite(2700, new WidgetPointer(arg4)); + return; + } + ivar6 = -1; + ivar7 = 0; + stack_dump0 = 0; + structdump_1 = script_1239(stack_dump0); + ivar7 = structdump_1.intpart_1; + ivar6 = structdump_1.intpart_0; + cameraMoveTo(ivar6, 1000, 100, 100); + cameraPointAt(ivar6, 0, 100, 100); + setWidgetSprite(2703, new WidgetPointer(arg4)); + globalint_177 = add(add(getClientCycle(), 30), 30); + setScriptCallOnGameloop(2712, new WidgetPointer(arg0), new WidgetPointer(arg2), new WidgetPointer(arg1), "III", new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/2711.cs2 b/dumps/scripts/2711.cs2 new file mode 100644 index 000000000..18848a0e9 --- /dev/null +++ b/dumps/scripts/2711.cs2 @@ -0,0 +1,4 @@ +void script_2711(int arg0,int arg1) { + script_2714(arg0, arg1); + return; +} diff --git a/dumps/scripts/2712.cs2 b/dumps/scripts/2712.cs2 new file mode 100644 index 000000000..2b5223666 --- /dev/null +++ b/dumps/scripts/2712.cs2 @@ -0,0 +1,15 @@ +void script_2712(int arg0,int arg1,int arg2) { + int ivar3; + if (getClientCycle() < globalint_177) { + return; + } + globalint_176 = add(globalint_176, 2); + ivar3 = mod(globalint_176, 10); + if (ivar3 != 2) { + globalint_176 = add(subtract(globalint_176, ivar3), 2); + } + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setScriptCallOnGameloop(1249, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), "III", new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/2713.cs2 b/dumps/scripts/2713.cs2 new file mode 100644 index 000000000..4dc7133d5 --- /dev/null +++ b/dumps/scripts/2713.cs2 @@ -0,0 +1,46 @@ +void script_2713(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int stack_dump0; + cs2func_script_1239_struct(2,0,0) structdump_1; + setScriptCallOnMousePressed(-1, "", new WidgetPointer(arg3)); + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg3)); + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg3)); + ivar6 = -1; + ivar7 = 0; + if (((boolean)globalint_986)) { + cs2method2103(0, new WidgetPointer(arg1)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg2)); + globalint_176 = subtract(globalint_176, mod(globalint_176, 10)); + stack_dump0 = 0; + structdump_1 = script_1239(stack_dump0); + ivar7 = structdump_1.intpart_1; + ivar6 = structdump_1.intpart_0; + cameraMoveTo(ivar6, 1000, 100, 100); + cameraPointAt(ivar6, 0, 100, 100); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setScriptCallOnGameloop(2962, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), add(getClientCycle(), 30), "IIIIIIi", new WidgetPointer(arg0)); + globalint_986 = 0; + globalint_994 = 2; + } else { + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + if (isWidgetHidden(new WidgetPointer(arg1))) { + cs2method2103(255, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(arg1)); + setScriptCallOnGameloop(1253, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg1)); + if (isWidgetHidden(new WidgetPointer(arg2))) { + cs2method2103(255, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + } + setScriptCallOnGameloop(1253, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg2)); + setScriptCallOnGameloop(2963, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), add(getClientCycle(), 30), "IIIIIIi", new WidgetPointer(arg0)); + globalint_986 = 1; + } + script_3230(); + return; +} diff --git a/dumps/scripts/2714.cs2 b/dumps/scripts/2714.cs2 new file mode 100644 index 000000000..01efea1a0 --- /dev/null +++ b/dumps/scripts/2714.cs2 @@ -0,0 +1,70 @@ +void script_2714(int arg0,int arg1) { + int ivar2; + if (getAccountCreateRC() == -3) { + return; + } + ivar2 = globalint_174; + globalint_174 = arg0; + globalint_175 = getClientCycle(); + switch (arg0) { + case 6: + if (((boolean)arg1)) { + globalint_1099 = strLength(globalstring_122); + script_3218(44105828, 44105772, 44105829, 6, globalstring_122); + } + break; + case 14: + if (((boolean)arg1)) { + globalint_1099 = strLength(globalstring_326); + script_3218(44105847, 44105848, 44105849, 14, globalstring_326); + } + break; + case 7: + if (((boolean)arg1)) { + globalint_1099 = strLength(globalstring_124); + script_3218(44105818, 44105819, 44105820, 7, script_2949(globalstring_124)); + } + break; + case 8: + if (((boolean)arg1)) { + globalint_1099 = strLength(globalstring_125); + script_3218(44105808, 44105809, 44105810, 8, script_2949(globalstring_125)); + } + break; + case 15: + if (((boolean)arg1)) { + if (globalint_1407 < 1) { + globalint_1099 = 0; + script_3218(44105854, 44105771, 44105855, 15, ""); + } else { + globalint_1099 = strLength(intToStr(globalint_1407)); + script_3218(44105854, 44105771, 44105855, 15, intToStr(globalint_1407)); + } + } + } + if ((ivar2 == 6) && (arg0 != 6)) { + if (stringMethod4107(globalstring_123, globalstring_122) != 0) { + script_2283(0, 1); + } + } else if ((ivar2 == 14) && (arg0 != 14)) { + if (stringMethod4107(globalstring_327, globalstring_326) != 0) { + script_3953(0); + } + } else if ((ivar2 == 7) && (arg0 != 7)) { + if (stringMethod4107(globalstring_328, globalstring_124) != 0) { + script_3228(7, 0, 0); + if (strLength(globalstring_125) > 0) { + script_3228(8, 1, 0); + } + } + } else if ((ivar2 == 8) && (arg0 != 8)) { + if (stringMethod4107(globalstring_329, globalstring_125) != 0) { + script_3228(8, 1, 0); + } + } else { + if (((ivar2 == 15) && (arg0 != 15)) && (globalint_1408 != globalint_1407)) { + script_3954(0); + } + } + return; +} diff --git a/dumps/scripts/2715.cs2 b/dumps/scripts/2715.cs2 new file mode 100644 index 000000000..c12c64aab --- /dev/null +++ b/dumps/scripts/2715.cs2 @@ -0,0 +1,6 @@ +void script_2715() { + setWidgetIsHidden(false, new WidgetPointer(669,14)); + setWidgetIsHidden(false, new WidgetPointer(669,27)); + setWidgetIsHidden(true, new WidgetPointer(669,13)); + return; +} diff --git a/dumps/scripts/2716.cs2 b/dumps/scripts/2716.cs2 new file mode 100644 index 000000000..15b3e6cf3 --- /dev/null +++ b/dumps/scripts/2716.cs2 @@ -0,0 +1,6 @@ +void script_2716(int arg0,int arg1) { + script_2723(arg0, arg1, standart_config_118, standart_config_1496); + setScriptCallOnItemContainerUpdate(2722, new WidgetPointer(arg0), new WidgetPointer(arg1), standart_config_118, standart_config_1496, standart_config_118, 1, "IIvvY", new WidgetPointer(arg0)); + setScriptCallOnGlobalConfigChange(2722, new WidgetPointer(arg0), new WidgetPointer(arg1), standart_config_118, standart_config_1496, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 40, "IIvvY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2717.cs2 b/dumps/scripts/2717.cs2 new file mode 100644 index 000000000..7756c367c --- /dev/null +++ b/dumps/scripts/2717.cs2 @@ -0,0 +1,9 @@ +void script_2717(int arg0) { + if (standart_config_1496 != -1) { + script_2726(arg0, standart_config_1496); + setScriptCallOnItemContainerUpdate(2725, new WidgetPointer(arg0), standart_config_1496, standart_config_1496, 1, "IvY", new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(620,22)); + setWidgetIsHidden(false, new WidgetPointer(620,21)); + } + return; +} diff --git a/dumps/scripts/2718.cs2 b/dumps/scripts/2718.cs2 new file mode 100644 index 000000000..2751e0ab0 --- /dev/null +++ b/dumps/scripts/2718.cs2 @@ -0,0 +1,12 @@ +void script_2718(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 464; + if (((boolean)arg1)) { + ivar3 = 448; + } + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), 118, 0, 0, new WidgetPointer(arg0)); + setWidgetSize(ivar3, 181, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(474, 120, 0, 0, new WidgetPointer(arg2)); + setWidgetSize(16, 181, 0, 0, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/2719.cs2 b/dumps/scripts/2719.cs2 new file mode 100644 index 000000000..d94e8c9bd --- /dev/null +++ b/dumps/scripts/2719.cs2 @@ -0,0 +1,7 @@ +void script_2719(int arg0,int arg1) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), 46, 0, 0, new WidgetPointer(arg0)); + setWidgetSize(464, 255, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(474, 46, 0, 0, new WidgetPointer(arg1)); + setWidgetSize(16, 255, 0, 0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/272.cs2 b/dumps/scripts/272.cs2 new file mode 100644 index 000000000..31c5584c8 --- /dev/null +++ b/dumps/scripts/272.cs2 @@ -0,0 +1,4 @@ +void script_272() { + script_273(); + return; +} diff --git a/dumps/scripts/2720.cs2 b/dumps/scripts/2720.cs2 new file mode 100644 index 000000000..898c7c857 --- /dev/null +++ b/dumps/scripts/2720.cs2 @@ -0,0 +1,48 @@ +int script_2720(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + arg0 = getRealItem(arg0); + ivar2 = cs2method_3408(111, 105, 731, arg0); + if (((standart_config_532 == 6529) && (ivar2 != -1)) && (ivar2 > 0)) { + return ivar2; + } + ivar2 = cs2method_3408(111, 105, 733, arg0); + if ((ivar2 != -1) && (ivar2 > 0)) { + return ivar2; + } + if (((boolean)getItemHashmapData(arg0, 258)) || ((boolean)getItemHashmapData(arg0, 259))) { + return 99000; + } + ivar3 = 130; + ivar4 = 100; + ivar5 = 0; + ivar6 = script_2721(arg1); + if (ivar6 == -1) { + return -1; + } + ivar7 = getItemAmtInContainer(standart_config_118, arg0); + ivar8 = subtract(ivar7, ivar6); + if (((boolean)ivar6)) { + ivar5 = ivar4; + } else if (((boolean)ivar7)) { + ivar5 = ivar3; + } else if (ivar7 >= ivar6) { + ivar5 = ivar4; + } else { + ivar5 = subtract(ivar3, multiplyDivide(subtract(ivar3, ivar4), ivar6, ivar7)); + } + if (ivar5 < 0) { + ivar5 = 0; + } + ivar5 = max(ivar4, min(ivar3, ivar5)); + ivar2 = multiplyDivide(getItemValue(arg0), 100, ivar5); + if (standart_config_532 == 6529) { + ivar2 = multiplyDivide(3, 2, ivar2); + } + return max(ivar2, 1); +} diff --git a/dumps/scripts/2721.cs2 b/dumps/scripts/2721.cs2 new file mode 100644 index 000000000..87ba161b3 --- /dev/null +++ b/dumps/scripts/2721.cs2 @@ -0,0 +1,126 @@ +int script_2721(int arg0) { + int ivar1; + ivar1 = -1; + switch (arg0) { + case 0: + ivar1 = globalint_946; + break; + case 1: + ivar1 = globalint_947; + break; + case 2: + ivar1 = globalint_948; + break; + case 3: + ivar1 = globalint_949; + break; + case 4: + ivar1 = globalint_950; + break; + case 5: + ivar1 = globalint_951; + break; + case 6: + ivar1 = globalint_952; + break; + case 7: + ivar1 = globalint_953; + break; + case 8: + ivar1 = globalint_954; + break; + case 9: + ivar1 = globalint_955; + break; + case 10: + ivar1 = globalint_956; + break; + case 11: + ivar1 = globalint_957; + break; + case 12: + ivar1 = globalint_958; + break; + case 13: + ivar1 = globalint_959; + break; + case 14: + ivar1 = globalint_960; + break; + case 15: + ivar1 = globalint_961; + break; + case 16: + ivar1 = globalint_962; + break; + case 17: + ivar1 = globalint_963; + break; + case 18: + ivar1 = globalint_964; + break; + case 19: + ivar1 = globalint_965; + break; + case 20: + ivar1 = globalint_966; + break; + case 21: + ivar1 = globalint_967; + break; + case 22: + ivar1 = globalint_968; + break; + case 23: + ivar1 = globalint_969; + break; + case 24: + ivar1 = globalint_970; + break; + case 25: + ivar1 = globalint_971; + break; + case 26: + ivar1 = globalint_972; + break; + case 27: + ivar1 = globalint_973; + break; + case 28: + ivar1 = globalint_974; + break; + case 29: + ivar1 = globalint_975; + break; + case 30: + ivar1 = globalint_976; + break; + case 31: + ivar1 = globalint_977; + break; + case 32: + ivar1 = globalint_978; + break; + case 33: + ivar1 = globalint_979; + break; + case 34: + ivar1 = globalint_980; + break; + case 35: + ivar1 = globalint_981; + break; + case 36: + ivar1 = globalint_982; + break; + case 37: + ivar1 = globalint_983; + break; + case 38: + ivar1 = globalint_984; + break; + case 39: + ivar1 = globalint_985; + } + return ivar1; +} diff --git a/dumps/scripts/2722.cs2 b/dumps/scripts/2722.cs2 new file mode 100644 index 000000000..2db349c63 --- /dev/null +++ b/dumps/scripts/2722.cs2 @@ -0,0 +1,4 @@ +void script_2722(int arg0,int arg1,int arg2,int arg3) { + script_2723(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/2723.cs2 b/dumps/scripts/2723.cs2 new file mode 100644 index 000000000..cb555527b --- /dev/null +++ b/dumps/scripts/2723.cs2 @@ -0,0 +1,163 @@ +void script_2723(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + string svar0; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar4 = 1; + if (getWidgetScrollMaxV(new WidgetPointer(arg0)) > 0) { + ivar4 = 0; + } + ivar5 = -1; + ivar6 = 0; + ivar7 = getItemContainerLength(arg2); + ivar8 = 4; + if (arg3 != -1) { + while (ivar6 < ivar7) { + if (getItemIdInSlot(arg2, ivar6) != -1) { + ivar5 = ivar6; + } + ivar6 = add(ivar6, 1); + } + if (ivar5 > 26) { + setWidgetScrollMax(0, multiply(63, add(divide(ivar5, 9), 1)), new WidgetPointer(arg0)); + if (((boolean)ivar4)) { + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + } else { + script_72(arg1, arg0, cs2method2601(new WidgetPointer(arg0))); + } + script_2718(arg0, 1, arg1); + ivar8 = 2; + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + script_2718(arg0, 0, arg1); + ivar8 = 4; + } + } else { + script_2719(arg0, arg1); + while (ivar6 < ivar7) { + if (getItemIdInSlot(arg2, ivar6) != -1) { + ivar5 = ivar6; + } + ivar6 = add(ivar6, 1); + } + if (ivar5 > 35) { + setWidgetScrollMax(0, multiply(63, add(divide(ivar5, 9), 1)), new WidgetPointer(arg0)); + if (((boolean)ivar4)) { + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + } else { + script_72(arg1, arg0, cs2method2601(new WidgetPointer(arg0))); + } + ivar8 = 2; + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar8 = 4; + } + } + ivar6 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = -1; + ivar13 = 0; + svar0 = ""; + ivar14 = 0; + ivar15 = 0; + while (ivar6 < ivar7) { + ivar12 = getItemIdInSlot(arg2, ivar6); + if (ivar12 != -1) { + if (((boolean)getItemHashmapData(ivar12, 258)) || ((boolean)getItemHashmapData(ivar12, 259))) { + ivar15 = 1; + } else { + ivar15 = 0; + } + ivar10 = add(multiply(mod(ivar6, 9), 48), multiply(mod(ivar6, 9), ivar8)); + ivar11 = add(multiply(divide(ivar6, 9), 52), multiply(divide(ivar6, 9), 13)); + createExtraChild(new WidgetPointer(arg0), 5, ivar9); + ivar9 = add(ivar9, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar10, ivar11, 0, 0); + setWidgetSprite(2205); + cs2method1305("" + getItemName(ivar12) + ""); + setWidgetContextMenuOption(1, "Info"); + setWidgetContextMenuOption(2, "Buy 1"); + setWidgetContextMenuOption(10, "Examine"); + if (((boolean)ivar15)) { + setWidgetContextMenuOption(3, "Buy 5"); + setWidgetContextMenuOption(4, "Buy 10"); + setWidgetContextMenuOption(5, "Buy 50"); + setWidgetContextMenuOption(6, "Buy 500"); + } + setScriptCallOnMouseEntered(2724, new WidgetPointer(-32768,3), ivar9, 0, "Ii1"); + setScriptCallOnMouseExit(2724, new WidgetPointer(-32768,3), ivar9, 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, ivar9); + ivar9 = add(ivar9, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar10, ivar11, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar9); + ivar9 = add(ivar9, 1); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar10, 6), add(ivar11, 4), 0, 0); + if (((boolean)ivar15)) { + setItemOnWidgetMethod1205(ivar12, getItemAmtInSlot(arg2, ivar6)); + } else { + setItemOnWidgetMethod1212(ivar12, getItemAmtInSlot(arg2, ivar6)); + } + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar9); + ivar9 = add(ivar9, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar10, 2), add(ivar11, 38), 0, 0); + setWidgetSprite(cs2method_3408(111, 100, 200, standart_config_532)); + createExtraChild(new WidgetPointer(arg0), 4, ivar9); + ivar9 = add(ivar9, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar10, 13), add(ivar11, 39), 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(2, 1, 0); + ivar14 = script_2720(ivar12, ivar6); + if (ivar14 == -1) { + setWidgetText("N/A"); + } else { + setWidgetText(script_940(ivar14)); + } + setWidgetRGB(new Color(script_1146(ivar14))); + setWidgetUnknownBoolean(true); + createExtraChild(new WidgetPointer(arg0), 5, ivar9); + ivar9 = add(ivar9, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar10, 33), add(ivar11, 4), 0, 0); + setWidgetSprite(2180); + script_812(ivar12); + svar0 = script_2706(ivar12); + setScriptCallOnMouseOver(2707, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(620,34), svar0, 25, 200, -2147483647, -2147483646, "IiIsiiii"); + setScriptCallOnMouseExit(40, new WidgetPointer(620,34), "I"); + } else { + ivar13 = 0; + while (ivar13 < 6) { + createExtraChild(new WidgetPointer(arg0), 3, ivar9); + setWidgetHidden(1); + ivar9 = add(ivar9, 1); + ivar13 = add(ivar13, 1); + } + } + ivar6 = add(ivar6, 1); + } + return; +} diff --git a/dumps/scripts/2724.cs2 b/dumps/scripts/2724.cs2 new file mode 100644 index 000000000..2a460758e --- /dev/null +++ b/dumps/scripts/2724.cs2 @@ -0,0 +1,6 @@ +void script_2724(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetHidden(arg2); + } + return; +} diff --git a/dumps/scripts/2725.cs2 b/dumps/scripts/2725.cs2 new file mode 100644 index 000000000..be7ad0036 --- /dev/null +++ b/dumps/scripts/2725.cs2 @@ -0,0 +1,4 @@ +void script_2725(int arg0,int arg1) { + script_2726(arg0, arg1); + return; +} diff --git a/dumps/scripts/2726.cs2 b/dumps/scripts/2726.cs2 new file mode 100644 index 000000000..de27af8f4 --- /dev/null +++ b/dumps/scripts/2726.cs2 @@ -0,0 +1,76 @@ +void script_2726(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + setWidgetIsHidden(false, new WidgetPointer(620,26)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar2 = 0; + ivar3 = getItemContainerLength(arg1); + ivar4 = 0; + ivar5 = 0; + ivar6 = -1; + ivar7 = 0; + while (ivar2 < ivar3) { + ivar6 = getItemIdInSlot(arg1, ivar2); + if (ivar6 != -1) { + ivar5 = add(multiply(mod(ivar2, 9), 48), multiply(mod(ivar2, 9), 4)); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + ivar4 = add(ivar4, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, 0, 0, 0); + setWidgetSprite(2205); + cs2method1305("" + getItemName(ivar6) + ""); + setWidgetContextMenuOption(1, "Info"); + setWidgetContextMenuOption(2, "Take 1"); + setWidgetContextMenuOption(3, "Take 5"); + setWidgetContextMenuOption(4, "Take 10"); + setWidgetContextMenuOption(5, "Take 50"); + setWidgetContextMenuOption(10, "Examine"); + setScriptCallOnMouseEntered(2724, new WidgetPointer(-32768,3), ivar4, 0, "Ii1"); + setScriptCallOnMouseExit(2724, new WidgetPointer(-32768,3), ivar4, 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + ivar4 = add(ivar4, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, 0, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + ivar4 = add(ivar4, 1); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar5, 6), 4, 0, 0); + setItemOnWidgetMethod1212(ivar6, getItemAmtInSlot(arg1, ivar2)); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + createExtraChild(new WidgetPointer(arg0), 4, ivar4); + ivar4 = add(ivar4, 1); + setWidgetSize(32, 12, 0, 0); + setWidgetPosition(add(ivar5, 13), 39, 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 255, 0)); + setWidgetText("Free"); + setWidgetTextAlignment(2, 1, 0); + setWidgetUnknownBoolean(true); + } else { + ivar7 = 0; + while (ivar7 < 4) { + createExtraChild(new WidgetPointer(arg0), 3, ivar4); + setWidgetHidden(1); + ivar4 = add(ivar4, 1); + ivar7 = add(ivar7, 1); + } + } + ivar2 = add(ivar2, 1); + } + setWidgetIsHidden(false, new WidgetPointer(620,27)); + setWidgetIsHidden(false, new WidgetPointer(620,28)); + setWidgetIsHidden(false, new WidgetPointer(620,29)); + setWidgetIsHidden(false, new WidgetPointer(620,30)); + setWidgetIsHidden(false, new WidgetPointer(620,31)); + setWidgetIsHidden(false, new WidgetPointer(620,23)); + setItemOnWidgetMethod2205(1931, 1, new WidgetPointer(620,28)); + setWidgetSprite(cs2method_3408(111, 100, 200, standart_config_532), new WidgetPointer(620,29)); + return; +} diff --git a/dumps/scripts/2727.cs2 b/dumps/scripts/2727.cs2 new file mode 100644 index 000000000..ea028215e --- /dev/null +++ b/dumps/scripts/2727.cs2 @@ -0,0 +1,6 @@ +int script_2727() { + if (isBitFlagged(cs2method6510(), 10)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/2728.cs2 b/dumps/scripts/2728.cs2 new file mode 100644 index 000000000..2ca5090ba --- /dev/null +++ b/dumps/scripts/2728.cs2 @@ -0,0 +1,14 @@ +int script_2728() { + int ivar0; + if (script_2761() > 100) { + return 0; + } + ivar0 = getCommonDefinitionSize(681); + while (ivar0 > 0) { + if (getSkillActualLvl(cs2method_3408(105, 83, 681, ivar0)) > 20) { + return 0; + } + ivar0 = subtract(ivar0, 1); + } + return 1; +} diff --git a/dumps/scripts/2729.cs2 b/dumps/scripts/2729.cs2 new file mode 100644 index 000000000..2c7aa394f --- /dev/null +++ b/dumps/scripts/2729.cs2 @@ -0,0 +1,16 @@ +void script_2729(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = getDisplayMode(); + if (ivar4 != 1) { + if (arg3 != 1) { + return; + } + } else { + if (((boolean)arg3)) { + return; + } + } + script_2730(arg1, arg2, ivar4); + setScriptCallOnGameloop(2729, new WidgetPointer(-32768,3), new WidgetPointer(arg1), new WidgetPointer(arg2), ivar4, "IIIi", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/273.cs2 b/dumps/scripts/273.cs2 new file mode 100644 index 000000000..7f0f5ede5 --- /dev/null +++ b/dumps/scripts/273.cs2 @@ -0,0 +1,9 @@ +void script_273() { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(919,1)), 185, 0, 0, new WidgetPointer(919,1)); + setScriptCallOnClickContextMenu(274, "", new WidgetPointer(919,23)); + setWidgetText(new WidgetPointer(919,31), "Hide"); + script_31(60227589, 60227590, 792, 789, 790, 791, 773, 788); + setWidgetVFlip(1, new WidgetPointer(919,29)); + setWidgetVFlip(1, new WidgetPointer(919,30)); + return; +} diff --git a/dumps/scripts/2730.cs2 b/dumps/scripts/2730.cs2 new file mode 100644 index 000000000..1adcbc4c9 --- /dev/null +++ b/dumps/scripts/2730.cs2 @@ -0,0 +1,14 @@ +void script_2730(int arg0,int arg1,int arg2) { + if (arg2 != 1) { + setWidgetSprite(297, new WidgetPointer(arg0)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(arg0)); + cs2method2107(1, new WidgetPointer(arg0)); + setWidgetUnknownBoolean(true, new WidgetPointer(arg1)); + } else { + setWidgetSprite(1017, new WidgetPointer(arg0)); + setWidgetSize(519, 142, 0, 0, new WidgetPointer(arg0)); + cs2method2107(0, new WidgetPointer(arg0)); + setWidgetUnknownBoolean(false, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2731.cs2 b/dumps/scripts/2731.cs2 new file mode 100644 index 000000000..516bc1474 --- /dev/null +++ b/dumps/scripts/2731.cs2 @@ -0,0 +1,5 @@ +void script_2731(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_2732(arg0, arg1, bitconfig_3612, 1); + setScriptCallOnClickContextMenu(2733, -2147483644, arg1, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), "iiIIIIII", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2732.cs2 b/dumps/scripts/2732.cs2 new file mode 100644 index 000000000..a6c800a35 --- /dev/null +++ b/dumps/scripts/2732.cs2 @@ -0,0 +1,31 @@ +void script_2732(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 3, 0); + setWidgetSize(2, 2, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFilled(1); + if (((boolean)arg3)) { + setWidgetRGB(new Color(cs2method_3408(105, 105, 3724, arg1))); + } else if (arg3 == 2) { + setWidgetRGB(new Color(cs2method_3408(105, 105, 3723, arg1))); + } else if (arg3 == 3) { + setWidgetRGB(new Color(cs2method_3408(105, 105, 3726, arg1))); + } else { + setWidgetRGB(new Color(cs2method_3408(105, 105, 3056, arg1))); + } + createExtraChild(new WidgetPointer(arg0), 5, 1); + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(0, 0, 1, 1); + ivar4 = 2289; + ivar5 = 2288; + if (arg2 == arg1) { + setWidgetSprite(ivar4); + } else { + setWidgetSprite(ivar5); + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar4, "Iid", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar5, "Iid", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2733.cs2 b/dumps/scripts/2733.cs2 new file mode 100644 index 000000000..c8878cea7 --- /dev/null +++ b/dumps/scripts/2733.cs2 @@ -0,0 +1,12 @@ +void script_2733(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + if (arg0 != 1) { + return; + } + if (bitconfig_3612 == arg1) { + return; + } + bitconfig_3612 = arg1; + playSoundEffect(2266, 1, 0); + script_2735(arg2, arg3, arg4, arg5, arg6, arg7); + return; +} diff --git a/dumps/scripts/2734.cs2 b/dumps/scripts/2734.cs2 new file mode 100644 index 000000000..ddc14dde8 --- /dev/null +++ b/dumps/scripts/2734.cs2 @@ -0,0 +1,4 @@ +void script_2734(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_2735(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/2735.cs2 b/dumps/scripts/2735.cs2 new file mode 100644 index 000000000..db671c57b --- /dev/null +++ b/dumps/scripts/2735.cs2 @@ -0,0 +1,95 @@ +void script_2735(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (standart_config_287 <= 0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + } + setWidgetRGB(new Color(cs2method_3408(105, 105, 3724, bitconfig_3612)), new WidgetPointer(arg1)); + setWidgetRGB(new Color(cs2method_3408(105, 105, 3056, standart_config_287)), new WidgetPointer(arg3)); + setWidgetRGB(new Color(cs2method_3408(105, 105, 3723, bitconfig_9188)), new WidgetPointer(arg4)); + setWidgetRGB(new Color(cs2method_3408(105, 105, 3726, bitconfig_9191)), new WidgetPointer(arg5)); + setWidgetUnknownBoolean(((boolean)cs2method_3408(105, 49, 3057, standart_config_287)), new WidgetPointer(arg3)); + script_3418(64356369, 0, bitconfig_3612); + script_3418(64356370, 1, bitconfig_3612); + script_3418(64356371, 2, bitconfig_3612); + script_3418(64356372, 3, bitconfig_3612); + script_3418(64356373, 4, bitconfig_3612); + script_3418(64356374, 5, bitconfig_3612); + script_3418(64356375, 6, bitconfig_3612); + script_3418(64356376, 7, bitconfig_3612); + script_3418(64356377, 8, bitconfig_3612); + script_3418(64356378, 9, bitconfig_3612); + script_3418(64356379, 10, bitconfig_3612); + script_3418(64356380, 11, bitconfig_3612); + script_3418(64356381, 12, bitconfig_3612); + script_3418(64356382, 13, bitconfig_3612); + script_3418(64356383, 14, bitconfig_3612); + script_3418(64356384, 15, bitconfig_3612); + script_3418(64356385, 20, bitconfig_3612); + script_3418(64356386, 17, bitconfig_3612); + script_3418(64356387, 18, bitconfig_3612); + script_3418(64356388, 19, bitconfig_3612); + script_3418(64356449, 0, bitconfig_9191); + script_3418(64356450, 1, bitconfig_9191); + script_3418(64356451, 2, bitconfig_9191); + script_3418(64356452, 3, bitconfig_9191); + script_3418(64356453, 4, bitconfig_9191); + script_3418(64356454, 5, bitconfig_9191); + script_3418(64356455, 6, bitconfig_9191); + script_3418(64356456, 7, bitconfig_9191); + script_3418(64356457, 8, bitconfig_9191); + script_3418(64356458, 9, bitconfig_9191); + script_3418(64356459, 10, bitconfig_9191); + script_3418(64356460, 11, bitconfig_9191); + script_3418(64356461, 12, bitconfig_9191); + script_3418(64356462, 13, bitconfig_9191); + script_3418(64356463, 14, bitconfig_9191); + script_3418(64356464, 15, bitconfig_9191); + script_3418(64356465, 20, bitconfig_9191); + script_3418(64356466, 17, bitconfig_9191); + script_3418(64356467, 18, bitconfig_9191); + script_3418(64356468, 19, bitconfig_9191); + script_3418(64356424, 0, bitconfig_9188); + script_3418(64356425, 1, bitconfig_9188); + script_3418(64356426, 2, bitconfig_9188); + script_3418(64356427, 3, bitconfig_9188); + script_3418(64356428, 4, bitconfig_9188); + script_3418(64356429, 5, bitconfig_9188); + script_3418(64356430, 6, bitconfig_9188); + script_3418(64356431, 7, bitconfig_9188); + script_3418(64356432, 8, bitconfig_9188); + script_3418(64356433, 9, bitconfig_9188); + script_3418(64356434, 10, bitconfig_9188); + script_3418(64356435, 11, bitconfig_9188); + script_3418(64356436, 12, bitconfig_9188); + script_3418(64356437, 13, bitconfig_9188); + script_3418(64356438, 14, bitconfig_9188); + script_3418(64356439, 15, bitconfig_9188); + script_3418(64356440, 20, bitconfig_9188); + script_3418(64356441, 17, bitconfig_9188); + script_3418(64356442, 18, bitconfig_9188); + script_3418(64356443, 19, bitconfig_9188); + script_3418(64356401, 1, standart_config_287); + script_3418(64356402, 2, standart_config_287); + script_3418(64356403, 3, standart_config_287); + script_3418(64356404, 4, standart_config_287); + script_3418(64356405, 5, standart_config_287); + script_3418(64356406, 6, standart_config_287); + script_3418(64356407, 7, standart_config_287); + script_3418(64356408, 8, standart_config_287); + script_3418(64356409, 9, standart_config_287); + script_3418(64356410, 10, standart_config_287); + script_3418(64356411, 11, standart_config_287); + script_3418(64356412, 12, standart_config_287); + script_3418(64356413, 13, standart_config_287); + script_3418(64356414, 14, standart_config_287); + script_3418(64356415, 15, standart_config_287); + script_3418(64356416, 16, standart_config_287); + script_3418(64356417, 17, standart_config_287); + script_3418(64356418, 18, standart_config_287); + script_84(); + script_89(); + return; +} diff --git a/dumps/scripts/2736.cs2 b/dumps/scripts/2736.cs2 new file mode 100644 index 000000000..018329239 --- /dev/null +++ b/dumps/scripts/2736.cs2 @@ -0,0 +1,15 @@ +void script_2736() { + if (((boolean)bitconfig_6084)) { + if (((boolean)globalint_774)) { + return; + } + globalint_774 = 1; + } else { + if (((boolean)globalint_774)) { + return; + } + globalint_774 = 0; + } + script_2790(); + return; +} diff --git a/dumps/scripts/2737.cs2 b/dumps/scripts/2737.cs2 new file mode 100644 index 000000000..1cf1bddb8 --- /dev/null +++ b/dumps/scripts/2737.cs2 @@ -0,0 +1,4 @@ +void script_2737(int arg0) { + script_2739(arg0, -1); + return; +} diff --git a/dumps/scripts/2738.cs2 b/dumps/scripts/2738.cs2 new file mode 100644 index 000000000..a2652006c --- /dev/null +++ b/dumps/scripts/2738.cs2 @@ -0,0 +1,4 @@ +void script_2738(int arg0,int arg1) { + script_2739(arg0, arg1); + return; +} diff --git a/dumps/scripts/2739.cs2 b/dumps/scripts/2739.cs2 new file mode 100644 index 000000000..b2901e178 --- /dev/null +++ b/dumps/scripts/2739.cs2 @@ -0,0 +1,46 @@ +void script_2739(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar2 = getItemContainerLength(93); + ivar3 = -1; + ivar4 = divide(ivar2, 4); + ivar5 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(4, 36)), 3); + ivar6 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(ivar4, 32)), 6); + ivar7 = 0; + while (ivar7 < ivar2) { + createExtraChild(new WidgetPointer(arg0), 5, ivar7); + ivar3 = getItemIdInSlot(93, ivar7); + if (ivar3 != -1) { + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(mod(ivar7, 4), add(36, ivar5)), multiply(divide(ivar7, 4), add(32, ivar6)), 0, 0); + setItemOnWidgetMethod1200(ivar3, getItemAmtInSlot(93, ivar7)); + cs2method1305(concat("", getItemName(ivar3))); + setWidgetContextMenuOption(1, "Equip"); + setWidgetContextMenuOption(9, "Stats"); + cs2method1306("Compare"); + setWidgetContextMenuOption(10, "Examine"); + setWidgetShadowColor(new Color(48, 32, 32)); + if (arg1 == ivar7) { + setWidgetBorderThickness(2); + } else { + setWidgetBorderThickness(1); + } + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -2147483643, 100, 0, 8, "Iiiii"); + setScriptCallOnUse(2738, new WidgetPointer(arg0), ivar7, "Ii"); + setScriptCallOnUseWith(2738, new WidgetPointer(arg0), -1, "Ii"); + } else { + setWidgetHidden(1); + } + ivar7 = add(ivar7, 1); + } + if ((arg1 != -1) && (getItemIdInSlot(93, arg1) == -1)) { + arg1 = -1; + } + setScriptCallOnItemContainerUpdate(2738, new WidgetPointer(-32768,3), arg1, 93, 1, "IiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/274.cs2 b/dumps/scripts/274.cs2 new file mode 100644 index 000000000..d2fea383e --- /dev/null +++ b/dumps/scripts/274.cs2 @@ -0,0 +1,4 @@ +void script_274() { + script_275(); + return; +} diff --git a/dumps/scripts/2740.cs2 b/dumps/scripts/2740.cs2 new file mode 100644 index 000000000..9e8c37c15 --- /dev/null +++ b/dumps/scripts/2740.cs2 @@ -0,0 +1,59 @@ +void script_2740(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + switch (globalint_1007) { + case 1: + script_2766(0, 50, arg0); + break; + case 2: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 31, 0, 37), 900, addToCoordinate(ivar1, 31, 0, 37), 900, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 31, 0, 39), 750, addToCoordinate(ivar1, 31, 0, 39), 750, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 31, 0, 43), 700, addToCoordinate(ivar1, 31, 0, 43), 700, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 31, 0, 43), 700, addToCoordinate(ivar1, 31, 0, 43), 700, 0); + cameraMethod5502(0, 0, 50, 0, 1, 0); + break; + case 3: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 31, 0, 27), 900, addToCoordinate(ivar1, 31, 0, 27), 900, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 31, 0, 27), 1000, addToCoordinate(ivar1, 31, 0, 27), 1000, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 31, 0, 33), 750, addToCoordinate(ivar1, 31, 0, 33), 750, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 31, 0, 33), 750, addToCoordinate(ivar1, 31, 0, 33), 750, 0); + cameraMethod5502(0, 0, 50, 0, 1, 0); + break; + case 40: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 36, 0, 29), 850, addToCoordinate(ivar1, 36, 0, 29), 850, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 36, 0, 29), 800, addToCoordinate(ivar1, 36, 0, 29), 800, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 33, 0, 36), 700, addToCoordinate(ivar1, 33, 0, 36), 700, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 33, 0, 36), 600, addToCoordinate(ivar1, 33, 0, 36), 600, 0); + cameraMethod5502(0, 0, 50, 0, 1, 0); + break; + case 50: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 39, 0, 23), 1000, addToCoordinate(ivar1, 39, 0, 23), 1000, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 39, 0, 23), 950, addToCoordinate(ivar1, 39, 0, 23), 950, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 36, 0, 28), 750, addToCoordinate(ivar1, 36, 0, 28), 750, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 36, 0, 28), 650, addToCoordinate(ivar1, 36, 0, 28), 650, 0); + cameraMethod5502(0, 0, 50, 0, 1, 0); + break; + case 99: + script_2766(0, 50, arg0); + break; + case 100: + cs2method5512(); + script_2768(50, arg0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/2741.cs2 b/dumps/scripts/2741.cs2 new file mode 100644 index 000000000..e13dde32a --- /dev/null +++ b/dumps/scripts/2741.cs2 @@ -0,0 +1,21 @@ +void script_2741() { + int ivar0; + string svar0; + string svar1; + svar0 = "Confirm"; + svar1 = "Continue"; + ivar0 = add(getTextWidth(495, svar0), 30); + script_3965(67371125, ivar0, svar0, ""); + script_368(67371123, add(getTextWidth(495, svar1), 30), svar1, ""); + svar1 = "Back"; + ivar0 = add(ivar0, 55); + script_368(67371124, add(getTextWidth(495, svar1), 30), svar1, ""); + if (((boolean)bitconfig_8246) && ((boolean)bitconfig_8247)) { + setWidgetPosition(20, 0, 2, 2, new WidgetPointer(1028,115)); + setWidgetPosition(0, 0, 2, 2, new WidgetPointer(1028,116)); + } else { + setWidgetPosition(ivar0, 0, 2, 2, new WidgetPointer(1028,115)); + setWidgetPosition(ivar0, 0, 2, 2, new WidgetPointer(1028,116)); + } + return; +} diff --git a/dumps/scripts/2742.cs2 b/dumps/scripts/2742.cs2 new file mode 100644 index 000000000..67e8a94af --- /dev/null +++ b/dumps/scripts/2742.cs2 @@ -0,0 +1,6 @@ +void script_2742() { + setWidgetSprite(2560, new WidgetPointer(204,21)); + setWidgetSprite(2560, new WidgetPointer(204,19)); + setWidgetSprite(2561, new WidgetPointer(204,20)); + return; +} diff --git a/dumps/scripts/2743.cs2 b/dumps/scripts/2743.cs2 new file mode 100644 index 000000000..68c7b6655 --- /dev/null +++ b/dumps/scripts/2743.cs2 @@ -0,0 +1,6 @@ +void script_2743() { + setWidgetSprite(2558, new WidgetPointer(204,21)); + setWidgetSprite(2558, new WidgetPointer(204,19)); + setWidgetSprite(2559, new WidgetPointer(204,20)); + return; +} diff --git a/dumps/scripts/2744.cs2 b/dumps/scripts/2744.cs2 new file mode 100644 index 000000000..38894b276 --- /dev/null +++ b/dumps/scripts/2744.cs2 @@ -0,0 +1,71 @@ +void script_2744() { + int ivar0; + ivar0 = 0; + while (ivar0 < 31) { + createExtraChild(new WidgetPointer(204,86), 4, ivar0); + setWidgetSize(46, 20, 0, 0); + setWidgetPosition(4, multiply(ivar0, 20), 0, 0); + setWidgetFont(496); + setWidgetTextAlignment(1, 1, 0); + setWidgetText(intToStr(add(ivar0, 1))); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(2748, ivar0, "i"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16723968, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + ivar0 = add(ivar0, 1); + } + setWidgetScrollMax(0, multiply(ivar0, 20), new WidgetPointer(204,86)); + script_31(13369431, 13369430, 792, 789, 790, 791, 773, 788); + ivar0 = 0; + while (ivar0 < 12) { + createExtraChild(new WidgetPointer(204,98), 4, ivar0); + setWidgetSize(158, 20, 0, 0); + setWidgetPosition(4, multiply(ivar0, 20), 0, 0); + setWidgetFont(496); + setWidgetTextAlignment(1, 1, 0); + setWidgetText(cs2method_3408(105, 115, 950, ivar0)); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(2749, ivar0, "i"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16723968, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + ivar0 = add(ivar0, 1); + } + setWidgetScrollMax(0, multiply(ivar0, 20), new WidgetPointer(204,98)); + script_31(13369443, 13369442, 792, 789, 790, 791, 773, 788); + ivar0 = 0; + while (ivar0 < 90) { + createExtraChild(new WidgetPointer(204,110), 4, ivar0); + setWidgetSize(70, 20, 0, 0); + setWidgetPosition(6, add(multiply(ivar0, 20), 1), 0, 0); + setWidgetFont(496); + setWidgetTextAlignment(1, 1, 0); + setWidgetText(intToStr(subtract(2009, ivar0))); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(2750, ivar0, "i"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16723968, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + ivar0 = add(ivar0, 1); + } + setWidgetScrollMax(0, multiply(ivar0, 20), new WidgetPointer(204,110)); + script_31(13369455, 13369454, 792, 789, 790, 791, 773, 788); + setWidgetIsHidden(true, new WidgetPointer(204,86)); + setWidgetIsHidden(true, new WidgetPointer(204,77)); + setWidgetIsHidden(true, new WidgetPointer(204,87)); + setWidgetIsHidden(true, new WidgetPointer(204,98)); + setWidgetIsHidden(true, new WidgetPointer(204,89)); + setWidgetIsHidden(true, new WidgetPointer(204,99)); + setWidgetIsHidden(true, new WidgetPointer(204,110)); + setWidgetIsHidden(true, new WidgetPointer(204,111)); + setWidgetIsHidden(true, new WidgetPointer(204,101)); + setWidgetIsHidden(true, new WidgetPointer(204,26)); + setWidgetIsHidden(true, new WidgetPointer(204,27)); + setWidgetIsHidden(true, new WidgetPointer(204,28)); + setWidgetIsHidden(false, new WidgetPointer(204,29)); + setWidgetIsHidden(false, new WidgetPointer(204,45)); + setWidgetIsHidden(false, new WidgetPointer(204,61)); + setWidgetIsHidden(true, new WidgetPointer(204,113)); + return; +} diff --git a/dumps/scripts/2745.cs2 b/dumps/scripts/2745.cs2 new file mode 100644 index 000000000..33c10f6a7 --- /dev/null +++ b/dumps/scripts/2745.cs2 @@ -0,0 +1,27 @@ +void script_2745() { + if (isWidgetHidden(new WidgetPointer(204,86))) { + setWidgetVFlip(1, new WidgetPointer(204,44)); + setWidgetIsHidden(false, new WidgetPointer(204,86)); + setWidgetIsHidden(false, new WidgetPointer(204,77)); + setWidgetIsHidden(false, new WidgetPointer(204,87)); + setWidgetIsHidden(false, new WidgetPointer(204,26)); + } else { + setWidgetVFlip(0, new WidgetPointer(204,44)); + setWidgetIsHidden(true, new WidgetPointer(204,86)); + setWidgetIsHidden(true, new WidgetPointer(204,77)); + setWidgetIsHidden(true, new WidgetPointer(204,87)); + setWidgetIsHidden(true, new WidgetPointer(204,26)); + } + setWidgetVFlip(0, new WidgetPointer(204,60)); + setWidgetIsHidden(true, new WidgetPointer(204,98)); + setWidgetIsHidden(true, new WidgetPointer(204,89)); + setWidgetIsHidden(true, new WidgetPointer(204,99)); + setWidgetIsHidden(true, new WidgetPointer(204,27)); + setWidgetVFlip(0, new WidgetPointer(204,76)); + setWidgetIsHidden(true, new WidgetPointer(204,110)); + setWidgetIsHidden(true, new WidgetPointer(204,101)); + setWidgetIsHidden(true, new WidgetPointer(204,111)); + setWidgetIsHidden(true, new WidgetPointer(204,28)); + setWidgetIsHidden(true, new WidgetPointer(204,113)); + return; +} diff --git a/dumps/scripts/2746.cs2 b/dumps/scripts/2746.cs2 new file mode 100644 index 000000000..a9ab1076e --- /dev/null +++ b/dumps/scripts/2746.cs2 @@ -0,0 +1,27 @@ +void script_2746() { + if (isWidgetHidden(new WidgetPointer(204,98))) { + setWidgetVFlip(1, new WidgetPointer(204,60)); + setWidgetIsHidden(false, new WidgetPointer(204,98)); + setWidgetIsHidden(false, new WidgetPointer(204,89)); + setWidgetIsHidden(false, new WidgetPointer(204,99)); + setWidgetIsHidden(false, new WidgetPointer(204,27)); + } else { + setWidgetVFlip(0, new WidgetPointer(204,60)); + setWidgetIsHidden(true, new WidgetPointer(204,98)); + setWidgetIsHidden(true, new WidgetPointer(204,89)); + setWidgetIsHidden(true, new WidgetPointer(204,99)); + setWidgetIsHidden(true, new WidgetPointer(204,27)); + } + setWidgetVFlip(0, new WidgetPointer(204,44)); + setWidgetIsHidden(true, new WidgetPointer(204,86)); + setWidgetIsHidden(true, new WidgetPointer(204,77)); + setWidgetIsHidden(true, new WidgetPointer(204,87)); + setWidgetIsHidden(true, new WidgetPointer(204,26)); + setWidgetVFlip(0, new WidgetPointer(204,76)); + setWidgetIsHidden(true, new WidgetPointer(204,110)); + setWidgetIsHidden(true, new WidgetPointer(204,101)); + setWidgetIsHidden(true, new WidgetPointer(204,111)); + setWidgetIsHidden(true, new WidgetPointer(204,28)); + setWidgetIsHidden(true, new WidgetPointer(204,113)); + return; +} diff --git a/dumps/scripts/2747.cs2 b/dumps/scripts/2747.cs2 new file mode 100644 index 000000000..6322ac321 --- /dev/null +++ b/dumps/scripts/2747.cs2 @@ -0,0 +1,27 @@ +void script_2747() { + if (isWidgetHidden(new WidgetPointer(204,110))) { + setWidgetVFlip(1, new WidgetPointer(204,76)); + setWidgetIsHidden(false, new WidgetPointer(204,110)); + setWidgetIsHidden(false, new WidgetPointer(204,101)); + setWidgetIsHidden(false, new WidgetPointer(204,111)); + setWidgetIsHidden(false, new WidgetPointer(204,28)); + } else { + setWidgetVFlip(0, new WidgetPointer(204,76)); + setWidgetIsHidden(true, new WidgetPointer(204,110)); + setWidgetIsHidden(true, new WidgetPointer(204,101)); + setWidgetIsHidden(true, new WidgetPointer(204,111)); + setWidgetIsHidden(true, new WidgetPointer(204,28)); + } + setWidgetVFlip(0, new WidgetPointer(204,44)); + setWidgetIsHidden(true, new WidgetPointer(204,86)); + setWidgetIsHidden(true, new WidgetPointer(204,77)); + setWidgetIsHidden(true, new WidgetPointer(204,87)); + setWidgetIsHidden(true, new WidgetPointer(204,26)); + setWidgetVFlip(0, new WidgetPointer(204,60)); + setWidgetIsHidden(true, new WidgetPointer(204,98)); + setWidgetIsHidden(true, new WidgetPointer(204,89)); + setWidgetIsHidden(true, new WidgetPointer(204,99)); + setWidgetIsHidden(true, new WidgetPointer(204,27)); + setWidgetIsHidden(true, new WidgetPointer(204,113)); + return; +} diff --git a/dumps/scripts/2748.cs2 b/dumps/scripts/2748.cs2 new file mode 100644 index 000000000..35387b332 --- /dev/null +++ b/dumps/scripts/2748.cs2 @@ -0,0 +1,9 @@ +void script_2748(int arg0) { + setWidgetText(new WidgetPointer(204,30), intToStr(add(arg0, 1))); + setWidgetVFlip(0, new WidgetPointer(204,44)); + setWidgetIsHidden(true, new WidgetPointer(204,86)); + setWidgetIsHidden(true, new WidgetPointer(204,87)); + setWidgetIsHidden(true, new WidgetPointer(204,77)); + setWidgetIsHidden(true, new WidgetPointer(204,26)); + return; +} diff --git a/dumps/scripts/2749.cs2 b/dumps/scripts/2749.cs2 new file mode 100644 index 000000000..570598602 --- /dev/null +++ b/dumps/scripts/2749.cs2 @@ -0,0 +1,9 @@ +void script_2749(int arg0) { + setWidgetText(new WidgetPointer(204,46), cs2method_3408(105, 115, 950, arg0)); + setWidgetVFlip(0, new WidgetPointer(204,60)); + setWidgetIsHidden(true, new WidgetPointer(204,98)); + setWidgetIsHidden(true, new WidgetPointer(204,99)); + setWidgetIsHidden(true, new WidgetPointer(204,89)); + setWidgetIsHidden(true, new WidgetPointer(204,27)); + return; +} diff --git a/dumps/scripts/275.cs2 b/dumps/scripts/275.cs2 new file mode 100644 index 000000000..5967378ec --- /dev/null +++ b/dumps/scripts/275.cs2 @@ -0,0 +1,10 @@ +void script_275() { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(919,1)), 75, 0, 0, new WidgetPointer(919,1)); + setScriptCallOnClickContextMenu(272, "", new WidgetPointer(919,23)); + setWidgetText(new WidgetPointer(919,31), "Show All"); + deleteAllExtraChilds(new WidgetPointer(919,5)); + setWidgetVFlip(0, new WidgetPointer(919,29)); + setWidgetVFlip(0, new WidgetPointer(919,30)); + cs2method2100(0, 0, new WidgetPointer(919,6)); + return; +} diff --git a/dumps/scripts/2750.cs2 b/dumps/scripts/2750.cs2 new file mode 100644 index 000000000..aaa675573 --- /dev/null +++ b/dumps/scripts/2750.cs2 @@ -0,0 +1,9 @@ +void script_2750(int arg0) { + setWidgetText(new WidgetPointer(204,62), intToStr(subtract(2009, arg0))); + setWidgetIsHidden(true, new WidgetPointer(204,110)); + setWidgetIsHidden(true, new WidgetPointer(204,111)); + setWidgetIsHidden(true, new WidgetPointer(204,101)); + setWidgetIsHidden(true, new WidgetPointer(204,28)); + setWidgetIsHidden(false, new WidgetPointer(204,61)); + return; +} diff --git a/dumps/scripts/2751.cs2 b/dumps/scripts/2751.cs2 new file mode 100644 index 000000000..fa464400d --- /dev/null +++ b/dumps/scripts/2751.cs2 @@ -0,0 +1,4 @@ +void script_2751() { + setWidgetText(new WidgetPointer(1051,11), intToStr(standart_config_1652) + " " + cs2method_3408(105, 115, 950, standart_config_1653) + " " + intToStr(standart_config_1654)); + return; +} diff --git a/dumps/scripts/2752.cs2 b/dumps/scripts/2752.cs2 new file mode 100644 index 000000000..136945a94 --- /dev/null +++ b/dumps/scripts/2752.cs2 @@ -0,0 +1,11 @@ +void script_2752() { + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(0, 0, 255)); + setWidgetUnknownBoolean(false); + setWidgetSize(0, subtract(getWidgetActualHeight(new WidgetPointer(getWidgetParentId())), add(getWidgetActualY(new WidgetPointer(752,5)), getWidgetActualHeight(new WidgetPointer(752,5)))), 1, 0); + setWidgetPosition(0, 0, 1, 2); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 255, "Iii"); + return; +} diff --git a/dumps/scripts/2753.cs2 b/dumps/scripts/2753.cs2 new file mode 100644 index 000000000..8e7ac255f --- /dev/null +++ b/dumps/scripts/2753.cs2 @@ -0,0 +1,26 @@ +void script_2753(int arg0,int arg1,int arg2,int arg3,string arg4) { + if (arg1 != 1) { + return; + } + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + deleteExtraChild(); + } + if ((globalint_5 != arg0) || (strLength(arg4) <= 0)) { + return; + } + globalstring_22 = strRemoveEntities(arg4); + setWidgetText(new WidgetPointer(752,5), replaceLtGt(globalstring_22)); + if (globalint_5 == 8) { + sendNameInput(globalstring_22); + script_1548(0); + } else if (globalint_5 == 9) { + sendStringInput(globalstring_22); + script_1548(0); + } else { + if (globalint_5 == 10) { + sendUnknownFriendPacketMethod3619(globalstring_22); + script_1548(0); + } + } + return; +} diff --git a/dumps/scripts/2754.cs2 b/dumps/scripts/2754.cs2 new file mode 100644 index 000000000..3df9f4416 --- /dev/null +++ b/dumps/scripts/2754.cs2 @@ -0,0 +1,4 @@ +void script_2754(int arg0,int arg1,int arg2) { + script_2755(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/2755.cs2 b/dumps/scripts/2755.cs2 new file mode 100644 index 000000000..141818860 --- /dev/null +++ b/dumps/scripts/2755.cs2 @@ -0,0 +1,39 @@ +void script_2755(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int stack_dump0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1) || ((arg1 == -1) && setWidgetRegister(new WidgetPointer(arg0)))) { + stack_dump0 = script_1743(); + ivar4 = script_1744(); + ivar3 = stack_dump0; + if (ivar3 < multiplyDivide(1, 3, getWidgetActualWidth(new WidgetPointer(746,3)))) { + if (ivar4 < multiplyDivide(1, 3, getWidgetActualHeight(new WidgetPointer(746,3)))) { + setWidget3DRotation(0, 0, 512, 768, 0, 1000, new WidgetPointer(arg2)); + setWidgetPosition(add(ivar3, getWidgetActualWidth()), add(ivar4, getWidgetActualHeight()), 0, 0, new WidgetPointer(arg2)); + } else { + setWidget3DRotation(0, 0, 512, 256, 0, 1000, new WidgetPointer(arg2)); + setWidgetPosition(add(ivar3, getWidgetActualWidth()), subtract(ivar4, getWidgetActualHeight(new WidgetPointer(arg2))), 0, 0, new WidgetPointer(arg2)); + } + } else if (ivar4 < multiplyDivide(1, 3, getWidgetActualHeight(new WidgetPointer(746,3)))) { + if (arg0 == 48890031) { + ivar5 = subtract(subtract(ivar3, getWidgetActualWidth(new WidgetPointer(arg2))), 10); + ivar6 = add(ivar4, getWidgetActualHeight()); + setWidget3DRotation(0, 0, 512, 1280, 0, 1000, new WidgetPointer(arg2)); + setWidgetPosition(ivar5, ivar6, 0, 0, new WidgetPointer(arg2)); + return; + } + setWidget3DRotation(0, 0, 512, 1280, 0, 1000, new WidgetPointer(arg2)); + setWidgetPosition(subtract(ivar3, getWidgetActualWidth(new WidgetPointer(arg2))), add(ivar4, getWidgetActualHeight()), 0, 0, new WidgetPointer(arg2)); + } else { + setWidget3DRotation(0, 0, 512, 1792, 0, 1000, new WidgetPointer(arg2)); + setWidgetPosition(subtract(ivar3, getWidgetActualWidth(new WidgetPointer(arg2))), subtract(ivar4, getWidgetActualHeight(new WidgetPointer(arg2))), 0, 0, new WidgetPointer(arg2)); + } + } + return; +} diff --git a/dumps/scripts/2756.cs2 b/dumps/scripts/2756.cs2 new file mode 100644 index 000000000..09e2ad54c --- /dev/null +++ b/dumps/scripts/2756.cs2 @@ -0,0 +1,14 @@ +void script_2756() { + if (bitconfig_3756 == add(16, 1)) { + script_736(48890035, -1, 35913914, -1); + } else if (bitconfig_3756 == add(17, 1)) { + script_736(48890031, -1, 35913912, -1); + } else if (bitconfig_3756 == add(18, 1)) { + script_736(48890037, -1, 35913908, -1); + } else if (bitconfig_3756 == add(19, 1)) { + script_736(48890030, -1, 35913906, -1); + } else { + script_736(script_1742(subtract(bitconfig_3756, 1)), -1, script_121(subtract(bitconfig_3756, 1)), -1); + } + return; +} diff --git a/dumps/scripts/2757.cs2 b/dumps/scripts/2757.cs2 new file mode 100644 index 000000000..8d8b4998c --- /dev/null +++ b/dumps/scripts/2757.cs2 @@ -0,0 +1,11 @@ +void script_2757(int arg0) { + if ((((boolean)globalint_173) || ((boolean)bitconfig_542)) || (arg0 != 1)) { + return; + } + if (cameraGetVrot() < 150) { + cameraMethod5504(150, 0); + } else { + cameraMethod5504(149, 0); + } + return; +} diff --git a/dumps/scripts/2758.cs2 b/dumps/scripts/2758.cs2 new file mode 100644 index 000000000..399be8d35 --- /dev/null +++ b/dumps/scripts/2758.cs2 @@ -0,0 +1,6 @@ +void script_2758(int arg0) { + setScriptCallOnConfigChange(2759, new WidgetPointer(-32768,3), 466, 1, "IY", new WidgetPointer(arg0)); + setScriptCallOnGlobalConfigChange(2759, new WidgetPointer(-32768,3), 173, 1, "IY", new WidgetPointer(arg0)); + script_2760(arg0); + return; +} diff --git a/dumps/scripts/2759.cs2 b/dumps/scripts/2759.cs2 new file mode 100644 index 000000000..fffb39f0e --- /dev/null +++ b/dumps/scripts/2759.cs2 @@ -0,0 +1,4 @@ +void script_2759(int arg0) { + script_2760(arg0); + return; +} diff --git a/dumps/scripts/276.cs2 b/dumps/scripts/276.cs2 new file mode 100644 index 000000000..b4751df69 --- /dev/null +++ b/dumps/scripts/276.cs2 @@ -0,0 +1,13 @@ +string script_276(int arg0) { + switch (arg0) { + case 1: + return "Lake"; + case 2: + return "River"; + case 3: + return "Beach"; + case 4: + return "Docks"; + } + return "Waterfront"; +} diff --git a/dumps/scripts/2760.cs2 b/dumps/scripts/2760.cs2 new file mode 100644 index 000000000..5b06c7d0c --- /dev/null +++ b/dumps/scripts/2760.cs2 @@ -0,0 +1,12 @@ +void script_2760(int arg0) { + if (((boolean)globalint_173) || ((boolean)bitconfig_542)) { + setWidgetNoOptions(new WidgetPointer(arg0)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg0)); + cs2method2005(0, new WidgetPointer(arg0)); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Face North"); + setScriptCallOnClickContextMenu(2757, -2147483644, "i", new WidgetPointer(arg0)); + cs2method2005(1, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2761.cs2 b/dumps/scripts/2761.cs2 new file mode 100644 index 000000000..2a0478a14 --- /dev/null +++ b/dumps/scripts/2761.cs2 @@ -0,0 +1,3 @@ +int script_2761() { + return add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(getSkillActualLvl(0), getSkillActualLvl(2)), getSkillActualLvl(1)), getSkillActualLvl(4)), getSkillActualLvl(5)), getSkillActualLvl(6)), getSkillActualLvl(20)), getSkillActualLvl(22)), getSkillActualLvl(3)), getSkillActualLvl(16)), getSkillActualLvl(15)), getSkillActualLvl(17)), getSkillActualLvl(12)), getSkillActualLvl(9)), getSkillActualLvl(18)), getSkillActualLvl(21)), getSkillActualLvl(14)), getSkillActualLvl(13)), getSkillActualLvl(10)), getSkillActualLvl(7)), getSkillActualLvl(11)), getSkillActualLvl(8)), getSkillActualLvl(19)), getSkillActualLvl(23)), getSkillActualLvl(24)); +} diff --git a/dumps/scripts/2762.cs2 b/dumps/scripts/2762.cs2 new file mode 100644 index 000000000..e909ec2a9 --- /dev/null +++ b/dumps/scripts/2762.cs2 @@ -0,0 +1,65 @@ +void script_2762(int arg0,int arg1) { + switch (globalint_1007) { + case 101: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60347213, arg1), 450, script_2764(60347213, arg1), 500, 0); + cs2method5406(0, 1, script_2764(60363597, arg1), 600, script_2764(60363597, arg1), 550, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60248915, arg1), 350, script_2764(60248915, arg1), 375, 0); + cs2method5406(1, 1, script_2764(60298065, arg1), 350, script_2764(60298065, arg1), 375, 0); + cameraMethod5502(0, 0, 300, 400, 1, 0); + break; + case 102: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60248921, arg1), 600, script_2764(60248922, arg1), 600, 0); + cs2method5406(0, 1, script_2764(60265310, arg1), 700, script_2764(60265309, arg1), 700, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60265295, arg1), 400, script_2764(60265293, arg1), 400, 0); + cs2method5406(1, 1, script_2764(60265298, arg1), 400, script_2764(60265298, arg1), 400, 0); + cameraMethod5502(0, 0, 250, 200, 1, 0); + break; + case 103: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60281685, arg1), 700, script_2764(60298070, arg1), 650, 0); + cs2method5406(0, 1, script_2764(60298074, arg1), 650, script_2764(60298074, arg1), 650, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60298083, arg1), 5, script_2764(60298083, arg1), 5, 0); + cs2method5406(1, 1, script_2764(60298088, arg1), 5, script_2764(60298088, arg1), 5, 0); + cameraMethod5502(0, 0, 200, 200, 1, 0); + break; + case 104: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60117861, arg1), 300, script_2764(60117860, arg1), 300, 0); + cs2method5406(0, 1, script_2764(60150626, arg1), 300, script_2764(60134242, arg1), 300, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60298077, arg1), 250, script_2764(60298077, arg1), 250, 0); + cs2method5406(1, 1, script_2764(60298077, arg1), 250, script_2764(60298077, arg1), 250, 0); + cameraMethod5502(0, 0, 100, 50, 1, 0); + break; + case 105: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60298079, arg1), 700, script_2764(60298083, arg1), 700, 0); + cs2method5406(0, 1, script_2764(60216163, arg1), 700, script_2764(60232547, arg1), 700, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60068707, arg1), 5, script_2764(60068707, arg1), 5, 0); + cs2method5406(1, 1, script_2764(60068707, arg1), 5, script_2764(60068707, arg1), 5, 0); + cameraMethod5502(0, 0, 80, 50, 1, 0); + break; + case 106: + script_2766(0, 40, arg0); + break; + case 107: + script_2768(25, arg0); + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60281694, arg1), 350, script_2764(60281695, arg1), 350, 0); + cs2method5406(0, 1, script_2764(60216165, arg1), 550, script_2764(60232549, arg1), 550, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60216158, arg1), 300, script_2764(60216158, arg1), 300, 0); + cs2method5406(1, 1, script_2764(60101470, arg1), 350, script_2764(60101470, arg1), 350, 0); + cameraMethod5502(0, 0, 120, 40, 1, 0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/2763.cs2 b/dumps/scripts/2763.cs2 new file mode 100644 index 000000000..4293eaafc --- /dev/null +++ b/dumps/scripts/2763.cs2 @@ -0,0 +1,38 @@ +void script_2763(int arg0,int arg1) { + switch (globalint_1007) { + case 201: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60314467, arg1), 600, script_2764(60330851, arg1), 600, 0); + cs2method5406(0, 1, script_2764(60363619, arg1), 550, script_2764(60363619, arg1), 600, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60068707, arg1), 200, script_2764(60068707, arg1), 200, 0); + cs2method5406(1, 1, script_2764(60068707, arg1), 200, script_2764(60068707, arg1), 200, 0); + cameraMethod5502(0, 0, 200, 75, 1, 0); + break; + case 202: + script_2766(0, 10, arg0); + break; + case 203: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60363619, arg1), 550, script_2764(60363619, arg1), 550, 0); + cs2method5406(0, 1, script_2764(60347235, arg1), 750, script_2764(60347235, arg1), 750, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60068707, arg1), 200, script_2764(60068707, arg1), 200, 0); + cs2method5406(1, 1, script_2764(60068707, arg1), 200, script_2764(60068707, arg1), 200, 0); + cameraMethod5502(0, 0, 50, 25, 1, 0); + script_2768(75, arg0); + break; + case 204: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60281702, arg1), 550, script_2764(60298086, arg1), 550, 0); + cs2method5406(0, 1, script_2764(60330855, arg1), 550, script_2764(60314471, arg1), 550, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60379998, arg1), 400, script_2764(60363614, arg1), 400, 0); + cs2method5406(1, 1, script_2764(60183394, arg1), 400, script_2764(60199777, arg1), 400, 0); + cameraMethod5502(0, 0, 150, 220, 1, 0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/2764.cs2 b/dumps/scripts/2764.cs2 new file mode 100644 index 000000000..7bd2aa2c4 --- /dev/null +++ b/dumps/scripts/2764.cs2 @@ -0,0 +1,3 @@ +int script_2764(int arg0,int arg1) { + return addToCoordinate(arg1, subtract(add(16, extractX(arg0)), extractX(59773760)), 0, subtract(add(16, extractY(arg0)), extractY(59773760))); +} diff --git a/dumps/scripts/2765.cs2 b/dumps/scripts/2765.cs2 new file mode 100644 index 000000000..933a24b22 --- /dev/null +++ b/dumps/scripts/2765.cs2 @@ -0,0 +1,20 @@ +void script_2765(int arg0) { + if (globalint_1007 <= 0) { + cs2method5512(); + return; + } + if (globalint_1007 <= 100) { + script_2770(arg0, script_284(getMyPositionHash())); + return; + } + if (globalint_1007 <= 200) { + script_2762(arg0, script_284(getMyPositionHash())); + return; + } + if (globalint_1007 <= 300) { + script_2763(arg0, script_284(getMyPositionHash())); + return; + } + script_2826(arg0, script_284(getMyPositionHash())); + return; +} diff --git a/dumps/scripts/2766.cs2 b/dumps/scripts/2766.cs2 new file mode 100644 index 000000000..7d1d7c974 --- /dev/null +++ b/dumps/scripts/2766.cs2 @@ -0,0 +1,11 @@ +void script_2766(int arg0,int arg1,int arg2) { + createExtraChild(new WidgetPointer(arg2), 3, 0); + cs2method2103(255); + setWidgetFilled(1); + setWidgetRGB(new Color(arg0)); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + arg1 = min(arg1, 250); + setScriptCallOnGameloop(2767, add(getClientCycle(), arg1), new WidgetPointer(arg2), "iI"); + return; +} diff --git a/dumps/scripts/2767.cs2 b/dumps/scripts/2767.cs2 new file mode 100644 index 000000000..d7f9c2693 --- /dev/null +++ b/dumps/scripts/2767.cs2 @@ -0,0 +1,14 @@ +void script_2767(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (setWidgetRegister(new WidgetPointer(arg1), 0)) { + ivar2 = subtract(arg0, getClientCycle()); + if (ivar2 <= 0) { + cs2method2103(0); + setScriptCallOnGameloop(-1, ""); + return; + } + cs2method2103(max(subtract(cs2method1609(), divide(cs2method1609(), ivar2)), 1)); + } + return; +} diff --git a/dumps/scripts/2768.cs2 b/dumps/scripts/2768.cs2 new file mode 100644 index 000000000..4ca147fda --- /dev/null +++ b/dumps/scripts/2768.cs2 @@ -0,0 +1,10 @@ +void script_2768(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg1), 0)) { + setWidgetFilled(1); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + cs2method2103(0); + setScriptCallOnGameloop(2769, add(getClientCycle(), arg0), new WidgetPointer(arg1), "iI"); + } + return; +} diff --git a/dumps/scripts/2769.cs2 b/dumps/scripts/2769.cs2 new file mode 100644 index 000000000..96edc247d --- /dev/null +++ b/dumps/scripts/2769.cs2 @@ -0,0 +1,17 @@ +void script_2769(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 0; + ivar3 = 0; + if (setWidgetRegister(new WidgetPointer(arg1), 0)) { + ivar2 = subtract(arg0, getClientCycle()); + if (ivar2 <= 0) { + setScriptCallOnGameloop(-1, ""); + deleteExtraChild(); + return; + } + ivar3 = subtract(255, cs2method1609()); + cs2method2103(min(add(cs2method1609(), divide(ivar3, ivar2)), 254)); + } + return; +} diff --git a/dumps/scripts/277.cs2 b/dumps/scripts/277.cs2 new file mode 100644 index 000000000..4d8eb707c --- /dev/null +++ b/dumps/scripts/277.cs2 @@ -0,0 +1,21 @@ +string script_277(int arg0) { + switch (arg0) { + case 1: + return "Worm"; + case 2: + return "Maggot"; + case 3: + return "Cricket"; + case 4: + return "Locust"; + case 5: + return "Cray"; + case 6: + return "Shrimp"; + case 7: + return "Green moth"; + case 8: + return "Grey moth"; + } + return "Unknown bait"; +} diff --git a/dumps/scripts/2770.cs2 b/dumps/scripts/2770.cs2 new file mode 100644 index 000000000..38654c3d4 --- /dev/null +++ b/dumps/scripts/2770.cs2 @@ -0,0 +1,120 @@ +void script_2770(int arg0,int arg1) { + switch (globalint_1007) { + case 1: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60298061, arg1), 600, script_2764(60298061, arg1), 600, 0); + cs2method5406(0, 1, script_2764(60298061, arg1), 450, script_2764(60298061, arg1), 450, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60298068, arg1), 100, script_2764(60298068, arg1), 100, 0); + cs2method5406(1, 1, script_2764(60298073, arg1), 100, script_2764(60298073, arg1), 100, 0); + cameraMethod5502(0, 0, 100, 140, 1, 0); + setScriptCallOnGameloop(2771, new WidgetPointer(arg0), getClientCycle(), "Ii", new WidgetPointer(arg0)); + break; + case 2: + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + cs2method5405(0, 10); + cs2method5405(1, 10); + cs2method5406(0, 0, script_2764(60183397, arg1), 400, script_2764(60183397, arg1), 420, 0); + cs2method5406(0, 1, script_2764(60199780, arg1), 400, script_2764(60199780, arg1), 420, 128); + cs2method5406(0, 2, script_2764(60216163, arg1), 400, script_2764(60216163, arg1), 420, 0); + cs2method5406(0, 3, script_2764(60232546, arg1), 400, script_2764(60232546, arg1), 420, -128); + cs2method5406(0, 4, script_2764(60248929, arg1), 400, script_2764(60248929, arg1), 420, 0); + cs2method5406(0, 5, script_2764(60265312, arg1), 400, script_2764(60265312, arg1), 420, 128); + cs2method5406(0, 6, script_2764(60281695, arg1), 400, script_2764(60281695, arg1), 420, 0); + cs2method5406(0, 7, script_2764(60298078, arg1), 400, script_2764(60298078, arg1), 420, -128); + cs2method5406(0, 8, script_2764(60298077, arg1), 400, script_2764(60298077, arg1), 420, 0); + cs2method5406(0, 9, script_2764(60298076, arg1), 400, script_2764(60298076, arg1), 420, 128); + cs2method5406(0, 10, script_2764(60298075, arg1), 400, script_2764(60298075, arg1), 420, 0); + cs2method5406(1, 0, script_2764(60298074, arg1), 400, script_2764(60298074, arg1), 400, 0); + cs2method5406(1, 1, script_2764(60298073, arg1), 395, script_2764(60298073, arg1), 395, 0); + cs2method5406(1, 2, script_2764(60298072, arg1), 390, script_2764(60298072, arg1), 390, 0); + cs2method5406(1, 3, script_2764(60298071, arg1), 385, script_2764(60298071, arg1), 385, 0); + cs2method5406(1, 4, script_2764(60298070, arg1), 380, script_2764(60298070, arg1), 380, 0); + cs2method5406(1, 5, script_2764(60298069, arg1), 375, script_2764(60298069, arg1), 375, 0); + cs2method5406(1, 6, script_2764(60298068, arg1), 370, script_2764(60298068, arg1), 370, 0); + cs2method5406(1, 7, script_2764(60298067, arg1), 365, script_2764(60298067, arg1), 365, 0); + cs2method5406(1, 8, script_2764(60298066, arg1), 360, script_2764(60298066, arg1), 360, 0); + cs2method5406(1, 9, script_2764(60298065, arg1), 355, script_2764(60298065, arg1), 355, 0); + cs2method5406(1, 10, script_2764(60298065, arg1), 350, script_2764(60298065, arg1), 350, 0); + setScriptCallOnMinimapRelatedSetting3(2772, new WidgetPointer(arg0), 1, "Ii", new WidgetPointer(arg0)); + cameraMethod5502(0, 0, 3000, 2500, 1, 0); + playSoundEffect(6645, 1, 0); + break; + case 3: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60298070, arg1), 350, script_2764(60298070, arg1), 350, 0); + cs2method5406(0, 1, script_2764(60298070, arg1), 300, script_2764(60298070, arg1), 300, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60298078, arg1), 300, script_2764(60298078, arg1), 300, 0); + cs2method5406(1, 1, script_2764(60298078, arg1), 350, script_2764(60298078, arg1), 350, 0); + cameraMethod5502(0, 0, 60, 50, 1, 0); + break; + case 4: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60363602, arg1), 450, script_2764(60363601, arg1), 450, 0); + cs2method5406(0, 1, script_2764(60330828, arg1), 600, script_2764(60330829, arg1), 600, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60298065, arg1), 400, script_2764(60298066, arg1), 400, 0); + cs2method5406(1, 1, script_2764(60298067, arg1), 350, script_2764(60298066, arg1), 350, 0); + cameraMethod5502(0, 0, 250, 200, 1, 0); + break; + case 5: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60363601, arg1), 700, script_2764(60363601, arg1), 700, 0); + cs2method5406(0, 1, script_2764(60363601, arg1), 700, script_2764(60363601, arg1), 700, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60298062, arg1), 350, script_2764(60298061, arg1), 350, 0); + cs2method5406(1, 1, script_2764(60298061, arg1), 150, script_2764(60298061, arg1), 350, 0); + cameraMethod5502(0, 0, 100, 100, 1, 0); + break; + case 6: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60347213, arg1), 450, script_2764(60347214, arg1), 450, 0); + cs2method5406(0, 1, script_2764(60314446, arg1), 450, script_2764(60314446, arg1), 450, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60298065, arg1), 400, script_2764(60298066, arg1), 400, 0); + cs2method5406(1, 1, script_2764(60298067, arg1), 400, script_2764(60298066, arg1), 400, 0); + cameraMethod5502(0, 0, 60, 60, 1, 0); + break; + case 7: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60314446, arg1), 400, script_2764(60314445, arg1), 400, 0); + cs2method5406(0, 1, script_2764(60314444, arg1), 400, script_2764(60314445, arg1), 400, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60248909, arg1), 350, script_2764(60248909, arg1), 350, 0); + cs2method5406(1, 1, script_2764(60248909, arg1), 350, script_2764(60248909, arg1), 350, 0); + cameraMethod5502(0, 0, 30, 30, 1, 0); + break; + case 8: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60363605, arg1), 450, script_2764(60363604, arg1), 450, 0); + cs2method5406(0, 1, script_2764(60347219, arg1), 450, script_2764(60363604, arg1), 450, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60330836, arg1), 400, script_2764(60314453, arg1), 400, 0); + cs2method5406(1, 1, script_2764(60298069, arg1), 400, script_2764(60314453, arg1), 400, 0); + cameraMethod5502(0, 0, 150, 150, 1, 0); + break; + case 9: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60363601, arg1), 500, script_2764(60330833, arg1), 500, 0); + cs2method5406(0, 1, script_2764(60248912, arg1), 700, script_2764(60248913, arg1), 700, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60330828, arg1), 250, script_2764(60330828, arg1), 250, 0); + cs2method5406(1, 1, script_2764(60347212, arg1), 250, script_2764(60347212, arg1), 250, 0); + cameraMethod5502(0, 0, 30, 30, 1, 0); + break; + case 10: + cs2method5405(0, 2); + cs2method5406(0, 0, script_2764(60363593, arg1), 800, script_2764(60363593, arg1), 800, 0); + cs2method5406(0, 1, script_2764(60363591, arg1), 600, script_2764(60363591, arg1), 600, 0); + cs2method5405(1, 2); + cs2method5406(1, 0, script_2764(60298064, arg1), 500, script_2764(60298064, arg1), 500, 0); + cs2method5406(1, 1, script_2764(60265298, arg1), 400, script_2764(60265298, arg1), 400, 0); + cameraMethod5502(0, 0, 400, 80, 1, 0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/2771.cs2 b/dumps/scripts/2771.cs2 new file mode 100644 index 000000000..e0f7970fe --- /dev/null +++ b/dumps/scripts/2771.cs2 @@ -0,0 +1,21 @@ +void script_2771(int arg0,int arg1) { + int ivar2; + ivar2 = subtract(getClientCycle(), arg1); + if ((ivar2 >= 181) || (globalint_1007 != 1)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + } + if (((boolean)mod(ivar2, 25))) { + switch (rnd(2)) { + case 0: + playSoundEffect(6645, 1, 0); + break; + case 1: + playSoundEffect(6644, 1, 0); + break; + case 2: + playSoundEffect(6643, 1, 0); + } + } + return; +} diff --git a/dumps/scripts/2772.cs2 b/dumps/scripts/2772.cs2 new file mode 100644 index 000000000..cbbf63881 --- /dev/null +++ b/dumps/scripts/2772.cs2 @@ -0,0 +1,23 @@ +void script_2772(int arg0,int arg1) { + int ivar2; + ivar2 = subtract(cs2method5407(0), 2); + if ((globalint_1007 != 2) || (arg1 > ivar2)) { + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + return; + } + switch (rnd(2)) { + case 0: + playSoundEffect(6645, 1, 0); + break; + case 1: + playSoundEffect(6644, 1, 0); + break; + case 2: + playSoundEffect(6643, 1, 0); + } + cameraMethod5502(0, arg1, 2500, 2400, 1, arg1); + if (arg1 < ivar2) { + setScriptCallOnMinimapRelatedSetting3(2772, new WidgetPointer(arg0), add(arg1, 1), "Ii", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2773.cs2 b/dumps/scripts/2773.cs2 new file mode 100644 index 000000000..81be690c6 --- /dev/null +++ b/dumps/scripts/2773.cs2 @@ -0,0 +1,61 @@ +void script_2773(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int stack_dump0; + if (standart_config_281 < 6) { + return; + } + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + switch (arg0) { + case 1: + cs2method5510(); + stack_dump0 = arg1; + ivar10 = arg5; + ivar9 = stack_dump0; + stack_dump0 = 2273; + ivar12 = 2278; + ivar11 = stack_dump0; + break; + case 2: + cs2method5509(); + stack_dump0 = arg2; + ivar10 = arg6; + ivar9 = stack_dump0; + stack_dump0 = 2272; + ivar12 = 2277; + ivar11 = stack_dump0; + break; + case 3: + cs2method5507(); + stack_dump0 = arg3; + ivar10 = arg7; + ivar9 = stack_dump0; + stack_dump0 = 2274; + ivar12 = 2279; + ivar11 = stack_dump0; + break; + case 4: + cs2method5508(); + stack_dump0 = arg4; + ivar10 = arg8; + ivar9 = stack_dump0; + stack_dump0 = 2275; + ivar12 = 2280; + ivar11 = stack_dump0; + break; + default: + return; + } + setWidgetSprite(2276, new WidgetPointer(ivar9)); + ivar13 = 2271; + setScriptCallOnGameloop(1723, new WidgetPointer(-32768,3), -2147483643, ivar13, add(getClientCycle(), 10), "Iidi", new WidgetPointer(ivar9)); + setWidgetSprite(ivar12, new WidgetPointer(ivar10)); + setScriptCallOnGameloop(1723, new WidgetPointer(-32768,3), -2147483643, ivar11, add(getClientCycle(), 10), "Iidi", new WidgetPointer(ivar10)); + return; +} diff --git a/dumps/scripts/2774.cs2 b/dumps/scripts/2774.cs2 new file mode 100644 index 000000000..d24817069 --- /dev/null +++ b/dumps/scripts/2774.cs2 @@ -0,0 +1,6 @@ +void script_2774(int arg0) { + playSoundEffect(2277, 1, 0); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg0)); + setScriptCallOnGameloop(2775, add(getClientCycle(), 15), new WidgetPointer(-32768,3), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2775.cs2 b/dumps/scripts/2775.cs2 new file mode 100644 index 000000000..4a634f8c9 --- /dev/null +++ b/dumps/scripts/2775.cs2 @@ -0,0 +1,8 @@ +void script_2775(int arg0,int arg1) { + if (getClientCycle() < arg0) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + setWidgetRGB(new Color(255, 48, 48), new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/2776.cs2 b/dumps/scripts/2776.cs2 new file mode 100644 index 000000000..cf48e5e36 --- /dev/null +++ b/dumps/scripts/2776.cs2 @@ -0,0 +1,4 @@ +void script_2776(int arg0,int arg1,int arg2) { + setScriptCallOnGameloop(2777, getClientCycle(), new WidgetPointer(arg1), new WidgetPointer(arg2), "iII", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2777.cs2 b/dumps/scripts/2777.cs2 new file mode 100644 index 000000000..58749dabb --- /dev/null +++ b/dumps/scripts/2777.cs2 @@ -0,0 +1,7 @@ +void script_2777(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = subtract(255, script_1210(200, 75, arg0, 0)); + cs2method2103(ivar3, new WidgetPointer(arg1)); + cs2method2103(ivar3, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/2778.cs2 b/dumps/scripts/2778.cs2 new file mode 100644 index 000000000..d28618a61 --- /dev/null +++ b/dumps/scripts/2778.cs2 @@ -0,0 +1,106 @@ +void script_2778(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + string svar0; + ivar4 = ((int)isWidgetHidden(new WidgetPointer(arg1))); + ivar5 = 0; + if (((boolean)bitconfig_7949) && (standart_config_281 < 1000)) { + if (((boolean)ivar4)) { + ivar5 = 1; + } + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetSize(0, add(getWidgetActualHeight(new WidgetPointer(arg1)), 1), 1, 1, new WidgetPointer(arg0)); + } else { + if (((boolean)ivar4)) { + ivar5 = 1; + } + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(arg0)); + } + svar0 = globalstring_194; + if ((strLength(globalstring_195) > 0) && ((boolean)standart_config_170)) { + svar0 = globalstring_195; + } + ivar6 = -1; + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + ivar6 = getWidgetItemId(); + } + ivar7 = -1; + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + ivar7 = getWidgetSpriteId(); + } + if (((setWidgetRegister(new WidgetPointer(arg2), 0) && ((boolean)stringMethod4107(svar0, getWidgetText()))) && ((ivar6 == globalint_1003) && (ivar7 == globalint_1004))) && ((boolean)ivar5)) { + return; + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + ivar8 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (ivar8 <= 0) { + return; + } + ivar9 = 0; + ivar10 = 0; + if (globalint_1003 != -1) { + createExtraChild(new WidgetPointer(arg0), 6, 0); + setWidgetSize(globalint_1005, globalint_1006, 0, 0); + if (globalint_1005 < 70) { + ivar10 = divide(subtract(70, globalint_1005), 2); + } + setWidgetPosition(ivar10, 0, 0, 1); + setItemOnWidgetMethod1205(globalint_1003, 1); + ivar9 = add(max(globalint_1005, 70), 5); + ivar8 = subtract(ivar8, ivar9); + createExtraChild(new WidgetPointer(arg0), 3, 1); + setWidgetSize(0, 0, 0, 0); + setWidgetPosition(0, 0, 0, 1); + setWidgetHidden(1); + } else { + if (globalint_1004 != -1) { + createExtraChild(new WidgetPointer(arg0), 3, 0); + setWidgetSize(0, 0, 0, 0); + setWidgetPosition(0, 0, 0, 1); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, 1); + setWidgetSize(globalint_1005, globalint_1006, 0, 0); + if (globalint_1005 < 70) { + ivar10 = divide(subtract(70, globalint_1005), 2); + } + setWidgetPosition(ivar10, 0, 0, 1); + setWidgetSprite(globalint_1004); + ivar9 = add(max(globalint_1005, 70), 5); + ivar8 = subtract(ivar8, ivar9); + } + } + cs2method2100(0, 0, new WidgetPointer(arg2)); + setWidgetPosition(ivar9, 0, 0, 1, new WidgetPointer(arg2)); + ivar11 = add(multiply(getLineCount(ivar8, 307, svar0), 12), 3); + if (ivar11 > getWidgetActualHeight(new WidgetPointer(arg0))) { + ivar8 = subtract(ivar8, add(getWidgetActualWidth(new WidgetPointer(arg3)), 5)); + setWidgetSize(ivar8, 0, 0, 1, new WidgetPointer(arg2)); + ivar11 = add(multiply(getLineCount(ivar8, 307, svar0), 12), 3); + setWidgetScrollMax(0, ivar11, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + script_31(arg3, arg2, 792, 789, 790, 791, 773, 788); + } else { + ivar11 = getWidgetActualHeight(new WidgetPointer(arg0)); + setWidgetSize(ivar8, 0, 0, 1, new WidgetPointer(arg2)); + setWidgetScrollMax(0, 0, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + } + createExtraChild(new WidgetPointer(arg2), 4, 0); + setWidgetSize(0, ivar11, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetFont(307); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetText(svar0); + return; +} diff --git a/dumps/scripts/2779.cs2 b/dumps/scripts/2779.cs2 new file mode 100644 index 000000000..2e6d5712c --- /dev/null +++ b/dumps/scripts/2779.cs2 @@ -0,0 +1,77 @@ +void script_2779(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,string arg8,string arg9,string arg10,string arg11,string arg12) { + int ivar8; + int ivar9; + int ivar10; + if (isWidgetHidden(new WidgetPointer(906,29))) { + return; + } + setWidgetNoOptions(new WidgetPointer(906,236)); + setWidgetNoOptions(new WidgetPointer(906,242)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(906,236)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(906,242)); + ivar8 = arg7; + if (((boolean)arg4)) { + ivar8 = max(arg7, add(getTextWidth(3793, arg9), 26)); + if (((boolean)mod(ivar8, 2))) { + ivar8 = add(ivar8, 1); + } + } + setWidgetSize(ivar8, 154, 0, 0, new WidgetPointer(906,29)); + ivar9 = add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(906,235)), 3793, arg8), 16), 5); + setWidgetSize(20, ivar9, 1, 0, new WidgetPointer(906,235)); + setWidgetText(new WidgetPointer(906,235), arg8); + if (((boolean)arg2)) { + globalint_1092 = add(getClientCycle(), 5); + setWidgetSprite(4107, new WidgetPointer(906,234)); + setWidgetSize(111, 111, 0, 0, new WidgetPointer(906,234)); + setWidgetPosition(0, 7, 1, 0, new WidgetPointer(906,234)); + setWidgetPosition(0, 112, 1, 0, new WidgetPointer(906,235)); + setScriptCallOnGameloop(3094, "", new WidgetPointer(906,234)); + } else { + globalint_1092 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(906,234)); + setWidgetSprite(arg3, new WidgetPointer(906,234)); + setWidgetSize(76, 63, 0, 0, new WidgetPointer(906,234)); + setWidgetPosition(0, 18, 1, 0, new WidgetPointer(906,234)); + setWidgetPosition(0, 123, 1, 0, new WidgetPointer(906,235)); + ivar9 = subtract(ivar9, 35); + } + ivar10 = 0; + ivar9 = add(getWidgetActualY(new WidgetPointer(906,235)), ivar9); + if (((boolean)arg4) && ((boolean)arg6)) { + ivar10 = 12; + ivar9 = add(ivar9, ivar10); + setWidgetIsHidden(true, new WidgetPointer(906,236)); + setWidgetIsHidden(true, new WidgetPointer(906,242)); + } else if (((boolean)arg4) && ((boolean)arg6)) { + ivar10 = 41; + ivar9 = add(ivar9, ivar10); + setWidgetPosition(0, 8, 1, 2, new WidgetPointer(906,236)); + setWidgetIsHidden(false, new WidgetPointer(906,236)); + setWidgetIsHidden(true, new WidgetPointer(906,242)); + script_3098(59375852, 59375854, 59375855, 59375856, arg5, arg9, arg10); + } else if (((boolean)arg4) && ((boolean)arg6)) { + ivar10 = 41; + ivar9 = add(ivar9, ivar10); + setWidgetPosition(0, 8, 1, 2, new WidgetPointer(906,242)); + setWidgetIsHidden(false, new WidgetPointer(906,242)); + setWidgetIsHidden(true, new WidgetPointer(906,236)); + script_3099(59375858, 59375860, 59375861, 59375862, arg11, arg12); + } else { + ivar10 = 70; + ivar9 = add(ivar9, ivar10); + setWidgetPosition(0, 40, 1, 2, new WidgetPointer(906,236)); + setWidgetPosition(0, 10, 1, 2, new WidgetPointer(906,242)); + setWidgetIsHidden(false, new WidgetPointer(906,242)); + setWidgetIsHidden(false, new WidgetPointer(906,236)); + script_3098(59375852, 59375854, 59375855, 59375856, arg5, arg9, arg10); + script_3099(59375858, 59375860, 59375861, 59375862, arg11, arg12); + } + setWidgetSize(getWidgetActualWidth(new WidgetPointer(906,29)), ivar9, 0, 0, new WidgetPointer(906,29)); + script_3095(59375852, 59375858, arg0); + setWidgetPosition(0, ivar10, 1, 2, new WidgetPointer(906,235)); + setScriptCallOnKeyPress(3100, -2147483640, "i", new WidgetPointer(906,44)); + setWidgetIsHidden(false, new WidgetPointer(906,44)); + setWidgetIsHidden(false, new WidgetPointer(906,29)); + return; +} diff --git a/dumps/scripts/278.cs2 b/dumps/scripts/278.cs2 new file mode 100644 index 000000000..cbff2b412 --- /dev/null +++ b/dumps/scripts/278.cs2 @@ -0,0 +1,17 @@ +string script_278(int arg0) { + switch (arg0) { + case 1: + return "Standard"; + case 3: + return "Large"; + case 2: + return "Slim"; + case 6: + return "Double"; + case 5: + return "Wood"; + case 4: + return "Bone"; + } + return "Unknown hook"; +} diff --git a/dumps/scripts/2780.cs2 b/dumps/scripts/2780.cs2 new file mode 100644 index 000000000..72ada667f --- /dev/null +++ b/dumps/scripts/2780.cs2 @@ -0,0 +1,4 @@ +void script_2780(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_2162(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/2781.cs2 b/dumps/scripts/2781.cs2 new file mode 100644 index 000000000..19ce18b03 --- /dev/null +++ b/dumps/scripts/2781.cs2 @@ -0,0 +1,117 @@ +string script_2781() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar0; + opcStruct6901(3,0,0) structdump_0; + svar0 = ""; + ivar0 = getCurrentDaysSinceLaunch(); + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + structdump_0 = cs2method6901(); + ivar3 = structdump_0.intpart_2; + ivar2 = structdump_0.intpart_1; + ivar1 = structdump_0.intpart_0; + ivar1 = subtract(divide(ivar1, 1440), 11745); + ivar4 = cs2method6907(); + ivar5 = cs2method6908(); + ivar6 = subtract(ivar5, ivar0); + if ((ivar5 <= ivar4) || (ivar6 < 0)) { + ivar6 = 0; + } + if (((ivar4 != 0) && (add(ivar1, ivar0) >= ivar4)) && ((globalint_1315 != ivar0) && (ivar1 <= 14))) { + if (ivar1 <= 7) { + if (ivar1 <= 3) { + if (ivar1 <= 1) { + if (((boolean)ivar1)) { + if ((ivar6 > 0) && (ivar6 <= 14)) { + if (ivar6 <= 7) { + if (ivar6 <= 3) { + if (((boolean)ivar6)) { + svar0 = "Your credit card has expired and your membership credit has run out. Please re-subscribe using a new credit card to restart your membership." + "
" + "
" + "If you renew today, you will pay the lower 'loyalty' rate. After this, your discount will no longer be available."; + globalint_1316 = ivar0; + } else { + if (add(globalint_1316, 2) < ivar0) { + svar0 = "Your credit card has expired and your membership credit has run out. Please re-subscribe using a new credit card to restart your membership." + "
" + "
" + "If you renew within the next " + intToStr(ivar6) + " days, you will pay the lower 'loyalty' rate. After this, your discount will no longer be available."; + globalint_1316 = ivar0; + } + } + } else { + if (add(globalint_1316, 4) < ivar0) { + svar0 = "Your credit card has expired and your membership credit has run out. Please re-subscribe using a new credit card to restart your membership." + "
" + "
" + "If you renew within the next " + intToStr(ivar6) + " days, you will pay the lower 'loyalty' rate. After this, your discount will no longer be available."; + if (ivar6 == 7) { + globalint_1316 = ivar0; + } else { + globalint_1316 = subtract(ivar0, subtract(7, ivar6)); + } + } + } + } else { + if (add(globalint_1316, 7) < ivar0) { + svar0 = "Your credit card has expired and your membership credit has run out. Please re-subscribe using a new credit card to restart your membership." + "
" + "
" + "If you renew within the next " + intToStr(ivar6) + " days, you will pay the lower 'loyalty' rate. After this, your discount will no longer be available."; + if (ivar6 == 14) { + globalint_1316 = ivar0; + } else { + globalint_1316 = subtract(ivar0, subtract(14, ivar6)); + } + } + } + } + } else { + if (ivar6 > 0) { + svar0 = "Your credit card has expired. Please re-subscribe using a new credit card to continue your membership." + "
" + "
" + "If you renew within the next " + intToStr(ivar6) + " days, you will continue paying your lower 'loyalty' rate. After this, your discount will no longer be available."; + } else { + svar0 = "Your credit card has expired. Please re-subscribe using a new credit card to continue your membership."; + } + globalint_1315 = ivar0; + } + } else { + if (add(globalint_1315, 2) < ivar0) { + if (ivar6 > 0) { + svar0 = "Your credit card has expired. Please re-subscribe using a new credit card to continue your membership." + "
" + "
" + "If you renew within the next " + intToStr(ivar6) + " days, you will continue paying your lower 'loyalty' rate. After this, your discount will no longer be available."; + } else { + svar0 = "Your credit card has expired. Please re-subscribe using a new credit card to continue your membership."; + } + if (ivar1 == 3) { + globalint_1315 = ivar0; + } else { + globalint_1315 = subtract(ivar0, subtract(3, ivar1)); + } + } + } + } else { + if (add(globalint_1315, 4) < ivar0) { + if (ivar6 > 0) { + svar0 = "Your credit card has expired. Please re-subscribe using a new credit card to continue your membership." + "
" + "
" + "If you renew within the next " + intToStr(ivar6) + " days, you will continue paying your lower 'loyalty' rate. After this, your discount will no longer be available."; + } else { + svar0 = "Your credit card has expired. Please re-subscribe using a new credit card to continue your membership."; + } + if (ivar1 == 7) { + globalint_1315 = ivar0; + } else { + globalint_1315 = subtract(ivar0, subtract(7, ivar1)); + } + } + } + } else { + if (add(globalint_1315, 7) < ivar0) { + if (ivar6 > 0) { + svar0 = "Your credit card has expired. Please re-subscribe using a new credit card to continue your membership." + "
" + "
" + "If you renew within the next " + intToStr(ivar6) + " days, you will continue paying your lower 'loyalty' rate. After this, your discount will no longer be available."; + } else { + svar0 = "Your credit card has expired. Please re-subscribe using a new credit card to continue your membership."; + } + if (ivar1 == 14) { + globalint_1315 = ivar0; + } else { + globalint_1315 = subtract(ivar0, subtract(14, ivar1)); + } + } + } + } + return svar0; +} diff --git a/dumps/scripts/2782.cs2 b/dumps/scripts/2782.cs2 new file mode 100644 index 000000000..1b99c04d3 --- /dev/null +++ b/dumps/scripts/2782.cs2 @@ -0,0 +1,90 @@ +void script_2782() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + string svar0; + if (strLength(globalstring_321) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(667,52)); + setWidgetIsHidden(true, new WidgetPointer(670,1)); + setWidgetIsHidden(true, new WidgetPointer(763,3)); + return; + } + deleteAllExtraChilds(new WidgetPointer(667,54)); + ivar0 = getTextWidth(496, globalstring_321); + ivar1 = getMaxLineWidth(2147483647, 494, globalstring_322); + ivar2 = getMaxLineWidth(2147483647, 494, globalstring_323); + ivar3 = getMaxLineWidth(2147483647, 494, globalstring_324); + ivar4 = 0; + ivar5 = 0; + svar0 = "Superior stats are shown in " + "" + "white" + "" + "."; + if (strLength(globalstring_325) > 0) { + ivar4 = getMaxLineWidth(2147483647, 494, globalstring_325); + ivar5 = getTextWidth(494, svar0); + } + ivar6 = add(multiply(getLineCount(2147483647, 494, globalstring_324), 10), 3); + ivar7 = add(add(add(5, ivar2), 5), ivar3); + if (ivar4 > 0) { + ivar7 = add(add(ivar7, 5), ivar4); + ivar7 = max(ivar7, add(ivar5, 10)); + } + ivar7 = max(ivar7, ivar1); + ivar8 = max(max(ivar7, ivar0), getWidgetActualWidth(new WidgetPointer(667,65))); + ivar9 = 0; + if (ivar8 > ivar7) { + ivar9 = divide(subtract(ivar8, ivar7), 2); + } + createExtraChild(new WidgetPointer(667,54), 4, getExtraChildGap(new WidgetPointer(667,54))); + setWidgetPosition(add(ivar9, 10), 25, 0, 0); + setWidgetSize(getWidgetActualX(), ivar6, 1, 0); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetText(globalstring_322); + createExtraChild(new WidgetPointer(667,54), 4, getExtraChildGap(new WidgetPointer(667,54))); + setWidgetPosition(add(ivar9, 15), 25, 0, 0); + setWidgetSize(getWidgetActualX(), ivar6, 1, 0); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetText(globalstring_323); + createExtraChild(new WidgetPointer(667,54), 4, getExtraChildGap(new WidgetPointer(667,54))); + setWidgetPosition(add(add(add(ivar9, 15), ivar2), 5), 25, 0, 0); + setWidgetSize(ivar3, ivar6, 0, 0); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetTextAlignment(1, 0, 0); + setWidgetText(globalstring_324); + if (ivar4 > 0) { + createExtraChild(new WidgetPointer(667,54), 4, getExtraChildGap(new WidgetPointer(667,54))); + setWidgetPosition(add(add(add(add(add(ivar9, 15), ivar2), 5), ivar3), 5), 25, 0, 0); + setWidgetSize(ivar4, ivar6, 0, 0); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetTextAlignment(1, 0, 0); + setWidgetText(globalstring_325); + createExtraChild(new WidgetPointer(667,54), 4, getExtraChildGap(new WidgetPointer(667,54))); + setWidgetPosition(0, add(25, ivar6), 1, 0); + setWidgetSize(ivar5, 12, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetText(svar0); + ivar6 = add(ivar6, getWidgetActualHeight()); + } + setWidgetSize(add(ivar8, 20), add(ivar6, 60), 0, 0, new WidgetPointer(667,54)); + setWidgetText(new WidgetPointer(667,64), globalstring_321); + setWidgetIsHidden(false, new WidgetPointer(667,52)); + setWidgetIsHidden(false, new WidgetPointer(670,1)); + setWidgetIsHidden(false, new WidgetPointer(763,3)); + return; +} diff --git a/dumps/scripts/2783.cs2 b/dumps/scripts/2783.cs2 new file mode 100644 index 000000000..ae2b156e2 --- /dev/null +++ b/dumps/scripts/2783.cs2 @@ -0,0 +1,5 @@ +void script_2783() { + playSoundEffect(2266, 1, 0); + script_2947(); + return; +} diff --git a/dumps/scripts/2784.cs2 b/dumps/scripts/2784.cs2 new file mode 100644 index 000000000..ebb406485 --- /dev/null +++ b/dumps/scripts/2784.cs2 @@ -0,0 +1,77 @@ +void script_2784(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + int ivar8; + int ivar9; + int ivar10; + int ivar11; + if (((boolean)arg0) || (((extractX(getMyPositionHash()) >= extractX(45094272)) && (extractX(getMyPositionHash()) <= extractX(852481535))) && ((extractY(getMyPositionHash()) >= extractY(45094272)) && (extractY(getMyPositionHash()) <= extractY(852481535))))) { + if (arg6 != -1) { + if (extractY(getMyPositionHash()) < add(extractY(45094272), 8)) { + setWidgetIsHidden(false, new WidgetPointer(arg6)); + deleteAllExtraChilds(new WidgetPointer(arg6)); + script_1086(arg6, 0, 0, 0); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg6)); + } + } + if (((boolean)arg7) && (mod(getClientCycle(), 50) != 0)) { + return; + } + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg4)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg5)); + setWidgetSprite(444, new WidgetPointer(arg2)); + setWidgetText(new WidgetPointer(arg5), "ITEMS ARE" + "
" + "SAFE"); + } else if (((boolean)arg0) || (((extractX(getMyPositionHash()) >= extractX(48240000)) && (extractX(getMyPositionHash()) <= extractX(855627263))) && ((extractY(getMyPositionHash()) >= extractY(48240000)) && (extractY(getMyPositionHash()) <= extractY(855627263))))) { + if (arg6 != -1) { + if (extractY(getMyPositionHash()) < add(extractY(48240000), 8)) { + setWidgetIsHidden(false, new WidgetPointer(arg6)); + deleteAllExtraChilds(new WidgetPointer(arg6)); + script_1086(arg6, 0, 0, 0); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg6)); + } + } + if (((boolean)arg7) && (mod(getClientCycle(), 50) != 0)) { + return; + } + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg4)); + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg5)); + setWidgetSprite(445, new WidgetPointer(arg2)); + setWidgetText(new WidgetPointer(arg5), "ITEMS ARE" + "
" + "DROPPED"); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + if (arg6 != -1) { + setWidgetIsHidden(true, new WidgetPointer(arg6)); + } + deleteAllExtraChilds(new WidgetPointer(arg1)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(arg4)); + setWidgetIsHidden(false, new WidgetPointer(arg5)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + cs2method2107(1, new WidgetPointer(arg2)); + ivar8 = getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg4))); + ivar8 = max(getMaxLineWidth(512, 494, getWidgetText(new WidgetPointer(arg5))), ivar8); + ivar8 = add(ivar8, 8); + ivar9 = 5; + setWidgetPosition(0, ivar9, 0, 0, new WidgetPointer(arg4)); + ivar10 = getLineCount(ivar8, 494, getWidgetText(new WidgetPointer(arg4))); + ivar10 = add(multiply(ivar10, 10), 3); + setWidgetSize(ivar8, ivar10, 0, 0, new WidgetPointer(arg4)); + ivar9 = subtract(add(ivar9, ivar10), 1); + setWidgetPosition(divide(subtract(ivar8, getWidgetActualWidth(new WidgetPointer(arg3))), 2), ivar9, 0, 0, new WidgetPointer(arg3)); + ivar9 = subtract(add(ivar9, getWidgetActualHeight(new WidgetPointer(arg3))), 1); + setWidgetPosition(0, ivar9, 0, 0, new WidgetPointer(arg5)); + ivar11 = getLineCount(ivar8, 494, getWidgetText(new WidgetPointer(arg5))); + ivar11 = add(multiply(ivar11, 10), 3); + setWidgetSize(ivar8, ivar10, 0, 0, new WidgetPointer(arg5)); + ivar9 = add(add(ivar9, ivar11), 3); + setWidgetSize(ivar8, ivar9, 0, 0, new WidgetPointer(arg1)); + setWidgetSize(ivar8, ivar9, 0, 0, new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + script_1086(arg1, 0, 0, 0); + return; +} diff --git a/dumps/scripts/2785.cs2 b/dumps/scripts/2785.cs2 new file mode 100644 index 000000000..f7f74c7e7 --- /dev/null +++ b/dumps/scripts/2785.cs2 @@ -0,0 +1,15 @@ +int script_2785(int arg0) { + switch (arg0) { + case 34: + case 32: + case 33: + if (standart_config_281 < 93) { + return 32; + } + if (standart_config_281 < 120) { + return 33; + } + return 34; + } + return arg0; +} diff --git a/dumps/scripts/2786.cs2 b/dumps/scripts/2786.cs2 new file mode 100644 index 000000000..2ac6b5572 --- /dev/null +++ b/dumps/scripts/2786.cs2 @@ -0,0 +1,59 @@ +void script_2786(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + ivar4 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar5 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar6 = getExtraChildGap(new WidgetPointer(arg0)); + if (arg1 > 0) { + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, arg1, 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + ivar6 = add(ivar6, 1); + } + if (arg2 > 0) { + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, arg2, 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + ivar6 = add(ivar6, 1); + } + if (arg3 > 0) { + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, arg3, 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + ivar6 = add(ivar6, 1); + } + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + ivar6 = add(ivar6, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, subtract(ivar5, 32), 0, 0); + setWidgetSize(ivar4, 32, 0, 0); + setWidgetSprite(1076); + cs2method1107(1); + setWidgetVFlip(1); + ivar6 = add(ivar6, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(0, 1, 0, 0); + setWidgetSize(32, subtract(ivar5, 2), 0, 0); + setWidgetSprite(1077); + cs2method1107(1); + ivar6 = add(ivar6, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetPosition(subtract(ivar4, 32), 1, 0, 0); + setWidgetSize(32, subtract(ivar5, 2), 0, 0); + setWidgetSprite(1077); + cs2method1107(1); + setWidgetHFlip(1); + ivar6 = add(ivar6, 1); + return; +} diff --git a/dumps/scripts/2787.cs2 b/dumps/scripts/2787.cs2 new file mode 100644 index 000000000..7c42098f9 --- /dev/null +++ b/dumps/scripts/2787.cs2 @@ -0,0 +1,408 @@ +cs2func_script_2787_struct(2,2,0) script_2787(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_2787_struct(-1, 2287, "You can see what each spell does by selecting the spellbook icon on your side interface. Move your mouse over the icon of the spell you want and a description will be available.", " "); + case 1: + return newstruct cs2func_script_2787_struct(1, 3759, "Wind Rush", "You can now cast " + "" + "Wind Rush" + "" + "."); + case 2: + return newstruct cs2func_script_2787_struct(1, 15, "Wind Strike", "You can now cast " + "" + "Wind Strike" + "" + "."); + case 3: + return newstruct cs2func_script_2787_struct(3, 16, "Confuse", "You can now cast " + "" + "Confuse" + "" + "."); + case 4: + return newstruct cs2func_script_2787_struct(5, 17, "Water Strike", "You can now cast " + "" + "Water Strike" + "" + "."); + case 5: + return newstruct cs2func_script_2787_struct(9, 19, "Earth Strike", "You can now cast " + "" + "Earth Strike" + "" + "."); + case 6: + return newstruct cs2func_script_2787_struct(10, 1564, "Members: Teleport to Mobilising Armies", "You can now cast " + "" + "Teleport to Mobilising Armies" + "" + "."); + case 7: + return newstruct cs2func_script_2787_struct(11, 20, "Weaken", "You can now cast " + "" + "Weaken" + "" + "."); + case 8: + return newstruct cs2func_script_2787_struct(13, 21, "Fire Strike", "You can now cast " + "" + "Fire Strike" + "" + "."); + case 9: + return newstruct cs2func_script_2787_struct(15, 22, "Bones to Bananas", "You can now cast " + "" + "Bones to Bananas" + "" + "."); + case 10: + return newstruct cs2func_script_2787_struct(17, 23, "Wind Bolt", "You can now cast " + "" + "Wind Bolt" + "" + "."); + case 11: + return newstruct cs2func_script_2787_struct(19, 24, "Curse", "You can now cast " + "" + "Curse" + "" + "."); + case 12: + return newstruct cs2func_script_2787_struct(20, 319, "Bind", "You can now cast " + "" + "Bind" + "" + "."); + case 13: + return newstruct cs2func_script_2787_struct(21, 25, "Low Level Alchemy", "You can now cast " + "" + "Low Level Alchemy" + "" + "."); + case 14: + return newstruct cs2func_script_2787_struct(23, 26, "Water Bolt", "You can now cast " + "" + "Water Bolt" + "" + "."); + case 15: + return newstruct cs2func_script_2787_struct(25, 27, "Teleport to Varrock", "You can now cast " + "" + "Teleport to Varrock" + "" + "."); + case 16: + return newstruct cs2func_script_2787_struct(29, 29, "Earth Bolt", "You can now cast " + "" + "Earth Bolt" + "" + "."); + case 17: + return newstruct cs2func_script_2787_struct(31, 30, "Teleport to Lumbridge", "You can now cast " + "" + "Teleport to Lumbridge" + "" + "."); + case 18: + return newstruct cs2func_script_2787_struct(33, 31, "Telekinetic Grab", "You can now cast " + "" + "Telekinetic Grab" + "" + "."); + case 19: + return newstruct cs2func_script_2787_struct(35, 32, "Fire Bolt", "You can now cast " + "" + "Fire Bolt" + "" + "."); + case 20: + return newstruct cs2func_script_2787_struct(37, 33, "Teleport to Falador", "You can now cast " + "" + "Teleport to Falador" + "" + "."); + case 21: + return newstruct cs2func_script_2787_struct(39, 34, "Crumble Undead", "You can now cast " + "" + "Crumble Undead" + "" + "."); + case 22: + return newstruct cs2func_script_2787_struct(40, 355, "Members: Teleport to House", "Members can now cast " + "" + "Teleport to House" + "" + "."); + case 23: + return newstruct cs2func_script_2787_struct(41, 35, "Wind Blast", "You can now cast " + "" + "Wind Blast" + "" + "."); + case 24: + return newstruct cs2func_script_2787_struct(43, 36, "Superheat Item", "You can now cast " + "" + "Superheat Item" + "" + "."); + case 25: + return newstruct cs2func_script_2787_struct(45, 37, "Members: Teleport to Camelot", "Members can now cast " + "" + "Teleport to Camelot" + "" + "."); + case 26: + return newstruct cs2func_script_2787_struct(47, 38, "Water Blast", "You can now cast " + "" + "Water Blast" + "" + "."); + case 27: + return newstruct cs2func_script_2787_struct(50, 320, "Members: Snare", "Members can now cast " + "" + "Snare" + "" + "."); + case 28: + return newstruct cs2func_script_2787_struct(50, 324, "Members: Magic Dart" + "
" + " (with level 55 Slayer)", "Members now have the Magic level required to cast " + "" + "Magic Dart" + "" + ". (They also need level 55 Slayer.)"); + case 29: + return newstruct cs2func_script_2787_struct(50, 53, "Members: Iban's Blast" + "
" + " (after Underground Pass)", "Members now have the Magic level required to cast " + "" + "Iban's Blast" + "" + " (after Underground Pass)."); + case 30: + return newstruct cs2func_script_2787_struct(51, 54, "Members: Teleport to Ardougne" + "
" + " (after Plague City)", "Members can now cast " + "" + "Teleport to Ardougne" + "" + "."); + case 31: + return newstruct cs2func_script_2787_struct(53, 40, "Earth Blast", "You can now cast " + "" + "Earth Blast" + "" + "."); + case 32: + return newstruct cs2func_script_2787_struct(55, 41, "High-level Alchemy", "You can now cast " + "" + "High-level Alchemy" + "" + "."); + case 33: + return newstruct cs2func_script_2787_struct(58, 55, "Members: Teleport to the Watchtower" + "
" + " (after Watchtower)", "Members now have the Magic level required to cast " + "" + "Teleport to the Watchtower" + "" + " (after Watchtower)."); + case 34: + return newstruct cs2func_script_2787_struct(59, 44, "Fire Blast", "You can now cast " + "" + "Fire Blast" + "" + "."); + case 35: + return newstruct cs2func_script_2787_struct(60, 354, "Members: Bones to Peaches" + "
" + " (after Mage Training Arena)", "Members can now learn " + "" + "Bones to Peaches" + "" + " in the Mage Training Arena."); + case 36: + return newstruct cs2func_script_2787_struct(60, 61, "Members: Saradomin Strike" + "
" + " (after Mage Arena)", "Members can now learn " + "" + "Saradomin Strike" + "" + " in the Mage Arena."); + case 37: + return newstruct cs2func_script_2787_struct(60, 60, "Members: Claws of Guthix" + "
" + " (after Mage Arena)", "Members can now learn " + "" + "Claws of Guthix" + "" + " in the Mage Arena."); + case 38: + return newstruct cs2func_script_2787_struct(60, 59, "Members: Flames of Zamorak" + "
" + " (after Mage Arena)", "Members can now learn " + "" + "Flames of Zamorak" + "" + " in the Mage Arena."); + case 39: + return newstruct cs2func_script_2787_struct(61, 323, "Members: Teleport to Trollheim" + "
" + " (after Eadgar's Ruse)", "Members now have the Magic level required to cast " + "" + "Teleport to Trollheim" + "" + " (after Eadgar's Ruse)."); + case 40: + return newstruct cs2func_script_2787_struct(62, 46, "Members: Wind Wave", "Members can now cast " + "" + "Wind Wave" + "" + "."); + case 41: + return newstruct cs2func_script_2787_struct(64, 357, "Members: Teleport to Ape Atoll" + "
" + " (after saving Awowogei in Recipe for Disaster)", "Members now have the Magic level required to cast " + "" + "Teleport to Ape Atoll" + "" + " (after saving Awowogei in Recipe for Disaster)."); + case 42: + return newstruct cs2func_script_2787_struct(65, 48, "Members: Water Wave", "Members can now cast " + "" + "Water Wave" + "" + "."); + case 43: + return newstruct cs2func_script_2787_struct(66, 56, "Members: Vulnerability", "Members can now cast " + "" + "Vulnerability" + "" + "."); + case 44: + return newstruct cs2func_script_2787_struct(70, 51, "Members: Earth Wave", "Members can now cast " + "" + "Earth Wave" + "" + "."); + case 45: + return newstruct cs2func_script_2787_struct(73, 57, "Members: Enfeeble", "Members can now cast " + "" + "Enfeeble" + "" + "."); + case 46: + return newstruct cs2func_script_2787_struct(74, 349, "Members: Tele-other Lumbridge", "Members can now cast " + "" + "Tele-other to Lumbridge" + "" + "."); + case 47: + return newstruct cs2func_script_2787_struct(75, 52, "Members: Fire Wave", "Members can now cast " + "" + "Fire Wave" + "" + "."); + case 48: + return newstruct cs2func_script_2787_struct(77, 7699, "Members: Storm of Armadyl" + "
" + " (after Ritual of the Mahjarrat)", "Members can now cast " + "" + "Storm of Armadyl" + "" + " (after Ritual of the Mahjarrat)."); + case 49: + return newstruct cs2func_script_2787_struct(79, 321, "Members: Entangle", "Members can now cast " + "" + "Entangle" + "" + "."); + case 50: + return newstruct cs2func_script_2787_struct(80, 58, "Members: Stun", "Members can now cast " + "" + "Stun" + "" + "."); + case 51: + return newstruct cs2func_script_2787_struct(80, 322, "Members: Charge", "Members can now cast " + "" + "Charge" + "" + "."); + case 52: + return newstruct cs2func_script_2787_struct(81, 500, "Members: Wind Surge", "Members can now cast " + "" + "Wind Surge" + "" + "."); + case 53: + return newstruct cs2func_script_2787_struct(82, 350, "Members: Tele-other Falador", "Members can now cast " + "" + "Tele-other to Falador" + "" + "."); + case 54: + return newstruct cs2func_script_2787_struct(85, 1565, "Teleport Block", "You can now cast " + "" + "Teleport Block" + "" + "."); + case 55: + return newstruct cs2func_script_2787_struct(85, 501, "Members: Water Surge", "Members can now cast " + "" + "Water Surge" + "" + "."); + case 56: + return newstruct cs2func_script_2787_struct(90, 811, "Members: Earth Surge", "Members can now cast " + "" + "Earth Surge" + "" + "."); + case 57: + return newstruct cs2func_script_2787_struct(90, 351, "Members: Tele-other to Camelot", "Members can now cast " + "" + "Tele-other to Camelot" + "" + "."); + case 58: + return newstruct cs2func_script_2787_struct(95, 814, "Members: Fire Surge", "Members can now cast " + "" + "Fire Surge" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_2787_struct(-1, 2287, "Once you have completed Desert Treasure, you will be able to access the Ancient Magicks spellbook.", ""); + case 1: + return newstruct cs2func_script_2787_struct(-1, 356, "Members: Home teleport (to Edgeville)", ""); + case 2: + return newstruct cs2func_script_2787_struct(50, 329, "Members: Smoke Rush", "Members using the Ancient Magicks spellbook can now cast " + "" + "Smoke Rush" + "" + "."); + case 3: + return newstruct cs2func_script_2787_struct(52, 337, "Members: Shadow Rush", "Members using the Ancient Magicks spellbook can now cast " + "" + "Shadow Rush" + "" + "."); + case 4: + return newstruct cs2func_script_2787_struct(54, 341, "Members: Teleport to Paddewwa", "Members using the Ancient Magicks spellbook can now cast " + "" + "Teleport to Paddewwa" + "" + "."); + case 5: + return newstruct cs2func_script_2787_struct(56, 333, "Members: Blood Rush", "Members using the Ancient Magicks spellbook can now cast " + "" + "Blood Rush" + "" + "."); + case 6: + return newstruct cs2func_script_2787_struct(58, 325, "Members: Ice Rush", "Members using the Ancient Magicks spellbook can now cast " + "" + "Ice Rush" + "" + "."); + case 7: + return newstruct cs2func_script_2787_struct(60, 342, "Members: Teleport to Senntisten", "Members using the Ancient Magicks spellbook can now cast " + "" + "Teleport to Senntisten" + "" + "."); + case 8: + return newstruct cs2func_script_2787_struct(61, 1568, "Members: Miasmic Rush", "Members using the Ancient Magicks spellbook can now cast " + "" + "Miasmic Rush" + "" + "."); + case 9: + return newstruct cs2func_script_2787_struct(62, 330, "Members: Smoke Burst", "Members using the Ancient Magicks spellbook can now cast " + "" + "Smoke Burst" + "" + "."); + case 10: + return newstruct cs2func_script_2787_struct(64, 338, "Members: Shadow Burst", "Members using the Ancient Magicks spellbook can now cast " + "" + "Shadow Burst" + "" + "."); + case 11: + return newstruct cs2func_script_2787_struct(66, 343, "Members: Teleport to Kharyrll", "Members using the Ancient Magicks spellbook can now cast " + "" + "Teleport to Kharyrll" + "" + "."); + case 12: + return newstruct cs2func_script_2787_struct(68, 334, "Members: Blood Burst", "Members using the Ancient Magicks spellbook can now cast " + "" + "Blood Burst" + "" + "."); + case 13: + return newstruct cs2func_script_2787_struct(70, 326, "Members: Ice Burst", "Members using the Ancient Magicks spellbook can now cast " + "" + "Ice Burst" + "" + "."); + case 14: + return newstruct cs2func_script_2787_struct(72, 344, "Members: Teleport to Lassar", "Members using the Ancient Magicks spellbook can now cast " + "" + "Teleport to Lassar" + "" + "."); + case 15: + return newstruct cs2func_script_2787_struct(73, 1569, "Members: Miasmic Burst", "Members using the Ancient Magicks spellbook can now cast " + "" + "Miasmic Burst" + "" + "."); + case 16: + return newstruct cs2func_script_2787_struct(74, 331, "Members: Smoke Blitz", "Members using the Ancient Magicks spellbook can now cast " + "" + "Smoke Blitz" + "" + "."); + case 17: + return newstruct cs2func_script_2787_struct(76, 339, "Members: Shadow Blitz", "Members using the Ancient Magicks spellbook can now cast " + "" + "Shadow Blitz" + "" + "."); + case 18: + return newstruct cs2func_script_2787_struct(78, 345, "Members: Teleport to Dareeyak", "Members using the Ancient Magicks spellbook can now cast " + "" + "Teleport to Dareeyak" + "" + "."); + case 19: + return newstruct cs2func_script_2787_struct(80, 335, "Members: Blood Blitz", "Members using the Ancient Magicks spellbook can now cast " + "" + "Blood Blitz" + "" + "."); + case 20: + return newstruct cs2func_script_2787_struct(82, 327, "Members: Ice Blitz", "Members using the Ancient Magicks spellbook can now cast " + "" + "Ice Blitz" + "" + "."); + case 21: + return newstruct cs2func_script_2787_struct(84, 346, "Members: Teleport to Carrallangar", "Members using the Ancient Magicks spellbook can now cast " + "" + "Teleport to Carrallangar" + "" + "."); + case 22: + return newstruct cs2func_script_2787_struct(85, 1567, "Members: Miasmic Blitz", "Members using the Ancient Magicks spellbook can now cast " + "" + "Miasmic Blitz" + "" + "."); + case 23: + return newstruct cs2func_script_2787_struct(86, 332, "Members: Smoke Barrage", "Members using the Ancient Magicks spellbook can now cast " + "" + "Smoke Barrage" + "" + "."); + case 24: + return newstruct cs2func_script_2787_struct(88, 340, "Members: Shadow Barrage", "Members using the Ancient Magicks spellbook can now cast " + "" + "Shadow Barrage" + "" + "."); + case 25: + return newstruct cs2func_script_2787_struct(90, 347, "Members: Teleport to Annakarl", "Members using the Ancient Magicks spellbook can now cast " + "" + "Teleport to Annakarl" + "" + "."); + case 26: + return newstruct cs2func_script_2787_struct(92, 336, "Members: Blood Barrage", "Members using the Ancient Magicks spellbook can now cast " + "" + "Blood Barrage" + "" + "."); + case 27: + return newstruct cs2func_script_2787_struct(94, 328, "Members: Ice Barrage", "Members using the Ancient Magicks spellbook can now cast " + "" + "Ice Barrage" + "" + "."); + case 28: + return newstruct cs2func_script_2787_struct(96, 348, "Members: Teleport to Ghorrock", "Members using the Ancient Magicks spellbook can now cast " + "" + "Teleport to Ghorrock" + "" + "."); + case 29: + return newstruct cs2func_script_2787_struct(97, 1566, "Members: Miasmic Barrage", "Members using the Ancient Magicks spellbook can now cast " + "" + "Miasmic Barrage" + "" + "."); + } + break; + case 2: + SWITCH (arg1) { + case 0: + GOTO flow_95 + case 1: + GOTO flow_96 + case 2: + GOTO flow_97 + case 3: + GOTO flow_98 + case 4: + GOTO flow_99 + case 5: + GOTO flow_100 + case 6: + GOTO flow_101 + case 7: + GOTO flow_102 + case 8: + GOTO flow_103 + case 9: + GOTO flow_104 + case 10: + GOTO flow_105 + case 11: + GOTO flow_106 + case 12: + GOTO flow_107 + case 13: + GOTO flow_108 + case 14: + GOTO flow_109 + case 15: + GOTO flow_110 + case 16: + GOTO flow_111 + case 17: + GOTO flow_112 + case 18: + GOTO flow_113 + case 19: + GOTO flow_114 + case 20: + GOTO flow_115 + case 21: + GOTO flow_116 + case 22: + GOTO flow_117 + case 23: + GOTO flow_118 + case 24: + GOTO flow_119 + case 25: + GOTO flow_120 + case 26: + GOTO flow_121 + case 27: + GOTO flow_122 + case 28: + GOTO flow_123 + case 29: + GOTO flow_124 + case 30: + GOTO flow_125 + case 31: + GOTO flow_126 + case 32: + GOTO flow_127 + case 33: + GOTO flow_128 + case 34: + GOTO flow_129 + case 35: + GOTO flow_130 + case 36: + GOTO flow_131 + case 37: + GOTO flow_132 + case 38: + GOTO flow_133 + case 39: + GOTO flow_134 + case 40: + GOTO flow_135 + case 41: + GOTO flow_136 + case 42: + GOTO flow_137 + case 43: + GOTO flow_138 + case 44: + GOTO flow_139 + case 45: + GOTO flow_140 + case 46: + GOTO flow_141 + case 47: + GOTO flow_142 + case 48: + GOTO flow_143 + case 49: + GOTO flow_144 + case 50: + GOTO flow_145 + case 51: + GOTO flow_146 + case 52: + GOTO flow_147 + } + break; + flow_95: + return newstruct cs2func_script_2787_struct(-1, 2287, "Once you have completed Lunar Diplomacy, you will be able to access the Lunar spellbook.", ""); + flow_96: + return newstruct cs2func_script_2787_struct(-1, 356, "Members: Home teleport (to Lunar Isle)", ""); + flow_97: + return newstruct cs2func_script_2787_struct(65, 543, "Members: Bake Pie", "Members using the Lunar spellbook can now cast " + "" + "Bake Pie" + "" + "."); + flow_98: + return newstruct cs2func_script_2787_struct(66, 567, "Members: Cure Plant", "Members using the Lunar spellbook can now cast " + "" + "Cure Plant" + "" + "."); + flow_99: + return newstruct cs2func_script_2787_struct(66, 577, "Members: Monster Examine" + "
" + " (after Dream Mentor)", "Members using the Lunar or Dungeoneering spellbook now have the Magic level required to cast " + "" + "Monster Examine" + "" + " (after Dream Mentor)."); + flow_100: + return newstruct cs2func_script_2787_struct(67, 568, "Members: Contact", "Members using the Lunar spellbook now have the Magic level required to cast " + "" + "Contact" + "" + " (after Dream Mentor)."); + flow_101: + return newstruct cs2func_script_2787_struct(68, 559, "Members: Cure Other", "Members using the Lunar or Dungeoneering spellbook can now cast " + "" + "Cure Other" + "" + "."); + flow_102: + return newstruct cs2func_script_2787_struct(68, 578, "Members: Humidify" + "
" + " (after Dream Mentor)", "Members using the Lunar or Dungeoneering spellbook now have the Magic level required to cast " + "" + "Humidify" + "" + " (after Dream Mentor)."); + flow_103: + return newstruct cs2func_script_2787_struct(69, 544, "Members: Teleport to Moonclan Island", "Members using the Lunar spellbook can now cast " + "" + "Teleport to Moonclan Island" + "" + "."); + flow_104: + return newstruct cs2func_script_2787_struct(70, 569, "Members: Group Teleport to Moonclan Island", "Members using the Lunar spellbook can now cast " + "" + "Group Teleport to Moonclan Island" + "" + "."); + flow_105: + return newstruct cs2func_script_2787_struct(71, 562, "Members: Cure Me", "Members using the Lunar or Dungeoneering spellbook can now cast " + "" + "Cure Me" + "" + "."); + flow_106: + return newstruct cs2func_script_2787_struct(71, 579, "Members: Hunter Kit" + "
" + " (after Dream Mentor)", "Members using the Lunar spellbook now have the Magic level required to cast " + "" + "Hunter Kit" + "" + " (after Dream Mentor)."); + flow_107: + return newstruct cs2func_script_2787_struct(71, 583, "Members: Teleport to Ourania", "Members using the Lunar spellbook can now cast " + "" + "Teleport to Ourania" + "" + "."); + flow_108: + return newstruct cs2func_script_2787_struct(72, 545, "Members: Teleport to Waterbirth", "Members using the Lunar spellbook can now cast " + "" + "Teleport to Waterbirth" + "" + "."); + flow_109: + return newstruct cs2func_script_2787_struct(72, 4585, "Members: Teleport to South Falador" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook can now cast " + "" + "Teleport to South Falador" + "" + " (unlocked at the Livid Farm)."); + flow_110: + return newstruct cs2func_script_2787_struct(73, 570, "Members: Group Teleport to Waterbirth", "Members using the Lunar spellbook can now cast " + "" + "Group Teleport to Waterbirth" + "" + "."); + flow_111: + return newstruct cs2func_script_2787_struct(74, 565, "Members: Cure Group", "Members using the Lunar or Dungeoneering spellbook can now cast " + "" + "Cure Group" + "" + "."); + flow_112: + return newstruct cs2func_script_2787_struct(75, 4586, "Members: Repair Rune Pouch" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook now have the Magic level required to cast " + "" + "Repair Rune Pouch" + "" + " (unlocked at the Livid Farm)."); + flow_113: + return newstruct cs2func_script_2787_struct(75, 547, "Members: Teleport to the Barbarian Outpost", "Members using the Lunar spellbook can now cast " + "" + "Teleport to the Barbarian Outpost" + "" + "."); + flow_114: + return newstruct cs2func_script_2787_struct(75, 576, "Members: Stat Spy" + "
" + " (after Dream Mentor)", "Members using the Lunar spellbook now have the Magic level required to cast " + "" + "Stat Spy" + "" + " (after Dream Mentor)."); + flow_115: + return newstruct cs2func_script_2787_struct(76, 4587, "Members: Teleport to North Ardougne" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook now have the Magic level required to cast " + "" + "Teleport to North Ardougne" + "" + " (unlocked at the Livid Farm)."); + flow_116: + return newstruct cs2func_script_2787_struct(76, 571, "Members: Group Teleport to the Barbarian Outpost", "Members using the Lunar spellbook can now cast " + "" + "Group Teleport to the Barbarian Outpost" + "" + "."); + flow_117: + return newstruct cs2func_script_2787_struct(77, 548, "Members: Superglass Make", "Members using the Lunar spellbook can now cast " + "" + "Superglass Make" + "" + "."); + flow_118: + return newstruct cs2func_script_2787_struct(78, 4588, "Members: Remote Farming" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook can now cast " + "" + "Remote Farming" + "" + " (unlocked at the Livid Farm)."); + flow_119: + return newstruct cs2func_script_2787_struct(78, 549, "Members: Teleport to Port Khazard", "Members using the Lunar spellbook can now cast " + "" + "Teleport to Port Khazard" + "" + "."); + flow_120: + return newstruct cs2func_script_2787_struct(79, 572, "Members: Group Teleport to Port Khazard", "Members using the Lunar spellbook can now cast " + "" + "Group Teleport to Port Khazard" + "" + "."); + flow_121: + return newstruct cs2func_script_2787_struct(79, 580, "Members: Dream" + "
" + " (after Dream Mentor)", "Members using the Lunar spellbook now have the Magic level required to cast " + "" + "Dream" + "" + " (after Dream Mentor)."); + flow_122: + return newstruct cs2func_script_2787_struct(80, 4590, "Members: Spiritualise Food" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook can now cast " + "" + "Spiritualise Food" + "" + " (unlocked at the Livid Farm)."); + flow_123: + return newstruct cs2func_script_2787_struct(80, 550, "Members: String Jewellery", "Members using the Lunar spellbook can now cast " + "" + "String Jewellery" + "" + "."); + flow_124: + return newstruct cs2func_script_2787_struct(81, 554, "Members: Stat Restore Potion Share", "Members using the Lunar spellbook can now cast " + "" + "Stat Restore Potion Share" + "" + "."); + flow_125: + return newstruct cs2func_script_2787_struct(82, 552, "Members: Magic Imbue", "Members using the Lunar spellbook can now cast " + "" + "Magic Imbue" + "" + "."); + flow_126: + return newstruct cs2func_script_2787_struct(83, 4589, "Members: Make Leather" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook can now cast " + "" + "Make Leather" + "" + " (unlocked at the Livid Farm)."); + flow_127: + return newstruct cs2func_script_2787_struct(83, 553, "Members: Fertile Soil", "Members using the Lunar spellbook can now cast " + "" + "Fertile Soil" + "" + "."); + flow_128: + return newstruct cs2func_script_2787_struct(84, 551, "Members: Boost Potion Share", "Members using the Lunar spellbook can now cast " + "" + "Boost Potion Share" + "" + "."); + flow_129: + return newstruct cs2func_script_2787_struct(85, 555, "Members: Teleport to the Fishing Guild", "Members using the Lunar spellbook can now cast " + "" + "Teleport to the Fishing Guild" + "" + "."); + flow_130: + return newstruct cs2func_script_2787_struct(86, 573, "Members: Group Teleport to the Fishing Guild", "Members using the Lunar spellbook can now cast " + "" + "Group Teleport to the Fishing Guild" + "" + "."); + flow_131: + return newstruct cs2func_script_2787_struct(86, 581, "Members: Plank Make" + "
" + " (after Dream Mentor)", "Members using the Lunar spellbook now have the Magic level required to cast " + "" + "Plank Make" + "" + " (after Dream Mentor)."); + flow_132: + return newstruct cs2func_script_2787_struct(87, 556, "Members: Teleport to Catherby", "Members using the Lunar spellbook can now cast " + "" + "Teleport to Catherby" + "" + "."); + flow_133: + return newstruct cs2func_script_2787_struct(87, 7684, "Members: Tune Bane Ore" + "
" + " (after Ritual of the Mahjarrat)", "Members using the Lunar spellbook now have the Magic level required to cast " + "" + "Tune Bane Ore" + "" + " (after Ritual of the Mahjarrat)."); + flow_134: + return newstruct cs2func_script_2787_struct(88, 574, "Members: Group Teleport to Catherby", "Members using the Lunar spellbook can now cast " + "" + "Group Teleport to Catherby" + "" + "."); + flow_135: + return newstruct cs2func_script_2787_struct(89, 557, "Members: Teleport to the Ice Plateau", "Members using the Lunar spellbook can now cast " + "" + "Teleport to the Ice Plateau" + "" + "."); + flow_136: + return newstruct cs2func_script_2787_struct(90, 4591, "Members: Disruption Shield" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook can now cast " + "" + "Disruption Shield" + "" + " (unlocked at the Livid Farm)."); + flow_137: + return newstruct cs2func_script_2787_struct(90, 575, "Members: Group Teleport to the Ice Plateau", "Members using the Lunar spellbook can now cast " + "" + "Group Teleport to the Ice Plateau" + "" + "."); + flow_138: + return newstruct cs2func_script_2787_struct(91, 558, "Members: Energy Transfer", "Members using the Lunar spellbook can now cast " + "" + "Energy Transfer" + "" + "."); + flow_139: + return newstruct cs2func_script_2787_struct(92, 560, "Members: Heal Other", "Members using the Lunar spellbook can now cast " + "" + "Heal Other" + "" + "."); + flow_140: + return newstruct cs2func_script_2787_struct(92, 7685, "Members: Teleport to Trollheim" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook can now cast " + "" + "Teleport to Trollheim" + "" + ". (unlocked at the Livid Farm)."); + flow_141: + return newstruct cs2func_script_2787_struct(93, 561, "Members: Vengeance Other", "Members using the Lunar or Dungeoneering spellbook can now cast " + "" + "Vengeance Other" + "" + "."); + flow_142: + return newstruct cs2func_script_2787_struct(93, 7686, "Members: Group Teleport to Trollheim" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook can now cast " + "" + "Group Teleport to Trollheim" + "" + ". (unlocked at the Livid Farm)."); + flow_143: + return newstruct cs2func_script_2787_struct(94, 564, "Members: Vengeance", "Members using the Lunar or Dungeoneering spellbook can now cast " + "" + "Vengeance" + "" + "."); + flow_144: + return newstruct cs2func_script_2787_struct(95, 4592, "Members: Vengeance Group" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook can now cast " + "" + "Vengeance Group" + "" + " (unlocked at the Livid Farm)."); + flow_145: + return newstruct cs2func_script_2787_struct(95, 566, "Members: Heal Group", "Members using the Lunar spellbook can now cast " + "" + "Heal Group" + "" + "."); + flow_146: + return newstruct cs2func_script_2787_struct(96, 582, "Members: Spellbook Swap" + "
" + " (after Dream Mentor)", "Members using the Lunar spellbook now have the Magic level required to cast " + "" + "Spellbook Swap" + "" + " (after Dream Mentor)."); + flow_147: + return newstruct cs2func_script_2787_struct(99, 7687, "Members: Borrowed Power" + "
" + " (unlocked at the Livid Farm)", "Members using the Lunar spellbook can now cast " + "" + "Borrowed Power" + "" + ". (unlocked at the Livid Farm)."); + } + return newstruct cs2func_script_2787_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/2788.cs2 b/dumps/scripts/2788.cs2 new file mode 100644 index 000000000..1345422a5 --- /dev/null +++ b/dumps/scripts/2788.cs2 @@ -0,0 +1,107 @@ +cs2func_script_2788_struct(2,2,0) script_2788(int arg0,int arg1) { + switch (arg1) { + case 0: + return newstruct cs2func_script_2788_struct(-1, 2287, "You can see what each prayer does by selecting the Prayer icon on your side interface. Move your mouse over the icon of the prayer you want and a description will be available.", ""); + case 1: + return newstruct cs2func_script_2788_struct(1, getOtherCommonData(660, 735), "Thick Skin", "You can now use the " + "" + "Thick Skin" + "" + " prayer."); + case 2: + return newstruct cs2func_script_2788_struct(4, getOtherCommonData(661, 735), "Burst of Strength", "You can now use the " + "" + "Burst of Strength" + "" + " prayer."); + case 3: + return newstruct cs2func_script_2788_struct(7, getOtherCommonData(662, 735), "Clarity of Thought", "You can now use the " + "" + "Clarity of Thought" + "" + " prayer."); + case 4: + return newstruct cs2func_script_2788_struct(8, getOtherCommonData(678, 735), "Sharp Eye", "You can now use the " + "" + "Sharp Eye" + "" + " prayer."); + case 5: + return newstruct cs2func_script_2788_struct(9, getOtherCommonData(679, 735), "Mystic Will", "You can now use the " + "" + "Mystic Will" + "" + " prayer."); + case 6: + return newstruct cs2func_script_2788_struct(10, getOtherCommonData(663, 735), "Rock Skin", "You can now use the " + "" + "Rock Skin" + "" + " prayer."); + case 7: + return newstruct cs2func_script_2788_struct(13, getOtherCommonData(664, 735), "Superhuman Strength", "You can now use the " + "" + "Superhuman Strength" + "" + " prayer."); + case 8: + return newstruct cs2func_script_2788_struct(16, getOtherCommonData(665, 735), "Improved Reflexes", "You can now use the " + "" + "Improved Reflexes" + "" + " prayer."); + case 9: + return newstruct cs2func_script_2788_struct(19, getOtherCommonData(666, 735), "Rapid Restore", "You can now use the " + "" + "Rapid Restore" + "" + " prayer."); + case 10: + return newstruct cs2func_script_2788_struct(22, getOtherCommonData(667, 735), "Rapid Heal", "You can now use the " + "" + "Rapid Heal" + "" + " prayer."); + case 11: + return newstruct cs2func_script_2788_struct(25, getOtherCommonData(668, 735), "Protect Item", "You can now use the " + "" + "Protect Item" + "" + " prayer."); + case 12: + return newstruct cs2func_script_2788_struct(26, getOtherCommonData(680, 735), "Hawk Eye", "You can now use the " + "" + "Hawk Eye" + "" + " prayer."); + case 13: + return newstruct cs2func_script_2788_struct(27, getOtherCommonData(681, 735), "Mystic Lore", "You can now use the " + "" + "Mystic Lore" + "" + " prayer."); + case 14: + return newstruct cs2func_script_2788_struct(28, getOtherCommonData(669, 735), "Steel Skin", "You can now use the " + "" + "Steel Skin" + "" + " prayer."); + case 15: + return newstruct cs2func_script_2788_struct(31, getOtherCommonData(670, 735), "Ultimate Strength", "You can now use the " + "" + "Ultimate Strength" + "" + " prayer."); + case 16: + return newstruct cs2func_script_2788_struct(34, getOtherCommonData(671, 735), "Incredible Reflexes", "You can now use the " + "" + "Incredible Reflexes" + "" + " prayer."); + case 17: + return newstruct cs2func_script_2788_struct(35, getOtherCommonData(684, 735), "Members: Protect from Summoning", "Members can now use the " + "" + "Protect from Summoning" + "" + " prayer."); + case 18: + return newstruct cs2func_script_2788_struct(37, getOtherCommonData(672, 735), "Protect from Magic", "You can now use the " + "" + "Protect from Magic" + "" + " prayer."); + case 19: + return newstruct cs2func_script_2788_struct(40, getOtherCommonData(673, 735), "Protect from Missiles", "You can now use the " + "" + "Protect from Missiles" + "" + " prayer."); + case 20: + return newstruct cs2func_script_2788_struct(43, getOtherCommonData(674, 735), "Protect from Melee", "You can now use the " + "" + "Protect from Melee" + "" + " prayer."); + case 21: + return newstruct cs2func_script_2788_struct(44, getOtherCommonData(682, 735), "Eagle Eye", "You can now use the " + "" + "Eagle Eye" + "" + " prayer."); + case 22: + return newstruct cs2func_script_2788_struct(45, getOtherCommonData(683, 735), "Mystic Might", "You can now use the " + "" + "Mystic Might" + "" + " prayer."); + case 23: + return newstruct cs2func_script_2788_struct(46, getOtherCommonData(675, 735), "Members: Retribution", "Members can now use the " + "" + "Retribution" + "" + " prayer."); + case 24: + return newstruct cs2func_script_2788_struct(49, getOtherCommonData(676, 735), "Members: Redemption", "Members can now use the " + "" + "Redemption" + "" + " prayer."); + case 25: + return newstruct cs2func_script_2788_struct(50, getOtherCommonData(888, 735), "Members: Protect Item (curse)", "Members can now use the " + "" + "Protect Item" + "" + " curse (after The Temple at Senntisten)."); + case 26: + return newstruct cs2func_script_2788_struct(50, getOtherCommonData(889, 735), "Members: Sap Warrior", "Members can now use the " + "" + "Sap Warrior" + "" + " curse (after The Temple at Senntisten)."); + case 27: + return newstruct cs2func_script_2788_struct(52, getOtherCommonData(677, 735), "Members: Smite", "Members can now use the " + "" + "Smite" + "" + " prayer."); + case 28: + return newstruct cs2func_script_2788_struct(52, getOtherCommonData(890, 735), "Members: Sap Ranger", "Members can now use the " + "" + "Sap Ranger" + "" + " curse (after The Temple at Senntisten)."); + case 29: + return newstruct cs2func_script_2788_struct(54, getOtherCommonData(891, 735), "Members: Sap Mage", "Members can now use the " + "" + "Sap Mage" + "" + " curse (after The Temple at Senntisten)."); + case 30: + return newstruct cs2func_script_2788_struct(56, getOtherCommonData(892, 735), "Members: Sap Spirit", "Members can now use the " + "" + "Sap Spirit" + "" + " curse (after The Temple at Senntisten)."); + case 31: + return newstruct cs2func_script_2788_struct(59, getOtherCommonData(893, 735), "Members: Berserker", "Members can now use the " + "" + "Berserker" + "" + " curse (after The Temple at Senntisten)."); + case 32: + return newstruct cs2func_script_2788_struct(60, getOtherCommonData(685, 735), "Members: Chivalry" + "
" + " (after King's Ransom)", "Members now have the Prayer level required to use the " + "" + "Chivalry" + "" + " prayer (after King's Ransom)."); + case 33: + return newstruct cs2func_script_2788_struct(62, getOtherCommonData(894, 735), "Members: Deflect Summoning", "Members can now use the " + "" + "Deflect Summoning" + "" + " curse (after The Temple at Senntisten)."); + case 34: + return newstruct cs2func_script_2788_struct(65, getOtherCommonData(895, 735), "Members: Deflect Magic", "Members can now use the " + "" + "Deflect Magic" + "" + " curse (after The Temple at Senntisten)."); + case 35: + return newstruct cs2func_script_2788_struct(65, getOtherCommonData(1005, 735), "Members: Rapid Renewal" + "
" + " (with 65 Dungeoneering)", "Members can now use the " + "" + "Rapid Renewal" + "" + " prayer (bought from Daemonheim). (They also need level 65 Dungeoneering.)"); + case 36: + return newstruct cs2func_script_2788_struct(68, getOtherCommonData(896, 735), "Members: Deflect Missiles", "Members can now use the " + "" + "Deflect Missiles" + "" + " curse (after The Temple at Senntisten)."); + case 37: + return newstruct cs2func_script_2788_struct(70, getOtherCommonData(686, 735), "Members: Piety" + "
" + " (after King's Ransom)", "Members now have the Prayer level required to use the " + "" + "Piety" + "" + " prayer (after King's Ransom)."); + case 38: + return newstruct cs2func_script_2788_struct(71, getOtherCommonData(897, 735), "Members: Deflect Melee", "Members can now use the " + "" + "Deflect Melee" + "" + " curse (after The Temple at Senntisten)."); + case 39: + return newstruct cs2func_script_2788_struct(74, getOtherCommonData(1029, 735), "Members: Rigour" + "
" + " (with 74 Dungeoneering)", "Members can now use the " + "" + "Rigour" + "" + " prayer (bought from Daemonheim). (They also need level 74 Dungeoneering.)"); + case 40: + return newstruct cs2func_script_2788_struct(74, getOtherCommonData(898, 735), "Members: Leech Attack", "Members can now use the " + "" + "Leech Attack" + "" + " curse (after The Temple at Senntisten)."); + case 41: + return newstruct cs2func_script_2788_struct(76, getOtherCommonData(899, 735), "Members: Leech Ranged", "Members can now use the " + "" + "Leech Ranged" + "" + " curse (after The Temple at Senntisten)."); + case 42: + return newstruct cs2func_script_2788_struct(77, getOtherCommonData(1006, 735), "Members: Augury" + "
" + " (with 77 Dungeoneering)", "Members can now use the " + "" + "Augury" + "" + " prayer (bought from Daemonheim). (They also need level 77 Dungeoneering.)"); + case 43: + return newstruct cs2func_script_2788_struct(78, getOtherCommonData(900, 735), "Members: Leech Magic", "Members can now use the " + "" + "Leech Magic" + "" + " curse (after The Temple at Senntisten)."); + case 44: + return newstruct cs2func_script_2788_struct(80, getOtherCommonData(901, 735), "Members: Leech Defence", "Members can now use the " + "" + "Leech Defence" + "" + " curse (after The Temple at Senntisten)."); + case 45: + return newstruct cs2func_script_2788_struct(82, getOtherCommonData(902, 735), "Members: Leech Strength", "Members can now use the " + "" + "Leech Strength" + "" + " curse (after The Temple at Senntisten)."); + case 46: + return newstruct cs2func_script_2788_struct(84, getOtherCommonData(903, 735), "Members: Leech Energy", "Members can now use the " + "" + "Leech Energy" + "" + " curse (after The Temple at Senntisten)."); + case 47: + return newstruct cs2func_script_2788_struct(86, getOtherCommonData(904, 735), "Members: Leech Special Attack", "Members can now use the " + "" + "Leech Special Attack" + "" + " curse (after The Temple at Senntisten)."); + case 48: + return newstruct cs2func_script_2788_struct(89, getOtherCommonData(905, 735), "Members: Wrath", "Members can now use the " + "" + "Wrath" + "" + " curse (after The Temple at Senntisten)."); + case 49: + return newstruct cs2func_script_2788_struct(92, getOtherCommonData(906, 735), "Members: Soul Split", "Members can now use the " + "" + "Soul Split" + "" + " curse (after The Temple at Senntisten)."); + case 50: + return newstruct cs2func_script_2788_struct(95, getOtherCommonData(907, 735), "Members: Turmoil", "Members can now use the " + "" + "Turmoil" + "" + " curse (after The Temple at Senntisten)."); + } + return newstruct cs2func_script_2788_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/2789.cs2 b/dumps/scripts/2789.cs2 new file mode 100644 index 000000000..59e96e1fd --- /dev/null +++ b/dumps/scripts/2789.cs2 @@ -0,0 +1,4 @@ +void script_2789() { + script_2790(); + return; +} diff --git a/dumps/scripts/279.cs2 b/dumps/scripts/279.cs2 new file mode 100644 index 000000000..fea2616f7 --- /dev/null +++ b/dumps/scripts/279.cs2 @@ -0,0 +1,20 @@ +void script_279(int arg0,int arg1) { + string svar0; + svar0 = ""; + switch (arg0) { + case 1: + svar0 = "Found the perfect tackle for three species."; + break; + case 2: + svar0 = "Found the perfect tackle for all six species."; + break; + case 3: + svar0 = "Achieved an average rating of at least 80%."; + break; + case 4: + svar0 = "At least 80% of fish caught were the heaviest species."; + } + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(922,57), svar0, 25, 128, "IIsii", new WidgetPointer(arg1)); + setScriptCallOnMouseExit(40, new WidgetPointer(922,57), "I", new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/2790.cs2 b/dumps/scripts/2790.cs2 new file mode 100644 index 000000000..ec47b6fbe --- /dev/null +++ b/dumps/scripts/2790.cs2 @@ -0,0 +1,177 @@ +void script_2790() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + string svar0; + int stack_dump0; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + if (IsFemale()) { + stack_dump0 = 2341; + ivar2 = 7; + ivar0 = stack_dump0; + ivar3 = globalint_1008; + } else if (((boolean)globalint_774)) { + setWidgetSprite(1056, new WidgetPointer(309,6)); + setWidgetSprite(1047, new WidgetPointer(309,7)); + stack_dump0 = 703; + ivar2 = 1; + ivar0 = stack_dump0; + ivar1 = 2340; + ivar3 = globalint_1009; + } else { + setWidgetSprite(1048, new WidgetPointer(309,6)); + setWidgetSprite(1055, new WidgetPointer(309,7)); + stack_dump0 = 2338; + ivar2 = 0; + ivar0 = stack_dump0; + ivar3 = globalint_1008; + } + deleteAllExtraChilds(new WidgetPointer(309,10)); + ivar4 = 0; + ivar5 = getCommonDefinitionSize(ivar0); + ivar6 = -1; + ivar7 = -1; + svar0 = ""; + ivar8 = 0; + ivar9 = 0; + while (ivar4 < ivar5) { + if (ivar1 == -1) { + ivar6 = cs2method_3408(105, 74, ivar0, ivar4); + ivar7 = getOtherCommonData(ivar6, 788); + svar0 = getOtherCommonData(ivar6, 792); + } else { + ivar7 = cs2method_3408(105, 75, ivar0, ivar4); + svar0 = cs2method_3408(105, 115, ivar1, ivar4); + } + createExtraChild(new WidgetPointer(309,10), 5, getExtraChildGap(new WidgetPointer(309,10))); + setWidgetSize(17, 17, 0, 0); + setWidgetPosition(0, add(ivar8, 1), 0, 0); + createExtraChild(new WidgetPointer(309,10), 4, getExtraChildGap(new WidgetPointer(309,10))); + setWidgetSize(20, 19, 1, 0); + setWidgetPosition(0, ivar8, 2, 0); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetFont(495); + setWidgetText(svar0); + if (ivar7 == ivar3) { + setWidgetSprite(699); + ivar9 = ivar8; + } else { + setWidgetSprite(697); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16750623, "Iii"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16750623, "Iii"); + setWidgetContextMenuOption(1, svar0); + setWidgetContextMenuOption(1, svar0); + setScriptCallOnClickContextMenu(2831, -2147483644, ivar7, ivar2, "iKi"); + setScriptCallOnClickContextMenu(2831, -2147483644, ivar7, ivar2, "iKi"); + } + ivar4 = add(ivar4, 1); + ivar8 = add(ivar8, 19); + } + if (ivar8 > getWidgetActualHeight(new WidgetPointer(309,10))) { + setWidgetSize(20, 4, 1, 1, new WidgetPointer(309,10)); + setWidgetScrollMax(0, ivar8, new WidgetPointer(309,10)); + if (ivar9 < cs2method2601(new WidgetPointer(309,10))) { + cs2method2100(0, subtract(ivar9, 5), new WidgetPointer(309,10)); + } else { + if (add(ivar9, 19) >= add(cs2method2601(new WidgetPointer(309,10)), getWidgetActualHeight(new WidgetPointer(309,10)))) { + cs2method2100(0, subtract(add(ivar9, 25), getWidgetActualHeight(new WidgetPointer(309,10))), new WidgetPointer(309,10)); + } + } + setWidgetIsHidden(false, new WidgetPointer(309,11)); + script_31(20250635, 20250634, 792, 789, 790, 791, 773, 788); + } else { + setWidgetSize(4, 4, 1, 1, new WidgetPointer(309,10)); + setWidgetScrollMax(0, 0, new WidgetPointer(309,10)); + cs2method2100(0, 0, new WidgetPointer(309,10)); + deleteAllExtraChilds(new WidgetPointer(309,11)); + setWidgetIsHidden(true, new WidgetPointer(309,11)); + } + deleteAllExtraChilds(new WidgetPointer(309,16)); + ivar5 = getCommonDefinitionSize(2345); + ivar10 = 5; + ivar11 = 0; + if (multiply(add(divide(subtract(ivar5, 1), ivar10), 1), 21) > getWidgetActualHeight(new WidgetPointer(309,16))) { + stack_dump0 = 4; + ivar11 = 2; + ivar10 = stack_dump0; + } + ivar4 = 0; + ivar8 = 0; + ivar12 = 0; + ivar13 = -1; + ivar14 = 0; + while (ivar4 < ivar5) { + ivar14 = cs2method_3408(105, 105, 2345, ivar4); + svar0 = cs2method_3408(105, 115, 2344, ivar4); + createExtraChild(new WidgetPointer(309,16), 3, getExtraChildGap(new WidgetPointer(309,16))); + setWidgetSize(21, 21, 0, 0); + setWidgetFilled(1); + setWidgetPosition(add(multiply(ivar12, getWidgetActualWidth()), ivar11), ivar8, 0, 0); + setWidgetRGB(new Color(cs2method_3408(105, 105, 2343, ivar4))); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(309,22), svar0, 0, 512, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(309,22), "I"); + createExtraChild(new WidgetPointer(309,16), 5, getExtraChildGap(new WidgetPointer(309,16))); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + if (ivar14 == globalint_1015) { + setWidgetSprite(1043); + ivar9 = ivar8; + } else { + ivar13 = 1041; + setWidgetSprite(ivar13); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar13, "Iid"); + ivar13 = 1042; + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar13, "Iid"); + setWidgetContextMenuOption(1, svar0); + setScriptCallOnClickContextMenu(2832, -2147483644, ivar14, "ii"); + } + ivar4 = add(ivar4, 1); + if (ivar12 < subtract(ivar10, 1)) { + ivar12 = add(ivar12, 1); + } else { + ivar12 = 0; + ivar8 = add(ivar8, getWidgetActualHeight()); + } + } + if (ivar12 != 0) { + ivar8 = add(ivar8, 21); + } + if ((ivar8 > getWidgetActualHeight(new WidgetPointer(309,16))) || (ivar10 < 5)) { + setWidgetSize(20, 4, 1, 1, new WidgetPointer(309,16)); + setWidgetScrollMax(0, ivar8, new WidgetPointer(309,16)); + if (ivar9 < cs2method2601(new WidgetPointer(309,16))) { + cs2method2100(0, subtract(ivar9, 5), new WidgetPointer(309,16)); + } else { + if (add(ivar9, 21) >= add(cs2method2601(new WidgetPointer(309,16)), getWidgetActualHeight(new WidgetPointer(309,16)))) { + cs2method2100(0, subtract(add(ivar9, 25), getWidgetActualHeight(new WidgetPointer(309,16))), new WidgetPointer(309,16)); + } + } + setWidgetIsHidden(false, new WidgetPointer(309,17)); + script_31(20250641, 20250640, 792, 789, 790, 791, 773, 788); + } else { + setWidgetSize(4, 4, 1, 1, new WidgetPointer(309,16)); + setWidgetScrollMax(0, 0, new WidgetPointer(309,16)); + cs2method2100(0, 0, new WidgetPointer(309,16)); + deleteAllExtraChilds(new WidgetPointer(309,17)); + setWidgetIsHidden(true, new WidgetPointer(309,17)); + } + return; +} diff --git a/dumps/scripts/2791.cs2 b/dumps/scripts/2791.cs2 new file mode 100644 index 000000000..0cc0bca8a --- /dev/null +++ b/dumps/scripts/2791.cs2 @@ -0,0 +1,104 @@ +cs2func_script_2791_struct(4,1,0) script_2791(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 938); + svar0 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 935); + ivar2 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 939); + ivar3 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 937); + ivar4 = 1; + ivar5 = 0; + if (((boolean)getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 940))) { + switch (arg0) { + case 0: + if (getSkillActualLvl(7) < 40) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } + break; + case 1: + if (bitconfig_1527 < 160) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } + break; + case 2: + if (standart_config_359 < 100) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } + break; + case 3: + if (bitconfig_5491 > 370) { + ivar5 = 1; + } + break; + case 5: + if (bitconfig_418 < 26) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } + break; + case 6: + if (((boolean)bitconfig_5525)) { + ivar5 = 1; + } + break; + case 7: + if (bitconfig_5491 > 370) { + ivar5 = 1; + } + break; + case 9: + if (getSkillActualLvl(10) < 15) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } + break; + case 11: + if ((bitconfig_3618 < 16) || ((boolean)bitconfig_5550)) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } + break; + case 12: + if (bitconfig_3293 < 135) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } else { + if (bitconfig_6180 == 140) { + ivar5 = 1; + } + } + break; + case 17: + if (bitconfig_3618 < 28) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } + break; + case 14: + if (standart_config_492 < 4) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } + break; + case 16: + if (bitconfig_9067 < 8) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 936); + ivar4 = 0; + } + } + if (((boolean)ivar5)) { + ivar1 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 942); + ivar4 = 1; + svar0 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 941); + ivar3 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 943); + ivar2 = getOtherCommonData(cs2method_3408(105, 74, 869, arg0), 944); + } + } + return newstruct cs2func_script_2791_struct(ivar1, ivar4, ivar3, ivar2, svar0); +} diff --git a/dumps/scripts/2792.cs2 b/dumps/scripts/2792.cs2 new file mode 100644 index 000000000..5d86560b7 --- /dev/null +++ b/dumps/scripts/2792.cs2 @@ -0,0 +1,4 @@ +void script_2792() { + script_2801(5832706, 3, 0); + return; +} diff --git a/dumps/scripts/2793.cs2 b/dumps/scripts/2793.cs2 new file mode 100644 index 000000000..63cca082a --- /dev/null +++ b/dumps/scripts/2793.cs2 @@ -0,0 +1,4 @@ +void script_2793() { + script_2801(5832706, 3, 0); + return; +} diff --git a/dumps/scripts/2794.cs2 b/dumps/scripts/2794.cs2 new file mode 100644 index 000000000..35451df0f --- /dev/null +++ b/dumps/scripts/2794.cs2 @@ -0,0 +1,4 @@ +void script_2794() { + script_2801(5832706, -3, 0); + return; +} diff --git a/dumps/scripts/2795.cs2 b/dumps/scripts/2795.cs2 new file mode 100644 index 000000000..dfb197148 --- /dev/null +++ b/dumps/scripts/2795.cs2 @@ -0,0 +1,4 @@ +void script_2795() { + script_2801(5832706, -3, 0); + return; +} diff --git a/dumps/scripts/2796.cs2 b/dumps/scripts/2796.cs2 new file mode 100644 index 000000000..818ef88ab --- /dev/null +++ b/dumps/scripts/2796.cs2 @@ -0,0 +1,4 @@ +void script_2796() { + script_2801(5832706, 2, 0); + return; +} diff --git a/dumps/scripts/2797.cs2 b/dumps/scripts/2797.cs2 new file mode 100644 index 000000000..74630d91a --- /dev/null +++ b/dumps/scripts/2797.cs2 @@ -0,0 +1,4 @@ +void script_2797() { + script_2801(5832706, 2, 0); + return; +} diff --git a/dumps/scripts/2798.cs2 b/dumps/scripts/2798.cs2 new file mode 100644 index 000000000..e7ec70992 --- /dev/null +++ b/dumps/scripts/2798.cs2 @@ -0,0 +1,4 @@ +void script_2798() { + script_2801(5832706, -2, 0); + return; +} diff --git a/dumps/scripts/2799.cs2 b/dumps/scripts/2799.cs2 new file mode 100644 index 000000000..9a6de43f4 --- /dev/null +++ b/dumps/scripts/2799.cs2 @@ -0,0 +1,4 @@ +void script_2799() { + script_2801(5832706, -2, 0); + return; +} diff --git a/dumps/scripts/28.cs2 b/dumps/scripts/28.cs2 new file mode 100644 index 000000000..dcea66de9 --- /dev/null +++ b/dumps/scripts/28.cs2 @@ -0,0 +1,4 @@ +void script_28(int arg0) { + script_48(); + return; +} diff --git a/dumps/scripts/280.cs2 b/dumps/scripts/280.cs2 new file mode 100644 index 000000000..e33fae89b --- /dev/null +++ b/dumps/scripts/280.cs2 @@ -0,0 +1,6 @@ +void script_280() { + setScriptCallOnGlobalConfigChange(281, 1118, 1119, 1120, 1121, 4, "Y", new WidgetPointer(925,0)); + setScriptCallOnConfigChange(281, 1660, 1661, 2, "Y", new WidgetPointer(925,0)); + setWidgetText(new WidgetPointer(925,78), intToStr(bitconfig_7285)); + return; +} diff --git a/dumps/scripts/2800.cs2 b/dumps/scripts/2800.cs2 new file mode 100644 index 000000000..73fc45a53 --- /dev/null +++ b/dumps/scripts/2800.cs2 @@ -0,0 +1,4 @@ +void script_2800(int arg0,int arg1,int arg2) { + script_2801(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/2801.cs2 b/dumps/scripts/2801.cs2 new file mode 100644 index 000000000..5b35a5176 --- /dev/null +++ b/dumps/scripts/2801.cs2 @@ -0,0 +1,10 @@ +void script_2801(int arg0,int arg1,int arg2) { + setWidgetRGB(new Color(arg2), new WidgetPointer(arg0)); + if (arg1 > 0) { + cs2method2103(0, new WidgetPointer(arg0)); + } else { + cs2method2103(255, new WidgetPointer(arg0)); + } + setScriptCallOnGameloop(2802, arg1, new WidgetPointer(arg0), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2802.cs2 b/dumps/scripts/2802.cs2 new file mode 100644 index 000000000..0e89873c6 --- /dev/null +++ b/dumps/scripts/2802.cs2 @@ -0,0 +1,11 @@ +void script_2802(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = getWidgetShadeColor(new WidgetPointer(arg1)); + ivar3 = min(max(add(ivar2, arg0), 0), 255); + cs2method2103(ivar3, new WidgetPointer(arg1)); + if (((boolean)ivar3) || (ivar3 == 255)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2803.cs2 b/dumps/scripts/2803.cs2 new file mode 100644 index 000000000..dc2bc415a --- /dev/null +++ b/dumps/scripts/2803.cs2 @@ -0,0 +1,4 @@ +void script_2803(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_2804(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/2804.cs2 b/dumps/scripts/2804.cs2 new file mode 100644 index 000000000..a538ce6ec --- /dev/null +++ b/dumps/scripts/2804.cs2 @@ -0,0 +1,6 @@ +void script_2804(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetRGB(new Color(arg5), new WidgetPointer(arg0)); + cs2method2103(arg4, new WidgetPointer(arg0)); + setScriptCallOnGameloop(2805, new WidgetPointer(arg0), subtract(0, arg2), arg1, arg3, arg4, "Iiiii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2805.cs2 b/dumps/scripts/2805.cs2 new file mode 100644 index 000000000..baf402d85 --- /dev/null +++ b/dumps/scripts/2805.cs2 @@ -0,0 +1,11 @@ +void script_2805(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + ivar5 = getWidgetShadeColor(new WidgetPointer(arg0)); + ivar6 = min(max(add(ivar5, arg1), arg3), arg4); + if ((ivar6 == arg3) || (ivar6 == arg4)) { + setScriptCallOnGameloop(2805, new WidgetPointer(arg0), arg2, arg1, arg3, arg4, "Iiiii", new WidgetPointer(arg0)); + } + cs2method2103(ivar6, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2806.cs2 b/dumps/scripts/2806.cs2 new file mode 100644 index 000000000..77543a809 --- /dev/null +++ b/dumps/scripts/2806.cs2 @@ -0,0 +1,4 @@ +void script_2806() { + script_2807(5832705); + return; +} diff --git a/dumps/scripts/2807.cs2 b/dumps/scripts/2807.cs2 new file mode 100644 index 000000000..26a37c735 --- /dev/null +++ b/dumps/scripts/2807.cs2 @@ -0,0 +1,5 @@ +void script_2807(int arg0) { + cs2method2103(255, new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2808.cs2 b/dumps/scripts/2808.cs2 new file mode 100644 index 000000000..ee2516bf2 --- /dev/null +++ b/dumps/scripts/2808.cs2 @@ -0,0 +1,9 @@ +int script_2808(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + ivar3 = addToCoordinate(0, multiply(8, divide(extractX(arg1), 8)), extractZ(arg1), multiply(8, divide(extractY(arg1), 8))); + ivar4 = subtract(extractX(arg2), extractX(ivar3)); + ivar5 = subtract(extractY(arg2), extractY(ivar3)); + return addToCoordinate(arg0, ivar4, 0, ivar5); +} diff --git a/dumps/scripts/2809.cs2 b/dumps/scripts/2809.cs2 new file mode 100644 index 000000000..169720a1d --- /dev/null +++ b/dumps/scripts/2809.cs2 @@ -0,0 +1,4 @@ +void script_2809(int arg0) { + script_2797(); + return; +} diff --git a/dumps/scripts/281.cs2 b/dumps/scripts/281.cs2 new file mode 100644 index 000000000..cf6cc63c9 --- /dev/null +++ b/dumps/scripts/281.cs2 @@ -0,0 +1,108 @@ +void script_281() { + setItemOnWidgetMethod2200(globalint_1118, globalint_1119, new WidgetPointer(925,67)); + cs2method2305(new WidgetPointer(925,67), getItemName(globalint_1118)); + setItemOnWidgetMethod2200(globalint_1120, globalint_1121, new WidgetPointer(925,68)); + cs2method2305(new WidgetPointer(925,68), getItemName(globalint_1120)); + setWidgetText(new WidgetPointer(925,77), intToStr(bitconfig_7295)); + switch (globalint_1118) { + case 384: + setWidgetText(new WidgetPointer(925,52), "Shark"); + break; + case 372: + setWidgetText(new WidgetPointer(925,52), "Swordfish"); + break; + case 378: + setWidgetText(new WidgetPointer(925,52), "Lobster"); + break; + case 360: + setWidgetText(new WidgetPointer(925,52), "Tuna"); + break; + case 332: + setWidgetText(new WidgetPointer(925,52), "Salmon"); + break; + case 350: + setWidgetText(new WidgetPointer(925,52), "Pike"); + break; + case 336: + setWidgetText(new WidgetPointer(925,52), "Trout"); + break; + case 346: + setWidgetText(new WidgetPointer(925,52), "Herring"); + break; + case 328: + setWidgetText(new WidgetPointer(925,52), "Sardine"); + break; + case 318: + setWidgetText(new WidgetPointer(925,52), "Shrimp"); + break; + default: + setWidgetText(new WidgetPointer(925,52), ""); + } + switch (globalint_1120) { + case 384: + setWidgetText(new WidgetPointer(925,53), "Shark"); + break; + case 372: + setWidgetText(new WidgetPointer(925,53), "Swordfish"); + break; + case 378: + setWidgetText(new WidgetPointer(925,53), "Lobster"); + break; + case 360: + setWidgetText(new WidgetPointer(925,53), "Tuna"); + break; + case 332: + setWidgetText(new WidgetPointer(925,53), "Salmon"); + break; + case 350: + setWidgetText(new WidgetPointer(925,53), "Pike"); + break; + case 336: + setWidgetText(new WidgetPointer(925,53), "Trout"); + break; + case 346: + setWidgetText(new WidgetPointer(925,53), "Herring"); + break; + case 328: + setWidgetText(new WidgetPointer(925,53), "Sardine"); + break; + case 318: + setWidgetText(new WidgetPointer(925,53), "Shrimp"); + break; + default: + setWidgetText(new WidgetPointer(925,53), ""); + } + switch (bitconfig_7306) { + case 0: + setWidgetText(new WidgetPointer(925,25), "Cost: " + intToStr(110) + " tokens"); + setWidgetText(new WidgetPointer(925,26), "(Requires " + intToStr(20) + " medals)"); + setItemOnWidgetMethod2200(15666, -1, new WidgetPointer(925,41)); + break; + case 1: + setWidgetText(new WidgetPointer(925,25), "Cost: " + intToStr(230) + " tokens"); + setWidgetText(new WidgetPointer(925,26), "(Requires " + intToStr(50) + " medals)"); + setItemOnWidgetMethod2200(15667, -1, new WidgetPointer(925,41)); + break; + case 2: + setWidgetText(new WidgetPointer(925,25), "Cost: " + intToStr(470) + " tokens"); + setWidgetText(new WidgetPointer(925,26), "(Requires " + intToStr(110) + " medals)"); + setItemOnWidgetMethod2200(15668, -1, new WidgetPointer(925,41)); + break; + case 3: + setWidgetText(new WidgetPointer(925,25), "Cost: " + intToStr(900) + " tokens"); + setWidgetText(new WidgetPointer(925,26), "(Requires " + intToStr(230) + " medals)"); + setItemOnWidgetMethod2200(15669, -1, new WidgetPointer(925,41)); + break; + case 4: + setWidgetText(new WidgetPointer(925,25), "Cost: " + intToStr(1860) + " tokens"); + setWidgetText(new WidgetPointer(925,26), "(Requires " + intToStr(500) + " medals)"); + setItemOnWidgetMethod2200(15669, -1, new WidgetPointer(925,41)); + break; + case 5: + setWidgetText(new WidgetPointer(925,25), "You already own the best tackle box available."); + setWidgetText(new WidgetPointer(925,26), "(Unavailable)"); + setItemOnWidgetMethod2200(-1, -1, new WidgetPointer(925,41)); + } + setWidget3DRotation(0, 0, 250, 1666, 0, 1440, new WidgetPointer(925,41)); + return; +} diff --git a/dumps/scripts/2810.cs2 b/dumps/scripts/2810.cs2 new file mode 100644 index 000000000..493cca4f6 --- /dev/null +++ b/dumps/scripts/2810.cs2 @@ -0,0 +1,4 @@ +void script_2810(int arg0) { + script_2797(); + return; +} diff --git a/dumps/scripts/2811.cs2 b/dumps/scripts/2811.cs2 new file mode 100644 index 000000000..58833d85e --- /dev/null +++ b/dumps/scripts/2811.cs2 @@ -0,0 +1,4 @@ +void script_2811(int arg0) { + script_2804(arg0, 1, 1, 225, 255, 16777147); + return; +} diff --git a/dumps/scripts/2812.cs2 b/dumps/scripts/2812.cs2 new file mode 100644 index 000000000..8bca9e572 --- /dev/null +++ b/dumps/scripts/2812.cs2 @@ -0,0 +1,11 @@ +void script_2812(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = getWidgetShadeColor(new WidgetPointer(arg1)); + ivar3 = min(max(add(ivar2, multiply(arg0, 1)), 225), 255); + if ((ivar3 == 225) || (ivar3 == 255)) { + setScriptCallOnGameloop(2812, subtract(0, arg0), new WidgetPointer(arg1), "iI", new WidgetPointer(arg1)); + } + cs2method2103(ivar3, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/2813.cs2 b/dumps/scripts/2813.cs2 new file mode 100644 index 000000000..98649d0b7 --- /dev/null +++ b/dumps/scripts/2813.cs2 @@ -0,0 +1,4 @@ +void script_2813(int arg0) { + script_2807(arg0); + return; +} diff --git a/dumps/scripts/2814.cs2 b/dumps/scripts/2814.cs2 new file mode 100644 index 000000000..724575635 --- /dev/null +++ b/dumps/scripts/2814.cs2 @@ -0,0 +1,9 @@ +void script_2814() { + if (globalint_1065 != -1) { + script_2815(); + setScriptCallOnGlobalConfigChange(-1, "", new WidgetPointer(89,0)); + } else { + setScriptCallOnGlobalConfigChange(2814, 1065, 1, "Y", new WidgetPointer(89,0)); + } + return; +} diff --git a/dumps/scripts/2815.cs2 b/dumps/scripts/2815.cs2 new file mode 100644 index 000000000..d4c6dc39c --- /dev/null +++ b/dumps/scripts/2815.cs2 @@ -0,0 +1,19 @@ +void script_2815() { + cs2method5405(0, 4); + cs2method5405(1, 4); + cs2method5406(0, 0, script_2808(globalint_1065, 73750262, 74110714), 378, script_2808(globalint_1065, 73750262, 74077947), 378, 0); + cs2method5406(1, 0, script_2808(globalint_1065, 73750262, 74045178), 210, script_2808(globalint_1065, 73750262, 74028794), 210, 0); + cs2method5406(0, 1, script_2808(globalint_1065, 73750262, 74077946), 378, script_2808(globalint_1065, 73750262, 74061562), 378, 0); + cs2method5406(1, 1, script_2808(globalint_1065, 73750262, 74012410), 335, script_2808(globalint_1065, 73750262, 73996026), 325, 0); + cs2method5406(0, 2, script_2808(globalint_1065, 73750262, 74045176), 378, script_2808(globalint_1065, 73750262, 74045175), 378, 0); + cs2method5406(1, 2, script_2808(globalint_1065, 73750262, 73979640), 346, script_2808(globalint_1065, 73750262, 73979639), 346, 0); + cs2method5406(0, 3, script_2808(globalint_1065, 73750262, 73996016), 670, script_2808(globalint_1065, 73750262, 73963244), 785, 0); + cs2method5406(1, 3, script_2808(globalint_1065, 73750262, 73996022), 210, script_2808(globalint_1065, 73750262, 73996021), 210, 0); + globalint_1065 = -1; + globalint_1064 = 0; + globalint_1067 = 877; + script_2825(1); + script_2810(5832706); + setScriptCallOnMinimapRelatedSetting3(2824, 1, "i", new WidgetPointer(89,0)); + return; +} diff --git a/dumps/scripts/2816.cs2 b/dumps/scripts/2816.cs2 new file mode 100644 index 000000000..50555d8f3 --- /dev/null +++ b/dumps/scripts/2816.cs2 @@ -0,0 +1,9 @@ +void script_2816() { + if (globalint_1065 != -1) { + script_2817(); + setScriptCallOnGlobalConfigChange(-1, "", new WidgetPointer(89,0)); + } else { + setScriptCallOnGlobalConfigChange(2816, 1065, 1, "Y", new WidgetPointer(89,0)); + } + return; +} diff --git a/dumps/scripts/2817.cs2 b/dumps/scripts/2817.cs2 new file mode 100644 index 000000000..36b4c30ad --- /dev/null +++ b/dumps/scripts/2817.cs2 @@ -0,0 +1,27 @@ +void script_2817() { + cs2method5405(0, 8); + cs2method5405(1, 8); + cs2method5406(0, 0, script_2808(globalint_1065, 73750262, 73701111), 378, script_2808(globalint_1065, 73750262, 73717495), 378, 0); + cs2method5406(1, 0, script_2808(globalint_1065, 73750262, 73750263), 325, script_2808(globalint_1065, 73750262, 73766647), 295, 0); + cs2method5406(0, 1, script_2808(globalint_1065, 73750262, 73733879), 378, script_2808(globalint_1065, 73750262, 73750263), 378, 0); + cs2method5406(1, 1, script_2808(globalint_1065, 73750262, 73783031), 330, script_2808(globalint_1065, 73750262, 73799415), 335, 0); + cs2method5406(0, 2, script_2808(globalint_1065, 73750262, 73766647), 378, script_2808(globalint_1065, 73750262, 73783031), 378, 0); + cs2method5406(1, 2, script_2808(globalint_1065, 73750262, 73815799), 330, script_2808(globalint_1065, 73750262, 73832183), 350, 0); + cs2method5406(0, 3, script_2808(globalint_1065, 73750262, 73799415), 378, script_2808(globalint_1065, 73750262, 73815799), 378, 0); + cs2method5406(1, 3, script_2808(globalint_1065, 73750262, 73848567), 325, script_2808(globalint_1065, 73750262, 73864951), 305, 0); + cs2method5406(0, 4, script_2808(globalint_1065, 73750262, 73832183), 378, script_2808(globalint_1065, 73750262, 73848567), 378, 0); + cs2method5406(1, 4, script_2808(globalint_1065, 73750262, 73881335), 340, script_2808(globalint_1065, 73750262, 73897719), 325, 0); + cs2method5406(0, 5, script_2808(globalint_1065, 73750262, 73864950), 378, script_2808(globalint_1065, 73750262, 73881333), 378, 0); + cs2method5406(1, 5, script_2808(globalint_1065, 73750262, 73914103), 330, script_2808(globalint_1065, 73750262, 73930487), 340, 0); + cs2method5406(0, 6, script_2808(globalint_1065, 73750262, 73897717), 378, script_2808(globalint_1065, 73750262, 73914101), 378, 0); + cs2method5406(1, 6, script_2808(globalint_1065, 73750262, 73946871), 346, script_2808(globalint_1065, 73750262, 73963255), 346, 0); + cs2method5406(0, 7, script_2808(globalint_1065, 73750262, 73930485), 378, script_2808(globalint_1065, 73750262, 73946869), 378, 0); + cs2method5406(1, 7, script_2808(globalint_1065, 73750262, 73979639), 345, script_2808(globalint_1065, 73750262, 73996023), 355, 0); + globalint_1065 = -1; + globalint_1064 = 0; + globalint_1067 = 875; + script_2825(1); + script_2810(5832706); + setScriptCallOnMinimapRelatedSetting3(2824, 1, "i", new WidgetPointer(89,0)); + return; +} diff --git a/dumps/scripts/2818.cs2 b/dumps/scripts/2818.cs2 new file mode 100644 index 000000000..7c2e6548e --- /dev/null +++ b/dumps/scripts/2818.cs2 @@ -0,0 +1,9 @@ +void script_2818() { + if (globalint_1065 != -1) { + script_2819(); + setScriptCallOnGlobalConfigChange(-1, "", new WidgetPointer(89,0)); + } else { + setScriptCallOnGlobalConfigChange(2818, 1065, 1, "Y", new WidgetPointer(89,0)); + } + return; +} diff --git a/dumps/scripts/2819.cs2 b/dumps/scripts/2819.cs2 new file mode 100644 index 000000000..53702dda9 --- /dev/null +++ b/dumps/scripts/2819.cs2 @@ -0,0 +1,21 @@ +void script_2819() { + cs2method5405(0, 5); + cs2method5405(1, 5); + cs2method5406(0, 0, script_2808(globalint_1065, 9437888, 10207993), 378, script_2808(globalint_1065, 9437888, 10289912), 378, 0); + cs2method5406(1, 0, script_2808(globalint_1065, 9437888, 10191601), 210, script_2808(globalint_1065, 9437888, 10257133), 210, 0); + cs2method5406(0, 1, script_2808(globalint_1065, 9437888, 10371817), 378, script_2808(globalint_1065, 9437888, 10371810), 378, 0); + cs2method5406(1, 1, script_2808(globalint_1065, 9437888, 10240743), 210, script_2808(globalint_1065, 9437888, 10224357), 210, 0); + cs2method5406(0, 2, script_2808(globalint_1065, 9437888, 10240727), 378, script_2808(globalint_1065, 9437888, 10175188), 378, 0); + cs2method5406(1, 2, script_2808(globalint_1065, 9437888, 10109663), 210, script_2808(globalint_1065, 9437888, 10044126), 210, 0); + cs2method5406(0, 3, script_2808(globalint_1065, 9437888, 9994963), 435, script_2808(globalint_1065, 9437888, 9945813), 465, 0); + cs2method5406(1, 3, script_2808(globalint_1065, 9437888, 9945824), 210, script_2808(globalint_1065, 9437888, 9945824), 210, 0); + cs2method5406(0, 4, script_2808(globalint_1065, 9437888, 9945817), 545, script_2808(globalint_1065, 9437888, 9945818), 530, 0); + cs2method5406(1, 4, script_2808(globalint_1065, 9437888, 9945824), 210, script_2808(globalint_1065, 9437888, 9945824), 210, 0); + globalint_1065 = -1; + globalint_1064 = 0; + globalint_1067 = 876; + script_2825(1); + script_2810(5832706); + setScriptCallOnMinimapRelatedSetting3(2824, 1, "i", new WidgetPointer(89,0)); + return; +} diff --git a/dumps/scripts/282.cs2 b/dumps/scripts/282.cs2 new file mode 100644 index 000000000..2d39dcb76 --- /dev/null +++ b/dumps/scripts/282.cs2 @@ -0,0 +1,18 @@ +void script_282() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = multiplyDivide(standart_config_1380, 1000, 100); + ivar0 = cs2method_3408(105, 105, 706, ivar2); + ivar1 = cs2method_3408(105, 105, 707, ivar2); + setWidgetPosition(15, ivar0, 2, 0, new WidgetPointer(836,56)); + setWidgetSize(14, ivar1, 0, 0, new WidgetPointer(836,56)); + if (ivar2 < 25) { + setWidgetRGB(new Color(255, 150, 35), new WidgetPointer(836,56)); + } else { + setWidgetRGB(new Color(4, 131, 6), new WidgetPointer(836,56)); + } + return; +} diff --git a/dumps/scripts/2820.cs2 b/dumps/scripts/2820.cs2 new file mode 100644 index 000000000..7c318851d --- /dev/null +++ b/dumps/scripts/2820.cs2 @@ -0,0 +1,9 @@ +void script_2820() { + if (globalint_1065 != -1) { + script_2821(); + setScriptCallOnGlobalConfigChange(-1, "", new WidgetPointer(89,0)); + } else { + setScriptCallOnGlobalConfigChange(2820, 1065, 1, "Y", new WidgetPointer(89,0)); + } + return; +} diff --git a/dumps/scripts/2821.cs2 b/dumps/scripts/2821.cs2 new file mode 100644 index 000000000..8e2b288a2 --- /dev/null +++ b/dumps/scripts/2821.cs2 @@ -0,0 +1,17 @@ +void script_2821() { + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, script_2808(globalint_1065, 837292320, 32362799), 2385, script_2808(globalint_1065, 837292320, 32330031), 2370, 0); + cs2method5406(1, 0, script_2808(globalint_1065, 837292320, 32379191), 2265, script_2808(globalint_1065, 837292320, 32395576), 2260, 0); + cs2method5406(0, 1, script_2808(globalint_1065, 837292320, 32297264), 2420, script_2808(globalint_1065, 837292320, 32264497), 2355, 0); + cs2method5406(1, 1, script_2808(globalint_1065, 837292320, 32379193), 2285, script_2808(globalint_1065, 837292320, 32362809), 2235, 0); + cs2method5406(0, 2, script_2808(globalint_1065, 837292320, 32264499), 2395, script_2808(globalint_1065, 837292320, 32248117), 2380, 0); + cs2method5406(1, 2, script_2808(globalint_1065, 837292320, 32346424), 2270, script_2808(globalint_1065, 837292320, 32330040), 2250, 0); + globalint_1065 = -1; + globalint_1064 = 0; + globalint_1067 = 878; + script_2825(0); + script_2810(5832706); + setScriptCallOnMinimapRelatedSetting3(2824, 0, "i", new WidgetPointer(89,0)); + return; +} diff --git a/dumps/scripts/2822.cs2 b/dumps/scripts/2822.cs2 new file mode 100644 index 000000000..8684ff032 --- /dev/null +++ b/dumps/scripts/2822.cs2 @@ -0,0 +1,9 @@ +void script_2822() { + if (globalint_1065 != -1) { + script_2823(); + setScriptCallOnGlobalConfigChange(-1, "", new WidgetPointer(89,0)); + } else { + setScriptCallOnGlobalConfigChange(2822, 1065, 1, "Y", new WidgetPointer(89,0)); + } + return; +} diff --git a/dumps/scripts/2823.cs2 b/dumps/scripts/2823.cs2 new file mode 100644 index 000000000..4f3a5ce28 --- /dev/null +++ b/dumps/scripts/2823.cs2 @@ -0,0 +1,25 @@ +void script_2823() { + cs2method5405(0, 7); + cs2method5405(1, 7); + cs2method5406(0, 0, script_2808(globalint_1065, 40636184, 41029429), 378, script_2808(globalint_1065, 40636184, 41062196), 378, 0); + cs2method5406(1, 0, script_2808(globalint_1065, 40636184, 41127727), 210, script_2808(globalint_1065, 40636184, 41127728), 210, 0); + cs2method5406(0, 1, script_2808(globalint_1065, 40636184, 41062198), 378, script_2808(globalint_1065, 40636184, 41045814), 378, 0); + cs2method5406(1, 1, script_2808(globalint_1065, 40636184, 41144113), 210, script_2808(globalint_1065, 40636184, 41144114), 210, 0); + cs2method5406(0, 2, script_2808(globalint_1065, 40636184, 40996661), 378, script_2808(globalint_1065, 40636184, 40963893), 378, 0); + cs2method5406(1, 2, script_2808(globalint_1065, 40636184, 41160499), 210, script_2808(globalint_1065, 40636184, 41160500), 210, 0); + cs2method5406(0, 3, script_2808(globalint_1065, 40636184, 40931123), 378, script_2808(globalint_1065, 40636184, 40931121), 378, 0); + cs2method5406(1, 3, script_2808(globalint_1065, 40636184, 41160501), 210, script_2808(globalint_1065, 40636184, 41160502), 210, 0); + cs2method5406(0, 4, script_2808(globalint_1065, 40636184, 40963888), 378, script_2808(globalint_1065, 40636184, 40996655), 378, 0); + cs2method5406(1, 4, script_2808(globalint_1065, 40636184, 41160504), 210, script_2808(globalint_1065, 40636184, 41160505), 210, 0); + cs2method5406(0, 5, script_2808(globalint_1065, 40636184, 41062192), 378, script_2808(globalint_1065, 40636184, 41078576), 378, 0); + cs2method5406(1, 5, script_2808(globalint_1065, 40636184, 41160507), 210, script_2808(globalint_1065, 40636184, 41160508), 210, 0); + cs2method5406(0, 6, script_2808(globalint_1065, 40636184, 41094960), 378, script_2808(globalint_1065, 40636184, 41111344), 378, 0); + cs2method5406(1, 6, script_2808(globalint_1065, 40636184, 41160510), 210, script_2808(globalint_1065, 40636184, 41160512), 210, 0); + globalint_1065 = -1; + globalint_1064 = 0; + globalint_1067 = 879; + script_2825(0); + script_2810(5832706); + setScriptCallOnMinimapRelatedSetting3(2824, 0, "i", new WidgetPointer(89,0)); + return; +} diff --git a/dumps/scripts/2824.cs2 b/dumps/scripts/2824.cs2 new file mode 100644 index 000000000..3840515c1 --- /dev/null +++ b/dumps/scripts/2824.cs2 @@ -0,0 +1,4 @@ +void script_2824(int arg0) { + script_2825(arg0); + return; +} diff --git a/dumps/scripts/2825.cs2 b/dumps/scripts/2825.cs2 new file mode 100644 index 000000000..cbd2617b0 --- /dev/null +++ b/dumps/scripts/2825.cs2 @@ -0,0 +1,12 @@ +void script_2825(int arg0) { + if (globalint_1064 == subtract(cs2method5407(0), 1)) { + if (((boolean)arg0)) { + cs2method5512(); + } + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(89,0)); + return; + } + cameraMethod5502(0, globalint_1064, cs2method_3408(105, 105, globalint_1067, globalint_1064), cs2method_3408(105, 105, globalint_1067, add(globalint_1064, 1)), 1, globalint_1064); + globalint_1064 = add(globalint_1064, 1); + return; +} diff --git a/dumps/scripts/2826.cs2 b/dumps/scripts/2826.cs2 new file mode 100644 index 000000000..11f5062dc --- /dev/null +++ b/dumps/scripts/2826.cs2 @@ -0,0 +1,26 @@ +void script_2826(int arg0,int arg1) { + switch (globalint_1007) { + case 301: + cs2method5405(0, 4); + cs2method5405(1, 4); + cs2method5406(0, 0, script_2764(60248925, arg1), 565, script_2764(60232544, arg1), 820, 0); + cs2method5406(1, 0, script_2764(60248932, arg1), 295, script_2764(60281705, arg1), 378, 0); + cs2method5406(0, 1, script_2764(60330858, arg1), 700, script_2764(60363630, arg1), 705, 0); + cs2method5406(1, 1, script_2764(60478315, arg1), 335, script_2764(60527467, arg1), 305, 0); + cs2method5406(0, 2, script_2764(60281699, arg1), 740, script_2764(60183394, arg1), 755, 0); + cs2method5406(1, 2, script_2764(60281717, arg1), 315, script_2764(60265345, arg1), 270, 0); + cs2method5406(0, 3, script_2764(60281695, arg1), 554, script_2764(60298077, arg1), 554, 0); + cs2method5406(1, 3, script_2764(60085092, arg1), 305, script_2764(59806564, arg1), 215, 0); + cameraMethod5502(0, 0, 500, 300, 1, 0); + break; + case 302: + cameraMethod5502(0, 1, 600, 300, 1, 1); + break; + case 303: + cameraMethod5502(0, 2, 600, 300, 1, 2); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/2827.cs2 b/dumps/scripts/2827.cs2 new file mode 100644 index 000000000..2afd35b3d --- /dev/null +++ b/dumps/scripts/2827.cs2 @@ -0,0 +1,20 @@ +void script_2827(string arg0) { + int ivar0; + ivar0 = 0; + ivar0 = multiply(getLineCount(346, 495, arg0), 13); + if (ivar0 > 48) { + ivar0 = multiply(getLineCount(328, 495, arg0), 13); + } + if (ivar0 > 48) { + setWidgetScrollMax(0, ivar0, new WidgetPointer(178,23)); + script_31(11665432, 11665431, 792, 789, 790, 791, 773, 788); + setWidgetSize(334, 48, 0, 0, new WidgetPointer(178,23)); + setWidgetSize(16384, ivar0, 2, 0, new WidgetPointer(178,53)); + setWidgetSize(16384, ivar0, 2, 0, new WidgetPointer(178,54)); + setWidgetTextAlignment(0, 0, 0, new WidgetPointer(178,55)); + } else { + setWidgetSize(354, 48, 0, 0, new WidgetPointer(178,23)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(178,55)); + } + return; +} diff --git a/dumps/scripts/2828.cs2 b/dumps/scripts/2828.cs2 new file mode 100644 index 000000000..d8710dcae --- /dev/null +++ b/dumps/scripts/2828.cs2 @@ -0,0 +1,20 @@ +void script_2828(string arg0) { + int ivar0; + ivar0 = 0; + ivar0 = multiply(getLineCount(346, 495, arg0), 15); + if (ivar0 > 48) { + ivar0 = multiply(getLineCount(328, 495, arg0), 15); + } + if (ivar0 > 48) { + setWidgetScrollMax(0, ivar0, new WidgetPointer(178,58)); + script_31(11665412, 11665466, 792, 789, 790, 791, 773, 788); + setWidgetSize(334, 48, 0, 0, new WidgetPointer(178,58)); + setWidgetSize(16384, ivar0, 2, 0, new WidgetPointer(178,7)); + setWidgetSize(16384, ivar0, 2, 0, new WidgetPointer(178,8)); + setWidgetTextAlignment(0, 0, 0, new WidgetPointer(178,59)); + } else { + setWidgetSize(354, 48, 0, 0, new WidgetPointer(178,58)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(178,59)); + } + return; +} diff --git a/dumps/scripts/2829.cs2 b/dumps/scripts/2829.cs2 new file mode 100644 index 000000000..b435ee1a3 --- /dev/null +++ b/dumps/scripts/2829.cs2 @@ -0,0 +1,8 @@ +void script_2829(int arg0) { + if (((boolean)bitconfig_6924)) { + setWidgetSprite(942, new WidgetPointer(arg0)); + } else { + setWidgetSprite(941, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/283.cs2 b/dumps/scripts/283.cs2 new file mode 100644 index 000000000..ad30ee2f2 --- /dev/null +++ b/dumps/scripts/283.cs2 @@ -0,0 +1,18 @@ +void script_283() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = multiplyDivide(standart_config_1380, 1000, 100); + ivar0 = cs2method_3408(105, 105, 706, ivar2); + ivar1 = cs2method_3408(105, 105, 707, ivar2); + setWidgetPosition(15, ivar0, 2, 0, new WidgetPointer(834,74)); + setWidgetSize(14, ivar1, 0, 0, new WidgetPointer(834,74)); + if (ivar2 < 25) { + setWidgetRGB(new Color(255, 150, 35), new WidgetPointer(834,74)); + } else { + setWidgetRGB(new Color(4, 131, 6), new WidgetPointer(834,74)); + } + return; +} diff --git a/dumps/scripts/2830.cs2 b/dumps/scripts/2830.cs2 new file mode 100644 index 000000000..f03542b5d --- /dev/null +++ b/dumps/scripts/2830.cs2 @@ -0,0 +1,8 @@ +void script_2830(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + globalint_774 = arg1; + script_2790(); + return; +} diff --git a/dumps/scripts/2831.cs2 b/dumps/scripts/2831.cs2 new file mode 100644 index 000000000..77e487b04 --- /dev/null +++ b/dumps/scripts/2831.cs2 @@ -0,0 +1,13 @@ +void script_2831(int arg0,int arg1,int arg2) { + if (arg0 != 1) { + return; + } + cs2method403(arg2, arg1); + if (((boolean)arg2)) { + globalint_1009 = arg1; + } else { + globalint_1008 = arg1; + } + script_2790(); + return; +} diff --git a/dumps/scripts/2832.cs2 b/dumps/scripts/2832.cs2 new file mode 100644 index 000000000..1b524e596 --- /dev/null +++ b/dumps/scripts/2832.cs2 @@ -0,0 +1,9 @@ +void script_2832(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + cs2method404(0, arg1); + globalint_1015 = arg1; + script_2790(); + return; +} diff --git a/dumps/scripts/2833.cs2 b/dumps/scripts/2833.cs2 new file mode 100644 index 000000000..198bcc17d --- /dev/null +++ b/dumps/scripts/2833.cs2 @@ -0,0 +1,21 @@ +void script_2833(int arg0) { + switch (arg0) { + case 6099: + case 6102: + case 6101: + case 6100: + script_2411(arg0); + return; + case 13561: + case 19760: + case 13562: + script_2431(arg0); + return; + case 18339: + script_1273(arg0); + return; + } + setScriptCallOnConfigChange(-1, ""); + script_2410(getItemDefOpcode129Or130Method4209(arg0, 1), getItemDefOpcode129Or130Method4209(arg0, 2), getItemDefOpcode129Or130Method4209(arg0, 3), getItemDefOpcode129Or130Method4209(arg0, 4), getItemDefOpcode129Or130Method4209(arg0, 5), getItemOption(arg0, 1), getItemOption(arg0, 2), getItemOption(arg0, 3), getItemOption(arg0, 4), getItemOption(arg0, 5), getItemName(arg0)); + return; +} diff --git a/dumps/scripts/2834.cs2 b/dumps/scripts/2834.cs2 new file mode 100644 index 000000000..c32fc5e37 --- /dev/null +++ b/dumps/scripts/2834.cs2 @@ -0,0 +1,4 @@ +void script_2834() { + script_2835(); + return; +} diff --git a/dumps/scripts/2835.cs2 b/dumps/scripts/2835.cs2 new file mode 100644 index 000000000..d75d3eb88 --- /dev/null +++ b/dumps/scripts/2835.cs2 @@ -0,0 +1,22 @@ +void script_2835() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = subtract(extractX(getMyPositionHash()), mod(extractX(getMyPositionHash()), 64)); + ivar1 = subtract(extractY(getMyPositionHash()), mod(extractY(getMyPositionHash()), 64)); + ivar2 = addToCoordinate(0, ivar0, 0, ivar1); + cs2method5405(0, 4); + cs2method5405(1, 4); + cs2method5406(0, 0, script_2808(ivar2, 54662856, 55072476), 1185, script_2808(ivar2, 54662856, 55105244), 1030, 0); + cs2method5406(1, 0, script_2808(ivar2, 54662856, 55072467), 338, script_2808(ivar2, 54662856, 55072469), 338, 0); + cs2method5406(0, 1, script_2808(ivar2, 54662856, 55154393), 790, script_2808(ivar2, 54662856, 55154391), 705, 0); + cs2method5406(1, 1, script_2808(ivar2, 54662856, 55072473), 338, script_2808(ivar2, 54662856, 55072474), 338, 0); + cs2method5406(0, 2, script_2808(ivar2, 54662856, 55072470), 620, script_2808(ivar2, 54662856, 55072472), 580, 0); + cs2method5406(1, 2, script_2808(ivar2, 54662856, 55072477), 338, script_2808(ivar2, 54662856, 55072479), 338, 0); + cs2method5406(0, 3, script_2808(ivar2, 54662856, 55072483), 495, script_2808(ivar2, 54662856, 55072485), 445, 0); + cs2method5406(1, 3, script_2808(ivar2, 54662856, 55072486), 338, script_2808(ivar2, 54662856, 55072488), 338, 0); + globalint_1068 = 0; + setScriptCallOnMinimapRelatedSetting3(2836, "", new WidgetPointer(384,0)); + cameraMethod5502(0, 0, 400, 400, 1, 0); + return; +} diff --git a/dumps/scripts/2836.cs2 b/dumps/scripts/2836.cs2 new file mode 100644 index 000000000..3ac73797e --- /dev/null +++ b/dumps/scripts/2836.cs2 @@ -0,0 +1,21 @@ +void script_2836() { + flow_0: + globalint_1068 = add(globalint_1068, 1); + SWITCH (globalint_1068) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + } + setScriptCallOnMinimapRelatedSetting3(2836, "", new WidgetPointer(384,0)); + cameraMethod5502(0, globalint_1068, 400, 400, 1, globalint_1068); + GOTO flow_3 + flow_1: + setScriptCallOnMinimapRelatedSetting3(2836, "", new WidgetPointer(384,0)); + cameraMethod5502(0, globalint_1068, 400, 0, 1, globalint_1068); + GOTO flow_3 + flow_2: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(384,0)); + flow_3: + return; +} diff --git a/dumps/scripts/2837.cs2 b/dumps/scripts/2837.cs2 new file mode 100644 index 000000000..58ca3dd2f --- /dev/null +++ b/dumps/scripts/2837.cs2 @@ -0,0 +1,4 @@ +void script_2837() { + script_2838(); + return; +} diff --git a/dumps/scripts/2838.cs2 b/dumps/scripts/2838.cs2 new file mode 100644 index 000000000..dcf1e433c --- /dev/null +++ b/dumps/scripts/2838.cs2 @@ -0,0 +1,26 @@ +void script_2838() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = subtract(extractX(getMyPositionHash()), mod(extractX(getMyPositionHash()), 64)); + ivar1 = subtract(extractY(getMyPositionHash()), mod(extractY(getMyPositionHash()), 64)); + ivar2 = addToCoordinate(0, ivar0, 0, ivar1); + cs2method5405(0, 6); + cs2method5405(1, 6); + cs2method5406(0, 0, script_2808(ivar2, 54662856, 55072469), 1025, script_2808(ivar2, 54662856, 55072469), 790, 0); + cs2method5406(1, 0, script_2808(ivar2, 54662856, 55072472), 355, script_2808(ivar2, 54662856, 55072472), 265, 0); + cs2method5406(0, 1, script_2808(ivar2, 54662856, 55072482), 506, script_2808(ivar2, 54662856, 55072482), 506, 0); + cs2method5406(1, 1, script_2808(ivar2, 54662856, 55072485), 190, script_2808(ivar2, 54662856, 55072485), 190, 0); + cs2method5406(0, 2, script_2808(ivar2, 54662856, 55072479), 506, script_2808(ivar2, 54662856, 55072479), 506, 0); + cs2method5406(1, 2, script_2808(ivar2, 54662856, 55072484), 195, script_2808(ivar2, 54662856, 55072484), 210, 0); + cs2method5406(0, 3, script_2808(ivar2, 54662856, 55072476), 506, script_2808(ivar2, 54662856, 55072475), 506, 0); + cs2method5406(1, 3, script_2808(ivar2, 54662856, 55072479), 115, script_2808(ivar2, 54662856, 55072478), 70, 0); + cs2method5406(0, 4, script_2808(ivar2, 54662856, 55072474), 506, script_2808(ivar2, 54662856, 55072473), 506, 0); + cs2method5406(1, 4, script_2808(ivar2, 54662856, 55072478), 240, script_2808(ivar2, 54662856, 55072477), 330, 0); + cs2method5406(0, 5, script_2808(ivar2, 54662856, 55072472), 506, script_2808(ivar2, 54662856, 55072471), 506, 0); + cs2method5406(1, 5, script_2808(ivar2, 54662856, 55072485), 350, script_2808(ivar2, 54662856, 55072487), 350, 0); + globalint_1068 = 0; + setScriptCallOnMinimapRelatedSetting3(2840, "", new WidgetPointer(384,0)); + cameraMethod5502(0, globalint_1068, 100, 100, 1, globalint_1068); + return; +} diff --git a/dumps/scripts/2839.cs2 b/dumps/scripts/2839.cs2 new file mode 100644 index 000000000..0b4b18dbc --- /dev/null +++ b/dumps/scripts/2839.cs2 @@ -0,0 +1,6 @@ +void script_2839() { + globalint_1068 = 2; + cameraMethod5502(0, globalint_1068, 350, 400, 1, globalint_1068); + setScriptCallOnMinimapRelatedSetting3(2840, "", new WidgetPointer(384,0)); + return; +} diff --git a/dumps/scripts/284.cs2 b/dumps/scripts/284.cs2 new file mode 100644 index 000000000..a578d22ba --- /dev/null +++ b/dumps/scripts/284.cs2 @@ -0,0 +1,9 @@ +int script_284(int arg0) { + int ivar1; + int ivar2; + ivar1 = extractX(arg0); + ivar2 = extractY(arg0); + ivar1 = subtract(ivar1, mod(ivar1, 64)); + ivar2 = subtract(ivar2, mod(ivar2, 64)); + return addToCoordinate(0, ivar1, 0, ivar2); +} diff --git a/dumps/scripts/2840.cs2 b/dumps/scripts/2840.cs2 new file mode 100644 index 000000000..aafc53286 --- /dev/null +++ b/dumps/scripts/2840.cs2 @@ -0,0 +1,32 @@ +void script_2840() { + flow_0: + globalint_1068 = add(globalint_1068, 1); + SWITCH (globalint_1068) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 5: + GOTO flow_4 + } + setScriptCallOnMinimapRelatedSetting3(2840, "", new WidgetPointer(384,0)); + cameraMethod5502(0, globalint_1068, 400, 400, 1, globalint_1068); + GOTO flow_5 + flow_1: + setScriptCallOnMinimapRelatedSetting3(2840, "", new WidgetPointer(384,0)); + cameraMethod5502(0, globalint_1068, 400, 0, 1, globalint_1068); + GOTO flow_5 + flow_2: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(384,0)); + GOTO flow_5 + flow_3: + setScriptCallOnMinimapRelatedSetting3(2840, "", new WidgetPointer(384,0)); + cameraMethod5502(0, globalint_1068, 650, 700, 1, globalint_1068); + GOTO flow_5 + flow_4: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(384,0)); + flow_5: + return; +} diff --git a/dumps/scripts/2841.cs2 b/dumps/scripts/2841.cs2 new file mode 100644 index 000000000..2f6cff045 --- /dev/null +++ b/dumps/scripts/2841.cs2 @@ -0,0 +1,11 @@ +void script_2841() { + setWidgetIsHidden(false, new WidgetPointer(473,39)); + setWidgetIsHidden(true, new WidgetPointer(473,68)); + setWidgetIsHidden(true, new WidgetPointer(473,131)); + setWidgetIsHidden(true, new WidgetPointer(473,176)); + setWidgetIsHidden(false, new WidgetPointer(473,228)); + setWidgetIsHidden(true, new WidgetPointer(473,225)); + setWidgetIsHidden(true, new WidgetPointer(473,222)); + setWidgetIsHidden(true, new WidgetPointer(473,37)); + return; +} diff --git a/dumps/scripts/2842.cs2 b/dumps/scripts/2842.cs2 new file mode 100644 index 000000000..ee225cd6a --- /dev/null +++ b/dumps/scripts/2842.cs2 @@ -0,0 +1,11 @@ +void script_2842() { + setWidgetIsHidden(true, new WidgetPointer(473,39)); + setWidgetIsHidden(false, new WidgetPointer(473,68)); + setWidgetIsHidden(true, new WidgetPointer(473,131)); + setWidgetIsHidden(true, new WidgetPointer(473,176)); + setWidgetIsHidden(true, new WidgetPointer(473,228)); + setWidgetIsHidden(false, new WidgetPointer(473,225)); + setWidgetIsHidden(true, new WidgetPointer(473,222)); + setWidgetIsHidden(true, new WidgetPointer(473,37)); + return; +} diff --git a/dumps/scripts/2843.cs2 b/dumps/scripts/2843.cs2 new file mode 100644 index 000000000..643fa497f --- /dev/null +++ b/dumps/scripts/2843.cs2 @@ -0,0 +1,11 @@ +void script_2843() { + setWidgetIsHidden(true, new WidgetPointer(473,39)); + setWidgetIsHidden(true, new WidgetPointer(473,68)); + setWidgetIsHidden(false, new WidgetPointer(473,131)); + setWidgetIsHidden(true, new WidgetPointer(473,176)); + setWidgetIsHidden(true, new WidgetPointer(473,228)); + setWidgetIsHidden(true, new WidgetPointer(473,225)); + setWidgetIsHidden(false, new WidgetPointer(473,222)); + setWidgetIsHidden(true, new WidgetPointer(473,37)); + return; +} diff --git a/dumps/scripts/2844.cs2 b/dumps/scripts/2844.cs2 new file mode 100644 index 000000000..fb296e61b --- /dev/null +++ b/dumps/scripts/2844.cs2 @@ -0,0 +1,11 @@ +void script_2844() { + setWidgetIsHidden(true, new WidgetPointer(473,39)); + setWidgetIsHidden(true, new WidgetPointer(473,68)); + setWidgetIsHidden(true, new WidgetPointer(473,131)); + setWidgetIsHidden(false, new WidgetPointer(473,176)); + setWidgetIsHidden(true, new WidgetPointer(473,228)); + setWidgetIsHidden(true, new WidgetPointer(473,225)); + setWidgetIsHidden(true, new WidgetPointer(473,222)); + setWidgetIsHidden(false, new WidgetPointer(473,37)); + return; +} diff --git a/dumps/scripts/2845.cs2 b/dumps/scripts/2845.cs2 new file mode 100644 index 000000000..ca90a09e1 --- /dev/null +++ b/dumps/scripts/2845.cs2 @@ -0,0 +1,316 @@ +void script_2845() { + int ivar0; + if (((boolean)bitconfig_3251)) { + setWidgetModel(20522, new WidgetPointer(473,43)); + setWidgetText(new WidgetPointer(473,44), "Attacker level up to 2"); + setWidgetText(new WidgetPointer(473,46), "+20 bonus damage"); + setWidgetText(new WidgetPointer(473,45), "200 Attacker Honour Points"); + if (bitconfig_3256 > 199) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,45)); + } + } else if (bitconfig_3251 == 2) { + setWidgetModel(20523, new WidgetPointer(473,43)); + setWidgetText(new WidgetPointer(473,44), "Attacker level up to 3"); + setWidgetText(new WidgetPointer(473,46), "+30 bonus damage"); + setWidgetText(new WidgetPointer(473,45), "300 Attacker Honour Points"); + if (bitconfig_3256 > 299) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,45)); + } + } else if (bitconfig_3251 == 3) { + setWidgetModel(20524, new WidgetPointer(473,43)); + setWidgetText(new WidgetPointer(473,44), "Attacker level up to 4"); + setWidgetText(new WidgetPointer(473,46), "+40 bonus damage"); + setWidgetText(new WidgetPointer(473,45), "400 Attacker Honour Points"); + if (bitconfig_3256 > 399) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,45)); + } + } else if (bitconfig_3251 == 4) { + setWidgetModel(20525, new WidgetPointer(473,43)); + setWidgetText(new WidgetPointer(473,44), "Attacker level up to 5"); + setWidgetText(new WidgetPointer(473,46), "+50 bonus damage"); + setWidgetText(new WidgetPointer(473,45), "500 Attacker Honour Points"); + if (bitconfig_3256 > 499) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,45)); + } + } else if (bitconfig_3251 == 5) { + setWidgetModel(20525, new WidgetPointer(473,43)); + setWidgetText(new WidgetPointer(473,44), "Attacker level up complete"); + setWidgetText(new WidgetPointer(473,46), " - Mastered - "); + setWidgetText(new WidgetPointer(473,45), " - Mastered - "); + } else { + bitconfig_3251 = 1; + setWidgetModel(20522, new WidgetPointer(473,43)); + setWidgetText(new WidgetPointer(473,44), "Attacker level up to 2"); + setWidgetText(new WidgetPointer(473,46), "+20 bonus damage"); + setWidgetText(new WidgetPointer(473,45), "200 Attacker Honour Points"); + if (bitconfig_3256 > 199) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,45)); + } + } + if (((boolean)bitconfig_3253)) { + setWidgetModel(20531, new WidgetPointer(473,50)); + setWidgetText(new WidgetPointer(473,51), "Defender level up to 2"); + setWidgetText(new WidgetPointer(473,53), "Lure range 5"); + setWidgetText(new WidgetPointer(473,52), "200 Defender Honour Points"); + if (bitconfig_3263 > 199) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,52)); + } + } else if (bitconfig_3253 == 2) { + setWidgetModel(20532, new WidgetPointer(473,50)); + setWidgetText(new WidgetPointer(473,51), "Defender level up to 3"); + setWidgetText(new WidgetPointer(473,53), "Lure range 6"); + setWidgetText(new WidgetPointer(473,52), "300 Defender Honour Points"); + if (bitconfig_3263 > 299) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,52)); + } + } else if (bitconfig_3253 == 3) { + setWidgetModel(20533, new WidgetPointer(473,50)); + setWidgetText(new WidgetPointer(473,51), "Defender level up to 4"); + setWidgetText(new WidgetPointer(473,53), "Lure range 8"); + setWidgetText(new WidgetPointer(473,52), "400 Defender Honour Points"); + if (bitconfig_3263 > 399) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,52)); + } + } else if (bitconfig_3253 == 4) { + setWidgetModel(20534, new WidgetPointer(473,50)); + setWidgetText(new WidgetPointer(473,51), "Defender level up to 5"); + setWidgetText(new WidgetPointer(473,53), "Lure range 10"); + setWidgetText(new WidgetPointer(473,52), "500 Defender Honour Points"); + if (bitconfig_3263 > 499) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,52)); + } + } else if (bitconfig_3253 == 5) { + setWidgetModel(20534, new WidgetPointer(473,50)); + setWidgetText(new WidgetPointer(473,51), "Defender level up complete"); + setWidgetText(new WidgetPointer(473,53), " - Mastered - "); + setWidgetText(new WidgetPointer(473,52), " - Mastered - "); + } else { + bitconfig_3253 = 1; + setWidgetModel(20531, new WidgetPointer(473,50)); + setWidgetText(new WidgetPointer(473,51), "Defender level up to 2"); + setWidgetText(new WidgetPointer(473,53), "Lure range 5"); + setWidgetText(new WidgetPointer(473,52), "200 Defender Honour Points"); + if (bitconfig_3263 > 199) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,52)); + } + } + if (((boolean)bitconfig_3254)) { + setWidgetModel(20526, new WidgetPointer(473,57)); + setWidgetText(new WidgetPointer(473,58), "Collector level up to 2"); + setWidgetText(new WidgetPointer(473,60), "Egg conversion"); + setWidgetText(new WidgetPointer(473,59), "200 Collector Honour Points"); + if (bitconfig_3261 > 199) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,59)); + } + } else if (bitconfig_3254 == 2) { + setWidgetModel(20527, new WidgetPointer(473,57)); + setWidgetText(new WidgetPointer(473,58), "Collector level up to 3"); + setWidgetText(new WidgetPointer(473,60), "Egg convert success (80%)"); + setWidgetText(new WidgetPointer(473,59), "300 Collector Honour Points"); + if (bitconfig_3261 > 299) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,59)); + } + } else if (bitconfig_3254 == 3) { + setWidgetModel(20528, new WidgetPointer(473,57)); + setWidgetText(new WidgetPointer(473,58), "Collector level up to 4"); + setWidgetText(new WidgetPointer(473,60), "Egg convert success (90%)"); + setWidgetText(new WidgetPointer(473,59), "400 Collector Honour Points"); + if (bitconfig_3261 > 399) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,59)); + } + } else if (bitconfig_3254 == 4) { + setWidgetModel(20529, new WidgetPointer(473,57)); + setWidgetText(new WidgetPointer(473,58), "Collector level up to 5"); + setWidgetText(new WidgetPointer(473,60), "Egg convert success (100%)"); + setWidgetText(new WidgetPointer(473,59), "500 Collector Honour Points"); + if (bitconfig_3261 > 499) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,59)); + } + } else if (bitconfig_3254 == 5) { + setWidgetModel(20529, new WidgetPointer(473,57)); + setWidgetText(new WidgetPointer(473,58), "Collector level up complete"); + setWidgetText(new WidgetPointer(473,60), " - Mastered - "); + setWidgetText(new WidgetPointer(473,59), " - Mastered - "); + } else { + bitconfig_3254 = 1; + setWidgetModel(20526, new WidgetPointer(473,57)); + setWidgetText(new WidgetPointer(473,58), "Collector level up to 2"); + setWidgetText(new WidgetPointer(473,60), "Egg conversion"); + setWidgetText(new WidgetPointer(473,59), "200 Collector Honour Points"); + if (bitconfig_3261 > 199) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,59)); + } + } + if (((boolean)bitconfig_3255)) { + setWidgetModel(20538, new WidgetPointer(473,64)); + setWidgetText(new WidgetPointer(473,65), "Healer level up to 2"); + setWidgetText(new WidgetPointer(473,67), "Heal 150 points, more run energy"); + setWidgetText(new WidgetPointer(473,66), "200 Healer Honour Points"); + if (bitconfig_3262 > 199) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,66)); + } + } else if (bitconfig_3255 == 2) { + setWidgetModel(20539, new WidgetPointer(473,64)); + setWidgetText(new WidgetPointer(473,65), "Healer level up to 3"); + setWidgetText(new WidgetPointer(473,67), "Heal 200 points, more run energy"); + setWidgetText(new WidgetPointer(473,66), "300 Healer Honour Points"); + if (bitconfig_3262 > 299) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,66)); + } + } else if (bitconfig_3255 == 3) { + setWidgetModel(20540, new WidgetPointer(473,64)); + setWidgetText(new WidgetPointer(473,65), "Healer level up to 4"); + setWidgetText(new WidgetPointer(473,67), "Heal 250 points, more run energy"); + setWidgetText(new WidgetPointer(473,66), "400 Healer Honour Points"); + if (bitconfig_3262 > 399) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,66)); + } + } else if (bitconfig_3255 == 4) { + setWidgetModel(20541, new WidgetPointer(473,64)); + setWidgetText(new WidgetPointer(473,65), "Healer level up to 5"); + setWidgetText(new WidgetPointer(473,67), "Heal 350 points, more run energy"); + setWidgetText(new WidgetPointer(473,66), "500 Healer Honour Points"); + if (bitconfig_3262 > 499) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,66)); + } + } else if (bitconfig_3255 == 5) { + setWidgetModel(20541, new WidgetPointer(473,64)); + setWidgetText(new WidgetPointer(473,65), "Healer level up complete"); + setWidgetText(new WidgetPointer(473,67), " - Mastered - "); + setWidgetText(new WidgetPointer(473,66), " - Mastered - "); + } else { + bitconfig_3255 = 1; + setWidgetModel(20538, new WidgetPointer(473,64)); + setWidgetText(new WidgetPointer(473,65), "Healer level up to 2"); + setWidgetText(new WidgetPointer(473,67), "Heal 150 points and even more run energy"); + setWidgetText(new WidgetPointer(473,66), "200 Healer Honour Points"); + if (bitconfig_3262 > 199) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,66)); + } + } + if (((bitconfig_3256 > 274) && (bitconfig_3263 > 274)) && ((bitconfig_3261 > 274) && (bitconfig_3262 > 274))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,128)); + } + if (((bitconfig_3256 > 274) && (bitconfig_3263 > 274)) && ((bitconfig_3261 > 274) && (bitconfig_3262 > 274))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,121)); + } + if (((bitconfig_3256 > 274) && (bitconfig_3263 > 274)) && ((bitconfig_3261 > 274) && (bitconfig_3262 > 274))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,114)); + } + if (((bitconfig_3256 > 274) && (bitconfig_3263 > 274)) && ((bitconfig_3261 > 274) && (bitconfig_3262 > 274))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,107)); + } + if (((bitconfig_3256 > 374) && (bitconfig_3263 > 374)) && ((bitconfig_3261 > 374) && (bitconfig_3262 > 374))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,100)); + } + if (((bitconfig_3256 > 374) && (bitconfig_3263 > 374)) && ((bitconfig_3261 > 374) && (bitconfig_3262 > 374))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,93)); + } + if (((bitconfig_3256 > 99) && (bitconfig_3263 > 99)) && ((bitconfig_3261 > 99) && (bitconfig_3262 > 99))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,87)); + } + if (((bitconfig_3256 > 149) && (bitconfig_3263 > 149)) && ((bitconfig_3261 > 149) && (bitconfig_3262 > 149))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,81)); + } + if (getItemAmtInContainer(93, 995) > 94999) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,212)); + } + if (((boolean)bitconfig_3245)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,95)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,102)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,109)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,116)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,123)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,130)); + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,214)); + } + if ((((bitconfig_3256 > 9) || (bitconfig_3263 > 9)) || (bitconfig_3261 > 9)) || (bitconfig_3262 > 9)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,206)); + } + if ((((bitconfig_3256 > 19) || (bitconfig_3263 > 19)) || (bitconfig_3261 > 19)) || (bitconfig_3262 > 19)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,200)); + } + if ((((bitconfig_3256 > 29) || (bitconfig_3263 > 29)) || (bitconfig_3261 > 29)) || (bitconfig_3262 > 29)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,194)); + } + if ((((getItemAmtInContainer(93, 15439) < 1) && (getItemAmtInContainer(95, 15439) < 1)) && ((getItemAmtInContainer(94, 15439) < 1) && (getItemAmtInContainer(530, 15439) < 1))) && (((getItemAmtInContainer(93, 15440) < 1) && (getItemAmtInContainer(95, 15440) < 1)) && ((getItemAmtInContainer(94, 15440) < 1) && (getItemAmtInContainer(530, 15440) < 1)))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,219)); + } + if ((((bitconfig_3251 == 5) || (bitconfig_3253 == 5)) || (bitconfig_3254 == 5)) || (bitconfig_3255 == 5)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,183)); + } + if ((((getItemAmtInContainer(93, 15440) < 1) && (getItemAmtInContainer(95, 15440) < 1)) && ((getItemAmtInContainer(94, 15440) < 1) && (getItemAmtInContainer(530, 15440) < 1))) && ((((getItemAmtInContainer(93, 15439) > 0) || (getItemAmtInContainer(95, 15439) > 0)) || (getItemAmtInContainer(94, 15439) > 0)) || (getItemAmtInContainer(530, 15439) > 0))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,184)); + } + if (((bitconfig_3256 > 389) && (bitconfig_3263 > 389)) && ((bitconfig_3261 > 389) && (bitconfig_3262 > 389))) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,146)); + } + if ((getItemAmtInContainer(93, 15438) > 0) || (getItemAmtInContainer(94, 15438) > 0)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,140)); + } + ivar0 = 0; + if ((getItemAmtInContainer(93, 4151) > 0) || (getItemAmtInContainer(93, 11235) > 0)) { + ivar0 = 1; + } + if (((boolean)bitconfig_7342)) { + if ((((bitconfig_3256 > 49) || (bitconfig_3263 > 49)) || (bitconfig_3261 > 49)) || (bitconfig_3262 > 49)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,162)); + } + } else { + if (((boolean)ivar0)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,162)); + } + } + if (((boolean)bitconfig_7344)) { + if ((((bitconfig_3256 > 49) || (bitconfig_3263 > 49)) || (bitconfig_3261 > 49)) || (bitconfig_3262 > 49)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,156)); + } + } else { + if (((boolean)ivar0)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,156)); + } + } + if (((boolean)bitconfig_7341)) { + if ((((bitconfig_3256 > 49) || (bitconfig_3263 > 49)) || (bitconfig_3261 > 49)) || (bitconfig_3262 > 49)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,174)); + } + } else { + if (((boolean)ivar0)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,174)); + } + } + if (((boolean)bitconfig_7343)) { + if ((((bitconfig_3256 > 49) || (bitconfig_3263 > 49)) || (bitconfig_3261 > 49)) || (bitconfig_3262 > 49)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,168)); + } + } else { + if (((boolean)ivar0)) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(473,168)); + } + } + if (((boolean)bitconfig_7342)) { + setWidgetText(new WidgetPointer(473,162), "Carrying a valid weapon"); + setWidgetText(new WidgetPointer(473,161), "Use Penance Egg Paint (White)"); + } + if (((boolean)bitconfig_7344)) { + setWidgetText(new WidgetPointer(473,156), "Carrying a valid weapon"); + setWidgetText(new WidgetPointer(473,155), "Use Penance Egg Paint (Green)"); + } + if (((boolean)bitconfig_7343)) { + setWidgetText(new WidgetPointer(473,168), "Carrying a valid weapon"); + setWidgetText(new WidgetPointer(473,167), "Use Penance Egg Paint (Blue)"); + } + if (((boolean)bitconfig_7341)) { + setWidgetText(new WidgetPointer(473,174), "Carrying a valid weapon"); + setWidgetText(new WidgetPointer(473,173), "Use Penance Egg Paint (Yellow)"); + } + setItemOnWidgetMethod2200(10534, -1, new WidgetPointer(473,172)); + setItemOnWidgetMethod2200(10531, -1, new WidgetPointer(473,154)); + setItemOnWidgetMethod2200(15705, -1, new WidgetPointer(473,160)); + setItemOnWidgetMethod2200(10533, -1, new WidgetPointer(473,166)); + setWidgetText(new WidgetPointer(473,9), intToStr(bitconfig_3256)); + setWidgetText(new WidgetPointer(473,10), intToStr(bitconfig_3263)); + setWidgetText(new WidgetPointer(473,11), intToStr(bitconfig_3261)); + setWidgetText(new WidgetPointer(473,12), intToStr(bitconfig_3262)); + return; +} diff --git a/dumps/scripts/2846.cs2 b/dumps/scripts/2846.cs2 new file mode 100644 index 000000000..c3ee91eca --- /dev/null +++ b/dumps/scripts/2846.cs2 @@ -0,0 +1,57 @@ +void script_2846(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = 308; + ivar2 = 55; + ivar3 = 0; + ivar4 = getCommonDefinitionSize(903); + while (ivar3 < ivar4) { + createExtraChild(new WidgetPointer(arg0), 6, ivar3); + setWidgetSize(50, 50, 0, 0); + setWidgetPosition(ivar1, ivar2, 0, 0); + setWidgetModel(cs2method_3408(105, 109, 903, ivar3)); + setWidget3DRotation(0, 0, 512, 0, 0, 2750); + setScriptCallOnMouseDragReleased(2848, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(-32768,6), -2147483641, -2147483647, -2147483646, "IiIiii"); + cs2method1302(2); + cs2method1303(14); + setWidgetContextMenuOption(1, "Select"); + ivar3 = add(ivar3, 1); + if (ivar3 == 3) { + ivar1 = add(308, 48); + ivar2 = 55; + } else if (ivar3 == 6) { + ivar1 = add(308, 96); + ivar2 = 55; + } else { + ivar2 = add(48, ivar2); + } + } + ivar1 = 113; + ivar2 = 83; + ivar4 = getCommonDefinitionSize(904); + ivar4 = add(ivar4, ivar3); + ivar5 = 0; + while (ivar3 < ivar4) { + createExtraChild(new WidgetPointer(arg0), 3, ivar3); + setWidgetSize(50, 50, 0, 0); + setWidgetPosition(ivar1, ivar2, 0, 0); + cs2method2103(255); + ivar3 = add(ivar3, 1); + ivar5 = add(ivar5, 1); + if (ivar5 == 3) { + ivar1 = 113; + ivar2 = add(83, 52); + } else if (ivar5 == 6) { + ivar1 = 113; + ivar2 = add(83, 104); + } else { + ivar1 = add(50, ivar1); + } + } + script_2847(arg0); + return; +} diff --git a/dumps/scripts/2847.cs2 b/dumps/scripts/2847.cs2 new file mode 100644 index 000000000..5f1149a8b --- /dev/null +++ b/dumps/scripts/2847.cs2 @@ -0,0 +1,36 @@ +void script_2847(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar1 = 308; + ivar2 = 55; + ivar3 = 0; + ivar4 = getCommonDefinitionSize(903); + globalarray_0 = new int[ivar4]; + globalarray_0[0] = 5; + globalarray_0[1] = 8; + globalarray_0[2] = 2; + globalarray_0[3] = 0; + globalarray_0[4] = 4; + globalarray_0[5] = 1; + globalarray_0[6] = 3; + globalarray_0[7] = 7; + globalarray_0[8] = 6; + while (ivar3 < ivar4) { + if (setWidgetRegister(new WidgetPointer(arg0), globalarray_0[ivar3])) { + setWidgetPosition(ivar1, ivar2, 0, 0); + } + ivar3 = add(ivar3, 1); + if (ivar3 == 3) { + ivar1 = add(308, 48); + ivar2 = 55; + } else if (ivar3 == 6) { + ivar1 = add(308, 96); + ivar2 = 55; + } else { + ivar2 = add(48, ivar2); + } + } + return; +} diff --git a/dumps/scripts/2848.cs2 b/dumps/scripts/2848.cs2 new file mode 100644 index 000000000..0735b6705 --- /dev/null +++ b/dumps/scripts/2848.cs2 @@ -0,0 +1,41 @@ +void script_2848(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + ivar6 = 0; + ivar7 = 0; + if (arg2 != -1) { + if (arg3 == -1) { + if (setWidgetRegister(new WidgetPointer(arg2)) && (arg2 == 31064075)) { + ivar6 = arg4; + ivar7 = arg5; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetPosition(cs2method_3408(105, 105, 905, arg1), cs2method_3408(105, 105, 906, arg1), 0, 0); + } + } + } else { + if (arg3 < 9) { + return; + } + if (((boolean)script_2849(subtract(arg3, 9)))) { + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + ivar6 = getWidgetActualX(); + ivar7 = getWidgetActualY(); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + switch (rnd(2)) { + case 0: + playSoundEffect(8502, 1, 0); + break; + case 1: + playSoundEffect(8518, 1, 0); + break; + case 2: + playSoundEffect(8515, 1, 0); + } + setWidgetPosition(ivar6, ivar7, 0, 0); + } + } + } + } + return; +} diff --git a/dumps/scripts/2849.cs2 b/dumps/scripts/2849.cs2 new file mode 100644 index 000000000..3577b51e8 --- /dev/null +++ b/dumps/scripts/2849.cs2 @@ -0,0 +1,23 @@ +int script_2849(int arg0) { + switch (arg0) { + case 0: + return bitconfig_7060; + case 1: + return bitconfig_7061; + case 2: + return bitconfig_7062; + case 3: + return bitconfig_7063; + case 4: + return bitconfig_7064; + case 5: + return bitconfig_7065; + case 6: + return bitconfig_7066; + case 7: + return bitconfig_7067; + case 8: + return bitconfig_7068; + } + return 0; +} diff --git a/dumps/scripts/285.cs2 b/dumps/scripts/285.cs2 new file mode 100644 index 000000000..745898673 --- /dev/null +++ b/dumps/scripts/285.cs2 @@ -0,0 +1,226 @@ +int script_285(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + string svar1; + string svar2; + script_41(49479737); + ivar2 = 1; + ivar3 = -1; + svar0 = "Hide"; + svar1 = "Show"; + svar2 = "`You are here'"; + if (((boolean)bitconfig_6174)) { + svar0 = "Show"; + svar1 = "Hide"; + ivar2 = 0; + } + createExtraChild(new WidgetPointer(arg0), 5, 0); + createExtraChild(new WidgetPointer(arg0), 4, 1); + setWidgetPosition(-1, arg1, 0, 0); + setWidgetSize(26, 26, 0, 0); + setWidgetPosition(subtract(add(getWidgetActualX(), getWidgetActualWidth()), 1), arg1, 0, 0); + setWidgetSize(getWidgetActualX(), getWidgetActualHeight(), 1, 0); + ivar4 = getWidgetActualWidth(); + setWidgetSprite(getOtherCommonData(280, 130)); + setWidgetRGB(new Color(175, 175, 175)); + setWidgetFont(495); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(svar2); + cs2method1305("" + svar2 + ""); + cs2method1305("" + svar2 + ""); + setWidgetContextMenuOption(1, svar0); + setWidgetContextMenuOption(1, svar0); + svar2 = "Toggles the " + "" + "You are here" + "" + " marker."; + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), getWidgetCustomChildArrayIndex(), 2, svar1, ivar2, "iIiiis1"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), getWidgetCustomChildArrayIndex(), 2, svar1, ivar2, "iIiiis1"); + script_287(2, ivar2, arg0, arg1); + arg1 = add(arg1, getWidgetActualHeight()); + svar2 = "Intra-map links"; + if (((boolean)bitconfig_6175)) { + svar0 = "Show"; + svar1 = "Hide"; + ivar2 = 0; + } else { + svar0 = "Hide"; + svar1 = "Show"; + ivar2 = 1; + } + createExtraChild(new WidgetPointer(arg0), 5, 3); + createExtraChild(new WidgetPointer(arg0), 4, 4); + setWidgetPosition(3, arg1, 0, 0); + setWidgetSize(22, 26, 0, 0); + setWidgetPosition(add(getWidgetActualX(), getWidgetActualWidth()), arg1, 0, 0); + setWidgetSize(add(getWidgetActualX(), getWidgetActualX()), getWidgetActualHeight(), 1, 0); + setWidgetRGB(new Color(175, 175, 175)); + setWidgetFont(495); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(svar2); + cs2method1305("" + svar2 + ""); + cs2method1305("" + svar2 + ""); + setWidgetContextMenuOption(1, svar0); + setWidgetContextMenuOption(1, svar0); + svar2 = "Toggles the features that show links within a map."; + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), getWidgetCustomChildArrayIndex(), 10, svar1, ivar2, "iIiiis1"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), getWidgetCustomChildArrayIndex(), 10, svar1, ivar2, "iIiiis1"); + createExtraChild(new WidgetPointer(arg0), 3, 5); + setWidgetPosition(4, add(arg1, 12), 0, 0); + setWidgetSize(5, 5, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 3, 6); + setWidgetPosition(17, add(arg1, 12), 0, 0); + setWidgetSize(5, 5, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 3, 7); + setWidgetPosition(3, add(arg1, 11), 0, 0); + setWidgetSize(5, 5, 0, 0); + setWidgetRGB(new Color(255, 255, 0)); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 3, 8); + setWidgetPosition(16, add(arg1, 11), 0, 0); + setWidgetSize(5, 5, 0, 0); + setWidgetRGB(new Color(255, 255, 0)); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 9, 9); + setWidgetPosition(5, add(arg1, 13), 0, 0); + setWidgetSize(15, 0, 0, 0); + cs2method1104(2); + setWidgetRGB(new Color(255, 255, 0)); + script_287(10, ivar2, arg0, arg1); + arg1 = add(arg1, getWidgetActualHeight()); + svar2 = "Map labels"; + if (((boolean)bitconfig_6176)) { + svar0 = "Show"; + svar1 = "Hide"; + ivar2 = 0; + } else { + svar0 = "Hide"; + svar1 = "Show"; + ivar2 = 1; + } + createExtraChild(new WidgetPointer(arg0), 4, 11); + setWidgetPosition(1, arg1, 0, 0); + setWidgetSize(23, 26, 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetText("ABC" + "
" + "XYZ"); + createExtraChild(new WidgetPointer(arg0), 4, 12); + setWidgetPosition(add(getWidgetActualX(), getWidgetActualWidth()), arg1, 0, 0); + setWidgetSize(add(getWidgetActualX(), getWidgetActualX()), getWidgetActualHeight(), 1, 0); + setWidgetRGB(new Color(175, 175, 175)); + setWidgetFont(495); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(svar2); + cs2method1305("" + svar2 + ""); + cs2method1305("" + svar2 + ""); + setWidgetContextMenuOption(1, svar0); + setWidgetContextMenuOption(1, svar0); + svar2 = "Toggles most text labels." + "
" + "Some are always shown."; + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), getWidgetCustomChildArrayIndex(), 13, svar1, ivar2, "iIiiis1"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), getWidgetCustomChildArrayIndex(), 13, svar1, ivar2, "iIiiis1"); + script_287(13, ivar2, arg0, arg1); + arg1 = add(arg1, getWidgetActualHeight()); + svar2 = "Icon tooltips"; + if (((boolean)bitconfig_6177)) { + svar0 = "Show"; + svar1 = "Hide"; + ivar2 = 0; + } else { + svar0 = "Hide"; + svar1 = "Show"; + ivar2 = 1; + } + createExtraChild(new WidgetPointer(arg0), 3, 14); + setWidgetPosition(3, add(arg1, 6), 0, 0); + setWidgetSize(20, 14, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 160)); + createExtraChild(new WidgetPointer(arg0), 3, 15); + setWidgetPosition(3, add(arg1, 6), 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(1, 1, 1)); + createExtraChild(new WidgetPointer(arg0), 4, 16); + setWidgetPosition(add(add(getWidgetActualX(), getWidgetActualWidth()), 2), arg1, 0, 0); + setWidgetSize(add(getWidgetActualX(), getWidgetActualX()), 26, 1, 0); + setWidgetRGB(new Color(175, 175, 175)); + setWidgetFont(495); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(svar2); + cs2method1305("" + svar2 + ""); + cs2method1305("" + svar2 + ""); + setWidgetContextMenuOption(1, svar0); + setWidgetContextMenuOption(1, svar0); + svar2 = "Toggles icon tooltips."; + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), getWidgetCustomChildArrayIndex(), 17, svar1, ivar2, "iIiiis1"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), getWidgetCustomChildArrayIndex(), 17, svar1, ivar2, "iIiiis1"); + script_287(17, ivar2, arg0, arg1); + arg1 = add(arg1, getWidgetActualHeight()); + createExtraChild(new WidgetPointer(arg0), 5, 18); + setWidgetSize(26, 26, 0, 0); + svar2 = "Double-click the map to set a marker"; + ivar5 = max(add(multiply(getLineCount(ivar4, 494, svar2), 10), 3), getWidgetActualHeight()); + setWidgetPosition(-1, add(arg1, divide(subtract(ivar5, getWidgetActualHeight()), 2)), 0, 0); + setWidgetSprite(getOtherCommonData(972, 130)); + createExtraChild(new WidgetPointer(arg0), 4, 19); + setWidgetPosition(0, arg1, 2, 0); + setWidgetSize(ivar4, ivar5, 0, 0); + setWidgetRGB(new Color(175, 175, 175)); + setWidgetUnknownBoolean(true); + if ((standart_config_1159 == -1) || ((boolean)standart_config_1159)) { + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + setWidgetText(svar2); + } else { + svar2 = "Clear your marker"; + setWidgetTextAlignment(0, 1, 0); + setWidgetFont(495); + setWidgetText(svar2); + setWidgetContextMenuOption(1, svar2); + setWidgetContextMenuOption(1, svar2); + svar2 = "Removes the marker."; + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseOver(310, svar2, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), "sIi"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnMouseExit(289, new WidgetPointer(arg0), getWidgetCustomChildArrayIndex(), 11513775, "Iii"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), -1, -1, -1, "", 0, "iIiiis1"); + setScriptCallOnClickContextMenu(286, -2147483644, new WidgetPointer(arg0), -1, -1, -1, "", 0, "iIiiis1"); + } + return add(arg1, getWidgetActualHeight()); +} diff --git a/dumps/scripts/2850.cs2 b/dumps/scripts/2850.cs2 new file mode 100644 index 000000000..023304c18 --- /dev/null +++ b/dumps/scripts/2850.cs2 @@ -0,0 +1,26 @@ +void script_2850() { + globalint_1069 = 500; + globalint_1070 = addToCoordinate(getMyPositionHash(), 0, 0, -8); + globalint_1071 = 0; + globalint_1072 = getMyPositionHash(); + globalint_1073 = 450; + globalint_1074 = 0; + globalint_1282 = 25; + cameraMoveTo(globalint_1070, globalint_1069, 10, 3); + cameraPointAt(script_2865(globalint_1070, globalint_1071), globalint_1073, 10, 3); + globalint_1075 = 0; + globalint_1076 = 0; + setScriptCallOnKeyPress(2851, new WidgetPointer(-32768,3), -2147483640, 0, "Iii", new WidgetPointer(475,1)); + setWidgetIsHidden(false, new WidgetPointer(475,54)); + setWidgetIsHidden(false, new WidgetPointer(475,7)); + setWidgetIsHidden(false, new WidgetPointer(475,58)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetSprite(1232, new WidgetPointer(475,28)); + setWidgetText(new WidgetPointer(475,29), "You are now in Aim Mode"); + setScriptCallOnGameloop(2853, new WidgetPointer(475,1), getClientCycle(), "Ii", new WidgetPointer(475,1)); + setScriptCallOnGameloop(2852, new WidgetPointer(475,7), "I", new WidgetPointer(475,7)); + setWidgetIsHidden(false, new WidgetPointer(475,2)); + setScriptCallOnGameloop(2870, new WidgetPointer(-32768,3), add(getClientCycle(), 150), "Ii", new WidgetPointer(475,2)); + script_3455(); + return; +} diff --git a/dumps/scripts/2851.cs2 b/dumps/scripts/2851.cs2 new file mode 100644 index 000000000..6c8a84d83 --- /dev/null +++ b/dumps/scripts/2851.cs2 @@ -0,0 +1,279 @@ +void script_2851(int arg0,int arg1,int arg2) { + if (isWidgetHidden(new WidgetPointer(475,55))) { + if (arg1 == 2) { + script_835(1); + } + return; + } + if ((getClientCycle() > add(arg2, 5)) || (globalint_1074 == 2)) { + switch (getLanguage()) { + case 2: + switch (arg1) { + case 2: + script_835(0); + break; + case 6: + script_3455(); + break; + case 7: + script_3453(); + break; + case 8: + script_3456(); + break; + case 34: + script_2858(); + break; + case 35: + script_2854(); + break; + case 36: + script_2859(); + break; + case 50: + script_2857(); + break; + case 51: + script_2855(); + break; + case 52: + script_2856(); + break; + case 98: + script_2860(); + break; + case 99: + script_2861(); + break; + case 96: + script_2863(); + break; + case 97: + script_2862(); + break; + case 13: + script_675(); + break; + case 1: + script_3455(); + if (((boolean)globalint_1074)) { + globalint_1074 = 1; + setWidgetSprite(1233, new WidgetPointer(475,28)); + setWidgetText(new WidgetPointer(475,29), "You are now in Focus Mode"); + if (isWidgetHidden(new WidgetPointer(475,54))) { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(false, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,58)); + } + } else if (globalint_1074 == 2) { + globalint_1074 = 0; + setWidgetSprite(1232, new WidgetPointer(475,28)); + setWidgetText(new WidgetPointer(475,29), "You are now in Aim Mode"); + if (isWidgetHidden(new WidgetPointer(475,100))) { + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(false, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,58)); + } + } else { + globalint_1074 = 2; + setWidgetSprite(1231, new WidgetPointer(475,28)); + setWidgetText(new WidgetPointer(475,29), "You are now in Fine Control Mode"); + if (isWidgetHidden(new WidgetPointer(475,33))) { + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(false, new WidgetPointer(475,100)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } + } + setScriptCallOnGameloop(2853, new WidgetPointer(arg0), getClientCycle(), "Ii", new WidgetPointer(arg0)); + break; + case 83: + if (((boolean)globalint_1074)) { + if (isWidgetHidden(new WidgetPointer(475,54))) { + setWidgetIsHidden(false, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,7)); + setWidgetIsHidden(false, new WidgetPointer(475,58)); + } else { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(true, new WidgetPointer(475,7)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } + } else if (((boolean)globalint_1074)) { + if (isWidgetHidden(new WidgetPointer(475,33))) { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(false, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,7)); + setWidgetIsHidden(false, new WidgetPointer(475,58)); + } else { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(true, new WidgetPointer(475,7)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } + } else { + if (globalint_1074 == 2) { + if (isWidgetHidden(new WidgetPointer(475,100))) { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(false, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,7)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } else { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(true, new WidgetPointer(475,7)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } + } + } + break; + default: + return; + } + break; + default: + switch (arg1) { + case 2: + script_835(0); + break; + case 6: + script_3455(); + break; + case 7: + script_3453(); + break; + case 8: + script_3456(); + break; + case 32: + script_2858(); + break; + case 33: + script_2854(); + break; + case 34: + script_2859(); + break; + case 48: + script_2857(); + break; + case 49: + script_2855(); + break; + case 50: + script_2856(); + break; + case 98: + script_2860(); + break; + case 99: + script_2861(); + break; + case 96: + script_2863(); + break; + case 97: + script_2862(); + break; + case 13: + script_675(); + break; + case 1: + script_3455(); + if (((boolean)globalint_1074)) { + globalint_1074 = 1; + setWidgetSprite(1233, new WidgetPointer(475,28)); + setWidgetText(new WidgetPointer(475,29), "You are now in Focus Mode"); + if (isWidgetHidden(new WidgetPointer(475,54))) { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(false, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,58)); + } + } else if (globalint_1074 == 2) { + globalint_1074 = 0; + setWidgetSprite(1232, new WidgetPointer(475,28)); + setWidgetText(new WidgetPointer(475,29), "You are now in Aim Mode"); + if (isWidgetHidden(new WidgetPointer(475,100))) { + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(false, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,58)); + } + } else { + globalint_1074 = 2; + setWidgetSprite(1231, new WidgetPointer(475,28)); + setWidgetText(new WidgetPointer(475,29), "You are now in Fine Control Mode"); + if (isWidgetHidden(new WidgetPointer(475,33))) { + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(false, new WidgetPointer(475,100)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } + } + setScriptCallOnGameloop(2853, new WidgetPointer(arg0), getClientCycle(), "Ii", new WidgetPointer(arg0)); + break; + case 83: + if (((boolean)globalint_1074)) { + if (isWidgetHidden(new WidgetPointer(475,54))) { + setWidgetIsHidden(false, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,7)); + setWidgetIsHidden(false, new WidgetPointer(475,58)); + } else { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(true, new WidgetPointer(475,7)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } + } else if (((boolean)globalint_1074)) { + if (isWidgetHidden(new WidgetPointer(475,33))) { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(false, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,7)); + setWidgetIsHidden(false, new WidgetPointer(475,58)); + } else { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(true, new WidgetPointer(475,7)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } + } else { + if (globalint_1074 == 2) { + if (isWidgetHidden(new WidgetPointer(475,100))) { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(false, new WidgetPointer(475,100)); + setWidgetIsHidden(false, new WidgetPointer(475,7)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } else { + setWidgetIsHidden(true, new WidgetPointer(475,54)); + setWidgetIsHidden(true, new WidgetPointer(475,33)); + setWidgetIsHidden(true, new WidgetPointer(475,100)); + setWidgetIsHidden(true, new WidgetPointer(475,7)); + setWidgetIsHidden(true, new WidgetPointer(475,58)); + } + } + } + break; + } + return; + } + script_2864(); + setScriptCallOnKeyPress(2851, new WidgetPointer(arg0), -2147483640, getClientCycle(), "Iii", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2852.cs2 b/dumps/scripts/2852.cs2 new file mode 100644 index 000000000..0ac8d19fd --- /dev/null +++ b/dumps/scripts/2852.cs2 @@ -0,0 +1,29 @@ +void script_2852(int arg0) { + if ((globalint_1076 < add(globalint_1075, 250)) && (globalint_1076 > subtract(globalint_1075, 250))) { + globalint_1076 = globalint_1075; + } else if (globalint_1076 > globalint_1075) { + if (subtract(globalint_1076, 32768) > globalint_1075) { + globalint_1076 = add(globalint_1076, 250); + if (globalint_1076 > 65535) { + globalint_1076 = subtract(globalint_1076, 63335); + } + } else { + globalint_1076 = subtract(globalint_1076, 250); + if (globalint_1076 < 0) { + globalint_1076 = add(globalint_1076, 63335); + } + } + } else if (add(globalint_1076, 32768) < globalint_1075) { + globalint_1076 = subtract(globalint_1076, 250); + if (globalint_1076 < 0) { + globalint_1076 = add(globalint_1076, 63335); + } + } else { + globalint_1076 = add(globalint_1076, 250); + if (globalint_1076 > 65535) { + globalint_1076 = subtract(globalint_1076, 63335); + } + } + cs2method2106(globalint_1076, new WidgetPointer(475,31)); + return; +} diff --git a/dumps/scripts/2853.cs2 b/dumps/scripts/2853.cs2 new file mode 100644 index 000000000..4ba1b3eb0 --- /dev/null +++ b/dumps/scripts/2853.cs2 @@ -0,0 +1,27 @@ +void script_2853(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = subtract(getClientCycle(), arg1); + ivar3 = 0; + if (ivar2 <= 30) { + if (ivar2 == 5) { + playSoundEffect(2871, 1, 0); + } + ivar3 = subtract(multiply(11, ivar2), 325); + setWidgetPosition(ivar3, 5, 0, 0, new WidgetPointer(475,8)); + return; + } + if (ivar2 < 170) { + return; + } + if (ivar2 < 201) { + if (ivar2 == 5) { + playSoundEffect(2871, 1, 0); + } + ivar3 = subtract(5, multiply(11, subtract(ivar2, 170))); + setWidgetPosition(ivar3, 5, 0, 0, new WidgetPointer(475,8)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2854.cs2 b/dumps/scripts/2854.cs2 new file mode 100644 index 000000000..60ac33781 --- /dev/null +++ b/dumps/scripts/2854.cs2 @@ -0,0 +1,9 @@ +void script_2854() { + if (((boolean)script_2869(addToCoordinate(globalint_1070, 0, 0, 1)))) { + return; + } + if (script_2866(getMyPositionHash(), addToCoordinate(globalint_1070, 0, 0, 1)) < 31) { + globalint_1070 = addToCoordinate(globalint_1070, 0, 0, 1); + } + return; +} diff --git a/dumps/scripts/2855.cs2 b/dumps/scripts/2855.cs2 new file mode 100644 index 000000000..0466f9dad --- /dev/null +++ b/dumps/scripts/2855.cs2 @@ -0,0 +1,9 @@ +void script_2855() { + if (((boolean)script_2869(addToCoordinate(globalint_1070, 0, 0, -1)))) { + return; + } + if (script_2866(getMyPositionHash(), addToCoordinate(globalint_1070, 0, 0, -1)) < 31) { + globalint_1070 = addToCoordinate(globalint_1070, 0, 0, -1); + } + return; +} diff --git a/dumps/scripts/2856.cs2 b/dumps/scripts/2856.cs2 new file mode 100644 index 000000000..131ddeb07 --- /dev/null +++ b/dumps/scripts/2856.cs2 @@ -0,0 +1,9 @@ +void script_2856() { + if (((boolean)script_2869(addToCoordinate(globalint_1070, 1, 0, 0)))) { + return; + } + if (script_2866(getMyPositionHash(), addToCoordinate(globalint_1070, 1, 0, 0)) < 31) { + globalint_1070 = addToCoordinate(globalint_1070, 1, 0, 0); + } + return; +} diff --git a/dumps/scripts/2857.cs2 b/dumps/scripts/2857.cs2 new file mode 100644 index 000000000..6cb057770 --- /dev/null +++ b/dumps/scripts/2857.cs2 @@ -0,0 +1,9 @@ +void script_2857() { + if (((boolean)script_2869(addToCoordinate(globalint_1070, -1, 0, 0)))) { + return; + } + if (script_2866(getMyPositionHash(), addToCoordinate(globalint_1070, -1, 0, 0)) < 31) { + globalint_1070 = addToCoordinate(globalint_1070, -1, 0, 0); + } + return; +} diff --git a/dumps/scripts/2858.cs2 b/dumps/scripts/2858.cs2 new file mode 100644 index 000000000..0579d65cc --- /dev/null +++ b/dumps/scripts/2858.cs2 @@ -0,0 +1,6 @@ +void script_2858() { + if (globalint_1069 < 5000) { + globalint_1069 = add(globalint_1069, 50); + } + return; +} diff --git a/dumps/scripts/2859.cs2 b/dumps/scripts/2859.cs2 new file mode 100644 index 000000000..4bcfc55c4 --- /dev/null +++ b/dumps/scripts/2859.cs2 @@ -0,0 +1,9 @@ +void script_2859() { + if (globalint_1069 >= 100) { + globalint_1069 = subtract(globalint_1069, 50); + } + if (globalint_1073 > globalint_1069) { + globalint_1073 = globalint_1069; + } + return; +} diff --git a/dumps/scripts/286.cs2 b/dumps/scripts/286.cs2 new file mode 100644 index 000000000..306dd7e94 --- /dev/null +++ b/dumps/scripts/286.cs2 @@ -0,0 +1,23 @@ +void script_286(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6) { + if (arg0 != 1) { + return; + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetContextMenuOption(1, arg6); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg3)) { + setWidgetContextMenuOption(1, arg6); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg4)) { + if (((boolean)arg5)) { + setWidgetHidden(0); + } else { + setWidgetHidden(1); + } + } + if (arg2 == 11) { + cs2method5231(950, arg5); + } + playSoundEffect(2266, 1, 0); + return; +} diff --git a/dumps/scripts/2860.cs2 b/dumps/scripts/2860.cs2 new file mode 100644 index 000000000..b543f7b43 --- /dev/null +++ b/dumps/scripts/2860.cs2 @@ -0,0 +1,13 @@ +void script_2860() { + if (((boolean)globalint_1074)) { + globalint_1073 = add(globalint_1073, 25); + if (globalint_1073 > globalint_1069) { + globalint_1073 = globalint_1069; + } + } else if (((boolean)globalint_1074)) { + globalint_1072 = addToCoordinate(globalint_1072, 0, 0, 1); + } else { + cs2method5507(); + } + return; +} diff --git a/dumps/scripts/2861.cs2 b/dumps/scripts/2861.cs2 new file mode 100644 index 000000000..ac6497338 --- /dev/null +++ b/dumps/scripts/2861.cs2 @@ -0,0 +1,13 @@ +void script_2861() { + if (((boolean)globalint_1074)) { + globalint_1073 = subtract(globalint_1073, 25); + if (globalint_1073 <= 25) { + globalint_1073 = 25; + } + } else if (((boolean)globalint_1074)) { + globalint_1072 = addToCoordinate(globalint_1072, 0, 0, -1); + } else { + cs2method5508(); + } + return; +} diff --git a/dumps/scripts/2862.cs2 b/dumps/scripts/2862.cs2 new file mode 100644 index 000000000..86ba43406 --- /dev/null +++ b/dumps/scripts/2862.cs2 @@ -0,0 +1,14 @@ +void script_2862() { + if (((boolean)globalint_1074)) { + if (globalint_1071 == 19) { + globalint_1071 = 0; + } else { + globalint_1071 = add(globalint_1071, 1); + } + } else if (((boolean)globalint_1074)) { + globalint_1072 = addToCoordinate(globalint_1072, 1, 0, 0); + } else { + cs2method5509(); + } + return; +} diff --git a/dumps/scripts/2863.cs2 b/dumps/scripts/2863.cs2 new file mode 100644 index 000000000..e6db71c18 --- /dev/null +++ b/dumps/scripts/2863.cs2 @@ -0,0 +1,14 @@ +void script_2863() { + if (((boolean)globalint_1074)) { + if (((boolean)globalint_1071)) { + globalint_1071 = 19; + } else { + globalint_1071 = subtract(globalint_1071, 1); + } + } else if (((boolean)globalint_1074)) { + globalint_1072 = addToCoordinate(globalint_1072, -1, 0, 0); + } else { + cs2method5510(); + } + return; +} diff --git a/dumps/scripts/2864.cs2 b/dumps/scripts/2864.cs2 new file mode 100644 index 000000000..3eeb1e8d0 --- /dev/null +++ b/dumps/scripts/2864.cs2 @@ -0,0 +1,21 @@ +void script_2864() { + int ivar0; + ivar0 = 0; + if (((boolean)globalint_1074)) { + cameraPointAt(script_2865(globalint_1070, globalint_1071), globalint_1073, 0, 25); + cameraMoveTo(globalint_1070, globalint_1069, 0, 25); + ivar0 = script_2867(globalint_1070, script_2865(globalint_1070, globalint_1071)); + } else if (((boolean)globalint_1074)) { + cameraMoveTo(globalint_1070, globalint_1069, 20, 3); + cameraPointAt(globalint_1072, 50, 20, 3); + ivar0 = script_2867(globalint_1070, globalint_1072); + } else { + cameraMethod5511(globalint_1070); + } + if (((boolean)ivar0)) { + globalint_1075 = 0; + } else { + globalint_1075 = multiply(subtract(ivar0, 1), 8191); + } + return; +} diff --git a/dumps/scripts/2865.cs2 b/dumps/scripts/2865.cs2 new file mode 100644 index 000000000..d87fc2328 --- /dev/null +++ b/dumps/scripts/2865.cs2 @@ -0,0 +1,66 @@ +int script_2865(int arg0,int arg1) { + int ivar2; + ivar2 = arg0; + switch (arg1) { + case 0: + ivar2 = addToCoordinate(arg0, 0, 0, 4); + break; + case 1: + ivar2 = addToCoordinate(arg0, 1, 0, 4); + break; + case 2: + ivar2 = addToCoordinate(arg0, 2, 0, 3); + break; + case 3: + ivar2 = addToCoordinate(arg0, 3, 0, 2); + break; + case 4: + ivar2 = addToCoordinate(arg0, 4, 0, 1); + break; + case 5: + ivar2 = addToCoordinate(arg0, 4, 0, 0); + break; + case 6: + ivar2 = addToCoordinate(arg0, 4, 0, -1); + break; + case 7: + ivar2 = addToCoordinate(arg0, 3, 0, -2); + break; + case 8: + ivar2 = addToCoordinate(arg0, 2, 0, -3); + break; + case 9: + ivar2 = addToCoordinate(arg0, 1, 0, -4); + break; + case 10: + ivar2 = addToCoordinate(arg0, 0, 0, -4); + break; + case 11: + ivar2 = addToCoordinate(arg0, -1, 0, -4); + break; + case 12: + ivar2 = addToCoordinate(arg0, -2, 0, -3); + break; + case 13: + ivar2 = addToCoordinate(arg0, -3, 0, -2); + break; + case 14: + ivar2 = addToCoordinate(arg0, -4, 0, -1); + break; + case 15: + ivar2 = addToCoordinate(arg0, -4, 0, 0); + break; + case 16: + ivar2 = addToCoordinate(arg0, -4, 0, 1); + break; + case 17: + ivar2 = addToCoordinate(arg0, -3, 0, 2); + break; + case 18: + ivar2 = addToCoordinate(arg0, -2, 0, 3); + break; + case 19: + ivar2 = addToCoordinate(arg0, -1, 0, 4); + } + return ivar2; +} diff --git a/dumps/scripts/2866.cs2 b/dumps/scripts/2866.cs2 new file mode 100644 index 000000000..92a86135e --- /dev/null +++ b/dumps/scripts/2866.cs2 @@ -0,0 +1,18 @@ +int script_2866(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 0; + ivar3 = 0; + ivar2 = subtract(extractX(arg0), extractX(arg1)); + if (ivar2 < 0) { + ivar2 = multiply(ivar2, -1); + } + ivar3 = subtract(extractY(arg0), extractY(arg1)); + if (ivar3 < 0) { + ivar3 = multiply(ivar3, -1); + } + if (ivar2 > ivar3) { + return ivar2; + } + return ivar3; +} diff --git a/dumps/scripts/2867.cs2 b/dumps/scripts/2867.cs2 new file mode 100644 index 000000000..fa843c959 --- /dev/null +++ b/dumps/scripts/2867.cs2 @@ -0,0 +1,27 @@ +int script_2867(int arg0,int arg1) { + if (arg0 == arg1) { + return 0; + } + if (subtract(extractX(arg0), extractX(arg1)) > multiply(2, multiply(subtract(extractY(arg0), extractY(arg1)), -1))) { + if (subtract(extractX(arg0), extractX(arg1)) > multiply(2, subtract(extractY(arg0), extractY(arg1)))) { + return 7; + } + if (multiply(2, subtract(extractX(arg0), extractX(arg1))) > subtract(extractY(arg0), extractY(arg1))) { + return 6; + } + if (multiply(2, subtract(extractX(arg0), extractX(arg1))) > multiply(subtract(extractY(arg0), extractY(arg1)), -1)) { + return 5; + } + return 4; + } + if (subtract(extractX(arg0), extractX(arg1)) > multiply(2, subtract(extractY(arg0), extractY(arg1)))) { + if (multiply(2, subtract(extractX(arg0), extractX(arg1))) > subtract(extractY(arg0), extractY(arg1))) { + if (multiply(2, subtract(extractX(arg0), extractX(arg1))) > multiply(subtract(extractY(arg0), extractY(arg1)), -1)) { + return 8; + } + return 1; + } + return 2; + } + return 3; +} diff --git a/dumps/scripts/2868.cs2 b/dumps/scripts/2868.cs2 new file mode 100644 index 000000000..ab006709a --- /dev/null +++ b/dumps/scripts/2868.cs2 @@ -0,0 +1,24 @@ +int script_2868(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar3 = extractX(arg1); + ivar4 = extractX(arg2); + ivar5 = extractY(arg1); + ivar6 = extractY(arg2); + ivar8 = extractX(arg0); + ivar7 = extractY(arg0); + if (((ivar8 <= ivar4) && (ivar8 >= ivar3)) && ((ivar7 <= ivar6) && (ivar7 >= ivar5))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/2869.cs2 b/dumps/scripts/2869.cs2 new file mode 100644 index 000000000..896806ef5 --- /dev/null +++ b/dumps/scripts/2869.cs2 @@ -0,0 +1,9 @@ +int script_2869(int arg0) { + if (((boolean)script_2868(arg0, 35884240, 37440815))) { + return 1; + } + if (((boolean)script_2868(arg0, 52513484, 53398263))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/287.cs2 b/dumps/scripts/287.cs2 new file mode 100644 index 000000000..a8f735150 --- /dev/null +++ b/dumps/scripts/287.cs2 @@ -0,0 +1,8 @@ +void script_287(int arg0,int arg1,int arg2,int arg3) { + createExtraChild(new WidgetPointer(arg2), 5, arg0); + setWidgetSize(17, 17, 0, 0); + setWidgetPosition(4, add(arg3, 4), 0, 0); + setWidgetHidden(arg1); + setWidgetSprite(1726); + return; +} diff --git a/dumps/scripts/2870.cs2 b/dumps/scripts/2870.cs2 new file mode 100644 index 000000000..350fb50d4 --- /dev/null +++ b/dumps/scripts/2870.cs2 @@ -0,0 +1,8 @@ +void script_2870(int arg0,int arg1) { + if (getClientCycle() >= arg1) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + } + return; +} diff --git a/dumps/scripts/2871.cs2 b/dumps/scripts/2871.cs2 new file mode 100644 index 000000000..49757c783 --- /dev/null +++ b/dumps/scripts/2871.cs2 @@ -0,0 +1,11 @@ +void script_2871(int arg0) { + if (((boolean)arg0)) { + if (((boolean)globalint_1077)) { + globalint_1077 = 0; + } else { + globalint_1077 = 1; + } + } + script_2872(); + return; +} diff --git a/dumps/scripts/2872.cs2 b/dumps/scripts/2872.cs2 new file mode 100644 index 000000000..5f596c1d8 --- /dev/null +++ b/dumps/scripts/2872.cs2 @@ -0,0 +1,31 @@ +void script_2872() { + if (((boolean)globalint_1077)) { + setWidgetSprite(2432, new WidgetPointer(187,12)); + script_2878(); + setWidgetIsHidden(true, new WidgetPointer(187,1)); + setWidgetIsHidden(true, new WidgetPointer(187,2)); + setWidgetIsHidden(true, new WidgetPointer(187,17)); + setWidgetIsHidden(true, new WidgetPointer(187,18)); + setWidgetIsHidden(false, new WidgetPointer(187,9)); + setWidgetIsHidden(false, new WidgetPointer(187,10)); + setWidgetIsHidden(false, new WidgetPointer(187,11)); + setWidgetIsHidden(false, new WidgetPointer(187,13)); + script_3683(); + if (bitconfig_7081 == 32767) { + setWidgetIsHidden(false, new WidgetPointer(187,14)); + } + } else { + setWidgetSprite(2431, new WidgetPointer(187,12)); + setWidgetIsHidden(true, new WidgetPointer(187,9)); + setWidgetIsHidden(true, new WidgetPointer(187,10)); + setWidgetIsHidden(true, new WidgetPointer(187,11)); + setWidgetIsHidden(true, new WidgetPointer(187,13)); + setWidgetIsHidden(true, new WidgetPointer(187,14)); + setWidgetIsHidden(true, new WidgetPointer(187,18)); + setWidgetIsHidden(false, new WidgetPointer(187,1)); + setWidgetIsHidden(false, new WidgetPointer(187,2)); + setWidgetIsHidden(false, new WidgetPointer(187,17)); + } + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/2873.cs2 b/dumps/scripts/2873.cs2 new file mode 100644 index 000000000..a56bbc669 --- /dev/null +++ b/dumps/scripts/2873.cs2 @@ -0,0 +1,9 @@ +void script_2873() { + if (((boolean)bitconfig_7078)) { + setWidgetSprite(2434, new WidgetPointer(187,10)); + } else { + setWidgetSprite(2433, new WidgetPointer(187,10)); + } + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/2874.cs2 b/dumps/scripts/2874.cs2 new file mode 100644 index 000000000..ecac32590 --- /dev/null +++ b/dumps/scripts/2874.cs2 @@ -0,0 +1,9 @@ +void script_2874() { + if (((boolean)bitconfig_7078)) { + setWidgetSprite(2434, new WidgetPointer(187,10)); + } else { + setWidgetSprite(2433, new WidgetPointer(187,10)); + } + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/2875.cs2 b/dumps/scripts/2875.cs2 new file mode 100644 index 000000000..f932615f9 --- /dev/null +++ b/dumps/scripts/2875.cs2 @@ -0,0 +1,9 @@ +void script_2875() { + if (((boolean)bitconfig_7079)) { + setWidgetSprite(2437, new WidgetPointer(187,13)); + } else { + setWidgetSprite(2436, new WidgetPointer(187,13)); + } + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/2876.cs2 b/dumps/scripts/2876.cs2 new file mode 100644 index 000000000..37b451314 --- /dev/null +++ b/dumps/scripts/2876.cs2 @@ -0,0 +1,9 @@ +void script_2876() { + if (((boolean)bitconfig_7079)) { + setWidgetSprite(2437, new WidgetPointer(187,13)); + } else { + setWidgetSprite(2436, new WidgetPointer(187,13)); + } + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/2877.cs2 b/dumps/scripts/2877.cs2 new file mode 100644 index 000000000..0c7eabff3 --- /dev/null +++ b/dumps/scripts/2877.cs2 @@ -0,0 +1,4 @@ +void script_2877() { + script_2878(); + return; +} diff --git a/dumps/scripts/2878.cs2 b/dumps/scripts/2878.cs2 new file mode 100644 index 000000000..01decd238 --- /dev/null +++ b/dumps/scripts/2878.cs2 @@ -0,0 +1,34 @@ +void script_2878() { + int ivar0; + script_41(12255248); + globalint_1 = 0; + deleteAllExtraChilds(new WidgetPointer(187,9)); + while (getExtraChildGap(new WidgetPointer(187,9)) < 12) { + createExtraChild(new WidgetPointer(187,9), 4, getExtraChildGap(new WidgetPointer(187,9))); + } + while (getExtraChildGap(new WidgetPointer(187,9)) < 24) { + createExtraChild(new WidgetPointer(187,9), 5, getExtraChildGap(new WidgetPointer(187,9))); + } + ivar0 = 5; + ivar0 = script_2879(0, bitconfig_7081, ivar0); + ivar0 = script_2879(1, bitconfig_7082, ivar0); + ivar0 = script_2879(2, bitconfig_7083, ivar0); + ivar0 = script_2879(3, bitconfig_7084, ivar0); + ivar0 = script_2879(4, bitconfig_7085, ivar0); + ivar0 = script_2879(5, bitconfig_7086, ivar0); + ivar0 = script_2879(6, bitconfig_7087, ivar0); + ivar0 = script_2879(7, bitconfig_7088, ivar0); + ivar0 = script_2879(8, bitconfig_7089, ivar0); + ivar0 = script_2879(9, bitconfig_7090, ivar0); + ivar0 = script_2879(10, bitconfig_7091, ivar0); + ivar0 = script_2879(11, bitconfig_7092, ivar0); + if ((bitconfig_7081 == 32767) && ((boolean)globalint_1077)) { + setWidgetIsHidden(false, new WidgetPointer(187,14)); + } else { + setWidgetIsHidden(true, new WidgetPointer(187,14)); + } + createExtraChild(new WidgetPointer(187,9), 4, getExtraChildGap(new WidgetPointer(187,9))); + setWidgetPosition(15, ivar0, 0, 0); + setWidgetSize(150, ivar0, 0, 1); + return; +} diff --git a/dumps/scripts/2879.cs2 b/dumps/scripts/2879.cs2 new file mode 100644 index 000000000..5f1b76d27 --- /dev/null +++ b/dumps/scripts/2879.cs2 @@ -0,0 +1,41 @@ +int script_2879(int arg0,int arg1,int arg2) { + string svar0; + svar0 = "Remove from Playlist"; + if (setWidgetRegister(new WidgetPointer(187,9), arg0) && setWidgetRegister(new WidgetPointer(187,9), add(arg0, 12))) { + if (arg1 == 32767) { + setWidgetHidden(1); + setWidgetHidden(1); + return arg2; + } + setWidgetPosition(15, arg2, 0, 0); + setWidgetTextAlignment(0, 1, 0); + if ((bitconfig_4388 == arg1) && ((boolean)bitconfig_7078)) { + setWidgetRGB(new Color(255, 255, 102)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16777062, "Iii"); + } else { + setWidgetRGB(new Color(0, 255, 255)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 65535, "Iii"); + } + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setWidgetText(getCommonString(1345, arg1)); + setWidgetSize(150, 15, 0, 0); + setWidgetContextMenuOption(1, "Play"); + setWidgetContextMenuOption(2, "Remove"); + cs2method1305(getCommonString(1345, arg1)); + cs2method1305(getCommonString(1345, arg1)); + setWidgetUnknownBoolean(false); + setWidgetFont(494); + cs2method1301(12255241, -1); + cs2method1301(-1, -1); + cs2method1302(2); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(2, add(arg2, 1), 0, 0); + setWidgetContextMenuOption(2, "Remove"); + setWidgetSprite(2430); + setScriptCallOnClickContextMenu(2885, new WidgetPointer(-32768,3), -2147483643, 150, 0, 20, -2147483644, "Iiiiii"); + setScriptCallOnMouseOver(1160, new WidgetPointer(187,9), -2147483643, new WidgetPointer(187,16), svar0, 25, 189, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(187,16), "I"); + setScriptCallOnMousePressed(40, new WidgetPointer(187,16), "I"); + } + return add(arg2, 15); +} diff --git a/dumps/scripts/288.cs2 b/dumps/scripts/288.cs2 new file mode 100644 index 000000000..3fb5f8bb9 --- /dev/null +++ b/dumps/scripts/288.cs2 @@ -0,0 +1,4 @@ +void script_288(int arg0) { + cs2method5230(arg0); + return; +} diff --git a/dumps/scripts/2880.cs2 b/dumps/scripts/2880.cs2 new file mode 100644 index 000000000..aed755325 --- /dev/null +++ b/dumps/scripts/2880.cs2 @@ -0,0 +1,4 @@ +void script_2880() { + script_2881(); + return; +} diff --git a/dumps/scripts/2881.cs2 b/dumps/scripts/2881.cs2 new file mode 100644 index 000000000..6148777aa --- /dev/null +++ b/dumps/scripts/2881.cs2 @@ -0,0 +1,11 @@ +void script_2881() { + if (((boolean)bitconfig_4393) || ((boolean)bitconfig_542)) { + return; + } + if (((boolean)globalint_1077)) { + script_39(12255244, 12255248, 25, 189, "Click here to access full song list"); + } else { + script_39(12255244, 12255248, 25, 189, "Click here to access playlist"); + } + return; +} diff --git a/dumps/scripts/2882.cs2 b/dumps/scripts/2882.cs2 new file mode 100644 index 000000000..b4032371e --- /dev/null +++ b/dumps/scripts/2882.cs2 @@ -0,0 +1,11 @@ +void script_2882() { + if (((boolean)bitconfig_4393) || ((boolean)bitconfig_542)) { + return; + } + if (((boolean)bitconfig_7078)) { + script_39(12255242, 12255248, 25, 189, "Playlist on"); + } else { + script_39(12255242, 12255248, 25, 189, "Playlist off"); + } + return; +} diff --git a/dumps/scripts/2883.cs2 b/dumps/scripts/2883.cs2 new file mode 100644 index 000000000..e156d991c --- /dev/null +++ b/dumps/scripts/2883.cs2 @@ -0,0 +1,7 @@ +void script_2883() { + if (((boolean)bitconfig_4393) || ((boolean)bitconfig_542)) { + return; + } + script_39(12255243, 12255248, 25, 189, "Clear playlist"); + return; +} diff --git a/dumps/scripts/2884.cs2 b/dumps/scripts/2884.cs2 new file mode 100644 index 000000000..3226a769a --- /dev/null +++ b/dumps/scripts/2884.cs2 @@ -0,0 +1,11 @@ +void script_2884() { + if (((boolean)bitconfig_4393) || ((boolean)bitconfig_542)) { + return; + } + if (((boolean)bitconfig_7079)) { + script_39(12255245, 12255248, 25, 189, "Shuffle on"); + } else { + script_39(12255245, 12255248, 25, 189, "Shuffle off"); + } + return; +} diff --git a/dumps/scripts/2885.cs2 b/dumps/scripts/2885.cs2 new file mode 100644 index 000000000..ba4dbae99 --- /dev/null +++ b/dumps/scripts/2885.cs2 @@ -0,0 +1,13 @@ +void script_2885(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (((arg5 != 2) && (arg5 != 3)) && (arg5 != 4)) { + return; + } + script_41(12255248); + globalint_1 = 0; + arg4 = add(arg4, getClientCycle()); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + cs2method2103(arg2); + setScriptCallOnGameloop(1621, new WidgetPointer(arg0), arg1, arg3, arg4, "Iiii"); + } + return; +} diff --git a/dumps/scripts/2886.cs2 b/dumps/scripts/2886.cs2 new file mode 100644 index 000000000..0bbd2c64a --- /dev/null +++ b/dumps/scripts/2886.cs2 @@ -0,0 +1,11 @@ +void script_2886() { + int ivar0; + globalint_1078 = bitconfig_7189; + globalint_1086 = 0; + ivar0 = getClientCycle(); + setScriptCallOnGameloop(2892, new WidgetPointer(476,24), ivar0, "Ii", new WidgetPointer(476,24)); + playSoundEffect(8641, 1, 0); + setScriptCallOnWidgetResize(2887, "", new WidgetPointer(476,0)); + script_2888(); + return; +} diff --git a/dumps/scripts/2887.cs2 b/dumps/scripts/2887.cs2 new file mode 100644 index 000000000..a81ab14bd --- /dev/null +++ b/dumps/scripts/2887.cs2 @@ -0,0 +1,4 @@ +void script_2887() { + script_2888(); + return; +} diff --git a/dumps/scripts/2888.cs2 b/dumps/scripts/2888.cs2 new file mode 100644 index 000000000..7cd4c3b8a --- /dev/null +++ b/dumps/scripts/2888.cs2 @@ -0,0 +1,10 @@ +void script_2888() { + if (getDisplayMode() >= 2) { + setWidgetPosition(0, 287, 0, 0, new WidgetPointer(476,56)); + setWidgetPosition(0, 254, 0, 0, new WidgetPointer(476,55)); + } else { + setWidgetPosition(18, 40, 2, 0, new WidgetPointer(476,56)); + setWidgetPosition(18, 7, 2, 0, new WidgetPointer(476,55)); + } + return; +} diff --git a/dumps/scripts/2889.cs2 b/dumps/scripts/2889.cs2 new file mode 100644 index 000000000..81836d7e5 --- /dev/null +++ b/dumps/scripts/2889.cs2 @@ -0,0 +1,26 @@ +void script_2889() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = cs2method_3408(105, 110, 927, bitconfig_7099); + ivar1 = -1; + ivar2 = -1; + if (ivar0 != -1) { + if (getNpcNodemapData(ivar0, 956) != -1) { + setWidgetModel(cs2method_3408(110, 109, 934, getNpcNodemapData(ivar0, 956)), new WidgetPointer(476,45)); + setWidgetAnimation(cs2method_3408(110, 65, 935, getNpcNodemapData(ivar0, 956)), new WidgetPointer(476,45)); + setWidgetSprite(cs2method_3408(110, 100, 932, getNpcNodemapData(ivar0, 956)), new WidgetPointer(476,49)); + setWidgetText(new WidgetPointer(476,52), cs2method_3408(110, 115, 930, getNpcNodemapData(ivar0, 956))); + } + if (getNpcNodemapData(ivar0, 957) != -1) { + setWidgetModel(cs2method_3408(110, 109, 934, getNpcNodemapData(ivar0, 957)), new WidgetPointer(476,46)); + setWidgetAnimation(cs2method_3408(110, 65, 935, getNpcNodemapData(ivar0, 957)), new WidgetPointer(476,46)); + setWidgetSprite(cs2method_3408(110, 100, 932, getNpcNodemapData(ivar0, 957)), new WidgetPointer(476,50)); + setWidgetText(new WidgetPointer(476,53), cs2method_3408(110, 115, 930, getNpcNodemapData(ivar0, 957))); + } + setWidgetSprite(cs2method_3408(110, 100, 933, ivar0), new WidgetPointer(476,48)); + setWidgetModel(cs2method_3408(110, 109, 934, ivar0), new WidgetPointer(476,44)); + setWidgetAnimation(cs2method_3408(110, 65, 935, ivar0), new WidgetPointer(476,44)); + } + return; +} diff --git a/dumps/scripts/289.cs2 b/dumps/scripts/289.cs2 new file mode 100644 index 000000000..aeb5a3d9b --- /dev/null +++ b/dumps/scripts/289.cs2 @@ -0,0 +1,7 @@ +void script_289(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetRGB(new Color(arg2)); + } + script_41(49479737); + return; +} diff --git a/dumps/scripts/2890.cs2 b/dumps/scripts/2890.cs2 new file mode 100644 index 000000000..11aa10468 --- /dev/null +++ b/dumps/scripts/2890.cs2 @@ -0,0 +1,91 @@ +void script_2890() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + ivar0 = -1; + ivar1 = 0; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = 1; + ivar9 = 0; + ivar10 = 31195136; + while (ivar8 <= getCommonDefinitionSize(929)) { + if ((((ivar8 != globalint_1080) && (ivar8 != globalint_1081)) && ((ivar8 != globalint_1082) && (ivar8 != globalint_1083))) && (((ivar8 != globalint_1084) && (ivar8 != globalint_1085)) && isBitFlagged(standart_config_1632, ivar8))) { + ivar0 = cs2method_3408(105, 110, 929, ivar8); + if ((ivar0 != -1) && (ivar1 < 6)) { + ivar1 = add(ivar1, 1); + if (globalint_1080 == -1) { + globalint_1080 = ivar8; + } else if (globalint_1081 == -1) { + globalint_1081 = ivar8; + } else if (globalint_1082 == -1) { + globalint_1082 = ivar8; + } else if (globalint_1083 == -1) { + globalint_1083 = ivar8; + } else if (globalint_1084 == -1) { + globalint_1084 = ivar8; + } else { + if (globalint_1085 == -1) { + globalint_1085 = ivar8; + } + } + ivar0 = -1; + } + } + ivar8 = add(ivar8, 1); + } + ivar8 = 1; + ivar11 = 0; + while (ivar8 <= 6) { + ivar10 = ((int)cs2method_3408(105, 73, 925, ivar8)); + if ((ivar10 != 31195136) && (getWidgetSpriteId(new WidgetPointer(ivar10)) == -1)) { + switch (ivar8) { + case 1: + ivar0 = cs2method_3408(105, 110, 929, globalint_1080); + break; + case 2: + ivar0 = cs2method_3408(105, 110, 929, globalint_1081); + break; + case 3: + ivar0 = cs2method_3408(105, 110, 929, globalint_1082); + break; + case 4: + ivar0 = cs2method_3408(105, 110, 929, globalint_1083); + break; + case 5: + ivar0 = cs2method_3408(105, 110, 929, globalint_1084); + break; + case 6: + ivar0 = cs2method_3408(105, 110, 929, globalint_1085); + } + if (ivar0 != -1) { + setWidgetSprite(cs2method_3408(110, 100, 932, ivar0), new WidgetPointer(ivar10)); + setWidgetText(cs2method_3408(73, 73, 926, ivar10), cs2method_3408(110, 115, 930, ivar0)); + setScriptCallOnMouseOver(1160, new WidgetPointer(ivar10), -1, new WidgetPointer(476,59), cs2method_3408(110, 115, 930, ivar0), 25, 200, "IiIsii", new WidgetPointer(ivar10)); + setScriptCallOnMouseExit(40, new WidgetPointer(476,59), "I", new WidgetPointer(ivar10)); + if ((ivar10 != 31195149) && (ivar10 != 31195150)) { + setWidgetIsHidden(false, new WidgetPointer(476,17)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar10)), getWidgetActualY(new WidgetPointer(ivar10)), 0, 0, new WidgetPointer(476,17)); + script_1725(31195153); + ivar11 = add(getClientCycle(), 150); + setScriptCallOnGameloop(2891, ivar11, new WidgetPointer(ivar10), "iI", new WidgetPointer(ivar10)); + } + } + } + ivar8 = add(ivar8, 1); + } + return; +} diff --git a/dumps/scripts/2891.cs2 b/dumps/scripts/2891.cs2 new file mode 100644 index 000000000..8c7876b0e --- /dev/null +++ b/dumps/scripts/2891.cs2 @@ -0,0 +1,8 @@ +void script_2891(int arg0,int arg1) { + if (getClientCycle() >= arg0) { + script_1728(31195153); + setWidgetIsHidden(true, new WidgetPointer(476,17)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2892.cs2 b/dumps/scripts/2892.cs2 new file mode 100644 index 000000000..326210c48 --- /dev/null +++ b/dumps/scripts/2892.cs2 @@ -0,0 +1,10 @@ +void script_2892(int arg0,int arg1) { + if (subtract(getClientCycle(), arg1) >= 180) { + globalint_1086 = 1; + } + if (subtract(getClientCycle(), arg1) >= 1000) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(476,24)); + setWidgetIsHidden(true, new WidgetPointer(476,24)); + } + return; +} diff --git a/dumps/scripts/2893.cs2 b/dumps/scripts/2893.cs2 new file mode 100644 index 000000000..3036c2a13 --- /dev/null +++ b/dumps/scripts/2893.cs2 @@ -0,0 +1,8 @@ +void script_2893() { + if (((boolean)globalint_1086)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(476,24)); + setWidgetIsHidden(true, new WidgetPointer(476,24)); + globalint_1086 = 0; + } + return; +} diff --git a/dumps/scripts/2894.cs2 b/dumps/scripts/2894.cs2 new file mode 100644 index 000000000..aeb608236 --- /dev/null +++ b/dumps/scripts/2894.cs2 @@ -0,0 +1,6 @@ +void script_2894(int arg0) { + if (bitconfig_7093 >= 0) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_7093)); + } + return; +} diff --git a/dumps/scripts/2895.cs2 b/dumps/scripts/2895.cs2 new file mode 100644 index 000000000..497da8cb4 --- /dev/null +++ b/dumps/scripts/2895.cs2 @@ -0,0 +1,13 @@ +void script_2895(int arg0) { + if (globalint_1078 > bitconfig_7189) { + if (globalint_1079 != 1) { + setScriptCallOnGameloop(2896, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + globalint_1079 = 1; + } + } else { + if (((boolean)globalint_1078)) { + globalint_1078 = bitconfig_7189; + } + } + return; +} diff --git a/dumps/scripts/2896.cs2 b/dumps/scripts/2896.cs2 new file mode 100644 index 000000000..40b3621e3 --- /dev/null +++ b/dumps/scripts/2896.cs2 @@ -0,0 +1,12 @@ +void script_2896(int arg0) { + if (((boolean)mod(getClientCycle(), 5))) { + if (multiplyDivide(globalint_1078, 2000, 200) > multiplyDivide(bitconfig_7189, 2000, 200)) { + setWidgetSize(20, multiplyDivide(globalint_1078, 2000, 200), 0, 0, new WidgetPointer(arg0)); + globalint_1078 = subtract(globalint_1078, 1); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + globalint_1079 = 0; + } + } + return; +} diff --git a/dumps/scripts/2897.cs2 b/dumps/scripts/2897.cs2 new file mode 100644 index 000000000..85842fc1a --- /dev/null +++ b/dumps/scripts/2897.cs2 @@ -0,0 +1,5 @@ +void script_2897(int arg0) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + script_1725(arg0); + return; +} diff --git a/dumps/scripts/2898.cs2 b/dumps/scripts/2898.cs2 new file mode 100644 index 000000000..387931880 --- /dev/null +++ b/dumps/scripts/2898.cs2 @@ -0,0 +1,5 @@ +void script_2898(int arg0) { + script_1728(arg0); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2899.cs2 b/dumps/scripts/2899.cs2 new file mode 100644 index 000000000..c43279b3c --- /dev/null +++ b/dumps/scripts/2899.cs2 @@ -0,0 +1,8 @@ +void script_2899() { + int ivar0; + setWidgetIsHidden(false, new WidgetPointer(476,58)); + cs2method2103(0, new WidgetPointer(476,58)); + ivar0 = getClientCycle(); + setScriptCallOnGameloop(2900, ivar0, "i", new WidgetPointer(476,58)); + return; +} diff --git a/dumps/scripts/29.cs2 b/dumps/scripts/29.cs2 new file mode 100644 index 000000000..cc2e6be4f --- /dev/null +++ b/dumps/scripts/29.cs2 @@ -0,0 +1,4 @@ +void script_29() { + script_675(); + return; +} diff --git a/dumps/scripts/290.cs2 b/dumps/scripts/290.cs2 new file mode 100644 index 000000000..628bdf7a4 --- /dev/null +++ b/dumps/scripts/290.cs2 @@ -0,0 +1,4 @@ +void script_290(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_291(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/2900.cs2 b/dumps/scripts/2900.cs2 new file mode 100644 index 000000000..756f5f285 --- /dev/null +++ b/dumps/scripts/2900.cs2 @@ -0,0 +1,11 @@ +void script_2900(int arg0) { + if (getClientCycle() > add(arg0, 200)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(476,58)); + setWidgetIsHidden(true, new WidgetPointer(476,58)); + } else { + if (getClientCycle() > add(arg0, 150)) { + cs2method2103(min(add(getWidgetShadeColor(new WidgetPointer(476,58)), 10), 255), new WidgetPointer(476,58)); + } + } + return; +} diff --git a/dumps/scripts/2901.cs2 b/dumps/scripts/2901.cs2 new file mode 100644 index 000000000..7b817859b --- /dev/null +++ b/dumps/scripts/2901.cs2 @@ -0,0 +1,5 @@ +void script_2901(int arg0,int arg1,string arg2) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg1), arg2); + return; +} diff --git a/dumps/scripts/2902.cs2 b/dumps/scripts/2902.cs2 new file mode 100644 index 000000000..161752622 --- /dev/null +++ b/dumps/scripts/2902.cs2 @@ -0,0 +1,7 @@ +void script_2902(int arg0,int arg1,int arg2) { + if (globalint_1087 != arg2) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + setWidgetText(new WidgetPointer(arg1), ""); + return; +} diff --git a/dumps/scripts/2903.cs2 b/dumps/scripts/2903.cs2 new file mode 100644 index 000000000..5934e329e --- /dev/null +++ b/dumps/scripts/2903.cs2 @@ -0,0 +1,18 @@ +void script_2903(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + if (globalint_1087 == arg8) { + globalint_1087 = 0; + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } else { + globalint_1087 = arg8; + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + setWidgetIsHidden(true, new WidgetPointer(arg6)); + setWidgetIsHidden(true, new WidgetPointer(arg7)); + return; +} diff --git a/dumps/scripts/2904.cs2 b/dumps/scripts/2904.cs2 new file mode 100644 index 000000000..bba50a95b --- /dev/null +++ b/dumps/scripts/2904.cs2 @@ -0,0 +1,12 @@ +void script_2904(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + globalint_1087 = 0; + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + setWidgetIsHidden(true, new WidgetPointer(arg6)); + setWidgetIsHidden(true, new WidgetPointer(arg7)); + return; +} diff --git a/dumps/scripts/2905.cs2 b/dumps/scripts/2905.cs2 new file mode 100644 index 000000000..bd83c39fd --- /dev/null +++ b/dumps/scripts/2905.cs2 @@ -0,0 +1,31 @@ +void script_2905(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + ivar4 = getWidgetParentId(new WidgetPointer(arg0)); + ivar5 = 0; + if (arg1 == 10010) { + switch (bitconfig_7193) { + case 1: + ivar5 = 1; + break; + case 2: + ivar5 = 1; + arg1 = 11259; + } + } else if (arg1 == 11262) { + ivar5 = bitconfig_7192; + } else { + if (arg1 == 11260) { + ivar5 = bitconfig_7194; + } + } + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + setItemOnWidgetMethod2205(arg1, -1, new WidgetPointer(arg0)); + setWidgetBorderThickness(1, new WidgetPointer(arg0)); + if (ivar5 > 0) { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg3)); + } else { + setWidgetRGB(new Color(204, 0, 0), new WidgetPointer(arg3)); + } + return; +} diff --git a/dumps/scripts/2906.cs2 b/dumps/scripts/2906.cs2 new file mode 100644 index 000000000..dad7d0fbf --- /dev/null +++ b/dumps/scripts/2906.cs2 @@ -0,0 +1,32 @@ +void script_2906(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = getWidgetParentId(new WidgetPointer(arg0)); + ivar4 = 0; + if (arg1 == 10010) { + ivar4 = add(getItemAmtInContainer(94, 11259), getItemAmtInContainer(93, 11259)); + if (ivar4 > 0) { + arg1 = 11259; + } + } + switch (arg1) { + case 11259: + case 10010: + if (((boolean)ivar4)) { + ivar4 = add(getItemAmtInContainer(93, 10010), getItemAmtInContainer(94, 10010)); + } + break; + default: + ivar4 = getItemAmtInContainer(93, arg1); + } + setWidgetText(new WidgetPointer(arg2), getItemName(arg1)); + if (ivar4 > 0) { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg2)); + setItemOnWidgetMethod2200(arg1, ivar4, new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(204, 0, 0), new WidgetPointer(arg2)); + setItemOnWidgetMethod2200(arg1, -1, new WidgetPointer(arg0)); + } + setWidgetBorderThickness(1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2907.cs2 b/dumps/scripts/2907.cs2 new file mode 100644 index 000000000..3eafa8443 --- /dev/null +++ b/dumps/scripts/2907.cs2 @@ -0,0 +1,5 @@ +void script_2907(int arg0,int arg1) { + setWidgetText(new WidgetPointer(arg1), ""); + cs2method2103(0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2908.cs2 b/dumps/scripts/2908.cs2 new file mode 100644 index 000000000..43bdc51d3 --- /dev/null +++ b/dumps/scripts/2908.cs2 @@ -0,0 +1,8 @@ +void script_2908(int arg0) { + if (((boolean)bitconfig_7191)) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2909.cs2 b/dumps/scripts/2909.cs2 new file mode 100644 index 000000000..ec23dda4c --- /dev/null +++ b/dumps/scripts/2909.cs2 @@ -0,0 +1,10 @@ +void script_2909(int arg0,int arg1) { + if (((boolean)bitconfig_7191)) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else if (bitconfig_7191 < 5) { + setWidgetText(new WidgetPointer(arg1), "" + "1 min"); + } else { + setWidgetText(new WidgetPointer(arg1), intToStr(divide(add(bitconfig_7191, 4), 5)) + " min"); + } + return; +} diff --git a/dumps/scripts/291.cs2 b/dumps/scripts/291.cs2 new file mode 100644 index 000000000..670208f45 --- /dev/null +++ b/dumps/scripts/291.cs2 @@ -0,0 +1,77 @@ +void script_291(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + setWidgetText(new WidgetPointer(755,20), cs2method5207(cs2method5235())); + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + if (((boolean)arg0)) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetSprite(773, new WidgetPointer(755,21)); + setScriptCallOnMousePressed(290, 1, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "1IIIII", new WidgetPointer(755,21)); + setScriptCallOnMousePressed(290, 1, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "1IIIII", new WidgetPointer(755,20)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetSprite(788, new WidgetPointer(755,21)); + setScriptCallOnMousePressed(290, 0, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "1IIIII", new WidgetPointer(755,21)); + setScriptCallOnMousePressed(290, 0, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "1IIIII", new WidgetPointer(755,20)); + globalarray_0 = new int[add(41, 1)]; + globalarray_0[0] = 0; + ivar6 = 1; + ivar7 = 1; + ivar8 = -1; + while (ivar6 <= 41) { + ivar8 = cs2method_3408(105, 96, 708, ivar6); + if (ivar8 != -1) { + globalarray_0[ivar7] = ivar6; + ivar7 = add(ivar7, 1); + } + ivar6 = add(ivar6, 1); + } + script_293(0, 1, subtract(ivar7, 1)); + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(0, 20, 1, 0); + setWidgetFont(496); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 11513775, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + ivar8 = cs2method_3408(105, 96, 708, globalarray_0[0]); + setWidgetText(cs2method5207(ivar8)); + setScriptCallOnMousePressed(294, ivar8, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "`IIIII"); + script_309(ivar8, arg2, 0); + ivar9 = getWidgetActualHeight(); + ivar10 = 0; + ivar6 = 1; + while (ivar6 < ivar7) { + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetPosition(0, ivar9, 1, 0); + setWidgetSize(0, 20, 1, 0); + setWidgetFont(495); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 11513775, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + ivar8 = cs2method_3408(105, 96, 708, globalarray_0[ivar6]); + setWidgetText(cs2method5207(ivar8)); + setScriptCallOnMousePressed(294, ivar8, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "`IIIII"); + if (ivar8 == cs2method5235()) { + ivar10 = ivar9; + } + script_309(ivar8, arg2, ivar9); + ivar9 = add(ivar9, getWidgetActualHeight()); + ivar6 = add(ivar6, 1); + } + setWidgetScrollMax(0, ivar9, new WidgetPointer(arg2)); + ivar9 = max(ivar9, 20); + ivar9 = add(ivar9, 3); + ivar9 = min(ivar9, 150); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg1)), ivar9, 0, 0, new WidgetPointer(arg1)); + script_31(arg3, arg2, 792, 789, 790, 791, 773, 788); + script_157(arg3, arg2, ivar10, 1); + return; +} diff --git a/dumps/scripts/2910.cs2 b/dumps/scripts/2910.cs2 new file mode 100644 index 000000000..cc189bdd9 --- /dev/null +++ b/dumps/scripts/2910.cs2 @@ -0,0 +1,12 @@ +void script_2910(int arg0,int arg1) { + if (((boolean)stringMethod4107(getWidgetText(new WidgetPointer(arg1)), "Hide"))) { + setScriptCallOnGameloop(2911, 0, 24, subtract(getWidgetActualHeight(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg0)))), 24), 0, new WidgetPointer(arg0), "1iiiI", new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg1), "Show"); + setWidgetContextMenuOption(1, new WidgetPointer(arg1), "Show"); + } else { + setScriptCallOnGameloop(2911, 1, 24, subtract(getWidgetActualHeight(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg0)))), 24), 0, new WidgetPointer(arg0), "1iiiI", new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg1), "Hide"); + setWidgetContextMenuOption(1, new WidgetPointer(arg1), "Hide"); + } + return; +} diff --git a/dumps/scripts/2911.cs2 b/dumps/scripts/2911.cs2 new file mode 100644 index 000000000..0d4e71105 --- /dev/null +++ b/dumps/scripts/2911.cs2 @@ -0,0 +1,16 @@ +void script_2911(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + ivar5 = 10; + arg3 = add(arg3, 1); + if (((boolean)arg0)) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg4)), add(arg1, divide(multiply(arg2, subtract(ivar5, arg3)), ivar5)), 0, 0, new WidgetPointer(arg4)); + } else { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg4)), add(arg1, divide(multiply(arg2, arg3), ivar5)), 0, 0, new WidgetPointer(arg4)); + } + if (arg3 == ivar5) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg4)); + } else { + setScriptCallOnGameloop(2911, arg0, arg1, arg2, arg3, new WidgetPointer(arg4), "1iiiI", new WidgetPointer(arg4)); + } + return; +} diff --git a/dumps/scripts/2912.cs2 b/dumps/scripts/2912.cs2 new file mode 100644 index 000000000..f29508846 --- /dev/null +++ b/dumps/scripts/2912.cs2 @@ -0,0 +1,4 @@ +void script_2912(int arg0,int arg1) { + script_2914(arg0, arg1, 0); + return; +} diff --git a/dumps/scripts/2913.cs2 b/dumps/scripts/2913.cs2 new file mode 100644 index 000000000..9bbc7ab10 --- /dev/null +++ b/dumps/scripts/2913.cs2 @@ -0,0 +1,4 @@ +void script_2913(int arg0,int arg1) { + script_2914(arg0, arg1, 1); + return; +} diff --git a/dumps/scripts/2914.cs2 b/dumps/scripts/2914.cs2 new file mode 100644 index 000000000..a4cb2b6b1 --- /dev/null +++ b/dumps/scripts/2914.cs2 @@ -0,0 +1,142 @@ +void script_2914(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + ivar3 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar4 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar5 = getExtraChildGap(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(4, 32, 1, 0); + setWidgetSprite(1124); + cs2method1107(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(0, -12, 1, 2); + setWidgetSize(4, 32, 1, 0); + setWidgetSprite(822); + cs2method1107(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(-13, 0, 0, 1); + setWidgetSize(32, 4, 0, 1); + setWidgetSprite(821); + cs2method1107(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(-12, 0, 2, 1); + setWidgetSize(32, 4, 0, 1); + setWidgetSprite(823); + cs2method1107(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(1123); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(1125); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(826); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(827); + ivar5 = add(ivar5, 1); + if (arg2 > 0) { + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(8, 7, 0, 1); + setWidgetSize(1, 30, 0, 1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(200); + setWidgetFilled(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(8, 7, 0, 1); + setWidgetSize(3, 30, 0, 1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(220); + setWidgetFilled(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(8, 7, 0, 1); + setWidgetSize(5, 30, 0, 1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(220); + setWidgetFilled(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(8, 7, 2, 1); + setWidgetSize(7, 30, 0, 1); + setWidgetRGB(new Color(255, 255, 255)); + cs2method2103(250); + setWidgetFilled(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(8, 7, 2, 1); + setWidgetSize(5, 30, 0, 1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(245); + setWidgetFilled(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(8, 7, 2, 1); + setWidgetSize(1, 30, 0, 1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(200); + setWidgetFilled(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(8, 7, 2, 1); + setWidgetSize(3, 30, 0, 1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(220); + setWidgetFilled(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(1, 8, 1, 2); + setWidgetSize(24, 3, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(235); + setWidgetFilled(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(-1, 22, 1, 0); + setWidgetSize(28, 3, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + cs2method2103(250); + setWidgetFilled(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar5); + setWidgetPosition(0, 7, 1, 2); + setWidgetSize(14, 28, 1, 1); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFilled(0); + ivar5 = add(ivar5, 1); + } + if (arg1 > 0) { + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(0, subtract(arg1, 5), 1, 0); + setWidgetSize(4, 32, 1, 0); + setWidgetSprite(828); + cs2method1107(1); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(0, subtract(arg1, 3), 0, 0); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(829); + ivar5 = add(ivar5, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetPosition(0, subtract(arg1, 3), 2, 0); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(830); + ivar5 = add(ivar5, 1); + } + return; +} diff --git a/dumps/scripts/2915.cs2 b/dumps/scripts/2915.cs2 new file mode 100644 index 000000000..facb3984f --- /dev/null +++ b/dumps/scripts/2915.cs2 @@ -0,0 +1,3 @@ +int script_2915() { + return multiply(max(getSkillCurrentLvl(3), 0), 10); +} diff --git a/dumps/scripts/2916.cs2 b/dumps/scripts/2916.cs2 new file mode 100644 index 000000000..6dbfa3098 --- /dev/null +++ b/dumps/scripts/2916.cs2 @@ -0,0 +1,6 @@ +int script_2916() { + if (((boolean)globalint_1533)) { + return multiply(max(getSkillCurrentLvl(3), 0), 10); + } + return multiply(max(getSkillActualLvl(3), 1), 10); +} diff --git a/dumps/scripts/2917.cs2 b/dumps/scripts/2917.cs2 new file mode 100644 index 000000000..ad6e47e63 --- /dev/null +++ b/dumps/scripts/2917.cs2 @@ -0,0 +1,4 @@ +void script_2917(int arg0) { + script_2918(arg0); + return; +} diff --git a/dumps/scripts/2918.cs2 b/dumps/scripts/2918.cs2 new file mode 100644 index 000000000..f74ce14b6 --- /dev/null +++ b/dumps/scripts/2918.cs2 @@ -0,0 +1,24 @@ +void script_2918(int arg0) { + int ivar1; + int ivar2; + ivar1 = 0; + ivar2 = 33; + if (((boolean)arg0)) { + return; + } + ivar2 = 30; + if (getWidgetActualHeight(new WidgetPointer(882,4)) < add(getWidgetActualHeight(new WidgetPointer(882,22)), 146)) { + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(882,8)); + setWidgetPosition(0, add(getWidgetActualY(new WidgetPointer(882,8)), ivar2), 1, 0, new WidgetPointer(882,22)); + setWidgetIsHidden(true, new WidgetPointer(744,23)); + } else { + ivar1 = add(getWidgetActualY(new WidgetPointer(744,23)), getWidgetActualHeight(new WidgetPointer(744,23))); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(882,8)); + if (subtract(getWidgetActualY(new WidgetPointer(882,8)), 2) < ivar1) { + setWidgetPosition(0, add(ivar1, 2), 1, 0, new WidgetPointer(882,8)); + } + setWidgetPosition(0, add(getWidgetActualY(new WidgetPointer(882,8)), ivar2), 1, 0, new WidgetPointer(882,22)); + setWidgetIsHidden(false, new WidgetPointer(744,23)); + } + return; +} diff --git a/dumps/scripts/2919.cs2 b/dumps/scripts/2919.cs2 new file mode 100644 index 000000000..588ba4087 --- /dev/null +++ b/dumps/scripts/2919.cs2 @@ -0,0 +1,23 @@ +void script_2919(int arg0,int arg1) { + int ivar2; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_2692_struct(2,0,0) structdump_3; + cs2func_script_2692_struct(2,0,0) structdump_4; + ivar2 = cs2method6131(); + if (((boolean)arg0)) { + stack_dump0 = ivar2; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar2; + structdump_3 = script_2692(stack_dump2); + script_2596(stack_dump0, stack_dump1, structdump_3.intpart_0, structdump_3.intpart_1, arg1); + } else { + stack_dump0 = ivar2; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar2; + structdump_4 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_4.intpart_0, structdump_4.intpart_1, arg1); + } + return; +} diff --git a/dumps/scripts/292.cs2 b/dumps/scripts/292.cs2 new file mode 100644 index 000000000..274656a66 --- /dev/null +++ b/dumps/scripts/292.cs2 @@ -0,0 +1,11 @@ +int script_292(int arg0,int arg1,int arg2,int arg3) { + if (arg0 == -1) { + arg0 = 280; + } + createExtraChild(new WidgetPointer(arg1), 5, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetPosition(arg3, arg2, 2, 0); + setWidgetSize(20, 20, 0, 0); + cs2method1107(0); + setWidgetSprite(getOtherCommonData(arg0, 130)); + return add(arg3, 10); +} diff --git a/dumps/scripts/2920.cs2 b/dumps/scripts/2920.cs2 new file mode 100644 index 000000000..83f3c1c13 --- /dev/null +++ b/dumps/scripts/2920.cs2 @@ -0,0 +1,43 @@ +void script_2920(int arg0,int arg1,string arg2) { + openInterface(59375696, 914); + script_3181(); + if (strLength(arg2) > 0) { + globalstring_277 = strRemoveEntities(arg2); + } else { + globalstring_277 = ""; + } + setWidgetText(new WidgetPointer(914,27), globalstring_277); + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + script_3161(0); + } + setScriptCallOnKeyPress(3185, -2147483640, false, new WidgetPointer(-32768,3), "izI", new WidgetPointer(914,27)); + setScriptCallOnClickContextMenu(3182, "", new WidgetPointer(914,16)); + globalint_1097 = strLength(globalstring_277); + setScriptCallOnMousePressed(1878, -2147483647, new WidgetPointer(914,27), new WidgetPointer(914,28), "iII", new WidgetPointer(914,27)); + script_1879(59899931, 59899932, globalstring_277); + setWidgetIsHidden(true, new WidgetPointer(914,28)); + if (((boolean)arg0)) { + if (((boolean)globalint_6)) { + setWidgetSprite(4084, new WidgetPointer(914,23)); + } else { + setWidgetSprite(4086, new WidgetPointer(914,23)); + } + if ((arg1 == 5) || (arg1 == 6)) { + setWidgetText(new WidgetPointer(914,22), "Suggest to mute this player for 48 hours"); + } else { + setWidgetText(new WidgetPointer(914,22), "Mute this player for 48 hours"); + } + setWidgetSize(add(getTextWidth(3793, getWidgetText(new WidgetPointer(914,22))), 18), getWidgetActualHeight(new WidgetPointer(914,21)), 0, 0, new WidgetPointer(914,21)); + setWidgetPosition(16, 32, 0, 0, new WidgetPointer(914,14)); + setWidgetPosition(21, 62, 0, 0, new WidgetPointer(914,15)); + setWidgetPosition(299, 60, 0, 0, new WidgetPointer(914,16)); + setWidgetIsHidden(false, new WidgetPointer(914,21)); + } else { + setWidgetPosition(16, 42, 0, 0, new WidgetPointer(914,14)); + setWidgetPosition(21, 82, 0, 0, new WidgetPointer(914,15)); + setWidgetPosition(299, 80, 0, 0, new WidgetPointer(914,16)); + setWidgetIsHidden(true, new WidgetPointer(914,21)); + } + setWidgetIsHidden(false, new WidgetPointer(906,45)); + return; +} diff --git a/dumps/scripts/2921.cs2 b/dumps/scripts/2921.cs2 new file mode 100644 index 000000000..5bf8bd666 --- /dev/null +++ b/dumps/scripts/2921.cs2 @@ -0,0 +1,103 @@ +void script_2921(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + openInterface(59375670, 979); + globalstring_279 = arg2; + script_3397(); + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + script_3161(0); + } + setScriptCallOnKeyPress(3398, -2147483640, false, new WidgetPointer(-32768,3), "izI", new WidgetPointer(979,0)); + setScriptCallOnClickContextMenu(3399, "", new WidgetPointer(979,9)); + ivar2 = 100; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + deleteAllExtraChilds(new WidgetPointer(979,27)); + deleteAllExtraChilds(new WidgetPointer(979,26)); + deleteAllExtraChilds(new WidgetPointer(979,25)); + setWidgetScrollMax(0, 0, new WidgetPointer(979,27)); + cs2method2100(0, 0, new WidgetPointer(979,27)); + while (ivar2 >= 0) { + ivar4 = cs2method5004(ivar2); + if (((((ivar4 != 0) && (ivar4 != 4)) && ((ivar4 != 27) && (ivar4 != 28))) && (((ivar4 != 29) && (ivar4 != 43)) && ((ivar4 != 103) && (ivar4 != 104)))) && ((((ivar4 != 26) && (ivar4 != 30)) && ((ivar4 != 31) && (ivar4 != 115))) && ((stringMethod4107(cs2method5010(ivar2), "") != 0) && (stringMethod4107(cs2method5003(ivar2), "") != 0)))) { + if (((stringMethod4107(strRemoveEntities(cs2method5010(ivar2)), cs2method5015()) != 0) && (ivar4 != 6)) && (ivar4 != 19)) { + ivar5 = 1; + createExtraChild(new WidgetPointer(979,26), 3, getExtraChildGap(new WidgetPointer(979,26))); + setWidgetPosition(2, add(multiply(ivar3, 14), 1), 0, 0); + setWidgetSize(4, 14, 1, 0); + setWidgetRGB(new Color(96, 96, 96)); + cs2method2103(255); + setWidgetFilled(1); + setScriptCallOnMouseEntered(3392, -2147483643, "i"); + setScriptCallOnMouseExit(3393, -2147483643, "i"); + createExtraChild(new WidgetPointer(979,25), 3, getExtraChildGap(new WidgetPointer(979,25))); + setWidgetPosition(2, add(multiply(ivar3, 14), 1), 0, 0); + setWidgetSize(4, 14, 1, 0); + setWidgetRGB(new Color(73, 73, 73)); + cs2method2103(255); + setWidgetFilled(1); + setScriptCallOnMouseEntered(3394, -2147483643, "i"); + } + createExtraChild(new WidgetPointer(979,27), 4, getExtraChildGap(new WidgetPointer(979,27))); + setWidgetPosition(5, multiply(ivar3, 14), 0, 0); + setWidgetSize(10, 14, 1, 0); + if ((ivar4 != 6) && (ivar4 != 19)) { + setWidgetText(" " + cs2method5010(ivar2) + ": " + cs2method5003(ivar2)); + } else { + setWidgetText("To " + cs2method5010(ivar2) + ": " + cs2method5003(ivar2)); + } + setWidgetRGB(new Color(102, 102, 120)); + if (((stringMethod4107(strRemoveEntities(cs2method5010(ivar2)), cs2method5015()) != 0) && (ivar4 != 6)) && (ivar4 != 19)) { + cs2method1305(strRemoveEntities(cs2method5010(ivar2))); + setWidgetContextMenuOption(1, "Report"); + setScriptCallOnClickContextMenu(3396, -2147483643, "i"); + setWidgetRGB(new Color(255, 255, 255)); + } + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 14); + ivar3 = add(ivar3, 1); + } + ivar2 = subtract(ivar2, 1); + } + if (((boolean)ivar5)) { + createExtraChild(new WidgetPointer(979,27), 4, getExtraChildGap(new WidgetPointer(979,27))); + setWidgetPosition(5, multiply(ivar3, 14), 0, 0); + setWidgetSize(16384, 14, 2, 0); + setWidgetText("There is no chat to report at the moment."); + setWidgetRGB(new Color(125, 125, 209)); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 14); + } + if (ivar3 > divide(getWidgetActualHeight(new WidgetPointer(979,5)), 14)) { + setWidgetSize(38, getWidgetActualHeight(new WidgetPointer(979,5)), 1, 0, new WidgetPointer(979,5)); + setWidgetScrollMax(0, add(multiply(ivar3, 14), 5), new WidgetPointer(979,24)); + script_31(64159750, 64159768, 792, 789, 790, 791, 773, 788); + if (setWidgetRegister(new WidgetPointer(979,6), 1)) { + script_37(64159750, 64159768, getWidgetScrollMaxV(new WidgetPointer(979,24)), 1); + } + } else { + setWidgetSize(21, getWidgetActualHeight(new WidgetPointer(979,5)), 1, 0, new WidgetPointer(979,5)); + } + if (((boolean)arg0)) { + if (((boolean)globalint_6)) { + setWidgetSprite(1768, new WidgetPointer(979,20)); + } else { + setWidgetSprite(1770, new WidgetPointer(979,20)); + } + if ((arg1 == 5) || (arg1 == 6)) { + setWidgetText(new WidgetPointer(979,19), "Suggest to mute this player for 48 hours"); + } else { + setWidgetText(new WidgetPointer(979,19), "Mute this player for 48 hours"); + } + setWidgetSize(add(getTextWidth(494, getWidgetText(new WidgetPointer(979,19))), 18), getWidgetActualHeight(new WidgetPointer(979,7)), 0, 0, new WidgetPointer(979,7)); + setWidgetPosition(18, 273, 0, 0, new WidgetPointer(979,8)); + setWidgetIsHidden(false, new WidgetPointer(979,7)); + } else { + setWidgetPosition(18, 266, 0, 0, new WidgetPointer(979,8)); + } + setWidgetIsHidden(false, new WidgetPointer(906,46)); + return; +} diff --git a/dumps/scripts/2922.cs2 b/dumps/scripts/2922.cs2 new file mode 100644 index 000000000..3d54b1357 --- /dev/null +++ b/dumps/scripts/2922.cs2 @@ -0,0 +1,4 @@ +void script_2922() { + script_3391(); + return; +} diff --git a/dumps/scripts/2923.cs2 b/dumps/scripts/2923.cs2 new file mode 100644 index 000000000..60ea82496 --- /dev/null +++ b/dumps/scripts/2923.cs2 @@ -0,0 +1,37 @@ +void script_2923(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + if (standart_config_102 > 0) { + setWidgetSprite(1801, new WidgetPointer(arg2)); + setWidgetSprite(1801, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetContextMenuOption(1, new WidgetPointer(arg1), "Use cure (p)"); + } else if (standart_config_456 > 0) { + setWidgetSprite(1800, new WidgetPointer(arg2)); + setWidgetSprite(1800, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetContextMenuOption(1, new WidgetPointer(arg1), "Use cure (d)"); + } else { + setWidgetSprite(1208, new WidgetPointer(arg2)); + setWidgetSprite(1208, new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetNoOptions(new WidgetPointer(arg1)); + } + setWidgetSize(0, subtract(16384, max(min(multiplyDivide(bitconfig_7198, script_2916(), 16384), 16384), 0)), 1, 2, new WidgetPointer(arg3)); + setWidgetSize(0, subtract(16384, max(min(multiplyDivide(script_2915(), script_2916(), 16384), 16384), 0)), 1, 2, new WidgetPointer(arg4)); + setWidgetText(new WidgetPointer(arg5), intToStr(bitconfig_7198)); + ivar6 = multiplyDivide(bitconfig_7198, script_2916(), 100); + if (ivar6 > 75) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg5)); + } else if (ivar6 > 50) { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg5)); + } else if (ivar6 > 25) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg5)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg5)); + } + script_2654(); + return; +} diff --git a/dumps/scripts/2924.cs2 b/dumps/scripts/2924.cs2 new file mode 100644 index 000000000..1a292f446 --- /dev/null +++ b/dumps/scripts/2924.cs2 @@ -0,0 +1,4 @@ +void script_2924(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_2925(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/2925.cs2 b/dumps/scripts/2925.cs2 new file mode 100644 index 000000000..82411328b --- /dev/null +++ b/dumps/scripts/2925.cs2 @@ -0,0 +1,12 @@ +void script_2925(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (arg0 != -1) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + } + if (arg2 != -1) { + setWidgetSprite(arg3, new WidgetPointer(arg2)); + } + if (arg4 != -1) { + setWidgetSprite(arg5, new WidgetPointer(arg4)); + } + return; +} diff --git a/dumps/scripts/2926.cs2 b/dumps/scripts/2926.cs2 new file mode 100644 index 000000000..9f8974b93 --- /dev/null +++ b/dumps/scripts/2926.cs2 @@ -0,0 +1,4 @@ +void script_2926(int arg0,int arg1,int arg2,int arg3,string arg4) { + script_2927(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/2927.cs2 b/dumps/scripts/2927.cs2 new file mode 100644 index 000000000..6b1b19d67 --- /dev/null +++ b/dumps/scripts/2927.cs2 @@ -0,0 +1,14 @@ +void script_2927(int arg0,int arg1,int arg2,int arg3,string arg4) { + if (arg0 != -1) { + if (((boolean)arg3)) { + setWidgetText(new WidgetPointer(arg1), "" + arg4 + ""); + setWidgetRGB(new Color(250, 250, 250), new WidgetPointer(arg1)); + setWidgetSize(getTextWidth(arg2, arg4), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } else { + setWidgetText(new WidgetPointer(arg1), "" + arg4 + ""); + setWidgetRGB(new Color(200, 200, 200), new WidgetPointer(arg1)); + setWidgetSize(getTextWidth(arg2, arg4), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/2928.cs2 b/dumps/scripts/2928.cs2 new file mode 100644 index 000000000..56947dc3d --- /dev/null +++ b/dumps/scripts/2928.cs2 @@ -0,0 +1,4 @@ +void script_2928() { + script_304(50243054); + return; +} diff --git a/dumps/scripts/2929.cs2 b/dumps/scripts/2929.cs2 new file mode 100644 index 000000000..067577eae --- /dev/null +++ b/dumps/scripts/2929.cs2 @@ -0,0 +1,4 @@ +void script_2929(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + script_864(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + return; +} diff --git a/dumps/scripts/293.cs2 b/dumps/scripts/293.cs2 new file mode 100644 index 000000000..8c01ffe33 --- /dev/null +++ b/dumps/scripts/293.cs2 @@ -0,0 +1,32 @@ +void script_293(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar3 = divide(add(arg1, arg2), 2); + ivar4 = globalarray_0[ivar3]; + globalarray_0[ivar3] = globalarray_0[arg2]; + globalarray_0[arg2] = ivar4; + ivar5 = arg1; + ivar6 = arg1; + ivar7 = 0; + while (ivar6 < arg2) { + if (stringMethod4107(lower(cs2method5207(cs2method_3408(105, 96, 708, globalarray_0[ivar6]))), lower(cs2method5207(cs2method_3408(105, 96, 708, ivar4)))) < bitAnd(ivar6, 1)) { + ivar7 = globalarray_0[ivar6]; + globalarray_0[ivar6] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar7; + ivar5 = add(ivar5, 1); + } + ivar6 = add(ivar6, 1); + } + globalarray_0[arg2] = globalarray_0[ivar5]; + globalarray_0[ivar5] = ivar4; + if (arg1 < subtract(ivar5, 1)) { + script_293(0, arg1, subtract(ivar5, 1)); + } + if (add(ivar5, 1) < arg2) { + script_293(0, add(ivar5, 1), arg2); + } + return; +} diff --git a/dumps/scripts/2930.cs2 b/dumps/scripts/2930.cs2 new file mode 100644 index 000000000..d247f3662 --- /dev/null +++ b/dumps/scripts/2930.cs2 @@ -0,0 +1,31 @@ +void script_2930(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9) { + int ivar10; + if (arg7 < arg8) { + arg7 = add(arg7, 1); + setScriptCallOnGameloop(2930, new WidgetPointer(arg0), arg1, arg2, new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), arg6, arg7, arg8, arg9, "I1iIIIiiii", new WidgetPointer(arg0)); + return; + } + ivar10 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (((boolean)arg1)) { + if (subtract(ivar10, arg2) < arg6) { + setWidgetSize(min(add(ivar10, arg9), add(arg6, arg2)), 31, 0, 0, new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetSize(add(arg6, arg2), 31, 0, 0, new WidgetPointer(arg0)); + } + setWidgetSprite(2569, new WidgetPointer(arg3)); + setWidgetSprite(2568, new WidgetPointer(arg4)); + setWidgetSprite(2568, new WidgetPointer(arg5)); + } else { + if (ivar10 > 32) { + setWidgetSize(max(subtract(ivar10, arg9), 32), 31, 0, 0, new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetSize(32, 31, 0, 0, new WidgetPointer(arg0)); + } + setWidgetSprite(2567, new WidgetPointer(arg3)); + setWidgetSprite(2566, new WidgetPointer(arg4)); + setWidgetSprite(2566, new WidgetPointer(arg5)); + } + return; +} diff --git a/dumps/scripts/2931.cs2 b/dumps/scripts/2931.cs2 new file mode 100644 index 000000000..2bf28cd32 --- /dev/null +++ b/dumps/scripts/2931.cs2 @@ -0,0 +1,4 @@ +void script_2931(int arg0,string arg1,string arg2) { + script_2932(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/2932.cs2 b/dumps/scripts/2932.cs2 new file mode 100644 index 000000000..c984cf75f --- /dev/null +++ b/dumps/scripts/2932.cs2 @@ -0,0 +1,6 @@ +void script_2932(int arg0,string arg1,string arg2) { + if ((stringMethod4107(arg1, "") != 0) && (stringMethod4107(arg2, "") != 0)) { + cs2method5421(arg0, "loginapplet/loginapplet.ws?ssl=1&expired=0&mod=" + arg1 + "&dest=" + arg2); + } + return; +} diff --git a/dumps/scripts/2933.cs2 b/dumps/scripts/2933.cs2 new file mode 100644 index 000000000..ec68c2382 --- /dev/null +++ b/dumps/scripts/2933.cs2 @@ -0,0 +1,4 @@ +void script_2933(int arg0,string arg1) { + script_2934(arg0, arg1); + return; +} diff --git a/dumps/scripts/2934.cs2 b/dumps/scripts/2934.cs2 new file mode 100644 index 000000000..b87e91441 --- /dev/null +++ b/dumps/scripts/2934.cs2 @@ -0,0 +1,6 @@ +void script_2934(int arg0,string arg1) { + if (stringMethod4107(arg1, "") != 0) { + cs2method5421(arg0, arg1); + } + return; +} diff --git a/dumps/scripts/2935.cs2 b/dumps/scripts/2935.cs2 new file mode 100644 index 000000000..6c4a074f1 --- /dev/null +++ b/dumps/scripts/2935.cs2 @@ -0,0 +1,4 @@ +void script_2935(int arg0) { + script_2936(arg0); + return; +} diff --git a/dumps/scripts/2936.cs2 b/dumps/scripts/2936.cs2 new file mode 100644 index 000000000..c57e5c8c7 --- /dev/null +++ b/dumps/scripts/2936.cs2 @@ -0,0 +1,16 @@ +void script_2936(int arg0) { + if (((boolean)cs2method5420())) { + globalint_547 = arg0; + script_2940(11); + setWidgetIsHidden(true, new WidgetPointer(744,28)); + if (hasSSKey()) { + setWidgetIsHidden(false, new WidgetPointer(744,27)); + } else { + setWidgetIsHidden(false, new WidgetPointer(744,26)); + } + if (((boolean)globalint_547)) { + script_2945(); + } + } + return; +} diff --git a/dumps/scripts/2937.cs2 b/dumps/scripts/2937.cs2 new file mode 100644 index 000000000..fc8c1bd08 --- /dev/null +++ b/dumps/scripts/2937.cs2 @@ -0,0 +1,17 @@ +void script_2937() { + globalint_1089 = -1; + setWidgetSprite(4066, new WidgetPointer(596,35)); + setWidgetSprite(4066, new WidgetPointer(596,34)); + setWidgetSprite(4065, new WidgetPointer(596,32)); + setWidgetSprite(4065, new WidgetPointer(596,33)); + setWidgetSprite(4065, new WidgetPointer(596,20)); + setWidgetVFlip(1, new WidgetPointer(596,20)); + setWidgetHFlip(1, new WidgetPointer(596,20)); + setWidgetSprite(4065, new WidgetPointer(596,24)); + setWidgetVFlip(1, new WidgetPointer(596,24)); + setWidgetHFlip(0, new WidgetPointer(596,24)); + setWidgetSprite(4065, new WidgetPointer(596,21)); + setWidgetSprite(4065, new WidgetPointer(596,25)); + setScriptCallOnGameloop(4700, "", new WidgetPointer(744,17)); + return; +} diff --git a/dumps/scripts/2938.cs2 b/dumps/scripts/2938.cs2 new file mode 100644 index 000000000..0e3b32256 --- /dev/null +++ b/dumps/scripts/2938.cs2 @@ -0,0 +1,20 @@ +void script_2938() { + if (((boolean)globalint_1199)) { + setWidgetText(new WidgetPointer(933,267), globalstring_311); + setWidgetText(new WidgetPointer(933,268), cs2method_3408(105, 115, 2857, globalint_1209)); + setWidgetText(new WidgetPointer(933,269), cs2method_3408(105, 115, 2857, globalint_1210)); + setWidgetText(new WidgetPointer(933,270), cs2method_3408(105, 115, 2857, globalint_1211)); + setWidgetText(new WidgetPointer(933,271), cs2method_3408(105, 115, 2857, globalint_1212)); + setWidgetText(new WidgetPointer(933,272), cs2method_3408(105, 115, 2857, globalint_1213)); + setWidgetText(new WidgetPointer(933,273), cs2method_3408(105, 115, 2857, globalint_1214)); + } else { + setWidgetText(new WidgetPointer(933,267), ""); + setWidgetText(new WidgetPointer(933,268), ""); + setWidgetText(new WidgetPointer(933,269), ""); + setWidgetText(new WidgetPointer(933,270), ""); + setWidgetText(new WidgetPointer(933,271), ""); + setWidgetText(new WidgetPointer(933,272), ""); + setWidgetText(new WidgetPointer(933,273), ""); + } + return; +} diff --git a/dumps/scripts/2939.cs2 b/dumps/scripts/2939.cs2 new file mode 100644 index 000000000..dfdf79337 --- /dev/null +++ b/dumps/scripts/2939.cs2 @@ -0,0 +1,6 @@ +void script_2939() { + if (((boolean)globalint_1199)) { + setWidgetText(new WidgetPointer(933,267), globalstring_311); + } + return; +} diff --git a/dumps/scripts/294.cs2 b/dumps/scripts/294.cs2 new file mode 100644 index 000000000..7225ab085 --- /dev/null +++ b/dumps/scripts/294.cs2 @@ -0,0 +1,18 @@ +void script_294(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + playSoundEffect(2266, 1, 0); + arg0 = script_2785(arg0); + if (arg0 == cs2method5235()) { + script_291(0, arg1, arg2, arg3, arg4, arg5); + return; + } + globalstring_31 = ""; + script_308(arg4); + script_2046(arg5); + script_41(49479737); + loadDungeonmap(arg0); + globalint_172 = cs2method5218(arg0); + script_1372(); + script_307(); + script_291(0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/2940.cs2 b/dumps/scripts/2940.cs2 new file mode 100644 index 000000000..a17717f99 --- /dev/null +++ b/dumps/scripts/2940.cs2 @@ -0,0 +1,36 @@ +void script_2940(int arg0) { + int ivar1; + flow_0: + ivar1 = script_2948(); + IF (ivar1 == -3) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (arg0 != 13) + GOTO flow_3 + flow_2: + IF ((ivar1 == 21) || ((boolean)ivar1)) + GOTO flow_3 + GOTO flow_4 + flow_3: + return; + flow_4: + setWidgetText(new WidgetPointer(596,73), globalstring_32); + setWidgetText(new WidgetPointer(596,79), script_2949(globalstring_33)); + if (strLength(globalstring_32) > 0) { + globalint_174 = 4; + } else { + globalint_174 = 3; + } + if (globalint_174 == 3) { + globalint_1099 = strLength(globalstring_32); + script_3237(39059528, 39059529, 39059530, 3, globalstring_32); + } else { + globalint_1099 = strLength(script_2949(globalstring_33)); + script_3237(39059534, 39059535, 39059536, 4, script_2949(globalstring_33)); + } + setWidgetIsHidden(false, new WidgetPointer(744,26)); + setWidgetIsHidden(false, new WidgetPointer(596,6)); + script_3964(); + return; +} diff --git a/dumps/scripts/2941.cs2 b/dumps/scripts/2941.cs2 new file mode 100644 index 000000000..f98de4263 --- /dev/null +++ b/dumps/scripts/2941.cs2 @@ -0,0 +1,7 @@ +void script_2941() { + setScriptCallOnWidgetResize(-1, "", new WidgetPointer(744,26)); + globalstring_33 = ""; + globalint_1099 = 0; + resetRCs(); + return; +} diff --git a/dumps/scripts/2942.cs2 b/dumps/scripts/2942.cs2 new file mode 100644 index 000000000..a0aa199a1 --- /dev/null +++ b/dumps/scripts/2942.cs2 @@ -0,0 +1,4 @@ +void script_2942() { + script_2276(globalint_1199, globalint_1209, 61145356); + return; +} diff --git a/dumps/scripts/2943.cs2 b/dumps/scripts/2943.cs2 new file mode 100644 index 000000000..96581d862 --- /dev/null +++ b/dumps/scripts/2943.cs2 @@ -0,0 +1,4 @@ +void script_2943(int arg0) { + globalint_174 = arg0; + return; +} diff --git a/dumps/scripts/2944.cs2 b/dumps/scripts/2944.cs2 new file mode 100644 index 000000000..7a889dce0 --- /dev/null +++ b/dumps/scripts/2944.cs2 @@ -0,0 +1,4 @@ +void script_2944() { + script_2945(); + return; +} diff --git a/dumps/scripts/2945.cs2 b/dumps/scripts/2945.cs2 new file mode 100644 index 000000000..274898c7c --- /dev/null +++ b/dumps/scripts/2945.cs2 @@ -0,0 +1,65 @@ +void script_2945() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + string svar1; + globalint_1100 = -1; + if (hasSSKey() && (((boolean)strLength(globalstring_32)) || ((boolean)strLength(globalstring_33)))) { + script_2940(11); + return; + } + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + if ((((boolean)cs2method5420()) && ((boolean)script_2727())) && ((boolean)globalint_547)) { + globalint_174 = 12; + setWidgetIsHidden(false, new WidgetPointer(744,28)); + playMusicEffect(349, 0); + script_3412(48758826, 48758827); + ivar2 = getWidgetActualWidth(new WidgetPointer(744,43)); + ivar3 = getWidgetActualWidth(new WidgetPointer(744,43)); + ivar0 = max(337, add(getTextWidth(591, getWidgetText(new WidgetPointer(744,42))), 31)); + ivar3 = max(152, multiply(getLineCount(ivar2, 496, getWidgetText(new WidgetPointer(744,43))), 16)); + ivar1 = max(252, add(ivar3, 100)); + setWidgetSize(ivar2, ivar3, 0, 0, new WidgetPointer(744,43)); + setWidgetSize(ivar0, ivar1, 0, 0, new WidgetPointer(744,28)); + setWidgetIsHidden(true, new WidgetPointer(744,26)); + setWidgetIsHidden(true, new WidgetPointer(744,27)); + return; + } + globalint_200 = 0; + globalint_201 = 0; + ivar4 = 39059516; + ivar5 = 39059501; + if (hasSSKey()) { + ivar4 = 63897649; + ivar5 = 63897644; + } + setWidgetText(new WidgetPointer(ivar4), "Logging in..."); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar5)); + script_2950(-3, 0, 1, -1, 0, -1, 0, "Logging In - Please Wait", "", ""); + setWidgetIsHidden(true, new WidgetPointer(596,9)); + globalint_1100 = -3; + svar0 = globalstring_32; + svar1 = globalstring_33; + if (hasSSKey()) { + svar0 = ""; + svar1 = ""; + } + if (((boolean)cs2method5420())) { + directlogin(0, svar0, svar1); + } else { + setUserAndPass(svar0, svar1); + } + if (hasSSKey()) { + setScriptCallOnGameloop(2946, 0, "i", new WidgetPointer(975,26)); + } else { + setScriptCallOnGameloop(2946, 0, "i", new WidgetPointer(596,7)); + } + return; +} diff --git a/dumps/scripts/2946.cs2 b/dumps/scripts/2946.cs2 new file mode 100644 index 000000000..df797c63c --- /dev/null +++ b/dumps/scripts/2946.cs2 @@ -0,0 +1,375 @@ +void script_2946(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + ivar1 = script_2948(); + ivar2 = 39059516; + ivar3 = 39059515; + ivar4 = 39059501; + ivar5 = 39059463; + if (hasSSKey()) { + ivar2 = 63897649; + ivar4 = 63897644; + ivar5 = 63897626; + } + if (ivar1 == 42) { + setWidgetSprite(6297, new WidgetPointer(744,97)); + setWidgetIsHidden(false, new WidgetPointer(744,103)); + setWidgetText(new WidgetPointer(744,130), intToStr(getWorldId())); + setWidgetText(new WidgetPointer(744,131), intToStr(getReturncode42ExtraData())); + globalint_1100 = 42; + return; + } + if (ivar1 == 43) { + setWidgetText(new WidgetPointer(744,130), intToStr(getWorldId())); + setWidgetText(new WidgetPointer(744,131), intToStr(getReturncode42ExtraData())); + globalint_1100 = 43; + return; + } + setWidgetIsHidden(true, new WidgetPointer(744,103)); + setWidgetSprite(4129, new WidgetPointer(744,97)); + if (ivar1 == -3) { + setWidgetText(new WidgetPointer(ivar2), "Logging in..."); + setWidgetText(new WidgetPointer(ivar3), "Logging in..."); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar4)); + script_2950(ivar1, 0, 1, -1, 0, -1, 0, "Logging In - Please Wait", "", ""); + globalint_1100 = -3; + return; + } + if (globalint_1100 == -3) { + script_2954(); + } + ivar6 = 0; + svar0 = ""; + if (ivar1 == 21) { + globalint_1100 = 21; + setWidgetText(new WidgetPointer(ivar2), "Logging in..."); + setWidgetText(new WidgetPointer(ivar3), "Logging in..."); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar4)); + if (((boolean)globalint_200)) { + globalint_200 = getWorldswitchTimer(); + } + globalint_200 = subtract(globalint_200, 1); + if (globalint_200 <= 0) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar4)); + if (((boolean)arg0)) { + script_2945(); + } else { + script_4634(arg0); + } + return; + } + ivar6 = divide(globalint_200, 50); + if (((boolean)ivar6)) { + svar0 = "You have only just left another world. Your profile will be transferred in" + "
" + "1 second."; + } else { + svar0 = "You have only just left another world. Your profile will be transferred in" + "
" + intToStr(ivar6) + " seconds."; + } + if (isWidgetHidden(new WidgetPointer(ivar5))) { + script_2950(ivar1, 0, 0, 2611, 1, 1, 0, svar0, "Abort Login", ""); + } else { + script_3233(svar0); + } + return; + } + script_2954(); + ivar7 = 0; + svar1 = ""; + if (((boolean)ivar1)) { + flow_27: + setWidgetText(new WidgetPointer(ivar2), "Logging in..."); + setWidgetText(new WidgetPointer(ivar3), "Logging in..."); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar4)); + if (((boolean)globalint_201)) { + globalint_202 = ((int)canShowVideoAd()); + } + ivar7 = divide(subtract(500, globalint_201), 50); + if (((boolean)globalint_202)) { + if (((boolean)ivar7)) { + svar1 = "Could not display video advertisement. Login will continue in 1 second."; + } else { + svar1 = "Could not display video advertisement. Login will continue in " + intToStr(ivar7) + " seconds"; + } + } else if (globalint_201 < 500) { + if (((boolean)ivar7)) { + svar1 = "Displaying video advertisement. Login will continue in 1 second."; + } else { + svar1 = "Displaying video advertisement. Login will continue in " + intToStr(ivar7) + " seconds."; + } + } else { + svar1 = "Displaying video advertisement. Login will continue in 0 seconds."; + } + script_2950(ivar1, 0, 0, 2611, 0, -1, 0, svar1, "", ""); + globalint_201 = add(globalint_201, 1); + IF (((boolean)globalint_202)) + GOTO flow_41 + GOTO flow_42 + flow_41: + IF (isShowingVideoAd()) + GOTO flow_43 + flow_42: + IF (globalint_201 < 500) + GOTO flow_43 + GOTO flow_44 + flow_43: + return; + flow_44: + script_2954(); + skipLoginstage10(); + return; + } + script_2954(); + if (hasSSKey()) { + setWidgetText(new WidgetPointer(ivar2), "Play Game"); + setWidgetText(new WidgetPointer(ivar3), "Play Game"); + } else { + setWidgetText(new WidgetPointer(ivar2), "Log In"); + setWidgetText(new WidgetPointer(ivar3), "Log In"); + } + setScriptCallOnMousePressed(2944, "", new WidgetPointer(ivar4)); + if (hasSSKey()) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(975,26)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(596,7)); + } + svar2 = ""; + ivar8 = 1; + ivar9 = 0; + ivar10 = 2608; + ivar11 = 0; + ivar12 = 0; + svar3 = ""; + ivar13 = 1; + svar4 = "Back"; + switch (ivar1) { + case -2: + script_2954(); + if (hasSSKey()) { + return; + } + script_2940(11); + return; + case 29: + switch (getDetailedRC()) { + case 0: + svar2 = "You must have a Combat Level of at least 20 (not including Summoning) to enter a PvP world."; + break; + case 1: + svar2 = "You are currently carrying lent items and cannot enter a PvP world."; + break; + case 2: + svar2 = "You must be standing in the Wilderness or Edgeville to enter this bounty world."; + break; + case 3: + svar2 = "You must have a total skill level of 1,000 or greater to enter this world."; + break; + case 5: + svar2 = "You must have a total skill level of 1,500 or greater to enter this world."; + break; + case 4: + svar2 = "You must move to a safe area before you can log in to a PvP or bounty world."; + break; + default: + svar2 = "Unexpected server response. Please try using a different world."; + } + break; + case 46: + svar2 = "This instance is marked for deletion/rebuild. Please try using a different world."; + break; + case 45: + switch (getReturncodeExtraData()) { + case 0: + switch (getDetailedRC()) { + case 0: + svar2 = "You must be near the TzHaar Fight Pits entrance to enter a global match."; + break; + default: + svar2 = "Unable to log in. Please try using a different world."; + } + break; + case 1: + switch (getDetailedRC()) { + case 1: + svar2 = "There was an error connecting to your meeting room. Please try again."; + break; + case 2: + svar2 = "You need a higher rank to enter that private tent."; + break; + case 3: + svar2 = "You need an invitation to enter that private room."; + break; + default: + svar2 = "Unable to log in. Please try using a different world."; + } + break; + default: + svar2 = "Unexpected server response. Please try using a different world."; + } + break; + case -5: + svar2 = "Connection timed out. Please try using a different world."; + break; + case -4: + svar2 = "Error connecting to server."; + break; + case -1: + svar2 = "No response from server. Please try using a different world."; + break; + case 5: + svar2 = "Your account has not logged out from its last session. Try again in a few minutes."; + break; + case 7: + svar2 = "This world is full. Please use a different world."; + break; + case 8: + svar2 = "Unable to connect: login server offline."; + break; + case 9: + svar2 = "Login limit exceeded: too many connections from your address."; + break; + case 10: + svar2 = "Unable to connect: bad session id."; + break; + case 13: + svar2 = "Could not complete login. Please try using a different world."; + break; + case 16: + svar2 = "Too many incorrect logins from your address. Please wait 5 minutes before trying again."; + break; + case 17: + svar2 = "You are standing in a members-only area. To play on this world, move to a free area first."; + break; + case 20: + svar2 = "Invalid loginserver requested. Please try using a different world."; + break; + case 22: + svar2 = "Malformed login packet. Please try again."; + break; + case 23: + svar2 = "No reply from login server. Please wait a minute and try again."; + break; + case 24: + svar2 = "Error loading your profile. Please contact customer support."; + break; + case 25: + svar2 = "Unexpected loginserver response. Please try using a different world."; + break; + case 26: + svar2 = "This computer's address has been blocked, as it was used to break our rules."; + break; + case 27: + svar2 = "Service unavailable."; + break; + case 36: + svar2 = "Unable to connect: authentication server offline."; + break; + case 37: + svar2 = "Your account is currently inaccessible. Please try again in a few minutes."; + break; + case 39: + svar2 = "The instance you tried to join no longer exists. Please try using a different world."; + break; + case 41: + svar2 = "The instance you tried to join is full. Please try back later or try using a different world."; + break; + case 44: + svar2 = "Our systems are currently unavailable. Please try again in a few minutes."; + break; + case 35: + svar2 = "Your session has expired. Please click 'Back' in your browser to renew it."; + svar4 = "Close"; + break; + case 14: + ivar8 = 0; + ivar10 = 2610; + svar2 = "The server is being updated. Please wait a few minutes and try again."; + break; + case 6: + ivar8 = 0; + ivar10 = 2610; + svar2 = "RuneScape has been updated! Please reload this page."; + break; + case 3: + if (((boolean)globalint_1414)) { + svar2 = "Invalid username or password." + "
" + "
" + "For accounts created after the 24th of November 2010, please use your email address to login. Otherwise please login with your username."; + } else if (globalint_1414 == 2) { + svar2 = "Invalid email or password." + "
" + "
" + "For accounts created after the 24th of November 2010, please use your email address to login. Otherwise please login with your username."; + } else { + svar2 = "Invalid login or password." + "
" + "
" + "For accounts created after the 24th of November 2010, please use your email address to login. Otherwise please login with your username."; + } + svar4 = "Try Again"; + ivar11 = 1; + svar3 = "Forgotten your password?"; + break; + case 4: + svar2 = "Your account has been disabled. Check your message centre for details."; + ivar11 = 1; + svar3 = "Message Centre"; + break; + case 11: + svar2 = "Your password is an extremely common choice, and is not secure. You must change it before you can login."; + ivar11 = 1; + svar3 = "Change Password"; + break; + case 18: + ivar10 = 2612; + svar2 = "Your account has been locked. If you have not received an account recovery email, please select 'Recover Account'."; + ivar11 = 1; + svar3 = "Recover Account"; + break; + case 30: + svar2 = "This is not a member's account; please choose a 'free' world from the website to play on this account."; + ivar11 = 1; + if (((boolean)cs2method5420())) { + svar3 = "Choose World"; + } else { + svar3 = "Subscribe"; + } + break; + case 31: + svar2 = "You must change your account's display name before you can login."; + ivar11 = 1; + svar3 = "Change Display Name"; + break; + case 19: + svar2 = "Fullscreen is currently a members-only feature. To log in, exit fullscreen via the options menu or use a member's account."; + ivar11 = 1; + svar3 = "Subscribe"; + break; + case 12: + svar2 = "You need a member's account to log in to this world. Please subscribe or use a different world."; + ivar11 = 1; + svar3 = "Subscribe"; + break; + case 40: + svar2 = "You need a member's account to log in to this world. Please subscribe or use a different world."; + ivar11 = 1; + svar3 = "Subscribe"; + break; + case 32: + svar2 = "Your account has negative membership credit. Please log into the billing system to add credit to your account."; + ivar11 = 1; + svar3 = "Add Credit"; + break; + default: + svar2 = "Unexpected server response. Please try using a different world."; + } + script_2950(ivar1, ivar8, ivar9, ivar10, ivar11, ivar12, ivar13, svar2, svar3, svar4); + resetRCs(); + return; +} diff --git a/dumps/scripts/2947.cs2 b/dumps/scripts/2947.cs2 new file mode 100644 index 000000000..cbbabf4b6 --- /dev/null +++ b/dumps/scripts/2947.cs2 @@ -0,0 +1,11 @@ +void script_2947() { + globalstring_321 = ""; + globalstring_322 = ""; + globalstring_323 = ""; + globalstring_324 = ""; + globalstring_325 = ""; + setWidgetIsHidden(true, new WidgetPointer(667,52)); + setWidgetIsHidden(true, new WidgetPointer(670,1)); + setWidgetIsHidden(true, new WidgetPointer(763,3)); + return; +} diff --git a/dumps/scripts/2948.cs2 b/dumps/scripts/2948.cs2 new file mode 100644 index 000000000..3099796dc --- /dev/null +++ b/dumps/scripts/2948.cs2 @@ -0,0 +1,6 @@ +int script_2948() { + if (((boolean)cs2method5420())) { + return getGameloginRc(); + } + return getLobbyRC(); +} diff --git a/dumps/scripts/2949.cs2 b/dumps/scripts/2949.cs2 new file mode 100644 index 000000000..3503eaa39 --- /dev/null +++ b/dumps/scripts/2949.cs2 @@ -0,0 +1,10 @@ +string script_2949(string arg0) { + int ivar0; + ivar0 = strLength(arg0); + arg0 = ""; + while (ivar0 > 0) { + arg0 = arg0 + "*"; + ivar0 = subtract(ivar0, 1); + } + return arg0; +} diff --git a/dumps/scripts/295.cs2 b/dumps/scripts/295.cs2 new file mode 100644 index 000000000..aec63ba7c --- /dev/null +++ b/dumps/scripts/295.cs2 @@ -0,0 +1,266 @@ +void script_295(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + if (cs2method5229()) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + return; + } + ivar5 = 0; + switch (cs2method5235()) { + case 31: + ivar5 = script_297(589620541, 52864326, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 1: + ivar5 = script_297(39325979, 38474018, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 26: + ivar5 = script_300(143, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Lower level"); + ivar5 = script_300(1573071, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Middle level"); + ivar5 = script_300(3145999, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Upper level"); + ivar5 = script_297(44831902, 313267358, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(44618924, 313070764, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(44324084, 312759540, 0, 65535, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(44225744, 312661200, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(44569840, 313005296, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(44750053, 313185509, 0, 32767, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(44881101, 313316557, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(44733625, 313169081, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(44618896, 313070736, 0, 65535, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(44274873, 312710329, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(313283821, 581719277, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(312694002, 581129458, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(312612023, 581047479, 0, 65535, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(312628396, 581063852, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(313037957, 581473413, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(313349258, 581784714, 0, 32767, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(313332908, 581768364, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 21: + ivar5 = script_298(46524306, 46491549, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_298(46786463, 46835605, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(46589842, 47310831, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(46507915, 45557681, 0, 65535, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 20: + ivar5 = script_297(594388249, 57517334, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 25: + ivar5 = script_297(50079065, 50079060, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 3: + ivar5 = script_298(42575123, 42591571, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_298(42247537, 42067252, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_298(42263852, 42247532, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(42951961, 42935643, 0, 65535, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(42870115, 42870048, 0, 32767, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(42247458, 42149154, 0, 32767, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 14: + ivar5 = script_297(41101361, 41199667, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 2: + ivar5 = script_297(583460733, 315025277, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(583460675, 315025219, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(315189070, 46753614, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(315172731, 46737275, 0, 65535, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_300(79, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Lower level"); + ivar5 = script_300(1572943, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Middle level"); + ivar5 = script_300(3145807, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Upper level"); + break; + case 6: + ivar5 = script_297(50259980, 37212744, 0, 32767, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(41669235, 41112143, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 24: + ivar5 = script_300(524464, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "War"); + ivar5 = script_298(30528630, 31364198, 0, 32767, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_298(30823536, 30463099, 0, 32767, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(31167590, 33461373, 0, 32767, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_300(1966240, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Famine"); + ivar5 = script_298(33412216, 33117287, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_298(33051738, 33461373, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_298(33428568, 33461373, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_298(32953416, 33461373, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_298(33281093, 33461373, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(33199202, 34788484, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_300(655448, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Pestilence"); + ivar5 = script_298(34739338, 35165351, 0, 16711807, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_298(35230878, 34788484, 0, 16711807, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(35198115, 38638687, 0, 16711807, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_300(2097224, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Death"); + ivar5 = script_298(38753372, 38360163, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 9: + ivar5 = script_300(1573096, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Jail"); + ivar5 = script_300(524432, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Lower level"); + ivar5 = script_300(1704080, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Middle level"); + ivar5 = script_300(2883728, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Upper level"); + ivar5 = script_300(1704000, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Secure sector"); + ivar5 = script_297(50417803, 588304518, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(588533912, 320098456, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(588828849, 857280689, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(588943533, 52072618, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(319901872, 51482798, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 15: + ivar5 = script_297(584602804, 316167348, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(316282011, 47846554, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(584127643, 46781541, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 13: + ivar5 = script_300(524488, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Upper level"); + ivar5 = script_297(43410808, 580199803, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(43197740, 580068647, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 22: + ivar5 = script_297(55354521, 54399220, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(55354579, 54399245, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54748371, 53727504, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54748313, 53645556, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 16: + ivar5 = script_300(524810, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Sub-level 1"); + ivar5 = script_297(41740191, 834769206, 0, 16776960, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_300(1573291, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Sub-level 2"); + ivar5 = script_297(834949429, 566513973, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(835178804, 566743348, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(835359013, 566923557, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(835195165, 566759709, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(835424536, 566989080, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(837439784, 569004328, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_300(1573194, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Sub-level 3"); + ivar5 = script_297(566530346, 298094890, 0, 8323327, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(566350115, 297914659, 0, 8323327, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(566333726, 297898270, 0, 8323327, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(566399249, 297963793, 0, 8323327, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(566792458, 298357002, 0, 8323327, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(567185697, 298750241, 0, 8323327, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(567415076, 298979620, 0, 8323327, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(567398676, 298963220, 0, 8323327, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(568529179, 300093723, 0, 8323327, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_300(1573099, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Sub-level 4"); + ivar5 = script_297(299405624, 30970168, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(300503316, 32067860, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_300(2621578, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Sub-level 5"); + ivar5 = script_297(31314191, 47501665, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_300(3473463, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Sub-level 6"); + break; + case 30: + ivar5 = script_300(524402, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Lower level"); + ivar5 = script_300(2097240, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Middle level"); + ivar5 = script_300(3670104, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Upper level"); + ivar5 = script_297(51827152, 51827157, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51696079, 51794383, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(319902165, 588337616, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(588386779, 319951318, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(319951334, 588386785, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51630567, 319984103, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51876321, 51794401, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52171227, 320606678, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(320606697, 52171235, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51941857, 320459233, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(320442833, 52089297, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(320786911, 52351450, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(589124065, 320770529, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(320639465, 589074914, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51909098, 51909091, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(320229869, 51876333, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51532274, 319967725, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51778038, 51597814, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51909104, 51909109, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(320066037, 320131573, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(320524790, 320459254, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51564996, 319951300, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51745225, 320180684, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51909081, 320393689, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52171209, 320606668, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52269558, 320754166, 0, 32512, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(319902151, 588337610, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(320180692, 588616151, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(320492001, 588976609, 0, 16744192, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52187642, 51597859, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51597875, 51597879, 0, 16711680, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 23: + ivar5 = script_297(52335986, 52286839, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52286826, 52188518, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52204896, 52303200, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52254020, 52221268, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52073812, 51909968, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51696969, 51500355, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51680598, 51483990, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51893599, 51959137, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51959142, 51893606, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51467624, 51484017, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53155191, 53073274, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52974942, 53106013, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52729209, 52794736, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52827495, 52794722, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52909390, 53007697, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53105989, 52974917, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52630860, 52663632, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52729190, 52680035, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52565343, 52598117, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53253448, 53318987, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52499781, 52385096, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54187384, 54351224, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54056300, 54121829, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54367593, 54433128, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54105437, 53908823, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54007119, 54056266, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53859656, 53794120, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53843294, 53826914, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53630292, 53744980, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53515590, 53417331, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53499251, 53400902, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53777819, 53826967, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53876128, 53892509, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53826996, 53925299, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54023584, 54056349, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54416818, 54318512, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54449563, 54482318, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(54072714, 54023558, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53826948, 53745021, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52614547, 52565399, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52499882, 52532657, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52614557, 52663709, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52925867, 52827569, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53106073, 53138838, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53286311, 53237162, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53302713, 53351865, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53450160, 53515696, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53433760, 53548446, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(53056899, 52958589, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51565989, 51500447, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51746233, 51811765, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51811753, 51877297, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51664289, 51582365, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51910053, 51959206, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52008374, 52106677, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52270514, 52270509, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51713427, 51647888, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51991962, 51860875, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52139418, 52221339, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52123021, 52188558, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52270479, 52270475, 0, 16711935, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52368776, 52467083, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(52385177, 52450715, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(51926406, 51762557, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + case 34: + case 32: + case 33: + ivar5 = script_300(15, 1, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "The world map screen" + "
" + "shows you where you are," + "
" + "and where important" + "
" + "features may be found."); + break; + case 36: + ivar5 = script_300(28316927, 0, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Lower level"); + ivar5 = script_300(296752383, 0, 280, arg0, arg1, arg2, arg3, arg4, ivar5, "Upper level"); + ivar5 = script_297(297424118, 29054198, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(29136098, 297571551, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(28579021, 297014473, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + ivar5 = script_297(296867009, 27219081, 0, 65280, 6, arg0, arg1, arg2, arg3, arg4, ivar5); + break; + default: + deleteAllExtraChilds(new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/2950.cs2 b/dumps/scripts/2950.cs2 new file mode 100644 index 000000000..09df9a434 --- /dev/null +++ b/dumps/scripts/2950.cs2 @@ -0,0 +1,4 @@ +void script_2950(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,string arg7,string arg8,string arg9) { + script_3232(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 0, arg7, arg8, arg9); + return; +} diff --git a/dumps/scripts/2951.cs2 b/dumps/scripts/2951.cs2 new file mode 100644 index 000000000..5bdf29406 --- /dev/null +++ b/dumps/scripts/2951.cs2 @@ -0,0 +1,46 @@ +void script_2951() { + int ivar0; + int ivar1; + ivar0 = 39059469; + if (hasSSKey()) { + ivar0 = 63897603; + } + ivar1 = script_2948(); + if (((ivar1 != -3) && (ivar1 != 42)) && (ivar1 != 43)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar0)); + return; + } + if (getClientCycle() < globalint_1092) { + return; + } + globalint_1092 = add(getClientCycle(), 5); + switch (getWidgetSpriteId(new WidgetPointer(ivar0))) { + case 4107: + setWidgetSprite(4108, new WidgetPointer(ivar0)); + break; + case 4108: + setWidgetSprite(4109, new WidgetPointer(ivar0)); + break; + case 4109: + setWidgetSprite(4110, new WidgetPointer(ivar0)); + break; + case 4110: + setWidgetSprite(4111, new WidgetPointer(ivar0)); + break; + case 4111: + setWidgetSprite(4112, new WidgetPointer(ivar0)); + break; + case 4112: + setWidgetSprite(4113, new WidgetPointer(ivar0)); + break; + case 4113: + setWidgetSprite(4114, new WidgetPointer(ivar0)); + break; + case 4114: + setWidgetSprite(4107, new WidgetPointer(ivar0)); + break; + default: + setWidgetSprite(4107, new WidgetPointer(ivar0)); + } + return; +} diff --git a/dumps/scripts/2952.cs2 b/dumps/scripts/2952.cs2 new file mode 100644 index 000000000..a79b924c9 --- /dev/null +++ b/dumps/scripts/2952.cs2 @@ -0,0 +1,66 @@ +void script_2952(int arg0,int arg1,int arg2) { + string svar0; + string svar1; + svar0 = ""; + svar1 = ""; + switch (arg2) { + case 3: + svar0 = "accountappeal"; + svar1 = "passwordchoice.ws"; + setScriptCallOnMousePressed(2931, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(2953, "", new WidgetPointer(arg1)); + break; + case 4: + svar0 = "ticketing"; + svar1 = "inbox.ws"; + setScriptCallOnMousePressed(2931, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(2953, "", new WidgetPointer(arg1)); + break; + case 11: + svar0 = "password_history"; + svar1 = "password.ws"; + setScriptCallOnMousePressed(2931, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(2953, "", new WidgetPointer(arg1)); + break; + case 18: + svar0 = "accountappeal"; + svar1 = "lockchoice.ws"; + setScriptCallOnMousePressed(2931, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(2953, "", new WidgetPointer(arg1)); + break; + case 30: + if (((boolean)cs2method5420())) { + svar1 = "slu.ws"; + setScriptCallOnMousePressed(2933, svar1, 0, "s1", new WidgetPointer(arg0)); + } else { + svar0 = "dob"; + svar1 = "set_members_dob.ws"; + setScriptCallOnMousePressed(2931, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + } + setScriptCallOnMousePressed(2953, "", new WidgetPointer(arg1)); + break; + case 31: + svar0 = "displaynames"; + svar1 = "name.ws"; + setScriptCallOnMousePressed(2931, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(2953, "", new WidgetPointer(arg1)); + break; + case 19: + case 32: + case 40: + case 12: + svar0 = "dob"; + svar1 = "set_members_dob.ws"; + setScriptCallOnMousePressed(2931, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(2953, "", new WidgetPointer(arg1)); + break; + case 21: + setScriptCallOnMousePressed(3234, "", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(arg1)); + break; + default: + setScriptCallOnMousePressed(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(2953, "", new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2953.cs2 b/dumps/scripts/2953.cs2 new file mode 100644 index 000000000..c66cff889 --- /dev/null +++ b/dumps/scripts/2953.cs2 @@ -0,0 +1,4 @@ +void script_2953() { + script_2954(); + return; +} diff --git a/dumps/scripts/2954.cs2 b/dumps/scripts/2954.cs2 new file mode 100644 index 000000000..b39fe2ccc --- /dev/null +++ b/dumps/scripts/2954.cs2 @@ -0,0 +1,69 @@ +void script_2954() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + ivar0 = 39059463; + ivar1 = 39059464; + ivar2 = 39059470; + ivar3 = 39059469; + ivar4 = 39059471; + ivar5 = 39059519; + ivar6 = 39059472; + ivar7 = 39059473; + ivar8 = 39059474; + ivar9 = 39059521; + ivar10 = 39059522; + ivar11 = 39059523; + ivar12 = 39059475; + ivar13 = 39059524; + if (hasSSKey()) { + ivar0 = 63897626; + ivar1 = 63897601; + ivar2 = 63897604; + ivar3 = 63897603; + ivar4 = 63897605; + ivar5 = 63897606; + ivar6 = 63897611; + ivar7 = 63897612; + ivar8 = 63897613; + ivar9 = 63897607; + ivar10 = 63897608; + ivar11 = 63897609; + ivar12 = 63897614; + ivar13 = 63897610; + } + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar4)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar5)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(ivar5)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(ivar5)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(ivar4)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(ivar4)); + setWidgetPosition(6, 5, 0, 2, new WidgetPointer(ivar4)); + setWidgetPosition(6, 5, 0, 2, new WidgetPointer(ivar5)); + setWidgetText(new WidgetPointer(ivar12), ""); + setWidgetText(new WidgetPointer(ivar13), ""); + setWidgetIsHidden(true, new WidgetPointer(ivar4)); + setWidgetIsHidden(true, new WidgetPointer(ivar5)); + setWidgetText(new WidgetPointer(ivar2), ""); + globalint_1092 = 0; + setWidgetSprite(-1, new WidgetPointer(ivar3)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar3)); + setWidgetIsHidden(true, new WidgetPointer(ivar0)); + setWidgetIsHidden(true, new WidgetPointer(ivar1)); + if (hasSSKey()) { + return; + } + script_2940(11); + return; +} diff --git a/dumps/scripts/2955.cs2 b/dumps/scripts/2955.cs2 new file mode 100644 index 000000000..12ad7a19f --- /dev/null +++ b/dumps/scripts/2955.cs2 @@ -0,0 +1,23 @@ +void script_2955(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar5 = 4044; + ivar6 = 4044; + ivar7 = 4046; + setScriptCallOnMouseExit(2924, new WidgetPointer(arg1), ivar5, new WidgetPointer(arg2), ivar7, new WidgetPointer(arg3), ivar6, "IdIdId", new WidgetPointer(arg0)); + setWidgetSprite(ivar5, new WidgetPointer(arg1)); + setWidgetSprite(ivar7, new WidgetPointer(arg2)); + setWidgetSprite(ivar6, new WidgetPointer(arg3)); + ivar5 = 4045; + ivar6 = 4045; + ivar7 = 4047; + setScriptCallOnMouseEntered(2924, new WidgetPointer(arg1), ivar5, new WidgetPointer(arg2), ivar7, new WidgetPointer(arg3), ivar6, "IdIdId", new WidgetPointer(arg0)); + ivar8 = 39059475; + if (hasSSKey()) { + ivar8 = 63897614; + } + setWidgetText(new WidgetPointer(ivar8), arg5); + return; +} diff --git a/dumps/scripts/2956.cs2 b/dumps/scripts/2956.cs2 new file mode 100644 index 000000000..b2cff2c94 --- /dev/null +++ b/dumps/scripts/2956.cs2 @@ -0,0 +1,23 @@ +void script_2956(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar4 = 4044; + ivar5 = 4044; + ivar6 = 4046; + setScriptCallOnMouseExit(2924, new WidgetPointer(arg1), ivar4, new WidgetPointer(arg2), ivar6, new WidgetPointer(arg3), ivar5, "IdIdId", new WidgetPointer(arg0)); + setWidgetSprite(ivar4, new WidgetPointer(arg1)); + setWidgetSprite(ivar6, new WidgetPointer(arg2)); + setWidgetSprite(ivar5, new WidgetPointer(arg3)); + ivar4 = 4045; + ivar6 = 4047; + ivar5 = 4045; + setScriptCallOnMouseEntered(2924, new WidgetPointer(arg1), ivar4, new WidgetPointer(arg2), ivar6, new WidgetPointer(arg3), ivar5, "IdIdId", new WidgetPointer(arg0)); + ivar7 = 39059524; + if (hasSSKey()) { + ivar7 = 63897610; + } + setWidgetText(new WidgetPointer(ivar7), arg4); + return; +} diff --git a/dumps/scripts/2957.cs2 b/dumps/scripts/2957.cs2 new file mode 100644 index 000000000..e66eaef81 --- /dev/null +++ b/dumps/scripts/2957.cs2 @@ -0,0 +1,25 @@ +void script_2957(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + script_98(arg0, 0, 1040, 0, 0, ivar1, ivar2); + script_98(arg0, 1, 1275, 0, 0, 9, 9); + script_98(arg0, 2, 1276, ivar3, 0, 9, 9); + script_98(arg0, 3, 1277, 0, ivar4, 9, 9); + script_98(arg0, 4, 1278, ivar3, ivar4, 9, 9); + script_98(arg0, 5, 1279, 0, 9, 9, ivar6); + script_98(arg0, 6, 1280, 9, 0, ivar5, 9); + script_98(arg0, 7, 1281, ivar3, 9, 9, ivar6); + script_98(arg0, 8, 1282, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/2958.cs2 b/dumps/scripts/2958.cs2 new file mode 100644 index 000000000..da76d60f7 --- /dev/null +++ b/dumps/scripts/2958.cs2 @@ -0,0 +1,35 @@ +void script_2958(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + ivar4 = getWidgetParentId(new WidgetPointer(arg0)); + ivar5 = 0; + switch (arg1) { + case 20024: + ivar5 = bitconfig_8399; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 20012: + ivar5 = bitconfig_8400; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 20032: + ivar5 = bitconfig_8403; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 20036: + ivar5 = bitconfig_8402; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 20040: + ivar5 = bitconfig_8404; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + break; + case 20028: + ivar5 = bitconfig_8401; + setWidgetText(new WidgetPointer(arg3), getItemName(arg1) + "
" + "(" + intToStr(ivar5) + "/" + intToStr(arg2) + ")"); + } + setItemOnWidgetMethod2205(arg1, -1, new WidgetPointer(arg0)); + setWidgetBorderThickness(1, new WidgetPointer(arg0)); + cs2method2314(171, new WidgetPointer(arg3)); + return; +} diff --git a/dumps/scripts/2959.cs2 b/dumps/scripts/2959.cs2 new file mode 100644 index 000000000..014f95ec0 --- /dev/null +++ b/dumps/scripts/2959.cs2 @@ -0,0 +1,7 @@ +void script_2959(int arg0) { + cs2method2309(1, 170, new WidgetPointer(arg0)); + cs2method2309(2, 170, new WidgetPointer(arg0)); + cs2method2309(3, 170, new WidgetPointer(arg0)); + cs2method2309(4, 170, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/296.cs2 b/dumps/scripts/296.cs2 new file mode 100644 index 000000000..d7352fa05 --- /dev/null +++ b/dumps/scripts/296.cs2 @@ -0,0 +1,26 @@ +cs2func_script_296_struct(2,0,0) script_296(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int stack_dump0; + opcStruct5224(2,0,0) structdump_1; + ivar7 = 0; + ivar8 = 0; + if (((boolean)arg1)) { + ivar7 = extractX(arg0); + ivar8 = extractY(arg0); + } else { + stack_dump0 = arg0; + structdump_1 = cs2method5224(stack_dump0); + ivar8 = structdump_1.intpart_1; + ivar7 = structdump_1.intpart_0; + } + ivar9 = getWidgetActualWidth(new WidgetPointer(arg2)); + ivar10 = getWidgetActualHeight(new WidgetPointer(arg2)); + ivar7 = multiplyDivide(ivar9, subtract(arg5, arg6), subtract(ivar7, arg6)); + ivar8 = multiplyDivide(ivar10, subtract(arg3, arg4), subtract(ivar8, arg4)); + ivar7 = subtract(ivar7, divide(ivar9, 2)); + ivar8 = subtract(divide(ivar10, 2), ivar8); + return newstruct cs2func_script_296_struct(ivar7, ivar8); +} diff --git a/dumps/scripts/2960.cs2 b/dumps/scripts/2960.cs2 new file mode 100644 index 000000000..3d99600f7 --- /dev/null +++ b/dumps/scripts/2960.cs2 @@ -0,0 +1,21 @@ +void script_2960(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + if (arg0 != -1) { + if (((boolean)arg4)) { + setWidgetSprite(2525, new WidgetPointer(arg0)); + } else { + setWidgetSprite(2524, new WidgetPointer(arg0)); + } + } + if (arg1 != -1) { + if (((boolean)arg4)) { + setWidgetText(new WidgetPointer(arg0), arg5); + setWidgetRGB(new Color(250, 215, 134), new WidgetPointer(arg2)); + setWidgetSize(add(getTextWidth(arg3, arg5), 23), getWidgetActualHeight(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + } else { + setWidgetText(new WidgetPointer(arg2), arg5); + setWidgetRGB(new Color(231, 172, 36), new WidgetPointer(arg2)); + setWidgetSize(add(getTextWidth(arg3, arg5), 23), getWidgetActualHeight(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + } + } + return; +} diff --git a/dumps/scripts/2961.cs2 b/dumps/scripts/2961.cs2 new file mode 100644 index 000000000..5af230c70 --- /dev/null +++ b/dumps/scripts/2961.cs2 @@ -0,0 +1,18 @@ +void script_2961(int arg0,int arg1,int arg2) { + if (((boolean)arg2)) { + if (((boolean)globalint_986)) { + setWidgetSprite(2702, new WidgetPointer(arg0)); + } else { + setWidgetSprite(2701, new WidgetPointer(arg0)); + } + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(arg1)); + } else { + if (((boolean)globalint_986)) { + setWidgetSprite(2700, new WidgetPointer(arg0)); + } else { + setWidgetSprite(2703, new WidgetPointer(arg0)); + } + setWidgetRGB(new Color(178, 170, 159), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2962.cs2 b/dumps/scripts/2962.cs2 new file mode 100644 index 000000000..74d571349 --- /dev/null +++ b/dumps/scripts/2962.cs2 @@ -0,0 +1,13 @@ +void script_2962(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + if (getClientCycle() >= arg6) { + globalint_176 = add(globalint_176, 2); + setScriptCallOnGameloop(1249, new WidgetPointer(arg0), new WidgetPointer(arg2), new WidgetPointer(arg1), "III", new WidgetPointer(arg0)); + globalint_177 = 0; + setScriptCallOnMousePressed(2713, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "IIIIII", new WidgetPointer(arg3)); + setScriptCallOnMouseOver(2961, new WidgetPointer(arg4), new WidgetPointer(arg5), 1, "II1", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(2961, new WidgetPointer(arg4), new WidgetPointer(arg5), 0, "II1", new WidgetPointer(arg3)); + setWidgetSprite(2703, new WidgetPointer(arg4)); + globalint_986 = 0; + } + return; +} diff --git a/dumps/scripts/2963.cs2 b/dumps/scripts/2963.cs2 new file mode 100644 index 000000000..fbb57951d --- /dev/null +++ b/dumps/scripts/2963.cs2 @@ -0,0 +1,12 @@ +void script_2963(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + if (getClientCycle() >= arg6) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setScriptCallOnMousePressed(2713, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "IIIIII", new WidgetPointer(arg3)); + setScriptCallOnMouseOver(2961, new WidgetPointer(arg4), new WidgetPointer(arg5), 1, "II1", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(2961, new WidgetPointer(arg4), new WidgetPointer(arg5), 0, "II1", new WidgetPointer(arg3)); + setWidgetSprite(2700, new WidgetPointer(arg4)); + globalint_986 = 1; + } + return; +} diff --git a/dumps/scripts/2964.cs2 b/dumps/scripts/2964.cs2 new file mode 100644 index 000000000..e3b959c84 --- /dev/null +++ b/dumps/scripts/2964.cs2 @@ -0,0 +1,27 @@ +cs2func_script_2964_struct(2,0,0) script_2964(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 7); + cs2method5405(1, 7); + cs2method5406(0, 0, 27727014, 890, 27808931, 895, 0); + cs2method5406(1, 0, 27858076, 605, 27890842, 615, 0); + cs2method5406(0, 1, 27907228, 995, 27956377, 1060, 0); + cs2method5406(1, 1, 27874444, 855, 27874444, 835, 0); + script_1899(0, 200, 300); + cs2method5406(0, 2, 28005518, 1525, 28005514, 1540, 0); + cs2method5406(1, 2, 27874444, 855, 27874444, 852, 0); + script_1899(1, 200, 300); + cs2method5406(0, 3, 27874437, 1575, 27792517, 1575, 0); + cs2method5406(1, 3, 27874444, 885, 27874444, 865, 0); + script_1899(2, 300, 400); + cs2method5406(0, 4, 27759756, 1605, 27759758, 1600, 0); + cs2method5406(1, 4, 27874444, 890, 27874444, 880, 0); + script_1899(3, 300, 400); + cs2method5406(0, 5, 27874452, 1615, 27874452, 1605, 0); + cs2method5406(1, 5, 27874444, 905, 27874444, 895, 0); + script_1899(4, 300, 400); + cs2method5406(0, 6, 27874452, 1610, 27874452, 1585, 0); + cs2method5406(1, 6, 27874444, 900, 27874444, 865, 0); + script_1899(5, 300, 400); + } + return newstruct cs2func_script_2964_struct(27661487, 1250324); +} diff --git a/dumps/scripts/2965.cs2 b/dumps/scripts/2965.cs2 new file mode 100644 index 000000000..5a05fb08f --- /dev/null +++ b/dumps/scripts/2965.cs2 @@ -0,0 +1,4 @@ +void script_2965() { + script_2276(globalint_1199, globalint_1210, 61145357); + return; +} diff --git a/dumps/scripts/2966.cs2 b/dumps/scripts/2966.cs2 new file mode 100644 index 000000000..029176e90 --- /dev/null +++ b/dumps/scripts/2966.cs2 @@ -0,0 +1,4 @@ +void script_2966() { + script_2276(globalint_1199, globalint_1211, 61145358); + return; +} diff --git a/dumps/scripts/2967.cs2 b/dumps/scripts/2967.cs2 new file mode 100644 index 000000000..853b89480 --- /dev/null +++ b/dumps/scripts/2967.cs2 @@ -0,0 +1,50 @@ +void script_2967(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + script_3209(); + script_3208(1); + ivar1 = script_3228(7, 0, 0); + ivar2 = script_3228(8, 0, 0); + ivar3 = 1; + if (((stringMethod4107(globalstring_124, globalstring_125) != 0) && (strLength(globalstring_124) > 0)) && (strLength(globalstring_125) > 0)) { + script_3213(44105802, "Please ensure both passwords match."); + ivar3 = 0; + } + ivar4 = 1; + if (strLength(globalstring_122) <= 0) { + script_3213(44105822, "Please enter your Email address here."); + ivar4 = 0; + } + if (((boolean)script_3936(globalstring_122))) { + script_3213(44105822, "Please enter a valid Email address."); + ivar4 = 0; + } + ivar5 = 1; + if (strLength(globalstring_326) <= 0) { + script_3213(44105841, "Please enter your Email address again here."); + ivar5 = 0; + } + if (stringMethod4107(globalstring_122, globalstring_326) != 0) { + script_3213(44105841, "Please ensure both Email addresses match."); + ivar5 = 0; + } + ivar6 = script_3954(0); + if (((((boolean)ivar4) && ((boolean)ivar5)) && (((boolean)ivar1) && ((boolean)ivar2))) && (((boolean)ivar3) && ((boolean)ivar6))) { + if (globalint_1407 < 13) { + setAgeMinor(); + script_4038(); + } else if (isAgeMinor()) { + script_4038(); + } else { + sendCreateAccount(globalint_1407, globalint_1411, globalstring_122, globalstring_124); + setScriptCallOnGameloop(3220, "", new WidgetPointer(673,26)); + } + } else { + script_3208(0); + } + return; +} diff --git a/dumps/scripts/2968.cs2 b/dumps/scripts/2968.cs2 new file mode 100644 index 000000000..a985a9bd0 --- /dev/null +++ b/dumps/scripts/2968.cs2 @@ -0,0 +1,17 @@ +void script_2968(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = getWidgetParentId(new WidgetPointer(arg0)); + ivar4 = 0; + ivar4 = getItemAmtInContainer(93, arg1); + if (ivar4 > 0) { + setWidgetRGB(new Color(125, 215, 100), new WidgetPointer(arg2)); + setItemOnWidgetMethod2200(arg1, ivar4, new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(135, 35, 0), new WidgetPointer(arg2)); + setItemOnWidgetMethod2200(arg1, -1, new WidgetPointer(arg0)); + } + setWidgetBorderThickness(1, new WidgetPointer(arg0)); + cs2method2314(171, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/2969.cs2 b/dumps/scripts/2969.cs2 new file mode 100644 index 000000000..f0581ce23 --- /dev/null +++ b/dumps/scripts/2969.cs2 @@ -0,0 +1,4 @@ +void script_2969() { + script_2971(globalint_1404, globalint_1405); + return; +} diff --git a/dumps/scripts/297.cs2 b/dumps/scripts/297.cs2 new file mode 100644 index 000000000..598327337 --- /dev/null +++ b/dumps/scripts/297.cs2 @@ -0,0 +1,147 @@ +int script_297(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + cs2func_script_296_struct(2,0,0) structdump_7; + cs2func_script_296_struct(2,0,0) structdump_8; + cs2func_script_2413_struct(3,0,0) structdump_9; + if (((boolean)bitconfig_6175)) { + return arg10; + } + arg3 = 16776960; + ivar11 = add(arg10, 1); + ivar12 = add(arg10, 2); + ivar13 = add(arg10, 3); + ivar14 = add(arg10, 4); + ivar15 = 0; + ivar16 = 0; + stack_dump0 = arg0; + stack_dump1 = arg2; + stack_dump2 = arg5; + stack_dump3 = arg6; + stack_dump4 = arg7; + stack_dump5 = arg8; + stack_dump6 = arg9; + structdump_7 = script_296(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6); + ivar16 = structdump_7.intpart_1; + ivar15 = structdump_7.intpart_0; + ivar17 = 0; + ivar18 = 0; + stack_dump0 = arg1; + stack_dump1 = arg2; + stack_dump2 = arg5; + stack_dump3 = arg6; + stack_dump4 = arg7; + stack_dump5 = arg8; + stack_dump6 = arg9; + structdump_8 = script_296(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6); + ivar18 = structdump_8.intpart_1; + ivar17 = structdump_8.intpart_0; + ivar19 = add(ivar15, divide(subtract(ivar17, ivar15), 2)); + ivar20 = add(ivar16, divide(subtract(ivar18, ivar16), 2)); + ivar21 = subtract(ivar17, ivar15); + ivar22 = subtract(ivar18, ivar16); + ivar23 = 0; + if (ivar21 < 0) { + if (ivar22 < 0) { + ivar21 = subtract(0, ivar21); + ivar22 = subtract(0, ivar22); + } else { + ivar21 = subtract(0, ivar21); + ivar23 = 1; + } + } else { + if (ivar22 < 0) { + ivar22 = subtract(0, ivar22); + ivar23 = 1; + } + } + if (setWidgetRegister(new WidgetPointer(arg5), arg10) && setWidgetRegister(new WidgetPointer(arg5), ivar11)) { + setWidgetPosition(add(ivar15, 1), add(ivar16, 1), 1, 1); + setWidgetPosition(add(ivar17, 1), add(ivar18, 1), 1, 1); + } else { + createExtraChild(new WidgetPointer(arg5), 3, arg10); + createExtraChild(new WidgetPointer(arg5), 3, ivar11); + setWidgetPosition(add(ivar15, 1), add(ivar16, 1), 1, 1); + setWidgetPosition(add(ivar17, 1), add(ivar18, 1), 1, 1); + setWidgetSize(arg4, arg4, 0, 0); + setWidgetSize(arg4, arg4, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFilled(1); + setWidgetFilled(1); + } + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + ivar27 = 0; + if (setWidgetRegister(new WidgetPointer(arg5), ivar12) && setWidgetRegister(new WidgetPointer(arg5), ivar13)) { + setWidgetPosition(ivar15, ivar16, 1, 1); + setWidgetPosition(ivar17, ivar18, 1, 1); + } else { + stack_dump0 = arg3; + structdump_9 = script_2413(stack_dump0); + ivar26 = structdump_9.intpart_2; + ivar25 = structdump_9.intpart_1; + ivar24 = structdump_9.intpart_0; + stack_dump0 = max(subtract(ivar24, 48), 0); + stack_dump1 = max(subtract(ivar25, 48), 0); + ivar26 = max(subtract(ivar26, 48), 0); + stack_dump0 = stack_dump0; + ivar25 = stack_dump1; + ivar24 = stack_dump0; + ivar27 = script_693(ivar24, ivar25, ivar26); + createExtraChild(new WidgetPointer(arg5), 3, ivar12); + createExtraChild(new WidgetPointer(arg5), 3, ivar13); + setWidgetPosition(ivar15, ivar16, 1, 1); + setWidgetPosition(ivar17, ivar18, 1, 1); + setWidgetSize(arg4, arg4, 0, 0); + setWidgetSize(arg4, arg4, 0, 0); + setWidgetRGB(new Color(ivar27)); + setWidgetRGB(new Color(ivar27)); + setWidgetFilled(1); + setWidgetFilled(1); + setScriptCallOnMouseEntered(301, 1, new WidgetPointer(arg5), ivar12, ivar13, ivar14, arg3, "1Iiiii"); + setScriptCallOnMouseEntered(301, 1, new WidgetPointer(arg5), ivar12, ivar13, ivar14, arg3, "1Iiiii"); + setScriptCallOnMouseExit(301, 0, new WidgetPointer(arg5), ivar12, ivar13, ivar14, ivar27, "1Iiiii"); + setScriptCallOnMouseExit(301, 0, new WidgetPointer(arg5), ivar12, ivar13, ivar14, ivar27, "1Iiiii"); + setWidgetContextMenuOption(1, "Scroll map"); + setWidgetContextMenuOption(1, "Scroll map"); + setScriptCallOnClickContextMenu(302, -2147483644, arg1, arg2, "ic1"); + setScriptCallOnClickContextMenu(302, -2147483644, arg0, arg2, "ic1"); + } + if (setWidgetRegister(new WidgetPointer(arg5), ivar14)) { + setWidgetPosition(ivar19, ivar20, 1, 1); + setWidgetSize(ivar21, ivar22, 0, 0); + } else { + createExtraChild(new WidgetPointer(arg5), 9, ivar14); + setWidgetPosition(ivar19, ivar20, 1, 1); + setWidgetSize(ivar21, ivar22, 0, 0); + cs2method1124(ivar23); + cs2method1104(add(1, divide(arg4, 5))); + setWidgetRGB(new Color(arg3)); + setWidgetHidden(1); + } + return add(ivar14, 1); +} diff --git a/dumps/scripts/2970.cs2 b/dumps/scripts/2970.cs2 new file mode 100644 index 000000000..860b1312b --- /dev/null +++ b/dumps/scripts/2970.cs2 @@ -0,0 +1,4 @@ +void script_2970(int arg0,int arg1) { + script_2971(arg0, arg1); + return; +} diff --git a/dumps/scripts/2971.cs2 b/dumps/scripts/2971.cs2 new file mode 100644 index 000000000..7c4278a3f --- /dev/null +++ b/dumps/scripts/2971.cs2 @@ -0,0 +1,118 @@ +void script_2971(int arg0,int arg1) { + int ivar2; + int ivar3; + string svar0; + string svar1; + string svar2; + flow_0: + svar0 = ""; + svar1 = ""; + svar2 = ""; + ivar2 = -1; + ivar3 = -1; + SWITCH (arg0) { + case 0: + GOTO flow_1 + case 1: + GOTO flow_2 + case 2: + GOTO flow_3 + case 3: + GOTO flow_4 + case 4: + GOTO flow_5 + case 5: + GOTO flow_6 + case 6: + GOTO flow_7 + case 7: + GOTO flow_8 + } + svar0 = "Unknown"; + svar1 = "This should not get here."; + svar2 = "This should never get here."; + ivar2 = 62129; + ivar3 = 30081093; + GOTO flow_9 + flow_1: + svar0 = "Nothing."; + svar1 = "There are no requirements for building this feature."; + svar2 = "This feature is an abscence of anything. Oddly, some creatures prefer the minimalist approach."; + ivar2 = 62129; + ivar3 = 30081093; + GOTO flow_9 + flow_2: + svar0 = "Pond"; + svar1 = "You need a Construction level of 65 to build a pond."; + svar2 = "Ponds attract creatures with an affinity for water. They are essentially very small, man-made lakes...or glorified puddles, depending on your view."; + ivar3 = 30081092; + ivar2 = 62128; + GOTO flow_9 + flow_3: + svar0 = "Tall grass"; + svar1 = "You need a Construction level of 62 to build tall grass."; + svar2 = "Tall grass is favoured by creatures who sneak and hide. It's also a favourite with people too lazy to trim their lawn. Essentially, it's a patch of land allowed to grow wild."; + ivar3 = 30081094; + ivar2 = 62134; + GOTO flow_9 + flow_4: + svar0 = "Abandoned house"; + svar1 = "You need a Construction level of 57 to build an abandoned house."; + svar2 = "Something approximating an abandoned house: popular amongst creatures that think they're domesticated."; + ivar3 = 30081095; + ivar2 = 62132; + GOTO flow_9 + flow_5: + svar0 = "Thermal vent"; + svar1 = "You need a Construction level of 59 to build a thermal vent."; + svar2 = "A home-made volcano, or, at least, something that looks like one. These are popular among earthy creatures."; + ivar3 = 30081096; + ivar2 = 62133; + GOTO flow_9 + flow_6: + svar0 = "Standing stones"; + svar1 = "You need a Construction level of 70 to build standing stones."; + svar2 = "A circle of home-made mystical stones, popular among creatures that are more magically inclined."; + ivar3 = 30081097; + ivar2 = 62136; + GOTO flow_9 + flow_7: + svar0 = "Dark pit"; + svar1 = "You need a Construction level of 80 to build a dark pit."; + svar2 = "A deep, dark, endless pit, popular among the more sinister creatures. Don't look too closely: you might fall in."; + ivar3 = 30081098; + ivar2 = 62131; + GOTO flow_9 + flow_8: + svar0 = "Boneyard"; + svar1 = "You need a Construction level of 56 to build a boneyard."; + svar2 = "An animal graveyard, or a collection of well-made bone mockeries. Popular among scavengers and sinister creatures."; + ivar3 = 30081099; + ivar2 = 62135; + flow_9: + script_2973(); + if (getSkillCurrentLvl(22) < arg1) { + setWidgetRGB(new Color(204, 204, 0), new WidgetPointer(459,37)); + svar2 = concat(svar2, "
" + "
" + "You can pay Papa Mambo to build this for you."); + } else { + setWidgetRGB(new Color(0, 204, 0), new WidgetPointer(459,37)); + } + setWidgetText(new WidgetPointer(459,37), svar0); + setWidgetText(new WidgetPointer(459,38), svar1); + setWidgetText(new WidgetPointer(459,36), svar2); + setWidgetModel(ivar2, new WidgetPointer(459,35)); + setWidgetIsHidden(true, new WidgetPointer(459,69)); + setWidgetIsHidden(true, new WidgetPointer(459,68)); + setWidgetIsHidden(true, new WidgetPointer(459,70)); + setWidgetIsHidden(true, new WidgetPointer(459,71)); + setWidgetIsHidden(true, new WidgetPointer(459,72)); + setWidgetIsHidden(true, new WidgetPointer(459,73)); + setWidgetIsHidden(true, new WidgetPointer(459,74)); + setWidgetIsHidden(true, new WidgetPointer(459,75)); + if (ivar3 != -1) { + setWidgetIsHidden(false, new WidgetPointer(ivar3)); + } else { + setWidgetIsHidden(false, new WidgetPointer(459,69)); + } + return; +} diff --git a/dumps/scripts/2972.cs2 b/dumps/scripts/2972.cs2 new file mode 100644 index 000000000..7e451fa80 --- /dev/null +++ b/dumps/scripts/2972.cs2 @@ -0,0 +1,4 @@ +void script_2972() { + script_2973(); + return; +} diff --git a/dumps/scripts/2973.cs2 b/dumps/scripts/2973.cs2 new file mode 100644 index 000000000..52759e0ac --- /dev/null +++ b/dumps/scripts/2973.cs2 @@ -0,0 +1,38 @@ +void script_2973() { + if (getSkillCurrentLvl(22) < 56) { + setWidgetRGB(new Color(134, 131, 96), new WidgetPointer(459,27)); + } else { + setWidgetRGB(new Color(234, 231, 196), new WidgetPointer(459,27)); + } + if (getSkillCurrentLvl(22) < 57) { + setWidgetRGB(new Color(134, 131, 96), new WidgetPointer(459,23)); + } else { + setWidgetRGB(new Color(234, 231, 196), new WidgetPointer(459,23)); + } + if (getSkillCurrentLvl(22) < 59) { + setWidgetRGB(new Color(134, 131, 96), new WidgetPointer(459,19)); + } else { + setWidgetRGB(new Color(234, 231, 196), new WidgetPointer(459,19)); + } + if (getSkillCurrentLvl(22) < 62) { + setWidgetRGB(new Color(134, 131, 96), new WidgetPointer(459,15)); + } else { + setWidgetRGB(new Color(234, 231, 196), new WidgetPointer(459,15)); + } + if (getSkillCurrentLvl(22) < 65) { + setWidgetRGB(new Color(134, 131, 96), new WidgetPointer(459,7)); + } else { + setWidgetRGB(new Color(234, 231, 196), new WidgetPointer(459,7)); + } + if (getSkillCurrentLvl(22) < 70) { + setWidgetRGB(new Color(134, 131, 96), new WidgetPointer(459,11)); + } else { + setWidgetRGB(new Color(234, 231, 196), new WidgetPointer(459,11)); + } + if (getSkillCurrentLvl(22) < 80) { + setWidgetRGB(new Color(134, 131, 96), new WidgetPointer(459,3)); + } else { + setWidgetRGB(new Color(234, 231, 196), new WidgetPointer(459,3)); + } + return; +} diff --git a/dumps/scripts/2974.cs2 b/dumps/scripts/2974.cs2 new file mode 100644 index 000000000..d492669d6 --- /dev/null +++ b/dumps/scripts/2974.cs2 @@ -0,0 +1,23 @@ +void script_2974(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar1 = getWidgetRotateY(new WidgetPointer(arg0)); + ivar2 = getWidgetRotateX(new WidgetPointer(arg0)); + ivar3 = cs2method2607(new WidgetPointer(arg0)); + ivar4 = getWidget3DDistance(new WidgetPointer(arg0)); + ivar5 = cs2method2610(new WidgetPointer(arg0)); + ivar6 = cs2method2611(new WidgetPointer(arg0)); + ivar7 = 0; + if (ivar1 == 2047) { + ivar7 = 0; + } else { + ivar7 = add(ivar1, 1); + } + setWidget3DRotation(ivar5, ivar6, ivar2, ivar7, ivar3, ivar4, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2975.cs2 b/dumps/scripts/2975.cs2 new file mode 100644 index 000000000..f363c3328 --- /dev/null +++ b/dumps/scripts/2975.cs2 @@ -0,0 +1,12 @@ +void script_2975(int arg0,int arg1,int arg2,int arg3) { + if (((boolean)arg3)) { + setWidgetSprite(4032, new WidgetPointer(arg0)); + setWidgetSprite(4032, new WidgetPointer(arg2)); + setWidgetSprite(4038, new WidgetPointer(arg1)); + } else { + setWidgetSprite(4031, new WidgetPointer(arg0)); + setWidgetSprite(4031, new WidgetPointer(arg2)); + setWidgetSprite(4037, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/2976.cs2 b/dumps/scripts/2976.cs2 new file mode 100644 index 000000000..0ea29900f --- /dev/null +++ b/dumps/scripts/2976.cs2 @@ -0,0 +1,48 @@ +void script_2976(int arg0) { + flow_0: + SWITCH (globalint_1406) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + case 8: + GOTO flow_8 + } + cameraUnlock(); + GOTO flow_9 + flow_1: + script_2977(arg0); + GOTO flow_9 + flow_2: + script_2978(arg0); + GOTO flow_9 + flow_3: + script_2979(arg0); + GOTO flow_9 + flow_4: + script_2980(arg0); + GOTO flow_9 + flow_5: + script_2981(arg0); + GOTO flow_9 + flow_6: + script_2982(arg0); + GOTO flow_9 + flow_7: + script_2983(arg0); + GOTO flow_9 + flow_8: + script_2984(arg0); + flow_9: + return; +} diff --git a/dumps/scripts/2977.cs2 b/dumps/scripts/2977.cs2 new file mode 100644 index 000000000..77a82b6f5 --- /dev/null +++ b/dumps/scripts/2977.cs2 @@ -0,0 +1,14 @@ +void script_2977(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, addToCoordinate(ivar1, 23, 0, 25), 700, addToCoordinate(ivar1, 23, 0, 25), 700, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 30, 0, 33), 400, addToCoordinate(ivar1, 30, 0, 22), 400, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 23, 0, 25), 700, addToCoordinate(ivar1, 23, 0, 25), 700, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 27, 0, 29), 500, addToCoordinate(ivar1, 27, 0, 29), 500, 0); + cs2method5406(0, 2, addToCoordinate(ivar1, 23, 0, 25), 700, addToCoordinate(ivar1, 23, 0, 25), 700, 0); + cs2method5406(1, 2, addToCoordinate(ivar1, 31, 0, 33), 400, addToCoordinate(ivar1, 31, 0, 33), 400, 0); + cameraMethod5502(0, 0, 1000000, 1000000, 1, 0); + return; +} diff --git a/dumps/scripts/2978.cs2 b/dumps/scripts/2978.cs2 new file mode 100644 index 000000000..1ef95c793 --- /dev/null +++ b/dumps/scripts/2978.cs2 @@ -0,0 +1,12 @@ +void script_2978(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 23, 0, 25), 700, addToCoordinate(ivar1, 23, 0, 25), 700, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 31, 0, 33), 400, addToCoordinate(ivar1, 31, 0, 22), 400, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 31, 0, 25), 800, addToCoordinate(ivar1, 31, 0, 25), 800, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 31, 0, 33), 300, addToCoordinate(ivar1, 31, 0, 33), 300, 0); + cameraMethod5502(0, 0, 450, 450, 1, 0); + return; +} diff --git a/dumps/scripts/2979.cs2 b/dumps/scripts/2979.cs2 new file mode 100644 index 000000000..75547d4b7 --- /dev/null +++ b/dumps/scripts/2979.cs2 @@ -0,0 +1,12 @@ +void script_2979(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 31, 0, 25), 800, addToCoordinate(ivar1, 31, 0, 25), 800, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 31, 0, 33), 300, addToCoordinate(ivar1, 31, 0, 33), 300, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 30, 0, 25), 900, addToCoordinate(ivar1, 30, 0, 25), 900, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 30, 0, 33), 500, addToCoordinate(ivar1, 30, 0, 33), 500, 0); + cameraMethod5502(0, 0, 450, 450, 1, 0); + return; +} diff --git a/dumps/scripts/298.cs2 b/dumps/scripts/298.cs2 new file mode 100644 index 000000000..b2c9753de --- /dev/null +++ b/dumps/scripts/298.cs2 @@ -0,0 +1,127 @@ +int script_298(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + cs2func_script_296_struct(2,0,0) structdump_7; + cs2func_script_296_struct(2,0,0) structdump_8; + cs2func_script_2413_struct(3,0,0) structdump_9; + if (((boolean)bitconfig_6175)) { + return arg10; + } + arg3 = 16776960; + ivar11 = add(arg10, 1); + ivar12 = add(arg10, 2); + ivar13 = 0; + ivar14 = 0; + stack_dump0 = arg0; + stack_dump1 = arg2; + stack_dump2 = arg5; + stack_dump3 = arg6; + stack_dump4 = arg7; + stack_dump5 = arg8; + stack_dump6 = arg9; + structdump_7 = script_296(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6); + ivar14 = structdump_7.intpart_1; + ivar13 = structdump_7.intpart_0; + ivar15 = 0; + ivar16 = 0; + stack_dump0 = arg1; + stack_dump1 = arg2; + stack_dump2 = arg5; + stack_dump3 = arg6; + stack_dump4 = arg7; + stack_dump5 = arg8; + stack_dump6 = arg9; + structdump_8 = script_296(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6); + ivar16 = structdump_8.intpart_1; + ivar15 = structdump_8.intpart_0; + ivar17 = add(ivar13, divide(subtract(ivar15, ivar13), 2)); + ivar18 = add(ivar14, divide(subtract(ivar16, ivar14), 2)); + ivar19 = subtract(ivar15, ivar13); + ivar20 = subtract(ivar16, ivar14); + ivar21 = 0; + if (ivar19 < 0) { + if (ivar20 < 0) { + ivar19 = subtract(0, ivar19); + ivar20 = subtract(0, ivar20); + } else { + ivar19 = subtract(0, ivar19); + ivar21 = 1; + } + } else { + if (ivar20 < 0) { + ivar20 = subtract(0, ivar20); + ivar21 = 1; + } + } + if (setWidgetRegister(new WidgetPointer(arg5), arg10)) { + setWidgetPosition(add(ivar13, 1), add(ivar14, 1), 1, 1); + } else { + createExtraChild(new WidgetPointer(arg5), 3, arg10); + setWidgetPosition(add(ivar13, 1), add(ivar14, 1), 1, 1); + setWidgetSize(arg4, arg4, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFilled(1); + } + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + if (setWidgetRegister(new WidgetPointer(arg5), ivar11)) { + setWidgetPosition(ivar13, ivar14, 1, 1); + } else { + stack_dump0 = arg3; + structdump_9 = script_2413(stack_dump0); + ivar24 = structdump_9.intpart_2; + ivar23 = structdump_9.intpart_1; + ivar22 = structdump_9.intpart_0; + stack_dump0 = max(subtract(ivar22, 48), 0); + stack_dump1 = max(subtract(ivar23, 48), 0); + ivar24 = max(subtract(ivar24, 48), 0); + stack_dump0 = stack_dump0; + ivar23 = stack_dump1; + ivar22 = stack_dump0; + ivar25 = script_693(ivar22, ivar23, ivar24); + createExtraChild(new WidgetPointer(arg5), 3, ivar11); + setWidgetPosition(ivar13, ivar14, 1, 1); + setWidgetSize(arg4, arg4, 0, 0); + setWidgetRGB(new Color(ivar25)); + setWidgetFilled(1); + setScriptCallOnMouseEntered(301, 1, new WidgetPointer(arg5), ivar11, -1, ivar12, arg3, "1Iiiii"); + setScriptCallOnMouseExit(301, 0, new WidgetPointer(arg5), ivar11, -1, ivar12, ivar25, "1Iiiii"); + setWidgetContextMenuOption(1, "Scroll map"); + setScriptCallOnClickContextMenu(302, -2147483644, arg1, arg2, "ic1"); + } + if (setWidgetRegister(new WidgetPointer(arg5), ivar12)) { + setWidgetPosition(ivar17, ivar18, 1, 1); + setWidgetSize(ivar19, ivar20, 0, 0); + } else { + createExtraChild(new WidgetPointer(arg5), 9, ivar12); + setWidgetPosition(ivar17, ivar18, 1, 1); + setWidgetSize(ivar19, ivar20, 0, 0); + cs2method1124(ivar21); + cs2method1104(add(1, divide(arg4, 5))); + setWidgetRGB(new Color(arg3)); + setWidgetHidden(1); + } + return add(ivar12, 1); +} diff --git a/dumps/scripts/2980.cs2 b/dumps/scripts/2980.cs2 new file mode 100644 index 000000000..e009a1866 --- /dev/null +++ b/dumps/scripts/2980.cs2 @@ -0,0 +1,12 @@ +void script_2980(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 19, 0, 28), 900, addToCoordinate(ivar1, 19, 0, 28), 900, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 27, 0, 29), 400, addToCoordinate(ivar1, 27, 0, 29), 400, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 19, 0, 28), 1000, addToCoordinate(ivar1, 19, 0, 28), 1000, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 25, 0, 29), 300, addToCoordinate(ivar1, 25, 0, 29), 300, 0); + cameraMethod5502(0, 0, 450, 450, 1, 0); + return; +} diff --git a/dumps/scripts/2981.cs2 b/dumps/scripts/2981.cs2 new file mode 100644 index 000000000..213da3a1e --- /dev/null +++ b/dumps/scripts/2981.cs2 @@ -0,0 +1,12 @@ +void script_2981(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 22, 0, 20), 700, addToCoordinate(ivar1, 22, 0, 20), 700, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 20, 0, 31), 500, addToCoordinate(ivar1, 20, 0, 31), 500, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 22, 0, 25), 700, addToCoordinate(ivar1, 22, 0, 25), 700, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 20, 0, 31), 400, addToCoordinate(ivar1, 20, 0, 31), 400, 0); + cameraMethod5502(0, 0, 450, 450, 1, 0); + return; +} diff --git a/dumps/scripts/2982.cs2 b/dumps/scripts/2982.cs2 new file mode 100644 index 000000000..7cd35f5b8 --- /dev/null +++ b/dumps/scripts/2982.cs2 @@ -0,0 +1,12 @@ +void script_2982(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 22, 0, 25), 1000, addToCoordinate(ivar1, 22, 0, 25), 1000, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 20, 0, 31), 300, addToCoordinate(ivar1, 20, 0, 31), 300, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 30, 0, 23), 1000, addToCoordinate(ivar1, 30, 0, 23), 1000, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 12, 0, 30), 300, addToCoordinate(ivar1, 12, 0, 30), 300, 0); + cameraMethod5502(0, 0, 450, 450, 1, 0); + return; +} diff --git a/dumps/scripts/2983.cs2 b/dumps/scripts/2983.cs2 new file mode 100644 index 000000000..6698d3d94 --- /dev/null +++ b/dumps/scripts/2983.cs2 @@ -0,0 +1,12 @@ +void script_2983(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 26, 0, 23), 500, addToCoordinate(ivar1, 26, 0, 23), 500, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 12, 0, 30), 400, addToCoordinate(ivar1, 12, 0, 30), 400, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 30, 0, 25), 900, addToCoordinate(ivar1, 30, 0, 25), 900, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 30, 0, 33), 500, addToCoordinate(ivar1, 30, 0, 33), 500, 0); + cameraMethod5502(0, 0, 450, 950, 1, 0); + return; +} diff --git a/dumps/scripts/2984.cs2 b/dumps/scripts/2984.cs2 new file mode 100644 index 000000000..5ab219ae1 --- /dev/null +++ b/dumps/scripts/2984.cs2 @@ -0,0 +1,15 @@ +void script_2984(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, addToCoordinate(ivar1, 26, 0, 3), 400, addToCoordinate(ivar1, 26, 0, 3), 400, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 12, 0, 23), 300, addToCoordinate(ivar1, 12, 0, 23), 300, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 28, 0, 16), 700, addToCoordinate(ivar1, 28, 0, 16), 700, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 13, 0, 22), 400, addToCoordinate(ivar1, 13, 0, 22), 400, 0); + cs2method5406(0, 2, addToCoordinate(ivar1, 36, 0, 16), 800, addToCoordinate(ivar1, 36, 0, 16), 800, 0); + cs2method5406(1, 2, addToCoordinate(ivar1, 36, 0, 22), 400, addToCoordinate(ivar1, 36, 0, 22), 400, 0); + cameraMethod5502(0, 0, 450, 450, 1, 0); + setScriptCallOnMinimapRelatedSetting3(2985, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/2985.cs2 b/dumps/scripts/2985.cs2 new file mode 100644 index 000000000..85ce0ed84 --- /dev/null +++ b/dumps/scripts/2985.cs2 @@ -0,0 +1,5 @@ +void script_2985(int arg0) { + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + cameraMethod5502(0, 1, 450, 450, 1, 1); + return; +} diff --git a/dumps/scripts/2986.cs2 b/dumps/scripts/2986.cs2 new file mode 100644 index 000000000..4e3cc753c --- /dev/null +++ b/dumps/scripts/2986.cs2 @@ -0,0 +1,33 @@ +void script_2986() { + if (((boolean)bitconfig_8386)) { + script_2987(4718594, 4718593, 4718623, 4718595); + } + if (((boolean)bitconfig_8393)) { + script_2987(4718597, 4718596, 4718624, 4718598); + } + if (((boolean)bitconfig_8394)) { + script_2987(4718600, 4718599, 4718625, 4718601); + } + if (((boolean)bitconfig_8395)) { + script_2987(4718603, 4718602, 4718626, 4718604); + } + if (((boolean)bitconfig_8391)) { + script_2987(4718606, 4718605, 4718627, 4718607); + } + if (((boolean)bitconfig_8387)) { + script_2987(4718609, 4718608, 4718628, 4718610); + } + if (((boolean)bitconfig_8388)) { + script_2987(4718612, 4718611, 4718629, 4718613); + } + if (((boolean)bitconfig_8390)) { + script_2987(4718615, 4718614, 4718630, 4718616); + } + if (((boolean)bitconfig_8389)) { + script_2987(4718618, 4718617, 4718631, 4718619); + } + if (((boolean)bitconfig_8392)) { + script_2987(4718621, 4718620, 4718632, 4718622); + } + return; +} diff --git a/dumps/scripts/2987.cs2 b/dumps/scripts/2987.cs2 new file mode 100644 index 000000000..2262b50fd --- /dev/null +++ b/dumps/scripts/2987.cs2 @@ -0,0 +1,7 @@ +void script_2987(int arg0,int arg1,int arg2,int arg3) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/2988.cs2 b/dumps/scripts/2988.cs2 new file mode 100644 index 000000000..84b6fa33d --- /dev/null +++ b/dumps/scripts/2988.cs2 @@ -0,0 +1,140 @@ +void script_2988(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + string svar1; + string svar2; + flow_0: + svar0 = "null"; + svar1 = "null"; + svar2 = "null"; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + SWITCH (arg0) { + case 4718660: + GOTO flow_1 + case 4718659: + GOTO flow_4 + case 4718658: + GOTO flow_7 + case 4718657: + GOTO flow_10 + case 4718656: + GOTO flow_13 + case 4718665: + GOTO flow_16 + case 4718664: + GOTO flow_19 + case 4718663: + GOTO flow_22 + case 4718662: + GOTO flow_25 + case 4718661: + GOTO flow_28 + } + svar1 = "Coming soon"; + GOTO flow_31 + flow_1: + if (((boolean)bitconfig_8386)) { + return; + } + svar0 = "Common jadinko"; + svar1 = "The most abundant form of jadinko. The common jadinkos lack the magical properties of their counterparts; however, they are the easiest of all the jadinkos to attract." + "
" + "
" + "These jadinkos are caught with marasamaw plants."; + svar2 = "To attract common jadinkos:" + "
" + "
" + "grow any of the vine flowers."; + ivar5 = 62244; + GOTO flow_31 + flow_4: + if (((boolean)bitconfig_8393)) { + return; + } + svar0 = "Shadow jadinko"; + svar1 = "This species of jadinko is particularly sinister, tied as it is with darkness. Shadow jadinkos produce shadow vines which are useful for those who want to be more stealthy when hunting." + "
" + "
" + "These jadinkos are caught by tracking."; + svar2 = "To attract shadow jadinkos:" + "
" + "
" + "grow red vine flowers and build an abandoned house."; + ivar5 = 62253; + GOTO flow_31 + flow_7: + if (((boolean)bitconfig_8394)) { + return; + } + svar0 = "Diseased jadinko"; + svar1 = "The diseased jadinko is a sorry sort of creature, corrupted by some unknown illness that it can never shake. That's unfortunate for the jadinko, but fortunate for the hunter, because the corrupt vines these creatures produce can be made into juju hunter potions that are invaluable for hunting in the habitat." + "
" + "
" + "These jadinkos are caught by tracking."; + svar2 = "To attract diseased jadinkos:" + "
" + "
" + "grow a banana tree and build a boneyard."; + ivar5 = 62251; + GOTO flow_31 + flow_10: + if (((boolean)bitconfig_8395)) { + return; + } + svar0 = "Igneous jadinko"; + svar1 = "The igneous jadinko have a great affinity with the earth. They dwell beneath the stones, unless attracted by the sweet scent of lergberry and oranges. Their vines are particularly useful for those who wish to gather herbs more efficiently." + "
" + "
" + "These jadinkos are caught with marasamaw plants."; + svar2 = "To attract igneous jadinkos:" + "
" + "
" + "grow a lergberry bush, an orange tree, a blue vine plant and construct a thermal vent."; + ivar5 = 62249; + GOTO flow_31 + flow_13: + if (((boolean)bitconfig_8391)) { + return; + } + svar0 = "Cannibal jadinko"; + svar1 = "These jadinko prey on other jadinkos. They roam the habitat looking for other creatures to snack on. Unlike other jadinkos, the cannibal jadinko's magic is located not in the vine, but in its teeth. The plant teeth can be used to make a deliciously tasty gumbo, if mixed with the right herbs." + "
" + "
" + "These jadinkos are caught with marasamaw plants."; + svar2 = "To attract cannibal jadinkos:" + "
" + "
" + "grow a kalferberry bush, a green vine flower, construct tall grass and be sure to have used the juju hunter potion on the flower."; + ivar5 = 62241; + GOTO flow_31 + flow_16: + if (((boolean)bitconfig_8387)) { + return; + } + svar0 = "Aquatic jadinko"; + svar1 = "The aquatic jadinko rarely comes out on land, but, when it does, it's highly sought after by the discerning hunter. The vines that grow from this creature's back can be used to create a juju fishing potion that allows you to catch the elusive baron shark." + "
" + "
" + "These jadinkos are caught with marasamaw plants."; + svar2 = "To attract aquatic jadinkos:" + "
" + "
" + "grow a kalferberry bush, an apple tree, a red vine flower and construct a pond. You must also be under the effects of a juju hunter potion."; + ivar5 = 62250; + GOTO flow_31 + flow_19: + if (((boolean)bitconfig_8388)) { + return; + } + svar0 = "Amphibious jadinko"; + svar1 = "The amphibious jadinko is as at home on land as it is in water. These creatures may be slimy and froggish, but their oily vines can be extremely useful. When combined with the appropriate herb, their vines can be used to create potions that attract wood spirits when you are woodcutting, making a lumberjack's life significantly easier." + "
" + "
" + "These jadinkos are caught with marasamaw plants."; + svar2 = "To attract amphibian jadinkos:" + "
" + "
" + "grow a lergberry bush, a blue flower and construct a pond."; + ivar5 = 62243; + GOTO flow_31 + flow_22: + if (((boolean)bitconfig_8390)) { + return; + } + svar0 = "Carrion jadinko"; + svar1 = "The carrion jadinko is probably the least pleasant of the jadinko species. They scavenge on the leftovers of other creatures and feast cannibalistically on the remains of other hunted jadinkos. The vines that these creatures produce are particularly pungent and rot rather nicely to create supercompost."; + svar2 = "To attract carrion jadinkos:" + "
" + "
" + "grow a kalferberry bush, a green vine flower and build a boneyard."; + ivar5 = 62248; + GOTO flow_31 + flow_25: + if (((boolean)bitconfig_8389)) { + return; + } + svar0 = "Camouflaged jadinko"; + svar1 = "The camouflaged jadinko is a stealthy critter that takes great delight in hiding itself in foliage. The magic of its striped vines is particularly odd and cannot be turned into a potion; however, Papa Mambo has mentioned that he has uses for these vines." + "
" + "
" + "These jadinkos are caught by tracking."; + svar2 = "To attract camouflaged jadinkos:" + "
" + "
" + "grow a lergberry bush and build standing stones. In addition, you must be under the effects of the juju hunter potion."; + ivar5 = 62245; + GOTO flow_31 + flow_28: + if (((boolean)bitconfig_8392)) { + return; + } + svar0 = "Draconic jadinko"; + svar1 = "While not dragons, these rare and elusive creatures certainly resemble them. They are powerful beasts with a deep connection to the earth: so deep that their vines can be used to create powerful potions that attracts the mining spirits of stone." + "
" + "
" + "These jadinkos are caught with marasamaw plants."; + svar2 = "To attract draconic jadinkos:" + "
" + "
" + "grow a lergberry bush, a red vine flower and build a dark pit. In addition you will need to be under the influence of the juju hunter potion."; + ivar5 = 62238; + flow_31: + setWidgetIsHidden(true, new WidgetPointer(72,56)); + setWidgetIsHidden(false, new WidgetPointer(72,58)); + setWidgetText(new WidgetPointer(72,60), svar0); + setWidgetText(new WidgetPointer(72,61), svar1); + setWidgetText(new WidgetPointer(72,62), svar2); + setWidgetModel(ivar5, new WidgetPointer(72,59)); + return; +} diff --git a/dumps/scripts/2989.cs2 b/dumps/scripts/2989.cs2 new file mode 100644 index 000000000..3fb02a213 --- /dev/null +++ b/dumps/scripts/2989.cs2 @@ -0,0 +1,5 @@ +void script_2989() { + setWidgetIsHidden(true, new WidgetPointer(72,58)); + setWidgetIsHidden(false, new WidgetPointer(72,56)); + return; +} diff --git a/dumps/scripts/299.cs2 b/dumps/scripts/299.cs2 new file mode 100644 index 000000000..fddd0f498 --- /dev/null +++ b/dumps/scripts/299.cs2 @@ -0,0 +1,5 @@ +void script_299(int arg0,int arg1,int arg2) { + script_41(arg0); + setWidgetSprite(arg2, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/2990.cs2 b/dumps/scripts/2990.cs2 new file mode 100644 index 000000000..2f40cda9e --- /dev/null +++ b/dumps/scripts/2990.cs2 @@ -0,0 +1,5 @@ +void script_2990() { + setWidgetSprite(4031, new WidgetPointer(72,75)); + setWidgetSprite(4031, new WidgetPointer(72,63)); + return; +} diff --git a/dumps/scripts/2991.cs2 b/dumps/scripts/2991.cs2 new file mode 100644 index 000000000..30ccf349c --- /dev/null +++ b/dumps/scripts/2991.cs2 @@ -0,0 +1,5 @@ +void script_2991() { + setWidgetSprite(4032, new WidgetPointer(72,75)); + setWidgetSprite(4032, new WidgetPointer(72,63)); + return; +} diff --git a/dumps/scripts/2992.cs2 b/dumps/scripts/2992.cs2 new file mode 100644 index 000000000..5e8fbaddf --- /dev/null +++ b/dumps/scripts/2992.cs2 @@ -0,0 +1,33 @@ +void script_2992() { + if (((boolean)bitconfig_8386)) { + setWidgetIsHidden(true, new WidgetPointer(311,25)); + setWidgetIsHidden(false, new WidgetPointer(311,26)); + setWidgetIsHidden(true, new WidgetPointer(311,57)); + setWidgetIsHidden(true, new WidgetPointer(311,59)); + } + if (((boolean)bitconfig_8388)) { + setWidgetIsHidden(true, new WidgetPointer(311,9)); + setWidgetIsHidden(false, new WidgetPointer(311,10)); + } + if (((boolean)bitconfig_8390)) { + setWidgetIsHidden(true, new WidgetPointer(311,5)); + setWidgetIsHidden(false, new WidgetPointer(311,6)); + } + if (((boolean)bitconfig_8392)) { + setWidgetIsHidden(true, new WidgetPointer(311,1)); + setWidgetIsHidden(false, new WidgetPointer(311,2)); + } + if (((boolean)bitconfig_8387)) { + setWidgetIsHidden(true, new WidgetPointer(311,13)); + setWidgetIsHidden(false, new WidgetPointer(311,14)); + } + if (((boolean)bitconfig_8395)) { + setWidgetIsHidden(true, new WidgetPointer(311,21)); + setWidgetIsHidden(false, new WidgetPointer(311,22)); + } + if (((boolean)bitconfig_8391)) { + setWidgetIsHidden(true, new WidgetPointer(311,17)); + setWidgetIsHidden(false, new WidgetPointer(311,18)); + } + return; +} diff --git a/dumps/scripts/2993.cs2 b/dumps/scripts/2993.cs2 new file mode 100644 index 000000000..ce12fcebd --- /dev/null +++ b/dumps/scripts/2993.cs2 @@ -0,0 +1,6 @@ +void script_2993(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + createExtraChild(new WidgetPointer(arg1), arg0, arg2); + setWidgetSize(arg3, arg4, 0, 0); + setWidgetPosition(arg5, arg6, 0, 0); + return; +} diff --git a/dumps/scripts/2994.cs2 b/dumps/scripts/2994.cs2 new file mode 100644 index 000000000..3cee1c740 --- /dev/null +++ b/dumps/scripts/2994.cs2 @@ -0,0 +1,11 @@ +void script_2994(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + createExtraChild(new WidgetPointer(arg0), 5, arg1); + setWidgetSize(arg2, arg3, 0, 0); + setWidgetPosition(arg4, arg5, 0, 0); + setWidgetSprite(arg6); + setWidgetHFlip(arg7); + setWidgetVFlip(arg8); + cs2method1107(arg9); + cs2method2103(arg10); + return; +} diff --git a/dumps/scripts/2995.cs2 b/dumps/scripts/2995.cs2 new file mode 100644 index 000000000..9ffa6cf92 --- /dev/null +++ b/dumps/scripts/2995.cs2 @@ -0,0 +1,11 @@ +void script_2995(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,string arg12) { + createExtraChild(new WidgetPointer(arg0), 4, arg1); + setWidgetSize(arg2, arg3, 0, 0); + setWidgetPosition(arg4, arg5, 0, 0); + setWidgetText(arg12); + setWidgetRGB(new Color(arg6)); + setWidgetFont(arg7); + setWidgetTextAlignment(arg8, arg9, arg10); + setWidgetUnknownBoolean(((boolean)arg11)); + return; +} diff --git a/dumps/scripts/2996.cs2 b/dumps/scripts/2996.cs2 new file mode 100644 index 000000000..197941030 --- /dev/null +++ b/dumps/scripts/2996.cs2 @@ -0,0 +1,9 @@ +void script_2996(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + createExtraChild(new WidgetPointer(arg0), 3, arg1); + setWidgetSize(arg2, arg3, 0, 0); + setWidgetPosition(arg4, arg5, 0, 0); + setWidgetRGB(new Color(arg6)); + setWidgetFilled(arg7); + cs2method2103(arg8); + return; +} diff --git a/dumps/scripts/2997.cs2 b/dumps/scripts/2997.cs2 new file mode 100644 index 000000000..65d3a619e --- /dev/null +++ b/dumps/scripts/2997.cs2 @@ -0,0 +1,12 @@ +void script_2997(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13) { + createExtraChild(new WidgetPointer(arg0), 6, arg1); + setWidgetSize(arg2, arg3, 0, 0); + setWidgetPosition(arg4, arg5, 0, 0); + if (arg6 != -1) { + setWidgetModel(arg6); + setWidget3DRotation(arg8, arg9, arg10, arg11, arg12, arg13); + } else { + setItemOnWidgetMethod1200(arg7, -1); + } + return; +} diff --git a/dumps/scripts/2998.cs2 b/dumps/scripts/2998.cs2 new file mode 100644 index 000000000..8e4a61eab --- /dev/null +++ b/dumps/scripts/2998.cs2 @@ -0,0 +1,57 @@ +void script_2998() { + int ivar0; + int stack_dump0; + int stack_dump1; + cs2func_script_3011_struct(7,0,0) structdump_2; + cs2func_script_3011_struct(7,0,0) structdump_3; + cs2func_script_3011_struct(7,0,0) structdump_4; + cs2func_script_3011_struct(7,0,0) structdump_5; + script_2999(); + setScriptCallOnMousePressed(3002, 0, "i", new WidgetPointer(907,41)); + setScriptCallOnMousePressed(3002, 1, "i", new WidgetPointer(907,29)); + setScriptCallOnMousePressed(3002, 2, "i", new WidgetPointer(907,17)); + setScriptCallOnMousePressed(3002, 3, "i", new WidgetPointer(907,55)); + ivar0 = 0; + if (getWidgetSpriteId(new WidgetPointer(907,34)) == 2672) { + ivar0 = 0; + } else if (getWidgetSpriteId(new WidgetPointer(907,22)) == 2672) { + ivar0 = 1; + } else if (getWidgetSpriteId(new WidgetPointer(907,10)) == 2672) { + ivar0 = 2; + } else { + if (getWidgetSpriteId(new WidgetPointer(907,48)) == 2672) { + ivar0 = 3; + } + } + switch (ivar0) { + case 0: + stack_dump0 = 0; + stack_dump1 = 0; + structdump_2 = script_3011(stack_dump1); + script_3006(stack_dump0, structdump_2.intpart_0, structdump_2.intpart_1, structdump_2.intpart_2, structdump_2.intpart_3, structdump_2.intpart_4, structdump_2.intpart_5, structdump_2.intpart_6); + break; + case 1: + stack_dump0 = 1; + stack_dump1 = 1; + structdump_3 = script_3011(stack_dump1); + script_3006(stack_dump0, structdump_3.intpart_0, structdump_3.intpart_1, structdump_3.intpart_2, structdump_3.intpart_3, structdump_3.intpart_4, structdump_3.intpart_5, structdump_3.intpart_6); + break; + case 2: + stack_dump0 = 2; + stack_dump1 = 2; + structdump_4 = script_3011(stack_dump1); + script_3006(stack_dump0, structdump_4.intpart_0, structdump_4.intpart_1, structdump_4.intpart_2, structdump_4.intpart_3, structdump_4.intpart_4, structdump_4.intpart_5, structdump_4.intpart_6); + break; + case 3: + stack_dump0 = 3; + stack_dump1 = 3; + structdump_5 = script_3011(stack_dump1); + script_3006(stack_dump0, structdump_5.intpart_0, structdump_5.intpart_1, structdump_5.intpart_2, structdump_5.intpart_3, structdump_5.intpart_4, structdump_5.intpart_5, structdump_5.intpart_6); + } + setWidgetIsHidden(false, new WidgetPointer(907,2)); + script_3001(); + setScriptCallOnGameloop(3000, "", new WidgetPointer(907,1)); + openInterface(59441194, 908); + script_3014(); + return; +} diff --git a/dumps/scripts/2999.cs2 b/dumps/scripts/2999.cs2 new file mode 100644 index 000000000..d0b551a56 --- /dev/null +++ b/dumps/scripts/2999.cs2 @@ -0,0 +1,236 @@ +void script_2999() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + int stack_dump0; + cs2func_script_3011_struct(7,0,0) structdump_1; + cs2func_script_3011_struct(7,0,0) structdump_2; + cs2func_script_3011_struct(7,0,0) structdump_3; + cs2func_script_3011_struct(7,0,0) structdump_4; + cs2func_script_3011_struct(7,0,0) structdump_5; + cs2func_script_3011_struct(7,0,0) structdump_6; + cs2func_script_3011_struct(7,0,0) structdump_7; + cs2func_script_3011_struct(7,0,0) structdump_8; + cs2func_script_3011_struct(7,0,0) structdump_9; + cs2func_script_3011_struct(7,0,0) structdump_10; + opcStruct6901(3,0,0) structdump_11; + cs2func_script_3011_struct(7,0,0) structdump_12; + cs2func_script_3011_struct(7,0,0) structdump_13; + cs2func_script_3011_struct(7,0,0) structdump_14; + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + svar0 = "email-register"; + switch (cs2method6906()) { + case 0: + setWidgetSprite(2672, new WidgetPointer(907,34)); + stack_dump0 = 0; + structdump_1 = script_3011(stack_dump0); + script_3010(structdump_1.intpart_0, structdump_1.intpart_1, structdump_1.intpart_2, structdump_1.intpart_3, structdump_1.intpart_4, structdump_1.intpart_5, structdump_1.intpart_6); + setWidgetText(new WidgetPointer(907,39), "Unregistered"); + svar2 = "You do not currently have an email address registered. Click " + "" + "" + "here" + "" + "" + " to register."; + svar3 = "You do not currently have an email address registered. Click " + "" + "" + "here" + "" + "" + " to register."; + setWidgetText(new WidgetPointer(907,40), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,40)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,40)); + svar1 = "set_address.ws"; + break; + case 1: + setWidgetSprite(2672, new WidgetPointer(907,34)); + stack_dump0 = 0; + structdump_2 = script_3011(stack_dump0); + script_3010(structdump_2.intpart_0, structdump_2.intpart_1, structdump_2.intpart_2, structdump_2.intpart_3, structdump_2.intpart_4, structdump_2.intpart_5, structdump_2.intpart_6); + setWidgetText(new WidgetPointer(907,39), "Pending Parental Confirmation"); + svar2 = "You have registered your email address. We are currently waiting for your parent to confirm their email address. Click " + "" + "" + "here" + "" + "" + " to submit a confirmation code."; + svar3 = "You have registered your email address. We are currently waiting for your parent to confirm their email address. Click " + "" + "" + "here" + "" + "" + " to submit a confirmation code."; + setWidgetText(new WidgetPointer(907,40), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,40)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,40)); + svar1 = "enter_code.ws"; + break; + case 2: + setWidgetSprite(2672, new WidgetPointer(907,34)); + stack_dump0 = 0; + structdump_3 = script_3011(stack_dump0); + script_3010(structdump_3.intpart_0, structdump_3.intpart_1, structdump_3.intpart_2, structdump_3.intpart_3, structdump_3.intpart_4, structdump_3.intpart_5, structdump_3.intpart_6); + setWidgetText(new WidgetPointer(907,39), "Pending Confirmation"); + svar2 = "Your email address is currently pending confirmation. Click " + "" + "" + "here" + "" + "" + " to submit a confirmation code."; + svar3 = "Your email address is currently pending confirmation. Click " + "" + "" + "here" + "" + "" + " to submit a confirmation code."; + setWidgetText(new WidgetPointer(907,40), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,40)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,40)); + svar1 = "enter_code.ws"; + break; + case 3: + setWidgetSprite(2669, new WidgetPointer(907,34)); + stack_dump0 = 0; + structdump_4 = script_3011(stack_dump0); + script_3008(structdump_4.intpart_0, structdump_4.intpart_1, structdump_4.intpart_2, structdump_4.intpart_3, structdump_4.intpart_4, structdump_4.intpart_5, structdump_4.intpart_6); + setWidgetText(new WidgetPointer(907,39), "Registered"); + svar2 = "Your email address is now registered. Click " + "" + "" + "here" + "" + "" + " to view or change your email preferences."; + svar3 = "Your email address is now registered. Click " + "" + "" + "here" + "" + "" + " to view or change your email preferences."; + setWidgetText(new WidgetPointer(907,40), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,40)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,40)); + svar1 = "change_settings.ws"; + break; + case 4: + setWidgetSprite(2669, new WidgetPointer(907,34)); + stack_dump0 = 0; + structdump_5 = script_3011(stack_dump0); + script_3008(structdump_5.intpart_0, structdump_5.intpart_1, structdump_5.intpart_2, structdump_5.intpart_3, structdump_5.intpart_4, structdump_5.intpart_5, structdump_5.intpart_6); + setWidgetText(new WidgetPointer(907,39), "No longer registered"); + svar2 = "Your account no longer has a registered email address. Click " + "" + "" + "here" + "" + "" + " to register again."; + svar3 = "Your account no longer has a registered email address. Click " + "" + "" + "here" + "" + "" + " to register again."; + setWidgetText(new WidgetPointer(907,40), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,40)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,40)); + svar1 = "set_address.ws"; + } + setScriptCallOnMousePressed(3088, svar0, svar1, 1, "ss1", new WidgetPointer(907,40)); + script_3376(59441192); + ivar0 = getRecoveryQuestionsDate(); + svar0 = "recovery_questions"; + if (((boolean)ivar0)) { + setWidgetSprite(2672, new WidgetPointer(907,22)); + stack_dump0 = 1; + structdump_6 = script_3011(stack_dump0); + script_3010(structdump_6.intpart_0, structdump_6.intpart_1, structdump_6.intpart_2, structdump_6.intpart_3, structdump_6.intpart_4, structdump_6.intpart_5, structdump_6.intpart_6); + setWidgetText(new WidgetPointer(907,27), "Not Set"); + svar2 = "You do not have any recovery questions set. It will be more difficult to recover your password if it gets stolen or you forget it. Click " + "" + "" + "here" + "" + "" + " to set your recovery questions."; + svar3 = "You do not have any recovery questions set. It will be more difficult to recover your password if it gets stolen or you forget it. Click " + "" + "" + "here" + "" + "" + " to set your recovery questions."; + setWidgetText(new WidgetPointer(907,28), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,28)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,28)); + svar1 = "add_recoveries.ws"; + } else if (ivar0 < add(getCurrentDaysSinceLaunch(), 1)) { + setWidgetSprite(2669, new WidgetPointer(907,22)); + stack_dump0 = 1; + structdump_7 = script_3011(stack_dump0); + script_3008(structdump_7.intpart_0, structdump_7.intpart_1, structdump_7.intpart_2, structdump_7.intpart_3, structdump_7.intpart_4, structdump_7.intpart_5, structdump_7.intpart_6); + setWidgetText(new WidgetPointer(907,27), "Set"); + svar2 = "Recovery questions last set: " + timeToStr(ivar0) + ". Click " + "" + "" + "here" + "" + "" + " to change your recovery questions."; + svar3 = "Recovery questions last set: " + timeToStr(ivar0) + ". Click " + "" + "" + "here" + "" + "" + " to change your recovery questions."; + setWidgetText(new WidgetPointer(907,28), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,28)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,28)); + svar1 = "add_recoveries.ws"; + } else { + setWidgetSprite(2672, new WidgetPointer(907,22)); + stack_dump0 = 1; + structdump_8 = script_3011(stack_dump0); + script_3010(structdump_8.intpart_0, structdump_8.intpart_1, structdump_8.intpart_2, structdump_8.intpart_3, structdump_8.intpart_4, structdump_8.intpart_5, structdump_8.intpart_6); + setWidgetText(new WidgetPointer(907,27), "Changed"); + svar2 = "Your new recovery questions will become active on " + timeToStr(ivar0) + ". If you didn't request this, cancel it and change your password immediately. Click " + "" + "" + "here" + "" + "" + " to cancel."; + svar3 = "Your new recovery questions will become active on " + timeToStr(ivar0) + ". If you didn't request this, cancel it and change your password immediately. Click " + "" + "" + "here" + "" + "" + " to cancel."; + setWidgetText(new WidgetPointer(907,28), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,28)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,28)); + svar1 = "cancel_recoveries.ws"; + } + setScriptCallOnMousePressed(3088, svar0, svar1, 1, "ss1", new WidgetPointer(907,28)); + script_3376(59441180); + ivar1 = cs2method6903(); + if (((boolean)ivar1)) { + setWidgetSprite(2669, new WidgetPointer(907,10)); + stack_dump0 = 2; + structdump_9 = script_3011(stack_dump0); + script_3008(structdump_9.intpart_0, structdump_9.intpart_1, structdump_9.intpart_2, structdump_9.intpart_3, structdump_9.intpart_4, structdump_9.intpart_5, structdump_9.intpart_6); + setWidgetText(new WidgetPointer(907,15), intToStr(ivar1) + " Unread"); + svar2 = "You have no unread messages. Click " + "" + "" + "here" + "" + "" + " to open your Message Centre."; + svar3 = "You have no unread messages. Click " + "" + "" + "here" + "" + "" + " to open your Message Centre."; + setWidgetText(new WidgetPointer(907,16), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,16)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,16)); + } else { + setWidgetSprite(2672, new WidgetPointer(907,10)); + stack_dump0 = 2; + structdump_10 = script_3011(stack_dump0); + script_3010(structdump_10.intpart_0, structdump_10.intpart_1, structdump_10.intpart_2, structdump_10.intpart_3, structdump_10.intpart_4, structdump_10.intpart_5, structdump_10.intpart_6); + setWidgetText(new WidgetPointer(907,15), intToStr(ivar1) + " Unread"); + if (((boolean)ivar1)) { + svar2 = "You have 1 unread message. Click " + "" + "" + "here" + "" + "" + " to open your Message Centre."; + svar3 = "You have 1 unread message. Click " + "" + "" + "here" + "" + "" + " to open your Message Centre."; + } else { + svar2 = "You have " + intToStr(ivar1) + " unread messages. Click " + "" + "" + "here" + "" + "" + " to open your Message Centre."; + svar3 = "You have " + intToStr(ivar1) + " unread messages. Click " + "" + "" + "here" + "" + "" + " to open your Message Centre."; + } + setWidgetText(new WidgetPointer(907,16), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,16)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,16)); + } + script_3376(59441168); + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + structdump_11 = cs2method6901(); + ivar2 = structdump_11.intpart_2; + ivar4 = structdump_11.intpart_1; + ivar3 = structdump_11.intpart_0; + svar4 = minutesToUtcTime(ivar3); + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + svar5 = ""; + if (((boolean)ivar2)) { + setWidgetSprite(2669, new WidgetPointer(907,48)); + stack_dump0 = 3; + structdump_12 = script_3011(stack_dump0); + script_3008(structdump_12.intpart_0, structdump_12.intpart_1, structdump_12.intpart_2, structdump_12.intpart_3, structdump_12.intpart_4, structdump_12.intpart_5, structdump_12.intpart_6); + setWidgetText(new WidgetPointer(907,53), "Subscription Active"); + svar2 = "You have an active subscription. Click " + "" + "" + "here" + "" + "" + " to view your account information. Make sure you play on a members' world to enjoy all of your members' benefits."; + svar3 = "You have an active subscription. Click " + "" + "" + "here" + "" + "" + " to view your account information. Make sure you play on a members' world to enjoy all of your members' benefits."; + setWidgetText(new WidgetPointer(907,54), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,54)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,54)); + svar0 = "billing_core"; + svar1 = "userdetails.ws"; + } else if (isSiteSettingsMembers()) { + ivar5 = divide(ivar4, 1440); + ivar6 = divide(mod(ivar4, 1440), 60); + ivar7 = mod(ivar4, 60); + if (add(add(ivar5, ivar6), ivar7) != 0) { + svar5 = " (in " + script_4582(ivar5, ivar6, ivar7) + ")"; + } + setWidgetSprite(2669, new WidgetPointer(907,48)); + stack_dump0 = 3; + structdump_13 = script_3011(stack_dump0); + script_3008(structdump_13.intpart_0, structdump_13.intpart_1, structdump_13.intpart_2, structdump_13.intpart_3, structdump_13.intpart_4, structdump_13.intpart_5, structdump_13.intpart_6); + setWidgetText(new WidgetPointer(907,53), "Expires " + svar4); + svar2 = "Your membership will expire on " + svar4 + svar5 + ". Renew now to avoid losing member status. Click " + "" + "" + "here" + "" + "" + " to renew."; + svar3 = "Your membership will expire on " + svar4 + svar5 + ". Renew now to avoid losing member status. Click " + "" + "" + "here" + "" + "" + " to renew."; + setWidgetText(new WidgetPointer(907,54), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,54)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,54)); + svar0 = "dob"; + svar1 = "set_members_dob.ws"; + } else { + setWidgetSprite(2672, new WidgetPointer(907,48)); + stack_dump0 = 3; + structdump_14 = script_3011(stack_dump0); + script_3010(structdump_14.intpart_0, structdump_14.intpart_1, structdump_14.intpart_2, structdump_14.intpart_3, structdump_14.intpart_4, structdump_14.intpart_5, structdump_14.intpart_6); + setWidgetText(new WidgetPointer(907,53), "Not a Member"); + svar2 = "You are not a member. Members get loads of extra benefits and features. Click " + "" + "" + "here" + "" + "" + " to become a member."; + svar3 = "You are not a member. Members get loads of extra benefits and features. Click " + "" + "" + "here" + "" + "" + " to become a member."; + setWidgetText(new WidgetPointer(907,54), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,54)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,54)); + svar0 = "dob"; + svar1 = "set_members_dob.ws"; + } + setScriptCallOnMousePressed(3088, svar0, svar1, 1, "ss1", new WidgetPointer(907,54)); + script_3376(59441206); + return; +} diff --git a/dumps/scripts/3.cs2 b/dumps/scripts/3.cs2 new file mode 100644 index 000000000..46f6a8e7f --- /dev/null +++ b/dumps/scripts/3.cs2 @@ -0,0 +1,970 @@ +cs2func_script_3_struct(2,2,0) script_3(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(1, 8170, "Garden", "You can now build a " + "" + "garden" + "" + " for your house."); + case 1: + return newstruct cs2func_script_3_struct(1, 8315, "Parlour", "You can now build a " + "" + "parlour" + "" + " for your house."); + case 2: + return newstruct cs2func_script_3_struct(5, 8222, "Kitchen", "You can now build a " + "" + "kitchen" + "" + " for your house."); + case 3: + return newstruct cs2func_script_3_struct(10, 8121, "Dining room", "You can now build a " + "" + "dining room" + "" + " for your house."); + case 4: + return newstruct cs2func_script_3_struct(15, 8379, "Workshop", "You can now build a " + "" + "workshop" + "" + " for your house."); + case 5: + return newstruct cs2func_script_3_struct(20, 8037, "Bedroom", "You can now build a " + "" + "bedroom" + "" + " for your house."); + case 6: + return newstruct cs2func_script_3_struct(25, 8255, "Hall (skill trophies)", "You can now build a " + "" + "hall" + "" + " for your house, in which you can display " + "" + "skill trophies" + "" + "."); + case 7: + return newstruct cs2func_script_3_struct(30, 8163, "Games room", "You can now build a " + "" + "games room" + "" + " for your house."); + case 8: + return newstruct cs2func_script_3_struct(32, 8027, "Combat room", "You can now build a " + "" + "combat room" + "" + " for your house."); + case 9: + return newstruct cs2func_script_3_struct(35, 8259, "Hall (quest trophies)", "You can now build a " + "" + "hall" + "" + " for your house, in which you can display your " + "" + "quest trophies" + "" + "."); + case 10: + return newstruct cs2func_script_3_struct(37, 15221, "Menagerie", "You can now build a " + "" + "menagerie" + "" + " for your house."); + case 11: + return newstruct cs2func_script_3_struct(40, 8340, "Study", "You can now build a " + "" + "study" + "" + " for your house."); + case 12: + return newstruct cs2func_script_3_struct(42, 9822, "Costume room", "You can now build a " + "" + "costume room" + "" + " for your house."); + case 13: + return newstruct cs2func_script_3_struct(45, 8068, "Chapel", "You can now build a " + "" + "chapel" + "" + " for your house."); + case 14: + return newstruct cs2func_script_3_struct(50, 8333, "Portal chamber", "You can now build a " + "" + "portal chamber" + "" + " for your house."); + case 15: + return newstruct cs2func_script_3_struct(55, 8195, "Formal garden", "You can now build a " + "" + "formal garden" + "" + " for your house."); + case 16: + return newstruct cs2func_script_3_struct(60, 8363, "Throne room", "You can now build a " + "" + "throne room" + "" + " for your house."); + case 17: + return newstruct cs2func_script_3_struct(65, 8302, "Oubliette", "You can now build an " + "" + "oubliette" + "" + " for your house."); + case 18: + return newstruct cs2func_script_3_struct(70, 8123, "Dungeon", "You can now build a " + "" + "dungeon" + "" + " for your house."); + case 19: + return newstruct cs2func_script_3_struct(70, 8122, "Dungeon pit", "You can now build a " + "" + "dungeon pit" + "" + " in your dungeon (after Love Story)."); + case 20: + return newstruct cs2func_script_3_struct(75, 8151, "Treasure room", "You can now build a " + "" + "treasure room" + "" + " for your house."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(3, 8325, "Clay fireplace", "You can now construct " + "" + "clay fireplaces" + "" + " for your house."); + case 1: + return newstruct cs2func_script_3_struct(5, 8216, "Firepit", "You can now construct " + "" + "firepits" + "" + " for your house."); + case 2: + return newstruct cs2func_script_3_struct(7, 8230, "Pump and drain", "You can now construct " + "" + "pumps and drains" + "" + " for your house."); + case 3: + return newstruct cs2func_script_3_struct(11, 8217, "Firepit with hook", "You can now construct " + "" + "firepits with hooks" + "" + " for your house."); + case 4: + return newstruct cs2func_script_3_struct(15, 8389, "Repair bench", "You can now construct " + "" + "repair benches" + "" + " for your house (at which you can repair " + "" + "bent arrows" + "" + " and " + "" + "broken staves" + "" + ")."); + case 5: + return newstruct cs2func_script_3_struct(16, 8392, "Pluming stand", "You can now construct " + "" + "pluming stands" + "" + " for your house."); + case 6: + return newstruct cs2func_script_3_struct(16, 8380, "Crafting table 1", "You can now construct " + "" + "crafting table 1" + "" + " for your house, at which you can craft " + "" + "toy horsies" + "" + "."); + case 7: + return newstruct cs2func_script_3_struct(17, 8218, "Firepit with pot", "You can now construct " + "" + "firepits with pots" + "" + " for your house."); + case 8: + return newstruct cs2func_script_3_struct(17, 8375, "Wooden workbench", "You can now construct " + "" + "wooden workbenches" + "" + " for your house, at which you can build " + "" + "flatpack items" + "" + " up to " + "" + "level 20 Construction" + "" + "."); + case 9: + return newstruct cs2func_script_3_struct(24, 8219, "Small oven", "You can now construct " + "" + "small ovens" + "" + " for your house."); + case 10: + return newstruct cs2func_script_3_struct(25, 8381, "Crafting table 2", "You can now construct " + "" + "crafting table 2" + "" + " for your house, at which you can craft " + "" + "toy horsies" + "" + " and " + "" + "clockwork mechanisms" + "" + "."); + case 11: + return newstruct cs2func_script_3_struct(27, 8231, "Pump and tub", "You can now construct " + "" + "pumps and tubs" + "" + " for your house."); + case 12: + return newstruct cs2func_script_3_struct(29, 8220, "Large oven", "You can now construct " + "" + "large ovens" + "" + " for your house."); + case 13: + return newstruct cs2func_script_3_struct(32, 8376, "Oak workbench", "You can now construct " + "" + "oak workbenches" + "" + " for your house, at which you can build " + "" + "flatpack items" + "" + " up to " + "" + "level 40 Construction" + "" + "."); + case 14: + return newstruct cs2func_script_3_struct(33, 8326, "Stone fireplace", "You can now construct " + "" + "stone fireplaces" + "" + " for your house."); + case 15: + return newstruct cs2func_script_3_struct(34, 8382, "Crafting table 3", "You can now construct " + "" + "crafting table 3" + "" + " for your house, at which you can craft " + "" + "toy horsies" + "" + ", " + "" + "clockwork mechanisms" + "" + ", " + "" + "clockwork soldiers" + "" + " and " + "" + "clockwork dolls" + "" + "."); + case 16: + return newstruct cs2func_script_3_struct(34, 8221, "Steel range", "You can now construct " + "" + "steel ranges" + "" + " for your house."); + case 17: + return newstruct cs2func_script_3_struct(35, 8390, "Whetstone", "You can now construct " + "" + "whetstones" + "" + " for your house, at which you can sharpen " + "" + "rusty swords" + "" + ", and repair " + "" + "broken arrows" + "" + " and " + "" + "staves" + "" + "."); + case 18: + return newstruct cs2func_script_3_struct(41, 8393, "Shield easel", "You can now construct " + "" + "shield easels" + "" + " for your house."); + case 19: + return newstruct cs2func_script_3_struct(42, 8222, "Fancy range", "You can now construct " + "" + "fancy ranges" + "" + " for your house."); + case 20: + return newstruct cs2func_script_3_struct(42, 8383, "Crafting table 4", "You can now construct " + "" + "crafting table 4" + "" + " for your house, at which you can craft " + "" + "toy horsies" + "" + ", " + "" + "clockwork mechanisms" + "" + ", " + "" + "clockwork soldiers" + "" + ", " + "" + "clockwork dolls" + "" + ", " + "" + "clockwork mice" + "" + ", " + "" + "clockwork cats" + "" + ", " + "" + "watches" + "" + " and " + "" + "sextants" + "" + "."); + case 21: + return newstruct cs2func_script_3_struct(46, 8377, "Steel-framed workbench", "You can now construct " + "" + "steel-framed workbenches" + "" + " for your house, at which you can build flatpack items" + "" + " up to level 60 Construction" + "" + "."); + case 22: + return newstruct cs2func_script_3_struct(47, 8232, "Sink", "You can now construct " + "" + "sinks" + "" + " for your house."); + case 23: + return newstruct cs2func_script_3_struct(55, 8391, "Armour stand", "You can now construct " + "" + "armour stands" + "" + " for your house, at which you can repair " + "" + "broken arrows" + "" + ", " + "" + "broken staves" + "" + ", " + "" + "rusty swords" + "" + ", " + "" + "damaged armour" + "" + " and " + "" + "damaged Barrows items" + "" + "."); + case 24: + return newstruct cs2func_script_3_struct(62, 8378, "Workbench with vice", "You can now construct " + "" + "workbenches with vices" + "" + " for your house, at which you can build " + "" + "flatpack items" + "" + " up to " + "" + "level 80 Construction" + "" + "."); + case 25: + return newstruct cs2func_script_3_struct(63, 8327, "Marble fireplace", "You can now construct " + "" + "marble fireplaces" + "" + " for your house."); + case 26: + return newstruct cs2func_script_3_struct(66, 8394, "Banner easel", "You can now construct " + "" + "banner easels" + "" + " for your house."); + case 27: + return newstruct cs2func_script_3_struct(77, 8379, "Workbench with lathe", "You can now construct " + "" + "workbenches with lathes" + "" + " for your house, at which you can build " + "" + "flatpack items" + "" + " of " + "" + "any level" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(1, 8309, "Crude wooden chair", "You can now construct " + "" + "crude wooden chairs" + "" + " for your house."); + case 1: + return newstruct cs2func_script_3_struct(8, 8310, "Wooden chair", "You can now construct " + "" + "wooden chairs" + "" + " for your house."); + case 2: + return newstruct cs2func_script_3_struct(10, 8115, "Wooden dining table", "You can now construct " + "" + "wooden dining tables" + "" + " for your house."); + case 3: + return newstruct cs2func_script_3_struct(10, 8108, "Wooden dining bench", "You can now construct " + "" + "wooden dining benches" + "" + " for your house."); + case 4: + return newstruct cs2func_script_3_struct(12, 8246, "Wooden kitchen table", "You can now construct " + "" + "wooden kitchen tables" + "" + " for your house."); + case 5: + return newstruct cs2func_script_3_struct(14, 8311, "Rocking chair", "You can now construct " + "" + "rocking chairs" + "" + " for your house."); + case 6: + return newstruct cs2func_script_3_struct(19, 8312, "Oak chair", "You can now construct " + "" + "oak chairs" + "" + " for your house."); + case 7: + return newstruct cs2func_script_3_struct(20, 8031, "Wooden bed", "You can now construct " + "" + "wooden beds" + "" + " for your house."); + case 8: + return newstruct cs2func_script_3_struct(22, 8116, "Oak dining table", "You can now construct " + "" + "oak dining tables" + "" + " for your house."); + case 9: + return newstruct cs2func_script_3_struct(22, 8109, "Oak dining bench", "You can now construct " + "" + "oak dining benches" + "" + " for your house."); + case 10: + return newstruct cs2func_script_3_struct(26, 8313, "Oak armchair", "You can now construct " + "" + "oak armchairs" + "" + " for your house."); + case 11: + return newstruct cs2func_script_3_struct(30, 8032, "Oak bed", "You can now construct " + "" + "oak beds" + "" + " for your house."); + case 12: + return newstruct cs2func_script_3_struct(31, 8117, "Carved oak dining table", "You can now construct " + "" + "carved oak dining tables" + "" + " for your house."); + case 13: + return newstruct cs2func_script_3_struct(31, 8110, "Carved oak dining bench", "You can now construct " + "" + "carved oak dining benches" + "" + " for your house."); + case 14: + return newstruct cs2func_script_3_struct(32, 8247, "Oak kitchen table", "You can now construct " + "" + "oak kitchen tables" + "" + " for your house."); + case 15: + return newstruct cs2func_script_3_struct(34, 8033, "Large oak bed", "You can now construct " + "" + "large oak beds" + "" + " for your house."); + case 16: + return newstruct cs2func_script_3_struct(35, 8314, "Teak armchair", "You can now construct " + "" + "teak armchairs" + "" + " for your house."); + case 17: + return newstruct cs2func_script_3_struct(38, 8118, "Teak dining table", "You can now construct " + "" + "teak dining tables" + "" + " for your house."); + case 18: + return newstruct cs2func_script_3_struct(38, 8111, "Teak dining bench", "You can now construct " + "" + "teak dining benches" + "" + " for your house."); + case 19: + return newstruct cs2func_script_3_struct(40, 8034, "Teak bed", "You can now construct " + "" + "teak beds" + "" + " for your house."); + case 20: + return newstruct cs2func_script_3_struct(44, 8112, "Carved teak dining bench", "You can now construct " + "" + "carved teak dining benches" + "" + " for your house."); + case 21: + return newstruct cs2func_script_3_struct(45, 8119, "Carved teak dining table", "You can now construct " + "" + "carved teak dining tables" + "" + " for your house."); + case 22: + return newstruct cs2func_script_3_struct(45, 8035, "Large teak bed", "You can now construct " + "" + "large teak beds" + "" + " for your house."); + case 23: + return newstruct cs2func_script_3_struct(50, 8315, "Mahogany armchair", "You can now construct " + "" + "mahogany armchairs" + "" + " for your house."); + case 24: + return newstruct cs2func_script_3_struct(52, 8120, "Mahogany dining table", "You can now construct " + "" + "mahogany dining tables" + "" + " for your house."); + case 25: + return newstruct cs2func_script_3_struct(52, 8113, "Mahogany dining bench", "You can now construct " + "" + "mahogany dining benches" + "" + " for your house."); + case 26: + return newstruct cs2func_script_3_struct(52, 8248, "Teak kitchen table", "You can now construct " + "" + "teak kitchen tables" + "" + " for your house."); + case 27: + return newstruct cs2func_script_3_struct(53, 8036, "Mahogany four-poster bed", "You can now construct " + "" + "mahogany four-poster beds" + "" + " for your house."); + case 28: + return newstruct cs2func_script_3_struct(60, 8357, "Oak throne", "You can now construct " + "" + "oak thrones" + "" + " for your house."); + case 29: + return newstruct cs2func_script_3_struct(60, 8037, "Gilded mahogany four-poster bed", "You can now construct " + "" + "gilded mahogany four-poster beds" + "" + " for your house."); + case 30: + return newstruct cs2func_script_3_struct(61, 8114, "Gilded mahogany dining bench", "You can now construct " + "" + "gilded mahogany dining benches" + "" + " for your house."); + case 31: + return newstruct cs2func_script_3_struct(67, 8358, "Teak throne", "You can now construct " + "" + "teak thrones" + "" + " for your house."); + case 32: + return newstruct cs2func_script_3_struct(72, 8121, "Gilded mahogany and marble table", "You can now construct " + "" + "gilded mahogany and marble tables" + "" + " for your house."); + case 33: + return newstruct cs2func_script_3_struct(74, 8359, "Mahogany throne", "You can now construct " + "" + "mahogany thrones" + "" + " for your house."); + case 34: + return newstruct cs2func_script_3_struct(81, 8360, "Gilded mahogany throne", "You can now construct " + "" + "gilded mahogany thrones" + "" + " for your house."); + case 35: + return newstruct cs2func_script_3_struct(88, 8361, "Skeleton throne", "You can now construct " + "" + "skeleton thrones" + "" + " for your house."); + case 36: + return newstruct cs2func_script_3_struct(95, 8362, "Crystal throne", "You can now construct " + "" + "crystal thrones" + "" + " for your house."); + case 37: + return newstruct cs2func_script_3_struct(99, 8363, "Demonic throne", "You can now construct " + "" + "demonic thrones" + "" + " for your house."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(4, 8319, "Wooden bookcase", "You can now construct " + "" + "wooden bookcases" + "" + " for your house."); + case 1: + return newstruct cs2func_script_3_struct(6, 8223, "Wooden shelves 1", "You can now construct " + "" + "wooden shelves 1" + "" + " for your house, which provide " + "" + "kettles" + "" + ", " + "" + "teapots" + "" + " and " + "" + "cups" + "" + "."); + case 2: + return newstruct cs2func_script_3_struct(7, 8239, "Beer barrel", "You can now construct " + "" + "beer barrels" + "" + " for your house."); + case 3: + return newstruct cs2func_script_3_struct(9, 8233, "Wooden larder", "You can now construct " + "" + "wooden larders" + "" + " for your house."); + case 4: + return newstruct cs2func_script_3_struct(12, 8240, "Cider barrel", "You can now construct " + "" + "cider barrels" + "" + " for your house."); + case 5: + return newstruct cs2func_script_3_struct(12, 8224, "Wooden shelves 2", "You can now construct " + "" + "wooden shelves 2" + "" + " for your house, which provide " + "" + "kettles" + "" + ", " + "" + "teapots" + "" + ", " + "" + "cups" + "" + " and " + "" + "beer glasses" + "" + "."); + case 6: + return newstruct cs2func_script_3_struct(15, 8384, "Tool store 1", "You can now construct " + "" + "tool store 1" + "" + " for your house, which provide " + "" + "saws" + "" + ", " + "" + "hammers" + "" + ", " + "" + "chisels" + "" + " and " + "" + "shears" + "" + "."); + case 7: + return newstruct cs2func_script_3_struct(18, 8241, "Asgarnian Ale barrel", "You can now construct " + "" + "Asgarnian Ale barrels" + "" + " for your house."); + case 8: + return newstruct cs2func_script_3_struct(20, 8038, "Shoe box", "You can now construct " + "" + "shoe boxes" + "" + " for your house."); + case 9: + return newstruct cs2func_script_3_struct(21, 8045, "Wooden shaving stand", "You can now construct " + "" + "wooden shaving stands" + "" + " for your house."); + case 10: + return newstruct cs2func_script_3_struct(23, 8225, "Wooden shelves 3", "You can now construct " + "" + "wooden shelves 3" + "" + " for your house, which provide " + "" + "kettles" + "" + ", " + "" + "teapots" + "" + ", " + "" + "cups" + "" + ", " + "" + "beer glasses" + "" + " and " + "" + "cake tins" + "" + "."); + case 11: + return newstruct cs2func_script_3_struct(25, 8385, "Tool store 2", "You can now construct " + "" + "tool store 2" + "" + " for your house, which provide " + "" + "buckets" + "" + ", " + "" + "spades" + "" + " and " + "" + "tinderboxes" + "" + "."); + case 12: + return newstruct cs2func_script_3_struct(26, 8242, "Greenman's Ale barrel", "You can now construct " + "" + "Greenman's Ale barrels" + "" + " for your house."); + case 13: + return newstruct cs2func_script_3_struct(27, 8039, "Oak chest of drawers", "You can now construct " + "" + "oak chests of drawers" + "" + " for your house."); + case 14: + return newstruct cs2func_script_3_struct(29, 8046, "Oak shaving stand", "You can now construct " + "" + "oak shaving stands" + "" + " for your house."); + case 15: + return newstruct cs2func_script_3_struct(29, 8320, "Oak bookcase", "You can now construct " + "" + "oak bookcases" + "" + " for your house."); + case 16: + return newstruct cs2func_script_3_struct(33, 8234, "Oak larder", "You can now construct " + "" + "oak larders" + "" + " for your house."); + case 17: + return newstruct cs2func_script_3_struct(34, 8226, "Oak shelves 1", "You can now construct " + "" + "oak shelves 1" + "" + " for your house, which provide " + "" + "kettles" + "" + ", " + "" + "teapots" + "" + ", " + "" + "cups" + "" + ", " + "" + "beer glasses" + "" + ", " + "" + "cake tins" + "" + " and " + "" + "bowls" + "" + "."); + case 18: + return newstruct cs2func_script_3_struct(35, 8386, "Tool store 3", "You can now construct " + "" + "tool store 3" + "" + " for your house, which provide " + "" + "brown aprons" + "" + ", " + "" + "glassblowing pipes" + "" + " and " + "" + "needles" + "" + "."); + case 19: + return newstruct cs2func_script_3_struct(36, 8243, "Dragon Bitter barrel", "You can now construct " + "" + "Dragon Bitter barrels" + "" + " for your house."); + case 20: + return newstruct cs2func_script_3_struct(37, 8047, "Oak dresser", "You can now construct " + "" + "oak dressers" + "" + " for your house."); + case 21: + return newstruct cs2func_script_3_struct(39, 8040, "Oak wardrobe (bedroom)", "You can now construct " + "" + "oak wardrobes (bedroom)" + "" + " for your house."); + case 22: + return newstruct cs2func_script_3_struct(40, 8321, "Mahogany bookcase", "You can now construct " + "" + "mahogany bookcases" + "" + " for your house."); + case 23: + return newstruct cs2func_script_3_struct(42, 9829, "Oak wardrobe", "You can now construct " + "" + "oak wardrobes" + "" + " for your " + "" + "costume room" + "" + "."); + case 24: + return newstruct cs2func_script_3_struct(43, 8235, "Teak larder", "You can now construct " + "" + "teak larders" + "" + " for your house."); + case 25: + return newstruct cs2func_script_3_struct(44, 8387, "Tool store 4", "You can now construct " + "" + "tool store 4" + "" + " for your house, which provide " + "" + "amulets" + "" + ", " + "" + "necklaces" + "" + ", " + "" + "rings" + "" + ", " + "" + "holy symbols" + "" + " and " + "" + "tiara moulds" + "" + "."); + case 26: + return newstruct cs2func_script_3_struct(44, 9823, "Oak fancy dress box", "You can now construct " + "" + "oak fancy dress boxes" + "" + " for your " + "" + "costume room" + "" + "."); + case 27: + return newstruct cs2func_script_3_struct(45, 8227, "Oak shelves 2", "You can now construct " + "" + "oak shelves 2" + "" + " for your house, which provide " + "" + "kettles" + "" + ", " + "" + "teapots" + "" + ", " + "" + "cups" + "" + ", " + "" + "beer glasses" + "" + ", " + "" + "cake tins" + "" + ", " + "" + "bowls" + "" + " and " + "" + "pie dishes" + "" + "."); + case 28: + return newstruct cs2func_script_3_struct(46, 8048, "Teak dresser", "You can now construct " + "" + "teak dressers" + "" + " for your house."); + case 29: + return newstruct cs2func_script_3_struct(46, 9826, "Oak armour case", "You can now construct " + "" + "oak armour cases" + "" + " for your " + "" + "costume room" + "" + "."); + case 30: + return newstruct cs2func_script_3_struct(48, 8244, "Chef's Delight barrel", "You can now construct " + "" + "Chef's Delight barrels" + "" + " for your house."); + case 31: + return newstruct cs2func_script_3_struct(48, 9839, "Oak treasure chest", "You can now construct " + "" + "oak treasure chests" + "" + " for your " + "" + "costume room" + "" + "."); + case 32: + return newstruct cs2func_script_3_struct(50, 9836, "Oak toy box", "You can now construct " + "" + "oak toy boxes" + "" + " for your " + "" + "costume room" + "" + "."); + case 33: + return newstruct cs2func_script_3_struct(51, 8041, "Teak chest of drawers", "You can now construct " + "" + "teak chests of drawers" + "" + " for your house."); + case 34: + return newstruct cs2func_script_3_struct(51, 9830, "Carved oak wardrobe", "You can now construct " + "" + "carved oak wardrobes" + "" + " for your " + "" + "costume room" + "" + "."); + case 35: + return newstruct cs2func_script_3_struct(54, 9817, "Oak cape rack", "You can now construct " + "" + "oak cape racks" + "" + " for your " + "" + "costume room" + "" + "."); + case 36: + return newstruct cs2func_script_3_struct(55, 8388, "Tool store 5", "You can now construct " + "" + "tool store 5" + "" + " for your house, which provide " + "" + "rakes" + "" + ", " + "" + "spades" + "" + ", " + "" + "trowels" + "" + ", " + "" + "seed dibbers" + "" + " and " + "" + "watering cans" + "" + "."); + case 37: + return newstruct cs2func_script_3_struct(56, 8049, "Fancy teak dresser", "You can now construct " + "" + "fancy teak dressers" + "" + " for your house."); + case 38: + return newstruct cs2func_script_3_struct(56, 8228, "Teak shelves 1", "You can now construct " + "" + "teak shelves 1" + "" + " for your house, which provide " + "" + "kettles" + "" + ", " + "" + "teapots" + "" + ", " + "" + "cups" + "" + ", " + "" + "beer glasses" + "" + ", " + "" + "cake tins" + "" + ", " + "" + "bowls" + "" + ", " + "" + "pie dishes" + "" + " and " + "" + "pots" + "" + "."); + case 39: + return newstruct cs2func_script_3_struct(60, 9831, "Teak wardrobe", "You can now construct " + "" + "teak wardrobes" + "" + " for your " + "" + "costume room" + "" + "."); + case 40: + return newstruct cs2func_script_3_struct(62, 9824, "Teak fancy dress box", "You can now construct " + "" + "teak fancy dress boxes" + "" + " for your " + "" + "costume room" + "" + "."); + case 41: + return newstruct cs2func_script_3_struct(63, 9818, "Teak cape rack", "You can now construct " + "" + "teak cape racks" + "" + " for your " + "" + "costume room" + "" + "."); + case 42: + return newstruct cs2func_script_3_struct(63, 8042, "Teak wardrobe (bedroom)", "You can now construct " + "" + "teak wardrobes (bedroom)" + "" + " for your house."); + case 43: + return newstruct cs2func_script_3_struct(64, 8050, "Mahogany dresser", "You can now construct " + "" + "mahogany dressers" + "" + " for your house."); + case 44: + return newstruct cs2func_script_3_struct(64, 9827, "Teak armour case", "You can now construct " + "" + "teak armour cases" + "" + " for your " + "" + "costume room" + "" + "."); + case 45: + return newstruct cs2func_script_3_struct(66, 9840, "Teak treasure chest", "You can now construct " + "" + "teak treasure chests" + "" + " for your " + "" + "costume room" + "" + "."); + case 46: + return newstruct cs2func_script_3_struct(67, 8229, "Teak shelves 2", "You can now construct " + "" + "teak shelves 2" + "" + " for your house, which provide " + "" + "kettles" + "" + ", " + "" + "teapots" + "" + ", " + "" + "cups" + "" + ", " + "" + "beer glasses" + "" + ", " + "" + "cake tins" + "" + ", " + "" + "bowls" + "" + ", " + "" + "pie dishes" + "" + ", " + "" + "pots" + "" + " and " + "" + "chef's hats" + "" + "."); + case 47: + return newstruct cs2func_script_3_struct(68, 9837, "Teak toy box", "You can now construct " + "" + "teak toy boxes" + "" + " for your " + "" + "costume room" + "" + "."); + case 48: + return newstruct cs2func_script_3_struct(69, 9832, "Carved teak wardrobe", "You can now construct " + "" + "carved teak wardrobes" + "" + " for your " + "" + "costume room" + "" + "."); + case 49: + return newstruct cs2func_script_3_struct(72, 9819, "Mahogany cape rack", "You can now construct " + "" + "mahogany cape racks" + "" + " for your " + "" + "costume room" + "" + "."); + case 50: + return newstruct cs2func_script_3_struct(74, 8051, "Gilded mahogany dresser", "You can now construct " + "" + "gilded mahogany dressers" + "" + " for your house."); + case 51: + return newstruct cs2func_script_3_struct(75, 8043, "Mahogany wardrobe (bedroom)", "You can now construct " + "" + "mahogany wardrobes (bedroom)" + "" + " for your house."); + case 52: + return newstruct cs2func_script_3_struct(78, 9833, "Mahogany wardrobe", "You can now construct " + "" + "mahogany wardrobes" + "" + " for your " + "" + "costume room" + "" + "."); + case 53: + return newstruct cs2func_script_3_struct(80, 9825, "Mahogany fancy dress box", "You can now construct " + "" + "mahogany fancy dress boxes" + "" + " for your " + "" + "costume room" + "" + "."); + case 54: + return newstruct cs2func_script_3_struct(81, 9820, "Gilded mahogany cape rack", "You can now construct " + "" + "gilded mahogany cape racks" + "" + " for your " + "" + "costume room" + "" + "."); + case 55: + return newstruct cs2func_script_3_struct(82, 9828, "Mahogany armour case", "You can now construct " + "" + "mahogany armour cases" + "" + " for your " + "" + "costume room" + "" + "."); + case 56: + return newstruct cs2func_script_3_struct(84, 9841, "Mahogany treasure chest", "You can now construct " + "" + "mahogany treasure chests" + "" + " for your " + "" + "costume room" + "" + "."); + case 57: + return newstruct cs2func_script_3_struct(86, 9838, "Mahogany toy box", "You can now construct " + "" + "mahogany toy boxes" + "" + " for your " + "" + "costume room" + "" + "."); + case 58: + return newstruct cs2func_script_3_struct(87, 8044, "Gilded mahogany wardrobe (bedroom)", "You can now construct " + "" + "gilded mahogany wardrobes (bedroom)" + "" + " for your house."); + case 59: + return newstruct cs2func_script_3_struct(87, 9834, "Gilded mahogany wardrobe", "You can now construct " + "" + "gilded mahogany wardrobes" + "" + " for your " + "" + "costume room" + "" + "."); + case 60: + return newstruct cs2func_script_3_struct(90, 9821, "Marble cape rack", "You can now construct " + "" + "marble cape racks" + "" + " for your " + "" + "costume room" + "" + "."); + case 61: + return newstruct cs2func_script_3_struct(96, 9835, "Marble wardrobe", "You can now construct " + "" + "marble wardrobes" + "" + " for your " + "" + "costume room" + "" + "."); + case 62: + return newstruct cs2func_script_3_struct(99, 9822, "Magic stone cape rack", "You can now construct " + "" + "magic stone cape racks" + "" + " for your " + "" + "costume room" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(2, 8316, "Brown rug", "You can now make " + "" + "brown rugs" + "" + " for your house."); + case 1: + return newstruct cs2func_script_3_struct(2, 8322, "Torn curtains", "You can now make " + "" + "torn curtains" + "" + " for your house."); + case 2: + return newstruct cs2func_script_3_struct(13, 8317, "Rug", "You can now make " + "" + "rugs" + "" + " for your house."); + case 3: + return newstruct cs2func_script_3_struct(18, 8323, "Curtains", "You can now make " + "" + "curtains" + "" + " for your house."); + case 4: + return newstruct cs2func_script_3_struct(25, 8052, "Oak clock", "You can now construct " + "" + "oak clocks" + "" + " for your house."); + case 5: + return newstruct cs2func_script_3_struct(40, 8334, "Oak lectern", "You can now construct " + "" + "oak lecterns" + "" + " for your house."); + case 6: + return newstruct cs2func_script_3_struct(40, 8324, "Opulent curtains", "You can now make " + "" + "opulent curtains" + "" + " for your house."); + case 7: + return newstruct cs2func_script_3_struct(41, 8341, "Globe", "You can now construct " + "" + "globes" + "" + " for your house."); + case 8: + return newstruct cs2func_script_3_struct(43, 8354, "Alchemical chart", "You can now make " + "" + "alchemical charts" + "" + " for your house."); + case 9: + return newstruct cs2func_script_3_struct(44, 8348, "Wooden telescope", "You can now construct " + "" + "wooden telescopes" + "" + " for your house."); + case 10: + return newstruct cs2func_script_3_struct(47, 8335, "Oak eagle lectern", "You can now construct " + "" + "oak eagle lecterns" + "" + " for your house."); + case 11: + return newstruct cs2func_script_3_struct(47, 8336, "Oak demon lectern", "You can now construct " + "" + "oak demon lecterns" + "" + " for your house."); + case 12: + return newstruct cs2func_script_3_struct(50, 8342, "Ornamental globe", "You can now construct " + "" + "ornamental globes" + "" + " for your house."); + case 13: + return newstruct cs2func_script_3_struct(55, 8053, "Teak clock", "You can now construct " + "" + "teak clocks" + "" + " for your house."); + case 14: + return newstruct cs2func_script_3_struct(57, 8337, "Teak eagle lectern", "You can now construct " + "" + "teak eagle lecterns" + "" + " for your house."); + case 15: + return newstruct cs2func_script_3_struct(57, 8338, "Teak demon lectern", "You can now construct " + "" + "teak demon lecterns" + "" + " for your house."); + case 16: + return newstruct cs2func_script_3_struct(59, 8343, "Lunar globe", "You can now construct " + "" + "lunar globes" + "" + " for your house."); + case 17: + return newstruct cs2func_script_3_struct(63, 8355, "Astronomical chart", "You can now make " + "" + "astronomical charts" + "" + " for your house."); + case 18: + return newstruct cs2func_script_3_struct(64, 8349, "Teak telescope", "You can now construct " + "" + "teak telescopes" + "" + " for your house."); + case 19: + return newstruct cs2func_script_3_struct(65, 8318, "Opulent rug", "You can now make " + "" + "opulent rugs" + "" + " for your house."); + case 20: + return newstruct cs2func_script_3_struct(67, 8339, "Mahogany eagle lectern", "You can now construct " + "" + "mahogany eagle lecterns" + "" + " for your house."); + case 21: + return newstruct cs2func_script_3_struct(67, 8340, "Mahogany demon lectern", "You can now construct " + "" + "mahogany demon lecterns" + "" + " for your house."); + case 22: + return newstruct cs2func_script_3_struct(68, 8344, "Celestial globe", "You can now construct " + "" + "celestial globes" + "" + " for your house."); + case 23: + return newstruct cs2func_script_3_struct(72, 8128, "Dungeon candles", "You can now make " + "" + "dungeon candles" + "" + " for your house."); + case 24: + return newstruct cs2func_script_3_struct(72, 8125, "Decorative dungeon bloodstain", "You can now put " + "" + "decorative dungeon bloodstains" + "" + " in your house."); + case 25: + return newstruct cs2func_script_3_struct(77, 8345, "Armillary sphere", "You can now construct " + "" + "armillary spheres" + "" + " for your house."); + case 26: + return newstruct cs2func_script_3_struct(83, 8356, "Infernal chart", "You can now make " + "" + "infernal charts" + "" + " for your house."); + case 27: + return newstruct cs2func_script_3_struct(83, 8126, "Decorative dungeon pipe", "You can now construct " + "" + "decorative dungeon pipes" + "" + " for your house."); + case 28: + return newstruct cs2func_script_3_struct(84, 8129, "Dungeon torches", "You can now make " + "" + "dungeon torches" + "" + " for your house."); + case 29: + return newstruct cs2func_script_3_struct(84, 8350, "Mahogany 'scope", "You can now construct " + "" + "mahogany 'scopes" + "" + " for your house."); + case 30: + return newstruct cs2func_script_3_struct(85, 8054, "Gilded mahogany clock", "You can now construct " + "" + "gilded mahogany clocks" + "" + " for your house."); + case 31: + return newstruct cs2func_script_3_struct(86, 8346, "Small orrery", "You can now construct " + "" + "small orreries" + "" + " for your house."); + case 32: + return newstruct cs2func_script_3_struct(94, 8127, "Hanging dungeon skeleton", "You can now put " + "" + "hanging dungeon skeletons" + "" + " in your house."); + case 33: + return newstruct cs2func_script_3_struct(94, 8130, "Dungeon skull torches", "You can now make " + "" + "dungeon skull torches" + "" + " for your house."); + case 34: + return newstruct cs2func_script_3_struct(95, 8347, "Large orrery", "You can now construct " + "" + "large orreries" + "" + " for your house."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(16, 8102, "Oak wall decoration", "You can now display " + "" + "oak wall decorations" + "" + " in your house."); + case 1: + return newstruct cs2func_script_3_struct(28, 8085, "Suit of armour", "You can now display a " + "" + "suit of armour" + "" + " in your house."); + case 2: + return newstruct cs2func_script_3_struct(35, 8086, "Small portrait", "You can now display " + "" + "small portraits" + "" + " in your house."); + case 3: + return newstruct cs2func_script_3_struct(36, 8267, "Mounted bass", "You can now display " + "" + "mounted bass" + "" + " in your house."); + case 4: + return newstruct cs2func_script_3_struct(36, 8103, "Teak wall decoration", "You can now display " + "" + "teak wall decorations" + "" + " in your house."); + case 5: + return newstruct cs2func_script_3_struct(38, 8087, "Minor Slayer monster head", "You can now display " + "" + "minor Slayer monster heads" + "" + " in your house."); + case 6: + return newstruct cs2func_script_3_struct(38, 8294, "Small map", "You can now display " + "" + "small maps" + "" + " in your house."); + case 7: + return newstruct cs2func_script_3_struct(41, 8095, "Rune display case", "You can now put " + "" + "rune display cases" + "" + " in your house."); + case 8: + return newstruct cs2func_script_3_struct(42, 8090, "Mounted sword", "You can now display " + "" + "mounted swords" + "" + " in your house."); + case 9: + return newstruct cs2func_script_3_struct(44, 8091, "Small landscape", "You can now display " + "" + "small landscapes" + "" + " in your house."); + case 10: + return newstruct cs2func_script_3_struct(47, 8092, "Guild trophy", "You can now display " + "" + "guild trophies" + "" + " in your house."); + case 11: + return newstruct cs2func_script_3_struct(55, 8093, "Large portrait", "You can now display " + "" + "large portraits" + "" + " in your house."); + case 12: + return newstruct cs2func_script_3_struct(56, 8104, "Gilded mahogany wall decoration", "You can now display " + "" + "gilded mahogany wall decorations" + "" + " in your house."); + case 13: + return newstruct cs2func_script_3_struct(56, 8268, "Mounted swordfish", "You can now display " + "" + "mounted swordfish" + "" + " in your house."); + case 14: + return newstruct cs2func_script_3_struct(58, 8295, "Medium map", "You can now display " + "" + "medium maps" + "" + " in your house."); + case 15: + return newstruct cs2func_script_3_struct(58, 8088, "Medium Slayer monster head", "You can now display " + "" + "medium Slayer monster heads" + "" + " in your house."); + case 16: + return newstruct cs2func_script_3_struct(65, 8094, "Large landscape", "You can now display " + "" + "large landscapes" + "" + " in your house."); + case 17: + return newstruct cs2func_script_3_struct(66, 8105, "Round wall-mounted shield", "You can now display " + "" + "round wall-mounted shields" + "" + " in your house."); + case 18: + return newstruct cs2func_script_3_struct(76, 8269, "Mounted shark", "You can now display " + "" + "mounted shark" + "" + " in your house."); + case 19: + return newstruct cs2func_script_3_struct(76, 8106, "Square wall-mounted shield", "You can now display " + "" + "square wall-mounted shields" + "" + " in your house."); + case 20: + return newstruct cs2func_script_3_struct(78, 8089, "Major Slayer monster head", "You can now display " + "" + "major Slayer monster heads" + "" + " in your house."); + case 21: + return newstruct cs2func_script_3_struct(78, 8296, "Large map", "You can now display " + "" + "large maps" + "" + " in your house."); + case 22: + return newstruct cs2func_script_3_struct(86, 8107, "Wall-mounted kiteshield", "You can now display " + "" + "wall-mounted kiteshields" + "" + " in your house."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(30, 8162, "Hoop-and-stick game", "You can now construct " + "" + "hoop-and-stick games" + "" + " for your " + "" + "games room" + "" + "."); + case 1: + return newstruct cs2func_script_3_struct(32, 8023, "Boxing ring", "You can now construct " + "" + "boxing rings" + "" + " for your " + "" + "combat room" + "" + "."); + case 2: + return newstruct cs2func_script_3_struct(34, 8028, "Boxing glove rack", "You can now construct " + "" + "boxing glove racks" + "" + " for your " + "" + "combat room" + "" + "."); + case 3: + return newstruct cs2func_script_3_struct(34, 8165, "Oak prize chest", "You can now construct " + "" + "oak prize chests" + "" + " for your " + "" + "games room" + "" + "."); + case 4: + return newstruct cs2func_script_3_struct(37, 8156, "Lesser magical balance", "You can now construct " + "" + "lesser magical balances" + "" + " for your " + "" + "games room" + "" + "."); + case 5: + return newstruct cs2func_script_3_struct(39, 8159, "Jester game", "You can now construct " + "" + "jester games" + "" + " for your " + "" + "games room" + ""); + case 6: + return newstruct cs2func_script_3_struct(39, 8153, "Clay attack stone", "You can now construct " + "" + "clay attack stones" + "" + " for your " + "" + "games room" + "" + "."); + case 7: + return newstruct cs2func_script_3_struct(41, 8024, "Fencing ring", "You can now construct " + "" + "fencing rings" + "" + " for your " + "" + "combat room" + "" + "."); + case 8: + return newstruct cs2func_script_3_struct(44, 8029, "Weapons rack", "You can now construct " + "" + "weapons racks" + "" + " for your " + "" + "combat room" + "" + "."); + case 9: + return newstruct cs2func_script_3_struct(44, 8166, "Teak prize chest", "You can now construct " + "" + "teak prize chests" + "" + " for your " + "" + "games room" + "" + "."); + case 10: + return newstruct cs2func_script_3_struct(49, 8160, "Treasure hunt fairy house", "You can now construct " + "" + "treasure hunt fairy houses" + "" + " for your " + "" + "games room" + "" + "."); + case 11: + return newstruct cs2func_script_3_struct(51, 8025, "Combat ring", "You can now construct " + "" + "combat rings" + "" + " for your " + "" + "combat room" + "" + "."); + case 12: + return newstruct cs2func_script_3_struct(54, 8163, "Dartboard", "You can now construct " + "" + "dartboards" + "" + " for your " + "" + "games room" + "" + "."); + case 13: + return newstruct cs2func_script_3_struct(54, 8030, "Upgraded weapons rack", "You can now construct " + "" + "upgraded weapons racks" + "" + " for your " + "" + "combat room" + "" + "."); + case 14: + return newstruct cs2func_script_3_struct(54, 8167, "Mahogany prize chest", "You can now construct " + "" + "mahogany prize chests" + "" + " for your " + "" + "games room" + "" + "."); + case 15: + return newstruct cs2func_script_3_struct(57, 8157, "Medium balance", "You can now construct " + "" + "medium balances" + "" + " for your " + "" + "games room" + "" + "."); + case 16: + return newstruct cs2func_script_3_struct(59, 8154, "Limestone attack stone", "You can now construct " + "" + "limestone attack stones" + "" + " for your " + "" + "games room" + "" + "."); + case 17: + return newstruct cs2func_script_3_struct(59, 8161, "Hangman game", "You can now construct " + "" + "hangman games" + "" + " for your " + "" + "games room" + "" + "."); + case 18: + return newstruct cs2func_script_3_struct(71, 8026, "Ranging pedestals", "You can now construct " + "" + "ranging pedestals" + "" + " for your " + "" + "combat room" + "" + "."); + case 19: + return newstruct cs2func_script_3_struct(77, 8158, "Greater magical balance", "You can now add " + "" + "greater magic balances" + "" + " for your " + "" + "games room" + "" + "."); + case 20: + return newstruct cs2func_script_3_struct(79, 8155, "Marble attack stone", "You can now construct " + "" + "marble attack stones" + "" + " for your " + "" + "games room" + "" + "."); + case 21: + return newstruct cs2func_script_3_struct(81, 8164, "Archery target", "You can now construct " + "" + "archery targets" + "" + " for your " + "" + "games room" + "" + "."); + case 22: + return newstruct cs2func_script_3_struct(81, 8027, "Balance beam", "You can now construct " + "" + "balance beams" + "" + " for your " + "" + "games room" + "" + "."); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(1, 8168, "Exit portal", "You can now build an " + "" + "exit portal" + "" + " for your " + "" + "garden" + "" + "."); + case 1: + return newstruct cs2func_script_3_struct(1, 8096, "Low-level plants", "You can now put " + "" + "low-level plants" + "" + " in your " + "" + "garden" + "" + "."); + case 2: + return newstruct cs2func_script_3_struct(5, 8169, "Decorative rock", "You can now put " + "" + "decorative rocks" + "" + " in your " + "" + "garden" + "" + "."); + case 3: + return newstruct cs2func_script_3_struct(5, 8173, "Tree", "You can now plant " + "" + "trees" + "" + " in your " + "" + "garden" + "" + "."); + case 4: + return newstruct cs2func_script_3_struct(6, 8097, "Mid-level plants", "You can now put " + "" + "mid-level plants" + "" + " in your " + "" + "garden" + "" + "."); + case 5: + return newstruct cs2func_script_3_struct(10, 8170, "Pond", "You can now put a " + "" + "pond" + "" + " in your " + "" + "garden" + "" + "."); + case 6: + return newstruct cs2func_script_3_struct(10, 8174, "Nice tree", "You can now plant " + "" + "nice trees" + "" + " in your " + "" + "garden" + "" + "."); + case 7: + return newstruct cs2func_script_3_struct(12, 8098, "High-level plants", "You can now put " + "" + "high-level plants" + "" + " in your " + "" + "garden" + "" + "."); + case 8: + return newstruct cs2func_script_3_struct(15, 8171, "Imp statue", "You can now put " + "" + "imp statues" + "" + " in your " + "" + "garden" + "" + "."); + case 9: + return newstruct cs2func_script_3_struct(15, 8175, "Oak tree", "You can now plant " + "" + "oak trees" + "" + " in your " + "" + "garden" + "" + "."); + case 10: + return newstruct cs2func_script_3_struct(30, 8176, "Willow tree", "You can now plant " + "" + "willow trees" + "" + " in your " + "" + "garden" + "" + "."); + case 11: + return newstruct cs2func_script_3_struct(45, 8177, "Maple tree", "You can now plant " + "" + "maple trees" + "" + " in your " + "" + "garden" + "" + "."); + case 12: + return newstruct cs2func_script_3_struct(55, 8196, "Boundary stones", "You can now put " + "" + "boundary stones" + "" + " in your " + "" + "garden" + "" + "."); + case 13: + return newstruct cs2func_script_3_struct(56, 8203, "Thorny hedge", "You can now plant " + "" + "thorny hedges" + "" + " in your " + "" + "garden" + "" + "."); + case 14: + return newstruct cs2func_script_3_struct(59, 8197, "Wooden fence", "You can now put " + "" + "wooden fences" + "" + " around your " + "" + "garden" + "" + "."); + case 15: + return newstruct cs2func_script_3_struct(60, 8204, "Nice hedge", "You can now plant " + "" + "nice hedges" + "" + " in your " + "" + "garden" + "" + "."); + case 16: + return newstruct cs2func_script_3_struct(60, 8178, "Yew tree", "You can now plant " + "" + "yew trees" + "" + " in your " + "" + "garden" + "" + "."); + case 17: + return newstruct cs2func_script_3_struct(63, 8198, "Stone wall", "You can now put " + "" + "stone walls" + "" + " around your " + "" + "garden" + "" + "."); + case 18: + return newstruct cs2func_script_3_struct(64, 8205, "Small box hedge", "You can now plant " + "" + "small box hedges" + "" + " in your " + "" + "garden" + "" + "."); + case 19: + return newstruct cs2func_script_3_struct(65, 8192, "Gazebo", "You can now put " + "" + "gazebos" + "" + " in your " + "" + "garden" + "" + "."); + case 20: + return newstruct cs2func_script_3_struct(66, 8213, "Sunflower", "You can now plant " + "" + "sunflowers" + "" + " in your " + "" + "garden" + "" + "."); + case 21: + return newstruct cs2func_script_3_struct(66, 8210, "Rosemary", "You can now plant " + "" + "rosemary" + "" + " in your " + "" + "garden" + "" + "."); + case 22: + return newstruct cs2func_script_3_struct(67, 8199, "Iron railings", "You can now put " + "" + "iron railings" + "" + " around your " + "" + "garden" + "" + "."); + case 23: + return newstruct cs2func_script_3_struct(68, 8206, "Topiary hedge", "You can now plant " + "" + "topiary hedges" + "" + " in your " + "" + "garden" + "" + "."); + case 24: + return newstruct cs2func_script_3_struct(70, 8172, "Dungeon entrance", "You can now put " + "" + "dungeon entrances" + "" + " in your " + "" + "garden" + "" + "."); + case 25: + return newstruct cs2func_script_3_struct(71, 8214, "Marigolds", "You can now plant " + "" + "marigolds" + "" + " in your " + "" + "garden" + "" + "."); + case 26: + return newstruct cs2func_script_3_struct(71, 8211, "Daffodils", "You can now plant " + "" + "daffodils" + "" + " in your " + "" + "garden" + "" + "."); + case 27: + return newstruct cs2func_script_3_struct(71, 8200, "Picket fence", "You can now put " + "" + "picket fences" + "" + " around your " + "" + "garden" + "" + "."); + case 28: + return newstruct cs2func_script_3_struct(71, 8193, "Small fountain", "You can now put " + "" + "small fountains" + "" + " in your " + "" + "garden" + "" + "."); + case 29: + return newstruct cs2func_script_3_struct(72, 8207, "Fancy hedge", "You can now put " + "" + "fancy hedges" + "" + " around your " + "" + "garden" + "" + "."); + case 30: + return newstruct cs2func_script_3_struct(75, 8179, "Magic tree", "You can now plant " + "" + "magic trees" + "" + " in your " + "" + "garden" + "" + "."); + case 31: + return newstruct cs2func_script_3_struct(75, 8194, "Large fountain", "You can now put " + "" + "large fountains" + "" + " in your " + "" + "garden" + "" + "."); + case 32: + return newstruct cs2func_script_3_struct(75, 8201, "Garden fence", "You can now put " + "" + "garden fences" + "" + " around your " + "" + "garden" + "" + "."); + case 33: + return newstruct cs2func_script_3_struct(76, 8208, "Tall fancy hedge", "You can now plant " + "" + "tall fancy hedges" + "" + " in your " + "" + "garden" + "" + "."); + case 34: + return newstruct cs2func_script_3_struct(76, 8215, "Roses", "You can now plant " + "" + "roses" + "" + " in your " + "" + "garden" + "" + "."); + case 35: + return newstruct cs2func_script_3_struct(76, 8212, "Bluebells", "You can now plant " + "" + "bluebells" + "" + " in your " + "" + "garden" + "" + "."); + case 36: + return newstruct cs2func_script_3_struct(79, 8202, "Marble wall", "You can now put " + "" + "marble walls" + "" + " around your " + "" + "garden" + "" + "."); + case 37: + return newstruct cs2func_script_3_struct(80, 8209, "Tall box hedge", "You can now plant " + "" + "tall box hedges" + "" + " in your " + "" + "garden" + "" + "."); + case 38: + return newstruct cs2func_script_3_struct(81, 8195, "Posh fountain", "You can now put " + "" + "posh fountains" + "" + " in your " + "" + "garden" + "" + "."); + } + break; + case 8: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(61, 8370, "Throne room floor decoration", "You can now add " + "" + "floor decorations" + "" + " to your " + "" + "throne room" + "" + " floor."); + case 1: + return newstruct cs2func_script_3_struct(65, 8297, "Oak cage", "You can add " + "" + "oak cages" + "" + " to your " + "" + "dungeon" + "" + "."); + case 2: + return newstruct cs2func_script_3_struct(65, 8302, "Oubliette spikes", "You can now add " + "" + "oubliette spikes" + "" + " to your " + "" + "dungeon" + "" + "."); + case 3: + return newstruct cs2func_script_3_struct(68, 8371, "Steel cage", "You can now add " + "" + "steel cages" + "" + " to your " + "" + "throne room" + "" + " floor."); + case 4: + return newstruct cs2func_script_3_struct(70, 8298, "Oak and steel cage", "You can now add " + "" + "oak and steel cages" + "" + " to your " + "" + "dungeon" + "" + "."); + case 5: + return newstruct cs2func_script_3_struct(70, 8131, "Skeleton guard", "You can now add " + "" + "skeleton guards" + "" + " to your " + "" + "dungeon" + "" + "."); + case 6: + return newstruct cs2func_script_3_struct(70, 18791, "Pit dog", "You can now add " + "" + "pit dogs" + "" + " to your dungeon pits (after Love Story)."); + case 7: + return newstruct cs2func_script_3_struct(71, 8303, "Tentacle pool", "You can now add " + "" + "tentacle pools" + "" + " to your " + "" + "dungeon" + "" + "."); + case 8: + return newstruct cs2func_script_3_struct(71, 18797, "Minor pit trap", "You can now add " + "" + "minor traps" + "" + " to your dungeon pits (after Love Story)."); + case 9: + return newstruct cs2func_script_3_struct(72, 8143, "Spike trap", "You can now add " + "" + "spike traps" + "" + " to your " + "" + "dungeon" + "" + "."); + case 10: + return newstruct cs2func_script_3_struct(73, 18792, "Pit ogre", "You can now add " + "" + "pit ogres" + "" + " to your dungeon pits (after Love Story)."); + case 11: + return newstruct cs2func_script_3_struct(74, 8372, "Large trapdoor", "You can now add " + "" + "large trapdoors" + "" + " to your " + "" + "throne room" + "" + " floor."); + case 12: + return newstruct cs2func_script_3_struct(74, 8122, "Oak dungeon door", "You can now add " + "" + "oak dungeon doors" + "" + " to your " + "" + "dungeon" + "" + "."); + case 13: + return newstruct cs2func_script_3_struct(74, 8132, "Guard dog", "You can now add " + "" + "guard dogs" + "" + " to your " + "" + "dungeon" + "" + "."); + case 14: + return newstruct cs2func_script_3_struct(75, 8148, "Wooden dungeon treasure crate", "You can now add " + "" + "wooden dungeon treasure crates" + "" + " to your " + "" + "treasure room" + "" + "."); + case 15: + return newstruct cs2func_script_3_struct(75, 8138, "Demon", "You can now add " + "" + "demons" + "" + " to your " + "" + "dungeon" + "" + "."); + case 16: + return newstruct cs2func_script_3_struct(75, 8299, "Steel cage", "You can now add " + "" + "steel cages" + "" + " to your " + "" + "dungeon" + "" + "."); + case 17: + return newstruct cs2func_script_3_struct(76, 8144, "Man trap", "You can now add " + "" + "man traps" + "" + " to your " + "" + "dungeon" + "" + "."); + case 18: + return newstruct cs2func_script_3_struct(77, 8304, "Oubliette flame pit", "You can now add " + "" + "oubliette flame pits" + "" + " to your " + "" + "dungeon" + "" + "."); + case 19: + return newstruct cs2func_script_3_struct(78, 8133, "Hobgoblin guard", "You can now add " + "" + "hobgoblin guards" + "" + " to your " + "" + "dungeon" + "" + "."); + case 20: + return newstruct cs2func_script_3_struct(79, 8149, "Oak dungeon treasure chest", "You can now add " + "" + "oak dungeon treasure chests" + "" + " to your " + "" + "treasure room" + "" + "."); + case 21: + return newstruct cs2func_script_3_struct(79, 18793, "Pit rock protector", "You can now add " + "" + "pit rock protectors" + "" + " to your dungeon pits (after Love Story)."); + case 22: + return newstruct cs2func_script_3_struct(80, 8300, "Spiked cage", "You can now add " + "" + "spiked cages" + "" + " to your " + "" + "dungeon" + "" + "."); + case 23: + return newstruct cs2func_script_3_struct(80, 8145, "Tangle vine", "You can now add " + "" + "tangle vines" + "" + " to your " + "" + "dungeon" + "" + "."); + case 24: + return newstruct cs2func_script_3_struct(80, 8139, "Kalphite soldier", "You can now add " + "" + "kalphite soldiers" + "" + " to your " + "" + "dungeon" + "" + "."); + case 25: + return newstruct cs2func_script_3_struct(82, 8373, "Lesser magic cage", "You can now add " + "" + "lesser magic cages" + "" + " to your " + "" + "throne room" + "" + " floor."); + case 26: + return newstruct cs2func_script_3_struct(82, 8134, "Baby red dragon", "You can now add " + "" + "baby red dragons" + "" + " to your " + "" + "dungeon" + "" + "."); + case 27: + return newstruct cs2func_script_3_struct(83, 8150, "Teak dungeon treasure chest", "You can now add " + "" + "teak dungeon treasure chests" + "" + " to your " + "" + "treasure room" + "" + "."); + case 28: + return newstruct cs2func_script_3_struct(83, 8305, "Rocnar", "You can now add " + "" + "rocnars" + "" + " to your " + "" + "dungeon" + "" + "."); + case 29: + return newstruct cs2func_script_3_struct(83, 18798, "Major pit trap", "You can now add " + "" + "major traps" + "" + " to your dungeon pits (after Love Story)."); + case 30: + return newstruct cs2func_script_3_struct(84, 8123, "Steel-plated oak door", "You can now add " + "" + "steel-plated oak doors" + "" + " to your " + "" + "dungeon" + "" + "."); + case 31: + return newstruct cs2func_script_3_struct(84, 8146, "Marble trap", "You can now add " + "" + "marble traps" + "" + " to your " + "" + "dungeon" + "" + "."); + case 32: + return newstruct cs2func_script_3_struct(84, 18794, "Pit scabarite", "You can now add " + "" + "pit scarabites" + "" + " to your dungeon pits (after Love Story)."); + case 33: + return newstruct cs2func_script_3_struct(85, 8140, "Tok-Xil", "You can now add " + "" + "Tok-Xil" + "" + " to your " + "" + "dungeon" + "" + "."); + case 34: + return newstruct cs2func_script_3_struct(85, 8301, "Bone cage", "You can now add " + "" + "bone cages" + "" + " to your " + "" + "dungeon" + "" + "."); + case 35: + return newstruct cs2func_script_3_struct(86, 8135, "Huge spider", "You can now add " + "" + "huge spiders" + "" + " to your " + "" + "dungeon" + "" + "."); + case 36: + return newstruct cs2func_script_3_struct(87, 8151, "Mahogany dungeon treasure chest", "You can now add " + "" + "mahogany dungeon treasure chests" + "" + " to your " + "" + "treasure room" + "" + "."); + case 37: + return newstruct cs2func_script_3_struct(88, 8147, "Teleport trap", "You can now add " + "" + "teleport traps" + "" + " to your " + "" + "dungeon" + "" + "."); + case 38: + return newstruct cs2func_script_3_struct(89, 8374, "Greater magic cage", "You can now add " + "" + "greater magic cages" + "" + " to your " + "" + "throne room" + "" + " floor."); + case 39: + return newstruct cs2func_script_3_struct(89, 18795, "Pit black demon", "You can now add " + "" + "pit black demons" + "" + " to your dungeon pits (after Love Story)."); + case 40: + return newstruct cs2func_script_3_struct(90, 8136, "Troll guard", "You can now add " + "" + "troll guards" + "" + " to your " + "" + "dungeon" + "" + "."); + case 41: + return newstruct cs2func_script_3_struct(90, 8141, "Dagannoth", "You can now add " + "" + "dagannoths" + "" + " to your " + "" + "dungeon" + "" + "."); + case 42: + return newstruct cs2func_script_3_struct(91, 8152, "Magic dungeon treasure chest", "You can now add " + "" + "magic dungeon treasure chests" + "" + " to your " + "" + "treasure room" + "" + "."); + case 43: + return newstruct cs2func_script_3_struct(94, 8124, "Marble dungeon door", "You can now add " + "" + "marble dungeon doors" + "" + " to your " + "" + "dungeon" + "" + "."); + case 44: + return newstruct cs2func_script_3_struct(94, 8137, "Hellhound", "You can now add " + "" + "hellhounds" + "" + " to your " + "" + "dungeon" + "" + "."); + case 45: + return newstruct cs2func_script_3_struct(95, 8142, "Steel dragon", "You can now add " + "" + "steel dragons" + "" + " to your " + "" + "dungeon" + "" + "."); + case 46: + return newstruct cs2func_script_3_struct(96, 18799, "Superior pit trap", "You can now add " + "" + "superior traps" + "" + " to your dungeon pits (after Love Story)."); + case 47: + return newstruct cs2func_script_3_struct(97, 18796, "Pit iron dragon", "You can now add " + "" + "pit iron dragons" + "" + " to your dungeon pits (after Love Story)."); + } + break; + case 9: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(45, 8062, "Oak altar", "You can now construct " + "" + "oak altars" + "" + " for your " + "" + "chapel" + "" + "."); + case 1: + return newstruct cs2func_script_3_struct(45, 8070, "Steel torches", "You can now add " + "" + "steel torches" + "" + " to your " + "" + "chapel" + "" + "."); + case 2: + return newstruct cs2func_script_3_struct(48, 8055, "Symbol of Saradomin", "You can now add " + "" + "symbols of Saradomin" + "" + " to your " + "" + "chapel" + "" + "."); + case 3: + return newstruct cs2func_script_3_struct(48, 8057, "Symbol of Guthix", "You can now add " + "" + "symbols of Guthix" + "" + " to your " + "" + "chapel" + "" + "."); + case 4: + return newstruct cs2func_script_3_struct(48, 8056, "Symbol of Zamorak", "You can now add " + "" + "symbols of Zamorak" + "" + " to your " + "" + "chapel" + "" + "."); + case 5: + return newstruct cs2func_script_3_struct(49, 8069, "Wooden torches", "You can now add " + "" + "wooden torches" + "" + " to your " + "" + "chapel" + "" + "."); + case 6: + return newstruct cs2func_script_3_struct(49, 8079, "Chapel windchimes", "You can now add " + "" + "chapel windchimes" + "" + " to your " + "" + "chapel" + "" + "."); + case 7: + return newstruct cs2func_script_3_struct(49, 8082, "Small chapel statue", "You can now construct " + "" + "small chapel statues" + "" + " for your " + "" + "chapel" + "" + "."); + case 8: + return newstruct cs2func_script_3_struct(49, 8076, "Shuttered chapel window", "You can now add " + "" + "shuttered windows" + "" + " to your " + "" + "chapel" + "" + "."); + case 9: + return newstruct cs2func_script_3_struct(50, 8063, "Teak altar", "You can now construct " + "" + "teak altars" + "" + " for your " + "" + "chapel" + "" + "."); + case 10: + return newstruct cs2func_script_3_struct(53, 8071, "Steel candlesticks", "You can now add " + "" + "steel candlesticks" + "" + " to your " + "" + "chapel" + "" + "."); + case 11: + return newstruct cs2func_script_3_struct(56, 8064, "Cloth-covered teak altar", "You can now add " + "" + "cloth-covered teak altars" + "" + " to your " + "" + "chapel" + "" + "."); + case 12: + return newstruct cs2func_script_3_struct(57, 8072, "Gold candlesticks", "You can now add " + "" + "gold candlesticks" + "" + " to your " + "" + "chapel" + "" + "."); + case 13: + return newstruct cs2func_script_3_struct(58, 8080, "Chapel bells", "You can now add " + "" + "chapel bells" + "" + " to your " + "" + "chapel" + "" + "."); + case 14: + return newstruct cs2func_script_3_struct(59, 8058, "Icon of Saradomin", "You can now add " + "" + "icons of Saradomin" + "" + " to your " + "" + "chapel" + "" + "."); + case 15: + return newstruct cs2func_script_3_struct(59, 8060, "Icon of Guthix", "You can now add " + "" + "icons of Guthix" + "" + " to your " + "" + "chapel" + "" + "."); + case 16: + return newstruct cs2func_script_3_struct(59, 8059, "Icon of Zamorak", "You can now add " + "" + "icons of Zamorak" + "" + " to your " + "" + "chapel" + "" + "."); + case 17: + return newstruct cs2func_script_3_struct(60, 8065, "Cloth-covered mahogany altar", "You can now construct " + "" + "cloth-covered mahogany altars" + "" + " for your " + "" + "chapel" + "" + "."); + case 18: + return newstruct cs2func_script_3_struct(61, 8073, "Oak incense burners", "You can now add " + "" + "oak incense burners" + "" + " to your " + "" + "chapel" + "" + "."); + case 19: + return newstruct cs2func_script_3_struct(64, 8066, "Limestone altar", "You can now construct " + "" + "limestone altars" + "" + " for your " + "" + "chapel" + "" + "."); + case 20: + return newstruct cs2func_script_3_struct(65, 8074, "Mahogany incense burners", "You can now add " + "" + "mahogany incense burners" + "" + " to your " + "" + "chapel" + "" + "."); + case 21: + return newstruct cs2func_script_3_struct(69, 8083, "Medium chapel statue", "You can now add " + "" + "medium chapel statues" + "" + " to your " + "" + "chapel" + "" + "."); + case 22: + return newstruct cs2func_script_3_struct(69, 8081, "Chapel organ", "You can now add " + "" + "organs" + "" + " to your " + "" + "chapel" + "" + "."); + case 23: + return newstruct cs2func_script_3_struct(69, 8077, "Decorative chapel window", "You can now add " + "" + "decorative windows" + "" + " to your " + "" + "chapel" + "" + "."); + case 24: + return newstruct cs2func_script_3_struct(69, 8075, "Marble incense burner", "You can now add " + "" + "marble incense burners" + "" + " to your " + "" + "chapel" + "" + "."); + case 25: + return newstruct cs2func_script_3_struct(70, 8067, "Marble altar", "You can now construct " + "" + "marble altars" + "" + " for your " + "" + "chapel" + "" + "."); + case 26: + return newstruct cs2func_script_3_struct(71, 8061, "Icon of Bob the Cat", "You can now add " + "" + "icons of Bob the Cat" + "" + " to your " + "" + "chapel" + "" + "."); + case 27: + return newstruct cs2func_script_3_struct(75, 8068, "Gilded marble altar", "You can now construct " + "" + "gilded marble altars" + "" + " for your " + "" + "chapel" + "" + "."); + case 28: + return newstruct cs2func_script_3_struct(89, 8084, "Large chapel statue", "You can now add " + "" + "large chapel statues" + "" + " to your " + "" + "chapel" + "" + "."); + case 29: + return newstruct cs2func_script_3_struct(89, 8078, "Stained-glass chapel window", "You can now add " + "" + "stained-glass windows" + "" + " to your " + "" + "chapel" + "" + "."); + } + break; + case 10: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(5, 8236, "Cat blanket", "You can now add " + "" + "cat blankets" + "" + " to your house."); + case 1: + return newstruct cs2func_script_3_struct(19, 8237, "Cat basket", "You can now add " + "" + "cat baskets" + "" + " to your house."); + case 2: + return newstruct cs2func_script_3_struct(26, 8099, "Rope bell pull", "You can now add " + "" + "rope bell pulls" + "" + " to your house."); + case 3: + return newstruct cs2func_script_3_struct(27, 8249, "Oak staircase", "You can now construct " + "" + "oak staircases" + "" + " for your house."); + case 4: + return newstruct cs2func_script_3_struct(33, 8238, "Cushioned cat basket", "You can now add " + "" + "cushioned cat baskets" + "" + " to your house."); + case 5: + return newstruct cs2func_script_3_struct(37, 8100, "Teak bell pull", "You can now add " + "" + "teak bell pulls" + "" + " to your house."); + case 6: + return newstruct cs2func_script_3_struct(42, 8351, "Crystal ball", "You can now add " + "" + "crystal balls" + "" + " to your house."); + case 7: + return newstruct cs2func_script_3_struct(48, 8252, "Teak staircase", "You can now construct " + "" + "teak staircases" + "" + " for your house."); + case 8: + return newstruct cs2func_script_3_struct(50, 8328, "Teak portal frame", "You can now construct " + "" + "teak portal frames" + "" + " for your house."); + case 9: + return newstruct cs2func_script_3_struct(50, 8331, "Teleport focus", "You can now construct " + "" + "teleport focuses" + "" + " for your house."); + case 10: + return newstruct cs2func_script_3_struct(54, 8352, "Elemental sphere", "You can now add " + "" + "elemental spheres" + "" + " to your house."); + case 11: + return newstruct cs2func_script_3_struct(60, 8101, "Gilded teak bell pull", "You can now add " + "" + "gilded teak bell pulls" + "" + " to your house."); + case 12: + return newstruct cs2func_script_3_struct(65, 8332, "Greater teleport focus", "You can now construct " + "" + "greater teleport focuses" + "" + " for your house."); + case 13: + return newstruct cs2func_script_3_struct(65, 8329, "Mahogany portal frame", "You can now construct " + "" + "mahogany portal frames" + "" + " for your house."); + case 14: + return newstruct cs2func_script_3_struct(66, 8353, "Crystal of power", "You can now make " + "" + "crystals of power" + "" + " for your house."); + case 15: + return newstruct cs2func_script_3_struct(67, 8258, "Limestone spiral staircase", "You can now construct " + "" + "limestone spiral staircases" + "" + " for your house."); + case 16: + return newstruct cs2func_script_3_struct(68, 8306, "Oak oubliette ladder", "You can now construct " + "" + "oak oubliette ladders" + "" + " for your house."); + case 17: + return newstruct cs2func_script_3_struct(68, 8364, "Oak lever", "You can now construct " + "" + "oak levers" + "" + " for your house."); + case 18: + return newstruct cs2func_script_3_struct(68, 8367, "Oak trapdoor", "You can now make " + "" + "oak trapdoors" + "" + " for your " + "" + "throne room" + "" + "."); + case 19: + return newstruct cs2func_script_3_struct(78, 8307, "Teak oubliette ladder", "You can now construct " + "" + "teak oubliette ladders" + "" + " for your house."); + case 20: + return newstruct cs2func_script_3_struct(78, 8365, "Teak lever", "You can now construct " + "" + "teak levers" + "" + " for your house."); + case 21: + return newstruct cs2func_script_3_struct(78, 8368, "Teak trapdoor", "You can now construct " + "" + "teak trapdoors" + "" + " for your " + "" + "throne room" + "" + "."); + case 22: + return newstruct cs2func_script_3_struct(80, 8330, "Marble portal frame", "You can now construct " + "" + "marble portal frames" + "" + " for your house."); + case 23: + return newstruct cs2func_script_3_struct(80, 8333, "Scrying pool", "You can now construct " + "" + "scrying pools" + "" + " for your house."); + case 24: + return newstruct cs2func_script_3_struct(82, 8255, "Marble staircase", "You can now construct a " + "" + "marble staircase" + "" + " for your house."); + case 25: + return newstruct cs2func_script_3_struct(88, 8308, "Mahogany oubliette ladder", "You can now construct " + "" + "mahogany oubliette ladders" + "" + " for your house."); + case 26: + return newstruct cs2func_script_3_struct(88, 8366, "Mahogany lever", "You can now construct " + "" + "mahogany levers" + "" + " for your house."); + case 27: + return newstruct cs2func_script_3_struct(88, 8369, "Mahogany trapdoor", "You can now construct " + "" + "mahogany trapdoors" + "" + " for your " + "" + "throne room" + "" + "."); + case 28: + return newstruct cs2func_script_3_struct(91, 18778, "Starved ancient effigies", "You can now investigate " + "" + "starved ancient effigies" + "" + " using your knowledge of Construction."); + case 29: + return newstruct cs2func_script_3_struct(93, 18779, "Nourished ancient effigies", "You can now investigate " + "" + "nourished ancient effigies" + "" + " using your knowledge of Construction."); + case 30: + return newstruct cs2func_script_3_struct(95, 18780, "Sated ancient effigies", "You can now investigate " + "" + "sated ancient effigies" + "" + " using your knowledge of Construction."); + case 31: + return newstruct cs2func_script_3_struct(97, 18781, "Gorged ancient effigies", "You can now investigate " + "" + "gorged ancient effigies" + "" + " using your knowledge of Construction."); + case 32: + return newstruct cs2func_script_3_struct(97, 8259, "Marble spiral staircase", "You can now construct " + "" + "marble spiral staircases" + "" + " for your house."); + } + break; + case 11: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(37, 15222, "Garden habitat", "You can now construct " + "" + "garden habitats" + "" + " for your " + "" + "menagerie" + "" + "."); + case 1: + return newstruct cs2func_script_3_struct(37, 15227, "Oak pet house", "You can now construct " + "" + "oak pet houses" + "" + " for your " + "" + "menagerie" + "" + "."); + case 2: + return newstruct cs2func_script_3_struct(37, 15233, "Oak pet feeder", "You can now construct " + "" + "oak pet feeders" + "" + " for your " + "" + "menagerie" + "" + "."); + case 3: + return newstruct cs2func_script_3_struct(41, 15236, "Mini obelisk", "You can now construct " + "" + "mini obelisks" + "" + " for your " + "" + "menagerie" + "" + "."); + case 4: + return newstruct cs2func_script_3_struct(47, 15223, "Jungle habitat", "You can now construct " + "" + "jungle habitats" + "" + " for your " + "" + "menagerie" + "" + "."); + case 5: + return newstruct cs2func_script_3_struct(52, 15228, "Teak pet house", "You can now construct " + "" + "teak pet houses" + "" + " for your " + "" + "menagerie" + "" + "."); + case 6: + return newstruct cs2func_script_3_struct(52, 15234, "Teak pet feeder", "You can now construct " + "" + "teak pet feeders" + "" + " for your " + "" + "menagerie" + "" + "."); + case 7: + return newstruct cs2func_script_3_struct(57, 15224, "Desert habitat", "You can now construct " + "" + "desert habitats" + "" + " for your " + "" + "menagerie" + "" + "."); + case 8: + return newstruct cs2func_script_3_struct(67, 15229, "Mahogany pet house", "You can now construct " + "" + "mahogany pet houses" + "" + " for your " + "" + "menagerie" + "" + "."); + case 9: + return newstruct cs2func_script_3_struct(67, 15235, "Mahogany pet feeder", "You can now construct " + "" + "mahogany pet feeders" + "" + " for your " + "" + "menagerie" + "" + "."); + case 10: + return newstruct cs2func_script_3_struct(67, 15225, "Polar habitat", "You can now construct " + "" + "polar habitats" + "" + " for your " + "" + "menagerie" + "" + "."); + case 11: + return newstruct cs2func_script_3_struct(77, 15226, "Volcanic habitat", "You can now construct " + "" + "volcanic habitats" + "" + " for your " + "" + "menagerie" + "" + "."); + case 12: + return newstruct cs2func_script_3_struct(92, 15230, "Consecrated pet house", "You can now construct " + "" + "consecrated pet houses" + "" + " for your " + "" + "menagerie" + "" + "."); + case 13: + return newstruct cs2func_script_3_struct(92, 15231, "Desecrated pet house", "You can now construct " + "" + "desecrated pet houses" + "" + " for your " + "" + "menagerie" + "" + "."); + case 14: + return newstruct cs2func_script_3_struct(92, 15232, "Natural pet house", "You can now construct " + "" + "natural pet houses" + "" + " for your " + "" + "menagerie" + "" + "."); + } + break; + case 12: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(20, 7974, "Rick", "You can now hire " + "" + "Rick" + "" + "."); + case 1: + return newstruct cs2func_script_3_struct(25, 7974, "Maid", "You can now hire " + "" + "maids" + "" + "."); + case 2: + return newstruct cs2func_script_3_struct(30, 7974, "Cook", "You can now hire " + "" + "cooks" + "" + "."); + case 3: + return newstruct cs2func_script_3_struct(40, 7974, "Butler", "You can now hire " + "" + "butlers" + "" + "."); + case 4: + return newstruct cs2func_script_3_struct(50, 7974, "Demon butler", "You can now hire " + "" + "demon butlers" + "" + "."); + } + break; + case 13: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(1, 14172, "Stealing Creation - class 1 barriers", "You can now make " + "" + "class 1 barriers" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_3_struct(20, 14174, "Stealing Creation - class 2 barriers", "You can now make " + "" + "class 2 barriers" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_3_struct(40, 14176, "Stealing Creation - class 3 barriers", "You can now make " + "" + "class 3 barriers" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_3_struct(50, 20704, "Members: access to the Livid Farm (with 70 Magic, 60 Agility, 60 Crafting, 60 Farming and Lunar Diplomacy)", "Members can access the " + "" + "Livid Farm" + "" + " (with 70 Magic, 60 Agility, 60 Crafting, 60 Farming and Lunar Diplomacy)."); + case 4: + return newstruct cs2func_script_3_struct(60, 14178, "Stealing Creation - class 4 barriers", "You can now make " + "" + "class 4 barriers" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_3_struct(80, 14180, "Stealing Creation - class 5 barriers", "You can now make " + "" + "class 5 barriers" + "" + " in Stealing Creation."); + } + break; + case 14: + switch (arg1) { + case 0: + return newstruct cs2func_script_3_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Construction level increases, you will be able to attempt higher-level construction tasks within Daemonheim. You will also be more likely to succeed when attempting construction tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_3_struct(5, 1510, "Start room photo booth", "You can now make " + "" + "a photo booth" + "" + " in the start room of Daemonheim."); + case 2: + return newstruct cs2func_script_3_struct(25, 18835, "Start room farming patch" + "
" + "5 seeping elm branches and 5 bathus bars", "You can now make " + "" + "farming patches" + "" + " in the start room of Daemonheim."); + case 3: + return newstruct cs2func_script_3_struct(50, 18837, "Start room range" + "
" + "5 utuku branches and 5 kratonite bars", "You can now make " + "" + "ranges" + "" + " in the start room of Daemonheim."); + case 4: + return newstruct cs2func_script_3_struct(75, 18836, "Start room prayer altar" + "
" + "5 bovistrangler logs and 5 zephyrium bars", "You can now make " + "" + "prayer altars" + "" + " in the start room of Daemonheim."); + } + break; + case 15: + SWITCH (arg1) { + case 0: + GOTO flow_444 + case 1: + GOTO flow_445 + case 2: + GOTO flow_446 + case 3: + GOTO flow_447 + case 4: + GOTO flow_448 + case 5: + GOTO flow_449 + case 6: + GOTO flow_450 + case 7: + GOTO flow_451 + case 8: + GOTO flow_452 + case 9: + GOTO flow_453 + case 10: + GOTO flow_454 + case 11: + GOTO flow_455 + case 12: + GOTO flow_456 + case 13: + GOTO flow_457 + case 14: + GOTO flow_458 + case 15: + GOTO flow_459 + case 16: + GOTO flow_460 + case 17: + GOTO flow_461 + case 18: + GOTO flow_462 + } + break; + flow_444: + return newstruct cs2func_script_3_struct(1, 2347, "Maximum rooms: 20", "You can now have a maximum of " + "" + "20 rooms" + "" + " in your house."); + flow_445: + return newstruct cs2func_script_3_struct(1, 8794, "Maximum dimensions: 3x3", "Your house can now have maximum dimensions of " + "" + "3 rooms wide by 3 rooms long" + "" + "."); + flow_446: + return newstruct cs2func_script_3_struct(15, 8794, "Maximum dimensions: 4x4", "Your house can now have maximum dimensions of " + "" + "4 rooms wide by 4 rooms long" + "" + "."); + flow_447: + return newstruct cs2func_script_3_struct(30, 8794, "Maximum dimensions: 5x5", "Your house can now have maximum dimensions of " + "" + "5 rooms wide by 5 rooms long" + "" + "."); + flow_448: + return newstruct cs2func_script_3_struct(38, 2347, "Maximum rooms: 21", "You can now have a maximum of " + "" + "21 rooms" + "" + " in your house."); + flow_449: + return newstruct cs2func_script_3_struct(44, 2347, "Maximum rooms: 22", "You can now have a maximum of " + "" + "22 rooms" + "" + " in your house."); + flow_450: + return newstruct cs2func_script_3_struct(45, 8794, "Maximum dimensions: 6x6", "Your house can now have maximum dimensions of " + "" + "6 rooms wide by 6 rooms long" + "" + "."); + flow_451: + return newstruct cs2func_script_3_struct(50, 2347, "Maximum rooms: 23", "You can now have a maximum of " + "" + "23 rooms" + "" + " in your house."); + flow_452: + return newstruct cs2func_script_3_struct(56, 2347, "Maximum rooms: 24", "You can now have a maximum of " + "" + "24 rooms" + "" + " in your house."); + flow_453: + return newstruct cs2func_script_3_struct(60, 8794, "Maximum dimensions: 7x7", "Your house can now have maximum dimensions of " + "" + "7 rooms wide by 7 rooms long" + "" + "."); + flow_454: + return newstruct cs2func_script_3_struct(62, 2347, "Maximum rooms: 25", "You can now have a maximum of " + "" + "25 rooms" + "" + " in your house."); + flow_455: + return newstruct cs2func_script_3_struct(68, 2347, "Maximum rooms: 26", "You can now have a maximum of " + "" + "26 rooms" + "" + " in your house."); + flow_456: + return newstruct cs2func_script_3_struct(74, 2347, "Maximum rooms: 27", "You can now have a maximum of " + "" + "27 rooms" + "" + " in your house."); + flow_457: + return newstruct cs2func_script_3_struct(80, 2347, "Maximum rooms: 28", "You can now have a maximum of " + "" + "28 rooms" + "" + " in your house."); + flow_458: + return newstruct cs2func_script_3_struct(86, 2347, "Maximum rooms: 29", "You can now have a maximum of " + "" + "29 rooms" + "" + " in your house."); + flow_459: + return newstruct cs2func_script_3_struct(92, 2347, "Maximum rooms: 30", "You can now have a maximum of " + "" + "30 rooms" + "" + " in your house."); + flow_460: + return newstruct cs2func_script_3_struct(96, 2347, "Maximum rooms: 31", "You can now have a maximum of " + "" + "31 rooms" + "" + " in your house."); + flow_461: + return newstruct cs2func_script_3_struct(99, 2347, "Maximum rooms: 32", "You can now have a maximum of " + "" + "32 rooms" + "" + " in your house."); + flow_462: + return newstruct cs2func_script_3_struct(99, 9789, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Construction" + "" + ". Why not visit the " + "" + "Estate Agent" + "" + "? He has something special that is only available to true masters of the " + "" + "Construction" + "" + " skill!"); + } + return newstruct cs2func_script_3_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/30.cs2 b/dumps/scripts/30.cs2 new file mode 100644 index 000000000..2e41536e4 --- /dev/null +++ b/dumps/scripts/30.cs2 @@ -0,0 +1,4 @@ +void script_30(int arg0,int arg1) { + script_31(arg0, arg1, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/300.cs2 b/dumps/scripts/300.cs2 new file mode 100644 index 000000000..7abc1d521 --- /dev/null +++ b/dumps/scripts/300.cs2 @@ -0,0 +1,175 @@ +int script_300(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,string arg9) { + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + cs2func_script_296_struct(2,0,0) structdump_7; + ivar9 = 0; + ivar10 = 0; + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = arg3; + stack_dump3 = arg4; + stack_dump4 = arg5; + stack_dump5 = arg6; + stack_dump6 = arg7; + structdump_7 = script_296(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6); + ivar10 = structdump_7.intpart_1; + ivar9 = structdump_7.intpart_0; + ivar11 = getOtherCommonData(arg2, 650); + ivar12 = getOtherCommonData(arg2, 651); + ivar13 = add(add(getMaxLineWidth(512, 591, arg9), ivar11), ivar11); + ivar14 = add(add(add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(arg3)), 591, arg9), 13), 2), ivar12), ivar12); + ivar15 = getOtherCommonData(arg2, 647); + ivar16 = getOtherCommonData(arg2, 648); + ivar17 = getOtherCommonData(arg2, 649); + ivar18 = getOtherCommonData(arg2, 652); + ivar19 = divide(subtract(ivar13, ivar11), 2); + ivar20 = divide(subtract(ivar14, ivar12), 2); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(ivar9, ivar10, 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 5, arg8); + setWidgetPosition(ivar9, ivar10, 1, 1); + setWidgetSize(subtract(ivar13, multiply(ivar11, 2)), subtract(ivar14, multiply(ivar12, 2)), 0, 0); + setWidgetSprite(getOtherCommonData(arg2, 646)); + cs2method1107(1); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(ivar9, subtract(ivar10, ivar20), 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 5, arg8); + setWidgetPosition(ivar9, subtract(ivar10, ivar20), 1, 1); + setWidgetSize(subtract(ivar13, multiply(ivar11, 2)), ivar12, 0, 0); + setWidgetSprite(ivar16); + cs2method1107(1); + setWidgetVFlip(0); + setWidgetHFlip(0); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(ivar9, add(ivar10, ivar20), 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 5, arg8); + setWidgetPosition(ivar9, add(ivar10, ivar20), 1, 1); + setWidgetSize(subtract(ivar13, multiply(ivar11, 2)), ivar12, 0, 0); + setWidgetSprite(ivar16); + cs2method1107(1); + setWidgetVFlip(1); + setWidgetHFlip(0); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(subtract(ivar9, ivar19), ivar10, 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 5, arg8); + setWidgetPosition(subtract(ivar9, ivar19), ivar10, 1, 1); + setWidgetSize(ivar11, subtract(ivar14, multiply(ivar12, 2)), 0, 0); + setWidgetSprite(ivar17); + cs2method1107(1); + setWidgetVFlip(0); + setWidgetHFlip(0); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(add(ivar9, ivar19), ivar10, 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 5, arg8); + setWidgetPosition(add(ivar9, ivar19), ivar10, 1, 1); + setWidgetSize(ivar11, subtract(ivar14, multiply(ivar12, 2)), 0, 0); + setWidgetSprite(ivar17); + cs2method1107(1); + setWidgetVFlip(0); + setWidgetHFlip(1); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(subtract(ivar9, ivar19), subtract(ivar10, ivar20), 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 5, arg8); + setWidgetPosition(subtract(ivar9, ivar19), subtract(ivar10, ivar20), 1, 1); + setWidgetSize(ivar11, ivar12, 0, 0); + setWidgetSprite(ivar15); + cs2method1107(0); + setWidgetVFlip(0); + setWidgetHFlip(0); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(add(ivar9, ivar19), subtract(ivar10, ivar20), 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 5, arg8); + setWidgetPosition(add(ivar9, ivar19), subtract(ivar10, ivar20), 1, 1); + setWidgetSize(ivar11, ivar12, 0, 0); + setWidgetSprite(ivar15); + cs2method1107(0); + setWidgetVFlip(0); + setWidgetHFlip(1); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(subtract(ivar9, ivar19), add(ivar10, ivar20), 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 5, arg8); + setWidgetPosition(subtract(ivar9, ivar19), add(ivar10, ivar20), 1, 1); + setWidgetSize(ivar11, ivar12, 0, 0); + setWidgetSprite(ivar15); + cs2method1107(0); + setWidgetVFlip(1); + setWidgetHFlip(0); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(add(ivar9, ivar19), add(ivar10, ivar20), 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 5, arg8); + setWidgetPosition(add(ivar9, ivar19), add(ivar10, ivar20), 1, 1); + setWidgetSize(ivar11, ivar12, 0, 0); + setWidgetSprite(ivar15); + cs2method1107(0); + setWidgetVFlip(1); + setWidgetHFlip(1); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(add(ivar9, 1), add(ivar10, 1), 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 4, arg8); + setWidgetPosition(add(ivar9, 1), add(ivar10, 1), 1, 1); + setWidgetSize(ivar13, ivar14, 0, 0); + setWidgetRGB(new Color(getOtherCommonData(arg2, 653))); + setWidgetTextAlignment(1, 1, 13); + setWidgetFont(591); + setWidgetText(arg9); + } + arg8 = add(arg8, 1); + if (setWidgetRegister(new WidgetPointer(arg3), arg8)) { + setWidgetPosition(ivar9, ivar10, 1, 1); + } else { + createExtraChild(new WidgetPointer(arg3), 4, arg8); + setWidgetPosition(ivar9, ivar10, 1, 1); + setWidgetSize(ivar13, ivar14, 0, 0); + setWidgetRGB(new Color(ivar18)); + setWidgetTextAlignment(1, 1, 13); + setWidgetFont(591); + setWidgetText(arg9); + } + arg8 = add(arg8, 1); + return arg8; +} diff --git a/dumps/scripts/3000.cs2 b/dumps/scripts/3000.cs2 new file mode 100644 index 000000000..0751bb05a --- /dev/null +++ b/dumps/scripts/3000.cs2 @@ -0,0 +1,6 @@ +void script_3000() { + if (((boolean)mod(getClientCycle(), 50))) { + script_3001(); + } + return; +} diff --git a/dumps/scripts/3001.cs2 b/dumps/scripts/3001.cs2 new file mode 100644 index 000000000..33c2179cc --- /dev/null +++ b/dumps/scripts/3001.cs2 @@ -0,0 +1,57 @@ +void script_3001() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + string svar1; + string svar2; + string svar3; + opcStruct6901(3,0,0) structdump_0; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + svar0 = ""; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + svar1 = ""; + svar2 = ""; + svar3 = ""; + structdump_0 = cs2method6901(); + ivar0 = structdump_0.intpart_2; + ivar2 = structdump_0.intpart_1; + ivar1 = structdump_0.intpart_0; + if (((boolean)ivar0) && isSiteSettingsMembers()) { + svar0 = minutesToUtcTime(ivar1); + ivar3 = divide(ivar2, 1440); + ivar4 = divide(mod(ivar2, 1440), 60); + ivar5 = mod(ivar2, 60); + if (add(add(ivar3, ivar4), ivar5) != 0) { + svar1 = " (in " + script_4582(ivar3, ivar4, ivar5) + ")"; + } + svar2 = "Your membership will expire on " + svar0 + svar1 + ". Renew now to avoid losing member status. Click " + "" + "" + "here" + "" + "" + " to renew."; + svar3 = "Your membership will expire on " + svar0 + svar1 + ". Renew now to avoid losing member status. Click " + "" + "" + "here" + "" + "" + " to renew."; + setWidgetText(new WidgetPointer(907,54), svar2); + setScriptCallOnMouseEntered(68, new WidgetPointer(-32768,3), svar3, "Is", new WidgetPointer(907,54)); + setScriptCallOnMouseExit(68, new WidgetPointer(-32768,3), svar2, "Is", new WidgetPointer(907,54)); + } + ivar6 = cs2method6904(); + if (((boolean)ivar6)) { + setWidgetText(new WidgetPointer(907,1), "Welcome to RuneScape!"); + return; + } + ivar7 = subtract(getCurrentDaysSinceLaunch(), ivar6); + if (ivar7 < 1) { + setWidgetText(new WidgetPointer(907,1), "You last logged in earlier today from: " + getLastIp()); + } else if (((boolean)ivar7)) { + setWidgetText(new WidgetPointer(907,1), "You last logged in yesterday from: " + getLastIp()); + } else { + setWidgetText(new WidgetPointer(907,1), "You last logged in " + intToStr(ivar7) + " days ago from: " + getLastIp()); + } + return; +} diff --git a/dumps/scripts/3002.cs2 b/dumps/scripts/3002.cs2 new file mode 100644 index 000000000..5500f0888 --- /dev/null +++ b/dumps/scripts/3002.cs2 @@ -0,0 +1,4 @@ +void script_3002(int arg0) { + script_3003(arg0); + return; +} diff --git a/dumps/scripts/3003.cs2 b/dumps/scripts/3003.cs2 new file mode 100644 index 000000000..27652f90b --- /dev/null +++ b/dumps/scripts/3003.cs2 @@ -0,0 +1,23 @@ +void script_3003(int arg0) { + int ivar1; + if (((int)cs2method_3408(105, 73, 942, arg0)) == -1) { + return; + } + ivar1 = -1; + if (getWidgetActualHeight(new WidgetPointer(907,3)) > 30) { + ivar1 = 0; + } else if (getWidgetActualHeight(new WidgetPointer(907,4)) > 30) { + ivar1 = 1; + } else if (getWidgetActualHeight(new WidgetPointer(907,5)) > 30) { + ivar1 = 2; + } else { + if (getWidgetActualHeight(new WidgetPointer(907,43)) > 30) { + ivar1 = 3; + } + } + if (arg0 == ivar1) { + return; + } + script_3004(ivar1, arg0); + return; +} diff --git a/dumps/scripts/3004.cs2 b/dumps/scripts/3004.cs2 new file mode 100644 index 000000000..ffc8dca43 --- /dev/null +++ b/dumps/scripts/3004.cs2 @@ -0,0 +1,20 @@ +void script_3004(int arg0,int arg1) { + int stack_dump0; + cs2func_script_3011_struct(7,0,0) structdump_1; + cs2func_script_3011_struct(7,0,0) structdump_2; + setScriptCallOnMousePressed(-1, "", new WidgetPointer(907,41)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(907,29)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(907,17)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(907,55)); + if (getWidgetSpriteId(new WidgetPointer(script_3013(arg1))) == 2669) { + stack_dump0 = arg1; + structdump_1 = script_3011(stack_dump0); + script_3007(structdump_1.intpart_0, structdump_1.intpart_1, structdump_1.intpart_2, structdump_1.intpart_3, structdump_1.intpart_4, structdump_1.intpart_5, structdump_1.intpart_6); + } else { + stack_dump0 = arg1; + structdump_2 = script_3011(stack_dump0); + script_3009(structdump_2.intpart_0, structdump_2.intpart_1, structdump_2.intpart_2, structdump_2.intpart_3, structdump_2.intpart_4, structdump_2.intpart_5, structdump_2.intpart_6); + } + setScriptCallOnGameloop(3005, arg1, arg0, "ii", new WidgetPointer(907,2)); + return; +} diff --git a/dumps/scripts/3005.cs2 b/dumps/scripts/3005.cs2 new file mode 100644 index 000000000..eb381be49 --- /dev/null +++ b/dumps/scripts/3005.cs2 @@ -0,0 +1,131 @@ +void script_3005(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int stack_dump0; + cs2func_script_3011_struct(7,0,0) structdump_1; + cs2func_script_3011_struct(7,0,0) structdump_2; + ivar2 = script_3012(arg1); + ivar3 = getWidgetActualHeight(new WidgetPointer(ivar2)); + ivar4 = subtract(ivar3, 3); + if (ivar3 > 30) { + if (ivar4 < 30) { + setWidgetSize(0, 30, 1, 0, new WidgetPointer(ivar2)); + } else { + setWidgetSize(0, ivar4, 1, 0, new WidgetPointer(ivar2)); + } + switch (arg1) { + case 0: + ivar4 = subtract(getWidgetActualY(new WidgetPointer(907,4)), 3); + if (ivar4 < 30) { + setWidgetPosition(0, 30, 0, 0, new WidgetPointer(907,4)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,4)); + } + ivar4 = subtract(getWidgetActualY(new WidgetPointer(907,5)), 3); + if (ivar4 < multiply(30, 2)) { + setWidgetPosition(0, multiply(30, 2), 0, 0, new WidgetPointer(907,5)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,5)); + } + ivar4 = subtract(getWidgetActualY(new WidgetPointer(907,43)), 3); + if (ivar4 < multiply(30, 3)) { + setWidgetPosition(0, multiply(30, 3), 0, 0, new WidgetPointer(907,43)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,43)); + } + break; + case 1: + ivar4 = subtract(getWidgetActualY(new WidgetPointer(907,5)), 3); + if (ivar4 < multiply(30, 2)) { + setWidgetPosition(0, multiply(30, 2), 0, 0, new WidgetPointer(907,5)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,5)); + } + ivar4 = subtract(getWidgetActualY(new WidgetPointer(907,43)), 3); + if (ivar4 < multiply(30, 3)) { + setWidgetPosition(0, multiply(30, 3), 0, 0, new WidgetPointer(907,43)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,43)); + } + break; + case 2: + ivar4 = subtract(getWidgetActualY(new WidgetPointer(907,43)), 3); + if (ivar4 < multiply(30, 3)) { + setWidgetPosition(0, multiply(30, 3), 0, 0, new WidgetPointer(907,43)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,43)); + } + } + } + ivar5 = script_3012(arg0); + ivar3 = getWidgetActualHeight(new WidgetPointer(ivar5)); + ivar4 = add(ivar3, 3); + if (ivar3 < 88) { + if (ivar4 > 88) { + setWidgetSize(0, 88, 1, 0, new WidgetPointer(ivar5)); + } else { + setWidgetSize(0, ivar4, 1, 0, new WidgetPointer(ivar5)); + } + switch (arg0) { + case 0: + ivar4 = add(getWidgetActualY(new WidgetPointer(907,4)), 3); + if (ivar4 > 88) { + setWidgetPosition(0, 88, 0, 0, new WidgetPointer(907,4)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,4)); + } + ivar4 = add(getWidgetActualY(new WidgetPointer(907,5)), 3); + if (ivar4 > add(88, 30)) { + setWidgetPosition(0, add(88, 30), 0, 0, new WidgetPointer(907,5)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,5)); + } + ivar4 = add(getWidgetActualY(new WidgetPointer(907,43)), 3); + if (ivar4 > add(88, multiply(30, 2))) { + setWidgetPosition(0, add(88, multiply(30, 2)), 0, 0, new WidgetPointer(907,43)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,43)); + } + break; + case 1: + ivar4 = add(getWidgetActualY(new WidgetPointer(907,5)), 3); + if (ivar4 > add(88, 30)) { + setWidgetPosition(0, add(88, 30), 0, 0, new WidgetPointer(907,5)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,5)); + } + ivar4 = add(getWidgetActualY(new WidgetPointer(907,43)), 3); + if (ivar4 > add(88, multiply(30, 2))) { + setWidgetPosition(0, add(88, multiply(30, 2)), 0, 0, new WidgetPointer(907,43)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,43)); + } + break; + case 2: + ivar4 = add(getWidgetActualY(new WidgetPointer(907,43)), 3); + if (ivar4 > add(88, multiply(30, 2))) { + setWidgetPosition(0, add(88, multiply(30, 2)), 0, 0, new WidgetPointer(907,43)); + } else { + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(907,43)); + } + } + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(907,2)); + if (getWidgetSpriteId(new WidgetPointer(script_3013(arg1))) == 2669) { + stack_dump0 = arg1; + structdump_1 = script_3011(stack_dump0); + script_3008(structdump_1.intpart_0, structdump_1.intpart_1, structdump_1.intpart_2, structdump_1.intpart_3, structdump_1.intpart_4, structdump_1.intpart_5, structdump_1.intpart_6); + } else { + stack_dump0 = arg1; + structdump_2 = script_3011(stack_dump0); + script_3010(structdump_2.intpart_0, structdump_2.intpart_1, structdump_2.intpart_2, structdump_2.intpart_3, structdump_2.intpart_4, structdump_2.intpart_5, structdump_2.intpart_6); + } + setScriptCallOnMousePressed(3002, 3, "i", new WidgetPointer(907,55)); + setScriptCallOnMousePressed(3002, 2, "i", new WidgetPointer(907,17)); + setScriptCallOnMousePressed(3002, 1, "i", new WidgetPointer(907,29)); + setScriptCallOnMousePressed(3002, 0, "i", new WidgetPointer(907,41)); + } + return; +} diff --git a/dumps/scripts/3006.cs2 b/dumps/scripts/3006.cs2 new file mode 100644 index 000000000..0e0067bd9 --- /dev/null +++ b/dumps/scripts/3006.cs2 @@ -0,0 +1,30 @@ +void script_3006(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + setWidgetSize(0, 88, 1, 0, new WidgetPointer(arg1)); + if (getWidgetSpriteId(new WidgetPointer(arg5)) == 2669) { + script_3007(arg1, arg2, arg3, arg4, arg5, arg6, arg7); + } else { + script_3009(arg1, arg2, arg3, arg4, arg5, arg6, arg7); + } + switch (arg0) { + case 0: + setWidgetPosition(0, 88, 0, 0, new WidgetPointer(907,4)); + setWidgetPosition(0, add(88, 30), 0, 0, new WidgetPointer(907,5)); + setWidgetPosition(0, add(88, multiply(30, 2)), 0, 0, new WidgetPointer(907,43)); + break; + case 1: + setWidgetPosition(0, 30, 0, 0, new WidgetPointer(907,4)); + setWidgetPosition(0, add(88, 30), 0, 0, new WidgetPointer(907,5)); + setWidgetPosition(0, add(88, multiply(30, 2)), 0, 0, new WidgetPointer(907,43)); + break; + case 2: + setWidgetPosition(0, 30, 0, 0, new WidgetPointer(907,4)); + setWidgetPosition(0, multiply(30, 2), 0, 0, new WidgetPointer(907,5)); + setWidgetPosition(0, add(88, multiply(30, 2)), 0, 0, new WidgetPointer(907,43)); + break; + case 3: + setWidgetPosition(0, 30, 0, 0, new WidgetPointer(907,4)); + setWidgetPosition(0, multiply(30, 2), 0, 0, new WidgetPointer(907,5)); + setWidgetPosition(0, multiply(30, 3), 0, 0, new WidgetPointer(907,43)); + } + return; +} diff --git a/dumps/scripts/3007.cs2 b/dumps/scripts/3007.cs2 new file mode 100644 index 000000000..6001d4bb6 --- /dev/null +++ b/dumps/scripts/3007.cs2 @@ -0,0 +1,14 @@ +void script_3007(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + setWidgetSize(13, 88, 0, 0, new WidgetPointer(arg1)); + setWidgetSprite(4681, new WidgetPointer(arg1)); + setWidgetSize(26, 88, 1, 0, new WidgetPointer(arg2)); + setWidgetSprite(4682, new WidgetPointer(arg2)); + setWidgetSize(13, 88, 0, 0, new WidgetPointer(arg3)); + setWidgetSprite(4684, new WidgetPointer(arg3)); + setWidgetSprite(2670, new WidgetPointer(arg5)); + setWidgetSize(13, 88, 0, 0, new WidgetPointer(arg6)); + setWidgetSprite(4683, new WidgetPointer(arg6)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3008.cs2 b/dumps/scripts/3008.cs2 new file mode 100644 index 000000000..bcd88f5f8 --- /dev/null +++ b/dumps/scripts/3008.cs2 @@ -0,0 +1,26 @@ +void script_3008(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + ivar7 = 4677; + ivar8 = 4678; + ivar9 = 4679; + ivar10 = 4680; + setWidgetSize(13, 30, 0, 0, new WidgetPointer(arg1)); + setWidgetSprite(ivar7, new WidgetPointer(arg1)); + setWidgetSize(26, 30, 1, 0, new WidgetPointer(arg2)); + setWidgetSprite(ivar8, new WidgetPointer(arg2)); + setWidgetSize(13, 30, 0, 0, new WidgetPointer(arg3)); + setWidgetSprite(ivar10, new WidgetPointer(arg3)); + setWidgetSprite(2670, new WidgetPointer(arg5)); + setWidgetSize(13, 30, 0, 0, new WidgetPointer(arg6)); + setWidgetSprite(ivar9, new WidgetPointer(arg6)); + setScriptCallOnMouseExit(4164, new WidgetPointer(arg1), ivar7, new WidgetPointer(arg2), ivar8, new WidgetPointer(arg6), ivar9, new WidgetPointer(arg3), ivar10, "IdIdIdId", new WidgetPointer(arg0)); + ivar7 = 4673; + ivar8 = 4674; + ivar9 = 4675; + ivar10 = 4676; + setScriptCallOnMouseEntered(4164, new WidgetPointer(arg1), ivar7, new WidgetPointer(arg2), ivar8, new WidgetPointer(arg6), ivar9, new WidgetPointer(arg3), ivar10, "IdIdIdId", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3009.cs2 b/dumps/scripts/3009.cs2 new file mode 100644 index 000000000..73fa4ac26 --- /dev/null +++ b/dumps/scripts/3009.cs2 @@ -0,0 +1,14 @@ +void script_3009(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + setWidgetSize(13, 88, 0, 0, new WidgetPointer(arg1)); + setWidgetSprite(4681, new WidgetPointer(arg1)); + setWidgetSize(26, 88, 1, 0, new WidgetPointer(arg2)); + setWidgetSprite(4682, new WidgetPointer(arg2)); + setWidgetSize(13, 88, 0, 0, new WidgetPointer(arg3)); + setWidgetSprite(4684, new WidgetPointer(arg3)); + setWidgetSprite(2673, new WidgetPointer(arg5)); + setWidgetSize(13, 88, 0, 0, new WidgetPointer(arg6)); + setWidgetSprite(4683, new WidgetPointer(arg6)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/301.cs2 b/dumps/scripts/301.cs2 new file mode 100644 index 000000000..7e5ab9dbb --- /dev/null +++ b/dumps/scripts/301.cs2 @@ -0,0 +1,18 @@ +void script_301(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetRGB(new Color(arg5)); + } + if ((arg3 != -1) && setWidgetRegister(new WidgetPointer(arg1), arg3)) { + setWidgetRGB(new Color(arg5)); + } + if (((boolean)arg0)) { + if (setWidgetRegister(new WidgetPointer(arg1), arg4)) { + setWidgetHidden(0); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg1), arg4)) { + setWidgetHidden(1); + } + } + return; +} diff --git a/dumps/scripts/3010.cs2 b/dumps/scripts/3010.cs2 new file mode 100644 index 000000000..2c9369f3e --- /dev/null +++ b/dumps/scripts/3010.cs2 @@ -0,0 +1,26 @@ +void script_3010(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + ivar7 = 4677; + ivar8 = 4678; + ivar9 = 4679; + ivar10 = 4680; + setWidgetSize(13, 30, 0, 0, new WidgetPointer(arg1)); + setWidgetSprite(ivar7, new WidgetPointer(arg1)); + setWidgetSize(26, 30, 1, 0, new WidgetPointer(arg2)); + setWidgetSprite(ivar8, new WidgetPointer(arg2)); + setWidgetSize(13, 30, 0, 0, new WidgetPointer(arg3)); + setWidgetSprite(ivar10, new WidgetPointer(arg3)); + setWidgetSprite(2673, new WidgetPointer(arg5)); + setWidgetSize(13, 30, 0, 0, new WidgetPointer(arg6)); + setWidgetSprite(4679, new WidgetPointer(arg6)); + setScriptCallOnMouseExit(4164, new WidgetPointer(arg1), ivar7, new WidgetPointer(arg2), ivar8, new WidgetPointer(arg6), ivar9, new WidgetPointer(arg3), ivar10, "IdIdIdId", new WidgetPointer(arg0)); + ivar7 = 4673; + ivar8 = 4674; + ivar9 = 4675; + ivar10 = 4676; + setScriptCallOnMouseEntered(4164, new WidgetPointer(arg1), ivar7, new WidgetPointer(arg2), ivar8, new WidgetPointer(arg6), ivar9, new WidgetPointer(arg3), ivar10, "IdIdIdId", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3011.cs2 b/dumps/scripts/3011.cs2 new file mode 100644 index 000000000..b7bcd4ff8 --- /dev/null +++ b/dumps/scripts/3011.cs2 @@ -0,0 +1,13 @@ +cs2func_script_3011_struct(7,0,0) script_3011(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_3011_struct(script_3012(arg0), 59441182, 59441183, 59441185, script_3013(arg0), 59441187, 59441184); + case 1: + return newstruct cs2func_script_3011_struct(script_3012(arg0), 59441170, 59441171, 59441173, script_3013(arg0), 59441175, 59441172); + case 2: + return newstruct cs2func_script_3011_struct(script_3012(arg0), 59441158, 59441159, 59441161, script_3013(arg0), 59441163, 59441160); + case 3: + return newstruct cs2func_script_3011_struct(script_3012(arg0), 59441196, 59441197, 59441199, script_3013(arg0), 59441201, 59441198); + } + return newstruct cs2func_script_3011_struct(-1, -1, -1, -1, -1, -1, -1); +} diff --git a/dumps/scripts/3012.cs2 b/dumps/scripts/3012.cs2 new file mode 100644 index 000000000..f366d5d18 --- /dev/null +++ b/dumps/scripts/3012.cs2 @@ -0,0 +1,13 @@ +int script_3012(int arg0) { + switch (arg0) { + case 0: + return 59441155; + case 1: + return 59441156; + case 2: + return 59441157; + case 3: + return 59441195; + } + return -1; +} diff --git a/dumps/scripts/3013.cs2 b/dumps/scripts/3013.cs2 new file mode 100644 index 000000000..721660835 --- /dev/null +++ b/dumps/scripts/3013.cs2 @@ -0,0 +1,13 @@ +int script_3013(int arg0) { + switch (arg0) { + case 0: + return 59441186; + case 1: + return 59441174; + case 2: + return 59441162; + case 3: + return 59441200; + } + return -1; +} diff --git a/dumps/scripts/3014.cs2 b/dumps/scripts/3014.cs2 new file mode 100644 index 000000000..3f378924b --- /dev/null +++ b/dumps/scripts/3014.cs2 @@ -0,0 +1,50 @@ +void script_3014() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + flow_0: + ivar0 = 0; + ivar1 = 0; + ivar2 = ((int)isSiteSettingsMembers()); + ivar3 = rndExcl(100); + setWidgetIsHidden(true, new WidgetPointer(908,15)); + setWidgetIsHidden(false, new WidgetPointer(908,30)); + setWidgetText(new WidgetPointer(908,33), "Invite your friends to the world of RuneScape and receive a 7 day 10% XP boost."); + setWidgetText(new WidgetPointer(908,32), "Invite your friends to the world of RuneScape and receive a 7 day 10% XP boost."); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(908,33)); + setWidgetPosition(8, 50, 0, 0, new WidgetPointer(908,33)); + setWidgetSize(363, 73, 0, 0, new WidgetPointer(908,33)); + setWidgetFont(591, new WidgetPointer(908,33)); + setWidgetTextAlignment(1, 2, 0, new WidgetPointer(908,33)); + setWidgetRGB(new Color(28, 28, 28), new WidgetPointer(908,32)); + setWidgetPosition(9, 51, 0, 0, new WidgetPointer(908,32)); + setWidgetSize(363, 73, 0, 0, new WidgetPointer(908,32)); + setWidgetFont(591, new WidgetPointer(908,32)); + setWidgetTextAlignment(1, 2, 0, new WidgetPointer(908,32)); + setWidgetSprite(7670, new WidgetPointer(908,31)); + setWidgetSprite(7662, new WidgetPointer(908,35)); + SWITCH (getLanguage()) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + } + setWidgetSprite(7662, new WidgetPointer(908,35)); + GOTO flow_4 + flow_1: + setWidgetSprite(7664, new WidgetPointer(908,35)); + GOTO flow_4 + flow_2: + setWidgetSprite(7663, new WidgetPointer(908,35)); + GOTO flow_4 + flow_3: + setWidgetSprite(7665, new WidgetPointer(908,35)); + flow_4: + setScriptCallOnMouseEntered(4924, "", new WidgetPointer(908,30)); + setScriptCallOnMouseExit(5003, "", new WidgetPointer(908,30)); + setScriptCallOnMousePressed(5208, "", new WidgetPointer(908,30)); + return; +} diff --git a/dumps/scripts/3015.cs2 b/dumps/scripts/3015.cs2 new file mode 100644 index 000000000..ac669b1c2 --- /dev/null +++ b/dumps/scripts/3015.cs2 @@ -0,0 +1,4 @@ +void script_3015(int arg0,string arg1,string arg2,string arg3,string arg4) { + script_2190(1, arg0, 1, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/3016.cs2 b/dumps/scripts/3016.cs2 new file mode 100644 index 000000000..a0b633b15 --- /dev/null +++ b/dumps/scripts/3016.cs2 @@ -0,0 +1,4 @@ +void script_3016() { + script_3017(); + return; +} diff --git a/dumps/scripts/3017.cs2 b/dumps/scripts/3017.cs2 new file mode 100644 index 000000000..028509a93 --- /dev/null +++ b/dumps/scripts/3017.cs2 @@ -0,0 +1,12 @@ +void script_3017() { + script_3018(); + setWidgetIsHidden(true, new WidgetPointer(906,41)); + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + script_3161(1); + } else { + if (isWidgetHidden(cs2method_3408(105, 73, 941, 3))) { + script_4556(1); + } + } + return; +} diff --git a/dumps/scripts/3018.cs2 b/dumps/scripts/3018.cs2 new file mode 100644 index 000000000..a28ea5c03 --- /dev/null +++ b/dumps/scripts/3018.cs2 @@ -0,0 +1,21 @@ +void script_3018() { + setWidgetText(new WidgetPointer(906,149), ""); + setWidgetText(new WidgetPointer(906,151), ""); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(906,151)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(906,155)); + setWidgetText(new WidgetPointer(906,159), "Ok"); + setWidgetContextMenuOption(1, new WidgetPointer(906,159), "Ok"); + setWidgetText(new WidgetPointer(906,161), "Close"); + setWidgetContextMenuOption(1, new WidgetPointer(906,161), "Close"); + setWidgetSize(265, 136, 0, 0, new WidgetPointer(906,147)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(906,151)); + setWidgetSize(8034, 0, 2, 1, new WidgetPointer(906,155)); + setWidgetSize(8034, 0, 2, 1, new WidgetPointer(906,159)); + setWidgetSize(8034, 0, 2, 1, new WidgetPointer(906,160)); + setWidgetSize(8034, 0, 2, 1, new WidgetPointer(906,161)); + setWidgetIsHidden(false, new WidgetPointer(906,160)); + setWidgetIsHidden(false, new WidgetPointer(906,161)); + globalstring_277 = ""; + globalint_1650 = 0; + return; +} diff --git a/dumps/scripts/3019.cs2 b/dumps/scripts/3019.cs2 new file mode 100644 index 000000000..903bad901 --- /dev/null +++ b/dumps/scripts/3019.cs2 @@ -0,0 +1,4 @@ +void script_3019(int arg0,string arg1) { + script_3020(arg0, arg1); + return; +} diff --git a/dumps/scripts/302.cs2 b/dumps/scripts/302.cs2 new file mode 100644 index 000000000..e6257099f --- /dev/null +++ b/dumps/scripts/302.cs2 @@ -0,0 +1,6 @@ +void script_302(int arg0,int arg1,int arg2) { + if (((boolean)arg0) && (arg1 != -1)) { + script_303(arg1, arg2); + } + return; +} diff --git a/dumps/scripts/3020.cs2 b/dumps/scripts/3020.cs2 new file mode 100644 index 000000000..9ab7fb1cc --- /dev/null +++ b/dumps/scripts/3020.cs2 @@ -0,0 +1,100 @@ +void script_3020(int arg0,string arg1) { + int ivar1; + int ivar2; + int ivar3; + string svar1; + string svar2; + string svar3; + string svar4; + ivar1 = 0; + svar1 = ""; + svar2 = ""; + ivar2 = -1; + svar3 = ""; + svar4 = ""; + ivar3 = -1; + if (strLength(globalstring_277) > 0) { + switch (arg0) { + case 0: + if ((strLength(globalstring_277) > 0) && (strLength(arg1) > 0)) { + if (cs2method5005() == 2) { + script_3047(1); + } + cs2method5009(strRemoveEntities(arg1), globalstring_277); + } + break; + case 1: + if (getFriendlistSize() < 0) { + messageType0("Unable to update Friends List - system busy."); + } else { + if (strLength(globalstring_277) > 0) { + cs2method3605(globalstring_277); + } + } + break; + case 2: + if (getIgnoreCount() < 0) { + messageType0("Unable to update Ignore List - system busy."); + } else { + if (strLength(globalstring_277) > 0) { + cs2method3607(globalstring_277); + } + } + break; + case 3: + if (getFriendlistSize() < 0) { + messageType0("Unable to update Friends List - system busy."); + } else { + if (strLength(globalstring_277) > 0) { + cs2method3606(globalstring_277); + } + } + break; + case 4: + if (getIgnoreCount() < 0) { + messageType0("Unable to update Ignore List - system busy."); + } else { + if (strLength(globalstring_277) > 0) { + cs2method3608(globalstring_277); + } + } + break; + case 5: + if ((cs2method3612() <= 0) && (strLength(globalstring_277) > 0)) { + sendUnknownFriendPacketMethod3619(globalstring_277); + } + break; + case 6: + globalint_1094 = 0; + cs2method5400(0, "bugtracker_v4", "index.html"); + break; + case 7: + if (strLength(globalstring_277) > 0) { + script_4465(globalstring_277); + } + break; + case 9: + if ((cs2method3612() > 0) && (strLength(globalstring_277) > 0)) { + script_1633(globalstring_277); + } + break; + case 10: + cancelLogin(); + globalint_1100 = -1; + break; + case 12: + script_3017(); + cancelLogin(); + globalint_1100 = -1; + script_4701(1, globalint_1553, globalint_1554, globalstring_128); + return; + } + } + globalint_1650 = 0; + if (((boolean)ivar1)) { + script_3015(ivar2, svar1, svar2, svar3, svar4); + } else { + script_3017(); + } + return; +} diff --git a/dumps/scripts/3021.cs2 b/dumps/scripts/3021.cs2 new file mode 100644 index 000000000..d0946a437 --- /dev/null +++ b/dumps/scripts/3021.cs2 @@ -0,0 +1,4 @@ +void script_3021() { + script_2276(globalint_1199, globalint_1212, 61145359); + return; +} diff --git a/dumps/scripts/3022.cs2 b/dumps/scripts/3022.cs2 new file mode 100644 index 000000000..1be7ed93c --- /dev/null +++ b/dumps/scripts/3022.cs2 @@ -0,0 +1,45 @@ +void script_3022(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_802_struct(1,1,0) structdump_5; + switch (arg0) { + case 84: + script_3020(arg4, arg5); + return; + case 13: + script_3017(); + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + if ((arg4 != -1) && (arg4 != 6)) { + globalint_1097 = script_1553(arg0, globalint_1097, globalstring_277); + script_1875(59375767, 59375768, globalstring_277); + } + return; + case 85: + case 101: + case -1: + if (((arg4 != -1) && (arg4 != 6)) && ((isValidChar(((char)arg1)) || (arg0 == 85)) || (arg0 == 101))) { + stack_dump0 = globalint_1097; + stack_dump1 = arg3; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_277; + structdump_5 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_5.stringpart_0; + globalint_1097 = structdump_5.intpart_0; + globalstring_277 = stack_dump4; + setWidgetText(new WidgetPointer(arg2), replaceLtGt(globalstring_277)); + script_1875(59375767, 59375768, globalstring_277); + } + return; + } + return; +} diff --git a/dumps/scripts/3023.cs2 b/dumps/scripts/3023.cs2 new file mode 100644 index 000000000..778c86b5c --- /dev/null +++ b/dumps/scripts/3023.cs2 @@ -0,0 +1,22 @@ +void script_3023() { + setWidgetSize(subtract(getWidgetActualX(new WidgetPointer(909,31)), getWidgetActualX(new WidgetPointer(909,30))), 0, 0, 1, new WidgetPointer(909,45)); + setWidgetSize(subtract(subtract(getWidgetActualWidth(new WidgetPointer(909,41)), getWidgetActualWidth(new WidgetPointer(909,45))), 2), 0, 0, 1, new WidgetPointer(909,46)); + setWidgetScrollMax(0, 0, new WidgetPointer(909,41)); + cs2method2100(0, 0, new WidgetPointer(909,41)); + script_31(59572271, 59572265, 792, 789, 790, 791, 773, 788); + setWidgetScrollMax(0, 0, new WidgetPointer(909,78)); + cs2method2100(0, 0, new WidgetPointer(909,78)); + script_31(59572303, 59572302, 792, 789, 790, 791, 773, 788); + setWidgetScrollMax(0, 0, new WidgetPointer(909,52)); + cs2method2100(0, 0, new WidgetPointer(909,52)); + script_31(59572277, 59572276, 792, 789, 790, 791, 773, 788); + globalint_1122 = getWidgetActualHeight(new WidgetPointer(909,52)); + script_3029(59572269, 59572268, 59572270, 59572266, 59572265, 59572271); + setScriptCallOnFriendListChange(3028, new WidgetPointer(909,45), new WidgetPointer(909,44), new WidgetPointer(909,46), new WidgetPointer(909,42), new WidgetPointer(909,41), new WidgetPointer(909,47), "IIIIII", new WidgetPointer(909,41)); + script_3041(59572311, 59572310, 59572308, 59572302, 59572303); + setScriptCallOnFriendListChange(3040, new WidgetPointer(909,87), new WidgetPointer(909,86), new WidgetPointer(909,84), new WidgetPointer(909,78), new WidgetPointer(909,79), "IIIII", new WidgetPointer(909,78)); + script_3024(59572280); + globalstring_276 = ""; + script_3401(); + return; +} diff --git a/dumps/scripts/3024.cs2 b/dumps/scripts/3024.cs2 new file mode 100644 index 000000000..b6f7a10c2 --- /dev/null +++ b/dumps/scripts/3024.cs2 @@ -0,0 +1,4 @@ +void script_3024(int arg0) { + setWidgetRGB(new Color(41, 32, 22), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3025.cs2 b/dumps/scripts/3025.cs2 new file mode 100644 index 000000000..6d0b66fc6 --- /dev/null +++ b/dumps/scripts/3025.cs2 @@ -0,0 +1,4 @@ +void script_3025(int arg0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3026.cs2 b/dumps/scripts/3026.cs2 new file mode 100644 index 000000000..1fb6d9ccf --- /dev/null +++ b/dumps/scripts/3026.cs2 @@ -0,0 +1,4 @@ +void script_3026(int arg0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3027.cs2 b/dumps/scripts/3027.cs2 new file mode 100644 index 000000000..0440edc0e --- /dev/null +++ b/dumps/scripts/3027.cs2 @@ -0,0 +1,4 @@ +void script_3027(int arg0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3028.cs2 b/dumps/scripts/3028.cs2 new file mode 100644 index 000000000..be5e7d898 --- /dev/null +++ b/dumps/scripts/3028.cs2 @@ -0,0 +1,4 @@ +void script_3028(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_3029(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/3029.cs2 b/dumps/scripts/3029.cs2 new file mode 100644 index 000000000..00564faec --- /dev/null +++ b/dumps/scripts/3029.cs2 @@ -0,0 +1,150 @@ +void script_3029(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + string svar0; + string svar1; + string svar2; + string svar3; + int stack_dump0; + previousAndCurrentName(0,2,0) structdump_1; + if (cs2method5428(arg3, -1)) { + setScriptCallOnGameloop(3028, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "IIIIII", new WidgetPointer(arg4)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg4)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + ivar6 = getFriendlistSize(); + ivar7 = 0; + ivar8 = 0; + svar0 = ""; + svar1 = ""; + svar2 = ""; + ivar9 = 0; + ivar10 = 0; + ivar11 = 15; + ivar12 = 0; + ivar13 = 5; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + svar3 = ""; + if (ivar6 == -2) { + setWidgetText(new WidgetPointer(909,38), "Name"); + script_3038(arg3, "Loading Friends List." + "
" + "
" + "Please wait."); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(909,31)), getWidgetActualHeight(new WidgetPointer(909,36)), 0, 0, new WidgetPointer(909,31)); + } else if (ivar6 == -1) { + setWidgetText(new WidgetPointer(909,38), "Name"); + script_3038(arg3, "Connecting to server." + "
" + "
" + "Please wait."); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(909,31)), getWidgetActualHeight(new WidgetPointer(909,36)), 0, 0, new WidgetPointer(909,31)); + } else if (ivar6 > 0) { + setWidgetText(new WidgetPointer(909,38), "Name (" + intToStr(ivar6) + "/200)"); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(909,31)), 4, 0, 1, new WidgetPointer(909,31)); + while (ivar7 < ivar6) { + stack_dump0 = ivar7; + structdump_1 = getFriendName(stack_dump0); + svar1 = structdump_1.stringpart_1; + svar0 = structdump_1.stringpart_0; + ivar9 = getFriendWorld(ivar7); + script_2996(arg3, ivar7, getWidgetActualWidth(new WidgetPointer(arg3)), ivar11, 0, ivar8, 0, 1, 0); + if (((boolean)mod(ivar7, 2))) { + setWidgetRGB(new Color(32, 25, 17)); + } else { + setWidgetRGB(new Color(41, 32, 22)); + } + setScriptCallOnMouseEntered(3030, new WidgetPointer(arg3), ivar7, "Ii"); + setScriptCallOnMouseExit(3035, ""); + if (strLength(svar1) > 0) { + ivar16 = add(getTextWidth(494, "Last known as: " + svar1), 8); + if (ivar16 > getWidgetActualWidth(new WidgetPointer(909,19))) { + svar3 = "Last known as:" + "
" + svar1; + } else { + svar3 = "Last known as: " + svar1; + } + setScriptCallOnMouseOver(2467, new WidgetPointer(-32768,3), -2147483643, svar3, -2147483647, -2147483646, new WidgetPointer(909,41), new WidgetPointer(909,32), new WidgetPointer(909,35), 494, "IisiiIIIf"); + } + cs2method1305(svar0); + if (ivar9 > 0) { + setWidgetContextMenuOption(1, "Message"); + setWidgetContextMenuOption(2, "Join"); + } else { + setWidgetContextMenuOption(3, "Message"); + setWidgetContextMenuOption(4, "Join"); + } + setWidgetContextMenuOption(10, "Delete"); + setScriptCallOnClickContextMenu(3039, -2147483644, ivar9, svar0, ivar7, "iisi"); + script_2994(arg1, ivar7, 14, 14, 5, add(ivar8, 1), -1, 0, 0, 0, 0); + if (stringMethod4107(svar1, "") != 0) { + setWidgetSprite(2313); + ivar13 = 20; + } else { + setWidgetSprite(-1); + ivar13 = 5; + } + svar2 = svar0; + script_2995(arg0, ivar7, 0, ivar11, ivar13, ivar8, 16777215, 494, 0, 1, 0, 1, svar2); + setWidgetSize(ivar13, ivar11, 1, 0); + cs2method1126(1); + if (((boolean)ivar9)) { + svar2 = "Offline"; + ivar14 = 16711680; + } else if (ivar9 == getWorldId()) { + ivar14 = 65280; + } else { + ivar14 = 16776960; + } + svar2 = cs2method3610(ivar7); + script_2995(arg2, ivar7, 0, ivar11, 5, ivar8, ivar14, 494, 0, 1, 0, 1, svar2); + setWidgetSize(5, ivar11, 1, 0); + cs2method1126(1); + ivar8 = add(ivar8, ivar11); + ivar7 = add(ivar7, 1); + } + ivar10 = add(divide(getWidgetActualHeight(new WidgetPointer(arg4)), ivar11), 1); + if (ivar10 > ivar6) { + while (ivar7 < ivar10) { + script_2996(arg3, ivar7, getWidgetActualWidth(new WidgetPointer(arg3)), ivar11, 0, ivar8, 0, 1, 0); + if (((boolean)mod(ivar7, 2))) { + setWidgetRGB(new Color(32, 25, 17)); + } else { + setWidgetRGB(new Color(41, 32, 22)); + } + ivar8 = add(ivar8, ivar11); + ivar7 = add(ivar7, 1); + } + ivar12 = getWidgetActualHeight(new WidgetPointer(arg4)); + } else { + ivar12 = ivar8; + } + if (ivar10 <= ivar6) { + ivar15 = cs2method2601(new WidgetPointer(909,41)); + setWidgetScrollMax(0, ivar12, new WidgetPointer(909,41)); + if (ivar15 > ivar12) { + ivar15 = ivar12; + } + script_72(59572271, 59572265, ivar15); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(909,41)); + cs2method2100(0, 0, new WidgetPointer(909,41)); + script_72(59572271, 59572265, 0); + } + } else { + if (((boolean)ivar6)) { + setWidgetText(new WidgetPointer(909,38), "Name"); + script_3038(arg3, "You have not added any friends to your list."); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(909,31)), getWidgetActualHeight(new WidgetPointer(909,36)), 0, 0, new WidgetPointer(909,31)); + } + } + return; +} diff --git a/dumps/scripts/303.cs2 b/dumps/scripts/303.cs2 new file mode 100644 index 000000000..3ce40fb74 --- /dev/null +++ b/dumps/scripts/303.cs2 @@ -0,0 +1,9 @@ +void script_303(int arg0,int arg1) { + playSoundEffect(2266, 1, 0); + if (((boolean)arg1)) { + cs2method5214(arg0); + } else { + cs2method5221(arg0); + } + return; +} diff --git a/dumps/scripts/3030.cs2 b/dumps/scripts/3030.cs2 new file mode 100644 index 000000000..5c3592090 --- /dev/null +++ b/dumps/scripts/3030.cs2 @@ -0,0 +1,4 @@ +void script_3030(int arg0,int arg1) { + script_3032(arg0, arg1, 1); + return; +} diff --git a/dumps/scripts/3031.cs2 b/dumps/scripts/3031.cs2 new file mode 100644 index 000000000..fbba3744f --- /dev/null +++ b/dumps/scripts/3031.cs2 @@ -0,0 +1,4 @@ +void script_3031(int arg0,int arg1) { + script_3032(arg0, arg1, 0); + return; +} diff --git a/dumps/scripts/3032.cs2 b/dumps/scripts/3032.cs2 new file mode 100644 index 000000000..c8ab1066b --- /dev/null +++ b/dumps/scripts/3032.cs2 @@ -0,0 +1,21 @@ +void script_3032(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = -1; + if (((boolean)arg2)) { + ivar3 = 59572267; + } else { + if (((boolean)arg2)) { + ivar3 = 59572309; + } + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetIsHidden(false, new WidgetPointer(ivar3)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar3)), getWidgetActualY(), 0, 0, new WidgetPointer(ivar3)); + } + if (((boolean)arg2)) { + script_2470(59572256, 59572259); + } else { + script_2470(59572304, 59572307); + } + return; +} diff --git a/dumps/scripts/3033.cs2 b/dumps/scripts/3033.cs2 new file mode 100644 index 000000000..76933dc87 --- /dev/null +++ b/dumps/scripts/3033.cs2 @@ -0,0 +1,4 @@ +void script_3033() { + script_2276(globalint_1199, globalint_1213, 61145360); + return; +} diff --git a/dumps/scripts/3034.cs2 b/dumps/scripts/3034.cs2 new file mode 100644 index 000000000..0b76075a5 --- /dev/null +++ b/dumps/scripts/3034.cs2 @@ -0,0 +1,4 @@ +void script_3034() { + script_2276(globalint_1199, globalint_1214, 61145361); + return; +} diff --git a/dumps/scripts/3035.cs2 b/dumps/scripts/3035.cs2 new file mode 100644 index 000000000..975ceaf17 --- /dev/null +++ b/dumps/scripts/3035.cs2 @@ -0,0 +1,5 @@ +void script_3035() { + setWidgetIsHidden(true, new WidgetPointer(909,43)); + script_2470(59572256, 59572259); + return; +} diff --git a/dumps/scripts/3036.cs2 b/dumps/scripts/3036.cs2 new file mode 100644 index 000000000..9880aee58 --- /dev/null +++ b/dumps/scripts/3036.cs2 @@ -0,0 +1,4 @@ +void script_3036() { + script_3037(); + return; +} diff --git a/dumps/scripts/3037.cs2 b/dumps/scripts/3037.cs2 new file mode 100644 index 000000000..66e3ed7ed --- /dev/null +++ b/dumps/scripts/3037.cs2 @@ -0,0 +1,5 @@ +void script_3037() { + setWidgetIsHidden(true, new WidgetPointer(909,85)); + script_2470(59572304, 59572307); + return; +} diff --git a/dumps/scripts/3038.cs2 b/dumps/scripts/3038.cs2 new file mode 100644 index 000000000..7cf17ac4f --- /dev/null +++ b/dumps/scripts/3038.cs2 @@ -0,0 +1,5 @@ +void script_3038(int arg0,string arg1) { + script_2995(arg0, 0, 0, 0, 0, 0, 16777215, 494, 1, 1, 0, 1, arg1); + setWidgetSize(0, 0, 1, 1); + return; +} diff --git a/dumps/scripts/3039.cs2 b/dumps/scripts/3039.cs2 new file mode 100644 index 000000000..002ce189d --- /dev/null +++ b/dumps/scripts/3039.cs2 @@ -0,0 +1,21 @@ +void script_3039(int arg0,int arg1,int arg2,string arg3) { + switch (arg0) { + case 1: + if (cs2method6900()) { + script_3015(0, "Send message to " + arg3, "", arg3, ""); + } else { + messageType0("Users restricted to quick-chat cannot send messages from the Lobby."); + } + break; + case 2: + script_1182(arg1); + break; + case 3: + case 4: + messageType0("That player is currently offline."); + break; + case 10: + cs2method3606(strRemoveEntities(arg3)); + } + return; +} diff --git a/dumps/scripts/304.cs2 b/dumps/scripts/304.cs2 new file mode 100644 index 000000000..2057fa124 --- /dev/null +++ b/dumps/scripts/304.cs2 @@ -0,0 +1,23 @@ +void script_304(int arg0) { + int ivar1; + if (arg0 == -1) { + return; + } + playSoundEffect(2266, 1, 0); + ivar1 = getDungeonmap(arg0); + ivar1 = script_2785(ivar1); + if (ivar1 == -1) { + return; + } + script_2046(49479709); + globalstring_31 = ""; + script_308(49479705); + setWidgetText(new WidgetPointer(755,20), cs2method5207(ivar1)); + script_41(49479737); + cs2method5227(ivar1, arg0); + cs2method5214(arg0); + globalint_172 = cs2method5218(ivar1); + script_1372(); + script_307(); + return; +} diff --git a/dumps/scripts/3040.cs2 b/dumps/scripts/3040.cs2 new file mode 100644 index 000000000..15acfb999 --- /dev/null +++ b/dumps/scripts/3040.cs2 @@ -0,0 +1,4 @@ +void script_3040(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_3041(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/3041.cs2 b/dumps/scripts/3041.cs2 new file mode 100644 index 000000000..4f27cc284 --- /dev/null +++ b/dumps/scripts/3041.cs2 @@ -0,0 +1,125 @@ +void script_3041(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + string svar0; + string svar1; + string svar2; + string svar3; + int stack_dump0; + opcStruct3622(0,2,0) structdump_1; + if (cs2method5428(arg2, -1)) { + setScriptCallOnGameloop(3040, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), "IIIII", new WidgetPointer(arg3)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg3)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + ivar5 = getIgnoreCount(); + ivar6 = 0; + ivar7 = 0; + svar0 = ""; + svar1 = ""; + svar2 = ""; + ivar8 = 0; + ivar9 = 0; + ivar10 = 15; + ivar11 = 0; + ivar12 = 5; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + svar3 = ""; + if (ivar5 == -2) { + setWidgetText(new WidgetPointer(909,89), "Name"); + script_3038(arg2, "Loading Ignore List." + "
" + "
" + "Please wait."); + } else if (ivar5 == -1) { + setWidgetText(new WidgetPointer(909,89), "Name"); + script_3038(arg2, "Connecting to server." + "
" + "
" + "Please wait."); + } else if (ivar5 > 0) { + setWidgetText(new WidgetPointer(909,89), "Name (" + intToStr(ivar5) + "/100)"); + while (ivar6 < ivar5) { + stack_dump0 = ivar6; + structdump_1 = cs2method3622(stack_dump0); + svar1 = structdump_1.stringpart_1; + svar0 = structdump_1.stringpart_0; + script_2996(arg2, ivar6, getWidgetActualWidth(new WidgetPointer(arg2)), ivar10, 0, ivar7, 0, 1, 0); + if (((boolean)mod(ivar6, 2))) { + setWidgetRGB(new Color(32, 25, 17)); + } else { + setWidgetRGB(new Color(41, 32, 22)); + } + setScriptCallOnMouseEntered(3031, new WidgetPointer(arg2), ivar6, "Ii"); + setScriptCallOnMouseExit(3036, ""); + if (strLength(svar1) > 0) { + ivar15 = add(getTextWidth(494, "Last known as: " + svar1), 8); + if (ivar15 > getWidgetActualWidth(new WidgetPointer(909,76))) { + svar3 = "Last known as:" + "
" + svar1; + } else { + svar3 = "Last known as: " + svar1; + } + setScriptCallOnMouseOver(2467, new WidgetPointer(-32768,3), -2147483643, svar3, -2147483647, -2147483646, new WidgetPointer(909,78), new WidgetPointer(909,80), new WidgetPointer(909,83), 494, "IisiiIIIf"); + } + cs2method1305(svar0); + setWidgetContextMenuOption(1, "Delete"); + setScriptCallOnClickContextMenu(3042, -2147483644, svar0, "is"); + script_2994(arg1, ivar6, 14, 14, 5, add(ivar7, 1), -1, 0, 0, 0, 0); + if (stringMethod4107(svar1, "") != 0) { + setWidgetSprite(2313); + ivar12 = 20; + } else { + setWidgetSprite(-1); + ivar12 = 5; + } + svar2 = svar0; + script_2995(arg0, ivar6, 0, ivar10, ivar12, ivar7, 16777215, 494, 0, 1, 0, 1, svar2); + setWidgetSize(ivar12, ivar10, 1, 0); + cs2method1126(1); + ivar7 = add(ivar7, ivar10); + ivar6 = add(ivar6, 1); + } + ivar9 = add(divide(getWidgetActualHeight(new WidgetPointer(arg3)), ivar10), 1); + if (ivar9 > ivar5) { + while (ivar6 < ivar9) { + script_2996(arg2, ivar6, getWidgetActualWidth(new WidgetPointer(arg2)), ivar10, 0, ivar7, 0, 1, 0); + if (((boolean)mod(ivar6, 2))) { + setWidgetRGB(new Color(32, 25, 17)); + } else { + setWidgetRGB(new Color(41, 32, 22)); + } + ivar7 = add(ivar7, ivar10); + ivar6 = add(ivar6, 1); + } + ivar11 = getWidgetActualHeight(new WidgetPointer(arg3)); + } else { + ivar11 = ivar7; + } + if (ivar9 <= ivar5) { + ivar14 = cs2method2601(new WidgetPointer(909,78)); + setWidgetScrollMax(0, ivar11, new WidgetPointer(909,78)); + if (ivar14 > ivar11) { + ivar14 = ivar11; + } + script_72(59572303, 59572302, ivar14); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(909,78)); + cs2method2100(0, 0, new WidgetPointer(909,78)); + script_72(59572303, 59572302, 0); + } + } else { + if (((boolean)ivar5)) { + setWidgetText(new WidgetPointer(909,89), "Name"); + script_3038(arg2, "You are not ignoring any players."); + } + } + return; +} diff --git a/dumps/scripts/3042.cs2 b/dumps/scripts/3042.cs2 new file mode 100644 index 000000000..5c4124cb0 --- /dev/null +++ b/dumps/scripts/3042.cs2 @@ -0,0 +1,7 @@ +void script_3042(int arg0,string arg1) { + if (((boolean)arg0)) { + cs2method3608(arg1); + script_3037(); + } + return; +} diff --git a/dumps/scripts/3043.cs2 b/dumps/scripts/3043.cs2 new file mode 100644 index 000000000..59ae116ce --- /dev/null +++ b/dumps/scripts/3043.cs2 @@ -0,0 +1,5 @@ +void script_3043(int arg0) { + setScriptCallOnGameloop(3044, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + script_3045(); + return; +} diff --git a/dumps/scripts/3044.cs2 b/dumps/scripts/3044.cs2 new file mode 100644 index 000000000..4347df881 --- /dev/null +++ b/dumps/scripts/3044.cs2 @@ -0,0 +1,8 @@ +void script_3044(int arg0) { + if (cs2method5005() == -1) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + script_3045(); + return; +} diff --git a/dumps/scripts/3045.cs2 b/dumps/scripts/3045.cs2 new file mode 100644 index 000000000..683ec879c --- /dev/null +++ b/dumps/scripts/3045.cs2 @@ -0,0 +1,13 @@ +void script_3045() { + switch (cs2method5005()) { + case 0: + setWidgetText(new WidgetPointer(909,66), "Everybody"); + break; + case 1: + setWidgetText(new WidgetPointer(909,66), "Friends"); + break; + case 2: + setWidgetText(new WidgetPointer(909,66), "Nobody"); + } + return; +} diff --git a/dumps/scripts/3046.cs2 b/dumps/scripts/3046.cs2 new file mode 100644 index 000000000..c2d58e7e2 --- /dev/null +++ b/dumps/scripts/3046.cs2 @@ -0,0 +1,17 @@ +void script_3046(int arg0) { + if (arg0 > 1) { + script_3047(subtract(arg0, 2)); + } else { + switch (cs2method5005()) { + case 0: + script_3047(1); + break; + case 1: + script_3047(2); + break; + case 2: + script_3047(0); + } + } + return; +} diff --git a/dumps/scripts/3047.cs2 b/dumps/scripts/3047.cs2 new file mode 100644 index 000000000..76b5a2f96 --- /dev/null +++ b/dumps/scripts/3047.cs2 @@ -0,0 +1,10 @@ +void script_3047(int arg0) { + switch (arg0) { + case 0: + case 1: + case 2: + cs2method5001(cs2method5000(), arg0, cs2method5016()); + } + script_3045(); + return; +} diff --git a/dumps/scripts/3048.cs2 b/dumps/scripts/3048.cs2 new file mode 100644 index 000000000..227f80e33 --- /dev/null +++ b/dumps/scripts/3048.cs2 @@ -0,0 +1,4 @@ +void script_3048() { + script_3015(1, "Add friend", "", "", ""); + return; +} diff --git a/dumps/scripts/3049.cs2 b/dumps/scripts/3049.cs2 new file mode 100644 index 000000000..08224b564 --- /dev/null +++ b/dumps/scripts/3049.cs2 @@ -0,0 +1,4 @@ +void script_3049() { + script_3015(3, "Remove friend", "", "", ""); + return; +} diff --git a/dumps/scripts/305.cs2 b/dumps/scripts/305.cs2 new file mode 100644 index 000000000..a89624dbb --- /dev/null +++ b/dumps/scripts/305.cs2 @@ -0,0 +1,9 @@ +void script_305(int arg0) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(755,14)); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(755,14)); + } + setScriptCallOnGameloop(306, getClientCycle(), new WidgetPointer(-32768,3), "iI", new WidgetPointer(755,14)); + return; +} diff --git a/dumps/scripts/3050.cs2 b/dumps/scripts/3050.cs2 new file mode 100644 index 000000000..82fdb0c61 --- /dev/null +++ b/dumps/scripts/3050.cs2 @@ -0,0 +1,4 @@ +void script_3050() { + script_3015(2, "Add ignore", "", "", ""); + return; +} diff --git a/dumps/scripts/3051.cs2 b/dumps/scripts/3051.cs2 new file mode 100644 index 000000000..353f772ad --- /dev/null +++ b/dumps/scripts/3051.cs2 @@ -0,0 +1,4 @@ +void script_3051() { + script_3015(4, "Remove ignore", "", "", ""); + return; +} diff --git a/dumps/scripts/3052.cs2 b/dumps/scripts/3052.cs2 new file mode 100644 index 000000000..54c096293 --- /dev/null +++ b/dumps/scripts/3052.cs2 @@ -0,0 +1,5 @@ +void script_3052(int arg0) { + setScriptCallOnFriendListChange(3053, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + script_3054(arg0); + return; +} diff --git a/dumps/scripts/3053.cs2 b/dumps/scripts/3053.cs2 new file mode 100644 index 000000000..3c9859112 --- /dev/null +++ b/dumps/scripts/3053.cs2 @@ -0,0 +1,4 @@ +void script_3053(int arg0) { + script_3054(arg0); + return; +} diff --git a/dumps/scripts/3054.cs2 b/dumps/scripts/3054.cs2 new file mode 100644 index 000000000..27e6859d0 --- /dev/null +++ b/dumps/scripts/3054.cs2 @@ -0,0 +1,95 @@ +void script_3054(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + string svar1; + string svar2; + if (cs2method5428(59572276, -1)) { + setScriptCallOnGameloop(3053, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; + } + deleteAllExtraChilds(new WidgetPointer(909,52)); + svar0 = ""; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + svar1 = ""; + svar2 = ""; + while (ivar2 < 100) { + ivar3 = cs2method5004(ivar2); + svar1 = cs2method5010(ivar2); + svar2 = cs2method5019(ivar2); + switch (ivar3) { + case 0: + case 4: + case 27: + case 26: + case 29: + case 28: + case 31: + case 30: + ivar1 = script_3055(ivar1, 0, ivar3, cs2method5003(ivar2), "", ""); + break; + case 3: + ivar1 = script_3055(ivar1, 1, ivar3, "From " + svar1 + ": " + svar0 + cs2method5003(ivar2), svar1, svar2); + globalstring_276 = svar2; + break; + case 5: + ivar1 = script_3055(ivar1, 0, ivar3, svar0 + cs2method5003(ivar2), svar1, svar2); + break; + case 6: + ivar1 = script_3055(ivar1, 1, ivar3, "To " + svar1 + ": " + svar0 + cs2method5003(ivar2), svar1, svar2); + break; + case 7: + ivar1 = script_3055(ivar1, 1, ivar3, "From " + svar1 + ": " + svar0 + cs2method5003(ivar2), svar1, svar2); + globalstring_276 = svar2; + break; + case 18: + ivar1 = script_3055(ivar1, 1, ivar3, "From " + svar1 + ": " + svar0 + cs2method5003(ivar2), svar1, svar2); + globalstring_276 = svar2; + break; + case 19: + ivar1 = script_3055(ivar1, 1, ivar3, "To " + svar1 + ": " + svar0 + cs2method5003(ivar2), svar1, svar2); + break; + case 115: + ivar1 = script_3055(ivar1, 0, ivar3, "" + cs2method5003(ivar2) + "", "", ""); + } + ivar2 = add(ivar2, 1); + } + ivar4 = divide(getWidgetActualHeight(new WidgetPointer(909,52)), 15); + ivar2 = 0; + ivar5 = 0; + if (ivar1 < ivar4) { + ivar5 = subtract(ivar4, ivar1); + while (ivar2 < ivar5) { + ivar1 = script_3055(ivar1, 0, 0, "", "", ""); + ivar2 = add(ivar2, 1); + } + } + ivar6 = 0; + ivar7 = 0; + while (ivar7 <= ivar1) { + if (setWidgetRegister(new WidgetPointer(909,52), ivar7)) { + ivar6 = add(ivar6, getWidgetActualHeight()); + } + ivar7 = add(ivar7, 1); + } + ivar8 = max(ivar6, multiply(ivar4, 15)); + if (ivar8 > getWidgetActualHeight(new WidgetPointer(909,52))) { + setWidgetScrollMax(0, ivar8, new WidgetPointer(909,52)); + script_72(59572277, 59572276, subtract(add(globalint_1122, getWidgetScrollMaxV(new WidgetPointer(909,52))), globalint_1123)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(909,52)); + cs2method2100(0, 0, new WidgetPointer(909,52)); + script_72(59572277, 59572276, 0); + } + globalint_1122 = cs2method2601(new WidgetPointer(909,52)); + globalint_1123 = getWidgetScrollMaxV(new WidgetPointer(909,52)); + return; +} diff --git a/dumps/scripts/3055.cs2 b/dumps/scripts/3055.cs2 new file mode 100644 index 000000000..51392316a --- /dev/null +++ b/dumps/scripts/3055.cs2 @@ -0,0 +1,50 @@ +int script_3055(int arg0,int arg1,int arg2,string arg3,string arg4,string arg5) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar3; + ivar3 = getWidgetActualWidth(new WidgetPointer(909,52)); + ivar4 = multiply(max(getLineCount(ivar3, 494, arg3), 1), 15); + createExtraChild(new WidgetPointer(909,52), 4, arg0); + setWidgetSize(0, ivar4, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetFont(494); + setWidgetText(arg3); + setWidgetTextAlignment(0, 0, 15); + ivar5 = 0; + ivar6 = 0; + while (ivar6 < arg0) { + if (setWidgetRegister(new WidgetPointer(909,52), ivar6)) { + ivar5 = add(ivar5, getWidgetActualHeight()); + } + ivar6 = add(ivar6, 1); + } + setWidgetPosition(0, ivar5, 0, 2); + svar3 = ""; + if (((boolean)arg1)) { + cs2method1305(strRemoveEntities(arg4)); + setScriptCallOnClickContextMenu(3056, -2147483644, arg4, arg5, "iss"); + switch (arg2) { + case 3: + case 18: + case 6: + case 7: + svar3 = strRemoveEntities(arg5); + if (stringMethod4107(strRemoveEntities(cs2method5020()), svar3) != 0) { + if (isFriend(svar3) && cs2method3623(svar3)) { + setWidgetContextMenuOption(1, "Add friend"); + setWidgetContextMenuOption(2, "Add ignore"); + } else { + if (isFriend(svar3) && cs2method6900()) { + setWidgetContextMenuOption(3, "Message"); + } + } + if ((getClientRights() > 0) || (((int)hasMoreThen5Blackmarks()) > 0)) { + setWidgetContextMenuOption(5, "Report abuse"); + } + } + } + } + return add(arg0, 1); +} diff --git a/dumps/scripts/3056.cs2 b/dumps/scripts/3056.cs2 new file mode 100644 index 000000000..67f8e4f2c --- /dev/null +++ b/dumps/scripts/3056.cs2 @@ -0,0 +1,20 @@ +void script_3056(int arg0,string arg1,string arg2) { + switch (arg0) { + case 1: + if (isFriend(strRemoveEntities(arg2))) { + cs2method3605(strRemoveEntities(arg2)); + } + break; + case 2: + if (isFriend(strRemoveEntities(arg2))) { + cs2method3607(strRemoveEntities(arg2)); + } + break; + case 3: + script_3015(0, "Send message to " + arg1, "", arg2, ""); + break; + case 5: + script_3177(0, arg1); + } + return; +} diff --git a/dumps/scripts/3057.cs2 b/dumps/scripts/3057.cs2 new file mode 100644 index 000000000..744c1f688 --- /dev/null +++ b/dumps/scripts/3057.cs2 @@ -0,0 +1,4 @@ +void script_3057(int arg0,int arg1) { + script_1299(arg0, arg1); + return; +} diff --git a/dumps/scripts/3058.cs2 b/dumps/scripts/3058.cs2 new file mode 100644 index 000000000..92f5020c2 --- /dev/null +++ b/dumps/scripts/3058.cs2 @@ -0,0 +1,30 @@ +void script_3058() { + cs2func_script_3406_struct(3,0,0) structdump_0; + int stack_dump1; + int stack_dump2; + openInterface(59375801, 907); + script_2998(); + openInterface(59375802, 910); + script_3103(); + openInterface(59375803, 909); + script_3023(); + script_3052(59572273); + script_3043(59572290); + openInterface(59375805, 912); + script_3159(59768841); + script_3171(59768842); + openInterface(59375804, 589); + script_4554(38600715); + script_4565(38600716); + openInterface(59375806, 911); + script_3158(); + setScriptCallOnMessage(3405, new WidgetPointer(909,49), new WidgetPointer(912,10), new WidgetPointer(589,12), "III", new WidgetPointer(906,23)); + structdump_0 = script_3406(); + stack_dump1 = structdump_0.intpart_0; + stack_dump2 = structdump_0.intpart_1; + globalint_1510 = structdump_0.intpart_2; + stack_dump1 = stack_dump1; + globalint_1276 = stack_dump2; + globalint_1275 = stack_dump1; + return; +} diff --git a/dumps/scripts/3059.cs2 b/dumps/scripts/3059.cs2 new file mode 100644 index 000000000..550f4d09c --- /dev/null +++ b/dumps/scripts/3059.cs2 @@ -0,0 +1,4 @@ +void script_3059(int arg0) { + script_3060(arg0); + return; +} diff --git a/dumps/scripts/306.cs2 b/dumps/scripts/306.cs2 new file mode 100644 index 000000000..229d45754 --- /dev/null +++ b/dumps/scripts/306.cs2 @@ -0,0 +1,8 @@ +void script_306(int arg0,int arg1) { + if (subtract(getClientCycle(), arg0) < 15) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/3060.cs2 b/dumps/scripts/3060.cs2 new file mode 100644 index 000000000..16a2bb66b --- /dev/null +++ b/dumps/scripts/3060.cs2 @@ -0,0 +1,73 @@ +void script_3060(int arg0) { + int stack_dump0; + if (((int)cs2method_3408(105, 73, 941, arg0)) == -1) { + return; + } + if (isWidgetHidden(cs2method_3408(105, 73, 941, arg0))) { + return; + } + setWidgetIsHidden(true, cs2method_3408(105, 73, 941, 0)); + setWidgetIsHidden(true, cs2method_3408(105, 73, 941, 1)); + setWidgetIsHidden(true, cs2method_3408(105, 73, 941, 2)); + setWidgetIsHidden(true, cs2method_3408(105, 73, 941, 5)); + setWidgetIsHidden(true, cs2method_3408(105, 73, 941, 3)); + setWidgetIsHidden(true, cs2method_3408(105, 73, 941, 4)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(906,216)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(906,213)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(906,211)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(906,209)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(906,266)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(906,207)); + setWidgetSprite(4672, new WidgetPointer(906,215)); + setWidgetSprite(4672, new WidgetPointer(906,22)); + setWidgetSprite(4672, new WidgetPointer(906,21)); + setWidgetSprite(4672, new WidgetPointer(906,20)); + setWidgetSprite(4672, new WidgetPointer(906,265)); + setWidgetSprite(4672, new WidgetPointer(906,19)); + setScriptCallOnMouseEntered(45, new WidgetPointer(906,216), 16448250, "Ii", new WidgetPointer(906,199)); + setScriptCallOnMouseEntered(45, new WidgetPointer(906,213), 16448250, "Ii", new WidgetPointer(906,200)); + setScriptCallOnMouseEntered(45, new WidgetPointer(906,211), 16448250, "Ii", new WidgetPointer(906,201)); + setScriptCallOnMouseEntered(45, new WidgetPointer(906,209), 16448250, "Ii", new WidgetPointer(906,203)); + setScriptCallOnMouseEntered(45, new WidgetPointer(906,266), 16448250, "Ii", new WidgetPointer(906,202)); + setScriptCallOnMouseEntered(45, new WidgetPointer(906,207), 16448250, "Ii", new WidgetPointer(906,204)); + setScriptCallOnMouseExit(45, new WidgetPointer(906,216), 15458492, "Ii", new WidgetPointer(906,199)); + setScriptCallOnMouseExit(45, new WidgetPointer(906,213), 15458492, "Ii", new WidgetPointer(906,200)); + setScriptCallOnMouseExit(45, new WidgetPointer(906,211), 15458492, "Ii", new WidgetPointer(906,201)); + setScriptCallOnMouseExit(45, new WidgetPointer(906,209), 15458492, "Ii", new WidgetPointer(906,203)); + setScriptCallOnMouseExit(45, new WidgetPointer(906,266), 15458492, "Ii", new WidgetPointer(906,202)); + setScriptCallOnMouseExit(45, new WidgetPointer(906,207), 15458492, "Ii", new WidgetPointer(906,204)); + if (arg0 != 5) { + script_3161(0); + } + if (arg0 != 3) { + script_4556(0); + } + if (((boolean)arg0)) { + setWidgetPosition(0, 3, 1, 2, new WidgetPointer(906,28)); + setWidgetSize(655, 26, 0, 1, new WidgetPointer(906,27)); + stack_dump0 = 1; + /* + mgi.tools.jagdecs2.DecompilerException: Unknown special opcode:6509 + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:348) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + setWidgetPosition(0, 241, 1, 1, new WidgetPointer(906,28)); + setWidgetSize(655, 477, 0, 0, new WidgetPointer(906,27)); + stack_dump0 = 0; + /* + mgi.tools.jagdecs2.DecompilerException: Unknown special opcode:6509 + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:348) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/3061.cs2 b/dumps/scripts/3061.cs2 new file mode 100644 index 000000000..790a2eb69 --- /dev/null +++ b/dumps/scripts/3061.cs2 @@ -0,0 +1,4 @@ +void script_3061(int arg0) { + script_3062(arg0); + return; +} diff --git a/dumps/scripts/3062.cs2 b/dumps/scripts/3062.cs2 new file mode 100644 index 000000000..f1705ee8c --- /dev/null +++ b/dumps/scripts/3062.cs2 @@ -0,0 +1,45 @@ +void script_3062(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + if ((globalint_1100 == 42) || (globalint_1100 == 43)) { + return; + } + if (cs2method6500()) { + script_3064(0); + setScriptCallOnGameloop(3061, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; + } + globalint_1322 = 0; + script_3064(1); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + script_3097(); + globalint_1100 = -1; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + if (((boolean)script_2727()) && ((boolean)globalint_547)) { + script_3076(59375720); + script_3074(59375718); + script_3026(59375720); + script_3025(59375718); + setWidgetIsHidden(false, new WidgetPointer(906,43)); + playMusicEffect(349, 0); + script_3412(59375713, 59375714); + ivar3 = getWidgetActualWidth(new WidgetPointer(906,98)); + ivar4 = getWidgetActualWidth(new WidgetPointer(906,98)); + ivar1 = max(337, add(getTextWidth(496, getWidgetText(new WidgetPointer(906,97))), 30)); + ivar4 = max(152, multiply(getLineCount(ivar3, 496, getWidgetText(new WidgetPointer(906,98))), 16)); + ivar2 = max(243, add(ivar4, 91)); + setWidgetSize(ivar3, ivar4, 0, 0, new WidgetPointer(906,98)); + setWidgetSize(ivar1, ivar2, 0, 0, new WidgetPointer(906,95)); + return; + } + globalint_200 = 0; + script_3064(0); + cs2method5612(0); + setScriptCallOnGameloop(3063, new WidgetPointer(arg0), getWorldId(), "Ii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3063.cs2 b/dumps/scripts/3063.cs2 new file mode 100644 index 000000000..e36e1c930 --- /dev/null +++ b/dumps/scripts/3063.cs2 @@ -0,0 +1,337 @@ +void script_3063(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + string svar6; + string svar7; + string svar8; + int stack_dump0; + opcStruct6506(4,3,0) structdump_1; + ivar2 = getGameloginRC(); + if (ivar2 == -3) { + script_3064(0); + script_3093(ivar2, 0, 1, -1, 0, -1, 0, "Logging In - Please Wait", "", "", "", ""); + globalint_1100 = -3; + return; + } + if (globalint_1100 == -3) { + script_3097(); + } + ivar3 = 0; + svar0 = ""; + ivar4 = 0; + svar1 = ""; + ivar5 = 0; + svar2 = ""; + ivar6 = 0; + ivar7 = 0; + svar3 = ""; + if (ivar2 == 21) { + globalint_1100 = 21; + script_3064(0); + if (((boolean)globalint_200)) { + globalint_200 = getWorldswitchTimer(); + } + globalint_200 = subtract(globalint_200, 1); + if (globalint_200 <= 0) { + if (cs2method6500()) { + globalint_200 = 1; + return; + } + if (arg1 > 0) { + stack_dump0 = arg1; + structdump_1 = cs2method6506(stack_dump0); + svar3 = structdump_1.stringpart_2; + ivar7 = structdump_1.intpart_3; + ivar6 = structdump_1.intpart_2; + svar2 = structdump_1.stringpart_1; + ivar5 = structdump_1.intpart_1; + svar1 = structdump_1.stringpart_0; + ivar4 = structdump_1.intpart_0; + if (setWorldHost(arg1, svar3)) { + ivar4 = 0; + } + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + script_3062(arg0); + return; + } + ivar3 = divide(globalint_200, 50); + if (((boolean)ivar3)) { + svar0 = "You have only just left another world. Your profile will be transferred in" + "
" + "1 second."; + } else { + svar0 = "You have only just left another world. Your profile will be transferred in" + "
" + intToStr(ivar3) + " seconds."; + } + if (isWidgetHidden(new WidgetPointer(906,29))) { + script_3093(ivar2, 0, 0, 2611, 1, 1, 0, svar0, "Abort Login", "Abort Login", "", ""); + } else { + script_1871(svar0); + } + return; + } + if (ivar2 == 42) { + setWidgetIsHidden(false, new WidgetPointer(906,40)); + setWidgetText(new WidgetPointer(906,5), intToStr(arg1)); + setWidgetText(new WidgetPointer(906,6), intToStr(getReturncode42ExtraData())); + if (globalint_1100 != 42) { + script_3093(ivar2, 1, 0, 2611, 0, 0, 1, "World " + intToStr(arg1) + " is currently full." + "
" + "You have been added to the" + "
" + "queue for this world." + "
" + "You can track your progress in the" + "
" + "queue from lower left corner of this" + "
" + "screen.", "", "", "OK", "OK"); + } + globalint_1100 = 42; + return; + } + if (ivar2 == 43) { + setWidgetText(new WidgetPointer(906,5), intToStr(arg1)); + setWidgetText(new WidgetPointer(906,6), intToStr(getReturncode42ExtraData())); + globalint_1100 = 43; + return; + } + setWidgetIsHidden(true, new WidgetPointer(906,40)); + if (arg0 == 59375639) { + script_1299(1, 1); + } + script_3097(); + script_3064(1); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + svar4 = ""; + ivar8 = 1; + ivar9 = 0; + ivar10 = 2608; + ivar11 = 0; + ivar12 = 0; + svar5 = ""; + svar6 = ""; + ivar13 = 1; + svar7 = "Back"; + svar8 = "Back"; + ivar14 = getDetailedRC(); + ivar15 = getReturncodeExtraData(); + switch (ivar2) { + case -2: + script_3097(); + return; + case 29: + switch (ivar14) { + case 0: + svar4 = "You must have a Combat Level of at least 20 (not including Summoning) to enter a PvP world."; + break; + case 1: + svar4 = "You are currently carrying lent items and cannot enter a PvP world."; + break; + case 2: + svar4 = "You must be standing in the Wilderness or Edgeville to enter this bounty world."; + break; + case 3: + svar4 = "You must have a total skill level of 1,000 or greater to enter this world."; + break; + case 5: + svar4 = "You must have a total skill level of 1,500 or greater to enter this world."; + break; + case 4: + svar4 = "You must move to a safe area before you can log in to a PvP or bounty world."; + break; + default: + svar4 = "Unexpected server response. Please try using a different world."; + } + break; + case 46: + svar4 = "This instance is marked for deletion/rebuild. Please try using a different world."; + break; + case 45: + switch (ivar15) { + case 0: + switch (ivar14) { + case 0: + svar4 = "You must be near the TzHaar Fight Pits entrance to enter a global match."; + break; + default: + svar4 = "Unable to log in. Please try using a different world."; + } + break; + case 1: + switch (ivar14) { + case 1: + svar4 = "There was an error connecting to your meeting room. Please try again."; + break; + case 2: + svar4 = "You need a higher rank to enter that private tent."; + break; + case 3: + svar4 = "You need an invitation to enter that private room."; + break; + default: + svar4 = "Unable to log in. Please try using a different world."; + } + break; + default: + svar4 = "Unable to log in. Please try using a different world."; + } + break; + case -5: + svar4 = "Connection timed out. Please try using a different world."; + break; + case -4: + svar4 = "Error connecting to server."; + break; + case -1: + svar4 = "No response from server. Please try using a different world."; + break; + case 5: + svar4 = "Your account has not logged out from its last session. Try again in a few minutes."; + break; + case 7: + svar4 = "This world is full. Please use a different world."; + break; + case 8: + svar4 = "Unable to connect: login server offline."; + break; + case 9: + svar4 = "Login limit exceeded: too many connections from your address."; + break; + case 10: + svar4 = "Unable to connect: bad session id."; + break; + case 13: + svar4 = "Could not complete login. Please try using a different world."; + break; + case 16: + svar4 = "Too many incorrect logins from your address. Please wait 5 minutes before trying again."; + break; + case 17: + svar4 = "You are standing in a members-only area. To play on this world, move to a free area first."; + break; + case 20: + svar4 = "Invalid loginserver requested. Please try using a different world."; + break; + case 22: + svar4 = "Malformed login packet. Please try again."; + break; + case 23: + svar4 = "No reply from login server. Please wait a minute and try again."; + break; + case 24: + svar4 = "Error loading your profile. Please contact customer support."; + break; + case 25: + svar4 = "Unexpected loginserver response. Please try using a different world."; + break; + case 26: + svar4 = "This computer's address has been blocked, as it was used to break our rules."; + break; + case 27: + svar4 = "Service unavailable."; + break; + case 3: + svar4 = "Your password has been updated. Please leave the lobby and log in again."; + break; + case 36: + svar4 = "Unable to connect: authentication server offline."; + break; + case 37: + svar4 = "Your account is currently inaccessible. Please try again in a few minutes."; + break; + case 39: + svar4 = "The instance you tried to join no longer exists. Please try using a different world."; + break; + case 41: + svar4 = "The instance you tried to join is full. Please try back later or try using a different world."; + break; + case 44: + svar4 = "Our systems are currently unavailable. Please try again in a few minutes."; + break; + case 35: + svar4 = "Your session has expired. Please click 'Back' in your browser to renew it."; + svar7 = "Close"; + svar8 = "Close"; + break; + case 14: + ivar8 = 0; + ivar10 = 2610; + svar4 = "The server is being updated. Please wait a few minutes and try again."; + break; + case 6: + ivar8 = 0; + ivar10 = 2610; + svar4 = "RuneScape has been updated! Please reload this page."; + break; + case 4: + svar4 = "Your account has been disabled. Check your Message Centre for details."; + ivar11 = 1; + svar5 = "Message Centre"; + svar6 = "Message Centre"; + break; + case 11: + svar4 = "Your password is an extremely common choice, and is not secure. You must change it before you can log in."; + ivar11 = 1; + svar5 = "Change Password"; + svar6 = "Change Password"; + break; + case 18: + ivar10 = 2612; + svar4 = "Your account has been locked. If you have not received an account recovery email, please select 'Recover Account'."; + ivar11 = 1; + svar5 = "Recover Account"; + svar6 = "Recover Account"; + break; + case 31: + svar4 = "You must change your account's display name before you can log in."; + ivar11 = 1; + svar5 = "Change Display Name"; + svar6 = "Change Display Name"; + break; + case 30: + svar4 = "This is not a member's account. Please choose a 'free' world from the website to play on this account."; + ivar11 = 1; + svar5 = "Subscribe"; + svar6 = "Subscribe"; + break; + case 19: + svar4 = "Fullscreen is currently a members-only feature. To log in, either exit fullscreen via the options menu or use a member's account."; + ivar11 = 1; + svar5 = "Subscribe"; + svar6 = "Subscribe"; + break; + case 12: + ivar8 = 0; + ivar10 = 2607; + svar4 = "You need a member's account to log in to this world. Please subscribe or use a different world."; + ivar11 = 1; + svar5 = "Subscribe"; + svar6 = "Subscribe"; + break; + case 40: + ivar8 = 0; + ivar10 = 2607; + svar4 = "You need a member's account to log in to this instance. Please subscribe or use a different world."; + ivar11 = 1; + svar5 = "Subscribe"; + svar6 = "Subscribe"; + break; + case 32: + svar4 = "Your account has negative membership credit. Please log into the billing system to add credit to your account."; + ivar11 = 1; + svar5 = "Add Credit"; + svar6 = "Add Credit"; + break; + default: + svar4 = "Unexpected server response. Please try using a different world."; + } + script_3093(ivar2, ivar8, ivar9, ivar10, ivar11, ivar12, ivar13, svar4, svar5, svar6, svar7, svar8); + return; +} diff --git a/dumps/scripts/3064.cs2 b/dumps/scripts/3064.cs2 new file mode 100644 index 000000000..bf5fa8882 --- /dev/null +++ b/dumps/scripts/3064.cs2 @@ -0,0 +1,13 @@ +void script_3064(int arg0) { + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(906,184), "Play"); + setWidgetContextMenuOption(1, new WidgetPointer(906,171), "Play"); + setScriptCallOnClickContextMenu(3061, new WidgetPointer(906,171), "I", new WidgetPointer(906,171)); + } else { + setWidgetText(new WidgetPointer(906,184), "Entering game..."); + setWidgetNoOptions(new WidgetPointer(906,171)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(906,171)); + } + script_3065(arg0); + return; +} diff --git a/dumps/scripts/3065.cs2 b/dumps/scripts/3065.cs2 new file mode 100644 index 000000000..19e080ede --- /dev/null +++ b/dumps/scripts/3065.cs2 @@ -0,0 +1,5 @@ +void script_3065(int arg0) { + script_3066(globalint_998, 1, 59375792, 59375794, arg0); + script_3066(globalint_999, 2, 59375793, 59375795, arg0); + return; +} diff --git a/dumps/scripts/3066.cs2 b/dumps/scripts/3066.cs2 new file mode 100644 index 000000000..2614f8202 --- /dev/null +++ b/dumps/scripts/3066.cs2 @@ -0,0 +1,23 @@ +void script_3066(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (arg0 > 0) { + setWidgetSprite(4661, new WidgetPointer(arg2)); + setWidgetText(new WidgetPointer(arg3), intToStr(arg0)); + if (((boolean)arg4)) { + setWidgetContextMenuOption(1, new WidgetPointer(arg2), "Click Here To Play"); + setScriptCallOnClickContextMenu(3067, arg1, "i", new WidgetPointer(arg2)); + } else { + setWidgetNoOptions(new WidgetPointer(arg2)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg2)); + } + setScriptCallOnMouseEntered(3068, new WidgetPointer(arg2), "I", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(3069, new WidgetPointer(arg2), "I", new WidgetPointer(arg2)); + } else { + setWidgetSprite(4660, new WidgetPointer(arg2)); + setWidgetText(new WidgetPointer(arg3), ""); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg2)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg2)); + setWidgetNoOptions(new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/3067.cs2 b/dumps/scripts/3067.cs2 new file mode 100644 index 000000000..d8e83570a --- /dev/null +++ b/dumps/scripts/3067.cs2 @@ -0,0 +1,83 @@ +void script_3067(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + string svar1; + string svar2; + worldData(5,3,0) structdump_0; + worldData(5,3,0) structdump_1; + if (cs2method6500()) { + setScriptCallOnGameloop(3067, arg0, "i", new WidgetPointer(906,172)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(906,172)); + ivar1 = 0; + ivar2 = 0; + svar0 = ""; + ivar3 = 0; + svar1 = ""; + ivar4 = 0; + ivar5 = 0; + svar2 = ""; + ivar6 = -1; + if (((boolean)arg0)) { + ivar6 = globalint_998; + } else if (arg0 == 2) { + ivar6 = globalint_999; + } else { + return; + } + structdump_0 = getFirstWorldData(); + svar2 = structdump_0.stringpart_2; + ivar5 = structdump_0.intpart_4; + ivar4 = structdump_0.intpart_3; + svar1 = structdump_0.stringpart_1; + ivar3 = structdump_0.intpart_2; + svar0 = structdump_0.stringpart_0; + ivar2 = structdump_0.intpart_1; + ivar1 = structdump_0.intpart_0; + ivar7 = 0; + while ((ivar1 != -1) && ((boolean)ivar7)) { + if (ivar1 == ivar6) { + ivar7 = 1; + } else { + structdump_1 = getNextWorldData(); + svar2 = structdump_1.stringpart_2; + ivar5 = structdump_1.intpart_4; + ivar4 = structdump_1.intpart_3; + svar1 = structdump_1.stringpart_1; + ivar3 = structdump_1.intpart_2; + svar0 = structdump_1.stringpart_0; + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + } + } + if (((boolean)arg0)) { + script_3382(59375792); + } else { + if (arg0 == 2) { + script_3382(59375793); + } + } + if (ivar1 > 0) { + if (getWorldId() != ivar1) { + if (setWorldHost(ivar1, svar2)) { + globalint_547 = 0; + script_3062(59375787); + } else { + script_3064(1); + script_3093(-5, 1, 0, 2608, 0, -1, 1, "Could not connect you to the chosen world. Please choose another.", "", "", "Back", "Back"); + } + } else { + script_3062(59375787); + } + } else { + script_3093(-5, 1, 0, 2608, 0, -1, 1, "World " + intToStr(ivar6) + " is running in a different language or is unavailable.", "", "", "Back", "Back"); + } + return; +} diff --git a/dumps/scripts/3068.cs2 b/dumps/scripts/3068.cs2 new file mode 100644 index 000000000..06c0b952d --- /dev/null +++ b/dumps/scripts/3068.cs2 @@ -0,0 +1,5 @@ +void script_3068(int arg0) { + setWidgetSprite(4662, new WidgetPointer(arg0)); + script_3083(arg0, -1, "Click here to login to your favourite world"); + return; +} diff --git a/dumps/scripts/3069.cs2 b/dumps/scripts/3069.cs2 new file mode 100644 index 000000000..b20b83050 --- /dev/null +++ b/dumps/scripts/3069.cs2 @@ -0,0 +1,4 @@ +void script_3069(int arg0) { + script_3382(arg0); + return; +} diff --git a/dumps/scripts/307.cs2 b/dumps/scripts/307.cs2 new file mode 100644 index 000000000..dc110800c --- /dev/null +++ b/dumps/scripts/307.cs2 @@ -0,0 +1,8 @@ +void script_307() { + if (((boolean)bitconfig_6176)) { + cs2method5231(950, 1); + } else { + cs2method5231(950, 0); + } + return; +} diff --git a/dumps/scripts/3070.cs2 b/dumps/scripts/3070.cs2 new file mode 100644 index 000000000..3f3baf33e --- /dev/null +++ b/dumps/scripts/3070.cs2 @@ -0,0 +1,11 @@ +?? script_3070() { + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 2422 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/3071.cs2 b/dumps/scripts/3071.cs2 new file mode 100644 index 000000000..46001eceb --- /dev/null +++ b/dumps/scripts/3071.cs2 @@ -0,0 +1,4 @@ +void script_3071(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_3072(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/3072.cs2 b/dumps/scripts/3072.cs2 new file mode 100644 index 000000000..655f94eec --- /dev/null +++ b/dumps/scripts/3072.cs2 @@ -0,0 +1,12 @@ +void script_3072(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (arg0 != -1) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + } + if (arg2 != -1) { + setWidgetSprite(arg3, new WidgetPointer(arg2)); + } + if (arg4 != -1) { + setWidgetSprite(arg5, new WidgetPointer(arg4)); + } + return; +} diff --git a/dumps/scripts/3073.cs2 b/dumps/scripts/3073.cs2 new file mode 100644 index 000000000..b7be04d05 --- /dev/null +++ b/dumps/scripts/3073.cs2 @@ -0,0 +1,4 @@ +void script_3073(int arg0) { + script_3074(arg0); + return; +} diff --git a/dumps/scripts/3074.cs2 b/dumps/scripts/3074.cs2 new file mode 100644 index 000000000..cbba1f9e0 --- /dev/null +++ b/dumps/scripts/3074.cs2 @@ -0,0 +1,4 @@ +void script_3074(int arg0) { + script_3077(arg0, 2679, 2680, 2681, 2682); + return; +} diff --git a/dumps/scripts/3075.cs2 b/dumps/scripts/3075.cs2 new file mode 100644 index 000000000..a287ff71b --- /dev/null +++ b/dumps/scripts/3075.cs2 @@ -0,0 +1,4 @@ +void script_3075(int arg0) { + script_3076(arg0); + return; +} diff --git a/dumps/scripts/3076.cs2 b/dumps/scripts/3076.cs2 new file mode 100644 index 000000000..db37901e9 --- /dev/null +++ b/dumps/scripts/3076.cs2 @@ -0,0 +1,4 @@ +void script_3076(int arg0) { + script_3077(arg0, 2683, 2684, 2685, 2686); + return; +} diff --git a/dumps/scripts/3077.cs2 b/dumps/scripts/3077.cs2 new file mode 100644 index 000000000..49a71e666 --- /dev/null +++ b/dumps/scripts/3077.cs2 @@ -0,0 +1,18 @@ +void script_3077(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_2994(arg0, 0, 16, 32, 0, 0, arg1, 0, 0, 0, 0); + script_2994(arg0, 1, 32, 32, 16, 0, arg2, 0, 0, 0, 0); + setWidgetSize(32, 32, 1, 0); + script_2994(arg0, 2, 16, 32, 0, 0, arg1, 1, 0, 0, 0); + setWidgetPosition(0, 0, 2, 0); + script_2994(arg0, 3, 16, 32, 0, 0, arg3, 0, 0, 0, 0); + setWidgetHidden(1); + script_2994(arg0, 4, 32, 32, 16, 0, arg4, 0, 0, 0, 0); + setWidgetSize(32, 32, 1, 0); + setWidgetHidden(1); + script_2994(arg0, 5, 16, 32, 0, 0, arg3, 1, 0, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetHidden(1); + setScriptCallOnMouseEntered(3078, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(3080, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3078.cs2 b/dumps/scripts/3078.cs2 new file mode 100644 index 000000000..d2dc9a73a --- /dev/null +++ b/dumps/scripts/3078.cs2 @@ -0,0 +1,4 @@ +void script_3078(int arg0) { + script_3079(arg0); + return; +} diff --git a/dumps/scripts/3079.cs2 b/dumps/scripts/3079.cs2 new file mode 100644 index 000000000..c97a7fa81 --- /dev/null +++ b/dumps/scripts/3079.cs2 @@ -0,0 +1,12 @@ +void script_3079(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 4)) { + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 5)) { + setWidgetHidden(0); + } + return; +} diff --git a/dumps/scripts/308.cs2 b/dumps/scripts/308.cs2 new file mode 100644 index 000000000..90db0f859 --- /dev/null +++ b/dumps/scripts/308.cs2 @@ -0,0 +1,6 @@ +void script_308(int arg0) { + setScriptCallOnKeyPress(1382, -2147483640, false, new WidgetPointer(arg0), -1, "izIc", new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), "Search the map by typing here."); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3080.cs2 b/dumps/scripts/3080.cs2 new file mode 100644 index 000000000..981eb1650 --- /dev/null +++ b/dumps/scripts/3080.cs2 @@ -0,0 +1,4 @@ +void script_3080(int arg0) { + script_3081(arg0); + return; +} diff --git a/dumps/scripts/3081.cs2 b/dumps/scripts/3081.cs2 new file mode 100644 index 000000000..2b13d9be1 --- /dev/null +++ b/dumps/scripts/3081.cs2 @@ -0,0 +1,12 @@ +void script_3081(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(arg0), 4)) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(arg0), 5)) { + setWidgetHidden(1); + } + return; +} diff --git a/dumps/scripts/3082.cs2 b/dumps/scripts/3082.cs2 new file mode 100644 index 000000000..82ec29926 --- /dev/null +++ b/dumps/scripts/3082.cs2 @@ -0,0 +1,4 @@ +void script_3082(int arg0,int arg1,string arg2) { + script_3083(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3083.cs2 b/dumps/scripts/3083.cs2 new file mode 100644 index 000000000..1e8f08957 --- /dev/null +++ b/dumps/scripts/3083.cs2 @@ -0,0 +1,10 @@ +void script_3083(int arg0,int arg1,string arg2) { + if (arg1 < 0) { + setScriptCallOnMouseOver(3084, new WidgetPointer(arg0), arg1, add(getClientCycle(), 25), arg2, -2147483647, -2147483646, "Iiisii", new WidgetPointer(arg0)); + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMouseOver(3084, new WidgetPointer(arg0), arg1, add(getClientCycle(), 25), arg2, -2147483647, -2147483646, "Iiisii"); + } + } + return; +} diff --git a/dumps/scripts/3084.cs2 b/dumps/scripts/3084.cs2 new file mode 100644 index 000000000..09a730732 --- /dev/null +++ b/dumps/scripts/3084.cs2 @@ -0,0 +1,4 @@ +void script_3084(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + script_3085(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/3085.cs2 b/dumps/scripts/3085.cs2 new file mode 100644 index 000000000..abf11f63d --- /dev/null +++ b/dumps/scripts/3085.cs2 @@ -0,0 +1,44 @@ +void script_3085(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = arg0; + if (getClientCycle() > arg2) { + setWidgetText(new WidgetPointer(906,223), arg5); + setWidgetSize(add(multiply(getWidgetActualX(new WidgetPointer(906,223)), 2), getTextWidth(495, arg5)), getWidgetActualHeight(new WidgetPointer(906,220)), 0, 0, new WidgetPointer(906,220)); + while (((boolean)ivar7)) { + if (ivar8 == 59375643) { + ivar7 = 1; + } + ivar5 = add(ivar5, getWidgetActualX(new WidgetPointer(ivar8))); + ivar6 = add(ivar6, getWidgetActualY(new WidgetPointer(ivar8))); + ivar8 = getWidgetParentId(new WidgetPointer(ivar8)); + } + if ((arg1 > -1) && setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar5 = add(ivar5, getWidgetActualX()); + ivar6 = add(ivar6, getWidgetActualY()); + } + ivar5 = add(add(ivar5, arg3), 3); + ivar6 = subtract(subtract(add(ivar6, arg4), 3), getWidgetActualHeight(new WidgetPointer(906,220))); + if (add(ivar5, getWidgetActualWidth(new WidgetPointer(906,220))) > getWidgetActualWidth(new WidgetPointer(906,23))) { + ivar5 = subtract(getWidgetActualWidth(new WidgetPointer(906,23)), getWidgetActualWidth(new WidgetPointer(906,220))); + } + if (ivar6 < 0) { + ivar6 = 0; + } + setWidgetPosition(ivar5, ivar6, 0, 0, new WidgetPointer(906,220)); + setWidgetIsHidden(false, new WidgetPointer(906,220)); + if (arg1 < 0) { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMouseOver(-1, ""); + } + } + } + return; +} diff --git a/dumps/scripts/3086.cs2 b/dumps/scripts/3086.cs2 new file mode 100644 index 000000000..282da0479 --- /dev/null +++ b/dumps/scripts/3086.cs2 @@ -0,0 +1,4 @@ +void script_3086(int arg0,int arg1) { + script_3087(arg0, arg1); + return; +} diff --git a/dumps/scripts/3087.cs2 b/dumps/scripts/3087.cs2 new file mode 100644 index 000000000..5b97c8620 --- /dev/null +++ b/dumps/scripts/3087.cs2 @@ -0,0 +1,11 @@ +void script_3087(int arg0,int arg1) { + setWidgetIsHidden(true, new WidgetPointer(906,220)); + if (arg1 < 0) { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMouseOver(-1, ""); + } + } + return; +} diff --git a/dumps/scripts/3088.cs2 b/dumps/scripts/3088.cs2 new file mode 100644 index 000000000..69c8fe273 --- /dev/null +++ b/dumps/scripts/3088.cs2 @@ -0,0 +1,6 @@ +void script_3088(int arg0,string arg1,string arg2) { + if ((stringMethod4107(arg1, "") != 0) && (stringMethod4107(arg2, "") != 0)) { + cs2method5400(arg0, arg1, arg2); + } + return; +} diff --git a/dumps/scripts/3089.cs2 b/dumps/scripts/3089.cs2 new file mode 100644 index 000000000..c6c98f495 --- /dev/null +++ b/dumps/scripts/3089.cs2 @@ -0,0 +1,6 @@ +void script_3089(int arg0,string arg1,string arg2) { + if ((stringMethod4107(arg1, "") != 0) && (stringMethod4107(arg2, "") != 0)) { + cs2method5421(arg0, "loginapplet/loginapplet.ws?ssl=1&expired=0&mod=" + arg1 + "&dest=" + arg2); + } + return; +} diff --git a/dumps/scripts/309.cs2 b/dumps/scripts/309.cs2 new file mode 100644 index 000000000..0961a3b4c --- /dev/null +++ b/dumps/scripts/309.cs2 @@ -0,0 +1,26 @@ +void script_309(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 0; + if ((globalint_623 != -1) && (getDungeonmap(globalint_623) == arg0)) { + ivar3 = script_292(globalint_624, arg1, arg2, ivar3); + } + if ((globalint_625 != -1) && (getDungeonmap(globalint_625) == arg0)) { + ivar3 = script_292(globalint_626, arg1, arg2, ivar3); + } + if ((globalint_627 != -1) && (getDungeonmap(globalint_627) == arg0)) { + ivar3 = script_292(globalint_628, arg1, arg2, ivar3); + } + if ((globalint_629 != -1) && (getDungeonmap(globalint_629) == arg0)) { + ivar3 = script_292(globalint_630, arg1, arg2, ivar3); + } + if ((standart_config_1159 != -1) && (getDungeonmap(standart_config_1159) == arg0)) { + ivar3 = script_292(972, arg1, arg2, ivar3); + } + if ((globalint_940 != -1) && (getDungeonmap(globalint_940) == arg0)) { + ivar3 = script_292(globalint_941, arg1, arg2, ivar3); + } + if ((globalint_674 != -1) && (getDungeonmap(globalint_674) == arg0)) { + ivar3 = script_292(280, arg1, arg2, ivar3); + } + return; +} diff --git a/dumps/scripts/3090.cs2 b/dumps/scripts/3090.cs2 new file mode 100644 index 000000000..bb20d4cc1 --- /dev/null +++ b/dumps/scripts/3090.cs2 @@ -0,0 +1,4 @@ +void script_3090() { + setWidgetIsHidden(false, new WidgetPointer(906,42)); + return; +} diff --git a/dumps/scripts/3091.cs2 b/dumps/scripts/3091.cs2 new file mode 100644 index 000000000..696cd388d --- /dev/null +++ b/dumps/scripts/3091.cs2 @@ -0,0 +1,4 @@ +void script_3091(int arg0) { + script_3092(arg0); + return; +} diff --git a/dumps/scripts/3092.cs2 b/dumps/scripts/3092.cs2 new file mode 100644 index 000000000..7a5421598 --- /dev/null +++ b/dumps/scripts/3092.cs2 @@ -0,0 +1,8 @@ +void script_3092(int arg0) { + globalint_547 = arg0; + setWidgetIsHidden(true, new WidgetPointer(906,43)); + if (((boolean)globalint_547)) { + script_3062(59375787); + } + return; +} diff --git a/dumps/scripts/3093.cs2 b/dumps/scripts/3093.cs2 new file mode 100644 index 000000000..b70bf2048 --- /dev/null +++ b/dumps/scripts/3093.cs2 @@ -0,0 +1,4 @@ +void script_3093(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,string arg7,string arg8,string arg9,string arg10,string arg11) { + script_2779(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 250, arg7, arg8, arg9, arg10, arg11); + return; +} diff --git a/dumps/scripts/3094.cs2 b/dumps/scripts/3094.cs2 new file mode 100644 index 000000000..8f83dfe54 --- /dev/null +++ b/dumps/scripts/3094.cs2 @@ -0,0 +1,44 @@ +void script_3094() { + int ivar0; + ivar0 = getGameloginRC(); + if ((ivar0 != -3) && ((boolean)globalint_1322)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(906,234)); + return; + } + if (((boolean)globalint_1322) && (ivar0 == -3)) { + globalint_1322 = 0; + } + if (getClientCycle() < globalint_1092) { + return; + } + globalint_1092 = add(getClientCycle(), 5); + switch (getWidgetSpriteId(new WidgetPointer(906,234))) { + case 4107: + setWidgetSprite(4108, new WidgetPointer(906,234)); + break; + case 4108: + setWidgetSprite(4109, new WidgetPointer(906,234)); + break; + case 4109: + setWidgetSprite(4110, new WidgetPointer(906,234)); + break; + case 4110: + setWidgetSprite(4111, new WidgetPointer(906,234)); + break; + case 4111: + setWidgetSprite(4112, new WidgetPointer(906,234)); + break; + case 4112: + setWidgetSprite(4113, new WidgetPointer(906,234)); + break; + case 4113: + setWidgetSprite(4114, new WidgetPointer(906,234)); + break; + case 4114: + setWidgetSprite(4107, new WidgetPointer(906,234)); + break; + default: + setWidgetSprite(4107, new WidgetPointer(906,234)); + } + return; +} diff --git a/dumps/scripts/3095.cs2 b/dumps/scripts/3095.cs2 new file mode 100644 index 000000000..c8475d1e2 --- /dev/null +++ b/dumps/scripts/3095.cs2 @@ -0,0 +1,47 @@ +void script_3095(int arg0,int arg1,int arg2) { + string svar0; + string svar1; + svar0 = ""; + svar1 = ""; + switch (arg2) { + case 4: + svar0 = "ticketing"; + svar1 = "inbox.ws"; + setScriptCallOnClickContextMenu(3088, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + break; + case 11: + svar0 = "password_history"; + svar1 = "password.ws"; + setScriptCallOnClickContextMenu(3088, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + break; + case 18: + svar0 = "accountappeal"; + svar1 = "lockchoice.ws"; + setScriptCallOnClickContextMenu(3089, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + break; + case 31: + svar0 = "displaynames"; + svar1 = "name.ws"; + setScriptCallOnClickContextMenu(3088, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + break; + case 19: + case 32: + case -2000: + case -3000: + case 40: + case 12: + case 30: + svar0 = "dob"; + svar1 = "set_members_dob.ws"; + setScriptCallOnClickContextMenu(3088, svar0, svar1, 1, "ss1", new WidgetPointer(arg0)); + break; + case 21: + setScriptCallOnMousePressed(1872, "", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(arg1)); + return; + default: + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg0)); + } + setScriptCallOnClickContextMenu(3096, "", new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/3096.cs2 b/dumps/scripts/3096.cs2 new file mode 100644 index 000000000..a3a13ce91 --- /dev/null +++ b/dumps/scripts/3096.cs2 @@ -0,0 +1,4 @@ +void script_3096() { + script_3097(); + return; +} diff --git a/dumps/scripts/3097.cs2 b/dumps/scripts/3097.cs2 new file mode 100644 index 000000000..98281f420 --- /dev/null +++ b/dumps/scripts/3097.cs2 @@ -0,0 +1,24 @@ +void script_3097() { + setWidgetNoOptions(new WidgetPointer(906,236)); + setWidgetNoOptions(new WidgetPointer(906,242)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(906,236)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(906,242)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(906,242)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(906,242)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(906,236)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(906,236)); + setWidgetPosition(6, 5, 0, 2, new WidgetPointer(906,236)); + setWidgetPosition(6, 5, 0, 2, new WidgetPointer(906,242)); + setWidgetText(new WidgetPointer(906,241), ""); + setWidgetText(new WidgetPointer(906,247), ""); + setWidgetIsHidden(true, new WidgetPointer(906,236)); + setWidgetIsHidden(true, new WidgetPointer(906,242)); + setWidgetText(new WidgetPointer(906,235), ""); + globalint_1092 = 0; + setWidgetSprite(-1, new WidgetPointer(906,234)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(906,234)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(906,44)); + setWidgetIsHidden(true, new WidgetPointer(906,44)); + setWidgetIsHidden(true, new WidgetPointer(906,29)); + return; +} diff --git a/dumps/scripts/3098.cs2 b/dumps/scripts/3098.cs2 new file mode 100644 index 000000000..dc7ed5ef8 --- /dev/null +++ b/dumps/scripts/3098.cs2 @@ -0,0 +1,19 @@ +void script_3098(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6) { + int ivar5; + int ivar6; + int ivar7; + ivar5 = 4044; + ivar6 = 4044; + ivar7 = 4046; + setScriptCallOnMouseExit(3071, new WidgetPointer(arg1), ivar5, new WidgetPointer(arg2), ivar7, new WidgetPointer(arg3), ivar6, "IdIdId", new WidgetPointer(arg0)); + setWidgetSprite(ivar5, new WidgetPointer(arg1)); + setWidgetSprite(ivar7, new WidgetPointer(arg2)); + setWidgetSprite(ivar6, new WidgetPointer(arg3)); + ivar5 = 4045; + ivar6 = 4045; + ivar7 = 4047; + setScriptCallOnMouseEntered(3071, new WidgetPointer(arg1), ivar5, new WidgetPointer(arg2), ivar7, new WidgetPointer(arg3), ivar6, "IdIdId", new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(906,241), arg5); + setWidgetContextMenuOption(1, new WidgetPointer(906,236), arg6); + return; +} diff --git a/dumps/scripts/3099.cs2 b/dumps/scripts/3099.cs2 new file mode 100644 index 000000000..6def8e03c --- /dev/null +++ b/dumps/scripts/3099.cs2 @@ -0,0 +1,19 @@ +void script_3099(int arg0,int arg1,int arg2,int arg3,string arg4,string arg5) { + int ivar4; + int ivar5; + int ivar6; + ivar4 = 4044; + ivar5 = 4044; + ivar6 = 4046; + setScriptCallOnMouseExit(3071, new WidgetPointer(arg1), ivar4, new WidgetPointer(arg2), ivar6, new WidgetPointer(arg3), ivar5, "IdIdId", new WidgetPointer(arg0)); + setWidgetSprite(ivar4, new WidgetPointer(arg1)); + setWidgetSprite(ivar6, new WidgetPointer(arg2)); + setWidgetSprite(ivar5, new WidgetPointer(arg3)); + ivar4 = 4045; + ivar6 = 4047; + ivar5 = 4045; + setScriptCallOnMouseEntered(3071, new WidgetPointer(arg1), ivar4, new WidgetPointer(arg2), ivar6, new WidgetPointer(arg3), ivar5, "IdIdId", new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(906,247), arg4); + setWidgetContextMenuOption(1, new WidgetPointer(906,242), arg5); + return; +} diff --git a/dumps/scripts/31.cs2 b/dumps/scripts/31.cs2 new file mode 100644 index 000000000..14b058f08 --- /dev/null +++ b/dumps/scripts/31.cs2 @@ -0,0 +1,74 @@ +void script_31(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + ivar8 = getWidgetScrollMaxV(new WidgetPointer(arg1)); + ivar9 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar10 = subtract(ivar9, 32); + ivar11 = 0; + if (ivar8 > 0) { + ivar11 = multiplyDivide(ivar9, ivar8, ivar10); + } else { + ivar11 = ivar10; + } + ivar11 = max(ivar11, 10); + ivar12 = cs2method2601(new WidgetPointer(arg1)); + ivar13 = 0; + ivar14 = 0; + if (ivar12 > 0) { + ivar13 = subtract(ivar8, getWidgetActualHeight(new WidgetPointer(arg1))); + if (((boolean)ivar13)) { + ivar13 = 1; + } + if (ivar12 > ivar13) { + cs2method2100(0, ivar13, new WidgetPointer(arg1)); + ivar12 = ivar13; + } + ivar14 = multiplyDivide(ivar12, ivar13, subtract(ivar10, ivar11)); + ivar14 = min(max(ivar14, 0), subtract(ivar10, ivar11)); + } + createExtraChild(new WidgetPointer(arg0), 5, 0); + setWidgetPosition(0, 16, 0, 0); + setWidgetSize(16, 32, 0, 1); + setWidgetSprite(arg2); + cs2method1107(1); + setScriptCallOnMousePressed(34, new WidgetPointer(arg0), new WidgetPointer(arg1), -2147483646, "IIi"); + createExtraChild(new WidgetPointer(arg0), 5, 1); + setWidgetPosition(0, add(16, ivar14), 0, 0); + setWidgetSprite(arg4); + cs2method1107(1); + cs2method1301(arg0, 0); + cs2method1302(1); + setWidgetSize(16, ivar11, 0, 0); + setScriptCallOnMouseDragged(35, new WidgetPointer(arg0), new WidgetPointer(arg1), -2147483646, 0, "IIi1"); + setScriptCallOnMouseDragReleased(35, new WidgetPointer(arg0), new WidgetPointer(arg1), -2147483646, 1, "IIi1"); + createExtraChild(new WidgetPointer(arg0), 5, 2); + setWidgetPosition(0, add(16, ivar14), 0, 0); + setWidgetSize(16, 5, 0, 0); + setWidgetSprite(arg3); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, 3); + setWidgetPosition(0, subtract(add(add(16, ivar14), ivar11), 5), 0, 0); + setWidgetSize(16, 5, 0, 0); + setWidgetSprite(arg5); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, 4); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(16, 16, 0, 0); + setWidgetSprite(arg6); + cs2method1107(0); + setScriptCallOnMouseDraggedOver(32, new WidgetPointer(arg0), new WidgetPointer(arg1), "II"); + createExtraChild(new WidgetPointer(arg0), 5, 5); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(16, 16, 0, 0); + setWidgetSprite(arg7); + cs2method1107(0); + setScriptCallOnMouseDraggedOver(33, new WidgetPointer(arg0), new WidgetPointer(arg1), "II"); + setScriptCallOnMouseScroll(36, new WidgetPointer(arg0), new WidgetPointer(arg1), -2147483646, "IIi", new WidgetPointer(arg0)); + setScriptCallOnMouseScroll(36, new WidgetPointer(arg0), new WidgetPointer(arg1), -2147483646, "IIi", new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/310.cs2 b/dumps/scripts/310.cs2 new file mode 100644 index 000000000..61c80ba8b --- /dev/null +++ b/dumps/scripts/310.cs2 @@ -0,0 +1,15 @@ +void script_310(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + int stack_dump0; + ivar2 = 0; + ivar3 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + stack_dump0 = add(add(getWidgetActualX(), getWidgetActualHeight()), 1); + ivar3 = add(add(getWidgetActualY(), getWidgetActualHeight()), 1); + ivar2 = stack_dump0; + ivar3 = subtract(ivar3, cs2method2601(new WidgetPointer(arg0))); + script_312(ivar2, ivar3, arg2); + } + return; +} diff --git a/dumps/scripts/3100.cs2 b/dumps/scripts/3100.cs2 new file mode 100644 index 000000000..0b373f29a --- /dev/null +++ b/dumps/scripts/3100.cs2 @@ -0,0 +1,16 @@ +void script_3100(int arg0) { + int ivar1; + ivar1 = getGameloginRC(); + if (ivar1 == -3) { + return; + } + if ((ivar1 == 21) && (arg0 == 13)) { + script_1873(); + return; + } + if (arg0 == 13) { + script_3097(); + return; + } + return; +} diff --git a/dumps/scripts/3101.cs2 b/dumps/scripts/3101.cs2 new file mode 100644 index 000000000..602da258b --- /dev/null +++ b/dumps/scripts/3101.cs2 @@ -0,0 +1,4 @@ +void script_3101() { + script_3102(); + return; +} diff --git a/dumps/scripts/3102.cs2 b/dumps/scripts/3102.cs2 new file mode 100644 index 000000000..507aadf6d --- /dev/null +++ b/dumps/scripts/3102.cs2 @@ -0,0 +1,39 @@ +void script_3102() { + script_3104(59637767); + script_3105(59637765); + script_3107(59637770); + script_3107(59637771); + script_3108(59637814); + script_3108(59637791); + script_3108(59637811); + script_3108(59637808); + script_3108(59637804); + if (getLanguage() != 0) { + setWidgetText(new WidgetPointer(910,51), "Language"); + } + script_3109(59637786); + script_3109(59637779); + script_3111(59637796); + script_3111(59637784); + script_3110(59637816); + script_3110(59637817); + script_3110(59637818); + script_3110(59637819); + script_3110(59637821); + script_3155(59637813); + script_3155(59637810); + setWidgetIsHidden(false, new WidgetPointer(910,75)); + setWidgetIsHidden(false, new WidgetPointer(910,34)); + setWidgetIsHidden(false, new WidgetPointer(910,60)); + setWidgetIsHidden(false, new WidgetPointer(910,84)); + setWidgetIsHidden(false, new WidgetPointer(910,42)); + setWidgetPosition(110, 0, 2, 0, new WidgetPointer(910,33)); + setWidgetPosition(94, 0, 2, 0, new WidgetPointer(910,74)); + setWidgetPosition(173, 0, 2, 0, new WidgetPointer(910,59)); + setWidgetPosition(157, 0, 2, 0, new WidgetPointer(910,83)); + setWidgetPosition(173, 0, 2, 0, new WidgetPointer(910,41)); + setWidgetSize(330, 2, 1, 1, new WidgetPointer(910,32)); + setWidgetSize(313, 0, 1, 1, new WidgetPointer(910,72)); + script_3110(59637820); + return; +} diff --git a/dumps/scripts/3103.cs2 b/dumps/scripts/3103.cs2 new file mode 100644 index 000000000..706545084 --- /dev/null +++ b/dumps/scripts/3103.cs2 @@ -0,0 +1,17 @@ +void script_3103() { + script_3102(); + script_3113(); + script_3125(59637815, 1, 0, "Descending world number", "Ascending world number"); + script_3125(59637790, 3, 2, "Descending player count", "Ascending player count"); + script_3125(59637812, 5, 4, "Descending activity", "Ascending activity"); + script_3125(59637809, 9, 8, "Descending type", "Ascending type"); + script_3125(59637807, 7, 6, "Descending LootShare", "Ascending LootShare"); + script_3125(59637805, 11, 10, "Descending ping", "Ascending ping"); + script_3116(); + if (((boolean)cs2method5420())) { + script_3143(0, "Please choose a game world from the list." + "
" + "This will cause the game applet to reload."); + } else { + script_3143(0, "Please choose a game world from the list."); + } + return; +} diff --git a/dumps/scripts/3104.cs2 b/dumps/scripts/3104.cs2 new file mode 100644 index 000000000..96098b5a3 --- /dev/null +++ b/dumps/scripts/3104.cs2 @@ -0,0 +1,4 @@ +void script_3104(int arg0) { + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3105.cs2 b/dumps/scripts/3105.cs2 new file mode 100644 index 000000000..7cec87f43 --- /dev/null +++ b/dumps/scripts/3105.cs2 @@ -0,0 +1,4 @@ +void script_3105(int arg0) { + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3106.cs2 b/dumps/scripts/3106.cs2 new file mode 100644 index 000000000..17fe21252 --- /dev/null +++ b/dumps/scripts/3106.cs2 @@ -0,0 +1,4 @@ +void script_3106(int arg0) { + setWidgetRGB(new Color(250, 250, 250), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3107.cs2 b/dumps/scripts/3107.cs2 new file mode 100644 index 000000000..f3f30330a --- /dev/null +++ b/dumps/scripts/3107.cs2 @@ -0,0 +1,4 @@ +void script_3107(int arg0) { + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3108.cs2 b/dumps/scripts/3108.cs2 new file mode 100644 index 000000000..c80499697 --- /dev/null +++ b/dumps/scripts/3108.cs2 @@ -0,0 +1,4 @@ +void script_3108(int arg0) { + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3109.cs2 b/dumps/scripts/3109.cs2 new file mode 100644 index 000000000..e1ae13301 --- /dev/null +++ b/dumps/scripts/3109.cs2 @@ -0,0 +1,4 @@ +void script_3109(int arg0) { + setWidgetRGB(new Color(56, 46, 34), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/311.cs2 b/dumps/scripts/311.cs2 new file mode 100644 index 000000000..25d3673e1 --- /dev/null +++ b/dumps/scripts/311.cs2 @@ -0,0 +1,8 @@ +void script_311(int arg0,int arg1,string arg2) { + if (((boolean)bitconfig_6177)) { + deleteAllExtraChilds(new WidgetPointer(755,57)); + return; + } + script_312(add(arg0, 3), add(arg1, 3), arg2); + return; +} diff --git a/dumps/scripts/3110.cs2 b/dumps/scripts/3110.cs2 new file mode 100644 index 000000000..9984091d9 --- /dev/null +++ b/dumps/scripts/3110.cs2 @@ -0,0 +1,4 @@ +void script_3110(int arg0) { + setWidgetRGB(new Color(69, 55, 24), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3111.cs2 b/dumps/scripts/3111.cs2 new file mode 100644 index 000000000..cd29c6a45 --- /dev/null +++ b/dumps/scripts/3111.cs2 @@ -0,0 +1,4 @@ +void script_3111(int arg0) { + setWidgetRGB(new Color(14, 11, 9), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3112.cs2 b/dumps/scripts/3112.cs2 new file mode 100644 index 000000000..585c25719 --- /dev/null +++ b/dumps/scripts/3112.cs2 @@ -0,0 +1,4 @@ +void script_3112() { + script_3113(); + return; +} diff --git a/dumps/scripts/3113.cs2 b/dumps/scripts/3113.cs2 new file mode 100644 index 000000000..4a47d022e --- /dev/null +++ b/dumps/scripts/3113.cs2 @@ -0,0 +1,4 @@ +void script_3113() { + setScriptCallOnGameloop(3115, "", new WidgetPointer(910,0)); + return; +} diff --git a/dumps/scripts/3114.cs2 b/dumps/scripts/3114.cs2 new file mode 100644 index 000000000..c2b145866 --- /dev/null +++ b/dumps/scripts/3114.cs2 @@ -0,0 +1,6 @@ +void script_3114(int arg0) { + if (getClientCycle() > arg0) { + script_3113(); + } + return; +} diff --git a/dumps/scripts/3115.cs2 b/dumps/scripts/3115.cs2 new file mode 100644 index 000000000..51a8b235e --- /dev/null +++ b/dumps/scripts/3115.cs2 @@ -0,0 +1,427 @@ +void script_3115() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + int ivar37; + int ivar38; + int ivar39; + int ivar40; + int ivar41; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + string svar6; + worldData(5,3,0) structdump_0; + worldData(5,3,0) structdump_1; + worldData(5,3,0) structdump_2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + string stack_dump8; + string stack_dump9; + cs2func_script_3117_struct(6,3,0) structdump_10; + worldData(5,3,0) structdump_11; + ivar0 = script_1851(); + ivar1 = script_1852(); + if ((ivar1 == ivar0) && (ivar1 != 0)) { + ivar1 = 0; + script_1856(0); + } + switch (ivar0) { + case 4: + ivar0 = add(ivar0, 2); + break; + case 5: + ivar0 = add(ivar0, 2); + break; + case 6: + ivar0 = add(ivar0, 2); + break; + case 7: + ivar0 = add(ivar0, 2); + break; + case 8: + ivar0 = add(ivar0, 6); + break; + case 9: + ivar0 = add(ivar0, 6); + break; + case 10: + ivar0 = add(ivar0, 6); + break; + case 11: + ivar0 = add(ivar0, 6); + } + switch (ivar1) { + case 4: + ivar1 = add(ivar1, 2); + break; + case 5: + ivar1 = add(ivar1, 2); + break; + case 6: + ivar1 = add(ivar1, 2); + break; + case 7: + ivar1 = add(ivar1, 2); + break; + case 8: + ivar1 = add(ivar1, 6); + break; + case 9: + ivar1 = add(ivar1, 6); + break; + case 10: + ivar1 = add(ivar1, 6); + break; + case 11: + ivar1 = add(ivar1, 6); + } + cs2method6507(divide(ivar0, 2), script_734(mod(ivar0, 2)), divide(ivar1, 2), script_734(mod(ivar1, 2))); + ivar2 = 0; + if (cs2method6500()) { + return; + } + setScriptCallOnGameloop(3114, add(getClientCycle(), 500), "i", new WidgetPointer(910,0)); + ivar3 = 0; + if (globalint_998 > 0) { + ivar3 = getWidgetActualHeight(new WidgetPointer(910,21)); + } + if (globalint_999 > 0) { + ivar3 = add(ivar3, getWidgetActualHeight(new WidgetPointer(910,22))); + } + if (((boolean)ivar3)) { + setWidgetIsHidden(true, new WidgetPointer(910,24)); + setWidgetIsHidden(true, new WidgetPointer(910,18)); + setWidgetIsHidden(true, new WidgetPointer(910,23)); + } else { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,23)), ivar3, 0, 0, new WidgetPointer(910,23)); + setWidgetIsHidden(false, new WidgetPointer(910,24)); + setWidgetIsHidden(false, new WidgetPointer(910,18)); + setWidgetIsHidden(false, new WidgetPointer(910,23)); + ivar3 = add(ivar3, getWidgetActualHeight(new WidgetPointer(910,18))); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(910,24)); + ivar3 = add(ivar3, getWidgetActualHeight(new WidgetPointer(910,24))); + } + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(910,25)); + ivar3 = add(ivar3, getWidgetActualHeight(new WidgetPointer(910,25))); + setWidgetSize(16, ivar3, 1, 1, new WidgetPointer(910,62)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(910,62)); + setWidgetSize(16, ivar3, 0, 1, new WidgetPointer(910,86)); + setWidgetPosition(0, ivar3, 2, 0, new WidgetPointer(910,86)); + ivar4 = 59637824; + ivar5 = 59637828; + ivar6 = 59637829; + ivar7 = 59637830; + ivar8 = 59637831; + ivar9 = 59637832; + ivar10 = 59637833; + ivar11 = 59637834; + ivar12 = 59637835; + ivar13 = 59637836; + ivar14 = 59637837; + ivar15 = 59637838; + ivar16 = 59637846; + deleteAllExtraChilds(new WidgetPointer(ivar4)); + deleteAllExtraChilds(new WidgetPointer(ivar5)); + deleteAllExtraChilds(new WidgetPointer(ivar6)); + deleteAllExtraChilds(new WidgetPointer(ivar7)); + deleteAllExtraChilds(new WidgetPointer(ivar8)); + deleteAllExtraChilds(new WidgetPointer(ivar9)); + deleteAllExtraChilds(new WidgetPointer(ivar10)); + deleteAllExtraChilds(new WidgetPointer(ivar11)); + deleteAllExtraChilds(new WidgetPointer(ivar12)); + deleteAllExtraChilds(new WidgetPointer(ivar13)); + deleteAllExtraChilds(new WidgetPointer(ivar14)); + deleteAllExtraChilds(new WidgetPointer(ivar15)); + ivar17 = 0; + ivar18 = 0; + svar0 = ""; + ivar19 = 0; + svar1 = ""; + ivar20 = 0; + ivar21 = 0; + ivar22 = -1; + ivar23 = -1; + ivar24 = -1; + ivar25 = -1; + ivar26 = 0; + ivar27 = 0; + svar2 = ""; + svar3 = ""; + ivar28 = -1; + ivar29 = -1; + ivar30 = 0; + ivar31 = 0; + ivar32 = 0; + ivar33 = 0; + ivar34 = 0; + svar4 = ""; + svar5 = ""; + ivar35 = -1; + ivar36 = -1; + structdump_0 = getFirstWorldData(); + svar2 = structdump_0.stringpart_2; + ivar21 = structdump_0.intpart_4; + ivar20 = structdump_0.intpart_3; + svar1 = structdump_0.stringpart_1; + ivar19 = structdump_0.intpart_2; + svar0 = structdump_0.stringpart_0; + ivar18 = structdump_0.intpart_1; + ivar17 = structdump_0.intpart_0; + if (ivar17 == -1) { + script_3143(1, "Unable to load list."); + setWidgetText(new WidgetPointer(910,1), "The world list could not be loaded." + "
" + "
" + "Please accept our apologies for the" + "
" + "inconvenience, and try again later."); + return; + } + ivar37 = 0; + ivar38 = 0; + ivar39 = 0; + svar6 = ""; + ivar40 = 0; + ivar41 = 0; + ivar2 = 0; + while (((boolean)ivar2)) { + if (ivar17 == -1) { + ivar2 = 1; + } else if ((ivar17 >= 170) && (ivar20 < 0)) { + structdump_1 = getNextWorldData(); + svar2 = structdump_1.stringpart_2; + ivar21 = structdump_1.intpart_4; + ivar20 = structdump_1.intpart_3; + svar1 = structdump_1.stringpart_1; + ivar19 = structdump_1.intpart_2; + svar0 = structdump_1.stringpart_0; + ivar18 = structdump_1.intpart_1; + ivar17 = structdump_1.intpart_0; + } else if (isBitFlagged(ivar18, 12)) { + structdump_2 = getNextWorldData(); + svar2 = structdump_2.stringpart_2; + ivar21 = structdump_2.intpart_4; + ivar20 = structdump_2.intpart_3; + svar1 = structdump_2.stringpart_1; + ivar19 = structdump_2.intpart_2; + svar0 = structdump_2.stringpart_0; + ivar18 = structdump_2.intpart_1; + ivar17 = structdump_2.intpart_0; + } else { + stack_dump3 = ivar17; + stack_dump4 = ivar18; + stack_dump5 = ivar37; + stack_dump6 = ivar20; + stack_dump7 = ivar19; + stack_dump8 = svar0; + stack_dump9 = svar1; + structdump_10 = script_3117(stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9); + svar5 = structdump_10.stringpart_2; + svar4 = structdump_10.stringpart_1; + ivar25 = structdump_10.intpart_5; + ivar26 = structdump_10.intpart_4; + ivar29 = structdump_10.intpart_3; + ivar27 = structdump_10.intpart_2; + ivar22 = structdump_10.intpart_1; + svar3 = structdump_10.stringpart_0; + ivar28 = structdump_10.intpart_0; + if (ivar17 == globalint_998) { + ivar40 = 1; + } else { + if (ivar17 == globalint_999) { + ivar41 = 1; + } + } + script_2996(ivar4, ivar37, getWidgetActualWidth(new WidgetPointer(ivar4)), 20, 0, ivar38, ivar26, 1, 0); + script_2994(ivar5, ivar37, 13, 12, 0, add(ivar38, 4), ivar25, 0, 0, 0, 0); + setWidgetPosition(0, add(ivar38, 4), 1, 0); + script_2994(ivar7, ivar37, 19, 18, 2, add(ivar38, 1), ivar22, 0, 0, 0, 0); + script_2995(ivar6, ivar37, subtract(getWidgetActualWidth(new WidgetPointer(ivar6)), 25), 20, 25, ivar38, ivar27, 494, 0, 1, 0, 1, intToStr(ivar17)); + script_2995(ivar8, ivar37, subtract(getWidgetActualWidth(new WidgetPointer(ivar8)), 6), 20, 3, ivar38, ivar27, 494, 0, 1, 0, 1, svar5); + script_2994(ivar10, ivar37, 24, 12, 4, add(ivar38, 4), ivar28, 0, 0, 0, 0); + script_2995(ivar9, ivar37, 30, 20, 30, ivar38, ivar27, 494, 0, 1, 0, 1, svar3); + setWidgetSize(30, 20, 1, 0); + script_2995(ivar11, ivar37, subtract(getWidgetActualWidth(new WidgetPointer(ivar11)), 10), 20, 5, ivar38, ivar27, 494, 0, 1, 0, 1, svar4); + script_2994(ivar12, ivar37, 17, 17, 0, add(ivar38, 1), ivar29, 0, 0, 0, 0); + setWidgetPosition(0, add(ivar38, 1), 1, 0); + if (ivar21 == -1) { + svar6 = "-"; + } else if (ivar21 >= 1000) { + svar6 = "N/A"; + } else { + svar6 = intToStr(ivar21); + } + script_2995(ivar13, ivar37, subtract(getWidgetActualWidth(new WidgetPointer(ivar13)), 10), 20, 5, ivar38, ivar27, 494, 0, 1, 0, 1, svar6); + script_2995(ivar14, ivar37, getWidgetActualWidth(new WidgetPointer(ivar14)), 20, 0, ivar38, 0, 494, 0, 1, 0, 1, ""); + setScriptCallOnMouseEntered(3131, new WidgetPointer(ivar14), ivar37, ivar17, "Iii"); + setScriptCallOnMouseExit(3133, ""); + setWidgetContextMenuOption(1, "Select"); + cs2method1305("World " + intToStr(ivar17)); + setScriptCallOnClickContextMenu(3129, -2147483644, ivar37, ivar17, svar2, "iiis"); + script_2995(ivar15, ivar37, getWidgetActualWidth(new WidgetPointer(ivar15)), 20, 0, ivar38, 0, 494, 0, 1, 0, 1, ""); + setScriptCallOnMouseEntered(3130, new WidgetPointer(ivar5), new WidgetPointer(ivar15), ivar37, ivar17, "IIii"); + setScriptCallOnMouseExit(3132, new WidgetPointer(ivar5), ivar37, ivar17, "Iii"); + setWidgetContextMenuOption(1, "Alter"); + cs2method1305("Favourite"); + setScriptCallOnClickContextMenu(3128, -2147483644, ivar37, ivar17, "iii"); + if (ivar17 == getWorldId()) { + setWidgetIsHidden(false, new WidgetPointer(910,67)); + setWidgetPosition(0, ivar38, 0, 0, new WidgetPointer(910,67)); + } + if (ivar17 == globalint_998) { + ivar35 = ivar37; + } + if (ivar17 == globalint_999) { + ivar36 = ivar37; + } + structdump_11 = getNextWorldData(); + svar2 = structdump_11.stringpart_2; + ivar21 = structdump_11.intpart_4; + ivar20 = structdump_11.intpart_3; + svar1 = structdump_11.stringpart_1; + ivar19 = structdump_11.intpart_2; + svar0 = structdump_11.stringpart_0; + ivar18 = structdump_11.intpart_1; + ivar17 = structdump_11.intpart_0; + ivar38 = add(ivar38, 20); + ivar39 = add(ivar39, 1); + ivar37 = add(ivar37, 1); + } + } + setWidgetScrollMax(0, add(ivar38, getWidgetActualY(new WidgetPointer(910,63))), new WidgetPointer(910,62)); + script_31(ivar16, 59637822, 792, 789, 790, 791, 773, 788); + if (globalint_998 > 0) { + script_3118(globalint_998, 59637781, ivar35, ivar40); + } else { + script_3119(59637781, 1); + } + if (globalint_999 > 0) { + script_3118(globalint_999, 59637782, ivar36, ivar41); + } else { + script_3119(59637782, 0); + } + if ((globalint_998 > 0) && (globalint_999 > 0)) { + if (((boolean)ivar40) && ((boolean)ivar41)) { + setWidgetIsHidden(true, new WidgetPointer(910,23)); + } else if (((boolean)ivar40) && ((boolean)ivar41)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,56)), 0, 0, 0, new WidgetPointer(910,56)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,57)), 0, 0, 0, new WidgetPointer(910,57)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,58)), 0, 0, 0, new WidgetPointer(910,58)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,59)), 0, 0, 0, new WidgetPointer(910,59)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,60)), 0, 0, 0, new WidgetPointer(910,60)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,61)), 0, 0, 0, new WidgetPointer(910,61)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,56)), 20, 0, 0, new WidgetPointer(910,56)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,57)), 20, 0, 0, new WidgetPointer(910,57)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,58)), 20, 0, 0, new WidgetPointer(910,58)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,59)), 20, 0, 0, new WidgetPointer(910,59)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,60)), 20, 0, 0, new WidgetPointer(910,60)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,61)), 20, 0, 0, new WidgetPointer(910,61)); + setWidgetIsHidden(false, new WidgetPointer(910,23)); + } else if (((boolean)ivar40) && ((boolean)ivar41)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,56)), 20, 0, 0, new WidgetPointer(910,56)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,57)), 20, 0, 0, new WidgetPointer(910,57)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,58)), 20, 0, 0, new WidgetPointer(910,58)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,59)), 20, 0, 0, new WidgetPointer(910,59)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,60)), 20, 0, 0, new WidgetPointer(910,60)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,61)), 20, 0, 0, new WidgetPointer(910,61)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,56)), 20, 0, 0, new WidgetPointer(910,56)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,57)), 20, 0, 0, new WidgetPointer(910,57)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,58)), 20, 0, 0, new WidgetPointer(910,58)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,59)), 20, 0, 0, new WidgetPointer(910,59)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,60)), 20, 0, 0, new WidgetPointer(910,60)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,61)), 20, 0, 0, new WidgetPointer(910,61)); + setWidgetIsHidden(false, new WidgetPointer(910,23)); + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,56)), 0, 0, 0, new WidgetPointer(910,56)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,57)), 0, 0, 0, new WidgetPointer(910,57)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,58)), 0, 0, 0, new WidgetPointer(910,58)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,59)), 0, 0, 0, new WidgetPointer(910,59)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,60)), 0, 0, 0, new WidgetPointer(910,60)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,61)), 0, 0, 0, new WidgetPointer(910,61)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,56)), 0, 0, 1, new WidgetPointer(910,56)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,57)), 0, 0, 1, new WidgetPointer(910,57)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,58)), 0, 0, 1, new WidgetPointer(910,58)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,59)), 0, 0, 1, new WidgetPointer(910,59)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,60)), 0, 0, 1, new WidgetPointer(910,60)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,61)), 0, 0, 1, new WidgetPointer(910,61)); + setWidgetIsHidden(false, new WidgetPointer(910,23)); + } + } else if ((globalint_998 > 0) && (globalint_999 <= 0)) { + if (((boolean)ivar40)) { + setWidgetIsHidden(true, new WidgetPointer(910,23)); + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,56)), 0, 0, 0, new WidgetPointer(910,56)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,57)), 0, 0, 0, new WidgetPointer(910,57)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,58)), 0, 0, 0, new WidgetPointer(910,58)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,59)), 0, 0, 0, new WidgetPointer(910,59)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,60)), 0, 0, 0, new WidgetPointer(910,60)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,61)), 0, 0, 0, new WidgetPointer(910,61)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,56)), 0, 0, 1, new WidgetPointer(910,56)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,57)), 0, 0, 1, new WidgetPointer(910,57)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,58)), 0, 0, 1, new WidgetPointer(910,58)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,59)), 0, 0, 1, new WidgetPointer(910,59)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,60)), 0, 0, 1, new WidgetPointer(910,60)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,61)), 0, 0, 1, new WidgetPointer(910,61)); + setWidgetIsHidden(false, new WidgetPointer(910,23)); + } + } else if ((globalint_998 <= 0) && (globalint_999 > 0)) { + if (((boolean)ivar41)) { + setWidgetIsHidden(true, new WidgetPointer(910,23)); + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,56)), 0, 0, 0, new WidgetPointer(910,56)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,57)), 0, 0, 0, new WidgetPointer(910,57)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,58)), 0, 0, 0, new WidgetPointer(910,58)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,59)), 0, 0, 0, new WidgetPointer(910,59)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,60)), 0, 0, 0, new WidgetPointer(910,60)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,61)), 0, 0, 0, new WidgetPointer(910,61)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,56)), 0, 0, 1, new WidgetPointer(910,56)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,57)), 0, 0, 1, new WidgetPointer(910,57)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,58)), 0, 0, 1, new WidgetPointer(910,58)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,59)), 0, 0, 1, new WidgetPointer(910,59)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,60)), 0, 0, 1, new WidgetPointer(910,60)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(910,61)), 0, 0, 1, new WidgetPointer(910,61)); + setWidgetIsHidden(false, new WidgetPointer(910,23)); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(910,23)); + } + setWidgetIsHidden(true, new WidgetPointer(910,1)); + setWidgetIsHidden(false, new WidgetPointer(910,13)); + return; +} diff --git a/dumps/scripts/3116.cs2 b/dumps/scripts/3116.cs2 new file mode 100644 index 000000000..7484fe619 --- /dev/null +++ b/dumps/scripts/3116.cs2 @@ -0,0 +1,49 @@ +void script_3116() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + string svar0; + string svar1; + string svar2; + string svar3; + int stack_dump0; + opcStruct6506(4,3,0) structdump_1; + if (getWorldId() == -1) { + setWidgetIsHidden(true, new WidgetPointer(910,12)); + setWidgetText(new WidgetPointer(910,11), "World: Auto"); + return; + } + ivar0 = 0; + svar0 = ""; + ivar1 = 0; + svar1 = ""; + ivar2 = 0; + ivar3 = 0; + svar2 = ""; + stack_dump0 = getWorldId(); + structdump_1 = cs2method6506(stack_dump0); + svar2 = structdump_1.stringpart_2; + ivar3 = structdump_1.intpart_3; + ivar2 = structdump_1.intpart_2; + svar1 = structdump_1.stringpart_1; + ivar1 = structdump_1.intpart_1; + svar0 = structdump_1.stringpart_0; + ivar0 = structdump_1.intpart_0; + ivar4 = 0; + if (isBitFlagged(ivar0, 0)) { + ivar4 = 1; + } else { + ivar4 = 0; + } + svar3 = "World " + intToStr(getWorldId()); + setWidgetText(new WidgetPointer(910,11), svar3); + setWidgetPosition(add(getTextWidth(3793, svar3), 5), 0, 2, 2, new WidgetPointer(910,12)); + if (((boolean)ivar4)) { + setWidgetSprite(1531, new WidgetPointer(910,12)); + } else { + setWidgetSprite(1532, new WidgetPointer(910,12)); + } + return; +} diff --git a/dumps/scripts/3117.cs2 b/dumps/scripts/3117.cs2 new file mode 100644 index 000000000..dc81ecf6d --- /dev/null +++ b/dumps/scripts/3117.cs2 @@ -0,0 +1,126 @@ +cs2func_script_3117_struct(6,3,0) script_3117(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + string svar2; + string svar3; + string svar4; + ivar5 = -1; + ivar6 = -1; + ivar7 = 0; + ivar8 = 0; + svar2 = ""; + ivar9 = -1; + ivar10 = -1; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + svar3 = ""; + svar4 = ""; + if (isBitFlagged(arg1, 0)) { + ivar11 = 1; + } else { + ivar11 = 0; + } + if (isBitFlagged(arg1, 1)) { + ivar12 = 1; + } else { + ivar12 = 0; + } + if (isBitFlagged(arg1, 2)) { + ivar13 = 1; + } else { + ivar13 = 0; + } + if (isBitFlagged(arg1, 3)) { + ivar14 = 1; + } else { + ivar14 = 0; + } + if (isBitFlagged(arg1, 4)) { + ivar15 = 1; + } else { + ivar15 = 0; + } + if (((boolean)getLanguage())) { + if (((boolean)ivar15)) { + ivar9 = cs2method_3408(105, 100, 730, 1); + svar2 = arg5; + } else if (strLength(arg5) > 1) { + ivar9 = cs2method_3408(105, 100, 730, 1); + svar2 = arg5; + } else { + ivar9 = cs2method_3408(105, 100, 1810, arg4); + svar2 = arg6; + } + } else { + if (((boolean)getLanguage())) { + ivar9 = 1517; + } else if (getLanguage() == 2) { + ivar9 = cs2method_3408(105, 100, 1810, 74); + } else { + if (getLanguage() == 3) { + ivar9 = cs2method_3408(105, 100, 1810, 31); + } + } + if (((boolean)ivar15)) { + svar2 = arg5; + } else if (strLength(arg5) > 1) { + svar2 = arg5; + } else if (((boolean)getLanguage())) { + svar2 = "German"; + } else if (getLanguage() == 2) { + svar2 = "French"; + } else { + if (getLanguage() == 3) { + svar2 = "Portuguese"; + } + } + } + if (((boolean)ivar11)) { + ivar5 = 1532; + ivar8 = 16579836; + svar3 = "Free"; + } else { + ivar5 = 1531; + ivar8 = 16579684; + svar3 = "Members"; + } + if (((boolean)ivar14)) { + ivar10 = 699; + } else { + ivar10 = 698; + } + if (arg0 == globalint_998) { + ivar7 = 2109969; + ivar6 = 1541; + } else if (arg0 == globalint_999) { + ivar7 = 2112529; + ivar6 = 1541; + } else { + if (((boolean)mod(arg2, 2))) { + ivar7 = 2103569; + } else { + ivar7 = 2695190; + } + ivar6 = 1545; + } + if (arg3 >= 1980) { + svar4 = "FULL"; + } else if (arg3 >= 0) { + svar4 = intToStr(arg3); + } else { + svar4 = "OFFLINE"; + } + return newstruct cs2func_script_3117_struct(ivar9, ivar5, ivar8, ivar10, ivar7, ivar6, svar2, svar3, svar4); +} diff --git a/dumps/scripts/3118.cs2 b/dumps/scripts/3118.cs2 new file mode 100644 index 000000000..350f2c41f --- /dev/null +++ b/dumps/scripts/3118.cs2 @@ -0,0 +1,150 @@ +void script_3118(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + int stack_dump0; + opcStruct6506(4,3,0) structdump_1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + string stack_dump6; + string stack_dump7; + cs2func_script_3117_struct(6,3,0) structdump_8; + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar4 = 0; + svar0 = ""; + ivar5 = 0; + svar1 = ""; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + svar2 = ""; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + ivar14 = 0; + ivar15 = 0; + stack_dump0 = arg0; + structdump_1 = cs2method6506(stack_dump0); + svar2 = structdump_1.stringpart_2; + ivar9 = structdump_1.intpart_3; + ivar6 = structdump_1.intpart_2; + svar1 = structdump_1.stringpart_1; + ivar5 = structdump_1.intpart_1; + svar0 = structdump_1.stringpart_0; + ivar4 = structdump_1.intpart_0; + setWidgetIsHidden(false, new WidgetPointer(arg1)); + ivar16 = -1; + svar3 = ""; + ivar17 = -1; + svar4 = ""; + svar5 = ""; + stack_dump0 = arg0; + stack_dump2 = ivar4; + stack_dump3 = -1; + stack_dump4 = ivar6; + stack_dump5 = ivar5; + stack_dump6 = svar0; + stack_dump7 = svar1; + structdump_8 = script_3117(stack_dump0, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7); + svar5 = structdump_8.stringpart_2; + svar4 = structdump_8.stringpart_1; + ivar13 = structdump_8.intpart_5; + ivar15 = structdump_8.intpart_4; + ivar17 = structdump_8.intpart_3; + ivar14 = structdump_8.intpart_2; + ivar10 = structdump_8.intpart_1; + svar3 = structdump_8.stringpart_0; + ivar16 = structdump_8.intpart_0; + if (((boolean)arg3)) { + if (arg0 == globalint_998) { + ivar15 = 2109969; + } else { + if (arg0 == globalint_999) { + ivar15 = 2112529; + } + } + ivar13 = 1541; + ivar14 = 16579684; + script_2996(arg1, 0, getWidgetActualWidth(new WidgetPointer(arg1)), 20, 0, 0, ivar15, 1, 0); + script_2996(arg1, 1, 23, 20, 0, 0, 6316128, 1, 0); + setWidgetHidden(1); + script_2996(arg1, 2, 25, 20, 25, 0, 4210752, 1, 0); + setWidgetSize(25, 20, 1, 0); + setWidgetHidden(1); + script_2996(arg1, 3, 0, 20, 0, 0, 11685120, 1, 0); + setWidgetSize(0, 20, 1, 0); + if (getWorldId() == arg0) { + setWidgetHidden(0); + } else { + setWidgetHidden(1); + } + script_2994(arg1, 4, 13, 12, add(getWidgetActualX(new WidgetPointer(910,68)), divide(subtract(getWidgetActualWidth(new WidgetPointer(910,68)), 13), 2)), 4, ivar13, 0, 0, 0, 0); + script_2995(arg1, 5, subtract(getWidgetActualWidth(new WidgetPointer(arg1)), add(getWidgetActualX(new WidgetPointer(910,70)), 2)), 20, add(getWidgetActualX(new WidgetPointer(910,70)), 2), 0, ivar14, 494, 0, 1, 0, 1, "World " + intToStr(arg0) + " is running in a different language or is unavailable."); + script_2995(arg1, 6, getWidgetActualWidth(new WidgetPointer(910,77)), 20, getWidgetActualX(new WidgetPointer(910,77)), 0, 0, 494, 0, 1, 0, 1, ""); + setScriptCallOnMouseEntered(3121, new WidgetPointer(arg1), "I"); + setScriptCallOnMouseExit(3123, new WidgetPointer(arg1), "I"); + script_2995(arg1, 7, getWidgetActualWidth(new WidgetPointer(910,78)), 20, getWidgetActualX(new WidgetPointer(910,78)), 0, 0, 494, 0, 1, 0, 1, ""); + setScriptCallOnMouseEntered(3120, new WidgetPointer(arg1), "I"); + setScriptCallOnMouseExit(3122, new WidgetPointer(arg1), "I"); + setWidgetContextMenuOption(1, "Remove"); + cs2method1305("Favourite"); + setScriptCallOnClickContextMenu(3134, arg0, "i"); + return; + } + script_2996(arg1, 0, getWidgetActualWidth(new WidgetPointer(arg1)), 20, 0, 0, ivar15, 1, 0); + script_2996(arg1, 1, 23, 20, 0, 0, 6316128, 1, 0); + setWidgetHidden(1); + script_2996(arg1, 2, 25, 20, 25, 0, 4210752, 1, 0); + setWidgetSize(25, 20, 1, 0); + setWidgetHidden(1); + script_2996(arg1, 3, 0, 20, 0, 0, 11685120, 1, 0); + setWidgetSize(0, 20, 1, 0); + if (getWorldId() == arg0) { + setWidgetHidden(0); + } else { + setWidgetHidden(1); + } + script_2994(arg1, 4, 13, 12, add(getWidgetActualX(new WidgetPointer(910,68)), divide(subtract(getWidgetActualWidth(new WidgetPointer(910,68)), 13), 2)), 4, ivar13, 0, 0, 0, 0); + script_2994(arg1, 5, 19, 18, add(getWidgetActualX(new WidgetPointer(910,70)), 2), 1, ivar10, 0, 0, 0, 0); + script_2995(arg1, 6, subtract(getWidgetActualWidth(new WidgetPointer(910,69)), 25), 20, add(getWidgetActualX(new WidgetPointer(910,69)), 25), 0, ivar14, 494, 0, 1, 0, 1, intToStr(arg0)); + script_2995(arg1, 7, subtract(getWidgetActualWidth(new WidgetPointer(910,71)), 6), 20, add(getWidgetActualX(new WidgetPointer(910,71)), 3), 0, ivar14, 494, 0, 1, 0, 1, svar5); + script_2994(arg1, 8, 24, 12, add(getWidgetActualX(new WidgetPointer(910,73)), 4), 4, ivar16, 0, 0, 0, 0); + script_2995(arg1, 9, subtract(getWidgetActualWidth(new WidgetPointer(910,72)), 30), 20, add(getWidgetActualX(new WidgetPointer(910,72)), 30), 0, ivar14, 494, 0, 1, 0, 1, svar3); + script_2995(arg1, 10, subtract(getWidgetActualWidth(new WidgetPointer(910,74)), 10), 20, add(getWidgetActualX(new WidgetPointer(910,74)), 5), 0, ivar14, 494, 0, 1, 0, 1, svar4); + script_2994(arg1, 11, 17, 17, add(getWidgetActualX(new WidgetPointer(910,75)), divide(subtract(getWidgetActualWidth(new WidgetPointer(910,75)), 17), 2)), 1, ivar17, 0, 0, 0, 0); + script_2995(arg1, 12, subtract(getWidgetActualWidth(new WidgetPointer(910,75)), 10), 20, add(getWidgetActualX(new WidgetPointer(910,76)), 5), 0, ivar14, 494, 0, 1, 0, 1, intToStr(ivar9)); + script_2995(arg1, 13, getWidgetActualWidth(new WidgetPointer(910,77)), 20, getWidgetActualX(new WidgetPointer(910,77)), 0, 0, 494, 0, 1, 0, 1, ""); + setScriptCallOnMouseEntered(3121, new WidgetPointer(arg1), "I"); + setScriptCallOnMouseExit(3123, new WidgetPointer(arg1), "I"); + setWidgetContextMenuOption(1, "Select"); + cs2method1305("World " + intToStr(arg0)); + setScriptCallOnClickContextMenu(3129, -2147483644, arg2, arg0, svar2, "iiis"); + script_2995(arg1, 14, getWidgetActualWidth(new WidgetPointer(910,78)), 20, getWidgetActualX(new WidgetPointer(910,78)), 0, 0, 494, 0, 1, 0, 1, ""); + setScriptCallOnMouseEntered(3120, new WidgetPointer(arg1), "I"); + setScriptCallOnMouseExit(3122, new WidgetPointer(arg1), "I"); + setWidgetContextMenuOption(1, "Remove"); + cs2method1305("Favourite"); + setScriptCallOnClickContextMenu(3134, arg0, "i"); + return; +} diff --git a/dumps/scripts/3119.cs2 b/dumps/scripts/3119.cs2 new file mode 100644 index 000000000..83e4f16d2 --- /dev/null +++ b/dumps/scripts/3119.cs2 @@ -0,0 +1,5 @@ +void script_3119(int arg0,int arg1) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/312.cs2 b/dumps/scripts/312.cs2 new file mode 100644 index 000000000..ec551b5ab --- /dev/null +++ b/dumps/scripts/312.cs2 @@ -0,0 +1,63 @@ +void script_312(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + if (globalint_1 < add(getClientCycle(), 25)) { + globalint_1 = max(globalint_1, getClientCycle()); + globalint_1 = add(globalint_1, 2); + return; + } + ivar2 = 49479737; + ivar3 = getWidgetParentId(new WidgetPointer(ivar2)); + ivar4 = getWidgetActualWidth(new WidgetPointer(ivar3)); + ivar5 = 0; + ivar6 = 0; + globalint_1 = add(getClientCycle(), 10); + if (((boolean)globalint_2)) { + ivar5 = getMaxLineWidth(ivar4, 495, arg2); + ivar6 = add(multiply(getLineCount(ivar5, 495, arg2), 12), 9); + ivar5 = add(ivar5, 4); + setWidgetSize(ivar5, ivar6, 0, 0, new WidgetPointer(ivar2)); + createExtraChild(new WidgetPointer(ivar2), 3, 0); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 160)); + createExtraChild(new WidgetPointer(ivar2), 3, 1); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFilled(0); + setWidgetRGB(new Color(1, 1, 1)); + createExtraChild(new WidgetPointer(ivar2), 4, 2); + setWidgetSize(4, 6, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetTextAlignment(0, 1, 0); + setWidgetFont(495); + setWidgetText(arg2); + globalint_2 = 1; + } + ivar5 = arg0; + ivar6 = arg1; + ivar7 = subtract(0, ivar5); + if (ivar7 > 0) { + ivar5 = add(ivar5, ivar7); + } + ivar7 = subtract(add(ivar5, getWidgetActualWidth(new WidgetPointer(ivar2))), ivar4); + if (ivar7 > 0) { + ivar5 = subtract(ivar5, ivar7); + } + ivar7 = subtract(add(ivar6, getWidgetActualHeight(new WidgetPointer(ivar2))), getWidgetActualHeight(new WidgetPointer(ivar3))); + if (ivar7 > 0) { + ivar6 = subtract(ivar6, ivar7); + } + ivar7 = subtract(0, ivar6); + if (ivar7 > 0) { + ivar6 = add(ivar6, ivar7); + } + setWidgetPosition(ivar5, ivar6, 0, 0, new WidgetPointer(ivar2)); + return; +} diff --git a/dumps/scripts/3120.cs2 b/dumps/scripts/3120.cs2 new file mode 100644 index 000000000..a9b8c8dcb --- /dev/null +++ b/dumps/scripts/3120.cs2 @@ -0,0 +1,14 @@ +void script_3120(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetHidden(0); + setWidgetRGB(new Color(96, 96, 96)); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetHidden(0); + setWidgetRGB(new Color(64, 64, 64)); + } + if (setWidgetRegister(new WidgetPointer(arg0), 4)) { + setWidgetSprite(1542); + } + return; +} diff --git a/dumps/scripts/3121.cs2 b/dumps/scripts/3121.cs2 new file mode 100644 index 000000000..1c7b998d2 --- /dev/null +++ b/dumps/scripts/3121.cs2 @@ -0,0 +1,11 @@ +void script_3121(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetHidden(0); + setWidgetRGB(new Color(64, 64, 64)); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetHidden(0); + setWidgetRGB(new Color(96, 96, 96)); + } + return; +} diff --git a/dumps/scripts/3122.cs2 b/dumps/scripts/3122.cs2 new file mode 100644 index 000000000..63f240098 --- /dev/null +++ b/dumps/scripts/3122.cs2 @@ -0,0 +1,12 @@ +void script_3122(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(arg0), 4)) { + setWidgetSprite(1541); + } + return; +} diff --git a/dumps/scripts/3123.cs2 b/dumps/scripts/3123.cs2 new file mode 100644 index 000000000..2cc53b93b --- /dev/null +++ b/dumps/scripts/3123.cs2 @@ -0,0 +1,9 @@ +void script_3123(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetHidden(1); + } + return; +} diff --git a/dumps/scripts/3124.cs2 b/dumps/scripts/3124.cs2 new file mode 100644 index 000000000..8e76e1725 --- /dev/null +++ b/dumps/scripts/3124.cs2 @@ -0,0 +1,4 @@ +void script_3124(int arg0,int arg1,int arg2,string arg3,string arg4) { + script_3125(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/3125.cs2 b/dumps/scripts/3125.cs2 new file mode 100644 index 000000000..51b535e02 --- /dev/null +++ b/dumps/scripts/3125.cs2 @@ -0,0 +1,16 @@ +void script_3125(int arg0,int arg1,int arg2,string arg3,string arg4) { + script_2994(arg0, 0, 11, 11, 0, 0, 1535, 0, 0, 0, 0); + setScriptCallOnMouseEntered(3126, new WidgetPointer(arg0), 0, "Ii"); + setScriptCallOnMouseExit(3127, new WidgetPointer(arg0), 0, "Ii"); + setWidgetContextMenuOption(1, "Sort"); + cs2method1305(arg3); + setScriptCallOnClickContextMenu(3148, arg1, "i"); + script_2994(arg0, 1, 11, 11, 0, 0, 1536, 0, 0, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setScriptCallOnMouseEntered(3126, new WidgetPointer(arg0), 1, "Ii"); + setScriptCallOnMouseExit(3127, new WidgetPointer(arg0), 1, "Ii"); + setWidgetContextMenuOption(1, "Sort"); + cs2method1305(arg4); + setScriptCallOnClickContextMenu(3148, arg2, "i"); + return; +} diff --git a/dumps/scripts/3126.cs2 b/dumps/scripts/3126.cs2 new file mode 100644 index 000000000..c5987eac2 --- /dev/null +++ b/dumps/scripts/3126.cs2 @@ -0,0 +1,10 @@ +void script_3126(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (((boolean)arg1)) { + setWidgetSprite(1533); + } else { + setWidgetSprite(1534); + } + } + return; +} diff --git a/dumps/scripts/3127.cs2 b/dumps/scripts/3127.cs2 new file mode 100644 index 000000000..8402f52db --- /dev/null +++ b/dumps/scripts/3127.cs2 @@ -0,0 +1,10 @@ +void script_3127(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (((boolean)arg1)) { + setWidgetSprite(1535); + } else { + setWidgetSprite(1536); + } + } + return; +} diff --git a/dumps/scripts/3128.cs2 b/dumps/scripts/3128.cs2 new file mode 100644 index 000000000..e01346049 --- /dev/null +++ b/dumps/scripts/3128.cs2 @@ -0,0 +1,6 @@ +void script_3128(int arg0,int arg1,int arg2) { + if (((boolean)arg0)) { + script_3135(arg2); + } + return; +} diff --git a/dumps/scripts/3129.cs2 b/dumps/scripts/3129.cs2 new file mode 100644 index 000000000..f29599ff5 --- /dev/null +++ b/dumps/scripts/3129.cs2 @@ -0,0 +1,4 @@ +void script_3129(int arg0,int arg1,int arg2,string arg3) { + script_4701(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/313.cs2 b/dumps/scripts/313.cs2 new file mode 100644 index 000000000..1d4918f08 --- /dev/null +++ b/dumps/scripts/313.cs2 @@ -0,0 +1,33 @@ +void script_313(int arg0) { + string svar0; + script_333(67371038, 7627330, 15130810, 0, 0); + script_333(67371041, 13022863, 15130810, 0, 0); + setWidgetSprite(4129, new WidgetPointer(1028,118)); + setWidgetSprite(4129, new WidgetPointer(1028,120)); + script_2741(); + setScriptCallOnClickContextMenu(353, 1, "1", new WidgetPointer(1028,115)); + setScriptCallOnClickContextMenu(353, 0, "1", new WidgetPointer(1028,116)); + setScriptCallOnClickContextMenu(350, -2147483644, 0, "i1", new WidgetPointer(1028,38)); + setScriptCallOnClickContextMenu(350, -2147483644, 1, "i1", new WidgetPointer(1028,39)); + script_385(-1); + svar0 = cs2method2801(1, new WidgetPointer(1028,102)); + script_368(67371110, add(getTextWidth(495, svar0), 30), svar0, ""); + setScriptCallOnClickContextMenu(358, -2147483644, "i", new WidgetPointer(1028,102)); + setScriptCallOnClickContextMenu(354, -2147483644, 0, "ii", new WidgetPointer(1028,95)); + setScriptCallOnClickContextMenu(354, -2147483644, 1, "ii", new WidgetPointer(1028,96)); + setScriptCallOnClickContextMenu(354, -2147483644, 2, "ii", new WidgetPointer(1028,100)); + setScriptCallOnClickContextMenu(354, -2147483644, 3, "ii", new WidgetPointer(1028,97)); + setScriptCallOnClickContextMenu(354, -2147483644, 6, "ii", new WidgetPointer(1028,98)); + setScriptCallOnClickContextMenu(354, -2147483644, 7, "ii", new WidgetPointer(1028,99)); + setWidgetSelfFull(new WidgetPointer(1028,112)); + setWidget3DRotation(-30, 135, 18, 4, 0, 325, new WidgetPointer(1028,112)); + setWidget3DRotation(-30, 135, 18, 4, 0, 325, new WidgetPointer(1028,113)); + globalint_196 = bitconfig_8093; + globalint_197 = bitconfig_8089; + globalint_86 = bitconfig_8090; + globalint_1020 = bitconfig_6501; + script_386(0); + setScriptCallOnConfigChange(315, 1158, 1363, 2, "Y", new WidgetPointer(arg0)); + setScriptCallOnGlobalConfigChange(349, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 12, "Y", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3130.cs2 b/dumps/scripts/3130.cs2 new file mode 100644 index 000000000..e946310ab --- /dev/null +++ b/dumps/scripts/3130.cs2 @@ -0,0 +1,18 @@ +void script_3130(int arg0,int arg1,int arg2,int arg3) { + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + if ((globalint_998 == arg3) || (globalint_999 == arg3)) { + setWidgetSprite(1542); + } else { + setWidgetSprite(1546); + } + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetIsHidden(false, new WidgetPointer(910,65)); + setWidgetIsHidden(false, new WidgetPointer(910,66)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,65)), getWidgetActualY(), 0, 0, new WidgetPointer(910,65)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,66)), getWidgetActualY(), 0, 0, new WidgetPointer(910,66)); + } + setWidgetRGB(new Color(96, 96, 96), new WidgetPointer(910,66)); + setWidgetRGB(new Color(64, 64, 64), new WidgetPointer(910,65)); + return; +} diff --git a/dumps/scripts/3131.cs2 b/dumps/scripts/3131.cs2 new file mode 100644 index 000000000..1ef8a2720 --- /dev/null +++ b/dumps/scripts/3131.cs2 @@ -0,0 +1,11 @@ +void script_3131(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetIsHidden(false, new WidgetPointer(910,65)); + setWidgetIsHidden(false, new WidgetPointer(910,66)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,65)), getWidgetActualY(), 0, 0, new WidgetPointer(910,65)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,66)), getWidgetActualY(), 0, 0, new WidgetPointer(910,66)); + } + setWidgetRGB(new Color(64, 64, 64), new WidgetPointer(910,66)); + setWidgetRGB(new Color(96, 96, 96), new WidgetPointer(910,65)); + return; +} diff --git a/dumps/scripts/3132.cs2 b/dumps/scripts/3132.cs2 new file mode 100644 index 000000000..99be29545 --- /dev/null +++ b/dumps/scripts/3132.cs2 @@ -0,0 +1,12 @@ +void script_3132(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if ((globalint_998 == arg2) || (globalint_999 == arg2)) { + setWidgetSprite(1541); + } else { + setWidgetSprite(1545); + } + } + setWidgetIsHidden(true, new WidgetPointer(910,65)); + setWidgetIsHidden(true, new WidgetPointer(910,66)); + return; +} diff --git a/dumps/scripts/3133.cs2 b/dumps/scripts/3133.cs2 new file mode 100644 index 000000000..1e821b448 --- /dev/null +++ b/dumps/scripts/3133.cs2 @@ -0,0 +1,5 @@ +void script_3133() { + setWidgetIsHidden(true, new WidgetPointer(910,65)); + setWidgetIsHidden(true, new WidgetPointer(910,66)); + return; +} diff --git a/dumps/scripts/3134.cs2 b/dumps/scripts/3134.cs2 new file mode 100644 index 000000000..518cfddc2 --- /dev/null +++ b/dumps/scripts/3134.cs2 @@ -0,0 +1,4 @@ +void script_3134(int arg0) { + script_3135(arg0); + return; +} diff --git a/dumps/scripts/3135.cs2 b/dumps/scripts/3135.cs2 new file mode 100644 index 000000000..e52a4f612 --- /dev/null +++ b/dumps/scripts/3135.cs2 @@ -0,0 +1,8 @@ +void script_3135(int arg0) { + if ((globalint_998 == arg0) || (globalint_999 == arg0)) { + script_3139(arg0); + } else { + script_3137(arg0); + } + return; +} diff --git a/dumps/scripts/3136.cs2 b/dumps/scripts/3136.cs2 new file mode 100644 index 000000000..078864ab2 --- /dev/null +++ b/dumps/scripts/3136.cs2 @@ -0,0 +1,4 @@ +void script_3136(int arg0) { + script_3137(arg0); + return; +} diff --git a/dumps/scripts/3137.cs2 b/dumps/scripts/3137.cs2 new file mode 100644 index 000000000..aa4a6f957 --- /dev/null +++ b/dumps/scripts/3137.cs2 @@ -0,0 +1,25 @@ +void script_3137(int arg0) { + string svar0; + if ((globalint_998 > 0) && (globalint_999 > 0)) { + script_3143(1, "Please delete one of your existing favourite worlds before setting another."); + return; + } + if (globalint_998 < 1) { + script_1857(arg0); + } else { + if (globalint_999 < 1) { + script_1858(arg0); + } + } + globalint_998 = script_1853(); + globalint_999 = script_1854(); + script_3113(); + svar0 = "Your changes cannot be saved because" + "
" + "you are using the unsigned client."; + if (((boolean)cs2method5420())) { + script_3143(1, svar0); + } else { + script_3143(0, "World " + intToStr(arg0) + " has been added to your favourites."); + } + script_3065(1); + return; +} diff --git a/dumps/scripts/3138.cs2 b/dumps/scripts/3138.cs2 new file mode 100644 index 000000000..b2a9156ba --- /dev/null +++ b/dumps/scripts/3138.cs2 @@ -0,0 +1,4 @@ +void script_3138(int arg0) { + script_3139(arg0); + return; +} diff --git a/dumps/scripts/3139.cs2 b/dumps/scripts/3139.cs2 new file mode 100644 index 000000000..963db03d3 --- /dev/null +++ b/dumps/scripts/3139.cs2 @@ -0,0 +1,22 @@ +void script_3139(int arg0) { + string svar0; + if (globalint_998 == arg0) { + script_1857(script_1854()); + script_1858(0); + } else { + if (globalint_999 == arg0) { + script_1858(0); + } + } + globalint_998 = script_1853(); + globalint_999 = script_1854(); + script_3113(); + svar0 = "Your changes cannot be saved because" + "
" + "you are using the unsigned client."; + if (((boolean)cs2method5420())) { + script_3143(1, svar0); + } else { + script_3143(0, "World " + intToStr(arg0) + " has been removed from your favourites."); + } + script_3065(1); + return; +} diff --git a/dumps/scripts/314.cs2 b/dumps/scripts/314.cs2 new file mode 100644 index 000000000..17c3d279e --- /dev/null +++ b/dumps/scripts/314.cs2 @@ -0,0 +1,8 @@ +void script_314(int arg0) { + if (globalint_179 != -1) { + setWidgetModel(globalint_179, new WidgetPointer(arg0)); + } else { + setWidgetModel(18535, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3140.cs2 b/dumps/scripts/3140.cs2 new file mode 100644 index 000000000..4f3103a37 --- /dev/null +++ b/dumps/scripts/3140.cs2 @@ -0,0 +1,4 @@ +void script_3140(int arg0,string arg1) { + script_3141(arg0, arg1); + return; +} diff --git a/dumps/scripts/3141.cs2 b/dumps/scripts/3141.cs2 new file mode 100644 index 000000000..cdfa96016 --- /dev/null +++ b/dumps/scripts/3141.cs2 @@ -0,0 +1,10 @@ +void script_3141(int arg0,string arg1) { + if (setWorldHost(arg0, arg1)) { + globalint_547 = 0; + script_3143(0, "Switched to game world " + intToStr(arg0)); + } else { + script_3143(1, "Sorry, we couldn't contact world " + intToStr(arg0) + "." + "
" + "Please choose a different world."); + } + script_3116(); + return; +} diff --git a/dumps/scripts/3142.cs2 b/dumps/scripts/3142.cs2 new file mode 100644 index 000000000..ea4392eba --- /dev/null +++ b/dumps/scripts/3142.cs2 @@ -0,0 +1,4 @@ +void script_3142(int arg0,string arg1) { + script_3143(arg0, arg1); + return; +} diff --git a/dumps/scripts/3143.cs2 b/dumps/scripts/3143.cs2 new file mode 100644 index 000000000..d056d4a4e --- /dev/null +++ b/dumps/scripts/3143.cs2 @@ -0,0 +1,11 @@ +void script_3143(int arg0,string arg1) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(910,8)); + } else { + if (((boolean)arg0)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(910,8)); + } + } + setWidgetText(new WidgetPointer(910,8), arg1); + return; +} diff --git a/dumps/scripts/3144.cs2 b/dumps/scripts/3144.cs2 new file mode 100644 index 000000000..632834085 --- /dev/null +++ b/dumps/scripts/3144.cs2 @@ -0,0 +1,25 @@ +void script_3144(int arg0,int arg1,int arg2,int arg3,string arg4) { + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + setWidgetIsHidden(false, new WidgetPointer(910,65)); + setWidgetIsHidden(false, new WidgetPointer(910,66)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,65)), getWidgetActualY(), 0, 0, new WidgetPointer(910,65)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(910,66)), getWidgetActualY(), 0, 0, new WidgetPointer(910,66)); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + if (getWidgetSpriteId() == 1541) { + setWidgetSprite(1542); + } else { + if (getWidgetSpriteId() == 1545) { + setWidgetSprite(1546); + } + } + } + if (((boolean)arg3)) { + setWidgetRGB(new Color(96, 96, 96), new WidgetPointer(910,65)); + setWidgetRGB(new Color(64, 64, 64), new WidgetPointer(910,66)); + } else { + setWidgetRGB(new Color(96, 96, 96), new WidgetPointer(910,66)); + setWidgetRGB(new Color(64, 64, 64), new WidgetPointer(910,65)); + } + return; +} diff --git a/dumps/scripts/3145.cs2 b/dumps/scripts/3145.cs2 new file mode 100644 index 000000000..ea4108e6c --- /dev/null +++ b/dumps/scripts/3145.cs2 @@ -0,0 +1,14 @@ +void script_3145(int arg0,int arg1,int arg2,int arg3) { + setWidgetIsHidden(true, new WidgetPointer(910,65)); + setWidgetIsHidden(true, new WidgetPointer(910,66)); + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + if (getWidgetSpriteId() == 1542) { + setWidgetSprite(1541); + } else { + if (getWidgetSpriteId() == 1546) { + setWidgetSprite(1545); + } + } + } + return; +} diff --git a/dumps/scripts/3146.cs2 b/dumps/scripts/3146.cs2 new file mode 100644 index 000000000..d1d75611d --- /dev/null +++ b/dumps/scripts/3146.cs2 @@ -0,0 +1,4 @@ +void script_3146() { + setWidgetSprite(2656, new WidgetPointer(910,6)); + return; +} diff --git a/dumps/scripts/3147.cs2 b/dumps/scripts/3147.cs2 new file mode 100644 index 000000000..9e67ead6b --- /dev/null +++ b/dumps/scripts/3147.cs2 @@ -0,0 +1,4 @@ +void script_3147() { + setWidgetSprite(2655, new WidgetPointer(910,6)); + return; +} diff --git a/dumps/scripts/3148.cs2 b/dumps/scripts/3148.cs2 new file mode 100644 index 000000000..e54233e7d --- /dev/null +++ b/dumps/scripts/3148.cs2 @@ -0,0 +1,96 @@ +void script_3148(int arg0) { + int ivar1; + ivar1 = script_1851(); + if (ivar1 == arg0) { + return; + } + switch (arg0) { + case 0: + if (((boolean)ivar1)) { + script_1855(0); + script_3113(); + return; + } + break; + case 2: + if (ivar1 == 3) { + script_1855(2); + script_3113(); + return; + } + break; + case 4: + if (ivar1 == 5) { + script_1855(4); + script_3113(); + return; + } + break; + case 6: + if (ivar1 == 7) { + script_1855(6); + script_3113(); + return; + } + break; + case 8: + if (ivar1 == 9) { + script_1855(8); + script_3113(); + return; + } + break; + case 10: + if (ivar1 == 11) { + script_1855(10); + script_3113(); + return; + } + break; + case 1: + if (((boolean)ivar1)) { + script_1855(1); + script_3113(); + return; + } + break; + case 3: + if (ivar1 == 2) { + script_1855(3); + script_3113(); + return; + } + break; + case 5: + if (ivar1 == 4) { + script_1855(5); + script_3113(); + return; + } + break; + case 7: + if (ivar1 == 6) { + script_1855(7); + script_3113(); + return; + } + break; + case 9: + if (ivar1 == 8) { + script_1855(9); + script_3113(); + return; + } + break; + case 11: + if (ivar1 == 10) { + script_1855(11); + script_3113(); + return; + } + } + script_1856(ivar1); + script_1855(arg0); + script_3113(); + return; +} diff --git a/dumps/scripts/3149.cs2 b/dumps/scripts/3149.cs2 new file mode 100644 index 000000000..28d22b87a --- /dev/null +++ b/dumps/scripts/3149.cs2 @@ -0,0 +1,4 @@ +void script_3149(int arg0,int arg1,string arg2) { + script_3150(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/315.cs2 b/dumps/scripts/315.cs2 new file mode 100644 index 000000000..a896e9cca --- /dev/null +++ b/dumps/scripts/315.cs2 @@ -0,0 +1,23 @@ +void script_315() { + int ivar0; + ivar0 = -1; + if ((bitconfig_8093 != globalint_196) || (globalint_197 != bitconfig_8089)) { + ivar0 = script_734(bitconfig_8093); + globalint_196 = bitconfig_8093; + globalint_197 = bitconfig_8089; + script_387(ivar0); + globalint_86 = bitconfig_8090; + script_390(ivar0); + } else { + if (globalint_86 != bitconfig_8090) { + globalint_86 = bitconfig_8090; + script_390(script_734(globalint_196)); + } + } + if (globalint_1020 != bitconfig_6501) { + globalint_1020 = bitconfig_6501; + script_391(); + } + script_2741(); + return; +} diff --git a/dumps/scripts/3150.cs2 b/dumps/scripts/3150.cs2 new file mode 100644 index 000000000..6bc0a02e6 --- /dev/null +++ b/dumps/scripts/3150.cs2 @@ -0,0 +1,10 @@ +void script_3150(int arg0,int arg1,string arg2) { + if (arg1 < 0) { + setScriptCallOnMouseOver(3151, new WidgetPointer(arg0), arg1, add(getClientCycle(), 25), arg2, -2147483647, -2147483646, "Iiisii", new WidgetPointer(arg0)); + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMouseOver(3151, new WidgetPointer(arg0), arg1, add(getClientCycle(), 25), arg2, -2147483647, -2147483646, "Iiisii"); + } + } + return; +} diff --git a/dumps/scripts/3151.cs2 b/dumps/scripts/3151.cs2 new file mode 100644 index 000000000..22902d629 --- /dev/null +++ b/dumps/scripts/3151.cs2 @@ -0,0 +1,4 @@ +void script_3151(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + script_3152(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/3152.cs2 b/dumps/scripts/3152.cs2 new file mode 100644 index 000000000..80192be89 --- /dev/null +++ b/dumps/scripts/3152.cs2 @@ -0,0 +1,44 @@ +void script_3152(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = arg0; + if (getClientCycle() > arg2) { + setWidgetText(new WidgetPointer(910,17), arg5); + setWidgetSize(add(multiply(getWidgetActualX(new WidgetPointer(910,17)), 2), getTextWidth(495, arg5)), getWidgetActualHeight(new WidgetPointer(910,14)), 0, 0, new WidgetPointer(910,14)); + while (((boolean)ivar7)) { + if (ivar8 == 59637773) { + ivar7 = 1; + } + ivar5 = add(ivar5, getWidgetActualX(new WidgetPointer(ivar8))); + ivar6 = add(ivar6, getWidgetActualY(new WidgetPointer(ivar8))); + ivar8 = getWidgetParentId(new WidgetPointer(ivar8)); + } + if ((arg1 > -1) && setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar5 = add(ivar5, getWidgetActualX()); + ivar6 = add(ivar6, getWidgetActualY()); + } + ivar5 = add(add(ivar5, arg3), 3); + ivar6 = subtract(subtract(add(ivar6, arg4), 3), getWidgetActualHeight(new WidgetPointer(910,14))); + if (add(ivar5, getWidgetActualWidth(new WidgetPointer(910,14))) > getWidgetActualWidth(new WidgetPointer(910,0))) { + ivar5 = subtract(getWidgetActualWidth(new WidgetPointer(910,0)), getWidgetActualWidth(new WidgetPointer(910,14))); + } + if (ivar6 < 0) { + ivar6 = 0; + } + setWidgetPosition(ivar5, ivar6, 0, 0, new WidgetPointer(910,14)); + setWidgetIsHidden(false, new WidgetPointer(910,14)); + if (arg1 < 0) { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMouseOver(-1, ""); + } + } + } + return; +} diff --git a/dumps/scripts/3153.cs2 b/dumps/scripts/3153.cs2 new file mode 100644 index 000000000..ce31928ba --- /dev/null +++ b/dumps/scripts/3153.cs2 @@ -0,0 +1,11 @@ +void script_3153(int arg0,int arg1) { + setWidgetIsHidden(true, new WidgetPointer(910,14)); + if (arg1 < 0) { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMouseOver(-1, ""); + } + } + return; +} diff --git a/dumps/scripts/3154.cs2 b/dumps/scripts/3154.cs2 new file mode 100644 index 000000000..4d924cec9 --- /dev/null +++ b/dumps/scripts/3154.cs2 @@ -0,0 +1,4 @@ +void script_3154(int arg0) { + script_3155(arg0); + return; +} diff --git a/dumps/scripts/3155.cs2 b/dumps/scripts/3155.cs2 new file mode 100644 index 000000000..1e85cefe3 --- /dev/null +++ b/dumps/scripts/3155.cs2 @@ -0,0 +1,8 @@ +void script_3155(int arg0) { + script_2994(arg0, 0, 16, 16, 0, 0, 1547, 0, 0, 0, 0); + setScriptCallOnMouseEntered(3156, new WidgetPointer(arg0), "I"); + setScriptCallOnMouseExit(3157, new WidgetPointer(arg0), "I"); + script_2994(arg0, 1, 16, 16, 0, 0, 1548, 0, 0, 0, 0); + setWidgetHidden(1); + return; +} diff --git a/dumps/scripts/3156.cs2 b/dumps/scripts/3156.cs2 new file mode 100644 index 000000000..81a711011 --- /dev/null +++ b/dumps/scripts/3156.cs2 @@ -0,0 +1,6 @@ +void script_3156(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetHidden(0); + } + return; +} diff --git a/dumps/scripts/3157.cs2 b/dumps/scripts/3157.cs2 new file mode 100644 index 000000000..17d558f38 --- /dev/null +++ b/dumps/scripts/3157.cs2 @@ -0,0 +1,6 @@ +void script_3157(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetHidden(1); + } + return; +} diff --git a/dumps/scripts/3158.cs2 b/dumps/scripts/3158.cs2 new file mode 100644 index 000000000..5750b67ab --- /dev/null +++ b/dumps/scripts/3158.cs2 @@ -0,0 +1,8 @@ +void script_3158() { + script_2595(2); + script_1217(59703337, 59703338); + script_1216(59703343, 59703344); + script_1218(59703331, 59703332); + script_1220(59703316, 59703314); + return; +} diff --git a/dumps/scripts/3159.cs2 b/dumps/scripts/3159.cs2 new file mode 100644 index 000000000..1e58dc553 --- /dev/null +++ b/dumps/scripts/3159.cs2 @@ -0,0 +1,32 @@ +void script_3159(int arg0) { + setWidgetSize(subtract(getWidgetActualX(new WidgetPointer(912,38)), getWidgetActualX(new WidgetPointer(912,36))), 0, 0, 1, new WidgetPointer(912,49)); + setWidgetSize(subtract(subtract(getWidgetActualWidth(new WidgetPointer(912,45)), getWidgetActualWidth(new WidgetPointer(912,49))), 2), 0, 0, 1, new WidgetPointer(912,51)); + setWidgetScrollMax(0, 0, new WidgetPointer(912,45)); + cs2method2100(0, 0, new WidgetPointer(912,45)); + script_31(59768878, 59768877, 792, 789, 790, 791, 773, 788); + setWidgetScrollMax(0, 0, new WidgetPointer(912,20)); + cs2method2100(0, 0, new WidgetPointer(912,20)); + script_31(59768853, 59768852, 792, 789, 790, 791, 773, 788); + setScriptCallOnClanChatSettingsStuff(3164, new WidgetPointer(912,49), new WidgetPointer(912,50), new WidgetPointer(912,51), new WidgetPointer(912,47), new WidgetPointer(912,45), new WidgetPointer(912,46), "IIIIII", new WidgetPointer(912,45)); + setScriptCallOnClanChatDeltaStuff(3164, new WidgetPointer(912,49), new WidgetPointer(912,50), new WidgetPointer(912,51), new WidgetPointer(912,47), new WidgetPointer(912,45), new WidgetPointer(912,46), "IIIIII", new WidgetPointer(912,45)); + if (cs2method3751()) { + setWidgetIsHidden(true, new WidgetPointer(912,39)); + script_3165(59768881, 59768882, 59768883, 59768879, 59768877, 59768878); + if (isWidgetHidden(new WidgetPointer(906,189))) { + script_3161(1); + } else { + script_3161(0); + } + } else { + setWidgetIsHidden(false, new WidgetPointer(912,39)); + script_3161(0); + } + globalstring_278 = ""; + script_3024(59768860); + script_3027(59768840); + globalint_1098 = strLength(globalstring_278); + setScriptCallOnMousePressed(1335, -2147483647, new WidgetPointer(912,24), new WidgetPointer(912,25), "iII", new WidgetPointer(912,24)); + script_1390(59768856, 59768857, globalstring_278); + setWidgetIsHidden(true, new WidgetPointer(912,25)); + return; +} diff --git a/dumps/scripts/316.cs2 b/dumps/scripts/316.cs2 new file mode 100644 index 000000000..ae86cd841 --- /dev/null +++ b/dumps/scripts/316.cs2 @@ -0,0 +1,4 @@ +void script_316() { + script_304(44960851); + return; +} diff --git a/dumps/scripts/3160.cs2 b/dumps/scripts/3160.cs2 new file mode 100644 index 000000000..f0f5f6a90 --- /dev/null +++ b/dumps/scripts/3160.cs2 @@ -0,0 +1,53 @@ +void script_3160(int arg0,int arg1) { + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_802_struct(1,1,0) structdump_5; + if (cs2method6900() || ((boolean)script_5280())) { + return; + } + switch (arg0) { + case 84: + if (cs2method3751()) { + if (strLength(globalstring_278) > 0) { + cs2method5006(2); + cs2method5008(globalstring_278); + } + } else { + message(43, 0, "You are not in a Clan."); + } + globalstring_278 = ""; + setWidgetText(new WidgetPointer(912,24), replaceLtGt(globalstring_278)); + globalint_1098 = strLength(globalstring_278); + script_1390(59768856, 59768857, globalstring_278); + break; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1098 = script_1553(arg0, globalint_1098, globalstring_278); + script_1390(59768856, 59768857, globalstring_278); + break; + case 85: + case 101: + case -1: + if ((isValidChar(((char)arg1)) || (arg0 == 85)) || (arg0 == 101)) { + stack_dump0 = globalint_1098; + stack_dump1 = 0; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_278; + structdump_5 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_5.stringpart_0; + globalint_1098 = structdump_5.intpart_0; + globalstring_278 = stack_dump4; + setWidgetText(new WidgetPointer(912,24), replaceLtGt(globalstring_278)); + script_1390(59768856, 59768857, globalstring_278); + } + } + return; +} diff --git a/dumps/scripts/3161.cs2 b/dumps/scripts/3161.cs2 new file mode 100644 index 000000000..8a5bda874 --- /dev/null +++ b/dumps/scripts/3161.cs2 @@ -0,0 +1,11 @@ +void script_3161(int arg0) { + if (((boolean)arg0) && cs2method6900()) { + setScriptCallOnKeyPress(3160, -2147483640, false, "iz", new WidgetPointer(912,23)); + setScriptCallOnGameloop(1391, getClientCycle(), new WidgetPointer(912,25), "iI", new WidgetPointer(912,24)); + } else { + setScriptCallOnKeyPress(-1, "", new WidgetPointer(912,23)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(912,24)); + setWidgetText(new WidgetPointer(912,24), replaceLtGt(globalstring_278)); + } + return; +} diff --git a/dumps/scripts/3162.cs2 b/dumps/scripts/3162.cs2 new file mode 100644 index 000000000..afd0cbaac --- /dev/null +++ b/dumps/scripts/3162.cs2 @@ -0,0 +1,4 @@ +void script_3162() { + script_3184(); + return; +} diff --git a/dumps/scripts/3163.cs2 b/dumps/scripts/3163.cs2 new file mode 100644 index 000000000..ab4472cf8 --- /dev/null +++ b/dumps/scripts/3163.cs2 @@ -0,0 +1,8 @@ +void script_3163() { + if (cs2method3612() > 0) { + sendUnknownVarByteEmptyFriendPacketMethod3620(); + } else { + script_3015(8, "Join Chat Channel", "", "", ""); + } + return; +} diff --git a/dumps/scripts/3164.cs2 b/dumps/scripts/3164.cs2 new file mode 100644 index 000000000..3d6c8fe31 --- /dev/null +++ b/dumps/scripts/3164.cs2 @@ -0,0 +1,14 @@ +void script_3164(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (cs2method3751()) { + script_3165(arg0, arg1, arg2, arg3, arg4, arg5); + if (isWidgetHidden(new WidgetPointer(906,189))) { + script_3161(1); + } else { + script_3161(0); + } + } else { + script_4547(arg0, arg1, arg2, arg3, arg4, arg5); + script_3161(0); + } + return; +} diff --git a/dumps/scripts/3165.cs2 b/dumps/scripts/3165.cs2 new file mode 100644 index 000000000..681748a58 --- /dev/null +++ b/dumps/scripts/3165.cs2 @@ -0,0 +1,137 @@ +void script_3165(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + string svar0; + string svar1; + string svar2; + if (cs2method5428(arg3, -1)) { + setScriptCallOnGameloop(3164, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "IIIIII", new WidgetPointer(arg4)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg4)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + ivar6 = 0; + ivar7 = cs2method3755(); + ivar8 = 0; + svar0 = ""; + ivar9 = 15; + ivar10 = 17; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + svar1 = ""; + svar2 = ""; + ivar17 = 0; + ivar18 = script_4468(); + ivar19 = cs2method3760(strRemoveEntities(cs2method5020())); + ivar20 = 0; + if (ivar19 != -1) { + ivar20 = cs2method3757(ivar19); + } + script_1896(); + setWidgetIsHidden(true, new WidgetPointer(912,39)); + setWidgetText(new WidgetPointer(912,17), cs2method3752()); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(912,38)), 4, 0, 1, new WidgetPointer(912,38)); + while (ivar8 < ivar7) { + ivar16 = cs2method3757(ivar8); + svar2 = cs2method3756(ivar8); + svar0 = svar2; + script_2996(arg3, ivar8, getWidgetActualWidth(new WidgetPointer(arg3)), ivar9, 0, ivar12, 0, 1, 0); + if (((boolean)mod(ivar8, 2))) { + setWidgetRGB(new Color(32, 25, 17)); + } else { + setWidgetRGB(new Color(41, 32, 22)); + } + svar1 = "Rank: " + cs2method_3408(105, 115, 3715, ivar16); + setScriptCallOnMouseEntered(3167, new WidgetPointer(arg3), ivar8, svar1, "Iis"); + setScriptCallOnMouseExit(3169, new WidgetPointer(arg3), ivar8, "Ii"); + if (cs2method3760(strRemoveEntities(cs2method5020())) != ivar8) { + setScriptCallOnClickContextMenu(3170, svar2, -2147483644, "si"); + if (isFriend(strRemoveEntities(svar2))) { + setWidgetContextMenuOption(8, "Remove friend " + svar0); + } else if (cs2method3623(strRemoveEntities(svar2))) { + setWidgetContextMenuOption(9, "Remove ignore " + svar0); + } else { + setWidgetContextMenuOption(6, "Add friend " + svar0); + setWidgetContextMenuOption(7, "Add ignore " + svar0); + } + } + if (((boolean)ivar18) && (ivar20 > ivar16)) { + setWidgetContextMenuOption(10, "Kick/ban " + svar0); + } + script_2994(arg1, ivar8, 9, 9, 5, add(ivar12, 2), cs2method_3408(105, 100, 3712, ivar16), 0, 0, 0, 0); + script_2995(arg0, ivar8, 0, ivar9, ivar10, ivar12, 16777215, 494, 0, 1, 0, 1, svar0); + setWidgetSize(ivar10, ivar9, 1, 0); + cs2method1126(1); + ivar13 = cs2method3758(ivar8); + if (((boolean)ivar13)) { + svar0 = "Offline"; + ivar11 = 16711680; + } else { + if (ivar13 >= 1100) { + svar0 = "Lobby " + intToStr(subtract(ivar13, 1099)); + } else { + svar0 = "World " + intToStr(ivar13); + } + if (ivar13 == getWorldId()) { + ivar11 = 65280; + } else { + ivar11 = 16776960; + } + } + script_2995(arg2, ivar8, 0, ivar9, 5, ivar12, ivar11, 494, 0, 1, 0, 1, svar0); + setWidgetSize(5, ivar9, 1, 0); + cs2method1126(1); + ivar12 = add(ivar12, ivar9); + ivar8 = add(ivar8, 1); + } + ivar14 = add(divide(getWidgetActualHeight(new WidgetPointer(arg4)), ivar9), 1); + if (ivar14 > ivar7) { + while (ivar8 < ivar14) { + script_2996(arg3, ivar8, getWidgetActualWidth(new WidgetPointer(arg3)), ivar9, 0, ivar12, 0, 1, 0); + if (((boolean)mod(ivar8, 2))) { + setWidgetRGB(new Color(32, 25, 17)); + } else { + setWidgetRGB(new Color(41, 32, 22)); + } + ivar12 = add(ivar12, ivar9); + ivar8 = add(ivar8, 1); + } + ivar15 = getWidgetActualHeight(new WidgetPointer(arg4)); + } else { + ivar15 = ivar12; + } + if (ivar14 <= ivar7) { + ivar17 = cs2method2601(new WidgetPointer(912,45)); + setWidgetScrollMax(0, ivar15, new WidgetPointer(912,45)); + if (ivar17 > ivar15) { + ivar17 = ivar15; + } + script_72(59768878, 59768877, ivar17); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(912,45)); + cs2method2100(0, 0, new WidgetPointer(912,45)); + script_72(59768878, 59768877, 0); + } + script_1896(); + return; +} diff --git a/dumps/scripts/3166.cs2 b/dumps/scripts/3166.cs2 new file mode 100644 index 000000000..b239656c6 --- /dev/null +++ b/dumps/scripts/3166.cs2 @@ -0,0 +1,5 @@ +void script_3166(int arg0,string arg1) { + script_2995(arg0, 0, 0, 0, 0, 0, 16777215, 494, 1, 1, 0, 1, arg1); + setWidgetSize(0, 0, 1, 1); + return; +} diff --git a/dumps/scripts/3167.cs2 b/dumps/scripts/3167.cs2 new file mode 100644 index 000000000..b500f8dd4 --- /dev/null +++ b/dumps/scripts/3167.cs2 @@ -0,0 +1,10 @@ +void script_3167(int arg0,int arg1,string arg2) { + int ivar2; + ivar2 = 59768880; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar2)), getWidgetActualY(), 0, 0, new WidgetPointer(ivar2)); + setScriptCallOnMouseOver(3168, new WidgetPointer(arg0), arg1, add(getClientCycle(), 25), arg2, -2147483647, -2147483646, "Iiisii"); + } + return; +} diff --git a/dumps/scripts/3168.cs2 b/dumps/scripts/3168.cs2 new file mode 100644 index 000000000..cb5a120bd --- /dev/null +++ b/dumps/scripts/3168.cs2 @@ -0,0 +1,22 @@ +void script_3168(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int ivar5; + int ivar6; + ivar5 = 0; + ivar6 = 0; + if ((getClientCycle() > arg2) && setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetIsHidden(false, new WidgetPointer(912,30)); + setWidgetText(new WidgetPointer(912,34), arg5); + setWidgetSize(add(multiply(getWidgetActualX(new WidgetPointer(912,34)), 2), getTextWidth(495, arg5)), getWidgetActualHeight(new WidgetPointer(912,30)), 0, 0, new WidgetPointer(912,30)); + ivar5 = subtract(add(add(getWidgetActualX(), arg3), 3), cs2method2600(new WidgetPointer(arg0))); + ivar6 = subtract(subtract(subtract(add(add(add(getWidgetActualY(), arg4), getWidgetActualY(new WidgetPointer(912,36))), getWidgetActualY(new WidgetPointer(912,45))), 3), getWidgetActualHeight(new WidgetPointer(912,30))), cs2method2601(new WidgetPointer(912,45))); + if (add(ivar5, getWidgetActualWidth(new WidgetPointer(912,30))) > getWidgetActualWidth(new WidgetPointer(912,29))) { + ivar5 = subtract(getWidgetActualWidth(new WidgetPointer(912,29)), getWidgetActualWidth(new WidgetPointer(912,30))); + } + if (ivar6 < 0) { + ivar6 = 0; + } + setWidgetPosition(ivar5, ivar6, 0, 0, new WidgetPointer(912,30)); + setScriptCallOnMouseOver(-1, ""); + } + return; +} diff --git a/dumps/scripts/3169.cs2 b/dumps/scripts/3169.cs2 new file mode 100644 index 000000000..a608157f7 --- /dev/null +++ b/dumps/scripts/3169.cs2 @@ -0,0 +1,8 @@ +void script_3169(int arg0,int arg1) { + setWidgetIsHidden(true, new WidgetPointer(912,48)); + setWidgetIsHidden(true, new WidgetPointer(912,30)); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMouseOver(-1, ""); + } + return; +} diff --git a/dumps/scripts/317.cs2 b/dumps/scripts/317.cs2 new file mode 100644 index 000000000..53a4db934 --- /dev/null +++ b/dumps/scripts/317.cs2 @@ -0,0 +1,5 @@ +void script_317(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + script_319(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + setScriptCallOnItemContainerUpdate(318, new WidgetPointer(arg0), arg1, arg2, arg5, arg6, arg7, arg8, arg9, arg10, arg3, arg4, 93, 1, "IiissssssiiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3170.cs2 b/dumps/scripts/3170.cs2 new file mode 100644 index 000000000..1c4b506c2 --- /dev/null +++ b/dumps/scripts/3170.cs2 @@ -0,0 +1,23 @@ +void script_3170(int arg0,string arg1) { + int ivar1; + int ivar2; + ivar1 = -1; + ivar2 = -1; + switch (arg0) { + case 6: + cs2method3605(strRemoveEntities(arg1)); + break; + case 7: + cs2method3607(strRemoveEntities(arg1)); + break; + case 8: + cs2method3606(strRemoveEntities(arg1)); + break; + case 9: + cs2method3608(strRemoveEntities(arg1)); + break; + case 10: + script_4465(arg1); + } + return; +} diff --git a/dumps/scripts/3171.cs2 b/dumps/scripts/3171.cs2 new file mode 100644 index 000000000..9474e1fb7 --- /dev/null +++ b/dumps/scripts/3171.cs2 @@ -0,0 +1,9 @@ +void script_3171(int arg0) { + setScriptCallOnFriendListChange(3172, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnClanListChange(3172, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnMessage(3172, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnClanChatDeltaStuff(3172, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnClanChatSettingsStuff(3172, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + script_3173(arg0); + return; +} diff --git a/dumps/scripts/3172.cs2 b/dumps/scripts/3172.cs2 new file mode 100644 index 000000000..00af88d3d --- /dev/null +++ b/dumps/scripts/3172.cs2 @@ -0,0 +1,4 @@ +void script_3172(int arg0) { + script_3173(arg0); + return; +} diff --git a/dumps/scripts/3173.cs2 b/dumps/scripts/3173.cs2 new file mode 100644 index 000000000..2b6b5443a --- /dev/null +++ b/dumps/scripts/3173.cs2 @@ -0,0 +1,72 @@ +void script_3173(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + string svar1; + string svar2; + string svar3; + script_4548(); + if (cs2method5428(59768852, -1)) { + setScriptCallOnGameloop(3172, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; + } + deleteAllExtraChilds(new WidgetPointer(912,20)); + svar0 = ""; + svar1 = ""; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + svar2 = ""; + svar3 = ""; + while (ivar1 < 100) { + ivar3 = cs2method5004(ivar1); + svar2 = cs2method5010(ivar1); + svar3 = cs2method5019(ivar1); + switch (ivar3) { + case 43: + case 26: + ivar2 = script_3174(ivar2, 0, ivar3, cs2method5003(ivar1), "", ""); + break; + case 41: + case 44: + ivar2 = script_3174(ivar2, 1, ivar3, "[" + svar0 + cs2method5011(ivar1) + "" + "] " + svar2 + ": " + svar1 + cs2method5003(ivar1), svar2, svar3); + break; + case 42: + ivar2 = script_3174(ivar2, 1, ivar3, "[" + svar0 + cs2method5011(ivar1) + "" + "] " + svar2 + ": " + svar1 + cs2method5003(ivar1), svar2, svar3); + break; + case 115: + ivar2 = script_3174(ivar2, 0, ivar3, "" + cs2method5003(ivar1) + "", "", ""); + } + ivar1 = add(ivar1, 1); + } + ivar4 = divide(getWidgetActualHeight(new WidgetPointer(912,20)), 15); + ivar1 = 0; + ivar5 = 0; + if (ivar2 < ivar4) { + ivar5 = subtract(ivar4, ivar2); + while (ivar1 < ivar5) { + ivar2 = script_3174(ivar2, 0, 0, "", "", ""); + ivar1 = add(ivar1, 1); + } + } + ivar6 = 0; + ivar7 = 0; + while (ivar7 <= ivar2) { + if (setWidgetRegister(new WidgetPointer(912,20), ivar7)) { + ivar6 = add(ivar6, getWidgetActualHeight()); + } + ivar7 = add(ivar7, 1); + } + ivar8 = max(ivar6, multiply(ivar4, 15)); + setWidgetScrollMax(0, ivar8, new WidgetPointer(912,20)); + script_72(59768853, 59768852, subtract(add(globalint_1124, getWidgetScrollMaxV(new WidgetPointer(912,20))), globalint_1125)); + globalint_1124 = cs2method2601(new WidgetPointer(912,20)); + globalint_1125 = getWidgetScrollMaxV(new WidgetPointer(912,20)); + return; +} diff --git a/dumps/scripts/3174.cs2 b/dumps/scripts/3174.cs2 new file mode 100644 index 000000000..70f238e38 --- /dev/null +++ b/dumps/scripts/3174.cs2 @@ -0,0 +1,53 @@ +int script_3174(int arg0,int arg1,int arg2,string arg3,string arg4,string arg5) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar3 = getWidgetActualWidth(new WidgetPointer(912,20)); + ivar4 = multiply(max(getLineCount(ivar3, 494, arg3), 1), 15); + createExtraChild(new WidgetPointer(912,20), 4, arg0); + setWidgetPosition(0, multiply(arg0, 15), 0, 2); + setWidgetSize(0, ivar4, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetFont(494); + setWidgetText(arg3); + setWidgetTextAlignment(0, 0, 15); + ivar5 = 0; + ivar6 = 0; + while (ivar6 < arg0) { + if (setWidgetRegister(new WidgetPointer(912,20), ivar6)) { + ivar5 = add(ivar5, getWidgetActualHeight()); + } + ivar6 = add(ivar6, 1); + } + setWidgetPosition(0, ivar5, 0, 2); + if (((boolean)arg1)) { + cs2method1305(strRemoveEntities(arg4)); + setScriptCallOnClickContextMenu(3175, -2147483644, arg4, arg5, "iss"); + switch (arg2) { + case 42: + case 9: + case 41: + case 20: + case 44: + case 45: + if (stringMethod4107(strRemoveEntities(cs2method5020()), strRemoveEntities(arg5)) != 0) { + if (isFriend(strRemoveEntities(arg5)) && cs2method3623(strRemoveEntities(arg5))) { + setWidgetContextMenuOption(1, "Add friend"); + setWidgetContextMenuOption(2, "Add ignore"); + } else { + if (isFriend(strRemoveEntities(arg5)) && cs2method6900()) { + setWidgetContextMenuOption(3, "Message"); + } + } + if ((getClientRights() > 0) || (((int)hasMoreThen5Blackmarks()) > 0)) { + setWidgetContextMenuOption(5, "Report abuse"); + } + if (((boolean)script_4467())) { + setWidgetContextMenuOption(10, "Kick/ban"); + } + } + } + } + return add(arg0, 1); +} diff --git a/dumps/scripts/3175.cs2 b/dumps/scripts/3175.cs2 new file mode 100644 index 000000000..38dafd266 --- /dev/null +++ b/dumps/scripts/3175.cs2 @@ -0,0 +1,27 @@ +void script_3175(int arg0,string arg1,string arg2) { + int ivar1; + int ivar2; + ivar1 = -1; + ivar2 = -1; + switch (arg0) { + case 1: + if (isFriend(strRemoveEntities(arg2))) { + cs2method3605(strRemoveEntities(arg2)); + } + break; + case 2: + if (isFriend(strRemoveEntities(arg2))) { + cs2method3607(strRemoveEntities(arg2)); + } + break; + case 3: + script_3015(0, "Send message to " + arg1, "", arg2, ""); + break; + case 5: + script_3177(0, arg1); + break; + case 10: + script_4465(arg2); + } + return; +} diff --git a/dumps/scripts/3176.cs2 b/dumps/scripts/3176.cs2 new file mode 100644 index 000000000..c6e1c0f56 --- /dev/null +++ b/dumps/scripts/3176.cs2 @@ -0,0 +1,4 @@ +void script_3176(int arg0,string arg1) { + script_3177(arg0, arg1); + return; +} diff --git a/dumps/scripts/3177.cs2 b/dumps/scripts/3177.cs2 new file mode 100644 index 000000000..cb48cb5e7 --- /dev/null +++ b/dumps/scripts/3177.cs2 @@ -0,0 +1,18 @@ +void script_3177(int arg0,string arg1) { + int ivar1; + script_41(59768846); + script_41(59572283); + globalstring_279 = ""; + globalint_6 = arg0; + globalint_1094 = 0; + ivar1 = 0; + if (hasMoreThen5Blackmarks() || (getClientRights() > 0)) { + ivar1 = 1; + } + if (((boolean)getLanguage())) { + script_2921(ivar1, getBlackmarks(), arg1); + } else { + script_2920(ivar1, getBlackmarks(), arg1); + } + return; +} diff --git a/dumps/scripts/3178.cs2 b/dumps/scripts/3178.cs2 new file mode 100644 index 000000000..641ebd0b4 --- /dev/null +++ b/dumps/scripts/3178.cs2 @@ -0,0 +1,10 @@ +void script_3178(int arg0) { + if (((boolean)globalint_6)) { + globalint_6 = 1; + setWidgetSprite(4086, new WidgetPointer(arg0)); + } else { + globalint_6 = 0; + setWidgetSprite(4084, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3179.cs2 b/dumps/scripts/3179.cs2 new file mode 100644 index 000000000..1d8804bbe --- /dev/null +++ b/dumps/scripts/3179.cs2 @@ -0,0 +1,4 @@ +void script_3179() { + script_3180(); + return; +} diff --git a/dumps/scripts/318.cs2 b/dumps/scripts/318.cs2 new file mode 100644 index 000000000..93534d0cf --- /dev/null +++ b/dumps/scripts/318.cs2 @@ -0,0 +1,4 @@ +void script_318(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + script_319(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + return; +} diff --git a/dumps/scripts/3180.cs2 b/dumps/scripts/3180.cs2 new file mode 100644 index 000000000..e727c4ff8 --- /dev/null +++ b/dumps/scripts/3180.cs2 @@ -0,0 +1,9 @@ +void script_3180() { + script_3181(); + closeInterface(59375696); + setWidgetIsHidden(true, new WidgetPointer(906,45)); + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + script_3161(1); + } + return; +} diff --git a/dumps/scripts/3181.cs2 b/dumps/scripts/3181.cs2 new file mode 100644 index 000000000..b3bda8775 --- /dev/null +++ b/dumps/scripts/3181.cs2 @@ -0,0 +1,10 @@ +void script_3181() { + setWidgetText(new WidgetPointer(914,27), ""); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(914,27)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(914,16)); + setWidgetIsHidden(true, new WidgetPointer(914,21)); + setWidgetSprite(4084, new WidgetPointer(914,23)); + globalstring_277 = ""; + globalint_1094 = 0; + return; +} diff --git a/dumps/scripts/3182.cs2 b/dumps/scripts/3182.cs2 new file mode 100644 index 000000000..58939baba --- /dev/null +++ b/dumps/scripts/3182.cs2 @@ -0,0 +1,4 @@ +void script_3182() { + script_3183(); + return; +} diff --git a/dumps/scripts/3183.cs2 b/dumps/scripts/3183.cs2 new file mode 100644 index 000000000..3dfcb294a --- /dev/null +++ b/dumps/scripts/3183.cs2 @@ -0,0 +1,11 @@ +void script_3183() { + if (strLength(globalstring_277) <= 0) { + return; + } + globalstring_279 = globalstring_277; + script_3180(); + if (strLength(globalstring_279) > 0) { + script_3190(); + } + return; +} diff --git a/dumps/scripts/3184.cs2 b/dumps/scripts/3184.cs2 new file mode 100644 index 000000000..395942cd3 --- /dev/null +++ b/dumps/scripts/3184.cs2 @@ -0,0 +1,20 @@ +void script_3184() { + if (((boolean)globalint_1200)) { + setWidgetText(new WidgetPointer(933,277), globalstring_312); + setWidgetText(new WidgetPointer(933,278), cs2method_3408(105, 115, 2857, globalint_1215)); + setWidgetText(new WidgetPointer(933,279), cs2method_3408(105, 115, 2857, globalint_1216)); + setWidgetText(new WidgetPointer(933,280), cs2method_3408(105, 115, 2857, globalint_1217)); + setWidgetText(new WidgetPointer(933,281), cs2method_3408(105, 115, 2857, globalint_1218)); + setWidgetText(new WidgetPointer(933,282), cs2method_3408(105, 115, 2857, globalint_1219)); + setWidgetText(new WidgetPointer(933,283), cs2method_3408(105, 115, 2857, globalint_1220)); + } else { + setWidgetText(new WidgetPointer(933,277), ""); + setWidgetText(new WidgetPointer(933,278), ""); + setWidgetText(new WidgetPointer(933,279), ""); + setWidgetText(new WidgetPointer(933,280), ""); + setWidgetText(new WidgetPointer(933,281), ""); + setWidgetText(new WidgetPointer(933,282), ""); + setWidgetText(new WidgetPointer(933,283), ""); + } + return; +} diff --git a/dumps/scripts/3185.cs2 b/dumps/scripts/3185.cs2 new file mode 100644 index 000000000..87a080a80 --- /dev/null +++ b/dumps/scripts/3185.cs2 @@ -0,0 +1,45 @@ +void script_3185(int arg0,int arg1,int arg2) { + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_802_struct(1,1,0) structdump_5; + switch (arg0) { + case 84: + script_3183(); + return; + case 13: + script_3180(); + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1097 = script_1553(arg0, globalint_1097, globalstring_277); + script_1879(59899931, 59899932, globalstring_277); + return; + case 85: + case 101: + case -1: + if ((isValidChar(((char)arg1)) || (arg0 == 85)) || (arg0 == 101)) { + if ((arg0 == -1) && ((boolean)strLength(strRemoveEntities(concatChar(((char)arg1), ""))))) { + return; + } + stack_dump0 = globalint_1097; + stack_dump1 = 2; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_277; + structdump_5 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_5.stringpart_0; + globalint_1097 = structdump_5.intpart_0; + globalstring_277 = stack_dump4; + setWidgetText(new WidgetPointer(arg2), globalstring_277); + script_1879(59899931, 59899932, globalstring_277); + } + } + return; +} diff --git a/dumps/scripts/3186.cs2 b/dumps/scripts/3186.cs2 new file mode 100644 index 000000000..f939c9b25 --- /dev/null +++ b/dumps/scripts/3186.cs2 @@ -0,0 +1,7 @@ +void script_3186(int arg0,int arg1) { + setWidgetSize(getTextWidth(2710, getWidgetText(new WidgetPointer(arg1))), 0, 0, 1, new WidgetPointer(arg1)); + setWidgetPosition(40, 0, 2, 1, new WidgetPointer(arg1)); + setWidgetSize(38, 31, 0, 0, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3187.cs2 b/dumps/scripts/3187.cs2 new file mode 100644 index 000000000..485160c8c --- /dev/null +++ b/dumps/scripts/3187.cs2 @@ -0,0 +1,6 @@ +void script_3187(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + ivar7 = getTextWidth(2710, getWidgetText(new WidgetPointer(arg1))); + setScriptCallOnGameloop(3188, new WidgetPointer(arg0), arg2, ivar7, new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), "I1iIIII", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3188.cs2 b/dumps/scripts/3188.cs2 new file mode 100644 index 000000000..be0ccfb47 --- /dev/null +++ b/dumps/scripts/3188.cs2 @@ -0,0 +1,28 @@ +void script_3188(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + ivar7 = getWidgetActualWidth(new WidgetPointer(arg0)); + if (((boolean)arg1)) { + if (subtract(ivar7, arg2) < 55) { + setWidgetSize(min(add(ivar7, 5), add(55, arg2)), 31, 0, 0, new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetSize(add(55, arg2), 31, 0, 0, new WidgetPointer(arg0)); + } + setWidgetSprite(2569, new WidgetPointer(arg3)); + setWidgetSprite(2568, new WidgetPointer(arg4)); + setWidgetSprite(2568, new WidgetPointer(arg5)); + setWidgetSprite(2614, new WidgetPointer(arg6)); + } else { + if (ivar7 > 38) { + setWidgetSize(max(subtract(ivar7, 5), 38), 31, 0, 0, new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetSize(38, 31, 0, 0, new WidgetPointer(arg0)); + } + setWidgetSprite(2567, new WidgetPointer(arg3)); + setWidgetSprite(2566, new WidgetPointer(arg4)); + setWidgetSprite(2566, new WidgetPointer(arg5)); + setWidgetSprite(2613, new WidgetPointer(arg6)); + } + return; +} diff --git a/dumps/scripts/3189.cs2 b/dumps/scripts/3189.cs2 new file mode 100644 index 000000000..947f81790 --- /dev/null +++ b/dumps/scripts/3189.cs2 @@ -0,0 +1,4 @@ +void script_3189() { + script_3190(); + return; +} diff --git a/dumps/scripts/319.cs2 b/dumps/scripts/319.cs2 new file mode 100644 index 000000000..759288870 --- /dev/null +++ b/dumps/scripts/319.cs2 @@ -0,0 +1,89 @@ +void script_319(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + string svar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar5 = 0; + ivar6 = 0; + setWidgetScrollMax(0, multiply(add(divide(subtract(arg4, arg3), arg1), 1), 57), new WidgetPointer(arg0)); + ivar7 = 0; + ivar8 = 1; + ivar9 = 0; + ivar10 = 0; + ivar11 = -1; + svar6 = "hello"; + ivar12 = 0; + globalarray_0 = new int[10]; + ivar13 = -1; + ivar14 = 0; + ivar15 = 0; + while (ivar7 <= subtract(arg4, arg3)) { + flow_1: + ivar5 = add(add(16, multiply(mod(ivar7, arg1), 48)), multiply(mod(ivar7, arg1), 5)); + ivar6 = add(multiply(divide(ivar7, arg1), 52), multiply(divide(ivar7, arg1), 5)); + createExtraChild(new WidgetPointer(arg0), 5, ivar15); + ivar15 = add(ivar15, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2205); + setScriptCallOnMouseEntered(2724, new WidgetPointer(-32768,3), ivar15, 0, "Ii1"); + setScriptCallOnMouseExit(2724, new WidgetPointer(-32768,3), ivar15, 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, ivar15); + ivar15 = add(ivar15, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar15); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar5, 6), add(ivar6, 4), 0, 0); + ivar13 = cs2method_3408(105, 111, 1182, ivar8); + ivar14 = cs2method_3408(111, 105, 1185, getRealItem(ivar13)); + IF (ivar13 == 12292) + GOTO flow_3 + GOTO flow_4 + flow_3: + script_760(ivar13, ivar13, arg0, ivar15, arg5, arg6, arg7, arg8, arg9, arg10); + GOTO flow_8 + flow_4: + IF (getItemAmtInContainer(93, ivar13) > 0) + GOTO flow_5 + IF ((getItemAmtInContainer(93, getNotedItem(ivar13)) > 0) && (getSkillActualLvl(23) >= cs2method_3408(105, 105, 1472, ivar14))) + GOTO flow_6 + GOTO flow_7 + flow_5: + flow_6: + script_760(ivar13, ivar13, arg0, ivar15, arg5, arg6, arg7, arg8, arg9, arg10); + GOTO flow_8 + flow_7: + script_760(cs2method_3408(105, 111, 1183, ivar8), ivar13, arg0, ivar15, arg5, arg6, arg7, arg8, arg9, arg10); + flow_8: + ivar15 = add(ivar15, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar15); + ivar15 = add(ivar15, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar5, 2), add(ivar6, 38), 0, 0); + setItemOnWidgetMethod1205(12183, 1); + createExtraChild(new WidgetPointer(arg0), 4, ivar15); + ivar15 = add(ivar15, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar5, 13), add(ivar6, 39), 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetTextAlignment(2, 1, 0); + setWidgetText(script_940(getItemHashmapData(ivar13, 457))); + setWidgetUnknownBoolean(true); + ivar7 = add(ivar7, 1); + ivar8 = add(ivar8, 1); + } + return; +} diff --git a/dumps/scripts/3190.cs2 b/dumps/scripts/3190.cs2 new file mode 100644 index 000000000..4b04a0eb1 --- /dev/null +++ b/dumps/scripts/3190.cs2 @@ -0,0 +1,30 @@ +void script_3190() { + openInterface(59375688, 915); + setWidgetIsHidden(false, new WidgetPointer(906,55)); + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + script_3161(0); + } + if (strLength(globalstring_279) > 0) { + setWidgetText(new WidgetPointer(915,49), "Reporting: " + globalstring_279); + } else { + setWidgetText(new WidgetPointer(915,49), "Report Abuse"); + } + if (hasMoreThen5Blackmarks() || (getClientRights() > 0)) { + if (((boolean)globalint_6)) { + setWidgetSprite(4084, new WidgetPointer(915,46)); + } else { + setWidgetSprite(4086, new WidgetPointer(915,46)); + } + if ((getBlackmarks() == 5) || (getBlackmarks() == 6)) { + setWidgetText(new WidgetPointer(915,47), "Suggest to mute this player for 48 hours"); + } else { + setWidgetText(new WidgetPointer(915,47), "Mute this player for 48 hours"); + } + setWidgetSize(add(getTextWidth(3793, getWidgetText(new WidgetPointer(915,47))), 18), getWidgetActualHeight(new WidgetPointer(915,45)), 0, 0, new WidgetPointer(915,45)); + setWidgetIsHidden(false, new WidgetPointer(915,45)); + } else { + setWidgetIsHidden(true, new WidgetPointer(915,45)); + } + setScriptCallOnKeyPress(3201, -2147483640, "i", new WidgetPointer(915,18)); + return; +} diff --git a/dumps/scripts/3191.cs2 b/dumps/scripts/3191.cs2 new file mode 100644 index 000000000..9553e9749 --- /dev/null +++ b/dumps/scripts/3191.cs2 @@ -0,0 +1,4 @@ +void script_3191() { + script_3192(); + return; +} diff --git a/dumps/scripts/3192.cs2 b/dumps/scripts/3192.cs2 new file mode 100644 index 000000000..76e034aed --- /dev/null +++ b/dumps/scripts/3192.cs2 @@ -0,0 +1,5 @@ +void script_3192() { + script_3194(); + script_3177(globalint_6, globalstring_279); + return; +} diff --git a/dumps/scripts/3193.cs2 b/dumps/scripts/3193.cs2 new file mode 100644 index 000000000..c68b7a6a2 --- /dev/null +++ b/dumps/scripts/3193.cs2 @@ -0,0 +1,4 @@ +void script_3193() { + script_3194(); + return; +} diff --git a/dumps/scripts/3194.cs2 b/dumps/scripts/3194.cs2 new file mode 100644 index 000000000..3e7e9a918 --- /dev/null +++ b/dumps/scripts/3194.cs2 @@ -0,0 +1,10 @@ +void script_3194() { + closeInterface(59375688); + setWidgetIsHidden(true, new WidgetPointer(906,55)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(915,18)); + globalint_1094 = 0; + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + script_3161(1); + } + return; +} diff --git a/dumps/scripts/3195.cs2 b/dumps/scripts/3195.cs2 new file mode 100644 index 000000000..6cbda6b88 --- /dev/null +++ b/dumps/scripts/3195.cs2 @@ -0,0 +1,4 @@ +void script_3195(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_3196(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/3196.cs2 b/dumps/scripts/3196.cs2 new file mode 100644 index 000000000..d537dd4c8 --- /dev/null +++ b/dumps/scripts/3196.cs2 @@ -0,0 +1,55 @@ +void script_3196(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + string svar0; + string svar1; + ivar6 = -1; + svar0 = ""; + svar1 = ""; + switch (arg0) { + case 1: + svar0 = "Help - selecting an offence"; + svar1 = "Here you can select the offence that you believe the player has committed." + "
" + "
" + "Clicking one of the offence buttons will send recent chat to Player Support for investigation. You should act quickly to report the player, particularly in areas where there is a lot of chat, such as at the Grand Exchange." + "
" + "
" + "If you have selected the wrong player, you can use the 'Change player' button to return to the previous page and choose again." + "
" + "
" + "Once your report has been sent, you'll be asked if you want to temporarily add the offender to your Ignore List."; + break; + case 2: + svar0 = "Help - selecting an offence"; + svar1 = "Here you can select the offence that you believe the player has committed." + "
" + "
" + "Clicking one of the offence buttons will send recent chat to Player Support for investigation. You should act quickly to report the player, particularly in areas where there is a lot of chat, such as at the Grand Exchange." + "
" + "
" + "If you have selected the wrong player, you can use the 'Change player' button to return to the chat list and choose again." + "
" + "
" + "You can only report players who have spoken recently." + "
" + "
" + "Once your report has been sent, you'll be asked if you want to temporarily add the offender to your Ignore List."; + break; + case 3: + svar0 = "Help - honour"; + svar1 = "An item scam is defined as cheating another player during a trade. We don't consider it a scam to ask for large amounts of gp for an item, but it is not in the spirit of the game to overprice an item. It is your responsibility to make sure that you are paying a good price." + "
" + "
" + "Asking for someone's bank PIN or recovery answers is just as serious as asking for a password; giving out your bank PIN allows other players access to your bank space. Never tell another player your password, PIN number or any other account security details." + "
" + "
" + "If you notice a bug, please report it to us straight away. If, after noticing a bug, you continue to exploit it, you are likely to have action taken against your account." + "
" + "
" + "There are no cheats for any of our games. Anyone that approaches you in-game to offer you cheats should be reported under 'Encouraging rule-breaking'." + "
" + "
" + "Don't encourage rule-breaking, such as encouraging someone to try real-world trading, scamming or exploiting bugs." + "
" + "
" + "You should not swap your account with another player, or share your account with anyone else. Sharing your account makes it less secure, and is also unfair to other players."; + break; + case 4: + svar0 = "Help - respect"; + svar1 = "There's no need to report anyone for using the term 'noob', it simply means 'new player'." + "
" + "
" + "Seriously offensive language includes racism and chat of a sexual nature." + "
" + "
" + "You don't need to report players for using abbreviations such as 'lmao', 'wtf', 'gtfo'." + "
" + "
" + "You shouldn't report any chat that has been starred out (like this: ****), as the censor has prevented anything that may have been offensive from being seen." + "
" + "
" + "Solicitation includes asking for a boyfriend or girlfriend in-game." + "
" + "
" + "Disruptive behaviour includes flooding the chat window with lines of unnecessary chat, but only if you feel it's impairing your gameplay." + "
" + "
" + "Beware of context when reporting players for real-life threats: they could be talking about in-game combat!"; + break; + case 5: + svar0 = "Help - security"; + svar1 = "Giving out your contact information in-game can put the security of your account at risk. There are some unscrupulous people out there, so, to protect your account and your privacy, it makes sense not to give your details to anyone you don't know." + "
" + "
" + "Contact information includes: full name, email addresses, instant messenger screen names, telephone numbers, your home/work address or age." + "
" + "
" + "Promoting a non-Jagex website in the forums or in-game could get you banned, even if you post the URL for your clan's site. We understand this rule may cause some inconvenience, but we want it to be impossible for people to send players to scam sites."; + break; + case 6: + svar0 = "Help - ignoring a player temporarily"; + svar1 = "Now that your report has been sent, you can choose whether or not to ignore the offender. This is a temporary measure, and will only last until you log out. To permanently ignore a player, make a note of their name and add them to your Ignore List once the 'Report Abuse' windows are closed." + "
" + "
" + "You cannot ignore moderators or people on your Friends List."; + } + setWidgetText(new WidgetPointer(arg1), svar0); + setWidgetText(new WidgetPointer(arg2), svar1); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg3)), add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(arg2)), 3793, svar1), 12), 48), 0, 0, new WidgetPointer(arg3)); + switch (arg5) { + case 59834368: + ivar6 = 59375680; + break; + case 59899904: + ivar6 = 59375696; + break; + case 64159744: + ivar6 = 59375670; + break; + case 59965458: + ivar6 = 59375688; + } + if (ivar6 != -1) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar6)), getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0, new WidgetPointer(ivar6)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg5)), getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0, new WidgetPointer(arg5)); + } + setWidgetIsHidden(false, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/3197.cs2 b/dumps/scripts/3197.cs2 new file mode 100644 index 000000000..7b1c5ad84 --- /dev/null +++ b/dumps/scripts/3197.cs2 @@ -0,0 +1,4 @@ +void script_3197(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_3198(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/3198.cs2 b/dumps/scripts/3198.cs2 new file mode 100644 index 000000000..01dca69fe --- /dev/null +++ b/dumps/scripts/3198.cs2 @@ -0,0 +1,32 @@ +void script_3198(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + ivar5 = -1; + ivar6 = 0; + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetText(new WidgetPointer(arg0), ""); + setWidgetText(new WidgetPointer(arg1), ""); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), 300, 0, 0, new WidgetPointer(arg2)); + switch (arg4) { + case 59834368: + ivar5 = 59375680; + ivar6 = 300; + break; + case 59899904: + ivar5 = 59375696; + ivar6 = 122; + break; + case 64159744: + ivar5 = 59375670; + ivar6 = 303; + break; + case 59965458: + ivar5 = 59375688; + ivar6 = 312; + } + if (ivar5 != -1) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar5)), ivar6, 0, 0, new WidgetPointer(ivar5)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg4)), ivar6, 0, 0, new WidgetPointer(arg4)); + } + return; +} diff --git a/dumps/scripts/3199.cs2 b/dumps/scripts/3199.cs2 new file mode 100644 index 000000000..30d604333 --- /dev/null +++ b/dumps/scripts/3199.cs2 @@ -0,0 +1,4 @@ +void script_3199(int arg0) { + script_3200(arg0); + return; +} diff --git a/dumps/scripts/32.cs2 b/dumps/scripts/32.cs2 new file mode 100644 index 000000000..9e23e013c --- /dev/null +++ b/dumps/scripts/32.cs2 @@ -0,0 +1,12 @@ +void script_32(int arg0,int arg1) { + int ivar2; + ivar2 = subtract(cs2method2601(new WidgetPointer(arg1)), 4); + switch (arg1) { + case 38666248: + ivar2 = script_4754(arg1, ivar2, 1); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + script_37(arg0, arg1, ivar2, 1); + } + return; +} diff --git a/dumps/scripts/320.cs2 b/dumps/scripts/320.cs2 new file mode 100644 index 000000000..8e9dc5105 --- /dev/null +++ b/dumps/scripts/320.cs2 @@ -0,0 +1,5 @@ +void script_320(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + script_322(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + setScriptCallOnItemContainerUpdate(321, new WidgetPointer(arg0), arg1, arg2, arg5, arg6, arg7, arg8, arg9, arg10, arg3, arg4, 93, 1, "IiissssssiiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3200.cs2 b/dumps/scripts/3200.cs2 new file mode 100644 index 000000000..4a87747a2 --- /dev/null +++ b/dumps/scripts/3200.cs2 @@ -0,0 +1,18 @@ +void script_3200(int arg0) { + if (strLength(globalstring_279) > 0) { + cs2method5002(arg0, globalint_6, globalstring_279, ""); + } + script_3194(); + if (((strLength(globalstring_279) > 0) && cs2method3623(globalstring_279)) && (stringMethod4107(globalstring_279, cs2method5015()) != 0)) { + if (arg0 == 5) { + globalint_1094 = 1; + } + script_3203(); + } else { + globalint_1094 = 0; + if (arg0 == 5) { + script_2190(0, 6, 1, "", "Open a bug report form?" + "
" + "(opens a new window)", "", ""); + } + } + return; +} diff --git a/dumps/scripts/3201.cs2 b/dumps/scripts/3201.cs2 new file mode 100644 index 000000000..79fc9e7c0 --- /dev/null +++ b/dumps/scripts/3201.cs2 @@ -0,0 +1,19 @@ +void script_3201(int arg0) { + switch (arg0) { + case 85: + if (isWidgetHidden(new WidgetPointer(915,102))) { + script_3192(); + } + break; + case 1: + script_3196(1, 59965552, 59965553, 59965550, 59965542, 59965458); + break; + case 13: + if (isWidgetHidden(new WidgetPointer(915,102))) { + script_3198(59965552, 59965553, 59965550, 59965542, 59965458); + } else { + script_3194(); + } + } + return; +} diff --git a/dumps/scripts/3202.cs2 b/dumps/scripts/3202.cs2 new file mode 100644 index 000000000..0453d749b --- /dev/null +++ b/dumps/scripts/3202.cs2 @@ -0,0 +1,4 @@ +void script_3202() { + script_3203(); + return; +} diff --git a/dumps/scripts/3203.cs2 b/dumps/scripts/3203.cs2 new file mode 100644 index 000000000..a239b060e --- /dev/null +++ b/dumps/scripts/3203.cs2 @@ -0,0 +1,9 @@ +void script_3203() { + openInterface(59375680, 913); + setWidgetIsHidden(false, new WidgetPointer(906,56)); + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + script_3161(0); + } + setScriptCallOnKeyPress(3206, -2147483640, "i", new WidgetPointer(913,0)); + return; +} diff --git a/dumps/scripts/3204.cs2 b/dumps/scripts/3204.cs2 new file mode 100644 index 000000000..95336abf7 --- /dev/null +++ b/dumps/scripts/3204.cs2 @@ -0,0 +1,4 @@ +void script_3204() { + script_3205(); + return; +} diff --git a/dumps/scripts/3205.cs2 b/dumps/scripts/3205.cs2 new file mode 100644 index 000000000..2f6bed585 --- /dev/null +++ b/dumps/scripts/3205.cs2 @@ -0,0 +1,5 @@ +void script_3205() { + closeInterface(59375680); + setWidgetIsHidden(true, new WidgetPointer(906,56)); + return; +} diff --git a/dumps/scripts/3206.cs2 b/dumps/scripts/3206.cs2 new file mode 100644 index 000000000..a0931e5fe --- /dev/null +++ b/dumps/scripts/3206.cs2 @@ -0,0 +1,14 @@ +void script_3206(int arg0) { + switch (arg0) { + case 1: + script_3196(6, 59834382, 59834383, 59834371, 59834370, 59834368); + break; + case 13: + if (isWidgetHidden(new WidgetPointer(913,2))) { + script_3198(59834382, 59834383, 59834371, 59834370, 59834368); + } else { + script_3205(); + } + } + return; +} diff --git a/dumps/scripts/3207.cs2 b/dumps/scripts/3207.cs2 new file mode 100644 index 000000000..999ffc7c7 --- /dev/null +++ b/dumps/scripts/3207.cs2 @@ -0,0 +1,27 @@ +void script_3207(int arg0) { + int ivar1; + script_3205(); + ivar1 = 0; + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + ivar1 = 1; + } + if (((boolean)arg0) && (strLength(globalstring_279) > 0)) { + if (isFriend(globalstring_279)) { + if (((boolean)ivar1)) { + message(26, 0, "Sorry, you cannot ignore players in your Friends List."); + } else { + message(26, 0, "Sorry, you cannot ignore players in your Friends List."); + } + } else if (((boolean)ivar1)) { + message(26, 0, "You are ignoring " + globalstring_279 + " until you log out."); + } else { + message(26, 0, "You are ignoring " + globalstring_279 + " until you log out."); + } + cs2method3630(globalstring_279); + } + if (((boolean)globalint_1094)) { + script_3015(6, "", "Open a bug report form?" + "
" + "(opens a new window)", "", ""); + globalint_1094 = 0; + } + return; +} diff --git a/dumps/scripts/3208.cs2 b/dumps/scripts/3208.cs2 new file mode 100644 index 000000000..96a6a344b --- /dev/null +++ b/dumps/scripts/3208.cs2 @@ -0,0 +1,23 @@ +void script_3208(int arg0) { + int ivar1; + int ivar2; + ivar1 = 4055; + ivar2 = 4053; + if (((boolean)arg0)) { + script_3209(); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(673,64)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(673,64)); + setWidgetText(new WidgetPointer(673,70), "Please wait..."); + setWidgetText(new WidgetPointer(673,69), "Please wait..."); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(673,26)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(673,26)); + } else { + setScriptCallOnMousePressed(2205, "", new WidgetPointer(673,64)); + setScriptCallOnMouseEntered(45, new WidgetPointer(-32768,3), 16448250, "Ii", new WidgetPointer(673,64)); + setWidgetText(new WidgetPointer(673,70), "Continue"); + setWidgetText(new WidgetPointer(673,69), "Continue"); + setScriptCallOnMousePressed(2252, "", new WidgetPointer(673,26)); + setScriptCallOnMouseEntered(3937, new WidgetPointer(673,65), ivar1, new WidgetPointer(673,66), ivar2, new WidgetPointer(673,67), ivar2, new WidgetPointer(673,68), ivar1, "IdIdIdId", new WidgetPointer(673,26)); + } + return; +} diff --git a/dumps/scripts/3209.cs2 b/dumps/scripts/3209.cs2 new file mode 100644 index 000000000..296e1dc2d --- /dev/null +++ b/dumps/scripts/3209.cs2 @@ -0,0 +1,8 @@ +void script_3209() { + setWidgetIsHidden(true, new WidgetPointer(673,101)); + setWidgetIsHidden(true, new WidgetPointer(673,121)); + setWidgetIsHidden(true, new WidgetPointer(673,92)); + setWidgetIsHidden(true, new WidgetPointer(673,82)); + setWidgetIsHidden(true, new WidgetPointer(673,127)); + return; +} diff --git a/dumps/scripts/321.cs2 b/dumps/scripts/321.cs2 new file mode 100644 index 000000000..f6a286ae7 --- /dev/null +++ b/dumps/scripts/321.cs2 @@ -0,0 +1,4 @@ +void script_321(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + script_322(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + return; +} diff --git a/dumps/scripts/3210.cs2 b/dumps/scripts/3210.cs2 new file mode 100644 index 000000000..b3d0b9fec --- /dev/null +++ b/dumps/scripts/3210.cs2 @@ -0,0 +1,4 @@ +void script_3210() { + script_3211(); + return; +} diff --git a/dumps/scripts/3211.cs2 b/dumps/scripts/3211.cs2 new file mode 100644 index 000000000..8c43cb3c2 --- /dev/null +++ b/dumps/scripts/3211.cs2 @@ -0,0 +1,10 @@ +void script_3211() { + if (getDisplayMode() < 2) { + setWidgetPosition(-85, 25, 1, 1, new WidgetPointer(673,33)); + setWidgetPosition(-85, 25, 1, 1, new WidgetPointer(673,38)); + } else { + setWidgetPosition(-85, 0, 1, 1, new WidgetPointer(673,33)); + setWidgetPosition(-85, 0, 1, 1, new WidgetPointer(673,38)); + } + return; +} diff --git a/dumps/scripts/3212.cs2 b/dumps/scripts/3212.cs2 new file mode 100644 index 000000000..268623e59 --- /dev/null +++ b/dumps/scripts/3212.cs2 @@ -0,0 +1,5 @@ +void script_3212(string arg0) { + arg0 = arg0 + "?cty=" + intToStr(cs2method3629()); + script_2934(1, arg0); + return; +} diff --git a/dumps/scripts/3213.cs2 b/dumps/scripts/3213.cs2 new file mode 100644 index 000000000..0d903151d --- /dev/null +++ b/dumps/scripts/3213.cs2 @@ -0,0 +1,127 @@ +void script_3213(int arg0,string arg1) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar1; + string svar2; + flow_0: + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + svar1 = "accountappeal"; + svar2 = "passwordchoice.ws"; + SWITCH (arg0) { + case 44105822: + GOTO flow_1 + case 44105841: + GOTO flow_9 + case 44105812: + GOTO flow_17 + case 44105802: + GOTO flow_25 + case 44105777: + GOTO flow_33 + } + setWidgetIsHidden(true, new WidgetPointer(673,31)); + return; + flow_1: + if (strLength(arg1) > 0) { + setWidgetSprite(4061, new WidgetPointer(673,94)); + setWidgetIsHidden(false, new WidgetPointer(673,99)); + setWidgetText(new WidgetPointer(673,30), arg1); + setWidgetText(new WidgetPointer(673,137), arg1); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4061) { + setWidgetText(new WidgetPointer(673,30), getWidgetText(new WidgetPointer(673,137))); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4059) { + setWidgetText(new WidgetPointer(673,30), "This email address is available for use."); + } else { + setWidgetText(new WidgetPointer(673,30), "Please enter your email address here."); + } + setWidgetSize(110, add(multiply(getLineCount(subtract(110, 20), 3793, getWidgetText(new WidgetPointer(673,30))), 12), 10), 0, 0, new WidgetPointer(673,31)); + ivar2 = 99; + ivar4 = 450; + GOTO flow_41 + flow_9: + if (strLength(arg1) > 0) { + setWidgetSprite(4061, new WidgetPointer(673,113)); + setWidgetIsHidden(false, new WidgetPointer(673,118)); + setWidgetText(new WidgetPointer(673,30), arg1); + setWidgetText(new WidgetPointer(673,138), arg1); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4061) { + setWidgetText(new WidgetPointer(673,30), getWidgetText(new WidgetPointer(673,138))); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4059) { + setWidgetText(new WidgetPointer(673,30), "Both email addresses match."); + } else { + setWidgetText(new WidgetPointer(673,30), "Please enter your email address again here."); + } + setWidgetSize(110, add(multiply(getLineCount(subtract(110, 20), 3793, getWidgetText(new WidgetPointer(673,30))), 12), 10), 0, 0, new WidgetPointer(673,31)); + ivar2 = 128; + ivar4 = 450; + GOTO flow_41 + flow_17: + if (strLength(arg1) > 0) { + setWidgetSprite(4061, new WidgetPointer(673,84)); + setWidgetIsHidden(false, new WidgetPointer(673,89)); + setWidgetText(new WidgetPointer(673,30), arg1); + setWidgetText(new WidgetPointer(673,139), arg1); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4061) { + setWidgetText(new WidgetPointer(673,30), getWidgetText(new WidgetPointer(673,139))); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4059) { + setWidgetText(new WidgetPointer(673,30), "You have entered your password."); + } else { + setWidgetText(new WidgetPointer(673,30), "Please enter your desired password here."); + } + setWidgetSize(110, add(multiply(getLineCount(subtract(110, 20), 3793, getWidgetText(new WidgetPointer(673,30))), 12), 10), 0, 0, new WidgetPointer(673,31)); + ivar2 = 161; + ivar4 = 450; + GOTO flow_41 + flow_25: + if (strLength(arg1) > 0) { + setWidgetSprite(4061, new WidgetPointer(673,74)); + setWidgetIsHidden(false, new WidgetPointer(673,79)); + setWidgetText(new WidgetPointer(673,30), arg1); + setWidgetText(new WidgetPointer(673,140), arg1); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4061) { + setWidgetText(new WidgetPointer(673,30), getWidgetText(new WidgetPointer(673,140))); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4059) { + setWidgetText(new WidgetPointer(673,30), "Both passwords match."); + } else { + setWidgetText(new WidgetPointer(673,30), "Please enter your desired password again here."); + } + setWidgetSize(110, add(multiply(getLineCount(subtract(110, multiply(10, 2)), 3793, getWidgetText(new WidgetPointer(673,30))), 12), 10), 0, 0, new WidgetPointer(673,31)); + ivar2 = 190; + ivar4 = 450; + GOTO flow_41 + flow_33: + if (strLength(arg1) > 0) { + setWidgetSprite(4061, new WidgetPointer(673,49)); + setWidgetIsHidden(false, new WidgetPointer(673,125)); + setWidgetText(new WidgetPointer(673,30), arg1); + setWidgetText(new WidgetPointer(673,141), arg1); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4061) { + setWidgetText(new WidgetPointer(673,30), getWidgetText(new WidgetPointer(673,141))); + } else if (getWidgetSpriteId(new WidgetPointer(arg0)) == 4059) { + setWidgetText(new WidgetPointer(673,30), "You have entered your age."); + } else { + setWidgetText(new WidgetPointer(673,30), "Please enter your age, in years, here."); + } + ivar5 = subtract(getWidgetActualWidth(new WidgetPointer(673,38)), 277); + setWidgetSize(min(add(getMaxLineWidth(multiply(divide(getTextWidth(3793, getWidgetText(new WidgetPointer(673,30))), 4), 3), 3793, getWidgetText(new WidgetPointer(673,30))), multiply(10, 2)), ivar5), 30, 0, 0, new WidgetPointer(673,31)); + ivar2 = 223; + ivar4 = 277; + flow_41: + ivar1 = divide(getWidgetActualHeight(new WidgetPointer(673,31)), 2); + ivar3 = subtract(ivar2, ivar1); + setWidgetPosition(ivar4, ivar3, 0, 0, new WidgetPointer(673,31)); + setWidgetIsHidden(false, new WidgetPointer(673,31)); + if (((boolean)stringMethod4107(getWidgetText(new WidgetPointer(673,30)), "Email already in use. Try a different email or click " + "" + "here" + "" + " to recover this account."))) { + setScriptCallOnMousePressed(2931, svar1, svar2, 1, "ss1", new WidgetPointer(673,32)); + } else { + setScriptCallOnMousePressed(-1, "", new WidgetPointer(673,32)); + } + return; +} diff --git a/dumps/scripts/3214.cs2 b/dumps/scripts/3214.cs2 new file mode 100644 index 000000000..9eb1183bd --- /dev/null +++ b/dumps/scripts/3214.cs2 @@ -0,0 +1,4 @@ +void script_3214() { + script_2206(); + return; +} diff --git a/dumps/scripts/3215.cs2 b/dumps/scripts/3215.cs2 new file mode 100644 index 000000000..a88d5c5a6 --- /dev/null +++ b/dumps/scripts/3215.cs2 @@ -0,0 +1,10 @@ +void script_3215(int arg0) { + if (((boolean)arg0)) { + setWidgetContextMenuOption(1, new WidgetPointer(548,99), "Microtutorial"); + setWidgetContextMenuOption(1, new WidgetPointer(746,47), "Microtutorial"); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(548,99), ""); + setWidgetContextMenuOption(1, new WidgetPointer(746,47), ""); + } + return; +} diff --git a/dumps/scripts/3216.cs2 b/dumps/scripts/3216.cs2 new file mode 100644 index 000000000..48ec8a8bb --- /dev/null +++ b/dumps/scripts/3216.cs2 @@ -0,0 +1,307 @@ +void script_3216(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_802_struct(1,1,0) structdump_5; + cs2func_script_802_struct(1,1,0) structdump_6; + cs2func_script_802_struct(1,1,0) structdump_7; + cs2func_script_802_struct(1,1,0) structdump_8; + if (getAccountCreateRC() == -3) { + return; + } + svar0 = ""; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + switch (globalint_174) { + case 6: + switch (arg0) { + case 13: + script_2206(); + return; + case 84: + case 80: + if (globalint_175 >= getClientCycle()) { + return; + } + if ((arg0 == 80) && isHoldingCtrl()) { + script_2714(15, 1); + } else { + script_2714(14, 1); + } + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1099 = script_1553(arg0, globalint_1099, globalstring_122); + script_3218(44105828, 44105772, 44105829, 6, globalstring_122); + return; + } + if (((strLength(globalstring_122) >= 320) && (arg0 != 85)) && (arg0 != 101)) { + return; + } + if (((strIndexof(((char)arg1), 0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'*+-/=?^_.{}~@") != -1) || (arg0 == 85)) || (arg0 == 101)) { + stack_dump0 = globalint_1099; + stack_dump1 = 3; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_122; + structdump_5 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_5.stringpart_0; + globalint_1099 = structdump_5.intpart_0; + globalstring_122 = stack_dump4; + setWidgetText(new WidgetPointer(673,44), globalstring_122); + script_3218(44105828, 44105772, 44105829, 6, globalstring_122); + } + return; + case 14: + switch (arg0) { + case 13: + script_2206(); + return; + case 84: + case 80: + if (globalint_175 >= getClientCycle()) { + return; + } + if ((arg0 == 80) && isHoldingCtrl()) { + script_2714(6, 1); + } else { + script_2714(7, 1); + } + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1099 = script_1553(arg0, globalint_1099, globalstring_326); + script_3218(44105847, 44105848, 44105849, 14, globalstring_326); + return; + } + if (((strLength(globalstring_326) >= 320) && (arg0 != 85)) && (arg0 != 101)) { + return; + } + if (((strIndexof(((char)arg1), 0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'*+-/=?^_.{}~@") != -1) || (arg0 == 85)) || (arg0 == 101)) { + stack_dump0 = globalint_1099; + stack_dump1 = 3; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_326; + structdump_6 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_6.stringpart_0; + globalint_1099 = structdump_6.intpart_0; + globalstring_326 = stack_dump4; + setWidgetText(new WidgetPointer(673,120), globalstring_326); + script_3218(44105847, 44105848, 44105849, 14, globalstring_326); + } + return; + case 7: + switch (arg0) { + case 13: + script_2206(); + return; + case 84: + case 80: + if (globalint_175 >= getClientCycle()) { + return; + } + if ((arg0 == 80) && isHoldingCtrl()) { + script_2714(14, 1); + } else { + script_2714(8, 1); + } + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1099 = script_1553(arg0, globalint_1099, globalstring_124); + script_3218(44105818, 44105819, 44105820, 7, script_2949(globalstring_124)); + return; + } + if (((strLength(globalstring_124) > 20) && (arg0 != 85)) && (arg0 != 101)) { + return; + } + stack_dump0 = globalint_1099; + stack_dump1 = 0; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_124; + structdump_7 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_7.stringpart_0; + globalint_1099 = structdump_7.intpart_0; + globalstring_124 = stack_dump4; + setWidgetText(new WidgetPointer(673,91), script_2949(globalstring_124)); + script_3218(44105818, 44105819, 44105820, 7, script_2949(globalstring_124)); + return; + case 8: + switch (arg0) { + case 13: + script_2206(); + return; + case 84: + case 80: + if (globalint_175 >= getClientCycle()) { + return; + } + if ((arg0 == 80) && isHoldingCtrl()) { + script_2714(7, 1); + } else { + script_2714(15, 1); + } + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1099 = script_1553(arg0, globalint_1099, globalstring_125); + script_3218(44105808, 44105809, 44105810, 8, script_2949(globalstring_125)); + return; + } + if (((strLength(globalstring_125) > 20) && (arg0 != 85)) && (arg0 != 101)) { + return; + } + stack_dump0 = globalint_1099; + stack_dump1 = 0; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_125; + structdump_8 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_8.stringpart_0; + globalint_1099 = structdump_8.intpart_0; + globalstring_125 = stack_dump4; + setWidgetText(new WidgetPointer(673,81), script_2949(globalstring_125)); + script_3218(44105808, 44105809, 44105810, 8, script_2949(globalstring_125)); + return; + case 15: + switch (arg0) { + case 13: + script_2206(); + return; + case 84: + case 80: + if (globalint_175 >= getClientCycle()) { + return; + } + if ((arg0 == 80) && isHoldingCtrl()) { + script_2714(8, 1); + } else { + if ((((arg0 == 84) && (strLength(globalstring_122) > 0)) && ((strLength(globalstring_326) > 0) && (strLength(globalstring_124) > 0))) && ((strLength(globalstring_125) > 0) && (globalint_1407 != 0))) { + script_2967(0); + return; + } + script_2714(6, 1); + } + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1099 = script_1553(arg0, globalint_1099, intToStr(globalint_1407)); + script_3218(44105854, 44105771, 44105855, 15, intToStr(globalint_1407)); + return; + } + if (((strLength(intToStr(globalint_1407)) >= 3) && (arg0 != 85)) && (arg0 != 101)) { + return; + } + if (strLength(intToStr(globalint_1407)) == 3) { + ivar3 = divide(globalint_1407, 100); + ivar4 = divide(subtract(globalint_1407, multiply(ivar3, 100)), 10); + ivar5 = subtract(globalint_1407, add(multiply(ivar3, 100), multiply(ivar4, 10))); + } else { + if (strLength(intToStr(globalint_1407)) == 2) { + ivar3 = divide(globalint_1407, 10); + ivar4 = subtract(globalint_1407, multiply(ivar3, 10)); + } + } + if (isDigit(((char)arg1))) { + ivar2 = strIndexof(((char)arg1), 0, "0123456789"); + if (globalint_1407 < 1) { + globalint_1407 = ivar2; + } else { + globalint_1407 = add(multiply(globalint_1407, 10), ivar2); + } + globalint_1099 = strLength(intToStr(globalint_1407)); + } else if (arg0 == 85) { + if (globalint_1099 >= 3) { + globalint_1407 = divide(globalint_1407, 10); + } else if (globalint_1099 == 2) { + if (strLength(intToStr(globalint_1407)) == 3) { + globalint_1407 = add(multiply(ivar3, 10), ivar5); + } else if (strLength(intToStr(globalint_1407)) == 2) { + globalint_1407 = divide(globalint_1407, 10); + } else { + globalint_1407 = 0; + globalint_1099 = 0; + } + } else if (((boolean)globalint_1099)) { + if (strLength(intToStr(globalint_1407)) == 3) { + globalint_1407 = subtract(globalint_1407, multiply(ivar3, 100)); + } else if (strLength(intToStr(globalint_1407)) == 2) { + globalint_1407 = subtract(globalint_1407, multiply(ivar3, 10)); + } else { + globalint_1407 = 0; + globalint_1099 = 0; + } + } else { + return; + } + globalint_1099 = max(subtract(globalint_1099, 1), 0); + } else { + if (arg0 == 101) { + if (globalint_1099 >= 3) { + return; + } + if (globalint_1099 == 2) { + if (strLength(intToStr(globalint_1407)) == 3) { + globalint_1407 = divide(globalint_1407, 10); + } else { + globalint_1099 = strLength(intToStr(globalint_1407)); + } + } else if (((boolean)globalint_1099)) { + if (strLength(intToStr(globalint_1407)) == 3) { + globalint_1407 = add(multiply(ivar3, 10), ivar5); + } else if (strLength(intToStr(globalint_1407)) == 2) { + globalint_1407 = divide(globalint_1407, 10); + } else { + return; + } + } else if (strLength(intToStr(globalint_1407)) == 3) { + globalint_1407 = subtract(globalint_1407, multiply(ivar3, 100)); + } else if (strLength(intToStr(globalint_1407)) == 2) { + globalint_1407 = ivar4; + } else { + globalint_1407 = 0; + } + } + } + if (globalint_1407 < 1) { + setWidgetText(new WidgetPointer(673,43), ""); + script_3218(44105854, 44105771, 44105855, 15, ""); + } else { + setWidgetText(new WidgetPointer(673,43), intToStr(globalint_1407)); + script_3218(44105854, 44105771, 44105855, 15, intToStr(globalint_1407)); + } + return; + } + return; +} diff --git a/dumps/scripts/3217.cs2 b/dumps/scripts/3217.cs2 new file mode 100644 index 000000000..3fe9e2cca --- /dev/null +++ b/dumps/scripts/3217.cs2 @@ -0,0 +1,32 @@ +void script_3217(int arg0,int arg1,int arg2,int arg3,int arg4) { + string svar0; + if (getAccountCreateRC() == -3) { + return; + } + svar0 = ""; + switch (arg4) { + case 6: + svar0 = globalstring_122; + break; + case 14: + svar0 = globalstring_326; + break; + case 7: + svar0 = script_2949(globalstring_124); + break; + case 8: + svar0 = script_2949(globalstring_125); + break; + case 15: + if (globalint_1407 > 0) { + svar0 = intToStr(globalint_1407); + } + break; + case 16: + svar0 = globalstring_330; + } + globalint_1099 = script_1401(arg0, 3793, 0, svar0); + script_3218(arg1, arg2, arg3, arg4, svar0); + script_2714(arg4, 0); + return; +} diff --git a/dumps/scripts/3218.cs2 b/dumps/scripts/3218.cs2 new file mode 100644 index 000000000..8a417551f --- /dev/null +++ b/dumps/scripts/3218.cs2 @@ -0,0 +1,31 @@ +void script_3218(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + string svar1; + setWidgetPosition(script_1551(globalint_1099, 3793, add(getWidgetActualX(new WidgetPointer(arg0)), 6), arg4), getWidgetActualY(new WidgetPointer(arg2)), 0, 0, new WidgetPointer(arg2)); + ivar4 = subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 11); + ivar5 = strLength(arg4); + svar1 = ""; + if (globalint_1099 > 0) { + svar1 = substr(0, min(globalint_1099, ivar5), arg4); + } + ivar6 = subtract(getTextWidth(3793, svar1), ivar4); + setWidgetPosition(6, getWidgetActualY(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + setWidgetSize(max(getTextWidth(3793, arg4), ivar4), getWidgetActualHeight(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + if (ivar6 > 0) { + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(arg1)), ivar6), getWidgetActualY(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(arg2)), ivar6), getWidgetActualY(new WidgetPointer(arg2)), 0, 0, new WidgetPointer(arg2)); + } + if (hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg2)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } + if (arg3 == 16) { + setScriptCallOnGameloop(3955, getClientCycle(), new WidgetPointer(arg2), "iI", new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(3219, getClientCycle(), new WidgetPointer(arg2), arg3, "iIi", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3219.cs2 b/dumps/scripts/3219.cs2 new file mode 100644 index 000000000..6215d21cc --- /dev/null +++ b/dumps/scripts/3219.cs2 @@ -0,0 +1,8 @@ +void script_3219(int arg0,int arg1,int arg2) { + if (((globalint_174 == arg2) && (mod(subtract(getClientCycle(), arg0), 40) < 20)) && ((getAccountCreateRC() != -3) && hasWindowFocus())) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/322.cs2 b/dumps/scripts/322.cs2 new file mode 100644 index 000000000..5203fd91e --- /dev/null +++ b/dumps/scripts/322.cs2 @@ -0,0 +1,78 @@ +void script_322(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + string svar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar5 = 0; + ivar6 = 0; + setWidgetScrollMax(0, multiply(add(divide(subtract(arg4, arg3), arg1), 1), 57), new WidgetPointer(arg0)); + ivar7 = 0; + ivar8 = 1; + ivar9 = 0; + ivar10 = 0; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + svar6 = "hello"; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + while (ivar7 < 78) { + ivar5 = add(add(16, multiply(mod(ivar7, arg1), 48)), multiply(mod(ivar7, arg1), 5)); + ivar6 = add(multiply(divide(ivar7, arg1), 52), multiply(divide(ivar7, arg1), 5)); + createExtraChild(new WidgetPointer(arg0), 5, ivar16); + ivar16 = add(ivar16, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2205); + setScriptCallOnMouseEntered(2724, new WidgetPointer(-32768,3), ivar16, 0, "Ii1"); + setScriptCallOnMouseExit(2724, new WidgetPointer(-32768,3), ivar16, 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, ivar16); + ivar16 = add(ivar16, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar16); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar5, 6), add(ivar6, 4), 0, 0); + ivar12 = cs2method_3408(105, 111, 1277, ivar8); + ivar13 = cs2method_3408(105, 111, 1188, ivar8); + ivar15 = cs2method_3408(111, 105, 1185, getRealItem(ivar12)); + if (ivar13 == 12421) { + script_1670(ivar13, ivar13, arg0, ivar16, arg5, arg6, arg7, arg8, arg9, arg10); + } else if (((getItemAmtInContainer(93, getRealItem(ivar13)) > 0) && (getItemAmtInContainer(93, getRealItem(ivar13)) >= getItemHashmapData(getRealItem(ivar13), 599))) && (getSkillActualLvl(23) >= cs2method_3408(105, 105, 1472, ivar15))) { + script_1670(ivar13, ivar13, arg0, ivar16, arg5, arg6, arg7, arg8, arg9, arg10); + } else { + script_1670(cs2method_3408(105, 111, 1184, ivar8), ivar13, arg0, ivar16, arg5, arg6, arg7, arg8, arg9, arg10); + } + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar16); + ivar16 = add(ivar16, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar5, 2), add(ivar6, 38), 0, 0); + setItemOnWidgetMethod1205(12183, 1); + createExtraChild(new WidgetPointer(arg0), 4, ivar16); + ivar16 = add(ivar16, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar5, 13), add(ivar6, 39), 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetTextAlignment(2, 1, 0); + setWidgetText(intToStr(max(1, getItemHashmapData(ivar13, 457)))); + setWidgetUnknownBoolean(true); + ivar7 = add(ivar7, 1); + ivar8 = add(ivar8, 1); + } + return; +} diff --git a/dumps/scripts/3220.cs2 b/dumps/scripts/3220.cs2 new file mode 100644 index 000000000..338fc7184 --- /dev/null +++ b/dumps/scripts/3220.cs2 @@ -0,0 +1,94 @@ +void script_3220() { + int ivar0; + int ivar1; + string svar0; + string svar1; + flow_0: + ivar0 = getAccountCreateRC(); + if (ivar0 == -3) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(673,26)); + ivar1 = 0; + svar0 = "accountappeal"; + svar1 = "passwordchoice.ws"; + IF (ivar0 == 2) + GOTO flow_3 + GOTO flow_4 + flow_3: + cs2method5430(); + script_2223(); + GOTO flow_20 + flow_4: + SWITCH (ivar0) { + case 3: + GOTO flow_5 + case -4: + GOTO flow_5 + case -1: + GOTO flow_5 + case -5: + GOTO flow_6 + case 7: + GOTO flow_7 + case 38: + GOTO flow_8 + case 9: + GOTO flow_8 + case 20: + GOTO flow_9 + case 21: + GOTO flow_10 + case 37: + GOTO flow_11 + case 30: + GOTO flow_12 + case 31: + GOTO flow_18 + case 32: + GOTO flow_19 + case 33: + GOTO flow_19 + } + script_3213(44105822, "Unexpected server response."); + GOTO flow_20 + flow_5: + script_3213(44105822, "Error contacting server."); + GOTO flow_20 + flow_6: + script_3213(44105822, "No response from server."); + GOTO flow_20 + flow_7: + script_3213(44105822, "The server is currently very busy. Please try again shortly."); + GOTO flow_20 + flow_8: + script_3213(44105822, "You cannot create an account at this time. Please try again later."); + GOTO flow_20 + flow_9: + script_3213(44105822, "Email already in use. Try a different email or click " + "" + "here" + "" + " to recover this account."); + GOTO flow_20 + flow_10: + script_3213(44105822, "Please enter a valid Email address."); + GOTO flow_20 + flow_11: + script_3213(44105822, "RuneScape has been updated. Please reload this page."); + GOTO flow_20 + flow_12: + ivar1 = strLength(globalstring_124); + if (ivar1 < 5) { + script_3213(44105812, "Passwords must be at least 5 characters long."); + } else if (ivar1 > 20) { + script_3213(44105812, "Passwords must be no more than " + intToStr(20) + " characters long."); + } else { + script_3213(44105812, "Please supply a valid password."); + } + GOTO flow_20 + flow_18: + script_3213(44105812, "Passwords may only contain letters and numbers."); + GOTO flow_20 + flow_19: + script_3213(44105812, "Your password is too easy to guess."); + flow_20: + script_3208(0); + return; +} diff --git a/dumps/scripts/3221.cs2 b/dumps/scripts/3221.cs2 new file mode 100644 index 000000000..267973844 --- /dev/null +++ b/dumps/scripts/3221.cs2 @@ -0,0 +1,3 @@ +void script_3221(string arg0,string arg1,string arg2,string arg3,string arg4) { + return; +} diff --git a/dumps/scripts/3222.cs2 b/dumps/scripts/3222.cs2 new file mode 100644 index 000000000..5e9ae16a7 --- /dev/null +++ b/dumps/scripts/3222.cs2 @@ -0,0 +1,92 @@ +int script_3222(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + string svar0; + ivar4 = cs2method_3408(105, 74, 3483, arg1); + ivar5 = 0; + ivar6 = 0; + ivar7 = -1; + ivar8 = 0; + svar0 = ""; + ivar9 = -1; + switch (arg2) { + case 0: + ivar5 = getOtherCommonData(ivar4, 1294); + ivar6 = getOtherCommonData(ivar4, 1295); + break; + case 1: + ivar5 = getOtherCommonData(ivar4, 1296); + ivar6 = getOtherCommonData(ivar4, 1297); + break; + case 2: + ivar5 = getOtherCommonData(ivar4, 1298); + ivar6 = getOtherCommonData(ivar4, 1299); + break; + case 3: + ivar5 = getOtherCommonData(ivar4, 1300); + ivar6 = getOtherCommonData(ivar4, 1301); + break; + case 4: + ivar5 = getOtherCommonData(ivar4, 1302); + ivar6 = getOtherCommonData(ivar4, 1303); + break; + case 5: + ivar5 = getOtherCommonData(ivar4, 1304); + ivar6 = getOtherCommonData(ivar4, 1305); + break; + case 6: + ivar5 = getOtherCommonData(ivar4, 1306); + ivar6 = getOtherCommonData(ivar4, 1307); + break; + case 7: + ivar5 = getOtherCommonData(ivar4, 1308); + ivar6 = getOtherCommonData(ivar4, 1309); + break; + case 8: + ivar5 = getOtherCommonData(ivar4, 1310); + ivar6 = getOtherCommonData(ivar4, 1311); + break; + case 9: + ivar5 = getOtherCommonData(ivar4, 1312); + ivar6 = getOtherCommonData(ivar4, 1313); + } + if (((boolean)ivar5)) { + return arg0; + } + if (ivar5 < 62) { + ivar7 = cs2method_3408(105, 83, 681, ivar5); + if (ivar7 != -1) { + svar0 = "This Task requires " + intToStr(ivar6) + " " + cs2method_3408(105, 115, 108, ivar5) + "."; + if (getSkillCurrentLvl(ivar7) >= ivar6) { + svar0 = concat("", svar0); + } + } + } else if (ivar5 == 62) { + ivar9 = cs2method_3408(105, 74, 2252, ivar6); + svar0 = "To complete this Task, you must complete the " + getOtherCommonData(ivar9, 845) + " quest."; + if (script_2193(ivar6) == 2) { + svar0 = concat("", svar0); + } + } else { + svar0 = script_3223(arg1, add(arg2, 1)); + } + ivar10 = 0; + if (stringMethod4107(svar0, "") != 0) { + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetText(new WidgetPointer(arg3), svar0); + setWidgetFont(495, new WidgetPointer(arg3)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(arg3)); + ivar10 = subtract(getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg3)))), 18); + ivar8 = multiply(15, getLineCount(ivar10, 495, svar0)); + setWidgetSize(ivar10, ivar8, 0, 0, new WidgetPointer(arg3)); + setWidgetPosition(9, arg0, 0, 0, new WidgetPointer(arg3)); + } else { + ivar8 = 0; + } + return add(arg0, ivar8); +} diff --git a/dumps/scripts/3223.cs2 b/dumps/scripts/3223.cs2 new file mode 100644 index 000000000..be3395eb8 --- /dev/null +++ b/dumps/scripts/3223.cs2 @@ -0,0 +1,371 @@ +string script_3223(int arg0,int arg1) { + int ivar2; + string svar0; + flow_0: + svar0 = ""; + ivar2 = 0; + SWITCH (arg0) { + case 23: + GOTO flow_1 + case 147: + GOTO flow_1 + case 167: + GOTO flow_1 + case 294: + GOTO flow_1 + case 249: + GOTO flow_1 + case 49: + GOTO flow_5 + case 59: + GOTO flow_9 + case 107: + GOTO flow_13 + case 178: + GOTO flow_19 + case 180: + GOTO flow_23 + case 177: + GOTO flow_27 + case 316: + GOTO flow_31 + case 321: + GOTO flow_35 + case 322: + GOTO flow_39 + case 323: + GOTO flow_43 + case 175: + GOTO flow_47 + case 219: + GOTO flow_51 + case 331: + GOTO flow_51 + case 248: + GOTO flow_55 + case 276: + GOTO flow_59 + case 3011: + GOTO flow_59 + case 281: + GOTO flow_63 + case 285: + GOTO flow_70 + case 289: + GOTO flow_74 + case 300: + GOTO flow_78 + case 3000: + GOTO flow_82 + case 3001: + GOTO flow_91 + case 3013: + GOTO flow_91 + case 3002: + GOTO flow_95 + case 12: + GOTO flow_107 + case 3003: + GOTO flow_111 + case 3007: + GOTO flow_115 + case 3008: + GOTO flow_119 + case 3010: + GOTO flow_123 + case 3012: + GOTO flow_127 + case 3015: + GOTO flow_131 + case 3031: + GOTO flow_135 + case 3034: + GOTO flow_139 + } + svar0 = ""; + ivar2 = 0; + GOTO flow_142 + flow_1: + if (((boolean)arg1)) { + svar0 = "You must have access to the fairy ring network to complete this Task."; + if (((boolean)bitconfig_2328)) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_5: + if (((boolean)arg1)) { + svar0 = "You must unlock 500 music tracks in order to perform the Air Guitar emote."; + if (((boolean)bitconfig_4394)) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_9: + if (arg1 == 2) { + svar0 = "You must also have completed the Abyss miniquest."; + if (standart_config_492 >= 4) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_13: + IF (((boolean)arg1)) + GOTO flow_14 + GOTO flow_18 + flow_14: + svar0 = "You must have progressed to a certain point in the Dragon Slayer quest."; + IF (standart_config_176 >= 2) + GOTO flow_15 + GOTO flow_16 + flow_15: + IF (((boolean)bitconfig_3746)) + GOTO flow_17 + flow_16: + IF (standart_config_176 >= 10) + GOTO flow_17 + GOTO flow_18 + flow_17: + ivar2 = 1; + flow_18: + GOTO flow_142 + flow_19: + if (((boolean)arg1)) { + svar0 = "You must begin the relevant section of Otto Godblessed's barbarian training."; + if (bitconfig_3757 > 0) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_23: + if (((boolean)arg1)) { + svar0 = "You must begin the relevant section of Otto Godblessed's barbarian training."; + if (bitconfig_3764 > 0) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_27: + if (((boolean)arg1)) { + svar0 = "You must begin the relevant section of Otto Godblessed's barbarian training."; + if (bitconfig_3764 > 0) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_31: + if (((boolean)arg1)) { + svar0 = "You must begin the relevant section of Otto Godblessed's barbarian training."; + if (bitconfig_3757 > 0) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_35: + if (((boolean)arg1)) { + svar0 = "You must begin the relevant section of Otto Godblessed's barbarian training."; + if (bitconfig_3764 > 0) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_39: + if (((boolean)arg1)) { + svar0 = "You must begin the relevant section of Otto Godblessed's barbarian training."; + if (bitconfig_3763 > 0) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_43: + if (((boolean)arg1)) { + svar0 = "You must begin the relevant section of Otto Godblessed's barbarian training."; + if (bitconfig_3761 > 0) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_47: + if (((boolean)arg1)) { + svar0 = "You must complete the Bar Crawl miniquest."; + if ((standart_config_76 >= 6) || ((boolean)bitconfig_3378)) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_51: + if (arg1 == 2) { + svar0 = "You must have a total combat level of at least 100 to accept an assignment in Shilo Village."; + if (script_1432() >= 100) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_55: + if (((boolean)arg1)) { + svar0 = "You must have completed the Knight Waves in Camelot."; + if (bitconfig_3909 == 8) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_59: + if (((boolean)arg1)) { + svar0 = "You require 33 Quest Points to enter the Champions' Guild."; + if (standart_config_101 >= 33) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_63: + if (((boolean)arg1)) { + svar0 = "You must unlock all four emotes by completing levels of the Stronghold of Security."; + if ((((boolean)bitconfig_2309) && ((boolean)bitconfig_2310)) && (((boolean)bitconfig_2311) && ((boolean)bitconfig_2312))) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_70: + if (((boolean)arg1)) { + svar0 = "You must learn the secret of the Senntisten necklace."; + if (((boolean)bitconfig_3639)) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_74: + if (((boolean)arg1)) { + svar0 = "You must have a total combat level of at least 40 to accept an assignment from Vannaka."; + if (script_1432() >= 40) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_78: + if (((boolean)arg1)) { + svar0 = "Completing quests will increase your access to Kudos with the Varrock Museum."; + if (script_4035() >= 153) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_82: + if (arg1 == 2) { + if (getMinute() >= standart_config_451) { + ivar2 = 1; + } + svar0 = "You may gather the Tears of Guthix once every week."; + } else { + if (arg1 == 3) { + if ((standart_config_101 >= bitconfig_456) || (script_4218() <= 0)) { + ivar2 = 1; + } + svar0 = "You must have gained a Quest Point or 100,000 total experience to enter Juna's cavern."; + } + } + GOTO flow_142 + flow_91: + if (((boolean)arg1)) { + svar0 = "You must have a total combat level of at least 40 to fight for the Void Knights."; + if (getMyCombat() >= 40) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_95: + if (((boolean)arg1)) { + svar0 = "You must have Larry or Chuck explain the purpose of penguin spying."; + if (((boolean)bitconfig_5277)) { + ivar2 = 1; + } + } else if (arg1 == 2) { + svar0 = "You must have spied on fewer than ten penguins already this week."; + if (bitconfig_5276 < 10) { + ivar2 = 1; + } + } else { + if (arg1 == 3) { + svar0 = "You may spy on penguins if your total Penguin Points are less than the maximum of fifty."; + if (bitconfig_5275 < 50) { + ivar2 = 1; + } + } + } + GOTO flow_142 + flow_107: + if (((boolean)arg1)) { + svar0 = "You must have Larry or Chuck explain the purpose of Penguin Hide and Seek."; + if (((boolean)bitconfig_5277)) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_111: + if (((boolean)arg1)) { + svar0 = "You may not chop down more than two evil trees per day."; + if (bitconfig_1545 < 2) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_115: + if (((boolean)arg1)) { + svar0 = "You may attempt the Agility, Magic and Ranged performances after a week has passed since your last show."; + if ((((boolean)bitconfig_5251) || ((boolean)bitconfig_5252)) || ((boolean)bitconfig_5253)) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_119: + if (arg1 == 2) { + svar0 = "You must wait at least a day since you last faced Bork."; + if (standart_config_1199 != getCurrentDaysSinceLaunch()) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_123: + if (arg1 == 2) { + svar0 = "At least a week must pass since you last faced the Skeletal Horror."; + if (getMinute() > bitconfig_6305) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_127: + if (((boolean)arg1)) { + svar0 = "You require 50 Runecrafting to enter the Runecrafters' Guild."; + if (getSkillActualLvl(20) >= 50) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_131: + if (arg1 == 2) { + svar0 = "You must have at least 65 Attack or Defence in order to take on a case."; + if ((getSkillActualLvl(0) >= 65) || (getSkillActualLvl(1) >= 65)) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_135: + if (((boolean)arg1)) { + svar0 = "You must have a total combat level of at least 48 to fight in the Clan Wars."; + if (script_1432() >= 48) { + ivar2 = 1; + } + } + GOTO flow_142 + flow_139: + if (((boolean)arg1)) { + svar0 = "To enter the Warriors' Guild your Attack or Strength level must be 99, or your combined Attack and Strength levels must total 130 or more."; + if (((add(getSkillActualLvl(2), getSkillActualLvl(0)) >= 130) || (getSkillActualLvl(0) >= 99)) || (getSkillActualLvl(2) >= 99)) { + ivar2 = 1; + } + } + flow_142: + if (((boolean)ivar2)) { + svar0 = concat("", svar0); + } + return svar0; +} diff --git a/dumps/scripts/3224.cs2 b/dumps/scripts/3224.cs2 new file mode 100644 index 000000000..a900ab416 --- /dev/null +++ b/dumps/scripts/3224.cs2 @@ -0,0 +1,2464 @@ +int script_3224(int arg0) { + int ivar1; + flow_0: + ivar1 = 0; + SWITCH (arg0) { + case 0: + GOTO flow_1 + case 1: + GOTO flow_4 + case 3: + GOTO flow_7 + case 5: + GOTO flow_10 + case 6: + GOTO flow_13 + case 7: + GOTO flow_16 + case 8: + GOTO flow_21 + case 9: + GOTO flow_24 + case 11: + GOTO flow_27 + case 12: + GOTO flow_30 + case 13: + GOTO flow_33 + case 14: + GOTO flow_36 + case 23: + GOTO flow_39 + case 25: + GOTO flow_42 + case 26: + GOTO flow_49 + case 27: + GOTO flow_52 + case 28: + GOTO flow_57 + case 29: + GOTO flow_60 + case 30: + GOTO flow_65 + case 31: + GOTO flow_70 + case 32: + GOTO flow_73 + case 33: + GOTO flow_76 + case 34: + GOTO flow_81 + case 35: + GOTO flow_84 + case 36: + GOTO flow_87 + case 37: + GOTO flow_90 + case 38: + GOTO flow_93 + case 39: + GOTO flow_96 + case 40: + GOTO flow_99 + case 41: + GOTO flow_102 + case 42: + GOTO flow_105 + case 44: + GOTO flow_108 + case 45: + GOTO flow_113 + case 46: + GOTO flow_118 + case 47: + GOTO flow_121 + case 48: + GOTO flow_124 + case 49: + GOTO flow_129 + case 50: + GOTO flow_132 + case 51: + GOTO flow_137 + case 52: + GOTO flow_140 + case 53: + GOTO flow_143 + case 54: + GOTO flow_146 + case 55: + GOTO flow_149 + case 56: + GOTO flow_152 + case 57: + GOTO flow_155 + case 58: + GOTO flow_160 + case 59: + GOTO flow_163 + case 60: + GOTO flow_170 + case 61: + GOTO flow_175 + case 84: + GOTO flow_178 + case 86: + GOTO flow_181 + case 88: + GOTO flow_184 + case 91: + GOTO flow_189 + case 97: + GOTO flow_192 + case 102: + GOTO flow_195 + case 103: + GOTO flow_198 + case 104: + GOTO flow_201 + case 105: + GOTO flow_206 + case 106: + GOTO flow_209 + case 107: + GOTO flow_212 + case 108: + GOTO flow_216 + case 109: + GOTO flow_219 + case 110: + GOTO flow_222 + case 112: + GOTO flow_225 + case 113: + GOTO flow_228 + case 114: + GOTO flow_231 + case 351: + GOTO flow_234 + case 352: + GOTO flow_237 + case 353: + GOTO flow_240 + case 354: + GOTO flow_243 + case 355: + GOTO flow_246 + case 356: + GOTO flow_249 + case 357: + GOTO flow_252 + case 118: + GOTO flow_255 + case 125: + GOTO flow_258 + case 129: + GOTO flow_261 + case 130: + GOTO flow_264 + case 131: + GOTO flow_267 + case 132: + GOTO flow_270 + case 133: + GOTO flow_273 + case 134: + GOTO flow_280 + case 136: + GOTO flow_283 + case 137: + GOTO flow_286 + case 138: + GOTO flow_289 + case 139: + GOTO flow_292 + case 140: + GOTO flow_299 + case 141: + GOTO flow_302 + case 142: + GOTO flow_309 + case 143: + GOTO flow_312 + case 144: + GOTO flow_317 + case 145: + GOTO flow_322 + case 146: + GOTO flow_327 + case 147: + GOTO flow_330 + case 148: + GOTO flow_333 + case 149: + GOTO flow_336 + case 150: + GOTO flow_339 + case 151: + GOTO flow_342 + case 309: + GOTO flow_349 + case 310: + GOTO flow_352 + case 311: + GOTO flow_355 + case 312: + GOTO flow_358 + case 313: + GOTO flow_363 + case 314: + GOTO flow_368 + case 315: + GOTO flow_373 + case 152: + GOTO flow_378 + case 160: + GOTO flow_381 + case 162: + GOTO flow_384 + case 163: + GOTO flow_387 + case 164: + GOTO flow_390 + case 165: + GOTO flow_393 + case 166: + GOTO flow_398 + case 167: + GOTO flow_403 + case 168: + GOTO flow_406 + case 169: + GOTO flow_409 + case 170: + GOTO flow_412 + case 171: + GOTO flow_417 + case 172: + GOTO flow_422 + case 173: + GOTO flow_425 + case 174: + GOTO flow_428 + case 175: + GOTO flow_433 + case 176: + GOTO flow_439 + case 177: + GOTO flow_442 + case 178: + GOTO flow_449 + case 179: + GOTO flow_456 + case 180: + GOTO flow_461 + case 181: + GOTO flow_464 + case 428: + GOTO flow_467 + case 316: + GOTO flow_470 + case 317: + GOTO flow_477 + case 318: + GOTO flow_484 + case 319: + GOTO flow_489 + case 320: + GOTO flow_492 + case 321: + GOTO flow_495 + case 322: + GOTO flow_502 + case 323: + GOTO flow_507 + case 417: + GOTO flow_512 + case 183: + GOTO flow_521 + case 184: + GOTO flow_524 + case 187: + GOTO flow_527 + case 193: + GOTO flow_530 + case 194: + GOTO flow_533 + case 195: + GOTO flow_536 + case 196: + GOTO flow_539 + case 197: + GOTO flow_544 + case 198: + GOTO flow_547 + case 199: + GOTO flow_552 + case 200: + GOTO flow_555 + case 201: + GOTO flow_558 + case 202: + GOTO flow_563 + case 203: + GOTO flow_566 + case 204: + GOTO flow_569 + case 205: + GOTO flow_572 + case 206: + GOTO flow_575 + case 207: + GOTO flow_578 + case 209: + GOTO flow_581 + case 210: + GOTO flow_584 + case 214: + GOTO flow_589 + case 215: + GOTO flow_594 + case 216: + GOTO flow_599 + case 217: + GOTO flow_612 + case 218: + GOTO flow_619 + case 219: + GOTO flow_624 + case 220: + GOTO flow_631 + case 324: + GOTO flow_636 + case 326: + GOTO flow_639 + case 327: + GOTO flow_646 + case 328: + GOTO flow_649 + case 329: + GOTO flow_652 + case 330: + GOTO flow_657 + case 331: + GOTO flow_662 + case 223: + GOTO flow_669 + case 226: + GOTO flow_672 + case 227: + GOTO flow_675 + case 229: + GOTO flow_678 + case 232: + GOTO flow_681 + case 233: + GOTO flow_684 + case 234: + GOTO flow_687 + case 235: + GOTO flow_690 + case 236: + GOTO flow_693 + case 237: + GOTO flow_696 + case 238: + GOTO flow_699 + case 239: + GOTO flow_702 + case 240: + GOTO flow_705 + case 241: + GOTO flow_708 + case 243: + GOTO flow_715 + case 244: + GOTO flow_720 + case 246: + GOTO flow_723 + case 247: + GOTO flow_726 + case 248: + GOTO flow_729 + case 249: + GOTO flow_734 + case 250: + GOTO flow_737 + case 251: + GOTO flow_740 + case 252: + GOTO flow_743 + case 253: + GOTO flow_750 + case 254: + GOTO flow_753 + case 255: + GOTO flow_758 + case 332: + GOTO flow_761 + case 333: + GOTO flow_766 + case 334: + GOTO flow_773 + case 335: + GOTO flow_778 + case 336: + GOTO flow_783 + case 257: + GOTO flow_788 + case 258: + GOTO flow_791 + case 261: + GOTO flow_794 + case 265: + GOTO flow_797 + case 267: + GOTO flow_800 + case 271: + GOTO flow_803 + case 272: + GOTO flow_806 + case 276: + GOTO flow_809 + case 277: + GOTO flow_812 + case 278: + GOTO flow_815 + case 280: + GOTO flow_818 + case 281: + GOTO flow_821 + case 282: + GOTO flow_830 + case 283: + GOTO flow_835 + case 284: + GOTO flow_838 + case 285: + GOTO flow_841 + case 287: + GOTO flow_846 + case 288: + GOTO flow_849 + case 289: + GOTO flow_852 + case 291: + GOTO flow_855 + case 292: + GOTO flow_858 + case 293: + GOTO flow_861 + case 294: + GOTO flow_864 + case 295: + GOTO flow_867 + case 296: + GOTO flow_870 + case 297: + GOTO flow_873 + case 299: + GOTO flow_876 + case 300: + GOTO flow_879 + case 301: + GOTO flow_882 + case 302: + GOTO flow_885 + case 304: + GOTO flow_888 + case 305: + GOTO flow_891 + case 306: + GOTO flow_894 + case 307: + GOTO flow_897 + case 308: + GOTO flow_900 + case 337: + GOTO flow_903 + case 338: + GOTO flow_906 + case 339: + GOTO flow_909 + case 340: + GOTO flow_912 + case 341: + GOTO flow_919 + case 342: + GOTO flow_924 + case 343: + GOTO flow_927 + case 344: + GOTO flow_932 + case 345: + GOTO flow_937 + case 381: + GOTO flow_940 + case 382: + GOTO flow_943 + case 392: + GOTO flow_946 + case 393: + GOTO flow_949 + case 397: + GOTO flow_952 + case 398: + GOTO flow_955 + case 99: + GOTO flow_958 + case 400: + GOTO flow_961 + case 401: + GOTO flow_964 + case 402: + GOTO flow_967 + case 403: + GOTO flow_970 + case 404: + GOTO flow_973 + case 405: + GOTO flow_976 + case 406: + GOTO flow_979 + case 407: + GOTO flow_982 + case 3000: + GOTO flow_985 + case 3001: + GOTO flow_991 + case 3002: + GOTO flow_994 + case 3003: + GOTO flow_1001 + case 3005: + GOTO flow_1004 + case 3007: + GOTO flow_1007 + case 3008: + GOTO flow_1012 + case 3009: + GOTO flow_1017 + case 3010: + GOTO flow_1020 + case 3011: + GOTO flow_1025 + case 3012: + GOTO flow_1028 + case 3013: + GOTO flow_1031 + case 3015: + GOTO flow_1034 + case 3016: + GOTO flow_1040 + case 3022: + GOTO flow_1045 + case 3023: + GOTO flow_1050 + case 3024: + GOTO flow_1053 + case 3026: + GOTO flow_1056 + case 3031: + GOTO flow_1059 + case 3025: + GOTO flow_1062 + case 3034: + GOTO flow_1065 + case 3500: + GOTO flow_1070 + case 3501: + GOTO flow_1073 + case 3505: + GOTO flow_1076 + case 3511: + GOTO flow_1079 + case 3502: + GOTO flow_1082 + case 3503: + GOTO flow_1085 + case 3504: + GOTO flow_1088 + case 3506: + GOTO flow_1091 + case 3508: + GOTO flow_1094 + case 3509: + GOTO flow_1097 + case 3507: + GOTO flow_1100 + case 3523: + GOTO flow_1103 + case 3510: + GOTO flow_1106 + case 3512: + GOTO flow_1109 + case 3513: + GOTO flow_1112 + case 3514: + GOTO flow_1115 + case 3515: + GOTO flow_1118 + case 3516: + GOTO flow_1121 + case 3517: + GOTO flow_1124 + case 3518: + GOTO flow_1127 + case 3519: + GOTO flow_1130 + case 3520: + GOTO flow_1133 + case 3521: + GOTO flow_1136 + } + return 1; + flow_1: + if (standart_config_63 < 6) { + return 0; + } + GOTO flow_1138 + flow_4: + if (getSkillActualLvl(17) < 5) { + return 0; + } + GOTO flow_1138 + flow_7: + if (standart_config_165 < 29) { + return 0; + } + GOTO flow_1138 + flow_10: + if (getSkillActualLvl(10) < 15) { + return 0; + } + GOTO flow_1138 + flow_13: + if (standart_config_68 < 16) { + return 0; + } + GOTO flow_1138 + flow_16: + if (standart_config_165 < 29) { + return 0; + } + if (standart_config_180 < 6) { + return 0; + } + GOTO flow_1138 + flow_21: + if (bitconfig_3337 < 18) { + return 0; + } + GOTO flow_1138 + flow_24: + if (standart_config_165 < 29) { + return 0; + } + GOTO flow_1138 + flow_27: + if (getSkillActualLvl(17) < 16) { + return 0; + } + GOTO flow_1138 + flow_30: + if (((boolean)bitconfig_5277)) { + return 0; + } + GOTO flow_1138 + flow_33: + if (bitconfig_4302 < 110) { + return 0; + } + GOTO flow_1138 + flow_36: + if (standart_config_30 < 80) { + return 0; + } + GOTO flow_1138 + flow_39: + if (((boolean)bitconfig_2328)) { + return 0; + } + GOTO flow_1138 + flow_42: + if (getSkillActualLvl(16) < 39) { + return 0; + } + if (getSkillActualLvl(4) < 21) { + return 0; + } + if (getSkillActualLvl(2) < 38) { + return 0; + } + GOTO flow_1138 + flow_49: + if (standart_config_63 < 6) { + return 0; + } + GOTO flow_1138 + flow_52: + if (bitconfig_4505 < 100) { + return 0; + } + if (getSkillActualLvl(14) < 46) { + return 0; + } + GOTO flow_1138 + flow_57: + if (getSkillActualLvl(19) < 47) { + return 0; + } + GOTO flow_1138 + flow_60: + if (standart_config_212 < 14) { + return 0; + } + if (getSkillActualLvl(6) < 58) { + return 0; + } + GOTO flow_1138 + flow_65: + if (bitconfig_2866 < 200) { + return 0; + } + if (getSkillActualLvl(11) < 50) { + return 0; + } + GOTO flow_1138 + flow_70: + if (bitconfig_1527 < 160) { + return 0; + } + GOTO flow_1138 + flow_73: + if (bitconfig_5075 < 20) { + return 0; + } + GOTO flow_1138 + flow_76: + if (standart_config_159 < 12) { + return 0; + } + if (getSkillActualLvl(10) < 3) { + return 0; + } + GOTO flow_1138 + flow_81: + if (getSkillActualLvl(16) < 33) { + return 0; + } + GOTO flow_1138 + flow_84: + if (getSkillActualLvl(17) < 38) { + return 0; + } + GOTO flow_1138 + flow_87: + if (getSkillActualLvl(17) < 28) { + return 0; + } + GOTO flow_1138 + flow_90: + if (getSkillActualLvl(14) < 30) { + return 0; + } + GOTO flow_1138 + flow_93: + if (bitconfig_3337 < 18) { + return 0; + } + GOTO flow_1138 + flow_96: + if (standart_config_139 < 75) { + return 0; + } + GOTO flow_1138 + flow_99: + if (standart_config_139 < 75) { + return 0; + } + GOTO flow_1138 + flow_102: + if (getSkillActualLvl(6) < 66) { + return 0; + } + GOTO flow_1138 + flow_105: + if (getSkillActualLvl(6) < 66) { + return 0; + } + GOTO flow_1138 + flow_108: + if (bitconfig_2448 < 190) { + return 0; + } + if (getSkillActualLvl(6) < 71) { + return 0; + } + GOTO flow_1138 + flow_113: + if (getSkillActualLvl(17) < 65) { + return 0; + } + if (getSkillActualLvl(21) < 54) { + return 0; + } + GOTO flow_1138 + flow_118: + if (bitconfig_3337 < 18) { + return 0; + } + GOTO flow_1138 + flow_121: + if (standart_config_365 < 9) { + return 0; + } + GOTO flow_1138 + flow_124: + if (bitconfig_4055 < 65) { + return 0; + } + if (getSkillActualLvl(18) < 59) { + return 0; + } + GOTO flow_1138 + flow_129: + if (((boolean)bitconfig_4394)) { + return 0; + } + GOTO flow_1138 + flow_132: + if (standart_config_165 < 29) { + return 0; + } + if (getSkillActualLvl(6) < 51) { + return 0; + } + GOTO flow_1138 + flow_137: + if (getSkillActualLvl(16) < 57) { + return 0; + } + GOTO flow_1138 + flow_140: + if (getSkillActualLvl(21) < 59) { + return 0; + } + GOTO flow_1138 + flow_143: + if (getSkillActualLvl(19) < 57) { + return 0; + } + GOTO flow_1138 + flow_146: + if (getSkillActualLvl(17) < 59) { + return 0; + } + GOTO flow_1138 + flow_149: + if (bitconfig_4396 < 60) { + return 0; + } + GOTO flow_1138 + flow_152: + if (getSkillActualLvl(10) < 81) { + return 0; + } + GOTO flow_1138 + flow_155: + if (bitconfig_4302 < 110) { + return 0; + } + if (getSkillActualLvl(23) < 93) { + return 0; + } + GOTO flow_1138 + flow_160: + if (getSkillActualLvl(17) < 82) { + return 0; + } + GOTO flow_1138 + flow_163: + if (standart_config_63 < 6) { + return 0; + } + if (standart_config_492 < 4) { + return 0; + } + if (getSkillActualLvl(20) < 75) { + return 0; + } + GOTO flow_1138 + flow_170: + if (getSkillActualLvl(13) < 91) { + return 0; + } + if (getSkillActualLvl(9) < 69) { + return 0; + } + GOTO flow_1138 + flow_175: + if (standart_config_107 < 5) { + return 0; + } + GOTO flow_1138 + flow_178: + if (getSkillActualLvl(10) < 25) { + return 0; + } + GOTO flow_1138 + flow_181: + if (getSkillActualLvl(13) < 30) { + return 0; + } + GOTO flow_1138 + flow_184: + if (standart_config_63 < 6) { + return 0; + } + if (getSkillActualLvl(20) < 5) { + return 0; + } + GOTO flow_1138 + flow_189: + if (standart_config_107 < 5) { + return 0; + } + GOTO flow_1138 + flow_192: + if (standart_config_63 < 6) { + return 0; + } + GOTO flow_1138 + flow_195: + if (getSkillActualLvl(14) < 15) { + return 0; + } + GOTO flow_1138 + flow_198: + if (getSkillActualLvl(14) < 30) { + return 0; + } + GOTO flow_1138 + flow_201: + if (standart_config_29 < 2) { + return 0; + } + if (getSkillActualLvl(7) < 40) { + return 0; + } + GOTO flow_1138 + flow_206: + if (getSkillActualLvl(10) < 30) { + return 0; + } + GOTO flow_1138 + flow_209: + if (getSkillActualLvl(8) < 30) { + return 0; + } + GOTO flow_1138 + flow_212: + if ((standart_config_176 < 2) || (((boolean)bitconfig_3746) && (standart_config_176 < 10))) { + return 0; + } + GOTO flow_1138 + flow_216: + if (getSkillActualLvl(13) < 36) { + return 0; + } + GOTO flow_1138 + flow_219: + if (getSkillActualLvl(6) < 31) { + return 0; + } + GOTO flow_1138 + flow_222: + if (getSkillActualLvl(11) < 30) { + return 0; + } + GOTO flow_1138 + flow_225: + if (getSkillActualLvl(14) < 20) { + return 0; + } + GOTO flow_1138 + flow_228: + if (getSkillActualLvl(13) < 20) { + return 0; + } + GOTO flow_1138 + flow_231: + if (getSkillActualLvl(12) < 16) { + return 0; + } + GOTO flow_1138 + flow_234: + if (getSkillActualLvl(13) < 68) { + return 0; + } + GOTO flow_1138 + flow_237: + if (((getSkillActualLvl(6) < 49) || (getSkillActualLvl(12) < 50)) || (getSkillActualLvl(13) < 40)) { + return 0; + } + GOTO flow_1138 + flow_240: + if (getSkillActualLvl(7) < 50) { + return 0; + } + GOTO flow_1138 + flow_243: + if (getSkillActualLvl(6) < 59) { + return 0; + } + GOTO flow_1138 + flow_246: + if (getSkillActualLvl(5) < 45) { + return 0; + } + GOTO flow_1138 + flow_249: + if (getSkillActualLvl(20) < 57) { + return 0; + } + GOTO flow_1138 + flow_252: + if (getSkillActualLvl(11) < 60) { + return 0; + } + GOTO flow_1138 + flow_255: + if (getSkillActualLvl(22) < 16) { + return 0; + } + GOTO flow_1138 + flow_258: + if (standart_config_63 < 6) { + return 0; + } + GOTO flow_1138 + flow_261: + if (getSkillActualLvl(1) < 10) { + return 0; + } + GOTO flow_1138 + flow_264: + if (getSkillActualLvl(12) < 36) { + return 0; + } + GOTO flow_1138 + flow_267: + if (getSkillActualLvl(16) < 26) { + return 0; + } + GOTO flow_1138 + flow_270: + if (bitconfig_961 < 60) { + return 0; + } + GOTO flow_1138 + flow_273: + if (getSkillActualLvl(16) < 11) { + return 0; + } + if (getSkillActualLvl(4) < 19) { + return 0; + } + if (getSkillActualLvl(2) < 37) { + return 0; + } + GOTO flow_1138 + flow_280: + if (bitconfig_1051 < 10) { + return 0; + } + GOTO flow_1138 + flow_283: + if (getSkillActualLvl(11) < 49) { + return 0; + } + GOTO flow_1138 + flow_286: + if (getSkillActualLvl(17) < 40) { + return 0; + } + GOTO flow_1138 + flow_289: + if (getSkillActualLvl(19) < 23) { + return 0; + } + GOTO flow_1138 + flow_292: + if (standart_config_122 < 7) { + return 0; + } + if (getSkillActualLvl(14) < 10) { + return 0; + } + if (getSkillActualLvl(13) < 13) { + return 0; + } + GOTO flow_1138 + flow_299: + if (bitconfig_1404 < 127) { + return 0; + } + GOTO flow_1138 + flow_302: + if (bitconfig_657 < 2) { + return 0; + } + if (getSkillActualLvl(1) < 20) { + return 0; + } + if (getSkillActualLvl(5) < 10) { + return 0; + } + GOTO flow_1138 + flow_309: + if (bitconfig_1527 < 160) { + return 0; + } + GOTO flow_1138 + flow_312: + if (getSkillActualLvl(5) < 70) { + return 0; + } + if (getSkillActualLvl(22) < 16) { + return 0; + } + GOTO flow_1138 + flow_317: + if (standart_config_63 < 6) { + return 0; + } + if (getSkillActualLvl(20) < 56) { + return 0; + } + GOTO flow_1138 + flow_322: + if (getSkillActualLvl(19) < 60) { + return 0; + } + if (getSkillActualLvl(8) < 60) { + return 0; + } + GOTO flow_1138 + flow_327: + if (getSkillActualLvl(14) < 60) { + return 0; + } + GOTO flow_1138 + flow_330: + if (((boolean)bitconfig_2328)) { + return 0; + } + GOTO flow_1138 + flow_333: + if (getSkillActualLvl(18) < 32) { + return 0; + } + GOTO flow_1138 + flow_336: + if (getSkillActualLvl(18) < 72) { + return 0; + } + GOTO flow_1138 + flow_339: + if (getSkillActualLvl(23) < 56) { + return 0; + } + GOTO flow_1138 + flow_342: + if (bitconfig_2610 < 14) { + return 0; + } + if (getSkillActualLvl(1) < 30) { + return 0; + } + if (getSkillActualLvl(5) < 20) { + return 0; + } + GOTO flow_1138 + flow_349: + if (getSkillActualLvl(10) < 90) { + return 0; + } + GOTO flow_1138 + flow_352: + if (getSkillActualLvl(7) < 93) { + return 0; + } + GOTO flow_1138 + flow_355: + if (getSkillActualLvl(14) < 80) { + return 0; + } + GOTO flow_1138 + flow_358: + if (getSkillActualLvl(19) < 75) { + return 0; + } + if (getSkillActualLvl(8) < 75) { + return 0; + } + GOTO flow_1138 + flow_363: + if (bitconfig_4302 < 110) { + return 0; + } + if (getSkillActualLvl(23) < 80) { + return 0; + } + GOTO flow_1138 + flow_368: + if (bitconfig_2448 < 190) { + return 0; + } + if (getSkillActualLvl(6) < 80) { + return 0; + } + GOTO flow_1138 + flow_373: + if (getSkillActualLvl(5) < 95) { + return 0; + } + if (bitconfig_6775 < 90) { + return 0; + } + GOTO flow_1138 + flow_378: + if (getSkillActualLvl(18) < 10) { + return 0; + } + GOTO flow_1138 + flow_381: + if (bitconfig_4302 < 110) { + return 0; + } + GOTO flow_1138 + flow_384: + if (standart_config_347 < 10) { + return 0; + } + GOTO flow_1138 + flow_387: + if (standart_config_347 < 10) { + return 0; + } + GOTO flow_1138 + flow_390: + if (standart_config_347 < 10) { + return 0; + } + GOTO flow_1138 + flow_393: + if (standart_config_347 < 10) { + return 0; + } + if (getSkillActualLvl(12) < 33) { + return 0; + } + GOTO flow_1138 + flow_398: + if (standart_config_347 < 10) { + return 0; + } + if (bitconfig_961 < 60) { + return 0; + } + GOTO flow_1138 + flow_403: + if (((boolean)bitconfig_2328)) { + return 0; + } + GOTO flow_1138 + flow_406: + if (standart_config_347 < 10) { + return 0; + } + GOTO flow_1138 + flow_409: + if (getSkillActualLvl(21) < 55) { + return 0; + } + GOTO flow_1138 + flow_412: + if (standart_config_347 < 10) { + return 0; + } + if (getSkillActualLvl(1) < 20) { + return 0; + } + GOTO flow_1138 + flow_417: + if (standart_config_347 < 10) { + return 0; + } + if (getSkillActualLvl(7) < 48) { + return 0; + } + GOTO flow_1138 + flow_422: + if (getSkillActualLvl(17) < 42) { + return 0; + } + GOTO flow_1138 + flow_425: + if (standart_config_347 < 10) { + return 0; + } + GOTO flow_1138 + flow_428: + if (standart_config_347 < 10) { + return 0; + } + if (getSkillActualLvl(1) < 40) { + return 0; + } + GOTO flow_1138 + flow_433: + if ((standart_config_76 < 6) && ((boolean)bitconfig_3378)) { + return 0; + } + if (getSkillActualLvl(16) < 35) { + return 0; + } + GOTO flow_1138 + flow_439: + if (bitconfig_2448 < 190) { + return 0; + } + GOTO flow_1138 + flow_442: + if (((boolean)bitconfig_3764)) { + return 0; + } + if (getSkillActualLvl(12) < 52) { + return 0; + } + if (getSkillActualLvl(11) < 52) { + return 0; + } + GOTO flow_1138 + flow_449: + if (((boolean)bitconfig_3757)) { + return 0; + } + if (getSkillActualLvl(2) < 35) { + return 0; + } + if (getSkillActualLvl(10) < 55) { + return 0; + } + GOTO flow_1138 + flow_456: + if (bitconfig_2448 < 190) { + return 0; + } + if (getSkillActualLvl(6) < 65) { + return 0; + } + GOTO flow_1138 + flow_461: + if (((boolean)bitconfig_3764)) { + return 0; + } + GOTO flow_1138 + flow_464: + if (bitconfig_2140 < 30) { + return 0; + } + GOTO flow_1138 + flow_467: + if ((((((bitconfig_2448 < 190) || (getSkillActualLvl(6) < 70)) || (getSkillActualLvl(19) < 60)) || (getSkillActualLvl(16) < 60)) || (getSkillActualLvl(12) < 60)) || (getSkillActualLvl(22) < 50)) { + return 0; + } + GOTO flow_1138 + flow_470: + if (((boolean)bitconfig_3757)) { + return 0; + } + if (getSkillActualLvl(10) < 96) { + return 0; + } + if (getSkillActualLvl(2) < 76) { + return 0; + } + GOTO flow_1138 + flow_477: + if (getSkillActualLvl(16) < 90) { + return 0; + } + if (getSkillActualLvl(3) < 35) { + return 0; + } + if (getSkillActualLvl(1) < 35) { + return 0; + } + GOTO flow_1138 + flow_484: + if (bitconfig_2448 < 190) { + return 0; + } + if (getSkillActualLvl(20) < 82) { + return 0; + } + GOTO flow_1138 + flow_489: + if (getSkillActualLvl(18) < 93) { + return 0; + } + GOTO flow_1138 + flow_492: + if (getSkillActualLvl(16) < 81) { + return 0; + } + GOTO flow_1138 + flow_495: + if (((boolean)bitconfig_3764)) { + return 0; + } + if (getSkillActualLvl(12) < 85) { + return 0; + } + if (getSkillActualLvl(11) < 85) { + return 0; + } + GOTO flow_1138 + flow_502: + if (((boolean)bitconfig_3763)) { + return 0; + } + if (getSkillActualLvl(13) < 90) { + return 0; + } + GOTO flow_1138 + flow_507: + if (((boolean)bitconfig_3761)) { + return 0; + } + if (getSkillActualLvl(15) < 80) { + return 0; + } + GOTO flow_1138 + flow_512: + if (bitconfig_6883 < 147) { + return 0; + } + if (getSkillActualLvl(0) < 75) { + return 0; + } + if (getSkillActualLvl(2) < 75) { + return 0; + } + if (getSkillActualLvl(18) < 65) { + return 0; + } + GOTO flow_1138 + flow_521: + if (getSkillActualLvl(16) < 10) { + return 0; + } + GOTO flow_1138 + flow_524: + if (getSkillActualLvl(14) < 40) { + return 0; + } + GOTO flow_1138 + flow_527: + if (getSkillActualLvl(16) < 15) { + return 0; + } + GOTO flow_1138 + flow_530: + if (standart_config_176 < 8) { + return 0; + } + GOTO flow_1138 + flow_533: + if (standart_config_176 < 8) { + return 0; + } + GOTO flow_1138 + flow_536: + if (standart_config_116 < 15) { + return 0; + } + GOTO flow_1138 + flow_539: + if (standart_config_175 < 12) { + return 0; + } + if (getSkillActualLvl(8) < 10) { + return 0; + } + GOTO flow_1138 + flow_544: + if (getSkillActualLvl(7) < 16) { + return 0; + } + GOTO flow_1138 + flow_547: + if (standart_config_116 < 15) { + return 0; + } + if (getSkillActualLvl(14) < 40) { + return 0; + } + GOTO flow_1138 + flow_552: + if (getSkillActualLvl(8) < 35) { + return 0; + } + GOTO flow_1138 + flow_555: + if (getSkillActualLvl(8) < 50) { + return 0; + } + GOTO flow_1138 + flow_558: + if (standart_config_320 < 6) { + return 0; + } + if (getSkillActualLvl(10) < 65) { + return 0; + } + GOTO flow_1138 + flow_563: + if (standart_config_175 < 12) { + return 0; + } + GOTO flow_1138 + flow_566: + if (standart_config_150 < 160) { + return 0; + } + GOTO flow_1138 + flow_569: + if (getSkillActualLvl(19) < 27) { + return 0; + } + GOTO flow_1138 + flow_572: + if (getSkillActualLvl(21) < 41) { + return 0; + } + GOTO flow_1138 + flow_575: + if (getSkillActualLvl(8) < 10) { + return 0; + } + GOTO flow_1138 + flow_578: + if (getSkillActualLvl(16) < 12) { + return 0; + } + GOTO flow_1138 + flow_581: + if (standart_config_116 < 15) { + return 0; + } + GOTO flow_1138 + flow_584: + if (standart_config_150 < 160) { + return 0; + } + if (standart_config_365 < 9) { + return 0; + } + GOTO flow_1138 + flow_589: + if (standart_config_63 < 6) { + return 0; + } + if (getSkillActualLvl(20) < 44) { + return 0; + } + GOTO flow_1138 + flow_594: + if (standart_config_320 < 6) { + return 0; + } + if (getSkillActualLvl(7) < 30) { + return 0; + } + GOTO flow_1138 + flow_599: + if (standart_config_139 < 75) { + return 0; + } + if (getSkillActualLvl(8) < 15) { + return 0; + } + if (getSkillActualLvl(16) < 50) { + return 0; + } + if (getSkillActualLvl(2) < 50) { + return 0; + } + if (getSkillActualLvl(17) < 50) { + return 0; + } + if (getSkillActualLvl(14) < 52) { + return 0; + } + GOTO flow_1138 + flow_612: + if (getSkillActualLvl(16) < 53) { + return 0; + } + if (getSkillActualLvl(4) < 42) { + return 0; + } + if (getSkillActualLvl(2) < 21) { + return 0; + } + GOTO flow_1138 + flow_619: + if (standart_config_139 < 75) { + return 0; + } + if (getSkillActualLvl(8) < 15) { + return 0; + } + GOTO flow_1138 + flow_624: + if (standart_config_116 < 15) { + return 0; + } + if (getSkillActualLvl(18) < 50) { + return 0; + } + if (script_1432() < 100) { + return 0; + } + GOTO flow_1138 + flow_631: + if (getSkillActualLvl(16) < 12) { + return 0; + } + if (getSkillActualLvl(8) < 34) { + return 0; + } + GOTO flow_1138 + flow_636: + if (getSkillActualLvl(20) < 91) { + return 0; + } + GOTO flow_1138 + flow_639: + if (bitconfig_4302 < 110) { + return 0; + } + if (getSkillActualLvl(23) < 95) { + return 0; + } + if (getSkillActualLvl(21) < 27) { + return 0; + } + GOTO flow_1138 + flow_646: + if (getSkillActualLvl(15) < 63) { + return 0; + } + GOTO flow_1138 + flow_649: + if (getSkillActualLvl(7) < 80) { + return 0; + } + GOTO flow_1138 + flow_652: + if (bitconfig_4302 < 110) { + return 0; + } + if (getSkillActualLvl(23) < 90) { + return 0; + } + GOTO flow_1138 + flow_657: + if (standart_config_116 < 15) { + return 0; + } + if (getSkillActualLvl(16) < 74) { + return 0; + } + GOTO flow_1138 + flow_662: + if (getMyCombat() < 100) { + return 0; + } + if (getSkillActualLvl(18) < 50) { + return 0; + } + if (bitconfig_5491 < 910) { + return 0; + } + GOTO flow_1138 + flow_669: + if (getSkillActualLvl(19) < 13) { + return 0; + } + GOTO flow_1138 + flow_672: + if (getSkillActualLvl(12) < 10) { + return 0; + } + GOTO flow_1138 + flow_675: + if (standart_config_192 < 2) { + return 0; + } + GOTO flow_1138 + flow_678: + if (getSkillActualLvl(7) < 21) { + return 0; + } + GOTO flow_1138 + flow_681: + if (getSkillActualLvl(10) < 16) { + return 0; + } + GOTO flow_1138 + flow_684: + if (getSkillActualLvl(16) < 48) { + return 0; + } + GOTO flow_1138 + flow_687: + if (standart_config_76 < 6) { + return 0; + } + GOTO flow_1138 + flow_690: + if (getSkillActualLvl(14) < 30) { + return 0; + } + GOTO flow_1138 + flow_693: + if (bitconfig_2067 < 1) { + return 0; + } + GOTO flow_1138 + flow_696: + if (getSkillActualLvl(6) < 45) { + return 0; + } + GOTO flow_1138 + flow_699: + if (getSkillActualLvl(4) < 40) { + return 0; + } + GOTO flow_1138 + flow_702: + if (getSkillActualLvl(4) < 40) { + return 0; + } + GOTO flow_1138 + flow_705: + if (standart_config_416 < 280) { + return 0; + } + GOTO flow_1138 + flow_708: + if (bitconfig_4302 < 110) { + return 0; + } + if (getSkillActualLvl(11) < 45) { + return 0; + } + if (getSkillActualLvl(23) < 46) { + return 0; + } + GOTO flow_1138 + flow_715: + if (getSkillActualLvl(10) < 46) { + return 0; + } + if (getSkillActualLvl(7) < 43) { + return 0; + } + GOTO flow_1138 + flow_720: + if (getSkillActualLvl(4) < 40) { + return 0; + } + GOTO flow_1138 + flow_723: + if (getSkillActualLvl(8) < 60) { + return 0; + } + GOTO flow_1138 + flow_726: + if (getSkillActualLvl(9) < 80) { + return 0; + } + GOTO flow_1138 + flow_729: + if (bitconfig_3909 < 8) { + return 0; + } + if (getSkillActualLvl(5) < 70) { + return 0; + } + GOTO flow_1138 + flow_734: + if (((boolean)bitconfig_2328)) { + return 0; + } + GOTO flow_1138 + flow_737: + if (getSkillActualLvl(11) < 75) { + return 0; + } + GOTO flow_1138 + flow_740: + if (getSkillActualLvl(6) < 55) { + return 0; + } + GOTO flow_1138 + flow_743: + if (getSkillActualLvl(2) < 22) { + return 0; + } + if (getSkillActualLvl(16) < 36) { + return 0; + } + if (getSkillActualLvl(4) < 39) { + return 0; + } + GOTO flow_1138 + flow_750: + if (getSkillActualLvl(10) < 76) { + return 0; + } + GOTO flow_1138 + flow_753: + if (standart_config_148 < 11) { + return 0; + } + if (getSkillActualLvl(7) < 80) { + return 0; + } + GOTO flow_1138 + flow_758: + if (getSkillActualLvl(6) < 56) { + return 0; + } + GOTO flow_1138 + flow_761: + if (getSkillActualLvl(10) < 35) { + return 0; + } + if (getSkillActualLvl(7) < 70) { + return 0; + } + GOTO flow_1138 + flow_766: + if (getSkillActualLvl(13) < 73) { + return 0; + } + if (getSkillActualLvl(9) < 65) { + return 0; + } + if (getSkillActualLvl(6) < 57) { + return 0; + } + GOTO flow_1138 + flow_773: + if (getSkillActualLvl(9) < 85) { + return 0; + } + if (getSkillActualLvl(12) < 10) { + return 0; + } + GOTO flow_1138 + flow_778: + if (getSkillActualLvl(15) < 92) { + return 0; + } + if (getSkillActualLvl(4) < 40) { + return 0; + } + GOTO flow_1138 + flow_783: + if (getSkillActualLvl(6) < 83) { + return 0; + } + if (bitconfig_2448 < 190) { + return 0; + } + GOTO flow_1138 + flow_788: + if (standart_config_63 < 6) { + return 0; + } + GOTO flow_1138 + flow_791: + if (getSkillActualLvl(14) < 15) { + return 0; + } + GOTO flow_1138 + flow_794: + if (getSkillActualLvl(16) < 13) { + return 0; + } + GOTO flow_1138 + flow_797: + if (getSkillActualLvl(12) < 8) { + return 0; + } + GOTO flow_1138 + flow_800: + if (getSkillActualLvl(22) < 10) { + return 0; + } + GOTO flow_1138 + flow_803: + if (getSkillActualLvl(14) < 10) { + return 0; + } + GOTO flow_1138 + flow_806: + if (getSkillActualLvl(10) < 20) { + return 0; + } + GOTO flow_1138 + flow_809: + if (standart_config_101 < 33) { + return 0; + } + GOTO flow_1138 + flow_812: + if ((bitconfig_3523 < 150) || (getSkillActualLvl(14) < 42)) { + return 0; + } + GOTO flow_1138 + flow_815: + if (bitconfig_1404 < 127) { + return 0; + } + GOTO flow_1138 + flow_818: + if (standart_config_111 < 9) { + return 0; + } + GOTO flow_1138 + flow_821: + if (bitconfig_2309 < 1) { + return 0; + } + if (bitconfig_2310 < 1) { + return 0; + } + if (bitconfig_2311 < 1) { + return 0; + } + if (bitconfig_2312 < 1) { + return 0; + } + GOTO flow_1138 + flow_830: + if (standart_config_180 < 6) { + return 0; + } + if (bitconfig_961 < 60) { + return 0; + } + GOTO flow_1138 + flow_835: + if (getSkillActualLvl(16) < 21) { + return 0; + } + GOTO flow_1138 + flow_838: + if (bitconfig_2011 < 13) { + return 0; + } + GOTO flow_1138 + flow_841: + if (bitconfig_3639 < 1) { + return 0; + } + if (getSkillActualLvl(6) < 49) { + return 0; + } + GOTO flow_1138 + flow_846: + if (getSkillActualLvl(17) < 40) { + return 0; + } + GOTO flow_1138 + flow_849: + if (getSkillActualLvl(6) < 25) { + return 0; + } + GOTO flow_1138 + flow_852: + if (script_1432() < 40) { + return 0; + } + GOTO flow_1138 + flow_855: + if (bitconfig_961 < 60) { + return 0; + } + GOTO flow_1138 + flow_858: + if (bitconfig_2866 < 200) { + return 0; + } + GOTO flow_1138 + flow_861: + if (standart_config_180 < 6) { + return 0; + } + GOTO flow_1138 + flow_864: + if (((boolean)bitconfig_2328)) { + return 0; + } + GOTO flow_1138 + flow_867: + if (standart_config_176 < 10) { + return 0; + } + GOTO flow_1138 + flow_870: + if (getSkillActualLvl(19) < 70) { + return 0; + } + GOTO flow_1138 + flow_873: + if (getSkillActualLvl(16) < 51) { + return 0; + } + GOTO flow_1138 + flow_876: + if (getSkillActualLvl(13) < 73) { + return 0; + } + GOTO flow_1138 + flow_879: + if (script_4035() < 153) { + return 0; + } + GOTO flow_1138 + flow_882: + if (getSkillActualLvl(7) < 32) { + return 0; + } + GOTO flow_1138 + flow_885: + if (getSkillActualLvl(12) < 66) { + return 0; + } + GOTO flow_1138 + flow_888: + if (getSkillActualLvl(22) < 40) { + return 0; + } + GOTO flow_1138 + flow_891: + if (getSkillActualLvl(6) < 25) { + return 0; + } + GOTO flow_1138 + flow_894: + if (standart_config_148 < 11) { + return 0; + } + GOTO flow_1138 + flow_897: + if (getSkillActualLvl(8) < 57) { + return 0; + } + GOTO flow_1138 + flow_900: + if (bitconfig_358 < 15) { + return 0; + } + GOTO flow_1138 + flow_903: + if (bitconfig_3523 < 150) { + return 0; + } + GOTO flow_1138 + flow_906: + if (bitconfig_6962 < 12) { + return 0; + } + GOTO flow_1138 + flow_909: + if (getSkillActualLvl(8) < 80) { + return 0; + } + GOTO flow_1138 + flow_912: + if (bitconfig_5133 < 90) { + return 0; + } + if (getSkillActualLvl(11) < 92) { + return 0; + } + if (getSkillActualLvl(19) < 15) { + return 0; + } + GOTO flow_1138 + flow_919: + if (bitconfig_3523 < 150) { + return 0; + } + if (getSkillActualLvl(6) < 80) { + return 0; + } + GOTO flow_1138 + flow_924: + if (getSkillActualLvl(7) < 95) { + return 0; + } + GOTO flow_1138 + flow_927: + if (bitconfig_6775 < 90) { + return 0; + } + if (getSkillActualLvl(5) < 92) { + return 0; + } + GOTO flow_1138 + flow_932: + if (getSkillActualLvl(13) < 88) { + return 0; + } + if (getSkillActualLvl(9) < 69) { + return 0; + } + GOTO flow_1138 + flow_937: + if (getSkillActualLvl(20) < 78) { + return 0; + } + GOTO flow_1138 + flow_940: + if (standart_config_63 < 6) { + return 0; + } + GOTO flow_1138 + flow_943: + if (standart_config_63 < 6) { + return 0; + } + GOTO flow_1138 + flow_946: + if (getSkillActualLvl(0) < 5) { + return 0; + } + GOTO flow_1138 + flow_949: + if (getSkillActualLvl(1) < 5) { + return 0; + } + GOTO flow_1138 + flow_952: + if (getSkillActualLvl(13) < 2) { + return 0; + } + GOTO flow_1138 + flow_955: + if (getSkillActualLvl(13) < 3) { + return 0; + } + GOTO flow_1138 + flow_958: + if (getSkillActualLvl(12) < 4) { + return 0; + } + GOTO flow_1138 + flow_961: + if (getSkillActualLvl(12) < 7) { + return 0; + } + GOTO flow_1138 + flow_964: + if (getSkillActualLvl(10) < 5) { + return 0; + } + GOTO flow_1138 + flow_967: + if (getSkillActualLvl(7) < 5) { + return 0; + } + GOTO flow_1138 + flow_970: + if (getSkillActualLvl(6) < 3) { + return 0; + } + GOTO flow_1138 + flow_973: + if (getSkillActualLvl(6) < 7) { + return 0; + } + GOTO flow_1138 + flow_976: + if (getSkillActualLvl(4) < 5) { + return 0; + } + GOTO flow_1138 + flow_979: + if (getSkillActualLvl(4) < 5) { + return 0; + } + GOTO flow_1138 + flow_982: + if (getSkillActualLvl(7) < 10) { + return 0; + } + GOTO flow_1138 + flow_985: + if (getMinute() < standart_config_451) { + return 0; + } + if ((standart_config_101 < bitconfig_456) && (script_4218() > 0)) { + return 0; + } + GOTO flow_1138 + flow_991: + if (script_1432() < 40) { + return 0; + } + GOTO flow_1138 + flow_994: + if (bitconfig_5276 == 10) { + return 0; + } + if (bitconfig_5275 == 50) { + return 0; + } + if (((boolean)bitconfig_5277)) { + return 0; + } + GOTO flow_1138 + flow_1001: + if (bitconfig_1545 >= 2) { + return 0; + } + GOTO flow_1138 + flow_1004: + if (getSkillCurrentLvl(21) < 17) { + return 0; + } + GOTO flow_1138 + flow_1007: + if (((bitconfig_5251 != 0) && (bitconfig_5252 != 0)) && (bitconfig_5253 != 0)) { + return 0; + } + GOTO flow_1138 + flow_1012: + if (bitconfig_3523 < 150) { + return 0; + } + if (standart_config_1199 == getCurrentDaysSinceLaunch()) { + return 0; + } + GOTO flow_1138 + flow_1017: + if (bitconfig_5133 < 90) { + return 0; + } + GOTO flow_1138 + flow_1020: + if (bitconfig_6307 < 12) { + return 0; + } + if (getMinute() < bitconfig_6305) { + return 0; + } + GOTO flow_1138 + flow_1025: + if (standart_config_101 < 33) { + return 0; + } + GOTO flow_1138 + flow_1028: + if (getSkillActualLvl(20) < 50) { + return 0; + } + GOTO flow_1138 + flow_1031: + if (script_1432() < 40) { + return 0; + } + GOTO flow_1138 + flow_1034: + if ((getSkillActualLvl(0) < 65) && (getSkillActualLvl(1) < 65)) { + return 0; + } + if (bitconfig_3888 < 90) { + return 0; + } + GOTO flow_1138 + flow_1040: + if (standart_config_175 < 12) { + return 0; + } + if (getSkillActualLvl(8) < 10) { + return 0; + } + GOTO flow_1138 + flow_1045: + if (standart_config_302 < 60) { + return 0; + } + if (standart_config_339 < 85) { + return 0; + } + GOTO flow_1138 + flow_1050: + if (standart_config_302 < 60) { + return 0; + } + GOTO flow_1138 + flow_1053: + if (getSkillActualLvl(17) < 21) { + return 0; + } + GOTO flow_1138 + flow_1056: + if (getSkillActualLvl(6) < 7) { + return 0; + } + GOTO flow_1138 + flow_1059: + if (script_1432() < 48) { + return 0; + } + GOTO flow_1138 + flow_1062: + if (standart_config_273 < 110) { + return 0; + } + GOTO flow_1138 + flow_1065: + if (((add(getSkillActualLvl(2), getSkillActualLvl(0)) < 130) && (getSkillActualLvl(0) < 99)) && (getSkillActualLvl(2) < 99)) { + return 0; + } + GOTO flow_1138 + flow_1070: + if (script_4098() != 3500) { + return 0; + } + GOTO flow_1138 + flow_1073: + if (script_4098() != 3501) { + return 0; + } + GOTO flow_1138 + flow_1076: + if (script_4098() != 3505) { + return 0; + } + GOTO flow_1138 + flow_1079: + if (script_4098() != 3511) { + return 0; + } + GOTO flow_1138 + flow_1082: + if (script_4098() != 3502) { + return 0; + } + GOTO flow_1138 + flow_1085: + if (script_4098() != 3503) { + return 0; + } + GOTO flow_1138 + flow_1088: + if (script_4098() != 3504) { + return 0; + } + GOTO flow_1138 + flow_1091: + if (script_4098() != 3506) { + return 0; + } + GOTO flow_1138 + flow_1094: + if (script_4098() != 3508) { + return 0; + } + GOTO flow_1138 + flow_1097: + if (script_4098() != 3509) { + return 0; + } + GOTO flow_1138 + flow_1100: + if (script_4098() != 3507) { + return 0; + } + GOTO flow_1138 + flow_1103: + if (script_4098() != 3523) { + return 0; + } + GOTO flow_1138 + flow_1106: + if (script_4098() != 3510) { + return 0; + } + GOTO flow_1138 + flow_1109: + if (script_4098() != 3512) { + return 0; + } + GOTO flow_1138 + flow_1112: + if (script_4098() != 3513) { + return 0; + } + GOTO flow_1138 + flow_1115: + if (script_4098() != 3514) { + return 0; + } + GOTO flow_1138 + flow_1118: + if ((((standart_config_281 < 135) || (standart_config_281 > 160)) || ((boolean)bitconfig_6495)) || ((boolean)bitconfig_6495)) { + return 0; + } + GOTO flow_1138 + flow_1121: + if ((((standart_config_281 < 135) || (standart_config_281 > 160)) || (bitconfig_6495 == 2)) || (bitconfig_6495 == 3)) { + return 0; + } + GOTO flow_1138 + flow_1124: + if ((((standart_config_281 < 140) || ((boolean)bitconfig_6495)) || ((boolean)bitconfig_6495)) || (getSkillActualLvl(8) > 1)) { + return 0; + } + GOTO flow_1138 + flow_1127: + if ((((standart_config_281 < 140) || (bitconfig_6495 == 2)) || (bitconfig_6495 == 3)) || (getSkillActualLvl(14) > 1)) { + return 0; + } + GOTO flow_1138 + flow_1130: + if (script_4098() != 3519) { + return 0; + } + GOTO flow_1138 + flow_1133: + if ((script_4098() != 3521) || (bitconfig_6494 > 2)) { + return 0; + } + GOTO flow_1138 + flow_1136: + if ((script_4098() != 3521) || (bitconfig_6494 != 5)) { + return 0; + } + flow_1138: + return 1; +} diff --git a/dumps/scripts/3225.cs2 b/dumps/scripts/3225.cs2 new file mode 100644 index 000000000..945d462cc --- /dev/null +++ b/dumps/scripts/3225.cs2 @@ -0,0 +1,4 @@ +void script_3225(int arg0,int arg1,string arg2) { + script_3226(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3226.cs2 b/dumps/scripts/3226.cs2 new file mode 100644 index 000000000..44d7f3e10 --- /dev/null +++ b/dumps/scripts/3226.cs2 @@ -0,0 +1,10 @@ +void script_3226(int arg0,int arg1,string arg2) { + if (((boolean)arg1)) { + setWidgetRGB(new Color(67, 200, 0), new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), "" + arg2 + ""); + } else { + setWidgetRGB(new Color(51, 153, 0), new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), "" + arg2 + ""); + } + return; +} diff --git a/dumps/scripts/3227.cs2 b/dumps/scripts/3227.cs2 new file mode 100644 index 000000000..0e1f9a0e6 --- /dev/null +++ b/dumps/scripts/3227.cs2 @@ -0,0 +1,3253 @@ +int script_3227(int arg0) { + flow_0: + if (getOtherCommonData(cs2method_3408(105, 74, 3483, arg0), 1270) != 4094) { + return script_2193(getOtherCommonData(cs2method_3408(105, 74, 3483, arg0), 1270)); + } + SWITCH (arg0) { + case 0: + GOTO flow_3 + case 1: + GOTO flow_6 + case 2: + GOTO flow_9 + case 3: + GOTO flow_12 + case 4: + GOTO flow_15 + case 5: + GOTO flow_18 + case 6: + GOTO flow_21 + case 7: + GOTO flow_24 + case 8: + GOTO flow_27 + case 9: + GOTO flow_30 + case 10: + GOTO flow_33 + case 11: + GOTO flow_36 + case 12: + GOTO flow_39 + case 13: + GOTO flow_42 + case 14: + GOTO flow_45 + case 15: + GOTO flow_48 + case 16: + GOTO flow_51 + case 17: + GOTO flow_54 + case 18: + GOTO flow_57 + case 19: + GOTO flow_60 + case 20: + GOTO flow_63 + case 21: + GOTO flow_66 + case 22: + GOTO flow_69 + case 23: + GOTO flow_72 + case 24: + GOTO flow_75 + case 25: + GOTO flow_78 + case 26: + GOTO flow_81 + case 27: + GOTO flow_84 + case 28: + GOTO flow_87 + case 29: + GOTO flow_90 + case 30: + GOTO flow_93 + case 31: + GOTO flow_96 + case 32: + GOTO flow_99 + case 33: + GOTO flow_102 + case 34: + GOTO flow_105 + case 35: + GOTO flow_108 + case 36: + GOTO flow_111 + case 37: + GOTO flow_114 + case 38: + GOTO flow_117 + case 39: + GOTO flow_120 + case 40: + GOTO flow_123 + case 41: + GOTO flow_126 + case 42: + GOTO flow_129 + case 43: + GOTO flow_132 + case 44: + GOTO flow_135 + case 45: + GOTO flow_138 + case 46: + GOTO flow_141 + case 47: + GOTO flow_144 + case 48: + GOTO flow_147 + case 49: + GOTO flow_150 + case 50: + GOTO flow_153 + case 51: + GOTO flow_156 + case 52: + GOTO flow_159 + case 53: + GOTO flow_162 + case 54: + GOTO flow_165 + case 55: + GOTO flow_168 + case 56: + GOTO flow_171 + case 57: + GOTO flow_174 + case 58: + GOTO flow_177 + case 59: + GOTO flow_180 + case 60: + GOTO flow_183 + case 61: + GOTO flow_188 + case 62: + GOTO flow_191 + case 63: + GOTO flow_194 + case 64: + GOTO flow_197 + case 65: + GOTO flow_200 + case 66: + GOTO flow_203 + case 67: + GOTO flow_206 + case 68: + GOTO flow_209 + case 69: + GOTO flow_212 + case 70: + GOTO flow_215 + case 71: + GOTO flow_218 + case 72: + GOTO flow_221 + case 73: + GOTO flow_224 + case 74: + GOTO flow_227 + case 75: + GOTO flow_230 + case 76: + GOTO flow_233 + case 77: + GOTO flow_236 + case 78: + GOTO flow_239 + case 79: + GOTO flow_242 + case 80: + GOTO flow_245 + case 81: + GOTO flow_248 + case 82: + GOTO flow_251 + case 83: + GOTO flow_254 + case 84: + GOTO flow_257 + case 85: + GOTO flow_260 + case 86: + GOTO flow_263 + case 87: + GOTO flow_266 + case 88: + GOTO flow_269 + case 89: + GOTO flow_272 + case 90: + GOTO flow_275 + case 91: + GOTO flow_278 + case 92: + GOTO flow_281 + case 93: + GOTO flow_284 + case 94: + GOTO flow_287 + case 95: + GOTO flow_290 + case 96: + GOTO flow_293 + case 97: + GOTO flow_296 + case 98: + GOTO flow_299 + case 99: + GOTO flow_302 + case 100: + GOTO flow_305 + case 101: + GOTO flow_308 + case 102: + GOTO flow_311 + case 103: + GOTO flow_314 + case 104: + GOTO flow_317 + case 105: + GOTO flow_320 + case 106: + GOTO flow_323 + case 107: + GOTO flow_326 + case 108: + GOTO flow_329 + case 109: + GOTO flow_332 + case 110: + GOTO flow_335 + case 111: + GOTO flow_338 + case 112: + GOTO flow_341 + case 113: + GOTO flow_344 + case 114: + GOTO flow_347 + case 351: + GOTO flow_350 + case 352: + GOTO flow_353 + case 353: + GOTO flow_356 + case 354: + GOTO flow_359 + case 355: + GOTO flow_362 + case 356: + GOTO flow_365 + case 357: + GOTO flow_368 + case 115: + GOTO flow_371 + case 116: + GOTO flow_374 + case 117: + GOTO flow_377 + case 118: + GOTO flow_380 + case 119: + GOTO flow_383 + case 120: + GOTO flow_386 + case 121: + GOTO flow_389 + case 122: + GOTO flow_392 + case 123: + GOTO flow_395 + case 124: + GOTO flow_398 + case 125: + GOTO flow_401 + case 126: + GOTO flow_404 + case 127: + GOTO flow_407 + case 128: + GOTO flow_410 + case 129: + GOTO flow_413 + case 130: + GOTO flow_418 + case 131: + GOTO flow_421 + case 132: + GOTO flow_424 + case 133: + GOTO flow_427 + case 134: + GOTO flow_432 + case 135: + GOTO flow_435 + case 136: + GOTO flow_438 + case 137: + GOTO flow_441 + case 138: + GOTO flow_444 + case 139: + GOTO flow_447 + case 140: + GOTO flow_450 + case 141: + GOTO flow_453 + case 142: + GOTO flow_456 + case 143: + GOTO flow_459 + case 144: + GOTO flow_462 + case 145: + GOTO flow_465 + case 146: + GOTO flow_468 + case 147: + GOTO flow_471 + case 148: + GOTO flow_474 + case 149: + GOTO flow_477 + case 150: + GOTO flow_480 + case 151: + GOTO flow_483 + case 309: + GOTO flow_486 + case 310: + GOTO flow_489 + case 311: + GOTO flow_492 + case 312: + GOTO flow_495 + case 313: + GOTO flow_498 + case 314: + GOTO flow_501 + case 315: + GOTO flow_504 + case 152: + GOTO flow_507 + case 153: + GOTO flow_510 + case 154: + GOTO flow_513 + case 155: + GOTO flow_516 + case 156: + GOTO flow_519 + case 157: + GOTO flow_522 + case 158: + GOTO flow_525 + case 159: + GOTO flow_528 + case 160: + GOTO flow_531 + case 161: + GOTO flow_534 + case 162: + GOTO flow_537 + case 163: + GOTO flow_540 + case 164: + GOTO flow_543 + case 165: + GOTO flow_546 + case 166: + GOTO flow_549 + case 167: + GOTO flow_552 + case 168: + GOTO flow_555 + case 169: + GOTO flow_558 + case 170: + GOTO flow_561 + case 171: + GOTO flow_564 + case 172: + GOTO flow_567 + case 173: + GOTO flow_570 + case 174: + GOTO flow_573 + case 175: + GOTO flow_576 + case 176: + GOTO flow_579 + case 177: + GOTO flow_582 + case 178: + GOTO flow_585 + case 179: + GOTO flow_588 + case 180: + GOTO flow_591 + case 181: + GOTO flow_594 + case 428: + GOTO flow_597 + case 316: + GOTO flow_600 + case 317: + GOTO flow_603 + case 318: + GOTO flow_606 + case 319: + GOTO flow_609 + case 320: + GOTO flow_612 + case 321: + GOTO flow_615 + case 322: + GOTO flow_618 + case 323: + GOTO flow_621 + case 417: + GOTO flow_624 + case 182: + GOTO flow_627 + case 183: + GOTO flow_632 + case 184: + GOTO flow_635 + case 185: + GOTO flow_638 + case 186: + GOTO flow_641 + case 187: + GOTO flow_644 + case 188: + GOTO flow_647 + case 189: + GOTO flow_650 + case 190: + GOTO flow_655 + case 191: + GOTO flow_658 + case 192: + GOTO flow_661 + case 193: + GOTO flow_664 + case 194: + GOTO flow_667 + case 195: + GOTO flow_670 + case 196: + GOTO flow_673 + case 197: + GOTO flow_676 + case 198: + GOTO flow_679 + case 199: + GOTO flow_682 + case 200: + GOTO flow_685 + case 201: + GOTO flow_688 + case 202: + GOTO flow_691 + case 203: + GOTO flow_694 + case 204: + GOTO flow_697 + case 205: + GOTO flow_700 + case 206: + GOTO flow_703 + case 207: + GOTO flow_706 + case 208: + GOTO flow_709 + case 209: + GOTO flow_712 + case 210: + GOTO flow_715 + case 211: + GOTO flow_718 + case 212: + GOTO flow_721 + case 213: + GOTO flow_724 + case 214: + GOTO flow_727 + case 215: + GOTO flow_730 + case 216: + GOTO flow_733 + case 217: + GOTO flow_736 + case 218: + GOTO flow_739 + case 219: + GOTO flow_744 + case 220: + GOTO flow_747 + case 324: + GOTO flow_750 + case 325: + GOTO flow_753 + case 326: + GOTO flow_756 + case 327: + GOTO flow_759 + case 328: + GOTO flow_762 + case 329: + GOTO flow_765 + case 330: + GOTO flow_768 + case 331: + GOTO flow_771 + case 221: + GOTO flow_774 + case 222: + GOTO flow_779 + case 223: + GOTO flow_782 + case 224: + GOTO flow_785 + case 225: + GOTO flow_788 + case 226: + GOTO flow_791 + case 227: + GOTO flow_794 + case 228: + GOTO flow_799 + case 229: + GOTO flow_804 + case 230: + GOTO flow_807 + case 231: + GOTO flow_810 + case 232: + GOTO flow_813 + case 233: + GOTO flow_816 + case 234: + GOTO flow_819 + case 235: + GOTO flow_822 + case 236: + GOTO flow_825 + case 237: + GOTO flow_830 + case 238: + GOTO flow_833 + case 239: + GOTO flow_836 + case 240: + GOTO flow_839 + case 241: + GOTO flow_842 + case 242: + GOTO flow_845 + case 243: + GOTO flow_848 + case 244: + GOTO flow_851 + case 245: + GOTO flow_856 + case 246: + GOTO flow_859 + case 247: + GOTO flow_864 + case 248: + GOTO flow_867 + case 249: + GOTO flow_870 + case 250: + GOTO flow_873 + case 251: + GOTO flow_876 + case 252: + GOTO flow_879 + case 253: + GOTO flow_882 + case 254: + GOTO flow_887 + case 255: + GOTO flow_892 + case 332: + GOTO flow_897 + case 333: + GOTO flow_900 + case 334: + GOTO flow_903 + case 335: + GOTO flow_906 + case 336: + GOTO flow_909 + case 256: + GOTO flow_912 + case 257: + GOTO flow_915 + case 258: + GOTO flow_918 + case 259: + GOTO flow_921 + case 260: + GOTO flow_924 + case 261: + GOTO flow_927 + case 262: + GOTO flow_930 + case 263: + GOTO flow_933 + case 264: + GOTO flow_936 + case 265: + GOTO flow_939 + case 266: + GOTO flow_942 + case 267: + GOTO flow_945 + case 268: + GOTO flow_948 + case 269: + GOTO flow_951 + case 270: + GOTO flow_954 + case 271: + GOTO flow_957 + case 272: + GOTO flow_960 + case 273: + GOTO flow_963 + case 274: + GOTO flow_966 + case 275: + GOTO flow_969 + case 276: + GOTO flow_972 + case 277: + GOTO flow_975 + case 278: + GOTO flow_978 + case 279: + GOTO flow_981 + case 280: + GOTO flow_984 + case 281: + GOTO flow_987 + case 282: + GOTO flow_992 + case 283: + GOTO flow_995 + case 284: + GOTO flow_998 + case 285: + GOTO flow_1001 + case 286: + GOTO flow_1004 + case 287: + GOTO flow_1007 + case 288: + GOTO flow_1010 + case 289: + GOTO flow_1013 + case 290: + GOTO flow_1016 + case 291: + GOTO flow_1019 + case 292: + GOTO flow_1022 + case 293: + GOTO flow_1025 + case 294: + GOTO flow_1028 + case 295: + GOTO flow_1031 + case 296: + GOTO flow_1034 + case 297: + GOTO flow_1037 + case 298: + GOTO flow_1040 + case 299: + GOTO flow_1043 + case 300: + GOTO flow_1046 + case 301: + GOTO flow_1049 + case 302: + GOTO flow_1052 + case 303: + GOTO flow_1055 + case 304: + GOTO flow_1058 + case 305: + GOTO flow_1061 + case 306: + GOTO flow_1064 + case 307: + GOTO flow_1067 + case 308: + GOTO flow_1070 + case 337: + GOTO flow_1073 + case 338: + GOTO flow_1076 + case 339: + GOTO flow_1079 + case 340: + GOTO flow_1082 + case 341: + GOTO flow_1085 + case 342: + GOTO flow_1088 + case 343: + GOTO flow_1091 + case 344: + GOTO flow_1094 + case 345: + GOTO flow_1097 + case 358: + GOTO flow_1100 + case 359: + GOTO flow_1103 + case 360: + GOTO flow_1106 + case 361: + GOTO flow_1109 + case 362: + GOTO flow_1112 + case 363: + GOTO flow_1115 + case 412: + GOTO flow_1118 + case 365: + GOTO flow_1121 + case 413: + GOTO flow_1124 + case 366: + GOTO flow_1127 + case 368: + GOTO flow_1130 + case 369: + GOTO flow_1133 + case 370: + GOTO flow_1136 + case 367: + GOTO flow_1139 + case 371: + GOTO flow_1142 + case 372: + GOTO flow_1145 + case 373: + GOTO flow_1148 + case 374: + GOTO flow_1151 + case 375: + GOTO flow_1154 + case 376: + GOTO flow_1157 + case 377: + GOTO flow_1160 + case 378: + GOTO flow_1163 + case 379: + GOTO flow_1166 + case 380: + GOTO flow_1169 + case 381: + GOTO flow_1172 + case 382: + GOTO flow_1175 + case 383: + GOTO flow_1178 + case 384: + GOTO flow_1181 + case 385: + GOTO flow_1184 + case 386: + GOTO flow_1187 + case 387: + GOTO flow_1190 + case 388: + GOTO flow_1193 + case 389: + GOTO flow_1196 + case 390: + GOTO flow_1199 + case 391: + GOTO flow_1202 + case 392: + GOTO flow_1205 + case 393: + GOTO flow_1208 + case 394: + GOTO flow_1211 + case 395: + GOTO flow_1214 + case 396: + GOTO flow_1217 + case 397: + GOTO flow_1220 + case 398: + GOTO flow_1223 + case 399: + GOTO flow_1226 + case 414: + GOTO flow_1229 + case 415: + GOTO flow_1232 + case 416: + GOTO flow_1235 + case 400: + GOTO flow_1238 + case 401: + GOTO flow_1241 + case 402: + GOTO flow_1244 + case 403: + GOTO flow_1247 + case 404: + GOTO flow_1250 + case 405: + GOTO flow_1253 + case 406: + GOTO flow_1256 + case 407: + GOTO flow_1259 + case 408: + GOTO flow_1262 + case 409: + GOTO flow_1265 + case 410: + GOTO flow_1268 + case 411: + GOTO flow_1271 + case 418: + GOTO flow_1274 + case 3522: + GOTO flow_1277 + case 3500: + GOTO flow_1280 + case 3501: + GOTO flow_1283 + case 3505: + GOTO flow_1286 + case 3511: + GOTO flow_1289 + case 3502: + GOTO flow_1292 + case 3503: + GOTO flow_1295 + case 3504: + GOTO flow_1298 + case 3506: + GOTO flow_1301 + case 3508: + GOTO flow_1304 + case 3509: + GOTO flow_1307 + case 3507: + GOTO flow_1310 + case 3523: + GOTO flow_1313 + case 3510: + GOTO flow_1316 + case 3512: + GOTO flow_1319 + case 3513: + GOTO flow_1322 + case 3514: + GOTO flow_1325 + case 3515: + GOTO flow_1328 + case 3516: + GOTO flow_1331 + case 3517: + GOTO flow_1334 + case 3518: + GOTO flow_1337 + case 3519: + GOTO flow_1340 + case 3520: + GOTO flow_1343 + case 422: + GOTO flow_1346 + case 423: + GOTO flow_1349 + case 424: + GOTO flow_1352 + case 425: + GOTO flow_1355 + case 419: + GOTO flow_1358 + case 420: + GOTO flow_1361 + case 421: + GOTO flow_1364 + case 426: + GOTO flow_1369 + case 427: + GOTO flow_1372 + case 3525: + GOTO flow_1375 + case 3526: + GOTO flow_1378 + case 3527: + GOTO flow_1381 + case 3528: + GOTO flow_1384 + case 3529: + GOTO flow_1387 + case 3530: + GOTO flow_1390 + case 429: + GOTO flow_1393 + case 430: + GOTO flow_1396 + case 431: + GOTO flow_1399 + case 432: + GOTO flow_1402 + } + return 0; + flow_3: + if (((boolean)bitconfig_6598)) { + return 2; + } + GOTO flow_1404 + flow_6: + if (((boolean)bitconfig_6599)) { + return 2; + } + GOTO flow_1404 + flow_9: + if (((boolean)bitconfig_6600)) { + return 2; + } + GOTO flow_1404 + flow_12: + if (((boolean)bitconfig_6601)) { + return 2; + } + GOTO flow_1404 + flow_15: + if (((boolean)bitconfig_6602)) { + return 2; + } + GOTO flow_1404 + flow_18: + if (((boolean)bitconfig_6603)) { + return 2; + } + GOTO flow_1404 + flow_21: + if (((boolean)bitconfig_6604)) { + return 2; + } + GOTO flow_1404 + flow_24: + if (((boolean)bitconfig_6605)) { + return 2; + } + GOTO flow_1404 + flow_27: + if (((boolean)bitconfig_6606)) { + return 2; + } + GOTO flow_1404 + flow_30: + if (((boolean)bitconfig_6607)) { + return 2; + } + GOTO flow_1404 + flow_33: + if (((boolean)bitconfig_6608)) { + return 2; + } + GOTO flow_1404 + flow_36: + if (((boolean)bitconfig_6609)) { + return 2; + } + GOTO flow_1404 + flow_39: + if (((boolean)bitconfig_1421)) { + return 2; + } + GOTO flow_1404 + flow_42: + if (((boolean)bitconfig_6611)) { + return 2; + } + GOTO flow_1404 + flow_45: + if (((boolean)bitconfig_6612)) { + return 2; + } + GOTO flow_1404 + flow_48: + if (((boolean)bitconfig_6613)) { + return 2; + } + GOTO flow_1404 + flow_51: + if (((boolean)bitconfig_6614)) { + return 2; + } + GOTO flow_1404 + flow_54: + if (((boolean)bitconfig_6615)) { + return 2; + } + GOTO flow_1404 + flow_57: + if (((boolean)bitconfig_6616)) { + return 2; + } + GOTO flow_1404 + flow_60: + if (((boolean)bitconfig_6617)) { + return 2; + } + GOTO flow_1404 + flow_63: + if (((boolean)bitconfig_6618)) { + return 2; + } + GOTO flow_1404 + flow_66: + if (((boolean)bitconfig_6619)) { + return 2; + } + GOTO flow_1404 + flow_69: + if (((boolean)bitconfig_6620)) { + return 2; + } + GOTO flow_1404 + flow_72: + if (((boolean)bitconfig_6622)) { + return 2; + } + GOTO flow_1404 + flow_75: + if (((boolean)bitconfig_6623)) { + return 2; + } + GOTO flow_1404 + flow_78: + if (((boolean)bitconfig_6624)) { + return 2; + } + GOTO flow_1404 + flow_81: + if (((boolean)bitconfig_6625)) { + return 2; + } + GOTO flow_1404 + flow_84: + if (((boolean)bitconfig_6626)) { + return 2; + } + GOTO flow_1404 + flow_87: + if (((boolean)bitconfig_6627)) { + return 2; + } + GOTO flow_1404 + flow_90: + if (((boolean)bitconfig_6628)) { + return 2; + } + GOTO flow_1404 + flow_93: + if (((boolean)bitconfig_6629)) { + return 2; + } + GOTO flow_1404 + flow_96: + if (((boolean)bitconfig_6630)) { + return 2; + } + GOTO flow_1404 + flow_99: + if (((boolean)bitconfig_6631)) { + return 2; + } + GOTO flow_1404 + flow_102: + if (((boolean)bitconfig_6632)) { + return 2; + } + GOTO flow_1404 + flow_105: + if (((boolean)bitconfig_6633)) { + return 2; + } + GOTO flow_1404 + flow_108: + if (((boolean)bitconfig_6634)) { + return 2; + } + GOTO flow_1404 + flow_111: + if (((boolean)bitconfig_6635)) { + return 2; + } + GOTO flow_1404 + flow_114: + if (((boolean)bitconfig_6636)) { + return 2; + } + GOTO flow_1404 + flow_117: + if (((boolean)bitconfig_6637)) { + return 2; + } + GOTO flow_1404 + flow_120: + if (((boolean)bitconfig_6639)) { + return 2; + } + GOTO flow_1404 + flow_123: + if (((boolean)bitconfig_6640)) { + return 2; + } + GOTO flow_1404 + flow_126: + if (((boolean)bitconfig_6641)) { + return 2; + } + GOTO flow_1404 + flow_129: + if (((boolean)bitconfig_6642)) { + return 2; + } + GOTO flow_1404 + flow_132: + if (((boolean)bitconfig_6643)) { + return 2; + } + GOTO flow_1404 + flow_135: + if (((boolean)bitconfig_6644)) { + return 2; + } + GOTO flow_1404 + flow_138: + if (((boolean)bitconfig_6645)) { + return 2; + } + GOTO flow_1404 + flow_141: + if (((boolean)bitconfig_6646)) { + return 2; + } + GOTO flow_1404 + flow_144: + if (((boolean)bitconfig_6647)) { + return 2; + } + GOTO flow_1404 + flow_147: + if (((boolean)bitconfig_6648)) { + return 2; + } + GOTO flow_1404 + flow_150: + if (((boolean)bitconfig_6649)) { + return 2; + } + GOTO flow_1404 + flow_153: + if (((boolean)bitconfig_6650)) { + return 2; + } + GOTO flow_1404 + flow_156: + if (((boolean)bitconfig_6651)) { + return 2; + } + GOTO flow_1404 + flow_159: + if (((boolean)bitconfig_6652)) { + return 2; + } + GOTO flow_1404 + flow_162: + if (((boolean)bitconfig_6653)) { + return 2; + } + GOTO flow_1404 + flow_165: + if (((boolean)bitconfig_6654)) { + return 2; + } + GOTO flow_1404 + flow_168: + if (((boolean)bitconfig_6655)) { + return 2; + } + GOTO flow_1404 + flow_171: + if (((boolean)bitconfig_6658)) { + return 2; + } + GOTO flow_1404 + flow_174: + if (((boolean)bitconfig_6659)) { + return 2; + } + GOTO flow_1404 + flow_177: + if (((boolean)bitconfig_6660)) { + return 2; + } + GOTO flow_1404 + flow_180: + if (((boolean)bitconfig_6661)) { + return 2; + } + GOTO flow_1404 + flow_183: + if (bitconfig_6662 == 63) { + return 2; + } + if (bitconfig_6662 > 0) { + return 1; + } + GOTO flow_1404 + flow_188: + if (((boolean)bitconfig_4949)) { + return 2; + } + GOTO flow_1404 + flow_191: + if (((boolean)bitconfig_4950)) { + return 2; + } + GOTO flow_1404 + flow_194: + if (((boolean)bitconfig_4951)) { + return 2; + } + GOTO flow_1404 + flow_197: + if (((boolean)bitconfig_4952)) { + return 2; + } + GOTO flow_1404 + flow_200: + if (((boolean)bitconfig_4953)) { + return 2; + } + GOTO flow_1404 + flow_203: + if (((boolean)bitconfig_4954)) { + return 2; + } + GOTO flow_1404 + flow_206: + if (((boolean)bitconfig_4955)) { + return 2; + } + GOTO flow_1404 + flow_209: + if (((boolean)bitconfig_4956)) { + return 2; + } + GOTO flow_1404 + flow_212: + if (((boolean)bitconfig_4957)) { + return 2; + } + GOTO flow_1404 + flow_215: + if (((boolean)bitconfig_4958)) { + return 2; + } + GOTO flow_1404 + flow_218: + if (((boolean)bitconfig_4959)) { + return 2; + } + GOTO flow_1404 + flow_221: + if (((boolean)bitconfig_4960)) { + return 2; + } + GOTO flow_1404 + flow_224: + if (((boolean)bitconfig_4961)) { + return 2; + } + GOTO flow_1404 + flow_227: + if (((boolean)bitconfig_4962)) { + return 2; + } + GOTO flow_1404 + flow_230: + if (((boolean)bitconfig_4963)) { + return 2; + } + GOTO flow_1404 + flow_233: + if (((boolean)bitconfig_4964)) { + return 2; + } + GOTO flow_1404 + flow_236: + if (((boolean)bitconfig_4965)) { + return 2; + } + GOTO flow_1404 + flow_239: + if (((boolean)bitconfig_4966)) { + return 2; + } + GOTO flow_1404 + flow_242: + if (((boolean)bitconfig_4967)) { + return 2; + } + GOTO flow_1404 + flow_245: + if (((boolean)bitconfig_4968)) { + return 2; + } + GOTO flow_1404 + flow_248: + if (((boolean)bitconfig_4969)) { + return 2; + } + GOTO flow_1404 + flow_251: + if (((boolean)bitconfig_4970)) { + return 2; + } + GOTO flow_1404 + flow_254: + if (((boolean)bitconfig_4971)) { + return 2; + } + GOTO flow_1404 + flow_257: + if (((boolean)bitconfig_4972)) { + return 2; + } + GOTO flow_1404 + flow_260: + if (((boolean)bitconfig_4973)) { + return 2; + } + GOTO flow_1404 + flow_263: + if (((boolean)bitconfig_4974)) { + return 2; + } + GOTO flow_1404 + flow_266: + if (((boolean)bitconfig_4975)) { + return 2; + } + GOTO flow_1404 + flow_269: + if (((boolean)bitconfig_4976)) { + return 2; + } + GOTO flow_1404 + flow_272: + if (((boolean)bitconfig_4977)) { + return 2; + } + GOTO flow_1404 + flow_275: + if (((boolean)bitconfig_4978)) { + return 2; + } + GOTO flow_1404 + flow_278: + if (((boolean)bitconfig_4979)) { + return 2; + } + GOTO flow_1404 + flow_281: + if (((boolean)bitconfig_4980)) { + return 2; + } + GOTO flow_1404 + flow_284: + if (((boolean)bitconfig_4981)) { + return 2; + } + GOTO flow_1404 + flow_287: + if (((boolean)bitconfig_4982)) { + return 2; + } + GOTO flow_1404 + flow_290: + if (((boolean)bitconfig_4983)) { + return 2; + } + GOTO flow_1404 + flow_293: + if (((boolean)bitconfig_4984)) { + return 2; + } + GOTO flow_1404 + flow_296: + if (((boolean)bitconfig_4985)) { + return 2; + } + GOTO flow_1404 + flow_299: + if (((boolean)bitconfig_4986)) { + return 2; + } + GOTO flow_1404 + flow_302: + if (((boolean)bitconfig_4987)) { + return 2; + } + GOTO flow_1404 + flow_305: + if (((boolean)bitconfig_4988)) { + return 2; + } + GOTO flow_1404 + flow_308: + if (((boolean)bitconfig_4989)) { + return 2; + } + GOTO flow_1404 + flow_311: + if (((boolean)bitconfig_4991)) { + return 2; + } + GOTO flow_1404 + flow_314: + if (((boolean)bitconfig_4992)) { + return 2; + } + GOTO flow_1404 + flow_317: + if (((boolean)bitconfig_4993)) { + return 2; + } + GOTO flow_1404 + flow_320: + if (((boolean)bitconfig_4994)) { + return 2; + } + GOTO flow_1404 + flow_323: + if (((boolean)bitconfig_4995)) { + return 2; + } + GOTO flow_1404 + flow_326: + if (((boolean)bitconfig_4996)) { + return 2; + } + GOTO flow_1404 + flow_329: + if (((boolean)bitconfig_4997)) { + return 2; + } + GOTO flow_1404 + flow_332: + if (((boolean)bitconfig_4998)) { + return 2; + } + GOTO flow_1404 + flow_335: + if (((boolean)bitconfig_4999)) { + return 2; + } + GOTO flow_1404 + flow_338: + if (((boolean)bitconfig_5998)) { + return 2; + } + GOTO flow_1404 + flow_341: + if (((boolean)bitconfig_5001)) { + return 2; + } + GOTO flow_1404 + flow_344: + if (((boolean)bitconfig_5002)) { + return 2; + } + GOTO flow_1404 + flow_347: + if (((boolean)bitconfig_5003)) { + return 2; + } + GOTO flow_1404 + flow_350: + if (((boolean)bitconfig_8180)) { + return 2; + } + GOTO flow_1404 + flow_353: + if (((boolean)bitconfig_8181)) { + return 2; + } + GOTO flow_1404 + flow_356: + if (((boolean)bitconfig_8188)) { + return 2; + } + GOTO flow_1404 + flow_359: + if (((boolean)bitconfig_8191)) { + return 2; + } + GOTO flow_1404 + flow_362: + if (((boolean)bitconfig_8192)) { + return 2; + } + GOTO flow_1404 + flow_365: + if (((boolean)bitconfig_8193)) { + return 2; + } + GOTO flow_1404 + flow_368: + if (((boolean)bitconfig_8194)) { + return 2; + } + GOTO flow_1404 + flow_371: + if (((boolean)bitconfig_5691)) { + return 2; + } + GOTO flow_1404 + flow_374: + if (((boolean)bitconfig_5692)) { + return 2; + } + GOTO flow_1404 + flow_377: + if (((boolean)bitconfig_5693)) { + return 2; + } + GOTO flow_1404 + flow_380: + if (((boolean)bitconfig_5694)) { + return 2; + } + GOTO flow_1404 + flow_383: + if (((boolean)bitconfig_5695)) { + return 2; + } + GOTO flow_1404 + flow_386: + if (((boolean)bitconfig_5696)) { + return 2; + } + GOTO flow_1404 + flow_389: + if (((boolean)bitconfig_5697)) { + return 2; + } + GOTO flow_1404 + flow_392: + if (((boolean)bitconfig_5698)) { + return 2; + } + GOTO flow_1404 + flow_395: + if (((boolean)bitconfig_5699)) { + return 2; + } + GOTO flow_1404 + flow_398: + if (((boolean)bitconfig_5700)) { + return 2; + } + GOTO flow_1404 + flow_401: + if (((boolean)bitconfig_5701)) { + return 2; + } + GOTO flow_1404 + flow_404: + if (((boolean)bitconfig_5702)) { + return 2; + } + GOTO flow_1404 + flow_407: + if (((boolean)bitconfig_5703)) { + return 2; + } + GOTO flow_1404 + flow_410: + if (((boolean)bitconfig_5704)) { + return 2; + } + GOTO flow_1404 + flow_413: + if (bitconfig_5705 == 3) { + return 2; + } + if (bitconfig_5705 > 0) { + return 1; + } + GOTO flow_1404 + flow_418: + if (((boolean)bitconfig_5706)) { + return 2; + } + GOTO flow_1404 + flow_421: + if (((boolean)bitconfig_5707)) { + return 2; + } + GOTO flow_1404 + flow_424: + if (((boolean)bitconfig_5723)) { + return 2; + } + GOTO flow_1404 + flow_427: + if (bitconfig_5709 == 3) { + return 2; + } + if (bitconfig_5709 > 0) { + return 1; + } + GOTO flow_1404 + flow_432: + if (((boolean)bitconfig_5710)) { + return 2; + } + GOTO flow_1404 + flow_435: + if (((boolean)bitconfig_5711)) { + return 2; + } + GOTO flow_1404 + flow_438: + if (((boolean)bitconfig_5712)) { + return 2; + } + GOTO flow_1404 + flow_441: + if (((boolean)bitconfig_5713)) { + return 2; + } + GOTO flow_1404 + flow_444: + if (((boolean)bitconfig_5714)) { + return 2; + } + GOTO flow_1404 + flow_447: + if (((boolean)bitconfig_5715)) { + return 2; + } + GOTO flow_1404 + flow_450: + if (((boolean)bitconfig_5716)) { + return 2; + } + GOTO flow_1404 + flow_453: + if (((boolean)bitconfig_5717)) { + return 2; + } + GOTO flow_1404 + flow_456: + if (((boolean)bitconfig_5718)) { + return 2; + } + GOTO flow_1404 + flow_459: + if (((boolean)bitconfig_5719)) { + return 2; + } + GOTO flow_1404 + flow_462: + if (((boolean)bitconfig_5720)) { + return 2; + } + GOTO flow_1404 + flow_465: + if (((boolean)bitconfig_5721)) { + return 2; + } + GOTO flow_1404 + flow_468: + if (((boolean)bitconfig_5722)) { + return 2; + } + GOTO flow_1404 + flow_471: + if (((boolean)bitconfig_5708)) { + return 2; + } + GOTO flow_1404 + flow_474: + if (((boolean)bitconfig_5724)) { + return 2; + } + GOTO flow_1404 + flow_477: + if (((boolean)bitconfig_5725)) { + return 2; + } + GOTO flow_1404 + flow_480: + if (((boolean)bitconfig_5726)) { + return 2; + } + GOTO flow_1404 + flow_483: + if (((boolean)bitconfig_5727)) { + return 2; + } + GOTO flow_1404 + flow_486: + if (((boolean)bitconfig_8114)) { + return 2; + } + GOTO flow_1404 + flow_489: + if (((boolean)bitconfig_8115)) { + return 2; + } + GOTO flow_1404 + flow_492: + if (((boolean)bitconfig_8116)) { + return 2; + } + GOTO flow_1404 + flow_495: + if (((boolean)bitconfig_8117)) { + return 2; + } + GOTO flow_1404 + flow_498: + if (((boolean)bitconfig_8118)) { + return 2; + } + GOTO flow_1404 + flow_501: + if (((boolean)bitconfig_8119)) { + return 2; + } + GOTO flow_1404 + flow_504: + if (((boolean)bitconfig_8120)) { + return 2; + } + GOTO flow_1404 + flow_507: + if (((boolean)bitconfig_5648)) { + return 2; + } + GOTO flow_1404 + flow_510: + if (((boolean)bitconfig_5649)) { + return 2; + } + GOTO flow_1404 + flow_513: + if (((boolean)bitconfig_5650)) { + return 2; + } + GOTO flow_1404 + flow_516: + if (((boolean)bitconfig_5651)) { + return 2; + } + GOTO flow_1404 + flow_519: + if (((boolean)bitconfig_5652)) { + return 2; + } + GOTO flow_1404 + flow_522: + if (((boolean)bitconfig_5653)) { + return 2; + } + GOTO flow_1404 + flow_525: + if (((boolean)bitconfig_5654)) { + return 2; + } + GOTO flow_1404 + flow_528: + if (((boolean)bitconfig_5655)) { + return 2; + } + GOTO flow_1404 + flow_531: + if (((boolean)bitconfig_5656)) { + return 2; + } + GOTO flow_1404 + flow_534: + if (((boolean)bitconfig_5657)) { + return 2; + } + GOTO flow_1404 + flow_537: + if (((boolean)bitconfig_5658)) { + return 2; + } + GOTO flow_1404 + flow_540: + if (((boolean)bitconfig_5659)) { + return 2; + } + GOTO flow_1404 + flow_543: + if (((boolean)bitconfig_5660)) { + return 2; + } + GOTO flow_1404 + flow_546: + if (((boolean)bitconfig_5661)) { + return 2; + } + GOTO flow_1404 + flow_549: + if (((boolean)bitconfig_5662)) { + return 2; + } + GOTO flow_1404 + flow_552: + if (((boolean)bitconfig_5663)) { + return 2; + } + GOTO flow_1404 + flow_555: + if (((boolean)bitconfig_5664)) { + return 2; + } + GOTO flow_1404 + flow_558: + if (((boolean)bitconfig_5665)) { + return 2; + } + GOTO flow_1404 + flow_561: + if (((boolean)bitconfig_5666)) { + return 2; + } + GOTO flow_1404 + flow_564: + if (((boolean)bitconfig_5667)) { + return 2; + } + GOTO flow_1404 + flow_567: + if (((boolean)bitconfig_5668)) { + return 2; + } + GOTO flow_1404 + flow_570: + if (((boolean)bitconfig_5669)) { + return 2; + } + GOTO flow_1404 + flow_573: + if (((boolean)bitconfig_5670)) { + return 2; + } + GOTO flow_1404 + flow_576: + if (((boolean)bitconfig_5671)) { + return 2; + } + GOTO flow_1404 + flow_579: + if (((boolean)bitconfig_5672)) { + return 2; + } + GOTO flow_1404 + flow_582: + if (((boolean)bitconfig_5673)) { + return 2; + } + GOTO flow_1404 + flow_585: + if (((boolean)bitconfig_5674)) { + return 2; + } + GOTO flow_1404 + flow_588: + if (((boolean)bitconfig_5675)) { + return 2; + } + GOTO flow_1404 + flow_591: + if (((boolean)bitconfig_5676)) { + return 2; + } + GOTO flow_1404 + flow_594: + if (((boolean)bitconfig_5677)) { + return 2; + } + GOTO flow_1404 + flow_597: + if (bitconfig_9067 > 0) { + return 2; + } + GOTO flow_1404 + flow_600: + if (((boolean)bitconfig_8231)) { + return 2; + } + GOTO flow_1404 + flow_603: + if (((boolean)bitconfig_8232)) { + return 2; + } + GOTO flow_1404 + flow_606: + if (((boolean)bitconfig_8233)) { + return 2; + } + GOTO flow_1404 + flow_609: + if (((boolean)bitconfig_8234)) { + return 2; + } + GOTO flow_1404 + flow_612: + if (((boolean)bitconfig_8235)) { + return 2; + } + GOTO flow_1404 + flow_615: + if (((boolean)bitconfig_8236)) { + return 2; + } + GOTO flow_1404 + flow_618: + if (((boolean)bitconfig_8237)) { + return 2; + } + GOTO flow_1404 + flow_621: + if (((boolean)bitconfig_8238)) { + return 2; + } + GOTO flow_1404 + flow_624: + if (((boolean)bitconfig_8239)) { + return 2; + } + GOTO flow_1404 + flow_627: + if (bitconfig_3566 == 5) { + return 2; + } + if (bitconfig_3566 > 0) { + return 1; + } + GOTO flow_1404 + flow_632: + if (((boolean)bitconfig_3567)) { + return 2; + } + GOTO flow_1404 + flow_635: + if (((boolean)bitconfig_3568)) { + return 2; + } + GOTO flow_1404 + flow_638: + if (((boolean)bitconfig_3569)) { + return 2; + } + GOTO flow_1404 + flow_641: + if (((boolean)bitconfig_3570)) { + return 2; + } + GOTO flow_1404 + flow_644: + if (((boolean)bitconfig_3571)) { + return 2; + } + GOTO flow_1404 + flow_647: + if (((boolean)bitconfig_3572)) { + return 2; + } + GOTO flow_1404 + flow_650: + if (bitconfig_3573 == 5) { + return 2; + } + if (bitconfig_3573 > 0) { + return 1; + } + GOTO flow_1404 + flow_655: + if (((boolean)bitconfig_3574)) { + return 2; + } + GOTO flow_1404 + flow_658: + if (((boolean)bitconfig_3575)) { + return 2; + } + GOTO flow_1404 + flow_661: + if (((boolean)bitconfig_3579)) { + return 2; + } + GOTO flow_1404 + flow_664: + if (((boolean)bitconfig_3580)) { + return 2; + } + GOTO flow_1404 + flow_667: + if (((boolean)bitconfig_3581)) { + return 2; + } + GOTO flow_1404 + flow_670: + if (((boolean)bitconfig_3582)) { + return 2; + } + GOTO flow_1404 + flow_673: + if (((boolean)bitconfig_3583)) { + return 2; + } + GOTO flow_1404 + flow_676: + if (((boolean)bitconfig_3584)) { + return 2; + } + GOTO flow_1404 + flow_679: + if (((boolean)bitconfig_3585)) { + return 2; + } + GOTO flow_1404 + flow_682: + if (((boolean)bitconfig_3586)) { + return 2; + } + GOTO flow_1404 + flow_685: + if (((boolean)bitconfig_3587)) { + return 2; + } + GOTO flow_1404 + flow_688: + if (((boolean)bitconfig_3588)) { + return 2; + } + GOTO flow_1404 + flow_691: + if (((boolean)bitconfig_3589)) { + return 2; + } + GOTO flow_1404 + flow_694: + if (((boolean)bitconfig_3590)) { + return 2; + } + GOTO flow_1404 + flow_697: + if (((boolean)bitconfig_3591)) { + return 2; + } + GOTO flow_1404 + flow_700: + if (((boolean)bitconfig_3592)) { + return 2; + } + GOTO flow_1404 + flow_703: + if (((boolean)bitconfig_3593)) { + return 2; + } + GOTO flow_1404 + flow_706: + if (((boolean)bitconfig_3594)) { + return 2; + } + GOTO flow_1404 + flow_709: + if (((boolean)bitconfig_3595)) { + return 2; + } + GOTO flow_1404 + flow_712: + if (((boolean)bitconfig_3596)) { + return 2; + } + GOTO flow_1404 + flow_715: + if (((boolean)bitconfig_3597)) { + return 2; + } + GOTO flow_1404 + flow_718: + if (((boolean)bitconfig_3600)) { + return 2; + } + GOTO flow_1404 + flow_721: + if (((boolean)bitconfig_3601)) { + return 2; + } + GOTO flow_1404 + flow_724: + if (((boolean)bitconfig_3602)) { + return 2; + } + GOTO flow_1404 + flow_727: + if (((boolean)bitconfig_3603)) { + return 2; + } + GOTO flow_1404 + flow_730: + if (((boolean)bitconfig_3604)) { + return 2; + } + GOTO flow_1404 + flow_733: + if (((boolean)bitconfig_3605)) { + return 2; + } + GOTO flow_1404 + flow_736: + if (((boolean)bitconfig_3606)) { + return 2; + } + GOTO flow_1404 + flow_739: + if (bitconfig_3607 == 5) { + return 2; + } + if (bitconfig_3607 > 0) { + return 1; + } + GOTO flow_1404 + flow_744: + if (((boolean)bitconfig_3608)) { + return 2; + } + GOTO flow_1404 + flow_747: + if (((boolean)bitconfig_3609)) { + return 2; + } + GOTO flow_1404 + flow_750: + if (((boolean)bitconfig_8121)) { + return 2; + } + GOTO flow_1404 + flow_753: + if (((boolean)bitconfig_8122)) { + return 2; + } + GOTO flow_1404 + flow_756: + if (((boolean)bitconfig_8123)) { + return 2; + } + GOTO flow_1404 + flow_759: + if (((boolean)bitconfig_8124)) { + return 2; + } + GOTO flow_1404 + flow_762: + if (((boolean)bitconfig_8125)) { + return 2; + } + GOTO flow_1404 + flow_765: + if (((boolean)bitconfig_8126)) { + return 2; + } + GOTO flow_1404 + flow_768: + if (((boolean)bitconfig_8127)) { + return 2; + } + GOTO flow_1404 + flow_771: + if (((boolean)bitconfig_8128)) { + return 2; + } + GOTO flow_1404 + flow_774: + if (bitconfig_5782 == 5) { + return 2; + } + if (bitconfig_5782 > 0) { + return 1; + } + GOTO flow_1404 + flow_779: + if (((boolean)bitconfig_5783)) { + return 2; + } + GOTO flow_1404 + flow_782: + if (((boolean)bitconfig_5784)) { + return 2; + } + GOTO flow_1404 + flow_785: + if (((boolean)bitconfig_5785)) { + return 2; + } + GOTO flow_1404 + flow_788: + if (((boolean)bitconfig_5786)) { + return 2; + } + GOTO flow_1404 + flow_791: + if (bitconfig_5787 == 5) { + return 2; + } + GOTO flow_1404 + flow_794: + if (bitconfig_5788 == 5) { + return 2; + } + if (bitconfig_5788 > 0) { + return 1; + } + GOTO flow_1404 + flow_799: + if (bitconfig_5789 == 5) { + return 2; + } + if (bitconfig_5789 > 0) { + return 1; + } + GOTO flow_1404 + flow_804: + if (((boolean)bitconfig_5790)) { + return 2; + } + GOTO flow_1404 + flow_807: + if (((boolean)bitconfig_5791)) { + return 2; + } + GOTO flow_1404 + flow_810: + if (((boolean)bitconfig_5792)) { + return 2; + } + GOTO flow_1404 + flow_813: + if (((boolean)bitconfig_5793)) { + return 2; + } + GOTO flow_1404 + flow_816: + if (((boolean)bitconfig_5794)) { + return 2; + } + GOTO flow_1404 + flow_819: + if (((boolean)bitconfig_5795)) { + return 2; + } + GOTO flow_1404 + flow_822: + if (((boolean)bitconfig_5796)) { + return 2; + } + GOTO flow_1404 + flow_825: + if (bitconfig_5797 == 15) { + return 2; + } + if (bitconfig_5797 > 0) { + return 1; + } + GOTO flow_1404 + flow_830: + if (((boolean)bitconfig_5798)) { + return 2; + } + GOTO flow_1404 + flow_833: + if (((boolean)bitconfig_5799)) { + return 2; + } + GOTO flow_1404 + flow_836: + if (((boolean)bitconfig_5800)) { + return 2; + } + GOTO flow_1404 + flow_839: + if (((boolean)bitconfig_5801)) { + return 2; + } + GOTO flow_1404 + flow_842: + if (((boolean)bitconfig_5802)) { + return 2; + } + GOTO flow_1404 + flow_845: + if (((boolean)bitconfig_5803)) { + return 2; + } + GOTO flow_1404 + flow_848: + if (((boolean)bitconfig_5804)) { + return 2; + } + GOTO flow_1404 + flow_851: + if (bitconfig_5805 == 15) { + return 2; + } + if (bitconfig_5805 > 0) { + return 1; + } + GOTO flow_1404 + flow_856: + if (((boolean)bitconfig_5806)) { + return 2; + } + GOTO flow_1404 + flow_859: + if (bitconfig_5807 == 5) { + return 2; + } + if (bitconfig_5807 > 0) { + return 1; + } + GOTO flow_1404 + flow_864: + if (((boolean)bitconfig_5808)) { + return 2; + } + GOTO flow_1404 + flow_867: + if (((boolean)bitconfig_5809)) { + return 2; + } + GOTO flow_1404 + flow_870: + if (((boolean)bitconfig_5810)) { + return 2; + } + GOTO flow_1404 + flow_873: + if (((boolean)bitconfig_5811)) { + return 2; + } + GOTO flow_1404 + flow_876: + if (((boolean)bitconfig_5812)) { + return 2; + } + GOTO flow_1404 + flow_879: + if (((boolean)bitconfig_5813)) { + return 2; + } + GOTO flow_1404 + flow_882: + if (bitconfig_5814 == 5) { + return 2; + } + if (bitconfig_5814 > 0) { + return 1; + } + GOTO flow_1404 + flow_887: + if (bitconfig_5815 == 5) { + return 2; + } + if (bitconfig_5815 > 0) { + return 1; + } + GOTO flow_1404 + flow_892: + if (bitconfig_5816 == 5) { + return 2; + } + if (bitconfig_5816 > 0) { + return 1; + } + GOTO flow_1404 + flow_897: + if (((boolean)bitconfig_8205)) { + return 2; + } + GOTO flow_1404 + flow_900: + if (((boolean)bitconfig_8212)) { + return 2; + } + GOTO flow_1404 + flow_903: + if (((boolean)bitconfig_8217)) { + return 2; + } + GOTO flow_1404 + flow_906: + if (((boolean)bitconfig_8221)) { + return 2; + } + GOTO flow_1404 + flow_909: + if (((boolean)bitconfig_8224)) { + return 2; + } + GOTO flow_1404 + flow_912: + if (((boolean)bitconfig_3986)) { + return 2; + } + GOTO flow_1404 + flow_915: + if (((boolean)bitconfig_3987)) { + return 2; + } + GOTO flow_1404 + flow_918: + if (((boolean)bitconfig_3988)) { + return 2; + } + GOTO flow_1404 + flow_921: + if (((boolean)bitconfig_3989)) { + return 2; + } + GOTO flow_1404 + flow_924: + if (((boolean)bitconfig_3990)) { + return 2; + } + GOTO flow_1404 + flow_927: + if (((boolean)bitconfig_3991)) { + return 2; + } + GOTO flow_1404 + flow_930: + if (((boolean)bitconfig_3992)) { + return 2; + } + GOTO flow_1404 + flow_933: + if (((boolean)bitconfig_3993)) { + return 2; + } + GOTO flow_1404 + flow_936: + if (((boolean)bitconfig_3994)) { + return 2; + } + GOTO flow_1404 + flow_939: + if (((boolean)bitconfig_3995)) { + return 2; + } + GOTO flow_1404 + flow_942: + if (((boolean)bitconfig_3996)) { + return 2; + } + GOTO flow_1404 + flow_945: + if (((boolean)bitconfig_3997)) { + return 2; + } + GOTO flow_1404 + flow_948: + if (((boolean)bitconfig_3998)) { + return 2; + } + GOTO flow_1404 + flow_951: + if (((boolean)bitconfig_3999)) { + return 2; + } + GOTO flow_1404 + flow_954: + if (((boolean)bitconfig_4000)) { + return 2; + } + GOTO flow_1404 + flow_957: + if (((boolean)bitconfig_4001)) { + return 2; + } + GOTO flow_1404 + flow_960: + if (((boolean)bitconfig_4002)) { + return 2; + } + GOTO flow_1404 + flow_963: + if (((boolean)bitconfig_4004)) { + return 2; + } + GOTO flow_1404 + flow_966: + if (((boolean)bitconfig_4005)) { + return 2; + } + GOTO flow_1404 + flow_969: + if (((boolean)bitconfig_4003)) { + return 2; + } + GOTO flow_1404 + flow_972: + if (((boolean)bitconfig_4007)) { + return 2; + } + GOTO flow_1404 + flow_975: + if (((boolean)bitconfig_4008)) { + return 2; + } + GOTO flow_1404 + flow_978: + if (((boolean)bitconfig_4009)) { + return 2; + } + GOTO flow_1404 + flow_981: + if (((boolean)bitconfig_4010)) { + return 2; + } + GOTO flow_1404 + flow_984: + if (((boolean)bitconfig_4011)) { + return 2; + } + GOTO flow_1404 + flow_987: + if (bitconfig_4012 == 4) { + return 2; + } + if (bitconfig_4012 > 0) { + return 1; + } + GOTO flow_1404 + flow_992: + if (((boolean)bitconfig_4013)) { + return 2; + } + GOTO flow_1404 + flow_995: + if (((boolean)bitconfig_4014)) { + return 2; + } + GOTO flow_1404 + flow_998: + if (((boolean)bitconfig_4015)) { + return 2; + } + GOTO flow_1404 + flow_1001: + if (((boolean)bitconfig_4016)) { + return 2; + } + GOTO flow_1404 + flow_1004: + if (((boolean)bitconfig_4017)) { + return 2; + } + GOTO flow_1404 + flow_1007: + if (((boolean)bitconfig_4018)) { + return 2; + } + GOTO flow_1404 + flow_1010: + if (((boolean)bitconfig_4019)) { + return 2; + } + GOTO flow_1404 + flow_1013: + if (((boolean)bitconfig_4020)) { + return 2; + } + GOTO flow_1404 + flow_1016: + if (((boolean)bitconfig_4021)) { + return 2; + } + GOTO flow_1404 + flow_1019: + if (((boolean)bitconfig_4022)) { + return 2; + } + GOTO flow_1404 + flow_1022: + if (((boolean)bitconfig_4023)) { + return 2; + } + GOTO flow_1404 + flow_1025: + if (((boolean)bitconfig_4024)) { + return 2; + } + GOTO flow_1404 + flow_1028: + if (((boolean)bitconfig_4025)) { + return 2; + } + GOTO flow_1404 + flow_1031: + if (((boolean)bitconfig_4026)) { + return 2; + } + GOTO flow_1404 + flow_1034: + if (((boolean)bitconfig_4027)) { + return 2; + } + GOTO flow_1404 + flow_1037: + if (((boolean)bitconfig_4028)) { + return 2; + } + GOTO flow_1404 + flow_1040: + if (((boolean)bitconfig_4029)) { + return 2; + } + GOTO flow_1404 + flow_1043: + if (((boolean)bitconfig_4030)) { + return 2; + } + GOTO flow_1404 + flow_1046: + if (((boolean)bitconfig_4031)) { + return 2; + } + GOTO flow_1404 + flow_1049: + if (((boolean)bitconfig_4032)) { + return 2; + } + GOTO flow_1404 + flow_1052: + if (((boolean)bitconfig_4033)) { + return 2; + } + GOTO flow_1404 + flow_1055: + if (((boolean)bitconfig_4034)) { + return 2; + } + GOTO flow_1404 + flow_1058: + if (((boolean)bitconfig_4035)) { + return 2; + } + GOTO flow_1404 + flow_1061: + if (((boolean)bitconfig_4036)) { + return 2; + } + GOTO flow_1404 + flow_1064: + if (((boolean)bitconfig_4037)) { + return 2; + } + GOTO flow_1404 + flow_1067: + if (((boolean)bitconfig_4038)) { + return 2; + } + GOTO flow_1404 + flow_1070: + if (((boolean)bitconfig_4039)) { + return 2; + } + GOTO flow_1404 + flow_1073: + if (((boolean)bitconfig_8136)) { + return 2; + } + GOTO flow_1404 + flow_1076: + if (((boolean)bitconfig_8137)) { + return 2; + } + GOTO flow_1404 + flow_1079: + if (((boolean)bitconfig_8138)) { + return 2; + } + GOTO flow_1404 + flow_1082: + if (((boolean)bitconfig_8139)) { + return 2; + } + GOTO flow_1404 + flow_1085: + if (((boolean)bitconfig_8140)) { + return 2; + } + GOTO flow_1404 + flow_1088: + if (((boolean)bitconfig_8141)) { + return 2; + } + GOTO flow_1404 + flow_1091: + if (((boolean)bitconfig_8145)) { + return 2; + } + GOTO flow_1404 + flow_1094: + if (((boolean)bitconfig_8146)) { + return 2; + } + GOTO flow_1404 + flow_1097: + if (((boolean)bitconfig_8148)) { + return 2; + } + GOTO flow_1404 + flow_1100: + if (((boolean)bitconfig_8517)) { + return 2; + } + GOTO flow_1404 + flow_1103: + if (((boolean)bitconfig_8518)) { + return 2; + } + GOTO flow_1404 + flow_1106: + if (((boolean)bitconfig_8519)) { + return 2; + } + GOTO flow_1404 + flow_1109: + if (((boolean)bitconfig_8520)) { + return 2; + } + GOTO flow_1404 + flow_1112: + if (((boolean)bitconfig_8521)) { + return 2; + } + GOTO flow_1404 + flow_1115: + if (((boolean)bitconfig_8522)) { + return 2; + } + GOTO flow_1404 + flow_1118: + if (((boolean)bitconfig_8523)) { + return 2; + } + GOTO flow_1404 + flow_1121: + if (((boolean)bitconfig_8524)) { + return 2; + } + GOTO flow_1404 + flow_1124: + if (((boolean)bitconfig_8525)) { + return 2; + } + GOTO flow_1404 + flow_1127: + if (((boolean)bitconfig_8526)) { + return 2; + } + GOTO flow_1404 + flow_1130: + if (((boolean)bitconfig_8527)) { + return 2; + } + GOTO flow_1404 + flow_1133: + if (((boolean)bitconfig_8528)) { + return 2; + } + GOTO flow_1404 + flow_1136: + if (((boolean)bitconfig_8529)) { + return 2; + } + GOTO flow_1404 + flow_1139: + if (((boolean)bitconfig_8530)) { + return 2; + } + GOTO flow_1404 + flow_1142: + if (((boolean)bitconfig_8531)) { + return 2; + } + GOTO flow_1404 + flow_1145: + if (((boolean)bitconfig_8532)) { + return 2; + } + GOTO flow_1404 + flow_1148: + if (((boolean)bitconfig_8533)) { + return 2; + } + GOTO flow_1404 + flow_1151: + if (((boolean)bitconfig_8534)) { + return 2; + } + GOTO flow_1404 + flow_1154: + if (((boolean)bitconfig_8535)) { + return 2; + } + GOTO flow_1404 + flow_1157: + if (((boolean)bitconfig_8536)) { + return 2; + } + GOTO flow_1404 + flow_1160: + if (((boolean)bitconfig_8537)) { + return 2; + } + GOTO flow_1404 + flow_1163: + if (((boolean)bitconfig_8538)) { + return 2; + } + GOTO flow_1404 + flow_1166: + if (((boolean)bitconfig_8539)) { + return 2; + } + GOTO flow_1404 + flow_1169: + if (((boolean)bitconfig_8540)) { + return 2; + } + GOTO flow_1404 + flow_1172: + if (((boolean)bitconfig_8541)) { + return 2; + } + GOTO flow_1404 + flow_1175: + if (((boolean)bitconfig_8542)) { + return 2; + } + GOTO flow_1404 + flow_1178: + if (((boolean)bitconfig_8543)) { + return 2; + } + GOTO flow_1404 + flow_1181: + if (((boolean)bitconfig_8544)) { + return 2; + } + GOTO flow_1404 + flow_1184: + if (((boolean)bitconfig_8545)) { + return 2; + } + GOTO flow_1404 + flow_1187: + if (((boolean)bitconfig_8546)) { + return 2; + } + GOTO flow_1404 + flow_1190: + if (((boolean)bitconfig_8547)) { + return 2; + } + GOTO flow_1404 + flow_1193: + if (((boolean)bitconfig_8548)) { + return 2; + } + GOTO flow_1404 + flow_1196: + if (((boolean)bitconfig_8549)) { + return 2; + } + GOTO flow_1404 + flow_1199: + if (((boolean)bitconfig_8550)) { + return 2; + } + GOTO flow_1404 + flow_1202: + if (((boolean)bitconfig_8551)) { + return 2; + } + GOTO flow_1404 + flow_1205: + if (((boolean)bitconfig_8552)) { + return 2; + } + GOTO flow_1404 + flow_1208: + if (((boolean)bitconfig_8553)) { + return 2; + } + GOTO flow_1404 + flow_1211: + if (((boolean)bitconfig_8554)) { + return 2; + } + GOTO flow_1404 + flow_1214: + if (((boolean)bitconfig_8555)) { + return 2; + } + GOTO flow_1404 + flow_1217: + if (((boolean)bitconfig_8556)) { + return 2; + } + GOTO flow_1404 + flow_1220: + if (((boolean)bitconfig_8557)) { + return 2; + } + GOTO flow_1404 + flow_1223: + if (((boolean)bitconfig_8558)) { + return 2; + } + GOTO flow_1404 + flow_1226: + if (((boolean)bitconfig_8559)) { + return 2; + } + GOTO flow_1404 + flow_1229: + if (((boolean)bitconfig_8560)) { + return 2; + } + GOTO flow_1404 + flow_1232: + if (((boolean)bitconfig_8573)) { + return 2; + } + GOTO flow_1404 + flow_1235: + if (((boolean)bitconfig_8574)) { + return 2; + } + GOTO flow_1404 + flow_1238: + if (((boolean)bitconfig_8561)) { + return 2; + } + GOTO flow_1404 + flow_1241: + if (((boolean)bitconfig_8562)) { + return 2; + } + GOTO flow_1404 + flow_1244: + if (((boolean)bitconfig_8563)) { + return 2; + } + GOTO flow_1404 + flow_1247: + if (((boolean)bitconfig_8564)) { + return 2; + } + GOTO flow_1404 + flow_1250: + if (((boolean)bitconfig_8565)) { + return 2; + } + GOTO flow_1404 + flow_1253: + if (((boolean)bitconfig_8566)) { + return 2; + } + GOTO flow_1404 + flow_1256: + if (((boolean)bitconfig_8567)) { + return 2; + } + GOTO flow_1404 + flow_1259: + if (((boolean)bitconfig_8568)) { + return 2; + } + GOTO flow_1404 + flow_1262: + if (((boolean)bitconfig_8569)) { + return 2; + } + GOTO flow_1404 + flow_1265: + if (((boolean)bitconfig_8570)) { + return 2; + } + GOTO flow_1404 + flow_1268: + if (((boolean)bitconfig_8571)) { + return 2; + } + GOTO flow_1404 + flow_1271: + if (((boolean)bitconfig_8572)) { + return 2; + } + GOTO flow_1404 + flow_1274: + if (((boolean)bitconfig_8781)) { + return 2; + } + GOTO flow_1404 + flow_1277: + if (standart_config_281 >= 7) { + return 2; + } + GOTO flow_1404 + flow_1280: + if (standart_config_281 > 7) { + return 2; + } + GOTO flow_1404 + flow_1283: + if (standart_config_281 > 10) { + return 2; + } + GOTO flow_1404 + flow_1286: + if (standart_config_281 > 49) { + return 2; + } + GOTO flow_1404 + flow_1289: + if (standart_config_281 > 95) { + return 2; + } + GOTO flow_1404 + flow_1292: + if (standart_config_281 > 15) { + return 2; + } + GOTO flow_1404 + flow_1295: + if (standart_config_281 > 30) { + return 2; + } + GOTO flow_1404 + flow_1298: + if (standart_config_281 > 40) { + return 2; + } + GOTO flow_1404 + flow_1301: + if (standart_config_281 > 55) { + return 2; + } + GOTO flow_1404 + flow_1304: + if (standart_config_281 > 60) { + return 2; + } + GOTO flow_1404 + flow_1307: + if (standart_config_281 > 62) { + return 2; + } + GOTO flow_1404 + flow_1310: + if (standart_config_281 > 75) { + return 2; + } + GOTO flow_1404 + flow_1313: + if (standart_config_281 > 70) { + return 2; + } + GOTO flow_1404 + flow_1316: + if (standart_config_281 > 90) { + return 2; + } + GOTO flow_1404 + flow_1319: + if (standart_config_281 > 115) { + return 2; + } + GOTO flow_1404 + flow_1322: + if (standart_config_281 > 127) { + return 2; + } + GOTO flow_1404 + flow_1325: + if (standart_config_281 > 165) { + return 2; + } + GOTO flow_1404 + flow_1328: + if (standart_config_281 > 160) { + return 2; + } + GOTO flow_1404 + flow_1331: + if (standart_config_281 > 160) { + return 2; + } + GOTO flow_1404 + flow_1334: + if ((getSkillActualLvl(8) > 1) || (getSkillActualLvl(14) > 1)) { + return 2; + } + GOTO flow_1404 + flow_1337: + if ((getSkillActualLvl(8) > 1) || (getSkillActualLvl(14) > 1)) { + return 2; + } + GOTO flow_1404 + flow_1340: + if (standart_config_281 > 170) { + return 2; + } + GOTO flow_1404 + flow_1343: + if (bitconfig_6494 > 2) { + return 2; + } + GOTO flow_1404 + flow_1346: + if (bitconfig_9013 == 3) { + return 2; + } + GOTO flow_1404 + flow_1349: + if (((boolean)bitconfig_9015)) { + return 2; + } + GOTO flow_1404 + flow_1352: + if (((boolean)bitconfig_9016)) { + return 2; + } + GOTO flow_1404 + flow_1355: + if (((boolean)bitconfig_9018)) { + return 2; + } + GOTO flow_1404 + flow_1358: + if (((boolean)bitconfig_9019)) { + return 2; + } + GOTO flow_1404 + flow_1361: + if (((boolean)bitconfig_9010)) { + return 2; + } + GOTO flow_1404 + flow_1364: + if (bitconfig_9011 == 3) { + return 2; + } + if (bitconfig_9011 > 0) { + return 1; + } + GOTO flow_1404 + flow_1369: + if (((boolean)bitconfig_9020)) { + return 2; + } + GOTO flow_1404 + flow_1372: + if (((boolean)bitconfig_9027)) { + return 2; + } + GOTO flow_1404 + flow_1375: + if (((boolean)bitconfig_9021)) { + return 2; + } + GOTO flow_1404 + flow_1378: + if (((boolean)bitconfig_9022)) { + return 2; + } + GOTO flow_1404 + flow_1381: + if (((boolean)bitconfig_9023)) { + return 2; + } + GOTO flow_1404 + flow_1384: + if (((boolean)bitconfig_9024)) { + return 2; + } + GOTO flow_1404 + flow_1387: + if (((boolean)bitconfig_9025)) { + return 2; + } + GOTO flow_1404 + flow_1390: + if (((boolean)bitconfig_9026)) { + return 2; + } + GOTO flow_1404 + flow_1393: + if (((boolean)bitconfig_9638)) { + return 2; + } + GOTO flow_1404 + flow_1396: + if (((boolean)bitconfig_9639)) { + return 2; + } + GOTO flow_1404 + flow_1399: + if (((boolean)bitconfig_9640)) { + return 2; + } + GOTO flow_1404 + flow_1402: + if (((boolean)bitconfig_9641)) { + return 2; + } + flow_1404: + return 0; +} diff --git a/dumps/scripts/3228.cs2 b/dumps/scripts/3228.cs2 new file mode 100644 index 000000000..4a9d1ee15 --- /dev/null +++ b/dumps/scripts/3228.cs2 @@ -0,0 +1,87 @@ +int script_3228(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + string svar1; + svar0 = ""; + ivar3 = -1; + switch (arg0) { + case 7: + svar0 = globalstring_124; + ivar3 = 44105812; + globalstring_328 = globalstring_124; + break; + case 8: + svar0 = globalstring_125; + ivar3 = 44105802; + globalstring_329 = globalstring_125; + } + ivar4 = strLength(svar0); + if (ivar4 <= 0) { + switch (arg0) { + case 7: + script_3213(44105812, "Please enter your desired password here."); + break; + case 8: + script_3213(44105802, "Please enter your desired password again here."); + } + return 0; + } + if ((((boolean)arg1) && (stringMethod4107(globalstring_124, globalstring_125) != 0)) && ((strLength(globalstring_124) > 0) || (strLength(globalstring_125) > 0))) { + script_3213(44105802, "Please ensure both passwords match."); + return 0; + } + if (ivar4 < 5) { + script_3213(ivar3, "Passwords must be at least 5 characters long."); + return 0; + } + if (ivar4 > 20) { + script_3213(ivar3, "Passwords must be no more than " + intToStr(20) + " characters long."); + return 0; + } + if (((boolean)script_2202(svar0))) { + script_3213(ivar3, "Passwords may only contain letters and numbers."); + return 0; + } + if (strIndexof(0, globalstring_122, svar0) != -1) { + script_3213(ivar3, "Your password is too similar to your Email address."); + return 0; + } + svar1 = substr(0, 1, svar0); + ivar5 = strLength(svar0); + ivar6 = 0; + ivar7 = 0; + while (ivar6 < ivar5) { + if (strIndexof(ivar6, svar0, svar1) == ivar6) { + ivar7 = add(ivar7, 1); + } + ivar6 = add(ivar6, 1); + } + if (ivar7 == ivar5) { + script_3213(ivar3, "Your password is too easy to guess."); + return 0; + } + switch (arg0) { + case 7: + setWidgetSprite(4059, new WidgetPointer(673,84)); + setWidgetIsHidden(true, new WidgetPointer(673,89)); + break; + case 8: + setWidgetSprite(4059, new WidgetPointer(673,74)); + setWidgetIsHidden(true, new WidgetPointer(673,79)); + } + setWidgetIsHidden(true, new WidgetPointer(673,31)); + if (((boolean)arg2)) { + switch (arg0) { + case 7: + script_2714(8, 1); + break; + case 8: + script_2714(15, 1); + } + } + return 1; +} diff --git a/dumps/scripts/3229.cs2 b/dumps/scripts/3229.cs2 new file mode 100644 index 000000000..6344a532f --- /dev/null +++ b/dumps/scripts/3229.cs2 @@ -0,0 +1,4 @@ +void script_3229() { + script_3230(); + return; +} diff --git a/dumps/scripts/323.cs2 b/dumps/scripts/323.cs2 new file mode 100644 index 000000000..1408f39e5 --- /dev/null +++ b/dumps/scripts/323.cs2 @@ -0,0 +1,5 @@ +void script_323(int arg0,int arg1) { + setWidgetText(new WidgetPointer(arg0), "Room:" + "
" + intToStr(bitconfig_2377) + " / 8"); + setWidgetText(new WidgetPointer(arg1), "Level:" + "
" + intToStr(bitconfig_2376)); + return; +} diff --git a/dumps/scripts/3230.cs2 b/dumps/scripts/3230.cs2 new file mode 100644 index 000000000..2d0cc051e --- /dev/null +++ b/dumps/scripts/3230.cs2 @@ -0,0 +1,46 @@ +void script_3230() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = 0; + if (getDisplayMode() < 2) { + setWidgetPosition(0, 16, 1, 1, new WidgetPointer(596,6)); + setWidgetPosition(0, 16, 1, 1, new WidgetPointer(596,7)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(744,16)); + setWidgetPosition(0, 26, 1, 0, new WidgetPointer(744,23)); + } else { + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(596,6)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(596,7)); + setWidgetSize(956, 503, 0, 0, new WidgetPointer(744,16)); + ivar0 = getWidgetActualY(new WidgetPointer(744,16)); + ivar0 = subtract(ivar0, getWidgetActualHeight(new WidgetPointer(744,23))); + ivar0 = divide(ivar0, 2); + setWidgetPosition(0, max(ivar0, 0), 1, 0, new WidgetPointer(744,23)); + } + ivar1 = 0; + ivar2 = 0; + ivar3 = 2; + ivar1 = add(getWidgetActualX(new WidgetPointer(744,99)), getWidgetActualX(new WidgetPointer(744,16))); + ivar1 = subtract(ivar1, add(getWidgetActualWidth(new WidgetPointer(744,81)), ivar3)); + ivar2 = add(getWidgetActualY(new WidgetPointer(744,101)), getWidgetActualY(new WidgetPointer(744,16))); + ivar2 = add(ivar2, ivar3); + ivar2 = add(ivar2, getWidgetActualHeight(new WidgetPointer(744,101))); + setWidgetPosition(ivar1, ivar2, 0, 0, new WidgetPointer(744,81)); + ivar1 = getWidgetActualX(new WidgetPointer(744,81)); + ivar1 = add(ivar1, getWidgetActualWidth(new WidgetPointer(744,81))); + ivar1 = subtract(getWidgetActualWidth(new WidgetPointer(744,17)), ivar1); + setWidgetPosition(ivar1, ivar2, 2, 0, new WidgetPointer(744,81)); + if ((cs2method6139() == 2) && (getDisplayMode() != 1)) { + setWidgetPosition(9, 57, 2, 0, new WidgetPointer(744,81)); + setWidgetSize(800, 503, 0, 0, new WidgetPointer(744,16)); + } else { + if (add(getWidgetActualWidth(new WidgetPointer(744,81)), getWidgetActualX(new WidgetPointer(744,81))) > getWidgetActualWidth(new WidgetPointer(744,17))) { + setWidgetPosition(5, 5, 2, 0, new WidgetPointer(744,81)); + } + } + if (((boolean)globalint_986)) { + setWidgetPosition(5, 5, 2, 0, new WidgetPointer(744,81)); + } + return; +} diff --git a/dumps/scripts/3231.cs2 b/dumps/scripts/3231.cs2 new file mode 100644 index 000000000..794e3ba28 --- /dev/null +++ b/dumps/scripts/3231.cs2 @@ -0,0 +1,4 @@ +void script_3231(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,string arg7,string arg8,string arg9) { + script_3232(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 1, arg7, arg8, arg9); + return; +} diff --git a/dumps/scripts/3232.cs2 b/dumps/scripts/3232.cs2 new file mode 100644 index 000000000..028a84e96 --- /dev/null +++ b/dumps/scripts/3232.cs2 @@ -0,0 +1,120 @@ +void script_3232(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,string arg8,string arg9,string arg10) { + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + ivar8 = 39059463; + ivar9 = 39059464; + ivar10 = 39059470; + ivar11 = 39059469; + ivar12 = 39059471; + ivar13 = 39059519; + ivar14 = 39059472; + ivar15 = 39059473; + ivar16 = 39059474; + ivar17 = 39059521; + ivar18 = 39059522; + ivar19 = 39059523; + if (hasSSKey()) { + ivar8 = 63897626; + ivar9 = 63897601; + ivar10 = 63897604; + ivar11 = 63897603; + ivar12 = 63897605; + ivar13 = 63897606; + ivar14 = 63897611; + ivar15 = 63897612; + ivar16 = 63897613; + ivar17 = 63897607; + ivar18 = 63897608; + ivar19 = 63897609; + } + if (isWidgetHidden(new WidgetPointer(ivar8))) { + return; + } + if (globalint_174 != 5) { + globalint_1089 = globalint_174; + } + globalint_174 = 5; + ivar20 = 250; + if (((boolean)arg4)) { + ivar20 = max(250, add(getTextWidth(3793, arg9), 36)); + if (mod(ivar20, 2) > 0) { + ivar20 = add(ivar20, 1); + } + } + setWidgetSize(ivar20, 154, 0, 0, new WidgetPointer(ivar9)); + ivar21 = add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(ivar10)), 3793, arg8), 16), 5); + setWidgetSize(20, ivar21, 1, 0, new WidgetPointer(ivar10)); + setWidgetText(new WidgetPointer(ivar10), arg8); + if (((boolean)arg2)) { + globalint_1092 = add(getClientCycle(), 5); + setWidgetSprite(4107, new WidgetPointer(ivar11)); + setWidgetSize(111, 111, 0, 0, new WidgetPointer(ivar11)); + setWidgetPosition(0, 7, 1, 0, new WidgetPointer(ivar11)); + setWidgetPosition(0, 112, 1, 0, new WidgetPointer(ivar10)); + setScriptCallOnGameloop(2951, "", new WidgetPointer(ivar11)); + } else { + globalint_1092 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar11)); + setWidgetSprite(arg3, new WidgetPointer(ivar11)); + setWidgetSize(76, 63, 0, 0, new WidgetPointer(ivar11)); + setWidgetPosition(0, 18, 1, 0, new WidgetPointer(ivar11)); + setWidgetPosition(0, 123, 1, 0, new WidgetPointer(ivar10)); + ivar21 = subtract(ivar21, 35); + } + ivar22 = 0; + ivar21 = add(getWidgetActualY(new WidgetPointer(ivar10)), ivar21); + if (((boolean)arg4) && ((boolean)arg6)) { + ivar22 = 12; + ivar21 = add(ivar21, ivar22); + setWidgetIsHidden(true, new WidgetPointer(ivar12)); + setWidgetIsHidden(true, new WidgetPointer(ivar13)); + } else if (((boolean)arg4) && ((boolean)arg6)) { + ivar22 = 41; + ivar21 = add(ivar21, ivar22); + setWidgetPosition(0, 8, 1, 2, new WidgetPointer(ivar12)); + setWidgetIsHidden(false, new WidgetPointer(ivar12)); + setWidgetIsHidden(true, new WidgetPointer(ivar13)); + script_2955(ivar12, ivar14, ivar15, ivar16, arg5, arg9); + } else if (((boolean)arg4) && ((boolean)arg6)) { + ivar22 = 41; + ivar21 = add(ivar21, ivar22); + setWidgetPosition(0, 8, 1, 2, new WidgetPointer(ivar13)); + setWidgetIsHidden(false, new WidgetPointer(ivar13)); + setWidgetIsHidden(true, new WidgetPointer(ivar12)); + script_2956(ivar13, ivar17, ivar18, ivar19, arg10); + } else { + ivar22 = 70; + ivar21 = add(ivar21, ivar22); + if (((boolean)arg7)) { + setWidgetPosition(0, 40, 1, 2, new WidgetPointer(ivar12)); + setWidgetPosition(0, 10, 1, 2, new WidgetPointer(ivar13)); + } else { + setWidgetPosition(0, 10, 1, 2, new WidgetPointer(ivar12)); + setWidgetPosition(0, 40, 1, 2, new WidgetPointer(ivar13)); + } + setWidgetIsHidden(false, new WidgetPointer(ivar13)); + setWidgetIsHidden(false, new WidgetPointer(ivar12)); + script_2955(ivar12, ivar14, ivar15, ivar16, arg5, arg9); + script_2956(ivar13, ivar17, ivar18, ivar19, arg10); + } + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar9)), ivar21, 0, 0, new WidgetPointer(ivar9)); + script_2952(ivar12, ivar13, arg0); + setWidgetPosition(0, ivar22, 1, 2, new WidgetPointer(ivar10)); + setWidgetIsHidden(false, new WidgetPointer(ivar8)); + setWidgetIsHidden(false, new WidgetPointer(ivar9)); + setWidgetIsHidden(true, new WidgetPointer(596,6)); + return; +} diff --git a/dumps/scripts/3233.cs2 b/dumps/scripts/3233.cs2 new file mode 100644 index 000000000..366e827f1 --- /dev/null +++ b/dumps/scripts/3233.cs2 @@ -0,0 +1,9 @@ +void script_3233(string arg0) { + int ivar0; + ivar0 = 39059470; + if (hasSSKey()) { + ivar0 = 63897604; + } + setWidgetText(new WidgetPointer(ivar0), arg0); + return; +} diff --git a/dumps/scripts/3234.cs2 b/dumps/scripts/3234.cs2 new file mode 100644 index 000000000..436507197 --- /dev/null +++ b/dumps/scripts/3234.cs2 @@ -0,0 +1,4 @@ +void script_3234() { + script_3235(); + return; +} diff --git a/dumps/scripts/3235.cs2 b/dumps/scripts/3235.cs2 new file mode 100644 index 000000000..1b048f01c --- /dev/null +++ b/dumps/scripts/3235.cs2 @@ -0,0 +1,14 @@ +void script_3235() { + int ivar0; + ivar0 = 39059501; + if (hasSSKey()) { + ivar0 = 63897644; + } + if (globalint_200 > 0) { + setScriptCallOnMousePressed(2944, "", new WidgetPointer(ivar0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar0)); + resetRCs(); + script_2954(); + } + return; +} diff --git a/dumps/scripts/3236.cs2 b/dumps/scripts/3236.cs2 new file mode 100644 index 000000000..e949238a8 --- /dev/null +++ b/dumps/scripts/3236.cs2 @@ -0,0 +1,14 @@ +void script_3236(int arg0,int arg1,int arg2,int arg3,int arg4) { + string svar0; + svar0 = ""; + switch (arg3) { + case 3: + svar0 = globalstring_32; + break; + case 4: + svar0 = script_2949(globalstring_33); + } + globalint_1099 = script_1401(arg0, 3793, 0, svar0); + script_3237(arg4, arg1, arg2, arg3, svar0); + return; +} diff --git a/dumps/scripts/3237.cs2 b/dumps/scripts/3237.cs2 new file mode 100644 index 000000000..11b57c918 --- /dev/null +++ b/dumps/scripts/3237.cs2 @@ -0,0 +1,32 @@ +void script_3237(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + string svar1; + string svar2; + setWidgetPosition(script_1551(globalint_1099, 3793, add(getWidgetActualX(new WidgetPointer(arg0)), 6), arg4), getWidgetActualY(new WidgetPointer(arg2)), 0, 0, new WidgetPointer(arg2)); + ivar4 = subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 11); + ivar5 = strLength(arg4); + svar1 = ""; + if (globalint_1099 > 0) { + svar1 = substr(0, globalint_1099, arg4); + } + svar2 = ""; + if (globalint_1099 < ivar5) { + svar2 = substr(globalint_1099, ivar5, arg4); + } + ivar6 = subtract(getTextWidth(3793, svar1), ivar4); + setWidgetPosition(6, getWidgetActualY(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + setWidgetSize(max(getTextWidth(3793, arg4), ivar4), getWidgetActualHeight(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + if (ivar6 > 0) { + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(arg1)), ivar6), getWidgetActualY(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(arg2)), ivar6), getWidgetActualY(new WidgetPointer(arg2)), 0, 0, new WidgetPointer(arg2)); + } + if (hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg2)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } + setScriptCallOnGameloop(3238, getClientCycle(), new WidgetPointer(arg2), arg3, "iIi", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3238.cs2 b/dumps/scripts/3238.cs2 new file mode 100644 index 000000000..e29c1e5b5 --- /dev/null +++ b/dumps/scripts/3238.cs2 @@ -0,0 +1,10 @@ +void script_3238(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = script_2948(); + if ((((globalint_174 == arg2) && (mod(subtract(getClientCycle(), arg0), 40) < 20)) && ((ivar3 != -3) && (ivar3 != 21))) && (((ivar3 != 1) && isWidgetHidden(new WidgetPointer(596,7))) && hasWindowFocus())) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/3239.cs2 b/dumps/scripts/3239.cs2 new file mode 100644 index 000000000..5b0a30f7e --- /dev/null +++ b/dumps/scripts/3239.cs2 @@ -0,0 +1,173 @@ +void script_3239(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_2692_struct(2,0,0) structdump_3; + ivar3 = script_2948(); + if (((boolean)arg1) && (((ivar3 == -3) || (ivar3 == 21)) || ((boolean)ivar3))) { + return; + } + globalint_175 = getClientCycle(); + script_41(48758864); + globalint_1 = 0; + globalint_174 = 1; + if (globalint_1090 != 6) { + globalint_1091 = globalint_1090; + setScriptCallOnMousePressed(1173, globalint_1091, "i", new WidgetPointer(882,20)); + } + if (((boolean)arg0)) { + globalint_174 = 0; + script_3385(); + setWidgetIsHidden(false, new WidgetPointer(744,24)); + } else { + setWidgetIsHidden(true, new WidgetPointer(744,24)); + closeInterface(48758808); + } + if (arg0 == 5) { + openInterface(48758811, 975); + setWidgetIsHidden(true, new WidgetPointer(744,23)); + setWidgetIsHidden(false, new WidgetPointer(744,27)); + } else { + closeInterface(48758811); + setWidgetIsHidden(false, new WidgetPointer(744,23)); + setWidgetIsHidden(true, new WidgetPointer(744,27)); + } + if ((arg0 == 11) || (arg0 == 12)) { + globalint_547 = 0; + openInterface(48758810, 596); + script_2937(); + script_2940(arg0); + setWidgetIsHidden(false, new WidgetPointer(596,6)); + script_3230(); + } else { + script_2941(); + closeInterface(48758810); + setWidgetIsHidden(true, new WidgetPointer(744,26)); + } + if (arg0 == 7) { + openInterface(48758832, 673); + script_2213(); + setWidgetIsHidden(false, new WidgetPointer(744,48)); + } else { + closeInterface(48758832); + setWidgetIsHidden(true, new WidgetPointer(744,48)); + } + if (arg0 == 8) { + globalint_174 = 10; + setWidgetIsHidden(false, new WidgetPointer(744,49)); + } else { + closeInterface(48758833); + setWidgetIsHidden(true, new WidgetPointer(744,49)); + } + if ((arg0 == 7) || (arg0 == 8)) { + setWidgetIsHidden(true, new WidgetPointer(744,23)); + } else { + setWidgetIsHidden(false, new WidgetPointer(744,23)); + } + ivar4 = 4120; + ivar5 = 4125; + if ((((boolean)arg0) || (arg0 == 7)) || (arg0 == 8)) { + setWidgetRGB(new Color(100, 100, 100), new WidgetPointer(744,107)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(744,107)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(744,107)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(744,107)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(744,107)); + setScriptCallOnMousePressed(1173, 6, "i", new WidgetPointer(744,107)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar5, "Id", new WidgetPointer(744,107)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar4, "Id", new WidgetPointer(744,107)); + } + if (arg0 == 6) { + script_2595(0); + if (((boolean)arg2)) { + stack_dump0 = cs2method6131(); + stack_dump1 = getDisplayMode(); + stack_dump2 = cs2method6131(); + structdump_3 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_3.intpart_0, structdump_3.intpart_1, 0); + } + setWidgetIsHidden(false, new WidgetPointer(744,50)); + globalint_174 = 13; + } else { + if ((globalint_1090 == 6) && (arg0 != 5)) { + setWidgetIsHidden(false, new WidgetPointer(744,23)); + } + setWidgetIsHidden(true, new WidgetPointer(744,50)); + setScriptCallOnWidgetResize(-1, "", new WidgetPointer(744,50)); + setScriptCallOnWidgetResize(-1, "", new WidgetPointer(882,4)); + } + ivar6 = 0; + ivar7 = 0; + svar0 = ""; + ivar8 = 3793; + if (arg0 == 9) { + ivar6 = getWidgetActualWidth(new WidgetPointer(744,76)); + ivar7 = add(multiply(getLineCount(ivar6, 3793, getWidgetText(new WidgetPointer(744,76))), 14), 5); + setWidgetSize(ivar6, ivar7, 0, 0, new WidgetPointer(744,76)); + svar0 = getWidgetText(new WidgetPointer(744,78)); + ivar7 = add(add(getWidgetActualY(new WidgetPointer(744,76)), ivar7), 6); + if (strLength(svar0) > 0) { + setWidgetPosition(0, ivar7, 1, 0, new WidgetPointer(744,77)); + setWidgetSize(getTextWidth(ivar8, svar0), getWidgetActualHeight(new WidgetPointer(744,77)), 0, 0, new WidgetPointer(744,77)); + setWidgetText(new WidgetPointer(744,78), "" + svar0 + ""); + setScriptCallOnMouseEntered(2926, new WidgetPointer(744,77), new WidgetPointer(744,78), svar0, ivar8, 1, "IIsf1", new WidgetPointer(744,77)); + setScriptCallOnMouseExit(2926, new WidgetPointer(744,77), new WidgetPointer(744,78), svar0, ivar8, 0, "IIsf1", new WidgetPointer(744,77)); + setWidgetIsHidden(false, new WidgetPointer(744,77)); + ivar7 = add(add(ivar7, getWidgetActualHeight(new WidgetPointer(744,77))), 6); + } else { + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(744,77)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(744,77)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(744,77)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(744,77)); + setWidgetIsHidden(true, new WidgetPointer(744,77)); + setWidgetText(new WidgetPointer(744,78), ""); + } + setWidgetSize(getTextWidth(3795, getWidgetText(new WidgetPointer(744,79))), getWidgetActualHeight(new WidgetPointer(744,79)), 0, 0, new WidgetPointer(744,79)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(744,51)), add(add(ivar7, getWidgetActualHeight(new WidgetPointer(744,79))), 11), 0, 0, new WidgetPointer(744,51)); + setWidgetIsHidden(false, new WidgetPointer(744,51)); + } else { + setWidgetIsHidden(true, new WidgetPointer(744,51)); + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(744,77)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(744,77)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(744,77)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(744,77)); + setWidgetIsHidden(true, new WidgetPointer(744,77)); + setWidgetText(new WidgetPointer(744,78), ""); + setWidgetText(new WidgetPointer(744,76), ""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(744,79)); + } + if (arg0 == 10) { + globalint_174 = 11; + setWidgetIsHidden(false, new WidgetPointer(744,52)); + } else { + setWidgetIsHidden(true, new WidgetPointer(744,52)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(744,56)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(744,57)); + } + if ((arg0 != 9) && (arg0 != 10)) { + globalint_1090 = arg0; + } + if (arg0 == 12) { + globalstring_32 = globalstring_122; + globalstring_33 = globalstring_124; + globalstring_122 = ""; + globalstring_124 = ""; + globalstring_125 = ""; + setWidgetText(new WidgetPointer(596,73), globalstring_32); + setWidgetText(new WidgetPointer(596,79), script_2949(globalstring_33)); + globalint_174 = 4; + globalint_175 = getClientCycle(); + globalint_1099 = strLength(script_2949(globalstring_33)); + script_3237(39059528, 39059529, 39059530, 3, globalstring_32); + script_3237(39059534, 39059535, 39059536, 4, script_2949(globalstring_33)); + script_2945(); + } + return; +} diff --git a/dumps/scripts/324.cs2 b/dumps/scripts/324.cs2 new file mode 100644 index 000000000..520a11eb7 --- /dev/null +++ b/dumps/scripts/324.cs2 @@ -0,0 +1,95 @@ +void script_324(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar3 = min(bitconfig_2375, 500); + setWidgetSize(0, multiplyDivide(subtract(500, ivar3), 500, 16384), 1, 2, new WidgetPointer(arg0)); + ivar4 = add(164, multiplyDivide(ivar3, 500, 91)); + ivar5 = subtract(164, multiplyDivide(ivar3, 500, 164)); + ivar6 = subtract(41, multiplyDivide(ivar3, 500, 41)); + ivar7 = script_693(ivar4, ivar5, ivar6); + setWidgetRGB(new Color(ivar7), new WidgetPointer(arg0)); + setWidgetRGB(new Color(ivar7), new WidgetPointer(arg1)); + switch (multiplyDivide(add(ivar3, 5), 500, 25)) { + case 0: + setWidgetModel(16353, new WidgetPointer(arg2)); + break; + case 1: + setWidgetModel(16354, new WidgetPointer(arg2)); + break; + case 2: + setWidgetModel(16355, new WidgetPointer(arg2)); + break; + case 3: + setWidgetModel(16356, new WidgetPointer(arg2)); + break; + case 4: + setWidgetModel(16357, new WidgetPointer(arg2)); + break; + case 5: + setWidgetModel(16358, new WidgetPointer(arg2)); + break; + case 6: + setWidgetModel(16359, new WidgetPointer(arg2)); + break; + case 7: + setWidgetModel(16360, new WidgetPointer(arg2)); + break; + case 8: + setWidgetModel(16361, new WidgetPointer(arg2)); + break; + case 9: + setWidgetModel(16362, new WidgetPointer(arg2)); + break; + case 10: + setWidgetModel(16363, new WidgetPointer(arg2)); + break; + case 11: + setWidgetModel(16364, new WidgetPointer(arg2)); + break; + case 12: + setWidgetModel(16365, new WidgetPointer(arg2)); + break; + case 13: + setWidgetModel(16366, new WidgetPointer(arg2)); + break; + case 14: + setWidgetModel(16367, new WidgetPointer(arg2)); + break; + case 15: + setWidgetModel(16368, new WidgetPointer(arg2)); + break; + case 16: + setWidgetModel(16369, new WidgetPointer(arg2)); + break; + case 17: + setWidgetModel(16370, new WidgetPointer(arg2)); + break; + case 18: + setWidgetModel(16371, new WidgetPointer(arg2)); + break; + case 19: + setWidgetModel(16372, new WidgetPointer(arg2)); + break; + case 20: + setWidgetModel(16373, new WidgetPointer(arg2)); + break; + case 21: + setWidgetModel(16374, new WidgetPointer(arg2)); + break; + case 22: + setWidgetModel(16375, new WidgetPointer(arg2)); + break; + case 23: + setWidgetModel(16376, new WidgetPointer(arg2)); + break; + case 24: + setWidgetModel(16377, new WidgetPointer(arg2)); + break; + default: + setWidgetModel(16378, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/3240.cs2 b/dumps/scripts/3240.cs2 new file mode 100644 index 000000000..46a8e9cf3 --- /dev/null +++ b/dumps/scripts/3240.cs2 @@ -0,0 +1,6 @@ +void script_3240() { + if (((boolean)globalint_1200)) { + setWidgetText(new WidgetPointer(933,277), globalstring_312); + } + return; +} diff --git a/dumps/scripts/3241.cs2 b/dumps/scripts/3241.cs2 new file mode 100644 index 000000000..4b34fba54 --- /dev/null +++ b/dumps/scripts/3241.cs2 @@ -0,0 +1,4 @@ +void script_3241() { + script_2276(globalint_1200, globalint_1215, 61145366); + return; +} diff --git a/dumps/scripts/3242.cs2 b/dumps/scripts/3242.cs2 new file mode 100644 index 000000000..c0fbcd307 --- /dev/null +++ b/dumps/scripts/3242.cs2 @@ -0,0 +1,4 @@ +void script_3242() { + script_2276(globalint_1200, globalint_1216, 61145367); + return; +} diff --git a/dumps/scripts/3243.cs2 b/dumps/scripts/3243.cs2 new file mode 100644 index 000000000..4ef39fcf2 --- /dev/null +++ b/dumps/scripts/3243.cs2 @@ -0,0 +1,4 @@ +void script_3243() { + script_2276(globalint_1200, globalint_1217, 61145368); + return; +} diff --git a/dumps/scripts/3244.cs2 b/dumps/scripts/3244.cs2 new file mode 100644 index 000000000..4b76813b4 --- /dev/null +++ b/dumps/scripts/3244.cs2 @@ -0,0 +1,4 @@ +void script_3244() { + script_2276(globalint_1200, globalint_1218, 61145369); + return; +} diff --git a/dumps/scripts/3245.cs2 b/dumps/scripts/3245.cs2 new file mode 100644 index 000000000..826f31090 --- /dev/null +++ b/dumps/scripts/3245.cs2 @@ -0,0 +1,4 @@ +void script_3245() { + script_2276(globalint_1200, globalint_1219, 61145370); + return; +} diff --git a/dumps/scripts/3246.cs2 b/dumps/scripts/3246.cs2 new file mode 100644 index 000000000..51e2d3e28 --- /dev/null +++ b/dumps/scripts/3246.cs2 @@ -0,0 +1,4 @@ +void script_3246() { + script_2276(globalint_1200, globalint_1220, 61145371); + return; +} diff --git a/dumps/scripts/3247.cs2 b/dumps/scripts/3247.cs2 new file mode 100644 index 000000000..f2ef34977 --- /dev/null +++ b/dumps/scripts/3247.cs2 @@ -0,0 +1,4 @@ +void script_3247() { + script_3248(); + return; +} diff --git a/dumps/scripts/3248.cs2 b/dumps/scripts/3248.cs2 new file mode 100644 index 000000000..bd03042a9 --- /dev/null +++ b/dumps/scripts/3248.cs2 @@ -0,0 +1,20 @@ +void script_3248() { + if (((boolean)globalint_1201)) { + setWidgetText(new WidgetPointer(933,287), globalstring_313); + setWidgetText(new WidgetPointer(933,288), cs2method_3408(105, 115, 2857, globalint_1221)); + setWidgetText(new WidgetPointer(933,289), cs2method_3408(105, 115, 2857, globalint_1222)); + setWidgetText(new WidgetPointer(933,290), cs2method_3408(105, 115, 2857, globalint_1223)); + setWidgetText(new WidgetPointer(933,291), cs2method_3408(105, 115, 2857, globalint_1224)); + setWidgetText(new WidgetPointer(933,292), cs2method_3408(105, 115, 2857, globalint_1225)); + setWidgetText(new WidgetPointer(933,293), cs2method_3408(105, 115, 2857, globalint_1226)); + } else { + setWidgetText(new WidgetPointer(933,287), ""); + setWidgetText(new WidgetPointer(933,288), ""); + setWidgetText(new WidgetPointer(933,289), ""); + setWidgetText(new WidgetPointer(933,290), ""); + setWidgetText(new WidgetPointer(933,291), ""); + setWidgetText(new WidgetPointer(933,292), ""); + setWidgetText(new WidgetPointer(933,293), ""); + } + return; +} diff --git a/dumps/scripts/3249.cs2 b/dumps/scripts/3249.cs2 new file mode 100644 index 000000000..5e66d6b63 --- /dev/null +++ b/dumps/scripts/3249.cs2 @@ -0,0 +1,6 @@ +void script_3249() { + if (((boolean)globalint_1201)) { + setWidgetText(new WidgetPointer(933,287), globalstring_313); + } + return; +} diff --git a/dumps/scripts/325.cs2 b/dumps/scripts/325.cs2 new file mode 100644 index 000000000..5a1b09546 --- /dev/null +++ b/dumps/scripts/325.cs2 @@ -0,0 +1,9 @@ +void script_325() { + setWidgetIsHidden(true, new WidgetPointer(725,86)); + setWidgetIsHidden(false, new WidgetPointer(725,85)); + setWidgetSprite(1057, new WidgetPointer(725,88)); + setWidgetSprite(1051, new WidgetPointer(725,87)); + globalint_783 = 0; + script_328(47513685); + return; +} diff --git a/dumps/scripts/3250.cs2 b/dumps/scripts/3250.cs2 new file mode 100644 index 000000000..cc8616515 --- /dev/null +++ b/dumps/scripts/3250.cs2 @@ -0,0 +1,4 @@ +void script_3250() { + script_2276(globalint_1201, globalint_1221, 61145376); + return; +} diff --git a/dumps/scripts/3251.cs2 b/dumps/scripts/3251.cs2 new file mode 100644 index 000000000..5a2326954 --- /dev/null +++ b/dumps/scripts/3251.cs2 @@ -0,0 +1,4 @@ +void script_3251() { + script_2276(globalint_1201, globalint_1222, 61145377); + return; +} diff --git a/dumps/scripts/3252.cs2 b/dumps/scripts/3252.cs2 new file mode 100644 index 000000000..4af6c4258 --- /dev/null +++ b/dumps/scripts/3252.cs2 @@ -0,0 +1,4 @@ +void script_3252() { + script_2276(globalint_1201, globalint_1223, 61145378); + return; +} diff --git a/dumps/scripts/3253.cs2 b/dumps/scripts/3253.cs2 new file mode 100644 index 000000000..b9e2c9669 --- /dev/null +++ b/dumps/scripts/3253.cs2 @@ -0,0 +1,4 @@ +void script_3253() { + script_2276(globalint_1201, globalint_1224, 61145379); + return; +} diff --git a/dumps/scripts/3254.cs2 b/dumps/scripts/3254.cs2 new file mode 100644 index 000000000..12f417a55 --- /dev/null +++ b/dumps/scripts/3254.cs2 @@ -0,0 +1,4 @@ +void script_3254() { + script_2276(globalint_1201, globalint_1225, 61145380); + return; +} diff --git a/dumps/scripts/3255.cs2 b/dumps/scripts/3255.cs2 new file mode 100644 index 000000000..21f21303a --- /dev/null +++ b/dumps/scripts/3255.cs2 @@ -0,0 +1,4 @@ +void script_3255() { + script_2276(globalint_1201, globalint_1226, 61145381); + return; +} diff --git a/dumps/scripts/3256.cs2 b/dumps/scripts/3256.cs2 new file mode 100644 index 000000000..6d2a51536 --- /dev/null +++ b/dumps/scripts/3256.cs2 @@ -0,0 +1,4 @@ +void script_3256() { + script_3257(); + return; +} diff --git a/dumps/scripts/3257.cs2 b/dumps/scripts/3257.cs2 new file mode 100644 index 000000000..bcf0ed020 --- /dev/null +++ b/dumps/scripts/3257.cs2 @@ -0,0 +1,20 @@ +void script_3257() { + if (((boolean)globalint_1202)) { + setWidgetText(new WidgetPointer(933,301), globalstring_314); + setWidgetText(new WidgetPointer(933,302), cs2method_3408(105, 115, 2857, globalint_1227)); + setWidgetText(new WidgetPointer(933,303), cs2method_3408(105, 115, 2857, globalint_1228)); + setWidgetText(new WidgetPointer(933,304), cs2method_3408(105, 115, 2857, globalint_1229)); + setWidgetText(new WidgetPointer(933,305), cs2method_3408(105, 115, 2857, globalint_1230)); + setWidgetText(new WidgetPointer(933,306), cs2method_3408(105, 115, 2857, globalint_1231)); + setWidgetText(new WidgetPointer(933,307), cs2method_3408(105, 115, 2857, globalint_1232)); + } else { + setWidgetText(new WidgetPointer(933,301), ""); + setWidgetText(new WidgetPointer(933,302), ""); + setWidgetText(new WidgetPointer(933,303), ""); + setWidgetText(new WidgetPointer(933,304), ""); + setWidgetText(new WidgetPointer(933,305), ""); + setWidgetText(new WidgetPointer(933,306), ""); + setWidgetText(new WidgetPointer(933,307), ""); + } + return; +} diff --git a/dumps/scripts/3258.cs2 b/dumps/scripts/3258.cs2 new file mode 100644 index 000000000..b9ef5647f --- /dev/null +++ b/dumps/scripts/3258.cs2 @@ -0,0 +1,6 @@ +void script_3258() { + if (((boolean)globalint_1202)) { + setWidgetText(new WidgetPointer(933,301), globalstring_314); + } + return; +} diff --git a/dumps/scripts/3259.cs2 b/dumps/scripts/3259.cs2 new file mode 100644 index 000000000..81ee4fa8d --- /dev/null +++ b/dumps/scripts/3259.cs2 @@ -0,0 +1,4 @@ +void script_3259() { + script_2276(globalint_1202, globalint_1227, 61145390); + return; +} diff --git a/dumps/scripts/326.cs2 b/dumps/scripts/326.cs2 new file mode 100644 index 000000000..f713e2791 --- /dev/null +++ b/dumps/scripts/326.cs2 @@ -0,0 +1,9 @@ +void script_326() { + setWidgetIsHidden(false, new WidgetPointer(725,86)); + setWidgetIsHidden(true, new WidgetPointer(725,85)); + setWidgetSprite(1057, new WidgetPointer(725,87)); + setWidgetSprite(1049, new WidgetPointer(725,88)); + globalint_783 = 1; + script_328(47513686); + return; +} diff --git a/dumps/scripts/3260.cs2 b/dumps/scripts/3260.cs2 new file mode 100644 index 000000000..b8d77756d --- /dev/null +++ b/dumps/scripts/3260.cs2 @@ -0,0 +1,4 @@ +void script_3260() { + script_2276(globalint_1202, globalint_1228, 61145391); + return; +} diff --git a/dumps/scripts/3261.cs2 b/dumps/scripts/3261.cs2 new file mode 100644 index 000000000..1914ae4c9 --- /dev/null +++ b/dumps/scripts/3261.cs2 @@ -0,0 +1,4 @@ +void script_3261() { + script_2276(globalint_1202, globalint_1229, 61145392); + return; +} diff --git a/dumps/scripts/3262.cs2 b/dumps/scripts/3262.cs2 new file mode 100644 index 000000000..03365a3c2 --- /dev/null +++ b/dumps/scripts/3262.cs2 @@ -0,0 +1,4 @@ +void script_3262() { + script_2276(globalint_1202, globalint_1230, 61145393); + return; +} diff --git a/dumps/scripts/3263.cs2 b/dumps/scripts/3263.cs2 new file mode 100644 index 000000000..22f01ad50 --- /dev/null +++ b/dumps/scripts/3263.cs2 @@ -0,0 +1,4 @@ +void script_3263() { + script_2276(globalint_1202, globalint_1231, 61145394); + return; +} diff --git a/dumps/scripts/3264.cs2 b/dumps/scripts/3264.cs2 new file mode 100644 index 000000000..737ce18b5 --- /dev/null +++ b/dumps/scripts/3264.cs2 @@ -0,0 +1,4 @@ +void script_3264() { + script_2276(globalint_1202, globalint_1232, 61145395); + return; +} diff --git a/dumps/scripts/3265.cs2 b/dumps/scripts/3265.cs2 new file mode 100644 index 000000000..a8109000a --- /dev/null +++ b/dumps/scripts/3265.cs2 @@ -0,0 +1,14 @@ +int script_3265() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + while (ivar0 < min(bitconfig_7554, 15)) { + ivar1 = add(ivar1, subtract(22, ivar2)); + ivar2 = min(add(ivar2, 3), 19); + ivar0 = add(ivar0, 1); + } + return ivar1; +} diff --git a/dumps/scripts/3266.cs2 b/dumps/scripts/3266.cs2 new file mode 100644 index 000000000..d34646be4 --- /dev/null +++ b/dumps/scripts/3266.cs2 @@ -0,0 +1,20 @@ +cs2func_script_3266_struct(2,0,0) script_3266(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + if (((boolean)arg0) && (bitconfig_7554 != 0)) { + return newstruct cs2func_script_3266_struct(1, 0); + } + while (ivar1 < min(subtract(bitconfig_7554, 1), 15)) { + ivar2 = add(ivar2, subtract(22, ivar3)); + ivar3 = min(add(ivar3, 3), 19); + if (arg0 == ivar2) { + return newstruct cs2func_script_3266_struct(1, add(ivar1, 1)); + } + ivar1 = add(ivar1, 1); + } + return newstruct cs2func_script_3266_struct(0, 0); +} diff --git a/dumps/scripts/3267.cs2 b/dumps/scripts/3267.cs2 new file mode 100644 index 000000000..2a78a6d47 --- /dev/null +++ b/dumps/scripts/3267.cs2 @@ -0,0 +1,765 @@ +void script_3267() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + int ivar37; + int ivar38; + int ivar39; + int ivar40; + int ivar41; + cs2func_script_3273_struct(3,0,0) structdump_0; + cs2func_script_3273_struct(3,0,0) structdump_1; + cs2func_script_3273_struct(3,0,0) structdump_2; + int stack_dump3; + cs2func_script_3266_struct(2,0,0) structdump_4; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 25; + ivar10 = 25; + ivar11 = 50; + ivar12 = 25; + ivar13 = 25; + ivar14 = 50; + ivar15 = 25; + ivar16 = 25; + ivar17 = 50; + ivar18 = 100; + ivar19 = 50; + ivar20 = 25; + ivar21 = 150; + ivar22 = 25; + ivar23 = 100; + ivar24 = 25; + ivar25 = 100; + ivar26 = 25; + ivar27 = 50; + ivar28 = 25; + ivar29 = 50; + ivar30 = 25; + ivar31 = 25; + ivar32 = 25; + ivar33 = 150; + ivar34 = 100; + ivar35 = 200; + ivar36 = 100; + globalint_1185 = max(subtract(globalint_1185, 2), 0); + cs2method2103(globalint_1185, new WidgetPointer(933,251)); + cs2method2103(subtract(255, globalint_1185), new WidgetPointer(933,297)); + cs2method2103(subtract(255, globalint_1185), new WidgetPointer(933,298)); + cs2method2103(subtract(255, globalint_1185), new WidgetPointer(933,299)); + ivar37 = 0; + if (globalint_1188 == 2) { + ivar37 = 792; + } else { + if (globalint_1188 == 3) { + ivar37 = 1583; + } + } + ivar38 = multiplyDivide(globalint_1195, 10000, 1267); + structdump_0 = script_3273(); + ivar5 = structdump_0.intpart_2; + ivar4 = structdump_0.intpart_1; + ivar3 = structdump_0.intpart_0; + ivar39 = ivar5; + ivar40 = script_3274(); + ivar41 = subtract(10000, multiply(min(bitconfig_7554, 6), 1000)); + if (((boolean)globalint_1185) && (globalint_1192 != 0)) { + if (globalint_1186 < 350) { + if (getWidgetShadeColor(new WidgetPointer(933,186)) <= 31) { + globalint_1189 = 7; + } else { + if (getWidgetShadeColor(new WidgetPointer(933,186)) > 220) { + globalint_1189 = -7; + } + } + cs2method2103(add(getWidgetShadeColor(new WidgetPointer(933,186)), globalint_1189), new WidgetPointer(933,186)); + } else if ((globalint_1186 >= 350) && (globalint_1186 < 400)) { + if (globalint_1186 == 350) { + cs2method2103(255, new WidgetPointer(933,186)); + } + if (getWidgetShadeColor(new WidgetPointer(933,37)) <= 31) { + globalint_1189 = 7; + } else { + if (getWidgetShadeColor(new WidgetPointer(933,37)) > 220) { + globalint_1189 = -7; + } + } + cs2method2103(add(getWidgetShadeColor(new WidgetPointer(933,37)), globalint_1189), new WidgetPointer(933,37)); + } else if ((globalint_1186 >= 400) && (globalint_1186 < 1350)) { + if (globalint_1186 == 400) { + cs2method2103(255, new WidgetPointer(933,37)); + } + if (getWidgetShadeColor(new WidgetPointer(933,53)) <= 31) { + globalint_1189 = 7; + } else { + if (getWidgetShadeColor(new WidgetPointer(933,53)) > 220) { + globalint_1189 = -7; + } + } + cs2method2103(add(getWidgetShadeColor(new WidgetPointer(933,53)), globalint_1189), new WidgetPointer(933,53)); + } else { + if ((globalint_1186 >= 1350) && (globalint_1186 < 1600)) { + if (globalint_1186 == 1350) { + cs2method2103(255, new WidgetPointer(933,53)); + } + if (getWidgetShadeColor(new WidgetPointer(933,37)) <= 31) { + globalint_1189 = 7; + } else { + if (getWidgetShadeColor(new WidgetPointer(933,37)) > 220) { + globalint_1189 = -7; + } + } + cs2method2103(add(getWidgetShadeColor(new WidgetPointer(933,37)), globalint_1189), new WidgetPointer(933,37)); + } + } + if (globalint_1186 < ivar9) { + setWidgetIsHidden(false, new WidgetPointer(933,192)); + setWidgetIsHidden(false, new WidgetPointer(933,17)); + if (((boolean)globalint_1186)) { + playSoundEffect(8802, 1, 0); + } + } else if (globalint_1186 < add(ivar9, ivar10)) { + setWidgetIsHidden(false, new WidgetPointer(933,187)); + setWidgetIsHidden(false, new WidgetPointer(933,240)); + if (globalint_1187 < globalint_1319) { + setWidgetText(new WidgetPointer(933,240), "Floor " + intToStr(globalint_1187) + ":"); + setWidgetRGB(new Color(160, 0, 0), new WidgetPointer(933,240)); + } else { + setWidgetText(new WidgetPointer(933,240), "Floor " + intToStr(globalint_1319) + ":"); + } + setWidgetIsHidden(false, new WidgetPointer(933,22)); + setWidgetSize(add(getWidgetActualWidth(new WidgetPointer(933,23)), 5), add(getWidgetActualHeight(new WidgetPointer(933,23)), 5), 0, 0, new WidgetPointer(933,23)); + if (globalint_1186 == ivar9) { + playSoundEffect(8802, 1, 0); + } + cs2method2103(min(255, add(getWidgetShadeColor(new WidgetPointer(933,23)), 30)), new WidgetPointer(933,23)); + } else if (globalint_1186 < add(add(ivar9, ivar10), ivar11)) { + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(ivar9, ivar10)), 1), ivar11, 100); + if (((boolean)ivar8)) { + globalint_1270 = 0; + } + setWidgetIsHidden(false, new WidgetPointer(933,241)); + setWidgetText(new WidgetPointer(933,241), intToStr(multiplyDivide(divide(add(globalint_1237, 5), 10), 100, ivar8))); + if (multiplyDivide(divide(add(globalint_1237, 5), 10), 100, ivar8) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = multiplyDivide(divide(add(globalint_1237, 5), 10), 100, ivar8); + } + } else if (globalint_1186 < add(add(add(ivar9, ivar10), ivar11), ivar12)) { + setWidgetIsHidden(false, new WidgetPointer(933,190)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(ivar9, ivar10), ivar11)), 1), ivar12, 100); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,190)); + } else if (globalint_1186 < add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13)) { + setWidgetIsHidden(false, new WidgetPointer(933,188)); + setWidgetIsHidden(false, new WidgetPointer(933,227)); + if (isMember()) { + setWidgetText(new WidgetPointer(933,227), "Prestige " + intToStr(min(60, max(bitconfig_7550, bitconfig_7551)))); + } else { + setWidgetText(new WidgetPointer(933,227), "Prestige " + intToStr(min(35, max(bitconfig_7550, bitconfig_7551)))); + } + setWidgetIsHidden(false, new WidgetPointer(933,21)); + setWidgetSize(add(getWidgetActualWidth(new WidgetPointer(933,24)), 5), add(getWidgetActualHeight(new WidgetPointer(933,24)), 5), 0, 0, new WidgetPointer(933,24)); + if (globalint_1186 == add(add(add(ivar9, ivar10), ivar11), ivar12)) { + playSoundEffect(8802, 1, 0); + } + cs2method2103(min(255, add(getWidgetShadeColor(new WidgetPointer(933,24)), 30)), new WidgetPointer(933,24)); + } else if (globalint_1186 < add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14)) { + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13)), 1), ivar14, 100); + if (((boolean)ivar8)) { + globalint_1270 = 0; + } + setWidgetIsHidden(false, new WidgetPointer(933,228)); + setWidgetText(new WidgetPointer(933,228), intToStr(multiplyDivide(divide(add(globalint_1238, 5), 10), 100, ivar8))); + if (multiplyDivide(divide(add(globalint_1238, 5), 10), 100, ivar8) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = multiplyDivide(divide(add(globalint_1238, 5), 10), 100, ivar8); + } + } else if (globalint_1186 < add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15)) { + setWidgetIsHidden(false, new WidgetPointer(933,191)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14)), 1), ivar15, 100); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,191)); + } else if (globalint_1186 < add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16)) { + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15)), 1), ivar16, 100); + setWidgetIsHidden(false, new WidgetPointer(933,189)); + setWidgetIsHidden(false, new WidgetPointer(933,214)); + setWidgetIsHidden(false, new WidgetPointer(933,20)); + setWidgetSize(add(getWidgetActualWidth(new WidgetPointer(933,25)), 5), add(getWidgetActualHeight(new WidgetPointer(933,25)), 5), 0, 0, new WidgetPointer(933,25)); + if (globalint_1186 == add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15)) { + playSoundEffect(8802, 1, 0); + } + cs2method2103(min(255, add(getWidgetShadeColor(new WidgetPointer(933,25)), 30)), new WidgetPointer(933,25)); + } else if (globalint_1186 < add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17)) { + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16)), 1), ivar17, 100); + if (((boolean)ivar8)) { + globalint_1270 = 0; + } + setWidgetIsHidden(false, new WidgetPointer(933,215)); + setWidgetText(new WidgetPointer(933,215), intToStr(multiplyDivide(divide(add(globalint_1239, 5), 10), 100, ivar8))); + if (multiplyDivide(divide(add(globalint_1239, 5), 10), 100, ivar8) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = multiplyDivide(divide(add(globalint_1239, 5), 10), 100, ivar8); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18)) { + setWidgetIsHidden(true, new WidgetPointer(933,186)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17)), 1), ivar18, 100); + if (((boolean)ivar8)) { + globalint_1270 = 0; + } + setWidgetIsHidden(false, new WidgetPointer(933,19)); + setWidgetText(new WidgetPointer(933,39), intToStr(multiplyDivide(divide(add(globalint_1239, 5), 10), 100, ivar8))); + if (multiplyDivide(divide(add(globalint_1239, 5), 10), 100, ivar8) != globalint_1270) { + playSoundEffect(9243, 1, 0); + globalint_1270 = multiplyDivide(divide(add(globalint_1239, 5), 10), 100, ivar8); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19)) { + cs2method2103(255, new WidgetPointer(933,37)); + setWidgetIsHidden(false, new WidgetPointer(933,83)); + setWidgetIsHidden(false, new WidgetPointer(933,18)); + setWidgetIsHidden(false, new WidgetPointer(933,53)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18)) { + playSoundEffect(8802, 1, 0); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20)) { + setWidgetIsHidden(false, new WidgetPointer(933,54)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19)) { + playSoundEffect(8802, 1, 0); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21)) { + setWidgetIsHidden(false, new WidgetPointer(933,68)); + setWidgetIsHidden(false, new WidgetPointer(933,69)); + setWidgetIsHidden(false, new WidgetPointer(933,70)); + setWidgetIsHidden(false, new WidgetPointer(933,71)); + setWidgetIsHidden(false, new WidgetPointer(933,72)); + setWidgetIsHidden(false, new WidgetPointer(933,73)); + setWidgetIsHidden(false, new WidgetPointer(933,74)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20)) { + playSoundEffect(8806, 1, 0); + } + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21)) { + playSoundEffect(8802, 1, 0); + } + structdump_1 = script_3273(); + ivar5 = structdump_1.intpart_2; + ivar4 = structdump_1.intpart_1; + ivar3 = structdump_1.intpart_0; + if (ivar3 < 3) { + setWidgetIsHidden(false, new WidgetPointer(933,82)); + } + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20)), 1), divide(ivar21, 3), 100); + if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), divide(ivar21, 3))) { + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), divide(ivar21, 3))) { + playSoundEffect(8802, 1, 0); + } + cs2method2103(min(200, subtract(255, divide(multiply(ivar8, 255), 100))), new WidgetPointer(933,68)); + setWidgetText(new WidgetPointer(933,74), "+0%"); + if (((boolean)ivar8)) { + playSoundEffect(8806, 1, 0); + } + if (globalint_1186 == 475) { + playSoundEffect(9241, 1, 0); + } + } else if ((globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), multiply(divide(ivar21, 3), 2))) && (globalint_1188 > 1)) { + if ((globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), multiply(divide(ivar21, 3), 2))) && (globalint_1188 > 1)) { + playSoundEffect(8802, 1, 0); + } + ivar0 = 10000; + ivar1 = add(ivar0, 792); + if (ivar8 == 33) { + globalint_1270 = ivar0; + playSoundEffect(9241, 1, 0); + } + cs2method2103(min(200, divide(multiply(divide(ivar8, 2), 255), 100)), new WidgetPointer(933,68)); + cs2method2103(min(200, subtract(255, divide(multiply(ivar8, 255), 100))), new WidgetPointer(933,69)); + setWidgetText(new WidgetPointer(933,74), "+" + intToStr(divide(add(divide(multiplyDivide(ivar8, 100, subtract(ivar1, 10000)), 2), 50), 100)) + "%"); + if (divide(add(divide(multiplyDivide(ivar8, 100, subtract(ivar1, 10000)), 2), 50), 100) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = divide(add(divide(multiplyDivide(ivar8, 100, subtract(ivar1, 10000)), 2), 50), 100); + } + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, divide(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 2)), 50), 100)) + "%"); + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, divide(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 2)), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + if (globalint_1186 == 525) { + playSoundEffect(9241, 1, 0); + } + } else { + if (globalint_1188 > 2) { + ivar0 = add(10000, 792); + ivar1 = add(10000, 1583); + if (ivar8 == 66) { + globalint_1270 = ivar0; + playSoundEffect(9241, 1, 0); + } + cs2method2103(min(200, divide(multiply(divide(ivar8, 3), 255), 100)), new WidgetPointer(933,69)); + cs2method2103(min(200, subtract(255, divide(multiply(ivar8, 255), 100))), new WidgetPointer(933,70)); + setWidgetText(new WidgetPointer(933,74), "+" + intToStr(divide(add(divide(multiplyDivide(ivar8, 100, subtract(ivar1, 10000)), 3), 50), 100)) + "%"); + if (divide(add(divide(multiplyDivide(ivar8, 100, subtract(ivar1, 10000)), 3), 50), 100) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = divide(add(divide(multiplyDivide(ivar8, 100, subtract(ivar1, 10000)), 3), 50), 100); + } + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, divide(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 3)), 50), 100)) + "%"); + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, divide(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 3)), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + if (globalint_1186 == 575) { + playSoundEffect(9241, 1, 0); + } + } + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22)) { + setWidgetIsHidden(false, new WidgetPointer(933,55)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21)) { + playSoundEffect(8802, 1, 0); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23)) { + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22)), 1), ivar23, 100); + setWidgetIsHidden(false, new WidgetPointer(933,64)); + setWidgetIsHidden(false, new WidgetPointer(933,75)); + setWidgetSize(multiplyDivide(multiplyDivide(globalint_1195, 10000, 16384), 100, ivar8), 16384, 2, 2, new WidgetPointer(933,172)); + ivar0 = add(10000, ivar37); + ivar1 = add(add(10000, ivar37), ivar38); + if (((boolean)ivar8)) { + globalint_1270 = ivar0; + } + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,75), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,75), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)) + "%"); + if (divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100); + } + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24)) { + setWidgetIsHidden(false, new WidgetPointer(933,56)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23)) { + playSoundEffect(8802, 1, 0); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25)) { + setWidgetIsHidden(false, new WidgetPointer(933,57)); + setWidgetIsHidden(false, new WidgetPointer(933,78)); + setWidgetIsHidden(false, new WidgetPointer(933,80)); + setWidgetIsHidden(false, new WidgetPointer(933,59)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24)), 1), ivar25, 100); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,78)); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,80)); + structdump_2 = script_3273(); + ivar5 = structdump_2.intpart_2; + ivar4 = structdump_2.intpart_1; + ivar3 = structdump_2.intpart_0; + setWidgetText(new WidgetPointer(933,57), intToStr(ivar3) + " : " + intToStr(ivar4)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24)) { + playSoundEffect(8806, 1, 0); + } + ivar0 = add(add(10000, ivar37), ivar38); + ivar1 = add(add(add(10000, ivar37), ivar38), ivar39); + if (((boolean)ivar8)) { + globalint_1270 = ivar0; + } + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,59), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,59), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)) + "%"); + if (divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100); + } + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26)) { + setWidgetIsHidden(false, new WidgetPointer(933,61)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25)) { + playSoundEffect(8802, 1, 0); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27)) { + setWidgetIsHidden(false, new WidgetPointer(933,76)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26)), 1), ivar27, 100); + ivar0 = add(add(add(10000, ivar37), ivar38), ivar39); + ivar1 = add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236); + if (((boolean)ivar8)) { + globalint_1270 = ivar0; + } + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,76), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + if (divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100); + } + } else { + setWidgetText(new WidgetPointer(933,76), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)) + "%"); + if (divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100); + } + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28)) { + setWidgetIsHidden(false, new WidgetPointer(933,62)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27)) { + playSoundEffect(8802, 1, 0); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29)) { + setWidgetIsHidden(false, new WidgetPointer(933,58)); + setWidgetIsHidden(false, new WidgetPointer(933,79)); + setWidgetIsHidden(false, new WidgetPointer(933,81)); + setWidgetIsHidden(false, new WidgetPointer(933,60)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28)), 1), ivar29, 100); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,79)); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,81)); + setWidgetText(new WidgetPointer(933,58), intToStr(multiplyDivide(globalint_1320, 100, ivar8))); + if (multiplyDivide(globalint_1320, 100, ivar8) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = multiplyDivide(globalint_1320, 100, ivar8); + } + ivar0 = add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236); + ivar1 = multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40); + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,60), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,60), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)) + "%"); + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30)) { + setWidgetIsHidden(false, new WidgetPointer(933,63)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29)) { + playSoundEffect(8802, 1, 0); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31)) { + setWidgetIsHidden(false, new WidgetPointer(933,77)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30)), 1), ivar31, 100); + ivar0 = multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40); + ivar1 = multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()); + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,77), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,77), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)) + "%"); + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32)) { + setWidgetIsHidden(false, new WidgetPointer(933,65)); + if (globalint_1186 == add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31)) { + playSoundEffect(8802, 1, 0); + } + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32), ivar33)) { + setWidgetIsHidden(false, new WidgetPointer(933,66)); + setWidgetIsHidden(false, new WidgetPointer(933,67)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32)), 1), ivar33, 100); + if (bitconfig_7554 != 0) { + stack_dump3 = subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32)); + structdump_4 = script_3266(stack_dump3); + ivar7 = structdump_4.intpart_1; + ivar6 = structdump_4.intpart_0; + if (((boolean)ivar6)) { + playSoundEffect(9240, 1, 0); + switch (ivar7) { + case 0: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetSprite(2849, new WidgetPointer(933,146)); + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetSprite(2850, new WidgetPointer(933,146)); + setWidgetSprite(2849, new WidgetPointer(933,147)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetSprite(2850, new WidgetPointer(933,147)); + setWidgetSprite(2849, new WidgetPointer(933,148)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetSprite(2850, new WidgetPointer(933,148)); + setWidgetSprite(2849, new WidgetPointer(933,149)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetSprite(2850, new WidgetPointer(933,149)); + setWidgetSprite(2849, new WidgetPointer(933,150)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetSprite(2850, new WidgetPointer(933,150)); + setWidgetSprite(2849, new WidgetPointer(933,151)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetSprite(2850, new WidgetPointer(933,151)); + setWidgetSprite(2849, new WidgetPointer(933,152)); + break; + case 7: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetSprite(2850, new WidgetPointer(933,152)); + setWidgetSprite(2849, new WidgetPointer(933,153)); + break; + case 8: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetSprite(2850, new WidgetPointer(933,153)); + setWidgetSprite(2849, new WidgetPointer(933,154)); + break; + case 9: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetSprite(2850, new WidgetPointer(933,154)); + setWidgetSprite(2849, new WidgetPointer(933,155)); + break; + case 10: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetSprite(2850, new WidgetPointer(933,155)); + setWidgetSprite(2849, new WidgetPointer(933,156)); + break; + case 11: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetIsHidden(false, new WidgetPointer(933,157)); + setWidgetSprite(2850, new WidgetPointer(933,156)); + setWidgetSprite(2849, new WidgetPointer(933,157)); + break; + case 12: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetIsHidden(false, new WidgetPointer(933,157)); + setWidgetIsHidden(false, new WidgetPointer(933,158)); + setWidgetSprite(2850, new WidgetPointer(933,157)); + setWidgetSprite(2849, new WidgetPointer(933,158)); + break; + case 13: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetIsHidden(false, new WidgetPointer(933,157)); + setWidgetIsHidden(false, new WidgetPointer(933,158)); + setWidgetIsHidden(false, new WidgetPointer(933,159)); + setWidgetSprite(2850, new WidgetPointer(933,158)); + setWidgetSprite(2849, new WidgetPointer(933,159)); + break; + case 14: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetIsHidden(false, new WidgetPointer(933,157)); + setWidgetIsHidden(false, new WidgetPointer(933,158)); + setWidgetIsHidden(false, new WidgetPointer(933,159)); + setWidgetIsHidden(false, new WidgetPointer(933,160)); + setWidgetSprite(2850, new WidgetPointer(933,159)); + setWidgetSprite(2849, new WidgetPointer(933,160)); + } + } + } else { + setWidgetText(new WidgetPointer(933,67), "n/a"); + globalint_1186 = add(globalint_1186, 2); + } + ivar0 = multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()); + ivar1 = multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41); + if (((boolean)ivar8)) { + globalint_1270 = ivar0; + } + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,67), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,67), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)) + "%"); + if (divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100); + } + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32), ivar33), ivar34)) { + setWidgetIsHidden(true, new WidgetPointer(933,53)); + setWidgetIsHidden(false, new WidgetPointer(933,37)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32), ivar33)), 1), ivar34, 100); + if (((boolean)ivar8)) { + globalint_1270 = 0; + } + if (globalint_1321 > 0) { + setWidgetIsHidden(false, new WidgetPointer(933,84)); + if (((boolean)ivar8)) { + playSoundEffect(8802, 1, 0); + } + setWidgetText(new WidgetPointer(933,94), "Unbalanced party penalty: x" + intToStr(divide(add(subtract(10000, globalint_1321), 50), 100)) + "%"); + if (divide(add(subtract(10000, globalint_1321), 50), 100) != globalint_1270) { + playSoundEffect(8806, 1, 0); + globalint_1270 = divide(add(subtract(10000, globalint_1321), 50), 100); + } + } else { + globalint_1186 = add(globalint_1186, 2); + } + ivar0 = multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41); + ivar1 = multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41), 10000, subtract(10000, globalint_1321)); + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)) + "%"); + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + } else if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32), ivar33), ivar34), ivar35)) { + setWidgetIsHidden(true, new WidgetPointer(933,13)); + setWidgetIsHidden(true, new WidgetPointer(933,16)); + setWidgetIsHidden(true, new WidgetPointer(933,14)); + setWidgetIsHidden(true, new WidgetPointer(933,15)); + setWidgetText(new WidgetPointer(933,39), intToStr(globalint_1239)); + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32), ivar33), ivar34)), 1), ivar35, 100); + ivar0 = globalint_1239; + ivar1 = multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41), 10000, subtract(10000, globalint_1321)), 10000, globalint_1239); + if (((boolean)ivar8)) { + globalint_1270 = ivar0; + } + if (((boolean)mod(ivar8, 5)) && (getWidgetActualY(new WidgetPointer(933,84)) != 138)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(933,84)), add(getWidgetActualY(new WidgetPointer(933,84)), 1), 0, 0, new WidgetPointer(933,84)); + } + setWidgetSize(183, multiplyDivide(80, 100, ivar8), 0, 0, new WidgetPointer(933,111)); + setWidgetText(new WidgetPointer(933,39), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 5), 10)) + "%"); + if (divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 5), 10) != globalint_1270) { + playSoundEffect(9243, 1, 0); + globalint_1270 = divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 5), 10); + } + } else { + if (globalint_1186 < add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32), ivar33), ivar34), ivar35), ivar36)) { + ivar8 = multiplyDivide(add(subtract(globalint_1186, add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32), ivar33), ivar34), ivar35)), 1), ivar36, 100); + ivar0 = globalint_1239; + ivar1 = multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41), 10000, subtract(10000, globalint_1321)), 10000, globalint_1239); + if (((boolean)ivar8)) { + globalint_1270 = ivar0; + } + if (standart_config_1780 < 2000000000) { + setWidgetText(new WidgetPointer(933,41), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 5), 100)) + "%"); + if (divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 5), 100) != globalint_1270) { + playSoundEffect(8800, 1, 0); + globalint_1270 = divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 5), 100); + } + } else { + setWidgetText(new WidgetPointer(933,41), "n/a"); + } + } + } + globalint_1186 = min(add(script_3265(), add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(ivar9, ivar10), ivar11), ivar12), ivar13), ivar14), ivar15), ivar16), ivar17), ivar18), ivar19), ivar20), ivar21), ivar22), ivar23), ivar24), ivar25), ivar26), ivar27), ivar28), ivar29), ivar30), ivar31), ivar32), ivar33), ivar34), ivar35), ivar36)), add(globalint_1186, 1)); + } + script_3268(); + return; +} diff --git a/dumps/scripts/3268.cs2 b/dumps/scripts/3268.cs2 new file mode 100644 index 000000000..eb7ea7b2b --- /dev/null +++ b/dumps/scripts/3268.cs2 @@ -0,0 +1,342 @@ +void script_3268() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + cs2func_script_3269_struct(4,0,0) structdump_4; + ivar0 = 1; + ivar1 = 18; + ivar2 = 255; + ivar3 = add(add(add(add(globalint_1198, globalint_1199), globalint_1200), globalint_1201), globalint_1202); + ivar4 = subtract(ivar2, multiply(ivar3, ivar1)); + ivar4 = min(ivar4, 105); + ivar5 = 4; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + stack_dump0 = globalint_1184; + stack_dump1 = ivar5; + stack_dump2 = ivar1; + stack_dump3 = ivar4; + structdump_4 = script_3269(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar9 = structdump_4.intpart_3; + ivar8 = structdump_4.intpart_2; + ivar7 = structdump_4.intpart_1; + ivar6 = structdump_4.intpart_0; + switch (globalint_1184) { + case 0: + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,265)), ivar5), 0, 0, new WidgetPointer(933,265)); + if (((boolean)globalint_1198)) { + setWidgetIsHidden(false, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,317)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,266)), ivar6), 0, 0, new WidgetPointer(933,266)); + if (((boolean)globalint_1199)) { + setWidgetIsHidden(false, new WidgetPointer(933,266)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,275)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,266)); + setWidgetIsHidden(true, new WidgetPointer(933,316)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,276)), ivar7), 0, 0, new WidgetPointer(933,276)); + if (((boolean)globalint_1200)) { + setWidgetIsHidden(false, new WidgetPointer(933,276)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,285)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,276)); + setWidgetIsHidden(true, new WidgetPointer(933,274)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,286)), ivar8), 0, 0, new WidgetPointer(933,286)); + if (((boolean)globalint_1201)) { + setWidgetIsHidden(false, new WidgetPointer(933,286)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,295)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,286)); + setWidgetIsHidden(true, new WidgetPointer(933,284)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,296)), ivar9), 0, 0, new WidgetPointer(933,296)); + if (((boolean)globalint_1202)) { + setWidgetIsHidden(false, new WidgetPointer(933,296)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,308)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,296)); + setWidgetIsHidden(true, new WidgetPointer(933,294)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), ""); + } + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,265)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,266)), getWidgetActualY(new WidgetPointer(933,265))), 5)), 2, 0, new WidgetPointer(933,265)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,266)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,276)), getWidgetActualY(new WidgetPointer(933,266))), 5)), 2, 0, new WidgetPointer(933,266)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,276)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,286)), getWidgetActualY(new WidgetPointer(933,276))), 5)), 2, 0, new WidgetPointer(933,276)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,286)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,296)), getWidgetActualY(new WidgetPointer(933,286))), 5)), 2, 0, new WidgetPointer(933,286)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,296)), subtract(subtract(ivar2, getWidgetActualY(new WidgetPointer(933,296))), 5)), 2, 0, new WidgetPointer(933,296)); + break; + case 1: + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,265)), ivar5), 0, 0, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), "Shrink"); + setWidgetSprite(2852, new WidgetPointer(933,317)); + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,266)), ivar6), 0, 0, new WidgetPointer(933,266)); + if (((boolean)globalint_1199)) { + setWidgetIsHidden(false, new WidgetPointer(933,266)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,275)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,266)); + setWidgetIsHidden(true, new WidgetPointer(933,316)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,276)), ivar7), 0, 0, new WidgetPointer(933,276)); + if (((boolean)globalint_1200)) { + setWidgetIsHidden(false, new WidgetPointer(933,276)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,285)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,276)); + setWidgetIsHidden(true, new WidgetPointer(933,274)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,286)), ivar8), 0, 0, new WidgetPointer(933,286)); + if (((boolean)globalint_1201)) { + setWidgetIsHidden(false, new WidgetPointer(933,286)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,295)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,286)); + setWidgetIsHidden(true, new WidgetPointer(933,284)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,296)), ivar9), 0, 0, new WidgetPointer(933,296)); + if (((boolean)globalint_1202)) { + setWidgetIsHidden(false, new WidgetPointer(933,296)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,308)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,296)); + setWidgetIsHidden(true, new WidgetPointer(933,294)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), ""); + } + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,265)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,266)), getWidgetActualY(new WidgetPointer(933,265))), 2)), 2, 0, new WidgetPointer(933,265)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,266)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,276)), getWidgetActualY(new WidgetPointer(933,266))), 2)), 2, 0, new WidgetPointer(933,266)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,276)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,286)), getWidgetActualY(new WidgetPointer(933,276))), 2)), 2, 0, new WidgetPointer(933,276)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,286)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,296)), getWidgetActualY(new WidgetPointer(933,286))), 2)), 2, 0, new WidgetPointer(933,286)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,296)), subtract(subtract(ivar2, getWidgetActualY(new WidgetPointer(933,296))), 2)), 2, 0, new WidgetPointer(933,296)); + break; + case 2: + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,265)), ivar5), 0, 0, new WidgetPointer(933,265)); + if (((boolean)globalint_1198)) { + setWidgetIsHidden(false, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,317)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,266)), ivar6), 0, 0, new WidgetPointer(933,266)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), "Shrink"); + setWidgetSprite(2852, new WidgetPointer(933,275)); + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,276)), ivar7), 0, 0, new WidgetPointer(933,276)); + if (((boolean)globalint_1200)) { + setWidgetIsHidden(false, new WidgetPointer(933,276)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,285)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,276)); + setWidgetIsHidden(true, new WidgetPointer(933,274)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,286)), ivar8), 0, 0, new WidgetPointer(933,286)); + if (((boolean)globalint_1201)) { + setWidgetIsHidden(false, new WidgetPointer(933,286)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,295)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,286)); + setWidgetIsHidden(true, new WidgetPointer(933,284)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,296)), ivar9), 0, 0, new WidgetPointer(933,296)); + if (((boolean)globalint_1202)) { + setWidgetIsHidden(false, new WidgetPointer(933,296)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,308)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,296)); + setWidgetIsHidden(true, new WidgetPointer(933,294)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), ""); + } + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,265)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,266)), getWidgetActualY(new WidgetPointer(933,265))), 2)), 2, 0, new WidgetPointer(933,265)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,266)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,276)), getWidgetActualY(new WidgetPointer(933,266))), 2)), 2, 0, new WidgetPointer(933,266)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,276)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,286)), getWidgetActualY(new WidgetPointer(933,276))), 2)), 2, 0, new WidgetPointer(933,276)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,286)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,296)), getWidgetActualY(new WidgetPointer(933,286))), 2)), 2, 0, new WidgetPointer(933,286)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,296)), subtract(subtract(ivar2, getWidgetActualY(new WidgetPointer(933,296))), 2)), 2, 0, new WidgetPointer(933,296)); + break; + case 3: + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,265)), ivar5), 0, 0, new WidgetPointer(933,265)); + if (((boolean)globalint_1198)) { + setWidgetIsHidden(false, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,317)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,266)), ivar6), 0, 0, new WidgetPointer(933,266)); + if (((boolean)globalint_1199)) { + setWidgetIsHidden(false, new WidgetPointer(933,266)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,275)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,266)); + setWidgetIsHidden(true, new WidgetPointer(933,316)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,276)), ivar7), 0, 0, new WidgetPointer(933,276)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), "Shrink"); + setWidgetSprite(2852, new WidgetPointer(933,285)); + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,286)), ivar8), 0, 0, new WidgetPointer(933,286)); + if (((boolean)globalint_1201)) { + setWidgetIsHidden(false, new WidgetPointer(933,286)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,295)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,286)); + setWidgetIsHidden(true, new WidgetPointer(933,284)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,296)), ivar9), 0, 0, new WidgetPointer(933,296)); + if (((boolean)globalint_1202)) { + setWidgetIsHidden(false, new WidgetPointer(933,296)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,308)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,296)); + setWidgetIsHidden(true, new WidgetPointer(933,294)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), ""); + } + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,265)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,266)), getWidgetActualY(new WidgetPointer(933,265))), 2)), 2, 0, new WidgetPointer(933,265)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,266)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,276)), getWidgetActualY(new WidgetPointer(933,266))), 2)), 2, 0, new WidgetPointer(933,266)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,276)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,286)), getWidgetActualY(new WidgetPointer(933,276))), 2)), 2, 0, new WidgetPointer(933,276)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,286)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,296)), getWidgetActualY(new WidgetPointer(933,286))), 2)), 2, 0, new WidgetPointer(933,286)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,296)), subtract(subtract(ivar2, getWidgetActualY(new WidgetPointer(933,296))), 2)), 2, 0, new WidgetPointer(933,296)); + break; + case 4: + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,265)), ivar5), 0, 0, new WidgetPointer(933,265)); + if (((boolean)globalint_1198)) { + setWidgetIsHidden(false, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,317)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,266)), ivar6), 0, 0, new WidgetPointer(933,266)); + if (((boolean)globalint_1199)) { + setWidgetIsHidden(false, new WidgetPointer(933,266)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,275)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,266)); + setWidgetIsHidden(true, new WidgetPointer(933,316)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,276)), ivar7), 0, 0, new WidgetPointer(933,276)); + if (((boolean)globalint_1200)) { + setWidgetIsHidden(false, new WidgetPointer(933,276)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,285)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,276)); + setWidgetIsHidden(true, new WidgetPointer(933,274)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,286)), ivar8), 0, 0, new WidgetPointer(933,286)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), "Shrink"); + setWidgetSprite(2852, new WidgetPointer(933,295)); + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,296)), ivar9), 0, 0, new WidgetPointer(933,296)); + if (((boolean)globalint_1202)) { + setWidgetIsHidden(false, new WidgetPointer(933,296)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,308)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,296)); + setWidgetIsHidden(true, new WidgetPointer(933,294)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), ""); + } + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,265)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,266)), getWidgetActualY(new WidgetPointer(933,265))), 2)), 2, 0, new WidgetPointer(933,265)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,266)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,276)), getWidgetActualY(new WidgetPointer(933,266))), 2)), 2, 0, new WidgetPointer(933,266)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,276)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,286)), getWidgetActualY(new WidgetPointer(933,276))), 2)), 2, 0, new WidgetPointer(933,276)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,286)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,296)), getWidgetActualY(new WidgetPointer(933,286))), 2)), 2, 0, new WidgetPointer(933,286)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,296)), subtract(subtract(ivar2, getWidgetActualY(new WidgetPointer(933,296))), 2)), 2, 0, new WidgetPointer(933,296)); + break; + case 5: + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,265)), ivar5), 0, 0, new WidgetPointer(933,265)); + if (((boolean)globalint_1198)) { + setWidgetIsHidden(false, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,317)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,265)); + setWidgetContextMenuOption(1, new WidgetPointer(933,265), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,266)), ivar6), 0, 0, new WidgetPointer(933,266)); + if (((boolean)globalint_1199)) { + setWidgetIsHidden(false, new WidgetPointer(933,266)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,275)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,266)); + setWidgetIsHidden(true, new WidgetPointer(933,316)); + setWidgetContextMenuOption(1, new WidgetPointer(933,266), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,276)), ivar7), 0, 0, new WidgetPointer(933,276)); + if (((boolean)globalint_1200)) { + setWidgetIsHidden(false, new WidgetPointer(933,276)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,285)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,276)); + setWidgetIsHidden(true, new WidgetPointer(933,274)); + setWidgetContextMenuOption(1, new WidgetPointer(933,276), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,286)), ivar8), 0, 0, new WidgetPointer(933,286)); + if (((boolean)globalint_1201)) { + setWidgetIsHidden(false, new WidgetPointer(933,286)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), "Expand"); + setWidgetSprite(2851, new WidgetPointer(933,295)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,286)); + setWidgetIsHidden(true, new WidgetPointer(933,284)); + setWidgetContextMenuOption(1, new WidgetPointer(933,286), ""); + } + setWidgetPosition(ivar0, script_3270(getWidgetActualY(new WidgetPointer(933,296)), ivar9), 0, 0, new WidgetPointer(933,296)); + setWidgetContextMenuOption(1, new WidgetPointer(933,296), "Shrink"); + setWidgetSprite(2852, new WidgetPointer(933,308)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,265)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,266)), getWidgetActualY(new WidgetPointer(933,265))), 2)), 2, 0, new WidgetPointer(933,265)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,266)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,276)), getWidgetActualY(new WidgetPointer(933,266))), 2)), 2, 0, new WidgetPointer(933,266)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,276)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,286)), getWidgetActualY(new WidgetPointer(933,276))), 2)), 2, 0, new WidgetPointer(933,276)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,286)), subtract(subtract(getWidgetActualY(new WidgetPointer(933,296)), getWidgetActualY(new WidgetPointer(933,286))), 2)), 2, 0, new WidgetPointer(933,286)); + setWidgetSize(16384, script_3270(getWidgetActualHeight(new WidgetPointer(933,296)), subtract(subtract(ivar2, getWidgetActualY(new WidgetPointer(933,296))), 2)), 2, 0, new WidgetPointer(933,296)); + } + script_3271(); + return; +} diff --git a/dumps/scripts/3269.cs2 b/dumps/scripts/3269.cs2 new file mode 100644 index 000000000..dacc1fff8 --- /dev/null +++ b/dumps/scripts/3269.cs2 @@ -0,0 +1,47 @@ +cs2func_script_3269_struct(4,0,0) script_3269(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + if (((boolean)arg0)) { + arg2 = 48; + arg3 = 48; + } + ivar4 = arg1; + if (((boolean)globalint_1198)) { + ivar4 = add(ivar4, 2); + if (((boolean)arg0)) { + ivar4 = add(ivar4, arg3); + } else { + ivar4 = add(ivar4, arg2); + } + } + ivar5 = ivar4; + if (((boolean)globalint_1199)) { + ivar5 = add(ivar5, 2); + if (arg0 == 2) { + ivar5 = add(ivar5, arg3); + } else { + ivar5 = add(ivar5, arg2); + } + } + ivar6 = ivar5; + if (((boolean)globalint_1200)) { + ivar6 = add(ivar6, 2); + if (arg0 == 3) { + ivar6 = add(ivar6, arg3); + } else { + ivar6 = add(ivar6, arg2); + } + } + ivar7 = ivar6; + if (((boolean)globalint_1201)) { + ivar7 = add(ivar7, 2); + if (arg0 == 4) { + ivar7 = add(ivar7, arg3); + } else { + ivar7 = add(ivar7, arg2); + } + } + return newstruct cs2func_script_3269_struct(ivar4, ivar5, ivar6, ivar7); +} diff --git a/dumps/scripts/327.cs2 b/dumps/scripts/327.cs2 new file mode 100644 index 000000000..bfc5a61be --- /dev/null +++ b/dumps/scripts/327.cs2 @@ -0,0 +1,6 @@ +void script_327(int arg0) { + globalint_783 = 0; + setWidgetModel(-1, new WidgetPointer(725,83)); + script_328(arg0); + return; +} diff --git a/dumps/scripts/3270.cs2 b/dumps/scripts/3270.cs2 new file mode 100644 index 000000000..79fb3b3ae --- /dev/null +++ b/dumps/scripts/3270.cs2 @@ -0,0 +1,11 @@ +int script_3270(int arg0,int arg1) { + int ivar2; + ivar2 = 2; + if (add(arg0, subtract(ivar2, 1)) < arg1) { + return add(arg0, ivar2); + } + if (subtract(arg0, subtract(ivar2, 1)) > arg1) { + return subtract(arg0, ivar2); + } + return arg1; +} diff --git a/dumps/scripts/3271.cs2 b/dumps/scripts/3271.cs2 new file mode 100644 index 000000000..c264dc996 --- /dev/null +++ b/dumps/scripts/3271.cs2 @@ -0,0 +1,16 @@ +void script_3271() { + if (((boolean)globalint_1202)) { + setWidgetSize(16384, subtract(getWidgetActualHeight(new WidgetPointer(933,296)), 1), 2, 0, new WidgetPointer(933,296)); + } else if (((boolean)globalint_1201)) { + setWidgetSize(16384, subtract(getWidgetActualHeight(new WidgetPointer(933,286)), 1), 2, 0, new WidgetPointer(933,286)); + } else if (((boolean)globalint_1200)) { + setWidgetSize(16384, subtract(getWidgetActualHeight(new WidgetPointer(933,276)), 1), 2, 0, new WidgetPointer(933,276)); + } else if (((boolean)globalint_1199)) { + setWidgetSize(16384, subtract(getWidgetActualHeight(new WidgetPointer(933,266)), 1), 2, 0, new WidgetPointer(933,266)); + } else { + if (((boolean)globalint_1198)) { + setWidgetSize(16384, subtract(getWidgetActualHeight(new WidgetPointer(933,265)), 1), 2, 0, new WidgetPointer(933,265)); + } + } + return; +} diff --git a/dumps/scripts/3272.cs2 b/dumps/scripts/3272.cs2 new file mode 100644 index 000000000..146ddb8e8 --- /dev/null +++ b/dumps/scripts/3272.cs2 @@ -0,0 +1,39 @@ +void script_3272(int arg0) { + switch (arg0) { + case 61145353: + if ((globalint_1184 != 1) && ((boolean)globalint_1198)) { + globalint_1184 = 1; + } else { + globalint_1184 = 0; + } + break; + case 61145354: + if ((globalint_1184 != 2) && ((boolean)globalint_1199)) { + globalint_1184 = 2; + } else { + globalint_1184 = 0; + } + break; + case 61145364: + if ((globalint_1184 != 3) && ((boolean)globalint_1200)) { + globalint_1184 = 3; + } else { + globalint_1184 = 0; + } + break; + case 61145374: + if ((globalint_1184 != 4) && ((boolean)globalint_1201)) { + globalint_1184 = 4; + } else { + globalint_1184 = 0; + } + break; + case 61145384: + if ((globalint_1184 != 5) && ((boolean)globalint_1202)) { + globalint_1184 = 5; + } else { + globalint_1184 = 0; + } + } + return; +} diff --git a/dumps/scripts/3273.cs2 b/dumps/scripts/3273.cs2 new file mode 100644 index 000000000..8bccf0d1b --- /dev/null +++ b/dumps/scripts/3273.cs2 @@ -0,0 +1,82 @@ +cs2func_script_3273_struct(3,0,0) script_3273() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = divide(globalint_1191, 10); + ivar2 = subtract(globalint_1191, multiply(divide(globalint_1191, 10), 10)); + switch (ivar1) { + flow_1: + case 1: + switch (ivar2) { + case 1: + ivar0 = 0; + } + break; + case 2: + switch (ivar2) { + case 1: + ivar0 = -760; + break; + case 2: + ivar0 = 507; + } + break; + case 3: + switch (ivar2) { + case 1: + ivar0 = -1520; + break; + case 2: + ivar0 = 190; + break; + case 3: + ivar0 = 950; + } + break; + case 4: + switch (ivar2) { + case 1: + ivar0 = -2280; + break; + case 2: + ivar0 = -760; + break; + case 3: + ivar0 = 633; + break; + case 4: + ivar0 = 1457; + } + break; + case 5: + SWITCH (ivar2) { + case 1: + GOTO flow_20 + case 2: + GOTO flow_21 + case 3: + GOTO flow_22 + case 4: + GOTO flow_23 + case 5: + GOTO flow_24 + } + break; + flow_20: + ivar0 = -3040; + break; + flow_21: + ivar0 = -1267; + break; + flow_22: + ivar0 = 380; + break; + flow_23: + ivar0 = 1140; + break; + flow_24: + ivar0 = 1900; + } + return newstruct cs2func_script_3273_struct(ivar1, ivar2, ivar0); +} diff --git a/dumps/scripts/3274.cs2 b/dumps/scripts/3274.cs2 new file mode 100644 index 000000000..ec6151090 --- /dev/null +++ b/dumps/scripts/3274.cs2 @@ -0,0 +1,15 @@ +int script_3274() { + switch (globalint_1320) { + case 1: + return 5000; + case 2: + return 5500; + case 3: + return 6000; + case 4: + return 6500; + case 5: + return 7000; + } + return 10000; +} diff --git a/dumps/scripts/3275.cs2 b/dumps/scripts/3275.cs2 new file mode 100644 index 000000000..c46cd0f34 --- /dev/null +++ b/dumps/scripts/3275.cs2 @@ -0,0 +1,12 @@ +int script_3275() { + if (((boolean)globalint_1196)) { + switch (globalint_1188) { + case 3: + return 9500; + case 2: + return 9500; + } + return 9500; + } + return 10000; +} diff --git a/dumps/scripts/3276.cs2 b/dumps/scripts/3276.cs2 new file mode 100644 index 000000000..1a5b00564 --- /dev/null +++ b/dumps/scripts/3276.cs2 @@ -0,0 +1,473 @@ +void script_3276() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + int ivar37; + int ivar38; + int ivar39; + int ivar40; + int ivar41; + cs2func_script_3273_struct(3,0,0) structdump_0; + cs2func_script_3273_struct(3,0,0) structdump_1; + cs2func_script_3273_struct(3,0,0) structdump_2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 100; + ivar9 = 25; + ivar10 = 25; + ivar11 = 50; + ivar12 = 25; + ivar13 = 25; + ivar14 = 50; + ivar15 = 25; + ivar16 = 25; + ivar17 = 50; + ivar18 = 100; + ivar19 = 50; + ivar20 = 25; + ivar21 = 150; + ivar22 = 25; + ivar23 = 100; + ivar24 = 25; + ivar25 = 100; + ivar26 = 25; + ivar27 = 50; + ivar28 = 25; + ivar29 = 50; + ivar30 = 25; + ivar31 = 25; + ivar32 = 25; + ivar33 = 150; + ivar34 = 100; + ivar35 = 200; + ivar36 = 100; + globalint_1186 = 2000; + globalint_1185 = max(subtract(globalint_1185, 2), 0); + cs2method2103(globalint_1185, new WidgetPointer(933,251)); + cs2method2103(0, new WidgetPointer(933,297)); + cs2method2103(0, new WidgetPointer(933,298)); + cs2method2103(0, new WidgetPointer(933,299)); + ivar37 = 0; + if (globalint_1188 == 2) { + ivar37 = 792; + } else { + if (globalint_1188 == 3) { + ivar37 = 1583; + } + } + ivar38 = multiplyDivide(globalint_1195, 10000, 1267); + structdump_0 = script_3273(); + ivar5 = structdump_0.intpart_2; + ivar4 = structdump_0.intpart_1; + ivar3 = structdump_0.intpart_0; + ivar39 = ivar5; + ivar40 = script_3274(); + ivar41 = subtract(10000, multiply(min(bitconfig_7554, 6), 1000)); + setWidgetIsHidden(false, new WidgetPointer(933,192)); + setWidgetIsHidden(false, new WidgetPointer(933,17)); + setWidgetIsHidden(false, new WidgetPointer(933,187)); + setWidgetIsHidden(false, new WidgetPointer(933,240)); + if (globalint_1187 < globalint_1319) { + setWidgetText(new WidgetPointer(933,240), "Floor " + intToStr(globalint_1187) + ":"); + setWidgetRGB(new Color(160, 0, 0), new WidgetPointer(933,240)); + } else { + setWidgetText(new WidgetPointer(933,240), "Floor " + intToStr(globalint_1319) + ":"); + } + setWidgetIsHidden(false, new WidgetPointer(933,22)); + setWidgetSize(add(getWidgetActualWidth(new WidgetPointer(933,23)), 5), add(getWidgetActualHeight(new WidgetPointer(933,23)), 5), 0, 0, new WidgetPointer(933,23)); + playSoundEffect(8802, 1, 0); + cs2method2103(min(255, add(getWidgetShadeColor(new WidgetPointer(933,23)), 30)), new WidgetPointer(933,23)); + setWidgetIsHidden(false, new WidgetPointer(933,241)); + setWidgetText(new WidgetPointer(933,241), intToStr(multiplyDivide(divide(add(globalint_1237, 5), 10), 100, ivar8))); + setWidgetIsHidden(false, new WidgetPointer(933,190)); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,190)); + setWidgetIsHidden(false, new WidgetPointer(933,188)); + setWidgetIsHidden(false, new WidgetPointer(933,227)); + if (isMember()) { + setWidgetText(new WidgetPointer(933,227), "Prestige " + intToStr(min(60, max(bitconfig_7550, bitconfig_7551)))); + } else { + setWidgetText(new WidgetPointer(933,227), "Prestige " + intToStr(min(35, max(bitconfig_7550, bitconfig_7551)))); + } + setWidgetIsHidden(false, new WidgetPointer(933,21)); + setWidgetSize(add(getWidgetActualWidth(new WidgetPointer(933,24)), 5), add(getWidgetActualHeight(new WidgetPointer(933,24)), 5), 0, 0, new WidgetPointer(933,24)); + cs2method2103(255, new WidgetPointer(933,24)); + setWidgetIsHidden(false, new WidgetPointer(933,228)); + setWidgetText(new WidgetPointer(933,228), intToStr(multiplyDivide(divide(add(globalint_1238, 5), 10), 100, ivar8))); + setWidgetIsHidden(false, new WidgetPointer(933,191)); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,191)); + setWidgetIsHidden(false, new WidgetPointer(933,189)); + setWidgetIsHidden(false, new WidgetPointer(933,214)); + setWidgetIsHidden(false, new WidgetPointer(933,20)); + setWidgetSize(add(getWidgetActualWidth(new WidgetPointer(933,25)), 5), add(getWidgetActualHeight(new WidgetPointer(933,25)), 5), 0, 0, new WidgetPointer(933,25)); + cs2method2103(0, new WidgetPointer(933,25)); + setWidgetIsHidden(false, new WidgetPointer(933,215)); + setWidgetText(new WidgetPointer(933,215), intToStr(multiplyDivide(divide(add(globalint_1239, 5), 10), 100, ivar8))); + setWidgetIsHidden(true, new WidgetPointer(933,186)); + setWidgetIsHidden(false, new WidgetPointer(933,19)); + setWidgetText(new WidgetPointer(933,39), intToStr(multiplyDivide(divide(add(globalint_1239, 5), 10), 100, ivar8))); + cs2method2103(255, new WidgetPointer(933,37)); + setWidgetIsHidden(false, new WidgetPointer(933,83)); + setWidgetIsHidden(false, new WidgetPointer(933,18)); + setWidgetIsHidden(false, new WidgetPointer(933,53)); + setWidgetIsHidden(false, new WidgetPointer(933,54)); + setWidgetIsHidden(false, new WidgetPointer(933,68)); + setWidgetIsHidden(false, new WidgetPointer(933,69)); + setWidgetIsHidden(false, new WidgetPointer(933,70)); + setWidgetIsHidden(false, new WidgetPointer(933,71)); + setWidgetIsHidden(false, new WidgetPointer(933,72)); + setWidgetIsHidden(false, new WidgetPointer(933,73)); + setWidgetIsHidden(false, new WidgetPointer(933,74)); + structdump_1 = script_3273(); + ivar5 = structdump_1.intpart_2; + ivar4 = structdump_1.intpart_1; + ivar3 = structdump_1.intpart_0; + if (globalint_1188 <= 1) { + cs2method2103(0, new WidgetPointer(933,68)); + setWidgetText(new WidgetPointer(933,74), "+0%"); + } else if (globalint_1188 == 2) { + cs2method2103(0, new WidgetPointer(933,69)); + setWidgetText(new WidgetPointer(933,74), "+" + intToStr(divide(792, 100)) + "%"); + } else { + if (globalint_1188 > 2) { + cs2method2103(0, new WidgetPointer(933,70)); + setWidgetText(new WidgetPointer(933,74), "+" + intToStr(divide(1583, 100)) + "%"); + } + } + setWidgetIsHidden(false, new WidgetPointer(933,55)); + setWidgetIsHidden(false, new WidgetPointer(933,64)); + setWidgetIsHidden(false, new WidgetPointer(933,75)); + setWidgetSize(multiplyDivide(multiplyDivide(globalint_1195, 10000, 16384), 100, ivar8), 16384, 2, 2, new WidgetPointer(933,172)); + ivar0 = add(10000, ivar37); + ivar1 = add(add(10000, ivar37), ivar38); + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,75), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,75), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)) + "%"); + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + setWidgetIsHidden(false, new WidgetPointer(933,56)); + setWidgetIsHidden(false, new WidgetPointer(933,57)); + setWidgetIsHidden(false, new WidgetPointer(933,78)); + setWidgetIsHidden(false, new WidgetPointer(933,80)); + setWidgetIsHidden(false, new WidgetPointer(933,59)); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,78)); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,80)); + structdump_2 = script_3273(); + ivar5 = structdump_2.intpart_2; + ivar4 = structdump_2.intpart_1; + ivar3 = structdump_2.intpart_0; + setWidgetText(new WidgetPointer(933,57), intToStr(ivar3) + " : " + intToStr(ivar4)); + ivar0 = add(add(10000, ivar37), ivar38); + ivar1 = add(add(add(10000, ivar37), ivar38), ivar39); + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,59), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,59), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetIsHidden(false, new WidgetPointer(933,61)); + setWidgetIsHidden(false, new WidgetPointer(933,76)); + ivar0 = add(add(add(10000, ivar37), ivar38), ivar39); + ivar1 = add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236); + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,76), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,76), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetIsHidden(false, new WidgetPointer(933,62)); + setWidgetIsHidden(false, new WidgetPointer(933,58)); + setWidgetIsHidden(false, new WidgetPointer(933,79)); + setWidgetIsHidden(false, new WidgetPointer(933,81)); + setWidgetIsHidden(false, new WidgetPointer(933,60)); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,79)); + cs2method2103(subtract(255, divide(multiply(ivar8, 255), 100)), new WidgetPointer(933,81)); + setWidgetText(new WidgetPointer(933,58), intToStr(multiplyDivide(globalint_1320, 100, ivar8))); + ivar0 = add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236); + ivar1 = multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40); + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,60), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,60), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetIsHidden(false, new WidgetPointer(933,63)); + setWidgetIsHidden(false, new WidgetPointer(933,77)); + ivar0 = multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40); + ivar1 = multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()); + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,77), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,77), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetIsHidden(false, new WidgetPointer(933,65)); + setWidgetIsHidden(false, new WidgetPointer(933,66)); + setWidgetIsHidden(false, new WidgetPointer(933,67)); + if (bitconfig_7554 != 0) { + switch (bitconfig_7554) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetSprite(2849, new WidgetPointer(933,146)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetSprite(2850, new WidgetPointer(933,146)); + setWidgetSprite(2849, new WidgetPointer(933,147)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetSprite(2850, new WidgetPointer(933,147)); + setWidgetSprite(2849, new WidgetPointer(933,148)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetSprite(2850, new WidgetPointer(933,148)); + setWidgetSprite(2849, new WidgetPointer(933,149)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetSprite(2850, new WidgetPointer(933,149)); + setWidgetSprite(2849, new WidgetPointer(933,150)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetSprite(2850, new WidgetPointer(933,150)); + setWidgetSprite(2849, new WidgetPointer(933,151)); + break; + case 7: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetSprite(2850, new WidgetPointer(933,151)); + setWidgetSprite(2849, new WidgetPointer(933,152)); + break; + case 8: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetSprite(2850, new WidgetPointer(933,152)); + setWidgetSprite(2849, new WidgetPointer(933,153)); + break; + case 9: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetSprite(2850, new WidgetPointer(933,153)); + setWidgetSprite(2849, new WidgetPointer(933,154)); + break; + case 10: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetSprite(2850, new WidgetPointer(933,154)); + setWidgetSprite(2849, new WidgetPointer(933,155)); + break; + case 11: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetSprite(2850, new WidgetPointer(933,155)); + setWidgetSprite(2849, new WidgetPointer(933,156)); + break; + case 12: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetIsHidden(false, new WidgetPointer(933,157)); + setWidgetSprite(2850, new WidgetPointer(933,156)); + setWidgetSprite(2849, new WidgetPointer(933,157)); + break; + case 13: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetIsHidden(false, new WidgetPointer(933,157)); + setWidgetIsHidden(false, new WidgetPointer(933,158)); + setWidgetSprite(2850, new WidgetPointer(933,157)); + setWidgetSprite(2849, new WidgetPointer(933,158)); + break; + case 14: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetIsHidden(false, new WidgetPointer(933,157)); + setWidgetIsHidden(false, new WidgetPointer(933,158)); + setWidgetIsHidden(false, new WidgetPointer(933,159)); + setWidgetSprite(2850, new WidgetPointer(933,158)); + setWidgetSprite(2849, new WidgetPointer(933,159)); + break; + case 15: + setWidgetIsHidden(false, new WidgetPointer(933,146)); + setWidgetIsHidden(false, new WidgetPointer(933,147)); + setWidgetIsHidden(false, new WidgetPointer(933,148)); + setWidgetIsHidden(false, new WidgetPointer(933,149)); + setWidgetIsHidden(false, new WidgetPointer(933,150)); + setWidgetIsHidden(false, new WidgetPointer(933,151)); + setWidgetIsHidden(false, new WidgetPointer(933,152)); + setWidgetIsHidden(false, new WidgetPointer(933,153)); + setWidgetIsHidden(false, new WidgetPointer(933,154)); + setWidgetIsHidden(false, new WidgetPointer(933,155)); + setWidgetIsHidden(false, new WidgetPointer(933,156)); + setWidgetIsHidden(false, new WidgetPointer(933,157)); + setWidgetIsHidden(false, new WidgetPointer(933,158)); + setWidgetIsHidden(false, new WidgetPointer(933,159)); + setWidgetIsHidden(false, new WidgetPointer(933,160)); + setWidgetSprite(2850, new WidgetPointer(933,159)); + setWidgetSprite(2849, new WidgetPointer(933,160)); + } + } else { + setWidgetText(new WidgetPointer(933,67), "n/a"); + globalint_1186 = add(globalint_1186, 2); + } + ivar0 = multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()); + ivar1 = multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41); + if (ivar1 >= ivar0) { + setWidgetText(new WidgetPointer(933,67), "+" + intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,67), intToStr(divide(add(multiplyDivide(ivar8, 100, subtract(ivar1, ivar0)), 50), 100)) + "%"); + } + setWidgetIsHidden(true, new WidgetPointer(933,53)); + if (globalint_1321 > 0) { + setWidgetIsHidden(false, new WidgetPointer(933,84)); + setWidgetText(new WidgetPointer(933,94), "Unbalanced party penalty: x" + intToStr(divide(add(subtract(10000, globalint_1321), 50), 100)) + "%"); + } + ivar0 = multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41); + ivar1 = multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41), 10000, subtract(10000, globalint_1321)); + setWidgetText(new WidgetPointer(933,96), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)) + "%"); + setWidgetSize(multiplyDivide(8192, 100, divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 50), 100)), 16384, 2, 2, new WidgetPointer(933,112)); + setWidgetIsHidden(true, new WidgetPointer(933,13)); + setWidgetIsHidden(true, new WidgetPointer(933,16)); + setWidgetIsHidden(true, new WidgetPointer(933,14)); + setWidgetIsHidden(true, new WidgetPointer(933,15)); + setWidgetText(new WidgetPointer(933,39), intToStr(globalint_1239)); + ivar0 = globalint_1239; + ivar1 = multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41), 10000, subtract(10000, globalint_1321)), 10000, globalint_1239); + if (((boolean)mod(ivar8, 5)) && (getWidgetActualY(new WidgetPointer(933,84)) != 138)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(933,84)), add(getWidgetActualY(new WidgetPointer(933,84)), 1), 0, 0, new WidgetPointer(933,84)); + } + setWidgetSize(183, multiplyDivide(80, 100, ivar8), 0, 0, new WidgetPointer(933,111)); + setWidgetText(new WidgetPointer(933,39), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 5), 10)) + "%"); + ivar0 = globalint_1239; + ivar1 = multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(multiplyDivide(add(add(add(add(10000, ivar37), ivar38), ivar39), globalint_1236), 10000, ivar40), 10000, script_3275()), 10000, ivar41), 10000, subtract(10000, globalint_1321)), 10000, globalint_1239); + setWidgetText(new WidgetPointer(933,41), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 5), 100)) + "%"); + setWidgetIsHidden(true, new WidgetPointer(933,16)); + setWidgetIsHidden(true, new WidgetPointer(933,14)); + setWidgetIsHidden(true, new WidgetPointer(933,15)); + if (standart_config_1780 < 2000000000) { + setWidgetText(new WidgetPointer(933,41), intToStr(divide(add(add(ivar0, multiplyDivide(ivar8, 100, subtract(ivar1, ivar0))), 5), 100)) + "%"); + } else { + setWidgetText(new WidgetPointer(933,41), "n/a"); + } + setWidgetIsHidden(true, new WidgetPointer(933,20)); + setWidgetIsHidden(true, new WidgetPointer(933,21)); + setWidgetIsHidden(true, new WidgetPointer(933,22)); + script_949(); + return; +} diff --git a/dumps/scripts/3277.cs2 b/dumps/scripts/3277.cs2 new file mode 100644 index 000000000..050ad803c --- /dev/null +++ b/dumps/scripts/3277.cs2 @@ -0,0 +1,10 @@ +void script_3277() { + globalint_1149 = 0; + globalint_1150 = 0; + globalint_1151 = 0; + globalint_1152 = 0; + deleteAllExtraChilds(new WidgetPointer(942,3)); + deleteAllExtraChilds(new WidgetPointer(942,5)); + deleteAllExtraChilds(new WidgetPointer(942,4)); + return; +} diff --git a/dumps/scripts/3278.cs2 b/dumps/scripts/3278.cs2 new file mode 100644 index 000000000..b0d293791 --- /dev/null +++ b/dumps/scripts/3278.cs2 @@ -0,0 +1,22 @@ +void script_3278(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + ivar4 = 0; + ivar5 = 0; + switch (arg3) { + case 1: + ivar4 = divide(getWidgetActualWidth(new WidgetPointer(942,3)), 4); + ivar5 = divide(getWidgetActualHeight(new WidgetPointer(942,3)), 4); + break; + case 2: + ivar4 = divide(getWidgetActualWidth(new WidgetPointer(942,3)), 4); + break; + } + createExtraChild(new WidgetPointer(942,3), 5, globalint_1149); + globalint_1149 = add(globalint_1149, 1); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(arg2); + setWidgetPosition(add(multiply(arg0, 32), ivar4), add(multiply(arg1, 32), ivar5), 0, 2); + setWidgetHidden(0); + return; +} diff --git a/dumps/scripts/3279.cs2 b/dumps/scripts/3279.cs2 new file mode 100644 index 000000000..d23f86dbd --- /dev/null +++ b/dumps/scripts/3279.cs2 @@ -0,0 +1,48 @@ +void script_3279(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar4 = 0; + ivar5 = 0; + switch (arg3) { + case 1: + ivar4 = divide(getWidgetActualWidth(new WidgetPointer(942,3)), 4); + ivar5 = divide(getWidgetActualHeight(new WidgetPointer(942,3)), 4); + break; + case 2: + ivar4 = divide(getWidgetActualWidth(new WidgetPointer(942,3)), 4); + break; + } + createExtraChild(new WidgetPointer(942,5), 5, globalint_1152); + globalint_1152 = add(globalint_1152, 1); + switch (arg2) { + case 1: + setWidgetSprite(2825); + setWidgetPosition(add(add(multiply(arg0, 32), 6), ivar4), add(add(multiply(arg1, 32), 20), ivar5), 0, 2); + break; + case 2: + setWidgetSprite(2826); + setWidgetPosition(add(add(multiply(arg0, 32), 20), ivar4), add(add(multiply(arg1, 32), 20), ivar5), 0, 2); + break; + case 3: + setWidgetSprite(2827); + setWidgetPosition(add(add(multiply(arg0, 32), 13), ivar4), add(add(multiply(arg1, 32), 13), ivar5), 0, 2); + break; + case 4: + setWidgetSprite(2828); + setWidgetPosition(add(add(multiply(arg0, 32), 6), ivar4), add(add(multiply(arg1, 32), 6), ivar5), 0, 2); + break; + case 5: + setWidgetSprite(2829); + setWidgetPosition(add(add(multiply(arg0, 32), 20), ivar4), add(add(multiply(arg1, 32), 6), ivar5), 0, 2); + break; + } + setWidgetSize(11, 11, 0, 0); + setScriptCallOnMouseOver(3282, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(942,7), arg4, "IiIs"); + setScriptCallOnMouseExit(40, new WidgetPointer(942,7), "I"); + setWidgetFilled(1); + setWidgetHidden(0); + return; +} diff --git a/dumps/scripts/328.cs2 b/dumps/scripts/328.cs2 new file mode 100644 index 000000000..0b7cdc6ac --- /dev/null +++ b/dumps/scripts/328.cs2 @@ -0,0 +1,61 @@ +void script_328(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = 5; + ivar2 = 5; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + svar0 = " "; + ivar7 = -1; + if (IsFemale()) { + ivar4 = getCommonDefinitionSize(2363); + if (((boolean)globalint_783)) { + ivar7 = 2362; + } else { + ivar7 = 2361; + } + } else if (((boolean)globalint_783)) { + ivar7 = 2129; + } else { + ivar7 = 1609; + } + ivar4 = getCommonDefinitionSize(2132); + ivar5 = multiply(ivar4, 2); + while (ivar3 < ivar4) { + createExtraChild(new WidgetPointer(arg0), 5, ivar3); + setWidgetSize(36, 36, 0, 0); + setWidgetPosition(ivar1, ivar2, 0, 0); + setWidgetSprite(180); + setWidgetContextMenuOption(1, "Select" + ""); + setScriptCallOnClickContextMenu(331, new WidgetPointer(-32768,3), -2147483643, "Ii"); + ivar3 = add(ivar3, 1); + ivar2 = add(28, ivar2); + } + ivar2 = 5; + while (ivar3 < ivar5) { + svar0 = cs2method_3408(105, 115, ivar7, ivar6); + createExtraChild(new WidgetPointer(arg0), 4, ivar3); + setWidgetText(svar0); + setWidgetSize(124, 16, 0, 0); + setWidgetPosition(add(ivar1, 20), ivar2, 0, 0); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetFont(494); + setWidgetUnknownBoolean(false); + setWidgetTextAlignment(0, 1, 0); + setWidgetContextMenuOption(1, "Select" + ""); + setScriptCallOnClickContextMenu(331, new WidgetPointer(-32768,3), subtract(ivar3, ivar4), "Ii"); + ivar3 = add(ivar3, 1); + ivar6 = add(ivar6, 1); + ivar2 = add(28, ivar2); + } + return; +} diff --git a/dumps/scripts/3280.cs2 b/dumps/scripts/3280.cs2 new file mode 100644 index 000000000..a5b899c6e --- /dev/null +++ b/dumps/scripts/3280.cs2 @@ -0,0 +1,22 @@ +void script_3280(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = 0; + ivar4 = 0; + switch (arg2) { + case 1: + ivar3 = divide(getWidgetActualWidth(new WidgetPointer(942,3)), 4); + ivar4 = divide(getWidgetActualHeight(new WidgetPointer(942,3)), 4); + break; + case 2: + ivar3 = divide(getWidgetActualWidth(new WidgetPointer(942,3)), 4); + break; + } + createExtraChild(new WidgetPointer(942,4), 5, globalint_1151); + globalint_1151 = add(globalint_1151, 1); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(2831); + setWidgetPosition(add(multiply(arg0, 32), ivar3), add(multiply(arg1, 32), ivar4), 0, 2); + setWidgetHidden(0); + return; +} diff --git a/dumps/scripts/3281.cs2 b/dumps/scripts/3281.cs2 new file mode 100644 index 000000000..d0dc11934 --- /dev/null +++ b/dumps/scripts/3281.cs2 @@ -0,0 +1,22 @@ +void script_3281(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = 0; + ivar4 = 0; + switch (arg2) { + case 1: + ivar3 = divide(getWidgetActualWidth(new WidgetPointer(942,3)), 4); + ivar4 = divide(getWidgetActualHeight(new WidgetPointer(942,3)), 4); + break; + case 2: + ivar3 = divide(getWidgetActualWidth(new WidgetPointer(942,3)), 4); + break; + } + createExtraChild(new WidgetPointer(942,4), 5, globalint_1151); + globalint_1151 = add(globalint_1151, 1); + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(2833); + setWidgetPosition(add(multiply(arg0, 32), ivar3), add(multiply(arg1, 32), ivar4), 0, 2); + setWidgetHidden(0); + return; +} diff --git a/dumps/scripts/3282.cs2 b/dumps/scripts/3282.cs2 new file mode 100644 index 000000000..43b72eb79 --- /dev/null +++ b/dumps/scripts/3282.cs2 @@ -0,0 +1,4 @@ +void script_3282(int arg0,int arg1,int arg2,string arg3) { + script_3364(arg0, arg1, arg2, 25, getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg2)))), 11, 11, arg3); + return; +} diff --git a/dumps/scripts/3283.cs2 b/dumps/scripts/3283.cs2 new file mode 100644 index 000000000..9bb1dae1d --- /dev/null +++ b/dumps/scripts/3283.cs2 @@ -0,0 +1,21 @@ +void script_3283(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + if (((boolean)arg3)) { + arg3 = 12; + } + ivar4 = getLineCount(add(getWidgetActualWidth(new WidgetPointer(arg1)), 16), arg2, getWidgetText(new WidgetPointer(arg1))); + ivar4 = multiply(ivar4, arg3); + messageType0("txt " + intToStr(ivar4) + ", layer " + intToStr(getWidgetActualHeight(new WidgetPointer(arg1)))); + if (getWidgetActualHeight(new WidgetPointer(arg1)) >= ivar4) { + messageType0("No scroll txt " + intToStr(ivar4) + ", layer " + intToStr(getWidgetActualHeight(new WidgetPointer(arg1)))); + setWidgetSize(add(getWidgetActualWidth(new WidgetPointer(arg1)), 16), getWidgetActualHeight(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else { + ivar4 = getLineCount(getWidgetActualWidth(new WidgetPointer(arg1)), arg2, getWidgetText(new WidgetPointer(arg1))); + ivar4 = multiply(ivar4, arg3); + setWidgetScrollMax(0, add(ivar4, 10), new WidgetPointer(arg1)); + messageType0("Scroll txt " + intToStr(ivar4) + ", layer " + intToStr(getWidgetActualHeight(new WidgetPointer(arg1)))); + script_31(arg0, arg1, 792, 789, 790, 791, 773, 788); + } + return; +} diff --git a/dumps/scripts/3284.cs2 b/dumps/scripts/3284.cs2 new file mode 100644 index 000000000..945d8f01a --- /dev/null +++ b/dumps/scripts/3284.cs2 @@ -0,0 +1,27 @@ +void script_3284(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = add(61, multiply(10, subtract(arg0, 1))); + playSoundEffect(8809, 1, 0); + setWidgetPosition(0, ivar4, 0, 0, new WidgetPointer(arg1)); + setWidgetText(new WidgetPointer(arg2), intToStr(arg0)); + switch (cs2method_3408(105, 105, 1264, arg0)) { + case 1: + setWidgetText(new WidgetPointer(arg3), "Frozen"); + break; + case 2: + setWidgetText(new WidgetPointer(arg3), "Abandoned"); + break; + case 3: + setWidgetText(new WidgetPointer(arg3), "Furnished"); + break; + case 4: + setWidgetText(new WidgetPointer(arg3), "Occult"); + break; + case 5: + setWidgetText(new WidgetPointer(arg3), "Warped"); + break; + default: + setWidgetText(new WidgetPointer(arg3), "Dungeon"); + } + return; +} diff --git a/dumps/scripts/3285.cs2 b/dumps/scripts/3285.cs2 new file mode 100644 index 000000000..9cec16349 --- /dev/null +++ b/dumps/scripts/3285.cs2 @@ -0,0 +1,8 @@ +void script_3285(int arg0) { + setWidgetScrollMax(0, arg0, new WidgetPointer(947,36)); + setWidgetScrollMax(0, arg0, new WidgetPointer(947,38)); + if (getWidgetScrollMaxV(new WidgetPointer(947,36)) < getWidgetActualHeight(new WidgetPointer(947,36))) { + setWidgetIsHidden(true, new WidgetPointer(947,47)); + } + return; +} diff --git a/dumps/scripts/3286.cs2 b/dumps/scripts/3286.cs2 new file mode 100644 index 000000000..3ea084103 --- /dev/null +++ b/dumps/scripts/3286.cs2 @@ -0,0 +1,4 @@ +void script_3286() { + globalint_10 = add(script_1305(), 100); + return; +} diff --git a/dumps/scripts/3287.cs2 b/dumps/scripts/3287.cs2 new file mode 100644 index 000000000..843925568 --- /dev/null +++ b/dumps/scripts/3287.cs2 @@ -0,0 +1,6 @@ +int script_3287() { + if (globalint_1324 > 2) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/3288.cs2 b/dumps/scripts/3288.cs2 new file mode 100644 index 000000000..ec9e3d355 --- /dev/null +++ b/dumps/scripts/3288.cs2 @@ -0,0 +1,4 @@ +void script_3288(int arg0,int arg1,int arg2) { + script_3290(arg0, arg1, arg2, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/3289.cs2 b/dumps/scripts/3289.cs2 new file mode 100644 index 000000000..4c549f65a --- /dev/null +++ b/dumps/scripts/3289.cs2 @@ -0,0 +1,4 @@ +void script_3289(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + script_3290(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + return; +} diff --git a/dumps/scripts/329.cs2 b/dumps/scripts/329.cs2 new file mode 100644 index 000000000..ce0873b2e --- /dev/null +++ b/dumps/scripts/329.cs2 @@ -0,0 +1,12 @@ +void script_329(int arg0) { + int ivar1; + ivar1 = 0; + if (IsFemale()) { + ivar1 = getCommonDefinitionSize(2363); + } else { + ivar1 = getCommonDefinitionSize(2132); + } + script_332(globalint_785); + script_2366(arg0, globalint_785, ivar1); + return; +} diff --git a/dumps/scripts/3290.cs2 b/dumps/scripts/3290.cs2 new file mode 100644 index 000000000..2ce37eac4 --- /dev/null +++ b/dumps/scripts/3290.cs2 @@ -0,0 +1,76 @@ +void script_3290(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + ivar9 = getWidgetScrollMaxV(new WidgetPointer(arg1)); + ivar10 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar11 = subtract(ivar10, 32); + ivar12 = 0; + if (ivar9 > 0) { + ivar12 = multiplyDivide(ivar10, ivar9, ivar11); + } else { + ivar12 = ivar11; + } + ivar12 = max(ivar12, 10); + ivar13 = cs2method2601(new WidgetPointer(arg1)); + ivar14 = 0; + ivar15 = 0; + if (ivar13 > 0) { + ivar14 = subtract(ivar9, getWidgetActualHeight(new WidgetPointer(arg1))); + if (((boolean)ivar14)) { + ivar14 = 1; + } + if (ivar13 > ivar14) { + cs2method2100(0, ivar14, new WidgetPointer(arg1)); + cs2method2100(0, ivar14, new WidgetPointer(arg2)); + ivar13 = ivar14; + } + ivar15 = multiplyDivide(ivar13, ivar14, subtract(ivar11, ivar12)); + ivar15 = min(max(ivar15, 0), subtract(ivar11, ivar12)); + } + createExtraChild(new WidgetPointer(arg0), 5, 0); + setWidgetPosition(0, 16, 0, 0); + setWidgetSize(16, 32, 0, 1); + setWidgetSprite(arg3); + cs2method1107(1); + setScriptCallOnMousePressed(3293, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), -2147483646, "IIIi"); + createExtraChild(new WidgetPointer(arg0), 5, 1); + setWidgetPosition(0, add(16, ivar15), 0, 0); + setWidgetSprite(arg5); + cs2method1107(1); + cs2method1301(arg0, 0); + cs2method1302(1); + setWidgetSize(16, ivar12, 0, 0); + setScriptCallOnMouseDragged(3294, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), -2147483646, 0, "IIIi1"); + setScriptCallOnMouseDragReleased(3294, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), -2147483646, 1, "IIIi1"); + createExtraChild(new WidgetPointer(arg0), 5, 2); + setWidgetPosition(0, add(16, ivar15), 0, 0); + setWidgetSize(16, 5, 0, 0); + setWidgetSprite(arg4); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, 3); + setWidgetPosition(0, subtract(add(add(16, ivar15), ivar12), 5), 0, 0); + setWidgetSize(16, 5, 0, 0); + setWidgetSprite(arg6); + cs2method1107(0); + createExtraChild(new WidgetPointer(arg0), 5, 4); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(16, 16, 0, 0); + setWidgetSprite(arg7); + cs2method1107(0); + setScriptCallOnMouseDraggedOver(3291, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), "III"); + createExtraChild(new WidgetPointer(arg0), 5, 5); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(16, 16, 0, 0); + setWidgetSprite(arg8); + cs2method1107(0); + setScriptCallOnMouseDraggedOver(3292, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), "III"); + setScriptCallOnMouseScroll(3295, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), -2147483646, "IIIi", new WidgetPointer(arg0)); + setScriptCallOnMouseScroll(3295, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), -2147483646, "IIIi", new WidgetPointer(arg1)); + setScriptCallOnMouseScroll(3295, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), -2147483646, "IIIi", new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/3291.cs2 b/dumps/scripts/3291.cs2 new file mode 100644 index 000000000..05f66a673 --- /dev/null +++ b/dumps/scripts/3291.cs2 @@ -0,0 +1,8 @@ +void script_3291(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = subtract(cs2method2601(new WidgetPointer(arg1)), 4); + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + script_3296(arg0, arg1, arg2, ivar3, 1); + } + return; +} diff --git a/dumps/scripts/3292.cs2 b/dumps/scripts/3292.cs2 new file mode 100644 index 000000000..f4f7ffa9c --- /dev/null +++ b/dumps/scripts/3292.cs2 @@ -0,0 +1,8 @@ +void script_3292(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = add(cs2method2601(new WidgetPointer(arg1)), 4); + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + script_3296(arg0, arg1, arg2, ivar3, 1); + } + return; +} diff --git a/dumps/scripts/3293.cs2 b/dumps/scripts/3293.cs2 new file mode 100644 index 000000000..2f2d8f1a5 --- /dev/null +++ b/dumps/scripts/3293.cs2 @@ -0,0 +1,6 @@ +void script_3293(int arg0,int arg1,int arg2,int arg3) { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + cs2method3109(0, divide(getWidgetActualHeight(), 2)); + } + return; +} diff --git a/dumps/scripts/3294.cs2 b/dumps/scripts/3294.cs2 new file mode 100644 index 000000000..6ace32022 --- /dev/null +++ b/dumps/scripts/3294.cs2 @@ -0,0 +1,19 @@ +void script_3294(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + ivar5 = 0; + ivar6 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetPosition(0, add(arg3, 16), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetPosition(0, add(subtract(add(arg3, getWidgetActualHeight()), 5), 16), 0, 0); + } + ivar5 = subtract(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), 32), getWidgetActualHeight()); + ivar6 = subtract(getWidgetScrollMaxV(new WidgetPointer(arg1)), getWidgetActualHeight(new WidgetPointer(arg1))); + arg3 = divide(multiply(arg3, ivar6), ivar5); + script_3296(arg0, arg1, arg2, arg3, arg4); + } + return; +} diff --git a/dumps/scripts/3295.cs2 b/dumps/scripts/3295.cs2 new file mode 100644 index 000000000..2c598e0d4 --- /dev/null +++ b/dumps/scripts/3295.cs2 @@ -0,0 +1,8 @@ +void script_3295(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = add(cs2method2601(new WidgetPointer(arg1)), multiply(arg3, 45)); + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + script_3296(arg0, arg1, arg2, ivar4, 1); + } + return; +} diff --git a/dumps/scripts/3296.cs2 b/dumps/scripts/3296.cs2 new file mode 100644 index 000000000..a47461991 --- /dev/null +++ b/dumps/scripts/3296.cs2 @@ -0,0 +1,28 @@ +void script_3296(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + ivar5 = subtract(getWidgetScrollMaxV(new WidgetPointer(arg1)), getWidgetActualHeight(new WidgetPointer(arg1))); + if (((boolean)ivar5)) { + ivar5 = 1; + } + if (arg3 < 0) { + arg3 = 0; + } + if (arg3 > ivar5) { + arg3 = ivar5; + } + cs2method2100(0, arg3, new WidgetPointer(arg1)); + cs2method2100(0, arg3, new WidgetPointer(arg2)); + ivar6 = 0; + if (((boolean)arg4)) { + ivar6 = subtract(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), 32), getWidgetActualHeight()); + setWidgetPosition(0, add(16, multiplyDivide(arg3, ivar5, ivar6)), 0, 0); + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetPosition(0, getWidgetActualY(), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetPosition(0, subtract(add(getWidgetActualY(), getWidgetActualHeight()), 5), 0, 0); + } + } + return; +} diff --git a/dumps/scripts/3297.cs2 b/dumps/scripts/3297.cs2 new file mode 100644 index 000000000..07bfe7a75 --- /dev/null +++ b/dumps/scripts/3297.cs2 @@ -0,0 +1,28 @@ +void script_3297(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + ivar5 = subtract(getWidgetScrollMaxV(new WidgetPointer(arg1)), getWidgetActualHeight(new WidgetPointer(arg1))); + if (((boolean)ivar5)) { + ivar5 = 1; + } + if (arg3 < 0) { + arg3 = 0; + } + if (arg3 > ivar5) { + arg3 = ivar5; + } + cs2method2100(0, arg3, new WidgetPointer(arg1)); + cs2method2100(0, arg3, new WidgetPointer(arg2)); + ivar6 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), 1) && ((boolean)arg4)) { + ivar6 = subtract(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), 32), getWidgetActualHeight()); + setWidgetPosition(0, add(16, divide(multiply(ivar6, arg3), ivar5)), 0, 0); + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetPosition(0, getWidgetActualY(), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetPosition(0, subtract(add(getWidgetActualY(), getWidgetActualHeight()), 5), 0, 0); + } + } + return; +} diff --git a/dumps/scripts/3298.cs2 b/dumps/scripts/3298.cs2 new file mode 100644 index 000000000..16a587f44 --- /dev/null +++ b/dumps/scripts/3298.cs2 @@ -0,0 +1,23 @@ +void script_3298(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar4 = getWidgetScrollMaxV(new WidgetPointer(arg1)); + ivar5 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar6 = subtract(ivar5, 32); + ivar7 = 0; + if (ivar4 > 0) { + ivar7 = divide(multiply(ivar6, ivar5), ivar4); + } else { + ivar7 = ivar6; + } + if (ivar7 < 10) { + ivar7 = 10; + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSize(16, ivar7, 0, 0); + script_3296(arg0, arg1, arg2, arg3, 1); + } + return; +} diff --git a/dumps/scripts/3299.cs2 b/dumps/scripts/3299.cs2 new file mode 100644 index 000000000..341c30c90 --- /dev/null +++ b/dumps/scripts/3299.cs2 @@ -0,0 +1,6 @@ +void script_3299(int arg0,int arg1) { + if (getItemIdInSlotSplit(arg0, arg1) != -1) { + messageType0(getItemName(getItemIdInSlotSplit(arg0, arg1))); + } + return; +} diff --git a/dumps/scripts/33.cs2 b/dumps/scripts/33.cs2 new file mode 100644 index 000000000..66ee45982 --- /dev/null +++ b/dumps/scripts/33.cs2 @@ -0,0 +1,12 @@ +void script_33(int arg0,int arg1) { + int ivar2; + ivar2 = add(cs2method2601(new WidgetPointer(arg1)), 4); + switch (arg1) { + case 38666248: + ivar2 = script_4754(arg1, ivar2, 0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + script_37(arg0, arg1, ivar2, 1); + } + return; +} diff --git a/dumps/scripts/330.cs2 b/dumps/scripts/330.cs2 new file mode 100644 index 000000000..1fc3b918a --- /dev/null +++ b/dumps/scripts/330.cs2 @@ -0,0 +1,12 @@ +void script_330(int arg0) { + int ivar1; + ivar1 = 0; + if (IsFemale()) { + ivar1 = getCommonDefinitionSize(2363); + } else { + ivar1 = getCommonDefinitionSize(2132); + } + script_332(globalint_784); + script_2366(arg0, globalint_784, ivar1); + return; +} diff --git a/dumps/scripts/3300.cs2 b/dumps/scripts/3300.cs2 new file mode 100644 index 000000000..ac5691c7a --- /dev/null +++ b/dumps/scripts/3300.cs2 @@ -0,0 +1,4 @@ +void script_3300() { + setWidgetText(new WidgetPointer(949,72), globalstring_284); + return; +} diff --git a/dumps/scripts/3301.cs2 b/dumps/scripts/3301.cs2 new file mode 100644 index 000000000..2d7f19736 --- /dev/null +++ b/dumps/scripts/3301.cs2 @@ -0,0 +1,4 @@ +void script_3301() { + setWidgetText(new WidgetPointer(949,78), globalstring_285); + return; +} diff --git a/dumps/scripts/3302.cs2 b/dumps/scripts/3302.cs2 new file mode 100644 index 000000000..e81174f91 --- /dev/null +++ b/dumps/scripts/3302.cs2 @@ -0,0 +1,4 @@ +void script_3302() { + setWidgetText(new WidgetPointer(949,84), globalstring_286); + return; +} diff --git a/dumps/scripts/3303.cs2 b/dumps/scripts/3303.cs2 new file mode 100644 index 000000000..222534228 --- /dev/null +++ b/dumps/scripts/3303.cs2 @@ -0,0 +1,4 @@ +void script_3303() { + setWidgetText(new WidgetPointer(949,90), globalstring_287); + return; +} diff --git a/dumps/scripts/3304.cs2 b/dumps/scripts/3304.cs2 new file mode 100644 index 000000000..5abd837ca --- /dev/null +++ b/dumps/scripts/3304.cs2 @@ -0,0 +1,4 @@ +void script_3304() { + setWidgetText(new WidgetPointer(949,96), globalstring_288); + return; +} diff --git a/dumps/scripts/3305.cs2 b/dumps/scripts/3305.cs2 new file mode 100644 index 000000000..99a133306 --- /dev/null +++ b/dumps/scripts/3305.cs2 @@ -0,0 +1,4 @@ +void script_3305() { + setWidgetText(new WidgetPointer(949,73), intToStr(globalint_1153)); + return; +} diff --git a/dumps/scripts/3306.cs2 b/dumps/scripts/3306.cs2 new file mode 100644 index 000000000..c69b283ae --- /dev/null +++ b/dumps/scripts/3306.cs2 @@ -0,0 +1,4 @@ +void script_3306() { + setWidgetText(new WidgetPointer(949,79), intToStr(globalint_1154)); + return; +} diff --git a/dumps/scripts/3307.cs2 b/dumps/scripts/3307.cs2 new file mode 100644 index 000000000..b32be8fb0 --- /dev/null +++ b/dumps/scripts/3307.cs2 @@ -0,0 +1,4 @@ +void script_3307() { + setWidgetText(new WidgetPointer(949,85), intToStr(globalint_1155)); + return; +} diff --git a/dumps/scripts/3308.cs2 b/dumps/scripts/3308.cs2 new file mode 100644 index 000000000..3b9169a49 --- /dev/null +++ b/dumps/scripts/3308.cs2 @@ -0,0 +1,4 @@ +void script_3308() { + setWidgetText(new WidgetPointer(949,91), intToStr(globalint_1156)); + return; +} diff --git a/dumps/scripts/3309.cs2 b/dumps/scripts/3309.cs2 new file mode 100644 index 000000000..273c53979 --- /dev/null +++ b/dumps/scripts/3309.cs2 @@ -0,0 +1,4 @@ +void script_3309() { + setWidgetText(new WidgetPointer(949,97), intToStr(globalint_1157)); + return; +} diff --git a/dumps/scripts/331.cs2 b/dumps/scripts/331.cs2 new file mode 100644 index 000000000..61cd910f0 --- /dev/null +++ b/dumps/scripts/331.cs2 @@ -0,0 +1,12 @@ +void script_331(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (IsFemale()) { + ivar2 = getCommonDefinitionSize(2363); + } else { + ivar2 = getCommonDefinitionSize(2132); + } + script_332(arg1); + script_2366(arg0, arg1, ivar2); + return; +} diff --git a/dumps/scripts/3310.cs2 b/dumps/scripts/3310.cs2 new file mode 100644 index 000000000..521773530 --- /dev/null +++ b/dumps/scripts/3310.cs2 @@ -0,0 +1,4 @@ +void script_3310() { + setWidgetText(new WidgetPointer(949,75), intToStr(globalint_1163)); + return; +} diff --git a/dumps/scripts/3311.cs2 b/dumps/scripts/3311.cs2 new file mode 100644 index 000000000..fe22fc355 --- /dev/null +++ b/dumps/scripts/3311.cs2 @@ -0,0 +1,4 @@ +void script_3311() { + setWidgetText(new WidgetPointer(949,81), intToStr(globalint_1164)); + return; +} diff --git a/dumps/scripts/3312.cs2 b/dumps/scripts/3312.cs2 new file mode 100644 index 000000000..252fc4235 --- /dev/null +++ b/dumps/scripts/3312.cs2 @@ -0,0 +1,4 @@ +void script_3312() { + setWidgetText(new WidgetPointer(949,87), intToStr(globalint_1165)); + return; +} diff --git a/dumps/scripts/3313.cs2 b/dumps/scripts/3313.cs2 new file mode 100644 index 000000000..5bcaf43f6 --- /dev/null +++ b/dumps/scripts/3313.cs2 @@ -0,0 +1,4 @@ +void script_3313() { + setWidgetText(new WidgetPointer(949,93), intToStr(globalint_1166)); + return; +} diff --git a/dumps/scripts/3314.cs2 b/dumps/scripts/3314.cs2 new file mode 100644 index 000000000..14b7dce2b --- /dev/null +++ b/dumps/scripts/3314.cs2 @@ -0,0 +1,4 @@ +void script_3314() { + setWidgetText(new WidgetPointer(949,99), intToStr(globalint_1167)); + return; +} diff --git a/dumps/scripts/3315.cs2 b/dumps/scripts/3315.cs2 new file mode 100644 index 000000000..5e10881ad --- /dev/null +++ b/dumps/scripts/3315.cs2 @@ -0,0 +1,4 @@ +void script_3315() { + setWidgetText(new WidgetPointer(949,76), intToStr(globalint_1168)); + return; +} diff --git a/dumps/scripts/3316.cs2 b/dumps/scripts/3316.cs2 new file mode 100644 index 000000000..6f3af22a3 --- /dev/null +++ b/dumps/scripts/3316.cs2 @@ -0,0 +1,4 @@ +void script_3316() { + setWidgetText(new WidgetPointer(949,82), intToStr(globalint_1169)); + return; +} diff --git a/dumps/scripts/3317.cs2 b/dumps/scripts/3317.cs2 new file mode 100644 index 000000000..ab113ab70 --- /dev/null +++ b/dumps/scripts/3317.cs2 @@ -0,0 +1,4 @@ +void script_3317() { + setWidgetText(new WidgetPointer(949,88), intToStr(globalint_1170)); + return; +} diff --git a/dumps/scripts/3318.cs2 b/dumps/scripts/3318.cs2 new file mode 100644 index 000000000..658735904 --- /dev/null +++ b/dumps/scripts/3318.cs2 @@ -0,0 +1,4 @@ +void script_3318() { + setWidgetText(new WidgetPointer(949,94), intToStr(globalint_1171)); + return; +} diff --git a/dumps/scripts/3319.cs2 b/dumps/scripts/3319.cs2 new file mode 100644 index 000000000..d32079955 --- /dev/null +++ b/dumps/scripts/3319.cs2 @@ -0,0 +1,4 @@ +void script_3319() { + setWidgetText(new WidgetPointer(949,100), intToStr(globalint_1172)); + return; +} diff --git a/dumps/scripts/332.cs2 b/dumps/scripts/332.cs2 new file mode 100644 index 000000000..e0540aec8 --- /dev/null +++ b/dumps/scripts/332.cs2 @@ -0,0 +1,9 @@ +void script_332(int arg0) { + int ivar1; + ivar1 = 2359; + if (((boolean)globalint_783)) { + ivar1 = 2360; + } + setWidgetModel(cs2method_3408(105, 109, ivar1, arg0), new WidgetPointer(725,83)); + return; +} diff --git a/dumps/scripts/3320.cs2 b/dumps/scripts/3320.cs2 new file mode 100644 index 000000000..ef357590c --- /dev/null +++ b/dumps/scripts/3320.cs2 @@ -0,0 +1,4 @@ +void script_3320() { + setWidgetText(new WidgetPointer(949,74), intToStr(globalint_1158)); + return; +} diff --git a/dumps/scripts/3321.cs2 b/dumps/scripts/3321.cs2 new file mode 100644 index 000000000..b106072e2 --- /dev/null +++ b/dumps/scripts/3321.cs2 @@ -0,0 +1,4 @@ +void script_3321() { + setWidgetText(new WidgetPointer(949,80), intToStr(globalint_1159)); + return; +} diff --git a/dumps/scripts/3322.cs2 b/dumps/scripts/3322.cs2 new file mode 100644 index 000000000..86d0ed878 --- /dev/null +++ b/dumps/scripts/3322.cs2 @@ -0,0 +1,4 @@ +void script_3322() { + setWidgetText(new WidgetPointer(949,86), intToStr(globalint_1160)); + return; +} diff --git a/dumps/scripts/3323.cs2 b/dumps/scripts/3323.cs2 new file mode 100644 index 000000000..195e20abb --- /dev/null +++ b/dumps/scripts/3323.cs2 @@ -0,0 +1,4 @@ +void script_3323() { + setWidgetText(new WidgetPointer(949,92), intToStr(globalint_1161)); + return; +} diff --git a/dumps/scripts/3324.cs2 b/dumps/scripts/3324.cs2 new file mode 100644 index 000000000..9ff7b058e --- /dev/null +++ b/dumps/scripts/3324.cs2 @@ -0,0 +1,4 @@ +void script_3324() { + setWidgetText(new WidgetPointer(949,98), intToStr(globalint_1162)); + return; +} diff --git a/dumps/scripts/3325.cs2 b/dumps/scripts/3325.cs2 new file mode 100644 index 000000000..52e055b55 --- /dev/null +++ b/dumps/scripts/3325.cs2 @@ -0,0 +1,4 @@ +void script_3325() { + setWidgetText(new WidgetPointer(949,108), intToStr(globalint_1173)); + return; +} diff --git a/dumps/scripts/3326.cs2 b/dumps/scripts/3326.cs2 new file mode 100644 index 000000000..09599b86a --- /dev/null +++ b/dumps/scripts/3326.cs2 @@ -0,0 +1,4 @@ +void script_3326() { + setWidgetText(new WidgetPointer(949,106), intToStr(globalint_1174)); + return; +} diff --git a/dumps/scripts/3327.cs2 b/dumps/scripts/3327.cs2 new file mode 100644 index 000000000..d3900364b --- /dev/null +++ b/dumps/scripts/3327.cs2 @@ -0,0 +1,4 @@ +void script_3327() { + setWidgetText(new WidgetPointer(939,59), globalstring_292); + return; +} diff --git a/dumps/scripts/3328.cs2 b/dumps/scripts/3328.cs2 new file mode 100644 index 000000000..47a9f59c2 --- /dev/null +++ b/dumps/scripts/3328.cs2 @@ -0,0 +1,4 @@ +void script_3328() { + setWidgetText(new WidgetPointer(939,62), globalstring_293); + return; +} diff --git a/dumps/scripts/3329.cs2 b/dumps/scripts/3329.cs2 new file mode 100644 index 000000000..8e09a037f --- /dev/null +++ b/dumps/scripts/3329.cs2 @@ -0,0 +1,4 @@ +void script_3329() { + setWidgetText(new WidgetPointer(939,65), globalstring_294); + return; +} diff --git a/dumps/scripts/333.cs2 b/dumps/scripts/333.cs2 new file mode 100644 index 000000000..d97ba623c --- /dev/null +++ b/dumps/scripts/333.cs2 @@ -0,0 +1,52 @@ +void script_333(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int stack_dump0; + cs2func_script_2413_struct(3,0,0) structdump_1; + cs2func_script_2413_struct(3,0,0) structdump_2; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + stack_dump0 = arg1; + structdump_1 = script_2413(stack_dump0); + ivar7 = structdump_1.intpart_2; + ivar6 = structdump_1.intpart_1; + ivar5 = structdump_1.intpart_0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + stack_dump0 = arg2; + structdump_2 = script_2413(stack_dump0); + ivar10 = structdump_2.intpart_2; + ivar9 = structdump_2.intpart_1; + ivar8 = structdump_2.intpart_0; + ivar11 = subtract(ivar8, ivar5); + ivar12 = subtract(ivar9, ivar6); + ivar13 = subtract(ivar10, ivar7); + ivar14 = subtract(getWidgetActualHeight(new WidgetPointer(arg0)), arg4); + arg3 = multiply(arg3, 2); + ivar15 = arg4; + ivar16 = 0; + ivar17 = subtract(ivar14, ivar15); + while (ivar15 < ivar14) { + createExtraChild(new WidgetPointer(arg0), 3, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(arg3, 1, 1, 0); + setWidgetFilled(1); + setWidgetPosition(0, ivar15, 1, 0); + setWidgetRGB(new Color(script_693(add(ivar5, multiplyDivide(ivar16, ivar17, ivar11)), add(ivar6, multiplyDivide(ivar16, ivar17, ivar12)), add(ivar7, multiplyDivide(ivar16, ivar17, ivar13))))); + ivar16 = add(ivar16, 1); + ivar15 = add(ivar15, 1); + } + return; +} diff --git a/dumps/scripts/3330.cs2 b/dumps/scripts/3330.cs2 new file mode 100644 index 000000000..e28e088ea --- /dev/null +++ b/dumps/scripts/3330.cs2 @@ -0,0 +1,4 @@ +void script_3330() { + setWidgetText(new WidgetPointer(939,68), globalstring_295); + return; +} diff --git a/dumps/scripts/3331.cs2 b/dumps/scripts/3331.cs2 new file mode 100644 index 000000000..8909f8780 --- /dev/null +++ b/dumps/scripts/3331.cs2 @@ -0,0 +1,4 @@ +void script_3331() { + setWidgetText(new WidgetPointer(939,71), globalstring_296); + return; +} diff --git a/dumps/scripts/3332.cs2 b/dumps/scripts/3332.cs2 new file mode 100644 index 000000000..1ba67f391 --- /dev/null +++ b/dumps/scripts/3332.cs2 @@ -0,0 +1,4 @@ +void script_3332() { + setWidgetText(new WidgetPointer(939,106), intToStr(globalint_1180)); + return; +} diff --git a/dumps/scripts/3333.cs2 b/dumps/scripts/3333.cs2 new file mode 100644 index 000000000..47060370c --- /dev/null +++ b/dumps/scripts/3333.cs2 @@ -0,0 +1,4 @@ +void script_3333() { + setWidgetText(new WidgetPointer(939,100), intToStr(globalint_1183)); + return; +} diff --git a/dumps/scripts/3334.cs2 b/dumps/scripts/3334.cs2 new file mode 100644 index 000000000..67624b06b --- /dev/null +++ b/dumps/scripts/3334.cs2 @@ -0,0 +1,4 @@ +void script_3334() { + setWidgetText(new WidgetPointer(939,83), intToStr(globalint_1181)); + return; +} diff --git a/dumps/scripts/3335.cs2 b/dumps/scripts/3335.cs2 new file mode 100644 index 000000000..0c856c89d --- /dev/null +++ b/dumps/scripts/3335.cs2 @@ -0,0 +1,4 @@ +void script_3335() { + setWidgetText(new WidgetPointer(939,84), intToStr(globalint_1182)); + return; +} diff --git a/dumps/scripts/3336.cs2 b/dumps/scripts/3336.cs2 new file mode 100644 index 000000000..e454027f8 --- /dev/null +++ b/dumps/scripts/3336.cs2 @@ -0,0 +1,4 @@ +void script_3336() { + script_3337(); + return; +} diff --git a/dumps/scripts/3337.cs2 b/dumps/scripts/3337.cs2 new file mode 100644 index 000000000..c369856d2 --- /dev/null +++ b/dumps/scripts/3337.cs2 @@ -0,0 +1,28 @@ +void script_3337() { + globalint_1243 = getSkillXp(0); + globalint_1244 = getSkillXp(2); + globalint_1245 = getSkillXp(1); + globalint_1246 = getSkillXp(4); + globalint_1247 = getSkillXp(5); + globalint_1248 = getSkillXp(6); + globalint_1249 = getSkillXp(20); + globalint_1250 = getSkillXp(3); + globalint_1251 = getSkillXp(12); + globalint_1252 = getSkillXp(14); + globalint_1253 = getSkillXp(13); + globalint_1254 = getSkillXp(10); + globalint_1255 = getSkillXp(7); + globalint_1256 = getSkillXp(11); + globalint_1257 = getSkillXp(8); + globalint_1258 = getSkillXp(16); + globalint_1259 = getSkillXp(15); + globalint_1260 = getSkillXp(17); + globalint_1261 = getSkillXp(9); + globalint_1262 = getSkillXp(18); + globalint_1263 = getSkillXp(19); + globalint_1264 = getSkillXp(22); + globalint_1265 = getSkillXp(21); + globalint_1266 = getSkillXp(23); + globalint_1267 = getSkillXp(24); + return; +} diff --git a/dumps/scripts/3338.cs2 b/dumps/scripts/3338.cs2 new file mode 100644 index 000000000..c51581e28 --- /dev/null +++ b/dumps/scripts/3338.cs2 @@ -0,0 +1,4 @@ +void script_3338(int arg0,int arg1) { + setScriptCallOnGameloop(3499, 0, new WidgetPointer(arg0), new WidgetPointer(arg1), "iII", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3339.cs2 b/dumps/scripts/3339.cs2 new file mode 100644 index 000000000..4339b4abf --- /dev/null +++ b/dumps/scripts/3339.cs2 @@ -0,0 +1,33 @@ +void script_3339(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + if (((boolean)getLanguage())) { + if (((boolean)globalint_1175)) { + ivar1 = 3068; + ivar2 = 3067; + ivar3 = 3069; + } else { + ivar1 = 3071; + ivar2 = 3070; + ivar3 = 3072; + } + } else if (((boolean)globalint_1175)) { + ivar1 = 3014; + ivar2 = 3013; + ivar3 = 3015; + } else { + ivar1 = 3017; + ivar2 = 3016; + ivar3 = 3018; + } + setWidgetSprite(ivar2, new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar2, "Id", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(44, new WidgetPointer(-32768,3), ivar3, "Id", new WidgetPointer(arg0)); + script_41(61538418); + return; +} diff --git a/dumps/scripts/334.cs2 b/dumps/scripts/334.cs2 new file mode 100644 index 000000000..de671f156 --- /dev/null +++ b/dumps/scripts/334.cs2 @@ -0,0 +1,29 @@ +void script_334(int arg0) { + int ivar1; + ivar1 = 1777; + if (bitconfig_6090 == 2) { + setWidgetSprite(7435, new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(5115, new WidgetPointer(-32768,3), 1, "Ii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(5115, new WidgetPointer(-32768,3), 0, "Ii", new WidgetPointer(arg0)); + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Citadel Interface"); + } else if (((boolean)bitconfig_6090)) { + setWidgetSprite(3046, new WidgetPointer(arg0)); + ivar1 = 3047; + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + ivar1 = 3046; + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg0)); + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Daemonheim Map"); + } else { + setWidgetSprite(1776, new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + ivar1 = 1776; + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg0)); + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "World Map"); + if ((standart_config_1159 != -1) && (standart_config_1159 != 0)) { + setWidgetContextMenuOption(2, new WidgetPointer(arg0), "Clear your marker"); + } + } + return; +} diff --git a/dumps/scripts/3340.cs2 b/dumps/scripts/3340.cs2 new file mode 100644 index 000000000..f1e11a943 --- /dev/null +++ b/dumps/scripts/3340.cs2 @@ -0,0 +1,33 @@ +void script_3340(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + if (((boolean)getLanguage())) { + if (((boolean)globalint_1176)) { + ivar1 = 3068; + ivar2 = 3067; + ivar3 = 3069; + } else { + ivar1 = 3071; + ivar2 = 3070; + ivar3 = 3072; + } + } else if (((boolean)globalint_1176)) { + ivar1 = 3014; + ivar2 = 3013; + ivar3 = 3015; + } else { + ivar1 = 3017; + ivar2 = 3016; + ivar3 = 3018; + } + setWidgetSprite(ivar2, new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar2, "Id", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(44, new WidgetPointer(-32768,3), ivar3, "Id", new WidgetPointer(arg0)); + script_41(61538418); + return; +} diff --git a/dumps/scripts/3341.cs2 b/dumps/scripts/3341.cs2 new file mode 100644 index 000000000..3af1dacc3 --- /dev/null +++ b/dumps/scripts/3341.cs2 @@ -0,0 +1,33 @@ +void script_3341(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + if (((boolean)getLanguage())) { + if (((boolean)globalint_1177)) { + ivar1 = 3068; + ivar2 = 3067; + ivar3 = 3069; + } else { + ivar1 = 3071; + ivar2 = 3070; + ivar3 = 3072; + } + } else if (((boolean)globalint_1177)) { + ivar1 = 3014; + ivar2 = 3013; + ivar3 = 3015; + } else { + ivar1 = 3017; + ivar2 = 3016; + ivar3 = 3018; + } + setWidgetSprite(ivar2, new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar2, "Id", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(44, new WidgetPointer(-32768,3), ivar3, "Id", new WidgetPointer(arg0)); + script_41(61538418); + return; +} diff --git a/dumps/scripts/3342.cs2 b/dumps/scripts/3342.cs2 new file mode 100644 index 000000000..c25542235 --- /dev/null +++ b/dumps/scripts/3342.cs2 @@ -0,0 +1,33 @@ +void script_3342(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + if (((boolean)getLanguage())) { + if (((boolean)globalint_1178)) { + ivar1 = 3068; + ivar2 = 3067; + ivar3 = 3069; + } else { + ivar1 = 3071; + ivar2 = 3070; + ivar3 = 3072; + } + } else if (((boolean)globalint_1178)) { + ivar1 = 3014; + ivar2 = 3013; + ivar3 = 3015; + } else { + ivar1 = 3017; + ivar2 = 3016; + ivar3 = 3018; + } + setWidgetSprite(ivar2, new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar2, "Id", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(44, new WidgetPointer(-32768,3), ivar3, "Id", new WidgetPointer(arg0)); + script_41(61538418); + return; +} diff --git a/dumps/scripts/3343.cs2 b/dumps/scripts/3343.cs2 new file mode 100644 index 000000000..26c5c7bc6 --- /dev/null +++ b/dumps/scripts/3343.cs2 @@ -0,0 +1,33 @@ +void script_3343(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + if (((boolean)getLanguage())) { + if (((boolean)globalint_1179)) { + ivar1 = 3068; + ivar2 = 3067; + ivar3 = 3069; + } else { + ivar1 = 3071; + ivar2 = 3070; + ivar3 = 3072; + } + } else if (((boolean)globalint_1179)) { + ivar1 = 3014; + ivar2 = 3013; + ivar3 = 3015; + } else { + ivar1 = 3017; + ivar2 = 3016; + ivar3 = 3018; + } + setWidgetSprite(ivar2, new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar2, "Id", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(44, new WidgetPointer(-32768,3), ivar3, "Id", new WidgetPointer(arg0)); + script_41(61538418); + return; +} diff --git a/dumps/scripts/3344.cs2 b/dumps/scripts/3344.cs2 new file mode 100644 index 000000000..f5b2ada34 --- /dev/null +++ b/dumps/scripts/3344.cs2 @@ -0,0 +1,4 @@ +void script_3344() { + script_3345(); + return; +} diff --git a/dumps/scripts/3345.cs2 b/dumps/scripts/3345.cs2 new file mode 100644 index 000000000..cd4327564 --- /dev/null +++ b/dumps/scripts/3345.cs2 @@ -0,0 +1,8 @@ +void script_3345() { + if (((boolean)globalint_1175)) { + script_1163(61538364, -1, 61538418, 25, 200, "P1: Shared XP is ON"); + } else { + script_1163(61538364, -1, 61538418, 25, 200, "P1: Shared XP is OFF"); + } + return; +} diff --git a/dumps/scripts/3346.cs2 b/dumps/scripts/3346.cs2 new file mode 100644 index 000000000..bff2de324 --- /dev/null +++ b/dumps/scripts/3346.cs2 @@ -0,0 +1,4 @@ +void script_3346() { + script_3347(); + return; +} diff --git a/dumps/scripts/3347.cs2 b/dumps/scripts/3347.cs2 new file mode 100644 index 000000000..725a2f394 --- /dev/null +++ b/dumps/scripts/3347.cs2 @@ -0,0 +1,8 @@ +void script_3347() { + if (((boolean)globalint_1176)) { + script_1163(61538367, -1, 61538418, 25, 200, "P2: Shared XP is ON"); + } else { + script_1163(61538367, -1, 61538418, 25, 200, "P2: Shared XP is OFF"); + } + return; +} diff --git a/dumps/scripts/3348.cs2 b/dumps/scripts/3348.cs2 new file mode 100644 index 000000000..44bae40cf --- /dev/null +++ b/dumps/scripts/3348.cs2 @@ -0,0 +1,4 @@ +void script_3348() { + script_3349(); + return; +} diff --git a/dumps/scripts/3349.cs2 b/dumps/scripts/3349.cs2 new file mode 100644 index 000000000..911d0a43c --- /dev/null +++ b/dumps/scripts/3349.cs2 @@ -0,0 +1,8 @@ +void script_3349() { + if (((boolean)globalint_1177)) { + script_1163(61538370, -1, 61538418, 25, 200, "P3: Shared XP is ON"); + } else { + script_1163(61538370, -1, 61538418, 25, 200, "P3: Shared XP is OFF"); + } + return; +} diff --git a/dumps/scripts/335.cs2 b/dumps/scripts/335.cs2 new file mode 100644 index 000000000..6ce40d7bc --- /dev/null +++ b/dumps/scripts/335.cs2 @@ -0,0 +1,9 @@ +cs2func_script_335_struct(2,0,0) script_335(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + ivar4 = script_338(arg3); + ivar5 = divide(multiply(arg2, 1000), ivar4); + ivar6 = subtract(arg2, ivar5); + return newstruct cs2func_script_335_struct(add(arg0, ivar5), add(arg1, ivar6)); +} diff --git a/dumps/scripts/3350.cs2 b/dumps/scripts/3350.cs2 new file mode 100644 index 000000000..fd06c8d7a --- /dev/null +++ b/dumps/scripts/3350.cs2 @@ -0,0 +1,4 @@ +void script_3350() { + script_3351(); + return; +} diff --git a/dumps/scripts/3351.cs2 b/dumps/scripts/3351.cs2 new file mode 100644 index 000000000..40f9e40ba --- /dev/null +++ b/dumps/scripts/3351.cs2 @@ -0,0 +1,8 @@ +void script_3351() { + if (((boolean)globalint_1178)) { + script_1163(61538373, -1, 61538418, 25, 200, "P4: Shared XP is ON"); + } else { + script_1163(61538373, -1, 61538418, 25, 200, "P4: Shared XP is OFF"); + } + return; +} diff --git a/dumps/scripts/3352.cs2 b/dumps/scripts/3352.cs2 new file mode 100644 index 000000000..f7d128cee --- /dev/null +++ b/dumps/scripts/3352.cs2 @@ -0,0 +1,4 @@ +void script_3352() { + script_3353(); + return; +} diff --git a/dumps/scripts/3353.cs2 b/dumps/scripts/3353.cs2 new file mode 100644 index 000000000..05e771911 --- /dev/null +++ b/dumps/scripts/3353.cs2 @@ -0,0 +1,8 @@ +void script_3353() { + if (((boolean)globalint_1179)) { + script_1163(61538376, -1, 61538418, 25, 200, "P5: Shared XP is ON"); + } else { + script_1163(61538376, -1, 61538418, 25, 200, "P5: Shared XP is OFF"); + } + return; +} diff --git a/dumps/scripts/3354.cs2 b/dumps/scripts/3354.cs2 new file mode 100644 index 000000000..a39356eaa --- /dev/null +++ b/dumps/scripts/3354.cs2 @@ -0,0 +1,17 @@ +cs2func_script_3354_struct(1,1,0) script_3354(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_3354_struct(0, "Bosses"); + case 1: + return newstruct cs2func_script_3354_struct(0, "Floors"); + case 2: + return newstruct cs2func_script_3354_struct(0, "Item Binding"); + case 3: + return newstruct cs2func_script_3354_struct(0, "Rewards"); + case 4: + return newstruct cs2func_script_3354_struct(0, "Areas"); + case 5: + return newstruct cs2func_script_3354_struct(0, "Milestones"); + } + return newstruct cs2func_script_3354_struct(-1, ""); +} diff --git a/dumps/scripts/3355.cs2 b/dumps/scripts/3355.cs2 new file mode 100644 index 000000000..139862c51 --- /dev/null +++ b/dumps/scripts/3355.cs2 @@ -0,0 +1,338 @@ +cs2func_script_3355_struct(2,2,0) script_3355(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_3355_struct(1, 18619, "Gluttonous behemoth", "You can now fight " + "" + "gluttonous behemoths" + "" + " in Daemonheim."); + case 1: + return newstruct cs2func_script_3355_struct(1, 18617, "Astea Frostweb", "You can now fight " + "" + "Astea Frostweb" + "" + " in Daemonheim."); + case 2: + return newstruct cs2func_script_3355_struct(1, 18625, "Icy Bones", "You can now fight " + "" + "Icy Bones" + "" + " in Daemonheim."); + case 3: + return newstruct cs2func_script_3355_struct(5, 18628, "Luminescent icefiend", "You can now fight " + "" + "luminescent icefiends" + "" + " in Daemonheim."); + case 4: + return newstruct cs2func_script_3355_struct(11, 18621, "Plane-freezer Lakhrahnaz", "You can now fight " + "" + "Plane-freezer Lakhrahnaz" + "" + " in Daemonheim."); + case 5: + return newstruct cs2func_script_3355_struct(17, 18623, "To'Kash the Bloodchiller", "You can now fight " + "" + "To'Kash the Bloodchiller" + "" + " in Daemonheim."); + case 6: + return newstruct cs2func_script_3355_struct(23, 18618, "Skeletal Horde", "You can now fight " + "" + "skeletal hordes" + "" + " in Daemonheim."); + case 7: + return newstruct cs2func_script_3355_struct(23, 18624, "Hobgoblin Geomancer", "You can now fight the " + "" + "Geomancer Shaman" + "" + " in Daemonheim."); + case 8: + return newstruct cs2func_script_3355_struct(23, 19699, "Bulwark beast", "You can now fight " + "" + "bulwark beasts" + "" + " in Daemonheim."); + case 9: + return newstruct cs2func_script_3355_struct(29, 18632, "Unholy cursebearer", "You can now fight " + "" + "unholy cursebearers" + "" + " in Daemonheim."); + case 10: + return newstruct cs2func_script_3355_struct(35, 18622, "Rammernaut", "You can now fight " + "" + "rammernauts" + "" + " in Daemonheim."); + case 11: + return newstruct cs2func_script_3355_struct(35, 18633, "Stomp", "You can now fight " + "" + "stomps" + "" + " in Daemonheim."); + case 12: + return newstruct cs2func_script_3355_struct(35, 19697, "Har'Lakk the Riftsplitter", "You can now fight " + "" + "Har'Lakk the Riftsplitter" + "" + " in Daemonheim."); + case 13: + return newstruct cs2func_script_3355_struct(39, 18627, "Lexicus Runewright", "You can now fight " + "" + "Lexicus Runewright" + "" + " in Daemonheim."); + case 14: + return newstruct cs2func_script_3355_struct(45, 18630, "Sagittare", "You can now fight " + "" + "sagittares" + "" + " in Daemonheim."); + case 15: + return newstruct cs2func_script_3355_struct(51, 18631, "Night-gazer Khighorahk", "You can now fight " + "" + "Night-gazer Khighorahk" + "" + " in Daemonheim."); + case 16: + return newstruct cs2func_script_3355_struct(59, 18626, "Shadow-forger Ihlakhizan", "You can now fight " + "" + "Shadow-forger Ihlakhizan" + "" + " in Daemonheim."); + case 17: + return newstruct cs2func_script_3355_struct(65, 19696, "Bal'Lak the Pummeller", "You can now fight " + "" + "Bal'Lak the Pummeller" + "" + " in Daemonheim."); + case 18: + return newstruct cs2func_script_3355_struct(71, 19694, "Members: Skeletal trio", "Members can now fight the " + "" + "skeletal trio" + "" + " in Daemonheim."); + case 19: + return newstruct cs2func_script_3355_struct(71, 19695, "Members: Runebound behemoth", "Members can now fight " + "" + "runebound behemoths" + "" + " in Daemonheim."); + case 20: + return newstruct cs2func_script_3355_struct(71, 19692, "Members: Gravecreeper", "Members can now fight " + "" + "Grave Creeper" + "" + " in Daemonheim."); + case 21: + return newstruct cs2func_script_3355_struct(77, 19691, "Members: Necrolord", "Members can now fight " + "" + "necrolords" + "" + " in Daemonheim."); + case 22: + return newstruct cs2func_script_3355_struct(83, 19693, "Members: Flesh-spoiler Haasghenahk", "Members can now fight " + "" + "Flesh-spoiler Haasghenahk" + "" + " in Daemonheim."); + case 23: + return newstruct cs2func_script_3355_struct(89, 19698, "Members: Yk'Lagor the Thunderous", "Members can now fight " + "" + "Yk'Lagor the Thunderous" + "" + " in Daemonheim."); + case 24: + return newstruct cs2func_script_3355_struct(95, 19885, "Members: Blink", "Members can now fight " + "" + "Blink" + "" + " in Daemonheim."); + case 25: + return newstruct cs2func_script_3355_struct(95, 19883, "Members: Warped gulega", "Members can now fight " + "" + "warped gulega" + "" + " in Daemonheim."); + case 26: + return newstruct cs2func_script_3355_struct(95, 19884, "Members: Dreadnaut", "Members can now fight " + "" + "dreadnauts" + "" + " in Daemonheim."); + case 27: + return newstruct cs2func_script_3355_struct(101, 19882, "Members: Hope devourer", "Members can now fight " + "" + "hope devourers" + "" + " in Daemonheim."); + case 28: + return newstruct cs2func_script_3355_struct(107, 19881, "Members: World-gorger Shukarhazh", "Members can now fight " + "" + "World-gorger Shukarhazh" + "" + " in Daemonheim."); + case 29: + return newstruct cs2func_script_3355_struct(113, 19880, "Members: Kal'Ger the Warmonger", "Members can now fight " + "" + "Kal'Ger the Warmonger" + "" + " in Daemonheim."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_3355_struct(1, 18579, "Floor 1", "You can now access floor " + "" + "1" + "" + " of Daemonheim."); + case 1: + return newstruct cs2func_script_3355_struct(3, 18579, "Floor 2", "You can now access floor " + "" + "2" + "" + " of Daemonheim (once the previous floors are complete)."); + case 2: + return newstruct cs2func_script_3355_struct(5, 18579, "Floor 3", "You can now access floor " + "" + "3" + "" + " of Daemonheim (once the previous floors are complete)."); + case 3: + return newstruct cs2func_script_3355_struct(7, 18579, "Floor 4", "You can now access floor " + "" + "4" + "" + " of Daemonheim (once the previous floors are complete)."); + case 4: + return newstruct cs2func_script_3355_struct(9, 18579, "Floor 5", "You can now access floor " + "" + "5" + "" + " of Daemonheim (once the previous floors are complete)."); + case 5: + return newstruct cs2func_script_3355_struct(11, 18579, "Floor 6", "You can now access floor " + "" + "6" + "" + " of Daemonheim (once the previous floors are complete)."); + case 6: + return newstruct cs2func_script_3355_struct(13, 18579, "Floor 7", "You can now access floor " + "" + "7" + "" + " of Daemonheim (once the previous floors are complete)."); + case 7: + return newstruct cs2func_script_3355_struct(15, 18579, "Floor 8", "You can now access floor " + "" + "8" + "" + " of Daemonheim (once the previous floors are complete)."); + case 8: + return newstruct cs2func_script_3355_struct(17, 18579, "Floor 9", "You can now access floor " + "" + "9" + "" + " of Daemonheim (once the previous floors are complete)."); + case 9: + return newstruct cs2func_script_3355_struct(19, 18579, "Floor 10", "You can now access floor " + "" + "10" + "" + " of Daemonheim (once the previous floors are complete)."); + case 10: + return newstruct cs2func_script_3355_struct(21, 18579, "Floor 11", "You can now access floor " + "" + "11" + "" + " of Daemonheim (once the previous floors are complete)."); + case 11: + return newstruct cs2func_script_3355_struct(23, 18578, "Floor 12", "You can now access floor " + "" + "12" + "" + " of Daemonheim (once the previous floors are complete)."); + case 12: + return newstruct cs2func_script_3355_struct(25, 18578, "Floor 13", "You can now access floor " + "" + "13" + "" + " of Daemonheim (once the previous floors are complete)."); + case 13: + return newstruct cs2func_script_3355_struct(27, 18578, "Floor 14", "You can now access floor " + "" + "14" + "" + " of Daemonheim (once the previous floors are complete)."); + case 14: + return newstruct cs2func_script_3355_struct(29, 18578, "Floor 15", "You can now access floor " + "" + "15" + "" + " of Daemonheim (once the previous floors are complete)."); + case 15: + return newstruct cs2func_script_3355_struct(31, 18578, "Floor 16", "You can now access floor " + "" + "16" + "" + " of Daemonheim (once the previous floors are complete)."); + case 16: + return newstruct cs2func_script_3355_struct(33, 18578, "Floor 17", "You can now access floor " + "" + "17" + "" + " of Daemonheim (once the previous floors are complete)."); + case 17: + return newstruct cs2func_script_3355_struct(35, 18577, "Floor 18", "You can now access floor " + "" + "18" + "" + " of Daemonheim (once the previous floors are complete)."); + case 18: + return newstruct cs2func_script_3355_struct(37, 18577, "Floor 19", "You can now access floor " + "" + "19" + "" + " of Daemonheim (once the previous floors are complete)."); + case 19: + return newstruct cs2func_script_3355_struct(39, 18577, "Floor 20", "You can now access floor " + "" + "20" + "" + " of Daemonheim (once the previous floors are complete)."); + case 20: + return newstruct cs2func_script_3355_struct(41, 18577, "Floor 21", "You can now access floor " + "" + "21" + "" + " of Daemonheim (once the previous floors are complete)."); + case 21: + return newstruct cs2func_script_3355_struct(43, 18577, "Floor 22", "You can now access floor " + "" + "22" + "" + " of Daemonheim (once the previous floors are complete)."); + case 22: + return newstruct cs2func_script_3355_struct(45, 18577, "Floor 23", "You can now access floor " + "" + "23" + "" + " of Daemonheim (once the previous floors are complete)."); + case 23: + return newstruct cs2func_script_3355_struct(47, 18577, "Floor 24", "You can now access floor " + "" + "24" + "" + " of Daemonheim (once the previous floors are complete)."); + case 24: + return newstruct cs2func_script_3355_struct(49, 18577, "Floor 25", "You can now access floor " + "" + "25" + "" + " of Daemonheim (once the previous floors are complete)."); + case 25: + return newstruct cs2func_script_3355_struct(51, 18577, "Floor 26", "You can now access floor " + "" + "26" + "" + " of Daemonheim (once the previous floors are complete)."); + case 26: + return newstruct cs2func_script_3355_struct(53, 18577, "Floor 27", "You can now access floor " + "" + "27" + "" + " of Daemonheim (once the previous floors are complete)."); + case 27: + return newstruct cs2func_script_3355_struct(55, 18577, "Floor 28", "You can now access floor " + "" + "28" + "" + " of Daemonheim (once the previous floors are complete)."); + case 28: + return newstruct cs2func_script_3355_struct(57, 18577, "Floor 29", "You can now access floor " + "" + "29" + "" + " of Daemonheim (once the previous floors are complete)."); + case 29: + return newstruct cs2func_script_3355_struct(59, 18578, "Floor 30", "You can now access floor " + "" + "30" + "" + " of Daemonheim (once the previous floors are complete)."); + case 30: + return newstruct cs2func_script_3355_struct(61, 18578, "Floor 31", "You can now access floor " + "" + "31" + "" + " of Daemonheim (once the previous floors are complete)."); + case 31: + return newstruct cs2func_script_3355_struct(63, 18578, "Floor 32", "You can now access floor " + "" + "32" + "" + " of Daemonheim (once the previous floors are complete)."); + case 32: + return newstruct cs2func_script_3355_struct(65, 18578, "Floor 33", "You can now access floor " + "" + "33" + "" + " of Daemonheim (once the previous floors are complete)."); + case 33: + return newstruct cs2func_script_3355_struct(67, 18578, "Floor 34", "You can now access floor " + "" + "34" + "" + " of Daemonheim (once the previous floors are complete)."); + case 34: + return newstruct cs2func_script_3355_struct(69, 18578, "Floor 35", "You can now access floor " + "" + "35" + "" + " of Daemonheim (once the previous floors are complete)."); + case 35: + return newstruct cs2func_script_3355_struct(71, 19690, "Members: Floor 36", "Members can now access floor " + "" + "36" + "" + " of Daemonheim (once the previous floors are complete)."); + case 36: + return newstruct cs2func_script_3355_struct(73, 19690, "Members: Floor 37", "Members can now access floor " + "" + "37" + "" + " of Daemonheim (once the previous floors are complete)."); + case 37: + return newstruct cs2func_script_3355_struct(75, 19690, "Members: Floor 38", "Members can now access floor " + "" + "38" + "" + " of Daemonheim (once the previous floors are complete)."); + case 38: + return newstruct cs2func_script_3355_struct(77, 19690, "Members: Floor 39", "Members can now access floor " + "" + "39" + "" + " of Daemonheim (once the previous floors are complete)."); + case 39: + return newstruct cs2func_script_3355_struct(79, 19690, "Members: Floor 40", "Members can now access floor " + "" + "40" + "" + " of Daemonheim (once the previous floors are complete)."); + case 40: + return newstruct cs2func_script_3355_struct(81, 19690, "Members: Floor 41", "Members can now access floor " + "" + "41" + "" + " of Daemonheim (once the previous floors are complete)."); + case 41: + return newstruct cs2func_script_3355_struct(83, 19690, "Members: Floor 42", "Members can now access floor " + "" + "42" + "" + " of Daemonheim (once the previous floors are complete)."); + case 42: + return newstruct cs2func_script_3355_struct(85, 19690, "Members: Floor 43", "Members can now access floor " + "" + "43" + "" + " of Daemonheim (once the previous floors are complete)."); + case 43: + return newstruct cs2func_script_3355_struct(87, 19690, "Members: Floor 44", "Members can now access floor " + "" + "44" + "" + " of Daemonheim (once the previous floors are complete)."); + case 44: + return newstruct cs2func_script_3355_struct(89, 19690, "Members: Floor 45", "Members can now access floor " + "" + "45" + "" + " of Daemonheim (once the previous floors are complete)."); + case 45: + return newstruct cs2func_script_3355_struct(91, 19690, "Members: Floor 46", "Members can now access floor " + "" + "46" + "" + " of Daemonheim (once the previous floors are complete)."); + case 46: + return newstruct cs2func_script_3355_struct(93, 19690, "Members: Floor 47", "Members can now access floor " + "" + "47" + "" + " of Daemonheim (once the previous floors are complete)."); + case 47: + return newstruct cs2func_script_3355_struct(95, 19896, "Members: Floor 48", "Members can now access floor " + "" + "48" + "" + " of Daemonheim (once the previous floors are complete)."); + case 48: + return newstruct cs2func_script_3355_struct(97, 19896, "Members: Floor 49", "Members can now access floor " + "" + "49" + "" + " of Daemonheim (once the previous floors are complete)."); + case 49: + return newstruct cs2func_script_3355_struct(99, 19896, "Members: Floor 50", "Members can now access floor " + "" + "50" + "" + " of Daemonheim (once the previous floors are complete)."); + case 50: + return newstruct cs2func_script_3355_struct(101, 19896, "Members: Floor 51", "Members can now access floor " + "" + "51" + "" + " of Daemonheim (once the previous floors are complete)."); + case 51: + return newstruct cs2func_script_3355_struct(103, 19896, "Members: Floor 52", "Members can now access floor " + "" + "52" + "" + " of Daemonheim (once the previous floors are complete)."); + case 52: + return newstruct cs2func_script_3355_struct(105, 19896, "Members: Floor 53", "Members can now access floor " + "" + "53" + "" + " of Daemonheim (once the previous floors are complete)."); + case 53: + return newstruct cs2func_script_3355_struct(107, 19896, "Members: Floor 54", "Members can now access floor " + "" + "54" + "" + " of Daemonheim (once the previous floors are complete)."); + case 54: + return newstruct cs2func_script_3355_struct(109, 19896, "Members: Floor 55", "Members can now access floor " + "" + "55" + "" + " of Daemonheim (once the previous floors are complete)."); + case 55: + return newstruct cs2func_script_3355_struct(111, 19896, "Members: Floor 56", "Members can now access floor " + "" + "56" + "" + " of Daemonheim (once the previous floors are complete)."); + case 56: + return newstruct cs2func_script_3355_struct(113, 19896, "Members: Floor 57", "Members can now access floor " + "" + "57" + "" + " of Daemonheim (once the previous floors are complete)."); + case 57: + return newstruct cs2func_script_3355_struct(115, 19896, "Members: Floor 58", "Members can now access floor " + "" + "58" + "" + " of Daemonheim (once the previous floors are complete)."); + case 58: + return newstruct cs2func_script_3355_struct(117, 19896, "Members: Floor 59", "Members can now access floor " + "" + "59" + "" + " of Daemonheim (once the previous floors are complete)."); + case 59: + return newstruct cs2func_script_3355_struct(119, 19896, "Members: Floor 60", "Members can now access floor " + "" + "60" + "" + " of Daemonheim (once the previous floors are complete)."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_3355_struct(1, 16405, "Bind one item", "You can now bind " + "" + "one item" + "" + " within Daemonheim."); + case 1: + return newstruct cs2func_script_3355_struct(1, 16405, "Bind rune or ammo item", "You can now bind " + "" + "up to 125 of one type of rune or ammunition" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_3355_struct(50, 16415, "Bind two items", "You can now bind " + "" + "two items" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_3355_struct(100, 16423, "Bind three items", "You can now bind " + "" + "three items" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_3355_struct(120, 16425, "Bind four items", "You can now bind " + "" + "four items" + "" + " within Daemonheim."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_3355_struct(21, 18337, "Members: Bonecrusher" + "
" + " (with 21 Prayer)", "Members can now use " + "" + "bonecrushers" + "" + ". (They also need level 21 Prayer.)"); + case 1: + return newstruct cs2func_script_3355_struct(21, 19675, "Members: Herbicide" + "
" + " (with 21 Herblore)", "Members can now use " + "" + "herbicide" + "" + ". (They also need level 21 Herblore.)"); + case 2: + return newstruct cs2func_script_3355_struct(25, 18338, "Gem bag" + "
" + " (with 25 Crafting)", "You can now use " + "" + "gem bags" + "" + ". (You also need level 25 Crafting.)"); + case 3: + return newstruct cs2func_script_3355_struct(25, 18336, "Members: Scroll of life" + "
" + " (with 25 Farming)", "Members can now use the " + "" + "scroll of life" + "" + ". (They also need level 25 Farming.)"); + case 4: + return newstruct cs2func_script_3355_struct(30, 18333, "Arcane pulse necklace" + "
" + " (with 30 Magic)", "You can now wear " + "" + "arcane pulse necklaces" + "" + ". (You also need level 30 Magic.)"); + case 5: + return newstruct cs2func_script_3355_struct(30, 19671, "Magical blastbox" + "
" + " (with 30 Magic and 30 Runecrafting)", "You can now use " + "" + "magical blastboxes" + "" + ". (You also need level 30 Magic and 30 Runecrafting.)"); + case 6: + return newstruct cs2func_script_3355_struct(30, 19886, "Twisted bird skull necklace" + "
" + " (with 30 Prayer)", "You can now wear " + "" + "twisted bird skull necklaces" + "" + ". (You also need level 30 Prayer.)"); + case 7: + return newstruct cs2func_script_3355_struct(35, 18339, "Coal bag" + "
" + " (with 35 Mining)", "You can now use " + "" + "coal bags" + "" + ". (You also need level 35 Mining.)"); + case 8: + return newstruct cs2func_script_3355_struct(45, 18330, "Longbow sight" + "
" + " (with 45 Ranged)", "You can now use " + "" + "longbow sights" + "" + ". (You also need level 45 Ranged.)"); + case 9: + return newstruct cs2func_script_3355_struct(45, 18367, "Gravite longsword" + "
" + " (with 45 Attack)", "You can now wield " + "" + "gravite longswords" + "" + ". (You also need level 45 Attack.)"); + case 10: + return newstruct cs2func_script_3355_struct(45, 18365, "Gravite rapier" + "
" + " (with 45 Attack)", "You can now wield " + "" + "gravite rapiers" + "" + ". (You also need level 45 Attack.)"); + case 11: + return newstruct cs2func_script_3355_struct(45, 18373, "Gravite shortbow" + "
" + " Ammo: Arrows up to rune" + "
" + " (with 45 Ranged)", "You can now wield " + "" + "gravite shortbows" + "" + ". (You also need level 45 Ranged.)"); + case 12: + return newstruct cs2func_script_3355_struct(45, 18371, "Gravite staff" + "
" + " (with 45 Magic)", "You can now wield " + "" + "gravite staves" + "" + ". (You also need level 45 Magic.)"); + case 13: + return newstruct cs2func_script_3355_struct(45, 18369, "Gravite two-handed sword" + "
" + " (with 45 Attack)", "You can now wield " + "" + "gravite two-handed swords" + "" + ". (You also need level 45 Attack.)"); + case 14: + return newstruct cs2func_script_3355_struct(45, 18342, "Law staff" + "
" + " (with 40 Attack and 45 Magic)", "You can now use " + "" + "law staves" + "" + ". (You also need level 40 Attack and level 45 Magic.)"); + case 15: + return newstruct cs2func_script_3355_struct(48, 18346, "Tome of frost" + "
" + " (with 48 Magic)", "You can now use " + "" + "tomes of frost" + "" + ". (You also need level 48 Magic.)"); + case 16: + return newstruct cs2func_script_3355_struct(48, 19892, "Amulet of zealots" + "
" + " (with 48 Prayer)", "You now have the Dungeoneering level required to wear " + "" + "Amulets of hopelessness" + "" + ". (You also need level 48 Prayer.)"); + case 17: + return newstruct cs2func_script_3355_struct(49, 19890, "Members: Wasteless Herblore" + "
" + " (with 49 Herblore)", "Members can now learn the " + "" + "wasteless herblore" + "" + " ability (you also need 49 Herblore.)"); + case 18: + return newstruct cs2func_script_3355_struct(50, 18334, "Arcane blast necklace" + "
" + " (with 50 Magic)", "You can now wear " + "" + "arcane blast necklaces" + "" + ". (You also need level 50 Magic.)"); + case 19: + return newstruct cs2func_script_3355_struct(50, 19893, "Members: Spirit cape" + "
" + " (with 50 Defence and 50 Summoning)", "Members can now wear " + "" + "spirit capes" + "" + " (You also need level 50 Defence and 50 Summoning.)"); + case 20: + return newstruct cs2func_script_3355_struct(53, 18341, "Nature staff" + "
" + " (with 40 Attack and 53 Magic)", "You can now use " + "" + "nature staves" + "" + ". (You also need level 40 Attack and level 53 Magic.)"); + case 21: + return newstruct cs2func_script_3355_struct(55, 19670, "Scroll of efficiency" + "
" + " (with 55 Smithing)", "You can now use " + "" + "scrolls of efficiency" + "" + ". (You also need level 55 Smithing.)"); + case 22: + return newstruct cs2func_script_3355_struct(60, 18340, "Members: Anti-poison totem" + "
" + " (with 60 Defence and 70 Herblore)", "Members can now wield " + "" + "anti-poison totems" + "" + ". (They also need level 60 Defence and level 70 Herblore.)"); + case 23: + return newstruct cs2func_script_3355_struct(60, 19887, "Members: Split dragon tooth necklace" + "
" + " (with 60 Prayer)", "Members now have the Dungeoneering level required to wear " + "" + "Split dragon tooth necklaces" + "" + ". (They also need level 60 Prayer.)"); + case 24: + return newstruct cs2func_script_3355_struct(62, 19669, "Members: Ring of vigour" + "
" + " (with 62 Attack)", "Members can now wear " + "" + "rings of vigour" + "" + ". (They also need level 62 Attack.)"); + case 25: + return newstruct cs2func_script_3355_struct(65, 18343, "Members: Rapid Renewal" + "
" + " (with 65 Prayer)", "Members can now use the " + "" + "Rapid Renewal" + "" + " prayer (bought from Daemonheim). (They also need level 65 Prayer.)"); + case 26: + return newstruct cs2func_script_3355_struct(70, 18335, "Members: Arcane stream necklace" + "
" + " (with 70 Magic)", "Members can now wear " + "" + "arcane stream necklaces" + "" + ". (They also need level 70 Magic.)"); + case 27: + return newstruct cs2func_script_3355_struct(70, 19889, "Members: Celestial surgebox" + "
" + " (with 70 Magic and 70 Runecrafting)", "Members can now use " + "" + "celestial surgeboxes" + "" + ". (They also need level 70 Magic and level 70 Runecrafting.)"); + case 28: + return newstruct cs2func_script_3355_struct(73, 18347, "Members: Mercenary's gloves" + "
" + " (with 73 Ranged)", "Members can now wear " + "" + "mercenary's gloves" + "" + ". (They also need level 73 Ranged.)"); + case 29: + return newstruct cs2func_script_3355_struct(74, 18839, "Members: Rigour" + "
" + " (with 74 Prayer)", "Members can now use the " + "" + "Rigour" + "" + " prayer (bought from Daemonheim). (They also need level 74 Prayer.)"); + case 30: + return newstruct cs2func_script_3355_struct(77, 18344, "Members: Augury" + "
" + " (with 77 Prayer)", "Members can now use the " + "" + "Augury" + "" + " prayer (bought from Daemonheim). (They also need level 77 Prayer.)"); + case 31: + return newstruct cs2func_script_3355_struct(80, 18358, "Members: Chaotic crossbow" + "
" + " Ammo: Bolts up to rune" + "
" + " (with 80 Ranged)", "Members can now wield " + "" + "chaotic crossbows" + "" + ". (They also need level 80 Ranged.)"); + case 32: + return newstruct cs2func_script_3355_struct(80, 18359, "Members: Chaotic kiteshield" + "
" + " (with 80 Defence)", "Members can now wield " + "" + "chaotic kiteshields" + "" + ". (They also need level 80 Defence.)"); + case 33: + return newstruct cs2func_script_3355_struct(80, 18351, "Members: Chaotic longsword" + "
" + " (with 80 Attack)", "Members can now wield " + "" + "chaotic longswords" + "" + ". (They also need level 80 Attack.)"); + case 34: + return newstruct cs2func_script_3355_struct(80, 18353, "Members: Chaotic maul" + "
" + " (with 80 Attack)", "Members can now wield " + "" + "chaotic mauls" + "" + ". (They also need level 80 Attack.)"); + case 35: + return newstruct cs2func_script_3355_struct(80, 18349, "Members: Chaotic rapier" + "
" + " (with 80 Attack)", "Members can now wield " + "" + "chaotic rapiers" + "" + ". (They also need level 80 Attack.)"); + case 36: + return newstruct cs2func_script_3355_struct(80, 18355, "Members: Chaotic staff" + "
" + " (with 80 Magic)", "Members can now wield " + "" + "chaotic staves" + "" + ". (They also need level 80 Magic.)"); + case 37: + return newstruct cs2func_script_3355_struct(80, 18361, "Members: Eagle-eye kiteshield" + "
" + " (with 80 Defence)", "Members can now wield " + "" + "eagle-eye kiteshields" + "" + ". (They also need level 80 Defence.)"); + case 38: + return newstruct cs2func_script_3355_struct(80, 18363, "Members: Farseer kiteshield" + "
" + " (with 80 Defence)", "Members can now wield " + "" + "farseer kiteshields" + "" + ". (They also need level 80 Defence.)"); + case 39: + return newstruct cs2func_script_3355_struct(80, 19894, "Members: Seeker pet" + "
" + " (with 80 Summoning)", "Members can now raise " + "" + "Seekers" + "" + ". (They also need level 80 Summoning.)"); + case 40: + return newstruct cs2func_script_3355_struct(90, 19888, "Members: Demon horn necklace" + "
" + " (with 90 Prayer)", "Members now have the Dungeoneering level required to wear " + "" + "Demon horn necklaces" + "" + ". (They also need level 90 Prayer.)"); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_3355_struct(10, 562, "Members: Edgeville Dungeon chaos druids", "Members can now pass the mysterious entrance in Edgeville Dungeon to reach the chaos druids."); + case 1: + return newstruct cs2func_script_3355_struct(15, 453, "Dwarven Mine hidden mine", "You can now pass the mysterious entrance in the Dwarven Mine to reach the hidden mine."); + case 2: + return newstruct cs2func_script_3355_struct(20, 532, "Edgeville Dungeon hill giants", "You can now pass the mysterious entrance in Edgeville Dungeon to reach the hill giants."); + case 3: + return newstruct cs2func_script_3355_struct(25, 9952, "Karamja Volcano lesser demons", "You can now pass the mysterious entrance in Karamja Volcano to reach the lesser demons."); + case 4: + return newstruct cs2func_script_3355_struct(30, 1517, "Daemonheim woodcutting island", "You can now pass the mysterious entrance in Daemonheim to reach the woodcutting island."); + case 5: + return newstruct cs2func_script_3355_struct(35, 554, "Members: Waterfall fire giants", "Members can now pass the Baxtorian Waterfall mysterious entrance to reach the fire giants."); + case 6: + return newstruct cs2func_script_3355_struct(45, 451, "Mining Guild hidden mine", "You can now pass the mysterious entrance in the Mining Guild to reach the hidden mine."); + case 7: + return newstruct cs2func_script_3355_struct(55, 8137, "Members: Taverley hellhounds", "Members can now pass the mysterious entrance in Taverley Dungeon to reach the hellhounds."); + case 8: + return newstruct cs2func_script_3355_struct(60, 1751, "Members: Taverley blue dragons", "Members can now pass the mysterious entrance in Taverley Dungeon to reach the blue dragons."); + case 9: + return newstruct cs2func_script_3355_struct(65, 8179, "Members: Varrock moss giants", "Members can now pass the mysterious entrance in Varrock Sewers to reach the moss giants."); + case 10: + return newstruct cs2func_script_3355_struct(70, 592, "Members: Chaos Tunnels black demons", "Members can now pass the mysterious entrance in the Chaos Tunnels to reach the black demons."); + case 11: + return newstruct cs2func_script_3355_struct(75, 11254, "Members: Al Kharid hidden mine", "Members can now pass the mysterious entrance in Al Kharid scorpion pit to reach the hidden mine."); + case 12: + return newstruct cs2func_script_3355_struct(80, 8142, "Members: Brimhaven metal dragons", "Members can now pass the mysterious entrance in Brimhaven Dungeon to reach the metal dragons."); + case 13: + return newstruct cs2func_script_3355_struct(85, 18796, "Members: Ice Dungeon frost dragons", "Members can now pass the mysterious entrance in the Asgarnian Ice Dungeon to reach the frost dragons."); + } + break; + case 5: + SWITCH (arg1) { + case 0: + GOTO flow_162 + case 1: + GOTO flow_163 + } + break; + flow_162: + return newstruct cs2func_script_3355_struct(99, 18508, "Skill Mastery", "You have achieved " + "" + "level 99" + "" + " in the " + "" + "Dungeoneering" + "" + " skill." + "
" + "What are you waiting for? Keep going!"); + flow_163: + return newstruct cs2func_script_3355_struct(120, 18509, "True Skill Mastery", "You have achieved " + "" + "level 120" + "" + " in the " + "" + "Dungeoneering" + "" + " skill." + "
" + "This is the highest level for this skill: for real, this time!"); + } + return newstruct cs2func_script_3355_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/3356.cs2 b/dumps/scripts/3356.cs2 new file mode 100644 index 000000000..8e43eebcf --- /dev/null +++ b/dumps/scripts/3356.cs2 @@ -0,0 +1,24 @@ +void script_3356(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = getItemIdInSlotSplit(arg2, arg1); + if (ivar3 == -1) { + setItemOnWidgetMethod2200(-1, 0, new WidgetPointer(arg0)); + setWidgetSize(32, 32, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(arg0)); + setWidgetSprite(cs2method_3408(105, 100, 796, arg1), new WidgetPointer(arg0)); + setWidgetBorderThickness(0, new WidgetPointer(arg0)); + setWidgetShadowColor(new Color(0, 0, 0), new WidgetPointer(arg0)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg0)); + return; + } + setWidgetSize(36, 32, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(2, 0, 0, 1, new WidgetPointer(arg0)); + setItemOnWidgetMethod2200(ivar3, getItemAmtInSlotSplit(arg2, arg1), new WidgetPointer(arg0)); + setWidgetBorderThickness(1, new WidgetPointer(arg0)); + setWidgetShadowColor(new Color(48, 32, 32), new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg0)); + setWidgetContextMenuOption(10, new WidgetPointer(arg0), "Examine" + ""); + cs2method2305(new WidgetPointer(arg0), "" + getItemName(ivar3)); + return; +} diff --git a/dumps/scripts/3357.cs2 b/dumps/scripts/3357.cs2 new file mode 100644 index 000000000..0da7cc8f5 --- /dev/null +++ b/dumps/scripts/3357.cs2 @@ -0,0 +1,46 @@ +cs2func_script_3357_struct(2,1,0) script_3357() { + flow_0: + SWITCH (standart_config_448) { + case 17935: + GOTO flow_1 + case 17936: + GOTO flow_2 + case 17937: + GOTO flow_3 + case 17938: + GOTO flow_4 + case 17939: + GOTO flow_5 + case 17940: + GOTO flow_6 + case 17941: + GOTO flow_7 + case 17942: + GOTO flow_8 + case 17943: + GOTO flow_9 + case 17944: + GOTO flow_10 + } + return newstruct cs2func_script_3357_struct(1, 18027, "Sundering Strike (Tier 1)"); + flow_1: + return newstruct cs2func_script_3357_struct(1, 18027, "Sundering Strike (Tier 1)"); + flow_2: + return newstruct cs2func_script_3357_struct(11, 18028, "Sundering Strike (Tier 2)"); + flow_3: + return newstruct cs2func_script_3357_struct(21, 18029, "Sundering Strike (Tier 3)"); + flow_4: + return newstruct cs2func_script_3357_struct(31, 18030, "Sundering Strike (Tier 4)"); + flow_5: + return newstruct cs2func_script_3357_struct(41, 18031, "Sundering Strike (Tier 5)"); + flow_6: + return newstruct cs2func_script_3357_struct(51, 18032, "Sundering Strike (Tier 6)"); + flow_7: + return newstruct cs2func_script_3357_struct(61, 18033, "Sundering Strike (Tier 7)"); + flow_8: + return newstruct cs2func_script_3357_struct(71, 18034, "Sundering Strike (Tier 8)"); + flow_9: + return newstruct cs2func_script_3357_struct(81, 18035, "Sundering Strike (Tier 9)"); + flow_10: + return newstruct cs2func_script_3357_struct(91, 18036, "Sundering Strike (Tier 10)"); +} diff --git a/dumps/scripts/3358.cs2 b/dumps/scripts/3358.cs2 new file mode 100644 index 000000000..f9a3a93d5 --- /dev/null +++ b/dumps/scripts/3358.cs2 @@ -0,0 +1,46 @@ +cs2func_script_3358_struct(2,1,0) script_3358() { + flow_0: + SWITCH (standart_config_448) { + case 17985: + GOTO flow_1 + case 17986: + GOTO flow_2 + case 17987: + GOTO flow_3 + case 17988: + GOTO flow_4 + case 17989: + GOTO flow_5 + case 17990: + GOTO flow_6 + case 17991: + GOTO flow_7 + case 17992: + GOTO flow_8 + case 17993: + GOTO flow_9 + case 17994: + GOTO flow_10 + } + return newstruct cs2func_script_3358_struct(2, 18037, "Poisonous Shot (Tier 1)"); + flow_1: + return newstruct cs2func_script_3358_struct(2, 18037, "Poisonous Shot (Tier 1)"); + flow_2: + return newstruct cs2func_script_3358_struct(12, 18038, "Poisonous Shot (Tier 2)"); + flow_3: + return newstruct cs2func_script_3358_struct(22, 18039, "Poisonous Shot (Tier 3)"); + flow_4: + return newstruct cs2func_script_3358_struct(32, 18040, "Poisonous Shot (Tier 4)"); + flow_5: + return newstruct cs2func_script_3358_struct(42, 18041, "Poisonous Shot (Tier 5)"); + flow_6: + return newstruct cs2func_script_3358_struct(52, 18042, "Poisonous Shot (Tier 6)"); + flow_7: + return newstruct cs2func_script_3358_struct(62, 18043, "Poisonous Shot (Tier 7)"); + flow_8: + return newstruct cs2func_script_3358_struct(72, 18044, "Poisonous Shot (Tier 8)"); + flow_9: + return newstruct cs2func_script_3358_struct(82, 18045, "Poisonous Shot (Tier 9)"); + flow_10: + return newstruct cs2func_script_3358_struct(92, 18046, "Poisonous Shot (Tier 10)"); +} diff --git a/dumps/scripts/3359.cs2 b/dumps/scripts/3359.cs2 new file mode 100644 index 000000000..b47eb5e7c --- /dev/null +++ b/dumps/scripts/3359.cs2 @@ -0,0 +1,46 @@ +cs2func_script_3359_struct(2,1,0) script_3359() { + flow_0: + SWITCH (standart_config_448) { + case 17945: + GOTO flow_1 + case 17946: + GOTO flow_2 + case 17947: + GOTO flow_3 + case 17948: + GOTO flow_4 + case 17949: + GOTO flow_5 + case 17950: + GOTO flow_6 + case 17951: + GOTO flow_7 + case 17952: + GOTO flow_8 + case 17953: + GOTO flow_9 + case 17954: + GOTO flow_10 + } + return newstruct cs2func_script_3359_struct(3, 18047, "Snaring Wave (Tier 1)"); + flow_1: + return newstruct cs2func_script_3359_struct(3, 18047, "Snaring Wave (Tier 1)"); + flow_2: + return newstruct cs2func_script_3359_struct(13, 18048, "Snaring Wave (Tier 2)"); + flow_3: + return newstruct cs2func_script_3359_struct(23, 18049, "Snaring Wave (Tier 3)"); + flow_4: + return newstruct cs2func_script_3359_struct(33, 18050, "Snaring Wave (Tier 4)"); + flow_5: + return newstruct cs2func_script_3359_struct(43, 18051, "Snaring Wave (Tier 5)"); + flow_6: + return newstruct cs2func_script_3359_struct(53, 18052, "Snaring Wave (Tier 6)"); + flow_7: + return newstruct cs2func_script_3359_struct(63, 18053, "Snaring Wave (Tier 7)"); + flow_8: + return newstruct cs2func_script_3359_struct(73, 18054, "Snaring Wave (Tier 8)"); + flow_9: + return newstruct cs2func_script_3359_struct(83, 18055, "Snaring Wave (Tier 9)"); + flow_10: + return newstruct cs2func_script_3359_struct(93, 18056, "Snaring Wave (Tier 10)"); +} diff --git a/dumps/scripts/336.cs2 b/dumps/scripts/336.cs2 new file mode 100644 index 000000000..36f3cd0bd --- /dev/null +++ b/dumps/scripts/336.cs2 @@ -0,0 +1,292 @@ +void script_336() { + int ivar0; + int ivar1; + int ivar2; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + cs2func_script_335_struct(2,0,0) structdump_4; + cs2func_script_335_struct(2,0,0) structdump_5; + cs2func_script_335_struct(2,0,0) structdump_6; + cs2func_script_335_struct(2,0,0) structdump_7; + cs2func_script_335_struct(2,0,0) structdump_8; + cs2func_script_335_struct(2,0,0) structdump_9; + cs2func_script_335_struct(2,0,0) structdump_10; + cs2func_script_335_struct(2,0,0) structdump_11; + cs2func_script_335_struct(2,0,0) structdump_12; + cs2func_script_335_struct(2,0,0) structdump_13; + cs2func_script_335_struct(2,0,0) structdump_14; + cs2func_script_335_struct(2,0,0) structdump_15; + cs2func_script_335_struct(2,0,0) structdump_16; + cs2func_script_335_struct(2,0,0) structdump_17; + cs2func_script_335_struct(2,0,0) structdump_18; + cs2func_script_335_struct(2,0,0) structdump_19; + cs2func_script_335_struct(2,0,0) structdump_20; + cs2func_script_335_struct(2,0,0) structdump_21; + cs2func_script_335_struct(2,0,0) structdump_22; + cs2func_script_335_struct(2,0,0) structdump_23; + cs2func_script_335_struct(2,0,0) structdump_24; + cs2func_script_335_struct(2,0,0) structdump_25; + cs2func_script_335_struct(2,0,0) structdump_26; + cs2func_script_335_struct(2,0,0) structdump_27; + cs2func_script_335_struct(2,0,0) structdump_28; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + if (globalint_1243 < getSkillXp(0)) { + ivar2 = subtract(getSkillXp(0), globalint_1243); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_4 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_4.intpart_1; + ivar0 = structdump_4.intpart_0; + } + if (globalint_1244 < getSkillXp(2)) { + ivar2 = subtract(getSkillXp(2), globalint_1244); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_5 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_5.intpart_1; + ivar0 = structdump_5.intpart_0; + } + if (globalint_1245 < getSkillXp(1)) { + ivar2 = subtract(getSkillXp(1), globalint_1245); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_6 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_6.intpart_1; + ivar0 = structdump_6.intpart_0; + } + if (globalint_1246 < getSkillXp(4)) { + ivar2 = subtract(getSkillXp(4), globalint_1246); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_7 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_7.intpart_1; + ivar0 = structdump_7.intpart_0; + } + if (globalint_1247 < getSkillXp(5)) { + ivar2 = subtract(getSkillXp(5), globalint_1247); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_8 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_8.intpart_1; + ivar0 = structdump_8.intpart_0; + } + if (globalint_1248 < getSkillXp(6)) { + ivar2 = subtract(getSkillXp(6), globalint_1248); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_9 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_9.intpart_1; + ivar0 = structdump_9.intpart_0; + } + if (globalint_1249 < getSkillXp(20)) { + ivar2 = subtract(getSkillXp(20), globalint_1249); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_10 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_10.intpart_1; + ivar0 = structdump_10.intpart_0; + } + if (globalint_1250 < getSkillXp(3)) { + ivar2 = subtract(getSkillXp(3), globalint_1250); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_11 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_11.intpart_1; + ivar0 = structdump_11.intpart_0; + } + if (globalint_1251 < getSkillXp(12)) { + ivar2 = subtract(getSkillXp(12), globalint_1251); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_12 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_12.intpart_1; + ivar0 = structdump_12.intpart_0; + } + if (globalint_1252 < getSkillXp(14)) { + ivar2 = subtract(getSkillXp(14), globalint_1252); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_13 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_13.intpart_1; + ivar0 = structdump_13.intpart_0; + } + if (globalint_1253 < getSkillXp(13)) { + ivar2 = subtract(getSkillXp(13), globalint_1253); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_14 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_14.intpart_1; + ivar0 = structdump_14.intpart_0; + } + if (globalint_1254 < getSkillXp(10)) { + ivar2 = subtract(getSkillXp(10), globalint_1254); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_15 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_15.intpart_1; + ivar0 = structdump_15.intpart_0; + } + if (globalint_1255 < getSkillXp(7)) { + ivar2 = subtract(getSkillXp(7), globalint_1255); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_16 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_16.intpart_1; + ivar0 = structdump_16.intpart_0; + } + if (globalint_1256 < getSkillXp(11)) { + ivar2 = subtract(getSkillXp(11), globalint_1256); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_17 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_17.intpart_1; + ivar0 = structdump_17.intpart_0; + } + if (globalint_1257 < getSkillXp(8)) { + ivar2 = subtract(getSkillXp(8), globalint_1257); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_18 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_18.intpart_1; + ivar0 = structdump_18.intpart_0; + } + if (globalint_1258 < getSkillXp(16)) { + ivar2 = subtract(getSkillXp(16), globalint_1258); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_19 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_19.intpart_1; + ivar0 = structdump_19.intpart_0; + } + if (globalint_1259 < getSkillXp(15)) { + ivar2 = subtract(getSkillXp(15), globalint_1259); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_20 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_20.intpart_1; + ivar0 = structdump_20.intpart_0; + } + if (globalint_1260 < getSkillXp(17)) { + ivar2 = subtract(getSkillXp(17), globalint_1260); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_21 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_21.intpart_1; + ivar0 = structdump_21.intpart_0; + } + if (globalint_1261 < getSkillXp(9)) { + ivar2 = subtract(getSkillXp(9), globalint_1261); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_22 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_22.intpart_1; + ivar0 = structdump_22.intpart_0; + } + if (globalint_1262 < getSkillXp(18)) { + ivar2 = subtract(getSkillXp(18), globalint_1262); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_23 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_23.intpart_1; + ivar0 = structdump_23.intpart_0; + } + if (globalint_1263 < getSkillXp(19)) { + ivar2 = subtract(getSkillXp(19), globalint_1263); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_24 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_24.intpart_1; + ivar0 = structdump_24.intpart_0; + } + if (globalint_1264 < getSkillXp(22)) { + ivar2 = subtract(getSkillXp(22), globalint_1264); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_25 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_25.intpart_1; + ivar0 = structdump_25.intpart_0; + } + if (globalint_1265 < getSkillXp(21)) { + ivar2 = subtract(getSkillXp(21), globalint_1265); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_26 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_26.intpart_1; + ivar0 = structdump_26.intpart_0; + } + if (globalint_1266 < getSkillXp(23)) { + ivar2 = subtract(getSkillXp(23), globalint_1266); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_27 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_27.intpart_1; + ivar0 = structdump_27.intpart_0; + } + if (globalint_1267 < getSkillXp(24)) { + ivar2 = subtract(getSkillXp(24), globalint_1267); + stack_dump0 = ivar0; + stack_dump1 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = 0; + structdump_28 = script_335(stack_dump0, stack_dump1, stack_dump2, stack_dump3); + ivar1 = structdump_28.intpart_1; + ivar0 = structdump_28.intpart_0; + } + if (((boolean)ivar0)) { + return; + } + script_337(ivar0, ivar1, 0); + return; +} diff --git a/dumps/scripts/3360.cs2 b/dumps/scripts/3360.cs2 new file mode 100644 index 000000000..0fa61f7da --- /dev/null +++ b/dumps/scripts/3360.cs2 @@ -0,0 +1,46 @@ +cs2func_script_3360_struct(2,1,0) script_3360() { + flow_0: + SWITCH (standart_config_448) { + case 17955: + GOTO flow_1 + case 17956: + GOTO flow_2 + case 17957: + GOTO flow_3 + case 17958: + GOTO flow_4 + case 17959: + GOTO flow_5 + case 17960: + GOTO flow_6 + case 17961: + GOTO flow_7 + case 17962: + GOTO flow_8 + case 17963: + GOTO flow_9 + case 17964: + GOTO flow_10 + } + return newstruct cs2func_script_3360_struct(5, 18057, "Aptitude (Tier 1)"); + flow_1: + return newstruct cs2func_script_3360_struct(5, 18057, "Aptitude (Tier 1)"); + flow_2: + return newstruct cs2func_script_3360_struct(15, 18058, "Aptitude (Tier 2)"); + flow_3: + return newstruct cs2func_script_3360_struct(25, 18059, "Aptitude (Tier 3)"); + flow_4: + return newstruct cs2func_script_3360_struct(35, 18060, "Aptitude (Tier 4)"); + flow_5: + return newstruct cs2func_script_3360_struct(45, 18061, "Aptitude (Tier 5)"); + flow_6: + return newstruct cs2func_script_3360_struct(55, 18062, "Aptitude (Tier 6)"); + flow_7: + return newstruct cs2func_script_3360_struct(65, 18063, "Aptitude (Tier 7)"); + flow_8: + return newstruct cs2func_script_3360_struct(75, 18064, "Aptitude (Tier 8)"); + flow_9: + return newstruct cs2func_script_3360_struct(85, 18065, "Aptitude (Tier 9)"); + flow_10: + return newstruct cs2func_script_3360_struct(95, 18066, "Aptitude (Tier 10)"); +} diff --git a/dumps/scripts/3361.cs2 b/dumps/scripts/3361.cs2 new file mode 100644 index 000000000..ded8902f5 --- /dev/null +++ b/dumps/scripts/3361.cs2 @@ -0,0 +1,46 @@ +cs2func_script_3361_struct(2,1,0) script_3361() { + flow_0: + SWITCH (standart_config_448) { + case 17975: + GOTO flow_1 + case 17976: + GOTO flow_2 + case 17977: + GOTO flow_3 + case 17978: + GOTO flow_4 + case 17979: + GOTO flow_5 + case 17980: + GOTO flow_6 + case 17981: + GOTO flow_7 + case 17982: + GOTO flow_8 + case 17983: + GOTO flow_9 + case 17984: + GOTO flow_10 + } + return newstruct cs2func_script_3361_struct(7, 18067, "Second Wind (Tier 1)"); + flow_1: + return newstruct cs2func_script_3361_struct(7, 18067, "Second Wind (Tier 1)"); + flow_2: + return newstruct cs2func_script_3361_struct(17, 18068, "Second Wind (Tier 2)"); + flow_3: + return newstruct cs2func_script_3361_struct(27, 18069, "Second Wind (Tier 3)"); + flow_4: + return newstruct cs2func_script_3361_struct(37, 18070, "Second Wind (Tier 4)"); + flow_5: + return newstruct cs2func_script_3361_struct(47, 18071, "Second Wind (Tier 5)"); + flow_6: + return newstruct cs2func_script_3361_struct(57, 18072, "Second Wind (Tier 6)"); + flow_7: + return newstruct cs2func_script_3361_struct(67, 18073, "Second Wind (Tier 7)"); + flow_8: + return newstruct cs2func_script_3361_struct(77, 18074, "Second Wind (Tier 8)"); + flow_9: + return newstruct cs2func_script_3361_struct(87, 18075, "Second Wind (Tier 9)"); + flow_10: + return newstruct cs2func_script_3361_struct(97, 18076, "Second Wind (Tier 10)"); +} diff --git a/dumps/scripts/3362.cs2 b/dumps/scripts/3362.cs2 new file mode 100644 index 000000000..fe6c44c45 --- /dev/null +++ b/dumps/scripts/3362.cs2 @@ -0,0 +1,46 @@ +cs2func_script_3362_struct(2,1,0) script_3362() { + flow_0: + SWITCH (standart_config_448) { + case 17965: + GOTO flow_1 + case 17966: + GOTO flow_2 + case 17967: + GOTO flow_3 + case 17968: + GOTO flow_4 + case 17969: + GOTO flow_5 + case 17970: + GOTO flow_6 + case 17971: + GOTO flow_7 + case 17972: + GOTO flow_8 + case 17973: + GOTO flow_9 + case 17974: + GOTO flow_10 + } + return newstruct cs2func_script_3362_struct(9, 18077, "Glimmer of Light (Tier 1)"); + flow_1: + return newstruct cs2func_script_3362_struct(9, 18077, "Glimmer of Light (Tier 1)"); + flow_2: + return newstruct cs2func_script_3362_struct(19, 18078, "Glimmer of Light (Tier 2)"); + flow_3: + return newstruct cs2func_script_3362_struct(29, 18079, "Glimmer of Light (Tier 3)"); + flow_4: + return newstruct cs2func_script_3362_struct(39, 18080, "Glimmer of Light (Tier 4)"); + flow_5: + return newstruct cs2func_script_3362_struct(49, 18081, "Glimmer of Light (Tier 5)"); + flow_6: + return newstruct cs2func_script_3362_struct(59, 18082, "Glimmer of Light (Tier 6)"); + flow_7: + return newstruct cs2func_script_3362_struct(69, 18083, "Glimmer of Light (Tier 7)"); + flow_8: + return newstruct cs2func_script_3362_struct(79, 18084, "Glimmer of Light (Tier 8)"); + flow_9: + return newstruct cs2func_script_3362_struct(89, 18085, "Glimmer of Light (Tier 9)"); + flow_10: + return newstruct cs2func_script_3362_struct(99, 18086, "Glimmer of Light (Tier 10)"); +} diff --git a/dumps/scripts/3363.cs2 b/dumps/scripts/3363.cs2 new file mode 100644 index 000000000..6ef3d4994 --- /dev/null +++ b/dumps/scripts/3363.cs2 @@ -0,0 +1,5 @@ +void script_3363(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + setWidgetSprite(arg4, new WidgetPointer(arg0)); + script_569(arg0, -1, arg1, arg2, arg3, arg5); + return; +} diff --git a/dumps/scripts/3364.cs2 b/dumps/scripts/3364.cs2 new file mode 100644 index 000000000..1ae2b4db2 --- /dev/null +++ b/dumps/scripts/3364.cs2 @@ -0,0 +1,96 @@ +void script_3364(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,string arg7) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + flow_0: + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = -1; + IF (arg1 == -1) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (setWidgetRegister(new WidgetPointer(arg0))) + GOTO flow_3 + flow_2: + IF (setWidgetRegister(new WidgetPointer(arg0), arg1)) + GOTO flow_3 + GOTO flow_25 + flow_3: + if (((boolean)script_4761(arg3))) { + return; + } + if (globalint_2 != 1) { + ivar7 = add(script_1743(), arg5); + ivar8 = add(add(script_1744(), getWidgetActualHeight()), arg6); + ivar15 = getWidgetParentId(new WidgetPointer(arg2)); + if ((ivar15 != -1) && (arg4 >= getWidgetActualWidth(new WidgetPointer(ivar15)))) { + arg4 = getWidgetActualWidth(new WidgetPointer(ivar15)); + } + ivar13 = add(4, getMaxLineWidth(subtract(arg4, 4), 495, arg7)); + ivar14 = add(add(4, multiply(13, getLineCount(subtract(arg4, 4), 495, arg7))), 3); + if (ivar15 != -1) { + ivar9 = subtract(ivar7, cs2method2600(new WidgetPointer(ivar15))); + ivar10 = subtract(ivar8, cs2method2601(new WidgetPointer(ivar15))); + if (ivar9 < 0) { + ivar7 = cs2method2600(new WidgetPointer(ivar15)); + ivar9 = 0; + } + if (ivar10 < 0) { + ivar8 = cs2method2601(new WidgetPointer(ivar15)); + ivar10 = 0; + } + if (ivar9 > 0) { + ivar11 = add(subtract(ivar9, getWidgetActualWidth(new WidgetPointer(ivar15))), ivar13); + if (ivar11 > 0) { + ivar7 = subtract(ivar7, ivar11); + } + } + if (ivar10 > 0) { + ivar12 = add(subtract(ivar10, getWidgetActualHeight(new WidgetPointer(ivar15))), ivar14); + if (ivar12 > 0) { + ivar8 = subtract(subtract(subtract(ivar8, ivar12), getWidgetActualHeight()), 10); + } + } + } + if (ivar7 < 0) { + ivar7 = 0; + } + if (ivar8 < 0) { + ivar8 = 0; + } + setWidgetSize(ivar13, ivar14, 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(ivar7, ivar8, 0, 0, new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 3, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 160)); + createExtraChild(new WidgetPointer(arg2), 3, 1); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg2), 4, 2); + setWidgetSize(subtract(arg4, 4), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetPosition(2, 0, 0, 0); + setWidgetText(arg7); + setWidgetTextAlignment(0, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(0, 0, 0)); + globalint_2 = 1; + } + flow_25: + return; +} diff --git a/dumps/scripts/3365.cs2 b/dumps/scripts/3365.cs2 new file mode 100644 index 000000000..ad3801220 --- /dev/null +++ b/dumps/scripts/3365.cs2 @@ -0,0 +1,11 @@ +int script_3365(int arg0) { + int ivar1; + int ivar2; + ivar1 = getWidgetActualX(new WidgetPointer(arg0)); + ivar2 = getWidgetParentId(new WidgetPointer(arg0)); + while (ivar2 != -1) { + ivar1 = subtract(add(ivar1, getWidgetActualX(new WidgetPointer(ivar2))), cs2method2600(new WidgetPointer(ivar2))); + ivar2 = getWidgetParentId(new WidgetPointer(ivar2)); + } + return ivar1; +} diff --git a/dumps/scripts/3366.cs2 b/dumps/scripts/3366.cs2 new file mode 100644 index 000000000..9e48e92db --- /dev/null +++ b/dumps/scripts/3366.cs2 @@ -0,0 +1,11 @@ +int script_3366(int arg0) { + int ivar1; + int ivar2; + ivar1 = getWidgetActualY(new WidgetPointer(arg0)); + ivar2 = getWidgetParentId(new WidgetPointer(arg0)); + while (ivar2 != -1) { + ivar1 = subtract(add(ivar1, getWidgetActualY(new WidgetPointer(ivar2))), cs2method2601(new WidgetPointer(ivar2))); + ivar2 = getWidgetParentId(new WidgetPointer(ivar2)); + } + return ivar1; +} diff --git a/dumps/scripts/3367.cs2 b/dumps/scripts/3367.cs2 new file mode 100644 index 000000000..a550fb22a --- /dev/null +++ b/dumps/scripts/3367.cs2 @@ -0,0 +1,98 @@ +void script_3367() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + if (globalint_1243 < getSkillXp(0)) { + ivar0 = add(ivar0, subtract(getSkillXp(0), globalint_1243)); + ivar1 = add(ivar1, divide(subtract(getSkillXp(0), globalint_1243), 2)); + } + if (globalint_1244 < getSkillXp(2)) { + ivar0 = add(ivar0, subtract(getSkillXp(2), globalint_1244)); + ivar1 = add(ivar1, divide(subtract(getSkillXp(2), globalint_1244), 2)); + } + if (globalint_1245 < getSkillXp(1)) { + ivar0 = add(ivar0, subtract(getSkillXp(1), globalint_1245)); + ivar1 = add(ivar1, divide(subtract(getSkillXp(1), globalint_1245), 2)); + } + if (globalint_1246 < getSkillXp(4)) { + ivar0 = add(ivar0, subtract(getSkillXp(4), globalint_1246)); + ivar1 = add(ivar1, divide(subtract(getSkillXp(4), globalint_1246), 2)); + } + if (globalint_1247 < getSkillXp(5)) { + ivar0 = add(ivar0, subtract(getSkillXp(5), globalint_1247)); + } + if (globalint_1248 < getSkillXp(6)) { + ivar0 = add(ivar0, subtract(getSkillXp(6), globalint_1248)); + ivar1 = add(ivar1, divide(subtract(getSkillXp(6), globalint_1248), 2)); + } + if (globalint_1249 < getSkillXp(20)) { + ivar0 = add(ivar0, subtract(getSkillXp(20), globalint_1249)); + } + if (globalint_1250 < getSkillXp(3)) { + ivar0 = add(ivar0, subtract(getSkillXp(3), globalint_1250)); + ivar1 = add(ivar1, divide(subtract(getSkillXp(3), globalint_1250), 2)); + } + if (globalint_1251 < getSkillXp(12)) { + ivar0 = add(ivar0, subtract(getSkillXp(12), globalint_1251)); + } + if (globalint_1252 < getSkillXp(14)) { + ivar0 = add(ivar0, subtract(getSkillXp(14), globalint_1252)); + } + if (globalint_1253 < getSkillXp(13)) { + ivar0 = add(ivar0, subtract(getSkillXp(13), globalint_1253)); + } + if (globalint_1254 < getSkillXp(10)) { + ivar0 = add(ivar0, subtract(getSkillXp(10), globalint_1254)); + } + if (globalint_1255 < getSkillXp(7)) { + ivar0 = add(ivar0, subtract(getSkillXp(7), globalint_1255)); + } + if (globalint_1256 < getSkillXp(11)) { + ivar0 = add(ivar0, subtract(getSkillXp(11), globalint_1256)); + } + if (globalint_1257 < getSkillXp(8)) { + ivar0 = add(ivar0, subtract(getSkillXp(8), globalint_1257)); + } + if (globalint_1258 < getSkillXp(16)) { + ivar0 = add(ivar0, subtract(getSkillXp(16), globalint_1258)); + } + if (globalint_1259 < getSkillXp(15)) { + ivar0 = add(ivar0, subtract(getSkillXp(15), globalint_1259)); + } + if (globalint_1260 < getSkillXp(17)) { + ivar0 = add(ivar0, subtract(getSkillXp(17), globalint_1260)); + } + if (globalint_1261 < getSkillXp(9)) { + ivar0 = add(ivar0, subtract(getSkillXp(9), globalint_1261)); + } + if (globalint_1262 < getSkillXp(18)) { + ivar0 = add(ivar0, subtract(getSkillXp(18), globalint_1262)); + } + if (globalint_1263 < getSkillXp(19)) { + ivar0 = add(ivar0, subtract(getSkillXp(19), globalint_1263)); + } + if (globalint_1264 < getSkillXp(22)) { + ivar0 = add(ivar0, subtract(getSkillXp(22), globalint_1264)); + } + if (globalint_1265 < getSkillXp(21)) { + ivar0 = add(ivar0, subtract(getSkillXp(21), globalint_1265)); + } + if (globalint_1266 < getSkillXp(23)) { + ivar0 = add(ivar0, subtract(getSkillXp(23), globalint_1266)); + } + if (globalint_1267 < getSkillXp(24)) { + ivar0 = add(ivar0, subtract(getSkillXp(24), globalint_1267)); + } + if (((boolean)ivar0)) { + return; + } + if (standart_config_2044 > 0) { + script_337(ivar0, standart_config_2044, 0); + } else { + script_3368(ivar0); + } + return; +} diff --git a/dumps/scripts/3368.cs2 b/dumps/scripts/3368.cs2 new file mode 100644 index 000000000..e3ca433f5 --- /dev/null +++ b/dumps/scripts/3368.cs2 @@ -0,0 +1,7 @@ +void script_3368(int arg0) { + setWidgetText(new WidgetPointer(548,26), formatNumber(arg0, 1) + "xp"); + setWidgetText(new WidgetPointer(746,189), formatNumber(arg0, 1) + "xp"); + setScriptCallOnGameloop(3369, new WidgetPointer(548,22), getClientCycle(), "Ii", new WidgetPointer(548,22)); + setScriptCallOnGameloop(3370, new WidgetPointer(746,184), getClientCycle(), "Ii", new WidgetPointer(746,184)); + return; +} diff --git a/dumps/scripts/3369.cs2 b/dumps/scripts/3369.cs2 new file mode 100644 index 000000000..2b4c3d0a4 --- /dev/null +++ b/dumps/scripts/3369.cs2 @@ -0,0 +1,15 @@ +void script_3369(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = subtract(getClientCycle(), arg1); + ivar3 = 0; + if (ivar2 > 70) { + setWidgetIsHidden(true, new WidgetPointer(548,24)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(548,22)); + return; + } + ivar3 = min(70, multiply(ivar2, 2)); + setWidgetPosition(7, ivar3, 0, 0, new WidgetPointer(548,24)); + setWidgetIsHidden(false, new WidgetPointer(548,24)); + return; +} diff --git a/dumps/scripts/337.cs2 b/dumps/scripts/337.cs2 new file mode 100644 index 000000000..e619fecc3 --- /dev/null +++ b/dumps/scripts/337.cs2 @@ -0,0 +1,29 @@ +void script_337(int arg0,int arg1,int arg2) { + flow_0: + IF (((boolean)arg2)) + GOTO flow_1 + IF (((boolean)bitconfig_7232) && (arg1 > 0)) + GOTO flow_2 + GOTO flow_5 + flow_1: + flow_2: + if (arg1 < 10) { + setWidgetText(new WidgetPointer(548,26), formatNumber(arg0, 1) + "" + "(+0." + intToStr(arg1) + ")" + "" + "xp"); + setWidgetText(new WidgetPointer(746,189), formatNumber(arg0, 1) + "" + "(+0." + intToStr(arg1) + ")" + "" + "xp"); + setScriptCallOnGameloop(3369, new WidgetPointer(548,22), getClientCycle(), "Ii", new WidgetPointer(548,22)); + setScriptCallOnGameloop(3370, new WidgetPointer(746,184), getClientCycle(), "Ii", new WidgetPointer(746,184)); + return; + } + arg1 = divide(arg1, 10); + flow_5: + if (arg1 < 1) { + setWidgetText(new WidgetPointer(548,26), formatNumber(arg0, 1) + "" + "" + "xp"); + setWidgetText(new WidgetPointer(746,189), formatNumber(arg0, 1) + "" + "" + "xp"); + } else { + setWidgetText(new WidgetPointer(548,26), formatNumber(arg0, 1) + "" + "(+" + intToStr(arg1) + ")" + "" + "xp"); + setWidgetText(new WidgetPointer(746,189), formatNumber(arg0, 1) + "" + "(+" + intToStr(arg1) + ")" + "" + "xp"); + } + setScriptCallOnGameloop(3369, new WidgetPointer(548,22), getClientCycle(), "Ii", new WidgetPointer(548,22)); + setScriptCallOnGameloop(3370, new WidgetPointer(746,184), getClientCycle(), "Ii", new WidgetPointer(746,184)); + return; +} diff --git a/dumps/scripts/3370.cs2 b/dumps/scripts/3370.cs2 new file mode 100644 index 000000000..e25123b5d --- /dev/null +++ b/dumps/scripts/3370.cs2 @@ -0,0 +1,15 @@ +void script_3370(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = subtract(getClientCycle(), arg1); + ivar3 = 0; + if (ivar2 > 70) { + setWidgetIsHidden(true, new WidgetPointer(746,187)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(746,184)); + return; + } + ivar3 = min(70, multiply(ivar2, 2)); + setWidgetPosition(7, ivar3, 0, 0, new WidgetPointer(746,187)); + setWidgetIsHidden(false, new WidgetPointer(746,187)); + return; +} diff --git a/dumps/scripts/3371.cs2 b/dumps/scripts/3371.cs2 new file mode 100644 index 000000000..f1e012832 --- /dev/null +++ b/dumps/scripts/3371.cs2 @@ -0,0 +1,15 @@ +cs2func_script_3371_struct(2,0,0) script_3371(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, 57609823, 380, 57740915, 445, 0); + cs2method5406(1, 0, 57527910, -15, 57577074, 10, 0); + cs2method5406(0, 1, 57396849, 715, 57151087, 775, 0); + cs2method5406(1, 1, 57151080, -45, 57085540, 210, 0); + script_1899(0, 75, 50); + cs2method5406(0, 2, 57396849, 715, 57151087, 775, 0); + cs2method5406(1, 2, 57151080, -45, 57085540, 210, 0); + script_1899(1, 50, 50); + } + return newstruct cs2func_script_3371_struct(57118312, 1250324); +} diff --git a/dumps/scripts/3372.cs2 b/dumps/scripts/3372.cs2 new file mode 100644 index 000000000..cabeafb95 --- /dev/null +++ b/dumps/scripts/3372.cs2 @@ -0,0 +1,15 @@ +cs2func_script_3372_struct(2,0,0) script_3372(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, 57134673, 1210, 57019985, 1210, 0); + cs2method5406(1, 0, 56774236, 110, 56741471, 195, 0); + cs2method5406(0, 1, 56856155, 1210, 56839774, 1200, 0); + cs2method5406(1, 1, 56757863, 605, 56774251, 605, 0); + script_1899(0, 50, 50); + cs2method5406(0, 2, 56856155, 1210, 56839774, 1200, 0); + cs2method5406(1, 2, 56757863, 605, 56774251, 605, 0); + script_1899(1, 50, 50); + } + return newstruct cs2func_script_3372_struct(57118312, 1250324); +} diff --git a/dumps/scripts/3373.cs2 b/dumps/scripts/3373.cs2 new file mode 100644 index 000000000..10d03ff9a --- /dev/null +++ b/dumps/scripts/3373.cs2 @@ -0,0 +1,15 @@ +cs2func_script_3373_struct(2,0,0) script_3373(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, 56249981, 1280, 56020596, 1270, 0); + cs2method5406(1, 0, 56184424, 690, 56135263, 685, 0); + cs2method5406(0, 1, 56200787, 1315, 56446535, 1315, 0); + cs2method5406(1, 1, 56397395, 645, 56561228, 610, 0); + script_1899(0, 50, 50); + cs2method5406(0, 2, 56200787, 1315, 56446535, 1315, 0); + cs2method5406(1, 2, 56397395, 645, 56561228, 610, 0); + script_1899(1, 50, 50); + } + return newstruct cs2func_script_3373_struct(56069736, 1250324); +} diff --git a/dumps/scripts/3374.cs2 b/dumps/scripts/3374.cs2 new file mode 100644 index 000000000..4e17cfff4 --- /dev/null +++ b/dumps/scripts/3374.cs2 @@ -0,0 +1,18 @@ +cs2func_script_3374_struct(2,0,0) script_3374(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 4); + cs2method5405(1, 4); + cs2method5406(0, 0, 55938707, 1545, 56004239, 1555, 0); + cs2method5406(1, 0, 56184460, 715, 56282762, 800, 0); + cs2method5406(0, 1, 56266371, 1960, 56462977, 2070, 0); + cs2method5406(1, 1, 56430224, 1155, 56495763, 1250, 0); + script_1899(0, 100, 100); + cs2method5406(0, 2, 56561294, 2200, 56577680, 2180, 0); + cs2method5406(1, 2, 56512160, 1245, 56512163, 1190, 0); + script_1899(1, 100, 100); + cs2method5406(0, 3, 56561294, 2200, 56577680, 2180, 0); + cs2method5406(1, 3, 56512160, 1245, 56512163, 1190, 0); + script_1899(2, 100, 100); + } + return newstruct cs2func_script_3374_struct(56069800, 1250324); +} diff --git a/dumps/scripts/3375.cs2 b/dumps/scripts/3375.cs2 new file mode 100644 index 000000000..4c59b8863 --- /dev/null +++ b/dumps/scripts/3375.cs2 @@ -0,0 +1,5 @@ +void script_3375(int arg0,int arg1) { + setWidgetSize(arg0, arg1, 0, 0, new WidgetPointer(519,3)); + setWidgetPosition(add(16, divide(subtract(64, arg0), 2)), add(16, divide(subtract(64, arg1), 2)), 0, 0, new WidgetPointer(519,3)); + return; +} diff --git a/dumps/scripts/3376.cs2 b/dumps/scripts/3376.cs2 new file mode 100644 index 000000000..9407f09bf --- /dev/null +++ b/dumps/scripts/3376.cs2 @@ -0,0 +1,14 @@ +void script_3376(int arg0) { + int ivar1; + int ivar2; + string svar0; + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + svar0 = strRemoveEntities(getWidgetText(new WidgetPointer(arg0))); + ivar2 = getLineCount(ivar1, 3793, svar0); + if (((boolean)ivar2)) { + setWidgetSize(getTextWidth(3793, svar0), 19, 0, 0, new WidgetPointer(arg0)); + } else { + setWidgetSize(ivar1, add(multiply(14, ivar2), 5), 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3377.cs2 b/dumps/scripts/3377.cs2 new file mode 100644 index 000000000..d284bf9b8 --- /dev/null +++ b/dumps/scripts/3377.cs2 @@ -0,0 +1,8 @@ +void script_3377() { + if (isWidgetHidden(new WidgetPointer(744,48)) || isWidgetHidden(new WidgetPointer(744,49))) { + script_2206(); + } else { + cs2method5411(); + } + return; +} diff --git a/dumps/scripts/3378.cs2 b/dumps/scripts/3378.cs2 new file mode 100644 index 000000000..b4adca49e --- /dev/null +++ b/dumps/scripts/3378.cs2 @@ -0,0 +1,6 @@ +void script_3378() { + setWidgetSprite(2560, new WidgetPointer(27,44)); + setWidgetSprite(2560, new WidgetPointer(27,45)); + setWidgetSprite(2561, new WidgetPointer(27,46)); + return; +} diff --git a/dumps/scripts/3379.cs2 b/dumps/scripts/3379.cs2 new file mode 100644 index 000000000..a8a76cd85 --- /dev/null +++ b/dumps/scripts/3379.cs2 @@ -0,0 +1,6 @@ +void script_3379() { + setWidgetSprite(2558, new WidgetPointer(27,44)); + setWidgetSprite(2558, new WidgetPointer(27,45)); + setWidgetSprite(2559, new WidgetPointer(27,46)); + return; +} diff --git a/dumps/scripts/338.cs2 b/dumps/scripts/338.cs2 new file mode 100644 index 000000000..a3f12f2b6 --- /dev/null +++ b/dumps/scripts/338.cs2 @@ -0,0 +1,66 @@ +int script_338(int arg0) { + if (arg0 == 23) { + return 1100; + } + if (bitconfig_7233 < 30) { + return 2700; + } + if (bitconfig_7233 < 60) { + return 2550; + } + if (bitconfig_7233 < 90) { + return 2400; + } + if (bitconfig_7233 < 120) { + return 2250; + } + if (bitconfig_7233 < 150) { + return 2100; + } + if (bitconfig_7233 < 180) { + return 2000; + } + if (bitconfig_7233 < 210) { + return 1900; + } + if (bitconfig_7233 < 240) { + return 1800; + } + if (bitconfig_7233 < 270) { + return 1700; + } + if (bitconfig_7233 < 300) { + return 1600; + } + if (bitconfig_7233 < 330) { + return 1500; + } + if (bitconfig_7233 < 360) { + return 1450; + } + if (bitconfig_7233 < 390) { + return 1400; + } + if (bitconfig_7233 < 420) { + return 1350; + } + if (bitconfig_7233 < 450) { + return 1300; + } + if (bitconfig_7233 < 480) { + return 1250; + } + if (bitconfig_7233 < 510) { + return 1200; + } + if (bitconfig_7233 < 540) { + return 1175; + } + if (bitconfig_7233 < 570) { + return 1150; + } + if (bitconfig_7233 < 600) { + return 1125; + } + return 1100; +} diff --git a/dumps/scripts/3380.cs2 b/dumps/scripts/3380.cs2 new file mode 100644 index 000000000..ce8e7ab96 --- /dev/null +++ b/dumps/scripts/3380.cs2 @@ -0,0 +1,4 @@ +void script_3380(string arg0) { + cs2method5421(1, arg0); + return; +} diff --git a/dumps/scripts/3381.cs2 b/dumps/scripts/3381.cs2 new file mode 100644 index 000000000..22bc8da22 --- /dev/null +++ b/dumps/scripts/3381.cs2 @@ -0,0 +1,10 @@ +void script_3381(int arg0,int arg1) { + arg1 = add(arg1, 1); + setScriptCallOnGameloop(3381, new WidgetPointer(arg0), arg1, "Ii", new WidgetPointer(arg0)); + if (arg1 > 1) { + globalint_1273 = 1; + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + script_2945(); + } + return; +} diff --git a/dumps/scripts/3382.cs2 b/dumps/scripts/3382.cs2 new file mode 100644 index 000000000..0ba50ecf8 --- /dev/null +++ b/dumps/scripts/3382.cs2 @@ -0,0 +1,5 @@ +void script_3382(int arg0) { + setWidgetSprite(4661, new WidgetPointer(arg0)); + script_3087(arg0, -1); + return; +} diff --git a/dumps/scripts/3383.cs2 b/dumps/scripts/3383.cs2 new file mode 100644 index 000000000..0c8a0f3bd --- /dev/null +++ b/dumps/scripts/3383.cs2 @@ -0,0 +1,4 @@ +void script_3383(int arg0) { + script_3384(arg0); + return; +} diff --git a/dumps/scripts/3384.cs2 b/dumps/scripts/3384.cs2 new file mode 100644 index 000000000..66e0d932d --- /dev/null +++ b/dumps/scripts/3384.cs2 @@ -0,0 +1,39 @@ +void script_3384(int arg0) { + int ivar1; + int ivar2; + opcStruct7000(2,0,0) structdump_0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + cs2func_script_2692_struct(2,0,0) structdump_4; + ivar1 = 0; + ivar2 = 0; + structdump_0 = cs2method7000(); + ivar2 = structdump_0.intpart_1; + ivar1 = structdump_0.intpart_0; + script_2593(ivar1); + if (((boolean)ivar1) || (ivar1 == 3)) { + script_2700(1, arg0, 1, 0); + return; + } + globalint_1240 = 3; + globalint_1277 = 0; + cs2method6032(ivar1, 1); + if (arg0 == 3) { + if (hasSSKey()) { + script_1174(5); + setScriptCallOnGameloop(3381, new WidgetPointer(975,44), 0, "Ii", new WidgetPointer(975,44)); + } else if (((boolean)script_3487(1))) { + script_1174(11); + } else { + script_1174(11); + } + } else { + stack_dump1 = ivar1; + stack_dump2 = getDisplayMode(); + stack_dump3 = ivar1; + structdump_4 = script_2692(stack_dump3); + script_2596(stack_dump1, stack_dump2, structdump_4.intpart_0, structdump_4.intpart_1, arg0); + } + return; +} diff --git a/dumps/scripts/3385.cs2 b/dumps/scripts/3385.cs2 new file mode 100644 index 000000000..181fda46a --- /dev/null +++ b/dumps/scripts/3385.cs2 @@ -0,0 +1,34 @@ +void script_3385() { + string svar0; + openInterface(48758808, 976); + svar0 = ""; + if (cs2method6144()) { + svar0 = "There was a problem with your current graphic settings, so you have been given default settings for safety. Click below to auto-choose best graphics settings."; + setWidgetText(new WidgetPointer(976,4), svar0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(976,2)), add(multiply(22, getLineCount(getWidgetActualWidth(new WidgetPointer(976,4)), 3793, svar0)), 86), 0, 0, new WidgetPointer(976,2)); + setWidgetSize(getTextWidth(3793, getWidgetText(new WidgetPointer(976,6))), getWidgetActualHeight(new WidgetPointer(976,6)), 0, 0, new WidgetPointer(976,6)); + } else if (((boolean)globalint_1277) && (globalint_1240 == -1)) { + svar0 = "This is your first time playing. Click below to auto-choose best graphics settings. Choose 'Leave Alone' to continue with default settings."; + setWidgetText(new WidgetPointer(976,4), svar0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(976,2)), add(multiply(22, getLineCount(getWidgetActualWidth(new WidgetPointer(976,4)), 3793, svar0)), 86), 0, 0, new WidgetPointer(976,2)); + setWidgetSize(getTextWidth(3793, getWidgetText(new WidgetPointer(976,6))), getWidgetActualHeight(new WidgetPointer(976,6)), 0, 0, new WidgetPointer(976,6)); + } else if (globalint_1240 == -1) { + svar0 = "This is your first time playing, click below to auto choose best graphics settings."; + setWidgetText(new WidgetPointer(976,4), svar0); + setWidgetPosition(0, 10, 1, 0, new WidgetPointer(976,4)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(976,4)), 68, 0, 1, new WidgetPointer(976,4)); + setWidgetPosition(0, 17, 1, 2, new WidgetPointer(976,5)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(976,2)), add(multiply(22, getLineCount(getWidgetActualWidth(new WidgetPointer(976,4)), 3793, svar0)), 68), 0, 0, new WidgetPointer(976,2)); + setWidgetIsHidden(true, new WidgetPointer(976,6)); + } else { + svar0 = "Available graphics options have changed. Click below to auto choose best graphics settings."; + if (((boolean)globalint_1277)) { + svar0 = "Available graphics options have changed. Click below to auto-choose best graphics settings. Choose 'Leave Alone' to continue with your current settings."; + } + setWidgetText(new WidgetPointer(976,4), svar0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(976,2)), add(multiply(22, getLineCount(getWidgetActualWidth(new WidgetPointer(976,4)), 3793, svar0)), 86), 0, 0, new WidgetPointer(976,2)); + setWidgetSize(getTextWidth(3793, getWidgetText(new WidgetPointer(976,6))), getWidgetActualHeight(new WidgetPointer(976,6)), 0, 0, new WidgetPointer(976,6)); + } + globalint_1277 = 1; + return; +} diff --git a/dumps/scripts/3386.cs2 b/dumps/scripts/3386.cs2 new file mode 100644 index 000000000..df8c33822 --- /dev/null +++ b/dumps/scripts/3386.cs2 @@ -0,0 +1,4 @@ +void script_3386(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_2596(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/3387.cs2 b/dumps/scripts/3387.cs2 new file mode 100644 index 000000000..f5742920f --- /dev/null +++ b/dumps/scripts/3387.cs2 @@ -0,0 +1,276 @@ +void script_3387(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + ivar5 = -1; + ivar6 = -1; + switch (arg4) { + case 1: + setWidgetText(new WidgetPointer(742,19), "Custom Graphics Options"); + openInterface(48627718, 977); + ivar5 = 48627716; + ivar6 = 48627732; + setScriptCallOnMousePressed(3386, arg0, arg1, arg2, arg3, arg4, "iiiii", new WidgetPointer(742,18)); + setWidgetContextMenuOption(1, new WidgetPointer(742,18), "Back"); + break; + case 0: + openInterface(57802780, 977); + ivar5 = 57802756; + ivar6 = 57802757; + setWidgetIsHidden(true, new WidgetPointer(882,29)); + setWidgetIsHidden(false, new WidgetPointer(882,23)); + setScriptCallOnMousePressed(3386, arg0, arg1, arg2, arg3, arg4, "iiiii", new WidgetPointer(882,23)); + setScriptCallOnWidgetResize(2917, 1, "1", new WidgetPointer(882,4)); + setScriptCallOnWidgetResize(2919, 1, arg4, "1i", new WidgetPointer(744,50)); + break; + case 2: + openInterface(59703298, 977); + ivar5 = 59703296; + ivar6 = 59703355; + setWidgetIsHidden(true, new WidgetPointer(911,5)); + setWidgetIsHidden(false, new WidgetPointer(911,3)); + setScriptCallOnMousePressed(3386, arg0, arg1, arg2, arg3, arg4, "iiiii", new WidgetPointer(911,3)); + setScriptCallOnWidgetResize(2919, 1, arg4, "1i", new WidgetPointer(906,23)); + script_4041(); + } + setWidgetIsHidden(true, new WidgetPointer(ivar6)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar5)); + ivar7 = 0; + ivar8 = 1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + setWidgetSprite(-1, new WidgetPointer(977,60)); + setWidgetSprite(-1, new WidgetPointer(977,56)); + setWidgetSprite(-1, new WidgetPointer(977,58)); + setWidgetSprite(-1, new WidgetPointer(977,54)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(977,59)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(977,55)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(977,57)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(977,53)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(977,59)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(977,55)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(977,57)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(977,53)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(977,59)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(977,55)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(977,57)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(977,53)); + if (cs2method7214()) { + switch (arg0) { + case 0: + script_1147(0, arg0, 64028721, 64028731, 64028732, arg4); + break; + case 2: + script_1147(2, arg0, 64028721, 64028731, 64028732, arg4); + break; + case 1: + script_1147(1, arg0, 64028721, 64028731, 64028732, arg4); + break; + case 3: + script_1147(3, arg0, 64028721, 64028731, 64028732, arg4); + } + setWidgetPosition(175, getWidgetActualY(new WidgetPointer(977,49)), 2, 0, new WidgetPointer(977,49)); + setWidgetSize(350, getWidgetActualHeight(new WidgetPointer(977,47)), 0, 0, new WidgetPointer(977,46)); + } else { + if (cs2method6147() || ((boolean)arg0)) { + ivar9 = 64028721; + script_1147(0, arg0, 64028721, 64028731, 64028732, arg4); + ivar7 = add(ivar7, 1); + } + while (ivar8 < 4) { + if (cs2method7314(ivar8) < 3) { + switch (ivar8) { + case 2: + ivar13 = 64028722; + script_1147(1, arg0, 64028722, 64028729, 64028730, arg4); + break; + case 1: + ivar13 = 64028723; + script_1147(2, arg0, 64028723, 64028727, 64028728, arg4); + break; + case 3: + ivar13 = 64028724; + script_1147(3, arg0, 64028724, 64028725, 64028726, arg4); + } + ivar7 = add(ivar7, 1); + if (ivar9 == -1) { + ivar9 = ivar13; + } else if (ivar10 == -1) { + ivar10 = ivar13; + } else if (ivar11 == -1) { + ivar11 = ivar13; + } else { + if (ivar12 == -1) { + ivar12 = ivar13; + } + } + } + ivar8 = add(ivar8, 1); + } + switch (ivar7) { + case 1: + setWidgetPosition(175, getWidgetActualY(new WidgetPointer(ivar9)), 2, 0, new WidgetPointer(ivar9)); + setWidgetSize(350, getWidgetActualHeight(new WidgetPointer(977,47)), 0, 0, new WidgetPointer(977,46)); + break; + case 2: + setWidgetPosition(90, getWidgetActualY(new WidgetPointer(ivar9)), 0, 0, new WidgetPointer(ivar9)); + setWidgetPosition(90, getWidgetActualY(new WidgetPointer(ivar10)), 2, 0, new WidgetPointer(ivar10)); + setWidgetSize(400, getWidgetActualHeight(new WidgetPointer(977,47)), 0, 0, new WidgetPointer(977,46)); + break; + case 3: + setWidgetPosition(58, getWidgetActualY(new WidgetPointer(ivar9)), 0, 0, new WidgetPointer(ivar9)); + setWidgetPosition(173, getWidgetActualY(new WidgetPointer(ivar10)), 2, 0, new WidgetPointer(ivar10)); + setWidgetPosition(58, getWidgetActualY(new WidgetPointer(ivar11)), 2, 0, new WidgetPointer(ivar11)); + setWidgetSize(400, getWidgetActualHeight(new WidgetPointer(977,47)), 0, 0, new WidgetPointer(977,46)); + } + } + ivar14 = 0; + ivar15 = -1; + ivar16 = 64028700; + ivar17 = 64028699; + deleteAllExtraChilds(new WidgetPointer(ivar16)); + deleteAllExtraChilds(new WidgetPointer(ivar17)); + script_2601(0, ivar14, ivar16, "Brightness"); + script_1185(64028704, 64028705); + cs2method2301(64028704, -1, new WidgetPointer(977,33)); + ivar18 = 1; + ivar19 = add(arg3, 21); + ivar20 = -1; + ivar21 = -1; + ivar22 = -1; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = -1; + while (ivar24 < getCommonDefinitionSize(201)) { + ivar21 = cs2method_3408(105, 74, 201, ivar24); + ivar20 = script_2601(ivar18, ivar14, ivar16, getOtherCommonData(ivar21, 845)); + createExtraChild(new WidgetPointer(ivar16), 3, getExtraChildGap(new WidgetPointer(ivar16))); + setWidgetSize(ivar19, 16, 0, 0); + if (((boolean)ivar18)) { + setWidgetPosition(4, ivar14, 2, 0); + } else { + setWidgetPosition(subtract(233, ivar19), ivar14, 0, 0); + } + setWidgetFilled(1); + setWidgetRGB(new Color(46, 43, 38)); + createExtraChild(new WidgetPointer(ivar16), 3, getExtraChildGap(new WidgetPointer(ivar16))); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(95, 91, 82)); + ivar15 = getWidgetCustomChildArrayIndex(); + createExtraChild(new WidgetPointer(ivar16), 4, getExtraChildGap(new WidgetPointer(ivar16))); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + ivar23 = script_2581(ivar21); + if (ivar23 <= -1) { + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetRGB(new Color(235, 224, 188)); + setWidgetText("" + "N/A"); + } else { + setWidgetSize(arg3, getWidgetActualHeight(), 0, 0); + setWidgetPosition(add(getWidgetActualX(), 2), getWidgetActualY(), 0, 0); + ivar22 = getOtherCommonData(ivar21, 683); + ivar25 = script_829(ivar21, ivar22); + if (ivar21 != 1009) { + if (ivar23 < ivar25) { + setWidgetRGB(new Color(235, 224, 188)); + } else { + setWidgetRGB(new Color(0, 177, 225)); + } + } else if (ivar23 > 0) { + setWidgetRGB(new Color(235, 224, 188)); + } else { + setWidgetRGB(new Color(0, 177, 225)); + } + if (((int)isBitFlagged(getOtherCommonData(ivar21, 682), arg0)) != 1) { + setWidgetText("" + "N/A"); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + } else { + setWidgetText(cs2method_3408(105, 115, ivar22, ivar23)); + createExtraChild(new WidgetPointer(ivar16), 5, getExtraChildGap(new WidgetPointer(ivar16))); + setWidgetSize(16, 16, 0, 0); + setWidgetPosition(subtract(add(getWidgetActualX(), getWidgetActualWidth()), add(getWidgetActualWidth(), 1)), add(ivar14, divide(subtract(16, getWidgetActualHeight()), 2)), 0, 0); + setWidgetSprite(2554); + setScriptCallOnMouseEntered(2691, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 1, ivar15, 8419437, 1, "Ii1ii1"); + setScriptCallOnMouseExit(2691, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 0, ivar15, 6249298, 1, "Ii1ii1"); + setScriptCallOnMousePressed(2695, new WidgetPointer(-32768,3), -2147483643, getWidgetCustomChildArrayIndex(), ivar15, ivar20, ivar21, arg2, arg3, arg0, arg1, arg4, "IiiiiJiiiii"); + } + } + if (((boolean)ivar18)) { + ivar18 = 0; + ivar14 = add(ivar14, 20); + ivar26 = getExtraChildGap(new WidgetPointer(ivar17)); + createExtraChild(new WidgetPointer(ivar17), 3, ivar26); + setWidgetSize(2, 1, 1, 0); + setWidgetPosition(1, add(ivar14, 3), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(128, 120, 109)); + } else { + ivar18 = 1; + } + ivar24 = add(ivar24, 1); + } + if (((boolean)ivar18)) { + ivar14 = add(ivar14, 20); + } + if (((ivar26 != -1) && ((boolean)ivar18)) && setWidgetRegister(new WidgetPointer(ivar17), ivar26)) { + deleteExtraChild(); + } + setWidgetSize(getWidgetActualWidth(new WidgetPointer(977,26)), add(ivar14, 5), 0, 0, new WidgetPointer(977,26)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(977,24)), add(getWidgetActualY(new WidgetPointer(977,26)), getWidgetActualHeight(new WidgetPointer(977,26))), 0, 0, new WidgetPointer(977,24)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(977,3)), add(getWidgetActualY(new WidgetPointer(977,24)), getWidgetActualHeight(new WidgetPointer(977,24))), 0, 0, new WidgetPointer(977,3)); + switch (arg4) { + case 1: + setWidgetSize(getWidgetActualWidth(new WidgetPointer(742,4)), 334, 0, 0, new WidgetPointer(742,4)); + setWidgetPosition(0, getWidgetActualY(new WidgetPointer(977,2)), 0, 0, new WidgetPointer(977,2)); + setWidgetSize(20, subtract(getWidgetActualHeight(new WidgetPointer(742,6)), getWidgetActualHeight(new WidgetPointer(977,1))), 1, 0, new WidgetPointer(977,2)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(977,0)), getWidgetActualHeight(new WidgetPointer(742,6)), 0, 0, new WidgetPointer(977,0)); + setWidgetScrollMax(0, add(getWidgetActualHeight(new WidgetPointer(977,3)), 5), new WidgetPointer(977,2)); + script_31(64028742, 64028674, 792, 789, 790, 791, 773, 788); + break; + case 0: + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(977,0)); + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(882,28)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(977,2)), getWidgetActualHeight(new WidgetPointer(977,3)), 0, 0, new WidgetPointer(977,2)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(977,0)), add(getWidgetActualY(new WidgetPointer(977,2)), getWidgetActualHeight(new WidgetPointer(977,2))), 0, 0, new WidgetPointer(977,0)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(882,28)), add(add(getWidgetActualHeight(new WidgetPointer(977,0)), 15), getWidgetActualHeight(new WidgetPointer(882,23))), 0, 0, new WidgetPointer(882,28)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(882,22)), add(getWidgetActualHeight(new WidgetPointer(882,28)), 5), 0, 0, new WidgetPointer(882,22)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(882,8)), add(40, getWidgetActualHeight(new WidgetPointer(882,22))), 0, 0, new WidgetPointer(882,8)); + setWidgetPosition(0, 10, 1, 1, new WidgetPointer(882,22)); + break; + case 2: + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(977,0)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(977,2)), getWidgetActualHeight(new WidgetPointer(977,3)), 0, 0, new WidgetPointer(977,2)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(977,0)), add(getWidgetActualY(new WidgetPointer(977,2)), getWidgetActualHeight(new WidgetPointer(977,2))), 0, 0, new WidgetPointer(977,0)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(911,2)), add(add(getWidgetActualHeight(new WidgetPointer(977,0)), 2), getWidgetActualHeight(new WidgetPointer(911,3))), 0, 0, new WidgetPointer(911,2)); + } + script_3451(arg4, 1); + script_2918(1); + return; +} diff --git a/dumps/scripts/3388.cs2 b/dumps/scripts/3388.cs2 new file mode 100644 index 000000000..34277c256 --- /dev/null +++ b/dumps/scripts/3388.cs2 @@ -0,0 +1,78 @@ +void script_3388(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_2692_struct(2,0,0) structdump_3; + cs2func_script_2692_struct(2,0,0) structdump_4; + ivar3 = 4; + switch (arg0) { + case 1: + if (cs2method7007() != 1) { + cs2method7004(); + } else { + return; + } + break; + case 2: + if (ivar3 >= 2) { + if (cs2method7007() != 2) { + cs2method7003(); + } else { + return; + } + } else { + script_3413(arg1); + } + break; + case 3: + if (ivar3 >= 3) { + if (cs2method7007() != 3) { + cs2method7002(); + } else { + return; + } + } else { + script_3413(arg1); + } + break; + case 4: + if (ivar3 >= 4) { + if (cs2method7007() != 4) { + cs2method7001(); + } else { + return; + } + } else { + script_3413(arg1); + } + break; + case 0: + if (((boolean)arg2)) { + if (cs2method7007() != 0) { + cs2method7005(); + } else { + return; + } + } + break; + case -1: + script_3384(arg1); + } + ivar4 = cs2method6131(); + if (((boolean)arg0) || ((boolean)arg2)) { + stack_dump0 = ivar4; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar4; + structdump_3 = script_2692(stack_dump2); + script_3387(stack_dump0, stack_dump1, structdump_3.intpart_0, structdump_3.intpart_1, arg1); + } else { + stack_dump0 = ivar4; + stack_dump1 = getDisplayMode(); + stack_dump2 = ivar4; + structdump_4 = script_2692(stack_dump2); + script_2596(stack_dump0, stack_dump1, structdump_4.intpart_0, structdump_4.intpart_1, arg1); + } + return; +} diff --git a/dumps/scripts/3389.cs2 b/dumps/scripts/3389.cs2 new file mode 100644 index 000000000..8f088233a --- /dev/null +++ b/dumps/scripts/3389.cs2 @@ -0,0 +1,4 @@ +void script_3389(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_3390(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/339.cs2 b/dumps/scripts/339.cs2 new file mode 100644 index 000000000..47f6da42d --- /dev/null +++ b/dumps/scripts/339.cs2 @@ -0,0 +1,6 @@ +void script_339() { + setWidgetSprite(3165, new WidgetPointer(205,54)); + setWidgetSprite(3165, new WidgetPointer(205,55)); + setWidgetSprite(3166, new WidgetPointer(205,56)); + return; +} diff --git a/dumps/scripts/3390.cs2 b/dumps/scripts/3390.cs2 new file mode 100644 index 000000000..01509bf5a --- /dev/null +++ b/dumps/scripts/3390.cs2 @@ -0,0 +1,12 @@ +void script_3390(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (arg0 != -1) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + } + if (arg2 != -1) { + setWidgetSprite(arg3, new WidgetPointer(arg2)); + } + if (arg4 != -1) { + setWidgetSprite(arg5, new WidgetPointer(arg4)); + } + return; +} diff --git a/dumps/scripts/3391.cs2 b/dumps/scripts/3391.cs2 new file mode 100644 index 000000000..edf311d31 --- /dev/null +++ b/dumps/scripts/3391.cs2 @@ -0,0 +1,8 @@ +void script_3391() { + closeInterface(59375670); + setWidgetIsHidden(true, new WidgetPointer(906,46)); + if (isWidgetHidden(cs2method_3408(105, 73, 941, 5))) { + script_3161(1); + } + return; +} diff --git a/dumps/scripts/3392.cs2 b/dumps/scripts/3392.cs2 new file mode 100644 index 000000000..416defbd8 --- /dev/null +++ b/dumps/scripts/3392.cs2 @@ -0,0 +1,6 @@ +void script_3392(int arg0) { + if (setWidgetRegister(new WidgetPointer(979,26), arg0)) { + cs2method2103(0); + } + return; +} diff --git a/dumps/scripts/3393.cs2 b/dumps/scripts/3393.cs2 new file mode 100644 index 000000000..c6b2a0d60 --- /dev/null +++ b/dumps/scripts/3393.cs2 @@ -0,0 +1,6 @@ +void script_3393(int arg0) { + if (setWidgetRegister(new WidgetPointer(979,26), arg0)) { + cs2method2103(255); + } + return; +} diff --git a/dumps/scripts/3394.cs2 b/dumps/scripts/3394.cs2 new file mode 100644 index 000000000..448c95bd7 --- /dev/null +++ b/dumps/scripts/3394.cs2 @@ -0,0 +1,4 @@ +void script_3394(int arg0) { + globalint_791 = arg0; + return; +} diff --git a/dumps/scripts/3395.cs2 b/dumps/scripts/3395.cs2 new file mode 100644 index 000000000..dbc5ab3d8 --- /dev/null +++ b/dumps/scripts/3395.cs2 @@ -0,0 +1,14 @@ +void script_3395() { + int ivar0; + ivar0 = 0; + while (ivar0 < getExtraChildGap(new WidgetPointer(979,25))) { + if (setWidgetRegister(new WidgetPointer(979,25), ivar0)) { + cs2method2103(255); + } + ivar0 = add(ivar0, 1); + } + if (setWidgetRegister(new WidgetPointer(979,25), globalint_792)) { + cs2method2103(0); + } + return; +} diff --git a/dumps/scripts/3396.cs2 b/dumps/scripts/3396.cs2 new file mode 100644 index 000000000..f5a1fb43b --- /dev/null +++ b/dumps/scripts/3396.cs2 @@ -0,0 +1,13 @@ +void script_3396(int arg0) { + int ivar1; + string svar0; + svar0 = ""; + ivar1 = -1; + if (setWidgetRegister(new WidgetPointer(979,27), arg0)) { + globalstring_279 = cs2method1802(); + globalint_792 = globalint_791; + script_3395(); + script_3397(); + } + return; +} diff --git a/dumps/scripts/3397.cs2 b/dumps/scripts/3397.cs2 new file mode 100644 index 000000000..cb80004aa --- /dev/null +++ b/dumps/scripts/3397.cs2 @@ -0,0 +1,23 @@ +void script_3397() { + int ivar0; + int ivar1; + setWidgetText(new WidgetPointer(979,18), globalstring_279); + ivar0 = 2568; + ivar1 = 2569; + if (stringMethod4107(globalstring_279, "") != 0) { + setWidgetText(new WidgetPointer(979,40), "Reporting: " + globalstring_279); + cs2method2103(0, new WidgetPointer(979,10)); + cs2method2103(0, new WidgetPointer(979,11)); + cs2method2103(0, new WidgetPointer(979,12)); + cs2method2103(0, new WidgetPointer(979,13)); + setScriptCallOnMouseEntered(3071, new WidgetPointer(979,10), ivar0, new WidgetPointer(979,11), ivar1, new WidgetPointer(979,12), ivar0, "IdIdId", new WidgetPointer(979,9)); + } else { + setWidgetText(new WidgetPointer(979,40), "Report Abuse: Select Player"); + cs2method2103(100, new WidgetPointer(979,10)); + cs2method2103(100, new WidgetPointer(979,11)); + cs2method2103(100, new WidgetPointer(979,12)); + cs2method2103(100, new WidgetPointer(979,13)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(979,9)); + } + return; +} diff --git a/dumps/scripts/3398.cs2 b/dumps/scripts/3398.cs2 new file mode 100644 index 000000000..da044cdaa --- /dev/null +++ b/dumps/scripts/3398.cs2 @@ -0,0 +1,18 @@ +void script_3398(int arg0,int arg1,int arg2) { + switch (arg0) { + case 84: + script_3400(); + return; + case 13: + if (isWidgetHidden(new WidgetPointer(915,102))) { + script_3198(64159808, 64159809, 64159795, 64159787, 64159744); + } else { + script_3391(); + } + return; + case 1: + script_3196(2, 64159808, 64159809, 64159795, 64159787, 64159744); + return; + } + return; +} diff --git a/dumps/scripts/3399.cs2 b/dumps/scripts/3399.cs2 new file mode 100644 index 000000000..baf802c06 --- /dev/null +++ b/dumps/scripts/3399.cs2 @@ -0,0 +1,4 @@ +void script_3399() { + script_3400(); + return; +} diff --git a/dumps/scripts/34.cs2 b/dumps/scripts/34.cs2 new file mode 100644 index 000000000..f9b92d3d2 --- /dev/null +++ b/dumps/scripts/34.cs2 @@ -0,0 +1,6 @@ +void script_34(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + cs2method3109(0, divide(getWidgetActualHeight(), 2)); + } + return; +} diff --git a/dumps/scripts/340.cs2 b/dumps/scripts/340.cs2 new file mode 100644 index 000000000..0f0dbcca9 --- /dev/null +++ b/dumps/scripts/340.cs2 @@ -0,0 +1,6 @@ +void script_340() { + setWidgetSprite(3163, new WidgetPointer(205,54)); + setWidgetSprite(3163, new WidgetPointer(205,55)); + setWidgetSprite(3164, new WidgetPointer(205,56)); + return; +} diff --git a/dumps/scripts/3400.cs2 b/dumps/scripts/3400.cs2 new file mode 100644 index 000000000..6887b74ae --- /dev/null +++ b/dumps/scripts/3400.cs2 @@ -0,0 +1,8 @@ +void script_3400() { + if (strLength(globalstring_279) <= 0) { + return; + } + script_3391(); + script_3190(); + return; +} diff --git a/dumps/scripts/3401.cs2 b/dumps/scripts/3401.cs2 new file mode 100644 index 000000000..73664676a --- /dev/null +++ b/dumps/scripts/3401.cs2 @@ -0,0 +1,11 @@ +void script_3401() { + if ((globalint_1274 < 0) || (globalint_1274 > subtract(getWidgetActualHeight(new WidgetPointer(909,61)), getWidgetActualHeight(new WidgetPointer(909,62))))) { + script_3404(); + } else { + script_3403(globalint_1274, 1); + } + cs2method2301(59572285, -1, new WidgetPointer(909,62)); + setScriptCallOnMouseDragged(3402, -2147483646, 0, "i1", new WidgetPointer(909,62)); + setScriptCallOnMouseDragReleased(3402, -2147483646, 1, "i1", new WidgetPointer(909,62)); + return; +} diff --git a/dumps/scripts/3402.cs2 b/dumps/scripts/3402.cs2 new file mode 100644 index 000000000..f8ba654e2 --- /dev/null +++ b/dumps/scripts/3402.cs2 @@ -0,0 +1,11 @@ +void script_3402(int arg0,int arg1) { + if (((boolean)arg1)) { + if (arg0 < 0) { + arg0 = 0; + } else { + arg0 = subtract(arg0, mod(arg0, 15)); + } + } + script_3403(arg0, arg1); + return; +} diff --git a/dumps/scripts/3403.cs2 b/dumps/scripts/3403.cs2 new file mode 100644 index 000000000..63d577609 --- /dev/null +++ b/dumps/scripts/3403.cs2 @@ -0,0 +1,24 @@ +void script_3403(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = subtract(subtract(subtract(subtract(getWidgetActualHeight(new WidgetPointer(909,13)), getWidgetActualY(new WidgetPointer(909,61))), 35), arg0), 7); + if (((boolean)arg1)) { + ivar2 = subtract(ivar2, mod(ivar2, 15)); + } + if (ivar2 < 113) { + ivar2 = 113; + } + setWidgetSize(20, ivar2, 1, 0, new WidgetPointer(909,49)); + globalint_1274 = arg0; + setWidgetPosition(0, subtract(subtract(getWidgetActualY(new WidgetPointer(909,49)), getWidgetActualY(new WidgetPointer(909,61))), 7), 0, 0, new WidgetPointer(909,62)); + ivar3 = subtract(ivar2, 8); + ivar3 = subtract(ivar3, mod(ivar3, 15)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(909,52)), ivar3, 0, 0, new WidgetPointer(909,52)); + globalint_1122 = subtract(globalint_1122, subtract(ivar3, ivar3)); + script_3054(59572273); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(909,16)), add(ivar2, 86), 0, 1, new WidgetPointer(909,16)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(909,48)), add(ivar2, 86), 0, 1, new WidgetPointer(909,48)); + script_3029(59572269, 59572268, 59572270, 59572266, 59572265, 59572271); + script_3041(59572311, 59572310, 59572308, 59572302, 59572303); + return; +} diff --git a/dumps/scripts/3404.cs2 b/dumps/scripts/3404.cs2 new file mode 100644 index 000000000..83f116415 --- /dev/null +++ b/dumps/scripts/3404.cs2 @@ -0,0 +1,4 @@ +void script_3404() { + script_3403(subtract(getWidgetActualHeight(new WidgetPointer(909,61)), getWidgetActualHeight(new WidgetPointer(909,62))), 1); + return; +} diff --git a/dumps/scripts/3405.cs2 b/dumps/scripts/3405.cs2 new file mode 100644 index 000000000..fd15e03e7 --- /dev/null +++ b/dumps/scripts/3405.cs2 @@ -0,0 +1,29 @@ +void script_3405(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + cs2func_script_3406_struct(3,0,0) structdump_0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + structdump_0 = script_3406(); + ivar5 = structdump_0.intpart_2; + ivar4 = structdump_0.intpart_1; + ivar3 = structdump_0.intpart_0; + script_3054(arg0); + script_3173(arg1); + script_4567(arg2); + if (isWidgetHidden(new WidgetPointer(906,187)) && (ivar3 > globalint_1275)) { + setScriptCallOnGameloop(3407, getClientCycle(), new WidgetPointer(906,187), new WidgetPointer(-32768,3), "iII", new WidgetPointer(906,201)); + } + if (isWidgetHidden(new WidgetPointer(906,189)) && (ivar4 > globalint_1276)) { + setScriptCallOnGameloop(3407, getClientCycle(), new WidgetPointer(906,189), new WidgetPointer(-32768,3), "iII", new WidgetPointer(906,203)); + } + if (isWidgetHidden(new WidgetPointer(906,188)) && (ivar5 > globalint_1510)) { + setScriptCallOnGameloop(3407, getClientCycle(), new WidgetPointer(906,188), new WidgetPointer(-32768,3), "iII", new WidgetPointer(906,202)); + } + globalint_1275 = ivar3; + globalint_1276 = ivar4; + globalint_1510 = ivar5; + return; +} diff --git a/dumps/scripts/3406.cs2 b/dumps/scripts/3406.cs2 new file mode 100644 index 000000000..9a7ccdc0f --- /dev/null +++ b/dumps/scripts/3406.cs2 @@ -0,0 +1,30 @@ +cs2func_script_3406_struct(3,0,0) script_3406() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + while (ivar3 < 100) { + switch (cs2method5004(ivar3)) { + case 18: + case 3: + case 7: + ivar0 = add(ivar0, 1); + break; + case 20: + case 9: + ivar2 = add(ivar2, 1); + break; + case 42: + case 41: + case 44: + case 45: + ivar1 = add(ivar1, 1); + } + ivar3 = add(ivar3, 1); + } + return newstruct cs2func_script_3406_struct(ivar0, ivar1, ivar2); +} diff --git a/dumps/scripts/3407.cs2 b/dumps/scripts/3407.cs2 new file mode 100644 index 000000000..60a7f66ca --- /dev/null +++ b/dumps/scripts/3407.cs2 @@ -0,0 +1,24 @@ +void script_3407(int arg0,int arg1,int arg2) { + if (isWidgetHidden(new WidgetPointer(arg1))) { + deleteAllExtraChilds(new WidgetPointer(arg2)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg2)); + return; + } + if (mod(subtract(getClientCycle(), arg0), 40) < 20) { + if (setWidgetRegister(new WidgetPointer(arg2), 0)) { + setWidgetHidden(0); + } else { + createExtraChild(new WidgetPointer(arg2), 3, 0); + setWidgetSize(4, 2, 1, 1); + setWidgetPosition(0, 0, 1, 2); + setWidgetFilled(1); + cs2method2103(225); + setWidgetRGB(new Color(255, 255, 255)); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg2), 0)) { + setWidgetHidden(1); + } + } + return; +} diff --git a/dumps/scripts/3408.cs2 b/dumps/scripts/3408.cs2 new file mode 100644 index 000000000..76f383e30 --- /dev/null +++ b/dumps/scripts/3408.cs2 @@ -0,0 +1,12 @@ +void script_3408(int arg0,string arg1) { + string svar1; + string svar2; + svar1 = "" + arg1 + ""; + svar2 = "" + arg1 + ""; + setWidgetContextMenuOption(1, new WidgetPointer(arg0), "Open link"); + setScriptCallOnClickContextMenu(1897, "", new WidgetPointer(arg0)); + cs2method2309(1, 146, new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(2381, new WidgetPointer(arg0), 8978431, svar1, "Iis", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(2381, new WidgetPointer(arg0), 6605050, svar2, "Iis", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3409.cs2 b/dumps/scripts/3409.cs2 new file mode 100644 index 000000000..5260475b3 --- /dev/null +++ b/dumps/scripts/3409.cs2 @@ -0,0 +1,9 @@ +void script_3409(int arg0) { + string svar0; + svar0 = "Access Forums"; + script_3408(arg0, svar0); + setWidgetSize(getTextWidth(495, svar0), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), "" + svar0 + ""); + setScriptCallOnClickContextMenu(3410, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/341.cs2 b/dumps/scripts/341.cs2 new file mode 100644 index 000000000..7624b1da9 --- /dev/null +++ b/dumps/scripts/341.cs2 @@ -0,0 +1,6 @@ +void script_341() { + setWidgetSprite(3165, new WidgetPointer(205,50)); + setWidgetSprite(3165, new WidgetPointer(205,51)); + setWidgetSprite(3166, new WidgetPointer(205,52)); + return; +} diff --git a/dumps/scripts/3410.cs2 b/dumps/scripts/3410.cs2 new file mode 100644 index 000000000..31640f602 --- /dev/null +++ b/dumps/scripts/3410.cs2 @@ -0,0 +1,4 @@ +void script_3410() { + cs2method5400(0, "forum", "forums.ws"); + return; +} diff --git a/dumps/scripts/3411.cs2 b/dumps/scripts/3411.cs2 new file mode 100644 index 000000000..e15c458a8 --- /dev/null +++ b/dumps/scripts/3411.cs2 @@ -0,0 +1,16 @@ +void script_3411() { + globalint_1240 = 3; + globalint_1277 = 0; + if (hasSSKey()) { + script_1174(5); + if (((boolean)globalint_1273)) { + return; + } + setScriptCallOnGameloop(3381, new WidgetPointer(975,44), 0, "Ii", new WidgetPointer(975,44)); + } else if (((boolean)script_3487(3))) { + script_1174(7); + } else { + script_1174(11); + } + return; +} diff --git a/dumps/scripts/3412.cs2 b/dumps/scripts/3412.cs2 new file mode 100644 index 000000000..91ceb90ca --- /dev/null +++ b/dumps/scripts/3412.cs2 @@ -0,0 +1,5 @@ +void script_3412(int arg0,int arg1) { + setWidgetText(new WidgetPointer(arg0), "High-risk Wilderness World"); + setWidgetText(new WidgetPointer(arg1), "Warning: This is a High-risk Wilderness world." + "
" + "
" + "While you are in the Wilderness on this world, you will not be permitted to use the Protect Item prayer or curse, so you may lose ALL your items when you die." + "
" + "
" + "You have been warned!"); + return; +} diff --git a/dumps/scripts/3413.cs2 b/dumps/scripts/3413.cs2 new file mode 100644 index 000000000..c2565fafa --- /dev/null +++ b/dumps/scripts/3413.cs2 @@ -0,0 +1,9 @@ +void script_3413(int arg0) { + if (((boolean)arg0)) { + script_2694(arg0, 1, "This setting is not available in your current version of Java.", "", ""); + script_2694(arg0, 1, "Please update to the latest version.", "", ""); + } else { + script_2694(arg0, 1, "This setting is not available in your current version of Java." + "
" + "
" + "Please update to the latest version, or try our Windows Client available from the link below.", "Download Windows Client", "kbase/view.ws?guid=Downloads_and_Wallpapers"); + } + return; +} diff --git a/dumps/scripts/3414.cs2 b/dumps/scripts/3414.cs2 new file mode 100644 index 000000000..86e010b80 --- /dev/null +++ b/dumps/scripts/3414.cs2 @@ -0,0 +1,6 @@ +void script_3414(int arg0) { + if (bitconfig_7868 == 2) { + setWidgetModel(57477, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3415.cs2 b/dumps/scripts/3415.cs2 new file mode 100644 index 000000000..28543c317 --- /dev/null +++ b/dumps/scripts/3415.cs2 @@ -0,0 +1,24 @@ +cs2func_script_3415_struct(2,0,0) script_3415(int arg0) { + if (((boolean)arg0)) { + cs2method5405(0, 6); + cs2method5405(1, 6); + cs2method5406(0, 0, 39670136, 800, 39588214, 835, 0); + cs2method5406(1, 0, 39440756, 415, 39375218, 430, 0); + cs2method5406(0, 1, 39424372, 985, 39375219, 930, 0); + cs2method5406(1, 1, 39244140, 458, 39162214, 458, 0); + script_1899(0, 150, 150); + cs2method5406(0, 2, 39211370, 1025, 39145827, 810, 1200); + cs2method5406(1, 2, 39293279, 430, 39342430, 415, 0); + script_1899(1, 150, 150); + cs2method5406(0, 3, 39293278, 670, 39391581, 630, 400); + cs2method5406(1, 3, 39489881, 346, 39539030, 346, 0); + script_1899(2, 150, 150); + cs2method5406(0, 4, 39522648, 1150, 39571795, 1490, -600); + cs2method5406(1, 4, 39522637, 394, 39522637, 394, 0); + script_1899(3, 150, 150); + cs2method5406(0, 5, 39522635, 475, 39506249, 0, 0); + cs2method5406(1, 5, 39522635, 330, 39522633, 330, 0); + script_1899(4, 150, 150); + } + return newstruct cs2func_script_3415_struct(39293279, 0); +} diff --git a/dumps/scripts/3416.cs2 b/dumps/scripts/3416.cs2 new file mode 100644 index 000000000..7a161b6ea --- /dev/null +++ b/dumps/scripts/3416.cs2 @@ -0,0 +1,5 @@ +void script_3416(int arg0) { + setWidgetSprite(3153, new WidgetPointer(arg0)); + setScriptCallOnMousePressed(1242, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3417.cs2 b/dumps/scripts/3417.cs2 new file mode 100644 index 000000000..478145bb3 --- /dev/null +++ b/dumps/scripts/3417.cs2 @@ -0,0 +1,16 @@ +void script_3417(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + if (arg0 != 1) { + return; + } + if (standart_config_287 == arg1) { + if (((boolean)arg1)) { + arg1 = 1; + } else { + return; + } + } + standart_config_287 = arg1; + playSoundEffect(2266, 1, 0); + script_2735(arg2, arg3, arg4, arg5, arg6, arg7); + return; +} diff --git a/dumps/scripts/3418.cs2 b/dumps/scripts/3418.cs2 new file mode 100644 index 000000000..d511b3dd5 --- /dev/null +++ b/dumps/scripts/3418.cs2 @@ -0,0 +1,20 @@ +void script_3418(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = 2289; + ivar4 = 2288; + if (arg2 == arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(ivar3); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(ivar4); + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar3, "Iid", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), ivar4, "Iid", new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/3419.cs2 b/dumps/scripts/3419.cs2 new file mode 100644 index 000000000..8671419c1 --- /dev/null +++ b/dumps/scripts/3419.cs2 @@ -0,0 +1,5 @@ +void script_3419() { + setWidgetScrollMax(431, 1863, new WidgetPointer(422,11)); + script_31(27656206, 27656203, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/342.cs2 b/dumps/scripts/342.cs2 new file mode 100644 index 000000000..843bacfdd --- /dev/null +++ b/dumps/scripts/342.cs2 @@ -0,0 +1,6 @@ +void script_342() { + setWidgetSprite(3163, new WidgetPointer(205,50)); + setWidgetSprite(3163, new WidgetPointer(205,51)); + setWidgetSprite(3164, new WidgetPointer(205,52)); + return; +} diff --git a/dumps/scripts/3420.cs2 b/dumps/scripts/3420.cs2 new file mode 100644 index 000000000..7c88f43f1 --- /dev/null +++ b/dumps/scripts/3420.cs2 @@ -0,0 +1,13 @@ +void script_3420() { + if (globalint_1279 != 1) { + playSoundEffect(9445, 1, 0); + } + globalint_1279 = 1; + setWidgetIsHidden(true, new WidgetPointer(60,45)); + setWidgetIsHidden(false, new WidgetPointer(60,46)); + setWidgetIsHidden(true, new WidgetPointer(60,87)); + setWidgetIsHidden(true, new WidgetPointer(60,20)); + setWidgetIsHidden(false, new WidgetPointer(60,17)); + setWidgetIsHidden(true, new WidgetPointer(60,14)); + return; +} diff --git a/dumps/scripts/3421.cs2 b/dumps/scripts/3421.cs2 new file mode 100644 index 000000000..761ff0937 --- /dev/null +++ b/dumps/scripts/3421.cs2 @@ -0,0 +1,13 @@ +void script_3421() { + if (globalint_1279 != 2) { + playSoundEffect(9445, 1, 0); + } + globalint_1279 = 2; + setWidgetIsHidden(true, new WidgetPointer(60,45)); + setWidgetIsHidden(true, new WidgetPointer(60,46)); + setWidgetIsHidden(false, new WidgetPointer(60,87)); + setWidgetIsHidden(true, new WidgetPointer(60,20)); + setWidgetIsHidden(true, new WidgetPointer(60,17)); + setWidgetIsHidden(false, new WidgetPointer(60,14)); + return; +} diff --git a/dumps/scripts/3422.cs2 b/dumps/scripts/3422.cs2 new file mode 100644 index 000000000..984a93d68 --- /dev/null +++ b/dumps/scripts/3422.cs2 @@ -0,0 +1,23 @@ +void script_3422() { + script_3425(3932336, 3932337); + script_3425(3932341, 3932342); + script_3425(3932346, 3932347); + script_3425(3932351, 3932352); + script_3425(3932356, 3932357); + script_3425(3932361, 3932362); + script_3425(3932366, 3932367); + script_3425(3932371, 3932372); + script_3425(3932376, 3932377); + script_3425(3932381, 3932382); + script_3425(3932421, 3932422); + script_3425(3932417, 3932418); + script_3425(3932413, 3932414); + script_3425(3932409, 3932410); + script_3425(3932405, 3932406); + script_3425(3932401, 3932402); + script_3425(3932397, 3932398); + script_3425(3932393, 3932394); + script_3425(3932389, 3932390); + script_3425(3932385, 3932386); + return; +} diff --git a/dumps/scripts/3423.cs2 b/dumps/scripts/3423.cs2 new file mode 100644 index 000000000..337a25dc1 --- /dev/null +++ b/dumps/scripts/3423.cs2 @@ -0,0 +1,12 @@ +void script_3423() { + script_3425(3932245, 3932246); + script_3425(3932241, 3932242); + script_3425(3932237, 3932238); + script_3425(3932212, 3932213); + script_3425(3932233, 3932234); + script_3425(3932229, 3932230); + script_3425(3932225, 3932226); + script_3425(3932221, 3932222); + script_3425(3932426, 3932427); + return; +} diff --git a/dumps/scripts/3424.cs2 b/dumps/scripts/3424.cs2 new file mode 100644 index 000000000..023e5c3c8 --- /dev/null +++ b/dumps/scripts/3424.cs2 @@ -0,0 +1,17 @@ +void script_3424() { + script_3425(3932256, 3932257); + script_3425(3932261, 3932262); + script_3425(3932266, 3932267); + script_3425(3932321, 3932322); + script_3425(3932317, 3932318); + script_3425(3932313, 3932314); + script_3425(3932309, 3932310); + script_3425(3932305, 3932306); + script_3425(3932301, 3932302); + script_3425(3932297, 3932298); + script_3425(3932293, 3932294); + script_3425(3932289, 3932290); + script_3425(3932285, 3932286); + script_3425(3932281, 3932282); + return; +} diff --git a/dumps/scripts/3425.cs2 b/dumps/scripts/3425.cs2 new file mode 100644 index 000000000..a54771831 --- /dev/null +++ b/dumps/scripts/3425.cs2 @@ -0,0 +1,15 @@ +void script_3425(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = cs2method_3408(73, 79, 3058, arg1); + ivar3 = cs2method_3408(79, 105, 3059, ivar2); + if (ivar2 == 4055) { + setWidgetText(new WidgetPointer(arg0), "Free!"); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(ivar3)); + } + setItemOnWidgetMethod2200(ivar2, -1, new WidgetPointer(arg1)); + setWidgetBorderThickness(1, new WidgetPointer(arg1)); + setWidgetShadowColor(new Color(51, 51, 51), new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/3426.cs2 b/dumps/scripts/3426.cs2 new file mode 100644 index 000000000..b52418cfb --- /dev/null +++ b/dumps/scripts/3426.cs2 @@ -0,0 +1,6 @@ +void script_3426(int arg0) { + string svar0; + svar0 = cs2method_3408(73, 115, 3063, arg0); + setWidgetText(new WidgetPointer(60,92), svar0); + return; +} diff --git a/dumps/scripts/3427.cs2 b/dumps/scripts/3427.cs2 new file mode 100644 index 000000000..fe55b4eed --- /dev/null +++ b/dumps/scripts/3427.cs2 @@ -0,0 +1,4 @@ +void script_3427() { + setWidgetText(new WidgetPointer(60,92), "Items can be bought with Castle Wars tickets only."); + return; +} diff --git a/dumps/scripts/3428.cs2 b/dumps/scripts/3428.cs2 new file mode 100644 index 000000000..36ee93c14 --- /dev/null +++ b/dumps/scripts/3428.cs2 @@ -0,0 +1,18 @@ +void script_3428() { + setItemOnWidgetMethod2200(18739, -1, new WidgetPointer(985,29)); + setWidgetBorderThickness(1, new WidgetPointer(985,29)); + setWidgetShadowColor(new Color(51, 51, 51), new WidgetPointer(985,29)); + setItemOnWidgetMethod2200(18740, -1, new WidgetPointer(985,65)); + setWidgetBorderThickness(1, new WidgetPointer(985,65)); + setWidgetShadowColor(new Color(51, 51, 51), new WidgetPointer(985,65)); + setItemOnWidgetMethod2200(18741, -1, new WidgetPointer(985,64)); + setWidgetBorderThickness(1, new WidgetPointer(985,64)); + setWidgetShadowColor(new Color(51, 51, 51), new WidgetPointer(985,64)); + setItemOnWidgetMethod2200(18742, -1, new WidgetPointer(985,63)); + setWidgetBorderThickness(1, new WidgetPointer(985,63)); + setWidgetShadowColor(new Color(51, 51, 51), new WidgetPointer(985,63)); + setItemOnWidgetMethod2200(18743, -1, new WidgetPointer(985,62)); + setWidgetBorderThickness(1, new WidgetPointer(985,62)); + setWidgetShadowColor(new Color(51, 51, 51), new WidgetPointer(985,62)); + return; +} diff --git a/dumps/scripts/3429.cs2 b/dumps/scripts/3429.cs2 new file mode 100644 index 000000000..215adc607 --- /dev/null +++ b/dumps/scripts/3429.cs2 @@ -0,0 +1,6 @@ +void script_3429(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetSprite(arg3, new WidgetPointer(arg0)); + setWidgetSprite(arg4, new WidgetPointer(arg1)); + setWidgetSprite(arg5, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/343.cs2 b/dumps/scripts/343.cs2 new file mode 100644 index 000000000..86cf9e806 --- /dev/null +++ b/dumps/scripts/343.cs2 @@ -0,0 +1,6 @@ +void script_343() { + setWidgetSprite(3165, new WidgetPointer(205,46)); + setWidgetSprite(3165, new WidgetPointer(205,47)); + setWidgetSprite(3166, new WidgetPointer(205,48)); + return; +} diff --git a/dumps/scripts/3430.cs2 b/dumps/scripts/3430.cs2 new file mode 100644 index 000000000..486010a0c --- /dev/null +++ b/dumps/scripts/3430.cs2 @@ -0,0 +1,206 @@ +void script_3430() { + setWidgetFilled(0, new WidgetPointer(54,25)); + setWidgetFilled(0, new WidgetPointer(54,27)); + setWidgetFilled(0, new WidgetPointer(54,29)); + setWidgetFilled(0, new WidgetPointer(54,31)); + setWidgetFilled(0, new WidgetPointer(54,33)); + setWidgetFilled(0, new WidgetPointer(54,35)); + setWidgetFilled(0, new WidgetPointer(54,37)); + setWidgetFilled(0, new WidgetPointer(54,39)); + setWidgetFilled(0, new WidgetPointer(54,41)); + setWidgetFilled(0, new WidgetPointer(54,43)); + setWidgetFilled(0, new WidgetPointer(54,45)); + setWidgetFilled(0, new WidgetPointer(54,47)); + setWidgetFilled(0, new WidgetPointer(54,49)); + setWidgetFilled(0, new WidgetPointer(54,51)); + setWidgetFilled(0, new WidgetPointer(54,53)); + setWidgetFilled(0, new WidgetPointer(54,55)); + setWidgetFilled(0, new WidgetPointer(54,57)); + setWidgetFilled(0, new WidgetPointer(54,59)); + setWidgetFilled(0, new WidgetPointer(54,61)); + setWidgetFilled(0, new WidgetPointer(54,63)); + setWidgetFilled(0, new WidgetPointer(54,65)); + setWidgetFilled(0, new WidgetPointer(54,67)); + setWidgetFilled(0, new WidgetPointer(54,69)); + setWidgetFilled(0, new WidgetPointer(54,71)); + setWidgetFilled(0, new WidgetPointer(54,73)); + setWidgetFilled(0, new WidgetPointer(54,75)); + setWidgetFilled(0, new WidgetPointer(54,77)); + setWidgetFilled(0, new WidgetPointer(54,79)); + setWidgetFilled(0, new WidgetPointer(54,81)); + setWidgetFilled(0, new WidgetPointer(54,83)); + setWidgetFilled(0, new WidgetPointer(54,85)); + setWidgetFilled(0, new WidgetPointer(54,87)); + setWidgetFilled(0, new WidgetPointer(54,89)); + setWidgetFilled(0, new WidgetPointer(54,91)); + setWidgetFilled(0, new WidgetPointer(54,93)); + setWidgetFilled(0, new WidgetPointer(54,95)); + setWidgetFilled(0, new WidgetPointer(54,97)); + setWidgetFilled(0, new WidgetPointer(54,99)); + setWidgetFilled(0, new WidgetPointer(54,101)); + setWidgetFilled(0, new WidgetPointer(54,103)); + setWidgetFilled(0, new WidgetPointer(54,105)); + setWidgetFilled(0, new WidgetPointer(54,107)); + setWidgetFilled(0, new WidgetPointer(54,109)); + setWidgetFilled(0, new WidgetPointer(54,111)); + setWidgetFilled(0, new WidgetPointer(54,113)); + setWidgetFilled(0, new WidgetPointer(54,115)); + setWidgetFilled(0, new WidgetPointer(54,117)); + setWidgetFilled(0, new WidgetPointer(54,119)); + setWidgetFilled(0, new WidgetPointer(54,121)); + setWidgetFilled(0, new WidgetPointer(54,123)); + setWidgetFilled(0, new WidgetPointer(54,125)); + setWidgetFilled(0, new WidgetPointer(54,127)); + setWidgetFilled(0, new WidgetPointer(54,129)); + setWidgetFilled(0, new WidgetPointer(54,131)); + setWidgetFilled(0, new WidgetPointer(54,133)); + setWidgetFilled(0, new WidgetPointer(54,135)); + if (((boolean)bitconfig_157)) { + if (bitconfig_156 == 3) { + setWidgetFilled(1, new WidgetPointer(54,25)); + } else if (bitconfig_156 == 4) { + setWidgetFilled(1, new WidgetPointer(54,27)); + } else if (bitconfig_156 == 5) { + setWidgetFilled(1, new WidgetPointer(54,29)); + } else if (bitconfig_156 == 6) { + setWidgetFilled(1, new WidgetPointer(54,31)); + } else if (bitconfig_156 == 7) { + setWidgetFilled(1, new WidgetPointer(54,33)); + } else { + if (bitconfig_156 == 8) { + setWidgetFilled(1, new WidgetPointer(54,35)); + } + } + } else if (bitconfig_157 == 2) { + if (bitconfig_156 == 3) { + setWidgetFilled(1, new WidgetPointer(54,37)); + } else if (bitconfig_156 == 4) { + setWidgetFilled(1, new WidgetPointer(54,39)); + } else if (bitconfig_156 == 5) { + setWidgetFilled(1, new WidgetPointer(54,41)); + } else if (bitconfig_156 == 6) { + setWidgetFilled(1, new WidgetPointer(54,43)); + } else if (bitconfig_156 == 7) { + setWidgetFilled(1, new WidgetPointer(54,45)); + } else { + if (bitconfig_156 == 8) { + setWidgetFilled(1, new WidgetPointer(54,47)); + } + } + } else if (bitconfig_157 == 3) { + if (((boolean)bitconfig_156)) { + setWidgetFilled(1, new WidgetPointer(54,49)); + } else if (bitconfig_156 == 2) { + setWidgetFilled(1, new WidgetPointer(54,51)); + } else if (bitconfig_156 == 3) { + setWidgetFilled(1, new WidgetPointer(54,53)); + } else if (bitconfig_156 == 4) { + setWidgetFilled(1, new WidgetPointer(54,55)); + } else if (bitconfig_156 == 5) { + setWidgetFilled(1, new WidgetPointer(54,57)); + } else if (bitconfig_156 == 6) { + setWidgetFilled(1, new WidgetPointer(54,59)); + } else if (bitconfig_156 == 7) { + setWidgetFilled(1, new WidgetPointer(54,61)); + } else { + if (bitconfig_156 == 8) { + setWidgetFilled(1, new WidgetPointer(54,63)); + } + } + } else if (bitconfig_157 == 4) { + if (((boolean)bitconfig_156)) { + setWidgetFilled(1, new WidgetPointer(54,65)); + } else if (bitconfig_156 == 2) { + setWidgetFilled(1, new WidgetPointer(54,67)); + } else if (bitconfig_156 == 3) { + setWidgetFilled(1, new WidgetPointer(54,69)); + } else if (bitconfig_156 == 4) { + setWidgetFilled(1, new WidgetPointer(54,71)); + } else if (bitconfig_156 == 5) { + setWidgetFilled(1, new WidgetPointer(54,73)); + } else if (bitconfig_156 == 6) { + setWidgetFilled(1, new WidgetPointer(54,75)); + } else if (bitconfig_156 == 7) { + setWidgetFilled(1, new WidgetPointer(54,77)); + } else { + if (bitconfig_156 == 8) { + setWidgetFilled(1, new WidgetPointer(54,79)); + } + } + } else if (bitconfig_157 == 5) { + if (((boolean)bitconfig_156)) { + setWidgetFilled(1, new WidgetPointer(54,81)); + } else if (bitconfig_156 == 2) { + setWidgetFilled(1, new WidgetPointer(54,83)); + } else if (bitconfig_156 == 3) { + setWidgetFilled(1, new WidgetPointer(54,85)); + } else if (bitconfig_156 == 4) { + setWidgetFilled(1, new WidgetPointer(54,87)); + } else if (bitconfig_156 == 5) { + setWidgetFilled(1, new WidgetPointer(54,89)); + } else if (bitconfig_156 == 6) { + setWidgetFilled(1, new WidgetPointer(54,91)); + } else if (bitconfig_156 == 7) { + setWidgetFilled(1, new WidgetPointer(54,93)); + } else { + if (bitconfig_156 == 8) { + setWidgetFilled(1, new WidgetPointer(54,95)); + } + } + } else if (bitconfig_157 == 6) { + if (((boolean)bitconfig_156)) { + setWidgetFilled(1, new WidgetPointer(54,97)); + } else if (bitconfig_156 == 2) { + setWidgetFilled(1, new WidgetPointer(54,99)); + } else if (bitconfig_156 == 3) { + setWidgetFilled(1, new WidgetPointer(54,101)); + } else if (bitconfig_156 == 4) { + setWidgetFilled(1, new WidgetPointer(54,103)); + } else if (bitconfig_156 == 5) { + setWidgetFilled(1, new WidgetPointer(54,105)); + } else if (bitconfig_156 == 6) { + setWidgetFilled(1, new WidgetPointer(54,107)); + } else if (bitconfig_156 == 7) { + setWidgetFilled(1, new WidgetPointer(54,109)); + } else { + if (bitconfig_156 == 8) { + setWidgetFilled(1, new WidgetPointer(54,111)); + } + } + } else if (bitconfig_157 == 7) { + if (((boolean)bitconfig_156)) { + setWidgetFilled(1, new WidgetPointer(54,113)); + } else if (bitconfig_156 == 2) { + setWidgetFilled(1, new WidgetPointer(54,115)); + } else if (bitconfig_156 == 3) { + setWidgetFilled(1, new WidgetPointer(54,117)); + } else if (bitconfig_156 == 4) { + setWidgetFilled(1, new WidgetPointer(54,119)); + } else if (bitconfig_156 == 5) { + setWidgetFilled(1, new WidgetPointer(54,121)); + } else { + if (bitconfig_156 == 6) { + setWidgetFilled(1, new WidgetPointer(54,123)); + } + } + } else { + if (bitconfig_157 == 8) { + if (((boolean)bitconfig_156)) { + setWidgetFilled(1, new WidgetPointer(54,125)); + } else if (bitconfig_156 == 2) { + setWidgetFilled(1, new WidgetPointer(54,127)); + } else if (bitconfig_156 == 3) { + setWidgetFilled(1, new WidgetPointer(54,129)); + } else if (bitconfig_156 == 4) { + setWidgetFilled(1, new WidgetPointer(54,131)); + } else if (bitconfig_156 == 5) { + setWidgetFilled(1, new WidgetPointer(54,133)); + } else { + if (bitconfig_156 == 6) { + setWidgetFilled(1, new WidgetPointer(54,135)); + } + } + } + } + return; +} diff --git a/dumps/scripts/3431.cs2 b/dumps/scripts/3431.cs2 new file mode 100644 index 000000000..147d1e61b --- /dev/null +++ b/dumps/scripts/3431.cs2 @@ -0,0 +1,150 @@ +void script_3431(int arg0,int arg1,int arg2) { + if (((boolean)arg1)) { + if (arg0 == 3) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,25)); + } else if (arg0 == 4) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,27)); + } else if (arg0 == 5) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,29)); + } else if (arg0 == 6) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,31)); + } else if (arg0 == 7) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,33)); + } else { + if (arg0 == 8) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,35)); + } + } + } else if (arg1 == 2) { + if (arg0 == 3) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,37)); + } else if (arg0 == 4) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,39)); + } else if (arg0 == 5) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,41)); + } else if (arg0 == 6) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,43)); + } else if (arg0 == 7) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,45)); + } else { + if (arg0 == 8) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,47)); + } + } + } else if (arg1 == 3) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,49)); + } else if (arg0 == 2) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,51)); + } else if (arg0 == 3) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,53)); + } else if (arg0 == 4) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,55)); + } else if (arg0 == 5) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,57)); + } else if (arg0 == 6) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,59)); + } else if (arg0 == 7) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,61)); + } else { + if (arg0 == 8) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,63)); + } + } + } else if (arg1 == 4) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,65)); + } else if (arg0 == 2) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,67)); + } else if (arg0 == 3) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,69)); + } else if (arg0 == 4) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,71)); + } else if (arg0 == 5) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,73)); + } else if (arg0 == 6) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,75)); + } else if (arg0 == 7) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,77)); + } else { + if (arg0 == 8) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,79)); + } + } + } else if (arg1 == 5) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,81)); + } else if (arg0 == 2) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,83)); + } else if (arg0 == 3) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,85)); + } else if (arg0 == 4) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,87)); + } else if (arg0 == 5) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,89)); + } else if (arg0 == 6) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,91)); + } else if (arg0 == 7) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,93)); + } else { + if (arg0 == 8) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,95)); + } + } + } else if (arg1 == 6) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,97)); + } else if (arg0 == 2) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,99)); + } else if (arg0 == 3) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,101)); + } else if (arg0 == 4) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,103)); + } else if (arg0 == 5) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,105)); + } else if (arg0 == 6) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,107)); + } else if (arg0 == 7) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,109)); + } else { + if (arg0 == 8) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,111)); + } + } + } else if (arg1 == 7) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,113)); + } else if (arg0 == 2) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,115)); + } else if (arg0 == 3) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,117)); + } else if (arg0 == 4) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,119)); + } else if (arg0 == 5) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,121)); + } else { + if (arg0 == 6) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,123)); + } + } + } else { + if (arg1 == 8) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,125)); + } else if (arg0 == 2) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,127)); + } else if (arg0 == 3) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,129)); + } else if (arg0 == 4) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,131)); + } else if (arg0 == 5) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,133)); + } else { + if (arg0 == 6) { + setWidgetRGB(new Color(arg2), new WidgetPointer(54,135)); + } + } + } + } + return; +} diff --git a/dumps/scripts/3432.cs2 b/dumps/scripts/3432.cs2 new file mode 100644 index 000000000..37a2941b2 --- /dev/null +++ b/dumps/scripts/3432.cs2 @@ -0,0 +1,4 @@ +void script_3432(int arg0) { + cs2method2103(0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3433.cs2 b/dumps/scripts/3433.cs2 new file mode 100644 index 000000000..b39fec7b4 --- /dev/null +++ b/dumps/scripts/3433.cs2 @@ -0,0 +1,4 @@ +void script_3433(int arg0) { + cs2method2103(140, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3434.cs2 b/dumps/scripts/3434.cs2 new file mode 100644 index 000000000..207ddda16 --- /dev/null +++ b/dumps/scripts/3434.cs2 @@ -0,0 +1,23 @@ +void script_3434(int arg0) { + if (((boolean)globalint_1280)) { + return; + } + if (globalint_1278 != arg0) { + playSoundEffect(9439, 1, 0); + } + globalint_1278 = arg0; + setWidgetSprite(1134, new WidgetPointer(54,16)); + setWidgetSprite(1134, new WidgetPointer(54,17)); + setWidgetSprite(1134, new WidgetPointer(54,18)); + if (((boolean)globalint_1278)) { + setWidgetSprite(1135, new WidgetPointer(54,16)); + } else if (globalint_1278 == 2) { + setWidgetSprite(1135, new WidgetPointer(54,17)); + } else if (globalint_1278 == 3) { + setWidgetSprite(1135, new WidgetPointer(54,18)); + } else { + globalint_1278 = 1; + setWidgetSprite(1135, new WidgetPointer(54,16)); + } + return; +} diff --git a/dumps/scripts/3435.cs2 b/dumps/scripts/3435.cs2 new file mode 100644 index 000000000..0d0d886f8 --- /dev/null +++ b/dumps/scripts/3435.cs2 @@ -0,0 +1,4 @@ +void script_3435() { + globalint_1280 = 1; + return; +} diff --git a/dumps/scripts/3436.cs2 b/dumps/scripts/3436.cs2 new file mode 100644 index 000000000..313145e3a --- /dev/null +++ b/dumps/scripts/3436.cs2 @@ -0,0 +1,21 @@ +void script_3436(int arg0,int arg1,int arg2,string arg3) { + setWidgetModel(arg0, new WidgetPointer(311,57)); + setWidgetText(new WidgetPointer(311,59), arg3); + setWidgetIsHidden(true, new WidgetPointer(311,39)); + setWidgetIsHidden(true, new WidgetPointer(311,11)); + setWidgetIsHidden(true, new WidgetPointer(311,7)); + setWidgetIsHidden(true, new WidgetPointer(311,3)); + setWidgetIsHidden(true, new WidgetPointer(311,23)); + setWidgetIsHidden(true, new WidgetPointer(311,19)); + setWidgetIsHidden(true, new WidgetPointer(311,15)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetSprite(4041, new WidgetPointer(311,24)); + setWidgetSprite(4041, new WidgetPointer(311,20)); + setWidgetSprite(4041, new WidgetPointer(311,16)); + setWidgetSprite(4041, new WidgetPointer(311,12)); + setWidgetSprite(4041, new WidgetPointer(311,8)); + setWidgetSprite(4041, new WidgetPointer(311,4)); + setWidgetSprite(4041, new WidgetPointer(311,0)); + setWidgetSprite(4043, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/3437.cs2 b/dumps/scripts/3437.cs2 new file mode 100644 index 000000000..73ed2e196 --- /dev/null +++ b/dumps/scripts/3437.cs2 @@ -0,0 +1,61 @@ +void script_3437() { + int ivar0; + ivar0 = -1; + if (((boolean)bitconfig_7912) || (((bitconfig_7904 == 8) && ((boolean)bitconfig_7921)) && ((boolean)bitconfig_7916))) { + if (bitconfig_7919 < 3) { + if (((boolean)bitconfig_7920)) { + ivar0 = cs2method_3408(105, 109, 5079, bitconfig_7919); + } + if (bitconfig_7920 == 2) { + ivar0 = cs2method_3408(105, 109, 5080, bitconfig_7919); + } + if (bitconfig_7920 == 3) { + ivar0 = cs2method_3408(105, 109, 5081, bitconfig_7919); + } + } else if (bitconfig_7919 < 6) { + if (((boolean)bitconfig_7920)) { + ivar0 = cs2method_3408(105, 109, 5080, bitconfig_7919); + } + if (bitconfig_7920 == 2) { + ivar0 = cs2method_3408(105, 109, 5081, bitconfig_7919); + } + if (bitconfig_7920 == 3) { + ivar0 = cs2method_3408(105, 109, 5079, bitconfig_7919); + } + } else if (bitconfig_7919 == 10) { + if (bitconfig_7920 == 3) { + ivar0 = cs2method_3408(105, 109, 5080, bitconfig_7919); + } + if (bitconfig_7920 == 2) { + ivar0 = cs2method_3408(105, 109, 5081, bitconfig_7919); + } + if (((boolean)bitconfig_7920)) { + ivar0 = cs2method_3408(105, 109, 5079, bitconfig_7919); + } + } else { + if (((boolean)bitconfig_7920)) { + ivar0 = cs2method_3408(105, 109, 5081, bitconfig_7919); + } + if (bitconfig_7920 == 2) { + ivar0 = cs2method_3408(105, 109, 5079, bitconfig_7919); + } + if (bitconfig_7920 == 3) { + ivar0 = cs2method_3408(105, 109, 5080, bitconfig_7919); + } + } + setWidgetModel(ivar0, new WidgetPointer(986,3)); + if (bitconfig_7920 != 0) { + setWidgetIsHidden(false, new WidgetPointer(986,5)); + } + if (((boolean)bitconfig_7920)) { + setWidgetPosition(30, 205, 0, 0, new WidgetPointer(986,5)); + } else if (bitconfig_7920 == 2) { + setWidgetPosition(112, 205, 0, 0, new WidgetPointer(986,5)); + } else if (bitconfig_7920 == 3) { + setWidgetPosition(196, 205, 0, 0, new WidgetPointer(986,5)); + } else { + setWidgetIsHidden(true, new WidgetPointer(986,5)); + } + } + return; +} diff --git a/dumps/scripts/3438.cs2 b/dumps/scripts/3438.cs2 new file mode 100644 index 000000000..5cc5fdecf --- /dev/null +++ b/dumps/scripts/3438.cs2 @@ -0,0 +1,12 @@ +void script_3438() { + if (((boolean)getLanguage())) { + setWidgetSprite(861, new WidgetPointer(329,11)); + } else if (getLanguage() == 2) { + setWidgetSprite(644, new WidgetPointer(329,11)); + } else { + if (getLanguage() == 3) { + setWidgetSprite(866, new WidgetPointer(329,11)); + } + } + return; +} diff --git a/dumps/scripts/3439.cs2 b/dumps/scripts/3439.cs2 new file mode 100644 index 000000000..b45345f81 --- /dev/null +++ b/dumps/scripts/3439.cs2 @@ -0,0 +1,18 @@ +void script_3439() { + setWidgetIsHidden(false, new WidgetPointer(1128,192)); + setWidgetIsHidden(false, new WidgetPointer(1128,88)); + setWidgetIsHidden(false, new WidgetPointer(1128,117)); + setWidgetIsHidden(false, new WidgetPointer(1128,155)); + setWidgetIsHidden(false, new WidgetPointer(1128,229)); + setWidgetIsHidden(false, new WidgetPointer(1128,266)); + setWidgetIsHidden(false, new WidgetPointer(1128,303)); + setWidgetText(new WidgetPointer(1128,9), concat("20", "/" + intToStr(20))); + setWidgetText(new WidgetPointer(1128,135), concat("20", "/" + intToStr(20))); + setWidgetText(new WidgetPointer(1128,173), concat("30", "/" + intToStr(20))); + setWidgetText(new WidgetPointer(1128,210), concat("28", "/" + intToStr(20))); + setWidgetText(new WidgetPointer(1128,247), concat("24", "/" + intToStr(20))); + setWidgetText(new WidgetPointer(1128,284), concat("26", "/" + intToStr(20))); + setWidgetText(new WidgetPointer(1128,321), concat("200", "/" + intToStr(200))); + setWidgetText(new WidgetPointer(1128,13), intToStr(bitconfig_5505)); + return; +} diff --git a/dumps/scripts/344.cs2 b/dumps/scripts/344.cs2 new file mode 100644 index 000000000..28ddcff1f --- /dev/null +++ b/dumps/scripts/344.cs2 @@ -0,0 +1,6 @@ +void script_344() { + setWidgetSprite(3163, new WidgetPointer(205,46)); + setWidgetSprite(3163, new WidgetPointer(205,47)); + setWidgetSprite(3164, new WidgetPointer(205,48)); + return; +} diff --git a/dumps/scripts/3440.cs2 b/dumps/scripts/3440.cs2 new file mode 100644 index 000000000..98bca7ab6 --- /dev/null +++ b/dumps/scripts/3440.cs2 @@ -0,0 +1,12 @@ +void script_3440(int arg0,int arg1) { + playSoundEffect2False(6185, 1, 0, 200); + if (isWidgetHidden(new WidgetPointer(arg0))) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetSprite(6007, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetSprite(6009, new WidgetPointer(arg1)); + } + script_5245(); + return; +} diff --git a/dumps/scripts/3441.cs2 b/dumps/scripts/3441.cs2 new file mode 100644 index 000000000..100318cfd --- /dev/null +++ b/dumps/scripts/3441.cs2 @@ -0,0 +1,6 @@ +int script_3441() { + if ((getItemAmtInContainer(94, 6465) > 0) || (getItemAmtInContainer(94, 15016) > 0)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/3442.cs2 b/dumps/scripts/3442.cs2 new file mode 100644 index 000000000..211859d40 --- /dev/null +++ b/dumps/scripts/3442.cs2 @@ -0,0 +1,8 @@ +void script_3442(int arg0,int arg1,int arg2) { + if (((boolean)script_3441())) { + script_569(arg0, -1, arg1, 50, 150, script_3443(arg2)); + } else { + script_569(arg0, -1, arg1, 50, 150, "A member of the Jury."); + } + return; +} diff --git a/dumps/scripts/3443.cs2 b/dumps/scripts/3443.cs2 new file mode 100644 index 000000000..3c514b287 --- /dev/null +++ b/dumps/scripts/3443.cs2 @@ -0,0 +1,29 @@ +string script_3443(int arg0) { + switch (arg0) { + case 1: + return "A ranger, he prefers the bow and arrow to all other combat. He's a straight arrow and hates evil do-ers."; + case 2: + return "A wizard, he researches the mysteries of life and performs magic."; + case 3: + return "A miner, works hard all day mining rock. Likes to party in the evenings."; + case 4: + return "A cook, he spends his day making bread and stopping people stealing his cakes. He hates stew."; + case 5: + return "A shady-looking gentleman. He's likely involved in the criminal underworld."; + case 6: + return "A young man. He's concerned with starting his own business and making money. Also enjoys a rowdy party."; + case 7: + return "A barbarian. He is sensitive to any disrespect of his culture."; + case 8: + return "An elderly gentleman. He's worried about his safety and a rise in crime."; + case 9: + return "A young woman. She's concerned with the safety of her children."; + case 10: + return "A shady-looking fellow. He covers up his face to hide his identity."; + case 11: + return "A desert citizen. She doesn't have much love for mainlanders."; + case 12: + return "An elderly gentleman. He doesn't like parties or noise."; + } + return ""; +} diff --git a/dumps/scripts/3444.cs2 b/dumps/scripts/3444.cs2 new file mode 100644 index 000000000..c4adcbaa1 --- /dev/null +++ b/dumps/scripts/3444.cs2 @@ -0,0 +1,4 @@ +void script_3444(int arg0) { + setWidget3DViewDistance(2000, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3445.cs2 b/dumps/scripts/3445.cs2 new file mode 100644 index 000000000..d79731256 --- /dev/null +++ b/dumps/scripts/3445.cs2 @@ -0,0 +1,4 @@ +void script_3445(int arg0) { + setWidget3DViewDistance(2600, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3446.cs2 b/dumps/scripts/3446.cs2 new file mode 100644 index 000000000..3d1da1c72 --- /dev/null +++ b/dumps/scripts/3446.cs2 @@ -0,0 +1,6 @@ +void script_3446() { + setWidgetSprite(3165, new WidgetPointer(987,15)); + setWidgetSprite(3165, new WidgetPointer(987,16)); + setWidgetSprite(3166, new WidgetPointer(987,14)); + return; +} diff --git a/dumps/scripts/3447.cs2 b/dumps/scripts/3447.cs2 new file mode 100644 index 000000000..d23f047ed --- /dev/null +++ b/dumps/scripts/3447.cs2 @@ -0,0 +1,6 @@ +void script_3447() { + setWidgetSprite(3163, new WidgetPointer(987,15)); + setWidgetSprite(3163, new WidgetPointer(987,16)); + setWidgetSprite(3164, new WidgetPointer(987,14)); + return; +} diff --git a/dumps/scripts/3448.cs2 b/dumps/scripts/3448.cs2 new file mode 100644 index 000000000..248eacd31 --- /dev/null +++ b/dumps/scripts/3448.cs2 @@ -0,0 +1,29 @@ +void script_3448() { + if (bitconfig_7933 != 0) { + setWidgetIsHidden(false, new WidgetPointer(987,30)); + } else { + setWidgetIsHidden(true, new WidgetPointer(987,30)); + } + switch (bitconfig_7933) { + case 1: + setWidgetPosition(16, 28, 0, 0, new WidgetPointer(987,30)); + break; + case 7: + setWidgetPosition(16, 161, 0, 0, new WidgetPointer(987,30)); + break; + case 2: + case 3: + case 4: + case 5: + case 6: + setWidgetPosition(add(16, multiply(subtract(bitconfig_7933, 1), 79)), 28, 0, 0, new WidgetPointer(987,30)); + break; + case 8: + case 9: + case 10: + case 11: + case 12: + setWidgetPosition(add(16, multiply(subtract(bitconfig_7933, 7), 79)), 161, 0, 0, new WidgetPointer(987,30)); + } + return; +} diff --git a/dumps/scripts/3449.cs2 b/dumps/scripts/3449.cs2 new file mode 100644 index 000000000..3a74b521f --- /dev/null +++ b/dumps/scripts/3449.cs2 @@ -0,0 +1,5 @@ +void script_3449(int arg0,int arg1) { + setItemOnWidgetMethod2200(arg0, 0, new WidgetPointer(519,0)); + setWidget3DViewDistance(arg1, new WidgetPointer(519,0)); + return; +} diff --git a/dumps/scripts/345.cs2 b/dumps/scripts/345.cs2 new file mode 100644 index 000000000..0336859c8 --- /dev/null +++ b/dumps/scripts/345.cs2 @@ -0,0 +1,6 @@ +void script_345() { + setWidgetSprite(3165, new WidgetPointer(205,58)); + setWidgetSprite(3165, new WidgetPointer(205,59)); + setWidgetSprite(3166, new WidgetPointer(205,60)); + return; +} diff --git a/dumps/scripts/3450.cs2 b/dumps/scripts/3450.cs2 new file mode 100644 index 000000000..81d961158 --- /dev/null +++ b/dumps/scripts/3450.cs2 @@ -0,0 +1,4 @@ +void script_3450(int arg0) { + script_1548(arg0); + return; +} diff --git a/dumps/scripts/3451.cs2 b/dumps/scripts/3451.cs2 new file mode 100644 index 000000000..39d039621 --- /dev/null +++ b/dumps/scripts/3451.cs2 @@ -0,0 +1,30 @@ +void script_3451(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar2 = 64094244; + ivar3 = 64094245; + ivar4 = 64094246; + ivar5 = 64094247; + ivar6 = 64094248; + ivar7 = 64094209; + if (((boolean)arg1)) { + ivar2 = 64028682; + ivar3 = 64028683; + ivar4 = 64028684; + ivar5 = 64028685; + ivar6 = 64028686; + } + script_3932(arg0, arg1, ivar2, 1, add(getTextWidth(3793, "MIN"), 30), "MIN", ""); + script_3932(arg0, arg1, ivar3, 2, add(getTextWidth(3793, "LOW"), 30), "LOW", ""); + script_3932(arg0, arg1, ivar4, 3, add(getTextWidth(3793, "MID"), 30), "MID", ""); + script_3932(arg0, arg1, ivar5, 4, add(getTextWidth(3793, "HIGH"), 30), "HIGH", ""); + script_3932(arg0, arg1, ivar6, 0, add(getTextWidth(3793, "CUSTOM"), 30), "CUSTOM", ""); + if (((boolean)arg1)) { + script_3932(arg0, arg1, ivar7, -1, add(getTextWidth(3793, "RE-RUN AUTO SETUP"), 30), "RE-RUN AUTO SETUP", ""); + } + return; +} diff --git a/dumps/scripts/3452.cs2 b/dumps/scripts/3452.cs2 new file mode 100644 index 000000000..27617e676 --- /dev/null +++ b/dumps/scripts/3452.cs2 @@ -0,0 +1,4 @@ +void script_3452(int arg0,int arg1,int arg2) { + script_3239(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3453.cs2 b/dumps/scripts/3453.cs2 new file mode 100644 index 000000000..f91009f5a --- /dev/null +++ b/dumps/scripts/3453.cs2 @@ -0,0 +1,15 @@ +void script_3453() { + if (globalint_1281 == 8) { + return; + } + if (((boolean)globalint_1074)) { + script_3454(add(globalint_1281, 1), globalint_1070, globalint_1069, script_2865(globalint_1070, globalint_1071), globalint_1073); + } else if (((boolean)globalint_1074)) { + script_3454(add(globalint_1281, 1), globalint_1070, globalint_1069, globalint_1072, 50); + } else { + return; + } + globalint_1281 = add(globalint_1281, 1); + setWidgetText(new WidgetPointer(475,78), intToStr(globalint_1281)); + return; +} diff --git a/dumps/scripts/3454.cs2 b/dumps/scripts/3454.cs2 new file mode 100644 index 000000000..a14bddc7a --- /dev/null +++ b/dumps/scripts/3454.cs2 @@ -0,0 +1,52 @@ +void script_3454(int arg0,int arg1,int arg2,int arg3,int arg4) { + switch (arg0) { + case 1: + globalint_1283 = arg1; + globalint_1284 = arg2; + globalint_1285 = arg3; + globalint_1286 = arg4; + break; + case 2: + globalint_1287 = arg1; + globalint_1288 = arg2; + globalint_1289 = arg3; + globalint_1290 = arg4; + break; + case 3: + globalint_1291 = arg1; + globalint_1292 = arg2; + globalint_1293 = arg3; + globalint_1294 = arg4; + break; + case 4: + globalint_1295 = arg1; + globalint_1296 = arg2; + globalint_1297 = arg3; + globalint_1298 = arg4; + break; + case 5: + globalint_1299 = arg1; + globalint_1300 = arg2; + globalint_1301 = arg3; + globalint_1302 = arg4; + break; + case 6: + globalint_1303 = arg1; + globalint_1304 = arg2; + globalint_1305 = arg3; + globalint_1306 = arg4; + break; + case 7: + globalint_1307 = arg1; + globalint_1308 = arg2; + globalint_1309 = arg3; + globalint_1310 = arg4; + break; + case 8: + globalint_1311 = arg1; + globalint_1312 = arg2; + globalint_1313 = arg3; + globalint_1314 = arg4; + } + return; +} diff --git a/dumps/scripts/3455.cs2 b/dumps/scripts/3455.cs2 new file mode 100644 index 000000000..fc773870a --- /dev/null +++ b/dumps/scripts/3455.cs2 @@ -0,0 +1,5 @@ +void script_3455() { + globalint_1281 = 0; + setWidgetText(new WidgetPointer(475,78), intToStr(globalint_1281)); + return; +} diff --git a/dumps/scripts/3456.cs2 b/dumps/scripts/3456.cs2 new file mode 100644 index 000000000..b680c3cb4 --- /dev/null +++ b/dumps/scripts/3456.cs2 @@ -0,0 +1,4 @@ +void script_3456() { + setScriptCallOnGameloop(3457, new WidgetPointer(475,1), getClientCycle(), "Ii", new WidgetPointer(475,1)); + return; +} diff --git a/dumps/scripts/3457.cs2 b/dumps/scripts/3457.cs2 new file mode 100644 index 000000000..66f009fb5 --- /dev/null +++ b/dumps/scripts/3457.cs2 @@ -0,0 +1,46 @@ +void script_3457(int arg0,int arg1) { + int ivar2; + ivar2 = subtract(getClientCycle(), arg1); + if ((ivar2 < 100) && (globalint_1281 > 0)) { + cameraPointAt(globalint_1285, globalint_1286, 3000, globalint_1282); + cameraMoveTo(globalint_1283, globalint_1284, 3000, globalint_1282); + return; + } + if ((ivar2 < 200) && (globalint_1281 > 1)) { + cameraPointAt(globalint_1289, globalint_1290, 0, globalint_1282); + cameraMoveTo(globalint_1287, globalint_1288, 0, globalint_1282); + return; + } + if ((ivar2 < 300) && (globalint_1281 > 2)) { + cameraPointAt(globalint_1293, globalint_1294, 0, globalint_1282); + cameraMoveTo(globalint_1291, globalint_1292, 0, globalint_1282); + return; + } + if ((ivar2 < 400) && (globalint_1281 > 3)) { + cameraPointAt(globalint_1297, globalint_1298, 0, globalint_1282); + cameraMoveTo(globalint_1295, globalint_1296, 0, globalint_1282); + return; + } + if ((ivar2 < 500) && (globalint_1281 > 4)) { + cameraPointAt(globalint_1301, globalint_1302, 0, globalint_1282); + cameraMoveTo(globalint_1299, globalint_1300, 0, globalint_1282); + return; + } + if ((ivar2 < 600) && (globalint_1281 > 5)) { + cameraPointAt(globalint_1305, globalint_1306, 0, globalint_1282); + cameraMoveTo(globalint_1303, globalint_1304, 0, globalint_1282); + return; + } + if ((ivar2 < 700) && (globalint_1281 > 6)) { + cameraPointAt(globalint_1309, globalint_1310, 0, globalint_1282); + cameraMoveTo(globalint_1307, globalint_1308, 0, globalint_1282); + return; + } + if ((ivar2 < 800) && (globalint_1281 > 7)) { + cameraPointAt(globalint_1313, globalint_1314, 0, globalint_1282); + cameraMoveTo(globalint_1311, globalint_1312, 0, globalint_1282); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3458.cs2 b/dumps/scripts/3458.cs2 new file mode 100644 index 000000000..1a5e4e34b --- /dev/null +++ b/dumps/scripts/3458.cs2 @@ -0,0 +1,33 @@ +void script_3458(int arg0,int arg1) { + switch (globalint_1007) { + case 31: + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, script_3459(62363230, arg1), 500, script_3459(62363230, arg1), 500, 0); + cs2method5406(1, 0, script_3459(62297690, arg1), 350, script_3459(62297690, arg1), 350, 0); + cs2method5406(0, 1, script_3459(62363229, arg1), 450, script_3459(62363229, arg1), 450, 0); + cs2method5406(1, 1, script_3459(62314075, arg1), 350, script_3459(62314075, arg1), 350, 0); + cs2method5406(0, 2, script_3459(62330459, arg1), 550, script_3459(62330459, arg1), 550, 0); + cs2method5406(1, 2, script_3459(62330464, arg1), 350, script_3459(62281310, arg1), 350, 0); + cameraMethod5502(0, 0, 50, 10, 1, 0); + break; + case 32: + cameraMethod5502(0, 1, 500, 500, 1, 1); + break; + case 33: + script_2766(0, 50, arg0); + break; + case 34: + script_2768(25, arg0); + break; + case 35: + script_2766(0, 25, arg0); + break; + case 36: + script_2768(50, arg0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/3459.cs2 b/dumps/scripts/3459.cs2 new file mode 100644 index 000000000..09eae406a --- /dev/null +++ b/dumps/scripts/3459.cs2 @@ -0,0 +1,3 @@ +int script_3459(int arg0,int arg1) { + return addToCoordinate(arg1, subtract(add(24, extractX(arg0)), extractX(61871680)), 0, subtract(add(24, extractY(arg0)), extractY(61871680))); +} diff --git a/dumps/scripts/346.cs2 b/dumps/scripts/346.cs2 new file mode 100644 index 000000000..3bd70d946 --- /dev/null +++ b/dumps/scripts/346.cs2 @@ -0,0 +1,6 @@ +void script_346() { + setWidgetSprite(3163, new WidgetPointer(205,58)); + setWidgetSprite(3163, new WidgetPointer(205,59)); + setWidgetSprite(3164, new WidgetPointer(205,60)); + return; +} diff --git a/dumps/scripts/3460.cs2 b/dumps/scripts/3460.cs2 new file mode 100644 index 000000000..c91a0f1aa --- /dev/null +++ b/dumps/scripts/3460.cs2 @@ -0,0 +1,3 @@ +int script_3460(int arg0,int arg1,int arg2) { + return addToCoordinate(arg2, arg0, 0, arg1); +} diff --git a/dumps/scripts/3461.cs2 b/dumps/scripts/3461.cs2 new file mode 100644 index 000000000..06ea0d5ce --- /dev/null +++ b/dumps/scripts/3461.cs2 @@ -0,0 +1,40 @@ +void script_3461(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (globalint_1007 <= 0) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + cs2method5512(); + return; + } + if (globalint_1007 <= 10) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + script_3470(arg0, script_284(getMyPositionHash())); + return; + } + if (globalint_1007 <= 20) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + script_3465(arg0, script_284(getMyPositionHash())); + return; + } + if (globalint_1007 <= 30) { + setWidgetIsHidden(true, new WidgetPointer(arg4)); + script_3462(arg0, arg1, arg2, arg3); + return; + } + if (globalint_1007 <= 40) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + script_3458(arg0, script_284(getMyPositionHash())); + return; + } + if (globalint_1007 <= 100) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + script_3472(arg0, arg4); + return; + } + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + script_3466(arg0, script_284(getMyPositionHash())); + return; +} diff --git a/dumps/scripts/3462.cs2 b/dumps/scripts/3462.cs2 new file mode 100644 index 000000000..fa171f00b --- /dev/null +++ b/dumps/scripts/3462.cs2 @@ -0,0 +1,43 @@ +void script_3462(int arg0,int arg1,int arg2,int arg3) { + switch (globalint_1007) { + case 21: + setWidgetIsHidden(true, new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_2766(0, 75, arg0); + break; + case 22: + setWidgetIsHidden(false, new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + script_1088(arg1, 0); + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 6, 0); + setWidgetSize(0, 85, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetSelfFull(); + setWidget3DRotation(0, 30, 0, 0, 0, 850); + setWidgetAnimation(14230); + setScriptCallOnGameloop(3464, new WidgetPointer(-32768,3), -2147483643, "Ii"); + script_2647(arg2); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(arg3)), 494, getWidgetText(new WidgetPointer(arg3))), 10), 75), 0, 0, new WidgetPointer(arg2)); + cameraMoveTo(addToCoordinate(getMyPositionHash(), 0, 0, -3), 1500, 1000, 100); + cameraPointAt(getMyPositionHash(), 0, 1000, 100); + script_2768(75, arg0); + setScriptCallOnGameloop(3463, new WidgetPointer(-32768,3), getMyPositionHash(), "Ic", new WidgetPointer(arg0)); + break; + case 23: + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + script_2766(0, 25, arg0); + break; + case 24: + cs2method5512(); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + script_2768(25, arg0); + break; + default: + setWidgetIsHidden(true, new WidgetPointer(arg1)); + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/3463.cs2 b/dumps/scripts/3463.cs2 new file mode 100644 index 000000000..e6e6e7079 --- /dev/null +++ b/dumps/scripts/3463.cs2 @@ -0,0 +1,14 @@ +void script_3463(int arg0,int arg1) { + if (globalint_1007 != 22) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + } + if (getMyPositionHash() == arg1) { + return; + } + playSoundEffect(4874, 1, 0); + cameraMoveTo(addToCoordinate(getMyPositionHash(), 0, 0, -3), 1500, 1, 75); + cameraPointAt(getMyPositionHash(), 0, 1, 15); + setScriptCallOnGameloop(3463, new WidgetPointer(-32768,3), getMyPositionHash(), "Ic", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3464.cs2 b/dumps/scripts/3464.cs2 new file mode 100644 index 000000000..f2e50ef7e --- /dev/null +++ b/dumps/scripts/3464.cs2 @@ -0,0 +1,6 @@ +void script_3464(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidget3DRotation(cs2method1610(), cs2method1611(), getWidgetRotateX(), mod(add(getWidgetRotateY(), 2), 2028), cs2method1607(), getWidget3DDistance()); + } + return; +} diff --git a/dumps/scripts/3465.cs2 b/dumps/scripts/3465.cs2 new file mode 100644 index 000000000..4ff4ff43d --- /dev/null +++ b/dumps/scripts/3465.cs2 @@ -0,0 +1,31 @@ +void script_3465(int arg0,int arg1) { + switch (globalint_1007) { + case 11: + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_2766(0, 75, arg0); + break; + case 12: + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3460(30, 27, arg1), 800, script_3460(30, 30, arg1), 850, 0); + cs2method5406(1, 0, script_3460(35, 30, arg1), 300, script_3460(35, 40, arg1), 300, 0); + cs2method5406(0, 1, script_3460(40, 40, arg1), 1000, script_3460(40, 40, arg1), 950, 0); + cs2method5406(1, 1, script_3460(28, 52, arg1), 200, script_3460(28, 46, arg1), 200, 0); + cameraMethod5502(0, 0, 100, 200, 1, 0); + script_2768(25, arg0); + break; + case 13: + cs2method5512(); + cameraMethod5504(268, 644); + break; + case 14: + script_2766(0, 25, arg0); + break; + case 15: + script_2768(25, arg0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/3466.cs2 b/dumps/scripts/3466.cs2 new file mode 100644 index 000000000..90cdcfe2e --- /dev/null +++ b/dumps/scripts/3466.cs2 @@ -0,0 +1,157 @@ +void script_3466(int arg0,int arg1) { + switch (globalint_1007) { + case 101: + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_2766(0, 50, arg0); + break; + case 102: + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3460(7, 54, arg1), 1000, script_3460(8, 54, arg1), 1000, 0); + cs2method5406(1, 0, script_3460(13, 50, arg1), 450, script_3460(13, 50, arg1), 450, 0); + cs2method5406(0, 1, script_3460(13, 51, arg1), 800, script_3460(13, 52, arg1), 800, 0); + cs2method5406(1, 1, script_3460(14, 44, arg1), 550, script_3460(14, 44, arg1), 550, 0); + cameraMethod5502(0, 0, 100, 100, 1, 0); + script_2768(75, arg0); + break; + case 103: + deleteAllExtraChilds(new WidgetPointer(arg0)); + setScriptCallOnGameloop(3467, new WidgetPointer(arg0), getClientCycle(), 100, "Iii", new WidgetPointer(arg0)); + break; + case 104: + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + cs2method2103(0); + setScriptCallOnGameloop(-1, ""); + } else { + script_2766(0, 0, arg0); + } + break; + case 105: + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3460(31, 22, arg1), 600, script_3460(31, 23, arg1), 600, 0); + cs2method5406(1, 0, script_3460(32, 29, arg1), 50, script_3460(32, 30, arg1), 50, 0); + cs2method5406(0, 1, script_3460(35, 33, arg1), 500, script_3460(35, 32, arg1), 500, 0); + cs2method5406(1, 1, script_3460(29, 36, arg1), 50, script_3460(30, 36, arg1), 50, 0); + cameraMethod5502(0, 0, 500, 450, 1, 0); + script_2768(50, arg0); + break; + case 106: + cameraMoveTo(script_3460(33, 38, arg1), 475, 1000, 100); + cameraPointAt(script_3460(29, 33, arg1), 50, 1000, 100); + break; + case 107: + cameraMoveTo(script_3460(32, 37, arg1), 450, 1000, 100); + cameraPointAt(script_3460(31, 31, arg1), 50, 1000, 100); + break; + case 108: + cameraMoveTo(script_3460(35, 38, arg1), 600, 1000, 100); + cameraPointAt(script_3460(29, 36, arg1), 50, 1000, 100); + break; + case 109: + cameraMoveTo(script_3460(35, 37, arg1), 500, 1000, 100); + cameraPointAt(script_3460(31, 31, arg1), 50, 1000, 100); + break; + case 110: + cameraMoveTo(script_3460(35, 36, arg1), 400, 1000, 100); + cameraPointAt(script_3460(28, 34, arg1), 50, 1000, 100); + break; + case 111: + cameraMoveTo(script_3460(36, 35, arg1), 800, 1000, 100); + cameraPointAt(script_3460(29, 36, arg1), 50, 1000, 100); + break; + case 112: + script_2766(0, 50, arg0); + break; + case 113: + cs2method5405(0, 7); + cs2method5405(1, 7); + cs2method5406(0, 0, script_3460(42, 82, arg1), 400, script_3460(42, 79, arg1), 400, 0); + cs2method5406(1, 0, script_3460(42, 58, arg1), 250, script_3460(42, 58, arg1), 250, 0); + cs2method5406(0, 1, script_3460(42, 59, arg1), 1500, script_3460(40, 55, arg1), 1500, 0); + cs2method5406(1, 1, script_3460(41, 46, arg1), 600, script_3460(41, 46, arg1), 600, 0); + cs2method5406(0, 2, script_3460(29, 50, arg1), 1800, script_3460(25, 47, arg1), 1800, 0); + cs2method5406(1, 2, script_3460(36, 43, arg1), 600, script_3460(35, 43, arg1), 600, 0); + cs2method5406(0, 3, script_3460(24, 40, arg1), 2100, script_3460(24, 34, arg1), 2100, 0); + cs2method5406(1, 3, script_3460(36, 42, arg1), 600, script_3460(36, 41, arg1), 600, 0); + cs2method5406(0, 4, script_3460(37, 26, arg1), 2400, script_3460(45, 26, arg1), 2400, 0); + cs2method5406(1, 4, script_3460(37, 42, arg1), 500, script_3460(38, 43, arg1), 500, 0); + cs2method5406(0, 5, script_3460(52, 35, arg1), 1700, script_3460(55, 39, arg1), 1700, 0); + cs2method5406(1, 5, script_3460(38, 42, arg1), 400, script_3460(38, 41, arg1), 400, 0); + cs2method5406(0, 6, script_3460(47, 52, arg1), 600, script_3460(43, 55, arg1), 600, 0); + cs2method5406(1, 6, script_3460(37, 48, arg1), 325, script_3460(37, 49, arg1), 325, 0); + setScriptCallOnMinimapRelatedSetting3(3468, new WidgetPointer(arg0), 1, 900, 1300, 1300, 1600, 1600, 1600, 1600, 1200, 1200, 200, "Iiiiiiiiiiii", new WidgetPointer(arg0)); + cameraMethod5502(0, 0, 100, 900, 1, 0); + script_2768(50, arg0); + break; + case 114: + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, script_3460(43, 59, arg1), 800, script_3460(43, 59, arg1), 800, 0); + cs2method5406(1, 0, script_3460(37, 37, arg1), 10, script_3460(37, 37, arg1), 10, 0); + cs2method5406(0, 1, script_3460(35, 59, arg1), 800, script_3460(35, 59, arg1), 800, 0); + cs2method5406(1, 1, script_3460(39, 38, arg1), 10, script_3460(39, 38, arg1), 10, 0); + cs2method5406(0, 2, script_3460(33, 60, arg1), 1000, script_3460(33, 60, arg1), 1000, 0); + cs2method5406(1, 2, script_3460(39, 38, arg1), 10, script_3460(39, 38, arg1), 10, 0); + setScriptCallOnMinimapRelatedSetting3(3468, new WidgetPointer(arg0), 1, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Iiiiiiiiiiii", new WidgetPointer(arg0)); + cameraMethod5502(0, 0, 150, 100, 1, 0); + break; + case 115: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3460(35, 49, arg1), 800, script_3460(36, 48, arg1), 800, 0); + cs2method5406(1, 0, script_3460(42, 52, arg1), 200, script_3460(42, 52, arg1), 200, 0); + cs2method5406(0, 1, script_3460(39, 48, arg1), 800, script_3460(39, 48, arg1), 800, 0); + cs2method5406(1, 1, script_3460(41, 52, arg1), 200, script_3460(41, 52, arg1), 200, 0); + cameraMethod5502(0, 0, 150, 0, 1, 0); + break; + case 116: + cs2method5405(0, 15); + cs2method5405(1, 15); + cs2method5406(0, 0, script_3460(41, 55, arg1), 275, script_3460(41, 55, arg1), 275, 0); + cs2method5406(1, 0, script_3460(39, 47, arg1), 10, script_3460(39, 47, arg1), 10, 0); + cs2method5406(0, 1, script_3460(42, 55, arg1), 280, script_3460(42, 55, arg1), 280, 250); + cs2method5406(1, 1, script_3460(39, 47, arg1), 20, script_3460(39, 47, arg1), 20, 0); + cs2method5406(0, 2, script_3460(41, 55, arg1), 285, script_3460(41, 55, arg1), 285, -500); + cs2method5406(1, 2, script_3460(39, 47, arg1), 30, script_3460(39, 47, arg1), 30, 0); + cs2method5406(0, 3, script_3460(42, 55, arg1), 290, script_3460(42, 55, arg1), 290, 500); + cs2method5406(1, 3, script_3460(39, 47, arg1), 40, script_3460(39, 47, arg1), 40, 0); + cs2method5406(0, 4, script_3460(41, 55, arg1), 295, script_3460(41, 55, arg1), 295, -500); + cs2method5406(1, 4, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 5, script_3460(42, 55, arg1), 350, script_3460(42, 55, arg1), 350, 750); + cs2method5406(1, 5, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 6, script_3460(40, 55, arg1), 425, script_3460(40, 55, arg1), 425, -750); + cs2method5406(1, 6, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 7, script_3460(42, 55, arg1), 550, script_3460(42, 55, arg1), 550, 750); + cs2method5406(1, 7, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 8, script_3460(41, 55, arg1), 675, script_3460(41, 55, arg1), 675, -750); + cs2method5406(1, 8, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 9, script_3460(43, 55, arg1), 850, script_3460(43, 55, arg1), 850, 500); + cs2method5406(1, 9, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 10, script_3460(41, 55, arg1), 1000, script_3460(41, 55, arg1), 1000, -500); + cs2method5406(1, 10, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 11, script_3460(42, 55, arg1), 1150, script_3460(42, 55, arg1), 1150, 250); + cs2method5406(1, 11, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 12, script_3460(41, 55, arg1), 1300, script_3460(41, 55, arg1), 1300, -250); + cs2method5406(1, 12, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 13, script_3460(42, 55, arg1), 1450, script_3460(42, 55, arg1), 1450, 125); + cs2method5406(1, 13, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + cs2method5406(0, 14, script_3460(41, 55, arg1), 1500, script_3460(41, 55, arg1), 1500, 0); + cs2method5406(1, 14, script_3460(39, 47, arg1), 50, script_3460(39, 47, arg1), 50, 0); + setScriptCallOnMinimapRelatedSetting3(3469, new WidgetPointer(arg0), 1, "Ii", new WidgetPointer(arg0)); + cameraMethod5502(0, 0, 2500, 3200, 1, 0); + break; + case 117: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + script_2766(0, 50, arg0); + break; + case 118: + script_2768(50, arg0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/3467.cs2 b/dumps/scripts/3467.cs2 new file mode 100644 index 000000000..217029243 --- /dev/null +++ b/dumps/scripts/3467.cs2 @@ -0,0 +1,8 @@ +void script_3467(int arg0,int arg1,int arg2) { + if (subtract(getClientCycle(), arg1) < arg2) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + script_2766(0, 50, arg0); + return; +} diff --git a/dumps/scripts/3468.cs2 b/dumps/scripts/3468.cs2 new file mode 100644 index 000000000..6a8ee6881 --- /dev/null +++ b/dumps/scripts/3468.cs2 @@ -0,0 +1,9 @@ +void script_3468(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11) { + if (arg1 < subtract(cs2method5407(0), 1)) { + cameraMethod5502(0, arg1, arg2, arg3, 1, arg1); + setScriptCallOnMinimapRelatedSetting3(3468, new WidgetPointer(arg0), add(arg1, 1), arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, 0, 0, "Iiiiiiiiiiii", new WidgetPointer(arg0)); + } else { + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3469.cs2 b/dumps/scripts/3469.cs2 new file mode 100644 index 000000000..81facbbbd --- /dev/null +++ b/dumps/scripts/3469.cs2 @@ -0,0 +1,20 @@ +void script_3469(int arg0,int arg1) { + switch (rnd(2)) { + case 0: + playSoundEffect(6645, 1, rndExcl(15)); + break; + case 1: + playSoundEffect(6644, 1, rndExcl(15)); + break; + case 2: + playSoundEffect(6643, 1, rndExcl(15)); + } + if (arg1 < subtract(cs2method5407(0), 2)) { + cameraMethod5502(0, arg1, 3100, 3300, 1, arg1); + setScriptCallOnMinimapRelatedSetting3(3469, new WidgetPointer(arg0), add(arg1, 1), "Ii", new WidgetPointer(arg0)); + return; + } + cameraMethod5502(0, arg1, 1000, 0, 1, arg1); + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/347.cs2 b/dumps/scripts/347.cs2 new file mode 100644 index 000000000..2e3e28e54 --- /dev/null +++ b/dumps/scripts/347.cs2 @@ -0,0 +1,17 @@ +void script_347(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (arg2 == -1) { + setScriptCallOnGameloop(1518, new WidgetPointer(-32768,3), -2147483643, 0, "Iii"); + setScriptCallOnMousePressed(347, new WidgetPointer(-32768,3), -2147483643, -2147483647, "Iii"); + } else { + arg2 = subtract(arg2, divide(getWidgetActualWidth(), 2)); + if (arg2 >= 0) { + setScriptCallOnGameloop(1518, new WidgetPointer(-32768,3), -2147483643, 1, "Iii"); + } else { + setScriptCallOnGameloop(1518, new WidgetPointer(-32768,3), -2147483643, -1, "Iii"); + } + setScriptCallOnMousePressed(347, new WidgetPointer(-32768,3), -2147483643, -1, "Iii"); + } + } + return; +} diff --git a/dumps/scripts/3470.cs2 b/dumps/scripts/3470.cs2 new file mode 100644 index 000000000..efcb62e1b --- /dev/null +++ b/dumps/scripts/3470.cs2 @@ -0,0 +1,28 @@ +void script_3470(int arg0,int arg1) { + switch (globalint_1007) { + case 1: + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_2766(0, 75, arg0); + break; + case 2: + cs2method5405(0, 5); + cs2method5405(1, 5); + cs2method5406(0, 0, script_3459(62019146, arg1), 510, script_3459(62035526, arg1), 715, 0); + cs2method5406(1, 0, script_3459(62117455, arg1), 170, script_3459(62051920, arg1), 170, 0); + cs2method5406(0, 1, script_3459(62658120, arg1), 1035, script_3459(62772815, arg1), 1430, 0); + cs2method5406(1, 1, script_3459(62527055, arg1), 170, script_3459(62576213, arg1), 170, 0); + cs2method5406(0, 2, script_3459(62527082, arg1), 2095, script_3459(62363249, arg1), 2095, 0); + cs2method5406(1, 2, script_3459(62379614, arg1), 170, script_3459(62264928, arg1), 170, 0); + cs2method5406(0, 3, script_3459(62035560, arg1), 1565, script_3459(61920865, arg1), 965, 0); + cs2method5406(1, 3, script_3459(62183006, arg1), 170, script_3459(62101084, arg1), 170, 0); + cs2method5406(0, 4, script_3459(62019146, arg1), 470, script_3459(62051906, arg1), 435, 0); + cs2method5406(1, 4, script_3459(62117455, arg1), 170, script_3459(62133836, arg1), 170, 0); + script_2768(150, arg0); + setScriptCallOnMinimapRelatedSetting3(3471, new WidgetPointer(arg0), 1, "Ii", new WidgetPointer(arg0)); + cameraMethod5502(0, 0, 100, 700, 1, 0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/3471.cs2 b/dumps/scripts/3471.cs2 new file mode 100644 index 000000000..a713cf4bc --- /dev/null +++ b/dumps/scripts/3471.cs2 @@ -0,0 +1,10 @@ +void script_3471(int arg0,int arg1) { + if (arg1 < subtract(cs2method5407(0), 1)) { + cameraMethod5502(0, arg1, 700, 700, 1, arg1); + setScriptCallOnMinimapRelatedSetting3(3471, new WidgetPointer(arg0), add(arg1, 1), "Ii", new WidgetPointer(arg0)); + } else { + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/3472.cs2 b/dumps/scripts/3472.cs2 new file mode 100644 index 000000000..85c34757e --- /dev/null +++ b/dumps/scripts/3472.cs2 @@ -0,0 +1,151 @@ +void script_3472(int arg0,int arg1) { + switch (globalint_1007) { + case 51: + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_2766(0, 100, arg0); + break; + case 52: + if (((globalint_1065 == -1) || (subtract(extractX(getMyPositionHash()), extractX(globalint_1065)) > 128)) || (subtract(extractY(getMyPositionHash()), extractY(globalint_1065)) > 128)) { + globalint_1065 = script_284(getMyPositionHash()); + } + script_2768(75, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3474(0, 30, 26), 500, script_3474(0, 29, 26), 500, 0); + cs2method5406(1, 0, script_3474(0, 33, 26), 250, script_3474(0, 33, 26), 250, 0); + cs2method5406(0, 1, script_3474(0, 20, 30), 600, script_3474(0, 20, 30), 500, 0); + cs2method5406(1, 1, script_3474(0, 23, 26), 250, script_3474(0, 23, 26), 250, 0); + cameraMethod5502(0, 0, 150, 150, 1, 0); + break; + case 53: + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, script_3474(0, 7, 26), 425, script_3474(0, 6, 26), 425, 0); + cs2method5406(1, 0, script_3474(0, 13, 25), 275, script_3474(0, 13, 25), 275, 0); + cs2method5406(0, 1, script_3474(0, 5, 28), 425, script_3474(0, 6, 26), 425, 0); + cs2method5406(1, 1, script_3474(0, 11, 27), 275, script_3474(0, 11, 27), 275, 0); + cs2method5406(0, 2, script_3474(0, 3, 26), 425, script_3474(0, 3, 27), 425, 0); + cs2method5406(1, 2, script_3474(0, 11, 26), 275, script_3474(0, 11, 26), 275, 0); + setScriptCallOnMinimapRelatedSetting3(3473, new WidgetPointer(arg0), 1, 50, 0, 0, 0, "Iiiiii", new WidgetPointer(arg0)); + cameraMethod5502(0, 0, 150, 50, 1, 0); + break; + case 54: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + script_2766(0, 25, arg0); + break; + case 55: + script_2768(25, arg0); + cs2method5405(0, 4); + cs2method5405(1, 4); + cs2method5406(0, 0, script_3474(0, 79, 16), 800, script_3474(0, 79, 16), 800, 0); + cs2method5406(1, 0, script_3474(0, 73, 18), 325, script_3474(0, 73, 18), 325, 0); + cs2method5406(0, 1, script_3474(0, 81, 17), 900, script_3474(0, 81, 17), 900, 0); + cs2method5406(1, 1, script_3474(0, 73, 17), 275, script_3474(0, 73, 17), 275, 0); + cs2method5406(0, 2, script_3474(0, 82, 19), 1000, script_3474(0, 82, 19), 1000, 0); + cs2method5406(1, 2, script_3474(0, 73, 16), 225, script_3474(0, 73, 16), 225, 0); + cs2method5406(0, 3, script_3474(0, 82, 16), 1100, script_3474(0, 82, 16), 1100, 0); + cs2method5406(1, 3, script_3474(0, 73, 17), 175, script_3474(0, 73, 17), 175, 0); + setScriptCallOnMinimapRelatedSetting3(3473, new WidgetPointer(arg0), 1, 175, 125, 125, 0, "Iiiiii", new WidgetPointer(arg0)); + cameraMethod5502(0, 0, 150, 175, 1, 0); + break; + case 56: + script_2768(25, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3474(0, 3, 28), 425, script_3474(0, 3, 27), 425, 0); + cs2method5406(1, 0, script_3474(0, 11, 26), 275, script_3474(0, 11, 26), 275, 0); + cs2method5406(0, 1, script_3474(0, 0, 25), 425, script_3474(0, 0, 26), 425, 0); + cs2method5406(1, 1, script_3474(0, 11, 26), 275, script_3474(0, 11, 26), 275, 0); + cameraMethod5502(0, 0, 75, 0, 1, 0); + break; + case 57: + script_2768(25, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3474(0, 123, 15), 800, script_3474(0, 123, 15), 800, 0); + cs2method5406(1, 0, script_3474(0, 114, 11), 175, script_3474(0, 114, 11), 175, 0); + cs2method5406(0, 1, script_3474(0, 120, 10), 600, script_3474(0, 120, 10), 600, 0); + cs2method5406(1, 1, script_3474(0, 114, 12), 275, script_3474(0, 114, 12), 275, 0); + cameraMethod5502(0, 0, 100, 0, 1, 0); + break; + case 58: + script_2768(25, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3474(0, 7, 26), 400, script_3474(0, 7, 26), 400, 0); + cs2method5406(1, 0, script_3474(0, 11, 27), 275, script_3474(0, 11, 27), 275, 0); + cs2method5406(0, 1, script_3474(0, 8, 29), 400, script_3474(0, 8, 29), 400, 0); + cs2method5406(1, 1, script_3474(0, 11, 28), 275, script_3474(0, 11, 28), 275, 0); + cameraMethod5502(0, 0, 50, 0, 1, 0); + break; + case 59: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + script_2766(0, 75, arg0); + break; + case 60: + script_2768(75, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3474(0, 43, 28), 700, script_3474(0, 42, 28), 700, 0); + cs2method5406(1, 0, script_3474(0, 31, 24), 200, script_3474(0, 31, 24), 200, 0); + cs2method5406(0, 1, script_3474(0, 36, 25), 425, script_3474(0, 36, 25), 425, 0); + cs2method5406(1, 1, script_3474(0, 32, 27), 275, script_3474(0, 32, 27), 275, 0); + cameraMethod5502(0, 0, 125, 0, 1, 0); + break; + case 61: + script_2768(50, arg0); + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, script_3474(0, 40, 90), 1200, script_3474(0, 35, 90), 1200, -2000); + cs2method5406(1, 0, script_3474(0, 24, 110), 425, script_3474(0, 24, 110), 425, 0); + cs2method5406(0, 1, script_3474(0, 15, 97), 700, script_3474(0, 14, 97), 700, 500); + cs2method5406(1, 1, script_3474(0, 29, 110), 400, script_3474(0, 29, 110), 400, 0); + cs2method5406(0, 2, script_3474(0, 22, 102), 650, script_3474(0, 22, 102), 650, 0); + cs2method5406(1, 2, script_3474(0, 30, 111), 400, script_3474(0, 30, 111), 400, 0); + setScriptCallOnMinimapRelatedSetting3(3473, new WidgetPointer(arg0), 1, 400, 100, 100, 0, "Iiiiii", new WidgetPointer(arg0)); + cameraMethod5502(0, 0, 400, 400, 1, 0); + break; + case 62: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3474(0, 34, 120), 750, script_3474(0, 29, 120), 750, 0); + cs2method5406(1, 0, script_3474(0, 30, 112), 425, script_3474(0, 30, 112), 425, 0); + cs2method5406(0, 1, script_3474(0, 33, 117), 750, script_3474(0, 33, 117), 750, 0); + cs2method5406(1, 1, script_3474(0, 30, 111), 425, script_3474(0, 30, 111), 425, 0); + cameraMethod5502(0, 0, 50, 100, 1, 0); + break; + case 63: + script_2768(50, arg0); + script_2784(1, arg1, 64880645, 64880646, 64880647, 64880648, -1, 1); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, script_3474(1, 64, 98), 500, script_3474(1, 66, 96), 500, 0); + cs2method5406(1, 0, script_3474(1, 90, 98), 500, script_3474(1, 90, 98), 500, 0); + cs2method5406(0, 1, script_3474(1, 90, 80), 1000, script_3474(1, 88, 80), 950, 0); + cs2method5406(1, 1, script_3474(1, 91, 98), 500, script_3474(1, 91, 98), 500, 0); + cs2method5406(0, 2, script_3474(1, 91, 87), 1000, script_3474(1, 91, 87), 1000, 0); + cs2method5406(1, 2, script_3474(1, 90, 98), 500, script_3474(1, 90, 98), 500, 0); + setScriptCallOnMinimapRelatedSetting3(3473, new WidgetPointer(arg0), 1, 200, 0, 0, 0, "Iiiiii", new WidgetPointer(arg0)); + cameraMethod5502(0, 0, 700, 700, 1, 0); + break; + case 64: + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_3474(1, 91, 91), 800, script_3474(1, 91, 91), 800, 0); + cs2method5406(1, 0, script_3474(1, 91, 98), 450, script_3474(1, 91, 98), 450, 0); + cs2method5406(0, 1, script_3474(1, 91, 94), 750, script_3474(1, 91, 94), 750, 0); + cs2method5406(1, 1, script_3474(1, 91, 98), 425, script_3474(1, 91, 98), 425, 0); + cameraMethod5502(0, 0, 75, 0, 1, 0); + break; + case 65: + setWidgetIsHidden(true, new WidgetPointer(arg1)); + script_2768(75, arg0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/3473.cs2 b/dumps/scripts/3473.cs2 new file mode 100644 index 000000000..3a72cdf88 --- /dev/null +++ b/dumps/scripts/3473.cs2 @@ -0,0 +1,9 @@ +void script_3473(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (arg1 < subtract(cs2method5407(0), 1)) { + cameraMethod5502(0, arg1, arg2, arg3, 1, arg1); + setScriptCallOnMinimapRelatedSetting3(3473, new WidgetPointer(arg0), add(arg1, 1), arg4, arg5, 0, 0, "Iiiiii", new WidgetPointer(arg0)); + } else { + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3474.cs2 b/dumps/scripts/3474.cs2 new file mode 100644 index 000000000..a9f972230 --- /dev/null +++ b/dumps/scripts/3474.cs2 @@ -0,0 +1,3 @@ +int script_3474(int arg0,int arg1,int arg2) { + return addToCoordinate(globalint_1065, arg1, arg0, arg2); +} diff --git a/dumps/scripts/3475.cs2 b/dumps/scripts/3475.cs2 new file mode 100644 index 000000000..78a142df1 --- /dev/null +++ b/dumps/scripts/3475.cs2 @@ -0,0 +1,19 @@ +void script_3475(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_1088(arg0, 0); + script_680(arg3); + script_680(arg5); + setScriptCallOnMouseEntered(95, new WidgetPointer(arg3), "I", new WidgetPointer(arg2)); + setScriptCallOnMouseEntered(95, new WidgetPointer(arg5), "I", new WidgetPointer(arg4)); + setScriptCallOnMouseExit(93, new WidgetPointer(arg3), "I", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(93, new WidgetPointer(arg5), "I", new WidgetPointer(arg4)); + cs2method2100(0, 300, new WidgetPointer(arg1)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg4)); + setScriptCallOnClickContextMenu(3479, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg4), 1, "III1", new WidgetPointer(arg2)); + setScriptCallOnClickContextMenu(3479, new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg4), 0, "III1", new WidgetPointer(arg4)); + setScriptCallOnConfigChange(3476, 1506, 1507, 1508, 3, "Y", new WidgetPointer(arg0)); + setScriptCallOnGlobalConfigChange(3476, 1317, 1318, 2, "Y", new WidgetPointer(arg0)); + script_3477(); + return; +} diff --git a/dumps/scripts/3476.cs2 b/dumps/scripts/3476.cs2 new file mode 100644 index 000000000..058ba8b33 --- /dev/null +++ b/dumps/scripts/3476.cs2 @@ -0,0 +1,4 @@ +void script_3476() { + script_3477(); + return; +} diff --git a/dumps/scripts/3477.cs2 b/dumps/scripts/3477.cs2 new file mode 100644 index 000000000..6f3de9259 --- /dev/null +++ b/dumps/scripts/3477.cs2 @@ -0,0 +1,329 @@ +void script_3477() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = subtract(3, script_3484(1)); + if (ivar0 > 0) { + setItemOnWidgetMethod2212(cs2method_3408(105, 111, 3082, 1), ivar0, new WidgetPointer(991,7)); + setScriptCallOnClickContextMenu(3481, -2147483644, "i", new WidgetPointer(991,7)); + setWidgetContextMenuOption(1, new WidgetPointer(991,7), "Select"); + } else { + setItemOnWidgetMethod2205(-1, 0, new WidgetPointer(991,7)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(991,7)); + setWidgetNoOptions(new WidgetPointer(991,7)); + } + ivar0 = subtract(2, script_3484(2)); + if (ivar0 > 0) { + setItemOnWidgetMethod2212(cs2method_3408(105, 111, 3082, 2), ivar0, new WidgetPointer(991,8)); + setScriptCallOnClickContextMenu(3481, -2147483644, "i", new WidgetPointer(991,8)); + setWidgetContextMenuOption(1, new WidgetPointer(991,8), "Select"); + } else { + setItemOnWidgetMethod2205(-1, 0, new WidgetPointer(991,8)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(991,8)); + setWidgetNoOptions(new WidgetPointer(991,8)); + } + ivar0 = subtract(2, script_3484(3)); + if (ivar0 > 0) { + setItemOnWidgetMethod2212(cs2method_3408(105, 111, 3082, 3), ivar0, new WidgetPointer(991,9)); + setScriptCallOnClickContextMenu(3481, -2147483644, "i", new WidgetPointer(991,9)); + setWidgetContextMenuOption(1, new WidgetPointer(991,9), "Select"); + } else { + setItemOnWidgetMethod2205(-1, 0, new WidgetPointer(991,9)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(991,9)); + setWidgetNoOptions(new WidgetPointer(991,9)); + } + ivar0 = subtract(2, script_3485(1)); + if (ivar0 > 0) { + setItemOnWidgetMethod2212(cs2method_3408(105, 111, 3083, 1), ivar0, new WidgetPointer(991,17)); + setScriptCallOnClickContextMenu(3481, -2147483644, "i", new WidgetPointer(991,17)); + setWidgetContextMenuOption(1, new WidgetPointer(991,17), "Select"); + } else { + setItemOnWidgetMethod2205(-1, 0, new WidgetPointer(991,17)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(991,17)); + setWidgetNoOptions(new WidgetPointer(991,17)); + } + ivar0 = subtract(4, script_3485(2)); + if (ivar0 > 0) { + setItemOnWidgetMethod2212(cs2method_3408(105, 111, 3083, 2), ivar0, new WidgetPointer(991,18)); + setScriptCallOnClickContextMenu(3481, -2147483644, "i", new WidgetPointer(991,18)); + setWidgetContextMenuOption(1, new WidgetPointer(991,18), "Select"); + } else { + setItemOnWidgetMethod2205(-1, 0, new WidgetPointer(991,18)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(991,18)); + setWidgetNoOptions(new WidgetPointer(991,18)); + } + ivar0 = subtract(2, script_3485(3)); + if (ivar0 > 0) { + setItemOnWidgetMethod2212(cs2method_3408(105, 111, 3083, 3), ivar0, new WidgetPointer(991,19)); + setScriptCallOnClickContextMenu(3481, -2147483644, "i", new WidgetPointer(991,19)); + setWidgetContextMenuOption(1, new WidgetPointer(991,19), "Select"); + } else { + setItemOnWidgetMethod2205(-1, 0, new WidgetPointer(991,19)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(991,19)); + setWidgetNoOptions(new WidgetPointer(991,19)); + } + deleteAllExtraChilds(new WidgetPointer(991,13)); + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + while (ivar1 < 28) { + createExtraChild(new WidgetPointer(991,13), 5, ivar1); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(multiply(subtract(6, ivar2), 16), multiply(ivar3, 32)), multiply(ivar2, 32), 0, 2); + ivar0 = script_3482(ivar1); + setItemOnWidgetMethod1205(cs2method_3408(105, 111, 3082, ivar0), 1); + if (ivar0 > 0) { + setWidgetContextMenuOption(1, "Remove tile"); + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -2147483643, 150, 0, 10, "Iiiii"); + cs2method1303(5); + cs2method1304(5); + cs2method1302(2); + } + if (ivar3 >= ivar2) { + ivar3 = 0; + ivar2 = add(ivar2, 1); + } else { + ivar3 = add(ivar3, 1); + } + ivar1 = add(ivar1, 1); + } + deleteAllExtraChilds(new WidgetPointer(991,23)); + ivar1 = 0; + ivar2 = 6; + ivar3 = 0; + while (ivar1 < 28) { + createExtraChild(new WidgetPointer(991,23), 5, ivar1); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(multiply(subtract(6, ivar2), 16), multiply(ivar3, 32)), multiply(ivar2, 32), 0, 0); + ivar0 = script_3483(ivar1); + setItemOnWidgetMethod1205(cs2method_3408(105, 111, 3083, ivar0), 1); + if (ivar0 > 0) { + setWidgetContextMenuOption(1, "Remove tile"); + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -2147483643, 125, 0, 8, "Iiiii"); + cs2method1303(5); + cs2method1304(5); + cs2method1302(2); + } + if (ivar3 >= ivar2) { + ivar3 = 0; + ivar2 = subtract(ivar2, 1); + } else { + ivar3 = add(ivar3, 1); + } + ivar1 = add(ivar1, 1); + } + script_3478(64946189, 0, 7, 16750623); + ivar1 = 0; + while (ivar1 <= 30) { + if (isBitFlagged(globalint_1317, ivar1)) { + switch (ivar1) { + case 0: + script_3478(64946189, -1, 5, 16750623); + break; + case 1: + script_3478(64946189, -2, 3, 16750623); + break; + case 2: + script_3478(64946189, 0, 3, 16750623); + break; + case 3: + script_3478(64946189, 2, 3, 16750623); + break; + case 4: + script_3478(64946189, -3, 1, 16750623); + break; + case 5: + script_3478(64946189, 1, 1, 16750623); + break; + case 6: + script_3478(64946189, 3, 1, 16750623); + break; + case 7: + script_3478(64946189, -4, -1, 16750623); + break; + case 8: + script_3478(64946189, -2, -1, 16750623); + break; + case 9: + script_3478(64946189, 2, -1, 16750623); + break; + case 10: + script_3478(64946189, 4, -1, 16750623); + break; + case 11: + script_3478(64946189, -5, -3, 16750623); + break; + case 12: + script_3478(64946189, -3, -3, 16750623); + break; + case 13: + script_3478(64946189, 1, -3, 16750623); + break; + case 14: + script_3478(64946189, 3, -3, 16750623); + break; + case 15: + script_3478(64946189, 5, -3, 16750623); + break; + case 16: + script_3478(64946189, -6, -5, 16750623); + break; + case 17: + script_3478(64946189, -4, -5, 16750623); + break; + case 18: + script_3478(64946189, -2, -5, 16750623); + break; + case 19: + script_3478(64946189, 0, -5, 16750623); + break; + case 20: + script_3478(64946189, 2, -5, 16750623); + break; + case 21: + script_3478(64946189, 4, -5, 16750623); + break; + case 22: + script_3478(64946189, 6, -5, 16750623); + break; + case 23: + script_3478(64946189, -7, -7, 16750623); + script_3478(64946199, -7, 7, 16750623); + break; + case 24: + script_3478(64946189, -5, -7, 16750623); + script_3478(64946199, -5, 7, 16750623); + break; + case 25: + script_3478(64946189, -3, -7, 16750623); + script_3478(64946199, -3, 7, 16750623); + break; + case 26: + script_3478(64946189, -1, -7, 16750623); + script_3478(64946199, -1, 7, 16750623); + break; + case 27: + script_3478(64946189, 1, -7, 16750623); + script_3478(64946199, 1, 7, 16750623); + break; + case 28: + script_3478(64946189, 3, -7, 16750623); + script_3478(64946199, 3, 7, 16750623); + break; + case 29: + script_3478(64946189, 5, -7, 16750623); + script_3478(64946199, 5, 7, 16750623); + break; + case 30: + script_3478(64946189, 7, -7, 16750623); + script_3478(64946199, 7, 7, 16750623); + } + } + ivar1 = add(ivar1, 1); + } + ivar1 = 0; + while (ivar1 <= 30) { + if (isBitFlagged(globalint_1318, ivar1)) { + switch (ivar1) { + case 0: + script_3478(64946199, -6, 5, 16750623); + break; + case 1: + script_3478(64946199, -4, 5, 16750623); + break; + case 2: + script_3478(64946199, -2, 5, 16750623); + break; + case 3: + script_3478(64946199, 0, 5, 16750623); + break; + case 4: + script_3478(64946199, 2, 5, 16750623); + break; + case 5: + script_3478(64946199, 4, 5, 16750623); + break; + case 6: + script_3478(64946199, 6, 5, 16750623); + break; + case 7: + script_3478(64946199, -5, 3, 16750623); + break; + case 8: + script_3478(64946199, -3, 3, 16750623); + break; + case 9: + script_3478(64946199, 3, 3, 16750623); + break; + case 10: + script_3478(64946199, 5, 3, 16750623); + break; + case 11: + script_3478(64946199, -4, 1, 16750623); + break; + case 12: + script_3478(64946199, 4, 1, 16750623); + break; + case 13: + script_3478(64946199, -3, -1, 16750623); + break; + case 14: + script_3478(64946199, -1, -1, 16750623); + break; + case 15: + script_3478(64946199, 1, -1, 16750623); + break; + case 16: + script_3478(64946199, 3, -1, 16750623); + break; + case 17: + script_3478(64946199, 0, -3, 16750623); + break; + case 18: + script_3478(64946199, 2, -3, 16750623); + break; + case 19: + script_3478(64946199, -1, -5, 16750623); + break; + case 20: + script_3478(64946199, 0, -7, 16750623); + break; + case 21: + script_3478(64946189, 1, 5, 0); + break; + case 22: + script_3478(64946189, -1, 1, 0); + break; + case 23: + script_3478(64946189, 0, -1, 0); + break; + case 24: + script_3478(64946189, -1, -3, 0); + break; + case 25: + script_3478(64946199, 1, 3, 0); + break; + case 26: + script_3478(64946199, -2, 1, 0); + break; + case 27: + script_3478(64946199, 0, 1, 0); + break; + case 28: + script_3478(64946199, 2, 1, 0); + break; + case 29: + script_3478(64946199, -2, -3, 0); + break; + case 30: + script_3478(64946199, 1, -5, 0); + break; + default: + setWidgetHidden(1); + } + } + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/3478.cs2 b/dumps/scripts/3478.cs2 new file mode 100644 index 000000000..3f5fd1107 --- /dev/null +++ b/dumps/scripts/3478.cs2 @@ -0,0 +1,8 @@ +void script_3478(int arg0,int arg1,int arg2,int arg3) { + createExtraChild(new WidgetPointer(arg0), 3, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(6, 6, 0, 0); + setWidgetRGB(new Color(arg3)); + setWidgetFilled(1); + setWidgetPosition(multiply(arg1, 16), multiply(arg2, 16), 1, 1); + return; +} diff --git a/dumps/scripts/3479.cs2 b/dumps/scripts/3479.cs2 new file mode 100644 index 000000000..1ca485858 --- /dev/null +++ b/dumps/scripts/3479.cs2 @@ -0,0 +1,7 @@ +void script_3479(int arg0,int arg1,int arg2,int arg3) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + playSoundEffect(2871, 1, 0); + setScriptCallOnGameloop(3480, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), arg3, getClientCycle(), "III1i", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/348.cs2 b/dumps/scripts/348.cs2 new file mode 100644 index 000000000..e8993d638 --- /dev/null +++ b/dumps/scripts/348.cs2 @@ -0,0 +1,20 @@ +void script_348(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = script_166(arg2); + ivar4 = 941; + if (ivar3 >= 7) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetSprite(942, new WidgetPointer(arg1)); + setScriptCallOnMousePressed(44, new WidgetPointer(arg1), ivar4, "Id", new WidgetPointer(arg0)); + } else if (ivar3 == 6) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetSprite(941, new WidgetPointer(arg1)); + ivar4 = 942; + setScriptCallOnMousePressed(44, new WidgetPointer(arg1), ivar4, "Id", new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3480.cs2 b/dumps/scripts/3480.cs2 new file mode 100644 index 000000000..edadbfe02 --- /dev/null +++ b/dumps/scripts/3480.cs2 @@ -0,0 +1,36 @@ +void script_3480(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + ivar5 = cs2method2601(new WidgetPointer(arg0)); + if (((boolean)arg3)) { + if (ivar5 != 0) { + ivar5 = max(subtract(ivar5, 6), 0); + cs2method2100(0, ivar5, new WidgetPointer(arg0)); + } + if (ivar5 <= 0) { + cs2method2100(0, 0, new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + return; + } + } else { + if (ivar5 != 300) { + ivar5 = min(add(ivar5, 6), 300); + cs2method2100(0, ivar5, new WidgetPointer(arg0)); + } + if (ivar5 >= 300) { + cs2method2100(0, 300, new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + return; + } + } + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + if (subtract(getClientCycle(), arg4) >= 10) { + playSoundEffect(2871, 1, 0); + setScriptCallOnGameloop(3480, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), arg3, getClientCycle(), "III1i", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3481.cs2 b/dumps/scripts/3481.cs2 new file mode 100644 index 000000000..196d32cc0 --- /dev/null +++ b/dumps/scripts/3481.cs2 @@ -0,0 +1,6 @@ +void script_3481(int arg0) { + if (((boolean)arg0)) { + messageType0("Drag the tiles into the grid."); + } + return; +} diff --git a/dumps/scripts/3482.cs2 b/dumps/scripts/3482.cs2 new file mode 100644 index 000000000..d5d3866f1 --- /dev/null +++ b/dumps/scripts/3482.cs2 @@ -0,0 +1,61 @@ +int script_3482(int arg0) { + switch (arg0) { + case 0: + return bitconfig_7999; + case 1: + return bitconfig_8000; + case 2: + return -1; + case 3: + return bitconfig_8001; + case 4: + return bitconfig_8002; + case 5: + return bitconfig_8003; + case 6: + return bitconfig_8004; + case 7: + return -1; + case 8: + return bitconfig_8005; + case 9: + return bitconfig_8006; + case 10: + return bitconfig_8007; + case 11: + return bitconfig_8008; + case 12: + return -1; + case 13: + return bitconfig_8009; + case 14: + return bitconfig_8010; + case 15: + return bitconfig_8011; + case 16: + return bitconfig_8012; + case 17: + return -1; + case 18: + return bitconfig_8013; + case 19: + return bitconfig_8014; + case 20: + return bitconfig_8015; + case 21: + return bitconfig_8016; + case 22: + return bitconfig_8017; + case 23: + return bitconfig_8018; + case 24: + return bitconfig_8019; + case 25: + return bitconfig_8020; + case 26: + return bitconfig_8021; + case 27: + return bitconfig_8022; + } + return -1; +} diff --git a/dumps/scripts/3483.cs2 b/dumps/scripts/3483.cs2 new file mode 100644 index 000000000..d6dcbb86e --- /dev/null +++ b/dumps/scripts/3483.cs2 @@ -0,0 +1,61 @@ +int script_3483(int arg0) { + switch (arg0) { + case 0: + return bitconfig_8023; + case 1: + return bitconfig_8024; + case 2: + return bitconfig_8025; + case 3: + return bitconfig_8026; + case 4: + return bitconfig_8027; + case 5: + return bitconfig_8028; + case 6: + return bitconfig_8029; + case 7: + return bitconfig_8030; + case 8: + return bitconfig_8031; + case 9: + return -1; + case 10: + return bitconfig_8032; + case 11: + return bitconfig_8033; + case 12: + return bitconfig_8034; + case 13: + return bitconfig_8035; + case 14: + return -1; + case 15: + return -1; + case 16: + return -1; + case 17: + return bitconfig_8036; + case 18: + return bitconfig_8037; + case 19: + return bitconfig_8038; + case 20: + return bitconfig_8039; + case 21: + return bitconfig_8040; + case 22: + return -1; + case 23: + return bitconfig_8041; + case 24: + return bitconfig_8042; + case 25: + return bitconfig_8043; + case 26: + return -1; + case 27: + return bitconfig_8044; + } + return -1; +} diff --git a/dumps/scripts/3484.cs2 b/dumps/scripts/3484.cs2 new file mode 100644 index 000000000..438545e75 --- /dev/null +++ b/dumps/scripts/3484.cs2 @@ -0,0 +1,77 @@ +int script_3484(int arg0) { + int ivar1; + ivar1 = 0; + if (bitconfig_7999 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8000 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8001 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8002 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8003 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8004 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8005 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8006 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8007 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8008 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8009 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8010 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8011 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8012 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8013 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8014 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8015 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8016 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8017 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8018 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8019 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8020 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8021 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8022 == arg0) { + ivar1 = add(ivar1, 1); + } + return ivar1; +} diff --git a/dumps/scripts/3485.cs2 b/dumps/scripts/3485.cs2 new file mode 100644 index 000000000..1feadbb07 --- /dev/null +++ b/dumps/scripts/3485.cs2 @@ -0,0 +1,71 @@ +int script_3485(int arg0) { + int ivar1; + ivar1 = 0; + if (bitconfig_8023 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8024 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8025 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8026 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8027 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8028 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8029 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8030 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8031 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8032 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8033 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8034 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8035 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8036 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8037 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8038 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8039 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8040 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8041 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8042 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8043 == arg0) { + ivar1 = add(ivar1, 1); + } + if (bitconfig_8044 == arg0) { + ivar1 = add(ivar1, 1); + } + return ivar1; +} diff --git a/dumps/scripts/3486.cs2 b/dumps/scripts/3486.cs2 new file mode 100644 index 000000000..2a7aaeefb --- /dev/null +++ b/dumps/scripts/3486.cs2 @@ -0,0 +1,36 @@ +void script_3486(int arg0,int arg1,int arg2) { + int ivar3; + string svar0; + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg0), 6, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidget3DRotation(0, 0, 0, 0, 0, 2600); + setWidgetNpcHead(2567); + setWidgetAnimation(9804); + script_2647(arg0); + script_1298(getWidgetParentId(new WidgetPointer(arg1)), 0, 0, 0); + createExtraChild(new WidgetPointer(arg1), 4, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetFont(494); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + svar0 = "To modify the spell so that it goes to our chosen destination, you must connect the " + "" + "start node" + "" + " at the bottom to the " + "" + "destination node" + "" + " in the " + "" + "upper half" + "" + " of the tablet." + "
" + "
" + "Drag the " + "" + "conduit tiles" + "" + " into the grid to form a path leading upwards. You can click tiles to remove them from the grid." + "
" + "
" + "The tablet has been damaged slightly by the chipping process, creating " + "" + "dead zones" + "" + ". Magic cannot flow through a " + "" + "dead zone" + "" + ", so you must route the power around them."; + setWidgetText(svar0); + if (add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(arg1)), 494, svar0), 10), 5) <= getWidgetActualHeight(new WidgetPointer(arg1))) { + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + return; + } + ivar3 = add(multiply(getLineCount(subtract(getWidgetActualWidth(new WidgetPointer(arg1)), 17), 494, svar0), 10), 5); + setWidgetSize(17, ivar3, 1, 0); + setWidgetPosition(0, 0, 0, 1); + setWidgetScrollMax(0, ivar3, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + script_31(arg2, arg1, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/3487.cs2 b/dumps/scripts/3487.cs2 new file mode 100644 index 000000000..095e71eaa --- /dev/null +++ b/dumps/scripts/3487.cs2 @@ -0,0 +1,17 @@ +int script_3487(int arg0) { + int ivar1; + int ivar2; + opcStruct5624(2,0,0) structdump_0; + if ((arg0 < 0) || (arg0 > 63)) { + return 0; + } + ivar1 = 0; + ivar2 = 0; + structdump_0 = getUserflowParam(); + ivar1 = structdump_0.intpart_1; + ivar2 = structdump_0.intpart_0; + if (arg0 < 32) { + return script_734(((int)isBitFlagged(ivar1, arg0))); + } + return script_734(((int)isBitFlagged(ivar2, subtract(arg0, 32)))); +} diff --git a/dumps/scripts/3488.cs2 b/dumps/scripts/3488.cs2 new file mode 100644 index 000000000..751e84720 --- /dev/null +++ b/dumps/scripts/3488.cs2 @@ -0,0 +1,22 @@ +void script_3488() { + globalint_1186 = 1337; + globalint_1184 = 0; + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,112)), 52, 0, 0, new WidgetPointer(993,112)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,27)), 52, 0, 0, new WidgetPointer(993,27)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,26)), 52, 0, 0, new WidgetPointer(993,26)); + setWidgetIsHidden(true, new WidgetPointer(993,254)); + setWidgetIsHidden(true, new WidgetPointer(993,239)); + setWidgetIsHidden(true, new WidgetPointer(993,224)); + setWidgetIsHidden(true, new WidgetPointer(993,209)); + cs2method2103(255, new WidgetPointer(993,257)); + cs2method2103(255, new WidgetPointer(993,242)); + cs2method2103(255, new WidgetPointer(993,227)); + cs2method2103(255, new WidgetPointer(993,212)); + setWidgetIsHidden(true, new WidgetPointer(993,194)); + setWidgetIsHidden(true, new WidgetPointer(993,195)); + setWidgetIsHidden(true, new WidgetPointer(993,196)); + setWidgetIsHidden(true, new WidgetPointer(993,197)); + setWidgetIsHidden(true, new WidgetPointer(993,261)); + setWidgetIsHidden(true, new WidgetPointer(993,191)); + return; +} diff --git a/dumps/scripts/3489.cs2 b/dumps/scripts/3489.cs2 new file mode 100644 index 000000000..7a7254539 --- /dev/null +++ b/dumps/scripts/3489.cs2 @@ -0,0 +1,175 @@ +void script_3489() { + int ivar0; + int ivar1; + ivar0 = cs2method_3408(105, 103, 3088, globalint_1184); + ivar1 = 0; + if (globalint_1186 < 17) { + switch (globalint_1184) { + case 1: + if (bitconfig_8053 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,139)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,139)); + } + if (bitconfig_8054 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,46)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,46)); + } + if (bitconfig_8055 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,88)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,88)); + } + break; + case 2: + if (bitconfig_8056 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,139)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,139)); + } + if (bitconfig_8057 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,46)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,46)); + } + if (bitconfig_8058 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,88)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,88)); + } + break; + case 3: + if (bitconfig_8059 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,139)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,139)); + } + if (bitconfig_8060 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,46)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,46)); + } + if (bitconfig_8061 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,88)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,88)); + } + break; + case 4: + if (bitconfig_8062 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,139)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,139)); + } + if (bitconfig_8063 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,46)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,46)); + } + if (bitconfig_8064 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,88)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,88)); + } + } + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,112)), add(getWidgetActualY(new WidgetPointer(993,112)), 4), 0, 0, new WidgetPointer(993,112)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,27)), add(getWidgetActualY(new WidgetPointer(993,27)), 4), 0, 0, new WidgetPointer(993,27)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,26)), add(getWidgetActualY(new WidgetPointer(993,26)), 4), 0, 0, new WidgetPointer(993,26)); + globalint_1186 = add(1, globalint_1186); + } else if (globalint_1186 < 33) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,27)), add(getWidgetActualY(new WidgetPointer(993,27)), 4), 0, 0, new WidgetPointer(993,27)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,26)), add(getWidgetActualY(new WidgetPointer(993,26)), 4), 0, 0, new WidgetPointer(993,26)); + globalint_1186 = add(1, globalint_1186); + } else if (globalint_1186 < 49) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,26)), add(getWidgetActualY(new WidgetPointer(993,26)), 4), 0, 0, new WidgetPointer(993,26)); + globalint_1186 = add(1, globalint_1186); + } else { + if (globalint_1186 < 69) { + ivar1 = multiplyDivide(subtract(globalint_1186, 48), 20, 100); + switch (globalint_1184) { + case 1: + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8053, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,160)); + if (bitconfig_8053 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,139)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,139)); + } + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8054, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,67)); + if (bitconfig_8054 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,46)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,46)); + } + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8055, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,109)); + if (bitconfig_8055 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,88)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,88)); + } + break; + case 2: + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8056, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,160)); + if (bitconfig_8056 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,139)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,139)); + } + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8057, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,67)); + if (bitconfig_8057 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,46)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,46)); + } + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8058, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,109)); + if (bitconfig_8058 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,88)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,88)); + } + break; + case 3: + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8059, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,160)); + if (bitconfig_8059 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,139)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,139)); + } + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8060, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,67)); + if (bitconfig_8060 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,46)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,46)); + } + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8061, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,109)); + if (bitconfig_8061 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,88)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,88)); + } + break; + case 4: + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8062, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,160)); + if (bitconfig_8062 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,139)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,139)); + } + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8063, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,67)); + if (bitconfig_8063 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,46)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,46)); + } + setWidgetSize(multiplyDivide(multiplyDivide(16384, 100, multiply(bitconfig_8064, 10)), 100, ivar1), 16384, 2, 2, new WidgetPointer(993,109)); + if (bitconfig_8064 == 10) { + setWidgetIsHidden(true, new WidgetPointer(993,88)); + } else { + setWidgetIsHidden(false, new WidgetPointer(993,88)); + } + } + globalint_1186 = add(1, globalint_1186); + } + } + return; +} diff --git a/dumps/scripts/349.cs2 b/dumps/scripts/349.cs2 new file mode 100644 index 000000000..f9c5488cb --- /dev/null +++ b/dumps/scripts/349.cs2 @@ -0,0 +1,4 @@ +void script_349() { + script_391(); + return; +} diff --git a/dumps/scripts/3490.cs2 b/dumps/scripts/3490.cs2 new file mode 100644 index 000000000..70c8856b1 --- /dev/null +++ b/dumps/scripts/3490.cs2 @@ -0,0 +1,21 @@ +void script_3490(int arg0) { + int ivar1; + ivar1 = arg0; + switch (arg0) { + case 65077432: + ivar1 = 65077505; + break; + case 65077433: + ivar1 = 65077490; + break; + case 65077434: + ivar1 = 65077475; + break; + case 65077435: + ivar1 = 65077460; + } + if (getWidgetShadeColor(new WidgetPointer(ivar1)) > 220) { + cs2method2103(subtract(getWidgetShadeColor(new WidgetPointer(ivar1)), 2), new WidgetPointer(ivar1)); + } + return; +} diff --git a/dumps/scripts/3491.cs2 b/dumps/scripts/3491.cs2 new file mode 100644 index 000000000..f462beb33 --- /dev/null +++ b/dumps/scripts/3491.cs2 @@ -0,0 +1,19 @@ +void script_3491(int arg0) { + int ivar1; + ivar1 = arg0; + switch (arg0) { + case 65077432: + ivar1 = 65077505; + break; + case 65077433: + ivar1 = 65077490; + break; + case 65077434: + ivar1 = 65077475; + break; + case 65077435: + ivar1 = 65077460; + } + cs2method2103(255, new WidgetPointer(ivar1)); + return; +} diff --git a/dumps/scripts/3492.cs2 b/dumps/scripts/3492.cs2 new file mode 100644 index 000000000..386d61b19 --- /dev/null +++ b/dumps/scripts/3492.cs2 @@ -0,0 +1,23 @@ +void script_3492(int arg0) { + switch (arg0) { + case 65077384: + setWidgetIsHidden(false, new WidgetPointer(993,137)); + break; + case 65077291: + setWidgetIsHidden(false, new WidgetPointer(993,44)); + break; + case 65077333: + setWidgetIsHidden(false, new WidgetPointer(993,86)); + break; + case 65077526: + setWidgetSprite(2568, new WidgetPointer(993,281)); + setWidgetSprite(2569, new WidgetPointer(993,282)); + setWidgetSprite(2568, new WidgetPointer(993,283)); + break; + case 65077527: + setWidgetSprite(2568, new WidgetPointer(993,284)); + setWidgetSprite(2569, new WidgetPointer(993,285)); + setWidgetSprite(2568, new WidgetPointer(993,286)); + } + return; +} diff --git a/dumps/scripts/3493.cs2 b/dumps/scripts/3493.cs2 new file mode 100644 index 000000000..35b1b5d4a --- /dev/null +++ b/dumps/scripts/3493.cs2 @@ -0,0 +1,23 @@ +void script_3493(int arg0) { + switch (arg0) { + case 65077384: + setWidgetIsHidden(true, new WidgetPointer(993,137)); + break; + case 65077291: + setWidgetIsHidden(true, new WidgetPointer(993,44)); + break; + case 65077333: + setWidgetIsHidden(true, new WidgetPointer(993,86)); + break; + case 65077526: + setWidgetSprite(2566, new WidgetPointer(993,281)); + setWidgetSprite(2567, new WidgetPointer(993,282)); + setWidgetSprite(2566, new WidgetPointer(993,283)); + break; + case 65077527: + setWidgetSprite(2566, new WidgetPointer(993,284)); + setWidgetSprite(2567, new WidgetPointer(993,285)); + setWidgetSprite(2566, new WidgetPointer(993,286)); + } + return; +} diff --git a/dumps/scripts/3494.cs2 b/dumps/scripts/3494.cs2 new file mode 100644 index 000000000..f3fac5317 --- /dev/null +++ b/dumps/scripts/3494.cs2 @@ -0,0 +1,134 @@ +void script_3494(int arg0) { + int ivar1; + playSoundEffect(9499, 1, 0); + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,112)), 52, 0, 0, new WidgetPointer(993,112)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,27)), 52, 0, 0, new WidgetPointer(993,27)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(993,26)), 52, 0, 0, new WidgetPointer(993,26)); + setWidgetSize(0, 16384, 2, 2, new WidgetPointer(993,160)); + setWidgetSize(0, 16384, 2, 2, new WidgetPointer(993,67)); + setWidgetSize(0, 16384, 2, 2, new WidgetPointer(993,109)); + setWidgetIsHidden(true, new WidgetPointer(993,254)); + setWidgetIsHidden(true, new WidgetPointer(993,239)); + setWidgetIsHidden(true, new WidgetPointer(993,224)); + setWidgetIsHidden(true, new WidgetPointer(993,209)); + cs2method2103(255, new WidgetPointer(993,257)); + cs2method2103(255, new WidgetPointer(993,242)); + cs2method2103(255, new WidgetPointer(993,227)); + cs2method2103(255, new WidgetPointer(993,212)); + setWidgetIsHidden(true, new WidgetPointer(993,194)); + setWidgetIsHidden(true, new WidgetPointer(993,195)); + setWidgetIsHidden(true, new WidgetPointer(993,196)); + setWidgetIsHidden(true, new WidgetPointer(993,197)); + setWidgetIsHidden(true, new WidgetPointer(993,261)); + switch (globalint_1184) { + case 1: + if (((boolean)bitconfig_8065)) { + setWidgetText(new WidgetPointer(993,139), "In use"); + } else { + setWidgetText(new WidgetPointer(993,139), "Switch-to"); + } + if (bitconfig_8065 == 2) { + setWidgetText(new WidgetPointer(993,46), "In use"); + } else { + setWidgetText(new WidgetPointer(993,46), "Switch-to"); + } + if (bitconfig_8065 == 3) { + setWidgetText(new WidgetPointer(993,88), "In use"); + } else { + setWidgetText(new WidgetPointer(993,88), "Switch-to"); + } + break; + case 2: + if (bitconfig_8065 == 4) { + setWidgetText(new WidgetPointer(993,139), "In use"); + } else { + setWidgetText(new WidgetPointer(993,139), "Switch-to"); + } + if (bitconfig_8065 == 5) { + setWidgetText(new WidgetPointer(993,46), "In use"); + } else { + setWidgetText(new WidgetPointer(993,46), "Switch-to"); + } + if (bitconfig_8065 == 6) { + setWidgetText(new WidgetPointer(993,88), "In use"); + } else { + setWidgetText(new WidgetPointer(993,88), "Switch-to"); + } + break; + case 3: + if (bitconfig_8065 == 7) { + setWidgetText(new WidgetPointer(993,139), "In use"); + } else { + setWidgetText(new WidgetPointer(993,139), "Switch-to"); + } + if (bitconfig_8065 == 8) { + setWidgetText(new WidgetPointer(993,46), "In use"); + } else { + setWidgetText(new WidgetPointer(993,46), "Switch-to"); + } + if (bitconfig_8065 == 9) { + setWidgetText(new WidgetPointer(993,88), "In use"); + } else { + setWidgetText(new WidgetPointer(993,88), "Switch-to"); + } + break; + case 4: + if (bitconfig_8065 == 10) { + setWidgetText(new WidgetPointer(993,139), "In use"); + } else { + setWidgetText(new WidgetPointer(993,139), "Switch-to"); + } + if (bitconfig_8065 == 11) { + setWidgetText(new WidgetPointer(993,46), "In use"); + } else { + setWidgetText(new WidgetPointer(993,46), "Switch-to"); + } + if (bitconfig_8065 == 12) { + setWidgetText(new WidgetPointer(993,88), "In use"); + } else { + setWidgetText(new WidgetPointer(993,88), "Switch-to"); + } + } + switch (arg0) { + case 65077505: + setWidgetIsHidden(false, new WidgetPointer(993,254)); + setWidgetIsHidden(false, new WidgetPointer(993,194)); + globalint_1184 = 1; + setWidgetRGB(new Color(255, 50, 100), new WidgetPointer(993,134)); + setWidgetRGB(new Color(255, 50, 100), new WidgetPointer(993,41)); + setWidgetRGB(new Color(255, 50, 100), new WidgetPointer(993,83)); + break; + case 65077490: + setWidgetIsHidden(false, new WidgetPointer(993,239)); + setWidgetIsHidden(false, new WidgetPointer(993,195)); + globalint_1184 = 2; + setWidgetRGB(new Color(150, 255, 150), new WidgetPointer(993,134)); + setWidgetRGB(new Color(150, 255, 150), new WidgetPointer(993,41)); + setWidgetRGB(new Color(150, 255, 150), new WidgetPointer(993,83)); + break; + case 65077475: + setWidgetIsHidden(false, new WidgetPointer(993,224)); + setWidgetIsHidden(false, new WidgetPointer(993,196)); + globalint_1184 = 3; + setWidgetRGB(new Color(0, 200, 255), new WidgetPointer(993,134)); + setWidgetRGB(new Color(0, 200, 255), new WidgetPointer(993,41)); + setWidgetRGB(new Color(0, 200, 255), new WidgetPointer(993,83)); + break; + case 65077460: + setWidgetIsHidden(false, new WidgetPointer(993,209)); + setWidgetIsHidden(false, new WidgetPointer(993,197)); + globalint_1184 = 4; + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(993,134)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(993,41)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(993,83)); + } + ivar1 = cs2method_3408(105, 103, 3088, globalint_1184); + setWidgetText(new WidgetPointer(993,132), getOtherCommonData(cs2method_3408(105, 74, ivar1, 1), 1089)); + setWidgetText(new WidgetPointer(993,133), getOtherCommonData(cs2method_3408(105, 74, ivar1, 1), 1090)); + setWidgetText(new WidgetPointer(993,39), getOtherCommonData(cs2method_3408(105, 74, ivar1, 2), 1089)); + setWidgetText(new WidgetPointer(993,40), getOtherCommonData(cs2method_3408(105, 74, ivar1, 2), 1090)); + setWidgetText(new WidgetPointer(993,81), getOtherCommonData(cs2method_3408(105, 74, ivar1, 3), 1089)); + setWidgetText(new WidgetPointer(993,82), getOtherCommonData(cs2method_3408(105, 74, ivar1, 3), 1090)); + globalint_1186 = 0; + return; +} diff --git a/dumps/scripts/3495.cs2 b/dumps/scripts/3495.cs2 new file mode 100644 index 000000000..ab0df58c3 --- /dev/null +++ b/dumps/scripts/3495.cs2 @@ -0,0 +1,77 @@ +void script_3495(int arg0,int arg1) { + int ivar2; + string svar0; + string svar1; + string svar2; + svar0 = ""; + svar1 = ""; + ivar2 = 65077550; + switch (globalint_1184) { + case 1: + if (arg0 == 65077382) { + svar0 = cs2method_3408(105, 115, 3089, bitconfig_8053); + svar1 = cs2method_3408(105, 115, 3089, add(bitconfig_8053, 1)); + } else if (arg0 == 65077289) { + svar0 = cs2method_3408(105, 115, 3090, bitconfig_8054); + svar1 = cs2method_3408(105, 115, 3090, add(bitconfig_8054, 1)); + ivar2 = 65077549; + } else { + if (arg0 == 65077331) { + svar0 = cs2method_3408(105, 115, 3091, bitconfig_8055); + svar1 = cs2method_3408(105, 115, 3091, add(bitconfig_8055, 1)); + ivar2 = 65077548; + } + } + break; + case 2: + if (arg0 == 65077382) { + svar0 = cs2method_3408(105, 115, 3092, bitconfig_8056); + svar1 = cs2method_3408(105, 115, 3092, add(bitconfig_8056, 1)); + } else if (arg0 == 65077289) { + svar0 = cs2method_3408(105, 115, 3093, bitconfig_8057); + svar1 = cs2method_3408(105, 115, 3093, add(bitconfig_8057, 1)); + ivar2 = 65077549; + } else { + if (arg0 == 65077331) { + svar0 = cs2method_3408(105, 115, 3094, bitconfig_8058); + svar1 = cs2method_3408(105, 115, 3094, add(bitconfig_8058, 1)); + ivar2 = 65077548; + } + } + break; + case 3: + if (arg0 == 65077382) { + svar0 = cs2method_3408(105, 115, 3095, bitconfig_8059); + svar1 = cs2method_3408(105, 115, 3095, add(bitconfig_8059, 1)); + } else if (arg0 == 65077289) { + svar0 = cs2method_3408(105, 115, 3096, bitconfig_8060); + svar1 = cs2method_3408(105, 115, 3096, add(bitconfig_8060, 1)); + ivar2 = 65077549; + } else { + if (arg0 == 65077331) { + svar0 = cs2method_3408(105, 115, 3097, bitconfig_8061); + svar1 = cs2method_3408(105, 115, 3097, add(bitconfig_8061, 1)); + ivar2 = 65077548; + } + } + break; + case 4: + if (arg0 == 65077382) { + svar0 = cs2method_3408(105, 115, 3098, bitconfig_8062); + svar1 = cs2method_3408(105, 115, 3098, add(bitconfig_8062, 1)); + } else if (arg0 == 65077289) { + svar0 = cs2method_3408(105, 115, 3099, bitconfig_8063); + svar1 = cs2method_3408(105, 115, 3099, add(bitconfig_8063, 1)); + ivar2 = 65077549; + } else { + if (arg0 == 65077331) { + svar0 = cs2method_3408(105, 115, 3100, bitconfig_8064); + svar1 = cs2method_3408(105, 115, 3100, add(bitconfig_8064, 1)); + ivar2 = 65077548; + } + } + } + svar2 = "Current - " + svar0 + "
" + "Next - " + svar1; + script_569(arg0, arg1, ivar2, 25, getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(ivar2)))), svar2); + return; +} diff --git a/dumps/scripts/3496.cs2 b/dumps/scripts/3496.cs2 new file mode 100644 index 000000000..257706c96 --- /dev/null +++ b/dumps/scripts/3496.cs2 @@ -0,0 +1,22 @@ +void script_3496(int arg0) { + switch (arg0) { + case 65208432: + setWidgetIsHidden(false, new WidgetPointer(995,125)); + break; + case 65208343: + setWidgetIsHidden(false, new WidgetPointer(995,39)); + break; + case 65208415: + setWidgetIsHidden(false, new WidgetPointer(995,107)); + break; + case 65208398: + setWidgetIsHidden(false, new WidgetPointer(995,90)); + break; + case 65208381: + setWidgetIsHidden(false, new WidgetPointer(995,73)); + break; + case 65208364: + setWidgetIsHidden(false, new WidgetPointer(995,57)); + } + return; +} diff --git a/dumps/scripts/3497.cs2 b/dumps/scripts/3497.cs2 new file mode 100644 index 000000000..3e9451e39 --- /dev/null +++ b/dumps/scripts/3497.cs2 @@ -0,0 +1,22 @@ +void script_3497(int arg0) { + switch (arg0) { + case 65208432: + setWidgetIsHidden(true, new WidgetPointer(995,125)); + break; + case 65208343: + setWidgetIsHidden(true, new WidgetPointer(995,39)); + break; + case 65208415: + setWidgetIsHidden(true, new WidgetPointer(995,107)); + break; + case 65208398: + setWidgetIsHidden(true, new WidgetPointer(995,90)); + break; + case 65208381: + setWidgetIsHidden(true, new WidgetPointer(995,73)); + break; + case 65208364: + setWidgetIsHidden(true, new WidgetPointer(995,57)); + } + return; +} diff --git a/dumps/scripts/3498.cs2 b/dumps/scripts/3498.cs2 new file mode 100644 index 000000000..7e6641c4a --- /dev/null +++ b/dumps/scripts/3498.cs2 @@ -0,0 +1,88 @@ +void script_3498(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar2 = 65142858; + ivar3 = 65142862; + ivar4 = 65142864; + ivar5 = add(10, multiply(10, arg0)); + ivar6 = getWidgetActualY(new WidgetPointer(994,135)); + switch (ivar6) { + case -22: + ivar6 = arg0; + break; + case -137: + ivar6 = add(arg0, 11); + break; + case -222: + ivar6 = add(arg0, 17); + break; + case -277: + ivar6 = add(arg0, 29); + break; + case -400: + ivar6 = add(arg0, 35); + break; + case -500: + ivar6 = add(arg0, 47); + break; + default: + ivar6 = arg0; + } + if (arg1 != 0) { + ivar6 = arg1; + } + playSoundEffect(8809, 1, 0); + setWidgetPosition(0, ivar5, 0, 0, new WidgetPointer(ivar2)); + setWidgetText(new WidgetPointer(ivar3), intToStr(ivar6)); + switch (arg0) { + case 1: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,44))); + break; + case 2: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,46))); + break; + case 3: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,48))); + break; + case 4: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,50))); + break; + case 5: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,52))); + break; + case 6: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,54))); + break; + case 7: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,56))); + break; + case 8: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,58))); + break; + case 9: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,60))); + break; + case 10: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,62))); + break; + case 11: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,64))); + break; + case 12: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,66))); + break; + case 13: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,68))); + break; + case 14: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,70))); + break; + case 15: + setWidgetText(new WidgetPointer(ivar4), getWidgetText(new WidgetPointer(994,72))); + break; + } + return; +} diff --git a/dumps/scripts/3499.cs2 b/dumps/scripts/3499.cs2 new file mode 100644 index 000000000..e0e31c1c2 --- /dev/null +++ b/dumps/scripts/3499.cs2 @@ -0,0 +1,30 @@ +void script_3499(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 0; + if (arg0 > 20000000) { + arg0 = 0; + } + if ((extractY(getMyPositionHash()) > 6400) || (extractY(getMyPositionHash()) > extractY(48238975))) { + setWidget3DRotation(0, 0, 512, mod(subtract(getWidgetRotateY(new WidgetPointer(arg1)), 30), 2047), 40, 275, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } else if (((boolean)script_133(33556928, 869257279, getMyPositionHash()))) { + if (mod(arg0, 68) > 34) { + setWidget3DRotation(0, 0, 512, mod(subtract(getWidgetRotateY(new WidgetPointer(arg1)), 30), 2047), 40, 275, new WidgetPointer(arg1)); + } else { + setWidget3DRotation(0, 0, 512, mod(add(getWidgetRotateY(new WidgetPointer(arg1)), 30), 2047), 40, 275, new WidgetPointer(arg1)); + } + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } else if (subtract(extractZ(getMyPositionHash()), extractZ(globalint_1323)) > 0) { + setWidget3DRotation(0, 0, 512, mod(add(getWidgetRotateY(new WidgetPointer(arg1)), 30), 2047), 40, 275, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } else if (ivar3 == -1) { + setWidget3DRotation(0, 0, 0, 0, 40, 275, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + } else { + setWidget3DRotation(0, 0, 512, divide(multiply(2047, ivar3), 65535), 40, 275, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } + ivar3 = script_3500(extractX(getMyPositionHash()), extractY(getMyPositionHash()), extractX(globalint_1323), extractY(globalint_1323)); + setScriptCallOnGameloop(3499, add(arg0, 1), new WidgetPointer(arg1), new WidgetPointer(arg2), "iII", new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/35.cs2 b/dumps/scripts/35.cs2 new file mode 100644 index 000000000..4ade2b902 --- /dev/null +++ b/dumps/scripts/35.cs2 @@ -0,0 +1,22 @@ +void script_35(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + ivar4 = 0; + ivar5 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetPosition(0, add(arg2, 16), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetPosition(0, add(subtract(add(arg2, getWidgetActualHeight()), 5), 16), 0, 0); + } + ivar4 = subtract(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), 32), getWidgetActualHeight()); + if (ivar4 <= 0) { + return; + } + ivar5 = subtract(getWidgetScrollMaxV(new WidgetPointer(arg1)), getWidgetActualHeight(new WidgetPointer(arg1))); + arg2 = divide(multiply(arg2, ivar5), ivar4); + script_37(arg0, arg1, arg2, arg3); + } + return; +} diff --git a/dumps/scripts/350.cs2 b/dumps/scripts/350.cs2 new file mode 100644 index 000000000..15b57ca4d --- /dev/null +++ b/dumps/scripts/350.cs2 @@ -0,0 +1,41 @@ +void script_350(int arg0,int arg1) { + int ivar2; + int ivar3; + if (arg0 != 1) { + return; + } + if (((boolean)arg1)) { + if (IsFemale()) { + return; + } + cs2method403(0, -1); + cs2method403(1, -1); + cs2method403(7, getOtherCommonData(cs2method_3408(105, 74, 3302, bitconfig_8091), 788)); + cs2method403(8, -1); + } else { + if (IsFemale()) { + return; + } + cs2method403(7, -1); + cs2method403(8, -1); + cs2method403(0, getOtherCommonData(cs2method_3408(105, 74, 3304, bitconfig_8091), 788)); + cs2method403(1, cs2method_3408(105, 75, 3307, divide(bitconfig_8091, 2))); + } + playSoundEffect(9819, 1, 0); + cs2method410(script_42(arg1)); + globalint_196 = ((int)IsFemale()); + bitconfig_8093 = globalint_196; + script_387(arg1); + globalint_86 = 1; + bitconfig_8090 = 1; + ivar2 = cs2method_3408(105, 74, 3278, subtract(globalint_197, 1)); + ivar3 = -1; + if (ivar2 != -1) { + ivar3 = script_384(0, ivar2, arg1); + if (ivar3 != -1) { + script_359(ivar3, arg1); + } + } + script_390(arg1); + return; +} diff --git a/dumps/scripts/3500.cs2 b/dumps/scripts/3500.cs2 new file mode 100644 index 000000000..1fe346c01 --- /dev/null +++ b/dumps/scripts/3500.cs2 @@ -0,0 +1,43 @@ +int script_3500(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + ivar4 = subtract(arg2, arg0); + ivar5 = subtract(arg3, arg1); + if (ivar5 > 0) { + if (ivar4 > 0) { + if (ivar5 > ivar4) { + return divide(multiply(8192, ivar4), ivar5); + } + return subtract(16834, divide(multiply(8192, ivar5), ivar4)); + } + if (ivar4 < 0) { + if (subtract(0, ivar4) > ivar5) { + return subtract(49152, divide(multiply(8192, ivar5), ivar4)); + } + return add(65535, divide(multiply(8192, ivar4), ivar5)); + } + return 0; + } + if (ivar5 < 0) { + if (ivar4 > 0) { + if (ivar4 > subtract(0, ivar5)) { + return subtract(16834, divide(multiply(8192, ivar5), ivar4)); + } + return add(32768, divide(multiply(8192, ivar4), ivar5)); + } + if (ivar4 < 0) { + if (ivar5 < ivar4) { + return add(32768, divide(multiply(8192, ivar4), ivar5)); + } + return subtract(49152, divide(multiply(8192, ivar5), ivar4)); + } + return 32768; + } + if (ivar4 > 0) { + return 16384; + } + if (ivar4 < 0) { + return 49152; + } + return -1; +} diff --git a/dumps/scripts/3501.cs2 b/dumps/scripts/3501.cs2 new file mode 100644 index 000000000..39f24f403 --- /dev/null +++ b/dumps/scripts/3501.cs2 @@ -0,0 +1,24 @@ +void script_3501(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + while (ivar1 < getItemContainerLength(207)) { + createExtraChild(new WidgetPointer(arg0), 6, ivar1); + setWidgetSize(49, 49, 0, 0); + setWidgetPosition(multiply(56, ivar2), multiply(56, ivar3), 0, 0); + if (getItemIdInSlot(207, ivar1) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(207, ivar1), getItemAmtInSlot(207, ivar1)); + setWidget3DRotation(0, 0, 512, 0, 0, 1340); + cs2method1111(1); + } else { + setWidgetHidden(1); + } + ivar1 = add(ivar1, 1); + ivar2 = mod(ivar1, 5); + ivar3 = divide(ivar1, 5); + } + return; +} diff --git a/dumps/scripts/3502.cs2 b/dumps/scripts/3502.cs2 new file mode 100644 index 000000000..e73f6a352 --- /dev/null +++ b/dumps/scripts/3502.cs2 @@ -0,0 +1,15 @@ +void script_3502() { + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3547(3), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,191)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3545(4), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,192)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3545(12), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,193)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3546(13), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,194)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3546(5), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,195)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3547(11), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,196)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3546(1), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,197)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3547(14), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,198)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3545(1), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,199)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3545(9), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,200)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3547(6), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,201)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3546(9), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1003,202)); + return; +} diff --git a/dumps/scripts/3503.cs2 b/dumps/scripts/3503.cs2 new file mode 100644 index 000000000..68cd4279c --- /dev/null +++ b/dumps/scripts/3503.cs2 @@ -0,0 +1,4 @@ +void script_3503(int arg0,int arg1,int arg2) { + script_3625(3180, 3181, 3182, script_3548(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3504.cs2 b/dumps/scripts/3504.cs2 new file mode 100644 index 000000000..6e1d2b44d --- /dev/null +++ b/dumps/scripts/3504.cs2 @@ -0,0 +1,4 @@ +void script_3504(int arg0,int arg1,int arg2) { + script_3625(3183, 3184, 3185, script_3549(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3505.cs2 b/dumps/scripts/3505.cs2 new file mode 100644 index 000000000..c99f1147c --- /dev/null +++ b/dumps/scripts/3505.cs2 @@ -0,0 +1,4 @@ +void script_3505(int arg0,int arg1,int arg2) { + script_3625(3186, 3187, 3188, script_3550(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3506.cs2 b/dumps/scripts/3506.cs2 new file mode 100644 index 000000000..91b6a1651 --- /dev/null +++ b/dumps/scripts/3506.cs2 @@ -0,0 +1,4 @@ +void script_3506(int arg0,int arg1,int arg2) { + script_3626(3180, 3181, 3182, script_3548(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3507.cs2 b/dumps/scripts/3507.cs2 new file mode 100644 index 000000000..4a3536229 --- /dev/null +++ b/dumps/scripts/3507.cs2 @@ -0,0 +1,4 @@ +void script_3507(int arg0,int arg1,int arg2) { + script_3626(3183, 3184, 3185, script_3549(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3508.cs2 b/dumps/scripts/3508.cs2 new file mode 100644 index 000000000..9794b35cc --- /dev/null +++ b/dumps/scripts/3508.cs2 @@ -0,0 +1,4 @@ +void script_3508(int arg0,int arg1,int arg2) { + script_3626(3186, 3187, 3188, script_3550(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3509.cs2 b/dumps/scripts/3509.cs2 new file mode 100644 index 000000000..a2d9bf74f --- /dev/null +++ b/dumps/scripts/3509.cs2 @@ -0,0 +1,5 @@ +void script_3509(int arg0) { + script_3632(arg0); + script_3511(arg0); + return; +} diff --git a/dumps/scripts/351.cs2 b/dumps/scripts/351.cs2 new file mode 100644 index 000000000..121116a96 --- /dev/null +++ b/dumps/scripts/351.cs2 @@ -0,0 +1,33 @@ +void script_351(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + if ((arg1 == globalint_197) || (arg0 != 1)) { + return; + } + ivar2 = script_734(globalint_196); + playSoundEffect(9830, 1, 0); + ivar3 = 3278; + ivar4 = cs2method_3408(105, 74, ivar3, subtract(arg1, 1)); + if (ivar4 == -1) { + globalint_197 = 1; + bitconfig_8089 = 1; + ivar4 = cs2method_3408(105, 74, ivar3, 0); + } else { + globalint_197 = arg1; + bitconfig_8089 = arg1; + } + ivar5 = script_384(0, ivar4, script_734(((int)IsFemale()))); + if (ivar5 == -1) { + globalint_86 = 0; + bitconfig_8090 = 0; + } else { + globalint_86 = 1; + bitconfig_8090 = 1; + script_359(ivar5, ivar2); + } + script_387(ivar2); + script_390(ivar2); + return; +} diff --git a/dumps/scripts/3510.cs2 b/dumps/scripts/3510.cs2 new file mode 100644 index 000000000..40552692d --- /dev/null +++ b/dumps/scripts/3510.cs2 @@ -0,0 +1,4 @@ +void script_3510(int arg0) { + script_3511(arg0); + return; +} diff --git a/dumps/scripts/3511.cs2 b/dumps/scripts/3511.cs2 new file mode 100644 index 000000000..b14d39b4f --- /dev/null +++ b/dumps/scripts/3511.cs2 @@ -0,0 +1,8 @@ +void script_3511(int arg0) { + if (script_3546(3) == script_3547(3)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3512.cs2 b/dumps/scripts/3512.cs2 new file mode 100644 index 000000000..0676efb91 --- /dev/null +++ b/dumps/scripts/3512.cs2 @@ -0,0 +1,5 @@ +void script_3512(int arg0) { + script_3632(arg0); + script_3514(arg0); + return; +} diff --git a/dumps/scripts/3513.cs2 b/dumps/scripts/3513.cs2 new file mode 100644 index 000000000..273a1d655 --- /dev/null +++ b/dumps/scripts/3513.cs2 @@ -0,0 +1,4 @@ +void script_3513(int arg0) { + script_3514(arg0); + return; +} diff --git a/dumps/scripts/3514.cs2 b/dumps/scripts/3514.cs2 new file mode 100644 index 000000000..8f1175300 --- /dev/null +++ b/dumps/scripts/3514.cs2 @@ -0,0 +1,8 @@ +void script_3514(int arg0) { + if (script_3547(4) == script_3545(4)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3515.cs2 b/dumps/scripts/3515.cs2 new file mode 100644 index 000000000..181c4a6ef --- /dev/null +++ b/dumps/scripts/3515.cs2 @@ -0,0 +1,5 @@ +void script_3515(int arg0) { + script_3632(arg0); + script_3517(arg0); + return; +} diff --git a/dumps/scripts/3516.cs2 b/dumps/scripts/3516.cs2 new file mode 100644 index 000000000..5c04f37d3 --- /dev/null +++ b/dumps/scripts/3516.cs2 @@ -0,0 +1,4 @@ +void script_3516(int arg0) { + script_3517(arg0); + return; +} diff --git a/dumps/scripts/3517.cs2 b/dumps/scripts/3517.cs2 new file mode 100644 index 000000000..fcc5bc8d9 --- /dev/null +++ b/dumps/scripts/3517.cs2 @@ -0,0 +1,8 @@ +void script_3517(int arg0) { + if (script_3547(12) == script_3545(12)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3518.cs2 b/dumps/scripts/3518.cs2 new file mode 100644 index 000000000..d96a26325 --- /dev/null +++ b/dumps/scripts/3518.cs2 @@ -0,0 +1,5 @@ +void script_3518(int arg0) { + script_3632(arg0); + script_3520(arg0); + return; +} diff --git a/dumps/scripts/3519.cs2 b/dumps/scripts/3519.cs2 new file mode 100644 index 000000000..c7cfcc0bf --- /dev/null +++ b/dumps/scripts/3519.cs2 @@ -0,0 +1,4 @@ +void script_3519(int arg0) { + script_3520(arg0); + return; +} diff --git a/dumps/scripts/352.cs2 b/dumps/scripts/352.cs2 new file mode 100644 index 000000000..1fc6f0a06 --- /dev/null +++ b/dumps/scripts/352.cs2 @@ -0,0 +1,23 @@ +void script_352(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + if ((arg1 == globalint_86) || (arg0 != 1)) { + return; + } + playSoundEffect(9819, 1, 0); + ivar2 = cs2method_3408(105, 74, 3278, subtract(globalint_197, 1)); + if (ivar2 == -1) { + return; + } + ivar3 = script_734(((int)IsFemale())); + ivar4 = script_384(subtract(arg1, 1), ivar2, ivar3); + if (ivar4 == -1) { + return; + } + globalint_86 = arg1; + bitconfig_8090 = arg1; + script_359(ivar4, ivar3); + script_390(ivar3); + return; +} diff --git a/dumps/scripts/3520.cs2 b/dumps/scripts/3520.cs2 new file mode 100644 index 000000000..3154a9c99 --- /dev/null +++ b/dumps/scripts/3520.cs2 @@ -0,0 +1,8 @@ +void script_3520(int arg0) { + if (script_3545(13) == script_3546(13)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3521.cs2 b/dumps/scripts/3521.cs2 new file mode 100644 index 000000000..728ddf578 --- /dev/null +++ b/dumps/scripts/3521.cs2 @@ -0,0 +1,5 @@ +void script_3521(int arg0) { + script_3632(arg0); + script_3523(arg0); + return; +} diff --git a/dumps/scripts/3522.cs2 b/dumps/scripts/3522.cs2 new file mode 100644 index 000000000..657714ee1 --- /dev/null +++ b/dumps/scripts/3522.cs2 @@ -0,0 +1,4 @@ +void script_3522(int arg0) { + script_3523(arg0); + return; +} diff --git a/dumps/scripts/3523.cs2 b/dumps/scripts/3523.cs2 new file mode 100644 index 000000000..8d3d7e160 --- /dev/null +++ b/dumps/scripts/3523.cs2 @@ -0,0 +1,8 @@ +void script_3523(int arg0) { + if (script_3545(5) == script_3546(5)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3524.cs2 b/dumps/scripts/3524.cs2 new file mode 100644 index 000000000..223de21f6 --- /dev/null +++ b/dumps/scripts/3524.cs2 @@ -0,0 +1,5 @@ +void script_3524(int arg0) { + script_3632(arg0); + script_3526(arg0); + return; +} diff --git a/dumps/scripts/3525.cs2 b/dumps/scripts/3525.cs2 new file mode 100644 index 000000000..093f0f28d --- /dev/null +++ b/dumps/scripts/3525.cs2 @@ -0,0 +1,4 @@ +void script_3525(int arg0) { + script_3526(arg0); + return; +} diff --git a/dumps/scripts/3526.cs2 b/dumps/scripts/3526.cs2 new file mode 100644 index 000000000..2a46cc525 --- /dev/null +++ b/dumps/scripts/3526.cs2 @@ -0,0 +1,8 @@ +void script_3526(int arg0) { + if (script_3546(11) == script_3547(11)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3527.cs2 b/dumps/scripts/3527.cs2 new file mode 100644 index 000000000..ddf6034eb --- /dev/null +++ b/dumps/scripts/3527.cs2 @@ -0,0 +1,5 @@ +void script_3527(int arg0) { + script_3632(arg0); + script_3529(arg0); + return; +} diff --git a/dumps/scripts/3528.cs2 b/dumps/scripts/3528.cs2 new file mode 100644 index 000000000..f2fbd4688 --- /dev/null +++ b/dumps/scripts/3528.cs2 @@ -0,0 +1,4 @@ +void script_3528(int arg0) { + script_3529(arg0); + return; +} diff --git a/dumps/scripts/3529.cs2 b/dumps/scripts/3529.cs2 new file mode 100644 index 000000000..73bcf6232 --- /dev/null +++ b/dumps/scripts/3529.cs2 @@ -0,0 +1,8 @@ +void script_3529(int arg0) { + if (script_3547(15) == script_3546(1)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/353.cs2 b/dumps/scripts/353.cs2 new file mode 100644 index 000000000..348e92b78 --- /dev/null +++ b/dumps/scripts/353.cs2 @@ -0,0 +1,10 @@ +void script_353(int arg0) { + playSoundEffect(9824, 1, 0); + if (((boolean)arg0) && ((boolean)bitconfig_8246)) { + bitconfig_8247 = 1; + setWidgetIsHidden(false, new WidgetPointer(1028,117)); + script_2741(); + } + script_386(arg0); + return; +} diff --git a/dumps/scripts/3530.cs2 b/dumps/scripts/3530.cs2 new file mode 100644 index 000000000..9e5ba4392 --- /dev/null +++ b/dumps/scripts/3530.cs2 @@ -0,0 +1,5 @@ +void script_3530(int arg0) { + script_3632(arg0); + script_3532(arg0); + return; +} diff --git a/dumps/scripts/3531.cs2 b/dumps/scripts/3531.cs2 new file mode 100644 index 000000000..c5c9b33e1 --- /dev/null +++ b/dumps/scripts/3531.cs2 @@ -0,0 +1,4 @@ +void script_3531(int arg0) { + script_3532(arg0); + return; +} diff --git a/dumps/scripts/3532.cs2 b/dumps/scripts/3532.cs2 new file mode 100644 index 000000000..1243676df --- /dev/null +++ b/dumps/scripts/3532.cs2 @@ -0,0 +1,8 @@ +void script_3532(int arg0) { + if (script_3545(2) == script_3547(14)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3533.cs2 b/dumps/scripts/3533.cs2 new file mode 100644 index 000000000..cf186e136 --- /dev/null +++ b/dumps/scripts/3533.cs2 @@ -0,0 +1,5 @@ +void script_3533(int arg0) { + script_3632(arg0); + script_3535(arg0); + return; +} diff --git a/dumps/scripts/3534.cs2 b/dumps/scripts/3534.cs2 new file mode 100644 index 000000000..a56f41a55 --- /dev/null +++ b/dumps/scripts/3534.cs2 @@ -0,0 +1,4 @@ +void script_3534(int arg0) { + script_3535(arg0); + return; +} diff --git a/dumps/scripts/3535.cs2 b/dumps/scripts/3535.cs2 new file mode 100644 index 000000000..81d8f4c74 --- /dev/null +++ b/dumps/scripts/3535.cs2 @@ -0,0 +1,8 @@ +void script_3535(int arg0) { + if (script_3546(15) == script_3545(1)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3536.cs2 b/dumps/scripts/3536.cs2 new file mode 100644 index 000000000..7c1aaa927 --- /dev/null +++ b/dumps/scripts/3536.cs2 @@ -0,0 +1,5 @@ +void script_3536(int arg0) { + script_3632(arg0); + script_3538(arg0); + return; +} diff --git a/dumps/scripts/3537.cs2 b/dumps/scripts/3537.cs2 new file mode 100644 index 000000000..beadf16fe --- /dev/null +++ b/dumps/scripts/3537.cs2 @@ -0,0 +1,4 @@ +void script_3537(int arg0) { + script_3538(arg0); + return; +} diff --git a/dumps/scripts/3538.cs2 b/dumps/scripts/3538.cs2 new file mode 100644 index 000000000..d72489afb --- /dev/null +++ b/dumps/scripts/3538.cs2 @@ -0,0 +1,8 @@ +void script_3538(int arg0) { + if (script_3545(9) == script_3546(7)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3539.cs2 b/dumps/scripts/3539.cs2 new file mode 100644 index 000000000..e0643e259 --- /dev/null +++ b/dumps/scripts/3539.cs2 @@ -0,0 +1,5 @@ +void script_3539(int arg0) { + script_3632(arg0); + script_3541(arg0); + return; +} diff --git a/dumps/scripts/354.cs2 b/dumps/scripts/354.cs2 new file mode 100644 index 000000000..e985eec60 --- /dev/null +++ b/dumps/scripts/354.cs2 @@ -0,0 +1,10 @@ +void script_354(int arg0,int arg1) { + if ((arg0 != 1) || (arg1 == globalint_1020)) { + return; + } + playSoundEffect(9819, 1, 0); + globalint_1020 = arg1; + bitconfig_6501 = arg1; + script_391(); + return; +} diff --git a/dumps/scripts/3540.cs2 b/dumps/scripts/3540.cs2 new file mode 100644 index 000000000..5bbd31d77 --- /dev/null +++ b/dumps/scripts/3540.cs2 @@ -0,0 +1,4 @@ +void script_3540(int arg0) { + script_3541(arg0); + return; +} diff --git a/dumps/scripts/3541.cs2 b/dumps/scripts/3541.cs2 new file mode 100644 index 000000000..faf41f634 --- /dev/null +++ b/dumps/scripts/3541.cs2 @@ -0,0 +1,8 @@ +void script_3541(int arg0) { + if (script_3547(6) == script_3545(10)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3542.cs2 b/dumps/scripts/3542.cs2 new file mode 100644 index 000000000..2b6272254 --- /dev/null +++ b/dumps/scripts/3542.cs2 @@ -0,0 +1,5 @@ +void script_3542(int arg0) { + script_3632(arg0); + script_3544(arg0); + return; +} diff --git a/dumps/scripts/3543.cs2 b/dumps/scripts/3543.cs2 new file mode 100644 index 000000000..c0dc274a1 --- /dev/null +++ b/dumps/scripts/3543.cs2 @@ -0,0 +1,4 @@ +void script_3543(int arg0) { + script_3544(arg0); + return; +} diff --git a/dumps/scripts/3544.cs2 b/dumps/scripts/3544.cs2 new file mode 100644 index 000000000..2b288323e --- /dev/null +++ b/dumps/scripts/3544.cs2 @@ -0,0 +1,8 @@ +void script_3544(int arg0) { + if (script_3547(7) == script_3546(9)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3545.cs2 b/dumps/scripts/3545.cs2 new file mode 100644 index 000000000..32aa988b8 --- /dev/null +++ b/dumps/scripts/3545.cs2 @@ -0,0 +1,3 @@ +int script_3545(int arg0) { + return cs2method_3408(105, 105, script_3548(bitconfig_7392), mod(add(arg0, bitconfig_7388), getCommonDefinitionSize(script_3548(bitconfig_7392)))); +} diff --git a/dumps/scripts/3546.cs2 b/dumps/scripts/3546.cs2 new file mode 100644 index 000000000..f5bdd5d02 --- /dev/null +++ b/dumps/scripts/3546.cs2 @@ -0,0 +1,3 @@ +int script_3546(int arg0) { + return cs2method_3408(105, 105, script_3549(bitconfig_7392), mod(add(arg0, bitconfig_7389), getCommonDefinitionSize(script_3549(bitconfig_7392)))); +} diff --git a/dumps/scripts/3547.cs2 b/dumps/scripts/3547.cs2 new file mode 100644 index 000000000..f97e23c90 --- /dev/null +++ b/dumps/scripts/3547.cs2 @@ -0,0 +1,3 @@ +int script_3547(int arg0) { + return cs2method_3408(105, 105, script_3550(bitconfig_7392), mod(add(arg0, bitconfig_7390), getCommonDefinitionSize(script_3550(bitconfig_7392)))); +} diff --git a/dumps/scripts/3548.cs2 b/dumps/scripts/3548.cs2 new file mode 100644 index 000000000..558f10ae6 --- /dev/null +++ b/dumps/scripts/3548.cs2 @@ -0,0 +1,22 @@ +int script_3548(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3207; + flow_1: + return 3210; + flow_2: + return 3213; + flow_3: + return 3216; + flow_4: + return 3219; +} diff --git a/dumps/scripts/3549.cs2 b/dumps/scripts/3549.cs2 new file mode 100644 index 000000000..36f88e339 --- /dev/null +++ b/dumps/scripts/3549.cs2 @@ -0,0 +1,22 @@ +int script_3549(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3208; + flow_1: + return 3211; + flow_2: + return 3214; + flow_3: + return 3217; + flow_4: + return 3220; +} diff --git a/dumps/scripts/355.cs2 b/dumps/scripts/355.cs2 new file mode 100644 index 000000000..dd8b9e001 --- /dev/null +++ b/dumps/scripts/355.cs2 @@ -0,0 +1,103 @@ +void script_355(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int stack_dump0; + if (arg0 != 1) { + return; + } + ivar3 = -1; + ivar4 = -1; + switch (arg2) { + case 0: + case 7: + globalint_1008 = arg1; + cs2method403(arg2, arg1); + playSoundEffect(9860, 1, 0); + break; + case 1: + case 8: + globalint_1009 = arg1; + cs2method403(arg2, arg1); + playSoundEffect(9860, 1, 0); + break; + case 2: + case 3: + case 4: + case 9: + case 10: + case 11: + globalint_86 = 0; + cs2method411(2, 19713); + cs2method411(3, -1); + cs2method411(5, -1); + playSoundEffect(9819, 1, 0); + switch (arg2) { + case 9: + case 2: + stack_dump0 = arg1; + ivar4 = 3; + globalint_1010 = stack_dump0; + break; + case 10: + case 3: + stack_dump0 = arg1; + ivar4 = 4; + globalint_1011 = stack_dump0; + break; + case 11: + case 4: + stack_dump0 = arg1; + ivar4 = 5; + globalint_1012 = stack_dump0; + } + ivar3 = script_361(arg1, ivar4); + if (ivar3 != -1) { + if (IsFemale()) { + globalint_1010 = getOtherCommonData(ivar3, 1182); + cs2method403(9, globalint_1010); + globalint_1011 = getOtherCommonData(ivar3, 1183); + cs2method403(10, globalint_1011); + globalint_1012 = getOtherCommonData(ivar3, 1184); + cs2method403(11, globalint_1012); + script_392(-1, 1); + } else { + globalint_1010 = getOtherCommonData(ivar3, 1182); + cs2method403(2, globalint_1010); + globalint_1011 = getOtherCommonData(ivar3, 1183); + cs2method403(3, globalint_1011); + globalint_1012 = getOtherCommonData(ivar3, 1184); + cs2method403(4, globalint_1012); + script_392(-1, 0); + } + } else { + cs2method403(arg2, arg1); + } + break; + case 5: + case 12: + globalint_86 = 0; + cs2method411(2, 19713); + cs2method411(3, -1); + cs2method411(5, -1); + script_392(-1, script_734(((int)IsFemale()))); + cs2method403(arg2, arg1); + globalint_1013 = arg1; + playSoundEffect(9819, 1, 0); + break; + case 6: + case 13: + globalint_86 = 0; + cs2method411(2, 19713); + cs2method411(3, -1); + cs2method411(5, -1); + script_392(-1, script_734(((int)IsFemale()))); + cs2method403(arg2, arg1); + globalint_1014 = arg1; + playSoundEffect(9819, 1, 0); + break; + default: + return; + } + script_391(); + return; +} diff --git a/dumps/scripts/3550.cs2 b/dumps/scripts/3550.cs2 new file mode 100644 index 000000000..353412772 --- /dev/null +++ b/dumps/scripts/3550.cs2 @@ -0,0 +1,22 @@ +int script_3550(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3209; + flow_1: + return 3212; + flow_2: + return 3215; + flow_3: + return 3218; + flow_4: + return 3221; +} diff --git a/dumps/scripts/3551.cs2 b/dumps/scripts/3551.cs2 new file mode 100644 index 000000000..7b30eeedb --- /dev/null +++ b/dumps/scripts/3551.cs2 @@ -0,0 +1,13 @@ +void script_3551() { + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3590(15), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,181)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3588(5), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,182)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3589(5), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,183)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3588(9), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,184)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3590(13), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,185)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3588(13), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,186)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3589(1), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,187)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3590(5), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,188)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3590(7), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,189)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3589(13), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1000,190)); + return; +} diff --git a/dumps/scripts/3552.cs2 b/dumps/scripts/3552.cs2 new file mode 100644 index 000000000..6999c5782 --- /dev/null +++ b/dumps/scripts/3552.cs2 @@ -0,0 +1,4 @@ +void script_3552(int arg0,int arg1,int arg2) { + script_3625(3198, 3199, 3200, script_3591(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3553.cs2 b/dumps/scripts/3553.cs2 new file mode 100644 index 000000000..51014b3de --- /dev/null +++ b/dumps/scripts/3553.cs2 @@ -0,0 +1,4 @@ +void script_3553(int arg0,int arg1,int arg2) { + script_3625(3201, 3202, 3203, script_3592(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3554.cs2 b/dumps/scripts/3554.cs2 new file mode 100644 index 000000000..92f0d50f5 --- /dev/null +++ b/dumps/scripts/3554.cs2 @@ -0,0 +1,4 @@ +void script_3554(int arg0,int arg1,int arg2) { + script_3625(3204, 3205, 3206, script_3593(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3555.cs2 b/dumps/scripts/3555.cs2 new file mode 100644 index 000000000..e061831d1 --- /dev/null +++ b/dumps/scripts/3555.cs2 @@ -0,0 +1,4 @@ +void script_3555(int arg0,int arg1,int arg2) { + script_3626(3198, 3199, 3200, script_3591(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3556.cs2 b/dumps/scripts/3556.cs2 new file mode 100644 index 000000000..411c50a94 --- /dev/null +++ b/dumps/scripts/3556.cs2 @@ -0,0 +1,4 @@ +void script_3556(int arg0,int arg1,int arg2) { + script_3626(3201, 3202, 3203, script_3592(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3557.cs2 b/dumps/scripts/3557.cs2 new file mode 100644 index 000000000..396580e67 --- /dev/null +++ b/dumps/scripts/3557.cs2 @@ -0,0 +1,4 @@ +void script_3557(int arg0,int arg1,int arg2) { + script_3626(3204, 3205, 3206, script_3593(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3558.cs2 b/dumps/scripts/3558.cs2 new file mode 100644 index 000000000..5c355f5a4 --- /dev/null +++ b/dumps/scripts/3558.cs2 @@ -0,0 +1,5 @@ +void script_3558(int arg0) { + script_3632(arg0); + script_3560(arg0); + return; +} diff --git a/dumps/scripts/3559.cs2 b/dumps/scripts/3559.cs2 new file mode 100644 index 000000000..652671971 --- /dev/null +++ b/dumps/scripts/3559.cs2 @@ -0,0 +1,4 @@ +void script_3559(int arg0) { + script_3560(arg0); + return; +} diff --git a/dumps/scripts/356.cs2 b/dumps/scripts/356.cs2 new file mode 100644 index 000000000..eb8384099 --- /dev/null +++ b/dumps/scripts/356.cs2 @@ -0,0 +1,4 @@ +void script_356() { + script_304(46025850); + return; +} diff --git a/dumps/scripts/3560.cs2 b/dumps/scripts/3560.cs2 new file mode 100644 index 000000000..f6a4540b2 --- /dev/null +++ b/dumps/scripts/3560.cs2 @@ -0,0 +1,8 @@ +void script_3560(int arg0) { + if (script_3588(2) == script_3590(15)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3561.cs2 b/dumps/scripts/3561.cs2 new file mode 100644 index 000000000..be30cf247 --- /dev/null +++ b/dumps/scripts/3561.cs2 @@ -0,0 +1,5 @@ +void script_3561(int arg0) { + script_3632(arg0); + script_3563(arg0); + return; +} diff --git a/dumps/scripts/3562.cs2 b/dumps/scripts/3562.cs2 new file mode 100644 index 000000000..418ce2e09 --- /dev/null +++ b/dumps/scripts/3562.cs2 @@ -0,0 +1,4 @@ +void script_3562(int arg0) { + script_3563(arg0); + return; +} diff --git a/dumps/scripts/3563.cs2 b/dumps/scripts/3563.cs2 new file mode 100644 index 000000000..fe9632cda --- /dev/null +++ b/dumps/scripts/3563.cs2 @@ -0,0 +1,8 @@ +void script_3563(int arg0) { + if (script_3588(5) == script_3590(4)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3564.cs2 b/dumps/scripts/3564.cs2 new file mode 100644 index 000000000..bbeedf55d --- /dev/null +++ b/dumps/scripts/3564.cs2 @@ -0,0 +1,5 @@ +void script_3564(int arg0) { + script_3632(arg0); + script_3566(arg0); + return; +} diff --git a/dumps/scripts/3565.cs2 b/dumps/scripts/3565.cs2 new file mode 100644 index 000000000..8f347550f --- /dev/null +++ b/dumps/scripts/3565.cs2 @@ -0,0 +1,4 @@ +void script_3565(int arg0) { + script_3566(arg0); + return; +} diff --git a/dumps/scripts/3566.cs2 b/dumps/scripts/3566.cs2 new file mode 100644 index 000000000..177d69965 --- /dev/null +++ b/dumps/scripts/3566.cs2 @@ -0,0 +1,8 @@ +void script_3566(int arg0) { + if (script_3588(7) == script_3589(5)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3567.cs2 b/dumps/scripts/3567.cs2 new file mode 100644 index 000000000..a6712bea6 --- /dev/null +++ b/dumps/scripts/3567.cs2 @@ -0,0 +1,5 @@ +void script_3567(int arg0) { + script_3632(arg0); + script_3569(arg0); + return; +} diff --git a/dumps/scripts/3568.cs2 b/dumps/scripts/3568.cs2 new file mode 100644 index 000000000..72db0fd39 --- /dev/null +++ b/dumps/scripts/3568.cs2 @@ -0,0 +1,4 @@ +void script_3568(int arg0) { + script_3569(arg0); + return; +} diff --git a/dumps/scripts/3569.cs2 b/dumps/scripts/3569.cs2 new file mode 100644 index 000000000..d0db860e5 --- /dev/null +++ b/dumps/scripts/3569.cs2 @@ -0,0 +1,8 @@ +void script_3569(int arg0) { + if (script_3588(9) == script_3590(6)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/357.cs2 b/dumps/scripts/357.cs2 new file mode 100644 index 000000000..1f8b9658c --- /dev/null +++ b/dumps/scripts/357.cs2 @@ -0,0 +1,28 @@ +void script_357(int arg0,int arg1,int arg2) { + if (arg0 != 1) { + return; + } + switch (arg2) { + case 0: + globalint_1015 = arg1; + break; + case 1: + globalint_1016 = arg1; + break; + case 2: + globalint_1017 = arg1; + break; + case 3: + globalint_1018 = arg1; + break; + case 4: + globalint_1019 = arg1; + break; + default: + return; + } + playSoundEffect(9830, 1, 0); + cs2method404(arg2, arg1); + script_391(); + return; +} diff --git a/dumps/scripts/3570.cs2 b/dumps/scripts/3570.cs2 new file mode 100644 index 000000000..990a54c97 --- /dev/null +++ b/dumps/scripts/3570.cs2 @@ -0,0 +1,5 @@ +void script_3570(int arg0) { + script_3632(arg0); + script_3572(arg0); + return; +} diff --git a/dumps/scripts/3571.cs2 b/dumps/scripts/3571.cs2 new file mode 100644 index 000000000..136793fe5 --- /dev/null +++ b/dumps/scripts/3571.cs2 @@ -0,0 +1,4 @@ +void script_3571(int arg0) { + script_3572(arg0); + return; +} diff --git a/dumps/scripts/3572.cs2 b/dumps/scripts/3572.cs2 new file mode 100644 index 000000000..29bbbb171 --- /dev/null +++ b/dumps/scripts/3572.cs2 @@ -0,0 +1,8 @@ +void script_3572(int arg0) { + if (script_3588(12) == script_3590(13)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3573.cs2 b/dumps/scripts/3573.cs2 new file mode 100644 index 000000000..ea9f7d00b --- /dev/null +++ b/dumps/scripts/3573.cs2 @@ -0,0 +1,5 @@ +void script_3573(int arg0) { + script_3632(arg0); + script_3575(arg0); + return; +} diff --git a/dumps/scripts/3574.cs2 b/dumps/scripts/3574.cs2 new file mode 100644 index 000000000..fc0913f6b --- /dev/null +++ b/dumps/scripts/3574.cs2 @@ -0,0 +1,4 @@ +void script_3574(int arg0) { + script_3575(arg0); + return; +} diff --git a/dumps/scripts/3575.cs2 b/dumps/scripts/3575.cs2 new file mode 100644 index 000000000..efe913ed6 --- /dev/null +++ b/dumps/scripts/3575.cs2 @@ -0,0 +1,8 @@ +void script_3575(int arg0) { + if (script_3588(13) == script_3589(15)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3576.cs2 b/dumps/scripts/3576.cs2 new file mode 100644 index 000000000..d9aad62d8 --- /dev/null +++ b/dumps/scripts/3576.cs2 @@ -0,0 +1,5 @@ +void script_3576(int arg0) { + script_3632(arg0); + script_3578(arg0); + return; +} diff --git a/dumps/scripts/3577.cs2 b/dumps/scripts/3577.cs2 new file mode 100644 index 000000000..77b6fc059 --- /dev/null +++ b/dumps/scripts/3577.cs2 @@ -0,0 +1,4 @@ +void script_3577(int arg0) { + script_3578(arg0); + return; +} diff --git a/dumps/scripts/3578.cs2 b/dumps/scripts/3578.cs2 new file mode 100644 index 000000000..496d71f08 --- /dev/null +++ b/dumps/scripts/3578.cs2 @@ -0,0 +1,8 @@ +void script_3578(int arg0) { + if (script_3589(1) == script_3590(14)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3579.cs2 b/dumps/scripts/3579.cs2 new file mode 100644 index 000000000..577878e7d --- /dev/null +++ b/dumps/scripts/3579.cs2 @@ -0,0 +1,5 @@ +void script_3579(int arg0) { + script_3632(arg0); + script_3581(arg0); + return; +} diff --git a/dumps/scripts/358.cs2 b/dumps/scripts/358.cs2 new file mode 100644 index 000000000..1b3db2f16 --- /dev/null +++ b/dumps/scripts/358.cs2 @@ -0,0 +1,120 @@ +void script_358(int arg0) { + int ivar1; + int ivar2; + flow_0: + if (arg0 != 1) { + return; + } + playSoundEffect(9830, 1, 0); + bitconfig_8092 = mod(add(bitconfig_8092, 1), 8); + ivar1 = 0; + ivar2 = script_361(globalint_1010, 3); + if (ivar2 == -1) { + ivar2 = 1076; + } + SWITCH (mod(add(bitconfig_8091, bitconfig_8092), 8)) { + case 1: + GOTO flow_5 + case 2: + GOTO flow_6 + case 3: + GOTO flow_7 + case 4: + GOTO flow_8 + case 5: + GOTO flow_9 + case 6: + GOTO flow_10 + case 7: + GOTO flow_11 + } + ivar1 = getOtherCommonData(ivar2, 1187); + globalint_1016 = ivar1; + cs2method404(1, ivar1); + ivar1 = getOtherCommonData(ivar2, 1188); + globalint_1017 = ivar1; + cs2method404(2, ivar1); + ivar1 = getOtherCommonData(ivar2, 1189); + globalint_1018 = ivar1; + cs2method404(3, ivar1); + GOTO flow_12 + flow_5: + ivar1 = getOtherCommonData(ivar2, 1190); + globalint_1016 = ivar1; + cs2method404(1, ivar1); + ivar1 = getOtherCommonData(ivar2, 1191); + globalint_1017 = ivar1; + cs2method404(2, ivar1); + ivar1 = getOtherCommonData(ivar2, 1192); + globalint_1018 = ivar1; + cs2method404(3, ivar1); + GOTO flow_12 + flow_6: + ivar1 = getOtherCommonData(ivar2, 1193); + globalint_1016 = ivar1; + cs2method404(1, ivar1); + ivar1 = getOtherCommonData(ivar2, 1194); + globalint_1017 = ivar1; + cs2method404(2, ivar1); + ivar1 = getOtherCommonData(ivar2, 1195); + globalint_1018 = ivar1; + cs2method404(3, ivar1); + GOTO flow_12 + flow_7: + ivar1 = getOtherCommonData(ivar2, 1196); + globalint_1016 = ivar1; + cs2method404(1, ivar1); + ivar1 = getOtherCommonData(ivar2, 1197); + globalint_1017 = ivar1; + cs2method404(2, ivar1); + ivar1 = getOtherCommonData(ivar2, 1198); + globalint_1018 = ivar1; + cs2method404(3, ivar1); + GOTO flow_12 + flow_8: + ivar1 = getOtherCommonData(ivar2, 1199); + globalint_1016 = ivar1; + cs2method404(1, ivar1); + ivar1 = getOtherCommonData(ivar2, 1200); + globalint_1017 = ivar1; + cs2method404(2, ivar1); + ivar1 = getOtherCommonData(ivar2, 1201); + globalint_1018 = ivar1; + cs2method404(3, ivar1); + GOTO flow_12 + flow_9: + ivar1 = getOtherCommonData(ivar2, 1202); + globalint_1016 = ivar1; + cs2method404(1, ivar1); + ivar1 = getOtherCommonData(ivar2, 1203); + globalint_1017 = ivar1; + cs2method404(2, ivar1); + ivar1 = getOtherCommonData(ivar2, 1204); + globalint_1018 = ivar1; + cs2method404(3, ivar1); + GOTO flow_12 + flow_10: + ivar1 = getOtherCommonData(ivar2, 1205); + globalint_1016 = ivar1; + cs2method404(1, ivar1); + ivar1 = getOtherCommonData(ivar2, 1206); + globalint_1017 = ivar1; + cs2method404(2, ivar1); + ivar1 = getOtherCommonData(ivar2, 1207); + globalint_1018 = ivar1; + cs2method404(3, ivar1); + GOTO flow_12 + flow_11: + ivar1 = getOtherCommonData(ivar2, 1208); + globalint_1016 = ivar1; + cs2method404(1, ivar1); + ivar1 = getOtherCommonData(ivar2, 1209); + globalint_1017 = ivar1; + cs2method404(2, ivar1); + ivar1 = getOtherCommonData(ivar2, 1210); + globalint_1018 = ivar1; + cs2method404(3, ivar1); + flow_12: + script_391(); + return; +} diff --git a/dumps/scripts/3580.cs2 b/dumps/scripts/3580.cs2 new file mode 100644 index 000000000..7df9bb7d5 --- /dev/null +++ b/dumps/scripts/3580.cs2 @@ -0,0 +1,4 @@ +void script_3580(int arg0) { + script_3581(arg0); + return; +} diff --git a/dumps/scripts/3581.cs2 b/dumps/scripts/3581.cs2 new file mode 100644 index 000000000..74fa91507 --- /dev/null +++ b/dumps/scripts/3581.cs2 @@ -0,0 +1,8 @@ +void script_3581(int arg0) { + if (script_3589(4) == script_3590(5)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3582.cs2 b/dumps/scripts/3582.cs2 new file mode 100644 index 000000000..7b5d4dc9b --- /dev/null +++ b/dumps/scripts/3582.cs2 @@ -0,0 +1,5 @@ +void script_3582(int arg0) { + script_3632(arg0); + script_3584(arg0); + return; +} diff --git a/dumps/scripts/3583.cs2 b/dumps/scripts/3583.cs2 new file mode 100644 index 000000000..18246243d --- /dev/null +++ b/dumps/scripts/3583.cs2 @@ -0,0 +1,4 @@ +void script_3583(int arg0) { + script_3584(arg0); + return; +} diff --git a/dumps/scripts/3584.cs2 b/dumps/scripts/3584.cs2 new file mode 100644 index 000000000..29dc26656 --- /dev/null +++ b/dumps/scripts/3584.cs2 @@ -0,0 +1,8 @@ +void script_3584(int arg0) { + if (script_3589(10) == script_3590(7)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3585.cs2 b/dumps/scripts/3585.cs2 new file mode 100644 index 000000000..c4a62b9c1 --- /dev/null +++ b/dumps/scripts/3585.cs2 @@ -0,0 +1,5 @@ +void script_3585(int arg0) { + script_3632(arg0); + script_3587(arg0); + return; +} diff --git a/dumps/scripts/3586.cs2 b/dumps/scripts/3586.cs2 new file mode 100644 index 000000000..aa4b94138 --- /dev/null +++ b/dumps/scripts/3586.cs2 @@ -0,0 +1,4 @@ +void script_3586(int arg0) { + script_3587(arg0); + return; +} diff --git a/dumps/scripts/3587.cs2 b/dumps/scripts/3587.cs2 new file mode 100644 index 000000000..3a7a14b95 --- /dev/null +++ b/dumps/scripts/3587.cs2 @@ -0,0 +1,8 @@ +void script_3587(int arg0) { + if (script_3589(13) == script_3590(12)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3588.cs2 b/dumps/scripts/3588.cs2 new file mode 100644 index 000000000..b72e6dd08 --- /dev/null +++ b/dumps/scripts/3588.cs2 @@ -0,0 +1,3 @@ +int script_3588(int arg0) { + return cs2method_3408(105, 105, script_3591(bitconfig_7392), mod(add(arg0, bitconfig_7388), getCommonDefinitionSize(script_3591(bitconfig_7392)))); +} diff --git a/dumps/scripts/3589.cs2 b/dumps/scripts/3589.cs2 new file mode 100644 index 000000000..91fc686be --- /dev/null +++ b/dumps/scripts/3589.cs2 @@ -0,0 +1,3 @@ +int script_3589(int arg0) { + return cs2method_3408(105, 105, script_3592(bitconfig_7392), mod(add(arg0, bitconfig_7389), getCommonDefinitionSize(script_3592(bitconfig_7392)))); +} diff --git a/dumps/scripts/359.cs2 b/dumps/scripts/359.cs2 new file mode 100644 index 000000000..ca6762db6 --- /dev/null +++ b/dumps/scripts/359.cs2 @@ -0,0 +1,113 @@ +void script_359(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int stack_dump0; + cs2func_script_360_struct(3,0,0) structdump_1; + int stack_dump2; + ivar2 = -1; + if (((boolean)arg1)) { + cs2method403(2, -1); + cs2method403(3, -1); + cs2method403(4, -1); + cs2method403(5, -1); + cs2method403(6, -1); + cs2method403(8, -1); + cs2method403(14, -1); + cs2method403(15, -1); + globalint_1009 = -1; + ivar2 = getOtherCommonData(arg0, 1182); + if (ivar2 != -1) { + globalint_1010 = ivar2; + cs2method403(9, ivar2); + } + ivar2 = getOtherCommonData(arg0, 1183); + globalint_1011 = ivar2; + cs2method403(10, ivar2); + ivar2 = getOtherCommonData(arg0, 1184); + if (ivar2 != -1) { + globalint_1012 = ivar2; + cs2method403(11, ivar2); + } + ivar2 = getOtherCommonData(arg0, 1185); + if (ivar2 != -1) { + globalint_1013 = ivar2; + cs2method403(12, ivar2); + } + ivar2 = getOtherCommonData(arg0, 1186); + if (ivar2 != -1) { + globalint_1014 = ivar2; + cs2method403(13, ivar2); + } + } else { + cs2method403(9, -1); + cs2method403(10, -1); + cs2method403(11, -1); + cs2method403(12, -1); + cs2method403(13, -1); + cs2method403(14, -1); + cs2method403(15, -1); + ivar2 = getOtherCommonData(arg0, 1182); + if (ivar2 != -1) { + globalint_1010 = ivar2; + cs2method403(2, ivar2); + } + ivar2 = getOtherCommonData(arg0, 1183); + globalint_1011 = ivar2; + cs2method403(3, ivar2); + ivar2 = getOtherCommonData(arg0, 1184); + if (ivar2 != -1) { + globalint_1012 = ivar2; + cs2method403(4, ivar2); + } + ivar2 = getOtherCommonData(arg0, 1185); + if (ivar2 != -1) { + globalint_1013 = ivar2; + cs2method403(5, ivar2); + } + ivar2 = getOtherCommonData(arg0, 1186); + if (ivar2 != -1) { + cs2method403(6, ivar2); + globalint_1014 = ivar2; + } + } + stack_dump0 = arg0; + structdump_1 = script_360(stack_dump0); + stack_dump0 = structdump_1.intpart_0; + stack_dump2 = structdump_1.intpart_1; + globalint_1018 = structdump_1.intpart_2; + stack_dump0 = stack_dump0; + globalint_1017 = stack_dump2; + globalint_1016 = stack_dump0; + cs2method404(1, globalint_1016); + cs2method404(2, globalint_1017); + cs2method404(3, globalint_1018); + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + if (globalint_86 != 0) { + ivar4 = cs2method_3408(105, 74, 3278, subtract(globalint_197, 1)); + if (ivar4 != -1) { + ivar3 = getOtherCommonData(ivar4, 1163); + if (ivar3 != -1) { + if (getItemContainerLength(ivar3) >= 2) { + ivar5 = getItemIdInSlot(ivar3, 1); + } + if (getItemContainerLength(ivar3) >= 3) { + ivar6 = getItemIdInSlot(ivar3, 2); + } + } + } + script_392(ivar4, arg1); + } else { + script_392(-1, arg1); + } + cs2method411(2, 19713); + cs2method411(3, ivar5); + cs2method411(5, ivar6); + bitconfig_8092 = 0; + return; +} diff --git a/dumps/scripts/3590.cs2 b/dumps/scripts/3590.cs2 new file mode 100644 index 000000000..6653db9ed --- /dev/null +++ b/dumps/scripts/3590.cs2 @@ -0,0 +1,3 @@ +int script_3590(int arg0) { + return cs2method_3408(105, 105, script_3593(bitconfig_7392), mod(add(arg0, bitconfig_7390), getCommonDefinitionSize(script_3593(bitconfig_7392)))); +} diff --git a/dumps/scripts/3591.cs2 b/dumps/scripts/3591.cs2 new file mode 100644 index 000000000..a0ab233d2 --- /dev/null +++ b/dumps/scripts/3591.cs2 @@ -0,0 +1,22 @@ +int script_3591(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3140; + flow_1: + return 3143; + flow_2: + return 3146; + flow_3: + return 3149; + flow_4: + return 3152; +} diff --git a/dumps/scripts/3592.cs2 b/dumps/scripts/3592.cs2 new file mode 100644 index 000000000..3c6eba877 --- /dev/null +++ b/dumps/scripts/3592.cs2 @@ -0,0 +1,22 @@ +int script_3592(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3141; + flow_1: + return 3144; + flow_2: + return 3147; + flow_3: + return 3150; + flow_4: + return 3153; +} diff --git a/dumps/scripts/3593.cs2 b/dumps/scripts/3593.cs2 new file mode 100644 index 000000000..64797f0f6 --- /dev/null +++ b/dumps/scripts/3593.cs2 @@ -0,0 +1,22 @@ +int script_3593(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3142; + flow_1: + return 3145; + flow_2: + return 3148; + flow_3: + return 3151; + flow_4: + return 3154; +} diff --git a/dumps/scripts/3594.cs2 b/dumps/scripts/3594.cs2 new file mode 100644 index 000000000..1143399e0 --- /dev/null +++ b/dumps/scripts/3594.cs2 @@ -0,0 +1,9 @@ +void script_3594() { + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3619(9), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1002,161)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3621(6), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1002,162)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3619(14), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1002,163)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3620(1), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1002,164)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3620(9), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1002,165)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3621(1), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1002,166)); + return; +} diff --git a/dumps/scripts/3595.cs2 b/dumps/scripts/3595.cs2 new file mode 100644 index 000000000..b882045c3 --- /dev/null +++ b/dumps/scripts/3595.cs2 @@ -0,0 +1,4 @@ +void script_3595(int arg0,int arg1,int arg2) { + script_3625(3171, 3172, 3173, script_3622(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3596.cs2 b/dumps/scripts/3596.cs2 new file mode 100644 index 000000000..35af1979f --- /dev/null +++ b/dumps/scripts/3596.cs2 @@ -0,0 +1,4 @@ +void script_3596(int arg0,int arg1,int arg2) { + script_3625(3174, 3175, 3176, script_3623(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3597.cs2 b/dumps/scripts/3597.cs2 new file mode 100644 index 000000000..923d39922 --- /dev/null +++ b/dumps/scripts/3597.cs2 @@ -0,0 +1,4 @@ +void script_3597(int arg0,int arg1,int arg2) { + script_3625(3177, 3178, 3179, script_3624(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3598.cs2 b/dumps/scripts/3598.cs2 new file mode 100644 index 000000000..5148b1b3b --- /dev/null +++ b/dumps/scripts/3598.cs2 @@ -0,0 +1,4 @@ +void script_3598(int arg0,int arg1,int arg2) { + script_3626(3171, 3172, 3173, script_3622(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3599.cs2 b/dumps/scripts/3599.cs2 new file mode 100644 index 000000000..92cc2cc53 --- /dev/null +++ b/dumps/scripts/3599.cs2 @@ -0,0 +1,4 @@ +void script_3599(int arg0,int arg1,int arg2) { + script_3626(3174, 3175, 3176, script_3623(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/36.cs2 b/dumps/scripts/36.cs2 new file mode 100644 index 000000000..ff98f6ab7 --- /dev/null +++ b/dumps/scripts/36.cs2 @@ -0,0 +1,19 @@ +void script_36(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = cs2method2601(new WidgetPointer(arg1)); + switch (arg1) { + case 38666248: + if (arg2 > 0) { + ivar3 = script_4754(arg1, ivar3, 0); + } else { + ivar3 = script_4754(arg1, ivar3, 1); + } + break; + default: + ivar3 = add(ivar3, multiply(arg2, 45)); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + script_37(arg0, arg1, ivar3, 1); + } + return; +} diff --git a/dumps/scripts/360.cs2 b/dumps/scripts/360.cs2 new file mode 100644 index 000000000..177e68b3e --- /dev/null +++ b/dumps/scripts/360.cs2 @@ -0,0 +1,34 @@ +cs2func_script_360_struct(3,0,0) script_360(int arg0) { + flow_0: + SWITCH (bitconfig_8091) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + } + return newstruct cs2func_script_360_struct(getOtherCommonData(arg0, 1187), getOtherCommonData(arg0, 1188), getOtherCommonData(arg0, 1189)); + flow_1: + return newstruct cs2func_script_360_struct(getOtherCommonData(arg0, 1190), getOtherCommonData(arg0, 1191), getOtherCommonData(arg0, 1192)); + flow_2: + return newstruct cs2func_script_360_struct(getOtherCommonData(arg0, 1193), getOtherCommonData(arg0, 1194), getOtherCommonData(arg0, 1195)); + flow_3: + return newstruct cs2func_script_360_struct(getOtherCommonData(arg0, 1196), getOtherCommonData(arg0, 1197), getOtherCommonData(arg0, 1198)); + flow_4: + return newstruct cs2func_script_360_struct(getOtherCommonData(arg0, 1199), getOtherCommonData(arg0, 1200), getOtherCommonData(arg0, 1201)); + flow_5: + return newstruct cs2func_script_360_struct(getOtherCommonData(arg0, 1202), getOtherCommonData(arg0, 1203), getOtherCommonData(arg0, 1204)); + flow_6: + return newstruct cs2func_script_360_struct(getOtherCommonData(arg0, 1205), getOtherCommonData(arg0, 1206), getOtherCommonData(arg0, 1207)); + flow_7: + return newstruct cs2func_script_360_struct(getOtherCommonData(arg0, 1208), getOtherCommonData(arg0, 1209), getOtherCommonData(arg0, 1210)); +} diff --git a/dumps/scripts/3600.cs2 b/dumps/scripts/3600.cs2 new file mode 100644 index 000000000..cfbce95b7 --- /dev/null +++ b/dumps/scripts/3600.cs2 @@ -0,0 +1,4 @@ +void script_3600(int arg0,int arg1,int arg2) { + script_3626(3177, 3178, 3179, script_3624(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3601.cs2 b/dumps/scripts/3601.cs2 new file mode 100644 index 000000000..313ee5eb0 --- /dev/null +++ b/dumps/scripts/3601.cs2 @@ -0,0 +1,5 @@ +void script_3601(int arg0) { + script_3632(arg0); + script_3603(arg0); + return; +} diff --git a/dumps/scripts/3602.cs2 b/dumps/scripts/3602.cs2 new file mode 100644 index 000000000..88502cd5b --- /dev/null +++ b/dumps/scripts/3602.cs2 @@ -0,0 +1,4 @@ +void script_3602(int arg0) { + script_3603(arg0); + return; +} diff --git a/dumps/scripts/3603.cs2 b/dumps/scripts/3603.cs2 new file mode 100644 index 000000000..2a9fe59db --- /dev/null +++ b/dumps/scripts/3603.cs2 @@ -0,0 +1,8 @@ +void script_3603(int arg0) { + if (script_3619(9) == script_3620(7)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3604.cs2 b/dumps/scripts/3604.cs2 new file mode 100644 index 000000000..b32495878 --- /dev/null +++ b/dumps/scripts/3604.cs2 @@ -0,0 +1,5 @@ +void script_3604(int arg0) { + script_3632(arg0); + script_3606(arg0); + return; +} diff --git a/dumps/scripts/3605.cs2 b/dumps/scripts/3605.cs2 new file mode 100644 index 000000000..aef489cd4 --- /dev/null +++ b/dumps/scripts/3605.cs2 @@ -0,0 +1,4 @@ +void script_3605(int arg0) { + script_3606(arg0); + return; +} diff --git a/dumps/scripts/3606.cs2 b/dumps/scripts/3606.cs2 new file mode 100644 index 000000000..105ac1fa1 --- /dev/null +++ b/dumps/scripts/3606.cs2 @@ -0,0 +1,8 @@ +void script_3606(int arg0) { + if (script_3619(10) == script_3621(6)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3607.cs2 b/dumps/scripts/3607.cs2 new file mode 100644 index 000000000..29819a79b --- /dev/null +++ b/dumps/scripts/3607.cs2 @@ -0,0 +1,5 @@ +void script_3607(int arg0) { + script_3632(arg0); + script_3609(arg0); + return; +} diff --git a/dumps/scripts/3608.cs2 b/dumps/scripts/3608.cs2 new file mode 100644 index 000000000..c5067953a --- /dev/null +++ b/dumps/scripts/3608.cs2 @@ -0,0 +1,4 @@ +void script_3608(int arg0) { + script_3609(arg0); + return; +} diff --git a/dumps/scripts/3609.cs2 b/dumps/scripts/3609.cs2 new file mode 100644 index 000000000..2f80aa852 --- /dev/null +++ b/dumps/scripts/3609.cs2 @@ -0,0 +1,8 @@ +void script_3609(int arg0) { + if (script_3619(14) == script_3621(2)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/361.cs2 b/dumps/scripts/361.cs2 new file mode 100644 index 000000000..824659d76 --- /dev/null +++ b/dumps/scripts/361.cs2 @@ -0,0 +1,49 @@ +int script_361(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar2 = script_734(((int)IsFemale())); + ivar3 = subtract(getCommonDefinitionSize(3278), 1); + ivar4 = -1; + ivar5 = 0; + ivar6 = -1; + while (ivar3 >= 0) { + ivar4 = cs2method_3408(105, 74, 3278, ivar3); + if (ivar4 != -1) { + ivar5 = 0; + ivar6 = script_384(0, ivar4, ivar2); + while (ivar6 != -1) { + switch (arg1) { + case 3: + if (getOtherCommonData(ivar6, 1182) == arg0) { + return ivar6; + } + break; + case 4: + if (getOtherCommonData(ivar6, 1183) == arg0) { + return ivar6; + } + break; + case 5: + if (getOtherCommonData(ivar6, 1184) == arg0) { + return ivar6; + } + break; + case 6: + if (getOtherCommonData(ivar6, 1185) == arg0) { + return ivar6; + } + break; + default: + return -1; + } + ivar5 = add(ivar5, 1); + ivar6 = script_384(ivar5, ivar4, ivar2); + } + } + ivar3 = subtract(ivar3, 1); + } + return -1; +} diff --git a/dumps/scripts/3610.cs2 b/dumps/scripts/3610.cs2 new file mode 100644 index 000000000..6c552a3c4 --- /dev/null +++ b/dumps/scripts/3610.cs2 @@ -0,0 +1,5 @@ +void script_3610(int arg0) { + script_3632(arg0); + script_3612(arg0); + return; +} diff --git a/dumps/scripts/3611.cs2 b/dumps/scripts/3611.cs2 new file mode 100644 index 000000000..a9a9d21bc --- /dev/null +++ b/dumps/scripts/3611.cs2 @@ -0,0 +1,4 @@ +void script_3611(int arg0) { + script_3612(arg0); + return; +} diff --git a/dumps/scripts/3612.cs2 b/dumps/scripts/3612.cs2 new file mode 100644 index 000000000..4519e82cb --- /dev/null +++ b/dumps/scripts/3612.cs2 @@ -0,0 +1,8 @@ +void script_3612(int arg0) { + if (script_3619(15) == script_3620(1)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3613.cs2 b/dumps/scripts/3613.cs2 new file mode 100644 index 000000000..1060e9f6a --- /dev/null +++ b/dumps/scripts/3613.cs2 @@ -0,0 +1,5 @@ +void script_3613(int arg0) { + script_3632(arg0); + script_3615(arg0); + return; +} diff --git a/dumps/scripts/3614.cs2 b/dumps/scripts/3614.cs2 new file mode 100644 index 000000000..5e0f8373e --- /dev/null +++ b/dumps/scripts/3614.cs2 @@ -0,0 +1,4 @@ +void script_3614(int arg0) { + script_3615(arg0); + return; +} diff --git a/dumps/scripts/3615.cs2 b/dumps/scripts/3615.cs2 new file mode 100644 index 000000000..5b95419dc --- /dev/null +++ b/dumps/scripts/3615.cs2 @@ -0,0 +1,8 @@ +void script_3615(int arg0) { + if (script_3620(9) == script_3621(7)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3616.cs2 b/dumps/scripts/3616.cs2 new file mode 100644 index 000000000..301cefecc --- /dev/null +++ b/dumps/scripts/3616.cs2 @@ -0,0 +1,5 @@ +void script_3616(int arg0) { + script_3632(arg0); + script_3618(arg0); + return; +} diff --git a/dumps/scripts/3617.cs2 b/dumps/scripts/3617.cs2 new file mode 100644 index 000000000..54248c5f0 --- /dev/null +++ b/dumps/scripts/3617.cs2 @@ -0,0 +1,4 @@ +void script_3617(int arg0) { + script_3618(arg0); + return; +} diff --git a/dumps/scripts/3618.cs2 b/dumps/scripts/3618.cs2 new file mode 100644 index 000000000..082d6a88e --- /dev/null +++ b/dumps/scripts/3618.cs2 @@ -0,0 +1,8 @@ +void script_3618(int arg0) { + if (script_3620(15) == script_3621(1)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3619.cs2 b/dumps/scripts/3619.cs2 new file mode 100644 index 000000000..432aa60e8 --- /dev/null +++ b/dumps/scripts/3619.cs2 @@ -0,0 +1,3 @@ +int script_3619(int arg0) { + return cs2method_3408(105, 105, script_3622(bitconfig_7392), mod(add(arg0, bitconfig_7388), getCommonDefinitionSize(script_3622(bitconfig_7392)))); +} diff --git a/dumps/scripts/362.cs2 b/dumps/scripts/362.cs2 new file mode 100644 index 000000000..330ea304b --- /dev/null +++ b/dumps/scripts/362.cs2 @@ -0,0 +1,13 @@ +void script_362(int arg0,int arg1,string arg2) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + setWidgetSize(arg1, getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(468); + setWidgetRGB(new Color(36, 27, 18)); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(false); + setWidgetText(arg2); + return; +} diff --git a/dumps/scripts/3620.cs2 b/dumps/scripts/3620.cs2 new file mode 100644 index 000000000..c52035c13 --- /dev/null +++ b/dumps/scripts/3620.cs2 @@ -0,0 +1,3 @@ +int script_3620(int arg0) { + return cs2method_3408(105, 105, script_3623(bitconfig_7392), mod(add(arg0, bitconfig_7389), getCommonDefinitionSize(script_3623(bitconfig_7392)))); +} diff --git a/dumps/scripts/3621.cs2 b/dumps/scripts/3621.cs2 new file mode 100644 index 000000000..c3a056dd1 --- /dev/null +++ b/dumps/scripts/3621.cs2 @@ -0,0 +1,3 @@ +int script_3621(int arg0) { + return cs2method_3408(105, 105, script_3624(bitconfig_7392), mod(add(arg0, bitconfig_7390), getCommonDefinitionSize(script_3624(bitconfig_7392)))); +} diff --git a/dumps/scripts/3622.cs2 b/dumps/scripts/3622.cs2 new file mode 100644 index 000000000..99130314b --- /dev/null +++ b/dumps/scripts/3622.cs2 @@ -0,0 +1,22 @@ +int script_3622(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3155; + flow_1: + return 3158; + flow_2: + return 3161; + flow_3: + return 3164; + flow_4: + return 3167; +} diff --git a/dumps/scripts/3623.cs2 b/dumps/scripts/3623.cs2 new file mode 100644 index 000000000..7984ce21c --- /dev/null +++ b/dumps/scripts/3623.cs2 @@ -0,0 +1,22 @@ +int script_3623(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3156; + flow_1: + return 3159; + flow_2: + return 3162; + flow_3: + return 3165; + flow_4: + return 3168; +} diff --git a/dumps/scripts/3624.cs2 b/dumps/scripts/3624.cs2 new file mode 100644 index 000000000..43ee04b8a --- /dev/null +++ b/dumps/scripts/3624.cs2 @@ -0,0 +1,22 @@ +int script_3624(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3157; + flow_1: + return 3160; + flow_2: + return 3163; + flow_3: + return 3166; + flow_4: + return 3169; +} diff --git a/dumps/scripts/3625.cs2 b/dumps/scripts/3625.cs2 new file mode 100644 index 000000000..b6367e753 --- /dev/null +++ b/dumps/scripts/3625.cs2 @@ -0,0 +1,39 @@ +void script_3625(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int stack_dump0; + ivar7 = 0; + ivar8 = getCommonDefinitionSize(arg0); + ivar9 = -1; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + playSoundEffect(9506, 1, 0); + while (ivar7 < ivar8) { + ivar9 = ((int)cs2method_3408(105, 73, arg0, ivar7)); + ivar10 = cs2method_3408(105, 105, arg3, mod(add(ivar7, arg4), ivar8)); + ivar13 = mod(add(ivar10, arg5), getCommonDefinitionSize(3170)); + if (setWidgetRegister(new WidgetPointer(ivar9))) { + stack_dump0 = 1103; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + setScriptCallOnGameloop(3627, new WidgetPointer(ivar9), ivar11, ivar12, multiply(25, cs2method_3408(105, 105, arg1, ivar7)), multiply(25, cs2method_3408(105, 105, arg2, ivar7)), cs2method_3408(105, 79, 3170, ivar13), ivar13, 0, arg6, "IiiiiOiii", new WidgetPointer(ivar9)); + ivar7 = add(ivar7, 1); + } + return; +} diff --git a/dumps/scripts/3626.cs2 b/dumps/scripts/3626.cs2 new file mode 100644 index 000000000..494987774 --- /dev/null +++ b/dumps/scripts/3626.cs2 @@ -0,0 +1,39 @@ +void script_3626(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int stack_dump0; + ivar7 = 0; + ivar8 = getCommonDefinitionSize(arg0); + ivar9 = -1; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + playSoundEffect(9506, 1, 0); + while (ivar7 < ivar8) { + ivar9 = ((int)cs2method_3408(105, 73, arg0, ivar7)); + ivar10 = cs2method_3408(105, 105, arg3, mod(add(ivar7, arg4), ivar8)); + ivar13 = mod(add(ivar10, arg5), getCommonDefinitionSize(3170)); + if (setWidgetRegister(new WidgetPointer(ivar9))) { + stack_dump0 = 1103; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + setScriptCallOnGameloop(3628, new WidgetPointer(ivar9), ivar11, ivar12, multiply(25, cs2method_3408(105, 105, arg1, ivar7)), multiply(25, cs2method_3408(105, 105, arg2, ivar7)), cs2method_3408(105, 79, 3170, ivar13), ivar13, 0, arg6, "IiiiiOiii", new WidgetPointer(ivar9)); + ivar7 = add(ivar7, 1); + } + return; +} diff --git a/dumps/scripts/3627.cs2 b/dumps/scripts/3627.cs2 new file mode 100644 index 000000000..a8ccf6793 --- /dev/null +++ b/dumps/scripts/3627.cs2 @@ -0,0 +1,15 @@ +void script_3627(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + arg7 = add(arg7, 1); + if (arg7 == arg8) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetPosition(arg1, arg2, 0, 0, new WidgetPointer(arg0)); + setItemOnWidgetMethod2200(arg5, -1, new WidgetPointer(arg0)); + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetIntegerNode(1103, arg6); + } + return; + } + setWidgetPosition(add(arg1, divide(multiply(arg3, arg7), arg8)), add(arg2, divide(multiply(arg4, arg7), arg8)), 0, 0, new WidgetPointer(arg0)); + setScriptCallOnGameloop(3627, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, "IiiiiOiii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3628.cs2 b/dumps/scripts/3628.cs2 new file mode 100644 index 000000000..6c4ce3562 --- /dev/null +++ b/dumps/scripts/3628.cs2 @@ -0,0 +1,15 @@ +void script_3628(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + arg7 = add(arg7, 1); + if (((boolean)arg7)) { + setWidgetPosition(add(arg1, arg3), add(arg2, arg4), 0, 0, new WidgetPointer(arg0)); + setItemOnWidgetMethod2200(arg5, -1, new WidgetPointer(arg0)); + } else { + setWidgetPosition(add(arg1, divide(multiply(arg3, subtract(arg8, arg7)), arg8)), add(arg2, divide(multiply(arg4, subtract(arg8, arg7)), arg8)), 0, 0, new WidgetPointer(arg0)); + } + if (arg7 == arg8) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(3628, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, "IiiiiOiii", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3629.cs2 b/dumps/scripts/3629.cs2 new file mode 100644 index 000000000..64819b1b5 --- /dev/null +++ b/dumps/scripts/3629.cs2 @@ -0,0 +1,5 @@ +void script_3629(int arg0,int arg1,int arg2) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetRGB(new Color(arg2), new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/363.cs2 b/dumps/scripts/363.cs2 new file mode 100644 index 000000000..d8b6343f6 --- /dev/null +++ b/dumps/scripts/363.cs2 @@ -0,0 +1,156 @@ +void script_363(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,string arg9,string arg10) { + int ivar9; + int ivar10; + int ivar11; + int ivar12; + deleteAllExtraChilds(new WidgetPointer(arg0)); + if ((arg3 == -1) && (strLength(arg9) <= 0)) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg0)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(arg0)); + ivar9 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar10 = subtract(ivar9, 10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, ivar10, 1, 0); + setWidgetPosition(0, 5, 1, 0); + cs2method1107(1); + setWidgetSprite(3413); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 14, 1, 0); + setWidgetPosition(0, 0, 1, 0); + cs2method1107(1); + setWidgetSprite(3412); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 14, 1, 0); + setWidgetPosition(0, subtract(ivar9, getWidgetActualHeight()), 1, 0); + cs2method1107(1); + setWidgetSprite(3411); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, ivar10, 0, 0); + setWidgetPosition(0, 5, 0, 0); + cs2method1107(1); + setWidgetSprite(3409); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, ivar10, 0, 0); + setWidgetPosition(0, 5, 2, 0); + cs2method1107(1); + setWidgetSprite(3410); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(3405); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(3406); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, subtract(ivar9, getWidgetActualHeight()), 0, 0); + setWidgetSprite(3407); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, subtract(ivar9, getWidgetActualHeight()), 2, 0); + setWidgetSprite(3408); + ivar11 = 0; + if (arg3 != -1) { + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(arg5, arg6, 0, 0); + if (arg7 == 2) { + ivar11 = subtract(ivar9, add(arg6, 2)); + } else { + ivar11 = divide(subtract(ivar9, arg6), 2); + } + setWidgetPosition(0, ivar11, 1, 0); + cs2method1107(0); + setWidgetSprite(arg3); + if (strLength(arg9) > 0) { + setWidgetContextMenuOption(1, new WidgetPointer(arg0), arg9); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + if (add(multiply(getLineCount(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 6), 3793, arg9), 12), 5) <= ivar11) { + setWidgetSize(6, ivar11, 1, 0); + setWidgetSize(6, ivar11, 1, 0); + setWidgetTextAlignment(1, 1, 12); + setWidgetTextAlignment(1, 1, 12); + setWidgetPosition(1, 1, 1, 0); + setWidgetPosition(0, 0, 1, 0); + } else { + setWidgetSize(6, 10, 1, 1); + setWidgetSize(6, 10, 1, 1); + setWidgetTextAlignment(1, 0, 12); + setWidgetTextAlignment(1, 0, 12); + setWidgetPosition(1, 1, 1, 1); + setWidgetPosition(0, 0, 1, 1); + } + setWidgetFont(3793); + setWidgetFont(3793); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetRGB(new Color(63, 16, 16)); + setWidgetUnknownBoolean(false); + setWidgetUnknownBoolean(false); + setWidgetText(arg9); + setWidgetText(arg9); + } + } else { + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(1, 1, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetTextAlignment(1, 1, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(3793); + setWidgetFont(3793); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetRGB(new Color(63, 16, 16)); + setWidgetUnknownBoolean(false); + setWidgetUnknownBoolean(false); + setWidgetText(arg9); + setWidgetText(arg9); + } + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 4, 1, 0); + setWidgetPosition(0, 0, 1, 0); + ivar12 = getWidgetCustomChildArrayIndex(); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 4, 1, 0); + setWidgetPosition(0, subtract(ivar9, getWidgetActualHeight()), 1, 0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(3, ivar10, 0, 0); + setWidgetPosition(0, 5, 0, 0); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(3, ivar10, 0, 0); + setWidgetPosition(0, 5, 2, 0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(16, 16, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(16, 16, 0, 0); + setWidgetPosition(0, 0, 2, 0); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(16, 16, 0, 0); + setWidgetPosition(0, subtract(ivar9, getWidgetActualHeight()), 0, 0); + setWidgetHFlip(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(16, 16, 0, 0); + setWidgetPosition(0, subtract(ivar9, getWidgetActualHeight()), 2, 0); + setWidgetVFlip(1); + if (((boolean)arg8)) { + script_365(arg0, ivar12, 2); + setScriptCallOnMouseOver(366, new WidgetPointer(-1,65535), arg1, arg2, ivar12, ivar9, 1, arg4, new WidgetPointer(-32768,3), arg10, -2147483647, "Iigii11Isi", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(366, new WidgetPointer(-1,65535), arg1, arg2, ivar12, ivar9, 0, arg4, new WidgetPointer(-32768,3), arg10, -1, "Iigii11Isi", new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } else { + script_365(arg0, ivar12, 0); + setScriptCallOnMouseOver(366, new WidgetPointer(arg0), arg1, arg2, ivar12, ivar9, 1, arg4, new WidgetPointer(-32768,3), arg10, -2147483647, "Iigii11Isi", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(366, new WidgetPointer(arg0), arg1, arg2, ivar12, ivar9, 0, arg4, new WidgetPointer(-32768,3), arg10, -1, "Iigii11Isi", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3630.cs2 b/dumps/scripts/3630.cs2 new file mode 100644 index 000000000..d2149a790 --- /dev/null +++ b/dumps/scripts/3630.cs2 @@ -0,0 +1,5 @@ +void script_3630(int arg0,int arg1,int arg2) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetRGB(new Color(arg2), new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/3631.cs2 b/dumps/scripts/3631.cs2 new file mode 100644 index 000000000..0f9ce62a7 --- /dev/null +++ b/dumps/scripts/3631.cs2 @@ -0,0 +1,4 @@ +void script_3631(int arg0) { + script_3632(arg0); + return; +} diff --git a/dumps/scripts/3632.cs2 b/dumps/scripts/3632.cs2 new file mode 100644 index 000000000..3f6318919 --- /dev/null +++ b/dumps/scripts/3632.cs2 @@ -0,0 +1,7 @@ +void script_3632(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetIntegerNode(1101, getWidgetActualX()); + setWidgetIntegerNode(1102, getWidgetActualY()); + } + return; +} diff --git a/dumps/scripts/3633.cs2 b/dumps/scripts/3633.cs2 new file mode 100644 index 000000000..1679fc189 --- /dev/null +++ b/dumps/scripts/3633.cs2 @@ -0,0 +1,19 @@ +void script_3633(int arg0) { + int stack_dump0; + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetRGB(new Color(136, 255, 136), new WidgetPointer(arg0)); + setWidgetSize(31, 31, 0, 0, new WidgetPointer(arg0)); + stack_dump0 = 1101; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/3634.cs2 b/dumps/scripts/3634.cs2 new file mode 100644 index 000000000..d2e7c4948 --- /dev/null +++ b/dumps/scripts/3634.cs2 @@ -0,0 +1,19 @@ +void script_3634(int arg0) { + int stack_dump0; + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetRGB(new Color(204, 0, 0), new WidgetPointer(arg0)); + setWidgetSize(27, 27, 0, 0, new WidgetPointer(arg0)); + stack_dump0 = 1101; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/3635.cs2 b/dumps/scripts/3635.cs2 new file mode 100644 index 000000000..f2dd89d7f --- /dev/null +++ b/dumps/scripts/3635.cs2 @@ -0,0 +1,11 @@ +void script_3635() { + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3667(14), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1001,171)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3666(2), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1001,172)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3668(12), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1001,173)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3666(5), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1001,174)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3668(5), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1001,175)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3666(10), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1001,176)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3667(5), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1001,177)); + setItemOnWidgetMethod2200(cs2method_3408(105, 79, 3170, mod(add(script_3666(13), bitconfig_7387), getCommonDefinitionSize(3170))), -1, new WidgetPointer(1001,178)); + return; +} diff --git a/dumps/scripts/3636.cs2 b/dumps/scripts/3636.cs2 new file mode 100644 index 000000000..4cecf198f --- /dev/null +++ b/dumps/scripts/3636.cs2 @@ -0,0 +1,4 @@ +void script_3636(int arg0,int arg1,int arg2) { + script_3625(3189, 3190, 3191, script_3669(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3637.cs2 b/dumps/scripts/3637.cs2 new file mode 100644 index 000000000..8fa6a65fc --- /dev/null +++ b/dumps/scripts/3637.cs2 @@ -0,0 +1,4 @@ +void script_3637(int arg0,int arg1,int arg2) { + script_3625(3192, 3193, 3194, script_3670(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3638.cs2 b/dumps/scripts/3638.cs2 new file mode 100644 index 000000000..79fb10b3d --- /dev/null +++ b/dumps/scripts/3638.cs2 @@ -0,0 +1,4 @@ +void script_3638(int arg0,int arg1,int arg2) { + script_3625(3195, 3196, 3197, script_3671(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3639.cs2 b/dumps/scripts/3639.cs2 new file mode 100644 index 000000000..c149504c8 --- /dev/null +++ b/dumps/scripts/3639.cs2 @@ -0,0 +1,4 @@ +void script_3639(int arg0,int arg1,int arg2) { + script_3626(3189, 3190, 3191, script_3669(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/364.cs2 b/dumps/scripts/364.cs2 new file mode 100644 index 000000000..fc451300c --- /dev/null +++ b/dumps/scripts/364.cs2 @@ -0,0 +1,4 @@ +void script_364() { + script_304(46435503); + return; +} diff --git a/dumps/scripts/3640.cs2 b/dumps/scripts/3640.cs2 new file mode 100644 index 000000000..191856ace --- /dev/null +++ b/dumps/scripts/3640.cs2 @@ -0,0 +1,4 @@ +void script_3640(int arg0,int arg1,int arg2) { + script_3626(3192, 3193, 3194, script_3670(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3641.cs2 b/dumps/scripts/3641.cs2 new file mode 100644 index 000000000..b3dc172b0 --- /dev/null +++ b/dumps/scripts/3641.cs2 @@ -0,0 +1,4 @@ +void script_3641(int arg0,int arg1,int arg2) { + script_3626(3195, 3196, 3197, script_3671(bitconfig_7392), arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3642.cs2 b/dumps/scripts/3642.cs2 new file mode 100644 index 000000000..f08927584 --- /dev/null +++ b/dumps/scripts/3642.cs2 @@ -0,0 +1,5 @@ +void script_3642(int arg0) { + script_3632(arg0); + script_3644(arg0); + return; +} diff --git a/dumps/scripts/3643.cs2 b/dumps/scripts/3643.cs2 new file mode 100644 index 000000000..8401e7f45 --- /dev/null +++ b/dumps/scripts/3643.cs2 @@ -0,0 +1,4 @@ +void script_3643(int arg0) { + script_3644(arg0); + return; +} diff --git a/dumps/scripts/3644.cs2 b/dumps/scripts/3644.cs2 new file mode 100644 index 000000000..2168958c5 --- /dev/null +++ b/dumps/scripts/3644.cs2 @@ -0,0 +1,8 @@ +void script_3644(int arg0) { + if (script_3666(1) == script_3667(14)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3645.cs2 b/dumps/scripts/3645.cs2 new file mode 100644 index 000000000..589446d08 --- /dev/null +++ b/dumps/scripts/3645.cs2 @@ -0,0 +1,5 @@ +void script_3645(int arg0) { + script_3632(arg0); + script_3647(arg0); + return; +} diff --git a/dumps/scripts/3646.cs2 b/dumps/scripts/3646.cs2 new file mode 100644 index 000000000..125fd6f5a --- /dev/null +++ b/dumps/scripts/3646.cs2 @@ -0,0 +1,4 @@ +void script_3646(int arg0) { + script_3647(arg0); + return; +} diff --git a/dumps/scripts/3647.cs2 b/dumps/scripts/3647.cs2 new file mode 100644 index 000000000..462263351 --- /dev/null +++ b/dumps/scripts/3647.cs2 @@ -0,0 +1,8 @@ +void script_3647(int arg0) { + if (script_3666(2) == script_3667(3)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3648.cs2 b/dumps/scripts/3648.cs2 new file mode 100644 index 000000000..bfbc71dcb --- /dev/null +++ b/dumps/scripts/3648.cs2 @@ -0,0 +1,5 @@ +void script_3648(int arg0) { + script_3632(arg0); + script_3650(arg0); + return; +} diff --git a/dumps/scripts/3649.cs2 b/dumps/scripts/3649.cs2 new file mode 100644 index 000000000..370228d3d --- /dev/null +++ b/dumps/scripts/3649.cs2 @@ -0,0 +1,4 @@ +void script_3649(int arg0) { + script_3650(arg0); + return; +} diff --git a/dumps/scripts/365.cs2 b/dumps/scripts/365.cs2 new file mode 100644 index 000000000..de345647d --- /dev/null +++ b/dumps/scripts/365.cs2 @@ -0,0 +1,79 @@ +void script_365(int arg0,int arg1,int arg2) { + if (((boolean)arg2)) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(4096); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 1))) { + setWidgetSprite(4096); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 2))) { + setWidgetSprite(4093); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 3))) { + setWidgetSprite(4093); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 4))) { + setWidgetSprite(4090); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 5))) { + setWidgetSprite(4090); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 6))) { + setWidgetSprite(4090); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 7))) { + setWidgetSprite(4090); + } + } else if (arg2 == 2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(4095); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 1))) { + setWidgetSprite(4095); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 2))) { + setWidgetSprite(4092); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 3))) { + setWidgetSprite(4092); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 4))) { + setWidgetSprite(4089); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 5))) { + setWidgetSprite(4089); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 6))) { + setWidgetSprite(4089); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 7))) { + setWidgetSprite(4089); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(4097); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 1))) { + setWidgetSprite(4097); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 2))) { + setWidgetSprite(4094); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 3))) { + setWidgetSprite(4094); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 4))) { + setWidgetSprite(4091); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 5))) { + setWidgetSprite(4091); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 6))) { + setWidgetSprite(4091); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 7))) { + setWidgetSprite(4091); + } + } + return; +} diff --git a/dumps/scripts/3650.cs2 b/dumps/scripts/3650.cs2 new file mode 100644 index 000000000..b9160329c --- /dev/null +++ b/dumps/scripts/3650.cs2 @@ -0,0 +1,8 @@ +void script_3650(int arg0) { + if (script_3666(4) == script_3668(12)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3651.cs2 b/dumps/scripts/3651.cs2 new file mode 100644 index 000000000..bf250fbf3 --- /dev/null +++ b/dumps/scripts/3651.cs2 @@ -0,0 +1,5 @@ +void script_3651(int arg0) { + script_3632(arg0); + script_3653(arg0); + return; +} diff --git a/dumps/scripts/3652.cs2 b/dumps/scripts/3652.cs2 new file mode 100644 index 000000000..c968b23bc --- /dev/null +++ b/dumps/scripts/3652.cs2 @@ -0,0 +1,4 @@ +void script_3652(int arg0) { + script_3653(arg0); + return; +} diff --git a/dumps/scripts/3653.cs2 b/dumps/scripts/3653.cs2 new file mode 100644 index 000000000..fb7c1aeda --- /dev/null +++ b/dumps/scripts/3653.cs2 @@ -0,0 +1,8 @@ +void script_3653(int arg0) { + if (script_3666(5) == script_3668(3)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3654.cs2 b/dumps/scripts/3654.cs2 new file mode 100644 index 000000000..3557f131c --- /dev/null +++ b/dumps/scripts/3654.cs2 @@ -0,0 +1,5 @@ +void script_3654(int arg0) { + script_3632(arg0); + script_3656(arg0); + return; +} diff --git a/dumps/scripts/3655.cs2 b/dumps/scripts/3655.cs2 new file mode 100644 index 000000000..f3f4f7326 --- /dev/null +++ b/dumps/scripts/3655.cs2 @@ -0,0 +1,4 @@ +void script_3655(int arg0) { + script_3656(arg0); + return; +} diff --git a/dumps/scripts/3656.cs2 b/dumps/scripts/3656.cs2 new file mode 100644 index 000000000..75e17b0c1 --- /dev/null +++ b/dumps/scripts/3656.cs2 @@ -0,0 +1,8 @@ +void script_3656(int arg0) { + if (script_3666(9) == script_3668(5)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3657.cs2 b/dumps/scripts/3657.cs2 new file mode 100644 index 000000000..f5e96e903 --- /dev/null +++ b/dumps/scripts/3657.cs2 @@ -0,0 +1,5 @@ +void script_3657(int arg0) { + script_3632(arg0); + script_3659(arg0); + return; +} diff --git a/dumps/scripts/3658.cs2 b/dumps/scripts/3658.cs2 new file mode 100644 index 000000000..c97c19af6 --- /dev/null +++ b/dumps/scripts/3658.cs2 @@ -0,0 +1,4 @@ +void script_3658(int arg0) { + script_3659(arg0); + return; +} diff --git a/dumps/scripts/3659.cs2 b/dumps/scripts/3659.cs2 new file mode 100644 index 000000000..cbb92cbf9 --- /dev/null +++ b/dumps/scripts/3659.cs2 @@ -0,0 +1,8 @@ +void script_3659(int arg0) { + if (script_3666(10) == script_3668(10)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/366.cs2 b/dumps/scripts/366.cs2 new file mode 100644 index 000000000..340526e3f --- /dev/null +++ b/dumps/scripts/366.cs2 @@ -0,0 +1,50 @@ +void script_366(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,string arg9) { + int ivar9; + int ivar10; + int ivar11; + if (arg0 != -1) { + if (((boolean)arg5)) { + script_365(arg0, arg3, 1); + } else { + script_365(arg0, arg3, 0); + } + if (((boolean)arg6)) { + setScriptCallOnGameloop(367, new WidgetPointer(arg0), arg4, arg5, "Ii1", new WidgetPointer(arg0)); + } + } else { + script_365(arg7, arg3, 2); + } + if (setWidgetRegister(new WidgetPointer(arg7))) { + if (((boolean)arg5)) { + if (strLength(arg9) > 0) { + script_379(script_3365(arg7), getWidgetActualWidth(new WidgetPointer(arg7)), script_3366(arg7), arg8, arg9); + } + } else { + if ((script_3365(arg7) == globalint_2) && (getWidgetActualWidth(new WidgetPointer(arg7)) == globalint_773)) { + script_383(); + } + } + } + if (arg2 == -1) { + return; + } + ivar9 = 0; + ivar10 = getCommonDefinitionSize(arg2); + ivar11 = -1; + if (((boolean)arg5) && (ivar9 < ivar10)) { + while (true) { + if (ivar9 != arg1) { + ivar11 = ((int)cs2method_3408(105, 73, arg2, ivar9)); + if (ivar11 == -1) { + return; + } + if ((ivar11 != arg0) && isWidgetHidden(new WidgetPointer(ivar11))) { + setScriptCallOnGameloop(367, new WidgetPointer(ivar11), arg4, 0, "Ii1", new WidgetPointer(ivar11)); + script_365(ivar11, arg3, 0); + } + } + ivar9 = add(ivar9, 1); + } + } + return; +} diff --git a/dumps/scripts/3660.cs2 b/dumps/scripts/3660.cs2 new file mode 100644 index 000000000..1e5f56fe4 --- /dev/null +++ b/dumps/scripts/3660.cs2 @@ -0,0 +1,5 @@ +void script_3660(int arg0) { + script_3632(arg0); + script_3662(arg0); + return; +} diff --git a/dumps/scripts/3661.cs2 b/dumps/scripts/3661.cs2 new file mode 100644 index 000000000..dbc52bb2f --- /dev/null +++ b/dumps/scripts/3661.cs2 @@ -0,0 +1,4 @@ +void script_3661(int arg0) { + script_3662(arg0); + return; +} diff --git a/dumps/scripts/3662.cs2 b/dumps/scripts/3662.cs2 new file mode 100644 index 000000000..0f010ffdb --- /dev/null +++ b/dumps/scripts/3662.cs2 @@ -0,0 +1,8 @@ +void script_3662(int arg0) { + if (script_3666(12) == script_3667(5)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3663.cs2 b/dumps/scripts/3663.cs2 new file mode 100644 index 000000000..9daaf19c2 --- /dev/null +++ b/dumps/scripts/3663.cs2 @@ -0,0 +1,5 @@ +void script_3663(int arg0) { + script_3632(arg0); + script_3665(arg0); + return; +} diff --git a/dumps/scripts/3664.cs2 b/dumps/scripts/3664.cs2 new file mode 100644 index 000000000..6665effb0 --- /dev/null +++ b/dumps/scripts/3664.cs2 @@ -0,0 +1,4 @@ +void script_3664(int arg0) { + script_3665(arg0); + return; +} diff --git a/dumps/scripts/3665.cs2 b/dumps/scripts/3665.cs2 new file mode 100644 index 000000000..7117352b4 --- /dev/null +++ b/dumps/scripts/3665.cs2 @@ -0,0 +1,8 @@ +void script_3665(int arg0) { + if (script_3666(13) == script_3667(12)) { + script_3633(arg0); + } else { + script_3634(arg0); + } + return; +} diff --git a/dumps/scripts/3666.cs2 b/dumps/scripts/3666.cs2 new file mode 100644 index 000000000..3f193d9ea --- /dev/null +++ b/dumps/scripts/3666.cs2 @@ -0,0 +1,3 @@ +int script_3666(int arg0) { + return cs2method_3408(105, 105, script_3669(bitconfig_7392), mod(add(arg0, bitconfig_7388), getCommonDefinitionSize(script_3669(bitconfig_7392)))); +} diff --git a/dumps/scripts/3667.cs2 b/dumps/scripts/3667.cs2 new file mode 100644 index 000000000..9a963d6ee --- /dev/null +++ b/dumps/scripts/3667.cs2 @@ -0,0 +1,3 @@ +int script_3667(int arg0) { + return cs2method_3408(105, 105, script_3670(bitconfig_7392), mod(add(arg0, bitconfig_7389), getCommonDefinitionSize(script_3670(bitconfig_7392)))); +} diff --git a/dumps/scripts/3668.cs2 b/dumps/scripts/3668.cs2 new file mode 100644 index 000000000..b01b19a95 --- /dev/null +++ b/dumps/scripts/3668.cs2 @@ -0,0 +1,3 @@ +int script_3668(int arg0) { + return cs2method_3408(105, 105, script_3671(bitconfig_7392), mod(add(arg0, bitconfig_7390), getCommonDefinitionSize(script_3671(bitconfig_7392)))); +} diff --git a/dumps/scripts/3669.cs2 b/dumps/scripts/3669.cs2 new file mode 100644 index 000000000..1b67a9bd1 --- /dev/null +++ b/dumps/scripts/3669.cs2 @@ -0,0 +1,22 @@ +int script_3669(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3125; + flow_1: + return 3128; + flow_2: + return 3131; + flow_3: + return 3134; + flow_4: + return 3137; +} diff --git a/dumps/scripts/367.cs2 b/dumps/scripts/367.cs2 new file mode 100644 index 000000000..543fc17a8 --- /dev/null +++ b/dumps/scripts/367.cs2 @@ -0,0 +1,22 @@ +void script_367(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = 0; + if (((boolean)arg2)) { + ivar3 = add(arg1, 17); + } else { + ivar3 = arg1; + } + ivar4 = getWidgetActualHeight(new WidgetPointer(arg0)); + if (ivar4 < ivar3) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), min(add(ivar4, 2), ivar3), 0, 0, new WidgetPointer(arg0)); + if (((boolean)mod(ivar4, arg1))) { + playSoundEffect(9840, 1, 0); + } + } else if (ivar4 > ivar3) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), max(subtract(ivar4, 2), ivar3), 0, 0, new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/3670.cs2 b/dumps/scripts/3670.cs2 new file mode 100644 index 000000000..a4c722b06 --- /dev/null +++ b/dumps/scripts/3670.cs2 @@ -0,0 +1,22 @@ +int script_3670(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3126; + flow_1: + return 3129; + flow_2: + return 3132; + flow_3: + return 3135; + flow_4: + return 3138; +} diff --git a/dumps/scripts/3671.cs2 b/dumps/scripts/3671.cs2 new file mode 100644 index 000000000..6f8f53972 --- /dev/null +++ b/dumps/scripts/3671.cs2 @@ -0,0 +1,22 @@ +int script_3671(int arg0) { + flow_0: + SWITCH (arg0) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + case 5: + GOTO flow_4 + } + return 3127; + flow_1: + return 3130; + flow_2: + return 3133; + flow_3: + return 3136; + flow_4: + return 3139; +} diff --git a/dumps/scripts/3672.cs2 b/dumps/scripts/3672.cs2 new file mode 100644 index 000000000..74d914e28 --- /dev/null +++ b/dumps/scripts/3672.cs2 @@ -0,0 +1,44 @@ +void script_3672() { + int ivar0; + int ivar1; + string svar0; + string svar1; + string svar2; + string svar3; + svar0 = cs2method_3408(105, 115, 3230, globalint_1327); + svar1 = cs2method_3408(105, 115, 3230, globalint_1326); + svar2 = cs2method_3408(105, 115, 3231, globalint_1330); + svar3 = intToStr(globalint_1325) + "%"; + ivar0 = cs2method_3408(105, 100, 3233, globalint_1328); + ivar1 = cs2method_3408(105, 100, 3233, globalint_1329); + setWidgetText(new WidgetPointer(1004,72), svar0); + setWidgetRGB(new Color(cs2method_3408(105, 105, 3234, globalint_1327)), new WidgetPointer(1004,72)); + setWidgetText(new WidgetPointer(1004,71), svar1); + setWidgetRGB(new Color(cs2method_3408(105, 105, 3234, globalint_1326)), new WidgetPointer(1004,71)); + setWidgetSprite(ivar0, new WidgetPointer(1004,68)); + setWidgetSprite(ivar1, new WidgetPointer(1004,69)); + setWidgetText(new WidgetPointer(1004,70), svar2); + setWidgetRGB(new Color(cs2method_3408(105, 105, 3235, globalint_1330)), new WidgetPointer(1004,70)); + setWidgetText(new WidgetPointer(1004,73), svar3); + if (globalint_1327 != 3) { + setWidgetIsHidden(false, new WidgetPointer(1004,66)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1004,66)); + } + if (globalint_1326 != 3) { + setWidgetIsHidden(false, new WidgetPointer(1004,63)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1004,63)); + } + if (((boolean)globalint_1331)) { + setWidgetIsHidden(false, new WidgetPointer(1004,65)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1004,65)); + } + if (globalint_1330 > 66) { + setWidgetIsHidden(false, new WidgetPointer(1004,64)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1004,64)); + } + return; +} diff --git a/dumps/scripts/3673.cs2 b/dumps/scripts/3673.cs2 new file mode 100644 index 000000000..58324844e --- /dev/null +++ b/dumps/scripts/3673.cs2 @@ -0,0 +1,4 @@ +void script_3673() { + setWidgetIsHidden(true, new WidgetPointer(1004,82)); + return; +} diff --git a/dumps/scripts/3674.cs2 b/dumps/scripts/3674.cs2 new file mode 100644 index 000000000..28c318fc4 --- /dev/null +++ b/dumps/scripts/3674.cs2 @@ -0,0 +1,12 @@ +void script_3674(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(2564, new WidgetPointer(1004,90)); + setWidgetSprite(2565, new WidgetPointer(1004,91)); + setWidgetSprite(2564, new WidgetPointer(1004,92)); + } else { + setWidgetSprite(2560, new WidgetPointer(1004,90)); + setWidgetSprite(2561, new WidgetPointer(1004,91)); + setWidgetSprite(2560, new WidgetPointer(1004,92)); + } + return; +} diff --git a/dumps/scripts/3675.cs2 b/dumps/scripts/3675.cs2 new file mode 100644 index 000000000..1e9bb521a --- /dev/null +++ b/dumps/scripts/3675.cs2 @@ -0,0 +1,4 @@ +void script_3675(int arg0) { + cs2method2103(125, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3676.cs2 b/dumps/scripts/3676.cs2 new file mode 100644 index 000000000..893dd2cd6 --- /dev/null +++ b/dumps/scripts/3676.cs2 @@ -0,0 +1,4 @@ +void script_3676(int arg0) { + cs2method2103(0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3677.cs2 b/dumps/scripts/3677.cs2 new file mode 100644 index 000000000..456f6a840 --- /dev/null +++ b/dumps/scripts/3677.cs2 @@ -0,0 +1,60 @@ +void script_3677(int arg0,int arg1) { + int ivar2; + string svar0; + ivar2 = 0; + switch (arg0) { + case 65929230: + ivar2 = globalint_1336; + break; + case 65929231: + ivar2 = globalint_1337; + break; + case 65929232: + ivar2 = globalint_1338; + break; + case 65929233: + ivar2 = globalint_1339; + break; + case 65929234: + ivar2 = globalint_1340; + break; + case 65929235: + ivar2 = globalint_1341; + break; + case 65929236: + ivar2 = globalint_1342; + break; + case 65929237: + ivar2 = globalint_1343; + break; + case 65929238: + ivar2 = globalint_1344; + break; + case 65929239: + ivar2 = globalint_1345; + break; + case 65929240: + ivar2 = globalint_1346; + break; + case 65929241: + ivar2 = globalint_1347; + break; + case 65929242: + ivar2 = globalint_1348; + break; + case 65929243: + ivar2 = globalint_1349; + break; + case 65929244: + ivar2 = globalint_1350; + break; + case 65929245: + ivar2 = globalint_1605; + break; + case 65929246: + ivar2 = globalint_1351; + } + svar0 = "Current price: " + script_940(ivar2) + " gp"; + script_569(arg0, arg1, 65929265, 25, getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(1006,49)))), svar0); + return; +} diff --git a/dumps/scripts/3678.cs2 b/dumps/scripts/3678.cs2 new file mode 100644 index 000000000..1b1a7c720 --- /dev/null +++ b/dumps/scripts/3678.cs2 @@ -0,0 +1,44 @@ +void script_3678(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 6; + ivar5 = 5; + if (ivar4 > 1) { + if (getWidgetScrollMaxH(new WidgetPointer(arg0)) > 0) { + ivar2 = divide(subtract(getWidgetScrollMaxH(new WidgetPointer(arg0)), multiply(36, ivar4)), subtract(ivar4, 1)); + } else { + ivar2 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(36, ivar4)), subtract(ivar4, 1)); + } + } + if (ivar5 > 1) { + if (getWidgetScrollMaxV(new WidgetPointer(arg0)) > 0) { + ivar3 = divide(subtract(getWidgetScrollMaxV(new WidgetPointer(arg0)), multiply(32, ivar5)), subtract(ivar5, 1)); + } else { + ivar3 = divide(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), multiply(32, ivar5)), subtract(ivar5, 1)); + } + } + while (ivar1 < 30) { + createExtraChild(new WidgetPointer(arg0), 5, ivar1); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar2), mod(ivar1, ivar4)), multiply(divide(ivar1, ivar4), add(32, ivar3)), 0, 0); + setItemOnWidgetMethod1212(cs2method_3408(105, 79, 3272, ivar1), ((int)isBitFlagged(globalint_1352, ivar1))); + if (isBitFlagged(globalint_1352, ivar1)) { + setWidgetContextMenuOption(1, "Take" + ""); + setWidgetBorderThickness(2); + } else { + cs2method2103(100); + } + setWidgetContextMenuOption(5, "Examine" + ""); + cs2method1305("" + cs2method_3408(105, 115, 3274, ivar1) + " Piece"); + setScriptCallOnClickContextMenu(3679, new WidgetPointer(-32768,3), ivar1, "Ii"); + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/3679.cs2 b/dumps/scripts/3679.cs2 new file mode 100644 index 000000000..e1e360584 --- /dev/null +++ b/dumps/scripts/3679.cs2 @@ -0,0 +1,6 @@ +void script_3679(int arg0,int arg1) { + setWidgetNoOptions(new WidgetPointer(arg0)); + setWidgetContextMenuOption(5, new WidgetPointer(arg0), "Examine" + ""); + cs2method2305(new WidgetPointer(arg0), "" + cs2method_3408(105, 115, 3274, arg1) + " Piece"); + return; +} diff --git a/dumps/scripts/368.cs2 b/dumps/scripts/368.cs2 new file mode 100644 index 000000000..ac3f18cc8 --- /dev/null +++ b/dumps/scripts/368.cs2 @@ -0,0 +1,30 @@ +void script_368(int arg0,int arg1,string arg2,string arg3) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + setWidgetSize(arg1, 27, 0, 0, new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(6, 26, 1, 0); + setWidgetPosition(0, 0, 1, 1); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(26, 26, 0, 0); + setWidgetPosition(0, 0, 0, 1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(26, 26, 0, 0); + setWidgetPosition(3, 0, 2, 1); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(3793); + setWidgetRGB(new Color(235, 224, 188)); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(false); + setWidgetText(arg2); + script_370(arg0, 0); + setWidgetContextMenuOption(1, new WidgetPointer(arg0), arg2); + setScriptCallOnMouseEntered(369, new WidgetPointer(arg0), 1, "I1", new WidgetPointer(arg0)); + if (strLength(arg3) > 0) { + setScriptCallOnMouseOver(378, arg3, new WidgetPointer(-32768,3), -1, -2147483647, "sIii", new WidgetPointer(arg0)); + } + setScriptCallOnMouseExit(369, new WidgetPointer(arg0), 0, "I1", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3680.cs2 b/dumps/scripts/3680.cs2 new file mode 100644 index 000000000..9b544ea63 --- /dev/null +++ b/dumps/scripts/3680.cs2 @@ -0,0 +1,90 @@ +void script_3680() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + string svar0; + int stack_dump0; + script_41(12255248); + globalint_1 = 0; + ivar0 = -1; + if (setWidgetRegister(new WidgetPointer(187,4))) { + stack_dump0 = 1133; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + ivar1 = 0; + ivar2 = 0; + svar0 = ""; + ivar3 = strLength(globalstring_196); + ivar4 = 5; + while (ivar0 != -1) { + if (setWidgetRegister(new WidgetPointer(187,1), multiply(ivar0, 2)) && setWidgetRegister(new WidgetPointer(187,1), add(multiply(ivar0, 2), 1))) { + setWidgetNoOptions(); + setWidgetNoOptions(); + svar0 = lower(getWidgetText()); + if (strLength(svar0) > 0) { + if (((boolean)script_837(ivar0))) { + if (((boolean)ivar3) || (strIndexof(0, svar0, globalstring_196) != -1)) { + setWidgetContextMenuOption(2, "Unlock hint"); + script_3681(ivar0); + setWidgetHidden(0); + setWidgetHidden(0); + setWidgetPosition(15, ivar4, 0, 0); + setWidgetPosition(2, add(ivar4, 1), 0, 0); + ivar4 = add(ivar4, 15); + } else { + setWidgetHidden(1); + setWidgetHidden(1); + } + ivar1 = add(ivar1, 1); + } else { + if (((boolean)ivar3) || (strIndexof(0, svar0, globalstring_196) != -1)) { + setWidgetContextMenuOption(2, "Unlock hint"); + setWidgetRGB(new Color(255, 0, 0)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 16711680, "Iii"); + setScriptCallOnClickContextMenu(-1, ""); + setWidgetHidden(0); + setWidgetPosition(15, ivar4, 0, 0); + setWidgetPosition(2, add(ivar4, 1), 0, 0); + ivar4 = add(ivar4, 15); + } else { + setWidgetHidden(1); + } + setWidgetHidden(1); + } + ivar2 = add(ivar2, 1); + } + stack_dump0 = 1133; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + ivar0 = -1; + } + setWidgetScrollMax(167, add(5, ivar4), new WidgetPointer(187,1)); + script_72(12255234, 12255233, globalint_88); + setWidgetText(new WidgetPointer(187,5), "Unlocked:" + "
" + intToStr(ivar1) + " / " + intToStr(ivar2)); + if (ivar4 == 5) { + setWidgetIsHidden(false, new WidgetPointer(187,18)); + } else { + setWidgetIsHidden(true, new WidgetPointer(187,18)); + } + return; +} diff --git a/dumps/scripts/3681.cs2 b/dumps/scripts/3681.cs2 new file mode 100644 index 000000000..ec0c614e8 --- /dev/null +++ b/dumps/scripts/3681.cs2 @@ -0,0 +1,25 @@ +void script_3681(int arg0) { + string svar0; + string svar1; + svar0 = "Add to playlist"; + svar1 = "Remove from playlist"; + setWidgetContextMenuOption(1, "Play"); + setWidgetRGB(new Color(0, 255, 0)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 65280, "Iii"); + setWidgetHidden(0); + setScriptCallOnClickContextMenu(2885, new WidgetPointer(-32768,3), -2147483643, 150, 0, 20, -2147483644, "Iiiiii"); + if ((((((((((((arg0 == bitconfig_7081) || (arg0 == bitconfig_7082)) || (arg0 == bitconfig_7083)) || (arg0 == bitconfig_7084)) || (arg0 == bitconfig_7085)) || (arg0 == bitconfig_7086)) || (arg0 == bitconfig_7087)) || (arg0 == bitconfig_7088)) || (arg0 == bitconfig_7089)) || (arg0 == bitconfig_7090)) || (arg0 == bitconfig_7091)) || (arg0 == bitconfig_7092)) { + setWidgetSprite(2430); + setWidgetContextMenuOption(4, svar1); + setWidgetContextMenuOption(4, svar1); + setScriptCallOnMouseOver(1160, new WidgetPointer(187,1), -2147483643, new WidgetPointer(187,16), svar1, 25, 189, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(187,16), "I"); + } else { + setWidgetContextMenuOption(3, svar0); + setWidgetContextMenuOption(3, svar0); + setWidgetSprite(2429); + setScriptCallOnMouseOver(1160, new WidgetPointer(187,1), -2147483643, new WidgetPointer(187,16), svar0, 25, 189, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(187,16), "I"); + } + return; +} diff --git a/dumps/scripts/3682.cs2 b/dumps/scripts/3682.cs2 new file mode 100644 index 000000000..ad83a5fe5 --- /dev/null +++ b/dumps/scripts/3682.cs2 @@ -0,0 +1,9 @@ +void script_3682() { + if (((boolean)strLength(globalstring_196)) && (globalint_5 != 14)) { + setWidgetSprite(3246, new WidgetPointer(187,17)); + script_3685(); + } else { + script_3683(); + } + return; +} diff --git a/dumps/scripts/3683.cs2 b/dumps/scripts/3683.cs2 new file mode 100644 index 000000000..69e7d8f72 --- /dev/null +++ b/dumps/scripts/3683.cs2 @@ -0,0 +1,7 @@ +void script_3683() { + script_1548(14); + globalstring_196 = ""; + script_3680(); + setWidgetSprite(3245, new WidgetPointer(187,17)); + return; +} diff --git a/dumps/scripts/3684.cs2 b/dumps/scripts/3684.cs2 new file mode 100644 index 000000000..1295e7239 --- /dev/null +++ b/dumps/scripts/3684.cs2 @@ -0,0 +1,7 @@ +void script_3684() { + if (((boolean)bitconfig_4393) || ((boolean)bitconfig_542)) { + return; + } + script_39(12255242, 12255248, 25, 189, "Click here to search for a song"); + return; +} diff --git a/dumps/scripts/3685.cs2 b/dumps/scripts/3685.cs2 new file mode 100644 index 000000000..c35081903 --- /dev/null +++ b/dumps/scripts/3685.cs2 @@ -0,0 +1,20 @@ +void script_3685() { + if (((boolean)globalint_11)) { + messageType0("You can't do that while you're reporting abuse."); + return; + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter the name of the song you wish to search for:"); + globalint_5 = 14; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + return; +} diff --git a/dumps/scripts/3686.cs2 b/dumps/scripts/3686.cs2 new file mode 100644 index 000000000..1f4f87062 --- /dev/null +++ b/dumps/scripts/3686.cs2 @@ -0,0 +1,4 @@ +void script_3686() { + script_304(303879163); + return; +} diff --git a/dumps/scripts/3687.cs2 b/dumps/scripts/3687.cs2 new file mode 100644 index 000000000..f31ff1d66 --- /dev/null +++ b/dumps/scripts/3687.cs2 @@ -0,0 +1,4 @@ +void script_3687() { + script_304(46016274); + return; +} diff --git a/dumps/scripts/3688.cs2 b/dumps/scripts/3688.cs2 new file mode 100644 index 000000000..66aa9aa3a --- /dev/null +++ b/dumps/scripts/3688.cs2 @@ -0,0 +1,4 @@ +void script_3688() { + script_304(54027871); + return; +} diff --git a/dumps/scripts/3689.cs2 b/dumps/scripts/3689.cs2 new file mode 100644 index 000000000..b97edc508 --- /dev/null +++ b/dumps/scripts/3689.cs2 @@ -0,0 +1,4 @@ +void script_3689() { + script_304(593945894); + return; +} diff --git a/dumps/scripts/369.cs2 b/dumps/scripts/369.cs2 new file mode 100644 index 000000000..a73b89c33 --- /dev/null +++ b/dumps/scripts/369.cs2 @@ -0,0 +1,4 @@ +void script_369(int arg0,int arg1) { + script_370(arg0, arg1); + return; +} diff --git a/dumps/scripts/3690.cs2 b/dumps/scripts/3690.cs2 new file mode 100644 index 000000000..0eb598879 --- /dev/null +++ b/dumps/scripts/3690.cs2 @@ -0,0 +1,4 @@ +void script_3690() { + script_304(61416605); + return; +} diff --git a/dumps/scripts/3691.cs2 b/dumps/scripts/3691.cs2 new file mode 100644 index 000000000..fb755ea0b --- /dev/null +++ b/dumps/scripts/3691.cs2 @@ -0,0 +1,4 @@ +void script_3691() { + script_304(55026826); + return; +} diff --git a/dumps/scripts/3692.cs2 b/dumps/scripts/3692.cs2 new file mode 100644 index 000000000..43b553ba0 --- /dev/null +++ b/dumps/scripts/3692.cs2 @@ -0,0 +1,4 @@ +void script_3692() { + script_304(50499717); + return; +} diff --git a/dumps/scripts/3693.cs2 b/dumps/scripts/3693.cs2 new file mode 100644 index 000000000..cd9a16a8b --- /dev/null +++ b/dumps/scripts/3693.cs2 @@ -0,0 +1,4 @@ +void script_3693() { + script_304(30463099); + return; +} diff --git a/dumps/scripts/3694.cs2 b/dumps/scripts/3694.cs2 new file mode 100644 index 000000000..2203732f8 --- /dev/null +++ b/dumps/scripts/3694.cs2 @@ -0,0 +1,4 @@ +void script_3694() { + script_304(47916465); + return; +} diff --git a/dumps/scripts/3695.cs2 b/dumps/scripts/3695.cs2 new file mode 100644 index 000000000..ba40bf15d --- /dev/null +++ b/dumps/scripts/3695.cs2 @@ -0,0 +1,4 @@ +void script_3695() { + script_304(48539058); + return; +} diff --git a/dumps/scripts/3696.cs2 b/dumps/scripts/3696.cs2 new file mode 100644 index 000000000..a84cb2be0 --- /dev/null +++ b/dumps/scripts/3696.cs2 @@ -0,0 +1,4 @@ +void script_3696() { + script_304(49309006); + return; +} diff --git a/dumps/scripts/3697.cs2 b/dumps/scripts/3697.cs2 new file mode 100644 index 000000000..478ae7f2c --- /dev/null +++ b/dumps/scripts/3697.cs2 @@ -0,0 +1,4 @@ +void script_3697() { + script_304(584094911); + return; +} diff --git a/dumps/scripts/3698.cs2 b/dumps/scripts/3698.cs2 new file mode 100644 index 000000000..09c881ea1 --- /dev/null +++ b/dumps/scripts/3698.cs2 @@ -0,0 +1,4 @@ +void script_3698() { + script_304(40019874); + return; +} diff --git a/dumps/scripts/3699.cs2 b/dumps/scripts/3699.cs2 new file mode 100644 index 000000000..cdbe1eea1 --- /dev/null +++ b/dumps/scripts/3699.cs2 @@ -0,0 +1,4 @@ +void script_3699() { + script_304(41707423); + return; +} diff --git a/dumps/scripts/37.cs2 b/dumps/scripts/37.cs2 new file mode 100644 index 000000000..40897f022 --- /dev/null +++ b/dumps/scripts/37.cs2 @@ -0,0 +1,52 @@ +void script_37(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + ivar4 = subtract(getWidgetScrollMaxV(new WidgetPointer(arg1)), getWidgetActualHeight(new WidgetPointer(arg1))); + if (((boolean)ivar4)) { + ivar4 = 1; + } + if (arg2 < 0) { + arg2 = 0; + } + if (arg2 > ivar4) { + arg2 = ivar4; + } + cs2method2100(0, arg2, new WidgetPointer(arg1)); + switch (arg1) { + case 8978490: + globalint_7 = arg2; + break; + case 19660815: + globalint_109 = arg2; + break; + case 48168973: + globalint_121 = arg2; + break; + case 49938525: + script_705(bitconfig_4893, arg2); + break; + case 59572276: + globalint_1122 = arg2; + break; + case 59768852: + globalint_1124 = arg2; + break; + case 12255233: + globalint_88 = arg2; + break; + case 73007109: + script_5082(arg1); + } + ivar5 = 0; + if (((boolean)arg3)) { + ivar5 = subtract(subtract(getWidgetActualHeight(new WidgetPointer(arg0)), 32), getWidgetActualHeight()); + setWidgetPosition(0, add(16, multiplyDivide(arg2, ivar4, ivar5)), 0, 0); + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetPosition(0, getWidgetActualY(), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetPosition(0, subtract(add(getWidgetActualY(), getWidgetActualHeight()), 5), 0, 0); + } + } + return; +} diff --git a/dumps/scripts/370.cs2 b/dumps/scripts/370.cs2 new file mode 100644 index 000000000..d12b1751f --- /dev/null +++ b/dumps/scripts/370.cs2 @@ -0,0 +1,25 @@ +void script_370(int arg0,int arg1) { + if (((boolean)arg1)) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(4038); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(4032); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(4035); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(4037); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(4031); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(4034); + } + script_383(); + } + return; +} diff --git a/dumps/scripts/3700.cs2 b/dumps/scripts/3700.cs2 new file mode 100644 index 000000000..d60cada5a --- /dev/null +++ b/dumps/scripts/3700.cs2 @@ -0,0 +1,4 @@ +void script_3700() { + script_304(42100021); + return; +} diff --git a/dumps/scripts/3701.cs2 b/dumps/scripts/3701.cs2 new file mode 100644 index 000000000..b67b0d78f --- /dev/null +++ b/dumps/scripts/3701.cs2 @@ -0,0 +1,4 @@ +void script_3701() { + script_304(42624265); + return; +} diff --git a/dumps/scripts/3702.cs2 b/dumps/scripts/3702.cs2 new file mode 100644 index 000000000..8d99f9e89 --- /dev/null +++ b/dumps/scripts/3702.cs2 @@ -0,0 +1,4 @@ +void script_3702() { + script_304(47408819); + return; +} diff --git a/dumps/scripts/3703.cs2 b/dumps/scripts/3703.cs2 new file mode 100644 index 000000000..90ce72e51 --- /dev/null +++ b/dumps/scripts/3703.cs2 @@ -0,0 +1,4 @@ +void script_3703() { + script_304(46458553); + return; +} diff --git a/dumps/scripts/3704.cs2 b/dumps/scripts/3704.cs2 new file mode 100644 index 000000000..06abfc81a --- /dev/null +++ b/dumps/scripts/3704.cs2 @@ -0,0 +1,4 @@ +void script_3704() { + script_304(47146647); + return; +} diff --git a/dumps/scripts/3705.cs2 b/dumps/scripts/3705.cs2 new file mode 100644 index 000000000..713684da1 --- /dev/null +++ b/dumps/scripts/3705.cs2 @@ -0,0 +1,4 @@ +void script_3705() { + script_304(43125982); + return; +} diff --git a/dumps/scripts/3706.cs2 b/dumps/scripts/3706.cs2 new file mode 100644 index 000000000..6007291be --- /dev/null +++ b/dumps/scripts/3706.cs2 @@ -0,0 +1,4 @@ +void script_3706() { + script_304(46212764); + return; +} diff --git a/dumps/scripts/3707.cs2 b/dumps/scripts/3707.cs2 new file mode 100644 index 000000000..2cc2a150b --- /dev/null +++ b/dumps/scripts/3707.cs2 @@ -0,0 +1,4 @@ +void script_3707() { + script_304(42093725); + return; +} diff --git a/dumps/scripts/3708.cs2 b/dumps/scripts/3708.cs2 new file mode 100644 index 000000000..6f4bc8a24 --- /dev/null +++ b/dumps/scripts/3708.cs2 @@ -0,0 +1,4 @@ +void script_3708() { + script_304(575055984); + return; +} diff --git a/dumps/scripts/3709.cs2 b/dumps/scripts/3709.cs2 new file mode 100644 index 000000000..2dfdda902 --- /dev/null +++ b/dumps/scripts/3709.cs2 @@ -0,0 +1,4 @@ +void script_3709() { + script_304(42388643); + return; +} diff --git a/dumps/scripts/371.cs2 b/dumps/scripts/371.cs2 new file mode 100644 index 000000000..d6b384c8d --- /dev/null +++ b/dumps/scripts/371.cs2 @@ -0,0 +1,44 @@ +void script_371(int arg0) { + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(12, 12, 1, 1); + setWidgetPosition(0, 0, 1, 1); + cs2method1107(0); + setWidgetSprite(3457); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(12, 14, 1, 0); + setWidgetPosition(0, 0, 1, 0); + cs2method1107(1); + setWidgetSprite(3460); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(12, 14, 1, 0); + setWidgetPosition(0, 0, 1, 2); + cs2method1107(1); + setWidgetSprite(3461); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 12, 0, 1); + setWidgetPosition(0, 0, 0, 1); + cs2method1107(0); + setWidgetSprite(3458); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 12, 0, 1); + setWidgetPosition(0, 0, 2, 1); + cs2method1107(0); + setWidgetSprite(3459); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(3453); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(3454); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, 0, 0, 2); + setWidgetSprite(3455); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(14, 14, 0, 0); + setWidgetPosition(0, 0, 2, 2); + setWidgetSprite(3456); + return; +} diff --git a/dumps/scripts/3710.cs2 b/dumps/scripts/3710.cs2 new file mode 100644 index 000000000..e0c629a80 --- /dev/null +++ b/dumps/scripts/3710.cs2 @@ -0,0 +1,4 @@ +void script_3710() { + script_304(307669049); + return; +} diff --git a/dumps/scripts/3711.cs2 b/dumps/scripts/3711.cs2 new file mode 100644 index 000000000..51812b165 --- /dev/null +++ b/dumps/scripts/3711.cs2 @@ -0,0 +1,4 @@ +void script_3711() { + script_304(44190931); + return; +} diff --git a/dumps/scripts/3712.cs2 b/dumps/scripts/3712.cs2 new file mode 100644 index 000000000..dea0331d6 --- /dev/null +++ b/dumps/scripts/3712.cs2 @@ -0,0 +1,4 @@ +void script_3712() { + script_304(41117702); + return; +} diff --git a/dumps/scripts/3713.cs2 b/dumps/scripts/3713.cs2 new file mode 100644 index 000000000..db8e4c949 --- /dev/null +++ b/dumps/scripts/3713.cs2 @@ -0,0 +1,4 @@ +void script_3713() { + script_304(44633391); + return; +} diff --git a/dumps/scripts/3714.cs2 b/dumps/scripts/3714.cs2 new file mode 100644 index 000000000..ac2f2ce89 --- /dev/null +++ b/dumps/scripts/3714.cs2 @@ -0,0 +1,4 @@ +void script_3714() { + script_304(42919960); + return; +} diff --git a/dumps/scripts/3715.cs2 b/dumps/scripts/3715.cs2 new file mode 100644 index 000000000..b2cfc82e0 --- /dev/null +++ b/dumps/scripts/3715.cs2 @@ -0,0 +1,4 @@ +void script_3715() { + script_304(41979164); + return; +} diff --git a/dumps/scripts/3716.cs2 b/dumps/scripts/3716.cs2 new file mode 100644 index 000000000..c3195d8ea --- /dev/null +++ b/dumps/scripts/3716.cs2 @@ -0,0 +1,4 @@ +void script_3716() { + script_304(53596925); + return; +} diff --git a/dumps/scripts/3717.cs2 b/dumps/scripts/3717.cs2 new file mode 100644 index 000000000..977e73dfa --- /dev/null +++ b/dumps/scripts/3717.cs2 @@ -0,0 +1,4 @@ +void script_3717() { + script_304(42995009); + return; +} diff --git a/dumps/scripts/3718.cs2 b/dumps/scripts/3718.cs2 new file mode 100644 index 000000000..5c778942d --- /dev/null +++ b/dumps/scripts/3718.cs2 @@ -0,0 +1,4 @@ +void script_3718() { + script_304(583362409); + return; +} diff --git a/dumps/scripts/3719.cs2 b/dumps/scripts/3719.cs2 new file mode 100644 index 000000000..73e0698ff --- /dev/null +++ b/dumps/scripts/3719.cs2 @@ -0,0 +1,4 @@ +void script_3719() { + script_304(41864378); + return; +} diff --git a/dumps/scripts/372.cs2 b/dumps/scripts/372.cs2 new file mode 100644 index 000000000..1eedd39a4 --- /dev/null +++ b/dumps/scripts/372.cs2 @@ -0,0 +1,4 @@ +void script_372() { + script_304(46795872); + return; +} diff --git a/dumps/scripts/3720.cs2 b/dumps/scripts/3720.cs2 new file mode 100644 index 000000000..8850071ff --- /dev/null +++ b/dumps/scripts/3720.cs2 @@ -0,0 +1,4 @@ +void script_3720() { + script_304(46278466); + return; +} diff --git a/dumps/scripts/3721.cs2 b/dumps/scripts/3721.cs2 new file mode 100644 index 000000000..0ff650424 --- /dev/null +++ b/dumps/scripts/3721.cs2 @@ -0,0 +1,4 @@ +void script_3721() { + script_304(46534250); + return; +} diff --git a/dumps/scripts/3722.cs2 b/dumps/scripts/3722.cs2 new file mode 100644 index 000000000..2aaccc615 --- /dev/null +++ b/dumps/scripts/3722.cs2 @@ -0,0 +1,6 @@ +void script_3722(int arg0,int arg1,int arg2) { + if (standart_config_851 != -1) { + script_1163(arg0, arg1, arg2, 0, 180, getItemName(standart_config_851)); + } + return; +} diff --git a/dumps/scripts/3723.cs2 b/dumps/scripts/3723.cs2 new file mode 100644 index 000000000..e253c23d3 --- /dev/null +++ b/dumps/scripts/3723.cs2 @@ -0,0 +1,4 @@ +void script_3723() { + script_304(46321214); + return; +} diff --git a/dumps/scripts/3724.cs2 b/dumps/scripts/3724.cs2 new file mode 100644 index 000000000..3a0360155 --- /dev/null +++ b/dumps/scripts/3724.cs2 @@ -0,0 +1,4 @@ +void script_3724() { + script_304(41603688); + return; +} diff --git a/dumps/scripts/3725.cs2 b/dumps/scripts/3725.cs2 new file mode 100644 index 000000000..554054692 --- /dev/null +++ b/dumps/scripts/3725.cs2 @@ -0,0 +1,4 @@ +void script_3725() { + script_304(44732033); + return; +} diff --git a/dumps/scripts/3726.cs2 b/dumps/scripts/3726.cs2 new file mode 100644 index 000000000..f8879aa53 --- /dev/null +++ b/dumps/scripts/3726.cs2 @@ -0,0 +1,4 @@ +void script_3726() { + script_304(49899609); + return; +} diff --git a/dumps/scripts/3727.cs2 b/dumps/scripts/3727.cs2 new file mode 100644 index 000000000..593f9d08f --- /dev/null +++ b/dumps/scripts/3727.cs2 @@ -0,0 +1,4 @@ +void script_3727() { + script_304(45813382); + return; +} diff --git a/dumps/scripts/3728.cs2 b/dumps/scripts/3728.cs2 new file mode 100644 index 000000000..cf3507b8c --- /dev/null +++ b/dumps/scripts/3728.cs2 @@ -0,0 +1,4 @@ +void script_3728() { + script_304(49244283); + return; +} diff --git a/dumps/scripts/3729.cs2 b/dumps/scripts/3729.cs2 new file mode 100644 index 000000000..c54ac0e53 --- /dev/null +++ b/dumps/scripts/3729.cs2 @@ -0,0 +1,4 @@ +void script_3729() { + script_304(61410205); + return; +} diff --git a/dumps/scripts/373.cs2 b/dumps/scripts/373.cs2 new file mode 100644 index 000000000..27237fbfc --- /dev/null +++ b/dumps/scripts/373.cs2 @@ -0,0 +1,36 @@ +void script_373(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + ivar5 = -1; + if (arg1 == -1) { + ivar5 = getWidgetParentId(new WidgetPointer(arg0)); + } else { + ivar5 = arg0; + } + if (((boolean)arg4)) { + flow_4: + IF (arg1 == -1) + GOTO flow_5 + GOTO flow_6 + flow_5: + IF (setWidgetRegister(new WidgetPointer(arg0))) + GOTO flow_7 + flow_6: + IF (setWidgetRegister(new WidgetPointer(arg0), arg1)) + GOTO flow_7 + GOTO flow_8 + flow_7: + createExtraChild(new WidgetPointer(ivar5), 3, arg2); + setWidgetSize(subtract(getWidgetActualWidth(), multiply(arg3, 2)), subtract(getWidgetActualHeight(), multiply(arg3, 2)), 0, 0); + setWidgetPosition(add(getWidgetActualX(), arg3), add(getWidgetActualY(), arg3), 0, 0); + setWidgetRGB(new Color(255, 255, 255)); + cs2method2103(200); + setWidgetFilled(1); + flow_8: + } else { + if (setWidgetRegister(new WidgetPointer(ivar5), arg2)) { + deleteExtraChild(); + } + script_383(); + } + return; +} diff --git a/dumps/scripts/3730.cs2 b/dumps/scripts/3730.cs2 new file mode 100644 index 000000000..35baa8e64 --- /dev/null +++ b/dumps/scripts/3730.cs2 @@ -0,0 +1,4 @@ +void script_3730() { + script_304(49440777); + return; +} diff --git a/dumps/scripts/3731.cs2 b/dumps/scripts/3731.cs2 new file mode 100644 index 000000000..ca8cad239 --- /dev/null +++ b/dumps/scripts/3731.cs2 @@ -0,0 +1,4 @@ +void script_3731() { + script_304(62606326); + return; +} diff --git a/dumps/scripts/3732.cs2 b/dumps/scripts/3732.cs2 new file mode 100644 index 000000000..53d081aa8 --- /dev/null +++ b/dumps/scripts/3732.cs2 @@ -0,0 +1,4 @@ +void script_3732() { + script_304(50309136); + return; +} diff --git a/dumps/scripts/3733.cs2 b/dumps/scripts/3733.cs2 new file mode 100644 index 000000000..4a35c75ae --- /dev/null +++ b/dumps/scripts/3733.cs2 @@ -0,0 +1,4 @@ +void script_3733() { + script_304(49286222); + return; +} diff --git a/dumps/scripts/3734.cs2 b/dumps/scripts/3734.cs2 new file mode 100644 index 000000000..9b1269480 --- /dev/null +++ b/dumps/scripts/3734.cs2 @@ -0,0 +1,4 @@ +void script_3734() { + script_304(53159478); + return; +} diff --git a/dumps/scripts/3735.cs2 b/dumps/scripts/3735.cs2 new file mode 100644 index 000000000..a71d45a2a --- /dev/null +++ b/dumps/scripts/3735.cs2 @@ -0,0 +1,4 @@ +void script_3735() { + script_304(49450144); + return; +} diff --git a/dumps/scripts/3736.cs2 b/dumps/scripts/3736.cs2 new file mode 100644 index 000000000..0ae5783c9 --- /dev/null +++ b/dumps/scripts/3736.cs2 @@ -0,0 +1,4 @@ +void script_3736() { + script_304(62612726); + return; +} diff --git a/dumps/scripts/3737.cs2 b/dumps/scripts/3737.cs2 new file mode 100644 index 000000000..41de328c4 --- /dev/null +++ b/dumps/scripts/3737.cs2 @@ -0,0 +1,4 @@ +void script_3737() { + script_304(47926450); + return; +} diff --git a/dumps/scripts/3738.cs2 b/dumps/scripts/3738.cs2 new file mode 100644 index 000000000..f61a9fcd4 --- /dev/null +++ b/dumps/scripts/3738.cs2 @@ -0,0 +1,4 @@ +void script_3738() { + script_304(45885335); + return; +} diff --git a/dumps/scripts/3739.cs2 b/dumps/scripts/3739.cs2 new file mode 100644 index 000000000..fd274394b --- /dev/null +++ b/dumps/scripts/3739.cs2 @@ -0,0 +1,4 @@ +void script_3739() { + script_304(41307804); + return; +} diff --git a/dumps/scripts/374.cs2 b/dumps/scripts/374.cs2 new file mode 100644 index 000000000..d6c23de2f --- /dev/null +++ b/dumps/scripts/374.cs2 @@ -0,0 +1,11 @@ +void script_374(int arg0,int arg1,string arg2) { + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(1, 1, 1, 1); + setWidgetFont(3793); + setWidgetRGB(new Color(205, 190, 154)); + setWidgetUnknownBoolean(false); + setWidgetTextAlignment(1, 1, arg1); + setWidgetText(arg2); + return; +} diff --git a/dumps/scripts/3740.cs2 b/dumps/scripts/3740.cs2 new file mode 100644 index 000000000..a70058b7a --- /dev/null +++ b/dumps/scripts/3740.cs2 @@ -0,0 +1,4 @@ +void script_3740() { + script_304(48909554); + return; +} diff --git a/dumps/scripts/3741.cs2 b/dumps/scripts/3741.cs2 new file mode 100644 index 000000000..882085e11 --- /dev/null +++ b/dumps/scripts/3741.cs2 @@ -0,0 +1,4 @@ +void script_3741() { + script_304(41651869); + return; +} diff --git a/dumps/scripts/3742.cs2 b/dumps/scripts/3742.cs2 new file mode 100644 index 000000000..f4ce63054 --- /dev/null +++ b/dumps/scripts/3742.cs2 @@ -0,0 +1,4 @@ +void script_3742() { + script_304(51285508); + return; +} diff --git a/dumps/scripts/3743.cs2 b/dumps/scripts/3743.cs2 new file mode 100644 index 000000000..0f377e26d --- /dev/null +++ b/dumps/scripts/3743.cs2 @@ -0,0 +1,4 @@ +void script_3743() { + script_304(41061938); + return; +} diff --git a/dumps/scripts/3744.cs2 b/dumps/scripts/3744.cs2 new file mode 100644 index 000000000..4495e132d --- /dev/null +++ b/dumps/scripts/3744.cs2 @@ -0,0 +1,4 @@ +void script_3744() { + script_304(50089438); + return; +} diff --git a/dumps/scripts/3745.cs2 b/dumps/scripts/3745.cs2 new file mode 100644 index 000000000..0d6f014c1 --- /dev/null +++ b/dumps/scripts/3745.cs2 @@ -0,0 +1,4 @@ +void script_3745() { + script_304(52874276); + return; +} diff --git a/dumps/scripts/3746.cs2 b/dumps/scripts/3746.cs2 new file mode 100644 index 000000000..8ee990a93 --- /dev/null +++ b/dumps/scripts/3746.cs2 @@ -0,0 +1,4 @@ +void script_3746() { + script_304(51105268); + return; +} diff --git a/dumps/scripts/3747.cs2 b/dumps/scripts/3747.cs2 new file mode 100644 index 000000000..55b51393a --- /dev/null +++ b/dumps/scripts/3747.cs2 @@ -0,0 +1,4 @@ +void script_3747() { + script_304(47254853); + return; +} diff --git a/dumps/scripts/3748.cs2 b/dumps/scripts/3748.cs2 new file mode 100644 index 000000000..dfd95f437 --- /dev/null +++ b/dumps/scripts/3748.cs2 @@ -0,0 +1,4 @@ +void script_3748() { + script_304(52039168); + return; +} diff --git a/dumps/scripts/3749.cs2 b/dumps/scripts/3749.cs2 new file mode 100644 index 000000000..79db3bb9f --- /dev/null +++ b/dumps/scripts/3749.cs2 @@ -0,0 +1,4 @@ +void script_3749() { + script_304(46566752); + return; +} diff --git a/dumps/scripts/375.cs2 b/dumps/scripts/375.cs2 new file mode 100644 index 000000000..36c6d380f --- /dev/null +++ b/dumps/scripts/375.cs2 @@ -0,0 +1,4 @@ +void script_375(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + script_376(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + return; +} diff --git a/dumps/scripts/3750.cs2 b/dumps/scripts/3750.cs2 new file mode 100644 index 000000000..51d07039b --- /dev/null +++ b/dumps/scripts/3750.cs2 @@ -0,0 +1,4 @@ +void script_3750() { + script_304(51858922); + return; +} diff --git a/dumps/scripts/3751.cs2 b/dumps/scripts/3751.cs2 new file mode 100644 index 000000000..c221620c9 --- /dev/null +++ b/dumps/scripts/3751.cs2 @@ -0,0 +1,4 @@ +void script_3751() { + script_304(50678936); + return; +} diff --git a/dumps/scripts/3752.cs2 b/dumps/scripts/3752.cs2 new file mode 100644 index 000000000..e49a57459 --- /dev/null +++ b/dumps/scripts/3752.cs2 @@ -0,0 +1,4 @@ +void script_3752() { + script_304(50482525); + return; +} diff --git a/dumps/scripts/3753.cs2 b/dumps/scripts/3753.cs2 new file mode 100644 index 000000000..2898b8ccf --- /dev/null +++ b/dumps/scripts/3753.cs2 @@ -0,0 +1,4 @@ +void script_3753() { + script_304(50597363); + return; +} diff --git a/dumps/scripts/3754.cs2 b/dumps/scripts/3754.cs2 new file mode 100644 index 000000000..c1f8562b1 --- /dev/null +++ b/dumps/scripts/3754.cs2 @@ -0,0 +1,4 @@ +void script_3754() { + script_304(50744716); + return; +} diff --git a/dumps/scripts/3755.cs2 b/dumps/scripts/3755.cs2 new file mode 100644 index 000000000..417ad542a --- /dev/null +++ b/dumps/scripts/3755.cs2 @@ -0,0 +1,4 @@ +void script_3755() { + script_304(51055996); + return; +} diff --git a/dumps/scripts/3756.cs2 b/dumps/scripts/3756.cs2 new file mode 100644 index 000000000..00eabb2b0 --- /dev/null +++ b/dumps/scripts/3756.cs2 @@ -0,0 +1,4 @@ +void script_3756() { + script_304(53038466); + return; +} diff --git a/dumps/scripts/3757.cs2 b/dumps/scripts/3757.cs2 new file mode 100644 index 000000000..2490baf5e --- /dev/null +++ b/dumps/scripts/3757.cs2 @@ -0,0 +1,4 @@ +void script_3757() { + script_304(53153079); + return; +} diff --git a/dumps/scripts/3758.cs2 b/dumps/scripts/3758.cs2 new file mode 100644 index 000000000..2a996c013 --- /dev/null +++ b/dumps/scripts/3758.cs2 @@ -0,0 +1,4 @@ +void script_3758() { + script_304(52268315); + return; +} diff --git a/dumps/scripts/3759.cs2 b/dumps/scripts/3759.cs2 new file mode 100644 index 000000000..a7f8f088b --- /dev/null +++ b/dumps/scripts/3759.cs2 @@ -0,0 +1,4 @@ +void script_3759() { + script_304(50662690); + return; +} diff --git a/dumps/scripts/376.cs2 b/dumps/scripts/376.cs2 new file mode 100644 index 000000000..f8cca224a --- /dev/null +++ b/dumps/scripts/376.cs2 @@ -0,0 +1,66 @@ +void script_376(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int stack_dump0; + if (arg1 == -1) { + createExtraChild(new WidgetPointer(arg0), 3, arg6); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 1)); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 2)); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 3)); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 4)); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 5)); + setWidgetHidden(1); + return; + } + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + if (setWidgetRegister(new WidgetPointer(arg1), arg2) || ((arg2 == -1) && setWidgetRegister(new WidgetPointer(arg1)))) { + stack_dump0 = subtract(getWidgetActualX(), arg5); + ivar8 = subtract(getWidgetActualY(), arg5); + ivar7 = stack_dump0; + ivar9 = min(add(getWidgetActualWidth(), multiply(arg5, 2)), getWidgetActualWidth(new WidgetPointer(arg0))); + ivar10 = add(getWidgetActualHeight(), multiply(arg5, 2)); + } else { + return; + } + createExtraChild(new WidgetPointer(arg0), 3, arg6); + setWidgetSize(subtract(ivar9, 2), 2, 0, 0); + setWidgetPosition(add(ivar7, 1), ivar8, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(arg3)); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 1)); + setWidgetSize(subtract(ivar9, 2), 2, 0, 0); + setWidgetPosition(add(ivar7, 1), subtract(add(ivar8, ivar10), 2), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(arg4)); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 2)); + setWidgetSize(2, subtract(ivar10, 2), 0, 0); + setWidgetPosition(ivar7, add(ivar8, 1), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(arg4)); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 3)); + setWidgetSize(2, subtract(ivar10, 2), 0, 0); + setWidgetPosition(subtract(add(ivar7, ivar9), 2), add(ivar8, 1), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(arg4)); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 4)); + setWidgetSize(2, divide(subtract(ivar10, 2), 2), 0, 0); + setWidgetPosition(ivar7, add(ivar8, 1), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(arg3)); + createExtraChild(new WidgetPointer(arg0), 3, add(arg6, 5)); + setWidgetSize(2, divide(subtract(ivar10, 2), 2), 0, 0); + setWidgetPosition(subtract(add(ivar7, ivar9), 2), add(ivar8, 1), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(arg3)); + return; +} diff --git a/dumps/scripts/3760.cs2 b/dumps/scripts/3760.cs2 new file mode 100644 index 000000000..ca8d97401 --- /dev/null +++ b/dumps/scripts/3760.cs2 @@ -0,0 +1,4 @@ +void script_3760() { + script_304(51039517); + return; +} diff --git a/dumps/scripts/3761.cs2 b/dumps/scripts/3761.cs2 new file mode 100644 index 000000000..a3c272884 --- /dev/null +++ b/dumps/scripts/3761.cs2 @@ -0,0 +1,4 @@ +void script_3761() { + script_304(50531528); + return; +} diff --git a/dumps/scripts/3762.cs2 b/dumps/scripts/3762.cs2 new file mode 100644 index 000000000..c381cd0a9 --- /dev/null +++ b/dumps/scripts/3762.cs2 @@ -0,0 +1,4 @@ +void script_3762() { + script_304(51088556); + return; +} diff --git a/dumps/scripts/3763.cs2 b/dumps/scripts/3763.cs2 new file mode 100644 index 000000000..0440f1abe --- /dev/null +++ b/dumps/scripts/3763.cs2 @@ -0,0 +1,4 @@ +void script_3763() { + script_304(51596469); + return; +} diff --git a/dumps/scripts/3764.cs2 b/dumps/scripts/3764.cs2 new file mode 100644 index 000000000..1b6d565fb --- /dev/null +++ b/dumps/scripts/3764.cs2 @@ -0,0 +1,4 @@ +void script_3764() { + script_304(52579472); + return; +} diff --git a/dumps/scripts/3765.cs2 b/dumps/scripts/3765.cs2 new file mode 100644 index 000000000..354873356 --- /dev/null +++ b/dumps/scripts/3765.cs2 @@ -0,0 +1,4 @@ +void script_3765() { + script_304(45028607); + return; +} diff --git a/dumps/scripts/3766.cs2 b/dumps/scripts/3766.cs2 new file mode 100644 index 000000000..2c047073e --- /dev/null +++ b/dumps/scripts/3766.cs2 @@ -0,0 +1,4 @@ +void script_3766() { + script_304(50842728); + return; +} diff --git a/dumps/scripts/3767.cs2 b/dumps/scripts/3767.cs2 new file mode 100644 index 000000000..1bb7f6d89 --- /dev/null +++ b/dumps/scripts/3767.cs2 @@ -0,0 +1,4 @@ +void script_3767() { + script_304(50417032); + return; +} diff --git a/dumps/scripts/3768.cs2 b/dumps/scripts/3768.cs2 new file mode 100644 index 000000000..a5644f9ea --- /dev/null +++ b/dumps/scripts/3768.cs2 @@ -0,0 +1,4 @@ +void script_3768() { + script_304(50367872); + return; +} diff --git a/dumps/scripts/3769.cs2 b/dumps/scripts/3769.cs2 new file mode 100644 index 000000000..09a4f1b90 --- /dev/null +++ b/dumps/scripts/3769.cs2 @@ -0,0 +1,4 @@ +void script_3769() { + script_304(50548092); + return; +} diff --git a/dumps/scripts/377.cs2 b/dumps/scripts/377.cs2 new file mode 100644 index 000000000..65d1d0d41 --- /dev/null +++ b/dumps/scripts/377.cs2 @@ -0,0 +1,22 @@ +void script_377(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 1))) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 2))) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 3))) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 4))) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 5))) { + deleteExtraChild(); + } + script_383(); + return; +} diff --git a/dumps/scripts/3770.cs2 b/dumps/scripts/3770.cs2 new file mode 100644 index 000000000..9755708f9 --- /dev/null +++ b/dumps/scripts/3770.cs2 @@ -0,0 +1,4 @@ +void script_3770() { + script_304(46206364); + return; +} diff --git a/dumps/scripts/3771.cs2 b/dumps/scripts/3771.cs2 new file mode 100644 index 000000000..0708ccc0e --- /dev/null +++ b/dumps/scripts/3771.cs2 @@ -0,0 +1,4 @@ +void script_3771() { + script_304(47140248); + return; +} diff --git a/dumps/scripts/3772.cs2 b/dumps/scripts/3772.cs2 new file mode 100644 index 000000000..2ac5a2367 --- /dev/null +++ b/dumps/scripts/3772.cs2 @@ -0,0 +1,4 @@ +void script_3772() { + script_304(47720380); + return; +} diff --git a/dumps/scripts/3773.cs2 b/dumps/scripts/3773.cs2 new file mode 100644 index 000000000..ecbe34ff1 --- /dev/null +++ b/dumps/scripts/3773.cs2 @@ -0,0 +1,4 @@ +void script_3773() { + script_304(47386035); + return; +} diff --git a/dumps/scripts/3774.cs2 b/dumps/scripts/3774.cs2 new file mode 100644 index 000000000..cf7c0f3a8 --- /dev/null +++ b/dumps/scripts/3774.cs2 @@ -0,0 +1,4 @@ +void script_3774() { + script_304(46566848); + return; +} diff --git a/dumps/scripts/3775.cs2 b/dumps/scripts/3775.cs2 new file mode 100644 index 000000000..f8a3aaa72 --- /dev/null +++ b/dumps/scripts/3775.cs2 @@ -0,0 +1,4 @@ +void script_3775() { + script_304(48653768); + return; +} diff --git a/dumps/scripts/3776.cs2 b/dumps/scripts/3776.cs2 new file mode 100644 index 000000000..a51d7e0f6 --- /dev/null +++ b/dumps/scripts/3776.cs2 @@ -0,0 +1,4 @@ +void script_3776() { + script_304(49450762); + return; +} diff --git a/dumps/scripts/3777.cs2 b/dumps/scripts/3777.cs2 new file mode 100644 index 000000000..dbefdc0fa --- /dev/null +++ b/dumps/scripts/3777.cs2 @@ -0,0 +1,4 @@ +void script_3777() { + script_304(50286352); + return; +} diff --git a/dumps/scripts/3778.cs2 b/dumps/scripts/3778.cs2 new file mode 100644 index 000000000..c0ea03ca2 --- /dev/null +++ b/dumps/scripts/3778.cs2 @@ -0,0 +1,4 @@ +void script_3778() { + script_304(50630516); + return; +} diff --git a/dumps/scripts/3779.cs2 b/dumps/scripts/3779.cs2 new file mode 100644 index 000000000..8ffbda579 --- /dev/null +++ b/dumps/scripts/3779.cs2 @@ -0,0 +1,4 @@ +void script_3779() { + script_304(49237883); + return; +} diff --git a/dumps/scripts/378.cs2 b/dumps/scripts/378.cs2 new file mode 100644 index 000000000..31b3912cf --- /dev/null +++ b/dumps/scripts/378.cs2 @@ -0,0 +1,6 @@ +void script_378(int arg0,int arg1,int arg2,string arg3) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1) || ((arg1 == -1) && setWidgetRegister(new WidgetPointer(arg0)))) { + script_379(script_1743(), getWidgetActualWidth(), script_1744(), arg2, arg3); + } + return; +} diff --git a/dumps/scripts/3780.cs2 b/dumps/scripts/3780.cs2 new file mode 100644 index 000000000..7b88eca2e --- /dev/null +++ b/dumps/scripts/3780.cs2 @@ -0,0 +1,4 @@ +void script_3780() { + script_304(49893206); + return; +} diff --git a/dumps/scripts/3781.cs2 b/dumps/scripts/3781.cs2 new file mode 100644 index 000000000..f7da7f229 --- /dev/null +++ b/dumps/scripts/3781.cs2 @@ -0,0 +1,4 @@ +void script_3781() { + script_304(54371714); + return; +} diff --git a/dumps/scripts/3782.cs2 b/dumps/scripts/3782.cs2 new file mode 100644 index 000000000..cec41a2eb --- /dev/null +++ b/dumps/scripts/3782.cs2 @@ -0,0 +1,4 @@ +void script_3782() { + script_304(42093619); + return; +} diff --git a/dumps/scripts/3783.cs2 b/dumps/scripts/3783.cs2 new file mode 100644 index 000000000..e7fa79e78 --- /dev/null +++ b/dumps/scripts/3783.cs2 @@ -0,0 +1,4 @@ +void script_3783() { + script_304(42650630); + return; +} diff --git a/dumps/scripts/3784.cs2 b/dumps/scripts/3784.cs2 new file mode 100644 index 000000000..1a3d5eeae --- /dev/null +++ b/dumps/scripts/3784.cs2 @@ -0,0 +1,4 @@ +void script_3784() { + script_304(45813279); + return; +} diff --git a/dumps/scripts/3785.cs2 b/dumps/scripts/3785.cs2 new file mode 100644 index 000000000..b2feda0fe --- /dev/null +++ b/dumps/scripts/3785.cs2 @@ -0,0 +1,4 @@ +void script_3785() { + script_304(60313041); + return; +} diff --git a/dumps/scripts/3786.cs2 b/dumps/scripts/3786.cs2 new file mode 100644 index 000000000..d17f8328c --- /dev/null +++ b/dumps/scripts/3786.cs2 @@ -0,0 +1,4 @@ +void script_3786(int arg0,int arg1) { + script_311(arg0, arg1, "Stagnant water"); + return; +} diff --git a/dumps/scripts/3787.cs2 b/dumps/scripts/3787.cs2 new file mode 100644 index 000000000..8a762d95b --- /dev/null +++ b/dumps/scripts/3787.cs2 @@ -0,0 +1,4 @@ +void script_3787(int arg0,int arg1) { + script_311(arg0, arg1, "Stonemason"); + return; +} diff --git a/dumps/scripts/3788.cs2 b/dumps/scripts/3788.cs2 new file mode 100644 index 000000000..dc6129126 --- /dev/null +++ b/dumps/scripts/3788.cs2 @@ -0,0 +1,4 @@ +void script_3788(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(410, 596)); + return; +} diff --git a/dumps/scripts/3789.cs2 b/dumps/scripts/3789.cs2 new file mode 100644 index 000000000..2e5844a0a --- /dev/null +++ b/dumps/scripts/3789.cs2 @@ -0,0 +1,4 @@ +void script_3789(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(411, 596)); + return; +} diff --git a/dumps/scripts/379.cs2 b/dumps/scripts/379.cs2 new file mode 100644 index 000000000..e9f6c641b --- /dev/null +++ b/dumps/scripts/379.cs2 @@ -0,0 +1,110 @@ +void script_379(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int stack_dump0; + ivar4 = add(getClientCycle(), 25); + if (globalint_1 < ivar4) { + globalint_1 = max(getClientCycle(), add(globalint_1, 2)); + return; + } + globalint_1 = ivar4; + arg3 = max(min(arg3, arg1), 0); + stack_dump0 = arg0; + globalint_773 = arg1; + globalint_2 = stack_dump0; + ivar5 = 0; + if (isWidgetHidden(new WidgetPointer(1028,125))) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1028,125)), max(subtract(arg2, getWidgetActualHeight(new WidgetPointer(1028,125))), 0), 0, 0, new WidgetPointer(1028,125)); + if (setWidgetRegister(new WidgetPointer(1028,125), 9)) { + ivar5 = subtract(add(arg0, arg3), add(script_3365(67371133), divide(getWidgetActualWidth(), 2))); + setWidgetPosition(min(max(ivar5, 5), subtract(getWidgetActualWidth(new WidgetPointer(1028,125)), add(getWidgetActualWidth(), 5))), 0, 0, 2); + } + return; + } + setWidgetIsHidden(false, new WidgetPointer(1028,125)); + deleteAllExtraChilds(new WidgetPointer(1028,125)); + ivar6 = getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(1028,29)), 495, arg4); + ivar7 = add(multiply(getLineCount(ivar6, 495, arg4), 12), 3); + ivar8 = max(add(ivar6, 8), 45); + ivar9 = add(ivar7, 18); + ivar10 = max(subtract(ivar8, 14), 0); + ivar11 = max(subtract(ivar9, 25), 0); + setWidgetSize(ivar8, ivar9, 0, 0, new WidgetPointer(1028,125)); + createExtraChild(new WidgetPointer(1028,125), 3, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(ivar10, ivar11, 0, 0); + setWidgetPosition(0, 7, 1, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(227, 226, 225)); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(ivar10, 7, 0, 0); + setWidgetPosition(0, 0, 1, 0); + cs2method1107(1); + setWidgetSprite(3476); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(ivar10, 7, 0, 0); + setWidgetPosition(0, 11, 1, 2); + cs2method1107(1); + setWidgetVFlip(1); + setWidgetSprite(3476); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, ivar11, 0, 0); + setWidgetPosition(0, 7, 0, 0); + cs2method1107(1); + setWidgetSprite(3475); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, ivar11, 0, 0); + setWidgetPosition(0, 7, 2, 0); + cs2method1107(1); + setWidgetHFlip(1); + setWidgetSprite(3475); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, 7, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(3474); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, 7, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetHFlip(1); + setWidgetSprite(3474); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, 7, 0, 0); + setWidgetPosition(0, 11, 0, 2); + setWidgetVFlip(1); + setWidgetSprite(3474); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, 7, 0, 0); + setWidgetPosition(0, 11, 2, 2); + setWidgetHFlip(1); + setWidgetVFlip(1); + setWidgetSprite(3474); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(11, 12, 0, 0); + setWidgetSprite(3473); + createExtraChild(new WidgetPointer(1028,125), 4, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(ivar6, ivar7, 0, 0); + setWidgetPosition(0, 3, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(3793); + setWidgetTextAlignment(1, 0, 0); + setWidgetText(arg4); + ivar10 = divide(ivar8, 2); + ivar5 = subtract(add(arg0, arg3), ivar10); + ivar12 = 0; + if (ivar5 < 0) { + ivar12 = subtract(0, ivar5); + } else { + if (add(ivar5, ivar8) > getWidgetActualWidth(new WidgetPointer(1028,28))) { + ivar12 = subtract(getWidgetActualWidth(new WidgetPointer(1028,28)), add(ivar5, ivar8)); + } + } + setWidgetPosition(add(ivar5, ivar12), max(subtract(arg2, ivar9), 0), 0, 0, new WidgetPointer(1028,125)); + setWidgetPosition(subtract(0, ivar12), 0, 1, 2); + return; +} diff --git a/dumps/scripts/3790.cs2 b/dumps/scripts/3790.cs2 new file mode 100644 index 000000000..2cf390b4a --- /dev/null +++ b/dumps/scripts/3790.cs2 @@ -0,0 +1,4 @@ +void script_3790(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(412, 596)); + return; +} diff --git a/dumps/scripts/3791.cs2 b/dumps/scripts/3791.cs2 new file mode 100644 index 000000000..1815f3864 --- /dev/null +++ b/dumps/scripts/3791.cs2 @@ -0,0 +1,4 @@ +void script_3791(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(413, 596)); + return; +} diff --git a/dumps/scripts/3792.cs2 b/dumps/scripts/3792.cs2 new file mode 100644 index 000000000..57fc02629 --- /dev/null +++ b/dumps/scripts/3792.cs2 @@ -0,0 +1,4 @@ +void script_3792(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(414, 596)); + return; +} diff --git a/dumps/scripts/3793.cs2 b/dumps/scripts/3793.cs2 new file mode 100644 index 000000000..2c5ec9c4c --- /dev/null +++ b/dumps/scripts/3793.cs2 @@ -0,0 +1,4 @@ +void script_3793(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(415, 596)); + return; +} diff --git a/dumps/scripts/3794.cs2 b/dumps/scripts/3794.cs2 new file mode 100644 index 000000000..c83b71023 --- /dev/null +++ b/dumps/scripts/3794.cs2 @@ -0,0 +1,4 @@ +void script_3794(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(416, 596)); + return; +} diff --git a/dumps/scripts/3795.cs2 b/dumps/scripts/3795.cs2 new file mode 100644 index 000000000..e270dcfa0 --- /dev/null +++ b/dumps/scripts/3795.cs2 @@ -0,0 +1,4 @@ +void script_3795(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(418, 596)); + return; +} diff --git a/dumps/scripts/3796.cs2 b/dumps/scripts/3796.cs2 new file mode 100644 index 000000000..4b73fb724 --- /dev/null +++ b/dumps/scripts/3796.cs2 @@ -0,0 +1,4 @@ +void script_3796(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(419, 596)); + return; +} diff --git a/dumps/scripts/3797.cs2 b/dumps/scripts/3797.cs2 new file mode 100644 index 000000000..6cad70c9f --- /dev/null +++ b/dumps/scripts/3797.cs2 @@ -0,0 +1,4 @@ +void script_3797(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(420, 596)); + return; +} diff --git a/dumps/scripts/3798.cs2 b/dumps/scripts/3798.cs2 new file mode 100644 index 000000000..567b3c05d --- /dev/null +++ b/dumps/scripts/3798.cs2 @@ -0,0 +1,4 @@ +void script_3798(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(421, 596)); + return; +} diff --git a/dumps/scripts/3799.cs2 b/dumps/scripts/3799.cs2 new file mode 100644 index 000000000..1bbc9b302 --- /dev/null +++ b/dumps/scripts/3799.cs2 @@ -0,0 +1,4 @@ +void script_3799(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(422, 596)); + return; +} diff --git a/dumps/scripts/38.cs2 b/dumps/scripts/38.cs2 new file mode 100644 index 000000000..e8a037629 --- /dev/null +++ b/dumps/scripts/38.cs2 @@ -0,0 +1,4 @@ +void script_38(int arg0,int arg1,int arg2,int arg3,string arg4) { + script_569(arg0, -1, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/380.cs2 b/dumps/scripts/380.cs2 new file mode 100644 index 000000000..efddc1303 --- /dev/null +++ b/dumps/scripts/380.cs2 @@ -0,0 +1,4 @@ +void script_380() { + script_304(40637496); + return; +} diff --git a/dumps/scripts/3800.cs2 b/dumps/scripts/3800.cs2 new file mode 100644 index 000000000..30cca26c5 --- /dev/null +++ b/dumps/scripts/3800.cs2 @@ -0,0 +1,4 @@ +void script_3800(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(423, 596)); + return; +} diff --git a/dumps/scripts/3801.cs2 b/dumps/scripts/3801.cs2 new file mode 100644 index 000000000..63928f6d0 --- /dev/null +++ b/dumps/scripts/3801.cs2 @@ -0,0 +1,4 @@ +void script_3801(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(424, 596)); + return; +} diff --git a/dumps/scripts/3802.cs2 b/dumps/scripts/3802.cs2 new file mode 100644 index 000000000..12198c0fc --- /dev/null +++ b/dumps/scripts/3802.cs2 @@ -0,0 +1,4 @@ +void script_3802(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(425, 596)); + return; +} diff --git a/dumps/scripts/3803.cs2 b/dumps/scripts/3803.cs2 new file mode 100644 index 000000000..408900dd1 --- /dev/null +++ b/dumps/scripts/3803.cs2 @@ -0,0 +1,4 @@ +void script_3803(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(426, 596)); + return; +} diff --git a/dumps/scripts/3804.cs2 b/dumps/scripts/3804.cs2 new file mode 100644 index 000000000..c31472ed8 --- /dev/null +++ b/dumps/scripts/3804.cs2 @@ -0,0 +1,4 @@ +void script_3804(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(427, 596)); + return; +} diff --git a/dumps/scripts/3805.cs2 b/dumps/scripts/3805.cs2 new file mode 100644 index 000000000..5ed714ccf --- /dev/null +++ b/dumps/scripts/3805.cs2 @@ -0,0 +1,4 @@ +void script_3805(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(428, 596)); + return; +} diff --git a/dumps/scripts/3806.cs2 b/dumps/scripts/3806.cs2 new file mode 100644 index 000000000..0808f91b5 --- /dev/null +++ b/dumps/scripts/3806.cs2 @@ -0,0 +1,4 @@ +void script_3806(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(429, 596)); + return; +} diff --git a/dumps/scripts/3807.cs2 b/dumps/scripts/3807.cs2 new file mode 100644 index 000000000..9e7ba02b8 --- /dev/null +++ b/dumps/scripts/3807.cs2 @@ -0,0 +1,4 @@ +void script_3807(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(430, 596)); + return; +} diff --git a/dumps/scripts/3808.cs2 b/dumps/scripts/3808.cs2 new file mode 100644 index 000000000..b6c378ff3 --- /dev/null +++ b/dumps/scripts/3808.cs2 @@ -0,0 +1,4 @@ +void script_3808(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(431, 596)); + return; +} diff --git a/dumps/scripts/3809.cs2 b/dumps/scripts/3809.cs2 new file mode 100644 index 000000000..dc4b8789c --- /dev/null +++ b/dumps/scripts/3809.cs2 @@ -0,0 +1,4 @@ +void script_3809(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(432, 596)); + return; +} diff --git a/dumps/scripts/381.cs2 b/dumps/scripts/381.cs2 new file mode 100644 index 000000000..793003483 --- /dev/null +++ b/dumps/scripts/381.cs2 @@ -0,0 +1,100 @@ +void script_381(int arg0,int arg1,int arg2,string arg3) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int stack_dump0; + ivar3 = add(getClientCycle(), 25); + if (globalint_1 < ivar3) { + globalint_1 = max(getClientCycle(), add(globalint_1, 2)); + return; + } + globalint_1 = ivar3; + if (isWidgetHidden(new WidgetPointer(1028,125))) { + return; + } + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1) || ((arg1 == -1) && setWidgetRegister(new WidgetPointer(arg0)))) { + stack_dump0 = script_1743(); + globalint_773 = getWidgetActualWidth(); + globalint_2 = stack_dump0; + arg2 = max(min(arg2, getWidgetActualHeight()), 0); + ivar4 = add(script_1744(), arg2); + } else { + return; + } + setWidgetIsHidden(false, new WidgetPointer(1028,125)); + deleteAllExtraChilds(new WidgetPointer(1028,125)); + ivar5 = getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(1028,29)), 495, arg3); + ivar6 = add(multiply(getLineCount(ivar5, 495, arg3), 12), 5); + ivar7 = add(ivar5, 19); + ivar8 = max(add(ivar6, 8), 17); + ivar9 = max(subtract(ivar7, 25), 0); + ivar10 = max(subtract(ivar8, 14), 0); + setWidgetSize(ivar7, ivar8, 0, 0, new WidgetPointer(1028,125)); + setWidgetPosition(subtract(globalint_2, ivar7), subtract(ivar4, divide(ivar8, 2)), 0, 0, new WidgetPointer(1028,125)); + createExtraChild(new WidgetPointer(1028,125), 3, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(ivar9, ivar10, 0, 0); + setWidgetPosition(7, 0, 0, 1); + setWidgetFilled(1); + setWidgetRGB(new Color(227, 226, 225)); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(ivar9, 7, 0, 0); + setWidgetPosition(7, 0, 0, 0); + cs2method1107(1); + setWidgetSprite(3476); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(ivar9, 7, 0, 0); + setWidgetPosition(7, 0, 0, 2); + cs2method1107(1); + setWidgetVFlip(1); + setWidgetSprite(3476); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, ivar10, 0, 0); + setWidgetPosition(0, 0, 0, 1); + cs2method1107(1); + setWidgetSprite(3475); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, ivar10, 0, 0); + setWidgetPosition(12, 0, 2, 1); + cs2method1107(1); + setWidgetHFlip(1); + setWidgetSprite(3475); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, 7, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(3474); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, 7, 0, 0); + setWidgetPosition(12, 0, 2, 0); + setWidgetHFlip(1); + setWidgetSprite(3474); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, 7, 0, 0); + setWidgetPosition(0, 0, 0, 2); + setWidgetVFlip(1); + setWidgetSprite(3474); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(7, 7, 0, 0); + setWidgetPosition(12, 0, 2, 2); + setWidgetHFlip(1); + setWidgetVFlip(1); + setWidgetSprite(3474); + createExtraChild(new WidgetPointer(1028,125), 5, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(12, 11, 0, 0); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(3473); + cs2method1106(16384); + createExtraChild(new WidgetPointer(1028,125), 4, getExtraChildGap(new WidgetPointer(1028,125))); + setWidgetSize(ivar5, ivar6, 0, 0); + setWidgetPosition(3, 0, 0, 1); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFont(3793); + setWidgetTextAlignment(1, 0, 0); + setWidgetText(arg3); + return; +} diff --git a/dumps/scripts/3810.cs2 b/dumps/scripts/3810.cs2 new file mode 100644 index 000000000..66069684f --- /dev/null +++ b/dumps/scripts/3810.cs2 @@ -0,0 +1,4 @@ +void script_3810(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(433, 596)); + return; +} diff --git a/dumps/scripts/3811.cs2 b/dumps/scripts/3811.cs2 new file mode 100644 index 000000000..5c6bb97dd --- /dev/null +++ b/dumps/scripts/3811.cs2 @@ -0,0 +1,4 @@ +void script_3811(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(434, 596)); + return; +} diff --git a/dumps/scripts/3812.cs2 b/dumps/scripts/3812.cs2 new file mode 100644 index 000000000..8818f0b16 --- /dev/null +++ b/dumps/scripts/3812.cs2 @@ -0,0 +1,4 @@ +void script_3812(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(435, 596)); + return; +} diff --git a/dumps/scripts/3813.cs2 b/dumps/scripts/3813.cs2 new file mode 100644 index 000000000..18db6b995 --- /dev/null +++ b/dumps/scripts/3813.cs2 @@ -0,0 +1,4 @@ +void script_3813(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(436, 596)); + return; +} diff --git a/dumps/scripts/3814.cs2 b/dumps/scripts/3814.cs2 new file mode 100644 index 000000000..aef0d8e95 --- /dev/null +++ b/dumps/scripts/3814.cs2 @@ -0,0 +1,4 @@ +void script_3814(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(437, 596)); + return; +} diff --git a/dumps/scripts/3815.cs2 b/dumps/scripts/3815.cs2 new file mode 100644 index 000000000..ecba47ea5 --- /dev/null +++ b/dumps/scripts/3815.cs2 @@ -0,0 +1,4 @@ +void script_3815(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(438, 596)); + return; +} diff --git a/dumps/scripts/3816.cs2 b/dumps/scripts/3816.cs2 new file mode 100644 index 000000000..cf3e8ecb5 --- /dev/null +++ b/dumps/scripts/3816.cs2 @@ -0,0 +1,4 @@ +void script_3816(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(439, 596)); + return; +} diff --git a/dumps/scripts/3817.cs2 b/dumps/scripts/3817.cs2 new file mode 100644 index 000000000..86c514b5d --- /dev/null +++ b/dumps/scripts/3817.cs2 @@ -0,0 +1,4 @@ +void script_3817(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(440, 596)); + return; +} diff --git a/dumps/scripts/3818.cs2 b/dumps/scripts/3818.cs2 new file mode 100644 index 000000000..158a273ec --- /dev/null +++ b/dumps/scripts/3818.cs2 @@ -0,0 +1,4 @@ +void script_3818(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(441, 596)); + return; +} diff --git a/dumps/scripts/3819.cs2 b/dumps/scripts/3819.cs2 new file mode 100644 index 000000000..a05b5f7d2 --- /dev/null +++ b/dumps/scripts/3819.cs2 @@ -0,0 +1,4 @@ +void script_3819(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(442, 596)); + return; +} diff --git a/dumps/scripts/382.cs2 b/dumps/scripts/382.cs2 new file mode 100644 index 000000000..5ab804665 --- /dev/null +++ b/dumps/scripts/382.cs2 @@ -0,0 +1,4 @@ +void script_382() { + script_383(); + return; +} diff --git a/dumps/scripts/3820.cs2 b/dumps/scripts/3820.cs2 new file mode 100644 index 000000000..b1ef93552 --- /dev/null +++ b/dumps/scripts/3820.cs2 @@ -0,0 +1,4 @@ +void script_3820(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(443, 596)); + return; +} diff --git a/dumps/scripts/3821.cs2 b/dumps/scripts/3821.cs2 new file mode 100644 index 000000000..d2511d83e --- /dev/null +++ b/dumps/scripts/3821.cs2 @@ -0,0 +1,4 @@ +void script_3821(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(444, 596)); + return; +} diff --git a/dumps/scripts/3822.cs2 b/dumps/scripts/3822.cs2 new file mode 100644 index 000000000..93a4584b8 --- /dev/null +++ b/dumps/scripts/3822.cs2 @@ -0,0 +1,4 @@ +void script_3822(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(445, 596)); + return; +} diff --git a/dumps/scripts/3823.cs2 b/dumps/scripts/3823.cs2 new file mode 100644 index 000000000..8550390df --- /dev/null +++ b/dumps/scripts/3823.cs2 @@ -0,0 +1,4 @@ +void script_3823(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(446, 596)); + return; +} diff --git a/dumps/scripts/3824.cs2 b/dumps/scripts/3824.cs2 new file mode 100644 index 000000000..3cf8dcf6c --- /dev/null +++ b/dumps/scripts/3824.cs2 @@ -0,0 +1,4 @@ +void script_3824(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(447, 596)); + return; +} diff --git a/dumps/scripts/3825.cs2 b/dumps/scripts/3825.cs2 new file mode 100644 index 000000000..2cb80629e --- /dev/null +++ b/dumps/scripts/3825.cs2 @@ -0,0 +1,4 @@ +void script_3825(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(448, 596)); + return; +} diff --git a/dumps/scripts/3826.cs2 b/dumps/scripts/3826.cs2 new file mode 100644 index 000000000..e9bceb07d --- /dev/null +++ b/dumps/scripts/3826.cs2 @@ -0,0 +1,4 @@ +void script_3826(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(449, 596)); + return; +} diff --git a/dumps/scripts/3827.cs2 b/dumps/scripts/3827.cs2 new file mode 100644 index 000000000..8f1c8c1b4 --- /dev/null +++ b/dumps/scripts/3827.cs2 @@ -0,0 +1,4 @@ +void script_3827(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(450, 596)); + return; +} diff --git a/dumps/scripts/3828.cs2 b/dumps/scripts/3828.cs2 new file mode 100644 index 000000000..cfc93e304 --- /dev/null +++ b/dumps/scripts/3828.cs2 @@ -0,0 +1,4 @@ +void script_3828(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(451, 596)); + return; +} diff --git a/dumps/scripts/3829.cs2 b/dumps/scripts/3829.cs2 new file mode 100644 index 000000000..38b40fcff --- /dev/null +++ b/dumps/scripts/3829.cs2 @@ -0,0 +1,4 @@ +void script_3829(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(452, 596)); + return; +} diff --git a/dumps/scripts/383.cs2 b/dumps/scripts/383.cs2 new file mode 100644 index 000000000..bb45b3c36 --- /dev/null +++ b/dumps/scripts/383.cs2 @@ -0,0 +1,9 @@ +void script_383() { + int stack_dump0; + deleteAllExtraChilds(new WidgetPointer(1028,125)); + setWidgetIsHidden(true, new WidgetPointer(1028,125)); + stack_dump0 = -1; + globalint_773 = -1; + globalint_2 = stack_dump0; + return; +} diff --git a/dumps/scripts/3830.cs2 b/dumps/scripts/3830.cs2 new file mode 100644 index 000000000..2d1f9ccbe --- /dev/null +++ b/dumps/scripts/3830.cs2 @@ -0,0 +1,4 @@ +void script_3830(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(453, 596)); + return; +} diff --git a/dumps/scripts/3831.cs2 b/dumps/scripts/3831.cs2 new file mode 100644 index 000000000..4902be31a --- /dev/null +++ b/dumps/scripts/3831.cs2 @@ -0,0 +1,4 @@ +void script_3831(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(454, 596)); + return; +} diff --git a/dumps/scripts/3832.cs2 b/dumps/scripts/3832.cs2 new file mode 100644 index 000000000..36c6f138e --- /dev/null +++ b/dumps/scripts/3832.cs2 @@ -0,0 +1,4 @@ +void script_3832(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(455, 596)); + return; +} diff --git a/dumps/scripts/3833.cs2 b/dumps/scripts/3833.cs2 new file mode 100644 index 000000000..89b066246 --- /dev/null +++ b/dumps/scripts/3833.cs2 @@ -0,0 +1,4 @@ +void script_3833(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(456, 596)); + return; +} diff --git a/dumps/scripts/3834.cs2 b/dumps/scripts/3834.cs2 new file mode 100644 index 000000000..98bc53eaf --- /dev/null +++ b/dumps/scripts/3834.cs2 @@ -0,0 +1,4 @@ +void script_3834(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(457, 596)); + return; +} diff --git a/dumps/scripts/3835.cs2 b/dumps/scripts/3835.cs2 new file mode 100644 index 000000000..6c056d1bf --- /dev/null +++ b/dumps/scripts/3835.cs2 @@ -0,0 +1,4 @@ +void script_3835(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(459, 596)); + return; +} diff --git a/dumps/scripts/3836.cs2 b/dumps/scripts/3836.cs2 new file mode 100644 index 000000000..be20f2399 --- /dev/null +++ b/dumps/scripts/3836.cs2 @@ -0,0 +1,4 @@ +void script_3836(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(460, 596)); + return; +} diff --git a/dumps/scripts/3837.cs2 b/dumps/scripts/3837.cs2 new file mode 100644 index 000000000..0f30111ef --- /dev/null +++ b/dumps/scripts/3837.cs2 @@ -0,0 +1,4 @@ +void script_3837(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(458, 596)); + return; +} diff --git a/dumps/scripts/3838.cs2 b/dumps/scripts/3838.cs2 new file mode 100644 index 000000000..238dd9e66 --- /dev/null +++ b/dumps/scripts/3838.cs2 @@ -0,0 +1,4 @@ +void script_3838(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(461, 596)); + return; +} diff --git a/dumps/scripts/3839.cs2 b/dumps/scripts/3839.cs2 new file mode 100644 index 000000000..46fb3a5dc --- /dev/null +++ b/dumps/scripts/3839.cs2 @@ -0,0 +1,4 @@ +void script_3839(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(463, 596)); + return; +} diff --git a/dumps/scripts/384.cs2 b/dumps/scripts/384.cs2 new file mode 100644 index 000000000..babaad7aa --- /dev/null +++ b/dumps/scripts/384.cs2 @@ -0,0 +1,35 @@ +int script_384(int arg0,int arg1,int arg2) { + switch (arg0) { + case 0: + if (((boolean)arg2)) { + return getOtherCommonData(arg1, 1175); + } + return getOtherCommonData(arg1, 1169); + case 1: + if (((boolean)arg2)) { + return getOtherCommonData(arg1, 1176); + } + return getOtherCommonData(arg1, 1170); + case 2: + if (((boolean)arg2)) { + return getOtherCommonData(arg1, 1177); + } + return getOtherCommonData(arg1, 1171); + case 3: + if (((boolean)arg2)) { + return getOtherCommonData(arg1, 1178); + } + return getOtherCommonData(arg1, 1172); + case 4: + if (((boolean)arg2)) { + return getOtherCommonData(arg1, 1179); + } + return getOtherCommonData(arg1, 1173); + case 5: + if (((boolean)arg2)) { + return getOtherCommonData(arg1, 1180); + } + return getOtherCommonData(arg1, 1174); + } + return -1; +} diff --git a/dumps/scripts/3840.cs2 b/dumps/scripts/3840.cs2 new file mode 100644 index 000000000..2b7c8c8e1 --- /dev/null +++ b/dumps/scripts/3840.cs2 @@ -0,0 +1,4 @@ +void script_3840(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(464, 596)); + return; +} diff --git a/dumps/scripts/3841.cs2 b/dumps/scripts/3841.cs2 new file mode 100644 index 000000000..c7accddbf --- /dev/null +++ b/dumps/scripts/3841.cs2 @@ -0,0 +1,4 @@ +void script_3841(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(465, 596)); + return; +} diff --git a/dumps/scripts/3842.cs2 b/dumps/scripts/3842.cs2 new file mode 100644 index 000000000..d361b4516 --- /dev/null +++ b/dumps/scripts/3842.cs2 @@ -0,0 +1,4 @@ +void script_3842(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(466, 596)); + return; +} diff --git a/dumps/scripts/3843.cs2 b/dumps/scripts/3843.cs2 new file mode 100644 index 000000000..fbb4db7b6 --- /dev/null +++ b/dumps/scripts/3843.cs2 @@ -0,0 +1,4 @@ +void script_3843(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(467, 596)); + return; +} diff --git a/dumps/scripts/3844.cs2 b/dumps/scripts/3844.cs2 new file mode 100644 index 000000000..4ab6b044d --- /dev/null +++ b/dumps/scripts/3844.cs2 @@ -0,0 +1,4 @@ +void script_3844(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(468, 596)); + return; +} diff --git a/dumps/scripts/3845.cs2 b/dumps/scripts/3845.cs2 new file mode 100644 index 000000000..d6cb75b70 --- /dev/null +++ b/dumps/scripts/3845.cs2 @@ -0,0 +1,4 @@ +void script_3845(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(460, 596)); + return; +} diff --git a/dumps/scripts/3846.cs2 b/dumps/scripts/3846.cs2 new file mode 100644 index 000000000..52d7bd95c --- /dev/null +++ b/dumps/scripts/3846.cs2 @@ -0,0 +1,4 @@ +void script_3846(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(462, 596)); + return; +} diff --git a/dumps/scripts/3847.cs2 b/dumps/scripts/3847.cs2 new file mode 100644 index 000000000..80d66f67e --- /dev/null +++ b/dumps/scripts/3847.cs2 @@ -0,0 +1,4 @@ +void script_3847(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(469, 596)); + return; +} diff --git a/dumps/scripts/3848.cs2 b/dumps/scripts/3848.cs2 new file mode 100644 index 000000000..400d212d3 --- /dev/null +++ b/dumps/scripts/3848.cs2 @@ -0,0 +1,4 @@ +void script_3848() { + script_304(59823106); + return; +} diff --git a/dumps/scripts/3849.cs2 b/dumps/scripts/3849.cs2 new file mode 100644 index 000000000..6b496146a --- /dev/null +++ b/dumps/scripts/3849.cs2 @@ -0,0 +1,4 @@ +void script_3849() { + script_304(49374823); + return; +} diff --git a/dumps/scripts/385.cs2 b/dumps/scripts/385.cs2 new file mode 100644 index 000000000..2049b7a0f --- /dev/null +++ b/dumps/scripts/385.cs2 @@ -0,0 +1,119 @@ +void script_385(int arg0) { + flow_0: + if ((arg0 == globalint_543) && (arg0 != -1)) { + return; + } + globalint_543 = arg0; + SWITCH (arg0) { + case 1112: + GOTO flow_4 + case 1118: + GOTO flow_5 + case 1120: + GOTO flow_6 + case 1127: + GOTO flow_7 + case 1125: + GOTO flow_8 + case 1122: + GOTO flow_9 + case 1128: + GOTO flow_10 + case 1129: + GOTO flow_11 + case 1119: + GOTO flow_12 + case 1114: + GOTO flow_13 + case 1124: + GOTO flow_14 + case 1121: + GOTO flow_15 + case 1115: + GOTO flow_16 + case 1130: + GOTO flow_17 + case 1116: + GOTO flow_18 + case 1126: + GOTO flow_19 + case 1131: + GOTO flow_20 + case 1117: + GOTO flow_21 + case 1113: + GOTO flow_22 + case 1123: + GOTO flow_23 + case -1: + GOTO flow_25 + } + GOTO flow_24 + flow_4: + openInterface(67371042, 1033); + GOTO flow_26 + flow_5: + openInterface(67371042, 1043); + GOTO flow_26 + flow_6: + openInterface(67371042, 1032); + GOTO flow_26 + flow_7: + openInterface(67371042, 1038); + GOTO flow_26 + flow_8: + openInterface(67371042, 1034); + GOTO flow_26 + flow_9: + openInterface(67371042, 1036); + GOTO flow_26 + flow_10: + openInterface(67371042, 1044); + GOTO flow_26 + flow_11: + openInterface(67371042, 1042); + GOTO flow_26 + flow_12: + openInterface(67371042, 1041); + GOTO flow_26 + flow_13: + openInterface(67371042, 1029); + GOTO flow_26 + flow_14: + openInterface(67371042, 1030); + GOTO flow_26 + flow_15: + openInterface(67371042, 1031); + GOTO flow_26 + flow_16: + openInterface(67371042, 1046); + GOTO flow_26 + flow_17: + openInterface(67371042, 1047); + GOTO flow_26 + flow_18: + openInterface(67371042, 1045); + GOTO flow_26 + flow_19: + openInterface(67371042, 1049); + GOTO flow_26 + flow_20: + openInterface(67371042, 1035); + GOTO flow_26 + flow_21: + openInterface(67371042, 1039); + GOTO flow_26 + flow_22: + openInterface(67371042, 1048); + GOTO flow_26 + flow_23: + openInterface(67371042, 1037); + GOTO flow_26 + flow_24: + openInterface(67371042, 1033); + GOTO flow_26 + flow_25: + closeInterface(67371042); + flow_26: + return; +} diff --git a/dumps/scripts/3850.cs2 b/dumps/scripts/3850.cs2 new file mode 100644 index 000000000..f830cbe7a --- /dev/null +++ b/dumps/scripts/3850.cs2 @@ -0,0 +1,4 @@ +void script_3850() { + script_304(28972276); + return; +} diff --git a/dumps/scripts/3851.cs2 b/dumps/scripts/3851.cs2 new file mode 100644 index 000000000..afb357464 --- /dev/null +++ b/dumps/scripts/3851.cs2 @@ -0,0 +1,4 @@ +void script_3851() { + script_304(41536891); + return; +} diff --git a/dumps/scripts/3852.cs2 b/dumps/scripts/3852.cs2 new file mode 100644 index 000000000..b81f46b6d --- /dev/null +++ b/dumps/scripts/3852.cs2 @@ -0,0 +1,4 @@ +void script_3852(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(470, 596)); + return; +} diff --git a/dumps/scripts/3853.cs2 b/dumps/scripts/3853.cs2 new file mode 100644 index 000000000..5caad7cc0 --- /dev/null +++ b/dumps/scripts/3853.cs2 @@ -0,0 +1,4 @@ +void script_3853(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(471, 596)); + return; +} diff --git a/dumps/scripts/3854.cs2 b/dumps/scripts/3854.cs2 new file mode 100644 index 000000000..74583e072 --- /dev/null +++ b/dumps/scripts/3854.cs2 @@ -0,0 +1,4 @@ +void script_3854(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(472, 596)); + return; +} diff --git a/dumps/scripts/3855.cs2 b/dumps/scripts/3855.cs2 new file mode 100644 index 000000000..5b3d8401c --- /dev/null +++ b/dumps/scripts/3855.cs2 @@ -0,0 +1,4 @@ +void script_3855(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(473, 596)); + return; +} diff --git a/dumps/scripts/3856.cs2 b/dumps/scripts/3856.cs2 new file mode 100644 index 000000000..04d785ba2 --- /dev/null +++ b/dumps/scripts/3856.cs2 @@ -0,0 +1,4 @@ +void script_3856(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(474, 596)); + return; +} diff --git a/dumps/scripts/3857.cs2 b/dumps/scripts/3857.cs2 new file mode 100644 index 000000000..d56ee69a2 --- /dev/null +++ b/dumps/scripts/3857.cs2 @@ -0,0 +1,4 @@ +void script_3857(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(475, 596)); + return; +} diff --git a/dumps/scripts/3858.cs2 b/dumps/scripts/3858.cs2 new file mode 100644 index 000000000..8ff4eff3c --- /dev/null +++ b/dumps/scripts/3858.cs2 @@ -0,0 +1,4 @@ +void script_3858(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(476, 596)); + return; +} diff --git a/dumps/scripts/3859.cs2 b/dumps/scripts/3859.cs2 new file mode 100644 index 000000000..e55cd680b --- /dev/null +++ b/dumps/scripts/3859.cs2 @@ -0,0 +1,4 @@ +void script_3859(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(480, 596)); + return; +} diff --git a/dumps/scripts/386.cs2 b/dumps/scripts/386.cs2 new file mode 100644 index 000000000..d7f8edf37 --- /dev/null +++ b/dumps/scripts/386.cs2 @@ -0,0 +1,29 @@ +void script_386(int arg0) { + int ivar1; + ivar1 = script_734(globalint_196); + if (((boolean)arg0) && (globalint_197 != 0)) { + script_391(); + setWidgetIsHidden(true, new WidgetPointer(1028,35)); + setWidgetIsHidden(true, new WidgetPointer(1028,115)); + setWidgetIsHidden(false, new WidgetPointer(1028,117)); + setWidgetIsHidden(false, new WidgetPointer(1028,116)); + setWidgetIsHidden(false, new WidgetPointer(1028,89)); + } else { + script_387(ivar1); + script_390(ivar1); + setWidgetIsHidden(false, new WidgetPointer(1028,35)); + if (((boolean)globalint_197)) { + setWidgetIsHidden(true, new WidgetPointer(1028,115)); + setWidgetIsHidden(true, new WidgetPointer(1028,117)); + } else if (((boolean)bitconfig_8246) && ((boolean)bitconfig_8247)) { + setWidgetIsHidden(true, new WidgetPointer(1028,117)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1028,117)); + } + setWidgetIsHidden(false, new WidgetPointer(1028,115)); + setWidgetIsHidden(true, new WidgetPointer(1028,116)); + setWidgetIsHidden(true, new WidgetPointer(1028,89)); + } + script_383(); + return; +} diff --git a/dumps/scripts/3860.cs2 b/dumps/scripts/3860.cs2 new file mode 100644 index 000000000..f9a518e9c --- /dev/null +++ b/dumps/scripts/3860.cs2 @@ -0,0 +1,4 @@ +void script_3860(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(477, 596)); + return; +} diff --git a/dumps/scripts/3861.cs2 b/dumps/scripts/3861.cs2 new file mode 100644 index 000000000..0abea5fb8 --- /dev/null +++ b/dumps/scripts/3861.cs2 @@ -0,0 +1,4 @@ +void script_3861(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(479, 596)); + return; +} diff --git a/dumps/scripts/3862.cs2 b/dumps/scripts/3862.cs2 new file mode 100644 index 000000000..122b9c71f --- /dev/null +++ b/dumps/scripts/3862.cs2 @@ -0,0 +1,4 @@ +void script_3862(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(481, 596)); + return; +} diff --git a/dumps/scripts/3863.cs2 b/dumps/scripts/3863.cs2 new file mode 100644 index 000000000..5ad4ab283 --- /dev/null +++ b/dumps/scripts/3863.cs2 @@ -0,0 +1,4 @@ +void script_3863(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(482, 596)); + return; +} diff --git a/dumps/scripts/3864.cs2 b/dumps/scripts/3864.cs2 new file mode 100644 index 000000000..ecf3cdb9b --- /dev/null +++ b/dumps/scripts/3864.cs2 @@ -0,0 +1,4 @@ +void script_3864(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(478, 596)); + return; +} diff --git a/dumps/scripts/3865.cs2 b/dumps/scripts/3865.cs2 new file mode 100644 index 000000000..299fb9466 --- /dev/null +++ b/dumps/scripts/3865.cs2 @@ -0,0 +1,4 @@ +void script_3865(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(775, 596)); + return; +} diff --git a/dumps/scripts/3866.cs2 b/dumps/scripts/3866.cs2 new file mode 100644 index 000000000..8f1897ec9 --- /dev/null +++ b/dumps/scripts/3866.cs2 @@ -0,0 +1,4 @@ +void script_3866(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(483, 596)); + return; +} diff --git a/dumps/scripts/3867.cs2 b/dumps/scripts/3867.cs2 new file mode 100644 index 000000000..97a58a068 --- /dev/null +++ b/dumps/scripts/3867.cs2 @@ -0,0 +1,4 @@ +void script_3867(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(485, 596)); + return; +} diff --git a/dumps/scripts/3868.cs2 b/dumps/scripts/3868.cs2 new file mode 100644 index 000000000..74cf16a03 --- /dev/null +++ b/dumps/scripts/3868.cs2 @@ -0,0 +1,4 @@ +void script_3868() { + script_303(54306188, 0); + return; +} diff --git a/dumps/scripts/3869.cs2 b/dumps/scripts/3869.cs2 new file mode 100644 index 000000000..e24ed137d --- /dev/null +++ b/dumps/scripts/3869.cs2 @@ -0,0 +1,4 @@ +void script_3869() { + script_303(52579471, 0); + return; +} diff --git a/dumps/scripts/387.cs2 b/dumps/scripts/387.cs2 new file mode 100644 index 000000000..0de5819ff --- /dev/null +++ b/dumps/scripts/387.cs2 @@ -0,0 +1,162 @@ +void script_387(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + string svar0; + string svar1; + string svar2; + string svar3; + string stack_dump0; + svar0 = "Select Character"; + svar1 = "Select Style"; + svar2 = "Style"; + ivar1 = 0; + ivar1 = max(max(add(getTextWidth(468, svar0), 40), getTextWidth(468, svar1)), getTextWidth(468, svar2)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(1028,36)); + script_362(67371044, ivar1, svar0); + script_362(67371045, ivar1, svar1); + ivar2 = getExtraChildGap(new WidgetPointer(1028,37)); + if (setWidgetRegister(new WidgetPointer(1028,37), subtract(ivar2, 1))) { + setWidgetHidden(1); + } + createExtraChild(new WidgetPointer(1028,37), 4, ivar2); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(468); + setWidgetRGB(new Color(36, 27, 18)); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(false); + setWidgetText(svar2); + setWidgetHidden(1); + stack_dump0 = cs2method2801(1, new WidgetPointer(1028,38)); + svar1 = cs2method2801(1, new WidgetPointer(1028,39)); + svar0 = stack_dump0; + ivar3 = getCommonDefinitionSize(3280); + ivar4 = 0; + ivar5 = 0; + ivar6 = 73; + ivar7 = 3278; + ivar2 = add(add(getWidgetActualX(new WidgetPointer(1028,36)), ivar1), 20); + ivar1 = add(max(getTextWidth(495, svar0), getTextWidth(495, svar1)), 30); + setWidgetPosition(ivar2, getWidgetActualY(new WidgetPointer(1028,38)), 0, 0, new WidgetPointer(1028,38)); + script_368(67371046, ivar1, svar0, ""); + ivar2 = add(add(ivar2, ivar1), 10); + setWidgetPosition(ivar2, getWidgetActualY(new WidgetPointer(1028,38)), 0, 0, new WidgetPointer(1028,39)); + script_368(67371047, ivar1, svar1, ""); + ivar4 = min(ivar3, getCommonDefinitionSize(ivar7)); + ivar5 = divide(add(ivar4, 1), 2); + ivar1 = max(add(multiply(ivar5, ivar6), subtract(89, ivar6)), multiplyDivide(4, 5, 765)); + setWidgetSize(ivar1, 26, 0, 1, new WidgetPointer(1028,35)); + setWidgetSize(ivar1, getWidgetActualHeight(new WidgetPointer(1028,35)), 0, 0, new WidgetPointer(1028,114)); + setWidgetSize(0, 180, 1, 0, new WidgetPointer(1028,47)); + setWidgetPosition(0, 237, 1, 0, new WidgetPointer(1028,71)); + setWidgetSize(subtract(ivar1, add(add(ivar2, getWidgetActualWidth(new WidgetPointer(1028,39))), 42)), getWidgetActualHeight(new WidgetPointer(1028,40)), 0, 0, new WidgetPointer(1028,40)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(1028,40)), getWidgetActualY(new WidgetPointer(1028,38)), 0, 0, new WidgetPointer(1028,40)); + script_389(); + ivar8 = subtract(globalint_197, 1); + if (ivar8 <= -1) { + setWidgetIsHidden(true, new WidgetPointer(1028,37)); + setWidgetIsHidden(true, new WidgetPointer(1028,115)); + setWidgetIsHidden(true, new WidgetPointer(1028,117)); + setWidgetIsHidden(true, new WidgetPointer(1028,112)); + setWidgetIsHidden(true, new WidgetPointer(1028,113)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1028,37)); + setWidgetIsHidden(false, new WidgetPointer(1028,115)); + if (((boolean)bitconfig_8246) && ((boolean)bitconfig_8247)) { + setWidgetIsHidden(true, new WidgetPointer(1028,117)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1028,117)); + } + setWidgetIsHidden(false, new WidgetPointer(1028,112)); + setWidgetIsHidden(false, new WidgetPointer(1028,113)); + } + ivar9 = -1; + svar3 = ""; + ivar10 = -1; + ivar11 = 0; + ivar12 = 1; + ivar13 = cs2method_3408(105, 74, ivar7, ivar8); + script_385(ivar13); + ivar2 = subtract(getWidgetActualHeight(new WidgetPointer(1028,47)), add(89, 17)); + while (ivar11 < ivar4) { + ivar9 = ((int)cs2method_3408(105, 73, 3280, ivar11)); + if (ivar9 != -1) { + if (ivar11 < ivar5) { + if (ivar11 == ivar8) { + setWidgetPosition(multiply(ivar6, ivar11), 0, 0, 0, new WidgetPointer(ivar9)); + } else { + setWidgetPosition(multiply(ivar6, ivar11), ivar2, 0, 2, new WidgetPointer(ivar9)); + } + if ((ivar11 <= ivar8) || (ivar8 <= -1)) { + cs2method202(ivar9); + } else { + cs2method203(ivar9); + } + } else { + if (ivar11 == ivar8) { + setWidgetPosition(multiply(ivar6, subtract(ivar11, ivar5)), 17, 0, 2, new WidgetPointer(ivar9)); + } else { + setWidgetPosition(multiply(ivar6, subtract(ivar11, ivar5)), 0, 0, 2, new WidgetPointer(ivar9)); + } + if ((ivar8 < ivar5) || (ivar11 <= ivar8)) { + cs2method202(ivar9); + } + } + setWidgetSize(89, 89, 0, 0, new WidgetPointer(ivar9)); + ivar13 = cs2method_3408(105, 74, ivar7, ivar11); + if (ivar13 != -1) { + if (((boolean)arg0)) { + svar3 = cs2method_3408(74, 115, 3279, ivar13); + ivar10 = getOtherCommonData(ivar13, 1162); + } else { + svar3 = getOtherCommonData(ivar13, 1160); + ivar10 = getOtherCommonData(ivar13, 1161); + } + if (ivar11 == ivar8) { + ivar12 = 1; + } else { + ivar12 = 0; + } + script_363(ivar9, ivar8, 3280, ivar10, 1, 51, 61, 2, ivar12, svar3, ""); + setScriptCallOnClickContextMenu(351, -2147483644, add(ivar11, 1), "ii", new WidgetPointer(ivar9)); + } else { + script_363(ivar9, -1, -1, -1, 0, 0, 0, 0, 0, "", ""); + } + } + ivar11 = add(ivar11, 1); + } + while (ivar11 < ivar3) { + ivar9 = ((int)cs2method_3408(105, 73, 3280, ivar11)); + if (ivar9 != -1) { + setWidgetIsHidden(true, new WidgetPointer(ivar9)); + } + ivar11 = add(ivar11, 1); + } + if (ivar8 >= ivar5) { + ivar11 = subtract(ivar4, 1); + while (ivar11 >= ivar8) { + ivar9 = ((int)cs2method_3408(105, 73, 3280, ivar11)); + if (ivar9 != -1) { + cs2method202(ivar9); + } + ivar11 = subtract(ivar11, 1); + } + } else { + ivar9 = ((int)cs2method_3408(105, 73, 3280, ivar8)); + if (ivar9 != -1) { + cs2method202(ivar9); + } + } + return; +} diff --git a/dumps/scripts/3870.cs2 b/dumps/scripts/3870.cs2 new file mode 100644 index 000000000..73514bd32 --- /dev/null +++ b/dumps/scripts/3870.cs2 @@ -0,0 +1,4 @@ +void script_3870() { + script_304(54306188); + return; +} diff --git a/dumps/scripts/3871.cs2 b/dumps/scripts/3871.cs2 new file mode 100644 index 000000000..0e70d2e41 --- /dev/null +++ b/dumps/scripts/3871.cs2 @@ -0,0 +1,4 @@ +void script_3871(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(283, 596)); + return; +} diff --git a/dumps/scripts/3872.cs2 b/dumps/scripts/3872.cs2 new file mode 100644 index 000000000..de91b72a3 --- /dev/null +++ b/dumps/scripts/3872.cs2 @@ -0,0 +1,4 @@ +void script_3872(int arg0,int arg1) { + script_311(arg0, arg1, "Map link"); + return; +} diff --git a/dumps/scripts/3873.cs2 b/dumps/scripts/3873.cs2 new file mode 100644 index 000000000..2554e9b4b --- /dev/null +++ b/dumps/scripts/3873.cs2 @@ -0,0 +1,4 @@ +void script_3873(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(417, 596)); + return; +} diff --git a/dumps/scripts/3874.cs2 b/dumps/scripts/3874.cs2 new file mode 100644 index 000000000..d03cf1043 --- /dev/null +++ b/dumps/scripts/3874.cs2 @@ -0,0 +1,4 @@ +void script_3874(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(405, 596)); + return; +} diff --git a/dumps/scripts/3875.cs2 b/dumps/scripts/3875.cs2 new file mode 100644 index 000000000..71cc0b628 --- /dev/null +++ b/dumps/scripts/3875.cs2 @@ -0,0 +1,4 @@ +void script_3875(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(406, 596)); + return; +} diff --git a/dumps/scripts/3876.cs2 b/dumps/scripts/3876.cs2 new file mode 100644 index 000000000..045318c89 --- /dev/null +++ b/dumps/scripts/3876.cs2 @@ -0,0 +1,4 @@ +void script_3876(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(407, 596)); + return; +} diff --git a/dumps/scripts/3877.cs2 b/dumps/scripts/3877.cs2 new file mode 100644 index 000000000..b817e7376 --- /dev/null +++ b/dumps/scripts/3877.cs2 @@ -0,0 +1,4 @@ +void script_3877(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(408, 596)); + return; +} diff --git a/dumps/scripts/3878.cs2 b/dumps/scripts/3878.cs2 new file mode 100644 index 000000000..169e1594e --- /dev/null +++ b/dumps/scripts/3878.cs2 @@ -0,0 +1,4 @@ +void script_3878(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(409, 596)); + return; +} diff --git a/dumps/scripts/3879.cs2 b/dumps/scripts/3879.cs2 new file mode 100644 index 000000000..aaf06b906 --- /dev/null +++ b/dumps/scripts/3879.cs2 @@ -0,0 +1,4 @@ +void script_3879() { + script_304(40176799); + return; +} diff --git a/dumps/scripts/388.cs2 b/dumps/scripts/388.cs2 new file mode 100644 index 000000000..614579082 --- /dev/null +++ b/dumps/scripts/388.cs2 @@ -0,0 +1,4 @@ +void script_388() { + script_304(46271535); + return; +} diff --git a/dumps/scripts/3880.cs2 b/dumps/scripts/3880.cs2 new file mode 100644 index 000000000..7f306a7a6 --- /dev/null +++ b/dumps/scripts/3880.cs2 @@ -0,0 +1,4 @@ +void script_3880() { + script_304(54218108); + return; +} diff --git a/dumps/scripts/3881.cs2 b/dumps/scripts/3881.cs2 new file mode 100644 index 000000000..d31ad4ba4 --- /dev/null +++ b/dumps/scripts/3881.cs2 @@ -0,0 +1,4 @@ +void script_3881() { + script_304(55036828); + return; +} diff --git a/dumps/scripts/3882.cs2 b/dumps/scripts/3882.cs2 new file mode 100644 index 000000000..6efe9d91a --- /dev/null +++ b/dumps/scripts/3882.cs2 @@ -0,0 +1,4 @@ +void script_3882() { + script_304(44443420); + return; +} diff --git a/dumps/scripts/3883.cs2 b/dumps/scripts/3883.cs2 new file mode 100644 index 000000000..aa1cbfac6 --- /dev/null +++ b/dumps/scripts/3883.cs2 @@ -0,0 +1,4 @@ +void script_3883() { + script_304(44918551); + return; +} diff --git a/dumps/scripts/3884.cs2 b/dumps/scripts/3884.cs2 new file mode 100644 index 000000000..6104596f0 --- /dev/null +++ b/dumps/scripts/3884.cs2 @@ -0,0 +1,4 @@ +void script_3884() { + script_304(44312331); + return; +} diff --git a/dumps/scripts/3885.cs2 b/dumps/scripts/3885.cs2 new file mode 100644 index 000000000..262dbd577 --- /dev/null +++ b/dumps/scripts/3885.cs2 @@ -0,0 +1,4 @@ +void script_3885() { + script_304(45836044); + return; +} diff --git a/dumps/scripts/3886.cs2 b/dumps/scripts/3886.cs2 new file mode 100644 index 000000000..854154d5d --- /dev/null +++ b/dumps/scripts/3886.cs2 @@ -0,0 +1,4 @@ +void script_3886() { + script_304(42116509); + return; +} diff --git a/dumps/scripts/3887.cs2 b/dumps/scripts/3887.cs2 new file mode 100644 index 000000000..1c125974f --- /dev/null +++ b/dumps/scripts/3887.cs2 @@ -0,0 +1,4 @@ +void script_3887() { + script_304(42132949); + return; +} diff --git a/dumps/scripts/3888.cs2 b/dumps/scripts/3888.cs2 new file mode 100644 index 000000000..c8c9de395 --- /dev/null +++ b/dumps/scripts/3888.cs2 @@ -0,0 +1,4 @@ +void script_3888() { + script_304(43165149); + return; +} diff --git a/dumps/scripts/3889.cs2 b/dumps/scripts/3889.cs2 new file mode 100644 index 000000000..87080dd9b --- /dev/null +++ b/dumps/scripts/3889.cs2 @@ -0,0 +1,4 @@ +void script_3889() { + script_304(44164564); + return; +} diff --git a/dumps/scripts/389.cs2 b/dumps/scripts/389.cs2 new file mode 100644 index 000000000..0745cff19 --- /dev/null +++ b/dumps/scripts/389.cs2 @@ -0,0 +1,42 @@ +void script_389() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + deleteAllExtraChilds(new WidgetPointer(1028,45)); + ivar0 = getWidgetActualWidth(new WidgetPointer(1028,45)); + ivar1 = getCommonDefinitionSize(748); + ivar2 = divide(subtract(ivar0, 22), ivar1); + ivar3 = add(divide(subtract(ivar0, multiply(ivar1, ivar2)), 2), 1); + ivar4 = add(ivar1, 6); + ivar5 = 0; + ivar6 = -1; + ivar7 = -1; + while (ivar5 < ivar1) { + createExtraChild(new WidgetPointer(1028,45), 3, ivar5); + setWidgetSize(subtract(ivar2, 2), 26, 0, 1); + setWidgetPosition(add(ivar3, multiply(ivar5, ivar2)), 5, 0, 2); + setWidgetFilled(1); + setWidgetRGB(new Color(cs2method_3408(105, 105, 746, ivar5))); + setWidgetContextMenuOption(1, cs2method_3408(105, 115, 747, ivar5)); + ivar6 = cs2method_3408(105, 105, 748, ivar5); + if (globalint_1019 == ivar6) { + ivar7 = ivar5; + } else { + setScriptCallOnClickContextMenu(357, -2147483644, ivar6, 4, "iii"); + setScriptCallOnMouseEntered(375, new WidgetPointer(-32768,3), new WidgetPointer(-32768,3), -2147483643, 14006640, 10913874, 1, ivar4, "IIiiiii"); + setScriptCallOnMouseExit(377, new WidgetPointer(-32768,3), ivar4, "Ii"); + } + ivar5 = add(ivar5, 1); + } + if (ivar7 != -1) { + script_376(67371053, 67371053, ivar7, 9878498, 2909586, 1, ivar1); + } else { + script_376(67371053, -1, -1, 0, 0, 1, ivar1); + } + return; +} diff --git a/dumps/scripts/3890.cs2 b/dumps/scripts/3890.cs2 new file mode 100644 index 000000000..9ce1a68e5 --- /dev/null +++ b/dumps/scripts/3890.cs2 @@ -0,0 +1,4 @@ +void script_3890() { + script_304(41985563); + return; +} diff --git a/dumps/scripts/3891.cs2 b/dumps/scripts/3891.cs2 new file mode 100644 index 000000000..1a1a147c0 --- /dev/null +++ b/dumps/scripts/3891.cs2 @@ -0,0 +1,4 @@ +void script_3891() { + script_304(44574254); + return; +} diff --git a/dumps/scripts/3892.cs2 b/dumps/scripts/3892.cs2 new file mode 100644 index 000000000..702fd2062 --- /dev/null +++ b/dumps/scripts/3892.cs2 @@ -0,0 +1,4 @@ +void script_3892() { + script_304(42935876); + return; +} diff --git a/dumps/scripts/3893.cs2 b/dumps/scripts/3893.cs2 new file mode 100644 index 000000000..ff1908151 --- /dev/null +++ b/dumps/scripts/3893.cs2 @@ -0,0 +1,4 @@ +void script_3893() { + script_304(53044866); + return; +} diff --git a/dumps/scripts/3894.cs2 b/dumps/scripts/3894.cs2 new file mode 100644 index 000000000..f081ff982 --- /dev/null +++ b/dumps/scripts/3894.cs2 @@ -0,0 +1,4 @@ +void script_3894() { + script_304(50751115); + return; +} diff --git a/dumps/scripts/3895.cs2 b/dumps/scripts/3895.cs2 new file mode 100644 index 000000000..2a0739049 --- /dev/null +++ b/dumps/scripts/3895.cs2 @@ -0,0 +1,4 @@ +void script_3895() { + script_304(51062396); + return; +} diff --git a/dumps/scripts/3896.cs2 b/dumps/scripts/3896.cs2 new file mode 100644 index 000000000..3c3c41e99 --- /dev/null +++ b/dumps/scripts/3896.cs2 @@ -0,0 +1,4 @@ +void script_3896() { + script_304(50620147); + return; +} diff --git a/dumps/scripts/3897.cs2 b/dumps/scripts/3897.cs2 new file mode 100644 index 000000000..dedf9198e --- /dev/null +++ b/dumps/scripts/3897.cs2 @@ -0,0 +1,4 @@ +void script_3897() { + script_304(52274793); + return; +} diff --git a/dumps/scripts/3898.cs2 b/dumps/scripts/3898.cs2 new file mode 100644 index 000000000..ac304c2e4 --- /dev/null +++ b/dumps/scripts/3898.cs2 @@ -0,0 +1,4 @@ +void script_3898() { + script_304(51078682); + return; +} diff --git a/dumps/scripts/3899.cs2 b/dumps/scripts/3899.cs2 new file mode 100644 index 000000000..85ba5864c --- /dev/null +++ b/dumps/scripts/3899.cs2 @@ -0,0 +1,4 @@ +void script_3899() { + script_304(50488878); + return; +} diff --git a/dumps/scripts/39.cs2 b/dumps/scripts/39.cs2 new file mode 100644 index 000000000..2bc417149 --- /dev/null +++ b/dumps/scripts/39.cs2 @@ -0,0 +1,4 @@ +void script_39(int arg0,int arg1,int arg2,int arg3,string arg4) { + script_569(arg0, -1, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/390.cs2 b/dumps/scripts/390.cs2 new file mode 100644 index 000000000..6be772826 --- /dev/null +++ b/dumps/scripts/390.cs2 @@ -0,0 +1,100 @@ +void script_390(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + string svar0; + int stack_dump0; + ivar1 = getCommonDefinitionSize(3281); + ivar2 = -1; + ivar3 = subtract(ivar1, 1); + while (ivar3 >= 0) { + ivar2 = ((int)cs2method_3408(105, 73, 3281, ivar3)); + if (ivar2 != -1) { + setWidgetIsHidden(true, new WidgetPointer(ivar2)); + } + ivar3 = subtract(ivar3, 1); + } + deleteAllExtraChilds(new WidgetPointer(1028,82)); + ivar4 = cs2method_3408(105, 74, 3278, subtract(globalint_197, 1)); + deleteAllExtraChilds(new WidgetPointer(1028,71)); + svar0 = "Please choose your character." + "
" + "
" + "Your choice will not affect your abilities." + "
" + "You can modify features like your hair style and clothing once you have chosen your character."; + if (ivar4 == -1) { + ivar1 = subtract(getWidgetActualWidth(new WidgetPointer(1028,82)), 16); + stack_dump0 = getMaxLineWidth(ivar1, 495, svar0); + ivar3 = add(multiply(getLineCount(ivar1, 495, svar0), 20), 3); + ivar1 = stack_dump0; + setWidgetSize(add(ivar1, 16), add(ivar3, 50), 0, 0, new WidgetPointer(1028,71)); + createExtraChild(new WidgetPointer(1028,71), 4, getExtraChildGap(new WidgetPointer(1028,71))); + setWidgetSize(ivar1, ivar3, 0, 0); + setWidgetPosition(0, 22, 1, 0); + setWidgetFont(3793); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetTextAlignment(1, 1, 20); + setWidgetText(svar0); + setWidgetIsHidden(false, new WidgetPointer(1028,71)); + return; + } + setWidgetIsHidden(true, new WidgetPointer(1028,71)); + ivar5 = 0; + ivar3 = 0; + ivar6 = script_384(0, ivar4, arg0); + ivar7 = subtract(globalint_86, 1); + ivar2 = ((int)cs2method_3408(105, 73, 3281, 0)); + while ((ivar6 != -1) && (ivar2 != -1)) { + setWidgetSize(98, 17, 0, 1, new WidgetPointer(ivar2)); + if (ivar3 == ivar7) { + ivar5 = 1; + } else { + ivar5 = 0; + } + script_363(ivar2, ivar7, 3281, getOtherCommonData(ivar6, 1181), 1, 85, 181, 1, ivar5, "", ""); + setWidgetContextMenuOption(1, new WidgetPointer(ivar2), "Select outfit"); + setScriptCallOnClickContextMenu(352, -2147483644, add(ivar3, 1), "ii", new WidgetPointer(ivar2)); + ivar3 = add(ivar3, 1); + ivar6 = script_384(ivar3, ivar4, arg0); + ivar2 = ((int)cs2method_3408(105, 73, 3281, ivar3)); + } + ivar8 = ivar3; + if (ivar8 <= 1) { + if (setWidgetRegister(new WidgetPointer(1028,37), subtract(getExtraChildGap(new WidgetPointer(1028,37)), 1))) { + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(1028,37), subtract(getExtraChildGap(new WidgetPointer(1028,37)), 2))) { + setWidgetHidden(1); + } + if (ivar8 <= 0) { + return; + } + } else { + if (setWidgetRegister(new WidgetPointer(1028,37), subtract(getExtraChildGap(new WidgetPointer(1028,37)), 1))) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(1028,37), subtract(getExtraChildGap(new WidgetPointer(1028,37)), 2))) { + setWidgetHidden(0); + } + } + ivar9 = min(divide(subtract(390, 98), max(subtract(ivar8, 1), 1)), multiplyDivide(33, 40, 89)); + ivar3 = 0; + while (ivar3 < ivar8) { + ivar2 = ((int)cs2method_3408(105, 73, 3281, ivar3)); + if (ivar3 == ivar7) { + setWidgetPosition(multiply(ivar3, ivar9), 0, 0, 0, new WidgetPointer(ivar2)); + } else { + setWidgetPosition(multiply(ivar3, ivar9), 0, 0, 2, new WidgetPointer(ivar2)); + } + if (ivar3 <= ivar7) { + cs2method202(ivar2); + } else { + cs2method203(ivar2); + } + ivar3 = add(ivar3, 1); + } + return; +} diff --git a/dumps/scripts/3900.cs2 b/dumps/scripts/3900.cs2 new file mode 100644 index 000000000..88f7819dd --- /dev/null +++ b/dumps/scripts/3900.cs2 @@ -0,0 +1,4 @@ +void script_3900() { + script_304(50554312); + return; +} diff --git a/dumps/scripts/3901.cs2 b/dumps/scripts/3901.cs2 new file mode 100644 index 000000000..a13327734 --- /dev/null +++ b/dumps/scripts/3901.cs2 @@ -0,0 +1,4 @@ +void script_3901() { + script_304(51062190); + return; +} diff --git a/dumps/scripts/3902.cs2 b/dumps/scripts/3902.cs2 new file mode 100644 index 000000000..471bd83f6 --- /dev/null +++ b/dumps/scripts/3902.cs2 @@ -0,0 +1,4 @@ +void script_3902() { + script_304(51619253); + return; +} diff --git a/dumps/scripts/3903.cs2 b/dumps/scripts/3903.cs2 new file mode 100644 index 000000000..8b99162c9 --- /dev/null +++ b/dumps/scripts/3903.cs2 @@ -0,0 +1,4 @@ +void script_3903() { + script_304(52602256); + return; +} diff --git a/dumps/scripts/3904.cs2 b/dumps/scripts/3904.cs2 new file mode 100644 index 000000000..fbbcad47d --- /dev/null +++ b/dumps/scripts/3904.cs2 @@ -0,0 +1,4 @@ +void script_3904() { + script_304(51946852); + return; +} diff --git a/dumps/scripts/3905.cs2 b/dumps/scripts/3905.cs2 new file mode 100644 index 000000000..ab23ca079 --- /dev/null +++ b/dumps/scripts/3905.cs2 @@ -0,0 +1,4 @@ +void script_3905() { + script_304(50865512); + return; +} diff --git a/dumps/scripts/3906.cs2 b/dumps/scripts/3906.cs2 new file mode 100644 index 000000000..2355565c7 --- /dev/null +++ b/dumps/scripts/3906.cs2 @@ -0,0 +1,4 @@ +void script_3906() { + script_304(47277637); + return; +} diff --git a/dumps/scripts/3907.cs2 b/dumps/scripts/3907.cs2 new file mode 100644 index 000000000..d3cc8f731 --- /dev/null +++ b/dumps/scripts/3907.cs2 @@ -0,0 +1,4 @@ +void script_3907() { + script_304(46196270); + return; +} diff --git a/dumps/scripts/3908.cs2 b/dumps/scripts/3908.cs2 new file mode 100644 index 000000000..e64499d3c --- /dev/null +++ b/dumps/scripts/3908.cs2 @@ -0,0 +1,4 @@ +void script_3908() { + script_304(49473035); + return; +} diff --git a/dumps/scripts/3909.cs2 b/dumps/scripts/3909.cs2 new file mode 100644 index 000000000..6d5a6b559 --- /dev/null +++ b/dumps/scripts/3909.cs2 @@ -0,0 +1,4 @@ +void script_3909() { + script_304(50128434); + return; +} diff --git a/dumps/scripts/391.cs2 b/dumps/scripts/391.cs2 new file mode 100644 index 000000000..b00d32184 --- /dev/null +++ b/dumps/scripts/391.cs2 @@ -0,0 +1,357 @@ +void script_391() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + string svar0; + string svar1; + int stack_dump0; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + svar0 = ""; + switch (globalint_1020) { + case 0: + ivar0 = 67371103; + ivar6 = 748; + ivar7 = 746; + ivar8 = 747; + ivar9 = 4; + ivar10 = globalint_1019; + svar0 = "Select skin colour:"; + setWidgetIsHidden(true, new WidgetPointer(1028,102)); + break; + case 1: + ivar0 = 67371104; + if (IsFemale()) { + ivar1 = 3302; + ivar2 = 3303; + ivar4 = 7; + } else { + ivar1 = 3304; + ivar2 = 3305; + ivar4 = 0; + } + ivar5 = globalint_1008; + ivar6 = 2345; + ivar7 = 2343; + ivar8 = 2344; + ivar9 = 0; + ivar10 = globalint_1015; + svar0 = "Select hairstyle:"; + setWidgetIsHidden(true, new WidgetPointer(1028,102)); + break; + case 2: + ivar0 = 67371108; + if (((int)IsFemale()) != 1) { + ivar1 = 3307; + ivar2 = 3306; + ivar3 = 2340; + ivar4 = 1; + ivar5 = globalint_1009; + ivar6 = 2345; + ivar7 = 2343; + ivar8 = 2344; + ivar9 = 0; + ivar10 = globalint_1015; + } + svar0 = "Select facial hair:"; + setWidgetIsHidden(true, new WidgetPointer(1028,102)); + break; + case 3: + ivar0 = 67371105; + if (IsFemale()) { + ivar1 = 3299; + ivar2 = 3298; + ivar3 = 1590; + ivar4 = 9; + } else { + ivar1 = 3287; + ivar2 = 3286; + ivar3 = 689; + ivar4 = 2; + } + ivar5 = globalint_1010; + ivar6 = 3283; + ivar7 = 2347; + ivar8 = 2348; + ivar9 = 1; + ivar10 = globalint_1016; + svar0 = "Select torso:"; + setWidgetIsHidden(false, new WidgetPointer(1028,102)); + break; + case 6: + ivar0 = 67371106; + if (IsFemale()) { + ivar1 = 3301; + ivar2 = 3300; + ivar3 = 1606; + ivar4 = 12; + } else { + ivar1 = 3289; + ivar2 = 3288; + ivar3 = 1585; + ivar4 = 5; + } + ivar5 = globalint_1013; + ivar6 = 3283; + ivar7 = 2347; + ivar8 = 2348; + ivar9 = 2; + ivar10 = globalint_1017; + svar0 = "Select legs:"; + setWidgetIsHidden(false, new WidgetPointer(1028,102)); + break; + case 7: + ivar0 = 67371107; + if (IsFemale()) { + ivar1 = 1137; + ivar2 = 3295; + ivar3 = 3294; + ivar4 = 13; + } else { + ivar1 = 1136; + ivar2 = 3292; + ivar3 = 3291; + ivar4 = 6; + } + ivar5 = globalint_1014; + ivar6 = 3297; + ivar7 = 753; + ivar8 = 3296; + ivar9 = 3; + ivar10 = globalint_1018; + svar0 = "Select footwear:"; + setWidgetIsHidden(false, new WidgetPointer(1028,102)); + } + deleteAllExtraChilds(new WidgetPointer(1028,94)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(ivar0)); + setScriptCallOnMouseExit(382, "", new WidgetPointer(ivar0)); + script_376(67371102, ivar0, -1, 9878498, 2909586, 0, 0); + if (ivar0 != 67371103) { + setScriptCallOnMouseEntered(375, new WidgetPointer(1028,94), new WidgetPointer(-32768,3), -1, 14006640, 10913874, 0, 6, "IIiiiii", new WidgetPointer(1028,95)); + setScriptCallOnMouseExit(377, new WidgetPointer(1028,94), 6, "Ii", new WidgetPointer(1028,95)); + } + setScriptCallOnMouseOver(378, cs2method2801(1, new WidgetPointer(1028,95)), new WidgetPointer(-32768,3), -1, -2147483647, "sIii", new WidgetPointer(1028,95)); + if (ivar0 != 67371104) { + setScriptCallOnMouseEntered(375, new WidgetPointer(1028,94), new WidgetPointer(-32768,3), -1, 14006640, 10913874, 0, 6, "IIiiiii", new WidgetPointer(1028,96)); + setScriptCallOnMouseExit(377, new WidgetPointer(1028,94), 6, "Ii", new WidgetPointer(1028,96)); + } + setScriptCallOnMouseOver(378, cs2method2801(1, new WidgetPointer(1028,96)), new WidgetPointer(-32768,3), -1, -2147483647, "sIii", new WidgetPointer(1028,96)); + if (ivar0 != 67371108) { + setScriptCallOnMouseEntered(375, new WidgetPointer(1028,94), new WidgetPointer(-32768,3), -1, 14006640, 10913874, 0, 6, "IIiiiii", new WidgetPointer(1028,100)); + setScriptCallOnMouseExit(377, new WidgetPointer(1028,94), 6, "Ii", new WidgetPointer(1028,100)); + } + setScriptCallOnMouseOver(378, cs2method2801(1, new WidgetPointer(1028,100)), new WidgetPointer(-32768,3), -1, -2147483647, "sIii", new WidgetPointer(1028,100)); + if (ivar0 != 67371105) { + setScriptCallOnMouseEntered(375, new WidgetPointer(1028,94), new WidgetPointer(-32768,3), -1, 14006640, 10913874, 0, 6, "IIiiiii", new WidgetPointer(1028,97)); + setScriptCallOnMouseExit(377, new WidgetPointer(1028,94), 6, "Ii", new WidgetPointer(1028,97)); + } + setScriptCallOnMouseOver(378, cs2method2801(1, new WidgetPointer(1028,97)), new WidgetPointer(-32768,3), -1, -2147483647, "sIii", new WidgetPointer(1028,97)); + if (ivar0 != 67371106) { + setScriptCallOnMouseEntered(375, new WidgetPointer(1028,94), new WidgetPointer(-32768,3), -1, 14006640, 10913874, 0, 6, "IIiiiii", new WidgetPointer(1028,98)); + setScriptCallOnMouseExit(377, new WidgetPointer(1028,94), 6, "Ii", new WidgetPointer(1028,98)); + } + setScriptCallOnMouseOver(378, cs2method2801(1, new WidgetPointer(1028,98)), new WidgetPointer(-32768,3), -1, -2147483647, "sIii", new WidgetPointer(1028,98)); + if (ivar0 != 67371107) { + setScriptCallOnMouseEntered(375, new WidgetPointer(1028,94), new WidgetPointer(-32768,3), -1, 14006640, 10913874, 0, 6, "IIiiiii", new WidgetPointer(1028,99)); + setScriptCallOnMouseExit(377, new WidgetPointer(1028,94), 6, "Ii", new WidgetPointer(1028,99)); + } + setScriptCallOnMouseOver(378, cs2method2801(1, new WidgetPointer(1028,99)), new WidgetPointer(-32768,3), -1, -2147483647, "sIii", new WidgetPointer(1028,99)); + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = -1; + ivar16 = -1; + ivar17 = -1; + ivar18 = 0; + svar1 = ""; + deleteAllExtraChilds(new WidgetPointer(1028,107)); + deleteAllExtraChilds(new WidgetPointer(1028,104)); + if (((ivar1 != -1) && (ivar2 != -1)) && (ivar4 != -1)) { + ivar14 = divide(subtract(getWidgetActualWidth(new WidgetPointer(1028,107)), multiply(4, 65)), 3); + ivar12 = getCommonDefinitionSize(ivar1); + while (ivar11 < ivar12) { + createExtraChild(new WidgetPointer(1028,107), 5, ivar11); + setWidgetSize(65, 65, 0, 0); + setWidgetPosition(multiply(mod(ivar11, 4), add(65, ivar14)), multiply(divide(ivar11, 4), add(65, ivar14)), 0, 0); + setWidgetSprite(cs2method_3408(105, 100, ivar2, ivar11)); + if (((boolean)globalint_1020)) { + ivar15 = cs2method_3408(105, 74, ivar1, ivar11); + if (ivar15 != -1) { + svar1 = getOtherCommonData(ivar15, 792); + setWidgetContextMenuOption(1, svar1); + ivar16 = getOtherCommonData(ivar15, 788); + } else { + stack_dump0 = -1; + svar1 = ""; + ivar16 = stack_dump0; + } + } else { + svar1 = cs2method_3408(105, 115, ivar3, ivar11); + setWidgetContextMenuOption(1, svar1); + ivar16 = cs2method_3408(105, 75, ivar1, ivar11); + } + if (ivar5 == ivar16) { + ivar17 = ivar11; + ivar18 = getWidgetActualY(); + if (strLength(svar1) > 0) { + svar0 = svar0 + " " + svar1; + } + setScriptCallOnMouseExit(382, ""); + } else { + setScriptCallOnClickContextMenu(355, -2147483644, ivar16, ivar4, "iKi"); + setScriptCallOnMouseEntered(373, new WidgetPointer(-32768,3), -2147483643, add(ivar12, 1), 2, 1, "Iiii1"); + setScriptCallOnMouseExit(373, new WidgetPointer(-32768,3), -2147483643, add(ivar12, 1), 2, 0, "Iiii1"); + } + if (strLength(svar1) > 0) { + setScriptCallOnMouseOver(378, svar1, new WidgetPointer(-32768,3), -2147483643, -2147483647, "sIii"); + } + ivar13 = getWidgetActualY(); + ivar11 = add(ivar11, 1); + } + ivar13 = add(ivar13, 65); + createExtraChild(new WidgetPointer(1028,107), 3, ivar12); + if ((ivar17 != -1) && setWidgetRegister(new WidgetPointer(1028,107), ivar17)) { + setWidgetSize(subtract(getWidgetActualWidth(), 6), subtract(getWidgetActualHeight(), 6), 0, 0); + setWidgetPosition(add(getWidgetActualX(), 3), add(getWidgetActualY(), 3), 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(175); + setWidgetFilled(1); + } else { + setWidgetHidden(1); + } + } + ivar19 = 3466; + if (ivar13 > getWidgetActualHeight(new WidgetPointer(1028,107))) { + setWidgetScrollMax(0, ivar13, new WidgetPointer(1028,107)); + if (ivar18 < cs2method2601(new WidgetPointer(1028,107))) { + cs2method2100(0, subtract(ivar18, 15), new WidgetPointer(1028,107)); + } else { + if (add(ivar18, 65) >= add(cs2method2601(new WidgetPointer(1028,107)), getWidgetActualHeight(new WidgetPointer(1028,107)))) { + cs2method2100(0, subtract(add(add(ivar18, 65), 15), getWidgetActualHeight(new WidgetPointer(1028,107))), new WidgetPointer(1028,107)); + } + } + script_31(67371113, 67371115, 3471, 3468, 3469, 3470, 3465, 3464); + if (setWidgetRegister(new WidgetPointer(1028,105), 4)) { + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + ivar19 = 3467; + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + ivar19 = 3464; + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + ivar19 = 3465; + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + } + } else if (((boolean)globalint_1020)) { + script_374(67371115, 20, "Please choose your skin colour" + "
" + "from the selection on the right."); + } else { + if ((globalint_1020 == 2) && IsFemale()) { + script_374(67371115, 20, "Female characters cannot have" + "
" + "facial hair in RuneScape."); + } + } + cs2method2100(0, 0, new WidgetPointer(1028,107)); + setWidgetScrollMax(0, 0, new WidgetPointer(1028,107)); + deleteAllExtraChilds(new WidgetPointer(1028,105)); + script_374(67371112, 0, svar0); + deleteAllExtraChilds(new WidgetPointer(1028,111)); + ivar20 = -1; + ivar17 = -1; + ivar11 = 0; + ivar18 = 0; + ivar21 = 0; + if (((ivar6 != -1) && (ivar7 != -1)) && (ivar9 != -1)) { + ivar12 = getCommonDefinitionSize(ivar6); + ivar21 = add(ivar12, 6); + while (ivar11 < ivar12) { + createExtraChild(new WidgetPointer(1028,111), 3, ivar11); + setWidgetSize(15, subtract(17, 2), 1, 0); + setWidgetPosition(0, add(multiply(ivar11, 17), 1), 1, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(cs2method_3408(105, 105, ivar7, ivar11))); + svar1 = cs2method_3408(105, 115, ivar8, ivar11); + setWidgetContextMenuOption(1, svar1); + ivar20 = cs2method_3408(105, 105, ivar6, ivar11); + if (ivar10 == ivar20) { + ivar17 = ivar11; + ivar18 = getWidgetActualY(); + setScriptCallOnMouseExit(382, ""); + } else { + setScriptCallOnClickContextMenu(357, -2147483644, ivar20, ivar9, "iii"); + setScriptCallOnMouseEntered(375, new WidgetPointer(-32768,3), new WidgetPointer(-32768,3), -2147483643, 14006640, 10913874, 1, ivar21, "IIiiiii"); + setScriptCallOnMouseExit(377, new WidgetPointer(-32768,3), ivar21, "Ii"); + } + if (strLength(svar1) > 0) { + setScriptCallOnMouseOver(381, svar1, new WidgetPointer(-32768,3), -2147483643, -2147483646, "sIii"); + } + ivar11 = add(ivar11, 1); + } + } else { + ivar12 = 0; + } + ivar13 = max(multiply(ivar12, 17), 0); + if (ivar13 > subtract(getWidgetActualHeight(new WidgetPointer(1028,108)), 12)) { + setWidgetSize(23, 12, 1, 1, new WidgetPointer(1028,111)); + setWidgetPosition(5, 0, 0, 1, new WidgetPointer(1028,111)); + setWidgetScrollMax(0, ivar13, new WidgetPointer(1028,111)); + if (ivar18 < cs2method2601(new WidgetPointer(1028,111))) { + cs2method2100(0, subtract(ivar18, 5), new WidgetPointer(1028,111)); + } else { + if (add(ivar18, 17) >= add(cs2method2601(new WidgetPointer(1028,111)), getWidgetActualHeight(new WidgetPointer(1028,111)))) { + cs2method2100(0, subtract(add(add(ivar18, 17), 5), getWidgetActualHeight(new WidgetPointer(1028,111))), new WidgetPointer(1028,111)); + } + } + setWidgetIsHidden(false, new WidgetPointer(1028,110)); + script_31(67371118, 67371119, 3471, 3468, 3469, 3470, 3465, 3464); + if (setWidgetRegister(new WidgetPointer(1028,110), 4)) { + ivar19 = 3466; + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + ivar19 = 3467; + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + ivar19 = 3464; + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + ivar19 = 3465; + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + } + } else { + setWidgetSize(10, 12, 1, 1, new WidgetPointer(1028,111)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(1028,111)); + setWidgetScrollMax(0, 0, new WidgetPointer(1028,111)); + cs2method2100(0, 0, new WidgetPointer(1028,111)); + deleteAllExtraChilds(new WidgetPointer(1028,110)); + setWidgetIsHidden(true, new WidgetPointer(1028,110)); + } + if (ivar17 != -1) { + script_376(67371119, 67371119, ivar17, 9878498, 2909586, 1, ivar12); + } else { + script_376(67371119, -1, -1, 0, 0, 1, ivar12); + } + script_389(); + return; +} diff --git a/dumps/scripts/3910.cs2 b/dumps/scripts/3910.cs2 new file mode 100644 index 000000000..bdddfa4f3 --- /dev/null +++ b/dumps/scripts/3910.cs2 @@ -0,0 +1,4 @@ +void script_3910() { + script_304(49473146); + return; +} diff --git a/dumps/scripts/3911.cs2 b/dumps/scripts/3911.cs2 new file mode 100644 index 000000000..14af55908 --- /dev/null +++ b/dumps/scripts/3911.cs2 @@ -0,0 +1,4 @@ +void script_3911() { + script_304(49096310); + return; +} diff --git a/dumps/scripts/3912.cs2 b/dumps/scripts/3912.cs2 new file mode 100644 index 000000000..bb2e173cd --- /dev/null +++ b/dumps/scripts/3912.cs2 @@ -0,0 +1,4 @@ +void script_3912() { + script_304(28726389); + return; +} diff --git a/dumps/scripts/3913.cs2 b/dumps/scripts/3913.cs2 new file mode 100644 index 000000000..e6e8aad72 --- /dev/null +++ b/dumps/scripts/3913.cs2 @@ -0,0 +1,4 @@ +void script_3913() { + script_304(45426610); + return; +} diff --git a/dumps/scripts/3914.cs2 b/dumps/scripts/3914.cs2 new file mode 100644 index 000000000..3ab362a3f --- /dev/null +++ b/dumps/scripts/3914.cs2 @@ -0,0 +1,4 @@ +void script_3914() { + script_304(53007799); + return; +} diff --git a/dumps/scripts/3915.cs2 b/dumps/scripts/3915.cs2 new file mode 100644 index 000000000..86490cc36 --- /dev/null +++ b/dumps/scripts/3915.cs2 @@ -0,0 +1,4 @@ +void script_3915() { + script_304(52155741); + return; +} diff --git a/dumps/scripts/3916.cs2 b/dumps/scripts/3916.cs2 new file mode 100644 index 000000000..e695157eb --- /dev/null +++ b/dumps/scripts/3916.cs2 @@ -0,0 +1,4 @@ +void script_3916() { + script_304(53237106); + return; +} diff --git a/dumps/scripts/3917.cs2 b/dumps/scripts/3917.cs2 new file mode 100644 index 000000000..b5eff2438 --- /dev/null +++ b/dumps/scripts/3917.cs2 @@ -0,0 +1,4 @@ +void script_3917() { + script_304(53908898); + return; +} diff --git a/dumps/scripts/3918.cs2 b/dumps/scripts/3918.cs2 new file mode 100644 index 000000000..f0807729e --- /dev/null +++ b/dumps/scripts/3918.cs2 @@ -0,0 +1,4 @@ +void script_3918() { + script_304(53957991); + return; +} diff --git a/dumps/scripts/3919.cs2 b/dumps/scripts/3919.cs2 new file mode 100644 index 000000000..1deddf29d --- /dev/null +++ b/dumps/scripts/3919.cs2 @@ -0,0 +1,4 @@ +void script_3919() { + script_304(44442972); + return; +} diff --git a/dumps/scripts/392.cs2 b/dumps/scripts/392.cs2 new file mode 100644 index 000000000..1bca2fde7 --- /dev/null +++ b/dumps/scripts/392.cs2 @@ -0,0 +1,14 @@ +void script_392(int arg0,int arg1) { + if (arg0 == -1) { + arg0 = 1112; + } + setWidgetModel(getOtherCommonData(arg0, 1166), new WidgetPointer(1028,113)); + if (((boolean)arg1)) { + setWidgetAnimation(getOtherCommonData(arg0, 1165), new WidgetPointer(1028,112)); + setWidgetAnimation(getOtherCommonData(arg0, 1168), new WidgetPointer(1028,113)); + } else { + setWidgetAnimation(getOtherCommonData(arg0, 1164), new WidgetPointer(1028,112)); + setWidgetAnimation(getOtherCommonData(arg0, 1167), new WidgetPointer(1028,113)); + } + return; +} diff --git a/dumps/scripts/3920.cs2 b/dumps/scripts/3920.cs2 new file mode 100644 index 000000000..30ed80f41 --- /dev/null +++ b/dumps/scripts/3920.cs2 @@ -0,0 +1,4 @@ +void script_3920() { + script_304(851289461); + return; +} diff --git a/dumps/scripts/3921.cs2 b/dumps/scripts/3921.cs2 new file mode 100644 index 000000000..408982b03 --- /dev/null +++ b/dumps/scripts/3921.cs2 @@ -0,0 +1,4 @@ +void script_3921() { + script_304(46425529); + return; +} diff --git a/dumps/scripts/3922.cs2 b/dumps/scripts/3922.cs2 new file mode 100644 index 000000000..17adf2408 --- /dev/null +++ b/dumps/scripts/3922.cs2 @@ -0,0 +1,4 @@ +void script_3922() { + script_304(46802271); + return; +} diff --git a/dumps/scripts/3923.cs2 b/dumps/scripts/3923.cs2 new file mode 100644 index 000000000..0c1f634aa --- /dev/null +++ b/dumps/scripts/3923.cs2 @@ -0,0 +1,4 @@ +void script_3923() { + script_304(46343475); + return; +} diff --git a/dumps/scripts/3924.cs2 b/dumps/scripts/3924.cs2 new file mode 100644 index 000000000..2af82675c --- /dev/null +++ b/dumps/scripts/3924.cs2 @@ -0,0 +1,4 @@ +void script_3924(int arg0,int arg1) { + script_41(49479737); + return; +} diff --git a/dumps/scripts/3925.cs2 b/dumps/scripts/3925.cs2 new file mode 100644 index 000000000..87224b1f7 --- /dev/null +++ b/dumps/scripts/3925.cs2 @@ -0,0 +1,6 @@ +void script_3925() { + setWidgetSprite(4031, new WidgetPointer(311,36)); + setWidgetSprite(4031, new WidgetPointer(311,38)); + setWidgetSprite(4037, new WidgetPointer(311,37)); + return; +} diff --git a/dumps/scripts/3926.cs2 b/dumps/scripts/3926.cs2 new file mode 100644 index 000000000..5d0dcf79f --- /dev/null +++ b/dumps/scripts/3926.cs2 @@ -0,0 +1,6 @@ +void script_3926() { + setWidgetSprite(4032, new WidgetPointer(311,36)); + setWidgetSprite(4032, new WidgetPointer(311,38)); + setWidgetSprite(4038, new WidgetPointer(311,37)); + return; +} diff --git a/dumps/scripts/3927.cs2 b/dumps/scripts/3927.cs2 new file mode 100644 index 000000000..39c3ddb9c --- /dev/null +++ b/dumps/scripts/3927.cs2 @@ -0,0 +1,7 @@ +void script_3927(int arg0) { + cs2method2309(1, 171, new WidgetPointer(arg0)); + cs2method2309(2, 171, new WidgetPointer(arg0)); + cs2method2309(3, 171, new WidgetPointer(arg0)); + cs2method2309(4, 171, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3928.cs2 b/dumps/scripts/3928.cs2 new file mode 100644 index 000000000..91bddbf2e --- /dev/null +++ b/dumps/scripts/3928.cs2 @@ -0,0 +1,4 @@ +void script_3928(int arg0,int arg1,int arg2) { + script_3929(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3929.cs2 b/dumps/scripts/3929.cs2 new file mode 100644 index 000000000..8848a40a1 --- /dev/null +++ b/dumps/scripts/3929.cs2 @@ -0,0 +1,34 @@ +void script_3929(int arg0,int arg1,int arg2) { + if (((boolean)arg2)) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(4038); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(4032); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(4035); + } + } else if (cs2method7007() == arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(4039); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(4033); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(4036); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(4037); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(4031); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(4034); + } + } + return; +} diff --git a/dumps/scripts/393.cs2 b/dumps/scripts/393.cs2 new file mode 100644 index 000000000..b56694c7b --- /dev/null +++ b/dumps/scripts/393.cs2 @@ -0,0 +1,31 @@ +void script_393() { + setWidgetIsHidden(true, new WidgetPointer(1010,4)); + setWidgetIsHidden(true, new WidgetPointer(1010,20)); + setWidgetText(new WidgetPointer(1010,1), "Command Options"); + setWidgetPosition(0, 133, 0, 0, new WidgetPointer(1010,40)); + setWidgetSize(190, 116, 0, 0, new WidgetPointer(1010,40)); + setWidgetText(new WidgetPointer(1010,41), "Comm Orb Recharging"); + setWidgetPosition(0, 133, 0, 0, new WidgetPointer(1010,41)); + setWidgetSize(190, 116, 0, 0, new WidgetPointer(1010,41)); + setWidgetTextAlignment(1, 1, 0, new WidgetPointer(1010,41)); + setWidgetPosition(30, 152, 0, 0, new WidgetPointer(1010,34)); + setWidgetPosition(30, 200, 0, 0, new WidgetPointer(1010,37)); + setWidgetText(new WidgetPointer(1010,39), "Recharge"); + setWidgetContextMenuOption(1, new WidgetPointer(1010,39), "Recharge"); + setWidgetPosition(4, 148, 0, 0, new WidgetPointer(1010,31)); + setWidgetPosition(15, 204, 0, 0, new WidgetPointer(1010,25)); + setWidgetPosition(105, 204, 0, 0, new WidgetPointer(1010,28)); + setWidgetIsHidden(true, new WidgetPointer(1010,32)); + setWidgetIsHidden(true, new WidgetPointer(1019,5)); + setWidgetIsHidden(true, new WidgetPointer(1019,6)); + setWidgetIsHidden(true, new WidgetPointer(1019,9)); + setWidgetIsHidden(true, new WidgetPointer(1019,8)); + setWidgetText(new WidgetPointer(1019,3), "Retreat"); + setWidgetIsHidden(true, new WidgetPointer(1019,12)); + setWidgetText(new WidgetPointer(1019,16), "Retreat"); + setWidgetContextMenuOption(1, new WidgetPointer(1019,16), "Retreat"); + setWidgetPosition(30, 0, 0, 1, new WidgetPointer(1019,1)); + setWidgetPosition(0, 50, 0, 1, new WidgetPointer(1019,0)); + setWidgetText(new WidgetPointer(1019,0), "Force Savant to teleport you to safety and order your remaining troops to fall back."); + return; +} diff --git a/dumps/scripts/3930.cs2 b/dumps/scripts/3930.cs2 new file mode 100644 index 000000000..8f18a9197 --- /dev/null +++ b/dumps/scripts/3930.cs2 @@ -0,0 +1,4 @@ +void script_3930(int arg0,int arg1,int arg2) { + script_3931(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3931.cs2 b/dumps/scripts/3931.cs2 new file mode 100644 index 000000000..e5507a19c --- /dev/null +++ b/dumps/scripts/3931.cs2 @@ -0,0 +1,24 @@ +void script_3931(int arg0,int arg1,int arg2) { + if (((boolean)arg2)) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(4038); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(4032); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(4035); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(4037); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(4031); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(4034); + } + } + return; +} diff --git a/dumps/scripts/3932.cs2 b/dumps/scripts/3932.cs2 new file mode 100644 index 000000000..0c72b925a --- /dev/null +++ b/dumps/scripts/3932.cs2 @@ -0,0 +1,37 @@ +void script_3932(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6) { + deleteAllExtraChilds(new WidgetPointer(arg2)); + setWidgetSize(arg4, 27, 0, 0, new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(6, 26, 1, 0); + setWidgetPosition(0, 0, 1, 1); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(26, 26, 0, 0); + setWidgetPosition(0, 0, 0, 1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(26, 26, 0, 0); + setWidgetPosition(3, 0, 2, 1); + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, -3, 1, 1); + setWidgetFont(3793); + setWidgetRGB(new Color(235, 224, 188)); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(false); + setWidgetText(arg5); + script_3929(arg2, arg3, 0); + if (arg3 == -1) { + setScriptCallOnMouseExit(3930, new WidgetPointer(arg2), arg3, 0, "Ii1", new WidgetPointer(arg2)); + setScriptCallOnMouseEntered(3930, new WidgetPointer(arg2), arg3, 1, "Ii1", new WidgetPointer(arg2)); + } else { + setScriptCallOnMouseExit(3928, new WidgetPointer(arg2), arg3, 0, "Ii1", new WidgetPointer(arg2)); + setScriptCallOnMouseEntered(3928, new WidgetPointer(arg2), arg3, 1, "Ii1", new WidgetPointer(arg2)); + } + if (((boolean)arg0)) { + setScriptCallOnMousePressed(3388, arg3, arg0, arg1, "ii1", new WidgetPointer(arg2)); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(arg2), arg5); + setScriptCallOnClickContextMenu(3388, arg3, arg0, arg1, "ii1", new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/3933.cs2 b/dumps/scripts/3933.cs2 new file mode 100644 index 000000000..482407bdf --- /dev/null +++ b/dumps/scripts/3933.cs2 @@ -0,0 +1,11 @@ +void script_3933(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + if (((boolean)arg2)) { + setWidgetSprite(cs2method_3408(105, 100, 3480, arg3), new WidgetPointer(arg4)); + } else if (arg5 == arg3) { + setWidgetSprite(cs2method_3408(105, 100, 736, arg3), new WidgetPointer(arg4)); + } else { + setWidgetSprite(cs2method_3408(105, 100, 735, arg3), new WidgetPointer(arg4)); + } + return; +} diff --git a/dumps/scripts/3934.cs2 b/dumps/scripts/3934.cs2 new file mode 100644 index 000000000..4934b3ada --- /dev/null +++ b/dumps/scripts/3934.cs2 @@ -0,0 +1,4 @@ +void script_3934(int arg0) { + script_3213(arg0, ""); + return; +} diff --git a/dumps/scripts/3935.cs2 b/dumps/scripts/3935.cs2 new file mode 100644 index 000000000..462a36303 --- /dev/null +++ b/dumps/scripts/3935.cs2 @@ -0,0 +1,3 @@ +void script_3935() { + return; +} diff --git a/dumps/scripts/3936.cs2 b/dumps/scripts/3936.cs2 new file mode 100644 index 000000000..adb0f1d1b --- /dev/null +++ b/dumps/scripts/3936.cs2 @@ -0,0 +1,16 @@ +int script_3936(string arg0) { + int ivar0; + int ivar1; + ivar0 = strLength(arg0); + if (ivar0 > 320) { + return 0; + } + ivar1 = 0; + while (ivar1 < ivar0) { + if (strIndexof(0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'*+-/=?^_.{}~@", substr(ivar1, add(ivar1, 1), arg0)) == -1) { + return 0; + } + ivar1 = add(ivar1, 1); + } + return 1; +} diff --git a/dumps/scripts/3937.cs2 b/dumps/scripts/3937.cs2 new file mode 100644 index 000000000..f372c37e2 --- /dev/null +++ b/dumps/scripts/3937.cs2 @@ -0,0 +1,15 @@ +void script_3937(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + if (arg0 != -1) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + } + if (arg2 != -1) { + setWidgetSprite(arg3, new WidgetPointer(arg2)); + } + if (arg4 != -1) { + setWidgetSprite(arg5, new WidgetPointer(arg4)); + } + if (arg6 != -1) { + setWidgetSprite(arg7, new WidgetPointer(arg6)); + } + return; +} diff --git a/dumps/scripts/3938.cs2 b/dumps/scripts/3938.cs2 new file mode 100644 index 000000000..2e4091af4 --- /dev/null +++ b/dumps/scripts/3938.cs2 @@ -0,0 +1,10 @@ +void script_3938() { + if (((boolean)globalint_1411)) { + globalint_1411 = 0; + setWidgetSprite(4085, new WidgetPointer(673,41)); + } else { + globalint_1411 = 1; + setWidgetSprite(4087, new WidgetPointer(673,41)); + } + return; +} diff --git a/dumps/scripts/3939.cs2 b/dumps/scripts/3939.cs2 new file mode 100644 index 000000000..9926c7b26 --- /dev/null +++ b/dumps/scripts/3939.cs2 @@ -0,0 +1,16 @@ +void script_3939(int arg0) { + if (((boolean)arg0)) { + setWidgetRGB(new Color(250, 250, 250), new WidgetPointer(673,42)); + if (((boolean)globalint_1411)) { + setWidgetSprite(4087, new WidgetPointer(673,41)); + } else { + setWidgetSprite(4085, new WidgetPointer(673,41)); + } + } else if (((boolean)globalint_1411)) { + setWidgetSprite(4086, new WidgetPointer(673,41)); + } else { + setWidgetSprite(4084, new WidgetPointer(673,41)); + } + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(673,42)); + return; +} diff --git a/dumps/scripts/394.cs2 b/dumps/scripts/394.cs2 new file mode 100644 index 000000000..94650efcf --- /dev/null +++ b/dumps/scripts/394.cs2 @@ -0,0 +1,14 @@ +void script_394(int arg0) { + if (((boolean)globalint_1391)) { + cs2method2103(max(subtract(getWidgetShadeColor(new WidgetPointer(arg0)), 10), 0), new WidgetPointer(arg0)); + if (((boolean)getWidgetShadeColor(new WidgetPointer(arg0)))) { + globalint_1391 = 1; + } + } else { + cs2method2103(min(add(getWidgetShadeColor(new WidgetPointer(arg0)), 10), 255), new WidgetPointer(arg0)); + if (getWidgetShadeColor(new WidgetPointer(arg0)) == 255) { + globalint_1391 = 0; + } + } + return; +} diff --git a/dumps/scripts/3940.cs2 b/dumps/scripts/3940.cs2 new file mode 100644 index 000000000..3f77bf96d --- /dev/null +++ b/dumps/scripts/3940.cs2 @@ -0,0 +1,10 @@ +void script_3940() { + setScriptCallOnKeyPress(-1, "", new WidgetPointer(137,56)); + setScriptCallOnKeyPress(3944, -2147483640, false, 0, "iz1", new WidgetPointer(890,55)); + setScriptCallOnMousePressed(3217, -2147483647, new WidgetPointer(890,59), new WidgetPointer(890,60), new WidgetPointer(890,61), 16, "iIIIi", new WidgetPointer(890,60)); + globalint_1099 = 0; + globalstring_330 = ""; + globalint_1412 = 0; + script_3218(58327099, 58327100, 58327101, 16, globalstring_330); + return; +} diff --git a/dumps/scripts/3941.cs2 b/dumps/scripts/3941.cs2 new file mode 100644 index 000000000..0c0d10032 --- /dev/null +++ b/dumps/scripts/3941.cs2 @@ -0,0 +1,4 @@ +void script_3941() { + setScriptCallOnKeyPress(73, -2147483640, false, "iz", new WidgetPointer(137,56)); + return; +} diff --git a/dumps/scripts/3942.cs2 b/dumps/scripts/3942.cs2 new file mode 100644 index 000000000..7e74174b9 --- /dev/null +++ b/dumps/scripts/3942.cs2 @@ -0,0 +1,4 @@ +void script_3942() { + script_2715(); + return; +} diff --git a/dumps/scripts/3943.cs2 b/dumps/scripts/3943.cs2 new file mode 100644 index 000000000..64e5bc8a6 --- /dev/null +++ b/dumps/scripts/3943.cs2 @@ -0,0 +1,16 @@ +void script_3943() { + setWidgetIsHidden(false, new WidgetPointer(1028,90)); + setWidgetIsHidden(true, new WidgetPointer(1028,35)); + setWidgetIsHidden(true, new WidgetPointer(1028,115)); + setWidgetIsHidden(true, new WidgetPointer(1028,117)); + setWidgetIsHidden(true, new WidgetPointer(1028,116)); + setWidgetIsHidden(true, new WidgetPointer(1028,89)); + script_383(); + setScriptCallOnKeyPress(3944, -2147483640, false, 1, "iz1", new WidgetPointer(1028,177)); + setScriptCallOnMousePressed(3217, -2147483647, new WidgetPointer(1028,181), new WidgetPointer(1028,182), new WidgetPointer(1028,183), 16, "iIIIi", new WidgetPointer(1028,182)); + globalint_1099 = 0; + globalstring_330 = ""; + globalint_1412 = 0; + script_3218(67371189, 67371190, 67371191, 16, globalstring_330); + return; +} diff --git a/dumps/scripts/3944.cs2 b/dumps/scripts/3944.cs2 new file mode 100644 index 000000000..01379a607 --- /dev/null +++ b/dumps/scripts/3944.cs2 @@ -0,0 +1,55 @@ +void script_3944(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_802_struct(1,1,0) structdump_5; + if (((boolean)globalint_1412)) { + return; + } + ivar3 = 67371189; + ivar4 = 67371190; + ivar5 = 67371191; + if (((boolean)arg2)) { + ivar3 = 58327099; + ivar4 = 58327100; + ivar5 = 58327101; + } + switch (arg0) { + case 13: + return; + case 84: + globalint_1412 = 1; + return; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1099 = script_1553(arg0, globalint_1099, globalstring_330); + script_3218(ivar3, ivar4, ivar5, 16, globalstring_330); + return; + } + if (((strLength(globalstring_330) >= 12) && (arg0 != 85)) && (arg0 != 101)) { + return; + } + if (((strIndexof(((char)arg1), 0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 _-") != -1) || (arg0 == 85)) || (arg0 == 101)) { + stack_dump0 = globalint_1099; + stack_dump1 = 2; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_330; + structdump_5 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_5.stringpart_0; + globalint_1099 = structdump_5.intpart_0; + globalstring_330 = stack_dump4; + setWidgetText(new WidgetPointer(ivar4), globalstring_330); + script_3218(ivar3, ivar4, ivar5, 16, globalstring_330); + } + return; +} diff --git a/dumps/scripts/3945.cs2 b/dumps/scripts/3945.cs2 new file mode 100644 index 000000000..cac37a11b --- /dev/null +++ b/dumps/scripts/3945.cs2 @@ -0,0 +1,76 @@ +void script_3945(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + flow_0: + if (((boolean)arg2)) { + globalint_1412 = 1; + } + SWITCH (arg0) { + case 1: + GOTO flow_5 + case 2: + GOTO flow_8 + case 3: + GOTO flow_11 + case 4: + GOTO flow_14 + case 5: + GOTO flow_17 + case 6: + GOTO flow_20 + } + if (((boolean)arg2)) { + sendStringInput(globalstring_330); + } + flow_4: + GOTO flow_23 + flow_5: + if (((boolean)arg2)) { + sendStringInput(globalstring_331); + } + globalstring_330 = globalstring_331; + GOTO flow_23 + flow_8: + if (((boolean)arg2)) { + sendStringInput(globalstring_332); + } + globalstring_330 = globalstring_332; + GOTO flow_23 + flow_11: + if (((boolean)arg2)) { + sendStringInput(globalstring_333); + } + globalstring_330 = globalstring_333; + GOTO flow_23 + flow_14: + if (((boolean)arg2)) { + sendStringInput(globalstring_334); + } + globalstring_330 = globalstring_334; + GOTO flow_23 + flow_17: + if (((boolean)arg2)) { + sendStringInput(globalstring_335); + } + globalstring_330 = globalstring_335; + GOTO flow_23 + flow_20: + if (((boolean)arg2)) { + sendStringInput(globalstring_336); + } + globalstring_330 = globalstring_336; + flow_23: + ivar3 = 67371189; + ivar4 = 67371190; + ivar5 = 67371191; + if (((boolean)arg1)) { + ivar3 = 58327099; + ivar4 = 58327100; + ivar5 = 58327101; + } + setWidgetText(new WidgetPointer(ivar4), globalstring_330); + globalint_1099 = strLength(globalstring_330); + script_3218(ivar3, ivar4, ivar5, 16, globalstring_330); + return; +} diff --git a/dumps/scripts/3946.cs2 b/dumps/scripts/3946.cs2 new file mode 100644 index 000000000..a471d89a3 --- /dev/null +++ b/dumps/scripts/3946.cs2 @@ -0,0 +1,4 @@ +void script_3946(int arg0,string arg1,string arg2,string arg3,string arg4,string arg5,string arg6) { + script_3947(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + return; +} diff --git a/dumps/scripts/3947.cs2 b/dumps/scripts/3947.cs2 new file mode 100644 index 000000000..2671fc355 --- /dev/null +++ b/dumps/scripts/3947.cs2 @@ -0,0 +1,18 @@ +void script_3947(int arg0,string arg1,string arg2,string arg3,string arg4,string arg5,string arg6) { + if (((boolean)arg0)) { + setWidgetContextMenuOption(1, new WidgetPointer(1028,158), arg1); + setWidgetContextMenuOption(1, new WidgetPointer(1028,159), arg2); + setWidgetContextMenuOption(1, new WidgetPointer(1028,160), arg3); + setWidgetContextMenuOption(1, new WidgetPointer(1028,161), arg4); + setWidgetContextMenuOption(1, new WidgetPointer(1028,162), arg5); + setWidgetContextMenuOption(1, new WidgetPointer(1028,163), arg6); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(890,37), arg1); + setWidgetContextMenuOption(1, new WidgetPointer(890,38), arg2); + setWidgetContextMenuOption(1, new WidgetPointer(890,39), arg3); + setWidgetContextMenuOption(1, new WidgetPointer(890,40), arg4); + setWidgetContextMenuOption(1, new WidgetPointer(890,41), arg5); + setWidgetContextMenuOption(1, new WidgetPointer(890,42), arg6); + } + return; +} diff --git a/dumps/scripts/3948.cs2 b/dumps/scripts/3948.cs2 new file mode 100644 index 000000000..2dbe23488 --- /dev/null +++ b/dumps/scripts/3948.cs2 @@ -0,0 +1,4 @@ +void script_3948(int arg0) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(890,52)), arg0, 1, 0, new WidgetPointer(890,52)); + return; +} diff --git a/dumps/scripts/3949.cs2 b/dumps/scripts/3949.cs2 new file mode 100644 index 000000000..5d7ace23f --- /dev/null +++ b/dumps/scripts/3949.cs2 @@ -0,0 +1,10 @@ +void script_3949(int arg0,int arg1) { + if (((boolean)arg1)) { + setWidgetRGB(new Color(250, 250, 250), new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), concat("", strRemoveEntities(getWidgetText(new WidgetPointer(arg0))))); + } else { + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), concat("", strRemoveEntities(getWidgetText(new WidgetPointer(arg0))))); + } + return; +} diff --git a/dumps/scripts/395.cs2 b/dumps/scripts/395.cs2 new file mode 100644 index 000000000..72b3dee6f --- /dev/null +++ b/dumps/scripts/395.cs2 @@ -0,0 +1,6 @@ +int script_395() { + if (add(getSkillActualLvl(0), getSkillActualLvl(2)) == 130) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/3950.cs2 b/dumps/scripts/3950.cs2 new file mode 100644 index 000000000..51a5047b5 --- /dev/null +++ b/dumps/scripts/3950.cs2 @@ -0,0 +1,10 @@ +void script_3950(int arg0,int arg1) { + if (((boolean)arg1)) { + setWidgetRGB(new Color(250, 250, 250), new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), concat("", strRemoveEntities(getWidgetText(new WidgetPointer(arg0))))); + } else { + setWidgetRGB(new Color(205, 190, 154), new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), concat("", strRemoveEntities(getWidgetText(new WidgetPointer(arg0))))); + } + return; +} diff --git a/dumps/scripts/3951.cs2 b/dumps/scripts/3951.cs2 new file mode 100644 index 000000000..426aeefd8 --- /dev/null +++ b/dumps/scripts/3951.cs2 @@ -0,0 +1,9 @@ +void script_3951() { + globalstring_337 = globalstring_331; + globalstring_338 = globalstring_332; + globalstring_339 = globalstring_333; + globalstring_340 = globalstring_334; + globalstring_341 = globalstring_335; + globalstring_342 = globalstring_336; + return; +} diff --git a/dumps/scripts/3952.cs2 b/dumps/scripts/3952.cs2 new file mode 100644 index 000000000..0eb2baeb1 --- /dev/null +++ b/dumps/scripts/3952.cs2 @@ -0,0 +1,25 @@ +void script_3952(int arg0) { + globalstring_331 = globalstring_337; + globalstring_332 = globalstring_338; + globalstring_333 = globalstring_339; + globalstring_334 = globalstring_340; + globalstring_335 = globalstring_341; + globalstring_336 = globalstring_342; + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(1028,158), concat("", globalstring_331)); + setWidgetText(new WidgetPointer(1028,159), concat("", globalstring_332)); + setWidgetText(new WidgetPointer(1028,160), concat("", globalstring_333)); + setWidgetText(new WidgetPointer(1028,161), concat("", globalstring_334)); + setWidgetText(new WidgetPointer(1028,162), concat("", globalstring_335)); + setWidgetText(new WidgetPointer(1028,163), concat("", globalstring_336)); + } else { + setWidgetText(new WidgetPointer(890,37), concat("", globalstring_331)); + setWidgetText(new WidgetPointer(890,38), concat("", globalstring_332)); + setWidgetText(new WidgetPointer(890,39), concat("", globalstring_333)); + setWidgetText(new WidgetPointer(890,40), concat("", globalstring_334)); + setWidgetText(new WidgetPointer(890,41), concat("", globalstring_335)); + setWidgetText(new WidgetPointer(890,42), concat("", globalstring_336)); + } + script_3947(arg0, globalstring_331, globalstring_332, globalstring_333, globalstring_334, globalstring_335, globalstring_336); + return; +} diff --git a/dumps/scripts/3953.cs2 b/dumps/scripts/3953.cs2 new file mode 100644 index 000000000..6e82d7593 --- /dev/null +++ b/dumps/scripts/3953.cs2 @@ -0,0 +1,22 @@ +void script_3953(int arg0) { + globalstring_327 = globalstring_326; + if (strLength(globalstring_326) <= 0) { + script_3213(44105841, "Please enter your Email address again here."); + return; + } + if (stringMethod4107(globalstring_122, globalstring_326) != 0) { + script_3213(44105841, "Please ensure both Email addresses match."); + return; + } + if (getWidgetSpriteId(new WidgetPointer(673,94)) == 4061) { + script_3213(44105841, getWidgetText(new WidgetPointer(673,137))); + return; + } + setWidgetSprite(4059, new WidgetPointer(673,113)); + setWidgetIsHidden(true, new WidgetPointer(673,118)); + setWidgetIsHidden(true, new WidgetPointer(673,31)); + if (((boolean)arg0)) { + script_2714(7, 1); + } + return; +} diff --git a/dumps/scripts/3954.cs2 b/dumps/scripts/3954.cs2 new file mode 100644 index 000000000..108eddb8e --- /dev/null +++ b/dumps/scripts/3954.cs2 @@ -0,0 +1,18 @@ +int script_3954(int arg0) { + globalint_1408 = globalint_1407; + if (globalint_1407 < 1) { + script_3213(44105777, "Please enter your age, in years, here."); + return 0; + } + if (globalint_1407 > 120) { + script_3213(44105777, "Please check the age entered and try again."); + return 0; + } + setWidgetSprite(4059, new WidgetPointer(673,49)); + setWidgetIsHidden(true, new WidgetPointer(673,125)); + setWidgetIsHidden(true, new WidgetPointer(673,31)); + if (((boolean)arg0)) { + script_2714(6, 1); + } + return 1; +} diff --git a/dumps/scripts/3955.cs2 b/dumps/scripts/3955.cs2 new file mode 100644 index 000000000..ffd800323 --- /dev/null +++ b/dumps/scripts/3955.cs2 @@ -0,0 +1,8 @@ +void script_3955(int arg0,int arg1) { + if (((mod(subtract(getClientCycle(), arg0), 40) < 20) && hasWindowFocus()) && ((boolean)globalint_1412)) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/3956.cs2 b/dumps/scripts/3956.cs2 new file mode 100644 index 000000000..4a92dca35 --- /dev/null +++ b/dumps/scripts/3956.cs2 @@ -0,0 +1,4 @@ +void script_3956() { + script_2007(48758898, 48758791, 1, 0); + return; +} diff --git a/dumps/scripts/3957.cs2 b/dumps/scripts/3957.cs2 new file mode 100644 index 000000000..d383a4360 --- /dev/null +++ b/dumps/scripts/3957.cs2 @@ -0,0 +1,26 @@ +void script_3957(int arg0) { + int ivar1; + flow_0: + ivar1 = getWidgetSpriteId(new WidgetPointer(arg0)); + SWITCH (ivar1) { + case 4117: + GOTO flow_1 + case 4118: + GOTO flow_2 + case 4119: + GOTO flow_3 + } + return; + flow_1: + setWidgetSprite(4122, new WidgetPointer(arg0)); + GOTO flow_4 + flow_2: + setWidgetSprite(4123, new WidgetPointer(arg0)); + GOTO flow_4 + flow_3: + setWidgetSprite(4124, new WidgetPointer(arg0)); + flow_4: + setWidgetSize(133, 16, 0, 0, new WidgetPointer(744,81)); + setScriptCallOnGameloop(3961, 0, new WidgetPointer(744,7), "iI", new WidgetPointer(744,7)); + return; +} diff --git a/dumps/scripts/3958.cs2 b/dumps/scripts/3958.cs2 new file mode 100644 index 000000000..f8f6a596d --- /dev/null +++ b/dumps/scripts/3958.cs2 @@ -0,0 +1,4 @@ +void script_3958() { + setScriptCallOnGameloop(3961, 0, new WidgetPointer(744,7), "iI", new WidgetPointer(744,7)); + return; +} diff --git a/dumps/scripts/3959.cs2 b/dumps/scripts/3959.cs2 new file mode 100644 index 000000000..125714433 --- /dev/null +++ b/dumps/scripts/3959.cs2 @@ -0,0 +1,4 @@ +void script_3959(int arg0) { + script_3960(arg0); + return; +} diff --git a/dumps/scripts/396.cs2 b/dumps/scripts/396.cs2 new file mode 100644 index 000000000..5f2897f04 --- /dev/null +++ b/dumps/scripts/396.cs2 @@ -0,0 +1,27 @@ +void script_396() { + setWidgetText(new WidgetPointer(433,11), intToStr(bitconfig_2469)); + setWidgetText(new WidgetPointer(433,12), intToStr(bitconfig_2470)); + setWidgetText(new WidgetPointer(433,13), intToStr(bitconfig_2471)); + setWidgetText(new WidgetPointer(433,14), intToStr(bitconfig_2472)); + if (((boolean)bitconfig_2469)) { + setWidgetRGB(new Color(255, 0, 51), new WidgetPointer(433,11)); + } else { + setWidgetRGB(new Color(0, 192, 0), new WidgetPointer(433,11)); + } + if (((boolean)bitconfig_2470)) { + setWidgetRGB(new Color(255, 0, 51), new WidgetPointer(433,12)); + } else { + setWidgetRGB(new Color(0, 192, 0), new WidgetPointer(433,12)); + } + if (((boolean)bitconfig_2471)) { + setWidgetRGB(new Color(255, 0, 51), new WidgetPointer(433,13)); + } else { + setWidgetRGB(new Color(0, 192, 0), new WidgetPointer(433,13)); + } + if (((boolean)bitconfig_2472)) { + setWidgetRGB(new Color(255, 0, 51), new WidgetPointer(433,14)); + } else { + setWidgetRGB(new Color(0, 192, 0), new WidgetPointer(433,14)); + } + return; +} diff --git a/dumps/scripts/3960.cs2 b/dumps/scripts/3960.cs2 new file mode 100644 index 000000000..daf5c8532 --- /dev/null +++ b/dumps/scripts/3960.cs2 @@ -0,0 +1,24 @@ +void script_3960(int arg0) { + int ivar1; + flow_0: + ivar1 = getWidgetSpriteId(new WidgetPointer(arg0)); + SWITCH (ivar1) { + case 4122: + GOTO flow_1 + case 4123: + GOTO flow_2 + case 4124: + GOTO flow_3 + } + return; + flow_1: + setWidgetSprite(4117, new WidgetPointer(arg0)); + GOTO flow_4 + flow_2: + setWidgetSprite(4118, new WidgetPointer(arg0)); + GOTO flow_4 + flow_3: + setWidgetSprite(4119, new WidgetPointer(arg0)); + flow_4: + return; +} diff --git a/dumps/scripts/3961.cs2 b/dumps/scripts/3961.cs2 new file mode 100644 index 000000000..c36934db5 --- /dev/null +++ b/dumps/scripts/3961.cs2 @@ -0,0 +1,11 @@ +void script_3961(int arg0,int arg1) { + if (arg0 < 50) { + arg0 = add(arg0, 1); + setScriptCallOnGameloop(3961, arg0, new WidgetPointer(arg1), "iI", new WidgetPointer(arg1)); + } else { + setWidgetSize(63, 16, 0, 0, new WidgetPointer(744,81)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + script_3960(48758892); + } + return; +} diff --git a/dumps/scripts/3962.cs2 b/dumps/scripts/3962.cs2 new file mode 100644 index 000000000..1103dfdff --- /dev/null +++ b/dumps/scripts/3962.cs2 @@ -0,0 +1,4 @@ +void script_3962(int arg0,int arg1,int arg2,int arg3) { + script_3963(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/3963.cs2 b/dumps/scripts/3963.cs2 new file mode 100644 index 000000000..f60bb1683 --- /dev/null +++ b/dumps/scripts/3963.cs2 @@ -0,0 +1,16 @@ +void script_3963(int arg0,int arg1,int arg2,int arg3) { + string svar0; + svar0 = strRemoveEntities(getWidgetText(new WidgetPointer(arg1))); + if (arg0 != -1) { + if (((boolean)arg3)) { + setWidgetText(new WidgetPointer(arg1), "" + svar0 + ""); + setWidgetRGB(new Color(250, 250, 250), new WidgetPointer(arg1)); + setWidgetSize(getTextWidth(arg2, svar0), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } else { + setWidgetText(new WidgetPointer(arg1), "" + svar0 + ""); + setWidgetRGB(new Color(200, 200, 200), new WidgetPointer(arg1)); + setWidgetSize(getTextWidth(arg2, svar0), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/3964.cs2 b/dumps/scripts/3964.cs2 new file mode 100644 index 000000000..430309415 --- /dev/null +++ b/dumps/scripts/3964.cs2 @@ -0,0 +1,10 @@ +void script_3964() { + if (((boolean)globalint_1414)) { + setWidgetText(new WidgetPointer(596,39), "Username:"); + } else if (globalint_1414 == 2) { + setWidgetText(new WidgetPointer(596,39), "Email:"); + } else { + setWidgetText(new WidgetPointer(596,39), "Login:"); + } + return; +} diff --git a/dumps/scripts/3965.cs2 b/dumps/scripts/3965.cs2 new file mode 100644 index 000000000..f61887a4f --- /dev/null +++ b/dumps/scripts/3965.cs2 @@ -0,0 +1,39 @@ +void script_3965(int arg0,int arg1,string arg2,string arg3) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + setWidgetSize(arg1, 27, 0, 0, new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(6, 25, 1, 0); + setWidgetPosition(0, 0, 1, 1); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(25, 25, 0, 0); + setWidgetPosition(0, 0, 0, 1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(25, 25, 0, 0); + setWidgetPosition(3, 0, 2, 1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(1, 1, 1, 1); + setWidgetFont(3793); + setWidgetRGB(new Color(192, 177, 84)); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(false); + setWidgetText(arg2); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(3793); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(false); + setWidgetText(arg2); + script_3967(arg0, 0); + setWidgetContextMenuOption(1, new WidgetPointer(arg0), arg2); + setScriptCallOnMouseEntered(3966, new WidgetPointer(arg0), 1, "I1", new WidgetPointer(arg0)); + if (strLength(arg3) > 0) { + setScriptCallOnMouseOver(378, arg3, new WidgetPointer(-32768,3), -1, -2147483647, "sIii", new WidgetPointer(arg0)); + } + setScriptCallOnMouseExit(3966, new WidgetPointer(arg0), 0, "I1", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/3966.cs2 b/dumps/scripts/3966.cs2 new file mode 100644 index 000000000..35eef0285 --- /dev/null +++ b/dumps/scripts/3966.cs2 @@ -0,0 +1,4 @@ +void script_3966(int arg0,int arg1) { + script_3967(arg0, arg1); + return; +} diff --git a/dumps/scripts/3967.cs2 b/dumps/scripts/3967.cs2 new file mode 100644 index 000000000..c7a786cf0 --- /dev/null +++ b/dumps/scripts/3967.cs2 @@ -0,0 +1,25 @@ +void script_3967(int arg0,int arg1) { + if (((boolean)arg1)) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(4053); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(4055); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(4055); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(4052); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(4054); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(4054); + } + script_383(); + } + return; +} diff --git a/dumps/scripts/3968.cs2 b/dumps/scripts/3968.cs2 new file mode 100644 index 000000000..adfd6bed8 --- /dev/null +++ b/dumps/scripts/3968.cs2 @@ -0,0 +1,36 @@ +void script_3968() { + int ivar0; + int ivar1; + if (((boolean)globalint_1429) || (globalint_1425 == globalint_1426)) { + return; + } + globalint_1427 = 0; + ivar0 = cs2method_3408(105, 74, 3483, globalint_1425); + ivar1 = 1; + if (getDisplayMode() >= 2) { + if (isWidgetHidden(new WidgetPointer(746,26)) || (getWidgetSpriteId(new WidgetPointer(746,26)) == -1)) { + ivar1 = 0; + } + } else { + if (isWidgetHidden(new WidgetPointer(548,141)) || (getWidgetSpriteId(new WidgetPointer(548,141)) == -1)) { + ivar1 = 0; + } + } + if (standart_config_281 == 1000) { + setScriptCallOnClickContextMenu(3976, globalint_1425, 1, ivar1, "iii", new WidgetPointer(1055,2)); + } else { + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(1055,2)); + } + if (isWidgetHidden(new WidgetPointer(1055,12)) && isWidgetHidden(new WidgetPointer(1055,1))) { + if (ivar0 != -1) { + cs2method2103(255, new WidgetPointer(1055,13)); + setScriptCallOnGameloop(3969, "", new WidgetPointer(1055,12)); + setWidgetIsHidden(false, new WidgetPointer(1055,12)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1055,1)); + setWidgetIsHidden(true, new WidgetPointer(1055,12)); + } + } + globalint_1426 = globalint_1425; + return; +} diff --git a/dumps/scripts/3969.cs2 b/dumps/scripts/3969.cs2 new file mode 100644 index 000000000..cc56a9715 --- /dev/null +++ b/dumps/scripts/3969.cs2 @@ -0,0 +1,60 @@ +void script_3969() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar0 = getWidgetShadeColor(new WidgetPointer(1055,13)); + ivar1 = -1; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = -1; + if (isWidgetHidden(new WidgetPointer(1055,1))) { + if (ivar0 > 0) { + ivar2 = multiplyDivide(ivar0, 255, 100); + ivar2 = subtract(100, ivar2); + ivar3 = add(multiplyDivide(270, 100, ivar2), 10); + ivar4 = add(multiplyDivide(100, 100, ivar2), 10); + setWidgetSize(min(ivar3, 270), min(ivar4, 100), 0, 0, new WidgetPointer(1055,13)); + ivar0 = max(subtract(ivar0, 8), 0); + cs2method2103(ivar0, new WidgetPointer(1055,13)); + } else if (ivar1 != -1) { + setWidgetFilled(1, new WidgetPointer(1055,13)); + cs2method2103(0, new WidgetPointer(1055,2)); + cs2method2103(0, new WidgetPointer(1055,3)); + cs2method2103(0, new WidgetPointer(1055,4)); + cs2method2103(0, new WidgetPointer(1055,5)); + cs2method2103(0, new WidgetPointer(1055,6)); + cs2method2103(0, new WidgetPointer(1055,7)); + cs2method2103(0, new WidgetPointer(1055,8)); + cs2method2103(0, new WidgetPointer(1055,9)); + cs2method2103(0, new WidgetPointer(1055,10)); + cs2method2103(0, new WidgetPointer(1055,11)); + setWidgetText(new WidgetPointer(1055,5), getOtherCommonData(ivar1, 1266)); + if (getOtherCommonData(ivar1, 1270) != 4094) { + ivar5 = getOtherCommonData(cs2method_3408(105, 74, 2252, getOtherCommonData(ivar1, 1270)), 952); + } else { + ivar5 = getOtherCommonData(ivar1, 1271); + } + setWidgetSprite(ivar5, new WidgetPointer(1055,3)); + setScriptCallOnGameloop(3970, "", new WidgetPointer(1055,0)); + setWidgetIsHidden(false, new WidgetPointer(1055,1)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(1055,12)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(1055,0)); + setWidgetIsHidden(true, new WidgetPointer(1055,1)); + setWidgetIsHidden(true, new WidgetPointer(1055,12)); + } + ivar1 = cs2method_3408(105, 74, 3483, globalint_1425); + } else if (ivar0 < 255) { + ivar0 = min(add(ivar0, 8), 255); + cs2method2103(ivar0, new WidgetPointer(1055,13)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(1055,12)); + setWidgetFilled(0, new WidgetPointer(1055,13)); + setWidgetIsHidden(true, new WidgetPointer(1055,12)); + } + return; +} diff --git a/dumps/scripts/397.cs2 b/dumps/scripts/397.cs2 new file mode 100644 index 000000000..0e7543134 --- /dev/null +++ b/dumps/scripts/397.cs2 @@ -0,0 +1,10 @@ +void script_397() { + if ((globalint_743 == -1) && (standart_config_1109 != -1)) { + if (multiply(standart_config_1111, standart_config_1110) > getItemAmtInContainer(93, 995)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(449,25)); + } else { + setWidgetRGB(new Color(globalint_1241), new WidgetPointer(449,25)); + } + } + return; +} diff --git a/dumps/scripts/3970.cs2 b/dumps/scripts/3970.cs2 new file mode 100644 index 000000000..756640a8a --- /dev/null +++ b/dumps/scripts/3970.cs2 @@ -0,0 +1,24 @@ +void script_3970() { + int ivar0; + ivar0 = getWidgetShadeColor(new WidgetPointer(1055,3)); + if (globalint_1427 < 190) { + globalint_1427 = add(globalint_1427, 1); + } else if (ivar0 < 255) { + ivar0 = min(add(ivar0, 4), 255); + cs2method2103(ivar0, new WidgetPointer(1055,2)); + cs2method2103(ivar0, new WidgetPointer(1055,3)); + cs2method2103(ivar0, new WidgetPointer(1055,4)); + cs2method2103(ivar0, new WidgetPointer(1055,5)); + cs2method2103(ivar0, new WidgetPointer(1055,6)); + cs2method2103(ivar0, new WidgetPointer(1055,7)); + cs2method2103(ivar0, new WidgetPointer(1055,8)); + cs2method2103(ivar0, new WidgetPointer(1055,9)); + cs2method2103(ivar0, new WidgetPointer(1055,10)); + cs2method2103(ivar0, new WidgetPointer(1055,11)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(1055,0)); + setWidgetIsHidden(true, new WidgetPointer(1055,1)); + globalint_1427 = 0; + } + return; +} diff --git a/dumps/scripts/3971.cs2 b/dumps/scripts/3971.cs2 new file mode 100644 index 000000000..448e2c534 --- /dev/null +++ b/dumps/scripts/3971.cs2 @@ -0,0 +1,156 @@ +void script_3971() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + string svar0; + ivar0 = -1; + ivar1 = 0; + ivar2 = 0; + ivar3 = -1; + ivar4 = -1; + ivar5 = 0; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = 0; + svar0 = "null"; + setWidgetSprite(cs2method_3408(105, 100, 3491, bitconfig_8575), new WidgetPointer(1056,112)); + if (((boolean)bitconfig_9030)) { + setWidgetSprite(1820, new WidgetPointer(1056,112)); + } + while (ivar2 < 6) { + switch (ivar2) { + case 0: + ivar1 = bitconfig_8587; + ivar0 = cs2method_3408(105, 74, 3483, bitconfig_8587); + ivar4 = 69206080; + ivar9 = 69206117; + ivar7 = 69206116; + ivar10 = 69206115; + setScriptCallOnClickContextMenu(3976, bitconfig_8587, 1, -2147483644, "iii", new WidgetPointer(ivar10)); + break; + case 1: + ivar1 = bitconfig_8588; + ivar0 = cs2method_3408(105, 74, 3483, bitconfig_8588); + ivar4 = 69206160; + ivar9 = 69206162; + ivar7 = 69206161; + ivar10 = 69206158; + setScriptCallOnClickContextMenu(3976, bitconfig_8588, 2, -2147483644, "iii", new WidgetPointer(ivar10)); + break; + case 2: + ivar1 = bitconfig_8589; + ivar0 = cs2method_3408(105, 74, 3483, bitconfig_8589); + ivar4 = 69206165; + ivar9 = 69206167; + ivar7 = 69206166; + ivar10 = 69206163; + setScriptCallOnClickContextMenu(3976, bitconfig_8589, 3, -2147483644, "iii", new WidgetPointer(ivar10)); + break; + case 3: + ivar1 = bitconfig_8590; + ivar0 = cs2method_3408(105, 74, 3483, bitconfig_8590); + ivar4 = 69206170; + ivar9 = 69206172; + ivar7 = 69206171; + ivar10 = 69206168; + setScriptCallOnClickContextMenu(3976, bitconfig_8590, 4, -2147483644, "iii", new WidgetPointer(ivar10)); + break; + case 4: + ivar1 = bitconfig_8591; + ivar0 = cs2method_3408(105, 74, 3483, bitconfig_8591); + ivar4 = 69206175; + ivar9 = 69206177; + ivar7 = 69206176; + ivar10 = 69206173; + setScriptCallOnClickContextMenu(3976, bitconfig_8591, 5, -2147483644, "iii", new WidgetPointer(ivar10)); + break; + case 5: + ivar1 = bitconfig_8592; + ivar0 = cs2method_3408(105, 74, 3483, bitconfig_8592); + ivar4 = 69206181; + ivar9 = 69206183; + ivar7 = 69206182; + ivar10 = 69206178; + setScriptCallOnClickContextMenu(3976, bitconfig_8592, 6, -2147483644, "iii", new WidgetPointer(ivar10)); + } + svar0 = " -" + "
"; + svar0 = concat(getOtherCommonData(ivar0, 1266), svar0); + svar0 = concat(svar0, getOtherCommonData(ivar0, 1273)); + if ((bitconfig_4895 == 3) && ((standart_config_281 < 1000) || (bitconfig_6494 < 5))) { + svar0 = getOtherCommonData(ivar0, 1266); + } + if (((boolean)script_3999(ivar1))) { + setScriptCallOnMouseOver(3981, new WidgetPointer(ivar10), svar0, "Is", new WidgetPointer(ivar10)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(ivar10)); + } + ivar12 = add(ivar2, 1); + if ((bitconfig_8577 == ivar12) && ((boolean)script_3999(bitconfig_8576))) { + ivar0 = cs2method_3408(105, 74, 3483, bitconfig_8576); + setScriptCallOnClickContextMenu(3976, bitconfig_8576, ivar12, -2147483644, "iii", new WidgetPointer(ivar10)); + if (((boolean)script_3999(ivar1))) { + setScriptCallOnMouseOver(3981, new WidgetPointer(ivar10), svar0, "Is", new WidgetPointer(ivar10)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(ivar10)); + } + } + if (ivar0 != -1) { + ivar8 = cs2method_3408(105, 100, 3492, getOtherCommonData(ivar0, 1272)); + if (((boolean)script_3996(ivar1)) && ((boolean)script_3999(ivar1))) { + ivar8 = 4346; + } + setWidgetSprite(ivar8, new WidgetPointer(ivar9)); + ivar5 = getOtherCommonData(ivar0, 1293); + if ((ivar5 != 0) && (ivar5 != 63)) { + ivar6 = 4272; + } else { + ivar6 = -1; + } + setWidgetSprite(ivar6, new WidgetPointer(ivar7)); + if (getOtherCommonData(ivar0, 1270) != 4094) { + ivar3 = getOtherCommonData(cs2method_3408(105, 74, 2252, getOtherCommonData(ivar0, 1270)), 952); + } else { + ivar3 = getOtherCommonData(ivar0, 1271); + } + setWidgetSprite(ivar3, new WidgetPointer(ivar4)); + if (((ivar0 == 1645) || (ivar0 == 1642)) || (ivar0 == 1643)) { + setWidgetContextMenuOption(1, new WidgetPointer(ivar10), ""); + setWidgetContextMenuOption(2, new WidgetPointer(ivar10), ""); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(ivar10), "Summary"); + setWidgetContextMenuOption(2, new WidgetPointer(ivar10), "Pin/Unpin Task"); + } + if (standart_config_281 < 1000) { + setWidgetContextMenuOption(2, new WidgetPointer(ivar10), ""); + } + } + ivar2 = add(ivar2, 1); + } + setWidgetIsHidden(false, new WidgetPointer(1056,111)); + setWidgetIsHidden(false, new WidgetPointer(1056,112)); + if (bitconfig_8575 == 61) { + setWidgetText(new WidgetPointer(1056,110), "Quest Area"); + setWidgetIsHidden(true, new WidgetPointer(1056,111)); + setWidgetIsHidden(true, new WidgetPointer(1056,112)); + } else if (((boolean)bitconfig_9030)) { + setWidgetText(new WidgetPointer(1056,110), "Introductory Tasks"); + } else { + setWidgetText(new WidgetPointer(1056,110), cs2method_3408(105, 115, 3487, bitconfig_8575)); + } + script_3975(); + return; +} diff --git a/dumps/scripts/3972.cs2 b/dumps/scripts/3972.cs2 new file mode 100644 index 000000000..e4e8b2d96 --- /dev/null +++ b/dumps/scripts/3972.cs2 @@ -0,0 +1,4 @@ +void script_3972() { + script_3973(globalint_1428); + return; +} diff --git a/dumps/scripts/3973.cs2 b/dumps/scripts/3973.cs2 new file mode 100644 index 000000000..852f6de2d --- /dev/null +++ b/dumps/scripts/3973.cs2 @@ -0,0 +1,24 @@ +void script_3973(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(1056,92)); + setWidgetIsHidden(true, new WidgetPointer(1056,94)); + setWidgetIsHidden(false, new WidgetPointer(1056,125)); + setWidgetIsHidden(false, new WidgetPointer(1056,122)); + if (((boolean)arg0)) { + script_3977(globalint_1425); + } else if (((boolean)script_3999(bitconfig_8576))) { + if (((boolean)script_3999(bitconfig_8588)) && ((boolean)script_3999(bitconfig_8587))) { + script_3977(bitconfig_8587); + } else { + setWidgetIsHidden(true, new WidgetPointer(1056,122)); + } + } else { + script_3977(bitconfig_8576); + } + script_3975(); + if (((boolean)globalint_1421)) { + setWidgetIsHidden(true, new WidgetPointer(1056,171)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1056,171)); + } + return; +} diff --git a/dumps/scripts/3974.cs2 b/dumps/scripts/3974.cs2 new file mode 100644 index 000000000..41176d474 --- /dev/null +++ b/dumps/scripts/3974.cs2 @@ -0,0 +1,4 @@ +void script_3974() { + script_3975(); + return; +} diff --git a/dumps/scripts/3975.cs2 b/dumps/scripts/3975.cs2 new file mode 100644 index 000000000..056f3a5c1 --- /dev/null +++ b/dumps/scripts/3975.cs2 @@ -0,0 +1,33 @@ +void script_3975() { + int ivar0; + ivar0 = -1; + setWidgetIsHidden(true, new WidgetPointer(1056,63)); + setWidgetIsHidden(true, new WidgetPointer(1056,143)); + setWidgetIsHidden(true, new WidgetPointer(1056,148)); + setWidgetIsHidden(true, new WidgetPointer(1056,153)); + setWidgetIsHidden(true, new WidgetPointer(1056,158)); + setWidgetIsHidden(true, new WidgetPointer(1056,164)); + switch (bitconfig_8577) { + case 1: + ivar0 = 69206079; + break; + case 2: + ivar0 = 69206159; + break; + case 3: + ivar0 = 69206164; + break; + case 4: + ivar0 = 69206169; + break; + case 5: + ivar0 = 69206174; + break; + case 6: + ivar0 = 69206180; + } + if (ivar0 != -1) { + setWidgetIsHidden(false, new WidgetPointer(ivar0)); + } + return; +} diff --git a/dumps/scripts/3976.cs2 b/dumps/scripts/3976.cs2 new file mode 100644 index 000000000..1e8b3668e --- /dev/null +++ b/dumps/scripts/3976.cs2 @@ -0,0 +1,21 @@ +void script_3976(int arg0,int arg1,int arg2) { + if (arg2 != 1) { + return; + } + script_41(69206179); + globalint_1416 = arg1; + setWidgetIsHidden(true, new WidgetPointer(1056,92)); + setWidgetIsHidden(true, new WidgetPointer(1056,94)); + setWidgetIsHidden(false, new WidgetPointer(1056,125)); + setWidgetIsHidden(false, new WidgetPointer(1056,122)); + if (((boolean)script_3999(arg0))) { + if (bitconfig_8588 == 4094) { + script_3977(bitconfig_8587); + } else { + return; + } + } else { + script_3977(arg0); + } + return; +} diff --git a/dumps/scripts/3977.cs2 b/dumps/scripts/3977.cs2 new file mode 100644 index 000000000..c97061b05 --- /dev/null +++ b/dumps/scripts/3977.cs2 @@ -0,0 +1,266 @@ +void script_3977(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + int stack_dump0; + cs2func_script_3995_struct(2,1,0) structdump_1; + script_41(69206152); + if (((boolean)arg0) && (standart_config_281 < 1000)) { + arg0 = 4094; + } + if (((boolean)script_3999(arg0))) { + return; + } + ivar1 = -1; + svar0 = ""; + svar1 = ""; + svar2 = ""; + ivar2 = -1; + ivar3 = -1; + ivar1 = cs2method_3408(105, 74, 3483, arg0); + ivar4 = add(multiply(subtract(getOtherCommonData(ivar1, 1293), 1), 5), getOtherCommonData(ivar1, 1272)); + ivar5 = cs2method_3408(105, 74, 3494, ivar4); + if (ivar1 != -1) { + svar0 = getOtherCommonData(ivar1, 1266); + svar1 = getOtherCommonData(ivar1, 1273); + if ((arg0 > 419) && (arg0 < 424)) { + svar1 = concat(svar1, "
" + "
" + "Click on the Hints tab above if you wish to see more information on how to complete this Task."); + } else { + if (arg0 == 419) { + svar1 = concat(svar1, "
" + "
" + "Simply click on Jack to start a conversation - as a new player you will start just nearby."); + } + } + if (getOtherCommonData(ivar1, 1270) != 4094) { + svar2 = getOtherCommonData(cs2method_3408(105, 74, 2252, getOtherCommonData(ivar1, 1270)), 951); + ivar3 = getOtherCommonData(cs2method_3408(105, 74, 2252, getOtherCommonData(ivar1, 1270)), 952); + } else { + svar2 = getOtherCommonData(ivar1, 1292); + ivar3 = getOtherCommonData(ivar1, 1271); + } + setWidgetSprite(ivar3, new WidgetPointer(1056,135)); + setWidgetText(new WidgetPointer(1056,91), svar0); + setWidgetText(new WidgetPointer(1056,129), svar1); + setWidgetFont(495, new WidgetPointer(1056,129)); + setWidgetTextAlignment(0, 0, 0, new WidgetPointer(1056,129)); + } + svar3 = ""; + if (((boolean)stringMethod4107(svar2, "")) && (standart_config_281 == 1000)) { + if (bitconfig_8601 < 10) { + svar3 = "ten"; + } else if (bitconfig_8601 < 25) { + svar3 = "forty"; + } else if (bitconfig_8601 < 50) { + svar3 = "160"; + } else if (bitconfig_8601 < 100) { + svar3 = "640"; + } else { + svar3 = "2560"; + } + svar2 = "Completing this Task will earn you " + svar3 + " coins."; + } + setWidgetIsHidden(true, new WidgetPointer(1056,76)); + setWidgetIsHidden(true, new WidgetPointer(1056,77)); + setWidgetIsHidden(true, new WidgetPointer(1056,78)); + setWidgetIsHidden(true, new WidgetPointer(1056,79)); + setWidgetIsHidden(true, new WidgetPointer(1056,80)); + setWidgetIsHidden(true, new WidgetPointer(1056,81)); + setWidgetIsHidden(true, new WidgetPointer(1056,82)); + setWidgetIsHidden(true, new WidgetPointer(1056,83)); + setWidgetIsHidden(true, new WidgetPointer(1056,84)); + setWidgetIsHidden(true, new WidgetPointer(1056,85)); + setWidgetIsHidden(true, new WidgetPointer(1056,86)); + setWidgetIsHidden(true, new WidgetPointer(1056,87)); + ivar6 = 10; + ivar7 = 0; + ivar8 = 15; + ivar9 = 0; + svar4 = ""; + ivar10 = 0; + stack_dump0 = arg0; + structdump_1 = script_3995(stack_dump0); + ivar10 = structdump_1.intpart_1; + svar4 = structdump_1.stringpart_0; + ivar9 = structdump_1.intpart_0; + if ((((boolean)getLanguage()) || (getLanguage() == 3)) || (getLanguage() == 2)) { + setWidgetIsHidden(true, new WidgetPointer(1056,121)); + setWidgetIsHidden(true, new WidgetPointer(1056,141)); + } else { + if (((boolean)getLanguage())) { + setWidgetText(new WidgetPointer(1056,120), " Pin"); + setWidgetText(new WidgetPointer(1056,140), " Back"); + } + setWidgetIsHidden(false, new WidgetPointer(1056,121)); + setWidgetIsHidden(false, new WidgetPointer(1056,141)); + } + setWidgetIsHidden(true, new WidgetPointer(1056,88)); + if (stringMethod4107(getOtherCommonData(ivar1, 1274), "") != 0) { + if (getOtherCommonData(ivar1, 1282) != -1) { + ivar7 = arg0; + } else { + ivar7 = 4094; + } + ivar6 = script_3978(1, ivar6, 69206092, ivar7, 69206093, 69206139, getOtherCommonData(ivar1, 1274)); + } + if (stringMethod4107(getOtherCommonData(ivar1, 1275), "") != 0) { + if (getOtherCommonData(ivar1, 1283) != -1) { + ivar7 = arg0; + } else { + ivar7 = 4094; + } + ivar6 = script_3978(2, ivar6, 69206094, ivar7, 69206095, 69206139, getOtherCommonData(ivar1, 1275)); + } + if (stringMethod4107(getOtherCommonData(ivar1, 1276), "") != 0) { + if (getOtherCommonData(ivar1, 1284) != -1) { + ivar7 = arg0; + } else { + ivar7 = 4094; + } + ivar6 = script_3978(3, ivar6, 69206096, ivar7, 69206097, 69206139, getOtherCommonData(ivar1, 1276)); + } + if (stringMethod4107(getOtherCommonData(ivar1, 1277), "") != 0) { + if (getOtherCommonData(ivar1, 1285) != -1) { + ivar7 = arg0; + } else { + ivar7 = 4094; + } + ivar6 = script_3978(4, ivar6, 69206098, ivar7, 69206099, 69206139, getOtherCommonData(ivar1, 1277)); + } + if (stringMethod4107(getOtherCommonData(ivar1, 1278), "") != 0) { + if (getOtherCommonData(ivar1, 1286) != -1) { + ivar7 = arg0; + } else { + ivar7 = 4094; + } + ivar6 = script_3978(5, ivar6, 69206100, ivar7, 69206101, 69206139, getOtherCommonData(ivar1, 1278)); + } + if (stringMethod4107(getOtherCommonData(ivar1, 1279), "") != 0) { + if (getOtherCommonData(ivar1, 1287) != -1) { + ivar7 = arg0; + } else { + ivar7 = 4094; + } + ivar6 = script_3978(6, ivar6, 69206102, ivar7, 69206103, 69206139, getOtherCommonData(ivar1, 1279)); + } + ivar6 = max(ivar6, getWidgetActualHeight(new WidgetPointer(1056,123))); + setWidgetScrollMax(0, ivar6, new WidgetPointer(1056,123)); + script_31(69206140, 69206139, 4343, 4340, 4341, 4342, 4337, 4336); + if (ivar6 > getWidgetActualHeight(new WidgetPointer(1056,123))) { + setWidgetIsHidden(false, new WidgetPointer(1056,124)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1056,124)); + } + setWidgetIsHidden(true, new WidgetPointer(1056,66)); + setWidgetIsHidden(true, new WidgetPointer(1056,67)); + setWidgetIsHidden(true, new WidgetPointer(1056,68)); + setWidgetIsHidden(true, new WidgetPointer(1056,69)); + setWidgetIsHidden(true, new WidgetPointer(1056,70)); + setWidgetIsHidden(true, new WidgetPointer(1056,71)); + setWidgetIsHidden(true, new WidgetPointer(1056,72)); + setWidgetIsHidden(true, new WidgetPointer(1056,73)); + ivar6 = script_3978(0, 10, 69206081, 4094, -1, 69206090, svar2); + if ((ivar5 != -1) && (ivar5 != 1645)) { + ivar6 = script_3978(0, ivar6, 69206082, 4094, -1, 69206090, getOtherCommonData(ivar5, 1273)); + ivar6 = script_3978(0, ivar6, 69206083, 4094, -1, 69206090, getOtherCommonData(ivar5, 1292)); + if (stringMethod4107(getOtherCommonData(ivar5, 1274), "") != 0) { + ivar6 = script_3978(0, ivar6, 69206084, 4094, -1, 69206090, getOtherCommonData(ivar5, 1274)); + } + if (stringMethod4107(getOtherCommonData(ivar5, 1275), "") != 0) { + ivar6 = script_3978(0, ivar6, 69206085, 4094, -1, 69206090, getOtherCommonData(ivar5, 1275)); + } + if (stringMethod4107(getOtherCommonData(ivar5, 1276), "") != 0) { + ivar6 = script_3978(0, ivar6, 69206086, 4094, -1, 69206090, getOtherCommonData(ivar5, 1276)); + } + if (stringMethod4107(getOtherCommonData(ivar5, 1277), "") != 0) { + ivar6 = script_3978(0, ivar6, 69206087, 4094, -1, 69206090, getOtherCommonData(ivar5, 1277)); + } + if (stringMethod4107(getOtherCommonData(ivar5, 1278), "") != 0) { + ivar6 = script_3978(0, ivar6, 69206088, 4094, -1, 69206090, getOtherCommonData(ivar5, 1278)); + } + if (stringMethod4107(getOtherCommonData(ivar5, 1279), "") != 0) { + ivar6 = script_3978(0, ivar6, 69206089, 4094, -1, 69206090, getOtherCommonData(ivar5, 1279)); + } + } else { + if (bitconfig_8601 > bitconfig_8602) { + svar2 = "You have already earned a sum of money, which you may claim by talking to any Taskmaster or you can increase by completing more Tasks."; + ivar6 = script_3978(0, ivar6, 69206083, 4094, -1, 69206090, svar2); + } + } + ivar6 = max(ivar6, getWidgetActualHeight(new WidgetPointer(1056,74))); + setWidgetScrollMax(0, ivar6, new WidgetPointer(1056,74)); + script_31(69206111, 69206090, 4343, 4340, 4341, 4342, 4337, 4336); + if (ivar6 > getWidgetActualHeight(new WidgetPointer(1056,74))) { + setWidgetIsHidden(false, new WidgetPointer(1056,95)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1056,95)); + } + svar5 = ""; + ivar11 = 5; + if (script_3227(arg0) == 2) { + setWidgetIsHidden(true, new WidgetPointer(1056,88)); + setWidgetIsHidden(true, new WidgetPointer(1056,90)); + if ((standart_config_281 == 1000) || ((boolean)bitconfig_9029)) { + setWidgetIsHidden(false, new WidgetPointer(1056,130)); + } + if ((arg0 == 419) && ((boolean)bitconfig_9030)) { + svar5 = "Task complete! Click here to return to the task list."; + if (getDisplayMode() >= 2) { + if (getWidgetActualWidth(new WidgetPointer(746,2)) < 997) { + ivar11 = add(ivar11, 40); + } + script_4248(158, ivar11, 1, 16777215, 5631, svar5); + } else { + script_4247(175, -1, 1, 16777215, 5631, svar5); + } + } + } else if (getOtherCommonData(ivar1, 1267) == 60) { + setWidgetIsHidden(true, new WidgetPointer(1056,88)); + setWidgetIsHidden(true, new WidgetPointer(1056,130)); + if ((standart_config_281 < 135) && ((boolean)bitconfig_9029)) { + setWidgetIsHidden(true, new WidgetPointer(1056,90)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1056,90)); + } + } else { + setWidgetIsHidden(false, new WidgetPointer(1056,90)); + if ((((boolean)script_3999(arg0)) && ((boolean)ivar9)) && (arg0 != bitconfig_8576)) { + setWidgetIsHidden(false, new WidgetPointer(1056,88)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1056,88)); + } + if (((arg0 == 420) || (arg0 == 363)) || ((arg0 == 419) && (standart_config_281 == 1000))) { + svar5 = "Click on the Hints tab for more on how to complete this Task."; + } else if (arg0 == 421) { + svar5 = "Remember, the Hints tab provides more details about a Task."; + } else { + svar5 = ""; + } + if (((boolean)bitconfig_9030)) { + svar5 = ""; + } + if (getDisplayMode() >= 2) { + if (getWidgetActualWidth(new WidgetPointer(746,2)) < 997) { + script_4248(196, 223, 1, 16777215, 5631, svar5); + } else { + script_4248(196, 183, 1, 16777215, 5631, svar5); + } + } else { + script_4247(217, 177, 1, 16777215, 5631, svar5); + } + } + setWidgetSize(0, add(15, ivar6), 1, 0, new WidgetPointer(1056,96)); + return; +} diff --git a/dumps/scripts/3978.cs2 b/dumps/scripts/3978.cs2 new file mode 100644 index 000000000..0b41a414e --- /dev/null +++ b/dumps/scripts/3978.cs2 @@ -0,0 +1,31 @@ +int script_3978(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6) { + int ivar6; + int ivar7; + int ivar8; + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetText(new WidgetPointer(arg2), arg6); + setWidgetFont(495, new WidgetPointer(arg2)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(arg2)); + ivar6 = subtract(getWidgetActualWidth(new WidgetPointer(arg5)), 18); + if (((boolean)script_3999(arg3))) { + ivar6 = add(ivar6, 9); + } + ivar7 = 0; + if (arg4 != -1) { + ivar7 = getWidgetActualHeight(new WidgetPointer(arg4)); + ivar6 = subtract(ivar6, 21); + } + ivar8 = max(add(ivar7, 5), multiply(15, getLineCount(ivar6, 495, arg6))); + setWidgetSize(ivar6, ivar8, 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(9, arg1, 0, 0, new WidgetPointer(arg2)); + if (((boolean)script_3999(arg3)) && (arg4 != -1)) { + setWidgetIsHidden(false, new WidgetPointer(arg4)); + setWidgetPosition(2, add(arg1, divide(subtract(ivar8, getWidgetActualHeight(new WidgetPointer(arg4))), 2)), 2, 0, new WidgetPointer(arg4)); + if ((bitconfig_8578 == arg0) && (bitconfig_8594 == arg3)) { + setWidgetSprite(5623, new WidgetPointer(arg4)); + } else { + setWidgetSprite(5621, new WidgetPointer(arg4)); + } + } + return add(arg1, ivar8); +} diff --git a/dumps/scripts/3979.cs2 b/dumps/scripts/3979.cs2 new file mode 100644 index 000000000..c0930cfa2 --- /dev/null +++ b/dumps/scripts/3979.cs2 @@ -0,0 +1,35 @@ +void script_3979(int arg0,int arg1) { + int ivar2; + string svar0; + bitconfig_8576 = arg0; + ivar2 = cs2method_3408(105, 74, 3483, arg0); + svar0 = " -" + "
"; + svar0 = concat(getOtherCommonData(ivar2, 1266), svar0); + svar0 = concat(svar0, getOtherCommonData(ivar2, 1273)); + if (((boolean)script_3999(arg0))) { + setScriptCallOnMouseOver(3981, new WidgetPointer(arg1), svar0, "Is", new WidgetPointer(arg1)); + } else { + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg1)); + } + switch (arg1) { + case 69206080: + bitconfig_8577 = 1; + break; + case 69206160: + bitconfig_8577 = 2; + break; + case 69206165: + bitconfig_8577 = 3; + break; + case 69206170: + bitconfig_8577 = 4; + break; + case 69206175: + bitconfig_8577 = 5; + break; + case 69206181: + bitconfig_8577 = 6; + } + script_3975(); + return; +} diff --git a/dumps/scripts/398.cs2 b/dumps/scripts/398.cs2 new file mode 100644 index 000000000..b440bf672 --- /dev/null +++ b/dumps/scripts/398.cs2 @@ -0,0 +1,44 @@ +void script_398() { + setWidgetNoOptions(new WidgetPointer(306,29)); + globalint_767 = 0; + globalint_761 = -1; + globalint_762 = -1; + globalint_763 = -1; + globalint_764 = -1; + globalint_765 = 0; + globalint_766 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,19)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,20)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,21)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,22)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,10)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(306,25)); + setWidgetText(new WidgetPointer(306,3), "Correct: " + intToStr(globalint_767) + "/" + intToStr(10)); + globalint_761 = cs2method_3408(105, 109, 208, 1); + if (globalint_761 != -1) { + setWidgetModel(globalint_761, new WidgetPointer(306,6)); + setWidget3DRotation(0, 0, 512, 0, 0, 800, new WidgetPointer(306,6)); + } + globalint_762 = cs2method_3408(105, 109, 208, 2); + if (globalint_762 != -1) { + setWidgetModel(globalint_762, new WidgetPointer(306,7)); + setWidget3DRotation(0, 0, 512, 0, 0, 800, new WidgetPointer(306,7)); + } + globalint_763 = cs2method_3408(105, 109, 208, 3); + if (globalint_763 != -1) { + setWidgetModel(globalint_763, new WidgetPointer(306,8)); + setWidget3DRotation(0, 0, 512, 0, 0, 800, new WidgetPointer(306,8)); + } + globalint_764 = cs2method_3408(105, 109, 208, 4); + if (globalint_764 != -1) { + setWidgetModel(globalint_764, new WidgetPointer(306,9)); + setWidget3DRotation(0, 0, 512, 0, 0, 800, new WidgetPointer(306,9)); + } + setWidgetPosition(subtract(0, getWidgetActualWidth(new WidgetPointer(306,6))), getWidgetActualY(new WidgetPointer(306,6)), 0, 0, new WidgetPointer(306,6)); + setWidgetPosition(subtract(0, getWidgetActualWidth(new WidgetPointer(306,7))), getWidgetActualY(new WidgetPointer(306,7)), 0, 0, new WidgetPointer(306,7)); + setWidgetPosition(subtract(0, getWidgetActualWidth(new WidgetPointer(306,8))), getWidgetActualY(new WidgetPointer(306,8)), 0, 0, new WidgetPointer(306,8)); + setWidgetPosition(subtract(0, getWidgetActualWidth(new WidgetPointer(306,9))), getWidgetActualY(new WidgetPointer(306,9)), 0, 0, new WidgetPointer(306,9)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(306,5)), 200, 0, 0, new WidgetPointer(306,10)); + setScriptCallOnGameloop(399, new WidgetPointer(306,6), "I", new WidgetPointer(306,19)); + return; +} diff --git a/dumps/scripts/3980.cs2 b/dumps/scripts/3980.cs2 new file mode 100644 index 000000000..616672a55 --- /dev/null +++ b/dumps/scripts/3980.cs2 @@ -0,0 +1,6 @@ +void script_3980() { + bitconfig_8576 = 4095; + bitconfig_8577 = 0; + script_3975(); + return; +} diff --git a/dumps/scripts/3981.cs2 b/dumps/scripts/3981.cs2 new file mode 100644 index 000000000..079098b0a --- /dev/null +++ b/dumps/scripts/3981.cs2 @@ -0,0 +1,4 @@ +void script_3981(int arg0,string arg1) { + script_3982(arg0, arg1); + return; +} diff --git a/dumps/scripts/3982.cs2 b/dumps/scripts/3982.cs2 new file mode 100644 index 000000000..170e34964 --- /dev/null +++ b/dumps/scripts/3982.cs2 @@ -0,0 +1,95 @@ +void script_3982(int arg0,string arg1) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 178; + ivar8 = 69206179; + ivar9 = 0; + ivar10 = 0; + ivar11 = -1; + if (setWidgetRegister(new WidgetPointer(arg0))) { + if (globalint_1 < add(getClientCycle(), 45)) { + if (globalint_1 < getClientCycle()) { + globalint_1 = getClientCycle(); + } + globalint_1 = add(globalint_1, 2); + return; + } + globalint_1 = add(getClientCycle(), 55); + if (globalint_2 != 1) { + ivar1 = add(getWidgetActualX(), 5); + ivar2 = add(add(getWidgetActualY(), getWidgetActualHeight()), 5); + ivar11 = 69206114; + if ((ivar11 != -1) && (ivar7 >= getWidgetActualWidth(new WidgetPointer(ivar11)))) { + ivar7 = getWidgetActualWidth(new WidgetPointer(ivar11)); + } + ivar9 = add(4, getMaxLineWidth(subtract(ivar7, 4), 495, arg1)); + ivar10 = add(4, multiply(16, getLineCount(subtract(ivar7, 4), 495, arg1))); + if (ivar11 != -1) { + ivar3 = subtract(ivar1, cs2method2600(new WidgetPointer(ivar11))); + ivar4 = subtract(ivar2, cs2method2601(new WidgetPointer(ivar11))); + if (ivar3 < 0) { + ivar1 = cs2method2600(new WidgetPointer(ivar11)); + ivar3 = 0; + } + if (ivar4 < 0) { + ivar2 = cs2method2601(new WidgetPointer(ivar11)); + ivar4 = 0; + } + if (ivar3 > 0) { + ivar5 = add(subtract(ivar3, getWidgetActualWidth(new WidgetPointer(ivar11))), ivar9); + if (ivar5 > 0) { + ivar1 = subtract(ivar1, ivar5); + } + } + if (ivar4 > 0) { + ivar6 = add(subtract(ivar4, getWidgetActualHeight(new WidgetPointer(ivar11))), ivar10); + if (ivar6 > 0) { + ivar2 = subtract(subtract(subtract(ivar2, ivar6), getWidgetActualHeight()), 10); + } + } + } + if (ivar1 < 0) { + ivar1 = 0; + } + if (ivar2 < 0) { + ivar2 = 0; + } + setWidgetSize(ivar9, ivar10, 0, 0, new WidgetPointer(ivar8)); + setWidgetPosition(ivar1, ivar2, 0, 0, new WidgetPointer(ivar8)); + deleteAllExtraChilds(new WidgetPointer(ivar8)); + createExtraChild(new WidgetPointer(ivar8), 3, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar8)), getWidgetActualHeight(new WidgetPointer(ivar8)), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(80); + createExtraChild(new WidgetPointer(ivar8), 3, 1); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar8)), getWidgetActualHeight(new WidgetPointer(ivar8)), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(ivar8), 4, 2); + setWidgetSize(subtract(ivar7, 4), getWidgetActualHeight(new WidgetPointer(ivar8)), 0, 0); + setWidgetPosition(2, 0, 0, 0); + setWidgetText(arg1); + setWidgetTextAlignment(0, 1, 16); + setWidgetFont(495); + setWidgetRGB(new Color(238, 238, 238)); + globalint_2 = 1; + } + } + return; +} diff --git a/dumps/scripts/3983.cs2 b/dumps/scripts/3983.cs2 new file mode 100644 index 000000000..d30511054 --- /dev/null +++ b/dumps/scripts/3983.cs2 @@ -0,0 +1,6 @@ +void script_3983(int arg0,int arg1,int arg2) { + script_41(60096609); + script_4022(0); + script_3987(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/3984.cs2 b/dumps/scripts/3984.cs2 new file mode 100644 index 000000000..2b53732bc --- /dev/null +++ b/dumps/scripts/3984.cs2 @@ -0,0 +1,6 @@ +void script_3984(int arg0,int arg1,int arg2) { + script_4022(0); + script_3987(arg0, arg1, arg2); + setWidgetIsHidden(true, new WidgetPointer(917,92)); + return; +} diff --git a/dumps/scripts/3985.cs2 b/dumps/scripts/3985.cs2 new file mode 100644 index 000000000..7278009dc --- /dev/null +++ b/dumps/scripts/3985.cs2 @@ -0,0 +1,9 @@ +void script_3985() { + int ivar0; + ivar0 = 0; + if (((boolean)bitconfig_8579)) { + ivar0 = 1; + } + script_3987(999, ivar0, 999); + return; +} diff --git a/dumps/scripts/3986.cs2 b/dumps/scripts/3986.cs2 new file mode 100644 index 000000000..a211156d6 --- /dev/null +++ b/dumps/scripts/3986.cs2 @@ -0,0 +1,9 @@ +void script_3986() { + int ivar0; + ivar0 = 0; + if (((boolean)bitconfig_8580)) { + ivar0 = 1; + } + script_3987(999, 999, ivar0); + return; +} diff --git a/dumps/scripts/3987.cs2 b/dumps/scripts/3987.cs2 new file mode 100644 index 000000000..3e815e529 --- /dev/null +++ b/dumps/scripts/3987.cs2 @@ -0,0 +1,51 @@ +void script_3987(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + if (arg0 == 63) { + arg0 = bitconfig_8575; + } else { + if (arg0 == 999) { + arg0 = bitconfig_8582; + } + } + if (arg1 == 999) { + arg1 = bitconfig_8579; + } + if (arg2 == 999) { + arg2 = bitconfig_8580; + } + script_4017(arg0); + setWidgetSprite(cs2method_3408(105, 100, 3491, arg0), new WidgetPointer(917,120)); + setWidgetText(new WidgetPointer(917,121), cs2method_3408(105, 115, 3487, arg0)); + setWidgetIsHidden(false, new WidgetPointer(917,121)); + if (setWidgetRegister(new WidgetPointer(917,105))) { + cs2method1309(1, 172); + } + if (setWidgetRegister(new WidgetPointer(917,117))) { + cs2method1309(1, 56); + } + if (setWidgetRegister(new WidgetPointer(917,121))) { + cs2method1309(1, 56); + } + globalint_1422 = -1; + ivar3 = cs2method_3408(105, 105, 3482, arg0); + deleteAllExtraChilds(new WidgetPointer(917,98)); + setWidgetIsHidden(true, new WidgetPointer(917,119)); + setWidgetIsHidden(true, new WidgetPointer(917,115)); + ivar4 = 0; + setWidgetIsHidden(false, new WidgetPointer(917,91)); + if (((boolean)bitconfig_9030)) { + ivar4 = script_4243(); + setWidgetIsHidden(true, new WidgetPointer(917,91)); + } else if (ivar3 == 4091) { + ivar4 = script_3988(arg0); + } else { + ivar4 = script_3989(ivar3, arg1, arg2); + } + ivar5 = add(ivar4, getWidgetActualHeight(new WidgetPointer(917,99))); + ivar5 = max(ivar5, getWidgetActualHeight(new WidgetPointer(917,98))); + setWidgetScrollMax(0, ivar5, new WidgetPointer(917,98)); + script_31(60096612, 60096610, 4343, 4340, 4341, 4342, 4337, 4336); + return; +} diff --git a/dumps/scripts/3988.cs2 b/dumps/scripts/3988.cs2 new file mode 100644 index 000000000..f2d905a86 --- /dev/null +++ b/dumps/scripts/3988.cs2 @@ -0,0 +1,122 @@ +int script_3988(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + string svar0; + string svar1; + ivar1 = multiply(6, subtract(arg0, 1)); + ivar2 = 0; + ivar3 = 0; + ivar4 = -1; + svar0 = ""; + svar1 = ""; + ivar5 = 0; + ivar6 = -1; + ivar7 = -1; + ivar8 = 0; + ivar9 = 0; + ivar10 = 3484; + ivar11 = -1; + ivar12 = -1; + ivar13 = 0; + ivar14 = 23; + ivar15 = 23; + ivar16 = 0; + while (ivar9 < add(getCommonDefinitionSize(3485), 6)) { + ivar2 = cs2method_3408(105, 105, ivar10, ivar1); + ivar4 = cs2method_3408(105, 74, 3483, ivar2); + if (ivar4 == 1643) { + ivar1 = 0; + if (ivar10 == 3484) { + ivar10 = 3485; + } else { + return ivar15; + } + } else { + if (ivar4 != -1) { + svar0 = getOtherCommonData(ivar4, 1266); + ivar6 = getOtherCommonData(ivar4, 1271); + createExtraChild(new WidgetPointer(917,98), 5, ivar8); + ivar12 = 4041; + ivar11 = 4042; + setWidgetSprite(ivar12); + setScriptCallOnMouseEntered(4013, -2147483643, ivar11, "id"); + setScriptCallOnMouseExit(4013, -2147483643, ivar12, "id"); + setWidgetSize(add(70, 2), add(56, 1), 0, 0); + setWidgetPosition(subtract(ivar14, 1), subtract(ivar15, 1), 0, 0); + setWidgetContextMenuOption(1, "Summary for"); + if (bitconfig_8576 == ivar2) { + setWidgetContextMenuOption(2, "Unpin"); + } else { + if (script_3227(ivar2) != 2) { + setWidgetContextMenuOption(2, "Pin"); + } + } + cs2method1305(svar0); + setScriptCallOnClickContextMenu(3990, ivar2, -2147483643, -2147483644, "iii"); + if (((boolean)script_3999(ivar2))) { + svar1 = " -" + "
"; + svar1 = concat(getOtherCommonData(ivar4, 1266), svar1); + svar1 = concat(svar1, getOtherCommonData(ivar4, 1273)); + setScriptCallOnMouseOver(3998, ivar8, svar1, "is"); + } + if (((boolean)script_3994(ivar2)) && (ivar2 != 4094)) { + globalint_1422 = ivar8; + } + createExtraChild(new WidgetPointer(917,98), 5, add(ivar8, 1)); + setWidgetSize(50, 50, 0, 0); + setWidgetSprite(ivar6); + setWidgetPosition(add(ivar14, 2), add(ivar15, 2), 0, 0); + cs2method2103(ivar16); + createExtraChild(new WidgetPointer(917,98), 5, add(ivar8, 2)); + setWidgetSize(14, 18, 0, 0); + if (((boolean)script_3996(ivar2))) { + ivar7 = 4346; + setWidgetSize(11, 11, 0, 0); + } else { + ivar7 = -1; + } + setWidgetSprite(ivar7); + setWidgetPosition(subtract(add(ivar14, 70), 16), add(ivar15, 4), 0, 0); + createExtraChild(new WidgetPointer(917,98), 5, add(ivar8, 3)); + setWidgetSize(11, 11, 0, 0); + setWidgetPosition(subtract(add(ivar14, 70), 17), add(ivar15, 39), 0, 0); + if (((boolean)script_3994(ivar2))) { + setWidgetSprite(4296); + } + ivar9 = add(ivar9, 1); + ivar8 = multiply(ivar9, 4); + ivar14 = add(add(ivar14, 70), 23); + ivar13 = mod(add(ivar13, 1), 5); + if (((boolean)ivar13)) { + ivar15 = add(add(ivar15, 56), 23); + ivar14 = 23; + } + } + } + ivar1 = add(ivar1, 1); + if ((ivar10 == 3484) && (ivar1 == add(multiply(6, subtract(arg0, 1)), 5))) { + ivar1 = 1; + ivar10 = 3485; + } + } + if (ivar13 != 0) { + ivar15 = add(ivar15, 56); + } else { + ivar15 = subtract(ivar15, 23); + } + return ivar15; +} diff --git a/dumps/scripts/3989.cs2 b/dumps/scripts/3989.cs2 new file mode 100644 index 000000000..949a2e36c --- /dev/null +++ b/dumps/scripts/3989.cs2 @@ -0,0 +1,130 @@ +int script_3989(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + string svar0; + string svar1; + ivar3 = -1; + ivar4 = 0; + ivar5 = 0; + svar0 = ""; + svar1 = ""; + ivar6 = 0; + ivar7 = 0; + ivar8 = -1; + ivar9 = -1; + ivar10 = 0; + ivar11 = 0; + ivar12 = -1; + ivar13 = -1; + ivar14 = 0; + ivar15 = 23; + ivar16 = 0; + ivar17 = 23; + ivar18 = 0; + while ((arg0 != 450) && (arg0 != 4094)) { + ivar3 = cs2method_3408(105, 74, 3483, arg0); + if (ivar3 != -1) { + ivar4 = script_3227(arg0); + ivar5 = getOtherCommonData(ivar3, 1293); + if (((ivar4 != 2) || ((boolean)arg1)) && ((ivar5 != 63) || ((boolean)arg2))) { + svar0 = getOtherCommonData(ivar3, 1266); + ivar6 = getOtherCommonData(ivar3, 1267); + ivar7 = getOtherCommonData(ivar3, 1272); + if (getOtherCommonData(ivar3, 1270) != 4094) { + ivar8 = getOtherCommonData(cs2method_3408(105, 74, 2252, getOtherCommonData(ivar3, 1270)), 952); + } else { + ivar8 = getOtherCommonData(ivar3, 1271); + } + createExtraChild(new WidgetPointer(917,98), 5, ivar10); + if (ivar4 == 2) { + ivar13 = 4043; + ivar12 = 4043; + } else { + ivar13 = 4041; + ivar12 = 4042; + } + setWidgetSprite(ivar13); + setScriptCallOnMouseEntered(4013, -2147483643, ivar12, "id"); + setScriptCallOnMouseExit(4013, -2147483643, ivar13, "id"); + setWidgetSize(add(70, 2), add(56, 1), 0, 0); + setWidgetPosition(subtract(ivar15, 1), subtract(ivar17, 1), 0, 0); + setWidgetContextMenuOption(1, "Summary for"); + if (bitconfig_8576 == arg0) { + setWidgetContextMenuOption(2, "Unpin"); + } else { + if (script_3227(arg0) != 2) { + setWidgetContextMenuOption(2, "Pin"); + } + } + cs2method1305(svar0); + setScriptCallOnClickContextMenu(3990, arg0, -2147483643, -2147483644, "iii"); + if (((boolean)script_3999(arg0))) { + svar1 = " -" + "
"; + svar1 = concat(getOtherCommonData(ivar3, 1266), svar1); + svar1 = concat(svar1, getOtherCommonData(ivar3, 1273)); + setScriptCallOnMouseOver(3998, ivar10, svar1, "is"); + } + if (((boolean)script_3994(arg0)) && (arg0 != 4094)) { + globalint_1422 = ivar10; + } + createExtraChild(new WidgetPointer(917,98), 5, add(ivar10, 1)); + setWidgetSize(50, 50, 0, 0); + setWidgetSprite(ivar8); + setWidgetPosition(add(ivar15, 2), add(ivar17, 2), 0, 0); + cs2method2103(ivar18); + createExtraChild(new WidgetPointer(917,98), 5, add(ivar10, 2)); + if ((ivar5 != 0) && (ivar5 != 63)) { + ivar9 = 4272; + setWidgetSize(13, 13, 0, 0); + setWidgetSprite(ivar9); + setWidgetPosition(subtract(add(ivar15, 70), 17), add(ivar17, 4), 0, 0); + } + createExtraChild(new WidgetPointer(917,98), 5, add(ivar10, 3)); + if (((boolean)script_3994(arg0))) { + ivar9 = 4296; + setWidgetSize(11, 11, 0, 0); + ivar16 = 17; + } else if (((boolean)script_3996(arg0))) { + ivar9 = 4346; + setWidgetSize(11, 11, 0, 0); + ivar16 = 16; + } else { + ivar9 = cs2method_3408(105, 100, 3492, ivar7); + setWidgetSize(9, 11, 0, 0); + ivar16 = 15; + } + setWidgetSprite(ivar9); + setWidgetPosition(subtract(add(ivar15, 70), ivar16), add(ivar17, 39), 0, 0); + ivar11 = add(ivar11, 1); + ivar10 = multiply(ivar11, 4); + ivar15 = add(add(ivar15, 70), 23); + ivar14 = mod(add(ivar14, 1), 5); + if (((boolean)ivar14)) { + ivar17 = add(add(ivar17, 56), 23); + ivar15 = 23; + } + } + } + arg0 = getOtherCommonData(ivar3, 1269); + } + if (ivar14 != 0) { + ivar17 = add(ivar17, 56); + } else { + ivar17 = subtract(ivar17, 23); + } + return ivar17; +} diff --git a/dumps/scripts/399.cs2 b/dumps/scripts/399.cs2 new file mode 100644 index 000000000..7bc3e6cc7 --- /dev/null +++ b/dumps/scripts/399.cs2 @@ -0,0 +1,11 @@ +void script_399(int arg0) { + if ((getWidgetActualX(new WidgetPointer(arg0)) < subtract(getWidgetActualWidth(new WidgetPointer(306,1)), 1)) || (subtract(getWidgetActualY(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0))) > 110)) { + if (getWidgetActualX(new WidgetPointer(arg0)) == add(140, getWidgetActualWidth(new WidgetPointer(arg0)))) { + setScriptCallOnGameloop(1550, new WidgetPointer(306,7), "I", new WidgetPointer(306,20)); + } + setWidgetPosition(add(1, getWidgetActualX(new WidgetPointer(arg0))), getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } else { + script_1411(); + } + return; +} diff --git a/dumps/scripts/3990.cs2 b/dumps/scripts/3990.cs2 new file mode 100644 index 000000000..bbef85c8d --- /dev/null +++ b/dumps/scripts/3990.cs2 @@ -0,0 +1,15 @@ +void script_3990(int arg0,int arg1,int arg2) { + int ivar3; + if (arg2 != 1) { + return; + } + script_41(60096664); + ivar3 = script_3227(arg0); + if (ivar3 == 2) { + script_4014(arg1, 4043); + } else { + script_4014(arg1, 4041); + } + script_3991(arg0); + return; +} diff --git a/dumps/scripts/3991.cs2 b/dumps/scripts/3991.cs2 new file mode 100644 index 000000000..1e84194c6 --- /dev/null +++ b/dumps/scripts/3991.cs2 @@ -0,0 +1,240 @@ +void script_3991(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + string svar6; + int stack_dump0; + cs2func_script_3995_struct(2,1,0) structdump_1; + ivar1 = -1; + ivar2 = 0; + ivar3 = -1; + if (arg0 == 4095) { + arg0 = 4094; + } + svar0 = ""; + svar1 = ""; + svar2 = ""; + ivar4 = -1; + svar3 = ""; + ivar5 = -1; + svar4 = ""; + ivar6 = -1; + ivar7 = 0; + ivar8 = 0; + ivar1 = cs2method_3408(105, 74, 3483, arg0); + if (ivar1 != -1) { + svar0 = getOtherCommonData(ivar1, 1266); + svar1 = getOtherCommonData(ivar1, 1273); + ivar8 = getOtherCommonData(ivar1, 1293); + ivar7 = script_3227(arg0); + ivar2 = add(multiply(subtract(getOtherCommonData(ivar1, 1293), 1), 5), getOtherCommonData(ivar1, 1272)); + ivar3 = cs2method_3408(105, 74, 3494, ivar2); + ivar5 = cs2method_3408(105, 100, 3491, getOtherCommonData(ivar1, 1267)); + ivar4 = cs2method_3408(105, 100, 3492, getOtherCommonData(ivar1, 1272)); + svar3 = concat("Difficulty : ", cs2method_3408(105, 115, 3488, getOtherCommonData(ivar1, 1272))); + svar4 = concat("Area : ", cs2method_3408(105, 115, 3487, getOtherCommonData(ivar1, 1267))); + if (getOtherCommonData(ivar1, 1270) != 4094) { + ivar6 = getOtherCommonData(cs2method_3408(105, 74, 2252, getOtherCommonData(ivar1, 1270)), 952); + svar2 = getOtherCommonData(cs2method_3408(105, 74, 2252, getOtherCommonData(ivar1, 1270)), 951); + } else { + ivar6 = getOtherCommonData(ivar1, 1271); + svar2 = getOtherCommonData(ivar1, 1292); + } + } else { + svar0 = "Couldn't find the Task's struct."; + svar1 = "Couldn't find the Task's struct."; + svar2 = "Couldn't find the Task's struct."; + } + setWidgetText(new WidgetPointer(917,34), svar0); + setWidgetText(new WidgetPointer(917,63), svar1); + svar5 = ""; + if (((boolean)stringMethod4107(svar2, ""))) { + if (bitconfig_8601 < 10) { + svar5 = "ten"; + } else if (bitconfig_8601 < 25) { + svar5 = "forty"; + } else if (bitconfig_8601 < 50) { + svar5 = "160"; + } else if (bitconfig_8601 < 100) { + svar5 = "640"; + } else { + svar5 = "2560"; + } + svar2 = "Completing this Task will earn you " + svar5 + " coins."; + } + setWidgetText(new WidgetPointer(917,50), svar2); + setWidgetFont(495, new WidgetPointer(917,50)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(917,50)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(917,50)), getLineCount(getWidgetActualWidth(new WidgetPointer(917,50)), 495, svar1), 0, 0, new WidgetPointer(917,50)); + setWidgetSprite(ivar6, new WidgetPointer(917,37)); + setWidgetSprite(ivar5, new WidgetPointer(917,39)); + setWidgetSprite(ivar4, new WidgetPointer(917,36)); + setWidgetText(new WidgetPointer(917,35), svar3); + setWidgetText(new WidgetPointer(917,38), svar4); + setWidgetIsHidden(true, new WidgetPointer(917,155)); + setWidgetIsHidden(true, new WidgetPointer(917,156)); + setWidgetIsHidden(true, new WidgetPointer(917,157)); + setWidgetIsHidden(true, new WidgetPointer(917,158)); + setWidgetIsHidden(true, new WidgetPointer(917,159)); + setWidgetIsHidden(true, new WidgetPointer(917,160)); + setWidgetIsHidden(true, new WidgetPointer(917,161)); + setWidgetIsHidden(true, new WidgetPointer(917,162)); + setWidgetIsHidden(true, new WidgetPointer(917,163)); + setWidgetIsHidden(true, new WidgetPointer(917,164)); + ivar9 = 0; + svar6 = ""; + ivar10 = 0; + stack_dump0 = arg0; + structdump_1 = script_3995(stack_dump0); + ivar10 = structdump_1.intpart_1; + svar6 = structdump_1.stringpart_0; + ivar9 = structdump_1.intpart_0; + setWidgetText(new WidgetPointer(917,1), svar6); + setWidgetRGB(new Color(ivar10), new WidgetPointer(917,1)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(917,1)), getLineCount(getWidgetActualWidth(new WidgetPointer(917,1)), 495, svar1), 0, 0, new WidgetPointer(917,1)); + setWidgetPosition(9, 16, 0, 0, new WidgetPointer(917,1)); + if (((boolean)ivar9) && (script_3227(arg0) != 2)) { + setWidgetIsHidden(false, new WidgetPointer(917,41)); + } else { + setWidgetIsHidden(true, new WidgetPointer(917,41)); + } + ivar11 = 34; + ivar12 = ivar11; + ivar13 = 0; + while (ivar13 < 10) { + ivar12 = script_3222(ivar11, arg0, ivar13, ((int)cs2method_3408(105, 73, 3493, ivar13))); + if (ivar12 == ivar11) { + ivar13 = 10; + } else { + ivar13 = add(ivar13, 1); + ivar11 = ivar12; + } + } + globalint_1420 = add(ivar11, 3); + ivar14 = 4094; + setWidgetIsHidden(true, new WidgetPointer(917,2)); + setWidgetIsHidden(true, new WidgetPointer(917,3)); + setWidgetIsHidden(true, new WidgetPointer(917,4)); + setWidgetIsHidden(true, new WidgetPointer(917,5)); + setWidgetIsHidden(true, new WidgetPointer(917,6)); + setWidgetIsHidden(true, new WidgetPointer(917,7)); + setWidgetIsHidden(true, new WidgetPointer(917,8)); + setWidgetIsHidden(true, new WidgetPointer(917,9)); + setWidgetIsHidden(true, new WidgetPointer(917,10)); + setWidgetIsHidden(true, new WidgetPointer(917,11)); + setWidgetIsHidden(true, new WidgetPointer(917,12)); + setWidgetIsHidden(true, new WidgetPointer(917,13)); + ivar11 = 10; + if ((stringMethod4107(getOtherCommonData(ivar1, 1274), "") != 0) && (arg0 != 4095)) { + if (getOtherCommonData(ivar1, 1282) != -1) { + ivar14 = arg0; + } + ivar11 = script_3992(1, ivar11, 60096514, ivar14, 60096515, 60096593, getOtherCommonData(ivar1, 1274)); + } + ivar14 = 4094; + if ((stringMethod4107(getOtherCommonData(ivar1, 1275), "") != 0) && (arg0 != 4095)) { + if (getOtherCommonData(ivar1, 1283) != -1) { + ivar14 = arg0; + } + ivar11 = script_3992(2, ivar11, 60096516, ivar14, 60096517, 60096593, getOtherCommonData(ivar1, 1275)); + } + ivar14 = 4094; + if ((stringMethod4107(getOtherCommonData(ivar1, 1276), "") != 0) && (arg0 != 4095)) { + if (getOtherCommonData(ivar1, 1284) != -1) { + ivar14 = arg0; + } + ivar11 = script_3992(3, ivar11, 60096518, ivar14, 60096519, 60096593, getOtherCommonData(ivar1, 1276)); + } + ivar14 = 4094; + if ((stringMethod4107(getOtherCommonData(ivar1, 1277), "") != 0) && (arg0 != 4095)) { + if (getOtherCommonData(ivar1, 1285) != -1) { + ivar14 = arg0; + } + ivar11 = script_3992(4, ivar11, 60096520, ivar14, 60096521, 60096593, getOtherCommonData(ivar1, 1277)); + } + ivar14 = 4094; + if ((stringMethod4107(getOtherCommonData(ivar1, 1278), "") != 0) && (arg0 != 4095)) { + if (getOtherCommonData(ivar1, 1286) != -1) { + ivar14 = arg0; + } + ivar11 = script_3992(5, ivar11, 60096522, ivar14, 60096523, 60096593, getOtherCommonData(ivar1, 1278)); + } + ivar14 = 4094; + if ((stringMethod4107(getOtherCommonData(ivar1, 1279), "") != 0) && (arg0 != 4095)) { + if (getOtherCommonData(ivar1, 1287) != -1) { + ivar14 = arg0; + } + ivar11 = script_3992(6, ivar11, 60096524, ivar14, 60096525, 60096593, getOtherCommonData(ivar1, 1279)); + } + globalint_1418 = add(ivar11, 3); + setWidgetIsHidden(true, new WidgetPointer(917,51)); + setWidgetIsHidden(true, new WidgetPointer(917,52)); + setWidgetIsHidden(true, new WidgetPointer(917,53)); + setWidgetIsHidden(true, new WidgetPointer(917,54)); + setWidgetIsHidden(true, new WidgetPointer(917,55)); + setWidgetIsHidden(true, new WidgetPointer(917,56)); + setWidgetIsHidden(true, new WidgetPointer(917,57)); + setWidgetIsHidden(true, new WidgetPointer(917,58)); + ivar11 = 10; + ivar11 = script_3992(0, ivar11, 60096562, 4094, -1, 60096597, svar2); + if ((ivar3 != -1) && (ivar3 != 1645)) { + ivar11 = script_3992(0, ivar11, 60096563, 4094, -1, 60096597, getOtherCommonData(ivar3, 1273)); + ivar11 = script_3992(0, ivar11, 60096564, 4094, -1, 60096597, getOtherCommonData(ivar3, 1292)); + if (stringMethod4107(getOtherCommonData(ivar3, 1274), "") != 0) { + ivar11 = script_3992(0, ivar11, 60096565, 4094, -1, 60096597, getOtherCommonData(ivar3, 1274)); + } + if (stringMethod4107(getOtherCommonData(ivar3, 1275), "") != 0) { + ivar11 = script_3992(0, ivar11, 60096566, 4094, -1, 60096597, getOtherCommonData(ivar3, 1275)); + } + if (stringMethod4107(getOtherCommonData(ivar3, 1276), "") != 0) { + ivar11 = script_3992(0, ivar11, 60096567, 4094, -1, 60096597, getOtherCommonData(ivar3, 1276)); + } + if (stringMethod4107(getOtherCommonData(ivar3, 1277), "") != 0) { + ivar11 = script_3992(0, ivar11, 60096568, 4094, -1, 60096597, getOtherCommonData(ivar3, 1277)); + } + if (stringMethod4107(getOtherCommonData(ivar3, 1278), "") != 0) { + ivar11 = script_3992(0, ivar11, 60096569, 4094, -1, 60096597, getOtherCommonData(ivar3, 1278)); + } + if (stringMethod4107(getOtherCommonData(ivar3, 1279), "") != 0) { + ivar11 = script_3992(0, ivar11, 60096570, 4094, -1, 60096597, getOtherCommonData(ivar3, 1279)); + } + } else { + if (bitconfig_8601 > bitconfig_8602) { + svar2 = "You're already owed a reward! You may claim it from Explorer Jack or any other taskmaster, or increase it by completing more Tasks. "; + if (standart_config_1959 > 0) { + svar2 = concat(svar2, "You are also owed one or more items."); + } + ivar11 = script_3992(0, ivar11, 60096564, 4094, -1, 60096597, svar2); + } + } + globalint_1419 = ivar11; + if (((boolean)script_3999(arg0))) { + script_4019(0); + setWidgetIsHidden(false, new WidgetPointer(917,92)); + setWidgetIsHidden(false, new WidgetPointer(917,83)); + setWidgetSprite(4320, new WidgetPointer(917,26)); + setWidgetSprite(4320, new WidgetPointer(917,28)); + setWidgetSprite(4321, new WidgetPointer(917,27)); + setWidgetIsHidden(true, new WidgetPointer(917,84)); + setWidgetIsHidden(true, new WidgetPointer(917,82)); + setWidgetIsHidden(true, new WidgetPointer(917,86)); + } + return; +} diff --git a/dumps/scripts/3992.cs2 b/dumps/scripts/3992.cs2 new file mode 100644 index 000000000..58a533c4d --- /dev/null +++ b/dumps/scripts/3992.cs2 @@ -0,0 +1,35 @@ +int script_3992(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6) { + int ivar6; + int ivar7; + int ivar8; + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetText(new WidgetPointer(arg2), arg6); + setWidgetFont(495, new WidgetPointer(arg2)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(arg2)); + ivar6 = subtract(getWidgetActualWidth(new WidgetPointer(arg5)), 34); + if (((boolean)script_3999(arg3))) { + ivar6 = add(ivar6, 9); + } + ivar7 = 0; + if (arg4 != -1) { + ivar7 = getWidgetActualHeight(new WidgetPointer(arg4)); + ivar6 = subtract(ivar6, 21); + } + ivar8 = max(add(ivar7, 5), multiply(15, getLineCount(ivar6, 495, arg6))); + setWidgetSize(ivar6, ivar8, 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(9, arg1, 0, 0, new WidgetPointer(arg2)); + if (((boolean)script_3999(arg3)) && (arg4 != -1)) { + setWidgetIsHidden(false, new WidgetPointer(arg4)); + setWidgetPosition(16, add(arg1, divide(subtract(ivar8, getWidgetActualHeight(new WidgetPointer(arg4))), 2)), 2, 0, new WidgetPointer(arg4)); + if ((bitconfig_8578 == arg0) && (bitconfig_8594 == arg3)) { + setWidgetSprite(5623, new WidgetPointer(arg4)); + setScriptCallOnMouseEntered(4009, 0, 1, new WidgetPointer(arg4), "iiI", new WidgetPointer(arg4)); + setScriptCallOnMouseExit(4009, 1, 1, new WidgetPointer(arg4), "iiI", new WidgetPointer(arg4)); + } else { + setWidgetSprite(5621, new WidgetPointer(arg4)); + setScriptCallOnMouseEntered(4009, 0, 0, new WidgetPointer(arg4), "iiI", new WidgetPointer(arg4)); + setScriptCallOnMouseExit(4009, 1, 0, new WidgetPointer(arg4), "iiI", new WidgetPointer(arg4)); + } + } + return add(arg1, ivar8); +} diff --git a/dumps/scripts/3993.cs2 b/dumps/scripts/3993.cs2 new file mode 100644 index 000000000..0858c4827 --- /dev/null +++ b/dumps/scripts/3993.cs2 @@ -0,0 +1,32 @@ +void script_3993() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 1; + ivar1 = -1; + while (ivar0 < subtract(getCommonDefinitionSize(3489), 1)) { + ivar1 = ((int)cs2method_3408(105, 73, 3489, ivar0)); + setWidgetPosition(14, multiply(subtract(ivar0, 1), getWidgetActualHeight(new WidgetPointer(ivar1))), 0, 0, new WidgetPointer(ivar1)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(ivar1)); + ivar1 = ((int)cs2method_3408(105, 73, 3490, ivar0)); + if (ivar1 != -1) { + setWidgetPosition(1, add(2, multiply(subtract(ivar0, 1), getWidgetActualHeight(new WidgetPointer(ivar1)))), 0, 0, new WidgetPointer(ivar1)); + } + ivar0 = add(ivar0, 1); + } + ivar1 = ((int)cs2method_3408(105, 73, 3489, 62)); + setWidgetPosition(14, multiply(subtract(ivar0, 1), getWidgetActualHeight(new WidgetPointer(ivar1))), 0, 0, new WidgetPointer(ivar1)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(ivar1)); + ivar1 = ((int)cs2method_3408(105, 73, 3490, 62)); + setWidgetPosition(1, add(2, multiply(subtract(ivar0, 1), getWidgetActualHeight(new WidgetPointer(ivar1)))), 0, 0, new WidgetPointer(ivar1)); + ivar0 = add(ivar0, 1); + ivar1 = ((int)cs2method_3408(105, 73, 3489, 0)); + setWidgetPosition(14, multiply(subtract(ivar0, 1), getWidgetActualHeight(new WidgetPointer(ivar1))), 0, 0, new WidgetPointer(ivar1)); + setWidgetRGB(new Color(255, 249, 235), new WidgetPointer(ivar1)); + ivar1 = ((int)cs2method_3408(105, 73, 3490, 0)); + setWidgetPosition(1, add(2, multiply(subtract(ivar0, 1), getWidgetActualHeight(new WidgetPointer(ivar1)))), 0, 0, new WidgetPointer(ivar1)); + ivar2 = multiply(ivar0, getWidgetActualHeight(new WidgetPointer(ivar1))); + setWidgetScrollMax(0, ivar2, new WidgetPointer(917,119)); + script_31(60096627, 60096631, 4288, 4286, 4285, 4287, 4290, 4289); + return; +} diff --git a/dumps/scripts/3994.cs2 b/dumps/scripts/3994.cs2 new file mode 100644 index 000000000..069401044 --- /dev/null +++ b/dumps/scripts/3994.cs2 @@ -0,0 +1,10 @@ +int script_3994(int arg0) { + int ivar1; + int ivar2; + ivar1 = cs2method_3408(105, 74, 3483, arg0); + ivar2 = getOtherCommonData(ivar1, 1268); + if (ivar2 == bitconfig_8576) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/3995.cs2 b/dumps/scripts/3995.cs2 new file mode 100644 index 000000000..d18ec633d --- /dev/null +++ b/dumps/scripts/3995.cs2 @@ -0,0 +1,27 @@ +cs2func_script_3995_struct(2,1,0) script_3995(int arg0) { + if (arg0 >= 4091) { + return newstruct cs2func_script_3995_struct(0, 0, ""); + } + if ((arg0 >= 4000) && (arg0 <= 4027)) { + return newstruct cs2func_script_3995_struct(0, 0, ""); + } + if (((boolean)getOtherCommonData(cs2method_3408(105, 74, 3483, arg0), 1294))) { + return newstruct cs2func_script_3995_struct(1, 65280, "There are no requirements for this Task."); + } + if (script_3227(arg0) == 2) { + return newstruct cs2func_script_3995_struct(2, 65280, "You have completed this Task."); + } + if (((boolean)script_3994(arg0))) { + if (((boolean)script_3999(arg0))) { + return newstruct cs2func_script_3995_struct(0, 65280, ""); + } + return newstruct cs2func_script_3995_struct(1, 9393963, "You currently have this Task pinned."); + } + if (isMember() && (getOtherCommonData(cs2method_3408(105, 74, 3483, arg0), 1290) == 2)) { + return newstruct cs2func_script_3995_struct(0, 16711680, "This Task cannot be completed in the free game."); + } + if (((boolean)script_3224(arg0))) { + return newstruct cs2func_script_3995_struct(0, 16711680, "You lack one or more prerequisites needed to complete this Task."); + } + return newstruct cs2func_script_3995_struct(1, 65280, "You have the requirements to complete this Task."); +} diff --git a/dumps/scripts/3996.cs2 b/dumps/scripts/3996.cs2 new file mode 100644 index 000000000..ffbec1ad2 --- /dev/null +++ b/dumps/scripts/3996.cs2 @@ -0,0 +1,24 @@ +int script_3996(int arg0) { + if (arg0 >= 4091) { + return 0; + } + if ((arg0 >= 4000) && (arg0 <= 4027)) { + return 0; + } + if (script_3227(arg0) == 2) { + return 2; + } + if (((boolean)script_3994(arg0))) { + if (((boolean)script_3999(arg0))) { + return 0; + } + return 1; + } + if (isMember() && (getOtherCommonData(cs2method_3408(105, 74, 3483, arg0), 1290) == 2)) { + return 0; + } + if (((boolean)script_3224(arg0))) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/3997.cs2 b/dumps/scripts/3997.cs2 new file mode 100644 index 000000000..eda6d0c9f --- /dev/null +++ b/dumps/scripts/3997.cs2 @@ -0,0 +1,11 @@ +void script_3997() { + int ivar0; + setWidgetText(new WidgetPointer(917,112), intToStr(globalint_1423)); + setWidgetText(new WidgetPointer(917,110), intToStr(globalint_1424)); + setWidgetText(new WidgetPointer(917,150), intToStr(428)); + setWidgetText(new WidgetPointer(917,148), intToStr(bitconfig_8601)); + setWidgetText(new WidgetPointer(917,113), "Progress:"); + ivar0 = divide(multiply(globalint_1424, subtract(getWidgetActualWidth(new WidgetPointer(917,105)), 4)), max(globalint_1423, 1)); + setWidgetSize(ivar0, 16, 0, 0, new WidgetPointer(917,109)); + return; +} diff --git a/dumps/scripts/3998.cs2 b/dumps/scripts/3998.cs2 new file mode 100644 index 000000000..5121c6c3a --- /dev/null +++ b/dumps/scripts/3998.cs2 @@ -0,0 +1,84 @@ +void script_3998(int arg0,string arg1) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + flow_0: + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 210; + ivar7 = 0; + ivar8 = 2; + ivar9 = -1; + IF (arg0 == -1) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (setWidgetRegister(new WidgetPointer(917,98))) + GOTO flow_3 + flow_2: + IF (setWidgetRegister(new WidgetPointer(917,98), arg0)) + GOTO flow_3 + GOTO flow_20 + flow_3: + if (globalint_1 < add(getClientCycle(), ivar8)) { + if (globalint_1 < getClientCycle()) { + globalint_1 = getClientCycle(); + } + globalint_1 = add(globalint_1, 2); + return; + } + globalint_1 = add(add(getClientCycle(), ivar8), 10); + if (globalint_2 != 1) { + ivar9 = getWidgetParentId(new WidgetPointer(917,101)); + if ((ivar9 != -1) && (ivar6 >= subtract(subtract(getWidgetActualWidth(new WidgetPointer(ivar9)), getWidgetActualWidth(new WidgetPointer(917,100))), 30))) { + ivar6 = subtract(subtract(getWidgetActualWidth(new WidgetPointer(ivar9)), getWidgetActualWidth(new WidgetPointer(917,100))), 30); + } + ivar5 = add(4, getMaxLineWidth(subtract(ivar6, 4), 495, arg1)); + ivar7 = add(4, multiply(16, getLineCount(subtract(ivar6, 4), 495, arg1))); + if (ivar9 != -1) { + ivar1 = add(getWidgetActualX(), 5); + if (add(add(ivar1, ivar5), 5) > getWidgetActualWidth(new WidgetPointer(917,98))) { + ivar1 = subtract(subtract(getWidgetActualWidth(new WidgetPointer(917,98)), ivar5), 5); + } + ivar2 = subtract(add(add(getWidgetActualY(), getWidgetActualHeight()), 5), cs2method2601(new WidgetPointer(917,98))); + } + if (ivar2 < 0) { + ivar2 = cs2method2601(new WidgetPointer(917,98)); + } else { + if (ivar2 > subtract(subtract(getWidgetActualHeight(new WidgetPointer(ivar9)), ivar7), 25)) { + ivar2 = subtract(subtract(getWidgetActualHeight(new WidgetPointer(ivar9)), ivar7), 25); + } + } + setWidgetSize(ivar5, ivar7, 0, 0, new WidgetPointer(917,101)); + setWidgetPosition(ivar1, ivar2, 0, 0, new WidgetPointer(917,101)); + deleteAllExtraChilds(new WidgetPointer(917,101)); + createExtraChild(new WidgetPointer(917,101), 3, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(917,101)), getWidgetActualHeight(new WidgetPointer(917,101)), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(90); + createExtraChild(new WidgetPointer(917,101), 3, 1); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(917,101)), getWidgetActualHeight(new WidgetPointer(917,101)), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(917,101), 4, 2); + setWidgetSize(subtract(ivar6, 4), getWidgetActualHeight(new WidgetPointer(917,101)), 0, 0); + setWidgetPosition(2, 0, 0, 0); + setWidgetText(arg1); + setWidgetTextAlignment(0, 1, 16); + setWidgetFont(495); + setWidgetRGB(new Color(238, 238, 238)); + globalint_2 = 1; + } + flow_20: + return; +} diff --git a/dumps/scripts/3999.cs2 b/dumps/scripts/3999.cs2 new file mode 100644 index 000000000..d0bc428b2 --- /dev/null +++ b/dumps/scripts/3999.cs2 @@ -0,0 +1,6 @@ +int script_3999(int arg0) { + if ((((((arg0 == 4091) || (arg0 == 4092)) || (arg0 == 450)) || (arg0 == 4094)) || (arg0 == 4095)) || (arg0 == 4093)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/4.cs2 b/dumps/scripts/4.cs2 new file mode 100644 index 000000000..2f7d1e9e6 --- /dev/null +++ b/dumps/scripts/4.cs2 @@ -0,0 +1,294 @@ +void script_4(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,string arg8) { + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + string svar1; + string svar2; + int stack_dump0; + opcStruct5224(2,0,0) structdump_1; + opcStruct5224(2,0,0) structdump_2; + opcStruct5224(2,0,0) structdump_3; + opcStruct5224(2,0,0) structdump_4; + if ((arg1 == -1) || ((boolean)arg1)) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; + } + ivar8 = 0; + ivar9 = 0; + stack_dump0 = arg1; + structdump_1 = cs2method5224(stack_dump0); + ivar9 = structdump_1.intpart_1; + ivar8 = structdump_1.intpart_0; + if ((ivar8 < 0) || (ivar9 < 0)) { + arg1 = addToCoordinate(0, extractX(arg1), script_686(subtract(extractZ(arg1), 1), 4), extractY(arg1)); + stack_dump0 = arg1; + structdump_2 = cs2method5224(stack_dump0); + ivar9 = structdump_2.intpart_1; + ivar8 = structdump_2.intpart_0; + if ((ivar8 < 0) || (ivar9 < 0)) { + arg1 = addToCoordinate(0, extractX(arg1), script_686(subtract(extractZ(arg1), 1), 4), extractY(arg1)); + stack_dump0 = arg1; + structdump_3 = cs2method5224(stack_dump0); + ivar9 = structdump_3.intpart_1; + ivar8 = structdump_3.intpart_0; + if ((ivar8 < 0) || (ivar9 < 0)) { + arg1 = addToCoordinate(0, extractX(arg1), script_686(subtract(extractZ(arg1), 1), 4), extractY(arg1)); + stack_dump0 = arg1; + structdump_4 = cs2method5224(stack_dump0); + ivar9 = structdump_4.intpart_1; + ivar8 = structdump_4.intpart_0; + if ((ivar8 < 0) || (ivar9 < 0)) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; + } + } + } + } + setWidgetIsHidden(false, new WidgetPointer(arg0)); + ivar10 = getWidgetActualWidth(new WidgetPointer(arg3)); + ivar11 = getWidgetActualHeight(new WidgetPointer(arg3)); + if (arg2 == -1) { + arg2 = 280; + } + ivar8 = multiplyDivide(ivar10, subtract(arg6, arg7), subtract(ivar8, arg7)); + ivar9 = multiplyDivide(ivar11, subtract(arg4, arg5), subtract(ivar9, arg5)); + ivar8 = max(min(ivar8, ivar10), 0); + ivar9 = max(min(ivar9, ivar11), 0); + ivar8 = subtract(ivar8, divide(ivar10, 2)); + ivar9 = subtract(divide(ivar11, 2), ivar9); + setWidgetPosition(ivar8, ivar9, 1, 1, new WidgetPointer(arg0)); + ivar12 = getOtherCommonData(arg2, 132); + ivar13 = getOtherCommonData(arg2, 133); + ivar14 = -1; + if (ivar8 <= subtract(0, divide(ivar10, 2))) { + if (ivar9 <= subtract(0, divide(ivar11, 2))) { + ivar14 = 3; + } else if (ivar9 >= divide(ivar11, 2)) { + ivar14 = 1; + } else { + ivar14 = 2; + } + } else if (ivar8 >= divide(ivar10, 2)) { + if (ivar9 <= subtract(0, divide(ivar11, 2))) { + ivar14 = 5; + } else if (ivar9 >= divide(ivar11, 2)) { + ivar14 = 7; + } else { + ivar14 = 6; + } + } else if (ivar9 <= subtract(0, divide(ivar11, 2))) { + ivar14 = 4; + } else { + if (ivar9 >= divide(ivar11, 2)) { + ivar14 = 0; + } + } + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + svar1 = "Scroll map"; + svar2 = ""; + if (strLength(arg8) > 0) { + if (arg0 == 49479716) { + svar2 = "Your position"; + } else { + svar2 = strRemoveEntities(script_2332(arg8, "
", " ")); + } + svar1 = "Scroll map:"; + } + if (ivar14 == -1) { + script_2048(arg0, 0, getOtherCommonData(arg2, 130), ivar12, ivar13, 0, 0, 0, 0, 0, 0, 0, arg1, svar2, svar1); + ivar15 = divide(ivar13, 2); + ivar16 = divide(ivar13, 2); + ivar17 = divide(ivar12, 2); + ivar18 = divide(ivar12, 2); + script_2048(arg0, 1, getOtherCommonData(arg2, 131), ivar12, ivar13, 0, 0, 0, 0, 0, 0, 1, -1, "", ""); + } else { + ivar12 = getOtherCommonData(arg2, 136); + ivar13 = getOtherCommonData(arg2, 645); + switch (ivar14) { + case 0: + script_2048(arg0, 0, getOtherCommonData(arg2, 134), ivar12, ivar13, 0, subtract(0, divide(ivar13, 2)), 49152, 0, 0, 0, 0, arg1, svar2, svar1); + ivar15 = ivar13; + ivar16 = 0; + ivar17 = divide(ivar12, 2); + ivar18 = divide(ivar12, 2); + break; + case 1: + script_2048(arg0, 0, getOtherCommonData(arg2, 135), ivar12, ivar13, divide(ivar12, 2), subtract(0, divide(ivar13, 2)), 32768, 0, 0, 0, 0, arg1, svar2, svar1); + ivar15 = ivar13; + ivar16 = 0; + ivar17 = 0; + ivar18 = ivar12; + break; + case 2: + script_2048(arg0, 0, getOtherCommonData(arg2, 134), ivar12, ivar13, divide(ivar12, 2), 0, 32768, 0, 0, 0, 0, arg1, svar2, svar1); + ivar15 = divide(ivar13, 2); + ivar16 = divide(ivar13, 2); + ivar17 = 0; + ivar18 = ivar12; + break; + case 3: + script_2048(arg0, 0, getOtherCommonData(arg2, 135), ivar12, ivar13, divide(ivar12, 2), divide(ivar13, 2), 16384, 0, 0, 0, 0, arg1, svar2, svar1); + ivar15 = 0; + ivar16 = ivar13; + ivar17 = 0; + ivar18 = ivar12; + break; + case 4: + script_2048(arg0, 0, getOtherCommonData(arg2, 134), ivar12, ivar13, 0, divide(ivar13, 2), 16384, 0, 0, 0, 0, arg1, svar2, svar1); + ivar15 = 0; + ivar16 = ivar13; + ivar17 = divide(ivar12, 2); + ivar18 = divide(ivar12, 2); + break; + case 5: + script_2048(arg0, 0, getOtherCommonData(arg2, 135), ivar12, ivar13, subtract(0, divide(ivar12, 2)), divide(ivar13, 2), 0, 0, 0, 0, 0, arg1, svar2, svar1); + ivar15 = 0; + ivar16 = ivar13; + ivar17 = ivar12; + ivar18 = 0; + break; + case 6: + script_2048(arg0, 0, getOtherCommonData(arg2, 134), ivar12, ivar13, subtract(0, divide(ivar12, 2)), 0, 0, 0, 0, 0, 0, arg1, svar2, svar1); + ivar15 = divide(ivar13, 2); + ivar16 = divide(ivar13, 2); + ivar17 = ivar12; + ivar18 = 0; + break; + case 7: + script_2048(arg0, 0, getOtherCommonData(arg2, 135), ivar12, ivar13, subtract(0, divide(ivar12, 2)), subtract(0, divide(ivar13, 2)), 49152, 0, 0, 0, 0, arg1, svar2, svar1); + ivar15 = ivar13; + ivar16 = 0; + ivar17 = ivar12; + ivar18 = 0; + } + script_2050(arg0, 1); + } + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + ivar27 = -1; + ivar28 = -1; + ivar29 = -1; + ivar30 = 0; + if (strLength(arg8) > 0) { + ivar23 = getOtherCommonData(arg2, 650); + ivar24 = getOtherCommonData(arg2, 651); + ivar27 = getOtherCommonData(arg2, 647); + ivar28 = getOtherCommonData(arg2, 648); + ivar29 = getOtherCommonData(arg2, 649); + ivar19 = add(add(getMaxLineWidth(ivar10, 591, arg8), ivar23), ivar23); + ivar20 = add(add(add(multiply(getLineCount(ivar19, 591, arg8), 13), 2), ivar24), ivar24); + if (add(ivar15, ivar20) < add(ivar9, divide(ivar11, 2))) { + ivar22 = subtract(0, add(ivar15, divide(ivar20, 2))); + } else { + ivar22 = add(ivar16, divide(ivar20, 2)); + } + ivar30 = subtract(add(ivar8, divide(ivar10, 2)), divide(ivar19, 2)); + if (ivar30 <= 0) { + ivar21 = subtract(0, ivar30); + } else { + ivar30 = add(add(ivar8, divide(ivar10, 2)), divide(ivar19, 2)); + if (ivar30 >= ivar10) { + ivar21 = subtract(ivar10, ivar30); + } + } + ivar25 = divide(subtract(ivar19, ivar23), 2); + ivar26 = divide(subtract(ivar20, ivar24), 2); + script_2048(arg0, 2, getOtherCommonData(arg2, 646), subtract(ivar19, multiply(ivar23, 2)), subtract(ivar20, multiply(ivar24, 2)), ivar21, ivar22, 0, 1, 0, 0, 0, -1, "", ""); + script_2048(arg0, 3, ivar28, subtract(ivar19, multiply(ivar23, 2)), ivar24, ivar21, subtract(ivar22, ivar26), 0, 1, 0, 0, 0, -1, "", ""); + script_2048(arg0, 4, ivar28, subtract(ivar19, multiply(ivar23, 2)), ivar24, ivar21, add(ivar22, ivar26), 0, 1, 0, 1, 0, -1, "", ""); + script_2048(arg0, 5, ivar29, ivar23, subtract(ivar20, multiply(ivar24, 2)), subtract(ivar21, ivar25), ivar22, 0, 1, 0, 0, 0, -1, "", ""); + script_2048(arg0, 6, ivar29, ivar23, subtract(ivar20, multiply(ivar24, 2)), add(ivar21, ivar25), ivar22, 0, 1, 1, 0, 0, -1, "", ""); + script_2048(arg0, 7, ivar27, ivar23, ivar24, subtract(ivar21, ivar25), subtract(ivar22, ivar26), 0, 0, 0, 0, 0, -1, "", ""); + script_2048(arg0, 8, ivar27, ivar23, ivar24, add(ivar21, ivar25), subtract(ivar22, ivar26), 0, 0, 1, 0, 0, -1, "", ""); + script_2048(arg0, 9, ivar27, ivar23, ivar24, subtract(ivar21, ivar25), add(ivar22, ivar26), 0, 0, 0, 1, 0, -1, "", ""); + script_2048(arg0, 10, ivar27, ivar23, ivar24, add(ivar21, ivar25), add(ivar22, ivar26), 0, 0, 1, 1, 0, -1, "", ""); + script_2051(arg0, 11, ivar19, ivar20, add(ivar21, 1), add(ivar22, 1), getOtherCommonData(arg2, 653), -1, arg8, "", ""); + script_2051(arg0, 12, ivar19, ivar20, ivar21, ivar22, getOtherCommonData(arg2, 652), arg1, arg8, svar2, svar1); + } else { + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 4)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 5)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 6)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 7)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 8)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 9)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 10)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 11)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(arg0), 12)) { + deleteExtraChild(); + } + } + ivar31 = 0; + ivar32 = 0; + if (ivar21 < 0) { + ivar31 = max(subtract(0, subtract(ivar21, divide(ivar19, 2))), ivar17); + } else if (ivar19 > 0) { + ivar31 = max(add(ivar21, divide(ivar19, 2)), ivar18); + } else { + ivar31 = max(ivar17, ivar18); + } + if (ivar22 <= 0) { + ivar32 = max(add(ivar15, ivar20), ivar16); + } else { + ivar32 = add(ivar16, ivar20); + } + stack_dump0 = add(multiply(ivar31, 2), 2); + ivar32 = add(multiply(ivar32, 2), 2); + ivar31 = stack_dump0; + setWidgetSize(ivar31, ivar32, 0, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/40.cs2 b/dumps/scripts/40.cs2 new file mode 100644 index 000000000..46e87d066 --- /dev/null +++ b/dumps/scripts/40.cs2 @@ -0,0 +1,4 @@ +void script_40(int arg0) { + script_41(arg0); + return; +} diff --git a/dumps/scripts/400.cs2 b/dumps/scripts/400.cs2 new file mode 100644 index 000000000..47a9d18c2 --- /dev/null +++ b/dumps/scripts/400.cs2 @@ -0,0 +1,31 @@ +string script_400(string arg0,string arg1,string arg2) { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + string svar3; + string svar4; + ivar0 = 0; + ivar1 = 0; + svar3 = ""; + svar4 = ""; + ivar2 = strLength(arg0); + ivar3 = strLength(arg1); + if (ivar2 > 0) { + ivar1 = strIndexof(ivar1, arg0, arg1); + while (ivar1 != -1) { + svar4 = substr(ivar0, ivar1, arg0); + if (stringMethod4107(svar4, "") != 0) { + svar3 = svar3 + svar4 + arg2; + } + ivar1 = add(ivar1, ivar3); + ivar0 = ivar1; + ivar1 = strIndexof(ivar1, arg0, arg1); + } + svar4 = substr(ivar0, ivar2, arg0); + if (stringMethod4107(svar4, "") != 0) { + svar3 = svar3 + svar4; + } + } + return svar3; +} diff --git a/dumps/scripts/4000.cs2 b/dumps/scripts/4000.cs2 new file mode 100644 index 000000000..575a0fe97 --- /dev/null +++ b/dumps/scripts/4000.cs2 @@ -0,0 +1,85 @@ +void script_4000(int arg0) { + int ivar1; + int ivar2; + int ivar3; + string svar0; + svar0 = ""; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + switch (arg0) { + case 0: + setWidgetIsHidden(true, new WidgetPointer(1056,92)); + setWidgetIsHidden(true, new WidgetPointer(1056,94)); + setWidgetIsHidden(false, new WidgetPointer(1056,125)); + if (((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1753, 1266))) || (((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1752, 1266))) && (standart_config_281 == 1000))) { + svar0 = "Click on the Hints tab for more on how to complete this Task."; + } else { + if (((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1754, 1266))) || ((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1518, 1266)))) { + svar0 = "Remember, the Hints tab provides more details about a Task."; + } + } + if (getDisplayMode() >= 2) { + ivar1 = 196; + ivar2 = 183; + ivar3 = 1; + if (getWidgetActualWidth(new WidgetPointer(746,2)) < 997) { + ivar2 = add(ivar2, 40); + } + } else { + ivar1 = 217; + ivar2 = 177; + } + break; + case 1: + setWidgetIsHidden(true, new WidgetPointer(1056,92)); + setWidgetIsHidden(false, new WidgetPointer(1056,94)); + setWidgetIsHidden(true, new WidgetPointer(1056,125)); + if (((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1753, 1266))) || (((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1752, 1266))) && (standart_config_281 == 1000))) { + svar0 = "Click on the Hints tab for more on how to complete this Task."; + } else { + if (((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1754, 1266))) || ((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1518, 1266)))) { + svar0 = "Remember, the Hints tab provides more details about a Task."; + } + } + if (getDisplayMode() >= 2) { + ivar1 = 196; + ivar2 = 183; + ivar3 = 1; + if (getWidgetActualWidth(new WidgetPointer(746,2)) < 997) { + ivar2 = add(ivar2, 40); + } + } else { + ivar1 = 217; + ivar2 = 177; + } + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1056,92)); + setWidgetIsHidden(true, new WidgetPointer(1056,94)); + setWidgetIsHidden(true, new WidgetPointer(1056,125)); + if (((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1753, 1266))) || ((boolean)stringMethod4107(getWidgetText(new WidgetPointer(1056,91)), getOtherCommonData(1754, 1266)))) { + svar0 = "The '?' icon will add an arrow to the screen which points to your destination."; + } + if (getDisplayMode() >= 2) { + ivar1 = 196; + ivar2 = 87; + ivar3 = 1; + if (getWidgetActualWidth(new WidgetPointer(746,2)) < 997) { + ivar2 = add(ivar2, 40); + } + } else { + ivar1 = 208; + ivar2 = 78; + } + } + if (((boolean)bitconfig_9030)) { + svar0 = ""; + } + if (((boolean)ivar3)) { + script_4247(ivar1, ivar2, 1, 16777215, 5631, svar0); + } else { + script_4248(ivar1, ivar2, 1, 16777215, 5631, svar0); + } + return; +} diff --git a/dumps/scripts/4001.cs2 b/dumps/scripts/4001.cs2 new file mode 100644 index 000000000..f80983941 --- /dev/null +++ b/dumps/scripts/4001.cs2 @@ -0,0 +1,5 @@ +void script_4001() { + setWidgetIsHidden(true, new WidgetPointer(1056,122)); + script_4249(1); + return; +} diff --git a/dumps/scripts/4002.cs2 b/dumps/scripts/4002.cs2 new file mode 100644 index 000000000..6fbb28424 --- /dev/null +++ b/dumps/scripts/4002.cs2 @@ -0,0 +1,46 @@ +void script_4002() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + string svar1; + string svar2; + string svar3; + if (getDisplayMode() >= 2) { + if (isParent(new WidgetPointer(746,12), 917)) { + return; + } + } else { + if (isParent(new WidgetPointer(548,19), 917)) { + return; + } + } + svar0 = "Progress: "; + ivar0 = globalint_1424; + svar1 = ""; + ivar1 = globalint_1423; + svar2 = ""; + svar3 = cs2method_3408(105, 115, 3487, bitconfig_8575); + if (((boolean)bitconfig_9030)) { + ivar0 = bitconfig_9028; + ivar1 = getCommonDefinitionSize(3656); + svar3 = "Introductory Tasks"; + } + svar1 = intToStr(ivar0); + svar2 = intToStr(ivar1); + if (bitconfig_8575 == 61) { + svar3 = "Quest Area"; + setWidgetIsHidden(true, new WidgetPointer(1056,111)); + setWidgetIsHidden(true, new WidgetPointer(1056,112)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1056,111)); + setWidgetIsHidden(false, new WidgetPointer(1056,112)); + } + ivar2 = divide(multiply(ivar0, subtract(getWidgetActualWidth(new WidgetPointer(1056,111)), 2)), max(1, ivar1)); + svar0 = concat(svar0, svar1); + setWidgetText(new WidgetPointer(1056,108), svar2); + setWidgetText(new WidgetPointer(1056,106), svar0); + setWidgetText(new WidgetPointer(1056,110), svar3); + setWidgetSize(ivar2, 18, 0, 0, new WidgetPointer(1056,105)); + return; +} diff --git a/dumps/scripts/4003.cs2 b/dumps/scripts/4003.cs2 new file mode 100644 index 000000000..0848c5a89 --- /dev/null +++ b/dumps/scripts/4003.cs2 @@ -0,0 +1,12 @@ +void script_4003(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4318, new WidgetPointer(1056,93)); + setWidgetSprite(4318, new WidgetPointer(1056,168)); + setWidgetSprite(4319, new WidgetPointer(1056,169)); + } else { + setWidgetSprite(4316, new WidgetPointer(1056,93)); + setWidgetSprite(4316, new WidgetPointer(1056,168)); + setWidgetSprite(4317, new WidgetPointer(1056,169)); + } + return; +} diff --git a/dumps/scripts/4004.cs2 b/dumps/scripts/4004.cs2 new file mode 100644 index 000000000..cc7968b34 --- /dev/null +++ b/dumps/scripts/4004.cs2 @@ -0,0 +1,15 @@ +void script_4004(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4324, new WidgetPointer(1056,138)); + setWidgetSprite(4324, new WidgetPointer(1056,139)); + setWidgetSprite(4325, new WidgetPointer(1056,137)); + setWidgetSprite(4309, new WidgetPointer(1056,141)); + } else { + setWidgetSprite(4322, new WidgetPointer(1056,138)); + setWidgetSprite(4322, new WidgetPointer(1056,139)); + setWidgetSprite(4323, new WidgetPointer(1056,137)); + setWidgetSprite(4308, new WidgetPointer(1056,141)); + script_41(69206152); + } + return; +} diff --git a/dumps/scripts/4005.cs2 b/dumps/scripts/4005.cs2 new file mode 100644 index 000000000..e30c911ce --- /dev/null +++ b/dumps/scripts/4005.cs2 @@ -0,0 +1,15 @@ +void script_4005(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4324, new WidgetPointer(1056,0)); + setWidgetSprite(4324, new WidgetPointer(1056,1)); + setWidgetSprite(4325, new WidgetPointer(1056,175)); + setWidgetSprite(4309, new WidgetPointer(1056,177)); + } else { + setWidgetSprite(4322, new WidgetPointer(1056,0)); + setWidgetSprite(4322, new WidgetPointer(1056,1)); + setWidgetSprite(4323, new WidgetPointer(1056,175)); + setWidgetSprite(4308, new WidgetPointer(1056,177)); + script_41(69206152); + } + return; +} diff --git a/dumps/scripts/4006.cs2 b/dumps/scripts/4006.cs2 new file mode 100644 index 000000000..2e380b7ed --- /dev/null +++ b/dumps/scripts/4006.cs2 @@ -0,0 +1,13 @@ +void script_4006(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4324, new WidgetPointer(1056,118)); + setWidgetSprite(4324, new WidgetPointer(1056,119)); + setWidgetSprite(4325, new WidgetPointer(1056,89)); + } else { + setWidgetSprite(4322, new WidgetPointer(1056,118)); + setWidgetSprite(4322, new WidgetPointer(1056,119)); + setWidgetSprite(4323, new WidgetPointer(1056,89)); + script_41(69206152); + } + return; +} diff --git a/dumps/scripts/4007.cs2 b/dumps/scripts/4007.cs2 new file mode 100644 index 000000000..2a2124a33 --- /dev/null +++ b/dumps/scripts/4007.cs2 @@ -0,0 +1,13 @@ +void script_4007(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4324, new WidgetPointer(1056,114)); + setWidgetSprite(4324, new WidgetPointer(1056,115)); + setWidgetSprite(4325, new WidgetPointer(1056,116)); + } else { + setWidgetSprite(4322, new WidgetPointer(1056,114)); + setWidgetSprite(4322, new WidgetPointer(1056,115)); + setWidgetSprite(4323, new WidgetPointer(1056,116)); + script_41(69206152); + } + return; +} diff --git a/dumps/scripts/4008.cs2 b/dumps/scripts/4008.cs2 new file mode 100644 index 000000000..07aba835b --- /dev/null +++ b/dumps/scripts/4008.cs2 @@ -0,0 +1,5 @@ +void script_4008(int arg0,int arg1) { + setScriptCallOnMouseEntered(4009, 0, arg0, new WidgetPointer(arg1), "iiI", new WidgetPointer(arg1)); + setScriptCallOnMouseExit(4009, 1, arg0, new WidgetPointer(arg1), "iiI", new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/4009.cs2 b/dumps/scripts/4009.cs2 new file mode 100644 index 000000000..002bcf94e --- /dev/null +++ b/dumps/scripts/4009.cs2 @@ -0,0 +1,16 @@ +void script_4009(int arg0,int arg1,int arg2) { + if (((boolean)arg1)) { + if (((boolean)arg0)) { + setWidgetSprite(5624, new WidgetPointer(arg2)); + } else { + setWidgetSprite(5623, new WidgetPointer(arg2)); + script_41(69206152); + } + } else if (((boolean)arg0)) { + setWidgetSprite(5622, new WidgetPointer(arg2)); + } else { + setWidgetSprite(5621, new WidgetPointer(arg2)); + script_41(69206152); + } + return; +} diff --git a/dumps/scripts/401.cs2 b/dumps/scripts/401.cs2 new file mode 100644 index 000000000..0acbd222b --- /dev/null +++ b/dumps/scripts/401.cs2 @@ -0,0 +1,44 @@ +void script_401(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + string svar0; + svar0 = globalstring_320; + if ((strLength(globalstring_319) > 0) && ((boolean)standart_config_170)) { + svar0 = globalstring_319; + } + if (setWidgetRegister(new WidgetPointer(arg1), 0) && ((boolean)stringMethod4107(svar0, getWidgetText()))) { + return; + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + ivar3 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar4 = 0; + cs2method2100(0, 0, new WidgetPointer(arg1)); + setWidgetPosition(ivar4, 0, 0, 1, new WidgetPointer(arg1)); + ivar5 = add(multiply(getLineCount(ivar3, 307, svar0), 12), 3); + if (ivar5 > getWidgetActualHeight(new WidgetPointer(arg0))) { + ivar3 = subtract(ivar3, add(getWidgetActualWidth(new WidgetPointer(arg2)), 5)); + setWidgetSize(ivar3, 0, 0, 1, new WidgetPointer(arg1)); + ivar5 = add(multiply(getLineCount(ivar3, 307, svar0), 12), 3); + setWidgetScrollMax(0, ivar5, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + script_31(arg2, arg1, 792, 789, 790, 791, 773, 788); + } else { + ivar5 = getWidgetActualHeight(new WidgetPointer(arg0)); + setWidgetSize(ivar3, 0, 0, 1, new WidgetPointer(arg1)); + setWidgetScrollMax(0, 0, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } + createExtraChild(new WidgetPointer(arg1), 4, 0); + setWidgetSize(0, ivar5, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetFont(307); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetText(svar0); + setWidgetFont(307, new WidgetPointer(200,4)); + return; +} diff --git a/dumps/scripts/4010.cs2 b/dumps/scripts/4010.cs2 new file mode 100644 index 000000000..0ede7f15e --- /dev/null +++ b/dumps/scripts/4010.cs2 @@ -0,0 +1,54 @@ +void script_4010(int arg0) { + switch (arg0) { + case 0: + setWidgetSprite(4316, new WidgetPointer(1056,16)); + setWidgetSprite(4316, new WidgetPointer(1056,18)); + setWidgetSprite(4317, new WidgetPointer(1056,17)); + setWidgetSprite(4316, new WidgetPointer(1056,11)); + setWidgetSprite(4316, new WidgetPointer(1056,13)); + setWidgetSprite(4317, new WidgetPointer(1056,12)); + setWidgetSprite(4316, new WidgetPointer(1056,31)); + setWidgetSprite(4316, new WidgetPointer(1056,33)); + setWidgetSprite(4317, new WidgetPointer(1056,32)); + setWidgetSprite(4316, new WidgetPointer(1056,21)); + setWidgetSprite(4316, new WidgetPointer(1056,23)); + setWidgetSprite(4317, new WidgetPointer(1056,22)); + setWidgetSprite(4316, new WidgetPointer(1056,44)); + setWidgetSprite(4316, new WidgetPointer(1056,46)); + setWidgetSprite(4317, new WidgetPointer(1056,45)); + setWidgetSprite(4316, new WidgetPointer(1056,39)); + setWidgetSprite(4316, new WidgetPointer(1056,41)); + setWidgetSprite(4317, new WidgetPointer(1056,40)); + break; + case 1: + setWidgetSprite(4318, new WidgetPointer(1056,16)); + setWidgetSprite(4318, new WidgetPointer(1056,18)); + setWidgetSprite(4319, new WidgetPointer(1056,17)); + break; + case 2: + setWidgetSprite(4318, new WidgetPointer(1056,11)); + setWidgetSprite(4318, new WidgetPointer(1056,13)); + setWidgetSprite(4319, new WidgetPointer(1056,12)); + break; + case 3: + setWidgetSprite(4318, new WidgetPointer(1056,31)); + setWidgetSprite(4318, new WidgetPointer(1056,33)); + setWidgetSprite(4319, new WidgetPointer(1056,32)); + break; + case 4: + setWidgetSprite(4318, new WidgetPointer(1056,21)); + setWidgetSprite(4318, new WidgetPointer(1056,23)); + setWidgetSprite(4319, new WidgetPointer(1056,22)); + break; + case 5: + setWidgetSprite(4318, new WidgetPointer(1056,44)); + setWidgetSprite(4318, new WidgetPointer(1056,46)); + setWidgetSprite(4319, new WidgetPointer(1056,45)); + break; + case 6: + setWidgetSprite(4318, new WidgetPointer(1056,39)); + setWidgetSprite(4318, new WidgetPointer(1056,41)); + setWidgetSprite(4319, new WidgetPointer(1056,40)); + } + return; +} diff --git a/dumps/scripts/4011.cs2 b/dumps/scripts/4011.cs2 new file mode 100644 index 000000000..83351d093 --- /dev/null +++ b/dumps/scripts/4011.cs2 @@ -0,0 +1,14 @@ +void script_4011() { + if (((boolean)globalint_1421)) { + globalint_1421 = 1; + setWidgetSprite(4086, new WidgetPointer(1056,173)); + setScriptCallOnMouseEntered(4012, 0, 1, "ii", new WidgetPointer(1056,173)); + setScriptCallOnMouseExit(4012, 1, 1, "ii", new WidgetPointer(1056,173)); + } else { + globalint_1421 = 0; + setWidgetSprite(4084, new WidgetPointer(1056,173)); + setScriptCallOnMouseEntered(4012, 0, 0, "ii", new WidgetPointer(1056,173)); + setScriptCallOnMouseExit(4012, 1, 0, "ii", new WidgetPointer(1056,173)); + } + return; +} diff --git a/dumps/scripts/4012.cs2 b/dumps/scripts/4012.cs2 new file mode 100644 index 000000000..3c40a7889 --- /dev/null +++ b/dumps/scripts/4012.cs2 @@ -0,0 +1,14 @@ +void script_4012(int arg0,int arg1) { + if (((boolean)arg1)) { + if (((boolean)arg0)) { + setWidgetSprite(4085, new WidgetPointer(1056,173)); + } else { + setWidgetSprite(4084, new WidgetPointer(1056,173)); + } + } else if (((boolean)arg0)) { + setWidgetSprite(4087, new WidgetPointer(1056,173)); + } else { + setWidgetSprite(4086, new WidgetPointer(1056,173)); + } + return; +} diff --git a/dumps/scripts/4013.cs2 b/dumps/scripts/4013.cs2 new file mode 100644 index 000000000..639002615 --- /dev/null +++ b/dumps/scripts/4013.cs2 @@ -0,0 +1,4 @@ +void script_4013(int arg0,int arg1) { + script_4014(arg0, arg1); + return; +} diff --git a/dumps/scripts/4014.cs2 b/dumps/scripts/4014.cs2 new file mode 100644 index 000000000..6c7a72a45 --- /dev/null +++ b/dumps/scripts/4014.cs2 @@ -0,0 +1,7 @@ +void script_4014(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(917,98), arg0) && isWidgetHidden(new WidgetPointer(917,119))) { + setWidgetSprite(arg1); + } + script_41(60096613); + return; +} diff --git a/dumps/scripts/4015.cs2 b/dumps/scripts/4015.cs2 new file mode 100644 index 000000000..903c961cf --- /dev/null +++ b/dumps/scripts/4015.cs2 @@ -0,0 +1,10 @@ +void script_4015() { + if (isWidgetHidden(new WidgetPointer(917,119))) { + setWidgetIsHidden(false, new WidgetPointer(917,119)); + setWidgetIsHidden(false, new WidgetPointer(917,115)); + } else { + setWidgetIsHidden(true, new WidgetPointer(917,119)); + setWidgetIsHidden(true, new WidgetPointer(917,115)); + } + return; +} diff --git a/dumps/scripts/4016.cs2 b/dumps/scripts/4016.cs2 new file mode 100644 index 000000000..766b3ab17 --- /dev/null +++ b/dumps/scripts/4016.cs2 @@ -0,0 +1,7 @@ +void script_4016() { + script_4017(bitconfig_8582); + script_4028(0, bitconfig_8579); + script_4028(1, bitconfig_8580); + script_4253(); + return; +} diff --git a/dumps/scripts/4017.cs2 b/dumps/scripts/4017.cs2 new file mode 100644 index 000000000..4510c0307 --- /dev/null +++ b/dumps/scripts/4017.cs2 @@ -0,0 +1,33 @@ +void script_4017(int arg0) { + string svar0; + string svar1; + setWidgetText(new WidgetPointer(917,121), cs2method_3408(105, 115, 3487, arg0)); + svar0 = "Click to hide completed Tasks."; + svar1 = "Click to hide Tasks which are not in a set."; + if (((boolean)bitconfig_8579)) { + setScriptCallOnClickContextMenu(3983, 999, 0, 999, "iii", new WidgetPointer(917,106)); + svar0 = "Click to show completed Tasks."; + } else { + setScriptCallOnClickContextMenu(3983, 999, 1, 999, "iii", new WidgetPointer(917,106)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(917,94), new WidgetPointer(917,97), svar0, 45, 150, "IIsii", new WidgetPointer(917,106)); + if (((boolean)bitconfig_8580)) { + setScriptCallOnClickContextMenu(3983, 999, 999, 0, "iii", new WidgetPointer(917,114)); + svar1 = "Click to show Tasks which are not in a set."; + } else { + setScriptCallOnClickContextMenu(3983, 999, 999, 1, "iii", new WidgetPointer(917,114)); + } + setScriptCallOnMouseOver(38, new WidgetPointer(917,94), new WidgetPointer(917,97), svar1, 45, 150, "IIsii", new WidgetPointer(917,114)); + if (((boolean)globalint_1429)) { + setWidgetSprite(4086, new WidgetPointer(917,142)); + setScriptCallOnMouseEntered(4033, 0, 1, "ii", new WidgetPointer(917,142)); + setScriptCallOnMouseExit(4033, 1, 1, "ii", new WidgetPointer(917,142)); + setWidgetContextMenuOption(1, new WidgetPointer(917,142), "Turn-on"); + } else { + setWidgetSprite(4084, new WidgetPointer(917,142)); + setScriptCallOnMouseEntered(4033, 0, 0, "ii", new WidgetPointer(917,142)); + setScriptCallOnMouseExit(4033, 1, 0, "ii", new WidgetPointer(917,142)); + setWidgetContextMenuOption(1, new WidgetPointer(917,142), "Turn-off"); + } + return; +} diff --git a/dumps/scripts/4018.cs2 b/dumps/scripts/4018.cs2 new file mode 100644 index 000000000..d47eede1b --- /dev/null +++ b/dumps/scripts/4018.cs2 @@ -0,0 +1,4 @@ +void script_4018(int arg0) { + script_4019(arg0); + return; +} diff --git a/dumps/scripts/4019.cs2 b/dumps/scripts/4019.cs2 new file mode 100644 index 000000000..3c73f3f6c --- /dev/null +++ b/dumps/scripts/4019.cs2 @@ -0,0 +1,62 @@ +void script_4019(int arg0) { + switch (arg0) { + case 0: + setWidgetIsHidden(false, new WidgetPointer(917,83)); + setWidgetIsHidden(true, new WidgetPointer(917,84)); + setWidgetIsHidden(true, new WidgetPointer(917,82)); + setWidgetIsHidden(true, new WidgetPointer(917,86)); + setWidgetSprite(4320, new WidgetPointer(917,26)); + setWidgetSprite(4320, new WidgetPointer(917,28)); + setWidgetSprite(4321, new WidgetPointer(917,27)); + break; + case 1: + setWidgetIsHidden(true, new WidgetPointer(917,83)); + setWidgetIsHidden(false, new WidgetPointer(917,84)); + setWidgetIsHidden(true, new WidgetPointer(917,82)); + setWidgetIsHidden(true, new WidgetPointer(917,86)); + setWidgetSprite(4320, new WidgetPointer(917,22)); + setWidgetSprite(4320, new WidgetPointer(917,24)); + setWidgetSprite(4321, new WidgetPointer(917,23)); + setWidgetScrollMax(0, max(globalint_1419, getWidgetActualHeight(new WidgetPointer(917,85))), new WidgetPointer(917,85)); + script_31(60096655, 60096597, 4343, 4340, 4341, 4342, 4337, 4336); + if (globalint_1419 > getWidgetActualHeight(new WidgetPointer(917,85))) { + setWidgetIsHidden(false, new WidgetPointer(917,143)); + } else { + setWidgetIsHidden(true, new WidgetPointer(917,143)); + } + break; + case 2: + setWidgetIsHidden(true, new WidgetPointer(917,83)); + setWidgetIsHidden(true, new WidgetPointer(917,84)); + setWidgetIsHidden(false, new WidgetPointer(917,82)); + setWidgetIsHidden(true, new WidgetPointer(917,86)); + setWidgetSprite(4320, new WidgetPointer(917,18)); + setWidgetSprite(4320, new WidgetPointer(917,20)); + setWidgetSprite(4321, new WidgetPointer(917,19)); + setWidgetScrollMax(0, max(globalint_1418, getWidgetActualHeight(new WidgetPointer(917,61))), new WidgetPointer(917,61)); + script_31(60096574, 60096573, 4343, 4340, 4341, 4342, 4337, 4336); + if (globalint_1418 > getWidgetActualHeight(new WidgetPointer(917,61))) { + setWidgetIsHidden(false, new WidgetPointer(917,62)); + } else { + setWidgetIsHidden(true, new WidgetPointer(917,62)); + } + break; + case 3: + setWidgetIsHidden(true, new WidgetPointer(917,83)); + setWidgetIsHidden(true, new WidgetPointer(917,84)); + setWidgetIsHidden(true, new WidgetPointer(917,82)); + setWidgetIsHidden(false, new WidgetPointer(917,86)); + setWidgetSprite(4320, new WidgetPointer(917,14)); + setWidgetSprite(4320, new WidgetPointer(917,16)); + setWidgetSprite(4321, new WidgetPointer(917,15)); + setWidgetScrollMax(0, max(globalint_1420, getWidgetActualHeight(new WidgetPointer(917,88))), new WidgetPointer(917,88)); + script_31(60096601, 60096600, 4343, 4340, 4341, 4342, 4337, 4336); + if (globalint_1420 > getWidgetActualHeight(new WidgetPointer(917,88))) { + setWidgetIsHidden(false, new WidgetPointer(917,89)); + } else { + setWidgetIsHidden(true, new WidgetPointer(917,89)); + } + } + script_4026(0); + return; +} diff --git a/dumps/scripts/402.cs2 b/dumps/scripts/402.cs2 new file mode 100644 index 000000000..cbe833975 --- /dev/null +++ b/dumps/scripts/402.cs2 @@ -0,0 +1,5 @@ +void script_402() { + cs2method2103(0, new WidgetPointer(1010,10)); + globalint_1391 = 1; + return; +} diff --git a/dumps/scripts/4020.cs2 b/dumps/scripts/4020.cs2 new file mode 100644 index 000000000..5a8d89af3 --- /dev/null +++ b/dumps/scripts/4020.cs2 @@ -0,0 +1,4 @@ +void script_4020() { + setWidgetIsHidden(true, new WidgetPointer(917,92)); + return; +} diff --git a/dumps/scripts/4021.cs2 b/dumps/scripts/4021.cs2 new file mode 100644 index 000000000..3d92de255 --- /dev/null +++ b/dumps/scripts/4021.cs2 @@ -0,0 +1,4 @@ +void script_4021(int arg0) { + script_4022(arg0); + return; +} diff --git a/dumps/scripts/4022.cs2 b/dumps/scripts/4022.cs2 new file mode 100644 index 000000000..054b14aa1 --- /dev/null +++ b/dumps/scripts/4022.cs2 @@ -0,0 +1,23 @@ +void script_4022(int arg0) { + int ivar1; + int ivar2; + ivar1 = 0; + ivar2 = -1; + while (ivar1 <= getCommonDefinitionSize(3489)) { + ivar2 = ((int)cs2method_3408(105, 73, 3489, ivar1)); + if (ivar2 != -1) { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(ivar2)); + } + ivar1 = add(ivar1, 1); + } + ivar2 = ((int)cs2method_3408(105, 73, 3489, 62)); + if (ivar2 != -1) { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(ivar2)); + } + if ((arg0 > 60) && (arg0 != 62)) { + return; + } + ivar2 = ((int)cs2method_3408(105, 73, 3489, arg0)); + setWidgetRGB(new Color(146, 125, 89), new WidgetPointer(ivar2)); + return; +} diff --git a/dumps/scripts/4023.cs2 b/dumps/scripts/4023.cs2 new file mode 100644 index 000000000..9b7ed5a20 --- /dev/null +++ b/dumps/scripts/4023.cs2 @@ -0,0 +1,15 @@ +void script_4023(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4324, new WidgetPointer(917,43)); + setWidgetSprite(4324, new WidgetPointer(917,45)); + setWidgetSprite(4325, new WidgetPointer(917,44)); + setWidgetSprite(4309, new WidgetPointer(917,59)); + } else { + script_41(60096605); + setWidgetSprite(4322, new WidgetPointer(917,43)); + setWidgetSprite(4322, new WidgetPointer(917,45)); + setWidgetSprite(4323, new WidgetPointer(917,44)); + setWidgetSprite(4308, new WidgetPointer(917,59)); + } + return; +} diff --git a/dumps/scripts/4024.cs2 b/dumps/scripts/4024.cs2 new file mode 100644 index 000000000..8852c3a36 --- /dev/null +++ b/dumps/scripts/4024.cs2 @@ -0,0 +1,13 @@ +void script_4024(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4324, new WidgetPointer(917,90)); + setWidgetSprite(4324, new WidgetPointer(917,144)); + setWidgetSprite(4325, new WidgetPointer(917,145)); + } else { + script_41(60096605); + setWidgetSprite(4322, new WidgetPointer(917,90)); + setWidgetSprite(4322, new WidgetPointer(917,144)); + setWidgetSprite(4323, new WidgetPointer(917,145)); + } + return; +} diff --git a/dumps/scripts/4025.cs2 b/dumps/scripts/4025.cs2 new file mode 100644 index 000000000..f14447564 --- /dev/null +++ b/dumps/scripts/4025.cs2 @@ -0,0 +1,4 @@ +void script_4025(int arg0) { + script_4026(arg0); + return; +} diff --git a/dumps/scripts/4026.cs2 b/dumps/scripts/4026.cs2 new file mode 100644 index 000000000..0a9110d2c --- /dev/null +++ b/dumps/scripts/4026.cs2 @@ -0,0 +1,58 @@ +void script_4026(int arg0) { + switch (arg0) { + case 0: + if (isWidgetHidden(new WidgetPointer(917,83))) { + setWidgetSprite(4316, new WidgetPointer(917,26)); + setWidgetSprite(4316, new WidgetPointer(917,28)); + setWidgetSprite(4317, new WidgetPointer(917,27)); + } + if (isWidgetHidden(new WidgetPointer(917,84))) { + setWidgetSprite(4316, new WidgetPointer(917,22)); + setWidgetSprite(4316, new WidgetPointer(917,24)); + setWidgetSprite(4317, new WidgetPointer(917,23)); + } + if (isWidgetHidden(new WidgetPointer(917,82))) { + setWidgetSprite(4316, new WidgetPointer(917,18)); + setWidgetSprite(4316, new WidgetPointer(917,20)); + setWidgetSprite(4317, new WidgetPointer(917,19)); + } + if (isWidgetHidden(new WidgetPointer(917,86))) { + setWidgetSprite(4316, new WidgetPointer(917,14)); + setWidgetSprite(4316, new WidgetPointer(917,16)); + setWidgetSprite(4317, new WidgetPointer(917,15)); + } + break; + case 1: + if (isWidgetHidden(new WidgetPointer(917,83))) { + return; + } + setWidgetSprite(4318, new WidgetPointer(917,26)); + setWidgetSprite(4318, new WidgetPointer(917,28)); + setWidgetSprite(4319, new WidgetPointer(917,27)); + break; + case 2: + if (isWidgetHidden(new WidgetPointer(917,84))) { + return; + } + setWidgetSprite(4318, new WidgetPointer(917,22)); + setWidgetSprite(4318, new WidgetPointer(917,24)); + setWidgetSprite(4319, new WidgetPointer(917,23)); + break; + case 3: + if (isWidgetHidden(new WidgetPointer(917,82))) { + return; + } + setWidgetSprite(4318, new WidgetPointer(917,18)); + setWidgetSprite(4318, new WidgetPointer(917,20)); + setWidgetSprite(4319, new WidgetPointer(917,19)); + break; + case 4: + if (isWidgetHidden(new WidgetPointer(917,86))) { + return; + } + setWidgetSprite(4318, new WidgetPointer(917,14)); + setWidgetSprite(4318, new WidgetPointer(917,16)); + setWidgetSprite(4319, new WidgetPointer(917,15)); + } + return; +} diff --git a/dumps/scripts/4027.cs2 b/dumps/scripts/4027.cs2 new file mode 100644 index 000000000..632cc452b --- /dev/null +++ b/dumps/scripts/4027.cs2 @@ -0,0 +1,4 @@ +void script_4027(int arg0,int arg1) { + script_4028(arg0, arg1); + return; +} diff --git a/dumps/scripts/4028.cs2 b/dumps/scripts/4028.cs2 new file mode 100644 index 000000000..63cd951c3 --- /dev/null +++ b/dumps/scripts/4028.cs2 @@ -0,0 +1,22 @@ +void script_4028(int arg0,int arg1) { + if (((boolean)arg0)) { + if (((boolean)arg1)) { + setWidgetSprite(4302, new WidgetPointer(917,106)); + setScriptCallOnMouseEntered(4029, 0, "i", new WidgetPointer(917,106)); + setScriptCallOnMouseExit(4029, 1, "i", new WidgetPointer(917,106)); + } else { + setWidgetSprite(4300, new WidgetPointer(917,106)); + setScriptCallOnMouseEntered(4030, 0, "i", new WidgetPointer(917,106)); + setScriptCallOnMouseExit(4030, 1, "i", new WidgetPointer(917,106)); + } + } else if (((boolean)arg1)) { + setWidgetSprite(4299, new WidgetPointer(917,114)); + setScriptCallOnMouseEntered(4031, 0, "i", new WidgetPointer(917,114)); + setScriptCallOnMouseExit(4031, 1, "i", new WidgetPointer(917,114)); + } else { + setWidgetSprite(4297, new WidgetPointer(917,114)); + setScriptCallOnMouseEntered(4032, 0, "i", new WidgetPointer(917,114)); + setScriptCallOnMouseExit(4032, 1, "i", new WidgetPointer(917,114)); + } + return; +} diff --git a/dumps/scripts/4029.cs2 b/dumps/scripts/4029.cs2 new file mode 100644 index 000000000..8c9eeba16 --- /dev/null +++ b/dumps/scripts/4029.cs2 @@ -0,0 +1,9 @@ +void script_4029(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4304, new WidgetPointer(917,106)); + } else { + setWidgetSprite(4302, new WidgetPointer(917,106)); + script_41(60096609); + } + return; +} diff --git a/dumps/scripts/403.cs2 b/dumps/scripts/403.cs2 new file mode 100644 index 000000000..6f8c4b7cc --- /dev/null +++ b/dumps/scripts/403.cs2 @@ -0,0 +1,4 @@ +void script_403() { + script_304(49466746); + return; +} diff --git a/dumps/scripts/4030.cs2 b/dumps/scripts/4030.cs2 new file mode 100644 index 000000000..76ca2559d --- /dev/null +++ b/dumps/scripts/4030.cs2 @@ -0,0 +1,9 @@ +void script_4030(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4301, new WidgetPointer(917,106)); + } else { + setWidgetSprite(4300, new WidgetPointer(917,106)); + script_41(60096609); + } + return; +} diff --git a/dumps/scripts/4031.cs2 b/dumps/scripts/4031.cs2 new file mode 100644 index 000000000..fea30777d --- /dev/null +++ b/dumps/scripts/4031.cs2 @@ -0,0 +1,9 @@ +void script_4031(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4303, new WidgetPointer(917,114)); + } else { + setWidgetSprite(4299, new WidgetPointer(917,114)); + script_41(60096609); + } + return; +} diff --git a/dumps/scripts/4032.cs2 b/dumps/scripts/4032.cs2 new file mode 100644 index 000000000..2bb11cfc9 --- /dev/null +++ b/dumps/scripts/4032.cs2 @@ -0,0 +1,9 @@ +void script_4032(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4298, new WidgetPointer(917,114)); + } else { + setWidgetSprite(4297, new WidgetPointer(917,114)); + script_41(60096609); + } + return; +} diff --git a/dumps/scripts/4033.cs2 b/dumps/scripts/4033.cs2 new file mode 100644 index 000000000..c606e958b --- /dev/null +++ b/dumps/scripts/4033.cs2 @@ -0,0 +1,19 @@ +void script_4033(int arg0,int arg1) { + int ivar2; + ivar2 = -1; + if (((boolean)arg1)) { + if (((boolean)arg0)) { + ivar2 = 4087; + } else { + ivar2 = 4086; + script_41(60096664); + } + } else if (((boolean)arg0)) { + ivar2 = 4085; + } else { + ivar2 = 4084; + script_41(60096664); + } + setWidgetSprite(ivar2, new WidgetPointer(917,142)); + return; +} diff --git a/dumps/scripts/4034.cs2 b/dumps/scripts/4034.cs2 new file mode 100644 index 000000000..0ffcfa656 --- /dev/null +++ b/dumps/scripts/4034.cs2 @@ -0,0 +1,16 @@ +void script_4034() { + if (((boolean)globalint_1429)) { + globalint_1429 = 1; + setWidgetSprite(4086, new WidgetPointer(917,142)); + setScriptCallOnMouseEntered(4033, 0, 1, "ii", new WidgetPointer(917,142)); + setScriptCallOnMouseExit(4033, 1, 1, "ii", new WidgetPointer(917,142)); + setWidgetContextMenuOption(1, new WidgetPointer(917,142), "Turn-on"); + } else { + globalint_1429 = 0; + setWidgetSprite(4084, new WidgetPointer(917,142)); + setScriptCallOnMouseEntered(4033, 0, 0, "ii", new WidgetPointer(917,142)); + setScriptCallOnMouseExit(4033, 1, 0, "ii", new WidgetPointer(917,142)); + setWidgetContextMenuOption(1, new WidgetPointer(917,142), "Turn-off"); + } + return; +} diff --git a/dumps/scripts/4035.cs2 b/dumps/scripts/4035.cs2 new file mode 100644 index 000000000..3a2831984 --- /dev/null +++ b/dumps/scripts/4035.cs2 @@ -0,0 +1,59 @@ +int script_4035() { + int ivar0; + ivar0 = 88; + if (bitconfig_5387 == 250) { + ivar0 = add(ivar0, 5); + } + if (bitconfig_2561 >= 3) { + ivar0 = add(ivar0, 5); + } + if (standart_config_131 >= 9) { + ivar0 = add(ivar0, 5); + } + if (bitconfig_358 == 15) { + ivar0 = add(ivar0, 10); + } + if (bitconfig_6001 >= 45) { + ivar0 = add(ivar0, 10); + } + if (standart_config_150 >= 160) { + ivar0 = add(ivar0, 5); + } + if (standart_config_223 >= 9) { + ivar0 = add(ivar0, 5); + } + if (bitconfig_1990 >= 430) { + ivar0 = add(ivar0, 5); + } + if (bitconfig_1383 >= 4) { + ivar0 = add(ivar0, 5); + } + if (bitconfig_5075 == 20) { + ivar0 = add(ivar0, 5); + } + if (standart_config_14 >= 7) { + ivar0 = add(ivar0, 5); + } + if (standart_config_112 >= 7) { + ivar0 = add(ivar0, 5); + } + if (standart_config_302 >= 61) { + ivar0 = add(ivar0, 5); + } + if (standart_config_63 >= 6) { + ivar0 = add(ivar0, 5); + } + if ((standart_config_145 >= 7) || (standart_config_146 >= 4)) { + ivar0 = add(ivar0, 5); + } + if (bitconfig_1028 >= 70) { + ivar0 = add(ivar0, 5); + } + if (standart_config_26 >= 80) { + ivar0 = add(ivar0, 5); + } + if (bitconfig_3523 >= 150) { + ivar0 = add(ivar0, 5); + } + return ivar0; +} diff --git a/dumps/scripts/4036.cs2 b/dumps/scripts/4036.cs2 new file mode 100644 index 000000000..4c2cd5294 --- /dev/null +++ b/dumps/scripts/4036.cs2 @@ -0,0 +1,81 @@ +int script_4036(int arg0) { + int ivar1; + ivar1 = 0; + switch (arg0) { + case 1: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 2: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 3: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 4: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 5: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 6: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 7: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 8: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 9: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 10: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 11: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 12: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 13: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 14: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 15: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 16: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 17: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 18: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 19: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 20: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 21: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 22: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 23: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 24: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + break; + case 25: + ivar1 = ((int)isBitFlagged(standart_config_1966, arg0)); + } + return ivar1; +} diff --git a/dumps/scripts/4037.cs2 b/dumps/scripts/4037.cs2 new file mode 100644 index 000000000..2da78d7c2 --- /dev/null +++ b/dumps/scripts/4037.cs2 @@ -0,0 +1,237 @@ +cs2func_script_4037_struct(3,0,0) script_4037(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + switch (arg0) { + case 1: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 2: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 3: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 4: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 5: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 6: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 7: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 8: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 9: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 10: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 11: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 12: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 13: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 14: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 15: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 16: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 17: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 18: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 19: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 20: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 21: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 22: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 23: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 24: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + break; + case 25: + ivar3 = ((int)isBitFlagged(standart_config_1968, arg0)); + } + switch (arg0) { + case 1: + ivar1 = standart_config_1969; + break; + case 2: + ivar1 = standart_config_1970; + break; + case 3: + ivar1 = standart_config_1971; + break; + case 4: + ivar1 = standart_config_1972; + break; + case 5: + ivar1 = standart_config_1973; + break; + case 6: + ivar1 = standart_config_1974; + break; + case 7: + ivar1 = standart_config_1975; + break; + case 8: + ivar1 = standart_config_1976; + break; + case 9: + ivar1 = standart_config_1977; + break; + case 10: + ivar1 = standart_config_1978; + break; + case 11: + ivar1 = standart_config_1979; + break; + case 12: + ivar1 = standart_config_1980; + break; + case 13: + ivar1 = standart_config_1981; + break; + case 14: + ivar1 = standart_config_1982; + break; + case 15: + ivar1 = standart_config_1983; + break; + case 16: + ivar1 = standart_config_1984; + break; + case 17: + ivar1 = standart_config_1985; + break; + case 18: + ivar1 = standart_config_1986; + break; + case 19: + ivar1 = standart_config_1987; + break; + case 20: + ivar1 = standart_config_1988; + break; + case 21: + ivar1 = standart_config_1989; + break; + case 22: + ivar1 = standart_config_1990; + break; + case 23: + ivar1 = standart_config_1991; + break; + case 24: + ivar1 = standart_config_1992; + break; + case 25: + ivar1 = standart_config_1993; + } + switch (arg0) { + case 1: + ivar2 = standart_config_1994; + break; + case 2: + ivar2 = standart_config_1995; + break; + case 3: + ivar2 = standart_config_1996; + break; + case 4: + ivar2 = standart_config_1997; + break; + case 5: + ivar2 = standart_config_1998; + break; + case 6: + ivar2 = standart_config_1999; + break; + case 7: + ivar2 = standart_config_2000; + break; + case 8: + ivar2 = standart_config_2001; + break; + case 9: + ivar2 = standart_config_2002; + break; + case 10: + ivar2 = standart_config_2003; + break; + case 11: + ivar2 = standart_config_2004; + break; + case 12: + ivar2 = standart_config_2005; + break; + case 13: + ivar2 = standart_config_2006; + break; + case 14: + ivar2 = standart_config_2007; + break; + case 15: + ivar2 = standart_config_2008; + break; + case 16: + ivar2 = standart_config_2009; + break; + case 17: + ivar2 = standart_config_2010; + break; + case 18: + ivar2 = standart_config_2011; + break; + case 19: + ivar2 = standart_config_2012; + break; + case 20: + ivar2 = standart_config_2013; + break; + case 21: + ivar2 = standart_config_2014; + break; + case 22: + ivar2 = standart_config_2015; + break; + case 23: + ivar2 = standart_config_2016; + break; + case 24: + ivar2 = standart_config_2017; + break; + case 25: + ivar2 = standart_config_2018; + } + return newstruct cs2func_script_4037_struct(ivar3, ivar1, ivar2); +} diff --git a/dumps/scripts/4038.cs2 b/dumps/scripts/4038.cs2 new file mode 100644 index 000000000..0b2048146 --- /dev/null +++ b/dumps/scripts/4038.cs2 @@ -0,0 +1,37 @@ +void script_4038() { + int ivar0; + ivar0 = 0; + if (globalint_1407 < 9) { + switch (getAffid()) { + case 373: + case 254: + case 289: + case 290: + case 291: + case 257: + case 292: + case 293: + case 294: + case 295: + case 296: + case 13: + ivar0 = 0; + break; + default: + ivar0 = 1; + } + if (((boolean)ivar0)) { + cs2method5421(0, "redirect.ws?mod=create&ssl=true&dest=herotopia.ws#herotopia_info"); + return; + } + } + globalint_174 = 17; + setWidgetIsHidden(true, new WidgetPointer(673,57)); + setWidgetIsHidden(true, new WidgetPointer(673,56)); + setWidgetIsHidden(false, new WidgetPointer(673,58)); + setWidgetSprite(4129, new WidgetPointer(673,17)); + setWidgetSprite(4129, new WidgetPointer(673,14)); + setWidgetSprite(4129, new WidgetPointer(673,16)); + setWidgetSprite(4129, new WidgetPointer(673,15)); + return; +} diff --git a/dumps/scripts/4039.cs2 b/dumps/scripts/4039.cs2 new file mode 100644 index 000000000..be62b9e73 --- /dev/null +++ b/dumps/scripts/4039.cs2 @@ -0,0 +1,14 @@ +void script_4039(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(190,18), arg0)) { + if (((boolean)arg1)) { + setWidgetRGB(new Color(0, 255, 255)); + } else if (script_2193(arg0) == 2) { + setWidgetRGB(new Color(0, 255, 0)); + } else if (((boolean)script_2193(arg0))) { + setWidgetRGB(new Color(255, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + } + return; +} diff --git a/dumps/scripts/404.cs2 b/dumps/scripts/404.cs2 new file mode 100644 index 000000000..75975a984 --- /dev/null +++ b/dumps/scripts/404.cs2 @@ -0,0 +1,4 @@ +void script_404(int arg0) { + setWidgetText(new WidgetPointer(arg0), "Conquest Ranking: " + intToStr(standart_config_1875)); + return; +} diff --git a/dumps/scripts/4040.cs2 b/dumps/scripts/4040.cs2 new file mode 100644 index 000000000..bf29e4ec5 --- /dev/null +++ b/dumps/scripts/4040.cs2 @@ -0,0 +1,4 @@ +void script_4040() { + script_4041(); + return; +} diff --git a/dumps/scripts/4041.cs2 b/dumps/scripts/4041.cs2 new file mode 100644 index 000000000..bf20894aa --- /dev/null +++ b/dumps/scripts/4041.cs2 @@ -0,0 +1,13 @@ +void script_4041() { + int ivar0; + ivar0 = 0; + if (getDisplayMode() < 2) { + setWidgetSize(0, 0, 1, 1, new WidgetPointer(906,256)); + } else { + setWidgetSize(956, 503, 0, 0, new WidgetPointer(906,256)); + } + if ((cs2method6139() == 2) && (getDisplayMode() != 1)) { + setWidgetSize(800, 503, 0, 0, new WidgetPointer(906,256)); + } + return; +} diff --git a/dumps/scripts/4042.cs2 b/dumps/scripts/4042.cs2 new file mode 100644 index 000000000..49e88ac1b --- /dev/null +++ b/dumps/scripts/4042.cs2 @@ -0,0 +1,83 @@ +void script_4042() { + switch (bitconfig_8648) { + case 1: + setWidgetPosition(-130, 0, 1, 0, cs2method_3408(105, 73, 755, 1)); + break; + case 2: + setWidgetPosition(-130, 0, 1, 0, cs2method_3408(105, 73, 755, 2)); + break; + case 3: + setWidgetPosition(-130, 0, 1, 0, cs2method_3408(105, 73, 755, 3)); + break; + case 4: + setWidgetPosition(-130, 0, 1, 0, cs2method_3408(105, 73, 755, 4)); + break; + case 5: + setWidgetPosition(-130, 0, 1, 0, cs2method_3408(105, 73, 755, 5)); + } + switch (bitconfig_8649) { + case 1: + setWidgetPosition(-65, 0, 1, 0, cs2method_3408(105, 73, 755, 1)); + break; + case 2: + setWidgetPosition(-65, 0, 1, 0, cs2method_3408(105, 73, 755, 2)); + break; + case 3: + setWidgetPosition(-65, 0, 1, 0, cs2method_3408(105, 73, 755, 3)); + break; + case 4: + setWidgetPosition(-65, 0, 1, 0, cs2method_3408(105, 73, 755, 4)); + break; + case 5: + setWidgetPosition(-65, 0, 1, 0, cs2method_3408(105, 73, 755, 5)); + } + switch (bitconfig_8650) { + case 1: + setWidgetPosition(0, 0, 1, 0, cs2method_3408(105, 73, 755, 1)); + break; + case 2: + setWidgetPosition(0, 0, 1, 0, cs2method_3408(105, 73, 755, 2)); + break; + case 3: + setWidgetPosition(0, 0, 1, 0, cs2method_3408(105, 73, 755, 3)); + break; + case 4: + setWidgetPosition(0, 0, 1, 0, cs2method_3408(105, 73, 755, 4)); + break; + case 5: + setWidgetPosition(0, 0, 1, 0, cs2method_3408(105, 73, 755, 5)); + } + switch (bitconfig_8651) { + case 1: + setWidgetPosition(65, 0, 1, 0, cs2method_3408(105, 73, 755, 1)); + break; + case 2: + setWidgetPosition(65, 0, 1, 0, cs2method_3408(105, 73, 755, 2)); + break; + case 3: + setWidgetPosition(65, 0, 1, 0, cs2method_3408(105, 73, 755, 3)); + break; + case 4: + setWidgetPosition(65, 0, 1, 0, cs2method_3408(105, 73, 755, 4)); + break; + case 5: + setWidgetPosition(65, 0, 1, 0, cs2method_3408(105, 73, 755, 5)); + } + switch (bitconfig_8652) { + case 1: + setWidgetPosition(130, 0, 1, 0, cs2method_3408(105, 73, 755, 1)); + break; + case 2: + setWidgetPosition(130, 0, 1, 0, cs2method_3408(105, 73, 755, 2)); + break; + case 3: + setWidgetPosition(130, 0, 1, 0, cs2method_3408(105, 73, 755, 3)); + break; + case 4: + setWidgetPosition(130, 0, 1, 0, cs2method_3408(105, 73, 755, 4)); + break; + case 5: + setWidgetPosition(130, 0, 1, 0, cs2method_3408(105, 73, 755, 5)); + } + return; +} diff --git a/dumps/scripts/4043.cs2 b/dumps/scripts/4043.cs2 new file mode 100644 index 000000000..9d0e16259 --- /dev/null +++ b/dumps/scripts/4043.cs2 @@ -0,0 +1,28 @@ +void script_4043() { + if (((boolean)bitconfig_8655)) { + setWidgetIsHidden(true, new WidgetPointer(1057,35)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1057,35)); + } + if (((boolean)bitconfig_8656)) { + setWidgetIsHidden(true, new WidgetPointer(1057,36)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1057,36)); + } + if (((boolean)bitconfig_8657)) { + setWidgetIsHidden(true, new WidgetPointer(1057,37)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1057,37)); + } + if (((boolean)bitconfig_8658)) { + setWidgetIsHidden(true, new WidgetPointer(1057,38)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1057,38)); + } + if (((boolean)bitconfig_8659)) { + setWidgetIsHidden(true, new WidgetPointer(1057,39)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1057,39)); + } + return; +} diff --git a/dumps/scripts/4044.cs2 b/dumps/scripts/4044.cs2 new file mode 100644 index 000000000..f0e08c5ba --- /dev/null +++ b/dumps/scripts/4044.cs2 @@ -0,0 +1,4 @@ +void script_4044(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_8662)); + return; +} diff --git a/dumps/scripts/4045.cs2 b/dumps/scripts/4045.cs2 new file mode 100644 index 000000000..201f15f30 --- /dev/null +++ b/dumps/scripts/4045.cs2 @@ -0,0 +1,4 @@ +void script_4045(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_8663)); + return; +} diff --git a/dumps/scripts/4046.cs2 b/dumps/scripts/4046.cs2 new file mode 100644 index 000000000..c5ef41b9b --- /dev/null +++ b/dumps/scripts/4046.cs2 @@ -0,0 +1,4 @@ +void script_4046(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_8664)); + return; +} diff --git a/dumps/scripts/4047.cs2 b/dumps/scripts/4047.cs2 new file mode 100644 index 000000000..2b215951c --- /dev/null +++ b/dumps/scripts/4047.cs2 @@ -0,0 +1,4 @@ +void script_4047(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_8665)); + return; +} diff --git a/dumps/scripts/4048.cs2 b/dumps/scripts/4048.cs2 new file mode 100644 index 000000000..96dddede5 --- /dev/null +++ b/dumps/scripts/4048.cs2 @@ -0,0 +1,4 @@ +void script_4048(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_8666)); + return; +} diff --git a/dumps/scripts/4049.cs2 b/dumps/scripts/4049.cs2 new file mode 100644 index 000000000..ead50c9e8 --- /dev/null +++ b/dumps/scripts/4049.cs2 @@ -0,0 +1,8 @@ +void script_4049() { + script_4051(69271567, 0); + script_4051(69271576, 0); + script_4051(69271573, 0); + script_4051(69271564, 0); + script_4051(69271570, 0); + return; +} diff --git a/dumps/scripts/405.cs2 b/dumps/scripts/405.cs2 new file mode 100644 index 000000000..99a25f678 --- /dev/null +++ b/dumps/scripts/405.cs2 @@ -0,0 +1,6 @@ +void script_405(int arg0) { + cs2method2103(255, new WidgetPointer(arg0)); + setScriptCallOnGameloop(406, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), "Conquest Ranking: " + intToStr(standart_config_1875)); + return; +} diff --git a/dumps/scripts/4050.cs2 b/dumps/scripts/4050.cs2 new file mode 100644 index 000000000..1c5525e4e --- /dev/null +++ b/dumps/scripts/4050.cs2 @@ -0,0 +1,7 @@ +void script_4050(int arg0,int arg1) { + if (((boolean)arg1)) { + playSoundEffect(10223, 1, 0); + } + script_4051(arg0, arg1); + return; +} diff --git a/dumps/scripts/4051.cs2 b/dumps/scripts/4051.cs2 new file mode 100644 index 000000000..bd531b23e --- /dev/null +++ b/dumps/scripts/4051.cs2 @@ -0,0 +1,13 @@ +void script_4051(int arg0,int arg1) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + cs2method2103(0, new WidgetPointer(arg0)); + if (((boolean)arg1)) { + setWidgetSprite(489, new WidgetPointer(arg0)); + setWidgetPosition(0, 22, 2, 0, new WidgetPointer(arg0)); + } else { + setWidgetSprite(534, new WidgetPointer(arg0)); + setWidgetPosition(0, subtract(1, getWidgetActualHeight(new WidgetPointer(arg0))), 2, 0, new WidgetPointer(arg0)); + } + setScriptCallOnGameloop(4052, new WidgetPointer(arg0), arg1, "Ii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4052.cs2 b/dumps/scripts/4052.cs2 new file mode 100644 index 000000000..fdff8118d --- /dev/null +++ b/dumps/scripts/4052.cs2 @@ -0,0 +1,22 @@ +void script_4052(int arg0,int arg1) { + if (((boolean)arg1)) { + if (getWidgetActualY(new WidgetPointer(arg0)) < subtract(1, getWidgetActualHeight(new WidgetPointer(arg0)))) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else { + setWidgetPosition(0, subtract(getWidgetActualY(new WidgetPointer(arg0)), 1), 2, 0, new WidgetPointer(arg0)); + if (getWidgetShadeColor(new WidgetPointer(arg0)) < 245) { + cs2method2103(add(getWidgetShadeColor(new WidgetPointer(arg0)), 10), new WidgetPointer(arg0)); + } + } + } else if (getWidgetActualY(new WidgetPointer(arg0)) > 30) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else { + setWidgetPosition(0, add(getWidgetActualY(new WidgetPointer(arg0)), 1), 2, 0, new WidgetPointer(arg0)); + if (getWidgetShadeColor(new WidgetPointer(arg0)) < 245) { + cs2method2103(add(getWidgetShadeColor(new WidgetPointer(arg0)), 10), new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/4053.cs2 b/dumps/scripts/4053.cs2 new file mode 100644 index 000000000..e7d670871 --- /dev/null +++ b/dumps/scripts/4053.cs2 @@ -0,0 +1,22 @@ +void script_4053() { + switch (bitconfig_8661) { + case 0: + setWidgetText(new WidgetPointer(1057,26), "Using multiple token types"); + break; + case 1: + setWidgetText(new WidgetPointer(1057,26), "Using attack tokens"); + break; + case 2: + setWidgetText(new WidgetPointer(1057,26), "Using defence tokens"); + break; + case 3: + setWidgetText(new WidgetPointer(1057,26), "Using strength tokens"); + break; + case 4: + setWidgetText(new WidgetPointer(1057,26), "Using combat tokens"); + break; + case 5: + setWidgetText(new WidgetPointer(1057,26), "Using balance tokens"); + } + return; +} diff --git a/dumps/scripts/4054.cs2 b/dumps/scripts/4054.cs2 new file mode 100644 index 000000000..4697d8d3d --- /dev/null +++ b/dumps/scripts/4054.cs2 @@ -0,0 +1,4 @@ +void script_4054(int arg0) { + script_4055(arg0); + return; +} diff --git a/dumps/scripts/4055.cs2 b/dumps/scripts/4055.cs2 new file mode 100644 index 000000000..6511ed672 --- /dev/null +++ b/dumps/scripts/4055.cs2 @@ -0,0 +1,30 @@ +void script_4055(int arg0) { + if (((boolean)globalint_1432) || isWidgetHidden(new WidgetPointer(1058,9))) { + return; + } + if (isWidgetHidden(new WidgetPointer(1058,10)) && isWidgetHidden(new WidgetPointer(1058,9))) { + setWidgetIsHidden(false, new WidgetPointer(1058,9)); + setWidgetPosition(0, subtract(1, getWidgetActualHeight(new WidgetPointer(1058,9))), 1, 0, new WidgetPointer(1058,9)); + globalint_1432 = 1; + setWidgetNoOptions(new WidgetPointer(1058,2)); + setWidgetNoOptions(new WidgetPointer(1058,3)); + setScriptCallOnGameloop(4059, new WidgetPointer(1058,9), new WidgetPointer(arg0), "II", new WidgetPointer(arg0)); + } else { + globalint_1432 = 1; + setWidgetNoOptions(new WidgetPointer(1058,2)); + setWidgetNoOptions(new WidgetPointer(1058,3)); + setScriptCallOnGameloop(4058, new WidgetPointer(1058,10), new WidgetPointer(1058,9), new WidgetPointer(arg0), "III", new WidgetPointer(arg0)); + } + setWidgetSprite(4464, new WidgetPointer(1058,32)); + setWidgetSprite(2659, new WidgetPointer(1058,33)); + setWidgetSprite(2659, new WidgetPointer(1058,34)); + setWidgetSprite(4465, new WidgetPointer(1058,36)); + setWidgetSprite(2657, new WidgetPointer(1058,37)); + setWidgetSprite(2657, new WidgetPointer(1058,38)); + if (((((bitconfig_8662 < 30) || (bitconfig_8663 < 30)) || (bitconfig_8664 < 30)) || (bitconfig_8665 < 30)) || (bitconfig_8666 < 30)) { + script_4061(); + } else { + script_4062(); + } + return; +} diff --git a/dumps/scripts/4056.cs2 b/dumps/scripts/4056.cs2 new file mode 100644 index 000000000..71d29cb1a --- /dev/null +++ b/dumps/scripts/4056.cs2 @@ -0,0 +1,4 @@ +void script_4056(int arg0) { + script_4057(arg0); + return; +} diff --git a/dumps/scripts/4057.cs2 b/dumps/scripts/4057.cs2 new file mode 100644 index 000000000..38c0794ce --- /dev/null +++ b/dumps/scripts/4057.cs2 @@ -0,0 +1,31 @@ +void script_4057(int arg0) { + if (((boolean)globalint_1432) || isWidgetHidden(new WidgetPointer(1058,10))) { + return; + } + if (isWidgetHidden(new WidgetPointer(1058,10)) && isWidgetHidden(new WidgetPointer(1058,9))) { + setWidgetIsHidden(false, new WidgetPointer(1058,10)); + setWidgetPosition(0, subtract(1, getWidgetActualHeight(new WidgetPointer(1058,10))), 1, 0, new WidgetPointer(1058,10)); + globalint_1432 = 1; + setWidgetNoOptions(new WidgetPointer(1058,2)); + setWidgetNoOptions(new WidgetPointer(1058,3)); + setScriptCallOnGameloop(4059, new WidgetPointer(1058,10), new WidgetPointer(arg0), "II", new WidgetPointer(arg0)); + } else { + globalint_1432 = 1; + setWidgetNoOptions(new WidgetPointer(1058,2)); + setWidgetNoOptions(new WidgetPointer(1058,3)); + setScriptCallOnGameloop(4058, new WidgetPointer(1058,9), new WidgetPointer(1058,10), new WidgetPointer(arg0), "III", new WidgetPointer(arg0)); + } + setWidgetSprite(4465, new WidgetPointer(1058,32)); + setWidgetSprite(2657, new WidgetPointer(1058,33)); + setWidgetSprite(2657, new WidgetPointer(1058,34)); + setWidgetSprite(4464, new WidgetPointer(1058,36)); + setWidgetSprite(2659, new WidgetPointer(1058,37)); + setWidgetSprite(2659, new WidgetPointer(1058,38)); + if ((((bitconfig_8662 < 200) && (bitconfig_8663 < 200)) && ((bitconfig_8664 < 200) && (bitconfig_8665 < 200))) && (bitconfig_8666 < 200)) { + script_4061(); + } else { + script_4062(); + } + globalint_1431 = 1; + return; +} diff --git a/dumps/scripts/4058.cs2 b/dumps/scripts/4058.cs2 new file mode 100644 index 000000000..f8e7b53ca --- /dev/null +++ b/dumps/scripts/4058.cs2 @@ -0,0 +1,14 @@ +void script_4058(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 5; + if (getWidgetActualY(new WidgetPointer(arg0)) > subtract(1, getWidgetActualHeight(new WidgetPointer(arg0)))) { + setWidgetPosition(0, subtract(getWidgetActualY(new WidgetPointer(arg0)), ivar3), 1, 0, new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetPosition(0, subtract(1, getWidgetActualHeight(new WidgetPointer(arg1))), 1, 0, new WidgetPointer(arg1)); + setScriptCallOnGameloop(4059, new WidgetPointer(arg1), new WidgetPointer(arg2), "II", new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/4059.cs2 b/dumps/scripts/4059.cs2 new file mode 100644 index 000000000..ed4b5ac04 --- /dev/null +++ b/dumps/scripts/4059.cs2 @@ -0,0 +1,14 @@ +void script_4059(int arg0,int arg1) { + int ivar2; + ivar2 = 5; + if (getWidgetActualY(new WidgetPointer(arg0)) >= 0) { + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(arg0)); + globalint_1432 = 0; + setWidgetContextMenuOption(1, new WidgetPointer(1058,2), "Select"); + setWidgetContextMenuOption(1, new WidgetPointer(1058,3), "Select"); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg1)); + } else { + setWidgetPosition(0, add(getWidgetActualY(new WidgetPointer(arg0)), ivar2), 1, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/406.cs2 b/dumps/scripts/406.cs2 new file mode 100644 index 000000000..52aa82759 --- /dev/null +++ b/dumps/scripts/406.cs2 @@ -0,0 +1,8 @@ +void script_406(int arg0) { + if (getWidgetShadeColor(new WidgetPointer(arg0)) > 0) { + cs2method2103(max(subtract(getWidgetShadeColor(new WidgetPointer(arg0)), 1), 0), new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4060.cs2 b/dumps/scripts/4060.cs2 new file mode 100644 index 000000000..71cd77818 --- /dev/null +++ b/dumps/scripts/4060.cs2 @@ -0,0 +1,14 @@ +void script_4060() { + if (((boolean)bitconfig_8669)) { + if (((((bitconfig_8662 < 30) || (bitconfig_8663 < 30)) || (bitconfig_8664 < 30)) || (bitconfig_8665 < 30)) || (bitconfig_8666 < 30)) { + script_4061(); + } else { + script_4062(); + } + } else if ((((bitconfig_8662 < 200) && (bitconfig_8663 < 200)) && ((bitconfig_8664 < 200) && (bitconfig_8665 < 200))) && (bitconfig_8666 < 200)) { + script_4061(); + } else { + script_4062(); + } + return; +} diff --git a/dumps/scripts/4061.cs2 b/dumps/scripts/4061.cs2 new file mode 100644 index 000000000..dfbe57325 --- /dev/null +++ b/dumps/scripts/4061.cs2 @@ -0,0 +1,5 @@ +void script_4061() { + setWidgetText(new WidgetPointer(1058,45), "Not Enough Tokens"); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1058,45)); + return; +} diff --git a/dumps/scripts/4062.cs2 b/dumps/scripts/4062.cs2 new file mode 100644 index 000000000..e2ecd0411 --- /dev/null +++ b/dumps/scripts/4062.cs2 @@ -0,0 +1,5 @@ +void script_4062() { + setWidgetText(new WidgetPointer(1058,45), "Accept Token Options"); + setWidgetRGB(new Color(13, 0, 0), new WidgetPointer(1058,45)); + return; +} diff --git a/dumps/scripts/4063.cs2 b/dumps/scripts/4063.cs2 new file mode 100644 index 000000000..0a1dd80cb --- /dev/null +++ b/dumps/scripts/4063.cs2 @@ -0,0 +1,22 @@ +void script_4063() { + if (((boolean)bitconfig_8669)) { + return; + } + switch (bitconfig_8668) { + case 1: + script_4065(69337113); + break; + case 4: + script_4065(69337112); + break; + case 5: + script_4065(69337110); + break; + case 3: + script_4065(69337111); + break; + case 2: + script_4065(69337114); + } + return; +} diff --git a/dumps/scripts/4064.cs2 b/dumps/scripts/4064.cs2 new file mode 100644 index 000000000..a75d25d55 --- /dev/null +++ b/dumps/scripts/4064.cs2 @@ -0,0 +1,8 @@ +void script_4064(int arg0) { + if (((boolean)globalint_1431)) { + return; + } + script_4065(arg0); + script_4069(); + return; +} diff --git a/dumps/scripts/4065.cs2 b/dumps/scripts/4065.cs2 new file mode 100644 index 000000000..3259fe6b1 --- /dev/null +++ b/dumps/scripts/4065.cs2 @@ -0,0 +1,55 @@ +void script_4065(int arg0) { + script_4066(); + switch (arg0) { + case 69337110: + setWidgetSprite(4444, new WidgetPointer(1058,19)); + setWidgetText(new WidgetPointer(1058,46), "Currently selected: Balance tokens - earned through the keg balancing minigame."); + setWidgetPosition(-160, 13, 1, 0, new WidgetPointer(arg0)); + if (bitconfig_8666 < 200) { + script_4061(); + } else { + script_4062(); + } + break; + case 69337111: + setWidgetSprite(4445, new WidgetPointer(1058,17)); + setWidgetText(new WidgetPointer(1058,46), "Currently selected: Strength tokens - earned through the shot put minigame."); + setWidgetPosition(-80, 13, 1, 0, new WidgetPointer(arg0)); + if (bitconfig_8662 < 200) { + script_4061(); + } else { + script_4062(); + } + break; + case 69337112: + setWidgetSprite(4446, new WidgetPointer(1058,15)); + setWidgetText(new WidgetPointer(1058,46), "Currently selected: Combat tokens - earned through the animator minigame."); + setWidgetPosition(0, 13, 1, 0, new WidgetPointer(arg0)); + if (bitconfig_8665 < 200) { + script_4061(); + } else { + script_4062(); + } + break; + case 69337114: + setWidgetSprite(4447, new WidgetPointer(1058,13)); + setWidgetText(new WidgetPointer(1058,46), "Currently selected: Defence tokens - earned through the catapult minigame."); + setWidgetPosition(80, 13, 1, 0, new WidgetPointer(arg0)); + if (bitconfig_8663 < 200) { + script_4061(); + } else { + script_4062(); + } + break; + case 69337113: + setWidgetSprite(4448, new WidgetPointer(1058,11)); + setWidgetText(new WidgetPointer(1058,46), "Currently selected: Attack tokens - earned through the dummy minigame."); + setWidgetPosition(160, 13, 1, 0, new WidgetPointer(arg0)); + if (bitconfig_8664 < 200) { + script_4061(); + } else { + script_4062(); + } + } + return; +} diff --git a/dumps/scripts/4066.cs2 b/dumps/scripts/4066.cs2 new file mode 100644 index 000000000..06429af6d --- /dev/null +++ b/dumps/scripts/4066.cs2 @@ -0,0 +1,13 @@ +void script_4066() { + setWidgetSprite(4459, new WidgetPointer(1058,19)); + setWidgetSprite(4460, new WidgetPointer(1058,17)); + setWidgetSprite(4461, new WidgetPointer(1058,15)); + setWidgetSprite(4462, new WidgetPointer(1058,13)); + setWidgetSprite(4463, new WidgetPointer(1058,11)); + setWidgetPosition(-160, 18, 1, 0, new WidgetPointer(1058,22)); + setWidgetPosition(-80, 18, 1, 0, new WidgetPointer(1058,23)); + setWidgetPosition(0, 18, 1, 0, new WidgetPointer(1058,24)); + setWidgetPosition(80, 18, 1, 0, new WidgetPointer(1058,26)); + setWidgetPosition(160, 18, 1, 0, new WidgetPointer(1058,25)); + return; +} diff --git a/dumps/scripts/4067.cs2 b/dumps/scripts/4067.cs2 new file mode 100644 index 000000000..0d082d20a --- /dev/null +++ b/dumps/scripts/4067.cs2 @@ -0,0 +1,19 @@ +void script_4067(int arg0) { + switch (arg0) { + case 69337110: + setWidgetPosition(-160, 13, 1, 0, new WidgetPointer(arg0)); + break; + case 69337111: + setWidgetPosition(-80, 13, 1, 0, new WidgetPointer(arg0)); + break; + case 69337112: + setWidgetPosition(0, 13, 1, 0, new WidgetPointer(arg0)); + break; + case 69337114: + setWidgetPosition(80, 13, 1, 0, new WidgetPointer(arg0)); + break; + case 69337113: + setWidgetPosition(160, 13, 1, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4068.cs2 b/dumps/scripts/4068.cs2 new file mode 100644 index 000000000..fefeabfb0 --- /dev/null +++ b/dumps/scripts/4068.cs2 @@ -0,0 +1,29 @@ +void script_4068(int arg0) { + switch (arg0) { + case 69337110: + if (getWidgetSpriteId(new WidgetPointer(1058,19)) != 4444) { + setWidgetPosition(-160, 18, 1, 0, new WidgetPointer(arg0)); + } + break; + case 69337111: + if (getWidgetSpriteId(new WidgetPointer(1058,17)) != 4445) { + setWidgetPosition(-80, 18, 1, 0, new WidgetPointer(arg0)); + } + break; + case 69337112: + if (getWidgetSpriteId(new WidgetPointer(1058,15)) != 4446) { + setWidgetPosition(0, 18, 1, 0, new WidgetPointer(arg0)); + } + break; + case 69337114: + if (getWidgetSpriteId(new WidgetPointer(1058,13)) != 4447) { + setWidgetPosition(80, 18, 1, 0, new WidgetPointer(arg0)); + } + break; + case 69337113: + if (getWidgetSpriteId(new WidgetPointer(1058,11)) != 4448) { + setWidgetPosition(160, 18, 1, 0, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/4069.cs2 b/dumps/scripts/4069.cs2 new file mode 100644 index 000000000..1340f5735 --- /dev/null +++ b/dumps/scripts/4069.cs2 @@ -0,0 +1,5 @@ +void script_4069() { + globalint_1431 = 1; + setScriptCallOnGameloop(4070, getClientCycle(), "i", new WidgetPointer(1058,68)); + return; +} diff --git a/dumps/scripts/407.cs2 b/dumps/scripts/407.cs2 new file mode 100644 index 000000000..70fe39c18 --- /dev/null +++ b/dumps/scripts/407.cs2 @@ -0,0 +1,33 @@ +void script_407() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + if (globalint_1362 < 1) { + return; + } + ivar0 = divide(multiply(globalint_1362, 6), 10); + ivar1 = 0; + ivar2 = 0; + svar0 = ""; + if (ivar0 < 60) { + ivar1 = ivar0; + } else { + ivar1 = mod(ivar0, 60); + ivar2 = divide(ivar0, 60); + } + if (ivar1 < 10) { + svar0 = concat("0", intToStr(ivar1)); + if (((boolean)ivar2) && ((boolean)globalint_1389)) { + globalint_1389 = 1; + if (((boolean)bitconfig_7511)) { + playSoundEffect2False(3434, 1, 0, 255); + } + } + } else { + svar0 = intToStr(ivar1); + } + setWidgetText(new WidgetPointer(1010,21), "Turn Time Left" + "
" + intToStr(ivar2) + ":" + svar0); + setWidgetText(new WidgetPointer(1013,24), intToStr(ivar2) + ":" + svar0); + return; +} diff --git a/dumps/scripts/4070.cs2 b/dumps/scripts/4070.cs2 new file mode 100644 index 000000000..73d584d87 --- /dev/null +++ b/dumps/scripts/4070.cs2 @@ -0,0 +1,7 @@ +void script_4070(int arg0) { + if (getClientCycle() > add(arg0, 25)) { + globalint_1431 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(1058,68)); + } + return; +} diff --git a/dumps/scripts/4071.cs2 b/dumps/scripts/4071.cs2 new file mode 100644 index 000000000..ec9321e61 --- /dev/null +++ b/dumps/scripts/4071.cs2 @@ -0,0 +1,12 @@ +void script_4071(int arg0) { + if (arg0 == 69337132) { + setWidgetIsHidden(false, new WidgetPointer(1058,31)); + } else if (arg0 == 69337090) { + setWidgetIsHidden(false, new WidgetPointer(1058,39)); + } else { + if (arg0 == 69337091) { + setWidgetIsHidden(false, new WidgetPointer(1058,35)); + } + } + return; +} diff --git a/dumps/scripts/4072.cs2 b/dumps/scripts/4072.cs2 new file mode 100644 index 000000000..f706ee7a9 --- /dev/null +++ b/dumps/scripts/4072.cs2 @@ -0,0 +1,12 @@ +void script_4072(int arg0) { + if (arg0 == 69337132) { + setWidgetIsHidden(true, new WidgetPointer(1058,31)); + } else if (arg0 == 69337090) { + setWidgetIsHidden(true, new WidgetPointer(1058,39)); + } else { + if (arg0 == 69337091) { + setWidgetIsHidden(true, new WidgetPointer(1058,35)); + } + } + return; +} diff --git a/dumps/scripts/4073.cs2 b/dumps/scripts/4073.cs2 new file mode 100644 index 000000000..eff824d85 --- /dev/null +++ b/dumps/scripts/4073.cs2 @@ -0,0 +1,10 @@ +void script_4073() { + if (((boolean)bitconfig_8669)) { + globalint_1432 = 0; + script_4057(69337090); + } else { + globalint_1432 = 0; + script_4055(69337091); + } + return; +} diff --git a/dumps/scripts/4074.cs2 b/dumps/scripts/4074.cs2 new file mode 100644 index 000000000..953d3f8ef --- /dev/null +++ b/dumps/scripts/4074.cs2 @@ -0,0 +1,20 @@ +void script_4074(string arg0) { + int ivar0; + ivar0 = 0; + ivar0 = multiply(getLineCount(346, 495, arg0), 13); + if (ivar0 > 48) { + ivar0 = multiply(getLineCount(328, 495, arg0), 13); + } + if (ivar0 > 48) { + setWidgetScrollMax(0, ivar0, new WidgetPointer(178,65)); + script_31(11665471, 11665473, 792, 789, 790, 791, 773, 788); + setWidgetSize(334, 48, 0, 0, new WidgetPointer(178,65)); + setWidgetSize(16384, ivar0, 2, 0, new WidgetPointer(178,2)); + setWidgetSize(16384, ivar0, 2, 0, new WidgetPointer(178,3)); + setWidgetTextAlignment(0, 0, 0, new WidgetPointer(178,66)); + } else { + setWidgetSize(354, 48, 0, 0, new WidgetPointer(178,65)); + setWidgetTextAlignment(0, 1, 0, new WidgetPointer(178,66)); + } + return; +} diff --git a/dumps/scripts/4075.cs2 b/dumps/scripts/4075.cs2 new file mode 100644 index 000000000..155756a8e --- /dev/null +++ b/dumps/scripts/4075.cs2 @@ -0,0 +1,24 @@ +void script_4075(int arg0) { + switch (globalint_1433) { + case 1: + script_2766(0, 50, arg0); + break; + case 2: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_4077(16, 11), 500, script_4077(16, 11), 500, 0); + cs2method5406(0, 1, script_4077(14, 12), 400, script_4077(14, 12), 400, 0); + cs2method5406(1, 0, script_4077(15, 15), 400, script_4077(15, 15), 400, 0); + cs2method5406(1, 1, script_4077(15, 15), 300, script_4077(15, 15), 300, 0); + cameraMethod5502(0, 0, 100, 100, 1, 0); + break; + case 3: + script_2766(0, 30, arg0); + break; + case 4: + cameraUnlock(); + script_2768(50, arg0); + } + return; +} diff --git a/dumps/scripts/4076.cs2 b/dumps/scripts/4076.cs2 new file mode 100644 index 000000000..fa4caf7eb --- /dev/null +++ b/dumps/scripts/4076.cs2 @@ -0,0 +1,33 @@ +void script_4076(int arg0) { + switch (globalint_1434) { + case 1: + script_2766(0, 50, arg0); + break; + case 2: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_4077(14, 6), 1200, script_4077(14, 6), 1200, 0); + cs2method5406(0, 1, script_4077(14, 4), 1100, script_4077(14, 4), 1100, 0); + cs2method5406(1, 0, script_4077(15, 15), 500, script_4077(15, 15), 500, 0); + cs2method5406(1, 1, script_4077(15, 14), 400, script_4077(15, 14), 400, 0); + cameraMethod5502(0, 0, 260, 260, 1, 0); + break; + case 3: + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_4077(14, 4), 1100, script_4077(14, 4), 1100, 0); + cs2method5406(0, 1, script_4077(14, 0), 900, script_4077(14, 0), 900, 0); + cs2method5406(1, 0, script_4077(15, 14), 400, script_4077(15, 14), 400, 0); + cs2method5406(1, 1, script_4077(15, 14), 300, script_4077(15, 14), 300, 0); + cameraMethod5502(0, 0, 250, 250, 1, 0); + break; + case 4: + script_2766(0, 30, arg0); + break; + case 5: + cameraUnlock(); + script_2768(50, arg0); + } + return; +} diff --git a/dumps/scripts/4077.cs2 b/dumps/scripts/4077.cs2 new file mode 100644 index 000000000..710baad70 --- /dev/null +++ b/dumps/scripts/4077.cs2 @@ -0,0 +1,5 @@ +int script_4077(int arg0,int arg1) { + int ivar2; + ivar2 = script_284(getMyPositionHash()); + return addToCoordinate(ivar2, arg0, 0, arg1); +} diff --git a/dumps/scripts/4078.cs2 b/dumps/scripts/4078.cs2 new file mode 100644 index 000000000..bddfdee48 --- /dev/null +++ b/dumps/scripts/4078.cs2 @@ -0,0 +1,4 @@ +void script_4078() { + script_4079(bitconfig_8697); + return; +} diff --git a/dumps/scripts/4079.cs2 b/dumps/scripts/4079.cs2 new file mode 100644 index 000000000..9664a3427 --- /dev/null +++ b/dumps/scripts/4079.cs2 @@ -0,0 +1,14 @@ +void script_4079(int arg0) { + if (setWidgetRegister(new WidgetPointer(1064,2), 0)) { + if (arg0 <= 30) { + setWidgetSize(multiply(arg0, 8), 8, 0, 0); + } + } else { + createExtraChild(new WidgetPointer(1064,2), 3, 0); + setWidgetPosition(44, 44, 0, 0); + setWidgetSize(multiply(8, 30), 8, 0, 0); + setWidgetRGB(new Color(201, 108, 62)); + setWidgetFilled(1); + } + return; +} diff --git a/dumps/scripts/408.cs2 b/dumps/scripts/408.cs2 new file mode 100644 index 000000000..f6ade24ce --- /dev/null +++ b/dumps/scripts/408.cs2 @@ -0,0 +1,22 @@ +void script_408(int arg0) { + if (globalint_1363 == arg0) { + return; + } + setScriptCallOnGlobalConfigChange(408, globalint_1363, 1363, 1, "iY", new WidgetPointer(1013,1)); + globalint_1389 = 0; + if (globalint_1363 == bitconfig_7510) { + setWidgetIsHidden(false, new WidgetPointer(1010,33)); + setWidgetIsHidden(true, new WidgetPointer(1010,32)); + setWidgetIsHidden(true, new WidgetPointer(1010,24)); + setWidgetText(new WidgetPointer(1013,26), "Your Turn"); + playSoundEffect2False(3439, 1, 0, 255); + } else { + setWidgetIsHidden(true, new WidgetPointer(1010,33)); + setWidgetIsHidden(true, new WidgetPointer(1010,24)); + setWidgetText(new WidgetPointer(1013,26), "Opponent's Turn"); + if (isWidgetHidden(new WidgetPointer(1010,7))) { + setWidgetIsHidden(false, new WidgetPointer(1010,32)); + } + } + return; +} diff --git a/dumps/scripts/4080.cs2 b/dumps/scripts/4080.cs2 new file mode 100644 index 000000000..8339ab6c2 --- /dev/null +++ b/dumps/scripts/4080.cs2 @@ -0,0 +1,12 @@ +void script_4080() { + if (setWidgetRegister(new WidgetPointer(1060,0))) { + setWidgetSprite(4032); + } + if (setWidgetRegister(new WidgetPointer(1060,2))) { + setWidgetSprite(4035); + } + if (setWidgetRegister(new WidgetPointer(1060,1))) { + setWidgetSprite(4038); + } + return; +} diff --git a/dumps/scripts/4081.cs2 b/dumps/scripts/4081.cs2 new file mode 100644 index 000000000..5f503099c --- /dev/null +++ b/dumps/scripts/4081.cs2 @@ -0,0 +1,12 @@ +void script_4081() { + if (setWidgetRegister(new WidgetPointer(1060,0))) { + setWidgetSprite(4031); + } + if (setWidgetRegister(new WidgetPointer(1060,2))) { + setWidgetSprite(4034); + } + if (setWidgetRegister(new WidgetPointer(1060,1))) { + setWidgetSprite(4037); + } + return; +} diff --git a/dumps/scripts/4082.cs2 b/dumps/scripts/4082.cs2 new file mode 100644 index 000000000..07eb19bdb --- /dev/null +++ b/dumps/scripts/4082.cs2 @@ -0,0 +1,12 @@ +void script_4082() { + if (setWidgetRegister(new WidgetPointer(1060,0))) { + setWidgetSprite(4033); + } + if (setWidgetRegister(new WidgetPointer(1060,2))) { + setWidgetSprite(4036); + } + if (setWidgetRegister(new WidgetPointer(1060,1))) { + setWidgetSprite(4039); + } + return; +} diff --git a/dumps/scripts/4083.cs2 b/dumps/scripts/4083.cs2 new file mode 100644 index 000000000..153579607 --- /dev/null +++ b/dumps/scripts/4083.cs2 @@ -0,0 +1,12 @@ +void script_4083() { + if (setWidgetRegister(new WidgetPointer(1061,3)) && (getWidgetSpriteId() == 4032)) { + setWidgetSprite(4031); + } + if (setWidgetRegister(new WidgetPointer(1061,4)) && (getWidgetSpriteId() == 4035)) { + setWidgetSprite(4034); + } + if (setWidgetRegister(new WidgetPointer(1061,5)) && (getWidgetSpriteId() == 4038)) { + setWidgetSprite(4037); + } + return; +} diff --git a/dumps/scripts/4084.cs2 b/dumps/scripts/4084.cs2 new file mode 100644 index 000000000..ebc8031d2 --- /dev/null +++ b/dumps/scripts/4084.cs2 @@ -0,0 +1,12 @@ +void script_4084() { + if (setWidgetRegister(new WidgetPointer(1061,3)) && (getWidgetSpriteId() != 4033)) { + setWidgetSprite(4032); + } + if (setWidgetRegister(new WidgetPointer(1061,4)) && (getWidgetSpriteId() != 4036)) { + setWidgetSprite(4035); + } + if (setWidgetRegister(new WidgetPointer(1061,5)) && (getWidgetSpriteId() != 4039)) { + setWidgetSprite(4038); + } + return; +} diff --git a/dumps/scripts/4085.cs2 b/dumps/scripts/4085.cs2 new file mode 100644 index 000000000..809e41dca --- /dev/null +++ b/dumps/scripts/4085.cs2 @@ -0,0 +1,12 @@ +void script_4085() { + if (setWidgetRegister(new WidgetPointer(1061,3))) { + setWidgetSprite(4031); + } + if (setWidgetRegister(new WidgetPointer(1061,4))) { + setWidgetSprite(4034); + } + if (setWidgetRegister(new WidgetPointer(1061,5))) { + setWidgetSprite(4037); + } + return; +} diff --git a/dumps/scripts/4086.cs2 b/dumps/scripts/4086.cs2 new file mode 100644 index 000000000..d053388b5 --- /dev/null +++ b/dumps/scripts/4086.cs2 @@ -0,0 +1,12 @@ +void script_4086() { + if (setWidgetRegister(new WidgetPointer(1061,3))) { + setWidgetSprite(4033); + } + if (setWidgetRegister(new WidgetPointer(1061,4))) { + setWidgetSprite(4036); + } + if (setWidgetRegister(new WidgetPointer(1061,5))) { + setWidgetSprite(4039); + } + return; +} diff --git a/dumps/scripts/4087.cs2 b/dumps/scripts/4087.cs2 new file mode 100644 index 000000000..68b0de400 --- /dev/null +++ b/dumps/scripts/4087.cs2 @@ -0,0 +1,8 @@ +void script_4087(int arg0) { + if (((boolean)bitconfig_8701)) { + setWidgetSprite(3012, new WidgetPointer(arg0)); + } else { + setWidgetSprite(3010, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4088.cs2 b/dumps/scripts/4088.cs2 new file mode 100644 index 000000000..d96f5abb6 --- /dev/null +++ b/dumps/scripts/4088.cs2 @@ -0,0 +1,8 @@ +void script_4088(int arg0) { + if (((boolean)bitconfig_8701)) { + setWidgetSprite(3012, new WidgetPointer(arg0)); + } else { + setWidgetSprite(3010, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4089.cs2 b/dumps/scripts/4089.cs2 new file mode 100644 index 000000000..9ecbbd047 --- /dev/null +++ b/dumps/scripts/4089.cs2 @@ -0,0 +1,15 @@ +void script_4089() { + int ivar0; + ivar0 = 35913927; + if (getDisplayMode() >= 2) { + ivar0 = 48889943; + } + if ((isParent(new WidgetPointer(script_8(1)), 1056) && isWidgetOpen(new WidgetPointer(ivar0))) && (((boolean)script_2728()) && (bitconfig_8587 != 419))) { + setWidgetIsHidden(false, new WidgetPointer(746,130)); + setWidgetIsHidden(false, new WidgetPointer(548,137)); + } else { + setWidgetIsHidden(true, new WidgetPointer(746,130)); + setWidgetIsHidden(true, new WidgetPointer(548,137)); + } + return; +} diff --git a/dumps/scripts/409.cs2 b/dumps/scripts/409.cs2 new file mode 100644 index 000000000..85947fdd1 --- /dev/null +++ b/dumps/scripts/409.cs2 @@ -0,0 +1,16 @@ +void script_409() { + globalint_1364 = add(globalint_1364, 1); + if (globalint_1364 == 50) { + setWidgetText(new WidgetPointer(1010,41), "Opponent's Turn"); + } else if (globalint_1364 == 100) { + setWidgetText(new WidgetPointer(1010,41), "Opponent's Turn."); + } else if (globalint_1364 == 150) { + setWidgetText(new WidgetPointer(1010,41), "Opponent's Turn.."); + } else { + if (globalint_1364 >= 200) { + setWidgetText(new WidgetPointer(1010,41), "Opponent's Turn..."); + globalint_1364 = 0; + } + } + return; +} diff --git a/dumps/scripts/4090.cs2 b/dumps/scripts/4090.cs2 new file mode 100644 index 000000000..1a70abd2b --- /dev/null +++ b/dumps/scripts/4090.cs2 @@ -0,0 +1,6 @@ +void script_4090(int arg0,int arg1,int arg2) { + setScriptCallOnSkillChange(4091, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), "III", new WidgetPointer(arg0)); + setScriptCallOnAnyWidgetOpenAndClose(4091, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), "III", new WidgetPointer(arg0)); + script_4092(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4091.cs2 b/dumps/scripts/4091.cs2 new file mode 100644 index 000000000..e0d2d37d3 --- /dev/null +++ b/dumps/scripts/4091.cs2 @@ -0,0 +1,4 @@ +void script_4091(int arg0,int arg1,int arg2) { + script_4092(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4092.cs2 b/dumps/scripts/4092.cs2 new file mode 100644 index 000000000..c7a0562f0 --- /dev/null +++ b/dumps/scripts/4092.cs2 @@ -0,0 +1,16 @@ +void script_4092(int arg0,int arg1,int arg2) { + if (((boolean)script_2728())) { + if ((arg1 != -1) && (getExtraChildGap(new WidgetPointer(arg1)) <= 0)) { + script_4093(arg0, arg1); + } + script_4089(); + } else { + if ((arg1 != -1) && (getExtraChildGap(new WidgetPointer(arg1)) > 0)) { + deleteAllExtraChilds(new WidgetPointer(arg1)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/4093.cs2 b/dumps/scripts/4093.cs2 new file mode 100644 index 000000000..bff4c808f --- /dev/null +++ b/dumps/scripts/4093.cs2 @@ -0,0 +1,34 @@ +void script_4093(int arg0,int arg1) { + string svar0; + deleteAllExtraChilds(new WidgetPointer(arg1)); + createExtraChild(new WidgetPointer(arg1), 5, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(8, 23, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(4514); + createExtraChild(new WidgetPointer(arg1), 5, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(8, 23, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(4516); + createExtraChild(new WidgetPointer(arg1), 5, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(16, 23, 1, 0); + setWidgetPosition(0, 0, 1, 0); + cs2method1107(1); + setWidgetSprite(4515); + createExtraChild(new WidgetPointer(arg1), 4, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(0, 23, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + svar0 = "Task List"; + setWidgetText(svar0); + setWidgetSize(add(getTextWidth(494, svar0), 10), 32, 0, 0, new WidgetPointer(arg1)); + createExtraChild(new WidgetPointer(arg1), 5, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(21, 11, 0, 0); + setWidgetPosition(0, 0, 1, 2); + setWidgetSprite(4517); + script_4096(arg1); + script_4095(arg0, arg1, script_3365(48889986), script_3366(48889986), ((int)isWidgetHidden(new WidgetPointer(746,86)))); + return; +} diff --git a/dumps/scripts/4094.cs2 b/dumps/scripts/4094.cs2 new file mode 100644 index 000000000..e0eb4c026 --- /dev/null +++ b/dumps/scripts/4094.cs2 @@ -0,0 +1,20 @@ +void script_4094(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + flow_0: + ivar6 = script_3365(48889986); + ivar7 = script_3366(48889986); + ivar8 = ((int)isWidgetHidden(new WidgetPointer(746,86))); + IF ((ivar6 != arg3) || (ivar7 != arg4)) + GOTO flow_1 + IF ((script_42(ivar8) != script_42(arg5)) && setWidgetRegister(new WidgetPointer(arg1), arg2)) + GOTO flow_2 + GOTO flow_3 + flow_1: + flow_2: + script_4095(arg0, arg1, ivar6, ivar7, ivar8); + flow_3: + script_4096(arg1); + return; +} diff --git a/dumps/scripts/4095.cs2 b/dumps/scripts/4095.cs2 new file mode 100644 index 000000000..7e3d5431a --- /dev/null +++ b/dumps/scripts/4095.cs2 @@ -0,0 +1,28 @@ +void script_4095(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar5 = getWidgetActualWidth(new WidgetPointer(arg1)); + ivar6 = add(arg2, divide(subtract(getWidgetActualWidth(new WidgetPointer(746,130)), ivar5), 2)); + ivar7 = 0; + ivar8 = 0; + if (((boolean)arg4)) { + ivar7 = subtract(add(ivar6, ivar5), script_3365(48889942)); + if (ivar7 > 0) { + ivar8 = min(ivar7, divide(getWidgetActualWidth(new WidgetPointer(746,40)), 2)); + ivar6 = subtract(ivar6, ivar8); + ivar7 = subtract(ivar7, ivar8); + if (ivar7 > 0) { + ivar8 = min(ivar7, subtract(divide(subtract(ivar5, getWidgetActualWidth()), 2), 4)); + ivar6 = subtract(ivar6, ivar8); + } else { + ivar8 = 0; + } + } + } + setWidgetPosition(ivar8, 0, 1, 2); + setWidgetPosition(ivar6, subtract(add(arg3, 5), getWidgetActualHeight(new WidgetPointer(arg1))), 0, 0, new WidgetPointer(arg1)); + setScriptCallOnGameloop(4094, new WidgetPointer(arg0), new WidgetPointer(arg1), getWidgetCustomChildArrayIndex(), arg2, arg3, arg4, "IIiii1", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4096.cs2 b/dumps/scripts/4096.cs2 new file mode 100644 index 000000000..55d7e806c --- /dev/null +++ b/dumps/scripts/4096.cs2 @@ -0,0 +1,8 @@ +void script_4096(int arg0) { + if ((isWidgetHidden(new WidgetPointer(746,131)) && isWidgetHidden(new WidgetPointer(746,23))) && isParent(new WidgetPointer(746,91), 1056)) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4097.cs2 b/dumps/scripts/4097.cs2 new file mode 100644 index 000000000..9ee5c7fe5 --- /dev/null +++ b/dumps/scripts/4097.cs2 @@ -0,0 +1,25 @@ +void script_4097(int arg0,int arg1,string arg2) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(8, arg1, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(4514); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(8, arg1, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(4516); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(16, arg1, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetSprite(4515); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(20, arg1, 1, 0); + setWidgetPosition(0, 1, 1, 0); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetText(arg2); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4098.cs2 b/dumps/scripts/4098.cs2 new file mode 100644 index 000000000..85748c0a4 --- /dev/null +++ b/dumps/scripts/4098.cs2 @@ -0,0 +1,210 @@ +int script_4098() { + flow_0: + SWITCH (standart_config_281) { + case 7: + GOTO flow_1 + case 9: + GOTO flow_2 + case 10: + GOTO flow_3 + case 15: + GOTO flow_4 + case 20: + GOTO flow_5 + case 25: + GOTO flow_6 + case 30: + GOTO flow_7 + case 35: + GOTO flow_8 + case 40: + GOTO flow_9 + case 45: + GOTO flow_10 + case 46: + GOTO flow_11 + case 47: + GOTO flow_12 + case 48: + GOTO flow_13 + case 49: + GOTO flow_14 + case 50: + GOTO flow_15 + case 55: + GOTO flow_16 + case 56: + GOTO flow_17 + case 57: + GOTO flow_18 + case 60: + GOTO flow_19 + case 62: + GOTO flow_20 + case 65: + GOTO flow_21 + case 70: + GOTO flow_22 + case 75: + GOTO flow_23 + case 80: + GOTO flow_24 + case 82: + GOTO flow_25 + case 83: + GOTO flow_26 + case 90: + GOTO flow_27 + case 93: + GOTO flow_28 + case 95: + GOTO flow_29 + case 96: + GOTO flow_30 + case 98: + GOTO flow_31 + case 100: + GOTO flow_32 + case 105: + GOTO flow_33 + case 110: + GOTO flow_34 + case 115: + GOTO flow_35 + case 120: + GOTO flow_36 + case 123: + GOTO flow_37 + case 125: + GOTO flow_38 + case 126: + GOTO flow_39 + case 127: + GOTO flow_40 + case 128: + GOTO flow_41 + case 130: + GOTO flow_42 + case 135: + GOTO flow_43 + case 140: + GOTO flow_44 + case 145: + GOTO flow_45 + case 150: + GOTO flow_46 + case 155: + GOTO flow_47 + case 160: + GOTO flow_48 + case 165: + GOTO flow_49 + case 170: + GOTO flow_50 + case 1000: + GOTO flow_51 + } + return 4094; + flow_1: + return 3500; + flow_2: + return 3500; + flow_3: + return 3501; + flow_4: + return 3502; + flow_5: + return 3503; + flow_6: + return 3503; + flow_7: + return 3503; + flow_8: + return 3504; + flow_9: + return 3504; + flow_10: + return 3505; + flow_11: + return 3505; + flow_12: + return 3505; + flow_13: + return 3505; + flow_14: + return 3505; + flow_15: + return 3506; + flow_16: + return 3506; + flow_17: + return 3506; + flow_18: + return 3506; + flow_19: + return 3508; + flow_20: + return 3509; + flow_21: + return 3507; + flow_22: + return 3523; + flow_23: + return 3507; + flow_24: + return 3510; + flow_25: + return 3510; + flow_26: + return 3510; + flow_27: + return 3510; + flow_28: + return 3511; + flow_29: + return 3511; + flow_30: + return 3512; + flow_31: + return 3512; + flow_32: + return 3512; + flow_33: + return 3512; + flow_34: + return 3512; + flow_35: + return 3512; + flow_36: + return 3513; + flow_37: + return 3513; + flow_38: + return 3513; + flow_39: + return 3513; + flow_40: + return 3513; + flow_41: + return 3514; + flow_42: + return 3514; + flow_43: + return 3514; + flow_44: + return 3514; + flow_45: + return 3514; + flow_46: + return 3514; + flow_47: + return 3514; + flow_48: + return 3514; + flow_49: + return 3514; + flow_50: + return 3519; + flow_51: + return 3521; +} diff --git a/dumps/scripts/4099.cs2 b/dumps/scripts/4099.cs2 new file mode 100644 index 000000000..816d9cedb --- /dev/null +++ b/dumps/scripts/4099.cs2 @@ -0,0 +1,5 @@ +void script_4099() { + globalint_41 = -1; + script_1364(); + return; +} diff --git a/dumps/scripts/41.cs2 b/dumps/scripts/41.cs2 new file mode 100644 index 000000000..1c12b7dd1 --- /dev/null +++ b/dumps/scripts/41.cs2 @@ -0,0 +1,5 @@ +void script_41(int arg0) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/410.cs2 b/dumps/scripts/410.cs2 new file mode 100644 index 000000000..6093e0fa4 --- /dev/null +++ b/dumps/scripts/410.cs2 @@ -0,0 +1,61 @@ +void script_410(int arg0) { + if (globalint_1361 == arg0) { + return; + } + setScriptCallOnGlobalConfigChange(410, globalint_1361, 1361, 1, "iY", new WidgetPointer(1010,6)); + if (globalint_1363 == bitconfig_7510) { + setWidgetIsHidden(false, new WidgetPointer(1010,33)); + setWidgetIsHidden(true, new WidgetPointer(1010,24)); + } + if (((boolean)globalint_1361)) { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1010,12)); + setWidgetSprite(3745, new WidgetPointer(1010,13)); + setWidgetRGB(new Color(150, 150, 100), new WidgetPointer(1010,14)); + setWidgetSprite(3745, new WidgetPointer(1010,15)); + setWidgetRGB(new Color(150, 150, 100), new WidgetPointer(1010,16)); + setWidgetSprite(3745, new WidgetPointer(1010,17)); + setWidgetRGB(new Color(150, 150, 100), new WidgetPointer(1010,18)); + setWidgetSprite(3745, new WidgetPointer(1010,19)); + } else if (((boolean)globalint_1361)) { + if (((boolean)bitconfig_7511)) { + if (((boolean)rndExcl(2))) { + playSoundEffect2False(3436, 1, 0, 255); + } else { + playSoundEffect2False(3438, 1, 0, 255); + } + } + setWidgetRGB(new Color(0, 200, 0), new WidgetPointer(1010,12)); + setWidgetSprite(3746, new WidgetPointer(1010,13)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1010,14)); + setWidgetSprite(3745, new WidgetPointer(1010,15)); + setWidgetRGB(new Color(150, 150, 100), new WidgetPointer(1010,16)); + setWidgetSprite(3745, new WidgetPointer(1010,17)); + setWidgetRGB(new Color(150, 150, 100), new WidgetPointer(1010,18)); + setWidgetSprite(3745, new WidgetPointer(1010,19)); + } else if (globalint_1361 == 2) { + if (((boolean)bitconfig_7511)) { + playSoundEffect2False(3437, 1, 0, 255); + } + setWidgetRGB(new Color(0, 200, 0), new WidgetPointer(1010,12)); + setWidgetSprite(3746, new WidgetPointer(1010,13)); + setWidgetRGB(new Color(0, 200, 0), new WidgetPointer(1010,14)); + setWidgetSprite(3746, new WidgetPointer(1010,15)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1010,16)); + setWidgetSprite(3745, new WidgetPointer(1010,17)); + setWidgetRGB(new Color(150, 150, 100), new WidgetPointer(1010,18)); + setWidgetSprite(3745, new WidgetPointer(1010,19)); + } else { + if (((boolean)bitconfig_7511)) { + playSoundEffect2False(3441, 1, 0, 255); + } + setWidgetRGB(new Color(0, 200, 0), new WidgetPointer(1010,12)); + setWidgetSprite(3746, new WidgetPointer(1010,13)); + setWidgetRGB(new Color(0, 200, 0), new WidgetPointer(1010,14)); + setWidgetSprite(3746, new WidgetPointer(1010,15)); + setWidgetRGB(new Color(0, 200, 0), new WidgetPointer(1010,16)); + setWidgetSprite(3746, new WidgetPointer(1010,17)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1010,18)); + setWidgetSprite(3745, new WidgetPointer(1010,19)); + } + return; +} diff --git a/dumps/scripts/4100.cs2 b/dumps/scripts/4100.cs2 new file mode 100644 index 000000000..f39765de2 --- /dev/null +++ b/dumps/scripts/4100.cs2 @@ -0,0 +1,5 @@ +void script_4100() { + globalint_41 = 1; + script_1364(); + return; +} diff --git a/dumps/scripts/4101.cs2 b/dumps/scripts/4101.cs2 new file mode 100644 index 000000000..0bd32986b --- /dev/null +++ b/dumps/scripts/4101.cs2 @@ -0,0 +1,4 @@ +void script_4101(int arg0) { + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(1056,102)); + return; +} diff --git a/dumps/scripts/4102.cs2 b/dumps/scripts/4102.cs2 new file mode 100644 index 000000000..f75a8d83a --- /dev/null +++ b/dumps/scripts/4102.cs2 @@ -0,0 +1,14 @@ +void script_4102(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4324, new WidgetPointer(320,206)); + setWidgetSprite(4324, new WidgetPointer(320,207)); + setWidgetSprite(4325, new WidgetPointer(320,208)); + setWidgetSprite(4309, new WidgetPointer(320,210)); + } else { + setWidgetSprite(4322, new WidgetPointer(320,206)); + setWidgetSprite(4322, new WidgetPointer(320,207)); + setWidgetSprite(4323, new WidgetPointer(320,208)); + setWidgetSprite(4308, new WidgetPointer(320,210)); + } + return; +} diff --git a/dumps/scripts/4103.cs2 b/dumps/scripts/4103.cs2 new file mode 100644 index 000000000..e4448a5c5 --- /dev/null +++ b/dumps/scripts/4103.cs2 @@ -0,0 +1,4 @@ +void script_4103() { + setWidgetIsHidden(true, new WidgetPointer(320,203)); + return; +} diff --git a/dumps/scripts/4104.cs2 b/dumps/scripts/4104.cs2 new file mode 100644 index 000000000..44fba6578 --- /dev/null +++ b/dumps/scripts/4104.cs2 @@ -0,0 +1,4 @@ +void script_4104() { + cs2method5421(1, "golden_joystick.ws"); + return; +} diff --git a/dumps/scripts/4105.cs2 b/dumps/scripts/4105.cs2 new file mode 100644 index 000000000..f1070f064 --- /dev/null +++ b/dumps/scripts/4105.cs2 @@ -0,0 +1,68 @@ +void script_4105(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + string svar0; + if (globalint_729 > 1) { + setWidgetText(new WidgetPointer(arg0), formatNumber(globalint_729, 1) + " coins"); + } else if (((boolean)globalint_729)) { + setWidgetText(new WidgetPointer(arg0), "1 coin"); + } else if (((boolean)globalint_729)) { + setWidgetText(new WidgetPointer(arg0), "Nothing"); + } else { + setWidgetText(new WidgetPointer(arg0), "Lots!"); + } + if (globalint_697 > 1) { + setWidgetText(new WidgetPointer(arg1), formatNumber(globalint_697, 1) + " coins"); + } else if (((boolean)globalint_697)) { + setWidgetText(new WidgetPointer(arg1), "1 coin"); + } else if (((boolean)globalint_697)) { + setWidgetText(new WidgetPointer(arg1), "" + "Nothing" + ""); + } else { + setWidgetText(new WidgetPointer(arg1), "Lots!"); + } + svar0 = "" + "Unknown" + ""; + ivar5 = 0; + if (globalint_729 < 0) { + if (globalint_697 < 0) { + setWidgetText(new WidgetPointer(arg2), svar0); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + } else { + setWidgetText(new WidgetPointer(arg2), svar0); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetSprite(1174, new WidgetPointer(arg3)); + setWidgetPosition(script_4106(arg4, svar0), 0, 0, 2, new WidgetPointer(arg3)); + } + } else if (globalint_697 < 0) { + svar0 = "Unknown"; + setWidgetText(new WidgetPointer(arg2), svar0); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetSprite(1172, new WidgetPointer(arg3)); + setWidgetPosition(script_4106(arg4, svar0), 0, 2, 2, new WidgetPointer(arg3)); + } else if (ivar5 > 0) { + if (((boolean)ivar5)) { + svar0 = "" + "1 coin" + ""; + } else { + svar0 = "" + formatNumber(ivar5, 1) + " coins" + ""; + } + setWidgetText(new WidgetPointer(arg2), svar0); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetSprite(1174, new WidgetPointer(arg3)); + setWidgetPosition(script_4106(arg4, svar0), 0, 0, 2, new WidgetPointer(arg3)); + } else if (ivar5 < 0) { + ivar5 = subtract(0, ivar5); + if (((boolean)ivar5)) { + svar0 = "1 coin"; + } else { + svar0 = formatNumber(ivar5, 1) + " coins"; + } + setWidgetText(new WidgetPointer(arg2), svar0); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetSprite(1172, new WidgetPointer(arg3)); + setWidgetPosition(script_4106(arg4, svar0), 0, 2, 2, new WidgetPointer(arg3)); + } else { + svar0 = "No net transfer"; + setWidgetText(new WidgetPointer(arg2), svar0); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + } + ivar5 = subtract(globalint_729, globalint_697); + return; +} diff --git a/dumps/scripts/4106.cs2 b/dumps/scripts/4106.cs2 new file mode 100644 index 000000000..a5de3af68 --- /dev/null +++ b/dumps/scripts/4106.cs2 @@ -0,0 +1,3 @@ +int script_4106(int arg0,string arg1) { + return divide(add(getWidgetActualWidth(new WidgetPointer(arg0)), max(getTextWidth(495, arg1), getTextWidth(494, getWidgetText(new WidgetPointer(arg0))))), 2); +} diff --git a/dumps/scripts/4107.cs2 b/dumps/scripts/4107.cs2 new file mode 100644 index 000000000..6d9469721 --- /dev/null +++ b/dumps/scripts/4107.cs2 @@ -0,0 +1,12 @@ +string script_4107(int arg0,int arg1) { + if (arg1 >= 10000000) { + return "" + getItemName(arg0) + "" + " x " + formatNumber(divide(arg1, 1000000), 1) + "M (" + formatNumber(arg1, 1) + ")"; + } + if (arg1 >= 10000) { + return "" + getItemName(arg0) + "" + " x " + formatNumber(divide(arg1, 1000), 1) + "K (" + formatNumber(arg1, 1) + ")"; + } + if (arg1 > 1) { + return "" + getItemName(arg0) + "" + " x " + formatNumber(arg1, 1); + } + return "" + getItemName(arg0) + ""; +} diff --git a/dumps/scripts/4108.cs2 b/dumps/scripts/4108.cs2 new file mode 100644 index 000000000..d77f686eb --- /dev/null +++ b/dumps/scripts/4108.cs2 @@ -0,0 +1,4 @@ +void script_4108(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_4109(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/4109.cs2 b/dumps/scripts/4109.cs2 new file mode 100644 index 000000000..9a0b0ceed --- /dev/null +++ b/dumps/scripts/4109.cs2 @@ -0,0 +1,11 @@ +void script_4109(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + ivar6 = getWidgetActualWidth(new WidgetPointer(arg5)); + arg0 = max(min(arg0, subtract(getWidgetActualWidth(new WidgetPointer(arg4)), ivar6)), 0); + ivar7 = getWidgetActualX(new WidgetPointer(arg4)); + setWidgetSize(add(ivar7, arg0), 0, 0, 1, new WidgetPointer(arg2)); + setWidgetSize(add(add(ivar7, arg0), ivar6), 0, 1, 1, new WidgetPointer(arg3)); + setWidgetPosition(arg0, 0, 0, 1, new WidgetPointer(arg5)); + return; +} diff --git a/dumps/scripts/411.cs2 b/dumps/scripts/411.cs2 new file mode 100644 index 000000000..ca2623792 --- /dev/null +++ b/dumps/scripts/411.cs2 @@ -0,0 +1,4 @@ +void script_411() { + script_304(49122684); + return; +} diff --git a/dumps/scripts/4110.cs2 b/dumps/scripts/4110.cs2 new file mode 100644 index 000000000..6c35e8003 --- /dev/null +++ b/dumps/scripts/4110.cs2 @@ -0,0 +1,30 @@ +void script_4110() { + flow_0: + SWITCH (standart_config_1108) { + case 2: + GOTO flow_1 + case 5: + GOTO flow_2 + } + setWidgetIsHidden(false, new WidgetPointer(106,126)); + setWidgetIsHidden(true, new WidgetPointer(106,131)); + setWidgetIsHidden(true, new WidgetPointer(106,140)); + script_670(); + setWidgetText(new WidgetPointer(106,124), "First, you will see a selection of boxes. You can make several offers simultaneously, one in each box."); + GOTO flow_3 + flow_1: + setWidgetIsHidden(true, new WidgetPointer(106,126)); + setWidgetIsHidden(false, new WidgetPointer(106,131)); + setWidgetIsHidden(true, new WidgetPointer(106,140)); + script_671(); + setWidgetText(new WidgetPointer(106,124), "Each box has two buttons. One button is for offering to buy items, the other is for offering to sell items."); + GOTO flow_3 + flow_2: + setWidgetIsHidden(true, new WidgetPointer(106,126)); + setWidgetIsHidden(true, new WidgetPointer(106,131)); + setWidgetIsHidden(false, new WidgetPointer(106,140)); + script_672(); + setWidgetText(new WidgetPointer(106,124), "Now the offer is placed! You can return to the Grand Exchange at any time to check on the progress of your offers."); + flow_3: + return; +} diff --git a/dumps/scripts/4111.cs2 b/dumps/scripts/4111.cs2 new file mode 100644 index 000000000..232c589a9 --- /dev/null +++ b/dumps/scripts/4111.cs2 @@ -0,0 +1,23 @@ +void script_4111() { + if (standart_config_1108 <= 3) { + setWidgetText(new WidgetPointer(110,84), "If you selected the 'Buy' option, you would see this screen. You can choose an item to buy by clicking on the indicated box."); + setWidgetIsHidden(true, new WidgetPointer(110,85)); + setWidgetText(new WidgetPointer(110,27), "N/A"); + setWidgetIsHidden(false, new WidgetPointer(110,68)); + setWidgetText(new WidgetPointer(110,28), "Choose an item to exchange"); + setWidgetText(new WidgetPointer(110,33), "1"); + setWidgetText(new WidgetPointer(110,38), "1 gp"); + setWidgetText(new WidgetPointer(110,65), "1 gp"); + } else { + setWidgetText(new WidgetPointer(110,84), "You can set how many you wish to buy, and the price you're willing to pay, before clicking the 'Confirm Offer' button. We'll suggest a guide price for the item, but you can offer whatever you like."); + setWidgetIsHidden(false, new WidgetPointer(110,85)); + setItemOnWidgetMethod2205(1381, 1, new WidgetPointer(110,85)); + setWidgetText(new WidgetPointer(110,27), "1,281 gp"); + setWidgetIsHidden(true, new WidgetPointer(110,68)); + setWidgetText(new WidgetPointer(110,28), "Staff of air"); + setWidgetText(new WidgetPointer(110,33), "2"); + setWidgetText(new WidgetPointer(110,38), "1,281 gp"); + setWidgetText(new WidgetPointer(110,65), "2,562 gp"); + } + return; +} diff --git a/dumps/scripts/4112.cs2 b/dumps/scripts/4112.cs2 new file mode 100644 index 000000000..66636aa2d --- /dev/null +++ b/dumps/scripts/4112.cs2 @@ -0,0 +1,25 @@ +void script_4112(int arg0) { + int ivar1; + if (standart_config_1109 == -1) { + return; + } + ivar1 = 0; + if ((arg0 > 100) && (globalint_85 > 2045222520)) { + ivar1 = 2147483647; + } else if ((arg0 < 100) && (globalint_85 <= 1)) { + ivar1 = 1; + } else { + ivar1 = multiplyDivide(arg0, 100, globalint_85); + if (ivar1 == globalint_85) { + if (arg0 >= 100) { + ivar1 = add(ivar1, 1); + } else { + ivar1 = subtract(ivar1, 1); + } + } + } + globalint_85 = ivar1; + setWidgetText(new WidgetPointer(105,153), formatNumber(globalint_85, 1) + " gp"); + script_609(); + return; +} diff --git a/dumps/scripts/4113.cs2 b/dumps/scripts/4113.cs2 new file mode 100644 index 000000000..920fe2ea9 --- /dev/null +++ b/dumps/scripts/4113.cs2 @@ -0,0 +1,4 @@ +void script_4113() { + script_4114(); + return; +} diff --git a/dumps/scripts/4114.cs2 b/dumps/scripts/4114.cs2 new file mode 100644 index 000000000..cffbfe2f9 --- /dev/null +++ b/dumps/scripts/4114.cs2 @@ -0,0 +1,39 @@ +void script_4114() { + int ivar0; + string svar0; + string svar1; + script_662(0); + script_662(1); + script_662(2); + script_662(3); + script_662(4); + script_662(5); + ivar0 = getItemIdInSlot(540, 0); + if (ivar0 == -1) { + setWidgetIsHidden(true, new WidgetPointer(109,45)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(109,1)), 225, 0, 0, new WidgetPointer(109,1)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(109,1)), 225, 0, 0, new WidgetPointer(109,0)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(109,45)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(109,1)), 305, 0, 0, new WidgetPointer(109,1)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(109,1)), 305, 0, 0, new WidgetPointer(109,0)); + setItemOnWidgetMethod2200(ivar0, -1, new WidgetPointer(109,58)); + cs2method2305(new WidgetPointer(109,58), "" + getItemName(ivar0) + ""); + svar0 = "Lent item"; + svar1 = "Still on loan"; + setWidgetText(new WidgetPointer(109,57), svar0); + if ((standart_config_1267 != -1) || (standart_config_1269 > 0)) { + cs2method2103(200, new WidgetPointer(109,58)); + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(109,59)); + setWidgetContextMenuOption(1, new WidgetPointer(109,58), "Demand"); + } else { + cs2method2103(0, new WidgetPointer(109,58)); + setWidgetRGB(new Color(0, 223, 0), new WidgetPointer(109,59)); + svar1 = "Available"; + setWidgetContextMenuOption(1, new WidgetPointer(109,58), "Reclaim"); + } + setWidgetText(new WidgetPointer(109,59), svar1); + setWidgetSize(add(max(max(getTextWidth(495, svar0), getTextWidth(494, svar1)), getWidgetActualWidth(new WidgetPointer(109,58))), 30), getWidgetActualHeight(new WidgetPointer(109,45)), 0, 0, new WidgetPointer(109,45)); + return; +} diff --git a/dumps/scripts/4115.cs2 b/dumps/scripts/4115.cs2 new file mode 100644 index 000000000..5df1842fa --- /dev/null +++ b/dumps/scripts/4115.cs2 @@ -0,0 +1,4 @@ +void script_4115() { + script_304(49794739); + return; +} diff --git a/dumps/scripts/4116.cs2 b/dumps/scripts/4116.cs2 new file mode 100644 index 000000000..f0a6bd2d2 --- /dev/null +++ b/dumps/scripts/4116.cs2 @@ -0,0 +1,4 @@ +void script_4116() { + script_304(50351681); + return; +} diff --git a/dumps/scripts/4117.cs2 b/dumps/scripts/4117.cs2 new file mode 100644 index 000000000..7e26fcf8b --- /dev/null +++ b/dumps/scripts/4117.cs2 @@ -0,0 +1,4 @@ +void script_4117() { + script_304(49466699); + return; +} diff --git a/dumps/scripts/4118.cs2 b/dumps/scripts/4118.cs2 new file mode 100644 index 000000000..1237327a3 --- /dev/null +++ b/dumps/scripts/4118.cs2 @@ -0,0 +1,4 @@ +void script_4118() { + script_304(27465183); + return; +} diff --git a/dumps/scripts/4119.cs2 b/dumps/scripts/4119.cs2 new file mode 100644 index 000000000..a349ff75a --- /dev/null +++ b/dumps/scripts/4119.cs2 @@ -0,0 +1,4 @@ +void script_4119() { + script_304(48408011); + return; +} diff --git a/dumps/scripts/412.cs2 b/dumps/scripts/412.cs2 new file mode 100644 index 000000000..c9aa8e694 --- /dev/null +++ b/dumps/scripts/412.cs2 @@ -0,0 +1,434 @@ +void script_412(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + flow_0: + ivar1 = cameraGetHrot(); + ivar2 = 0; + ivar3 = -1; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + if (globalint_1360 < 10) { + globalint_1360 = add(globalint_1360, 1); + return; + } + if (globalint_1359 < 5) { + globalint_1359 = add(globalint_1359, 1); + return; + } + globalint_1359 = 0; + if (ivar1 < 128) { + ivar1 = 1; + } else if (ivar1 < 256) { + ivar1 = 2; + } else if (ivar1 < 384) { + ivar1 = 3; + } else if (ivar1 < 512) { + ivar1 = 4; + } else if (ivar1 < 640) { + ivar1 = 5; + } else if (ivar1 < 768) { + ivar1 = 6; + } else if (ivar1 < 896) { + ivar1 = 7; + } else if (ivar1 < 1024) { + ivar1 = 8; + } else if (ivar1 < 1152) { + ivar1 = 9; + } else if (ivar1 < 1280) { + ivar1 = 10; + } else if (ivar1 < 1408) { + ivar1 = 11; + } else if (ivar1 < 1536) { + ivar1 = 12; + } else if (ivar1 < 1664) { + ivar1 = 13; + } else if (ivar1 < 1792) { + ivar1 = 14; + } else if (ivar1 < 1920) { + ivar1 = 15; + } else { + ivar1 = 16; + } + SWITCH (arg0) { + case 1: + GOTO flow_37 + case 5: + GOTO flow_47 + case 7: + GOTO flow_57 + case 3: + GOTO flow_67 + case 2: + GOTO flow_77 + case 4: + GOTO flow_87 + case 8: + GOTO flow_97 + case 6: + GOTO flow_107 + } + return; + flow_37: + switch (ivar1) { + case 1: + case 16: + ivar2 = 1; + break; + case 2: + case 3: + ivar2 = 8; + break; + case 4: + case 5: + ivar2 = 7; + break; + case 6: + case 7: + ivar2 = 6; + break; + case 8: + case 9: + ivar2 = 5; + break; + case 10: + case 11: + ivar2 = 4; + break; + case 12: + case 13: + ivar2 = 3; + break; + case 14: + case 15: + ivar2 = 2; + } + GOTO flow_116 + flow_47: + switch (ivar1) { + case 1: + case 16: + ivar2 = 5; + break; + case 2: + case 3: + ivar2 = 4; + break; + case 4: + case 5: + ivar2 = 3; + break; + case 6: + case 7: + ivar2 = 2; + break; + case 8: + case 9: + ivar2 = 1; + break; + case 10: + case 11: + ivar2 = 8; + break; + case 12: + case 13: + ivar2 = 7; + break; + case 14: + case 15: + ivar2 = 6; + } + GOTO flow_116 + flow_57: + switch (ivar1) { + case 1: + case 16: + ivar2 = 7; + break; + case 2: + case 3: + ivar2 = 6; + break; + case 4: + case 5: + ivar2 = 5; + break; + case 6: + case 7: + ivar2 = 4; + break; + case 8: + case 9: + ivar2 = 3; + break; + case 10: + case 11: + ivar2 = 2; + break; + case 12: + case 13: + ivar2 = 1; + break; + case 14: + case 15: + ivar2 = 8; + } + GOTO flow_116 + flow_67: + switch (ivar1) { + case 1: + case 16: + ivar2 = 3; + break; + case 2: + case 3: + ivar2 = 2; + break; + case 4: + case 5: + ivar2 = 1; + break; + case 6: + case 7: + ivar2 = 8; + break; + case 8: + case 9: + ivar2 = 7; + break; + case 10: + case 11: + ivar2 = 6; + break; + case 12: + case 13: + ivar2 = 5; + break; + case 14: + case 15: + ivar2 = 4; + } + GOTO flow_116 + flow_77: + switch (ivar1) { + case 1: + case 16: + ivar2 = 2; + break; + case 2: + case 3: + ivar2 = 1; + break; + case 4: + case 5: + ivar2 = 8; + break; + case 6: + case 7: + ivar2 = 7; + break; + case 8: + case 9: + ivar2 = 6; + break; + case 10: + case 11: + ivar2 = 5; + break; + case 12: + case 13: + ivar2 = 4; + break; + case 14: + case 15: + ivar2 = 3; + } + GOTO flow_116 + flow_87: + switch (ivar1) { + case 1: + case 16: + ivar2 = 4; + break; + case 2: + case 3: + ivar2 = 3; + break; + case 4: + case 5: + ivar2 = 2; + break; + case 6: + case 7: + ivar2 = 1; + break; + case 8: + case 9: + ivar2 = 8; + break; + case 10: + case 11: + ivar2 = 7; + break; + case 12: + case 13: + ivar2 = 6; + break; + case 14: + case 15: + ivar2 = 5; + } + GOTO flow_116 + flow_97: + switch (ivar1) { + case 1: + case 16: + ivar2 = 8; + break; + case 2: + case 3: + ivar2 = 7; + break; + case 4: + case 5: + ivar2 = 6; + break; + case 6: + case 7: + ivar2 = 5; + break; + case 8: + case 9: + ivar2 = 4; + break; + case 10: + case 11: + ivar2 = 3; + break; + case 12: + case 13: + ivar2 = 2; + break; + case 14: + case 15: + ivar2 = 1; + } + GOTO flow_116 + flow_107: + switch (ivar1) { + case 1: + case 16: + ivar2 = 6; + break; + case 2: + case 3: + ivar2 = 5; + break; + case 4: + case 5: + ivar2 = 4; + break; + case 6: + case 7: + ivar2 = 3; + break; + case 8: + case 9: + ivar2 = 2; + break; + case 10: + case 11: + ivar2 = 1; + break; + case 12: + case 13: + ivar2 = 8; + break; + case 14: + case 15: + ivar2 = 7; + } + flow_116: + SWITCH (ivar2) { + case 1: + GOTO flow_117 + case 2: + GOTO flow_118 + case 3: + GOTO flow_119 + case 4: + GOTO flow_120 + case 5: + GOTO flow_121 + case 6: + GOTO flow_122 + case 7: + GOTO flow_123 + case 8: + GOTO flow_124 + } + return; + flow_117: + ivar3 = addToCoordinate(globalint_1353, 0, 0, 1); + GOTO flow_125 + flow_118: + ivar3 = addToCoordinate(globalint_1353, 1, 0, 1); + GOTO flow_125 + flow_119: + ivar3 = addToCoordinate(globalint_1353, 1, 0, 0); + GOTO flow_125 + flow_120: + ivar3 = addToCoordinate(globalint_1353, 1, 0, -1); + GOTO flow_125 + flow_121: + ivar3 = addToCoordinate(globalint_1353, 0, 0, -1); + GOTO flow_125 + flow_122: + ivar3 = addToCoordinate(globalint_1353, -1, 0, -1); + GOTO flow_125 + flow_123: + ivar3 = addToCoordinate(globalint_1353, -1, 0, 0); + GOTO flow_125 + flow_124: + ivar3 = addToCoordinate(globalint_1353, -1, 0, 1); + flow_125: + if (((boolean)globalint_1390)) { + ivar4 = 44; + ivar5 = 35; + ivar6 = 31; + ivar7 = 17; + } else { + ivar4 = 54; + ivar5 = 35; + ivar6 = 36; + ivar7 = 17; + } + if ((((mod(extractX(ivar3), 64) > ivar4) || (mod(extractY(ivar3), 64) > ivar6)) || (mod(extractX(ivar3), 64) < ivar5)) || (mod(extractY(ivar3), 64) < ivar7)) { + setWidgetRGB(new Color(100, 100, 100), new WidgetPointer(1013,19)); + setWidgetRGB(new Color(100, 100, 100), new WidgetPointer(1013,18)); + setWidgetRGB(new Color(100, 100, 100), new WidgetPointer(1013,20)); + setWidgetRGB(new Color(100, 100, 100), new WidgetPointer(1013,21)); + setWidgetRGB(new Color(100, 100, 100), new WidgetPointer(1013,17)); + setWidgetRGB(new Color(100, 100, 100), new WidgetPointer(1013,15)); + setWidgetRGB(new Color(100, 100, 100), new WidgetPointer(1013,16)); + setWidgetRGB(new Color(100, 100, 100), new WidgetPointer(1013,14)); + return; + } + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,19)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,18)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,20)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,21)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,17)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,15)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,16)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,14)); + globalint_1353 = ivar3; + cameraMethod5511(globalint_1353); + return; +} diff --git a/dumps/scripts/4120.cs2 b/dumps/scripts/4120.cs2 new file mode 100644 index 000000000..f3740a209 --- /dev/null +++ b/dumps/scripts/4120.cs2 @@ -0,0 +1,4 @@ +void script_4120() { + script_304(49768380); + return; +} diff --git a/dumps/scripts/4121.cs2 b/dumps/scripts/4121.cs2 new file mode 100644 index 000000000..274fa7d88 --- /dev/null +++ b/dumps/scripts/4121.cs2 @@ -0,0 +1,4 @@ +void script_4121() { + script_304(50407242); + return; +} diff --git a/dumps/scripts/4122.cs2 b/dumps/scripts/4122.cs2 new file mode 100644 index 000000000..41c1fb59c --- /dev/null +++ b/dumps/scripts/4122.cs2 @@ -0,0 +1,6 @@ +void script_4122(int arg0,int arg1,int arg2) { + if (standart_config_852 != -1) { + script_1163(arg0, arg1, arg2, 0, 180, getItemName(standart_config_852)); + } + return; +} diff --git a/dumps/scripts/4123.cs2 b/dumps/scripts/4123.cs2 new file mode 100644 index 000000000..312d83197 --- /dev/null +++ b/dumps/scripts/4123.cs2 @@ -0,0 +1,6 @@ +void script_4123(int arg0,int arg1,int arg2) { + if (standart_config_853 != -1) { + script_1163(arg0, arg1, arg2, 0, 180, getItemName(standart_config_853)); + } + return; +} diff --git a/dumps/scripts/4124.cs2 b/dumps/scripts/4124.cs2 new file mode 100644 index 000000000..a0950650c --- /dev/null +++ b/dumps/scripts/4124.cs2 @@ -0,0 +1,6 @@ +void script_4124(int arg0,int arg1,int arg2) { + if (standart_config_854 != -1) { + script_1163(arg0, arg1, arg2, 0, 180, getItemName(standart_config_854)); + } + return; +} diff --git a/dumps/scripts/4125.cs2 b/dumps/scripts/4125.cs2 new file mode 100644 index 000000000..d4948c399 --- /dev/null +++ b/dumps/scripts/4125.cs2 @@ -0,0 +1,25 @@ +void script_4125(int arg0,int arg1,int arg2,string arg3) { + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + if (setWidgetRegister(new WidgetPointer(arg0))) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = arg2; + stack_dump3 = 718; + stack_dump4 = arg3; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4126.cs2 b/dumps/scripts/4126.cs2 new file mode 100644 index 000000000..ac4d7f213 --- /dev/null +++ b/dumps/scripts/4126.cs2 @@ -0,0 +1,123 @@ +string script_4126(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + string svar0; + string svar1; + int stack_dump0; + cs2func_script_2413_struct(3,0,0) structdump_1; + int stack_dump2; + int stack_dump3; + cs2func_script_4127_struct(3,0,0) structdump_4; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 1; + svar0 = ""; + svar1 = ""; + stack_dump0 = arg0; + structdump_1 = script_2413(stack_dump0); + ivar3 = structdump_1.intpart_2; + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + stack_dump0 = ivar1; + stack_dump2 = ivar2; + stack_dump3 = ivar3; + structdump_4 = script_4127(stack_dump0, stack_dump2, stack_dump3); + ivar3 = structdump_4.intpart_2; + ivar2 = structdump_4.intpart_1; + ivar1 = structdump_4.intpart_0; + if (((boolean)ivar3)) { + return "Black"; + } + if (ivar3 == 255) { + return "White"; + } + if (ivar3 < 97) { + svar0 = "Dark "; + } else if ((ivar3 == 127) && (ivar2 >= 240)) { + svar0 = "Vivid "; + } else if (ivar3 > 157) { + svar0 = "Light "; + } else { + ivar4 = 0; + } + switch (arg0) { + case 65535: + case 255: + case 65280: + case 16744448: + case 8388863: + case 4194559: + case 16711935: + case 16776960: + case 16711680: + svar0 = "Pure "; + ivar4 = 1; + } + if (((boolean)ivar4)) { + if (((boolean)ivar2)) { + svar1 = "grey"; + } + if (ivar1 < 10) { + svar1 = "red"; + } else if (ivar1 < 45) { + svar1 = "orange"; + } else if (ivar1 < 75) { + svar1 = "yellow"; + } else if (ivar1 < 140) { + svar1 = "green"; + } else if (ivar1 < 160) { + svar1 = "turquoise"; + } else if (ivar1 < 195) { + svar1 = "cyan"; + } else if (ivar1 < 250) { + svar1 = "blue"; + } else if (ivar1 < 265) { + svar1 = "indigo"; + } else if (ivar1 < 280) { + svar1 = "violet"; + } else if (ivar1 < 290) { + svar1 = "purple"; + } else if (ivar1 < 305) { + svar1 = "magenta"; + } else if (ivar1 < 345) { + svar1 = "pink"; + } else { + svar1 = "red"; + } + } else { + if (((boolean)ivar2)) { + svar1 = "Grey"; + } + if (ivar1 < 10) { + svar1 = "Red"; + } else if (ivar1 < 45) { + svar1 = "Orange"; + } else if (ivar1 < 75) { + svar1 = "Yellow"; + } else if (ivar1 < 140) { + svar1 = "Green"; + } else if (ivar1 < 160) { + svar1 = "Turquoise"; + } else if (ivar1 < 195) { + svar1 = "Cyan"; + } else if (ivar1 < 250) { + svar1 = "Blue"; + } else if (ivar1 < 265) { + svar1 = "Indigo"; + } else if (ivar1 < 280) { + svar1 = "Violet"; + } else if (ivar1 < 290) { + svar1 = "Purple"; + } else if (ivar1 < 305) { + svar1 = "Magenta"; + } else if (ivar1 < 345) { + svar1 = "Pink"; + } else { + svar1 = "Red"; + } + } + return svar0 + svar1 + "."; +} diff --git a/dumps/scripts/4127.cs2 b/dumps/scripts/4127.cs2 new file mode 100644 index 000000000..356ce31d3 --- /dev/null +++ b/dumps/scripts/4127.cs2 @@ -0,0 +1,31 @@ +cs2func_script_4127_struct(3,0,0) script_4127(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar3 = min(arg0, min(arg1, arg2)); + ivar4 = max(arg0, max(arg1, arg2)); + ivar5 = subtract(ivar4, ivar3); + ivar6 = 0; + ivar7 = 0; + ivar8 = divide(add(ivar3, ivar4), 2); + if (ivar5 != 0) { + if (ivar8 < 128) { + ivar7 = multiplyDivide(ivar5, multiply(2, ivar8), 255); + } else { + ivar7 = multiplyDivide(ivar5, subtract(510, multiply(2, ivar8)), 255); + } + if (arg0 == ivar4) { + ivar6 = multiplyDivide(mod(add(multiplyDivide(subtract(arg1, arg2), ivar5, 10000), 60000), 60000), 10000, 60); + } + if (arg1 == ivar4) { + ivar6 = multiplyDivide(add(multiplyDivide(subtract(arg2, arg0), ivar5, 10000), 20000), 10000, 60); + } + if (arg2 == ivar4) { + ivar6 = multiplyDivide(add(multiplyDivide(subtract(arg0, arg1), ivar5, 10000), 40000), 10000, 60); + } + } + return newstruct cs2func_script_4127_struct(ivar6, ivar7, ivar8); +} diff --git a/dumps/scripts/4128.cs2 b/dumps/scripts/4128.cs2 new file mode 100644 index 000000000..ea962d998 --- /dev/null +++ b/dumps/scripts/4128.cs2 @@ -0,0 +1,15 @@ +void script_4128(int arg0) { + if (globalint_1452 <= 100) { + script_4130(arg0); + return; + } + if (globalint_1452 <= 200) { + script_4131(arg0, script_284(getMyPositionHash())); + return; + } + if (globalint_1452 <= 300) { + script_4132(arg0, script_284(getMyPositionHash())); + return; + } + return; +} diff --git a/dumps/scripts/4129.cs2 b/dumps/scripts/4129.cs2 new file mode 100644 index 000000000..6eb7f1244 --- /dev/null +++ b/dumps/scripts/4129.cs2 @@ -0,0 +1,3 @@ +int script_4129(int arg0,int arg1) { + return addToCoordinate(arg1, subtract(extractX(arg0), extractX(57676160)), subtract(extractZ(arg0), extractZ(57676160)), subtract(extractY(arg0), extractY(57676160))); +} diff --git a/dumps/scripts/413.cs2 b/dumps/scripts/413.cs2 new file mode 100644 index 000000000..50513a23e --- /dev/null +++ b/dumps/scripts/413.cs2 @@ -0,0 +1,7 @@ +void script_413() { + cameraMethod5511(getMyPositionHash()); + globalint_1353 = getMyPositionHash(); + globalint_1359 = 0; + globalint_1360 = 0; + return; +} diff --git a/dumps/scripts/4130.cs2 b/dumps/scripts/4130.cs2 new file mode 100644 index 000000000..8f24af32b --- /dev/null +++ b/dumps/scripts/4130.cs2 @@ -0,0 +1,66 @@ +void script_4130(int arg0) { + int ivar1; + ivar1 = 0; + switch (globalint_1452) { + flow_1: + case 1: + createExtraChild(new WidgetPointer(arg0), 3, ivar1); + setWidgetFilled(1); + setWidgetRGB(new Color(238, 238, 170)); + setWidgetSize(30, 0, 0, 1); + setWidgetPosition(0, 0, 0, 0); + setWidgetHidden(1); + ivar1 = add(ivar1, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar1); + setWidgetSprite(3181); + setWidgetSize(30, 0, 0, 1); + setWidgetPosition(0, 0, 0, 0); + setWidgetHidden(1); + ivar1 = add(ivar1, 1); + createExtraChild(new WidgetPointer(arg0), 3, ivar1); + setWidgetFilled(1); + setWidgetRGB(new Color(238, 238, 170)); + setWidgetSize(30, 0, 0, 1); + setWidgetPosition(0, 0, 2, 2); + setWidgetHidden(1); + ivar1 = add(ivar1, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar1); + setWidgetSprite(3182); + setWidgetSize(30, 0, 0, 1); + setWidgetPosition(0, 0, 2, 2); + setWidgetHidden(1); + ivar1 = add(ivar1, 1); + script_665(0, 50, arg0, ivar1); + GOTO flow_14 + while (true) { + case 2: + if (ivar1 < 4) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar1)) { + setWidgetHidden(0); + } + ivar1 = add(ivar1, 1); + } + } + flow_6: + script_667(50, arg0, ivar1); + break; + case 3: + script_665(0, 50, arg0, 4); + GOTO flow_14 + while (true) { + case 4: + if (ivar1 < 4) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar1)) { + setWidgetHidden(1); + } + ivar1 = add(ivar1, 1); + } + } + script_667(50, arg0, ivar1); + break; + case 5: + deleteAllExtraChilds(new WidgetPointer(arg0)); + } + flow_14: + return; +} diff --git a/dumps/scripts/4131.cs2 b/dumps/scripts/4131.cs2 new file mode 100644 index 000000000..43b60503d --- /dev/null +++ b/dumps/scripts/4131.cs2 @@ -0,0 +1,51 @@ +void script_4131(int arg0,int arg1) { + switch (globalint_1452) { + case 101: + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_4138(0, 50, arg0); + break; + case 102: + cs2method5405(0, 4); + cs2method5405(1, 4); + cs2method5406(0, 0, script_4129(58069409, arg1), 610, script_4129(58069409, arg1), 610, 0); + cs2method5406(1, 0, script_4129(58118559, arg1), 475, script_4129(58118559, arg1), 475, 0); + cs2method5406(0, 1, script_4129(58134945, arg1), 610, script_4129(58167712, arg1), 610, 0); + cs2method5406(1, 1, script_4129(58151326, arg1), 475, script_4129(58167709, arg1), 475, 0); + cs2method5406(0, 2, script_4129(58167711, arg1), 550, script_4129(58167711, arg1), 550, 0); + cs2method5406(1, 2, script_4129(58167708, arg1), 475, script_4129(58167708, arg1), 475, 0); + cs2method5406(0, 3, script_4129(58184098, arg1), 545, script_4129(58184099, arg1), 545, 0); + cs2method5406(1, 3, script_4129(58151338, arg1), 475, script_4129(58151338, arg1), 475, 0); + cameraMethod5502(0, 0, 1000, 1000, 1, 0); + script_4140(30, arg0); + break; + case 103: + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, script_4129(58167711, arg1), 550, script_4129(58167711, arg1), 550, 0); + cs2method5406(1, 0, script_4129(58167708, arg1), 475, script_4129(58167708, arg1), 475, 0); + cs2method5406(0, 1, script_4129(58184098, arg1), 545, script_4129(58184099, arg1), 545, 0); + cs2method5406(1, 1, script_4129(58151338, arg1), 475, script_4129(58151338, arg1), 475, 0); + cs2method5406(0, 2, script_4129(58167717, arg1), 520, script_4129(58167717, arg1), 520, 0); + cs2method5406(1, 2, script_4129(58151338, arg1), 475, script_4129(58151338, arg1), 475, 0); + cameraMethod5502(0, 0, 1000, 1000, 1, 0); + break; + case 104: + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, script_4129(58167717, arg1), 520, script_4129(58167717, arg1), 520, 0); + cs2method5406(1, 0, script_4129(58151338, arg1), 475, script_4129(58151338, arg1), 475, 0); + cs2method5406(0, 1, script_4129(58102180, arg1), 510, script_4129(58036639, arg1), 510, 0); + cs2method5406(1, 1, script_4129(58003872, arg1), 475, script_4129(58003872, arg1), 475, 0); + cameraMethod5502(0, 0, 1000, 1000, 1, 0); + break; + case 105: + script_4138(0, 50, arg0); + break; + case 106: + script_4140(50, arg0); + break; + case 107: + deleteAllExtraChilds(new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4132.cs2 b/dumps/scripts/4132.cs2 new file mode 100644 index 000000000..3edb15aa8 --- /dev/null +++ b/dumps/scripts/4132.cs2 @@ -0,0 +1,32 @@ +void script_4132(int arg0,int arg1) { + switch (globalint_1452) { + case 201: + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 3, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(127, 0, 0)); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 0, 0); + cs2method2103(255); + script_665(0, 50, arg0, 1); + break; + case 202: + script_667(50, arg0, 1); + break; + case 203: + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setScriptCallOnGameloop(4133, new WidgetPointer(arg0), 0, 3, -3, 150, 255, 50, 0, 3581, "Iiiiiiii\u00ab"); + } + break; + case 204: + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_4138(0, 50, arg0); + break; + case 205: + script_4140(50, arg0); + break; + case 206: + deleteAllExtraChilds(new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4133.cs2 b/dumps/scripts/4133.cs2 new file mode 100644 index 000000000..0c9eb9e3e --- /dev/null +++ b/dumps/scripts/4133.cs2 @@ -0,0 +1,36 @@ +void script_4133(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + int ivar9; + int ivar10; + flow_0: + ivar9 = 0; + ivar10 = 0; + IF (arg1 == -1) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (setWidgetRegister(new WidgetPointer(arg0))) + GOTO flow_3 + flow_2: + IF (setWidgetRegister(new WidgetPointer(arg0), arg1)) + GOTO flow_3 + GOTO flow_13 + flow_3: + if (arg7 > 0) { + setScriptCallOnGameloop(4133, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, arg5, arg6, subtract(arg7, 1), arg8, "Iiiiiiii\u00ab"); + return; + } + ivar9 = cs2method1609(); + ivar10 = min(max(add(ivar9, arg2), arg4), arg5); + if ((ivar10 == arg4) || (ivar10 == arg5)) { + if (ivar10 == arg5) { + arg7 = arg6; + } + if ((ivar10 == arg4) && (arg8 != -1)) { + playSoundEffect2False(arg8, 1, 50, 255); + } + setScriptCallOnGameloop(4133, new WidgetPointer(arg0), arg1, arg3, arg2, arg4, arg5, arg6, arg7, arg8, "Iiiiiiii\u00ab"); + } + cs2method2103(ivar10); + flow_13: + return; +} diff --git a/dumps/scripts/4134.cs2 b/dumps/scripts/4134.cs2 new file mode 100644 index 000000000..ff853d600 --- /dev/null +++ b/dumps/scripts/4134.cs2 @@ -0,0 +1,5 @@ +void script_4134(int arg0,int arg1,int arg2,int arg3) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + setWidgetSprite(arg3, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/4135.cs2 b/dumps/scripts/4135.cs2 new file mode 100644 index 000000000..611edf243 --- /dev/null +++ b/dumps/scripts/4135.cs2 @@ -0,0 +1,6 @@ +void script_4135(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + setWidgetSprite(arg3, new WidgetPointer(arg2)); + setWidgetSprite(arg5, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/4136.cs2 b/dumps/scripts/4136.cs2 new file mode 100644 index 000000000..0eca05c4e --- /dev/null +++ b/dumps/scripts/4136.cs2 @@ -0,0 +1,5 @@ +void script_4136() { + playSoundEffect2False(3549, 1, 0, 255, cs2method_4019(25, 25)); + script_675(); + return; +} diff --git a/dumps/scripts/4137.cs2 b/dumps/scripts/4137.cs2 new file mode 100644 index 000000000..71f44b7c7 --- /dev/null +++ b/dumps/scripts/4137.cs2 @@ -0,0 +1,5 @@ +void script_4137() { + playSoundEffect2False(3550, 1, 0, 255, cs2method_4019(25, 25)); + script_675(); + return; +} diff --git a/dumps/scripts/4138.cs2 b/dumps/scripts/4138.cs2 new file mode 100644 index 000000000..fd6751a8e --- /dev/null +++ b/dumps/scripts/4138.cs2 @@ -0,0 +1,11 @@ +void script_4138(int arg0,int arg1,int arg2) { + createExtraChild(new WidgetPointer(arg2), 3, 0); + cs2method2103(255); + setWidgetFilled(1); + setWidgetRGB(new Color(arg0)); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + arg1 = min(arg1, 250); + setScriptCallOnGameloop(4139, add(getClientCycle(), arg1), new WidgetPointer(arg2), "iI"); + return; +} diff --git a/dumps/scripts/4139.cs2 b/dumps/scripts/4139.cs2 new file mode 100644 index 000000000..8e6a8afb6 --- /dev/null +++ b/dumps/scripts/4139.cs2 @@ -0,0 +1,14 @@ +void script_4139(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (setWidgetRegister(new WidgetPointer(arg1), 0)) { + ivar2 = subtract(arg0, getClientCycle()); + if (ivar2 <= 0) { + cs2method2103(0); + setScriptCallOnGameloop(-1, ""); + return; + } + cs2method2103(max(subtract(cs2method1609(), divide(cs2method1609(), ivar2)), 1)); + } + return; +} diff --git a/dumps/scripts/414.cs2 b/dumps/scripts/414.cs2 new file mode 100644 index 000000000..f90d74c1f --- /dev/null +++ b/dumps/scripts/414.cs2 @@ -0,0 +1,48 @@ +void script_414(int arg0) { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,19)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,18)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,20)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,21)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,17)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,15)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,16)); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(1013,14)); + switch (arg0) { + case 66387971: + setWidgetIsHidden(false, new WidgetPointer(1013,19)); + break; + case 66387973: + setWidgetIsHidden(false, new WidgetPointer(1013,18)); + break; + case 66387970: + setWidgetIsHidden(false, new WidgetPointer(1013,20)); + break; + case 66387972: + setWidgetIsHidden(false, new WidgetPointer(1013,21)); + break; + case 66387978: + setWidgetIsHidden(false, new WidgetPointer(1013,17)); + break; + case 66387979: + setWidgetIsHidden(false, new WidgetPointer(1013,17)); + break; + case 66387980: + setWidgetIsHidden(false, new WidgetPointer(1013,15)); + break; + case 66387981: + setWidgetIsHidden(false, new WidgetPointer(1013,15)); + break; + case 66387974: + setWidgetIsHidden(false, new WidgetPointer(1013,16)); + break; + case 66387975: + setWidgetIsHidden(false, new WidgetPointer(1013,16)); + break; + case 66387976: + setWidgetIsHidden(false, new WidgetPointer(1013,14)); + break; + case 66387977: + setWidgetIsHidden(false, new WidgetPointer(1013,14)); + } + return; +} diff --git a/dumps/scripts/4140.cs2 b/dumps/scripts/4140.cs2 new file mode 100644 index 000000000..db86a636a --- /dev/null +++ b/dumps/scripts/4140.cs2 @@ -0,0 +1,10 @@ +void script_4140(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg1), 0)) { + setWidgetFilled(1); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + cs2method2103(0); + setScriptCallOnGameloop(4141, add(getClientCycle(), arg0), new WidgetPointer(arg1), "iI"); + } + return; +} diff --git a/dumps/scripts/4141.cs2 b/dumps/scripts/4141.cs2 new file mode 100644 index 000000000..5fcdc7dba --- /dev/null +++ b/dumps/scripts/4141.cs2 @@ -0,0 +1,17 @@ +void script_4141(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 0; + ivar3 = 0; + if (setWidgetRegister(new WidgetPointer(arg1), 0)) { + ivar2 = subtract(arg0, getClientCycle()); + if (ivar2 <= 0) { + setScriptCallOnGameloop(-1, ""); + deleteExtraChild(); + return; + } + ivar3 = subtract(255, cs2method1609()); + cs2method2103(min(add(cs2method1609(), divide(ivar3, ivar2)), 254)); + } + return; +} diff --git a/dumps/scripts/4142.cs2 b/dumps/scripts/4142.cs2 new file mode 100644 index 000000000..16ff667da --- /dev/null +++ b/dumps/scripts/4142.cs2 @@ -0,0 +1,4 @@ +void script_4142() { + script_4143(); + return; +} diff --git a/dumps/scripts/4143.cs2 b/dumps/scripts/4143.cs2 new file mode 100644 index 000000000..15dadd308 --- /dev/null +++ b/dumps/scripts/4143.cs2 @@ -0,0 +1,18 @@ +void script_4143() { + string svar0; + svar0 = "null"; + if (((boolean)bitconfig_8780)) { + setWidgetSprite(4584, new WidgetPointer(261,3)); + svar0 = "Toggle Profanity Filter" + "
" + "(filter is currently off)"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(261,22), svar0, 25, 180, "IIsii", new WidgetPointer(261,3)); + globalint_2 = 0; + } else { + if (((boolean)bitconfig_8780)) { + setWidgetSprite(4583, new WidgetPointer(261,3)); + svar0 = "Toggle Profanity Filter" + "
" + "(filter is currently on)"; + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(261,22), svar0, 25, 180, "IIsii", new WidgetPointer(261,3)); + globalint_2 = 0; + } + } + return; +} diff --git a/dumps/scripts/4144.cs2 b/dumps/scripts/4144.cs2 new file mode 100644 index 000000000..47581c6ec --- /dev/null +++ b/dumps/scripts/4144.cs2 @@ -0,0 +1,16 @@ +void script_4144(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(arg1)), 495, globalstring_343), 12), 5); + setWidgetSize(0, ivar3, 1, 0, new WidgetPointer(arg1)); + setWidgetScrollMax(0, ivar3, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg1), globalstring_343); + if (ivar3 <= getWidgetActualHeight(new WidgetPointer(arg0))) { + deleteAllExtraChilds(new WidgetPointer(arg2)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(arg2)); + script_31(arg2, arg0, 798, 795, 796, 797, 793, 794); + return; +} diff --git a/dumps/scripts/4145.cs2 b/dumps/scripts/4145.cs2 new file mode 100644 index 000000000..dff59b6e4 --- /dev/null +++ b/dumps/scripts/4145.cs2 @@ -0,0 +1,12 @@ +void script_4145(int arg0,int arg1) { + if (globalint_98 >= 1) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + cs2method2310(new WidgetPointer(arg0), "I don't know it."); + setWidgetPosition(0, subtract(0, divide(getWidgetActualHeight(new WidgetPointer(arg1)), 2)), 1, 1, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetNoOptions(new WidgetPointer(arg0)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/4146.cs2 b/dumps/scripts/4146.cs2 new file mode 100644 index 000000000..e0b13f9d3 --- /dev/null +++ b/dumps/scripts/4146.cs2 @@ -0,0 +1,75 @@ +void script_4146() { + int ivar0; + ivar0 = 0; + if (isBitFlagged(globalint_98, 31)) { + setWidgetIsHidden(true, new WidgetPointer(14,13)); + setWidgetIsHidden(false, new WidgetPointer(14,31)); + script_915(917537); + script_915(917539); + } else { + flow_2: + setWidgetIsHidden(false, new WidgetPointer(14,13)); + setWidgetIsHidden(true, new WidgetPointer(14,31)); + script_1088(917518, 0); + script_1298(917520, 0, 0, 0); + script_1088(917525, 19); + ivar0 = subtract(getWidgetActualHeight(new WidgetPointer(14,16)), 14); + SWITCH (bitAnd(globalint_98, 3)) { + case 0: + GOTO flow_3 + case 3: + GOTO flow_5 + } + GOTO flow_4 + flow_3: + setWidgetText(new WidgetPointer(14,23), "No PIN set"); + ivar0 = divide(ivar0, 2); + script_4147(917522, ivar0, divide(subtract(0, ivar0), 2), "Set a PIN"); + script_4147(917523, ivar0, divide(ivar0, 2), "Change recovery delay"); + setWidgetIsHidden(true, new WidgetPointer(14,20)); + GOTO flow_6 + flow_4: + setWidgetText(new WidgetPointer(14,23), "You have a PIN"); + ivar0 = divide(ivar0, 3); + script_4147(917522, ivar0, subtract(0, ivar0), "Change your PIN"); + script_4147(917523, ivar0, 0, "Delete your PIN"); + script_4147(917524, ivar0, ivar0, "Change recovery delay"); + GOTO flow_6 + flow_5: + setWidgetText(new WidgetPointer(14,23), "PIN coming soon"); + ivar0 = min(ivar0, 50); + script_4147(917522, ivar0, 0, "Cancel the PIN"); + setWidgetIsHidden(true, new WidgetPointer(14,19)); + setWidgetIsHidden(true, new WidgetPointer(14,20)); + flow_6: + if (isBitFlagged(globalint_98, 10)) { + setWidgetText(new WidgetPointer(14,25), "7 days"); + } else { + setWidgetText(new WidgetPointer(14,25), "3 days"); + } + } + deleteAllExtraChilds(new WidgetPointer(14,28)); + createExtraChild(new WidgetPointer(14,28), 4, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(globalstring_344); + if (add(multiply(getLineCount(subtract(getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(14,28)))), 14), 495, globalstring_344), 12), 5) <= getWidgetActualHeight(new WidgetPointer(14,28))) { + setWidgetSize(14, 40, 1, 1, new WidgetPointer(14,28)); + setWidgetScrollMax(0, 0, new WidgetPointer(14,28)); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(0, 0, 1, 1); + setWidgetIsHidden(true, new WidgetPointer(14,29)); + return; + } + setWidgetSize(31, 40, 1, 1, new WidgetPointer(14,28)); + ivar0 = add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(14,28)), 495, globalstring_344), 12), 5); + setWidgetScrollMax(0, ivar0, new WidgetPointer(14,28)); + cs2method2100(0, 0, new WidgetPointer(14,28)); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(0, ivar0, 1, 0); + setWidgetIsHidden(false, new WidgetPointer(14,29)); + script_31(917533, 917532, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/4147.cs2 b/dumps/scripts/4147.cs2 new file mode 100644 index 000000000..cedf039b5 --- /dev/null +++ b/dumps/scripts/4147.cs2 @@ -0,0 +1,10 @@ +void script_4147(int arg0,int arg1,int arg2,string arg3) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + cs2method2310(new WidgetPointer(arg0), arg3); + setWidgetSize(16, arg1, 1, 0, new WidgetPointer(arg0)); + setWidgetPosition(0, arg2, 1, 1, new WidgetPointer(arg0)); + script_4149(arg0, 0, arg3); + setScriptCallOnMouseOver(4148, new WidgetPointer(arg0), arg3, 1, "Is1", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4148, new WidgetPointer(arg0), arg3, 0, "Is1", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4148.cs2 b/dumps/scripts/4148.cs2 new file mode 100644 index 000000000..7629fb191 --- /dev/null +++ b/dumps/scripts/4148.cs2 @@ -0,0 +1,4 @@ +void script_4148(int arg0,int arg1,string arg2) { + script_4149(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4149.cs2 b/dumps/scripts/4149.cs2 new file mode 100644 index 000000000..cd72afdaa --- /dev/null +++ b/dumps/scripts/4149.cs2 @@ -0,0 +1,20 @@ +void script_4149(int arg0,int arg1,string arg2) { + if (((boolean)arg1)) { + script_1361(arg0); + } else { + script_915(arg0); + } + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(495); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(1, 1, 0); + if (((boolean)arg1)) { + setWidgetRGB(new Color(255, 255, 255)); + } else { + setWidgetRGB(new Color(255, 152, 31)); + } + setWidgetText(arg2); + return; +} diff --git a/dumps/scripts/415.cs2 b/dumps/scripts/415.cs2 new file mode 100644 index 000000000..14fc7990d --- /dev/null +++ b/dumps/scripts/415.cs2 @@ -0,0 +1,12 @@ +void script_415() { + setWidgetIsHidden(true, new WidgetPointer(1013,19)); + setWidgetIsHidden(true, new WidgetPointer(1013,18)); + setWidgetIsHidden(true, new WidgetPointer(1013,20)); + setWidgetIsHidden(true, new WidgetPointer(1013,21)); + setWidgetIsHidden(true, new WidgetPointer(1013,17)); + setWidgetIsHidden(true, new WidgetPointer(1013,15)); + setWidgetIsHidden(true, new WidgetPointer(1013,16)); + setWidgetIsHidden(true, new WidgetPointer(1013,14)); + globalint_1360 = 0; + return; +} diff --git a/dumps/scripts/4150.cs2 b/dumps/scripts/4150.cs2 new file mode 100644 index 000000000..105834ea6 --- /dev/null +++ b/dumps/scripts/4150.cs2 @@ -0,0 +1,4 @@ +void script_4150() { + script_71(4); + return; +} diff --git a/dumps/scripts/4151.cs2 b/dumps/scripts/4151.cs2 new file mode 100644 index 000000000..1de004be4 --- /dev/null +++ b/dumps/scripts/4151.cs2 @@ -0,0 +1,4 @@ +void script_4151(int arg0) { + script_4211(arg0, 4040, 920849, 11442273); + return; +} diff --git a/dumps/scripts/4152.cs2 b/dumps/scripts/4152.cs2 new file mode 100644 index 000000000..129323c7a --- /dev/null +++ b/dumps/scripts/4152.cs2 @@ -0,0 +1,4 @@ +void script_4152(int arg0,string arg1) { + script_4212(arg0, 4040, 920849, 11442273, arg1); + return; +} diff --git a/dumps/scripts/4153.cs2 b/dumps/scripts/4153.cs2 new file mode 100644 index 000000000..f811323df --- /dev/null +++ b/dumps/scripts/4153.cs2 @@ -0,0 +1,10 @@ +void script_4153() { + if (((boolean)bitconfig_4466)) { + setWidgetSprite(1135, new WidgetPointer(1108,33)); + } else { + if (((boolean)bitconfig_4466)) { + setWidgetSprite(1134, new WidgetPointer(1108,33)); + } + } + return; +} diff --git a/dumps/scripts/4154.cs2 b/dumps/scripts/4154.cs2 new file mode 100644 index 000000000..8b71656f0 --- /dev/null +++ b/dumps/scripts/4154.cs2 @@ -0,0 +1,4 @@ +void script_4154(int arg0) { + script_4155(arg0, 4597, 4596, 4607, 4606, 4617, 4616); + return; +} diff --git a/dumps/scripts/4155.cs2 b/dumps/scripts/4155.cs2 new file mode 100644 index 000000000..79c85e1eb --- /dev/null +++ b/dumps/scripts/4155.cs2 @@ -0,0 +1,54 @@ +void script_4155(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 255, 0, "Iii", new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(24, 22, 1, 1); + setWidgetSprite(arg6); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(24, 12, 1, 0); + setWidgetSprite(arg2); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(24, 12, 1, 0); + setWidgetSprite(arg4); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(12, 24, 0, 1); + setWidgetSprite(arg5); + setWidgetHFlip(1); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(12, 24, 0, 1); + setWidgetSprite(arg5); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(arg1); + setWidgetHFlip(1); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(arg3); + setWidgetHFlip(1); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(arg1); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(arg3); + cs2method2103(255); + return; +} diff --git a/dumps/scripts/4156.cs2 b/dumps/scripts/4156.cs2 new file mode 100644 index 000000000..f5581896f --- /dev/null +++ b/dumps/scripts/4156.cs2 @@ -0,0 +1,4 @@ +void script_4156(int arg0) { + script_4157(arg0); + return; +} diff --git a/dumps/scripts/4157.cs2 b/dumps/scripts/4157.cs2 new file mode 100644 index 000000000..fbd1b6809 --- /dev/null +++ b/dumps/scripts/4157.cs2 @@ -0,0 +1,4 @@ +void script_4157(int arg0) { + script_4158(arg0, 4599, 4598, 4609, 4608, 4619, 4618); + return; +} diff --git a/dumps/scripts/4158.cs2 b/dumps/scripts/4158.cs2 new file mode 100644 index 000000000..6150323b7 --- /dev/null +++ b/dumps/scripts/4158.cs2 @@ -0,0 +1,54 @@ +void script_4158(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(24, 22, 1, 1); + setWidgetSprite(arg6); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(24, 12, 1, 0); + setWidgetSprite(arg2); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(24, 12, 1, 0); + setWidgetSprite(arg4); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(12, 24, 0, 1); + setWidgetSprite(arg5); + setWidgetHFlip(1); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(12, 24, 0, 1); + setWidgetSprite(arg5); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(arg1); + setWidgetHFlip(1); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(arg3); + setWidgetHFlip(1); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(arg1); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(arg3); + cs2method2103(255); + return; +} diff --git a/dumps/scripts/4159.cs2 b/dumps/scripts/4159.cs2 new file mode 100644 index 000000000..7102a6c70 --- /dev/null +++ b/dumps/scripts/4159.cs2 @@ -0,0 +1,4 @@ +void script_4159(int arg0,int arg1,int arg2) { + script_4160(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/416.cs2 b/dumps/scripts/416.cs2 new file mode 100644 index 000000000..2045210df --- /dev/null +++ b/dumps/scripts/416.cs2 @@ -0,0 +1,11 @@ +void script_416(int arg0) { + int ivar1; + ivar1 = getWidgetShadeColor(new WidgetPointer(arg0)); + ivar1 = add(ivar1, 2); + if (ivar1 < 255) { + cs2method2103(ivar1, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4160.cs2 b/dumps/scripts/4160.cs2 new file mode 100644 index 000000000..f59ee31a2 --- /dev/null +++ b/dumps/scripts/4160.cs2 @@ -0,0 +1,39 @@ +void script_4160(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + flow_0: + if (arg2 > 0) { + setScriptCallOnGameloop(4159, new WidgetPointer(-32768,3), arg1, subtract(arg2, 1), "Iii", new WidgetPointer(arg0)); + return; + } + ivar3 = 0; + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + ivar3 = cs2method1609(); + if (((boolean)arg1)) { + ivar4 = subtract(ivar3, 22); + } else { + ivar4 = add(ivar3, 22); + } + ivar4 = max(ivar4, 0); + ivar4 = min(ivar4, 255); + } + IF (((boolean)ivar4)) + GOTO flow_8 + GOTO flow_9 + flow_8: + IF (((boolean)arg1)) + GOTO flow_11 + flow_9: + IF ((ivar4 == 255) && ((boolean)arg1)) + GOTO flow_11 + GOTO flow_12 + flow_11: + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + GOTO flow_13 + flow_12: + setScriptCallOnGameloop(4159, new WidgetPointer(-32768,3), arg1, 0, "Iii", new WidgetPointer(arg0)); + flow_13: + script_4161(arg0, ivar4); + return; +} diff --git a/dumps/scripts/4161.cs2 b/dumps/scripts/4161.cs2 new file mode 100644 index 000000000..aafdbbebd --- /dev/null +++ b/dumps/scripts/4161.cs2 @@ -0,0 +1,11 @@ +void script_4161(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + while (ivar2 < getExtraChildGap(new WidgetPointer(arg0))) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar2)) { + cs2method2103(arg1); + } + ivar2 = add(ivar2, 1); + } + return; +} diff --git a/dumps/scripts/4162.cs2 b/dumps/scripts/4162.cs2 new file mode 100644 index 000000000..f506533e4 --- /dev/null +++ b/dumps/scripts/4162.cs2 @@ -0,0 +1,4 @@ +void script_4162(int arg0) { + script_4161(arg0, 0); + return; +} diff --git a/dumps/scripts/4163.cs2 b/dumps/scripts/4163.cs2 new file mode 100644 index 000000000..2ab5f38f9 --- /dev/null +++ b/dumps/scripts/4163.cs2 @@ -0,0 +1,4 @@ +void script_4163(int arg0) { + script_4161(arg0, 255); + return; +} diff --git a/dumps/scripts/4164.cs2 b/dumps/scripts/4164.cs2 new file mode 100644 index 000000000..25b68e687 --- /dev/null +++ b/dumps/scripts/4164.cs2 @@ -0,0 +1,4 @@ +void script_4164(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_4165(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + return; +} diff --git a/dumps/scripts/4165.cs2 b/dumps/scripts/4165.cs2 new file mode 100644 index 000000000..3f90a0dee --- /dev/null +++ b/dumps/scripts/4165.cs2 @@ -0,0 +1,7 @@ +void script_4165(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + setWidgetSprite(arg3, new WidgetPointer(arg2)); + setWidgetSprite(arg5, new WidgetPointer(arg4)); + setWidgetSprite(arg7, new WidgetPointer(arg6)); + return; +} diff --git a/dumps/scripts/4166.cs2 b/dumps/scripts/4166.cs2 new file mode 100644 index 000000000..b1b176075 --- /dev/null +++ b/dumps/scripts/4166.cs2 @@ -0,0 +1,32 @@ +void script_4166(int arg0,int arg1,int arg2,int arg3,string arg4,string arg5) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_4178(0, arg2, 0); + if (isMember() && ((boolean)arg3)) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; + } + createExtraChild(new WidgetPointer(arg0), 3, 0); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 0, 0)); + setWidgetHidden(1); + setScriptCallOnGameloop(4175, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), arg2, 0, "Iii1", new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, 1); + setWidgetSize(15, 15, 0, 0); + setWidgetPosition(10, 0, 0, 1); + script_4169(arg2); + setScriptCallOnConfigChange(4168, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), arg2, 286, 1, "IiiY", new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 4, 2); + setWidgetSize(35, 0, 1, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(true); + setWidgetText(arg4); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(arg1), arg5, 25, 200, "IiIsii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4167, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), new WidgetPointer(arg1), "IiI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4167.cs2 b/dumps/scripts/4167.cs2 new file mode 100644 index 000000000..308d3456c --- /dev/null +++ b/dumps/scripts/4167.cs2 @@ -0,0 +1,7 @@ +void script_4167(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetRGB(new Color(255, 152, 31)); + } + script_41(arg2); + return; +} diff --git a/dumps/scripts/4168.cs2 b/dumps/scripts/4168.cs2 new file mode 100644 index 000000000..88d214888 --- /dev/null +++ b/dumps/scripts/4168.cs2 @@ -0,0 +1,6 @@ +void script_4168(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + script_4169(arg2); + } + return; +} diff --git a/dumps/scripts/4169.cs2 b/dumps/scripts/4169.cs2 new file mode 100644 index 000000000..fbcd550a3 --- /dev/null +++ b/dumps/scripts/4169.cs2 @@ -0,0 +1,8 @@ +void script_4169(int arg0) { + if (isBitFlagged(standart_config_286, arg0)) { + setWidgetSprite(1135); + } else { + setWidgetSprite(1134); + } + return; +} diff --git a/dumps/scripts/417.cs2 b/dumps/scripts/417.cs2 new file mode 100644 index 000000000..9adacf34a --- /dev/null +++ b/dumps/scripts/417.cs2 @@ -0,0 +1,13 @@ +void script_417(int arg0) { + int ivar1; + ivar1 = getWidgetShadeColor(new WidgetPointer(arg0)); + if (((boolean)globalint_1387)) { + ivar1 = add(ivar1, 2); + if (ivar1 < 255) { + cs2method2103(ivar1, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/4170.cs2 b/dumps/scripts/4170.cs2 new file mode 100644 index 000000000..fdbd8ff18 --- /dev/null +++ b/dumps/scripts/4170.cs2 @@ -0,0 +1,26 @@ +void script_4170(int arg0,int arg1,int arg2,string arg3) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_4178(1, arg2, 0); + createExtraChild(new WidgetPointer(arg0), 5, 0); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(170); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(arg1), arg3, 25, 200, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(arg1), "I"); + createExtraChild(new WidgetPointer(arg0), 5, 1); + script_4172(arg2); + setScriptCallOnItemContainerUpdate(4171, new WidgetPointer(-32768,3), -2147483643, arg2, 94, 1, "IiiY"); + createExtraChild(new WidgetPointer(arg0), 5, 2); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(1132); + script_4174(arg2); + setScriptCallOnConfigChange(4173, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), arg2, 286, 1, "IiiY"); + createExtraChild(new WidgetPointer(arg0), 5, 3); + setWidgetSize(10, 32, 0, 0); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(937); + setWidgetHidden(1); + setScriptCallOnGameloop(4175, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), arg2, 1, "Iii1"); + return; +} diff --git a/dumps/scripts/4171.cs2 b/dumps/scripts/4171.cs2 new file mode 100644 index 000000000..157a788a3 --- /dev/null +++ b/dumps/scripts/4171.cs2 @@ -0,0 +1,6 @@ +void script_4171(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + script_4172(arg2); + } + return; +} diff --git a/dumps/scripts/4172.cs2 b/dumps/scripts/4172.cs2 new file mode 100644 index 000000000..82f12909d --- /dev/null +++ b/dumps/scripts/4172.cs2 @@ -0,0 +1,18 @@ +void script_4172(int arg0) { + int ivar1; + ivar1 = getItemIdInSlot(94, arg0); + if (ivar1 != -1) { + setWidgetSize(36, 32, 0, 0); + setItemOnWidgetMethod1200(ivar1, getItemAmtInSlot(94, arg0)); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + setWidgetPosition(2, 0, 1, 1); + } else { + setWidgetSize(32, 32, 0, 0); + setWidgetSprite(cs2method_3408(105, 100, 796, arg0)); + setWidgetShadowColor(new Color(0, 0, 0)); + setWidgetBorderThickness(0); + setWidgetPosition(0, 0, 1, 1); + } + return; +} diff --git a/dumps/scripts/4173.cs2 b/dumps/scripts/4173.cs2 new file mode 100644 index 000000000..07672289a --- /dev/null +++ b/dumps/scripts/4173.cs2 @@ -0,0 +1,6 @@ +void script_4173(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + script_4174(arg2); + } + return; +} diff --git a/dumps/scripts/4174.cs2 b/dumps/scripts/4174.cs2 new file mode 100644 index 000000000..404796cbc --- /dev/null +++ b/dumps/scripts/4174.cs2 @@ -0,0 +1,8 @@ +void script_4174(int arg0) { + if (isBitFlagged(bitconfig_642, arg0)) { + setWidgetHidden(0); + } else { + setWidgetHidden(1); + } + return; +} diff --git a/dumps/scripts/4175.cs2 b/dumps/scripts/4175.cs2 new file mode 100644 index 000000000..9794ed683 --- /dev/null +++ b/dumps/scripts/4175.cs2 @@ -0,0 +1,19 @@ +void script_4175(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = subtract(getClientCycle(), script_4176(arg3, arg2)); + if ((ivar4 >= 255) || (ivar4 < 0)) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetHidden(1); + } + return; + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetHidden(0); + if (mod(ivar4, 40) > 20) { + cs2method2103(255); + } else { + cs2method2103(ivar4); + } + } + return; +} diff --git a/dumps/scripts/4176.cs2 b/dumps/scripts/4176.cs2 new file mode 100644 index 000000000..9a7df7129 --- /dev/null +++ b/dumps/scripts/4176.cs2 @@ -0,0 +1,56 @@ +int script_4176(int arg0,int arg1) { + if (((boolean)arg0)) { + switch (arg1) { + case 0: + return globalint_1465; + case 1: + return globalint_1466; + case 2: + return globalint_1467; + case 3: + return globalint_740; + case 4: + return globalint_745; + case 5: + return globalint_780; + case 7: + return globalint_781; + case 9: + return globalint_782; + case 10: + return globalint_789; + case 12: + return globalint_1409; + case 13: + return globalint_1410; + } + } else { + switch (arg1) { + case 0: + return globalint_1453; + case 1: + return globalint_1454; + case 4: + return globalint_1455; + case 5: + return globalint_1456; + case 6: + return globalint_1457; + case 7: + return globalint_1458; + case 8: + return globalint_1459; + case 9: + return globalint_1460; + case 10: + return globalint_1461; + case 12: + return globalint_1462; + case 13: + return globalint_1463; + case 28: + return globalint_1464; + } + } + return -1; +} diff --git a/dumps/scripts/4177.cs2 b/dumps/scripts/4177.cs2 new file mode 100644 index 000000000..96d823d8b --- /dev/null +++ b/dumps/scripts/4177.cs2 @@ -0,0 +1,4 @@ +void script_4177(int arg0,int arg1,int arg2) { + script_4178(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4178.cs2 b/dumps/scripts/4178.cs2 new file mode 100644 index 000000000..f630aadee --- /dev/null +++ b/dumps/scripts/4178.cs2 @@ -0,0 +1,169 @@ +void script_4178(int arg0,int arg1,int arg2) { + if (((boolean)arg0)) { + switch (arg1) { + case 0: + if (((boolean)arg2)) { + globalint_1465 = getClientCycle(); + } else { + globalint_1465 = 0; + } + break; + case 1: + if (((boolean)arg2)) { + globalint_1466 = getClientCycle(); + } else { + globalint_1466 = 0; + } + break; + case 2: + if (((boolean)arg2)) { + globalint_1467 = getClientCycle(); + } else { + globalint_1467 = 0; + } + break; + case 3: + if (((boolean)arg2)) { + globalint_740 = getClientCycle(); + } else { + globalint_740 = 0; + } + break; + case 4: + if (((boolean)arg2)) { + globalint_745 = getClientCycle(); + } else { + globalint_745 = 0; + } + break; + case 5: + if (((boolean)arg2)) { + globalint_780 = getClientCycle(); + } else { + globalint_780 = 0; + } + break; + case 7: + if (((boolean)arg2)) { + globalint_781 = getClientCycle(); + } else { + globalint_781 = 0; + } + break; + case 9: + if (((boolean)arg2)) { + globalint_782 = getClientCycle(); + } else { + globalint_782 = 0; + } + break; + case 10: + if (((boolean)arg2)) { + globalint_789 = getClientCycle(); + } else { + globalint_789 = 0; + } + break; + case 12: + if (((boolean)arg2)) { + globalint_1409 = getClientCycle(); + } else { + globalint_1409 = 0; + } + break; + case 13: + if (((boolean)arg2)) { + globalint_1410 = getClientCycle(); + } else { + globalint_1410 = 0; + } + } + } else { + switch (arg1) { + case 0: + if (((boolean)arg2)) { + globalint_1453 = getClientCycle(); + } else { + globalint_1453 = 0; + } + break; + case 1: + if (((boolean)arg2)) { + globalint_1454 = getClientCycle(); + } else { + globalint_1454 = 0; + } + break; + case 4: + if (((boolean)arg2)) { + globalint_1455 = getClientCycle(); + } else { + globalint_1455 = 0; + } + break; + case 5: + if (((boolean)arg2)) { + globalint_1456 = getClientCycle(); + } else { + globalint_1456 = 0; + } + break; + case 6: + if (((boolean)arg2)) { + globalint_1457 = getClientCycle(); + } else { + globalint_1453 = 6; + } + break; + case 7: + if (((boolean)arg2)) { + globalint_1458 = getClientCycle(); + } else { + globalint_1453 = 7; + } + break; + case 8: + if (((boolean)arg2)) { + globalint_1459 = getClientCycle(); + } else { + globalint_1453 = 8; + } + break; + case 9: + if (((boolean)arg2)) { + globalint_1460 = getClientCycle(); + } else { + globalint_1453 = 9; + } + break; + case 10: + if (((boolean)arg2)) { + globalint_1461 = getClientCycle(); + } else { + globalint_1461 = 0; + } + break; + case 12: + if (((boolean)arg2)) { + globalint_1462 = getClientCycle(); + } else { + globalint_1462 = 0; + } + break; + case 13: + if (((boolean)arg2)) { + globalint_1463 = getClientCycle(); + } else { + globalint_1463 = 0; + } + break; + case 28: + if (((boolean)arg2)) { + globalint_1464 = getClientCycle(); + } else { + globalint_1464 = 0; + } + } + } + return; +} diff --git a/dumps/scripts/4179.cs2 b/dumps/scripts/4179.cs2 new file mode 100644 index 000000000..ffd222e39 --- /dev/null +++ b/dumps/scripts/4179.cs2 @@ -0,0 +1,121 @@ +void script_4179(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + string svar0; + ivar4 = script_4180(0, arg0, 0, "Boosted stats will be reset."); + if (bitconfig_642 > 0) { + ivar4 = script_4180(ivar4, arg0, 0, "Some worn items will be taken off."); + } + if (((boolean)bitconfig_4166)) { + ivar4 = script_4180(ivar4, arg0, 0, "Existing prayers will be stopped."); + } + if (ivar4 > getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetScrollMax(0, ivar4, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetPosition(0, 0, 0, 1, new WidgetPointer(arg0)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(arg0)); + } + ivar5 = 0; + if (isMember() && ((((((((getItemAmtInContainer(93, 10148) > 0) || (getItemAmtInContainer(94, 10148) > 0)) || (getItemAmtInContainer(93, 10147) > 0)) || (getItemAmtInContainer(94, 10147) > 0)) || (getItemAmtInContainer(93, 10146) > 0)) || (getItemAmtInContainer(94, 10146) > 0)) || (getItemAmtInContainer(93, 10149) > 0)) || (getItemAmtInContainer(94, 10149) > 0))) { + ivar5 = 1; + } + ivar4 = 0; + if (((boolean)bitconfig_4159)) { + ivar4 = script_4180(ivar4, arg2, globalint_1453, "You cannot forfeit the duel."); + } + if (((boolean)bitconfig_4160)) { + ivar4 = script_4180(ivar4, arg2, globalint_1454, "You cannot move."); + } + if (((boolean)bitconfig_4275)) { + ivar4 = script_4180(ivar4, arg2, globalint_1464, "You can summon familiars."); + } + svar0 = "You cannot use Ranged attacks."; + if (((boolean)bitconfig_4161)) { + if (((boolean)ivar5)) { + svar0 = "You cannot use Ranged attacks " + "" + "or salamanders" + "" + "."; + } + ivar4 = script_4180(ivar4, arg2, globalint_1455, svar0); + } + svar0 = "You cannot use melee attacks."; + if (((boolean)bitconfig_4162)) { + if (((boolean)ivar5)) { + svar0 = "You cannot use melee attacks " + "" + "or salamanders" + "" + "."; + } + ivar4 = script_4180(ivar4, arg2, globalint_1456, svar0); + } + svar0 = "You cannot use Magic attacks."; + if (((boolean)bitconfig_4163)) { + if (((boolean)ivar5)) { + svar0 = "You cannot use Magic attacks " + "" + "or salamanders" + "" + "."; + } + ivar4 = script_4180(ivar4, arg2, globalint_1457, svar0); + } + if (((boolean)bitconfig_4169)) { + ivar4 = script_4180(ivar4, arg2, globalint_1463, "You cannot use special attacks."); + } + if (((boolean)bitconfig_4168)) { + ivar4 = script_4180(ivar4, arg2, globalint_1462, "You can only attack with 'fun' weapons."); + } + if (((boolean)bitconfig_4164)) { + ivar4 = script_4180(ivar4, arg2, globalint_1458, "You cannot use drinks."); + } + if (((boolean)bitconfig_4165)) { + ivar4 = script_4180(ivar4, arg2, globalint_1459, "You cannot use food."); + } + if (((boolean)bitconfig_4166)) { + ivar4 = script_4180(ivar4, arg2, globalint_1460, "You cannot use Prayer."); + } + if (((boolean)bitconfig_4167)) { + ivar4 = script_4180(ivar4, arg2, globalint_1461, "There will be obstacles in the arena."); + } + if (isBitFlagged(bitconfig_642, 0)) { + ivar4 = script_4180(ivar4, arg2, globalint_1465, "You cannot wear items on your head."); + } + if (isBitFlagged(bitconfig_642, 1)) { + ivar4 = script_4180(ivar4, arg2, globalint_1466, "You cannot wear items on your back, such as capes."); + } + if (isBitFlagged(bitconfig_642, 2)) { + ivar4 = script_4180(ivar4, arg2, globalint_1467, "You cannot wear items on your front, such as amulets."); + } + if (isBitFlagged(bitconfig_642, 3)) { + ivar4 = script_4180(ivar4, arg2, globalint_740, "You cannot wield items in your right hand."); + } + if (isBitFlagged(bitconfig_642, 4)) { + ivar4 = script_4180(ivar4, arg2, globalint_745, "You cannot wear items on your torso."); + } + if (isBitFlagged(bitconfig_642, 5)) { + ivar4 = script_4180(ivar4, arg2, globalint_780, "You cannot wield items in your left hand or use 2-handed weapons."); + } + if (isBitFlagged(bitconfig_642, 7)) { + ivar4 = script_4180(ivar4, arg2, globalint_781, "You cannot wear items on your legs."); + } + if (isBitFlagged(bitconfig_642, 9)) { + ivar4 = script_4180(ivar4, arg2, globalint_782, "You cannot wear items on your hands."); + } + if (isBitFlagged(bitconfig_642, 10)) { + ivar4 = script_4180(ivar4, arg2, globalint_789, "You cannot wear items on your feet."); + } + if (isBitFlagged(bitconfig_642, 12)) { + ivar4 = script_4180(ivar4, arg2, globalint_1409, "You cannot use your ring slot."); + } + if (isBitFlagged(bitconfig_642, 13)) { + ivar4 = script_4180(ivar4, arg2, globalint_1410, "You cannot use your quiver."); + } + if (ivar4 > getWidgetActualHeight(new WidgetPointer(arg2))) { + setWidgetScrollMax(0, ivar4, new WidgetPointer(arg2)); + script_31(arg3, arg2, 792, 789, 790, 791, 773, 788); + setWidgetIsHidden(false, new WidgetPointer(arg3)); + setWidgetPosition(0, 0, 0, 1, new WidgetPointer(arg2)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg3)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/418.cs2 b/dumps/scripts/418.cs2 new file mode 100644 index 000000000..353019a40 --- /dev/null +++ b/dumps/scripts/418.cs2 @@ -0,0 +1,10 @@ +void script_418() { + if (((globalint_1354 == -1) || (globalint_1357 < 0)) || (globalint_1358 < 0)) { + return; + } + cameraMethod5511(globalint_1354); + globalint_1355 = cameraGetVrot(); + globalint_1356 = cameraGetHrot(); + setScriptCallOnGameloop(421, globalint_1357, globalint_1358, 0, "iii", new WidgetPointer(1013,0)); + return; +} diff --git a/dumps/scripts/4180.cs2 b/dumps/scripts/4180.cs2 new file mode 100644 index 000000000..8240f3d73 --- /dev/null +++ b/dumps/scripts/4180.cs2 @@ -0,0 +1,23 @@ +int script_4180(int arg0,int arg1,int arg2,string arg3) { + int ivar3; + int ivar4; + ivar3 = add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(arg1)), 494, arg3), 10), 2); + ivar4 = subtract(getClientCycle(), arg2); + if ((arg2 > 0) && (ivar4 < 255)) { + createExtraChild(new WidgetPointer(arg1), 3, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(0, ivar3, 1, 0); + setWidgetPosition(0, arg0, 1, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 0, 0)); + cs2method2103(max(ivar4, 0)); + setScriptCallOnGameloop(4181, new WidgetPointer(-32768,3), -2147483643, "Ii"); + } + createExtraChild(new WidgetPointer(arg1), 4, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(0, ivar3, 1, 0); + setWidgetPosition(0, arg0, 1, 0); + setWidgetRGB(new Color(170, 170, 170)); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetText(arg3); + return add(add(arg0, ivar3), 2); +} diff --git a/dumps/scripts/4181.cs2 b/dumps/scripts/4181.cs2 new file mode 100644 index 000000000..bb4715d20 --- /dev/null +++ b/dumps/scripts/4181.cs2 @@ -0,0 +1,13 @@ +void script_4181(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar2 = add(cs2method1609(), 1); + if (ivar2 >= 255) { + deleteExtraChild(); + return; + } + cs2method2103(ivar2); + } + return; +} diff --git a/dumps/scripts/4182.cs2 b/dumps/scripts/4182.cs2 new file mode 100644 index 000000000..71904897c --- /dev/null +++ b/dumps/scripts/4182.cs2 @@ -0,0 +1,8 @@ +void script_4182() { + setWidgetText(new WidgetPointer(1072,53), intToStr(bitconfig_8857) + "/" + intToStr(4000)); + setWidgetText(new WidgetPointer(1072,57), intToStr(bitconfig_8859) + "/" + intToStr(4000)); + setWidgetText(new WidgetPointer(1072,61), intToStr(bitconfig_8862) + "/" + intToStr(4000)); + setWidgetText(new WidgetPointer(1072,65), intToStr(bitconfig_8863) + "/" + intToStr(4000)); + setWidgetText(new WidgetPointer(1072,49), intToStr(bitconfig_8865) + "/" + intToStr(8000)); + return; +} diff --git a/dumps/scripts/4183.cs2 b/dumps/scripts/4183.cs2 new file mode 100644 index 000000000..15ef09c85 --- /dev/null +++ b/dumps/scripts/4183.cs2 @@ -0,0 +1,82 @@ +void script_4183(int arg0) { + if (arg0 == 70254730) { + setWidgetIsHidden(false, new WidgetPointer(1072,135)); + setWidgetIsHidden(true, new WidgetPointer(1072,147)); + setWidgetIsHidden(true, new WidgetPointer(1072,159)); + setWidgetIsHidden(true, new WidgetPointer(1072,171)); + setWidgetModel(63848, new WidgetPointer(1072,48)); + setWidgetModel(63838, new WidgetPointer(1072,74)); + setWidgetModel(63824, new WidgetPointer(1072,80)); + setWidgetModel(63837, new WidgetPointer(1072,88)); + setWidgetModel(63823, new WidgetPointer(1072,93)); + setWidgetText(new WidgetPointer(1072,46), intToStr(1)); + setWidgetText(new WidgetPointer(1072,71), intToStr(1)); + setWidgetText(new WidgetPointer(1072,72), intToStr(2)); + setWidgetText(new WidgetPointer(1072,12), intToStr(1)); + setWidgetText(new WidgetPointer(1072,13), intToStr(4)); + setWidgetText(new WidgetPointer(1072,6), intToStr(1)); + setWidgetText(new WidgetPointer(1072,7), intToStr(6)); + setWidgetText(new WidgetPointer(1072,2), intToStr(1)); + setWidgetText(new WidgetPointer(1072,3), intToStr(8)); + } else if (arg0 == 70254742) { + setWidgetIsHidden(true, new WidgetPointer(1072,135)); + setWidgetIsHidden(false, new WidgetPointer(1072,147)); + setWidgetIsHidden(true, new WidgetPointer(1072,159)); + setWidgetIsHidden(true, new WidgetPointer(1072,171)); + setWidgetModel(63835, new WidgetPointer(1072,48)); + setWidgetModel(63825, new WidgetPointer(1072,74)); + setWidgetModel(63845, new WidgetPointer(1072,80)); + setWidgetModel(63828, new WidgetPointer(1072,88)); + setWidgetModel(63841, new WidgetPointer(1072,93)); + setWidgetText(new WidgetPointer(1072,46), intToStr(9)); + setWidgetText(new WidgetPointer(1072,71), intToStr(4)); + setWidgetText(new WidgetPointer(1072,72), intToStr(7)); + setWidgetText(new WidgetPointer(1072,12), intToStr(3)); + setWidgetText(new WidgetPointer(1072,13), intToStr(12)); + setWidgetText(new WidgetPointer(1072,6), intToStr(3)); + setWidgetText(new WidgetPointer(1072,7), intToStr(14)); + setWidgetText(new WidgetPointer(1072,2), intToStr(2)); + setWidgetText(new WidgetPointer(1072,3), intToStr(16)); + } else if (arg0 == 70254754) { + setWidgetIsHidden(true, new WidgetPointer(1072,135)); + setWidgetIsHidden(true, new WidgetPointer(1072,147)); + setWidgetIsHidden(false, new WidgetPointer(1072,159)); + setWidgetIsHidden(true, new WidgetPointer(1072,171)); + setWidgetModel(63827, new WidgetPointer(1072,48)); + setWidgetModel(63833, new WidgetPointer(1072,74)); + setWidgetModel(63831, new WidgetPointer(1072,80)); + setWidgetModel(63842, new WidgetPointer(1072,88)); + setWidgetModel(63856, new WidgetPointer(1072,93)); + setWidgetText(new WidgetPointer(1072,46), intToStr(12)); + setWidgetText(new WidgetPointer(1072,71), intToStr(9)); + setWidgetText(new WidgetPointer(1072,72), intToStr(17)); + setWidgetText(new WidgetPointer(1072,12), intToStr(6)); + setWidgetText(new WidgetPointer(1072,13), intToStr(24)); + setWidgetText(new WidgetPointer(1072,6), intToStr(4)); + setWidgetText(new WidgetPointer(1072,7), intToStr(22)); + setWidgetText(new WidgetPointer(1072,2), intToStr(4)); + setWidgetText(new WidgetPointer(1072,3), intToStr(30)); + } else { + if (arg0 == 70254766) { + setWidgetIsHidden(true, new WidgetPointer(1072,135)); + setWidgetIsHidden(true, new WidgetPointer(1072,147)); + setWidgetIsHidden(true, new WidgetPointer(1072,159)); + setWidgetIsHidden(false, new WidgetPointer(1072,171)); + setWidgetModel(63836, new WidgetPointer(1072,48)); + setWidgetModel(63851, new WidgetPointer(1072,74)); + setWidgetModel(63855, new WidgetPointer(1072,80)); + setWidgetModel(63832, new WidgetPointer(1072,88)); + setWidgetModel(63834, new WidgetPointer(1072,93)); + setWidgetText(new WidgetPointer(1072,46), intToStr(75)); + setWidgetText(new WidgetPointer(1072,71), intToStr(40)); + setWidgetText(new WidgetPointer(1072,72), intToStr(80)); + setWidgetText(new WidgetPointer(1072,12), intToStr(30)); + setWidgetText(new WidgetPointer(1072,13), intToStr(120)); + setWidgetText(new WidgetPointer(1072,6), intToStr(25)); + setWidgetText(new WidgetPointer(1072,7), intToStr(150)); + setWidgetText(new WidgetPointer(1072,2), intToStr(18)); + setWidgetText(new WidgetPointer(1072,3), intToStr(144)); + } + } + return; +} diff --git a/dumps/scripts/4184.cs2 b/dumps/scripts/4184.cs2 new file mode 100644 index 000000000..19819616b --- /dev/null +++ b/dumps/scripts/4184.cs2 @@ -0,0 +1,10 @@ +void script_4184(int arg0,int arg1) { + if (arg0 != 1) { + return; + } + bitconfig_8877 = max(min(add(bitconfig_8877, arg1), 28), 1); + setWidgetText(new WidgetPointer(1072,33), intToStr(bitconfig_8877)); + setScriptCallOnGameloop(4187, add(getClientCycle(), 15), "i", new WidgetPointer(1072,83)); + setWidgetIsHidden(false, new WidgetPointer(1072,83)); + return; +} diff --git a/dumps/scripts/4185.cs2 b/dumps/scripts/4185.cs2 new file mode 100644 index 000000000..08ed828d7 --- /dev/null +++ b/dumps/scripts/4185.cs2 @@ -0,0 +1,10 @@ +void script_4185(int arg0) { + if (arg0 == 70254623) { + setWidgetSprite(3865, new WidgetPointer(1072,31)); + } else { + if (arg0 == 70254624) { + setWidgetSprite(3866, new WidgetPointer(1072,32)); + } + } + return; +} diff --git a/dumps/scripts/4186.cs2 b/dumps/scripts/4186.cs2 new file mode 100644 index 000000000..0fdbac3f2 --- /dev/null +++ b/dumps/scripts/4186.cs2 @@ -0,0 +1,10 @@ +void script_4186(int arg0) { + if (arg0 == 70254623) { + setWidgetSprite(3863, new WidgetPointer(1072,31)); + } else { + if (arg0 == 70254624) { + setWidgetSprite(3864, new WidgetPointer(1072,32)); + } + } + return; +} diff --git a/dumps/scripts/4187.cs2 b/dumps/scripts/4187.cs2 new file mode 100644 index 000000000..53c2c92fe --- /dev/null +++ b/dumps/scripts/4187.cs2 @@ -0,0 +1,8 @@ +void script_4187(int arg0) { + if (getClientCycle() < arg0) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(1072,83)); + setWidgetIsHidden(true, new WidgetPointer(1072,83)); + return; +} diff --git a/dumps/scripts/4188.cs2 b/dumps/scripts/4188.cs2 new file mode 100644 index 000000000..a243232dc --- /dev/null +++ b/dumps/scripts/4188.cs2 @@ -0,0 +1,15 @@ +void script_4188(int arg0) { + if (arg0 == 70385726) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1074,57)); + } + if (arg0 == 70385727) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1074,58)); + } + if (arg0 == 70385728) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1074,59)); + } + if (arg0 == 70385729) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1074,60)); + } + return; +} diff --git a/dumps/scripts/4189.cs2 b/dumps/scripts/4189.cs2 new file mode 100644 index 000000000..bbddcc235 --- /dev/null +++ b/dumps/scripts/4189.cs2 @@ -0,0 +1,15 @@ +void script_4189(int arg0) { + if (arg0 == 70385726) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1074,57)); + } + if (arg0 == 70385727) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1074,58)); + } + if (arg0 == 70385728) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1074,59)); + } + if (arg0 == 70385729) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1074,60)); + } + return; +} diff --git a/dumps/scripts/419.cs2 b/dumps/scripts/419.cs2 new file mode 100644 index 000000000..51a9dea98 --- /dev/null +++ b/dumps/scripts/419.cs2 @@ -0,0 +1,4 @@ +void script_419() { + script_304(49466635); + return; +} diff --git a/dumps/scripts/4190.cs2 b/dumps/scripts/4190.cs2 new file mode 100644 index 000000000..c06b19dad --- /dev/null +++ b/dumps/scripts/4190.cs2 @@ -0,0 +1,24 @@ +void script_4190() { + if (setWidgetRegister(new WidgetPointer(1074,94))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,95))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,96))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,97))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,98))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,99))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,100))) { + setWidgetVFlip(1); + } + return; +} diff --git a/dumps/scripts/4191.cs2 b/dumps/scripts/4191.cs2 new file mode 100644 index 000000000..4a73d9c6b --- /dev/null +++ b/dumps/scripts/4191.cs2 @@ -0,0 +1,45 @@ +void script_4191() { + if (setWidgetRegister(new WidgetPointer(1070,95))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,96))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,97))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,98))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,99))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,100))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,101))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,81))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,82))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,83))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,84))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,85))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,86))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1070,87))) { + setWidgetVFlip(1); + } + return; +} diff --git a/dumps/scripts/4192.cs2 b/dumps/scripts/4192.cs2 new file mode 100644 index 000000000..639d287ad --- /dev/null +++ b/dumps/scripts/4192.cs2 @@ -0,0 +1,24 @@ +void script_4192() { + if (setWidgetRegister(new WidgetPointer(1074,80))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,81))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,82))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,83))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,84))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,85))) { + setWidgetVFlip(1); + } + if (setWidgetRegister(new WidgetPointer(1074,86))) { + setWidgetVFlip(1); + } + return; +} diff --git a/dumps/scripts/4193.cs2 b/dumps/scripts/4193.cs2 new file mode 100644 index 000000000..77815f0be --- /dev/null +++ b/dumps/scripts/4193.cs2 @@ -0,0 +1,68 @@ +void script_4193(int arg0) { + if (arg0 == 70385736) { + if (((boolean)bitconfig_8911)) { + setWidgetSprite(4701, new WidgetPointer(1074,34)); + } + } else if (arg0 == 70385765) { + if (((boolean)bitconfig_8912)) { + setWidgetSprite(4701, new WidgetPointer(1074,35)); + } + } else if (arg0 == 70385766) { + if (((boolean)bitconfig_8913)) { + setWidgetSprite(4701, new WidgetPointer(1074,36)); + } + } else if (arg0 == 70385767) { + if (((boolean)bitconfig_8914)) { + setWidgetSprite(4701, new WidgetPointer(1074,37)); + } + } else if (arg0 == 70385768) { + if (((boolean)bitconfig_8915)) { + setWidgetSprite(4701, new WidgetPointer(1074,38)); + } + } else if (arg0 == 70385769) { + if (((boolean)bitconfig_8916)) { + setWidgetSprite(4701, new WidgetPointer(1074,39)); + } + } else if (arg0 == 70385770) { + if (((boolean)bitconfig_8917)) { + setWidgetSprite(4701, new WidgetPointer(1074,40)); + } + } else if (arg0 == 70385771) { + if (((boolean)bitconfig_8918)) { + setWidgetSprite(4701, new WidgetPointer(1074,41)); + } + } else if (arg0 == 70385772) { + if (((boolean)bitconfig_8919)) { + setWidgetSprite(4701, new WidgetPointer(1074,42)); + } + } else if (arg0 == 70385773) { + if (((boolean)bitconfig_8920)) { + setWidgetSprite(4701, new WidgetPointer(1074,43)); + } + } else if (arg0 == 70385774) { + if (((boolean)bitconfig_8921)) { + setWidgetSprite(4701, new WidgetPointer(1074,44)); + } + } else if (arg0 == 70385775) { + if (((boolean)bitconfig_8922)) { + setWidgetSprite(4701, new WidgetPointer(1074,45)); + } + } else if (arg0 == 70385776) { + if (((boolean)bitconfig_8923)) { + setWidgetSprite(4701, new WidgetPointer(1074,46)); + } + } else if (arg0 == 70385777) { + if (((boolean)bitconfig_8924)) { + setWidgetSprite(4701, new WidgetPointer(1074,47)); + } + } else if (arg0 == 70385778) { + if (((boolean)bitconfig_8925)) { + setWidgetSprite(4701, new WidgetPointer(1074,48)); + } + } else { + if ((arg0 == 70385779) && ((boolean)bitconfig_8926)) { + setWidgetSprite(4701, new WidgetPointer(1074,49)); + } + } + return; +} diff --git a/dumps/scripts/4194.cs2 b/dumps/scripts/4194.cs2 new file mode 100644 index 000000000..8a784c8be --- /dev/null +++ b/dumps/scripts/4194.cs2 @@ -0,0 +1,68 @@ +void script_4194(int arg0) { + if (arg0 == 70385736) { + if (((boolean)bitconfig_8911)) { + setWidgetSprite(4700, new WidgetPointer(1074,34)); + } + } else if (arg0 == 70385765) { + if (((boolean)bitconfig_8912)) { + setWidgetSprite(4700, new WidgetPointer(1074,35)); + } + } else if (arg0 == 70385766) { + if (((boolean)bitconfig_8913)) { + setWidgetSprite(4700, new WidgetPointer(1074,36)); + } + } else if (arg0 == 70385767) { + if (((boolean)bitconfig_8914)) { + setWidgetSprite(4700, new WidgetPointer(1074,37)); + } + } else if (arg0 == 70385768) { + if (((boolean)bitconfig_8915)) { + setWidgetSprite(4700, new WidgetPointer(1074,38)); + } + } else if (arg0 == 70385769) { + if (((boolean)bitconfig_8916)) { + setWidgetSprite(4700, new WidgetPointer(1074,39)); + } + } else if (arg0 == 70385770) { + if (((boolean)bitconfig_8917)) { + setWidgetSprite(4700, new WidgetPointer(1074,40)); + } + } else if (arg0 == 70385771) { + if (((boolean)bitconfig_8918)) { + setWidgetSprite(4700, new WidgetPointer(1074,41)); + } + } else if (arg0 == 70385772) { + if (((boolean)bitconfig_8919)) { + setWidgetSprite(4700, new WidgetPointer(1074,42)); + } + } else if (arg0 == 70385773) { + if (((boolean)bitconfig_8920)) { + setWidgetSprite(4700, new WidgetPointer(1074,43)); + } + } else if (arg0 == 70385774) { + if (((boolean)bitconfig_8921)) { + setWidgetSprite(4700, new WidgetPointer(1074,44)); + } + } else if (arg0 == 70385775) { + if (((boolean)bitconfig_8922)) { + setWidgetSprite(4700, new WidgetPointer(1074,45)); + } + } else if (arg0 == 70385776) { + if (((boolean)bitconfig_8923)) { + setWidgetSprite(4700, new WidgetPointer(1074,46)); + } + } else if (arg0 == 70385777) { + if (((boolean)bitconfig_8924)) { + setWidgetSprite(4700, new WidgetPointer(1074,47)); + } + } else if (arg0 == 70385778) { + if (((boolean)bitconfig_8925)) { + setWidgetSprite(4700, new WidgetPointer(1074,48)); + } + } else { + if ((arg0 == 70385779) && ((boolean)bitconfig_8926)) { + setWidgetSprite(4700, new WidgetPointer(1074,49)); + } + } + return; +} diff --git a/dumps/scripts/4195.cs2 b/dumps/scripts/4195.cs2 new file mode 100644 index 000000000..2c1e5d438 --- /dev/null +++ b/dumps/scripts/4195.cs2 @@ -0,0 +1,47 @@ +void script_4195(int arg0) { + if ((arg0 == 58392625) || (arg0 == 58392626)) { + if (setWidgetRegister(new WidgetPointer(891,61))) { + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(891,49))) { + setWidgetSprite(5414); + } + if (setWidgetRegister(new WidgetPointer(891,50))) { + setWidgetSprite(5414); + } + } + if ((arg0 == 58392627) || (arg0 == 58392629)) { + if (setWidgetRegister(new WidgetPointer(891,62))) { + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(891,51))) { + setWidgetSprite(5414); + } + if (setWidgetRegister(new WidgetPointer(891,53))) { + setWidgetSprite(5414); + } + } + if (arg0 == 58392628) { + if (setWidgetRegister(new WidgetPointer(891,63))) { + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(891,52))) { + setWidgetSprite(5414); + } + if (setWidgetRegister(new WidgetPointer(891,53))) { + setWidgetSprite(5414); + } + } + if ((arg0 == 58392630) || (arg0 == 58392631)) { + if (setWidgetRegister(new WidgetPointer(891,64))) { + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(891,54))) { + setWidgetSprite(5414); + } + if (setWidgetRegister(new WidgetPointer(891,55))) { + setWidgetSprite(5414); + } + } + return; +} diff --git a/dumps/scripts/4196.cs2 b/dumps/scripts/4196.cs2 new file mode 100644 index 000000000..8eeeaf609 --- /dev/null +++ b/dumps/scripts/4196.cs2 @@ -0,0 +1,47 @@ +void script_4196(int arg0) { + if ((arg0 == 58392625) || (arg0 == 58392626)) { + if (setWidgetRegister(new WidgetPointer(891,61))) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(891,49))) { + setWidgetSprite(5413); + } + if (setWidgetRegister(new WidgetPointer(891,50))) { + setWidgetSprite(5413); + } + } + if ((arg0 == 58392627) || (arg0 == 58392629)) { + if (setWidgetRegister(new WidgetPointer(891,62))) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(891,51))) { + setWidgetSprite(5413); + } + if (setWidgetRegister(new WidgetPointer(891,53))) { + setWidgetSprite(5413); + } + } + if (arg0 == 58392628) { + if (setWidgetRegister(new WidgetPointer(891,63))) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(891,52))) { + setWidgetSprite(5413); + } + if (setWidgetRegister(new WidgetPointer(891,53))) { + setWidgetSprite(5413); + } + } + if ((arg0 == 58392630) || (arg0 == 58392631)) { + if (setWidgetRegister(new WidgetPointer(891,64))) { + setWidgetHidden(1); + } + if (setWidgetRegister(new WidgetPointer(891,54))) { + setWidgetSprite(5413); + } + if (setWidgetRegister(new WidgetPointer(891,55))) { + setWidgetSprite(5413); + } + } + return; +} diff --git a/dumps/scripts/4197.cs2 b/dumps/scripts/4197.cs2 new file mode 100644 index 000000000..1ba61ad5e --- /dev/null +++ b/dumps/scripts/4197.cs2 @@ -0,0 +1,9 @@ +void script_4197(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(891,76)); + setWidgetIsHidden(false, new WidgetPointer(891,65)); + setWidgetSprite(5412, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(891,75), "You are here."); + setWidgetText(new WidgetPointer(891,77), ""); + setWidgetText(new WidgetPointer(891,78), ""); + return; +} diff --git a/dumps/scripts/4198.cs2 b/dumps/scripts/4198.cs2 new file mode 100644 index 000000000..3d51d39dc --- /dev/null +++ b/dumps/scripts/4198.cs2 @@ -0,0 +1,5 @@ +void script_4198(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(891,65)); + setWidgetSprite(5411, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4199.cs2 b/dumps/scripts/4199.cs2 new file mode 100644 index 000000000..29d874e15 --- /dev/null +++ b/dumps/scripts/4199.cs2 @@ -0,0 +1,31 @@ +void script_4199(int arg0) { + setWidgetSprite(5416, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(891,76)); + setWidgetIsHidden(false, new WidgetPointer(891,65)); + if (arg0 == 58392632) { + setWidgetText(new WidgetPointer(891,75), "Cannon Room"); + setWidgetText(new WidgetPointer(891,77), "62+"); + setWidgetText(new WidgetPointer(891,78), "(Members only) Fix up broken cannons. This offers fast XP, for medium resource costs."); + } + if (arg0 == 58392633) { + setWidgetText(new WidgetPointer(891,75), "Burial Armour Room"); + setWidgetText(new WidgetPointer(891,77), "30-70"); + setWidgetText(new WidgetPointer(891,78), "Forge burial armour in line with the taskmaster's orders. Different XP rates at a range of resource costs."); + } + if (arg0 == 58392634) { + setWidgetText(new WidgetPointer(891,75), "Ceremonial Sword Room"); + setWidgetText(new WidgetPointer(891,77), "70+"); + setWidgetText(new WidgetPointer(891,78), "(Members Only) Smith beautiful ceremonial swords. High XP rate, for reasonably high resource costs."); + } + if (arg0 == 58392635) { + setWidgetText(new WidgetPointer(891,75), "Track Room"); + setWidgetText(new WidgetPointer(891,77), "1-30"); + setWidgetText(new WidgetPointer(891,78), "Build up sections of mine cart tracks. Low XP rate, no resource costs."); + } + if (arg0 == 58392636) { + setWidgetText(new WidgetPointer(891,75), "Reward Shop"); + setWidgetText(new WidgetPointer(891,77), "--"); + setWidgetText(new WidgetPointer(891,78), "Purchase unique rewards using respect earned in the workshop."); + } + return; +} diff --git a/dumps/scripts/42.cs2 b/dumps/scripts/42.cs2 new file mode 100644 index 000000000..8fa487b6b --- /dev/null +++ b/dumps/scripts/42.cs2 @@ -0,0 +1,6 @@ +int script_42(int arg0) { + if (((boolean)arg0)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/420.cs2 b/dumps/scripts/420.cs2 new file mode 100644 index 000000000..b982f569f --- /dev/null +++ b/dumps/scripts/420.cs2 @@ -0,0 +1,5 @@ +void script_420() { + cameraMethod5511(globalint_1353); + setScriptCallOnGameloop(421, globalint_1355, globalint_1356, 0, "iii", new WidgetPointer(1013,0)); + return; +} diff --git a/dumps/scripts/4200.cs2 b/dumps/scripts/4200.cs2 new file mode 100644 index 000000000..d20928fa2 --- /dev/null +++ b/dumps/scripts/4200.cs2 @@ -0,0 +1,6 @@ +void script_4200(int arg0) { + setWidgetSprite(5415, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(891,65)); + setWidgetIsHidden(true, new WidgetPointer(891,76)); + return; +} diff --git a/dumps/scripts/4201.cs2 b/dumps/scripts/4201.cs2 new file mode 100644 index 000000000..57bc1349f --- /dev/null +++ b/dumps/scripts/4201.cs2 @@ -0,0 +1,4 @@ +void script_4201(int arg0,int arg1) { + script_4510(arg0, arg1); + return; +} diff --git a/dumps/scripts/4202.cs2 b/dumps/scripts/4202.cs2 new file mode 100644 index 000000000..677cf085b --- /dev/null +++ b/dumps/scripts/4202.cs2 @@ -0,0 +1,73 @@ +void script_4202(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + ivar3 = getOtherCommonData(arg1, 1349); + ivar4 = getOtherCommonData(arg1, 1347); + ivar5 = getOtherCommonData(arg1, 1350); + ivar6 = getOtherCommonData(arg1, 1352); + ivar7 = getOtherCommonData(arg1, 1353); + ivar8 = getOtherCommonData(arg1, 1351); + ivar9 = getOtherCommonData(arg1, 1358); + ivar10 = getOtherCommonData(arg1, 1359); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(24, 22, 1, 1); + setWidgetSprite(ivar8); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(24, 12, 1, 0); + setWidgetSprite(ivar4); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(24, 12, 1, 0); + setWidgetSprite(ivar6); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(12, 24, 0, 1); + setWidgetSprite(ivar7); + setWidgetHFlip(1); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(12, 24, 0, 1); + setWidgetSprite(ivar7); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(ivar3); + setWidgetHFlip(1); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(ivar5); + setWidgetHFlip(1); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(12, 12, 0, 0); + setWidgetSprite(ivar5); + cs2method2103(ivar9); + return; +} diff --git a/dumps/scripts/4203.cs2 b/dumps/scripts/4203.cs2 new file mode 100644 index 000000000..e81ff8e75 --- /dev/null +++ b/dumps/scripts/4203.cs2 @@ -0,0 +1,34 @@ +void script_4203(int arg0,int arg1) { + int ivar2; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + if (ivar2 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 1, 0, "Iii", new WidgetPointer(arg0)); + } else { + if (ivar2 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } + } + if (ivar2 == 5) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 3, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(128); + setWidgetFilled(1); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + cs2method2005(1, new WidgetPointer(arg0)); + } else { + script_4204(arg0, arg1); + } + if (ivar2 == 4) { + script_4161(arg0, 0); + } + return; +} diff --git a/dumps/scripts/4204.cs2 b/dumps/scripts/4204.cs2 new file mode 100644 index 000000000..070f1e897 --- /dev/null +++ b/dumps/scripts/4204.cs2 @@ -0,0 +1,30 @@ +void script_4204(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1348); + ivar3 = getOtherCommonData(arg1, 1355); + ivar4 = getOtherCommonData(arg1, 1356); + ivar5 = getOtherCommonData(arg1, 1358); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(20, 20, 0, 0); + setWidgetSprite(ivar2); + cs2method2103(ivar5); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(40, 20, 1, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar5); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(20, 20, 0, 0); + setWidgetSprite(ivar4); + cs2method2103(ivar5); + return; +} diff --git a/dumps/scripts/4205.cs2 b/dumps/scripts/4205.cs2 new file mode 100644 index 000000000..b10b59824 --- /dev/null +++ b/dumps/scripts/4205.cs2 @@ -0,0 +1,4 @@ +void script_4205(int arg0,int arg1) { + script_4513(arg0, arg1); + return; +} diff --git a/dumps/scripts/4206.cs2 b/dumps/scripts/4206.cs2 new file mode 100644 index 000000000..ce4527212 --- /dev/null +++ b/dumps/scripts/4206.cs2 @@ -0,0 +1,95 @@ +void script_4206(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1347); + ivar3 = getOtherCommonData(arg1, 1349); + ivar4 = getOtherCommonData(arg1, 1352); + ivar5 = getOtherCommonData(arg1, 1350); + ivar6 = getOtherCommonData(arg1, 1353); + ivar7 = getOtherCommonData(arg1, 1354); + ivar8 = getOtherCommonData(arg1, 1351); + ivar9 = getOtherCommonData(arg1, 1357); + ivar10 = getOtherCommonData(arg1, 1358); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(14, 16384, 1, 2); + setWidgetSprite(ivar8); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(14, 10000, 1, 2); + setWidgetSprite(ivar9); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(7, 16384, 0, 2); + setWidgetSprite(ivar6); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(7, 16384, 0, 2); + setWidgetSprite(ivar6); + setWidgetHFlip(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(7, 7, 0, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(14, 7, 1, 0); + setWidgetSprite(ivar2); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(7, 7, 0, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar10); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(7, 10000, 0, 2); + setWidgetSprite(ivar7); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(7, 10000, 0, 2); + setWidgetSprite(ivar7); + cs2method1107(1); + setWidgetHFlip(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(7, 7, 0, 0); + setWidgetSprite(ivar5); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(14, 7, 1, 0); + setWidgetSprite(ivar4); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(7, 7, 0, 0); + setWidgetSprite(ivar5); + cs2method2103(ivar10); + setWidgetHFlip(1); + return; +} diff --git a/dumps/scripts/4207.cs2 b/dumps/scripts/4207.cs2 new file mode 100644 index 000000000..56bc9e11e --- /dev/null +++ b/dumps/scripts/4207.cs2 @@ -0,0 +1,4 @@ +void script_4207(int arg0,int arg1) { + script_4208(arg0, arg1); + return; +} diff --git a/dumps/scripts/4208.cs2 b/dumps/scripts/4208.cs2 new file mode 100644 index 000000000..91b6f0f07 --- /dev/null +++ b/dumps/scripts/4208.cs2 @@ -0,0 +1,8 @@ +void script_4208(int arg0,int arg1) { + if (((boolean)arg1)) { + cs2method2103(0, new WidgetPointer(arg0)); + } else { + cs2method2103(255, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4209.cs2 b/dumps/scripts/4209.cs2 new file mode 100644 index 000000000..9fafbbd86 --- /dev/null +++ b/dumps/scripts/4209.cs2 @@ -0,0 +1,4 @@ +void script_4209(int arg0,int arg1) { + script_5365(arg0, arg1); + return; +} diff --git a/dumps/scripts/421.cs2 b/dumps/scripts/421.cs2 new file mode 100644 index 000000000..b98af2ca3 --- /dev/null +++ b/dumps/scripts/421.cs2 @@ -0,0 +1,101 @@ +void script_421(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int stack_dump0; + int stack_dump1; + cs2func_script_422_struct(2,0,0) structdump_2; + cs2func_script_422_struct(2,0,0) structdump_3; + cs2func_script_422_struct(2,0,0) structdump_4; + cs2func_script_422_struct(2,0,0) structdump_5; + ivar3 = 0; + ivar4 = 0; + ivar5 = 5; + ivar6 = 5; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + if (cameraGetVrot() < arg0) { + ivar9 = subtract(arg0, cameraGetVrot()); + } else { + if (cameraGetVrot() > arg0) { + ivar9 = subtract(cameraGetVrot(), arg0); + } + } + if (cameraGetHrot() < arg1) { + ivar8 = subtract(arg1, cameraGetHrot()); + ivar7 = add(subtract(2047, arg1), cameraGetHrot()); + if (ivar7 > ivar8) { + ivar10 = ivar8; + stack_dump0 = ivar9; + stack_dump1 = ivar10; + structdump_2 = script_422(stack_dump0, stack_dump1); + ivar6 = structdump_2.intpart_1; + ivar5 = structdump_2.intpart_0; + cameraMethod5504(cameraGetVrot(), min(add(cameraGetHrot(), ivar6), arg1)); + } else { + ivar10 = ivar7; + stack_dump0 = ivar9; + stack_dump1 = ivar10; + structdump_3 = script_422(stack_dump0, stack_dump1); + ivar6 = structdump_3.intpart_1; + ivar5 = structdump_3.intpart_0; + if (((boolean)arg2)) { + cameraMethod5504(cameraGetVrot(), max(subtract(cameraGetHrot(), ivar6), 0)); + } else { + cameraMethod5504(cameraGetVrot(), max(subtract(cameraGetHrot(), ivar6), arg1)); + } + if (((boolean)cameraGetHrot()) && ((boolean)arg2)) { + cameraMethod5504(cameraGetVrot(), 2047); + setScriptCallOnGameloop(421, arg0, arg1, 1, "iii", new WidgetPointer(1013,0)); + } + } + } else if (cameraGetHrot() > arg1) { + ivar8 = add(subtract(2047, cameraGetHrot()), arg1); + ivar7 = subtract(cameraGetHrot(), arg1); + if (ivar7 > ivar8) { + ivar10 = ivar8; + stack_dump0 = ivar9; + stack_dump1 = ivar10; + structdump_4 = script_422(stack_dump0, stack_dump1); + ivar6 = structdump_4.intpart_1; + ivar5 = structdump_4.intpart_0; + if (((boolean)arg2)) { + cameraMethod5504(cameraGetVrot(), min(add(cameraGetHrot(), ivar6), 2047)); + } else { + cameraMethod5504(cameraGetVrot(), min(add(cameraGetHrot(), ivar6), arg1)); + } + if ((cameraGetHrot() == 2047) && ((boolean)arg2)) { + cameraMethod5504(cameraGetVrot(), 0); + setScriptCallOnGameloop(421, arg0, arg1, 1, "iii", new WidgetPointer(1013,0)); + } + } else { + ivar10 = ivar7; + stack_dump0 = ivar9; + stack_dump1 = ivar10; + structdump_5 = script_422(stack_dump0, stack_dump1); + ivar6 = structdump_5.intpart_1; + ivar5 = structdump_5.intpart_0; + cameraMethod5504(cameraGetVrot(), max(subtract(cameraGetHrot(), ivar6), arg1)); + } + } else { + ivar4 = 1; + } + if (cameraGetVrot() < arg0) { + cameraMethod5504(min(add(cameraGetVrot(), ivar5), arg0), cameraGetHrot()); + } else if (cameraGetVrot() > arg0) { + cameraMethod5504(max(subtract(cameraGetVrot(), ivar5), arg0), cameraGetHrot()); + } else { + ivar3 = 1; + } + if (((boolean)ivar3) && ((boolean)ivar4)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(1013,0)); + } + return; +} diff --git a/dumps/scripts/4210.cs2 b/dumps/scripts/4210.cs2 new file mode 100644 index 000000000..0034e1c56 --- /dev/null +++ b/dumps/scripts/4210.cs2 @@ -0,0 +1,4 @@ +void script_4210(int arg0,int arg1,int arg2,int arg3) { + script_4211(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/4211.cs2 b/dumps/scripts/4211.cs2 new file mode 100644 index 000000000..5d3d3341c --- /dev/null +++ b/dumps/scripts/4211.cs2 @@ -0,0 +1,4 @@ +void script_4211(int arg0,int arg1,int arg2,int arg3) { + script_4212(arg0, arg1, arg2, arg3, getWidgetText(new WidgetPointer(arg0))); + return; +} diff --git a/dumps/scripts/4212.cs2 b/dumps/scripts/4212.cs2 new file mode 100644 index 000000000..3f0429d1a --- /dev/null +++ b/dumps/scripts/4212.cs2 @@ -0,0 +1,50 @@ +void script_4212(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + if (arg0 == -1) { + return; + } + ivar4 = getWidgetActualX(new WidgetPointer(arg0)); + ivar5 = getWidgetActualY(new WidgetPointer(arg0)); + ivar6 = getWidgetParentId(new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), arg4); + setWidgetFont(arg1, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(ivar6)); + createExtraChild(new WidgetPointer(ivar6), 4, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetPosition(0, -1, 1, 1); + setWidgetSize(0, 0, 1, 1); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(arg3)); + setWidgetFont(arg1); + setWidgetText(arg4); + createExtraChild(new WidgetPointer(ivar6), 4, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetPosition(0, 1, 1, 1); + setWidgetSize(0, 0, 1, 1); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(arg3)); + setWidgetFont(arg1); + setWidgetText(arg4); + createExtraChild(new WidgetPointer(ivar6), 4, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetPosition(-1, 0, 1, 1); + setWidgetSize(0, 0, 1, 1); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(arg3)); + setWidgetFont(arg1); + setWidgetText(arg4); + createExtraChild(new WidgetPointer(ivar6), 4, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetPosition(1, 0, 1, 1); + setWidgetSize(0, 0, 1, 1); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(arg3)); + setWidgetFont(arg1); + setWidgetText(arg4); + createExtraChild(new WidgetPointer(ivar6), 4, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(0, 0, 1, 1); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(arg2)); + setWidgetFont(arg1); + setWidgetText(arg4); + return; +} diff --git a/dumps/scripts/4213.cs2 b/dumps/scripts/4213.cs2 new file mode 100644 index 000000000..8c8f6b498 --- /dev/null +++ b/dumps/scripts/4213.cs2 @@ -0,0 +1,4 @@ +void script_4213(int arg0) { + script_4408(arg0); + return; +} diff --git a/dumps/scripts/4214.cs2 b/dumps/scripts/4214.cs2 new file mode 100644 index 000000000..14d95b894 --- /dev/null +++ b/dumps/scripts/4214.cs2 @@ -0,0 +1,42 @@ +void script_4214(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = getWidgetShadeColor(new WidgetPointer(arg0)); + ivar4 = 0; + if (arg0 == -1) { + return; + } + if (((boolean)arg2)) { + flow_3: + if (((boolean)arg1)) { + ivar4 = add(ivar3, 22); + } else if (((boolean)arg1)) { + ivar4 = subtract(ivar3, 22); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + } + ivar4 = max(ivar4, 0); + ivar4 = min(ivar4, 255); + cs2method2103(ivar4, new WidgetPointer(arg0)); + IF (((boolean)arg1)) + GOTO flow_9 + GOTO flow_10 + flow_9: + IF (ivar4 == 255) + GOTO flow_12 + flow_10: + IF (((boolean)arg1) && ((boolean)ivar4)) + GOTO flow_12 + GOTO flow_13 + flow_12: + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + GOTO flow_14 + flow_13: + setScriptCallOnGameloop(4214, new WidgetPointer(arg0), arg1, 0, "Iii", new WidgetPointer(arg0)); + flow_14: + } else { + setScriptCallOnGameloop(4214, new WidgetPointer(arg0), arg1, subtract(arg2, 1), "Iii", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4215.cs2 b/dumps/scripts/4215.cs2 new file mode 100644 index 000000000..95af1706c --- /dev/null +++ b/dumps/scripts/4215.cs2 @@ -0,0 +1,7 @@ +void script_4215() { + if (setWidgetRegister(new WidgetPointer(1071,0))) { + setWidgetSelfFull(); + setWidgetAnimation(41); + } + return; +} diff --git a/dumps/scripts/4216.cs2 b/dumps/scripts/4216.cs2 new file mode 100644 index 000000000..5e676f8f3 --- /dev/null +++ b/dumps/scripts/4216.cs2 @@ -0,0 +1,6 @@ +void script_4216(int arg0) { + if (setWidgetRegister(new WidgetPointer(1071,0))) { + setWidgetAnimation(arg0); + } + return; +} diff --git a/dumps/scripts/4217.cs2 b/dumps/scripts/4217.cs2 new file mode 100644 index 000000000..b2eae4228 --- /dev/null +++ b/dumps/scripts/4217.cs2 @@ -0,0 +1,158 @@ +cs2func_script_4217_struct(2,0,0) script_4217() { + int ivar0; + int ivar1; + int stack_dump0; + ivar0 = 0; + ivar1 = 0; + ivar0 = add(ivar0, getSkillXp(7)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(12)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(11)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(10)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(6)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(14)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(5)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(4)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(20)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(13)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(8)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(16)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(15)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(9)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(17)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(18)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(0)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(1)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(2)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(3)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(19)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(22)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(21)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(23)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + ivar0 = add(ivar0, getSkillXp(24)); + if (ivar0 > 1000000000) { + stack_dump0 = add(ivar1, 1); + ivar0 = subtract(ivar0, 1000000000); + ivar1 = stack_dump0; + } + return newstruct cs2func_script_4217_struct(ivar0, ivar1); +} diff --git a/dumps/scripts/4218.cs2 b/dumps/scripts/4218.cs2 new file mode 100644 index 000000000..7febfe1d0 --- /dev/null +++ b/dumps/scripts/4218.cs2 @@ -0,0 +1,32 @@ +int script_4218() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + cs2func_script_4217_struct(2,0,0) structdump_0; + int stack_dump1; + ivar0 = 0; + ivar1 = 0; + structdump_0 = script_4217(); + ivar1 = structdump_0.intpart_1; + ivar0 = structdump_0.intpart_0; + ivar2 = subtract(standart_config_2068, ivar1); + ivar3 = subtract(standart_config_450, ivar0); + while ((ivar2 > 0) && (ivar3 <= 1000000000)) { + stack_dump1 = subtract(ivar2, 1); + ivar3 = add(ivar3, 1000000000); + ivar2 = stack_dump1; + } + while ((ivar2 < 0) && (ivar3 >= 1000000000)) { + stack_dump1 = add(ivar2, 1); + ivar3 = subtract(ivar3, 1000000000); + ivar2 = stack_dump1; + } + if (ivar2 < 0) { + return 0; + } + if (((boolean)ivar2) && (ivar3 <= 100000)) { + return max(ivar3, 0); + } + return 100000; +} diff --git a/dumps/scripts/4219.cs2 b/dumps/scripts/4219.cs2 new file mode 100644 index 000000000..0ad9f1e18 --- /dev/null +++ b/dumps/scripts/4219.cs2 @@ -0,0 +1,4 @@ +void script_4219() { + script_304(49735153); + return; +} diff --git a/dumps/scripts/422.cs2 b/dumps/scripts/422.cs2 new file mode 100644 index 000000000..7ec6531f1 --- /dev/null +++ b/dumps/scripts/422.cs2 @@ -0,0 +1,17 @@ +cs2func_script_422_struct(2,0,0) script_422(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 5; + ivar3 = 5; + if ((arg0 <= ivar2) || (arg1 <= ivar3)) { + return newstruct cs2func_script_422_struct(ivar2, ivar3); + } + if (arg0 > arg1) { + ivar2 = multiply(ivar2, divide(arg0, arg1)); + } else { + if (arg1 > arg0) { + ivar3 = multiply(ivar3, divide(arg1, arg0)); + } + } + return newstruct cs2func_script_422_struct(ivar2, ivar3); +} diff --git a/dumps/scripts/4220.cs2 b/dumps/scripts/4220.cs2 new file mode 100644 index 000000000..9bbbb697e --- /dev/null +++ b/dumps/scripts/4220.cs2 @@ -0,0 +1,4 @@ +void script_4220() { + script_304(50154759); + return; +} diff --git a/dumps/scripts/4221.cs2 b/dumps/scripts/4221.cs2 new file mode 100644 index 000000000..1dfe2d09b --- /dev/null +++ b/dumps/scripts/4221.cs2 @@ -0,0 +1,4 @@ +void script_4221() { + script_304(49761550); + return; +} diff --git a/dumps/scripts/4222.cs2 b/dumps/scripts/4222.cs2 new file mode 100644 index 000000000..c40e9b04a --- /dev/null +++ b/dumps/scripts/4222.cs2 @@ -0,0 +1,37 @@ +void script_4222() { + if ((globalint_1468 > 100) && (globalint_1468 <= 355)) { + cs2method2103(subtract(255, subtract(globalint_1468, 100)), new WidgetPointer(1075,0)); + } + if ((globalint_1468 > 100) && (globalint_1468 <= 150)) { + setWidgetPosition(add(-35, subtract(globalint_1468, 100)), 122, 0, 0, new WidgetPointer(1075,4)); + } + if ((globalint_1468 > 200) && (globalint_1468 <= 455)) { + setWidgetPosition(add(-255, subtract(globalint_1468, 200)), 70, 0, 0, new WidgetPointer(1075,1)); + } + if ((globalint_1468 > 250) && (globalint_1468 <= 505)) { + setWidgetPosition(add(-255, subtract(globalint_1468, 250)), 85, 0, 0, new WidgetPointer(1075,2)); + } + if ((globalint_1468 > 300) && (globalint_1468 <= 555)) { + setWidgetPosition(add(-255, subtract(globalint_1468, 300)), 100, 0, 0, new WidgetPointer(1075,3)); + } + if ((globalint_1468 > 500) && (globalint_1468 <= 755)) { + setWidgetPosition(subtract(0, subtract(globalint_1468, 500)), 70, 0, 0, new WidgetPointer(1075,1)); + } + if ((globalint_1468 > 550) && (globalint_1468 <= 805)) { + setWidgetPosition(subtract(0, subtract(globalint_1468, 550)), 85, 0, 0, new WidgetPointer(1075,2)); + } + if ((globalint_1468 > 600) && (globalint_1468 <= 855)) { + setWidgetPosition(subtract(0, subtract(globalint_1468, 600)), 100, 0, 0, new WidgetPointer(1075,3)); + } + if (globalint_1468 == 700) { + setWidget3DRotation(0, 0, 0, 210, 0, 1750, new WidgetPointer(1075,4)); + } + if ((globalint_1468 > 700) && (globalint_1468 <= 955)) { + cs2method2103(subtract(globalint_1468, 700), new WidgetPointer(1075,0)); + } + if ((globalint_1468 > 700) && (globalint_1468 <= 750)) { + setWidgetPosition(subtract(0, subtract(globalint_1468, 700)), 122, 0, 0, new WidgetPointer(1075,4)); + } + globalint_1468 = add(globalint_1468, 1); + return; +} diff --git a/dumps/scripts/4223.cs2 b/dumps/scripts/4223.cs2 new file mode 100644 index 000000000..d09fdeabf --- /dev/null +++ b/dumps/scripts/4223.cs2 @@ -0,0 +1,18 @@ +void script_4223() { + cs2method2310(new WidgetPointer(944,79), "Make 100"); + cs2method2310(new WidgetPointer(944,80), "Make 50"); + cs2method2310(new WidgetPointer(944,81), "Make 10"); + cs2method2310(new WidgetPointer(944,26), "Make 100"); + cs2method2310(new WidgetPointer(944,27), "Make 50"); + cs2method2310(new WidgetPointer(944,28), "Make 10"); + cs2method2310(new WidgetPointer(944,32), "Make 100"); + cs2method2310(new WidgetPointer(944,33), "Make 50"); + cs2method2310(new WidgetPointer(944,34), "Make 10"); + cs2method2310(new WidgetPointer(944,38), "Make 100"); + cs2method2310(new WidgetPointer(944,39), "Make 50"); + cs2method2310(new WidgetPointer(944,40), "Make 10"); + cs2method2310(new WidgetPointer(944,44), "Make 100"); + cs2method2310(new WidgetPointer(944,45), "Make 50"); + cs2method2310(new WidgetPointer(944,46), "Make 10"); + return; +} diff --git a/dumps/scripts/4224.cs2 b/dumps/scripts/4224.cs2 new file mode 100644 index 000000000..afc5a45e3 --- /dev/null +++ b/dumps/scripts/4224.cs2 @@ -0,0 +1,10 @@ +void script_4224(int arg0) { + if (arg0 == 61145417) { + setWidgetIsHidden(true, new WidgetPointer(933,329)); + setWidgetIsHidden(false, new WidgetPointer(933,330)); + } else { + setWidgetIsHidden(true, new WidgetPointer(933,330)); + setWidgetIsHidden(false, new WidgetPointer(933,329)); + } + return; +} diff --git a/dumps/scripts/4225.cs2 b/dumps/scripts/4225.cs2 new file mode 100644 index 000000000..ea48381ee --- /dev/null +++ b/dumps/scripts/4225.cs2 @@ -0,0 +1,7 @@ +void script_4225() { + setScriptCallOnMouseOver(4226, "", new WidgetPointer(746,190)); + setScriptCallOnMouseExit(40, new WidgetPointer(746,186), "I", new WidgetPointer(746,190)); + setScriptCallOnMouseOver(4226, "", new WidgetPointer(548,27)); + setScriptCallOnMouseExit(40, new WidgetPointer(548,23), "I", new WidgetPointer(548,27)); + return; +} diff --git a/dumps/scripts/4226.cs2 b/dumps/scripts/4226.cs2 new file mode 100644 index 000000000..900b3847c --- /dev/null +++ b/dumps/scripts/4226.cs2 @@ -0,0 +1,3 @@ +void script_4226() { + return; +} diff --git a/dumps/scripts/4227.cs2 b/dumps/scripts/4227.cs2 new file mode 100644 index 000000000..bf04eecd7 --- /dev/null +++ b/dumps/scripts/4227.cs2 @@ -0,0 +1,127 @@ +void script_4227(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + string svar0; + string svar1; + string stack_dump0; + int stack_dump1; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar2 = 0; + ivar3 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(125, 3)), 2); + ivar4 = getCommonDefinitionSize(828); + ivar5 = 0; + ivar6 = 0; + while (ivar2 < ivar4) { + createExtraChild(new WidgetPointer(arg0), 5, ivar2); + setWidgetSize(subtract(125, 4), subtract(125, 4), 0, 0); + if (((boolean)ivar5)) { + setWidgetPosition(2, add(ivar6, 2), 0, 0); + ivar5 = 1; + } else if (((boolean)ivar5)) { + setWidgetPosition(0, add(ivar6, 2), 1, 0); + ivar5 = 2; + } else { + setWidgetPosition(2, add(ivar6, 2), 2, 0); + ivar5 = 0; + ivar6 = add(add(ivar6, 125), ivar3); + } + setWidgetSprite(297); + cs2method1107(1); + ivar2 = add(ivar2, 1); + } + if (((boolean)ivar5)) { + ivar6 = max(subtract(ivar6, ivar3), 0); + } + setWidgetScrollMax(0, ivar6, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + ivar7 = -1; + svar0 = ""; + svar1 = ""; + ivar8 = 0; + ivar9 = 0; + ivar10 = subtract(125, 18); + ivar2 = 0; + while (ivar2 < ivar4) { + ivar7 = cs2method_3408(105, 79, 828, ivar2); + if ((ivar7 != -1) && setWidgetRegister(new WidgetPointer(arg0), ivar2)) { + stack_dump0 = getItemHashmapData(ivar7, 1367); + svar1 = getItemHashmapData(ivar7, 1368); + svar0 = stack_dump0; + ivar3 = getItemHashmapData(ivar7, 1366); + stack_dump1 = subtract(getWidgetActualX(), 2); + ivar6 = subtract(getWidgetActualY(), 2); + ivar5 = stack_dump1; + ivar8 = subtract(add(ivar5, 125), 9); + ivar9 = subtract(add(ivar6, 125), 9); + createExtraChild(new WidgetPointer(arg0), 6, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(75, 75, 0, 0); + setWidgetPosition(add(ivar5, 25), add(ivar6, 20), 0, 0); + setItemOnWidgetMethod1205(ivar7, 1); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(125, 20, 0, 0); + setWidgetPosition(ivar5, add(ivar6, 5), 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(true); + setWidgetText(svar0); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(125, 20, 0, 0); + setWidgetPosition(ivar5, subtract(add(ivar6, 125), 25), 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(true); + script_4229(ivar3, svar1); + setScriptCallOnConfigChange(4228, new WidgetPointer(-32768,3), -2147483643, ivar3, svar1, 294, 1, "IiisY"); + setScriptCallOnItemContainerUpdate(4228, new WidgetPointer(-32768,3), -2147483643, ivar3, svar1, 93, 94, 2, "IiisY"); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(9, 9, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(913); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(9, 9, 0, 0); + setWidgetPosition(ivar8, ivar6, 0, 0); + setWidgetSprite(914); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(9, 9, 0, 0); + setWidgetPosition(ivar5, ivar9, 0, 0); + setWidgetSprite(915); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(9, 9, 0, 0); + setWidgetPosition(ivar8, ivar9, 0, 0); + setWidgetSprite(916); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(9, ivar10, 0, 0); + setWidgetPosition(ivar5, add(ivar6, 9), 0, 0); + setWidgetSprite(917); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar10, 9, 0, 0); + setWidgetPosition(add(ivar5, 9), ivar6, 0, 0); + setWidgetSprite(918); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(9, ivar10, 0, 0); + setWidgetPosition(ivar8, add(ivar6, 9), 0, 0); + setWidgetSprite(919); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar10, 9, 0, 0); + setWidgetPosition(add(ivar5, 9), ivar9, 0, 0); + setWidgetSprite(920); + setWidgetContextMenuOption(1, "Claim"); + setWidgetContextMenuOption(10, "Examine"); + svar0 = script_2332(svar0, "
", " "); + cs2method1305("" + svar0); + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, 897, "Iid"); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, 297, "Iid"); + } + ivar2 = add(ivar2, 1); + } + return; +} diff --git a/dumps/scripts/4228.cs2 b/dumps/scripts/4228.cs2 new file mode 100644 index 000000000..303482b4c --- /dev/null +++ b/dumps/scripts/4228.cs2 @@ -0,0 +1,6 @@ +void script_4228(int arg0,int arg1,int arg2,string arg3) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + script_4229(arg2, arg3); + } + return; +} diff --git a/dumps/scripts/4229.cs2 b/dumps/scripts/4229.cs2 new file mode 100644 index 000000000..921469bc0 --- /dev/null +++ b/dumps/scripts/4229.cs2 @@ -0,0 +1,15 @@ +void script_4229(int arg0,string arg1) { + flow_0: + IF (((getItemAmtInContainer(93, 2883) > 0) || (getItemIdInSlot(94, 3) == 2883)) || (getItemAmtInContainer(93, 4827) > 0)) + GOTO flow_1 + IF ((getItemIdInSlot(94, 3) == 4827) && (standart_config_294 >= arg0)) + GOTO flow_2 + GOTO flow_3 + flow_1: + flow_2: + setWidgetText(arg1 + "
" + "Kills: " + intToStr(arg0)); + return; + flow_3: + setWidgetText(arg1 + "
" + "" + "Kills: " + intToStr(arg0)); + return; +} diff --git a/dumps/scripts/423.cs2 b/dumps/scripts/423.cs2 new file mode 100644 index 000000000..687e2d876 --- /dev/null +++ b/dumps/scripts/423.cs2 @@ -0,0 +1,10 @@ +void script_423() { + if (globalint_1353 != -1) { + cameraMethod5511(globalint_1353); + } else { + if (globalint_1354 != -1) { + cameraMethod5511(globalint_1354); + } + } + return; +} diff --git a/dumps/scripts/4230.cs2 b/dumps/scripts/4230.cs2 new file mode 100644 index 000000000..ededc1379 --- /dev/null +++ b/dumps/scripts/4230.cs2 @@ -0,0 +1,60 @@ +void script_4230(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (arg0 < 1) { + setWidgetModel(20542, new WidgetPointer(495,2)); + setWidgetModel(20542, new WidgetPointer(495,15)); + setWidgetModel(20542, new WidgetPointer(495,28)); + setWidgetModel(20542, new WidgetPointer(495,41)); + } else { + setWidgetModel(20544, new WidgetPointer(495,2)); + setWidgetModel(20544, new WidgetPointer(495,15)); + setWidgetModel(20544, new WidgetPointer(495,28)); + setWidgetModel(20544, new WidgetPointer(495,41)); + } + if (arg1 < 1) { + setWidgetModel(20542, new WidgetPointer(495,3)); + setWidgetModel(20542, new WidgetPointer(495,16)); + setWidgetModel(20542, new WidgetPointer(495,29)); + setWidgetModel(20542, new WidgetPointer(495,42)); + } else { + setWidgetModel(20545, new WidgetPointer(495,3)); + setWidgetModel(20545, new WidgetPointer(495,16)); + setWidgetModel(20545, new WidgetPointer(495,29)); + setWidgetModel(20545, new WidgetPointer(495,42)); + } + if (arg2 < 1) { + setWidgetModel(20542, new WidgetPointer(495,4)); + setWidgetModel(20542, new WidgetPointer(495,17)); + setWidgetModel(20542, new WidgetPointer(495,30)); + setWidgetModel(20542, new WidgetPointer(495,43)); + } else { + setWidgetModel(20543, new WidgetPointer(495,4)); + setWidgetModel(20543, new WidgetPointer(495,17)); + setWidgetModel(20543, new WidgetPointer(495,30)); + setWidgetModel(20543, new WidgetPointer(495,43)); + } + if (arg4 != 10) { + setWidgetModel(20542, new WidgetPointer(495,53)); + } else { + if (arg3 < 1) { + setWidgetModel(20542, new WidgetPointer(495,53)); + } + } + setWidgetText(new WidgetPointer(495,57), intToStr(arg0)); + setWidgetText(new WidgetPointer(495,60), intToStr(arg0)); + setWidgetText(new WidgetPointer(495,63), intToStr(arg0)); + setWidgetText(new WidgetPointer(495,66), intToStr(arg0)); + setWidgetText(new WidgetPointer(495,58), intToStr(arg1)); + setWidgetText(new WidgetPointer(495,61), intToStr(arg1)); + setWidgetText(new WidgetPointer(495,64), intToStr(arg1)); + setWidgetText(new WidgetPointer(495,67), intToStr(arg1)); + setWidgetText(new WidgetPointer(495,59), intToStr(arg2)); + setWidgetText(new WidgetPointer(495,62), intToStr(arg2)); + setWidgetText(new WidgetPointer(495,65), intToStr(arg2)); + setWidgetText(new WidgetPointer(495,68), intToStr(arg2)); + if (arg4 != 10) { + setWidgetText(new WidgetPointer(495,69), "0"); + } else { + setWidgetText(new WidgetPointer(495,69), intToStr(arg3)); + } + return; +} diff --git a/dumps/scripts/4231.cs2 b/dumps/scripts/4231.cs2 new file mode 100644 index 000000000..e81a6112e --- /dev/null +++ b/dumps/scripts/4231.cs2 @@ -0,0 +1,9 @@ +void script_4231(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0))) { + setScriptCallOnMousePressed(4209, new WidgetPointer(arg0), 0, "Ii"); + setScriptCallOnMouseDraggedOver(4209, new WidgetPointer(arg0), 0, "Ii"); + setScriptCallOnMouseReleased(4209, new WidgetPointer(arg0), 1, "Ii"); + cs2method2103(255); + } + return; +} diff --git a/dumps/scripts/4232.cs2 b/dumps/scripts/4232.cs2 new file mode 100644 index 000000000..ca03f7619 --- /dev/null +++ b/dumps/scripts/4232.cs2 @@ -0,0 +1,8 @@ +void script_4232(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0))) { + setScriptCallOnMouseEntered(4209, new WidgetPointer(arg0), 0, "Ii"); + setScriptCallOnMouseExit(4209, new WidgetPointer(arg0), 1, "Ii"); + cs2method2103(255); + } + return; +} diff --git a/dumps/scripts/4233.cs2 b/dumps/scripts/4233.cs2 new file mode 100644 index 000000000..e122db9cb --- /dev/null +++ b/dumps/scripts/4233.cs2 @@ -0,0 +1,5 @@ +void script_4233(int arg0,int arg1,int arg2,int arg3) { + setScriptCallOnGameloop(4234, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), getClientCycle(), arg3, "IIIii", new WidgetPointer(arg0)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4234.cs2 b/dumps/scripts/4234.cs2 new file mode 100644 index 000000000..a741e02e6 --- /dev/null +++ b/dumps/scripts/4234.cs2 @@ -0,0 +1,20 @@ +void script_4234(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + ivar5 = 0; + ivar6 = divide(65353, arg4); + ivar5 = max(0, subtract(arg4, subtract(getClientCycle(), arg3))); + if ((ivar5 >= divide(arg4, 2)) && (ivar5 <= arg4)) { + cs2method2106(min(multiply(ivar5, ivar6), 65353), new WidgetPointer(arg2)); + cs2method2106(0, new WidgetPointer(arg1)); + } else if ((ivar5 > 0) && (ivar5 < divide(arg4, 2))) { + cs2method2106(32768, new WidgetPointer(arg2)); + cs2method2106(min(add(32768, multiply(ivar5, ivar6)), 65353), new WidgetPointer(arg1)); + } else { + cs2method2106(32768, new WidgetPointer(arg2)); + cs2method2106(32768, new WidgetPointer(arg1)); + setScriptCallOnClickContextMenu(4233, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), arg4, "IIIi", new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4235.cs2 b/dumps/scripts/4235.cs2 new file mode 100644 index 000000000..b59b9ab41 --- /dev/null +++ b/dumps/scripts/4235.cs2 @@ -0,0 +1,7 @@ +void script_4235() { + if (globalint_1494 > 100) { + globalint_1494 = 100; + } + setWidgetSize(multiplyDivide(globalint_1494, 100, 16384), 16384, 2, 2, new WidgetPointer(481,15)); + return; +} diff --git a/dumps/scripts/4236.cs2 b/dumps/scripts/4236.cs2 new file mode 100644 index 000000000..e957bc492 --- /dev/null +++ b/dumps/scripts/4236.cs2 @@ -0,0 +1,5 @@ +void script_4236(int arg0) { + setScriptCallOnUse(4239, "", new WidgetPointer(arg0)); + setScriptCallOnUseWith(4240, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4237.cs2 b/dumps/scripts/4237.cs2 new file mode 100644 index 000000000..e180b32d1 --- /dev/null +++ b/dumps/scripts/4237.cs2 @@ -0,0 +1,8 @@ +void script_4237() { + if (((boolean)globalint_1495) && (bitconfig_8960 > 0)) { + globalint_1495 = getClientCycle(); + } else { + return; + } + return; +} diff --git a/dumps/scripts/4238.cs2 b/dumps/scripts/4238.cs2 new file mode 100644 index 000000000..f6e2ece56 --- /dev/null +++ b/dumps/scripts/4238.cs2 @@ -0,0 +1,21 @@ +void script_4238(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 0; + if (globalint_1495 != 0) { + ivar3 = max(0, subtract(120, subtract(getClientCycle(), globalint_1495))); + } + if ((ivar3 >= 60) && (ivar3 <= 120)) { + cs2method2106(min(multiply(ivar3, 545), 65353), new WidgetPointer(arg2)); + cs2method2106(0, new WidgetPointer(arg1)); + } else if ((ivar3 > 0) && (ivar3 < 60)) { + cs2method2106(32768, new WidgetPointer(arg2)); + cs2method2106(min(add(32768, multiply(ivar3, 545)), 65353), new WidgetPointer(arg1)); + } else { + cs2method2106(32768, new WidgetPointer(arg2)); + cs2method2106(32768, new WidgetPointer(arg1)); + if (globalint_1495 != 0) { + globalint_1495 = 0; + } + } + return; +} diff --git a/dumps/scripts/4239.cs2 b/dumps/scripts/4239.cs2 new file mode 100644 index 000000000..6ef7584bf --- /dev/null +++ b/dumps/scripts/4239.cs2 @@ -0,0 +1,5 @@ +void script_4239() { + setWidgetBorderThickness(2, new WidgetPointer(1078,23)); + script_4161(70647825, 0); + return; +} diff --git a/dumps/scripts/424.cs2 b/dumps/scripts/424.cs2 new file mode 100644 index 000000000..9784df81b --- /dev/null +++ b/dumps/scripts/424.cs2 @@ -0,0 +1,18 @@ +void script_424() { + int ivar0; + int ivar1; + string svar0; + ivar0 = divide(multiply(globalint_1365, 6), 10); + ivar1 = 0; + svar0 = "1 minute"; + if (ivar0 < 60) { + setWidgetText(new WidgetPointer(1027,24), "Your opponent has logged out." + "
" + "You may wait for them to return or end the Conquest now and be declared the winner."); + return; + } + if (ivar0 > 120) { + ivar1 = divide(ivar0, 60); + svar0 = intToStr(ivar1) + " minutes"; + } + setWidgetText(new WidgetPointer(1027,24), "Your opponent has been logged out for " + svar0 + "." + "
" + "You may wait for them to return or end the Conquest now and be declared the winner."); + return; +} diff --git a/dumps/scripts/4240.cs2 b/dumps/scripts/4240.cs2 new file mode 100644 index 000000000..518dfc7a4 --- /dev/null +++ b/dumps/scripts/4240.cs2 @@ -0,0 +1,5 @@ +void script_4240() { + setWidgetBorderThickness(0, new WidgetPointer(1078,23)); + script_4161(70647825, 255); + return; +} diff --git a/dumps/scripts/4241.cs2 b/dumps/scripts/4241.cs2 new file mode 100644 index 000000000..396ae15e4 --- /dev/null +++ b/dumps/scripts/4241.cs2 @@ -0,0 +1,4 @@ +void script_4241() { + setWidgetSize(multiplyDivide(bitconfig_8959, 10, 16384), 16384, 2, 2, new WidgetPointer(1078,7)); + return; +} diff --git a/dumps/scripts/4242.cs2 b/dumps/scripts/4242.cs2 new file mode 100644 index 000000000..d6b92d17c --- /dev/null +++ b/dumps/scripts/4242.cs2 @@ -0,0 +1,41 @@ +string script_4242(int arg0) { + switch (arg0) { + case 1: + return "You are more likely to hit with your melee attacks." + "
" + "
"; + case 2: + return "You are able to deal more damage with your melee attacks." + "
" + "
"; + case 5: + return "You are less likely to be hit by an enemy's attacks." + "
" + "
"; + case 3: + return "You are more likely to hit with your ranged attacks." + "
" + "
"; + case 7: + return "You are able to sustain your prayers for longer before needing to recharge." + "
" + "
"; + case 4: + return "Your ability to hit with and defend against magical attacks is improved." + "
" + "
"; + case 6: + return "Your maximum lifepoints have been increased by 10." + "
" + "
"; + case 8: + return "Your chance of failing agility shortcuts and obstacles is reduced." + "
" + "
"; + case 10: + return "You are more likely to succeed when picking pockets or locks." + "
" + "
"; + case 13: + return "You are more likely to succeed when attempting to mine ore." + "
" + "
"; + case 15: + return "You are more likely to succeed when attempting to catch a fish." + "
" + "
"; + case 16: + return "Your likelihood of burning food is decreased." + "
" + "
"; + case 17: + return "Your chance of success when lighting a fire is improved." + "
" + "
"; + case 18: + return "You are more likely to succeed when attempting to cut a log." + "
" + "
"; + case 12: + return "Your chance of crafting multiple runes from a single piece of essence is increased." + "
" + "
"; + case 21: + return "Your chance of successfully pruning diseased plants is increased." + "
" + "
"; + case 23: + return "Your chance of successfully trapping creatures is increased." + "
" + "
"; + case 24: + return "You are able to sustain your familiars for longer before needing to recharge." + "
" + "
"; + } + return ""; +} diff --git a/dumps/scripts/4243.cs2 b/dumps/scripts/4243.cs2 new file mode 100644 index 000000000..93c7393b0 --- /dev/null +++ b/dumps/scripts/4243.cs2 @@ -0,0 +1,174 @@ +int script_4243() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + string svar0; + string svar1; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = -1; + svar0 = ""; + svar1 = ""; + ivar4 = 0; + ivar5 = -1; + ivar6 = -1; + ivar7 = 0; + ivar8 = 0; + ivar9 = 3656; + ivar10 = -1; + ivar11 = -1; + ivar12 = 0; + ivar13 = 23; + ivar14 = 23; + ivar15 = 0; + while (ivar0 < getCommonDefinitionSize(ivar9)) { + ivar1 = cs2method_3408(105, 105, ivar9, ivar0); + ivar3 = cs2method_3408(105, 74, 3483, ivar1); + if ((ivar3 != -1) && (script_3227(ivar1) != 2)) { + svar0 = getOtherCommonData(ivar3, 1266); + if (getOtherCommonData(ivar3, 1270) != 4094) { + ivar5 = getOtherCommonData(cs2method_3408(105, 74, 2252, getOtherCommonData(ivar3, 1270)), 952); + } else { + ivar5 = getOtherCommonData(ivar3, 1271); + } + createExtraChild(new WidgetPointer(917,98), 5, ivar7); + ivar11 = 4041; + ivar10 = 4042; + setWidgetSprite(ivar11); + setScriptCallOnMouseEntered(4013, -2147483643, ivar10, "id"); + setScriptCallOnMouseExit(4013, -2147483643, ivar11, "id"); + setWidgetSize(add(70, 2), add(56, 1), 0, 0); + setWidgetPosition(subtract(ivar13, 1), subtract(ivar14, 1), 0, 0); + setWidgetContextMenuOption(1, "Summary for"); + if (bitconfig_8576 == ivar1) { + setWidgetContextMenuOption(2, "Unpin"); + } else { + setWidgetContextMenuOption(2, "Pin"); + } + cs2method1305(svar0); + setScriptCallOnClickContextMenu(3990, ivar1, -2147483643, -2147483644, "iii"); + if (((boolean)script_3999(ivar1))) { + svar1 = " -" + "
"; + svar1 = concat(getOtherCommonData(ivar3, 1266), svar1); + svar1 = concat(svar1, getOtherCommonData(ivar3, 1273)); + setScriptCallOnMouseOver(3998, ivar7, svar1, "is"); + } + if (((boolean)script_3994(ivar1)) && (ivar1 != 4094)) { + globalint_1422 = ivar7; + } + createExtraChild(new WidgetPointer(917,98), 5, add(ivar7, 1)); + setWidgetSize(50, 50, 0, 0); + setWidgetSprite(ivar5); + setWidgetPosition(add(ivar13, 2), add(ivar14, 2), 0, 0); + cs2method2103(ivar15); + createExtraChild(new WidgetPointer(917,98), 5, add(ivar7, 2)); + setWidgetSize(14, 18, 0, 0); + if (((boolean)script_3996(ivar1))) { + ivar6 = 4346; + setWidgetSize(11, 11, 0, 0); + } else { + ivar6 = -1; + } + setWidgetSprite(ivar6); + setWidgetPosition(subtract(add(ivar13, 70), 16), add(ivar14, 4), 0, 0); + createExtraChild(new WidgetPointer(917,98), 5, add(ivar7, 3)); + setWidgetSize(11, 11, 0, 0); + setWidgetPosition(subtract(add(ivar13, 70), 17), add(ivar14, 39), 0, 0); + if (((boolean)script_3994(ivar1))) { + setWidgetSprite(4296); + } + ivar8 = add(ivar8, 1); + ivar7 = multiply(ivar8, 4); + ivar13 = add(add(ivar13, 70), 23); + ivar12 = mod(add(ivar12, 1), 5); + if (((boolean)ivar12)) { + ivar14 = add(add(ivar14, 56), 23); + ivar13 = 23; + } + } + ivar0 = add(ivar0, 1); + } + ivar0 = 0; + while (ivar0 < getCommonDefinitionSize(ivar9)) { + ivar1 = cs2method_3408(105, 105, ivar9, ivar0); + ivar3 = cs2method_3408(105, 74, 3483, ivar1); + if ((ivar3 != -1) && (script_3227(ivar1) == 2)) { + svar0 = getOtherCommonData(ivar3, 1266); + if (getOtherCommonData(ivar3, 1270) != 4094) { + ivar5 = getOtherCommonData(cs2method_3408(105, 74, 2252, getOtherCommonData(ivar3, 1270)), 952); + } else { + ivar5 = getOtherCommonData(ivar3, 1271); + } + createExtraChild(new WidgetPointer(917,98), 5, ivar7); + ivar11 = 4043; + ivar10 = 4043; + setWidgetSprite(ivar11); + setScriptCallOnMouseEntered(4013, -2147483643, ivar10, "id"); + setScriptCallOnMouseExit(4013, -2147483643, ivar11, "id"); + setWidgetSize(add(70, 2), add(56, 1), 0, 0); + setWidgetPosition(subtract(ivar13, 1), subtract(ivar14, 1), 0, 0); + setWidgetContextMenuOption(1, "Summary for"); + cs2method1305(svar0); + setScriptCallOnClickContextMenu(3990, ivar1, -2147483643, -2147483644, "iii"); + if (((boolean)script_3999(ivar1))) { + svar1 = " -" + "
"; + svar1 = concat(getOtherCommonData(ivar3, 1266), svar1); + svar1 = concat(svar1, getOtherCommonData(ivar3, 1273)); + setScriptCallOnMouseOver(3998, ivar7, svar1, "is"); + } + if (((boolean)script_3994(ivar1)) && (ivar1 != 4094)) { + globalint_1422 = ivar7; + } + createExtraChild(new WidgetPointer(917,98), 5, add(ivar7, 1)); + setWidgetSize(50, 50, 0, 0); + setWidgetSprite(ivar5); + setWidgetPosition(add(ivar13, 2), add(ivar14, 2), 0, 0); + cs2method2103(ivar15); + createExtraChild(new WidgetPointer(917,98), 5, add(ivar7, 2)); + setWidgetSize(14, 18, 0, 0); + if (((boolean)script_3996(ivar1))) { + ivar6 = 4346; + setWidgetSize(11, 11, 0, 0); + } else { + ivar6 = -1; + } + setWidgetSprite(ivar6); + setWidgetPosition(subtract(add(ivar13, 70), 16), add(ivar14, 4), 0, 0); + createExtraChild(new WidgetPointer(917,98), 5, add(ivar7, 3)); + setWidgetSize(11, 11, 0, 0); + setWidgetPosition(subtract(add(ivar13, 70), 17), add(ivar14, 39), 0, 0); + if (((boolean)script_3994(ivar1))) { + setWidgetSprite(4296); + } + ivar8 = add(ivar8, 1); + ivar7 = multiply(ivar8, 4); + ivar13 = add(add(ivar13, 70), 23); + ivar12 = mod(add(ivar12, 1), 5); + if (((boolean)ivar12)) { + ivar14 = add(add(ivar14, 56), 23); + ivar13 = 23; + } + } + ivar0 = add(ivar0, 1); + } + if (ivar12 != 0) { + ivar14 = add(ivar14, 56); + } else { + ivar14 = subtract(ivar14, 23); + } + return ivar14; +} diff --git a/dumps/scripts/4244.cs2 b/dumps/scripts/4244.cs2 new file mode 100644 index 000000000..06859a5ec --- /dev/null +++ b/dumps/scripts/4244.cs2 @@ -0,0 +1,4 @@ +void script_4244() { + script_4248(0, 0, 0, 0, 494, ""); + return; +} diff --git a/dumps/scripts/4245.cs2 b/dumps/scripts/4245.cs2 new file mode 100644 index 000000000..a649a9bb7 --- /dev/null +++ b/dumps/scripts/4245.cs2 @@ -0,0 +1,8 @@ +void script_4245(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + if (getDisplayMode() >= 2) { + script_4248(arg0, arg1, arg2, arg3, arg4, arg5); + } else { + script_4247(arg0, arg1, arg2, arg3, arg4, arg5); + } + return; +} diff --git a/dumps/scripts/4246.cs2 b/dumps/scripts/4246.cs2 new file mode 100644 index 000000000..20b0f136f --- /dev/null +++ b/dumps/scripts/4246.cs2 @@ -0,0 +1,4 @@ +void script_4246() { + script_4249(1); + return; +} diff --git a/dumps/scripts/4247.cs2 b/dumps/scripts/4247.cs2 new file mode 100644 index 000000000..a8be7d9cc --- /dev/null +++ b/dumps/scripts/4247.cs2 @@ -0,0 +1,37 @@ +void script_4247(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + if (isParent(new WidgetPointer(script_8(1)), 1056)) { + arg5 = ""; + } + if ((((divide(extractX(getMyPositionHash()), 64) < 48) || (divide(extractX(getMyPositionHash()), 64) > 52)) || (divide(extractY(getMyPositionHash()), 64) < 48)) || (divide(extractY(getMyPositionHash()), 64) > 52)) { + arg5 = ""; + } + if (arg3 == -1) { + arg3 = 16777215; + } + if (arg4 == -1) { + arg4 = 5631; + } + setWidgetIsHidden(true, new WidgetPointer(746,185)); + setWidgetIsHidden(true, new WidgetPointer(548,196)); + if (((boolean)stringMethod4107(arg5, ""))) { + return; + } + setWidgetText(new WidgetPointer(548,236), arg5); + setWidgetPosition(arg0, arg1, 2, 2, new WidgetPointer(548,196)); + setWidgetRGB(new Color(arg3), new WidgetPointer(548,236)); + setWidgetFont(arg4, new WidgetPointer(548,236)); + if (((boolean)arg2)) { + setWidgetIsHidden(false, new WidgetPointer(548,238)); + setWidgetIsHidden(true, new WidgetPointer(548,239)); + } else { + setWidgetIsHidden(true, new WidgetPointer(548,238)); + setWidgetIsHidden(false, new WidgetPointer(548,239)); + } + setWidgetIsHidden(false, new WidgetPointer(548,196)); + if (((boolean)stringMethod4107(arg5, "The '?' icon will add an arrow to the screen which points to your destination.")) && ((boolean)getLanguage())) { + setWidgetIsHidden(false, new WidgetPointer(548,237)); + } else { + setWidgetIsHidden(true, new WidgetPointer(548,237)); + } + return; +} diff --git a/dumps/scripts/4248.cs2 b/dumps/scripts/4248.cs2 new file mode 100644 index 000000000..d0c5d6de8 --- /dev/null +++ b/dumps/scripts/4248.cs2 @@ -0,0 +1,34 @@ +void script_4248(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + if (isParent(new WidgetPointer(script_8(1)), 1056)) { + arg5 = ""; + } + if (arg3 == -1) { + arg3 = 16777215; + } + if (arg4 == -1) { + arg4 = 5631; + } + setWidgetIsHidden(true, new WidgetPointer(746,185)); + setWidgetIsHidden(true, new WidgetPointer(548,196)); + if (((boolean)stringMethod4107(arg5, ""))) { + return; + } + setWidgetText(new WidgetPointer(746,241), arg5); + setWidgetPosition(arg0, arg1, 2, 2, new WidgetPointer(746,185)); + setWidgetRGB(new Color(arg3), new WidgetPointer(746,241)); + setWidgetFont(arg4, new WidgetPointer(746,241)); + if (((boolean)arg2)) { + setWidgetIsHidden(false, new WidgetPointer(746,243)); + setWidgetIsHidden(true, new WidgetPointer(746,244)); + } else { + setWidgetIsHidden(true, new WidgetPointer(746,243)); + setWidgetIsHidden(false, new WidgetPointer(746,244)); + } + setWidgetIsHidden(false, new WidgetPointer(746,185)); + if (((boolean)stringMethod4107(arg5, "The '?' icon will add an arrow to the screen which points to your destination.")) && ((boolean)getLanguage())) { + setWidgetIsHidden(false, new WidgetPointer(746,242)); + } else { + setWidgetIsHidden(true, new WidgetPointer(746,242)); + } + return; +} diff --git a/dumps/scripts/4249.cs2 b/dumps/scripts/4249.cs2 new file mode 100644 index 000000000..eeedfe863 --- /dev/null +++ b/dumps/scripts/4249.cs2 @@ -0,0 +1,72 @@ +void script_4249(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + string svar0; + if (((boolean)bitconfig_9030)) { + script_4248(0, 0, 0, 0, 5631, ""); + return; + } + if ((bitconfig_8587 == 419) && isWidgetHidden(new WidgetPointer(1056,130))) { + return; + } + svar0 = ""; + ivar1 = 0; + ivar2 = 0; + ivar3 = 1; + ivar4 = 0; + if (((boolean)arg0)) { + if ((bitconfig_8587 == 419) && isWidgetHidden(new WidgetPointer(1056,122))) { + svar0 = "Click on the first Task in the list for details of how to complete it."; + } else { + if ((bitconfig_8587 == 420) && isWidgetHidden(new WidgetPointer(1056,122))) { + svar0 = "Click on the Task which is now first in the list."; + } + } + if (getDisplayMode() >= 2) { + ivar1 = 180; + ivar2 = 165; + ivar4 = 1; + if (getWidgetActualWidth(new WidgetPointer(746,2)) < 997) { + ivar2 = add(ivar2, 40); + } + } else { + ivar1 = 207; + ivar2 = 156; + } + } else { + script_4089(); + if (bitconfig_8587 == 419) { + svar0 = "Click here to show the Task window."; + } + if (getDisplayMode() >= 2) { + if (getWidgetActualWidth(new WidgetPointer(746,2)) > 997) { + ivar1 = 288; + ivar2 = 39; + ivar3 = 2; + ivar4 = 1; + } else { + ivar1 = 51; + ivar2 = 77; + ivar3 = 2; + ivar4 = 1; + } + } else { + ivar1 = 210; + ivar2 = 254; + } + } + if (((boolean)bitconfig_9030)) { + svar0 = ""; + } + if (isParent(new WidgetPointer(548,8), 1079) || isParent(new WidgetPointer(746,9), 1079)) { + svar0 = ""; + } + if (((boolean)ivar4)) { + script_4247(ivar1, ivar2, ivar3, 16777215, 5631, svar0); + } else { + script_4248(ivar1, ivar2, ivar3, 16777215, 5631, svar0); + } + return; +} diff --git a/dumps/scripts/425.cs2 b/dumps/scripts/425.cs2 new file mode 100644 index 000000000..ba417b0b6 --- /dev/null +++ b/dumps/scripts/425.cs2 @@ -0,0 +1,13 @@ +void script_425() { + if (((boolean)globalint_1366)) { + setWidgetContextMenuOption(1, new WidgetPointer(1019,16), "Accept Victory"); + setWidgetText(new WidgetPointer(1019,16), "Accept Victory"); + setWidgetText(new WidgetPointer(1019,0), "Your opponent has logged out. You may end the Conquest now and be declared the winner."); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(1019,16), "Resign"); + setWidgetText(new WidgetPointer(1019,16), "Resign"); + setWidgetText(new WidgetPointer(1019,0), "If you resign, the Conquest will end immediately."); + sendCloseWidgetPacket(); + } + return; +} diff --git a/dumps/scripts/4250.cs2 b/dumps/scripts/4250.cs2 new file mode 100644 index 000000000..668f2ec23 --- /dev/null +++ b/dumps/scripts/4250.cs2 @@ -0,0 +1,9 @@ +void script_4250() { + int ivar0; + ivar0 = getWidgetActualWidth(new WidgetPointer(548,2)); + if (getDisplayMode() >= 2) { + ivar0 = getWidgetActualWidth(new WidgetPointer(746,2)); + } + messageType0(intToStr(ivar0) + "."); + return; +} diff --git a/dumps/scripts/4251.cs2 b/dumps/scripts/4251.cs2 new file mode 100644 index 000000000..848ec4306 --- /dev/null +++ b/dumps/scripts/4251.cs2 @@ -0,0 +1,44 @@ +void script_4251() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + if (((boolean)bitconfig_9030)) { + return; + } + if (isWidgetHidden(new WidgetPointer(746,185))) { + return; + } + ivar0 = getWidgetActualX(new WidgetPointer(746,185)); + ivar1 = getWidgetActualY(new WidgetPointer(746,185)); + ivar2 = getWidgetActualWidth(new WidgetPointer(746,2)); + svar0 = getWidgetText(new WidgetPointer(746,241)); + if (ivar2 < 998) { + if (((boolean)stringMethod4107(svar0, "Click here to show the Task window."))) { + script_4248(51, 77, 2, 16777215, 5631, svar0); + } else if (((boolean)stringMethod4107(svar0, "Task complete! Click here to return to the task list."))) { + script_4248(158, 45, 1, 16777215, 5631, svar0); + } else if (((boolean)stringMethod4107(svar0, "Click on the first Task in the list for details of how to complete it.")) || ((boolean)stringMethod4107(svar0, "Click on the Task which is now first in the list."))) { + script_4248(180, 205, 1, 16777215, 5631, svar0); + } else if (((boolean)stringMethod4107(svar0, "Click on the Hints tab for more on how to complete this Task.")) || ((boolean)stringMethod4107(svar0, "Remember, the Hints tab provides more details about a Task."))) { + script_4248(196, 223, 1, 16777215, 5631, svar0); + } else { + if (((boolean)stringMethod4107(svar0, "The '?' icon will add an arrow to the screen which points to your destination."))) { + script_4248(196, 127, 1, 16777215, 5631, svar0); + } + } + } else if (((boolean)stringMethod4107(svar0, "Click here to show the Task window."))) { + script_4248(288, 39, 2, 16777215, 5631, svar0); + } else if (((boolean)stringMethod4107(svar0, "Task complete! Click here to return to the task list."))) { + script_4248(158, 5, 1, 16777215, 5631, svar0); + } else if (((boolean)stringMethod4107(svar0, "Click on the first Task in the list for details of how to complete it.")) || ((boolean)stringMethod4107(svar0, "Click on the Task which is now first in the list."))) { + script_4248(180, 165, 1, 16777215, 5631, svar0); + } else if (((boolean)stringMethod4107(svar0, "Click on the Hints tab for more on how to complete this Task.")) || ((boolean)stringMethod4107(svar0, "Remember, the Hints tab provides more details about a Task."))) { + script_4248(196, 183, 1, 16777215, 5631, svar0); + } else { + if (((boolean)stringMethod4107(svar0, "The '?' icon will add an arrow to the screen which points to your destination."))) { + script_4248(196, 87, 1, 16777215, 5631, svar0); + } + } + return; +} diff --git a/dumps/scripts/4252.cs2 b/dumps/scripts/4252.cs2 new file mode 100644 index 000000000..12c4d405b --- /dev/null +++ b/dumps/scripts/4252.cs2 @@ -0,0 +1,12 @@ +void script_4252(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4318, new WidgetPointer(917,166)); + setWidgetSprite(4318, new WidgetPointer(917,167)); + setWidgetSprite(4319, new WidgetPointer(917,168)); + } else { + setWidgetSprite(4316, new WidgetPointer(917,166)); + setWidgetSprite(4316, new WidgetPointer(917,167)); + setWidgetSprite(4317, new WidgetPointer(917,168)); + } + return; +} diff --git a/dumps/scripts/4253.cs2 b/dumps/scripts/4253.cs2 new file mode 100644 index 000000000..0d705368a --- /dev/null +++ b/dumps/scripts/4253.cs2 @@ -0,0 +1,26 @@ +void script_4253() { + if (((boolean)bitconfig_9030)) { + setWidgetText(new WidgetPointer(917,169), "Tutorial is ON"); + } else { + setWidgetText(new WidgetPointer(917,169), "Tutorial is OFF"); + } + if ((bitconfig_9028 == getCommonDefinitionSize(3656)) || (bitconfig_8601 >= 60)) { + setWidgetIsHidden(true, new WidgetPointer(917,165)); + } else { + setWidgetIsHidden(false, new WidgetPointer(917,165)); + } + switch (getLanguage()) { + case 0: + setWidgetSize(77, 18, 0, 0, new WidgetPointer(917,165)); + break; + case 2: + setWidgetSize(112, 18, 0, 0, new WidgetPointer(917,165)); + break; + case 1: + setWidgetSize(135, 18, 0, 0, new WidgetPointer(917,165)); + break; + case 3: + setWidgetSize(109, 18, 0, 0, new WidgetPointer(917,165)); + } + return; +} diff --git a/dumps/scripts/4254.cs2 b/dumps/scripts/4254.cs2 new file mode 100644 index 000000000..67542efd5 --- /dev/null +++ b/dumps/scripts/4254.cs2 @@ -0,0 +1,4 @@ +void script_4254(int arg0,int arg1,int arg2,int arg3,string arg4) { + script_4212(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/4255.cs2 b/dumps/scripts/4255.cs2 new file mode 100644 index 000000000..47feb62d8 --- /dev/null +++ b/dumps/scripts/4255.cs2 @@ -0,0 +1,4 @@ +void script_4255(int arg0,int arg1) { + setScriptCallOnGameloop(4159, new WidgetPointer(-32768,3), arg1, 0, "Iii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4256.cs2 b/dumps/scripts/4256.cs2 new file mode 100644 index 000000000..3befa1f9e --- /dev/null +++ b/dumps/scripts/4256.cs2 @@ -0,0 +1,3 @@ +void script_4256(int arg0) { + return; +} diff --git a/dumps/scripts/4257.cs2 b/dumps/scripts/4257.cs2 new file mode 100644 index 000000000..b9c7f2455 --- /dev/null +++ b/dumps/scripts/4257.cs2 @@ -0,0 +1,10 @@ +void script_4257(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(16, 15, 0, 0); + setWidgetSprite(5450); + setScriptCallOnClickContextMenu(29, ""); + setWidgetContextMenuOption(1, "Close"); + } + return; +} diff --git a/dumps/scripts/4258.cs2 b/dumps/scripts/4258.cs2 new file mode 100644 index 000000000..6cd497076 --- /dev/null +++ b/dumps/scripts/4258.cs2 @@ -0,0 +1,11 @@ +void script_4258(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(16, 15, 0, 0); + setWidgetSprite(5451); + setScriptCallOnMouseEntered(4209, new WidgetPointer(arg0), 0, "Ii"); + setScriptCallOnMouseExit(4209, new WidgetPointer(arg0), 1, "Ii"); + cs2method2103(255); + } + return; +} diff --git a/dumps/scripts/4259.cs2 b/dumps/scripts/4259.cs2 new file mode 100644 index 000000000..e95dea262 --- /dev/null +++ b/dumps/scripts/4259.cs2 @@ -0,0 +1,4 @@ +void script_4259(int arg0) { + script_4211(arg0, 4040, 15458492, 5918266); + return; +} diff --git a/dumps/scripts/426.cs2 b/dumps/scripts/426.cs2 new file mode 100644 index 000000000..bbe13c2e7 --- /dev/null +++ b/dumps/scripts/426.cs2 @@ -0,0 +1,4 @@ +void script_426() { + script_304(50122034); + return; +} diff --git a/dumps/scripts/4260.cs2 b/dumps/scripts/4260.cs2 new file mode 100644 index 000000000..ce8d396e5 --- /dev/null +++ b/dumps/scripts/4260.cs2 @@ -0,0 +1,4 @@ +void script_4260(int arg0) { + script_4530(arg0); + return; +} diff --git a/dumps/scripts/4261.cs2 b/dumps/scripts/4261.cs2 new file mode 100644 index 000000000..b5b05d880 --- /dev/null +++ b/dumps/scripts/4261.cs2 @@ -0,0 +1,4 @@ +void script_4261(int arg0) { + script_4531(arg0); + return; +} diff --git a/dumps/scripts/4262.cs2 b/dumps/scripts/4262.cs2 new file mode 100644 index 000000000..dacedd4c6 --- /dev/null +++ b/dumps/scripts/4262.cs2 @@ -0,0 +1,4 @@ +void script_4262(int arg0) { + script_4532(arg0); + return; +} diff --git a/dumps/scripts/4263.cs2 b/dumps/scripts/4263.cs2 new file mode 100644 index 000000000..f5ef3e7ae --- /dev/null +++ b/dumps/scripts/4263.cs2 @@ -0,0 +1,5 @@ +void script_4263(int arg0,int arg1,int arg2) { + setWidgetPosition(arg1, arg2, 0, 0, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4264.cs2 b/dumps/scripts/4264.cs2 new file mode 100644 index 000000000..b9cc6a6b7 --- /dev/null +++ b/dumps/scripts/4264.cs2 @@ -0,0 +1,6 @@ +void script_4264(int arg0) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(4265, new WidgetPointer(arg0), 14516095, "Ii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4265, new WidgetPointer(arg0), 16711680, "Ii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4265.cs2 b/dumps/scripts/4265.cs2 new file mode 100644 index 000000000..7f48bdb60 --- /dev/null +++ b/dumps/scripts/4265.cs2 @@ -0,0 +1,4 @@ +void script_4265(int arg0,int arg1) { + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4266.cs2 b/dumps/scripts/4266.cs2 new file mode 100644 index 000000000..205c6ae78 --- /dev/null +++ b/dumps/scripts/4266.cs2 @@ -0,0 +1,21 @@ +void script_4266() { + script_4267(); + script_4274(); + setWidgetText(new WidgetPointer(1083,85), ""); + setWidgetText(new WidgetPointer(1083,87), "Select a reward for more information."); + setWidgetText(new WidgetPointer(1083,89), ""); + setWidgetIsHidden(true, new WidgetPointer(1083,90)); + setWidgetIsHidden(true, new WidgetPointer(1083,164)); + setWidgetIsHidden(true, new WidgetPointer(1083,159)); + setWidgetIsHidden(false, new WidgetPointer(1083,157)); + setWidgetIsHidden(false, new WidgetPointer(1083,158)); + setWidgetIsHidden(false, new WidgetPointer(1083,165)); + if (bitconfig_9067 < 11) { + script_4270(); + setWidgetText(new WidgetPointer(1083,85), "Spells"); + } else { + script_4272(); + setWidgetText(new WidgetPointer(1083,85), "Wishes"); + } + return; +} diff --git a/dumps/scripts/4267.cs2 b/dumps/scripts/4267.cs2 new file mode 100644 index 000000000..b1119e89e --- /dev/null +++ b/dumps/scripts/4267.cs2 @@ -0,0 +1,50 @@ +void script_4267() { + int ivar0; + ivar0 = multiply(bitconfig_9065, 10); + setWidgetText(new WidgetPointer(1083,201), script_46(ivar0, ",")); + if (bitconfig_9067 > 0) { + setWidgetSprite(-1, new WidgetPointer(1083,139)); + } + if (bitconfig_9067 > 1) { + setWidgetSprite(-1, new WidgetPointer(1083,135)); + } + if (bitconfig_9067 > 2) { + setWidgetSprite(-1, new WidgetPointer(1083,131)); + } + if (bitconfig_9067 > 3) { + setWidgetSprite(-1, new WidgetPointer(1083,127)); + } + if (bitconfig_9067 > 4) { + setWidgetSprite(-1, new WidgetPointer(1083,123)); + } + if (bitconfig_9067 > 5) { + setWidgetSprite(-1, new WidgetPointer(1083,119)); + } + if (bitconfig_9067 > 6) { + setWidgetSprite(-1, new WidgetPointer(1083,115)); + } + if (bitconfig_9067 > 7) { + setWidgetSprite(-1, new WidgetPointer(1083,111)); + } + if (bitconfig_9067 > 8) { + setWidgetSprite(-1, new WidgetPointer(1083,437)); + } + if (bitconfig_9067 > 9) { + setWidgetSprite(-1, new WidgetPointer(1083,448)); + } + if (bitconfig_9067 > 10) { + setWidgetSprite(-1, new WidgetPointer(1083,459)); + setWidgetSprite(-1, new WidgetPointer(1083,135)); + setWidgetSprite(-1, new WidgetPointer(1083,216)); + setWidgetSprite(-1, new WidgetPointer(1083,220)); + setWidgetSprite(-1, new WidgetPointer(1083,224)); + setWidgetSprite(-1, new WidgetPointer(1083,228)); + setWidgetSprite(-1, new WidgetPointer(1083,232)); + setWidgetSprite(-1, new WidgetPointer(1083,236)); + setWidgetSprite(-1, new WidgetPointer(1083,498)); + setWidgetSprite(-1, new WidgetPointer(1083,507)); + setWidgetSprite(-1, new WidgetPointer(1083,517)); + setWidgetSprite(-1, new WidgetPointer(1083,557)); + } + return; +} diff --git a/dumps/scripts/4268.cs2 b/dumps/scripts/4268.cs2 new file mode 100644 index 000000000..5c8661e1a --- /dev/null +++ b/dumps/scripts/4268.cs2 @@ -0,0 +1,405 @@ +void script_4268(int arg0) { + switch (arg0) { + case 1: + setWidgetText(new WidgetPointer(1083,85), "Teleport to South Falador"); + break; + case 2: + setWidgetText(new WidgetPointer(1083,85), "Repair Rune Pouch"); + break; + case 3: + setWidgetText(new WidgetPointer(1083,85), "Teleport to North Ardougne"); + break; + case 4: + setWidgetText(new WidgetPointer(1083,85), "Remote Farming"); + break; + case 5: + setWidgetText(new WidgetPointer(1083,85), "Spiritualise Food"); + break; + case 6: + setWidgetText(new WidgetPointer(1083,85), "Make Leather"); + break; + case 7: + setWidgetText(new WidgetPointer(1083,85), "Disruption Shield"); + break; + case 8: + setWidgetText(new WidgetPointer(1083,85), "Vengeance Group"); + break; + case 9: + setWidgetText(new WidgetPointer(1083,85), "Let it Rain Seeds!"); + break; + case 10: + setWidgetText(new WidgetPointer(1083,85), "Gimme Herbs!"); + break; + case 11: + setWidgetText(new WidgetPointer(1083,85), "Vial My Herbs!"); + break; + case 12: + setWidgetText(new WidgetPointer(1083,85), "Turn Lunar Lumber into Runes!"); + break; + case 13: + setWidgetText(new WidgetPointer(1083,85), "Reduce the Fish I Burn!"); + break; + case 14: + setWidgetText(new WidgetPointer(1083,85), "More Planks, Please!"); + break; + case 15: + setWidgetText(new WidgetPointer(1083,85), "Teleport to Trollheim"); + break; + case 16: + setWidgetText(new WidgetPointer(1083,85), "Teleport Group to Trollheim"); + break; + case 17: + setWidgetText(new WidgetPointer(1083,85), "Borrowed Power"); + break; + case 18: + setWidgetText(new WidgetPointer(1083,85), "Let it Rain Awesome Seeds!"); + break; + case 19: + setWidgetText(new WidgetPointer(1083,85), "I'd Like a New Patch!"); + break; + case 20: + setWidgetText(new WidgetPointer(1083,85), "Give Me An Arcane Capacitor!"); + break; + case 21: + setWidgetText(new WidgetPointer(1083,85), "Protect A Patch For Me!"); + } + switch (arg0) { + case 1: + setWidgetText(new WidgetPointer(1083,87), "Teleports you to the south of Falador."); + break; + case 2: + setWidgetText(new WidgetPointer(1083,87), "Use on a degraded pouch to repair it and improve its strength, so it takes longer to degrade."); + break; + case 3: + setWidgetText(new WidgetPointer(1083,87), "Teleports you to the north of Ardougne."); + break; + case 4: + setWidgetText(new WidgetPointer(1083,87), "View the status of farming patches and cure any disease from a distance."); + break; + case 5: + setWidgetText(new WidgetPointer(1083,87), "Cast on ordinary food and feed it to your familiar to heal it, boost its combat stats and extend its timer."); + break; + case 6: + setWidgetText(new WidgetPointer(1083,87), "Cast on hides to turn them into leather. This will convert 5 hides at a time."); + break; + case 7: + setWidgetText(new WidgetPointer(1083,87), "Nullifies the next hit you receive from another player. This works against players only, not against monsters."); + break; + case 8: + setWidgetText(new WidgetPointer(1083,87), "When cast, those nearby get to rebound damage." + "
" + "After learning this last spell, your current produce will be reduced by " + script_46(multiply(cs2method_3408(105, 105, 3674, 7), 10), ",") + " and the remainder can be spent on wishes."); + break; + case 9: + setWidgetText(new WidgetPointer(1083,87), "Seeds will appear on the floor. Be quick to pick up the ones you want."); + break; + case 10: + setWidgetText(new WidgetPointer(1083,87), "Puts a load of grimy herbs in your inventory."); + break; + case 11: + setWidgetText(new WidgetPointer(1083,87), "Takes all the clean herbs in your inventory and turns them into unfinished potions of that herb type. This will work on noted herbs of up to 50 at a time."); + break; + case 12: + setWidgetText(new WidgetPointer(1083,87), "Turns all lunar lumber in your inventory into runes. You'll need a full inventory of logs."); + break; + case 13: + setWidgetText(new WidgetPointer(1083,87), "For the next thirty minutes, you'll find that you burn fewer fish."); + break; + case 14: + setWidgetText(new WidgetPointer(1083,87), "This will be active for the next twenty minutes: when casting Plank Make, you will have a chance of receiving additional planks."); + break; + case 15: + setWidgetText(new WidgetPointer(1083,87), "Teleports you to the farming patch in Trollheim."); + break; + case 16: + setWidgetText(new WidgetPointer(1083,87), "Teleports you and those nearby to the farming patch in Trollheim."); + break; + case 17: + setWidgetText(new WidgetPointer(1083,87), "Allows you to store and cast certain spells from the standard spellbook."); + break; + case 18: + setWidgetText(new WidgetPointer(1083,87), "High value seeds will appear on the floor. Be quick to pick up the ones you want."); + break; + case 19: + setWidgetText(new WidgetPointer(1083,87), "A new allotment patch will become available nearby. It will vanish if the patch is cleared."); + break; + case 20: + setWidgetText(new WidgetPointer(1083,87), "You'll be given an Arcane Capacitor, for use with the Borrowed Power spell."); + break; + case 21: + if (bitconfig_9067 < 11) { + setWidgetText(new WidgetPointer(1083,87), "Gives you a scroll which, when used on a fruit tree or tree patch, will protect that patch for the next 10 growths in that patch. "); + } else { + setWidgetText(new WidgetPointer(1083,87), "Gives you a scroll which, when used on a fruit tree or tree patch, will protect that patch for the next 10 growths in that patch. You will need to use the scroll on a patch that is currently growing something and you must have the produce in your inventory that would cover the cost of protecting that patch normally."); + } + } + switch (arg0) { + case 1: + if (bitconfig_9067 < 1) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 72 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 2: + if (bitconfig_9067 < 2) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 75 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 3: + if (bitconfig_9067 < 3) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 76 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 4: + if (bitconfig_9067 < 4) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 78 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 5: + if (bitconfig_9067 < 5) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 80 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 6: + if (bitconfig_9067 < 6) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 83 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 7: + if (bitconfig_9067 < 7) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 90 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 8: + if (bitconfig_9067 < 8) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 95 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 15: + if (bitconfig_9067 < 9) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 92 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 16: + if (bitconfig_9067 < 10) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 93 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + case 17: + if (bitconfig_9067 < 11) { + setWidgetText(new WidgetPointer(1083,89), "Requires level 99 Magic to cast. You must unlock the spells in order."); + } else { + setWidgetText(new WidgetPointer(1083,89), "Learned!"); + } + break; + default: + if (bitconfig_9067 < 11) { + setWidgetText(new WidgetPointer(1083,89), "You must unlock all the spells before you can use wishes."); + } + } + if ((arg0 < 9) || ((arg0 > 14) && (arg0 < 18))) { + setWidgetIsHidden(false, new WidgetPointer(1083,90)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1083,90)); + } + switch (arg0) { + case 1: + setWidgetSprite(4585, new WidgetPointer(1083,93)); + break; + case 2: + setWidgetSprite(4586, new WidgetPointer(1083,93)); + break; + case 3: + setWidgetSprite(4587, new WidgetPointer(1083,93)); + break; + case 4: + setWidgetSprite(4588, new WidgetPointer(1083,93)); + break; + case 5: + setWidgetSprite(4590, new WidgetPointer(1083,93)); + break; + case 6: + setWidgetSprite(4589, new WidgetPointer(1083,93)); + break; + case 7: + setWidgetSprite(4591, new WidgetPointer(1083,93)); + break; + case 8: + setWidgetSprite(4592, new WidgetPointer(1083,93)); + break; + case 15: + setWidgetSprite(7685, new WidgetPointer(1083,93)); + break; + case 16: + setWidgetSprite(7686, new WidgetPointer(1083,93)); + break; + case 17: + setWidgetSprite(7687, new WidgetPointer(1083,93)); + } + setWidgetIsHidden(true, new WidgetPointer(1083,94)); + setWidgetIsHidden(true, new WidgetPointer(1083,95)); + setWidgetIsHidden(true, new WidgetPointer(1083,96)); + setWidgetIsHidden(true, new WidgetPointer(1083,97)); + setWidgetIsHidden(true, new WidgetPointer(1083,98)); + setWidgetIsHidden(true, new WidgetPointer(1083,99)); + setWidgetIsHidden(true, new WidgetPointer(1083,100)); + setWidgetIsHidden(true, new WidgetPointer(1083,101)); + setWidgetIsHidden(true, new WidgetPointer(1083,102)); + setWidgetIsHidden(true, new WidgetPointer(1083,103)); + setWidgetIsHidden(true, new WidgetPointer(1083,104)); + setWidgetIsHidden(true, new WidgetPointer(1083,105)); + setWidgetIsHidden(true, new WidgetPointer(1083,106)); + setWidgetIsHidden(true, new WidgetPointer(1083,107)); + setWidgetIsHidden(true, new WidgetPointer(1083,460)); + setWidgetIsHidden(true, new WidgetPointer(1083,470)); + setWidgetIsHidden(true, new WidgetPointer(1083,480)); + setWidgetIsHidden(true, new WidgetPointer(1083,518)); + setWidgetIsHidden(true, new WidgetPointer(1083,528)); + setWidgetIsHidden(true, new WidgetPointer(1083,538)); + setWidgetIsHidden(true, new WidgetPointer(1083,558)); + switch (arg0) { + case 1: + if (bitconfig_9067 < 1) { + setWidgetIsHidden(false, new WidgetPointer(1083,94)); + } + break; + case 2: + if (bitconfig_9067 < 2) { + setWidgetIsHidden(false, new WidgetPointer(1083,95)); + } + break; + case 3: + if (bitconfig_9067 < 3) { + setWidgetIsHidden(false, new WidgetPointer(1083,96)); + } + break; + case 4: + if (bitconfig_9067 < 4) { + setWidgetIsHidden(false, new WidgetPointer(1083,97)); + } + break; + case 5: + if (bitconfig_9067 < 5) { + setWidgetIsHidden(false, new WidgetPointer(1083,98)); + } + break; + case 6: + if (bitconfig_9067 < 6) { + setWidgetIsHidden(false, new WidgetPointer(1083,99)); + } + break; + case 7: + if (bitconfig_9067 < 7) { + setWidgetIsHidden(false, new WidgetPointer(1083,100)); + } + break; + case 8: + if (bitconfig_9067 < 8) { + setWidgetIsHidden(false, new WidgetPointer(1083,101)); + } + break; + case 9: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,102)); + } + break; + case 10: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,103)); + } + break; + case 11: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,104)); + } + break; + case 12: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,105)); + } + break; + case 13: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,106)); + } + break; + case 14: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,107)); + } + break; + case 15: + if (bitconfig_9067 < 9) { + setWidgetIsHidden(false, new WidgetPointer(1083,460)); + } + break; + case 16: + if (bitconfig_9067 < 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,470)); + } + break; + case 17: + if (bitconfig_9067 < 11) { + setWidgetIsHidden(false, new WidgetPointer(1083,480)); + } + break; + case 18: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,518)); + } + break; + case 19: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,528)); + } + break; + case 20: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,538)); + } + break; + case 21: + if (bitconfig_9067 > 10) { + setWidgetIsHidden(false, new WidgetPointer(1083,558)); + } + } + setWidgetIsHidden(true, new WidgetPointer(1083,385)); + setWidgetIsHidden(true, new WidgetPointer(1083,72)); + setWidgetIsHidden(true, new WidgetPointer(1083,67)); + setWidgetIsHidden(true, new WidgetPointer(1083,62)); + setWidgetIsHidden(true, new WidgetPointer(1083,57)); + setWidgetIsHidden(true, new WidgetPointer(1083,52)); + setWidgetIsHidden(true, new WidgetPointer(1083,47)); + setWidgetIsHidden(true, new WidgetPointer(1083,42)); + setWidgetIsHidden(true, new WidgetPointer(1083,37)); + setWidgetIsHidden(true, new WidgetPointer(1083,32)); + setWidgetIsHidden(true, new WidgetPointer(1083,27)); + setWidgetIsHidden(true, new WidgetPointer(1083,22)); + setWidgetIsHidden(true, new WidgetPointer(1083,17)); + setWidgetIsHidden(true, new WidgetPointer(1083,12)); + setWidgetIsHidden(true, new WidgetPointer(1083,431)); + setWidgetIsHidden(true, new WidgetPointer(1083,442)); + setWidgetIsHidden(true, new WidgetPointer(1083,453)); + setWidgetIsHidden(true, new WidgetPointer(1083,493)); + setWidgetIsHidden(true, new WidgetPointer(1083,502)); + setWidgetIsHidden(true, new WidgetPointer(1083,512)); + setWidgetIsHidden(true, new WidgetPointer(1083,552)); + return; +} diff --git a/dumps/scripts/4269.cs2 b/dumps/scripts/4269.cs2 new file mode 100644 index 000000000..592e6d5b3 --- /dev/null +++ b/dumps/scripts/4269.cs2 @@ -0,0 +1,4 @@ +void script_4269() { + script_4270(); + return; +} diff --git a/dumps/scripts/427.cs2 b/dumps/scripts/427.cs2 new file mode 100644 index 000000000..71618f1e8 --- /dev/null +++ b/dumps/scripts/427.cs2 @@ -0,0 +1,184 @@ +void script_427(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar1 = 0; + ivar2 = 0; + ivar3 = -1; + ivar4 = bitconfig_7539; + ivar5 = bitconfig_7540; + ivar6 = bitconfig_7541; + ivar7 = bitconfig_7542; + if (((boolean)arg0)) { + ivar4 = 1; + ivar5 = 3; + ivar6 = 5; + ivar7 = 6; + } + if (((boolean)ivar4)) { + setWidgetIsHidden(true, new WidgetPointer(1024,8)); + ivar1 = add(ivar1, 1); + } else { + ivar3 = script_488(ivar4); + if (ivar3 != -1) { + setWidgetIsHidden(false, new WidgetPointer(1024,8)); + cs2method2305(new WidgetPointer(1024,8), getOtherCommonData(ivar3, 1150)); + setWidgetText(new WidgetPointer(1024,75), getOtherCommonData(ivar3, 1150)); + setWidgetSprite(getOtherCommonData(ivar3, 1153), new WidgetPointer(1024,77)); + setWidgetText(new WidgetPointer(1024,76), intToStr(getOtherCommonData(ivar3, 1154))); + } + if (ivar4 == 9) { + setWidgetContextMenuOption(1, new WidgetPointer(1024,8), "Cast"); + } + } + if (((boolean)ivar5)) { + setWidgetIsHidden(true, new WidgetPointer(1024,9)); + ivar1 = add(ivar1, 1); + } else { + ivar3 = script_488(ivar5); + if (ivar3 != -1) { + setWidgetIsHidden(false, new WidgetPointer(1024,9)); + cs2method2305(new WidgetPointer(1024,9), getOtherCommonData(ivar3, 1150)); + setWidgetText(new WidgetPointer(1024,58), getOtherCommonData(ivar3, 1150)); + setWidgetSprite(getOtherCommonData(ivar3, 1153), new WidgetPointer(1024,60)); + setWidgetText(new WidgetPointer(1024,59), intToStr(getOtherCommonData(ivar3, 1154))); + } + if (ivar5 == 9) { + setWidgetContextMenuOption(1, new WidgetPointer(1024,9), "Cast"); + } + } + if (((boolean)ivar6)) { + setWidgetIsHidden(true, new WidgetPointer(1024,10)); + ivar1 = add(ivar1, 1); + } else { + ivar3 = script_488(ivar6); + if (ivar3 != -1) { + setWidgetIsHidden(false, new WidgetPointer(1024,10)); + cs2method2305(new WidgetPointer(1024,10), getOtherCommonData(ivar3, 1150)); + setWidgetText(new WidgetPointer(1024,41), getOtherCommonData(ivar3, 1150)); + setWidgetSprite(getOtherCommonData(ivar3, 1153), new WidgetPointer(1024,43)); + setWidgetText(new WidgetPointer(1024,42), intToStr(getOtherCommonData(ivar3, 1154))); + } + if (ivar6 == 9) { + setWidgetContextMenuOption(1, new WidgetPointer(1024,10), "Cast"); + } + } + if (((boolean)ivar7)) { + setWidgetIsHidden(true, new WidgetPointer(1024,11)); + ivar1 = add(ivar1, 1); + } else { + ivar3 = script_488(ivar7); + if (ivar3 != -1) { + setWidgetIsHidden(false, new WidgetPointer(1024,11)); + cs2method2305(new WidgetPointer(1024,11), getOtherCommonData(ivar3, 1150)); + setWidgetText(new WidgetPointer(1024,24), getOtherCommonData(ivar3, 1150)); + setWidgetSprite(getOtherCommonData(ivar3, 1153), new WidgetPointer(1024,26)); + setWidgetText(new WidgetPointer(1024,25), intToStr(getOtherCommonData(ivar3, 1154))); + } + if (ivar7 == 9) { + setWidgetContextMenuOption(1, new WidgetPointer(1024,11), "Cast"); + } + } + if (ivar1 == 4) { + setWidgetIsHidden(true, new WidgetPointer(1024,1)); + setWidgetIsHidden(false, new WidgetPointer(1024,2)); + } else if (ivar1 == 3) { + setWidgetIsHidden(false, new WidgetPointer(1024,1)); + setWidgetIsHidden(true, new WidgetPointer(1024,2)); + if (ivar4 != 0) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,8)), 102, 0, 0, new WidgetPointer(1024,8)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 6, "Ii", new WidgetPointer(1024,65)); + } else if (ivar5 != 0) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,9)), 102, 0, 0, new WidgetPointer(1024,9)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 6, "Ii", new WidgetPointer(1024,48)); + } else if (ivar6 != 0) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,10)), 102, 0, 0, new WidgetPointer(1024,10)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 6, "Ii", new WidgetPointer(1024,31)); + } else { + if (ivar7 != 0) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,11)), 102, 0, 0, new WidgetPointer(1024,11)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 6, "Ii", new WidgetPointer(1024,14)); + } + } + } else if (ivar1 == 2) { + setWidgetIsHidden(false, new WidgetPointer(1024,1)); + setWidgetIsHidden(true, new WidgetPointer(1024,2)); + if (ivar4 != 0) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,8)), 60, 0, 0, new WidgetPointer(1024,8)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 111, "Ii", new WidgetPointer(1024,65)); + ivar2 = add(ivar2, 1); + } + if (ivar5 != 0) { + if (((boolean)ivar2)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,9)), 60, 0, 0, new WidgetPointer(1024,9)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 111, "Ii", new WidgetPointer(1024,48)); + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,9)), 145, 0, 0, new WidgetPointer(1024,9)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 49, "Ii", new WidgetPointer(1024,48)); + } + ivar2 = add(ivar2, 1); + } + if (ivar6 != 0) { + if (((boolean)ivar2)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,10)), 60, 0, 0, new WidgetPointer(1024,10)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 111, "Ii", new WidgetPointer(1024,31)); + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,10)), 145, 0, 0, new WidgetPointer(1024,10)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 49, "Ii", new WidgetPointer(1024,31)); + } + ivar2 = add(ivar2, 1); + } + if (ivar7 != 0) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,11)), 145, 0, 0, new WidgetPointer(1024,11)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 49, "Ii", new WidgetPointer(1024,14)); + } + } else if (((boolean)ivar1)) { + setWidgetIsHidden(false, new WidgetPointer(1024,1)); + setWidgetIsHidden(true, new WidgetPointer(1024,2)); + if (ivar4 != 0) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,8)), 41, 0, 0, new WidgetPointer(1024,8)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 92, "Ii", new WidgetPointer(1024,65)); + ivar2 = add(ivar2, 1); + } + if (ivar5 != 0) { + if (((boolean)ivar2)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,9)), 41, 0, 0, new WidgetPointer(1024,9)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 92, "Ii", new WidgetPointer(1024,48)); + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,9)), 102, 0, 0, new WidgetPointer(1024,9)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 6, "Ii", new WidgetPointer(1024,48)); + } + ivar2 = add(ivar2, 1); + } + if (ivar6 != 0) { + if (((boolean)ivar2)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,10)), 102, 0, 0, new WidgetPointer(1024,10)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 6, "Ii", new WidgetPointer(1024,31)); + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,10)), 163, 0, 0, new WidgetPointer(1024,10)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 67, "Ii", new WidgetPointer(1024,31)); + } + ivar2 = add(ivar2, 1); + } + if (ivar7 != 0) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,11)), 163, 0, 0, new WidgetPointer(1024,11)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 67, "Ii", new WidgetPointer(1024,31)); + } + } else { + setWidgetIsHidden(false, new WidgetPointer(1024,1)); + setWidgetIsHidden(true, new WidgetPointer(1024,2)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,8)), 29, 0, 0, new WidgetPointer(1024,8)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 80, "Ii", new WidgetPointer(1024,65)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,9)), 78, 0, 0, new WidgetPointer(1024,9)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 129, "Ii", new WidgetPointer(1024,48)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,10)), 127, 0, 0, new WidgetPointer(1024,10)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 31, "Ii", new WidgetPointer(1024,31)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(1024,11)), 176, 0, 0, new WidgetPointer(1024,11)); + setScriptCallOnMouseOver(432, new WidgetPointer(-32768,3), 80, "Ii", new WidgetPointer(1024,14)); + } + return; +} diff --git a/dumps/scripts/4270.cs2 b/dumps/scripts/4270.cs2 new file mode 100644 index 000000000..4d40ec9c8 --- /dev/null +++ b/dumps/scripts/4270.cs2 @@ -0,0 +1,31 @@ +void script_4270() { + setWidgetIsHidden(false, new WidgetPointer(1083,161)); + setWidgetIsHidden(true, new WidgetPointer(1083,162)); + setWidgetIsHidden(false, new WidgetPointer(1083,243)); + setWidgetIsHidden(true, new WidgetPointer(1083,253)); + setWidgetText(new WidgetPointer(1083,85), "Spells"); + setWidgetText(new WidgetPointer(1083,87), "Select a reward for more information."); + setWidgetText(new WidgetPointer(1083,89), ""); + setWidgetIsHidden(true, new WidgetPointer(1083,90)); + setWidgetIsHidden(true, new WidgetPointer(1083,94)); + setWidgetIsHidden(true, new WidgetPointer(1083,95)); + setWidgetIsHidden(true, new WidgetPointer(1083,96)); + setWidgetIsHidden(true, new WidgetPointer(1083,97)); + setWidgetIsHidden(true, new WidgetPointer(1083,98)); + setWidgetIsHidden(true, new WidgetPointer(1083,99)); + setWidgetIsHidden(true, new WidgetPointer(1083,100)); + setWidgetIsHidden(true, new WidgetPointer(1083,101)); + setWidgetIsHidden(true, new WidgetPointer(1083,102)); + setWidgetIsHidden(true, new WidgetPointer(1083,103)); + setWidgetIsHidden(true, new WidgetPointer(1083,104)); + setWidgetIsHidden(true, new WidgetPointer(1083,105)); + setWidgetIsHidden(true, new WidgetPointer(1083,106)); + setWidgetIsHidden(true, new WidgetPointer(1083,107)); + setWidgetIsHidden(true, new WidgetPointer(1083,164)); + setWidgetIsHidden(true, new WidgetPointer(1083,159)); + setWidgetIsHidden(false, new WidgetPointer(1083,157)); + setWidgetIsHidden(false, new WidgetPointer(1083,158)); + setWidgetIsHidden(false, new WidgetPointer(1083,165)); + setWidgetIsHidden(false, new WidgetPointer(1083,160)); + return; +} diff --git a/dumps/scripts/4271.cs2 b/dumps/scripts/4271.cs2 new file mode 100644 index 000000000..e926c8409 --- /dev/null +++ b/dumps/scripts/4271.cs2 @@ -0,0 +1,4 @@ +void script_4271() { + script_4272(); + return; +} diff --git a/dumps/scripts/4272.cs2 b/dumps/scripts/4272.cs2 new file mode 100644 index 000000000..acd21c9fd --- /dev/null +++ b/dumps/scripts/4272.cs2 @@ -0,0 +1,31 @@ +void script_4272() { + setWidgetIsHidden(true, new WidgetPointer(1083,161)); + setWidgetIsHidden(false, new WidgetPointer(1083,162)); + setWidgetIsHidden(true, new WidgetPointer(1083,243)); + setWidgetIsHidden(false, new WidgetPointer(1083,253)); + setWidgetText(new WidgetPointer(1083,85), "Wishes"); + setWidgetText(new WidgetPointer(1083,87), "Select a reward for more information."); + setWidgetText(new WidgetPointer(1083,89), ""); + setWidgetIsHidden(true, new WidgetPointer(1083,90)); + setWidgetIsHidden(true, new WidgetPointer(1083,94)); + setWidgetIsHidden(true, new WidgetPointer(1083,95)); + setWidgetIsHidden(true, new WidgetPointer(1083,96)); + setWidgetIsHidden(true, new WidgetPointer(1083,97)); + setWidgetIsHidden(true, new WidgetPointer(1083,98)); + setWidgetIsHidden(true, new WidgetPointer(1083,99)); + setWidgetIsHidden(true, new WidgetPointer(1083,100)); + setWidgetIsHidden(true, new WidgetPointer(1083,101)); + setWidgetIsHidden(true, new WidgetPointer(1083,102)); + setWidgetIsHidden(true, new WidgetPointer(1083,103)); + setWidgetIsHidden(true, new WidgetPointer(1083,104)); + setWidgetIsHidden(true, new WidgetPointer(1083,105)); + setWidgetIsHidden(true, new WidgetPointer(1083,106)); + setWidgetIsHidden(true, new WidgetPointer(1083,107)); + setWidgetIsHidden(true, new WidgetPointer(1083,164)); + setWidgetIsHidden(true, new WidgetPointer(1083,159)); + setWidgetIsHidden(false, new WidgetPointer(1083,157)); + setWidgetIsHidden(false, new WidgetPointer(1083,158)); + setWidgetIsHidden(false, new WidgetPointer(1083,165)); + setWidgetIsHidden(true, new WidgetPointer(1083,160)); + return; +} diff --git a/dumps/scripts/4273.cs2 b/dumps/scripts/4273.cs2 new file mode 100644 index 000000000..292407a6b --- /dev/null +++ b/dumps/scripts/4273.cs2 @@ -0,0 +1,56 @@ +void script_4273() { + setWidgetIsHidden(true, new WidgetPointer(1083,161)); + setWidgetIsHidden(true, new WidgetPointer(1083,160)); + setWidgetIsHidden(true, new WidgetPointer(1083,162)); + setWidgetIsHidden(false, new WidgetPointer(1083,164)); + setWidgetIsHidden(true, new WidgetPointer(1083,157)); + setWidgetIsHidden(true, new WidgetPointer(1083,158)); + setWidgetIsHidden(false, new WidgetPointer(1083,159)); + setWidgetIsHidden(true, new WidgetPointer(1083,243)); + setWidgetIsHidden(true, new WidgetPointer(1083,253)); + setWidgetIsHidden(false, new WidgetPointer(1083,394)); + setWidgetIsHidden(true, new WidgetPointer(1083,165)); + setWidgetText(new WidgetPointer(1083,415), intToStr(multiply(2, 10))); + if (getSkillActualLvl(6) < 83) { + setWidgetText(new WidgetPointer(1083,416), intToStr(multiply(divide(2, 2), 10)) + " (halved)"); + } else { + setWidgetText(new WidgetPointer(1083,416), intToStr(multiply(2, 10))); + } + if (getSkillActualLvl(6) < 80) { + setWidgetText(new WidgetPointer(1083,417), intToStr(multiply(divide(12, 2), 10)) + " (halved)"); + } else { + setWidgetText(new WidgetPointer(1083,417), intToStr(multiply(12, 10))); + } + if (getSkillActualLvl(6) < 86) { + setWidgetText(new WidgetPointer(1083,418), intToStr(multiply(divide(2, 2), 10)) + " (halved)"); + } else { + setWidgetText(new WidgetPointer(1083,418), intToStr(multiply(2, 10))); + } + if (getSkillActualLvl(6) < 91) { + setWidgetText(new WidgetPointer(1083,419), intToStr(multiply(divide(10, 2), 10)) + " (halved)"); + } else { + setWidgetText(new WidgetPointer(1083,419), intToStr(multiply(10, 10))); + } + setWidgetText(new WidgetPointer(1083,420), "Magic and Farming"); + if (getSkillActualLvl(6) < 83) { + setWidgetText(new WidgetPointer(1083,421), "Farming (no Magic)"); + } else { + setWidgetText(new WidgetPointer(1083,421), "Magic and Farming"); + } + if (getSkillActualLvl(6) < 80) { + setWidgetText(new WidgetPointer(1083,422), "Crafting (no Magic)"); + } else { + setWidgetText(new WidgetPointer(1083,422), "Magic and Crafting"); + } + if (getSkillActualLvl(6) < 86) { + setWidgetText(new WidgetPointer(1083,423), "Construction (no Magic)"); + } else { + setWidgetText(new WidgetPointer(1083,423), "Magic and Construction"); + } + if (getSkillActualLvl(6) < 91) { + setWidgetText(new WidgetPointer(1083,424), "Agility (no Magic)"); + } else { + setWidgetText(new WidgetPointer(1083,424), "Magic and Agility"); + } + return; +} diff --git a/dumps/scripts/4274.cs2 b/dumps/scripts/4274.cs2 new file mode 100644 index 000000000..ff1a55720 --- /dev/null +++ b/dumps/scripts/4274.cs2 @@ -0,0 +1,24 @@ +void script_4274() { + setWidgetText(new WidgetPointer(1083,137), script_46(multiply(cs2method_3408(105, 105, 3674, 0), 10), ",")); + setWidgetText(new WidgetPointer(1083,133), script_46(multiply(cs2method_3408(105, 105, 3674, 1), 10), ",")); + setWidgetText(new WidgetPointer(1083,129), script_46(multiply(cs2method_3408(105, 105, 3674, 2), 10), ",")); + setWidgetText(new WidgetPointer(1083,125), script_46(multiply(cs2method_3408(105, 105, 3674, 3), 10), ",")); + setWidgetText(new WidgetPointer(1083,121), script_46(multiply(cs2method_3408(105, 105, 3674, 4), 10), ",")); + setWidgetText(new WidgetPointer(1083,117), script_46(multiply(cs2method_3408(105, 105, 3674, 5), 10), ",")); + setWidgetText(new WidgetPointer(1083,113), script_46(multiply(cs2method_3408(105, 105, 3674, 6), 10), ",")); + setWidgetText(new WidgetPointer(1083,109), script_46(multiply(cs2method_3408(105, 105, 3674, 7), 10), ",")); + setWidgetText(new WidgetPointer(1083,223), script_46(multiply(550, 10), ",")); + setWidgetText(new WidgetPointer(1083,219), script_46(multiply(1800, 10), ",")); + setWidgetText(new WidgetPointer(1083,215), script_46(multiply(1800, 10), ",")); + setWidgetText(new WidgetPointer(1083,227), script_46(multiply(550, 10), ",")); + setWidgetText(new WidgetPointer(1083,235), script_46(multiply(1800, 10), ",")); + setWidgetText(new WidgetPointer(1083,231), script_46(multiply(1800, 10), ",")); + setWidgetText(new WidgetPointer(1083,435), script_46(multiply(cs2method_3408(105, 105, 3674, 8), 10), ",")); + setWidgetText(new WidgetPointer(1083,446), script_46(multiply(cs2method_3408(105, 105, 3674, 9), 10), ",")); + setWidgetText(new WidgetPointer(1083,457), script_46(multiply(cs2method_3408(105, 105, 3674, 10), 10), ",")); + setWidgetText(new WidgetPointer(1083,497), script_46(multiply(5500, 10), ",")); + setWidgetText(new WidgetPointer(1083,506), script_46(multiply(1800, 10), ",")); + setWidgetText(new WidgetPointer(1083,516), script_46(multiply(1800, 10), ",")); + setWidgetText(new WidgetPointer(1083,556), script_46(multiply(3700, 10), ",")); + return; +} diff --git a/dumps/scripts/4275.cs2 b/dumps/scripts/4275.cs2 new file mode 100644 index 000000000..ebbbefb48 --- /dev/null +++ b/dumps/scripts/4275.cs2 @@ -0,0 +1,7 @@ +void script_4275() { + setWidgetAnimation(8016, new WidgetPointer(1081,7)); + setWidgetAnimation(8016, new WidgetPointer(1081,2)); + setWidgetAnimation(4407, new WidgetPointer(1081,1)); + setWidgetAnimation(8016, new WidgetPointer(1081,0)); + return; +} diff --git a/dumps/scripts/4276.cs2 b/dumps/scripts/4276.cs2 new file mode 100644 index 000000000..65470be0f --- /dev/null +++ b/dumps/scripts/4276.cs2 @@ -0,0 +1,4 @@ +void script_4276() { + setScriptCallOnConfigChange(4277, 2151, 1, "Y", new WidgetPointer(1088,13)); + return; +} diff --git a/dumps/scripts/4277.cs2 b/dumps/scripts/4277.cs2 new file mode 100644 index 000000000..170d00589 --- /dev/null +++ b/dumps/scripts/4277.cs2 @@ -0,0 +1,19 @@ +void script_4277() { + int ivar0; + string svar0; + string svar1; + ivar0 = divide(multiply(bitconfig_9186, 6), 10); + svar0 = intToStr(divide(ivar0, 60)); + svar1 = intToStr(mod(ivar0, 60)); + if (strLength(svar1) < 2) { + svar1 = concat("0", svar1); + } + if (((boolean)bitconfig_9187)) { + setWidgetText(new WidgetPointer(1088,12), "Match Starts In:"); + setWidgetText(new WidgetPointer(1088,13), svar0 + ":" + svar1); + } else { + setWidgetText(new WidgetPointer(1088,12), "Time Remaining:"); + setWidgetText(new WidgetPointer(1088,13), svar0 + ":" + svar1); + } + return; +} diff --git a/dumps/scripts/4278.cs2 b/dumps/scripts/4278.cs2 new file mode 100644 index 000000000..ce6c6f243 --- /dev/null +++ b/dumps/scripts/4278.cs2 @@ -0,0 +1,4 @@ +void script_4278() { + script_4212(71172125, 4040, 15458492, 5918266, "Refresh"); + return; +} diff --git a/dumps/scripts/4279.cs2 b/dumps/scripts/4279.cs2 new file mode 100644 index 000000000..8460f2b9f --- /dev/null +++ b/dumps/scripts/4279.cs2 @@ -0,0 +1,4 @@ +void script_4279() { + script_4212(71172125, 4040, 15458492, 5918266, "Log In"); + return; +} diff --git a/dumps/scripts/428.cs2 b/dumps/scripts/428.cs2 new file mode 100644 index 000000000..b3cd5053d --- /dev/null +++ b/dumps/scripts/428.cs2 @@ -0,0 +1,4 @@ +void script_428() { + setWidgetText(new WidgetPointer(1024,5), "Command Points: " + intToStr(bitconfig_7514)); + return; +} diff --git a/dumps/scripts/4280.cs2 b/dumps/scripts/4280.cs2 new file mode 100644 index 000000000..d9ed7a095 --- /dev/null +++ b/dumps/scripts/4280.cs2 @@ -0,0 +1,4 @@ +void script_4280() { + script_4212(71172125, 4040, 15458492, 5918266, "Confirm"); + return; +} diff --git a/dumps/scripts/4281.cs2 b/dumps/scripts/4281.cs2 new file mode 100644 index 000000000..0625a4627 --- /dev/null +++ b/dumps/scripts/4281.cs2 @@ -0,0 +1,8 @@ +void script_4281() { + if (cs2method3700()) { + script_4283(); + } else { + setScriptCallOnClanChatSettingsStuff(4282, "", new WidgetPointer(1095,8)); + } + return; +} diff --git a/dumps/scripts/4282.cs2 b/dumps/scripts/4282.cs2 new file mode 100644 index 000000000..f80763728 --- /dev/null +++ b/dumps/scripts/4282.cs2 @@ -0,0 +1,6 @@ +void script_4282() { + if (cs2method3700()) { + script_4283(); + } + return; +} diff --git a/dumps/scripts/4283.cs2 b/dumps/scripts/4283.cs2 new file mode 100644 index 000000000..a860ed7d1 --- /dev/null +++ b/dumps/scripts/4283.cs2 @@ -0,0 +1,8 @@ +void script_4283() { + setWidgetText(new WidgetPointer(1095,28), cs2method3702()); + script_4332(71761970, 71761980); + script_4334(71761990, 71761991); + script_4329(71761949); + setWidgetIsHidden(true, new WidgetPointer(1095,5)); + return; +} diff --git a/dumps/scripts/4284.cs2 b/dumps/scripts/4284.cs2 new file mode 100644 index 000000000..974be263b --- /dev/null +++ b/dumps/scripts/4284.cs2 @@ -0,0 +1,6 @@ +void script_4284(int arg0,int arg1,int arg2) { + setScriptCallOnKeyPress(4285, new WidgetPointer(arg0), new WidgetPointer(arg1), false, -2147483640, new WidgetPointer(arg2), "IIziI", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(4286, new WidgetPointer(arg0), new WidgetPointer(arg2), -2147483647, "IIi", new WidgetPointer(arg0)); + setScriptCallOnGameloop(1400, getClientCycle(), new WidgetPointer(arg2), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4285.cs2 b/dumps/scripts/4285.cs2 new file mode 100644 index 000000000..0dccd2c2c --- /dev/null +++ b/dumps/scripts/4285.cs2 @@ -0,0 +1,40 @@ +void script_4285(int arg0,int arg1,int arg2,int arg3,int arg4) { + globalstring_348 = getWidgetText(new WidgetPointer(arg0)); + switch (arg3) { + case 84: + if (stringMethod4107("", globalstring_348) != 0) { + script_4288(); + } + break; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + if (isHoldingCtrl()) { + return; + } + script_1553(arg3, globalint_1504, globalstring_348); + break; + case 85: + if (strLength(globalstring_348) > 0) { + globalstring_348 = substr(0, subtract(strLength(globalstring_348), 1), globalstring_348); + } + break; + default: + if (strLength(globalstring_348) < 20) { + globalstring_348 = script_74(0, arg3, arg2, globalstring_348); + } + } + globalint_1504 = script_1552(globalint_1504, 5631, arg0, -1, globalstring_348); + setWidgetPosition(globalint_1504, getWidgetActualY(new WidgetPointer(arg4)), 0, 0, new WidgetPointer(arg4)); + setWidgetText(new WidgetPointer(arg1), intToStr(strLength(globalstring_348)) + "/20"); + if (strLength(globalstring_348) >= 15) { + setWidgetRGB(new Color(221, 0, 0), new WidgetPointer(arg1)); + } else { + setWidgetRGB(new Color(31, 29, 25), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg0), globalstring_348); + return; +} diff --git a/dumps/scripts/4286.cs2 b/dumps/scripts/4286.cs2 new file mode 100644 index 000000000..52feb00c7 --- /dev/null +++ b/dumps/scripts/4286.cs2 @@ -0,0 +1,6 @@ +void script_4286(int arg0,int arg1,int arg2) { + globalstring_348 = getWidgetText(new WidgetPointer(arg0)); + globalint_1504 = script_1552(arg2, 5631, arg0, -1, globalstring_348); + setWidgetPosition(globalint_1504, 5, 0, 0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/4287.cs2 b/dumps/scripts/4287.cs2 new file mode 100644 index 000000000..17cd656bd --- /dev/null +++ b/dumps/scripts/4287.cs2 @@ -0,0 +1,4 @@ +void script_4287() { + script_4288(); + return; +} diff --git a/dumps/scripts/4288.cs2 b/dumps/scripts/4288.cs2 new file mode 100644 index 000000000..0d97a8c72 --- /dev/null +++ b/dumps/scripts/4288.cs2 @@ -0,0 +1,4 @@ +void script_4288() { + sendStringInput(globalstring_348); + return; +} diff --git a/dumps/scripts/4289.cs2 b/dumps/scripts/4289.cs2 new file mode 100644 index 000000000..1ffe923a0 --- /dev/null +++ b/dumps/scripts/4289.cs2 @@ -0,0 +1,11 @@ +void script_4289() { + if (cs2method3701()) { + script_4291(); + } else { + setScriptCallOnClanChatSettingsStuff(4290, "", new WidgetPointer(1096,151)); + } + if (globalint_1516 == -1) { + globalint_1516 = 0; + } + return; +} diff --git a/dumps/scripts/429.cs2 b/dumps/scripts/429.cs2 new file mode 100644 index 000000000..430cb6cce --- /dev/null +++ b/dumps/scripts/429.cs2 @@ -0,0 +1,159 @@ +void script_429(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + flow_0: + ivar1 = 0; + ivar2 = 0; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = 0; + ivar8 = -1; + SWITCH (arg0) { + case 67108940: + GOTO flow_1 + case 67108942: + GOTO flow_1 + case 67108925: + GOTO flow_5 + case 67108923: + GOTO flow_5 + case 67108908: + GOTO flow_9 + case 67108906: + GOTO flow_9 + case 67108889: + GOTO flow_13 + case 67108891: + GOTO flow_13 + } + return; + flow_1: + if (((boolean)globalint_1388)) { + ivar1 = 1; + } else { + ivar1 = bitconfig_7539; + } + ivar3 = 67108941; + ivar4 = 67108943; + ivar5 = 67108939; + ivar6 = 67108940; + ivar8 = 67108942; + GOTO flow_17 + flow_5: + if (((boolean)globalint_1388)) { + ivar1 = 3; + } else { + ivar1 = bitconfig_7540; + } + ivar3 = 67108924; + ivar4 = 67108926; + ivar5 = 67108922; + ivar6 = 67108923; + ivar8 = 67108925; + GOTO flow_17 + flow_9: + if (((boolean)globalint_1388)) { + ivar1 = 5; + } else { + ivar1 = bitconfig_7541; + } + ivar3 = 67108907; + ivar4 = 67108909; + ivar5 = 67108905; + ivar6 = 67108906; + ivar8 = 67108908; + GOTO flow_17 + flow_13: + if (((boolean)globalint_1388)) { + ivar1 = 6; + } else { + ivar1 = bitconfig_7542; + } + ivar3 = 67108890; + ivar4 = 67108892; + ivar5 = 67108888; + ivar6 = 67108889; + ivar8 = 67108891; + flow_17: + SWITCH (ivar1) { + case 1: + GOTO flow_18 + case 2: + GOTO flow_19 + case 3: + GOTO flow_20 + case 4: + GOTO flow_21 + case 5: + GOTO flow_22 + case 6: + GOTO flow_23 + case 7: + GOTO flow_24 + case 8: + GOTO flow_25 + case 9: + GOTO flow_26 + } + return; + flow_18: + ivar2 = globalint_1378; + ivar7 = getOtherCommonData(293, 1154); + GOTO flow_27 + flow_19: + ivar2 = globalint_1379; + ivar7 = getOtherCommonData(299, 1154); + GOTO flow_27 + flow_20: + ivar2 = globalint_1380; + ivar7 = getOtherCommonData(300, 1154); + GOTO flow_27 + flow_21: + ivar2 = globalint_1386; + ivar7 = getOtherCommonData(301, 1154); + GOTO flow_27 + flow_22: + ivar2 = globalint_1381; + ivar7 = getOtherCommonData(305, 1154); + GOTO flow_27 + flow_23: + ivar2 = globalint_1383; + ivar7 = getOtherCommonData(1044, 1154); + GOTO flow_27 + flow_24: + ivar2 = globalint_1384; + ivar7 = getOtherCommonData(1045, 1154); + GOTO flow_27 + flow_25: + ivar2 = globalint_1385; + ivar7 = getOtherCommonData(1046, 1154); + GOTO flow_27 + flow_26: + ivar2 = globalint_1382; + ivar7 = getOtherCommonData(1047, 1154); + flow_27: + if ((ivar2 > 0) || (bitconfig_7514 < ivar7)) { + if (ivar2 > 0) { + setWidgetText(new WidgetPointer(ivar8), intToStr(ivar2)); + } + setWidgetRGB(new Color(40, 40, 40), new WidgetPointer(ivar3)); + setWidgetIsHidden(false, new WidgetPointer(ivar4)); + setWidgetRGB(new Color(125, 125, 125), new WidgetPointer(ivar5)); + setWidgetRGB(new Color(125, 125, 125), new WidgetPointer(ivar6)); + } else { + setWidgetText(new WidgetPointer(ivar8), ""); + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(ivar3)); + setWidgetIsHidden(true, new WidgetPointer(ivar4)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(ivar5)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(ivar6)); + } + return; +} diff --git a/dumps/scripts/4290.cs2 b/dumps/scripts/4290.cs2 new file mode 100644 index 000000000..787ff13a9 --- /dev/null +++ b/dumps/scripts/4290.cs2 @@ -0,0 +1,7 @@ +void script_4290() { + if (cs2method3701()) { + script_4291(); + } + script_4295(); + return; +} diff --git a/dumps/scripts/4291.cs2 b/dumps/scripts/4291.cs2 new file mode 100644 index 000000000..b71b25d7f --- /dev/null +++ b/dumps/scripts/4291.cs2 @@ -0,0 +1,81 @@ +void script_4291() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + setScriptCallOnClanChatSettingsStuff(4300, "", new WidgetPointer(1096,36)); + setScriptCallOnGlobalConfigChange(4300, 1516, 1, "Y", new WidgetPointer(1096,36)); + setScriptCallOnGameloop(4319, 0, 1, "ii", new WidgetPointer(1096,50)); + setScriptCallOnClanChatSettingsStuff(4294, "", new WidgetPointer(1096,50)); + setScriptCallOnClanChatDeltaStuff(4294, "", new WidgetPointer(1096,50)); + setScriptCallOnGlobalConfigChange(118, 1500, 1501, 1502, 1503, 4, "Y", new WidgetPointer(1096,50)); + setScriptCallOnGlobalStringChange(118, 347, 1, "Y", new WidgetPointer(1096,50)); + switch (getLanguage()) { + case 1: + script_4499(3727, 1, getCommonDefinitionSize(3727), 10, 71827715, 71827725, 71827727, 71827726, 71827818, ""); + break; + case 2: + script_4499(3728, 1, getCommonDefinitionSize(3727), 10, 71827715, 71827725, 71827727, 71827726, 71827818, ""); + break; + case 3: + script_4499(3729, 1, getCommonDefinitionSize(3727), 10, 71827715, 71827725, 71827727, 71827726, 71827818, ""); + break; + default: + script_4499(3720, 1, getCommonDefinitionSize(3720), 10, 71827715, 71827725, 71827727, 71827726, 71827818, ""); + } + script_4328(71827829); + setScriptCallOnClanChatSettingsStuff(5226, "", new WidgetPointer(1096,373)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(1096,50)), 115, 0, 0, new WidgetPointer(1096,50)); + setWidgetIsHidden(true, new WidgetPointer(1096,363)); + setWidgetIsHidden(false, new WidgetPointer(1096,108)); + ivar0 = 71827491; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 218; + ivar5 = 23; + while (ivar1 < 500) { + if (mod(ivar1, 2) != 0) { + ivar2 = ivar4; + } else { + ivar2 = 0; + } + ivar3 = multiply(divide(ivar1, 2), ivar5); + createExtraChild(new WidgetPointer(ivar0), 3, ivar1); + setWidgetPosition(ivar2, ivar3, 0, 0); + setWidgetSize(divide(16384, 2), ivar5, 2, 0); + setWidgetFilled(1); + if (mod(divide(ivar1, 2), 2) != 0) { + setWidgetRGB(new Color(35, 34, 32)); + } else { + setWidgetRGB(new Color(28, 27, 25)); + } + ivar1 = add(ivar1, 1); + } + if (citadelConfigsInitialized()) { + stack_dump0 = 4514; + stack_dump1 = 0; + stack_dump2 = 105; + stack_dump3 = 115; + stack_dump4 = 4514; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + script_4499(4514, 0, -1, 4, 71827675, 71827685, 71827687, 71827686, 71827818, "N/A"); + script_4499(4255, 0, -1, 4, 71827660, 71827670, 71827672, 71827671, 71827818, "N/A"); + return; +} diff --git a/dumps/scripts/4292.cs2 b/dumps/scripts/4292.cs2 new file mode 100644 index 000000000..cabd25a50 --- /dev/null +++ b/dumps/scripts/4292.cs2 @@ -0,0 +1,11 @@ +int script_4292() { + int ivar0; + ivar0 = -1; + if (cs2method3751()) { + ivar0 = cs2method3760(strRemoveEntities(cs2method5020())); + if (cs2method3757(ivar0) >= 100) { + return 1; + } + } + return 0; +} diff --git a/dumps/scripts/4293.cs2 b/dumps/scripts/4293.cs2 new file mode 100644 index 000000000..f818a72b4 --- /dev/null +++ b/dumps/scripts/4293.cs2 @@ -0,0 +1,11 @@ +int script_4293() { + int ivar0; + ivar0 = -1; + if (cs2method3751()) { + ivar0 = cs2method3760(strRemoveEntities(cs2method5020())); + if (ivar0 != -1) { + return cs2method3757(ivar0); + } + } + return -1; +} diff --git a/dumps/scripts/4294.cs2 b/dumps/scripts/4294.cs2 new file mode 100644 index 000000000..63f4bee1f --- /dev/null +++ b/dumps/scripts/4294.cs2 @@ -0,0 +1,4 @@ +void script_4294() { + script_4295(); + return; +} diff --git a/dumps/scripts/4295.cs2 b/dumps/scripts/4295.cs2 new file mode 100644 index 000000000..e70a65ee7 --- /dev/null +++ b/dumps/scripts/4295.cs2 @@ -0,0 +1,166 @@ +void script_4295() { + int ivar0; + int ivar1; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + ivar0 = 0; + ivar1 = 0; + if (cs2method3701()) { + if (cs2method3703()) { + ivar1 = 1; + } else { + if (cs2method3703()) { + ivar1 = 0; + } + } + ivar0 = clanconfig_0; + ivar0 = add(divide(ivar0, 10), 72); + script_4501(71827692, cs2method_3408(105, 115, 3711, ivar0)); + script_4501(71827836, cs2method_3408(105, 115, 3797, globalint_1516)); + script_4501(71827660, cs2method_3408(105, 115, 4255, clanbitconfig_292)); + script_4329(71827772); + if (((boolean)clanbitconfig_6)) { + script_4501(71827743, "Not set"); + } else { + script_4501(71827743, cs2method_3408(105, 115, 3700, clanbitconfig_6)); + } + if (((boolean)clanbitconfig_5)) { + if (((boolean)script_4292())) { + setWidgetIsHidden(false, new WidgetPointer(1096,255)); + setWidgetIsHidden(true, new WidgetPointer(1096,257)); + setWidgetIsHidden(true, new WidgetPointer(1096,256)); + setWidgetIsHidden(true, new WidgetPointer(1096,258)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,255)); + setWidgetIsHidden(true, new WidgetPointer(1096,257)); + setWidgetIsHidden(false, new WidgetPointer(1096,256)); + setWidgetIsHidden(true, new WidgetPointer(1096,258)); + } + } else if (((boolean)script_4292())) { + setWidgetIsHidden(true, new WidgetPointer(1096,255)); + setWidgetIsHidden(false, new WidgetPointer(1096,257)); + setWidgetIsHidden(true, new WidgetPointer(1096,256)); + setWidgetIsHidden(true, new WidgetPointer(1096,258)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,255)); + setWidgetIsHidden(true, new WidgetPointer(1096,257)); + setWidgetIsHidden(true, new WidgetPointer(1096,256)); + setWidgetIsHidden(false, new WidgetPointer(1096,258)); + } + if (((boolean)clanbitconfig_4)) { + if (((boolean)script_4292())) { + setWidgetIsHidden(false, new WidgetPointer(1096,251)); + setWidgetIsHidden(true, new WidgetPointer(1096,253)); + setWidgetIsHidden(true, new WidgetPointer(1096,252)); + setWidgetIsHidden(true, new WidgetPointer(1096,254)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,251)); + setWidgetIsHidden(true, new WidgetPointer(1096,253)); + setWidgetIsHidden(false, new WidgetPointer(1096,252)); + setWidgetIsHidden(true, new WidgetPointer(1096,254)); + } + } else if (((boolean)script_4292())) { + setWidgetIsHidden(true, new WidgetPointer(1096,251)); + setWidgetIsHidden(false, new WidgetPointer(1096,253)); + setWidgetIsHidden(true, new WidgetPointer(1096,252)); + setWidgetIsHidden(true, new WidgetPointer(1096,254)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,251)); + setWidgetIsHidden(true, new WidgetPointer(1096,253)); + setWidgetIsHidden(true, new WidgetPointer(1096,252)); + setWidgetIsHidden(false, new WidgetPointer(1096,254)); + } + if (cs2method3703()) { + if (((boolean)script_4292())) { + setWidgetIsHidden(false, new WidgetPointer(1096,794)); + setWidgetIsHidden(true, new WidgetPointer(1096,749)); + setWidgetIsHidden(true, new WidgetPointer(1096,748)); + setWidgetIsHidden(true, new WidgetPointer(1096,750)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,794)); + setWidgetIsHidden(true, new WidgetPointer(1096,749)); + setWidgetIsHidden(false, new WidgetPointer(1096,748)); + setWidgetIsHidden(true, new WidgetPointer(1096,750)); + } + } else if (((boolean)script_4292())) { + setWidgetIsHidden(true, new WidgetPointer(1096,794)); + setWidgetIsHidden(false, new WidgetPointer(1096,749)); + setWidgetIsHidden(true, new WidgetPointer(1096,748)); + setWidgetIsHidden(true, new WidgetPointer(1096,750)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,794)); + setWidgetIsHidden(true, new WidgetPointer(1096,749)); + setWidgetIsHidden(true, new WidgetPointer(1096,748)); + setWidgetIsHidden(false, new WidgetPointer(1096,750)); + } + if (cs2method3704() == -1) { + if (((boolean)script_4292())) { + setWidgetIsHidden(false, new WidgetPointer(1096,798)); + setWidgetIsHidden(true, new WidgetPointer(1096,796)); + setWidgetIsHidden(true, new WidgetPointer(1096,795)); + setWidgetIsHidden(true, new WidgetPointer(1096,797)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,798)); + setWidgetIsHidden(true, new WidgetPointer(1096,796)); + setWidgetIsHidden(false, new WidgetPointer(1096,795)); + setWidgetIsHidden(true, new WidgetPointer(1096,797)); + } + } else if (((boolean)script_4292())) { + setWidgetIsHidden(true, new WidgetPointer(1096,798)); + setWidgetIsHidden(false, new WidgetPointer(1096,796)); + setWidgetIsHidden(true, new WidgetPointer(1096,795)); + setWidgetIsHidden(true, new WidgetPointer(1096,797)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,798)); + setWidgetIsHidden(true, new WidgetPointer(1096,796)); + setWidgetIsHidden(true, new WidgetPointer(1096,795)); + setWidgetIsHidden(false, new WidgetPointer(1096,797)); + } + if (citadelConfigsInitialized()) { + stack_dump0 = 71827675; + stack_dump1 = 105; + stack_dump2 = 115; + stack_dump3 = 4514; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + script_4501(71827675, "N/A"); + script_4501(71827660, "N/A"); + if (((boolean)script_4292())) { + setWidgetIsHidden(true, new WidgetPointer(1096,243)); + setWidgetIsHidden(true, new WidgetPointer(1096,293)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,243)); + setWidgetIsHidden(false, new WidgetPointer(1096,293)); + } + script_4301(); + if (((boolean)script_4292())) { + setWidgetIsHidden(true, new WidgetPointer(1096,279)); + setWidgetIsHidden(true, new WidgetPointer(1096,265)); + setWidgetIsHidden(true, new WidgetPointer(1096,138)); + setWidgetIsHidden(true, new WidgetPointer(1096,127)); + setWidgetIsHidden(true, new WidgetPointer(1096,170)); + setWidgetIsHidden(true, new WidgetPointer(1096,374)); + setWidgetIsHidden(true, new WidgetPointer(1096,311)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,279)); + setWidgetIsHidden(false, new WidgetPointer(1096,265)); + setWidgetIsHidden(false, new WidgetPointer(1096,138)); + setWidgetIsHidden(false, new WidgetPointer(1096,127)); + setWidgetIsHidden(false, new WidgetPointer(1096,170)); + setWidgetIsHidden(false, new WidgetPointer(1096,374)); + setWidgetIsHidden(false, new WidgetPointer(1096,311)); + } + } + script_4310(); + return; +} diff --git a/dumps/scripts/4296.cs2 b/dumps/scripts/4296.cs2 new file mode 100644 index 000000000..605ea629e --- /dev/null +++ b/dumps/scripts/4296.cs2 @@ -0,0 +1,4 @@ +void script_4296() { + script_4297(); + return; +} diff --git a/dumps/scripts/4297.cs2 b/dumps/scripts/4297.cs2 new file mode 100644 index 000000000..bf4428522 --- /dev/null +++ b/dumps/scripts/4297.cs2 @@ -0,0 +1,10 @@ +void script_4297() { + flow_0: + setWidgetIsHidden(false, new WidgetPointer(1096,82)); + setWidgetIsHidden(true, new WidgetPointer(1096,81)); + IF (cs2method3701()) + GOTO flow_1 + GOTO flow_1 + flow_1: + return; +} diff --git a/dumps/scripts/4298.cs2 b/dumps/scripts/4298.cs2 new file mode 100644 index 000000000..24de38860 --- /dev/null +++ b/dumps/scripts/4298.cs2 @@ -0,0 +1,4 @@ +void script_4298() { + script_4299(); + return; +} diff --git a/dumps/scripts/4299.cs2 b/dumps/scripts/4299.cs2 new file mode 100644 index 000000000..ccfc3e495 --- /dev/null +++ b/dumps/scripts/4299.cs2 @@ -0,0 +1,5 @@ +void script_4299() { + setWidgetIsHidden(false, new WidgetPointer(1096,81)); + setWidgetIsHidden(true, new WidgetPointer(1096,82)); + return; +} diff --git a/dumps/scripts/43.cs2 b/dumps/scripts/43.cs2 new file mode 100644 index 000000000..3b730438a --- /dev/null +++ b/dumps/scripts/43.cs2 @@ -0,0 +1,26 @@ +void script_43() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + while (ivar0 < getItemContainerLength(141)) { + createExtraChild(new WidgetPointer(364,4), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(40, ivar1), multiply(40, ivar2), 0, 0); + if (getItemIdInSlot(141, ivar0) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(141, ivar0), getItemAmtInSlot(141, ivar0)); + cs2method1305("" + getItemName(getItemIdInSlot(141, ivar0))); + setWidgetContextMenuOption(1, "Examine"); + setWidgetBorderThickness(1); + } + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + if (ivar1 == 3) { + ivar1 = 0; + ivar2 = add(ivar2, 1); + } + } + return; +} diff --git a/dumps/scripts/430.cs2 b/dumps/scripts/430.cs2 new file mode 100644 index 000000000..659132a02 --- /dev/null +++ b/dumps/scripts/430.cs2 @@ -0,0 +1,122 @@ +void script_430(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + flow_0: + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = -1; + ivar6 = 0; + SWITCH (arg0) { + case 67108872: + GOTO flow_1 + case 67108873: + GOTO flow_5 + case 67108874: + GOTO flow_9 + case 67108875: + GOTO flow_13 + } + return; + flow_1: + if (((boolean)globalint_1388)) { + ivar2 = 1; + } else { + ivar2 = bitconfig_7539; + } + ivar5 = 67108939; + GOTO flow_17 + flow_5: + if (((boolean)globalint_1388)) { + ivar2 = 3; + } else { + ivar2 = bitconfig_7540; + } + ivar5 = 67108922; + GOTO flow_17 + flow_9: + if (((boolean)globalint_1388)) { + ivar2 = 5; + } else { + ivar2 = bitconfig_7541; + } + ivar5 = 67108905; + GOTO flow_17 + flow_13: + if (((boolean)globalint_1388)) { + ivar2 = 6; + } else { + ivar2 = bitconfig_7542; + } + ivar5 = 67108888; + flow_17: + SWITCH (ivar2) { + case 1: + GOTO flow_18 + case 2: + GOTO flow_19 + case 3: + GOTO flow_20 + case 4: + GOTO flow_21 + case 5: + GOTO flow_22 + case 6: + GOTO flow_23 + case 7: + GOTO flow_24 + case 8: + GOTO flow_25 + case 9: + GOTO flow_26 + } + return; + flow_18: + ivar4 = globalint_1378; + ivar6 = getOtherCommonData(293, 1154); + GOTO flow_27 + flow_19: + ivar4 = globalint_1379; + ivar6 = getOtherCommonData(299, 1154); + GOTO flow_27 + flow_20: + ivar4 = globalint_1380; + ivar6 = getOtherCommonData(300, 1154); + GOTO flow_27 + flow_21: + ivar4 = globalint_1386; + ivar6 = getOtherCommonData(301, 1154); + GOTO flow_27 + flow_22: + ivar4 = globalint_1381; + ivar6 = getOtherCommonData(305, 1154); + GOTO flow_27 + flow_23: + ivar4 = globalint_1383; + ivar6 = getOtherCommonData(1044, 1154); + GOTO flow_27 + flow_24: + ivar4 = globalint_1384; + ivar6 = getOtherCommonData(1045, 1154); + GOTO flow_27 + flow_25: + ivar4 = globalint_1385; + ivar6 = getOtherCommonData(1046, 1154); + GOTO flow_27 + flow_26: + ivar4 = globalint_1382; + ivar6 = getOtherCommonData(1047, 1154); + flow_27: + if (((boolean)ivar4) && (bitconfig_7514 >= ivar6)) { + if (((boolean)arg1)) { + ivar3 = 16777215; + } else { + ivar3 = 16750623; + } + setWidgetRGB(new Color(ivar3), new WidgetPointer(ivar5)); + } + return; +} diff --git a/dumps/scripts/4300.cs2 b/dumps/scripts/4300.cs2 new file mode 100644 index 000000000..f7f0a198d --- /dev/null +++ b/dumps/scripts/4300.cs2 @@ -0,0 +1,6 @@ +void script_4300() { + if (cs2method3701()) { + script_4301(); + } + return; +} diff --git a/dumps/scripts/4301.cs2 b/dumps/scripts/4301.cs2 new file mode 100644 index 000000000..89c00311f --- /dev/null +++ b/dumps/scripts/4301.cs2 @@ -0,0 +1,206 @@ +void script_4301() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + int ivar37; + int ivar38; + int ivar39; + string svar0; + string svar1; + int stack_dump0; + ivar0 = 71827492; + ivar1 = 71827493; + ivar2 = 71827494; + ivar3 = 71827495; + ivar4 = 71827531; + ivar5 = 71827532; + ivar6 = 71827817; + ivar7 = 71828240; + ivar8 = 218; + ivar9 = divide(16384, 2); + ivar10 = 3; + ivar11 = 4; + ivar12 = 200; + ivar13 = 3; + ivar14 = 16; + ivar15 = 23; + ivar16 = 177; + ivar17 = 4; + ivar18 = 157; + ivar19 = 4; + ivar20 = 137; + ivar21 = 4; + ivar22 = 15; + ivar23 = 15; + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + ivar27 = 0; + svar0 = "0"; + ivar28 = 9; + ivar29 = 23; + ivar30 = 0; + ivar31 = divide(getWidgetActualHeight(new WidgetPointer(ivar0)), ivar15); + ivar32 = multiply(ivar31, 2); + ivar33 = -1; + ivar34 = -1; + ivar35 = 0; + ivar36 = 0; + deleteAllExtraChilds(new WidgetPointer(ivar0)); + deleteAllExtraChilds(new WidgetPointer(ivar1)); + deleteAllExtraChilds(new WidgetPointer(ivar2)); + deleteAllExtraChilds(new WidgetPointer(ivar3)); + deleteAllExtraChilds(new WidgetPointer(ivar6)); + deleteAllExtraChilds(new WidgetPointer(ivar7)); + svar1 = ""; + ivar37 = -1; + ivar27 = cs2method3709(); + while (ivar26 < ivar27) { + ivar25 = multiply(divide(ivar37, 2), ivar15); + svar0 = cs2method3710(ivar26); + ivar34 = cs2method3711(ivar26); + if (subtract(globalint_1516, 1) != ivar34) { + ivar36 = 1; + if (((boolean)globalint_1516) || (globalint_1516 == -1)) { + ivar36 = 0; + } + } else { + ivar36 = 0; + } + createExtraChild(new WidgetPointer(ivar0), 4, ivar26); + if (((boolean)ivar36)) { + setWidgetFont(3793); + setWidgetSize(ivar9, ivar15, 2, 0); + ivar33 = -1; + if (cs2method3751() && (cs2method3760(svar0) > -1)) { + ivar33 = cs2method3758(cs2method3760(svar0)); + } + if (ivar33 == getWorldId()) { + setWidgetRGB(new Color(60, 183, 30)); + } else if (ivar33 > 0) { + setWidgetRGB(new Color(255, 255, 100)); + } else { + setWidgetRGB(new Color(190, 178, 140)); + } + setWidgetUnknownBoolean(true); + setWidgetText(svar0); + } + createExtraChild(new WidgetPointer(ivar2), 5, ivar26); + if (((boolean)ivar36)) { + setWidgetSize(ivar22, ivar23, 0, 0); + setWidgetSprite(cs2method_3408(105, 100, 3712, ivar34)); + svar1 = cs2method_3408(105, 115, 3714, ivar34); + setScriptCallOnMouseOver(4538, new WidgetPointer(1096,104), new WidgetPointer(ivar2), ivar26, svar1, 120, 3793, 3793, 16777215, 13, 4, 3, -2147483647, -2147483646, "IIisifdiiiiii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1096,104), "I"); + } + createExtraChild(new WidgetPointer(ivar6), 5, ivar26); + if (((boolean)ivar36)) { + setWidgetSize(ivar22, ivar23, 0, 0); + switch (ivar34) { + case 0: + ivar35 = clanbitconfig_178; + break; + case 1: + ivar35 = clanbitconfig_179; + break; + case 2: + ivar35 = clanbitconfig_180; + break; + case 3: + ivar35 = clanbitconfig_181; + break; + case 4: + ivar35 = clanbitconfig_182; + break; + case 5: + ivar35 = clanbitconfig_183; + } + if (((boolean)ivar35) || (ivar34 >= 100)) { + setWidgetSprite(6235); + svar1 = "Rated Clan" + "
" + "Wars Leader"; + setScriptCallOnMouseOver(4538, new WidgetPointer(1096,104), new WidgetPointer(ivar6), ivar26, svar1, 120, 3793, 3793, 16777215, 13, 4, 3, -2147483647, -2147483646, "IIisifdiiiiii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1096,104), "I"); + } + } + createExtraChild(new WidgetPointer(ivar7), 5, ivar26); + if (((boolean)ivar36)) { + setWidgetSize(ivar22, ivar23, 0, 0); + } + createExtraChild(new WidgetPointer(ivar3), 5, ivar26); + if (((boolean)ivar36)) { + setWidgetSize(ivar28, ivar29, 0, 0); + setWidgetSprite(6034); + setWidgetContextMenuOption(1, "Show details"); + setScriptCallOnClickContextMenu(4303, ""); + } + ivar26 = add(ivar26, 1); + } + ivar38 = 0; + ivar26 = 0; + ivar39 = 0; + while (ivar26 < ivar27) { + stack_dump0 = ivar26; + cs2method3718(); + ivar39 = stack_dump0; + if (setWidgetRegister(new WidgetPointer(ivar0), ivar39) && (stringMethod4107(getWidgetText(), "") != 0)) { + if (mod(ivar38, 2) != 0) { + ivar24 = ivar8; + } else { + ivar24 = 0; + } + ivar25 = multiply(divide(ivar38, 2), ivar15); + setWidgetPosition(add(ivar10, ivar24), add(ivar11, ivar25), 0, 0); + if (setWidgetRegister(new WidgetPointer(ivar2), ivar39)) { + setWidgetPosition(add(ivar16, ivar24), add(ivar17, ivar25), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(ivar3), ivar39)) { + setWidgetPosition(add(ivar12, ivar24), ivar25, 0, 0); + } + if (setWidgetRegister(new WidgetPointer(ivar6), ivar39)) { + setWidgetPosition(add(ivar18, ivar24), add(ivar19, ivar25), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(ivar7), ivar39)) { + setWidgetPosition(add(ivar20, ivar24), add(ivar21, ivar25), 0, 0); + } + ivar38 = add(ivar38, 1); + } + ivar26 = add(ivar26, 1); + } + globalint_1517 = ivar38; + script_4318(); + return; +} diff --git a/dumps/scripts/4302.cs2 b/dumps/scripts/4302.cs2 new file mode 100644 index 000000000..9bb46a9d6 --- /dev/null +++ b/dumps/scripts/4302.cs2 @@ -0,0 +1,6 @@ +void script_4302() { + if (cs2method3701()) { + script_4318(); + } + return; +} diff --git a/dumps/scripts/4303.cs2 b/dumps/scripts/4303.cs2 new file mode 100644 index 000000000..3e07c3013 --- /dev/null +++ b/dumps/scripts/4303.cs2 @@ -0,0 +1,4 @@ +void script_4303() { + script_4305(); + return; +} diff --git a/dumps/scripts/4304.cs2 b/dumps/scripts/4304.cs2 new file mode 100644 index 000000000..0745c131a --- /dev/null +++ b/dumps/scripts/4304.cs2 @@ -0,0 +1,4 @@ +void script_4304() { + script_4305(); + return; +} diff --git a/dumps/scripts/4305.cs2 b/dumps/scripts/4305.cs2 new file mode 100644 index 000000000..ff6b6dd0e --- /dev/null +++ b/dumps/scripts/4305.cs2 @@ -0,0 +1,5 @@ +void script_4305() { + setWidgetIsHidden(false, new WidgetPointer(1096,70)); + script_4307(); + return; +} diff --git a/dumps/scripts/4306.cs2 b/dumps/scripts/4306.cs2 new file mode 100644 index 000000000..fad334f2d --- /dev/null +++ b/dumps/scripts/4306.cs2 @@ -0,0 +1,5 @@ +void script_4306() { + setWidgetIsHidden(true, new WidgetPointer(1096,70)); + setWidgetText(new WidgetPointer(1096,59), "Loading, please wait."); + return; +} diff --git a/dumps/scripts/4307.cs2 b/dumps/scripts/4307.cs2 new file mode 100644 index 000000000..8b25a6b1b --- /dev/null +++ b/dumps/scripts/4307.cs2 @@ -0,0 +1,11 @@ +void script_4307() { + globalint_1500 = -1; + globalint_1501 = -1; + bitconfig_9591 = -1; + bitconfig_9593 = -1; + bitconfig_9592 = -1; + bitconfig_9594 = -1; + globalstring_347 = ""; + globalint_1568 = -1; + return; +} diff --git a/dumps/scripts/4308.cs2 b/dumps/scripts/4308.cs2 new file mode 100644 index 000000000..ecb44be3c --- /dev/null +++ b/dumps/scripts/4308.cs2 @@ -0,0 +1,4 @@ +void script_4308(int arg0) { + script_1558(arg0); + return; +} diff --git a/dumps/scripts/4309.cs2 b/dumps/scripts/4309.cs2 new file mode 100644 index 000000000..6d34d3bec --- /dev/null +++ b/dumps/scripts/4309.cs2 @@ -0,0 +1,6 @@ +int script_4309() { + if ((((globalint_1500 != -1) && (globalint_1501 != -1)) && ((bitconfig_9591 != -1) && (bitconfig_9593 != -1))) && (((bitconfig_9592 != -1) && (bitconfig_9594 != -1)) && ((globalint_1568 != -1) && (stringMethod4107(globalstring_347, "") != 0)))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/431.cs2 b/dumps/scripts/431.cs2 new file mode 100644 index 000000000..df029b88d --- /dev/null +++ b/dumps/scripts/431.cs2 @@ -0,0 +1,117 @@ +void script_431(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + flow_0: + ivar2 = -1; + ivar3 = -1; + ivar4 = 0; + ivar5 = -1; + ivar6 = -1; + SWITCH (arg0) { + case 67108872: + GOTO flow_1 + case 67108873: + GOTO flow_5 + case 67108874: + GOTO flow_9 + case 67108875: + GOTO flow_13 + } + return; + flow_1: + ivar2 = 67108944; + ivar3 = 67108945; + if (((boolean)globalint_1388)) { + ivar4 = 1; + } else { + ivar4 = bitconfig_7539; + } + GOTO flow_16 + flow_5: + ivar2 = 67108927; + ivar3 = 67108928; + if (((boolean)globalint_1388)) { + ivar4 = 3; + } else { + ivar4 = bitconfig_7540; + } + GOTO flow_16 + flow_9: + ivar2 = 67108910; + ivar3 = 67108911; + if (((boolean)globalint_1388)) { + ivar4 = 5; + } else { + ivar4 = bitconfig_7541; + } + GOTO flow_16 + flow_13: + ivar2 = 67108893; + ivar3 = 67108894; + if (((boolean)globalint_1388)) { + ivar4 = 6; + } else { + ivar4 = bitconfig_7542; + } + flow_16: + SWITCH (ivar4) { + case 1: + GOTO flow_17 + case 2: + GOTO flow_18 + case 3: + GOTO flow_19 + case 4: + GOTO flow_20 + case 5: + GOTO flow_21 + case 6: + GOTO flow_22 + case 7: + GOTO flow_23 + case 8: + GOTO flow_24 + case 9: + GOTO flow_25 + } + return; + flow_17: + ivar5 = 293; + GOTO flow_26 + flow_18: + ivar5 = 299; + GOTO flow_26 + flow_19: + ivar5 = 300; + GOTO flow_26 + flow_20: + ivar5 = 301; + GOTO flow_26 + flow_21: + ivar5 = 305; + GOTO flow_26 + flow_22: + ivar5 = 1044; + GOTO flow_26 + flow_23: + ivar5 = 1045; + GOTO flow_26 + flow_24: + ivar5 = 1046; + GOTO flow_26 + flow_25: + ivar5 = 1047; + flow_26: + if (((boolean)arg1)) { + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + setWidgetIsHidden(false, new WidgetPointer(ivar3)); + cs2method2308(getOtherCommonData(ivar5, 1157), getOtherCommonData(ivar5, 1157), new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar2)); + setWidgetIsHidden(true, new WidgetPointer(ivar3)); + } + return; +} diff --git a/dumps/scripts/4310.cs2 b/dumps/scripts/4310.cs2 new file mode 100644 index 000000000..3caeef409 --- /dev/null +++ b/dumps/scripts/4310.cs2 @@ -0,0 +1,7 @@ +void script_4310() { + if (((boolean)script_4309())) { + script_4306(); + } + script_4311(); + return; +} diff --git a/dumps/scripts/4311.cs2 b/dumps/scripts/4311.cs2 new file mode 100644 index 000000000..3381a11ec --- /dev/null +++ b/dumps/scripts/4311.cs2 @@ -0,0 +1,122 @@ +void script_4311() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = 0; + ivar1 = script_4293(); + ivar2 = -1; + if (((boolean)script_4309())) { + ivar2 = globalint_1500; + } + setWidgetText(new WidgetPointer(1096,55), "Settings for: " + globalstring_347); + setWidgetIsHidden(true, new WidgetPointer(1096,751)); + setWidgetIsHidden(true, new WidgetPointer(1096,752)); + setWidgetIsHidden(true, new WidgetPointer(1096,754)); + setWidgetIsHidden(true, new WidgetPointer(1096,753)); + setWidgetIsHidden(true, new WidgetPointer(1096,157)); + setWidgetIsHidden(true, new WidgetPointer(1096,158)); + setWidgetIsHidden(true, new WidgetPointer(1096,160)); + setWidgetIsHidden(true, new WidgetPointer(1096,159)); + setWidgetIsHidden(true, new WidgetPointer(1096,376)); + setWidgetIsHidden(true, new WidgetPointer(1096,377)); + setWidgetIsHidden(true, new WidgetPointer(1096,379)); + setWidgetIsHidden(true, new WidgetPointer(1096,378)); + setWidgetIsHidden(true, new WidgetPointer(1096,780)); + setWidgetIsHidden(true, new WidgetPointer(1096,781)); + setWidgetIsHidden(true, new WidgetPointer(1096,783)); + setWidgetIsHidden(true, new WidgetPointer(1096,782)); + setWidgetIsHidden(true, new WidgetPointer(1096,69)); + setWidgetIsHidden(false, new WidgetPointer(1096,329)); + setWidgetIsHidden(false, new WidgetPointer(1096,341)); + setWidgetIsHidden(false, new WidgetPointer(1096,279)); + setWidgetIsHidden(false, new WidgetPointer(1096,265)); + ivar3 = 3720; + if (((boolean)getLanguage())) { + ivar3 = 3727; + } else if (getLanguage() == 2) { + ivar3 = 3728; + } else { + if (getLanguage() == 3) { + ivar3 = 3729; + } + } + if (((boolean)script_4309())) { + if (((boolean)globalint_1568)) { + setWidgetIsHidden(false, new WidgetPointer(1096,69)); + } + if (((boolean)script_4292())) { + if ((ivar1 > ivar2) || (ivar1 == 126)) { + setWidgetIsHidden(true, new WidgetPointer(1096,329)); + setWidgetIsHidden(true, new WidgetPointer(1096,341)); + setWidgetIsHidden(true, new WidgetPointer(1096,279)); + setWidgetIsHidden(true, new WidgetPointer(1096,265)); + if (ivar1 != 126) { + if (((boolean)globalint_1565)) { + setWidgetIsHidden(false, new WidgetPointer(1096,157)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,159)); + } + if (((boolean)globalint_1566)) { + setWidgetIsHidden(false, new WidgetPointer(1096,376)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,378)); + } + if (((boolean)globalint_1567)) { + setWidgetIsHidden(false, new WidgetPointer(1096,780)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,782)); + } + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,160)); + setWidgetIsHidden(false, new WidgetPointer(1096,379)); + setWidgetIsHidden(false, new WidgetPointer(1096,783)); + } + } else { + if (((boolean)globalint_1565)) { + setWidgetIsHidden(false, new WidgetPointer(1096,158)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,160)); + } + if (((boolean)globalint_1566)) { + setWidgetIsHidden(false, new WidgetPointer(1096,377)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,379)); + } + if (((boolean)globalint_1567)) { + setWidgetIsHidden(false, new WidgetPointer(1096,781)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,783)); + } + } + } else { + if (((boolean)globalint_1564)) { + setWidgetIsHidden(false, new WidgetPointer(1096,752)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,754)); + } + if (((boolean)globalint_1565)) { + setWidgetIsHidden(false, new WidgetPointer(1096,158)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,160)); + } + if (((boolean)globalint_1566)) { + setWidgetIsHidden(false, new WidgetPointer(1096,377)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,379)); + } + if (((boolean)globalint_1567)) { + setWidgetIsHidden(false, new WidgetPointer(1096,781)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1096,783)); + } + } + script_4501(71827729, cs2method_3408(105, 115, 3715, globalint_1500)); + if (((boolean)stringMethod4107("", cs2method_3408(105, 115, ivar3, globalint_1501)))) { + script_4501(71827715, cs2method_3408(105, 115, ivar3, subtract(globalint_1501, 1))); + } else { + script_4501(71827715, cs2method_3408(105, 115, ivar3, globalint_1501)); + } + } + return; +} diff --git a/dumps/scripts/4312.cs2 b/dumps/scripts/4312.cs2 new file mode 100644 index 000000000..1d40987d9 --- /dev/null +++ b/dumps/scripts/4312.cs2 @@ -0,0 +1,4 @@ +void script_4312() { + script_4313(); + return; +} diff --git a/dumps/scripts/4313.cs2 b/dumps/scripts/4313.cs2 new file mode 100644 index 000000000..e3c585697 --- /dev/null +++ b/dumps/scripts/4313.cs2 @@ -0,0 +1,4 @@ +void script_4313() { + script_4311(); + return; +} diff --git a/dumps/scripts/4314.cs2 b/dumps/scripts/4314.cs2 new file mode 100644 index 000000000..496104da3 --- /dev/null +++ b/dumps/scripts/4314.cs2 @@ -0,0 +1,4 @@ +void script_4314() { + setScriptCallOnGameloop(4319, 0, 0, "ii", new WidgetPointer(1096,50)); + return; +} diff --git a/dumps/scripts/4315.cs2 b/dumps/scripts/4315.cs2 new file mode 100644 index 000000000..bb08ebe82 --- /dev/null +++ b/dumps/scripts/4315.cs2 @@ -0,0 +1,4 @@ +void script_4315() { + setScriptCallOnGameloop(4319, 0, 1, "ii", new WidgetPointer(1096,50)); + return; +} diff --git a/dumps/scripts/4316.cs2 b/dumps/scripts/4316.cs2 new file mode 100644 index 000000000..fb5f5a943 --- /dev/null +++ b/dumps/scripts/4316.cs2 @@ -0,0 +1,6 @@ +void script_4316() { + setWidgetScrollMax(0, 0, new WidgetPointer(1091,6)); + cs2method2100(0, 0, new WidgetPointer(1091,6)); + script_31(71499781, 71499782, 5666, 5663, 5664, 5665, 5686, 5685); + return; +} diff --git a/dumps/scripts/4317.cs2 b/dumps/scripts/4317.cs2 new file mode 100644 index 000000000..e2fe58c86 --- /dev/null +++ b/dumps/scripts/4317.cs2 @@ -0,0 +1,27 @@ +void script_4317(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (cs2method3751()) { + if ((arg1 < 0) || (arg1 >= cs2method3755())) { + globalint_1518 = -1; + globalstring_126 = ""; + messageType0("That person isn't in your clan channel."); + return; + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar2 = getWidgetActualY(); + } + globalint_1518 = arg1; + globalstring_126 = cs2method3756(arg1); + if (setWidgetRegister(new WidgetPointer(1110,20))) { + setWidgetSize(1, 19, 0, 0); + setWidgetPosition(0, ivar2, 2, 0); + setScriptCallOnGameloop(4629, 1, "i"); + setWidgetIsHidden(false, new WidgetPointer(1110,13)); + setWidgetPosition(0, ivar2, 2, 0, new WidgetPointer(1110,13)); + } + } else { + messageType0("You must be in your clan channel to do that."); + } + return; +} diff --git a/dumps/scripts/4318.cs2 b/dumps/scripts/4318.cs2 new file mode 100644 index 000000000..a28726f4e --- /dev/null +++ b/dumps/scripts/4318.cs2 @@ -0,0 +1,23 @@ +void script_4318() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = 71827531; + ivar1 = 71827532; + ivar2 = 23; + ivar3 = max(getWidgetActualHeight(new WidgetPointer(ivar1)), multiply(add(divide(globalint_1517, 2), 1), ivar2)); + ivar4 = cs2method2601(new WidgetPointer(ivar1)); + if (ivar3 > getWidgetActualHeight(new WidgetPointer(1096,76))) { + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar1)), ivar3, new WidgetPointer(ivar1)); + cs2method2100(0, ivar4, new WidgetPointer(ivar1)); + setWidgetIsHidden(false, new WidgetPointer(ivar0)); + script_31(ivar0, ivar1, 5666, 5663, 5664, 5665, 5686, 5685); + } else { + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar1)), getWidgetActualHeight(new WidgetPointer(ivar1)), new WidgetPointer(ivar1)); + cs2method2100(0, 0, new WidgetPointer(ivar1)); + script_31(ivar0, ivar1, 5666, 5663, 5664, 5665, 5686, 5685); + } + return; +} diff --git a/dumps/scripts/4319.cs2 b/dumps/scripts/4319.cs2 new file mode 100644 index 000000000..479d1d85e --- /dev/null +++ b/dumps/scripts/4319.cs2 @@ -0,0 +1,52 @@ +void script_4319(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + ivar2 = 0; + ivar3 = 0; + ivar4 = 71827506; + ivar5 = 71827505; + ivar6 = 71827530; + ivar7 = 71827612; + ivar8 = 71827501; + ivar9 = 71827532; + if (arg0 > 0) { + ivar2 = subtract(arg0, 1); + } else { + ivar2 = 0; + ivar3 = getWidgetActualHeight(new WidgetPointer(ivar4)); + if (((boolean)arg1)) { + ivar3 = add(ivar3, 6); + setWidgetVFlip(0, new WidgetPointer(ivar6)); + setWidgetVFlip(0, new WidgetPointer(ivar7)); + setWidgetContextMenuOption(1, new WidgetPointer(ivar8), "Hide"); + setScriptCallOnClickContextMenu(4319, 0, 1, "ii", new WidgetPointer(ivar8)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,68)); + ivar3 = subtract(ivar3, 6); + setWidgetVFlip(1, new WidgetPointer(ivar6)); + setWidgetVFlip(1, new WidgetPointer(ivar7)); + setWidgetContextMenuOption(1, new WidgetPointer(ivar8), "Show"); + setScriptCallOnClickContextMenu(4319, 0, 0, "ii", new WidgetPointer(ivar8)); + } + ivar3 = min(ivar3, 224); + ivar3 = max(ivar3, 115); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar4)), ivar3, 0, 0, new WidgetPointer(ivar4)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar5)), subtract(ivar3, 62), 0, 1, new WidgetPointer(ivar5)); + if (((boolean)arg1) && (ivar3 >= 224)) { + setWidgetIsHidden(false, new WidgetPointer(1096,68)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar4)); + } else if (((boolean)arg1) && (ivar3 <= 115)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar4)); + } else { + setScriptCallOnGameloop(4319, ivar2, arg1, "ii", new WidgetPointer(ivar4)); + } + script_4302(); + } + return; +} diff --git a/dumps/scripts/432.cs2 b/dumps/scripts/432.cs2 new file mode 100644 index 000000000..3b0603ef2 --- /dev/null +++ b/dumps/scripts/432.cs2 @@ -0,0 +1,57 @@ +void script_432(int arg0,int arg1) { + int ivar2; + int ivar3; + flow_0: + ivar2 = -1; + ivar3 = 67108949; + SWITCH (arg0) { + case 67108929: + GOTO flow_1 + case 67108912: + GOTO flow_5 + case 67108895: + GOTO flow_9 + case 67108878: + GOTO flow_13 + } + return; + flow_1: + if (((boolean)globalint_1388)) { + ivar2 = 293; + } else { + ivar2 = script_488(bitconfig_7539); + } + GOTO flow_16 + flow_5: + if (((boolean)globalint_1388)) { + ivar2 = 300; + } else { + ivar2 = script_488(bitconfig_7540); + } + GOTO flow_16 + flow_9: + if (((boolean)globalint_1388)) { + ivar2 = 305; + } else { + ivar2 = script_488(bitconfig_7541); + } + GOTO flow_16 + flow_13: + if (((boolean)globalint_1388)) { + ivar2 = 1044; + } else { + ivar2 = script_488(bitconfig_7542); + } + flow_16: + if (ivar2 != -1) { + setWidgetText(new WidgetPointer(1024,92), getOtherCommonData(ivar2, 1150)); + setWidgetText(new WidgetPointer(1024,93), getOtherCommonData(ivar2, 1151)); + setWidgetText(new WidgetPointer(1024,94), "Cost: " + intToStr(getOtherCommonData(ivar2, 1154))); + setWidgetText(new WidgetPointer(1024,95), "Cooldown: " + intToStr(getOtherCommonData(ivar2, 1155))); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar3)), arg1, 0, 0, new WidgetPointer(ivar3)); + setWidgetIsHidden(false, new WidgetPointer(ivar3)); + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar3)); + } + return; +} diff --git a/dumps/scripts/4320.cs2 b/dumps/scripts/4320.cs2 new file mode 100644 index 000000000..2b6a0fc60 --- /dev/null +++ b/dumps/scripts/4320.cs2 @@ -0,0 +1,4 @@ +void script_4320() { + script_4321(); + return; +} diff --git a/dumps/scripts/4321.cs2 b/dumps/scripts/4321.cs2 new file mode 100644 index 000000000..f9df9df6c --- /dev/null +++ b/dumps/scripts/4321.cs2 @@ -0,0 +1,9 @@ +void script_4321() { + script_4307(); + script_4311(); + setWidgetIsHidden(false, new WidgetPointer(1096,70)); + setWidgetText(new WidgetPointer(1096,59), "Please select a clanmate to view."); + script_4501(71827729, ""); + script_4501(71827715, ""); + return; +} diff --git a/dumps/scripts/4322.cs2 b/dumps/scripts/4322.cs2 new file mode 100644 index 000000000..54c78eb93 --- /dev/null +++ b/dumps/scripts/4322.cs2 @@ -0,0 +1,55 @@ +void script_4322(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + ivar4 = 0; + ivar5 = 0; + ivar6 = 8; + ivar7 = 8; + ivar8 = 50; + ivar9 = 36; + ivar10 = 0; + ivar11 = 0; + ivar12 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), multiply(ivar6, 2)), add(ivar6, ivar8)); + ivar13 = getCommonDefinitionSize(3722); + ivar14 = getCommonDefinitionSize(3721); + ivar15 = min(ivar13, ivar14); + while (ivar4 < ivar15) { + ivar10 = add(ivar6, multiply(add(ivar8, ivar6), subtract(ivar4, multiply(ivar5, ivar12)))); + ivar11 = add(ivar7, multiply(ivar5, add(ivar9, ivar7))); + createExtraChild(new WidgetPointer(arg2), 5, ivar4); + setWidgetSize(ivar8, ivar9, 0, 0); + setWidgetPosition(ivar10, ivar11, 0, 0); + setWidgetSprite(6036); + setScriptCallOnConfigChange(4324, ivar15, 2149, 1, "iY"); + setScriptCallOnMouseEntered(4326, ivar4, new WidgetPointer(arg2), "iI"); + setScriptCallOnMouseExit(4327, ivar4, new WidgetPointer(arg2), "iI"); + createExtraChild(new WidgetPointer(arg3), 5, ivar4); + setWidgetSize(subtract(ivar8, 8), subtract(ivar9, 8), 0, 0); + setWidgetPosition(add(ivar10, 4), add(ivar11, 4), 0, 0); + setWidgetSprite(cs2method_3408(105, 100, 3721, ivar4)); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(4323, ivar4, new WidgetPointer(arg2), ivar15, "iIi"); + setScriptCallOnMouseOver(568, new WidgetPointer(arg3), ivar4, new WidgetPointer(1089,37), cs2method_3408(105, 115, 3722, ivar4), 20, 350, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1089,37), "I"); + ivar4 = add(ivar4, 1); + if (((boolean)mod(ivar4, ivar12))) { + ivar5 = add(ivar5, 1); + } + } + cs2method2100(0, 0, new WidgetPointer(arg0)); + setWidgetScrollMax(0, add(ivar7, multiply(add(ivar5, 1), add(ivar7, ivar9))), new WidgetPointer(arg0)); + script_31(arg1, arg0, 5666, 5663, 5664, 5665, 5686, 5685); + return; +} diff --git a/dumps/scripts/4323.cs2 b/dumps/scripts/4323.cs2 new file mode 100644 index 000000000..169ed3355 --- /dev/null +++ b/dumps/scripts/4323.cs2 @@ -0,0 +1,4 @@ +void script_4323(int arg0,int arg1,int arg2) { + script_4325(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4324.cs2 b/dumps/scripts/4324.cs2 new file mode 100644 index 000000000..f6820f149 --- /dev/null +++ b/dumps/scripts/4324.cs2 @@ -0,0 +1,4 @@ +void script_4324(int arg0) { + script_4325(standart_config_2149, 71368704, arg0); + return; +} diff --git a/dumps/scripts/4325.cs2 b/dumps/scripts/4325.cs2 new file mode 100644 index 000000000..861b77481 --- /dev/null +++ b/dumps/scripts/4325.cs2 @@ -0,0 +1,14 @@ +void script_4325(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 0; + while (ivar3 < arg2) { + if (setWidgetRegister(new WidgetPointer(arg1), ivar3)) { + setWidgetSprite(6036); + } + ivar3 = add(ivar3, 1); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + setWidgetSprite(6039); + } + return; +} diff --git a/dumps/scripts/4326.cs2 b/dumps/scripts/4326.cs2 new file mode 100644 index 000000000..d2b32cb34 --- /dev/null +++ b/dumps/scripts/4326.cs2 @@ -0,0 +1,6 @@ +void script_4326(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + setWidgetSprite(6037); + } + return; +} diff --git a/dumps/scripts/4327.cs2 b/dumps/scripts/4327.cs2 new file mode 100644 index 000000000..c12647225 --- /dev/null +++ b/dumps/scripts/4327.cs2 @@ -0,0 +1,10 @@ +void script_4327(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + if ((arg1 == 71368704) && (standart_config_2149 == arg0)) { + setWidgetSprite(6039); + } else { + setWidgetSprite(6036); + } + } + return; +} diff --git a/dumps/scripts/4328.cs2 b/dumps/scripts/4328.cs2 new file mode 100644 index 000000000..81dde4bba --- /dev/null +++ b/dumps/scripts/4328.cs2 @@ -0,0 +1,8 @@ +void script_4328(int arg0) { + if (((boolean)clanbitconfig_11)) { + setWidgetSprite(cs2method_3408(105, 100, 3721, clanbitconfig_7), new WidgetPointer(arg0)); + } else { + setWidgetSprite(cs2method_3408(105, 100, 3721, 0), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4329.cs2 b/dumps/scripts/4329.cs2 new file mode 100644 index 000000000..f59b1d8de --- /dev/null +++ b/dumps/scripts/4329.cs2 @@ -0,0 +1,13 @@ +void script_4329(int arg0) { + if (clanlongconfig_2 != -1L) { + setWidgetText(new WidgetPointer(arg0), toBase36(clanlongconfig_2)); + setScriptCallOnMouseEntered(45, new WidgetPointer(arg0), 255, "Ii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(45, new WidgetPointer(arg0), 15393218, "Ii", new WidgetPointer(arg0)); + cs2method2314(175, new WidgetPointer(arg0)); + setScriptCallOnMousePressed(4330, clanlongconfig_2, "\u00a7", new WidgetPointer(arg0)); + cs2method2305(new WidgetPointer(arg0), "Visit Clan Forum"); + } else { + setWidgetText(new WidgetPointer(arg0), ""); + } + return; +} diff --git a/dumps/scripts/433.cs2 b/dumps/scripts/433.cs2 new file mode 100644 index 000000000..f3fb2886c --- /dev/null +++ b/dumps/scripts/433.cs2 @@ -0,0 +1,4 @@ +void script_433() { + setWidgetIsHidden(true, new WidgetPointer(1024,85)); + return; +} diff --git a/dumps/scripts/4330.cs2 b/dumps/scripts/4330.cs2 new file mode 100644 index 000000000..35051af5d --- /dev/null +++ b/dumps/scripts/4330.cs2 @@ -0,0 +1,4 @@ +void script_4330(long arg0) { + cs2method5400(0, "clan-forum", "threads.ws?threadid=" + toBase36(arg0)); + return; +} diff --git a/dumps/scripts/4331.cs2 b/dumps/scripts/4331.cs2 new file mode 100644 index 000000000..1e10f922f --- /dev/null +++ b/dumps/scripts/4331.cs2 @@ -0,0 +1,10 @@ +void script_4331(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = -1; + ivar3 = -1; + if (cs2method3700()) { + script_4332(arg0, arg1); + } + return; +} diff --git a/dumps/scripts/4332.cs2 b/dumps/scripts/4332.cs2 new file mode 100644 index 000000000..5231e7b93 --- /dev/null +++ b/dumps/scripts/4332.cs2 @@ -0,0 +1,26 @@ +void script_4332(int arg0,int arg1) { + int ivar2; + int ivar3; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_4384_struct(2,0,0) structdump_3; + ivar2 = -1; + ivar3 = -1; + stack_dump0 = clanbitconfig_14; + stack_dump1 = clanbitconfig_15; + stack_dump2 = 1; + structdump_3 = script_4384(stack_dump0, stack_dump1, stack_dump2); + ivar3 = structdump_3.intpart_1; + ivar2 = structdump_3.intpart_0; + setWidgetSprite(ivar2, new WidgetPointer(arg0)); + setWidgetSprite(ivar3, new WidgetPointer(arg1)); + if (cs2method3709() >= 5) { + setWidgetRGB(new Color(getColorRelatedMethod4020(clanconfig_16)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(clanconfig_17)), new WidgetPointer(arg1)); + } else { + setWidgetRGB(new Color(getColorRelatedMethod4020(6716)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(6716)), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/4333.cs2 b/dumps/scripts/4333.cs2 new file mode 100644 index 000000000..1d0abcf52 --- /dev/null +++ b/dumps/scripts/4333.cs2 @@ -0,0 +1,6 @@ +void script_4333(int arg0,int arg1) { + if (cs2method3700()) { + script_4334(arg0, arg1); + } + return; +} diff --git a/dumps/scripts/4334.cs2 b/dumps/scripts/4334.cs2 new file mode 100644 index 000000000..d19e1b6f1 --- /dev/null +++ b/dumps/scripts/4334.cs2 @@ -0,0 +1,10 @@ +void script_4334(int arg0,int arg1) { + if (cs2method3709() >= 5) { + setWidgetRGB(new Color(getColorRelatedMethod4020(clanconfig_18)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(clanconfig_19)), new WidgetPointer(arg1)); + } else { + setWidgetRGB(new Color(getColorRelatedMethod4020(42550)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(39382)), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/4335.cs2 b/dumps/scripts/4335.cs2 new file mode 100644 index 000000000..2f9946806 --- /dev/null +++ b/dumps/scripts/4335.cs2 @@ -0,0 +1,6 @@ +void script_4335(int arg0) { + if (cs2method3700()) { + script_4336(arg0); + } + return; +} diff --git a/dumps/scripts/4336.cs2 b/dumps/scripts/4336.cs2 new file mode 100644 index 000000000..bf6203547 --- /dev/null +++ b/dumps/scripts/4336.cs2 @@ -0,0 +1,8 @@ +void script_4336(int arg0) { + if (((boolean)clanbitconfig_9) && (cs2method3709() >= 5)) { + setWidgetText(new WidgetPointer(arg0), strRemoveEntities(clanstringconfig_1)); + return; + } + setWidgetText(new WidgetPointer(arg0), ""); + return; +} diff --git a/dumps/scripts/4337.cs2 b/dumps/scripts/4337.cs2 new file mode 100644 index 000000000..80534e461 --- /dev/null +++ b/dumps/scripts/4337.cs2 @@ -0,0 +1,23 @@ +string script_4337(int arg0) { + int ivar1; + int ivar2; + string svar0; + string svar1; + string svar2; + svar0 = "+"; + if (arg0 < 0) { + svar0 = "-"; + arg0 = subtract(0, arg0); + } + ivar1 = divide(arg0, 60); + ivar2 = mod(arg0, 60); + svar1 = intToStr(ivar1); + if (ivar1 < 10) { + svar1 = "0" + intToStr(ivar1); + } + svar2 = intToStr(ivar2); + if (ivar2 < 10) { + svar2 = "0" + intToStr(ivar2); + } + return svar0 + svar1 + ":" + svar2; +} diff --git a/dumps/scripts/4338.cs2 b/dumps/scripts/4338.cs2 new file mode 100644 index 000000000..ce2852b0e --- /dev/null +++ b/dumps/scripts/4338.cs2 @@ -0,0 +1,14 @@ +string script_4338(int arg0) { + string svar0; + svar0 = ""; + if (arg0 < 10) { + svar0 = concat(arg0, "00:0"); + } else if (arg0 < 60) { + svar0 = concat(arg0, "00:"); + } else if (arg0 < 959) { + svar0 = "0" + intToStr(divide(arg0, 100)) + ":" + intToStr(mod(arg0, 100)); + } else { + svar0 = intToStr(divide(arg0, 100)) + ":" + intToStr(mod(arg0, 100)); + } + return svar0; +} diff --git a/dumps/scripts/4339.cs2 b/dumps/scripts/4339.cs2 new file mode 100644 index 000000000..b5bf61eb3 --- /dev/null +++ b/dumps/scripts/4339.cs2 @@ -0,0 +1,4 @@ +void script_4339(int arg0,int arg1,int arg2) { + setScriptCallOnClanChatSettingsStuff(5230, arg0, new WidgetPointer(arg1), new WidgetPointer(arg2), "iII", new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/434.cs2 b/dumps/scripts/434.cs2 new file mode 100644 index 000000000..8b06586a1 --- /dev/null +++ b/dumps/scripts/434.cs2 @@ -0,0 +1,10 @@ +void script_434() { + if (((boolean)bitconfig_7509)) { + setWidgetSprite(1135, new WidgetPointer(1026,21)); + setWidgetSprite(1134, new WidgetPointer(1026,23)); + } else { + setWidgetSprite(1134, new WidgetPointer(1026,21)); + setWidgetSprite(1135, new WidgetPointer(1026,23)); + } + return; +} diff --git a/dumps/scripts/4340.cs2 b/dumps/scripts/4340.cs2 new file mode 100644 index 000000000..2a84b8ef4 --- /dev/null +++ b/dumps/scripts/4340.cs2 @@ -0,0 +1,38 @@ +void script_4340(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + string svar1; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_4341_struct(0,2,0) structdump_3; + ivar4 = divide(divide(arg0, 60), 24); + ivar5 = subtract(arg0, multiply(multiply(ivar4, 24), 60)); + ivar6 = divide(ivar5, 60); + ivar7 = mod(ivar5, 60); + svar0 = ""; + if (ivar6 < 10) { + svar0 = "0" + intToStr(ivar6); + } else { + svar0 = intToStr(ivar6); + } + svar1 = ""; + if (ivar7 < 10) { + svar1 = "0" + intToStr(ivar7); + } else { + svar1 = intToStr(ivar7); + } + setWidgetText(new WidgetPointer(arg2), svar0 + ":" + svar1); + setScriptCallOnGameloop(4342, ivar6, ivar7, arg1, new WidgetPointer(arg2), new WidgetPointer(arg3), "iiiII", new WidgetPointer(arg2)); + stack_dump0 = arg1; + stack_dump1 = ivar6; + stack_dump2 = ivar7; + structdump_3 = script_4341(stack_dump0, stack_dump1, stack_dump2); + svar1 = structdump_3.stringpart_1; + svar0 = structdump_3.stringpart_0; + setWidgetText(new WidgetPointer(arg3), svar0 + ":" + svar1); + return; +} diff --git a/dumps/scripts/4341.cs2 b/dumps/scripts/4341.cs2 new file mode 100644 index 000000000..971f74fc6 --- /dev/null +++ b/dumps/scripts/4341.cs2 @@ -0,0 +1,34 @@ +cs2func_script_4341_struct(0,2,0) script_4341(int arg0,int arg1,int arg2) { + int ivar3; + string svar0; + string svar1; + string svar2; + svar0 = intToStr(arg1); + svar1 = intToStr(arg2); + ivar3 = 0; + svar2 = ""; + ivar3 = add(add(multiply(60, arg1), arg0), arg2); + if (ivar3 < 0) { + ivar3 = add(1440, ivar3); + } + arg2 = mod(ivar3, 60); + arg1 = divide(ivar3, 60); + if (arg1 > 23) { + arg1 = subtract(arg1, 24); + } else { + if (arg1 < 0) { + arg1 = subtract(24, arg1); + } + } + if (arg1 < 10) { + svar0 = "0" + intToStr(arg1); + } else { + svar0 = intToStr(arg1); + } + if (arg2 < 10) { + svar1 = "0" + intToStr(arg2); + } else { + svar1 = intToStr(arg2); + } + return newstruct cs2func_script_4341_struct(svar0, svar1); +} diff --git a/dumps/scripts/4342.cs2 b/dumps/scripts/4342.cs2 new file mode 100644 index 000000000..fe2815f96 --- /dev/null +++ b/dumps/scripts/4342.cs2 @@ -0,0 +1,70 @@ +void script_4342(int arg0,int arg1,int arg2,int arg3,int arg4) { + string svar0; + string svar1; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_4341_struct(0,2,0) structdump_3; + cs2func_script_4341_struct(0,2,0) structdump_4; + svar0 = ""; + svar1 = ""; + if (((boolean)mod(getClientCycle(), 3000))) { + arg1 = add(arg1, 1); + if (arg1 >= 60) { + arg1 = 0; + arg0 = add(arg0, 1); + if (arg0 >= 24) { + arg0 = 0; + } + } + if (arg0 < 10) { + svar0 = "0" + intToStr(arg0); + } else { + svar0 = intToStr(arg0); + } + if (arg1 < 10) { + svar1 = "0" + intToStr(arg1); + } else { + svar1 = intToStr(arg1); + } + setWidgetText(new WidgetPointer(arg3), svar0 + ":" + svar1); + setScriptCallOnGameloop(4342, arg0, arg1, arg2, new WidgetPointer(arg3), new WidgetPointer(arg4), "iiiII", new WidgetPointer(arg3)); + stack_dump0 = arg2; + stack_dump1 = arg0; + stack_dump2 = arg1; + structdump_3 = script_4341(stack_dump0, stack_dump1, stack_dump2); + svar1 = structdump_3.stringpart_1; + svar0 = structdump_3.stringpart_0; + setWidgetText(new WidgetPointer(arg4), svar0 + ":" + svar1); + } else { + if (((boolean)mod(getClientCycle(), 50))) { + if (arg0 < 10) { + svar0 = "0" + intToStr(arg0); + } else { + svar0 = intToStr(arg0); + } + if (arg1 < 10) { + svar1 = "0" + intToStr(arg1); + } else { + svar1 = intToStr(arg1); + } + if (((boolean)mod(getClientCycle(), 100))) { + setWidgetText(new WidgetPointer(arg3), svar0 + ":" + svar1); + } else { + setWidgetText(new WidgetPointer(arg3), svar0 + " " + svar1); + } + stack_dump0 = arg2; + stack_dump1 = arg0; + stack_dump2 = arg1; + structdump_4 = script_4341(stack_dump0, stack_dump1, stack_dump2); + svar1 = structdump_4.stringpart_1; + svar0 = structdump_4.stringpart_0; + if (((boolean)mod(getClientCycle(), 100))) { + setWidgetText(new WidgetPointer(arg4), svar0 + ":" + svar1); + } else { + setWidgetText(new WidgetPointer(arg4), svar0 + " " + svar1); + } + } + } + return; +} diff --git a/dumps/scripts/4343.cs2 b/dumps/scripts/4343.cs2 new file mode 100644 index 000000000..9d092cb82 --- /dev/null +++ b/dumps/scripts/4343.cs2 @@ -0,0 +1,95 @@ +void script_4343(int arg0) { + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + string svar6; + string svar7; + string svar8; + string svar9; + string svar10; + cs2func_script_4721_struct(0,10,0) structdump_0; + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + svar4 = ""; + svar5 = ""; + svar6 = ""; + svar7 = ""; + svar8 = ""; + svar9 = ""; + svar10 = ""; + structdump_0 = script_4721(); + svar9 = structdump_0.stringpart_9; + svar8 = structdump_0.stringpart_8; + svar7 = structdump_0.stringpart_7; + svar6 = structdump_0.stringpart_6; + svar5 = structdump_0.stringpart_5; + svar4 = structdump_0.stringpart_4; + svar3 = structdump_0.stringpart_3; + svar2 = structdump_0.stringpart_2; + svar1 = structdump_0.stringpart_1; + svar0 = structdump_0.stringpart_0; + if (stringMethod4107(svar0, "") != 0) { + svar10 = svar0; + } + if (stringMethod4107(svar1, "") != 0) { + if (strLength(svar10) > 0) { + svar10 = concat(svar10, ", "); + } + svar10 = concat(svar10, svar1); + } + if (stringMethod4107(svar2, "") != 0) { + if (strLength(svar10) > 0) { + svar10 = concat(svar10, ", "); + } + svar10 = concat(svar10, svar2); + } + if (stringMethod4107(svar3, "") != 0) { + if (strLength(svar10) > 0) { + svar10 = concat(svar10, ", "); + } + svar10 = concat(svar10, svar3); + } + if (stringMethod4107(svar4, "") != 0) { + if (strLength(svar10) > 0) { + svar10 = concat(svar10, ", "); + } + svar10 = concat(svar10, svar4); + } + if (stringMethod4107(svar5, "") != 0) { + if (strLength(svar10) > 0) { + svar10 = concat(svar10, ", "); + } + svar10 = concat(svar10, svar5); + } + if (stringMethod4107(svar6, "") != 0) { + if (strLength(svar10) > 0) { + svar10 = concat(svar10, ", "); + } + svar10 = concat(svar10, svar6); + } + if (stringMethod4107(svar7, "") != 0) { + if (strLength(svar10) > 0) { + svar10 = concat(svar10, ", "); + } + svar10 = concat(svar10, svar7); + } + if (stringMethod4107(svar8, "") != 0) { + if (strLength(svar10) > 0) { + svar10 = concat(svar10, ", "); + } + svar10 = concat(svar10, svar8); + } + if (stringMethod4107(svar9, "") != 0) { + if (strLength(svar10) > 0) { + svar10 = concat(svar10, ", "); + } + svar10 = concat(svar10, svar9); + } + setWidgetText(new WidgetPointer(arg0), svar10); + return; +} diff --git a/dumps/scripts/4344.cs2 b/dumps/scripts/4344.cs2 new file mode 100644 index 000000000..39e0e980d --- /dev/null +++ b/dumps/scripts/4344.cs2 @@ -0,0 +1,225 @@ +cs2func_script_4344_struct(5,0,0) script_4344(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9) { + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + string svar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + int stack_dump8; + int stack_dump9; + int stack_dump10; + cs2func_script_5351_struct(5,0,0) structdump_11; + flow_0: + ivar10 = 74907707; + ivar11 = 0; + ivar12 = -1; + svar0 = ""; + ivar13 = 0; + ivar14 = 5182; + globalarray_0 = new int[getCommonDefinitionSize(ivar14)]; + ivar15 = 0; + ivar16 = -1; + ivar17 = 0; + while (ivar17 < getCommonDefinitionSize(ivar14)) { + globalarray_0[ivar17] = cs2method_3408(105, 74, ivar14, ivar17); + ivar17 = add(ivar17, 1); + } + ivar17 = 0; + ivar15 = 1; + ivar18 = 0; + ivar19 = 0; + SWITCH (globalint_1659) { + case 1: + GOTO flow_18 + case 2: + GOTO flow_32 + case 3: + GOTO flow_40 + } + while (((boolean)ivar15)) { + ivar15 = 0; + ivar17 = subtract(getCommonDefinitionSize(ivar14), 1); + while (ivar17 > 0) { + if (getOtherCommonData(globalarray_0[ivar17], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar17], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar17], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1932); + } + if (ivar18 < ivar19) { + ivar15 = 1; + ivar16 = globalarray_0[subtract(ivar17, 1)]; + globalarray_0[subtract(ivar17, 1)] = globalarray_0[ivar17]; + globalarray_0[ivar17] = ivar16; + } + ivar17 = subtract(ivar17, 1); + } + } + flow_17: + GOTO flow_47 + flow_18: + IF (((boolean)ivar15)) + GOTO flow_19 + GOTO flow_31 + flow_19: + ivar15 = 0; + ivar17 = subtract(getCommonDefinitionSize(ivar14), 1); + while (ivar17 > 0) { + if (getOtherCommonData(globalarray_0[ivar17], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar17], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar17], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1932); + } + if (ivar18 > ivar19) { + ivar15 = 1; + ivar16 = globalarray_0[subtract(ivar17, 1)]; + globalarray_0[subtract(ivar17, 1)] = globalarray_0[ivar17]; + globalarray_0[ivar17] = ivar16; + } + ivar17 = subtract(ivar17, 1); + } + GOTO flow_18 + flow_31: + GOTO flow_47 + flow_32: + IF (((boolean)ivar15)) + GOTO flow_33 + GOTO flow_39 + flow_33: + ivar15 = 0; + ivar17 = subtract(getCommonDefinitionSize(ivar14), 1); + while (ivar17 > 0) { + if (stringMethod4107(getOtherCommonData(globalarray_0[ivar17], 1930), getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1930)) < 0) { + ivar15 = 1; + ivar16 = globalarray_0[subtract(ivar17, 1)]; + globalarray_0[subtract(ivar17, 1)] = globalarray_0[ivar17]; + globalarray_0[ivar17] = ivar16; + } + ivar17 = subtract(ivar17, 1); + } + GOTO flow_32 + flow_39: + GOTO flow_47 + flow_40: + IF (((boolean)ivar15)) + GOTO flow_41 + GOTO flow_47 + flow_41: + ivar15 = 0; + ivar17 = subtract(getCommonDefinitionSize(ivar14), 1); + while (ivar17 > 0) { + if (stringMethod4107(getOtherCommonData(globalarray_0[ivar17], 1930), getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1930)) > 0) { + ivar15 = 1; + ivar16 = globalarray_0[subtract(ivar17, 1)]; + globalarray_0[subtract(ivar17, 1)] = globalarray_0[ivar17]; + globalarray_0[ivar17] = ivar16; + } + ivar17 = subtract(ivar17, 1); + } + GOTO flow_40 + flow_47: + ivar17 = 0; + ivar20 = 1; + while (ivar20 <= 3) { + createExtraChild(new WidgetPointer(ivar10), 4, arg5); + arg5 = add(arg5, 1); + if (((boolean)ivar20)) { + setWidgetPosition(11, arg4, 0, 0); + } else { + arg2 = add(add(arg2, arg3), arg4); + setWidgetPosition(11, arg2, 0, 0); + } + ivar11 = getWidgetActualY(); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(ivar10)), 20), 13, 0, 0); + switch (ivar20) { + case 1: + setWidgetText("Tier 1"); + break; + case 2: + setWidgetText("Tier 2"); + break; + case 3: + setWidgetText("Tier 3"); + break; + case 4: + setWidgetText("Tier 4"); + } + setWidgetFont(4040); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(230, 190, 120)); + setWidgetTextAlignment(0, 1, 13); + if (((boolean)ivar20)) { + createExtraChild(new WidgetPointer(ivar10), 4, arg5); + arg5 = add(arg5, 1); + setWidgetPosition(7, ivar11, 2, 0); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(ivar10)), 20), 13, 0, 0); + setWidgetText("Scroll Down For More Tiers"); + setWidgetFont(4040); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(230, 190, 120)); + setWidgetTextAlignment(2, 1, 13); + } + createExtraChild(new WidgetPointer(ivar10), 3, arg5); + arg5 = add(arg5, 1); + if (((boolean)ivar20)) { + setWidgetPosition(11, 23, 0, 0); + } else { + arg2 = add(arg2, 17); + setWidgetPosition(11, arg2, 0, 0); + } + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(ivar10)), 20), 1, 0, 0); + setWidgetRGB(new Color(230, 190, 120)); + arg2 = add(getWidgetActualY(), getWidgetActualHeight()); + ivar17 = 0; + arg0 = 0; + arg1 = arg4; + while (ivar17 < getCommonDefinitionSize(ivar14)) { + ivar12 = globalarray_0[ivar17]; + if (getOtherCommonData(ivar12, 1993) == ivar20) { + stack_dump0 = ivar12; + stack_dump1 = arg0; + stack_dump2 = arg1; + stack_dump3 = arg2; + stack_dump4 = arg3; + stack_dump5 = arg4; + stack_dump6 = arg5; + stack_dump7 = arg6; + stack_dump8 = arg7; + stack_dump9 = arg8; + stack_dump10 = arg9; + structdump_11 = script_5351(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9, stack_dump10); + arg5 = structdump_11.intpart_4; + arg3 = structdump_11.intpart_3; + arg2 = structdump_11.intpart_2; + arg1 = structdump_11.intpart_1; + arg0 = structdump_11.intpart_0; + } + ivar17 = add(ivar17, 1); + } + ivar20 = add(ivar20, 1); + } + return newstruct cs2func_script_4344_struct(arg0, arg1, arg2, arg3, arg5); +} diff --git a/dumps/scripts/4345.cs2 b/dumps/scripts/4345.cs2 new file mode 100644 index 000000000..bdbc4936e --- /dev/null +++ b/dumps/scripts/4345.cs2 @@ -0,0 +1,11 @@ +string script_4345(int arg0,int arg1) { + int ivar2; + ivar2 = -1; + if ((arg0 > 0) && (arg1 > 0)) { + ivar2 = cs2method_3408(105, 103, 3703, arg0); + if (ivar2 != -1) { + return cs2method_3408(105, 115, ivar2, arg1); + } + } + return ""; +} diff --git a/dumps/scripts/4346.cs2 b/dumps/scripts/4346.cs2 new file mode 100644 index 000000000..60be56125 --- /dev/null +++ b/dumps/scripts/4346.cs2 @@ -0,0 +1,13 @@ +void script_4346() { + script_4586(71893069, 71893169, bitconfig_9155, bitconfig_9156); + script_4586(71893080, 71893180, bitconfig_9157, bitconfig_9158); + script_4586(71893091, 71893181, bitconfig_9159, bitconfig_9160); + script_4586(71893102, 71893182, bitconfig_9161, bitconfig_9162); + script_4586(71893113, 71893183, bitconfig_9163, bitconfig_9164); + script_4586(71893124, 71893184, bitconfig_9165, bitconfig_9166); + script_4586(71893135, 71893185, bitconfig_9167, bitconfig_9168); + script_4586(71893146, 71893186, bitconfig_9169, bitconfig_9170); + script_4586(71893157, 71893187, bitconfig_9171, bitconfig_9172); + script_4586(71893179, 71893188, bitconfig_9173, bitconfig_9174); + return; +} diff --git a/dumps/scripts/4347.cs2 b/dumps/scripts/4347.cs2 new file mode 100644 index 000000000..80c0809c5 --- /dev/null +++ b/dumps/scripts/4347.cs2 @@ -0,0 +1,17 @@ +void script_4347() { + int ivar0; + ivar0 = -1; + if (standart_config_2136 > 0) { + ivar0 = cs2method_3408(105, 103, 3703, standart_config_2136); + if (ivar0 != -1) { + setWidgetIsHidden(true, new WidgetPointer(1097,219)); + cs2method2100(0, 0, new WidgetPointer(1097,224)); + script_4499(ivar0, 1, getCommonDefinitionSize(ivar0), 7, 71893205, 71893215, 71893217, 71893216, 71893222, "Select a keyword"); + } + } else { + setWidgetIsHidden(false, new WidgetPointer(1097,219)); + script_4501(71893205, "Select a keyword"); + script_4501(71893191, "Select a category"); + } + return; +} diff --git a/dumps/scripts/4348.cs2 b/dumps/scripts/4348.cs2 new file mode 100644 index 000000000..1006fe7f5 --- /dev/null +++ b/dumps/scripts/4348.cs2 @@ -0,0 +1,312 @@ +void script_4348() { + int ivar0; + int ivar1; + int ivar2; + int stack_dump0; + ddmmyyyy(3,0,0) structdump_1; + ddmmyyyy(3,0,0) structdump_2; + ddmmyyyy(3,0,0) structdump_3; + ddmmyyyy(3,0,0) structdump_4; + ddmmyyyy(3,0,0) structdump_5; + ddmmyyyy(3,0,0) structdump_6; + ddmmyyyy(3,0,0) structdump_7; + ddmmyyyy(3,0,0) structdump_8; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + script_4501(71958746, "Day"); + script_4501(71958734, "Month"); + script_4501(71958724, "Year"); + script_4501(71958776, "World"); + script_4501(71958671, "Select Event Type"); + script_4501(71958686, "Select Event Place"); + script_4501(71958701, "Select Event Attendees"); + cs2method2100(0, 0, new WidgetPointer(1098,184)); + script_157(71958711, 71958712, 0, 1); + cs2method2100(0, 0, new WidgetPointer(1098,169)); + script_157(71958696, 71958697, 0, 1); + cs2method2100(0, 0, new WidgetPointer(1098,154)); + script_157(71958681, 71958682, 0, 1); + if (((boolean)bitconfig_9140)) { + setWidgetText(new WidgetPointer(1098,41), "All events relative to clan time"); + } else { + setWidgetText(new WidgetPointer(1098,41), "All events relative to game time"); + } + switch (standart_config_2128) { + case 1: + if (bitconfig_9115 > 0) { + stack_dump0 = bitconfig_9115; + structdump_1 = daysSinceReleaseToDMY(stack_dump0); + ivar2 = structdump_1.intpart_2; + ivar1 = structdump_1.intpart_1; + ivar0 = structdump_1.intpart_0; + ivar1 = add(ivar1, 1); + ivar2 = max(11, subtract(ivar2, 2000)); + } + if (ivar0 > 0) { + script_4501(71958746, cs2method_3408(105, 115, 3697, ivar0)); + } + if (ivar1 > 0) { + script_4501(71958734, cs2method_3408(105, 115, 3698, ivar1)); + } + if (ivar2 > 0) { + script_4501(71958724, cs2method_3408(105, 115, 3699, ivar2)); + } + script_4501(71958760, cs2method_3408(105, 115, 3695, bitconfig_9123)); + if (bitconfig_9107 > 0) { + script_4501(71958776, cs2method_3408(105, 115, 3700, bitconfig_9107)); + } + if (bitconfig_9091 > 0) { + script_4501(71958671, cs2method_3408(105, 115, 3687, bitconfig_9091)); + } + if (bitconfig_9099 > 0) { + script_4501(71958686, cs2method_3408(105, 115, 3696, bitconfig_9099)); + } + if (standart_config_2120 >= 0) { + script_4501(71958701, cs2method_3408(105, 115, 3725, standart_config_2120)); + } + script_4358(71958797); + break; + case 2: + if (bitconfig_9116 > 0) { + stack_dump0 = bitconfig_9116; + structdump_2 = daysSinceReleaseToDMY(stack_dump0); + ivar2 = structdump_2.intpart_2; + ivar1 = structdump_2.intpart_1; + ivar0 = structdump_2.intpart_0; + ivar1 = add(ivar1, 1); + ivar2 = max(11, subtract(ivar2, 2000)); + } + if (ivar0 > 0) { + script_4501(71958746, cs2method_3408(105, 115, 3697, ivar0)); + } + if (ivar1 > 0) { + script_4501(71958734, cs2method_3408(105, 115, 3698, ivar1)); + } + if (ivar2 > 0) { + script_4501(71958724, cs2method_3408(105, 115, 3699, ivar2)); + } + script_4501(71958760, cs2method_3408(105, 115, 3695, bitconfig_9124)); + if (bitconfig_9108 > 0) { + script_4501(71958776, cs2method_3408(105, 115, 3700, bitconfig_9108)); + } + if (bitconfig_9092 > 0) { + script_4501(71958671, cs2method_3408(105, 115, 3687, bitconfig_9092)); + } + if (bitconfig_9100 > 0) { + script_4501(71958686, cs2method_3408(105, 115, 3696, bitconfig_9100)); + } + if (standart_config_2121 >= 0) { + script_4501(71958701, cs2method_3408(105, 115, 3725, standart_config_2121)); + } + script_4358(71958806); + break; + case 3: + if (bitconfig_9117 > 0) { + stack_dump0 = bitconfig_9117; + structdump_3 = daysSinceReleaseToDMY(stack_dump0); + ivar2 = structdump_3.intpart_2; + ivar1 = structdump_3.intpart_1; + ivar0 = structdump_3.intpart_0; + ivar1 = add(ivar1, 1); + ivar2 = max(11, subtract(ivar2, 2000)); + } + if (ivar0 > 0) { + script_4501(71958746, cs2method_3408(105, 115, 3697, ivar0)); + } + if (ivar1 > 0) { + script_4501(71958734, cs2method_3408(105, 115, 3698, ivar1)); + } + if (ivar2 > 0) { + script_4501(71958724, cs2method_3408(105, 115, 3699, ivar2)); + } + script_4501(71958760, cs2method_3408(105, 115, 3695, bitconfig_9125)); + if (bitconfig_9109 > 0) { + script_4501(71958776, cs2method_3408(105, 115, 3700, bitconfig_9109)); + } + if (bitconfig_9093 > 0) { + script_4501(71958671, cs2method_3408(105, 115, 3687, bitconfig_9093)); + } + if (bitconfig_9101 > 0) { + script_4501(71958686, cs2method_3408(105, 115, 3696, bitconfig_9101)); + } + if (standart_config_2122 >= 0) { + script_4501(71958701, cs2method_3408(105, 115, 3725, standart_config_2122)); + } + script_4358(71958815); + break; + case 4: + if (bitconfig_9118 > 0) { + stack_dump0 = bitconfig_9118; + structdump_4 = daysSinceReleaseToDMY(stack_dump0); + ivar2 = structdump_4.intpart_2; + ivar1 = structdump_4.intpart_1; + ivar0 = structdump_4.intpart_0; + ivar1 = add(ivar1, 1); + ivar2 = max(11, subtract(ivar2, 2000)); + } + if (ivar0 > 0) { + script_4501(71958746, cs2method_3408(105, 115, 3697, ivar0)); + } + if (ivar1 > 0) { + script_4501(71958734, cs2method_3408(105, 115, 3698, ivar1)); + } + if (ivar2 > 0) { + script_4501(71958724, cs2method_3408(105, 115, 3699, ivar2)); + } + script_4501(71958760, cs2method_3408(105, 115, 3695, bitconfig_9126)); + if (bitconfig_9110 > 0) { + script_4501(71958776, cs2method_3408(105, 115, 3700, bitconfig_9110)); + } + if (bitconfig_9094 > 0) { + script_4501(71958671, cs2method_3408(105, 115, 3687, bitconfig_9094)); + } + if (bitconfig_9102 > 0) { + script_4501(71958686, cs2method_3408(105, 115, 3696, bitconfig_9102)); + } + if (standart_config_2123 >= 0) { + script_4501(71958701, cs2method_3408(105, 115, 3725, standart_config_2123)); + } + script_4358(71958824); + break; + case 5: + if (bitconfig_9119 > 0) { + stack_dump0 = bitconfig_9119; + structdump_5 = daysSinceReleaseToDMY(stack_dump0); + ivar2 = structdump_5.intpart_2; + ivar1 = structdump_5.intpart_1; + ivar0 = structdump_5.intpart_0; + ivar1 = add(ivar1, 1); + ivar2 = max(11, subtract(ivar2, 2000)); + } + if (ivar0 > 0) { + script_4501(71958746, cs2method_3408(105, 115, 3697, ivar0)); + } + if (ivar1 > 0) { + script_4501(71958734, cs2method_3408(105, 115, 3698, ivar1)); + } + if (ivar2 > 0) { + script_4501(71958724, cs2method_3408(105, 115, 3699, ivar2)); + } + script_4501(71958760, cs2method_3408(105, 115, 3695, bitconfig_9127)); + if (bitconfig_9111 > 0) { + script_4501(71958776, cs2method_3408(105, 115, 3700, bitconfig_9111)); + } + if (bitconfig_9095 > 0) { + script_4501(71958671, cs2method_3408(105, 115, 3687, bitconfig_9095)); + } + if (bitconfig_9103 > 0) { + script_4501(71958686, cs2method_3408(105, 115, 3696, bitconfig_9103)); + } + if (standart_config_2124 >= 0) { + script_4501(71958701, cs2method_3408(105, 115, 3725, standart_config_2124)); + } + script_4358(71958833); + break; + case 6: + if (bitconfig_9120 > 0) { + stack_dump0 = bitconfig_9120; + structdump_6 = daysSinceReleaseToDMY(stack_dump0); + ivar2 = structdump_6.intpart_2; + ivar1 = structdump_6.intpart_1; + ivar0 = structdump_6.intpart_0; + ivar1 = add(ivar1, 1); + ivar2 = max(11, subtract(ivar2, 2000)); + } + if (ivar0 > 0) { + script_4501(71958746, cs2method_3408(105, 115, 3697, ivar0)); + } + if (ivar1 > 0) { + script_4501(71958734, cs2method_3408(105, 115, 3698, ivar1)); + } + if (ivar2 > 0) { + script_4501(71958724, cs2method_3408(105, 115, 3699, ivar2)); + } + script_4501(71958760, cs2method_3408(105, 115, 3695, bitconfig_9128)); + if (bitconfig_9112 > 0) { + script_4501(71958776, cs2method_3408(105, 115, 3700, bitconfig_9112)); + } + if (bitconfig_9096 > 0) { + script_4501(71958671, cs2method_3408(105, 115, 3687, bitconfig_9096)); + } + if (bitconfig_9104 > 0) { + script_4501(71958686, cs2method_3408(105, 115, 3696, bitconfig_9104)); + } + if (standart_config_2125 >= 0) { + script_4501(71958701, cs2method_3408(105, 115, 3725, standart_config_2125)); + } + script_4358(71958842); + break; + case 7: + if (bitconfig_9121 > 0) { + stack_dump0 = bitconfig_9121; + structdump_7 = daysSinceReleaseToDMY(stack_dump0); + ivar2 = structdump_7.intpart_2; + ivar1 = structdump_7.intpart_1; + ivar0 = structdump_7.intpart_0; + ivar1 = add(ivar1, 1); + ivar2 = max(11, subtract(ivar2, 2000)); + } + if (ivar0 > 0) { + script_4501(71958746, cs2method_3408(105, 115, 3697, ivar0)); + } + if (ivar1 > 0) { + script_4501(71958734, cs2method_3408(105, 115, 3698, ivar1)); + } + if (ivar2 > 0) { + script_4501(71958724, cs2method_3408(105, 115, 3699, ivar2)); + } + script_4501(71958760, cs2method_3408(105, 115, 3695, bitconfig_9129)); + if (bitconfig_9113 > 0) { + script_4501(71958776, cs2method_3408(105, 115, 3700, bitconfig_9113)); + } + if (bitconfig_9097 > 0) { + script_4501(71958671, cs2method_3408(105, 115, 3687, bitconfig_9097)); + } + if (bitconfig_9105 > 0) { + script_4501(71958686, cs2method_3408(105, 115, 3696, bitconfig_9105)); + } + if (standart_config_2126 >= 0) { + script_4501(71958701, cs2method_3408(105, 115, 3725, standart_config_2126)); + } + script_4358(71958851); + break; + case 8: + if (bitconfig_9122 > 0) { + stack_dump0 = bitconfig_9122; + structdump_8 = daysSinceReleaseToDMY(stack_dump0); + ivar2 = structdump_8.intpart_2; + ivar1 = structdump_8.intpart_1; + ivar0 = structdump_8.intpart_0; + ivar1 = add(ivar1, 1); + ivar2 = max(11, subtract(ivar2, 2000)); + } + if (ivar0 > 0) { + script_4501(71958746, cs2method_3408(105, 115, 3697, ivar0)); + } + if (ivar1 > 0) { + script_4501(71958734, cs2method_3408(105, 115, 3698, ivar1)); + } + if (ivar2 > 0) { + script_4501(71958724, cs2method_3408(105, 115, 3699, ivar2)); + } + script_4501(71958760, cs2method_3408(105, 115, 3695, bitconfig_9130)); + if (bitconfig_9114 > 0) { + script_4501(71958776, cs2method_3408(105, 115, 3700, bitconfig_9114)); + } + if (bitconfig_9098 > 0) { + script_4501(71958671, cs2method_3408(105, 115, 3687, bitconfig_9098)); + } + if (bitconfig_9106 > 0) { + script_4501(71958686, cs2method_3408(105, 115, 3696, bitconfig_9106)); + } + if (standart_config_2127 >= 0) { + script_4501(71958701, cs2method_3408(105, 115, 3725, standart_config_2127)); + } + script_4358(71958860); + } + script_4353(71958575); + script_4356(71958577); + script_4350(); + return; +} diff --git a/dumps/scripts/4349.cs2 b/dumps/scripts/4349.cs2 new file mode 100644 index 000000000..9f579d7a8 --- /dev/null +++ b/dumps/scripts/4349.cs2 @@ -0,0 +1,4 @@ +void script_4349() { + script_4350(); + return; +} diff --git a/dumps/scripts/435.cs2 b/dumps/scripts/435.cs2 new file mode 100644 index 000000000..96aa8aab5 --- /dev/null +++ b/dumps/scripts/435.cs2 @@ -0,0 +1,4 @@ +void script_435() { + script_304(41111302); + return; +} diff --git a/dumps/scripts/4350.cs2 b/dumps/scripts/4350.cs2 new file mode 100644 index 000000000..c72caf8e9 --- /dev/null +++ b/dumps/scripts/4350.cs2 @@ -0,0 +1,67 @@ +void script_4350() { + int ivar0; + int ivar1; + ivar0 = -1; + ivar1 = 0; + switch (standart_config_2128) { + case 1: + ivar1 = bitconfig_9091; + break; + case 2: + ivar1 = bitconfig_9092; + break; + case 3: + ivar1 = bitconfig_9093; + break; + case 4: + ivar1 = bitconfig_9094; + break; + case 5: + ivar1 = bitconfig_9095; + break; + case 6: + ivar1 = bitconfig_9096; + break; + case 7: + ivar1 = bitconfig_9097; + break; + case 8: + ivar1 = bitconfig_9098; + } + if (ivar1 > 0) { + ivar0 = cs2method_3408(105, 103, 3689, ivar1); + if (ivar0 != -1) { + setWidgetIsHidden(true, new WidgetPointer(1098,135)); + cs2method2100(0, 0, new WidgetPointer(1098,140)); + switch (standart_config_2128) { + case 1: + script_4499(ivar0, 1, getCommonDefinitionSize(ivar0), 4, 71958657, 71958667, 71958669, 71958668, 71958791, cs2method_3408(105, 115, ivar0, bitconfig_9131)); + break; + case 2: + script_4499(ivar0, 1, getCommonDefinitionSize(ivar0), 4, 71958657, 71958667, 71958669, 71958668, 71958791, cs2method_3408(105, 115, ivar0, bitconfig_9132)); + break; + case 3: + script_4499(ivar0, 1, getCommonDefinitionSize(ivar0), 4, 71958657, 71958667, 71958669, 71958668, 71958791, cs2method_3408(105, 115, ivar0, bitconfig_9133)); + break; + case 4: + script_4499(ivar0, 1, getCommonDefinitionSize(ivar0), 4, 71958657, 71958667, 71958669, 71958668, 71958791, cs2method_3408(105, 115, ivar0, bitconfig_9134)); + break; + case 5: + script_4499(ivar0, 1, getCommonDefinitionSize(ivar0), 4, 71958657, 71958667, 71958669, 71958668, 71958791, cs2method_3408(105, 115, ivar0, bitconfig_9135)); + break; + case 6: + script_4499(ivar0, 1, getCommonDefinitionSize(ivar0), 4, 71958657, 71958667, 71958669, 71958668, 71958791, cs2method_3408(105, 115, ivar0, bitconfig_9136)); + break; + case 7: + script_4499(ivar0, 1, getCommonDefinitionSize(ivar0), 4, 71958657, 71958667, 71958669, 71958668, 71958791, cs2method_3408(105, 115, ivar0, bitconfig_9137)); + break; + case 8: + script_4499(ivar0, 1, getCommonDefinitionSize(ivar0), 4, 71958657, 71958667, 71958669, 71958668, 71958791, cs2method_3408(105, 115, ivar0, bitconfig_9138)); + } + return; + } + } + script_4501(71958657, "Select a sub-type"); + setWidgetIsHidden(false, new WidgetPointer(1098,135)); + return; +} diff --git a/dumps/scripts/4351.cs2 b/dumps/scripts/4351.cs2 new file mode 100644 index 000000000..20c5d358a --- /dev/null +++ b/dumps/scripts/4351.cs2 @@ -0,0 +1,9 @@ +void script_4351(int arg0) { + if (bitconfig_9139 == standart_config_2128) { + bitconfig_9139 = 0; + } else { + bitconfig_9139 = standart_config_2128; + } + script_4353(arg0); + return; +} diff --git a/dumps/scripts/4352.cs2 b/dumps/scripts/4352.cs2 new file mode 100644 index 000000000..29c029761 --- /dev/null +++ b/dumps/scripts/4352.cs2 @@ -0,0 +1,4 @@ +void script_4352(int arg0) { + script_4353(arg0); + return; +} diff --git a/dumps/scripts/4353.cs2 b/dumps/scripts/4353.cs2 new file mode 100644 index 000000000..352e923a9 --- /dev/null +++ b/dumps/scripts/4353.cs2 @@ -0,0 +1,8 @@ +void script_4353(int arg0) { + if (bitconfig_9139 == standart_config_2128) { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4354.cs2 b/dumps/scripts/4354.cs2 new file mode 100644 index 000000000..dff4c3e75 --- /dev/null +++ b/dumps/scripts/4354.cs2 @@ -0,0 +1,61 @@ +void script_4354(int arg0) { + switch (standart_config_2128) { + case 1: + if (((boolean)bitconfig_9141)) { + bitconfig_9141 = 1; + } else { + bitconfig_9141 = 0; + } + break; + case 2: + if (((boolean)bitconfig_9142)) { + bitconfig_9142 = 1; + } else { + bitconfig_9142 = 0; + } + break; + case 3: + if (((boolean)bitconfig_9143)) { + bitconfig_9143 = 1; + } else { + bitconfig_9143 = 0; + } + break; + case 4: + if (((boolean)bitconfig_9144)) { + bitconfig_9144 = 1; + } else { + bitconfig_9144 = 0; + } + break; + case 5: + if (((boolean)bitconfig_9145)) { + bitconfig_9145 = 1; + } else { + bitconfig_9145 = 0; + } + break; + case 6: + if (((boolean)bitconfig_9146)) { + bitconfig_9146 = 1; + } else { + bitconfig_9146 = 0; + } + break; + case 7: + if (((boolean)bitconfig_9147)) { + bitconfig_9147 = 1; + } else { + bitconfig_9147 = 0; + } + break; + case 8: + if (((boolean)bitconfig_9148)) { + bitconfig_9148 = 1; + } else { + bitconfig_9148 = 0; + } + } + script_4356(arg0); + return; +} diff --git a/dumps/scripts/4355.cs2 b/dumps/scripts/4355.cs2 new file mode 100644 index 000000000..b01b7303d --- /dev/null +++ b/dumps/scripts/4355.cs2 @@ -0,0 +1,4 @@ +void script_4355(int arg0) { + script_4356(arg0); + return; +} diff --git a/dumps/scripts/4356.cs2 b/dumps/scripts/4356.cs2 new file mode 100644 index 000000000..026d57000 --- /dev/null +++ b/dumps/scripts/4356.cs2 @@ -0,0 +1,60 @@ +void script_4356(int arg0) { + switch (standart_config_2128) { + case 1: + if (((boolean)bitconfig_9141)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 2: + if (((boolean)bitconfig_9142)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 3: + if (((boolean)bitconfig_9143)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 4: + if (((boolean)bitconfig_9144)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 5: + if (((boolean)bitconfig_9145)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 6: + if (((boolean)bitconfig_9146)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 7: + if (((boolean)bitconfig_9147)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 8: + if (((boolean)bitconfig_9148)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/4357.cs2 b/dumps/scripts/4357.cs2 new file mode 100644 index 000000000..4a6dc6895 --- /dev/null +++ b/dumps/scripts/4357.cs2 @@ -0,0 +1,4 @@ +void script_4357(int arg0) { + script_4358(arg0); + return; +} diff --git a/dumps/scripts/4358.cs2 b/dumps/scripts/4358.cs2 new file mode 100644 index 000000000..11e0d7dd1 --- /dev/null +++ b/dumps/scripts/4358.cs2 @@ -0,0 +1,36 @@ +void script_4358(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(1098,268)); + setWidgetIsHidden(true, new WidgetPointer(1098,277)); + setWidgetIsHidden(true, new WidgetPointer(1098,286)); + setWidgetIsHidden(true, new WidgetPointer(1098,295)); + setWidgetIsHidden(true, new WidgetPointer(1098,304)); + setWidgetIsHidden(true, new WidgetPointer(1098,313)); + setWidgetIsHidden(true, new WidgetPointer(1098,322)); + setWidgetIsHidden(true, new WidgetPointer(1098,331)); + switch (arg0) { + case 71958797: + setWidgetIsHidden(false, new WidgetPointer(1098,268)); + break; + case 71958806: + setWidgetIsHidden(false, new WidgetPointer(1098,277)); + break; + case 71958815: + setWidgetIsHidden(false, new WidgetPointer(1098,286)); + break; + case 71958824: + setWidgetIsHidden(false, new WidgetPointer(1098,295)); + break; + case 71958833: + setWidgetIsHidden(false, new WidgetPointer(1098,304)); + break; + case 71958842: + setWidgetIsHidden(false, new WidgetPointer(1098,313)); + break; + case 71958851: + setWidgetIsHidden(false, new WidgetPointer(1098,322)); + break; + case 71958860: + setWidgetIsHidden(false, new WidgetPointer(1098,331)); + } + return; +} diff --git a/dumps/scripts/4359.cs2 b/dumps/scripts/4359.cs2 new file mode 100644 index 000000000..e445f984b --- /dev/null +++ b/dumps/scripts/4359.cs2 @@ -0,0 +1,8 @@ +void script_4359(int arg0) { + if (cs2method3700()) { + script_4361(arg0); + } else { + setScriptCallOnClanChatSettingsStuff(4360, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/436.cs2 b/dumps/scripts/436.cs2 new file mode 100644 index 000000000..eaa09cdf7 --- /dev/null +++ b/dumps/scripts/436.cs2 @@ -0,0 +1,10 @@ +void script_436(int arg0) { + if (arg0 == 67239958) { + setWidgetSprite(1135, new WidgetPointer(1026,21)); + setWidgetSprite(1134, new WidgetPointer(1026,23)); + } else { + setWidgetSprite(1134, new WidgetPointer(1026,21)); + setWidgetSprite(1135, new WidgetPointer(1026,23)); + } + return; +} diff --git a/dumps/scripts/4360.cs2 b/dumps/scripts/4360.cs2 new file mode 100644 index 000000000..556fe8a12 --- /dev/null +++ b/dumps/scripts/4360.cs2 @@ -0,0 +1,6 @@ +void script_4360(int arg0) { + if (cs2method3700()) { + script_4361(arg0); + } + return; +} diff --git a/dumps/scripts/4361.cs2 b/dumps/scripts/4361.cs2 new file mode 100644 index 000000000..72ed5db16 --- /dev/null +++ b/dumps/scripts/4361.cs2 @@ -0,0 +1,15 @@ +void script_4361(int arg0) { + script_4332(72024111, 72024121); + script_4334(72024131, 72024132); + script_4336(72024078); + script_4362(1, 72024162, 72024070, 72024071, clanbitconfig_98, clanbitconfig_106, clanbitconfig_74, clanbitconfig_114, clanbitconfig_82, clanbitconfig_90, clanconfig_65, clanbitconfig_132, clanlongconfig_122); + script_4362(2, 72024188, 72024189, 72024190, clanbitconfig_99, clanbitconfig_107, clanbitconfig_75, clanbitconfig_115, clanbitconfig_83, clanbitconfig_91, clanconfig_66, clanbitconfig_133, clanlongconfig_123); + script_4362(3, 72024191, 72024192, 72024193, clanbitconfig_100, clanbitconfig_108, clanbitconfig_76, clanbitconfig_116, clanbitconfig_84, clanbitconfig_92, clanconfig_67, clanbitconfig_134, clanlongconfig_124); + script_4362(4, 72024194, 72024195, 72024196, clanbitconfig_101, clanbitconfig_109, clanbitconfig_77, clanbitconfig_117, clanbitconfig_85, clanbitconfig_93, clanconfig_68, clanbitconfig_135, clanlongconfig_125); + script_4362(5, 72024197, 72024198, 72024199, clanbitconfig_102, clanbitconfig_110, clanbitconfig_78, clanbitconfig_118, clanbitconfig_86, clanbitconfig_94, clanconfig_69, clanbitconfig_136, clanlongconfig_126); + script_4362(6, 72024200, 72024201, 72024202, clanbitconfig_103, clanbitconfig_111, clanbitconfig_79, clanbitconfig_119, clanbitconfig_87, clanbitconfig_95, clanconfig_70, clanbitconfig_137, clanlongconfig_127); + script_4362(7, 72024203, 72024204, 72024205, clanbitconfig_104, clanbitconfig_112, clanbitconfig_80, clanbitconfig_120, clanbitconfig_88, clanbitconfig_96, clanconfig_71, clanbitconfig_138, clanlongconfig_128); + script_4362(8, 72024206, 72024207, 72024208, clanbitconfig_105, clanbitconfig_113, clanbitconfig_81, clanbitconfig_121, clanbitconfig_89, clanbitconfig_97, clanconfig_72, clanbitconfig_139, clanlongconfig_129); + setWidgetIsHidden(true, new WidgetPointer(1099,13)); + return; +} diff --git a/dumps/scripts/4362.cs2 b/dumps/scripts/4362.cs2 new file mode 100644 index 000000000..3b8ab379d --- /dev/null +++ b/dumps/scripts/4362.cs2 @@ -0,0 +1,27 @@ +void script_4362(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,long arg12) { + int ivar12; + string svar0; + if ((((boolean)arg9) || ((boolean)arg8)) || ((boolean)arg6)) { + setWidgetSprite(5936, new WidgetPointer(arg2)); + return; + } + ivar12 = cs2method_3408(105, 103, 3689, arg6); + svar0 = timeToStr(arg4) + " at " + cs2method_3408(105, 115, 3695, arg5); + if (((boolean)clanbitconfig_5)) { + svar0 = svar0 + " Game Time"; + } else { + svar0 = svar0 + " Clan Local Time"; + } + svar0 = svar0 + "
" + "
" + "World " + intToStr(arg9) + " at " + "
" + cs2method_3408(105, 115, 3696, arg8) + "
" + "
" + cs2method_3408(105, 115, 3687, arg6); + if ((ivar12 != -1) && (arg7 > 0)) { + svar0 = svar0 + "
" + cs2method_3408(105, 115, ivar12, arg7); + } + svar0 = svar0 + "
" + "
" + "Open to " + cs2method_3408(105, 115, 3716, arg10); + if (((boolean)arg11)) { + svar0 = svar0 + "
" + "Attendance is mandatory"; + } + setScriptCallOnClickContextMenu(4363, arg0, svar0, arg12, new WidgetPointer(arg2), arg4, arg5, arg9, arg8, arg6, "is\u00a7Iiiiii", new WidgetPointer(arg1)); + setWidgetSprite(cs2method_3408(105, 100, 3688, arg6), new WidgetPointer(arg3)); + setWidgetSprite(5932, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/4363.cs2 b/dumps/scripts/4363.cs2 new file mode 100644 index 000000000..8bfea8f67 --- /dev/null +++ b/dumps/scripts/4363.cs2 @@ -0,0 +1,54 @@ +void script_4363(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,string arg7,long arg8) { + setWidgetText(new WidgetPointer(1099,109), arg7); + setWidgetSprite(5933, new WidgetPointer(arg1)); + if (arg8 != -1L) { + setScriptCallOnClickContextMenu(4330, arg8, "\u00a7", new WidgetPointer(1099,165)); + setWidgetIsHidden(true, new WidgetPointer(1099,168)); + } else { + setWidgetNoOptions(new WidgetPointer(1099,165)); + setWidgetIsHidden(false, new WidgetPointer(1099,168)); + } + if (cs2method3700()) { + if (((script_4616(arg2, arg3) > 0) && (arg4 > 0)) && ((arg5 > 0) && (arg6 > 0))) { + setWidgetIsHidden(false, new WidgetPointer(1099,110)); + } + script_4621(72024064); + } else { + setWidgetIsHidden(true, new WidgetPointer(1099,110)); + } + standart_config_2128 = arg0; + switch (arg0) { + case 1: + setWidgetSprite(5935, new WidgetPointer(1099,6)); + break; + case 2: + setWidgetSprite(5935, new WidgetPointer(1099,125)); + break; + case 3: + setWidgetSprite(5935, new WidgetPointer(1099,128)); + break; + case 4: + setWidgetSprite(5935, new WidgetPointer(1099,131)); + break; + case 5: + setWidgetSprite(5935, new WidgetPointer(1099,134)); + break; + case 6: + setWidgetSprite(5935, new WidgetPointer(1099,137)); + break; + case 7: + setWidgetSprite(5935, new WidgetPointer(1099,140)); + break; + case 8: + setWidgetSprite(5935, new WidgetPointer(1099,143)); + } + script_4624(72024070, 1); + script_4624(72024189, 2); + script_4624(72024192, 3); + script_4624(72024195, 4); + script_4624(72024198, 5); + script_4624(72024201, 6); + script_4624(72024204, 7); + script_4624(72024207, 8); + return; +} diff --git a/dumps/scripts/4364.cs2 b/dumps/scripts/4364.cs2 new file mode 100644 index 000000000..1d83e50e6 --- /dev/null +++ b/dumps/scripts/4364.cs2 @@ -0,0 +1,4 @@ +void script_4364() { + script_304(48146389); + return; +} diff --git a/dumps/scripts/4365.cs2 b/dumps/scripts/4365.cs2 new file mode 100644 index 000000000..2eec5ecc9 --- /dev/null +++ b/dumps/scripts/4365.cs2 @@ -0,0 +1,5 @@ +void script_4365(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(1099,109), ""); + return; +} diff --git a/dumps/scripts/4366.cs2 b/dumps/scripts/4366.cs2 new file mode 100644 index 000000000..3278fcc56 --- /dev/null +++ b/dumps/scripts/4366.cs2 @@ -0,0 +1,4 @@ +void script_4366() { + script_4367(); + return; +} diff --git a/dumps/scripts/4367.cs2 b/dumps/scripts/4367.cs2 new file mode 100644 index 000000000..74af767d0 --- /dev/null +++ b/dumps/scripts/4367.cs2 @@ -0,0 +1,12 @@ +void script_4367() { + string svar0; + svar0 = replaceLtGt(cs2method5432()); + if (strLength(svar0) <= 13) { + globalstring_346 = svar0; + globalint_1498 = strLength(globalstring_346); + globalint_1498 = script_1552(globalint_1498, 5631, 72089638, -1, globalstring_346); + setWidgetPosition(globalint_1498, getWidgetActualY(new WidgetPointer(1100,39)), 0, 0, new WidgetPointer(1100,39)); + setWidgetText(new WidgetPointer(1100,38), globalstring_346); + } + return; +} diff --git a/dumps/scripts/4368.cs2 b/dumps/scripts/4368.cs2 new file mode 100644 index 000000000..66f58c61b --- /dev/null +++ b/dumps/scripts/4368.cs2 @@ -0,0 +1,6 @@ +void script_4368(int arg0,int arg1) { + setScriptCallOnKeyPress(4369, new WidgetPointer(arg0), false, -2147483640, new WidgetPointer(arg1), "IziI", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(4370, new WidgetPointer(arg0), new WidgetPointer(arg1), -2147483647, "IIi", new WidgetPointer(arg0)); + setScriptCallOnGameloop(1400, getClientCycle(), new WidgetPointer(arg1), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4369.cs2 b/dumps/scripts/4369.cs2 new file mode 100644 index 000000000..825460b35 --- /dev/null +++ b/dumps/scripts/4369.cs2 @@ -0,0 +1,36 @@ +void script_4369(int arg0,int arg1,int arg2,int arg3) { + globalstring_346 = getWidgetText(new WidgetPointer(arg0)); + switch (arg2) { + case 84: + script_4372(1); + break; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + if (isHoldingCtrl()) { + return; + } + script_1553(arg2, globalint_1498, globalstring_346); + break; + case 85: + if (strLength(globalstring_346) > 0) { + globalstring_346 = substr(0, subtract(strLength(globalstring_346), 1), globalstring_346); + } + break; + default: + if ((arg2 == 67) && isHoldingShift()) { + script_4367(); + return; + } + if (strLength(globalstring_346) < 13) { + globalstring_346 = script_74(0, arg2, arg1, globalstring_346); + } + } + globalint_1498 = script_1552(globalint_1498, 5631, arg0, -1, globalstring_346); + setWidgetPosition(globalint_1498, getWidgetActualY(new WidgetPointer(arg3)), 0, 0, new WidgetPointer(arg3)); + setWidgetText(new WidgetPointer(arg0), globalstring_346); + return; +} diff --git a/dumps/scripts/437.cs2 b/dumps/scripts/437.cs2 new file mode 100644 index 000000000..ebaa472c2 --- /dev/null +++ b/dumps/scripts/437.cs2 @@ -0,0 +1,28 @@ +void script_437() { + setWidgetSprite(1134, new WidgetPointer(1022,42)); + setWidgetSprite(1134, new WidgetPointer(1022,43)); + setWidgetSprite(1134, new WidgetPointer(1022,44)); + setWidgetSprite(1134, new WidgetPointer(1022,45)); + setWidgetSprite(1134, new WidgetPointer(1022,46)); + setWidgetSprite(1134, new WidgetPointer(1022,47)); + switch (bitconfig_8087) { + case 0: + setWidgetSprite(1135, new WidgetPointer(1022,42)); + break; + case 1: + setWidgetSprite(1135, new WidgetPointer(1022,43)); + break; + case 2: + setWidgetSprite(1135, new WidgetPointer(1022,44)); + break; + case 3: + setWidgetSprite(1135, new WidgetPointer(1022,45)); + break; + case 4: + setWidgetSprite(1135, new WidgetPointer(1022,46)); + break; + case 5: + setWidgetSprite(1135, new WidgetPointer(1022,47)); + } + return; +} diff --git a/dumps/scripts/4370.cs2 b/dumps/scripts/4370.cs2 new file mode 100644 index 000000000..c5afebe0c --- /dev/null +++ b/dumps/scripts/4370.cs2 @@ -0,0 +1,6 @@ +void script_4370(int arg0,int arg1,int arg2) { + globalstring_346 = getWidgetText(new WidgetPointer(arg0)); + globalint_1498 = script_1552(globalint_1498, 5631, arg0, -1, globalstring_346); + setWidgetPosition(globalint_1498, 5, 0, 0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/4371.cs2 b/dumps/scripts/4371.cs2 new file mode 100644 index 000000000..fb3616df2 --- /dev/null +++ b/dumps/scripts/4371.cs2 @@ -0,0 +1,4 @@ +void script_4371(int arg0) { + script_4372(arg0); + return; +} diff --git a/dumps/scripts/4372.cs2 b/dumps/scripts/4372.cs2 new file mode 100644 index 000000000..3ff2e539e --- /dev/null +++ b/dumps/scripts/4372.cs2 @@ -0,0 +1,8 @@ +void script_4372(int arg0) { + if (((boolean)arg0)) { + sendUnknownPacketMethod3117(globalstring_346); + } else { + sendUnknownPacketMethod3117(""); + } + return; +} diff --git a/dumps/scripts/4373.cs2 b/dumps/scripts/4373.cs2 new file mode 100644 index 000000000..aa24af0f6 --- /dev/null +++ b/dumps/scripts/4373.cs2 @@ -0,0 +1,4 @@ +void script_4373() { + script_4374(); + return; +} diff --git a/dumps/scripts/4374.cs2 b/dumps/scripts/4374.cs2 new file mode 100644 index 000000000..86bee37fd --- /dev/null +++ b/dumps/scripts/4374.cs2 @@ -0,0 +1,5 @@ +void script_4374() { + setWidgetIsHidden(false, new WidgetPointer(1101,53)); + setWidgetIsHidden(false, new WidgetPointer(1101,32)); + return; +} diff --git a/dumps/scripts/4375.cs2 b/dumps/scripts/4375.cs2 new file mode 100644 index 000000000..bac3b9118 --- /dev/null +++ b/dumps/scripts/4375.cs2 @@ -0,0 +1,4 @@ +void script_4375() { + script_4376(); + return; +} diff --git a/dumps/scripts/4376.cs2 b/dumps/scripts/4376.cs2 new file mode 100644 index 000000000..7e82a87e3 --- /dev/null +++ b/dumps/scripts/4376.cs2 @@ -0,0 +1,5 @@ +void script_4376() { + setWidgetIsHidden(true, new WidgetPointer(1101,53)); + setWidgetIsHidden(true, new WidgetPointer(1101,32)); + return; +} diff --git a/dumps/scripts/4377.cs2 b/dumps/scripts/4377.cs2 new file mode 100644 index 000000000..547f3101c --- /dev/null +++ b/dumps/scripts/4377.cs2 @@ -0,0 +1,37 @@ +void script_4377() { + int ivar0; + int ivar1; + int ivar2; + if (standart_config_2134 == globalint_1499) { + setWidgetText(new WidgetPointer(1101,82), "You have voted."); + } else { + setWidgetText(new WidgetPointer(1101,82), "You have not yet voted." + "
" + "How would you like to vote?"); + } + if (((boolean)bitconfig_9151)) { + setWidgetText(new WidgetPointer(1101,12), "Results of last vote:"); + } else if (((boolean)bitconfig_9154) || ((boolean)bitconfig_9154)) { + setWidgetText(new WidgetPointer(1101,12), "Vote open for less than a minute."); + } else { + setWidgetText(new WidgetPointer(1101,12), "Vote open for less than " + intToStr(bitconfig_9154) + " minutes."); + } + ivar0 = add(bitconfig_9149, bitconfig_9150); + ivar1 = 0; + ivar2 = 0; + if (ivar0 > 0) { + if (ivar0 == bitconfig_9149) { + ivar1 = 100; + } else if (ivar0 == bitconfig_9150) { + ivar2 = 100; + } else if (((boolean)bitconfig_9150)) { + ivar2 = 0; + } else { + ivar2 = subtract(100, ivar1); + } + ivar1 = divide(multiply(100, bitconfig_9149), ivar0); + } + setWidgetText(new WidgetPointer(1101,7), intToStr(bitconfig_9149)); + setWidgetText(new WidgetPointer(1101,8), intToStr(bitconfig_9150)); + script_4542(ivar1, 72155195, 72155200); + script_4542(ivar2, 72155205, 72155210); + return; +} diff --git a/dumps/scripts/4378.cs2 b/dumps/scripts/4378.cs2 new file mode 100644 index 000000000..52c49084b --- /dev/null +++ b/dumps/scripts/4378.cs2 @@ -0,0 +1,6 @@ +void script_4378(int arg0,int arg1,int arg2) { + setScriptCallOnKeyPress(4379, new WidgetPointer(arg0), new WidgetPointer(arg1), false, -2147483640, new WidgetPointer(arg2), "IIziI", new WidgetPointer(arg0)); + setScriptCallOnMousePressed(4380, new WidgetPointer(arg0), new WidgetPointer(arg2), -2147483647, "IIi", new WidgetPointer(arg0)); + setScriptCallOnGameloop(1400, getClientCycle(), new WidgetPointer(arg2), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4379.cs2 b/dumps/scripts/4379.cs2 new file mode 100644 index 000000000..f56d69b27 --- /dev/null +++ b/dumps/scripts/4379.cs2 @@ -0,0 +1,38 @@ +void script_4379(int arg0,int arg1,int arg2,int arg3,int arg4) { + globalstring_345 = getWidgetText(new WidgetPointer(arg0)); + switch (arg3) { + case 84: + script_4382(); + break; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + if (isHoldingCtrl()) { + return; + } + script_1553(arg3, globalint_1496, globalstring_345); + break; + case 85: + if (strLength(globalstring_345) > 0) { + globalstring_345 = substr(0, subtract(strLength(globalstring_345), 1), globalstring_345); + } + break; + default: + if (strLength(globalstring_345) < 80) { + globalstring_345 = script_74(0, arg3, arg2, globalstring_345); + } + } + globalint_1496 = script_1552(globalint_1496, 5631, arg0, -1, globalstring_345); + setWidgetPosition(globalint_1496, getWidgetActualY(new WidgetPointer(arg4)), 0, 0, new WidgetPointer(arg4)); + setWidgetText(new WidgetPointer(arg1), intToStr(strLength(globalstring_345)) + "/80"); + if (strLength(globalstring_345) >= 70) { + setWidgetRGB(new Color(221, 0, 0), new WidgetPointer(arg1)); + } else { + setWidgetRGB(new Color(31, 29, 25), new WidgetPointer(arg1)); + } + setWidgetText(new WidgetPointer(arg0), globalstring_345); + return; +} diff --git a/dumps/scripts/438.cs2 b/dumps/scripts/438.cs2 new file mode 100644 index 000000000..3da59aca7 --- /dev/null +++ b/dumps/scripts/438.cs2 @@ -0,0 +1,28 @@ +void script_438(int arg0) { + setWidgetSprite(1134, new WidgetPointer(1022,42)); + setWidgetSprite(1134, new WidgetPointer(1022,43)); + setWidgetSprite(1134, new WidgetPointer(1022,44)); + setWidgetSprite(1134, new WidgetPointer(1022,45)); + setWidgetSprite(1134, new WidgetPointer(1022,46)); + setWidgetSprite(1134, new WidgetPointer(1022,47)); + switch (arg0) { + case 66977840: + setWidgetSprite(1135, new WidgetPointer(1022,42)); + break; + case 66977841: + setWidgetSprite(1135, new WidgetPointer(1022,43)); + break; + case 66977842: + setWidgetSprite(1135, new WidgetPointer(1022,44)); + break; + case 66977843: + setWidgetSprite(1135, new WidgetPointer(1022,45)); + break; + case 66977844: + setWidgetSprite(1135, new WidgetPointer(1022,46)); + break; + case 66977845: + setWidgetSprite(1135, new WidgetPointer(1022,47)); + } + return; +} diff --git a/dumps/scripts/4380.cs2 b/dumps/scripts/4380.cs2 new file mode 100644 index 000000000..a0b8e71d1 --- /dev/null +++ b/dumps/scripts/4380.cs2 @@ -0,0 +1,6 @@ +void script_4380(int arg0,int arg1,int arg2) { + globalstring_345 = getWidgetText(new WidgetPointer(arg0)); + globalint_1496 = script_1552(arg2, 5631, arg0, -1, globalstring_345); + setWidgetPosition(globalint_1496, 5, 0, 0, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/4381.cs2 b/dumps/scripts/4381.cs2 new file mode 100644 index 000000000..d7e2eefbc --- /dev/null +++ b/dumps/scripts/4381.cs2 @@ -0,0 +1,4 @@ +void script_4381() { + script_4382(); + return; +} diff --git a/dumps/scripts/4382.cs2 b/dumps/scripts/4382.cs2 new file mode 100644 index 000000000..54c427a50 --- /dev/null +++ b/dumps/scripts/4382.cs2 @@ -0,0 +1,4 @@ +void script_4382() { + sendStringInput(strRemoveEntities(globalstring_345)); + return; +} diff --git a/dumps/scripts/4383.cs2 b/dumps/scripts/4383.cs2 new file mode 100644 index 000000000..471e11000 --- /dev/null +++ b/dumps/scripts/4383.cs2 @@ -0,0 +1,18 @@ +cs2func_script_4383_struct(2,0,0) script_4383(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = cs2method_3408(105, 120, 3685, arg0); + ivar4 = cs2method_3408(105, 120, 3685, arg1); + if (((boolean)arg2) && (((boolean)clanbitconfig_10) || (cs2method3709() < 5))) { + ivar3 = 1080; + ivar4 = 1017; + } else { + if (ivar3 == -1) { + ivar3 = 1080; + } + if (ivar4 == -1) { + ivar4 = 1017; + } + } + return newstruct cs2func_script_4383_struct(ivar3, ivar4); +} diff --git a/dumps/scripts/4384.cs2 b/dumps/scripts/4384.cs2 new file mode 100644 index 000000000..18256844e --- /dev/null +++ b/dumps/scripts/4384.cs2 @@ -0,0 +1,18 @@ +cs2func_script_4384_struct(2,0,0) script_4384(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = cs2method_3408(105, 100, 3686, arg0); + ivar4 = cs2method_3408(105, 100, 3686, arg1); + if (((boolean)arg2) && (((boolean)clanbitconfig_10) || (cs2method3709() < 5))) { + ivar3 = 5723; + ivar4 = 5789; + } else { + if (ivar3 == -1) { + ivar3 = 5723; + } + if (ivar4 == -1) { + ivar4 = 5789; + } + } + return newstruct cs2func_script_4384_struct(ivar3, ivar4); +} diff --git a/dumps/scripts/4385.cs2 b/dumps/scripts/4385.cs2 new file mode 100644 index 000000000..943ce59a5 --- /dev/null +++ b/dumps/scripts/4385.cs2 @@ -0,0 +1,6 @@ +void script_4385() { + setScriptCallOnConfigChange(4390, new WidgetPointer(1105,56), 2093, 2094, 2095, 2096, 2097, 5, "IY", new WidgetPointer(1105,55)); + script_4391(72417336); + script_4392(72417336); + return; +} diff --git a/dumps/scripts/4386.cs2 b/dumps/scripts/4386.cs2 new file mode 100644 index 000000000..82182234f --- /dev/null +++ b/dumps/scripts/4386.cs2 @@ -0,0 +1,4 @@ +void script_4386(int arg0,int arg1,int arg2,int arg3) { + script_4393(arg0, arg1, arg2, arg3, 3686); + return; +} diff --git a/dumps/scripts/4387.cs2 b/dumps/scripts/4387.cs2 new file mode 100644 index 000000000..d9dfebd60 --- /dev/null +++ b/dumps/scripts/4387.cs2 @@ -0,0 +1,4 @@ +void script_4387(int arg0,int arg1,int arg2,int arg3) { + script_4393(arg0, arg1, arg2, arg3, 3686); + return; +} diff --git a/dumps/scripts/4388.cs2 b/dumps/scripts/4388.cs2 new file mode 100644 index 000000000..6a32605aa --- /dev/null +++ b/dumps/scripts/4388.cs2 @@ -0,0 +1,23 @@ +void script_4388(int arg0,int arg1) { + int ivar2; + int ivar3; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_4384_struct(2,0,0) structdump_3; + ivar2 = -1; + ivar3 = -1; + if (cs2method3701()) { + stack_dump0 = bitconfig_9086; + stack_dump1 = bitconfig_9087; + stack_dump2 = 0; + structdump_3 = script_4384(stack_dump0, stack_dump1, stack_dump2); + ivar3 = structdump_3.intpart_1; + ivar2 = structdump_3.intpart_0; + setWidgetSprite(ivar2, new WidgetPointer(arg0)); + setWidgetSprite(ivar3, new WidgetPointer(arg1)); + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2094)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2095)), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/4389.cs2 b/dumps/scripts/4389.cs2 new file mode 100644 index 000000000..b3f5dee0c --- /dev/null +++ b/dumps/scripts/4389.cs2 @@ -0,0 +1,5 @@ +void script_4389(int arg0,int arg1) { + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2096)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2097)), new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/439.cs2 b/dumps/scripts/439.cs2 new file mode 100644 index 000000000..8cb3cdd71 --- /dev/null +++ b/dumps/scripts/439.cs2 @@ -0,0 +1,22 @@ +void script_439(int arg0) { + switch (bitconfig_8087) { + case 0: + setWidgetText(new WidgetPointer(arg0), "0:30"); + break; + case 1: + setWidgetText(new WidgetPointer(arg0), "1:00"); + break; + case 2: + setWidgetText(new WidgetPointer(arg0), "1:30"); + break; + case 3: + setWidgetText(new WidgetPointer(arg0), "2:00"); + break; + case 4: + setWidgetText(new WidgetPointer(arg0), "2:30"); + break; + case 5: + setWidgetText(new WidgetPointer(arg0), "3:00"); + } + return; +} diff --git a/dumps/scripts/4390.cs2 b/dumps/scripts/4390.cs2 new file mode 100644 index 000000000..ad444ed1d --- /dev/null +++ b/dumps/scripts/4390.cs2 @@ -0,0 +1,5 @@ +void script_4390(int arg0) { + script_4391(arg0); + script_4392(arg0); + return; +} diff --git a/dumps/scripts/4391.cs2 b/dumps/scripts/4391.cs2 new file mode 100644 index 000000000..18d4420bb --- /dev/null +++ b/dumps/scripts/4391.cs2 @@ -0,0 +1,21 @@ +void script_4391(int arg0) { + int ivar1; + int ivar2; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_4383_struct(2,0,0) structdump_3; + ivar1 = -1; + ivar2 = -1; + if (cs2method3701()) { + stack_dump0 = bitconfig_9086; + stack_dump1 = bitconfig_9087; + stack_dump2 = 0; + structdump_3 = script_4383(stack_dump0, stack_dump1, stack_dump2); + ivar2 = structdump_3.intpart_1; + ivar1 = structdump_3.intpart_0; + doWidgetType19Task(0, 1024, ivar1, new WidgetPointer(arg0)); + doWidgetType19Task(1, 1057, ivar2, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4392.cs2 b/dumps/scripts/4392.cs2 new file mode 100644 index 000000000..368544ba0 --- /dev/null +++ b/dumps/scripts/4392.cs2 @@ -0,0 +1,15 @@ +void script_4392(int arg0) { + if (standart_config_2094 > 0) { + doWidgetType18Task(0, 31690, standart_config_2094, new WidgetPointer(arg0)); + } + if (standart_config_2095 > 0) { + doWidgetType18Task(1, 60362, standart_config_2095, new WidgetPointer(arg0)); + } + if (standart_config_2096 > 0) { + doWidgetType18Task(3, 55246, standart_config_2096, new WidgetPointer(arg0)); + } + if (standart_config_2097 > 0) { + doWidgetType18Task(4, 17358, standart_config_2097, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4393.cs2 b/dumps/scripts/4393.cs2 new file mode 100644 index 000000000..dc574442c --- /dev/null +++ b/dumps/scripts/4393.cs2 @@ -0,0 +1,52 @@ +void script_4393(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar5 = 0; + ivar6 = 0; + ivar7 = 2; + ivar8 = 5; + ivar9 = 60; + ivar10 = 60; + ivar11 = 0; + ivar12 = 0; + ivar13 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), ivar7), add(ivar7, ivar10)); + ivar14 = 0; + ivar15 = getCommonDefinitionSize(arg4); + while (ivar5 < ivar15) { + ivar11 = multiply(add(ivar10, ivar7), subtract(ivar5, multiply(ivar6, ivar13))); + ivar12 = multiply(ivar6, add(ivar9, ivar8)); + createExtraChild(new WidgetPointer(arg1), 5, ivar5); + setWidgetSize(ivar10, ivar9, 0, 0); + setWidgetPosition(ivar11, ivar12, 0, 0); + setWidgetSprite(5523); + setScriptCallOnConfigChange(4395, ivar15, 2093, 1, "iY"); + setScriptCallOnMouseEntered(4396, -2147483643, new WidgetPointer(arg1), "iI"); + setScriptCallOnMouseExit(4397, -2147483643, new WidgetPointer(arg1), "iI"); + ivar14 = add(add(getWidgetActualY(), getWidgetActualHeight()), ivar8); + createExtraChild(new WidgetPointer(arg0), 5, ivar5); + setWidgetSize(subtract(ivar10, 10), subtract(ivar9, 10), 0, 0); + setWidgetPosition(add(ivar11, 5), add(ivar12, 5), 0, 0); + setWidgetSprite(cs2method_3408(105, 100, arg4, add(ivar5, 1))); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(4394, -2147483643, new WidgetPointer(arg1), ivar15, "iIi"); + ivar5 = add(ivar5, 1); + if (((boolean)mod(ivar5, ivar13))) { + ivar6 = add(ivar6, 1); + } + } + cs2method2100(0, 0, new WidgetPointer(arg2)); + setWidgetScrollMax(0, ivar14, new WidgetPointer(arg2)); + script_31(arg3, arg2, 5666, 5663, 5664, 5665, 5686, 5685); + return; +} diff --git a/dumps/scripts/4394.cs2 b/dumps/scripts/4394.cs2 new file mode 100644 index 000000000..522daf05a --- /dev/null +++ b/dumps/scripts/4394.cs2 @@ -0,0 +1,4 @@ +void script_4394(int arg0,int arg1,int arg2) { + script_4398(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4395.cs2 b/dumps/scripts/4395.cs2 new file mode 100644 index 000000000..3e702c148 --- /dev/null +++ b/dumps/scripts/4395.cs2 @@ -0,0 +1,9 @@ +void script_4395(int arg0) { + if (bitconfig_9086 > 0) { + script_4398(subtract(bitconfig_9086, 1), 72417345, arg0); + } + if (bitconfig_9087 > 0) { + script_4398(subtract(bitconfig_9087, 1), 72417342, arg0); + } + return; +} diff --git a/dumps/scripts/4396.cs2 b/dumps/scripts/4396.cs2 new file mode 100644 index 000000000..db1c389ca --- /dev/null +++ b/dumps/scripts/4396.cs2 @@ -0,0 +1,6 @@ +void script_4396(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + setWidgetSprite(5524); + } + return; +} diff --git a/dumps/scripts/4397.cs2 b/dumps/scripts/4397.cs2 new file mode 100644 index 000000000..6fa10e4c1 --- /dev/null +++ b/dumps/scripts/4397.cs2 @@ -0,0 +1,24 @@ +void script_4397(int arg0,int arg1) { + flow_0: + IF (setWidgetRegister(new WidgetPointer(arg1), arg0)) + GOTO flow_1 + GOTO flow_7 + flow_1: + IF (arg1 == 72417345) + GOTO flow_2 + GOTO flow_3 + flow_2: + IF (subtract(bitconfig_9086, 1) == arg0) + GOTO flow_5 + flow_3: + IF ((arg1 == 72417342) && (subtract(bitconfig_9087, 1) == arg0)) + GOTO flow_5 + GOTO flow_6 + flow_5: + setWidgetSprite(5526); + GOTO flow_7 + flow_6: + setWidgetSprite(5523); + flow_7: + return; +} diff --git a/dumps/scripts/4398.cs2 b/dumps/scripts/4398.cs2 new file mode 100644 index 000000000..d06dc4aac --- /dev/null +++ b/dumps/scripts/4398.cs2 @@ -0,0 +1,14 @@ +void script_4398(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 0; + while (ivar3 < arg2) { + if (setWidgetRegister(new WidgetPointer(arg1), ivar3)) { + setWidgetSprite(5523); + } + ivar3 = add(ivar3, 1); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + setWidgetSprite(5526); + } + return; +} diff --git a/dumps/scripts/4399.cs2 b/dumps/scripts/4399.cs2 new file mode 100644 index 000000000..a7de2796c --- /dev/null +++ b/dumps/scripts/4399.cs2 @@ -0,0 +1,4 @@ +void script_4399(int arg0) { + script_4400(arg0); + return; +} diff --git a/dumps/scripts/44.cs2 b/dumps/scripts/44.cs2 new file mode 100644 index 000000000..a11b77a7f --- /dev/null +++ b/dumps/scripts/44.cs2 @@ -0,0 +1,4 @@ +void script_44(int arg0,int arg1) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/440.cs2 b/dumps/scripts/440.cs2 new file mode 100644 index 000000000..c327720cd --- /dev/null +++ b/dumps/scripts/440.cs2 @@ -0,0 +1,28 @@ +void script_440() { + setWidgetSprite(1134, new WidgetPointer(1016,24)); + setWidgetSprite(1134, new WidgetPointer(1016,25)); + setWidgetSprite(1134, new WidgetPointer(1016,26)); + setWidgetSprite(1134, new WidgetPointer(1016,27)); + setWidgetSprite(1134, new WidgetPointer(1016,28)); + setWidgetSprite(1134, new WidgetPointer(1016,29)); + switch (bitconfig_8087) { + case 0: + setWidgetSprite(1135, new WidgetPointer(1016,24)); + break; + case 1: + setWidgetSprite(1135, new WidgetPointer(1016,25)); + break; + case 2: + setWidgetSprite(1135, new WidgetPointer(1016,26)); + break; + case 3: + setWidgetSprite(1135, new WidgetPointer(1016,27)); + break; + case 4: + setWidgetSprite(1135, new WidgetPointer(1016,28)); + break; + case 5: + setWidgetSprite(1135, new WidgetPointer(1016,29)); + } + return; +} diff --git a/dumps/scripts/4400.cs2 b/dumps/scripts/4400.cs2 new file mode 100644 index 000000000..cf2a2c82a --- /dev/null +++ b/dumps/scripts/4400.cs2 @@ -0,0 +1,26 @@ +void script_4400(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(1105,64)); + setWidgetIsHidden(true, new WidgetPointer(1105,67)); + setWidgetIsHidden(true, new WidgetPointer(1105,68)); + setWidgetIsHidden(true, new WidgetPointer(1105,69)); + setWidgetIsHidden(true, new WidgetPointer(1105,70)); + setWidgetIsHidden(true, new WidgetPointer(1105,167)); + setWidgetIsHidden(true, new WidgetPointer(1105,179)); + setWidgetIsHidden(true, new WidgetPointer(1105,191)); + switch (arg0) { + case 72417450: + setWidgetIsHidden(false, new WidgetPointer(1105,64)); + setWidgetIsHidden(false, new WidgetPointer(1105,67)); + setWidgetIsHidden(false, new WidgetPointer(1105,167)); + break; + case 72417462: + setWidgetIsHidden(false, new WidgetPointer(1105,68)); + setWidgetIsHidden(false, new WidgetPointer(1105,69)); + setWidgetIsHidden(false, new WidgetPointer(1105,179)); + break; + case 72417474: + setWidgetIsHidden(false, new WidgetPointer(1105,70)); + setWidgetIsHidden(false, new WidgetPointer(1105,191)); + } + return; +} diff --git a/dumps/scripts/4401.cs2 b/dumps/scripts/4401.cs2 new file mode 100644 index 000000000..e88b24610 --- /dev/null +++ b/dumps/scripts/4401.cs2 @@ -0,0 +1,4 @@ +void script_4401(int arg0) { + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2094)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4402.cs2 b/dumps/scripts/4402.cs2 new file mode 100644 index 000000000..6f3485e68 --- /dev/null +++ b/dumps/scripts/4402.cs2 @@ -0,0 +1,4 @@ +void script_4402(int arg0) { + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2095)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4403.cs2 b/dumps/scripts/4403.cs2 new file mode 100644 index 000000000..6539976dc --- /dev/null +++ b/dumps/scripts/4403.cs2 @@ -0,0 +1,4 @@ +void script_4403(int arg0) { + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2096)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4404.cs2 b/dumps/scripts/4404.cs2 new file mode 100644 index 000000000..b962dcd21 --- /dev/null +++ b/dumps/scripts/4404.cs2 @@ -0,0 +1,4 @@ +void script_4404(int arg0) { + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2097)), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4405.cs2 b/dumps/scripts/4405.cs2 new file mode 100644 index 000000000..2bd6b46f6 --- /dev/null +++ b/dumps/scripts/4405.cs2 @@ -0,0 +1,11 @@ +int script_4405() { + int ivar0; + int ivar1; + ivar0 = getWidgetActualY(); + ivar1 = getWidgetParentId(); + while (ivar1 != -1) { + ivar0 = subtract(add(ivar0, getWidgetActualY(new WidgetPointer(ivar1))), cs2method2601(new WidgetPointer(ivar1))); + ivar1 = getWidgetParentId(new WidgetPointer(ivar1)); + } + return ivar0; +} diff --git a/dumps/scripts/4406.cs2 b/dumps/scripts/4406.cs2 new file mode 100644 index 000000000..df7fc1a93 --- /dev/null +++ b/dumps/scripts/4406.cs2 @@ -0,0 +1,4 @@ +void script_4406(int arg0,int arg1,int arg2) { + script_4407(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4407.cs2 b/dumps/scripts/4407.cs2 new file mode 100644 index 000000000..556de1784 --- /dev/null +++ b/dumps/scripts/4407.cs2 @@ -0,0 +1,6 @@ +void script_4407(int arg0,int arg1,int arg2) { + if ((arg1 >= 1) && (arg1 <= 10)) { + cs2method2309(arg1, arg2, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4408.cs2 b/dumps/scripts/4408.cs2 new file mode 100644 index 000000000..805d417c9 --- /dev/null +++ b/dumps/scripts/4408.cs2 @@ -0,0 +1,4 @@ +void script_4408(int arg0) { + cs2method2309(1, 36, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4409.cs2 b/dumps/scripts/4409.cs2 new file mode 100644 index 000000000..b20a2cd14 --- /dev/null +++ b/dumps/scripts/4409.cs2 @@ -0,0 +1,127 @@ +void script_4409(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + switch (globalint_1007) { + case 1: + script_2766(0, 50, arg0); + break; + case 11: + if (getDisplayMode() >= 2) { + setScriptCallOnConfigChange(5210, new WidgetPointer(-32768,3), 466, 1, "IY", new WidgetPointer(746,7)); + script_5211(1); + } + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 28, 0, 27), 900, addToCoordinate(ivar1, 28, 0, 27), 900, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 28, 0, 27), 750, addToCoordinate(ivar1, 28, 0, 27), 750, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 23, 0, 8), 200, addToCoordinate(ivar1, 23, 0, 8), 200, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 23, 0, 8), 250, addToCoordinate(ivar1, 23, 0, 8), 250, 0); + cameraMethod5502(0, 0, 50, 0, 1, 0); + break; + case 12: + script_2766(0, 50, arg0); + break; + case 21: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 16, 0, 26), 900, addToCoordinate(ivar1, 16, 0, 26), 900, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 16, 0, 26), 900, addToCoordinate(ivar1, 16, 0, 26), 900, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 24, 0, 37), 500, addToCoordinate(ivar1, 24, 0, 37), 500, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 24, 0, 37), 500, addToCoordinate(ivar1, 24, 0, 37), 500, 0); + cameraMethod5502(0, 0, 100, 0, 1, 0); + break; + case 22: + script_2766(0, 50, arg0); + break; + case 31: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 31, 0, 11), 700, addToCoordinate(ivar1, 31, 0, 11), 700, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 24, 0, 11), 800, addToCoordinate(ivar1, 24, 0, 11), 800, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 28, 0, 19), 350, addToCoordinate(ivar1, 28, 0, 19), 350, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 28, 0, 19), 350, addToCoordinate(ivar1, 28, 0, 19), 350, 0); + cameraMethod5502(0, 0, 50, 0, 1, 0); + break; + case 32: + script_2766(0, 50, arg0); + break; + case 41: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 37, 0, 41), 1200, addToCoordinate(ivar1, 37, 0, 41), 1200, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 37, 0, 41), 800, addToCoordinate(ivar1, 37, 0, 41), 800, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 27, 0, 49), 700, addToCoordinate(ivar1, 27, 0, 49), 700, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 27, 0, 49), 650, addToCoordinate(ivar1, 27, 0, 49), 650, 0); + cameraMethod5502(0, 0, 50, 0, 1, 0); + break; + case 42: + script_2766(0, 50, arg0); + break; + case 51: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 37, 0, 9), 1300, addToCoordinate(ivar1, 37, 0, 9), 1300, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 37, 0, 9), 1300, addToCoordinate(ivar1, 37, 0, 9), 1300, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 27, 0, 17), 700, addToCoordinate(ivar1, 27, 0, 17), 700, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 27, 0, 17), 700, addToCoordinate(ivar1, 27, 0, 17), 700, 0); + cameraMethod5502(0, 0, 50, 0, 1, 0); + break; + case 52: + script_2766(0, 50, arg0); + break; + case 61: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 33, 0, 30), 600, addToCoordinate(ivar1, 33, 0, 30), 600, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 33, 0, 30), 550, addToCoordinate(ivar1, 33, 0, 30), 550, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 24, 0, 33), 180, addToCoordinate(ivar1, 24, 0, 33), 180, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 24, 0, 33), 180, addToCoordinate(ivar1, 24, 0, 33), 180, 0); + cameraMethod5502(0, 0, 30, 0, 1, 0); + break; + case 62: + script_2766(0, 50, arg0); + break; + case 71: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 18, 1, 34), 1000, addToCoordinate(ivar1, 18, 1, 34), 1000, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 18, 1, 44), 1000, addToCoordinate(ivar1, 18, 1, 44), 1000, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 24, 1, 39), 800, addToCoordinate(ivar1, 24, 1, 39), 800, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 24, 1, 39), 700, addToCoordinate(ivar1, 24, 1, 39), 700, 0); + cameraMethod5502(0, 0, 80, 0, 1, 0); + break; + case 72: + script_2766(0, 50, arg0); + break; + case 81: + script_2768(50, arg0); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 15, 1, 18), 700, addToCoordinate(ivar1, 15, 1, 18), 700, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 15, 1, 18), 700, addToCoordinate(ivar1, 15, 1, 18), 700, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 24, 1, 30), 300, addToCoordinate(ivar1, 24, 1, 30), 300, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 24, 1, 12), 600, addToCoordinate(ivar1, 24, 1, 12), 600, 0); + cameraMethod5502(0, 0, 300, 0, 1, 0); + break; + case 82: + script_2766(0, 50, arg0); + break; + case 999: + script_2766(0, 50, arg0); + break; + case 1000: + cs2method5512(); + script_2768(50, arg0); + break; + default: + cs2method5512(); + } + return; +} diff --git a/dumps/scripts/441.cs2 b/dumps/scripts/441.cs2 new file mode 100644 index 000000000..9b25b2f4b --- /dev/null +++ b/dumps/scripts/441.cs2 @@ -0,0 +1,4 @@ +void script_441() { + script_304(42929944); + return; +} diff --git a/dumps/scripts/4410.cs2 b/dumps/scripts/4410.cs2 new file mode 100644 index 000000000..aad4b7f65 --- /dev/null +++ b/dumps/scripts/4410.cs2 @@ -0,0 +1,6 @@ +void script_4410(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnGameloop(4411, new WidgetPointer(arg0), arg1, arg2, 0, "Iiii"); + } + return; +} diff --git a/dumps/scripts/4411.cs2 b/dumps/scripts/4411.cs2 new file mode 100644 index 000000000..72a4c5c12 --- /dev/null +++ b/dumps/scripts/4411.cs2 @@ -0,0 +1,45 @@ +void script_4411(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + if (arg0 == -1) { + return; + } + ivar4 = 0; + ivar5 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar4 = cs2method1609(); + if (((boolean)arg3)) { + flow_4: + if (((boolean)arg2)) { + ivar5 = add(ivar4, 22); + } else if (((boolean)arg2)) { + ivar5 = subtract(ivar4, 22); + } else { + setScriptCallOnGameloop(-1, ""); + return; + } + ivar5 = max(ivar5, 0); + ivar5 = min(ivar5, 255); + cs2method2103(ivar5); + IF (((boolean)arg2)) + GOTO flow_10 + GOTO flow_11 + flow_10: + IF (ivar5 == 255) + GOTO flow_13 + flow_11: + IF (((boolean)arg2) && ((boolean)ivar5)) + GOTO flow_13 + GOTO flow_14 + flow_13: + setScriptCallOnGameloop(-1, ""); + GOTO flow_15 + flow_14: + setScriptCallOnGameloop(4411, new WidgetPointer(arg0), arg1, arg2, 0, "Iiii"); + flow_15: + } else { + setScriptCallOnGameloop(4411, new WidgetPointer(arg0), arg1, arg2, subtract(arg3, 1), "Iiii", new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/4412.cs2 b/dumps/scripts/4412.cs2 new file mode 100644 index 000000000..1f647514a --- /dev/null +++ b/dumps/scripts/4412.cs2 @@ -0,0 +1,25 @@ +void script_4412(int arg0,int arg1) { + int ivar2; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + if (ivar2 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 1, 0, "Iii", new WidgetPointer(arg0)); + } else if (ivar2 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } else { + if (ivar2 == 5) { + return; + } + } + script_5154(arg0, arg1); + if (ivar2 == 4) { + script_4161(arg0, 0); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4413.cs2 b/dumps/scripts/4413.cs2 new file mode 100644 index 000000000..651ab3a0d --- /dev/null +++ b/dumps/scripts/4413.cs2 @@ -0,0 +1,8 @@ +void script_4413() { + if (cs2method3700()) { + script_4415(); + } else { + setScriptCallOnClanChatSettingsStuff(4414, "", new WidgetPointer(1107,170)); + } + return; +} diff --git a/dumps/scripts/4414.cs2 b/dumps/scripts/4414.cs2 new file mode 100644 index 000000000..ddcb9d371 --- /dev/null +++ b/dumps/scripts/4414.cs2 @@ -0,0 +1,6 @@ +void script_4414() { + if (cs2method3700()) { + script_4415(); + } + return; +} diff --git a/dumps/scripts/4415.cs2 b/dumps/scripts/4415.cs2 new file mode 100644 index 000000000..dc520ebed --- /dev/null +++ b/dumps/scripts/4415.cs2 @@ -0,0 +1,25 @@ +void script_4415() { + setWidgetText(new WidgetPointer(1107,173), cs2method3702()); + setWidgetText(new WidgetPointer(1107,19), "Game time:" + "
" + script_4337(clanconfig_0)); + setWidgetText(new WidgetPointer(1107,35), cs2method3710(cs2method3715())); + if (clanbitconfig_6 > 0) { + setWidgetText(new WidgetPointer(1107,36), intToStr(clanbitconfig_6)); + } + setWidgetText(new WidgetPointer(1107,37), intToStr(cs2method3709())); + if (((boolean)clanbitconfig_4)) { + setWidgetText(new WidgetPointer(1107,5), "This clan is not recruiting."); + } else { + if (((boolean)clanbitconfig_4)) { + setWidgetText(new WidgetPointer(1107,5), "This clan is recruiting."); + } + } + script_4332(72548454, 72548464); + script_4334(72548359, 72548360); + script_4336(72548446); + script_4343(72548447); + script_4329(72548390); + script_4328(72548551); + script_4420(); + setWidgetIsHidden(true, new WidgetPointer(1107,151)); + return; +} diff --git a/dumps/scripts/4416.cs2 b/dumps/scripts/4416.cs2 new file mode 100644 index 000000000..60354db42 --- /dev/null +++ b/dumps/scripts/4416.cs2 @@ -0,0 +1,6 @@ +void script_4416(int arg0,int arg1,int arg2) { + setWidgetSprite(5866, new WidgetPointer(arg1)); + setWidgetSprite(5866, new WidgetPointer(arg2)); + setWidgetSprite(5865, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4417.cs2 b/dumps/scripts/4417.cs2 new file mode 100644 index 000000000..1868a3532 --- /dev/null +++ b/dumps/scripts/4417.cs2 @@ -0,0 +1,6 @@ +void script_4417(int arg0,int arg1,int arg2) { + setWidgetSprite(5864, new WidgetPointer(arg1)); + setWidgetSprite(5864, new WidgetPointer(arg2)); + setWidgetSprite(5863, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4418.cs2 b/dumps/scripts/4418.cs2 new file mode 100644 index 000000000..aa6f9585a --- /dev/null +++ b/dumps/scripts/4418.cs2 @@ -0,0 +1,11 @@ +void script_4418() { + string svar0; + svar0 = strRemoveEntities(getWidgetText(new WidgetPointer(1107,98))); + if (isFriend(svar0)) { + messageType0("Attempting to add " + svar0 + " to your Friends List."); + cs2method3605(svar0); + } else { + messageType0("You've already added " + svar0 + " to your friends list."); + } + return; +} diff --git a/dumps/scripts/4419.cs2 b/dumps/scripts/4419.cs2 new file mode 100644 index 000000000..b6fd08bc4 --- /dev/null +++ b/dumps/scripts/4419.cs2 @@ -0,0 +1,16 @@ +void script_4419(int arg0) { + if (getWidgetActualHeight(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg0)))) > 69) { + script_4544(arg0, -1, -1, -1, 14, 70, 3, 1); + setWidgetSprite(6169, new WidgetPointer(1107,58)); + setWidgetSprite(6169, new WidgetPointer(1107,59)); + cs2method2005(0, new WidgetPointer(1107,40)); + } else { + if (getWidgetActualHeight(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg0)))) == 14) { + script_4544(arg0, -1, -1, -1, 14, 70, 3, 1); + setWidgetSprite(6168, new WidgetPointer(1107,58)); + setWidgetSprite(6168, new WidgetPointer(1107,59)); + cs2method2005(1, new WidgetPointer(1107,40)); + } + } + return; +} diff --git a/dumps/scripts/442.cs2 b/dumps/scripts/442.cs2 new file mode 100644 index 000000000..a5b3bb35c --- /dev/null +++ b/dumps/scripts/442.cs2 @@ -0,0 +1,28 @@ +void script_442(int arg0) { + setWidgetSprite(1134, new WidgetPointer(1016,24)); + setWidgetSprite(1134, new WidgetPointer(1016,25)); + setWidgetSprite(1134, new WidgetPointer(1016,26)); + setWidgetSprite(1134, new WidgetPointer(1016,27)); + setWidgetSprite(1134, new WidgetPointer(1016,28)); + setWidgetSprite(1134, new WidgetPointer(1016,29)); + switch (arg0) { + case 66584606: + setWidgetSprite(1135, new WidgetPointer(1016,24)); + break; + case 66584607: + setWidgetSprite(1135, new WidgetPointer(1016,25)); + break; + case 66584608: + setWidgetSprite(1135, new WidgetPointer(1016,26)); + break; + case 66584609: + setWidgetSprite(1135, new WidgetPointer(1016,27)); + break; + case 66584610: + setWidgetSprite(1135, new WidgetPointer(1016,28)); + break; + case 66584611: + setWidgetSprite(1135, new WidgetPointer(1016,29)); + } + return; +} diff --git a/dumps/scripts/4420.cs2 b/dumps/scripts/4420.cs2 new file mode 100644 index 000000000..89863d139 --- /dev/null +++ b/dumps/scripts/4420.cs2 @@ -0,0 +1,45 @@ +void script_4420() { + setWidgetText(new WidgetPointer(1107,60), "Event"); + setWidgetIsHidden(false, new WidgetPointer(1107,58)); + setWidgetIsHidden(false, new WidgetPointer(1107,59)); + switch (clanbitconfig_130) { + case 1: + script_4421(72548402, 72548403, clanbitconfig_98, clanbitconfig_106, clanbitconfig_82, clanbitconfig_90, clanbitconfig_74, clanbitconfig_114, clanconfig_65, clanbitconfig_132, clanlongconfig_122); + break; + case 2: + script_4421(72548402, 72548403, clanbitconfig_99, clanbitconfig_107, clanbitconfig_83, clanbitconfig_91, clanbitconfig_75, clanbitconfig_115, clanconfig_66, clanbitconfig_133, clanlongconfig_123); + break; + case 3: + script_4421(72548402, 72548403, clanbitconfig_100, clanbitconfig_108, clanbitconfig_84, clanbitconfig_92, clanbitconfig_76, clanbitconfig_116, clanconfig_67, clanbitconfig_134, clanlongconfig_124); + break; + case 4: + script_4421(72548402, 72548403, clanbitconfig_101, clanbitconfig_109, clanbitconfig_85, clanbitconfig_93, clanbitconfig_77, clanbitconfig_117, clanconfig_68, clanbitconfig_135, clanlongconfig_125); + break; + case 5: + script_4421(72548402, 72548403, clanbitconfig_102, clanbitconfig_110, clanbitconfig_86, clanbitconfig_94, clanbitconfig_78, clanbitconfig_118, clanconfig_69, clanbitconfig_136, clanlongconfig_126); + break; + case 6: + script_4421(72548402, 72548403, clanbitconfig_103, clanbitconfig_111, clanbitconfig_87, clanbitconfig_95, clanbitconfig_79, clanbitconfig_119, clanconfig_70, clanbitconfig_137, clanlongconfig_127); + break; + case 7: + script_4421(72548402, 72548403, clanbitconfig_104, clanbitconfig_112, clanbitconfig_88, clanbitconfig_96, clanbitconfig_80, clanbitconfig_120, clanconfig_71, clanbitconfig_138, clanlongconfig_128); + break; + case 8: + script_4421(72548402, 72548403, clanbitconfig_105, clanbitconfig_113, clanbitconfig_89, clanbitconfig_97, clanbitconfig_81, clanbitconfig_121, clanconfig_72, clanbitconfig_139, clanlongconfig_129); + break; + default: + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(1107,54)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(1107,54)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(1107,56)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(1107,55)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(1107,56)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(1107,56)); + setWidgetText(new WidgetPointer(1107,60), "Events (none)"); + setWidgetIsHidden(true, new WidgetPointer(1107,58)); + setWidgetIsHidden(true, new WidgetPointer(1107,59)); + setWidgetText(new WidgetPointer(1107,50), ""); + setWidgetText(new WidgetPointer(1107,51), ""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(1107,57)); + } + return; +} diff --git a/dumps/scripts/4421.cs2 b/dumps/scripts/4421.cs2 new file mode 100644 index 000000000..b02cdd8a9 --- /dev/null +++ b/dumps/scripts/4421.cs2 @@ -0,0 +1,36 @@ +void script_4421(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,long arg10) { + int ivar10; + string svar0; + ivar10 = cs2method_3408(105, 103, 3689, arg6); + svar0 = ""; + if (((arg2 >= getCurrentDaysSinceLaunch()) && (arg5 > 0)) && ((arg4 > 0) && (arg6 > 0))) { + svar0 = timeToStr(arg2) + "
" + cs2method_3408(105, 115, 3695, arg3); + if (((boolean)clanbitconfig_5)) { + svar0 = svar0 + " Game time:"; + } else { + svar0 = svar0 + " Clan time:"; + } + if (arg5 > 0) { + svar0 = svar0 + "
" + "World " + intToStr(arg5); + } + svar0 = svar0 + "
" + cs2method_3408(105, 115, 3696, arg4); + setWidgetText(new WidgetPointer(arg0), svar0); + svar0 = cs2method_3408(105, 115, 3687, arg6); + if ((ivar10 != -1) && (arg7 > 0)) { + svar0 = svar0 + "
" + cs2method_3408(105, 115, ivar10, arg7); + } + svar0 = svar0 + "
" + "Open to: " + cs2method_3408(105, 115, 3716, arg8); + if (((boolean)arg9)) { + svar0 = svar0 + "
" + "Attendance is mandatory."; + } + setWidgetText(new WidgetPointer(arg1), svar0); + if (arg10 != -1L) { + setWidgetIsHidden(false, new WidgetPointer(1107,146)); + setScriptCallOnClickContextMenu(4330, arg10, "\u00a7", new WidgetPointer(1107,146)); + } else { + setScriptCallOnMousePressed(-1, "", new WidgetPointer(1107,146)); + setWidgetIsHidden(true, new WidgetPointer(1107,52)); + } + } + return; +} diff --git a/dumps/scripts/4422.cs2 b/dumps/scripts/4422.cs2 new file mode 100644 index 000000000..d92c51be7 --- /dev/null +++ b/dumps/scripts/4422.cs2 @@ -0,0 +1,5 @@ +void script_4422() { + setWidgetIsHidden(true, new WidgetPointer(1107,96)); + setWidgetSize(446, getWidgetActualHeight(new WidgetPointer(1107,91)), 0, 0, new WidgetPointer(1107,91)); + return; +} diff --git a/dumps/scripts/4423.cs2 b/dumps/scripts/4423.cs2 new file mode 100644 index 000000000..4655fe303 --- /dev/null +++ b/dumps/scripts/4423.cs2 @@ -0,0 +1,5 @@ +void script_4423() { + setWidgetIsHidden(false, new WidgetPointer(1107,96)); + setWidgetSize(332, getWidgetActualHeight(new WidgetPointer(1107,91)), 0, 0, new WidgetPointer(1107,91)); + return; +} diff --git a/dumps/scripts/4424.cs2 b/dumps/scripts/4424.cs2 new file mode 100644 index 000000000..b6c5e874c --- /dev/null +++ b/dumps/scripts/4424.cs2 @@ -0,0 +1,32 @@ +void script_4424(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar4 = divide(add(arg2, arg3), 2); + ivar5 = globalarray_0[ivar4]; + globalarray_0[ivar4] = globalarray_0[arg3]; + globalarray_0[arg3] = ivar5; + ivar6 = arg2; + ivar7 = arg2; + ivar8 = -1; + while (ivar7 < arg3) { + if ((setWidgetRegister(new WidgetPointer(arg1), ivar5) && setWidgetRegister(new WidgetPointer(arg1), globalarray_0[ivar7])) && (stringMethod4107(lower(getWidgetText()), lower(getWidgetText())) < bitAnd(ivar7, 1))) { + ivar8 = globalarray_0[ivar7]; + globalarray_0[ivar7] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar8; + ivar6 = add(ivar6, 1); + } + ivar7 = add(ivar7, 1); + } + globalarray_0[arg3] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar5; + if (arg2 < subtract(ivar6, 1)) { + script_4424(0, arg1, arg2, subtract(ivar6, 1)); + } + if (add(ivar6, 1) < arg3) { + script_4424(0, arg1, add(ivar6, 1), arg3); + } + return; +} diff --git a/dumps/scripts/4425.cs2 b/dumps/scripts/4425.cs2 new file mode 100644 index 000000000..ecac0bf25 --- /dev/null +++ b/dumps/scripts/4425.cs2 @@ -0,0 +1,32 @@ +void script_4425(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar4 = divide(add(arg2, arg3), 2); + ivar5 = globalarray_0[ivar4]; + globalarray_0[ivar4] = globalarray_0[arg3]; + globalarray_0[arg3] = ivar5; + ivar6 = arg2; + ivar7 = arg2; + ivar8 = -1; + while (ivar7 < arg3) { + if ((setWidgetRegister(new WidgetPointer(arg1), ivar5) && setWidgetRegister(new WidgetPointer(arg1), globalarray_0[ivar7])) && (stringMethod4107(lower(getWidgetText()), lower(getWidgetText())) < bitAnd(ivar7, 1))) { + ivar8 = globalarray_0[ivar7]; + globalarray_0[ivar7] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar8; + ivar6 = add(ivar6, 1); + } + ivar7 = add(ivar7, 1); + } + globalarray_0[arg3] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar5; + if (arg2 < subtract(ivar6, 1)) { + script_4425(0, arg1, arg2, subtract(ivar6, 1)); + } + if (add(ivar6, 1) < arg3) { + script_4425(0, arg1, add(ivar6, 1), arg3); + } + return; +} diff --git a/dumps/scripts/4426.cs2 b/dumps/scripts/4426.cs2 new file mode 100644 index 000000000..162c3e74f --- /dev/null +++ b/dumps/scripts/4426.cs2 @@ -0,0 +1,5 @@ +void script_4426(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_2732(arg0, arg1, bitconfig_9188, 2); + setScriptCallOnClickContextMenu(4427, -2147483644, arg1, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), "iiIIIIII", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4427.cs2 b/dumps/scripts/4427.cs2 new file mode 100644 index 000000000..c622601dd --- /dev/null +++ b/dumps/scripts/4427.cs2 @@ -0,0 +1,12 @@ +void script_4427(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + if (arg0 != 1) { + return; + } + if (bitconfig_9188 == arg1) { + return; + } + bitconfig_9188 = arg1; + playSoundEffect(2266, 1, 0); + script_2735(arg2, arg3, arg4, arg5, arg6, arg7); + return; +} diff --git a/dumps/scripts/4428.cs2 b/dumps/scripts/4428.cs2 new file mode 100644 index 000000000..863d3a8ed --- /dev/null +++ b/dumps/scripts/4428.cs2 @@ -0,0 +1,39 @@ +void script_4428() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 72745013; + setScriptCallOnGameloop(4431, new WidgetPointer(-32768,3), "I", new WidgetPointer(ivar0)); + if (cs2method3751()) { + globalint_53 = 0; + setScriptCallOnClanListChange(4449, new WidgetPointer(-32768,3), "I", new WidgetPointer(ivar0)); + setScriptCallOnFriendListChange(4449, new WidgetPointer(-32768,3), "I", new WidgetPointer(ivar0)); + setWidgetScrollMax(0, 0, new WidgetPointer(ivar0)); + cs2method2100(0, 0, new WidgetPointer(ivar0)); + cs2method2314(149, new WidgetPointer(1110,27)); + setWidgetIsHidden(false, new WidgetPointer(1110,22)); + script_4470(); + script_4436(ivar0, globalint_1035); + script_4447(); + } + deleteAllExtraChilds(new WidgetPointer(1110,12)); + deleteAllExtraChilds(new WidgetPointer(1110,4)); + ivar1 = 0; + ivar2 = divide(add(500, 100), 2); + while (ivar1 < ivar2) { + createExtraChild(new WidgetPointer(1110,12), 3, ivar1); + createExtraChild(new WidgetPointer(1110,4), 3, ivar1); + setWidgetSize(0, 19, 1, 0); + setWidgetSize(0, 19, 1, 0); + setWidgetPosition(0, multiply(multiply(ivar1, 2), 19), 1, 0); + setWidgetPosition(0, getWidgetActualY(), 1, 0); + setWidgetRGB(new Color(35, 34, 32)); + setWidgetRGB(new Color(35, 34, 32)); + setWidgetFilled(1); + setWidgetFilled(1); + cs2method2103(128); + cs2method2103(128); + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/4429.cs2 b/dumps/scripts/4429.cs2 new file mode 100644 index 000000000..1ffe64620 --- /dev/null +++ b/dumps/scripts/4429.cs2 @@ -0,0 +1,6 @@ +void script_4429(int arg0,int arg1) { + setWidgetIsHidden(false, new WidgetPointer(1110,89)); + setWidgetSprite(6244, new WidgetPointer(arg1)); + setScriptCallOnUseWith(4430, new WidgetPointer(arg0), new WidgetPointer(arg1), "II", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/443.cs2 b/dumps/scripts/443.cs2 new file mode 100644 index 000000000..4ffcbaadd --- /dev/null +++ b/dumps/scripts/443.cs2 @@ -0,0 +1,84 @@ +void script_443() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar0 = 5; + ivar1 = 5; + ivar2 = 0; + ivar3 = 0; + ivar4 = 1; + ivar5 = 0; + ivar6 = 1; + ivar7 = 0; + ivar8 = 0; + while (ivar0 < 270) { + while (ivar1 < 200) { + createExtraChild(new WidgetPointer(1022,19), 5, ivar2); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(ivar1, ivar0, 0, 0); + if (getItemIdInSlot(583, ivar2) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(583, ivar2), getItemAmtInSlot(583, ivar2)); + cs2method1305("" + getItemName(getItemIdInSlot(583, ivar2))); + setWidgetContextMenuOption(1, "Remove 1"); + setWidgetContextMenuOption(2, "Remove 5"); + setWidgetContextMenuOption(3, "Remove 10"); + setWidgetContextMenuOption(4, "Remove All"); + setWidgetContextMenuOption(5, "Remove X"); + setWidgetContextMenuOption(10, "Examine"); + setWidgetBorderThickness(1); + ivar3 = add(ivar3, 1); + if (ivar3 > 5) { + ivar4 = add(ivar4, 1); + ivar3 = 1; + } + } + createExtraChild(new WidgetPointer(1022,14), 5, ivar2); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(ivar1, ivar0, 0, 0); + if (getItemIdInSlotSplit(583, ivar2) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlotSplit(583, ivar2), getItemAmtInSlotSplit(583, ivar2)); + cs2method1305("" + getItemName(getItemIdInSlotSplit(583, ivar2))); + setWidgetContextMenuOption(1, "Examine"); + setWidgetBorderThickness(1); + ivar5 = add(ivar5, 1); + if (ivar5 > 5) { + ivar6 = add(ivar6, 1); + ivar5 = 1; + } + } + ivar1 = add(ivar1, 40); + ivar2 = add(ivar2, 1); + } + ivar0 = add(ivar0, 40); + ivar1 = 5; + } + ivar7 = add(multiply(ivar4, 40), 5); + if (ivar7 > getWidgetActualHeight(new WidgetPointer(1022,19))) { + setWidgetScrollMax(0, ivar7, new WidgetPointer(1022,19)); + script_31(66977812, 66977811, 2598, 2595, 2596, 2597, 2593, 2594); + setWidgetPosition(6, getWidgetActualY(new WidgetPointer(1022,19)), 0, 0, new WidgetPointer(1022,19)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(1022,19)); + cs2method2100(0, 0, new WidgetPointer(1022,19)); + deleteAllExtraChilds(new WidgetPointer(1022,20)); + setWidgetPosition(16, getWidgetActualY(new WidgetPointer(1022,19)), 0, 0, new WidgetPointer(1022,19)); + } + ivar8 = add(multiply(ivar6, 40), 5); + if (ivar8 > getWidgetActualHeight(new WidgetPointer(1022,14))) { + setWidgetScrollMax(0, ivar8, new WidgetPointer(1022,14)); + script_31(66977808, 66977806, 2598, 2595, 2596, 2597, 2593, 2594); + setWidgetPosition(6, getWidgetActualY(new WidgetPointer(1022,14)), 0, 0, new WidgetPointer(1022,14)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(1022,14)); + cs2method2100(0, 0, new WidgetPointer(1022,14)); + deleteAllExtraChilds(new WidgetPointer(1022,16)); + setWidgetPosition(16, getWidgetActualY(new WidgetPointer(1022,14)), 0, 0, new WidgetPointer(1022,14)); + } + return; +} diff --git a/dumps/scripts/4430.cs2 b/dumps/scripts/4430.cs2 new file mode 100644 index 000000000..4f19c1129 --- /dev/null +++ b/dumps/scripts/4430.cs2 @@ -0,0 +1,6 @@ +void script_4430(int arg0,int arg1) { + setWidgetSprite(6242, new WidgetPointer(arg1)); + setScriptCallOnUseWith(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(1110,89)); + return; +} diff --git a/dumps/scripts/4431.cs2 b/dumps/scripts/4431.cs2 new file mode 100644 index 000000000..92ce9a82b --- /dev/null +++ b/dumps/scripts/4431.cs2 @@ -0,0 +1,18 @@ +void script_4431(int arg0) { + string svar0; + svar0 = ""; + if (cs2method3751()) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + script_4434(); + setScriptCallOnClanChatSettingsStuff(4433, "", new WidgetPointer(1110,3)); + setScriptCallOnClanChatDeltaStuff(4433, "", new WidgetPointer(1110,3)); + setWidgetSprite(6255, new WidgetPointer(1110,86)); + } else { + script_4437(); + svar0 = "Join Clan Chat channel."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1110,85)); + setWidgetContextMenuOption(1, new WidgetPointer(1110,85), "Join Clan Chat channel"); + script_4589(); + } + return; +} diff --git a/dumps/scripts/4432.cs2 b/dumps/scripts/4432.cs2 new file mode 100644 index 000000000..dcb83a54e --- /dev/null +++ b/dumps/scripts/4432.cs2 @@ -0,0 +1,4 @@ +void script_4432() { + script_4589(); + return; +} diff --git a/dumps/scripts/4433.cs2 b/dumps/scripts/4433.cs2 new file mode 100644 index 000000000..aa6d52253 --- /dev/null +++ b/dumps/scripts/4433.cs2 @@ -0,0 +1,8 @@ +void script_4433() { + if (cs2method3751()) { + script_4434(); + } else { + script_4589(); + } + return; +} diff --git a/dumps/scripts/4434.cs2 b/dumps/scripts/4434.cs2 new file mode 100644 index 000000000..8b8b3abc8 --- /dev/null +++ b/dumps/scripts/4434.cs2 @@ -0,0 +1,5 @@ +void script_4434() { + script_4436(72744974, globalint_1035); + script_4462(); + return; +} diff --git a/dumps/scripts/4435.cs2 b/dumps/scripts/4435.cs2 new file mode 100644 index 000000000..ef16c39dd --- /dev/null +++ b/dumps/scripts/4435.cs2 @@ -0,0 +1,9 @@ +void script_4435(int arg0) { + if (cs2method3751()) { + if (arg0 <= -1) { + arg0 = globalint_1035; + } + script_4436(72744974, arg0); + } + return; +} diff --git a/dumps/scripts/4436.cs2 b/dumps/scripts/4436.cs2 new file mode 100644 index 000000000..a1f279559 --- /dev/null +++ b/dumps/scripts/4436.cs2 @@ -0,0 +1,248 @@ +void script_4436(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + int stack_dump0; + if (globalint_1512 != 1) { + globalint_1512 = 1; + } + ivar2 = 72744974; + ivar3 = 72744975; + ivar4 = 72744977; + ivar5 = 72744978; + ivar6 = 72744987; + ivar7 = 72744979; + ivar8 = 72744985; + ivar9 = 72744989; + ivar10 = 72744976; + ivar11 = getWidgetActualWidth(new WidgetPointer(ivar6)); + if (arg1 <= -1) { + arg1 = getWidgetActualX(new WidgetPointer(ivar6)); + } + arg1 = max(min(arg1, subtract(getWidgetActualWidth(new WidgetPointer(ivar7)), ivar11)), 0); + globalint_1035 = arg1; + setWidgetPosition(arg1, 0, 0, 1, new WidgetPointer(ivar6)); + cs2method2314(149, new WidgetPointer(ivar6)); + setWidgetIsHidden(false, new WidgetPointer(ivar6)); + deleteAllExtraChilds(new WidgetPointer(ivar2)); + deleteAllExtraChilds(new WidgetPointer(ivar3)); + deleteAllExtraChilds(new WidgetPointer(ivar4)); + deleteAllExtraChilds(new WidgetPointer(ivar5)); + deleteAllExtraChilds(new WidgetPointer(ivar10)); + setWidgetSprite(6255, new WidgetPointer(1110,86)); + setWidgetIsHidden(false, new WidgetPointer(1110,22)); + script_4470(); + svar0 = "Leave your clan chat channel."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1110,85)); + setWidgetContextMenuOption(1, new WidgetPointer(1110,85), "Leave Clan Chat channel"); + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + svar1 = ""; + ivar15 = 19; + ivar16 = divide(getWidgetActualHeight(new WidgetPointer(ivar8)), ivar15); + svar2 = ""; + ivar17 = 0; + svar3 = ""; + ivar18 = 0; + ivar19 = 0; + svar4 = ""; + ivar20 = 0; + ivar21 = script_3365(ivar7); + ivar22 = subtract(add(arg1, ivar21), script_3365(ivar2)); + ivar23 = subtract(getWidgetActualWidth(new WidgetPointer(ivar4)), add(add(arg1, subtract(ivar21, script_3365(ivar4))), ivar11)); + setWidgetSize(ivar23, 0, 0, 1, new WidgetPointer(ivar4)); + setWidgetSize(ivar23, 0, 0, 1, new WidgetPointer(ivar5)); + setWidgetIsHidden(false, new WidgetPointer(ivar9)); + setScriptCallOnClanChatDeltaStuff(4435, -1, "i", new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(1110,26), cs2method3752()); + setWidgetText(new WidgetPointer(1110,62), ""); + setWidgetIsHidden(true, new WidgetPointer(1110,67)); + ivar24 = cs2method3760(strRemoveEntities(cs2method5020())); + if (ivar24 == -1) { + return; + } + ivar25 = cs2method3757(ivar24); + ivar14 = cs2method3755(); + ivar12 = 0; + while (ivar12 < ivar14) { + ivar13 = multiply(ivar12, ivar15); + svar2 = strRemoveEntities(cs2method3756(ivar12)); + ivar20 = cs2method3757(ivar12); + createExtraChild(new WidgetPointer(ivar2), 4, getExtraChildGap(new WidgetPointer(ivar2))); + setWidgetTextAlignment(0, 1, 0); + setWidgetPosition(0, ivar13, 0, 0); + setWidgetSize(ivar22, ivar15, 0, 0); + setWidgetRGB(new Color(164, 153, 125)); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + if (stringMethod4107(svar2, strRemoveEntities(cs2method5020())) != 0) { + cs2method1305(svar2); + if (isFriend(svar2)) { + setWidgetContextMenuOption(1, "Message"); + setWidgetContextMenuOption(7, "Remove friend"); + } else if (cs2method3623(svar2)) { + setWidgetContextMenuOption(8, "Remove ignore"); + } else { + setWidgetContextMenuOption(5, "Add friend"); + setWidgetContextMenuOption(6, "Add ignore"); + } + if (ivar25 >= 100) { + setWidgetContextMenuOption(9, "Temp-ban"); + } + setScriptCallOnClickContextMenu(4472, svar2, -2147483644, ivar12, "sii"); + } + svar1 = "\u00a0\u00a0\u00a0" + svar2; + if (getTextWidth(3793, svar1) > ivar22) { + while ((getTextWidth(3793, svar1 + "...") > ivar22) && (strLength(svar1) > 0)) { + svar1 = substr(0, subtract(strLength(svar1), 1), svar1); + } + svar1 = svar1 + "..."; + setScriptCallOnMouseOver(1594, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -2147483643, svar2, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1110,60), "I"); + } + setWidgetText(svar1); + setWidgetUnknownBoolean(true); + ivar17 = cs2method3758(ivar12); + if ((ivar17 >= 1100) && (ivar17 < 5001)) { + svar3 = "Lobby"; + svar4 = "Lobby"; + ivar18 = 0; + } else if ((ivar17 >= 5001) && (ivar17 < 6000)) { + svar3 = "Classic " + intToStr(subtract(ivar17, 5000)); + svar4 = "Classic " + intToStr(subtract(ivar17, 5000)); + ivar18 = 0; + } else { + svar3 = intToStr(ivar17); + svar4 = "World " + intToStr(ivar17); + ivar18 = add(add(2, 24), 2); + } + ivar19 = getTextWidth(3793, svar3); + createExtraChild(new WidgetPointer(ivar5), 5, getExtraChildGap(new WidgetPointer(ivar5))); + if (ivar23 >= add(ivar19, ivar18)) { + if (ivar18 > 0) { + setWidgetSprite(2173); + setWidgetSize(24, 12, 0, 0); + setWidgetPosition(2, add(ivar13, 1), 0, 0); + setScriptCallOnMouseOver(1594, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -2147483643, svar4, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1110,60), "I"); + } + } else { + ivar18 = 0; + } + if (ivar23 >= ivar19) { + } else { + setScriptCallOnMouseOver(1594, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -2147483643, svar4, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1110,60), "I"); + svar3 = "..."; + } + createExtraChild(new WidgetPointer(ivar4), 4, getExtraChildGap(new WidgetPointer(ivar4))); + setWidgetSize(ivar23, ivar15, 0, 0); + setWidgetPosition(add(ivar18, 2), ivar13, 0, 0); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(svar3); + if (ivar17 == getWorldId()) { + setWidgetRGB(new Color(60, 183, 30)); + } else { + setWidgetRGB(new Color(255, 255, 100)); + } + setScriptCallOnMouseOver(1594, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -2147483643, svar4, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1110,60), "I"); + createExtraChild(new WidgetPointer(ivar3), 5, getExtraChildGap(new WidgetPointer(ivar3))); + if (ivar20 == 127) { + setWidgetPosition(3, 3, 0, 0); + setWidgetSize(9, 9, 0, 0); + } else { + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(15, 15, 0, 0); + } + setWidgetSprite(cs2method_3408(105, 100, 3712, ivar20)); + createExtraChild(new WidgetPointer(ivar10), 5, getExtraChildGap(new WidgetPointer(ivar10))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(9, ivar15, 0, 0); + setWidgetSprite(6032); + setScriptCallOnClickContextMenu(4317, new WidgetPointer(-32768,3), -2147483643, "Ii"); + setWidgetContextMenuOption(1, "Show options"); + ivar12 = add(ivar12, 1); + } + ivar12 = 0; + ivar26 = 0; + while (ivar12 < ivar14) { + stack_dump0 = ivar12; + cs2method3761(); + ivar26 = stack_dump0; + if (setWidgetRegister(new WidgetPointer(ivar2), ivar26) && (stringMethod4107(getWidgetText(), "") != 0)) { + ivar13 = multiply(ivar12, ivar15); + setWidgetPosition(getWidgetActualX(), ivar13, 0, 0); + if (setWidgetRegister(new WidgetPointer(ivar3), ivar26)) { + setWidgetPosition(getWidgetActualX(), add(add(getWidgetActualY(), ivar13), 3), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(ivar4), ivar26)) { + setWidgetPosition(getWidgetActualX(), ivar13, 0, 0); + } + if (setWidgetRegister(new WidgetPointer(ivar5), ivar26)) { + setWidgetPosition(getWidgetActualX(), add(ivar13, 5), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(ivar10), ivar26)) { + setWidgetPosition(getWidgetActualX(), add(ivar13, 2), 0, 0); + } + } + ivar12 = add(ivar12, 1); + } + ivar27 = 0; + ivar28 = -1; + if (globalint_1518 >= 0) { + ivar28 = cs2method3760(globalstring_126); + if (ivar28 >= 0) { + globalint_1518 = ivar28; + if (setWidgetRegister(new WidgetPointer(ivar10), globalint_1518)) { + ivar27 = getWidgetActualY(); + setWidgetPosition(0, ivar27, 2, 0, new WidgetPointer(1110,20)); + setWidgetPosition(0, ivar27, 2, 0, new WidgetPointer(1110,13)); + } + } else { + globalint_1518 = -1; + globalstring_126 = ""; + setWidgetIsHidden(false, new WidgetPointer(1110,13)); + script_4628(); + } + } + ivar29 = cs2method2601(new WidgetPointer(ivar8)); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar8)), multiply(ivar15, max(ivar14, ivar16)), new WidgetPointer(ivar8)); + ivar29 = min(ivar29, getWidgetScrollMaxV(new WidgetPointer(ivar8))); + cs2method2100(0, ivar29, new WidgetPointer(ivar8)); + script_31(72744989, ivar8, 5666, 5663, 5664, 5665, 5686, 5685); + return; +} diff --git a/dumps/scripts/4437.cs2 b/dumps/scripts/4437.cs2 new file mode 100644 index 000000000..0e81ecc3a --- /dev/null +++ b/dumps/scripts/4437.cs2 @@ -0,0 +1,14 @@ +void script_4437() { + setWidgetIsHidden(true, new WidgetPointer(1110,27)); + setWidgetNoOptions(new WidgetPointer(1110,27)); + cs2method2100(0, 0, new WidgetPointer(1110,25)); + setWidgetIsHidden(false, new WidgetPointer(1110,29)); + script_31(72744989, 72744985, 5666, 5663, 5664, 5665, 5686, 5685); + setWidgetSprite(6256, new WidgetPointer(1110,86)); + setWidgetIsHidden(true, new WidgetPointer(1110,13)); + setWidgetSize(1, 19, 0, 0, new WidgetPointer(1110,20)); + globalint_1518 = -1; + globalstring_126 = ""; + setWidgetText(new WidgetPointer(1110,26), ""); + return; +} diff --git a/dumps/scripts/4438.cs2 b/dumps/scripts/4438.cs2 new file mode 100644 index 000000000..02637745c --- /dev/null +++ b/dumps/scripts/4438.cs2 @@ -0,0 +1,4 @@ +void script_4438() { + script_4441(0); + return; +} diff --git a/dumps/scripts/4439.cs2 b/dumps/scripts/4439.cs2 new file mode 100644 index 000000000..259d21576 --- /dev/null +++ b/dumps/scripts/4439.cs2 @@ -0,0 +1,4 @@ +void script_4439() { + script_4441(8); + return; +} diff --git a/dumps/scripts/444.cs2 b/dumps/scripts/444.cs2 new file mode 100644 index 000000000..d22cc4844 --- /dev/null +++ b/dumps/scripts/444.cs2 @@ -0,0 +1,120 @@ +void script_444() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + string svar1; + ivar0 = 0; + ivar1 = 0; + ivar2 = -1; + svar0 = ""; + svar1 = ""; + globalarray_0 = new int[getItemContainerLength(583)]; + globalarray_1 = new int[getItemContainerLength(583)]; + ivar3 = 0; + ivar4 = 99; + ivar5 = 0; + while (ivar0 < getItemContainerLength(583)) { + ivar2 = getItemIdInSlot(583, ivar0); + ivar1 = getItemAmtInSlot(583, ivar0); + if (ivar2 != -1) { + ivar4 = 99; + ivar5 = 0; + while (ivar5 < getItemContainerLength(583)) { + if (globalarray_0[ivar5] != -1) { + if (globalarray_0[ivar5] == ivar2) { + ivar4 = ivar5; + ivar5 = getItemContainerLength(583); + } + ivar5 = add(ivar5, 1); + } else { + ivar5 = getItemContainerLength(583); + } + } + if (ivar4 == 99) { + globalarray_0[ivar3] = ivar2; + globalarray_0[ivar3] = ivar1; + ivar3 = add(ivar3, 1); + } else { + globalarray_0[ivar4] = add(globalarray_1[ivar4], ivar1); + } + } + ivar0 = add(ivar0, 1); + } + ivar3 = 0; + while (ivar3 < getItemContainerLength(583)) { + ivar2 = globalarray_0[ivar3]; + if (ivar2 != -1) { + ivar1 = globalarray_1[ivar3]; + svar0 = concat(svar0, script_446(ivar1, ivar2)); + } else { + ivar3 = getItemContainerLength(583); + } + ivar3 = add(ivar3, 1); + } + ivar0 = 0; + ivar3 = 0; + while (ivar3 < getItemContainerLength(583)) { + globalarray_0[ivar3] = -1; + globalarray_0[ivar3] = 0; + ivar3 = add(ivar3, 1); + } + ivar3 = 0; + ivar5 = 0; + while (ivar0 < getItemContainerLength(583)) { + ivar2 = getItemIdInSlotSplit(583, ivar0); + ivar1 = getItemAmtInSlotSplit(583, ivar0); + if (ivar2 != -1) { + ivar4 = 99; + ivar5 = 0; + while (ivar5 < getItemContainerLength(583)) { + if (globalarray_0[ivar5] != -1) { + if (globalarray_0[ivar5] == ivar2) { + ivar4 = ivar5; + ivar5 = getItemContainerLength(583); + } + ivar5 = add(ivar5, 1); + } else { + ivar5 = getItemContainerLength(583); + } + } + if (ivar4 == 99) { + globalarray_0[ivar3] = ivar2; + globalarray_0[ivar3] = ivar1; + ivar3 = add(ivar3, 1); + } else { + globalarray_0[ivar4] = add(globalarray_1[ivar4], ivar1); + } + } + ivar0 = add(ivar0, 1); + } + ivar3 = 0; + while (ivar3 < getItemContainerLength(583)) { + ivar2 = globalarray_0[ivar3]; + if (ivar2 != -1) { + ivar1 = globalarray_1[ivar3]; + svar1 = concat(svar1, script_446(ivar1, ivar2)); + } else { + ivar3 = getItemContainerLength(583); + } + ivar3 = add(ivar3, 1); + } + if (strLength(svar0) > 0) { + setWidgetText(new WidgetPointer(1023,14), svar0); + script_447(67043343, 67043341, 67043342); + setWidgetIsHidden(true, new WidgetPointer(1023,12)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1023,12)); + } + if (strLength(svar1) > 0) { + setWidgetText(new WidgetPointer(1023,21), svar1); + script_447(67043350, 67043348, 67043349); + setWidgetIsHidden(true, new WidgetPointer(1023,19)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1023,19)); + } + return; +} diff --git a/dumps/scripts/4440.cs2 b/dumps/scripts/4440.cs2 new file mode 100644 index 000000000..24ed591a3 --- /dev/null +++ b/dumps/scripts/4440.cs2 @@ -0,0 +1,4 @@ +void script_4440(int arg0) { + script_4441(arg0); + return; +} diff --git a/dumps/scripts/4441.cs2 b/dumps/scripts/4441.cs2 new file mode 100644 index 000000000..e1b5293ed --- /dev/null +++ b/dumps/scripts/4441.cs2 @@ -0,0 +1,12 @@ +void script_4441(int arg0) { + string svar0; + string svar1; + script_4445(); + svar0 = ""; + svar1 = ""; + if ((arg0 > 0) && (arg0 < 8)) { + return; + } + svar0 = concat(svar0, "To join a clan channel as a" + "
" + "guest, use the button in the top-left" + "
" + "and enter the name of" + "
" + "the clan you wish to chat in." + "
" + "
" + "To talk, start your chat with ///." + "
" + "If you belong to another clan, you" + "
" + "can still talk to them by" + "
" + "starting your chat with //."); + return; +} diff --git a/dumps/scripts/4442.cs2 b/dumps/scripts/4442.cs2 new file mode 100644 index 000000000..b2e2f242b --- /dev/null +++ b/dumps/scripts/4442.cs2 @@ -0,0 +1,3 @@ +string script_4442() { + return "You are not currently" + "
" + "a guest in a Clan Chat." + "
" + "
" + "To join a Clan Chat as a" + "
" + "guest, click the join icon" + "
" + "and enter the name of" + "
" + "the clan you wish to chat with."; +} diff --git a/dumps/scripts/4443.cs2 b/dumps/scripts/4443.cs2 new file mode 100644 index 000000000..f1601599e --- /dev/null +++ b/dumps/scripts/4443.cs2 @@ -0,0 +1,8 @@ +void script_4443(int arg0) { + if (cs2method3750()) { + script_4444(arg0); + } else { + script_4445(); + } + return; +} diff --git a/dumps/scripts/4444.cs2 b/dumps/scripts/4444.cs2 new file mode 100644 index 000000000..ad89d1bad --- /dev/null +++ b/dumps/scripts/4444.cs2 @@ -0,0 +1,216 @@ +void script_4444(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + int stack_dump0; + ivar1 = 9; + ivar2 = 23; + script_4445(); + setWidgetSprite(6255, new WidgetPointer(1110,96)); + setWidgetIsHidden(true, new WidgetPointer(1110,64)); + setWidgetText(new WidgetPointer(1110,70), ""); + if (globalint_1513 != 1) { + globalint_1513 = 1; + } + ivar3 = 72744965; + ivar4 = 72744968; + ivar5 = 72744966; + ivar6 = 72744967; + ivar7 = 72744998; + ivar8 = 72744997; + ivar9 = 72744969; + ivar10 = 72745023; + deleteAllExtraChilds(new WidgetPointer(ivar3)); + deleteAllExtraChilds(new WidgetPointer(ivar4)); + deleteAllExtraChilds(new WidgetPointer(ivar5)); + deleteAllExtraChilds(new WidgetPointer(ivar6)); + ivar11 = 0; + ivar12 = cs2method3755(); + ivar13 = getWidgetActualWidth(new WidgetPointer(ivar7)); + if (arg0 <= -1) { + arg0 = getWidgetActualX(new WidgetPointer(ivar7)); + } + arg0 = max(min(arg0, subtract(getWidgetActualWidth(new WidgetPointer(ivar8)), ivar13)), 0); + globalint_1506 = arg0; + setWidgetPosition(arg0, 0, 0, 1, new WidgetPointer(ivar7)); + setWidgetIsHidden(false, new WidgetPointer(ivar7)); + cs2method2314(149, new WidgetPointer(ivar7)); + ivar11 = 0; + ivar14 = 2; + svar0 = ""; + ivar15 = 19; + ivar16 = divide(getWidgetActualHeight(new WidgetPointer(ivar3)), ivar15); + svar1 = ""; + ivar17 = 0; + svar2 = ""; + ivar18 = 0; + ivar19 = 0; + svar3 = ""; + ivar20 = -1; + ivar21 = script_3365(ivar8); + ivar22 = subtract(add(arg0, ivar21), script_3365(ivar3)); + ivar23 = subtract(getWidgetActualWidth(new WidgetPointer(ivar5)), add(add(arg0, subtract(ivar21, script_3365(ivar5))), ivar13)); + setWidgetContextMenuOption(1, new WidgetPointer(1110,95), "Leave chat"); + setWidgetSprite(6255, new WidgetPointer(1110,96)); + setWidgetSize(ivar23, 0, 0, 1, new WidgetPointer(ivar5)); + setWidgetSize(ivar23, 0, 0, 1, new WidgetPointer(ivar6)); + setWidgetText(new WidgetPointer(1110,65), cs2method3752()); + svar4 = "Leave another" + "
" + "clan's clanchat."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -1, svar4, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1110,95)); + setWidgetContextMenuOption(1, new WidgetPointer(1110,95), "Leave Clan Chat channel"); + while (ivar11 < ivar12) { + svar1 = cs2method3756(ivar11); + ivar20 = cs2method3757(ivar11); + createExtraChild(new WidgetPointer(ivar3), 4, getExtraChildGap(new WidgetPointer(ivar3))); + setWidgetTextAlignment(0, 1, 0); + setWidgetPosition(0, ivar14, 0, 0); + setWidgetSize(ivar22, ivar15, 0, 0); + setWidgetRGB(new Color(164, 153, 125)); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + setWidgetText(svar1); + if (stringMethod4107(svar1, strRemoveEntities(cs2method5020())) != 0) { + if (isFriend(svar1)) { + setWidgetContextMenuOption(1, "Message"); + setWidgetContextMenuOption(7, "Remove friend " + svar1); + } else if (cs2method3623(svar1)) { + setWidgetContextMenuOption(8, "Remove ignore " + svar1); + } else { + setWidgetContextMenuOption(5, "Add friend " + svar1); + setWidgetContextMenuOption(6, "Add ignore " + svar1); + } + } + setScriptCallOnClickContextMenu(4472, svar1, -2147483644, ivar11, "sii"); + svar0 = "\u00a0\u00a0\u00a0" + svar1; + if (getTextWidth(3793, svar0) > ivar22) { + while ((getTextWidth(3793, svar0 + "...") > ivar22) && (strLength(svar0) > 0)) { + svar0 = substr(0, subtract(strLength(svar0), 1), svar0); + } + svar0 = svar0 + "..."; + setScriptCallOnMouseOver(1594, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -2147483643, svar1, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1110,60), "I"); + } + setWidgetText(svar0); + setWidgetUnknownBoolean(true); + ivar17 = cs2method3758(ivar11); + if ((ivar17 >= 1100) && (ivar17 < 5001)) { + svar2 = "Lobby"; + svar3 = "Lobby"; + ivar18 = 0; + } else if ((ivar17 >= 5001) && (ivar17 < 6000)) { + svar2 = "Classic " + intToStr(subtract(ivar17, 5000)); + svar3 = "Classic " + intToStr(subtract(ivar17, 5000)); + ivar18 = 0; + } else { + svar2 = intToStr(ivar17); + svar3 = "World " + intToStr(ivar17); + ivar18 = add(add(2, 24), 2); + } + ivar19 = getTextWidth(3793, svar2); + createExtraChild(new WidgetPointer(ivar6), 5, getExtraChildGap(new WidgetPointer(ivar6))); + if (ivar23 >= add(ivar19, ivar18)) { + if (ivar18 > 0) { + setWidgetSprite(2173); + setWidgetSize(24, 12, 0, 0); + setWidgetPosition(2, add(ivar14, 1), 0, 0); + setScriptCallOnMouseOver(1594, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -2147483643, svar3, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1110,60), "I"); + } + } else { + ivar18 = 0; + } + if (ivar23 >= ivar19) { + } else { + setScriptCallOnMouseOver(1594, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -2147483643, svar3, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1110,60), "I"); + svar2 = "..."; + } + createExtraChild(new WidgetPointer(ivar5), 4, getExtraChildGap(new WidgetPointer(ivar5))); + setWidgetSize(ivar23, ivar15, 0, 0); + setWidgetPosition(add(ivar18, 2), ivar14, 0, 0); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 0, 0); + setWidgetText(svar2); + if (ivar17 == getWorldId()) { + setWidgetRGB(new Color(60, 183, 30)); + } else { + setWidgetRGB(new Color(255, 255, 100)); + } + setScriptCallOnMouseOver(1594, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -2147483643, svar3, -2147483647, -2147483646, "IIisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1110,60), "I"); + createExtraChild(new WidgetPointer(ivar4), 5, getExtraChildGap(new WidgetPointer(ivar4))); + if (ivar20 == 127) { + setWidgetPosition(3, 3, 0, 0); + setWidgetSize(9, 9, 0, 0); + } else { + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(15, 15, 0, 0); + } + setWidgetSprite(cs2method_3408(105, 100, 3712, ivar20)); + ivar11 = add(ivar11, 1); + } + ivar11 = 0; + ivar24 = 0; + while (ivar11 < ivar12) { + stack_dump0 = ivar11; + cs2method3761(); + ivar24 = stack_dump0; + if (setWidgetRegister(new WidgetPointer(ivar3), ivar24) && (stringMethod4107(getWidgetText(), "") != 0)) { + ivar14 = multiply(ivar11, ivar15); + setWidgetPosition(getWidgetActualX(), ivar14, 0, 0); + if (setWidgetRegister(new WidgetPointer(ivar4), ivar24)) { + setWidgetPosition(getWidgetActualX(), add(add(getWidgetActualY(), ivar14), 3), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(ivar5), ivar24)) { + setWidgetPosition(getWidgetActualX(), ivar14, 0, 0); + } + if (setWidgetRegister(new WidgetPointer(ivar6), ivar24)) { + setWidgetPosition(getWidgetActualX(), add(ivar14, 2), 0, 0); + } + } + ivar11 = add(ivar11, 1); + } + if (multiply(ivar11, 19) > getWidgetActualHeight(new WidgetPointer(ivar9))) { + setWidgetScrollMax(0, multiply(ivar11, 19), new WidgetPointer(ivar9)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(ivar9)); + } + ivar25 = cs2method2601(new WidgetPointer(ivar9)); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar9)), multiply(ivar15, ivar12), new WidgetPointer(ivar9)); + ivar25 = min(ivar25, getWidgetScrollMaxV(new WidgetPointer(ivar9))); + cs2method2100(0, ivar25, new WidgetPointer(ivar9)); + script_31(ivar10, ivar9, 5666, 5663, 5664, 5665, 5686, 5685); + setScriptCallOnClanChatDeltaStuff(4443, -1, "i", new WidgetPointer(ivar3)); + setScriptCallOnClanChatSettingsStuff(4443, -1, "i", new WidgetPointer(ivar3)); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(1110,25)), multiply(ivar15, ivar12), new WidgetPointer(1110,25)); + script_31(72744989, 72744985, 5666, 5663, 5664, 5665, 5686, 5685); + return; +} diff --git a/dumps/scripts/4445.cs2 b/dumps/scripts/4445.cs2 new file mode 100644 index 000000000..723f070b2 --- /dev/null +++ b/dumps/scripts/4445.cs2 @@ -0,0 +1,17 @@ +void script_4445() { + string svar0; + deleteAllExtraChilds(new WidgetPointer(1110,5)); + deleteAllExtraChilds(new WidgetPointer(1110,8)); + deleteAllExtraChilds(new WidgetPointer(1110,6)); + deleteAllExtraChilds(new WidgetPointer(1110,7)); + deleteAllExtraChilds(new WidgetPointer(1110,4)); + setWidgetContextMenuOption(1, new WidgetPointer(1110,95), "Join chat"); + setWidgetSprite(6256, new WidgetPointer(1110,96)); + setWidgetIsHidden(true, new WidgetPointer(1110,38)); + setWidgetIsHidden(false, new WidgetPointer(1110,64)); + setWidgetText(new WidgetPointer(1110,65), ""); + svar0 = "Join another" + "
" + "clan's clanchat."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1110,95)); + setWidgetContextMenuOption(1, new WidgetPointer(1110,95), "Join Clan Chat channel"); + return; +} diff --git a/dumps/scripts/4446.cs2 b/dumps/scripts/4446.cs2 new file mode 100644 index 000000000..098ca053d --- /dev/null +++ b/dumps/scripts/4446.cs2 @@ -0,0 +1,4 @@ +void script_4446(int arg0) { + script_4447(); + return; +} diff --git a/dumps/scripts/4447.cs2 b/dumps/scripts/4447.cs2 new file mode 100644 index 000000000..7b7e5218b --- /dev/null +++ b/dumps/scripts/4447.cs2 @@ -0,0 +1,3 @@ +void script_4447() { + return; +} diff --git a/dumps/scripts/4448.cs2 b/dumps/scripts/4448.cs2 new file mode 100644 index 000000000..9881b54a2 --- /dev/null +++ b/dumps/scripts/4448.cs2 @@ -0,0 +1,3 @@ +void script_4448(int arg0) { + return; +} diff --git a/dumps/scripts/4449.cs2 b/dumps/scripts/4449.cs2 new file mode 100644 index 000000000..9163f458c --- /dev/null +++ b/dumps/scripts/4449.cs2 @@ -0,0 +1,10 @@ +void script_4449(int arg0) { + if (cs2method5428(72744974, -1)) { + setScriptCallOnGameloop(4450, "", new WidgetPointer(1110,14)); + return; + } + if (cs2method3751()) { + script_4451(); + } + return; +} diff --git a/dumps/scripts/445.cs2 b/dumps/scripts/445.cs2 new file mode 100644 index 000000000..963e93d22 --- /dev/null +++ b/dumps/scripts/445.cs2 @@ -0,0 +1,4 @@ +void script_445() { + script_304(39341872); + return; +} diff --git a/dumps/scripts/4450.cs2 b/dumps/scripts/4450.cs2 new file mode 100644 index 000000000..7761149ea --- /dev/null +++ b/dumps/scripts/4450.cs2 @@ -0,0 +1,10 @@ +void script_4450() { + if (cs2method5428(72744974, -1)) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(1110,14)); + if (cs2method3751()) { + script_4451(); + } + return; +} diff --git a/dumps/scripts/4451.cs2 b/dumps/scripts/4451.cs2 new file mode 100644 index 000000000..14047f7dd --- /dev/null +++ b/dumps/scripts/4451.cs2 @@ -0,0 +1,4 @@ +void script_4451() { + script_4436(72744974, getWidgetActualX(new WidgetPointer(1110,27))); + return; +} diff --git a/dumps/scripts/4452.cs2 b/dumps/scripts/4452.cs2 new file mode 100644 index 000000000..c610a36ef --- /dev/null +++ b/dumps/scripts/4452.cs2 @@ -0,0 +1,6 @@ +void script_4452(int arg0) { + if (cs2method3751()) { + script_4436(72744974, arg0); + } + return; +} diff --git a/dumps/scripts/4453.cs2 b/dumps/scripts/4453.cs2 new file mode 100644 index 000000000..e2fe68d46 --- /dev/null +++ b/dumps/scripts/4453.cs2 @@ -0,0 +1,4 @@ +void script_4453() { + setScriptCallOnGameloop(4454, new WidgetPointer(1110,5), getClientCycle(), "Ii", new WidgetPointer(1110,52)); + return; +} diff --git a/dumps/scripts/4454.cs2 b/dumps/scripts/4454.cs2 new file mode 100644 index 000000000..0a450d44a --- /dev/null +++ b/dumps/scripts/4454.cs2 @@ -0,0 +1,13 @@ +void script_4454(int arg0,int arg1) { + if (cs2method3750()) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(1110,52)); + script_4444(globalint_1506); + } else { + setWidgetSprite(6256, new WidgetPointer(1110,96)); + if (subtract(getClientCycle(), arg1) > 200) { + script_4445(); + setScriptCallOnGameloop(4454, new WidgetPointer(arg0), getClientCycle(), "Ii", new WidgetPointer(1110,52)); + } + } + return; +} diff --git a/dumps/scripts/4455.cs2 b/dumps/scripts/4455.cs2 new file mode 100644 index 000000000..a89a3b854 --- /dev/null +++ b/dumps/scripts/4455.cs2 @@ -0,0 +1,4 @@ +void script_4455() { + script_4456(); + return; +} diff --git a/dumps/scripts/4456.cs2 b/dumps/scripts/4456.cs2 new file mode 100644 index 000000000..747d30bef --- /dev/null +++ b/dumps/scripts/4456.cs2 @@ -0,0 +1,9 @@ +void script_4456() { + setWidgetIsHidden(false, new WidgetPointer(1110,34)); + setWidgetIsHidden(true, new WidgetPointer(1110,36)); + setWidgetIsHidden(true, new WidgetPointer(1110,35)); + setWidgetIsHidden(false, new WidgetPointer(1110,57)); + setWidgetIsHidden(true, new WidgetPointer(1110,59)); + setWidgetIsHidden(true, new WidgetPointer(1110,55)); + return; +} diff --git a/dumps/scripts/4457.cs2 b/dumps/scripts/4457.cs2 new file mode 100644 index 000000000..79943a139 --- /dev/null +++ b/dumps/scripts/4457.cs2 @@ -0,0 +1,4 @@ +void script_4457() { + script_4458(); + return; +} diff --git a/dumps/scripts/4458.cs2 b/dumps/scripts/4458.cs2 new file mode 100644 index 000000000..b52ba0328 --- /dev/null +++ b/dumps/scripts/4458.cs2 @@ -0,0 +1,9 @@ +void script_4458() { + setWidgetIsHidden(true, new WidgetPointer(1110,34)); + setWidgetIsHidden(false, new WidgetPointer(1110,36)); + setWidgetIsHidden(true, new WidgetPointer(1110,35)); + setWidgetIsHidden(true, new WidgetPointer(1110,57)); + setWidgetIsHidden(false, new WidgetPointer(1110,59)); + setWidgetIsHidden(true, new WidgetPointer(1110,55)); + return; +} diff --git a/dumps/scripts/4459.cs2 b/dumps/scripts/4459.cs2 new file mode 100644 index 000000000..abfa79a8d --- /dev/null +++ b/dumps/scripts/4459.cs2 @@ -0,0 +1,4 @@ +void script_4459() { + script_4460(); + return; +} diff --git a/dumps/scripts/446.cs2 b/dumps/scripts/446.cs2 new file mode 100644 index 000000000..e23591cda --- /dev/null +++ b/dumps/scripts/446.cs2 @@ -0,0 +1,19 @@ +string script_446(int arg0,int arg1) { + string svar0; + string svar1; + string svar2; + svar0 = ""; + svar1 = ""; + svar2 = ""; + if (itemIsStackable(arg1)) { + svar2 = concat(svar2, "" + getItemName(arg1) + "" + " x " + "" + intToStr(arg0) + "
"); + } else if (arg0 < 100000) { + svar0 = script_46(arg0, ","); + svar2 = concat(svar2, "" + getItemName(arg1) + "" + " x " + "" + svar0 + "
"); + } else { + svar0 = script_46(arg0, ","); + svar1 = script_46(divide(arg0, 1000), ","); + svar2 = concat(svar2, "" + getItemName(arg1) + "" + " x " + "" + svar1 + "K (" + svar0 + ")" + "
"); + } + return svar2; +} diff --git a/dumps/scripts/4460.cs2 b/dumps/scripts/4460.cs2 new file mode 100644 index 000000000..7f06beb6c --- /dev/null +++ b/dumps/scripts/4460.cs2 @@ -0,0 +1,10 @@ +void script_4460() { + setWidgetIsHidden(true, new WidgetPointer(1110,34)); + setWidgetIsHidden(true, new WidgetPointer(1110,36)); + setWidgetIsHidden(false, new WidgetPointer(1110,35)); + setWidgetIsHidden(true, new WidgetPointer(1110,57)); + setWidgetIsHidden(true, new WidgetPointer(1110,59)); + setWidgetIsHidden(false, new WidgetPointer(1110,55)); + script_4462(); + return; +} diff --git a/dumps/scripts/4461.cs2 b/dumps/scripts/4461.cs2 new file mode 100644 index 000000000..ef72018dd --- /dev/null +++ b/dumps/scripts/4461.cs2 @@ -0,0 +1,4 @@ +void script_4461() { + script_4462(); + return; +} diff --git a/dumps/scripts/4462.cs2 b/dumps/scripts/4462.cs2 new file mode 100644 index 000000000..61221337a --- /dev/null +++ b/dumps/scripts/4462.cs2 @@ -0,0 +1,78 @@ +void script_4462() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + string svar0; + ivar0 = 0; + ivar1 = 0; + ivar2 = 19; + svar0 = ""; + ivar3 = 72744971; + ivar4 = 72745001; + ivar5 = 72745000; + ivar6 = 72744970; + ivar7 = divide(getWidgetActualHeight(new WidgetPointer(ivar4)), 19); + ivar8 = 0; + deleteAllExtraChilds(new WidgetPointer(ivar3)); + deleteAllExtraChilds(new WidgetPointer(ivar6)); + if (cs2method3701()) { + setWidgetText(new WidgetPointer(1110,72), ""); + setWidgetIsHidden(true, new WidgetPointer(1110,42)); + ivar1 = cs2method3712(); + while (ivar0 < ivar1) { + ivar8 = multiply(ivar0, 19); + svar0 = cs2method3713(ivar0); + createExtraChild(new WidgetPointer(ivar3), 4, getExtraChildGap(new WidgetPointer(ivar3))); + setWidgetText(svar0); + setWidgetPosition(0, multiply(ivar0, ivar2), 0, 0); + setWidgetSize(16384, ivar2, 2, 0); + setWidgetRGB(new Color(164, 153, 125)); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + cs2method1305("" + svar0); + setWidgetContextMenuOption(1, "Remove ban"); + setScriptCallOnClickContextMenu(4580, ""); + setWidgetTextAlignment(0, 0, 0); + if (mod(ivar0, 2) != 0) { + createExtraChild(new WidgetPointer(ivar6), 3, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetSize(16384, ivar2, 2, 0); + setWidgetPosition(0, multiply(ivar0, ivar2), 0, 0); + setWidgetRGB(new Color(35, 34, 32)); + setWidgetFilled(1); + cs2method2103(128); + } + ivar0 = add(ivar0, 1); + } + while (ivar0 < ivar7) { + ivar8 = multiply(ivar0, ivar2); + if (mod(ivar0, 2) != 0) { + createExtraChild(new WidgetPointer(ivar6), 3, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetSize(16384, ivar2, 2, 0); + setWidgetPosition(0, ivar8, 0, 0); + setWidgetRGB(new Color(35, 34, 32)); + setWidgetFilled(1); + cs2method2103(128); + } + ivar0 = add(ivar0, 1); + } + } else { + setWidgetIsHidden(false, new WidgetPointer(1110,42)); + setWidgetText(new WidgetPointer(1110,72), "You must be part of a clan to" + "
" + "view the ban list."); + deleteAllExtraChilds(new WidgetPointer(ivar3)); + deleteAllExtraChilds(new WidgetPointer(ivar6)); + } + setWidgetIsHidden(false, new WidgetPointer(ivar5)); + ivar9 = cs2method2601(new WidgetPointer(1110,41)); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(1110,41)), multiply(ivar2, max(ivar1, ivar7)), new WidgetPointer(1110,41)); + ivar9 = min(ivar9, getWidgetScrollMaxV(new WidgetPointer(1110,41))); + cs2method2100(0, ivar9, new WidgetPointer(1110,41)); + script_31(72745000, 72745001, 5666, 5663, 5664, 5665, 5686, 5685); + return; +} diff --git a/dumps/scripts/4463.cs2 b/dumps/scripts/4463.cs2 new file mode 100644 index 000000000..9206dc4be --- /dev/null +++ b/dumps/scripts/4463.cs2 @@ -0,0 +1,33 @@ +void script_4463(int arg0,int arg1) { + int ivar2; + string svar0; + svar0 = ""; + ivar2 = 0; + if (cs2method3751()) { + if (cs2method3701()) { + svar0 = cs2method3756(arg0); + if (((boolean)arg1)) { + if (isFriend(svar0)) { + ivar2 = 1; + } else { + message(0, 0, "You only message people on your Friends List."); + } + } else { + if (arg1 == 8) { + script_4466(svar0); + } + } + } else { + messageType0("You must be in a clan to do that."); + } + } else { + messageType0("You must be in a clan to do that."); + } + if (((boolean)ivar2)) { + globalint_1650 = 1; + globalstring_23 = svar0; + script_1558(0); + return; + } + return; +} diff --git a/dumps/scripts/4464.cs2 b/dumps/scripts/4464.cs2 new file mode 100644 index 000000000..9c4134a38 --- /dev/null +++ b/dumps/scripts/4464.cs2 @@ -0,0 +1,17 @@ +int script_4464() { + int ivar0; + ivar0 = -1; + if (cs2method3701()) { + if (cs2method3751()) { + ivar0 = cs2method3717(strRemoveEntities(cs2method5020())); + if ((ivar0 != -1) && (cs2method3757(ivar0) >= cs2method3705())) { + return 1; + } + } else { + messageType0("You must be in a clan to do that."); + } + } else { + messageType0("You must be in a clan to do that."); + } + return 0; +} diff --git a/dumps/scripts/4465.cs2 b/dumps/scripts/4465.cs2 new file mode 100644 index 000000000..410deb160 --- /dev/null +++ b/dumps/scripts/4465.cs2 @@ -0,0 +1,8 @@ +void script_4465(string arg0) { + if (cs2method3751()) { + script_4466(arg0); + } else { + messageType0("You must be in your clan channel to do that."); + } + return; +} diff --git a/dumps/scripts/4466.cs2 b/dumps/scripts/4466.cs2 new file mode 100644 index 000000000..45696ce91 --- /dev/null +++ b/dumps/scripts/4466.cs2 @@ -0,0 +1,45 @@ +void script_4466(string arg0) { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar0 = cs2method3760(arg0); + if (ivar0 >= 0) { + if (ivar0 == -1) { + return; + } + ivar1 = cs2method3757(ivar0); + ivar2 = cs2method3760(strRemoveEntities(cs2method5020())); + if (ivar2 >= 0) { + if (ivar2 == ivar0) { + message(43, 0, "You cannot temporarily ban yourself."); + return; + } + ivar3 = cs2method3757(ivar2); + if (ivar2 == -1) { + return; + } + if (ivar3 >= cs2method3753()) { + if (ivar1 > -1) { + message(43, 0, "You can only temporarily ban guests."); + message(43, 0, "A clan admin can remove your clanmate."); + } else if (ivar3 > ivar1) { + cs2method3759(cs2method3760(arg0)); + cs2method5006(2); + cs2method5008("[Attempting to kick/ban " + arg0 + " from this channel.]"); + } else { + message(43, 0, "You can only kick people with a lower rank than yourself."); + } + } else { + message(43, 0, "You do not have sufficient rank to kick."); + } + } + } else { + message(43, 0, "Could not find that guest to kick from your Clan Chat."); + } + return; +} diff --git a/dumps/scripts/4467.cs2 b/dumps/scripts/4467.cs2 new file mode 100644 index 000000000..dcbe6841c --- /dev/null +++ b/dumps/scripts/4467.cs2 @@ -0,0 +1,16 @@ +int script_4467() { + int ivar0; + int ivar1; + ivar0 = -1; + ivar1 = -1; + if (cs2method3751()) { + ivar1 = cs2method3760(strRemoveEntities(cs2method5020())); + if (ivar1 >= 0) { + ivar0 = cs2method3757(ivar1); + if (ivar0 >= cs2method3753()) { + return 1; + } + } + } + return 0; +} diff --git a/dumps/scripts/4468.cs2 b/dumps/scripts/4468.cs2 new file mode 100644 index 000000000..1de2e323f --- /dev/null +++ b/dumps/scripts/4468.cs2 @@ -0,0 +1,14 @@ +int script_4468() { + int ivar0; + int ivar1; + ivar0 = -1; + ivar1 = -1; + ivar1 = cs2method3760(strRemoveEntities(cs2method5020())); + if (ivar1 >= 0) { + ivar0 = cs2method3757(ivar1); + if (ivar0 >= cs2method3753()) { + return 1; + } + } + return 0; +} diff --git a/dumps/scripts/4469.cs2 b/dumps/scripts/4469.cs2 new file mode 100644 index 000000000..a60f138ac --- /dev/null +++ b/dumps/scripts/4469.cs2 @@ -0,0 +1,13 @@ +void script_4469() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (((boolean)script_4467())) { + setWidgetIsHidden(false, new WidgetPointer(1110,22)); + setWidgetIsHidden(true, new WidgetPointer(1110,110)); + } else { + script_4471(); + } + return; +} diff --git a/dumps/scripts/447.cs2 b/dumps/scripts/447.cs2 new file mode 100644 index 000000000..791137a08 --- /dev/null +++ b/dumps/scripts/447.cs2 @@ -0,0 +1,17 @@ +void script_447(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + string svar0; + svar0 = getWidgetText(new WidgetPointer(arg2)); + ivar3 = getWidgetActualWidth(new WidgetPointer(arg2)); + ivar4 = getLineCount(ivar3, 494, svar0); + ivar5 = add(multiply(ivar4, 10), 5); + if (ivar5 > getWidgetActualHeight(new WidgetPointer(arg1))) { + setWidgetScrollMax(0, ivar5, new WidgetPointer(arg1)); + script_31(arg0, arg1, 2598, 2595, 2596, 2597, 2593, 2594); + setWidgetTextAlignment(1, 0, 0, new WidgetPointer(arg2)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), ivar5, 0, 0, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/4470.cs2 b/dumps/scripts/4470.cs2 new file mode 100644 index 000000000..5aff04ebb --- /dev/null +++ b/dumps/scripts/4470.cs2 @@ -0,0 +1,13 @@ +void script_4470() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (((boolean)script_4468())) { + setWidgetIsHidden(false, new WidgetPointer(1110,22)); + setWidgetIsHidden(true, new WidgetPointer(1110,110)); + return; + } + script_4471(); + return; +} diff --git a/dumps/scripts/4471.cs2 b/dumps/scripts/4471.cs2 new file mode 100644 index 000000000..0b1b4cdd8 --- /dev/null +++ b/dumps/scripts/4471.cs2 @@ -0,0 +1,4 @@ +void script_4471() { + setWidgetIsHidden(false, new WidgetPointer(1110,110)); + return; +} diff --git a/dumps/scripts/4472.cs2 b/dumps/scripts/4472.cs2 new file mode 100644 index 000000000..c8881a274 --- /dev/null +++ b/dumps/scripts/4472.cs2 @@ -0,0 +1,38 @@ +void script_4472(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + switch (arg0) { + case 1: + globalint_1650 = 1; + globalstring_23 = arg2; + script_1558(0); + return; + case 5: + messageType0("Attempting to add " + arg2 + " to your Friends List."); + arg2 = strRemoveEntities(arg2); + cs2method3605(arg2); + break; + case 6: + messageType0("Attempting to add " + arg2 + " to your Ignore List."); + arg2 = strRemoveEntities(arg2); + cs2method3607(arg2); + break; + case 7: + messageType0("Attempting to remove " + arg2 + " from your Friends List."); + arg2 = strRemoveEntities(arg2); + cs2method3606(arg2); + break; + case 8: + messageType0("Attempting to remove " + arg2 + " from your Ignore List."); + arg2 = strRemoveEntities(arg2); + cs2method3608(arg2); + break; + case 9: + script_4465(arg2); + } + return; +} diff --git a/dumps/scripts/4473.cs2 b/dumps/scripts/4473.cs2 new file mode 100644 index 000000000..a18502e5d --- /dev/null +++ b/dumps/scripts/4473.cs2 @@ -0,0 +1,4 @@ +void script_4473(int arg0,int arg1) { + script_4474(arg0, arg1); + return; +} diff --git a/dumps/scripts/4474.cs2 b/dumps/scripts/4474.cs2 new file mode 100644 index 000000000..f3599e7f5 --- /dev/null +++ b/dumps/scripts/4474.cs2 @@ -0,0 +1,4 @@ +void script_4474(int arg0,int arg1) { + script_4493(arg0, arg1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + return; +} diff --git a/dumps/scripts/4475.cs2 b/dumps/scripts/4475.cs2 new file mode 100644 index 000000000..228bf70a8 --- /dev/null +++ b/dumps/scripts/4475.cs2 @@ -0,0 +1,4 @@ +void script_4475(int arg0,int arg1,int arg2) { + script_4476(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4476.cs2 b/dumps/scripts/4476.cs2 new file mode 100644 index 000000000..f5052f8de --- /dev/null +++ b/dumps/scripts/4476.cs2 @@ -0,0 +1,4 @@ +void script_4476(int arg0,int arg1,int arg2) { + script_4493(arg0, arg1, arg2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + return; +} diff --git a/dumps/scripts/4477.cs2 b/dumps/scripts/4477.cs2 new file mode 100644 index 000000000..285703807 --- /dev/null +++ b/dumps/scripts/4477.cs2 @@ -0,0 +1,4 @@ +void script_4477(int arg0,int arg1,int arg2,int arg3) { + script_4478(arg0, arg1, arg2, arg3); + return; +} diff --git a/dumps/scripts/4478.cs2 b/dumps/scripts/4478.cs2 new file mode 100644 index 000000000..a30b9e2e5 --- /dev/null +++ b/dumps/scripts/4478.cs2 @@ -0,0 +1,4 @@ +void script_4478(int arg0,int arg1,int arg2,int arg3) { + script_4493(arg0, arg1, arg2, arg3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + return; +} diff --git a/dumps/scripts/4479.cs2 b/dumps/scripts/4479.cs2 new file mode 100644 index 000000000..c1b413f00 --- /dev/null +++ b/dumps/scripts/4479.cs2 @@ -0,0 +1,4 @@ +void script_4479(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_4480(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/448.cs2 b/dumps/scripts/448.cs2 new file mode 100644 index 000000000..dfba800d8 --- /dev/null +++ b/dumps/scripts/448.cs2 @@ -0,0 +1,8 @@ +void script_448() { + if (((boolean)bitconfig_7537)) { + setWidgetSprite(3745, new WidgetPointer(1019,10)); + } else { + setWidgetSprite(3746, new WidgetPointer(1019,10)); + } + return; +} diff --git a/dumps/scripts/4480.cs2 b/dumps/scripts/4480.cs2 new file mode 100644 index 000000000..bd9edc3d3 --- /dev/null +++ b/dumps/scripts/4480.cs2 @@ -0,0 +1,4 @@ +void script_4480(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_4493(arg0, arg1, arg2, arg3, arg4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + return; +} diff --git a/dumps/scripts/4481.cs2 b/dumps/scripts/4481.cs2 new file mode 100644 index 000000000..9070e7173 --- /dev/null +++ b/dumps/scripts/4481.cs2 @@ -0,0 +1,4 @@ +void script_4481(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_4482(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/4482.cs2 b/dumps/scripts/4482.cs2 new file mode 100644 index 000000000..60574076e --- /dev/null +++ b/dumps/scripts/4482.cs2 @@ -0,0 +1,4 @@ +void script_4482(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_4493(arg0, arg1, arg2, arg3, arg4, arg5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + return; +} diff --git a/dumps/scripts/4483.cs2 b/dumps/scripts/4483.cs2 new file mode 100644 index 000000000..1d517cf34 --- /dev/null +++ b/dumps/scripts/4483.cs2 @@ -0,0 +1,4 @@ +void script_4483(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + script_4484(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + return; +} diff --git a/dumps/scripts/4484.cs2 b/dumps/scripts/4484.cs2 new file mode 100644 index 000000000..948eb85e8 --- /dev/null +++ b/dumps/scripts/4484.cs2 @@ -0,0 +1,4 @@ +void script_4484(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + script_4493(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + return; +} diff --git a/dumps/scripts/4485.cs2 b/dumps/scripts/4485.cs2 new file mode 100644 index 000000000..715269796 --- /dev/null +++ b/dumps/scripts/4485.cs2 @@ -0,0 +1,4 @@ +void script_4485(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15) { + script_4486(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); + return; +} diff --git a/dumps/scripts/4486.cs2 b/dumps/scripts/4486.cs2 new file mode 100644 index 000000000..546f5d7c5 --- /dev/null +++ b/dumps/scripts/4486.cs2 @@ -0,0 +1,4 @@ +void script_4486(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15) { + script_4493(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + return; +} diff --git a/dumps/scripts/4487.cs2 b/dumps/scripts/4487.cs2 new file mode 100644 index 000000000..f84d0e5ae --- /dev/null +++ b/dumps/scripts/4487.cs2 @@ -0,0 +1,4 @@ +void script_4487(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20) { + script_4488(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20); + return; +} diff --git a/dumps/scripts/4488.cs2 b/dumps/scripts/4488.cs2 new file mode 100644 index 000000000..2ea624889 --- /dev/null +++ b/dumps/scripts/4488.cs2 @@ -0,0 +1,4 @@ +void script_4488(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20) { + script_4493(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); + return; +} diff --git a/dumps/scripts/4489.cs2 b/dumps/scripts/4489.cs2 new file mode 100644 index 000000000..f7391ad06 --- /dev/null +++ b/dumps/scripts/4489.cs2 @@ -0,0 +1,4 @@ +void script_4489(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,int arg21,int arg22,int arg23,int arg24,int arg25) { + script_4490(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25); + return; +} diff --git a/dumps/scripts/449.cs2 b/dumps/scripts/449.cs2 new file mode 100644 index 000000000..d4bd21f8f --- /dev/null +++ b/dumps/scripts/449.cs2 @@ -0,0 +1,4 @@ +void script_449() { + script_304(35082088); + return; +} diff --git a/dumps/scripts/4490.cs2 b/dumps/scripts/4490.cs2 new file mode 100644 index 000000000..261d00180 --- /dev/null +++ b/dumps/scripts/4490.cs2 @@ -0,0 +1,4 @@ +void script_4490(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,int arg21,int arg22,int arg23,int arg24,int arg25) { + script_4493(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, -1, -1, -1, -1, -1); + return; +} diff --git a/dumps/scripts/4491.cs2 b/dumps/scripts/4491.cs2 new file mode 100644 index 000000000..93f38c565 --- /dev/null +++ b/dumps/scripts/4491.cs2 @@ -0,0 +1,4 @@ +void script_4491(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,int arg21,int arg22,int arg23,int arg24,int arg25,int arg26,int arg27,int arg28,int arg29,int arg30) { + script_4492(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, arg26, arg27, arg28, arg29, arg30); + return; +} diff --git a/dumps/scripts/4492.cs2 b/dumps/scripts/4492.cs2 new file mode 100644 index 000000000..0c75d41ab --- /dev/null +++ b/dumps/scripts/4492.cs2 @@ -0,0 +1,4 @@ +void script_4492(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,int arg21,int arg22,int arg23,int arg24,int arg25,int arg26,int arg27,int arg28,int arg29,int arg30) { + script_4493(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, arg26, arg27, arg28, arg29, arg30); + return; +} diff --git a/dumps/scripts/4493.cs2 b/dumps/scripts/4493.cs2 new file mode 100644 index 000000000..459e4a1a8 --- /dev/null +++ b/dumps/scripts/4493.cs2 @@ -0,0 +1,96 @@ +void script_4493(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,int arg21,int arg22,int arg23,int arg24,int arg25,int arg26,int arg27,int arg28,int arg29,int arg30) { + if (arg0 != -1) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + if (arg1 != -1) { + script_4504(arg1); + } + if (arg2 != -1) { + script_4504(arg2); + } + if (arg3 != -1) { + script_4504(arg3); + } + if (arg4 != -1) { + script_4504(arg4); + } + if (arg5 != -1) { + script_4504(arg5); + } + if (arg6 != -1) { + script_4504(arg6); + } + if (arg7 != -1) { + script_4504(arg7); + } + if (arg8 != -1) { + script_4504(arg8); + } + if (arg9 != -1) { + script_4504(arg9); + } + if (arg10 != -1) { + script_4504(arg10); + } + if (arg11 != -1) { + script_4504(arg11); + } + if (arg12 != -1) { + script_4504(arg12); + } + if (arg13 != -1) { + script_4504(arg13); + } + if (arg14 != -1) { + script_4504(arg14); + } + if (arg15 != -1) { + script_4504(arg15); + } + if (arg16 != -1) { + script_4504(arg16); + } + if (arg17 != -1) { + script_4504(arg17); + } + if (arg18 != -1) { + script_4504(arg18); + } + if (arg19 != -1) { + script_4504(arg19); + } + if (arg20 != -1) { + script_4504(arg20); + } + if (arg21 != -1) { + script_4504(arg21); + } + if (arg22 != -1) { + script_4504(arg22); + } + if (arg23 != -1) { + script_4504(arg23); + } + if (arg24 != -1) { + script_4504(arg24); + } + if (arg25 != -1) { + script_4504(arg25); + } + if (arg26 != -1) { + script_4504(arg26); + } + if (arg27 != -1) { + script_4504(arg27); + } + if (arg28 != -1) { + script_4504(arg28); + } + if (arg29 != -1) { + script_4504(arg29); + } + if (arg30 != -1) { + script_4504(arg30); + } + return; +} diff --git a/dumps/scripts/4494.cs2 b/dumps/scripts/4494.cs2 new file mode 100644 index 000000000..ffecec75a --- /dev/null +++ b/dumps/scripts/4494.cs2 @@ -0,0 +1,23 @@ +void script_4494(int arg0,int arg1) { + int ivar2; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + if (ivar2 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 1, 0, "Iii", new WidgetPointer(arg0)); + } else if (ivar2 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } else if (ivar2 == 4) { + script_4208(arg0, 0); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } else { + if (ivar2 == 5) { + return; + } + } + script_4496(arg0, arg1); + return; +} diff --git a/dumps/scripts/4495.cs2 b/dumps/scripts/4495.cs2 new file mode 100644 index 000000000..e376edee0 --- /dev/null +++ b/dumps/scripts/4495.cs2 @@ -0,0 +1,4 @@ +void script_4495(int arg0,int arg1) { + script_4762(arg0, arg1); + return; +} diff --git a/dumps/scripts/4496.cs2 b/dumps/scripts/4496.cs2 new file mode 100644 index 000000000..7a773689f --- /dev/null +++ b/dumps/scripts/4496.cs2 @@ -0,0 +1,30 @@ +void script_4496(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1379); + ivar3 = getOtherCommonData(arg1, 1380); + ivar4 = getOtherCommonData(arg1, 1381); + ivar5 = getOtherCommonData(arg1, 1358); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(20, 20, 0, 0); + setWidgetSprite(ivar2); + cs2method2103(ivar5); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(multiply(20, 2), 20, 1, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar5); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(20, 20, 0, 0); + setWidgetSprite(ivar4); + cs2method2103(ivar5); + return; +} diff --git a/dumps/scripts/4497.cs2 b/dumps/scripts/4497.cs2 new file mode 100644 index 000000000..9182290dc --- /dev/null +++ b/dumps/scripts/4497.cs2 @@ -0,0 +1,4 @@ +void script_4497(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,string arg8) { + script_4499(arg0, 0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + return; +} diff --git a/dumps/scripts/4498.cs2 b/dumps/scripts/4498.cs2 new file mode 100644 index 000000000..541332d6f --- /dev/null +++ b/dumps/scripts/4498.cs2 @@ -0,0 +1,4 @@ +void script_4498(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,string arg8) { + script_4499(arg0, 1, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + return; +} diff --git a/dumps/scripts/4499.cs2 b/dumps/scripts/4499.cs2 new file mode 100644 index 000000000..d265c31fe --- /dev/null +++ b/dumps/scripts/4499.cs2 @@ -0,0 +1,85 @@ +void script_4499(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,string arg9) { + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + if (arg2 == -1) { + arg2 = subtract(getCommonDefinitionSize(arg0), 1); + } else { + arg2 = arg2; + } + deleteAllExtraChilds(new WidgetPointer(arg7)); + ivar9 = 0; + ivar10 = 5; + ivar11 = 0; + while (ivar9 <= arg2) { + createExtraChild(new WidgetPointer(arg7), 4, ivar9); + setWidgetText(cs2method_3408(105, 115, arg0, ivar9)); + if (((boolean)strLength(cs2method_3408(105, 115, arg0, ivar9)))) { + setWidgetPosition(5, ivar10, 0, 0); + setWidgetSize(5, 0, 1, 0); + setWidgetHidden(1); + } else { + setWidgetPosition(5, ivar10, 0, 0); + setWidgetSize(5, 15, 1, 0); + setWidgetFont(3793); + setWidgetRGB(new Color(111, 99, 79)); + setWidgetUnknownBoolean(true); + setScriptCallOnMouseEntered(4502, new WidgetPointer(arg6), new WidgetPointer(arg7), -2147483643, "IIi"); + ivar11 = add(ivar11, 1); + } + ivar10 = add(ivar10, getWidgetActualHeight()); + ivar9 = add(1, ivar9); + } + if (((boolean)arg1)) { + script_4508(arg7, subtract(ivar9, 1)); + } + arg3 = min(ivar11, arg3); + arg3 = max(arg3, 1); + ivar12 = multiply(15, arg3); + ivar13 = add(ivar12, multiply(5, 2)); + ivar14 = getWidgetParentId(new WidgetPointer(arg7)); + if (ivar14 == -1) { + return; + } + ivar15 = getWidgetParentId(new WidgetPointer(ivar14)); + if (ivar15 == -1) { + return; + } + ivar16 = getWidgetParentId(new WidgetPointer(ivar15)); + if (ivar16 == -1) { + return; + } + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar15)), add(ivar13, getWidgetActualHeight(new WidgetPointer(arg4))), 0, 0, new WidgetPointer(ivar15)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar15)), ivar13, 0, 0, new WidgetPointer(ivar14)); + if (getWidgetParentId(new WidgetPointer(ivar15)) == -1) { + return; + } + if (getWidgetActualHeight(new WidgetPointer(ivar16)) < getWidgetActualHeight(new WidgetPointer(ivar15))) { + return; + } + if ((getWidgetActualHeight(new WidgetPointer(ivar16)) < add(getWidgetActualY(new WidgetPointer(ivar15)), getWidgetActualHeight(new WidgetPointer(ivar15)))) && (subtract(add(getWidgetActualY(new WidgetPointer(ivar15)), getWidgetActualHeight(new WidgetPointer(arg4))), getWidgetActualHeight(new WidgetPointer(ivar15))) < 0)) { + return; + } + if (add(getWidgetActualY(new WidgetPointer(ivar15)), ivar13) > getWidgetActualHeight(new WidgetPointer(getWidgetParentId(new WidgetPointer(ivar15))))) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar15)), subtract(getWidgetActualY(new WidgetPointer(ivar15)), subtract(getWidgetActualHeight(new WidgetPointer(ivar15)), getWidgetActualHeight(new WidgetPointer(arg4)))), 0, 0, new WidgetPointer(ivar15)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(ivar14)); + setWidgetPosition(0, 0, 0, 2, new WidgetPointer(arg4)); + } else { + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(arg4)); + setWidgetPosition(0, 0, 0, 2, new WidgetPointer(ivar14)); + } + setWidgetIsHidden(true, new WidgetPointer(ivar14)); + setScriptCallOnMousePressed(4505, new WidgetPointer(arg7), new WidgetPointer(arg4), new WidgetPointer(arg8), "III", new WidgetPointer(arg4)); + setWidgetSize(0, 15, 1, 0, new WidgetPointer(arg6)); + setWidgetIsHidden(true, new WidgetPointer(arg6)); + setWidgetScrollMax(0, add(ivar10, 5), new WidgetPointer(arg7)); + deleteAllExtraChilds(new WidgetPointer(arg5)); + script_31(arg5, arg7, 5666, 5663, 5664, 5665, 5686, 5685); + script_4501(arg4, arg9); + return; +} diff --git a/dumps/scripts/45.cs2 b/dumps/scripts/45.cs2 new file mode 100644 index 000000000..55cb9b3ef --- /dev/null +++ b/dumps/scripts/45.cs2 @@ -0,0 +1,4 @@ +void script_45(int arg0,int arg1) { + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/450.cs2 b/dumps/scripts/450.cs2 new file mode 100644 index 000000000..79ea1db6e --- /dev/null +++ b/dumps/scripts/450.cs2 @@ -0,0 +1,4 @@ +void script_450() { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1019,11)); + return; +} diff --git a/dumps/scripts/4500.cs2 b/dumps/scripts/4500.cs2 new file mode 100644 index 000000000..c7aabbc58 --- /dev/null +++ b/dumps/scripts/4500.cs2 @@ -0,0 +1,4 @@ +void script_4500(int arg0,string arg1) { + script_4501(arg0, arg1); + return; +} diff --git a/dumps/scripts/4501.cs2 b/dumps/scripts/4501.cs2 new file mode 100644 index 000000000..4a6bbdb40 --- /dev/null +++ b/dumps/scripts/4501.cs2 @@ -0,0 +1,11 @@ +void script_4501(int arg0,string arg1) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetText(arg1); + setWidgetFont(3793); + setWidgetPosition(5, 0, 0, 1); + setWidgetSize(5, 16384, 1, 2); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + return; +} diff --git a/dumps/scripts/4502.cs2 b/dumps/scripts/4502.cs2 new file mode 100644 index 000000000..36d919e8a --- /dev/null +++ b/dumps/scripts/4502.cs2 @@ -0,0 +1,7 @@ +void script_4502(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg1), arg2) && (strLength(getWidgetText()) > 0)) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetPosition(0, getWidgetActualY(), 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4503.cs2 b/dumps/scripts/4503.cs2 new file mode 100644 index 000000000..6e52b28bf --- /dev/null +++ b/dumps/scripts/4503.cs2 @@ -0,0 +1,4 @@ +void script_4503(int arg0) { + script_4504(arg0); + return; +} diff --git a/dumps/scripts/4504.cs2 b/dumps/scripts/4504.cs2 new file mode 100644 index 000000000..b334d68f2 --- /dev/null +++ b/dumps/scripts/4504.cs2 @@ -0,0 +1,17 @@ +void script_4504(int arg0) { + int ivar1; + int ivar2; + ivar1 = getWidgetParentId(new WidgetPointer(arg0)); + if (ivar1 == -1) { + return; + } + ivar2 = subtract(getExtraChildGap(new WidgetPointer(ivar1)), 1); + while (ivar2 >= 0) { + if (setWidgetRegister(new WidgetPointer(ivar1), ivar2)) { + setWidgetNoOptions(); + } + ivar2 = subtract(ivar2, 1); + } + setWidgetIsHidden(true, new WidgetPointer(ivar1)); + return; +} diff --git a/dumps/scripts/4505.cs2 b/dumps/scripts/4505.cs2 new file mode 100644 index 000000000..5c3d5dddb --- /dev/null +++ b/dumps/scripts/4505.cs2 @@ -0,0 +1,4 @@ +void script_4505(int arg0,int arg1,int arg2) { + script_4506(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4506.cs2 b/dumps/scripts/4506.cs2 new file mode 100644 index 000000000..5a8540f1a --- /dev/null +++ b/dumps/scripts/4506.cs2 @@ -0,0 +1,32 @@ +void script_4506(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar3 = getWidgetParentId(new WidgetPointer(arg0)); + if (ivar3 == -1) { + return; + } + ivar4 = getWidgetParentId(new WidgetPointer(ivar3)); + if (ivar4 == -1) { + return; + } + ivar5 = getWidgetParentId(new WidgetPointer(arg1)); + if (ivar5 == -1) { + return; + } + setWidgetIsHidden(false, new WidgetPointer(ivar3)); + cs2method2005(1, new WidgetPointer(ivar3)); + if (arg2 != -1) { + setWidgetIsHidden(false, new WidgetPointer(arg2)); + } + ivar6 = subtract(getExtraChildGap(new WidgetPointer(arg0)), 1); + while (ivar6 >= 0) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar6) && (strLength(getWidgetText()) > 0)) { + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(4507, -2147483643, new WidgetPointer(arg0), new WidgetPointer(arg1), "iII"); + } + ivar6 = subtract(ivar6, 1); + } + return; +} diff --git a/dumps/scripts/4507.cs2 b/dumps/scripts/4507.cs2 new file mode 100644 index 000000000..da3fb4c04 --- /dev/null +++ b/dumps/scripts/4507.cs2 @@ -0,0 +1,16 @@ +void script_4507(int arg0,int arg1,int arg2) { + string svar0; + svar0 = ""; + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + svar0 = getWidgetText(); + } + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetText(svar0); + setWidgetFont(3793); + setWidgetPosition(5, 0, 0, 1); + setWidgetSize(5, 16384, 1, 2); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(0, 0, 0)); + return; +} diff --git a/dumps/scripts/4508.cs2 b/dumps/scripts/4508.cs2 new file mode 100644 index 000000000..a88d10731 --- /dev/null +++ b/dumps/scripts/4508.cs2 @@ -0,0 +1,28 @@ +void script_4508(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = 0; + globalarray_0 = new int[arg1]; + ivar3 = 0; + ivar4 = 5; + while (ivar2 <= arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar2) && (strLength(getWidgetText()) > 0)) { + globalarray_0[ivar3] = ivar2; + ivar3 = add(ivar3, 1); + } + ivar2 = add(ivar2, 1); + } + if (ivar3 > 1) { + script_4424(0, arg0, 0, subtract(ivar3, 1)); + } + ivar2 = 0; + while (ivar2 < ivar3) { + if (setWidgetRegister(new WidgetPointer(arg0), globalarray_0[ivar2])) { + setWidgetPosition(5, ivar4, 0, 0); + ivar4 = add(ivar4, getWidgetActualHeight()); + } + ivar2 = add(ivar2, 1); + } + return; +} diff --git a/dumps/scripts/4509.cs2 b/dumps/scripts/4509.cs2 new file mode 100644 index 000000000..61c92e4bd --- /dev/null +++ b/dumps/scripts/4509.cs2 @@ -0,0 +1,11 @@ +void script_4509(int arg0) { + int ivar1; + int ivar2; + ivar1 = 535; + ivar2 = 536; + setWidgetSprite(ivar1, new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar2, "Id", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar1, "Id", new WidgetPointer(arg0)); + setScriptCallOnClickContextMenu(29, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/451.cs2 b/dumps/scripts/451.cs2 new file mode 100644 index 000000000..3bdbb1ede --- /dev/null +++ b/dumps/scripts/451.cs2 @@ -0,0 +1,4 @@ +void script_451() { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1019,11)); + return; +} diff --git a/dumps/scripts/4510.cs2 b/dumps/scripts/4510.cs2 new file mode 100644 index 000000000..7c8dec003 --- /dev/null +++ b/dumps/scripts/4510.cs2 @@ -0,0 +1,21 @@ +void script_4510(int arg0,int arg1) { + int ivar2; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + if (ivar2 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 255, 0, "Iii", new WidgetPointer(arg0)); + } else if (ivar2 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } else { + if (ivar2 == 5) { + return; + } + } + script_4202(arg0, arg1); + return; +} diff --git a/dumps/scripts/4511.cs2 b/dumps/scripts/4511.cs2 new file mode 100644 index 000000000..259848db2 --- /dev/null +++ b/dumps/scripts/4511.cs2 @@ -0,0 +1,25 @@ +void script_4511(int arg0,int arg1) { + int ivar2; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + if (ivar2 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 1, 0, "Iii", new WidgetPointer(arg0)); + } else if (ivar2 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } else { + if (ivar2 == 5) { + return; + } + } + script_4512(arg0, arg1); + if (ivar2 == 4) { + script_4161(arg0, 0); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4512.cs2 b/dumps/scripts/4512.cs2 new file mode 100644 index 000000000..89c5f2034 --- /dev/null +++ b/dumps/scripts/4512.cs2 @@ -0,0 +1,16 @@ +void script_4512(int arg0,int arg1) { + int ivar2; + int ivar3; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1351); + ivar3 = getOtherCommonData(arg1, 1358); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(60, 60, 0, 0); + setWidgetSprite(ivar2); + cs2method2103(ivar3); + return; +} diff --git a/dumps/scripts/4513.cs2 b/dumps/scripts/4513.cs2 new file mode 100644 index 000000000..e4675f676 --- /dev/null +++ b/dumps/scripts/4513.cs2 @@ -0,0 +1,25 @@ +void script_4513(int arg0,int arg1) { + int ivar2; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + if (ivar2 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 1, 0, "Iii", new WidgetPointer(arg0)); + } else if (ivar2 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } else { + if (ivar2 == 5) { + return; + } + } + script_4206(arg0, arg1); + if ((ivar2 == 4) || (ivar2 == 5)) { + script_4161(arg0, 0); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4514.cs2 b/dumps/scripts/4514.cs2 new file mode 100644 index 000000000..79129ac60 --- /dev/null +++ b/dumps/scripts/4514.cs2 @@ -0,0 +1,25 @@ +void script_4514(int arg0,int arg1) { + int ivar2; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + if (ivar2 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 1, 0, "Iii", new WidgetPointer(arg0)); + } else if (ivar2 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } else { + if (ivar2 == 5) { + return; + } + } + script_4515(arg0, arg1); + if (ivar2 == 4) { + script_4161(arg0, 0); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4515.cs2 b/dumps/scripts/4515.cs2 new file mode 100644 index 000000000..e15d1867a --- /dev/null +++ b/dumps/scripts/4515.cs2 @@ -0,0 +1,95 @@ +void script_4515(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1347); + ivar3 = getOtherCommonData(arg1, 1349); + ivar4 = getOtherCommonData(arg1, 1352); + ivar5 = getOtherCommonData(arg1, 1350); + ivar6 = getOtherCommonData(arg1, 1353); + ivar7 = getOtherCommonData(arg1, 1354); + ivar8 = getOtherCommonData(arg1, 1351); + ivar9 = getOtherCommonData(arg1, 1357); + ivar10 = getOtherCommonData(arg1, 1358); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(14, 16384, 1, 2); + setWidgetSprite(ivar8); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(14, 10000, 1, 2); + setWidgetSprite(ivar9); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(7, 16384, 0, 2); + setWidgetSprite(ivar6); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(7, 16384, 0, 2); + setWidgetSprite(ivar6); + setWidgetHFlip(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(7, 7, 0, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(14, 7, 1, 0); + setWidgetSprite(ivar2); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(7, 7, 0, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar10); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(7, 10000, 0, 2); + setWidgetSprite(ivar7); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(7, 10000, 0, 2); + setWidgetSprite(ivar7); + cs2method1107(1); + setWidgetHFlip(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(7, 7, 0, 0); + setWidgetSprite(ivar5); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(14, 7, 1, 0); + setWidgetSprite(ivar4); + cs2method1107(1); + cs2method2103(ivar10); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(7, 7, 0, 0); + setWidgetSprite(ivar5); + cs2method2103(ivar10); + setWidgetHFlip(1); + return; +} diff --git a/dumps/scripts/4516.cs2 b/dumps/scripts/4516.cs2 new file mode 100644 index 000000000..e58ac7ed3 --- /dev/null +++ b/dumps/scripts/4516.cs2 @@ -0,0 +1,4 @@ +void script_4516(int arg0) { + script_4211(arg0, 4040, 16, 7961468); + return; +} diff --git a/dumps/scripts/4517.cs2 b/dumps/scripts/4517.cs2 new file mode 100644 index 000000000..41b57062a --- /dev/null +++ b/dumps/scripts/4517.cs2 @@ -0,0 +1,4 @@ +void script_4517(int arg0,string arg1) { + script_4212(arg0, 4040, 16, 7961468, arg1); + return; +} diff --git a/dumps/scripts/4518.cs2 b/dumps/scripts/4518.cs2 new file mode 100644 index 000000000..70fc8c5dc --- /dev/null +++ b/dumps/scripts/4518.cs2 @@ -0,0 +1,4 @@ +void script_4518(int arg0,string arg1) { + script_4212(arg0, 4040, 15458492, 5918266, arg1); + return; +} diff --git a/dumps/scripts/4519.cs2 b/dumps/scripts/4519.cs2 new file mode 100644 index 000000000..4b424012f --- /dev/null +++ b/dumps/scripts/4519.cs2 @@ -0,0 +1,4 @@ +void script_4519(int arg0) { + script_4521(arg0, 6004, 6005, 6006); + return; +} diff --git a/dumps/scripts/452.cs2 b/dumps/scripts/452.cs2 new file mode 100644 index 000000000..311a1603c --- /dev/null +++ b/dumps/scripts/452.cs2 @@ -0,0 +1,8 @@ +void script_452() { + if (((boolean)bitconfig_7537)) { + setWidgetSprite(3745, new WidgetPointer(1008,31)); + } else { + setWidgetSprite(3746, new WidgetPointer(1008,31)); + } + return; +} diff --git a/dumps/scripts/4520.cs2 b/dumps/scripts/4520.cs2 new file mode 100644 index 000000000..8e004366c --- /dev/null +++ b/dumps/scripts/4520.cs2 @@ -0,0 +1,4 @@ +void script_4520(int arg0) { + script_4521(arg0, 6009, 6010, 6011); + return; +} diff --git a/dumps/scripts/4521.cs2 b/dumps/scripts/4521.cs2 new file mode 100644 index 000000000..7439ebcfc --- /dev/null +++ b/dumps/scripts/4521.cs2 @@ -0,0 +1,25 @@ +void script_4521(int arg0,int arg1,int arg2,int arg3) { + if (arg0 == -1) { + return; + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(16384, 16384, 2, 2); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(arg1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(16384, 16384, 2, 2); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(arg2); + cs2method2103(255); + setScriptCallOnMouseEntered(4209, new WidgetPointer(-32768,3), 0, "Ii"); + setScriptCallOnMouseExit(4209, new WidgetPointer(-32768,3), 1, "Ii"); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(16384, 16384, 2, 2); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(arg3); + cs2method2103(255); + setScriptCallOnMousePressed(4207, new WidgetPointer(-32768,3), 0, "Ii"); + setScriptCallOnMouseReleased(4207, new WidgetPointer(-32768,3), 255, "Ii"); + return; +} diff --git a/dumps/scripts/4522.cs2 b/dumps/scripts/4522.cs2 new file mode 100644 index 000000000..3f2921c44 --- /dev/null +++ b/dumps/scripts/4522.cs2 @@ -0,0 +1,4 @@ +void script_4522(int arg0) { + script_4524(arg0, 6008); + return; +} diff --git a/dumps/scripts/4523.cs2 b/dumps/scripts/4523.cs2 new file mode 100644 index 000000000..2c1f55ae5 --- /dev/null +++ b/dumps/scripts/4523.cs2 @@ -0,0 +1,4 @@ +void script_4523(int arg0) { + script_4524(arg0, 6013); + return; +} diff --git a/dumps/scripts/4524.cs2 b/dumps/scripts/4524.cs2 new file mode 100644 index 000000000..2d2fe6dbb --- /dev/null +++ b/dumps/scripts/4524.cs2 @@ -0,0 +1,9 @@ +void script_4524(int arg0,int arg1) { + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(16384, 16384, 2, 2); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(arg1); + cs2method2005(1, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4525.cs2 b/dumps/scripts/4525.cs2 new file mode 100644 index 000000000..ad9ccb085 --- /dev/null +++ b/dumps/scripts/4525.cs2 @@ -0,0 +1,4 @@ +void script_4525(int arg0,int arg1) { + script_4526(arg0, arg1); + return; +} diff --git a/dumps/scripts/4526.cs2 b/dumps/scripts/4526.cs2 new file mode 100644 index 000000000..760f5a534 --- /dev/null +++ b/dumps/scripts/4526.cs2 @@ -0,0 +1,25 @@ +void script_4526(int arg0,int arg1) { + int ivar2; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + if (ivar2 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 255, 0, "Iii", new WidgetPointer(arg0)); + } else if (ivar2 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } else { + if (ivar2 == 5) { + return; + } + } + script_4527(arg0, arg1); + if (ivar2 == 4) { + script_4161(arg0, 0); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4527.cs2 b/dumps/scripts/4527.cs2 new file mode 100644 index 000000000..859e25323 --- /dev/null +++ b/dumps/scripts/4527.cs2 @@ -0,0 +1,81 @@ +void script_4527(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + ivar3 = getOtherCommonData(arg1, 1349); + ivar4 = getOtherCommonData(arg1, 1347); + ivar5 = getOtherCommonData(arg1, 1350); + ivar6 = getOtherCommonData(arg1, 1352); + ivar7 = getOtherCommonData(arg1, 1353); + ivar8 = getOtherCommonData(arg1, 1351); + ivar9 = getOtherCommonData(arg1, 1358); + ivar10 = getOtherCommonData(arg1, 1359); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(24, 18, 1, 1); + setWidgetSprite(ivar8); + cs2method2103(ivar9); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(24, 9, 1, 0); + setWidgetSprite(ivar4); + cs2method2103(ivar9); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(24, 9, 1, 0); + setWidgetSprite(ivar6); + cs2method2103(ivar9); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(12, 5, 0, 1); + setWidgetSprite(ivar7); + cs2method2103(ivar9); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(12, 5, 0, 1); + setWidgetSprite(ivar7); + setWidgetHFlip(1); + cs2method2103(ivar9); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(12, 9, 0, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(12, 9, 0, 0); + setWidgetSprite(ivar5); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(12, 9, 0, 0); + setWidgetSprite(ivar3); + setWidgetHFlip(1); + cs2method2103(ivar9); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(12, 9, 0, 0); + setWidgetSprite(ivar5); + setWidgetHFlip(1); + cs2method2103(ivar9); + if (ivar2 == 4) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4528.cs2 b/dumps/scripts/4528.cs2 new file mode 100644 index 000000000..5d539a3de --- /dev/null +++ b/dumps/scripts/4528.cs2 @@ -0,0 +1,4 @@ +void script_4528(int arg0,int arg1,int arg2) { + script_4529(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4529.cs2 b/dumps/scripts/4529.cs2 new file mode 100644 index 000000000..bd7207a08 --- /dev/null +++ b/dumps/scripts/4529.cs2 @@ -0,0 +1,52 @@ +void script_4529(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + if ((arg0 == -1) || (arg2 == -1)) { + return; + } + ivar3 = getOtherCommonData(arg2, 1346); + ivar4 = getOtherCommonData(arg2, 1388); + ivar5 = getOtherCommonData(arg2, 1389); + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + if (((boolean)ivar3)) { + ivar6 = getOtherCommonData(arg2, 1393); + ivar7 = getOtherCommonData(arg2, 1394); + ivar8 = getOtherCommonData(arg2, 1395); + ivar9 = getOtherCommonData(arg2, 1396); + script_31(arg0, arg1, ivar6, ivar7, ivar8, ivar9, ivar4, ivar5); + } else { + if ((ivar3 == 2) || (ivar3 == 3)) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(16, 16, 0, 0); + setWidgetSprite(ivar4); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(16, 16, 0, 0); + setWidgetSprite(ivar5); + cs2method2103(255); + if (ivar3 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 1, 0, "Iii", new WidgetPointer(arg0)); + } else { + if (ivar3 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseDragged(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseDragReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } + } + } + } + return; +} diff --git a/dumps/scripts/453.cs2 b/dumps/scripts/453.cs2 new file mode 100644 index 000000000..a5c572806 --- /dev/null +++ b/dumps/scripts/453.cs2 @@ -0,0 +1,4 @@ +void script_453() { + script_304(47812258); + return; +} diff --git a/dumps/scripts/4530.cs2 b/dumps/scripts/4530.cs2 new file mode 100644 index 000000000..de220e73c --- /dev/null +++ b/dumps/scripts/4530.cs2 @@ -0,0 +1,55 @@ +void script_4530(int arg0) { + int ivar1; + int ivar2; + ivar1 = 4; + ivar2 = 4; + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(ivar1, 2), multiply(ivar2, 2), 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(5470); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(ivar1, 2), ivar2, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetSprite(5472); + cs2method1107(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(ivar1, 2), ivar2, 1, 0); + setWidgetPosition(0, 0, 1, 2); + setWidgetSprite(5472); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar1, multiply(ivar2, 2), 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(5473); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar1, multiply(ivar2, 2), 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(5473); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar1, ivar2, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(5633); + setWidgetHFlip(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar1, ivar2, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(5633); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar1, ivar2, 0, 0); + setWidgetPosition(0, 0, 0, 2); + setWidgetSprite(5633); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar1, ivar2, 0, 0); + setWidgetPosition(0, 0, 2, 2); + setWidgetSprite(5633); + return; +} diff --git a/dumps/scripts/4531.cs2 b/dumps/scripts/4531.cs2 new file mode 100644 index 000000000..344dc72a6 --- /dev/null +++ b/dumps/scripts/4531.cs2 @@ -0,0 +1,135 @@ +void script_4531(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + if (arg0 == -1) { + return; + } + ivar1 = 4; + ivar2 = 4; + ivar3 = 4; + ivar4 = 4; + ivar5 = 29; + ivar6 = 8; + ivar7 = 56; + ivar8 = 7; + ivar9 = 120; + ivar10 = 64; + ivar11 = 53; + ivar12 = 8; + ivar13 = 68; + ivar14 = 43; + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(multiply(ivar1, 2), multiply(ivar2, 2), 1, 1); + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(ivar12, 2), ivar4, 1, 0); + setWidgetPosition(0, ivar5, 1, 0); + setWidgetSprite(5472); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(ivar12, 2), ivar4, 1, 0); + setWidgetPosition(0, ivar8, 1, 2); + setWidgetSprite(5472); + cs2method1107(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar3, add(ivar5, ivar8), 0, 1); + setWidgetPosition(ivar12, ivar5, 0, 0); + setWidgetSprite(5473); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar3, add(ivar5, ivar8), 0, 1); + setWidgetPosition(ivar12, ivar5, 2, 0); + setWidgetSprite(5473); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(add(ivar6, ivar7), 2), ivar5, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetSprite(5465); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar7, ivar5, 0, 0); + setWidgetPosition(ivar12, 0, 0, 0); + setWidgetSprite(5466); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar7, ivar5, 0, 0); + setWidgetPosition(ivar12, 0, 2, 0); + setWidgetSprite(5466); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(add(ivar10, ivar9), 2), ivar8, 1, 0); + setWidgetPosition(0, 0, 1, 2); + setWidgetSprite(5632); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar9, ivar8, 0, 0); + setWidgetPosition(ivar10, 0, 0, 2); + setWidgetSprite(5460); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar9, ivar8, 0, 0); + setWidgetPosition(ivar10, 0, 2, 2); + setWidgetSprite(5634); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, add(add(add(ivar5, ivar11), ivar13), ivar14), 0, 1); + setWidgetPosition(0, add(ivar5, ivar13), 0, 0); + setWidgetSprite(5468); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, ivar13, 0, 0); + setWidgetPosition(0, ivar5, 0, 0); + setWidgetSprite(5464); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, ivar14, 0, 0); + setWidgetPosition(0, ivar11, 0, 2); + setWidgetSprite(5469); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, add(add(add(ivar5, ivar11), ivar13), ivar14), 0, 1); + setWidgetPosition(0, add(ivar5, ivar13), 2, 0); + setWidgetSprite(5468); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, ivar13, 0, 0); + setWidgetPosition(0, ivar5, 2, 0); + setWidgetSprite(5464); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, ivar14, 0, 0); + setWidgetPosition(0, ivar11, 2, 2); + setWidgetSprite(5469); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar6, ivar5, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(5467); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar6, ivar5, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(5467); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar10, ivar11, 0, 0); + setWidgetPosition(0, 0, 0, 2); + setWidgetSprite(5461); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar10, ivar11, 0, 0); + setWidgetPosition(0, 0, 2, 2); + setWidgetSprite(5461); + setWidgetHFlip(1); + return; +} diff --git a/dumps/scripts/4532.cs2 b/dumps/scripts/4532.cs2 new file mode 100644 index 000000000..9b38bc3fd --- /dev/null +++ b/dumps/scripts/4532.cs2 @@ -0,0 +1,13 @@ +void script_4532(int arg0) { + int ivar1; + ivar1 = getWidgetParentId(new WidgetPointer(arg0)); + if (ivar1 == -1) { + return; + } + if (setWidgetRegister(new WidgetPointer(ivar1))) { + setWidgetPosition(0, 4, 1, 0); + setWidgetSize(16384, 23, 2, 0); + } + script_4211(arg0, 5419, 15458492, 0); + return; +} diff --git a/dumps/scripts/4533.cs2 b/dumps/scripts/4533.cs2 new file mode 100644 index 000000000..76351bf7f --- /dev/null +++ b/dumps/scripts/4533.cs2 @@ -0,0 +1,4 @@ +void script_4533(int arg0,string arg1) { + script_4212(arg0, 5419, 15458492, 0, arg1); + return; +} diff --git a/dumps/scripts/4534.cs2 b/dumps/scripts/4534.cs2 new file mode 100644 index 000000000..ad09ac9c5 --- /dev/null +++ b/dumps/scripts/4534.cs2 @@ -0,0 +1,45 @@ +void script_4534(int arg0) { + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetSprite(5474); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 1, 0); + setWidgetPosition(0, 0, 1, 2); + setWidgetSprite(5474); + cs2method1107(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(5476); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(5476); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(5475); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(5475); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 0); + setWidgetPosition(0, 0, 0, 2); + setWidgetSprite(5475); + setWidgetHFlip(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 0); + setWidgetPosition(0, 0, 2, 2); + setWidgetSprite(5475); + setWidgetVFlip(1); + return; +} diff --git a/dumps/scripts/4535.cs2 b/dumps/scripts/4535.cs2 new file mode 100644 index 000000000..130afa63d --- /dev/null +++ b/dumps/scripts/4535.cs2 @@ -0,0 +1,44 @@ +void script_4535(int arg0) { + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 5, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetSprite(6143); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 5, 1, 0); + setWidgetPosition(0, 0, 1, 2); + setWidgetSprite(6147); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(5, 10, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(6145); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(5, 10, 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(6145); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(5, 5, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(6144); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(5, 5, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(6144); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(5, 5, 0, 0); + setWidgetPosition(0, 0, 0, 2); + setWidgetSprite(6144); + setWidgetHFlip(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(5, 5, 0, 0); + setWidgetPosition(0, 0, 2, 2); + setWidgetSprite(6144); + setWidgetVFlip(1); + return; +} diff --git a/dumps/scripts/4536.cs2 b/dumps/scripts/4536.cs2 new file mode 100644 index 000000000..a9e8ba626 --- /dev/null +++ b/dumps/scripts/4536.cs2 @@ -0,0 +1,4 @@ +void script_4536(int arg0) { + script_4537(arg0); + return; +} diff --git a/dumps/scripts/4537.cs2 b/dumps/scripts/4537.cs2 new file mode 100644 index 000000000..e685c570c --- /dev/null +++ b/dumps/scripts/4537.cs2 @@ -0,0 +1,50 @@ +void script_4537(int arg0) { + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(40, 52, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSprite(6098); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(40, 26, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetSprite(6096); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(40, 26, 1, 0); + setWidgetPosition(0, 0, 1, 2); + setWidgetSprite(6096); + cs2method1107(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 52, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(6097); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 52, 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(6097); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(20, 26, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(6095); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(20, 26, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(6095); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(20, 26, 0, 0); + setWidgetPosition(0, 0, 0, 2); + setWidgetSprite(6095); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(20, 26, 0, 0); + setWidgetPosition(0, 0, 2, 2); + setWidgetSprite(6095); + setWidgetVFlip(1); + setWidgetHFlip(1); + return; +} diff --git a/dumps/scripts/4538.cs2 b/dumps/scripts/4538.cs2 new file mode 100644 index 000000000..c216ceda4 --- /dev/null +++ b/dumps/scripts/4538.cs2 @@ -0,0 +1,4 @@ +void script_4538(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,string arg12) { + script_4539(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); + return; +} diff --git a/dumps/scripts/4539.cs2 b/dumps/scripts/4539.cs2 new file mode 100644 index 000000000..6c7e1dcb5 --- /dev/null +++ b/dumps/scripts/4539.cs2 @@ -0,0 +1,65 @@ +void script_4539(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,string arg12) { + int ivar12; + int ivar13; + flow_0: + if (((boolean)script_4761(25))) { + return; + } + ivar12 = 0; + ivar13 = 0; + IF (setWidgetRegister(new WidgetPointer(arg0), subtract(getExtraChildGap(new WidgetPointer(arg0)), 1))) + GOTO flow_3 + GOTO flow_18 + flow_3: + IF (setWidgetRegister(new WidgetPointer(arg1), arg2)) + GOTO flow_5 + IF (((arg2 == -1) && setWidgetRegister(new WidgetPointer(arg1))) && (getWidgetSpriteId() == 5613)) + GOTO flow_6 + GOTO flow_18 + flow_5: + flow_6: + switch (arg9) { + case 3: + if (((boolean)getWidgetModelId())) { + ivar13 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar12 = subtract(add(script_1744(), arg11), add(script_3366(arg0), divide(ivar13, 2))); + ivar13 = divide(subtract(ivar13, 35), 2); + ivar12 = max(min(ivar12, ivar13), subtract(0, ivar13)); + setWidgetPosition(0, ivar12, 2, 1); + return; + } + break; + case 1: + if (getWidgetModelId() == 32768) { + ivar13 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar12 = subtract(add(script_1744(), arg11), add(script_3366(arg0), divide(ivar13, 2))); + ivar13 = divide(subtract(ivar13, 35), 2); + ivar12 = max(min(ivar12, ivar13), subtract(0, ivar13)); + setWidgetPosition(0, ivar12, 0, 1); + return; + } + break; + case 0: + if (getWidgetModelId() == 49152) { + ivar13 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar12 = subtract(add(script_1743(), arg10), add(script_3365(arg0), divide(ivar13, 2))); + ivar13 = divide(subtract(ivar13, 35), 2); + ivar12 = max(min(ivar12, ivar13), subtract(0, ivar13)); + setWidgetPosition(ivar12, 0, 1, 2); + return; + } + break; + default: + if (getWidgetModelId() == 16384) { + ivar13 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar12 = subtract(add(script_1743(), arg10), add(script_3365(arg0), divide(ivar13, 2))); + ivar13 = divide(subtract(ivar13, 35), 2); + ivar12 = max(min(ivar12, ivar13), subtract(0, ivar13)); + setWidgetPosition(ivar12, 0, 1, 0); + return; + } + } + flow_18: + script_4540(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); + return; +} diff --git a/dumps/scripts/454.cs2 b/dumps/scripts/454.cs2 new file mode 100644 index 000000000..736a4063e --- /dev/null +++ b/dumps/scripts/454.cs2 @@ -0,0 +1,4 @@ +void script_454() { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1008,32)); + return; +} diff --git a/dumps/scripts/4540.cs2 b/dumps/scripts/4540.cs2 new file mode 100644 index 000000000..7bc40316d --- /dev/null +++ b/dumps/scripts/4540.cs2 @@ -0,0 +1,397 @@ +void script_4540(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,string arg12) { + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int stack_dump0; + int stack_dump1; + int stack_dump2; + flow_0: + setWidgetIsHidden(false, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + if ((arg4 == -1) || (arg5 == -1)) { + stack_dump0 = 5631; + arg5 = 5631; + arg4 = stack_dump0; + } + if (arg6 == -1) { + arg6 = 16777215; + } + ivar12 = min(getMaxLineWidth(arg3, arg4, arg12), arg3); + ivar13 = add(multiply(max(getLineCount(ivar12, arg4, arg12), 1), arg7), arg8); + ivar14 = add(ivar12, 12); + ivar15 = add(ivar13, 12); + switch (arg9) { + case 1: + case 3: + ivar14 = add(ivar14, 23); + break; + case 0: + ivar15 = add(ivar15, 22); + break; + case 2: + ivar15 = add(ivar15, 23); + } + stack_dump0 = max(ivar14, 45); + ivar15 = max(ivar15, 45); + ivar14 = stack_dump0; + setWidgetSize(ivar14, ivar15, 0, 0, new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 3, getExtraChildGap(new WidgetPointer(arg0))); + switch (arg9) { + case 3: + setWidgetSize(25, 2, 1, 1); + setWidgetPosition(1, 0, 0, 1); + break; + case 1: + setWidgetSize(25, 2, 1, 1); + setWidgetPosition(1, 0, 2, 1); + break; + case 0: + setWidgetSize(2, 24, 1, 1); + setWidgetPosition(0, 1, 1, 0); + break; + case 2: + setWidgetSize(2, 25, 1, 1); + setWidgetPosition(0, 1, 1, 2); + break; + default: + setWidgetSize(2, 2, 1, 1); + setWidgetPosition(0, 0, 1, 1); + } + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + SWITCH (arg9) { + case 3: + GOTO flow_15 + case 1: + GOTO flow_16 + case 2: + GOTO flow_18 + } + GOTO flow_17 + flow_15: + setWidgetSize(27, 10, 1, 0); + setWidgetPosition(2, 0, 0, 0); + GOTO flow_19 + flow_16: + setWidgetSize(27, 10, 1, 0); + setWidgetPosition(2, 0, 2, 0); + GOTO flow_19 + flow_17: + setWidgetSize(4, 10, 1, 0); + setWidgetPosition(0, 0, 1, 0); + GOTO flow_19 + flow_18: + setWidgetSize(4, 10, 1, 0); + setWidgetPosition(0, 23, 1, 0); + flow_19: + setWidgetSprite(4649); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + switch (arg9) { + case 3: + setWidgetSize(27, 10, 1, 0); + setWidgetPosition(2, 0, 0, 2); + break; + case 1: + setWidgetSize(27, 10, 1, 0); + setWidgetPosition(2, 0, 2, 2); + break; + case 0: + setWidgetSize(4, 10, 1, 0); + setWidgetPosition(0, 22, 1, 2); + break; + default: + setWidgetSize(4, 10, 1, 0); + setWidgetPosition(0, 0, 1, 2); + } + setWidgetSprite(4649); + cs2method1107(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + SWITCH (arg9) { + case 1: + GOTO flow_25 + case 0: + GOTO flow_26 + case 2: + GOTO flow_27 + } + setWidgetSize(10, 4, 0, 1); + setWidgetPosition(0, 0, 0, 1); + GOTO flow_28 + flow_25: + setWidgetSize(10, 4, 0, 1); + setWidgetPosition(23, 0, 0, 1); + GOTO flow_28 + flow_26: + setWidgetSize(10, 26, 0, 1); + setWidgetPosition(0, 2, 0, 0); + GOTO flow_28 + flow_27: + setWidgetSize(10, 27, 0, 1); + setWidgetPosition(0, 2, 0, 2); + flow_28: + setWidgetSprite(4651); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + SWITCH (arg9) { + case 3: + GOTO flow_29 + case 0: + GOTO flow_31 + case 2: + GOTO flow_32 + } + GOTO flow_30 + flow_29: + setWidgetSize(10, 4, 0, 1); + setWidgetPosition(23, 0, 2, 1); + GOTO flow_33 + flow_30: + setWidgetSize(10, 4, 0, 1); + setWidgetPosition(0, 0, 2, 1); + GOTO flow_33 + flow_31: + setWidgetSize(10, 26, 0, 1); + setWidgetPosition(0, 2, 2, 0); + GOTO flow_33 + flow_32: + setWidgetSize(10, 27, 0, 1); + setWidgetPosition(0, 2, 2, 2); + flow_33: + setWidgetSprite(4651); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 0); + SWITCH (arg9) { + case 1: + GOTO flow_34 + case 2: + GOTO flow_36 + } + GOTO flow_35 + flow_34: + setWidgetPosition(23, 0, 0, 0); + GOTO flow_37 + flow_35: + setWidgetPosition(0, 0, 0, 0); + GOTO flow_37 + flow_36: + setWidgetPosition(0, 23, 0, 0); + flow_37: + setWidgetSprite(4650); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 0); + SWITCH (arg9) { + case 3: + GOTO flow_38 + case 2: + GOTO flow_40 + } + GOTO flow_39 + flow_38: + setWidgetPosition(23, 0, 2, 0); + GOTO flow_41 + flow_39: + setWidgetPosition(0, 0, 2, 0); + GOTO flow_41 + flow_40: + setWidgetPosition(0, 23, 2, 0); + flow_41: + setWidgetSprite(4650); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 0); + switch (arg9) { + case 1: + setWidgetPosition(23, 0, 0, 2); + break; + case 0: + setWidgetPosition(0, 22, 0, 2); + break; + default: + setWidgetPosition(0, 0, 0, 2); + } + setWidgetSprite(4650); + setWidgetHFlip(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(10, 10, 0, 0); + switch (arg9) { + case 3: + setWidgetPosition(23, 0, 2, 2); + break; + case 0: + setWidgetPosition(0, 22, 2, 2); + break; + default: + setWidgetPosition(0, 0, 2, 2); + } + setWidgetSprite(4650); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 4, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, ivar13, 0, 0); + switch (arg9) { + case 3: + setWidgetPosition(6, 0, 0, 1); + break; + case 1: + setWidgetPosition(6, 0, 2, 1); + break; + case 0: + setWidgetPosition(0, 6, 1, 0); + break; + case 2: + setWidgetPosition(0, 6, 1, 2); + break; + default: + setWidgetPosition(0, 0, 1, 1); + } + setWidgetRGB(new Color(arg6)); + setWidgetFont(arg5); + setWidgetTextAlignment(1, 1, arg7); + setWidgetText(arg12); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSprite(5613); + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = getWidgetParentId(new WidgetPointer(arg0)); + if (ivar20 != -1) { + stack_dump0 = script_3365(ivar20); + ivar18 = script_3366(ivar20); + ivar16 = stack_dump0; + stack_dump0 = add(ivar16, getWidgetActualWidth(new WidgetPointer(ivar20))); + ivar19 = add(ivar18, getWidgetActualHeight(new WidgetPointer(ivar20))); + ivar17 = stack_dump0; + } else if (ivar20 != -1) { + stack_dump0 = getWidgetActualWidth(new WidgetPointer(ivar20)); + ivar19 = getWidgetActualHeight(new WidgetPointer(ivar20)); + ivar17 = stack_dump0; + } else { + stack_dump0 = 765; + ivar19 = 503; + ivar17 = stack_dump0; + } + ivar21 = 0; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + ivar27 = 0; + if (setWidgetRegister(new WidgetPointer(arg1), arg2) || ((arg2 == -1) && setWidgetRegister(new WidgetPointer(arg1)))) { + stack_dump0 = script_1743(); + stack_dump1 = script_1744(); + stack_dump2 = getWidgetActualWidth(); + ivar24 = getWidgetActualHeight(); + stack_dump0 = stack_dump0; + stack_dump1 = stack_dump1; + ivar23 = stack_dump2; + stack_dump0 = stack_dump0; + ivar22 = stack_dump1; + ivar21 = stack_dump0; + switch (arg9) { + case 3: + stack_dump0 = subtract(ivar21, ivar14); + ivar26 = subtract(add(ivar22, arg11), divide(ivar15, 2)); + ivar25 = stack_dump0; + if (ivar26 < ivar18) { + ivar27 = subtract(ivar26, ivar18); + ivar26 = subtract(ivar26, ivar27); + ivar27 = max(ivar27, subtract(0, divide(subtract(ivar15, 35), 2))); + } else { + if (add(ivar26, ivar15) > ivar19) { + ivar27 = subtract(add(ivar26, ivar15), ivar19); + ivar26 = subtract(ivar26, ivar27); + ivar27 = min(ivar27, divide(subtract(ivar15, 35), 2)); + } + } + setWidgetSize(25, 24, 0, 0); + setWidgetPosition(0, ivar27, 2, 1); + break; + case 1: + stack_dump0 = add(ivar21, ivar23); + ivar26 = subtract(add(ivar22, arg11), divide(ivar15, 2)); + ivar25 = stack_dump0; + if (ivar26 < ivar18) { + ivar27 = subtract(ivar26, ivar18); + ivar26 = subtract(ivar26, ivar27); + ivar27 = max(ivar27, subtract(0, divide(subtract(ivar15, 35), 2))); + } else { + if (add(ivar26, ivar15) > ivar19) { + ivar27 = subtract(add(ivar26, ivar15), ivar19); + ivar26 = subtract(ivar26, ivar27); + ivar27 = min(ivar27, divide(subtract(ivar15, 35), 2)); + } + } + setWidgetSize(25, 24, 0, 0); + cs2method1106(32768); + setWidgetPosition(0, ivar27, 0, 1); + break; + case 0: + stack_dump0 = subtract(add(ivar21, arg10), divide(ivar14, 2)); + ivar26 = subtract(ivar22, ivar15); + ivar25 = stack_dump0; + if (ivar25 < ivar16) { + ivar27 = subtract(ivar25, ivar16); + ivar25 = subtract(ivar25, ivar27); + ivar27 = max(ivar27, subtract(0, divide(subtract(ivar14, 35), 2))); + } else { + if (add(ivar25, ivar14) > ivar17) { + ivar27 = subtract(add(ivar25, ivar14), ivar17); + ivar25 = subtract(ivar25, ivar27); + ivar27 = min(ivar27, divide(subtract(ivar14, 35), 2)); + } + } + setWidgetSize(24, 25, 0, 0); + cs2method1106(49152); + setWidgetPosition(ivar27, 0, 1, 2); + break; + case 2: + stack_dump0 = subtract(add(ivar21, arg10), divide(ivar14, 2)); + ivar26 = add(ivar22, ivar24); + ivar25 = stack_dump0; + if (ivar25 < ivar16) { + ivar27 = subtract(ivar25, ivar16); + ivar25 = subtract(ivar25, ivar27); + ivar27 = max(ivar27, subtract(0, divide(subtract(ivar14, 35), 2))); + } else { + if (add(ivar25, ivar14) > ivar17) { + ivar27 = subtract(add(ivar25, ivar14), ivar17); + ivar25 = subtract(ivar25, ivar27); + ivar27 = min(ivar27, divide(subtract(ivar14, 35), 2)); + } + } + setWidgetSize(24, 25, 0, 0); + cs2method1106(16384); + setWidgetPosition(ivar27, 0, 1, 0); + break; + default: + setWidgetHidden(1); + stack_dump0 = subtract(arg10, divide(ivar14, 2)); + ivar26 = subtract(arg11, divide(ivar15, 2)); + ivar25 = stack_dump0; + } + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + setWidgetPosition(subtract(ivar25, ivar16), subtract(ivar26, ivar18), 0, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4541.cs2 b/dumps/scripts/4541.cs2 new file mode 100644 index 000000000..15aac610d --- /dev/null +++ b/dumps/scripts/4541.cs2 @@ -0,0 +1,4 @@ +void script_4541(int arg0,int arg1,int arg2) { + script_4542(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4542.cs2 b/dumps/scripts/4542.cs2 new file mode 100644 index 000000000..dce46ef5c --- /dev/null +++ b/dumps/scripts/4542.cs2 @@ -0,0 +1,12 @@ +void script_4542(int arg0,int arg1,int arg2) { + int ivar3; + arg0 = min(100, arg0); + arg0 = max(0, arg0); + if (arg1 == -1) { + return; + } + ivar3 = divide(multiply(arg0, 16384), 100); + setWidgetSize(ivar3, getWidgetActualHeight(new WidgetPointer(arg1)), 2, 0, new WidgetPointer(arg1)); + script_4212(arg2, 3793, 14014931, 0, intToStr(arg0) + "%"); + return; +} diff --git a/dumps/scripts/4543.cs2 b/dumps/scripts/4543.cs2 new file mode 100644 index 000000000..25f358879 --- /dev/null +++ b/dumps/scripts/4543.cs2 @@ -0,0 +1,4 @@ +void script_4543(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_4544(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + return; +} diff --git a/dumps/scripts/4544.cs2 b/dumps/scripts/4544.cs2 new file mode 100644 index 000000000..61c9711ff --- /dev/null +++ b/dumps/scripts/4544.cs2 @@ -0,0 +1,27 @@ +void script_4544(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + int ivar8; + ivar8 = getWidgetParentId(new WidgetPointer(arg0)); + if (ivar8 == -1) { + return; + } + if (((boolean)arg6) || ((boolean)arg6)) { + if (getWidgetActualWidth(new WidgetPointer(ivar8)) == arg4) { + setScriptCallOnGameloop(4545, new WidgetPointer(-32768,3), arg5, arg6, new WidgetPointer(arg1), arg2, arg7, "IiiIdi", new WidgetPointer(ivar8)); + } else { + if (getWidgetActualWidth(new WidgetPointer(ivar8)) == arg5) { + setScriptCallOnGameloop(4546, new WidgetPointer(-32768,3), arg4, arg6, new WidgetPointer(arg1), arg3, arg7, "IiiIdi", new WidgetPointer(ivar8)); + } + } + } else { + if ((arg6 == 2) || (arg6 == 3)) { + if (getWidgetActualHeight(new WidgetPointer(ivar8)) == arg4) { + setScriptCallOnGameloop(4545, new WidgetPointer(-32768,3), arg5, arg6, new WidgetPointer(arg1), arg2, arg7, "IiiIdi", new WidgetPointer(ivar8)); + } else { + if (getWidgetActualHeight(new WidgetPointer(ivar8)) == arg5) { + setScriptCallOnGameloop(4546, new WidgetPointer(-32768,3), arg4, arg6, new WidgetPointer(arg1), arg3, arg7, "IiiIdi", new WidgetPointer(ivar8)); + } + } + } + } + return; +} diff --git a/dumps/scripts/4545.cs2 b/dumps/scripts/4545.cs2 new file mode 100644 index 000000000..f079e383f --- /dev/null +++ b/dumps/scripts/4545.cs2 @@ -0,0 +1,41 @@ +void script_4545(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + flow_0: + IF (((boolean)arg2)) + GOTO flow_1 + IF (((boolean)arg2) && (add(getWidgetActualWidth(new WidgetPointer(arg0)), arg5) >= arg1)) + GOTO flow_2 + GOTO flow_5 + flow_1: + flow_2: + setWidgetSize(arg1, getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + if (arg4 != -1) { + setWidgetSprite(arg4, new WidgetPointer(arg3)); + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + flow_5: + IF (arg2 == 2) + GOTO flow_6 + IF ((arg2 == 3) && (add(getWidgetActualHeight(new WidgetPointer(arg0)), arg5) >= arg1)) + GOTO flow_7 + GOTO flow_10 + flow_6: + flow_7: + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), arg1, 0, 0, new WidgetPointer(arg0)); + if (arg4 != -1) { + setWidgetSprite(arg4, new WidgetPointer(arg3)); + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + flow_10: + switch (arg2) { + case 0: + case 1: + setWidgetSize(add(getWidgetActualWidth(new WidgetPointer(arg0)), arg5), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + break; + case 2: + case 3: + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), add(getWidgetActualHeight(new WidgetPointer(arg0)), arg5), 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4546.cs2 b/dumps/scripts/4546.cs2 new file mode 100644 index 000000000..508b6ab43 --- /dev/null +++ b/dumps/scripts/4546.cs2 @@ -0,0 +1,41 @@ +void script_4546(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + flow_0: + IF (((boolean)arg2)) + GOTO flow_1 + IF (((boolean)arg2) && (add(getWidgetActualWidth(new WidgetPointer(arg0)), arg5) <= arg1)) + GOTO flow_2 + GOTO flow_5 + flow_1: + flow_2: + setWidgetSize(arg1, getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + if (arg4 != -1) { + setWidgetSprite(arg4, new WidgetPointer(arg3)); + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + flow_5: + IF (arg2 == 2) + GOTO flow_6 + IF ((arg2 == 3) && (add(getWidgetActualHeight(new WidgetPointer(arg0)), arg5) <= arg1)) + GOTO flow_7 + GOTO flow_10 + flow_6: + flow_7: + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), arg1, 0, 0, new WidgetPointer(arg0)); + if (arg4 != -1) { + setWidgetSprite(arg4, new WidgetPointer(arg3)); + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; + flow_10: + switch (arg2) { + case 0: + case 1: + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), arg5), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + break; + case 2: + case 3: + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), subtract(getWidgetActualHeight(new WidgetPointer(arg0)), arg5), 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4547.cs2 b/dumps/scripts/4547.cs2 new file mode 100644 index 000000000..3e3bdc75b --- /dev/null +++ b/dumps/scripts/4547.cs2 @@ -0,0 +1,13 @@ +void script_4547(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(912,39)); + setWidgetText(new WidgetPointer(912,17), "Not in chat"); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(912,38)), getWidgetActualHeight(new WidgetPointer(912,37)), 0, 0, new WidgetPointer(912,38)); + setWidgetScrollMax(0, 0, new WidgetPointer(912,45)); + cs2method2100(0, 0, new WidgetPointer(912,45)); + script_72(59768878, 59768877, 0); + return; +} diff --git a/dumps/scripts/4548.cs2 b/dumps/scripts/4548.cs2 new file mode 100644 index 000000000..7fc1b514e --- /dev/null +++ b/dumps/scripts/4548.cs2 @@ -0,0 +1,12 @@ +void script_4548() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (((boolean)script_4467())) { + setWidgetIsHidden(false, new WidgetPointer(912,44)); + return; + } + script_2447(); + return; +} diff --git a/dumps/scripts/4549.cs2 b/dumps/scripts/4549.cs2 new file mode 100644 index 000000000..16dac432b --- /dev/null +++ b/dumps/scripts/4549.cs2 @@ -0,0 +1,43 @@ +void script_4549() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + if (cs2method3751()) { + ivar0 = cs2method3760(cs2method5015()); + if (ivar0 == -1) { + return; + } + ivar1 = cs2method3757(ivar0); + ivar2 = cs2method3753(); + } else { + messageType0("You must be in a clan to do that."); + } + if (ivar1 >= 0) { + if (ivar1 < ivar2) { + return; + } + if (((boolean)globalint_1413)) { + return; + } + if (((boolean)globalint_11)) { + script_675(); + } + if (getDisplayMode() >= 2) { + setWidgetIsHidden(false, new WidgetPointer(746,73)); + } + setWidgetIsHidden(false, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetText(new WidgetPointer(752,4), "Enter the player to ban from the channel:"); + globalint_5 = 16; + script_1564(""); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(752,3)); + script_2026(); + setScriptCallOnKeyPress(112, -2147483640, false, "iz", new WidgetPointer(752,5)); + script_1188(); + } + return; +} diff --git a/dumps/scripts/455.cs2 b/dumps/scripts/455.cs2 new file mode 100644 index 000000000..c819a7413 --- /dev/null +++ b/dumps/scripts/455.cs2 @@ -0,0 +1,4 @@ +void script_455() { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1008,32)); + return; +} diff --git a/dumps/scripts/4550.cs2 b/dumps/scripts/4550.cs2 new file mode 100644 index 000000000..97fe66f1b --- /dev/null +++ b/dumps/scripts/4550.cs2 @@ -0,0 +1,6 @@ +int script_4550(int arg0) { + if ((isParent(new WidgetPointer(753,4), arg0) || isParent(new WidgetPointer(746,12), arg0)) || isParent(new WidgetPointer(548,19), arg0)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/4551.cs2 b/dumps/scripts/4551.cs2 new file mode 100644 index 000000000..60e48ff6d --- /dev/null +++ b/dumps/scripts/4551.cs2 @@ -0,0 +1,8 @@ +void script_4551() { + setScriptCallOnFriendListChange(128, "", new WidgetPointer(550,4)); + script_31(36044831, 36044803, 5666, 5663, 5664, 5665, 5686, 5685); + setWidgetScrollMax(0, 0, new WidgetPointer(550,3)); + cs2method2100(0, 0, new WidgetPointer(550,3)); + script_129(); + return; +} diff --git a/dumps/scripts/4552.cs2 b/dumps/scripts/4552.cs2 new file mode 100644 index 000000000..22a24b155 --- /dev/null +++ b/dumps/scripts/4552.cs2 @@ -0,0 +1,28 @@ +void script_4552() { + int ivar0; + int ivar1; + int ivar2; + setWidgetText(new WidgetPointer(550,19), "Friends List" + "
" + "RuneScape " + intToStr(getWorldId())); + setScriptCallOnFriendListChange(124, "", new WidgetPointer(550,6)); + setWidgetScrollMax(0, 0, new WidgetPointer(550,11)); + cs2method2100(0, 0, new WidgetPointer(550,11)); + script_31(36044812, 36044811, 5666, 5663, 5664, 5665, 5686, 5685); + ivar0 = 36044800; + deleteAllExtraChilds(new WidgetPointer(ivar0)); + ivar1 = 0; + ivar2 = 0; + while (ivar2 < 200) { + ivar1 = add(multiply(ivar2, 15), 5); + if (mod(ivar2, 2) != 0) { + createExtraChild(new WidgetPointer(ivar0), 3, getExtraChildGap(new WidgetPointer(ivar0))); + setWidgetSize(16384, 15, 2, 0); + setWidgetPosition(0, ivar1, 0, 0); + setWidgetRGB(new Color(35, 34, 32)); + setWidgetFilled(1); + cs2method2103(128); + } + ivar2 = add(ivar2, 1); + } + script_125(globalint_1036); + return; +} diff --git a/dumps/scripts/4553.cs2 b/dumps/scripts/4553.cs2 new file mode 100644 index 000000000..647d3c5a1 --- /dev/null +++ b/dumps/scripts/4553.cs2 @@ -0,0 +1,16 @@ +void script_4553(int arg0) { + if (((boolean)arg0)) { + setWidgetIsHidden(true, new WidgetPointer(550,9)); + setWidgetIsHidden(false, new WidgetPointer(550,30)); + setWidgetIsHidden(true, new WidgetPointer(550,48)); + setWidgetIsHidden(false, new WidgetPointer(550,50)); + script_4551(); + } else { + setWidgetIsHidden(true, new WidgetPointer(550,30)); + setWidgetIsHidden(false, new WidgetPointer(550,9)); + setWidgetIsHidden(true, new WidgetPointer(550,50)); + setWidgetIsHidden(false, new WidgetPointer(550,48)); + script_4552(); + } + return; +} diff --git a/dumps/scripts/4554.cs2 b/dumps/scripts/4554.cs2 new file mode 100644 index 000000000..400cfb6b4 --- /dev/null +++ b/dumps/scripts/4554.cs2 @@ -0,0 +1,27 @@ +void script_4554(int arg0) { + setWidgetSize(subtract(getWidgetActualX(new WidgetPointer(589,45)), getWidgetActualX(new WidgetPointer(589,43))), 0, 0, 1, new WidgetPointer(589,55)); + setWidgetSize(subtract(subtract(getWidgetActualWidth(new WidgetPointer(589,51)), getWidgetActualWidth(new WidgetPointer(589,55))), 2), 0, 0, 1, new WidgetPointer(589,57)); + setWidgetScrollMax(0, 0, new WidgetPointer(589,51)); + cs2method2100(0, 0, new WidgetPointer(589,51)); + script_31(38600756, 38600755, 792, 789, 790, 791, 773, 788); + setWidgetScrollMax(0, 0, new WidgetPointer(589,23)); + cs2method2100(0, 0, new WidgetPointer(589,23)); + script_31(38600728, 38600727, 792, 789, 790, 791, 773, 788); + setScriptCallOnClanListChange(4558, new WidgetPointer(589,55), new WidgetPointer(589,56), new WidgetPointer(589,57), new WidgetPointer(589,53), new WidgetPointer(589,51), new WidgetPointer(589,52), "IIIIII", new WidgetPointer(589,51)); + setScriptCallOnFriendListChange(4558, new WidgetPointer(589,55), new WidgetPointer(589,56), new WidgetPointer(589,57), new WidgetPointer(589,53), new WidgetPointer(589,51), new WidgetPointer(589,52), "IIIIII", new WidgetPointer(589,51)); + script_4559(38600759, 38600760, 38600761, 38600757, 38600755, 38600756); + if (cs2method3612() > 0) { + setWidgetText(new WidgetPointer(589,41), "Leave chat channel"); + setWidgetContextMenuOption(1, new WidgetPointer(589,39), "Leave chat channel"); + } else { + setWidgetText(new WidgetPointer(589,41), "Join chat channel"); + setWidgetContextMenuOption(1, new WidgetPointer(589,39), "Join chat channel"); + } + globalstring_349 = ""; + script_3024(38600735); + globalint_1507 = strLength(globalstring_349); + setScriptCallOnMousePressed(4570, -2147483647, new WidgetPointer(589,27), new WidgetPointer(589,28), "iII", new WidgetPointer(589,27)); + script_4571(38600731, 38600732, globalstring_349); + setWidgetIsHidden(true, new WidgetPointer(589,28)); + return; +} diff --git a/dumps/scripts/4555.cs2 b/dumps/scripts/4555.cs2 new file mode 100644 index 000000000..8a61ac7c6 --- /dev/null +++ b/dumps/scripts/4555.cs2 @@ -0,0 +1,53 @@ +void script_4555(int arg0,int arg1) { + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_802_struct(1,1,0) structdump_5; + if (((cs2method3612() <= 0) || cs2method6900()) || ((boolean)script_5280())) { + return; + } + switch (arg0) { + case 84: + if (cs2method3612() > 0) { + if (strLength(globalstring_349) > 0) { + cs2method5006(1); + cs2method5008(globalstring_349); + } + } else { + message(11, 0, "You are not in a Friends Chat Channel."); + } + globalstring_349 = ""; + setWidgetText(new WidgetPointer(589,27), replaceLtGt(globalstring_349)); + globalint_1507 = strLength(globalstring_349); + script_4571(38600731, 38600732, globalstring_349); + break; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + globalint_1507 = script_1553(arg0, globalint_1507, globalstring_349); + script_4571(38600731, 38600732, globalstring_349); + break; + case 85: + case 101: + case -1: + if ((isValidChar(((char)arg1)) || (arg0 == 85)) || (arg0 == 101)) { + stack_dump0 = globalint_1507; + stack_dump1 = 0; + stack_dump2 = arg0; + stack_dump3 = arg1; + stack_dump4 = globalstring_349; + structdump_5 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + stack_dump4 = structdump_5.stringpart_0; + globalint_1507 = structdump_5.intpart_0; + globalstring_349 = stack_dump4; + setWidgetText(new WidgetPointer(589,27), replaceLtGt(globalstring_349)); + script_4571(38600731, 38600732, globalstring_349); + } + } + return; +} diff --git a/dumps/scripts/4556.cs2 b/dumps/scripts/4556.cs2 new file mode 100644 index 000000000..307f9d927 --- /dev/null +++ b/dumps/scripts/4556.cs2 @@ -0,0 +1,11 @@ +void script_4556(int arg0) { + if (((boolean)arg0) && cs2method6900()) { + setScriptCallOnKeyPress(4555, -2147483640, false, "iz", new WidgetPointer(589,26)); + setScriptCallOnGameloop(4572, getClientCycle(), new WidgetPointer(589,28), "iI", new WidgetPointer(589,27)); + } else { + setScriptCallOnKeyPress(-1, "", new WidgetPointer(589,26)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(589,27)); + setWidgetText(new WidgetPointer(589,27), replaceLtGt(globalstring_349)); + } + return; +} diff --git a/dumps/scripts/4557.cs2 b/dumps/scripts/4557.cs2 new file mode 100644 index 000000000..b1a02059a --- /dev/null +++ b/dumps/scripts/4557.cs2 @@ -0,0 +1,8 @@ +void script_4557() { + if (cs2method3612() > 0) { + sendUnknownVarByteEmptyFriendPacketMethod3620(); + } else { + script_3015(5, "Join Chat Channel", "", "", ""); + } + return; +} diff --git a/dumps/scripts/4558.cs2 b/dumps/scripts/4558.cs2 new file mode 100644 index 000000000..60f1c3515 --- /dev/null +++ b/dumps/scripts/4558.cs2 @@ -0,0 +1,4 @@ +void script_4558(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + script_4559(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/4559.cs2 b/dumps/scripts/4559.cs2 new file mode 100644 index 000000000..b247e3d44 --- /dev/null +++ b/dumps/scripts/4559.cs2 @@ -0,0 +1,135 @@ +void script_4559(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + string svar0; + string svar1; + string svar2; + if (cs2method5428(arg3, -1)) { + setScriptCallOnGameloop(4558, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), "IIIIII", new WidgetPointer(arg4)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg4)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + ivar6 = 0; + ivar7 = cs2method3612(); + ivar8 = 0; + svar0 = ""; + ivar9 = 15; + ivar10 = 17; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + svar1 = ""; + svar2 = ""; + ivar17 = 0; + if (ivar7 <= 0) { + setWidgetText(new WidgetPointer(589,19), "Not in chat"); + setWidgetText(new WidgetPointer(589,20), "None"); + setWidgetText(new WidgetPointer(589,41), "Join Chat Channel"); + setWidgetContextMenuOption(1, new WidgetPointer(589,39), "Join Chat Channel"); + script_4560(arg3, "You are not currently in a Friends Chat channel." + "
" + "
" + "Use the button below if you wish to join a chat channel."); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(589,45)), getWidgetActualHeight(new WidgetPointer(589,44)), 0, 0, new WidgetPointer(589,45)); + setWidgetScrollMax(0, 0, new WidgetPointer(589,51)); + cs2method2100(0, 0, new WidgetPointer(589,51)); + script_72(38600756, 38600755, 0); + } else { + setWidgetText(new WidgetPointer(589,19), cs2method3611()); + setWidgetText(new WidgetPointer(589,20), cs2method3625()); + setWidgetText(new WidgetPointer(589,41), "Leave chat channel"); + setWidgetContextMenuOption(1, new WidgetPointer(589,39), "Leave chat channel"); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(589,45)), 4, 0, 1, new WidgetPointer(589,45)); + while (ivar8 < ivar7) { + ivar16 = cs2method3615(ivar8); + svar2 = cs2method3632(ivar8); + svar0 = cs2method3613(ivar8); + script_2996(arg3, ivar8, getWidgetActualWidth(new WidgetPointer(arg3)), ivar9, 0, ivar12, 0, 1, 0); + if (((boolean)mod(ivar8, 2))) { + setWidgetRGB(new Color(32, 25, 17)); + } else { + setWidgetRGB(new Color(41, 32, 22)); + } + svar1 = "Rank: " + script_196(ivar16); + setScriptCallOnMouseEntered(4561, new WidgetPointer(arg3), ivar8, svar1, "Iis"); + setScriptCallOnMouseExit(4563, new WidgetPointer(arg3), ivar8, "Ii"); + if (cs2method3624(ivar8)) { + setScriptCallOnClickContextMenu(4564, svar2, -2147483644, "si"); + if (isFriend(strRemoveEntities(svar2))) { + setWidgetContextMenuOption(8, "Remove friend " + svar0); + } else if (cs2method3623(strRemoveEntities(svar2))) { + setWidgetContextMenuOption(9, "Remove ignore " + svar0); + } else { + setWidgetContextMenuOption(6, "Add friend " + svar0); + setWidgetContextMenuOption(7, "Add ignore " + svar0); + } + } + if ((cs2method3618() >= cs2method3616()) && (cs2method3618() > ivar16)) { + setWidgetContextMenuOption(10, "Kick/ban " + svar0); + } + script_2994(arg1, ivar8, 9, 9, 5, add(ivar12, 2), script_1599(ivar16), 0, 0, 0, 0); + script_2995(arg0, ivar8, 0, ivar9, ivar10, ivar12, 16777215, 494, 0, 1, 0, 1, svar0); + setWidgetSize(ivar10, ivar9, 1, 0); + cs2method1126(1); + ivar13 = cs2method3614(ivar8); + if (((boolean)ivar13)) { + svar0 = "Offline"; + ivar11 = 16711680; + } else if (ivar13 == getWorldId()) { + ivar11 = 65280; + } else { + ivar11 = 16776960; + } + svar0 = cs2method3626(ivar8); + script_2995(arg2, ivar8, 0, ivar9, 5, ivar12, ivar11, 494, 0, 1, 0, 1, svar0); + setWidgetSize(5, ivar9, 1, 0); + cs2method1126(1); + ivar12 = add(ivar12, ivar9); + ivar8 = add(ivar8, 1); + } + ivar14 = add(divide(getWidgetActualHeight(new WidgetPointer(arg4)), ivar9), 1); + if (ivar14 > ivar7) { + while (ivar8 < ivar14) { + script_2996(arg3, ivar8, getWidgetActualWidth(new WidgetPointer(arg3)), ivar9, 0, ivar12, 0, 1, 0); + if (((boolean)mod(ivar8, 2))) { + setWidgetRGB(new Color(32, 25, 17)); + } else { + setWidgetRGB(new Color(41, 32, 22)); + } + ivar12 = add(ivar12, ivar9); + ivar8 = add(ivar8, 1); + } + ivar15 = getWidgetActualHeight(new WidgetPointer(arg4)); + } else { + ivar15 = ivar12; + } + if (ivar14 <= ivar7) { + ivar17 = cs2method2601(new WidgetPointer(589,51)); + setWidgetScrollMax(0, ivar15, new WidgetPointer(589,51)); + if (ivar17 > ivar15) { + ivar17 = ivar15; + } + script_72(38600756, 38600755, ivar17); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(589,51)); + cs2method2100(0, 0, new WidgetPointer(589,51)); + script_72(38600756, 38600755, 0); + } + } + script_4573(); + return; +} diff --git a/dumps/scripts/456.cs2 b/dumps/scripts/456.cs2 new file mode 100644 index 000000000..a448b2aa1 --- /dev/null +++ b/dumps/scripts/456.cs2 @@ -0,0 +1,4 @@ +void script_456() { + setWidgetContextMenuOption(1, new WidgetPointer(1019,16), "Exit Tutorial"); + return; +} diff --git a/dumps/scripts/4560.cs2 b/dumps/scripts/4560.cs2 new file mode 100644 index 000000000..64812f99f --- /dev/null +++ b/dumps/scripts/4560.cs2 @@ -0,0 +1,5 @@ +void script_4560(int arg0,string arg1) { + script_2995(arg0, 0, 0, 0, 0, 0, 16777215, 494, 1, 1, 0, 1, arg1); + setWidgetSize(0, 0, 1, 1); + return; +} diff --git a/dumps/scripts/4561.cs2 b/dumps/scripts/4561.cs2 new file mode 100644 index 000000000..41224b071 --- /dev/null +++ b/dumps/scripts/4561.cs2 @@ -0,0 +1,10 @@ +void script_4561(int arg0,int arg1,string arg2) { + int ivar2; + ivar2 = 38600758; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar2)), getWidgetActualY(), 0, 0, new WidgetPointer(ivar2)); + setScriptCallOnMouseOver(4562, new WidgetPointer(arg0), arg1, add(getClientCycle(), 25), arg2, -2147483647, -2147483646, "Iiisii"); + } + return; +} diff --git a/dumps/scripts/4562.cs2 b/dumps/scripts/4562.cs2 new file mode 100644 index 000000000..1cc9415ae --- /dev/null +++ b/dumps/scripts/4562.cs2 @@ -0,0 +1,22 @@ +void script_4562(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int ivar5; + int ivar6; + ivar5 = 0; + ivar6 = 0; + if ((getClientCycle() > arg2) && setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetIsHidden(false, new WidgetPointer(589,34)); + setWidgetText(new WidgetPointer(589,38), arg5); + setWidgetSize(add(multiply(getWidgetActualX(new WidgetPointer(589,38)), 2), getTextWidth(495, arg5)), getWidgetActualHeight(new WidgetPointer(589,34)), 0, 0, new WidgetPointer(589,34)); + ivar5 = subtract(add(add(getWidgetActualX(), arg3), 3), cs2method2600(new WidgetPointer(arg0))); + ivar6 = subtract(subtract(subtract(add(add(add(getWidgetActualY(), arg4), getWidgetActualY(new WidgetPointer(589,43))), getWidgetActualY(new WidgetPointer(589,51))), 3), getWidgetActualHeight(new WidgetPointer(589,34))), cs2method2601(new WidgetPointer(589,51))); + if (add(ivar5, getWidgetActualWidth(new WidgetPointer(589,34))) > getWidgetActualWidth(new WidgetPointer(589,32))) { + ivar5 = subtract(getWidgetActualWidth(new WidgetPointer(589,32)), getWidgetActualWidth(new WidgetPointer(589,34))); + } + if (ivar6 < 0) { + ivar6 = 0; + } + setWidgetPosition(ivar5, ivar6, 0, 0, new WidgetPointer(589,34)); + setScriptCallOnMouseOver(-1, ""); + } + return; +} diff --git a/dumps/scripts/4563.cs2 b/dumps/scripts/4563.cs2 new file mode 100644 index 000000000..65cf0cf23 --- /dev/null +++ b/dumps/scripts/4563.cs2 @@ -0,0 +1,8 @@ +void script_4563(int arg0,int arg1) { + setWidgetIsHidden(true, new WidgetPointer(589,54)); + setWidgetIsHidden(true, new WidgetPointer(589,34)); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setScriptCallOnMouseOver(-1, ""); + } + return; +} diff --git a/dumps/scripts/4564.cs2 b/dumps/scripts/4564.cs2 new file mode 100644 index 000000000..ec9697fd3 --- /dev/null +++ b/dumps/scripts/4564.cs2 @@ -0,0 +1,19 @@ +void script_4564(int arg0,string arg1) { + switch (arg0) { + case 6: + cs2method3605(strRemoveEntities(arg1)); + break; + case 7: + cs2method3607(strRemoveEntities(arg1)); + break; + case 8: + cs2method3606(strRemoveEntities(arg1)); + break; + case 9: + cs2method3608(strRemoveEntities(arg1)); + break; + case 10: + script_1633(arg1); + } + return; +} diff --git a/dumps/scripts/4565.cs2 b/dumps/scripts/4565.cs2 new file mode 100644 index 000000000..929e465cb --- /dev/null +++ b/dumps/scripts/4565.cs2 @@ -0,0 +1,7 @@ +void script_4565(int arg0) { + setScriptCallOnFriendListChange(4566, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnClanListChange(4566, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnMessage(4566, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + script_4567(arg0); + return; +} diff --git a/dumps/scripts/4566.cs2 b/dumps/scripts/4566.cs2 new file mode 100644 index 000000000..ef1ee11f7 --- /dev/null +++ b/dumps/scripts/4566.cs2 @@ -0,0 +1,4 @@ +void script_4566(int arg0) { + script_4567(arg0); + return; +} diff --git a/dumps/scripts/4567.cs2 b/dumps/scripts/4567.cs2 new file mode 100644 index 000000000..5976478cd --- /dev/null +++ b/dumps/scripts/4567.cs2 @@ -0,0 +1,70 @@ +void script_4567(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + string svar1; + string svar2; + string svar3; + if (cs2method5428(38600727, -1)) { + setScriptCallOnGameloop(4566, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; + } + deleteAllExtraChilds(new WidgetPointer(589,23)); + svar0 = ""; + svar1 = ""; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + svar2 = ""; + svar3 = ""; + while (ivar1 < 100) { + ivar3 = cs2method5004(ivar1); + svar2 = cs2method5010(ivar1); + svar3 = cs2method5019(ivar1); + switch (ivar3) { + case 26: + case 11: + ivar2 = script_4568(ivar2, 0, ivar3, cs2method5003(ivar1), "", ""); + break; + case 9: + ivar2 = script_4568(ivar2, 1, ivar3, "[" + svar0 + cs2method5011(ivar1) + "" + "] " + svar2 + ": " + svar1 + cs2method5003(ivar1), svar2, svar3); + break; + case 20: + ivar2 = script_4568(ivar2, 1, ivar3, "[" + svar0 + cs2method5011(ivar1) + "" + "] " + svar2 + ": " + svar1 + cs2method5003(ivar1), svar2, svar3); + break; + case 115: + ivar2 = script_4568(ivar2, 0, ivar3, "" + cs2method5003(ivar1) + "", "", ""); + } + ivar1 = add(ivar1, 1); + } + ivar4 = divide(getWidgetActualHeight(new WidgetPointer(589,23)), 15); + ivar1 = 0; + ivar5 = 0; + if (ivar2 < ivar4) { + ivar5 = subtract(ivar4, ivar2); + while (ivar1 < ivar5) { + ivar2 = script_4568(ivar2, 0, 0, "", "", ""); + ivar1 = add(ivar1, 1); + } + } + ivar6 = 0; + ivar7 = 0; + while (ivar7 <= ivar2) { + if (setWidgetRegister(new WidgetPointer(589,23), ivar7)) { + ivar6 = add(ivar6, getWidgetActualHeight()); + } + ivar7 = add(ivar7, 1); + } + ivar8 = max(ivar6, multiply(ivar4, 15)); + setWidgetScrollMax(0, ivar8, new WidgetPointer(589,23)); + script_72(38600728, 38600727, subtract(add(globalint_1508, getWidgetScrollMaxV(new WidgetPointer(589,23))), globalint_1509)); + globalint_1508 = cs2method2601(new WidgetPointer(589,23)); + globalint_1509 = getWidgetScrollMaxV(new WidgetPointer(589,23)); + return; +} diff --git a/dumps/scripts/4568.cs2 b/dumps/scripts/4568.cs2 new file mode 100644 index 000000000..68aafc792 --- /dev/null +++ b/dumps/scripts/4568.cs2 @@ -0,0 +1,46 @@ +int script_4568(int arg0,int arg1,int arg2,string arg3,string arg4,string arg5) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar3 = getWidgetActualWidth(new WidgetPointer(589,23)); + ivar4 = multiply(max(getLineCount(ivar3, 494, arg3), 1), 15); + createExtraChild(new WidgetPointer(589,23), 4, arg0); + setWidgetPosition(0, multiply(arg0, 15), 0, 2); + setWidgetSize(0, ivar4, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetFont(494); + setWidgetText(arg3); + setWidgetTextAlignment(0, 0, 15); + ivar5 = 0; + ivar6 = 0; + while (ivar6 < arg0) { + if (setWidgetRegister(new WidgetPointer(589,23), ivar6)) { + ivar5 = add(ivar5, getWidgetActualHeight()); + } + ivar6 = add(ivar6, 1); + } + setWidgetPosition(0, ivar5, 0, 2); + if (((boolean)arg1)) { + cs2method1305(strRemoveEntities(arg4)); + setScriptCallOnClickContextMenu(4569, -2147483644, arg4, arg5, "iss"); + switch (arg2) { + case 9: + case 20: + if (stringMethod4107(strRemoveEntities(cs2method5020()), strRemoveEntities(arg5)) != 0) { + if (isFriend(strRemoveEntities(arg5)) && cs2method3623(strRemoveEntities(arg5))) { + setWidgetContextMenuOption(1, "Add friend"); + setWidgetContextMenuOption(2, "Add ignore"); + } else { + if (isFriend(strRemoveEntities(arg5)) && cs2method6900()) { + setWidgetContextMenuOption(3, "Message"); + } + } + if (((boolean)script_1891())) { + setWidgetContextMenuOption(10, "Kick/ban"); + } + } + } + } + return add(arg0, 1); +} diff --git a/dumps/scripts/4569.cs2 b/dumps/scripts/4569.cs2 new file mode 100644 index 000000000..60da1318c --- /dev/null +++ b/dumps/scripts/4569.cs2 @@ -0,0 +1,23 @@ +void script_4569(int arg0,string arg1,string arg2) { + switch (arg0) { + case 1: + if (isFriend(strRemoveEntities(arg2))) { + cs2method3605(strRemoveEntities(arg2)); + } + break; + case 2: + if (isFriend(strRemoveEntities(arg2))) { + cs2method3607(strRemoveEntities(arg2)); + } + break; + case 3: + script_3015(0, "Send message to " + arg1, "", arg2, ""); + break; + case 5: + script_3177(0, arg1); + break; + case 10: + script_1633(strRemoveEntities(arg2)); + } + return; +} diff --git a/dumps/scripts/457.cs2 b/dumps/scripts/457.cs2 new file mode 100644 index 000000000..668a7f242 --- /dev/null +++ b/dumps/scripts/457.cs2 @@ -0,0 +1,4 @@ +void script_457() { + script_304(52481120); + return; +} diff --git a/dumps/scripts/4570.cs2 b/dumps/scripts/4570.cs2 new file mode 100644 index 000000000..481710db4 --- /dev/null +++ b/dumps/scripts/4570.cs2 @@ -0,0 +1,5 @@ +void script_4570(int arg0,int arg1,int arg2) { + globalint_1507 = script_1401(arg0, 494, getWidgetActualX(new WidgetPointer(arg1)), globalstring_349); + script_4571(arg1, arg2, globalstring_349); + return; +} diff --git a/dumps/scripts/4571.cs2 b/dumps/scripts/4571.cs2 new file mode 100644 index 000000000..747c85efa --- /dev/null +++ b/dumps/scripts/4571.cs2 @@ -0,0 +1,10 @@ +void script_4571(int arg0,int arg1,string arg2) { + setWidgetPosition(script_1551(globalint_1507, 494, getWidgetActualX(new WidgetPointer(arg0)), arg2), 1, 0, 1, new WidgetPointer(arg1)); + if (hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + setScriptCallOnGameloop(4572, getClientCycle(), new WidgetPointer(arg1), "iI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4572.cs2 b/dumps/scripts/4572.cs2 new file mode 100644 index 000000000..6a86de9a8 --- /dev/null +++ b/dumps/scripts/4572.cs2 @@ -0,0 +1,13 @@ +void script_4572(int arg0,int arg1) { + if (cs2method3612() <= 0) { + setWidgetText(new WidgetPointer(589,27), ""); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + return; + } + if ((mod(subtract(getClientCycle(), arg0), 40) < 20) && hasWindowFocus()) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/4573.cs2 b/dumps/scripts/4573.cs2 new file mode 100644 index 000000000..9d7cfdab1 --- /dev/null +++ b/dumps/scripts/4573.cs2 @@ -0,0 +1,12 @@ +void script_4573() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (((boolean)script_1891())) { + setWidgetIsHidden(false, new WidgetPointer(589,50)); + return; + } + script_4574(); + return; +} diff --git a/dumps/scripts/4574.cs2 b/dumps/scripts/4574.cs2 new file mode 100644 index 000000000..d2ba5d7b8 --- /dev/null +++ b/dumps/scripts/4574.cs2 @@ -0,0 +1,5 @@ +void script_4574() { + setWidgetIsHidden(true, new WidgetPointer(589,50)); + setWidgetIsHidden(true, new WidgetPointer(589,4)); + return; +} diff --git a/dumps/scripts/4575.cs2 b/dumps/scripts/4575.cs2 new file mode 100644 index 000000000..30f6979a0 --- /dev/null +++ b/dumps/scripts/4575.cs2 @@ -0,0 +1,7 @@ +void script_4575() { + if (((boolean)script_1891())) { + script_41(38600739); + script_3015(9, "Kick/ban from chat channel", "", "", ""); + } + return; +} diff --git a/dumps/scripts/4576.cs2 b/dumps/scripts/4576.cs2 new file mode 100644 index 000000000..6ba964ecb --- /dev/null +++ b/dumps/scripts/4576.cs2 @@ -0,0 +1,4 @@ +void script_4576(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(1813, 596)); + return; +} diff --git a/dumps/scripts/4577.cs2 b/dumps/scripts/4577.cs2 new file mode 100644 index 000000000..66a935f23 --- /dev/null +++ b/dumps/scripts/4577.cs2 @@ -0,0 +1,4 @@ +void script_4577(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(1814, 596)); + return; +} diff --git a/dumps/scripts/4578.cs2 b/dumps/scripts/4578.cs2 new file mode 100644 index 000000000..6ac0ff358 --- /dev/null +++ b/dumps/scripts/4578.cs2 @@ -0,0 +1,4 @@ +void script_4578(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(1815, 596)); + return; +} diff --git a/dumps/scripts/4579.cs2 b/dumps/scripts/4579.cs2 new file mode 100644 index 000000000..5c34e3239 --- /dev/null +++ b/dumps/scripts/4579.cs2 @@ -0,0 +1,4 @@ +void script_4579(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(1816, 596)); + return; +} diff --git a/dumps/scripts/458.cs2 b/dumps/scripts/458.cs2 new file mode 100644 index 000000000..f2d2cff1c --- /dev/null +++ b/dumps/scripts/458.cs2 @@ -0,0 +1,4 @@ +void script_458(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_2086)); + return; +} diff --git a/dumps/scripts/4580.cs2 b/dumps/scripts/4580.cs2 new file mode 100644 index 000000000..f5bd6a3a9 --- /dev/null +++ b/dumps/scripts/4580.cs2 @@ -0,0 +1,3 @@ +void script_4580() { + return; +} diff --git a/dumps/scripts/4581.cs2 b/dumps/scripts/4581.cs2 new file mode 100644 index 000000000..80ae63d87 --- /dev/null +++ b/dumps/scripts/4581.cs2 @@ -0,0 +1,16 @@ +void script_4581(int arg0) { + int ivar1; + int ivar2; + ivar1 = -1; + ivar2 = -1; + if (cs2method3751() && cs2method3701()) { + ivar1 = cs2method3760(strRemoveEntities(cs2method5020())); + if (ivar1 >= 0) { + ivar2 = cs2method3757(ivar1); + if (ivar2 >= 100) { + globalstring_350 = cs2method3713(arg0); + } + } + } + return; +} diff --git a/dumps/scripts/4582.cs2 b/dumps/scripts/4582.cs2 new file mode 100644 index 000000000..ad92b798e --- /dev/null +++ b/dumps/scripts/4582.cs2 @@ -0,0 +1,24 @@ +string script_4582(int arg0,int arg1,int arg2) { + if (arg0 > 0) { + if (arg1 > 0) { + if (arg2 > 0) { + return intToStr(arg0) + " " + script_4583(arg0, "day", "days") + ", " + intToStr(arg1) + " " + script_4583(arg0, "hour", "hours") + " and " + intToStr(arg2) + " " + script_4583(arg0, "minute", "minutes"); + } + return intToStr(arg0) + " " + script_4583(arg0, "day", "days") + " and " + intToStr(arg1) + " " + script_4583(arg0, "hour", "hours"); + } + if (arg2 > 0) { + return intToStr(arg0) + " " + script_4583(arg0, "day", "days") + " and " + intToStr(arg2) + " " + script_4583(arg0, "minute", "minutes"); + } + return intToStr(arg0) + " " + script_4583(arg0, "day", "days"); + } + if (arg1 > 0) { + if (arg2 > 0) { + return script_4583(arg0, "hour", "hours") + " and " + intToStr(arg2) + " " + script_4583(arg0, "minute", "minutes"); + } + return intToStr(arg1) + " " + script_4583(arg0, "hour", "hours"); + } + if (arg2 > 0) { + return intToStr(arg2) + " " + script_4583(arg0, "minute", "minutes"); + } + return ""; +} diff --git a/dumps/scripts/4583.cs2 b/dumps/scripts/4583.cs2 new file mode 100644 index 000000000..a124e81bf --- /dev/null +++ b/dumps/scripts/4583.cs2 @@ -0,0 +1,6 @@ +string script_4583(int arg0,string arg1,string arg2) { + if (((boolean)arg0)) { + return arg1; + } + return arg2; +} diff --git a/dumps/scripts/4584.cs2 b/dumps/scripts/4584.cs2 new file mode 100644 index 000000000..086fd9ac8 --- /dev/null +++ b/dumps/scripts/4584.cs2 @@ -0,0 +1,5 @@ +void script_4584(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_2732(arg0, arg1, bitconfig_9191, 3); + setScriptCallOnClickContextMenu(4585, -2147483644, arg1, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg7), "iiIIIIII", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4585.cs2 b/dumps/scripts/4585.cs2 new file mode 100644 index 000000000..e55628da0 --- /dev/null +++ b/dumps/scripts/4585.cs2 @@ -0,0 +1,12 @@ +void script_4585(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + if (arg0 != 1) { + return; + } + if (bitconfig_9191 == arg1) { + return; + } + bitconfig_9191 = arg1; + playSoundEffect(2266, 1, 0); + script_2735(arg2, arg3, arg4, arg5, arg6, arg7); + return; +} diff --git a/dumps/scripts/4586.cs2 b/dumps/scripts/4586.cs2 new file mode 100644 index 000000000..709881b8d --- /dev/null +++ b/dumps/scripts/4586.cs2 @@ -0,0 +1,15 @@ +void script_4586(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = -1; + if ((arg2 > 0) && (arg3 > 0)) { + ivar4 = cs2method_3408(105, 103, 3703, arg2); + if (ivar4 != -1) { + setWidgetText(new WidgetPointer(arg0), cs2method_3408(105, 115, ivar4, arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + return; + } + } + setWidgetText(new WidgetPointer(arg0), ""); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/4587.cs2 b/dumps/scripts/4587.cs2 new file mode 100644 index 000000000..59e73eeb0 --- /dev/null +++ b/dumps/scripts/4587.cs2 @@ -0,0 +1,4 @@ +void script_4587(int arg0,int arg1) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4588.cs2 b/dumps/scripts/4588.cs2 new file mode 100644 index 000000000..7c94f5500 --- /dev/null +++ b/dumps/scripts/4588.cs2 @@ -0,0 +1,6 @@ +void script_4588(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + setWidgetSprite(arg3, new WidgetPointer(arg2)); + setWidgetSprite(arg5, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/4589.cs2 b/dumps/scripts/4589.cs2 new file mode 100644 index 000000000..96d1a5b66 --- /dev/null +++ b/dumps/scripts/4589.cs2 @@ -0,0 +1,25 @@ +void script_4589() { + string svar0; + deleteAllExtraChilds(new WidgetPointer(1110,14)); + deleteAllExtraChilds(new WidgetPointer(1110,12)); + deleteAllExtraChilds(new WidgetPointer(1110,15)); + deleteAllExtraChilds(new WidgetPointer(1110,17)); + deleteAllExtraChilds(new WidgetPointer(1110,18)); + deleteAllExtraChilds(new WidgetPointer(1110,16)); + setWidgetIsHidden(true, new WidgetPointer(1110,27)); + setWidgetIsHidden(false, new WidgetPointer(1110,67)); + setWidgetText(new WidgetPointer(1110,62), "You are not currently in a Clan Chat channel."); + setWidgetIsHidden(true, new WidgetPointer(1110,29)); + setWidgetIsHidden(false, new WidgetPointer(1110,22)); + script_4469(); + setWidgetSprite(6256, new WidgetPointer(1110,86)); + setWidgetIsHidden(true, new WidgetPointer(1110,13)); + setWidgetSize(1, 19, 0, 0, new WidgetPointer(1110,20)); + globalint_1518 = -1; + globalstring_126 = ""; + setWidgetText(new WidgetPointer(1110,26), ""); + svar0 = "Join your clan chat channel."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1110,60), new WidgetPointer(-32768,3), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1110,85)); + setWidgetContextMenuOption(1, new WidgetPointer(1110,85), "Join Clan Chat channel"); + return; +} diff --git a/dumps/scripts/459.cs2 b/dumps/scripts/459.cs2 new file mode 100644 index 000000000..40f3fdb9a --- /dev/null +++ b/dumps/scripts/459.cs2 @@ -0,0 +1,10 @@ +void script_459(int arg0) { + if (getSkillActualLvl(0) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "An Attack level of " + intToStr(25) + " is required." + ""); + } else if (bitconfig_2086 < 1) { + setWidgetText(new WidgetPointer(arg0), "" + "1 Commendation required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(multiply(divide(pow(getSkillActualLvl(0), 2), 600), 35)) + " XP per Commendation."); + } + return; +} diff --git a/dumps/scripts/4590.cs2 b/dumps/scripts/4590.cs2 new file mode 100644 index 000000000..900972f31 --- /dev/null +++ b/dumps/scripts/4590.cs2 @@ -0,0 +1,29 @@ +cs2func_script_4590_struct(6,0,0) script_4590() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + if (cs2method3751()) { + ivar2 = cs2method3754(); + ivar0 = cs2method3760(strRemoveEntities(cs2method5020())); + if (ivar0 >= 0) { + ivar1 = cs2method3757(ivar0); + } + } + if (cs2method3750()) { + ivar5 = cs2method3754(); + ivar3 = cs2method3760(strRemoveEntities(cs2method5020())); + if (ivar3 >= 0) { + ivar4 = cs2method3757(ivar3); + } + } + return newstruct cs2func_script_4590_struct(ivar0, ivar1, ivar2, ivar3, ivar4, ivar5); +} diff --git a/dumps/scripts/4591.cs2 b/dumps/scripts/4591.cs2 new file mode 100644 index 000000000..ee6517a3f --- /dev/null +++ b/dumps/scripts/4591.cs2 @@ -0,0 +1,27 @@ +string script_4591(string arg0) { + int ivar0; + int ivar1; + arg0 = lower(strRemoveEntities(arg0)); + ivar0 = strLength(arg0); + ivar1 = 0; + arg0 = script_2332(arg0, "_", "\u00a0"); + arg0 = script_2332(arg0, "-", "\u00a0"); + arg0 = script_2332(arg0, " ", "\u00a0"); + while (((boolean)strIndexof(0, arg0, " ")) && (ivar0 > 0)) { + arg0 = substr(1, ivar0, arg0); + ivar0 = strLength(arg0); + } + while ((strIndexof(subtract(ivar0, 1), arg0, " ") == subtract(ivar0, 1)) && (ivar0 > 0)) { + arg0 = substr(0, subtract(ivar0, 1), arg0); + ivar0 = strLength(arg0); + } + while (((boolean)strIndexof(0, arg0, "\u00a0")) && (ivar0 > 0)) { + arg0 = substr(1, ivar0, arg0); + ivar0 = strLength(arg0); + } + while ((strIndexof(subtract(ivar0, 1), arg0, "\u00a0") == subtract(ivar0, 1)) && (ivar0 > 0)) { + arg0 = substr(0, subtract(ivar0, 1), arg0); + ivar0 = strLength(arg0); + } + return arg0; +} diff --git a/dumps/scripts/4592.cs2 b/dumps/scripts/4592.cs2 new file mode 100644 index 000000000..7b5e362a1 --- /dev/null +++ b/dumps/scripts/4592.cs2 @@ -0,0 +1,225 @@ +void script_4592() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + deleteAllExtraChilds(new WidgetPointer(17,17)); + deleteAllExtraChilds(new WidgetPointer(17,20)); + deleteAllExtraChilds(new WidgetPointer(17,22)); + deleteAllExtraChilds(new WidgetPointer(17,15)); + if (((boolean)bitconfig_9226)) { + setWidgetText(new WidgetPointer(17,12), "If you die in the Wilderness..."); + } else { + setWidgetText(new WidgetPointer(17,12), "Items kept on death"); + } + if (bitconfig_9226 == 2) { + createExtraChild(new WidgetPointer(17,15), 4, 0); + script_4595(); + setWidgetText(globalstring_351); + setScriptCallOnGlobalStringChange(4596, new WidgetPointer(-32768,3), -2147483643, 351, 1, "IiY"); + return; + } + if (((getContainerFreeSlots(93) >= getItemContainerLength(93)) && (getContainerFreeSlots(94) >= getItemContainerLength(94))) && ((getContainerFreeSlots(530) >= getItemContainerLength(530)) || isMember())) { + createExtraChild(new WidgetPointer(17,15), 4, 0); + script_4595(); + setWidgetText("You have no items to lose."); + return; + } + ivar0 = getWidgetActualWidth(new WidgetPointer(17,15)); + ivar1 = max(divide(ivar0, 36), 1); + ivar2 = max(divide(subtract(ivar0, multiply(36, ivar1)), max(subtract(ivar1, 1), 1)), 2); + ivar3 = max(divide(ivar2, 2), add(subtract(36, 32), 1)); + globalarray_0 = new int[4]; + globalarray_1 = new int[3]; + globalarray_2 = new int[3]; + globalarray_3 = new int[3]; + if (bitconfig_9227 > 0) { + if (((boolean)bitconfig_9226)) { + if (((boolean)bitconfig_9229)) { + globalarray_0[0] = script_4593(1114128, "You may choose " + intToStr(bitconfig_9227) + " of the following items to keep, and all others will be dropped." + "
" + "The " + "" + "highlighted" + "" + " items will be chosen by default."); + } else { + globalarray_0[0] = script_4593(1114128, "You may choose " + intToStr(bitconfig_9227) + " of the following items to keep, unless you become skulled, and all others will be dropped." + "
" + "The " + "" + "highlighted" + "" + " items are chosen by default."); + } + } else if (((boolean)bitconfig_9229)) { + globalarray_0[0] = script_4593(1114128, "You will keep the following items:"); + } else { + globalarray_0[0] = script_4593(1114128, "You will keep the following items, unless you become skulled:"); + } + } else { + globalarray_0[0] = script_4593(1114128, "You will drop the following items:"); + } + if (((boolean)bitconfig_9226)) { + globalarray_0[1] = script_4593(1114131, "You will keep the following items automatically:"); + } else { + globalarray_0[1] = script_4593(1114131, "You will drop the following items:"); + } + globalarray_0[2] = script_4593(1114133, "The following items are always lost:"); + globalarray_4 = new int[4]; + globalarray_0[0] = script_750(bitconfig_9222); + globalarray_0[1] = script_750(bitconfig_9223); + globalarray_0[2] = script_750(bitconfig_9224); + globalarray_0[3] = script_750(bitconfig_9225); + ivar4 = add(getItemContainerLength(93), getItemContainerLength(94)); + deleteAllExtraChilds(new WidgetPointer(17,18)); + ivar5 = 0; + while ((ivar5 < bitconfig_9227) && (ivar5 < 4)) { + if (globalarray_4[ivar5] != -1) { + createExtraChild(new WidgetPointer(17,18), 3, getExtraChildGap(new WidgetPointer(17,18))); + createExtraChild(new WidgetPointer(17,18), 3, getExtraChildGap(new WidgetPointer(17,18))); + setWidgetSize(36, 36, 0, 0); + setWidgetSize(36, 36, 0, 0); + setWidgetPosition(add(globalarray_1[0], 1), add(globalarray_2[0], 1), 0, 0); + setWidgetPosition(globalarray_1[0], globalarray_2[0], 0, 0); + setWidgetRGB(new Color(128, 128, 0)); + setWidgetRGB(new Color(190, 190, 0)); + setWidgetFilled(0); + setWidgetFilled(0); + cs2method2103(150); + cs2method2103(0); + script_4594(globalarray_4[ivar5], -1, globalarray_1[0], globalarray_2[0], 1114130); + globalarray_0[0] = add(add(globalarray_1[0], 36), ivar2); + if (add(globalarray_1[0], 36) >= ivar0) { + globalarray_0[0] = 0; + globalarray_0[0] = add(add(globalarray_2[0], 32), ivar3); + } + globalarray_0[0] = add(globalarray_3[0], 1); + } else { + createExtraChild(new WidgetPointer(17,18), 3, getExtraChildGap(new WidgetPointer(17,18))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(17,18), 3, getExtraChildGap(new WidgetPointer(17,18))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(17,18), 3, getExtraChildGap(new WidgetPointer(17,18))); + setWidgetHidden(1); + } + ivar5 = add(ivar5, 1); + } + ivar5 = 0; + ivar6 = -1; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + while (ivar5 <= ivar4) { + ivar6 = script_750(ivar5); + if (ivar6 != -1) { + ivar7 = script_1393(ivar5); + ivar8 = 0; + while ((ivar8 < 4) && (ivar7 > 0)) { + if (globalarray_4[ivar8] == ivar6) { + ivar7 = subtract(ivar7, 1); + globalarray_0[ivar8] = -1; + } + ivar8 = add(ivar8, 1); + } + if (ivar7 > 0) { + ivar9 = getItemHashmapData(getRealItem(ivar6), 1397); + if (ivar9 == -1) { + script_4594(-1, -1, -1, -1, 1114129); + script_4594(-1, -1, -1, -1, 1114132); + script_4594(ivar6, ivar7, globalarray_1[2], globalarray_2[2], 1114134); + globalarray_0[2] = add(add(globalarray_1[2], 36), ivar2); + if (add(globalarray_1[2], 36) >= ivar0) { + globalarray_0[2] = 0; + globalarray_0[2] = add(add(globalarray_2[2], 32), ivar3); + } + globalarray_0[2] = add(globalarray_3[2], 1); + } else if (((boolean)ivar9) || (bitconfig_9226 != 0)) { + script_4594(-1, -1, -1, -1, 1114129); + script_4594(ivar6, ivar7, globalarray_1[1], globalarray_2[1], 1114132); + script_4594(-1, -1, -1, -1, 1114134); + globalarray_0[1] = add(add(globalarray_1[1], 36), ivar2); + if (add(globalarray_1[1], 36) >= ivar0) { + globalarray_0[1] = 0; + globalarray_0[1] = add(add(globalarray_2[1], 32), ivar3); + } + globalarray_0[1] = add(globalarray_3[1], 1); + } else { + script_4594(ivar6, ivar7, globalarray_1[0], globalarray_2[0], 1114129); + script_4594(-1, -1, -1, -1, 1114132); + script_4594(-1, -1, -1, -1, 1114134); + globalarray_0[0] = add(add(globalarray_1[0], 36), ivar2); + if (add(globalarray_1[0], 36) >= ivar0) { + globalarray_0[0] = 0; + globalarray_0[0] = add(add(globalarray_2[0], 32), ivar3); + } + globalarray_0[0] = add(globalarray_3[0], 1); + } + } else { + script_4594(-1, -1, -1, -1, 1114129); + script_4594(-1, -1, -1, -1, 1114132); + script_4594(-1, -1, -1, -1, 1114134); + } + } else { + script_4594(-1, -1, -1, -1, 1114129); + script_4594(-1, -1, -1, -1, 1114132); + script_4594(-1, -1, -1, -1, 1114134); + } + ivar5 = add(ivar5, 1); + } + if (globalarray_1[0] > 0) { + globalarray_0[0] = add(add(globalarray_2[0], 32), ivar3); + } else { + if (globalarray_3[0] <= 0) { + globalarray_0[0] = 0; + globalarray_0[0] = 0; + } + } + if (globalarray_1[1] > 0) { + globalarray_0[1] = add(add(globalarray_2[1], 32), ivar3); + } else { + if (globalarray_3[1] <= 0) { + globalarray_0[1] = 0; + globalarray_0[1] = 0; + } + } + if (globalarray_1[2] > 0) { + globalarray_0[2] = add(add(globalarray_2[2], 32), ivar3); + } else { + if (globalarray_3[2] <= 0) { + globalarray_0[2] = 0; + globalarray_0[2] = 0; + } + } + ivar10 = 0; + setWidgetSize(0, globalarray_0[0], 1, 0, new WidgetPointer(17,16)); + setWidgetPosition(0, ivar10, 1, 0, new WidgetPointer(17,16)); + ivar10 = add(ivar10, globalarray_0[0]); + setWidgetSize(0, globalarray_2[0], 1, 0, new WidgetPointer(17,17)); + setWidgetPosition(0, ivar10, 1, 0, new WidgetPointer(17,17)); + ivar10 = add(add(ivar10, globalarray_2[0]), 5); + setWidgetSize(0, globalarray_0[1], 1, 0, new WidgetPointer(17,19)); + setWidgetPosition(0, ivar10, 1, 0, new WidgetPointer(17,19)); + ivar10 = add(ivar10, globalarray_0[1]); + setWidgetSize(0, globalarray_2[1], 1, 0, new WidgetPointer(17,20)); + setWidgetPosition(0, ivar10, 1, 0, new WidgetPointer(17,20)); + ivar10 = add(add(ivar10, globalarray_2[1]), 5); + setWidgetSize(0, globalarray_0[2], 1, 0, new WidgetPointer(17,21)); + setWidgetPosition(0, ivar10, 1, 0, new WidgetPointer(17,21)); + ivar10 = add(ivar10, globalarray_0[2]); + setWidgetSize(0, globalarray_2[2], 1, 0, new WidgetPointer(17,22)); + setWidgetPosition(0, ivar10, 1, 0, new WidgetPointer(17,22)); + ivar10 = add(ivar10, globalarray_2[2]); + if ((getContainerFreeSlots(530) < getItemContainerLength(530)) && isMember()) { + globalarray_0[3] = script_4593(1114135, "You have items stored on your " + "" + "beast of burden" + "" + " that will be dropped if either of you dies."); + } + setWidgetSize(0, globalarray_0[3], 1, 0, new WidgetPointer(17,23)); + setWidgetPosition(0, ivar10, 1, 0, new WidgetPointer(17,23)); + ivar10 = add(ivar10, globalarray_0[3]); + setWidgetScrollMax(0, ivar10, new WidgetPointer(17,15)); + if (ivar10 > getWidgetActualHeight(new WidgetPointer(17,15))) { + script_31(1114136, 1114127, 792, 789, 790, 791, 773, 788); + setWidgetIsHidden(false, new WidgetPointer(17,24)); + setWidgetPosition(0, 0, 0, 1, new WidgetPointer(17,15)); + } else { + setWidgetIsHidden(true, new WidgetPointer(17,24)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(17,15)); + cs2method2100(0, 0, new WidgetPointer(17,15)); + } + return; +} diff --git a/dumps/scripts/4593.cs2 b/dumps/scripts/4593.cs2 new file mode 100644 index 000000000..f472ce262 --- /dev/null +++ b/dumps/scripts/4593.cs2 @@ -0,0 +1,7 @@ +int script_4593(int arg0,string arg1) { + int ivar1; + ivar1 = add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(arg0)), 495, arg1), 15), 5); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetText(new WidgetPointer(arg0), arg1); + return ivar1; +} diff --git a/dumps/scripts/4594.cs2 b/dumps/scripts/4594.cs2 new file mode 100644 index 000000000..0f4fd693d --- /dev/null +++ b/dumps/scripts/4594.cs2 @@ -0,0 +1,19 @@ +void script_4594(int arg0,int arg1,int arg2,int arg3,int arg4) { + createExtraChild(new WidgetPointer(arg4), 5, getExtraChildGap(new WidgetPointer(arg4))); + if ((arg2 != -1) && (arg3 != -1)) { + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(arg2, 2), add(arg3, 2), 0, 0); + if (arg1 <= 0) { + setItemOnWidgetMethod1205(arg0, 1); + } else { + setItemOnWidgetMethod1200(arg0, arg1); + } + setWidgetContextMenuOption(10, "Examine"); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + cs2method1305("" + getItemName(arg0) + ""); + } else { + setWidgetHidden(1); + } + return; +} diff --git a/dumps/scripts/4595.cs2 b/dumps/scripts/4595.cs2 new file mode 100644 index 000000000..52fee808e --- /dev/null +++ b/dumps/scripts/4595.cs2 @@ -0,0 +1,19 @@ +void script_4595() { + setWidgetIsHidden(true, new WidgetPointer(17,17)); + setWidgetIsHidden(true, new WidgetPointer(17,16)); + setWidgetIsHidden(true, new WidgetPointer(17,20)); + setWidgetIsHidden(true, new WidgetPointer(17,19)); + setWidgetIsHidden(true, new WidgetPointer(17,22)); + setWidgetIsHidden(true, new WidgetPointer(17,21)); + setWidgetIsHidden(true, new WidgetPointer(17,24)); + setWidgetScrollMax(0, 0, new WidgetPointer(17,15)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(17,15)); + cs2method2100(0, 0, new WidgetPointer(17,15)); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(495); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(true); + return; +} diff --git a/dumps/scripts/4596.cs2 b/dumps/scripts/4596.cs2 new file mode 100644 index 000000000..d16573459 --- /dev/null +++ b/dumps/scripts/4596.cs2 @@ -0,0 +1,6 @@ +void script_4596(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetText(globalstring_351); + } + return; +} diff --git a/dumps/scripts/4597.cs2 b/dumps/scripts/4597.cs2 new file mode 100644 index 000000000..b008e5e14 --- /dev/null +++ b/dumps/scripts/4597.cs2 @@ -0,0 +1,49 @@ +void script_4597() { + int ivar0; + string svar0; + string svar1; + svar0 = "What if I entered the Wilderness?"; + svar1 = "Back"; + ivar0 = 0; + if (bitconfig_9226 >= 2) { + setWidgetIsHidden(true, new WidgetPointer(17,28)); + setWidgetSize(16, 0, 1, 1, new WidgetPointer(17,26)); + setWidgetSize(16, 0, 0, 1, new WidgetPointer(17,27)); + } else if (((boolean)bitconfig_9226)) { + setWidgetText(new WidgetPointer(17,30), svar1); + } else { + setWidgetText(new WidgetPointer(17,30), svar0); + } + ivar0 = max(getLineCount(getWidgetActualWidth(new WidgetPointer(17,30)), 495, svar0), getLineCount(getWidgetActualWidth(new WidgetPointer(17,30)), 495, svar1)); + ivar0 = add(multiply(ivar0, 12), 10); + setWidgetSize(10, ivar0, 1, 0, new WidgetPointer(17,28)); + setWidgetIsHidden(false, new WidgetPointer(17,28)); + ivar0 = add(ivar0, 5); + setWidgetSize(16, ivar0, 1, 1, new WidgetPointer(17,26)); + setWidgetSize(16, ivar0, 0, 1, new WidgetPointer(17,27)); + script_680(1114141); + setScriptCallOnMouseEntered(95, new WidgetPointer(17,29), "I", new WidgetPointer(17,28)); + setScriptCallOnMouseExit(93, new WidgetPointer(17,29), "I", new WidgetPointer(17,28)); + deleteAllExtraChilds(new WidgetPointer(17,26)); + ivar0 = add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(17,26)), 494, globalstring_352), 10), 2); + createExtraChild(new WidgetPointer(17,26), 4, 0); + setWidgetSize(0, ivar0, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(true); + setWidgetText(globalstring_352); + if (ivar0 > getWidgetActualHeight(new WidgetPointer(17,26))) { + setWidgetScrollMax(0, ivar0, new WidgetPointer(17,26)); + script_31(1114139, 1114138, 792, 789, 790, 791, 773, 788); + setWidgetIsHidden(false, new WidgetPointer(17,27)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(17,26)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(17,26)); + setWidgetIsHidden(true, new WidgetPointer(17,27)); + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(17,26)); + cs2method2100(0, 0, new WidgetPointer(17,26)); + } + return; +} diff --git a/dumps/scripts/4598.cs2 b/dumps/scripts/4598.cs2 new file mode 100644 index 000000000..64c0994b8 --- /dev/null +++ b/dumps/scripts/4598.cs2 @@ -0,0 +1,40 @@ +void script_4598(int arg0) { + int ivar1; + string svar0; + deleteAllExtraChilds(new WidgetPointer(16,20)); + script_4534(1048596); + deleteAllExtraChilds(new WidgetPointer(16,39)); + script_4534(1048615); + deleteAllExtraChilds(new WidgetPointer(16,59)); + script_4535(1048635); + script_4513(1048584, 1746); + script_4510(1048644, 1736); + script_4510(1048645, 1737); + script_4530(1048578); + script_4531(1048648); + script_4532(1048650); + script_4530(1048653); + script_4531(1048657); + script_4599(11694, 1, 1048590, "A beautiful, heavy sword."); + script_4599(20151, 1, 1048591, "An ancient ranger's body armour."); + script_4599(20167, 1, 1048592, "An ancient mage's robe legs."); + script_4599(2667, 1, 1048607, "A rune kiteshield in the colours of Saradomin."); + script_4599(4587, 1, 1048608, "A vicious, curved sword."); + script_4599(1955, 1, 1048609, "Keeps the doctor away."); + script_4599(11235, 1, 1048610, "A bow from a darker dimension."); + script_4599(560, 1337, 1048611, "Used for medium level missile spells."); + script_4599(4151, 1, 1048612, "A weapon from the Abyss."); + script_4599(995, 6969, 1048624, "Lovely money!"); + script_4599(11279, 1, 1048625, "The severed head of the great dragon Elvarg!"); + script_4599(2347, 1, 1048626, "Good for hitting things!"); + script_4599(14090, 1, 1048627, "This cat definitely likes you."); + svar0 = cs2method_3408(105, 115, 3796, 0); + setWidgetText(new WidgetPointer(16,63), svar0); + ivar1 = add(max(getTextWidth(494, getWidgetText(new WidgetPointer(16,58))), getTextWidth(494, svar0)), 26); + setWidgetSize(ivar1, getWidgetActualHeight(new WidgetPointer(16,52)), 0, 0, new WidgetPointer(16,52)); + setWidgetSize(ivar1, getWidgetActualHeight(new WidgetPointer(16,59)), 0, 0, new WidgetPointer(16,59)); + setWidgetPosition(max(subtract(add(ivar1, 1), divide(subtract(getWidgetActualWidth(new WidgetPointer(16,3)), getWidgetActualWidth(new WidgetPointer(16,4))), 2)), 0), 0, 1, 0, new WidgetPointer(16,4)); + setScriptCallOnGlobalConfigChange(4601, new WidgetPointer(arg0), 1514, 1, "IY", new WidgetPointer(arg0)); + script_4602(globalint_1514, arg0); + return; +} diff --git a/dumps/scripts/4599.cs2 b/dumps/scripts/4599.cs2 new file mode 100644 index 000000000..7c96f2832 --- /dev/null +++ b/dumps/scripts/4599.cs2 @@ -0,0 +1,12 @@ +void script_4599(int arg0,int arg1,int arg2,string arg3) { + if (arg1 > 1) { + setItemOnWidgetMethod2212(arg0, arg1, new WidgetPointer(arg2)); + } else { + setItemOnWidgetMethod2205(arg0, 1, new WidgetPointer(arg2)); + } + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -2147483643, 100, 0, 8, "Iiiii", new WidgetPointer(arg2)); + setWidgetContextMenuOption(10, new WidgetPointer(arg2), "Examine"); + cs2method2305(new WidgetPointer(arg2), "" + getItemName(arg0) + ""); + setScriptCallOnClickContextMenu(4600, -2147483644, arg3, "is", new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/46.cs2 b/dumps/scripts/46.cs2 new file mode 100644 index 000000000..025ce33ae --- /dev/null +++ b/dumps/scripts/46.cs2 @@ -0,0 +1,20 @@ +string script_46(int arg0,string arg1) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar1 = divide(arg0, 1000000000); + ivar2 = divide(subtract(arg0, multiply(ivar1, 1000000000)), 1000000); + ivar3 = divide(subtract(arg0, add(multiply(ivar1, 1000000000), multiply(ivar2, 1000000))), 1000); + ivar4 = subtract(arg0, add(add(multiply(ivar1, 1000000000), multiply(ivar2, 1000000)), multiply(ivar3, 1000))); + if (ivar1 > 0) { + return intToStr(ivar1) + arg1 + script_47(ivar2) + arg1 + script_47(ivar3) + arg1 + script_47(ivar4); + } + if (ivar2 > 0) { + return intToStr(ivar2) + arg1 + script_47(ivar3) + arg1 + script_47(ivar4); + } + if (ivar3 > 0) { + return intToStr(ivar3) + arg1 + script_47(ivar4); + } + return intToStr(arg0); +} diff --git a/dumps/scripts/460.cs2 b/dumps/scripts/460.cs2 new file mode 100644 index 000000000..b493978c1 --- /dev/null +++ b/dumps/scripts/460.cs2 @@ -0,0 +1,10 @@ +void script_460(int arg0) { + if (getSkillActualLvl(2) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "A Strength level of " + intToStr(25) + " is required." + ""); + } else if (bitconfig_2086 < 1) { + setWidgetText(new WidgetPointer(arg0), "" + "1 Commendation required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(multiply(divide(pow(getSkillActualLvl(2), 2), 600), 35)) + " XP per Commendation."); + } + return; +} diff --git a/dumps/scripts/4600.cs2 b/dumps/scripts/4600.cs2 new file mode 100644 index 000000000..ceab24c2f --- /dev/null +++ b/dumps/scripts/4600.cs2 @@ -0,0 +1,6 @@ +void script_4600(int arg0,string arg1) { + if (arg0 == 10) { + message(27, 0, arg1); + } + return; +} diff --git a/dumps/scripts/4601.cs2 b/dumps/scripts/4601.cs2 new file mode 100644 index 000000000..493c93622 --- /dev/null +++ b/dumps/scripts/4601.cs2 @@ -0,0 +1,4 @@ +void script_4601(int arg0) { + script_4602(globalint_1514, arg0); + return; +} diff --git a/dumps/scripts/4602.cs2 b/dumps/scripts/4602.cs2 new file mode 100644 index 000000000..230ffce4a --- /dev/null +++ b/dumps/scripts/4602.cs2 @@ -0,0 +1,75 @@ +void script_4602(int arg0,int arg1) { + flow_0: + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + } + setWidgetIsHidden(true, new WidgetPointer(16,1)); + setWidgetIsHidden(true, new WidgetPointer(16,52)); + setWidgetIsHidden(true, new WidgetPointer(16,59)); + setWidgetIsHidden(true, new WidgetPointer(16,37)); + setWidgetIsHidden(true, new WidgetPointer(16,4)); + setWidgetIsHidden(true, new WidgetPointer(16,18)); + setWidgetIsHidden(true, new WidgetPointer(16,64)); + setWidgetIsHidden(true, new WidgetPointer(16,76)); + GOTO flow_6 + flow_1: + setWidgetIsHidden(false, new WidgetPointer(16,1)); + setWidgetIsHidden(false, new WidgetPointer(16,52)); + setWidgetIsHidden(false, new WidgetPointer(16,59)); + setWidgetIsHidden(true, new WidgetPointer(16,37)); + setWidgetIsHidden(true, new WidgetPointer(16,4)); + setWidgetIsHidden(true, new WidgetPointer(16,18)); + setWidgetIsHidden(true, new WidgetPointer(16,64)); + setWidgetIsHidden(true, new WidgetPointer(16,76)); + GOTO flow_6 + flow_2: + setWidgetIsHidden(true, new WidgetPointer(16,1)); + setWidgetIsHidden(true, new WidgetPointer(16,52)); + setWidgetIsHidden(true, new WidgetPointer(16,59)); + setWidgetIsHidden(true, new WidgetPointer(16,37)); + setWidgetIsHidden(true, new WidgetPointer(16,4)); + setWidgetIsHidden(true, new WidgetPointer(16,18)); + setWidgetIsHidden(true, new WidgetPointer(16,64)); + setWidgetIsHidden(false, new WidgetPointer(16,76)); + GOTO flow_6 + flow_3: + setWidgetIsHidden(false, new WidgetPointer(16,1)); + setWidgetIsHidden(false, new WidgetPointer(16,52)); + setWidgetIsHidden(true, new WidgetPointer(16,59)); + setWidgetIsHidden(false, new WidgetPointer(16,37)); + setWidgetIsHidden(true, new WidgetPointer(16,4)); + setWidgetIsHidden(true, new WidgetPointer(16,18)); + setWidgetIsHidden(true, new WidgetPointer(16,64)); + setWidgetIsHidden(true, new WidgetPointer(16,76)); + GOTO flow_6 + flow_4: + setWidgetIsHidden(false, new WidgetPointer(16,1)); + setWidgetIsHidden(false, new WidgetPointer(16,52)); + setWidgetIsHidden(true, new WidgetPointer(16,59)); + setWidgetIsHidden(false, new WidgetPointer(16,37)); + setWidgetIsHidden(false, new WidgetPointer(16,4)); + setWidgetIsHidden(false, new WidgetPointer(16,18)); + setWidgetIsHidden(true, new WidgetPointer(16,64)); + setWidgetIsHidden(true, new WidgetPointer(16,76)); + GOTO flow_6 + flow_5: + setWidgetIsHidden(false, new WidgetPointer(16,1)); + setWidgetIsHidden(false, new WidgetPointer(16,52)); + setWidgetIsHidden(true, new WidgetPointer(16,59)); + setWidgetIsHidden(false, new WidgetPointer(16,37)); + setWidgetIsHidden(false, new WidgetPointer(16,4)); + setWidgetIsHidden(false, new WidgetPointer(16,18)); + setWidgetIsHidden(false, new WidgetPointer(16,64)); + setWidgetIsHidden(true, new WidgetPointer(16,76)); + flow_6: + return; +} diff --git a/dumps/scripts/4603.cs2 b/dumps/scripts/4603.cs2 new file mode 100644 index 000000000..4b542b55f --- /dev/null +++ b/dumps/scripts/4603.cs2 @@ -0,0 +1,4 @@ +void script_4603(int arg0) { + globalint_1497 = arg0; + return; +} diff --git a/dumps/scripts/4604.cs2 b/dumps/scripts/4604.cs2 new file mode 100644 index 000000000..cb2590b13 --- /dev/null +++ b/dumps/scripts/4604.cs2 @@ -0,0 +1,27 @@ +void script_4604(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2174)), new WidgetPointer(arg2)); + ivar3 = getWidgetActualHeight(new WidgetPointer(arg1)); + ivar4 = 1; + if (bitconfig_9258 > 0) { + ivar4 = max(min(subtract(ivar3, multiply(bitconfig_9258, 2)), ivar3), 0); + } + script_4610(ivar4); + ivar5 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar6 = 0; + if (bitconfig_9259 > 0) { + ivar6 = max(min(subtract(ivar5, multiply(bitconfig_9259, divide(ivar5, 8))), ivar5), 0); + ivar6 = max(min(subtract(ivar6, divide(ivar5, 16)), ivar5), 0); + } + ivar7 = 0; + if (bitconfig_9260 > 0) { + ivar7 = max(min(multiply(bitconfig_9260, divide(ivar5, 128)), ivar5), 0); + } + setWidgetRGB(new Color(bitconfig_9258), new WidgetPointer(arg0)); + script_4609(ivar7, ivar6); + return; +} diff --git a/dumps/scripts/4605.cs2 b/dumps/scripts/4605.cs2 new file mode 100644 index 000000000..22c77c2b1 --- /dev/null +++ b/dumps/scripts/4605.cs2 @@ -0,0 +1,11 @@ +void script_4605(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + ivar5 = getWidgetActualHeight(new WidgetPointer(arg1)); + ivar6 = divide(multiply(subtract(ivar5, arg4), 64), ivar5); + setWidgetRGB(new Color(ivar6), new WidgetPointer(arg0)); + bitconfig_9258 = mod(ivar6, 64); + script_4610(arg4); + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2174)), new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/4606.cs2 b/dumps/scripts/4606.cs2 new file mode 100644 index 000000000..573d7b5a7 --- /dev/null +++ b/dumps/scripts/4606.cs2 @@ -0,0 +1,13 @@ +void script_4606(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + ivar5 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar6 = divide(multiply(subtract(ivar5, arg4), 8), ivar5); + ivar7 = divide(multiply(arg3, 128), getWidgetActualWidth(new WidgetPointer(arg0))); + bitconfig_9259 = mod(ivar6, 8); + bitconfig_9260 = mod(ivar7, 128); + script_4609(arg3, arg4); + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2174)), new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/4607.cs2 b/dumps/scripts/4607.cs2 new file mode 100644 index 000000000..9ab14afe4 --- /dev/null +++ b/dumps/scripts/4607.cs2 @@ -0,0 +1,4 @@ +void script_4607() { + sendColorPickerPacket(standart_config_2174); + return; +} diff --git a/dumps/scripts/4608.cs2 b/dumps/scripts/4608.cs2 new file mode 100644 index 000000000..02dae6d66 --- /dev/null +++ b/dumps/scripts/4608.cs2 @@ -0,0 +1,4 @@ +void script_4608() { + sendColorPickerPacket(globalint_1497); + return; +} diff --git a/dumps/scripts/4609.cs2 b/dumps/scripts/4609.cs2 new file mode 100644 index 000000000..6e0314f61 --- /dev/null +++ b/dumps/scripts/4609.cs2 @@ -0,0 +1,4 @@ +void script_4609(int arg0,int arg1) { + setWidgetPosition(arg0, arg1, 0, 0, new WidgetPointer(19,20)); + return; +} diff --git a/dumps/scripts/461.cs2 b/dumps/scripts/461.cs2 new file mode 100644 index 000000000..67371744d --- /dev/null +++ b/dumps/scripts/461.cs2 @@ -0,0 +1,4 @@ +void script_461() { + script_304(53415011); + return; +} diff --git a/dumps/scripts/4610.cs2 b/dumps/scripts/4610.cs2 new file mode 100644 index 000000000..126bfe744 --- /dev/null +++ b/dumps/scripts/4610.cs2 @@ -0,0 +1,4 @@ +void script_4610(int arg0) { + setWidgetPosition(0, add(arg0, 1), 0, 0, new WidgetPointer(19,19)); + return; +} diff --git a/dumps/scripts/4611.cs2 b/dumps/scripts/4611.cs2 new file mode 100644 index 000000000..10de26656 --- /dev/null +++ b/dumps/scripts/4611.cs2 @@ -0,0 +1,5 @@ +void script_4611() { + setScriptCallOnConfigChange(4612, new WidgetPointer(20,55), 2172, 2173, 2174, 3, "IY", new WidgetPointer(20,55)); + script_4613(1310775); + return; +} diff --git a/dumps/scripts/4612.cs2 b/dumps/scripts/4612.cs2 new file mode 100644 index 000000000..449f79390 --- /dev/null +++ b/dumps/scripts/4612.cs2 @@ -0,0 +1,4 @@ +void script_4612(int arg0) { + script_4613(arg0); + return; +} diff --git a/dumps/scripts/4613.cs2 b/dumps/scripts/4613.cs2 new file mode 100644 index 000000000..6857348b1 --- /dev/null +++ b/dumps/scripts/4613.cs2 @@ -0,0 +1,10 @@ +void script_4613(int arg0) { + if ((((boolean)bitconfig_9254) && ((boolean)bitconfig_9255)) && (((boolean)bitconfig_9256) && ((boolean)bitconfig_9257))) { + return; + } + doWidgetType18Task(0, 65214, bitconfig_9254, new WidgetPointer(arg0)); + doWidgetType18Task(1, 65200, bitconfig_9255, new WidgetPointer(arg0)); + doWidgetType18Task(3, 65186, bitconfig_9256, new WidgetPointer(arg0)); + doWidgetType18Task(4, 62995, bitconfig_9257, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4614.cs2 b/dumps/scripts/4614.cs2 new file mode 100644 index 000000000..1c0b368d9 --- /dev/null +++ b/dumps/scripts/4614.cs2 @@ -0,0 +1,16 @@ +void script_4614(int arg0) { + switch (arg0) { + case 1310722: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9254)), new WidgetPointer(arg0)); + break; + case 1310728: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9255)), new WidgetPointer(arg0)); + break; + case 1310731: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9256)), new WidgetPointer(arg0)); + break; + case 1310725: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9257)), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4615.cs2 b/dumps/scripts/4615.cs2 new file mode 100644 index 000000000..4a7b615b6 --- /dev/null +++ b/dumps/scripts/4615.cs2 @@ -0,0 +1,40 @@ +void script_4615(int arg0) { + switch (arg0) { + case 1310735: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9255)), new WidgetPointer(arg0)); + break; + case 1310875: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9254)), new WidgetPointer(arg0)); + break; + case 1310889: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9254)), new WidgetPointer(arg0)); + break; + case 1310903: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9254)), new WidgetPointer(arg0)); + break; + case 1310737: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9256)), new WidgetPointer(arg0)); + break; + case 1310877: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9256)), new WidgetPointer(arg0)); + break; + case 1310891: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9255)), new WidgetPointer(arg0)); + break; + case 1310905: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9255)), new WidgetPointer(arg0)); + break; + case 1310739: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9257)), new WidgetPointer(arg0)); + break; + case 1310879: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9257)), new WidgetPointer(arg0)); + break; + case 1310893: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9257)), new WidgetPointer(arg0)); + break; + case 1310907: + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9256)), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4616.cs2 b/dumps/scripts/4616.cs2 new file mode 100644 index 000000000..aae54aaec --- /dev/null +++ b/dumps/scripts/4616.cs2 @@ -0,0 +1,12 @@ +int script_4616(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + ivar2 = script_4617(arg0, arg1); + if (ivar2 == getMinute()) { + return 0; + } + if (ivar2 > getMinute()) { + return 1; + } + return -1; +} diff --git a/dumps/scripts/4617.cs2 b/dumps/scripts/4617.cs2 new file mode 100644 index 000000000..192f8c1e0 --- /dev/null +++ b/dumps/scripts/4617.cs2 @@ -0,0 +1,15 @@ +int script_4617(int arg0,int arg1) { + int ivar2; + int ivar3; + int stack_dump0; + int stack_dump1; + cs2func_script_4618_struct(2,0,0) structdump_2; + ivar2 = arg0; + ivar3 = arg1; + stack_dump0 = arg0; + stack_dump1 = arg1; + structdump_2 = script_4618(stack_dump0, stack_dump1); + ivar3 = structdump_2.intpart_1; + ivar2 = structdump_2.intpart_0; + return add(daysSinceReleaseToMillis(ivar2), ivar3); +} diff --git a/dumps/scripts/4618.cs2 b/dumps/scripts/4618.cs2 new file mode 100644 index 000000000..4d34909e1 --- /dev/null +++ b/dumps/scripts/4618.cs2 @@ -0,0 +1,31 @@ +cs2func_script_4618_struct(2,0,0) script_4618(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + if (((boolean)arg0)) { + return newstruct cs2func_script_4618_struct(0, 0); + } + ivar2 = arg0; + ivar3 = arg1; + ivar4 = 0; + if (((boolean)clanbitconfig_5)) { + ivar4 = max(clanconfig_0, subtract(0, clanconfig_0)); + } + ivar3 = add(multiply(divide(arg1, 10), 60), multiply(mod(arg1, 10), 10)); + if (((boolean)clanbitconfig_5)) { + if (clanconfig_0 < 0) { + if (add(ivar3, ivar4) >= 1440) { + ivar2 = add(ivar2, 1); + ivar3 = subtract(add(ivar3, ivar4), 1440); + } else { + ivar3 = add(ivar3, ivar4); + } + } else if (subtract(ivar3, ivar4) < 0) { + ivar2 = subtract(ivar2, 1); + ivar3 = subtract(add(1440, arg1), ivar4); + } else { + ivar3 = subtract(ivar3, ivar4); + } + } + return newstruct cs2func_script_4618_struct(ivar2, ivar3); +} diff --git a/dumps/scripts/4619.cs2 b/dumps/scripts/4619.cs2 new file mode 100644 index 000000000..1d1ff598d --- /dev/null +++ b/dumps/scripts/4619.cs2 @@ -0,0 +1,61 @@ +void script_4619(int arg0) { + switch (standart_config_2128) { + case 1: + if (((boolean)bitconfig_9261)) { + bitconfig_9261 = 1; + } else { + bitconfig_9261 = 0; + } + break; + case 2: + if (((boolean)bitconfig_9262)) { + bitconfig_9262 = 1; + } else { + bitconfig_9262 = 0; + } + break; + case 3: + if (((boolean)bitconfig_9263)) { + bitconfig_9263 = 1; + } else { + bitconfig_9263 = 0; + } + break; + case 4: + if (((boolean)bitconfig_9264)) { + bitconfig_9264 = 1; + } else { + bitconfig_9264 = 0; + } + break; + case 5: + if (((boolean)bitconfig_9265)) { + bitconfig_9265 = 1; + } else { + bitconfig_9265 = 0; + } + break; + case 6: + if (((boolean)bitconfig_9266)) { + bitconfig_9266 = 1; + } else { + bitconfig_9266 = 0; + } + break; + case 7: + if (((boolean)bitconfig_9267)) { + bitconfig_9267 = 1; + } else { + bitconfig_9267 = 0; + } + break; + case 8: + if (((boolean)bitconfig_9268)) { + bitconfig_9268 = 1; + } else { + bitconfig_9268 = 0; + } + } + script_4621(arg0); + return; +} diff --git a/dumps/scripts/462.cs2 b/dumps/scripts/462.cs2 new file mode 100644 index 000000000..ef8fb165c --- /dev/null +++ b/dumps/scripts/462.cs2 @@ -0,0 +1,10 @@ +void script_462(int arg0) { + if (getSkillActualLvl(1) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "A Defence level of " + intToStr(25) + " is required." + ""); + } else if (bitconfig_2086 < 1) { + setWidgetText(new WidgetPointer(arg0), "" + "1 Commendation required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(multiply(divide(pow(getSkillActualLvl(1), 2), 600), 35)) + " XP per Commendation."); + } + return; +} diff --git a/dumps/scripts/4620.cs2 b/dumps/scripts/4620.cs2 new file mode 100644 index 000000000..60b7dba53 --- /dev/null +++ b/dumps/scripts/4620.cs2 @@ -0,0 +1,4 @@ +void script_4620(int arg0) { + script_4621(arg0); + return; +} diff --git a/dumps/scripts/4621.cs2 b/dumps/scripts/4621.cs2 new file mode 100644 index 000000000..f4282be69 --- /dev/null +++ b/dumps/scripts/4621.cs2 @@ -0,0 +1,60 @@ +void script_4621(int arg0) { + switch (standart_config_2128) { + case 1: + if (((boolean)bitconfig_9261)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 2: + if (((boolean)bitconfig_9262)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 3: + if (((boolean)bitconfig_9263)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 4: + if (((boolean)bitconfig_9264)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 5: + if (((boolean)bitconfig_9265)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 6: + if (((boolean)bitconfig_9266)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 7: + if (((boolean)bitconfig_9267)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + break; + case 8: + if (((boolean)bitconfig_9268)) { + setWidgetSprite(5920, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5916, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/4622.cs2 b/dumps/scripts/4622.cs2 new file mode 100644 index 000000000..c8aae63fd --- /dev/null +++ b/dumps/scripts/4622.cs2 @@ -0,0 +1,7 @@ +void script_4622(int arg0) { + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 5936) { + return; + } + setWidgetSprite(5933, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4623.cs2 b/dumps/scripts/4623.cs2 new file mode 100644 index 000000000..468f4456b --- /dev/null +++ b/dumps/scripts/4623.cs2 @@ -0,0 +1,4 @@ +void script_4623(int arg0,int arg1) { + script_4624(arg0, arg1); + return; +} diff --git a/dumps/scripts/4624.cs2 b/dumps/scripts/4624.cs2 new file mode 100644 index 000000000..630a2666b --- /dev/null +++ b/dumps/scripts/4624.cs2 @@ -0,0 +1,11 @@ +void script_4624(int arg0,int arg1) { + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 5936) { + return; + } + if (arg1 == standart_config_2128) { + setWidgetSprite(5935, new WidgetPointer(arg0)); + } else { + setWidgetSprite(5932, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4625.cs2 b/dumps/scripts/4625.cs2 new file mode 100644 index 000000000..c2b9f548c --- /dev/null +++ b/dumps/scripts/4625.cs2 @@ -0,0 +1,8 @@ +void script_4625() { + if ((stringMethod4107(globalstring_353, "") != 0) && (stringMethod4107(globalstring_353, "null") != 0)) { + globalstring_354 = globalstring_353; + } else { + globalstring_354 = ""; + } + return; +} diff --git a/dumps/scripts/4626.cs2 b/dumps/scripts/4626.cs2 new file mode 100644 index 000000000..0473a370c --- /dev/null +++ b/dumps/scripts/4626.cs2 @@ -0,0 +1,4 @@ +void script_4626() { + script_304(35673632); + return; +} diff --git a/dumps/scripts/4627.cs2 b/dumps/scripts/4627.cs2 new file mode 100644 index 000000000..8d37e3d1d --- /dev/null +++ b/dumps/scripts/4627.cs2 @@ -0,0 +1,4 @@ +void script_4627() { + script_4628(); + return; +} diff --git a/dumps/scripts/4628.cs2 b/dumps/scripts/4628.cs2 new file mode 100644 index 000000000..2e74fc988 --- /dev/null +++ b/dumps/scripts/4628.cs2 @@ -0,0 +1,8 @@ +void script_4628() { + globalint_1518 = -1; + globalstring_126 = ""; + if (setWidgetRegister(new WidgetPointer(1110,20))) { + setScriptCallOnGameloop(4629, 0, "i"); + } + return; +} diff --git a/dumps/scripts/4629.cs2 b/dumps/scripts/4629.cs2 new file mode 100644 index 000000000..0642a05e8 --- /dev/null +++ b/dumps/scripts/4629.cs2 @@ -0,0 +1,22 @@ +void script_4629(int arg0) { + int ivar1; + ivar1 = 0; + if (setWidgetRegister(new WidgetPointer(1110,20))) { + if (((boolean)arg0)) { + ivar1 = add(getWidgetActualWidth(), 3); + ivar1 = min(31, ivar1); + if (ivar1 == 31) { + setScriptCallOnGameloop(-1, ""); + } + } else { + ivar1 = subtract(getWidgetActualWidth(), 3); + ivar1 = max(1, ivar1); + if (((boolean)ivar1)) { + setScriptCallOnGameloop(-1, ""); + setWidgetIsHidden(true, new WidgetPointer(1110,13)); + } + } + setWidgetSize(ivar1, 19, 0, 0); + } + return; +} diff --git a/dumps/scripts/463.cs2 b/dumps/scripts/463.cs2 new file mode 100644 index 000000000..9e3026273 --- /dev/null +++ b/dumps/scripts/463.cs2 @@ -0,0 +1,10 @@ +void script_463(int arg0) { + if (getSkillActualLvl(3) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "A Constitution level of " + intToStr(25) + " is required." + ""); + } else if (bitconfig_2086 < 1) { + setWidgetText(new WidgetPointer(arg0), "" + "1 Commendation required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(multiply(divide(pow(getSkillActualLvl(3), 2), 600), 35)) + " XP per Commendation."); + } + return; +} diff --git a/dumps/scripts/4630.cs2 b/dumps/scripts/4630.cs2 new file mode 100644 index 000000000..1c2e30049 --- /dev/null +++ b/dumps/scripts/4630.cs2 @@ -0,0 +1,4 @@ +void script_4630() { + script_4465(globalstring_126); + return; +} diff --git a/dumps/scripts/4631.cs2 b/dumps/scripts/4631.cs2 new file mode 100644 index 000000000..cd034ef95 --- /dev/null +++ b/dumps/scripts/4631.cs2 @@ -0,0 +1,4 @@ +void script_4631() { + script_4632(globalint_1519); + return; +} diff --git a/dumps/scripts/4632.cs2 b/dumps/scripts/4632.cs2 new file mode 100644 index 000000000..2b616eb64 --- /dev/null +++ b/dumps/scripts/4632.cs2 @@ -0,0 +1,107 @@ +void script_4632(int arg0) { + int ivar1; + int ivar2; + int ivar3; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + ivar1 = -1; + ivar2 = -1; + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + svar4 = ""; + svar5 = ""; + if (globalint_1520 > 2000000) { + svar1 = "over " + formatNumber(2000000, 1); + } else { + svar1 = formatNumber(globalint_1520, 1); + } + ivar1 = min(2147483647, divide(divide(multiply(1000, globalint_1520), max(1, globalint_1521)), 1000)); + ivar2 = mod(divide(multiply(1000, globalint_1520), max(1, globalint_1521)), 1000); + if (((boolean)ivar2)) { + svar0 = intToStr(ivar1); + } else { + svar0 = concat(intToStr(ivar1), "."); + if (ivar2 < 100) { + svar0 = concat(svar0, "0"); + } + if (ivar2 < 10) { + svar0 = concat(svar0, "0"); + } + svar0 = concat(svar0, intToStr(ivar2)); + if (((boolean)mod(ivar2, 10))) { + svar0 = substr(0, subtract(strLength(svar0), 2), svar0); + } + if (((boolean)mod(ivar2, 100))) { + svar0 = substr(0, subtract(strLength(svar0), 2), svar0); + } + } + svar3 = formatNumber(globalint_1522, 1); + if (((boolean)arg0)) { + if (globalint_1520 > 2000) { + svar5 = "Behold " + globalstring_127 + ", champion of " + svar1 + " bouts in the Duel Arena!"; + } else if (((boolean)globalint_1520)) { + svar5 = "Here stands " + globalstring_127 + ", once victor of a duel."; + } else { + svar5 = "Here stands " + globalstring_127 + ", victor of " + svar1 + " duels."; + } + svar2 = globalstring_127 + " defeats " + svar0 + " opponents for every loss!"; + if (globalint_1522 > 250) { + svar3 = "over " + formatNumber(250, 1); + } + svar4 = globalstring_127 + " has vanquished " + formatNumber(globalint_1522, 1) + " opponents in a row."; + } else { + if (((boolean)arg0)) { + if (globalint_1520 > 2000) { + svar5 = "Behold " + globalstring_127 + ", taker of " + svar1 + " heads in the Wilderness!"; + } else { + svar5 = "Here stands " + globalstring_127 + ", who has killed " + svar1 + " opponents in the Wilderness."; + } + svar2 = "Vanquisher of " + svar0 + " foes for every fall!"; + if (globalint_1522 > 250) { + svar3 = "Over " + formatNumber(250, 1); + } + svar4 = svar3 + " victims in succession have rendered their souls to " + globalstring_127 + "."; + } + } + setWidgetText(new WidgetPointer(21,1), svar5); + setWidgetText(new WidgetPointer(21,3), svar4); + setWidgetText(new WidgetPointer(21,2), svar2); + setWidgetText(new WidgetPointer(21,4), "Highest value Wilderness kill:" + "
" + formatNumber(standart_config_2185, 1) + " coins."); + setWidgetIsHidden(false, new WidgetPointer(21,18)); + setWidgetIsHidden(false, new WidgetPointer(21,49)); + setWidgetIsHidden(true, new WidgetPointer(21,2)); + setWidgetIsHidden(true, new WidgetPointer(21,3)); + if (((boolean)globalint_1524)) { + setWidgetIsHidden(false, new WidgetPointer(21,2)); + if (globalint_1522 > 1) { + setWidgetIsHidden(false, new WidgetPointer(21,3)); + } + } + setWidgetIsHidden(true, new WidgetPointer(21,4)); + if (((boolean)arg0) && (standart_config_2185 > 0)) { + setWidgetIsHidden(false, new WidgetPointer(21,4)); + } + ivar3 = getWidgetActualHeight(new WidgetPointer(21,17)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(21,18)), getWidgetActualY(new WidgetPointer(21,4)), 0, 0, new WidgetPointer(21,18)); + if (isWidgetHidden(new WidgetPointer(21,4))) { + setWidgetIsHidden(true, new WidgetPointer(21,18)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(21,3)), 0, 0, 2, new WidgetPointer(21,3)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(21,2)), getWidgetActualHeight(new WidgetPointer(21,3)), 0, 2, new WidgetPointer(21,2)); + } else { + ivar3 = subtract(ivar3, getWidgetActualHeight(new WidgetPointer(21,4))); + } + setWidgetPosition(getWidgetActualX(new WidgetPointer(21,18)), getWidgetActualY(new WidgetPointer(21,2)), 0, 0, new WidgetPointer(21,49)); + if (isWidgetHidden(new WidgetPointer(21,3))) { + ivar3 = subtract(ivar3, add(getWidgetActualHeight(new WidgetPointer(21,3)), getWidgetActualHeight(new WidgetPointer(21,2)))); + } else { + setWidgetIsHidden(true, new WidgetPointer(21,49)); + } + setWidgetSize(getWidgetActualWidth(new WidgetPointer(21,1)), ivar3, 0, 0, new WidgetPointer(21,1)); + return; +} diff --git a/dumps/scripts/4633.cs2 b/dumps/scripts/4633.cs2 new file mode 100644 index 000000000..ea06da61c --- /dev/null +++ b/dumps/scripts/4633.cs2 @@ -0,0 +1,4 @@ +void script_4633() { + script_4634(1); + return; +} diff --git a/dumps/scripts/4634.cs2 b/dumps/scripts/4634.cs2 new file mode 100644 index 000000000..09d4c7ef6 --- /dev/null +++ b/dumps/scripts/4634.cs2 @@ -0,0 +1,57 @@ +void script_4634(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar1 = -1; + script_1174(11); + switch (arg0) { + case 1: + ivar1 = 0; + } + globalint_1100 = -1; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + if ((((boolean)cs2method5420()) && ((boolean)script_2727())) && ((boolean)globalint_547)) { + globalint_174 = 12; + setWidgetIsHidden(false, new WidgetPointer(744,28)); + playMusicEffect(349, 0); + script_3412(48758826, 48758827); + ivar4 = getWidgetActualWidth(new WidgetPointer(744,43)); + ivar5 = getWidgetActualWidth(new WidgetPointer(744,43)); + ivar2 = max(337, add(getTextWidth(591, getWidgetText(new WidgetPointer(744,42))), 31)); + ivar5 = max(152, multiply(getLineCount(ivar4, 496, getWidgetText(new WidgetPointer(744,43))), 16)); + ivar3 = max(252, add(ivar5, 100)); + setWidgetSize(ivar4, ivar5, 0, 0, new WidgetPointer(744,43)); + setWidgetSize(ivar2, ivar3, 0, 0, new WidgetPointer(744,28)); + setWidgetIsHidden(true, new WidgetPointer(744,26)); + setWidgetIsHidden(true, new WidgetPointer(744,27)); + return; + } + globalint_200 = 0; + globalint_201 = 0; + ivar6 = 39059516; + ivar7 = 39059501; + if (hasSSKey()) { + ivar6 = 63897649; + ivar7 = 63897644; + } + setWidgetText(new WidgetPointer(ivar6), "Logging in..."); + setScriptCallOnMousePressed(-1, "", new WidgetPointer(ivar7)); + script_2950(-3, 0, 1, -1, 1, 1, 0, "Logging In - Please Wait", "Abort Login", ""); + setScriptCallOnMousePressed(4635, "", new WidgetPointer(596,15)); + setWidgetIsHidden(false, new WidgetPointer(596,9)); + globalint_1100 = -3; + cs2method5632(ivar1); + if (hasSSKey()) { + setScriptCallOnGameloop(2946, arg0, "i", new WidgetPointer(975,26)); + } else { + setScriptCallOnGameloop(2946, arg0, "i", new WidgetPointer(596,7)); + } + return; +} diff --git a/dumps/scripts/4635.cs2 b/dumps/scripts/4635.cs2 new file mode 100644 index 000000000..0535d9954 --- /dev/null +++ b/dumps/scripts/4635.cs2 @@ -0,0 +1,4 @@ +void script_4635() { + script_4636(); + return; +} diff --git a/dumps/scripts/4636.cs2 b/dumps/scripts/4636.cs2 new file mode 100644 index 000000000..9d7e567da --- /dev/null +++ b/dumps/scripts/4636.cs2 @@ -0,0 +1,24 @@ +void script_4636() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 39059516; + ivar1 = 39059501; + ivar2 = 39059515; + if (hasSSKey()) { + ivar0 = 63897649; + ivar1 = 63897644; + } + setWidgetText(new WidgetPointer(ivar0), "Log In"); + setWidgetText(new WidgetPointer(ivar2), "Log In"); + setScriptCallOnMousePressed(2944, "", new WidgetPointer(ivar1)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar1)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(596,7)); + if (isLoggingIn()) { + cancelLogin(); + } + resetRCs(); + script_2954(); + script_2940(13); + return; +} diff --git a/dumps/scripts/4637.cs2 b/dumps/scripts/4637.cs2 new file mode 100644 index 000000000..b39167fcc --- /dev/null +++ b/dumps/scripts/4637.cs2 @@ -0,0 +1,79 @@ +void script_4637(int arg0) { + int ivar1; + int ivar2; + string svar0; + svar0 = ""; + setWidgetIsHidden(false, new WidgetPointer(153,52)); + setWidgetText(new WidgetPointer(153,50), ""); + switch (arg0) { + case 1: + if (isWidgetHidden(new WidgetPointer(153,102))) { + return; + } + svar0 = "Three's Company" + "
" + "
"; + if (((boolean)script_4643(1))) { + svar0 = concat(svar0, "" + "Attack 30, Ranged 30, Magic 30 required to play the unabridged version." + "
" + "
"); + } + svar0 = concat(svar0, "Manage a party of adventurers in this saga. " + "
" + "
" + "+ Select 'Switch' to change to a target character. " + "
" + "+ Select 'Mark' on an enemy to focus your allies' attacks on that target." + "
" + "+ Human enemies will focus their attacks on you, animals will attack your allies."); + createExtraChild(new WidgetPointer(153,42), 4, 0); + break; + case 2: + if (isWidgetHidden(new WidgetPointer(153,115))) { + return; + } + svar0 = "Vengeance" + "
" + "
"; + if (((boolean)script_4643(2))) { + svar0 = concat(svar0, "" + "Agility 55, Thieving 55 required to play the unabridged version." + "
" + "
"); + } + svar0 = concat(svar0, "A tragic tale of grief, warped into furious vengeance." + "
" + "
" + "+ At some point in this saga, you will become poisoned. Keep an eye on your health. You will not take poison damage whilst in a conversation." + "
" + "+ Look for alternative methods of defeating your human foes. Your environment may offer more indirect solutions." + "
" + "+ Hellhounds will drop antipoison elixirs that will lessen your suffering temporarily." + "
" + "+ Spiders drop food, but their bites may negate the effect of an antipoison elixir." + "
" + "+ Choices you make in the saga will lead you towards 'noble' or 'ruthless' vengeance. Each has a different special attack. The further along that path you are, the more potent the special attack."); + break; + case 3: + if (isWidgetHidden(new WidgetPointer(153,141))) { + return; + } + svar0 = "Learn the story behind the lonely death of Tobias Scutter, adventurer."; + break; + case 4: + if (isWidgetHidden(new WidgetPointer(153,128))) { + return; + } + svar0 = "Thok It To 'Em" + "
" + "
"; + if (((boolean)script_4643(4))) { + svar0 = concat(svar0, "" + "Stregth 70 required to play the unabridged version." + "
" + "
"); + } + svar0 = concat(svar0, "Control mighty Thok, Fremennik warrior." + "
" + "
" + "+ Thok heals damage and recovers special attack by killing enemies. Bosses provide greater health and special attack boosts than normal enemies." + "
" + "+ Thok can eat food raw. He likes the taste." + "
" + "+ Thok will randomly choose a special attack when you perform one. These include the awe-inspiring 'Northern Kiss'."); + break; + case 5: + if (isWidgetHidden(new WidgetPointer(153,169))) { + return; + } + svar0 = "Love stories are so often tied to tragedy, and few are as tragic as this tale of two sorcerors."; + break; + case 6: + if (isWidgetHidden(new WidgetPointer(153,155))) { + return; + } + svar0 = "Sometimes it's good to be bad. The necrolord is a twisted and cruel individual with dark aspirations."; + } + setWidgetText(new WidgetPointer(153,44), svar0); + ivar1 = getLineCount(366, 495, svar0); + ivar2 = multiply(ivar1, 15); + if (setWidgetRegister(new WidgetPointer(153,42), 0)) { + if (((boolean)arg0)) { + setWidgetPosition(5, add(ivar2, 7), 0, 0); + setWidgetSize(366, 15, 0, 0); + setWidgetTextAlignment(1, 1, 0); + svar0 = "All three characters must survive."; + setWidgetText(svar0); + setWidgetFont(496); + setWidgetRGB(new Color(203, 107, 61)); + ivar2 = add(ivar2, 24); + } else { + deleteExtraChild(); + } + } + setWidgetScrollMax(0, ivar2, new WidgetPointer(153,42)); + script_72(10027051, 10027050, 0); + script_4638(arg0); + return; +} diff --git a/dumps/scripts/4638.cs2 b/dumps/scripts/4638.cs2 new file mode 100644 index 000000000..83b8306a3 --- /dev/null +++ b/dumps/scripts/4638.cs2 @@ -0,0 +1,28 @@ +void script_4638(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(153,97)); + setWidgetIsHidden(true, new WidgetPointer(153,110)); + setWidgetIsHidden(true, new WidgetPointer(153,123)); + setWidgetIsHidden(true, new WidgetPointer(153,136)); + setWidgetIsHidden(true, new WidgetPointer(153,164)); + setWidgetIsHidden(true, new WidgetPointer(153,150)); + switch (arg0) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(153,97)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(153,110)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(153,123)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(153,136)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(153,164)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(153,150)); + } + return; +} diff --git a/dumps/scripts/4639.cs2 b/dumps/scripts/4639.cs2 new file mode 100644 index 000000000..2944989e2 --- /dev/null +++ b/dumps/scripts/4639.cs2 @@ -0,0 +1,21 @@ +void script_4639() { + if (isBitFlagged(standart_config_2189, 1)) { + setWidgetIsHidden(false, new WidgetPointer(153,102)); + } + if (isBitFlagged(standart_config_2189, 2)) { + setWidgetIsHidden(false, new WidgetPointer(153,115)); + } + if (isBitFlagged(standart_config_2189, 3)) { + setWidgetIsHidden(false, new WidgetPointer(153,141)); + } + if (isBitFlagged(standart_config_2189, 4)) { + setWidgetIsHidden(false, new WidgetPointer(153,128)); + } + if (isBitFlagged(standart_config_2189, 5)) { + setWidgetIsHidden(false, new WidgetPointer(153,169)); + } + if (isBitFlagged(standart_config_2189, 6)) { + setWidgetIsHidden(false, new WidgetPointer(153,155)); + } + return; +} diff --git a/dumps/scripts/464.cs2 b/dumps/scripts/464.cs2 new file mode 100644 index 000000000..e7ad4a44a --- /dev/null +++ b/dumps/scripts/464.cs2 @@ -0,0 +1,10 @@ +void script_464(int arg0) { + if (getSkillActualLvl(4) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "A Ranged level of " + intToStr(25) + " is required." + ""); + } else if (bitconfig_2086 < 1) { + setWidgetText(new WidgetPointer(arg0), "" + "1 Commendation required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(multiply(divide(pow(getSkillActualLvl(4), 2), 600), 32)) + " XP per Commendation."); + } + return; +} diff --git a/dumps/scripts/4640.cs2 b/dumps/scripts/4640.cs2 new file mode 100644 index 000000000..99e884d63 --- /dev/null +++ b/dumps/scripts/4640.cs2 @@ -0,0 +1,18 @@ +void script_4640(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(4601, new WidgetPointer(153,66)); + setWidgetSprite(4601, new WidgetPointer(153,68)); + setWidgetSprite(4600, new WidgetPointer(153,67)); + setWidgetSprite(4607, new WidgetPointer(153,70)); + setWidgetSprite(4607, new WidgetPointer(153,69)); + setWidgetSprite(4606, new WidgetPointer(153,71)); + } else { + setWidgetSprite(4595, new WidgetPointer(153,66)); + setWidgetSprite(4595, new WidgetPointer(153,68)); + setWidgetSprite(4594, new WidgetPointer(153,67)); + setWidgetSprite(4605, new WidgetPointer(153,70)); + setWidgetSprite(4605, new WidgetPointer(153,69)); + setWidgetSprite(4604, new WidgetPointer(153,71)); + } + return; +} diff --git a/dumps/scripts/4641.cs2 b/dumps/scripts/4641.cs2 new file mode 100644 index 000000000..6e74c91b0 --- /dev/null +++ b/dumps/scripts/4641.cs2 @@ -0,0 +1,25 @@ +void script_4641() { + script_4639(); + if (isBitFlagged(standart_config_2189, 1)) { + setWidgetSprite(6268, new WidgetPointer(153,15)); + setScriptCallOnClickContextMenu(4637, 1, "i", new WidgetPointer(153,98)); + script_4645(1); + } else { + setWidgetSprite(6271, new WidgetPointer(153,15)); + } + if (isBitFlagged(standart_config_2189, 2)) { + setWidgetSprite(6270, new WidgetPointer(153,12)); + setScriptCallOnClickContextMenu(4637, 2, "i", new WidgetPointer(153,111)); + script_4645(2); + } else { + setWidgetSprite(6271, new WidgetPointer(153,12)); + } + if (isBitFlagged(standart_config_2189, 4)) { + setWidgetSprite(6269, new WidgetPointer(153,9)); + setScriptCallOnClickContextMenu(4637, 4, "i", new WidgetPointer(153,124)); + script_4645(4); + } else { + setWidgetSprite(6271, new WidgetPointer(153,9)); + } + return; +} diff --git a/dumps/scripts/4642.cs2 b/dumps/scripts/4642.cs2 new file mode 100644 index 000000000..10ef194d8 --- /dev/null +++ b/dumps/scripts/4642.cs2 @@ -0,0 +1,23 @@ +void script_4642() { + string svar0; + if (((boolean)standart_config_2192)) { + return; + } + svar0 = "null"; + switch (standart_config_2192) { + case 1: + svar0 = "Abridged: 750 Dungeoneering XP. 75 Dungeoneering tokens." + "
" + "Unabridged: 3750 XP in a choice of Attack, Ranged or Magic."; + break; + case 2: + svar0 = "Abridged: 2410 Dungeoneering XP. 241 Dungeoneering tokens." + "
" + "Unabridged: 25415 XP in either Agility or Thieving."; + break; + case 4: + svar0 = "Abridged: 37080 Dungeoneering XP. 3708 Dungeoneering tokens." + "
" + "Unabridged: 75765 Strength XP."; + break; + default: + return; + } + setWidgetIsHidden(true, new WidgetPointer(153,52)); + setWidgetText(new WidgetPointer(153,50), svar0); + return; +} diff --git a/dumps/scripts/4643.cs2 b/dumps/scripts/4643.cs2 new file mode 100644 index 000000000..7947af141 --- /dev/null +++ b/dumps/scripts/4643.cs2 @@ -0,0 +1,27 @@ +int script_4643(int arg0) { + flow_0: + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 4: + GOTO flow_7 + case 2: + GOTO flow_11 + } + return 0; + flow_1: + if (((getSkillActualLvl(0) >= 30) && (getSkillActualLvl(6) >= 30)) && (getSkillActualLvl(4) >= 30)) { + return 1; + } + return 0; + flow_7: + if (getSkillActualLvl(2) >= 70) { + return 1; + } + return 0; + flow_11: + if ((getSkillActualLvl(16) >= 55) && (getSkillActualLvl(17) >= 55)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/4644.cs2 b/dumps/scripts/4644.cs2 new file mode 100644 index 000000000..0a2f6b90b --- /dev/null +++ b/dumps/scripts/4644.cs2 @@ -0,0 +1,37 @@ +cs2func_script_4644_struct(2,0,0) script_4644(int arg0) { + flow_0: + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_6 + case 4: + GOTO flow_11 + } + return newstruct cs2func_script_4644_struct(0, 0); + flow_1: + if (((boolean)bitconfig_9315)) { + if (((boolean)bitconfig_9314)) { + return newstruct cs2func_script_4644_struct(1, 1); + } + return newstruct cs2func_script_4644_struct(1, 0); + } + GOTO flow_15 + flow_6: + if (((boolean)bitconfig_9317)) { + if (((boolean)bitconfig_9316)) { + return newstruct cs2func_script_4644_struct(1, 1); + } + return newstruct cs2func_script_4644_struct(1, 0); + } + GOTO flow_15 + flow_11: + if (((boolean)bitconfig_9319)) { + if (((boolean)bitconfig_9318)) { + return newstruct cs2func_script_4644_struct(1, 1); + } + return newstruct cs2func_script_4644_struct(1, 0); + } + flow_15: + return newstruct cs2func_script_4644_struct(0, 0); +} diff --git a/dumps/scripts/4645.cs2 b/dumps/scripts/4645.cs2 new file mode 100644 index 000000000..7044b08d4 --- /dev/null +++ b/dumps/scripts/4645.cs2 @@ -0,0 +1,81 @@ +void script_4645(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int stack_dump0; + cs2func_script_4644_struct(2,0,0) structdump_1; + flow_0: + ivar1 = -1; + ivar2 = -1; + ivar3 = 0; + ivar4 = 0; + stack_dump0 = arg0; + structdump_1 = script_4644(stack_dump0); + ivar4 = structdump_1.intpart_1; + ivar3 = structdump_1.intpart_0; + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 4: + GOTO flow_3 + case 3: + GOTO flow_4 + case 6: + GOTO flow_5 + case 5: + GOTO flow_6 + } + return; + flow_1: + ivar1 = 10027024; + ivar2 = 10027179; + GOTO flow_7 + flow_2: + ivar1 = 10027021; + ivar2 = 10027022; + GOTO flow_7 + flow_3: + ivar1 = 10027018; + ivar2 = 10027019; + GOTO flow_7 + flow_4: + ivar1 = 10027015; + ivar2 = 10027016; + GOTO flow_7 + flow_5: + ivar1 = 10027012; + ivar2 = 10027013; + GOTO flow_7 + flow_6: + ivar1 = 10027009; + ivar2 = 10027010; + flow_7: + if (((boolean)script_4643(arg0))) { + if (((boolean)ivar3)) { + if (((boolean)ivar4)) { + setWidgetSprite(6274, new WidgetPointer(ivar1)); + setWidgetIsHidden(false, new WidgetPointer(ivar1)); + setWidgetSprite(6275, new WidgetPointer(ivar2)); + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + } else { + setWidgetSprite(6272, new WidgetPointer(ivar1)); + setWidgetIsHidden(false, new WidgetPointer(ivar1)); + setWidgetSprite(6275, new WidgetPointer(ivar2)); + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + } + } else { + setWidgetSprite(6272, new WidgetPointer(ivar1)); + setWidgetIsHidden(false, new WidgetPointer(ivar1)); + } + } else if (((boolean)ivar3)) { + setWidgetSprite(6275, new WidgetPointer(ivar1)); + setWidgetIsHidden(false, new WidgetPointer(ivar1)); + } else { + setWidgetSprite(6273, new WidgetPointer(ivar1)); + setWidgetIsHidden(false, new WidgetPointer(ivar1)); + } + return; +} diff --git a/dumps/scripts/4646.cs2 b/dumps/scripts/4646.cs2 new file mode 100644 index 000000000..45c349ea9 --- /dev/null +++ b/dumps/scripts/4646.cs2 @@ -0,0 +1,22 @@ +void script_4646() { + flow_0: + SWITCH (bitconfig_9306) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 4: + GOTO flow_3 + } + return; + flow_1: + script_4647(); + GOTO flow_4 + flow_2: + script_4648(); + GOTO flow_4 + flow_3: + script_4649(); + flow_4: + return; +} diff --git a/dumps/scripts/4647.cs2 b/dumps/scripts/4647.cs2 new file mode 100644 index 000000000..2d4366bc0 --- /dev/null +++ b/dumps/scripts/4647.cs2 @@ -0,0 +1,124 @@ +void script_4647() { + setWidgetIsHidden(true, new WidgetPointer(173,2)); + setWidgetIsHidden(true, new WidgetPointer(173,3)); + setWidgetIsHidden(false, new WidgetPointer(173,1)); + setWidgetIsHidden(false, new WidgetPointer(173,62)); + setWidgetIsHidden(false, new WidgetPointer(173,63)); + if (isBitFlagged(standart_config_2194, 0)) { + setWidgetIsHidden(false, new WidgetPointer(173,64)); + } else { + setWidgetIsHidden(false, new WidgetPointer(173,64)); + setWidgetSprite(2808, new WidgetPointer(173,64)); + } + if (isBitFlagged(standart_config_2194, 1)) { + setWidgetIsHidden(false, new WidgetPointer(173,66)); + } else if (isBitFlagged(standart_config_2194, 0)) { + setWidgetIsHidden(false, new WidgetPointer(173,66)); + setWidgetSprite(2808, new WidgetPointer(173,66)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,66)); + } + if (isBitFlagged(standart_config_2194, 2)) { + setWidgetIsHidden(false, new WidgetPointer(173,67)); + } else if (isBitFlagged(standart_config_2194, 1)) { + setWidgetIsHidden(false, new WidgetPointer(173,67)); + setWidgetSprite(2807, new WidgetPointer(173,67)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,67)); + } + if (isBitFlagged(standart_config_2194, 3)) { + setWidgetIsHidden(false, new WidgetPointer(173,68)); + } else if (isBitFlagged(standart_config_2194, 2)) { + setWidgetIsHidden(false, new WidgetPointer(173,68)); + setWidgetSprite(2807, new WidgetPointer(173,68)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,68)); + } + if (isBitFlagged(standart_config_2194, 4)) { + setWidgetIsHidden(false, new WidgetPointer(173,69)); + } else if (isBitFlagged(standart_config_2194, 3)) { + setWidgetIsHidden(false, new WidgetPointer(173,69)); + setWidgetSprite(2806, new WidgetPointer(173,69)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,69)); + } + if (isBitFlagged(standart_config_2194, 5)) { + setWidgetIsHidden(false, new WidgetPointer(173,72)); + } else { + setWidgetSprite(2807, new WidgetPointer(173,72)); + } + if (isBitFlagged(standart_config_2194, 6)) { + setWidgetIsHidden(false, new WidgetPointer(173,73)); + } else if (isBitFlagged(standart_config_2194, 5)) { + setWidgetIsHidden(false, new WidgetPointer(173,73)); + setWidgetSprite(2808, new WidgetPointer(173,73)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,73)); + } + if (isBitFlagged(standart_config_2194, 7)) { + setWidgetIsHidden(false, new WidgetPointer(173,65)); + } else { + setWidgetSprite(2806, new WidgetPointer(173,65)); + } + if (isBitFlagged(standart_config_2194, 8)) { + setWidgetIsHidden(false, new WidgetPointer(173,74)); + } else if (isBitFlagged(standart_config_2194, 7)) { + setWidgetIsHidden(false, new WidgetPointer(173,74)); + setWidgetSprite(2807, new WidgetPointer(173,74)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,74)); + } + if (isBitFlagged(standart_config_2194, 9)) { + setWidgetIsHidden(false, new WidgetPointer(173,75)); + } else if (isBitFlagged(standart_config_2194, 8)) { + setWidgetIsHidden(false, new WidgetPointer(173,75)); + setWidgetSprite(2807, new WidgetPointer(173,75)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,75)); + } + if (isBitFlagged(standart_config_2194, 10)) { + setWidgetIsHidden(false, new WidgetPointer(173,77)); + } else if (isBitFlagged(standart_config_2194, 9)) { + setWidgetIsHidden(false, new WidgetPointer(173,77)); + setWidgetSprite(2807, new WidgetPointer(173,77)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,77)); + } + if (isBitFlagged(standart_config_2194, 11)) { + setWidgetIsHidden(false, new WidgetPointer(173,78)); + } else if (isBitFlagged(standart_config_2194, 9)) { + setWidgetIsHidden(false, new WidgetPointer(173,78)); + setWidgetSprite(2808, new WidgetPointer(173,78)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,78)); + } + if (isBitFlagged(standart_config_2194, 12)) { + setWidgetIsHidden(false, new WidgetPointer(173,79)); + } else if (isBitFlagged(standart_config_2194, 11)) { + setWidgetIsHidden(false, new WidgetPointer(173,79)); + setWidgetSprite(2807, new WidgetPointer(173,79)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,79)); + } + if (isBitFlagged(standart_config_2194, 13)) { + setWidgetIsHidden(false, new WidgetPointer(173,76)); + } else if (isBitFlagged(standart_config_2194, 9)) { + setWidgetIsHidden(false, new WidgetPointer(173,76)); + setWidgetSprite(2806, new WidgetPointer(173,76)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,76)); + } + if (isBitFlagged(standart_config_2194, 14)) { + setWidgetIsHidden(false, new WidgetPointer(173,70)); + setWidgetIsHidden(false, new WidgetPointer(173,71)); + } else if (isBitFlagged(standart_config_2194, 7)) { + setWidgetIsHidden(false, new WidgetPointer(173,70)); + setWidgetSprite(2806, new WidgetPointer(173,70)); + setWidgetIsHidden(true, new WidgetPointer(173,71)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,70)); + setWidgetIsHidden(true, new WidgetPointer(173,71)); + } + script_4653(); + return; +} diff --git a/dumps/scripts/4648.cs2 b/dumps/scripts/4648.cs2 new file mode 100644 index 000000000..66af6e9f3 --- /dev/null +++ b/dumps/scripts/4648.cs2 @@ -0,0 +1,91 @@ +void script_4648() { + setWidgetIsHidden(true, new WidgetPointer(173,1)); + setWidgetIsHidden(true, new WidgetPointer(173,3)); + setWidgetIsHidden(false, new WidgetPointer(173,2)); + setWidgetIsHidden(false, new WidgetPointer(173,42)); + setWidgetIsHidden(false, new WidgetPointer(173,58)); + if (isBitFlagged(standart_config_2194, 1)) { + setWidgetIsHidden(false, new WidgetPointer(173,43)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,43)); + } + if (isBitFlagged(standart_config_2194, 2)) { + setWidgetIsHidden(false, new WidgetPointer(173,44)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,44)); + } + if (isBitFlagged(standart_config_2194, 3)) { + setWidgetIsHidden(false, new WidgetPointer(173,45)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,45)); + } + if (isBitFlagged(standart_config_2194, 4)) { + setWidgetIsHidden(false, new WidgetPointer(173,46)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,46)); + } + if (isBitFlagged(standart_config_2194, 5)) { + setWidgetIsHidden(false, new WidgetPointer(173,47)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,47)); + } + if (isBitFlagged(standart_config_2194, 6)) { + setWidgetIsHidden(false, new WidgetPointer(173,48)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,48)); + } + if (isBitFlagged(standart_config_2194, 7)) { + setWidgetIsHidden(false, new WidgetPointer(173,49)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,49)); + } + if (isBitFlagged(standart_config_2194, 8)) { + setWidgetIsHidden(false, new WidgetPointer(173,51)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,51)); + } + if (isBitFlagged(standart_config_2194, 9)) { + setWidgetIsHidden(false, new WidgetPointer(173,50)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,50)); + } + if (isBitFlagged(standart_config_2194, 10)) { + setWidgetIsHidden(false, new WidgetPointer(173,52)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,52)); + } + if (isBitFlagged(standart_config_2194, 11)) { + setWidgetIsHidden(false, new WidgetPointer(173,56)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,56)); + } + if (isBitFlagged(standart_config_2194, 12)) { + setWidgetIsHidden(false, new WidgetPointer(173,55)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,55)); + } + if (isBitFlagged(standart_config_2194, 13)) { + setWidgetIsHidden(false, new WidgetPointer(173,54)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,54)); + } + if (isBitFlagged(standart_config_2194, 14)) { + setWidgetIsHidden(false, new WidgetPointer(173,53)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,53)); + } + if (isBitFlagged(standart_config_2194, 15)) { + setWidgetIsHidden(false, new WidgetPointer(173,60)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,60)); + } + if (isBitFlagged(standart_config_2194, 16)) { + setWidgetIsHidden(false, new WidgetPointer(173,57)); + setWidgetIsHidden(false, new WidgetPointer(173,59)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,57)); + setWidgetIsHidden(true, new WidgetPointer(173,59)); + } + script_4653(); + return; +} diff --git a/dumps/scripts/4649.cs2 b/dumps/scripts/4649.cs2 new file mode 100644 index 000000000..3eeecc61c --- /dev/null +++ b/dumps/scripts/4649.cs2 @@ -0,0 +1,22 @@ +void script_4649() { + flow_0: + SWITCH (bitconfig_9367) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + } + return; + flow_1: + script_4650(); + GOTO flow_4 + flow_2: + script_4652(); + GOTO flow_4 + flow_3: + script_4651(); + flow_4: + return; +} diff --git a/dumps/scripts/465.cs2 b/dumps/scripts/465.cs2 new file mode 100644 index 000000000..ddbc6fb01 --- /dev/null +++ b/dumps/scripts/465.cs2 @@ -0,0 +1,4 @@ +void script_465() { + script_304(46966115); + return; +} diff --git a/dumps/scripts/4650.cs2 b/dumps/scripts/4650.cs2 new file mode 100644 index 000000000..41c8b8c34 --- /dev/null +++ b/dumps/scripts/4650.cs2 @@ -0,0 +1,10 @@ +void script_4650() { + setWidgetIsHidden(true, new WidgetPointer(173,1)); + setWidgetIsHidden(true, new WidgetPointer(173,2)); + setWidgetIsHidden(false, new WidgetPointer(173,3)); + setWidgetIsHidden(true, new WidgetPointer(173,8)); + setWidgetIsHidden(true, new WidgetPointer(173,9)); + setWidgetIsHidden(false, new WidgetPointer(173,4)); + script_4653(); + return; +} diff --git a/dumps/scripts/4651.cs2 b/dumps/scripts/4651.cs2 new file mode 100644 index 000000000..8aa5809e0 --- /dev/null +++ b/dumps/scripts/4651.cs2 @@ -0,0 +1,10 @@ +void script_4651() { + setWidgetIsHidden(true, new WidgetPointer(173,1)); + setWidgetIsHidden(true, new WidgetPointer(173,2)); + setWidgetIsHidden(false, new WidgetPointer(173,3)); + setWidgetIsHidden(true, new WidgetPointer(173,4)); + setWidgetIsHidden(true, new WidgetPointer(173,9)); + setWidgetIsHidden(false, new WidgetPointer(173,8)); + script_4653(); + return; +} diff --git a/dumps/scripts/4652.cs2 b/dumps/scripts/4652.cs2 new file mode 100644 index 000000000..cee833b21 --- /dev/null +++ b/dumps/scripts/4652.cs2 @@ -0,0 +1,124 @@ +void script_4652() { + setWidgetIsHidden(true, new WidgetPointer(173,1)); + setWidgetIsHidden(true, new WidgetPointer(173,2)); + setWidgetIsHidden(false, new WidgetPointer(173,3)); + setWidgetIsHidden(true, new WidgetPointer(173,4)); + setWidgetIsHidden(true, new WidgetPointer(173,8)); + setWidgetIsHidden(false, new WidgetPointer(173,9)); + setWidgetIsHidden(false, new WidgetPointer(173,10)); + setWidgetIsHidden(false, new WidgetPointer(173,33)); + if (isBitFlagged(standart_config_2194, 0)) { + setWidgetIsHidden(false, new WidgetPointer(173,11)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,11)); + } + if (isBitFlagged(standart_config_2194, 1)) { + setWidgetIsHidden(false, new WidgetPointer(173,12)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,12)); + } + if (isBitFlagged(standart_config_2194, 2)) { + setWidgetIsHidden(false, new WidgetPointer(173,15)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,15)); + } + if (isBitFlagged(standart_config_2194, 3)) { + setWidgetIsHidden(false, new WidgetPointer(173,16)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,16)); + } + if (isBitFlagged(standart_config_2194, 4)) { + setWidgetIsHidden(false, new WidgetPointer(173,17)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,17)); + } + if (isBitFlagged(standart_config_2194, 5)) { + setWidgetIsHidden(false, new WidgetPointer(173,18)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,18)); + } + if (isBitFlagged(standart_config_2194, 6)) { + setWidgetIsHidden(false, new WidgetPointer(173,19)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,19)); + } + if (isBitFlagged(standart_config_2194, 7)) { + setWidgetIsHidden(false, new WidgetPointer(173,20)); + setWidgetIsHidden(false, new WidgetPointer(173,34)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,20)); + setWidgetIsHidden(true, new WidgetPointer(173,34)); + } + if (isBitFlagged(standart_config_2194, 8)) { + setWidgetIsHidden(false, new WidgetPointer(173,21)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,21)); + } + if (isBitFlagged(standart_config_2194, 9)) { + setWidgetIsHidden(false, new WidgetPointer(173,22)); + setWidgetIsHidden(false, new WidgetPointer(173,35)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,22)); + setWidgetIsHidden(true, new WidgetPointer(173,35)); + } + if (isBitFlagged(standart_config_2194, 10)) { + setWidgetIsHidden(false, new WidgetPointer(173,23)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,23)); + } + if (isBitFlagged(standart_config_2194, 11)) { + setWidgetIsHidden(false, new WidgetPointer(173,24)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,24)); + } + if (isBitFlagged(standart_config_2194, 12)) { + setWidgetIsHidden(false, new WidgetPointer(173,25)); + setWidgetIsHidden(false, new WidgetPointer(173,26)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,25)); + setWidgetIsHidden(true, new WidgetPointer(173,26)); + } + if (isBitFlagged(standart_config_2194, 13)) { + setWidgetIsHidden(false, new WidgetPointer(173,27)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,27)); + } + if (isBitFlagged(standart_config_2194, 14)) { + setWidgetIsHidden(false, new WidgetPointer(173,28)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,28)); + } + if (isBitFlagged(standart_config_2194, 15)) { + setWidgetIsHidden(false, new WidgetPointer(173,31)); + setWidgetIsHidden(false, new WidgetPointer(173,36)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,31)); + setWidgetIsHidden(true, new WidgetPointer(173,36)); + } + if (isBitFlagged(standart_config_2194, 16)) { + setWidgetIsHidden(false, new WidgetPointer(173,29)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,29)); + } + if (isBitFlagged(standart_config_2194, 17)) { + setWidgetIsHidden(false, new WidgetPointer(173,30)); + setWidgetIsHidden(false, new WidgetPointer(173,37)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,30)); + setWidgetIsHidden(true, new WidgetPointer(173,37)); + } + if (isBitFlagged(standart_config_2194, 18)) { + setWidgetIsHidden(false, new WidgetPointer(173,13)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,13)); + } + if (isBitFlagged(standart_config_2194, 19)) { + setWidgetIsHidden(false, new WidgetPointer(173,14)); + setWidgetIsHidden(false, new WidgetPointer(173,32)); + } else { + setWidgetIsHidden(true, new WidgetPointer(173,14)); + setWidgetIsHidden(true, new WidgetPointer(173,32)); + } + script_4653(); + return; +} diff --git a/dumps/scripts/4653.cs2 b/dumps/scripts/4653.cs2 new file mode 100644 index 000000000..0c27f2691 --- /dev/null +++ b/dumps/scripts/4653.cs2 @@ -0,0 +1,7 @@ +void script_4653() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + return; +} diff --git a/dumps/scripts/4654.cs2 b/dumps/scripts/4654.cs2 new file mode 100644 index 000000000..63cf017e1 --- /dev/null +++ b/dumps/scripts/4654.cs2 @@ -0,0 +1,33 @@ +void script_4654(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar3 = 0; + ivar4 = 0; + ivar5 = 11337808; + if (((boolean)bitconfig_9306)) { + ivar5 = 11337808; + } + if (bitconfig_9306 == 2) { + ivar5 = 11337789; + } + if (bitconfig_9306 == 4) { + if (((boolean)bitconfig_9367)) { + ivar5 = 11337735; + } + if (bitconfig_9367 == 2) { + ivar5 = 11337766; + } + if (bitconfig_9367 == 3) { + ivar5 = 11337769; + } + } + createExtraChild(new WidgetPointer(ivar5), 5, 0); + setWidgetSprite(2825); + setWidgetPosition(add(add(multiply(arg0, 32), 10), ivar3), add(add(multiply(arg1, 32), 10), ivar4), 0, 2); + setWidgetSize(11, 11, 0, 0); + return; +} diff --git a/dumps/scripts/4655.cs2 b/dumps/scripts/4655.cs2 new file mode 100644 index 000000000..0a4d87a08 --- /dev/null +++ b/dumps/scripts/4655.cs2 @@ -0,0 +1,12 @@ +void script_4655() { + int ivar0; + setWidgetText(new WidgetPointer(77,14), globalstring_315); + if (globalint_1233 > 200) { + globalint_1233 = 200; + } + ivar0 = globalint_1233; + ivar0 = add(divide(multiply(ivar0, 37), 40), 14); + setWidgetSize(ivar0, 18, 1, 0, new WidgetPointer(77,16)); + setWidgetPosition(add(ivar0, 1), 15, 0, 0, new WidgetPointer(77,17)); + return; +} diff --git a/dumps/scripts/4656.cs2 b/dumps/scripts/4656.cs2 new file mode 100644 index 000000000..d4ae06b89 --- /dev/null +++ b/dumps/scripts/4656.cs2 @@ -0,0 +1,6 @@ +void script_4656(int arg0) { + SWITCH (globalint_1532) { + } + cameraUnlock(); + return; +} diff --git a/dumps/scripts/4657.cs2 b/dumps/scripts/4657.cs2 new file mode 100644 index 000000000..57e61d54c --- /dev/null +++ b/dumps/scripts/4657.cs2 @@ -0,0 +1,14 @@ +void script_4657(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 3); + cs2method5405(1, 3); + cs2method5406(0, 0, addToCoordinate(ivar1, 23, 0, 25), 700, addToCoordinate(ivar1, 23, 0, 25), 700, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 30, 0, 33), 400, addToCoordinate(ivar1, 30, 0, 22), 400, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 23, 0, 25), 700, addToCoordinate(ivar1, 23, 0, 25), 700, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 27, 0, 29), 500, addToCoordinate(ivar1, 27, 0, 29), 500, 0); + cs2method5406(0, 2, addToCoordinate(ivar1, 23, 0, 25), 700, addToCoordinate(ivar1, 23, 0, 25), 700, 0); + cs2method5406(1, 2, addToCoordinate(ivar1, 31, 0, 33), 400, addToCoordinate(ivar1, 31, 0, 33), 400, 0); + cameraMethod5502(0, 0, 1000000, 1000000, 1, 0); + return; +} diff --git a/dumps/scripts/4658.cs2 b/dumps/scripts/4658.cs2 new file mode 100644 index 000000000..2baaa62d6 --- /dev/null +++ b/dumps/scripts/4658.cs2 @@ -0,0 +1,12 @@ +void script_4658(int arg0) { + int ivar1; + ivar1 = divide(standart_config_2201, 3); + setWidgetText(new WidgetPointer(arg0), intToStr(standart_config_2201)); + script_4542(ivar1, 1441832, 1441837); + if (standart_config_2201 <= 100) { + setWidgetAnimation(9777, new WidgetPointer(22,2)); + } else { + setWidgetAnimation(9804, new WidgetPointer(22,2)); + } + return; +} diff --git a/dumps/scripts/4659.cs2 b/dumps/scripts/4659.cs2 new file mode 100644 index 000000000..a41cf87a6 --- /dev/null +++ b/dumps/scripts/4659.cs2 @@ -0,0 +1,12 @@ +void script_4659(int arg0) { + int ivar1; + ivar1 = divide(standart_config_2202, 3); + script_4542(ivar1, 1441856, 1441861); + setWidgetText(new WidgetPointer(arg0), intToStr(standart_config_2202)); + if (standart_config_2202 <= 100) { + setWidgetAnimation(9777, new WidgetPointer(22,70)); + } else { + setWidgetAnimation(9804, new WidgetPointer(22,70)); + } + return; +} diff --git a/dumps/scripts/466.cs2 b/dumps/scripts/466.cs2 new file mode 100644 index 000000000..f43681adf --- /dev/null +++ b/dumps/scripts/466.cs2 @@ -0,0 +1,10 @@ +void script_466(int arg0) { + if (getSkillActualLvl(6) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "A Magic level of " + intToStr(25) + " is required." + ""); + } else if (bitconfig_2086 < 1) { + setWidgetText(new WidgetPointer(arg0), "" + "1 Commendation required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(multiply(divide(pow(getSkillActualLvl(6), 2), 600), 32)) + " XP per Commendation."); + } + return; +} diff --git a/dumps/scripts/4660.cs2 b/dumps/scripts/4660.cs2 new file mode 100644 index 000000000..85e9ac5fc --- /dev/null +++ b/dumps/scripts/4660.cs2 @@ -0,0 +1,12 @@ +void script_4660(int arg0) { + int ivar1; + ivar1 = divide(standart_config_2203, 3); + setWidgetText(new WidgetPointer(arg0), intToStr(standart_config_2203)); + script_4542(ivar1, 1441888, 1441893); + if (standart_config_2203 <= 100) { + setWidgetAnimation(9777, new WidgetPointer(22,0)); + } else { + setWidgetAnimation(9804, new WidgetPointer(22,0)); + } + return; +} diff --git a/dumps/scripts/4661.cs2 b/dumps/scripts/4661.cs2 new file mode 100644 index 000000000..a1ba3a09a --- /dev/null +++ b/dumps/scripts/4661.cs2 @@ -0,0 +1,50 @@ +cs2func_script_4661_struct(2,0,0) script_4661() { + flow_0: + SWITCH (standart_config_2192) { + case 0: + GOTO flow_1 + case 1: + GOTO flow_2 + case 2: + GOTO flow_3 + case 3: + GOTO flow_4 + case 4: + GOTO flow_5 + case 5: + GOTO flow_6 + case 6: + GOTO flow_7 + case 7: + GOTO flow_8 + case 8: + GOTO flow_9 + case 9: + GOTO flow_10 + case 10: + GOTO flow_11 + } + return newstruct cs2func_script_4661_struct(0, 0); + flow_1: + return newstruct cs2func_script_4661_struct(1, 5); + flow_2: + return newstruct cs2func_script_4661_struct(1, 4); + flow_3: + return newstruct cs2func_script_4661_struct(1, 3); + flow_4: + return newstruct cs2func_script_4661_struct(1, 2); + flow_5: + return newstruct cs2func_script_4661_struct(1, 1); + flow_6: + return newstruct cs2func_script_4661_struct(0, 0); + flow_7: + return newstruct cs2func_script_4661_struct(2, 1); + flow_8: + return newstruct cs2func_script_4661_struct(2, 2); + flow_9: + return newstruct cs2func_script_4661_struct(2, 3); + flow_10: + return newstruct cs2func_script_4661_struct(2, 4); + flow_11: + return newstruct cs2func_script_4661_struct(2, 5); +} diff --git a/dumps/scripts/4662.cs2 b/dumps/scripts/4662.cs2 new file mode 100644 index 000000000..2364d3325 --- /dev/null +++ b/dumps/scripts/4662.cs2 @@ -0,0 +1,51 @@ +void script_4662(int arg0,int arg1) { + int ivar2; + int ivar3; + cs2func_script_4661_struct(2,0,0) structdump_0; + ivar2 = 0; + ivar3 = 0; + structdump_0 = script_4661(); + ivar3 = structdump_0.intpart_1; + ivar2 = structdump_0.intpart_0; + if (((boolean)ivar2) && (ivar3 >= 3)) { + switch (arg0) { + case 1507330: + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + break; + case 1507331: + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + break; + case 1507332: + return; + case 1507333: + return; + } + } else if ((ivar2 == 2) && (ivar3 >= 3)) { + switch (arg0) { + case 1507332: + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + break; + case 1507333: + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + break; + case 1507330: + return; + case 1507331: + return; + } + } else { + switch (arg0) { + case 1507331: + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + break; + case 1507332: + setWidgetRGB(new Color(arg1), new WidgetPointer(arg0)); + break; + case 1507330: + return; + case 1507333: + return; + } + } + return; +} diff --git a/dumps/scripts/4663.cs2 b/dumps/scripts/4663.cs2 new file mode 100644 index 000000000..b016a2b1e --- /dev/null +++ b/dumps/scripts/4663.cs2 @@ -0,0 +1,33 @@ +void script_4663(int arg0) { + flow_0: + SWITCH (globalint_1534) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + } + cameraUnlock(); + GOTO flow_6 + flow_1: + script_4664(arg0); + GOTO flow_6 + flow_2: + script_4665(arg0); + GOTO flow_6 + flow_3: + script_4666(arg0); + GOTO flow_6 + flow_4: + script_4667(arg0); + GOTO flow_6 + flow_5: + script_4668(arg0); + flow_6: + return; +} diff --git a/dumps/scripts/4664.cs2 b/dumps/scripts/4664.cs2 new file mode 100644 index 000000000..49675dca2 --- /dev/null +++ b/dumps/scripts/4664.cs2 @@ -0,0 +1,12 @@ +void script_4664(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 7, 0, 35), 700, addToCoordinate(ivar1, 7, 0, 35), 700, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 8, 0, 30), 500, addToCoordinate(ivar1, 8, 0, 30), 500, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 7, 0, 30), 900, addToCoordinate(ivar1, 7, 0, 30), 900, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 8, 0, 22), 400, addToCoordinate(ivar1, 8, 0, 22), 400, 0); + cameraMethod5502(0, 0, 100, 300, 1, 0); + return; +} diff --git a/dumps/scripts/4665.cs2 b/dumps/scripts/4665.cs2 new file mode 100644 index 000000000..732004812 --- /dev/null +++ b/dumps/scripts/4665.cs2 @@ -0,0 +1,12 @@ +void script_4665(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 7, 0, 30), 900, addToCoordinate(ivar1, 7, 0, 30), 900, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 8, 0, 22), 400, addToCoordinate(ivar1, 8, 0, 22), 400, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 7, 0, 30), 700, addToCoordinate(ivar1, 7, 0, 30), 700, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 8, 0, 22), 200, addToCoordinate(ivar1, 8, 0, 22), 200, 0); + cameraMethod5502(0, 0, 200, 200, 1, 0); + return; +} diff --git a/dumps/scripts/4666.cs2 b/dumps/scripts/4666.cs2 new file mode 100644 index 000000000..f39347848 --- /dev/null +++ b/dumps/scripts/4666.cs2 @@ -0,0 +1,16 @@ +void script_4666(int arg0) { + int ivar1; + ivar1 = script_284(getMyPositionHash()); + cs2method5405(0, 4); + cs2method5405(1, 4); + cs2method5406(0, 0, addToCoordinate(ivar1, 7, 0, 30), 700, addToCoordinate(ivar1, 7, 0, 30), 700, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 8, 0, 22), 200, addToCoordinate(ivar1, 8, 0, 22), 200, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 0, 0, 15), 800, addToCoordinate(ivar1, 0, 0, 15), 800, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 8, 0, 22), 300, addToCoordinate(ivar1, 8, 0, 22), 300, 0); + cs2method5406(0, 2, addToCoordinate(ivar1, 7, 0, 15), 600, addToCoordinate(ivar1, 7, 0, 15), 600, 0); + cs2method5406(1, 2, addToCoordinate(ivar1, 8, 0, 22), 100, addToCoordinate(ivar1, 8, 0, 22), 100, 0); + cs2method5406(0, 3, addToCoordinate(ivar1, 15, 0, 15), 800, addToCoordinate(ivar1, 15, 0, 15), 800, 0); + cs2method5406(1, 3, addToCoordinate(ivar1, 8, 0, 22), 300, addToCoordinate(ivar1, 8, 0, 22), 300, 0); + cameraMethod5502(0, 0, 100, 400, 1, 0); + return; +} diff --git a/dumps/scripts/4667.cs2 b/dumps/scripts/4667.cs2 new file mode 100644 index 000000000..b0aa01197 --- /dev/null +++ b/dumps/scripts/4667.cs2 @@ -0,0 +1,4 @@ +void script_4667(int arg0) { + cameraMethod5502(0, 1, 100, 400, 1, 0); + return; +} diff --git a/dumps/scripts/4668.cs2 b/dumps/scripts/4668.cs2 new file mode 100644 index 000000000..2a9df3903 --- /dev/null +++ b/dumps/scripts/4668.cs2 @@ -0,0 +1,4 @@ +void script_4668(int arg0) { + cameraMethod5502(0, 2, 100, 400, 1, 0); + return; +} diff --git a/dumps/scripts/4669.cs2 b/dumps/scripts/4669.cs2 new file mode 100644 index 000000000..9e910389d --- /dev/null +++ b/dumps/scripts/4669.cs2 @@ -0,0 +1,13 @@ +void script_4669(int arg0) { + flow_0: + SWITCH (globalint_1525) { + case 1: + GOTO flow_1 + } + cameraUnlock(); + GOTO flow_2 + flow_1: + script_4670(arg0); + flow_2: + return; +} diff --git a/dumps/scripts/467.cs2 b/dumps/scripts/467.cs2 new file mode 100644 index 000000000..0f2dcb746 --- /dev/null +++ b/dumps/scripts/467.cs2 @@ -0,0 +1,10 @@ +void script_467(int arg0) { + if (getSkillActualLvl(5) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "A Prayer level of " + intToStr(25) + " is required." + ""); + } else if (bitconfig_2086 < 1) { + setWidgetText(new WidgetPointer(arg0), "" + "1 Commendation required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(multiply(divide(pow(getSkillActualLvl(5), 2), 600), 18)) + " XP per Commendation."); + } + return; +} diff --git a/dumps/scripts/4670.cs2 b/dumps/scripts/4670.cs2 new file mode 100644 index 000000000..ae92f7b63 --- /dev/null +++ b/dumps/scripts/4670.cs2 @@ -0,0 +1,12 @@ +void script_4670(int arg0) { + int ivar1; + ivar1 = script_284(addToCoordinate(getMyPositionHash(), -16, 0, 0)); + cs2method5405(0, 2); + cs2method5405(1, 2); + cs2method5406(0, 0, addToCoordinate(ivar1, 52, 0, 58), 700, addToCoordinate(ivar1, 52, 0, 58), 700, 0); + cs2method5406(1, 0, addToCoordinate(ivar1, 55, 0, 62), 500, addToCoordinate(ivar1, 55, 0, 62), 500, 0); + cs2method5406(0, 1, addToCoordinate(ivar1, 52, 0, 55), 900, addToCoordinate(ivar1, 52, 0, 55), 900, 0); + cs2method5406(1, 1, addToCoordinate(ivar1, 55, 0, 63), 400, addToCoordinate(ivar1, 55, 0, 63), 400, 0); + cameraMethod5502(0, 0, 100, 300, 1, 0); + return; +} diff --git a/dumps/scripts/4671.cs2 b/dumps/scripts/4671.cs2 new file mode 100644 index 000000000..14039bb21 --- /dev/null +++ b/dumps/scripts/4671.cs2 @@ -0,0 +1,13 @@ +void script_4671(int arg0) { + globalint_1526 = 0; + globalint_1527 = 0; + globalint_1528 = 0; + globalint_1529 = 0; + globalint_1530 = 0; + globalint_1531 = 0; + script_4672(bitconfig_9306); + script_4677(); + script_4673(bitconfig_9306); + setScriptCallOnGameloop(4675, "", new WidgetPointer(102,62)); + return; +} diff --git a/dumps/scripts/4672.cs2 b/dumps/scripts/4672.cs2 new file mode 100644 index 000000000..7ec4ecde4 --- /dev/null +++ b/dumps/scripts/4672.cs2 @@ -0,0 +1,17 @@ +void script_4672(int arg0) { + int ivar1; + ivar1 = -1; + switch (arg0) { + case 1: + ivar1 = 1823; + break; + case 2: + ivar1 = 55612; + setWidgetAnimation(9804, new WidgetPointer(102,54)); + break; + case 4: + ivar1 = 55626; + } + setWidgetModel(ivar1, new WidgetPointer(102,54)); + return; +} diff --git a/dumps/scripts/4673.cs2 b/dumps/scripts/4673.cs2 new file mode 100644 index 000000000..7e6c83c1f --- /dev/null +++ b/dumps/scripts/4673.cs2 @@ -0,0 +1,12 @@ +void script_4673(int arg0) { + if (arg0 != 2) { + setWidgetIsHidden(true, new WidgetPointer(102,60)); + setWidgetIsHidden(false, new WidgetPointer(102,61)); + setScriptCallOnGameloop(4674, "", new WidgetPointer(102,61)); + } else { + setWidgetIsHidden(true, new WidgetPointer(102,61)); + setWidgetIsHidden(false, new WidgetPointer(102,60)); + setScriptCallOnGameloop(4674, "", new WidgetPointer(102,60)); + } + return; +} diff --git a/dumps/scripts/4674.cs2 b/dumps/scripts/4674.cs2 new file mode 100644 index 000000000..120dcc7dd --- /dev/null +++ b/dumps/scripts/4674.cs2 @@ -0,0 +1,104 @@ +void script_4674() { + int ivar0; + ivar0 = bitconfig_9306; + if (((globalint_1526 >= 20) && (globalint_1527 >= 30)) && ((globalint_1528 >= 40) && (globalint_1529 >= 50))) { + return; + } + if (globalint_1526 < 20) { + globalint_1526 = add(globalint_1526, 1); + } + if (globalint_1527 < 30) { + globalint_1527 = add(globalint_1527, 1); + } + if (globalint_1528 < 40) { + globalint_1528 = add(globalint_1528, 1); + } + if (globalint_1529 < 50) { + globalint_1529 = add(globalint_1529, 1); + } + switch (ivar0) { + case 1: + if (globalint_1526 >= 20) { + if (((boolean)bitconfig_9320)) { + setWidgetSprite(5917, new WidgetPointer(102,150)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,150)); + } + } + if (globalint_1527 >= 30) { + if (((boolean)bitconfig_9321)) { + setWidgetSprite(5917, new WidgetPointer(102,151)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,151)); + } + } + if (globalint_1528 >= 40) { + if (((boolean)bitconfig_9322)) { + setWidgetSprite(5917, new WidgetPointer(102,152)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,152)); + } + } + if (globalint_1529 >= 50) { + if (((boolean)bitconfig_9323)) { + setWidgetSprite(5917, new WidgetPointer(102,153)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,153)); + } + } + break; + case 4: + if (globalint_1526 >= 20) { + if (((boolean)bitconfig_9324)) { + setWidgetSprite(5917, new WidgetPointer(102,150)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,150)); + } + } + if (globalint_1527 >= 30) { + if (((boolean)bitconfig_9325)) { + setWidgetSprite(5917, new WidgetPointer(102,151)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,151)); + } + } + if (globalint_1528 >= 40) { + if (((boolean)bitconfig_9326)) { + setWidgetSprite(5917, new WidgetPointer(102,152)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,152)); + } + } + if (globalint_1529 >= 50) { + if (((boolean)bitconfig_9327)) { + setWidgetSprite(5917, new WidgetPointer(102,153)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,153)); + } + } + break; + case 2: + if (globalint_1526 >= 20) { + if (((boolean)bitconfig_9331)) { + setWidgetSprite(5917, new WidgetPointer(102,64)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,64)); + } + } + if (globalint_1527 >= 30) { + if (((boolean)bitconfig_9333)) { + setWidgetSprite(5917, new WidgetPointer(102,148)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,148)); + } + } + if (globalint_1528 >= 40) { + if (((boolean)bitconfig_9332)) { + setWidgetSprite(5917, new WidgetPointer(102,149)); + } else { + setWidgetSprite(5921, new WidgetPointer(102,149)); + } + } + } + return; +} diff --git a/dumps/scripts/4675.cs2 b/dumps/scripts/4675.cs2 new file mode 100644 index 000000000..735ea2237 --- /dev/null +++ b/dumps/scripts/4675.cs2 @@ -0,0 +1,38 @@ +void script_4675() { + int ivar0; + int ivar1; + ivar0 = multiply(bitconfig_9298, 10); + ivar1 = 0; + if (globalint_1530 < ivar0) { + globalint_1530 = add(globalint_1530, 1); + playSoundEffect2False(5251, 1, 0, 255); + } + script_4542(globalint_1530, 6684772, 6684777); + switch (bitconfig_9306) { + case 1: + ivar1 = multiply(bitconfig_9308, 10); + break; + case 2: + ivar1 = multiply(bitconfig_9309, 10); + break; + case 3: + ivar1 = multiply(bitconfig_9310, 10); + break; + case 4: + ivar1 = multiply(bitconfig_9311, 10); + break; + case 5: + ivar1 = multiply(bitconfig_9312, 10); + break; + case 6: + ivar1 = multiply(bitconfig_9313, 10); + } + if ((globalint_1530 >= ivar0) && (globalint_1531 >= ivar1)) { + script_4676(bitconfig_9306); + } + if (globalint_1531 < ivar1) { + globalint_1531 = add(globalint_1531, 1); + } + script_4542(globalint_1531, 6684782, 6684787); + return; +} diff --git a/dumps/scripts/4676.cs2 b/dumps/scripts/4676.cs2 new file mode 100644 index 000000000..8e0d77eeb --- /dev/null +++ b/dumps/scripts/4676.cs2 @@ -0,0 +1,73 @@ +void script_4676(int arg0) { + switch (arg0) { + case 1: + if (((boolean)bitconfig_9314)) { + setWidgetIsHidden(true, new WidgetPointer(102,15)); + setWidgetIsHidden(true, new WidgetPointer(102,17)); + } else { + if (((bitconfig_9298 == 10) && (getSkillActualLvl(6) >= 30)) && ((getSkillActualLvl(4) >= 30) && (getSkillActualLvl(0) >= 30))) { + setWidgetIsHidden(false, new WidgetPointer(102,70)); + setWidgetIsHidden(false, new WidgetPointer(102,15)); + setWidgetIsHidden(false, new WidgetPointer(102,17)); + if (((boolean)bitconfig_9315)) { + setWidgetText(new WidgetPointer(102,70), "You receive two new books."); + } + } + } + if (((boolean)bitconfig_9315)) { + setWidgetIsHidden(true, new WidgetPointer(102,14)); + setWidgetIsHidden(true, new WidgetPointer(102,16)); + } else { + setWidgetIsHidden(false, new WidgetPointer(102,70)); + setWidgetIsHidden(false, new WidgetPointer(102,14)); + setWidgetIsHidden(false, new WidgetPointer(102,16)); + } + break; + case 2: + if (((boolean)bitconfig_9316)) { + setWidgetIsHidden(true, new WidgetPointer(102,15)); + setWidgetIsHidden(true, new WidgetPointer(102,17)); + } else { + if (((bitconfig_9298 == 10) && (getSkillActualLvl(16) >= 55)) && (getSkillActualLvl(17) >= 55)) { + setWidgetIsHidden(false, new WidgetPointer(102,70)); + setWidgetIsHidden(false, new WidgetPointer(102,15)); + setWidgetIsHidden(false, new WidgetPointer(102,17)); + if (((boolean)bitconfig_9317)) { + setWidgetText(new WidgetPointer(102,70), "You receive two new books."); + } + } + } + if (((boolean)bitconfig_9317)) { + setWidgetIsHidden(true, new WidgetPointer(102,14)); + setWidgetIsHidden(true, new WidgetPointer(102,16)); + } else { + setWidgetIsHidden(false, new WidgetPointer(102,70)); + setWidgetIsHidden(false, new WidgetPointer(102,14)); + setWidgetIsHidden(false, new WidgetPointer(102,16)); + } + break; + case 4: + if (((boolean)bitconfig_9318)) { + setWidgetIsHidden(true, new WidgetPointer(102,15)); + setWidgetIsHidden(true, new WidgetPointer(102,17)); + } else { + if ((bitconfig_9298 == 10) && (getSkillActualLvl(2) >= 70)) { + setWidgetIsHidden(false, new WidgetPointer(102,70)); + setWidgetIsHidden(false, new WidgetPointer(102,15)); + setWidgetIsHidden(false, new WidgetPointer(102,17)); + if (((boolean)bitconfig_9319)) { + setWidgetText(new WidgetPointer(102,70), "You receive two new books."); + } + } + } + if (((boolean)bitconfig_9319)) { + setWidgetIsHidden(true, new WidgetPointer(102,14)); + setWidgetIsHidden(true, new WidgetPointer(102,16)); + } else { + setWidgetIsHidden(false, new WidgetPointer(102,70)); + setWidgetIsHidden(false, new WidgetPointer(102,14)); + setWidgetIsHidden(false, new WidgetPointer(102,16)); + } + } + return; +} diff --git a/dumps/scripts/4677.cs2 b/dumps/scripts/4677.cs2 new file mode 100644 index 000000000..57da6db34 --- /dev/null +++ b/dumps/scripts/4677.cs2 @@ -0,0 +1,37 @@ +void script_4677() { + switch (bitconfig_9306) { + case 1: + if (bitconfig_9298 == 10) { + if (((getSkillActualLvl(6) >= 30) && (getSkillActualLvl(4) >= 30)) && (getSkillActualLvl(0) >= 30)) { + setWidgetText(new WidgetPointer(102,55), "Carn is no more, his behemoth has been dealt with, and Linza has her ore. The tales of Great Ozan can continue!"); + } else { + setWidgetText(new WidgetPointer(102,55), "Carn has been defeated and Linza appreciates her new ore. The story still feels incomplete, somehow."); + } + } else { + setWidgetText(new WidgetPointer(102,55), "Carn's defeated, but the story still feels incomplete somehow."); + } + break; + case 2: + if (bitconfig_9298 == 10) { + if ((getSkillActualLvl(16) >= 55) && (getSkillActualLvl(17) >= 55)) { + setWidgetText(new WidgetPointer(102,55), "I have become Vengeance: death to those who callously disregard life. They, and everyone like them, will pay for what they have done."); + } else { + setWidgetText(new WidgetPointer(102,55), "Am I done now? No, there's more that must be done. Vengeance has not yet been satisfied."); + } + } else { + setWidgetText(new WidgetPointer(102,55), "I killed them...but in doing so I never thought to check for survivors. Am I a monster?"); + } + break; + case 4: + if (bitconfig_9298 == 10) { + if (getSkillActualLvl(2) >= 70) { + setWidgetText(new WidgetPointer(102,55), "Ha! Thok stronger than squishy monsters in dungeon! None are as mighty as Thok."); + } else { + setWidgetText(new WidgetPointer(102,55), "Odd... Thok remember being much stronger in dungeon."); + } + } else { + setWidgetText(new WidgetPointer(102,55), "Thok save Marm, but Thok not show how mighty Thok is. Thok need to do more."); + } + } + return; +} diff --git a/dumps/scripts/4678.cs2 b/dumps/scripts/4678.cs2 new file mode 100644 index 000000000..c94f55bba --- /dev/null +++ b/dumps/scripts/4678.cs2 @@ -0,0 +1,10 @@ +void script_4678(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = getWidgetActualWidth(new WidgetPointer(arg1)); + ivar3 = divide(ivar2, cs2method_3408(105, 105, 3840, bitconfig_9373)); + ivar4 = multiply(bitconfig_9376, ivar3); + setWidgetSize(ivar4, getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4679.cs2 b/dumps/scripts/4679.cs2 new file mode 100644 index 000000000..7ccc8f74d --- /dev/null +++ b/dumps/scripts/4679.cs2 @@ -0,0 +1,11 @@ +void script_4679() { + if (cs2method_3408(105, 105, 3839, globalint_1535) < 1) { + setWidgetPosition(10, 26, 0, 0, new WidgetPointer(302,23)); + setWidgetIsHidden(true, new WidgetPointer(302,24)); + setWidgetText(new WidgetPointer(302,11), "Difficulty: " + intToStr(globalint_1535) + "/10"); + } else { + setWidgetIsHidden(false, new WidgetPointer(302,24)); + setWidgetText(new WidgetPointer(302,11), "Difficulty: " + intToStr(globalint_1535) + "/10"); + } + return; +} diff --git a/dumps/scripts/468.cs2 b/dumps/scripts/468.cs2 new file mode 100644 index 000000000..da3647279 --- /dev/null +++ b/dumps/scripts/468.cs2 @@ -0,0 +1,16 @@ +void script_468(int arg0,int arg1) { + if (((((((getSkillActualLvl(0) < 42) || (getSkillActualLvl(2) < 42)) || (getSkillActualLvl(1) < 42)) || (getSkillActualLvl(3) < 42)) || (getSkillActualLvl(4) < 42)) || (getSkillActualLvl(6) < 42)) || (getSkillActualLvl(5) < 22)) { + setWidgetText(new WidgetPointer(arg0), "" + "Higher levels required...(show)" + ""); + return; + } + if ((arg0 == 66257161) && (standart_config_1875 < 1250)) { + setWidgetText(new WidgetPointer(arg0), "" + "1250 Conquest ranking required." + ""); + return; + } + if (bitconfig_2086 < arg1) { + setWidgetText(new WidgetPointer(arg0), "" + intToStr(arg1) + " Commendations required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(arg1) + " Commendations."); + } + return; +} diff --git a/dumps/scripts/4680.cs2 b/dumps/scripts/4680.cs2 new file mode 100644 index 000000000..82a2c60cf --- /dev/null +++ b/dumps/scripts/4680.cs2 @@ -0,0 +1,8 @@ +void script_4680() { + int ivar0; + int ivar1; + ivar0 = getWidgetActualWidth(new WidgetPointer(302,77)); + ivar1 = multiplyDivide(globalint_1536, 10000, ivar0); + setWidgetSize(ivar1, getWidgetActualHeight(new WidgetPointer(302,77)), 0, 0, new WidgetPointer(302,78)); + return; +} diff --git a/dumps/scripts/4681.cs2 b/dumps/scripts/4681.cs2 new file mode 100644 index 000000000..a861a0979 --- /dev/null +++ b/dumps/scripts/4681.cs2 @@ -0,0 +1,11 @@ +void script_4681() { + int ivar0; + ivar0 = 0; + ivar0 = add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(bitconfig_9436, bitconfig_9437), bitconfig_9438), bitconfig_9439), bitconfig_9440), bitconfig_9441), bitconfig_9442), bitconfig_9443), bitconfig_9444), bitconfig_9445), bitconfig_9446), bitconfig_9447), bitconfig_9448), bitconfig_9449), bitconfig_9450), bitconfig_9451), bitconfig_9452), bitconfig_9453), bitconfig_9454), bitconfig_9455), bitconfig_9456), bitconfig_9457), bitconfig_9458), bitconfig_9459), bitconfig_9460), bitconfig_9461), bitconfig_9462); + if (ivar0 == 26) { + setWidgetText(new WidgetPointer(314,13), "Final wreck to loot!"); + } else { + setWidgetText(new WidgetPointer(314,13), "Wrecks looted: " + intToStr(ivar0) + "/27"); + } + return; +} diff --git a/dumps/scripts/4682.cs2 b/dumps/scripts/4682.cs2 new file mode 100644 index 000000000..cde91cfee --- /dev/null +++ b/dumps/scripts/4682.cs2 @@ -0,0 +1,4 @@ +void script_4682() { + cs2method5421(1, "javadownload.ws"); + return; +} diff --git a/dumps/scripts/4683.cs2 b/dumps/scripts/4683.cs2 new file mode 100644 index 000000000..83dd3cac6 --- /dev/null +++ b/dumps/scripts/4683.cs2 @@ -0,0 +1,4 @@ +void script_4683() { + cs2method5421(1, "download.ws"); + return; +} diff --git a/dumps/scripts/4684.cs2 b/dumps/scripts/4684.cs2 new file mode 100644 index 000000000..54928b5c9 --- /dev/null +++ b/dumps/scripts/4684.cs2 @@ -0,0 +1,5 @@ +void script_4684() { + cs2method2005(0, new WidgetPointer(744,116)); + closeInterface(48758900); + return; +} diff --git a/dumps/scripts/4685.cs2 b/dumps/scripts/4685.cs2 new file mode 100644 index 000000000..64feb60b9 --- /dev/null +++ b/dumps/scripts/4685.cs2 @@ -0,0 +1,26 @@ +void script_4685() { + int ivar0; + int ivar1; + string svar0; + string svar1; + svar0 = intToStr(bitconfig_9467); + svar1 = "Waiting for next wave..."; + if (globalint_1537 != 0) { + setWidgetIsHidden(false, new WidgetPointer(447,14)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(447,1)), 79, 0, 0, new WidgetPointer(447,1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(447,14)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(447,1)), 45, 0, 0, new WidgetPointer(447,1)); + } + ivar0 = 0; + ivar1 = 0; + ivar0 = script_4699(29294603, 29294604, 29294605, "Wave", svar0); + if (globalint_1537 != 0) { + ivar1 = script_4699(29294606, 29294608, 29294609, "Waiting?", svar1); + } + ivar0 = max(ivar0, ivar1); + if (ivar0 > getWidgetActualWidth(new WidgetPointer(447,1))) { + setWidgetSize(add(ivar0, 5), getWidgetActualHeight(new WidgetPointer(447,1)), 0, 0, new WidgetPointer(447,1)); + } + return; +} diff --git a/dumps/scripts/4686.cs2 b/dumps/scripts/4686.cs2 new file mode 100644 index 000000000..980b2db45 --- /dev/null +++ b/dumps/scripts/4686.cs2 @@ -0,0 +1,17 @@ +void script_4686() { + if (globalint_1538 >= 160) { + return; + } + if (((boolean)globalint_1539)) { + globalint_1538 = 160; + setWidgetPosition(0, 75, 0, 0, new WidgetPointer(447,15)); + return; + } + if (globalint_1538 == 158) { + setWidgetIsHidden(true, new WidgetPointer(447,15)); + } else { + setWidgetPosition(subtract(-2, globalint_1538), 75, 0, 0, new WidgetPointer(447,15)); + globalint_1538 = add(globalint_1538, 2); + } + return; +} diff --git a/dumps/scripts/4687.cs2 b/dumps/scripts/4687.cs2 new file mode 100644 index 000000000..f02c5f09e --- /dev/null +++ b/dumps/scripts/4687.cs2 @@ -0,0 +1,4 @@ +void script_4687() { + setWidgetText(new WidgetPointer(551,22), "Morale: " + intToStr(bitconfig_9465)); + return; +} diff --git a/dumps/scripts/4688.cs2 b/dumps/scripts/4688.cs2 new file mode 100644 index 000000000..5b06faf71 --- /dev/null +++ b/dumps/scripts/4688.cs2 @@ -0,0 +1,83 @@ +void script_4688() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar0 = 0; + ivar1 = 0; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = 1; + while (ivar7 < 5) { + switch (ivar7) { + case 1: + ivar6 = 36110354; + ivar0 = globalint_1549; + ivar1 = cs2method_3408(105, 105, 3856, ivar7); + ivar2 = 36110353; + ivar3 = 36110355; + ivar4 = 36110351; + ivar5 = 36110352; + break; + case 2: + ivar6 = 36110380; + ivar0 = globalint_1550; + ivar1 = cs2method_3408(105, 105, 3856, ivar7); + ivar2 = 36110379; + ivar3 = 36110381; + ivar4 = 36110377; + ivar5 = 36110378; + break; + case 3: + ivar6 = 36110394; + ivar0 = globalint_1551; + ivar1 = cs2method_3408(105, 105, 3856, ivar7); + ivar2 = 36110393; + ivar3 = 36110395; + ivar4 = 36110391; + ivar5 = 36110392; + break; + case 4: + ivar6 = 36110408; + ivar0 = globalint_1552; + ivar1 = cs2method_3408(105, 105, 3856, ivar7); + ivar2 = 36110407; + ivar3 = 36110409; + ivar4 = 36110405; + ivar5 = 36110406; + break; + default: + return; + } + if (setWidgetRegister(new WidgetPointer(ivar6))) { + if (ivar0 > 0) { + setWidgetHidden(0); + setWidgetFilled(1); + setWidgetSize(getWidgetActualWidth(), divide(multiply(ivar0, 26), 100), 0, 0); + } else { + setWidgetHidden(1); + setWidgetFilled(0); + setWidgetSize(getWidgetActualWidth(), 26, 0, 0); + } + } + if ((ivar0 > 0) || (bitconfig_9465 < ivar1)) { + setWidgetIsHidden(false, new WidgetPointer(ivar3)); + setWidgetRGB(new Color(125, 125, 125), new WidgetPointer(ivar4)); + setWidgetRGB(new Color(125, 125, 125), new WidgetPointer(ivar5)); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(ivar2)); + setWidgetIsHidden(true, new WidgetPointer(ivar3)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(ivar4)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(ivar5)); + } + ivar7 = add(ivar7, 1); + } + return; +} diff --git a/dumps/scripts/4689.cs2 b/dumps/scripts/4689.cs2 new file mode 100644 index 000000000..c18180cde --- /dev/null +++ b/dumps/scripts/4689.cs2 @@ -0,0 +1,23 @@ +void script_4689() { + setWidgetIsHidden(false, new WidgetPointer(551,9)); + setWidgetText(new WidgetPointer(551,15), cs2method_3408(105, 115, 3855, 1)); + setWidgetSprite(6188, new WidgetPointer(551,17)); + setWidgetText(new WidgetPointer(551,16), intToStr(cs2method_3408(105, 105, 3856, 1))); + setWidgetIsHidden(false, new WidgetPointer(551,33)); + setWidgetText(new WidgetPointer(551,41), cs2method_3408(105, 115, 3855, 2)); + setWidgetSprite(6189, new WidgetPointer(551,43)); + setWidgetText(new WidgetPointer(551,42), intToStr(cs2method_3408(105, 105, 3856, 2))); + setWidgetIsHidden(false, new WidgetPointer(551,47)); + setWidgetText(new WidgetPointer(551,55), cs2method_3408(105, 115, 3855, 3)); + setWidgetSprite(6190, new WidgetPointer(551,57)); + setWidgetText(new WidgetPointer(551,56), intToStr(cs2method_3408(105, 105, 3856, 3))); + setWidgetIsHidden(false, new WidgetPointer(551,61)); + setWidgetText(new WidgetPointer(551,69), cs2method_3408(105, 115, 3855, 4)); + setWidgetSprite(6191, new WidgetPointer(551,71)); + setWidgetText(new WidgetPointer(551,70), intToStr(cs2method_3408(105, 105, 3856, 4))); + setScriptCallOnMouseOver(4692, new WidgetPointer(-32768,3), 80, "Ii", new WidgetPointer(551,10)); + setScriptCallOnMouseOver(4692, new WidgetPointer(-32768,3), 129, "Ii", new WidgetPointer(551,36)); + setScriptCallOnMouseOver(4692, new WidgetPointer(-32768,3), 31, "Ii", new WidgetPointer(551,50)); + setScriptCallOnMouseOver(4692, new WidgetPointer(-32768,3), 80, "Ii", new WidgetPointer(551,64)); + return; +} diff --git a/dumps/scripts/469.cs2 b/dumps/scripts/469.cs2 new file mode 100644 index 000000000..d19dfb0e3 --- /dev/null +++ b/dumps/scripts/469.cs2 @@ -0,0 +1,4 @@ +void script_469() { + script_304(41962744); + return; +} diff --git a/dumps/scripts/4690.cs2 b/dumps/scripts/4690.cs2 new file mode 100644 index 000000000..f75335dab --- /dev/null +++ b/dumps/scripts/4690.cs2 @@ -0,0 +1,57 @@ +void script_4690(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + flow_0: + ivar2 = 15458492; + ivar3 = 0; + ivar4 = -1; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + SWITCH (arg0) { + case 36110345: + GOTO flow_1 + case 36110369: + GOTO flow_2 + case 36110383: + GOTO flow_3 + case 36110397: + GOTO flow_4 + } + return; + flow_1: + ivar3 = globalint_1549; + ivar4 = 36110351; + ivar6 = globalint_1549; + ivar7 = cs2method_3408(105, 105, 3856, 1); + GOTO flow_5 + flow_2: + ivar3 = globalint_1550; + ivar4 = 36110377; + ivar6 = globalint_1550; + ivar7 = cs2method_3408(105, 105, 3856, 2); + GOTO flow_5 + flow_3: + ivar3 = globalint_1551; + ivar4 = 36110391; + ivar6 = globalint_1551; + ivar7 = cs2method_3408(105, 105, 3856, 3); + GOTO flow_5 + flow_4: + ivar3 = globalint_1552; + ivar4 = 36110405; + ivar6 = globalint_1552; + ivar7 = cs2method_3408(105, 105, 3856, 4); + flow_5: + if (((boolean)ivar6) && (bitconfig_9465 >= ivar7)) { + if (((boolean)arg1)) { + ivar2 = 16777215; + } + setWidgetRGB(new Color(ivar2), new WidgetPointer(ivar4)); + } + return; +} diff --git a/dumps/scripts/4691.cs2 b/dumps/scripts/4691.cs2 new file mode 100644 index 000000000..b7515770c --- /dev/null +++ b/dumps/scripts/4691.cs2 @@ -0,0 +1,5 @@ +void script_4691(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(551,23)); + setWidgetRGB(new Color(40, 36, 37), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4692.cs2 b/dumps/scripts/4692.cs2 new file mode 100644 index 000000000..aafa66fcc --- /dev/null +++ b/dumps/scripts/4692.cs2 @@ -0,0 +1,54 @@ +void script_4692(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar0; + string svar1; + string svar2; + ivar2 = 36110359; + ivar3 = -1; + svar0 = ""; + svar1 = ""; + ivar4 = 0; + ivar5 = 0; + svar2 = ""; + ivar6 = 0; + switch (arg0) { + case 36110346: + ivar6 = 1; + svar1 = "Nothing breaks for 30 seconds."; + break; + case 36110372: + ivar6 = 2; + svar1 = "Kill twice as many trolls when repairing things."; + break; + case 36110386: + ivar6 = 3; + svar1 = "Fix twice as fast and counter-acts troll magic run energy effects."; + break; + case 36110400: + ivar6 = 4; + svar1 = "Broken things don't hurt gatehouse health for 30 seconds."; + break; + default: + setWidgetIsHidden(true, new WidgetPointer(ivar2)); + return; + } + setWidgetText(new WidgetPointer(551,29), cs2method_3408(105, 115, 3855, ivar6)); + setWidgetText(new WidgetPointer(551,30), svar1); + setWidgetText(new WidgetPointer(551,31), "Cost: " + intToStr(cs2method_3408(105, 105, 3856, ivar6))); + ivar5 = cs2method_3408(105, 105, 3857, ivar6); + if (ivar5 == 50) { + svar2 = "30 sec"; + } + if (ivar5 == 100) { + svar2 = "1 min"; + } + setWidgetText(new WidgetPointer(551,32), "Cooldown: " + svar2); + setWidgetRGB(new Color(54, 53, 54), new WidgetPointer(arg0)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(ivar2)), arg1, 0, 0, new WidgetPointer(ivar2)); + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + return; +} diff --git a/dumps/scripts/4693.cs2 b/dumps/scripts/4693.cs2 new file mode 100644 index 000000000..70baeaccb --- /dev/null +++ b/dumps/scripts/4693.cs2 @@ -0,0 +1,5 @@ +void script_4693(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(551,23)); + setWidgetRGB(new Color(40, 36, 37), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4694.cs2 b/dumps/scripts/4694.cs2 new file mode 100644 index 000000000..226cb7fbf --- /dev/null +++ b/dumps/scripts/4694.cs2 @@ -0,0 +1,24 @@ +void script_4694(int arg0) { + if (((boolean)globalint_1548)) { + setWidgetPosition(getWidgetActualWidth(new WidgetPointer(500,2)), 63, 0, 0, new WidgetPointer(arg0)); + } + if (globalint_1548 == 2) { + setWidgetPosition(getWidgetActualWidth(new WidgetPointer(500,2)), 93, 0, 0, new WidgetPointer(arg0)); + } + if (globalint_1548 == 3) { + setWidgetPosition(getWidgetActualWidth(new WidgetPointer(500,2)), 123, 0, 0, new WidgetPointer(arg0)); + } + if (globalint_1548 == 4) { + setWidgetPosition(getWidgetActualWidth(new WidgetPointer(500,2)), 153, 0, 0, new WidgetPointer(arg0)); + } + if (globalint_1548 == 5) { + setWidgetPosition(getWidgetActualWidth(new WidgetPointer(500,2)), 183, 0, 0, new WidgetPointer(arg0)); + } + if (globalint_1548 == 6) { + setWidgetPosition(getWidgetActualWidth(new WidgetPointer(500,2)), 213, 0, 0, new WidgetPointer(arg0)); + } + if (globalint_1548 == 7) { + setWidgetPosition(getWidgetActualWidth(new WidgetPointer(500,2)), 213, 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4695.cs2 b/dumps/scripts/4695.cs2 new file mode 100644 index 000000000..f203c3b5f --- /dev/null +++ b/dumps/scripts/4695.cs2 @@ -0,0 +1,17 @@ +void script_4695(int arg0,int arg1) { + int ivar2; + ivar2 = getClientCycle(); + if ((ivar2 >= add(arg0, 15)) || ((boolean)arg0)) { + cs2method2103(arg1, new WidgetPointer(500,11)); + arg0 = ivar2; + if (((boolean)globalint_1548)) { + arg1 = 255; + } else if (arg1 == 255) { + arg1 = 0; + } else { + arg1 = 255; + } + } + setScriptCallOnGameloop(4695, arg0, arg1, "ii", new WidgetPointer(500,11)); + return; +} diff --git a/dumps/scripts/4696.cs2 b/dumps/scripts/4696.cs2 new file mode 100644 index 000000000..20a3205bb --- /dev/null +++ b/dumps/scripts/4696.cs2 @@ -0,0 +1,7 @@ +void script_4696() { + setScriptCallOnGameloop(4697, 0, "i", new WidgetPointer(500,8)); + if (isWidgetHidden(new WidgetPointer(500,11))) { + setScriptCallOnGameloop(4695, 0, 0, "ii", new WidgetPointer(500,11)); + } + return; +} diff --git a/dumps/scripts/4697.cs2 b/dumps/scripts/4697.cs2 new file mode 100644 index 000000000..4a7ab78b5 --- /dev/null +++ b/dumps/scripts/4697.cs2 @@ -0,0 +1,110 @@ +void script_4697(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + ivar1 = getClientCycle(); + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + svar4 = ""; + svar5 = ""; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 1; + if ((ivar1 >= add(arg0, 200)) || ((boolean)arg0)) { + arg0 = ivar1; + if (globalint_1540 < 1) { + svar0 = "Destroyed"; + } else if (globalint_1540 < divide(5, 2)) { + svar0 = "Under attack"; + } else if (globalint_1540 < 5) { + svar0 = "Unlit ammo"; + } else { + svar0 = "Fine"; + } + if (globalint_1541 < 1) { + svar1 = "Empty"; + } else if (globalint_1541 < divide(10, 2)) { + svar1 = "Low"; + } else if (globalint_1541 < 10) { + svar1 = "Almost full"; + } else { + svar1 = "Full"; + } + if (((boolean)globalint_1542)) { + svar2 = "1 broken"; + } else if (globalint_1542 > 0) { + svar2 = intToStr(globalint_1542) + " broken"; + } else { + svar2 = "Repaired"; + } + if (((boolean)globalint_1543)) { + svar3 = intToStr(ivar5) + " broken"; + } else if (globalint_1543 > 0) { + svar3 = intToStr(globalint_1543) + " broken"; + } else { + svar3 = "Repaired"; + } + ivar2 = divide(globalint_1545, 2); + setWidgetSize(divide(multiply(ivar2, 16384), 100), getWidgetActualHeight(new WidgetPointer(500,12)), 2, 0, new WidgetPointer(500,12)); + if (ivar2 < 97) { + setWidgetIsHidden(true, new WidgetPointer(500,13)); + } + svar4 = intToStr(multiply(globalint_1544, 10)); + setWidgetText(new WidgetPointer(500,29), intToStr(globalint_1546) + " min"); + if (globalint_1547 != 0) { + setWidgetIsHidden(false, new WidgetPointer(500,10)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(500,2)), 253, 0, 0, new WidgetPointer(500,2)); + switch (globalint_1547) { + case 1: + svar5 = "Clobbering Time!"; + break; + case 2: + svar5 = "Slow-mo"; + break; + case 3: + svar5 = "No Well"; + break; + case 4: + svar5 = "Oil Spill"; + break; + case 5: + svar5 = "Fire in the Hole!"; + break; + case 6: + svar5 = "Armoured Trolls"; + } + } else { + setWidgetIsHidden(true, new WidgetPointer(500,10)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(500,2)), 225, 0, 0, new WidgetPointer(500,2)); + } + ivar3 = script_4699(32768008, 32768021, 32768022, "Ballista", svar0); + ivar4 = script_4699(32768005, 32768019, 32768020, "Oil", svar1); + ivar3 = max(ivar3, ivar4); + ivar4 = script_4699(32768006, 32768039, 32768040, "Barricades", svar2); + ivar3 = max(ivar3, ivar4); + ivar4 = script_4699(32768007, 32768017, 32768018, "Walls", svar3); + ivar3 = max(ivar3, ivar4); + ivar4 = script_4699(32768009, 32768041, 32768042, "Trolls", svar4); + ivar3 = max(ivar3, ivar4); + if (globalint_1547 != 0) { + ivar4 = script_4699(32768010, 32768015, 32768016, "Troll Attack", svar5); + ivar3 = max(ivar3, ivar4); + } + if (add(ivar3, 15) > getWidgetActualWidth(new WidgetPointer(500,2))) { + setWidgetSize(add(ivar3, 15), getWidgetActualHeight(new WidgetPointer(500,2)), 0, 0, new WidgetPointer(500,2)); + } + } + setScriptCallOnGameloop(4697, arg0, "i", new WidgetPointer(500,8)); + return; +} diff --git a/dumps/scripts/4698.cs2 b/dumps/scripts/4698.cs2 new file mode 100644 index 000000000..9778adb04 --- /dev/null +++ b/dumps/scripts/4698.cs2 @@ -0,0 +1,10 @@ +void script_4698() { + int ivar0; + ivar0 = 0; + ivar0 = divide(globalint_1545, 2); + setWidgetSize(divide(multiply(ivar0, 16384), 100), getWidgetActualHeight(new WidgetPointer(500,12)), 2, 0, new WidgetPointer(500,12)); + if (ivar0 < 97) { + setWidgetIsHidden(true, new WidgetPointer(500,13)); + } + return; +} diff --git a/dumps/scripts/4699.cs2 b/dumps/scripts/4699.cs2 new file mode 100644 index 000000000..864b5ee12 --- /dev/null +++ b/dumps/scripts/4699.cs2 @@ -0,0 +1,51 @@ +int script_4699(int arg0,int arg1,int arg2,string arg3,string arg4) { + int ivar3; + int ivar4; + ivar3 = max(add(getTextWidth(3793, arg3), 30), 75); + ivar4 = max(add(getTextWidth(3793, arg4), 30), 120); + setWidgetSize(add(ivar3, ivar4), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + setWidgetSize(ivar3, 27, 0, 0, new WidgetPointer(arg1)); + createExtraChild(new WidgetPointer(arg1), 5, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(6, 23, 1, 0); + setWidgetPosition(0, 0, 1, 1); + cs2method1107(1); + setWidgetSprite(5668); + createExtraChild(new WidgetPointer(arg1), 5, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(8, 23, 0, 0); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(5667); + createExtraChild(new WidgetPointer(arg1), 4, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(3793); + setWidgetRGB(new Color(235, 224, 188)); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(false); + setWidgetText(arg3); + deleteAllExtraChilds(new WidgetPointer(arg2)); + setWidgetSize(ivar4, 27, 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(subtract(ivar3, 4), 0, 0, 1, new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(10, 27, 1, 0); + setWidgetPosition(0, 0, 1, 1); + cs2method1107(1); + setWidgetSprite(6084); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(11, 27, 0, 0); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(6083); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(11, 27, 0, 0); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(6086); + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(3793); + setWidgetRGB(new Color(235, 224, 188)); + setWidgetTextAlignment(1, 1, 0); + setWidgetUnknownBoolean(false); + setWidgetText(arg4); + return add(ivar3, ivar4); +} diff --git a/dumps/scripts/47.cs2 b/dumps/scripts/47.cs2 new file mode 100644 index 000000000..932aa3a1b --- /dev/null +++ b/dumps/scripts/47.cs2 @@ -0,0 +1,12 @@ +string script_47(int arg0) { + if (arg0 > 99) { + return intToStr(arg0); + } + if (arg0 > 9) { + return "0" + intToStr(arg0); + } + if (arg0 >= 0) { + return "00" + intToStr(arg0); + } + return intToStr(arg0); +} diff --git a/dumps/scripts/470.cs2 b/dumps/scripts/470.cs2 new file mode 100644 index 000000000..0c21a0ba0 --- /dev/null +++ b/dumps/scripts/470.cs2 @@ -0,0 +1,8 @@ +void script_470(int arg0,int arg1) { + if (bitconfig_2086 < arg1) { + setWidgetText(new WidgetPointer(arg0), "" + intToStr(arg1) + " Commendations required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(arg1) + " Commendations."); + } + return; +} diff --git a/dumps/scripts/4700.cs2 b/dumps/scripts/4700.cs2 new file mode 100644 index 000000000..9b79ac9cf --- /dev/null +++ b/dumps/scripts/4700.cs2 @@ -0,0 +1,4 @@ +void script_4700() { + setScriptCallOnGameloop(-1, "", new WidgetPointer(744,17)); + return; +} diff --git a/dumps/scripts/4701.cs2 b/dumps/scripts/4701.cs2 new file mode 100644 index 000000000..fa8cbdd62 --- /dev/null +++ b/dumps/scripts/4701.cs2 @@ -0,0 +1,36 @@ +void script_4701(int arg0,int arg1,int arg2,string arg3) { + globalint_1553 = arg1; + globalint_1554 = arg2; + globalstring_128 = arg3; + if (((boolean)arg0)) { + if ((globalint_1100 == 43) || (globalint_1100 == 42)) { + script_2190(0, 12, 1, "Leave queue", "Are you sure you wish to leave the queue, you will lose your position if you do.", "", ""); + return; + } + script_3141(arg2, arg3); + if ((arg1 > -1) && setWidgetRegister(new WidgetPointer(910,64), arg1)) { + setWidgetIsHidden(false, new WidgetPointer(910,67)); + setWidgetPosition(0, getWidgetActualY(), 0, 0, new WidgetPointer(910,67)); + } + if (getWorldId() == globalint_998) { + if (setWidgetRegister(new WidgetPointer(910,21), 3)) { + setWidgetHidden(0); + } + } else { + if (setWidgetRegister(new WidgetPointer(910,21), 3)) { + setWidgetHidden(1); + } + } + if (getWorldId() == globalint_999) { + if (setWidgetRegister(new WidgetPointer(910,22), 3)) { + setWidgetHidden(0); + } + } else { + if (setWidgetRegister(new WidgetPointer(910,22), 3)) { + setWidgetHidden(1); + } + } + script_3064(1); + } + return; +} diff --git a/dumps/scripts/4702.cs2 b/dumps/scripts/4702.cs2 new file mode 100644 index 000000000..6891cb631 --- /dev/null +++ b/dumps/scripts/4702.cs2 @@ -0,0 +1,5 @@ +void script_4702() { + cancelLogin(); + globalint_1100 = -1; + return; +} diff --git a/dumps/scripts/4703.cs2 b/dumps/scripts/4703.cs2 new file mode 100644 index 000000000..e6b504b8e --- /dev/null +++ b/dumps/scripts/4703.cs2 @@ -0,0 +1,16 @@ +void script_4703() { + setWidgetIsHidden(true, new WidgetPointer(744,103)); + setWidgetSprite(4129, new WidgetPointer(744,97)); + globalint_1100 = -1; + script_2954(); + resetRCs(); + setWidgetText(new WidgetPointer(975,49), "Play Game"); + setWidgetText(new WidgetPointer(596,60), "Play Game"); + setWidgetText(new WidgetPointer(975,48), "Play Game"); + setWidgetText(new WidgetPointer(596,59), "Play Game"); + setScriptCallOnMousePressed(2944, "", new WidgetPointer(975,44)); + setScriptCallOnMousePressed(2944, "", new WidgetPointer(596,45)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(975,26)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(596,7)); + return; +} diff --git a/dumps/scripts/4704.cs2 b/dumps/scripts/4704.cs2 new file mode 100644 index 000000000..66f5cde35 --- /dev/null +++ b/dumps/scripts/4704.cs2 @@ -0,0 +1,190 @@ +void script_4704() { + int ivar0; + int ivar1; + int ivar2; + loginResponse(3,0,0) structdump_0; + ivar0 = 0; + ivar1 = 0; + ivar2 = -1; + structdump_0 = getLoginResponse(); + ivar2 = structdump_0.intpart_2; + ivar1 = structdump_0.intpart_1; + ivar0 = structdump_0.intpart_0; + switch (ivar0) { + case 0: + break; + case 1: + break; + case 2: + break; + case 3: + messageType0("Your password has been updated. Please leave the world and log in again."); + break; + case 4: + messageType0("Your account has been disabled. Check your Message Centre for details."); + break; + case 5: + messageType0("Your account has not logged out from its last session. Try again in a few minutes."); + break; + case 6: + messageType0("RuneScape has been updated! Please try again in a few minutes."); + break; + case 7: + messageType0("This world is full. Please try back later."); + break; + case 8: + messageType0("Unable to connect: login server offline."); + break; + case 9: + messageType0("Login limit exceeded: too many connections from your address."); + break; + case 10: + messageType0("Unable to connect: bad session id."); + break; + case 11: + messageType0("Your password is an extremely common choice, and is not secure. You must change it."); + break; + case 12: + messageType0("You need a member's account to log in to this world."); + break; + case 13: + messageType0("Could not complete login. Please try back later."); + break; + case 14: + messageType0("The server is being updated. Please wait a few minutes and try again."); + break; + case 15: + break; + case 16: + messageType0("Too many incorrect logins from your address. Please wait 5 minutes before trying again."); + break; + case 17: + messageType0("You are standing in a members-only area. To play on this world, move to a free area first."); + break; + case 18: + messageType0("Your account has been locked. If you have not received an account recovery email, please select 'Recover Account'."); + break; + case 19: + messageType0("Fullscreen is currently a members-only feature. To log in, either exit fullscreen via the options menu or use a member's account."); + break; + case 20: + messageType0("Invalid loginserver requested. Please try back later."); + break; + case 21: + break; + case 22: + messageType0("Malformed login packet. Please try again."); + break; + case 23: + messageType0("No reply from login server. Please wait a minute and try again."); + break; + case 24: + messageType0("Error loading your profile. Please contact customer support."); + break; + case 25: + messageType0("Unexpected loginserver response. Please try back later."); + break; + case 26: + messageType0("This computer's address has been blocked, as it was used to break our rules."); + break; + case 27: + messageType0("Service unavailable."); + break; + case 28: + break; + case 29: + switch (getDetailedRC()) { + case 0: + messageType0("You must have a Combat Level of at least 20 (not including Summoning) to enter a PvP world."); + break; + case 1: + messageType0("You are currently carrying lent items and cannot enter a PvP world."); + break; + case 2: + messageType0("You must be standing in the Wilderness or Edgeville to enter this bounty world."); + break; + case 3: + messageType0("You must have a total skill level of 1,000 or greater to enter this world."); + break; + case 5: + messageType0("You must have a total skill level of 1,500 or greater to enter this world."); + break; + case 4: + messageType0("You must move to a safe area before you can log in to a PvP or bounty world."); + break; + default: + messageType0("Unexpected server response. Please try back later."); + } + break; + case 30: + messageType0("This is not a member's account. Please choose a 'free' world from the website to play on this account."); + break; + case 31: + break; + case 32: + messageType0("Your account has negative membership credit. Please log into the billing system to add credit to your account."); + break; + case 33: + break; + case 34: + break; + case 35: + break; + case 36: + break; + case 37: + messageType0("Your account is currently inaccessible. Please try again in a few minutes."); + break; + case 38: + break; + case 39: + messageType0("The instance you tried to join no longer exists. Please try back later."); + break; + case 40: + messageType0("You need a member's account to log in to this instance."); + break; + case 41: + messageType0("The instance you tried to join is full. Please try back later."); + break; + case 42: + break; + case 43: + break; + case 44: + messageType0("Our systems are currently unavailable. Please try again in a few minutes."); + break; + case 45: + switch (ivar2) { + case 0: + switch (ivar1) { + case 0: + messageType0("You must be near the TzHaar Fight Pits entrance to enter a global match."); + break; + default: + messageType0("Unable to log in. Please try back later."); + } + break; + case 1: + switch (ivar1) { + case 1: + messageType0("There was an error connecting to your meeting room. Please try again."); + break; + case 2: + messageType0("You need a higher rank to enter that private tent."); + break; + case 3: + messageType0("You need an invitation to enter that private room."); + break; + default: + messageType0("Unable to log in. Please try back later."); + } + break; + default: + messageType0("Unable to log in. Please try back later."); + } + break; + case 46: + messageType0("This instance is marked for deletion/rebuild. Please try again in a few minutes."); + } + return; +} diff --git a/dumps/scripts/4705.cs2 b/dumps/scripts/4705.cs2 new file mode 100644 index 000000000..f72bef625 --- /dev/null +++ b/dumps/scripts/4705.cs2 @@ -0,0 +1,16 @@ +cs2func_script_4705_struct(3,0,0) script_4705(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar3 = divide(multiply(arg0, 6), 10); + ivar2 = divide(ivar3, 60); + ivar3 = mod(ivar3, 60); + if (ivar2 > 59) { + ivar1 = divide(ivar2, 60); + ivar2 = mod(ivar2, 60); + } + return newstruct cs2func_script_4705_struct(ivar1, ivar2, ivar3); +} diff --git a/dumps/scripts/4706.cs2 b/dumps/scripts/4706.cs2 new file mode 100644 index 000000000..75e6533c1 --- /dev/null +++ b/dumps/scripts/4706.cs2 @@ -0,0 +1,4 @@ +void script_4706(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_4709(arg0, arg1, arg2, 0, arg3, arg4, arg5, arg6, arg7, 897, 788, 788, 1040, 16777215, 16711680, 16776960, 494, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/4707.cs2 b/dumps/scripts/4707.cs2 new file mode 100644 index 000000000..c725d7024 --- /dev/null +++ b/dumps/scripts/4707.cs2 @@ -0,0 +1,4 @@ +void script_4707(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + script_4709(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, 897, 788, 788, 1040, 16777215, 16711680, 16776960, 494, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/4708.cs2 b/dumps/scripts/4708.cs2 new file mode 100644 index 000000000..cbe55de76 --- /dev/null +++ b/dumps/scripts/4708.cs2 @@ -0,0 +1,4 @@ +void script_4708(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + script_4709(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, 897, 788, 788, 1040, 16777215, 16711680, 16776960, 494, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/4709.cs2 b/dumps/scripts/4709.cs2 new file mode 100644 index 000000000..f62f4ce8a --- /dev/null +++ b/dumps/scripts/4709.cs2 @@ -0,0 +1,78 @@ +void script_4709(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,int arg21,int arg22) { + int ivar23; + int ivar24; + int ivar25; + int ivar26; + string svar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + int stack_dump8; + int stack_dump9; + int stack_dump10; + int stack_dump11; + cs2func_script_4710_struct(2,0,0) structdump_12; + ivar23 = 0; + ivar24 = 0; + stack_dump0 = arg1; + stack_dump1 = arg2; + stack_dump2 = arg5; + stack_dump3 = arg6; + stack_dump4 = arg7; + stack_dump5 = arg8; + stack_dump6 = 897; + stack_dump7 = 788; + stack_dump8 = 788; + stack_dump9 = 16777215; + stack_dump10 = 16776960; + stack_dump11 = 494; + structdump_12 = script_4710(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9, stack_dump10, stack_dump11); + ivar23 = structdump_12.intpart_1; + ivar24 = structdump_12.intpart_0; + createExtraChild(new WidgetPointer(arg6), 5, getExtraChildGap(new WidgetPointer(arg6))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg6)), getWidgetActualHeight(new WidgetPointer(arg6)), 0, 0); + setWidgetSprite(arg12); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg6), 3, getExtraChildGap(new WidgetPointer(arg6))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg6)), getWidgetActualHeight(new WidgetPointer(arg6)), 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(arg7)), multiply(arg4, 15), new WidgetPointer(arg7)); + ivar25 = arg3; + ivar26 = -1; + svar0 = ""; + while (ivar25 <= arg4) { + ivar26 = getExtraChildGap(new WidgetPointer(arg7)); + svar0 = cs2method_3408(105, 115, arg1, ivar25); + createExtraChild(new WidgetPointer(arg7), 4, ivar26); + setWidgetText(svar0); + setWidgetTextAlignment(0, 1, 0); + setWidgetPosition(5, multiply(ivar26, 15), 0, 0); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg7)), 16), 15, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(arg16); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(4713, arg0, -2147483643, "gi"); + if (ivar25 > arg4) { + setWidgetRGB(new Color(arg14)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg7), ivar26, arg14, "Iii"); + setScriptCallOnMousePressed(4715, new WidgetPointer(arg6), new WidgetPointer(arg7), new WidgetPointer(arg8), new WidgetPointer(arg5), ivar23, ivar24, svar0, arg14, "IIIIiisi"); + } else { + setWidgetRGB(new Color(arg13)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg7), ivar26, arg13, "Iii"); + setScriptCallOnMousePressed(4715, new WidgetPointer(arg6), new WidgetPointer(arg7), new WidgetPointer(arg8), new WidgetPointer(arg5), ivar23, ivar24, svar0, arg13, "IIIIiisi"); + } + setScriptCallOnMouseEntered(1353, new WidgetPointer(arg7), ivar26, arg15, "Iii"); + ivar25 = add(ivar25, 1); + } + if (arg8 != -1) { + script_31(arg8, arg7, arg17, arg18, arg19, arg20, arg21, arg22); + } + return; +} diff --git a/dumps/scripts/471.cs2 b/dumps/scripts/471.cs2 new file mode 100644 index 000000000..3b9c25a7e --- /dev/null +++ b/dumps/scripts/471.cs2 @@ -0,0 +1,12 @@ +void script_471(int arg0,int arg1) { + if (getSkillActualLvl(15) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "A Herblore level of " + intToStr(25) + " is required." + ""); + return; + } + if (bitconfig_2086 < arg1) { + setWidgetText(new WidgetPointer(arg0), "" + intToStr(arg1) + " Commendations required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(arg1) + " Commendations."); + } + return; +} diff --git a/dumps/scripts/4710.cs2 b/dumps/scripts/4710.cs2 new file mode 100644 index 000000000..c93b3ad39 --- /dev/null +++ b/dumps/scripts/4710.cs2 @@ -0,0 +1,36 @@ +cs2func_script_4710_struct(2,0,0) script_4710(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11) { + int ivar12; + int ivar13; + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 5, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetSprite(arg6); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg2), 3, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + ivar12 = 1; + createExtraChild(new WidgetPointer(arg2), 5, ivar12); + setWidgetPosition(subtract(getWidgetActualWidth(new WidgetPointer(arg2)), 16), 0, 0, 0); + setWidgetSize(16, getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetSprite(arg7); + cs2method1107(0); + setScriptCallOnMouseEntered(1351, new WidgetPointer(arg2), ivar12, arg8, "Iid"); + setScriptCallOnMouseExit(1352, new WidgetPointer(arg2), ivar12, arg7, "Iid"); + ivar13 = getExtraChildGap(new WidgetPointer(arg2)); + setScriptCallOnMousePressed(4711, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), ivar12, "IIIIi"); + createExtraChild(new WidgetPointer(arg2), 4, ivar13); + setWidgetText(cs2method_3408(105, 115, arg0, arg1)); + setWidgetPosition(5, 0, 0, 0); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg2)), 22), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(arg11); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(arg9)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg2), ivar13, arg9, "Iii"); + setScriptCallOnMouseEntered(1353, new WidgetPointer(arg2), ivar13, arg10, "Iii"); + setScriptCallOnMousePressed(4711, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), ivar12, "IIIIi"); + return newstruct cs2func_script_4710_struct(ivar12, ivar13); +} diff --git a/dumps/scripts/4711.cs2 b/dumps/scripts/4711.cs2 new file mode 100644 index 000000000..51f9e09d4 --- /dev/null +++ b/dumps/scripts/4711.cs2 @@ -0,0 +1,8 @@ +void script_4711(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (isWidgetHidden(new WidgetPointer(arg1))) { + script_4712(arg0, arg1, arg2, arg3, arg4); + } else { + script_4714(arg0, arg1, arg2, arg3, arg4); + } + return; +} diff --git a/dumps/scripts/4712.cs2 b/dumps/scripts/4712.cs2 new file mode 100644 index 000000000..4bb61ba5b --- /dev/null +++ b/dumps/scripts/4712.cs2 @@ -0,0 +1,11 @@ +void script_4712(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (setWidgetRegister(new WidgetPointer(arg0), arg4)) { + setWidgetVFlip(1); + } + if (arg3 != -1) { + setWidgetIsHidden(false, new WidgetPointer(arg3)); + } + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/4713.cs2 b/dumps/scripts/4713.cs2 new file mode 100644 index 000000000..7ea0c6247 --- /dev/null +++ b/dumps/scripts/4713.cs2 @@ -0,0 +1,4 @@ +void script_4713(int arg0,int arg1) { + script_4716(38666248, 38666247, arg0, -5, 10, arg1); + return; +} diff --git a/dumps/scripts/4714.cs2 b/dumps/scripts/4714.cs2 new file mode 100644 index 000000000..09bad9955 --- /dev/null +++ b/dumps/scripts/4714.cs2 @@ -0,0 +1,11 @@ +void script_4714(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (setWidgetRegister(new WidgetPointer(arg0), arg4)) { + setWidgetVFlip(0); + } + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + if (arg3 != -1) { + setWidgetIsHidden(true, new WidgetPointer(arg3)); + } + return; +} diff --git a/dumps/scripts/4715.cs2 b/dumps/scripts/4715.cs2 new file mode 100644 index 000000000..d4b35e8cd --- /dev/null +++ b/dumps/scripts/4715.cs2 @@ -0,0 +1,9 @@ +void script_4715(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,string arg7) { + if (setWidgetRegister(new WidgetPointer(arg3), arg4)) { + setWidgetText(arg7); + setWidgetRGB(new Color(arg6)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg3), arg4, arg6, "Iii"); + } + script_4714(arg3, arg0, arg1, arg2, arg5); + return; +} diff --git a/dumps/scripts/4716.cs2 b/dumps/scripts/4716.cs2 new file mode 100644 index 000000000..98dcbf855 --- /dev/null +++ b/dumps/scripts/4716.cs2 @@ -0,0 +1,83 @@ +void script_4716(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + string svar0; + ivar6 = 48; + ivar7 = 48; + ivar8 = 0; + ivar9 = 0; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + svar0 = ""; + ivar13 = 1; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 1; + if (getWidgetScrollMaxH(new WidgetPointer(arg0)) > 0) { + ivar16 = getWidgetScrollMaxH(new WidgetPointer(arg0)); + } else { + ivar16 = getWidgetActualWidth(new WidgetPointer(arg0)); + } + ivar16 = divide(ivar16, add(ivar6, arg3)); + while (ivar8 < getCommonDefinitionSize(arg2)) { + ivar18 = 0; + ivar10 = cs2method_3408(105, 74, arg2, ivar8); + if (setWidgetRegister(new WidgetPointer(arg0), ivar8)) { + ivar13 = script_4718(ivar10); + if (((boolean)arg5)) { + ivar18 = 1; + } else if (((boolean)arg5)) { + if (((boolean)ivar13)) { + ivar18 = 1; + } + } else if (arg5 == getOtherCommonData(ivar10, 1422)) { + ivar18 = 1; + } else if (arg5 == getOtherCommonData(ivar10, 1423)) { + ivar18 = 1; + } else if (arg5 == getOtherCommonData(ivar10, 1424)) { + ivar18 = 1; + } else if (arg5 == getOtherCommonData(ivar10, 1425)) { + ivar18 = 1; + } else { + if (arg5 == getOtherCommonData(ivar10, 1426)) { + ivar18 = 1; + } + } + if (((boolean)ivar18)) { + setWidgetHidden(0); + ivar14 = multiply(add(ivar6, arg3), mod(ivar9, ivar16)); + ivar15 = multiply(divide(ivar9, ivar16), add(ivar7, arg4)); + setWidgetPosition(ivar14, ivar15, 0, 0); + ivar9 = add(ivar9, 1); + } else { + setWidgetHidden(1); + } + } + ivar8 = add(ivar8, 1); + } + if (add(add(arg4, ivar15), ivar7) > getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetScrollMax(0, add(ivar7, ivar15), new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/4717.cs2 b/dumps/scripts/4717.cs2 new file mode 100644 index 000000000..7c4c651a6 --- /dev/null +++ b/dumps/scripts/4717.cs2 @@ -0,0 +1,70 @@ +void script_4717(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + string svar0; + string svar1; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar4 = 48; + ivar5 = 48; + ivar6 = 0; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + svar0 = ""; + svar1 = ""; + ivar10 = 1; + ivar11 = -1; + ivar12 = 0; + setWidgetText(new WidgetPointer(590,20), "1"); + switch (arg3) { + case 3874: + ivar11 = 3873; + break; + default: + ivar11 = 3873; + } + while (ivar6 < getCommonDefinitionSize(arg3)) { + ivar7 = cs2method_3408(105, 74, arg3, ivar6); + ivar8 = getOtherCommonData(ivar7, 1420); + ivar10 = script_4718(ivar7); + svar0 = getOtherCommonData(ivar7, 1419); + createExtraChild(new WidgetPointer(arg0), 5, ivar6); + setWidgetSize(ivar4, ivar5, 0, 0); + setWidgetPosition(0, 0, 0, 0); + if (((boolean)ivar10)) { + ivar8 = getOtherCommonData(ivar7, 1421); + } + if (ivar7 == 1783) { + if (((int)IsFemale()) > 0) { + ivar7 = 1789; + ivar8 = getOtherCommonData(ivar7, 1420); + svar0 = getOtherCommonData(ivar7, 1419); + svar1 = "Curtsy"; + setWidgetContextMenuOption(1, "Curtsy"); + setWidgetContextMenuOption(2, "Bow"); + setScriptCallOnMouseOver(568, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(arg2), svar1, 25, 190, "IiIsii"); + } else { + setWidgetContextMenuOption(1, "Bow"); + setWidgetContextMenuOption(2, "Curtsy"); + svar1 = "Bow"; + setScriptCallOnMouseOver(568, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(arg2), svar1, 25, 190, "IiIsii"); + } + } else { + setWidgetContextMenuOption(1, svar0); + setScriptCallOnMouseOver(568, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(arg2), svar0, 25, 190, "IiIsii"); + } + setWidgetSprite(ivar8); + setScriptCallOnMouseExit(40, new WidgetPointer(arg2), "I"); + ivar6 = add(ivar6, 1); + } + script_4716(38666248, 38666247, arg3, -5, 10, ivar12); + script_4709(arg3, ivar11, ivar12, 0, getCommonDefinitionSize(ivar11), 38666254, 38666252, 38666253, 38666255, 897, 788, 788, 1040, 16777215, 16711680, 16776960, 494, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/4718.cs2 b/dumps/scripts/4718.cs2 new file mode 100644 index 000000000..0d2e4acc7 --- /dev/null +++ b/dumps/scripts/4718.cs2 @@ -0,0 +1,241 @@ +int script_4718(int arg0) { + switch (arg0) { + case 1817: + if (((boolean)bitconfig_1368)) { + return 0; + } + return 1; + case 1818: + if (((boolean)bitconfig_1369)) { + return 0; + } + return 1; + case 1819: + if (((boolean)bitconfig_1370)) { + return 0; + } + return 1; + case 1806: + if (((boolean)bitconfig_1367)) { + return 0; + } + return 1; + case 1832: + if (((boolean)bitconfig_1371)) { + return 0; + } + return 1; + case 1837: + if (((boolean)bitconfig_2310)) { + return 0; + } + return 1; + case 1839: + if (((boolean)bitconfig_2312)) { + return 0; + } + return 1; + case 1836: + if (((boolean)bitconfig_2309)) { + return 0; + } + return 1; + case 1838: + if (((boolean)bitconfig_2311)) { + return 0; + } + return 1; + case 1834: + if (((boolean)bitconfig_1921)) { + return 0; + } + return 1; + case 1833: + if (((boolean)bitconfig_1920)) { + return 0; + } + return 1; + case 1840: + if (((boolean)bitconfig_2055)) { + return 0; + } + return 1; + case 1855: + if (((boolean)bitconfig_2787)) { + return 0; + } + return 1; + case 1835: + if (bitconfig_4075 != 12) { + return 0; + } + return 1; + case 1841: + if (((boolean)bitconfig_4202)) { + return 0; + } + return 1; + case 1842: + if (((boolean)bitconfig_4394)) { + return 0; + } + return 1; + case 1843: + if (((boolean)bitconfig_4476)) { + return 0; + } + return 1; + case 1844: + if (((boolean)bitconfig_4884)) { + return 0; + } + return 1; + case 1845: + if (((boolean)bitconfig_5490)) { + return 0; + } + return 1; + case 1846: + if (((boolean)bitconfig_5732)) { + return 0; + } + return 1; + case 1847: + if (((boolean)bitconfig_5641)) { + return 0; + } + return 1; + case 1849: + if (((boolean)bitconfig_6936)) { + return 0; + } + return 1; + case 1850: + if (((boolean)bitconfig_6095)) { + return 0; + } + return 1; + case 1851: + if (bitconfig_8300 != 20) { + return 0; + } + return 1; + case 1852: + if (((boolean)bitconfig_8688)) { + return 0; + } + return 1; + case 1853: + if (bitconfig_8601 != 428) { + return 0; + } + return 1; + case 1830: + case 1831: + if (bitconfig_532 < 7) { + return 0; + } + return 1; + case 1848: + if (((bitconfig_6014 < 85) && (bitconfig_7322 < 18)) && ((boolean)bitconfig_9194)) { + return 0; + } + return 1; + case 1854: + if (((boolean)bitconfig_9194)) { + return 0; + } + return 1; + case 2658: + if (isBitFlagged(standart_config_2230, 0)) { + return 0; + } + return 1; + case 2654: + if (isBitFlagged(standart_config_2230, 1)) { + return 0; + } + return 1; + case 2651: + if (isBitFlagged(standart_config_2230, 2)) { + return 0; + } + return 1; + case 2652: + if (isBitFlagged(standart_config_2230, 3)) { + return 0; + } + return 1; + case 2657: + if (isBitFlagged(standart_config_2230, 4)) { + return 0; + } + return 1; + case 2661: + if (isBitFlagged(standart_config_2230, 5)) { + return 0; + } + return 1; + case 2653: + if (isBitFlagged(standart_config_2230, 6)) { + return 0; + } + return 1; + case 2650: + if (isBitFlagged(standart_config_2230, 7)) { + return 0; + } + return 1; + case 2659: + if (isBitFlagged(standart_config_2230, 8)) { + return 0; + } + return 1; + case 2660: + if (isBitFlagged(standart_config_2230, 9)) { + return 0; + } + return 1; + case 2655: + if (isBitFlagged(standart_config_2230, 10)) { + return 0; + } + return 1; + case 2656: + if (isBitFlagged(standart_config_2230, 11)) { + return 0; + } + return 1; + case 2662: + if (isBitFlagged(standart_config_2230, 12)) { + return 0; + } + return 1; + case 2663: + if (isBitFlagged(standart_config_2230, 13)) { + return 0; + } + return 1; + case 2664: + if (isBitFlagged(standart_config_2230, 14)) { + return 0; + } + return 1; + case 2665: + if (isBitFlagged(standart_config_2230, 15)) { + return 0; + } + return 1; + case 2666: + if (isBitFlagged(standart_config_2230, 16)) { + return 0; + } + return 1; + case 2667: + if (isBitFlagged(standart_config_2230, 17)) { + return 0; + } + return 1; + } + return 1; +} diff --git a/dumps/scripts/4719.cs2 b/dumps/scripts/4719.cs2 new file mode 100644 index 000000000..3c8345160 --- /dev/null +++ b/dumps/scripts/4719.cs2 @@ -0,0 +1,12 @@ +void script_4719(int arg0) { + if (arg0 == 40763415) { + setWidgetSprite(6359, new WidgetPointer(622,24)); + setWidgetSprite(6358, new WidgetPointer(622,25)); + setWidgetSprite(6360, new WidgetPointer(622,26)); + } else { + setWidgetSprite(6374, new WidgetPointer(622,29)); + setWidgetSprite(6373, new WidgetPointer(622,30)); + setWidgetSprite(6375, new WidgetPointer(622,31)); + } + return; +} diff --git a/dumps/scripts/472.cs2 b/dumps/scripts/472.cs2 new file mode 100644 index 000000000..cd7ce5acd --- /dev/null +++ b/dumps/scripts/472.cs2 @@ -0,0 +1,12 @@ +void script_472(int arg0,int arg1) { + if (getSkillActualLvl(14) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "A Mining level of " + intToStr(25) + " is required." + ""); + return; + } + if (bitconfig_2086 < arg1) { + setWidgetText(new WidgetPointer(arg0), "" + intToStr(arg1) + " Commendations required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(arg1) + " Commendations."); + } + return; +} diff --git a/dumps/scripts/4720.cs2 b/dumps/scripts/4720.cs2 new file mode 100644 index 000000000..8352e240c --- /dev/null +++ b/dumps/scripts/4720.cs2 @@ -0,0 +1,12 @@ +void script_4720(int arg0) { + if (arg0 == 40763415) { + setWidgetSprite(6356, new WidgetPointer(622,24)); + setWidgetSprite(6355, new WidgetPointer(622,25)); + setWidgetSprite(6357, new WidgetPointer(622,26)); + } else { + setWidgetSprite(6371, new WidgetPointer(622,29)); + setWidgetSprite(6370, new WidgetPointer(622,30)); + setWidgetSprite(6372, new WidgetPointer(622,31)); + } + return; +} diff --git a/dumps/scripts/4721.cs2 b/dumps/scripts/4721.cs2 new file mode 100644 index 000000000..07ab9ae5f --- /dev/null +++ b/dumps/scripts/4721.cs2 @@ -0,0 +1,33 @@ +cs2func_script_4721_struct(0,10,0) script_4721() { + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + string svar6; + string svar7; + string svar8; + string svar9; + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + svar4 = ""; + svar5 = ""; + svar6 = ""; + svar7 = ""; + svar8 = ""; + svar9 = ""; + svar0 = script_4345(clanbitconfig_25, clanbitconfig_26); + svar1 = script_4345(clanbitconfig_27, clanbitconfig_28); + svar2 = script_4345(clanbitconfig_29, clanbitconfig_30); + svar3 = script_4345(clanbitconfig_31, clanbitconfig_32); + svar4 = script_4345(clanbitconfig_33, clanbitconfig_34); + svar5 = script_4345(clanbitconfig_35, clanbitconfig_36); + svar6 = script_4345(clanbitconfig_37, clanbitconfig_38); + svar7 = script_4345(clanbitconfig_39, clanbitconfig_40); + svar8 = script_4345(clanbitconfig_41, clanbitconfig_42); + svar9 = script_4345(clanbitconfig_43, clanbitconfig_44); + return newstruct cs2func_script_4721_struct(svar0, svar1, svar2, svar3, svar4, svar5, svar6, svar7, svar8, svar9); +} diff --git a/dumps/scripts/4722.cs2 b/dumps/scripts/4722.cs2 new file mode 100644 index 000000000..9c9097e55 --- /dev/null +++ b/dumps/scripts/4722.cs2 @@ -0,0 +1,73 @@ +cs2func_script_4722_struct(1,1,0) script_4722(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + string svar0; + svar0 = ""; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + ivar27 = -1; + ivar28 = -1; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (((boolean)ivar26)) { + return newstruct cs2func_script_4722_struct(0, svar0); + } + return newstruct cs2func_script_4722_struct(1, svar0); +} diff --git a/dumps/scripts/4723.cs2 b/dumps/scripts/4723.cs2 new file mode 100644 index 000000000..852f874c4 --- /dev/null +++ b/dumps/scripts/4723.cs2 @@ -0,0 +1,47 @@ +cs2func_script_4723_struct(1,1,0) script_4723(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int stack_dump0; + int stack_dump1; + int stack_dump2; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = -1; + if (citadelConfigsInitialized()) { + stack_dump0 = 105; + stack_dump1 = 74; + stack_dump2 = 4013; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (((boolean)ivar12)) { + return newstruct cs2func_script_4723_struct(0, "Downgrading this building would violate the requirements for your citadel walls."); + } + return newstruct cs2func_script_4723_struct(1, ""); +} diff --git a/dumps/scripts/4724.cs2 b/dumps/scripts/4724.cs2 new file mode 100644 index 000000000..ec0d7a040 --- /dev/null +++ b/dumps/scripts/4724.cs2 @@ -0,0 +1,574 @@ +cs2func_script_4724_struct(6,0,0) script_4724(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + if (citadelConfigsInitialized()) { + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + switch (ivar3) { + case 21: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 22: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 23: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 24: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 25: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 26: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 27: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 28: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 31: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 32: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 33: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 34: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 35: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 41: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 42: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 43: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 44: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 45: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 51: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 100: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 101: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 102: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 103: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 104: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 105: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 106: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 107: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 108: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 109: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 110: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 111: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 112: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 113: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + } + ivar13 = 1; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = -1; + ivar27 = -1; + ivar28 = -1; + ivar29 = -1; + ivar28 = cs2method_3408(105, 103, 4043, ivar1); + if (ivar28 == -1) { + return newstruct cs2func_script_4724_struct(0, 0, 0, 0, 0, 0); + } + ivar29 = cs2method_3408(105, 103, ivar28, ivar2); + if (ivar29 == -1) { + return newstruct cs2func_script_4724_struct(0, 0, 0, 0, 0, 0); + } + while (ivar13 <= 3) { + ivar26 = cs2method_3408(105, 103, ivar29, ivar13); + if (ivar26 != -1) { + switch (ivar13) { + case 1: + ivar27 = cs2method_3408(105, 74, ivar26, ivar4); + break; + case 2: + ivar27 = cs2method_3408(105, 74, ivar26, ivar5); + break; + case 3: + ivar27 = cs2method_3408(105, 74, ivar26, ivar6); + } + if (ivar27 != -1) { + if (((boolean)getOtherCommonData(ivar27, 1571))) { + ivar14 = add(ivar14, getOtherCommonData(ivar27, 1573)); + } else if (getOtherCommonData(ivar27, 1571) == 2) { + ivar15 = add(ivar15, getOtherCommonData(ivar27, 1573)); + } else if (getOtherCommonData(ivar27, 1571) == 5) { + ivar16 = add(ivar16, getOtherCommonData(ivar27, 1573)); + } else if (getOtherCommonData(ivar27, 1571) == 9) { + ivar17 = add(ivar17, getOtherCommonData(ivar27, 1573)); + } else if (getOtherCommonData(ivar27, 1571) == 8) { + ivar18 = add(ivar18, getOtherCommonData(ivar27, 1573)); + } else { + if (getOtherCommonData(ivar27, 1571) == 7) { + ivar19 = add(ivar19, getOtherCommonData(ivar27, 1573)); + } + } + if (((boolean)getOtherCommonData(ivar27, 1575))) { + ivar14 = add(ivar14, getOtherCommonData(ivar27, 1577)); + } else if (getOtherCommonData(ivar27, 1575) == 2) { + ivar15 = add(ivar15, getOtherCommonData(ivar27, 1577)); + } else if (getOtherCommonData(ivar27, 1575) == 5) { + ivar16 = add(ivar16, getOtherCommonData(ivar27, 1577)); + } else if (getOtherCommonData(ivar27, 1575) == 9) { + ivar17 = add(ivar17, getOtherCommonData(ivar27, 1577)); + } else if (getOtherCommonData(ivar27, 1575) == 8) { + ivar18 = add(ivar18, getOtherCommonData(ivar27, 1577)); + } else { + if (getOtherCommonData(ivar27, 1575) == 7) { + ivar19 = add(ivar19, getOtherCommonData(ivar27, 1577)); + } + } + if (((boolean)getOtherCommonData(ivar27, 1579))) { + ivar14 = add(ivar14, getOtherCommonData(ivar27, 1581)); + } else if (getOtherCommonData(ivar27, 1579) == 2) { + ivar15 = add(ivar15, getOtherCommonData(ivar27, 1581)); + } else if (getOtherCommonData(ivar27, 1579) == 5) { + ivar16 = add(ivar16, getOtherCommonData(ivar27, 1581)); + } else if (getOtherCommonData(ivar27, 1579) == 9) { + ivar17 = add(ivar17, getOtherCommonData(ivar27, 1581)); + } else if (getOtherCommonData(ivar27, 1579) == 8) { + ivar18 = add(ivar18, getOtherCommonData(ivar27, 1581)); + } else { + if (getOtherCommonData(ivar27, 1579) == 7) { + ivar19 = add(ivar19, getOtherCommonData(ivar27, 1581)); + } + } + } + } + ivar26 = -1; + ivar13 = add(ivar13, 1); + } + ivar13 = 1; + if ((ivar7 == ivar1) && (ivar8 == ivar2)) { + ivar28 = cs2method_3408(105, 103, 4043, ivar7); + ivar29 = cs2method_3408(105, 103, ivar28, ivar8); + while (ivar13 <= 3) { + ivar26 = cs2method_3408(105, 103, ivar29, ivar13); + if (ivar26 != -1) { + switch (ivar13) { + case 1: + ivar27 = cs2method_3408(105, 74, ivar26, ivar10); + break; + case 2: + ivar27 = cs2method_3408(105, 74, ivar26, ivar11); + break; + case 3: + ivar27 = cs2method_3408(105, 74, ivar26, ivar12); + } + if (ivar27 != -1) { + if (((boolean)getOtherCommonData(ivar27, 1571))) { + ivar20 = add(ivar20, getOtherCommonData(ivar27, 1573)); + } else if (getOtherCommonData(ivar27, 1571) == 2) { + ivar21 = add(ivar21, getOtherCommonData(ivar27, 1573)); + } else if (getOtherCommonData(ivar27, 1571) == 5) { + ivar22 = add(ivar22, getOtherCommonData(ivar27, 1573)); + } else if (getOtherCommonData(ivar27, 1571) == 9) { + ivar23 = add(ivar23, getOtherCommonData(ivar27, 1573)); + } else if (getOtherCommonData(ivar27, 1571) == 8) { + ivar24 = add(ivar24, getOtherCommonData(ivar27, 1573)); + } else { + if (getOtherCommonData(ivar27, 1571) == 7) { + ivar25 = add(ivar25, getOtherCommonData(ivar27, 1573)); + } + } + if (((boolean)getOtherCommonData(ivar27, 1575))) { + ivar20 = add(ivar20, getOtherCommonData(ivar27, 1577)); + } else if (getOtherCommonData(ivar27, 1575) == 2) { + ivar21 = add(ivar21, getOtherCommonData(ivar27, 1577)); + } else if (getOtherCommonData(ivar27, 1575) == 5) { + ivar22 = add(ivar22, getOtherCommonData(ivar27, 1577)); + } else if (getOtherCommonData(ivar27, 1575) == 9) { + ivar23 = add(ivar23, getOtherCommonData(ivar27, 1577)); + } else if (getOtherCommonData(ivar27, 1575) == 8) { + ivar24 = add(ivar24, getOtherCommonData(ivar27, 1577)); + } else { + if (getOtherCommonData(ivar27, 1575) == 7) { + ivar25 = add(ivar25, getOtherCommonData(ivar27, 1577)); + } + } + if (((boolean)getOtherCommonData(ivar27, 1579))) { + ivar20 = add(ivar20, getOtherCommonData(ivar27, 1581)); + } else if (getOtherCommonData(ivar27, 1579) == 2) { + ivar21 = add(ivar21, getOtherCommonData(ivar27, 1581)); + } else if (getOtherCommonData(ivar27, 1579) == 5) { + ivar22 = add(ivar22, getOtherCommonData(ivar27, 1581)); + } else if (getOtherCommonData(ivar27, 1579) == 9) { + ivar23 = add(ivar23, getOtherCommonData(ivar27, 1581)); + } else if (getOtherCommonData(ivar27, 1579) == 8) { + ivar24 = add(ivar24, getOtherCommonData(ivar27, 1581)); + } else { + if (getOtherCommonData(ivar27, 1579) == 7) { + ivar25 = add(ivar25, getOtherCommonData(ivar27, 1581)); + } + } + } + } + ivar26 = -1; + ivar13 = add(ivar13, 1); + } + } + ivar14 = max(0, subtract(ivar14, ivar20)); + ivar15 = max(0, subtract(ivar15, ivar21)); + ivar16 = max(0, subtract(ivar16, ivar22)); + ivar17 = max(0, subtract(ivar17, ivar23)); + ivar18 = max(0, subtract(ivar18, ivar24)); + ivar19 = max(0, subtract(ivar19, ivar25)); + return newstruct cs2func_script_4724_struct(ivar14, ivar15, ivar16, ivar17, ivar18, ivar19); +} diff --git a/dumps/scripts/4725.cs2 b/dumps/scripts/4725.cs2 new file mode 100644 index 000000000..7d35a26a3 --- /dev/null +++ b/dumps/scripts/4725.cs2 @@ -0,0 +1,86 @@ +void script_4725() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + string svar0; + ivar0 = 20316177; + ivar1 = 20316179; + ivar2 = 20316171; + ivar3 = 20316172; + ivar4 = 20316174; + ivar5 = 20316173; + ivar6 = 20316178; + svar0 = ""; + deleteAllExtraChilds(new WidgetPointer(ivar2)); + deleteAllExtraChilds(new WidgetPointer(ivar5)); + ivar7 = 15; + ivar8 = 1; + ivar9 = 0; + ivar10 = -1; + ivar11 = -1; + while (ivar8 <= 15) { + ivar9 = getExtraChildGap(new WidgetPointer(ivar2)); + createExtraChild(new WidgetPointer(ivar2), 4, ivar9); + setWidgetSize(5, ivar7, 1, 0); + setWidgetPosition(5, multiply(ivar9, ivar7), 0, 0); + setWidgetText(script_5329(ivar8)); + setWidgetFont(3793); + setWidgetRGB(new Color(190, 178, 140)); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + ivar10 = 7715; + ivar11 = 7716; + createExtraChild(new WidgetPointer(ivar5), 5, ivar9); + setWidgetSprite(ivar10); + setWidgetContextMenuOption(1, "Target"); + setWidgetSize(12, 13, 0, 0); + setWidgetPosition(18, add(1, multiply(ivar9, ivar7)), 2, 0); + setScriptCallOnMouseEntered(5336, new WidgetPointer(-32768,3), -2147483643, ivar11, "Iid"); + setScriptCallOnMouseExit(5336, new WidgetPointer(-32768,3), -2147483643, ivar10, "Iid"); + cs2method1306("Add Actor"); + cs2method1308(176, -1); + createExtraChild(new WidgetPointer(ivar6), 3, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetSize(12, 13, 0, 0); + setWidgetPosition(18, add(1, multiply(ivar9, ivar7)), 2, 0); + svar0 = "Add someone to the actor list. Click this, then click on the person you would like to add."; + setScriptCallOnMouseOver(4538, new WidgetPointer(310,26), new WidgetPointer(-32768,3), -2147483643, svar0, 90, 3793, 3793, 16777215, 13, 4, 3, -2147483647, -2147483646, "IIisifdiiiiii"); + setScriptCallOnMouseExit(40, new WidgetPointer(310,26), "I"); + ivar10 = 7718; + ivar11 = 7719; + createExtraChild(new WidgetPointer(ivar4), 5, ivar9); + setWidgetSprite(ivar10); + setWidgetContextMenuOption(1, "Remove"); + setWidgetSize(12, 13, 0, 0); + setWidgetPosition(3, add(1, multiply(ivar9, ivar7)), 2, 0); + setScriptCallOnMouseEntered(5336, new WidgetPointer(-32768,3), -2147483643, ivar11, "Iid"); + setScriptCallOnMouseExit(5336, new WidgetPointer(-32768,3), -2147483643, ivar10, "Iid"); + createExtraChild(new WidgetPointer(ivar6), 3, getExtraChildGap(new WidgetPointer(ivar6))); + setWidgetSize(12, 13, 0, 0); + setWidgetPosition(3, add(1, multiply(ivar9, ivar7)), 2, 0); + svar0 = "Add someone to the actor list. Click this, then click on the person you would like to add."; + svar0 = "Remove this person from the actor list."; + setScriptCallOnMouseOver(4538, new WidgetPointer(310,26), new WidgetPointer(-32768,3), -2147483643, svar0, 90, 3793, 3793, 16777215, 13, 4, 3, -2147483647, -2147483646, "IIisifdiiiiii"); + setScriptCallOnMouseExit(40, new WidgetPointer(310,26), "I"); + ivar8 = add(ivar8, 1); + } + if (((boolean)globalint_1606)) { + ivar10 = 6009; + ivar11 = 6010; + } else { + ivar10 = 6004; + ivar11 = 6005; + } + setWidgetSprite(ivar10, new WidgetPointer(310,20)); + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar11, "Id", new WidgetPointer(310,20)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar10, "Id", new WidgetPointer(310,20)); + return; +} diff --git a/dumps/scripts/4726.cs2 b/dumps/scripts/4726.cs2 new file mode 100644 index 000000000..57bbf6f1c --- /dev/null +++ b/dumps/scripts/4726.cs2 @@ -0,0 +1,234 @@ +cs2func_script_4726_struct(5,0,0) script_4726(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + string svar0; + string svar1; + string svar2; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + int stack_dump8; + int stack_dump9; + int stack_dump10; + cs2func_script_5351_struct(5,0,0) structdump_11; + flow_0: + ivar11 = 74907707; + ivar12 = 0; + ivar13 = -1; + svar0 = ""; + ivar14 = 0; + globalarray_0 = new int[getCommonDefinitionSize(arg0)]; + ivar15 = 0; + ivar16 = -1; + ivar17 = 0; + while (ivar17 < getCommonDefinitionSize(arg0)) { + globalarray_0[ivar17] = cs2method_3408(105, 74, arg0, ivar17); + ivar17 = add(ivar17, 1); + } + ivar17 = 0; + ivar15 = 1; + ivar18 = 0; + ivar19 = 0; + svar1 = ""; + svar2 = ""; + ivar20 = 0; + ivar21 = 0; + SWITCH (globalint_1659) { + case 1: + GOTO flow_18 + case 2: + GOTO flow_32 + case 3: + GOTO flow_61 + } + while (((boolean)ivar15)) { + ivar15 = 0; + ivar17 = subtract(getCommonDefinitionSize(arg0), 1); + while (ivar17 > 0) { + if (getOtherCommonData(globalarray_0[ivar17], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar17], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar17], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1932); + } + if (ivar18 < ivar19) { + ivar15 = 1; + ivar16 = globalarray_0[subtract(ivar17, 1)]; + globalarray_0[subtract(ivar17, 1)] = globalarray_0[ivar17]; + globalarray_0[ivar17] = ivar16; + } + ivar17 = subtract(ivar17, 1); + } + } + flow_17: + GOTO flow_89 + flow_18: + IF (((boolean)ivar15)) + GOTO flow_19 + GOTO flow_31 + flow_19: + ivar15 = 0; + ivar17 = subtract(getCommonDefinitionSize(arg0), 1); + while (ivar17 > 0) { + if (getOtherCommonData(globalarray_0[ivar17], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar17], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar17], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1932); + } + if (ivar18 > ivar19) { + ivar15 = 1; + ivar16 = globalarray_0[subtract(ivar17, 1)]; + globalarray_0[subtract(ivar17, 1)] = globalarray_0[ivar17]; + globalarray_0[ivar17] = ivar16; + } + ivar17 = subtract(ivar17, 1); + } + GOTO flow_18 + flow_31: + GOTO flow_89 + flow_32: + IF (((boolean)ivar15)) + GOTO flow_33 + GOTO flow_60 + flow_33: + ivar15 = 0; + ivar17 = subtract(getCommonDefinitionSize(arg0), 1); + while (ivar17 > 0) { + if (getOtherCommonData(globalarray_0[ivar17], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[ivar17]) { + if (IsFemale()) { + svar1 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar1 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[subtract(ivar17, 1)]) { + if (IsFemale()) { + svar2 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar2 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar1 = getOtherCommonData(globalarray_0[ivar17], 1930); + svar2 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1930); + } + if (stringMethod4107(svar1, svar2) < 0) { + ivar15 = 1; + ivar16 = globalarray_0[subtract(ivar17, 1)]; + globalarray_0[subtract(ivar17, 1)] = globalarray_0[ivar17]; + globalarray_0[ivar17] = ivar16; + } + ivar17 = subtract(ivar17, 1); + } + GOTO flow_32 + flow_60: + GOTO flow_89 + flow_61: + IF (((boolean)ivar15)) + GOTO flow_62 + GOTO flow_89 + flow_62: + ivar15 = 0; + ivar17 = subtract(getCommonDefinitionSize(arg0), 1); + while (ivar17 > 0) { + if (getOtherCommonData(globalarray_0[ivar17], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[ivar17]) { + if (IsFemale()) { + svar1 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar1 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[subtract(ivar17, 1)]) { + if (IsFemale()) { + svar2 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar2 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar1 = getOtherCommonData(globalarray_0[ivar17], 1930); + svar2 = getOtherCommonData(globalarray_0[subtract(ivar17, 1)], 1930); + } + if (stringMethod4107(svar1, svar2) > 0) { + ivar15 = 1; + ivar16 = globalarray_0[subtract(ivar17, 1)]; + globalarray_0[subtract(ivar17, 1)] = globalarray_0[ivar17]; + globalarray_0[ivar17] = ivar16; + } + ivar17 = subtract(ivar17, 1); + } + GOTO flow_61 + flow_89: + ivar17 = 0; + while (ivar17 < getCommonDefinitionSize(arg0)) { + ivar13 = globalarray_0[ivar17]; + stack_dump0 = ivar13; + stack_dump1 = arg1; + stack_dump2 = arg2; + stack_dump3 = arg3; + stack_dump4 = arg4; + stack_dump5 = arg5; + stack_dump6 = arg6; + stack_dump7 = arg7; + stack_dump8 = arg8; + stack_dump9 = arg9; + stack_dump10 = arg10; + structdump_11 = script_5351(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9, stack_dump10); + arg6 = structdump_11.intpart_4; + arg4 = structdump_11.intpart_3; + arg3 = structdump_11.intpart_2; + arg2 = structdump_11.intpart_1; + arg1 = structdump_11.intpart_0; + ivar17 = add(ivar17, 1); + } + return newstruct cs2func_script_4726_struct(arg1, arg2, arg3, arg4, arg6); +} diff --git a/dumps/scripts/4727.cs2 b/dumps/scripts/4727.cs2 new file mode 100644 index 000000000..487c89b1f --- /dev/null +++ b/dumps/scripts/4727.cs2 @@ -0,0 +1,353 @@ +cs2func_script_4727_struct(5,0,0) script_4727(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9) { + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + string svar0; + string svar1; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + int stack_dump8; + int stack_dump9; + int stack_dump10; + cs2func_script_5351_struct(5,0,0) structdump_11; + flow_0: + ivar10 = -1; + ivar11 = -1; + ivar12 = 0; + ivar13 = -1; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + while (ivar16 < 5) { + switch (ivar16) { + case 0: + ivar10 = 5182; + break; + case 1: + ivar10 = 3875; + break; + case 2: + if (IsFemale()) { + ivar10 = 5189; + } else { + ivar10 = 5188; + } + break; + case 3: + ivar10 = 5184; + break; + case 4: + ivar10 = 5183; + } + ivar14 = 0; + while (ivar14 < getCommonDefinitionSize(ivar10)) { + switch (ivar16) { + case 0: + if (isBitFlagged(standart_config_2391, ivar14)) { + ivar15 = add(ivar15, 1); + } + break; + case 1: + if (isBitFlagged(standart_config_2392, ivar14)) { + ivar15 = add(ivar15, 1); + } + break; + case 2: + if (isBitFlagged(standart_config_2393, ivar14)) { + ivar15 = add(ivar15, 1); + } + break; + case 3: + if (isBitFlagged(standart_config_2394, ivar14)) { + ivar15 = add(ivar15, 1); + } + break; + case 4: + if (isBitFlagged(standart_config_2394, add(ivar14, 16))) { + ivar15 = add(ivar15, 1); + } + } + ivar14 = add(ivar14, 1); + } + ivar16 = add(ivar16, 1); + } + if (ivar15 < 1) { + return newstruct cs2func_script_4727_struct(arg0, arg1, arg2, arg3, arg5); + } + globalarray_0 = new int[ivar15]; + ivar17 = subtract(ivar15, 1); + ivar16 = 0; + while (ivar16 < 5) { + switch (ivar16) { + case 0: + ivar10 = 5182; + break; + case 1: + ivar10 = 3875; + break; + case 2: + if (IsFemale()) { + ivar10 = 5189; + } else { + ivar10 = 5188; + } + break; + case 3: + ivar10 = 5184; + break; + case 4: + ivar10 = 5183; + } + ivar14 = 0; + while (ivar14 < getCommonDefinitionSize(ivar10)) { + ivar11 = cs2method_3408(105, 74, ivar10, ivar14); + switch (ivar16) { + case 0: + if (isBitFlagged(standart_config_2391, ivar14)) { + globalarray_0[ivar17] = ivar11; + ivar17 = max(subtract(ivar17, 1), 0); + } + break; + case 1: + if (isBitFlagged(standart_config_2392, ivar14)) { + globalarray_0[ivar17] = ivar11; + ivar17 = max(subtract(ivar17, 1), 0); + } + break; + case 2: + if (isBitFlagged(standart_config_2393, ivar14)) { + globalarray_0[ivar17] = ivar11; + ivar17 = max(subtract(ivar17, 1), 0); + } + break; + case 3: + if (isBitFlagged(standart_config_2394, ivar14)) { + globalarray_0[ivar17] = ivar11; + ivar17 = max(subtract(ivar17, 1), 0); + } + break; + case 4: + if (isBitFlagged(standart_config_2394, add(ivar14, 16))) { + globalarray_0[ivar17] = ivar11; + ivar17 = max(subtract(ivar17, 1), 0); + } + } + ivar14 = add(ivar14, 1); + } + ivar16 = add(ivar16, 1); + } + ivar14 = 0; + ivar12 = 1; + ivar18 = 0; + ivar19 = 0; + svar0 = ""; + svar1 = ""; + ivar20 = 0; + ivar21 = 0; + SWITCH (globalint_1659) { + case 1: + GOTO flow_77 + case 2: + GOTO flow_91 + case 3: + GOTO flow_123 + } + while (((boolean)ivar12)) { + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1932); + } + if (ivar18 < ivar19) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + } + flow_76: + GOTO flow_154 + flow_77: + IF (((boolean)ivar12)) + GOTO flow_78 + GOTO flow_90 + flow_78: + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1932); + } + if (ivar18 > ivar19) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + GOTO flow_77 + flow_90: + GOTO flow_154 + flow_91: + IF (((boolean)ivar12)) + GOTO flow_92 + GOTO flow_122 + flow_92: + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[ivar14]) { + if (IsFemale()) { + svar0 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar0 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar0 = getOtherCommonData(globalarray_0[ivar14], 1930); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[subtract(ivar14, 1)]) { + if (IsFemale()) { + svar1 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar1 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar1 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1930); + } + if (stringMethod4107(svar0, svar1) < 0) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + GOTO flow_91 + flow_122: + GOTO flow_154 + flow_123: + IF (((boolean)ivar12)) + GOTO flow_124 + GOTO flow_154 + flow_124: + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[ivar14]) { + if (IsFemale()) { + svar0 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar0 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar0 = getOtherCommonData(globalarray_0[ivar14], 1930); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[subtract(ivar14, 1)]) { + if (IsFemale()) { + svar1 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar1 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar1 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1930); + } + if (stringMethod4107(svar0, svar1) > 0) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + GOTO flow_123 + flow_154: + ivar14 = 0; + while (ivar14 < ivar15) { + ivar11 = globalarray_0[ivar14]; + stack_dump0 = ivar11; + stack_dump1 = arg0; + stack_dump2 = arg1; + stack_dump3 = arg2; + stack_dump4 = arg3; + stack_dump5 = arg4; + stack_dump6 = arg5; + stack_dump7 = arg6; + stack_dump8 = arg7; + stack_dump9 = arg8; + stack_dump10 = arg9; + structdump_11 = script_5351(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9, stack_dump10); + arg5 = structdump_11.intpart_4; + arg3 = structdump_11.intpart_3; + arg2 = structdump_11.intpart_2; + arg1 = structdump_11.intpart_1; + arg0 = structdump_11.intpart_0; + ivar14 = add(ivar14, 1); + } + return newstruct cs2func_script_4727_struct(arg0, arg1, arg2, arg3, arg5); +} diff --git a/dumps/scripts/4728.cs2 b/dumps/scripts/4728.cs2 new file mode 100644 index 000000000..4ba0514e2 --- /dev/null +++ b/dumps/scripts/4728.cs2 @@ -0,0 +1,16 @@ +void script_4728(int arg0) { + if (citadelConfigsInitialized()) { + script_4896(); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + messageType0("Clan stronghold information not yet available."); + return; +} diff --git a/dumps/scripts/4729.cs2 b/dumps/scripts/4729.cs2 new file mode 100644 index 000000000..d83064ea9 --- /dev/null +++ b/dumps/scripts/4729.cs2 @@ -0,0 +1,79 @@ +cs2func_script_4729_struct(0,8,0) script_4729() { + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + string svar6; + string svar7; + flow_0: + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + svar4 = ""; + svar5 = ""; + svar6 = ""; + svar7 = ""; + SWITCH (getLanguage()) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + } + svar0 = "/p"; + svar1 = "/c"; + svar2 = "/f"; + svar3 = "/g"; + svar4 = "\\p"; + svar5 = "\\c"; + svar6 = "\\f"; + svar7 = "\\g"; + GOTO flow_5 + flow_1: + svar0 = "/a"; + svar1 = "/c"; + svar2 = "/f"; + svar3 = "/g"; + svar4 = "\\a"; + svar5 = "\\c"; + svar6 = "\\f"; + svar7 = "\\g"; + GOTO flow_5 + flow_2: + svar0 = "/p"; + svar1 = "/c"; + svar2 = "/a"; + svar3 = "/i"; + svar4 = "\\p"; + svar5 = "\\c"; + svar6 = "\\a"; + svar7 = "\\i"; + GOTO flow_5 + flow_3: + svar0 = "/p"; + svar1 = "/c"; + svar2 = "/f"; + svar3 = "/g"; + svar4 = "\\p"; + svar5 = "\\c"; + svar6 = "\\f"; + svar7 = "\\g"; + GOTO flow_5 + flow_4: + svar0 = "/p"; + svar1 = "/c"; + svar2 = "/f"; + svar3 = "/g"; + svar4 = "\\p"; + svar5 = "\\c"; + svar6 = "\\f"; + svar7 = "\\g"; + flow_5: + return newstruct cs2func_script_4729_struct(svar0, svar4, svar1, svar5, svar2, svar6, svar3, svar7); +} diff --git a/dumps/scripts/473.cs2 b/dumps/scripts/473.cs2 new file mode 100644 index 000000000..1b8c43cf1 --- /dev/null +++ b/dumps/scripts/473.cs2 @@ -0,0 +1,12 @@ +void script_473(int arg0,int arg1) { + if (getSkillActualLvl(19) < 25) { + setWidgetText(new WidgetPointer(arg0), "" + "A Farming level of " + intToStr(25) + " is required." + ""); + return; + } + if (bitconfig_2086 < arg1) { + setWidgetText(new WidgetPointer(arg0), "" + intToStr(arg1) + " Commendations required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(arg1) + " Commendations."); + } + return; +} diff --git a/dumps/scripts/4730.cs2 b/dumps/scripts/4730.cs2 new file mode 100644 index 000000000..fd2217928 --- /dev/null +++ b/dumps/scripts/4730.cs2 @@ -0,0 +1,115 @@ +int script_4730(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + if (strLength(globalstring_1) >= 3) { + if (((boolean)stringMethod4107(substr(0, 3, globalstring_1), "///"))) { + if (arg0 >= 0) { + if (arg1 >= arg2) { + cs2method5006(3); + globalstring_1 = substr(3, strLength(globalstring_1), globalstring_1); + if (stringMethod4107(globalstring_1, "") != 0) { + cs2method5008(globalstring_1); + } + cs2method5006(globalint_1651); + return 1; + } + message(43, 0, "Guests cannot chat in this Clan Chat channel."); + globalstring_1 = ""; + globalint_1028 = 0; + script_1558(0); + return 1; + } + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't a guest in a visited Clan Chat channel."); + globalstring_1 = ""; + globalint_1028 = 0; + return 1; + } + if (((boolean)stringMethod4107(substr(0, 2, globalstring_1), "//"))) { + if (arg3 >= 0) { + if (arg4 >= arg5) { + cs2method5006(2); + globalstring_1 = substr(2, strLength(globalstring_1), globalstring_1); + if (stringMethod4107(globalstring_1, "") != 0) { + cs2method5008(globalstring_1); + } + cs2method5006(globalint_1651); + return 1; + } + message(43, 0, "Your rank is not high enough to talk in your clan chat."); + globalstring_1 = ""; + globalint_1028 = 0; + script_1558(0); + return 1; + } + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Clan Chat channel."); + globalstring_1 = ""; + globalint_1028 = 0; + return 1; + } + if (((boolean)stringMethod4107(substr(0, 1, globalstring_1), "/"))) { + cs2method5006(1); + globalstring_1 = substr(1, strLength(globalstring_1), globalstring_1); + if (stringMethod4107(globalstring_1, "") != 0) { + cs2method5008(globalstring_1); + } + cs2method5006(globalint_1651); + return 1; + } + } else if (strLength(globalstring_1) >= 2) { + if (((boolean)stringMethod4107(substr(0, 2, globalstring_1), "//"))) { + if (arg3 >= 0) { + if (arg4 >= arg5) { + cs2method5006(2); + globalstring_1 = substr(2, strLength(globalstring_1), globalstring_1); + if (stringMethod4107(globalstring_1, "") != 0) { + cs2method5008(globalstring_1); + } + cs2method5006(globalint_1651); + return 1; + } + message(43, 0, "Your rank is not high enough to talk in your clan chat."); + globalstring_1 = ""; + globalint_1028 = 0; + script_1558(0); + return 1; + } + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Clan Chat channel."); + globalstring_1 = ""; + globalint_1028 = 0; + return 1; + } + if (((boolean)stringMethod4107(substr(0, 1, globalstring_1), "/"))) { + cs2method5006(1); + globalstring_1 = substr(1, strLength(globalstring_1), globalstring_1); + if (stringMethod4107(globalstring_1, "") != 0) { + cs2method5008(globalstring_1); + } + cs2method5006(globalint_1651); + return 1; + } + } else { + if ((strLength(globalstring_1) >= 1) && ((boolean)stringMethod4107(substr(0, 1, globalstring_1), "/"))) { + cs2method5006(1); + globalstring_1 = substr(1, strLength(globalstring_1), globalstring_1); + if (stringMethod4107(globalstring_1, "") != 0) { + cs2method5008(globalstring_1); + } + cs2method5006(globalint_1651); + return 1; + } + } + return 0; +} diff --git a/dumps/scripts/4731.cs2 b/dumps/scripts/4731.cs2 new file mode 100644 index 000000000..b2ffe1d25 --- /dev/null +++ b/dumps/scripts/4731.cs2 @@ -0,0 +1,23 @@ +void script_4731(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + pressedButtons(3,0,0) structdump_0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + structdump_0 = getPressedMouseButtons(); + ivar4 = structdump_0.intpart_2; + ivar3 = structdump_0.intpart_1; + ivar2 = structdump_0.intpart_0; + ivar5 = add(cameraGetHrot(), multiply(subtract(globalint_1653, arg0), 2)); + ivar6 = subtract(cameraGetVrot(), subtract(globalint_1654, arg1)); + if ((((boolean)ivar3) && (globalint_173 != 1)) && ((bitconfig_542 != 1) && minimapSettingIs1())) { + cameraMethod5504(ivar6, ivar5); + } + globalint_1653 = arg0; + globalint_1654 = arg1; + return; +} diff --git a/dumps/scripts/4732.cs2 b/dumps/scripts/4732.cs2 new file mode 100644 index 000000000..5ffec65c5 --- /dev/null +++ b/dumps/scripts/4732.cs2 @@ -0,0 +1,8 @@ +void script_4732(int arg0,int arg1) { + if (isBitFlagged(standart_config_2396, arg1)) { + setWidgetSprite(6004, new WidgetPointer(arg0)); + } else { + setWidgetSprite(6011, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4733.cs2 b/dumps/scripts/4733.cs2 new file mode 100644 index 000000000..fa90540ca --- /dev/null +++ b/dumps/scripts/4733.cs2 @@ -0,0 +1,41 @@ +int script_4733(int arg0) { + int ivar1; + int ivar2; + ivar1 = divide(arg0, 32); + ivar2 = mod(arg0, 32); + switch (ivar1) { + case 0: + return isBitFlagged(globalint_700, ivar2); + case 1: + return isBitFlagged(globalint_701, ivar2); + case 2: + return isBitFlagged(globalint_702, ivar2); + case 3: + return isBitFlagged(globalint_703, ivar2); + case 4: + return isBitFlagged(globalint_704, ivar2); + case 5: + return isBitFlagged(globalint_705, ivar2); + case 6: + return isBitFlagged(globalint_706, ivar2); + case 7: + return isBitFlagged(globalint_707, ivar2); + case 8: + return isBitFlagged(globalint_708, ivar2); + case 9: + return isBitFlagged(globalint_709, ivar2); + case 10: + return isBitFlagged(globalint_710, ivar2); + case 11: + return isBitFlagged(globalint_711, ivar2); + case 12: + return isBitFlagged(globalint_712, ivar2); + case 13: + return isBitFlagged(globalint_713, ivar2); + case 14: + return isBitFlagged(globalint_714, ivar2); + case 15: + return isBitFlagged(globalint_715, ivar2); + } + return 0; +} diff --git a/dumps/scripts/4734.cs2 b/dumps/scripts/4734.cs2 new file mode 100644 index 000000000..02f3978d3 --- /dev/null +++ b/dumps/scripts/4734.cs2 @@ -0,0 +1,5 @@ +void script_4734() { + script_4736(74973184, 74973185); + script_4738(74973184, 74973185); + return; +} diff --git a/dumps/scripts/4735.cs2 b/dumps/scripts/4735.cs2 new file mode 100644 index 000000000..8488b8c3c --- /dev/null +++ b/dumps/scripts/4735.cs2 @@ -0,0 +1,4 @@ +void script_4735(int arg0,int arg1) { + script_4736(arg0, arg1); + return; +} diff --git a/dumps/scripts/4736.cs2 b/dumps/scripts/4736.cs2 new file mode 100644 index 000000000..3a3c479d2 --- /dev/null +++ b/dumps/scripts/4736.cs2 @@ -0,0 +1,24 @@ +void script_4736(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = getItemContainerLength(95); + ivar3 = -1; + if (bitconfig_9903 > 0) { + ivar3 = cs2method_3408(105, 118, 3879, bitconfig_9903); + if (ivar3 != -1) { + ivar2 = getItemContainerLength(ivar3); + } + } + cs2method2100(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar4 = 0; + while (ivar4 < ivar2) { + createExtraChild(new WidgetPointer(arg0), 5, ivar4); + setWidgetSize(0, 0, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetHidden(1); + ivar4 = add(ivar4, 1); + } + return; +} diff --git a/dumps/scripts/4737.cs2 b/dumps/scripts/4737.cs2 new file mode 100644 index 000000000..69d0dfbc4 --- /dev/null +++ b/dumps/scripts/4737.cs2 @@ -0,0 +1,8 @@ +void script_4737(int arg0) { + if (setWidgetRegister(new WidgetPointer(1144,0), 0)) { + script_4738(74973184, 74973185); + } + setWidgetIsHidden(true, new WidgetPointer(1144,45)); + setWidgetIsHidden(true, new WidgetPointer(1144,9)); + return; +} diff --git a/dumps/scripts/4738.cs2 b/dumps/scripts/4738.cs2 new file mode 100644 index 000000000..6e268922c --- /dev/null +++ b/dumps/scripts/4738.cs2 @@ -0,0 +1,73 @@ +void script_4738(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + ivar2 = divide(36, 4); + ivar3 = 0; + ivar4 = -1; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = cs2method_3408(105, 118, 3879, bitconfig_9903); + ivar9 = 0; + while (ivar3 < getItemContainerLength(ivar8)) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar3)) { + ivar4 = getItemIdInSlot(ivar8, ivar3); + ivar5 = getItemAmtInContainer(ivar8, ivar4); + if (((ivar4 != -1) && ((boolean)script_4733(ivar3))) && (ivar5 > 0)) { + ivar9 = add(ivar9, ivar5); + if (add(ivar7, 36) >= getWidgetActualWidth(new WidgetPointer(arg0))) { + ivar7 = 0; + ivar6 = add(add(ivar6, ivar2), 36); + } + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(ivar7, ivar6, 0, 0); + setWidgetHidden(0); + setItemOnWidgetMethod1200(ivar4, ivar5); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + setWidgetContextMenuOption(1, "Delete"); + setWidgetContextMenuOption(10, "Examine"); + cs2method1305("" + getItemName(ivar4)); + ivar7 = add(add(ivar7, ivar2), 36); + setScriptCallOnClickContextMenu(4739, new WidgetPointer(-32768,3), -2147483643, -2147483644, "Iii"); + setScriptCallOnMouseEntered(4745, new WidgetPointer(-32768,3), -2147483643, "Ii"); + setScriptCallOnMouseExit(4746, new WidgetPointer(-32768,3), -2147483643, "Ii"); + } else { + setWidgetSize(0, 0, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetHidden(1); + setScriptCallOnClickContextMenu(-1, ""); + } + } + ivar3 = add(ivar3, 1); + } + ivar10 = 0; + if (((boolean)ivar9)) { + ivar10 = 1; + } + setWidgetText(new WidgetPointer(1144,22), "Found " + "" + intToStr(ivar9) + "" + " " + chooseString(ivar10, "item", "items") + " of junk in your " + cs2method_3408(118, 115, 3882, ivar8)); + if (ivar7 > 0) { + ivar6 = add(ivar6, 32); + } + if (ivar6 > getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetScrollMax(0, ivar6, new WidgetPointer(arg0)); + setWidgetPosition(-8, getWidgetActualY(new WidgetPointer(arg0)), 1, 0, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + if (setWidgetRegister(new WidgetPointer(arg1), 1)) { + script_37(arg1, arg0, cs2method2601(new WidgetPointer(arg0)), 1); + } + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + setWidgetPosition(0, getWidgetActualY(new WidgetPointer(arg0)), 1, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4739.cs2 b/dumps/scripts/4739.cs2 new file mode 100644 index 000000000..fcda2ab53 --- /dev/null +++ b/dumps/scripts/4739.cs2 @@ -0,0 +1,19 @@ +void script_4739(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + ivar3 = 0; + ivar4 = -1; + ivar5 = -1; + if (bitconfig_9903 != 0) { + ivar5 = cs2method_3408(105, 118, 3879, bitconfig_9903); + if (((boolean)arg2) && setWidgetRegister(new WidgetPointer(1144,0), arg1)) { + ivar4 = getItemIdInSlot(ivar5, arg1); + if (ivar4 != -1) { + bitconfig_9904 = arg1; + script_4741(); + } + } + } + return; +} diff --git a/dumps/scripts/474.cs2 b/dumps/scripts/474.cs2 new file mode 100644 index 000000000..c76774c6b --- /dev/null +++ b/dumps/scripts/474.cs2 @@ -0,0 +1,12 @@ +void script_474(int arg0,int arg1) { + if (bitconfig_4302 < 110) { + setWidgetText(new WidgetPointer(arg0), "" + "Completion of Wolf Whistle required." + ""); + return; + } + if (bitconfig_2086 < arg1) { + setWidgetText(new WidgetPointer(arg0), "" + intToStr(arg1) + " Commendations required." + ""); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(arg1) + " Commendations."); + } + return; +} diff --git a/dumps/scripts/4740.cs2 b/dumps/scripts/4740.cs2 new file mode 100644 index 000000000..cebc07e8a --- /dev/null +++ b/dumps/scripts/4740.cs2 @@ -0,0 +1,4 @@ +void script_4740() { + script_4741(); + return; +} diff --git a/dumps/scripts/4741.cs2 b/dumps/scripts/4741.cs2 new file mode 100644 index 000000000..f31468edc --- /dev/null +++ b/dumps/scripts/4741.cs2 @@ -0,0 +1,30 @@ +void script_4741() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = -1; + ivar2 = -1; + if ((bitconfig_9904 < 99999) && (bitconfig_9903 != 0)) { + ivar2 = cs2method_3408(105, 118, 3879, bitconfig_9903); + if (setWidgetRegister(new WidgetPointer(1144,0), bitconfig_9904)) { + ivar0 = getItemAmtInSlot(ivar2, bitconfig_9904); + if (ivar0 > 0) { + ivar1 = getItemIdInSlot(ivar2, bitconfig_9904); + if (ivar1 != -1) { + setWidgetIsHidden(true, new WidgetPointer(1144,23)); + setWidgetIsHidden(false, new WidgetPointer(1144,22)); + setWidgetIsHidden(false, new WidgetPointer(1144,9)); + setWidgetIsHidden(false, new WidgetPointer(1144,45)); + if (((boolean)ivar0)) { + setWidgetText(new WidgetPointer(1144,55), "Are you sure you want to delete " + "" + getItemName(ivar1) + "" + "?"); + } else { + setWidgetText(new WidgetPointer(1144,55), "Are you sure you want to delete " + "" + getItemName(ivar1) + "" + " (" + "" + intToStr(ivar0) + "" + " items)?"); + } + setItemOnWidgetMethod2200(ivar1, ivar0, new WidgetPointer(1144,56)); + } + } + } + } + return; +} diff --git a/dumps/scripts/4742.cs2 b/dumps/scripts/4742.cs2 new file mode 100644 index 000000000..c53a95ca0 --- /dev/null +++ b/dumps/scripts/4742.cs2 @@ -0,0 +1,6 @@ +void script_4742(int arg0) { + bitconfig_9904 = 99999; + setWidgetIsHidden(true, new WidgetPointer(1144,9)); + setWidgetIsHidden(true, new WidgetPointer(1144,45)); + return; +} diff --git a/dumps/scripts/4743.cs2 b/dumps/scripts/4743.cs2 new file mode 100644 index 000000000..125640ea2 --- /dev/null +++ b/dumps/scripts/4743.cs2 @@ -0,0 +1,6 @@ +void script_4743() { + setWidgetSprite(4666, new WidgetPointer(556,8)); + setWidgetSprite(4664, new WidgetPointer(556,9)); + setWidgetSprite(4664, new WidgetPointer(556,10)); + return; +} diff --git a/dumps/scripts/4744.cs2 b/dumps/scripts/4744.cs2 new file mode 100644 index 000000000..8ce6e53df --- /dev/null +++ b/dumps/scripts/4744.cs2 @@ -0,0 +1,6 @@ +void script_4744() { + setWidgetSprite(4665, new WidgetPointer(556,8)); + setWidgetSprite(4663, new WidgetPointer(556,9)); + setWidgetSprite(4663, new WidgetPointer(556,10)); + return; +} diff --git a/dumps/scripts/4745.cs2 b/dumps/scripts/4745.cs2 new file mode 100644 index 000000000..a03e50800 --- /dev/null +++ b/dumps/scripts/4745.cs2 @@ -0,0 +1,23 @@ +void script_4745(int arg0,int arg1) { + int ivar2; + int ivar3; + string svar0; + ivar2 = -1; + ivar3 = -1; + svar0 = "null"; + if (bitconfig_9903 != 0) { + ivar2 = cs2method_3408(105, 118, 3879, bitconfig_9903); + if (arg1 < getItemContainerLength(ivar2)) { + ivar3 = getItemIdInSlot(ivar2, arg1); + if (ivar3 != -1) { + svar0 = script_4747(ivar3); + if (strLength(svar0) > 0) { + setWidgetText(new WidgetPointer(1144,23), svar0); + setWidgetIsHidden(false, new WidgetPointer(1144,23)); + setWidgetIsHidden(true, new WidgetPointer(1144,22)); + } + } + } + } + return; +} diff --git a/dumps/scripts/4746.cs2 b/dumps/scripts/4746.cs2 new file mode 100644 index 000000000..dfb60fe90 --- /dev/null +++ b/dumps/scripts/4746.cs2 @@ -0,0 +1,5 @@ +void script_4746(int arg0,int arg1) { + setWidgetIsHidden(true, new WidgetPointer(1144,23)); + setWidgetIsHidden(false, new WidgetPointer(1144,22)); + return; +} diff --git a/dumps/scripts/4747.cs2 b/dumps/scripts/4747.cs2 new file mode 100644 index 000000000..5a75899b0 --- /dev/null +++ b/dumps/scripts/4747.cs2 @@ -0,0 +1,883 @@ +string script_4747(int arg0) { + flow_0: + SWITCH (arg0) { + case 7464: + GOTO flow_1 + case 5507: + GOTO flow_1 + case 5508: + GOTO flow_1 + case 15671: + GOTO flow_2 + case 15672: + GOTO flow_3 + case 2399: + GOTO flow_4 + case 2400: + GOTO flow_4 + case 2401: + GOTO flow_4 + case 1536: + GOTO flow_5 + case 1537: + GOTO flow_5 + case 1538: + GOTO flow_5 + case 1535: + GOTO flow_5 + case 1548: + GOTO flow_9 + case 1544: + GOTO flow_9 + case 1545: + GOTO flow_9 + case 1546: + GOTO flow_9 + case 1547: + GOTO flow_9 + case 1543: + GOTO flow_9 + case 1542: + GOTO flow_10 + case 271: + GOTO flow_11 + case 274: + GOTO flow_12 + case 272: + GOTO flow_12 + case 275: + GOTO flow_13 + case 276: + GOTO flow_14 + case 277: + GOTO flow_15 + case 666: + GOTO flow_16 + case 668: + GOTO flow_17 + case 667: + GOTO flow_18 + case 432: + GOTO flow_19 + case 433: + GOTO flow_20 + case 7956: + GOTO flow_21 + case 7957: + GOTO flow_22 + case 2418: + GOTO flow_23 + case 2421: + GOTO flow_24 + case 2419: + GOTO flow_24 + case 2423: + GOTO flow_25 + case 2424: + GOTO flow_26 + case 964: + GOTO flow_27 + case 755: + GOTO flow_28 + case 756: + GOTO flow_29 + case 753: + GOTO flow_30 + case 290: + GOTO flow_31 + case 291: + GOTO flow_32 + case 761: + GOTO flow_33 + case 763: + GOTO flow_34 + case 765: + GOTO flow_34 + case 769: + GOTO flow_35 + case 1549: + GOTO flow_36 + case 300: + GOTO flow_37 + case 14062: + GOTO flow_38 + case 14064: + GOTO flow_39 + case 14065: + GOTO flow_40 + case 14066: + GOTO flow_41 + case 14067: + GOTO flow_42 + case 14068: + GOTO flow_43 + case 14069: + GOTO flow_44 + case 14070: + GOTO flow_45 + case 14071: + GOTO flow_46 + case 14072: + GOTO flow_47 + case 14073: + GOTO flow_48 + case 14074: + GOTO flow_49 + case 14075: + GOTO flow_50 + case 9590: + GOTO flow_51 + case 9589: + GOTO flow_51 + case 9591: + GOTO flow_52 + case 524: + GOTO flow_53 + case 525: + GOTO flow_53 + case 522: + GOTO flow_53 + case 523: + GOTO flow_53 + case 12546: + GOTO flow_53 + case 2409: + GOTO flow_54 + case 2408: + GOTO flow_55 + case 2410: + GOTO flow_56 + case 2411: + GOTO flow_57 + case 11211: + GOTO flow_58 + case 11210: + GOTO flow_58 + case 11203: + GOTO flow_58 + case 11202: + GOTO flow_58 + case 11204: + GOTO flow_58 + case 11198: + GOTO flow_58 + case 11196: + GOTO flow_58 + case 11197: + GOTO flow_58 + case 1584: + GOTO flow_59 + case 463: + GOTO flow_60 + case 462: + GOTO flow_60 + case 461: + GOTO flow_60 + case 460: + GOTO flow_60 + case 459: + GOTO flow_60 + case 458: + GOTO flow_60 + case 457: + GOTO flow_60 + case 456: + GOTO flow_60 + case 774: + GOTO flow_61 + case 773: + GOTO flow_61 + case 1856: + GOTO flow_62 + case 1858: + GOTO flow_63 + case 1857: + GOTO flow_63 + case 90: + GOTO flow_64 + case 83: + GOTO flow_65 + case 21: + GOTO flow_66 + case 20: + GOTO flow_66 + case 23: + GOTO flow_66 + case 22: + GOTO flow_66 + case 15: + GOTO flow_67 + case 17: + GOTO flow_68 + case 18: + GOTO flow_69 + case 19: + GOTO flow_70 + case 587: + GOTO flow_71 + case 588: + GOTO flow_71 + case 77: + GOTO flow_72 + case 76: + GOTO flow_73 + case 2403: + GOTO flow_74 + case 2404: + GOTO flow_75 + case 1508: + GOTO flow_76 + case 1503: + GOTO flow_77 + case 1509: + GOTO flow_78 + case 1510: + GOTO flow_79 + case 1466: + GOTO flow_80 + case 9665: + GOTO flow_81 + case 292: + GOTO flow_82 + case 298: + GOTO flow_83 + case 296: + GOTO flow_84 + case 297: + GOTO flow_84 + case 423: + GOTO flow_85 + case 425: + GOTO flow_86 + case 424: + GOTO flow_86 + case 422: + GOTO flow_86 + case 420: + GOTO flow_87 + case 415: + GOTO flow_88 + case 417: + GOTO flow_88 + case 416: + GOTO flow_88 + case 419: + GOTO flow_88 + case 418: + GOTO flow_88 + case 783: + GOTO flow_89 + case 784: + GOTO flow_90 + case 785: + GOTO flow_91 + case 786: + GOTO flow_92 + case 793: + GOTO flow_93 + case 788: + GOTO flow_94 + case 794: + GOTO flow_95 + case 787: + GOTO flow_96 + case 791: + GOTO flow_97 + case 790: + GOTO flow_97 + case 789: + GOTO flow_97 + case 792: + GOTO flow_97 + case 2529: + GOTO flow_98 + case 1484: + GOTO flow_98 + case 1483: + GOTO flow_98 + case 1482: + GOTO flow_98 + case 1481: + GOTO flow_98 + case 1486: + GOTO flow_99 + case 1493: + GOTO flow_100 + case 1490: + GOTO flow_100 + case 1488: + GOTO flow_100 + case 1489: + GOTO flow_100 + case 1487: + GOTO flow_100 + case 1494: + GOTO flow_101 + case 1500: + GOTO flow_102 + case 1502: + GOTO flow_103 + case 1501: + GOTO flow_103 + case 1498: + GOTO flow_103 + case 1499: + GOTO flow_103 + case 1496: + GOTO flow_103 + case 1497: + GOTO flow_103 + case 603: + GOTO flow_104 + case 602: + GOTO flow_104 + case 1852: + GOTO flow_105 + case 1851: + GOTO flow_106 + case 1841: + GOTO flow_107 + case 1842: + GOTO flow_108 + case 1849: + GOTO flow_109 + case 1855: + GOTO flow_110 + case 9904: + GOTO flow_111 + case 2388: + GOTO flow_112 + case 2387: + GOTO flow_112 + case 2386: + GOTO flow_112 + case 2385: + GOTO flow_112 + case 2384: + GOTO flow_112 + case 2374: + GOTO flow_113 + case 2375: + GOTO flow_113 + case 2373: + GOTO flow_113 + case 2382: + GOTO flow_114 + case 2383: + GOTO flow_114 + case 2380: + GOTO flow_114 + case 2381: + GOTO flow_114 + case 2378: + GOTO flow_115 + case 2379: + GOTO flow_115 + case 2377: + GOTO flow_115 + case 2397: + GOTO flow_115 + case 2395: + GOTO flow_115 + case 2394: + GOTO flow_115 + case 2393: + GOTO flow_115 + case 0: + GOTO flow_116 + case 1: + GOTO flow_117 + case 1822: + GOTO flow_118 + case 715: + GOTO flow_119 + case 714: + GOTO flow_119 + case 750: + GOTO flow_120 + case 717: + GOTO flow_121 + case 719: + GOTO flow_121 + case 718: + GOTO flow_121 + case 729: + GOTO flow_121 + case 720: + GOTO flow_121 + case 9716: + GOTO flow_122 + case 2888: + GOTO flow_123 + case 2889: + GOTO flow_123 + case 2954: + GOTO flow_124 + case 2953: + GOTO flow_124 + case 2967: + GOTO flow_125 + case 3103: + GOTO flow_126 + case 3102: + GOTO flow_126 + case 3104: + GOTO flow_127 + case 3112: + GOTO flow_128 + case 3113: + GOTO flow_128 + case 3110: + GOTO flow_128 + case 3111: + GOTO flow_128 + case 3109: + GOTO flow_128 + case 3207: + GOTO flow_129 + case 3206: + GOTO flow_129 + case 3208: + GOTO flow_130 + case 3267: + GOTO flow_131 + case 3268: + GOTO flow_132 + case 3395: + GOTO flow_133 + case 10830: + GOTO flow_134 + case 10835: + GOTO flow_135 + case 10834: + GOTO flow_135 + case 10833: + GOTO flow_135 + case 10832: + GOTO flow_135 + case 10831: + GOTO flow_135 + case 10842: + GOTO flow_136 + case 3846: + GOTO flow_137 + case 3847: + GOTO flow_137 + case 3845: + GOTO flow_137 + case 3895: + GOTO flow_138 + case 3894: + GOTO flow_138 + case 3896: + GOTO flow_139 + case 4073: + GOTO flow_140 + case 4193: + GOTO flow_141 + case 4192: + GOTO flow_141 + case 4189: + GOTO flow_141 + case 4190: + GOTO flow_141 + case 4191: + GOTO flow_141 + case 4204: + GOTO flow_142 + case 4206: + GOTO flow_143 + case 4205: + GOTO flow_143 + case 4238: + GOTO flow_144 + case 4272: + GOTO flow_145 + case 4249: + GOTO flow_145 + case 4248: + GOTO flow_145 + case 4247: + GOTO flow_145 + case 4273: + GOTO flow_146 + case 4415: + GOTO flow_147 + case 4490: + GOTO flow_148 + case 4496: + GOTO flow_149 + case 4568: + GOTO flow_150 + case 4597: + GOTO flow_151 + case 4598: + GOTO flow_151 + case 4606: + GOTO flow_152 + case 4615: + GOTO flow_153 + case 4616: + GOTO flow_153 + case 4617: + GOTO flow_154 + case 4623: + GOTO flow_155 + case 4619: + GOTO flow_156 + case 4684: + GOTO flow_157 + case 4686: + GOTO flow_158 + case 4814: + GOTO flow_159 + case 4815: + GOTO flow_159 + case 4817: + GOTO flow_159 + case 6072: + GOTO flow_160 + case 6077: + GOTO flow_161 + case 6079: + GOTO flow_161 + case 6073: + GOTO flow_161 + case 6075: + GOTO flow_161 + case 6104: + GOTO flow_162 + case 6083: + GOTO flow_162 + case 6546: + GOTO flow_163 + case 6545: + GOTO flow_163 + } + return "You should get rid of the " + getItemName(arg0); + flow_1: + return "That's my book! What's it doing in your bank?"; + flow_2: + return "You have Roddeck's book on dragon rearing in your bank. I don't think it's a great discourse on the subject, to be quite honest."; + flow_3: + return "I see you're hanging on to Roddeck's diary. It's got a seeking spell on it, you know. If you get rid of it, it'll find its way back to him."; + flow_4: + return "You've killed Delrith, so you don't need any of the little grey keys that you collected to get Silverlight."; + flow_5: + if (((boolean)bitconfig_3741)) { + return "You've opened a secret passageway to Crandor Island, so you won't need the map that showed you how to get there by sea."; + } + return "Ned knows the way to Crandor now, so you don't need the map any more. Also, if you go there, look around for secret passages. There might be another way to get back to Crandor."; + flow_9: + return "The coloured keys from Melzar's maze are very pretty, but you don't really need to keep them. If you ever go there again, the creatures in the maze will drop more coloured keys for you."; + flow_10: + return "You don't really need to keep the key to Melzar's Maze. If you ever go there again, you can ask for a new one from the Guildmaster of the Champions' Guild."; + flow_11: + return "Since you've already helped to repair Professor Oddenstein's machine, you can get rid of the pressure gauge."; + flow_12: + return "You really don't need to keep fish food in your bank."; + flow_13: + return "The little key that opens a closet in Draynor Manor? I think you can afford to get rid of it."; + flow_14: + return "You aren't going to need that rubber tube again."; + flow_15: + return "No need to keep that oil can."; + flow_16: + return "That's a nice picture of Sir Vyvin, but you don't really need it."; + flow_17: + return "Blurite ore's handy for making ceremonial swords, but you've already done that quest. Members can make crossbows and bolts out of it, but it has no other use."; + flow_18: + return "You don't really need a copy of Sir Vyvin's sword, although it's a fairly nice weapon."; + flow_19: + return "I see you've got the key to One-Eyed Hector's chest. That's not much use to you."; + flow_20: + return "You've already found the pirate's treasure, so you can get rid of the pirate's message."; + flow_21: + return "You've already found the pirate's treasure, so you can get rid of the pirate's casket."; + flow_22: + return "You've already found the pirate's treasure, so you can get rid of the pirate's apron."; + flow_23: + return "You aren't going to need to get back into Prince Ali's cell."; + flow_24: + return "You don't need a wig. Your head looks fine."; + flow_25: + return "I can't imagine why you've kept the imprint of Lady Keli's key."; + flow_26: + return "If you want to change your appearance, go to the Makeover Mage. You don't need this skin paste."; + flow_27: + return "I suggest you get rid of the skull. It's unhygienic."; + flow_28: + return "You have a message from Juliet to Romeo. There's no point in keeping that now that they've split up."; + flow_29: + return "A potion made from cadava berries? There's not much you can do with one of those."; + flow_30: + return "If you get rid of those cadava berries, you'll still be able to pick more near Varrock, and you'll save bank space."; + flow_31: + return "Sedridor's research into the mysteries of the runes is very interesting, but you don't need it."; + flow_32: + return "Aubury's notes won't be of any further use to you. You can't even read them!"; + flow_33: + return "You won't need Jonny the Beard's intelligence report now that you've found the Shield of Arrav."; + flow_34: + return "You don't need to keep bits of the Shield of Arrav now that you've completed that quest."; + flow_35: + return "You can get rid of the little certificate from the Museum of Varrock. You've already been rewarded for taking one to the King."; + flow_36: + return "Now that you've slain Count Draynor, you don't need that stake. It's not much use against other vampyres."; + flow_37: + return "Ugh... A rat's tail! Get rid of it!"; + flow_38: + return "I don't think you'll need the broom ointment."; + flow_39: + return "That newt doesn't look very useful."; + flow_40: + return "You probably won't need the 'Newts' label."; + flow_41: + return "You probably won't need the 'Toads' label."; + flow_42: + return "You certainly won't need the 'Newts & Toads' label."; + flow_43: + return "Betty's wand? I don't think you should be messing around with that."; + flow_44: + return "There's no point in hanging on to that slate."; + flow_45: + return "You shouldn't be keeping that reptile in there."; + flow_46: + return "You shouldn't be keeping that blackbird in there."; + flow_47: + return "You shouldn't be keeping that bat in there."; + flow_48: + return "You shouldn't be keeping that spider in there."; + flow_49: + return "You shouldn't be keeping that rat in there."; + flow_50: + return "You shouldn't be keeping that snail in there."; + flow_51: + return "You don't need to keep the dossier from the White Knight."; + flow_52: + return "You completed the Black Knights' fortress; you don't need this old cauldron anymore."; + flow_53: + return "You have completed the druidic ritual. You don't need the enchanted meat any longer."; + flow_54: + return "You don't need the witch's door key any longer."; + flow_55: + return "You don't need to keep the witch's diary. You can get it from the bookshelf again, if you need to."; + flow_56: + return "You don't need the magnet. You opened the witch's back door."; + flow_57: + return "You don't really need the witch's shed key any more."; + flow_58: + return "You don't need that grim looking item."; + flow_59: + return "You've already given the id papers to Grip. This must be a forgery!"; + flow_60: + return "You don't need that scorpion cage anymore."; + flow_61: + return "You've obtained Avan's part of the crest. You don't need the perfect ruby jewellery."; + flow_62: + return "You've already read from the Ardougne tourist guide."; + flow_63: + return "You've finished the Tribal Totem quest. Why do you still have this?"; + flow_64: + return "You've given this blanket to the monk already. Did you steal it back again?"; + flow_65: + return "You already fixed the lever in The Temple of Ikov."; + flow_66: + return "You've finished the Clock Tower quest. You don't need that cog."; + flow_67: + return "You completed the Holy Grail quest. You don't need Sir Galahad's table napkin."; + flow_68: + return "You completed the Holy Grail quest. You don't need the grail bell anymore."; + flow_69: + return "You completed the Holy Grail quest. You have no need of King Arthur's golden feather."; + flow_70: + return "You completed the Holy Grail quest. Why do you have the grail?"; + flow_71: + return "You have finished with Tree Gnome Village. You don't need the orbs."; + flow_72: + return "You already got the keys from the lazy guard. You don't need the brew."; + flow_73: + return "You have already used the keys from the lazy guard."; + flow_74: + return "You already completed the Hazeel Cult Quest; no need to hang onto one of those scrolls."; + flow_75: + return "You have already opened the chest in the Carnillean household."; + flow_76: + return "You have already made Bravek a hangover cure. You don't need his scrawled note."; + flow_77: + return "You have no need of a warrant to the plague house."; + flow_78: + return "You have already given this book to Ted Rehnison. You don't need it."; + flow_79: + return "You have already shown Elena's picture to Jethick."; + flow_80: + return "Yuck! A sea slug! Get rid of it!"; + flow_81: + return "A sea slug torch... Fascinating! You don't need it; lit, unlit, smouldering or otherwise."; + flow_82: + return "You have completed the Waterfall quest, so you don't need the book about Baxtorian."; + flow_83: + return "You have completed the Waterfall quest, so you don't need this key."; + flow_84: + return "You have finished the Waterfall quest, so you certainly don't need that urn; empty or full."; + flow_85: + return "You've freed Elena already, so you don't need the key."; + flow_86: + return "You have already distracted the guards with the pigeons."; + flow_87: + return "You've already retreived Elena's distillator."; + flow_88: + return "Guidor has already tested the plague sample. you don't need that any more."; + flow_89: + return "You have given the bark sample to Hazelmere already."; + flow_90: + return "You have already translated the ancient message told to you by Hazelmere."; + flow_91: + return "You have completed the Grand Tree quest. You have no need of Glough's Journal."; + flow_92: + return "You have completed the Grand Tree quest. You have no need of Hazelmere's scroll."; + flow_93: + return "You have completed the Grand Tree quest. You don't need this rock."; + flow_94: + return "You have already searched the Glough's chest. You have no possible use for the key."; + flow_95: + return "You have already given the invasion plans to the King."; + flow_96: + return "You have completed the Grand Tree quest. You don't need to hold on to this lumber order."; + flow_97: + return "You have already opened the watchtower entrance; you don't need twigs."; + flow_98: + return "The orbs are pretty, but you have already found your way down the well in the underground pass."; + flow_99: + return "Railings... Useful for poking undead in cages, I guess, but of no value otherwise."; + flow_100: + return "You have already passed the gate of Zamorak. You don't need this."; + flow_101: + return "You have killed Iban. You have little use for his journal."; + flow_102: + return "You have already done all you can with Iban's shadow."; + flow_103: + return "You have completed the four tasks with the doll."; + flow_104: + return "The professor has already fixed his telescope. You don't need this."; + flow_105: + return "You have already opened the Captain's chest with the copied key."; + flow_106: + return "A pineapple! How wonderful... You don't need it."; + flow_107: + return "You have already returned Ana to the Shantay Pass. You don't need to carry the barrel around."; + flow_108: + return "You have already returned Ana to the Shantay Pass. You don't need to carry the barrel around... or Ana."; + flow_109: + GOTO flow_164 + flow_110: + return "You don't need that rock unless you plan on being caught by the guards agasin."; + flow_111: + return "The book on sailing is rather dull."; + flow_112: + return "You have already given evidence to the wizard."; + flow_113: + return "You have already received the ogre relic. You don't need these relic parts."; + flow_114: + return "You have already used the powering crystals."; + flow_115: + return "You have already received the powering crystals from this item."; + flow_116: + return "You have already returned the dwarf remains to Captain Lawgof."; + flow_117: + return "You have already returned the dwarven toolkit to Captain Lawgof."; + flow_118: + return "You have already solved the murder mystery. You don't need this fingerprint."; + flow_119: + return "You have already presented the Radimus notes."; + flow_120: + return "You have already presented the gilded totem."; + flow_121: + return "You have freed Ungadulu from possession. You don't have any use for the scrawled notes, books, tomes or pictures of dirty old bowls."; + flow_122: + return "What are you going to do with that rock?"; + flow_123: + return "You do not need the Elemental workshop bowl."; + flow_124: + return "You have doused the vampyre's coffin already. You don't need this old bucket of stale water."; + flow_125: + return "You don't need Filliman's Journal."; + flow_126: + return "You have already recovered the combination for Denulf."; + flow_127: + return "You have already recovered the secret way map for Denulf."; + flow_128: + return "You don't need those coloured cannonballs"; + flow_129: + return "You don't need the king's summons or messages."; + flow_130: + return "You can get rid of the crystal pendant. It has served it's purpose."; + flow_131: + return "You don't need that dirty old druid's robe."; + flow_132: + return "Argh! Is that a man in your backpack? Wait...no! It's a fake man, you crafty so-and-so. Still, you don't need it."; + flow_133: + return "You have already sold the apothecary this book."; + flow_134: + return "You've already given King Sorvott's decree to Burgher."; + flow_135: + return "You have already collected King Sorvott IV's window taxes."; + flow_136: + return "You have already handed in the troll's talking head to the Burgher."; + flow_137: + return "You have completed the Horror from the Deep quest. You probably don't need this book."; + flow_138: + return "You have already given the Etceteria anthem to Queen Sigrid."; + flow_139: + return "You have already given the treaty to King Vargas to sign."; + flow_140: + return "A damp tinderbox; not at all useful for anything."; + flow_141: + return "You already retrieved the lightning conductor mould from the chimney. You don't need this brush."; + flow_142: + return "You don't need the dusty old letter from the clock."; + flow_143: + return "You have already planted this seed for Eluned."; + flow_144: + return "Yuck! An ectoplasm puddle."; + flow_145: + return "You have already given that to the crone."; + flow_146: + return "You have already made the toy boat. You don't need this key."; + flow_147: + return "You already have an axe that's been sharpened by Brian. You don't need this blunt one."; + flow_148: + return "You have already spread enough mud over that poor tree."; + flow_149: + return "A broken stick. Really? You kept a broken stick?"; + flow_150: + return "You have already retrieved the schematic from that book."; + flow_151: + return "You have already solved the safe combination."; + flow_152: + return "You have already caught the snake with this basket."; + flow_153: + return "You have already found out about the golem. You don't need the note or letter."; + flow_154: + return "You have already retrieved the statuette from the display case."; + flow_155: + return "You have already reprogrammed the golem. You don't need this pen."; + flow_156: + return "You have already opened the golem's head. You don't need this key."; + flow_157: + return "You don't need more linen for mummification, however much you might like to."; + flow_158: + return "You don't need the book on embalming."; + flow_159: + return "You have already shown the portrait to Zavistic Rarve."; + flow_160: + return "You have already washed the mourner's top."; + flow_161: + return "You have finished the Mourning's End quest. You don't need the mourner's books."; + flow_162: + return "You have finished the Mourning's End quest. You don't need that key."; + flow_163: + return "You have already completed all the chores for Bob."; + flow_164: + return ""; +} diff --git a/dumps/scripts/4748.cs2 b/dumps/scripts/4748.cs2 new file mode 100644 index 000000000..bceab54f0 --- /dev/null +++ b/dumps/scripts/4748.cs2 @@ -0,0 +1,4 @@ +void script_4748() { + setWidgetIsHidden(true, new WidgetPointer(993,261)); + return; +} diff --git a/dumps/scripts/4749.cs2 b/dumps/scripts/4749.cs2 new file mode 100644 index 000000000..918cdf880 --- /dev/null +++ b/dumps/scripts/4749.cs2 @@ -0,0 +1,4 @@ +void script_4749() { + script_4750(); + return; +} diff --git a/dumps/scripts/475.cs2 b/dumps/scripts/475.cs2 new file mode 100644 index 000000000..550f47774 --- /dev/null +++ b/dumps/scripts/475.cs2 @@ -0,0 +1,5 @@ +void script_475(int arg0,int arg1) { + script_679(arg0); + script_41(arg1); + return; +} diff --git a/dumps/scripts/4750.cs2 b/dumps/scripts/4750.cs2 new file mode 100644 index 000000000..b3fc47931 --- /dev/null +++ b/dumps/scripts/4750.cs2 @@ -0,0 +1,12 @@ +void script_4750() { + int ivar0; + int ivar1; + if (getDisplayMode() <= 1) { + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(933,1)); + return; + } + ivar0 = divide(subtract(getWidgetActualWidth(new WidgetPointer(933,0)), getWidgetActualWidth(new WidgetPointer(933,1))), 2); + ivar1 = divide(subtract(getWidgetActualHeight(new WidgetPointer(933,0)), getWidgetActualHeight(new WidgetPointer(933,1))), 2); + setWidgetPosition(max(ivar0, 223), max(ivar1, 165), 2, 2, new WidgetPointer(933,1)); + return; +} diff --git a/dumps/scripts/4751.cs2 b/dumps/scripts/4751.cs2 new file mode 100644 index 000000000..48c28b70f --- /dev/null +++ b/dumps/scripts/4751.cs2 @@ -0,0 +1,4 @@ +void script_4751(int arg0,int arg1) { + script_311(arg0, arg1, getOtherCommonData(2722, 596)); + return; +} diff --git a/dumps/scripts/4752.cs2 b/dumps/scripts/4752.cs2 new file mode 100644 index 000000000..fb12ee1be --- /dev/null +++ b/dumps/scripts/4752.cs2 @@ -0,0 +1,8 @@ +void script_4752() { + if (isWidgetHidden(new WidgetPointer(1143,6))) { + setWidgetIsHidden(false, new WidgetPointer(1143,6)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1143,6)); + } + return; +} diff --git a/dumps/scripts/4753.cs2 b/dumps/scripts/4753.cs2 new file mode 100644 index 000000000..9a5b92553 --- /dev/null +++ b/dumps/scripts/4753.cs2 @@ -0,0 +1,4 @@ +void script_4753() { + setWidgetIsHidden(true, new WidgetPointer(1143,6)); + return; +} diff --git a/dumps/scripts/4754.cs2 b/dumps/scripts/4754.cs2 new file mode 100644 index 000000000..8c5bec8b2 --- /dev/null +++ b/dumps/scripts/4754.cs2 @@ -0,0 +1,16 @@ +int script_4754(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + ivar3 = getWidgetActualHeight(); + } + ivar4 = subtract(getWidgetActualHeight(new WidgetPointer(arg0)), ivar3); + arg1 = multiply(ivar4, divide(arg1, ivar4)); + if (((boolean)arg2)) { + arg1 = add(arg1, ivar4); + } else { + arg1 = subtract(arg1, ivar4); + } + return arg1; +} diff --git a/dumps/scripts/4755.cs2 b/dumps/scripts/4755.cs2 new file mode 100644 index 000000000..30cbc266a --- /dev/null +++ b/dumps/scripts/4755.cs2 @@ -0,0 +1,24 @@ +void script_4755(int arg0) { + int ivar1; + ivar1 = multiplyDivide(16384, 900, standart_config_2243); + ivar1 = min(max(ivar1, 0), 16384); + setWidgetSize(ivar1, 0, 2, 1, new WidgetPointer(642,66)); + setWidgetText(new WidgetPointer(arg0), intToStr(standart_config_2243)); + if (standart_config_2243 >= 700) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,67)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,69)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,68)); + setWidgetAnimation(2602, new WidgetPointer(642,38)); + } else if (standart_config_2243 <= 300) { + setWidgetRGB(new Color(255, 34, 102), new WidgetPointer(642,67)); + setWidgetRGB(new Color(255, 34, 102), new WidgetPointer(642,69)); + setWidgetRGB(new Color(255, 34, 102), new WidgetPointer(642,68)); + setWidgetAnimation(2601, new WidgetPointer(642,38)); + } else { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,67)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,69)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,68)); + setWidgetAnimation(9804, new WidgetPointer(642,38)); + } + return; +} diff --git a/dumps/scripts/4756.cs2 b/dumps/scripts/4756.cs2 new file mode 100644 index 000000000..1add4c99f --- /dev/null +++ b/dumps/scripts/4756.cs2 @@ -0,0 +1,24 @@ +void script_4756(int arg0) { + int ivar1; + ivar1 = multiplyDivide(16384, 1200, standart_config_2244); + ivar1 = min(max(ivar1, 0), 16384); + setWidgetSize(ivar1, 0, 2, 1, new WidgetPointer(642,90)); + setWidgetText(new WidgetPointer(arg0), intToStr(standart_config_2244)); + if (standart_config_2244 >= 700) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,91)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,93)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,92)); + setWidgetAnimation(2602, new WidgetPointer(642,96)); + } else if (standart_config_2244 <= 300) { + setWidgetRGB(new Color(255, 34, 102), new WidgetPointer(642,91)); + setWidgetRGB(new Color(255, 34, 102), new WidgetPointer(642,93)); + setWidgetRGB(new Color(255, 34, 102), new WidgetPointer(642,92)); + setWidgetAnimation(2601, new WidgetPointer(642,96)); + } else { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,91)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,93)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,92)); + setWidgetAnimation(9804, new WidgetPointer(642,96)); + } + return; +} diff --git a/dumps/scripts/4757.cs2 b/dumps/scripts/4757.cs2 new file mode 100644 index 000000000..7931141fa --- /dev/null +++ b/dumps/scripts/4757.cs2 @@ -0,0 +1,19 @@ +void script_4757(int arg0) { + int ivar1; + ivar1 = multiplyDivide(16384, 1600, standart_config_2245); + ivar1 = min(max(ivar1, 0), 16384); + setWidgetSize(ivar1, 0, 2, 1, new WidgetPointer(642,123)); + setWidgetText(new WidgetPointer(arg0), intToStr(standart_config_2245)); + if (standart_config_2245 <= 300) { + setWidgetRGB(new Color(255, 34, 102), new WidgetPointer(642,124)); + setWidgetRGB(new Color(255, 34, 102), new WidgetPointer(642,126)); + setWidgetRGB(new Color(255, 34, 102), new WidgetPointer(642,125)); + setWidgetAnimation(2601, new WidgetPointer(642,104)); + } else { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,124)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,126)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(642,125)); + setWidgetAnimation(9804, new WidgetPointer(642,104)); + } + return; +} diff --git a/dumps/scripts/4758.cs2 b/dumps/scripts/4758.cs2 new file mode 100644 index 000000000..b700729a9 --- /dev/null +++ b/dumps/scripts/4758.cs2 @@ -0,0 +1,4 @@ +void script_4758(int arg0) { + script_4530(arg0); + return; +} diff --git a/dumps/scripts/4759.cs2 b/dumps/scripts/4759.cs2 new file mode 100644 index 000000000..0c3a994af --- /dev/null +++ b/dumps/scripts/4759.cs2 @@ -0,0 +1,4 @@ +void script_4759(int arg0) { + script_4760(arg0); + return; +} diff --git a/dumps/scripts/476.cs2 b/dumps/scripts/476.cs2 new file mode 100644 index 000000000..a394b9154 --- /dev/null +++ b/dumps/scripts/476.cs2 @@ -0,0 +1,5 @@ +void script_476() { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(1011,386)), add(multiply(getLineCount(subtract(getWidgetActualWidth(new WidgetPointer(1011,386)), 10), 494, getWidgetText(new WidgetPointer(1011,387))), 10), 10), 0, 0, new WidgetPointer(1011,386)); + setWidgetIsHidden(true, new WidgetPointer(1011,386)); + return; +} diff --git a/dumps/scripts/4760.cs2 b/dumps/scripts/4760.cs2 new file mode 100644 index 000000000..863ca5c90 --- /dev/null +++ b/dumps/scripts/4760.cs2 @@ -0,0 +1,137 @@ +void script_4760(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + if (arg0 == -1) { + return; + } + ivar1 = 4; + ivar2 = 4; + ivar3 = 4; + ivar4 = 4; + ivar5 = 7; + ivar6 = 8; + ivar7 = 56; + ivar8 = 7; + ivar9 = 120; + ivar10 = 64; + ivar11 = 53; + ivar12 = 8; + ivar13 = 68; + ivar14 = 43; + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(multiply(ivar1, 2), multiply(ivar2, 2), 1, 1); + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(ivar12, 2), ivar4, 1, 0); + setWidgetPosition(0, ivar5, 1, 0); + setWidgetSprite(5472); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(ivar12, 2), ivar4, 1, 0); + setWidgetPosition(0, ivar8, 1, 2); + setWidgetSprite(5472); + cs2method1107(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar3, add(ivar5, ivar8), 0, 1); + setWidgetPosition(ivar12, ivar5, 0, 0); + setWidgetSprite(5473); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar3, add(ivar5, ivar8), 0, 1); + setWidgetPosition(ivar12, ivar5, 2, 0); + setWidgetSprite(5473); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(add(ivar6, ivar7), 2), ivar5, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetSprite(5632); + cs2method1107(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar7, ivar5, 0, 0); + setWidgetPosition(ivar12, 0, 0, 0); + setWidgetSprite(5460); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar7, ivar5, 0, 0); + setWidgetPosition(ivar12, 0, 2, 0); + setWidgetSprite(5634); + setWidgetHFlip(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(multiply(add(ivar10, ivar9), 2), ivar8, 1, 0); + setWidgetPosition(0, 0, 1, 2); + setWidgetSprite(5632); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar9, ivar8, 0, 0); + setWidgetPosition(ivar10, 0, 0, 2); + setWidgetSprite(5460); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar9, ivar8, 0, 0); + setWidgetPosition(ivar10, 0, 2, 2); + setWidgetSprite(5634); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, add(add(add(ivar5, ivar11), ivar13), ivar14), 0, 1); + setWidgetPosition(0, add(ivar5, ivar13), 0, 0); + setWidgetSprite(5468); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, ivar13, 0, 0); + setWidgetPosition(0, ivar5, 0, 0); + setWidgetSprite(5464); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, ivar14, 0, 0); + setWidgetPosition(0, ivar11, 0, 2); + setWidgetSprite(5469); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, add(add(add(ivar5, ivar11), ivar13), ivar14), 0, 1); + setWidgetPosition(0, add(ivar5, ivar13), 2, 0); + setWidgetSprite(5468); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, ivar13, 0, 0); + setWidgetPosition(0, ivar5, 2, 0); + setWidgetSprite(5464); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar12, ivar14, 0, 0); + setWidgetPosition(0, ivar11, 2, 2); + setWidgetSprite(5469); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar6, ivar5, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(6059); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar6, ivar5, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(6060); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar10, ivar11, 0, 0); + setWidgetPosition(0, 0, 0, 2); + setWidgetSprite(5461); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetSize(ivar10, ivar11, 0, 0); + setWidgetPosition(0, 0, 2, 2); + setWidgetSprite(5461); + setWidgetHFlip(1); + return; +} diff --git a/dumps/scripts/4761.cs2 b/dumps/scripts/4761.cs2 new file mode 100644 index 000000000..bd9a0d882 --- /dev/null +++ b/dumps/scripts/4761.cs2 @@ -0,0 +1,11 @@ +int script_4761(int arg0) { + if (globalint_1 < add(getClientCycle(), arg0)) { + if (globalint_1 < getClientCycle()) { + globalint_1 = getClientCycle(); + } + globalint_1 = add(globalint_1, 2); + return 0; + } + globalint_1 = add(add(getClientCycle(), arg0), 10); + return 1; +} diff --git a/dumps/scripts/4762.cs2 b/dumps/scripts/4762.cs2 new file mode 100644 index 000000000..e04beb69c --- /dev/null +++ b/dumps/scripts/4762.cs2 @@ -0,0 +1,64 @@ +void script_4762(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1385); + ivar3 = getOtherCommonData(arg1, 1382); + ivar4 = getOtherCommonData(arg1, 1386); + ivar5 = getOtherCommonData(arg1, 1383); + ivar6 = getOtherCommonData(arg1, 1384); + ivar7 = getOtherCommonData(arg1, 1387); + ivar8 = getOtherCommonData(arg1, 1358); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 0); + setWidgetSize(multiply(5, 2), 5, 1, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar8); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 2); + setWidgetSize(multiply(5, 2), 5, 1, 0); + setWidgetSprite(ivar5); + cs2method2103(ivar8); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(5, multiply(5, 2), 0, 1); + setWidgetSprite(ivar6); + setWidgetHFlip(1); + cs2method2103(ivar8); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(5, multiply(5, 2), 0, 1); + setWidgetSprite(ivar6); + cs2method2103(ivar8); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(5, 5, 0, 0); + setWidgetSprite(ivar2); + setWidgetHFlip(1); + cs2method2103(ivar8); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 2); + setWidgetSize(5, 5, 0, 0); + setWidgetSprite(ivar4); + setWidgetHFlip(1); + cs2method2103(ivar8); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 0); + setWidgetSize(5, 5, 0, 0); + setWidgetSprite(ivar2); + cs2method2103(ivar8); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 2); + setWidgetSize(5, 5, 0, 0); + setWidgetSprite(ivar4); + cs2method2103(ivar8); + return; +} diff --git a/dumps/scripts/4763.cs2 b/dumps/scripts/4763.cs2 new file mode 100644 index 000000000..60cc82340 --- /dev/null +++ b/dumps/scripts/4763.cs2 @@ -0,0 +1,4 @@ +void script_4763() { + script_4768(); + return; +} diff --git a/dumps/scripts/4764.cs2 b/dumps/scripts/4764.cs2 new file mode 100644 index 000000000..cbbc5b3b3 --- /dev/null +++ b/dumps/scripts/4764.cs2 @@ -0,0 +1,4 @@ +void script_4764() { + script_304(49341501); + return; +} diff --git a/dumps/scripts/4765.cs2 b/dumps/scripts/4765.cs2 new file mode 100644 index 000000000..c9e2d834b --- /dev/null +++ b/dumps/scripts/4765.cs2 @@ -0,0 +1,4 @@ +void script_4765() { + script_304(49554440); + return; +} diff --git a/dumps/scripts/4766.cs2 b/dumps/scripts/4766.cs2 new file mode 100644 index 000000000..c9a03aa42 --- /dev/null +++ b/dumps/scripts/4766.cs2 @@ -0,0 +1,4 @@ +void script_4766() { + script_304(48302987); + return; +} diff --git a/dumps/scripts/4767.cs2 b/dumps/scripts/4767.cs2 new file mode 100644 index 000000000..ad15a800d --- /dev/null +++ b/dumps/scripts/4767.cs2 @@ -0,0 +1,4 @@ +void script_4767() { + script_304(48270150); + return; +} diff --git a/dumps/scripts/4768.cs2 b/dumps/scripts/4768.cs2 new file mode 100644 index 000000000..73660a0d0 --- /dev/null +++ b/dumps/scripts/4768.cs2 @@ -0,0 +1,30 @@ +void script_4768() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar0 = 1; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4769.cs2 b/dumps/scripts/4769.cs2 new file mode 100644 index 000000000..9a65ff785 --- /dev/null +++ b/dumps/scripts/4769.cs2 @@ -0,0 +1,176 @@ +cs2func_script_4769_struct(8,0,0) script_4769(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + int ivar37; + int ivar38; + int ivar39; + int ivar40; + int ivar41; + int ivar42; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + cs2func_script_4795_struct(32,0,0) structdump_8; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = -1; + ivar14 = -1; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + ivar27 = 0; + ivar28 = 0; + ivar29 = 0; + ivar30 = 0; + ivar31 = 0; + ivar32 = 0; + ivar33 = 0; + ivar34 = 0; + ivar35 = 0; + ivar36 = 0; + ivar37 = 0; + ivar38 = 0; + ivar39 = 0; + ivar40 = 0; + if (((boolean)arg0)) { + ivar11 = 300; + ivar13 = 73072707; + ivar14 = 73072706; + } else if (arg0 == 2) { + ivar11 = 600; + ivar13 = 73072705; + ivar14 = 73072704; + } else { + ivar11 = 900; + ivar13 = 73072703; + ivar14 = 73072702; + globalint_1561 = 0; + globalint_1562 = 0; + } + while ((arg1 <= 31) && ((boolean)ivar12)) { + ivar10 = script_4790(arg1); + if ((ivar10 > ivar11) || ((boolean)ivar10)) { + ivar12 = 1; + } else { + stack_dump0 = arg1; + stack_dump1 = arg2; + stack_dump2 = arg3; + stack_dump3 = arg4; + stack_dump4 = arg5; + stack_dump5 = arg6; + stack_dump6 = arg7; + stack_dump7 = arg8; + structdump_8 = script_4795(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7); + ivar39 = structdump_8.intpart_31; + ivar38 = structdump_8.intpart_30; + ivar37 = structdump_8.intpart_29; + ivar36 = structdump_8.intpart_28; + ivar35 = structdump_8.intpart_27; + ivar34 = structdump_8.intpart_26; + ivar33 = structdump_8.intpart_25; + ivar32 = structdump_8.intpart_24; + ivar31 = structdump_8.intpart_23; + ivar30 = structdump_8.intpart_22; + ivar29 = structdump_8.intpart_21; + ivar28 = structdump_8.intpart_20; + ivar27 = structdump_8.intpart_19; + ivar26 = structdump_8.intpart_18; + ivar25 = structdump_8.intpart_17; + ivar24 = structdump_8.intpart_16; + ivar23 = structdump_8.intpart_15; + ivar22 = structdump_8.intpart_14; + ivar21 = structdump_8.intpart_13; + ivar20 = structdump_8.intpart_12; + ivar19 = structdump_8.intpart_11; + ivar18 = structdump_8.intpart_10; + ivar17 = structdump_8.intpart_9; + ivar16 = structdump_8.intpart_8; + ivar15 = structdump_8.intpart_7; + arg8 = structdump_8.intpart_6; + arg7 = structdump_8.intpart_5; + arg6 = structdump_8.intpart_4; + arg5 = structdump_8.intpart_3; + arg4 = structdump_8.intpart_2; + arg3 = structdump_8.intpart_1; + arg2 = structdump_8.intpart_0; + if (((boolean)add(add(add(add(add(ivar15, ivar16), ivar17), ivar18), ivar19), ivar20))) { + ivar40 = 0; + } else if (add(add(add(add(add(ivar33, ivar34), ivar35), ivar36), ivar37), ivar38) > 0) { + ivar40 = 3; + } else if (add(add(add(add(add(ivar27, ivar28), ivar29), ivar30), ivar31), ivar32) > 0) { + ivar40 = 2; + } else { + if (add(add(add(add(add(ivar21, ivar22), ivar23), ivar24), ivar25), ivar26) > 0) { + ivar40 = 1; + } + } + stack_dump0 = ivar13; + stack_dump1 = ivar9; + stack_dump2 = ivar10; + stack_dump3 = ivar39; + stack_dump4 = ivar40; + stack_dump5 = arg1; + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 4770 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + } + ivar41 = 38; + ivar42 = multiply(divide(ivar9, 8), ivar41); + if (ivar9 > 0) { + ivar9 = script_4771(ivar13, ivar9); + } + ivar42 = add(ivar42, 10); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar13)), ivar42, new WidgetPointer(ivar13)); + cs2method2100(0, 0, new WidgetPointer(ivar13)); + script_31(ivar14, ivar13, 5666, 5663, 5664, 5665, 5686, 5685); + return newstruct cs2func_script_4769_struct(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); +} diff --git a/dumps/scripts/477.cs2 b/dumps/scripts/477.cs2 new file mode 100644 index 000000000..f2eeb3300 --- /dev/null +++ b/dumps/scripts/477.cs2 @@ -0,0 +1,17 @@ +void script_477(int arg0) { + int ivar1; + int ivar2; + ivar1 = getWidgetActualX(new WidgetPointer(arg0)); + ivar2 = add(getWidgetActualY(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(arg0))); + if (((((((getSkillActualLvl(0) < 42) || (getSkillActualLvl(2) < 42)) || (getSkillActualLvl(1) < 42)) || (getSkillActualLvl(3) < 42)) || (getSkillActualLvl(4) < 42)) || (getSkillActualLvl(6) < 42)) || (getSkillActualLvl(5) < 22)) { + if (add(ivar1, getWidgetActualWidth(new WidgetPointer(1011,386))) >= add(getWidgetActualX(new WidgetPointer(1011,55)), getWidgetActualWidth(new WidgetPointer(1011,55)))) { + ivar1 = subtract(getWidgetActualX(new WidgetPointer(arg0)), subtract(getWidgetActualWidth(new WidgetPointer(1011,386)), getWidgetActualWidth(new WidgetPointer(arg0)))); + } + if (add(ivar2, getWidgetActualHeight(new WidgetPointer(1011,386))) >= add(getWidgetActualY(new WidgetPointer(1011,55)), getWidgetActualHeight(new WidgetPointer(1011,55)))) { + ivar2 = subtract(getWidgetActualY(new WidgetPointer(arg0)), getWidgetActualHeight(new WidgetPointer(1011,386))); + } + setWidgetPosition(ivar1, ivar2, 0, 0, new WidgetPointer(1011,386)); + setWidgetIsHidden(false, new WidgetPointer(1011,386)); + } + return; +} diff --git a/dumps/scripts/4770.cs2 b/dumps/scripts/4770.cs2 new file mode 100644 index 000000000..41041b594 --- /dev/null +++ b/dumps/scripts/4770.cs2 @@ -0,0 +1,37 @@ +?? script_4770(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + string svar0; + string svar1; + string svar2; + string svar3; + ivar6 = divide(arg1, 8); + ivar7 = 38; + ivar8 = 7438; + ivar9 = 5465; + ivar10 = -1; + svar0 = ""; + ivar11 = 0; + ivar12 = 0; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/4771.cs2 b/dumps/scripts/4771.cs2 new file mode 100644 index 000000000..823f3d59a --- /dev/null +++ b/dumps/scripts/4771.cs2 @@ -0,0 +1,29 @@ +int script_4771(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar2 = 38; + ivar3 = divide(arg1, 8); + ivar4 = 5470; + createExtraChild(new WidgetPointer(arg0), 3, arg1); + setWidgetPosition(2, multiply(ivar2, ivar3), 0, 0); + setWidgetSize(4, 10, 1, 0); + if (((boolean)mod(ivar3, 2))) { + setWidgetRGB(new Color(24, 23, 21)); + } else { + setWidgetRGB(new Color(33, 31, 28)); + } + setWidgetFilled(1); + ivar5 = add(arg1, 1); + setScriptCallOnMouseEntered(4779, new WidgetPointer(arg0), ivar5, 1, "Iii"); + setScriptCallOnMouseExit(4779, new WidgetPointer(arg0), ivar5, 0, "Iii"); + arg1 = add(arg1, 1); + createExtraChild(new WidgetPointer(arg0), 5, arg1); + setWidgetSprite(ivar4); + setWidgetSize(4, 10, 1, 0); + setWidgetPosition(2, multiply(ivar2, ivar3), 0, 0); + setWidgetHidden(1); + arg1 = add(arg1, 1); + return arg1; +} diff --git a/dumps/scripts/4772.cs2 b/dumps/scripts/4772.cs2 new file mode 100644 index 000000000..dfc201ee7 --- /dev/null +++ b/dumps/scripts/4772.cs2 @@ -0,0 +1,38 @@ +void script_4772(int arg0) { + switch (arg0) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(1115,33)); + setWidgetIsHidden(true, new WidgetPointer(1115,49)); + setWidgetIsHidden(true, new WidgetPointer(1115,50)); + setWidgetIsHidden(false, new WidgetPointer(1115,0)); + setWidgetIsHidden(true, new WidgetPointer(1115,1)); + setWidgetIsHidden(true, new WidgetPointer(1115,2)); + setWidgetIsHidden(true, new WidgetPointer(1115,26)); + setWidgetIsHidden(false, new WidgetPointer(1115,27)); + setWidgetIsHidden(false, new WidgetPointer(1115,28)); + break; + case 2: + setWidgetIsHidden(true, new WidgetPointer(1115,33)); + setWidgetIsHidden(false, new WidgetPointer(1115,49)); + setWidgetIsHidden(true, new WidgetPointer(1115,50)); + setWidgetIsHidden(true, new WidgetPointer(1115,0)); + setWidgetIsHidden(false, new WidgetPointer(1115,1)); + setWidgetIsHidden(true, new WidgetPointer(1115,2)); + setWidgetIsHidden(false, new WidgetPointer(1115,26)); + setWidgetIsHidden(true, new WidgetPointer(1115,27)); + setWidgetIsHidden(false, new WidgetPointer(1115,28)); + break; + case 3: + setWidgetIsHidden(true, new WidgetPointer(1115,33)); + setWidgetIsHidden(true, new WidgetPointer(1115,49)); + setWidgetIsHidden(false, new WidgetPointer(1115,50)); + setWidgetIsHidden(true, new WidgetPointer(1115,0)); + setWidgetIsHidden(true, new WidgetPointer(1115,1)); + setWidgetIsHidden(false, new WidgetPointer(1115,2)); + setWidgetIsHidden(false, new WidgetPointer(1115,26)); + setWidgetIsHidden(false, new WidgetPointer(1115,27)); + setWidgetIsHidden(true, new WidgetPointer(1115,28)); + } + script_4775(); + return; +} diff --git a/dumps/scripts/4773.cs2 b/dumps/scripts/4773.cs2 new file mode 100644 index 000000000..ef5fcb4b3 --- /dev/null +++ b/dumps/scripts/4773.cs2 @@ -0,0 +1,24 @@ +void script_4773(int arg0,int arg1,int arg2) { + int stack_dump0; + int stack_dump1; + int stack_dump2; + if (citadelConfigsInitialized() && (bitconfig_9555 == arg0)) { + if (((boolean)globalint_1560)) { + script_4768(); + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = arg2; + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 4777 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + globalint_1560 = 0; + } + return; +} diff --git a/dumps/scripts/4774.cs2 b/dumps/scripts/4774.cs2 new file mode 100644 index 000000000..93f68074a --- /dev/null +++ b/dumps/scripts/4774.cs2 @@ -0,0 +1,6 @@ +void script_4774(int arg0) { + if (arg0 == bitconfig_9555) { + script_4775(); + } + return; +} diff --git a/dumps/scripts/4775.cs2 b/dumps/scripts/4775.cs2 new file mode 100644 index 000000000..13edb41d3 --- /dev/null +++ b/dumps/scripts/4775.cs2 @@ -0,0 +1,10 @@ +void script_4775() { + setWidgetText(new WidgetPointer(1115,37), ""); + setWidgetIsHidden(true, new WidgetPointer(1115,34)); + setWidgetIsHidden(true, new WidgetPointer(1115,80)); + setWidgetIsHidden(true, new WidgetPointer(1115,42)); + setWidgetIsHidden(true, new WidgetPointer(1115,41)); + setWidgetIsHidden(true, new WidgetPointer(1115,119)); + setWidgetText(new WidgetPointer(1115,79), ""); + return; +} diff --git a/dumps/scripts/4776.cs2 b/dumps/scripts/4776.cs2 new file mode 100644 index 000000000..868565e7d --- /dev/null +++ b/dumps/scripts/4776.cs2 @@ -0,0 +1,20 @@ +void script_4776(int arg0,int arg1,int arg2) { + int stack_dump0; + int stack_dump1; + int stack_dump2; + if (citadelConfigsInitialized()) { + stack_dump0 = arg0; + stack_dump1 = arg1; + stack_dump2 = arg2; + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 4777 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4777.cs2 b/dumps/scripts/4777.cs2 new file mode 100644 index 000000000..bbf4379ad --- /dev/null +++ b/dumps/scripts/4777.cs2 @@ -0,0 +1,61 @@ +?? script_4777(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + int ivar37; + int ivar38; + int ivar39; + int ivar40; + int ivar41; + int ivar42; + string svar0; + string svar1; + string svar2; + string svar3; + ivar3 = -1; + svar0 = ""; + svar1 = ""; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/4778.cs2 b/dumps/scripts/4778.cs2 new file mode 100644 index 000000000..6557e7655 --- /dev/null +++ b/dumps/scripts/4778.cs2 @@ -0,0 +1,3 @@ +void script_4778(int arg0,int arg1) { + return; +} diff --git a/dumps/scripts/4779.cs2 b/dumps/scripts/4779.cs2 new file mode 100644 index 000000000..94b136cf7 --- /dev/null +++ b/dumps/scripts/4779.cs2 @@ -0,0 +1,10 @@ +void script_4779(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (((boolean)arg2)) { + setWidgetHidden(1); + } else { + setWidgetHidden(0); + } + } + return; +} diff --git a/dumps/scripts/478.cs2 b/dumps/scripts/478.cs2 new file mode 100644 index 000000000..a190aca37 --- /dev/null +++ b/dumps/scripts/478.cs2 @@ -0,0 +1,4 @@ +void script_478() { + setWidgetIsHidden(true, new WidgetPointer(1011,386)); + return; +} diff --git a/dumps/scripts/4780.cs2 b/dumps/scripts/4780.cs2 new file mode 100644 index 000000000..b61e08214 --- /dev/null +++ b/dumps/scripts/4780.cs2 @@ -0,0 +1,11 @@ +void script_4780(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (((boolean)arg2)) { + setWidgetSprite(7546); + } else { + setWidgetSprite(7545); + script_41(73072826); + } + } + return; +} diff --git a/dumps/scripts/4781.cs2 b/dumps/scripts/4781.cs2 new file mode 100644 index 000000000..80da2f0a3 --- /dev/null +++ b/dumps/scripts/4781.cs2 @@ -0,0 +1,11 @@ +void script_4781(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (((boolean)arg2)) { + setWidgetSprite(7543); + } else { + setWidgetSprite(7542); + script_41(73072826); + } + } + return; +} diff --git a/dumps/scripts/4782.cs2 b/dumps/scripts/4782.cs2 new file mode 100644 index 000000000..bfdf03c11 --- /dev/null +++ b/dumps/scripts/4782.cs2 @@ -0,0 +1,30 @@ +void script_4782(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = -1; + ivar4 = -1; + switch (arg1) { + case 1: + ivar3 = 7541; + ivar4 = 7537; + break; + case 2: + ivar3 = 7540; + ivar4 = 7536; + break; + case 3: + ivar3 = 7539; + ivar4 = 7535; + break; + case 4: + ivar3 = 7538; + ivar4 = 7534; + } + if (((boolean)arg2)) { + setWidgetSprite(ivar3, new WidgetPointer(arg0)); + } else { + setWidgetSprite(ivar4, new WidgetPointer(arg0)); + script_41(73072826); + } + return; +} diff --git a/dumps/scripts/4783.cs2 b/dumps/scripts/4783.cs2 new file mode 100644 index 000000000..27817c5ca --- /dev/null +++ b/dumps/scripts/4783.cs2 @@ -0,0 +1,4 @@ +void script_4783(int arg0,int arg1,string arg2) { + script_4784(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4784.cs2 b/dumps/scripts/4784.cs2 new file mode 100644 index 000000000..0f09675df --- /dev/null +++ b/dumps/scripts/4784.cs2 @@ -0,0 +1,17 @@ +void script_4784(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = 2; + ivar3 = divide(getWidgetActualWidth(new WidgetPointer(arg0)), 2); + ivar4 = getWidgetActualY(new WidgetPointer(arg0)); + if ((arg1 != -1) && setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar3 = divide(getWidgetActualWidth(), 2); + ivar4 = getWidgetActualY(); + } + if (subtract(ivar4, cs2method2601(new WidgetPointer(arg0))) > 114) { + ivar2 = 0; + } + script_4539(73072826, arg0, arg1, 150, -1, -1, -1, 13, 4, ivar2, ivar3, ivar4, arg2); + return; +} diff --git a/dumps/scripts/4785.cs2 b/dumps/scripts/4785.cs2 new file mode 100644 index 000000000..ac594127c --- /dev/null +++ b/dumps/scripts/4785.cs2 @@ -0,0 +1,11 @@ +?? script_4785() { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/4786.cs2 b/dumps/scripts/4786.cs2 new file mode 100644 index 000000000..1e40310d4 --- /dev/null +++ b/dumps/scripts/4786.cs2 @@ -0,0 +1,65 @@ +int script_4786(int arg0) { + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return 0; +} diff --git a/dumps/scripts/4787.cs2 b/dumps/scripts/4787.cs2 new file mode 100644 index 000000000..6e0ee7479 --- /dev/null +++ b/dumps/scripts/4787.cs2 @@ -0,0 +1,77 @@ +int script_4787(int arg0) { + switch (arg0) { + case 0: + return 1; + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return 0; +} diff --git a/dumps/scripts/4788.cs2 b/dumps/scripts/4788.cs2 new file mode 100644 index 000000000..1da757c9b --- /dev/null +++ b/dumps/scripts/4788.cs2 @@ -0,0 +1,11 @@ +?? script_4788() { + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 4785 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/4789.cs2 b/dumps/scripts/4789.cs2 new file mode 100644 index 000000000..c462c44a5 --- /dev/null +++ b/dumps/scripts/4789.cs2 @@ -0,0 +1,16 @@ +int script_4789(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 4; + ivar2 = 0; + ivar3 = 0; + while (ivar1 <= 15) { + ivar2 = script_4949(ivar1); + if (ivar2 == arg0) { + return script_4959(ivar1); + } + ivar1 = add(ivar1, 1); + } + return 0; +} diff --git a/dumps/scripts/479.cs2 b/dumps/scripts/479.cs2 new file mode 100644 index 000000000..058b0b107 --- /dev/null +++ b/dumps/scripts/479.cs2 @@ -0,0 +1,4 @@ +void script_479() { + setWidgetText(new WidgetPointer(1015,12), intToStr(bitconfig_7513)); + return; +} diff --git a/dumps/scripts/4790.cs2 b/dumps/scripts/4790.cs2 new file mode 100644 index 000000000..cd72349b9 --- /dev/null +++ b/dumps/scripts/4790.cs2 @@ -0,0 +1,317 @@ +int script_4790(int arg0) { + int ivar1; + ivar1 = 0; + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 13: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 14: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 15: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 16: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 17: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 18: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 19: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 20: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 21: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 22: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 23: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 24: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 25: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 26: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 27: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 28: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 29: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 30: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 31: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return ivar1; +} diff --git a/dumps/scripts/4791.cs2 b/dumps/scripts/4791.cs2 new file mode 100644 index 000000000..0be3110ab --- /dev/null +++ b/dumps/scripts/4791.cs2 @@ -0,0 +1,256 @@ +cs2func_script_4791_struct(7,1,0) script_4791(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + string svar0; + ivar1 = -1; + svar0 = ""; + ivar2 = 0; + ivar3 = cs2method_3408(105, 74, 4008, arg0); + if (ivar3 == -1) { + messageType0("Clan Build Tick : Job ID " + intToStr(arg0) + " has no associated struct. Please report this as a bug, quoting this line."); + return newstruct cs2func_script_4791_struct(-1, 0, 0, 0, 0, 0, 0, ""); + } + ivar4 = getOtherCommonData(ivar3, 1481); + ivar5 = getOtherCommonData(ivar3, 1482); + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = -1; + ivar10 = 0; + ivar11 = -1; + ivar12 = -1; + ivar13 = 0; + if (citadelConfigsInitialized()) { + switch (ivar4) { + case 1: + svar0 = "Stronghold"; + ivar1 = 7418; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + svar0 = "Storehouse"; + ivar1 = 7419; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + svar0 = "Battlefield"; + ivar1 = 7417; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + switch (ivar5) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + messageType0("Clan Build Tick : No skill plot found with index " + intToStr(ivar5) + ". Please report this as a bug, quoting this line."); + svar0 = cs2method_3408(105, 115, 4287, ivar8); + ivar1 = cs2method_3408(105, 100, 4288, ivar8); + break; + case 5: + switch (ivar5) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + messageType0("Clan Build Tick : No cosmetic job slot found with index " + intToStr(ivar5) + ". Please report this as a bug, quoting this line."); + ivar9 = script_4820(ivar5); + ivar11 = script_4823(ivar5); + ivar12 = script_4826(ivar5); + if (((arg0 == 16) || (arg0 == 17)) || (arg0 == 18)) { + svar0 = "Reset hotspot (slot " + intToStr(ivar5) + ")."; + ivar1 = 6496; + } else { + svar0 = cs2method_3408(105, 115, ivar11, ivar8); + ivar1 = cs2method_3408(105, 100, ivar12, ivar8); + } + break; + default: + messageType0("Clan Build Tick : Unexpected job building class " + intToStr(ivar4) + ". Please report this as a bug, quoting this line."); + return newstruct cs2func_script_4791_struct(-1, 0, 0, 0, 0, 0, 0, ""); + } + } else { + messageType0("Clan Build Tick : Could not access clan profile."); + return newstruct cs2func_script_4791_struct(-1, 0, 0, 0, 0, 0, 0, ""); + } + if ((arg0 > 600) && (ivar4 != 5)) { + ivar6 = add(ivar6, 1); + } + return newstruct cs2func_script_4791_struct(ivar1, ivar6, ivar7, ivar2, ivar4, ivar5, ivar8, svar0); +} diff --git a/dumps/scripts/4792.cs2 b/dumps/scripts/4792.cs2 new file mode 100644 index 000000000..7048dd19f --- /dev/null +++ b/dumps/scripts/4792.cs2 @@ -0,0 +1,117 @@ +cs2func_script_4792_struct(6,0,0) script_4792(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + string svar0; + int stack_dump0; + cs2func_script_4791_struct(7,1,0) structdump_1; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = cs2method_3408(105, 74, 4008, arg0); + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = -1; + svar0 = ""; + if ((arg0 < 1) || (arg0 > 900)) { + messageType0("Clan Build Tick : Attempting to look up build cost for invalid job " + intToStr(arg0) + "."); + return newstruct cs2func_script_4792_struct(0, 0, 0, 0, 0, 0); + } + stack_dump0 = arg0; + structdump_1 = script_4791(stack_dump0); + ivar10 = structdump_1.intpart_6; + ivar9 = structdump_1.intpart_5; + ivar8 = structdump_1.intpart_4; + ivar13 = structdump_1.intpart_3; + ivar12 = structdump_1.intpart_2; + ivar11 = structdump_1.intpart_1; + svar0 = structdump_1.stringpart_0; + ivar21 = structdump_1.intpart_0; + ivar22 = -1; + if (arg0 < 600) { + switch (ivar8) { + case 1: + ivar22 = 2021; + break; + case 2: + ivar22 = 2022; + break; + case 3: + ivar22 = 2023; + break; + case 4: + ivar22 = cs2method_3408(105, 74, 4010, ivar10); + break; + case 5: + ivar22 = ivar14; + } + } else { + switch (ivar8) { + case 1: + ivar22 = 2031; + break; + case 2: + ivar22 = 2032; + break; + case 3: + ivar22 = 2033; + break; + case 4: + ivar22 = cs2method_3408(105, 74, 4009, ivar10); + break; + case 5: + ivar22 = ivar14; + } + } + if (((boolean)arg1)) { + return newstruct cs2func_script_4792_struct(0, 0, 0, 0, 0, 0); + } + switch (arg1) { + case 1: + return newstruct cs2func_script_4792_struct(getOtherCommonData(ivar22, 1483), getOtherCommonData(ivar22, 1490), getOtherCommonData(ivar22, 1497), getOtherCommonData(ivar22, 1504), getOtherCommonData(ivar22, 1511), getOtherCommonData(ivar22, 1518)); + case 2: + return newstruct cs2func_script_4792_struct(getOtherCommonData(ivar22, 1484), getOtherCommonData(ivar22, 1491), getOtherCommonData(ivar22, 1498), getOtherCommonData(ivar22, 1505), getOtherCommonData(ivar22, 1512), getOtherCommonData(ivar22, 1519)); + case 3: + return newstruct cs2func_script_4792_struct(getOtherCommonData(ivar22, 1485), getOtherCommonData(ivar22, 1492), getOtherCommonData(ivar22, 1499), getOtherCommonData(ivar22, 1506), getOtherCommonData(ivar22, 1513), getOtherCommonData(ivar22, 1520)); + case 4: + return newstruct cs2func_script_4792_struct(getOtherCommonData(ivar22, 1486), getOtherCommonData(ivar22, 1493), getOtherCommonData(ivar22, 1500), getOtherCommonData(ivar22, 1507), getOtherCommonData(ivar22, 1514), getOtherCommonData(ivar22, 1521)); + case 5: + return newstruct cs2func_script_4792_struct(getOtherCommonData(ivar22, 1487), getOtherCommonData(ivar22, 1494), getOtherCommonData(ivar22, 1501), getOtherCommonData(ivar22, 1508), getOtherCommonData(ivar22, 1515), getOtherCommonData(ivar22, 1522)); + case 6: + return newstruct cs2func_script_4792_struct(getOtherCommonData(ivar22, 1488), getOtherCommonData(ivar22, 1495), getOtherCommonData(ivar22, 1502), getOtherCommonData(ivar22, 1509), getOtherCommonData(ivar22, 1516), getOtherCommonData(ivar22, 1523)); + case 7: + return newstruct cs2func_script_4792_struct(getOtherCommonData(ivar22, 1489), getOtherCommonData(ivar22, 1496), getOtherCommonData(ivar22, 1503), getOtherCommonData(ivar22, 1510), getOtherCommonData(ivar22, 1517), getOtherCommonData(ivar22, 1524)); + } + return newstruct cs2func_script_4792_struct(0, 0, 0, 0, 0, 0); +} diff --git a/dumps/scripts/4793.cs2 b/dumps/scripts/4793.cs2 new file mode 100644 index 000000000..1c96040b1 --- /dev/null +++ b/dumps/scripts/4793.cs2 @@ -0,0 +1,200 @@ +cs2func_script_4793_struct(6,0,0) script_4793(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + switch (arg1) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + break; + case 5: + SWITCH (arg1) { + case 1: + GOTO flow_19 + case 2: + GOTO flow_20 + case 3: + GOTO flow_21 + } + break; + flow_19: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + flow_20: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + flow_21: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return newstruct cs2func_script_4793_struct(0, 0, 0, 0, 0, 0); +} diff --git a/dumps/scripts/4794.cs2 b/dumps/scripts/4794.cs2 new file mode 100644 index 000000000..ea0f88483 --- /dev/null +++ b/dumps/scripts/4794.cs2 @@ -0,0 +1,108 @@ +cs2func_script_4794_struct(25,0,0) script_4794(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + cs2func_script_4795_struct(32,0,0) structdump_8; + ivar8 = 1; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + ivar27 = 0; + ivar28 = 0; + ivar29 = 0; + ivar30 = 0; + ivar31 = 0; + ivar32 = 0; + ivar33 = 0; + while ((ivar8 <= arg0) && (ivar8 != 0)) { + stack_dump0 = ivar8; + stack_dump1 = arg1; + stack_dump2 = arg2; + stack_dump3 = arg3; + stack_dump4 = arg4; + stack_dump5 = arg5; + stack_dump6 = arg6; + stack_dump7 = arg7; + structdump_8 = script_4795(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7); + ivar27 = structdump_8.intpart_31; + ivar26 = structdump_8.intpart_30; + ivar25 = structdump_8.intpart_29; + ivar24 = structdump_8.intpart_28; + ivar23 = structdump_8.intpart_27; + ivar22 = structdump_8.intpart_26; + ivar21 = structdump_8.intpart_25; + ivar33 = structdump_8.intpart_24; + ivar32 = structdump_8.intpart_23; + ivar31 = structdump_8.intpart_22; + ivar30 = structdump_8.intpart_21; + ivar29 = structdump_8.intpart_20; + ivar28 = structdump_8.intpart_19; + ivar20 = structdump_8.intpart_18; + ivar19 = structdump_8.intpart_17; + ivar18 = structdump_8.intpart_16; + ivar17 = structdump_8.intpart_15; + ivar16 = structdump_8.intpart_14; + ivar15 = structdump_8.intpart_13; + ivar14 = structdump_8.intpart_12; + ivar13 = structdump_8.intpart_11; + ivar12 = structdump_8.intpart_10; + ivar11 = structdump_8.intpart_9; + ivar10 = structdump_8.intpart_8; + ivar9 = structdump_8.intpart_7; + arg7 = structdump_8.intpart_6; + arg6 = structdump_8.intpart_5; + arg5 = structdump_8.intpart_4; + arg4 = structdump_8.intpart_3; + arg3 = structdump_8.intpart_2; + arg2 = structdump_8.intpart_1; + arg1 = structdump_8.intpart_0; + ivar8 = add(ivar8, 1); + } + return newstruct cs2func_script_4794_struct(ivar9, ivar10, ivar11, ivar12, ivar13, ivar14, ivar15, ivar16, ivar17, ivar18, ivar19, ivar20, ivar28, ivar29, ivar30, ivar31, ivar32, ivar33, ivar21, ivar22, ivar23, ivar24, ivar25, ivar26, ivar27); +} diff --git a/dumps/scripts/4795.cs2 b/dumps/scripts/4795.cs2 new file mode 100644 index 000000000..84e0ce2d5 --- /dev/null +++ b/dumps/scripts/4795.cs2 @@ -0,0 +1,211 @@ +cs2func_script_4795_struct(32,0,0) script_4795(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + int ivar37; + int ivar38; + int ivar39; + int ivar40; + int ivar41; + int ivar42; + int ivar43; + int ivar44; + int ivar45; + int ivar46; + string svar0; + int stack_dump0; + cs2func_script_4791_struct(7,1,0) structdump_1; + cs2func_script_4724_struct(6,0,0) structdump_2; + cs2func_script_4724_struct(6,0,0) structdump_3; + cs2func_script_4724_struct(6,0,0) structdump_4; + int stack_dump5; + cs2func_script_4792_struct(6,0,0) structdump_6; + cs2func_script_4793_struct(6,0,0) structdump_7; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + ivar27 = script_4790(arg0); + ivar28 = -1; + svar0 = ""; + ivar29 = 0; + ivar30 = 0; + ivar31 = 0; + ivar32 = 0; + ivar33 = 0; + ivar34 = 0; + if ((ivar27 < 1) || (ivar27 > 900)) { + messageType0("Clan Build Tick : Check resources for invalid job " + intToStr(ivar27) + " at position " + intToStr(arg0) + "."); + return newstruct cs2func_script_4795_struct(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + stack_dump0 = ivar27; + structdump_1 = script_4791(stack_dump0); + ivar33 = structdump_1.intpart_6; + ivar32 = structdump_1.intpart_5; + ivar29 = structdump_1.intpart_4; + ivar34 = structdump_1.intpart_3; + ivar31 = structdump_1.intpart_2; + ivar30 = structdump_1.intpart_1; + svar0 = structdump_1.stringpart_0; + ivar28 = structdump_1.intpart_0; + if ((ivar27 > 300) && (ivar27 < 600)) { + ivar30 = subtract(ivar30, ivar31); + } + if (ivar27 == 616) { + stack_dump0 = 1; + structdump_2 = script_4724(stack_dump0); + ivar13 = structdump_2.intpart_5; + ivar12 = structdump_2.intpart_4; + ivar11 = structdump_2.intpart_3; + ivar10 = structdump_2.intpart_2; + ivar9 = structdump_2.intpart_1; + ivar8 = structdump_2.intpart_0; + } else if (ivar27 == 617) { + stack_dump0 = 2; + structdump_3 = script_4724(stack_dump0); + ivar13 = structdump_3.intpart_5; + ivar12 = structdump_3.intpart_4; + ivar11 = structdump_3.intpart_3; + ivar10 = structdump_3.intpart_2; + ivar9 = structdump_3.intpart_1; + ivar8 = structdump_3.intpart_0; + } else if (ivar27 == 618) { + stack_dump0 = 3; + structdump_4 = script_4724(stack_dump0); + ivar13 = structdump_4.intpart_5; + ivar12 = structdump_4.intpart_4; + ivar11 = structdump_4.intpart_3; + ivar10 = structdump_4.intpart_2; + ivar9 = structdump_4.intpart_1; + ivar8 = structdump_4.intpart_0; + } else { + stack_dump0 = ivar27; + stack_dump5 = ivar30; + structdump_6 = script_4792(stack_dump0, stack_dump5); + ivar13 = structdump_6.intpart_5; + ivar12 = structdump_6.intpart_4; + ivar11 = structdump_6.intpart_3; + ivar10 = structdump_6.intpart_2; + ivar9 = structdump_6.intpart_1; + ivar8 = structdump_6.intpart_0; + } + if (((ivar34 == 2) && (ivar27 > 300)) && (ivar27 < 600)) { + ivar8 = multiply(ivar8, 2); + ivar9 = multiply(ivar9, 2); + ivar10 = multiply(ivar10, 2); + ivar11 = multiply(ivar11, 2); + ivar12 = multiply(ivar12, 2); + ivar13 = multiply(ivar13, 2); + } + if (ivar27 < 300) { + return newstruct cs2func_script_4795_struct(arg1, arg2, arg3, arg4, arg5, arg6, arg7, ivar8, ivar9, ivar10, ivar11, ivar12, ivar13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + ivar35 = ivar8; + ivar36 = ivar9; + ivar37 = ivar10; + ivar38 = ivar11; + ivar39 = ivar12; + ivar40 = ivar13; + if (ivar27 > 600) { + stack_dump0 = ivar29; + stack_dump5 = ivar32; + structdump_7 = script_4793(stack_dump0, stack_dump5); + ivar19 = structdump_7.intpart_5; + ivar18 = structdump_7.intpart_4; + ivar17 = structdump_7.intpart_3; + ivar16 = structdump_7.intpart_2; + ivar15 = structdump_7.intpart_1; + ivar14 = structdump_7.intpart_0; + } + ivar35 = max(0, subtract(ivar35, ivar14)); + ivar36 = max(0, subtract(ivar36, ivar15)); + ivar37 = max(0, subtract(ivar37, ivar16)); + ivar38 = max(0, subtract(ivar38, ivar17)); + ivar39 = max(0, subtract(ivar39, ivar18)); + ivar40 = max(0, subtract(ivar40, ivar19)); + if (((((boolean)ivar35) && ((boolean)ivar36)) && (((boolean)ivar37) && ((boolean)ivar38))) && (((boolean)ivar39) && ((boolean)ivar40))) { + return newstruct cs2func_script_4795_struct(arg1, arg2, arg3, arg4, arg5, arg6, arg7, ivar8, ivar9, ivar10, ivar11, ivar12, ivar13, ivar14, ivar15, ivar16, ivar17, ivar18, ivar19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100); + } + ivar41 = min(ivar35, arg1); + ivar42 = min(ivar36, arg2); + ivar43 = min(ivar37, arg3); + ivar44 = min(ivar38, arg4); + ivar45 = min(ivar39, arg5); + ivar46 = min(ivar40, arg6); + ivar35 = max(0, subtract(ivar35, ivar41)); + ivar36 = max(0, subtract(ivar36, ivar42)); + ivar37 = max(0, subtract(ivar37, ivar43)); + ivar38 = max(0, subtract(ivar38, ivar44)); + ivar39 = max(0, subtract(ivar39, ivar45)); + ivar40 = max(0, subtract(ivar40, ivar46)); + arg1 = max(0, subtract(arg1, ivar41)); + arg2 = max(0, subtract(arg2, ivar42)); + arg3 = max(0, subtract(arg3, ivar43)); + arg4 = max(0, subtract(arg4, ivar44)); + arg5 = max(0, subtract(arg5, ivar45)); + arg6 = max(0, subtract(arg6, ivar46)); + if (((((boolean)ivar35) && ((boolean)ivar36)) && (((boolean)ivar37) && ((boolean)ivar38))) && (((boolean)ivar39) && ((boolean)ivar40))) { + return newstruct cs2func_script_4795_struct(arg1, arg2, arg3, arg4, arg5, arg6, arg7, ivar8, ivar9, ivar10, ivar11, ivar12, ivar13, ivar14, ivar15, ivar16, ivar17, ivar18, ivar19, ivar41, ivar42, ivar43, ivar44, ivar45, ivar46, 0, 0, 0, 0, 0, 0, 100); + } + ivar20 = min(ivar35, divide(arg7, 1)); + ivar35 = max(0, subtract(ivar35, ivar20)); + arg7 = subtract(arg7, multiply(ivar20, 1)); + ivar21 = min(ivar36, divide(arg7, 1)); + ivar36 = max(0, subtract(ivar36, ivar21)); + arg7 = subtract(arg7, multiply(ivar21, 1)); + ivar22 = min(ivar37, divide(arg7, 3)); + ivar37 = max(0, subtract(ivar37, ivar22)); + arg7 = subtract(arg7, multiply(ivar22, 3)); + ivar23 = min(ivar38, divide(arg7, 1)); + ivar38 = max(0, subtract(ivar38, ivar23)); + arg7 = subtract(arg7, multiply(ivar23, 1)); + ivar24 = min(ivar39, divide(arg7, 1)); + ivar39 = max(0, subtract(ivar39, ivar24)); + arg7 = subtract(arg7, multiply(ivar24, 1)); + ivar25 = min(ivar40, divide(arg7, 3)); + ivar40 = max(0, subtract(ivar40, ivar25)); + arg7 = subtract(arg7, multiply(ivar25, 3)); + ivar26 = script_4796(ivar35, ivar8, ivar36, ivar9, ivar37, ivar10, ivar38, ivar11, ivar39, ivar12, ivar40, ivar13); + return newstruct cs2func_script_4795_struct(arg1, arg2, arg3, arg4, arg5, arg6, arg7, ivar8, ivar9, ivar10, ivar11, ivar12, ivar13, ivar14, ivar15, ivar16, ivar17, ivar18, ivar19, ivar41, ivar42, ivar43, ivar44, ivar45, ivar46, ivar20, ivar21, ivar22, ivar23, ivar24, ivar25, ivar26); +} diff --git a/dumps/scripts/4796.cs2 b/dumps/scripts/4796.cs2 new file mode 100644 index 000000000..254a74941 --- /dev/null +++ b/dumps/scripts/4796.cs2 @@ -0,0 +1,93 @@ +int script_4796(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11) { + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + flow_0: + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + if (arg1 > 0) { + ivar14 = divide(multiply(arg0, 1000), arg1); + ivar12 = add(ivar12, 1); + } + if (arg3 > 0) { + ivar15 = divide(multiply(arg2, 1000), arg3); + ivar12 = add(ivar12, 1); + } + if (arg5 > 0) { + ivar16 = divide(multiply(arg4, 1000), arg5); + ivar12 = add(ivar12, 1); + } + if (arg7 > 0) { + ivar17 = divide(multiply(arg6, 1000), arg7); + ivar12 = add(ivar12, 1); + } + if (arg9 > 0) { + ivar18 = divide(multiply(arg8, 1000), arg9); + ivar12 = add(ivar12, 1); + } + if (arg11 > 0) { + ivar19 = divide(multiply(arg10, 1000), arg11); + ivar12 = add(ivar12, 1); + } + ivar12 = max(ivar12, 1); + ivar20 = divide(add(add(add(add(add(ivar14, ivar15), ivar16), ivar17), ivar18), ivar19), multiply(ivar12, 10)); + ivar13 = subtract(100, ivar20); + IF (ivar13 == 100) + GOTO flow_13 + GOTO flow_26 + flow_13: + IF (arg0 != arg1) + GOTO flow_14 + GOTO flow_15 + flow_14: + IF (arg0 != 0) + GOTO flow_25 + flow_15: + IF (arg2 != arg3) + GOTO flow_16 + GOTO flow_17 + flow_16: + IF (arg2 != 0) + GOTO flow_25 + flow_17: + IF (arg4 != arg5) + GOTO flow_18 + GOTO flow_19 + flow_18: + IF (arg4 != 0) + GOTO flow_25 + flow_19: + IF (arg6 != arg7) + GOTO flow_20 + GOTO flow_21 + flow_20: + IF (arg6 != 0) + GOTO flow_25 + flow_21: + IF (arg8 != arg9) + GOTO flow_22 + GOTO flow_23 + flow_22: + IF (arg8 != 0) + GOTO flow_25 + flow_23: + IF ((arg10 != arg11) && (arg10 != 0)) + GOTO flow_25 + GOTO flow_26 + flow_25: + ivar13 = 99; + flow_26: + return ivar13; +} diff --git a/dumps/scripts/4797.cs2 b/dumps/scripts/4797.cs2 new file mode 100644 index 000000000..c9adf07d7 --- /dev/null +++ b/dumps/scripts/4797.cs2 @@ -0,0 +1,106 @@ +cs2func_script_4797_struct(6,0,0) script_4797() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + string svar0; + int stack_dump0; + cs2func_script_4791_struct(7,1,0) structdump_1; + int stack_dump2; + cs2func_script_4792_struct(6,0,0) structdump_3; + flow_0: + ivar0 = 0; + ivar1 = 1; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = -1; + svar0 = ""; + IF (citadelConfigsInitialized() && (ivar1 <= 31)) + GOTO flow_2 + GOTO flow_11 + flow_1: + flow_2: + IF (((boolean)ivar8)) + GOTO flow_3 + GOTO flow_11 + flow_3: + ivar0 = script_4790(ivar1); + if (ivar0 > 600) { + ivar8 = 1; + } else if (ivar0 < 300) { + } else { + stack_dump0 = ivar0; + structdump_1 = script_4791(stack_dump0); + ivar4 = structdump_1.intpart_6; + ivar3 = structdump_1.intpart_5; + ivar2 = structdump_1.intpart_4; + ivar7 = structdump_1.intpart_3; + ivar6 = structdump_1.intpart_2; + ivar5 = structdump_1.intpart_1; + svar0 = structdump_1.stringpart_0; + ivar21 = structdump_1.intpart_0; + ivar5 = subtract(ivar5, ivar6); + stack_dump0 = ivar0; + stack_dump2 = ivar5; + structdump_3 = script_4792(stack_dump0, stack_dump2); + ivar11 = structdump_3.intpart_5; + ivar13 = structdump_3.intpart_4; + ivar12 = structdump_3.intpart_3; + ivar11 = structdump_3.intpart_2; + ivar10 = structdump_3.intpart_1; + ivar9 = structdump_3.intpart_0; + if (ivar7 == 2) { + ivar9 = multiply(ivar9, 2); + ivar10 = multiply(ivar10, 2); + ivar11 = multiply(ivar11, 2); + ivar12 = multiply(ivar12, 2); + ivar13 = multiply(ivar13, 2); + ivar14 = multiply(ivar14, 2); + } + ivar15 = add(ivar15, ivar9); + ivar16 = add(ivar16, ivar10); + ivar17 = add(ivar17, ivar11); + ivar18 = add(ivar18, ivar12); + ivar19 = add(ivar19, ivar13); + ivar20 = add(ivar20, ivar14); + } + ivar1 = add(ivar1, 1); + GOTO flow_1 + flow_11: + return newstruct cs2func_script_4797_struct(ivar15, ivar16, ivar17, ivar18, ivar19, ivar20); +} diff --git a/dumps/scripts/4798.cs2 b/dumps/scripts/4798.cs2 new file mode 100644 index 000000000..222f8835a --- /dev/null +++ b/dumps/scripts/4798.cs2 @@ -0,0 +1,50 @@ +int script_4798(int arg0) { + int ivar1; + int ivar2; + int stack_dump0; + ivar1 = 604; + ivar2 = 0; + if (arg0 == 603) { + stack_dump0 = 602; + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 4800 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (arg0 == 602) { + stack_dump0 = 603; + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 4800 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if ((arg0 >= 604) && (arg0 <= 615)) { + while (ivar1 <= 615) { + if (ivar1 != arg0) { + stack_dump0 = ivar1; + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 4800 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + ivar1 = add(ivar1, 1); + } + return 0; + } + return 0; +} diff --git a/dumps/scripts/4799.cs2 b/dumps/scripts/4799.cs2 new file mode 100644 index 000000000..a849f303e --- /dev/null +++ b/dumps/scripts/4799.cs2 @@ -0,0 +1,16 @@ +int script_4799() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 1; + while (ivar2 <= 31) { + ivar0 = script_4790(ivar2); + if ((ivar0 >= 604) && (ivar0 <= 615)) { + ivar1 = add(ivar1, 1); + } + ivar2 = add(ivar2, 1); + } + return ivar1; +} diff --git a/dumps/scripts/48.cs2 b/dumps/scripts/48.cs2 new file mode 100644 index 000000000..c612447d4 --- /dev/null +++ b/dumps/scripts/48.cs2 @@ -0,0 +1,7 @@ +void script_48() { + if ((((boolean)globalint_1034) && ((boolean)globalint_1027)) && (strLength(globalstring_202) > 0)) { + sendUnknownFriendPacketMethod3619(globalstring_202); + globalint_1034 = 2; + } + return; +} diff --git a/dumps/scripts/480.cs2 b/dumps/scripts/480.cs2 new file mode 100644 index 000000000..bf92bc109 --- /dev/null +++ b/dumps/scripts/480.cs2 @@ -0,0 +1,63 @@ +void script_480() { + setWidgetText(new WidgetPointer(1015,144), script_483(bitconfig_7520)); + if (bitconfig_7520 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,144)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,144)); + } + setWidgetText(new WidgetPointer(1015,146), script_483(bitconfig_7521)); + if (bitconfig_7521 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,146)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,146)); + } + setWidgetText(new WidgetPointer(1015,148), script_483(bitconfig_7526)); + if (bitconfig_7526 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,148)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,148)); + } + setWidgetText(new WidgetPointer(1015,150), script_483(bitconfig_7527)); + if (bitconfig_7527 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,150)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,150)); + } + setWidgetText(new WidgetPointer(1015,152), script_483(bitconfig_7530)); + if (bitconfig_7530 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,152)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,152)); + } + setWidgetText(new WidgetPointer(1015,154), script_483(bitconfig_7531)); + if (bitconfig_7531 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,154)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,154)); + } + setWidgetText(new WidgetPointer(1015,156), script_483(bitconfig_7532)); + if (bitconfig_7532 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,156)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,156)); + } + setWidgetText(new WidgetPointer(1015,158), script_483(bitconfig_7533)); + if (bitconfig_7533 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,158)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,158)); + } + setWidgetText(new WidgetPointer(1015,160), script_483(bitconfig_7534)); + if (bitconfig_7534 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,160)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,160)); + } + setWidgetText(new WidgetPointer(1015,162), script_483(bitconfig_7535)); + if (bitconfig_7535 > 0) { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,162)); + } else { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(1015,162)); + } + return; +} diff --git a/dumps/scripts/4800.cs2 b/dumps/scripts/4800.cs2 new file mode 100644 index 000000000..8cb077f5d --- /dev/null +++ b/dumps/scripts/4800.cs2 @@ -0,0 +1,13 @@ +?? script_4800(int arg0) { + int stack_dump0; + stack_dump0 = arg0; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/4801.cs2 b/dumps/scripts/4801.cs2 new file mode 100644 index 000000000..0ef5927f4 --- /dev/null +++ b/dumps/scripts/4801.cs2 @@ -0,0 +1,29 @@ +void script_4801(int arg0) { + flow_0: + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + } + globalint_1659 = 0; + setWidgetText(new WidgetPointer(1143,11), "Price: Low-High"); + GOTO flow_4 + flow_1: + globalint_1659 = 1; + setWidgetText(new WidgetPointer(1143,11), "Price: High-Low"); + GOTO flow_4 + flow_2: + globalint_1659 = 2; + setWidgetText(new WidgetPointer(1143,11), "Name: A-Z"); + GOTO flow_4 + flow_3: + globalint_1659 = 3; + setWidgetText(new WidgetPointer(1143,11), "Name: Z-A"); + flow_4: + setWidgetIsHidden(true, new WidgetPointer(1143,6)); + script_5350(bitconfig_9487, 74907774); + return; +} diff --git a/dumps/scripts/4802.cs2 b/dumps/scripts/4802.cs2 new file mode 100644 index 000000000..9a153ac4b --- /dev/null +++ b/dumps/scripts/4802.cs2 @@ -0,0 +1,4 @@ +void script_4802() { + script_4804(); + return; +} diff --git a/dumps/scripts/4803.cs2 b/dumps/scripts/4803.cs2 new file mode 100644 index 000000000..6131d0eb1 --- /dev/null +++ b/dumps/scripts/4803.cs2 @@ -0,0 +1,44 @@ +void script_4803(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = script_4819(bitconfig_9558); + ivar2 = cs2method_3408(105, 105, ivar1, arg0); + switch (bitconfig_9558) { + case 1: + if (ivar2 != bitconfig_9562) { + bitconfig_9562 = ivar2; + bitconfig_9563 = 1; + bitconfig_9567 = 0; + bitconfig_9568 = 0; + bitconfig_9569 = 0; + } + break; + case 2: + if (ivar2 != bitconfig_9571) { + bitconfig_9571 = ivar2; + bitconfig_9572 = 1; + bitconfig_9576 = 0; + bitconfig_9577 = 0; + bitconfig_9578 = 0; + } + break; + case 3: + if (ivar2 != bitconfig_9580) { + bitconfig_9580 = ivar2; + bitconfig_9581 = 1; + bitconfig_9585 = 0; + bitconfig_9586 = 0; + bitconfig_9587 = 0; + } + } + ivar3 = 0; + if (((boolean)script_4828(bitconfig_9558))) { + ivar3 = multiply(28, subtract(arg0, 1)); + setWidgetIsHidden(false, new WidgetPointer(1092,938)); + setWidgetPosition(0, ivar3, 0, 0, new WidgetPointer(1092,938)); + } + script_4846(1); + script_4804(); + return; +} diff --git a/dumps/scripts/4804.cs2 b/dumps/scripts/4804.cs2 new file mode 100644 index 000000000..45d47e927 --- /dev/null +++ b/dumps/scripts/4804.cs2 @@ -0,0 +1,120 @@ +void script_4804() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + ivar0 = script_4828(bitconfig_9558); + if (((boolean)ivar0)) { + script_4842(1); + script_4842(2); + script_4842(3); + switch (bitconfig_9558) { + case 1: + script_4846(bitconfig_9563); + break; + case 2: + script_4846(bitconfig_9572); + break; + case 3: + script_4846(bitconfig_9581); + } + } else { + script_4843(1); + script_4843(2); + script_4843(3); + } + script_4807(); + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = 0; + ivar6 = 1; + ivar7 = 1; + ivar8 = 0; + switch (bitconfig_9558) { + case 1: + ivar5 = bitconfig_9562; + ivar8 = bitconfig_9566; + break; + case 2: + ivar5 = bitconfig_9571; + ivar8 = bitconfig_9575; + break; + case 3: + ivar5 = bitconfig_9580; + ivar8 = bitconfig_9584; + } + if (((boolean)ivar5) && ((boolean)ivar8)) { + script_4940(); + return; + } + script_4942(); + ivar9 = script_4825(bitconfig_9558); + ivar10 = script_4822(bitconfig_9558); + if (((boolean)ivar8)) { + script_4846(1); + setWidgetSprite(-1, new WidgetPointer(1092,980)); + setWidgetText(new WidgetPointer(1092,981), "Reset Hotspot to its default state"); + setWidgetText(new WidgetPointer(1092,1153), ""); + setWidgetText(new WidgetPointer(1092,1154), ""); + setWidgetText(new WidgetPointer(1092,1155), ""); + setWidgetText(new WidgetPointer(1092,1073), ""); + setWidgetText(new WidgetPointer(1092,1074), ""); + setWidgetText(new WidgetPointer(1092,1075), ""); + setWidgetText(new WidgetPointer(1092,987), ""); + setWidgetText(new WidgetPointer(1092,988), ""); + setWidgetText(new WidgetPointer(1092,989), ""); + script_4805(1, 1); + script_4805(2, 1); + script_4805(3, 1); + script_4805(1, 2); + script_4805(2, 2); + script_4805(3, 2); + script_4805(1, 3); + script_4805(2, 3); + script_4805(3, 3); + } else { + if (ivar9 != -1) { + setWidgetSprite(cs2method_3408(105, 100, ivar9, ivar5), new WidgetPointer(1092,980)); + } + if (ivar10 != -1) { + setWidgetText(new WidgetPointer(1092,981), cs2method_3408(105, 115, ivar10, ivar5)); + } + ivar1 = cs2method_3408(105, 103, 4043, ivar5); + if ((ivar1 == -1) && ((boolean)ivar8)) { + return; + } + while (ivar6 <= 3) { + ivar2 = cs2method_3408(105, 103, ivar1, ivar6); + if (ivar2 != -1) { + while (ivar7 <= 3) { + ivar3 = cs2method_3408(105, 103, ivar2, ivar7); + if (ivar3 != -1) { + script_4806(ivar3, ivar6, ivar7, ivar0, ivar5); + } else { + script_4805(ivar6, ivar7); + } + ivar3 = -1; + ivar7 = add(ivar7, 1); + } + } else { + script_4842(ivar6); + } + ivar7 = 1; + ivar6 = add(ivar6, 1); + } + script_4838(); + script_4810(); + } + script_4809(); + script_4814(); + return; +} diff --git a/dumps/scripts/4805.cs2 b/dumps/scripts/4805.cs2 new file mode 100644 index 000000000..771eb6b57 --- /dev/null +++ b/dumps/scripts/4805.cs2 @@ -0,0 +1,45 @@ +void script_4805(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int stack_dump0; + int stack_dump1; + cs2func_script_4818_struct(11,0,0) structdump_2; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + stack_dump0 = arg0; + stack_dump1 = arg1; + structdump_2 = script_4818(stack_dump0, stack_dump1); + ivar12 = structdump_2.intpart_10; + ivar11 = structdump_2.intpart_9; + ivar10 = structdump_2.intpart_8; + ivar9 = structdump_2.intpart_7; + ivar8 = structdump_2.intpart_6; + ivar7 = structdump_2.intpart_5; + ivar6 = structdump_2.intpart_4; + ivar5 = structdump_2.intpart_3; + ivar4 = structdump_2.intpart_2; + ivar3 = structdump_2.intpart_1; + ivar2 = structdump_2.intpart_0; + setWidgetSize(0, 0, 1, 0, new WidgetPointer(ivar2)); + setWidgetIntegerNode(1564, 0, new WidgetPointer(ivar2)); + setWidgetIsHidden(true, new WidgetPointer(ivar2)); + return; +} diff --git a/dumps/scripts/4806.cs2 b/dumps/scripts/4806.cs2 new file mode 100644 index 000000000..c3c916824 --- /dev/null +++ b/dumps/scripts/4806.cs2 @@ -0,0 +1,188 @@ +void script_4806(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int stack_dump0; + int stack_dump1; + cs2func_script_4818_struct(11,0,0) structdump_2; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + ivar14 = -1; + ivar15 = -1; + stack_dump0 = arg1; + stack_dump1 = arg2; + structdump_2 = script_4818(stack_dump0, stack_dump1); + ivar15 = structdump_2.intpart_10; + ivar14 = structdump_2.intpart_9; + ivar13 = structdump_2.intpart_8; + ivar12 = structdump_2.intpart_7; + ivar11 = structdump_2.intpart_6; + ivar10 = structdump_2.intpart_5; + ivar9 = structdump_2.intpart_4; + ivar8 = structdump_2.intpart_3; + ivar7 = structdump_2.intpart_2; + ivar6 = structdump_2.intpart_1; + ivar5 = structdump_2.intpart_0; + switch (arg2) { + case 1: + setWidgetText(new WidgetPointer(ivar15), cs2method_3408(105, 115, 4044, arg4)); + break; + case 2: + setWidgetText(new WidgetPointer(ivar15), cs2method_3408(105, 115, 4045, arg4)); + break; + case 3: + setWidgetText(new WidgetPointer(ivar15), cs2method_3408(105, 115, 4046, arg4)); + } + setWidgetIsHidden(false, new WidgetPointer(ivar5)); + ivar16 = 0; + ivar17 = 1; + ivar18 = -1; + ivar19 = 0; + switch (bitconfig_9558) { + flow_5: + case 1: + switch (arg2) { + case 1: + ivar19 = bitconfig_9567; + break; + case 2: + ivar19 = bitconfig_9568; + break; + case 3: + ivar19 = bitconfig_9569; + } + break; + case 2: + switch (arg2) { + case 1: + ivar19 = bitconfig_9576; + break; + case 2: + ivar19 = bitconfig_9577; + break; + case 3: + ivar19 = bitconfig_9578; + } + break; + case 3: + SWITCH (arg2) { + case 1: + GOTO flow_16 + case 2: + GOTO flow_17 + case 3: + GOTO flow_18 + } + break; + flow_16: + ivar19 = bitconfig_9585; + break; + flow_17: + ivar19 = bitconfig_9586; + break; + flow_18: + ivar19 = bitconfig_9587; + } + while (ivar17 <= getCommonDefinitionSize(arg0)) { + ivar18 = cs2method_3408(105, 74, arg0, ivar17); + if (ivar18 != -1) { + createExtraChild(new WidgetPointer(ivar14), 3, ivar16); + setWidgetSize(0, 26, 1, 0); + setWidgetPosition(0, multiply(ivar16, 27), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(44, 40, 32)); + createExtraChild(new WidgetPointer(ivar6), 5, ivar16); + setWidgetSprite(getOtherCommonData(ivar18, 1565)); + setWidgetSize(22, 22, 0, 0); + setWidgetPosition(0, add(2, multiply(ivar16, 27)), 0, 0); + setScriptCallOnMouseOver(4812, getOtherCommonData(ivar18, 1566), getOtherCommonData(ivar18, 1565), getOtherCommonData(ivar18, 1567), 25, "sdii"); + setScriptCallOnMouseExit(4813, ""); + createExtraChild(new WidgetPointer(ivar7), 5, ivar16); + setWidgetSprite(getOtherCommonData(ivar18, 1572)); + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(1, add(2, multiply(ivar16, 27)), 0, 0); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,1254), "I"); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,1254), new WidgetPointer(-32768,3), -2147483643, getOtherCommonData(ivar18, 1570), 120, 3793, 3793, 16777215, 13, 4, 2, -2147483647, -2147483646, "IIisifdiiiiii"); + createExtraChild(new WidgetPointer(ivar10), 4, ivar16); + setWidgetText(intToStr(getOtherCommonData(ivar18, 1573))); + setWidgetSize(0, 26, 1, 0); + setWidgetPosition(0, multiply(ivar16, 27), 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + if (ivar8 != -1) { + createExtraChild(new WidgetPointer(ivar8), 5, ivar16); + setWidgetSprite(getOtherCommonData(ivar18, 1576)); + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(1, add(2, multiply(ivar16, 27)), 0, 0); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,1254), "I"); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,1254), new WidgetPointer(-32768,3), -2147483643, getOtherCommonData(ivar18, 1574), 120, 3793, 3793, 16777215, 13, 4, 2, -2147483647, -2147483646, "IIisifdiiiiii"); + } + if (ivar11 != -1) { + createExtraChild(new WidgetPointer(ivar11), 4, ivar16); + setWidgetText(intToStr(getOtherCommonData(ivar18, 1577))); + setWidgetSize(0, 26, 1, 0); + setWidgetPosition(0, multiply(ivar16, 27), 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + } + if (ivar9 != -1) { + createExtraChild(new WidgetPointer(ivar9), 5, ivar16); + setWidgetSprite(getOtherCommonData(ivar18, 1580)); + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(0, add(2, multiply(ivar16, 27)), 0, 0); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,1254), "I"); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,1254), new WidgetPointer(-32768,3), -2147483643, getOtherCommonData(ivar18, 1578), 120, 3793, 3793, 16777215, 13, 4, 2, -2147483647, -2147483646, "IIisifdiiiiii"); + } + if (ivar12 != -1) { + createExtraChild(new WidgetPointer(ivar12), 4, ivar16); + setWidgetText(intToStr(getOtherCommonData(ivar18, 1581))); + setWidgetSize(0, 26, 1, 0); + setWidgetPosition(0, multiply(ivar16, 27), 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + } + createExtraChild(new WidgetPointer(ivar13), 5, ivar16); + setWidgetSize(16, 16, 0, 0); + setWidgetPosition(1, add(5, multiply(ivar16, 27)), 0, 0); + if (((boolean)arg3)) { + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(4832, new WidgetPointer(-32768,3), -2147483643, "Ii"); + } + if (ivar19 == add(ivar16, 1)) { + setWidgetSprite(6004); + } else { + setWidgetSprite(6009); + } + ivar16 = add(ivar16, 1); + } + ivar17 = add(ivar17, 1); + ivar18 = -1; + } + setWidgetIntegerNode(1564, multiply(ivar16, 27), new WidgetPointer(ivar5)); + return; +} diff --git a/dumps/scripts/4807.cs2 b/dumps/scripts/4807.cs2 new file mode 100644 index 000000000..f1ecf45d3 --- /dev/null +++ b/dumps/scripts/4807.cs2 @@ -0,0 +1,75 @@ +void script_4807() { + deleteAllExtraChilds(new WidgetPointer(1092,1180)); + deleteAllExtraChilds(new WidgetPointer(1092,1191)); + deleteAllExtraChilds(new WidgetPointer(1092,1190)); + deleteAllExtraChilds(new WidgetPointer(1092,1189)); + deleteAllExtraChilds(new WidgetPointer(1092,1188)); + deleteAllExtraChilds(new WidgetPointer(1092,1182)); + deleteAllExtraChilds(new WidgetPointer(1092,1168)); + deleteAllExtraChilds(new WidgetPointer(1092,1179)); + deleteAllExtraChilds(new WidgetPointer(1092,1178)); + deleteAllExtraChilds(new WidgetPointer(1092,1177)); + deleteAllExtraChilds(new WidgetPointer(1092,1176)); + deleteAllExtraChilds(new WidgetPointer(1092,1170)); + deleteAllExtraChilds(new WidgetPointer(1092,1156)); + deleteAllExtraChilds(new WidgetPointer(1092,1167)); + deleteAllExtraChilds(new WidgetPointer(1092,1166)); + deleteAllExtraChilds(new WidgetPointer(1092,1165)); + deleteAllExtraChilds(new WidgetPointer(1092,1164)); + deleteAllExtraChilds(new WidgetPointer(1092,1158)); + deleteAllExtraChilds(new WidgetPointer(1092,1104)); + deleteAllExtraChilds(new WidgetPointer(1092,1117)); + deleteAllExtraChilds(new WidgetPointer(1092,1116)); + deleteAllExtraChilds(new WidgetPointer(1092,1114)); + deleteAllExtraChilds(new WidgetPointer(1092,1115)); + deleteAllExtraChilds(new WidgetPointer(1092,1113)); + deleteAllExtraChilds(new WidgetPointer(1092,1112)); + deleteAllExtraChilds(new WidgetPointer(1092,1106)); + deleteAllExtraChilds(new WidgetPointer(1092,1090)); + deleteAllExtraChilds(new WidgetPointer(1092,1103)); + deleteAllExtraChilds(new WidgetPointer(1092,1102)); + deleteAllExtraChilds(new WidgetPointer(1092,1100)); + deleteAllExtraChilds(new WidgetPointer(1092,1101)); + deleteAllExtraChilds(new WidgetPointer(1092,1099)); + deleteAllExtraChilds(new WidgetPointer(1092,1098)); + deleteAllExtraChilds(new WidgetPointer(1092,1092)); + deleteAllExtraChilds(new WidgetPointer(1092,1076)); + deleteAllExtraChilds(new WidgetPointer(1092,1089)); + deleteAllExtraChilds(new WidgetPointer(1092,1088)); + deleteAllExtraChilds(new WidgetPointer(1092,1086)); + deleteAllExtraChilds(new WidgetPointer(1092,1087)); + deleteAllExtraChilds(new WidgetPointer(1092,1085)); + deleteAllExtraChilds(new WidgetPointer(1092,1084)); + deleteAllExtraChilds(new WidgetPointer(1092,1078)); + deleteAllExtraChilds(new WidgetPointer(1092,1022)); + deleteAllExtraChilds(new WidgetPointer(1092,1037)); + deleteAllExtraChilds(new WidgetPointer(1092,1036)); + deleteAllExtraChilds(new WidgetPointer(1092,1034)); + deleteAllExtraChilds(new WidgetPointer(1092,1032)); + deleteAllExtraChilds(new WidgetPointer(1092,1035)); + deleteAllExtraChilds(new WidgetPointer(1092,1033)); + deleteAllExtraChilds(new WidgetPointer(1092,1031)); + deleteAllExtraChilds(new WidgetPointer(1092,1030)); + deleteAllExtraChilds(new WidgetPointer(1092,1024)); + deleteAllExtraChilds(new WidgetPointer(1092,1006)); + deleteAllExtraChilds(new WidgetPointer(1092,1021)); + deleteAllExtraChilds(new WidgetPointer(1092,1020)); + deleteAllExtraChilds(new WidgetPointer(1092,1018)); + deleteAllExtraChilds(new WidgetPointer(1092,1016)); + deleteAllExtraChilds(new WidgetPointer(1092,1019)); + deleteAllExtraChilds(new WidgetPointer(1092,1017)); + deleteAllExtraChilds(new WidgetPointer(1092,1015)); + deleteAllExtraChilds(new WidgetPointer(1092,1014)); + deleteAllExtraChilds(new WidgetPointer(1092,1008)); + deleteAllExtraChilds(new WidgetPointer(1092,990)); + deleteAllExtraChilds(new WidgetPointer(1092,1005)); + deleteAllExtraChilds(new WidgetPointer(1092,1004)); + deleteAllExtraChilds(new WidgetPointer(1092,1002)); + deleteAllExtraChilds(new WidgetPointer(1092,1000)); + deleteAllExtraChilds(new WidgetPointer(1092,1003)); + deleteAllExtraChilds(new WidgetPointer(1092,1001)); + deleteAllExtraChilds(new WidgetPointer(1092,999)); + deleteAllExtraChilds(new WidgetPointer(1092,998)); + deleteAllExtraChilds(new WidgetPointer(1092,992)); + return; +} diff --git a/dumps/scripts/4808.cs2 b/dumps/scripts/4808.cs2 new file mode 100644 index 000000000..2b9469070 --- /dev/null +++ b/dumps/scripts/4808.cs2 @@ -0,0 +1,4 @@ +void script_4808() { + script_4809(); + return; +} diff --git a/dumps/scripts/4809.cs2 b/dumps/scripts/4809.cs2 new file mode 100644 index 000000000..ac4aeba69 --- /dev/null +++ b/dumps/scripts/4809.cs2 @@ -0,0 +1,20 @@ +void script_4809() { + setWidgetIsHidden(true, new WidgetPointer(1092,1209)); + setWidgetIsHidden(true, new WidgetPointer(1092,1135)); + setWidgetIsHidden(true, new WidgetPointer(1092,1055)); + setWidgetIsHidden(true, new WidgetPointer(1092,1193)); + setWidgetIsHidden(true, new WidgetPointer(1092,1119)); + setWidgetIsHidden(true, new WidgetPointer(1092,1039)); + if (((boolean)script_4828(bitconfig_9558))) { + setWidgetIsHidden(false, new WidgetPointer(1092,1193)); + setWidgetIsHidden(false, new WidgetPointer(1092,1119)); + setWidgetIsHidden(false, new WidgetPointer(1092,1039)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1092,1209)); + setWidgetIsHidden(false, new WidgetPointer(1092,1135)); + setWidgetIsHidden(false, new WidgetPointer(1092,1055)); + } + script_4840(); + script_4814(); + return; +} diff --git a/dumps/scripts/481.cs2 b/dumps/scripts/481.cs2 new file mode 100644 index 000000000..f4f9bd73b --- /dev/null +++ b/dumps/scripts/481.cs2 @@ -0,0 +1,67 @@ +void script_481() { + flow_0: + setWidgetSprite(3255, new WidgetPointer(1015,143)); + setWidgetSprite(3255, new WidgetPointer(1015,145)); + setWidgetSprite(3255, new WidgetPointer(1015,147)); + setWidgetSprite(3255, new WidgetPointer(1015,149)); + setWidgetSprite(3255, new WidgetPointer(1015,151)); + setWidgetSprite(3255, new WidgetPointer(1015,153)); + setWidgetSprite(3255, new WidgetPointer(1015,155)); + setWidgetSprite(3255, new WidgetPointer(1015,157)); + setWidgetSprite(3255, new WidgetPointer(1015,159)); + setWidgetSprite(3255, new WidgetPointer(1015,161)); + SWITCH (bitconfig_7512) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + case 8: + GOTO flow_8 + case 9: + GOTO flow_9 + case 10: + GOTO flow_10 + } + return; + flow_1: + setWidgetSprite(3257, new WidgetPointer(1015,143)); + GOTO flow_11 + flow_2: + setWidgetSprite(3257, new WidgetPointer(1015,145)); + GOTO flow_11 + flow_3: + setWidgetSprite(3257, new WidgetPointer(1015,147)); + GOTO flow_11 + flow_4: + setWidgetSprite(3257, new WidgetPointer(1015,149)); + GOTO flow_11 + flow_5: + setWidgetSprite(3257, new WidgetPointer(1015,151)); + GOTO flow_11 + flow_6: + setWidgetSprite(3257, new WidgetPointer(1015,153)); + GOTO flow_11 + flow_7: + setWidgetSprite(3257, new WidgetPointer(1015,155)); + GOTO flow_11 + flow_8: + setWidgetSprite(3257, new WidgetPointer(1015,157)); + GOTO flow_11 + flow_9: + setWidgetSprite(3257, new WidgetPointer(1015,159)); + GOTO flow_11 + flow_10: + setWidgetSprite(3257, new WidgetPointer(1015,161)); + flow_11: + return; +} diff --git a/dumps/scripts/4810.cs2 b/dumps/scripts/4810.cs2 new file mode 100644 index 000000000..9591bfadc --- /dev/null +++ b/dumps/scripts/4810.cs2 @@ -0,0 +1,97 @@ +void script_4810() { + int ivar0; + ivar0 = 1; + setWidgetPosition(4, ivar0, 0, 0, new WidgetPointer(1092,1153)); + ivar0 = add(ivar0, 13); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1180)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1180))); + if (getWidgetActualHeight(new WidgetPointer(1092,1168)) > 0) { + setWidgetIsHidden(false, new WidgetPointer(1092,1154)); + setWidgetPosition(4, ivar0, 0, 0, new WidgetPointer(1092,1154)); + ivar0 = add(ivar0, 13); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1168)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1168))); + } else { + setWidgetIsHidden(true, new WidgetPointer(1092,1154)); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1168)); + } + if (getWidgetActualHeight(new WidgetPointer(1092,1156)) > 0) { + setWidgetIsHidden(false, new WidgetPointer(1092,1155)); + setWidgetPosition(4, ivar0, 0, 0, new WidgetPointer(1092,1155)); + ivar0 = add(ivar0, 13); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1156)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1156))); + } else { + setWidgetIsHidden(true, new WidgetPointer(1092,1155)); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1156)); + } + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1192)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1192))); + setWidgetScrollMax(0, ivar0, new WidgetPointer(1092,1152)); + if (isWidgetHidden(new WidgetPointer(1092,1152))) { + script_31(71566296, 71566464, 5666, 5663, 5664, 5665, 5686, 5685); + } + ivar0 = 1; + setWidgetPosition(4, ivar0, 0, 0, new WidgetPointer(1092,1073)); + ivar0 = add(ivar0, 13); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1104)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1104))); + if (getWidgetActualHeight(new WidgetPointer(1092,1090)) > 0) { + setWidgetIsHidden(false, new WidgetPointer(1092,1074)); + setWidgetPosition(4, ivar0, 0, 0, new WidgetPointer(1092,1074)); + ivar0 = add(ivar0, 13); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1090)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1090))); + } else { + setWidgetIsHidden(true, new WidgetPointer(1092,1074)); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1090)); + } + if (getWidgetActualHeight(new WidgetPointer(1092,1076)) > 0) { + setWidgetIsHidden(false, new WidgetPointer(1092,1075)); + setWidgetPosition(4, ivar0, 0, 0, new WidgetPointer(1092,1075)); + ivar0 = add(ivar0, 13); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1076)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1076))); + } else { + setWidgetIsHidden(true, new WidgetPointer(1092,1075)); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1076)); + } + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1118)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1118))); + setWidgetScrollMax(0, ivar0, new WidgetPointer(1092,1072)); + if (isWidgetHidden(new WidgetPointer(1092,1072))) { + script_31(71566296, 71566384, 5666, 5663, 5664, 5665, 5686, 5685); + } + ivar0 = 1; + setWidgetPosition(4, ivar0, 0, 0, new WidgetPointer(1092,987)); + ivar0 = add(ivar0, 13); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1022)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1022))); + if (getWidgetActualHeight(new WidgetPointer(1092,1006)) > 0) { + setWidgetIsHidden(false, new WidgetPointer(1092,988)); + setWidgetPosition(4, ivar0, 0, 0, new WidgetPointer(1092,988)); + ivar0 = add(ivar0, 13); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1006)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1006))); + } else { + setWidgetIsHidden(true, new WidgetPointer(1092,988)); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1006)); + } + if (getWidgetActualHeight(new WidgetPointer(1092,990)) > 0) { + setWidgetIsHidden(false, new WidgetPointer(1092,989)); + setWidgetPosition(4, ivar0, 0, 0, new WidgetPointer(1092,989)); + ivar0 = add(ivar0, 13); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,990)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,990))); + } else { + setWidgetIsHidden(true, new WidgetPointer(1092,989)); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,990)); + } + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(1092,1038)); + ivar0 = add(add(ivar0, 1), getWidgetActualHeight(new WidgetPointer(1092,1038))); + setWidgetScrollMax(0, ivar0, new WidgetPointer(1092,986)); + if (isWidgetHidden(new WidgetPointer(1092,986))) { + script_31(71566296, 71566298, 5666, 5663, 5664, 5665, 5686, 5685); + } + return; +} diff --git a/dumps/scripts/4811.cs2 b/dumps/scripts/4811.cs2 new file mode 100644 index 000000000..f9dac0c13 --- /dev/null +++ b/dumps/scripts/4811.cs2 @@ -0,0 +1,4 @@ +void script_4811(int arg0) { + script_4940(); + return; +} diff --git a/dumps/scripts/4812.cs2 b/dumps/scripts/4812.cs2 new file mode 100644 index 000000000..264b7fe0f --- /dev/null +++ b/dumps/scripts/4812.cs2 @@ -0,0 +1,13 @@ +void script_4812(int arg0,int arg1,int arg2,string arg3) { + if (((boolean)script_4761(arg2))) { + return; + } + if (globalint_2 != 1) { + arg3 = arg3 + "
" + "Requires tier " + intToStr(arg1) + " resources."; + setWidgetSprite(arg0, new WidgetPointer(1092,1266)); + setWidgetText(new WidgetPointer(1092,1267), arg3); + setWidgetIsHidden(false, new WidgetPointer(1092,1255)); + globalint_2 = 1; + } + return; +} diff --git a/dumps/scripts/4813.cs2 b/dumps/scripts/4813.cs2 new file mode 100644 index 000000000..7f5794a13 --- /dev/null +++ b/dumps/scripts/4813.cs2 @@ -0,0 +1,7 @@ +void script_4813() { + setWidgetSprite(-1, new WidgetPointer(1092,1266)); + setWidgetText(new WidgetPointer(1092,1267), ""); + setWidgetIsHidden(true, new WidgetPointer(1092,1255)); + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/4814.cs2 b/dumps/scripts/4814.cs2 new file mode 100644 index 000000000..2e9607063 --- /dev/null +++ b/dumps/scripts/4814.cs2 @@ -0,0 +1,249 @@ +void script_4814() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + string svar0; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + svar0 = ""; + setWidgetText(new WidgetPointer(1092,1212), ""); + setWidgetText(new WidgetPointer(1092,1138), ""); + setWidgetText(new WidgetPointer(1092,1058), ""); + setWidgetIsHidden(false, new WidgetPointer(1092,1210)); + setWidgetIsHidden(false, new WidgetPointer(1092,1136)); + setWidgetIsHidden(false, new WidgetPointer(1092,1056)); + setWidgetIsHidden(true, new WidgetPointer(1092,1212)); + setWidgetIsHidden(true, new WidgetPointer(1092,1138)); + setWidgetIsHidden(true, new WidgetPointer(1092,1058)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1223)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1149)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1069)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1207)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1133)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1053)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1220)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1146)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1066)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1204)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1130)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,1050)); + if (citadelConfigsInitialized()) { + if (((boolean)script_5008()) || ((boolean)script_5144(-1))) { + setWidgetIsHidden(false, new WidgetPointer(1092,1223)); + setWidgetIsHidden(false, new WidgetPointer(1092,1149)); + setWidgetIsHidden(false, new WidgetPointer(1092,1069)); + setWidgetIsHidden(false, new WidgetPointer(1092,1207)); + setWidgetIsHidden(false, new WidgetPointer(1092,1133)); + setWidgetIsHidden(false, new WidgetPointer(1092,1053)); + svar0 = "Your rank may not currently make alterations to this item"; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1223), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1223)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1149), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1149)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1069), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1069)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1207), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1207)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1133), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1133)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1053), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1053)); + } else { + switch (bitconfig_9558) { + case 1: + ivar0 = bitconfig_9563; + break; + case 2: + ivar0 = bitconfig_9572; + break; + case 3: + ivar0 = bitconfig_9581; + } + switch (script_4829(bitconfig_9558)) { + flow_8: + case 1: + svar0 = "You may submit this customisation to the build queue."; + switch (ivar0) { + case 1: + setWidgetIsHidden(true, new WidgetPointer(1092,1212)); + setWidgetIsHidden(false, new WidgetPointer(1092,1210)); + setWidgetIsHidden(true, new WidgetPointer(1092,1223)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1220), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1220)); + break; + case 2: + setWidgetIsHidden(true, new WidgetPointer(1092,1138)); + setWidgetIsHidden(false, new WidgetPointer(1092,1136)); + setWidgetIsHidden(true, new WidgetPointer(1092,1149)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1146), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1146)); + break; + case 3: + setWidgetIsHidden(true, new WidgetPointer(1092,1058)); + setWidgetIsHidden(false, new WidgetPointer(1092,1056)); + setWidgetIsHidden(true, new WidgetPointer(1092,1069)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1066), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1066)); + } + break; + case 2: + switch (ivar0) { + case 1: + svar0 = "Your citadel can not produce the resouces with which to purchase this customisation."; + setWidgetText(new WidgetPointer(1092,1212), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1223)); + setWidgetIsHidden(false, new WidgetPointer(1092,1212)); + setWidgetIsHidden(true, new WidgetPointer(1092,1210)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1223), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1223)); + svar0 = "You may cancel this customisation from the build queue but you will lose any resources already spent."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1204), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1204)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1207), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1207)); + break; + case 2: + svar0 = "Your citadel can not produce the resouces with which to purchase this customisation."; + setWidgetText(new WidgetPointer(1092,1138), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1149)); + setWidgetIsHidden(false, new WidgetPointer(1092,1138)); + setWidgetIsHidden(true, new WidgetPointer(1092,1136)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1149), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1149)); + svar0 = "You may cancel this customisation from the build queue but you will lose any resources already spent."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1130), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1130)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1133), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1133)); + break; + case 3: + svar0 = "Your citadel can not produce the resouces with which to purchase this customisation."; + setWidgetText(new WidgetPointer(1092,1058), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1069)); + setWidgetIsHidden(false, new WidgetPointer(1092,1058)); + setWidgetIsHidden(true, new WidgetPointer(1092,1056)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1069), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1069)); + svar0 = "You may cancel this customisation from the build queue but you will lose any resources already spent."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1050), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1050)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1053), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1053)); + } + break; + case 3: + switch (ivar0) { + case 1: + svar0 = "Select valid options for each part of the customisation before adding to the build queue."; + setWidgetText(new WidgetPointer(1092,1212), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1223)); + setWidgetIsHidden(false, new WidgetPointer(1092,1212)); + setWidgetIsHidden(true, new WidgetPointer(1092,1210)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1223), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1223)); + svar0 = "You may cancel this customisation from the build queue but you will lose any resources already spent."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1204), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1204)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1207), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1207)); + break; + case 2: + svar0 = "You must select valid options for each part of the customisation before you can add it to the build queue."; + setWidgetText(new WidgetPointer(1092,1138), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1149)); + setWidgetIsHidden(false, new WidgetPointer(1092,1138)); + setWidgetIsHidden(true, new WidgetPointer(1092,1136)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1149), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1149)); + svar0 = "You may cancel this customisation from the build queue but you will lose any resources already spent."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1130), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1130)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1133), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1133)); + break; + case 3: + svar0 = "You must select valid options for each part of the customisation before you can add it to the build queue."; + setWidgetText(new WidgetPointer(1092,1058), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1069)); + setWidgetIsHidden(false, new WidgetPointer(1092,1058)); + setWidgetIsHidden(true, new WidgetPointer(1092,1056)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1069), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1069)); + svar0 = "You may cancel this customisation from the build queue but you will lose any resources already spent."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1050), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1050)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1053), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1053)); + } + break; + case 4: + switch (ivar0) { + case 1: + svar0 = "The selection you have chosen is already built in the citadel."; + setWidgetText(new WidgetPointer(1092,1212), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1223)); + setWidgetIsHidden(false, new WidgetPointer(1092,1212)); + setWidgetIsHidden(true, new WidgetPointer(1092,1210)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1223), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1223)); + svar0 = "You may cancel this customisation from the build queue but you will lose any resources already spent."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1204), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1204)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1207), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1207)); + break; + case 2: + svar0 = "The selection you have chosen is already built in the citadel."; + setWidgetText(new WidgetPointer(1092,1138), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1149)); + setWidgetIsHidden(false, new WidgetPointer(1092,1138)); + setWidgetIsHidden(true, new WidgetPointer(1092,1136)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1149), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1149)); + svar0 = "You may cancel this customisation from the build queue but you will lose any resources already spent."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1130), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1130)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1133), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1133)); + break; + case 3: + svar0 = "The selection you have chosen is already built in the citadel."; + setWidgetText(new WidgetPointer(1092,1058), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1069)); + setWidgetIsHidden(false, new WidgetPointer(1092,1058)); + setWidgetIsHidden(true, new WidgetPointer(1092,1056)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1069), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1069)); + svar0 = "You may cancel this customisation from the build queue but you will lose any resources already spent."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1050), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1050)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1053), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1053)); + } + break; + case 5: + SWITCH (ivar0) { + case 1: + GOTO flow_29 + case 2: + GOTO flow_30 + case 3: + GOTO flow_31 + } + break; + flow_29: + svar0 = "This hotspot is currently queued to be reset, you may cancel this reset at no cost."; + setWidgetText(new WidgetPointer(1092,1212), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1223)); + setWidgetIsHidden(false, new WidgetPointer(1092,1212)); + setWidgetIsHidden(true, new WidgetPointer(1092,1210)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1149), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1223)); + svar0 = "This hotspot is currently queued to be reset, you may cancel this reset at no cost."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1204), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1204)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1207), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1207)); + break; + flow_30: + svar0 = "This hotspot is currently queued to be reset, you may cancel this reset at no cost."; + setWidgetText(new WidgetPointer(1092,1138), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1149)); + setWidgetIsHidden(false, new WidgetPointer(1092,1138)); + setWidgetIsHidden(true, new WidgetPointer(1092,1136)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1149), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1149)); + svar0 = "This hotspot is currently queued to be reset, you may cancel this reset at no cost."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1130), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1130)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1133), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1133)); + break; + flow_31: + svar0 = "This hotspot is currently queued to be reset, you may cancel this reset at no cost."; + setWidgetText(new WidgetPointer(1092,1058), svar0); + setWidgetIsHidden(false, new WidgetPointer(1092,1069)); + setWidgetIsHidden(false, new WidgetPointer(1092,1058)); + setWidgetIsHidden(true, new WidgetPointer(1092,1056)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1069), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1069)); + svar0 = "This hotspot is currently queued to be reset, you may cancel this reset at no cost."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1050), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1050)); + svar0 = "You do not have the rank to cancel this job."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,1053), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,1053)); + } + } + } + return; +} diff --git a/dumps/scripts/4815.cs2 b/dumps/scripts/4815.cs2 new file mode 100644 index 000000000..b78c09444 --- /dev/null +++ b/dumps/scripts/4815.cs2 @@ -0,0 +1,42 @@ +int script_4815(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int stack_dump0; + int stack_dump1; + cs2func_script_4818_struct(11,0,0) structdump_2; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + stack_dump0 = arg0; + stack_dump1 = arg1; + structdump_2 = script_4818(stack_dump0, stack_dump1); + ivar12 = structdump_2.intpart_10; + ivar11 = structdump_2.intpart_9; + ivar10 = structdump_2.intpart_8; + ivar9 = structdump_2.intpart_7; + ivar8 = structdump_2.intpart_6; + ivar7 = structdump_2.intpart_5; + ivar6 = structdump_2.intpart_4; + ivar5 = structdump_2.intpart_3; + ivar4 = structdump_2.intpart_2; + ivar3 = structdump_2.intpart_1; + ivar2 = structdump_2.intpart_0; + return ivar2; +} diff --git a/dumps/scripts/4816.cs2 b/dumps/scripts/4816.cs2 new file mode 100644 index 000000000..b66729416 --- /dev/null +++ b/dumps/scripts/4816.cs2 @@ -0,0 +1,42 @@ +int script_4816(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int stack_dump0; + int stack_dump1; + cs2func_script_4818_struct(11,0,0) structdump_2; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + stack_dump0 = arg0; + stack_dump1 = arg1; + structdump_2 = script_4818(stack_dump0, stack_dump1); + ivar12 = structdump_2.intpart_10; + ivar11 = structdump_2.intpart_9; + ivar10 = structdump_2.intpart_8; + ivar9 = structdump_2.intpart_7; + ivar8 = structdump_2.intpart_6; + ivar7 = structdump_2.intpart_5; + ivar6 = structdump_2.intpart_4; + ivar5 = structdump_2.intpart_3; + ivar4 = structdump_2.intpart_2; + ivar3 = structdump_2.intpart_1; + ivar2 = structdump_2.intpart_0; + return getWidgetParentId(new WidgetPointer(ivar2)); +} diff --git a/dumps/scripts/4817.cs2 b/dumps/scripts/4817.cs2 new file mode 100644 index 000000000..d028f8883 --- /dev/null +++ b/dumps/scripts/4817.cs2 @@ -0,0 +1,42 @@ +int script_4817(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int stack_dump0; + int stack_dump1; + cs2func_script_4818_struct(11,0,0) structdump_2; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + stack_dump0 = arg0; + stack_dump1 = arg1; + structdump_2 = script_4818(stack_dump0, stack_dump1); + ivar12 = structdump_2.intpart_10; + ivar11 = structdump_2.intpart_9; + ivar10 = structdump_2.intpart_8; + ivar9 = structdump_2.intpart_7; + ivar8 = structdump_2.intpart_6; + ivar7 = structdump_2.intpart_5; + ivar6 = structdump_2.intpart_4; + ivar5 = structdump_2.intpart_3; + ivar4 = structdump_2.intpart_2; + ivar3 = structdump_2.intpart_1; + ivar2 = structdump_2.intpart_0; + return ivar10; +} diff --git a/dumps/scripts/4818.cs2 b/dumps/scripts/4818.cs2 new file mode 100644 index 000000000..ab3889ba9 --- /dev/null +++ b/dumps/scripts/4818.cs2 @@ -0,0 +1,160 @@ +cs2func_script_4818_struct(11,0,0) script_4818(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + switch (arg0) { + flow_1: + case 1: + switch (arg1) { + case 1: + ivar2 = 71566492; + ivar3 = 71566503; + ivar4 = 71566502; + ivar5 = -1; + ivar6 = -1; + ivar7 = 71566501; + ivar8 = -1; + ivar9 = -1; + ivar10 = 71566500; + ivar11 = 71566494; + ivar12 = 71566465; + break; + case 2: + ivar2 = 71566480; + ivar3 = 71566491; + ivar4 = 71566490; + ivar5 = -1; + ivar6 = -1; + ivar7 = 71566489; + ivar8 = -1; + ivar9 = -1; + ivar10 = 71566488; + ivar11 = 71566482; + ivar12 = 71566466; + break; + case 3: + ivar2 = 71566468; + ivar3 = 71566479; + ivar4 = 71566478; + ivar5 = -1; + ivar6 = -1; + ivar7 = 71566477; + ivar8 = -1; + ivar9 = -1; + ivar10 = 71566476; + ivar11 = 71566470; + ivar12 = 71566467; + } + break; + case 2: + switch (arg1) { + case 1: + ivar2 = 71566416; + ivar3 = 71566429; + ivar4 = 71566428; + ivar5 = 71566426; + ivar6 = -1; + ivar7 = 71566427; + ivar8 = 71566425; + ivar9 = -1; + ivar10 = 71566424; + ivar11 = 71566418; + ivar12 = 71566385; + break; + case 2: + ivar2 = 71566402; + ivar3 = 71566415; + ivar4 = 71566414; + ivar5 = 71566412; + ivar6 = -1; + ivar7 = 71566413; + ivar8 = 71566411; + ivar9 = -1; + ivar10 = 71566410; + ivar11 = 71566404; + ivar12 = 71566386; + break; + case 3: + ivar2 = 71566388; + ivar3 = 71566401; + ivar4 = 71566400; + ivar5 = 71566398; + ivar6 = -1; + ivar7 = 71566399; + ivar8 = 71566397; + ivar9 = -1; + ivar10 = 71566396; + ivar11 = 71566390; + ivar12 = 71566387; + } + break; + case 3: + SWITCH (arg1) { + case 1: + GOTO flow_12 + case 2: + GOTO flow_13 + case 3: + GOTO flow_14 + } + break; + flow_12: + ivar2 = 71566334; + ivar3 = 71566349; + ivar4 = 71566348; + ivar5 = 71566346; + ivar6 = 71566344; + ivar7 = 71566347; + ivar8 = 71566345; + ivar9 = 71566343; + ivar10 = 71566342; + ivar11 = 71566336; + ivar12 = 71566299; + break; + flow_13: + ivar2 = 71566318; + ivar3 = 71566333; + ivar4 = 71566332; + ivar5 = 71566330; + ivar6 = 71566328; + ivar7 = 71566331; + ivar8 = 71566329; + ivar9 = 71566327; + ivar10 = 71566326; + ivar11 = 71566320; + ivar12 = 71566300; + break; + flow_14: + ivar2 = 71566302; + ivar3 = 71566317; + ivar4 = 71566316; + ivar5 = 71566314; + ivar6 = 71566312; + ivar7 = 71566315; + ivar8 = 71566313; + ivar9 = 71566311; + ivar10 = 71566310; + ivar11 = 71566304; + ivar12 = 71566301; + } + return newstruct cs2func_script_4818_struct(ivar2, ivar3, ivar4, ivar5, ivar6, ivar7, ivar8, ivar9, ivar10, ivar11, ivar12); +} diff --git a/dumps/scripts/4819.cs2 b/dumps/scripts/4819.cs2 new file mode 100644 index 000000000..0c5684c2e --- /dev/null +++ b/dumps/scripts/4819.cs2 @@ -0,0 +1,11 @@ +int script_4819(int arg0) { + switch (arg0) { + case 1: + return script_4821(bitconfig_9570); + case 2: + return script_4821(bitconfig_9579); + case 3: + return script_4821(bitconfig_9588); + } + return -1; +} diff --git a/dumps/scripts/482.cs2 b/dumps/scripts/482.cs2 new file mode 100644 index 000000000..66f97c45e --- /dev/null +++ b/dumps/scripts/482.cs2 @@ -0,0 +1,57 @@ +void script_482() { + flow_0: + SWITCH (bitconfig_7512) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + case 8: + GOTO flow_8 + case 9: + GOTO flow_9 + case 10: + GOTO flow_10 + } + return; + flow_1: + setWidgetSprite(3257, new WidgetPointer(1015,143)); + GOTO flow_11 + flow_2: + setWidgetSprite(3257, new WidgetPointer(1015,145)); + GOTO flow_11 + flow_3: + setWidgetSprite(3257, new WidgetPointer(1015,147)); + GOTO flow_11 + flow_4: + setWidgetSprite(3257, new WidgetPointer(1015,149)); + GOTO flow_11 + flow_5: + setWidgetSprite(3257, new WidgetPointer(1015,151)); + GOTO flow_11 + flow_6: + setWidgetSprite(3257, new WidgetPointer(1015,153)); + GOTO flow_11 + flow_7: + setWidgetSprite(3257, new WidgetPointer(1015,155)); + GOTO flow_11 + flow_8: + setWidgetSprite(3257, new WidgetPointer(1015,157)); + GOTO flow_11 + flow_9: + setWidgetSprite(3257, new WidgetPointer(1015,159)); + GOTO flow_11 + flow_10: + setWidgetSprite(3257, new WidgetPointer(1015,161)); + flow_11: + return; +} diff --git a/dumps/scripts/4820.cs2 b/dumps/scripts/4820.cs2 new file mode 100644 index 000000000..fecd967a1 --- /dev/null +++ b/dumps/scripts/4820.cs2 @@ -0,0 +1,35 @@ +int script_4820(int arg0) { + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return -1; +} diff --git a/dumps/scripts/4821.cs2 b/dumps/scripts/4821.cs2 new file mode 100644 index 000000000..1793e30f1 --- /dev/null +++ b/dumps/scripts/4821.cs2 @@ -0,0 +1,56 @@ +int script_4821(int arg0) { + switch (arg0) { + case 21: + case 23: + case 22: + case 25: + case 24: + case 27: + case 26: + case 28: + return 4047; + case 31: + case 34: + case 35: + case 32: + case 33: + return 4050; + case 42: + case 43: + case 41: + case 44: + case 45: + return 4053; + case 51: + return 4056; + case 100: + return 4062; + case 101: + return 4065; + case 102: + return 4068; + case 103: + return 4071; + case 104: + return 4074; + case 105: + return 4077; + case 106: + return 4080; + case 107: + return 4083; + case 108: + return 4086; + case 109: + return 4089; + case 110: + return 4092; + case 111: + return 4095; + case 112: + return 4098; + case 113: + return 4101; + } + return -1; +} diff --git a/dumps/scripts/4822.cs2 b/dumps/scripts/4822.cs2 new file mode 100644 index 000000000..23999006e --- /dev/null +++ b/dumps/scripts/4822.cs2 @@ -0,0 +1,11 @@ +int script_4822(int arg0) { + switch (arg0) { + case 1: + return script_4824(bitconfig_9570); + case 2: + return script_4824(bitconfig_9579); + case 3: + return script_4824(bitconfig_9588); + } + return -1; +} diff --git a/dumps/scripts/4823.cs2 b/dumps/scripts/4823.cs2 new file mode 100644 index 000000000..4a0f800bf --- /dev/null +++ b/dumps/scripts/4823.cs2 @@ -0,0 +1,35 @@ +int script_4823(int arg0) { + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return -1; +} diff --git a/dumps/scripts/4824.cs2 b/dumps/scripts/4824.cs2 new file mode 100644 index 000000000..c05355b26 --- /dev/null +++ b/dumps/scripts/4824.cs2 @@ -0,0 +1,56 @@ +int script_4824(int arg0) { + switch (arg0) { + case 21: + case 23: + case 22: + case 25: + case 24: + case 27: + case 26: + case 28: + return 4048; + case 31: + case 34: + case 35: + case 32: + case 33: + return 4051; + case 42: + case 43: + case 41: + case 44: + case 45: + return 4054; + case 51: + return 4057; + case 100: + return 4063; + case 101: + return 4066; + case 102: + return 4069; + case 103: + return 4072; + case 104: + return 4075; + case 105: + return 4078; + case 106: + return 4081; + case 107: + return 4084; + case 108: + return 4087; + case 109: + return 4090; + case 110: + return 4093; + case 111: + return 4096; + case 112: + return 4099; + case 113: + return 4102; + } + return -1; +} diff --git a/dumps/scripts/4825.cs2 b/dumps/scripts/4825.cs2 new file mode 100644 index 000000000..755e15331 --- /dev/null +++ b/dumps/scripts/4825.cs2 @@ -0,0 +1,11 @@ +int script_4825(int arg0) { + switch (arg0) { + case 1: + return script_4827(bitconfig_9570); + case 2: + return script_4827(bitconfig_9579); + case 3: + return script_4827(bitconfig_9588); + } + return -1; +} diff --git a/dumps/scripts/4826.cs2 b/dumps/scripts/4826.cs2 new file mode 100644 index 000000000..781cb8ebe --- /dev/null +++ b/dumps/scripts/4826.cs2 @@ -0,0 +1,35 @@ +int script_4826(int arg0) { + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return -1; +} diff --git a/dumps/scripts/4827.cs2 b/dumps/scripts/4827.cs2 new file mode 100644 index 000000000..bae3d59c3 --- /dev/null +++ b/dumps/scripts/4827.cs2 @@ -0,0 +1,56 @@ +int script_4827(int arg0) { + switch (arg0) { + case 21: + case 23: + case 22: + case 25: + case 24: + case 27: + case 26: + case 28: + return 4049; + case 31: + case 34: + case 35: + case 32: + case 33: + return 4052; + case 42: + case 43: + case 41: + case 44: + case 45: + return 4055; + case 51: + return 4058; + case 100: + return 4064; + case 101: + return 4067; + case 102: + return 4070; + case 103: + return 4073; + case 104: + return 4076; + case 105: + return 4079; + case 106: + return 4082; + case 107: + return 4085; + case 108: + return 4088; + case 109: + return 4091; + case 110: + return 4094; + case 111: + return 4097; + case 112: + return 4100; + case 113: + return 4103; + } + return -1; +} diff --git a/dumps/scripts/4828.cs2 b/dumps/scripts/4828.cs2 new file mode 100644 index 000000000..2653eb113 --- /dev/null +++ b/dumps/scripts/4828.cs2 @@ -0,0 +1,19 @@ +int script_4828(int arg0) { + switch (bitconfig_9558) { + case 1: + if (((boolean)bitconfig_9559)) { + return 1; + } + break; + case 2: + if (((boolean)bitconfig_9560)) { + return 1; + } + break; + case 3: + if (((boolean)bitconfig_9561)) { + return 1; + } + } + return 0; +} diff --git a/dumps/scripts/4829.cs2 b/dumps/scripts/4829.cs2 new file mode 100644 index 000000000..e9fb479af --- /dev/null +++ b/dumps/scripts/4829.cs2 @@ -0,0 +1,411 @@ +int script_4829(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int stack_dump0; + ivar1 = script_4830(arg0); + if (ivar1 != 1) { + return ivar1; + } + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + switch (arg0) { + case 1: + ivar2 = bitconfig_9570; + ivar3 = bitconfig_9562; + ivar7 = bitconfig_9563; + ivar4 = bitconfig_9567; + ivar5 = bitconfig_9568; + ivar6 = bitconfig_9569; + break; + case 2: + ivar2 = bitconfig_9579; + ivar3 = bitconfig_9571; + ivar7 = bitconfig_9572; + ivar4 = bitconfig_9576; + ivar5 = bitconfig_9577; + ivar6 = bitconfig_9578; + break; + case 3: + ivar2 = bitconfig_9588; + ivar3 = bitconfig_9580; + ivar7 = bitconfig_9581; + ivar4 = bitconfig_9585; + ivar5 = bitconfig_9586; + ivar6 = bitconfig_9587; + } + switch (ivar2) { + case 100: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 101: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 102: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 103: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 104: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 105: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 106: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 107: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 108: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 109: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 110: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 111: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 112: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 113: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 21: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 22: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 23: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 24: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 25: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 26: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 27: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 28: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 31: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 32: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 33: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 34: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 35: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 41: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 42: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 43: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 44: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 45: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 51: + stack_dump0 = ivar3; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return ivar1; +} diff --git a/dumps/scripts/483.cs2 b/dumps/scripts/483.cs2 new file mode 100644 index 000000000..7cd79f0dd --- /dev/null +++ b/dumps/scripts/483.cs2 @@ -0,0 +1,34 @@ +string script_483(int arg0) { + flow_0: + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + } + return "No Troop"; + flow_1: + return "Scout"; + flow_2: + return "Foot Soldier"; + flow_3: + return "Halberdier"; + flow_4: + return "Archer"; + flow_5: + return "Mage"; + flow_6: + return "Knight"; + flow_7: + return "Champion"; +} diff --git a/dumps/scripts/4830.cs2 b/dumps/scripts/4830.cs2 new file mode 100644 index 000000000..e6e9eea01 --- /dev/null +++ b/dumps/scripts/4830.cs2 @@ -0,0 +1,84 @@ +int script_4830(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + switch (arg0) { + case 1: + ivar6 = bitconfig_9562; + ivar7 = bitconfig_9563; + ivar9 = bitconfig_9567; + ivar10 = bitconfig_9568; + ivar11 = bitconfig_9569; + ivar12 = bitconfig_9566; + break; + case 2: + ivar6 = bitconfig_9571; + ivar7 = bitconfig_9572; + ivar9 = bitconfig_9576; + ivar10 = bitconfig_9577; + ivar11 = bitconfig_9578; + ivar12 = bitconfig_9575; + break; + case 3: + ivar6 = bitconfig_9580; + ivar7 = bitconfig_9581; + ivar9 = bitconfig_9585; + ivar10 = bitconfig_9586; + ivar11 = bitconfig_9587; + ivar12 = bitconfig_9584; + } + if (((boolean)ivar12)) { + return 5; + } + if (((boolean)ivar6)) { + return -1; + } + ivar1 = cs2method_3408(105, 103, 4043, ivar6); + if (ivar1 == -1) { + return -1; + } + if ((ivar7 > 0) && (ivar7 <= 3)) { + ivar2 = cs2method_3408(105, 103, ivar1, ivar7); + if (ivar2 != -1) { + ivar3 = cs2method_3408(105, 103, ivar2, 1); + ivar4 = cs2method_3408(105, 103, ivar2, 2); + ivar5 = cs2method_3408(105, 103, ivar2, 3); + if (ivar3 != -1) { + if ((ivar9 > 0) && (ivar9 <= getCommonDefinitionSize(ivar3))) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return 3; + } + } + } + return -1; +} diff --git a/dumps/scripts/4831.cs2 b/dumps/scripts/4831.cs2 new file mode 100644 index 000000000..9fccbea7e --- /dev/null +++ b/dumps/scripts/4831.cs2 @@ -0,0 +1,98 @@ +void script_4831(int arg0) { + if (isWidgetHidden(new WidgetPointer(arg0))) { + return; + } + script_4834(arg0); + switch (bitconfig_9558) { + flow_3: + case 1: + switch (arg0) { + case 71566342: + case 71566424: + case 71566500: + if ((bitconfig_9567 > 0) && setWidgetRegister(new WidgetPointer(arg0), subtract(bitconfig_9567, 1))) { + setWidgetSprite(6004); + } + break; + case 71566326: + case 71566488: + case 71566410: + if ((bitconfig_9568 > 0) && setWidgetRegister(new WidgetPointer(arg0), subtract(bitconfig_9568, 1))) { + setWidgetSprite(6004); + } + break; + case 71566476: + case 71566310: + case 71566396: + if ((bitconfig_9569 > 0) && setWidgetRegister(new WidgetPointer(arg0), subtract(bitconfig_9569, 1))) { + setWidgetSprite(6004); + } + } + break; + case 2: + switch (arg0) { + case 71566342: + case 71566424: + case 71566500: + if ((bitconfig_9576 > 0) && setWidgetRegister(new WidgetPointer(arg0), subtract(bitconfig_9576, 1))) { + setWidgetSprite(6004); + } + break; + case 71566326: + case 71566488: + case 71566410: + if ((bitconfig_9577 > 0) && setWidgetRegister(new WidgetPointer(arg0), subtract(bitconfig_9577, 1))) { + setWidgetSprite(6004); + } + break; + case 71566476: + case 71566310: + case 71566396: + if ((bitconfig_9578 > 0) && setWidgetRegister(new WidgetPointer(arg0), subtract(bitconfig_9578, 1))) { + setWidgetSprite(6004); + } + } + break; + case 3: + SWITCH (arg0) { + case 71566342: + GOTO flow_30 + case 71566424: + GOTO flow_30 + case 71566500: + GOTO flow_30 + case 71566326: + GOTO flow_34 + case 71566488: + GOTO flow_34 + case 71566410: + GOTO flow_34 + case 71566476: + GOTO flow_38 + case 71566310: + GOTO flow_38 + case 71566396: + GOTO flow_38 + } + break; + flow_30: + if ((bitconfig_9585 > 0) && setWidgetRegister(new WidgetPointer(arg0), subtract(bitconfig_9585, 1))) { + setWidgetSprite(6004); + } + break; + flow_34: + if ((bitconfig_9586 > 0) && setWidgetRegister(new WidgetPointer(arg0), subtract(bitconfig_9586, 1))) { + setWidgetSprite(6004); + } + break; + flow_38: + if ((bitconfig_9587 > 0) && setWidgetRegister(new WidgetPointer(arg0), subtract(bitconfig_9587, 1))) { + setWidgetSprite(6004); + } + } + script_4838(); + script_4810(); + script_4840(); + script_4814(); + return; +} diff --git a/dumps/scripts/4832.cs2 b/dumps/scripts/4832.cs2 new file mode 100644 index 000000000..ad6e469ec --- /dev/null +++ b/dumps/scripts/4832.cs2 @@ -0,0 +1,84 @@ +void script_4832(int arg0,int arg1) { + script_4834(arg0); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (getWidgetSpriteId() == 6009) { + switch (bitconfig_9558) { + flow_3: + case 1: + switch (arg0) { + case 71566342: + case 71566424: + case 71566500: + bitconfig_9567 = add(1, arg1); + break; + case 71566326: + case 71566488: + case 71566410: + bitconfig_9568 = add(1, arg1); + break; + case 71566476: + case 71566310: + case 71566396: + bitconfig_9569 = add(1, arg1); + } + break; + case 2: + switch (arg0) { + case 71566342: + case 71566424: + case 71566500: + bitconfig_9576 = add(1, arg1); + break; + case 71566326: + case 71566488: + case 71566410: + bitconfig_9577 = add(1, arg1); + break; + case 71566476: + case 71566310: + case 71566396: + bitconfig_9578 = add(1, arg1); + } + break; + case 3: + SWITCH (arg0) { + case 71566342: + GOTO flow_14 + case 71566424: + GOTO flow_14 + case 71566500: + GOTO flow_14 + case 71566326: + GOTO flow_15 + case 71566488: + GOTO flow_15 + case 71566410: + GOTO flow_15 + case 71566476: + GOTO flow_16 + case 71566310: + GOTO flow_16 + case 71566396: + GOTO flow_16 + } + break; + flow_14: + bitconfig_9585 = add(1, arg1); + break; + flow_15: + bitconfig_9586 = add(1, arg1); + break; + flow_16: + bitconfig_9587 = add(1, arg1); + } + setWidgetSprite(6004); + } else { + script_4834(arg0); + } + } + script_4838(); + script_4810(); + script_4840(); + script_4814(); + return; +} diff --git a/dumps/scripts/4833.cs2 b/dumps/scripts/4833.cs2 new file mode 100644 index 000000000..ca44f008b --- /dev/null +++ b/dumps/scripts/4833.cs2 @@ -0,0 +1,37 @@ +void script_4833(int arg0) { + int ivar1; + ivar1 = -1; + switch (arg0) { + case 71566495: + ivar1 = 71566500; + break; + case 71566419: + ivar1 = 71566424; + break; + case 71566337: + ivar1 = 71566342; + break; + case 71566483: + ivar1 = 71566488; + break; + case 71566405: + ivar1 = 71566410; + break; + case 71566321: + ivar1 = 71566326; + break; + case 71566471: + ivar1 = 71566476; + break; + case 71566391: + ivar1 = 71566396; + break; + case 71566305: + ivar1 = 71566310; + } + script_4834(ivar1); + script_4838(); + script_4810(); + script_4814(); + return; +} diff --git a/dumps/scripts/4834.cs2 b/dumps/scripts/4834.cs2 new file mode 100644 index 000000000..cfdf62660 --- /dev/null +++ b/dumps/scripts/4834.cs2 @@ -0,0 +1,11 @@ +void script_4834(int arg0) { + int ivar1; + ivar1 = subtract(getExtraChildGap(new WidgetPointer(arg0)), 1); + while (ivar1 >= 0) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar1)) { + setWidgetSprite(6009); + } + ivar1 = subtract(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/4835.cs2 b/dumps/scripts/4835.cs2 new file mode 100644 index 000000000..c8cc03eef --- /dev/null +++ b/dumps/scripts/4835.cs2 @@ -0,0 +1,33 @@ +void script_4835() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + switch (bitconfig_9558) { + case 1: + ivar0 = script_4817(bitconfig_9563, 1); + ivar1 = script_4817(bitconfig_9563, 2); + ivar2 = script_4817(bitconfig_9563, 3); + break; + case 2: + ivar0 = script_4817(bitconfig_9572, 1); + ivar1 = script_4817(bitconfig_9572, 2); + ivar2 = script_4817(bitconfig_9572, 3); + break; + case 3: + ivar0 = script_4817(bitconfig_9581, 1); + ivar1 = script_4817(bitconfig_9581, 2); + ivar2 = script_4817(bitconfig_9581, 3); + } + ivar3 = subtract(getExtraChildGap(new WidgetPointer(ivar0)), 1); + while (ivar3 >= 0) { + if (setWidgetRegister(new WidgetPointer(ivar0), ivar3)) { + setWidgetSprite(6009); + } + ivar3 = subtract(ivar3, 1); + } + return; +} diff --git a/dumps/scripts/4836.cs2 b/dumps/scripts/4836.cs2 new file mode 100644 index 000000000..9291eece4 --- /dev/null +++ b/dumps/scripts/4836.cs2 @@ -0,0 +1,6 @@ +void script_4836(int arg0,int arg1,int arg2) { + setWidgetSprite(5907, new WidgetPointer(arg0)); + setWidgetSprite(5902, new WidgetPointer(arg1)); + setWidgetSprite(5912, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/4837.cs2 b/dumps/scripts/4837.cs2 new file mode 100644 index 000000000..035921609 --- /dev/null +++ b/dumps/scripts/4837.cs2 @@ -0,0 +1,6 @@ +void script_4837(int arg0,int arg1,int arg2) { + setWidgetSprite(5906, new WidgetPointer(arg0)); + setWidgetSprite(5901, new WidgetPointer(arg1)); + setWidgetSprite(5911, new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/4838.cs2 b/dumps/scripts/4838.cs2 new file mode 100644 index 000000000..f3278274e --- /dev/null +++ b/dumps/scripts/4838.cs2 @@ -0,0 +1,44 @@ +void script_4838() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = -1; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 1; + switch (bitconfig_9558) { + case 1: + ivar1 = bitconfig_9567; + ivar2 = bitconfig_9568; + ivar3 = bitconfig_9569; + ivar4 = bitconfig_9563; + break; + case 2: + ivar1 = bitconfig_9576; + ivar2 = bitconfig_9577; + ivar3 = bitconfig_9578; + ivar4 = bitconfig_9572; + break; + case 3: + ivar1 = bitconfig_9585; + ivar2 = bitconfig_9586; + ivar3 = bitconfig_9587; + ivar4 = bitconfig_9581; + } + ivar0 = script_4815(ivar4, 1); + if (ivar0 != -1) { + script_4839(ivar0, multiply(subtract(ivar1, 1), 27)); + } + ivar0 = script_4815(ivar4, 2); + if (ivar0 != -1) { + script_4839(ivar0, multiply(subtract(ivar2, 1), 27)); + } + ivar0 = script_4815(ivar4, 3); + if (ivar0 != -1) { + script_4839(ivar0, multiply(subtract(ivar3, 1), 27)); + } + return; +} diff --git a/dumps/scripts/4839.cs2 b/dumps/scripts/4839.cs2 new file mode 100644 index 000000000..d86d4a4ba --- /dev/null +++ b/dumps/scripts/4839.cs2 @@ -0,0 +1,60 @@ +void script_4839(int arg0,int arg1) { + int ivar2; + int ivar3; + int stack_dump0; + int stack_dump1; + ivar2 = 0; + ivar3 = -1; + switch (arg0) { + case 71566492: + ivar3 = 71566495; + ivar2 = getExtraChildGap(new WidgetPointer(1092,1188)); + break; + case 71566416: + ivar3 = 71566419; + ivar2 = getExtraChildGap(new WidgetPointer(1092,1112)); + break; + case 71566334: + ivar3 = 71566337; + ivar2 = getExtraChildGap(new WidgetPointer(1092,1030)); + break; + case 71566480: + ivar3 = 71566483; + ivar2 = getExtraChildGap(new WidgetPointer(1092,1176)); + break; + case 71566402: + ivar3 = 71566405; + ivar2 = getExtraChildGap(new WidgetPointer(1092,1098)); + break; + case 71566318: + ivar3 = 71566321; + ivar2 = getExtraChildGap(new WidgetPointer(1092,1014)); + break; + case 71566468: + ivar3 = 71566471; + ivar2 = getExtraChildGap(new WidgetPointer(1092,1164)); + break; + case 71566388: + ivar3 = 71566391; + ivar2 = getExtraChildGap(new WidgetPointer(1092,1084)); + break; + case 71566302: + ivar3 = 71566305; + ivar2 = getExtraChildGap(new WidgetPointer(1092,998)); + } + if (setWidgetRegister(new WidgetPointer(arg0))) { + stack_dump0 = 0; + stack_dump1 = 1564; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/484.cs2 b/dumps/scripts/484.cs2 new file mode 100644 index 000000000..584d42f0b --- /dev/null +++ b/dumps/scripts/484.cs2 @@ -0,0 +1,189 @@ +void script_484(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + flow_0: + ivar1 = -1; + ivar2 = -1; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + svar0 = ""; + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + SWITCH (bitconfig_7512) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + case 8: + GOTO flow_8 + case 9: + GOTO flow_9 + case 10: + GOTO flow_10 + } + return; + flow_1: + ivar1 = script_486(bitconfig_7520); + GOTO flow_11 + flow_2: + ivar1 = script_486(bitconfig_7521); + GOTO flow_11 + flow_3: + ivar1 = script_486(bitconfig_7526); + GOTO flow_11 + flow_4: + ivar1 = script_486(bitconfig_7527); + GOTO flow_11 + flow_5: + ivar1 = script_486(bitconfig_7530); + GOTO flow_11 + flow_6: + ivar1 = script_486(bitconfig_7531); + GOTO flow_11 + flow_7: + ivar1 = script_486(bitconfig_7532); + GOTO flow_11 + flow_8: + ivar1 = script_486(bitconfig_7533); + GOTO flow_11 + flow_9: + ivar1 = script_486(bitconfig_7534); + GOTO flow_11 + flow_10: + ivar1 = script_486(bitconfig_7535); + flow_11: + SWITCH (arg0) { + case 66519173: + GOTO flow_12 + case 66519159: + GOTO flow_13 + case 66519161: + GOTO flow_14 + case 66519163: + GOTO flow_15 + case 66519165: + GOTO flow_16 + case 66519167: + GOTO flow_17 + case 66519169: + GOTO flow_18 + case 66519171: + GOTO flow_19 + } + return; + flow_12: + ivar2 = script_486(0); + GOTO flow_20 + flow_13: + ivar2 = script_486(1); + GOTO flow_20 + flow_14: + ivar2 = script_486(2); + GOTO flow_20 + flow_15: + ivar2 = script_486(3); + GOTO flow_20 + flow_16: + ivar2 = script_486(4); + GOTO flow_20 + flow_17: + ivar2 = script_486(5); + GOTO flow_20 + flow_18: + ivar2 = script_486(6); + GOTO flow_20 + flow_19: + ivar2 = script_486(7); + flow_20: + if (ivar1 == -1) { + setWidgetIsHidden(true, new WidgetPointer(1015,135)); + setWidgetIsHidden(false, new WidgetPointer(1015,115)); + setWidgetSprite(getNpcNodemapData(ivar2, 1148), new WidgetPointer(1015,2)); + setWidgetText(new WidgetPointer(1015,0), getNpcNodemapData(ivar2, 1139)); + setWidgetText(new WidgetPointer(1015,138), "Movement: " + intToStr(getNpcNodemapData(ivar2, 1134))); + setWidgetText(new WidgetPointer(1015,139), "Damage: " + intToStr(multiply(getNpcNodemapData(ivar2, 1135), 100))); + setWidgetText(new WidgetPointer(1015,140), "Health: " + intToStr(multiply(getNpcNodemapData(ivar2, 1136), 100))); + setWidgetText(new WidgetPointer(1015,141), "Range: " + intToStr(getNpcNodemapData(ivar2, 1137))); + setWidgetText(new WidgetPointer(1015,142), "Cost: " + intToStr(getNpcNodemapData(ivar2, 1138))); + } else { + if (ivar1 != ivar2) { + setWidgetSprite(getNpcNodemapData(ivar2, 1148), new WidgetPointer(1015,2)); + setWidgetText(new WidgetPointer(1015,0), concat(getWidgetText(new WidgetPointer(1015,0)), " ~ " + getNpcNodemapData(ivar2, 1139))); + ivar3 = getNpcNodemapData(ivar1, 1134); + ivar4 = getNpcNodemapData(ivar2, 1134); + if (ivar3 < ivar4) { + ivar5 = subtract(ivar4, ivar3); + svar0 = " ~ " + intToStr(getNpcNodemapData(ivar2, 1134)) + " (" + "" + "+" + intToStr(ivar5) + "" + ")"; + } else if (ivar3 > ivar4) { + ivar5 = subtract(ivar3, ivar4); + svar0 = " ~ " + intToStr(getNpcNodemapData(ivar2, 1134)) + " (" + "" + "-" + intToStr(ivar5) + "" + ")"; + } else { + svar0 = " ~ " + intToStr(getNpcNodemapData(ivar2, 1134)); + } + setWidgetText(new WidgetPointer(1015,138), concat(getWidgetText(new WidgetPointer(1015,138)), svar0)); + ivar3 = getNpcNodemapData(ivar1, 1135); + ivar4 = getNpcNodemapData(ivar2, 1135); + if (ivar3 < ivar4) { + ivar5 = subtract(ivar4, ivar3); + svar0 = " ~ " + intToStr(multiply(getNpcNodemapData(ivar2, 1135), 100)) + " (" + "" + "+" + intToStr(multiply(ivar5, 100)) + "" + ")"; + } else if (ivar3 > ivar4) { + ivar5 = subtract(ivar3, ivar4); + svar0 = " ~ " + intToStr(multiply(getNpcNodemapData(ivar2, 1135), 100)) + " (" + "" + "-" + intToStr(multiply(ivar5, 100)) + "" + ")"; + } else { + svar0 = " ~ " + intToStr(multiply(getNpcNodemapData(ivar2, 1135), 100)); + } + setWidgetText(new WidgetPointer(1015,139), concat(getWidgetText(new WidgetPointer(1015,139)), svar0)); + ivar3 = getNpcNodemapData(ivar1, 1136); + ivar4 = getNpcNodemapData(ivar2, 1136); + if (ivar3 < ivar4) { + ivar5 = subtract(ivar4, ivar3); + svar0 = " ~ " + intToStr(multiply(getNpcNodemapData(ivar2, 1136), 100)) + " (" + "" + "+" + intToStr(multiply(ivar5, 100)) + "" + ")"; + } else if (ivar3 > ivar4) { + ivar5 = subtract(ivar3, ivar4); + svar0 = " ~ " + intToStr(multiply(getNpcNodemapData(ivar2, 1136), 100)) + " (" + "" + "-" + intToStr(multiply(ivar5, 100)) + "" + ")"; + } else { + svar0 = " ~ " + intToStr(multiply(getNpcNodemapData(ivar2, 1136), 100)); + } + setWidgetText(new WidgetPointer(1015,140), concat(getWidgetText(new WidgetPointer(1015,140)), svar0)); + ivar3 = getNpcNodemapData(ivar1, 1137); + ivar4 = getNpcNodemapData(ivar2, 1137); + if (ivar3 < ivar4) { + ivar5 = subtract(ivar4, ivar3); + svar0 = " ~ " + intToStr(getNpcNodemapData(ivar2, 1137)) + " (" + "" + "+" + intToStr(ivar5) + "" + ")"; + } else if (ivar3 > ivar4) { + ivar5 = subtract(ivar3, ivar4); + svar0 = " ~ " + intToStr(getNpcNodemapData(ivar2, 1137)) + " (" + "" + "-" + intToStr(ivar5) + "" + ")"; + } else { + svar0 = " ~ " + intToStr(getNpcNodemapData(ivar2, 1137)); + } + setWidgetText(new WidgetPointer(1015,141), concat(getWidgetText(new WidgetPointer(1015,141)), svar0)); + ivar3 = getNpcNodemapData(ivar1, 1138); + ivar4 = getNpcNodemapData(ivar2, 1138); + if (ivar3 < ivar4) { + ivar5 = subtract(ivar4, ivar3); + svar0 = " ~ " + intToStr(getNpcNodemapData(ivar2, 1138)) + " (" + "" + "+" + intToStr(ivar5) + "" + ")"; + } else if (ivar3 > ivar4) { + ivar5 = subtract(ivar3, ivar4); + svar0 = " ~ " + intToStr(getNpcNodemapData(ivar2, 1138)) + " (" + "" + "-" + intToStr(ivar5) + "" + ")"; + } else { + svar0 = " ~ " + intToStr(getNpcNodemapData(ivar2, 1138)); + } + setWidgetText(new WidgetPointer(1015,142), concat(getWidgetText(new WidgetPointer(1015,142)), svar0)); + } + } + return; +} diff --git a/dumps/scripts/4840.cs2 b/dumps/scripts/4840.cs2 new file mode 100644 index 000000000..9ddcd97cd --- /dev/null +++ b/dumps/scripts/4840.cs2 @@ -0,0 +1,104 @@ +void script_4840() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int stack_dump0; + cs2func_script_4841_struct(6,0,0) structdump_1; + ivar0 = 0; + switch (bitconfig_9558) { + case 1: + ivar0 = bitconfig_9563; + break; + case 2: + ivar0 = bitconfig_9572; + break; + case 3: + ivar0 = bitconfig_9581; + } + if (((boolean)ivar0)) { + return; + } + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + stack_dump0 = bitconfig_9558; + structdump_1 = script_4841(stack_dump0); + ivar6 = structdump_1.intpart_5; + ivar5 = structdump_1.intpart_4; + ivar4 = structdump_1.intpart_3; + ivar3 = structdump_1.intpart_2; + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + ivar10 = cs2method_3408(105, 100, 4286, ivar1); + ivar11 = cs2method_3408(105, 100, 4286, ivar3); + ivar12 = cs2method_3408(105, 100, 4286, ivar5); + switch (ivar0) { + case 1: + if (ivar2 > 0) { + setWidgetText(new WidgetPointer(1092,47), intToStr(ivar2)); + } else { + setWidgetText(new WidgetPointer(1092,47), ""); + } + ivar7 = 71565356; + ivar8 = 71565357; + ivar9 = 71565358; + break; + case 2: + if (ivar2 > 0) { + setWidgetText(new WidgetPointer(1092,56), intToStr(ivar2)); + } else { + setWidgetText(new WidgetPointer(1092,56), ""); + } + if (ivar4 > 0) { + setWidgetText(new WidgetPointer(1092,57), intToStr(ivar4)); + } else { + setWidgetText(new WidgetPointer(1092,57), ""); + } + ivar7 = 71565365; + ivar8 = 71565366; + ivar9 = 71565367; + break; + case 3: + if (ivar2 > 0) { + setWidgetText(new WidgetPointer(1092,65), intToStr(ivar2)); + } else { + setWidgetText(new WidgetPointer(1092,65), ""); + } + if (ivar4 > 0) { + setWidgetText(new WidgetPointer(1092,67), intToStr(ivar4)); + } else { + setWidgetText(new WidgetPointer(1092,67), ""); + } + if (ivar6 > 0) { + setWidgetText(new WidgetPointer(1092,66), intToStr(ivar6)); + } else { + setWidgetText(new WidgetPointer(1092,66), ""); + } + ivar7 = 71565374; + ivar8 = 71565375; + ivar9 = 71565376; + break; + default: + return; + } + setWidgetSprite(ivar10, new WidgetPointer(ivar7)); + setWidgetSprite(ivar11, new WidgetPointer(ivar8)); + setWidgetSprite(ivar12, new WidgetPointer(ivar9)); + return; +} diff --git a/dumps/scripts/4841.cs2 b/dumps/scripts/4841.cs2 new file mode 100644 index 000000000..8a362a3cf --- /dev/null +++ b/dumps/scripts/4841.cs2 @@ -0,0 +1,99 @@ +cs2func_script_4841_struct(6,0,0) script_4841(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + if (citadelConfigsInitialized()) { + switch (arg0) { + case 1: + ivar3 = bitconfig_9570; + ivar1 = bitconfig_9562; + ivar2 = bitconfig_9563; + ivar4 = bitconfig_9567; + ivar5 = bitconfig_9568; + ivar6 = bitconfig_9569; + break; + case 2: + ivar3 = bitconfig_9579; + ivar1 = bitconfig_9571; + ivar2 = bitconfig_9572; + ivar4 = bitconfig_9576; + ivar5 = bitconfig_9577; + ivar6 = bitconfig_9578; + break; + case 3: + ivar3 = bitconfig_9588; + ivar1 = bitconfig_9580; + ivar2 = bitconfig_9581; + ivar4 = bitconfig_9585; + ivar5 = bitconfig_9586; + ivar6 = bitconfig_9587; + } + } + ivar7 = 1; + ivar8 = 1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar11 = cs2method_3408(105, 103, 4043, ivar1); + if (ivar11 == -1) { + return newstruct cs2func_script_4841_struct(0, 0, 0, 0, 0, 0); + } + ivar12 = cs2method_3408(105, 103, ivar11, ivar2); + if (ivar12 == -1) { + return newstruct cs2func_script_4841_struct(0, 0, 0, 0, 0, 0); + } + while (ivar7 <= 3) { + ivar9 = cs2method_3408(105, 103, ivar12, ivar7); + if (ivar9 != -1) { + switch (ivar7) { + case 1: + ivar10 = cs2method_3408(105, 74, ivar9, ivar4); + break; + case 2: + ivar10 = cs2method_3408(105, 74, ivar9, ivar5); + break; + case 3: + ivar10 = cs2method_3408(105, 74, ivar9, ivar6); + } + if (ivar10 != -1) { + ivar13 = getOtherCommonData(ivar10, 1571); + ivar16 = add(ivar16, getOtherCommonData(ivar10, 1573)); + ivar14 = getOtherCommonData(ivar10, 1575); + ivar17 = add(ivar17, getOtherCommonData(ivar10, 1577)); + ivar15 = getOtherCommonData(ivar10, 1579); + ivar18 = add(ivar18, getOtherCommonData(ivar10, 1581)); + } + } + ivar9 = -1; + ivar7 = add(ivar7, 1); + } + return newstruct cs2func_script_4841_struct(ivar13, ivar16, ivar14, ivar17, ivar15, ivar18); +} diff --git a/dumps/scripts/4842.cs2 b/dumps/scripts/4842.cs2 new file mode 100644 index 000000000..724d04df6 --- /dev/null +++ b/dumps/scripts/4842.cs2 @@ -0,0 +1,13 @@ +void script_4842(int arg0) { + switch (arg0) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(1092,1253)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1092,1244)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(1092,1235)); + } + return; +} diff --git a/dumps/scripts/4843.cs2 b/dumps/scripts/4843.cs2 new file mode 100644 index 000000000..f2888c0ec --- /dev/null +++ b/dumps/scripts/4843.cs2 @@ -0,0 +1,13 @@ +void script_4843(int arg0) { + switch (arg0) { + case 1: + setWidgetIsHidden(true, new WidgetPointer(1092,1253)); + break; + case 2: + setWidgetIsHidden(true, new WidgetPointer(1092,1244)); + break; + case 3: + setWidgetIsHidden(true, new WidgetPointer(1092,1235)); + } + return; +} diff --git a/dumps/scripts/4844.cs2 b/dumps/scripts/4844.cs2 new file mode 100644 index 000000000..9ef9cd2be --- /dev/null +++ b/dumps/scripts/4844.cs2 @@ -0,0 +1,19 @@ +void script_4844(int arg0) { + switch (bitconfig_9558) { + case 1: + if (arg0 == bitconfig_9563) { + script_4846(arg0); + } + break; + case 2: + if (arg0 == bitconfig_9572) { + script_4846(arg0); + } + break; + case 3: + if (arg0 == bitconfig_9581) { + script_4846(arg0); + } + } + return; +} diff --git a/dumps/scripts/4845.cs2 b/dumps/scripts/4845.cs2 new file mode 100644 index 000000000..d84cf596f --- /dev/null +++ b/dumps/scripts/4845.cs2 @@ -0,0 +1,17 @@ +void script_4845(int arg0) { + if (((boolean)script_4828(bitconfig_9558))) { + return; + } + switch (bitconfig_9558) { + case 1: + bitconfig_9563 = arg0; + break; + case 2: + bitconfig_9572 = arg0; + break; + case 3: + bitconfig_9581 = arg0; + } + script_4846(arg0); + return; +} diff --git a/dumps/scripts/4846.cs2 b/dumps/scripts/4846.cs2 new file mode 100644 index 000000000..9fb92ebf0 --- /dev/null +++ b/dumps/scripts/4846.cs2 @@ -0,0 +1,29 @@ +void script_4846(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(1092,1249)); + setWidgetIsHidden(true, new WidgetPointer(1092,1240)); + setWidgetIsHidden(true, new WidgetPointer(1092,1231)); + setWidgetIsHidden(true, new WidgetPointer(1092,1152)); + setWidgetIsHidden(true, new WidgetPointer(1092,1072)); + setWidgetIsHidden(true, new WidgetPointer(1092,986)); + switch (arg0) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(1092,1249)); + setWidgetIsHidden(false, new WidgetPointer(1092,1152)); + setWidgetSprite(7287, new WidgetPointer(1092,1265)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1092,1240)); + setWidgetIsHidden(false, new WidgetPointer(1092,1072)); + setWidgetSprite(7288, new WidgetPointer(1092,1265)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(1092,1231)); + setWidgetIsHidden(false, new WidgetPointer(1092,986)); + setWidgetSprite(7289, new WidgetPointer(1092,1265)); + } + script_4838(); + script_4810(); + script_4840(); + script_4814(); + return; +} diff --git a/dumps/scripts/4847.cs2 b/dumps/scripts/4847.cs2 new file mode 100644 index 000000000..dad543e24 --- /dev/null +++ b/dumps/scripts/4847.cs2 @@ -0,0 +1,5 @@ +void script_4847(int arg0) { + bitconfig_9558 = arg0; + script_4849(); + return; +} diff --git a/dumps/scripts/4848.cs2 b/dumps/scripts/4848.cs2 new file mode 100644 index 000000000..dc84a89c4 --- /dev/null +++ b/dumps/scripts/4848.cs2 @@ -0,0 +1,6 @@ +void script_4848(int arg0) { + if (arg0 == bitconfig_9558) { + script_4849(); + } + return; +} diff --git a/dumps/scripts/4849.cs2 b/dumps/scripts/4849.cs2 new file mode 100644 index 000000000..0cdebd238 --- /dev/null +++ b/dumps/scripts/4849.cs2 @@ -0,0 +1,51 @@ +void script_4849() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar0 = 71566248; + ivar1 = 71566247; + ivar2 = 71566260; + ivar3 = 71566261; + ivar4 = 71566249; + ivar5 = 71566250; + setWidgetIsHidden(true, new WidgetPointer(1092,973)); + setWidgetIsHidden(true, new WidgetPointer(1092,964)); + setWidgetIsHidden(true, new WidgetPointer(1092,955)); + switch (bitconfig_9558) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(1092,973)); + if (((boolean)bitconfig_9570)) { + script_4940(); + script_4850(ivar0, ivar1, ivar2, ivar3, ivar4, ivar5); + } else { + script_4942(); + script_4851(ivar0, ivar1, ivar2, ivar3, ivar4, ivar5); + } + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1092,964)); + if (((boolean)bitconfig_9579)) { + script_4940(); + script_4850(ivar0, ivar1, ivar2, ivar3, ivar4, ivar5); + } else { + script_4942(); + script_4851(ivar0, ivar1, ivar2, ivar3, ivar4, ivar5); + } + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(1092,955)); + if (((boolean)bitconfig_9588)) { + script_4940(); + script_4850(ivar0, ivar1, ivar2, ivar3, ivar4, ivar5); + } else { + script_4942(); + script_4851(ivar0, ivar1, ivar2, ivar3, ivar4, ivar5); + } + } + script_4804(); + script_4852(); + return; +} diff --git a/dumps/scripts/485.cs2 b/dumps/scripts/485.cs2 new file mode 100644 index 000000000..4b953b043 --- /dev/null +++ b/dumps/scripts/485.cs2 @@ -0,0 +1,74 @@ +void script_485(int arg0) { + int ivar1; + int ivar2; + flow_0: + ivar1 = -1; + ivar2 = 0; + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg0)); + SWITCH (bitconfig_7512) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + case 8: + GOTO flow_8 + case 9: + GOTO flow_9 + case 10: + GOTO flow_10 + } + return; + flow_1: + ivar1 = script_486(bitconfig_7520); + GOTO flow_11 + flow_2: + ivar1 = script_486(bitconfig_7521); + GOTO flow_11 + flow_3: + ivar1 = script_486(bitconfig_7526); + GOTO flow_11 + flow_4: + ivar1 = script_486(bitconfig_7527); + GOTO flow_11 + flow_5: + ivar1 = script_486(bitconfig_7530); + GOTO flow_11 + flow_6: + ivar1 = script_486(bitconfig_7531); + GOTO flow_11 + flow_7: + ivar1 = script_486(bitconfig_7532); + GOTO flow_11 + flow_8: + ivar1 = script_486(bitconfig_7533); + GOTO flow_11 + flow_9: + ivar1 = script_486(bitconfig_7534); + GOTO flow_11 + flow_10: + ivar1 = script_486(bitconfig_7535); + flow_11: + if (ivar1 == -1) { + setWidgetIsHidden(false, new WidgetPointer(1015,135)); + setWidgetIsHidden(true, new WidgetPointer(1015,115)); + } else { + setWidgetSprite(getNpcNodemapData(ivar1, 1148), new WidgetPointer(1015,2)); + setWidgetText(new WidgetPointer(1015,0), getNpcNodemapData(ivar1, 1139)); + setWidgetText(new WidgetPointer(1015,138), "Movement: " + intToStr(getNpcNodemapData(ivar1, 1134))); + setWidgetText(new WidgetPointer(1015,139), "Damage: " + intToStr(multiply(getNpcNodemapData(ivar1, 1135), 100))); + setWidgetText(new WidgetPointer(1015,140), "Health: " + intToStr(multiply(getNpcNodemapData(ivar1, 1136), 100))); + setWidgetText(new WidgetPointer(1015,141), "Range: " + intToStr(getNpcNodemapData(ivar1, 1137))); + setWidgetText(new WidgetPointer(1015,142), "Cost: " + intToStr(getNpcNodemapData(ivar1, 1138))); + } + return; +} diff --git a/dumps/scripts/4850.cs2 b/dumps/scripts/4850.cs2 new file mode 100644 index 000000000..9b18544e4 --- /dev/null +++ b/dumps/scripts/4850.cs2 @@ -0,0 +1,17 @@ +void script_4850(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + deleteAllExtraChilds(new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + setWidgetScrollMax(0, 0, new WidgetPointer(arg0)); + script_31(arg1, arg0, 5666, 5663, 5664, 5665, 5686, 5685); + createExtraChild(new WidgetPointer(arg2), 4, 0); + setWidgetSize(10, 10, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetText("Please select a hotspot to customise from the map on the right."); + setWidgetRGB(new Color(229, 225, 187)); + setWidgetFont(495); + setWidgetTextAlignment(1, 1, 0); + return; +} diff --git a/dumps/scripts/4851.cs2 b/dumps/scripts/4851.cs2 new file mode 100644 index 000000000..e385cf247 --- /dev/null +++ b/dumps/scripts/4851.cs2 @@ -0,0 +1,124 @@ +void script_4851(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + setWidgetIsHidden(true, new WidgetPointer(1092,938)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + deleteAllExtraChilds(new WidgetPointer(arg4)); + ivar6 = 0; + ivar7 = 0; + ivar8 = 1; + ivar9 = 0; + ivar10 = 28; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + ivar14 = 0; + ivar15 = 0; + switch (bitconfig_9558) { + case 1: + ivar14 = bitconfig_9562; + ivar15 = bitconfig_9566; + break; + case 2: + ivar14 = bitconfig_9571; + ivar15 = bitconfig_9575; + break; + case 3: + ivar14 = bitconfig_9580; + ivar15 = bitconfig_9584; + } + createExtraChild(new WidgetPointer(arg4), 3, 0); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg2), 4, 0); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 5, 0); + setWidgetHidden(1); + if (((boolean)ivar15)) { + ivar11 = script_4819(bitconfig_9558); + ivar12 = script_4822(bitconfig_9558); + ivar13 = script_4825(bitconfig_9558); + if (((ivar11 == -1) || (ivar12 == -1)) || (ivar13 == -1)) { + return; + } + ivar6 = min(min(getCommonDefinitionSize(ivar11), getCommonDefinitionSize(ivar13)), getCommonDefinitionSize(ivar12)); + while (ivar8 <= ivar6) { + ivar7 = cs2method_3408(105, 105, ivar11, ivar8); + createExtraChild(new WidgetPointer(arg4), 3, ivar8); + setWidgetSize(0, ivar10, 1, 0); + setWidgetFilled(1); + if (((boolean)mod(ivar8, 2))) { + setWidgetRGB(new Color(32, 31, 26)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 2105114, "Iii"); + } else { + setWidgetRGB(new Color(26, 23, 18)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 1709842, "Iii"); + } + setWidgetPosition(0, ivar9, 0, 0); + if (((boolean)script_4828(bitconfig_9558))) { + setScriptCallOnClickContextMenu(4803, ivar8, "i"); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 4537648, "Iii"); + } + if (ivar14 == ivar7) { + setWidgetIsHidden(false, new WidgetPointer(1092,938)); + setWidgetPosition(0, ivar9, 0, 0, new WidgetPointer(1092,938)); + } + createExtraChild(new WidgetPointer(arg2), 4, ivar8); + setWidgetSize(30, ivar10, 1, 0); + setWidgetPosition(30, ivar9, 0, 0); + setWidgetText(cs2method_3408(105, 115, ivar12, ivar7)); + setWidgetRGB(new Color(229, 225, 187)); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 0); + createExtraChild(new WidgetPointer(arg3), 5, ivar8); + setWidgetSize(22, 22, 0, 0); + setWidgetPosition(5, add(4, ivar9), 0, 0); + setWidgetSprite(cs2method_3408(105, 100, ivar13, ivar7)); + ivar9 = multiply(ivar10, ivar8); + ivar8 = add(ivar8, 1); + } + } else { + createExtraChild(new WidgetPointer(arg4), 3, ivar8); + setWidgetSize(0, ivar10, 1, 0); + setWidgetFilled(1); + if (((boolean)mod(ivar8, 2))) { + setWidgetRGB(new Color(32, 31, 26)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 2105114, "Iii"); + } else { + setWidgetRGB(new Color(26, 23, 18)); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 1709842, "Iii"); + } + setWidgetPosition(0, ivar9, 0, 0); + setScriptCallOnClickContextMenu(4803, ivar8, "i"); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 4537648, "Iii"); + setWidgetIsHidden(false, new WidgetPointer(1092,938)); + setWidgetPosition(0, ivar9, 0, 0, new WidgetPointer(1092,938)); + createExtraChild(new WidgetPointer(arg2), 4, ivar8); + setWidgetSize(30, ivar10, 1, 0); + setWidgetPosition(30, ivar9, 0, 0); + setWidgetText("Reset hotspot"); + setWidgetRGB(new Color(229, 225, 187)); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 0); + createExtraChild(new WidgetPointer(arg3), 5, ivar8); + setWidgetSize(22, 22, 0, 0); + setWidgetPosition(5, add(4, ivar9), 0, 0); + setWidgetSprite(6496); + cs2method1106(49149); + ivar9 = multiply(ivar10, ivar8); + } + cs2method2100(0, 0, new WidgetPointer(arg0)); + setWidgetScrollMax(0, ivar9, new WidgetPointer(arg0)); + script_31(arg1, arg0, 5666, 5663, 5664, 5665, 5686, 5685); + return; +} diff --git a/dumps/scripts/4852.cs2 b/dumps/scripts/4852.cs2 new file mode 100644 index 000000000..1d67ba3ac --- /dev/null +++ b/dumps/scripts/4852.cs2 @@ -0,0 +1,35 @@ +void script_4852() { + int ivar0; + string svar0; + int stack_dump0; + ivar0 = -1; + svar0 = "This build slot is available, select your options and click the buy button."; + if (citadelConfigsInitialized()) { + ivar0 = script_4825(1); + cs2method2106(0, new WidgetPointer(1092,976)); + cs2method2106(0, new WidgetPointer(1092,967)); + cs2method2106(0, new WidgetPointer(1092,958)); + if (bitconfig_9562 > 0) { + stack_dump0 = bitconfig_9562; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4853.cs2 b/dumps/scripts/4853.cs2 new file mode 100644 index 000000000..da72d6d41 --- /dev/null +++ b/dumps/scripts/4853.cs2 @@ -0,0 +1,29 @@ +void script_4853() { + script_4863(); + switch (bitconfig_9552) { + case 0: + setWidgetIsHidden(true, new WidgetPointer(1092,197)); + if (isWidgetHidden(new WidgetPointer(1092,210))) { + setWidgetIsHidden(false, new WidgetPointer(1092,197)); + } + break; + case 1: + script_4860(); + script_4862(); + break; + case 2: + script_4860(); + break; + case 4: + script_4860(); + script_4861(); + break; + case 3: + script_5170(); + script_4860(); + script_4858(); + } + script_4856(); + script_4857(); + return; +} diff --git a/dumps/scripts/4854.cs2 b/dumps/scripts/4854.cs2 new file mode 100644 index 000000000..2ec42f800 --- /dev/null +++ b/dumps/scripts/4854.cs2 @@ -0,0 +1,22 @@ +void script_4854() { + setWidgetIsHidden(false, new WidgetPointer(1092,0)); + setWidgetIsHidden(false, new WidgetPointer(1092,1)); + setWidgetIsHidden(false, new WidgetPointer(1092,2)); + setWidgetIsHidden(false, new WidgetPointer(1092,3)); + setWidgetIsHidden(false, new WidgetPointer(1092,4)); + setWidgetIsHidden(false, new WidgetPointer(1092,5)); + setWidgetIsHidden(false, new WidgetPointer(1092,6)); + setWidgetIsHidden(false, new WidgetPointer(1092,7)); + setWidgetIsHidden(false, new WidgetPointer(1092,8)); + setWidgetIsHidden(false, new WidgetPointer(1092,10)); + setWidgetIsHidden(false, new WidgetPointer(1092,11)); + setWidgetIsHidden(false, new WidgetPointer(1092,12)); + setWidgetIsHidden(false, new WidgetPointer(1092,12)); + setWidgetIsHidden(false, new WidgetPointer(1092,13)); + setWidgetIsHidden(false, new WidgetPointer(1092,14)); + setWidgetIsHidden(false, new WidgetPointer(1092,15)); + setWidgetIsHidden(false, new WidgetPointer(1092,16)); + setWidgetIsHidden(false, new WidgetPointer(1092,17)); + setWidgetIsHidden(false, new WidgetPointer(1092,18)); + return; +} diff --git a/dumps/scripts/4855.cs2 b/dumps/scripts/4855.cs2 new file mode 100644 index 000000000..acea978a0 --- /dev/null +++ b/dumps/scripts/4855.cs2 @@ -0,0 +1,22 @@ +void script_4855() { + setWidgetIsHidden(true, new WidgetPointer(1092,0)); + setWidgetIsHidden(true, new WidgetPointer(1092,1)); + setWidgetIsHidden(true, new WidgetPointer(1092,2)); + setWidgetIsHidden(true, new WidgetPointer(1092,3)); + setWidgetIsHidden(true, new WidgetPointer(1092,4)); + setWidgetIsHidden(true, new WidgetPointer(1092,5)); + setWidgetIsHidden(true, new WidgetPointer(1092,6)); + setWidgetIsHidden(true, new WidgetPointer(1092,7)); + setWidgetIsHidden(true, new WidgetPointer(1092,8)); + setWidgetIsHidden(true, new WidgetPointer(1092,10)); + setWidgetIsHidden(true, new WidgetPointer(1092,11)); + setWidgetIsHidden(true, new WidgetPointer(1092,12)); + setWidgetIsHidden(true, new WidgetPointer(1092,12)); + setWidgetIsHidden(true, new WidgetPointer(1092,13)); + setWidgetIsHidden(true, new WidgetPointer(1092,14)); + setWidgetIsHidden(true, new WidgetPointer(1092,15)); + setWidgetIsHidden(true, new WidgetPointer(1092,16)); + setWidgetIsHidden(true, new WidgetPointer(1092,17)); + setWidgetIsHidden(true, new WidgetPointer(1092,18)); + return; +} diff --git a/dumps/scripts/4856.cs2 b/dumps/scripts/4856.cs2 new file mode 100644 index 000000000..1abce2d9e --- /dev/null +++ b/dumps/scripts/4856.cs2 @@ -0,0 +1,14 @@ +void script_4856() { + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4857.cs2 b/dumps/scripts/4857.cs2 new file mode 100644 index 000000000..13a6ee15a --- /dev/null +++ b/dumps/scripts/4857.cs2 @@ -0,0 +1,15 @@ +void script_4857() { + if (citadelConfigsInitialized()) { + script_4854(); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4858.cs2 b/dumps/scripts/4858.cs2 new file mode 100644 index 000000000..5f885a4b5 --- /dev/null +++ b/dumps/scripts/4858.cs2 @@ -0,0 +1,24 @@ +void script_4858() { + int ivar0; + ivar0 = 0; + if (citadelConfigsInitialized()) { + setWidgetIsHidden(true, new WidgetPointer(1092,213)); + setWidgetIsHidden(true, new WidgetPointer(1092,214)); + setWidgetIsHidden(true, new WidgetPointer(1092,215)); + ivar0 = script_4948(bitconfig_9550); + if (ivar0 <= 0) { + return; + } + setWidgetIsHidden(true, new WidgetPointer(script_4968(ivar0))); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4859.cs2 b/dumps/scripts/4859.cs2 new file mode 100644 index 000000000..5b62428e1 --- /dev/null +++ b/dumps/scripts/4859.cs2 @@ -0,0 +1,17 @@ +void script_4859() { + int ivar0; + ivar0 = -1; + if (citadelConfigsInitialized()) { + script_4855(); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/486.cs2 b/dumps/scripts/486.cs2 new file mode 100644 index 000000000..2a221c722 --- /dev/null +++ b/dumps/scripts/486.cs2 @@ -0,0 +1,55 @@ +int script_486(int arg0) { + flow_0: + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_5 + case 3: + GOTO flow_9 + case 4: + GOTO flow_13 + case 5: + GOTO flow_17 + case 6: + GOTO flow_21 + case 7: + GOTO flow_25 + } + return -1; + flow_1: + if (((boolean)bitconfig_7510)) { + return 12200; + } + return 12197; + flow_5: + if (((boolean)bitconfig_7510)) { + return 12205; + } + return 12202; + flow_9: + if (((boolean)bitconfig_7510)) { + return 12210; + } + return 12207; + flow_13: + if (((boolean)bitconfig_7510)) { + return 12215; + } + return 12212; + flow_17: + if (((boolean)bitconfig_7510)) { + return 12219; + } + return 12216; + flow_21: + if (((boolean)bitconfig_7510)) { + return 12223; + } + return 12220; + flow_25: + if (((boolean)bitconfig_7510)) { + return 12227; + } + return 12224; +} diff --git a/dumps/scripts/4860.cs2 b/dumps/scripts/4860.cs2 new file mode 100644 index 000000000..295a4f25f --- /dev/null +++ b/dumps/scripts/4860.cs2 @@ -0,0 +1,37 @@ +void script_4860() { + setWidgetIsHidden(true, new WidgetPointer(1092,1371)); + setWidgetIsHidden(true, new WidgetPointer(1092,1364)); + setWidgetIsHidden(true, new WidgetPointer(1092,1357)); + setWidgetIsHidden(true, new WidgetPointer(1092,1273)); + setWidgetIsHidden(true, new WidgetPointer(1092,1280)); + setWidgetIsHidden(true, new WidgetPointer(1092,1287)); + setWidgetIsHidden(true, new WidgetPointer(1092,1294)); + setWidgetIsHidden(true, new WidgetPointer(1092,1301)); + setWidgetIsHidden(true, new WidgetPointer(1092,1308)); + setWidgetIsHidden(true, new WidgetPointer(1092,1315)); + setWidgetIsHidden(true, new WidgetPointer(1092,1322)); + setWidgetIsHidden(true, new WidgetPointer(1092,1329)); + setWidgetIsHidden(true, new WidgetPointer(1092,1336)); + setWidgetIsHidden(true, new WidgetPointer(1092,1343)); + setWidgetIsHidden(true, new WidgetPointer(1092,1350)); + setWidgetIsHidden(true, new WidgetPointer(1092,1378)); + setWidgetIsHidden(true, new WidgetPointer(1092,1384)); + setWidgetIsHidden(true, new WidgetPointer(1092,1390)); + setWidgetIsHidden(true, new WidgetPointer(1092,1396)); + setWidgetIsHidden(true, new WidgetPointer(1092,1402)); + setWidgetIsHidden(true, new WidgetPointer(1092,1408)); + setWidgetIsHidden(true, new WidgetPointer(1092,1415)); + setWidgetIsHidden(true, new WidgetPointer(1092,1421)); + setWidgetIsHidden(true, new WidgetPointer(1092,1427)); + setWidgetIsHidden(true, new WidgetPointer(1092,1433)); + setWidgetIsHidden(true, new WidgetPointer(1092,1439)); + setWidgetIsHidden(true, new WidgetPointer(1092,1445)); + setWidgetIsHidden(true, new WidgetPointer(1092,1451)); + setWidgetIsHidden(true, new WidgetPointer(1092,1457)); + setWidgetIsHidden(true, new WidgetPointer(1092,1463)); + setWidgetIsHidden(true, new WidgetPointer(1092,1469)); + setWidgetIsHidden(true, new WidgetPointer(1092,1475)); + setWidgetIsHidden(true, new WidgetPointer(1092,1481)); + setWidgetIsHidden(true, new WidgetPointer(1092,1487)); + return; +} diff --git a/dumps/scripts/4861.cs2 b/dumps/scripts/4861.cs2 new file mode 100644 index 000000000..1fb645a23 --- /dev/null +++ b/dumps/scripts/4861.cs2 @@ -0,0 +1,17 @@ +void script_4861() { + if (citadelConfigsInitialized()) { + setWidgetIsHidden(false, new WidgetPointer(1092,1371)); + setWidgetIsHidden(false, new WidgetPointer(1092,1364)); + setWidgetIsHidden(false, new WidgetPointer(1092,1357)); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4862.cs2 b/dumps/scripts/4862.cs2 new file mode 100644 index 000000000..125ac5693 --- /dev/null +++ b/dumps/scripts/4862.cs2 @@ -0,0 +1,98 @@ +void script_4862() { + if (citadelConfigsInitialized()) { + if (script_4949(4) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,184)); + } + if (script_4949(5) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,185)); + } + if (script_4949(6) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,186)); + } + if (script_4949(7) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,187)); + } + if (script_4949(8) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,188)); + } + if (script_4949(9) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,189)); + } + if (script_4949(10) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,190)); + } + if (script_4949(11) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,191)); + } + if (script_4949(12) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,192)); + } + if (script_4949(13) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,193)); + } + if (script_4949(14) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,194)); + } + if (script_4949(15) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,195)); + } + if (script_4949(16) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,0)); + } + if (script_4949(17) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,1)); + } + if (script_4949(18) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,2)); + } + if (script_4949(19) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,3)); + } + if (script_4949(20) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,4)); + } + if (script_4949(21) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,5)); + } + if (script_4949(22) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,6)); + } + if (script_4949(23) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,7)); + } + if (script_4949(24) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,8)); + } + if (script_4949(25) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,9)); + } + if (script_4949(26) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,10)); + } + if (script_4949(27) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,11)); + } + if (script_4949(28) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,12)); + } + if (script_4949(29) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,13)); + } + if (script_4949(30) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,14)); + } + if (script_4949(31) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,15)); + } + if (script_4949(32) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,16)); + } + if (script_4949(33) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,17)); + } + if (script_4949(34) <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1092,18)); + } + } + return; +} diff --git a/dumps/scripts/4863.cs2 b/dumps/scripts/4863.cs2 new file mode 100644 index 000000000..35ad0613f --- /dev/null +++ b/dumps/scripts/4863.cs2 @@ -0,0 +1,37 @@ +void script_4863() { + setWidgetIsHidden(false, new WidgetPointer(1092,213)); + setWidgetIsHidden(false, new WidgetPointer(1092,214)); + setWidgetIsHidden(false, new WidgetPointer(1092,215)); + setWidgetIsHidden(false, new WidgetPointer(1092,184)); + setWidgetIsHidden(false, new WidgetPointer(1092,185)); + setWidgetIsHidden(false, new WidgetPointer(1092,186)); + setWidgetIsHidden(false, new WidgetPointer(1092,187)); + setWidgetIsHidden(false, new WidgetPointer(1092,188)); + setWidgetIsHidden(false, new WidgetPointer(1092,189)); + setWidgetIsHidden(false, new WidgetPointer(1092,190)); + setWidgetIsHidden(false, new WidgetPointer(1092,191)); + setWidgetIsHidden(false, new WidgetPointer(1092,192)); + setWidgetIsHidden(false, new WidgetPointer(1092,193)); + setWidgetIsHidden(false, new WidgetPointer(1092,194)); + setWidgetIsHidden(false, new WidgetPointer(1092,195)); + setWidgetIsHidden(false, new WidgetPointer(1092,0)); + setWidgetIsHidden(false, new WidgetPointer(1092,1)); + setWidgetIsHidden(false, new WidgetPointer(1092,2)); + setWidgetIsHidden(false, new WidgetPointer(1092,3)); + setWidgetIsHidden(false, new WidgetPointer(1092,4)); + setWidgetIsHidden(false, new WidgetPointer(1092,5)); + setWidgetIsHidden(false, new WidgetPointer(1092,6)); + setWidgetIsHidden(false, new WidgetPointer(1092,7)); + setWidgetIsHidden(false, new WidgetPointer(1092,8)); + setWidgetIsHidden(false, new WidgetPointer(1092,9)); + setWidgetIsHidden(false, new WidgetPointer(1092,10)); + setWidgetIsHidden(false, new WidgetPointer(1092,11)); + setWidgetIsHidden(false, new WidgetPointer(1092,12)); + setWidgetIsHidden(false, new WidgetPointer(1092,13)); + setWidgetIsHidden(false, new WidgetPointer(1092,14)); + setWidgetIsHidden(false, new WidgetPointer(1092,15)); + setWidgetIsHidden(false, new WidgetPointer(1092,16)); + setWidgetIsHidden(false, new WidgetPointer(1092,17)); + setWidgetIsHidden(false, new WidgetPointer(1092,18)); + return; +} diff --git a/dumps/scripts/4864.cs2 b/dumps/scripts/4864.cs2 new file mode 100644 index 000000000..71559f35d --- /dev/null +++ b/dumps/scripts/4864.cs2 @@ -0,0 +1,150 @@ +void script_4864() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + int ivar37; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + cs2func_script_4797_struct(6,0,0) structdump_0; + int stack_dump1; + cs2func_script_4791_struct(7,1,0) structdump_2; + int stack_dump3; + cs2func_script_4792_struct(6,0,0) structdump_4; + script_4865(); + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 1; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = -1; + svar0 = ""; + ivar27 = 0; + ivar28 = 0; + ivar29 = 0; + ivar30 = 0; + ivar31 = 0; + ivar32 = 0; + ivar33 = 0; + ivar34 = 0; + svar1 = ""; + svar2 = "You do not have permission from your clan to set the primary resource target."; + svar3 = "Toggle whether this resource is the primary resource target."; + svar4 = "You do not have permission from your clan to set resource target amounts."; + svar5 = "Set a target amount of this resource to be collected."; + ivar35 = -1; + globalarray_0 = new int[10]; + ivar36 = 0; + ivar37 = 0; + if (citadelConfigsInitialized()) { + structdump_0 = script_4797(); + ivar15 = structdump_0.intpart_5; + ivar16 = structdump_0.intpart_4; + ivar17 = structdump_0.intpart_3; + ivar14 = structdump_0.intpart_2; + ivar13 = structdump_0.intpart_1; + ivar12 = structdump_0.intpart_0; + while (ivar3 <= 31) { + ivar4 = script_4790(ivar3); + if (ivar4 > 0) { + stack_dump1 = ivar4; + structdump_2 = script_4791(stack_dump1); + ivar32 = structdump_2.intpart_6; + ivar31 = structdump_2.intpart_5; + ivar30 = structdump_2.intpart_4; + ivar29 = structdump_2.intpart_3; + ivar28 = structdump_2.intpart_2; + ivar27 = structdump_2.intpart_1; + svar0 = structdump_2.stringpart_0; + ivar26 = structdump_2.intpart_0; + stack_dump1 = ivar4; + stack_dump3 = ivar27; + structdump_4 = script_4792(stack_dump1, stack_dump3); + ivar9 = structdump_4.intpart_5; + ivar11 = structdump_4.intpart_4; + ivar10 = structdump_4.intpart_3; + ivar8 = structdump_4.intpart_2; + ivar7 = structdump_4.intpart_1; + ivar6 = structdump_4.intpart_0; + ivar5 = script_4975(ivar4); + if (ivar5 == 3) { + ivar18 = add(ivar18, ivar6); + ivar19 = add(ivar19, ivar7); + ivar20 = add(ivar20, ivar8); + ivar23 = add(ivar23, ivar11); + ivar22 = add(ivar22, ivar10); + ivar21 = add(ivar21, ivar9); + } + } + ivar3 = add(ivar3, 1); + } + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4865.cs2 b/dumps/scripts/4865.cs2 new file mode 100644 index 000000000..46ac61eb2 --- /dev/null +++ b/dumps/scripts/4865.cs2 @@ -0,0 +1,5 @@ +void script_4865() { + int ivar0; + ivar0 = add(0, 1); + return; +} diff --git a/dumps/scripts/4866.cs2 b/dumps/scripts/4866.cs2 new file mode 100644 index 000000000..7c203026f --- /dev/null +++ b/dumps/scripts/4866.cs2 @@ -0,0 +1,100 @@ +?? script_4866(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + string svar0; + string svar1; + int stack_dump0; + cs2func_script_5223_struct(2,0,0) structdump_1; + ivar5 = script_4867(arg0); + ivar6 = script_4868(arg0); + ivar7 = script_4869(arg0); + ivar8 = script_4870(arg0); + ivar9 = getWidgetParentUid(new WidgetPointer(ivar6)); + ivar10 = getWidgetParentUid(new WidgetPointer(ivar9)); + ivar11 = getWidgetParentUid(new WidgetPointer(ivar10)); + ivar12 = 1; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + ivar13 = script_5215(arg0); + ivar14 = getWidgetActualWidth(new WidgetPointer(getWidgetParentUid(new WidgetPointer(ivar6)))); + arg1 = divide(arg1, 100); + arg4 = max(arg4, ivar13); + ivar15 = divide(multiply(arg1, ivar14), arg4); + ivar16 = divide(multiply(ivar13, ivar14), arg4); + ivar17 = divide(multiply(arg2, ivar14), arg4); + ivar18 = divide(multiply(arg3, ivar14), arg4); + ivar19 = subtract(arg1, add(arg2, arg3)); + ivar20 = divide(multiply(ivar19, ivar14), arg4); + setWidgetText(new WidgetPointer(ivar5), intToStr(arg1)); + ivar21 = 0; + setWidgetSize(min(subtract(ivar17, 2), ivar15), getWidgetActualHeight(new WidgetPointer(ivar6)), 0, 0, new WidgetPointer(ivar6)); + setWidgetPosition(1, 0, 0, 0, new WidgetPointer(ivar6)); + setWidgetSize(min(ivar18, subtract(ivar15, ivar17)), getWidgetActualHeight(new WidgetPointer(ivar7)), 0, 0, new WidgetPointer(ivar7)); + setWidgetPosition(ivar17, 0, 0, 0, new WidgetPointer(ivar7)); + setWidgetSize(min(subtract(ivar20, 2), subtract(ivar15, add(ivar17, ivar18))), getWidgetActualHeight(new WidgetPointer(ivar8)), 0, 0, new WidgetPointer(ivar8)); + setWidgetPosition(add(add(ivar17, ivar18), 1), 0, 0, 0, new WidgetPointer(ivar8)); + ivar22 = -1; + ivar23 = -1; + ivar24 = 7317; + ivar25 = 7314; + stack_dump0 = arg0; + structdump_1 = script_5223(stack_dump0); + ivar23 = structdump_1.intpart_1; + ivar22 = structdump_1.intpart_0; + if ((ivar22 != -1) && (ivar23 != -1)) { + ivar16 = add(ivar16, 82); + ivar16 = subtract(ivar16, divide(getWidgetActualWidth(new WidgetPointer(ivar23)), 2)); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + svar0 = cs2method_3408(105, 115, 4285, arg0); + svar1 = svar0 + "
" + "Total : " + intToStr(arg1) + "
" + "Upkeep : " + intToStr(arg2) + "
" + "Upgrades : " + intToStr(arg3) + "
" + "Surplus : " + intToStr(ivar19); + if (ivar13 > 0) { + svar1 = concat(svar1, "
" + "Goal: " + intToStr(ivar13)); + } + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/4867.cs2 b/dumps/scripts/4867.cs2 new file mode 100644 index 000000000..c07e50f63 --- /dev/null +++ b/dumps/scripts/4867.cs2 @@ -0,0 +1,25 @@ +int script_4867(int arg0) { + switch (arg0) { + case 1: + return 71565436; + case 2: + return 71566947; + case 3: + return 71566962; + case 4: + return 71566977; + case 5: + return 71566992; + case 6: + return 71567037; + case 7: + return 71567052; + case 8: + return 71567022; + case 9: + return 71567006; + case 10: + return 71567067; + } + return -1; +} diff --git a/dumps/scripts/4868.cs2 b/dumps/scripts/4868.cs2 new file mode 100644 index 000000000..8f4135e6f --- /dev/null +++ b/dumps/scripts/4868.cs2 @@ -0,0 +1,25 @@ +int script_4868(int arg0) { + switch (arg0) { + case 1: + return 71565418; + case 2: + return 71566937; + case 3: + return 71566952; + case 4: + return 71566967; + case 5: + return 71566982; + case 6: + return 71567027; + case 7: + return 71567042; + case 8: + return 71567012; + case 9: + return 71566997; + case 10: + return 71567057; + } + return -1; +} diff --git a/dumps/scripts/4869.cs2 b/dumps/scripts/4869.cs2 new file mode 100644 index 000000000..e1944a542 --- /dev/null +++ b/dumps/scripts/4869.cs2 @@ -0,0 +1,25 @@ +int script_4869(int arg0) { + switch (arg0) { + case 1: + return 71565419; + case 2: + return 71566938; + case 3: + return 71566953; + case 4: + return 71566968; + case 5: + return 71566983; + case 6: + return 71567028; + case 7: + return 71567043; + case 8: + return 71567013; + case 9: + return 71566998; + case 10: + return 71567058; + } + return -1; +} diff --git a/dumps/scripts/487.cs2 b/dumps/scripts/487.cs2 new file mode 100644 index 000000000..f59822c92 --- /dev/null +++ b/dumps/scripts/487.cs2 @@ -0,0 +1,31 @@ +void script_487() { + flow_0: + setWidgetSprite(3263, new WidgetPointer(1015,95)); + setWidgetSprite(3263, new WidgetPointer(1015,89)); + setWidgetSprite(3263, new WidgetPointer(1015,83)); + setWidgetSprite(3263, new WidgetPointer(1015,77)); + SWITCH (bitconfig_7515) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + } + return; + flow_1: + setWidgetSprite(3265, new WidgetPointer(1015,95)); + GOTO flow_5 + flow_2: + setWidgetSprite(3265, new WidgetPointer(1015,89)); + GOTO flow_5 + flow_3: + setWidgetSprite(3265, new WidgetPointer(1015,83)); + GOTO flow_5 + flow_4: + setWidgetSprite(3265, new WidgetPointer(1015,77)); + flow_5: + return; +} diff --git a/dumps/scripts/4870.cs2 b/dumps/scripts/4870.cs2 new file mode 100644 index 000000000..972074937 --- /dev/null +++ b/dumps/scripts/4870.cs2 @@ -0,0 +1,25 @@ +int script_4870(int arg0) { + switch (arg0) { + case 1: + return 71565420; + case 2: + return 71566939; + case 3: + return 71566954; + case 4: + return 71566969; + case 5: + return 71566984; + case 6: + return 71567029; + case 7: + return 71567044; + case 8: + return 71567014; + case 9: + return 71566999; + case 10: + return 71567059; + } + return -1; +} diff --git a/dumps/scripts/4871.cs2 b/dumps/scripts/4871.cs2 new file mode 100644 index 000000000..e5a64b014 --- /dev/null +++ b/dumps/scripts/4871.cs2 @@ -0,0 +1,25 @@ +int script_4871(int arg0) { + switch (arg0) { + case 1: + return 71565381; + case 2: + return 71565399; + case 3: + return 71565397; + case 4: + return 71565383; + case 5: + return 71565387; + case 6: + return 71565395; + case 7: + return 71565391; + case 8: + return 71565389; + case 9: + return 71565385; + case 10: + return 71565393; + } + return -1; +} diff --git a/dumps/scripts/4872.cs2 b/dumps/scripts/4872.cs2 new file mode 100644 index 000000000..00e9ceb87 --- /dev/null +++ b/dumps/scripts/4872.cs2 @@ -0,0 +1,25 @@ +int script_4872(int arg0) { + switch (arg0) { + case 1: + return 71565400; + case 2: + return 71567130; + case 3: + return 71567131; + case 4: + return 71567132; + case 5: + return 71567133; + case 6: + return 71567136; + case 7: + return 71567137; + case 8: + return 71567135; + case 9: + return 71567134; + case 10: + return 71567138; + } + return -1; +} diff --git a/dumps/scripts/4873.cs2 b/dumps/scripts/4873.cs2 new file mode 100644 index 000000000..b916e682b --- /dev/null +++ b/dumps/scripts/4873.cs2 @@ -0,0 +1,4 @@ +void script_4873(int arg0) { + script_4874(arg0); + return; +} diff --git a/dumps/scripts/4874.cs2 b/dumps/scripts/4874.cs2 new file mode 100644 index 000000000..128c0468f --- /dev/null +++ b/dumps/scripts/4874.cs2 @@ -0,0 +1,12 @@ +void script_4874(int arg0) { + int ivar1; + bitconfig_9553 = arg0; + ivar1 = add(0, 1); + while (ivar1 <= 10) { + setWidgetIsHidden(true, new WidgetPointer(script_4871(ivar1))); + ivar1 = add(ivar1, 1); + } + setWidgetIsHidden(false, new WidgetPointer(script_4871(arg0))); + script_4864(); + return; +} diff --git a/dumps/scripts/4875.cs2 b/dumps/scripts/4875.cs2 new file mode 100644 index 000000000..39c1dbdfe --- /dev/null +++ b/dumps/scripts/4875.cs2 @@ -0,0 +1,4 @@ +void script_4875(int arg0) { + script_4876(arg0); + return; +} diff --git a/dumps/scripts/4876.cs2 b/dumps/scripts/4876.cs2 new file mode 100644 index 000000000..19934d583 --- /dev/null +++ b/dumps/scripts/4876.cs2 @@ -0,0 +1,10 @@ +void script_4876(int arg0) { + int ivar1; + ivar1 = add(0, 1); + while (ivar1 <= 10) { + setWidgetIsHidden(true, new WidgetPointer(script_4872(ivar1))); + ivar1 = add(ivar1, 1); + } + setWidgetIsHidden(false, new WidgetPointer(script_4872(arg0))); + return; +} diff --git a/dumps/scripts/4877.cs2 b/dumps/scripts/4877.cs2 new file mode 100644 index 000000000..f6620b5d3 --- /dev/null +++ b/dumps/scripts/4877.cs2 @@ -0,0 +1,4 @@ +void script_4877(int arg0) { + script_4876(arg0); + return; +} diff --git a/dumps/scripts/4878.cs2 b/dumps/scripts/4878.cs2 new file mode 100644 index 000000000..bdc96f4f4 --- /dev/null +++ b/dumps/scripts/4878.cs2 @@ -0,0 +1,3 @@ +void script_4878(int arg0) { + return; +} diff --git a/dumps/scripts/4879.cs2 b/dumps/scripts/4879.cs2 new file mode 100644 index 000000000..1ee30a59b --- /dev/null +++ b/dumps/scripts/4879.cs2 @@ -0,0 +1,4 @@ +void script_4879(int arg0) { + script_4880(arg0); + return; +} diff --git a/dumps/scripts/488.cs2 b/dumps/scripts/488.cs2 new file mode 100644 index 000000000..feb245898 --- /dev/null +++ b/dumps/scripts/488.cs2 @@ -0,0 +1,42 @@ +int script_488(int arg0) { + flow_0: + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + case 8: + GOTO flow_8 + case 9: + GOTO flow_9 + } + return -1; + flow_1: + return 293; + flow_2: + return 299; + flow_3: + return 300; + flow_4: + return 301; + flow_5: + return 305; + flow_6: + return 1044; + flow_7: + return 1045; + flow_8: + return 1046; + flow_9: + return 1047; +} diff --git a/dumps/scripts/4880.cs2 b/dumps/scripts/4880.cs2 new file mode 100644 index 000000000..c96dd2e93 --- /dev/null +++ b/dumps/scripts/4880.cs2 @@ -0,0 +1,141 @@ +void script_4880(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + string svar0; + svar0 = ""; + ivar1 = 0; + ivar2 = 0; + ivar3 = 3; + ivar4 = 0; + ivar5 = 2236962; + ivar6 = -1; + ivar7 = 0; + ivar8 = script_4964(arg0); + ivar9 = 0; + ivar10 = 0; + switch (arg0) { + case 71566780: + case 71566750: + case 71566707: + case 71566744: + case 71566713: + case 71566774: + case 71566768: + case 71566738: + case 71566719: + case 71566689: + case 71566792: + case 71566732: + case 71566798: + case 71566762: + case 71566695: + case 71566786: + case 71566756: + case 71566726: + case 71566701: + ivar10 = 1; + } + if (citadelConfigsInitialized()) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + script_4407(arg0, 1, 178); + createExtraChild(new WidgetPointer(arg0), 3, 0); + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(0, 0, 1, 1); + setWidgetRGB(new Color(85, 51, 51)); + setWidgetFilled(1); + if (((boolean)ivar10)) { + cs2method2103(255); + setWidgetHidden(1); + } + ivar4 = getExtraChildGap(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 3, 1); + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(0, 0, 1, 1); + setWidgetRGB(new Color(238, 204, 238)); + if (((boolean)ivar10)) { + cs2method2103(255); + } + ivar7 = script_4971(ivar8); + ivar6 = script_5171(ivar7); + createExtraChild(new WidgetPointer(arg0), 5, 2); + setWidgetSize(18, 18, 0, 0); + setWidgetPosition(0, 0, 1, 1); + if (((boolean)ivar10)) { + cs2method2103(255); + } + switch (ivar8) { + case 35: + case 38: + case 39: + case 36: + case 37: + case 42: + case 43: + case 40: + case 41: + case 46: + case 47: + case 44: + case 45: + case 48: + ivar2 = 1; + ivar3 = 1; + break; + default: + ivar2 = 0; + ivar3 = 3; + } + if (ivar9 > 0) { + ivar1 = 1; + ivar5 = 12303291; + } else { + ivar1 = 0; + ivar5 = 2236962; + } + if (((boolean)ivar2)) { + if (((boolean)ivar1)) { + svar0 = "Build over the existing blanket change."; + } else { + svar0 = "Build a new blanket change."; + } + } else { + switch (ivar8) { + case 25: + case 24: + case 27: + case 26: + case 28: + if (((boolean)ivar1)) { + svar0 = "Build over the existing statue."; + } else { + svar0 = "Build a new statue."; + } + break; + default: + if (((boolean)ivar1)) { + svar0 = "Build over the existing customisation."; + } else { + svar0 = "Build a new customisation."; + } + } + } + } + ivar11 = script_5216(ivar8); + if (((boolean)ivar2)) { + setWidgetIsHidden(true, new WidgetPointer(getWidgetParentUid(new WidgetPointer(arg0)))); + if (ivar11 != -1) { + setScriptCallOnMouseOver(4882, new WidgetPointer(-32768,3), svar0, ivar3, "Isi", new WidgetPointer(ivar11)); + } + } + setScriptCallOnMouseOver(4882, new WidgetPointer(-32768,3), svar0, ivar3, "Isi", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4881.cs2 b/dumps/scripts/4881.cs2 new file mode 100644 index 000000000..f330aa61f --- /dev/null +++ b/dumps/scripts/4881.cs2 @@ -0,0 +1,22 @@ +void script_4881() { + script_4880(71566689); + script_4880(71566695); + script_4880(71566701); + script_4880(71566707); + script_4880(71566713); + script_4880(71566719); + script_4880(71566726); + script_4880(71566732); + script_4880(71566738); + script_4880(71566744); + script_4880(71566750); + script_4880(71566756); + script_4880(71566762); + script_4880(71566768); + script_4880(71566774); + script_4880(71566780); + script_4880(71566786); + script_4880(71566792); + script_4880(71566798); + return; +} diff --git a/dumps/scripts/4882.cs2 b/dumps/scripts/4882.cs2 new file mode 100644 index 000000000..dd3d8475f --- /dev/null +++ b/dumps/scripts/4882.cs2 @@ -0,0 +1,4 @@ +void script_4882(int arg0,int arg1,string arg2) { + script_4883(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/4883.cs2 b/dumps/scripts/4883.cs2 new file mode 100644 index 000000000..44f125bcf --- /dev/null +++ b/dumps/scripts/4883.cs2 @@ -0,0 +1,202 @@ +void script_4883(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar1; + ivar2 = script_4964(arg0); + ivar3 = script_4971(ivar2); + ivar4 = getWidgetParentUid(new WidgetPointer(arg0)); + ivar5 = getWidgetParentUid(new WidgetPointer(ivar4)); + ivar6 = script_5216(ivar2); + if (ivar6 == -1) { + ivar6 = arg0; + } + svar1 = ""; + ivar7 = 0; + if (citadelConfigsInitialized()) { + switch (arg0) { + case 71566805: + arg1 = 1; + arg2 = "Build a new party room chair customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566821: + arg1 = 1; + arg2 = "Build a new party room table customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566813: + arg1 = 1; + arg2 = "Build a new flag customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566829: + arg1 = 1; + arg2 = "Build a new potted plant customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566837: + arg1 = 1; + arg2 = "Build a new sundial customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566845: + arg1 = 1; + arg2 = "Build a new keep flag customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566853: + arg1 = 1; + arg2 = "Build a new keep tapestry customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566861: + arg1 = 1; + arg2 = "Build a new keep banner customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566869: + arg1 = 1; + arg2 = "Build a new keep shield customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566877: + arg1 = 1; + arg2 = "Build a new keep fireplace customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566885: + arg1 = 1; + arg2 = "Build a new keep lower window customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566893: + arg1 = 1; + arg2 = "Build a new keep upper window customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566901: + arg1 = 1; + arg2 = "Build a new keep door customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71566909: + arg1 = 1; + arg2 = "Build a new keep wall pattern customisation."; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + arg2 = "Build over: " + script_4914(ivar3); + if (((boolean)ivar7)) { + arg2 = "Build over " + script_4914(ivar3); + } + if (getWidgetActualX(new WidgetPointer(ivar4)) < subtract(divide(getWidgetActualWidth(new WidgetPointer(ivar5)), 2), 30)) { + arg1 = 1; + } + } + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,300), new WidgetPointer(arg0), -1, arg2, 120, 3793, 3793, 16777215, 13, 4, arg1, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(arg0)); + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,300), new WidgetPointer(arg0), -1, arg2, 120, 3793, 3793, 16777215, 13, 4, arg1, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(ivar6)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,300), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4884.cs2 b/dumps/scripts/4884.cs2 new file mode 100644 index 000000000..03f6f1e69 --- /dev/null +++ b/dumps/scripts/4884.cs2 @@ -0,0 +1,4 @@ +void script_4884(int arg0) { + script_4885(arg0); + return; +} diff --git a/dumps/scripts/4885.cs2 b/dumps/scripts/4885.cs2 new file mode 100644 index 000000000..b3cb09542 --- /dev/null +++ b/dumps/scripts/4885.cs2 @@ -0,0 +1,64 @@ +void script_4885(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + if (citadelConfigsInitialized()) { + ivar2 = script_4964(arg0); + ivar3 = script_4971(ivar2); + if (((boolean)script_4886(ivar3))) { + return; + } + if (((bitconfig_9570 == ivar3) || (bitconfig_9579 == ivar3)) || (bitconfig_9588 == ivar3)) { + return; + } + switch (ivar2) { + case 35: + case 38: + case 39: + case 36: + case 37: + case 42: + case 43: + case 40: + case 41: + case 46: + case 47: + case 44: + case 45: + case 48: + ivar1 = 0; + break; + default: + ivar1 = 1; + } + if ((bitconfig_9558 > 0) && ((boolean)script_4828(bitconfig_9558))) { + switch (bitconfig_9558) { + case 1: + bitconfig_9570 = ivar3; + bitconfig_9564 = ivar1; + break; + case 2: + bitconfig_9579 = ivar3; + bitconfig_9573 = ivar1; + break; + case 3: + bitconfig_9588 = ivar3; + bitconfig_9582 = ivar1; + } + return; + } + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4886.cs2 b/dumps/scripts/4886.cs2 new file mode 100644 index 000000000..9eef488b2 --- /dev/null +++ b/dumps/scripts/4886.cs2 @@ -0,0 +1,28 @@ +int script_4886(int arg0) { + int ivar1; + switch (arg0) { + case 34: + case 35: + case 32: + case 33: + case 21: + case 22: + case 42: + case 41: + case 31: + return 1; + } + ivar1 = 0; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return 0; +} diff --git a/dumps/scripts/4887.cs2 b/dumps/scripts/4887.cs2 new file mode 100644 index 000000000..1b1018bdc --- /dev/null +++ b/dumps/scripts/4887.cs2 @@ -0,0 +1,4 @@ +void script_4887(int arg0) { + script_4888(arg0); + return; +} diff --git a/dumps/scripts/4888.cs2 b/dumps/scripts/4888.cs2 new file mode 100644 index 000000000..968f7d225 --- /dev/null +++ b/dumps/scripts/4888.cs2 @@ -0,0 +1,10 @@ +void script_4888(int arg0) { + script_4944(); + script_4933(); + script_4899(2); + setWidgetIsHidden(false, new WidgetPointer(1092,303)); + setWidgetIsHidden(false, new WidgetPointer(1092,260)); + bitconfig_9558 = arg0; + script_4849(); + return; +} diff --git a/dumps/scripts/4889.cs2 b/dumps/scripts/4889.cs2 new file mode 100644 index 000000000..49bb056e4 --- /dev/null +++ b/dumps/scripts/4889.cs2 @@ -0,0 +1,26 @@ +?? script_4889() { + string svar0; + svar0 = ""; + setWidgetIsHidden(true, new WidgetPointer(1092,1493)); + setWidgetIsHidden(true, new WidgetPointer(1092,1509)); + setWidgetIsHidden(true, new WidgetPointer(1092,1501)); + setWidgetIsHidden(true, new WidgetPointer(1092,1517)); + setWidgetIsHidden(true, new WidgetPointer(1092,1525)); + setWidgetIsHidden(true, new WidgetPointer(1092,1533)); + setWidgetIsHidden(true, new WidgetPointer(1092,1541)); + setWidgetIsHidden(true, new WidgetPointer(1092,1549)); + setWidgetIsHidden(true, new WidgetPointer(1092,1557)); + setWidgetIsHidden(true, new WidgetPointer(1092,1565)); + setWidgetIsHidden(true, new WidgetPointer(1092,1573)); + setWidgetIsHidden(true, new WidgetPointer(1092,1581)); + setWidgetIsHidden(true, new WidgetPointer(1092,1589)); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ +} diff --git a/dumps/scripts/489.cs2 b/dumps/scripts/489.cs2 new file mode 100644 index 000000000..6b228d76b --- /dev/null +++ b/dumps/scripts/489.cs2 @@ -0,0 +1,42 @@ +int script_489(int arg0) { + flow_0: + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + case 8: + GOTO flow_8 + case 9: + GOTO flow_9 + } + return -1; + flow_1: + return 66519098; + flow_2: + return 66519100; + flow_3: + return 66519102; + flow_4: + return 66519104; + flow_5: + return 66519108; + flow_6: + return 66519110; + flow_7: + return 66519112; + flow_8: + return 66519114; + flow_9: + return 66519106; +} diff --git a/dumps/scripts/4890.cs2 b/dumps/scripts/4890.cs2 new file mode 100644 index 000000000..305f9397b --- /dev/null +++ b/dumps/scripts/4890.cs2 @@ -0,0 +1,7 @@ +void script_4890(int arg0) { + script_4896(); + script_4897(arg0); + bitconfig_9548 = arg0; + script_4895(); + return; +} diff --git a/dumps/scripts/4891.cs2 b/dumps/scripts/4891.cs2 new file mode 100644 index 000000000..63ff816b8 --- /dev/null +++ b/dumps/scripts/4891.cs2 @@ -0,0 +1,4 @@ +void script_4891() { + script_4895(); + return; +} diff --git a/dumps/scripts/4892.cs2 b/dumps/scripts/4892.cs2 new file mode 100644 index 000000000..f2f961884 --- /dev/null +++ b/dumps/scripts/4892.cs2 @@ -0,0 +1,14 @@ +void script_4892() { + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4893.cs2 b/dumps/scripts/4893.cs2 new file mode 100644 index 000000000..c264b6fae --- /dev/null +++ b/dumps/scripts/4893.cs2 @@ -0,0 +1,5 @@ +void script_4893() { + bitconfig_9549 = 1; + script_4895(); + return; +} diff --git a/dumps/scripts/4894.cs2 b/dumps/scripts/4894.cs2 new file mode 100644 index 000000000..8a83974d3 --- /dev/null +++ b/dumps/scripts/4894.cs2 @@ -0,0 +1,5 @@ +void script_4894() { + bitconfig_9549 = 0; + script_4895(); + return; +} diff --git a/dumps/scripts/4895.cs2 b/dumps/scripts/4895.cs2 new file mode 100644 index 000000000..954d8e077 --- /dev/null +++ b/dumps/scripts/4895.cs2 @@ -0,0 +1,25 @@ +void script_4895() { + int ivar0; + int stack_dump0; + ivar0 = 0; + if (citadelConfigsInitialized()) { + stack_dump0 = bitconfig_9548; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (((boolean)ivar0)) { + setWidgetIsHidden(true, new WidgetPointer(1092,419)); + setWidgetIsHidden(true, new WidgetPointer(1092,427)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1092,419)); + setWidgetIsHidden(false, new WidgetPointer(1092,427)); + } + return; +} diff --git a/dumps/scripts/4896.cs2 b/dumps/scripts/4896.cs2 new file mode 100644 index 000000000..36e95ee8e --- /dev/null +++ b/dumps/scripts/4896.cs2 @@ -0,0 +1,7 @@ +void script_4896() { + setWidgetIsHidden(true, new WidgetPointer(1092,557)); + setWidgetIsHidden(true, new WidgetPointer(1092,564)); + setWidgetIsHidden(true, new WidgetPointer(1092,578)); + setWidgetIsHidden(true, new WidgetPointer(1092,571)); + return; +} diff --git a/dumps/scripts/4897.cs2 b/dumps/scripts/4897.cs2 new file mode 100644 index 000000000..3304d189d --- /dev/null +++ b/dumps/scripts/4897.cs2 @@ -0,0 +1,19 @@ +void script_4897(int arg0) { + switch (arg0) { + case 0: + setWidgetIsHidden(false, new WidgetPointer(1092,557)); + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(1092,564)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1092,578)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(1092,571)); + break; + default: + return; + } + return; +} diff --git a/dumps/scripts/4898.cs2 b/dumps/scripts/4898.cs2 new file mode 100644 index 000000000..e07707c35 --- /dev/null +++ b/dumps/scripts/4898.cs2 @@ -0,0 +1,4 @@ +void script_4898(int arg0) { + script_4899(arg0); + return; +} diff --git a/dumps/scripts/4899.cs2 b/dumps/scripts/4899.cs2 new file mode 100644 index 000000000..5675296f0 --- /dev/null +++ b/dumps/scripts/4899.cs2 @@ -0,0 +1,66 @@ +void script_4899(int arg0) { + bitconfig_9552 = arg0; + script_4935(); + script_4940(); + switch (arg0) { + case 0: + setWidgetIsHidden(true, new WidgetPointer(1092,212)); + setWidgetIsHidden(true, new WidgetPointer(1092,217)); + setWidgetIsHidden(true, new WidgetPointer(1092,216)); + setWidgetText(new WidgetPointer(1092,859), ""); + setWidgetIsHidden(true, new WidgetPointer(1092,847)); + script_4913(); + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(1092,212)); + setWidgetIsHidden(true, new WidgetPointer(1092,217)); + setWidgetIsHidden(true, new WidgetPointer(1092,216)); + setWidgetText(new WidgetPointer(1092,859), ""); + setWidgetIsHidden(true, new WidgetPointer(1092,847)); + setWidgetIsHidden(true, new WidgetPointer(1092,197)); + script_5009(); + script_5011(); + break; + case 2: + script_4860(); + script_4863(); + script_4859(); + setWidgetIsHidden(true, new WidgetPointer(1092,212)); + setWidgetIsHidden(false, new WidgetPointer(1092,217)); + setWidgetIsHidden(false, new WidgetPointer(1092,216)); + setWidgetText(new WidgetPointer(1092,859), ""); + setWidgetIsHidden(true, new WidgetPointer(1092,847)); + setWidgetIsHidden(true, new WidgetPointer(1092,197)); + script_5009(); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(1092,212)); + setWidgetIsHidden(true, new WidgetPointer(1092,217)); + setWidgetIsHidden(true, new WidgetPointer(1092,216)); + setWidgetText(new WidgetPointer(1092,859), "Please select an available spot from the map."); + setWidgetIsHidden(false, new WidgetPointer(1092,847)); + setWidgetIsHidden(true, new WidgetPointer(1092,197)); + script_5010(); + script_4935(); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(1092,212)); + setWidgetIsHidden(true, new WidgetPointer(1092,217)); + setWidgetIsHidden(true, new WidgetPointer(1092,216)); + setWidgetText(new WidgetPointer(1092,859), "Please select a spot from the map."); + setWidgetIsHidden(false, new WidgetPointer(1092,847)); + setWidgetIsHidden(true, new WidgetPointer(1092,197)); + script_5010(); + break; + case 5: + setWidgetIsHidden(true, new WidgetPointer(1092,212)); + setWidgetIsHidden(false, new WidgetPointer(1092,217)); + setWidgetIsHidden(false, new WidgetPointer(1092,216)); + setWidgetText(new WidgetPointer(1092,859), "Please select an available spot from the map."); + setWidgetIsHidden(false, new WidgetPointer(1092,847)); + setWidgetIsHidden(true, new WidgetPointer(1092,197)); + script_5009(); + } + script_4853(); + return; +} diff --git a/dumps/scripts/49.cs2 b/dumps/scripts/49.cs2 new file mode 100644 index 000000000..0df10fa12 --- /dev/null +++ b/dumps/scripts/49.cs2 @@ -0,0 +1,18 @@ +void script_49(int arg0,int arg1,int arg2) { + if (((boolean)script_2296(arg2))) { + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + setWidgetContextMenuOption(1, "Deactivate"); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetSprite(155); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + setWidgetContextMenuOption(1, "Activate"); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetSprite(-1); + } + } + return; +} diff --git a/dumps/scripts/490.cs2 b/dumps/scripts/490.cs2 new file mode 100644 index 000000000..a3c1806a6 --- /dev/null +++ b/dumps/scripts/490.cs2 @@ -0,0 +1,76 @@ +void script_490() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar0 = script_488(bitconfig_7539); + ivar1 = script_488(bitconfig_7540); + ivar2 = script_488(bitconfig_7541); + ivar3 = script_488(bitconfig_7542); + ivar4 = script_489(bitconfig_7539); + ivar5 = script_489(bitconfig_7540); + ivar6 = script_489(bitconfig_7541); + ivar7 = script_489(bitconfig_7542); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1015,58)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1015,60)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1015,62)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1015,64)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1015,68)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1015,70)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1015,72)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1015,74)); + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(1015,66)); + if (ivar4 != -1) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(ivar4)); + } + if (ivar5 != -1) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(ivar5)); + } + if (ivar6 != -1) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(ivar6)); + } + if (ivar7 != -1) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(ivar7)); + } + if (ivar0 == -1) { + setWidgetIsHidden(true, new WidgetPointer(1015,96)); + setWidgetIsHidden(false, new WidgetPointer(1015,97)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1015,96)); + setWidgetIsHidden(true, new WidgetPointer(1015,97)); + setWidgetText(new WidgetPointer(1015,100), getOtherCommonData(ivar0, 1150)); + setWidgetSprite(getOtherCommonData(ivar0, 1153), new WidgetPointer(1015,99)); + } + if (ivar1 == -1) { + setWidgetIsHidden(true, new WidgetPointer(1015,90)); + setWidgetIsHidden(false, new WidgetPointer(1015,93)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1015,90)); + setWidgetIsHidden(true, new WidgetPointer(1015,93)); + setWidgetText(new WidgetPointer(1015,92), getOtherCommonData(ivar1, 1150)); + setWidgetSprite(getOtherCommonData(ivar1, 1153), new WidgetPointer(1015,91)); + } + if (ivar2 == -1) { + setWidgetIsHidden(true, new WidgetPointer(1015,84)); + setWidgetIsHidden(false, new WidgetPointer(1015,87)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1015,84)); + setWidgetIsHidden(true, new WidgetPointer(1015,87)); + setWidgetText(new WidgetPointer(1015,86), getOtherCommonData(ivar2, 1150)); + setWidgetSprite(getOtherCommonData(ivar2, 1153), new WidgetPointer(1015,85)); + } + if (ivar3 == -1) { + setWidgetIsHidden(true, new WidgetPointer(1015,78)); + setWidgetIsHidden(false, new WidgetPointer(1015,81)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1015,78)); + setWidgetIsHidden(true, new WidgetPointer(1015,81)); + setWidgetText(new WidgetPointer(1015,80), getOtherCommonData(ivar3, 1150)); + setWidgetSprite(getOtherCommonData(ivar3, 1153), new WidgetPointer(1015,79)); + } + return; +} diff --git a/dumps/scripts/4900.cs2 b/dumps/scripts/4900.cs2 new file mode 100644 index 000000000..fafed22ca --- /dev/null +++ b/dumps/scripts/4900.cs2 @@ -0,0 +1,6 @@ +void script_4900() { + script_4901(); + script_4902(); + script_4903(); + return; +} diff --git a/dumps/scripts/4901.cs2 b/dumps/scripts/4901.cs2 new file mode 100644 index 000000000..b1c830bf2 --- /dev/null +++ b/dumps/scripts/4901.cs2 @@ -0,0 +1,24 @@ +void script_4901() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = 1; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4902.cs2 b/dumps/scripts/4902.cs2 new file mode 100644 index 000000000..1d10ddc1f --- /dev/null +++ b/dumps/scripts/4902.cs2 @@ -0,0 +1,18 @@ +void script_4902() { + int ivar0; + int ivar1; + ivar0 = 1; + ivar1 = 0; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4903.cs2 b/dumps/scripts/4903.cs2 new file mode 100644 index 000000000..b1ff47de6 --- /dev/null +++ b/dumps/scripts/4903.cs2 @@ -0,0 +1,18 @@ +void script_4903() { + int ivar0; + int ivar1; + ivar0 = 1; + ivar1 = 0; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4904.cs2 b/dumps/scripts/4904.cs2 new file mode 100644 index 000000000..9821c2c67 --- /dev/null +++ b/dumps/scripts/4904.cs2 @@ -0,0 +1,7 @@ +int script_4904(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = cs2method_3408(105, 103, 3997, arg0); + ivar4 = cs2method_3408(105, 103, ivar3, arg1); + return cs2method_3408(105, 100, ivar4, arg2); +} diff --git a/dumps/scripts/4905.cs2 b/dumps/scripts/4905.cs2 new file mode 100644 index 000000000..c120ada4e --- /dev/null +++ b/dumps/scripts/4905.cs2 @@ -0,0 +1,40 @@ +void script_4905() { + if (citadelConfigsInitialized()) { + script_4906(1); + script_4906(2); + script_4906(3); + script_4906(4); + script_4906(5); + script_4906(6); + script_4906(7); + script_4906(8); + script_4906(9); + script_4906(10); + script_4906(11); + script_4906(12); + script_4906(13); + script_4906(14); + script_4906(15); + script_4906(16); + script_4906(17); + script_4906(18); + script_4906(19); + script_4906(20); + script_4906(21); + script_4906(22); + script_4906(23); + script_4906(24); + script_4906(25); + script_4906(26); + script_4906(27); + script_4906(28); + script_4906(29); + script_4906(30); + script_4906(31); + script_4906(32); + script_4906(33); + script_4906(34); + script_5221(); + } + return; +} diff --git a/dumps/scripts/4906.cs2 b/dumps/scripts/4906.cs2 new file mode 100644 index 000000000..8f43dd597 --- /dev/null +++ b/dumps/scripts/4906.cs2 @@ -0,0 +1,48 @@ +void script_4906(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + ivar1 = -1; + ivar2 = -1; + ivar3 = 0; + ivar4 = script_4968(arg0); + ivar5 = -1; + ivar6 = -1; + ivar7 = 1; + ivar8 = 0; + ivar9 = 0; + ivar10 = -1; + if (citadelConfigsInitialized()) { + if (isWidgetHidden(new WidgetPointer(1092,209))) { + ivar7 = 0; + } + if (((boolean)ivar7)) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4907.cs2 b/dumps/scripts/4907.cs2 new file mode 100644 index 000000000..0676dbe3b --- /dev/null +++ b/dumps/scripts/4907.cs2 @@ -0,0 +1,53 @@ +void script_4907() { + if (citadelConfigsInitialized()) { + script_4908(1); + script_4908(2); + script_4908(3); + script_4908(4); + script_4908(5); + script_4908(6); + script_4908(7); + script_4908(8); + script_4908(9); + script_4908(10); + script_4908(11); + script_4908(12); + script_4908(13); + script_4908(14); + script_4908(15); + script_4908(35); + script_4908(36); + script_4908(37); + script_4908(38); + script_4908(39); + script_4908(40); + script_4908(41); + script_4908(42); + script_4908(43); + script_4908(44); + script_4908(45); + script_4908(46); + script_4908(47); + script_4908(48); + script_4908(16); + script_4908(17); + script_4908(18); + script_4908(19); + script_4908(20); + script_4908(21); + script_4908(22); + script_4908(23); + script_4908(24); + script_4908(25); + script_4908(26); + script_4908(27); + script_4908(28); + script_4908(29); + script_4908(30); + script_4908(31); + script_4908(32); + script_4908(33); + script_4908(34); + } + return; +} diff --git a/dumps/scripts/4908.cs2 b/dumps/scripts/4908.cs2 new file mode 100644 index 000000000..6dc298b1c --- /dev/null +++ b/dumps/scripts/4908.cs2 @@ -0,0 +1,56 @@ +void script_4908(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + ivar1 = -1; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = script_4950(arg0); + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + ivar14 = 1; + if (citadelConfigsInitialized()) { + if (isWidgetHidden(new WidgetPointer(1092,209))) { + ivar14 = 0; + } + if (((boolean)ivar14)) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4909.cs2 b/dumps/scripts/4909.cs2 new file mode 100644 index 000000000..51ed47984 --- /dev/null +++ b/dumps/scripts/4909.cs2 @@ -0,0 +1,28 @@ +cs2func_script_4909_struct(2,0,0) script_4909(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar1 = 0; + ivar2 = 0; + ivar3 = 216; + ivar4 = 216; + ivar5 = 127; + if (arg0 == -1) { + return newstruct cs2func_script_4909_struct(0, 0); + } + ivar6 = extractX(arg0); + if ((ivar6 > ivar5) || (ivar6 < 0)) { + return newstruct cs2func_script_4909_struct(-1, -1); + } + ivar7 = subtract(ivar5, extractY(arg0)); + if ((ivar7 > 127) || (ivar7 < 0)) { + return newstruct cs2func_script_4909_struct(-1, -1); + } + ivar1 = divide(multiply(ivar6, ivar3), ivar5); + ivar2 = divide(multiply(ivar7, ivar4), ivar5); + return newstruct cs2func_script_4909_struct(ivar1, ivar2); +} diff --git a/dumps/scripts/491.cs2 b/dumps/scripts/491.cs2 new file mode 100644 index 000000000..4e45dcc47 --- /dev/null +++ b/dumps/scripts/491.cs2 @@ -0,0 +1,16 @@ +void script_491(int arg0) { + switch (arg0) { + case 66519136: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1015,100)); + break; + case 66519130: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1015,92)); + break; + case 66519124: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1015,86)); + break; + case 66519118: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1015,80)); + } + return; +} diff --git a/dumps/scripts/4910.cs2 b/dumps/scripts/4910.cs2 new file mode 100644 index 000000000..78a643f41 --- /dev/null +++ b/dumps/scripts/4910.cs2 @@ -0,0 +1,35 @@ +void script_4910(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 24; + ivar3 = 24; + if (getWidgetActualWidth(new WidgetPointer(arg0)) < ivar2) { + setWidgetSize(ivar2, getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } + if (getWidgetActualHeight(new WidgetPointer(arg0)) < ivar3) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), ivar3, 0, 0, new WidgetPointer(arg0)); + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(ivar2, ivar3, 0, 0); + setWidgetSprite(7599); + ivar1 = getExtraChildGap(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, ivar1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(ivar2, ivar3, 0, 0); + setWidgetSprite(7600); + setScriptCallOnMouseEntered(4410, new WidgetPointer(arg0), ivar1, 0, "Iii"); + setScriptCallOnMouseExit(4410, new WidgetPointer(arg0), ivar1, 1, "Iii"); + cs2method2103(255); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(ivar2, ivar3, 0, 0); + setWidgetSprite(7601); + setScriptCallOnMousePressed(4207, new WidgetPointer(-32768,3), 0, "Ii"); + setScriptCallOnMouseReleased(4207, new WidgetPointer(-32768,3), 1, "Ii"); + cs2method2103(255); + return; +} diff --git a/dumps/scripts/4911.cs2 b/dumps/scripts/4911.cs2 new file mode 100644 index 000000000..bf3f3982c --- /dev/null +++ b/dumps/scripts/4911.cs2 @@ -0,0 +1,8 @@ +void script_4911() { + setWidgetIsHidden(true, new WidgetPointer(1092,210)); + setWidgetIsHidden(false, new WidgetPointer(1092,209)); + script_4905(); + script_4907(); + script_4853(); + return; +} diff --git a/dumps/scripts/4912.cs2 b/dumps/scripts/4912.cs2 new file mode 100644 index 000000000..a67f467d5 --- /dev/null +++ b/dumps/scripts/4912.cs2 @@ -0,0 +1,8 @@ +void script_4912() { + setWidgetIsHidden(true, new WidgetPointer(1092,209)); + setWidgetIsHidden(false, new WidgetPointer(1092,210)); + script_4905(); + script_4907(); + script_4853(); + return; +} diff --git a/dumps/scripts/4913.cs2 b/dumps/scripts/4913.cs2 new file mode 100644 index 000000000..741d765f2 --- /dev/null +++ b/dumps/scripts/4913.cs2 @@ -0,0 +1,20 @@ +void script_4913() { + script_4407(71565508, 1, 179); + script_4407(71566229, 1, 179); + script_4407(71566230, 1, 179); + script_4407(71566231, 1, 179); + script_4407(71566232, 1, 179); + script_4407(71566233, 1, 179); + script_4407(71566234, 1, 179); + script_4407(71566235, 1, 179); + script_4407(71566236, 1, 179); + script_4407(71566237, 1, 179); + script_4407(71566238, 1, 179); + script_4407(71566239, 1, 179); + script_4407(71566240, 1, 179); + script_4407(71566241, 1, 179); + script_4407(71566242, 1, 179); + script_4407(71566243, 1, 179); + script_4407(71566244, 1, 179); + return; +} diff --git a/dumps/scripts/4914.cs2 b/dumps/scripts/4914.cs2 new file mode 100644 index 000000000..317f94e6a --- /dev/null +++ b/dumps/scripts/4914.cs2 @@ -0,0 +1,369 @@ +string script_4914(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + ivar1 = script_4824(arg0); + svar0 = ""; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + switch (arg0) { + case 21: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 22: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 23: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 24: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 25: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 26: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 27: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 28: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 31: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 32: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 33: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 34: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 35: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 41: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 42: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 43: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 44: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 45: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 51: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 100: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 101: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 102: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 103: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 104: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 105: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 106: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 107: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 108: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 109: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 110: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 111: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 112: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 113: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (ivar3 <= 0) { + return "empty customisation"; + } + ivar5 = cs2method_3408(105, 103, 4043, ivar3); + if (ivar5 == -1) { + return ""; + } + ivar6 = cs2method_3408(105, 103, ivar5, ivar2); + if (ivar6 == -1) { + return ""; + } + ivar7 = cs2method_3408(105, 103, ivar6, 1); + if (ivar7 == -1) { + return ""; + } + ivar8 = cs2method_3408(105, 74, ivar7, ivar4); + if (ivar8 == -1) { + return ""; + } + svar0 = getOtherCommonData(ivar8, 1566); + return svar0; +} diff --git a/dumps/scripts/4915.cs2 b/dumps/scripts/4915.cs2 new file mode 100644 index 000000000..99e0a00c4 --- /dev/null +++ b/dumps/scripts/4915.cs2 @@ -0,0 +1,6 @@ +void script_4915() { + setScriptCallOnGameloop(4916, "", new WidgetPointer(1092,319)); + script_4993(); + script_4853(); + return; +} diff --git a/dumps/scripts/4916.cs2 b/dumps/scripts/4916.cs2 new file mode 100644 index 000000000..e43b74e67 --- /dev/null +++ b/dumps/scripts/4916.cs2 @@ -0,0 +1,7 @@ +void script_4916() { + if (citadelConfigsInitialized()) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(1092,319)); + script_4917(); + } + return; +} diff --git a/dumps/scripts/4917.cs2 b/dumps/scripts/4917.cs2 new file mode 100644 index 000000000..b754bbaeb --- /dev/null +++ b/dumps/scripts/4917.cs2 @@ -0,0 +1,16 @@ +void script_4917() { + setScriptCallOnCitadelConfigChange(4918, "", new WidgetPointer(1092,319)); + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + messageType0("Clan stronghold information not yet available."); + return; +} diff --git a/dumps/scripts/4918.cs2 b/dumps/scripts/4918.cs2 new file mode 100644 index 000000000..e20f6350c --- /dev/null +++ b/dumps/scripts/4918.cs2 @@ -0,0 +1,23 @@ +void script_4918() { + if (citadelConfigsInitialized()) { + script_4919(); + script_4900(); + script_4905(); + script_4907(); + script_5012(); + script_4895(); + script_4864(); + script_4994(); + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 4889 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + script_675(); + return; +} diff --git a/dumps/scripts/4919.cs2 b/dumps/scripts/4919.cs2 new file mode 100644 index 000000000..709634868 --- /dev/null +++ b/dumps/scripts/4919.cs2 @@ -0,0 +1,32 @@ +void script_4919() { + int ivar0; + ivar0 = 0; + if (citadelConfigsInitialized()) { + if (bitconfig_9550 > 0) { + if (isWidgetHidden(new WidgetPointer(1092,259))) { + script_4989(script_4948(bitconfig_9550)); + } + } else { + script_5007(); + script_4935(); + script_4905(); + script_4907(); + script_5012(); + script_4895(); + script_4864(); + script_4994(); + /* + mgi.tools.jagdecs2.DecompilerException: No documentation for:CALL_CS2 4889 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:178) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + script_4853(); + return; + } + return; +} diff --git a/dumps/scripts/492.cs2 b/dumps/scripts/492.cs2 new file mode 100644 index 000000000..8415e7783 --- /dev/null +++ b/dumps/scripts/492.cs2 @@ -0,0 +1,16 @@ +void script_492(int arg0) { + switch (arg0) { + case 66519136: + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,100)); + break; + case 66519130: + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,92)); + break; + case 66519124: + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,86)); + break; + case 66519118: + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(1015,80)); + } + return; +} diff --git a/dumps/scripts/4920.cs2 b/dumps/scripts/4920.cs2 new file mode 100644 index 000000000..54957a6dd --- /dev/null +++ b/dumps/scripts/4920.cs2 @@ -0,0 +1,39 @@ +void script_4920() { + string svar0; + string svar1; + flow_0: + svar0 = ""; + IF ((((boolean)globalint_1557) && (globalint_1558 < 6)) && (((boolean)globalint_1558) && (globalint_1559 < 20))) + GOTO flow_4 + GOTO flow_5 + flow_4: + GOTO flow_5 + flow_5: + if ((((boolean)globalint_1557) && ((boolean)globalint_1558)) && ((boolean)globalint_1559)) { + setWidgetText(new WidgetPointer(1092,1831), "Due!"); + return; + } + if (globalint_1557 > 0) { + svar0 = concat(svar0, intToStr(globalint_1557) + "d "); + } + if (globalint_1558 > 0) { + svar0 = concat(svar0, intToStr(globalint_1558) + "h "); + } + if (globalint_1559 > 0) { + svar0 = concat(svar0, intToStr(globalint_1559) + "m"); + } + setWidgetText(new WidgetPointer(1092,1831), svar0); + svar1 = ""; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4921.cs2 b/dumps/scripts/4921.cs2 new file mode 100644 index 000000000..ad970e657 --- /dev/null +++ b/dumps/scripts/4921.cs2 @@ -0,0 +1,4 @@ +void script_4921(int arg0) { + script_4922(arg0); + return; +} diff --git a/dumps/scripts/4922.cs2 b/dumps/scripts/4922.cs2 new file mode 100644 index 000000000..286282999 --- /dev/null +++ b/dumps/scripts/4922.cs2 @@ -0,0 +1,6 @@ +void script_4922(int arg0) { + if (((bitconfig_9570 != arg0) && (bitconfig_9579 != arg0)) && (bitconfig_9588 != arg0)) { + script_4942(); + } + return; +} diff --git a/dumps/scripts/4923.cs2 b/dumps/scripts/4923.cs2 new file mode 100644 index 000000000..0de206d6a --- /dev/null +++ b/dumps/scripts/4923.cs2 @@ -0,0 +1,4 @@ +void script_4923(int arg0) { + script_4728(arg0); + return; +} diff --git a/dumps/scripts/4924.cs2 b/dumps/scripts/4924.cs2 new file mode 100644 index 000000000..d47f111b6 --- /dev/null +++ b/dumps/scripts/4924.cs2 @@ -0,0 +1,4 @@ +void script_4924() { + setWidgetIsHidden(false, new WidgetPointer(908,36)); + return; +} diff --git a/dumps/scripts/4925.cs2 b/dumps/scripts/4925.cs2 new file mode 100644 index 000000000..62823af6a --- /dev/null +++ b/dumps/scripts/4925.cs2 @@ -0,0 +1,4 @@ +void script_4925() { + script_4926(); + return; +} diff --git a/dumps/scripts/4926.cs2 b/dumps/scripts/4926.cs2 new file mode 100644 index 000000000..aab4e8813 --- /dev/null +++ b/dumps/scripts/4926.cs2 @@ -0,0 +1,10 @@ +void script_4926() { + bitconfig_9552 = 0; + script_4944(); + script_4933(); + setWidgetIsHidden(false, new WidgetPointer(1092,301)); + setWidgetIsHidden(false, new WidgetPointer(1092,258)); + script_4899(0); + setWidgetIsHidden(false, new WidgetPointer(1092,299)); + return; +} diff --git a/dumps/scripts/4927.cs2 b/dumps/scripts/4927.cs2 new file mode 100644 index 000000000..16d093df5 --- /dev/null +++ b/dumps/scripts/4927.cs2 @@ -0,0 +1,4 @@ +void script_4927() { + script_4928(); + return; +} diff --git a/dumps/scripts/4928.cs2 b/dumps/scripts/4928.cs2 new file mode 100644 index 000000000..26278ffe1 --- /dev/null +++ b/dumps/scripts/4928.cs2 @@ -0,0 +1,9 @@ +void script_4928() { + script_4944(); + script_4933(); + bitconfig_9552 = 1; + script_4899(1); + setWidgetIsHidden(false, new WidgetPointer(1092,302)); + setWidgetIsHidden(false, new WidgetPointer(1092,259)); + return; +} diff --git a/dumps/scripts/4929.cs2 b/dumps/scripts/4929.cs2 new file mode 100644 index 000000000..2bc0deef1 --- /dev/null +++ b/dumps/scripts/4929.cs2 @@ -0,0 +1,4 @@ +void script_4929() { + script_4930(); + return; +} diff --git a/dumps/scripts/493.cs2 b/dumps/scripts/493.cs2 new file mode 100644 index 000000000..f77a58987 --- /dev/null +++ b/dumps/scripts/493.cs2 @@ -0,0 +1,128 @@ +void script_493(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + flow_0: + ivar2 = 0; + ivar3 = 0; + ivar4 = -1; + SWITCH (arg0) { + case 66519098: + GOTO flow_1 + case 66519100: + GOTO flow_2 + case 66519102: + GOTO flow_3 + case 66519104: + GOTO flow_4 + case 66519108: + GOTO flow_5 + case 66519110: + GOTO flow_6 + case 66519112: + GOTO flow_7 + case 66519114: + GOTO flow_8 + case 66519106: + GOTO flow_9 + } + return; + flow_1: + ivar2 = 1; + GOTO flow_10 + flow_2: + ivar2 = 2; + GOTO flow_10 + flow_3: + ivar2 = 3; + GOTO flow_10 + flow_4: + ivar2 = 4; + GOTO flow_10 + flow_5: + ivar2 = 5; + GOTO flow_10 + flow_6: + ivar2 = 6; + GOTO flow_10 + flow_7: + ivar2 = 7; + GOTO flow_10 + flow_8: + ivar2 = 8; + GOTO flow_10 + flow_9: + ivar2 = 9; + flow_10: + if (((boolean)arg1)) { + ivar3 = 16777215; + } else { + ivar3 = 16750623; + } + if (((bitconfig_7539 != ivar2) && (bitconfig_7540 != ivar2)) && ((bitconfig_7541 != ivar2) && (bitconfig_7542 != ivar2))) { + setWidgetRGB(new Color(ivar3), new WidgetPointer(arg0)); + if (((boolean)arg1)) { + ivar4 = script_488(ivar2); + if (ivar4 != -1) { + setWidgetIsHidden(true, new WidgetPointer(1015,49)); + setWidgetIsHidden(false, new WidgetPointer(1015,50)); + setWidgetIsHidden(false, new WidgetPointer(1015,51)); + setWidgetIsHidden(false, new WidgetPointer(1015,52)); + setWidgetIsHidden(false, new WidgetPointer(1015,53)); + setWidgetIsHidden(false, new WidgetPointer(1015,54)); + setWidgetText(new WidgetPointer(1015,51), getOtherCommonData(ivar4, 1150)); + setWidgetSprite(getOtherCommonData(ivar4, 1153), new WidgetPointer(1015,50)); + setWidgetText(new WidgetPointer(1015,52), getOtherCommonData(ivar4, 1151)); + setWidgetText(new WidgetPointer(1015,53), concat("Cooldown: ", intToStr(getOtherCommonData(ivar4, 1155)))); + setWidgetText(new WidgetPointer(1015,54), concat("Cost: ", intToStr(getOtherCommonData(ivar4, 1154)))); + } + } else { + flow_21: + SWITCH (bitconfig_7515) { + case 1: + GOTO flow_22 + case 2: + GOTO flow_23 + case 3: + GOTO flow_24 + case 4: + GOTO flow_25 + } + ivar4 = -1; + GOTO flow_26 + flow_22: + ivar4 = script_488(bitconfig_7539); + GOTO flow_26 + flow_23: + ivar4 = script_488(bitconfig_7540); + GOTO flow_26 + flow_24: + ivar4 = script_488(bitconfig_7541); + GOTO flow_26 + flow_25: + ivar4 = script_488(bitconfig_7542); + flow_26: + if (ivar4 == -1) { + setWidgetIsHidden(false, new WidgetPointer(1015,49)); + setWidgetIsHidden(true, new WidgetPointer(1015,50)); + setWidgetIsHidden(true, new WidgetPointer(1015,51)); + setWidgetIsHidden(true, new WidgetPointer(1015,52)); + setWidgetIsHidden(true, new WidgetPointer(1015,53)); + setWidgetIsHidden(true, new WidgetPointer(1015,54)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1015,49)); + setWidgetIsHidden(false, new WidgetPointer(1015,50)); + setWidgetIsHidden(false, new WidgetPointer(1015,51)); + setWidgetIsHidden(false, new WidgetPointer(1015,52)); + setWidgetIsHidden(false, new WidgetPointer(1015,53)); + setWidgetIsHidden(false, new WidgetPointer(1015,54)); + setWidgetText(new WidgetPointer(1015,51), getOtherCommonData(ivar4, 1150)); + setWidgetSprite(getOtherCommonData(ivar4, 1153), new WidgetPointer(1015,50)); + setWidgetText(new WidgetPointer(1015,52), getOtherCommonData(ivar4, 1151)); + setWidgetText(new WidgetPointer(1015,53), concat("Cooldown: ", intToStr(getOtherCommonData(ivar4, 1155)))); + setWidgetText(new WidgetPointer(1015,54), concat("Cost: ", intToStr(getOtherCommonData(ivar4, 1154)))); + } + } + } + return; +} diff --git a/dumps/scripts/4930.cs2 b/dumps/scripts/4930.cs2 new file mode 100644 index 000000000..a263a3475 --- /dev/null +++ b/dumps/scripts/4930.cs2 @@ -0,0 +1,10 @@ +void script_4930() { + script_4944(); + script_4933(); + bitconfig_9552 = 2; + script_4899(2); + setWidgetIsHidden(false, new WidgetPointer(1092,303)); + setWidgetIsHidden(false, new WidgetPointer(1092,260)); + script_4849(); + return; +} diff --git a/dumps/scripts/4931.cs2 b/dumps/scripts/4931.cs2 new file mode 100644 index 000000000..b91645261 --- /dev/null +++ b/dumps/scripts/4931.cs2 @@ -0,0 +1,4 @@ +void script_4931() { + script_4932(); + return; +} diff --git a/dumps/scripts/4932.cs2 b/dumps/scripts/4932.cs2 new file mode 100644 index 000000000..7719bda91 --- /dev/null +++ b/dumps/scripts/4932.cs2 @@ -0,0 +1,7 @@ +void script_4932() { + script_4944(); + script_4933(); + setWidgetIsHidden(false, new WidgetPointer(1092,304)); + setWidgetIsHidden(false, new WidgetPointer(1092,256)); + return; +} diff --git a/dumps/scripts/4933.cs2 b/dumps/scripts/4933.cs2 new file mode 100644 index 000000000..93abb60db --- /dev/null +++ b/dumps/scripts/4933.cs2 @@ -0,0 +1,15 @@ +void script_4933() { + setWidgetIsHidden(true, new WidgetPointer(1092,299)); + setWidgetIsHidden(true, new WidgetPointer(1092,301)); + setWidgetIsHidden(true, new WidgetPointer(1092,302)); + setWidgetIsHidden(true, new WidgetPointer(1092,303)); + setWidgetIsHidden(true, new WidgetPointer(1092,304)); + setWidgetIsHidden(true, new WidgetPointer(1092,258)); + setWidgetIsHidden(true, new WidgetPointer(1092,259)); + setWidgetIsHidden(true, new WidgetPointer(1092,260)); + setWidgetIsHidden(true, new WidgetPointer(1092,256)); + setWidgetIsHidden(true, new WidgetPointer(1092,212)); + setWidgetIsHidden(true, new WidgetPointer(1092,217)); + setWidgetIsHidden(true, new WidgetPointer(1092,216)); + return; +} diff --git a/dumps/scripts/4934.cs2 b/dumps/scripts/4934.cs2 new file mode 100644 index 000000000..cc35a8523 --- /dev/null +++ b/dumps/scripts/4934.cs2 @@ -0,0 +1,4 @@ +void script_4934() { + script_4935(); + return; +} diff --git a/dumps/scripts/4935.cs2 b/dumps/scripts/4935.cs2 new file mode 100644 index 000000000..383a63cfb --- /dev/null +++ b/dumps/scripts/4935.cs2 @@ -0,0 +1,7 @@ +void script_4935() { + int ivar0; + ivar0 = 71565520; + setScriptCallOnGameloop(4938, 1, "i", new WidgetPointer(ivar0)); + script_5220(); + return; +} diff --git a/dumps/scripts/4936.cs2 b/dumps/scripts/4936.cs2 new file mode 100644 index 000000000..bfcc8c311 --- /dev/null +++ b/dumps/scripts/4936.cs2 @@ -0,0 +1,4 @@ +void script_4936() { + script_4937(); + return; +} diff --git a/dumps/scripts/4937.cs2 b/dumps/scripts/4937.cs2 new file mode 100644 index 000000000..5457ef102 --- /dev/null +++ b/dumps/scripts/4937.cs2 @@ -0,0 +1,7 @@ +void script_4937() { + int ivar0; + ivar0 = 71565520; + setScriptCallOnGameloop(4938, 0, "i", new WidgetPointer(ivar0)); + script_5220(); + return; +} diff --git a/dumps/scripts/4938.cs2 b/dumps/scripts/4938.cs2 new file mode 100644 index 000000000..ce3cda8f6 --- /dev/null +++ b/dumps/scripts/4938.cs2 @@ -0,0 +1,30 @@ +void script_4938(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 71565520; + if (((boolean)arg0) && ((boolean)bitconfig_9552)) { + ivar1 = add(getWidgetActualX(new WidgetPointer(ivar3)), 12); + ivar2 = 0; + ivar1 = min(ivar1, ivar2); + if (isWidgetHidden(new WidgetPointer(1092,260))) { + ivar1 = max(ivar1, -226); + } + } else { + ivar1 = subtract(getWidgetActualX(new WidgetPointer(ivar3)), 12); + if (isWidgetHidden(new WidgetPointer(1092,260))) { + ivar2 = -295; + } else { + ivar2 = -226; + } + ivar1 = max(ivar1, ivar2); + } + setWidgetPosition(ivar1, getWidgetActualY(new WidgetPointer(ivar3)), 0, 0, new WidgetPointer(ivar3)); + if (ivar1 == ivar2) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar3)); + script_5220(); + } + return; +} diff --git a/dumps/scripts/4939.cs2 b/dumps/scripts/4939.cs2 new file mode 100644 index 000000000..0a4b5c0a8 --- /dev/null +++ b/dumps/scripts/4939.cs2 @@ -0,0 +1,4 @@ +void script_4939() { + script_4940(); + return; +} diff --git a/dumps/scripts/494.cs2 b/dumps/scripts/494.cs2 new file mode 100644 index 000000000..fbd3bc726 --- /dev/null +++ b/dumps/scripts/494.cs2 @@ -0,0 +1,8 @@ +void script_494(int arg0,int arg1) { + if (((boolean)arg1)) { + setWidgetSprite(786, new WidgetPointer(arg0)); + } else { + setWidgetSprite(785, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4940.cs2 b/dumps/scripts/4940.cs2 new file mode 100644 index 000000000..f4a468750 --- /dev/null +++ b/dumps/scripts/4940.cs2 @@ -0,0 +1,7 @@ +void script_4940() { + int ivar0; + ivar0 = 71566040; + setScriptCallOnGameloop(4943, 1, "i", new WidgetPointer(ivar0)); + script_5220(); + return; +} diff --git a/dumps/scripts/4941.cs2 b/dumps/scripts/4941.cs2 new file mode 100644 index 000000000..7c2a63bc9 --- /dev/null +++ b/dumps/scripts/4941.cs2 @@ -0,0 +1,4 @@ +void script_4941() { + script_4942(); + return; +} diff --git a/dumps/scripts/4942.cs2 b/dumps/scripts/4942.cs2 new file mode 100644 index 000000000..e8e7cce62 --- /dev/null +++ b/dumps/scripts/4942.cs2 @@ -0,0 +1,7 @@ +void script_4942() { + int ivar0; + ivar0 = 71566040; + setScriptCallOnGameloop(4943, 0, "i", new WidgetPointer(ivar0)); + script_5220(); + return; +} diff --git a/dumps/scripts/4943.cs2 b/dumps/scripts/4943.cs2 new file mode 100644 index 000000000..5c4574b9f --- /dev/null +++ b/dumps/scripts/4943.cs2 @@ -0,0 +1,23 @@ +void script_4943(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 71566040; + if (((boolean)arg0) && (bitconfig_9552 == 2)) { + ivar1 = add(getWidgetActualX(new WidgetPointer(ivar3)), 12); + ivar2 = 156; + } else { + ivar1 = subtract(getWidgetActualX(new WidgetPointer(ivar3)), 12); + ivar2 = -150; + } + ivar1 = max(ivar1, -150); + ivar1 = min(ivar1, 156); + setWidgetPosition(ivar1, getWidgetActualY(new WidgetPointer(ivar3)), 0, 0, new WidgetPointer(ivar3)); + if (ivar1 == ivar2) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar3)); + script_5220(); + } + return; +} diff --git a/dumps/scripts/4944.cs2 b/dumps/scripts/4944.cs2 new file mode 100644 index 000000000..26a365d8e --- /dev/null +++ b/dumps/scripts/4944.cs2 @@ -0,0 +1,6 @@ +void script_4944() { + script_4935(); + script_4940(); + script_5220(); + return; +} diff --git a/dumps/scripts/4945.cs2 b/dumps/scripts/4945.cs2 new file mode 100644 index 000000000..686366993 --- /dev/null +++ b/dumps/scripts/4945.cs2 @@ -0,0 +1,14 @@ +int script_4945(int arg0) { + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return -1; +} diff --git a/dumps/scripts/4946.cs2 b/dumps/scripts/4946.cs2 new file mode 100644 index 000000000..52e2171c7 --- /dev/null +++ b/dumps/scripts/4946.cs2 @@ -0,0 +1,127 @@ +int script_4946(int arg0) { + if (citadelConfigsInitialized()) { + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + } + return -1; +} diff --git a/dumps/scripts/4947.cs2 b/dumps/scripts/4947.cs2 new file mode 100644 index 000000000..965591fca --- /dev/null +++ b/dumps/scripts/4947.cs2 @@ -0,0 +1,35 @@ +int script_4947(int arg0) { + switch (arg0) { + case 1: + return 1; + case 2: + return 1; + case 3: + return 1; + case 4: + return 1; + case 5: + return 2; + case 6: + return 3; + case 7: + return 4; + case 8: + return 5; + case 9: + return 6; + case 10: + return 7; + case 11: + return 8; + case 12: + return 9; + case 13: + return 10; + case 14: + return 11; + case 15: + return 12; + } + return -1; +} diff --git a/dumps/scripts/4948.cs2 b/dumps/scripts/4948.cs2 new file mode 100644 index 000000000..62f34198a --- /dev/null +++ b/dumps/scripts/4948.cs2 @@ -0,0 +1,97 @@ +int script_4948(int arg0) { + int ivar1; + ivar1 = script_4951(arg0); + if (citadelConfigsInitialized()) { + if (((boolean)ivar1)) { + return 1; + } + if (ivar1 == 2) { + return 2; + } + if (ivar1 == 3) { + return 3; + } + if (ivar1 == 4) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if ((ivar1 == 5) || (ivar1 == 6)) { + switch (arg0) { + case 16: + return 16; + case 17: + return 17; + case 18: + return 18; + case 19: + return 19; + case 20: + return 20; + case 21: + return 21; + case 22: + return 22; + case 23: + return 23; + case 24: + return 24; + case 25: + return 25; + case 26: + return 26; + case 27: + return 27; + case 28: + return 28; + case 29: + return 29; + case 30: + return 30; + case 31: + return 31; + case 32: + return 32; + case 33: + return 33; + case 34: + return 34; + case 35: + return 35; + case 36: + return 36; + case 37: + return 40; + case 38: + return 38; + case 39: + return 39; + case 40: + return 40; + case 41: + return 41; + case 42: + return 42; + case 43: + return 43; + case 44: + return 44; + case 45: + return 45; + case 46: + return 46; + case 47: + return 47; + case 48: + return 48; + } + } + } + return -1; +} diff --git a/dumps/scripts/4949.cs2 b/dumps/scripts/4949.cs2 new file mode 100644 index 000000000..4a93765b7 --- /dev/null +++ b/dumps/scripts/4949.cs2 @@ -0,0 +1,423 @@ +int script_4949(int arg0) { + if (citadelConfigsInitialized()) { + switch (arg0) { + case 1: + return 17; + case 2: + return 18; + case 3: + return 19; + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 13: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 14: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 15: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 16: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 17: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 18: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 19: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 20: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 21: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 22: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 23: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 24: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 25: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 26: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 27: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 28: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 29: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 30: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 31: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 32: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 33: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 34: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 35: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 36: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 37: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 40: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 38: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 39: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 41: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 42: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 43: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 44: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + } + return -1; +} diff --git a/dumps/scripts/495.cs2 b/dumps/scripts/495.cs2 new file mode 100644 index 000000000..6420e9387 --- /dev/null +++ b/dumps/scripts/495.cs2 @@ -0,0 +1,64 @@ +void script_495(int arg0) { + int ivar1; + flow_0: + ivar1 = 0; + SWITCH (arg0) { + case 66519184: + GOTO flow_1 + case 66519186: + GOTO flow_2 + case 66519188: + GOTO flow_3 + case 66519190: + GOTO flow_4 + case 66519192: + GOTO flow_5 + case 66519194: + GOTO flow_6 + case 66519196: + GOTO flow_7 + case 66519198: + GOTO flow_8 + case 66519200: + GOTO flow_9 + case 66519202: + GOTO flow_10 + } + return; + flow_1: + ivar1 = bitconfig_7520; + GOTO flow_11 + flow_2: + ivar1 = bitconfig_7521; + GOTO flow_11 + flow_3: + ivar1 = bitconfig_7526; + GOTO flow_11 + flow_4: + ivar1 = bitconfig_7527; + GOTO flow_11 + flow_5: + ivar1 = bitconfig_7530; + GOTO flow_11 + flow_6: + ivar1 = bitconfig_7531; + GOTO flow_11 + flow_7: + ivar1 = bitconfig_7532; + GOTO flow_11 + flow_8: + ivar1 = bitconfig_7533; + GOTO flow_11 + flow_9: + ivar1 = bitconfig_7534; + GOTO flow_11 + flow_10: + ivar1 = bitconfig_7535; + flow_11: + if (((boolean)ivar1)) { + setWidgetRGB(new Color(88, 80, 66), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(230, 202, 152), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/4950.cs2 b/dumps/scripts/4950.cs2 new file mode 100644 index 000000000..67621f0b0 --- /dev/null +++ b/dumps/scripts/4950.cs2 @@ -0,0 +1,59 @@ +int script_4950(int arg0) { + switch (arg0) { + case 1: + return 1; + case 2: + return 2; + case 3: + return 3; + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + return 4; + case 35: + case 38: + case 39: + case 36: + case 37: + case 42: + case 43: + case 40: + case 41: + case 46: + case 47: + case 44: + case 45: + case 48: + return 6; + case 17: + case 16: + case 19: + case 18: + case 21: + case 20: + case 23: + case 22: + case 25: + case 24: + case 27: + case 26: + case 29: + case 28: + case 31: + case 30: + case 34: + case 32: + case 33: + return 5; + } + return 0; +} diff --git a/dumps/scripts/4951.cs2 b/dumps/scripts/4951.cs2 new file mode 100644 index 000000000..98c3f8cf5 --- /dev/null +++ b/dumps/scripts/4951.cs2 @@ -0,0 +1,54 @@ +int script_4951(int arg0) { + switch (arg0) { + case 17: + return 1; + case 18: + return 2; + case 19: + return 3; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + return 4; + case 102: + case 103: + case 100: + case 101: + case 110: + case 111: + case 108: + case 109: + case 106: + case 107: + case 104: + case 105: + case 113: + case 112: + return 6; + case 21: + case 23: + case 22: + case 25: + case 24: + case 27: + case 26: + case 28: + case 31: + case 34: + case 35: + case 32: + case 33: + case 42: + case 43: + case 41: + case 44: + case 45: + case 51: + return 5; + } + return 0; +} diff --git a/dumps/scripts/4952.cs2 b/dumps/scripts/4952.cs2 new file mode 100644 index 000000000..c782dc6cb --- /dev/null +++ b/dumps/scripts/4952.cs2 @@ -0,0 +1,157 @@ +int script_4952(int arg0) { + if (citadelConfigsInitialized()) { + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 13: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 14: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 15: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + } + return 0; +} diff --git a/dumps/scripts/4953.cs2 b/dumps/scripts/4953.cs2 new file mode 100644 index 000000000..cfcaafbc5 --- /dev/null +++ b/dumps/scripts/4953.cs2 @@ -0,0 +1,16 @@ +int script_4953(int arg0) { + int ivar1; + ivar1 = -1; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return ivar1; +} diff --git a/dumps/scripts/4954.cs2 b/dumps/scripts/4954.cs2 new file mode 100644 index 000000000..5a2b6f01a --- /dev/null +++ b/dumps/scripts/4954.cs2 @@ -0,0 +1,25 @@ +int script_4954(int arg0) { + switch (arg0) { + case 17: + return 2031; + case 18: + return 2032; + case 19: + return 2033; + case 1: + return 2034; + case 2: + return 2035; + case 3: + return 2037; + case 4: + return 2038; + case 5: + return 2039; + case 6: + return 2036; + case 7: + return 2040; + } + return -1; +} diff --git a/dumps/scripts/4955.cs2 b/dumps/scripts/4955.cs2 new file mode 100644 index 000000000..67761e18c --- /dev/null +++ b/dumps/scripts/4955.cs2 @@ -0,0 +1,25 @@ +int script_4955(int arg0) { + switch (arg0) { + case 17: + return 2021; + case 18: + return 2022; + case 19: + return 2023; + case 1: + return 2024; + case 2: + return 2025; + case 3: + return 2027; + case 4: + return 2028; + case 5: + return 2029; + case 6: + return 2026; + case 7: + return 2030; + } + return -1; +} diff --git a/dumps/scripts/4956.cs2 b/dumps/scripts/4956.cs2 new file mode 100644 index 000000000..988638ad1 --- /dev/null +++ b/dumps/scripts/4956.cs2 @@ -0,0 +1,13 @@ +cs2func_script_4956_struct(5,0,0) script_4956(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar1 = script_4948(arg0); + ivar2 = script_4959(ivar1); + ivar3 = script_4980(arg0); + ivar4 = script_4954(arg0); + ivar5 = script_4955(arg0); + return newstruct cs2func_script_4956_struct(ivar1, ivar2, ivar4, ivar5, ivar3); +} diff --git a/dumps/scripts/4957.cs2 b/dumps/scripts/4957.cs2 new file mode 100644 index 000000000..7cf872f92 --- /dev/null +++ b/dumps/scripts/4957.cs2 @@ -0,0 +1,11 @@ +cs2func_script_4957_struct(4,0,0) script_4957(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar1 = script_4960(arg0); + ivar2 = script_4980(arg0); + ivar3 = script_4954(arg0); + ivar4 = script_4955(arg0); + return newstruct cs2func_script_4957_struct(ivar1, ivar3, ivar4, ivar2); +} diff --git a/dumps/scripts/4958.cs2 b/dumps/scripts/4958.cs2 new file mode 100644 index 000000000..64f8ad720 --- /dev/null +++ b/dumps/scripts/4958.cs2 @@ -0,0 +1,13 @@ +cs2func_script_4958_struct(5,0,0) script_4958(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar1 = script_4949(arg0); + ivar2 = script_4959(arg0); + ivar3 = script_4980(ivar1); + ivar4 = script_4954(ivar1); + ivar5 = script_4955(ivar1); + return newstruct cs2func_script_4958_struct(ivar1, ivar2, ivar4, ivar5, ivar3); +} diff --git a/dumps/scripts/4959.cs2 b/dumps/scripts/4959.cs2 new file mode 100644 index 000000000..88d5ff8c7 --- /dev/null +++ b/dumps/scripts/4959.cs2 @@ -0,0 +1,487 @@ +int script_4959(int arg0) { + if (citadelConfigsInitialized()) { + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 13: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 14: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 15: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 16: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 17: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 18: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 19: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 20: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 21: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 22: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 23: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 24: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 25: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 26: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 27: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 28: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 29: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 30: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 31: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 32: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 33: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 34: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 35: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 36: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 37: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 38: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 39: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 40: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 41: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 42: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 43: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 44: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 45: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 46: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 47: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 48: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + } + return 0; +} diff --git a/dumps/scripts/496.cs2 b/dumps/scripts/496.cs2 new file mode 100644 index 000000000..334eef7a6 --- /dev/null +++ b/dumps/scripts/496.cs2 @@ -0,0 +1,4 @@ +void script_496(int arg0) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/4960.cs2 b/dumps/scripts/4960.cs2 new file mode 100644 index 000000000..d6a50da7d --- /dev/null +++ b/dumps/scripts/4960.cs2 @@ -0,0 +1,12 @@ +int script_4960(int arg0) { + int ivar1; + ivar1 = 0; + if (citadelConfigsInitialized()) { + ivar1 = script_4948(arg0); + if (ivar1 <= 0) { + return 0; + } + return script_4959(ivar1); + } + return 0; +} diff --git a/dumps/scripts/4961.cs2 b/dumps/scripts/4961.cs2 new file mode 100644 index 000000000..6d33656c6 --- /dev/null +++ b/dumps/scripts/4961.cs2 @@ -0,0 +1,105 @@ +int script_4961(int arg0,int arg1) { + if (((boolean)arg1)) { + switch (arg0) { + case 1: + return 1; + case 2: + return 3; + case 3: + return 2; + case 4: + return 4; + case 5: + return 5; + case 6: + return 6; + case 7: + return 7; + case 8: + return 8; + case 9: + return 9; + case 10: + return 10; + case 11: + return 11; + case 12: + return 12; + case 13: + return 13; + case 14: + return 14; + case 15: + return 15; + } + } else if (arg1 == 2) { + switch (arg0) { + case 1: + return 301; + case 2: + return 303; + case 3: + return 302; + case 4: + return 304; + case 5: + return 305; + case 6: + return 306; + case 7: + return 307; + case 8: + return 308; + case 9: + return 309; + case 10: + return 310; + case 11: + return 311; + case 12: + return 312; + case 13: + return 313; + case 14: + return 314; + case 15: + return 315; + } + } else { + if (arg1 == 3) { + switch (arg0) { + case 1: + return 601; + case 2: + return 603; + case 3: + return 602; + case 4: + return 604; + case 5: + return 605; + case 6: + return 606; + case 7: + return 607; + case 8: + return 608; + case 9: + return 609; + case 10: + return 610; + case 11: + return 611; + case 12: + return 612; + case 13: + return 613; + case 14: + return 614; + case 15: + return 615; + } + } + } + return -1; +} diff --git a/dumps/scripts/4962.cs2 b/dumps/scripts/4962.cs2 new file mode 100644 index 000000000..933a6952e --- /dev/null +++ b/dumps/scripts/4962.cs2 @@ -0,0 +1,17 @@ +int script_4962(int arg0) { + int ivar1; + ivar1 = -1; + if (citadelConfigsInitialized()) { + ivar1 = script_4971(arg0); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return 0; +} diff --git a/dumps/scripts/4963.cs2 b/dumps/scripts/4963.cs2 new file mode 100644 index 000000000..190867016 --- /dev/null +++ b/dumps/scripts/4963.cs2 @@ -0,0 +1,25 @@ +int script_4963(int arg0) { + switch (arg0) { + case 71566050: + return 17; + case 71566061: + return 18; + case 71566072: + return 19; + case 71566083: + return 1; + case 71566094: + return 2; + case 71566105: + return 3; + case 71566116: + return 4; + case 71566127: + return 6; + case 71566138: + return 7; + case 71566150: + return 5; + } + return -1; +} diff --git a/dumps/scripts/4964.cs2 b/dumps/scripts/4964.cs2 new file mode 100644 index 000000000..1a6e97937 --- /dev/null +++ b/dumps/scripts/4964.cs2 @@ -0,0 +1,101 @@ +int script_4964(int arg0) { + switch (arg0) { + case 71566682: + return 1; + case 71566675: + return 2; + case 71566668: + return 3; + case 71566584: + return 4; + case 71566591: + return 5; + case 71566598: + return 6; + case 71566605: + return 7; + case 71566612: + return 8; + case 71566619: + return 9; + case 71566626: + return 10; + case 71566633: + return 11; + case 71566640: + return 12; + case 71566647: + return 13; + case 71566654: + return 14; + case 71566661: + return 15; + case 71566689: + return 16; + case 71566695: + return 17; + case 71566701: + return 18; + case 71566707: + return 19; + case 71566713: + return 20; + case 71566719: + return 21; + case 71566726: + return 22; + case 71566732: + return 23; + case 71566738: + return 24; + case 71566744: + return 25; + case 71566750: + return 26; + case 71566756: + return 27; + case 71566762: + return 28; + case 71566768: + return 29; + case 71566774: + return 30; + case 71566780: + return 31; + case 71566786: + return 32; + case 71566792: + return 33; + case 71566798: + return 34; + case 71566805: + return 35; + case 71566821: + return 36; + case 71566813: + return 37; + case 71566829: + return 38; + case 71566837: + return 39; + case 71566845: + return 40; + case 71566853: + return 41; + case 71566861: + return 42; + case 71566869: + return 43; + case 71566877: + return 44; + case 71566885: + return 45; + case 71566893: + return 46; + case 71566901: + return 47; + case 71566909: + return 48; + } + return 0; +} diff --git a/dumps/scripts/4965.cs2 b/dumps/scripts/4965.cs2 new file mode 100644 index 000000000..4971bccfa --- /dev/null +++ b/dumps/scripts/4965.cs2 @@ -0,0 +1,9 @@ +int script_4965(int arg0) { + int ivar1; + ivar1 = -1; + if (citadelConfigsInitialized()) { + ivar1 = script_4948(arg0); + return script_4959(arg0); + } + return 0; +} diff --git a/dumps/scripts/4966.cs2 b/dumps/scripts/4966.cs2 new file mode 100644 index 000000000..21d9e066c --- /dev/null +++ b/dumps/scripts/4966.cs2 @@ -0,0 +1,101 @@ +int script_4966(int arg0) { + switch (arg0) { + case 71566682: + return 1; + case 71566675: + return 2; + case 71566668: + return 3; + case 71566584: + return 4; + case 71566591: + return 5; + case 71566598: + return 6; + case 71566605: + return 7; + case 71566612: + return 8; + case 71566619: + return 9; + case 71566626: + return 10; + case 71566633: + return 11; + case 71566640: + return 12; + case 71566647: + return 13; + case 71566654: + return 14; + case 71566661: + return 15; + case 71566805: + return 35; + case 71566821: + return 36; + case 71566813: + return 37; + case 71566829: + return 38; + case 71566837: + return 39; + case 71566845: + return 40; + case 71566853: + return 41; + case 71566861: + return 42; + case 71566869: + return 43; + case 71566877: + return 44; + case 71566885: + return 45; + case 71566893: + return 46; + case 71566901: + return 47; + case 71566909: + return 48; + case 71566689: + return 16; + case 71566695: + return 17; + case 71566701: + return 18; + case 71566707: + return 19; + case 71566713: + return 20; + case 71566719: + return 21; + case 71566726: + return 22; + case 71566732: + return 23; + case 71566738: + return 24; + case 71566744: + return 25; + case 71566750: + return 26; + case 71566756: + return 27; + case 71566762: + return 28; + case 71566768: + return 29; + case 71566774: + return 30; + case 71566780: + return 31; + case 71566786: + return 32; + case 71566792: + return 33; + case 71566798: + return 34; + } + return 0; +} diff --git a/dumps/scripts/4967.cs2 b/dumps/scripts/4967.cs2 new file mode 100644 index 000000000..c92d5ef0a --- /dev/null +++ b/dumps/scripts/4967.cs2 @@ -0,0 +1,29 @@ +int script_4967(int arg0) { + switch (arg0) { + case 4: + return 1; + case 5: + return 2; + case 6: + return 3; + case 7: + return 4; + case 8: + return 5; + case 9: + return 6; + case 10: + return 7; + case 11: + return 8; + case 12: + return 9; + case 13: + return 10; + case 14: + return 11; + case 15: + return 12; + } + return -1; +} diff --git a/dumps/scripts/4968.cs2 b/dumps/scripts/4968.cs2 new file mode 100644 index 000000000..3a15f6f1b --- /dev/null +++ b/dumps/scripts/4968.cs2 @@ -0,0 +1,73 @@ +int script_4968(int arg0) { + switch (arg0) { + case 1: + return 71565525; + case 2: + return 71565526; + case 3: + return 71565527; + case 4: + return 71565496; + case 5: + return 71565497; + case 6: + return 71565498; + case 7: + return 71565499; + case 8: + return 71565500; + case 9: + return 71565501; + case 10: + return 71565502; + case 11: + return 71565503; + case 12: + return 71565504; + case 13: + return 71565505; + case 14: + return 71565506; + case 15: + return 71565507; + case 16: + return 71565478; + case 17: + return 71565479; + case 18: + return 71565480; + case 19: + return 71565481; + case 20: + return 71565482; + case 21: + return 71565483; + case 22: + return 71565484; + case 23: + return 71565485; + case 24: + return 71565486; + case 25: + return 71565487; + case 26: + return 71565488; + case 27: + return 71565489; + case 28: + return 71565490; + case 29: + return 71565491; + case 30: + return 71565492; + case 31: + return 71565493; + case 32: + return 71565494; + case 33: + return 71565495; + case 34: + return 71565530; + } + return -1; +} diff --git a/dumps/scripts/4969.cs2 b/dumps/scripts/4969.cs2 new file mode 100644 index 000000000..3e8a14515 --- /dev/null +++ b/dumps/scripts/4969.cs2 @@ -0,0 +1,39 @@ +int script_4969(int arg0) { + switch (arg0) { + case 101: + return 71566240; + case 100: + return 71566241; + case 102: + return 71566242; + case 103: + return 71566243; + case 3: + return 71566244; + case 4: + return 71565508; + case 5: + return 71566229; + case 6: + return 71566230; + case 7: + return 71566231; + case 8: + return 71566232; + case 9: + return 71566233; + case 10: + return 71566234; + case 11: + return 71566235; + case 12: + return 71566236; + case 13: + return 71566237; + case 14: + return 71566238; + case 15: + return 71566239; + } + return -1; +} diff --git a/dumps/scripts/497.cs2 b/dumps/scripts/497.cs2 new file mode 100644 index 000000000..8d1b19cc5 --- /dev/null +++ b/dumps/scripts/497.cs2 @@ -0,0 +1,57 @@ +void script_497() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + string svar0; + string svar1; + string svar2; + string svar3; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + if (globalint_1367 != -1) { + ivar0 = getNpcNodemapData(globalint_1367, 1134); + if (globalint_1368 > ivar0) { + svar0 = "Movement: " + "" + intToStr(globalint_1368) + "" + "/" + intToStr(ivar0); + } else if (globalint_1368 < ivar0) { + svar0 = "Movement: " + "" + intToStr(globalint_1368) + "" + "/" + intToStr(ivar0); + } else { + svar0 = "Movement: " + intToStr(globalint_1368) + "/" + intToStr(ivar0); + } + ivar1 = getNpcNodemapData(globalint_1367, 1135); + if (globalint_1369 > ivar1) { + svar1 = "Damage: " + "" + intToStr(multiply(globalint_1369, 100)) + "" + "/" + intToStr(multiply(ivar1, 100)); + } else if (globalint_1369 < ivar1) { + svar1 = "Damage: " + "" + intToStr(multiply(globalint_1369, 100)) + "" + "/" + intToStr(multiply(ivar1, 100)); + } else { + svar1 = "Damage: " + intToStr(multiply(globalint_1369, 100)) + "/" + intToStr(multiply(ivar1, 100)); + } + ivar2 = getNpcNodemapData(globalint_1367, 1136); + if (globalint_1370 > ivar2) { + svar2 = "Health: " + "" + intToStr(multiply(globalint_1370, 100)) + "" + "/" + intToStr(multiply(ivar2, 100)); + } else if (globalint_1370 < ivar2) { + svar2 = "Health: " + "" + intToStr(multiply(globalint_1370, 100)) + "" + "/" + intToStr(multiply(ivar2, 100)); + } else { + svar2 = "Health: " + intToStr(multiply(globalint_1370, 100)) + "/" + intToStr(multiply(ivar2, 100)); + } + ivar3 = getNpcNodemapData(globalint_1367, 1137); + if (globalint_1371 > ivar3) { + svar3 = "Range: " + "" + intToStr(globalint_1371) + "" + "/" + intToStr(ivar3); + } else if (globalint_1371 < ivar3) { + svar3 = "Range: " + "" + intToStr(globalint_1371) + "" + "/" + intToStr(ivar3); + } else { + svar3 = "Range: " + intToStr(globalint_1371) + "/" + intToStr(ivar3); + } + setWidgetText(new WidgetPointer(1012,8), svar0); + setWidgetText(new WidgetPointer(1012,9), svar1); + setWidgetText(new WidgetPointer(1012,10), svar2); + setWidgetText(new WidgetPointer(1012,11), svar3); + } + return; +} diff --git a/dumps/scripts/4970.cs2 b/dumps/scripts/4970.cs2 new file mode 100644 index 000000000..e0ee2b5b8 --- /dev/null +++ b/dumps/scripts/4970.cs2 @@ -0,0 +1,71 @@ +int script_4970(int arg0) { + switch (arg0) { + case 21: + return 16; + case 22: + return 17; + case 23: + return 18; + case 24: + return 19; + case 25: + return 20; + case 26: + return 21; + case 27: + return 22; + case 28: + return 23; + case 31: + return 24; + case 32: + return 25; + case 33: + return 26; + case 34: + return 27; + case 35: + return 28; + case 41: + return 29; + case 42: + return 30; + case 43: + return 31; + case 44: + return 32; + case 45: + return 33; + case 51: + return 34; + case 100: + return 35; + case 101: + return 36; + case 102: + return 37; + case 103: + return 38; + case 104: + return 39; + case 105: + return 40; + case 106: + return 41; + case 107: + return 42; + case 108: + return 43; + case 109: + return 44; + case 110: + return 45; + case 111: + return 46; + case 112: + return 47; + case 113: + return 48; + } + return -1; +} diff --git a/dumps/scripts/4971.cs2 b/dumps/scripts/4971.cs2 new file mode 100644 index 000000000..fc3dc9cc2 --- /dev/null +++ b/dumps/scripts/4971.cs2 @@ -0,0 +1,71 @@ +int script_4971(int arg0) { + switch (arg0) { + case 16: + return 21; + case 17: + return 22; + case 18: + return 23; + case 19: + return 24; + case 20: + return 25; + case 21: + return 26; + case 22: + return 27; + case 23: + return 28; + case 24: + return 31; + case 25: + return 32; + case 26: + return 33; + case 27: + return 34; + case 28: + return 35; + case 29: + return 41; + case 30: + return 42; + case 31: + return 43; + case 32: + return 44; + case 33: + return 45; + case 34: + return 51; + case 35: + return 100; + case 36: + return 101; + case 37: + return 102; + case 38: + return 103; + case 39: + return 104; + case 40: + return 105; + case 41: + return 106; + case 42: + return 107; + case 43: + return 108; + case 44: + return 109; + case 45: + return 110; + case 46: + return 111; + case 47: + return 112; + case 48: + return 113; + } + return -1; +} diff --git a/dumps/scripts/4972.cs2 b/dumps/scripts/4972.cs2 new file mode 100644 index 000000000..97d777688 --- /dev/null +++ b/dumps/scripts/4972.cs2 @@ -0,0 +1,101 @@ +int script_4972(int arg0) { + switch (arg0) { + case 1: + return 71566682; + case 2: + return 71566675; + case 3: + return 71566668; + case 4: + return 71566584; + case 5: + return 71566591; + case 6: + return 71566598; + case 7: + return 71566605; + case 8: + return 71566612; + case 9: + return 71566619; + case 10: + return 71566626; + case 11: + return 71566633; + case 12: + return 71566640; + case 13: + return 71566647; + case 14: + return 71566654; + case 15: + return 71566661; + case 16: + return 71566689; + case 17: + return 71566695; + case 18: + return 71566701; + case 19: + return 71566707; + case 20: + return 71566713; + case 21: + return 71566719; + case 22: + return 71566726; + case 23: + return 71566732; + case 24: + return 71566738; + case 25: + return 71566744; + case 26: + return 71566750; + case 27: + return 71566756; + case 28: + return 71566762; + case 29: + return 71566768; + case 30: + return 71566774; + case 31: + return 71566780; + case 32: + return 71566786; + case 33: + return 71566792; + case 34: + return 71566798; + case 35: + return 71566805; + case 36: + return 71566821; + case 37: + return 71566813; + case 38: + return 71566829; + case 39: + return 71566837; + case 40: + return 71566845; + case 41: + return 71566853; + case 42: + return 71566861; + case 43: + return 71566869; + case 44: + return 71566877; + case 45: + return 71566885; + case 46: + return 71566893; + case 47: + return 71566901; + case 48: + return 71566909; + } + return -1; +} diff --git a/dumps/scripts/4973.cs2 b/dumps/scripts/4973.cs2 new file mode 100644 index 000000000..2d437dd81 --- /dev/null +++ b/dumps/scripts/4973.cs2 @@ -0,0 +1,173 @@ +int script_4973(int arg0) { + int ivar1; + int ivar2; + ivar1 = 0; + ivar2 = 0; + if (citadelConfigsInitialized()) { + ivar1 = script_4949(arg0); + switch (arg0) { + case 1: + return 7431; + case 2: + return 7430; + case 3: + return 7433; + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 13: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 14: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 15: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 17: + case 16: + case 19: + case 18: + case 21: + case 20: + case 23: + case 22: + case 25: + case 24: + case 27: + case 26: + case 29: + case 28: + case 31: + case 30: + case 34: + case 32: + case 33: + return script_4974(ivar1); + case 35: + case 38: + case 39: + case 36: + case 37: + case 42: + case 43: + case 40: + case 41: + case 46: + case 47: + case 44: + case 45: + case 48: + return cs2method_3408(105, 100, 4061, ivar1); + } + } + return -1; +} diff --git a/dumps/scripts/4974.cs2 b/dumps/scripts/4974.cs2 new file mode 100644 index 000000000..ed3329c94 --- /dev/null +++ b/dumps/scripts/4974.cs2 @@ -0,0 +1,60 @@ +int script_4974(int arg0) { + switch (arg0) { + case 17: + return 7431; + case 18: + return 7430; + case 19: + return 7433; + case 1: + return 7422; + case 2: + return 7424; + case 3: + return 7423; + case 4: + return 7426; + case 5: + return 7427; + case 6: + return 7425; + case 7: + return 7428; + case 102: + case 103: + case 100: + case 101: + case 110: + case 111: + case 108: + case 109: + case 106: + case 107: + case 104: + case 105: + case 113: + case 112: + return cs2method_3408(105, 100, 4061, arg0); + case 21: + case 23: + case 22: + case 25: + case 24: + case 27: + case 26: + case 28: + case 31: + case 34: + case 35: + case 32: + case 33: + case 42: + case 43: + case 41: + case 44: + case 45: + case 51: + return 7434; + } + return -1; +} diff --git a/dumps/scripts/4975.cs2 b/dumps/scripts/4975.cs2 new file mode 100644 index 000000000..c7d1a4709 --- /dev/null +++ b/dumps/scripts/4975.cs2 @@ -0,0 +1,12 @@ +int script_4975(int arg0) { + if ((arg0 > 0) && (arg0 < 300)) { + return 1; + } + if ((arg0 > 300) && (arg0 < 600)) { + return 2; + } + if (arg0 > 600) { + return 3; + } + return 0; +} diff --git a/dumps/scripts/4976.cs2 b/dumps/scripts/4976.cs2 new file mode 100644 index 000000000..aee0387ca --- /dev/null +++ b/dumps/scripts/4976.cs2 @@ -0,0 +1,19 @@ +int script_4976(int arg0) { + switch (arg0) { + case 1: + return 100000; + case 2: + return 120000; + case 3: + return 140000; + case 4: + return 170000; + case 5: + return 200000; + case 6: + return 235000; + case 7: + return 270000; + } + return 0; +} diff --git a/dumps/scripts/4977.cs2 b/dumps/scripts/4977.cs2 new file mode 100644 index 000000000..a52eb464b --- /dev/null +++ b/dumps/scripts/4977.cs2 @@ -0,0 +1,33 @@ +int script_4977(int arg0) { + switch (arg0) { + case 35: + return 7232; + case 36: + return 7229; + case 37: + return 7072; + case 38: + return 7131; + case 39: + return 7222; + case 40: + return 7115; + case 41: + return 7238; + case 42: + return 7032; + case 43: + return 7138; + case 44: + return 7277; + case 45: + return 7262; + case 46: + return 7258; + case 47: + return 7254; + case 48: + return 7267; + } + return -1; +} diff --git a/dumps/scripts/4978.cs2 b/dumps/scripts/4978.cs2 new file mode 100644 index 000000000..50e7a44d1 --- /dev/null +++ b/dumps/scripts/4978.cs2 @@ -0,0 +1,127 @@ +int script_4978(int arg0) { + if (citadelConfigsInitialized()) { + switch (arg0) { + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 13: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 14: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 15: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + } + return -1; +} diff --git a/dumps/scripts/4979.cs2 b/dumps/scripts/4979.cs2 new file mode 100644 index 000000000..287a6f5da --- /dev/null +++ b/dumps/scripts/4979.cs2 @@ -0,0 +1,19 @@ +int script_4979(int arg0) { + switch (arg0) { + case 1: + return 1; + case 2: + return 2; + case 3: + return 3; + case 4: + return 3; + case 7: + return 5; + case 5: + return 5; + case 6: + return 6; + } + return 0; +} diff --git a/dumps/scripts/498.cs2 b/dumps/scripts/498.cs2 new file mode 100644 index 000000000..9445a93f0 --- /dev/null +++ b/dumps/scripts/498.cs2 @@ -0,0 +1,244 @@ +void script_498(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = -1; + if ((((arg0 == globalint_1372) && (arg1 == globalint_1373)) && ((arg2 == globalint_1374) && (arg3 == globalint_1375))) && ((arg4 == globalint_1376) && (arg5 == globalint_1377))) { + return; + } + setScriptCallOnGlobalConfigChange(498, globalint_1372, globalint_1373, globalint_1374, globalint_1375, globalint_1376, globalint_1377, 1372, 1373, 1374, 1375, 1376, 1377, 6, "iiiiiiY", new WidgetPointer(1012,0)); + if (globalint_1367 != -1) { + ivar6 = add(add(add(add(add(globalint_1372, globalint_1373), globalint_1374), globalint_1375), globalint_1376), globalint_1377); + if (((boolean)ivar6)) { + setWidgetIsHidden(true, new WidgetPointer(1012,14)); + setWidgetIsHidden(false, new WidgetPointer(1012,29)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1012,14)); + setWidgetIsHidden(true, new WidgetPointer(1012,29)); + } + if (((boolean)ivar6)) { + setWidgetIsHidden(false, new WidgetPointer(1012,15)); + setWidgetPosition(82, getWidgetActualY(new WidgetPointer(1012,15)), 0, 0, new WidgetPointer(1012,15)); + if (((boolean)globalint_1372)) { + ivar13 = 293; + } else if (((boolean)globalint_1373)) { + ivar13 = 299; + } else if (((boolean)globalint_1374)) { + ivar13 = 305; + } else if (((boolean)globalint_1375)) { + ivar13 = 1044; + } else if (((boolean)globalint_1376)) { + ivar13 = 1045; + } else { + ivar13 = 1046; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,15)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,15)); + setWidgetIsHidden(true, new WidgetPointer(1012,16)); + setWidgetIsHidden(true, new WidgetPointer(1012,17)); + setWidgetIsHidden(true, new WidgetPointer(1012,18)); + setWidgetIsHidden(true, new WidgetPointer(1012,19)); + } else if (ivar6 == 2) { + setWidgetIsHidden(false, new WidgetPointer(1012,15)); + setWidgetPosition(50, getWidgetActualY(new WidgetPointer(1012,15)), 0, 0, new WidgetPointer(1012,15)); + if (((boolean)globalint_1372)) { + ivar13 = 293; + } else if (((boolean)globalint_1373)) { + ivar13 = 299; + ivar8 = 1; + } else if (((boolean)globalint_1374)) { + ivar13 = 305; + ivar9 = 1; + } else if (((boolean)globalint_1375)) { + ivar13 = 1044; + ivar10 = 1; + } else { + ivar13 = 1045; + ivar11 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,15)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,15)); + setWidgetIsHidden(false, new WidgetPointer(1012,16)); + setWidgetPosition(115, getWidgetActualY(new WidgetPointer(1012,16)), 0, 0, new WidgetPointer(1012,16)); + if (((boolean)globalint_1373) && ((boolean)ivar8)) { + ivar13 = 299; + } else if (((boolean)globalint_1374) && ((boolean)ivar9)) { + ivar13 = 305; + } else if (((boolean)globalint_1375) && ((boolean)ivar10)) { + ivar13 = 1044; + } else if (((boolean)globalint_1376) && ((boolean)ivar11)) { + ivar13 = 1045; + } else { + ivar13 = 1046; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,16)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,16)); + setWidgetIsHidden(true, new WidgetPointer(1012,17)); + setWidgetIsHidden(true, new WidgetPointer(1012,18)); + setWidgetIsHidden(true, new WidgetPointer(1012,19)); + } else if (ivar6 == 3) { + setWidgetIsHidden(false, new WidgetPointer(1012,15)); + setWidgetPosition(30, getWidgetActualY(new WidgetPointer(1012,15)), 0, 0, new WidgetPointer(1012,15)); + if (((boolean)globalint_1372)) { + ivar13 = 293; + } else if (((boolean)globalint_1373)) { + ivar13 = 299; + ivar8 = 1; + } else if (((boolean)globalint_1374)) { + ivar13 = 305; + ivar9 = 1; + } else { + ivar13 = 1044; + ivar10 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,15)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,15)); + setWidgetIsHidden(false, new WidgetPointer(1012,16)); + setWidgetPosition(80, getWidgetActualY(new WidgetPointer(1012,16)), 0, 0, new WidgetPointer(1012,16)); + if (((boolean)globalint_1373) && ((boolean)ivar8)) { + ivar13 = 299; + } else if (((boolean)globalint_1374) && ((boolean)ivar9)) { + ivar13 = 305; + ivar9 = 1; + } else if (((boolean)globalint_1375) && ((boolean)ivar10)) { + ivar13 = 1044; + ivar10 = 1; + } else { + ivar13 = 1045; + ivar11 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,16)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,16)); + setWidgetIsHidden(false, new WidgetPointer(1012,17)); + setWidgetPosition(130, getWidgetActualY(new WidgetPointer(1012,17)), 0, 0, new WidgetPointer(1012,17)); + if (((boolean)globalint_1374) && ((boolean)ivar9)) { + ivar13 = 305; + } else if (((boolean)globalint_1375) && ((boolean)ivar10)) { + ivar13 = 1044; + } else if (((boolean)globalint_1376) && ((boolean)ivar11)) { + ivar13 = 1045; + } else { + ivar13 = 1046; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,17)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,17)); + setWidgetIsHidden(true, new WidgetPointer(1012,18)); + setWidgetIsHidden(true, new WidgetPointer(1012,19)); + } else if (ivar6 == 4) { + setWidgetIsHidden(false, new WidgetPointer(1012,15)); + setWidgetPosition(18, getWidgetActualY(new WidgetPointer(1012,15)), 0, 0, new WidgetPointer(1012,15)); + if (((boolean)globalint_1372)) { + ivar13 = 293; + } else if (((boolean)globalint_1373)) { + ivar13 = 299; + ivar8 = 1; + } else { + ivar13 = 305; + ivar9 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,15)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,15)); + setWidgetIsHidden(false, new WidgetPointer(1012,16)); + setWidgetPosition(61, getWidgetActualY(new WidgetPointer(1012,16)), 0, 0, new WidgetPointer(1012,16)); + if (((boolean)globalint_1373) && ((boolean)ivar8)) { + ivar13 = 299; + } else if (((boolean)globalint_1374) && ((boolean)ivar9)) { + ivar13 = 305; + ivar9 = 1; + } else { + ivar13 = 1044; + ivar10 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,16)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,16)); + setWidgetIsHidden(false, new WidgetPointer(1012,17)); + setWidgetPosition(104, getWidgetActualY(new WidgetPointer(1012,17)), 0, 0, new WidgetPointer(1012,17)); + if (((boolean)globalint_1374) && ((boolean)ivar9)) { + ivar13 = 305; + } else if (((boolean)globalint_1375) && ((boolean)ivar10)) { + ivar13 = 1044; + ivar10 = 1; + } else { + ivar13 = 1045; + ivar11 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,17)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,17)); + setWidgetIsHidden(false, new WidgetPointer(1012,18)); + setWidgetPosition(147, getWidgetActualY(new WidgetPointer(1012,18)), 0, 0, new WidgetPointer(1012,18)); + if (((boolean)globalint_1375) && ((boolean)ivar10)) { + ivar13 = 1044; + } else if (((boolean)globalint_1376) && ((boolean)ivar11)) { + ivar13 = 1045; + } else { + ivar13 = 1046; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,18)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,18)); + setWidgetIsHidden(true, new WidgetPointer(1012,19)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1012,15)); + setWidgetPosition(11, getWidgetActualY(new WidgetPointer(1012,15)), 0, 0, new WidgetPointer(1012,15)); + if (((boolean)globalint_1372)) { + ivar13 = 293; + } else { + ivar13 = 299; + ivar8 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,15)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,15)); + setWidgetIsHidden(false, new WidgetPointer(1012,16)); + setWidgetPosition(47, getWidgetActualY(new WidgetPointer(1012,16)), 0, 0, new WidgetPointer(1012,16)); + if (((boolean)globalint_1373) && ((boolean)ivar8)) { + ivar13 = 299; + } else { + ivar13 = 305; + ivar9 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,16)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,16)); + setWidgetIsHidden(false, new WidgetPointer(1012,17)); + setWidgetPosition(83, getWidgetActualY(new WidgetPointer(1012,17)), 0, 0, new WidgetPointer(1012,17)); + if (((boolean)globalint_1374) && ((boolean)ivar9)) { + ivar13 = 305; + } else { + ivar13 = 1044; + ivar10 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,17)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,17)); + setWidgetIsHidden(false, new WidgetPointer(1012,18)); + setWidgetPosition(119, getWidgetActualY(new WidgetPointer(1012,18)), 0, 0, new WidgetPointer(1012,18)); + if (((boolean)globalint_1375) && ((boolean)ivar10)) { + ivar13 = 1044; + } else { + ivar13 = 1045; + ivar11 = 1; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,18)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,18)); + setWidgetIsHidden(false, new WidgetPointer(1012,19)); + setWidgetPosition(155, getWidgetActualY(new WidgetPointer(1012,19)), 0, 0, new WidgetPointer(1012,19)); + if (((boolean)globalint_1376) && ((boolean)ivar11)) { + ivar13 = 1045; + } else { + ivar13 = 1046; + } + setWidgetSprite(getOtherCommonData(ivar13, 1153), new WidgetPointer(1012,19)); + setScriptCallOnMouseOver(499, getOtherCommonData(ivar13, 1149), "i", new WidgetPointer(1012,19)); + } + } + return; +} diff --git a/dumps/scripts/4980.cs2 b/dumps/scripts/4980.cs2 new file mode 100644 index 000000000..e5da54ee9 --- /dev/null +++ b/dumps/scripts/4980.cs2 @@ -0,0 +1,175 @@ +int script_4980(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 1; + if (citadelConfigsInitialized()) { + ivar1 = script_4948(arg0); + if (ivar1 <= 0) { + return 0; + } + ivar2 = script_4959(ivar1); + if (((boolean)ivar2)) { + return 0; + } + switch (ivar1) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 13: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 14: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 15: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (ivar3 > 0) { + return 4; + } + return 3; + } + return 0; +} diff --git a/dumps/scripts/4981.cs2 b/dumps/scripts/4981.cs2 new file mode 100644 index 000000000..eb51ddc52 --- /dev/null +++ b/dumps/scripts/4981.cs2 @@ -0,0 +1,99 @@ +void script_4981(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + string svar6; + string svar7; + if (arg2 == -1) { + return; + } + if (arg3 == -1) { + return; + } + if ((arg1 < 0) || (arg1 > 7)) { + return; + } + ivar5 = 0; + switch (arg0) { + case 17: + case 1: + case 19: + case 18: + ivar5 = 1; + } + ivar6 = script_5169(arg0); + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + ivar14 = -1; + ivar15 = -1; + ivar16 = -1; + ivar17 = 0; + ivar18 = -1; + ivar19 = -1; + ivar20 = 0; + svar0 = ""; + ivar21 = 1; + svar1 = ""; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + svar2 = "This building cannot be upgraded."; + svar3 = "This building cannot be downgraded."; + svar4 = "There is no upgrade to cancel."; + svar5 = "There is no downgrade to cancel."; + svar6 = "This building is already marked to be moved."; + svar7 = "There is no move order to cancel."; + setWidgetIsHidden(true, new WidgetPointer(1092,879)); + setWidgetIsHidden(true, new WidgetPointer(1092,891)); + setWidgetIsHidden(true, new WidgetPointer(1092,903)); + setWidgetIsHidden(true, new WidgetPointer(1092,915)); + setWidgetIsHidden(true, new WidgetPointer(1092,1804)); + setWidgetIsHidden(true, new WidgetPointer(1092,1816)); + if (citadelConfigsInitialized() && cs2method3701()) { + ivar18 = cs2method3717(cs2method5020()); + if (ivar18 < 0) { + return; + } + ivar19 = cs2method3711(ivar18); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4982.cs2 b/dumps/scripts/4982.cs2 new file mode 100644 index 000000000..449ecc04f --- /dev/null +++ b/dumps/scripts/4982.cs2 @@ -0,0 +1,242 @@ +void script_4982(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + ivar23 = subtract(arg2, arg4); + ivar23 = max(ivar23, 0); + if (citadelConfigsInitialized()) { + switch (arg2) { + case 0: + ivar17 = getOtherCommonData(arg0, 1483); + ivar18 = getOtherCommonData(arg0, 1490); + ivar19 = getOtherCommonData(arg0, 1497); + ivar20 = getOtherCommonData(arg0, 1504); + ivar21 = getOtherCommonData(arg0, 1511); + ivar22 = getOtherCommonData(arg0, 1518); + break; + case 1: + ivar17 = getOtherCommonData(arg0, 1484); + ivar18 = getOtherCommonData(arg0, 1491); + ivar19 = getOtherCommonData(arg0, 1498); + ivar20 = getOtherCommonData(arg0, 1505); + ivar21 = getOtherCommonData(arg0, 1512); + ivar22 = getOtherCommonData(arg0, 1519); + break; + case 2: + ivar17 = getOtherCommonData(arg0, 1485); + ivar18 = getOtherCommonData(arg0, 1492); + ivar19 = getOtherCommonData(arg0, 1499); + ivar20 = getOtherCommonData(arg0, 1506); + ivar21 = getOtherCommonData(arg0, 1513); + ivar22 = getOtherCommonData(arg0, 1520); + break; + case 3: + ivar17 = getOtherCommonData(arg0, 1486); + ivar18 = getOtherCommonData(arg0, 1493); + ivar19 = getOtherCommonData(arg0, 1500); + ivar20 = getOtherCommonData(arg0, 1507); + ivar21 = getOtherCommonData(arg0, 1514); + ivar22 = getOtherCommonData(arg0, 1521); + break; + case 4: + ivar17 = getOtherCommonData(arg0, 1487); + ivar18 = getOtherCommonData(arg0, 1494); + ivar19 = getOtherCommonData(arg0, 1501); + ivar20 = getOtherCommonData(arg0, 1508); + ivar21 = getOtherCommonData(arg0, 1515); + ivar22 = getOtherCommonData(arg0, 1522); + break; + case 5: + ivar17 = getOtherCommonData(arg0, 1488); + ivar18 = getOtherCommonData(arg0, 1495); + ivar19 = getOtherCommonData(arg0, 1502); + ivar20 = getOtherCommonData(arg0, 1509); + ivar21 = getOtherCommonData(arg0, 1516); + ivar22 = getOtherCommonData(arg0, 1523); + break; + case 6: + ivar17 = getOtherCommonData(arg0, 1489); + ivar18 = getOtherCommonData(arg0, 1496); + ivar19 = getOtherCommonData(arg0, 1503); + ivar20 = getOtherCommonData(arg0, 1510); + ivar21 = getOtherCommonData(arg0, 1517); + ivar22 = getOtherCommonData(arg0, 1524); + } + switch (arg2) { + case 1: + ivar5 = getOtherCommonData(arg1, 1483); + ivar6 = getOtherCommonData(arg1, 1490); + ivar7 = getOtherCommonData(arg1, 1497); + ivar8 = getOtherCommonData(arg1, 1504); + ivar9 = getOtherCommonData(arg1, 1511); + ivar10 = getOtherCommonData(arg1, 1518); + break; + case 2: + ivar5 = getOtherCommonData(arg1, 1484); + ivar6 = getOtherCommonData(arg1, 1491); + ivar7 = getOtherCommonData(arg1, 1498); + ivar8 = getOtherCommonData(arg1, 1505); + ivar9 = getOtherCommonData(arg1, 1512); + ivar10 = getOtherCommonData(arg1, 1519); + break; + case 3: + ivar5 = getOtherCommonData(arg1, 1485); + ivar6 = getOtherCommonData(arg1, 1492); + ivar7 = getOtherCommonData(arg1, 1499); + ivar8 = getOtherCommonData(arg1, 1506); + ivar9 = getOtherCommonData(arg1, 1513); + ivar10 = getOtherCommonData(arg1, 1520); + break; + case 4: + ivar5 = getOtherCommonData(arg1, 1486); + ivar6 = getOtherCommonData(arg1, 1493); + ivar7 = getOtherCommonData(arg1, 1500); + ivar8 = getOtherCommonData(arg1, 1507); + ivar9 = getOtherCommonData(arg1, 1514); + ivar10 = getOtherCommonData(arg1, 1521); + break; + case 5: + ivar5 = getOtherCommonData(arg1, 1487); + ivar6 = getOtherCommonData(arg1, 1494); + ivar7 = getOtherCommonData(arg1, 1501); + ivar8 = getOtherCommonData(arg1, 1508); + ivar9 = getOtherCommonData(arg1, 1515); + ivar10 = getOtherCommonData(arg1, 1522); + break; + case 6: + ivar5 = getOtherCommonData(arg1, 1488); + ivar6 = getOtherCommonData(arg1, 1495); + ivar7 = getOtherCommonData(arg1, 1502); + ivar8 = getOtherCommonData(arg1, 1509); + ivar9 = getOtherCommonData(arg1, 1516); + ivar10 = getOtherCommonData(arg1, 1523); + break; + case 7: + ivar5 = getOtherCommonData(arg1, 1489); + ivar6 = getOtherCommonData(arg1, 1496); + ivar7 = getOtherCommonData(arg1, 1503); + ivar8 = getOtherCommonData(arg1, 1510); + ivar9 = getOtherCommonData(arg1, 1517); + ivar10 = getOtherCommonData(arg1, 1524); + } + if (ivar23 > 0) { + switch (ivar23) { + case 1: + ivar11 = getOtherCommonData(arg1, 1483); + ivar12 = getOtherCommonData(arg1, 1490); + ivar13 = getOtherCommonData(arg1, 1497); + ivar14 = getOtherCommonData(arg1, 1504); + ivar15 = getOtherCommonData(arg1, 1511); + ivar16 = getOtherCommonData(arg1, 1518); + break; + case 2: + ivar11 = getOtherCommonData(arg1, 1484); + ivar12 = getOtherCommonData(arg1, 1491); + ivar13 = getOtherCommonData(arg1, 1498); + ivar14 = getOtherCommonData(arg1, 1505); + ivar15 = getOtherCommonData(arg1, 1512); + ivar16 = getOtherCommonData(arg1, 1519); + break; + case 3: + ivar11 = getOtherCommonData(arg1, 1485); + ivar12 = getOtherCommonData(arg1, 1492); + ivar13 = getOtherCommonData(arg1, 1499); + ivar14 = getOtherCommonData(arg1, 1506); + ivar15 = getOtherCommonData(arg1, 1513); + ivar16 = getOtherCommonData(arg1, 1520); + break; + case 4: + ivar11 = getOtherCommonData(arg1, 1486); + ivar12 = getOtherCommonData(arg1, 1493); + ivar13 = getOtherCommonData(arg1, 1500); + ivar14 = getOtherCommonData(arg1, 1507); + ivar15 = getOtherCommonData(arg1, 1514); + ivar16 = getOtherCommonData(arg1, 1521); + break; + case 5: + ivar11 = getOtherCommonData(arg1, 1487); + ivar12 = getOtherCommonData(arg1, 1494); + ivar13 = getOtherCommonData(arg1, 1501); + ivar14 = getOtherCommonData(arg1, 1508); + ivar15 = getOtherCommonData(arg1, 1515); + ivar16 = getOtherCommonData(arg1, 1522); + break; + case 6: + ivar11 = getOtherCommonData(arg1, 1488); + ivar12 = getOtherCommonData(arg1, 1495); + ivar13 = getOtherCommonData(arg1, 1502); + ivar14 = getOtherCommonData(arg1, 1509); + ivar15 = getOtherCommonData(arg1, 1516); + ivar16 = getOtherCommonData(arg1, 1523); + } + } else { + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + } + if (((boolean)arg3) && ((boolean)arg2)) { + ivar5 = multiply(ivar5, 2); + ivar6 = multiply(ivar6, 2); + ivar7 = multiply(ivar7, 2); + ivar8 = multiply(ivar8, 2); + ivar9 = multiply(ivar9, 2); + ivar10 = multiply(ivar10, 2); + } + setWidgetText(new WidgetPointer(1092,477), intToStr(ivar5)); + setWidgetText(new WidgetPointer(1092,484), intToStr(ivar6)); + setWidgetText(new WidgetPointer(1092,491), intToStr(ivar7)); + setWidgetText(new WidgetPointer(1092,498), intToStr(ivar8)); + setWidgetText(new WidgetPointer(1092,505), intToStr(ivar9)); + setWidgetText(new WidgetPointer(1092,513), intToStr(ivar10)); + setWidgetText(new WidgetPointer(1092,610), intToStr(ivar17)); + setWidgetText(new WidgetPointer(1092,618), intToStr(ivar18)); + setWidgetText(new WidgetPointer(1092,626), intToStr(ivar19)); + setWidgetText(new WidgetPointer(1092,634), intToStr(ivar20)); + setWidgetText(new WidgetPointer(1092,644), intToStr(ivar21)); + setWidgetText(new WidgetPointer(1092,651), intToStr(ivar22)); + setWidgetText(new WidgetPointer(1092,660), intToStr(ivar11)); + setWidgetText(new WidgetPointer(1092,668), intToStr(ivar12)); + setWidgetText(new WidgetPointer(1092,676), intToStr(ivar13)); + setWidgetText(new WidgetPointer(1092,684), intToStr(ivar14)); + setWidgetText(new WidgetPointer(1092,694), intToStr(ivar15)); + setWidgetText(new WidgetPointer(1092,701), intToStr(ivar16)); + } + return; +} diff --git a/dumps/scripts/4983.cs2 b/dumps/scripts/4983.cs2 new file mode 100644 index 000000000..07da0ecfd --- /dev/null +++ b/dumps/scripts/4983.cs2 @@ -0,0 +1,3 @@ +void script_4983() { + return; +} diff --git a/dumps/scripts/4984.cs2 b/dumps/scripts/4984.cs2 new file mode 100644 index 000000000..8d4f103bc --- /dev/null +++ b/dumps/scripts/4984.cs2 @@ -0,0 +1,4 @@ +void script_4984() { + script_4985(); + return; +} diff --git a/dumps/scripts/4985.cs2 b/dumps/scripts/4985.cs2 new file mode 100644 index 000000000..a2ba47f69 --- /dev/null +++ b/dumps/scripts/4985.cs2 @@ -0,0 +1,20 @@ +void script_4985() { + int ivar0; + flow_0: + ivar0 = -1; + IF (citadelConfigsInitialized() && (bitconfig_9550 > 0)) + GOTO flow_2 + GOTO flow_5 + flow_2: + ivar0 = script_4948(bitconfig_9550); + IF (ivar0 <= 0) + GOTO flow_3 + GOTO flow_4 + flow_3: + script_4899(4); + GOTO flow_4 + flow_4: + GOTO flow_5 + flow_5: + return; +} diff --git a/dumps/scripts/4986.cs2 b/dumps/scripts/4986.cs2 new file mode 100644 index 000000000..8787da0dd --- /dev/null +++ b/dumps/scripts/4986.cs2 @@ -0,0 +1,4 @@ +void script_4986(int arg0) { + script_4987(arg0); + return; +} diff --git a/dumps/scripts/4987.cs2 b/dumps/scripts/4987.cs2 new file mode 100644 index 000000000..f8771020d --- /dev/null +++ b/dumps/scripts/4987.cs2 @@ -0,0 +1,42 @@ +void script_4987(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int stack_dump0; + cs2func_script_4958_struct(5,0,0) structdump_1; + ivar1 = 0; + ivar2 = 0; + ivar3 = -1; + ivar4 = -1; + ivar5 = 0; + ivar6 = script_4966(arg0); + if (citadelConfigsInitialized()) { + ivar1 = script_4949(ivar6); + bitconfig_9550 = ivar1; + } + if (((boolean)bitconfig_9552) || (bitconfig_9552 == 2)) { + stack_dump0 = ivar6; + structdump_1 = script_4958(stack_dump0); + ivar5 = structdump_1.intpart_4; + ivar4 = structdump_1.intpart_3; + ivar3 = structdump_1.intpart_2; + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + script_4988(bitconfig_9550); + script_4937(); + } else { + if ((bitconfig_9552 == 4) || (bitconfig_9552 == 3)) { + bitconfig_9550 = script_4949(ivar6); + script_4988(bitconfig_9550); + script_4937(); + script_4905(); + script_4907(); + bitconfig_9552 = 1; + script_4899(1); + } + } + return; +} diff --git a/dumps/scripts/4988.cs2 b/dumps/scripts/4988.cs2 new file mode 100644 index 000000000..640065a15 --- /dev/null +++ b/dumps/scripts/4988.cs2 @@ -0,0 +1,23 @@ +void script_4988(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int stack_dump0; + cs2func_script_4957_struct(4,0,0) structdump_1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + if (citadelConfigsInitialized()) { + stack_dump0 = arg0; + structdump_1 = script_4957(stack_dump0); + ivar2 = structdump_1.intpart_3; + ivar4 = structdump_1.intpart_2; + ivar3 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + script_4981(arg0, ivar1, ivar3, ivar4, ivar2); + script_4937(); + } + return; +} diff --git a/dumps/scripts/4989.cs2 b/dumps/scripts/4989.cs2 new file mode 100644 index 000000000..21d12ca31 --- /dev/null +++ b/dumps/scripts/4989.cs2 @@ -0,0 +1,26 @@ +void script_4989(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int stack_dump0; + cs2func_script_4958_struct(5,0,0) structdump_1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + stack_dump0 = arg0; + structdump_1 = script_4958(stack_dump0); + ivar3 = structdump_1.intpart_4; + ivar5 = structdump_1.intpart_3; + ivar4 = structdump_1.intpart_2; + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + script_4988(bitconfig_9550); + script_4937(); + bitconfig_9550 = ivar1; + bitconfig_9551 = script_4945(ivar1); + return; +} diff --git a/dumps/scripts/499.cs2 b/dumps/scripts/499.cs2 new file mode 100644 index 000000000..060ef0fa6 --- /dev/null +++ b/dumps/scripts/499.cs2 @@ -0,0 +1,14 @@ +void script_499(int arg0) { + int ivar1; + int ivar2; + ivar1 = script_488(arg0); + ivar2 = 66322452; + if (ivar1 != -1) { + setWidgetText(new WidgetPointer(1012,27), getOtherCommonData(ivar1, 1150)); + setWidgetText(new WidgetPointer(1012,28), getOtherCommonData(ivar1, 1152)); + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar2)); + } + return; +} diff --git a/dumps/scripts/4990.cs2 b/dumps/scripts/4990.cs2 new file mode 100644 index 000000000..2879c9ab6 --- /dev/null +++ b/dumps/scripts/4990.cs2 @@ -0,0 +1,26 @@ +void script_4990(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int stack_dump0; + cs2func_script_4958_struct(5,0,0) structdump_1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + stack_dump0 = arg0; + structdump_1 = script_4958(stack_dump0); + ivar3 = structdump_1.intpart_4; + ivar5 = structdump_1.intpart_3; + ivar4 = structdump_1.intpart_2; + ivar2 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + script_4988(bitconfig_9550); + script_4937(); + bitconfig_9550 = ivar1; + bitconfig_9551 = ivar2; + return; +} diff --git a/dumps/scripts/4991.cs2 b/dumps/scripts/4991.cs2 new file mode 100644 index 000000000..164d4f3d4 --- /dev/null +++ b/dumps/scripts/4991.cs2 @@ -0,0 +1,20 @@ +void script_4991() { + int ivar0; + int ivar1; + script_4993(); + script_4994(); + ivar0 = -1; + ivar1 = 0; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4992.cs2 b/dumps/scripts/4992.cs2 new file mode 100644 index 000000000..b938ce641 --- /dev/null +++ b/dumps/scripts/4992.cs2 @@ -0,0 +1,97 @@ +int script_4992(int arg0,int arg1) { + if (arg1 >= 1) { + switch (arg0) { + case 17: + case 1: + case 19: + case 18: + return 1; + } + } + if (arg1 >= 2) { + switch (arg0) { + case 17: + case 1: + case 2: + case 19: + case 18: + case 7: + return 1; + } + } + if (arg1 >= 3) { + switch (arg0) { + case 17: + case 1: + case 2: + case 19: + case 3: + case 18: + case 4: + case 5: + case 6: + case 7: + return 1; + } + } + if (arg1 >= 4) { + switch (arg0) { + case 17: + case 1: + case 2: + case 19: + case 3: + case 18: + case 4: + case 5: + case 6: + case 7: + return 1; + } + } + if (arg1 >= 5) { + switch (arg0) { + case 17: + case 1: + case 2: + case 19: + case 3: + case 18: + case 4: + case 5: + case 7: + return 1; + } + } + if (arg1 >= 6) { + switch (arg0) { + case 17: + case 1: + case 2: + case 19: + case 3: + case 18: + case 4: + case 5: + case 6: + case 7: + return 1; + } + } + if (arg1 >= 7) { + switch (arg0) { + case 17: + case 1: + case 2: + case 19: + case 3: + case 18: + case 4: + case 5: + case 6: + case 7: + return 1; + } + } + return 0; +} diff --git a/dumps/scripts/4993.cs2 b/dumps/scripts/4993.cs2 new file mode 100644 index 000000000..c674513eb --- /dev/null +++ b/dumps/scripts/4993.cs2 @@ -0,0 +1,13 @@ +void script_4993() { + setWidgetIsHidden(true, new WidgetPointer(1092,198)); + setWidgetIsHidden(true, new WidgetPointer(1092,199)); + setWidgetIsHidden(true, new WidgetPointer(1092,200)); + setWidgetIsHidden(true, new WidgetPointer(1092,201)); + setWidgetIsHidden(true, new WidgetPointer(1092,202)); + setWidgetIsHidden(true, new WidgetPointer(1092,203)); + setWidgetIsHidden(true, new WidgetPointer(1092,204)); + setWidgetIsHidden(true, new WidgetPointer(1092,205)); + setWidgetIsHidden(true, new WidgetPointer(1092,206)); + setWidgetIsHidden(true, new WidgetPointer(1092,833)); + return; +} diff --git a/dumps/scripts/4994.cs2 b/dumps/scripts/4994.cs2 new file mode 100644 index 000000000..58d06409a --- /dev/null +++ b/dumps/scripts/4994.cs2 @@ -0,0 +1,100 @@ +void script_4994() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + string stack_dump0; + ivar0 = -1; + ivar1 = -1; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + ivar14 = -1; + ivar15 = -1; + ivar16 = -1; + ivar17 = -1; + ivar18 = -1; + ivar19 = -1; + ivar20 = -1; + ivar21 = -1; + ivar22 = -1; + ivar23 = -1; + ivar24 = -1; + ivar25 = -1; + ivar26 = -1; + ivar27 = -1; + if (citadelConfigsInitialized()) { + ivar0 = script_4948(1); + ivar1 = script_4948(2); + ivar2 = script_4948(3); + ivar3 = script_4948(4); + ivar4 = script_4948(7); + ivar5 = script_4948(6); + ivar6 = script_4948(5); + ivar7 = script_4959(ivar0); + ivar8 = script_4959(ivar1); + ivar9 = script_4959(ivar2); + ivar10 = script_4959(ivar3); + ivar11 = script_4959(ivar4); + ivar12 = script_4959(ivar5); + ivar13 = script_4959(ivar6); + ivar14 = script_4961(ivar0, 3); + ivar15 = script_4961(ivar1, 3); + ivar16 = script_4961(ivar2, 3); + ivar17 = script_4961(ivar3, 3); + ivar18 = script_4961(ivar4, 3); + ivar19 = script_4961(ivar5, 3); + ivar20 = script_4961(ivar6, 3); + ivar21 = script_4953(ivar14); + ivar22 = script_4953(ivar15); + ivar23 = script_4953(ivar16); + ivar24 = script_4953(ivar17); + ivar25 = script_4953(ivar18); + ivar26 = script_4953(ivar19); + ivar27 = script_4953(ivar20); + stack_dump0 = "Tier "; + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/4995.cs2 b/dumps/scripts/4995.cs2 new file mode 100644 index 000000000..2754c5d58 --- /dev/null +++ b/dumps/scripts/4995.cs2 @@ -0,0 +1,4 @@ +void script_4995(int arg0) { + script_4996(arg0); + return; +} diff --git a/dumps/scripts/4996.cs2 b/dumps/scripts/4996.cs2 new file mode 100644 index 000000000..383418752 --- /dev/null +++ b/dumps/scripts/4996.cs2 @@ -0,0 +1,39 @@ +void script_4996(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar1 = -1; + ivar2 = -1; + ivar3 = 0; + ivar4 = -1; + ivar5 = -1; + ivar6 = -1; + setWidgetIsHidden(false, new WidgetPointer(1092,289)); + if (citadelConfigsInitialized()) { + script_4899(1); + ivar2 = script_4963(arg0); + bitconfig_9550 = ivar2; + if (ivar2 <= 0) { + messageType0("You must first select a building."); + return; + } + ivar1 = script_4948(ivar2); + ivar4 = script_4954(ivar2); + if (ivar4 == -1) { + return; + } + ivar5 = script_4955(ivar2); + if (ivar5 == -1) { + return; + } + if (ivar1 > 0) { + ivar3 = script_4959(ivar1); + } + script_4988(bitconfig_9550); + script_4937(); + } + return; +} diff --git a/dumps/scripts/4997.cs2 b/dumps/scripts/4997.cs2 new file mode 100644 index 000000000..8fc9018da --- /dev/null +++ b/dumps/scripts/4997.cs2 @@ -0,0 +1,6 @@ +void script_4997() { + script_5001(); + setWidgetIsHidden(false, new WidgetPointer(1092,232)); + setWidgetIsHidden(false, new WidgetPointer(1092,507)); + return; +} diff --git a/dumps/scripts/4998.cs2 b/dumps/scripts/4998.cs2 new file mode 100644 index 000000000..672b158bb --- /dev/null +++ b/dumps/scripts/4998.cs2 @@ -0,0 +1,6 @@ +void script_4998() { + script_5001(); + setWidgetIsHidden(false, new WidgetPointer(1092,234)); + setWidgetIsHidden(false, new WidgetPointer(1092,602)); + return; +} diff --git a/dumps/scripts/4999.cs2 b/dumps/scripts/4999.cs2 new file mode 100644 index 000000000..b29f1b1ff --- /dev/null +++ b/dumps/scripts/4999.cs2 @@ -0,0 +1,6 @@ +void script_4999() { + script_5001(); + setWidgetIsHidden(false, new WidgetPointer(1092,236)); + setWidgetIsHidden(false, new WidgetPointer(1092,652)); + return; +} diff --git a/dumps/scripts/5.cs2 b/dumps/scripts/5.cs2 new file mode 100644 index 000000000..4b2f5f6f2 --- /dev/null +++ b/dumps/scripts/5.cs2 @@ -0,0 +1,16 @@ +void script_5() { + int ivar0; + int ivar1; + ivar0 = 30; + if (((boolean)bitconfig_6840)) { + ivar0 = 20; + } + ivar1 = 0; + while (ivar1 < ivar0) { + if ((setWidgetRegister(new WidgetPointer(271,7), ivar1) && ((boolean)script_2297(ivar1))) && ((boolean)script_2295(ivar1))) { + setWidgetSprite(155); + } + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/50.cs2 b/dumps/scripts/50.cs2 new file mode 100644 index 000000000..27baf0069 --- /dev/null +++ b/dumps/scripts/50.cs2 @@ -0,0 +1,4 @@ +void script_50() { + script_2303(); + return; +} diff --git a/dumps/scripts/500.cs2 b/dumps/scripts/500.cs2 new file mode 100644 index 000000000..369e569cd --- /dev/null +++ b/dumps/scripts/500.cs2 @@ -0,0 +1,4 @@ +void script_500() { + setWidgetIsHidden(true, new WidgetPointer(1012,20)); + return; +} diff --git a/dumps/scripts/5000.cs2 b/dumps/scripts/5000.cs2 new file mode 100644 index 000000000..ecd658b1f --- /dev/null +++ b/dumps/scripts/5000.cs2 @@ -0,0 +1,6 @@ +void script_5000() { + script_5001(); + setWidgetIsHidden(false, new WidgetPointer(1092,238)); + setWidgetIsHidden(false, new WidgetPointer(1092,702)); + return; +} diff --git a/dumps/scripts/5001.cs2 b/dumps/scripts/5001.cs2 new file mode 100644 index 000000000..ea1958692 --- /dev/null +++ b/dumps/scripts/5001.cs2 @@ -0,0 +1,11 @@ +void script_5001() { + setWidgetIsHidden(true, new WidgetPointer(1092,232)); + setWidgetIsHidden(true, new WidgetPointer(1092,507)); + setWidgetIsHidden(true, new WidgetPointer(1092,234)); + setWidgetIsHidden(true, new WidgetPointer(1092,602)); + setWidgetIsHidden(true, new WidgetPointer(1092,236)); + setWidgetIsHidden(true, new WidgetPointer(1092,652)); + setWidgetIsHidden(true, new WidgetPointer(1092,238)); + setWidgetIsHidden(true, new WidgetPointer(1092,702)); + return; +} diff --git a/dumps/scripts/5002.cs2 b/dumps/scripts/5002.cs2 new file mode 100644 index 000000000..02073a978 --- /dev/null +++ b/dumps/scripts/5002.cs2 @@ -0,0 +1,56 @@ +void script_5002(int arg0) { + int ivar1; + int ivar2; + script_4408(arg0); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 3, 0); + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(0, 0, 1, 1); + setWidgetRGB(new Color(85, 51, 51)); + setWidgetFilled(1); + cs2method2103(155); + createExtraChild(new WidgetPointer(arg0), 3, 1); + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(0, 0, 1, 1); + setWidgetRGB(new Color(238, 204, 238)); + createExtraChild(new WidgetPointer(arg0), 5, 2); + setWidgetSize(18, 18, 0, 0); + setWidgetPosition(0, 0, 1, 1); + ivar1 = script_4964(arg0); + ivar2 = 0; + if (citadelConfigsInitialized()) { + ivar2 = script_4949(ivar1); + switch (ivar2) { + case 17: + setWidgetSprite(7431); + break; + case 18: + setWidgetSprite(7430); + break; + case 19: + setWidgetSprite(7433); + break; + case 1: + setWidgetSprite(7422); + break; + case 2: + setWidgetSprite(7423); + break; + case 3: + setWidgetSprite(7424); + break; + case 4: + setWidgetSprite(7425); + break; + case 5: + setWidgetSprite(7426); + break; + case 6: + setWidgetSprite(7427); + break; + case 7: + setWidgetSprite(7428); + } + } + return; +} diff --git a/dumps/scripts/5003.cs2 b/dumps/scripts/5003.cs2 new file mode 100644 index 000000000..af2ce8124 --- /dev/null +++ b/dumps/scripts/5003.cs2 @@ -0,0 +1,4 @@ +void script_5003() { + setWidgetIsHidden(true, new WidgetPointer(908,36)); + return; +} diff --git a/dumps/scripts/5004.cs2 b/dumps/scripts/5004.cs2 new file mode 100644 index 000000000..ee01d8b8f --- /dev/null +++ b/dumps/scripts/5004.cs2 @@ -0,0 +1,14 @@ +void script_5004() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (citadelConfigsInitialized()) { + ivar0 = script_4948(bitconfig_9550); + ivar1 = script_4978(ivar0); + if ((ivar1 == ivar0) || (ivar1 <= 0)) { + script_4899(3); + } + } + return; +} diff --git a/dumps/scripts/5005.cs2 b/dumps/scripts/5005.cs2 new file mode 100644 index 000000000..e4bd36819 --- /dev/null +++ b/dumps/scripts/5005.cs2 @@ -0,0 +1,28 @@ +void script_5005() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar0 = bitconfig_9550; + ivar1 = ivar0; + ivar2 = 1; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 100; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/5006.cs2 b/dumps/scripts/5006.cs2 new file mode 100644 index 000000000..e89718ae5 --- /dev/null +++ b/dumps/scripts/5006.cs2 @@ -0,0 +1,28 @@ +void script_5006() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar0 = bitconfig_9550; + ivar1 = ivar0; + ivar2 = 1; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 100; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/5007.cs2 b/dumps/scripts/5007.cs2 new file mode 100644 index 000000000..0655acf9b --- /dev/null +++ b/dumps/scripts/5007.cs2 @@ -0,0 +1,27 @@ +void script_5007() { + setWidgetText(new WidgetPointer(1092,477), intToStr(0)); + setWidgetText(new WidgetPointer(1092,484), intToStr(0)); + setWidgetText(new WidgetPointer(1092,491), intToStr(0)); + setWidgetText(new WidgetPointer(1092,498), intToStr(0)); + setWidgetText(new WidgetPointer(1092,505), intToStr(0)); + setWidgetText(new WidgetPointer(1092,513), intToStr(0)); + setWidgetText(new WidgetPointer(1092,610), intToStr(0)); + setWidgetText(new WidgetPointer(1092,618), intToStr(0)); + setWidgetText(new WidgetPointer(1092,626), intToStr(0)); + setWidgetText(new WidgetPointer(1092,634), intToStr(0)); + setWidgetText(new WidgetPointer(1092,644), intToStr(0)); + setWidgetText(new WidgetPointer(1092,651), intToStr(0)); + setWidgetText(new WidgetPointer(1092,660), intToStr(0)); + setWidgetText(new WidgetPointer(1092,668), intToStr(0)); + setWidgetText(new WidgetPointer(1092,676), intToStr(0)); + setWidgetText(new WidgetPointer(1092,684), intToStr(0)); + setWidgetText(new WidgetPointer(1092,694), intToStr(0)); + setWidgetText(new WidgetPointer(1092,701), intToStr(0)); + setWidgetText(new WidgetPointer(1092,295), ""); + setWidgetText(new WidgetPointer(1092,239), ""); + setWidgetIsHidden(false, new WidgetPointer(1092,903)); + setWidgetIsHidden(false, new WidgetPointer(1092,915)); + setWidgetIsHidden(false, new WidgetPointer(1092,879)); + setWidgetIsHidden(false, new WidgetPointer(1092,891)); + return; +} diff --git a/dumps/scripts/5008.cs2 b/dumps/scripts/5008.cs2 new file mode 100644 index 000000000..54940b0e4 --- /dev/null +++ b/dumps/scripts/5008.cs2 @@ -0,0 +1,25 @@ +int script_5008() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = -1; + ivar1 = -1; + ivar2 = 0; + if (cs2method3701()) { + ivar0 = cs2method3717(cs2method5020()); + if (ivar0 < 0) { + return 0; + } + ivar1 = cs2method3711(ivar0); + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return 0; +} diff --git a/dumps/scripts/5009.cs2 b/dumps/scripts/5009.cs2 new file mode 100644 index 000000000..217c3d770 --- /dev/null +++ b/dumps/scripts/5009.cs2 @@ -0,0 +1,18 @@ +void script_5009() { + script_4407(71566682, 1, 180); + script_4407(71566675, 1, 180); + script_4407(71566668, 1, 180); + script_4407(71566584, 1, 180); + script_4407(71566591, 1, 180); + script_4407(71566598, 1, 180); + script_4407(71566605, 1, 180); + script_4407(71566612, 1, 180); + script_4407(71566619, 1, 180); + script_4407(71566626, 1, 180); + script_4407(71566633, 1, 180); + script_4407(71566640, 1, 180); + script_4407(71566647, 1, 180); + script_4407(71566654, 1, 180); + script_4407(71566661, 1, 180); + return; +} diff --git a/dumps/scripts/501.cs2 b/dumps/scripts/501.cs2 new file mode 100644 index 000000000..58ce38eed --- /dev/null +++ b/dumps/scripts/501.cs2 @@ -0,0 +1,8 @@ +void script_501(int arg0) { + if (((boolean)arg0)) { + setWidgetIsHidden(false, new WidgetPointer(1012,7)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1012,7)); + } + return; +} diff --git a/dumps/scripts/5010.cs2 b/dumps/scripts/5010.cs2 new file mode 100644 index 000000000..b3acac8c2 --- /dev/null +++ b/dumps/scripts/5010.cs2 @@ -0,0 +1,15 @@ +void script_5010() { + script_4407(71566584, 1, 178); + script_4407(71566591, 1, 178); + script_4407(71566598, 1, 178); + script_4407(71566605, 1, 178); + script_4407(71566612, 1, 178); + script_4407(71566619, 1, 178); + script_4407(71566626, 1, 178); + script_4407(71566633, 1, 178); + script_4407(71566640, 1, 178); + script_4407(71566647, 1, 178); + script_4407(71566654, 1, 178); + script_4407(71566661, 1, 178); + return; +} diff --git a/dumps/scripts/5011.cs2 b/dumps/scripts/5011.cs2 new file mode 100644 index 000000000..e9a9f3d83 --- /dev/null +++ b/dumps/scripts/5011.cs2 @@ -0,0 +1,13 @@ +void script_5011() { + script_4407(71566050, 1, 180); + script_4407(71566061, 1, 180); + script_4407(71566072, 1, 180); + script_4407(71566083, 1, 180); + script_4407(71566094, 1, 180); + script_4407(71566105, 1, 180); + script_4407(71566116, 1, 180); + script_4407(71566127, 1, 180); + script_4407(71566150, 1, 180); + script_4407(71566138, 1, 180); + return; +} diff --git a/dumps/scripts/5012.cs2 b/dumps/scripts/5012.cs2 new file mode 100644 index 000000000..02d5c5c7c --- /dev/null +++ b/dumps/scripts/5012.cs2 @@ -0,0 +1,6 @@ +void script_5012() { + script_5015(); + script_5014(); + script_5227(); + return; +} diff --git a/dumps/scripts/5013.cs2 b/dumps/scripts/5013.cs2 new file mode 100644 index 000000000..afa482f71 --- /dev/null +++ b/dumps/scripts/5013.cs2 @@ -0,0 +1,20 @@ +void script_5013() { + setWidgetIsHidden(true, new WidgetPointer(1092,196)); + setWidgetIsHidden(true, new WidgetPointer(1092,917)); + setWidgetIsHidden(true, new WidgetPointer(1092,918)); + setWidgetIsHidden(true, new WidgetPointer(1092,919)); + setWidgetIsHidden(true, new WidgetPointer(1092,920)); + setWidgetIsHidden(true, new WidgetPointer(1092,921)); + setWidgetIsHidden(true, new WidgetPointer(1092,922)); + setWidgetIsHidden(true, new WidgetPointer(1092,923)); + setWidgetIsHidden(true, new WidgetPointer(1092,924)); + setWidgetIsHidden(true, new WidgetPointer(1092,925)); + setWidgetIsHidden(true, new WidgetPointer(1092,926)); + setWidgetIsHidden(true, new WidgetPointer(1092,927)); + setWidgetIsHidden(true, new WidgetPointer(1092,928)); + setWidgetIsHidden(true, new WidgetPointer(1092,929)); + setWidgetIsHidden(true, new WidgetPointer(1092,930)); + setWidgetIsHidden(true, new WidgetPointer(1092,932)); + setWidgetIsHidden(true, new WidgetPointer(1092,931)); + return; +} diff --git a/dumps/scripts/5014.cs2 b/dumps/scripts/5014.cs2 new file mode 100644 index 000000000..a5d55bc45 --- /dev/null +++ b/dumps/scripts/5014.cs2 @@ -0,0 +1,125 @@ +void script_5014() { + script_5013(); + setWidgetIsHidden(false, new WidgetPointer(1092,928)); + setWidgetIsHidden(false, new WidgetPointer(1092,929)); + setWidgetIsHidden(false, new WidgetPointer(1092,930)); + setWidgetIsHidden(false, new WidgetPointer(1092,932)); + setWidgetIsHidden(false, new WidgetPointer(1092,931)); + if ((script_4949(4) > 0) && (script_4959(4) > 0)) { + setWidgetIsHidden(false, new WidgetPointer(1092,196)); + } + if ((script_4949(5) > 0) && (script_4959(5) > 0)) { + setWidgetIsHidden(false, new WidgetPointer(1092,917)); + } + if (script_4949(6) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (script_4949(7) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (script_4949(8) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (script_4949(9) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (script_4949(10) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (script_4949(11) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (script_4949(12) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (script_4949(13) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (script_4949(14) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (script_4949(15) > 0) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/5015.cs2 b/dumps/scripts/5015.cs2 new file mode 100644 index 000000000..47c62ade5 --- /dev/null +++ b/dumps/scripts/5015.cs2 @@ -0,0 +1,20 @@ +void script_5015() { + script_5016(102); + script_5016(103); + script_5016(100); + script_5016(101); + script_5016(3); + script_5016(4); + script_5016(5); + script_5016(6); + script_5016(7); + script_5016(8); + script_5016(9); + script_5016(10); + script_5016(11); + script_5016(12); + script_5016(13); + script_5016(14); + script_5016(15); + return; +} diff --git a/dumps/scripts/5016.cs2 b/dumps/scripts/5016.cs2 new file mode 100644 index 000000000..6bd7019d1 --- /dev/null +++ b/dumps/scripts/5016.cs2 @@ -0,0 +1,24 @@ +void script_5016(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar1 = -1; + ivar2 = 0; + ivar3 = script_4969(arg0); + ivar4 = -1; + ivar5 = -1; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return; +} diff --git a/dumps/scripts/5017.cs2 b/dumps/scripts/5017.cs2 new file mode 100644 index 000000000..498163bd7 --- /dev/null +++ b/dumps/scripts/5017.cs2 @@ -0,0 +1,12 @@ +void script_5017(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + setWidgetSprite(arg3, new WidgetPointer(arg1)); + if (arg6 >= 5) { + setWidgetRGB(new Color(getColorRelatedMethod4020(arg4)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(arg5)), new WidgetPointer(arg1)); + } else { + setWidgetRGB(new Color(getColorRelatedMethod4020(6716)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(6716)), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/5018.cs2 b/dumps/scripts/5018.cs2 new file mode 100644 index 000000000..d1cbd37fc --- /dev/null +++ b/dumps/scripts/5018.cs2 @@ -0,0 +1,10 @@ +void script_5018(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (arg4 >= 5) { + setWidgetRGB(new Color(getColorRelatedMethod4020(arg2)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(arg3)), new WidgetPointer(arg1)); + } else { + setWidgetRGB(new Color(getColorRelatedMethod4020(42550)), new WidgetPointer(arg0)); + setWidgetRGB(new Color(getColorRelatedMethod4020(39382)), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/5019.cs2 b/dumps/scripts/5019.cs2 new file mode 100644 index 000000000..6a67ca92c --- /dev/null +++ b/dumps/scripts/5019.cs2 @@ -0,0 +1,2007 @@ +cs2func_script_5019_struct(4,0,0) script_5019(int arg0) { + switch (arg0) { + case 0: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 13: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 14: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 15: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 16: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 17: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 18: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 19: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 20: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 21: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 22: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 23: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 24: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 25: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 26: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 27: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 28: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 29: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 30: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 31: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 32: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 33: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 34: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 35: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 36: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 37: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 38: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 39: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 40: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 41: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 42: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 43: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 44: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 45: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 46: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 47: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 48: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 49: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 50: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 51: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 52: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 53: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 54: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 55: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 56: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 57: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 58: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 59: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 60: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 61: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 62: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 63: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 64: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 65: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 66: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 67: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 68: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 69: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 70: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 71: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 72: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 73: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 74: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 75: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 76: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 77: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 78: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 79: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 80: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 81: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 82: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 83: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 84: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 85: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 86: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 87: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 88: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 89: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 90: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 91: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 92: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 93: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 94: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 95: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 96: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 97: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 98: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 99: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 100: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 101: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 102: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 103: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 104: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 105: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 106: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 107: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 108: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 109: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 110: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 111: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 112: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 113: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 114: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 115: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 116: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 117: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 118: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 119: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 120: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 121: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 122: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 123: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 124: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 125: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 126: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 127: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 128: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 129: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 130: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 131: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 132: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 133: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 134: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 135: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 136: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 137: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 138: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 139: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 140: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 141: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 142: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 143: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 144: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 145: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 146: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 147: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 148: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 149: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 150: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 151: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 152: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 153: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 154: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 155: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 156: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 157: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 158: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 159: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 160: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 161: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 162: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 163: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 164: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 165: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 166: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 167: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 168: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 169: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 170: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 171: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 172: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 173: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 174: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 175: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 176: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 177: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 178: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 179: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 180: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 181: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 182: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 183: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 184: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 185: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 186: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 187: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 188: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 189: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 190: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 191: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 192: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 193: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 194: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 195: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 196: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 197: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 198: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 199: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 200: + return newstruct cs2func_script_5019_struct(0, -1, -1, -1); + } + return newstruct cs2func_script_5019_struct(0, -1, -1, -1); +} diff --git a/dumps/scripts/502.cs2 b/dumps/scripts/502.cs2 new file mode 100644 index 000000000..ced36c7ec --- /dev/null +++ b/dumps/scripts/502.cs2 @@ -0,0 +1,160 @@ +void script_502(int arg0,int arg1) { + flow_0: + if ((arg0 == 66650268) && ((boolean)bitconfig_7520)) { + return; + } + if ((arg0 == 66650269) && ((boolean)bitconfig_7521)) { + return; + } + if ((arg0 == 66650270) && ((boolean)bitconfig_7526)) { + return; + } + if ((arg0 == 66650271) && ((boolean)bitconfig_7527)) { + return; + } + if ((arg0 == 66650272) && ((boolean)bitconfig_7530)) { + return; + } + if ((arg0 == 66650273) && ((boolean)bitconfig_7531)) { + return; + } + if ((arg0 == 66650274) && ((boolean)bitconfig_7532)) { + return; + } + if ((arg0 == 66650275) && ((boolean)bitconfig_7533)) { + return; + } + if ((arg0 == 66650276) && ((boolean)bitconfig_7534)) { + return; + } + if ((arg0 == 66650277) && ((boolean)bitconfig_7535)) { + return; + } + SWITCH (arg1) { + case 66650279: + GOTO flow_31 + case 66650278: + GOTO flow_31 + case 66650281: + GOTO flow_31 + case 66650280: + GOTO flow_31 + case 66650283: + GOTO flow_31 + case 66650282: + GOTO flow_31 + case 66650285: + GOTO flow_31 + case 66650284: + GOTO flow_31 + case 66650287: + GOTO flow_31 + case 66650286: + GOTO flow_31 + case 66650288: + GOTO flow_31 + case 66650289: + GOTO flow_31 + case 66650290: + GOTO flow_31 + case 66650291: + GOTO flow_31 + case 66650292: + GOTO flow_31 + case 66650293: + GOTO flow_31 + case 66650294: + GOTO flow_31 + case 66650295: + GOTO flow_31 + case 66650296: + GOTO flow_31 + case 66650297: + GOTO flow_31 + case 66650298: + GOTO flow_31 + case 66650299: + GOTO flow_31 + case 66650300: + GOTO flow_31 + case 66650301: + GOTO flow_31 + case 66650302: + GOTO flow_31 + case 66650303: + GOTO flow_31 + case 66650337: + GOTO flow_31 + case 66650336: + GOTO flow_31 + case 66650311: + GOTO flow_31 + case 66650310: + GOTO flow_31 + case 66650309: + GOTO flow_31 + case 66650308: + GOTO flow_31 + case 66650307: + GOTO flow_31 + case 66650306: + GOTO flow_31 + case 66650305: + GOTO flow_31 + case 66650304: + GOTO flow_31 + case 66650319: + GOTO flow_31 + case 66650318: + GOTO flow_31 + case 66650317: + GOTO flow_31 + case 66650316: + GOTO flow_31 + case 66650315: + GOTO flow_31 + case 66650314: + GOTO flow_31 + case 66650313: + GOTO flow_31 + case 66650312: + GOTO flow_31 + case 66650326: + GOTO flow_31 + case 66650327: + GOTO flow_31 + case 66650324: + GOTO flow_31 + case 66650325: + GOTO flow_31 + case 66650322: + GOTO flow_31 + case 66650323: + GOTO flow_31 + case 66650320: + GOTO flow_31 + case 66650321: + GOTO flow_31 + case 66650334: + GOTO flow_31 + case 66650335: + GOTO flow_31 + case 66650332: + GOTO flow_31 + case 66650333: + GOTO flow_31 + case 66650330: + GOTO flow_31 + case 66650331: + GOTO flow_31 + case 66650328: + GOTO flow_31 + case 66650329: + GOTO flow_31 + } + return; + flow_31: + setWidgetIsHidden(true, new WidgetPointer(arg0)); + globalint_1387 = 1; + return; +} diff --git a/dumps/scripts/5020.cs2 b/dumps/scripts/5020.cs2 new file mode 100644 index 000000000..6f03d5834 --- /dev/null +++ b/dumps/scripts/5020.cs2 @@ -0,0 +1,3 @@ +int script_5020(int arg0) { + return max(bitAnd(arg0, 127), 1); +} diff --git a/dumps/scripts/5021.cs2 b/dumps/scripts/5021.cs2 new file mode 100644 index 000000000..0ccb98f1b --- /dev/null +++ b/dumps/scripts/5021.cs2 @@ -0,0 +1,3 @@ +int script_5021(int arg0) { + return max(bitAnd(divide(arg0, pow(2, 7)), 127), 1); +} diff --git a/dumps/scripts/5022.cs2 b/dumps/scripts/5022.cs2 new file mode 100644 index 000000000..63fba8035 --- /dev/null +++ b/dumps/scripts/5022.cs2 @@ -0,0 +1,3 @@ +int script_5022(int arg0) { + return divide(arg0, pow(2, 14)); +} diff --git a/dumps/scripts/5023.cs2 b/dumps/scripts/5023.cs2 new file mode 100644 index 000000000..8f8d2ae11 --- /dev/null +++ b/dumps/scripts/5023.cs2 @@ -0,0 +1,3 @@ +int script_5023(int arg0) { + return bitAnd(arg0, 255); +} diff --git a/dumps/scripts/5024.cs2 b/dumps/scripts/5024.cs2 new file mode 100644 index 000000000..436239b86 --- /dev/null +++ b/dumps/scripts/5024.cs2 @@ -0,0 +1,3 @@ +int script_5024(int arg0) { + return bitAnd(divide(arg0, pow(2, 8)), 63); +} diff --git a/dumps/scripts/5025.cs2 b/dumps/scripts/5025.cs2 new file mode 100644 index 000000000..066658b57 --- /dev/null +++ b/dumps/scripts/5025.cs2 @@ -0,0 +1,3 @@ +int script_5025(int arg0) { + return divide(arg0, pow(2, 14)); +} diff --git a/dumps/scripts/5026.cs2 b/dumps/scripts/5026.cs2 new file mode 100644 index 000000000..e67fb2b63 --- /dev/null +++ b/dumps/scripts/5026.cs2 @@ -0,0 +1,3 @@ +int script_5026(int arg0) { + return bitAnd(arg0, 255); +} diff --git a/dumps/scripts/5027.cs2 b/dumps/scripts/5027.cs2 new file mode 100644 index 000000000..f18199e24 --- /dev/null +++ b/dumps/scripts/5027.cs2 @@ -0,0 +1,3 @@ +int script_5027(int arg0) { + return bitAnd(divide(arg0, pow(2, 8)), 31); +} diff --git a/dumps/scripts/5028.cs2 b/dumps/scripts/5028.cs2 new file mode 100644 index 000000000..57f99cf1d --- /dev/null +++ b/dumps/scripts/5028.cs2 @@ -0,0 +1,3 @@ +int script_5028(int arg0) { + return divide(arg0, pow(2, 13)); +} diff --git a/dumps/scripts/5029.cs2 b/dumps/scripts/5029.cs2 new file mode 100644 index 000000000..91b2712cf --- /dev/null +++ b/dumps/scripts/5029.cs2 @@ -0,0 +1,3 @@ +int script_5029(int arg0) { + return bitAnd(arg0, 255); +} diff --git a/dumps/scripts/503.cs2 b/dumps/scripts/503.cs2 new file mode 100644 index 000000000..461a8bf4c --- /dev/null +++ b/dumps/scripts/503.cs2 @@ -0,0 +1,53 @@ +void script_503() { + if (((boolean)bitconfig_7516)) { + setWidgetIsHidden(false, new WidgetPointer(1017,156)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,156)); + } + if (((boolean)bitconfig_7517)) { + setWidgetIsHidden(false, new WidgetPointer(1017,157)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,157)); + } + if (((boolean)bitconfig_7518)) { + setWidgetIsHidden(false, new WidgetPointer(1017,158)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,158)); + } + if (((boolean)bitconfig_7519)) { + setWidgetIsHidden(false, new WidgetPointer(1017,159)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,159)); + } + if (((boolean)bitconfig_7522)) { + setWidgetIsHidden(false, new WidgetPointer(1017,160)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,160)); + } + if (((boolean)bitconfig_7523)) { + setWidgetIsHidden(false, new WidgetPointer(1017,161)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,161)); + } + if (((boolean)bitconfig_7524)) { + setWidgetIsHidden(false, new WidgetPointer(1017,162)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,162)); + } + if (((boolean)bitconfig_7525)) { + setWidgetIsHidden(false, new WidgetPointer(1017,163)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,163)); + } + if (((boolean)bitconfig_7528)) { + setWidgetIsHidden(false, new WidgetPointer(1017,164)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,164)); + } + if (((boolean)bitconfig_7529)) { + setWidgetIsHidden(false, new WidgetPointer(1017,165)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1017,165)); + } + return; +} diff --git a/dumps/scripts/5030.cs2 b/dumps/scripts/5030.cs2 new file mode 100644 index 000000000..1d12a68d5 --- /dev/null +++ b/dumps/scripts/5030.cs2 @@ -0,0 +1,3 @@ +int script_5030(int arg0) { + return bitAnd(divide(arg0, pow(2, 8)), 63); +} diff --git a/dumps/scripts/5031.cs2 b/dumps/scripts/5031.cs2 new file mode 100644 index 000000000..7d901adf3 --- /dev/null +++ b/dumps/scripts/5031.cs2 @@ -0,0 +1,3 @@ +int script_5031(int arg0) { + return bitAnd(arg0, 255); +} diff --git a/dumps/scripts/5032.cs2 b/dumps/scripts/5032.cs2 new file mode 100644 index 000000000..095906b96 --- /dev/null +++ b/dumps/scripts/5032.cs2 @@ -0,0 +1,3 @@ +int script_5032(int arg0) { + return bitAnd(divide(arg0, pow(2, 8)), 15); +} diff --git a/dumps/scripts/5033.cs2 b/dumps/scripts/5033.cs2 new file mode 100644 index 000000000..65cef3cd2 --- /dev/null +++ b/dumps/scripts/5033.cs2 @@ -0,0 +1,3 @@ +int script_5033(int arg0) { + return divide(arg0, pow(2, 12)); +} diff --git a/dumps/scripts/5034.cs2 b/dumps/scripts/5034.cs2 new file mode 100644 index 000000000..6942bbd0e --- /dev/null +++ b/dumps/scripts/5034.cs2 @@ -0,0 +1,3 @@ +int script_5034(int arg0) { + return bitAnd(arg0, 63); +} diff --git a/dumps/scripts/5035.cs2 b/dumps/scripts/5035.cs2 new file mode 100644 index 000000000..ddb85baa5 --- /dev/null +++ b/dumps/scripts/5035.cs2 @@ -0,0 +1,3 @@ +int script_5035(int arg0) { + return bitAnd(divide(arg0, pow(2, 6)), 15); +} diff --git a/dumps/scripts/5036.cs2 b/dumps/scripts/5036.cs2 new file mode 100644 index 000000000..16d0493b5 --- /dev/null +++ b/dumps/scripts/5036.cs2 @@ -0,0 +1,3 @@ +int script_5036(int arg0) { + return divide(arg0, pow(2, 10)); +} diff --git a/dumps/scripts/5037.cs2 b/dumps/scripts/5037.cs2 new file mode 100644 index 000000000..190ec257c --- /dev/null +++ b/dumps/scripts/5037.cs2 @@ -0,0 +1,112 @@ +void script_5037(int arg0) { + int ivar1; + int ivar2; + setWidgetIsHidden(false, new WidgetPointer(1111,9)); + setWidgetIsHidden(true, new WidgetPointer(1111,1)); + script_4510(72810501, 1736); + script_4510(72810502, 1737); + script_4211(72810504, 4040, 15458492, 5918266); + setScriptCallOnCitadelConfigChange(5039, "", new WidgetPointer(arg0)); + setScriptCallOnMouseScroll(5042, new WidgetPointer(arg0), -2147483646, "Ii", new WidgetPointer(1111,15)); + setScriptCallOnClickContextMenu(5042, new WidgetPointer(arg0), 1, "Ii", new WidgetPointer(1111,46)); + setScriptCallOnClickContextMenu(5042, new WidgetPointer(arg0), -1, "Ii", new WidgetPointer(1111,53)); + setScriptCallOnMouseDragReleased(5043, new WidgetPointer(arg0), new WidgetPointer(-32768,3), -2147483647, "IIi", new WidgetPointer(1111,51)); + ivar1 = 0; + ivar2 = pow(112, 2); + while (ivar1 < ivar2) { + createExtraChild(new WidgetPointer(1111,16), 3, ivar1); + setWidgetRGB(new Color(31, 31, 38)); + setWidgetFilled(1); + setWidgetContextMenuOption(1, "Set"); + setWidgetContextMenuOption(10, "Teleport"); + cs2method1304(5); + cs2method1302(2); + setScriptCallOnMouseDragged(5054, -2147483647, -2147483646, "ii"); + ivar1 = add(ivar1, 1); + } + script_5040(); + createExtraChild(new WidgetPointer(1111,19), 5, 0); + createExtraChild(new WidgetPointer(1111,20), 5, 0); + setWidgetPosition(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(0, 32, 1, 1); + setWidgetSize(32, 0, 1, 1); + setWidgetSprite(5666); + setWidgetSprite(7605); + cs2method1107(1); + cs2method1107(1); + setScriptCallOnMousePressed(5052, new WidgetPointer(-32768,3), 1, "I1"); + setScriptCallOnMousePressed(5052, new WidgetPointer(-32768,3), 0, "I1"); + createExtraChild(new WidgetPointer(1111,19), 5, 1); + createExtraChild(new WidgetPointer(1111,20), 5, 1); + setWidgetPosition(0, 0, 1, 0); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(0, 16, 1, 0); + setWidgetSize(16, 0, 0, 1); + setWidgetSprite(5686); + setWidgetSprite(5686); + cs2method1106(16384); + setScriptCallOnMouseDraggedOver(5049, -4, 1, 1, "ii1"); + setScriptCallOnMouseDraggedOver(5049, -4, 1, 0, "ii1"); + createExtraChild(new WidgetPointer(1111,19), 5, 2); + createExtraChild(new WidgetPointer(1111,20), 5, 2); + setWidgetPosition(0, 0, 1, 2); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(0, 16, 1, 0); + setWidgetSize(16, 0, 0, 1); + setWidgetSprite(5685); + setWidgetSprite(5685); + cs2method1106(16384); + setScriptCallOnMouseDraggedOver(5049, 4, 1, 1, "ii1"); + setScriptCallOnMouseDraggedOver(5049, 4, 1, 0, "ii1"); + createExtraChild(new WidgetPointer(1111,19), 5, 3); + createExtraChild(new WidgetPointer(1111,20), 5, 3); + setWidgetSprite(5664); + setWidgetSprite(7603); + cs2method1107(1); + cs2method1107(1); + cs2method1301(72810515, 0); + cs2method1301(72810516, 0); + cs2method1302(1); + cs2method1302(1); + setScriptCallOnMouseDragged(5051, new WidgetPointer(-32768,3), -2147483646, 0, 1, "Ii11"); + setScriptCallOnMouseDragged(5051, new WidgetPointer(-32768,3), -2147483647, 0, 0, "Ii11"); + setScriptCallOnMouseDragReleased(5051, new WidgetPointer(-32768,3), -2147483646, 1, 1, "Ii11"); + setScriptCallOnMouseDragReleased(5051, new WidgetPointer(-32768,3), -2147483647, 1, 0, "Ii11"); + createExtraChild(new WidgetPointer(1111,19), 5, 4); + createExtraChild(new WidgetPointer(1111,20), 5, 4); + setWidgetSize(0, 5, 1, 0); + setWidgetSize(5, 0, 0, 1); + setWidgetSprite(5663); + setWidgetSprite(7602); + createExtraChild(new WidgetPointer(1111,19), 5, 5); + createExtraChild(new WidgetPointer(1111,20), 5, 5); + setWidgetSize(0, 5, 1, 0); + setWidgetSize(5, 0, 0, 1); + setWidgetSprite(5665); + setWidgetSprite(7604); + setScriptCallOnMouseScroll(5049, -2147483646, 20, 1, "ii1", new WidgetPointer(1111,19)); + setScriptCallOnMouseScroll(5049, -2147483646, 20, 0, "ii1", new WidgetPointer(1111,20)); + createExtraChild(new WidgetPointer(1111,15), 3, 0); + setWidgetFilled(0); + setWidgetHidden(1); + setScriptCallOnGameloop(5074, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), "Ii", new WidgetPointer(1111,15)); + setScriptCallOnGlobalConfigChange(5074, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 1065, 1, "IiY", new WidgetPointer(1111,15)); + setScriptCallOnClickContextMenu(5075, new WidgetPointer(1111,15), getWidgetCustomChildArrayIndex(), "Ii", new WidgetPointer(1111,54)); + if ((globalint_1396 < 3) || (globalint_1396 > 21)) { + globalint_1396 = add(3, divide(subtract(21, 3), 4)); + } + script_5047(globalint_1396, 0, 112, 0, 0); + script_5048(); + script_5073(1); + script_5055(1, 3944, 72810564, 72810553, 72810554, "Architecture"); + script_5055(2, 3945, 72810565, 72810556, 72810557, "Toys"); + script_5055(3, 3946, 72810566, 72810559, 72810560, "Hazards"); + script_5055(4, 3947, 72810567, 72810562, 72810563, "Monsters"); + globalint_768 = 1; + script_5065(1); + setScriptCallOnConfigChange(5066, 1736, 1, "Y", new WidgetPointer(arg0)); + script_5067(); + script_5076(72810511, 0); + return; +} diff --git a/dumps/scripts/5038.cs2 b/dumps/scripts/5038.cs2 new file mode 100644 index 000000000..0f1bedb56 --- /dev/null +++ b/dumps/scripts/5038.cs2 @@ -0,0 +1,11 @@ +void script_5038(int arg0) { + playSoundEffect2False(6185, 1, 0, 200); + if (((boolean)arg0)) { + setWidgetIsHidden(true, new WidgetPointer(1111,9)); + setWidgetIsHidden(false, new WidgetPointer(1111,1)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1111,9)); + setWidgetIsHidden(true, new WidgetPointer(1111,1)); + } + return; +} diff --git a/dumps/scripts/5039.cs2 b/dumps/scripts/5039.cs2 new file mode 100644 index 000000000..a17f2c528 --- /dev/null +++ b/dumps/scripts/5039.cs2 @@ -0,0 +1,5 @@ +void script_5039() { + script_5040(); + script_5048(); + return; +} diff --git a/dumps/scripts/504.cs2 b/dumps/scripts/504.cs2 new file mode 100644 index 000000000..7ddb5d966 --- /dev/null +++ b/dumps/scripts/504.cs2 @@ -0,0 +1,6 @@ +void script_504() { + script_505(); + script_1371(); + script_1381(); + return; +} diff --git a/dumps/scripts/5040.cs2 b/dumps/scripts/5040.cs2 new file mode 100644 index 000000000..a558a747a --- /dev/null +++ b/dumps/scripts/5040.cs2 @@ -0,0 +1,53 @@ +void script_5040() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int stack_dump0; + cs2func_script_5019_struct(4,0,0) structdump_1; + deleteAllExtraChilds(new WidgetPointer(1111,18)); + ivar0 = 0; + ivar1 = 0; + ivar2 = -1; + ivar3 = -1; + ivar4 = -1; + ivar5 = -1; + ivar6 = 200; + if (citadelConfigsInitialized()) { + while (ivar0 < 200) { + createExtraChild(new WidgetPointer(1111,18), 5, ivar0); + stack_dump0 = ivar0; + structdump_1 = script_5019(stack_dump0); + ivar5 = structdump_1.intpart_3; + ivar4 = structdump_1.intpart_2; + ivar3 = structdump_1.intpart_1; + ivar1 = structdump_1.intpart_0; + if (ivar1 != 0) { + ivar2 = cs2method_3408(105, 74, 3943, ivar1); + if (ivar2 != -1) { + setWidgetSprite(getOtherCommonData(ivar2, 1465)); + if (((boolean)getOtherCommonData(ivar2, 1466))) { + cs2method1107(1); + } else { + cs2method1107(0); + } + script_5041(ivar2, ivar3, ivar4, ivar5); + ivar6 = subtract(ivar6, 1); + } else { + setWidgetHidden(1); + } + } else { + setWidgetHidden(1); + } + ivar0 = add(ivar0, 1); + } + setWidgetText(new WidgetPointer(1111,93), intToStr(ivar6)); + } else { + setWidgetText(new WidgetPointer(1111,93), "..."); + } + script_41(72810627); + return; +} diff --git a/dumps/scripts/5041.cs2 b/dumps/scripts/5041.cs2 new file mode 100644 index 000000000..4738f5aa7 --- /dev/null +++ b/dumps/scripts/5041.cs2 @@ -0,0 +1,94 @@ +void script_5041(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + string svar0; + setWidgetContextMenuOption(6, "Delete"); + setWidgetIntegerNode(1474, arg1); + setWidgetIntegerNode(1475, arg2); + svar0 = getOtherCommonData(arg0, 1463); + cs2method1305("" + svar0); + ivar4 = -1; + switch (getOtherCommonData(arg0, 1466)) { + case 1: + setWidgetIntegerNode(1476, script_5020(arg3)); + setWidgetIntegerNode(1477, script_5021(arg3)); + ivar4 = getOtherCommonData(arg0, 1470); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5022(arg3))); + } + break; + case 2: + ivar4 = getOtherCommonData(arg0, 1470); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5023(arg3))); + } + ivar4 = getOtherCommonData(arg0, 1471); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5024(arg3))); + } + ivar4 = getOtherCommonData(arg0, 1472); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5025(arg3))); + } + break; + case 3: + ivar4 = getOtherCommonData(arg0, 1470); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5026(arg3))); + } + ivar4 = getOtherCommonData(arg0, 1471); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5027(arg3))); + } + ivar4 = getOtherCommonData(arg0, 1472); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5028(arg3))); + } + break; + case 4: + ivar4 = getOtherCommonData(arg0, 1470); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5029(arg3))); + } + ivar4 = getOtherCommonData(arg0, 1471); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5030(arg3))); + } + break; + case 5: + ivar4 = getOtherCommonData(arg0, 1470); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5031(arg3))); + } + ivar4 = getOtherCommonData(arg0, 1471); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5032(arg3))); + } + ivar4 = getOtherCommonData(arg0, 1472); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5033(arg3))); + } + break; + case 6: + ivar4 = getOtherCommonData(arg0, 1470); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5034(arg3))); + } + ivar4 = getOtherCommonData(arg0, 1471); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5035(arg3))); + } + ivar4 = getOtherCommonData(arg0, 1472); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, script_5036(arg3))); + } + break; + default: + ivar4 = getOtherCommonData(arg0, 1470); + if (ivar4 != -1) { + svar0 = concat(svar0, "
" + cs2method_3408(105, 115, ivar4, -1) + " " + cs2method_3408(105, 115, ivar4, arg3)); + } + } + setScriptCallOnMouseOver(5077, new WidgetPointer(-32768,3), -2147483643, svar0, -2147483647, -2147483646, "Iisii"); + setScriptCallOnMouseExit(40, new WidgetPointer(1111,131), "I"); + return; +} diff --git a/dumps/scripts/5042.cs2 b/dumps/scripts/5042.cs2 new file mode 100644 index 000000000..ff6b80db5 --- /dev/null +++ b/dumps/scripts/5042.cs2 @@ -0,0 +1,29 @@ +void script_5042(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int stack_dump0; + ivar2 = subtract(getLastMouseY(), script_3365(72810511)); + ivar3 = subtract(getLastMouseX(), script_3366(72810511)); + ivar4 = getWidgetActualWidth(new WidgetPointer(1111,15)); + ivar5 = getWidgetActualHeight(new WidgetPointer(1111,15)); + if ((((ivar2 > ivar4) || (ivar2 < 0)) || (ivar3 > ivar5)) || (ivar3 < 0)) { + stack_dump0 = divide(ivar4, 2); + ivar3 = divide(ivar5, 2); + ivar2 = stack_dump0; + } + ivar2 = add(ivar2, cs2method2600(new WidgetPointer(1111,15))); + ivar3 = add(ivar3, cs2method2601(new WidgetPointer(1111,15))); + ivar6 = multiply(globalint_1396, add(add(112, 2), 2)); + globalint_1396 = max(min(subtract(globalint_1396, arg1), 21), 3); + ivar7 = multiply(globalint_1396, add(add(112, 2), 2)); + ivar8 = subtract(multiplyDivide(ivar7, ivar6, ivar2), ivar2); + ivar9 = subtract(multiplyDivide(ivar7, ivar6, ivar3), ivar3); + script_5044(arg0, ivar8, ivar9); + return; +} diff --git a/dumps/scripts/5043.cs2 b/dumps/scripts/5043.cs2 new file mode 100644 index 000000000..8eee2f356 --- /dev/null +++ b/dumps/scripts/5043.cs2 @@ -0,0 +1,5 @@ +void script_5043(int arg0,int arg1,int arg2) { + globalint_1396 = max(min(add(3, multiplyDivide(add(arg2, divide(getWidgetActualWidth(new WidgetPointer(arg1)), 2)), getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(arg1)))), add(subtract(21, 3), 1))), 21), 3); + script_5044(arg0, 0, 0); + return; +} diff --git a/dumps/scripts/5044.cs2 b/dumps/scripts/5044.cs2 new file mode 100644 index 000000000..1703c31ee --- /dev/null +++ b/dumps/scripts/5044.cs2 @@ -0,0 +1,5 @@ +void script_5044(int arg0,int arg1,int arg2) { + script_5045(arg0, arg1, arg2); + script_5048(); + return; +} diff --git a/dumps/scripts/5045.cs2 b/dumps/scripts/5045.cs2 new file mode 100644 index 000000000..ad885260c --- /dev/null +++ b/dumps/scripts/5045.cs2 @@ -0,0 +1,4 @@ +void script_5045(int arg0,int arg1,int arg2) { + setScriptCallOnGameloop(5046, new WidgetPointer(arg0), globalint_1396, 0, arg1, arg2, "Iiiii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5046.cs2 b/dumps/scripts/5046.cs2 new file mode 100644 index 000000000..1bef3f6ae --- /dev/null +++ b/dumps/scripts/5046.cs2 @@ -0,0 +1,13 @@ +void script_5046(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (arg2 < 1) { + script_5047(arg1, 0, 40, arg3, arg4); + setScriptCallOnGameloop(5046, new WidgetPointer(arg0), globalint_1396, 1, arg3, arg4, "Iiiii", new WidgetPointer(arg0)); + } else if (arg2 < 2) { + script_5047(arg1, 40, 80, arg3, arg4); + setScriptCallOnGameloop(5046, new WidgetPointer(arg0), globalint_1396, 2, arg3, arg4, "Iiiii", new WidgetPointer(arg0)); + } else { + script_5047(arg1, 80, 112, arg3, arg4); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/5047.cs2 b/dumps/scripts/5047.cs2 new file mode 100644 index 000000000..ec7744e31 --- /dev/null +++ b/dumps/scripts/5047.cs2 @@ -0,0 +1,44 @@ +void script_5047(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + ivar5 = multiply(arg0, add(add(112, 2), 2)); + setWidgetScrollMax(ivar5, ivar5, new WidgetPointer(1111,15)); + ivar6 = subtract(ivar5, getWidgetActualWidth(new WidgetPointer(1111,15))); + if (cs2method2600(new WidgetPointer(1111,15)) > ivar6) { + cs2method2100(ivar6, cs2method2601(new WidgetPointer(1111,15)), new WidgetPointer(1111,15)); + } + if (cs2method2601(new WidgetPointer(1111,15)) > ivar6) { + cs2method2100(cs2method2600(new WidgetPointer(1111,15)), ivar6, new WidgetPointer(1111,15)); + } + setWidgetSize(ivar5, ivar5, 0, 0, new WidgetPointer(1111,16)); + setWidgetSize(ivar5, ivar5, 0, 0, new WidgetPointer(1111,18)); + ivar7 = 0; + ivar8 = subtract(arg0, 1); + ivar9 = 0; + ivar10 = arg1; + while (ivar10 < arg2) { + ivar9 = subtract(ivar5, multiply(add(add(ivar10, 2), 1), arg0)); + while (ivar7 < 112) { + if (setWidgetRegister(new WidgetPointer(1111,16), add(multiply(ivar10, 112), ivar7))) { + setWidgetSize(ivar8, ivar8, 0, 0); + setWidgetPosition(multiply(add(ivar7, 2), arg0), ivar9, 0, 0); + cs2method1303(divide(arg0, 2)); + } + ivar7 = add(ivar7, 1); + } + ivar7 = 0; + ivar10 = add(ivar10, 1); + } + if (arg1 <= 0) { + script_5053(arg3, arg4); + ivar9 = subtract(multiply(arg0, 2), 3); + setWidgetPosition(ivar9, ivar9, 0, 0, new WidgetPointer(1111,17)); + ivar9 = add(multiply(arg0, 112), 5); + setWidgetSize(ivar9, ivar9, 0, 0, new WidgetPointer(1111,17)); + } + return; +} diff --git a/dumps/scripts/5048.cs2 b/dumps/scripts/5048.cs2 new file mode 100644 index 000000000..012a50037 --- /dev/null +++ b/dumps/scripts/5048.cs2 @@ -0,0 +1,27 @@ +void script_5048() { + int ivar0; + int ivar1; + int stack_dump0; + int stack_dump1; + ivar0 = multiply(globalint_1396, add(add(112, 2), 2)); + ivar1 = 0; + while (ivar1 < 200) { + if (setWidgetRegister(new WidgetPointer(1111,18), ivar1)) { + stack_dump0 = globalint_1396; + stack_dump1 = 1476; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + ivar1 = add(ivar1, 1); + } + setWidgetPosition(multiplyDivide(max(subtract(globalint_1396, 3), 0), max(subtract(21, 3), 1), subtract(getWidgetActualWidth(new WidgetPointer(getWidgetParentId(new WidgetPointer(1111,51)))), getWidgetActualWidth(new WidgetPointer(1111,51)))), 0, 0, 1, new WidgetPointer(1111,51)); + return; +} diff --git a/dumps/scripts/5049.cs2 b/dumps/scripts/5049.cs2 new file mode 100644 index 000000000..58aae53f9 --- /dev/null +++ b/dumps/scripts/5049.cs2 @@ -0,0 +1,4 @@ +void script_5049(int arg0,int arg1,int arg2) { + script_5050(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/505.cs2 b/dumps/scripts/505.cs2 new file mode 100644 index 000000000..5da2f98af --- /dev/null +++ b/dumps/scripts/505.cs2 @@ -0,0 +1,13 @@ +void script_505() { + setWidgetText(new WidgetPointer(1017,156), script_483(bitconfig_7520)); + setWidgetText(new WidgetPointer(1017,157), script_483(bitconfig_7521)); + setWidgetText(new WidgetPointer(1017,158), script_483(bitconfig_7526)); + setWidgetText(new WidgetPointer(1017,159), script_483(bitconfig_7527)); + setWidgetText(new WidgetPointer(1017,160), script_483(bitconfig_7530)); + setWidgetText(new WidgetPointer(1017,161), script_483(bitconfig_7531)); + setWidgetText(new WidgetPointer(1017,162), script_483(bitconfig_7532)); + setWidgetText(new WidgetPointer(1017,163), script_483(bitconfig_7533)); + setWidgetText(new WidgetPointer(1017,164), script_483(bitconfig_7534)); + setWidgetText(new WidgetPointer(1017,165), script_483(bitconfig_7535)); + return; +} diff --git a/dumps/scripts/5050.cs2 b/dumps/scripts/5050.cs2 new file mode 100644 index 000000000..f44cb4338 --- /dev/null +++ b/dumps/scripts/5050.cs2 @@ -0,0 +1,10 @@ +void script_5050(int arg0,int arg1,int arg2) { + arg0 = multiply(arg0, arg1); + if (((boolean)arg2)) { + cs2method2100(cs2method2600(new WidgetPointer(1111,15)), max(add(cs2method2601(new WidgetPointer(1111,15)), arg0), 0), new WidgetPointer(1111,15)); + } else { + cs2method2100(max(add(cs2method2600(new WidgetPointer(1111,15)), arg0), 0), cs2method2601(new WidgetPointer(1111,15)), new WidgetPointer(1111,15)); + } + script_5053(0, 0); + return; +} diff --git a/dumps/scripts/5051.cs2 b/dumps/scripts/5051.cs2 new file mode 100644 index 000000000..6e6d31bff --- /dev/null +++ b/dumps/scripts/5051.cs2 @@ -0,0 +1,27 @@ +void script_5051(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = getWidgetActualWidth(new WidgetPointer(1111,15)); + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + if (((boolean)arg3)) { + if (setWidgetRegister(new WidgetPointer(arg0), 4)) { + setWidgetPosition(0, add(arg1, 16), 1, 0); + } + if (setWidgetRegister(new WidgetPointer(arg0), 5)) { + setWidgetPosition(0, subtract(add(add(arg1, 16), getWidgetActualHeight()), getWidgetActualHeight()), 1, 0); + } + cs2method2100(cs2method2600(new WidgetPointer(1111,15)), multiplyDivide(arg1, max(subtract(subtract(ivar4, 32), getWidgetActualHeight()), 1), subtract(getWidgetScrollMaxV(new WidgetPointer(1111,15)), ivar4)), new WidgetPointer(1111,15)); + } else { + if (setWidgetRegister(new WidgetPointer(arg0), 4)) { + setWidgetPosition(add(arg1, 16), 0, 0, 1); + } + if (setWidgetRegister(new WidgetPointer(arg0), 5)) { + setWidgetPosition(subtract(add(add(arg1, 16), getWidgetActualWidth()), getWidgetActualWidth()), 0, 0, 1); + } + cs2method2100(multiplyDivide(arg1, max(subtract(subtract(ivar4, 32), getWidgetActualWidth()), 1), subtract(getWidgetScrollMaxH(new WidgetPointer(1111,15)), ivar4)), cs2method2601(new WidgetPointer(1111,15)), new WidgetPointer(1111,15)); + } + } + if (((boolean)arg2)) { + script_5053(0, 0); + } + return; +} diff --git a/dumps/scripts/5052.cs2 b/dumps/scripts/5052.cs2 new file mode 100644 index 000000000..3a8bee8b5 --- /dev/null +++ b/dumps/scripts/5052.cs2 @@ -0,0 +1,10 @@ +void script_5052(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + if (((boolean)arg1)) { + cs2method3109(0, divide(getWidgetActualHeight(), 2)); + } else { + cs2method3109(divide(getWidgetActualWidth(), 2), 0); + } + } + return; +} diff --git a/dumps/scripts/5053.cs2 b/dumps/scripts/5053.cs2 new file mode 100644 index 000000000..7c6982576 --- /dev/null +++ b/dumps/scripts/5053.cs2 @@ -0,0 +1,32 @@ +void script_5053(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + cs2method2100(add(cs2method2600(new WidgetPointer(1111,15)), arg0), add(cs2method2601(new WidgetPointer(1111,15)), arg1), new WidgetPointer(1111,15)); + ivar2 = getWidgetScrollMaxH(new WidgetPointer(1111,15)); + ivar3 = getWidgetActualWidth(new WidgetPointer(1111,15)); + ivar4 = subtract(ivar3, 32); + ivar5 = min(max(multiplyDivide(ivar3, ivar2, ivar4), 10), ivar4); + ivar6 = multiplyDivide(cs2method2601(new WidgetPointer(1111,15)), max(subtract(ivar2, ivar3), 1), subtract(ivar4, ivar5)); + ivar7 = multiplyDivide(cs2method2600(new WidgetPointer(1111,15)), max(subtract(ivar2, ivar3), 1), subtract(ivar4, ivar5)); + ivar6 = add(max(min(ivar6, subtract(ivar4, ivar5)), 0), 16); + ivar7 = add(max(min(ivar7, subtract(ivar4, ivar5)), 0), 16); + if (setWidgetRegister(new WidgetPointer(1111,19), 3) && setWidgetRegister(new WidgetPointer(1111,20), 3)) { + setWidgetSize(0, ivar5, 1, 0); + setWidgetSize(ivar5, 0, 0, 1); + setWidgetPosition(0, ivar6, 1, 0); + setWidgetPosition(ivar7, 0, 0, 1); + } + if (setWidgetRegister(new WidgetPointer(1111,19), 4) && setWidgetRegister(new WidgetPointer(1111,20), 4)) { + setWidgetPosition(0, ivar6, 1, 0); + setWidgetPosition(ivar7, 0, 0, 1); + } + if (setWidgetRegister(new WidgetPointer(1111,19), 5) && setWidgetRegister(new WidgetPointer(1111,20), 5)) { + setWidgetPosition(0, subtract(add(ivar6, ivar5), getWidgetActualHeight()), 1, 0); + setWidgetPosition(subtract(add(ivar7, ivar5), getWidgetActualWidth()), 0, 0, 1); + } + return; +} diff --git a/dumps/scripts/5054.cs2 b/dumps/scripts/5054.cs2 new file mode 100644 index 000000000..d30c0f02e --- /dev/null +++ b/dumps/scripts/5054.cs2 @@ -0,0 +1,19 @@ +void script_5054(int arg0,int arg1) { + arg0 = subtract(arg0, cs2method2600(new WidgetPointer(1111,15))); + arg1 = subtract(arg1, cs2method2601(new WidgetPointer(1111,15))); + if (arg0 < 10) { + script_5050(-10, 1, 0); + } else { + if (arg0 > subtract(getWidgetActualWidth(new WidgetPointer(1111,15)), add(globalint_1396, 10))) { + script_5050(10, 1, 0); + } + } + if (arg1 < 10) { + script_5050(-10, 1, 1); + } else { + if (arg1 > subtract(getWidgetActualHeight(new WidgetPointer(1111,15)), add(globalint_1396, 10))) { + script_5050(10, 1, 1); + } + } + return; +} diff --git a/dumps/scripts/5055.cs2 b/dumps/scripts/5055.cs2 new file mode 100644 index 000000000..1412643fc --- /dev/null +++ b/dumps/scripts/5055.cs2 @@ -0,0 +1,154 @@ +void script_5055(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int stack_dump0; + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(40, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(20, 0, 0, 1); + setWidgetPosition(0, 0, 0, 1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(20, 0, 0, 1); + setWidgetPosition(0, 0, 2, 1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(10, 10, 0, 0); + setWidgetPosition(7, 0, 0, 1); + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(20, 0, 1, 1); + setWidgetPosition(0, 1, 2, 1); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(255, 239, 95)); + setWidgetUnknownBoolean(true); + setWidgetText(arg5); + setScriptCallOnMousePressed(5064, arg0, "i", new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + deleteAllExtraChilds(new WidgetPointer(arg4)); + ivar5 = 0; + ivar6 = getCommonDefinitionSize(3943); + while (ivar5 < ivar6) { + createExtraChild(new WidgetPointer(arg3), 3, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 3, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 3, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 5, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg3), 4, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetHidden(1); + ivar5 = add(ivar5, 1); + } + ivar7 = -1; + ivar8 = -1; + ivar9 = 0; + stack_dump0 = 0; + ivar6 = getCommonDefinitionSize(arg1); + ivar5 = stack_dump0; + while (ivar5 < ivar6) { + ivar7 = cs2method_3408(105, 105, arg1, ivar5); + ivar8 = cs2method_3408(105, 74, 3943, ivar7); + if (ivar8 != -1) { + if (setWidgetRegister(new WidgetPointer(arg3), multiply(ivar7, 12))) { + setWidgetSize(24, 26, 1, 0); + setWidgetPosition(0, ivar9, 0, 0); + cs2method2103(255); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(5070, -2147483644, ivar7, 0, "ii1"); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 1))) { + setWidgetSize(24, 26, 0, 0); + setWidgetPosition(0, ivar9, 2, 0); + cs2method2103(255); + setWidgetContextMenuOption(1, "Select & open settings"); + setScriptCallOnClickContextMenu(5070, -2147483644, ivar7, 1, "ii1"); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 2))) { + setWidgetSize(40, 26, 1, 0); + setWidgetPosition(8, ivar9, 0, 0); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 3))) { + setWidgetSize(8, 26, 0, 0); + setWidgetPosition(0, ivar9, 0, 0); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 4))) { + setWidgetSize(8, 26, 0, 0); + setWidgetPosition(24, ivar9, 2, 0); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 5))) { + setWidgetSize(8, 26, 0, 0); + setWidgetPosition(8, ivar9, 2, 0); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 6))) { + setWidgetSize(8, 26, 0, 0); + setWidgetPosition(16, ivar9, 2, 0); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 7))) { + setWidgetSize(8, 26, 0, 0); + setWidgetPosition(0, ivar9, 2, 0); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 8))) { + setWidgetSize(20, 20, 0, 0); + setWidgetPosition(3, add(ivar9, 3), 0, 0); + setWidgetSprite(getOtherCommonData(ivar8, 1465)); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 9))) { + setWidgetSize(21, 21, 0, 0); + setWidgetPosition(2, add(ivar9, 2), 0, 0); + setWidgetRGB(new Color(239, 223, 207)); + setWidgetFilled(0); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 10))) { + setWidgetSize(17, 17, 0, 0); + setWidgetPosition(4, add(ivar9, 4), 2, 0); + setWidgetHidden(0); + } + if (setWidgetRegister(new WidgetPointer(arg3), add(multiply(ivar7, 12), 11))) { + setWidgetSize(53, 26, 1, 0); + setWidgetPosition(24, ivar9, 2, 0); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(255, 239, 223)); + setWidgetUnknownBoolean(true); + setWidgetText(getOtherCommonData(ivar8, 1463)); + setWidgetHidden(0); + } + ivar9 = add(ivar9, 26); + } + ivar5 = add(ivar5, 1); + } + setWidgetScrollMax(0, ivar9, new WidgetPointer(arg3)); + cs2method2100(0, 0, new WidgetPointer(arg3)); + script_31(arg4, arg3, 6507, 6504, 6505, 6506, 6499, 6498); + return; +} diff --git a/dumps/scripts/5056.cs2 b/dumps/scripts/5056.cs2 new file mode 100644 index 000000000..1d7665d69 --- /dev/null +++ b/dumps/scripts/5056.cs2 @@ -0,0 +1,26 @@ +void script_5056(int arg0,int arg1) { + if (((boolean)arg1)) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(7571); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(7570); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(7572); + } + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetSprite(7577); + } + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } else { + script_5058(arg0, 0); + if (setWidgetRegister(new WidgetPointer(arg0), 3)) { + setWidgetSprite(7576); + } + setScriptCallOnMouseOver(5057, new WidgetPointer(-32768,3), 1, "I1", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(5057, new WidgetPointer(-32768,3), 0, "I1", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/5057.cs2 b/dumps/scripts/5057.cs2 new file mode 100644 index 000000000..f585a10e5 --- /dev/null +++ b/dumps/scripts/5057.cs2 @@ -0,0 +1,4 @@ +void script_5057(int arg0,int arg1) { + script_5058(arg0, arg1); + return; +} diff --git a/dumps/scripts/5058.cs2 b/dumps/scripts/5058.cs2 new file mode 100644 index 000000000..e05ddab31 --- /dev/null +++ b/dumps/scripts/5058.cs2 @@ -0,0 +1,24 @@ +void script_5058(int arg0,int arg1) { + if (((boolean)arg1)) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(7565); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(7564); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(7566); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetSprite(7562); + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSprite(7561); + } + if (setWidgetRegister(new WidgetPointer(arg0), 2)) { + setWidgetSprite(7563); + } + } + return; +} diff --git a/dumps/scripts/5059.cs2 b/dumps/scripts/5059.cs2 new file mode 100644 index 000000000..199fda06b --- /dev/null +++ b/dumps/scripts/5059.cs2 @@ -0,0 +1,55 @@ +void script_5059(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = multiply(arg1, 12); + if (((boolean)arg2)) { + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 2))) { + setWidgetSprite(7555); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 3))) { + setWidgetSprite(7554); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 4))) { + setWidgetSprite(7556); + } + if (setWidgetRegister(new WidgetPointer(arg0), ivar3)) { + setScriptCallOnMouseEntered(-1, ""); + setScriptCallOnMouseExit(-1, ""); + } + if (isWidgetHidden(new WidgetPointer(1111,21))) { + script_5063(arg0, arg1, 0); + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 1))) { + setScriptCallOnMouseEntered(5061, new WidgetPointer(-32768,3), arg1, 1, 0, "Ii11"); + setScriptCallOnMouseExit(5061, new WidgetPointer(-32768,3), arg1, 0, 0, "Ii11"); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 5))) { + setWidgetSprite(7555); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 6))) { + setWidgetSprite(7554); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 7))) { + setWidgetSprite(7556); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 10))) { + setWidgetSprite(7408); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 1))) { + setScriptCallOnMouseEntered(-1, ""); + setScriptCallOnMouseExit(-1, ""); + } + } + } else { + script_5062(arg0, arg1, 0); + script_5063(arg0, arg1, 0); + if (setWidgetRegister(new WidgetPointer(arg0), ivar3)) { + setScriptCallOnMouseEntered(5060, new WidgetPointer(-32768,3), arg1, 1, "Ii1"); + setScriptCallOnMouseExit(5060, new WidgetPointer(-32768,3), arg1, 0, "Ii1"); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 1))) { + setScriptCallOnMouseEntered(5061, new WidgetPointer(-32768,3), arg1, 1, 1, "Ii11"); + setScriptCallOnMouseExit(5061, new WidgetPointer(-32768,3), arg1, 0, 1, "Ii11"); + } + } + return; +} diff --git a/dumps/scripts/506.cs2 b/dumps/scripts/506.cs2 new file mode 100644 index 000000000..673b259c0 --- /dev/null +++ b/dumps/scripts/506.cs2 @@ -0,0 +1,29 @@ +int script_506(int arg0) { + int ivar1; + ivar1 = cs2method5004(arg0); + if ((globalint_41 == 5) && (strLength(globalstring_0) > 0)) { + switch (ivar1) { + case 1: + case 19: + case 2: + case 18: + case 3: + case 6: + case 7: + case 42: + case 41: + if (((boolean)stringMethod4107(strRemoveEntities(cs2method5010(arg0)), globalstring_0)) || ((boolean)stringMethod4107(strRemoveEntities(cs2method5010(arg0)), cs2method5015()))) { + if (((boolean)cs2method5016())) { + return 1; + } + if (((boolean)cs2method5016()) && isFriend(cs2method5019(arg0))) { + return 1; + } + if (((boolean)ivar1) || (ivar1 == 7)) { + return 1; + } + } + } + } + return 0; +} diff --git a/dumps/scripts/5060.cs2 b/dumps/scripts/5060.cs2 new file mode 100644 index 000000000..ab908d373 --- /dev/null +++ b/dumps/scripts/5060.cs2 @@ -0,0 +1,4 @@ +void script_5060(int arg0,int arg1,int arg2) { + script_5062(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/5061.cs2 b/dumps/scripts/5061.cs2 new file mode 100644 index 000000000..28294d1ec --- /dev/null +++ b/dumps/scripts/5061.cs2 @@ -0,0 +1,7 @@ +void script_5061(int arg0,int arg1,int arg2,int arg3) { + script_5063(arg0, arg1, arg2); + if (((boolean)arg3)) { + script_5062(arg0, arg1, arg2); + } + return; +} diff --git a/dumps/scripts/5062.cs2 b/dumps/scripts/5062.cs2 new file mode 100644 index 000000000..9a021ba0c --- /dev/null +++ b/dumps/scripts/5062.cs2 @@ -0,0 +1,26 @@ +void script_5062(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = multiply(arg1, 12); + if (((boolean)arg2)) { + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 2))) { + setWidgetSprite(7552); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 3))) { + setWidgetSprite(7551); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 4))) { + setWidgetSprite(7553); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 2))) { + setWidgetSprite(7549); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 3))) { + setWidgetSprite(7548); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 4))) { + setWidgetSprite(7550); + } + } + return; +} diff --git a/dumps/scripts/5063.cs2 b/dumps/scripts/5063.cs2 new file mode 100644 index 000000000..bd4cb8e17 --- /dev/null +++ b/dumps/scripts/5063.cs2 @@ -0,0 +1,29 @@ +void script_5063(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = multiply(arg1, 12); + if (((boolean)arg2)) { + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 5))) { + setWidgetSprite(7552); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 6))) { + setWidgetSprite(7551); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 7))) { + setWidgetSprite(7553); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 5))) { + setWidgetSprite(7549); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 6))) { + setWidgetSprite(7548); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 7))) { + setWidgetSprite(7550); + } + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 10))) { + setWidgetSprite(7409); + } + return; +} diff --git a/dumps/scripts/5064.cs2 b/dumps/scripts/5064.cs2 new file mode 100644 index 000000000..5603b3ef3 --- /dev/null +++ b/dumps/scripts/5064.cs2 @@ -0,0 +1,7 @@ +void script_5064(int arg0) { + if (arg0 != -1) { + globalint_768 = arg0; + } + script_5065(0); + return; +} diff --git a/dumps/scripts/5065.cs2 b/dumps/scripts/5065.cs2 new file mode 100644 index 000000000..74245f501 --- /dev/null +++ b/dumps/scripts/5065.cs2 @@ -0,0 +1,124 @@ +void script_5065(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int stack_dump0; + int stack_dump1; + flow_0: + ivar1 = getWidgetActualHeight(new WidgetPointer(1111,68)); + setWidgetSize(0, ivar1, 1, 0, new WidgetPointer(1111,69)); + setWidgetSize(0, ivar1, 1, 0, new WidgetPointer(1111,70)); + setWidgetSize(0, ivar1, 1, 0, new WidgetPointer(1111,71)); + ivar2 = getWidgetActualHeight(new WidgetPointer(1111,55)); + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + SWITCH (globalint_768) { + case 2: + GOTO flow_1 + case 3: + GOTO flow_2 + case 4: + GOTO flow_3 + } + globalint_768 = 1; + ivar3 = subtract(ivar2, multiply(ivar1, 3)); + ivar4 = subtract(ivar2, multiply(ivar1, 2)); + ivar5 = subtract(ivar2, ivar1); + script_5056(72810564, 1); + script_5056(72810565, 0); + script_5056(72810566, 0); + script_5056(72810567, 0); + GOTO flow_4 + flow_1: + ivar3 = ivar1; + ivar4 = subtract(ivar2, multiply(ivar1, 2)); + ivar5 = subtract(ivar2, ivar1); + script_5056(72810564, 0); + script_5056(72810565, 1); + script_5056(72810566, 0); + script_5056(72810567, 0); + GOTO flow_4 + flow_2: + ivar3 = ivar1; + ivar4 = multiply(ivar1, 2); + ivar5 = subtract(ivar2, ivar1); + script_5056(72810564, 0); + script_5056(72810565, 0); + script_5056(72810566, 1); + script_5056(72810567, 0); + GOTO flow_4 + flow_3: + ivar3 = ivar1; + ivar4 = multiply(ivar1, 2); + ivar5 = multiply(ivar1, 3); + script_5056(72810564, 0); + script_5056(72810565, 0); + script_5056(72810566, 0); + script_5056(72810567, 1); + flow_4: + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + if (((boolean)arg0)) { + stack_dump0 = ivar3; + stack_dump1 = ivar4; + ivar8 = ivar5; + stack_dump0 = stack_dump0; + ivar7 = stack_dump1; + ivar6 = stack_dump0; + } else { + ivar9 = getWidgetActualY(new WidgetPointer(1111,69)); + if (ivar9 != ivar3) { + ivar6 = add(ivar9, max(min(subtract(ivar3, ivar9), 3), -3)); + ivar10 = 1; + } else { + ivar6 = ivar3; + } + ivar9 = getWidgetActualY(new WidgetPointer(1111,70)); + if (ivar9 != ivar4) { + ivar7 = add(ivar9, max(min(subtract(ivar4, ivar9), 3), -3)); + ivar10 = 1; + } else { + ivar7 = ivar4; + } + ivar9 = getWidgetActualY(new WidgetPointer(1111,71)); + if (ivar9 != ivar5) { + ivar8 = add(ivar9, max(min(subtract(ivar5, ivar9), 3), -3)); + ivar10 = 1; + } else { + ivar8 = ivar5; + } + } + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(1111,68)); + setWidgetPosition(0, ivar6, 1, 0, new WidgetPointer(1111,69)); + setWidgetPosition(0, ivar7, 1, 0, new WidgetPointer(1111,70)); + setWidgetPosition(0, ivar8, 1, 0, new WidgetPointer(1111,71)); + setWidgetPosition(0, ivar1, 1, 0, new WidgetPointer(1111,56)); + setWidgetPosition(0, add(ivar6, ivar1), 1, 0, new WidgetPointer(1111,59)); + setWidgetPosition(0, add(ivar7, ivar1), 1, 0, new WidgetPointer(1111,62)); + setWidgetPosition(0, add(ivar8, ivar1), 1, 0, new WidgetPointer(1111,65)); + setWidgetSize(0, subtract(ivar6, ivar1), 1, 0, new WidgetPointer(1111,56)); + setWidgetSize(0, subtract(ivar7, add(ivar6, ivar1)), 1, 0, new WidgetPointer(1111,59)); + setWidgetSize(0, subtract(ivar8, add(ivar7, ivar1)), 1, 0, new WidgetPointer(1111,62)); + setWidgetSize(0, add(ivar8, ivar1), 1, 1, new WidgetPointer(1111,65)); + script_72(72810554, 72810553, cs2method2601(new WidgetPointer(1111,57))); + script_72(72810557, 72810556, cs2method2601(new WidgetPointer(1111,60))); + script_72(72810560, 72810559, cs2method2601(new WidgetPointer(1111,63))); + script_72(72810563, 72810562, cs2method2601(new WidgetPointer(1111,66))); + if (((boolean)ivar10)) { + setScriptCallOnGameloop(5064, -1, "i", new WidgetPointer(1111,55)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(1111,55)); + } + return; +} diff --git a/dumps/scripts/5066.cs2 b/dumps/scripts/5066.cs2 new file mode 100644 index 000000000..d9a15193e --- /dev/null +++ b/dumps/scripts/5066.cs2 @@ -0,0 +1,4 @@ +void script_5066() { + script_5067(); + return; +} diff --git a/dumps/scripts/5067.cs2 b/dumps/scripts/5067.cs2 new file mode 100644 index 000000000..bad108dda --- /dev/null +++ b/dumps/scripts/5067.cs2 @@ -0,0 +1,87 @@ +void script_5067() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + string svar0; + ivar0 = 0; + ivar1 = getCommonDefinitionSize(3943); + ivar2 = 0; + while (ivar0 < ivar1) { + if (bitconfig_9516 == ivar0) { + ivar2 = 1; + } else { + ivar2 = 0; + } + if (commonIntegerExists('i', 3944, ivar0)) { + script_5059(72810553, ivar0, ivar2); + } + if (commonIntegerExists('i', 3945, ivar0)) { + script_5059(72810556, ivar0, ivar2); + } + if (commonIntegerExists('i', 3946, ivar0)) { + script_5059(72810559, ivar0, ivar2); + } + if (commonIntegerExists('i', 3947, ivar0)) { + script_5059(72810562, ivar0, ivar2); + } + ivar0 = add(ivar0, 1); + } + deleteAllExtraChilds(new WidgetPointer(1111,30)); + deleteAllExtraChilds(new WidgetPointer(1111,31)); + deleteAllExtraChilds(new WidgetPointer(1111,32)); + deleteAllExtraChilds(new WidgetPointer(1111,33)); + ivar3 = 0; + ivar4 = cs2method_3408(105, 74, 3943, bitconfig_9516); + svar0 = ""; + ivar5 = -1; + if (ivar4 != -1) { + setWidgetText(new WidgetPointer(1111,29), getOtherCommonData(ivar4, 1463)); + setWidgetSprite(getOtherCommonData(ivar4, 1465), new WidgetPointer(1111,27)); + svar0 = getOtherCommonData(ivar4, 1464); + if (((boolean)getOtherCommonData(ivar4, 1466)) && (ivar4 != 1918)) { + svar0 = concat(svar0, "
" + "
" + "Drag your mouse over the grid to fill an area with this element."); + } + ivar3 = add(ivar3, script_5068(ivar3, svar0)); + ivar5 = getOtherCommonData(ivar4, 1470); + if (ivar5 != -1) { + ivar3 = add(ivar3, 5); + ivar3 = add(ivar3, script_5068(ivar3, cs2method_3408(105, 115, ivar5, -1))); + setWidgetPosition(0, ivar3, 1, 0, new WidgetPointer(1111,31)); + ivar3 = add(ivar3, script_5069(ivar5, 72810527, 1, bitconfig_9517)); + } else { + setWidgetSize(0, 0, 1, 0, new WidgetPointer(1111,31)); + } + ivar5 = getOtherCommonData(ivar4, 1471); + if (ivar5 != -1) { + ivar3 = add(ivar3, 5); + ivar3 = add(ivar3, script_5068(ivar3, cs2method_3408(105, 115, ivar5, -1))); + setWidgetPosition(0, ivar3, 1, 0, new WidgetPointer(1111,32)); + ivar3 = add(ivar3, script_5069(ivar5, 72810528, 2, bitconfig_9518)); + } else { + setWidgetSize(0, 0, 1, 0, new WidgetPointer(1111,32)); + } + ivar5 = getOtherCommonData(ivar4, 1472); + if (ivar5 != -1) { + ivar3 = add(ivar3, 5); + ivar3 = add(ivar3, script_5068(ivar3, cs2method_3408(105, 115, ivar5, -1))); + setWidgetPosition(0, ivar3, 1, 0, new WidgetPointer(1111,33)); + ivar3 = add(ivar3, script_5069(ivar5, 72810529, 3, bitconfig_9519)); + } else { + setWidgetSize(0, 0, 1, 0, new WidgetPointer(1111,33)); + } + } else { + setWidgetText(new WidgetPointer(1111,29), ""); + setWidgetSprite(-1, new WidgetPointer(1111,27)); + } + if (ivar3 > getWidgetActualHeight(new WidgetPointer(1111,30))) { + setWidgetScrollMax(0, ivar3, new WidgetPointer(1111,30)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(1111,30)); + } + cs2method2100(0, min(cs2method2601(new WidgetPointer(1111,30)), ivar3), new WidgetPointer(1111,30)); + script_31(72810530, 72810526, 6507, 6504, 6505, 6506, 6499, 6498); + return; +} diff --git a/dumps/scripts/5068.cs2 b/dumps/scripts/5068.cs2 new file mode 100644 index 000000000..6f0ba3a83 --- /dev/null +++ b/dumps/scripts/5068.cs2 @@ -0,0 +1,12 @@ +int script_5068(int arg0,string arg1) { + int ivar1; + createExtraChild(new WidgetPointer(1111,30), 4, getExtraChildGap(new WidgetPointer(1111,30))); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(223, 207, 191)); + ivar1 = add(multiply(getLineCount(getWidgetActualWidth(new WidgetPointer(1111,30)), 494, arg1), 10), 2); + setWidgetSize(0, ivar1, 1, 0); + setWidgetText(arg1); + setWidgetPosition(0, arg0, 1, 0); + return ivar1; +} diff --git a/dumps/scripts/5069.cs2 b/dumps/scripts/5069.cs2 new file mode 100644 index 000000000..afc8a6214 --- /dev/null +++ b/dumps/scripts/5069.cs2 @@ -0,0 +1,39 @@ +int script_5069(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + ivar4 = min(getCommonDefinitionSize(arg0), 256); + ivar5 = 0; + ivar6 = 0; + while (ivar5 < ivar4) { + createExtraChild(new WidgetPointer(arg1), 3, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(0, 14, 1, 0); + setWidgetPosition(0, ivar6, 1, 0); + cs2method2103(255); + setWidgetContextMenuOption(1, "Select"); + createExtraChild(new WidgetPointer(arg1), 5, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(0, add(ivar6, 1), 0, 0); + if (arg3 == ivar5) { + setWidgetSprite(5924); + } else { + setWidgetSprite(5928); + } + createExtraChild(new WidgetPointer(arg1), 4, getExtraChildGap(new WidgetPointer(arg1))); + setWidgetSize(17, 14, 1, 0); + setWidgetPosition(0, ivar6, 2, 0); + setWidgetFont(494); + setWidgetRGB(new Color(223, 207, 191)); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 1, 0); + setWidgetText(cs2method_3408(105, 115, arg0, ivar5)); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), getWidgetCustomChildArrayIndex(), 14667711, "Iii"); + setScriptCallOnClickContextMenu(5071, -2147483644, arg2, ivar5, arg0, "iiig"); + ivar6 = add(ivar6, 15); + ivar5 = add(ivar5, 1); + } + ivar6 = max(subtract(ivar6, 1), 0); + setWidgetSize(0, ivar6, 1, 0, new WidgetPointer(arg1)); + return ivar6; +} diff --git a/dumps/scripts/507.cs2 b/dumps/scripts/507.cs2 new file mode 100644 index 000000000..64fbe8f03 --- /dev/null +++ b/dumps/scripts/507.cs2 @@ -0,0 +1,8 @@ +void script_507(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + setScriptCallOnItemContainerUpdate(712, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), 541, 1, "IIIIIIIY", new WidgetPointer(arg0)); + setScriptCallOnConfigChange(712, new WidgetPointer(arg0), new WidgetPointer(arg1), new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), 259, 1, "IIIIIIIY", new WidgetPointer(arg0)); + script_1086(arg0, 0, 0, 0); + script_1086(arg4, 0, 0, 0); + script_713(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + return; +} diff --git a/dumps/scripts/5070.cs2 b/dumps/scripts/5070.cs2 new file mode 100644 index 000000000..f3bda067d --- /dev/null +++ b/dumps/scripts/5070.cs2 @@ -0,0 +1,27 @@ +void script_5070(int arg0,int arg1,int arg2) { + int stack_dump0; + int stack_dump1; + if ((arg0 != 1) || (cs2method_3408(105, 74, 3943, arg1) == -1)) { + return; + } + playSoundEffect2False(6185, 1, 0, 200); + if (arg1 == bitconfig_9516) { + arg2 = ((int)isWidgetHidden(new WidgetPointer(1111,21))); + } else { + cs2method2100(0, 0, new WidgetPointer(1111,30)); + stack_dump0 = 0; + stack_dump1 = 0; + bitconfig_9519 = 0; + stack_dump0 = stack_dump0; + bitconfig_9518 = stack_dump1; + bitconfig_9517 = stack_dump0; + } + bitconfig_9516 = arg1; + if (((boolean)arg2)) { + script_5073(0); + } else { + script_5073(1); + } + script_5067(); + return; +} diff --git a/dumps/scripts/5071.cs2 b/dumps/scripts/5071.cs2 new file mode 100644 index 000000000..0b93cd003 --- /dev/null +++ b/dumps/scripts/5071.cs2 @@ -0,0 +1,24 @@ +void script_5071(int arg0,int arg1,int arg2,int arg3) { + if ((arg0 != 1) || (arg3 == -1)) { + return; + } + if (arg2 >= min(getCommonDefinitionSize(arg3), 256)) { + return; + } + switch (arg1) { + case 1: + bitconfig_9517 = arg2; + break; + case 2: + bitconfig_9518 = arg2; + break; + case 3: + bitconfig_9519 = arg2; + break; + default: + return; + } + playSoundEffect2False(6185, 1, 0, 200); + script_5067(); + return; +} diff --git a/dumps/scripts/5072.cs2 b/dumps/scripts/5072.cs2 new file mode 100644 index 000000000..b260d4e88 --- /dev/null +++ b/dumps/scripts/5072.cs2 @@ -0,0 +1,6 @@ +void script_5072(int arg0) { + playSoundEffect2False(6185, 1, 0, 200); + script_5073(arg0); + script_5067(); + return; +} diff --git a/dumps/scripts/5073.cs2 b/dumps/scripts/5073.cs2 new file mode 100644 index 000000000..5890f3d7d --- /dev/null +++ b/dumps/scripts/5073.cs2 @@ -0,0 +1,9 @@ +void script_5073(int arg0) { + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(1111,21)); + if (((boolean)arg0)) { + setWidgetIsHidden(false, new WidgetPointer(1111,120)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1111,120)); + } + return; +} diff --git a/dumps/scripts/5074.cs2 b/dumps/scripts/5074.cs2 new file mode 100644 index 000000000..5296665d3 --- /dev/null +++ b/dumps/scripts/5074.cs2 @@ -0,0 +1,32 @@ +void script_5074(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int stack_dump0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (globalint_1065 == -1) { + setWidgetHidden(1); + return; + } + stack_dump0 = subtract(extractX(getMyPositionHash()), extractX(globalint_1065)); + ivar3 = subtract(extractY(getMyPositionHash()), extractY(globalint_1065)); + ivar2 = stack_dump0; + if ((((ivar2 < 0) || (ivar2 >= 112)) || (ivar3 < 0)) || (ivar3 >= 112)) { + setWidgetHidden(1); + return; + } + ivar4 = add(globalint_1396, 1); + setWidgetHidden(0); + setWidgetPosition(subtract(multiply(add(ivar2, 2), globalint_1396), 1), subtract(getWidgetScrollMaxV(new WidgetPointer(arg0)), add(multiply(add(ivar3, 2), globalint_1396), ivar4)), 0, 0); + setWidgetSize(ivar4, ivar4, 0, 0); + if (mod(getClientCycle(), 40) < 20) { + setWidgetRGB(new Color(143, 143, 143)); + } else { + setWidgetRGB(new Color(221, 221, 0)); + } + } + return; +} diff --git a/dumps/scripts/5075.cs2 b/dumps/scripts/5075.cs2 new file mode 100644 index 000000000..6d8b7a5b7 --- /dev/null +++ b/dumps/scripts/5075.cs2 @@ -0,0 +1,5 @@ +void script_5075(int arg0,int arg1) { + playSoundEffect2False(6185, 1, 0, 200); + script_5076(arg0, arg1); + return; +} diff --git a/dumps/scripts/5076.cs2 b/dumps/scripts/5076.cs2 new file mode 100644 index 000000000..314e7984d --- /dev/null +++ b/dumps/scripts/5076.cs2 @@ -0,0 +1,21 @@ +void script_5076(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 0; + ivar3 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (isWidgetHidden()) { + ivar2 = divide(subtract(getWidgetScrollMaxH(new WidgetPointer(1111,15)), getWidgetActualWidth(new WidgetPointer(1111,15))), 2); + ivar3 = ivar2; + } else { + ivar2 = subtract(add(getWidgetActualX(), divide(getWidgetActualWidth(), 2)), divide(getWidgetActualWidth(new WidgetPointer(1111,15)), 2)); + ivar3 = subtract(add(getWidgetActualY(), divide(getWidgetActualHeight(), 2)), divide(getWidgetActualHeight(new WidgetPointer(1111,15)), 2)); + } + } else { + ivar2 = divide(subtract(getWidgetScrollMaxH(new WidgetPointer(1111,15)), getWidgetActualWidth(new WidgetPointer(1111,15))), 2); + ivar3 = ivar2; + } + cs2method2100(ivar2, ivar3, new WidgetPointer(1111,15)); + script_5053(0, 0); + return; +} diff --git a/dumps/scripts/5077.cs2 b/dumps/scripts/5077.cs2 new file mode 100644 index 000000000..2ff823f31 --- /dev/null +++ b/dumps/scripts/5077.cs2 @@ -0,0 +1,59 @@ +void script_5077(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int stack_dump0; + if (isWidgetHidden(new WidgetPointer(1111,21)) || isWidgetHidden(new WidgetPointer(1111,9))) { + script_41(72810627); + return; + } + if (((boolean)script_4761(25))) { + return; + } + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = script_3365(72810505); + ivar11 = script_3366(72810505); + ivar12 = getWidgetActualWidth(new WidgetPointer(1111,9)); + ivar13 = getWidgetActualHeight(new WidgetPointer(1111,9)); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + stack_dump0 = script_1743(); + ivar5 = script_1744(); + ivar4 = stack_dump0; + stack_dump0 = subtract(ivar4, ivar10); + ivar6 = subtract(ivar5, ivar11); + ivar9 = stack_dump0; + stack_dump0 = add(ivar9, getWidgetActualWidth()); + ivar7 = add(ivar6, getWidgetActualHeight()); + ivar8 = stack_dump0; + if (subtract(ivar13, ivar7) > 150) { + script_4540(72810627, arg0, arg1, ivar12, 494, 494, -1, 10, 2, 2, arg2, arg3, arg4); + return; + } + if (ivar6 > 125) { + script_4540(72810627, arg0, arg1, ivar12, 494, 494, -1, 10, 2, 0, arg2, arg3, arg4); + return; + } + if (subtract(ivar12, ivar8) > 150) { + script_4540(72810627, arg0, arg1, ivar12, 494, 494, -1, 10, 2, 1, arg2, arg3, arg4); + return; + } + if (ivar9 > 225) { + script_4540(72810627, arg0, arg1, ivar12, 494, 494, -1, 10, 2, 3, arg2, arg3, arg4); + return; + } + script_4540(72810627, arg0, arg1, ivar12, 494, 494, -1, 10, 2, -1, add(ivar4, arg2), add(ivar5, arg3), arg4); + } + return; +} diff --git a/dumps/scripts/5078.cs2 b/dumps/scripts/5078.cs2 new file mode 100644 index 000000000..5523e3114 --- /dev/null +++ b/dumps/scripts/5078.cs2 @@ -0,0 +1,154 @@ +void script_5078(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int stack_dump0; + script_4762(73007134, 1788); + deleteAllExtraChilds(new WidgetPointer(1114,5)); + ivar1 = 0; + ivar2 = getCommonDefinitionSize(3921); + ivar3 = -1; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + globalarray_0 = new int[add(ivar2, 1)]; + ivar7 = 1; + while (ivar1 < ivar2) { + ivar3 = cs2method_3408(105, 103, 3921, ivar1); + if (ivar3 != -1) { + stack_dump0 = 0; + ivar5 = getCommonDefinitionSize(ivar3); + ivar4 = stack_dump0; + while (ivar4 < ivar5) { + ivar6 = max(ivar6, getTextWidth(494, cs2method_3408(105, 115, ivar3, ivar4))); + ivar4 = add(ivar4, 1); + } + globalarray_0[ivar7] = add(globalarray_0[subtract(ivar7, 1)], ivar5); + ivar7 = add(ivar7, 1); + } + ivar1 = add(ivar1, 1); + } + ivar8 = add(ivar6, 28); + ivar1 = 0; + ivar9 = 0; + ivar10 = 0; + while (ivar1 < ivar2) { + ivar3 = cs2method_3408(105, 103, 3921, ivar1); + if (ivar3 != -1) { + createExtraChild(new WidgetPointer(1114,5), 3, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(0, 33, 1, 0); + setWidgetPosition(0, ivar9, 0, 0); + setWidgetFilled(1); + if (((boolean)mod(ivar1, 2))) { + setWidgetRGB(new Color(33, 31, 28)); + } else { + setWidgetRGB(new Color(24, 23, 21)); + } + createExtraChild(new WidgetPointer(1114,5), 4, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(add(ivar8, 15), 33, 1, 0); + setWidgetPosition(5, ivar9, 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(0, 1, 0); + setWidgetRGB(new Color(233, 226, 180)); + setWidgetUnknownBoolean(true); + setWidgetText(cs2method_3408(105, 115, ivar3, -1)); + createExtraChild(new WidgetPointer(1114,5), 3, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(ivar8, 21, 0, 0); + setWidgetPosition(6, add(ivar9, 6), 2, 0); + cs2method2103(255); + createExtraChild(new WidgetPointer(1114,5), 5, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(subtract(getWidgetActualWidth(), 40), getWidgetActualHeight(), 0, 0); + setWidgetPosition(26, getWidgetActualY(), 2, 0); + if (((boolean)globalint_1095)) { + setWidgetSprite(6132); + } else { + setWidgetSprite(6141); + } + createExtraChild(new WidgetPointer(1114,5), 5, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(subtract(getWidgetActualWidth(), 40), getWidgetActualHeight(), 0, 0); + setWidgetPosition(26, getWidgetActualY(), 2, 0); + if (((boolean)globalint_1095)) { + setWidgetSprite(6135); + cs2method2103(255); + } else { + setWidgetHidden(1); + } + createExtraChild(new WidgetPointer(1114,5), 5, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(20, getWidgetActualHeight(), 0, 0); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + if (((boolean)globalint_1095)) { + setWidgetSprite(6131); + } else { + setWidgetSprite(6140); + } + createExtraChild(new WidgetPointer(1114,5), 5, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(20, getWidgetActualHeight(), 0, 0); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + if (((boolean)globalint_1095)) { + setWidgetSprite(6134); + cs2method2103(255); + } else { + setWidgetHidden(1); + } + createExtraChild(new WidgetPointer(1114,5), 5, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(20, getWidgetActualHeight(), 0, 0); + setWidgetPosition(6, getWidgetActualY(), 2, 0); + if (((boolean)globalint_1095)) { + setWidgetSprite(6133); + } else { + setWidgetSprite(6142); + } + createExtraChild(new WidgetPointer(1114,5), 5, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(20, getWidgetActualHeight(), 0, 0); + setWidgetPosition(6, getWidgetActualY(), 2, 0); + if (((boolean)globalint_1095)) { + setWidgetSprite(6136); + cs2method2103(255); + } else { + setWidgetHidden(1); + } + createExtraChild(new WidgetPointer(1114,5), 4, getExtraChildGap(new WidgetPointer(1114,5))); + setWidgetSize(ivar6, 21, 0, 0); + setWidgetPosition(30, getWidgetActualY(), 2, 0); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(37, 30, 20)); + setWidgetUnknownBoolean(false); + setWidgetText(""); + ivar9 = add(ivar9, 33); + if (((boolean)globalint_1095)) { + setScriptCallOnMouseEntered(5086, new WidgetPointer(-32768,3), ivar1, 0, "Iii"); + setScriptCallOnMouseExit(5086, new WidgetPointer(-32768,3), ivar1, 1, "Iii"); + setScriptCallOnMouseReleased(5086, new WidgetPointer(-32768,3), ivar1, 255, "Iii"); + if (ivar3 == 3922) { + setScriptCallOnMousePressed(5081, new WidgetPointer(-32768,3), ivar1, ivar3, globalarray_0[ivar1], min(subtract(globalarray_0[add(ivar1, 1)], globalarray_0[ivar1]), bitconfig_9544), ivar10, ivar8, "Iigiiii"); + } else { + setScriptCallOnMousePressed(5081, new WidgetPointer(-32768,3), ivar1, ivar3, globalarray_0[ivar1], subtract(globalarray_0[add(ivar1, 1)], globalarray_0[ivar1]), ivar10, ivar8, "Iigiiii"); + } + } + } + ivar1 = add(ivar1, 1); + } + if (ivar9 > getWidgetActualHeight(new WidgetPointer(1114,5))) { + setWidgetScrollMax(0, ivar9, new WidgetPointer(1114,5)); + cs2method2100(0, cs2method2601(new WidgetPointer(1114,5)), new WidgetPointer(1114,5)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(1114,5)); + cs2method2100(0, 0, new WidgetPointer(1114,5)); + } + script_31(73007110, 73007109, 6507, 6504, 6505, 6506, 6499, 6498); + script_5080(73007109); + setScriptCallOnMousePressed(5084, new WidgetPointer(1114,5), "I", new WidgetPointer(1114,28)); + setScriptCallOnGlobalConfigChange(5078, new WidgetPointer(-32768,3), 1095, 1, "IY", new WidgetPointer(arg0)); + setScriptCallOnConfigChange(5078, new WidgetPointer(-32768,3), 1734, 1, "IY", new WidgetPointer(arg0)); + setScriptCallOnConfigChange(5079, new WidgetPointer(-32768,3), 1736, 1, "IY", new WidgetPointer(1114,5)); + setScriptCallOnGlobalStringChange(5079, new WidgetPointer(-32768,3), 129, 1, "IY", new WidgetPointer(1114,5)); + return; +} diff --git a/dumps/scripts/5079.cs2 b/dumps/scripts/5079.cs2 new file mode 100644 index 000000000..ba88e9249 --- /dev/null +++ b/dumps/scripts/5079.cs2 @@ -0,0 +1,4 @@ +void script_5079(int arg0) { + script_5080(arg0); + return; +} diff --git a/dumps/scripts/508.cs2 b/dumps/scripts/508.cs2 new file mode 100644 index 000000000..71884a091 --- /dev/null +++ b/dumps/scripts/508.cs2 @@ -0,0 +1,23 @@ +void script_508() { + globalint_6 = 0; + if ((getBlackmarks() == 5) || (getBlackmarks() == 6)) { + setWidgetText(new WidgetPointer(594,83), "Suggest to mute this player for 48 hours"); + setWidgetText(new WidgetPointer(594,10), "Suggest to mute this player for 48 hours"); + setWidgetText(new WidgetPointer(594,60), "Suggest to mute this player for 48 hours"); + } else { + setWidgetText(new WidgetPointer(594,83), "Mute this player for 48 hours"); + setWidgetText(new WidgetPointer(594,10), "Mute this player for 48 hours"); + setWidgetText(new WidgetPointer(594,60), "Mute this player for 48 hours"); + } + globalint_11 = 1; + if (getLanguage() != 1) { + script_216(); + script_246(); + return; + } + setScriptCallOnGlobalStringChange(218, 24, 1, "Y", new WidgetPointer(594,32)); + globalint_792 = -1; + script_224(); + script_216(); + return; +} diff --git a/dumps/scripts/5080.cs2 b/dumps/scripts/5080.cs2 new file mode 100644 index 000000000..7215f0aa7 --- /dev/null +++ b/dumps/scripts/5080.cs2 @@ -0,0 +1,47 @@ +void script_5080(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = getCommonDefinitionSize(3921); + ivar3 = -1; + while (ivar1 < ivar2) { + ivar3 = cs2method_3408(105, 103, 3921, ivar1); + if ((ivar3 != -1) && setWidgetRegister(new WidgetPointer(arg0), add(multiply(ivar1, 10), 9))) { + setWidgetText(cs2method_3408(105, 115, ivar3, script_5089(ivar3))); + } + ivar1 = add(ivar1, 1); + } + switch (bitconfig_9539) { + case 1: + if (((boolean)globalint_1095)) { + setWidgetText(new WidgetPointer(1114,8), "Press 'Confirm' when you've made your choices."); + } else { + setWidgetText(new WidgetPointer(1114,8), "Waiting for the battle's initiator to choose the rules..."); + } + break; + case 2: + if (((boolean)globalint_1095)) { + setWidgetText(new WidgetPointer(1114,8), "Press 'Confirm' when you've made your choices."); + } else { + setWidgetText(new WidgetPointer(1114,8), "Waiting for " + globalstring_129 + " to choose the rules..."); + } + break; + case 3: + setWidgetText(new WidgetPointer(1114,8), "Loading elements..."); + break; + case 4: + setWidgetText(new WidgetPointer(1114,8), "Building elements..."); + break; + case 5: + setWidgetText(new WidgetPointer(1114,8), "Failed to build battlefield."); + break; + case 6: + setWidgetText(new WidgetPointer(1114,8), "Initialising build mode."); + break; + default: + setWidgetText(new WidgetPointer(1114,8), "Loading..."); + } + script_5085(arg0); + return; +} diff --git a/dumps/scripts/5081.cs2 b/dumps/scripts/5081.cs2 new file mode 100644 index 000000000..ca9399afb --- /dev/null +++ b/dumps/scripts/5081.cs2 @@ -0,0 +1,76 @@ +void script_5081(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + if (((boolean)globalint_1095) || (globalint_1095 == -1)) { + script_5085(arg0); + return; + } + playSoundEffect2False(6185, 1, 0, 200); + setWidgetIsHidden(false, new WidgetPointer(1114,28)); + globalint_160 = arg1; + ivar7 = multiply(arg1, 10); + if (setWidgetRegister(new WidgetPointer(arg0), ivar7)) { + setScriptCallOnGameloop(-1, ""); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar7, 3))) { + setWidgetSprite(6138); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar7, 5))) { + setWidgetSprite(6137); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar7, 7))) { + setWidgetSprite(6139); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar7, 4))) { + cs2method2103(255); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar7, 6))) { + cs2method2103(255); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar7, 8))) { + cs2method2103(255); + } + deleteAllExtraChilds(new WidgetPointer(1114,32)); + ivar8 = 0; + while (ivar8 < arg3) { + createExtraChild(new WidgetPointer(1114,32), 3, getExtraChildGap(new WidgetPointer(1114,32))); + setWidgetHidden(1); + ivar8 = add(ivar8, 1); + } + ivar9 = script_5089(arg2); + ivar10 = 0; + ivar8 = 0; + while (ivar8 < arg4) { + if (ivar9 != ivar8) { + createExtraChild(new WidgetPointer(1114,32), 4, getExtraChildGap(new WidgetPointer(1114,32))); + setWidgetSize(0, 12, 1, 0); + setWidgetPosition(0, ivar10, 0, 0); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(37, 30, 20)); + setWidgetUnknownBoolean(false); + setWidgetText(cs2method_3408(105, 115, arg2, ivar8)); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 2432532, "Iii"); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(5084, new WidgetPointer(arg0), "I"); + ivar10 = add(ivar10, getWidgetActualHeight()); + } else { + createExtraChild(new WidgetPointer(1114,32), 3, getExtraChildGap(new WidgetPointer(1114,32))); + setWidgetHidden(1); + } + ivar8 = add(ivar8, 1); + } + setWidgetIntegerNode(1476, arg6, new WidgetPointer(1114,29)); + setWidgetIntegerNode(1477, ivar10, new WidgetPointer(1114,29)); + setWidgetScrollMax(0, ivar10, new WidgetPointer(1114,32)); + script_5082(arg0); + if (arg4 > 4) { + script_31(73007137, 73007136, 6507, 6504, 6505, 6506, 6499, 6498); + } else { + deleteAllExtraChilds(new WidgetPointer(1114,33)); + } + return; +} diff --git a/dumps/scripts/5082.cs2 b/dumps/scripts/5082.cs2 new file mode 100644 index 000000000..665fd5b11 --- /dev/null +++ b/dumps/scripts/5082.cs2 @@ -0,0 +1,37 @@ +void script_5082(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int stack_dump0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + if ((globalint_160 != -1) && setWidgetRegister(new WidgetPointer(arg0), add(multiply(globalint_160, 10), 2))) { + ivar1 = subtract(add(script_4405(), getWidgetActualHeight()), script_3366(73007132)); + if (ivar1 >= getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetIsHidden(true, new WidgetPointer(1114,29)); + } else if (ivar1 <= 0) { + setWidgetIsHidden(true, new WidgetPointer(1114,29)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1114,29)); + setWidgetPosition(subtract(script_1815(), script_3365(73007132)), ivar1, 0, 0, new WidgetPointer(1114,29)); + if (setWidgetRegister(new WidgetPointer(1114,29))) { + stack_dump0 = 1477; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + setScriptCallOnGameloop(5083, new WidgetPointer(-32768,3), globalint_160, add(getClientCycle(), 2), "Iii", new WidgetPointer(1114,29)); + } + } else { + setWidgetIsHidden(true, new WidgetPointer(1114,29)); + } + return; +} diff --git a/dumps/scripts/5083.cs2 b/dumps/scripts/5083.cs2 new file mode 100644 index 000000000..7d7365371 --- /dev/null +++ b/dumps/scripts/5083.cs2 @@ -0,0 +1,10 @@ +void script_5083(int arg0,int arg1,int arg2) { + if (getClientCycle() < arg2) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + if (arg1 == globalint_160) { + script_72(73007137, 73007136, cs2method2601(new WidgetPointer(1114,32))); + } + return; +} diff --git a/dumps/scripts/5084.cs2 b/dumps/scripts/5084.cs2 new file mode 100644 index 000000000..ff8ebf18f --- /dev/null +++ b/dumps/scripts/5084.cs2 @@ -0,0 +1,5 @@ +void script_5084(int arg0) { + playSoundEffect2False(6185, 1, 0, 200); + script_5085(arg0); + return; +} diff --git a/dumps/scripts/5085.cs2 b/dumps/scripts/5085.cs2 new file mode 100644 index 000000000..6a72d83c2 --- /dev/null +++ b/dumps/scripts/5085.cs2 @@ -0,0 +1,34 @@ +void script_5085(int arg0) { + int ivar1; + int ivar2; + setWidgetIsHidden(true, new WidgetPointer(1114,28)); + globalint_160 = -1; + deleteAllExtraChilds(new WidgetPointer(1114,32)); + ivar1 = 0; + ivar2 = getCommonDefinitionSize(3921); + while (ivar1 < ivar2) { + if (((boolean)globalint_1095)) { + if (setWidgetRegister(new WidgetPointer(arg0), add(multiply(ivar1, 10), 3))) { + setWidgetSprite(6132); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(multiply(ivar1, 10), 5))) { + setWidgetSprite(6131); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(multiply(ivar1, 10), 7))) { + setWidgetSprite(6133); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), add(multiply(ivar1, 10), 3))) { + setWidgetSprite(6141); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(multiply(ivar1, 10), 5))) { + setWidgetSprite(6140); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(multiply(ivar1, 10), 7))) { + setWidgetSprite(6142); + } + } + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/5086.cs2 b/dumps/scripts/5086.cs2 new file mode 100644 index 000000000..9bb488867 --- /dev/null +++ b/dumps/scripts/5086.cs2 @@ -0,0 +1,25 @@ +void script_5086(int arg0,int arg1,int arg2) { + int ivar3; + if (arg1 == globalint_160) { + arg2 = 255; + } + ivar3 = multiply(arg1, 10); + if (setWidgetRegister(new WidgetPointer(arg0), ivar3)) { + if (arg2 == 255) { + setScriptCallOnGameloop(-1, ""); + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 4))) { + cs2method2103(255); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 6))) { + cs2method2103(255); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(ivar3, 8))) { + cs2method2103(255); + } + } else { + setScriptCallOnGameloop(5087, new WidgetPointer(-32768,3), -2147483643, arg2, "Iii"); + script_5088(arg0, arg2); + } + } + return; +} diff --git a/dumps/scripts/5087.cs2 b/dumps/scripts/5087.cs2 new file mode 100644 index 000000000..0aef35320 --- /dev/null +++ b/dumps/scripts/5087.cs2 @@ -0,0 +1,6 @@ +void script_5087(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + script_5088(arg0, arg2); + } + return; +} diff --git a/dumps/scripts/5088.cs2 b/dumps/scripts/5088.cs2 new file mode 100644 index 000000000..7ac8f16e3 --- /dev/null +++ b/dumps/scripts/5088.cs2 @@ -0,0 +1,33 @@ +void script_5088(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), add(getWidgetCustomChildArrayIndex(), 4))) { + ivar2 = cs2method1609(); + if (((boolean)arg1)) { + ivar2 = max(subtract(ivar2, 22), 0); + cs2method2103(ivar2); + if (setWidgetRegister(new WidgetPointer(arg0), add(getWidgetCustomChildArrayIndex(), 6))) { + cs2method2103(ivar2); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(getWidgetCustomChildArrayIndex(), 8))) { + cs2method2103(ivar2); + } + if (ivar2 <= 0) { + setScriptCallOnGameloop(-1, ""); + } + } else { + ivar2 = min(add(ivar2, 22), 255); + cs2method2103(ivar2); + if (setWidgetRegister(new WidgetPointer(arg0), add(getWidgetCustomChildArrayIndex(), 6))) { + cs2method2103(ivar2); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(getWidgetCustomChildArrayIndex(), 8))) { + cs2method2103(ivar2); + } + if (ivar2 >= 255) { + setScriptCallOnGameloop(-1, ""); + } + } + } + return; +} diff --git a/dumps/scripts/5089.cs2 b/dumps/scripts/5089.cs2 new file mode 100644 index 000000000..15250d557 --- /dev/null +++ b/dumps/scripts/5089.cs2 @@ -0,0 +1,41 @@ +int script_5089(int arg0) { + switch (arg0) { + case 3922: + return bitconfig_9537; + case 3923: + return bitconfig_9533; + case 3924: + return bitconfig_9534; + case 3939: + return bitconfig_9532; + case 3925: + return bitconfig_9520; + case 3926: + return bitconfig_9521; + case 3927: + return bitconfig_9522; + case 3929: + return bitconfig_9523; + case 3931: + return bitconfig_9524; + case 3932: + return bitconfig_9525; + case 3933: + return bitconfig_9526; + case 3934: + return bitconfig_9527; + case 3935: + return bitconfig_9528; + case 3936: + return bitconfig_9529; + case 3937: + return bitconfig_9530; + case 3938: + return bitconfig_9531; + case 3941: + return bitconfig_9535; + case 3942: + return bitconfig_9536; + } + return 0; +} diff --git a/dumps/scripts/509.cs2 b/dumps/scripts/509.cs2 new file mode 100644 index 000000000..8cdcb724c --- /dev/null +++ b/dumps/scripts/509.cs2 @@ -0,0 +1,24 @@ +void script_509(int arg0) { + string svar0; + svar0 = ""; + if (arg0 == 40173577) { + svar0 = getItemName(standart_config_1065); + if (standart_config_1065 == -1) { + svar0 = "Empty"; + } + } else if (arg0 == 40173578) { + svar0 = getItemName(standart_config_1066); + if (standart_config_1066 == -1) { + svar0 = "Empty"; + } + } else { + if (arg0 == 40173579) { + svar0 = getItemName(standart_config_1067); + if (standart_config_1067 == -1) { + svar0 = "Empty"; + } + } + } + script_39(arg0, 40173592, 25, 199, svar0); + return; +} diff --git a/dumps/scripts/5090.cs2 b/dumps/scripts/5090.cs2 new file mode 100644 index 000000000..d8a7b5081 --- /dev/null +++ b/dumps/scripts/5090.cs2 @@ -0,0 +1,7 @@ +void script_5090(int arg0) { + script_4534(72876034); + script_5092(); + setScriptCallOnConfigChange(5091, 1736, 1735, 2, "Y", new WidgetPointer(arg0)); + setScriptCallOnGlobalConfigChange(5091, 786, 788, 787, 3, "Y", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5091.cs2 b/dumps/scripts/5091.cs2 new file mode 100644 index 000000000..819f67f72 --- /dev/null +++ b/dumps/scripts/5091.cs2 @@ -0,0 +1,4 @@ +void script_5091() { + script_5092(); + return; +} diff --git a/dumps/scripts/5092.cs2 b/dumps/scripts/5092.cs2 new file mode 100644 index 000000000..363e9f02e --- /dev/null +++ b/dumps/scripts/5092.cs2 @@ -0,0 +1,215 @@ +void script_5092() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + string svar6; + string svar7; + string stack_dump0; + int stack_dump1; + deleteAllExtraChilds(new WidgetPointer(1112,4)); + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + svar4 = ""; + svar5 = ""; + svar6 = ""; + svar7 = ""; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + if (bitconfig_9540 != 3) { + if (bitconfig_9520 > 0) { + svar0 = "
" + "Members:" + "
" + "Score:"; + svar3 = svar0; + svar1 = "
" + formatNumber(bitAnd(globalint_788, 1023), 1); + svar4 = "
" + formatNumber(bitAnd(divide(globalint_788, pow(2, 10)), 1023), 1); + svar1 = svar1 + "
" + formatNumber(bitAnd(globalint_786, 65535), 1); + ivar8 = divide(globalint_786, pow(2, 16)); + if (ivar8 < 0) { + ivar8 = add(pow(2, 16), ivar8); + } + svar4 = svar4 + "
" + formatNumber(ivar8, 1); + ivar8 = cs2method_3408(105, 105, 3928, bitconfig_9521); + if (ivar8 < 2147483647) { + svar1 = svar1 + " / " + formatNumber(ivar8, 1); + svar4 = svar4 + " / " + formatNumber(ivar8, 1); + } + if (bitconfig_9520 < 2) { + svar6 = "
" + "
" + "
" + "Neutral players:"; + svar7 = "
" + "
" + "
" + formatNumber(divide(globalint_788, pow(2, 20)), 1); + } else { + stack_dump0 = "
" + "
" + "
"; + svar7 = "
" + "
" + "
"; + svar6 = stack_dump0; + } + if (((boolean)bitconfig_9540)) { + stack_dump0 = "Your team:"; + svar5 = "Blue team:"; + svar2 = stack_dump0; + } else if (bitconfig_9540 == 2) { + stack_dump0 = "Red team:"; + svar5 = "Your team:"; + svar2 = stack_dump0; + } else { + stack_dump0 = "Red team:"; + svar5 = "Blue team:"; + svar2 = stack_dump0; + if (bitconfig_9520 < 2) { + svar6 = svar6 + "
" + "Your score:"; + svar7 = svar7 + "
" + formatNumber(bitconfig_9541, 1); + ivar8 = cs2method_3408(105, 105, 3928, bitconfig_9522); + if (ivar8 < 2147483647) { + svar7 = svar7 + " / " + formatNumber(ivar8, 1); + } + } + } + } else { + stack_dump0 = "Score:"; + svar7 = formatNumber(bitconfig_9541, 1); + svar6 = stack_dump0; + } + ivar8 = cs2method_3408(105, 105, 3940, bitconfig_9532); + if (ivar8 != 0) { + svar6 = svar6 + "
" + "Reward for pking:"; + if (ivar8 > 0) { + svar7 = svar7 + "
" + intToStr(ivar8); + } else { + svar7 = svar7 + "
" + "A key"; + } + } + if (globalint_787 < 0) { + svar6 = svar6 + "
" + "Scoring begins in:"; + if (globalint_787 <= -2147483648) { + svar7 = svar7 + "
" + "-"; + } else { + ivar6 = subtract(0, globalint_787); + } + } + if ((bitconfig_9523 > 0) && (globalint_787 > 0)) { + svar6 = svar6 + "
" + "Time remaining:"; + ivar6 = globalint_787; + } + ivar5 = add(multiply(getLineCount(2147483647, 494, svar6), 10), 2); + ivar0 = add(add(getMaxLineWidth(2147483647, 494, svar0), 3), getMaxLineWidth(2147483647, 494, svar1)); + ivar0 = max(ivar0, getMaxLineWidth(2147483647, 494, svar2)); + ivar1 = add(add(getMaxLineWidth(2147483647, 494, svar3), 3), getMaxLineWidth(2147483647, 494, svar4)); + ivar1 = max(ivar1, getMaxLineWidth(2147483647, 494, svar5)); + ivar3 = add(add(getMaxLineWidth(2147483647, 494, svar6), 3), max(getMaxLineWidth(2147483647, 494, svar7), 40)); + ivar2 = add(add(ivar0, 5), ivar1); + ivar4 = max(ivar3, ivar2); + ivar2 = divide(subtract(ivar4, ivar2), 2); + stack_dump1 = add(ivar0, ivar2); + ivar1 = add(ivar1, ivar2); + ivar0 = stack_dump1; + setWidgetSize(add(ivar4, 8), add(ivar5, 8), 0, 0, new WidgetPointer(1112,1)); + createExtraChild(new WidgetPointer(1112,4), 4, getExtraChildGap(new WidgetPointer(1112,4))); + createExtraChild(new WidgetPointer(1112,4), 4, getExtraChildGap(new WidgetPointer(1112,4))); + setWidgetSize(ivar0, 0, 0, 1); + setWidgetSize(ivar0, 0, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetFont(494); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 0, 0); + setWidgetTextAlignment(2, 0, 0); + setWidgetRGB(new Color(255, 0, 0)); + setWidgetRGB(new Color(255, 0, 0)); + setWidgetText(svar0); + setWidgetText(svar1); + createExtraChild(new WidgetPointer(1112,4), 4, getExtraChildGap(new WidgetPointer(1112,4))); + setWidgetSize(ivar0, 0, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(1, 0, 0); + setWidgetRGB(new Color(255, 0, 0)); + setWidgetText(svar2); + createExtraChild(new WidgetPointer(1112,4), 4, getExtraChildGap(new WidgetPointer(1112,4))); + createExtraChild(new WidgetPointer(1112,4), 4, getExtraChildGap(new WidgetPointer(1112,4))); + setWidgetSize(ivar1, 0, 0, 1); + setWidgetSize(ivar1, 0, 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetFont(494); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 0, 0); + setWidgetTextAlignment(2, 0, 0); + setWidgetRGB(new Color(127, 127, 255)); + setWidgetRGB(new Color(127, 127, 255)); + setWidgetText(svar3); + setWidgetText(svar4); + createExtraChild(new WidgetPointer(1112,4), 4, getExtraChildGap(new WidgetPointer(1112,4))); + setWidgetSize(ivar1, 0, 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(1, 0, 0); + setWidgetRGB(new Color(127, 127, 255)); + setWidgetText(svar5); + if (strLength(svar0) > 0) { + createExtraChild(new WidgetPointer(1112,4), 9, getExtraChildGap(new WidgetPointer(1112,4))); + createExtraChild(new WidgetPointer(1112,4), 9, getExtraChildGap(new WidgetPointer(1112,4))); + setWidgetSize(0, 27, 0, 0); + setWidgetSize(0, 27, 0, 0); + setWidgetPosition(add(ivar0, 2), 3, 0, 0); + setWidgetPosition(add(getWidgetActualX(), 1), add(getWidgetActualY(), 1), 0, 0); + setWidgetRGB(new Color(127, 127, 127)); + setWidgetRGB(new Color(63, 63, 63)); + } + createExtraChild(new WidgetPointer(1112,4), 4, getExtraChildGap(new WidgetPointer(1112,4))); + createExtraChild(new WidgetPointer(1112,4), 4, getExtraChildGap(new WidgetPointer(1112,4))); + setWidgetSize(ivar3, 0, 0, 1); + setWidgetSize(ivar3, 0, 0, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetFont(494); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 0, 0); + setWidgetTextAlignment(2, 0, 0); + setWidgetRGB(new Color(207, 207, 207)); + setWidgetRGB(new Color(207, 207, 207)); + setWidgetText(svar6); + setWidgetText(svar7); + if (ivar6 > 0) { + createExtraChild(new WidgetPointer(1112,4), 4, getExtraChildGap(new WidgetPointer(1112,4))); + setWidgetSize(ivar3, 12, 0, 0); + setWidgetPosition(divide(max(subtract(ivar4, ivar3), 0), 2), 0, 2, 2); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(2, 0, 0); + setWidgetRGB(new Color(207, 207, 207)); + ivar7 = multiply(ivar6, 30); + if ((ivar7 > globalint_995) || (add(ivar7, 29) < globalint_995)) { + globalint_995 = add(ivar7, 15); + } + setWidgetText(script_5094()); + setScriptCallOnGameloop(5093, new WidgetPointer(-32768,3), -2147483643, "Ii"); + } + } + return; +} diff --git a/dumps/scripts/5093.cs2 b/dumps/scripts/5093.cs2 new file mode 100644 index 000000000..05ec01379 --- /dev/null +++ b/dumps/scripts/5093.cs2 @@ -0,0 +1,7 @@ +void script_5093(int arg0,int arg1) { + globalint_995 = max(subtract(globalint_995, 1), 0); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetText(script_5094()); + } + return; +} diff --git a/dumps/scripts/5094.cs2 b/dumps/scripts/5094.cs2 new file mode 100644 index 000000000..eac2c4a63 --- /dev/null +++ b/dumps/scripts/5094.cs2 @@ -0,0 +1,27 @@ +string script_5094() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + string svar1; + int stack_dump0; + ivar0 = divide(globalint_995, 50); + ivar1 = divide(ivar0, 60); + ivar2 = divide(ivar1, 60); + stack_dump0 = mod(ivar1, 60); + ivar0 = mod(ivar0, 60); + ivar1 = stack_dump0; + svar0 = ""; + svar1 = ""; + if (ivar1 < 10) { + svar1 = "0" + intToStr(ivar1); + } else { + svar1 = intToStr(ivar1); + } + if (ivar0 < 10) { + svar0 = "0" + intToStr(ivar0); + } else { + svar0 = intToStr(ivar0); + } + return intToStr(ivar2) + ":" + svar1 + ":" + svar0; +} diff --git a/dumps/scripts/5095.cs2 b/dumps/scripts/5095.cs2 new file mode 100644 index 000000000..781e3035c --- /dev/null +++ b/dumps/scripts/5095.cs2 @@ -0,0 +1,6 @@ +void script_5095(int arg0) { + setScriptCallOnConfigChange(5096, 1736, 1735, 2, "Y", new WidgetPointer(arg0)); + setScriptCallOnGlobalStringChange(5096, 129, 1, "Y", new WidgetPointer(arg0)); + script_5097(); + return; +} diff --git a/dumps/scripts/5096.cs2 b/dumps/scripts/5096.cs2 new file mode 100644 index 000000000..940438020 --- /dev/null +++ b/dumps/scripts/5096.cs2 @@ -0,0 +1,4 @@ +void script_5096() { + script_5097(); + return; +} diff --git a/dumps/scripts/5097.cs2 b/dumps/scripts/5097.cs2 new file mode 100644 index 000000000..0c5ab92bf --- /dev/null +++ b/dumps/scripts/5097.cs2 @@ -0,0 +1,62 @@ +void script_5097() { + switch (bitconfig_9539) { + case 1: + setWidgetText(new WidgetPointer(1113,4), "Unable to load your clan data."); + setWidgetText(new WidgetPointer(1113,6), "Sorry!"); + setWidgetSprite(7532, new WidgetPointer(1113,7)); + setWidgetText(new WidgetPointer(1113,8), "Please try again later when the system is less busy."); + break; + case 2: + setWidgetText(new WidgetPointer(1113,4), "And the winner is:"); + setWidgetText(new WidgetPointer(1113,6), "" + "Red Team!" + ""); + setWidgetSprite(7531, new WidgetPointer(1113,7)); + if (((boolean)bitconfig_9540)) { + setWidgetText(new WidgetPointer(1113,8), "Congratulations, your team won!"); + } else if (bitconfig_9540 == 2) { + setWidgetText(new WidgetPointer(1113,8), "Oh dear, better luck next time."); + } else { + setWidgetText(new WidgetPointer(1113,8), "Better luck next time to the Blue Team."); + } + break; + case 3: + setWidgetText(new WidgetPointer(1113,4), "And the winner is:"); + setWidgetText(new WidgetPointer(1113,6), "" + "Blue Team!" + ""); + setWidgetSprite(7530, new WidgetPointer(1113,7)); + if (bitconfig_9540 == 2) { + setWidgetText(new WidgetPointer(1113,8), "Congratulations, your team won!"); + } else if (((boolean)bitconfig_9540)) { + setWidgetText(new WidgetPointer(1113,8), "Oh dear, better luck next time."); + } else { + setWidgetText(new WidgetPointer(1113,8), "Better luck next time to the Red Team."); + } + break; + case 5: + setWidgetText(new WidgetPointer(1113,4), "And the result is:"); + setWidgetText(new WidgetPointer(1113,6), "It's a draw!"); + setWidgetSprite(7532, new WidgetPointer(1113,7)); + setWidgetText(new WidgetPointer(1113,8), "Well done, everyone!"); + break; + case 4: + setWidgetText(new WidgetPointer(1113,4), "And the winner is:"); + if (strLength(globalstring_129) > 0) { + setWidgetText(new WidgetPointer(1113,6), globalstring_129); + } else { + setWidgetText(new WidgetPointer(1113,6), "... missing!"); + } + setWidgetSprite(7532, new WidgetPointer(1113,7)); + setWidgetText(new WidgetPointer(1113,8), "Better luck next time to everyone else."); + break; + case 6: + setWidgetText(new WidgetPointer(1113,4), "And the winner is:"); + setWidgetText(new WidgetPointer(1113,6), "YOU!"); + setWidgetSprite(7532, new WidgetPointer(1113,7)); + setWidgetText(new WidgetPointer(1113,8), "Congratulations!"); + break; + default: + setWidgetText(new WidgetPointer(1113,4), ""); + setWidgetText(new WidgetPointer(1113,6), ""); + setWidgetSprite(-1, new WidgetPointer(1113,7)); + setWidgetText(new WidgetPointer(1113,8), ""); + } + return; +} diff --git a/dumps/scripts/5098.cs2 b/dumps/scripts/5098.cs2 new file mode 100644 index 000000000..3222aa7c1 --- /dev/null +++ b/dumps/scripts/5098.cs2 @@ -0,0 +1,3 @@ +void script_5098() { + return; +} diff --git a/dumps/scripts/5099.cs2 b/dumps/scripts/5099.cs2 new file mode 100644 index 000000000..85c2caa7d --- /dev/null +++ b/dumps/scripts/5099.cs2 @@ -0,0 +1,31 @@ +void script_5099(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,string arg10) { + switch (arg0) { + case 1: + script_5100(1, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 73138333, 73138179, 73138211, 73138229, 73138210, 73138228, 73138236, 73138238, 73138248, 73138257, 73138258, arg10); + break; + case 2: + script_5100(2, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 73138378, 73138179, 73138339, 73138381, 73138338, 73138379, 73138367, 73138342, 73138353, 73138363, 73138364, arg10); + break; + case 3: + script_5100(3, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 73138427, 73138179, 73138388, 73138430, 73138387, 73138428, 73138416, 73138391, 73138402, 73138412, 73138413, arg10); + break; + case 4: + script_5100(4, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 73138476, 73138179, 73138437, 73138479, 73138436, 73138477, 73138465, 73138440, 73138451, 73138461, 73138462, arg10); + break; + case 5: + script_5100(5, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 73138525, 73138179, 73138486, 73138528, 73138485, 73138526, 73138514, 73138489, 73138500, 73138510, 73138511, arg10); + break; + case 6: + script_5100(6, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 73138574, 73138179, 73138535, 73138577, 73138534, 73138575, 73138563, 73138538, 73138549, 73138559, 73138560, arg10); + break; + case 7: + script_5100(7, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 73138623, 73138179, 73138584, 73138626, 73138583, 73138624, 73138612, 73138587, 73138598, 73138608, 73138609, arg10); + break; + case 8: + script_5100(8, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 73138672, 73138179, 73138633, 73138675, 73138632, 73138673, 73138661, 73138636, 73138647, 73138657, 73138658, arg10); + break; + case 9: + script_5100(9, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 73138721, 73138179, 73138682, 73138724, 73138681, 73138722, 73138710, 73138685, 73138696, 73138706, 73138707, arg10); + } + return; +} diff --git a/dumps/scripts/51.cs2 b/dumps/scripts/51.cs2 new file mode 100644 index 000000000..9ececb440 --- /dev/null +++ b/dumps/scripts/51.cs2 @@ -0,0 +1,4 @@ +void script_51() { + cs2method5424(2828060, 0, 7301469, 0, 2026, 2027, 2029, 2028, 2030, 13023381, 15656390); + return; +} diff --git a/dumps/scripts/510.cs2 b/dumps/scripts/510.cs2 new file mode 100644 index 000000000..dc7949827 --- /dev/null +++ b/dumps/scripts/510.cs2 @@ -0,0 +1,4 @@ +void script_510() { + globalint_51 = getWidget3DDistance(new WidgetPointer(605,0)); + return; +} diff --git a/dumps/scripts/5100.cs2 b/dumps/scripts/5100.cs2 new file mode 100644 index 000000000..e495ee81b --- /dev/null +++ b/dumps/scripts/5100.cs2 @@ -0,0 +1,32 @@ +void script_5100(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,string arg21) { + setWidgetIsHidden(true, new WidgetPointer(arg13)); + setWidgetIsHidden(false, new WidgetPointer(arg12)); + setWidgetIsHidden(true, new WidgetPointer(arg15)); + setWidgetContextMenuOption(1, new WidgetPointer(arg14), "Details"); + setWidgetText(new WidgetPointer(arg16), arg21); + switch (arg7) { + case -2: + setWidgetSprite(6194, new WidgetPointer(arg10)); + break; + case -1: + setWidgetSprite(6195, new WidgetPointer(arg10)); + break; + case 0: + setWidgetSprite(6196, new WidgetPointer(arg10)); + break; + case 1: + setWidgetSprite(6197, new WidgetPointer(arg10)); + break; + case 2: + setWidgetSprite(6198, new WidgetPointer(arg10)); + } + setWidgetSprite(arg1, new WidgetPointer(arg17)); + setWidgetSprite(arg2, new WidgetPointer(arg18)); + setWidgetRGB(new Color(getColorRelatedMethod4020(arg3)), new WidgetPointer(arg17)); + setWidgetRGB(new Color(getColorRelatedMethod4020(arg4)), new WidgetPointer(arg18)); + setWidgetRGB(new Color(getColorRelatedMethod4020(arg5)), new WidgetPointer(arg19)); + setWidgetRGB(new Color(getColorRelatedMethod4020(arg6)), new WidgetPointer(arg20)); + setScriptCallOnClickContextMenu(5111, arg0, arg8, "i1", new WidgetPointer(arg14)); + setWidgetIsHidden(true, new WidgetPointer(arg13)); + return; +} diff --git a/dumps/scripts/5101.cs2 b/dumps/scripts/5101.cs2 new file mode 100644 index 000000000..9b7e1eed1 --- /dev/null +++ b/dumps/scripts/5101.cs2 @@ -0,0 +1,31 @@ +void script_5101(int arg0) { + switch (arg0) { + case 1: + script_5102(73138228, 73138229, 73138266); + break; + case 2: + script_5102(73138379, 73138381, 73138382); + break; + case 3: + script_5102(73138428, 73138430, 73138431); + break; + case 4: + script_5102(73138477, 73138479, 73138480); + break; + case 5: + script_5102(73138526, 73138528, 73138529); + break; + case 6: + script_5102(73138575, 73138577, 73138578); + break; + case 7: + script_5102(73138624, 73138626, 73138627); + break; + case 8: + script_5102(73138673, 73138675, 73138676); + break; + case 9: + script_5102(73138722, 73138724, 73138725); + } + return; +} diff --git a/dumps/scripts/5102.cs2 b/dumps/scripts/5102.cs2 new file mode 100644 index 000000000..8dbe94b71 --- /dev/null +++ b/dumps/scripts/5102.cs2 @@ -0,0 +1,6 @@ +void script_5102(int arg0,int arg1,int arg2) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetText(new WidgetPointer(arg2), "Clan settings prevent viewing this relationship"); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5103.cs2 b/dumps/scripts/5103.cs2 new file mode 100644 index 000000000..10ab137e2 --- /dev/null +++ b/dumps/scripts/5103.cs2 @@ -0,0 +1,31 @@ +void script_5103(int arg0,int arg1) { + switch (arg0) { + case 1: + script_5104(arg1, 73138211, 73138229, 73138266, 73138210, 73138228); + break; + case 2: + script_5104(arg1, 73138339, 73138381, 73138382, 73138338, 73138379); + break; + case 3: + script_5104(arg1, 73138388, 73138430, 73138431, 73138387, 73138428); + break; + case 4: + script_5104(arg1, 73138437, 73138479, 73138480, 73138436, 73138477); + break; + case 5: + script_5104(arg1, 73138486, 73138528, 73138529, 73138485, 73138526); + break; + case 6: + script_5104(arg1, 73138535, 73138577, 73138578, 73138534, 73138575); + break; + case 7: + script_5104(arg1, 73138584, 73138626, 73138627, 73138583, 73138624); + break; + case 8: + script_5104(arg1, 73138633, 73138675, 73138676, 73138632, 73138673); + break; + case 9: + script_5104(arg1, 73138682, 73138724, 73138725, 73138681, 73138722); + } + return; +} diff --git a/dumps/scripts/5104.cs2 b/dumps/scripts/5104.cs2 new file mode 100644 index 000000000..a151e0477 --- /dev/null +++ b/dumps/scripts/5104.cs2 @@ -0,0 +1,14 @@ +void script_5104(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(arg3), "Click to add" + "
" + "clan relationship"); + setWidgetContextMenuOption(1, new WidgetPointer(arg4), "Add"); + setWidgetIsHidden(true, new WidgetPointer(arg5)); + } else { + setWidgetText(new WidgetPointer(arg3), "No clan set"); + setWidgetNoOptions(new WidgetPointer(arg4)); + setWidgetIsHidden(false, new WidgetPointer(arg5)); + } + return; +} diff --git a/dumps/scripts/5105.cs2 b/dumps/scripts/5105.cs2 new file mode 100644 index 000000000..32e5e016d --- /dev/null +++ b/dumps/scripts/5105.cs2 @@ -0,0 +1,4 @@ +void script_5105() { + script_5106(); + return; +} diff --git a/dumps/scripts/5106.cs2 b/dumps/scripts/5106.cs2 new file mode 100644 index 000000000..28ef47820 --- /dev/null +++ b/dumps/scripts/5106.cs2 @@ -0,0 +1,49 @@ +void script_5106() { + setWidgetIsHidden(true, new WidgetPointer(1116,33)); + setWidgetIsHidden(true, new WidgetPointer(1116,161)); + setWidgetIsHidden(true, new WidgetPointer(1116,210)); + setWidgetIsHidden(true, new WidgetPointer(1116,259)); + setWidgetIsHidden(true, new WidgetPointer(1116,308)); + setWidgetIsHidden(true, new WidgetPointer(1116,357)); + setWidgetIsHidden(true, new WidgetPointer(1116,406)); + setWidgetIsHidden(true, new WidgetPointer(1116,455)); + setWidgetIsHidden(true, new WidgetPointer(1116,504)); + switch (standart_config_2317) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(1116,33)); + script_5107(standart_config_2307); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1116,161)); + script_5107(standart_config_2308); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(1116,210)); + script_5107(standart_config_2309); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(1116,259)); + script_5107(standart_config_2310); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(1116,308)); + script_5107(standart_config_2311); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(1116,357)); + script_5107(standart_config_2312); + break; + case 7: + setWidgetIsHidden(false, new WidgetPointer(1116,406)); + script_5107(standart_config_2313); + break; + case 8: + setWidgetIsHidden(false, new WidgetPointer(1116,455)); + script_5107(standart_config_2314); + break; + case 9: + setWidgetIsHidden(false, new WidgetPointer(1116,504)); + script_5107(standart_config_2315); + } + return; +} diff --git a/dumps/scripts/5107.cs2 b/dumps/scripts/5107.cs2 new file mode 100644 index 000000000..083ada441 --- /dev/null +++ b/dumps/scripts/5107.cs2 @@ -0,0 +1,24 @@ +void script_5107(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(1116,115)); + setWidgetIsHidden(true, new WidgetPointer(1116,122)); + setWidgetIsHidden(true, new WidgetPointer(1116,108)); + setWidgetIsHidden(true, new WidgetPointer(1116,101)); + setWidgetIsHidden(true, new WidgetPointer(1116,94)); + switch (arg0) { + case -2: + setWidgetIsHidden(false, new WidgetPointer(1116,115)); + break; + case -1: + setWidgetIsHidden(false, new WidgetPointer(1116,122)); + break; + case 0: + setWidgetIsHidden(false, new WidgetPointer(1116,108)); + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(1116,101)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1116,94)); + } + return; +} diff --git a/dumps/scripts/5108.cs2 b/dumps/scripts/5108.cs2 new file mode 100644 index 000000000..bea669036 --- /dev/null +++ b/dumps/scripts/5108.cs2 @@ -0,0 +1,12 @@ +void script_5108(int arg0) { + if (((boolean)arg0)) { + setWidgetSize(0, 20, 1, 1, new WidgetPointer(1116,50)); + setWidgetIsHidden(false, new WidgetPointer(1116,40)); + script_5110(1); + } else { + setWidgetSize(0, 0, 1, 1, new WidgetPointer(1116,50)); + setWidgetIsHidden(true, new WidgetPointer(1116,40)); + script_5110(0); + } + return; +} diff --git a/dumps/scripts/5109.cs2 b/dumps/scripts/5109.cs2 new file mode 100644 index 000000000..cb58e9aac --- /dev/null +++ b/dumps/scripts/5109.cs2 @@ -0,0 +1,4 @@ +void script_5109(int arg0) { + script_5110(arg0); + return; +} diff --git a/dumps/scripts/511.cs2 b/dumps/scripts/511.cs2 new file mode 100644 index 000000000..8d85b5111 --- /dev/null +++ b/dumps/scripts/511.cs2 @@ -0,0 +1,9 @@ +void script_511() { + if (globalint_51 > 170) { + globalint_51 = subtract(globalint_51, 1); + setWidget3DRotation(0, 0, 0, 0, 0, globalint_51, new WidgetPointer(605,0)); + } else { + setWidgetModel(-1, new WidgetPointer(605,0)); + } + return; +} diff --git a/dumps/scripts/5110.cs2 b/dumps/scripts/5110.cs2 new file mode 100644 index 000000000..0a3858004 --- /dev/null +++ b/dumps/scripts/5110.cs2 @@ -0,0 +1,14 @@ +void script_5110(int arg0) { + if (((boolean)arg0)) { + setWidgetIsHidden(false, new WidgetPointer(1116,561)); + setWidgetIsHidden(true, new WidgetPointer(1116,553)); + setWidgetIsHidden(false, new WidgetPointer(1116,3)); + setWidgetIsHidden(true, new WidgetPointer(1116,4)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1116,561)); + setWidgetIsHidden(false, new WidgetPointer(1116,553)); + setWidgetIsHidden(true, new WidgetPointer(1116,3)); + setWidgetIsHidden(false, new WidgetPointer(1116,4)); + } + return; +} diff --git a/dumps/scripts/5111.cs2 b/dumps/scripts/5111.cs2 new file mode 100644 index 000000000..513a04a49 --- /dev/null +++ b/dumps/scripts/5111.cs2 @@ -0,0 +1,10 @@ +void script_5111(int arg0,int arg1) { + standart_config_2317 = arg0; + if (((boolean)arg1)) { + script_5108(1); + } else { + script_5108(0); + } + script_5113(arg1); + return; +} diff --git a/dumps/scripts/5112.cs2 b/dumps/scripts/5112.cs2 new file mode 100644 index 000000000..de9136166 --- /dev/null +++ b/dumps/scripts/5112.cs2 @@ -0,0 +1,4 @@ +void script_5112(int arg0,int arg1) { + script_5113(arg1); + return; +} diff --git a/dumps/scripts/5113.cs2 b/dumps/scripts/5113.cs2 new file mode 100644 index 000000000..64fac768c --- /dev/null +++ b/dumps/scripts/5113.cs2 @@ -0,0 +1,31 @@ +void script_5113(int arg0) { + switch (standart_config_2317) { + case 1: + script_5114(73138236, 73138238, 73138248, 73138257, 73138258, 73138333, arg0); + break; + case 2: + script_5114(73138367, 73138342, 73138353, 73138363, 73138364, 73138378, arg0); + break; + case 3: + script_5114(73138416, 73138391, 73138402, 73138412, 73138413, 73138427, arg0); + break; + case 4: + script_5114(73138465, 73138440, 73138451, 73138461, 73138462, 73138476, arg0); + break; + case 5: + script_5114(73138514, 73138489, 73138500, 73138510, 73138511, 73138525, arg0); + break; + case 6: + script_5114(73138563, 73138538, 73138549, 73138559, 73138560, 73138574, arg0); + break; + case 7: + script_5114(73138612, 73138587, 73138598, 73138608, 73138609, 73138623, arg0); + break; + case 8: + script_5114(73138661, 73138636, 73138647, 73138657, 73138658, 73138672, arg0); + break; + case 9: + script_5114(73138710, 73138685, 73138696, 73138706, 73138707, 73138721, arg0); + } + return; +} diff --git a/dumps/scripts/5114.cs2 b/dumps/scripts/5114.cs2 new file mode 100644 index 000000000..b0eb3c219 --- /dev/null +++ b/dumps/scripts/5114.cs2 @@ -0,0 +1,51 @@ +void script_5114(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + string svar0; + setWidgetIsHidden(true, new WidgetPointer(1116,85)); + setWidgetText(new WidgetPointer(1116,600), getWidgetText(new WidgetPointer(arg0))); + setWidgetSprite(getWidgetSpriteId(new WidgetPointer(arg1)), new WidgetPointer(1116,602)); + setWidgetSprite(getWidgetSpriteId(new WidgetPointer(arg2)), new WidgetPointer(1116,615)); + setWidgetRGB(getWidgetRGB(new WidgetPointer(arg1)), new WidgetPointer(1116,602)); + setWidgetRGB(getWidgetRGB(new WidgetPointer(arg2)), new WidgetPointer(1116,615)); + setWidgetRGB(getWidgetRGB(new WidgetPointer(arg3)), new WidgetPointer(1116,611)); + setWidgetRGB(getWidgetRGB(new WidgetPointer(arg4)), new WidgetPointer(1116,612)); + svar0 = ""; + switch (getWidgetSpriteId(new WidgetPointer(arg5))) { + case 6194: + setWidgetSprite(6199, new WidgetPointer(1116,591)); + svar0 = "This clan is flagged as a nemesis."; + break; + case 6195: + setWidgetSprite(6200, new WidgetPointer(1116,591)); + svar0 = "This clan is flagged as an enemy."; + break; + case 6196: + setWidgetSprite(6201, new WidgetPointer(1116,591)); + svar0 = "This clan is flagged as neutral."; + break; + case 6197: + setWidgetSprite(6202, new WidgetPointer(1116,591)); + svar0 = "This clan is flagged as a friend."; + break; + case 6198: + setWidgetSprite(6203, new WidgetPointer(1116,591)); + svar0 = "This clan is flagged as an ally."; + } + setScriptCallOnMouseOver(4538, new WidgetPointer(1116,51), new WidgetPointer(1116,591), -1, svar0, 180, 3793, 3793, 16777215, 13, 4, 3, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1116,591)); + setScriptCallOnMouseExit(40, new WidgetPointer(1116,51), "I", new WidgetPointer(1116,591)); + script_5106(); + if (((boolean)arg6)) { + if (isWidgetHidden(new WidgetPointer(1116,3))) { + setWidgetIsHidden(false, new WidgetPointer(1116,4)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1116,3)); + } + setWidgetIsHidden(true, new WidgetPointer(1116,115)); + setWidgetIsHidden(true, new WidgetPointer(1116,122)); + setWidgetIsHidden(true, new WidgetPointer(1116,108)); + setWidgetIsHidden(true, new WidgetPointer(1116,101)); + setWidgetIsHidden(true, new WidgetPointer(1116,94)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1116,40)); + } + return; +} diff --git a/dumps/scripts/5115.cs2 b/dumps/scripts/5115.cs2 new file mode 100644 index 000000000..1bc4e6245 --- /dev/null +++ b/dumps/scripts/5115.cs2 @@ -0,0 +1,8 @@ +void script_5115(int arg0,int arg1) { + if (((boolean)arg1)) { + setWidgetSprite(7436, new WidgetPointer(arg0)); + } else { + setWidgetSprite(7435, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/5116.cs2 b/dumps/scripts/5116.cs2 new file mode 100644 index 000000000..cea50d642 --- /dev/null +++ b/dumps/scripts/5116.cs2 @@ -0,0 +1,7 @@ +int script_5116(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 4515; + ivar3 = cs2method_3408(105, 103, ivar2, arg0); + return cs2method_3408(105, 74, ivar3, arg1); +} diff --git a/dumps/scripts/5117.cs2 b/dumps/scripts/5117.cs2 new file mode 100644 index 000000000..2b269c403 --- /dev/null +++ b/dumps/scripts/5117.cs2 @@ -0,0 +1,5 @@ +int script_5117(int arg0,int arg1) { + int ivar2; + ivar2 = cs2method_3408(105, 103, 4520, arg0); + return cs2method_3408(105, 74, ivar2, arg1); +} diff --git a/dumps/scripts/5118.cs2 b/dumps/scripts/5118.cs2 new file mode 100644 index 000000000..93512f19e --- /dev/null +++ b/dumps/scripts/5118.cs2 @@ -0,0 +1,53 @@ +void script_5118(int arg0) { + int ivar1; + int ivar2; + int ivar3; + string svar0; + script_4534(73334787); + script_4534(73334791); + globalint_777 = -1; + svar0 = ""; + ivar1 = 0; + ivar2 = 0; + ivar3 = add(126, 1); + while (ivar2 <= ivar3) { + createExtraChild(new WidgetPointer(1119,11), 3, getExtraChildGap(new WidgetPointer(1119,11))); + setWidgetSize(0, 14, 1, 0); + setWidgetPosition(0, ivar1, 1, 0); + cs2method2103(255); + createExtraChild(new WidgetPointer(1119,11), 5, getExtraChildGap(new WidgetPointer(1119,11))); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(5, add(ivar1, 1), 0, 0); + svar0 = cs2method_3408(105, 115, 3725, ivar2); + if (strLength(svar0) > 0) { + createExtraChild(new WidgetPointer(1119,11), 4, getExtraChildGap(new WidgetPointer(1119,11))); + setWidgetSize(22, 14, 1, 0); + setWidgetPosition(0, ivar1, 2, 0); + setWidgetTextAlignment(0, 1, 0); + setWidgetFont(494); + setWidgetUnknownBoolean(true); + setWidgetText(svar0); + setWidgetContextMenuOption(1, svar0); + setScriptCallOnClickContextMenu(5119, ivar2, "i"); + ivar1 = add(ivar1, getWidgetActualHeight()); + } else { + setWidgetHidden(1); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(1119,11), 4, getExtraChildGap(new WidgetPointer(1119,11))); + setWidgetHidden(1); + } + ivar2 = add(ivar2, 1); + } + if (ivar1 > getWidgetActualHeight(new WidgetPointer(1119,11))) { + setWidgetScrollMax(0, ivar1, new WidgetPointer(1119,11)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(1119,11)); + } + cs2method2100(0, 0, new WidgetPointer(1119,11)); + script_31(73334796, 73334795, 6507, 6504, 6505, 6506, 6499, 6498); + script_5121(); + setScriptCallOnConfigChange(5120, 1734, 1, "Y", new WidgetPointer(arg0)); + script_5124(); + setScriptCallOnGlobalConfigChange(5123, 696, 1, "Y", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5119.cs2 b/dumps/scripts/5119.cs2 new file mode 100644 index 000000000..8596dc764 --- /dev/null +++ b/dumps/scripts/5119.cs2 @@ -0,0 +1,8 @@ +void script_5119(int arg0) { + if (globalint_777 != arg0) { + playSoundEffect2False(6185, 1, 0, 200); + globalint_777 = arg0; + } + script_5121(); + return; +} diff --git a/dumps/scripts/512.cs2 b/dumps/scripts/512.cs2 new file mode 100644 index 000000000..25a398c3c --- /dev/null +++ b/dumps/scripts/512.cs2 @@ -0,0 +1,4 @@ +void script_512() { + globalint_50 = getWidget3DDistance(new WidgetPointer(605,1)); + return; +} diff --git a/dumps/scripts/5120.cs2 b/dumps/scripts/5120.cs2 new file mode 100644 index 000000000..b85c49fa8 --- /dev/null +++ b/dumps/scripts/5120.cs2 @@ -0,0 +1,4 @@ +void script_5120() { + script_5121(); + return; +} diff --git a/dumps/scripts/5121.cs2 b/dumps/scripts/5121.cs2 new file mode 100644 index 000000000..8209c9313 --- /dev/null +++ b/dumps/scripts/5121.cs2 @@ -0,0 +1,72 @@ +void script_5121() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + deleteAllExtraChilds(new WidgetPointer(1119,19)); + ivar0 = 0; + ivar1 = add(126, 1); + ivar2 = -1; + ivar3 = -1; + while (ivar0 <= ivar1) { + if (ivar0 > bitconfig_9545) { + if (setWidgetRegister(new WidgetPointer(1119,11), multiply(ivar0, 3)) && isWidgetHidden()) { + removeAllEventListeners(); + if (setWidgetRegister(new WidgetPointer(1119,11), add(multiply(ivar0, 3), 1))) { + if (globalint_777 == ivar0) { + setWidgetSprite(5918); + } else { + setWidgetSprite(5922); + } + } + if (setWidgetRegister(new WidgetPointer(1119,11), add(multiply(ivar0, 3), 2))) { + setWidgetRGB(new Color(127, 127, 127)); + } + } + } else if (globalint_777 == ivar0) { + ivar2 = 5917; + ivar3 = 5916; + if (setWidgetRegister(new WidgetPointer(1119,11), multiply(ivar0, 3)) && isWidgetHidden()) { + setScriptCallOnMouseEntered(5122, new WidgetPointer(-32768,3), -2147483643, ivar2, 16777215, "Iidi"); + setScriptCallOnMouseExit(5122, new WidgetPointer(-32768,3), -2147483643, ivar3, 14671823, "Iidi"); + if (setWidgetRegister(new WidgetPointer(1119,11), add(multiply(ivar0, 3), 1))) { + setWidgetSprite(ivar3); + } + if (setWidgetRegister(new WidgetPointer(1119,11), add(multiply(ivar0, 3), 2))) { + setWidgetRGB(new Color(223, 223, 207)); + } + } + } else { + ivar2 = 5921; + ivar3 = 5920; + if (setWidgetRegister(new WidgetPointer(1119,11), multiply(ivar0, 3)) && isWidgetHidden()) { + setScriptCallOnMouseEntered(5122, new WidgetPointer(-32768,3), -2147483643, ivar2, 16777215, "Iidi"); + setScriptCallOnMouseExit(5122, new WidgetPointer(-32768,3), -2147483643, ivar3, 13615023, "Iidi"); + if (setWidgetRegister(new WidgetPointer(1119,11), add(multiply(ivar0, 3), 1))) { + setWidgetSprite(ivar3); + } + if (setWidgetRegister(new WidgetPointer(1119,11), add(multiply(ivar0, 3), 2))) { + setWidgetRGB(new Color(207, 191, 175)); + } + } + } + if (ivar0 <= globalint_777) { + createExtraChild(new WidgetPointer(1119,19), 3, ivar0); + if (ivar0 == globalint_777) { + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + cs2method2103(255); + setWidgetContextMenuOption(1, "Confirm"); + } else { + setWidgetHidden(1); + } + } + ivar0 = add(ivar0, 1); + } + if (globalint_777 >= 0) { + setWidgetIsHidden(true, new WidgetPointer(1119,22)); + } else { + setWidgetIsHidden(false, new WidgetPointer(1119,22)); + } + return; +} diff --git a/dumps/scripts/5122.cs2 b/dumps/scripts/5122.cs2 new file mode 100644 index 000000000..d011ba5d7 --- /dev/null +++ b/dumps/scripts/5122.cs2 @@ -0,0 +1,9 @@ +void script_5122(int arg0,int arg1,int arg2,int arg3) { + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 1))) { + setWidgetSprite(arg2); + } + if (setWidgetRegister(new WidgetPointer(arg0), add(arg1, 2))) { + setWidgetRGB(new Color(arg3)); + } + return; +} diff --git a/dumps/scripts/5123.cs2 b/dumps/scripts/5123.cs2 new file mode 100644 index 000000000..4b0668ce2 --- /dev/null +++ b/dumps/scripts/5123.cs2 @@ -0,0 +1,4 @@ +void script_5123() { + script_5124(); + return; +} diff --git a/dumps/scripts/5124.cs2 b/dumps/scripts/5124.cs2 new file mode 100644 index 000000000..eba2fa633 --- /dev/null +++ b/dumps/scripts/5124.cs2 @@ -0,0 +1,4 @@ +void script_5124() { + setWidgetText(new WidgetPointer(1119,6), cs2method_3408(105, 115, 3725, globalint_696)); + return; +} diff --git a/dumps/scripts/5125.cs2 b/dumps/scripts/5125.cs2 new file mode 100644 index 000000000..e880250f0 --- /dev/null +++ b/dumps/scripts/5125.cs2 @@ -0,0 +1,4 @@ +void script_5125() { + script_5126(); + return; +} diff --git a/dumps/scripts/5126.cs2 b/dumps/scripts/5126.cs2 new file mode 100644 index 000000000..28d8e577b --- /dev/null +++ b/dumps/scripts/5126.cs2 @@ -0,0 +1,5 @@ +void script_5126() { + setWidgetIsHidden(false, new WidgetPointer(1096,33)); + script_4307(); + return; +} diff --git a/dumps/scripts/5127.cs2 b/dumps/scripts/5127.cs2 new file mode 100644 index 000000000..bd6bf92d5 --- /dev/null +++ b/dumps/scripts/5127.cs2 @@ -0,0 +1,6 @@ +void script_5127() { + setWidgetIsHidden(true, new WidgetPointer(1096,33)); + setWidgetIsHidden(false, new WidgetPointer(1096,398)); + setWidgetText(new WidgetPointer(1096,406), "Loading, please wait."); + return; +} diff --git a/dumps/scripts/5128.cs2 b/dumps/scripts/5128.cs2 new file mode 100644 index 000000000..7e4e7e383 --- /dev/null +++ b/dumps/scripts/5128.cs2 @@ -0,0 +1,4 @@ +void script_5128() { + script_5129(); + return; +} diff --git a/dumps/scripts/5129.cs2 b/dumps/scripts/5129.cs2 new file mode 100644 index 000000000..91e14c873 --- /dev/null +++ b/dumps/scripts/5129.cs2 @@ -0,0 +1,6 @@ +void script_5129() { + if (cs2method3701()) { + script_5132(); + } + return; +} diff --git a/dumps/scripts/513.cs2 b/dumps/scripts/513.cs2 new file mode 100644 index 000000000..430856326 --- /dev/null +++ b/dumps/scripts/513.cs2 @@ -0,0 +1,4 @@ +void script_513() { + globalint_51 = 1; + return; +} diff --git a/dumps/scripts/5130.cs2 b/dumps/scripts/5130.cs2 new file mode 100644 index 000000000..9d00fdde1 --- /dev/null +++ b/dumps/scripts/5130.cs2 @@ -0,0 +1,26 @@ +void script_5130() { + globalint_1569 = -1; + globalint_1571 = -1; + globalint_1570 = -1; + globalint_1572 = -1; + globalint_1574 = -1; + globalint_1573 = -1; + globalint_1575 = -1; + globalint_1576 = -1; + globalint_1577 = -1; + globalint_1578 = -1; + globalint_1579 = -1; + globalint_1580 = -1; + globalint_1581 = -1; + globalint_1582 = -1; + globalint_1583 = -1; + globalint_1584 = -1; + globalint_1585 = -1; + globalint_1586 = -1; + globalint_1587 = -1; + globalint_1588 = -1; + globalint_1589 = -1; + globalint_1649 = -1; + globalint_1590 = -1; + return; +} diff --git a/dumps/scripts/5131.cs2 b/dumps/scripts/5131.cs2 new file mode 100644 index 000000000..91c2a05c2 --- /dev/null +++ b/dumps/scripts/5131.cs2 @@ -0,0 +1,6 @@ +int script_5131() { + if ((((((globalint_1572 != -1) && (globalint_1574 != -1)) && ((globalint_1576 != -1) && (globalint_1577 != -1))) && (((globalint_1578 != -1) && (globalint_1579 != -1)) && ((globalint_1580 != -1) && (globalint_1581 != -1)))) && ((((globalint_1582 != -1) && (globalint_1583 != -1)) && ((globalint_1584 != -1) && (globalint_1585 != -1))) && (((globalint_1586 != -1) && (globalint_1587 != -1)) && ((globalint_1588 != -1) && (globalint_1589 != -1))))) && ((((globalint_1649 != -1) && (globalint_1590 != -1)) && ((globalint_1569 != -1) && (globalint_1571 != -1))) && (((globalint_1570 != -1) && (globalint_1573 != -1)) && (globalint_1575 != -1)))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/5132.cs2 b/dumps/scripts/5132.cs2 new file mode 100644 index 000000000..e2d7a8d0f --- /dev/null +++ b/dumps/scripts/5132.cs2 @@ -0,0 +1,7 @@ +void script_5132() { + if (((boolean)script_5131())) { + script_5127(); + script_5133(); + } + return; +} diff --git a/dumps/scripts/5133.cs2 b/dumps/scripts/5133.cs2 new file mode 100644 index 000000000..e759d1128 --- /dev/null +++ b/dumps/scripts/5133.cs2 @@ -0,0 +1,226 @@ +void script_5133() { + int ivar0; + int ivar1; + string svar0; + ivar0 = 0; + ivar1 = script_4293(); + if (((boolean)script_5131())) { + setWidgetIsHidden(true, new WidgetPointer(1096,417)); + setWidgetIsHidden(true, new WidgetPointer(1096,425)); + setWidgetIsHidden(true, new WidgetPointer(1096,433)); + setWidgetIsHidden(true, new WidgetPointer(1096,441)); + setWidgetIsHidden(true, new WidgetPointer(1096,449)); + setWidgetIsHidden(true, new WidgetPointer(1096,457)); + setWidgetIsHidden(true, new WidgetPointer(1096,465)); + setWidgetIsHidden(true, new WidgetPointer(1096,473)); + setWidgetIsHidden(true, new WidgetPointer(1096,481)); + setWidgetIsHidden(true, new WidgetPointer(1096,489)); + setWidgetIsHidden(true, new WidgetPointer(1096,497)); + switch (globalint_1569) { + case 0: + setWidgetIsHidden(false, new WidgetPointer(1096,417)); + if (ivar1 >= 100) { + ivar0 = 1; + } + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(1096,425)); + if (ivar1 >= 100) { + ivar0 = 1; + } + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1096,433)); + if (ivar1 >= 100) { + ivar0 = 1; + } + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(1096,441)); + if (ivar1 >= 100) { + ivar0 = 1; + } + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(1096,449)); + if (ivar1 >= 100) { + ivar0 = 1; + } + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(1096,457)); + if (ivar1 >= 100) { + ivar0 = 1; + } + break; + case 100: + setWidgetIsHidden(false, new WidgetPointer(1096,465)); + if (ivar1 > globalint_1569) { + ivar0 = 1; + } + break; + case 101: + setWidgetIsHidden(false, new WidgetPointer(1096,473)); + if (ivar1 > globalint_1569) { + ivar0 = 1; + } + break; + case 102: + setWidgetIsHidden(false, new WidgetPointer(1096,481)); + if (ivar1 > globalint_1569) { + ivar0 = 1; + } + break; + case 103: + setWidgetIsHidden(false, new WidgetPointer(1096,489)); + if (ivar1 > globalint_1569) { + ivar0 = 1; + } + break; + case 125: + setWidgetIsHidden(false, new WidgetPointer(1096,497)); + if (ivar1 > globalint_1569) { + ivar0 = 1; + } + break; + case 126: + ivar0 = 0; + break; + case 127: + ivar0 = 0; + break; + default: + if (ivar1 >= 100) { + ivar0 = 1; + } + } + } + svar0 = ""; + setWidgetIsHidden(false, new WidgetPointer(1096,584)); + setWidgetIsHidden(false, new WidgetPointer(1096,596)); + setWidgetIsHidden(false, new WidgetPointer(1096,629)); + setWidgetIsHidden(false, new WidgetPointer(1096,640)); + setWidgetIsHidden(false, new WidgetPointer(1096,662)); + setWidgetIsHidden(false, new WidgetPointer(1096,509)); + setWidgetIsHidden(false, new WidgetPointer(1096,618)); + setWidgetIsHidden(false, new WidgetPointer(1096,607)); + setWidgetIsHidden(false, new WidgetPointer(1096,651)); + setWidgetIsHidden(false, new WidgetPointer(1096,573)); + setWidgetIsHidden(false, new WidgetPointer(1096,560)); + setWidgetIsHidden(false, new WidgetPointer(1096,778)); + setWidgetIsHidden(false, new WidgetPointer(1096,765)); + setWidgetIsHidden(false, new WidgetPointer(1096,674)); + setWidgetIsHidden(false, new WidgetPointer(1096,685)); + setWidgetIsHidden(false, new WidgetPointer(1096,697)); + setWidgetIsHidden(false, new WidgetPointer(1096,710)); + setWidgetIsHidden(false, new WidgetPointer(1096,722)); + setWidgetIsHidden(false, new WidgetPointer(1096,819)); + setWidgetIsHidden(false, new WidgetPointer(1096,734)); + setWidgetIsHidden(false, new WidgetPointer(1096,808)); + setWidgetIsHidden(false, new WidgetPointer(1096,746)); + if (((boolean)ivar0)) { + setWidgetIsHidden(true, new WidgetPointer(1096,584)); + setWidgetIsHidden(true, new WidgetPointer(1096,596)); + if (globalint_1569 >= 100) { + setWidgetIsHidden(true, new WidgetPointer(1096,629)); + } else { + svar0 = "Only admins and above may upgrade the citadel."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,629)); + } + if (globalint_1569 >= 100) { + setWidgetIsHidden(true, new WidgetPointer(1096,640)); + } else { + svar0 = "Only admins and above may downgrade the citadel."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,640)); + } + if (globalint_1569 >= 100) { + setWidgetIsHidden(true, new WidgetPointer(1096,662)); + } + setWidgetIsHidden(true, new WidgetPointer(1096,509)); + if (globalint_1569 >= 100) { + setWidgetIsHidden(true, new WidgetPointer(1096,618)); + } else { + svar0 = "Only admins and above may change the noticeboard."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,618)); + } + if (globalint_1569 >= 100) { + setWidgetIsHidden(true, new WidgetPointer(1096,607)); + } else { + svar0 = "Only admins and above may change the signpost."; + setScriptCallOnMouseOver(5139, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,607)); + } + setWidgetIsHidden(true, new WidgetPointer(1096,651)); + if (globalint_1569 >= 100) { + setWidgetIsHidden(true, new WidgetPointer(1096,573)); + } else { + svar0 = "Only admins and above may change who may lock the citadel."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,573)); + } + if (globalint_1569 >= 100) { + setWidgetIsHidden(true, new WidgetPointer(1096,560)); + } else { + svar0 = "Only admins and above may change who may lock the keep."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,560)); + } + if (((boolean)script_5149(ivar1))) { + setWidgetIsHidden(true, new WidgetPointer(1096,778)); + } else { + svar0 = "Your rank does not have permission to change citadel access."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,778)); + } + if (((boolean)script_5148(ivar1))) { + setWidgetIsHidden(true, new WidgetPointer(1096,765)); + } else { + svar0 = "Your rank does not have permission to change keep access."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,765)); + } + setWidgetIsHidden(true, new WidgetPointer(1096,674)); + setWidgetIsHidden(true, new WidgetPointer(1096,685)); + setWidgetIsHidden(true, new WidgetPointer(1096,697)); + setWidgetIsHidden(true, new WidgetPointer(1096,710)); + setWidgetIsHidden(true, new WidgetPointer(1096,722)); + setWidgetIsHidden(true, new WidgetPointer(1096,819)); + if (globalint_1569 >= 100) { + setWidgetIsHidden(true, new WidgetPointer(1096,734)); + } else { + svar0 = "Only admins and above may set gathering goals."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,734)); + } + if (globalint_1569 >= 103) { + setWidgetIsHidden(true, new WidgetPointer(1096,808)); + } else { + svar0 = "Only overseers and above may set the citadel's language."; + setScriptCallOnMouseOver(5139, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,808)); + } + if (globalint_1569 >= 103) { + setWidgetIsHidden(true, new WidgetPointer(1096,746)); + } else { + svar0 = "Only overseers and above may move the build tick."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,746)); + } + } else { + svar0 = "Your rank is not high enough to alter this permission."; + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,629)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,640)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,662)); + setScriptCallOnMouseOver(5139, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,509)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,618)); + setScriptCallOnMouseOver(5139, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,607)); + setScriptCallOnMouseOver(5139, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,651)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,573)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,560)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,778)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,765)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,674)); + setScriptCallOnMouseOver(5139, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,685)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,697)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,710)); + setScriptCallOnMouseOver(5139, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,722)); + setScriptCallOnMouseOver(5139, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,819)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,734)); + setScriptCallOnMouseOver(5139, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,808)); + setScriptCallOnMouseOver(5138, svar0, new WidgetPointer(-32768,3), "sI", new WidgetPointer(1096,746)); + } + script_5135(); + return; +} diff --git a/dumps/scripts/5134.cs2 b/dumps/scripts/5134.cs2 new file mode 100644 index 000000000..4e0b79a19 --- /dev/null +++ b/dumps/scripts/5134.cs2 @@ -0,0 +1,4 @@ +void script_5134() { + script_5135(); + return; +} diff --git a/dumps/scripts/5135.cs2 b/dumps/scripts/5135.cs2 new file mode 100644 index 000000000..91dd0be51 --- /dev/null +++ b/dumps/scripts/5135.cs2 @@ -0,0 +1,115 @@ +void script_5135() { + if (((boolean)script_5131())) { + if (((boolean)globalint_1571)) { + setWidgetIsHidden(false, new WidgetPointer(1096,581)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,581)); + } + if (((boolean)globalint_1570)) { + setWidgetIsHidden(false, new WidgetPointer(1096,593)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,593)); + } + if (((boolean)globalint_1572)) { + setWidgetIsHidden(false, new WidgetPointer(1096,557)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,557)); + } + if (((boolean)globalint_1574)) { + setWidgetIsHidden(false, new WidgetPointer(1096,570)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,570)); + } + if (((boolean)globalint_1573)) { + setWidgetIsHidden(false, new WidgetPointer(1096,762)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,762)); + } + if (((boolean)globalint_1575)) { + setWidgetIsHidden(false, new WidgetPointer(1096,775)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,775)); + } + if (((boolean)globalint_1576)) { + setWidgetIsHidden(false, new WidgetPointer(1096,507)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,507)); + } + if (((boolean)globalint_1577)) { + setWidgetIsHidden(false, new WidgetPointer(1096,671)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,671)); + } + if (((boolean)globalint_1578)) { + setWidgetIsHidden(false, new WidgetPointer(1096,682)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,682)); + } + if (((boolean)globalint_1579)) { + setWidgetIsHidden(false, new WidgetPointer(1096,694)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,694)); + } + if (((boolean)globalint_1580)) { + setWidgetIsHidden(false, new WidgetPointer(1096,707)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,707)); + } + if (((boolean)globalint_1581)) { + setWidgetIsHidden(false, new WidgetPointer(1096,719)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,719)); + } + if (((boolean)globalint_1582)) { + setWidgetIsHidden(false, new WidgetPointer(1096,816)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,816)); + } + if (((boolean)globalint_1583)) { + setWidgetIsHidden(false, new WidgetPointer(1096,615)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,615)); + } + if (((boolean)globalint_1584)) { + setWidgetIsHidden(false, new WidgetPointer(1096,604)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,604)); + } + if (((boolean)globalint_1585)) { + setWidgetIsHidden(false, new WidgetPointer(1096,648)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,648)); + } + if (((boolean)globalint_1586)) { + setWidgetIsHidden(false, new WidgetPointer(1096,626)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,626)); + } + if (((boolean)globalint_1587)) { + setWidgetIsHidden(false, new WidgetPointer(1096,637)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,637)); + } + if (((boolean)globalint_1588)) { + setWidgetIsHidden(false, new WidgetPointer(1096,659)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,659)); + } + if (((boolean)globalint_1589)) { + setWidgetIsHidden(false, new WidgetPointer(1096,731)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,731)); + } + if (((boolean)globalint_1649)) { + setWidgetIsHidden(false, new WidgetPointer(1096,805)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,805)); + } + if (((boolean)globalint_1590)) { + setWidgetIsHidden(false, new WidgetPointer(1096,743)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1096,743)); + } + } + return; +} diff --git a/dumps/scripts/5136.cs2 b/dumps/scripts/5136.cs2 new file mode 100644 index 000000000..ffe78bf82 --- /dev/null +++ b/dumps/scripts/5136.cs2 @@ -0,0 +1,4 @@ +void script_5136(int arg0) { + script_5137(arg0); + return; +} diff --git a/dumps/scripts/5137.cs2 b/dumps/scripts/5137.cs2 new file mode 100644 index 000000000..27abe998d --- /dev/null +++ b/dumps/scripts/5137.cs2 @@ -0,0 +1,21 @@ +void script_5137(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(1096,513)); + setWidgetIsHidden(true, new WidgetPointer(1096,522)); + setWidgetIsHidden(true, new WidgetPointer(1096,530)); + setWidgetIsHidden(true, new WidgetPointer(1096,538)); + setWidgetIsHidden(true, new WidgetPointer(1096,546)); + if (((boolean)arg0)) { + setWidgetIsHidden(false, new WidgetPointer(1096,513)); + } else if (arg0 == 2) { + setWidgetIsHidden(false, new WidgetPointer(1096,522)); + } else if (arg0 == 3) { + setWidgetIsHidden(false, new WidgetPointer(1096,530)); + } else if (arg0 == 4) { + setWidgetIsHidden(false, new WidgetPointer(1096,538)); + } else { + if (arg0 == 5) { + setWidgetIsHidden(false, new WidgetPointer(1096,546)); + } + } + return; +} diff --git a/dumps/scripts/5138.cs2 b/dumps/scripts/5138.cs2 new file mode 100644 index 000000000..30dc4a8b1 --- /dev/null +++ b/dumps/scripts/5138.cs2 @@ -0,0 +1,6 @@ +void script_5138(int arg0,string arg1) { + int ivar1; + ivar1 = add(getWidgetActualX(new WidgetPointer(arg0)), divide(getWidgetActualWidth(new WidgetPointer(arg0)), 2)); + script_4539(71827560, arg0, -1, 150, -1, -1, -1, 13, 4, 2, ivar1, getWidgetActualY(new WidgetPointer(arg0)), arg1); + return; +} diff --git a/dumps/scripts/5139.cs2 b/dumps/scripts/5139.cs2 new file mode 100644 index 000000000..1adeda0ce --- /dev/null +++ b/dumps/scripts/5139.cs2 @@ -0,0 +1,6 @@ +void script_5139(int arg0,string arg1) { + int ivar1; + ivar1 = add(getWidgetActualX(new WidgetPointer(arg0)), divide(getWidgetActualWidth(new WidgetPointer(arg0)), 2)); + script_4539(71827560, arg0, -1, 150, -1, -1, -1, 13, 4, 0, ivar1, getWidgetActualY(new WidgetPointer(arg0)), arg1); + return; +} diff --git a/dumps/scripts/514.cs2 b/dumps/scripts/514.cs2 new file mode 100644 index 000000000..c49f9a4bd --- /dev/null +++ b/dumps/scripts/514.cs2 @@ -0,0 +1,20 @@ +void script_514() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (getDisplayMode() >= 2) { + ivar0 = getWidgetActualWidth(new WidgetPointer(746,9)); + ivar1 = getWidgetActualHeight(new WidgetPointer(746,9)); + if (globalint_51 < ivar0) { + globalint_51 = add(globalint_51, 15); + setWidgetSize(globalint_51, ivar1, 0, 0, new WidgetPointer(610,1)); + } + } else { + if (globalint_51 < 512) { + globalint_51 = add(globalint_51, 15); + setWidgetSize(globalint_51, 334, 0, 0, new WidgetPointer(610,1)); + } + } + return; +} diff --git a/dumps/scripts/5140.cs2 b/dumps/scripts/5140.cs2 new file mode 100644 index 000000000..6fdae9a37 --- /dev/null +++ b/dumps/scripts/5140.cs2 @@ -0,0 +1,65 @@ +void script_5140(int arg0) { + switch (arg0) { + case 71827963: + globalint_1576 = -1; + break; + case 71828013: + globalint_1572 = -1; + break; + case 71828026: + globalint_1574 = -1; + break; + case 71828218: + globalint_1573 = -1; + break; + case 71828231: + globalint_1575 = -1; + break; + case 71828127: + globalint_1577 = -1; + break; + case 71828138: + globalint_1578 = -1; + break; + case 71828150: + globalint_1579 = -1; + break; + case 71828163: + globalint_1580 = -1; + break; + case 71828175: + globalint_1581 = -1; + break; + case 71828272: + globalint_1582 = -1; + break; + case 71828071: + globalint_1583 = -1; + break; + case 71828060: + globalint_1584 = -1; + break; + case 71828104: + globalint_1585 = -1; + break; + case 71828082: + globalint_1586 = -1; + break; + case 71828093: + globalint_1587 = -1; + break; + case 71828115: + globalint_1588 = -1; + break; + case 71828187: + globalint_1589 = -1; + break; + case 71828261: + globalint_1649 = -1; + break; + case 71828199: + globalint_1590 = -1; + } + script_5141(arg0); + return; +} diff --git a/dumps/scripts/5141.cs2 b/dumps/scripts/5141.cs2 new file mode 100644 index 000000000..8c9264be5 --- /dev/null +++ b/dumps/scripts/5141.cs2 @@ -0,0 +1,8 @@ +void script_5141(int arg0) { + if (isWidgetHidden(new WidgetPointer(arg0))) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/5142.cs2 b/dumps/scripts/5142.cs2 new file mode 100644 index 000000000..df2dfe91d --- /dev/null +++ b/dumps/scripts/5142.cs2 @@ -0,0 +1,11 @@ +void script_5142(int arg0) { + switch (arg0) { + case 71828049: + globalint_1570 = -1; + break; + case 71828037: + globalint_1571 = -1; + } + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5143.cs2 b/dumps/scripts/5143.cs2 new file mode 100644 index 000000000..9833356db --- /dev/null +++ b/dumps/scripts/5143.cs2 @@ -0,0 +1,10 @@ +void script_5143(int arg0,int arg1) { + if (isWidgetHidden(new WidgetPointer(arg0))) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/5144.cs2 b/dumps/scripts/5144.cs2 new file mode 100644 index 000000000..014d81f19 --- /dev/null +++ b/dumps/scripts/5144.cs2 @@ -0,0 +1,6 @@ +int script_5144(int arg0) { + if (cs2method3701()) { + return script_5145(arg0); + } + return 0; +} diff --git a/dumps/scripts/5145.cs2 b/dumps/scripts/5145.cs2 new file mode 100644 index 000000000..0374df767 --- /dev/null +++ b/dumps/scripts/5145.cs2 @@ -0,0 +1,41 @@ +int script_5145(int arg0) { + int ivar1; + int ivar2; + ivar1 = -1; + ivar1 = cs2method3717(strRemoveEntities(cs2method5020())); + if (ivar1 < 0) { + return 0; + } + if (arg0 == -1) { + arg0 = cs2method3711(ivar1); + } + ivar2 = 0; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + switch (arg0) { + case 100: + return clanbitconfig_248; + case 101: + return clanbitconfig_249; + case 102: + return clanbitconfig_250; + case 103: + return clanbitconfig_251; + case 125: + return clanbitconfig_252; + case 126: + return 1; + case 127: + return 1; + } + return 0; +} diff --git a/dumps/scripts/5146.cs2 b/dumps/scripts/5146.cs2 new file mode 100644 index 000000000..47f57af65 --- /dev/null +++ b/dumps/scripts/5146.cs2 @@ -0,0 +1,6 @@ +int script_5146(int arg0) { + if (cs2method3701()) { + return script_5147(arg0); + } + return 0; +} diff --git a/dumps/scripts/5147.cs2 b/dumps/scripts/5147.cs2 new file mode 100644 index 000000000..6db5338ee --- /dev/null +++ b/dumps/scripts/5147.cs2 @@ -0,0 +1,41 @@ +int script_5147(int arg0) { + int ivar1; + int ivar2; + ivar1 = -1; + ivar1 = cs2method3717(strRemoveEntities(cs2method5020())); + if (ivar1 < 0) { + return 0; + } + if (arg0 == -1) { + arg0 = cs2method3711(ivar1); + } + ivar2 = 0; + if (citadelConfigsInitialized()) { + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + switch (arg0) { + case 100: + return clanbitconfig_253; + case 101: + return clanbitconfig_254; + case 102: + return clanbitconfig_255; + case 103: + return clanbitconfig_256; + case 125: + return clanbitconfig_257; + case 126: + return 1; + case 127: + return 1; + } + return 0; +} diff --git a/dumps/scripts/5148.cs2 b/dumps/scripts/5148.cs2 new file mode 100644 index 000000000..60fe46227 --- /dev/null +++ b/dumps/scripts/5148.cs2 @@ -0,0 +1,40 @@ +int script_5148(int arg0) { + int ivar1; + ivar1 = -1; + ivar1 = cs2method3717(strRemoveEntities(cs2method5020())); + if (ivar1 < 0) { + return 0; + } + if (arg0 == -1) { + arg0 = cs2method3711(ivar1); + } + switch (arg0) { + case 0: + return 0; + case 1: + return 0; + case 2: + return 0; + case 3: + return 0; + case 4: + return 0; + case 5: + return 0; + case 100: + return clanbitconfig_146; + case 101: + return clanbitconfig_147; + case 102: + return clanbitconfig_148; + case 103: + return clanbitconfig_149; + case 125: + return clanbitconfig_150; + case 126: + return 1; + case 127: + return 1; + } + return 0; +} diff --git a/dumps/scripts/5149.cs2 b/dumps/scripts/5149.cs2 new file mode 100644 index 000000000..60d544325 --- /dev/null +++ b/dumps/scripts/5149.cs2 @@ -0,0 +1,40 @@ +int script_5149(int arg0) { + int ivar1; + ivar1 = -1; + ivar1 = cs2method3717(strRemoveEntities(cs2method5020())); + if (ivar1 < 0) { + return 0; + } + if (arg0 == -1) { + arg0 = cs2method3711(ivar1); + } + switch (arg0) { + case 0: + return 0; + case 1: + return 0; + case 2: + return 0; + case 3: + return 0; + case 4: + return 0; + case 5: + return 0; + case 100: + return clanbitconfig_151; + case 101: + return clanbitconfig_152; + case 102: + return clanbitconfig_153; + case 103: + return clanbitconfig_154; + case 125: + return clanbitconfig_155; + case 126: + return 1; + case 127: + return 1; + } + return 0; +} diff --git a/dumps/scripts/515.cs2 b/dumps/scripts/515.cs2 new file mode 100644 index 000000000..d2c6ed7be --- /dev/null +++ b/dumps/scripts/515.cs2 @@ -0,0 +1,6 @@ +void script_515() { + globalint_51 = 300; + globalint_50 = 0; + globalint_52 = 0; + return; +} diff --git a/dumps/scripts/5150.cs2 b/dumps/scripts/5150.cs2 new file mode 100644 index 000000000..7ff7f767c --- /dev/null +++ b/dumps/scripts/5150.cs2 @@ -0,0 +1,8 @@ +void script_5150(int arg0) { + string svar0; + svar0 = "It would be advisable to retrieve items you have dropped and do not wish to lose."; + if (setWidgetRegister(new WidgetPointer(arg0))) { + setScriptCallOnMouseOver(4538, new WidgetPointer(800,1), new WidgetPointer(-32768,3), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, 2, -2147483647, -2147483646, "IIisifdiiiiii"); + } + return; +} diff --git a/dumps/scripts/5151.cs2 b/dumps/scripts/5151.cs2 new file mode 100644 index 000000000..fe8954d73 --- /dev/null +++ b/dumps/scripts/5151.cs2 @@ -0,0 +1,4 @@ +void script_5151() { + setScriptCallOnGameloop(5152, "", new WidgetPointer(800,6)); + return; +} diff --git a/dumps/scripts/5152.cs2 b/dumps/scripts/5152.cs2 new file mode 100644 index 000000000..dcec5ff08 --- /dev/null +++ b/dumps/scripts/5152.cs2 @@ -0,0 +1,28 @@ +void script_5152() { + int ivar0; + int ivar1; + int ivar2; + string svar0; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + svar0 = ""; + globalint_1563 = max(subtract(globalint_1563, 1), 0); + if (((boolean)mod(globalint_1563, 50))) { + ivar2 = divide(globalint_1563, 50); + ivar1 = mod(ivar2, 60); + ivar0 = divide(ivar2, 60); + svar0 = intToStr(ivar0) + ":"; + if (ivar1 < 10) { + svar0 = concat(svar0, "0" + intToStr(ivar1)); + } else { + svar0 = concat(svar0, intToStr(ivar1)); + } + setWidgetText(new WidgetPointer(800,6), svar0); + } + if (globalint_1563 <= 0) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(800,6)); + sendCloseWidgetPacket(); + } + return; +} diff --git a/dumps/scripts/5153.cs2 b/dumps/scripts/5153.cs2 new file mode 100644 index 000000000..5d806a977 --- /dev/null +++ b/dumps/scripts/5153.cs2 @@ -0,0 +1,9 @@ +void script_5153(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(7543, new WidgetPointer(800,8)); + } else { + setWidgetSprite(7542, new WidgetPointer(800,8)); + script_41(52428801); + } + return; +} diff --git a/dumps/scripts/5154.cs2 b/dumps/scripts/5154.cs2 new file mode 100644 index 000000000..bd676d9cd --- /dev/null +++ b/dumps/scripts/5154.cs2 @@ -0,0 +1,33 @@ +void script_5154(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1348); + ivar3 = getOtherCommonData(arg1, 1355); + ivar4 = getOtherCommonData(arg1, 1356); + ivar5 = getOtherCommonData(arg1, 1358); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 1); + setWidgetSize(8, 20, 0, 0); + setWidgetSprite(ivar2); + cs2method2103(ivar5); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 1, 1); + setWidgetSize(16, 20, 1, 0); + setWidgetSprite(ivar3); + cs2method2103(ivar5); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 2, 1); + setWidgetSize(8, 20, 0, 0); + setWidgetSprite(ivar4); + cs2method2103(ivar5); + cs2method1107(1); + return; +} diff --git a/dumps/scripts/5155.cs2 b/dumps/scripts/5155.cs2 new file mode 100644 index 000000000..d4a17dd28 --- /dev/null +++ b/dumps/scripts/5155.cs2 @@ -0,0 +1,25 @@ +void script_5155(int arg0,int arg1) { + int ivar2; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1346); + if (ivar2 == 2) { + setScriptCallOnMouseEntered(4159, new WidgetPointer(-32768,3), 0, 0, "Iii", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4159, new WidgetPointer(-32768,3), 1, 0, "Iii", new WidgetPointer(arg0)); + } else if (ivar2 == 3) { + setScriptCallOnMousePressed(4162, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseReleased(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(4163, new WidgetPointer(-32768,3), "I", new WidgetPointer(arg0)); + } else { + if (ivar2 == 5) { + return; + } + } + script_5156(arg0, arg1); + if (ivar2 == 4) { + script_4161(arg0, 0); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/5156.cs2 b/dumps/scripts/5156.cs2 new file mode 100644 index 000000000..0a49c7a80 --- /dev/null +++ b/dumps/scripts/5156.cs2 @@ -0,0 +1,19 @@ +void script_5156(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + if ((arg0 == -1) || (arg1 == -1)) { + return; + } + ivar2 = getOtherCommonData(arg1, 1351); + ivar3 = getOtherCommonData(arg1, 1358); + ivar4 = getOtherCommonData(arg1, 1872); + deleteAllExtraChilds(new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 5, getExtraChildGap(new WidgetPointer(arg0))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(9, 60, 0, 0); + setWidgetSprite(ivar2); + cs2method2103(ivar3); + setWidgetHFlip(ivar4); + return; +} diff --git a/dumps/scripts/5157.cs2 b/dumps/scripts/5157.cs2 new file mode 100644 index 000000000..dccd98a77 --- /dev/null +++ b/dumps/scripts/5157.cs2 @@ -0,0 +1,4 @@ +void script_5157(int arg0) { + globalint_1591 = arg0; + return; +} diff --git a/dumps/scripts/5158.cs2 b/dumps/scripts/5158.cs2 new file mode 100644 index 000000000..e04ab312b --- /dev/null +++ b/dumps/scripts/5158.cs2 @@ -0,0 +1,27 @@ +void script_5158(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2347)), new WidgetPointer(arg2)); + ivar3 = getWidgetActualHeight(new WidgetPointer(arg1)); + ivar4 = 1; + if (bitconfig_9642 > 0) { + ivar4 = max(min(subtract(ivar3, multiply(bitconfig_9642, 2)), ivar3), 0); + } + script_5168(ivar4); + ivar5 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar6 = 0; + if (bitconfig_9643 > 0) { + ivar6 = max(min(subtract(ivar5, multiply(bitconfig_9643, divide(ivar5, 8))), ivar5), 0); + ivar6 = max(min(subtract(ivar6, divide(ivar5, 16)), ivar5), 0); + } + ivar7 = 0; + if (bitconfig_9644 > 0) { + ivar7 = max(min(multiply(bitconfig_9644, divide(ivar5, 128)), ivar5), 0); + } + setWidgetRGB(new Color(bitconfig_9642), new WidgetPointer(arg0)); + script_5167(ivar7, ivar6); + return; +} diff --git a/dumps/scripts/5159.cs2 b/dumps/scripts/5159.cs2 new file mode 100644 index 000000000..8dc67cba0 --- /dev/null +++ b/dumps/scripts/5159.cs2 @@ -0,0 +1,6 @@ +void script_5159(int arg0,int arg1,int arg2,int arg3,int arg4) { + globalint_1592 = arg3; + globalint_1593 = arg4; + script_5161(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/516.cs2 b/dumps/scripts/516.cs2 new file mode 100644 index 000000000..7e0d1d4cd --- /dev/null +++ b/dumps/scripts/516.cs2 @@ -0,0 +1,11 @@ +void script_516() { + if (globalint_52 < 300) { + globalint_52 = add(globalint_52, 1); + } + if ((globalint_51 > 0) && ((boolean)mod(globalint_52, 3))) { + globalint_51 = subtract(globalint_51, 3); + globalint_50 = add(globalint_50, 1); + setWidget3DRotation(0, globalint_50, 0, 0, 0, globalint_51, new WidgetPointer(615,0)); + } + return; +} diff --git a/dumps/scripts/5160.cs2 b/dumps/scripts/5160.cs2 new file mode 100644 index 000000000..fea583844 --- /dev/null +++ b/dumps/scripts/5160.cs2 @@ -0,0 +1,8 @@ +void script_5160(int arg0,int arg1,int arg2,int arg3,int arg4) { + if ((globalint_1592 != arg3) || (globalint_1593 != arg4)) { + globalint_1592 = arg3; + globalint_1593 = arg4; + script_5161(arg0, arg1, arg2, arg3, arg4); + } + return; +} diff --git a/dumps/scripts/5161.cs2 b/dumps/scripts/5161.cs2 new file mode 100644 index 000000000..3e3a892ae --- /dev/null +++ b/dumps/scripts/5161.cs2 @@ -0,0 +1,11 @@ +void script_5161(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + ivar5 = getWidgetActualHeight(new WidgetPointer(arg1)); + ivar6 = divide(multiply(subtract(ivar5, arg4), 64), ivar5); + setWidgetRGB(new Color(ivar6), new WidgetPointer(arg0)); + bitconfig_9642 = mod(ivar6, 64); + script_5168(arg4); + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2347)), new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/5162.cs2 b/dumps/scripts/5162.cs2 new file mode 100644 index 000000000..a6c638902 --- /dev/null +++ b/dumps/scripts/5162.cs2 @@ -0,0 +1,6 @@ +void script_5162(int arg0,int arg1,int arg2,int arg3,int arg4) { + globalint_1592 = arg3; + globalint_1593 = arg4; + script_5164(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/5163.cs2 b/dumps/scripts/5163.cs2 new file mode 100644 index 000000000..c189a457e --- /dev/null +++ b/dumps/scripts/5163.cs2 @@ -0,0 +1,8 @@ +void script_5163(int arg0,int arg1,int arg2,int arg3,int arg4) { + if ((globalint_1592 != arg3) || (globalint_1593 != arg4)) { + globalint_1592 = arg3; + globalint_1593 = arg4; + script_5164(arg0, arg1, arg2, arg3, arg4); + } + return; +} diff --git a/dumps/scripts/5164.cs2 b/dumps/scripts/5164.cs2 new file mode 100644 index 000000000..53d586c48 --- /dev/null +++ b/dumps/scripts/5164.cs2 @@ -0,0 +1,13 @@ +void script_5164(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + ivar5 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar6 = divide(multiply(subtract(ivar5, arg4), 8), ivar5); + ivar7 = divide(multiply(arg3, 128), getWidgetActualWidth(new WidgetPointer(arg0))); + bitconfig_9643 = mod(ivar6, 8); + bitconfig_9644 = mod(ivar7, 128); + script_5167(arg3, arg4); + setWidgetRGB(new Color(getColorRelatedMethod4020(standart_config_2347)), new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/5165.cs2 b/dumps/scripts/5165.cs2 new file mode 100644 index 000000000..75409e2c7 --- /dev/null +++ b/dumps/scripts/5165.cs2 @@ -0,0 +1,5 @@ +void script_5165() { + standart_config_2347 = max(0, min(standart_config_2347, 65535)); + sendColorPickerPacket(standart_config_2347); + return; +} diff --git a/dumps/scripts/5166.cs2 b/dumps/scripts/5166.cs2 new file mode 100644 index 000000000..b9b714670 --- /dev/null +++ b/dumps/scripts/5166.cs2 @@ -0,0 +1,5 @@ +void script_5166() { + globalint_1591 = max(0, min(globalint_1591, 65535)); + sendColorPickerPacket(globalint_1591); + return; +} diff --git a/dumps/scripts/5167.cs2 b/dumps/scripts/5167.cs2 new file mode 100644 index 000000000..cea2135bf --- /dev/null +++ b/dumps/scripts/5167.cs2 @@ -0,0 +1,4 @@ +void script_5167(int arg0,int arg1) { + setWidgetPosition(arg0, arg1, 0, 0, new WidgetPointer(1106,20)); + return; +} diff --git a/dumps/scripts/5168.cs2 b/dumps/scripts/5168.cs2 new file mode 100644 index 000000000..6d61ebcab --- /dev/null +++ b/dumps/scripts/5168.cs2 @@ -0,0 +1,4 @@ +void script_5168(int arg0) { + setWidgetPosition(0, add(arg0, 1), 0, 0, new WidgetPointer(1106,19)); + return; +} diff --git a/dumps/scripts/5169.cs2 b/dumps/scripts/5169.cs2 new file mode 100644 index 000000000..cb9e255b5 --- /dev/null +++ b/dumps/scripts/5169.cs2 @@ -0,0 +1,175 @@ +int script_5169(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 1; + if (citadelConfigsInitialized()) { + ivar1 = script_4948(arg0); + if (ivar1 <= 0) { + return 0; + } + ivar2 = script_4959(ivar1); + if (((boolean)ivar2)) { + return 0; + } + switch (ivar1) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 11: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 12: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 13: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 14: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 15: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (ivar3 > 0) { + return 1; + } + return 0; + } + return 0; +} diff --git a/dumps/scripts/517.cs2 b/dumps/scripts/517.cs2 new file mode 100644 index 000000000..aa9437451 --- /dev/null +++ b/dumps/scripts/517.cs2 @@ -0,0 +1,23 @@ +void script_517() { + int ivar0; + string svar0; + svar0 = "" + "Lots!"; + if ((standart_config_1801 >= -1) && (standart_config_1801 < 2147483647)) { + svar0 = formatNumber(divide(standart_config_1801, 10), 1); + } + ivar0 = getTextWidth(495, svar0); + setWidgetSize(max(add(ivar0, 38), 90), 106, 0, 0, new WidgetPointer(548,22)); + setWidgetSize(max(add(ivar0, 40), 90), 106, 0, 0, new WidgetPointer(746,184)); + setWidgetText(new WidgetPointer(746,201), svar0); + setWidgetText(new WidgetPointer(548,38), svar0); + if (((boolean)getLanguage())) { + setWidgetSprite(3066, new WidgetPointer(548,25)); + setWidgetSprite(3066, new WidgetPointer(746,188)); + } + if (((boolean)globalint_1602)) { + } else { + script_3367(); + } + script_3337(); + return; +} diff --git a/dumps/scripts/5170.cs2 b/dumps/scripts/5170.cs2 new file mode 100644 index 000000000..b199d81c6 --- /dev/null +++ b/dumps/scripts/5170.cs2 @@ -0,0 +1,19 @@ +void script_5170() { + setWidgetIsHidden(false, new WidgetPointer(1092,184)); + setWidgetIsHidden(false, new WidgetPointer(1092,185)); + setWidgetIsHidden(false, new WidgetPointer(1092,186)); + setWidgetIsHidden(false, new WidgetPointer(1092,187)); + setWidgetIsHidden(false, new WidgetPointer(1092,188)); + setWidgetIsHidden(false, new WidgetPointer(1092,189)); + setWidgetIsHidden(false, new WidgetPointer(1092,190)); + setWidgetIsHidden(false, new WidgetPointer(1092,191)); + setWidgetIsHidden(false, new WidgetPointer(1092,192)); + setWidgetIsHidden(false, new WidgetPointer(1092,193)); + setWidgetIsHidden(false, new WidgetPointer(1092,194)); + setWidgetIsHidden(false, new WidgetPointer(1092,195)); + setWidgetIsHidden(false, new WidgetPointer(1092,186)); + setWidgetIsHidden(false, new WidgetPointer(1092,213)); + setWidgetIsHidden(false, new WidgetPointer(1092,214)); + setWidgetIsHidden(false, new WidgetPointer(1092,215)); + return; +} diff --git a/dumps/scripts/5171.cs2 b/dumps/scripts/5171.cs2 new file mode 100644 index 000000000..47b44d49a --- /dev/null +++ b/dumps/scripts/5171.cs2 @@ -0,0 +1,351 @@ +int script_5171(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = script_4827(arg0); + if (ivar1 == -1) { + return -1; + } + ivar2 = -1; + ivar3 = 0; + switch (arg0) { + case 21: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 22: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 23: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 24: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 25: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 26: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 27: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 28: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 31: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 32: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 33: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 34: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 35: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 41: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 42: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 43: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 44: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 45: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 51: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 100: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 101: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 102: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 103: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 104: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 105: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 106: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 107: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 108: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 109: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 110: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 111: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 112: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 113: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:107 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (ivar3 <= 0) { + return -1; + } + if (ivar1 == -1) { + return -1; + } + ivar2 = cs2method_3408(105, 100, ivar1, ivar3); + return ivar2; +} diff --git a/dumps/scripts/5172.cs2 b/dumps/scripts/5172.cs2 new file mode 100644 index 000000000..b9ef3b4be --- /dev/null +++ b/dumps/scripts/5172.cs2 @@ -0,0 +1,26 @@ +cs2func_script_5172_struct(2,0,0) script_5172() { + int ivar0; + ivar0 = add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(add(bitconfig_4949, bitconfig_4950), bitconfig_4951), bitconfig_4952), bitconfig_4953), bitconfig_4954), bitconfig_4955), bitconfig_4956), bitconfig_4957), bitconfig_4958), bitconfig_4959), bitconfig_4960), bitconfig_4961), bitconfig_4962), bitconfig_4963), bitconfig_4964), bitconfig_4965), bitconfig_4966), bitconfig_4967), bitconfig_4968), bitconfig_4969), bitconfig_4970), bitconfig_4971), bitconfig_4972), bitconfig_4973), bitconfig_4974), bitconfig_4975), bitconfig_4976), bitconfig_4977), bitconfig_4978), bitconfig_4979), bitconfig_4980), bitconfig_4981), bitconfig_4982), bitconfig_4983), bitconfig_4984), bitconfig_4985), bitconfig_4986), bitconfig_4987), bitconfig_4988), bitconfig_4989), bitconfig_4991), bitconfig_4992), bitconfig_4993), bitconfig_4994), bitconfig_4995), bitconfig_4996), bitconfig_4997), bitconfig_4998), bitconfig_4999), bitconfig_5998), bitconfig_5001), bitconfig_5002), bitconfig_5003), bitconfig_8180), bitconfig_8181), bitconfig_8188), bitconfig_8191), bitconfig_8192), bitconfig_8193), bitconfig_8194), bitconfig_8517), bitconfig_8518), bitconfig_8519), bitconfig_8520), bitconfig_8521), bitconfig_8522), bitconfig_8523), bitconfig_8524), bitconfig_8525), bitconfig_8526), bitconfig_8527), bitconfig_8528), bitconfig_8529), bitconfig_8530), bitconfig_8531), bitconfig_8532), bitconfig_8533), bitconfig_8534), bitconfig_8535), bitconfig_8536), bitconfig_8537), bitconfig_8538), bitconfig_8539), bitconfig_8540), bitconfig_8541), bitconfig_8542), bitconfig_8543), bitconfig_8544), bitconfig_8545), bitconfig_8546), bitconfig_8547), bitconfig_8548), bitconfig_8549), bitconfig_8550), bitconfig_8551), bitconfig_8552), bitconfig_8553), bitconfig_8554), bitconfig_8555), bitconfig_8556), bitconfig_8557), bitconfig_8558), bitconfig_8559), bitconfig_8560), bitconfig_8561), bitconfig_8562), bitconfig_8563), bitconfig_8564), bitconfig_8565), bitconfig_8566), bitconfig_8567), bitconfig_8568), bitconfig_8569), bitconfig_8570), bitconfig_8571), bitconfig_8572), bitconfig_8573), bitconfig_8574), bitconfig_8781), bitconfig_9010), bitconfig_9015), bitconfig_9016), bitconfig_9018), bitconfig_9019), bitconfig_9027); + if (bitconfig_9011 == 3) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_9013 == 3) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_7238 == 60) { + ivar0 = add(ivar0, 1); + } + if (standart_config_107 == 5) { + ivar0 = add(ivar0, 1); + } + if (bitconfig_5733 > 59) { + ivar0 = add(ivar0, 1); + } + if (standart_config_63 == 6) { + ivar0 = add(ivar0, 1); + } + if (standart_config_29 == 2) { + ivar0 = add(ivar0, 1); + } + return newstruct cs2func_script_5172_struct(ivar0, 133); +} diff --git a/dumps/scripts/5173.cs2 b/dumps/scripts/5173.cs2 new file mode 100644 index 000000000..fd6d365ce --- /dev/null +++ b/dumps/scripts/5173.cs2 @@ -0,0 +1,13 @@ +cs2func_script_5173_struct(2,0,0) script_5173() { + int ivar0; + int ivar1; + int stack_dump0; + cs2func_script_5175_struct(2,0,0) structdump_1; + ivar0 = 0; + ivar1 = 0; + stack_dump0 = 2; + structdump_1 = script_5175(stack_dump0); + ivar1 = structdump_1.intpart_1; + ivar0 = structdump_1.intpart_0; + return newstruct cs2func_script_5173_struct(ivar0, ivar1); +} diff --git a/dumps/scripts/5174.cs2 b/dumps/scripts/5174.cs2 new file mode 100644 index 000000000..7e31c9b16 --- /dev/null +++ b/dumps/scripts/5174.cs2 @@ -0,0 +1,13 @@ +cs2func_script_5174_struct(2,0,0) script_5174() { + int ivar0; + int ivar1; + int stack_dump0; + cs2func_script_5175_struct(2,0,0) structdump_1; + ivar0 = 0; + ivar1 = 0; + stack_dump0 = 3; + structdump_1 = script_5175(stack_dump0); + ivar1 = structdump_1.intpart_1; + ivar0 = structdump_1.intpart_0; + return newstruct cs2func_script_5174_struct(ivar0, ivar1); +} diff --git a/dumps/scripts/5175.cs2 b/dumps/scripts/5175.cs2 new file mode 100644 index 000000000..6e1d5a9de --- /dev/null +++ b/dumps/scripts/5175.cs2 @@ -0,0 +1,21 @@ +cs2func_script_5175_struct(2,0,0) script_5175(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = -1; + while (ivar1 <= 428) { + ivar4 = cs2method_3408(105, 74, 3483, ivar1); + if ((getOtherCommonData(ivar4, 1267) == arg0) && ((boolean)getOtherCommonData(ivar4, 1322))) { + ivar3 = add(ivar3, 1); + if (script_3227(ivar1) == 2) { + ivar2 = add(ivar2, 1); + } + } + ivar1 = add(ivar1, 1); + } + return newstruct cs2func_script_5175_struct(ivar2, ivar3); +} diff --git a/dumps/scripts/5176.cs2 b/dumps/scripts/5176.cs2 new file mode 100644 index 000000000..fbd02607c --- /dev/null +++ b/dumps/scripts/5176.cs2 @@ -0,0 +1,294 @@ +void script_5176() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + ivar0 = -1; + ivar1 = 60; + ivar2 = 120; + ivar3 = 34; + ivar4 = 60; + ivar5 = 10; + ivar6 = 6; + ivar7 = 60; + ivar8 = 60; + ivar9 = ivar6; + ivar10 = 0; + ivar11 = -1; + ivar12 = -1; + ivar13 = subtract(ivar3, 21); + ivar14 = 3; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 5523; + ivar19 = 5524; + ivar20 = 5525; + ivar21 = 5526; + ivar22 = 5527; + ivar23 = -1; + ivar24 = 0; + ivar25 = cs2method_3408(105, 105, 4848, bitconfig_9646); + ivar26 = cs2method_3408(105, 74, 4849, ivar25); + while (ivar26 != -1) { + if (((boolean)getOtherCommonData(ivar26, 1882))) { + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(ivar9, 0, 0, 0); + setWidgetSize(ivar1, ivar4, 0, 0); + if (ivar25 == globalint_1596) { + ivar23 = ivar21; + } else { + ivar23 = ivar18; + } + setWidgetSprite(ivar23); + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar23, "Iid"); + setScriptCallOnMousePressed(688, new WidgetPointer(-32768,3), -2147483643, ivar20, "Iid"); + setScriptCallOnMouseReleased(688, new WidgetPointer(-32768,3), -2147483643, ivar23, "Iid"); + setWidgetContextMenuOption(1, "Goal details"); + setScriptCallOnClickContextMenu(5179, ivar25, "i"); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(ivar9, 0, 0, 0); + setWidgetSprite(getOtherCommonData(ivar26, 1881)); + setWidgetSize(ivar1, ivar4, 0, 0); + ivar9 = add(add(ivar9, ivar1), ivar5); + } else { + ivar12 = ivar10; + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(ivar9, 0, 0, 0); + setWidgetSize(7, 7, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(ivar9, 7), 0, 0, 0); + setWidgetSize(subtract(ivar2, 14), 7, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(subtract(add(ivar9, ivar2), 7), 0, 0, 0); + setWidgetSize(7, 7, 0, 0); + setWidgetHFlip(1); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(ivar9, 7, 0, 0); + setWidgetSize(7, 7, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(ivar9, 7), 7, 0, 0); + setWidgetSize(subtract(ivar2, 14), 7, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(subtract(add(ivar9, ivar2), 7), 7, 0, 0); + setWidgetSize(7, 7, 0, 0); + setWidgetHFlip(1); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(ivar9, 14, 0, 0); + setWidgetSize(7, ivar13, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(ivar9, 7), 14, 0, 0); + setWidgetSize(subtract(ivar2, 14), ivar13, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(subtract(add(ivar9, ivar2), 7), 14, 0, 0); + setWidgetSize(7, ivar13, 0, 0); + setWidgetHFlip(1); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(ivar9, subtract(ivar3, 7), 0, 0); + setWidgetSize(7, 7, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(ivar9, 7), subtract(ivar3, 7), 0, 0); + setWidgetSize(subtract(ivar2, 14), 7, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(subtract(add(ivar9, ivar2), 7), subtract(ivar3, 7), 0, 0); + setWidgetSize(7, 7, 0, 0); + setWidgetHFlip(1); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(ivar9, ivar14), ivar3, 0, 0); + setWidgetSize(7, subtract(subtract(ivar4, ivar3), 7), 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(add(ivar9, ivar14), 7), ivar3, 0, 0); + setWidgetSize(subtract(subtract(subtract(ivar2, 14), ivar14), ivar14), subtract(subtract(ivar4, ivar3), 7), 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(subtract(subtract(add(ivar9, ivar2), 7), ivar14), ivar3, 0, 0); + setWidgetSize(7, subtract(subtract(ivar4, ivar3), 7), 0, 0); + setWidgetHFlip(1); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(ivar9, ivar14), subtract(ivar4, 7), 0, 0); + setWidgetSize(7, 7, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(add(ivar9, ivar14), 7), subtract(ivar4, 7), 0, 0); + setWidgetSize(subtract(subtract(subtract(ivar2, 14), ivar14), ivar14), 7, 0, 0); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(subtract(subtract(add(ivar9, ivar2), 7), ivar14), subtract(ivar4, 7), 0, 0); + setWidgetSize(7, 7, 0, 0); + setWidgetHFlip(1); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 4, ivar10); + setWidgetPosition(ivar9, 0, 0, 0); + setWidgetSize(ivar2, ivar3, 0, 0); + setWidgetText("Tasks Complete"); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(235, 224, 188)); + setWidgetFont(3793); + ivar10 = add(ivar10, 1); + switch (ivar25) { + case 4: + ivar15 = 56; + if (((boolean)script_5200(ivar25))) { + ivar16 = 56; + } else { + ivar16 = globalint_1594; + } + break; + case 8: + ivar15 = 17; + if (((boolean)script_5200(ivar25))) { + ivar16 = 17; + } else { + ivar16 = globalint_1594; + } + break; + case 12: + ivar15 = 11; + if (((boolean)script_5200(ivar25))) { + ivar16 = 11; + } else { + ivar16 = globalint_1594; + } + } + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(add(ivar9, ivar14), 7), ivar3, 0, 0); + setWidgetSize(subtract(subtract(subtract(ivar2, ivar14), ivar14), 14), subtract(subtract(ivar4, ivar3), 7), 0, 0); + setWidgetSprite(7536); + ivar10 = add(ivar10, 1); + ivar17 = divide(multiply(subtract(subtract(subtract(ivar2, ivar14), ivar14), 14), ivar16), ivar15); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetPosition(add(add(ivar9, ivar14), 7), ivar3, 0, 0); + setWidgetSize(ivar17, subtract(subtract(ivar4, ivar3), 7), 0, 0); + setWidgetSprite(7540); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 4, ivar10); + setWidgetPosition(ivar9, ivar3, 0, 0); + setWidgetSize(ivar2, subtract(subtract(ivar4, ivar3), 7), 0, 0); + setWidgetText(intToStr(ivar16) + " of " + intToStr(ivar15)); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(235, 224, 188)); + setWidgetFont(3793); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 3, ivar10); + setWidgetPosition(ivar9, 0, 0, 0); + setWidgetSize(ivar2, ivar4, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(255); + if (ivar25 == globalint_1596) { + ivar24 = 4; + } else { + ivar24 = 1; + } + setScriptCallOnMouseEntered(5177, ivar12, 2, "ii"); + setScriptCallOnMouseExit(5177, ivar12, ivar24, "ii"); + setScriptCallOnMousePressed(5177, ivar12, 3, "ii"); + setScriptCallOnMouseReleased(5177, ivar12, ivar24, "ii"); + setWidgetContextMenuOption(1, "Goal details"); + setScriptCallOnClickContextMenu(5179, ivar25, "i"); + ivar9 = add(add(ivar9, ivar2), ivar5); + } + if (((boolean)script_5200(ivar25))) { + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetSize(ivar7, ivar8, 0, 0); + setWidgetPosition(subtract(subtract(ivar9, ivar5), ivar7), subtract(ivar4, ivar7), 0, 0); + setWidgetSprite(7465); + } + ivar25 = getOtherCommonData(ivar26, 1878); + ivar26 = cs2method_3408(105, 74, 4849, ivar25); + ivar10 = add(ivar10, 1); + } + ivar25 = 14; + ivar26 = cs2method_3408(105, 74, 4849, ivar25); + while (ivar26 != -1) { + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetSize(ivar1, ivar4, 0, 0); + setWidgetPosition(ivar9, 0, 0, 0); + if (ivar25 == globalint_1596) { + ivar23 = ivar21; + } else { + ivar23 = ivar18; + } + setWidgetSprite(ivar23); + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar19, "Iid"); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar23, "Iid"); + setScriptCallOnMousePressed(688, new WidgetPointer(-32768,3), -2147483643, ivar20, "Iid"); + setScriptCallOnMouseReleased(688, new WidgetPointer(-32768,3), -2147483643, ivar23, "Iid"); + setWidgetContextMenuOption(1, "Goal details"); + if (globalint_1595 > 3) { + setScriptCallOnClickContextMenu(5179, ivar25, "i"); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetSprite(getOtherCommonData(ivar26, 1881)); + setWidgetSize(ivar1, ivar4, 0, 0); + setWidgetPosition(ivar9, 0, 0, 0); + if (((boolean)script_5200(ivar25))) { + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetSize(ivar7, ivar8, 0, 0); + setWidgetPosition(subtract(add(ivar9, ivar1), ivar7), subtract(ivar4, ivar7), 0, 0); + setWidgetSprite(7465); + } + } else { + setScriptCallOnClickContextMenu(5179, 13, "i"); + ivar10 = add(ivar10, 1); + createExtraChild(new WidgetPointer(1122,88), 5, ivar10); + setWidgetSprite(7454); + setWidgetSize(ivar1, ivar4, 0, 0); + setWidgetPosition(ivar9, 0, 0, 0); + } + ivar25 = getOtherCommonData(ivar26, 1878); + ivar26 = cs2method_3408(105, 74, 4849, ivar25); + ivar10 = add(ivar10, 1); + ivar9 = add(add(ivar9, ivar1), ivar5); + } + ivar27 = add(subtract(ivar9, ivar5), ivar6); + if (ivar27 > getWidgetActualWidth(new WidgetPointer(1122,88))) { + setWidgetScrollMax(ivar27, getWidgetActualHeight(new WidgetPointer(1122,88)), new WidgetPointer(1122,88)); + cs2method2100(0, 0, new WidgetPointer(1122,88)); + } + script_5182(); + script_5178(ivar12, 1); + return; +} diff --git a/dumps/scripts/5177.cs2 b/dumps/scripts/5177.cs2 new file mode 100644 index 000000000..269831782 --- /dev/null +++ b/dumps/scripts/5177.cs2 @@ -0,0 +1,4 @@ +void script_5177(int arg0,int arg1) { + script_5178(arg0, arg1); + return; +} diff --git a/dumps/scripts/5178.cs2 b/dumps/scripts/5178.cs2 new file mode 100644 index 000000000..46a9c586a --- /dev/null +++ b/dumps/scripts/5178.cs2 @@ -0,0 +1,228 @@ +void script_5178(int arg0,int arg1) { + switch (arg1) { + case 1: + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 0))) { + setWidgetSprite(5528); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 1))) { + setWidgetSprite(5529); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 2))) { + setWidgetSprite(5528); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 3))) { + setWidgetSprite(5538); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 4))) { + setWidgetSprite(5539); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 5))) { + setWidgetSprite(5538); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 6))) { + setWidgetSprite(5548); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 7))) { + setWidgetSprite(5549); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 8))) { + setWidgetSprite(5548); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 9))) { + setWidgetSprite(5558); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 10))) { + setWidgetSprite(5559); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 11))) { + setWidgetSprite(5558); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 12))) { + setWidgetSprite(5552); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 13))) { + setWidgetSprite(5553); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 14))) { + setWidgetSprite(5552); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 15))) { + setWidgetSprite(5562); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 16))) { + setWidgetSprite(5563); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 17))) { + setWidgetSprite(5562); + } + break; + case 2: + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 0))) { + setWidgetSprite(5530); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 1))) { + setWidgetSprite(5531); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 2))) { + setWidgetSprite(5530); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 3))) { + setWidgetSprite(5540); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 4))) { + setWidgetSprite(5541); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 5))) { + setWidgetSprite(5540); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 6))) { + setWidgetSprite(5550); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 7))) { + setWidgetSprite(5551); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 8))) { + setWidgetSprite(5550); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 9))) { + setWidgetSprite(5560); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 10))) { + setWidgetSprite(5561); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 11))) { + setWidgetSprite(5560); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 12))) { + setWidgetSprite(5550); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 13))) { + setWidgetSprite(5551); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 14))) { + setWidgetSprite(5550); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 15))) { + setWidgetSprite(5560); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 16))) { + setWidgetSprite(5561); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 17))) { + setWidgetSprite(5560); + } + break; + case 3: + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 0))) { + setWidgetSprite(5532); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 1))) { + setWidgetSprite(5533); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 2))) { + setWidgetSprite(5532); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 3))) { + setWidgetSprite(5542); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 4))) { + setWidgetSprite(5543); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 5))) { + setWidgetSprite(5542); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 6))) { + setWidgetSprite(5552); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 7))) { + setWidgetSprite(5553); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 8))) { + setWidgetSprite(5552); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 9))) { + setWidgetSprite(5562); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 10))) { + setWidgetSprite(5563); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 11))) { + setWidgetSprite(5562); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 12))) { + setWidgetSprite(5556); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 13))) { + setWidgetSprite(5557); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 14))) { + setWidgetSprite(5556); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 15))) { + setWidgetSprite(5566); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 16))) { + setWidgetSprite(5567); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 17))) { + setWidgetSprite(5566); + } + break; + case 4: + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 0))) { + setWidgetSprite(5534); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 1))) { + setWidgetSprite(5535); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 2))) { + setWidgetSprite(5534); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 3))) { + setWidgetSprite(5544); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 4))) { + setWidgetSprite(5545); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 5))) { + setWidgetSprite(5544); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 6))) { + setWidgetSprite(5554); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 7))) { + setWidgetSprite(5555); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 8))) { + setWidgetSprite(5554); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 9))) { + setWidgetSprite(5564); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 10))) { + setWidgetSprite(5565); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 11))) { + setWidgetSprite(5564); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 12))) { + setWidgetSprite(5554); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 13))) { + setWidgetSprite(5555); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 14))) { + setWidgetSprite(5554); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 15))) { + setWidgetSprite(5564); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 16))) { + setWidgetSprite(5565); + } + if (setWidgetRegister(new WidgetPointer(1122,88), add(arg0, 17))) { + setWidgetSprite(5564); + } + } + return; +} diff --git a/dumps/scripts/5179.cs2 b/dumps/scripts/5179.cs2 new file mode 100644 index 000000000..ed38fd268 --- /dev/null +++ b/dumps/scripts/5179.cs2 @@ -0,0 +1,4 @@ +void script_5179(int arg0) { + script_5180(arg0); + return; +} diff --git a/dumps/scripts/518.cs2 b/dumps/scripts/518.cs2 new file mode 100644 index 000000000..749d53edd --- /dev/null +++ b/dumps/scripts/518.cs2 @@ -0,0 +1,5 @@ +void script_518() { + script_1593(globalint_1505); + script_1600(); + return; +} diff --git a/dumps/scripts/5180.cs2 b/dumps/scripts/5180.cs2 new file mode 100644 index 000000000..da8294e50 --- /dev/null +++ b/dumps/scripts/5180.cs2 @@ -0,0 +1,60 @@ +void script_5180(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + string svar1; + string svar2; + string svar3; + ivar1 = cs2method_3408(105, 74, 4849, arg0); + svar0 = ""; + svar1 = ""; + svar2 = ""; + if (ivar1 == -1) { + svar1 = "Select a goal from the list above."; + if (arg0 > -1) { + return; + } + } else { + svar0 = getOtherCommonData(ivar1, 1879); + svar1 = getOtherCommonData(ivar1, 1880); + if (arg0 != 13) { + if (((boolean)script_5200(arg0))) { + svar2 = "" + "COMPLETED" + ""; + } else { + svar2 = "" + "INCOMPLETE" + ""; + } + } + script_5204(); + } + svar3 = ""; + svar3 = concat("Goal: ", svar0); + if (strLength(svar2) > 0) { + svar3 = concat(svar3, "
" + "Status: "); + svar3 = concat(svar3, svar2); + } + svar3 = concat(svar3, "
"); + svar3 = concat(svar3, svar1); + ivar2 = 10; + ivar3 = 16; + ivar4 = subtract(getWidgetActualWidth(new WidgetPointer(1122,62)), multiply(ivar2, 2)); + ivar5 = getLineCount(ivar4, 495, svar3); + setWidgetTextAlignment(0, 0, ivar3, new WidgetPointer(1122,63)); + ivar6 = multiply(ivar3, ivar5); + setWidgetPosition(ivar2, ivar2, 0, 0, new WidgetPointer(1122,63)); + setWidgetSize(ivar4, ivar6, 0, 0, new WidgetPointer(1122,63)); + setWidgetText(new WidgetPointer(1122,63), svar3); + ivar7 = add(add(ivar6, ivar2), ivar2); + if (ivar7 < getWidgetActualHeight(new WidgetPointer(1122,62))) { + ivar7 = getWidgetActualHeight(new WidgetPointer(1122,62)); + } + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(1122,62)), ivar7, new WidgetPointer(1122,62)); + script_31(73531519, 73531454, 5666, 5663, 5664, 5665, 5686, 5685); + globalint_1596 = arg0; + script_5176(); + return; +} diff --git a/dumps/scripts/5181.cs2 b/dumps/scripts/5181.cs2 new file mode 100644 index 000000000..b49c795d8 --- /dev/null +++ b/dumps/scripts/5181.cs2 @@ -0,0 +1,8 @@ +void script_5181(int arg0) { + if (((boolean)getWidgetScrollMaxH(new WidgetPointer(1122,88)))) { + return; + } + cs2method2100(add(cs2method2600(new WidgetPointer(1122,88)), multiply(8, arg0)), 0, new WidgetPointer(1122,88)); + script_5182(); + return; +} diff --git a/dumps/scripts/5182.cs2 b/dumps/scripts/5182.cs2 new file mode 100644 index 000000000..36f248554 --- /dev/null +++ b/dumps/scripts/5182.cs2 @@ -0,0 +1,16 @@ +void script_5182() { + if (((boolean)getWidgetScrollMaxH(new WidgetPointer(1122,88)))) { + setWidgetIsHidden(false, new WidgetPointer(1122,87)); + setWidgetIsHidden(false, new WidgetPointer(1122,367)); + } else if (((boolean)cs2method2600(new WidgetPointer(1122,88)))) { + setWidgetIsHidden(false, new WidgetPointer(1122,87)); + setWidgetIsHidden(true, new WidgetPointer(1122,367)); + } else if (cs2method2600(new WidgetPointer(1122,88)) == subtract(getWidgetScrollMaxH(new WidgetPointer(1122,88)), getWidgetActualWidth(new WidgetPointer(1122,88)))) { + setWidgetIsHidden(true, new WidgetPointer(1122,87)); + setWidgetIsHidden(false, new WidgetPointer(1122,367)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1122,87)); + setWidgetIsHidden(true, new WidgetPointer(1122,367)); + } + return; +} diff --git a/dumps/scripts/5183.cs2 b/dumps/scripts/5183.cs2 new file mode 100644 index 000000000..edfe34e3d --- /dev/null +++ b/dumps/scripts/5183.cs2 @@ -0,0 +1,7 @@ +int script_5183(int arg0,int arg1,int arg2,int arg3) { + standart_config_2347 = arg0; + bitconfig_9642 = min(63, max(0, add(bitconfig_9642, arg1))); + bitconfig_9643 = min(7, max(0, add(bitconfig_9643, arg2))); + bitconfig_9644 = min(127, max(0, add(bitconfig_9644, arg3))); + return standart_config_2347; +} diff --git a/dumps/scripts/5184.cs2 b/dumps/scripts/5184.cs2 new file mode 100644 index 000000000..44dfc788e --- /dev/null +++ b/dumps/scripts/5184.cs2 @@ -0,0 +1,15 @@ +void script_5184() { + script_5192(); + script_5190(1, 0); + switch (bitconfig_9646) { + case 1: + setWidgetText(new WidgetPointer(1122,71), "Lumbridge herald cape"); + break; + case 2: + setWidgetText(new WidgetPointer(1122,71), "Varrock herald cape"); + break; + case 3: + setWidgetText(new WidgetPointer(1122,71), "Falador herald cape"); + } + return; +} diff --git a/dumps/scripts/5185.cs2 b/dumps/scripts/5185.cs2 new file mode 100644 index 000000000..a5009d409 --- /dev/null +++ b/dumps/scripts/5185.cs2 @@ -0,0 +1,4 @@ +void script_5185() { + script_5186(); + return; +} diff --git a/dumps/scripts/5186.cs2 b/dumps/scripts/5186.cs2 new file mode 100644 index 000000000..5ea6bdb2f --- /dev/null +++ b/dumps/scripts/5186.cs2 @@ -0,0 +1,8 @@ +void script_5186() { + setWidgetIsHidden(true, new WidgetPointer(1122,72)); + setWidgetIsHidden(false, new WidgetPointer(1122,77)); + setWidgetIsHidden(false, new WidgetPointer(1122,73)); + setWidgetIsHidden(true, new WidgetPointer(1122,192)); + setWidgetIsHidden(false, new WidgetPointer(1122,46)); + return; +} diff --git a/dumps/scripts/5187.cs2 b/dumps/scripts/5187.cs2 new file mode 100644 index 000000000..5ef6c8515 --- /dev/null +++ b/dumps/scripts/5187.cs2 @@ -0,0 +1,4 @@ +void script_5187() { + script_5188(); + return; +} diff --git a/dumps/scripts/5188.cs2 b/dumps/scripts/5188.cs2 new file mode 100644 index 000000000..1ab7537fa --- /dev/null +++ b/dumps/scripts/5188.cs2 @@ -0,0 +1,8 @@ +void script_5188() { + setWidgetIsHidden(false, new WidgetPointer(1122,72)); + setWidgetIsHidden(true, new WidgetPointer(1122,77)); + setWidgetIsHidden(true, new WidgetPointer(1122,73)); + setWidgetIsHidden(false, new WidgetPointer(1122,192)); + setWidgetIsHidden(true, new WidgetPointer(1122,46)); + return; +} diff --git a/dumps/scripts/5189.cs2 b/dumps/scripts/5189.cs2 new file mode 100644 index 000000000..47ea92087 --- /dev/null +++ b/dumps/scripts/5189.cs2 @@ -0,0 +1,5 @@ +void script_5189(int arg0,int arg1) { + script_5186(); + script_5190(arg0, arg1); + return; +} diff --git a/dumps/scripts/519.cs2 b/dumps/scripts/519.cs2 new file mode 100644 index 000000000..e376d1c58 --- /dev/null +++ b/dumps/scripts/519.cs2 @@ -0,0 +1,24 @@ +int script_519() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_3579); + ivar0 = add(ivar0, bitconfig_3580); + ivar0 = add(ivar0, bitconfig_3581); + ivar0 = add(ivar0, bitconfig_3582); + ivar0 = add(ivar0, bitconfig_3583); + ivar0 = add(ivar0, bitconfig_3584); + ivar0 = add(ivar0, bitconfig_3585); + ivar0 = add(ivar0, bitconfig_3586); + ivar0 = add(ivar0, bitconfig_3587); + ivar0 = add(ivar0, bitconfig_3588); + ivar0 = add(ivar0, bitconfig_3589); + ivar0 = add(ivar0, bitconfig_3590); + ivar0 = add(ivar0, bitconfig_3591); + ivar0 = add(ivar0, bitconfig_3592); + ivar0 = add(ivar0, bitconfig_3593); + ivar0 = add(ivar0, bitconfig_3594); + ivar0 = add(ivar0, bitconfig_3595); + ivar0 = add(ivar0, bitconfig_3597); + ivar0 = add(ivar0, bitconfig_3596); + return ivar0; +} diff --git a/dumps/scripts/5190.cs2 b/dumps/scripts/5190.cs2 new file mode 100644 index 000000000..292a168e1 --- /dev/null +++ b/dumps/scripts/5190.cs2 @@ -0,0 +1,17 @@ +void script_5190(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 25; + ivar3 = multiply(getWidgetActualWidth(new WidgetPointer(1122,73)), arg0); + if (((boolean)arg1)) { + cs2method2100(ivar3, 0, new WidgetPointer(1122,74)); + setWidgetIsHidden(true, new WidgetPointer(1122,75)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(1122,75)); + if (ivar3 < cs2method2600(new WidgetPointer(1122,74))) { + ivar2 = subtract(0, ivar2); + } + setScriptCallOnGameloop(5191, ivar3, ivar2, "ii", new WidgetPointer(1122,74)); + return; +} diff --git a/dumps/scripts/5191.cs2 b/dumps/scripts/5191.cs2 new file mode 100644 index 000000000..8df979b12 --- /dev/null +++ b/dumps/scripts/5191.cs2 @@ -0,0 +1,20 @@ +void script_5191(int arg0,int arg1) { + flow_0: + cs2method2100(add(cs2method2600(new WidgetPointer(1122,74)), arg1), 0, new WidgetPointer(1122,74)); + IF (arg1 < 0) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (cs2method2600(new WidgetPointer(1122,74)) <= arg0) + GOTO flow_4 + flow_2: + IF ((arg1 > 0) && (cs2method2600(new WidgetPointer(1122,74)) >= arg0)) + GOTO flow_4 + GOTO flow_5 + flow_4: + cs2method2100(arg0, 0, new WidgetPointer(1122,74)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(1122,74)); + setWidgetIsHidden(true, new WidgetPointer(1122,75)); + flow_5: + return; +} diff --git a/dumps/scripts/5192.cs2 b/dumps/scripts/5192.cs2 new file mode 100644 index 000000000..3f53d8e45 --- /dev/null +++ b/dumps/scripts/5192.cs2 @@ -0,0 +1,10 @@ +void script_5192() { + globalint_1595 = script_5193(); + globalint_1594 = script_5194(); + globalint_1596 = -1; + script_5176(); + script_5195(); + script_5196(); + script_5180(-1); + return; +} diff --git a/dumps/scripts/5193.cs2 b/dumps/scripts/5193.cs2 new file mode 100644 index 000000000..92cb4a0ca --- /dev/null +++ b/dumps/scripts/5193.cs2 @@ -0,0 +1,11 @@ +int script_5193() { + switch (bitconfig_9646) { + case 1: + return bitconfig_9647; + case 2: + return bitconfig_9648; + case 3: + return bitconfig_9649; + } + return -1; +} diff --git a/dumps/scripts/5194.cs2 b/dumps/scripts/5194.cs2 new file mode 100644 index 000000000..47ff24282 --- /dev/null +++ b/dumps/scripts/5194.cs2 @@ -0,0 +1,26 @@ +int script_5194() { + int ivar0; + int ivar1; + cs2func_script_5172_struct(2,0,0) structdump_0; + cs2func_script_5173_struct(2,0,0) structdump_1; + cs2func_script_5174_struct(2,0,0) structdump_2; + ivar0 = -1; + ivar1 = -1; + switch (bitconfig_9646) { + case 1: + structdump_0 = script_5172(); + ivar1 = structdump_0.intpart_1; + ivar0 = structdump_0.intpart_0; + break; + case 2: + structdump_1 = script_5173(); + ivar1 = structdump_1.intpart_1; + ivar0 = structdump_1.intpart_0; + break; + case 3: + structdump_2 = script_5174(); + ivar1 = structdump_2.intpart_1; + ivar0 = structdump_2.intpart_0; + } + return ivar0; +} diff --git a/dumps/scripts/5195.cs2 b/dumps/scripts/5195.cs2 new file mode 100644 index 000000000..515596aee --- /dev/null +++ b/dumps/scripts/5195.cs2 @@ -0,0 +1,58 @@ +void script_5195() { + setWidgetIsHidden(true, new WidgetPointer(1122,67)); + setWidgetIsHidden(true, new WidgetPointer(1122,168)); + setWidgetIsHidden(true, new WidgetPointer(1122,169)); + setWidgetIsHidden(true, new WidgetPointer(1122,170)); + setWidgetRGB(new Color(181, 157, 105), new WidgetPointer(1122,69)); + setWidgetRGB(new Color(120, 102, 75), new WidgetPointer(1122,155)); + setWidgetRGB(new Color(120, 102, 75), new WidgetPointer(1122,159)); + setWidgetRGB(new Color(120, 102, 75), new WidgetPointer(1122,163)); + setWidgetRGB(new Color(120, 102, 75), new WidgetPointer(1122,167)); + setWidgetSprite(7653, new WidgetPointer(1122,31)); + setWidgetSprite(7652, new WidgetPointer(1122,153)); + setWidgetSprite(7652, new WidgetPointer(1122,157)); + setWidgetSprite(7652, new WidgetPointer(1122,161)); + setWidgetSprite(7652, new WidgetPointer(1122,165)); + setWidgetIsHidden(true, new WidgetPointer(1122,32)); + setWidgetIsHidden(true, new WidgetPointer(1122,154)); + setWidgetIsHidden(true, new WidgetPointer(1122,158)); + setWidgetIsHidden(true, new WidgetPointer(1122,162)); + setWidgetIsHidden(true, new WidgetPointer(1122,166)); + if (globalint_1595 >= 1) { + setWidgetIsHidden(false, new WidgetPointer(1122,67)); + setWidgetSprite(7653, new WidgetPointer(1122,153)); + setWidgetRGB(new Color(181, 157, 105), new WidgetPointer(1122,155)); + } + if (globalint_1595 >= 2) { + setWidgetIsHidden(false, new WidgetPointer(1122,168)); + setWidgetSprite(7653, new WidgetPointer(1122,157)); + setWidgetRGB(new Color(181, 157, 105), new WidgetPointer(1122,159)); + } + if (globalint_1595 >= 3) { + setWidgetIsHidden(false, new WidgetPointer(1122,169)); + setWidgetSprite(7653, new WidgetPointer(1122,161)); + setWidgetRGB(new Color(181, 157, 105), new WidgetPointer(1122,163)); + } + if (globalint_1595 >= 4) { + setWidgetIsHidden(false, new WidgetPointer(1122,170)); + setWidgetSprite(7653, new WidgetPointer(1122,165)); + setWidgetRGB(new Color(181, 157, 105), new WidgetPointer(1122,167)); + } + switch (globalint_1595) { + case 0: + setWidgetIsHidden(false, new WidgetPointer(1122,32)); + break; + case 1: + setWidgetIsHidden(false, new WidgetPointer(1122,154)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1122,158)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(1122,162)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(1122,166)); + } + return; +} diff --git a/dumps/scripts/5196.cs2 b/dumps/scripts/5196.cs2 new file mode 100644 index 000000000..9db5fade8 --- /dev/null +++ b/dumps/scripts/5196.cs2 @@ -0,0 +1,28 @@ +void script_5196() { + setWidgetIsHidden(true, new WidgetPointer(1122,61)); + setWidgetIsHidden(true, new WidgetPointer(1122,252)); + setWidgetIsHidden(true, new WidgetPointer(1122,264)); + setWidgetIsHidden(true, new WidgetPointer(1122,276)); + setWidgetIsHidden(true, new WidgetPointer(1122,288)); + setWidgetIsHidden(true, new WidgetPointer(1122,233)); + setWidgetIsHidden(true, new WidgetPointer(1122,242)); + setWidgetIsHidden(true, new WidgetPointer(1122,357)); + setWidgetIsHidden(false, new WidgetPointer(1122,79)); + if (globalint_1595 < 4) { + setWidgetIsHidden(false, new WidgetPointer(1122,288)); + setWidgetIsHidden(false, new WidgetPointer(1122,242)); + } + if (globalint_1595 < 3) { + setWidgetIsHidden(false, new WidgetPointer(1122,276)); + setWidgetIsHidden(false, new WidgetPointer(1122,357)); + } + if (globalint_1595 < 2) { + setWidgetIsHidden(false, new WidgetPointer(1122,264)); + setWidgetIsHidden(false, new WidgetPointer(1122,233)); + setWidgetIsHidden(true, new WidgetPointer(1122,79)); + } + if (globalint_1595 < 1) { + setWidgetIsHidden(false, new WidgetPointer(1122,252)); + } + return; +} diff --git a/dumps/scripts/5197.cs2 b/dumps/scripts/5197.cs2 new file mode 100644 index 000000000..b49e0b0b9 --- /dev/null +++ b/dumps/scripts/5197.cs2 @@ -0,0 +1,17 @@ +void script_5197(int arg0,int arg1,int arg2) { + if (((boolean)arg2)) { + setWidgetIsHidden(true, new WidgetPointer(1122,57)); + setWidgetIsHidden(true, new WidgetPointer(1122,248)); + setWidgetIsHidden(true, new WidgetPointer(1122,260)); + setWidgetIsHidden(true, new WidgetPointer(1122,272)); + setWidgetIsHidden(true, new WidgetPointer(1122,284)); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } else if (arg1 == bitconfig_9674) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + globalint_1600 = arg1; + script_5202(1); + return; +} diff --git a/dumps/scripts/5198.cs2 b/dumps/scripts/5198.cs2 new file mode 100644 index 000000000..70f164fc9 --- /dev/null +++ b/dumps/scripts/5198.cs2 @@ -0,0 +1,13 @@ +void script_5198() { + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9671)), new WidgetPointer(1122,111)); + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9672)), new WidgetPointer(1122,118)); + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9673)), new WidgetPointer(1122,120)); + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9672)), new WidgetPointer(1122,313)); + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9671)), new WidgetPointer(1122,320)); + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9673)), new WidgetPointer(1122,322)); + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9673)), new WidgetPointer(1122,341)); + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9673)), new WidgetPointer(1122,359)); + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9671)), new WidgetPointer(1122,348)); + setWidgetRGB(new Color(getColorRelatedMethod4020(bitconfig_9672)), new WidgetPointer(1122,350)); + return; +} diff --git a/dumps/scripts/5199.cs2 b/dumps/scripts/5199.cs2 new file mode 100644 index 000000000..1800c9306 --- /dev/null +++ b/dumps/scripts/5199.cs2 @@ -0,0 +1,6 @@ +void script_5199(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + setWidgetSprite(arg3, new WidgetPointer(arg2)); + setWidgetSprite(arg5, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/52.cs2 b/dumps/scripts/52.cs2 new file mode 100644 index 000000000..5c0840585 --- /dev/null +++ b/dumps/scripts/52.cs2 @@ -0,0 +1,10 @@ +void script_52(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (setWidgetRegister(new WidgetPointer(arg3), arg4)) { + if (getSkillActualLvl(5) < arg0) { + setWidgetSprite(arg1); + } else { + setWidgetSprite(arg2); + } + } + return; +} diff --git a/dumps/scripts/520.cs2 b/dumps/scripts/520.cs2 new file mode 100644 index 000000000..2dbc23763 --- /dev/null +++ b/dumps/scripts/520.cs2 @@ -0,0 +1,32 @@ +void script_520(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar4 = divide(add(arg1, arg2), 2); + ivar5 = globalarray_0[ivar4]; + globalarray_0[ivar4] = globalarray_0[arg2]; + globalarray_0[arg2] = ivar5; + ivar6 = arg1; + ivar7 = arg1; + ivar8 = -1; + while (ivar7 < arg2) { + if (stringMethod4107(lower(cs2method_3408(105, 115, arg3, globalarray_0[ivar7])), lower(cs2method_3408(105, 115, arg3, ivar5))) < bitAnd(ivar7, 1)) { + ivar8 = globalarray_0[ivar7]; + globalarray_0[ivar7] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar8; + ivar6 = add(ivar6, 1); + } + ivar7 = add(ivar7, 1); + } + globalarray_0[arg2] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar5; + if (arg1 < subtract(ivar6, 1)) { + script_520(0, arg1, subtract(ivar6, 1), arg3); + } + if (add(ivar6, 1) < arg2) { + script_520(0, add(ivar6, 1), arg2, arg3); + } + return; +} diff --git a/dumps/scripts/5200.cs2 b/dumps/scripts/5200.cs2 new file mode 100644 index 000000000..200e4b40a --- /dev/null +++ b/dumps/scripts/5200.cs2 @@ -0,0 +1,70 @@ +int script_5200(int arg0) { + switch (arg0) { + case 1: + if (bitconfig_7238 >= 60) { + return 1; + } + return 0; + case 2: + if (bitconfig_5733 >= 60) { + return 1; + } + return 0; + case 3: + if (bitconfig_6914 >= 3) { + return 1; + } + return 0; + case 4: + if (globalint_1594 >= 56) { + return 1; + } + return 0; + case 5: + if (bitconfig_5730 >= 100) { + return 1; + } + return 0; + case 6: + if ((standart_config_145 >= 7) || (standart_config_146 >= 4)) { + return 1; + } + return 0; + case 7: + if (bitconfig_2561 >= 3) { + return 1; + } + return 0; + case 8: + if (globalint_1594 >= 17) { + return 1; + } + return 0; + case 9: + if (bitconfig_2378 >= 6) { + return 1; + } + return 0; + case 10: + if (standart_config_122 >= 7) { + return 1; + } + return 0; + case 11: + if (standart_config_130 >= 4) { + return 1; + } + return 0; + case 12: + if (globalint_1594 >= 11) { + return 1; + } + return 0; + case 14: + if (standart_config_176 >= 10) { + return 1; + } + return 0; + } + return 0; +} diff --git a/dumps/scripts/5201.cs2 b/dumps/scripts/5201.cs2 new file mode 100644 index 000000000..e67fe9f1f --- /dev/null +++ b/dumps/scripts/5201.cs2 @@ -0,0 +1,4 @@ +void script_5201() { + script_5202(1); + return; +} diff --git a/dumps/scripts/5202.cs2 b/dumps/scripts/5202.cs2 new file mode 100644 index 000000000..c00eef1a3 --- /dev/null +++ b/dumps/scripts/5202.cs2 @@ -0,0 +1,59 @@ +void script_5202(int arg0) { + if (((boolean)arg0)) { + globalint_1597 = bitconfig_9671; + globalint_1598 = bitconfig_9672; + globalint_1599 = bitconfig_9673; + globalint_1600 = bitconfig_9674; + globalint_1601 = bitconfig_9675; + } + switch (globalint_1600) { + case 0: + setWidgetModel(43803, new WidgetPointer(1122,80)); + break; + case 1: + setWidgetModel(43796, new WidgetPointer(1122,80)); + break; + case 2: + setWidgetModel(43790, new WidgetPointer(1122,80)); + break; + case 3: + setWidgetModel(43779, new WidgetPointer(1122,80)); + break; + case 4: + setWidgetModel(43795, new WidgetPointer(1122,80)); + } + switch (bitconfig_9646) { + case 1: + doWidgetType19Task(2, 1303, 1298, new WidgetPointer(1122,80)); + break; + case 2: + doWidgetType19Task(2, 1303, 1303, new WidgetPointer(1122,80)); + break; + case 3: + doWidgetType19Task(2, 1303, 1301, new WidgetPointer(1122,80)); + } + switch (globalint_1601) { + case 0: + doWidgetType19Task(1, 1304, 1299, new WidgetPointer(1122,80)); + break; + case 1: + doWidgetType19Task(1, 1304, 1304, new WidgetPointer(1122,80)); + break; + case 2: + doWidgetType19Task(1, 1304, 1300, new WidgetPointer(1122,80)); + break; + case 3: + doWidgetType19Task(1, 1304, 1296, new WidgetPointer(1122,80)); + break; + case 4: + doWidgetType19Task(1, 1304, 1302, new WidgetPointer(1122,80)); + break; + case 5: + doWidgetType19Task(1, 1304, 1297, new WidgetPointer(1122,80)); + } + doWidgetType18Task(0, 41506, globalint_1597, new WidgetPointer(1122,80)); + doWidgetType18Task(1, 41497, script_5183(globalint_1597, 0, 0, -9), new WidgetPointer(1122,80)); + doWidgetType18Task(2, 13434, globalint_1598, new WidgetPointer(1122,80)); + doWidgetType18Task(3, 7102, globalint_1599, new WidgetPointer(1122,80)); + return; +} diff --git a/dumps/scripts/5203.cs2 b/dumps/scripts/5203.cs2 new file mode 100644 index 000000000..c185071eb --- /dev/null +++ b/dumps/scripts/5203.cs2 @@ -0,0 +1,4 @@ +void script_5203() { + script_5204(); + return; +} diff --git a/dumps/scripts/5204.cs2 b/dumps/scripts/5204.cs2 new file mode 100644 index 000000000..4a089e4a6 --- /dev/null +++ b/dumps/scripts/5204.cs2 @@ -0,0 +1,4 @@ +void script_5204() { + playSoundEffect2False(6185, 1, 0, 200, 127); + return; +} diff --git a/dumps/scripts/5205.cs2 b/dumps/scripts/5205.cs2 new file mode 100644 index 000000000..220321d0d --- /dev/null +++ b/dumps/scripts/5205.cs2 @@ -0,0 +1,4 @@ +void script_5205() { + script_5206(); + return; +} diff --git a/dumps/scripts/5206.cs2 b/dumps/scripts/5206.cs2 new file mode 100644 index 000000000..732136b83 --- /dev/null +++ b/dumps/scripts/5206.cs2 @@ -0,0 +1,105 @@ +void script_5206() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + ivar0 = 60; + ivar1 = subtract(getWidgetActualWidth(new WidgetPointer(1122,93)), multiply(ivar0, 4)); + ivar2 = divide(ivar1, 5); + ivar3 = add(ivar2, divide(subtract(ivar1, multiply(ivar2, 5)), 2)); + ivar4 = 0; + ivar5 = 0; + ivar6 = 5523; + ivar7 = 5524; + ivar8 = 5525; + ivar9 = 5526; + ivar10 = 5527; + ivar11 = cs2method2600(new WidgetPointer(1122,93)); + ivar12 = cs2method2601(new WidgetPointer(1122,93)); + deleteAllExtraChilds(new WidgetPointer(1122,93)); + ivar13 = 0; + ivar14 = 0; + ivar15 = getCommonDefinitionSize(4850); + ivar16 = -1; + while (ivar13 < ivar15) { + ivar16 = cs2method_3408(105, 74, 4850, ivar13); + if ((ivar13 != 0) && (ivar16 == -1)) { + return; + } + ivar4 = add(ivar3, multiply(mod(ivar13, 4), add(ivar2, ivar0))); + ivar5 = add(ivar2, multiply(divide(ivar13, 4), add(ivar2, ivar0))); + createExtraChild(new WidgetPointer(1122,93), 5, ivar14); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSize(ivar0, ivar0, 0, 0); + if (bitconfig_9675 == ivar13) { + setWidgetSprite(ivar9); + ivar14 = add(ivar14, 1); + createExtraChild(new WidgetPointer(1122,93), 5, ivar14); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSize(ivar0, ivar0, 0, 0); + setWidgetSprite(getOtherCommonData(ivar16, 1883)); + ivar14 = add(ivar14, 1); + createExtraChild(new WidgetPointer(1122,93), 5, ivar14); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSize(ivar0, ivar0, 0, 0); + setWidgetSprite(-1); + } else if (((boolean)getOtherCommonData(ivar16, 1885)) || ((boolean)script_5200(getOtherCommonData(ivar16, 1885)))) { + setWidgetSprite(ivar6); + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar7, "Iid"); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar6, "Iid"); + setScriptCallOnMousePressed(688, new WidgetPointer(-32768,3), -2147483643, ivar8, "Iid"); + setScriptCallOnMouseReleased(688, new WidgetPointer(-32768,3), -2147483643, ivar6, "Iid"); + setWidgetContextMenuOption(1, "Select crest"); + setScriptCallOnClickContextMenu(5207, new WidgetPointer(-32768,3), -2147483643, ivar13, "Iii"); + ivar14 = add(ivar14, 1); + createExtraChild(new WidgetPointer(1122,93), 5, ivar14); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSize(ivar0, ivar0, 0, 0); + setWidgetSprite(getOtherCommonData(ivar16, 1883)); + ivar14 = add(ivar14, 1); + createExtraChild(new WidgetPointer(1122,93), 5, ivar14); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSize(ivar0, ivar0, 0, 0); + setWidgetSprite(-1); + } else { + setWidgetSprite(ivar10); + ivar14 = add(ivar14, 1); + createExtraChild(new WidgetPointer(1122,93), 5, ivar14); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSize(ivar0, ivar0, 0, 0); + setWidgetSprite(getOtherCommonData(ivar16, 1883)); + cs2method2103(196); + ivar14 = add(ivar14, 1); + createExtraChild(new WidgetPointer(1122,93), 5, ivar14); + setWidgetPosition(ivar4, ivar5, 0, 0); + setWidgetSize(ivar0, ivar0, 0, 0); + setWidgetSprite(7454); + } + ivar14 = add(ivar14, 1); + ivar13 = add(ivar13, 1); + } + ivar17 = divide(ivar15, 4); + if (mod(ivar15, 4) != 0) { + ivar17 = add(ivar17, 1); + } + ivar18 = add(multiply(ivar17, add(ivar0, ivar2)), ivar2); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(1122,93)), ivar18, new WidgetPointer(1122,93)); + cs2method2100(ivar11, ivar12, new WidgetPointer(1122,93)); + script_31(73531486, 73531485, 5666, 5663, 5664, 5665, 5686, 5685); + return; +} diff --git a/dumps/scripts/5207.cs2 b/dumps/scripts/5207.cs2 new file mode 100644 index 000000000..bcb81fe22 --- /dev/null +++ b/dumps/scripts/5207.cs2 @@ -0,0 +1,23 @@ +void script_5207(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + ivar3 = 0; + ivar4 = 5526; + ivar5 = 5523; + while (ivar3 < getExtraChildGap(new WidgetPointer(arg0))) { + if (setWidgetRegister(new WidgetPointer(arg0), ivar3) && (getWidgetSpriteId() == ivar4)) { + removeAllEventListeners(); + setWidgetSprite(ivar5); + } + ivar3 = add(ivar3, 1); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + removeAllEventListeners(); + setWidgetSprite(ivar4); + } + globalint_1601 = ivar3; + script_5202(0); + script_5204(); + return; +} diff --git a/dumps/scripts/5208.cs2 b/dumps/scripts/5208.cs2 new file mode 100644 index 000000000..50ad4b092 --- /dev/null +++ b/dumps/scripts/5208.cs2 @@ -0,0 +1,4 @@ +void script_5208() { + cs2method5400(1, "friend-referral", "splash.ws"); + return; +} diff --git a/dumps/scripts/5209.cs2 b/dumps/scripts/5209.cs2 new file mode 100644 index 000000000..280189737 --- /dev/null +++ b/dumps/scripts/5209.cs2 @@ -0,0 +1,7 @@ +void script_5209() { + string svar0; + svar0 = "Pin this skill plot's information to this side interface?"; + setScriptCallOnMouseOver(4538, new WidgetPointer(1117,0), new WidgetPointer(1117,133), -1, svar0, 160, 3793, 3793, 16777215, 13, 4, 0, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1117,133)); + setScriptCallOnMouseExit(40, new WidgetPointer(1117,0), "I", new WidgetPointer(1117,133)); + return; +} diff --git a/dumps/scripts/521.cs2 b/dumps/scripts/521.cs2 new file mode 100644 index 000000000..7209b6e6e --- /dev/null +++ b/dumps/scripts/521.cs2 @@ -0,0 +1,12 @@ +void script_521() { + globalint_54 = getSkillXp(20); + globalint_55 = getSkillXp(12); + globalint_57 = getSkillXp(9); + globalint_58 = getSkillXp(7); + globalint_60 = getSkillXp(22); + globalint_61 = getSkillXp(15); + globalint_64 = getSkillXp(6); + globalint_66 = getSkillXp(13); + globalint_62 = getSkillXp(19); + return; +} diff --git a/dumps/scripts/5210.cs2 b/dumps/scripts/5210.cs2 new file mode 100644 index 000000000..dbba6d4d2 --- /dev/null +++ b/dumps/scripts/5210.cs2 @@ -0,0 +1,9 @@ +void script_5210(int arg0) { + if (((boolean)bitconfig_6448)) { + script_5211(1); + return; + } + script_5211(0); + setScriptCallOnConfigChange(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5211.cs2 b/dumps/scripts/5211.cs2 new file mode 100644 index 000000000..be31abaf5 --- /dev/null +++ b/dumps/scripts/5211.cs2 @@ -0,0 +1,8 @@ +void script_5211(int arg0) { + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(746,13)); + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(746,227)); + if (((boolean)arg0)) { + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(746,184)); + } + return; +} diff --git a/dumps/scripts/5212.cs2 b/dumps/scripts/5212.cs2 new file mode 100644 index 000000000..ac74ddbfa --- /dev/null +++ b/dumps/scripts/5212.cs2 @@ -0,0 +1,8 @@ +void script_5212(int arg0) { + if (bitconfig_9511 == 2000) { + setWidgetText(new WidgetPointer(arg0), "" + intToStr(bitconfig_9511) + "/" + intToStr(2000) + ""); + } else { + setWidgetText(new WidgetPointer(arg0), "" + intToStr(bitconfig_9511) + "/" + intToStr(2000) + ""); + } + return; +} diff --git a/dumps/scripts/5213.cs2 b/dumps/scripts/5213.cs2 new file mode 100644 index 000000000..0228f8467 --- /dev/null +++ b/dumps/scripts/5213.cs2 @@ -0,0 +1,43 @@ +int script_5213(int arg0) { + switch (arg0) { + case 16: + return 71565312; + case 17: + return 71565313; + case 18: + return 71565314; + case 19: + return 71565315; + case 20: + return 71565316; + case 21: + return 71565317; + case 22: + return 71565318; + case 23: + return 71565319; + case 24: + return 71565320; + case 25: + return 71565321; + case 26: + return 71565322; + case 27: + return 71565323; + case 28: + return 71565324; + case 29: + return 71565325; + case 30: + return 71565326; + case 31: + return 71565327; + case 32: + return 71565328; + case 33: + return 71565329; + case 34: + return 71565330; + } + return -1; +} diff --git a/dumps/scripts/5214.cs2 b/dumps/scripts/5214.cs2 new file mode 100644 index 000000000..6f7f8de4e --- /dev/null +++ b/dumps/scripts/5214.cs2 @@ -0,0 +1,27 @@ +int script_5214(int arg0) { + if (citadelConfigsInitialized()) { + switch (arg0) { + case 1: + return 1; + case 2: + return 2; + case 3: + return 3; + case 4: + return 3; + case 5: + return 3; + case 6: + return 4; + case 7: + return 4; + case 8: + return 5; + case 10: + return 5; + case 9: + return 6; + } + } + return 0; +} diff --git a/dumps/scripts/5215.cs2 b/dumps/scripts/5215.cs2 new file mode 100644 index 000000000..dd9f07f45 --- /dev/null +++ b/dumps/scripts/5215.cs2 @@ -0,0 +1,105 @@ +int script_5215(int arg0) { + switch (arg0) { + case 1: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 2: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 3: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 4: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 5: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 6: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 7: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 8: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 10: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + case 9: + /* + mgi.tools.jagdecs2.DecompilerException: TODO citadel configs method:106 + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:230) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + return -1; +} diff --git a/dumps/scripts/5216.cs2 b/dumps/scripts/5216.cs2 new file mode 100644 index 000000000..1c743db70 --- /dev/null +++ b/dumps/scripts/5216.cs2 @@ -0,0 +1,43 @@ +int script_5216(int arg0) { + switch (arg0) { + case 16: + return 71566685; + case 17: + return 71565347; + case 18: + return 71565346; + case 19: + return 71565345; + case 20: + return 71565344; + case 21: + return 71565343; + case 22: + return 71566722; + case 23: + return 71565342; + case 24: + return 71565341; + case 25: + return 71565340; + case 26: + return 71565339; + case 27: + return 71565338; + case 28: + return 71565337; + case 29: + return 71565336; + case 30: + return 71565335; + case 31: + return 71565334; + case 32: + return 71565333; + case 33: + return 71565332; + case 34: + return 71565331; + } + return -1; +} diff --git a/dumps/scripts/5217.cs2 b/dumps/scripts/5217.cs2 new file mode 100644 index 000000000..7f280eb29 --- /dev/null +++ b/dumps/scripts/5217.cs2 @@ -0,0 +1,8 @@ +void script_5217(int arg0,int arg1,int arg2,int arg3) { + script_4526(arg0, arg1); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg3)); + setScriptCallOnMouseEntered(5218, new WidgetPointer(arg0), new WidgetPointer(arg3), 0, 0, new WidgetPointer(arg2), "IIiiI", new WidgetPointer(arg2)); + setScriptCallOnMouseExit(5218, new WidgetPointer(arg0), new WidgetPointer(arg3), 1, 0, new WidgetPointer(arg2), "IIiiI", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5218.cs2 b/dumps/scripts/5218.cs2 new file mode 100644 index 000000000..ac53d0659 --- /dev/null +++ b/dumps/scripts/5218.cs2 @@ -0,0 +1,32 @@ +void script_5218(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + ivar5 = 0; + ivar6 = 0; + setWidgetIsHidden(false, new WidgetPointer(getWidgetParentUid(new WidgetPointer(arg0)))); + if (arg3 > 0) { + setScriptCallOnGameloop(5218, new WidgetPointer(arg0), new WidgetPointer(arg1), arg2, subtract(arg3, 1), new WidgetPointer(arg4), "IIiiI", new WidgetPointer(arg4)); + return; + } + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + ivar5 = cs2method1609(); + if (((boolean)arg2)) { + ivar6 = subtract(ivar5, 22); + } else { + ivar6 = add(ivar5, 22); + } + ivar6 = max(ivar6, 0); + ivar6 = min(ivar6, 255); + } + script_4161(arg0, ivar6); + script_4161(arg1, ivar6); + if (((boolean)ivar6) && ((boolean)arg2)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg4)); + } else if ((ivar6 == 255) && ((boolean)arg2)) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg4)); + setWidgetIsHidden(true, new WidgetPointer(getWidgetParentUid(new WidgetPointer(arg0)))); + } else { + setScriptCallOnGameloop(5218, new WidgetPointer(arg0), new WidgetPointer(arg1), arg2, 0, new WidgetPointer(arg4), "IIiiI", new WidgetPointer(arg4)); + } + return; +} diff --git a/dumps/scripts/5219.cs2 b/dumps/scripts/5219.cs2 new file mode 100644 index 000000000..6399bde2e --- /dev/null +++ b/dumps/scripts/5219.cs2 @@ -0,0 +1,4 @@ +void script_5219(int arg0) { + script_41(arg0); + return; +} diff --git a/dumps/scripts/522.cs2 b/dumps/scripts/522.cs2 new file mode 100644 index 000000000..0809d677e --- /dev/null +++ b/dumps/scripts/522.cs2 @@ -0,0 +1,11 @@ +void script_522(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = getSkillXp(arg1); + ivar3 = getSkillXp(arg1); + ivar2 = script_523(arg1); + ivar4 = subtract(ivar3, ivar2); + setWidgetText(new WidgetPointer(arg0), intToStr(ivar4)); + return; +} diff --git a/dumps/scripts/5220.cs2 b/dumps/scripts/5220.cs2 new file mode 100644 index 000000000..8dd01b63b --- /dev/null +++ b/dumps/scripts/5220.cs2 @@ -0,0 +1,9 @@ +void script_5220() { + script_5219(71565612); + script_5219(71565639); + script_5219(71565573); + script_5219(71566566); + script_5219(71565555); + script_5219(71565569); + return; +} diff --git a/dumps/scripts/5221.cs2 b/dumps/scripts/5221.cs2 new file mode 100644 index 000000000..6d7005656 --- /dev/null +++ b/dumps/scripts/5221.cs2 @@ -0,0 +1,18 @@ +void script_5221() { + script_5222(1); + script_5222(2); + script_5222(3); + script_5222(4); + script_5222(5); + script_5222(6); + script_5222(7); + script_5222(8); + script_5222(9); + script_5222(10); + script_5222(11); + script_5222(12); + script_5222(13); + script_5222(14); + script_5222(15); + return; +} diff --git a/dumps/scripts/5222.cs2 b/dumps/scripts/5222.cs2 new file mode 100644 index 000000000..741dde256 --- /dev/null +++ b/dumps/scripts/5222.cs2 @@ -0,0 +1,39 @@ +void script_5222(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + string svar0; + string svar1; + ivar1 = script_4949(arg0); + ivar2 = script_4959(arg0); + ivar3 = script_4972(arg0); + if (ivar3 == -1) { + return; + } + ivar4 = getWidgetParentUid(new WidgetPointer(ivar3)); + ivar5 = getWidgetParentUid(new WidgetPointer(ivar4)); + svar0 = ""; + svar1 = "Empty skill plot"; + ivar6 = 3; + if (((boolean)arg0)) { + svar0 = "Citadel : Tier " + intToStr(ivar2); + } else if (arg0 == 2) { + svar0 = "Storehouse : Tier " + intToStr(ivar2); + } else if (arg0 == 3) { + svar0 = "Battlefield : Tier " + intToStr(ivar2); + } else if (ivar2 > 0) { + svar0 = svar1 + " : Tier " + intToStr(ivar2); + } else { + svar0 = "Empty skill plot"; + } + svar1 = cs2method_3408(105, 115, 4287, ivar1); + if (getWidgetActualX(new WidgetPointer(ivar4)) < subtract(divide(getWidgetActualWidth(new WidgetPointer(ivar5)), 2), 50)) { + ivar6 = 1; + } + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(ivar3), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, ivar6, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(ivar3)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(ivar3)); + return; +} diff --git a/dumps/scripts/5223.cs2 b/dumps/scripts/5223.cs2 new file mode 100644 index 000000000..e56e94c6c --- /dev/null +++ b/dumps/scripts/5223.cs2 @@ -0,0 +1,25 @@ +cs2func_script_5223_struct(2,0,0) script_5223(int arg0) { + switch (arg0) { + case 1: + return newstruct cs2func_script_5223_struct(71565435, 71565424); + case 2: + return newstruct cs2func_script_5223_struct(71566946, 71566936); + case 3: + return newstruct cs2func_script_5223_struct(71566961, 71566951); + case 4: + return newstruct cs2func_script_5223_struct(71566976, 71566966); + case 5: + return newstruct cs2func_script_5223_struct(71566991, 71566981); + case 6: + return newstruct cs2func_script_5223_struct(71567036, 71567026); + case 7: + return newstruct cs2func_script_5223_struct(71567051, 71567041); + case 8: + return newstruct cs2func_script_5223_struct(71567021, 71567011); + case 9: + return newstruct cs2func_script_5223_struct(71567007, 71566996); + case 10: + return newstruct cs2func_script_5223_struct(71567066, 71567056); + } + return newstruct cs2func_script_5223_struct(-1, -1); +} diff --git a/dumps/scripts/5224.cs2 b/dumps/scripts/5224.cs2 new file mode 100644 index 000000000..d334098b5 --- /dev/null +++ b/dumps/scripts/5224.cs2 @@ -0,0 +1,6 @@ +int script_5224(int arg0) { + if (cs2method3701()) { + return script_5225(arg0); + } + return 0; +} diff --git a/dumps/scripts/5225.cs2 b/dumps/scripts/5225.cs2 new file mode 100644 index 000000000..ec3c40c9a --- /dev/null +++ b/dumps/scripts/5225.cs2 @@ -0,0 +1,28 @@ +int script_5225(int arg0) { + int ivar1; + ivar1 = -1; + ivar1 = cs2method3717(strRemoveEntities(cs2method5020())); + if (ivar1 < 0) { + return 0; + } + if (arg0 == -1) { + arg0 = cs2method3711(ivar1); + } + switch (arg0) { + case 100: + return clanbitconfig_263; + case 101: + return clanbitconfig_264; + case 102: + return clanbitconfig_265; + case 103: + return clanbitconfig_266; + case 125: + return clanbitconfig_267; + case 126: + return 1; + case 127: + return 1; + } + return 0; +} diff --git a/dumps/scripts/5226.cs2 b/dumps/scripts/5226.cs2 new file mode 100644 index 000000000..3bbaadf29 --- /dev/null +++ b/dumps/scripts/5226.cs2 @@ -0,0 +1,6 @@ +void script_5226() { + if (cs2method3701()) { + script_4328(71827829); + } + return; +} diff --git a/dumps/scripts/5227.cs2 b/dumps/scripts/5227.cs2 new file mode 100644 index 000000000..2daf9d663 --- /dev/null +++ b/dumps/scripts/5227.cs2 @@ -0,0 +1,62 @@ +void script_5227() { + int ivar0; + int ivar1; + string svar0; + script_5228(4); + script_5228(5); + script_5228(6); + script_5228(7); + script_5228(8); + script_5228(9); + script_5228(10); + script_5228(11); + script_5228(12); + script_5228(13); + script_5228(14); + script_5228(15); + ivar0 = getWidgetParentUid(new WidgetPointer(1092,928)); + if (ivar0 == -1) { + return; + } + ivar1 = 2; + if (getWidgetActualY(new WidgetPointer(1092,928)) > divide(getWidgetActualHeight(new WidgetPointer(ivar0)), 2)) { + ivar1 = 0; + } + svar0 = "Teleport to the keep."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,928), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, ivar1, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,928)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,928)); + setWidgetContextMenuOption(1, new WidgetPointer(1092,928), "Teleport to keep"); + ivar1 = 2; + if (getWidgetActualY(new WidgetPointer(1092,931)) > divide(getWidgetActualHeight(new WidgetPointer(ivar0)), 2)) { + ivar1 = 0; + } + svar0 = "Teleport to the town square."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,931), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, ivar1, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,931)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,931)); + setWidgetContextMenuOption(1, new WidgetPointer(1092,931), "Teleport to town square"); + ivar1 = 2; + if (getWidgetActualY(new WidgetPointer(1092,929)) > divide(getWidgetActualHeight(new WidgetPointer(ivar0)), 2)) { + ivar1 = 0; + } + svar0 = "Teleport to the portal."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,929), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, ivar1, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,929)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,929)); + setWidgetContextMenuOption(1, new WidgetPointer(1092,929), "Teleport to portal"); + ivar1 = 2; + if (getWidgetActualY(new WidgetPointer(1092,930)) > divide(getWidgetActualHeight(new WidgetPointer(ivar0)), 2)) { + ivar1 = 0; + } + svar0 = "Teleport to the welcome area."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,930), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, ivar1, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,930)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,930)); + setWidgetContextMenuOption(1, new WidgetPointer(1092,930), "Teleport to welcome area"); + ivar1 = 2; + if (getWidgetActualY(new WidgetPointer(1092,932)) > divide(getWidgetActualHeight(new WidgetPointer(ivar0)), 2)) { + ivar1 = 0; + } + svar0 = "Teleport to the battlefield."; + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(1092,932), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, ivar1, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(1092,932)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(1092,932)); + setWidgetContextMenuOption(1, new WidgetPointer(1092,930), "Teleport to welcome area"); + return; +} diff --git a/dumps/scripts/5228.cs2 b/dumps/scripts/5228.cs2 new file mode 100644 index 000000000..f819f5e6f --- /dev/null +++ b/dumps/scripts/5228.cs2 @@ -0,0 +1,32 @@ +void script_5228(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + string svar0; + ivar1 = 0; + svar0 = ""; + ivar2 = script_4969(arg0); + ivar3 = -1; + ivar4 = 2; + if (ivar2 == -1) { + return; + } + if (citadelConfigsInitialized()) { + ivar1 = script_4949(arg0); + if (ivar1 > 0) { + svar0 = "Teleport to the " + cs2method_3408(105, 115, 4287, ivar1) + " skill plot."; + ivar3 = getWidgetParentUid(new WidgetPointer(ivar2)); + if (getWidgetActualY(new WidgetPointer(ivar2)) > divide(getWidgetActualHeight(new WidgetPointer(ivar3)), 2)) { + ivar4 = 0; + } + setScriptCallOnMouseOver(4538, new WidgetPointer(1092,327), new WidgetPointer(ivar2), -1, svar0, 120, 3793, 3793, 16777215, 13, 4, ivar4, -2147483647, -2147483646, "IIisifdiiiiii", new WidgetPointer(ivar2)); + setScriptCallOnMouseExit(40, new WidgetPointer(1092,327), "I", new WidgetPointer(ivar2)); + setWidgetContextMenuOption(1, new WidgetPointer(ivar2), "Teleport to " + cs2method_3408(105, 115, 4287, ivar1)); + return; + } + } + setScriptCallOnMouseOver(-1, "", new WidgetPointer(ivar2)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(ivar2)); + return; +} diff --git a/dumps/scripts/5229.cs2 b/dumps/scripts/5229.cs2 new file mode 100644 index 000000000..2fc3f46d7 --- /dev/null +++ b/dumps/scripts/5229.cs2 @@ -0,0 +1,4 @@ +void script_5229(int arg0,int arg1) { + script_337(arg0, arg1, 1); + return; +} diff --git a/dumps/scripts/523.cs2 b/dumps/scripts/523.cs2 new file mode 100644 index 000000000..9863fd115 --- /dev/null +++ b/dumps/scripts/523.cs2 @@ -0,0 +1,30 @@ +int script_523(int arg0) { + if (arg0 == 20) { + return globalint_54; + } + if (arg0 == 12) { + return globalint_55; + } + if (arg0 == 9) { + return globalint_57; + } + if (arg0 == 7) { + return globalint_58; + } + if (arg0 == 22) { + return globalint_60; + } + if (arg0 == 15) { + return globalint_61; + } + if (arg0 == 6) { + return globalint_64; + } + if (arg0 == 13) { + return globalint_66; + } + if (arg0 == 19) { + return globalint_62; + } + return 0; +} diff --git a/dumps/scripts/5230.cs2 b/dumps/scripts/5230.cs2 new file mode 100644 index 000000000..b9339c777 --- /dev/null +++ b/dumps/scripts/5230.cs2 @@ -0,0 +1,7 @@ +void script_5230(int arg0,int arg1,int arg2) { + if (cs2method3700()) { + script_4340(arg0, clanconfig_0, arg1, arg2); + setScriptCallOnClanChatSettingsStuff(-1, "", new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/5231.cs2 b/dumps/scripts/5231.cs2 new file mode 100644 index 000000000..3bfbb95f0 --- /dev/null +++ b/dumps/scripts/5231.cs2 @@ -0,0 +1,47 @@ +void script_5231(int arg0) { + flow_0: + SWITCH (globalint_1007) { + case 0: + GOTO flow_1 + case 1: + GOTO flow_2 + case 2: + GOTO flow_3 + case 3: + GOTO flow_6 + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + cs2method5512(); + GOTO flow_8 + flow_1: + script_2766(0, 30, arg0); + GOTO flow_8 + flow_2: + cs2method5405(0, 5); + cs2method5405(1, 5); + cs2method5406(0, 0, 51875191, 1600, 51875191, 1600, 0); + cs2method5406(1, 0, 51858819, 600, 51858818, 600, 0); + cs2method5406(0, 1, 51875206, 2100, 51875209, 2100, 0); + cs2method5406(1, 1, 51858831, 600, 51858836, 600, 0); + cs2method5406(0, 2, 51907986, 1400, 51907987, 1400, 0); + cs2method5406(1, 2, 51744156, 400, 51678621, 400, 0); + cs2method5406(0, 3, 51793308, 700, 51776926, 700, 0); + cs2method5406(1, 3, 51596695, 300, 51613076, 300, 0); + cs2method5406(0, 4, 51694999, 500, 51678614, 500, 0); + cs2method5406(1, 4, 51826061, 300, 51858830, 300, 0); + cameraMethod5502(0, 0, 0, 0, 1, 0); + script_2768(30, arg0); + GOTO flow_8 + flow_3: + if (cs2method5407(0) == 5) { + cameraMethod5502(0, 0, 300, 800, 1, 0); + setScriptCallOnMinimapRelatedSetting3(5232, new WidgetPointer(arg0), 1, "Ii", new WidgetPointer(arg0)); + } + GOTO flow_8 + flow_6: + if (cs2method5407(0) == 5) { + cameraMethod5502(0, 3, 500, 400, 1, 3); + } + flow_8: + return; +} diff --git a/dumps/scripts/5232.cs2 b/dumps/scripts/5232.cs2 new file mode 100644 index 000000000..d2fd6c4f9 --- /dev/null +++ b/dumps/scripts/5232.cs2 @@ -0,0 +1,14 @@ +void script_5232(int arg0,int arg1) { + if ((cs2method5407(0) == 5) && (globalint_1007 == 2)) { + if (((boolean)arg1)) { + cameraMethod5502(0, 1, 800, 700, 1, 1); + setScriptCallOnMinimapRelatedSetting3(5232, new WidgetPointer(arg0), 2, "Ii", new WidgetPointer(arg0)); + return; + } + if (arg1 == 2) { + cameraMethod5502(0, 2, 700, 40, 1, 2); + } + } + setScriptCallOnMinimapRelatedSetting3(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5233.cs2 b/dumps/scripts/5233.cs2 new file mode 100644 index 000000000..15a958364 --- /dev/null +++ b/dumps/scripts/5233.cs2 @@ -0,0 +1,4 @@ +void script_5233(int arg0,int arg1) { + script_2010(arg0, arg1, "Level 21 Agility"); + return; +} diff --git a/dumps/scripts/5234.cs2 b/dumps/scripts/5234.cs2 new file mode 100644 index 000000000..d900c3b59 --- /dev/null +++ b/dumps/scripts/5234.cs2 @@ -0,0 +1,13 @@ +void script_5234(int arg0) { + switch (arg0) { + case 73793656: + setWidgetIsHidden(false, new WidgetPointer(1126,121)); + break; + case 73793729: + setWidgetIsHidden(false, new WidgetPointer(1126,194)); + break; + case 73793731: + setWidgetIsHidden(false, new WidgetPointer(1126,196)); + } + return; +} diff --git a/dumps/scripts/5235.cs2 b/dumps/scripts/5235.cs2 new file mode 100644 index 000000000..a8d63e001 --- /dev/null +++ b/dumps/scripts/5235.cs2 @@ -0,0 +1,13 @@ +void script_5235(int arg0) { + switch (arg0) { + case 73793656: + setWidgetIsHidden(true, new WidgetPointer(1126,121)); + break; + case 73793729: + setWidgetIsHidden(true, new WidgetPointer(1126,194)); + break; + case 73793731: + setWidgetIsHidden(true, new WidgetPointer(1126,196)); + } + return; +} diff --git a/dumps/scripts/5236.cs2 b/dumps/scripts/5236.cs2 new file mode 100644 index 000000000..b87d1a295 --- /dev/null +++ b/dumps/scripts/5236.cs2 @@ -0,0 +1,8 @@ +void script_5236() { + int ivar0; + ivar0 = subtract(120, multiplyDivide(120, 100, globalint_1186)); + if (getWidgetActualWidth(new WidgetPointer(1126,124)) < ivar0) { + setWidgetSize(add(getWidgetActualWidth(new WidgetPointer(1126,124)), 1), getWidgetActualHeight(new WidgetPointer(1126,124)), 0, 0, new WidgetPointer(1126,124)); + } + return; +} diff --git a/dumps/scripts/5237.cs2 b/dumps/scripts/5237.cs2 new file mode 100644 index 000000000..7daf4a1ca --- /dev/null +++ b/dumps/scripts/5237.cs2 @@ -0,0 +1,5 @@ +void script_5237() { + setWidgetSize(0, getWidgetActualHeight(new WidgetPointer(1126,124)), 0, 0, new WidgetPointer(1126,124)); + setWidgetIsHidden(true, new WidgetPointer(1126,47)); + return; +} diff --git a/dumps/scripts/5238.cs2 b/dumps/scripts/5238.cs2 new file mode 100644 index 000000000..16d24f676 --- /dev/null +++ b/dumps/scripts/5238.cs2 @@ -0,0 +1,30 @@ +void script_5238(int arg0) { + int ivar1; + string svar0; + svar0 = "Ability"; + ivar1 = cs2method_3408(105, 74, 5033, bitconfig_9712); + setWidgetIsHidden(true, new WidgetPointer(1126,4)); + setWidgetIsHidden(true, new WidgetPointer(1126,5)); + setWidgetIsHidden(true, new WidgetPointer(1126,6)); + setWidgetIsHidden(true, new WidgetPointer(1126,7)); + switch (arg0) { + case 1: + svar0 = getOtherCommonData(ivar1, 1900); + setWidgetIsHidden(false, new WidgetPointer(1126,4)); + break; + case 2: + svar0 = getOtherCommonData(ivar1, 1903); + setWidgetIsHidden(false, new WidgetPointer(1126,5)); + break; + case 3: + svar0 = getOtherCommonData(ivar1, 1906); + setWidgetIsHidden(false, new WidgetPointer(1126,6)); + break; + case 4: + svar0 = getOtherCommonData(ivar1, 1909); + setWidgetIsHidden(false, new WidgetPointer(1126,7)); + } + setWidgetText(new WidgetPointer(1126,49), svar0); + setWidgetIsHidden(false, new WidgetPointer(1126,47)); + return; +} diff --git a/dumps/scripts/5239.cs2 b/dumps/scripts/5239.cs2 new file mode 100644 index 000000000..c5b27b1b9 --- /dev/null +++ b/dumps/scripts/5239.cs2 @@ -0,0 +1,4 @@ +void script_5239() { + setWidgetIsHidden(true, new WidgetPointer(1126,47)); + return; +} diff --git a/dumps/scripts/524.cs2 b/dumps/scripts/524.cs2 new file mode 100644 index 000000000..735d334e1 --- /dev/null +++ b/dumps/scripts/524.cs2 @@ -0,0 +1,46 @@ +void script_524(int arg0,int arg1) { + int ivar2; + ivar2 = 0; + if (bitconfig_4103 >= 300000) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + return; + } + if (arg0 == 19726381) { + ivar2 = bitconfig_4090; + } + if (arg0 == 19726383) { + ivar2 = bitconfig_4091; + } + if (arg0 == 19726385) { + ivar2 = bitconfig_4093; + } + if (arg0 == 19726387) { + ivar2 = bitconfig_4095; + } + if (arg0 == 19726389) { + ivar2 = bitconfig_4096; + } + if (arg0 == 19726391) { + ivar2 = bitconfig_4098; + } + if (arg0 == 19726393) { + ivar2 = bitconfig_4100; + } + if (arg0 == 19726395) { + ivar2 = bitconfig_4101; + } + if (arg0 == 19726397) { + ivar2 = bitconfig_4102; + } + if ((arg0 == 19726419) || (arg0 == 19726420)) { + ivar2 = 1; + } + if (((boolean)ivar2)) { + setWidgetRGB(new Color(250, 180, 50), new WidgetPointer(arg0)); + setWidgetRGB(new Color(250, 180, 50), new WidgetPointer(arg1)); + } else { + setWidgetRGB(new Color(96, 96, 96), new WidgetPointer(arg0)); + setWidgetRGB(new Color(96, 96, 96), new WidgetPointer(arg1)); + } + return; +} diff --git a/dumps/scripts/5240.cs2 b/dumps/scripts/5240.cs2 new file mode 100644 index 000000000..09830aa20 --- /dev/null +++ b/dumps/scripts/5240.cs2 @@ -0,0 +1,12 @@ +void script_5240(int arg0) { + if (((boolean)globalint_1184)) { + if (arg0 == 73793728) { + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(arg0)); + } + } else { + if (arg0 == 73793723) { + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/5241.cs2 b/dumps/scripts/5241.cs2 new file mode 100644 index 000000000..483d0e60d --- /dev/null +++ b/dumps/scripts/5241.cs2 @@ -0,0 +1,12 @@ +void script_5241(int arg0) { + if (((boolean)globalint_1184)) { + if (arg0 == 73793728) { + setWidgetRGB(new Color(153, 145, 122), new WidgetPointer(arg0)); + } + } else { + if (arg0 == 73793723) { + setWidgetRGB(new Color(153, 145, 122), new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/5242.cs2 b/dumps/scripts/5242.cs2 new file mode 100644 index 000000000..7310528ea --- /dev/null +++ b/dumps/scripts/5242.cs2 @@ -0,0 +1,23 @@ +void script_5242(int arg0) { + playSoundEffect2False(6185, 1, 0, 127); + if (arg0 == 73793723) { + setWidgetRGB(new Color(153, 145, 122), new WidgetPointer(1126,192)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(1126,187)); + setWidgetSprite(459, new WidgetPointer(1126,189)); + setWidgetSprite(460, new WidgetPointer(1126,190)); + setWidgetSprite(459, new WidgetPointer(1126,191)); + setWidgetSprite(454, new WidgetPointer(1126,0)); + setWidgetSprite(456, new WidgetPointer(1126,1)); + setWidgetSprite(454, new WidgetPointer(1126,186)); + } else { + setWidgetRGB(new Color(153, 145, 122), new WidgetPointer(1126,187)); + setWidgetRGB(new Color(235, 224, 188), new WidgetPointer(1126,192)); + setWidgetSprite(454, new WidgetPointer(1126,189)); + setWidgetSprite(456, new WidgetPointer(1126,190)); + setWidgetSprite(454, new WidgetPointer(1126,191)); + setWidgetSprite(459, new WidgetPointer(1126,0)); + setWidgetSprite(460, new WidgetPointer(1126,1)); + setWidgetSprite(459, new WidgetPointer(1126,186)); + } + return; +} diff --git a/dumps/scripts/5243.cs2 b/dumps/scripts/5243.cs2 new file mode 100644 index 000000000..1faa9dc0a --- /dev/null +++ b/dumps/scripts/5243.cs2 @@ -0,0 +1,12 @@ +void script_5243(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(6379, new WidgetPointer(1128,329)); + setWidgetSprite(6380, new WidgetPointer(1128,330)); + setWidgetSprite(6381, new WidgetPointer(1128,331)); + } else { + setWidgetSprite(6379, new WidgetPointer(1128,0)); + setWidgetSprite(6380, new WidgetPointer(1128,1)); + setWidgetSprite(6381, new WidgetPointer(1128,2)); + } + return; +} diff --git a/dumps/scripts/5244.cs2 b/dumps/scripts/5244.cs2 new file mode 100644 index 000000000..061baa38b --- /dev/null +++ b/dumps/scripts/5244.cs2 @@ -0,0 +1,12 @@ +void script_5244(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(6370, new WidgetPointer(1128,329)); + setWidgetSprite(6371, new WidgetPointer(1128,330)); + setWidgetSprite(6372, new WidgetPointer(1128,331)); + } else { + setWidgetSprite(6370, new WidgetPointer(1128,0)); + setWidgetSprite(6371, new WidgetPointer(1128,1)); + setWidgetSprite(6372, new WidgetPointer(1128,2)); + } + return; +} diff --git a/dumps/scripts/5245.cs2 b/dumps/scripts/5245.cs2 new file mode 100644 index 000000000..5549ff73e --- /dev/null +++ b/dumps/scripts/5245.cs2 @@ -0,0 +1,40 @@ +void script_5245() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (getWidgetSpriteId(new WidgetPointer(1128,4)) == 6007) { + ivar0 = add(ivar0, 20); + ivar1 = add(ivar1, 20); + } + if (getWidgetSpriteId(new WidgetPointer(1128,104)) == 6007) { + ivar0 = add(ivar0, 20); + ivar1 = add(ivar1, 20); + } + if (getWidgetSpriteId(new WidgetPointer(1128,142)) == 6007) { + ivar0 = add(ivar0, 30); + ivar1 = add(ivar1, 20); + } + if (getWidgetSpriteId(new WidgetPointer(1128,179)) == 6007) { + ivar0 = add(ivar0, 28); + ivar1 = add(ivar1, 20); + } + if (getWidgetSpriteId(new WidgetPointer(1128,216)) == 6007) { + ivar0 = add(ivar0, 24); + ivar1 = add(ivar1, 20); + } + if (getWidgetSpriteId(new WidgetPointer(1128,253)) == 6007) { + ivar0 = add(ivar0, 26); + ivar1 = add(ivar1, 20); + } + if (getWidgetSpriteId(new WidgetPointer(1128,290)) == 6007) { + ivar0 = add(ivar0, 200); + ivar1 = add(ivar1, 200); + } + if ((bitconfig_5505 < ivar0) || (bitconfig_5505 < ivar1)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1128,13)); + } else { + setWidgetRGB(new Color(168, 141, 101), new WidgetPointer(1128,13)); + } + return; +} diff --git a/dumps/scripts/5246.cs2 b/dumps/scripts/5246.cs2 new file mode 100644 index 000000000..4039bc7eb --- /dev/null +++ b/dumps/scripts/5246.cs2 @@ -0,0 +1,4 @@ +void script_5246() { + script_41(73924683); + return; +} diff --git a/dumps/scripts/5247.cs2 b/dumps/scripts/5247.cs2 new file mode 100644 index 000000000..2f5792ee1 --- /dev/null +++ b/dumps/scripts/5247.cs2 @@ -0,0 +1,18 @@ +void script_5247() { + setWidgetIsHidden(true, new WidgetPointer(1128,97)); + setWidgetSprite(6009, new WidgetPointer(1128,4)); + setWidgetIsHidden(true, new WidgetPointer(1128,127)); + setWidgetSprite(6009, new WidgetPointer(1128,104)); + setWidgetIsHidden(true, new WidgetPointer(1128,165)); + setWidgetSprite(6009, new WidgetPointer(1128,142)); + setWidgetIsHidden(true, new WidgetPointer(1128,202)); + setWidgetSprite(6009, new WidgetPointer(1128,179)); + setWidgetIsHidden(true, new WidgetPointer(1128,239)); + setWidgetSprite(6009, new WidgetPointer(1128,216)); + setWidgetIsHidden(true, new WidgetPointer(1128,276)); + setWidgetSprite(6009, new WidgetPointer(1128,253)); + setWidgetIsHidden(true, new WidgetPointer(1128,313)); + setWidgetSprite(6009, new WidgetPointer(1128,290)); + setWidgetText(new WidgetPointer(1128,13), intToStr(bitconfig_5505)); + return; +} diff --git a/dumps/scripts/5248.cs2 b/dumps/scripts/5248.cs2 new file mode 100644 index 000000000..5fd92c80e --- /dev/null +++ b/dumps/scripts/5248.cs2 @@ -0,0 +1,4 @@ +void script_5248() { + setWidgetText(new WidgetPointer(1128,13), intToStr(bitconfig_5505)); + return; +} diff --git a/dumps/scripts/5249.cs2 b/dumps/scripts/5249.cs2 new file mode 100644 index 000000000..95ef9f9cb --- /dev/null +++ b/dumps/scripts/5249.cs2 @@ -0,0 +1,44 @@ +void script_5249() { + setWidgetIsHidden(true, new WidgetPointer(1127,64)); + setWidgetIsHidden(true, new WidgetPointer(1127,65)); + setWidgetIsHidden(true, new WidgetPointer(1127,66)); + setWidgetIsHidden(true, new WidgetPointer(1127,9)); + setWidgetIsHidden(true, new WidgetPointer(1127,10)); + setWidgetIsHidden(true, new WidgetPointer(1127,11)); + setWidgetIsHidden(true, new WidgetPointer(1127,61)); + setWidgetIsHidden(true, new WidgetPointer(1127,62)); + setWidgetIsHidden(true, new WidgetPointer(1127,63)); + setWidgetIsHidden(true, new WidgetPointer(1127,67)); + setWidgetIsHidden(true, new WidgetPointer(1127,68)); + setWidgetIsHidden(true, new WidgetPointer(1127,69)); + setWidgetIsHidden(true, new WidgetPointer(1127,70)); + setWidgetIsHidden(true, new WidgetPointer(1127,71)); + setWidgetIsHidden(true, new WidgetPointer(1127,72)); + switch (standart_config_2373) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(1127,64)); + setWidgetIsHidden(false, new WidgetPointer(1127,65)); + setWidgetIsHidden(false, new WidgetPointer(1127,66)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(1127,9)); + setWidgetIsHidden(false, new WidgetPointer(1127,10)); + setWidgetIsHidden(false, new WidgetPointer(1127,11)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(1127,61)); + setWidgetIsHidden(false, new WidgetPointer(1127,62)); + setWidgetIsHidden(false, new WidgetPointer(1127,63)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(1127,67)); + setWidgetIsHidden(false, new WidgetPointer(1127,68)); + setWidgetIsHidden(false, new WidgetPointer(1127,69)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(1127,70)); + setWidgetIsHidden(false, new WidgetPointer(1127,71)); + setWidgetIsHidden(false, new WidgetPointer(1127,72)); + } + return; +} diff --git a/dumps/scripts/525.cs2 b/dumps/scripts/525.cs2 new file mode 100644 index 000000000..fc7c70a16 --- /dev/null +++ b/dumps/scripts/525.cs2 @@ -0,0 +1,4 @@ +void script_525(int arg0,int arg1) { + setWidgetText(new WidgetPointer(arg0), intToStr(getSkillCurrentLvl(arg1))); + return; +} diff --git a/dumps/scripts/5250.cs2 b/dumps/scripts/5250.cs2 new file mode 100644 index 000000000..2be2d44c3 --- /dev/null +++ b/dumps/scripts/5250.cs2 @@ -0,0 +1,74 @@ +void script_5250(int arg0) { + switch (standart_config_2373) { + case 2: + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(1127,18), "Battle-mage Helm"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and magical attacks, weak against ranged."); + } + if (arg0 == 2) { + setWidgetText(new WidgetPointer(1127,18), "Trickster Hood"); + setWidgetText(new WidgetPointer(1127,17), "Strong against ranged and magical attacks, weak against melee."); + } + if (arg0 == 3) { + setWidgetText(new WidgetPointer(1127,18), "Vanguard Helm"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and ranged attacks, weak against magic."); + } + break; + case 1: + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(1127,18), "Battle-mage robe legs"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and magical attacks, weak against ranged."); + } + if (arg0 == 2) { + setWidgetText(new WidgetPointer(1127,18), "Trickster robe legs"); + setWidgetText(new WidgetPointer(1127,17), "Strong against ranged and magical attacks, weak against melee."); + } + if (arg0 == 3) { + setWidgetText(new WidgetPointer(1127,18), "Vanguard leg armour"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and ranged attacks, weak against magic."); + } + break; + case 3: + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(1127,18), "Battle-mage robe"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and magical attacks, weak against ranged."); + } + if (arg0 == 2) { + setWidgetText(new WidgetPointer(1127,18), "Trickster robe"); + setWidgetText(new WidgetPointer(1127,17), "Strong against ranged and magical attacks, weak against melee."); + } + if (arg0 == 3) { + setWidgetText(new WidgetPointer(1127,18), "Vanguard body armour"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and ranged attacks, weak against magic."); + } + break; + case 5: + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(1127,18), "Battle-mage gloves"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and magical attacks, weak against ranged."); + } + if (arg0 == 2) { + setWidgetText(new WidgetPointer(1127,18), "Trickster gloves"); + setWidgetText(new WidgetPointer(1127,17), "Strong against ranged and magical attacks, weak against melee."); + } + if (arg0 == 3) { + setWidgetText(new WidgetPointer(1127,18), "Vanguard gloves"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and ranged attacks, weak against magic."); + } + break; + case 4: + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(1127,18), "Battle-mage boots"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and magical attacks, weak against ranged."); + } + if (arg0 == 2) { + setWidgetText(new WidgetPointer(1127,18), "Trickster boots"); + setWidgetText(new WidgetPointer(1127,17), "Strong against ranged and magical attacks, weak against melee."); + } + if (arg0 == 3) { + setWidgetText(new WidgetPointer(1127,18), "Vanguard boots"); + setWidgetText(new WidgetPointer(1127,17), "Strong against melee and ranged attacks, weak against magic."); + } + } + return; +} diff --git a/dumps/scripts/5251.cs2 b/dumps/scripts/5251.cs2 new file mode 100644 index 000000000..3c3cab3a8 --- /dev/null +++ b/dumps/scripts/5251.cs2 @@ -0,0 +1,5 @@ +void script_5251() { + setWidgetText(new WidgetPointer(1127,18), "You have received a piece of Hybrid Armour!"); + setWidgetText(new WidgetPointer(1127,17), "Select which reward you would prefer"); + return; +} diff --git a/dumps/scripts/5252.cs2 b/dumps/scripts/5252.cs2 new file mode 100644 index 000000000..f02cefac4 --- /dev/null +++ b/dumps/scripts/5252.cs2 @@ -0,0 +1,5 @@ +void script_5252() { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,137)); + setWidgetIsHidden(false, new WidgetPointer(779,136)); + return; +} diff --git a/dumps/scripts/5253.cs2 b/dumps/scripts/5253.cs2 new file mode 100644 index 000000000..9b83a9c1b --- /dev/null +++ b/dumps/scripts/5253.cs2 @@ -0,0 +1,5 @@ +void script_5253() { + setWidgetRGB(new Color(150, 150, 150), new WidgetPointer(779,137)); + setWidgetIsHidden(true, new WidgetPointer(779,136)); + return; +} diff --git a/dumps/scripts/5254.cs2 b/dumps/scripts/5254.cs2 new file mode 100644 index 000000000..929bf4638 --- /dev/null +++ b/dumps/scripts/5254.cs2 @@ -0,0 +1,4 @@ +void script_5254(int arg0) { + script_4534(arg0); + return; +} diff --git a/dumps/scripts/5255.cs2 b/dumps/scripts/5255.cs2 new file mode 100644 index 000000000..0a62c49d1 --- /dev/null +++ b/dumps/scripts/5255.cs2 @@ -0,0 +1,3 @@ +int script_5255() { + return multiply(max(getSkillActualLvl(5), 1), 10); +} diff --git a/dumps/scripts/5256.cs2 b/dumps/scripts/5256.cs2 new file mode 100644 index 000000000..9f6d650ec --- /dev/null +++ b/dumps/scripts/5256.cs2 @@ -0,0 +1,3 @@ +int script_5256() { + return bitconfig_9816; +} diff --git a/dumps/scripts/5257.cs2 b/dumps/scripts/5257.cs2 new file mode 100644 index 000000000..0ca6aef64 --- /dev/null +++ b/dumps/scripts/5257.cs2 @@ -0,0 +1,4 @@ +void script_5257(int arg0,int arg1) { + script_5264(arg0, arg1); + return; +} diff --git a/dumps/scripts/5258.cs2 b/dumps/scripts/5258.cs2 new file mode 100644 index 000000000..1eca7dabb --- /dev/null +++ b/dumps/scripts/5258.cs2 @@ -0,0 +1,4 @@ +void script_5258() { + script_5259(add(bitconfig_9763, bitconfig_9771)); + return; +} diff --git a/dumps/scripts/5259.cs2 b/dumps/scripts/5259.cs2 new file mode 100644 index 000000000..b9f77ef8e --- /dev/null +++ b/dumps/scripts/5259.cs2 @@ -0,0 +1,33 @@ +void script_5259(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar1 = 74252290; + ivar2 = 0; + ivar3 = 0; + ivar4 = 126; + ivar5 = 99; + if (((boolean)arg0)) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar1)), 0, 0, 0, new WidgetPointer(ivar1)); + } + if (arg0 < 61) { + ivar2 = multiplyDivide(arg0, 61, 100); + ivar3 = multiplyDivide(ivar4, 100, ivar2); + if (((boolean)ivar3)) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar1)), 1, 0, 0, new WidgetPointer(ivar1)); + } else { + setScriptCallOnGameloop(5260, ivar3, "i", new WidgetPointer(ivar1)); + } + } else { + arg0 = subtract(arg0, 60); + ivar2 = multiplyDivide(arg0, 140, 100); + ivar3 = add(ivar4, multiplyDivide(ivar5, 100, ivar2)); + if (isWidgetHidden(new WidgetPointer(ivar1))) { + messageType0("Hidden."); + } + setScriptCallOnGameloop(5260, ivar3, "i", new WidgetPointer(ivar1)); + } + return; +} diff --git a/dumps/scripts/526.cs2 b/dumps/scripts/526.cs2 new file mode 100644 index 000000000..cd5c1867b --- /dev/null +++ b/dumps/scripts/526.cs2 @@ -0,0 +1,9 @@ +void script_526(int arg0,int arg1,int arg2) { + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(arg1)); + if (((boolean)arg0)) { + setWidgetFilled(0, new WidgetPointer(arg2)); + } + script_41(19726421); + globalint_1 = 0; + return; +} diff --git a/dumps/scripts/5260.cs2 b/dumps/scripts/5260.cs2 new file mode 100644 index 000000000..0a613f055 --- /dev/null +++ b/dumps/scripts/5260.cs2 @@ -0,0 +1,11 @@ +void script_5260(int arg0) { + int ivar1; + ivar1 = 74252290; + if (getWidgetActualHeight(new WidgetPointer(ivar1)) >= arg0) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar1)), arg0, 0, 0, new WidgetPointer(ivar1)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(ivar1)); + } else { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar1)), add(getWidgetActualHeight(new WidgetPointer(ivar1)), 1), 0, 0, new WidgetPointer(ivar1)); + } + return; +} diff --git a/dumps/scripts/5261.cs2 b/dumps/scripts/5261.cs2 new file mode 100644 index 000000000..cc52eb5d3 --- /dev/null +++ b/dumps/scripts/5261.cs2 @@ -0,0 +1,16 @@ +void script_5261(int arg0) { + switch (arg0) { + case 74186762: + setWidgetIsHidden(false, new WidgetPointer(1132,22)); + setWidgetText(new WidgetPointer(1132,23), "4"); + setWidgetIsHidden(false, new WidgetPointer(1132,23)); + setScriptCallOnGameloop(5262, 4, 0, new WidgetPointer(1132,10), "iiI", new WidgetPointer(arg0)); + break; + case 74186763: + setWidgetIsHidden(false, new WidgetPointer(1132,27)); + setWidgetText(new WidgetPointer(1132,28), "2"); + setWidgetIsHidden(false, new WidgetPointer(1132,28)); + setScriptCallOnGameloop(5262, 2, 0, new WidgetPointer(1132,11), "iiI", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/5262.cs2 b/dumps/scripts/5262.cs2 new file mode 100644 index 000000000..7668b05dd --- /dev/null +++ b/dumps/scripts/5262.cs2 @@ -0,0 +1,36 @@ +void script_5262(int arg0,int arg1,int arg2) { + if (arg1 == 50) { + if (((boolean)arg0)) { + switch (arg2) { + case 74186762: + setWidgetIsHidden(true, new WidgetPointer(1132,22)); + setWidgetIsHidden(true, new WidgetPointer(1132,23)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg2)); + break; + case 74186763: + setWidgetIsHidden(true, new WidgetPointer(1132,27)); + setWidgetIsHidden(true, new WidgetPointer(1132,28)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg2)); + } + } else { + switch (arg2) { + case 74186762: + setWidgetText(new WidgetPointer(1132,23), intToStr(subtract(arg0, 1))); + setScriptCallOnGameloop(5262, subtract(arg0, 1), 0, new WidgetPointer(arg2), "iiI", new WidgetPointer(arg2)); + break; + case 74186763: + setWidgetText(new WidgetPointer(1132,28), intToStr(subtract(arg0, 1))); + setScriptCallOnGameloop(5262, subtract(arg0, 1), 0, new WidgetPointer(arg2), "iiI", new WidgetPointer(arg2)); + } + } + } else { + switch (arg2) { + case 74186762: + setScriptCallOnGameloop(5262, arg0, add(arg1, 1), new WidgetPointer(1132,10), "iiI", new WidgetPointer(arg2)); + break; + case 74186763: + setScriptCallOnGameloop(5262, arg0, add(arg1, 1), new WidgetPointer(1132,11), "iiI", new WidgetPointer(arg2)); + } + } + return; +} diff --git a/dumps/scripts/5263.cs2 b/dumps/scripts/5263.cs2 new file mode 100644 index 000000000..d702b6e1e --- /dev/null +++ b/dumps/scripts/5263.cs2 @@ -0,0 +1,18 @@ +void script_5263(int arg0) { + int ivar1; + int ivar2; + ivar1 = 28180558; + ivar2 = 28180559; + if (((boolean)bitconfig_9814)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(ivar1)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(ivar1)); + } else { + if (((boolean)bitconfig_9815)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg0)), getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(ivar2)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(ivar2)); + } + } + return; +} diff --git a/dumps/scripts/5264.cs2 b/dumps/scripts/5264.cs2 new file mode 100644 index 000000000..010b481eb --- /dev/null +++ b/dumps/scripts/5264.cs2 @@ -0,0 +1,15 @@ +void script_5264(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + setWidgetSize(getTextWidth(495, intToStr(script_5255()) + " / " + intToStr(script_5255())), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + ivar2 = 190; + ivar3 = 8; + ivar4 = add(add(getWidgetActualWidth(new WidgetPointer(arg0)), getWidgetActualWidth(new WidgetPointer(arg1))), ivar3); + ivar5 = divide(subtract(ivar2, ivar4), 2); + setWidgetPosition(ivar5, getWidgetActualY(new WidgetPointer(arg1)), 0, 0, new WidgetPointer(arg1)); + ivar5 = add(add(ivar5, getWidgetActualWidth(new WidgetPointer(arg1))), ivar3); + setWidgetPosition(ivar5, getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5265.cs2 b/dumps/scripts/5265.cs2 new file mode 100644 index 000000000..187598073 --- /dev/null +++ b/dumps/scripts/5265.cs2 @@ -0,0 +1,9 @@ +void script_5265() { + if (((boolean)bitconfig_9822)) { + setWidgetIsHidden(false, new WidgetPointer(1137,5)); + setWidgetIsHidden(true, new WidgetPointer(1137,62)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1137,5)); + } + return; +} diff --git a/dumps/scripts/5266.cs2 b/dumps/scripts/5266.cs2 new file mode 100644 index 000000000..a19941637 --- /dev/null +++ b/dumps/scripts/5266.cs2 @@ -0,0 +1,5 @@ +void script_5266() { + setWidgetIsHidden(false, new WidgetPointer(1137,5)); + setWidgetIsHidden(false, new WidgetPointer(1137,62)); + return; +} diff --git a/dumps/scripts/5267.cs2 b/dumps/scripts/5267.cs2 new file mode 100644 index 000000000..dac794d09 --- /dev/null +++ b/dumps/scripts/5267.cs2 @@ -0,0 +1,6 @@ +void script_5267() { + setWidgetIsHidden(true, new WidgetPointer(1137,5)); + script_5219(74514438); + deleteAllExtraChilds(new WidgetPointer(1137,109)); + return; +} diff --git a/dumps/scripts/5268.cs2 b/dumps/scripts/5268.cs2 new file mode 100644 index 000000000..6e0874c56 --- /dev/null +++ b/dumps/scripts/5268.cs2 @@ -0,0 +1,31 @@ +void script_5268(int arg0,string arg1,string arg2) { + int ivar1; + int ivar2; + ivar1 = getExtraChildGap(new WidgetPointer(1137,109)); + ivar2 = multiply(divide(ivar1, 2), 20); + createExtraChild(new WidgetPointer(1137,109), 4, ivar1); + setWidgetText(arg1); + arg2 = concat(arg2, "" + chooseString(arg0, " Teams: Yes.", " Teams: No.")); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(1137,6), arg2, 25, 519, "IiIsii"); + setWidgetSize(8100, 20, 2, 0); + setScriptCallOnClickContextMenu(5267, ""); + if (((boolean)mod(ivar1, 2))) { + setWidgetPosition(2, ivar2, 0, 0); + } else { + setWidgetPosition(2, ivar2, 2, 0); + } + setWidgetFont(494); + setWidgetRGB(new Color(0, 255, 0)); + setWidgetUnknownBoolean(true); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setScriptCallOnMouseExit(1949, new WidgetPointer(-32768,3), -2147483643, 65280, new WidgetPointer(1137,6), "IiiI"); + setWidgetContextMenuOption(1, "Select"); + if ((ivar1 >= 10) && ((boolean)mod(ivar1, 2))) { + setWidgetIsHidden(false, new WidgetPointer(1137,110)); + setWidgetSize(18, 2, 1, 1, new WidgetPointer(1137,109)); + setWidgetScrollMax(0, add(ivar2, 20), new WidgetPointer(1137,109)); + script_31(74514542, 74514541, 792, 789, 790, 791, 773, 788); + script_72(74514542, 74514541, multiply(divide(subtract(bitconfig_9822, 1), 2), 20)); + } + return; +} diff --git a/dumps/scripts/5269.cs2 b/dumps/scripts/5269.cs2 new file mode 100644 index 000000000..79a0cfc1b --- /dev/null +++ b/dumps/scripts/5269.cs2 @@ -0,0 +1,86 @@ +void script_5269(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,int arg21,int arg22,int arg23,int arg24,int arg25,int arg26,int arg27,string arg28,string arg29,string arg30,string arg31,string arg32,string arg33,string arg34,string arg35,string arg36,string arg37) { + int ivar28; + int ivar29; + int ivar30; + ivar28 = 0; + ivar29 = 0; + ivar30 = 0; + setWidgetText(new WidgetPointer(1137,43), arg28); + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(1137,6), arg29, 25, 519, "IiIsii", new WidgetPointer(1137,30)); + setScriptCallOnMouseExit(40, new WidgetPointer(1137,6), "I", new WidgetPointer(1137,6)); + setWidgetText(new WidgetPointer(1137,48), intToStr(arg25)); + setWidgetText(new WidgetPointer(1137,39), intToStr(add(arg26, arg27))); + deleteAllExtraChilds(new WidgetPointer(1137,28)); + deleteAllExtraChilds(new WidgetPointer(1137,83)); + deleteAllExtraChilds(new WidgetPointer(1137,94)); + if (((boolean)arg0)) { + setWidgetIsHidden(true, new WidgetPointer(1137,15)); + setWidgetIsHidden(false, new WidgetPointer(1137,16)); + setWidgetIsHidden(false, new WidgetPointer(1137,17)); + setWidgetText(new WidgetPointer(1137,67), intToStr(arg26)); + setWidgetText(new WidgetPointer(1137,73), intToStr(arg27)); + if (arg1 != -1) { + ivar28 = script_5271(74514515, arg2, arg3, ivar28, arg30); + } + if (arg4 != -1) { + ivar28 = script_5271(74514515, arg5, arg6, ivar28, arg31); + } + if (arg7 != -1) { + ivar28 = script_5271(74514515, arg8, arg9, ivar28, arg32); + } + if (arg10 != -1) { + ivar28 = script_5271(74514515, arg11, arg12, ivar28, arg33); + } + if (arg13 != -1) { + ivar29 = script_5271(74514526, arg14, arg15, ivar29, arg34); + } + if (arg16 != -1) { + ivar29 = script_5271(74514526, arg17, arg18, ivar29, arg35); + } + if (arg19 != -1) { + ivar29 = script_5271(74514526, arg20, arg21, ivar29, arg36); + } + if (arg22 != -1) { + ivar29 = script_5271(74514526, arg23, arg24, ivar29, arg37); + } + while (ivar30 < ivar28) { + ivar30 = script_5272(74514515, ivar30, ivar28); + } + ivar30 = 0; + while (ivar30 < ivar29) { + ivar30 = script_5272(74514526, ivar30, ivar29); + } + } else { + setWidgetIsHidden(false, new WidgetPointer(1137,15)); + setWidgetIsHidden(true, new WidgetPointer(1137,16)); + setWidgetIsHidden(true, new WidgetPointer(1137,17)); + if (arg1 != -1) { + ivar28 = script_5271(74514460, arg2, arg3, ivar28, arg30); + } + if (arg4 != -1) { + ivar28 = script_5271(74514460, arg5, arg6, ivar28, arg31); + } + if (arg7 != -1) { + ivar28 = script_5271(74514460, arg8, arg9, ivar28, arg32); + } + if (arg10 != -1) { + ivar28 = script_5271(74514460, arg11, arg12, ivar28, arg33); + } + if (arg13 != -1) { + ivar28 = script_5271(74514460, arg14, arg15, ivar28, arg34); + } + if (arg16 != -1) { + ivar28 = script_5271(74514460, arg17, arg18, ivar28, arg35); + } + if (arg19 != -1) { + ivar28 = script_5271(74514460, arg20, arg21, ivar28, arg36); + } + if (arg22 != -1) { + ivar28 = script_5271(74514460, arg23, arg24, ivar28, arg37); + } + while (ivar30 < ivar28) { + ivar30 = script_5272(74514460, ivar30, ivar28); + } + } + return; +} diff --git a/dumps/scripts/527.cs2 b/dumps/scripts/527.cs2 new file mode 100644 index 000000000..f8120cc65 --- /dev/null +++ b/dumps/scripts/527.cs2 @@ -0,0 +1,12 @@ +void script_527() { + script_528(bitconfig_4090, 215, 1103, 19726399, 19726350); + script_528(bitconfig_4091, 207, 1095, 19726400, 19726352); + script_528(bitconfig_4093, 208, 1096, 19726401, 19726354); + script_528(bitconfig_4095, 221, 1109, 19726402, 19726356); + script_528(bitconfig_4096, 217, 1105, 19726403, 19726358); + script_528(bitconfig_4098, 202, 1090, 19726404, 19726360); + script_528(bitconfig_4100, 210, 1098, 19726405, 19726362); + script_528(bitconfig_4101, 212, 1100, 19726406, 19726364); + script_528(bitconfig_4102, 205, 1093, 19726407, 19726366); + return; +} diff --git a/dumps/scripts/5270.cs2 b/dumps/scripts/5270.cs2 new file mode 100644 index 000000000..c14fb34fc --- /dev/null +++ b/dumps/scripts/5270.cs2 @@ -0,0 +1,7 @@ +void script_5270(int arg0,int arg1,int arg2) { + setWidgetText(new WidgetPointer(1137,48), intToStr(arg0)); + setWidgetText(new WidgetPointer(1137,39), intToStr(add(arg1, arg2))); + setWidgetText(new WidgetPointer(1137,67), intToStr(arg1)); + setWidgetText(new WidgetPointer(1137,73), intToStr(arg2)); + return; +} diff --git a/dumps/scripts/5271.cs2 b/dumps/scripts/5271.cs2 new file mode 100644 index 000000000..b0d50f6b0 --- /dev/null +++ b/dumps/scripts/5271.cs2 @@ -0,0 +1,36 @@ +int script_5271(int arg0,int arg1,int arg2,int arg3,string arg4) { + string svar1; + string svar2; + string svar3; + svar1 = ""; + if (arg1 == -1) { + svar1 = "Your coord"; + } else if (arg1 == -2) { + svar1 = "Safe Clanwars"; + } else { + svar1 = script_2055(arg1); + } + svar2 = " - "; + if (getWidgetActualWidth(new WidgetPointer(arg0)) < 260) { + svar2 = "
"; + } + svar3 = "max"; + if (arg2 >= 0) { + svar3 = intToStr(arg2); + } + createExtraChild(new WidgetPointer(arg0), 4, arg3); + setWidgetText(arg4 + svar2 + "@ " + svar1 + " - Max: " + svar3); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(204, 204, 204)); + setWidgetTextAlignment(1, 1, 0); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setScriptCallOnMouseExit(1356, new WidgetPointer(-32768,3), -2147483643, 13421772, "Iii"); + setWidgetContextMenuOption(1, "Spawn"); + setWidgetContextMenuOption(2, "Pick spawn number"); + setWidgetContextMenuOption(3, "Kill"); + createExtraChild(new WidgetPointer(arg0), 3, add(arg3, 1)); + setWidgetRGB(new Color(255, 255, 255)); + cs2method2103(226); + setWidgetFilled(1); + return add(arg3, 2); +} diff --git a/dumps/scripts/5272.cs2 b/dumps/scripts/5272.cs2 new file mode 100644 index 000000000..171d175da --- /dev/null +++ b/dumps/scripts/5272.cs2 @@ -0,0 +1,55 @@ +int script_5272(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + ivar3 = 0; + arg2 = divide(arg2, 2); + ivar4 = arg2; + ivar5 = getWidgetActualHeight(new WidgetPointer(arg0)); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (getWidgetActualWidth(new WidgetPointer(arg0)) < 260) { + if (arg2 == 4) { + setWidgetFont(494); + } else if (((boolean)arg2)) { + setWidgetFont(496); + } else { + setWidgetFont(495); + } + } else if (arg2 >= 7) { + setWidgetFont(494); + } else if (arg2 <= 4) { + setWidgetFont(496); + } else { + setWidgetFont(495); + } + if (arg2 > 4) { + ivar4 = script_5276(arg2, 2); + ivar3 = divide(multiply(divide(arg1, 4), ivar5), ivar4); + if (((boolean)mod(divide(arg1, 2), 2))) { + setWidgetPosition(2, ivar3, 0, 0); + } else { + setWidgetPosition(2, ivar3, 2, 0); + } + setWidgetSize(subtract(divide(getWidgetActualWidth(new WidgetPointer(arg0)), 2), 4), divide(ivar5, ivar4), 0, 0); + } else { + ivar3 = divide(multiply(divide(arg1, 2), ivar5), arg2); + setWidgetPosition(2, ivar3, 0, 0); + setWidgetSize(6, divide(ivar5, arg2), 1, 0); + } + } + arg1 = add(arg1, 1); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (arg2 > 4) { + if (((boolean)mod(divide(arg1, 2), 2))) { + setWidgetPosition(2, add(ivar3, 1), 0, 0); + } else { + setWidgetPosition(2, add(ivar3, 1), 2, 0); + } + setWidgetSize(subtract(divide(getWidgetActualWidth(new WidgetPointer(arg0)), 2), 4), subtract(divide(ivar5, ivar4), 2), 0, 0); + } else { + setWidgetPosition(2, add(ivar3, 1), 0, 0); + setWidgetSize(4, subtract(divide(ivar5, arg2), 2), 1, 0); + } + } + return add(arg1, 1); +} diff --git a/dumps/scripts/5273.cs2 b/dumps/scripts/5273.cs2 new file mode 100644 index 000000000..d11fa3e6b --- /dev/null +++ b/dumps/scripts/5273.cs2 @@ -0,0 +1,8 @@ +void script_5273(int arg0,string arg1) { + setWidgetIsHidden(false, new WidgetPointer(1137,7)); + setWidgetText(new WidgetPointer(1137,10), arg1); + if (setWidgetRegister(new WidgetPointer(1137,7))) { + setWidgetIntegerNode(1103, arg0); + } + return; +} diff --git a/dumps/scripts/5274.cs2 b/dumps/scripts/5274.cs2 new file mode 100644 index 000000000..1cb75f489 --- /dev/null +++ b/dumps/scripts/5274.cs2 @@ -0,0 +1,22 @@ +void script_5274() { + int ivar0; + int stack_dump0; + ivar0 = 0; + if (setWidgetRegister(new WidgetPointer(1137,7))) { + stack_dump0 = 1103; + /* + mgi.tools.jagdecs2.DecompilerException: opcode 1613 not decompileable + at mgi.tools.jagdecs2.FlowBlocksGenerator.analyzeSpecialCall(FlowBlocksGenerator.java:297) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processFlowBlock(FlowBlocksGenerator.java:249) + at mgi.tools.jagdecs2.FlowBlocksGenerator.processGeneration(FlowBlocksGenerator.java:52) + at mgi.tools.jagdecs2.FlowBlocksGenerator.generate(FlowBlocksGenerator.java:35) + at mgi.tools.jagdecs2.CS2Decompiler.decompile(CS2Decompiler.java:40) + at tests.Main.main(Main.java:45) + + */ + } + if (((boolean)ivar0)) { + setWidgetIsHidden(true, new WidgetPointer(1137,7)); + } + return; +} diff --git a/dumps/scripts/5275.cs2 b/dumps/scripts/5275.cs2 new file mode 100644 index 000000000..43cc00c71 --- /dev/null +++ b/dumps/scripts/5275.cs2 @@ -0,0 +1,147 @@ +void script_5275(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + int stack_dump0; + int stack_dump1; + int stack_dump2; + cs2func_script_788_struct(2,0,0) structdump_3; + cs2func_script_788_struct(2,0,0) structdump_4; + ivar1 = 0; + ivar2 = -1; + ivar3 = -1; + ivar4 = 1; + svar0 = ""; + ivar5 = -1; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + switch (bitconfig_9828) { + case 0: + return; + case 1: + ivar5 = 52948; + ivar6 = 808; + ivar7 = 5138; + ivar8 = 5139; + break; + case 2: + ivar5 = 52954; + ivar6 = 808; + ivar7 = 5134; + ivar8 = 5135; + break; + case 3: + ivar5 = 52984; + ivar6 = 808; + ivar7 = 5136; + ivar8 = 5137; + } + deleteAllExtraChilds(new WidgetPointer(1138,5)); + createExtraChild(new WidgetPointer(1138,5), 6, getExtraChildGap(new WidgetPointer(1138,5))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetModel(ivar5); + setWidget3DRotation(0, 125, 0, 0, 0, 375); + setWidgetAnimation(ivar6); + script_2647(74579973); + deleteAllExtraChilds(new WidgetPointer(1138,7)); + while (ivar1 < getItemContainerLength(94)) { + ivar4 = 1; + switch (ivar1) { + case 0: + ivar2 = 74579981; + break; + case 1: + ivar2 = 74579983; + break; + case 2: + ivar2 = 74579984; + break; + case 3: + ivar2 = 74579986; + break; + case 4: + ivar2 = 74579987; + break; + case 5: + ivar2 = 74579988; + break; + case 7: + ivar2 = 74579989; + break; + case 9: + ivar2 = 74579991; + break; + case 10: + ivar2 = 74579990; + break; + case 12: + ivar2 = 74579992; + break; + case 13: + ivar2 = 74579985; + ivar4 = 900; + break; + case 14: + ivar2 = 74579982; + break; + default: + ivar2 = -1; + } + createExtraChild(new WidgetPointer(1138,7), 5, ivar1); + if (ivar2 != -1) { + ivar3 = cs2method_3408(105, 111, ivar8, ivar1); + if (ivar3 != -1) { + setWidgetSize(36, 32, 0, 0); + stack_dump0 = ivar2; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_3 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_3.intpart_0, structdump_3.intpart_1, 0, 0); + setItemOnWidgetMethod1200(ivar3, ivar4); + cs2method1305(concat("", getItemName(ivar3))); + setWidgetContextMenuOption(1, "Information"); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -2147483643, 100, 0, 8, "Iiiii"); + } else { + setWidgetSize(32, 32, 0, 0); + stack_dump0 = ivar2; + stack_dump1 = 2; + stack_dump2 = 2; + structdump_4 = script_788(stack_dump0, stack_dump1, stack_dump2); + setWidgetPosition(structdump_4.intpart_0, structdump_4.intpart_1, 0, 0); + setWidgetSprite(cs2method_3408(105, 100, 796, ivar1)); + } + } else { + setWidgetHidden(1); + } + ivar1 = add(ivar1, 1); + } + setWidgetText(new WidgetPointer(1138,29), concatSignedInt(cs2method_3408(105, 105, ivar7, 0), "Stab: ")); + setWidgetText(new WidgetPointer(1138,30), concatSignedInt(cs2method_3408(105, 105, ivar7, 1), "Slash: ")); + setWidgetText(new WidgetPointer(1138,31), concatSignedInt(cs2method_3408(105, 105, ivar7, 2), "Crush: ")); + setWidgetText(new WidgetPointer(1138,32), concatSignedInt(cs2method_3408(105, 105, ivar7, 3), "Magic: ")); + setWidgetText(new WidgetPointer(1138,33), concatSignedInt(cs2method_3408(105, 105, ivar7, 4), "Ranged: ")); + setWidgetText(new WidgetPointer(1138,34), concatSignedInt(cs2method_3408(105, 105, ivar7, 5), "Stab: ")); + setWidgetText(new WidgetPointer(1138,35), concatSignedInt(cs2method_3408(105, 105, ivar7, 6), "Slash: ")); + setWidgetText(new WidgetPointer(1138,36), concatSignedInt(cs2method_3408(105, 105, ivar7, 7), "Crush: ")); + setWidgetText(new WidgetPointer(1138,38), concatSignedInt(cs2method_3408(105, 105, ivar7, 9), "Ranged: ")); + setWidgetText(new WidgetPointer(1138,39), concatSignedInt(cs2method_3408(105, 105, ivar7, 10), "Summoning: ")); + setWidgetText(new WidgetPointer(1138,37), concatSignedInt(cs2method_3408(105, 105, ivar7, 8), "Magic: ")); + setWidgetText(new WidgetPointer(1138,40), concat(concatSignedInt(cs2method_3408(105, 105, ivar7, 11), "Absorb Melee: "), "%")); + setWidgetText(new WidgetPointer(1138,41), concat(concatSignedInt(cs2method_3408(105, 105, ivar7, 12), "Absorb Magic: "), "%")); + setWidgetText(new WidgetPointer(1138,42), concat(concatSignedInt(cs2method_3408(105, 105, ivar7, 13), "Absorb Ranged: "), "%")); + setWidgetText(new WidgetPointer(1138,43), concatSignedInt(cs2method_3408(105, 105, ivar7, 14), "Strength: ")); + setWidgetText(new WidgetPointer(1138,44), concatSignedInt(cs2method_3408(105, 105, ivar7, 15), "Ranged Strength: ")); + setWidgetText(new WidgetPointer(1138,45), concatSignedInt(cs2method_3408(105, 105, ivar7, 16), "Prayer: ")); + setWidgetText(new WidgetPointer(1138,46), concat(concatSignedInt(cs2method_3408(105, 105, ivar7, 17), "Magic Damage: "), "%")); + return; +} diff --git a/dumps/scripts/5276.cs2 b/dumps/scripts/5276.cs2 new file mode 100644 index 000000000..f53478586 --- /dev/null +++ b/dumps/scripts/5276.cs2 @@ -0,0 +1,6 @@ +int script_5276(int arg0,int arg1) { + if (mod(arg0, arg1) > 0) { + return add(divide(arg0, arg1), 1); + } + return divide(arg0, arg1); +} diff --git a/dumps/scripts/5277.cs2 b/dumps/scripts/5277.cs2 new file mode 100644 index 000000000..2df4dd2d1 --- /dev/null +++ b/dumps/scripts/5277.cs2 @@ -0,0 +1,7 @@ +void script_5277(int arg0) { + script_5279(arg0); + setScriptCallOnConfigChange(5278, new WidgetPointer(arg0), 1734, 1, "IY", new WidgetPointer(arg0)); + script_5291(); + setScriptCallOnConfigChange(5290, 2387, 1, "Y", new WidgetPointer(getWidgetParentId(new WidgetPointer(arg0)))); + return; +} diff --git a/dumps/scripts/5278.cs2 b/dumps/scripts/5278.cs2 new file mode 100644 index 000000000..495f5fada --- /dev/null +++ b/dumps/scripts/5278.cs2 @@ -0,0 +1,4 @@ +void script_5278(int arg0) { + script_5279(arg0); + return; +} diff --git a/dumps/scripts/5279.cs2 b/dumps/scripts/5279.cs2 new file mode 100644 index 000000000..78c87b6ed --- /dev/null +++ b/dumps/scripts/5279.cs2 @@ -0,0 +1,55 @@ +void script_5279(int arg0) { + int ivar1; + ivar1 = script_734(bitconfig_9897); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,17)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,30)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,43)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,56)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,69)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,107)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,121)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,135)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,148)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,163)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,177)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,191)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,205)); + setWidgetIsHidden(((boolean)ivar1), new WidgetPointer(388,90)); + if (((boolean)ivar1)) { + setWidgetText(new WidgetPointer(arg0), "Theatre Options"); + setScriptCallOnClickContextMenu(5293, -2147483644, 1, 0, "ii1", new WidgetPointer(388,104)); + setScriptCallOnClickContextMenu(5293, -2147483644, 2, 0, "ii1", new WidgetPointer(388,117)); + setScriptCallOnClickContextMenu(5293, -2147483644, 3, 0, "ii1", new WidgetPointer(388,131)); + setScriptCallOnClickContextMenu(5293, -2147483644, 4, 0, "ii1", new WidgetPointer(388,145)); + setScriptCallOnClickContextMenu(5293, -2147483644, 5, 0, "ii1", new WidgetPointer(388,159)); + setScriptCallOnClickContextMenu(5293, -2147483644, 6, 0, "ii1", new WidgetPointer(388,173)); + setScriptCallOnClickContextMenu(5293, -2147483644, 7, 0, "ii1", new WidgetPointer(388,187)); + setScriptCallOnClickContextMenu(5293, -2147483644, 8, 0, "ii1", new WidgetPointer(388,201)); + setScriptCallOnClickContextMenu(5293, -2147483644, 1, 1, "ii1", new WidgetPointer(388,14)); + setScriptCallOnClickContextMenu(5293, -2147483644, 2, 1, "ii1", new WidgetPointer(388,27)); + setScriptCallOnClickContextMenu(5293, -2147483644, 3, 1, "ii1", new WidgetPointer(388,40)); + setScriptCallOnClickContextMenu(5293, -2147483644, 4, 1, "ii1", new WidgetPointer(388,53)); + setScriptCallOnClickContextMenu(5293, -2147483644, 5, 1, "ii1", new WidgetPointer(388,66)); + } else { + if (((boolean)bitconfig_9887) || ((boolean)bitconfig_9896)) { + setWidgetText(new WidgetPointer(arg0), "Waiting on technician to select options..."); + } else { + setWidgetText(new WidgetPointer(arg0), "Waiting on technician to unlock theatre..."); + } + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,104)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,117)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,131)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,145)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,159)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,173)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,187)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,201)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,14)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,27)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,40)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,53)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(388,66)); + } + script_4532(arg0); + return; +} diff --git a/dumps/scripts/528.cs2 b/dumps/scripts/528.cs2 new file mode 100644 index 000000000..8c3697de1 --- /dev/null +++ b/dumps/scripts/528.cs2 @@ -0,0 +1,10 @@ +void script_528(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (((boolean)arg0)) { + setWidgetSprite(arg1, new WidgetPointer(arg3)); + setWidgetIsHidden(false, new WidgetPointer(arg4)); + } else { + setWidgetSprite(arg2, new WidgetPointer(arg3)); + setWidgetIsHidden(true, new WidgetPointer(arg4)); + } + return; +} diff --git a/dumps/scripts/5280.cs2 b/dumps/scripts/5280.cs2 new file mode 100644 index 000000000..00f0b1719 --- /dev/null +++ b/dumps/scripts/5280.cs2 @@ -0,0 +1,15 @@ +int script_5280() { + if (isWidgetOpen(new WidgetPointer(906,80))) { + return 1; + } + if (isWidgetOpen(new WidgetPointer(906,54))) { + return 1; + } + if (isWidgetOpen(new WidgetPointer(906,72))) { + return 1; + } + if (isWidgetOpen(new WidgetPointer(906,64))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/5281.cs2 b/dumps/scripts/5281.cs2 new file mode 100644 index 000000000..893110b5c --- /dev/null +++ b/dumps/scripts/5281.cs2 @@ -0,0 +1,11 @@ +void script_5281() { + playSoundEffect2False(7536, 1, 0, 200, cs2method_4019(20, 20)); + if (isWidgetHidden(new WidgetPointer(1141,3))) { + setWidgetIsHidden(false, new WidgetPointer(1141,3)); + setWidgetIsHidden(true, new WidgetPointer(1141,4)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1141,3)); + setWidgetIsHidden(false, new WidgetPointer(1141,4)); + } + return; +} diff --git a/dumps/scripts/5282.cs2 b/dumps/scripts/5282.cs2 new file mode 100644 index 000000000..ebc85e25c --- /dev/null +++ b/dumps/scripts/5282.cs2 @@ -0,0 +1,8 @@ +void script_5282() { + if (getWidgetActualX(new WidgetPointer(555,48)) > 29) { + playSoundEffect2False(7557, 1, 0, 200, cs2method_4019(20, 20)); + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(555,48)), 10), getWidgetActualY(new WidgetPointer(555,48)), 0, 0, new WidgetPointer(555,48)); + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(555,49)), 10), getWidgetActualY(new WidgetPointer(555,49)), 0, 0, new WidgetPointer(555,49)); + } + return; +} diff --git a/dumps/scripts/5283.cs2 b/dumps/scripts/5283.cs2 new file mode 100644 index 000000000..d9ef90afc --- /dev/null +++ b/dumps/scripts/5283.cs2 @@ -0,0 +1,8 @@ +void script_5283() { + if (getWidgetActualX(new WidgetPointer(555,48)) < 455) { + playSoundEffect2False(7557, 1, 0, 200, cs2method_4019(20, 20)); + setWidgetPosition(add(getWidgetActualX(new WidgetPointer(555,48)), 10), getWidgetActualY(new WidgetPointer(555,48)), 0, 0, new WidgetPointer(555,48)); + setWidgetPosition(add(getWidgetActualX(new WidgetPointer(555,49)), 10), getWidgetActualY(new WidgetPointer(555,49)), 0, 0, new WidgetPointer(555,49)); + } + return; +} diff --git a/dumps/scripts/5284.cs2 b/dumps/scripts/5284.cs2 new file mode 100644 index 000000000..4783fd609 --- /dev/null +++ b/dumps/scripts/5284.cs2 @@ -0,0 +1,8 @@ +void script_5284() { + if (getWidgetActualY(new WidgetPointer(555,48)) > -86) { + playSoundEffect2False(7557, 1, 0, 200, cs2method_4019(20, 20)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(555,48)), subtract(getWidgetActualY(new WidgetPointer(555,48)), 10), 0, 0, new WidgetPointer(555,48)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(555,49)), subtract(getWidgetActualY(new WidgetPointer(555,49)), 10), 0, 0, new WidgetPointer(555,49)); + } + return; +} diff --git a/dumps/scripts/5285.cs2 b/dumps/scripts/5285.cs2 new file mode 100644 index 000000000..cba89e288 --- /dev/null +++ b/dumps/scripts/5285.cs2 @@ -0,0 +1,8 @@ +void script_5285() { + if (getWidgetActualY(new WidgetPointer(555,48)) < 170) { + playSoundEffect2False(7557, 1, 0, 200, cs2method_4019(20, 20)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(555,48)), add(getWidgetActualY(new WidgetPointer(555,48)), 10), 0, 0, new WidgetPointer(555,48)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(555,49)), add(getWidgetActualY(new WidgetPointer(555,49)), 10), 0, 0, new WidgetPointer(555,49)); + } + return; +} diff --git a/dumps/scripts/5286.cs2 b/dumps/scripts/5286.cs2 new file mode 100644 index 000000000..17c9e39bf --- /dev/null +++ b/dumps/scripts/5286.cs2 @@ -0,0 +1,11 @@ +void script_5286() { + playSoundEffect2False(7536, 1, 0, 200, cs2method_4019(20, 20)); + if (isWidgetHidden(new WidgetPointer(555,48))) { + setWidgetIsHidden(false, new WidgetPointer(555,48)); + setWidgetIsHidden(true, new WidgetPointer(555,49)); + } else { + setWidgetIsHidden(false, new WidgetPointer(555,49)); + setWidgetIsHidden(true, new WidgetPointer(555,48)); + } + return; +} diff --git a/dumps/scripts/5287.cs2 b/dumps/scripts/5287.cs2 new file mode 100644 index 000000000..14141e952 --- /dev/null +++ b/dumps/scripts/5287.cs2 @@ -0,0 +1,24 @@ +void script_5287() { + playSoundEffect2False(7513, 1, 0, 200, cs2method_4019(20, 20)); + if (cs2method2613(new WidgetPointer(555,48)) == 32768) { + cs2method2106(49152, new WidgetPointer(555,49)); + cs2method2106(49152, new WidgetPointer(555,48)); + return; + } + if (cs2method2613(new WidgetPointer(555,48)) == 16384) { + cs2method2106(32768, new WidgetPointer(555,49)); + cs2method2106(32768, new WidgetPointer(555,48)); + return; + } + if (((boolean)cs2method2613(new WidgetPointer(555,48)))) { + cs2method2106(16384, new WidgetPointer(555,49)); + cs2method2106(16384, new WidgetPointer(555,48)); + return; + } + if (cs2method2613(new WidgetPointer(555,48)) == 49152) { + cs2method2106(0, new WidgetPointer(555,49)); + cs2method2106(0, new WidgetPointer(555,48)); + return; + } + return; +} diff --git a/dumps/scripts/5288.cs2 b/dumps/scripts/5288.cs2 new file mode 100644 index 000000000..082e673a5 --- /dev/null +++ b/dumps/scripts/5288.cs2 @@ -0,0 +1,24 @@ +void script_5288() { + playSoundEffect2False(7513, 1, 0, 200, cs2method_4019(20, 20)); + if (((boolean)cs2method2613(new WidgetPointer(555,48)))) { + cs2method2106(49152, new WidgetPointer(555,49)); + cs2method2106(49152, new WidgetPointer(555,48)); + return; + } + if (cs2method2613(new WidgetPointer(555,48)) == 49152) { + cs2method2106(32768, new WidgetPointer(555,49)); + cs2method2106(32768, new WidgetPointer(555,48)); + return; + } + if (cs2method2613(new WidgetPointer(555,48)) == 32768) { + cs2method2106(16384, new WidgetPointer(555,49)); + cs2method2106(16384, new WidgetPointer(555,48)); + return; + } + if (cs2method2613(new WidgetPointer(555,48)) == 16384) { + cs2method2106(0, new WidgetPointer(555,49)); + cs2method2106(0, new WidgetPointer(555,48)); + return; + } + return; +} diff --git a/dumps/scripts/5289.cs2 b/dumps/scripts/5289.cs2 new file mode 100644 index 000000000..1fd375625 --- /dev/null +++ b/dumps/scripts/5289.cs2 @@ -0,0 +1,5 @@ +void script_5289() { + playSoundEffect2False(7557, 1, 0, 200, cs2method_4019(20, 20)); + script_675(); + return; +} diff --git a/dumps/scripts/529.cs2 b/dumps/scripts/529.cs2 new file mode 100644 index 000000000..01a01fe43 --- /dev/null +++ b/dumps/scripts/529.cs2 @@ -0,0 +1,27 @@ +void script_529(int arg0) { + int ivar1; + string svar0; + string svar1; + int stack_dump0; + cs2func_script_530_struct(1,1,0) structdump_1; + svar0 = "null"; + ivar1 = 0; + svar1 = "null"; + if (arg0 == 19726347) { + svar0 = "This is the total XP you have gained through the Assist System in the past 24 hours. There is a limit to the XP you can gain within 24 hours, but this amount gets reset once the day has passed."; + script_39(arg0, 19726421, 25, 180, svar0); + return; + } + stack_dump0 = arg0; + structdump_1 = script_530(stack_dump0); + svar1 = structdump_1.stringpart_0; + ivar1 = structdump_1.intpart_0; + if (((boolean)ivar1)) { + svar0 = "Assist with " + svar1 + " while using the Assist System (ON)."; + } else { + svar0 = "Assist with " + svar1 + " while using the Assist System (OFF)."; + } + script_39(arg0, 19726421, 25, 180, svar0); + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/5290.cs2 b/dumps/scripts/5290.cs2 new file mode 100644 index 000000000..9c9c8d6da --- /dev/null +++ b/dumps/scripts/5290.cs2 @@ -0,0 +1,4 @@ +void script_5290() { + script_5291(); + return; +} diff --git a/dumps/scripts/5291.cs2 b/dumps/scripts/5291.cs2 new file mode 100644 index 000000000..6c9a2c69f --- /dev/null +++ b/dumps/scripts/5291.cs2 @@ -0,0 +1,16 @@ +void script_5291() { + script_5292(bitconfig_9887, 1, 25428071); + script_5292(bitconfig_9887, 2, 25428084); + script_5292(bitconfig_9887, 3, 25428098); + script_5292(bitconfig_9887, 4, 25428112); + script_5292(bitconfig_9887, 5, 25428126); + script_5292(bitconfig_9887, 6, 25428140); + script_5292(bitconfig_9887, 7, 25428154); + script_5292(bitconfig_9887, 8, 25428168); + script_5292(bitconfig_9896, 1, 25427981); + script_5292(bitconfig_9896, 2, 25427994); + script_5292(bitconfig_9896, 3, 25428007); + script_5292(bitconfig_9896, 4, 25428020); + script_5292(bitconfig_9896, 5, 25428033); + return; +} diff --git a/dumps/scripts/5292.cs2 b/dumps/scripts/5292.cs2 new file mode 100644 index 000000000..8c2715cf6 --- /dev/null +++ b/dumps/scripts/5292.cs2 @@ -0,0 +1,8 @@ +void script_5292(int arg0,int arg1,int arg2) { + if (arg0 == arg1) { + setWidgetIsHidden(false, new WidgetPointer(arg2)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/5293.cs2 b/dumps/scripts/5293.cs2 new file mode 100644 index 000000000..0f94d589c --- /dev/null +++ b/dumps/scripts/5293.cs2 @@ -0,0 +1,13 @@ +void script_5293(int arg0,int arg1,int arg2) { + if (arg0 != 1) { + return; + } + playSoundEffect2False(6185, 1, 0, 200); + if (((boolean)arg2)) { + bitconfig_9896 = arg1; + } else { + bitconfig_9887 = arg1; + } + script_5291(); + return; +} diff --git a/dumps/scripts/5294.cs2 b/dumps/scripts/5294.cs2 new file mode 100644 index 000000000..41d67d4b9 --- /dev/null +++ b/dumps/scripts/5294.cs2 @@ -0,0 +1,5 @@ +void script_5294(int arg0,int arg1) { + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setScriptCallOnUseWith(5295, new WidgetPointer(arg0), new WidgetPointer(arg1), "II", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5295.cs2 b/dumps/scripts/5295.cs2 new file mode 100644 index 000000000..f48de50db --- /dev/null +++ b/dumps/scripts/5295.cs2 @@ -0,0 +1,5 @@ +void script_5295(int arg0,int arg1) { + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setScriptCallOnUseWith(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5296.cs2 b/dumps/scripts/5296.cs2 new file mode 100644 index 000000000..9845306ab --- /dev/null +++ b/dumps/scripts/5296.cs2 @@ -0,0 +1,9 @@ +void script_5296() { + if (((boolean)bitconfig_9888)) { + bitconfig_9888 = 0; + } else { + bitconfig_9888 = 1; + } + script_5301(); + return; +} diff --git a/dumps/scripts/5297.cs2 b/dumps/scripts/5297.cs2 new file mode 100644 index 000000000..1087a9503 --- /dev/null +++ b/dumps/scripts/5297.cs2 @@ -0,0 +1,9 @@ +void script_5297() { + if (((boolean)bitconfig_9889)) { + bitconfig_9889 = 0; + } else { + bitconfig_9889 = 1; + } + script_5301(); + return; +} diff --git a/dumps/scripts/5298.cs2 b/dumps/scripts/5298.cs2 new file mode 100644 index 000000000..67966d5e9 --- /dev/null +++ b/dumps/scripts/5298.cs2 @@ -0,0 +1,9 @@ +void script_5298() { + if (((boolean)bitconfig_9890)) { + bitconfig_9890 = 0; + } else { + bitconfig_9890 = 1; + } + script_5301(); + return; +} diff --git a/dumps/scripts/5299.cs2 b/dumps/scripts/5299.cs2 new file mode 100644 index 000000000..b62e0918b --- /dev/null +++ b/dumps/scripts/5299.cs2 @@ -0,0 +1,9 @@ +void script_5299() { + if (((boolean)bitconfig_9891)) { + bitconfig_9891 = 0; + } else { + bitconfig_9891 = 1; + } + script_5301(); + return; +} diff --git a/dumps/scripts/53.cs2 b/dumps/scripts/53.cs2 new file mode 100644 index 000000000..fbc4bdea5 --- /dev/null +++ b/dumps/scripts/53.cs2 @@ -0,0 +1,8 @@ +void script_53(int arg0,int arg1,int arg2) { + setWidgetText(new WidgetPointer(arg0), intToStr(script_5256()) + " / " + intToStr(script_5255())); + setWidgetSize(getTextWidth(495, getWidgetText(new WidgetPointer(arg0))), getWidgetActualHeight(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + if (((boolean)arg2)) { + script_5264(arg0, arg1); + } + return; +} diff --git a/dumps/scripts/530.cs2 b/dumps/scripts/530.cs2 new file mode 100644 index 000000000..df46f88c2 --- /dev/null +++ b/dumps/scripts/530.cs2 @@ -0,0 +1,30 @@ +cs2func_script_530_struct(1,1,0) script_530(int arg0) { + if (arg0 == 19726410) { + return newstruct cs2func_script_530_struct(bitconfig_4090, "Runecrafting"); + } + if (arg0 == 19726411) { + return newstruct cs2func_script_530_struct(bitconfig_4091, "Crafting"); + } + if (arg0 == 19726412) { + return newstruct cs2func_script_530_struct(bitconfig_4093, "Fletching"); + } + if (arg0 == 19726413) { + return newstruct cs2func_script_530_struct(bitconfig_4095, "Construction"); + } + if (arg0 == 19726414) { + return newstruct cs2func_script_530_struct(bitconfig_4096, "Farming"); + } + if (arg0 == 19726415) { + return newstruct cs2func_script_530_struct(bitconfig_4098, "Magic"); + } + if (arg0 == 19726416) { + return newstruct cs2func_script_530_struct(bitconfig_4100, "Smithing"); + } + if (arg0 == 19726417) { + return newstruct cs2func_script_530_struct(bitconfig_4101, "Cooking"); + } + if (arg0 == 19726418) { + return newstruct cs2func_script_530_struct(bitconfig_4102, "Herblore"); + } + return newstruct cs2func_script_530_struct(0, ""); +} diff --git a/dumps/scripts/5300.cs2 b/dumps/scripts/5300.cs2 new file mode 100644 index 000000000..97781d4de --- /dev/null +++ b/dumps/scripts/5300.cs2 @@ -0,0 +1,4 @@ +void script_5300() { + script_5301(); + return; +} diff --git a/dumps/scripts/5301.cs2 b/dumps/scripts/5301.cs2 new file mode 100644 index 000000000..2b22ab13a --- /dev/null +++ b/dumps/scripts/5301.cs2 @@ -0,0 +1,31 @@ +void script_5301() { + if (((boolean)bitconfig_9888)) { + setWidgetRGB(new Color(170, 170, 0), new WidgetPointer(824,13)); + setWidgetText(new WidgetPointer(824,59), "On"); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(824,13)); + setWidgetText(new WidgetPointer(824,59), "Off"); + } + if (((boolean)bitconfig_9889)) { + setWidgetRGB(new Color(170, 170, 0), new WidgetPointer(824,100)); + setWidgetText(new WidgetPointer(824,101), "On"); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(824,100)); + setWidgetText(new WidgetPointer(824,101), "Off"); + } + if (((boolean)bitconfig_9890)) { + setWidgetRGB(new Color(170, 170, 0), new WidgetPointer(824,153)); + setWidgetText(new WidgetPointer(824,154), "On"); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(824,153)); + setWidgetText(new WidgetPointer(824,154), "Off"); + } + if (((boolean)bitconfig_9891)) { + setWidgetRGB(new Color(170, 170, 0), new WidgetPointer(824,190)); + setWidgetText(new WidgetPointer(824,191), "On"); + } else { + setWidgetRGB(new Color(0, 0, 0), new WidgetPointer(824,190)); + setWidgetText(new WidgetPointer(824,191), "Off"); + } + return; +} diff --git a/dumps/scripts/5302.cs2 b/dumps/scripts/5302.cs2 new file mode 100644 index 000000000..9ee8a4e63 --- /dev/null +++ b/dumps/scripts/5302.cs2 @@ -0,0 +1,12 @@ +void script_5302(int arg0,int arg1) { + if (isWidgetHidden(new WidgetPointer(arg0))) { + script_5306(); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetSprite(6169, new WidgetPointer(arg1)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetSprite(6168, new WidgetPointer(arg1)); + script_5219(54001697); + } + return; +} diff --git a/dumps/scripts/5303.cs2 b/dumps/scripts/5303.cs2 new file mode 100644 index 000000000..e9460daff --- /dev/null +++ b/dumps/scripts/5303.cs2 @@ -0,0 +1,4 @@ +void script_5303(int arg0) { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5304.cs2 b/dumps/scripts/5304.cs2 new file mode 100644 index 000000000..34e6fde84 --- /dev/null +++ b/dumps/scripts/5304.cs2 @@ -0,0 +1,86 @@ +void script_5304(int arg0) { + if (arg0 == 54001714) { + switch (bitconfig_9892) { + case 0: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + break; + case 1: + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg0)); + break; + case 2: + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + break; + case 3: + setWidgetRGB(new Color(0, 0, 255), new WidgetPointer(arg0)); + break; + case 4: + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + break; + default: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + } + } else if (arg0 == 54001784) { + switch (bitconfig_9893) { + case 0: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + break; + case 1: + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg0)); + break; + case 2: + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + break; + case 3: + setWidgetRGB(new Color(0, 0, 255), new WidgetPointer(arg0)); + break; + case 4: + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + break; + default: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + } + } else if (arg0 == 54001837) { + switch (bitconfig_9894) { + case 0: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + break; + case 1: + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg0)); + break; + case 2: + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + break; + case 3: + setWidgetRGB(new Color(0, 0, 255), new WidgetPointer(arg0)); + break; + case 4: + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + break; + default: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + } + } else { + if (arg0 == 54001874) { + switch (bitconfig_9895) { + case 0: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + break; + case 1: + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg0)); + break; + case 2: + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(arg0)); + break; + case 3: + setWidgetRGB(new Color(0, 0, 255), new WidgetPointer(arg0)); + break; + case 4: + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + break; + default: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(arg0)); + } + } + } + return; +} diff --git a/dumps/scripts/5305.cs2 b/dumps/scripts/5305.cs2 new file mode 100644 index 000000000..3d7127710 --- /dev/null +++ b/dumps/scripts/5305.cs2 @@ -0,0 +1,4 @@ +void script_5305() { + script_5306(); + return; +} diff --git a/dumps/scripts/5306.cs2 b/dumps/scripts/5306.cs2 new file mode 100644 index 000000000..ddf958433 --- /dev/null +++ b/dumps/scripts/5306.cs2 @@ -0,0 +1,11 @@ +void script_5306() { + setWidgetIsHidden(true, new WidgetPointer(824,8)); + setWidgetSprite(6168, new WidgetPointer(824,74)); + setWidgetIsHidden(true, new WidgetPointer(824,9)); + setWidgetSprite(6168, new WidgetPointer(824,127)); + setWidgetIsHidden(true, new WidgetPointer(824,10)); + setWidgetSprite(6168, new WidgetPointer(824,180)); + setWidgetIsHidden(true, new WidgetPointer(824,11)); + setWidgetSprite(6168, new WidgetPointer(824,217)); + return; +} diff --git a/dumps/scripts/5307.cs2 b/dumps/scripts/5307.cs2 new file mode 100644 index 000000000..a1ea8050b --- /dev/null +++ b/dumps/scripts/5307.cs2 @@ -0,0 +1,4 @@ +void script_5307() { + script_5308(); + return; +} diff --git a/dumps/scripts/5308.cs2 b/dumps/scripts/5308.cs2 new file mode 100644 index 000000000..27580ad21 --- /dev/null +++ b/dumps/scripts/5308.cs2 @@ -0,0 +1,78 @@ +void script_5308() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + ivar0 = 0; + ivar1 = 0; + svar0 = ""; + ivar2 = -1; + ivar3 = 0; + ivar4 = 7287; + ivar5 = 7706; + ivar6 = 7289; + ivar7 = 2; + ivar8 = 54; + deleteAllExtraChilds(new WidgetPointer(823,3)); + deleteAllExtraChilds(new WidgetPointer(823,4)); + while (ivar0 < getCommonDefinitionSize(840)) { + ivar3 = cs2method_3408(105, 105, 840, ivar0); + ivar2 = cs2method_3408(105, 74, 5173, ivar3); + if (ivar2 == -1) { + return; + } + svar0 = getOtherCommonData(ivar2, 1974) + "
" + getOtherCommonData(ivar2, 1975); + createExtraChild(new WidgetPointer(823,3), 5, ivar0); + setWidgetSprite(ivar4); + setWidgetSize(ivar8, ivar8, 0, 0); + if (((boolean)mod(ivar0, 3))) { + setWidgetPosition(ivar7, add(ivar7, multiply(ivar1, add(54, ivar7))), 0, 0); + } else if (((boolean)mod(ivar0, 3))) { + setWidgetPosition(add(multiply(ivar7, 2), ivar8), add(ivar7, multiply(ivar1, add(54, ivar7))), 0, 0); + } else { + setWidgetPosition(add(multiply(ivar7, 3), multiply(ivar8, 2)), add(ivar7, multiply(ivar1, add(54, ivar7))), 0, 0); + } + if (((boolean)ivar3)) { + setWidgetContextMenuOption(1, getOtherCommonData(ivar2, 1974)); + } else { + setScriptCallOnUse(5309, -2147483643, "i"); + setScriptCallOnUseWith(44, new WidgetPointer(-32768,3), ivar4, "Id"); + if (((boolean)ivar3)) { + cs2method1306(getOtherCommonData(ivar2, 1974)); + } else if (ivar3 == 2) { + cs2method1306(getOtherCommonData(ivar2, 1974)); + } else { + cs2method1306("Place " + getOtherCommonData(ivar2, 1974)); + } + cs2method1308(176, -1); + } + setScriptCallOnMouseEntered(44, new WidgetPointer(-32768,3), ivar5, "Id"); + setScriptCallOnMouseOver(5334, new WidgetPointer(823,3), ivar0, new WidgetPointer(823,15), svar0, 20, 200, "IiIsii"); + setScriptCallOnMouseExit(299, new WidgetPointer(823,15), new WidgetPointer(-32768,3), ivar4, "IId"); + createExtraChild(new WidgetPointer(823,4), 5, ivar0); + setWidgetSprite(getOtherCommonData(ivar2, 1983)); + setWidgetSize(50, 50, 0, 0); + if (((boolean)mod(ivar0, 3))) { + setWidgetPosition(add(ivar7, 2), add(add(2, ivar7), multiply(ivar1, add(54, ivar7))), 0, 0); + } else if (((boolean)mod(ivar0, 3))) { + setWidgetPosition(add(2, add(multiply(ivar7, 2), ivar8)), add(add(2, ivar7), multiply(ivar1, add(54, ivar7))), 0, 0); + } else { + setWidgetPosition(add(2, add(multiply(ivar7, 3), multiply(ivar8, 2))), add(add(2, ivar7), multiply(ivar1, add(54, ivar7))), 0, 0); + } + if (mod(ivar0, 3) == 2) { + ivar1 = add(ivar1, 1); + } + ivar0 = add(ivar0, 1); + } + ivar1 = add(ivar1, 1); + cs2method2100(0, 0, new WidgetPointer(823,9)); + setWidgetScrollMax(0, add(ivar7, multiply(ivar1, add(54, ivar7))), new WidgetPointer(823,9)); + script_31(53936138, 53936137, 6507, 6504, 6505, 6506, 6499, 6498); + return; +} diff --git a/dumps/scripts/5309.cs2 b/dumps/scripts/5309.cs2 new file mode 100644 index 000000000..1707a70f9 --- /dev/null +++ b/dumps/scripts/5309.cs2 @@ -0,0 +1,21 @@ +void script_5309(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar1 = 7287; + ivar2 = 7706; + ivar3 = 7289; + ivar4 = 0; + while (ivar4 < getCommonDefinitionSize(840)) { + if (setWidgetRegister(new WidgetPointer(823,3), ivar4)) { + if (ivar4 != arg0) { + setWidgetSprite(ivar1); + } else { + setWidgetSprite(ivar1); + } + } + ivar4 = add(ivar4, 1); + } + return; +} diff --git a/dumps/scripts/531.cs2 b/dumps/scripts/531.cs2 new file mode 100644 index 000000000..dd352f4f9 --- /dev/null +++ b/dumps/scripts/531.cs2 @@ -0,0 +1,76 @@ +void script_531(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + ivar4 = -1; + ivar5 = 0; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = 0; + if (((arg0 == -1) || (arg1 == -1)) || (arg2 == -1)) { + return; + } + if (arg0 == 19726399) { + ivar5 = script_543(bitconfig_4090); + ivar7 = 19726381; + ivar8 = 19726382; + } + if (arg0 == 19726400) { + ivar5 = script_543(bitconfig_4091); + ivar7 = 19726383; + ivar8 = 19726384; + } + if (arg0 == 19726401) { + ivar5 = script_543(bitconfig_4093); + ivar7 = 19726385; + ivar8 = 19726386; + } + if (arg0 == 19726402) { + ivar5 = script_543(bitconfig_4095); + ivar7 = 19726387; + ivar8 = 19726388; + } + if (arg0 == 19726403) { + ivar5 = script_543(bitconfig_4096); + ivar7 = 19726389; + ivar8 = 19726390; + } + if (arg0 == 19726404) { + ivar5 = script_543(bitconfig_4098); + ivar7 = 19726391; + ivar8 = 19726392; + } + if (arg0 == 19726405) { + ivar5 = script_543(bitconfig_4100); + ivar7 = 19726393; + ivar8 = 19726394; + } + if (arg0 == 19726406) { + ivar5 = script_543(bitconfig_4101); + ivar7 = 19726395; + ivar8 = 19726396; + } + if (arg0 == 19726407) { + ivar5 = script_543(bitconfig_4102); + ivar7 = 19726397; + ivar8 = 19726398; + } + if (((boolean)ivar5)) { + ivar4 = arg1; + ivar9 = 0; + setWidgetRGB(new Color(250, 180, 50), new WidgetPointer(ivar7)); + setWidgetRGB(new Color(250, 180, 50), new WidgetPointer(ivar8)); + } else { + ivar4 = arg2; + ivar9 = 1; + setWidgetRGB(new Color(96, 96, 96), new WidgetPointer(ivar7)); + setWidgetRGB(new Color(96, 96, 96), new WidgetPointer(ivar8)); + } + setWidgetSprite(ivar4, new WidgetPointer(arg0)); + setWidgetIsHidden(((boolean)ivar9), new WidgetPointer(arg3)); + return; +} diff --git a/dumps/scripts/5310.cs2 b/dumps/scripts/5310.cs2 new file mode 100644 index 000000000..0d195afd9 --- /dev/null +++ b/dumps/scripts/5310.cs2 @@ -0,0 +1,4 @@ +void script_5310() { + script_5311(20906006, 20906007, 20906008, 20906009); + return; +} diff --git a/dumps/scripts/5311.cs2 b/dumps/scripts/5311.cs2 new file mode 100644 index 000000000..bc8f97d6a --- /dev/null +++ b/dumps/scripts/5311.cs2 @@ -0,0 +1,51 @@ +void script_5311(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar4 = 0; + ivar5 = getCommonDefinitionSize(5177); + ivar6 = getCommonDefinitionSize(5176); + globalarray_0 = new int[min(ivar5, ivar6)]; + ivar7 = 0; + while (ivar4 < min(ivar5, ivar6)) { + if (setWidgetRegister(new WidgetPointer(arg1), ivar4) && (strLength(getWidgetText()) > 0)) { + globalarray_0[ivar7] = ivar4; + ivar7 = add(ivar7, 1); + } + ivar4 = add(ivar4, 1); + } + if (ivar7 > 1) { + if (((boolean)globalint_1607)) { + script_4425(0, arg1, 0, subtract(ivar7, 1)); + globalint_1607 = -1; + } else { + script_4424(0, arg1, 0, subtract(ivar7, 1)); + globalint_1607 = 1; + } + } + ivar8 = 15; + ivar4 = 0; + while (ivar4 < ivar7) { + if (setWidgetRegister(new WidgetPointer(arg1), globalarray_0[ivar4])) { + setWidgetPosition(2, multiply(ivar8, ivar4), 0, 0); + if (setWidgetRegister(new WidgetPointer(arg2), globalarray_0[ivar4])) { + setWidgetPosition(140, add(multiply(ivar8, ivar4), 1), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(arg3), globalarray_0[ivar4])) { + setWidgetPosition(152, add(multiply(ivar8, ivar4), 1), 0, 0); + } + if (setWidgetRegister(new WidgetPointer(arg0), globalarray_0[ivar4])) { + setWidgetPosition(0, multiply(ivar8, ivar4), 0, 0); + if (((boolean)mod(ivar4, 2))) { + setWidgetRGB(new Color(34, 34, 34)); + } else { + setWidgetRGB(new Color(17, 17, 17)); + } + } + } + ivar4 = add(ivar4, 1); + } + return; +} diff --git a/dumps/scripts/5312.cs2 b/dumps/scripts/5312.cs2 new file mode 100644 index 000000000..137340512 --- /dev/null +++ b/dumps/scripts/5312.cs2 @@ -0,0 +1,17 @@ +void script_5312(int arg0) { + setWidgetIsHidden(false, new WidgetPointer(319,7)); + setWidgetIsHidden(false, new WidgetPointer(319,8)); + script_5313(20905991, 20906006, 20906007, 20906008, 20906009); + setWidgetIsHidden(false, new WidgetPointer(319,6)); + setWidgetIsHidden(false, new WidgetPointer(319,9)); + script_5315(20905990, 20906002, 20906003, 20906004, 20906005); + setWidgetIsHidden(true, new WidgetPointer(319,6)); + setWidgetIsHidden(true, new WidgetPointer(319,9)); + setWidgetIsHidden(true, new WidgetPointer(319,10)); + setWidgetIsHidden(false, new WidgetPointer(319,12)); + globalint_1607 = -1; + script_5311(20906006, 20906007, 20906008, 20906009); + setWidgetIsHidden(false, new WidgetPointer(319,38)); + setWidgetIsHidden(true, new WidgetPointer(319,30)); + return; +} diff --git a/dumps/scripts/5313.cs2 b/dumps/scripts/5313.cs2 new file mode 100644 index 000000000..77e3f95c8 --- /dev/null +++ b/dumps/scripts/5313.cs2 @@ -0,0 +1,59 @@ +void script_5313(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + ivar5 = 0; + ivar6 = 15; + ivar7 = getCommonDefinitionSize(5177); + ivar8 = getCommonDefinitionSize(5176); + ivar9 = -1; + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + deleteAllExtraChilds(new WidgetPointer(arg4)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + while (ivar5 < min(ivar7, ivar8)) { + createExtraChild(new WidgetPointer(arg1), 3, ivar5); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), ivar6, 0, 0); + setWidgetPosition(0, multiply(ivar5, ivar6), 0, 0); + if (((boolean)mod(ivar5, 2))) { + setWidgetRGB(new Color(34, 34, 34)); + } else { + setWidgetRGB(new Color(17, 17, 17)); + } + setWidgetFilled(1); + setWidgetContextMenuOption(1, "Sort"); + createExtraChild(new WidgetPointer(arg3), 5, ivar5); + setWidgetSprite(7712); + setWidgetContextMenuOption(1, "Play"); + setWidgetSize(12, 13, 0, 0); + setWidgetPosition(138, add(1, multiply(ivar5, ivar6)), 0, 0); + ivar9 = 7713; + setScriptCallOnMouseEntered(5336, new WidgetPointer(-32768,3), -2147483643, ivar9, "Iid"); + ivar9 = 7712; + setScriptCallOnMouseExit(5336, new WidgetPointer(-32768,3), -2147483643, ivar9, "Iid"); + createExtraChild(new WidgetPointer(arg4), 5, ivar5); + setWidgetSprite(7715); + setWidgetContextMenuOption(1, "Bookmark"); + setWidgetSize(12, 13, 0, 0); + setWidgetPosition(151, multiply(ivar5, ivar6), 0, 0); + ivar9 = 7716; + setScriptCallOnMouseEntered(5336, new WidgetPointer(-32768,3), -2147483643, ivar9, "Iid"); + ivar9 = 7715; + setScriptCallOnMouseExit(5336, new WidgetPointer(-32768,3), -2147483643, ivar9, "Iid"); + createExtraChild(new WidgetPointer(arg2), 4, ivar5); + setWidgetText(cs2method_3408(105, 115, 5177, ivar5)); + setWidgetFont(494); + setWidgetPosition(2, multiply(ivar5, ivar6), 0, 0); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 24), 15, 0, 0); + setWidgetRGB(new Color(221, 221, 221)); + setWidgetTextAlignment(0, 1, 0); + setWidgetUnknownBoolean(false); + ivar5 = add(ivar5, 1); + } + cs2method2100(0, 0, new WidgetPointer(arg0)); + setWidgetScrollMax(0, add(2, multiply(ivar5, ivar6)), new WidgetPointer(arg0)); + script_31(20905992, arg0, 6507, 6504, 6505, 6506, 6499, 6498); + return; +} diff --git a/dumps/scripts/5314.cs2 b/dumps/scripts/5314.cs2 new file mode 100644 index 000000000..aa00c0763 --- /dev/null +++ b/dumps/scripts/5314.cs2 @@ -0,0 +1,4 @@ +void script_5314(int arg0,int arg1,int arg2,int arg3,int arg4) { + script_5315(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/5315.cs2 b/dumps/scripts/5315.cs2 new file mode 100644 index 000000000..5321d13fe --- /dev/null +++ b/dumps/scripts/5315.cs2 @@ -0,0 +1,76 @@ +void script_5315(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + ivar5 = 0; + ivar6 = 15; + ivar7 = getCommonDefinitionSize(5177); + ivar8 = getCommonDefinitionSize(5176); + ivar9 = 0; + ivar10 = -1; + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg3)); + deleteAllExtraChilds(new WidgetPointer(arg4)); + while (ivar5 < 40) { + ivar9 = subtract(script_5319(ivar5), 1); + createExtraChild(new WidgetPointer(arg1), 3, ivar5); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg0)), ivar6, 0, 0); + setWidgetPosition(0, multiply(ivar5, ivar6), 0, 0); + if (((boolean)mod(ivar5, 2))) { + setWidgetRGB(new Color(34, 34, 34)); + } else { + setWidgetRGB(new Color(17, 17, 17)); + } + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg3), 5, ivar5); + setWidgetSprite(7712); + setWidgetContextMenuOption(1, "Play"); + setWidgetSize(12, 13, 0, 0); + setWidgetPosition(138, add(1, multiply(ivar5, ivar6)), 0, 0); + ivar10 = 7713; + setScriptCallOnMouseEntered(5336, new WidgetPointer(-32768,3), -2147483643, ivar10, "Iid"); + ivar10 = 7712; + setScriptCallOnMouseExit(5336, new WidgetPointer(-32768,3), -2147483643, ivar10, "Iid"); + if (ivar9 < 0) { + setWidgetHidden(1); + } + createExtraChild(new WidgetPointer(arg4), 5, ivar5); + setWidgetSprite(7718); + setWidgetContextMenuOption(1, "Remove"); + setWidgetSize(12, 13, 0, 0); + setWidgetPosition(151, add(1, multiply(ivar5, ivar6)), 0, 0); + ivar10 = 7719; + setScriptCallOnMouseEntered(5336, new WidgetPointer(-32768,3), -2147483643, ivar10, "Iid"); + ivar10 = 7718; + setScriptCallOnMouseExit(5336, new WidgetPointer(-32768,3), -2147483643, ivar10, "Iid"); + if (ivar9 < 0) { + setWidgetHidden(1); + } + createExtraChild(new WidgetPointer(arg2), 4, ivar5); + setWidgetFont(494); + setWidgetPosition(2, multiply(ivar5, ivar6), 0, 0); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 24), 15, 0, 0); + setWidgetRGB(new Color(221, 221, 221)); + setWidgetTextAlignment(0, 1, 0); + setWidgetUnknownBoolean(false); + if (ivar9 >= 0) { + setWidgetText(cs2method_3408(105, 115, 5177, ivar9)); + } else { + setWidgetText(""); + } + cs2method1301(arg2, -1); + cs2method1302(1); + cs2method1303(3); + cs2method1304(20); + setScriptCallOnMouseDragReleased(5316, new WidgetPointer(-32768,3), -2147483643, -2147483641, "Iii"); + ivar5 = add(ivar5, 1); + } + cs2method2100(0, 0, new WidgetPointer(arg0)); + setWidgetScrollMax(0, add(2, multiply(ivar5, ivar6)), new WidgetPointer(arg0)); + script_31(20905993, arg0, 792, 789, 790, 791, 773, 788); + return; +} diff --git a/dumps/scripts/5316.cs2 b/dumps/scripts/5316.cs2 new file mode 100644 index 000000000..dcbe2e7e6 --- /dev/null +++ b/dumps/scripts/5316.cs2 @@ -0,0 +1,7 @@ +void script_5316(int arg0,int arg1,int arg2) { + if ((((arg1 >= 0) && (arg1 < 40)) && ((arg2 >= 0) && (arg2 < 40))) && (setWidgetRegister(new WidgetPointer(arg0), arg1) && setWidgetRegister(new WidgetPointer(arg0), arg2))) { + setWidgetPosition(0, getWidgetActualY(), 0, 0); + setWidgetPosition(0, getWidgetActualY(), 0, 0); + } + return; +} diff --git a/dumps/scripts/5317.cs2 b/dumps/scripts/5317.cs2 new file mode 100644 index 000000000..70a9b34db --- /dev/null +++ b/dumps/scripts/5317.cs2 @@ -0,0 +1,22 @@ +void script_5317() { + if (isWidgetHidden(new WidgetPointer(319,38))) { + setWidgetIsHidden(false, new WidgetPointer(319,38)); + setWidgetIsHidden(true, new WidgetPointer(319,30)); + setWidgetIsHidden(true, new WidgetPointer(319,6)); + setWidgetIsHidden(true, new WidgetPointer(319,9)); + setWidgetIsHidden(true, new WidgetPointer(319,10)); + setWidgetIsHidden(false, new WidgetPointer(319,7)); + setWidgetIsHidden(false, new WidgetPointer(319,8)); + setWidgetIsHidden(false, new WidgetPointer(319,12)); + } else { + setWidgetIsHidden(true, new WidgetPointer(319,38)); + setWidgetIsHidden(false, new WidgetPointer(319,30)); + setWidgetIsHidden(false, new WidgetPointer(319,6)); + setWidgetIsHidden(false, new WidgetPointer(319,9)); + setWidgetIsHidden(false, new WidgetPointer(319,10)); + setWidgetIsHidden(true, new WidgetPointer(319,7)); + setWidgetIsHidden(true, new WidgetPointer(319,8)); + setWidgetIsHidden(true, new WidgetPointer(319,12)); + } + return; +} diff --git a/dumps/scripts/5318.cs2 b/dumps/scripts/5318.cs2 new file mode 100644 index 000000000..daae31436 --- /dev/null +++ b/dumps/scripts/5318.cs2 @@ -0,0 +1,124 @@ +void script_5318(int arg0,int arg1) { + switch (arg0) { + case 0: + globalint_1608 = arg1; + break; + case 1: + globalint_1609 = arg1; + break; + case 2: + globalint_1610 = arg1; + break; + case 3: + globalint_1611 = arg1; + break; + case 4: + globalint_1612 = arg1; + break; + case 5: + globalint_1613 = arg1; + break; + case 6: + globalint_1614 = arg1; + break; + case 7: + globalint_1615 = arg1; + break; + case 8: + globalint_1616 = arg1; + break; + case 9: + globalint_1617 = arg1; + break; + case 10: + globalint_1618 = arg1; + break; + case 11: + globalint_1619 = arg1; + break; + case 12: + globalint_1620 = arg1; + break; + case 13: + globalint_1621 = arg1; + break; + case 14: + globalint_1622 = arg1; + break; + case 15: + globalint_1623 = arg1; + break; + case 16: + globalint_1624 = arg1; + break; + case 17: + globalint_1625 = arg1; + break; + case 18: + globalint_1626 = arg1; + break; + case 19: + globalint_1627 = arg1; + break; + case 20: + globalint_1628 = arg1; + break; + case 21: + globalint_1629 = arg1; + break; + case 22: + globalint_1630 = arg1; + break; + case 23: + globalint_1631 = arg1; + break; + case 24: + globalint_1632 = arg1; + break; + case 25: + globalint_1633 = arg1; + break; + case 26: + globalint_1634 = arg1; + break; + case 27: + globalint_1635 = arg1; + break; + case 28: + globalint_1636 = arg1; + break; + case 29: + globalint_1637 = arg1; + break; + case 30: + globalint_1638 = arg1; + break; + case 31: + globalint_1639 = arg1; + break; + case 32: + globalint_1640 = arg1; + break; + case 33: + globalint_1641 = arg1; + break; + case 34: + globalint_1642 = arg1; + break; + case 35: + globalint_1643 = arg1; + break; + case 36: + globalint_1644 = arg1; + break; + case 37: + globalint_1645 = arg1; + break; + case 38: + globalint_1646 = arg1; + break; + case 39: + globalint_1647 = arg1; + } + return; +} diff --git a/dumps/scripts/5319.cs2 b/dumps/scripts/5319.cs2 new file mode 100644 index 000000000..5a30b0b9b --- /dev/null +++ b/dumps/scripts/5319.cs2 @@ -0,0 +1,85 @@ +int script_5319(int arg0) { + switch (arg0) { + case 0: + return globalint_1608; + case 1: + return globalint_1609; + case 2: + return globalint_1610; + case 3: + return globalint_1611; + case 4: + return globalint_1612; + case 5: + return globalint_1613; + case 6: + return globalint_1614; + case 7: + return globalint_1615; + case 8: + return globalint_1616; + case 9: + return globalint_1617; + case 10: + return globalint_1618; + case 11: + return globalint_1619; + case 12: + return globalint_1620; + case 13: + return globalint_1621; + case 14: + return globalint_1622; + case 15: + return globalint_1623; + case 16: + return globalint_1624; + case 17: + return globalint_1625; + case 18: + return globalint_1626; + case 19: + return globalint_1627; + case 20: + return globalint_1628; + case 21: + return globalint_1629; + case 22: + return globalint_1630; + case 23: + return globalint_1631; + case 24: + return globalint_1632; + case 25: + return globalint_1633; + case 26: + return globalint_1634; + case 27: + return globalint_1635; + case 28: + return globalint_1636; + case 29: + return globalint_1637; + case 30: + return globalint_1638; + case 31: + return globalint_1639; + case 32: + return globalint_1640; + case 33: + return globalint_1641; + case 34: + return globalint_1642; + case 35: + return globalint_1643; + case 36: + return globalint_1644; + case 37: + return globalint_1645; + case 38: + return globalint_1646; + case 39: + return globalint_1647; + } + return 0; +} diff --git a/dumps/scripts/532.cs2 b/dumps/scripts/532.cs2 new file mode 100644 index 000000000..b89af3b33 --- /dev/null +++ b/dumps/scripts/532.cs2 @@ -0,0 +1,4 @@ +void script_532(int arg0,int arg1) { + setWidgetText(new WidgetPointer(arg0), intToStr(getSkillActualLvl(arg1))); + return; +} diff --git a/dumps/scripts/5320.cs2 b/dumps/scripts/5320.cs2 new file mode 100644 index 000000000..fc5bb3c5e --- /dev/null +++ b/dumps/scripts/5320.cs2 @@ -0,0 +1,4 @@ +void script_5320() { + script_5324(bitconfig_9887); + return; +} diff --git a/dumps/scripts/5321.cs2 b/dumps/scripts/5321.cs2 new file mode 100644 index 000000000..1b034dc47 --- /dev/null +++ b/dumps/scripts/5321.cs2 @@ -0,0 +1,4 @@ +void script_5321() { + script_5324(bitconfig_9887); + return; +} diff --git a/dumps/scripts/5322.cs2 b/dumps/scripts/5322.cs2 new file mode 100644 index 000000000..f4cd73581 --- /dev/null +++ b/dumps/scripts/5322.cs2 @@ -0,0 +1,36 @@ +void script_5322(int arg0) { + switch (arg0) { + case 52232219: + bitconfig_9887 = 1; + script_5324(1); + break; + case 52232233: + bitconfig_9887 = 2; + script_5324(2); + break; + case 52232247: + bitconfig_9887 = 3; + script_5324(3); + break; + case 52232261: + bitconfig_9887 = 4; + script_5324(4); + break; + case 52232275: + bitconfig_9887 = 5; + script_5324(5); + break; + case 52232289: + bitconfig_9887 = 6; + script_5324(6); + break; + case 52232303: + bitconfig_9887 = 7; + script_5324(7); + break; + case 52232317: + bitconfig_9887 = 8; + script_5324(8); + } + return; +} diff --git a/dumps/scripts/5323.cs2 b/dumps/scripts/5323.cs2 new file mode 100644 index 000000000..7b57aebc5 --- /dev/null +++ b/dumps/scripts/5323.cs2 @@ -0,0 +1,11 @@ +void script_5323() { + setWidgetIsHidden(true, new WidgetPointer(797,27)); + setWidgetIsHidden(true, new WidgetPointer(797,40)); + setWidgetIsHidden(true, new WidgetPointer(797,54)); + setWidgetIsHidden(true, new WidgetPointer(797,68)); + setWidgetIsHidden(true, new WidgetPointer(797,82)); + setWidgetIsHidden(true, new WidgetPointer(797,96)); + setWidgetIsHidden(true, new WidgetPointer(797,110)); + setWidgetIsHidden(true, new WidgetPointer(797,124)); + return; +} diff --git a/dumps/scripts/5324.cs2 b/dumps/scripts/5324.cs2 new file mode 100644 index 000000000..a9e67f34c --- /dev/null +++ b/dumps/scripts/5324.cs2 @@ -0,0 +1,29 @@ +void script_5324(int arg0) { + script_5323(); + switch (arg0) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(797,27)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(797,40)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(797,54)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(797,68)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(797,82)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(797,96)); + break; + case 7: + setWidgetIsHidden(false, new WidgetPointer(797,110)); + break; + case 8: + setWidgetIsHidden(false, new WidgetPointer(797,124)); + } + return; +} diff --git a/dumps/scripts/5325.cs2 b/dumps/scripts/5325.cs2 new file mode 100644 index 000000000..3fafbb599 --- /dev/null +++ b/dumps/scripts/5325.cs2 @@ -0,0 +1,4 @@ +void script_5325(int arg0) { + script_5326(arg0); + return; +} diff --git a/dumps/scripts/5326.cs2 b/dumps/scripts/5326.cs2 new file mode 100644 index 000000000..08da1dbd6 --- /dev/null +++ b/dumps/scripts/5326.cs2 @@ -0,0 +1,12 @@ +void script_5326(int arg0) { + int ivar1; + int ivar2; + ivar1 = 20316177; + ivar2 = 20316179; + script_5330(); + setScriptCallOnGlobalStringChange(5327, 139, 141, 191, 192, 193, 289, 290, 291, 297, 298, 299, 300, 301, 302, 303, 15, "Y", new WidgetPointer(arg0)); + setScriptCallOnGlobalConfigChange(5327, 1606, 1, "Y", new WidgetPointer(arg0)); + script_31(ivar2, ivar1, 5666, 5663, 5664, 5665, 5686, 5685); + script_4725(); + return; +} diff --git a/dumps/scripts/5327.cs2 b/dumps/scripts/5327.cs2 new file mode 100644 index 000000000..d873758c4 --- /dev/null +++ b/dumps/scripts/5327.cs2 @@ -0,0 +1,4 @@ +void script_5327() { + script_4725(); + return; +} diff --git a/dumps/scripts/5328.cs2 b/dumps/scripts/5328.cs2 new file mode 100644 index 000000000..6beb9b972 --- /dev/null +++ b/dumps/scripts/5328.cs2 @@ -0,0 +1,50 @@ +void script_5328() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = 0; + ivar1 = 1; + ivar2 = divide(subtract(getWidgetActualWidth(new WidgetPointer(951,24)), multiply(subtract(8, 1), ivar1)), 8); + ivar3 = subtract(multiply(add(ivar2, ivar1), 8), ivar1); + setWidgetSize(add(ivar3, 12), getWidgetActualHeight(new WidgetPointer(951,2)), 0, 0, new WidgetPointer(951,2)); + deleteAllExtraChilds(new WidgetPointer(951,24)); + ivar4 = 0; + while (ivar0 < 8) { + createExtraChild(new WidgetPointer(951,24), 5, multiply(ivar0, 6)); + setWidgetSprite(5610); + setWidgetSize(6, 0, 0, 1); + setWidgetPosition(ivar4, 0, 0, 0); + setWidgetRGB(new Color(83, 83, 83)); + createExtraChild(new WidgetPointer(951,24), 5, add(multiply(ivar0, 6), 1)); + setWidgetSprite(5611); + setWidgetSize(subtract(ivar2, 12), 0, 0, 1); + setWidgetPosition(add(ivar4, 6), 0, 0, 0); + setWidgetHidden(0); + setWidgetRGB(new Color(83, 83, 83)); + createExtraChild(new WidgetPointer(951,24), 5, add(multiply(ivar0, 6), 2)); + setWidgetSprite(5612); + setWidgetSize(6, 0, 0, 1); + setWidgetPosition(subtract(add(ivar4, ivar2), 6), 0, 0, 0); + setWidgetRGB(new Color(83, 83, 83)); + createExtraChild(new WidgetPointer(951,24), 5, add(multiply(ivar0, 6), 3)); + setWidgetSprite(5610); + setWidgetSize(6, 0, 0, 1); + setWidgetPosition(ivar4, 0, 0, 0); + createExtraChild(new WidgetPointer(951,24), 5, add(multiply(ivar0, 6), 4)); + setWidgetSprite(5611); + setWidgetSize(subtract(ivar2, 12), 0, 0, 1); + setWidgetPosition(add(ivar4, 6), 0, 0, 0); + setWidgetHidden(0); + createExtraChild(new WidgetPointer(951,24), 5, add(multiply(ivar0, 6), 5)); + setWidgetSprite(5612); + setWidgetSize(6, 0, 0, 1); + setWidgetPosition(subtract(add(ivar4, ivar2), 6), 0, 0, 0); + ivar4 = add(add(ivar4, ivar1), ivar2); + ivar0 = add(ivar0, 1); + } + globalint_1657 = -1; + globalint_1658 = 0; + return; +} diff --git a/dumps/scripts/5329.cs2 b/dumps/scripts/5329.cs2 new file mode 100644 index 000000000..94821564f --- /dev/null +++ b/dumps/scripts/5329.cs2 @@ -0,0 +1,35 @@ +string script_5329(int arg0) { + switch (arg0) { + case 1: + return globalstring_139; + case 2: + return globalstring_141; + case 3: + return globalstring_191; + case 4: + return globalstring_192; + case 5: + return globalstring_193; + case 6: + return globalstring_289; + case 7: + return globalstring_290; + case 8: + return globalstring_291; + case 9: + return globalstring_297; + case 10: + return globalstring_298; + case 11: + return globalstring_299; + case 12: + return globalstring_300; + case 13: + return globalstring_301; + case 14: + return globalstring_302; + case 15: + return globalstring_303; + } + return ""; +} diff --git a/dumps/scripts/533.cs2 b/dumps/scripts/533.cs2 new file mode 100644 index 000000000..31c5344fa --- /dev/null +++ b/dumps/scripts/533.cs2 @@ -0,0 +1,4 @@ +void script_533(int arg0) { + setWidgetFilled(1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5330.cs2 b/dumps/scripts/5330.cs2 new file mode 100644 index 000000000..423cd69fe --- /dev/null +++ b/dumps/scripts/5330.cs2 @@ -0,0 +1,18 @@ +void script_5330() { + globalstring_139 = ""; + globalstring_141 = ""; + globalstring_191 = ""; + globalstring_192 = ""; + globalstring_193 = ""; + globalstring_289 = ""; + globalstring_290 = ""; + globalstring_291 = ""; + globalstring_297 = ""; + globalstring_298 = ""; + globalstring_299 = ""; + globalstring_300 = ""; + globalstring_301 = ""; + globalstring_302 = ""; + globalstring_303 = ""; + return; +} diff --git a/dumps/scripts/5331.cs2 b/dumps/scripts/5331.cs2 new file mode 100644 index 000000000..9b1135365 --- /dev/null +++ b/dumps/scripts/5331.cs2 @@ -0,0 +1,9 @@ +void script_5331() { + if (((boolean)globalint_1606)) { + globalint_1606 = 0; + } else { + globalint_1606 = 1; + } + script_4725(); + return; +} diff --git a/dumps/scripts/5332.cs2 b/dumps/scripts/5332.cs2 new file mode 100644 index 000000000..9e168e76d --- /dev/null +++ b/dumps/scripts/5332.cs2 @@ -0,0 +1,4 @@ +void script_5332(int arg0,int arg1,int arg2,int arg3,string arg4) { + script_5335(arg0, -1, arg1, arg2, arg3, 1, arg4); + return; +} diff --git a/dumps/scripts/5333.cs2 b/dumps/scripts/5333.cs2 new file mode 100644 index 000000000..ec5c4bb06 --- /dev/null +++ b/dumps/scripts/5333.cs2 @@ -0,0 +1,5 @@ +void script_5333(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + setWidgetSprite(arg4, new WidgetPointer(arg0)); + script_5335(arg0, -1, arg1, arg2, arg3, 1, arg5); + return; +} diff --git a/dumps/scripts/5334.cs2 b/dumps/scripts/5334.cs2 new file mode 100644 index 000000000..938b40e85 --- /dev/null +++ b/dumps/scripts/5334.cs2 @@ -0,0 +1,4 @@ +void script_5334(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + script_5335(arg0, arg1, arg2, arg3, arg4, 1, arg5); + return; +} diff --git a/dumps/scripts/5335.cs2 b/dumps/scripts/5335.cs2 new file mode 100644 index 000000000..4f37afdf2 --- /dev/null +++ b/dumps/scripts/5335.cs2 @@ -0,0 +1,158 @@ +void script_5335(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + flow_0: + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = -1; + IF (arg1 == -1) + GOTO flow_1 + GOTO flow_2 + flow_1: + IF (setWidgetRegister(new WidgetPointer(arg0))) + GOTO flow_3 + flow_2: + IF (setWidgetRegister(new WidgetPointer(arg0), arg1)) + GOTO flow_3 + GOTO flow_37 + flow_3: + if (((boolean)script_4761(arg3))) { + return; + } + if (globalint_2 != 1) { + ivar6 = add(getWidgetActualX(), 5); + ivar7 = add(add(getWidgetActualY(), getWidgetActualHeight()), 5); + ivar14 = getWidgetParentId(new WidgetPointer(arg2)); + if ((ivar14 != -1) && (arg4 >= getWidgetActualWidth(new WidgetPointer(ivar14)))) { + arg4 = getWidgetActualWidth(new WidgetPointer(ivar14)); + } + if (((boolean)arg5)) { + ivar12 = add(4, getMaxLineWidth(subtract(arg4, 4), 495, arg6)); + ivar13 = add(4, multiply(16, getLineCount(subtract(arg4, 4), 495, arg6))); + } else { + ivar12 = add(12, getMaxLineWidth(subtract(arg4, 12), 3793, arg6)); + ivar13 = add(12, multiply(16, getLineCount(subtract(arg4, 12), 3793, arg6))); + } + if (ivar14 != -1) { + ivar8 = subtract(ivar6, cs2method2600(new WidgetPointer(ivar14))); + ivar9 = subtract(ivar7, cs2method2601(new WidgetPointer(ivar14))); + if (ivar8 < 0) { + ivar6 = cs2method2600(new WidgetPointer(ivar14)); + ivar8 = 0; + } + if (ivar9 < 0) { + ivar7 = cs2method2601(new WidgetPointer(ivar14)); + ivar9 = 0; + } + if (ivar8 > 0) { + ivar10 = add(subtract(ivar8, getWidgetActualWidth(new WidgetPointer(ivar14))), ivar12); + if (ivar10 > 0) { + ivar6 = subtract(ivar6, ivar10); + } + } + if (ivar9 > 0) { + ivar11 = add(subtract(ivar9, getWidgetActualHeight(new WidgetPointer(ivar14))), ivar13); + if (ivar11 > 0) { + ivar7 = subtract(subtract(subtract(ivar7, ivar11), getWidgetActualHeight()), 10); + } + } + } + if (ivar6 < 0) { + ivar6 = 0; + } + if (ivar7 < 0) { + ivar7 = 0; + } + setWidgetSize(ivar12, ivar13, 0, 0, new WidgetPointer(arg2)); + setWidgetPosition(ivar6, ivar7, 0, 0, new WidgetPointer(arg2)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + createExtraChild(new WidgetPointer(arg2), 3, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetFilled(1); + if (((boolean)arg5)) { + setWidgetRGB(new Color(255, 255, 160)); + } else { + setWidgetRGB(new Color(0, 0, 0)); + } + if (((boolean)arg5)) { + createExtraChild(new WidgetPointer(arg2), 3, 1); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + } else { + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(4, 10, 1, 0); + setWidgetPosition(0, 0, 1, 0); + setWidgetSprite(4649); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(4, 10, 1, 0); + setWidgetPosition(0, 0, 1, 2); + setWidgetSprite(4649); + cs2method1107(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(10, 4, 0, 1); + setWidgetPosition(0, 0, 0, 1); + setWidgetSprite(4651); + cs2method1107(1); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(10, 4, 0, 1); + setWidgetPosition(0, 0, 2, 1); + setWidgetSprite(4651); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(10, 10, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSprite(4650); + setWidgetHFlip(1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(10, 10, 0, 0); + setWidgetPosition(0, 0, 2, 0); + setWidgetSprite(4650); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(10, 10, 0, 0); + setWidgetPosition(0, 0, 0, 2); + setWidgetSprite(4650); + setWidgetHFlip(1); + setWidgetVFlip(1); + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetSize(10, 10, 0, 0); + setWidgetPosition(0, 0, 2, 2); + setWidgetSprite(4650); + setWidgetVFlip(1); + } + createExtraChild(new WidgetPointer(arg2), 4, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetText(arg6); + if (((boolean)arg5)) { + setWidgetSize(subtract(arg4, 4), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetPosition(2, 0, 0, 0); + setWidgetTextAlignment(0, 1, 16); + setWidgetFont(495); + setWidgetRGB(new Color(0, 0, 0)); + } else { + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg2)), 12), subtract(getWidgetActualHeight(new WidgetPointer(arg2)), 12), 0, 0); + setWidgetPosition(6, 6, 0, 0); + setWidgetTextAlignment(1, 1, 13); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetFont(3793); + } + globalint_2 = 1; + } + flow_37: + return; +} diff --git a/dumps/scripts/5336.cs2 b/dumps/scripts/5336.cs2 new file mode 100644 index 000000000..5c29b6f53 --- /dev/null +++ b/dumps/scripts/5336.cs2 @@ -0,0 +1,6 @@ +void script_5336(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(arg2); + } + return; +} diff --git a/dumps/scripts/5337.cs2 b/dumps/scripts/5337.cs2 new file mode 100644 index 000000000..4266c17df --- /dev/null +++ b/dumps/scripts/5337.cs2 @@ -0,0 +1,4 @@ +void script_5337(int arg0,string arg1) { + cs2method5421(arg0, arg1); + return; +} diff --git a/dumps/scripts/5338.cs2 b/dumps/scripts/5338.cs2 new file mode 100644 index 000000000..73b0ab413 --- /dev/null +++ b/dumps/scripts/5338.cs2 @@ -0,0 +1,4 @@ +void script_5338(int arg0,string arg1,string arg2) { + script_5339(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/5339.cs2 b/dumps/scripts/5339.cs2 new file mode 100644 index 000000000..3ff532cbe --- /dev/null +++ b/dumps/scripts/5339.cs2 @@ -0,0 +1,4 @@ +void script_5339(int arg0,string arg1,string arg2) { + cs2method5400(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/534.cs2 b/dumps/scripts/534.cs2 new file mode 100644 index 000000000..9788f3019 --- /dev/null +++ b/dumps/scripts/534.cs2 @@ -0,0 +1,4 @@ +void script_534(int arg0) { + setWidgetFilled(0, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5340.cs2 b/dumps/scripts/5340.cs2 new file mode 100644 index 000000000..e936c7973 --- /dev/null +++ b/dumps/scripts/5340.cs2 @@ -0,0 +1,4 @@ +void script_5340() { + script_5341(); + return; +} diff --git a/dumps/scripts/5341.cs2 b/dumps/scripts/5341.cs2 new file mode 100644 index 000000000..d240cb34f --- /dev/null +++ b/dumps/scripts/5341.cs2 @@ -0,0 +1,8 @@ +void script_5341() { + if (isWidgetOpen(new WidgetPointer(746,1)) || isWidgetOpen(new WidgetPointer(548,240))) { + return; + } + setWidgetIsHidden(true, new WidgetPointer(746,245)); + setWidgetIsHidden(true, new WidgetPointer(548,240)); + return; +} diff --git a/dumps/scripts/5342.cs2 b/dumps/scripts/5342.cs2 new file mode 100644 index 000000000..764c0a145 --- /dev/null +++ b/dumps/scripts/5342.cs2 @@ -0,0 +1,13 @@ +void script_5342(int arg0) { + if (arg0 == -1) { + arg0 = 70; + } else if (arg0 > 255) { + arg0 = 255; + } else { + if (arg0 < 0) { + arg0 = 0; + } + } + cs2method2103(arg0, new WidgetPointer(746,0)); + return; +} diff --git a/dumps/scripts/5343.cs2 b/dumps/scripts/5343.cs2 new file mode 100644 index 000000000..4cc8f9700 --- /dev/null +++ b/dumps/scripts/5343.cs2 @@ -0,0 +1,6 @@ +void script_5343(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(arg2); + } + return; +} diff --git a/dumps/scripts/5344.cs2 b/dumps/scripts/5344.cs2 new file mode 100644 index 000000000..532dc0ffa --- /dev/null +++ b/dumps/scripts/5344.cs2 @@ -0,0 +1,10 @@ +void script_5344(int arg0,int arg1,int arg2,int arg3) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (getWidgetSpriteId() == arg2) { + setWidgetSprite(arg3); + } else { + setWidgetSprite(arg2); + } + } + return; +} diff --git a/dumps/scripts/5345.cs2 b/dumps/scripts/5345.cs2 new file mode 100644 index 000000000..a98c649ad --- /dev/null +++ b/dumps/scripts/5345.cs2 @@ -0,0 +1,27 @@ +void script_5345() { + flow_0: + setWidgetIsHidden(true, new WidgetPointer(622,6)); + setWidgetIsHidden(true, new WidgetPointer(622,7)); + setWidgetIsHidden(true, new WidgetPointer(622,9)); + setWidgetIsHidden(true, new WidgetPointer(622,8)); + SWITCH (getLanguage()) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + } + setWidgetIsHidden(false, new WidgetPointer(622,6)); + GOTO flow_4 + flow_1: + setWidgetIsHidden(false, new WidgetPointer(622,9)); + GOTO flow_4 + flow_2: + setWidgetIsHidden(false, new WidgetPointer(622,7)); + GOTO flow_4 + flow_3: + setWidgetIsHidden(false, new WidgetPointer(622,8)); + flow_4: + return; +} diff --git a/dumps/scripts/5346.cs2 b/dumps/scripts/5346.cs2 new file mode 100644 index 000000000..997190069 --- /dev/null +++ b/dumps/scripts/5346.cs2 @@ -0,0 +1,20 @@ +void script_5346(int arg0) { + int ivar1; + int ivar2; + ivar1 = 74907756; + ivar2 = getWidgetShadeColor(new WidgetPointer(ivar1)); + if (((boolean)arg0)) { + ivar2 = min(add(ivar2, 1), 255); + cs2method2103(ivar2, new WidgetPointer(ivar1)); + if (ivar2 == 255) { + setScriptCallOnGameloop(5346, 0, "1", new WidgetPointer(ivar1)); + } + } else { + ivar2 = max(subtract(ivar2, 1), 0); + cs2method2103(ivar2, new WidgetPointer(ivar1)); + if (((boolean)ivar2)) { + setScriptCallOnGameloop(5346, 1, "1", new WidgetPointer(ivar1)); + } + } + return; +} diff --git a/dumps/scripts/5347.cs2 b/dumps/scripts/5347.cs2 new file mode 100644 index 000000000..faa943b35 --- /dev/null +++ b/dumps/scripts/5347.cs2 @@ -0,0 +1,58 @@ +void script_5347() { + int ivar0; + int ivar1; + flow_0: + ivar0 = -1; + ivar1 = -1; + SWITCH (getLanguage()) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + } + ivar0 = 7790; + ivar1 = 7791; + GOTO flow_4 + flow_1: + ivar0 = 7794; + ivar1 = 7795; + GOTO flow_4 + flow_2: + ivar0 = 7792; + ivar1 = 7793; + GOTO flow_4 + flow_3: + ivar0 = 7796; + ivar1 = 7797; + flow_4: + SWITCH (globalint_1659) { + case 0: + GOTO flow_5 + case 1: + GOTO flow_6 + case 2: + GOTO flow_7 + case 3: + GOTO flow_8 + } + setWidgetText(new WidgetPointer(1143,11), "Sort By..."); + GOTO flow_9 + flow_5: + setWidgetText(new WidgetPointer(1143,11), "Price: Low-High"); + GOTO flow_9 + flow_6: + setWidgetText(new WidgetPointer(1143,11), "Price: High-Low"); + GOTO flow_9 + flow_7: + setWidgetText(new WidgetPointer(1143,11), "Name: A-Z"); + GOTO flow_9 + flow_8: + setWidgetText(new WidgetPointer(1143,11), "Name: Z-A"); + flow_9: + setWidgetIsHidden(true, new WidgetPointer(1143,6)); + setWidgetSprite(ivar0, new WidgetPointer(1143,70)); + setWidgetSprite(ivar1, new WidgetPointer(1143,71)); + return; +} diff --git a/dumps/scripts/5348.cs2 b/dumps/scripts/5348.cs2 new file mode 100644 index 000000000..b45708db2 --- /dev/null +++ b/dumps/scripts/5348.cs2 @@ -0,0 +1,12 @@ +void script_5348(int arg0) { + string svar0; + svar0 = ""; + if (globalint_1648 > 0) { + svar0 = formatNumber(globalint_1648, 1); + } else { + globalint_1648 = 0; + svar0 = "0"; + } + setWidgetText(new WidgetPointer(arg0), svar0); + return; +} diff --git a/dumps/scripts/5349.cs2 b/dumps/scripts/5349.cs2 new file mode 100644 index 000000000..b18154a94 --- /dev/null +++ b/dumps/scripts/5349.cs2 @@ -0,0 +1,4 @@ +void script_5349(int arg0,int arg1) { + script_5350(arg0, arg1); + return; +} diff --git a/dumps/scripts/535.cs2 b/dumps/scripts/535.cs2 new file mode 100644 index 000000000..c9ac2e4c3 --- /dev/null +++ b/dumps/scripts/535.cs2 @@ -0,0 +1,4 @@ +void script_535(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(divide(bitconfig_4103, 10))); + return; +} diff --git a/dumps/scripts/5350.cs2 b/dumps/scripts/5350.cs2 new file mode 100644 index 000000000..568e4ce56 --- /dev/null +++ b/dumps/scripts/5350.cs2 @@ -0,0 +1,442 @@ +void script_5350(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + string svar0; + string svar1; + string svar2; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + int stack_dump8; + int stack_dump9; + cs2func_script_5352_struct(5,0,0) structdump_10; + cs2func_script_5353_struct(5,0,0) structdump_11; + cs2func_script_4727_struct(5,0,0) structdump_12; + cs2func_script_4344_struct(5,0,0) structdump_13; + int stack_dump14; + cs2func_script_4726_struct(5,0,0) structdump_15; + ivar2 = 5181; + svar0 = "Home"; + ivar3 = 0; + if (((boolean)bitconfig_9487)) { + ivar2 = 5182; + svar0 = "Auras"; + ivar3 = 1; + } else if (bitconfig_9487 == 2) { + ivar2 = 3875; + svar0 = "Emotes"; + ivar3 = 2; + } else if (bitconfig_9487 == 3) { + if (IsFemale()) { + ivar2 = 5189; + } else { + ivar2 = 5188; + } + svar0 = "Costumes"; + ivar3 = 3; + } else if (bitconfig_9487 == 4) { + ivar2 = 5184; + svar0 = "Titles"; + ivar3 = 4; + } else if (bitconfig_9487 == 5) { + ivar2 = 5183; + svar0 = "Re-colour"; + ivar3 = 5; + } else if (bitconfig_9487 == 6) { + svar0 = "Special Offers"; + ivar3 = 6; + } else if (bitconfig_9487 == 7) { + svar0 = "Limited Edition"; + ivar3 = 7; + } else { + if (bitconfig_9487 == 8) { + svar0 = "My Favourites"; + ivar3 = 8; + } + } + ivar4 = 74907774; + ivar5 = cs2method2601(new WidgetPointer(ivar4)); + ivar6 = 74907708; + ivar7 = 74907709; + ivar8 = 74907707; + ivar9 = 74907693; + ivar10 = 74907694; + ivar11 = 74907695; + ivar12 = 74907696; + ivar13 = 74907697; + ivar14 = 74907688; + ivar15 = 74907689; + ivar16 = 74907690; + ivar17 = 74907691; + ivar18 = 74907692; + deleteAllExtraChilds(new WidgetPointer(ivar4)); + deleteAllExtraChilds(new WidgetPointer(ivar6)); + deleteAllExtraChilds(new WidgetPointer(ivar7)); + deleteAllExtraChilds(new WidgetPointer(ivar8)); + deleteAllExtraChilds(new WidgetPointer(ivar9)); + deleteAllExtraChilds(new WidgetPointer(ivar10)); + deleteAllExtraChilds(new WidgetPointer(ivar11)); + deleteAllExtraChilds(new WidgetPointer(ivar12)); + deleteAllExtraChilds(new WidgetPointer(ivar13)); + deleteAllExtraChilds(new WidgetPointer(ivar14)); + deleteAllExtraChilds(new WidgetPointer(ivar15)); + deleteAllExtraChilds(new WidgetPointer(ivar16)); + deleteAllExtraChilds(new WidgetPointer(ivar17)); + deleteAllExtraChilds(new WidgetPointer(ivar18)); + setWidgetIsHidden(true, new WidgetPointer(1143,62)); + setWidgetText(new WidgetPointer(1143,63), concat("Now Viewing: ", svar0)); + ivar19 = 0; + ivar20 = 6; + ivar21 = ivar20; + ivar22 = ivar20; + ivar23 = 0; + ivar24 = -1; + ivar25 = 7835; + ivar26 = 7836; + ivar27 = 7837; + ivar28 = 0; + ivar29 = 0; + ivar30 = 0; + ivar31 = 0; + ivar32 = 0; + svar1 = ""; + ivar33 = -1; + ivar34 = 0; + ivar35 = 0; + svar2 = "See More"; + ivar36 = 0; + if (((boolean)ivar3)) { + flow_20: + ivar25 = 7826; + ivar26 = 7827; + ivar27 = 7828; + ivar20 = 20; + ivar21 = 0; + ivar22 = ivar20; + createExtraChild(new WidgetPointer(ivar8), 5, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(17, 24, 0, 0); + setWidgetSprite(7803); + ivar34 = 311; + ivar35 = 311; + setWidgetSize(ivar34, ivar35, 0, 0); + setWidgetContextMenuOption(1, svar2); + createExtraChild(new WidgetPointer(ivar8), 5, ivar19); + ivar19 = add(ivar19, 1); + setWidgetSprite(7805); + setWidgetSize(141, 219, 0, 0); + setWidgetPosition(17, 24, 0, 0); + setWidgetPosition(add(getWidgetActualX(), divide(subtract(ivar34, getWidgetActualWidth()), 2)), add(add(getWidgetActualY(), 20), divide(subtract(ivar35, getWidgetActualHeight()), 2)), 0, 0); + createExtraChild(new WidgetPointer(ivar8), 5, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(0, 62, 0, 0); + setWidgetSize(348, 34, 0, 0); + SWITCH (getLanguage()) { + case 1: + GOTO flow_21 + case 2: + GOTO flow_22 + case 3: + GOTO flow_23 + } + setWidgetSprite(7806); + GOTO flow_24 + flow_21: + setWidgetSprite(7808); + GOTO flow_24 + flow_22: + setWidgetSprite(7807); + GOTO flow_24 + flow_23: + setWidgetSprite(7809); + flow_24: + createExtraChild(new WidgetPointer(ivar8), 4, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(165, 275, 0, 0); + setWidgetText(svar2); + setWidgetFont(4040); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(229, 189, 89)); + setWidgetTextAlignment(2, 1, 13); + setWidgetSize(122, 24, 0, 0); + while (ivar36 < getCommonDefinitionSize(ivar2)) { + ivar24 = cs2method_3408(105, 74, ivar2, ivar36); + createExtraChild(new WidgetPointer(ivar8), 5, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(ivar21, ivar22, 2, 0); + setWidgetSprite(ivar27); + ivar28 = 68; + ivar29 = 92; + ivar21 = add(ivar21, ivar28); + setWidgetSize(ivar28, ivar29, 0, 0); + switch (getOtherCommonData(ivar24, 1937)) { + case 1: + ivar33 = ivar9; + break; + case 2: + ivar33 = ivar10; + break; + case 3: + ivar33 = ivar11; + break; + case 4: + ivar33 = ivar12; + break; + case 5: + ivar33 = ivar13; + } + createExtraChild(new WidgetPointer(ivar33), 4, getExtraChildGap(new WidgetPointer(ivar33))); + setWidgetPosition(subtract(ivar21, ivar28), ivar22, 2, 0); + setWidgetSize(multiply(ivar28, 3), ivar29, 0, 0); + setWidgetContextMenuOption(1, svar2); + setScriptCallOnMouseEntered(5360, new WidgetPointer(ivar8), add(ivar19, 1), ivar19, subtract(ivar19, 1), 1, "Iiii1"); + setScriptCallOnMouseExit(5360, new WidgetPointer(ivar8), add(ivar19, 1), ivar19, subtract(ivar19, 1), 0, "Iiii1"); + createExtraChild(new WidgetPointer(ivar8), 5, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(ivar21, ivar22, 2, 0); + ivar21 = add(ivar21, ivar28); + setWidgetSprite(ivar26); + setWidgetSize(ivar28, ivar29, 0, 0); + createExtraChild(new WidgetPointer(ivar8), 5, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(ivar21, ivar22, 2, 0); + ivar21 = add(ivar21, ivar28); + setWidgetSprite(ivar25); + setWidgetSize(ivar28, ivar29, 0, 0); + createExtraChild(new WidgetPointer(ivar8), 5, ivar19); + ivar19 = add(ivar19, 1); + if (((boolean)getOtherCommonData(ivar24, 1937))) { + setItemOnWidgetMethod1200(getOtherCommonData(ivar24, 1935), -1); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(subtract(ivar21, 63), add(ivar22, 29), 2, 0); + } else if (getOtherCommonData(ivar24, 1937) == 2) { + setWidgetSprite(getOtherCommonData(ivar24, 1420)); + setWidgetSize(48, 48, 0, 0); + setWidgetPosition(subtract(ivar21, 65), add(ivar22, 21), 2, 0); + } else if (getOtherCommonData(ivar24, 1937) == 3) { + setWidgetSprite(getOtherCommonData(ivar24, 1441)); + setWidgetSize(40, 50, 0, 0); + setWidgetPosition(subtract(ivar21, 61), add(ivar22, 20), 2, 0); + } else if (getOtherCommonData(ivar24, 1937) == 4) { + setWidgetSprite(7883); + setWidgetSize(42, 42, 0, 0); + setWidgetPosition(subtract(ivar21, 63), add(ivar22, 25), 2, 0); + } else { + if (getOtherCommonData(ivar24, 1937) == 5) { + setItemOnWidgetMethod1200(getOtherCommonData(ivar24, 1935), -1); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(subtract(ivar21, 62), add(ivar22, 29), 2, 0); + } + } + if (getOtherCommonData(ivar24, 1933) > 0) { + createExtraChild(new WidgetPointer(ivar8), 5, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(subtract(ivar21, 44), add(ivar22, 4), 2, 0); + setWidgetSprite(6348); + setWidgetSize(40, 34, 0, 0); + } + createExtraChild(new WidgetPointer(ivar8), 4, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(13, add(ivar22, 13), 2, 0); + if (getOtherCommonData(ivar24, 1937) == 4) { + ivar32 = cs2method_3408(74, 105, 5185, ivar24); + if (IsFemale()) { + setWidgetText(cs2method_3408(105, 115, 3886, ivar32)); + } else { + setWidgetText(cs2method_3408(105, 115, 3887, ivar32)); + } + setWidgetText(substr(0, subtract(strLength(getWidgetText()), 1), getWidgetText())); + } else { + setWidgetText(getOtherCommonData(ivar24, 1930)); + } + if (getOtherCommonData(ivar24, 1933) > 0) { + setWidgetText(concat(getWidgetText(), "
" + formatNumber(getOtherCommonData(ivar24, 1933), 1) + " Points")); + } else { + setWidgetText(concat(getWidgetText(), "
" + formatNumber(getOtherCommonData(ivar24, 1932), 1) + " Points")); + } + setWidgetFont(4040); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(230, 190, 120)); + setWidgetTextAlignment(1, 1, 13); + setWidgetSize(122, 60, 0, 0); + createExtraChild(new WidgetPointer(ivar8), 4, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(13, add(add(add(ivar22, 13), 24), 24), 2, 0); + setWidgetText(svar2); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(230, 190, 120)); + setWidgetTextAlignment(2, 1, 12); + setWidgetSize(122, 24, 0, 0); + ivar22 = add(add(ivar22, ivar29), ivar20); + ivar21 = 0; + ivar36 = add(ivar36, 1); + } + } else if (ivar3 == 6) { + stack_dump0 = ivar30; + stack_dump1 = ivar21; + stack_dump2 = ivar22; + stack_dump3 = ivar29; + stack_dump4 = ivar20; + stack_dump5 = ivar19; + stack_dump6 = ivar31; + stack_dump7 = ivar25; + stack_dump8 = ivar26; + stack_dump9 = ivar27; + structdump_10 = script_5352(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9); + ivar19 = structdump_10.intpart_4; + ivar29 = structdump_10.intpart_3; + ivar22 = structdump_10.intpart_2; + ivar21 = structdump_10.intpart_1; + ivar30 = structdump_10.intpart_0; + svar1 = "There Are No Items Currently On Special Offer"; + ivar23 = add(add(ivar22, ivar29), ivar20); + } else if (ivar3 == 7) { + stack_dump0 = ivar30; + stack_dump1 = ivar21; + stack_dump2 = ivar22; + stack_dump3 = ivar29; + stack_dump4 = ivar20; + stack_dump5 = ivar19; + stack_dump6 = ivar31; + stack_dump7 = ivar25; + stack_dump8 = ivar26; + stack_dump9 = ivar27; + structdump_11 = script_5353(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9); + ivar19 = structdump_11.intpart_4; + ivar29 = structdump_11.intpart_3; + ivar22 = structdump_11.intpart_2; + ivar21 = structdump_11.intpart_1; + ivar30 = structdump_11.intpart_0; + svar1 = "There Are No Limited Edition Items Currently Available"; + ivar23 = add(add(ivar22, ivar29), ivar20); + } else if (ivar3 == 8) { + stack_dump0 = ivar30; + stack_dump1 = ivar21; + stack_dump2 = ivar22; + stack_dump3 = ivar29; + stack_dump4 = ivar20; + stack_dump5 = ivar19; + stack_dump6 = ivar31; + stack_dump7 = ivar25; + stack_dump8 = ivar26; + stack_dump9 = ivar27; + structdump_12 = script_4727(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9); + ivar19 = structdump_12.intpart_4; + ivar29 = structdump_12.intpart_3; + ivar22 = structdump_12.intpart_2; + ivar21 = structdump_12.intpart_1; + ivar30 = structdump_12.intpart_0; + svar1 = "Your Favourites List Is Currently Empty"; + ivar23 = add(add(ivar22, ivar29), ivar20); + } else if (((boolean)ivar3)) { + stack_dump0 = ivar30; + stack_dump1 = ivar21; + stack_dump2 = ivar22; + stack_dump3 = ivar29; + stack_dump4 = ivar20; + stack_dump5 = ivar19; + stack_dump6 = ivar31; + stack_dump7 = ivar25; + stack_dump8 = ivar26; + stack_dump9 = ivar27; + structdump_13 = script_4344(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9); + ivar19 = structdump_13.intpart_4; + ivar29 = structdump_13.intpart_3; + ivar22 = structdump_13.intpart_2; + ivar21 = structdump_13.intpart_1; + ivar30 = structdump_13.intpart_0; + svar1 = "There Are No Items Currently Available In This Category"; + ivar23 = add(add(ivar22, ivar29), ivar20); + } else { + stack_dump0 = ivar2; + stack_dump1 = ivar30; + stack_dump2 = ivar21; + stack_dump3 = ivar22; + stack_dump4 = ivar29; + stack_dump5 = ivar20; + stack_dump6 = ivar19; + stack_dump7 = ivar31; + stack_dump8 = ivar25; + stack_dump9 = ivar26; + stack_dump14 = ivar27; + structdump_15 = script_4726(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9, stack_dump14); + ivar19 = structdump_15.intpart_4; + ivar29 = structdump_15.intpart_3; + ivar22 = structdump_15.intpart_2; + ivar21 = structdump_15.intpart_1; + ivar30 = structdump_15.intpart_0; + svar1 = "There Are No Items Currently Available In This Category"; + ivar23 = add(add(ivar22, ivar29), ivar20); + } + if (((boolean)ivar19)) { + createExtraChild(new WidgetPointer(ivar8), 4, ivar19); + ivar19 = add(ivar19, 1); + setWidgetPosition(0, 0, 1, 1); + setWidgetText(svar1); + setWidgetFont(4040); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(230, 190, 120)); + setWidgetTextAlignment(1, 1, 13); + setWidgetSize(0, 0, 1, 1); + } + if (ivar23 > getWidgetActualHeight(new WidgetPointer(ivar4))) { + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar4)), ivar23, new WidgetPointer(ivar4)); + if (bitconfig_9487 == arg0) { + cs2method2100(0, ivar5, new WidgetPointer(ivar4)); + } else { + cs2method2100(0, 0, new WidgetPointer(ivar4)); + } + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar4)), ivar23, 0, 0, new WidgetPointer(ivar6)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar4)), ivar23, 0, 0, new WidgetPointer(ivar7)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar4)), ivar23, 0, 0, new WidgetPointer(ivar8)); + script_31(74907779, ivar4, 7900, 7897, 7898, 7899, 7902, 7901); + } else { + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(ivar4)), getWidgetActualHeight(new WidgetPointer(ivar4)), new WidgetPointer(ivar4)); + cs2method2100(0, 0, new WidgetPointer(ivar4)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar4)), getWidgetActualHeight(new WidgetPointer(ivar4)), 0, 0, new WidgetPointer(ivar6)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar4)), getWidgetActualHeight(new WidgetPointer(ivar4)), 0, 0, new WidgetPointer(ivar7)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(ivar4)), getWidgetActualHeight(new WidgetPointer(ivar4)), 0, 0, new WidgetPointer(ivar8)); + deleteAllExtraChilds(new WidgetPointer(1143,131)); + } + setScriptCallOnConfigChange(5349, ivar3, new WidgetPointer(arg1), 2226, 2391, 2392, 2393, 2394, 5, "iIY", new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/5351.cs2 b/dumps/scripts/5351.cs2 new file mode 100644 index 000000000..bdf350366 --- /dev/null +++ b/dumps/scripts/5351.cs2 @@ -0,0 +1,347 @@ +cs2func_script_5351_struct(5,0,0) script_5351(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + int ivar37; + int ivar38; + int ivar39; + int ivar40; + int ivar41; + string svar0; + string svar1; + ivar11 = 0; + ivar12 = 0; + ivar13 = 74907774; + ivar14 = 74907707; + ivar15 = 74907693; + ivar16 = 74907694; + ivar17 = 74907695; + ivar18 = 74907696; + ivar19 = 74907697; + ivar20 = 74907688; + ivar21 = 74907689; + ivar22 = 74907690; + ivar23 = 74907691; + ivar24 = 74907692; + ivar25 = -1; + ivar26 = 0; + ivar27 = -1; + ivar28 = 0; + ivar29 = -1; + ivar30 = -1; + ivar31 = -1; + svar0 = ""; + ivar32 = 0; + ivar33 = 7874; + ivar34 = 7875; + ivar35 = 7877; + ivar36 = 7877; + ivar37 = 7875; + ivar38 = 7877; + ivar39 = 7874; + ivar40 = 15122040; + ivar41 = 0; + svar1 = "Over"; + if (arg0 != -1) { + if (arg1 >= 3) { + arg2 = arg5; + arg3 = add(add(arg3, arg4), arg5); + arg1 = 0; + } + switch (getOtherCommonData(arg0, 1937)) { + case 1: + ivar25 = ivar15; + ivar27 = 5182; + break; + case 2: + ivar25 = ivar16; + ivar27 = 3875; + break; + case 3: + ivar25 = ivar17; + if (IsFemale()) { + ivar27 = 5189; + } else { + ivar27 = 5188; + } + break; + case 4: + ivar25 = ivar18; + ivar27 = 5184; + break; + case 5: + ivar25 = ivar19; + ivar27 = 5183; + } + ivar26 = 0; + while ((arg0 != cs2method_3408(105, 74, ivar27, ivar26)) && (ivar26 < getCommonDefinitionSize(ivar27))) { + ivar26 = add(ivar26, 1); + } + ivar32 = ivar26; + createExtraChild(new WidgetPointer(ivar14), 5, arg6); + arg6 = add(arg6, 1); + setWidgetPosition(arg2, arg3, 0, 0); + setWidgetSprite(arg8); + ivar12 = 58; + arg4 = 68; + arg2 = add(arg2, ivar12); + setWidgetSize(ivar12, arg4, 0, 0); + createExtraChild(new WidgetPointer(ivar14), 4, arg6); + arg6 = add(arg6, 1); + setWidgetPosition(subtract(arg2, ivar12), arg3, 0, 0); + setWidgetSize(multiply(ivar12, 3), arg4, 0, 0); + setScriptCallOnMouseEntered(5359, new WidgetPointer(ivar14), -2147483643, arg0, 1, "IiJ1"); + setScriptCallOnMouseExit(5359, new WidgetPointer(ivar14), -2147483643, arg0, 0, "IiJ1"); + createExtraChild(new WidgetPointer(ivar14), 5, arg6); + arg6 = add(arg6, 1); + setWidgetPosition(arg2, arg3, 0, 0); + arg2 = add(arg2, ivar12); + setWidgetSprite(arg9); + setWidgetSize(ivar12, arg4, 0, 0); + createExtraChild(new WidgetPointer(ivar14), 5, arg6); + arg6 = add(arg6, 1); + setWidgetPosition(arg2, arg3, 0, 0); + arg2 = add(arg2, ivar12); + arg2 = add(arg2, arg5); + setWidgetSprite(arg10); + setWidgetSize(ivar12, arg4, 0, 0); + switch (getOtherCommonData(arg0, 1937)) { + case 1: + ivar28 = ((int)isBitFlagged(standart_config_2229, ivar32)); + break; + case 2: + ivar28 = ((int)isBitFlagged(standart_config_2230, ivar32)); + ivar41 = 1; + break; + case 3: + ivar28 = ((int)isBitFlagged(standart_config_2231, ivar32)); + break; + case 4: + ivar28 = ((int)isBitFlagged(standart_config_2232, ivar32)); + break; + case 5: + ivar28 = ((int)isBitFlagged(standart_config_2232, add(ivar32, 16))); + ivar41 = 1; + } + if (((boolean)ivar28)) { + ivar29 = 7891; + ivar30 = 7893; + ivar31 = 7895; + svar0 = "Buy"; + } else { + ivar29 = 7892; + ivar30 = 7894; + ivar31 = 7896; + svar0 = "Reclaim"; + if (((boolean)ivar41)) { + svar0 = "Unlocked"; + } + } + createExtraChild(new WidgetPointer(ivar14), 5, arg6); + arg6 = add(arg6, 1); + setWidgetPosition(subtract(arg2, 103), add(arg3, 50), 0, 0); + setWidgetSprite(ivar29); + setWidgetSize(90, 23, 0, 0); + createExtraChild(new WidgetPointer(ivar14), 5, arg6); + if (((boolean)ivar28) && ((boolean)ivar41)) { + } else { + setScriptCallOnMouseEntered(4410, new WidgetPointer(ivar14), arg6, 0, "Iii"); + setScriptCallOnMouseExit(4410, new WidgetPointer(ivar14), arg6, 1, "Iii"); + } + arg6 = add(arg6, 1); + setWidgetPosition(subtract(arg2, 103), add(arg3, 50), 0, 0); + setWidgetSprite(ivar30); + setWidgetSize(90, 23, 0, 0); + cs2method2103(255); + createExtraChild(new WidgetPointer(ivar14), 5, arg6); + if (((boolean)ivar28) && ((boolean)ivar41)) { + } else { + setScriptCallOnMousePressed(5362, new WidgetPointer(ivar14), arg6, 0, "Iii"); + setScriptCallOnMouseReleased(5362, new WidgetPointer(ivar14), arg6, 1, "Iii"); + } + arg6 = add(arg6, 1); + setWidgetPosition(subtract(arg2, 103), add(arg3, 50), 0, 0); + setWidgetSprite(ivar31); + setWidgetSize(90, 23, 0, 0); + cs2method2103(255); + ivar26 = 0; + while (ivar26 < ivar32) { + if (setWidgetRegister(new WidgetPointer(ivar25), ivar26)) { + createExtraChild(new WidgetPointer(ivar25), 4, ivar26); + setWidgetHidden(1); + } + ivar26 = add(ivar26, 1); + } + createExtraChild(new WidgetPointer(ivar25), 4, ivar32); + setWidgetPosition(subtract(arg2, 103), add(arg3, 50), 0, 0); + setWidgetText(svar0); + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(ivar40)); + setWidgetTextAlignment(1, 1, 0); + setWidgetSize(90, 23, 0, 0); + if (((boolean)ivar28) && ((boolean)ivar41)) { + } else { + setWidgetContextMenuOption(1, svar0); + } + createExtraChild(new WidgetPointer(ivar14), 4, arg6); + arg6 = add(arg6, 1); + setWidgetPosition(subtract(arg2, 120), add(arg3, 10), 0, 0); + if (getOtherCommonData(arg0, 1937) == 4) { + ivar11 = cs2method_3408(74, 105, 5185, arg0); + if (IsFemale()) { + setWidgetText(cs2method_3408(105, 115, 3886, ivar11)); + } else { + setWidgetText(cs2method_3408(105, 115, 3887, ivar11)); + } + setWidgetText(substr(0, subtract(strLength(getWidgetText()), 1), getWidgetText())); + } else { + setWidgetText(getOtherCommonData(arg0, 1930)); + } + setWidgetFont(3793); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(ivar40)); + setWidgetTextAlignment(1, 1, 12); + setWidgetSize(107, 24, 0, 0); + if (getLineCount(getWidgetActualWidth(), getWidgetFont(), getWidgetText()) > 1) { + arg7 = 0; + } else { + arg7 = -5; + } + createExtraChild(new WidgetPointer(ivar14), 4, arg6); + arg6 = add(arg6, 1); + setWidgetPosition(subtract(arg2, 117), add(add(arg3, 34), arg7), 0, 0); + setWidgetFont(4040); + setWidgetUnknownBoolean(true); + if (getOtherCommonData(arg0, 1933) > 0) { + setWidgetText(concat(formatNumber(getOtherCommonData(arg0, 1933), 1), " Points")); + setWidgetRGB(new Color(86, 165, 204)); + } else { + setWidgetText(concat(formatNumber(getOtherCommonData(arg0, 1932), 1), " Points")); + setWidgetRGB(new Color(219, 144, 0)); + } + setWidgetTextAlignment(1, 1, 13); + setWidgetSize(79, 19, 0, 0); + switch (getOtherCommonData(arg0, 1937)) { + case 1: + ivar25 = ivar20; + break; + case 2: + ivar25 = ivar21; + break; + case 3: + ivar25 = ivar22; + break; + case 4: + ivar25 = ivar23; + break; + case 5: + ivar25 = ivar24; + } + switch (getOtherCommonData(arg0, 1937)) { + case 1: + ivar28 = ((int)isBitFlagged(standart_config_2391, ivar32)); + break; + case 2: + ivar28 = ((int)isBitFlagged(standart_config_2392, ivar32)); + break; + case 3: + ivar28 = ((int)isBitFlagged(standart_config_2393, ivar32)); + break; + case 4: + ivar28 = ((int)isBitFlagged(standart_config_2394, ivar32)); + break; + case 5: + ivar28 = ((int)isBitFlagged(standart_config_2394, add(ivar32, 16))); + } + ivar26 = 0; + while (ivar26 < ivar32) { + if (setWidgetRegister(new WidgetPointer(ivar25), ivar26)) { + createExtraChild(new WidgetPointer(ivar25), 4, ivar26); + setWidgetHidden(1); + } + ivar26 = add(ivar26, 1); + } + createExtraChild(new WidgetPointer(ivar25), 5, ivar32); + setWidgetPosition(subtract(arg2, 36), add(add(arg3, 33), arg7), 0, 0); + if (((boolean)ivar28)) { + ivar33 = ivar39; + ivar34 = ivar37; + ivar35 = ivar36; + setWidgetContextMenuOption(1, "Add to Favourites"); + if (bitconfig_9487 != 8) { + setScriptCallOnClickContextMenu(5354, new WidgetPointer(ivar25), ivar32, ivar35, ivar36, ivar38, ivar37, ivar39, "Iiddddd"); + } + } else { + ivar33 = ivar38; + ivar34 = ivar36; + ivar35 = ivar37; + setWidgetContextMenuOption(1, "Remove from Favourites"); + if (bitconfig_9487 != 8) { + setScriptCallOnClickContextMenu(5354, new WidgetPointer(ivar25), ivar32, ivar35, ivar36, ivar38, ivar37, ivar39, "Iiddddd"); + } + } + setWidgetSprite(ivar33); + setWidgetSize(21, 21, 0, 0); + setScriptCallOnMouseEntered(5343, new WidgetPointer(ivar25), ivar32, ivar34, "Iid"); + setScriptCallOnMouseExit(5343, new WidgetPointer(ivar25), ivar32, ivar33, "Iid"); + ivar32 = add(ivar32, 1); + createExtraChild(new WidgetPointer(ivar14), 5, arg6); + arg6 = add(arg6, 1); + if (((boolean)getOtherCommonData(arg0, 1937))) { + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(subtract(arg2, 162), add(arg3, 18), 0, 0); + setItemOnWidgetMethod1200(getOtherCommonData(arg0, 1935), -1); + } else if (getOtherCommonData(arg0, 1937) == 2) { + setWidgetSprite(getOtherCommonData(arg0, 1420)); + setWidgetSize(48, 48, 0, 0); + setWidgetPosition(subtract(arg2, 170), add(arg3, 11), 0, 0); + } else if (getOtherCommonData(arg0, 1937) == 3) { + setWidgetSprite(getOtherCommonData(arg0, 1441)); + setWidgetSize(40, 50, 0, 0); + setWidgetPosition(subtract(arg2, 166), add(arg3, 10), 0, 0); + } else if (getOtherCommonData(arg0, 1937) == 4) { + setWidgetSprite(7883); + setWidgetSize(42, 42, 0, 0); + setWidgetPosition(subtract(arg2, 166), add(arg3, 14), 0, 0); + } else { + if (getOtherCommonData(arg0, 1937) == 5) { + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(subtract(arg2, 161), add(arg3, 18), 0, 0); + setItemOnWidgetMethod1200(getOtherCommonData(arg0, 1935), -1); + } + } + if (getOtherCommonData(arg0, 1933) > 0) { + createExtraChild(new WidgetPointer(ivar14), 5, arg6); + arg6 = add(arg6, 1); + setWidgetPosition(subtract(arg2, 175), add(arg3, 5), 0, 0); + setWidgetSprite(6348); + setWidgetSize(40, 34, 0, 0); + } + arg1 = add(arg1, 1); + } + return newstruct cs2func_script_5351_struct(arg1, arg2, arg3, arg4, arg6); +} diff --git a/dumps/scripts/5352.cs2 b/dumps/scripts/5352.cs2 new file mode 100644 index 000000000..c104f7e1a --- /dev/null +++ b/dumps/scripts/5352.cs2 @@ -0,0 +1,304 @@ +cs2func_script_5352_struct(5,0,0) script_5352(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9) { + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + string svar0; + string svar1; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + int stack_dump8; + int stack_dump9; + int stack_dump10; + cs2func_script_5351_struct(5,0,0) structdump_11; + flow_0: + ivar10 = -1; + ivar11 = -1; + ivar12 = 0; + ivar13 = -1; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + while (ivar16 < 5) { + switch (ivar16) { + case 0: + ivar10 = 5182; + break; + case 1: + ivar10 = 3875; + break; + case 2: + if (IsFemale()) { + ivar10 = 5189; + } else { + ivar10 = 5188; + } + break; + case 3: + ivar10 = 5184; + break; + case 4: + ivar10 = 5183; + } + ivar14 = 0; + while (ivar14 < getCommonDefinitionSize(ivar10)) { + ivar11 = cs2method_3408(105, 74, ivar10, ivar14); + if (getOtherCommonData(ivar11, 1933) > 0) { + ivar15 = add(ivar15, 1); + } + ivar14 = add(ivar14, 1); + } + ivar16 = add(ivar16, 1); + } + if (ivar15 < 1) { + return newstruct cs2func_script_5352_struct(arg0, arg1, arg2, arg3, arg5); + } + globalarray_0 = new int[ivar15]; + ivar17 = subtract(ivar15, 1); + ivar16 = 0; + while (ivar16 < 5) { + switch (ivar16) { + case 0: + ivar10 = 5182; + break; + case 1: + ivar10 = 3875; + break; + case 2: + if (IsFemale()) { + ivar10 = 5189; + } else { + ivar10 = 5188; + } + break; + case 3: + ivar10 = 5184; + break; + case 4: + ivar10 = 5183; + } + ivar14 = 0; + while (ivar14 < getCommonDefinitionSize(ivar10)) { + ivar11 = cs2method_3408(105, 74, ivar10, ivar14); + if (getOtherCommonData(ivar11, 1933) > 0) { + globalarray_0[ivar17] = ivar11; + ivar17 = max(subtract(ivar17, 1), 0); + } + ivar14 = add(ivar14, 1); + } + ivar16 = add(ivar16, 1); + } + ivar14 = 0; + ivar12 = 1; + ivar18 = 0; + ivar19 = 0; + svar0 = ""; + svar1 = ""; + ivar20 = 0; + ivar21 = 0; + SWITCH (globalint_1659) { + case 1: + GOTO flow_51 + case 2: + GOTO flow_65 + case 3: + GOTO flow_97 + } + while (((boolean)ivar12)) { + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1932); + } + if (ivar18 < ivar19) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + } + flow_50: + GOTO flow_128 + flow_51: + IF (((boolean)ivar12)) + GOTO flow_52 + GOTO flow_64 + flow_52: + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1932); + } + if (ivar18 > ivar19) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + GOTO flow_51 + flow_64: + GOTO flow_128 + flow_65: + IF (((boolean)ivar12)) + GOTO flow_66 + GOTO flow_96 + flow_66: + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[ivar14]) { + if (IsFemale()) { + svar0 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar0 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar0 = getOtherCommonData(globalarray_0[ivar14], 1930); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[subtract(ivar14, 1)]) { + if (IsFemale()) { + svar1 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar1 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar1 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1930); + } + if (stringMethod4107(svar0, svar1) < 0) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + GOTO flow_65 + flow_96: + GOTO flow_128 + flow_97: + IF (((boolean)ivar12)) + GOTO flow_98 + GOTO flow_128 + flow_98: + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[ivar14]) { + if (IsFemale()) { + svar0 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar0 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar0 = getOtherCommonData(globalarray_0[ivar14], 1930); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[subtract(ivar14, 1)]) { + if (IsFemale()) { + svar1 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar1 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar1 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1930); + } + if (stringMethod4107(svar0, svar1) > 0) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + GOTO flow_97 + flow_128: + ivar14 = 0; + while (ivar14 < ivar15) { + ivar11 = globalarray_0[ivar14]; + stack_dump0 = ivar11; + stack_dump1 = arg0; + stack_dump2 = arg1; + stack_dump3 = arg2; + stack_dump4 = arg3; + stack_dump5 = arg4; + stack_dump6 = arg5; + stack_dump7 = arg6; + stack_dump8 = arg7; + stack_dump9 = arg8; + stack_dump10 = arg9; + structdump_11 = script_5351(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9, stack_dump10); + arg5 = structdump_11.intpart_4; + arg3 = structdump_11.intpart_3; + arg2 = structdump_11.intpart_2; + arg1 = structdump_11.intpart_1; + arg0 = structdump_11.intpart_0; + ivar14 = add(ivar14, 1); + } + return newstruct cs2func_script_5352_struct(arg0, arg1, arg2, arg3, arg5); +} diff --git a/dumps/scripts/5353.cs2 b/dumps/scripts/5353.cs2 new file mode 100644 index 000000000..a735d4129 --- /dev/null +++ b/dumps/scripts/5353.cs2 @@ -0,0 +1,304 @@ +cs2func_script_5353_struct(5,0,0) script_5353(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9) { + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + string svar0; + string svar1; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + int stack_dump7; + int stack_dump8; + int stack_dump9; + int stack_dump10; + cs2func_script_5351_struct(5,0,0) structdump_11; + flow_0: + ivar10 = -1; + ivar11 = -1; + ivar12 = 0; + ivar13 = -1; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + while (ivar16 < 5) { + switch (ivar16) { + case 0: + ivar10 = 5182; + break; + case 1: + ivar10 = 3875; + break; + case 2: + if (IsFemale()) { + ivar10 = 5189; + } else { + ivar10 = 5188; + } + break; + case 3: + ivar10 = 5184; + break; + case 4: + ivar10 = 5183; + } + ivar14 = 0; + while (ivar14 < getCommonDefinitionSize(ivar10)) { + ivar11 = cs2method_3408(105, 74, ivar10, ivar14); + if (((boolean)getOtherCommonData(ivar11, 1934))) { + ivar15 = add(ivar15, 1); + } + ivar14 = add(ivar14, 1); + } + ivar16 = add(ivar16, 1); + } + if (ivar15 < 1) { + return newstruct cs2func_script_5353_struct(arg0, arg1, arg2, arg3, arg5); + } + globalarray_0 = new int[ivar15]; + ivar17 = subtract(ivar15, 1); + ivar16 = 0; + while (ivar16 < 5) { + switch (ivar16) { + case 0: + ivar10 = 5182; + break; + case 1: + ivar10 = 3875; + break; + case 2: + if (IsFemale()) { + ivar10 = 5189; + } else { + ivar10 = 5188; + } + break; + case 3: + ivar10 = 5184; + break; + case 4: + ivar10 = 5183; + } + ivar14 = 0; + while (ivar14 < getCommonDefinitionSize(ivar10)) { + ivar11 = cs2method_3408(105, 74, ivar10, ivar14); + if (((boolean)getOtherCommonData(ivar11, 1934))) { + globalarray_0[ivar17] = ivar11; + ivar17 = max(subtract(ivar17, 1), 0); + } + ivar14 = add(ivar14, 1); + } + ivar16 = add(ivar16, 1); + } + ivar14 = 0; + ivar12 = 1; + ivar18 = 0; + ivar19 = 0; + svar0 = ""; + svar1 = ""; + ivar20 = 0; + ivar21 = 0; + SWITCH (globalint_1659) { + case 1: + GOTO flow_51 + case 2: + GOTO flow_65 + case 3: + GOTO flow_97 + } + while (((boolean)ivar12)) { + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1932); + } + if (ivar18 < ivar19) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + } + flow_50: + GOTO flow_128 + flow_51: + IF (((boolean)ivar12)) + GOTO flow_52 + GOTO flow_64 + flow_52: + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1933) > 0) { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1933); + } else { + ivar18 = getOtherCommonData(globalarray_0[ivar14], 1932); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933) > 0) { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1933); + } else { + ivar19 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1932); + } + if (ivar18 > ivar19) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + GOTO flow_51 + flow_64: + GOTO flow_128 + flow_65: + IF (((boolean)ivar12)) + GOTO flow_66 + GOTO flow_96 + flow_66: + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[ivar14]) { + if (IsFemale()) { + svar0 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar0 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar0 = getOtherCommonData(globalarray_0[ivar14], 1930); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[subtract(ivar14, 1)]) { + if (IsFemale()) { + svar1 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar1 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar1 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1930); + } + if (stringMethod4107(svar0, svar1) < 0) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + GOTO flow_65 + flow_96: + GOTO flow_128 + flow_97: + IF (((boolean)ivar12)) + GOTO flow_98 + GOTO flow_128 + flow_98: + ivar12 = 0; + ivar14 = subtract(ivar15, 1); + while (ivar14 > 0) { + if (getOtherCommonData(globalarray_0[ivar14], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[ivar14]) { + if (IsFemale()) { + svar0 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar0 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar0 = getOtherCommonData(globalarray_0[ivar14], 1930); + } + if (getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1937) == 4) { + ivar20 = 0; + ivar21 = 0; + while ((ivar20 < getCommonDefinitionSize(5184)) && ((boolean)ivar21)) { + if (cs2method_3408(105, 74, 5184, ivar20) == globalarray_0[subtract(ivar14, 1)]) { + if (IsFemale()) { + svar1 = cs2method_3408(105, 115, 5186, ivar20); + } else { + svar1 = cs2method_3408(105, 115, 5187, ivar20); + } + ivar21 = 1; + } + ivar20 = add(ivar20, 1); + } + } else { + svar1 = getOtherCommonData(globalarray_0[subtract(ivar14, 1)], 1930); + } + if (stringMethod4107(svar0, svar1) > 0) { + ivar12 = 1; + ivar13 = globalarray_0[subtract(ivar14, 1)]; + globalarray_0[subtract(ivar14, 1)] = globalarray_0[ivar14]; + globalarray_0[ivar14] = ivar13; + } + ivar14 = subtract(ivar14, 1); + } + GOTO flow_97 + flow_128: + ivar14 = 0; + while (ivar14 < ivar15) { + ivar11 = globalarray_0[ivar14]; + stack_dump0 = ivar11; + stack_dump1 = arg0; + stack_dump2 = arg1; + stack_dump3 = arg2; + stack_dump4 = arg3; + stack_dump5 = arg4; + stack_dump6 = arg5; + stack_dump7 = arg6; + stack_dump8 = arg7; + stack_dump9 = arg8; + stack_dump10 = arg9; + structdump_11 = script_5351(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7, stack_dump8, stack_dump9, stack_dump10); + arg5 = structdump_11.intpart_4; + arg3 = structdump_11.intpart_3; + arg2 = structdump_11.intpart_2; + arg1 = structdump_11.intpart_1; + arg0 = structdump_11.intpart_0; + ivar14 = add(ivar14, 1); + } + return newstruct cs2func_script_5353_struct(arg0, arg1, arg2, arg3, arg5); +} diff --git a/dumps/scripts/5354.cs2 b/dumps/scripts/5354.cs2 new file mode 100644 index 000000000..6d637b237 --- /dev/null +++ b/dumps/scripts/5354.cs2 @@ -0,0 +1,13 @@ +void script_5354(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(arg2); + if (arg2 == arg3) { + setScriptCallOnMouseEntered(5343, new WidgetPointer(arg0), arg1, arg3, "Iid"); + setScriptCallOnMouseExit(5343, new WidgetPointer(arg0), arg1, arg4, "Iid"); + } else { + setScriptCallOnMouseEntered(5343, new WidgetPointer(arg0), arg1, arg5, "Iid"); + setScriptCallOnMouseExit(5343, new WidgetPointer(arg0), arg1, arg6, "Iid"); + } + } + return; +} diff --git a/dumps/scripts/5355.cs2 b/dumps/scripts/5355.cs2 new file mode 100644 index 000000000..e3423855e --- /dev/null +++ b/dumps/scripts/5355.cs2 @@ -0,0 +1,160 @@ +void script_5355(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + string svar0; + flow_0: + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = -1; + svar0 = getOtherCommonData(arg0, 1930); + IF ((getOtherCommonData(arg0, 1937) == 4) && (ivar9 < getCommonDefinitionSize(5184))) + GOTO flow_2 + GOTO flow_9 + flow_1: + flow_2: + IF (((boolean)ivar10)) + GOTO flow_3 + GOTO flow_9 + flow_3: + if (cs2method_3408(105, 74, 5184, ivar9) == arg0) { + if (IsFemale()) { + svar0 = cs2method_3408(105, 115, 5187, ivar9); + } else { + svar0 = cs2method_3408(105, 115, 5186, ivar9); + } + ivar10 = 1; + } + ivar9 = add(ivar9, 1); + GOTO flow_1 + flow_9: + setWidgetText(new WidgetPointer(1143,25), svar0); + if (((boolean)arg1)) { + setWidgetIsHidden(true, new WidgetPointer(1143,26)); + setWidgetIsHidden(true, new WidgetPointer(1143,27)); + setWidgetIsHidden(true, new WidgetPointer(1143,19)); + setWidgetPosition(0, 186, 1, 0, new WidgetPointer(1143,28)); + setWidgetPosition(0, 228, 1, 0, new WidgetPointer(1143,32)); + setWidgetText(new WidgetPointer(1143,186), "Reclaim"); + setWidgetContextMenuOption(1, new WidgetPointer(1143,186), "Reclaim"); + } else if (getOtherCommonData(arg0, 1933) > 0) { + setWidgetText(new WidgetPointer(1143,27), concat("Item Cost: ", formatNumber(getOtherCommonData(arg0, 1933), 1))); + } else { + setWidgetText(new WidgetPointer(1143,27), concat("Item Cost: ", formatNumber(getOtherCommonData(arg0, 1932), 1))); + } + setWidgetIsHidden(false, new WidgetPointer(1143,26)); + setWidgetIsHidden(false, new WidgetPointer(1143,27)); + setWidgetIsHidden(false, new WidgetPointer(1143,19)); + setWidgetPosition(0, 239, 1, 0, new WidgetPointer(1143,28)); + setWidgetPosition(0, 266, 1, 0, new WidgetPointer(1143,32)); + setWidgetText(new WidgetPointer(1143,186), "Buy"); + setWidgetContextMenuOption(1, new WidgetPointer(1143,186), "Buy"); + setWidgetText(new WidgetPointer(1143,26), concat("My Points: ", formatNumber(globalint_1648, 1))); + setWidgetIsHidden(false, new WidgetPointer(1143,28)); + setWidgetIsHidden(false, new WidgetPointer(1143,29)); + if (getOtherCommonData(arg0, 1950) != -1) { + ivar2 = 5; + } else if (getOtherCommonData(arg0, 1949) != -1) { + ivar2 = 4; + } else if (getOtherCommonData(arg0, 1948) != -1) { + ivar2 = 3; + } else if (getOtherCommonData(arg0, 1947) != -1) { + ivar2 = 2; + } else { + ivar2 = 1; + setWidgetIsHidden(true, new WidgetPointer(1143,28)); + setWidgetIsHidden(true, new WidgetPointer(1143,29)); + setWidgetPosition(0, 260, 1, 0, new WidgetPointer(1143,32)); + } + ivar6 = 63; + ivar7 = 57; + ivar5 = divide(subtract(getWidgetActualWidth(new WidgetPointer(1143,32)), multiply(ivar2, ivar6)), add(ivar2, 1)); + ivar8 = ivar5; + deleteAllExtraChilds(new WidgetPointer(1143,32)); + deleteAllExtraChilds(new WidgetPointer(1143,20)); + ivar9 = 0; + while (ivar9 < ivar2) { + switch (ivar9) { + case 0: + ivar11 = arg0; + break; + case 1: + ivar11 = getOtherCommonData(arg0, 1947); + break; + case 2: + ivar11 = getOtherCommonData(arg0, 1948); + break; + case 3: + ivar11 = getOtherCommonData(arg0, 1949); + break; + case 4: + ivar11 = getOtherCommonData(arg0, 1950); + } + createExtraChild(new WidgetPointer(1143,32), 3, ivar3); + ivar3 = add(ivar3, 1); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetSize(ivar6, ivar7, 0, 0); + setWidgetPosition(ivar8, 0, 0, 0); + cs2method2103(100); + setWidgetFilled(1); + if (ivar2 > 1) { + createExtraChild(new WidgetPointer(1143,20), 4, ivar4); + setWidgetSize(ivar6, ivar7, 0, 0); + setWidgetPosition(ivar8, 0, 0, 0); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(5358, ivar4, new WidgetPointer(1143,32), "iI"); + ivar4 = add(ivar4, 1); + } + createExtraChild(new WidgetPointer(1143,32), 5, ivar3); + setWidgetSprite(7766); + setWidgetSize(ivar6, ivar7, 0, 0); + setWidgetPosition(ivar8, 0, 0, 0); + if (ivar2 > 1) { + setScriptCallOnMouseEntered(5356, ivar3, new WidgetPointer(1143,32), ivar11, "iIJ"); + setScriptCallOnMouseExit(5357, ivar3, new WidgetPointer(1143,32), "iI"); + } + ivar3 = add(ivar3, 1); + createExtraChild(new WidgetPointer(1143,32), 5, ivar3); + ivar3 = add(ivar3, 1); + if (((boolean)getOtherCommonData(ivar11, 1937))) { + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(add(ivar8, divide(subtract(ivar6, getWidgetActualWidth()), 2)), 2), add(divide(subtract(ivar7, getWidgetActualHeight()), 2), 1), 0, 0); + setItemOnWidgetMethod1200(getOtherCommonData(ivar11, 1935), -1); + } else if (getOtherCommonData(ivar11, 1937) == 2) { + setWidgetSprite(getOtherCommonData(ivar11, 1420)); + setWidgetSize(48, 48, 0, 0); + setWidgetPosition(add(ivar8, divide(subtract(ivar6, getWidgetActualWidth()), 2)), divide(subtract(ivar7, getWidgetActualHeight()), 2), 0, 0); + } else if (getOtherCommonData(ivar11, 1937) == 3) { + setWidgetSprite(getOtherCommonData(ivar11, 1441)); + setWidgetSize(40, 50, 0, 0); + setWidgetPosition(add(ivar8, divide(subtract(ivar6, getWidgetActualWidth()), 2)), divide(subtract(ivar7, getWidgetActualHeight()), 2), 0, 0); + } else if (getOtherCommonData(ivar11, 1937) == 4) { + setWidgetSprite(7883); + setWidgetSize(42, 42, 0, 0); + setWidgetPosition(add(add(ivar8, divide(subtract(ivar6, getWidgetActualWidth()), 2)), 1), add(divide(subtract(ivar7, getWidgetActualHeight()), 2), 1), 0, 0); + } else { + if (getOtherCommonData(ivar11, 1937) == 5) { + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar8, divide(subtract(ivar6, getWidgetActualWidth()), 2)), divide(subtract(ivar7, getWidgetActualHeight()), 2), 0, 0); + setItemOnWidgetMethod1200(getOtherCommonData(ivar11, 1935), -1); + } + } + ivar8 = add(add(ivar8, ivar6), ivar5); + ivar9 = add(ivar9, 1); + } + return; +} diff --git a/dumps/scripts/5356.cs2 b/dumps/scripts/5356.cs2 new file mode 100644 index 000000000..dd897217f --- /dev/null +++ b/dumps/scripts/5356.cs2 @@ -0,0 +1,7 @@ +void script_5356(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + setWidgetSprite(7767); + setWidgetText(new WidgetPointer(1143,29), getOtherCommonData(arg2, 1994)); + } + return; +} diff --git a/dumps/scripts/5357.cs2 b/dumps/scripts/5357.cs2 new file mode 100644 index 000000000..1b062ca19 --- /dev/null +++ b/dumps/scripts/5357.cs2 @@ -0,0 +1,7 @@ +void script_5357(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + setWidgetSprite(7766); + setWidgetText(new WidgetPointer(1143,29), ""); + } + return; +} diff --git a/dumps/scripts/5358.cs2 b/dumps/scripts/5358.cs2 new file mode 100644 index 000000000..88b0de9b9 --- /dev/null +++ b/dumps/scripts/5358.cs2 @@ -0,0 +1,46 @@ +void script_5358(int arg0,int arg1) { + switch (arg0) { + case 0: + arg0 = 1; + break; + case 1: + arg0 = 4; + break; + case 2: + arg0 = 7; + break; + case 3: + arg0 = 10; + break; + case 4: + arg0 = 13; + break; + default: + return; + } + if (setWidgetRegister(new WidgetPointer(arg1), 1)) { + setWidgetSprite(7766); + setScriptCallOnMouseExit(5357, 1, new WidgetPointer(arg1), "iI"); + } + if (setWidgetRegister(new WidgetPointer(arg1), 4)) { + setWidgetSprite(7766); + setScriptCallOnMouseExit(5357, 4, new WidgetPointer(arg1), "iI"); + } + if (setWidgetRegister(new WidgetPointer(arg1), 7)) { + setWidgetSprite(7766); + setScriptCallOnMouseExit(5357, 7, new WidgetPointer(arg1), "iI"); + } + if (setWidgetRegister(new WidgetPointer(arg1), 10)) { + setWidgetSprite(7766); + setScriptCallOnMouseExit(5357, 10, new WidgetPointer(arg1), "iI"); + } + if (setWidgetRegister(new WidgetPointer(arg1), 13)) { + setWidgetSprite(7766); + setScriptCallOnMouseExit(5357, 13, new WidgetPointer(arg1), "iI"); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg0)) { + setWidgetSprite(7767); + setScriptCallOnMouseExit(-1, ""); + } + return; +} diff --git a/dumps/scripts/5359.cs2 b/dumps/scripts/5359.cs2 new file mode 100644 index 000000000..7d092ff3f --- /dev/null +++ b/dumps/scripts/5359.cs2 @@ -0,0 +1,124 @@ +void script_5359(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 4; + ivar9 = getOtherCommonData(arg2, 1935); + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + svar4 = ""; + ivar13 = 0; + ivar14 = 0; + if ((((boolean)arg3) && (getOtherCommonData(arg2, 1937) != 2)) && setWidgetRegister(new WidgetPointer(arg0), arg1)) { + ivar4 = getWidgetActualX(); + ivar5 = getWidgetActualY(); + ivar6 = getWidgetActualWidth(); + ivar4 = add(ivar4, ivar6); + ivar5 = add(ivar5, ivar8); + setWidgetPosition(ivar4, ivar5, 0, 0, new WidgetPointer(1143,62)); + setWidgetText(new WidgetPointer(1143,130), getOtherCommonData(arg2, 1931)); + if (((boolean)getOtherCommonData(arg2, 1937))) { + ivar10 = divide(getItemHashmapData(ivar9, 1430), 100); + svar0 = "Duration: " + intToStr(ivar10) + " mins."; + ivar11 = divide(getItemHashmapData(ivar9, 1429), 100); + svar1 = "Recharge: " + intToStr(ivar11) + " mins."; + if (ivar10 > 60) { + ivar12 = mod(ivar10, 60); + ivar10 = divide(ivar10, 60); + if (ivar12 > 0) { + if (ivar10 > 1) { + svar0 = "Duration: " + intToStr(ivar10) + " hours, " + intToStr(ivar12) + " mins."; + } else { + svar0 = "Duration: 1 hour, " + intToStr(ivar12) + " mins."; + } + } else if (ivar10 > 1) { + svar0 = "Duration: " + intToStr(ivar10) + " hours."; + } else { + svar0 = "Duration: 1 hour."; + } + } + if (ivar11 > 60) { + ivar12 = mod(ivar11, 60); + ivar11 = divide(ivar11, 60); + if (ivar12 > 0) { + if (ivar11 > 1) { + svar1 = "Recharge: " + intToStr(ivar11) + " hours, " + intToStr(ivar12) + " mins."; + } else { + svar1 = "Recharge: 1 hour, " + intToStr(ivar12) + " mins."; + } + } else if (ivar11 > 1) { + svar1 = "Recharge: " + intToStr(ivar11) + " hours."; + } else { + svar1 = "Recharge: 1 hour."; + } + } + svar2 = "
" + "
" + svar0 + "
" + svar1; + setWidgetText(new WidgetPointer(1143,130), concat(getWidgetText(new WidgetPointer(1143,130)), svar2)); + } else { + if (getOtherCommonData(arg2, 1937) == 4) { + while ((ivar13 < getCommonDefinitionSize(5184)) && ((boolean)ivar14)) { + if (cs2method_3408(105, 74, 5184, ivar13) == arg2) { + svar4 = cs2method_3408(105, 115, 5187, ivar13); + svar3 = cs2method_3408(105, 115, 5186, ivar13); + ivar14 = 1; + } + ivar13 = add(ivar13, 1); + } + svar3 = concat("Male Title: ", svar3); + svar4 = concat("Female Title: ", svar4); + setWidgetText(new WidgetPointer(1143,130), svar3 + "
" + svar4); + } + } + ivar7 = getLineCount(getWidgetActualWidth(new WidgetPointer(1143,130)), getWidgetFont(new WidgetPointer(1143,130)), getWidgetText(new WidgetPointer(1143,130))); + ivar7 = add(multiply(ivar7, 13), multiply(ivar8, 2)); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(1143,62)), ivar7, 0, 0, new WidgetPointer(1143,62)); + setWidgetIsHidden(false, new WidgetPointer(1143,62)); + if (add(getWidgetActualWidth(new WidgetPointer(1143,62)), getWidgetActualX(new WidgetPointer(1143,62))) > getWidgetActualWidth(new WidgetPointer(1143,126))) { + ivar4 = add(subtract(getWidgetActualX(), getWidgetActualWidth(new WidgetPointer(1143,62))), 2); + setWidgetPosition(ivar4, ivar5, 0, 0, new WidgetPointer(1143,62)); + setWidgetPosition(12, getWidgetActualY(new WidgetPointer(1143,12)), 2, 0, new WidgetPointer(1143,12)); + setWidgetPosition(10, getWidgetActualY(new WidgetPointer(1143,127)), 2, 0, new WidgetPointer(1143,127)); + setWidgetPosition(11, getWidgetActualY(new WidgetPointer(1143,128)), 2, 0, new WidgetPointer(1143,128)); + setWidgetPosition(14, getWidgetActualY(new WidgetPointer(1143,130)), 2, 0, new WidgetPointer(1143,130)); + setWidgetPosition(0, 10, 2, 0, new WidgetPointer(1143,129)); + setWidgetHFlip(1, new WidgetPointer(1143,129)); + } else { + setWidgetPosition(12, getWidgetActualY(new WidgetPointer(1143,12)), 0, 0, new WidgetPointer(1143,12)); + setWidgetPosition(10, getWidgetActualY(new WidgetPointer(1143,127)), 0, 0, new WidgetPointer(1143,127)); + setWidgetPosition(11, getWidgetActualY(new WidgetPointer(1143,128)), 0, 0, new WidgetPointer(1143,128)); + setWidgetPosition(14, getWidgetActualY(new WidgetPointer(1143,130)), 0, 0, new WidgetPointer(1143,130)); + setWidgetPosition(0, 10, 0, 0, new WidgetPointer(1143,129)); + setWidgetHFlip(0, new WidgetPointer(1143,129)); + } + if (getWidgetActualHeight(new WidgetPointer(1143,62)) < add(getWidgetActualHeight(new WidgetPointer(1143,129)), 40)) { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1143,129)), 0, 0, 1, new WidgetPointer(1143,129)); + } else { + setWidgetPosition(getWidgetActualX(new WidgetPointer(1143,129)), 10, 0, 0, new WidgetPointer(1143,129)); + } + return; + } + setWidgetIsHidden(true, new WidgetPointer(1143,62)); + return; +} diff --git a/dumps/scripts/536.cs2 b/dumps/scripts/536.cs2 new file mode 100644 index 000000000..6edefb12f --- /dev/null +++ b/dumps/scripts/536.cs2 @@ -0,0 +1,4 @@ +void script_536() { + setScriptCallOnGameloop(537, getClientCycle(), add(getClientCycle(), 25), "ii", new WidgetPointer(745,2)); + return; +} diff --git a/dumps/scripts/5360.cs2 b/dumps/scripts/5360.cs2 new file mode 100644 index 000000000..c51511ed7 --- /dev/null +++ b/dumps/scripts/5360.cs2 @@ -0,0 +1,24 @@ +void script_5360(int arg0,int arg1,int arg2,int arg3,int arg4) { + if (((boolean)arg4)) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(7829); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + setWidgetSprite(7830); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg3)) { + setWidgetSprite(7831); + } + } else { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(7826); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg2)) { + setWidgetSprite(7827); + } + if (setWidgetRegister(new WidgetPointer(arg0), arg3)) { + setWidgetSprite(7828); + } + } + return; +} diff --git a/dumps/scripts/5361.cs2 b/dumps/scripts/5361.cs2 new file mode 100644 index 000000000..13b7c5587 --- /dev/null +++ b/dumps/scripts/5361.cs2 @@ -0,0 +1,6 @@ +void script_5361(int arg0,int arg1,int arg2,int arg3) { + script_4208(arg0, arg3); + script_4208(arg1, arg3); + script_4208(arg2, arg3); + return; +} diff --git a/dumps/scripts/5362.cs2 b/dumps/scripts/5362.cs2 new file mode 100644 index 000000000..e8c7c81cb --- /dev/null +++ b/dumps/scripts/5362.cs2 @@ -0,0 +1,4 @@ +void script_5362(int arg0,int arg1,int arg2) { + script_5363(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/5363.cs2 b/dumps/scripts/5363.cs2 new file mode 100644 index 000000000..c84cbc4e5 --- /dev/null +++ b/dumps/scripts/5363.cs2 @@ -0,0 +1,10 @@ +void script_5363(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (((boolean)arg2)) { + cs2method2103(0); + } else { + cs2method2103(255); + } + } + return; +} diff --git a/dumps/scripts/5364.cs2 b/dumps/scripts/5364.cs2 new file mode 100644 index 000000000..f930622f0 --- /dev/null +++ b/dumps/scripts/5364.cs2 @@ -0,0 +1,6 @@ +void script_5364(int arg0,int arg1,int arg2,int arg3) { + script_5365(arg0, arg3); + script_5365(arg1, arg3); + script_5365(arg2, arg3); + return; +} diff --git a/dumps/scripts/5365.cs2 b/dumps/scripts/5365.cs2 new file mode 100644 index 000000000..ef0a669ca --- /dev/null +++ b/dumps/scripts/5365.cs2 @@ -0,0 +1,4 @@ +void script_5365(int arg0,int arg1) { + setScriptCallOnGameloop(4214, new WidgetPointer(arg0), arg1, 0, "Iii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5366.cs2 b/dumps/scripts/5366.cs2 new file mode 100644 index 000000000..eb68cee58 --- /dev/null +++ b/dumps/scripts/5366.cs2 @@ -0,0 +1,32 @@ +void script_5366() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = divide(100, 8); + ivar1 = divide(globalint_1655, ivar0); + if (((boolean)mod(globalint_1655, ivar0))) { + ivar1 = subtract(ivar1, 1); + } + ivar2 = 0; + while (ivar2 < 8) { + if (ivar2 > ivar1) { + script_5367(add(multiply(ivar2, 6), 3), 0); + script_5367(add(multiply(ivar2, 6), 4), 0); + script_5367(add(multiply(ivar2, 6), 5), 0); + } else if (ivar2 < ivar1) { + script_5367(add(multiply(ivar2, 6), 3), 2); + script_5367(add(multiply(ivar2, 6), 4), 2); + script_5367(add(multiply(ivar2, 6), 5), 2); + } else { + if ((ivar2 == ivar1) && (ivar2 != globalint_1657)) { + globalint_1658 = 0; + globalint_1657 = ivar2; + script_5367(add(multiply(ivar2, 6), 3), 1); + script_5367(add(multiply(ivar2, 6), 4), 1); + script_5367(add(multiply(ivar2, 6), 5), 1); + } + } + ivar2 = add(ivar2, 1); + } + return; +} diff --git a/dumps/scripts/5367.cs2 b/dumps/scripts/5367.cs2 new file mode 100644 index 000000000..6eb8265bd --- /dev/null +++ b/dumps/scripts/5367.cs2 @@ -0,0 +1,19 @@ +void script_5367(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(951,24), arg0)) { + switch (arg1) { + case 0: + setWidgetHidden(1); + setScriptCallOnGameloop(-1, ""); + break; + case 1: + setWidgetHidden(0); + setScriptCallOnGameloop(5368, -2147483643, "i"); + break; + case 2: + setWidgetHidden(0); + setScriptCallOnGameloop(-1, ""); + cs2method2103(0); + } + } + return; +} diff --git a/dumps/scripts/5368.cs2 b/dumps/scripts/5368.cs2 new file mode 100644 index 000000000..5a16e1826 --- /dev/null +++ b/dumps/scripts/5368.cs2 @@ -0,0 +1,10 @@ +void script_5368(int arg0) { + int ivar1; + globalint_1658 = add(globalint_1658, 1); + ivar1 = divide(multiply(globalint_1658, 255), globalint_1656); + ivar1 = min(255, max(0, ivar1)); + if (setWidgetRegister(new WidgetPointer(951,24), arg0)) { + cs2method2103(ivar1); + } + return; +} diff --git a/dumps/scripts/5369.cs2 b/dumps/scripts/5369.cs2 new file mode 100644 index 000000000..5d030f38f --- /dev/null +++ b/dumps/scripts/5369.cs2 @@ -0,0 +1,4 @@ +void script_5369(int arg0) { + setWidgetText(new WidgetPointer(arg0), intToStr(add(rndExcl(9), 1))); + return; +} diff --git a/dumps/scripts/537.cs2 b/dumps/scripts/537.cs2 new file mode 100644 index 000000000..b262890d4 --- /dev/null +++ b/dumps/scripts/537.cs2 @@ -0,0 +1,29 @@ +void script_537(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + ivar2 = 0; + ivar3 = add(arg1, 25); + ivar4 = subtract(getClientCycle(), arg0); + if (getClientCycle() >= arg1) { + if (getClientCycle() < ivar3) { + ivar2 = divide(255, subtract(ivar3, arg1)); + ivar2 = subtract(255, multiply(ivar2, subtract(getClientCycle(), arg1))); + cs2method2103(ivar2, new WidgetPointer(745,2)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(745,2)); + cs2method2103(0, new WidgetPointer(745,2)); + return; + } + if (ivar4 <= 5) { + cs2method2103(0, new WidgetPointer(745,2)); + } else if (ivar4 <= 10) { + cs2method2103(85, new WidgetPointer(745,2)); + } else if (ivar4 <= 15) { + cs2method2103(200, new WidgetPointer(745,2)); + } else { + cs2method2103(85, new WidgetPointer(745,2)); + } + return; +} diff --git a/dumps/scripts/5370.cs2 b/dumps/scripts/5370.cs2 new file mode 100644 index 000000000..fc1897e66 --- /dev/null +++ b/dumps/scripts/5370.cs2 @@ -0,0 +1,37 @@ +void script_5370(int arg0,int arg1,string arg2,string arg3) { + int ivar2; + int ivar3; + if (((boolean)arg0)) { + setWidgetIsHidden(true, new WidgetPointer(951,14)); + } else { + setWidgetIsHidden(false, new WidgetPointer(951,14)); + } + if (((boolean)arg1)) { + setWidgetIsHidden(true, new WidgetPointer(951,2)); + } else { + setWidgetIsHidden(false, new WidgetPointer(951,2)); + } + setWidgetText(new WidgetPointer(951,48), arg2); + setWidgetText(new WidgetPointer(951,51), arg3); + ivar2 = getTextWidth(4040, arg3); + setWidgetSize(add(ivar2, 16), getWidgetActualHeight(new WidgetPointer(951,1)), 0, 0, new WidgetPointer(951,1)); + ivar2 = getTextWidth(4040, arg2); + setWidgetSize(add(ivar2, 16), getWidgetActualHeight(new WidgetPointer(951,3)), 0, 0, new WidgetPointer(951,3)); + ivar2 = max(getWidgetActualWidth(new WidgetPointer(951,1)), getWidgetActualWidth(new WidgetPointer(951,3))); + if (((boolean)arg1)) { + ivar2 = max(ivar2, getWidgetActualWidth(new WidgetPointer(951,2))); + } + if (((boolean)arg0)) { + ivar2 = max(ivar2, getWidgetActualWidth(new WidgetPointer(951,14))); + } + setWidgetSize(add(ivar2, 48), getWidgetActualHeight(new WidgetPointer(951,49)), 0, 0, new WidgetPointer(951,49)); + ivar3 = add(getWidgetActualHeight(new WidgetPointer(951,1)), getWidgetActualHeight(new WidgetPointer(951,3))); + if (((boolean)arg1)) { + ivar3 = add(ivar3, getWidgetActualHeight(new WidgetPointer(951,2))); + } + setWidgetSize(getWidgetActualWidth(new WidgetPointer(951,49)), ivar3, 0, 0, new WidgetPointer(951,49)); + if (((boolean)arg0)) { + setWidgetPosition(0, add(7, getWidgetActualHeight(new WidgetPointer(951,49))), 1, 0, new WidgetPointer(951,14)); + } + return; +} diff --git a/dumps/scripts/5371.cs2 b/dumps/scripts/5371.cs2 new file mode 100644 index 000000000..d9d69e4eb --- /dev/null +++ b/dumps/scripts/5371.cs2 @@ -0,0 +1,73 @@ +void script_5371(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + if (arg0 < 1) { + setWidgetText(new WidgetPointer(951,53), "-"); + } + if (arg0 < 2) { + setWidgetText(new WidgetPointer(951,55), "-"); + } + if (arg0 < 3) { + setWidgetText(new WidgetPointer(951,57), "-"); + } + if (arg0 < 4) { + setWidgetText(new WidgetPointer(951,59), "-"); + } + if (arg0 < 5) { + setWidgetText(new WidgetPointer(951,61), "-"); + } + if (arg0 < 6) { + setWidgetText(new WidgetPointer(951,63), "-"); + } + switch (arg0) { + case 0: + setWidgetText(new WidgetPointer(951,25), intToStr(arg1)); + break; + case 1: + setWidgetText(new WidgetPointer(951,53), intToStr(arg1)); + break; + case 2: + setWidgetText(new WidgetPointer(951,55), intToStr(arg1)); + break; + case 3: + setWidgetText(new WidgetPointer(951,57), intToStr(arg1)); + break; + case 4: + setWidgetText(new WidgetPointer(951,59), intToStr(arg1)); + break; + case 5: + setWidgetText(new WidgetPointer(951,61), intToStr(arg1)); + break; + case 6: + setWidgetText(new WidgetPointer(951,63), intToStr(arg1)); + } + switch (arg0) { + case 0: + script_5373(62324789, arg2); + break; + case 1: + script_5373(62324791, arg2); + break; + case 2: + script_5373(62324793, arg2); + break; + case 3: + script_5373(62324795, arg2); + break; + case 4: + script_5373(62324797, arg2); + break; + case 5: + script_5373(62324799, arg2); + } + ivar3 = subtract(multiply(63, arg0), 189); + ivar4 = add(ivar3, 63); + setScriptCallOnGameloop(5372, new WidgetPointer(951,36), ivar3, "Ii", new WidgetPointer(951,36)); + setScriptCallOnGameloop(5372, new WidgetPointer(951,34), ivar4, "Ii", new WidgetPointer(951,34)); + ivar5 = subtract(add(getWidgetActualX(new WidgetPointer(951,36)), divide(getWidgetActualWidth(new WidgetPointer(951,36)), 2)), divide(getWidgetActualWidth(new WidgetPointer(951,14)), 2)); + if (ivar5 < ivar3) { + playSoundEffect2False(7717, 1, 0, 180); + } + return; +} diff --git a/dumps/scripts/5372.cs2 b/dumps/scripts/5372.cs2 new file mode 100644 index 000000000..d682340bf --- /dev/null +++ b/dumps/scripts/5372.cs2 @@ -0,0 +1,13 @@ +void script_5372(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 3; + ivar3 = subtract(add(getWidgetActualX(new WidgetPointer(arg0)), divide(getWidgetActualWidth(new WidgetPointer(arg0)), 2)), divide(getWidgetActualWidth(new WidgetPointer(951,14)), 2)); + if (ivar3 >= arg1) { + setWidgetPosition(arg1, getWidgetActualY(new WidgetPointer(arg0)), 1, 0, new WidgetPointer(arg0)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } else { + setWidgetPosition(add(ivar3, ivar2), getWidgetActualY(new WidgetPointer(arg0)), 1, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/5373.cs2 b/dumps/scripts/5373.cs2 new file mode 100644 index 000000000..c65c07caf --- /dev/null +++ b/dumps/scripts/5373.cs2 @@ -0,0 +1,12 @@ +void script_5373(int arg0,int arg1) { + if (arg1 == -1) { + playSoundEffect2False(7715, 45, 0, 100); + setScriptCallOnGameloop(5369, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } else if (arg1 == -2) { + setWidgetText(new WidgetPointer(arg0), "-"); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(arg1)); + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/5374.cs2 b/dumps/scripts/5374.cs2 new file mode 100644 index 000000000..0f2946a2d --- /dev/null +++ b/dumps/scripts/5374.cs2 @@ -0,0 +1,4 @@ +void script_5374(int arg0) { + globalint_1656 = divide(multiply(multiply(arg0, 10), 50), multiply(6, 8)); + return; +} diff --git a/dumps/scripts/5375.cs2 b/dumps/scripts/5375.cs2 new file mode 100644 index 000000000..7434cae95 --- /dev/null +++ b/dumps/scripts/5375.cs2 @@ -0,0 +1,4 @@ +void script_5375() { + cs2method2005(0, new WidgetPointer(969,0)); + return; +} diff --git a/dumps/scripts/5376.cs2 b/dumps/scripts/5376.cs2 new file mode 100644 index 000000000..78dc2061d --- /dev/null +++ b/dumps/scripts/5376.cs2 @@ -0,0 +1,17 @@ +void script_5376() { + int ivar0; + ivar0 = 0; + while (ivar0 < 8) { + if (setWidgetRegister(new WidgetPointer(951,24), add(multiply(ivar0, 6), 3))) { + setScriptCallOnGameloop(-1, ""); + } + if (setWidgetRegister(new WidgetPointer(951,24), add(multiply(ivar0, 6), 4))) { + setScriptCallOnGameloop(-1, ""); + } + if (setWidgetRegister(new WidgetPointer(951,24), add(multiply(ivar0, 6), 5))) { + setScriptCallOnGameloop(-1, ""); + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/538.cs2 b/dumps/scripts/538.cs2 new file mode 100644 index 000000000..b2f198367 --- /dev/null +++ b/dumps/scripts/538.cs2 @@ -0,0 +1,5 @@ +void script_538(int arg0,int arg1,int arg2) { + setScriptCallOnItemContainerUpdate(2348, new WidgetPointer(arg0), arg1, arg2, 93, 1, "IoiY", new WidgetPointer(arg0)); + script_2349(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/539.cs2 b/dumps/scripts/539.cs2 new file mode 100644 index 000000000..3ee46098d --- /dev/null +++ b/dumps/scripts/539.cs2 @@ -0,0 +1,5 @@ +void script_539(int arg0,int arg1) { + setScriptCallOnItemContainerUpdate(2350, new WidgetPointer(arg0), arg1, 93, 1, "IoY", new WidgetPointer(arg0)); + script_2351(arg0, arg1); + return; +} diff --git a/dumps/scripts/54.cs2 b/dumps/scripts/54.cs2 new file mode 100644 index 000000000..62b8c6a3e --- /dev/null +++ b/dumps/scripts/54.cs2 @@ -0,0 +1,14 @@ +void script_54(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = extractY(getMyPositionHash()); + ivar2 = add(divide(subtract(ivar1, 9920), 8), 1); + ivar3 = add(divide(subtract(ivar1, 3520), 8), 1); + if (ivar1 > 6400) { + setWidgetText(new WidgetPointer(arg0), "Level: " + intToStr(ivar2)); + } else { + setWidgetText(new WidgetPointer(arg0), "Level: " + intToStr(ivar3)); + } + return; +} diff --git a/dumps/scripts/540.cs2 b/dumps/scripts/540.cs2 new file mode 100644 index 000000000..0da53d93b --- /dev/null +++ b/dumps/scripts/540.cs2 @@ -0,0 +1,8 @@ +void script_540(int arg0,int arg1) { + if ((getSkillCurrentLvl(6) >= arg1) || (((boolean)bitconfig_4089) && (standart_config_1092 >= arg1))) { + setWidgetRGB(new Color(0, 204, 0), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/541.cs2 b/dumps/scripts/541.cs2 new file mode 100644 index 000000000..fc9a3c2b7 --- /dev/null +++ b/dumps/scripts/541.cs2 @@ -0,0 +1,8 @@ +void script_541(int arg0,int arg1) { + if ((getSkillCurrentLvl(12) >= arg1) || (((boolean)bitconfig_4089) && (standart_config_1093 >= arg1))) { + setWidgetRGB(new Color(0, 204, 0), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 152, 31), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/542.cs2 b/dumps/scripts/542.cs2 new file mode 100644 index 000000000..05792afa9 --- /dev/null +++ b/dumps/scripts/542.cs2 @@ -0,0 +1,8 @@ +void script_542(int arg0,int arg1) { + if ((getSkillCurrentLvl(12) >= arg1) || (((boolean)bitconfig_4089) && (standart_config_1093 >= arg1))) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + } else { + setWidgetIsHidden(true, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/543.cs2 b/dumps/scripts/543.cs2 new file mode 100644 index 000000000..8263938e1 --- /dev/null +++ b/dumps/scripts/543.cs2 @@ -0,0 +1,6 @@ +int script_543(int arg0) { + if (((boolean)arg0)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/544.cs2 b/dumps/scripts/544.cs2 new file mode 100644 index 000000000..8aa8b2c19 --- /dev/null +++ b/dumps/scripts/544.cs2 @@ -0,0 +1,6 @@ +void script_544(int arg0) { + int ivar1; + ivar1 = script_2761(); + setWidgetText(new WidgetPointer(arg0), "Total level: " + intToStr(ivar1)); + return; +} diff --git a/dumps/scripts/545.cs2 b/dumps/scripts/545.cs2 new file mode 100644 index 000000000..930e38f9b --- /dev/null +++ b/dumps/scripts/545.cs2 @@ -0,0 +1,5 @@ +void script_545(int arg0,int arg1,int arg2) { + globalint_80 = getSkillActualLvl(arg1); + script_547(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/546.cs2 b/dumps/scripts/546.cs2 new file mode 100644 index 000000000..f058aef43 --- /dev/null +++ b/dumps/scripts/546.cs2 @@ -0,0 +1,5 @@ +void script_546(int arg0) { + globalint_80 = 0; + deleteAllExtraChilds(new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/547.cs2 b/dumps/scripts/547.cs2 new file mode 100644 index 000000000..2f8a91740 --- /dev/null +++ b/dumps/scripts/547.cs2 @@ -0,0 +1,328 @@ +void script_547(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + int stack_dump0; + cs2func_script_4037_struct(3,0,0) structdump_1; + svar0 = ""; + svar1 = ""; + ivar3 = 2; + if ((getSkillActualLvl(arg1) < 99) || ((arg1 == 24) && (getSkillActualLvl(arg1) < 120))) { + svar0 = script_46(cs2method_3408(105, 105, 716, add(getSkillActualLvl(arg1), 1)), ","); + svar1 = script_46(subtract(cs2method_3408(105, 105, 716, add(getSkillActualLvl(arg1), 1)), getSkillXp(arg1)), ","); + ivar3 = 4; + } + ivar4 = script_4036(cs2method_3408(83, 105, 1482, arg1)); + if (((boolean)ivar4)) { + ivar3 = add(ivar3, 3); + } + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + stack_dump0 = cs2method_3408(83, 105, 1482, arg1); + structdump_1 = script_4037(stack_dump0); + ivar6 = structdump_1.intpart_2; + ivar5 = structdump_1.intpart_1; + ivar7 = structdump_1.intpart_0; + svar2 = script_46(ivar5, ","); + svar3 = cs2method_3408(83, 115, 680, arg1) + ": " + intToStr(getSkillCurrentLvl(arg1)) + "/" + intToStr(getSkillActualLvl(arg1)); + svar4 = script_46(getSkillXp(arg1), ","); + ivar8 = ivar5; + if (((boolean)ivar7)) { + ivar8 = cs2method_3408(105, 105, 716, ivar5); + } + ivar9 = max(0, subtract(ivar8, getSkillXp(arg1))); + svar5 = script_46(ivar9, ","); + if ((((boolean)getSkillActualLvl(arg1)) && (cs2method_3408(83, 83, 744, arg1) == -1)) && isSiteSettingsMembers()) { + ivar3 = 1; + svar3 = "Members' Skill"; + } + ivar10 = add(getMaxLineWidth(190, 495, svar3), 10); + ivar11 = getMaxLineWidth(190, 495, "Current Xp:"); + ivar12 = getMaxLineWidth(190, 495, svar4); + ivar13 = add(add(ivar11, 10), ivar12); + ivar14 = 0; + ivar15 = 0; + ivar10 = max(ivar10, ivar13); + if ((getSkillActualLvl(arg1) < 99) || ((arg1 == 24) && (getSkillActualLvl(arg1) < 120))) { + ivar11 = getMaxLineWidth(190, 495, "Next level:"); + ivar12 = getMaxLineWidth(190, 495, svar0); + ivar13 = add(add(ivar11, 3), ivar12); + } else { + ivar13 = 0; + } + ivar10 = max(ivar10, ivar13); + if ((getSkillActualLvl(arg1) < 99) || ((arg1 == 24) && (getSkillActualLvl(arg1) < 120))) { + ivar11 = getMaxLineWidth(190, 495, "Remainder:"); + ivar12 = getMaxLineWidth(190, 495, svar1); + ivar13 = add(add(ivar11, 3), ivar12); + } else { + ivar13 = 0; + } + ivar10 = max(ivar10, ivar13); + if (((boolean)ivar4)) { + if (((boolean)ivar7)) { + ivar11 = getMaxLineWidth(190, 495, "Target lvl:"); + ivar12 = getMaxLineWidth(190, 495, svar2); + } else { + ivar11 = getMaxLineWidth(190, 495, "Target xp:"); + ivar12 = getMaxLineWidth(190, 495, svar2); + } + ivar13 = add(add(ivar11, 3), ivar12); + } else { + ivar13 = 0; + } + ivar10 = max(ivar10, ivar13); + if (((boolean)ivar4)) { + ivar11 = getMaxLineWidth(190, 495, "Remainder:"); + ivar12 = getMaxLineWidth(190, 495, svar5); + ivar13 = add(add(ivar11, 3), ivar12); + } else { + ivar13 = 0; + } + ivar10 = max(ivar10, ivar13); + ivar11 = add(script_3365(arg0), 40); + ivar12 = add(script_3366(arg0), 50); + if (add(add(ivar11, ivar10), 4) > 190) { + ivar11 = subtract(190, add(ivar10, 4)); + } + if (add(add(ivar12, multiply(ivar3, 14)), 4) > getWidgetActualHeight(new WidgetPointer(arg2))) { + ivar12 = subtract(script_3366(arg0), add(multiply(ivar3, 14), 4)); + } + if ((((boolean)getSkillActualLvl(arg1)) && (cs2method_3408(83, 83, 744, arg1) == -1)) && isSiteSettingsMembers()) { + createExtraChild(new WidgetPointer(arg2), 3, 0); + setWidgetSize(add(ivar10, 4), add(4, multiply(ivar3, 14)), 0, 0); + setWidgetPosition(ivar11, ivar12, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 160)); + createExtraChild(new WidgetPointer(arg2), 3, 1); + setWidgetSize(add(ivar10, 4), add(4, multiply(ivar3, 14)), 0, 0); + setWidgetPosition(ivar11, ivar12, 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg2), 4, 2); + setWidgetPosition(add(ivar11, 2), add(ivar12, 2), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText(svar3); + return; + } + ivar16 = 0; + ivar17 = 2; + ivar18 = 0; + ivar19 = 0; + ivar20 = 0; + ivar21 = 0; + ivar22 = 0; + createExtraChild(new WidgetPointer(arg2), 3, ivar16); + ivar23 = add(4, multiply(ivar3, 14)); + if (((boolean)ivar4)) { + ivar23 = add(ivar23, 6); + } + setWidgetSize(add(ivar10, 4), ivar23, 0, 0); + setWidgetPosition(ivar11, ivar12, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 160)); + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg2), 3, ivar16); + setWidgetSize(add(ivar10, 4), ivar23, 0, 0); + setWidgetPosition(ivar11, ivar12, 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + ivar18 = ivar16; + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText(svar3); + ivar16 = add(ivar16, 1); + ivar17 = add(ivar17, 14); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText("Current Xp:"); + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + ivar19 = ivar16; + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(2, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText(svar4); + ivar16 = add(ivar16, 1); + ivar17 = add(ivar17, 14); + ivar24 = 0; + ivar25 = 0; + if ((getSkillActualLvl(arg1) < 99) || ((arg1 == 24) && (getSkillActualLvl(arg1) < 120))) { + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText("Next level:"); + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(2, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText(svar0); + ivar16 = add(ivar16, 1); + ivar17 = add(ivar17, 14); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText("Remainder:"); + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + ivar20 = ivar16; + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(2, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText(svar1); + ivar16 = add(ivar16, 1); + ivar17 = add(ivar17, 14); + } + ivar26 = 0; + if (((boolean)ivar4)) { + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(false); + if (((boolean)ivar7)) { + setWidgetText("Target lvl:"); + } else { + setWidgetText("Target XP:"); + } + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(2, 0, 0); + setWidgetUnknownBoolean(false); + if (((boolean)ivar7)) { + setWidgetText(svar2); + } else { + setWidgetText(svar2); + } + ivar16 = add(ivar16, 1); + ivar17 = add(ivar17, 14); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText("Remainder:"); + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + setWidgetPosition(add(ivar11, 2), add(ivar12, ivar17), 0, 0); + setWidgetSize(ivar10, 16, 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(2, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetText(svar5); + ivar21 = ivar16; + ivar16 = add(ivar16, 1); + ivar17 = add(ivar17, 17); + createExtraChild(new WidgetPointer(arg2), 3, ivar16); + setWidgetPosition(add(ivar11, 4), add(ivar12, ivar17), 0, 0); + setWidgetSize(subtract(ivar10, 4), 16, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 0, 0)); + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg2), 3, ivar16); + ivar26 = ivar16; + setWidgetPosition(add(ivar11, 4), add(ivar12, ivar17), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 255, 0)); + ivar16 = add(ivar16, 1); + if (((boolean)ivar7)) { + ivar24 = cs2method_3408(105, 105, 716, ivar6); + ivar25 = cs2method_3408(105, 105, 716, ivar5); + if (subtract(ivar25, ivar24) != 0) { + ivar14 = multiplyDivide(subtract(getSkillXp(arg1), ivar24), subtract(ivar25, ivar24), 100); + } else { + ivar14 = -1; + } + } else if (subtract(ivar5, ivar6) != 0) { + ivar14 = multiplyDivide(subtract(getSkillXp(arg1), ivar6), subtract(ivar5, ivar6), 100); + } else { + ivar14 = -1; + } + if (ivar14 > 100) { + ivar14 = 100; + } + ivar14 = max(ivar14, 0); + ivar15 = multiply(ivar14, add(4, ivar10)); + ivar15 = divide(ivar15, 100); + setWidgetSize(ivar15, 16, 0, 0); + createExtraChild(new WidgetPointer(arg2), 3, ivar16); + setWidgetPosition(add(ivar11, 4), add(ivar12, ivar17), 0, 0); + setWidgetSize(subtract(ivar10, 4), 16, 0, 0); + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg2), 4, ivar16); + setWidgetSize(getTextWidth(495, intToStr(ivar14) + "%"), 16, 0, 0); + setWidgetPosition(add(subtract(add(ivar11, divide(ivar10, 2)), divide(getWidgetActualWidth(), 2)), 2), add(add(ivar12, ivar17), 1), 0, 0); + setWidgetFont(495); + setWidgetTextAlignment(1, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetRGB(new Color(255, 255, 255)); + if (ivar14 > 47) { + setWidgetRGB(new Color(0, 0, 0)); + } + setWidgetText(intToStr(ivar14) + "%"); + ivar22 = ivar16; + ivar16 = add(ivar16, 1); + } + if (setWidgetRegister(new WidgetPointer(arg2), 0)) { + setScriptCallOnSkillChange(548, ivar18, ivar19, ivar20, ivar21, ivar22, ivar26, ivar10, arg1, new WidgetPointer(arg0), new WidgetPointer(arg2), arg1, 1, "iiiiiiiSIIY"); + } + return; +} diff --git a/dumps/scripts/548.cs2 b/dumps/scripts/548.cs2 new file mode 100644 index 000000000..4adee9735 --- /dev/null +++ b/dumps/scripts/548.cs2 @@ -0,0 +1,87 @@ +void script_548(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9) { + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + string svar0; + string svar1; + int stack_dump0; + cs2func_script_4037_struct(3,0,0) structdump_1; + if (((boolean)globalint_80)) { + return; + } + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + svar0 = ""; + svar1 = cs2method_3408(83, 115, 680, arg7) + ": " + intToStr(getSkillCurrentLvl(arg7)) + "/" + intToStr(getSkillActualLvl(arg7)); + if ((setWidgetRegister(new WidgetPointer(arg9), arg0) && (getMaxLineWidth(190, 495, svar1) < getWidgetActualWidth())) && (globalint_80 == getSkillActualLvl(arg7))) { + setWidgetText(svar1); + if (setWidgetRegister(new WidgetPointer(arg9), arg1)) { + setWidgetText(script_46(getSkillXp(arg7), ",")); + } + if ((getSkillActualLvl(arg7) < 99) && setWidgetRegister(new WidgetPointer(arg9), arg2)) { + setWidgetText(script_46(subtract(cs2method_3408(105, 105, 716, add(getSkillActualLvl(arg7), 1)), getSkillXp(arg7)), ",")); + } + if (((boolean)script_4036(cs2method_3408(83, 105, 1482, arg7)))) { + stack_dump0 = cs2method_3408(83, 105, 1482, arg7); + structdump_1 = script_4037(stack_dump0); + ivar11 = structdump_1.intpart_2; + ivar10 = structdump_1.intpart_1; + ivar12 = structdump_1.intpart_0; + ivar17 = ivar10; + if (((boolean)ivar12)) { + ivar17 = cs2method_3408(105, 105, 716, ivar10); + } + ivar18 = max(0, subtract(ivar17, getSkillXp(arg7))); + svar0 = script_46(ivar18, ","); + if (setWidgetRegister(new WidgetPointer(arg9), arg5)) { + if (((boolean)ivar12)) { + ivar15 = cs2method_3408(105, 105, 716, ivar11); + ivar16 = cs2method_3408(105, 105, 716, ivar10); + if (subtract(ivar16, ivar15) != 0) { + ivar13 = multiplyDivide(subtract(getSkillXp(arg7), ivar15), subtract(ivar16, ivar15), 100); + } else { + ivar13 = -1; + } + } else if (subtract(ivar10, ivar11) != 0) { + ivar13 = multiplyDivide(subtract(getSkillXp(arg7), ivar11), subtract(ivar10, ivar11), 100); + } else { + ivar13 = -1; + } + if (ivar13 > 100) { + ivar13 = 100; + } + ivar13 = max(ivar13, 0); + ivar14 = multiply(ivar13, subtract(arg6, 4)); + ivar14 = divide(ivar14, 100); + setWidgetSize(ivar14, 16, 0, 0); + if (setWidgetRegister(new WidgetPointer(arg9), arg4)) { + if (ivar13 > 47) { + setWidgetRGB(new Color(0, 0, 0)); + } + setWidgetText(intToStr(ivar13) + "%"); + } + if (setWidgetRegister(new WidgetPointer(arg9), arg3)) { + setWidgetText(svar0); + } + } + } + return; + } + deleteAllExtraChilds(new WidgetPointer(arg9)); + globalint_80 = getSkillActualLvl(arg7); + script_547(arg8, arg7, arg9); + return; +} diff --git a/dumps/scripts/549.cs2 b/dumps/scripts/549.cs2 new file mode 100644 index 000000000..9bd9b1717 --- /dev/null +++ b/dumps/scripts/549.cs2 @@ -0,0 +1,13 @@ +void script_549() { + int ivar0; + if (bitconfig_4109 == 15) { + playSoundEffect(4020, 1, 0); + return; + } + bitconfig_4109 = add(bitconfig_4109, 1); + ivar0 = multiply(subtract(15, bitconfig_4109), 6); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(624,15)); + setWidgetText(new WidgetPointer(624,70), intToStr(bitconfig_4109)); + playSoundEffect(4026, 1, 0); + return; +} diff --git a/dumps/scripts/55.cs2 b/dumps/scripts/55.cs2 new file mode 100644 index 000000000..2e241bcf5 --- /dev/null +++ b/dumps/scripts/55.cs2 @@ -0,0 +1,15 @@ +int script_55() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, bitconfig_3566); + ivar0 = add(ivar0, bitconfig_3567); + ivar0 = add(ivar0, bitconfig_3568); + ivar0 = add(ivar0, bitconfig_3569); + ivar0 = add(ivar0, bitconfig_3570); + ivar0 = add(ivar0, bitconfig_3571); + ivar0 = add(ivar0, bitconfig_3572); + ivar0 = add(ivar0, bitconfig_3573); + ivar0 = add(ivar0, bitconfig_3574); + ivar0 = add(ivar0, bitconfig_3575); + return ivar0; +} diff --git a/dumps/scripts/550.cs2 b/dumps/scripts/550.cs2 new file mode 100644 index 000000000..194f1d4d3 --- /dev/null +++ b/dumps/scripts/550.cs2 @@ -0,0 +1,13 @@ +void script_550() { + int ivar0; + if (((boolean)bitconfig_4109)) { + playSoundEffect(4020, 1, 0); + return; + } + bitconfig_4109 = subtract(bitconfig_4109, 1); + ivar0 = multiply(subtract(15, bitconfig_4109), 6); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(624,15)); + setWidgetText(new WidgetPointer(624,70), intToStr(bitconfig_4109)); + playSoundEffect(4026, 1, 0); + return; +} diff --git a/dumps/scripts/551.cs2 b/dumps/scripts/551.cs2 new file mode 100644 index 000000000..c1aaffa37 --- /dev/null +++ b/dumps/scripts/551.cs2 @@ -0,0 +1,13 @@ +void script_551() { + int ivar0; + if (bitconfig_4110 == 15) { + playSoundEffect(4020, 1, 0); + return; + } + bitconfig_4110 = add(bitconfig_4110, 1); + ivar0 = multiply(subtract(15, bitconfig_4110), 6); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(624,17)); + setWidgetText(new WidgetPointer(624,71), intToStr(bitconfig_4110)); + playSoundEffect(4026, 1, 0); + return; +} diff --git a/dumps/scripts/552.cs2 b/dumps/scripts/552.cs2 new file mode 100644 index 000000000..328bfeb50 --- /dev/null +++ b/dumps/scripts/552.cs2 @@ -0,0 +1,13 @@ +void script_552() { + int ivar0; + if (((boolean)bitconfig_4110)) { + playSoundEffect(4020, 1, 0); + return; + } + bitconfig_4110 = subtract(bitconfig_4110, 1); + ivar0 = multiply(subtract(15, bitconfig_4110), 6); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(624,17)); + setWidgetText(new WidgetPointer(624,71), intToStr(bitconfig_4110)); + playSoundEffect(4026, 1, 0); + return; +} diff --git a/dumps/scripts/553.cs2 b/dumps/scripts/553.cs2 new file mode 100644 index 000000000..2e98af5bc --- /dev/null +++ b/dumps/scripts/553.cs2 @@ -0,0 +1,13 @@ +void script_553() { + int ivar0; + if (bitconfig_4111 == 15) { + playSoundEffect(4020, 1, 0); + return; + } + bitconfig_4111 = add(bitconfig_4111, 1); + ivar0 = multiply(subtract(15, bitconfig_4111), 6); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(624,19)); + setWidgetText(new WidgetPointer(624,72), intToStr(bitconfig_4111)); + playSoundEffect(4026, 1, 0); + return; +} diff --git a/dumps/scripts/554.cs2 b/dumps/scripts/554.cs2 new file mode 100644 index 000000000..5e8934b24 --- /dev/null +++ b/dumps/scripts/554.cs2 @@ -0,0 +1,13 @@ +void script_554() { + int ivar0; + if (((boolean)bitconfig_4111)) { + playSoundEffect(4020, 1, 0); + return; + } + bitconfig_4111 = subtract(bitconfig_4111, 1); + ivar0 = multiply(subtract(15, bitconfig_4111), 6); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(624,19)); + setWidgetText(new WidgetPointer(624,72), intToStr(bitconfig_4111)); + playSoundEffect(4026, 1, 0); + return; +} diff --git a/dumps/scripts/555.cs2 b/dumps/scripts/555.cs2 new file mode 100644 index 000000000..7f7399254 --- /dev/null +++ b/dumps/scripts/555.cs2 @@ -0,0 +1,13 @@ +void script_555() { + int ivar0; + ivar0 = multiply(subtract(15, bitconfig_4109), 6); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(624,15)); + setWidgetText(new WidgetPointer(624,70), intToStr(bitconfig_4109)); + ivar0 = multiply(subtract(15, bitconfig_4110), 6); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(624,17)); + setWidgetText(new WidgetPointer(624,71), intToStr(bitconfig_4110)); + ivar0 = multiply(subtract(15, bitconfig_4111), 6); + setWidgetPosition(0, ivar0, 0, 0, new WidgetPointer(624,19)); + setWidgetText(new WidgetPointer(624,72), intToStr(bitconfig_4111)); + return; +} diff --git a/dumps/scripts/556.cs2 b/dumps/scripts/556.cs2 new file mode 100644 index 000000000..760ba0637 --- /dev/null +++ b/dumps/scripts/556.cs2 @@ -0,0 +1,4 @@ +void script_556(int arg0) { + script_558(arg0); + return; +} diff --git a/dumps/scripts/557.cs2 b/dumps/scripts/557.cs2 new file mode 100644 index 000000000..c7efae2f9 --- /dev/null +++ b/dumps/scripts/557.cs2 @@ -0,0 +1,4 @@ +void script_557() { + script_558(bitconfig_4122); + return; +} diff --git a/dumps/scripts/558.cs2 b/dumps/scripts/558.cs2 new file mode 100644 index 000000000..034f8b1d3 --- /dev/null +++ b/dumps/scripts/558.cs2 @@ -0,0 +1,39 @@ +void script_558(int arg0) { + if (((boolean)arg0)) { + setWidgetSprite(181, new WidgetPointer(625,69)); + setWidgetModel(29248, new WidgetPointer(625,39)); + } else { + setWidgetSprite(180, new WidgetPointer(625,69)); + } + if (arg0 == 2) { + setWidgetSprite(181, new WidgetPointer(625,72)); + setWidgetModel(29242, new WidgetPointer(625,39)); + } else { + setWidgetSprite(180, new WidgetPointer(625,72)); + } + if (arg0 == 3) { + setWidgetSprite(181, new WidgetPointer(625,75)); + setWidgetModel(29237, new WidgetPointer(625,39)); + } else { + setWidgetSprite(180, new WidgetPointer(625,75)); + } + if (arg0 == 4) { + setWidgetSprite(181, new WidgetPointer(625,78)); + setWidgetModel(29245, new WidgetPointer(625,39)); + } else { + setWidgetSprite(180, new WidgetPointer(625,78)); + } + if (arg0 == 5) { + setWidgetSprite(181, new WidgetPointer(625,81)); + setWidgetModel(29246, new WidgetPointer(625,39)); + } else { + setWidgetSprite(180, new WidgetPointer(625,81)); + } + if (arg0 == 6) { + setWidgetSprite(181, new WidgetPointer(625,84)); + setWidgetModel(29241, new WidgetPointer(625,39)); + } else { + setWidgetSprite(180, new WidgetPointer(625,84)); + } + return; +} diff --git a/dumps/scripts/559.cs2 b/dumps/scripts/559.cs2 new file mode 100644 index 000000000..48322d0e8 --- /dev/null +++ b/dumps/scripts/559.cs2 @@ -0,0 +1,17 @@ +void script_559(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 2); + ivar4 = subtract(ivar2, 2); + ivar5 = getExtraChildGap(new WidgetPointer(arg0)); + script_98(arg0, ivar5, 1076, 0, 0, ivar1, 2); + script_98(arg0, add(ivar5, 1), 1076, 1, ivar4, subtract(ivar1, 1), 2); + script_98(arg0, add(ivar5, 2), 1077, 0, 1, 2, subtract(ivar2, 3)); + script_98(arg0, add(ivar5, 3), 1077, ivar3, 1, 2, subtract(ivar2, 2)); + return; +} diff --git a/dumps/scripts/56.cs2 b/dumps/scripts/56.cs2 new file mode 100644 index 000000000..3743526c4 --- /dev/null +++ b/dumps/scripts/56.cs2 @@ -0,0 +1,35 @@ +void script_56(int arg0) { + int ivar1; + deleteAllExtraChilds(new WidgetPointer(18,13)); + script_4534(1179661); + deleteAllExtraChilds(new WidgetPointer(18,21)); + script_4534(1179669); + deleteAllExtraChilds(new WidgetPointer(18,29)); + createExtraChild(new WidgetPointer(18,29), 5, getExtraChildGap(new WidgetPointer(18,29))); + setWidgetSize(40, 0, 1, 1); + setWidgetPosition(0, 0, 1, 0); + cs2method1107(1); + createExtraChild(new WidgetPointer(18,29), 5, getExtraChildGap(new WidgetPointer(18,29))); + setWidgetSize(20, 0, 0, 1); + setWidgetPosition(0, 0, 0, 1); + createExtraChild(new WidgetPointer(18,29), 5, getExtraChildGap(new WidgetPointer(18,29))); + setWidgetSize(20, 0, 0, 1); + setWidgetPosition(0, 0, 2, 1); + createExtraChild(new WidgetPointer(18,29), 4, getExtraChildGap(new WidgetPointer(18,29))); + setWidgetSize(26, 0, 1, 1); + setWidgetPosition(4, 0, 0, 1); + setWidgetFont(494); + setWidgetRGB(new Color(40, 37, 33)); + setWidgetTextAlignment(1, 1, 0); + ivar1 = getWidgetCustomChildArrayIndex(); + setScriptCallOnConfigChange(58, ivar1, 1747, 1737, 105, 496, 1050, 1600, 6, "iY", new WidgetPointer(arg0)); + setScriptCallOnItemContainerUpdate(58, ivar1, 93, 94, 2, "iY", new WidgetPointer(arg0)); + script_59(ivar1); + setWidgetPosition(script_3365(1179675), subtract(add(script_3366(1179675), getWidgetActualHeight(new WidgetPointer(18,27))), 1), 0, 0, new WidgetPointer(18,43)); + deleteAllExtraChilds(new WidgetPointer(18,43)); + script_4535(1179691); + script_746(0); + setScriptCallOnMousePressed(745, 1, "1", new WidgetPointer(18,29)); + setScriptCallOnMousePressed(745, 0, "1", new WidgetPointer(18,42)); + return; +} diff --git a/dumps/scripts/560.cs2 b/dumps/scripts/560.cs2 new file mode 100644 index 000000000..53819346b --- /dev/null +++ b/dumps/scripts/560.cs2 @@ -0,0 +1,5 @@ +void script_560(int arg0) { + setWidgetIsHidden(false, new WidgetPointer(825,68)); + setWidgetModel(arg0, new WidgetPointer(825,68)); + return; +} diff --git a/dumps/scripts/561.cs2 b/dumps/scripts/561.cs2 new file mode 100644 index 000000000..85c04666f --- /dev/null +++ b/dumps/scripts/561.cs2 @@ -0,0 +1,13 @@ +void script_561() { + if (((boolean)bitconfig_4157)) { + setWidgetSprite(1135, new WidgetPointer(640,22)); + } else { + setWidgetSprite(1134, new WidgetPointer(640,22)); + } + if (bitconfig_4157 == 2) { + setWidgetSprite(1135, new WidgetPointer(640,21)); + } else { + setWidgetSprite(1134, new WidgetPointer(640,21)); + } + return; +} diff --git a/dumps/scripts/562.cs2 b/dumps/scripts/562.cs2 new file mode 100644 index 000000000..95af699b7 --- /dev/null +++ b/dumps/scripts/562.cs2 @@ -0,0 +1,6 @@ +void script_562(int arg0) { + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 5455) { + setWidgetSprite(5456, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/563.cs2 b/dumps/scripts/563.cs2 new file mode 100644 index 000000000..b49fb73a8 --- /dev/null +++ b/dumps/scripts/563.cs2 @@ -0,0 +1,90 @@ +void script_563() { + int ivar0; + int ivar1; + ivar0 = 50; + ivar1 = 45; + setWidgetText(new WidgetPointer(641,4), intToStr(bitconfig_4143)); + if (((boolean)bitconfig_4144)) { + setWidgetSprite(223, new WidgetPointer(641,27)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,27)); + setWidgetIsHidden(false, new WidgetPointer(641,12)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,12)); + } + if (((boolean)bitconfig_4145)) { + setWidgetSprite(225, new WidgetPointer(641,28)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,28)); + setWidgetIsHidden(false, new WidgetPointer(641,13)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,13)); + } + if (((boolean)bitconfig_4146)) { + setWidgetSprite(201, new WidgetPointer(641,29)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,29)); + setWidgetIsHidden(false, new WidgetPointer(641,14)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,14)); + } + if (((boolean)bitconfig_4147)) { + setWidgetSprite(226, new WidgetPointer(641,30)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,30)); + setWidgetIsHidden(false, new WidgetPointer(641,15)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,15)); + } + if (((boolean)bitconfig_4151)) { + setWidgetSprite(203, new WidgetPointer(641,32)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,32)); + setWidgetIsHidden(false, new WidgetPointer(641,17)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,17)); + } + if (((boolean)bitconfig_4152)) { + setWidgetSprite(227, new WidgetPointer(641,33)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,33)); + setWidgetIsHidden(false, new WidgetPointer(641,18)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,18)); + } + if (((boolean)bitconfig_4276)) { + setWidgetSprite(222, new WidgetPointer(641,31)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,31)); + setWidgetIsHidden(false, new WidgetPointer(641,16)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,16)); + } + ivar0 = 8; + ivar1 = 45; + if (((boolean)bitconfig_4148)) { + setWidgetSprite(200, new WidgetPointer(641,34)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,34)); + setWidgetIsHidden(false, new WidgetPointer(641,19)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,19)); + } + if (((boolean)bitconfig_4149)) { + setWidgetSprite(197, new WidgetPointer(641,35)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,35)); + setWidgetIsHidden(false, new WidgetPointer(641,20)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,20)); + } + if (((boolean)bitconfig_4150)) { + setWidgetSprite(202, new WidgetPointer(641,36)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(641,36)); + setWidgetIsHidden(false, new WidgetPointer(641,21)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(641,21)); + } + return; +} diff --git a/dumps/scripts/564.cs2 b/dumps/scripts/564.cs2 new file mode 100644 index 000000000..333509853 --- /dev/null +++ b/dumps/scripts/564.cs2 @@ -0,0 +1,11 @@ +void script_564() { + if (globalint_1037 > subtract(getWidgetActualHeight(new WidgetPointer(746,3)), 117)) { + script_1652(1); + } else { + script_1650(); + } + cs2method2301(48889930, -1, new WidgetPointer(746,75)); + setScriptCallOnMouseDragged(1649, -2147483646, 0, "i1", new WidgetPointer(746,75)); + setScriptCallOnMouseDragReleased(1649, -2147483646, 1, "i1", new WidgetPointer(746,75)); + return; +} diff --git a/dumps/scripts/565.cs2 b/dumps/scripts/565.cs2 new file mode 100644 index 000000000..cb1f7db2a --- /dev/null +++ b/dumps/scripts/565.cs2 @@ -0,0 +1,112 @@ +void script_565() { + int ivar0; + int ivar1; + string svar0; + ivar0 = 50; + ivar1 = 45; + svar0 = script_20(bitconfig_4138); + if (bitconfig_4140 > 0) { + setWidgetIsHidden(false, new WidgetPointer(635,33)); + setWidgetText(new WidgetPointer(635,35), intToStr(bitconfig_4140)); + setWidgetText(new WidgetPointer(635,32), intToStr(bitconfig_4143)); + setWidgetText(new WidgetPointer(635,30), svar0 + " Coins"); + if (((boolean)bitconfig_4144)) { + setWidgetSprite(223, new WidgetPointer(635,15)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,15)); + setWidgetIsHidden(false, new WidgetPointer(635,2)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,2)); + } + if (((boolean)bitconfig_4145)) { + setWidgetSprite(225, new WidgetPointer(635,16)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,16)); + setWidgetIsHidden(false, new WidgetPointer(635,3)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,3)); + } + if (((boolean)bitconfig_4146)) { + setWidgetSprite(201, new WidgetPointer(635,17)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,17)); + setWidgetIsHidden(false, new WidgetPointer(635,4)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,4)); + } + if (((boolean)bitconfig_4147)) { + setWidgetSprite(226, new WidgetPointer(635,18)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,18)); + setWidgetIsHidden(false, new WidgetPointer(635,5)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,5)); + } + if (((boolean)bitconfig_4151)) { + setWidgetSprite(203, new WidgetPointer(635,20)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,20)); + setWidgetIsHidden(false, new WidgetPointer(635,7)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,7)); + } + if (((boolean)bitconfig_4152)) { + setWidgetSprite(227, new WidgetPointer(635,21)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,21)); + setWidgetIsHidden(false, new WidgetPointer(635,8)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,8)); + } + if (((boolean)bitconfig_4276)) { + setWidgetSprite(222, new WidgetPointer(635,19)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,19)); + setWidgetIsHidden(false, new WidgetPointer(635,6)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,6)); + } + ivar0 = 8; + ivar1 = 45; + if (((boolean)bitconfig_4148)) { + setWidgetSprite(200, new WidgetPointer(635,22)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,22)); + setWidgetIsHidden(false, new WidgetPointer(635,9)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,9)); + } + if (((boolean)bitconfig_4149)) { + setWidgetSprite(197, new WidgetPointer(635,23)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,23)); + setWidgetIsHidden(false, new WidgetPointer(635,10)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,10)); + } + if (((boolean)bitconfig_4150)) { + setWidgetSprite(202, new WidgetPointer(635,24)); + setWidgetPosition(ivar0, ivar1, 0, 0, new WidgetPointer(635,24)); + setWidgetIsHidden(false, new WidgetPointer(635,11)); + ivar1 = add(ivar1, 29); + } else { + setWidgetIsHidden(true, new WidgetPointer(635,11)); + } + } else { + setWidgetSprite(-1, new WidgetPointer(635,15)); + setWidgetSprite(-1, new WidgetPointer(635,16)); + setWidgetSprite(-1, new WidgetPointer(635,17)); + setWidgetSprite(-1, new WidgetPointer(635,18)); + setWidgetSprite(-1, new WidgetPointer(635,20)); + setWidgetSprite(-1, new WidgetPointer(635,21)); + setWidgetSprite(-1, new WidgetPointer(635,22)); + setWidgetSprite(-1, new WidgetPointer(635,24)); + setWidgetSprite(-1, new WidgetPointer(635,23)); + setWidgetSprite(-1, new WidgetPointer(635,19)); + setWidgetText(new WidgetPointer(635,32), " "); + setWidgetText(new WidgetPointer(635,30), " "); + setWidgetText(new WidgetPointer(635,26), " "); + setWidgetIsHidden(true, new WidgetPointer(635,33)); + } + return; +} diff --git a/dumps/scripts/566.cs2 b/dumps/scripts/566.cs2 new file mode 100644 index 000000000..b39dfda93 --- /dev/null +++ b/dumps/scripts/566.cs2 @@ -0,0 +1,6 @@ +void script_566(int arg0) { + if (getWidgetSpriteId(new WidgetPointer(arg0)) == 5456) { + setWidgetSprite(5455, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/567.cs2 b/dumps/scripts/567.cs2 new file mode 100644 index 000000000..132171974 --- /dev/null +++ b/dumps/scripts/567.cs2 @@ -0,0 +1,172 @@ +void script_567(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + if (arg0 == 70254793) { + switch (bitconfig_8876) { + case 0: + ivar1 = 1; + break; + case 1: + ivar1 = 9; + break; + case 2: + ivar1 = 12; + break; + case 3: + ivar1 = 75; + } + ivar3 = multiply(ivar1, bitconfig_8877); + if (subtract(bitconfig_8857, ivar3) > 0) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(1072,53)); + ivar3 = subtract(bitconfig_8857, ivar3); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1072,53)); + ivar3 = 0; + } + } else if (arg0 == 70254805) { + switch (bitconfig_8876) { + case 0: + ivar1 = 1; + ivar2 = 2; + break; + case 1: + ivar1 = 4; + ivar2 = 7; + break; + case 2: + ivar1 = 9; + ivar2 = 17; + break; + case 3: + ivar1 = 40; + ivar2 = 80; + } + ivar3 = multiply(ivar1, bitconfig_8877); + if (subtract(bitconfig_8857, ivar3) > 0) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(1072,53)); + ivar3 = subtract(bitconfig_8857, ivar3); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1072,53)); + ivar3 = 0; + } + ivar4 = multiply(ivar2, bitconfig_8877); + if (subtract(bitconfig_8865, ivar4) > 0) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(1072,49)); + ivar4 = subtract(bitconfig_8865, ivar4); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1072,49)); + ivar4 = 0; + } + } else if (arg0 == 70254817) { + switch (bitconfig_8876) { + case 0: + ivar1 = 1; + ivar2 = 4; + break; + case 1: + ivar1 = 3; + ivar2 = 12; + break; + case 2: + ivar1 = 6; + ivar2 = 24; + break; + case 3: + ivar1 = 30; + ivar2 = 120; + } + ivar3 = multiply(ivar1, bitconfig_8877); + if (subtract(bitconfig_8859, ivar3) > 0) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(1072,57)); + ivar3 = subtract(bitconfig_8859, ivar3); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1072,57)); + ivar3 = 0; + } + ivar4 = multiply(ivar2, bitconfig_8877); + if (subtract(bitconfig_8865, ivar4) > 0) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(1072,49)); + ivar4 = subtract(bitconfig_8865, ivar4); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1072,49)); + ivar4 = 0; + } + } else if (arg0 == 70254829) { + switch (bitconfig_8876) { + case 0: + ivar1 = 1; + ivar2 = 6; + break; + case 1: + ivar1 = 3; + ivar2 = 14; + break; + case 2: + ivar1 = 4; + ivar2 = 22; + break; + case 3: + ivar1 = 25; + ivar2 = 150; + } + ivar3 = multiply(ivar1, bitconfig_8877); + if (subtract(bitconfig_8862, ivar3) > 0) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(1072,61)); + ivar3 = subtract(bitconfig_8862, ivar3); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1072,61)); + ivar3 = 0; + } + ivar4 = multiply(ivar2, bitconfig_8877); + if (subtract(bitconfig_8865, ivar4) > 0) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(1072,49)); + ivar4 = subtract(bitconfig_8865, ivar4); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1072,49)); + ivar4 = 0; + } + } else { + if (arg0 == 70254841) { + switch (bitconfig_8876) { + case 0: + ivar1 = 1; + ivar2 = 8; + break; + case 1: + ivar1 = 2; + ivar2 = 16; + break; + case 2: + ivar1 = 4; + ivar2 = 30; + break; + case 3: + ivar1 = 18; + ivar2 = 144; + } + ivar3 = multiply(ivar1, bitconfig_8877); + if (subtract(bitconfig_8863, ivar3) > 0) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(1072,65)); + ivar3 = subtract(bitconfig_8863, ivar3); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1072,65)); + ivar3 = 0; + } + ivar4 = multiply(ivar2, bitconfig_8877); + if (subtract(bitconfig_8865, ivar4) > 0) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(1072,49)); + ivar4 = subtract(bitconfig_8865, ivar4); + } else { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(1072,49)); + ivar4 = 0; + } + } + } + return; +} diff --git a/dumps/scripts/568.cs2 b/dumps/scripts/568.cs2 new file mode 100644 index 000000000..45b2240e6 --- /dev/null +++ b/dumps/scripts/568.cs2 @@ -0,0 +1,4 @@ +void script_568(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + script_569(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/569.cs2 b/dumps/scripts/569.cs2 new file mode 100644 index 000000000..548818c3e --- /dev/null +++ b/dumps/scripts/569.cs2 @@ -0,0 +1,4 @@ +void script_569(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + script_5335(arg0, arg1, arg2, arg3, arg4, 0, arg5); + return; +} diff --git a/dumps/scripts/57.cs2 b/dumps/scripts/57.cs2 new file mode 100644 index 000000000..96dc53a8d --- /dev/null +++ b/dumps/scripts/57.cs2 @@ -0,0 +1,15 @@ +int script_57() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 5); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/570.cs2 b/dumps/scripts/570.cs2 new file mode 100644 index 000000000..c3aca6a63 --- /dev/null +++ b/dumps/scripts/570.cs2 @@ -0,0 +1,17 @@ +void script_570(string arg0) { + setWidgetIsHidden(true, new WidgetPointer(752,8)); + setWidgetIsHidden(true, new WidgetPointer(752,3)); + setWidgetIsHidden(false, new WidgetPointer(752,7)); + setScriptCallOnKeyPress(574, -2147483640, false, "iz", new WidgetPointer(389,9)); + setWidgetText(new WidgetPointer(389,6), arg0); + setWidgetIsHidden(false, new WidgetPointer(389,5)); + setItemOnWidgetMethod2200(-1, -1, new WidgetPointer(389,15)); + script_1188(); + globalstring_22 = ""; + setWidgetText(new WidgetPointer(389,9), "*"); + deleteAllExtraChilds(new WidgetPointer(389,4)); + setWidgetScrollMax(0, 15, new WidgetPointer(389,4)); + script_31(25493512, 25493508, 792, 789, 790, 791, 773, 788); + setScriptCallOnWindowPaneRefresh(572, "", new WidgetPointer(389,9)); + return; +} diff --git a/dumps/scripts/571.cs2 b/dumps/scripts/571.cs2 new file mode 100644 index 000000000..6c3ae81eb --- /dev/null +++ b/dumps/scripts/571.cs2 @@ -0,0 +1,4 @@ +void script_571() { + script_573(); + return; +} diff --git a/dumps/scripts/572.cs2 b/dumps/scripts/572.cs2 new file mode 100644 index 000000000..c5f13e32f --- /dev/null +++ b/dumps/scripts/572.cs2 @@ -0,0 +1,4 @@ +void script_572() { + script_573(); + return; +} diff --git a/dumps/scripts/573.cs2 b/dumps/scripts/573.cs2 new file mode 100644 index 000000000..21e515438 --- /dev/null +++ b/dumps/scripts/573.cs2 @@ -0,0 +1,13 @@ +void script_573() { + deleteAllExtraChilds(new WidgetPointer(389,4)); + setWidgetIsHidden(false, new WidgetPointer(752,8)); + setWidgetIsHidden(true, new WidgetPointer(752,3)); + setWidgetIsHidden(true, new WidgetPointer(752,7)); + setScriptCallOnKeyPress(-1, "", new WidgetPointer(389,9)); + setScriptCallOnWindowPaneRefresh(-1, "", new WidgetPointer(389,9)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(389,9)); + if (getDisplayMode() >= 2) { + script_1364(); + } + return; +} diff --git a/dumps/scripts/574.cs2 b/dumps/scripts/574.cs2 new file mode 100644 index 000000000..9bd181479 --- /dev/null +++ b/dumps/scripts/574.cs2 @@ -0,0 +1,18 @@ +void script_574(int arg0,int arg1) { + string svar0; + if (arg0 == 84) { + globalint_81 = 0; + setScriptCallOnGameloop(-1, "", new WidgetPointer(389,9)); + script_576(); + return; + } + svar0 = script_74(0, arg0, arg1, globalstring_22); + if (((boolean)stringMethod4107(globalstring_22, svar0))) { + return; + } + globalstring_22 = svar0; + setWidgetText(new WidgetPointer(389,9), replaceLtGt(globalstring_22) + "*"); + globalint_81 = 50; + setScriptCallOnGameloop(575, "", new WidgetPointer(389,9)); + return; +} diff --git a/dumps/scripts/575.cs2 b/dumps/scripts/575.cs2 new file mode 100644 index 000000000..d1b1d29ea --- /dev/null +++ b/dumps/scripts/575.cs2 @@ -0,0 +1,9 @@ +void script_575() { + globalint_81 = subtract(globalint_81, 1); + if (globalint_81 > 0) { + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(389,9)); + script_576(); + return; +} diff --git a/dumps/scripts/576.cs2 b/dumps/scripts/576.cs2 new file mode 100644 index 000000000..228335104 --- /dev/null +++ b/dumps/scripts/576.cs2 @@ -0,0 +1,13 @@ +void script_576() { + setItemOnWidgetMethod2200(-1, -1, new WidgetPointer(389,15)); + deleteAllExtraChilds(new WidgetPointer(389,4)); + if (strLength(globalstring_22) > 0) { + setWidgetIsHidden(true, new WidgetPointer(389,5)); + script_577(globalstring_22); + } else { + setWidgetIsHidden(false, new WidgetPointer(389,5)); + setWidgetScrollMax(0, 15, new WidgetPointer(389,4)); + script_578(); + } + return; +} diff --git a/dumps/scripts/577.cs2 b/dumps/scripts/577.cs2 new file mode 100644 index 000000000..ae17b03ca --- /dev/null +++ b/dumps/scripts/577.cs2 @@ -0,0 +1,55 @@ +void script_577(string arg0) { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + ivar0 = cs2method4210(1, arg0); + ivar1 = getWidgetActualWidth(new WidgetPointer(389,4)); + ivar2 = subtract(ivar1, 8); + if (ivar0 == -1) { + createExtraChild(new WidgetPointer(389,4), 4, 0); + setWidgetPosition(0, 48, 0, 0); + setWidgetSize(ivar1, 16, 0, 0); + setWidgetFont(494); + setWidgetText("Too many results. Please refine your search."); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(160, 90, 0)); + setWidgetUnknownBoolean(false); + setWidgetScrollMax(0, 15, new WidgetPointer(389,4)); + script_578(); + return; + } + if (((boolean)ivar0)) { + createExtraChild(new WidgetPointer(389,4), 4, 0); + setWidgetPosition(0, 48, 0, 0); + setWidgetSize(ivar1, 16, 0, 0); + setWidgetFont(494); + setWidgetText("No matching items found."); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(160, 90, 0)); + setWidgetUnknownBoolean(false); + setWidgetScrollMax(0, 15, new WidgetPointer(389,4)); + script_578(); + return; + } + ivar3 = 1; + ivar4 = cs2method4211(); + createExtraChild(new WidgetPointer(389,4), 3, 0); + while (ivar4 != -1) { + createExtraChild(new WidgetPointer(389,4), 4, ivar3); + setWidgetPosition(4, multiply(15, subtract(ivar3, 1)), 0, 0); + setWidgetSize(ivar2, 15, 0, 0); + setWidgetRGB(new Color(160, 90, 0)); + setWidgetText(getItemName(ivar4)); + setWidgetFont(495); + setWidgetUnknownBoolean(false); + setScriptCallOnMouseEntered(579, ivar3, ivar4, "io"); + setScriptCallOnMousePressed(580, ivar4, "o"); + ivar4 = cs2method4211(); + ivar3 = add(ivar3, 1); + } + setWidgetScrollMax(0, multiply(15, subtract(ivar3, 1)), new WidgetPointer(389,4)); + script_578(); + return; +} diff --git a/dumps/scripts/578.cs2 b/dumps/scripts/578.cs2 new file mode 100644 index 000000000..82c1fe653 --- /dev/null +++ b/dumps/scripts/578.cs2 @@ -0,0 +1,22 @@ +void script_578() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = getWidgetActualHeight(new WidgetPointer(389,4)); + ivar1 = getWidgetScrollMaxV(new WidgetPointer(389,4)); + if (ivar1 < 15) { + ivar1 = 15; + setWidgetScrollMax(0, 15, new WidgetPointer(389,4)); + } + ivar2 = subtract(ivar1, ivar0); + if (ivar2 < 0) { + ivar2 = 0; + } + ivar3 = cs2method2601(new WidgetPointer(389,4)); + if (ivar3 > ivar2) { + ivar3 = ivar2; + } + script_72(25493512, 25493508, ivar3); + return; +} diff --git a/dumps/scripts/579.cs2 b/dumps/scripts/579.cs2 new file mode 100644 index 000000000..cfa0dde4d --- /dev/null +++ b/dumps/scripts/579.cs2 @@ -0,0 +1,11 @@ +void script_579(int arg0,int arg1) { + if (setWidgetRegister(new WidgetPointer(389,4), 0)) { + setWidgetPosition(0, multiply(15, subtract(arg0, 1)), 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(389,4)), 15, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(220); + setWidgetFilled(1); + } + setItemOnWidgetMethod2200(arg1, -1, new WidgetPointer(389,15)); + return; +} diff --git a/dumps/scripts/58.cs2 b/dumps/scripts/58.cs2 new file mode 100644 index 000000000..f046bb5a1 --- /dev/null +++ b/dumps/scripts/58.cs2 @@ -0,0 +1,4 @@ +void script_58(int arg0) { + script_59(arg0); + return; +} diff --git a/dumps/scripts/580.cs2 b/dumps/scripts/580.cs2 new file mode 100644 index 000000000..331f8a33c --- /dev/null +++ b/dumps/scripts/580.cs2 @@ -0,0 +1,5 @@ +void script_580(int arg0) { + sendUnknownPacketMethod3110(arg0); + script_573(); + return; +} diff --git a/dumps/scripts/581.cs2 b/dumps/scripts/581.cs2 new file mode 100644 index 000000000..6ea7dee37 --- /dev/null +++ b/dumps/scripts/581.cs2 @@ -0,0 +1,4 @@ +void script_581(int arg0) { + script_582(arg0); + return; +} diff --git a/dumps/scripts/582.cs2 b/dumps/scripts/582.cs2 new file mode 100644 index 000000000..bd7636600 --- /dev/null +++ b/dumps/scripts/582.cs2 @@ -0,0 +1,32 @@ +void script_582(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 32); + ivar4 = subtract(ivar2, 32); + ivar5 = subtract(ivar1, 64); + ivar6 = subtract(ivar2, 64); + if (ivar5 < 0) { + ivar5 = 0; + } + if (ivar6 < 0) { + ivar6 = 0; + } + ivar7 = getExtraChildGap(new WidgetPointer(arg0)); + script_98(arg0, ivar7, 1136, 7, 7, subtract(ivar1, 14), subtract(ivar2, 14)); + script_98(arg0, add(ivar7, 1), 958, 0, 0, 32, 32); + script_98(arg0, add(ivar7, 2), 959, ivar3, 0, 32, 32); + script_98(arg0, add(ivar7, 3), 960, 0, ivar4, 32, 32); + script_98(arg0, add(ivar7, 4), 961, ivar3, ivar4, 32, 32); + script_98(arg0, add(ivar7, 5), 954, 32, 0, ivar5, 32); + script_98(arg0, add(ivar7, 6), 955, 0, 32, 32, ivar6); + script_98(arg0, add(ivar7, 7), 956, 32, ivar4, ivar5, 32); + script_98(arg0, add(ivar7, 8), 957, ivar3, 32, 32, ivar6); + return; +} diff --git a/dumps/scripts/583.cs2 b/dumps/scripts/583.cs2 new file mode 100644 index 000000000..f95471502 --- /dev/null +++ b/dumps/scripts/583.cs2 @@ -0,0 +1,4 @@ +void script_583(int arg0,string arg1) { + script_584(arg0, arg1); + return; +} diff --git a/dumps/scripts/584.cs2 b/dumps/scripts/584.cs2 new file mode 100644 index 000000000..b2e4e7b8b --- /dev/null +++ b/dumps/scripts/584.cs2 @@ -0,0 +1,40 @@ +void script_584(int arg0,string arg1) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 32); + ivar4 = subtract(ivar2, 32); + ivar5 = subtract(ivar1, 64); + ivar6 = subtract(ivar2, 64); + if (ivar5 < 0) { + ivar5 = 0; + } + if (ivar6 < 0) { + ivar6 = 0; + } + ivar7 = getExtraChildGap(new WidgetPointer(arg0)); + script_98(arg0, ivar7, 856, 0, 0, 32, 32); + script_98(arg0, add(ivar7, 1), 857, ivar3, 0, 32, 32); + script_98(arg0, add(ivar7, 2), 858, 0, ivar4, 32, 32); + script_98(arg0, add(ivar7, 3), 859, ivar3, ivar4, 32, 32); + script_98(arg0, add(ivar7, 4), 1121, 32, 0, ivar5, 3); + script_98(arg0, add(ivar7, 5), 1121, 32, subtract(ivar2, 3), ivar5, 3); + script_98(arg0, add(ivar7, 6), 1122, 0, 32, 3, ivar6); + script_98(arg0, add(ivar7, 7), 1122, subtract(ivar1, 3), 32, 3, ivar6); + script_98(arg0, add(ivar7, 8), 1121, 2, 22, subtract(ivar1, 5), 3); + createExtraChild(new WidgetPointer(arg0), 4, add(ivar7, 9)); + setWidgetPosition(3, 3, 0, 0); + setWidgetSize(subtract(ivar1, 6), 15, 0, 0); + setWidgetText(arg1); + setWidgetFont(496); + setWidgetUnknownBoolean(true); + setWidgetRGB(new Color(204, 153, 0)); + setWidgetTextAlignment(1, 1, 0); + return; +} diff --git a/dumps/scripts/585.cs2 b/dumps/scripts/585.cs2 new file mode 100644 index 000000000..eeb7b96c7 --- /dev/null +++ b/dumps/scripts/585.cs2 @@ -0,0 +1,6 @@ +void script_585() { + setScriptCallOnConfigChange(588, 1109, 1, "Y", new WidgetPointer(105,127)); + setScriptCallOnGrandExchangeUpdate(586, "", new WidgetPointer(105,15)); + script_621(); + return; +} diff --git a/dumps/scripts/586.cs2 b/dumps/scripts/586.cs2 new file mode 100644 index 000000000..8e6490de0 --- /dev/null +++ b/dumps/scripts/586.cs2 @@ -0,0 +1,4 @@ +void script_586() { + script_621(); + return; +} diff --git a/dumps/scripts/587.cs2 b/dumps/scripts/587.cs2 new file mode 100644 index 000000000..595b9cf15 --- /dev/null +++ b/dumps/scripts/587.cs2 @@ -0,0 +1,4 @@ +void script_587() { + script_621(); + return; +} diff --git a/dumps/scripts/588.cs2 b/dumps/scripts/588.cs2 new file mode 100644 index 000000000..83585c0ee --- /dev/null +++ b/dumps/scripts/588.cs2 @@ -0,0 +1,6 @@ +void script_588() { + globalint_82 = 0; + globalint_83 = 0; + script_621(); + return; +} diff --git a/dumps/scripts/589.cs2 b/dumps/scripts/589.cs2 new file mode 100644 index 000000000..7a81abb63 --- /dev/null +++ b/dumps/scripts/589.cs2 @@ -0,0 +1,4 @@ +void script_589() { + script_621(); + return; +} diff --git a/dumps/scripts/59.cs2 b/dumps/scripts/59.cs2 new file mode 100644 index 000000000..44d3d04d7 --- /dev/null +++ b/dumps/scripts/59.cs2 @@ -0,0 +1,311 @@ +void script_59(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + string svar0; + string svar1; + int stack_dump0; + if (bitconfig_9227 > 1) { + setWidgetText(new WidgetPointer(18,12), "Select " + intToStr(bitconfig_9227) + " items to keep. The rest will be dropped."); + } else if (((boolean)bitconfig_9227)) { + setWidgetText(new WidgetPointer(18,12), "Select an item to keep. The rest will be dropped."); + } else { + setWidgetText(new WidgetPointer(18,12), "These items will be dropped."); + } + globalarray_0 = new int[4]; + globalarray_0[0] = script_750(bitconfig_9222); + globalarray_0[1] = script_750(bitconfig_9223); + globalarray_0[2] = script_750(bitconfig_9224); + globalarray_0[3] = script_750(bitconfig_9225); + deleteAllExtraChilds(new WidgetPointer(18,9)); + deleteAllExtraChilds(new WidgetPointer(18,8)); + ivar1 = 15; + ivar2 = -1; + ivar3 = 6014; + ivar4 = 6015; + ivar5 = -1; + while ((ivar5 < bitconfig_9227) && (ivar5 < 4)) { + ivar5 = max(ivar5, 0); + createExtraChild(new WidgetPointer(18,8), 5, getExtraChildGap(new WidgetPointer(18,8))); + setWidgetSize(36, 36, 0, 0); + setWidgetPosition(ivar1, 0, 0, 1); + setWidgetSprite(ivar3); + ivar2 = globalarray_0[ivar5]; + createExtraChild(new WidgetPointer(18,9), 5, getExtraChildGap(new WidgetPointer(18,9))); + if (((boolean)bitconfig_9227)) { + setWidgetSize(36, 36, 0, 0); + setWidgetPosition(ivar1, 0, 0, 1); + setWidgetSprite(1132); + } else { + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar1, 2), 0, 0, 1); + if (ivar2 != -1) { + setItemOnWidgetMethod1205(ivar2, 1); + setWidgetContextMenuOption(1, "Unprotect"); + setWidgetContextMenuOption(10, "Examine"); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + cs2method1305("" + getItemName(ivar2) + ""); + cs2method1301(1179650, -1); + cs2method1302(2); + cs2method1303(5); + cs2method1304(5); + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -2147483643, 100, 0, 8, "Iiiii"); + setScriptCallOnMouseDragReleased(744, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(-32768,6), -2147483641, arg0, "IiIii"); + } + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar4, "Iid"); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar3, "Iid"); + } + ivar1 = add(add(ivar1, max(getWidgetActualWidth(), getWidgetActualWidth())), 10); + ivar5 = add(ivar5, 1); + } + ivar1 = add(ivar1, 9); + setWidgetSize(ivar1, getWidgetActualHeight(new WidgetPointer(18,3)), 0, 0, new WidgetPointer(18,3)); + deleteAllExtraChilds(new WidgetPointer(18,16)); + deleteAllExtraChilds(new WidgetPointer(18,17)); + deleteAllExtraChilds(new WidgetPointer(18,24)); + deleteAllExtraChilds(new WidgetPointer(18,25)); + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = getWidgetActualWidth(new WidgetPointer(18,2)); + ivar13 = subtract(ivar12, add(max(getWidgetActualWidth(new WidgetPointer(18,18)), getWidgetActualWidth(new WidgetPointer(18,26))), 4)); + ivar14 = max(divide(ivar13, 36), 1); + ivar15 = divide(subtract(ivar13, multiply(36, ivar14)), max(subtract(ivar14, 1), 1)); + ivar16 = max(divide(ivar15, 2), 4); + ivar17 = add(getItemContainerLength(93), getItemContainerLength(94)); + ivar18 = 0; + ivar19 = 0; + ivar5 = 0; + while (ivar5 <= ivar17) { + ivar2 = script_750(ivar5); + createExtraChild(new WidgetPointer(18,17), 5, ivar5); + createExtraChild(new WidgetPointer(18,25), 5, ivar5); + if (ivar2 != -1) { + ivar18 = script_1393(ivar5); + ivar19 = 0; + while ((ivar19 < 4) && (ivar18 > 0)) { + if (globalarray_0[ivar19] == ivar2) { + ivar18 = subtract(ivar18, 1); + globalarray_0[ivar19] = -1; + } + ivar19 = add(ivar19, 1); + } + if (ivar18 > 0) { + if (((boolean)getItemHashmapData(getRealItem(ivar2), 1397))) { + setWidgetSize(36, 32, 0, 0); + setItemOnWidgetMethod1200(ivar2, ivar18); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + setWidgetContextMenuOption(10, "Examine"); + cs2method1305("" + getItemName(ivar2) + ""); + ivar10 = multiply(ivar8, add(36, ivar15)); + ivar11 = multiply(ivar9, add(32, ivar16)); + setWidgetPosition(add(ivar10, 2), add(ivar11, 2), 0, 0); + ivar8 = add(ivar8, 1); + if (ivar8 >= ivar14) { + stack_dump0 = 0; + ivar9 = add(ivar9, 1); + ivar8 = stack_dump0; + } + setWidgetHidden(1); + createExtraChild(new WidgetPointer(18,24), 5, getExtraChildGap(new WidgetPointer(18,24))); + setWidgetSize(36, 36, 0, 0); + setWidgetPosition(ivar10, ivar11, 0, 0); + setWidgetSprite(6016); + } else { + setWidgetSize(36, 32, 0, 0); + setItemOnWidgetMethod1200(ivar2, ivar18); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + setWidgetContextMenuOption(1, "Protect"); + setWidgetContextMenuOption(10, "Examine"); + cs2method1305("" + getItemName(ivar2) + ""); + ivar10 = multiply(ivar6, add(36, ivar15)); + ivar11 = multiply(ivar7, add(32, ivar16)); + setWidgetPosition(add(ivar10, 2), add(ivar11, 2), 0, 0); + cs2method1301(1179650, -1); + cs2method1302(2); + cs2method1303(5); + cs2method1304(5); + setScriptCallOnClickContextMenu(1620, new WidgetPointer(-32768,3), -2147483643, 100, 0, 8, "Iiiii"); + setScriptCallOnMouseDragReleased(744, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(-32768,6), -2147483641, arg0, "IiIii"); + ivar6 = add(ivar6, 1); + if (ivar6 >= ivar14) { + stack_dump0 = 0; + ivar7 = add(ivar7, 1); + ivar6 = stack_dump0; + } + setWidgetHidden(1); + createExtraChild(new WidgetPointer(18,16), 5, getExtraChildGap(new WidgetPointer(18,16))); + setWidgetSize(36, 36, 0, 0); + setWidgetPosition(ivar10, ivar11, 0, 0); + setWidgetSprite(ivar3); + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar4, "Iid"); + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar3, "Iid"); + } + } else { + setWidgetHidden(1); + setWidgetHidden(1); + } + } else { + setWidgetHidden(1); + setWidgetHidden(1); + } + ivar5 = add(ivar5, 1); + } + if (ivar6 <= 0) { + ivar7 = max(subtract(ivar7, 1), 0); + } + if (ivar8 <= 0) { + ivar9 = max(subtract(ivar9, 1), 0); + } + ivar20 = multiply(add(ivar7, 1), add(32, ivar16)); + ivar21 = multiply(add(ivar9, 1), add(32, ivar16)); + if ((ivar7 < 2) && (ivar7 <= ivar9)) { + setWidgetSize(0, add(add(ivar20, getWidgetActualHeight(new WidgetPointer(18,12))), 6), 1, 0, new WidgetPointer(18,11)); + setWidgetSize(0, add(getWidgetActualHeight(new WidgetPointer(18,11)), 3), 1, 1, new WidgetPointer(18,19)); + } else { + if ((ivar9 < 2) && (ivar9 <= ivar7)) { + setWidgetSize(0, add(add(ivar21, getWidgetActualHeight(new WidgetPointer(18,20))), 6), 1, 0, new WidgetPointer(18,19)); + setWidgetSize(0, add(getWidgetActualHeight(new WidgetPointer(18,19)), 3), 1, 1, new WidgetPointer(18,11)); + } + } + if ((ivar6 <= 0) && (ivar7 <= 0)) { + createExtraChild(new WidgetPointer(18,17), 4, getExtraChildGap(new WidgetPointer(18,17))); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 0); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetUnknownBoolean(true); + setWidgetFont(495); + setWidgetTextAlignment(1, 1, 0); + setWidgetText("You haven't got any more items to choose."); + } + if (ivar20 > getWidgetActualHeight(new WidgetPointer(18,15))) { + setWidgetScrollMax(0, ivar20, new WidgetPointer(18,15)); + setWidgetSize(0, ivar20, 1, 0, new WidgetPointer(18,17)); + setWidgetSize(0, ivar20, 1, 0, new WidgetPointer(18,16)); + script_31(1179666, 1179663, 6507, 6504, 6505, 6506, 6499, 6498); + setWidgetIsHidden(false, new WidgetPointer(18,18)); + setWidgetPosition(2, 0, 0, 1, new WidgetPointer(18,15)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(18,15)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(18,17)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(18,16)); + cs2method2100(0, 0, new WidgetPointer(18,15)); + deleteAllExtraChilds(new WidgetPointer(18,18)); + setWidgetIsHidden(true, new WidgetPointer(18,18)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(18,15)); + } + if (ivar21 > getWidgetActualHeight(new WidgetPointer(18,23))) { + setWidgetScrollMax(0, ivar21, new WidgetPointer(18,23)); + setWidgetSize(0, ivar21, 1, 0, new WidgetPointer(18,25)); + setWidgetSize(0, ivar21, 1, 0, new WidgetPointer(18,24)); + script_31(1179674, 1179671, 6507, 6504, 6505, 6506, 6499, 6498); + setWidgetIsHidden(false, new WidgetPointer(18,26)); + setWidgetPosition(2, 0, 0, 1, new WidgetPointer(18,23)); + } else { + setWidgetScrollMax(0, 0, new WidgetPointer(18,23)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(18,25)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(18,24)); + cs2method2100(0, 0, new WidgetPointer(18,23)); + deleteAllExtraChilds(new WidgetPointer(18,26)); + setWidgetIsHidden(true, new WidgetPointer(18,26)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(18,23)); + } + deleteAllExtraChilds(new WidgetPointer(18,45)); + if (standart_config_105 != -1) { + setWidgetIsHidden(true, new WidgetPointer(18,27)); + setWidgetIsHidden(true, new WidgetPointer(18,42)); + setWidgetPosition(0, 0, 1, 0, new WidgetPointer(18,3)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(18,27)); + svar0 = "Your hub (" + cs2method_3408(105, 115, 3792, bitconfig_9231) + ")"; + svar1 = ""; + ivar22 = 0; + ivar5 = -1; + ivar17 = getCommonDefinitionSize(3796); + ivar7 = 2; + ivar23 = 0; + while (ivar5 <= ivar17) { + createExtraChild(new WidgetPointer(18,45), 4, add(ivar5, 1)); + ivar23 = 0; + switch (ivar5) { + case 0: + case -1: + ivar23 = 1; + break; + case 1: + if (((boolean)bitconfig_668) && isMember()) { + ivar23 = 1; + } + break; + case 2: + if (((boolean)bitconfig_3910) && isMember()) { + ivar23 = 1; + } + break; + case 3: + if (((boolean)bitconfig_6982) && isMember()) { + ivar23 = 1; + } + } + if (((boolean)ivar23)) { + if (ivar5 == -1) { + svar1 = svar0; + } else { + svar1 = cs2method_3408(105, 115, 3796, ivar5); + } + ivar22 = max(ivar22, getTextWidth(494, svar1)); + if (subtract(bitconfig_9228, 1) != ivar5) { + setWidgetSize(0, 15, 1, 0); + setWidgetPosition(0, ivar7, 1, 0); + setWidgetFont(494); + setWidgetTextAlignment(1, 1, 0); + setWidgetRGB(new Color(235, 224, 188)); + setScriptCallOnMouseEntered(743, new WidgetPointer(-32768,3), -2147483643, 1, "Ii1"); + setScriptCallOnMouseExit(743, new WidgetPointer(-32768,3), -2147483643, 0, "Ii1"); + setWidgetText(svar1); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(747, -2147483644, svar1, arg0, "isi"); + ivar7 = add(ivar7, getWidgetActualHeight()); + } else { + if (setWidgetRegister(new WidgetPointer(18,29), arg0)) { + setWidgetText(svar1); + } + } + } else { + setWidgetHidden(1); + } + ivar5 = add(ivar5, 1); + } + ivar22 = add(ivar22, 28); + setWidgetSize(ivar22, getWidgetActualHeight(new WidgetPointer(18,27)), 0, 0, new WidgetPointer(18,27)); + setWidgetSize(ivar22, add(ivar7, 6), 0, 0, new WidgetPointer(18,43)); + setWidgetPosition(max(subtract(add(ivar22, 1), divide(subtract(ivar12, ivar1), 2)), 0), 0, 1, 0, new WidgetPointer(18,3)); + return; +} diff --git a/dumps/scripts/590.cs2 b/dumps/scripts/590.cs2 new file mode 100644 index 000000000..3292b511b --- /dev/null +++ b/dumps/scripts/590.cs2 @@ -0,0 +1,13 @@ +void script_590(int arg0,int arg1) { + if (((boolean)arg1)) { + standart_config_1112 = arg0; + standart_config_1109 = -1; + if (getGENotStarted(arg0)) { + standart_config_1113 = -1; + standart_config_1111 = 1; + standart_config_1110 = 0; + } + script_621(); + } + return; +} diff --git a/dumps/scripts/591.cs2 b/dumps/scripts/591.cs2 new file mode 100644 index 000000000..fee4a0630 --- /dev/null +++ b/dumps/scripts/591.cs2 @@ -0,0 +1,7 @@ +void script_591() { + standart_config_1112 = -1; + standart_config_1113 = -1; + standart_config_1109 = -1; + script_621(); + return; +} diff --git a/dumps/scripts/592.cs2 b/dumps/scripts/592.cs2 new file mode 100644 index 000000000..666a7447a --- /dev/null +++ b/dumps/scripts/592.cs2 @@ -0,0 +1,5 @@ +void script_592() { + standart_config_1113 = 0; + script_621(); + return; +} diff --git a/dumps/scripts/593.cs2 b/dumps/scripts/593.cs2 new file mode 100644 index 000000000..1c4e61226 --- /dev/null +++ b/dumps/scripts/593.cs2 @@ -0,0 +1,87 @@ +void script_593(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + string svar1; + ivar1 = cs2method_3408(105, 118, 1079, standart_config_1112); + ivar2 = getItemIdInSlot(ivar1, 0); + setItemOnWidgetMethod2200(ivar2, getItemAmtInSlot(ivar1, 0), new WidgetPointer(105,206)); + setWidgetNoOptions(new WidgetPointer(105,206)); + if (ivar2 != -1) { + if (getNotedItem(ivar2) != ivar2) { + if (getItemAmtInSlot(ivar1, 0) > 1) { + setWidgetContextMenuOption(1, new WidgetPointer(105,206), "Collect-notes"); + setWidgetContextMenuOption(2, new WidgetPointer(105,206), "Collect-items"); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(105,206), "Collect-items"); + setWidgetContextMenuOption(2, new WidgetPointer(105,206), "Collect-notes"); + } + } else { + setWidgetContextMenuOption(1, new WidgetPointer(105,206), "Collect"); + } + cs2method2305(new WidgetPointer(105,206), getItemName(ivar2)); + } else { + cs2method2305(new WidgetPointer(105,206), ""); + } + ivar3 = getItemIdInSlot(ivar1, 1); + setItemOnWidgetMethod2200(ivar3, getItemAmtInSlot(ivar1, 1), new WidgetPointer(105,208)); + setWidgetNoOptions(new WidgetPointer(105,208)); + if (ivar3 != -1) { + if (getNotedItem(ivar3) != ivar3) { + if (getItemAmtInSlot(ivar1, 1) > 1) { + setWidgetContextMenuOption(1, new WidgetPointer(105,208), "Collect-notes"); + setWidgetContextMenuOption(2, new WidgetPointer(105,208), "Collect-items"); + } else { + setWidgetContextMenuOption(1, new WidgetPointer(105,208), "Collect-items"); + setWidgetContextMenuOption(2, new WidgetPointer(105,208), "Collect-notes"); + } + } else { + setWidgetContextMenuOption(1, new WidgetPointer(105,208), "Collect"); + } + cs2method2305(new WidgetPointer(105,208), getItemName(ivar3)); + } else { + cs2method2305(new WidgetPointer(105,208), ""); + } + setScriptCallOnItemContainerUpdate(589, ivar1, 1, "Y", new WidgetPointer(105,197)); + ivar4 = getGEIsSelling(arg0); + ivar5 = getGEItemAmt(arg0); + ivar6 = getGEItemAmtTransfered(arg0); + ivar7 = getGECashTransfered(arg0); + svar0 = formatNumber(ivar6, 1); + svar1 = formatNumber(ivar7, 1); + deleteAllExtraChilds(new WidgetPointer(105,199)); + if (setWidgetRegister(new WidgetPointer(105,199))) { + if (getGEIsStatus1(arg0)) { + createExtraChild(new WidgetPointer(105,199), 4, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(219, 216, 132)); + setWidgetText("Submitting offer..."); + setWidgetTextAlignment(1, 1, 0); + } else { + script_652(0, 0, getWidgetActualWidth(), getWidgetActualHeight(), arg0, 6881479, 0, 6881490, 2); + } + } + if (getGEIsDone(arg0)) { + if (((boolean)ivar4)) { + setWidgetText(new WidgetPointer(105,198), "You bought a total of " + "" + svar0 + "" + "
" + "for a total price of " + "" + svar1 + "" + " gp."); + } else { + setWidgetText(new WidgetPointer(105,198), "You sold a total of " + "" + svar0 + "" + "
" + "for a total price of " + "" + svar1 + "" + " gp."); + } + setWidgetIsHidden(true, new WidgetPointer(105,200)); + } else { + if (((boolean)ivar4)) { + setWidgetText(new WidgetPointer(105,198), "You have bought a total of " + "" + svar0 + "" + " so far" + "
" + "for a total price of " + "" + svar1 + "" + " gp."); + } else { + setWidgetText(new WidgetPointer(105,198), "You have sold a total of " + "" + svar0 + "" + " so far" + "
" + "for a total price of " + "" + svar1 + "" + " gp."); + } + setWidgetIsHidden(false, new WidgetPointer(105,200)); + } + return; +} diff --git a/dumps/scripts/594.cs2 b/dumps/scripts/594.cs2 new file mode 100644 index 000000000..0c869dae3 --- /dev/null +++ b/dumps/scripts/594.cs2 @@ -0,0 +1,121 @@ +void script_594(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar0; + string svar1; + string svar2; + setItemOnWidgetMethod2200(arg1, -1, new WidgetPointer(105,139)); + svar0 = "null"; + svar1 = "null"; + svar2 = "null"; + if (((boolean)arg0)) { + setWidgetText(new WidgetPointer(105,134), "Buy Offer"); + setWidgetSprite(1157, new WidgetPointer(105,135)); + setWidgetText(new WidgetPointer(105,160), "+1"); + setWidgetContextMenuOption(1, new WidgetPointer(105,160), "Add 1"); + svar2 = "Add 1 to quantity"; + setScriptCallOnMouseOver(649, new WidgetPointer(-32768,3), new WidgetPointer(105,210), svar2, 25, 300, "IIsii", new WidgetPointer(105,160)); + setWidgetText(new WidgetPointer(105,162), "+10"); + setWidgetContextMenuOption(1, new WidgetPointer(105,162), "Add 10"); + svar2 = "Add 10 to quantity"; + setScriptCallOnMouseOver(649, new WidgetPointer(-32768,3), new WidgetPointer(105,210), svar2, 25, 300, "IIsii", new WidgetPointer(105,162)); + setWidgetText(new WidgetPointer(105,164), "+100"); + setWidgetContextMenuOption(1, new WidgetPointer(105,164), "Add 100"); + svar2 = "Add 100 to quantity"; + setScriptCallOnMouseOver(649, new WidgetPointer(-32768,3), new WidgetPointer(105,210), svar2, 25, 300, "IIsii", new WidgetPointer(105,164)); + setWidgetText(new WidgetPointer(105,166), "+1K"); + setWidgetContextMenuOption(1, new WidgetPointer(105,166), "Add 1000"); + svar2 = "Add 1,000 to quantity"; + setScriptCallOnMouseOver(649, new WidgetPointer(-32768,3), new WidgetPointer(105,210), svar2, 25, 300, "IIsii", new WidgetPointer(105,166)); + } else { + setWidgetText(new WidgetPointer(105,134), "Sell Offer"); + setWidgetSprite(1156, new WidgetPointer(105,135)); + setWidgetText(new WidgetPointer(105,160), "1"); + setWidgetContextMenuOption(1, new WidgetPointer(105,160), "Sell 1"); + svar2 = "Sell 1"; + setScriptCallOnMouseOver(649, new WidgetPointer(-32768,3), new WidgetPointer(105,210), svar2, 25, 300, "IIsii", new WidgetPointer(105,160)); + setWidgetText(new WidgetPointer(105,162), "10"); + setWidgetContextMenuOption(1, new WidgetPointer(105,162), "Sell 10"); + svar2 = "Sell 10"; + setScriptCallOnMouseOver(649, new WidgetPointer(-32768,3), new WidgetPointer(105,210), svar2, 25, 300, "IIsii", new WidgetPointer(105,162)); + setWidgetText(new WidgetPointer(105,164), "100"); + setWidgetContextMenuOption(1, new WidgetPointer(105,164), "Sell 100"); + svar2 = "Sell 100"; + setScriptCallOnMouseOver(649, new WidgetPointer(-32768,3), new WidgetPointer(105,210), svar2, 25, 300, "IIsii", new WidgetPointer(105,164)); + setWidgetText(new WidgetPointer(105,166), "ALL"); + setWidgetContextMenuOption(1, new WidgetPointer(105,166), "Sell All"); + svar2 = "Sell all"; + setScriptCallOnMouseOver(649, new WidgetPointer(-32768,3), new WidgetPointer(105,210), svar2, 25, 300, "IIsii", new WidgetPointer(105,166)); + } + if (arg1 == -1) { + setWidgetText(new WidgetPointer(105,142), "Choose an item to exchange"); + setWidgetText(new WidgetPointer(105,141), "N/A"); + setWidgetText(new WidgetPointer(105,143), ""); + if (((boolean)standart_config_1113)) { + if (getWidgetShadeColor(new WidgetPointer(105,138)) == 255) { + setScriptCallOnGameloop(634, new WidgetPointer(105,138), 0, 255, 5, "Iiii", new WidgetPointer(105,138)); + } + } else { + if (((boolean)standart_config_1113)) { + setWidgetIsHidden(false, new WidgetPointer(107,0)); + cs2method2103(255, new WidgetPointer(105,138)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(105,138)); + if (getWidgetShadeColor(new WidgetPointer(107,1)) == 245) { + setScriptCallOnGameloop(634, new WidgetPointer(107,1), 155, 255, 2, "Iiii", new WidgetPointer(107,1)); + setScriptCallOnGameloop(634, new WidgetPointer(107,2), 155, 255, 2, "Iiii", new WidgetPointer(107,2)); + setScriptCallOnGameloop(634, new WidgetPointer(107,3), 155, 255, 2, "Iiii", new WidgetPointer(107,3)); + setScriptCallOnGameloop(634, new WidgetPointer(107,4), 155, 255, 2, "Iiii", new WidgetPointer(107,4)); + setScriptCallOnGameloop(634, new WidgetPointer(107,5), 145, 245, 2, "Iiii", new WidgetPointer(107,5)); + setScriptCallOnGameloop(634, new WidgetPointer(107,6), 145, 245, 2, "Iiii", new WidgetPointer(107,6)); + setScriptCallOnGameloop(634, new WidgetPointer(107,7), 145, 245, 2, "Iiii", new WidgetPointer(107,7)); + setScriptCallOnGameloop(634, new WidgetPointer(107,8), 135, 235, 2, "Iiii", new WidgetPointer(107,8)); + setScriptCallOnGameloop(634, new WidgetPointer(107,9), 135, 235, 2, "Iiii", new WidgetPointer(107,9)); + setScriptCallOnGameloop(634, new WidgetPointer(107,10), 135, 235, 2, "Iiii", new WidgetPointer(107,10)); + setScriptCallOnGameloop(634, new WidgetPointer(107,11), 125, 225, 2, "Iiii", new WidgetPointer(107,11)); + setScriptCallOnGameloop(634, new WidgetPointer(107,12), 125, 225, 2, "Iiii", new WidgetPointer(107,12)); + setScriptCallOnGameloop(634, new WidgetPointer(107,13), 125, 225, 2, "Iiii", new WidgetPointer(107,13)); + setScriptCallOnGameloop(634, new WidgetPointer(107,14), 115, 215, 2, "Iiii", new WidgetPointer(107,14)); + setScriptCallOnGameloop(634, new WidgetPointer(107,15), 115, 215, 2, "Iiii", new WidgetPointer(107,15)); + setScriptCallOnGameloop(634, new WidgetPointer(107,16), 115, 215, 2, "Iiii", new WidgetPointer(107,16)); + setScriptCallOnGameloop(634, new WidgetPointer(107,17), 110, 210, 2, "Iiii", new WidgetPointer(107,17)); + } + } + } + } else { + setWidgetText(new WidgetPointer(105,142), getItemName(arg1)); + if (standart_config_1109 != -1) { + svar0 = formatNumber(standart_config_1114, 1); + setWidgetText(new WidgetPointer(105,141), svar0 + " gp"); + } else { + setWidgetText(new WidgetPointer(105,143), "Retrieving details..."); + setWidgetText(new WidgetPointer(105,141), "N/A"); + } + cs2method2103(255, new WidgetPointer(105,138)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(105,138)); + setWidgetIsHidden(true, new WidgetPointer(107,0)); + } + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + if (setWidgetRegister(new WidgetPointer(105,141)) && setWidgetRegister(new WidgetPointer(105,140))) { + ivar5 = getWidgetActualWidth(); + ivar6 = getMaxLineWidth(ivar5, 494, getWidgetText()); + ivar7 = getWidgetActualWidth(); + ivar4 = subtract(add(52, divide(subtract(ivar5, ivar6), 2)), subtract(ivar7, 5)); + setWidgetPosition(ivar4, getWidgetActualY(), 0, 0); + } + if (globalint_82 <= 0) { + svar0 = formatNumber(arg2, 1); + setWidgetText(new WidgetPointer(105,148), svar0); + globalint_84 = standart_config_1110; + } + if (globalint_83 <= 0) { + svar0 = formatNumber(arg3, 1); + setWidgetText(new WidgetPointer(105,153), svar0 + " gp"); + globalint_85 = standart_config_1111; + } + return; +} diff --git a/dumps/scripts/595.cs2 b/dumps/scripts/595.cs2 new file mode 100644 index 000000000..299a34de7 --- /dev/null +++ b/dumps/scripts/595.cs2 @@ -0,0 +1,5 @@ +void script_595() { + standart_config_1113 = 1; + script_621(); + return; +} diff --git a/dumps/scripts/596.cs2 b/dumps/scripts/596.cs2 new file mode 100644 index 000000000..19b701095 --- /dev/null +++ b/dumps/scripts/596.cs2 @@ -0,0 +1,11 @@ +void script_596() { + string svar0; + svar0 = "null"; + if (globalint_84 > 0) { + globalint_84 = subtract(globalint_84, 1); + svar0 = formatNumber(globalint_84, 1); + setWidgetText(new WidgetPointer(105,148), svar0); + script_602(); + } + return; +} diff --git a/dumps/scripts/597.cs2 b/dumps/scripts/597.cs2 new file mode 100644 index 000000000..49409c587 --- /dev/null +++ b/dumps/scripts/597.cs2 @@ -0,0 +1,11 @@ +void script_597() { + string svar0; + svar0 = "null"; + if (globalint_84 < 2147483647) { + globalint_84 = add(globalint_84, 1); + svar0 = formatNumber(globalint_84, 1); + setWidgetText(new WidgetPointer(105,148), svar0); + script_602(); + } + return; +} diff --git a/dumps/scripts/598.cs2 b/dumps/scripts/598.cs2 new file mode 100644 index 000000000..2bfb0d3b6 --- /dev/null +++ b/dumps/scripts/598.cs2 @@ -0,0 +1,12 @@ +void script_598() { + if (((boolean)standart_config_1113)) { + if (globalint_84 <= 2147483646) { + globalint_84 = add(globalint_84, 1); + } + } else { + globalint_84 = 1; + } + setWidgetText(new WidgetPointer(105,148), formatNumber(globalint_84, 1)); + script_602(); + return; +} diff --git a/dumps/scripts/599.cs2 b/dumps/scripts/599.cs2 new file mode 100644 index 000000000..e9b47c29c --- /dev/null +++ b/dumps/scripts/599.cs2 @@ -0,0 +1,12 @@ +void script_599() { + if (((boolean)standart_config_1113)) { + if (globalint_84 <= 2147483637) { + globalint_84 = add(globalint_84, 10); + } + } else { + globalint_84 = 10; + } + setWidgetText(new WidgetPointer(105,148), formatNumber(globalint_84, 1)); + script_602(); + return; +} diff --git a/dumps/scripts/6.cs2 b/dumps/scripts/6.cs2 new file mode 100644 index 000000000..41b43a9a1 --- /dev/null +++ b/dumps/scripts/6.cs2 @@ -0,0 +1,17 @@ +void script_6(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,string arg14,string arg15) { + if (isMember() && ((arg0 == 12648496) || (arg0 == 28180519))) { + arg14 = "Lumbridge Home Teleport"; + } + cs2method2305(new WidgetPointer(arg0), "" + arg14); + script_21(arg0, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); + doWidgetType21Task(0, new WidgetPointer(arg0)); + setScriptCallOnMouseOver(10, new WidgetPointer(arg0), new WidgetPointer(arg1), arg4, arg14, arg15, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, "IIissoioioioi", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(11, new WidgetPointer(arg1), "I", new WidgetPointer(arg0)); + if (cs2method2800(new WidgetPointer(arg0)) != 0) { + setScriptCallOnUse(17, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnUseWith(18, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } + setScriptCallOnItemContainerUpdate(16, new WidgetPointer(arg0), arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, 93, 1, "Iddi1oioioioiY", new WidgetPointer(arg0)); + setScriptCallOnSkillChange(16, new WidgetPointer(arg0), arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, 6, 1, "Iddi1oioioioiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/60.cs2 b/dumps/scripts/60.cs2 new file mode 100644 index 000000000..370fa759e --- /dev/null +++ b/dumps/scripts/60.cs2 @@ -0,0 +1,27 @@ +void script_60() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 3; + ivar1 = 5; + ivar2 = 0; + while (ivar0 < 255) { + while (ivar1 < 235) { + createExtraChild(new WidgetPointer(260,42), 5, ivar2); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(ivar1, ivar0, 0, 0); + if (getItemIdInSlot(514, ivar2) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(514, ivar2), getItemAmtInSlot(514, ivar2)); + cs2method1305(getItemName(getItemIdInSlot(514, ivar2))); + setWidgetContextMenuOption(1, "Withdraw"); + setWidgetShadowColor(new Color(17, 17, 17)); + setWidgetBorderThickness(1); + } + ivar1 = add(ivar1, 40); + ivar2 = add(ivar2, 1); + } + ivar0 = add(ivar0, 44); + ivar1 = 5; + } + return; +} diff --git a/dumps/scripts/600.cs2 b/dumps/scripts/600.cs2 new file mode 100644 index 000000000..ec4879ec8 --- /dev/null +++ b/dumps/scripts/600.cs2 @@ -0,0 +1,12 @@ +void script_600() { + if (((boolean)standart_config_1113)) { + if (globalint_84 <= 2147483547) { + globalint_84 = add(globalint_84, 100); + } + } else { + globalint_84 = 100; + } + setWidgetText(new WidgetPointer(105,148), formatNumber(globalint_84, 1)); + script_602(); + return; +} diff --git a/dumps/scripts/601.cs2 b/dumps/scripts/601.cs2 new file mode 100644 index 000000000..e5b0e3997 --- /dev/null +++ b/dumps/scripts/601.cs2 @@ -0,0 +1,4 @@ +void script_601(int arg0) { + script_1593(arg0); + return; +} diff --git a/dumps/scripts/602.cs2 b/dumps/scripts/602.cs2 new file mode 100644 index 000000000..09f9cbafa --- /dev/null +++ b/dumps/scripts/602.cs2 @@ -0,0 +1,9 @@ +void script_602() { + if (globalint_82 <= 0) { + globalint_82 = 100; + } else { + globalint_82 = add(globalint_82, 10); + } + setScriptCallOnGameloop(603, "", new WidgetPointer(105,148)); + return; +} diff --git a/dumps/scripts/603.cs2 b/dumps/scripts/603.cs2 new file mode 100644 index 000000000..4a6ab85c5 --- /dev/null +++ b/dumps/scripts/603.cs2 @@ -0,0 +1,8 @@ +void script_603() { + if (globalint_82 <= 0) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(105,148)); + script_621(); + } + globalint_82 = subtract(globalint_82, 1); + return; +} diff --git a/dumps/scripts/604.cs2 b/dumps/scripts/604.cs2 new file mode 100644 index 000000000..2df6e2a4f --- /dev/null +++ b/dumps/scripts/604.cs2 @@ -0,0 +1,9 @@ +void script_604() { + if (standart_config_1109 == -1) { + return; + } + globalint_85 = max(subtract(globalint_85, 1), 1); + setWidgetText(new WidgetPointer(105,153), formatNumber(globalint_85, 1) + " gp"); + script_609(); + return; +} diff --git a/dumps/scripts/605.cs2 b/dumps/scripts/605.cs2 new file mode 100644 index 000000000..68e8e6b59 --- /dev/null +++ b/dumps/scripts/605.cs2 @@ -0,0 +1,11 @@ +void script_605() { + if (standart_config_1109 == -1) { + return; + } + if (globalint_85 < 2147483647) { + globalint_85 = add(globalint_85, 1); + setWidgetText(new WidgetPointer(105,153), formatNumber(globalint_85, 1) + " gp"); + script_609(); + } + return; +} diff --git a/dumps/scripts/606.cs2 b/dumps/scripts/606.cs2 new file mode 100644 index 000000000..4dbce5300 --- /dev/null +++ b/dumps/scripts/606.cs2 @@ -0,0 +1,15 @@ +void script_606() { + int ivar0; + int ivar1; + createExtraChild(new WidgetPointer(662,74), 5, 0); + setWidgetSize(32, 36, 0, 0); + setWidgetPosition(0, 0, 0, 0); + createExtraChild(new WidgetPointer(747,17), 5, 0); + setWidgetSize(57, 34, 0, 0); + setWidgetPosition(0, 0, 0, 0); + ivar0 = 1194; + ivar1 = 1195; + script_659(43384905, ivar0, ivar1, getItemHashmapData(standart_config_448, 394), cs2method_3408(111, 111, 1283, standart_config_448), 1, -1, 0, -1, 0, -1, 0, globalstring_204, globalstring_205); + script_608(); + return; +} diff --git a/dumps/scripts/607.cs2 b/dumps/scripts/607.cs2 new file mode 100644 index 000000000..1f724076c --- /dev/null +++ b/dumps/scripts/607.cs2 @@ -0,0 +1,16 @@ +void script_607() { + int ivar0; + if (standart_config_1109 == -1) { + globalint_85 = 1; + return; + } + ivar0 = standart_config_1114; + if (ivar0 < 0) { + globalint_85 = 1; + } else { + globalint_85 = standart_config_1114; + } + setWidgetText(new WidgetPointer(105,153), formatNumber(globalint_85, 1) + " gp"); + script_609(); + return; +} diff --git a/dumps/scripts/608.cs2 b/dumps/scripts/608.cs2 new file mode 100644 index 000000000..7d8cc00b7 --- /dev/null +++ b/dumps/scripts/608.cs2 @@ -0,0 +1,17 @@ +void script_608() { + if (setWidgetRegister(new WidgetPointer(662,74), 0)) { + cs2method1305("" + globalstring_204); + cs2method1306("Cast"); + if (((boolean)globalint_1436)) { + setWidgetContextMenuOption(1, "Cast"); + } + } + if (setWidgetRegister(new WidgetPointer(747,17), 0)) { + cs2method1305("" + globalstring_204); + cs2method1306("Cast"); + if (((boolean)globalint_1436)) { + setWidgetContextMenuOption(1, "Cast"); + } + } + return; +} diff --git a/dumps/scripts/609.cs2 b/dumps/scripts/609.cs2 new file mode 100644 index 000000000..d7a8ead2d --- /dev/null +++ b/dumps/scripts/609.cs2 @@ -0,0 +1,9 @@ +void script_609() { + if (globalint_83 <= 0) { + globalint_83 = 100; + } else { + globalint_83 = add(globalint_83, 10); + } + setScriptCallOnGameloop(610, "", new WidgetPointer(105,153)); + return; +} diff --git a/dumps/scripts/61.cs2 b/dumps/scripts/61.cs2 new file mode 100644 index 000000000..2679c0589 --- /dev/null +++ b/dumps/scripts/61.cs2 @@ -0,0 +1,63 @@ +void script_61() { + int ivar0; + ivar0 = 0; + while (ivar0 < 5) { + createExtraChild(new WidgetPointer(260,45), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + if (((boolean)ivar0)) { + setWidgetPosition(0, 43, 0, 0); + } + if (((boolean)ivar0)) { + setWidgetPosition(50, 2, 0, 0); + } + if (ivar0 == 2) { + setWidgetPosition(50, 43, 0, 0); + } + if (ivar0 == 3) { + setWidgetPosition(50, 85, 0, 0); + } + if (ivar0 == 4) { + setWidgetPosition(50, 125, 0, 0); + } + if (getItemIdInSlot(515, ivar0) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(515, ivar0), getItemAmtInSlot(515, ivar0)); + cs2method1305(getItemName(getItemIdInSlot(515, ivar0))); + setWidgetContextMenuOption(1, "Deposit"); + setWidgetShadowColor(new Color(17, 17, 17)); + setWidgetBorderThickness(1); + if (((boolean)ivar0)) { + setWidgetSprite(-1, new WidgetPointer(260,40)); + } + if (((boolean)ivar0)) { + setWidgetSprite(-1, new WidgetPointer(260,36)); + } + if (ivar0 == 2) { + setWidgetSprite(-1, new WidgetPointer(260,37)); + } + if (ivar0 == 3) { + setWidgetSprite(-1, new WidgetPointer(260,38)); + } + if (ivar0 == 4) { + setWidgetSprite(-1, new WidgetPointer(260,39)); + } + } else { + if (((boolean)ivar0)) { + setWidgetSprite(159, new WidgetPointer(260,40)); + } + if (((boolean)ivar0)) { + setWidgetSprite(156, new WidgetPointer(260,36)); + } + if (ivar0 == 2) { + setWidgetSprite(161, new WidgetPointer(260,37)); + } + if (ivar0 == 3) { + setWidgetSprite(163, new WidgetPointer(260,38)); + } + if (ivar0 == 4) { + setWidgetSprite(165, new WidgetPointer(260,39)); + } + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/610.cs2 b/dumps/scripts/610.cs2 new file mode 100644 index 000000000..faba8a2d3 --- /dev/null +++ b/dumps/scripts/610.cs2 @@ -0,0 +1,8 @@ +void script_610() { + if (globalint_83 <= 0) { + setScriptCallOnGameloop(-1, "", new WidgetPointer(105,153)); + script_621(); + } + globalint_83 = subtract(globalint_83, 1); + return; +} diff --git a/dumps/scripts/611.cs2 b/dumps/scripts/611.cs2 new file mode 100644 index 000000000..e9f1ab557 --- /dev/null +++ b/dumps/scripts/611.cs2 @@ -0,0 +1,4 @@ +void script_611(int arg0) { + setWidgetSprite(1160, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/612.cs2 b/dumps/scripts/612.cs2 new file mode 100644 index 000000000..38875cc55 --- /dev/null +++ b/dumps/scripts/612.cs2 @@ -0,0 +1,5 @@ +void script_612(int arg0) { + setWidgetSprite(1153, new WidgetPointer(arg0)); + script_41(6881490); + return; +} diff --git a/dumps/scripts/613.cs2 b/dumps/scripts/613.cs2 new file mode 100644 index 000000000..907d71c9a --- /dev/null +++ b/dumps/scripts/613.cs2 @@ -0,0 +1,4 @@ +void script_613(int arg0) { + setWidgetSprite(1159, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/614.cs2 b/dumps/scripts/614.cs2 new file mode 100644 index 000000000..c368bc0e4 --- /dev/null +++ b/dumps/scripts/614.cs2 @@ -0,0 +1,5 @@ +void script_614(int arg0) { + setWidgetSprite(1152, new WidgetPointer(arg0)); + script_41(6881490); + return; +} diff --git a/dumps/scripts/615.cs2 b/dumps/scripts/615.cs2 new file mode 100644 index 000000000..b8425037b --- /dev/null +++ b/dumps/scripts/615.cs2 @@ -0,0 +1,4 @@ +void script_615(int arg0) { + setWidgetSprite(1149, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/616.cs2 b/dumps/scripts/616.cs2 new file mode 100644 index 000000000..33c50525b --- /dev/null +++ b/dumps/scripts/616.cs2 @@ -0,0 +1,5 @@ +void script_616(int arg0) { + setWidgetSprite(1147, new WidgetPointer(arg0)); + script_41(6881490); + return; +} diff --git a/dumps/scripts/617.cs2 b/dumps/scripts/617.cs2 new file mode 100644 index 000000000..6ee79825e --- /dev/null +++ b/dumps/scripts/617.cs2 @@ -0,0 +1,4 @@ +void script_617(int arg0) { + setWidgetSprite(1166, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/618.cs2 b/dumps/scripts/618.cs2 new file mode 100644 index 000000000..5728ab5ee --- /dev/null +++ b/dumps/scripts/618.cs2 @@ -0,0 +1,5 @@ +void script_618(int arg0) { + setWidgetSprite(1165, new WidgetPointer(arg0)); + script_41(6881490); + return; +} diff --git a/dumps/scripts/619.cs2 b/dumps/scripts/619.cs2 new file mode 100644 index 000000000..e623c7b6e --- /dev/null +++ b/dumps/scripts/619.cs2 @@ -0,0 +1,4 @@ +void script_619(int arg0) { + cs2method2103(255, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/62.cs2 b/dumps/scripts/62.cs2 new file mode 100644 index 000000000..ae957e31f --- /dev/null +++ b/dumps/scripts/62.cs2 @@ -0,0 +1,32 @@ +void script_62(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + ivar4 = divide(add(arg1, arg2), 2); + ivar5 = globalarray_0[ivar4]; + globalarray_0[ivar4] = globalarray_0[arg2]; + globalarray_0[arg2] = ivar5; + ivar6 = arg1; + ivar7 = arg1; + ivar8 = -1; + while (ivar7 < arg2) { + if (stringMethod4107(lower(cs2method_3408(73, 115, arg3, globalarray_0[ivar7])), lower(cs2method_3408(73, 115, arg3, ivar5))) < bitAnd(ivar7, 1)) { + ivar8 = globalarray_0[ivar7]; + globalarray_0[ivar7] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar8; + ivar6 = add(ivar6, 1); + } + ivar7 = add(ivar7, 1); + } + globalarray_0[arg2] = globalarray_0[ivar6]; + globalarray_0[ivar6] = ivar5; + if (arg1 < subtract(ivar6, 1)) { + script_62(0, arg1, subtract(ivar6, 1), arg3); + } + if (add(ivar6, 1) < arg2) { + script_62(0, add(ivar6, 1), arg2, arg3); + } + return; +} diff --git a/dumps/scripts/620.cs2 b/dumps/scripts/620.cs2 new file mode 100644 index 000000000..29d7de1fe --- /dev/null +++ b/dumps/scripts/620.cs2 @@ -0,0 +1,4 @@ +void script_620(int arg0) { + cs2method2103(128, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/621.cs2 b/dumps/scripts/621.cs2 new file mode 100644 index 000000000..648f03de3 --- /dev/null +++ b/dumps/scripts/621.cs2 @@ -0,0 +1,78 @@ +void script_621() { + int ivar0; + string svar0; + flow_0: + ivar0 = 0; + svar0 = "null"; + script_622(); + IF ((standart_config_1112 == -1) || (getGENotStarted(standart_config_1112) && (standart_config_1113 == -1))) + GOTO flow_2 + GOTO flow_3 + flow_2: + script_41(6881490); + setWidgetIsHidden(false, new WidgetPointer(105,17)); + script_628(); + setScriptCallOnItemContainerUpdate(-1, "", new WidgetPointer(105,197)); + globalint_83 = 0; + globalint_82 = 0; + GOTO flow_26 + flow_3: + IF (ivar0 < 6) + GOTO flow_4 + GOTO flow_5 + flow_4: + script_41(((int)script_626(ivar0))); + ivar0 = add(ivar0, 1); + GOTO flow_3 + flow_5: + if (getGENotStarted(standart_config_1112)) { + setWidgetIsHidden(false, new WidgetPointer(105,127)); + setWidgetIsHidden(false, new WidgetPointer(105,197)); + script_594(getGEIsSelling(standart_config_1112), getGEItem(standart_config_1112), getGEItemAmt(standart_config_1112), getGEItemPrice(standart_config_1112)); + script_593(standart_config_1112); + if (((boolean)getGEIsSelling(standart_config_1112))) { + svar0 = "Maximum total cost of purchase"; + } else { + svar0 = "Minimum total value of sale"; + } + setScriptCallOnMouseOver(649, new WidgetPointer(105,185), new WidgetPointer(105,210), svar0, 25, 300, "IIsii", new WidgetPointer(105,185)); + svar0 = formatNumber(multiply(getGEItemAmt(standart_config_1112), getGEItemPrice(standart_config_1112)), 1); + setWidgetText(new WidgetPointer(105,185), svar0 + " gp"); + } else { + setWidgetIsHidden(false, new WidgetPointer(105,127)); + setWidgetIsHidden(false, new WidgetPointer(105,154)); + if (((boolean)standart_config_1113)) { + setWidgetIsHidden(false, new WidgetPointer(105,188)); + if (standart_config_1109 != -1) { + setWidgetIsHidden(true, new WidgetPointer(105,191)); + setWidgetIsHidden(true, new WidgetPointer(105,192)); + } else { + setWidgetIsHidden(false, new WidgetPointer(105,191)); + setWidgetIsHidden(false, new WidgetPointer(105,192)); + } + svar0 = "Maximum total cost of purchase"; + } else { + setWidgetIsHidden(false, new WidgetPointer(105,193)); + if (standart_config_1109 != -1) { + setWidgetIsHidden(true, new WidgetPointer(105,195)); + } else { + setWidgetIsHidden(false, new WidgetPointer(105,195)); + } + svar0 = "Minimum total value of sale"; + } + setScriptCallOnMouseOver(649, new WidgetPointer(105,185), new WidgetPointer(105,210), svar0, 25, 300, "IIsii", new WidgetPointer(105,185)); + if (standart_config_1111 > 0) { + if (standart_config_1110 > divide(2147483647, standart_config_1111)) { + setWidgetText(new WidgetPointer(105,185), "Too high!"); + } else { + svar0 = formatNumber(multiply(standart_config_1110, standart_config_1111), 1); + setWidgetText(new WidgetPointer(105,185), svar0 + " gp"); + } + } else { + setWidgetText(new WidgetPointer(105,185), "0 gp"); + } + script_594(standart_config_1113, standart_config_1109, standart_config_1110, standart_config_1111); + } + flow_26: + return; +} diff --git a/dumps/scripts/622.cs2 b/dumps/scripts/622.cs2 new file mode 100644 index 000000000..1e4b54ee0 --- /dev/null +++ b/dumps/scripts/622.cs2 @@ -0,0 +1,18 @@ +void script_622() { + if (((boolean)standart_config_1118)) { + setWidgetIsHidden(false, new WidgetPointer(105,17)); + setWidgetIsHidden(false, new WidgetPointer(105,127)); + setWidgetIsHidden(false, new WidgetPointer(105,154)); + setWidgetIsHidden(false, new WidgetPointer(105,188)); + setWidgetIsHidden(false, new WidgetPointer(105,193)); + setWidgetIsHidden(false, new WidgetPointer(105,197)); + } else { + setWidgetIsHidden(true, new WidgetPointer(105,17)); + setWidgetIsHidden(true, new WidgetPointer(105,127)); + setWidgetIsHidden(true, new WidgetPointer(105,154)); + setWidgetIsHidden(true, new WidgetPointer(105,188)); + setWidgetIsHidden(true, new WidgetPointer(105,193)); + setWidgetIsHidden(true, new WidgetPointer(105,197)); + } + return; +} diff --git a/dumps/scripts/623.cs2 b/dumps/scripts/623.cs2 new file mode 100644 index 000000000..4f0ffdbaa --- /dev/null +++ b/dumps/scripts/623.cs2 @@ -0,0 +1,3 @@ +WidgetPointer script_623(int arg0) { + return cs2method_3408(105, 73, 1073, arg0); +} diff --git a/dumps/scripts/624.cs2 b/dumps/scripts/624.cs2 new file mode 100644 index 000000000..89cac1cc7 --- /dev/null +++ b/dumps/scripts/624.cs2 @@ -0,0 +1,3 @@ +WidgetPointer script_624(int arg0) { + return cs2method_3408(105, 73, 1077, arg0); +} diff --git a/dumps/scripts/625.cs2 b/dumps/scripts/625.cs2 new file mode 100644 index 000000000..5549fba33 --- /dev/null +++ b/dumps/scripts/625.cs2 @@ -0,0 +1,3 @@ +WidgetPointer script_625(int arg0) { + return cs2method_3408(105, 73, 1075, arg0); +} diff --git a/dumps/scripts/626.cs2 b/dumps/scripts/626.cs2 new file mode 100644 index 000000000..0bce59c13 --- /dev/null +++ b/dumps/scripts/626.cs2 @@ -0,0 +1,3 @@ +WidgetPointer script_626(int arg0) { + return cs2method_3408(105, 73, 1074, arg0); +} diff --git a/dumps/scripts/627.cs2 b/dumps/scripts/627.cs2 new file mode 100644 index 000000000..6d35be7c1 --- /dev/null +++ b/dumps/scripts/627.cs2 @@ -0,0 +1,3 @@ +WidgetPointer script_627(int arg0) { + return cs2method_3408(105, 73, 1076, arg0); +} diff --git a/dumps/scripts/628.cs2 b/dumps/scripts/628.cs2 new file mode 100644 index 000000000..80f745662 --- /dev/null +++ b/dumps/scripts/628.cs2 @@ -0,0 +1,9 @@ +void script_628() { + int ivar0; + ivar0 = 0; + while (ivar0 < 6) { + script_651(ivar0); + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/629.cs2 b/dumps/scripts/629.cs2 new file mode 100644 index 000000000..98493d080 --- /dev/null +++ b/dumps/scripts/629.cs2 @@ -0,0 +1,4 @@ +void script_629(int arg0) { + script_630(arg0); + return; +} diff --git a/dumps/scripts/63.cs2 b/dumps/scripts/63.cs2 new file mode 100644 index 000000000..2fee0878c --- /dev/null +++ b/dumps/scripts/63.cs2 @@ -0,0 +1,4 @@ +void script_63(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_31(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + return; +} diff --git a/dumps/scripts/630.cs2 b/dumps/scripts/630.cs2 new file mode 100644 index 000000000..f9c8715c2 --- /dev/null +++ b/dumps/scripts/630.cs2 @@ -0,0 +1,6 @@ +void script_630(int arg0) { + if (getGENotStarted(arg0) && setWidgetRegister(script_623(arg0), 0)) { + cs2method2103(230); + } + return; +} diff --git a/dumps/scripts/631.cs2 b/dumps/scripts/631.cs2 new file mode 100644 index 000000000..77b85f5db --- /dev/null +++ b/dumps/scripts/631.cs2 @@ -0,0 +1,4 @@ +void script_631(int arg0) { + script_632(arg0); + return; +} diff --git a/dumps/scripts/632.cs2 b/dumps/scripts/632.cs2 new file mode 100644 index 000000000..780c93568 --- /dev/null +++ b/dumps/scripts/632.cs2 @@ -0,0 +1,6 @@ +void script_632(int arg0) { + if (getGENotStarted(arg0) && setWidgetRegister(script_623(arg0), 0)) { + cs2method2103(255); + } + return; +} diff --git a/dumps/scripts/633.cs2 b/dumps/scripts/633.cs2 new file mode 100644 index 000000000..e031d1ca1 --- /dev/null +++ b/dumps/scripts/633.cs2 @@ -0,0 +1,9 @@ +void script_633(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = add(getWidgetShadeColor(new WidgetPointer(arg0)), arg3); + cs2method2103(ivar4, new WidgetPointer(arg0)); + if (ivar4 >= arg2) { + setScriptCallOnGameloop(634, new WidgetPointer(arg0), arg1, arg2, arg3, "Iiii", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/634.cs2 b/dumps/scripts/634.cs2 new file mode 100644 index 000000000..fd128a81d --- /dev/null +++ b/dumps/scripts/634.cs2 @@ -0,0 +1,9 @@ +void script_634(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = subtract(getWidgetShadeColor(new WidgetPointer(arg0)), arg3); + cs2method2103(ivar4, new WidgetPointer(arg0)); + if (ivar4 <= arg1) { + setScriptCallOnGameloop(633, new WidgetPointer(arg0), arg1, arg2, arg3, "Iiii", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/635.cs2 b/dumps/scripts/635.cs2 new file mode 100644 index 000000000..39c1974d7 --- /dev/null +++ b/dumps/scripts/635.cs2 @@ -0,0 +1,4 @@ +void script_635(int arg0) { + script_636(arg0); + return; +} diff --git a/dumps/scripts/636.cs2 b/dumps/scripts/636.cs2 new file mode 100644 index 000000000..77b1c5067 --- /dev/null +++ b/dumps/scripts/636.cs2 @@ -0,0 +1,4 @@ +void script_636(int arg0) { + setWidgetSprite(1171, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/637.cs2 b/dumps/scripts/637.cs2 new file mode 100644 index 000000000..35cdf0291 --- /dev/null +++ b/dumps/scripts/637.cs2 @@ -0,0 +1,4 @@ +void script_637(int arg0) { + script_638(arg0); + return; +} diff --git a/dumps/scripts/638.cs2 b/dumps/scripts/638.cs2 new file mode 100644 index 000000000..8315a08e6 --- /dev/null +++ b/dumps/scripts/638.cs2 @@ -0,0 +1,10 @@ +void script_638(int arg0) { + int ivar1; + setWidgetSprite(1170, new WidgetPointer(arg0)); + ivar1 = 0; + while (ivar1 < 6) { + script_41(((int)script_626(ivar1))); + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/639.cs2 b/dumps/scripts/639.cs2 new file mode 100644 index 000000000..3b7e63917 --- /dev/null +++ b/dumps/scripts/639.cs2 @@ -0,0 +1,4 @@ +void script_639(int arg0) { + script_640(arg0); + return; +} diff --git a/dumps/scripts/64.cs2 b/dumps/scripts/64.cs2 new file mode 100644 index 000000000..f59bad243 --- /dev/null +++ b/dumps/scripts/64.cs2 @@ -0,0 +1,7 @@ +void script_64() { + setWidgetText(new WidgetPointer(532,1), intToStr(bitconfig_3637) + "/" + intToStr(183)); + if (bitconfig_3637 == 183) { + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(532,1)); + } + return; +} diff --git a/dumps/scripts/640.cs2 b/dumps/scripts/640.cs2 new file mode 100644 index 000000000..9c0213a46 --- /dev/null +++ b/dumps/scripts/640.cs2 @@ -0,0 +1,4 @@ +void script_640(int arg0) { + setWidgetSprite(1169, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/641.cs2 b/dumps/scripts/641.cs2 new file mode 100644 index 000000000..fd39fd846 --- /dev/null +++ b/dumps/scripts/641.cs2 @@ -0,0 +1,4 @@ +void script_641(int arg0) { + script_642(arg0); + return; +} diff --git a/dumps/scripts/642.cs2 b/dumps/scripts/642.cs2 new file mode 100644 index 000000000..95c9f5851 --- /dev/null +++ b/dumps/scripts/642.cs2 @@ -0,0 +1,10 @@ +void script_642(int arg0) { + int ivar1; + setWidgetSprite(1168, new WidgetPointer(arg0)); + ivar1 = 0; + while (ivar1 < 6) { + script_41(((int)script_626(ivar1))); + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/643.cs2 b/dumps/scripts/643.cs2 new file mode 100644 index 000000000..947486687 --- /dev/null +++ b/dumps/scripts/643.cs2 @@ -0,0 +1,4 @@ +void script_643(int arg0) { + script_644(arg0); + return; +} diff --git a/dumps/scripts/644.cs2 b/dumps/scripts/644.cs2 new file mode 100644 index 000000000..dc4cfac53 --- /dev/null +++ b/dumps/scripts/644.cs2 @@ -0,0 +1,4 @@ +void script_644(int arg0) { + setWidgetSprite(1749, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/645.cs2 b/dumps/scripts/645.cs2 new file mode 100644 index 000000000..ecdfccf46 --- /dev/null +++ b/dumps/scripts/645.cs2 @@ -0,0 +1,4 @@ +void script_645(int arg0) { + script_646(arg0); + return; +} diff --git a/dumps/scripts/646.cs2 b/dumps/scripts/646.cs2 new file mode 100644 index 000000000..ccb029b11 --- /dev/null +++ b/dumps/scripts/646.cs2 @@ -0,0 +1,5 @@ +void script_646(int arg0) { + setWidgetSprite(1146, new WidgetPointer(arg0)); + script_41(6881490); + return; +} diff --git a/dumps/scripts/647.cs2 b/dumps/scripts/647.cs2 new file mode 100644 index 000000000..2e27e0a23 --- /dev/null +++ b/dumps/scripts/647.cs2 @@ -0,0 +1,15 @@ +void script_647(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + ivar4 = 0; + if (((boolean)globalint_2) && (ivar4 < 6)) { + while (true) { + script_41(((int)script_626(ivar4))); + ivar4 = add(ivar4, 1); + } + } + if (isWidgetHidden(new WidgetPointer(105,17))) { + return; + } + script_39(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/648.cs2 b/dumps/scripts/648.cs2 new file mode 100644 index 000000000..652ba83f9 --- /dev/null +++ b/dumps/scripts/648.cs2 @@ -0,0 +1,15 @@ +void script_648(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + int ivar5; + ivar5 = 0; + if (((boolean)globalint_2) && (ivar5 < 6)) { + while (true) { + script_41(((int)script_626(ivar5))); + ivar5 = add(ivar5, 1); + } + } + if (isWidgetHidden(new WidgetPointer(105,17))) { + return; + } + script_569(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/649.cs2 b/dumps/scripts/649.cs2 new file mode 100644 index 000000000..c34bab706 --- /dev/null +++ b/dumps/scripts/649.cs2 @@ -0,0 +1,7 @@ +void script_649(int arg0,int arg1,int arg2,int arg3,string arg4) { + if (isWidgetHidden(new WidgetPointer(105,17))) { + return; + } + script_39(arg0, arg1, arg2, arg3, arg4); + return; +} diff --git a/dumps/scripts/65.cs2 b/dumps/scripts/65.cs2 new file mode 100644 index 000000000..d77bf7eb5 --- /dev/null +++ b/dumps/scripts/65.cs2 @@ -0,0 +1,4 @@ +void script_65(int arg0,int arg1,int arg2,int arg3) { + setScriptCallOnGameloop(66, arg0, arg1, arg2, new WidgetPointer(arg3), "iiiI", new WidgetPointer(arg3)); + return; +} diff --git a/dumps/scripts/650.cs2 b/dumps/scripts/650.cs2 new file mode 100644 index 000000000..bbc125269 --- /dev/null +++ b/dumps/scripts/650.cs2 @@ -0,0 +1,7 @@ +void script_650(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5) { + if (isWidgetHidden(new WidgetPointer(105,17))) { + return; + } + script_569(arg0, arg1, arg2, arg3, arg4, arg5); + return; +} diff --git a/dumps/scripts/651.cs2 b/dumps/scripts/651.cs2 new file mode 100644 index 000000000..b06924181 --- /dev/null +++ b/dumps/scripts/651.cs2 @@ -0,0 +1,151 @@ +void script_651(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + string svar0; + string svar1; + string svar2; + string svar3; + ivar1 = ((int)script_623(arg0)); + deleteAllExtraChilds(new WidgetPointer(ivar1)); + ivar2 = getWidgetActualWidth(new WidgetPointer(ivar1)); + ivar3 = getWidgetActualHeight(new WidgetPointer(ivar1)); + ivar4 = getGEIsSelling(arg0); + ivar5 = getGEItemAmt(arg0); + ivar6 = getGEItemAmtTransfered(arg0); + ivar7 = getGEItem(arg0); + ivar8 = getGEItemPrice(arg0); + svar0 = ""; + if (getGENotStarted(arg0)) { + svar0 = "Empty"; + } else if (((boolean)getGEIsSelling(arg0))) { + svar0 = "Buy"; + } else { + svar0 = "Sell"; + } + createExtraChild(new WidgetPointer(ivar1), 3, 0); + setWidgetSize(ivar2, ivar3, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 255)); + cs2method2103(255); + script_584(ivar1, svar0); + ivar9 = getExtraChildGap(new WidgetPointer(ivar1)); + setScriptCallOnMouseEntered(629, arg0, "i", new WidgetPointer(ivar1)); + setScriptCallOnMouseExit(631, arg0, "i", new WidgetPointer(ivar1)); + if (getGENotStarted(arg0)) { + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(ivar1)); + setWidgetContextMenuOption(1, new WidgetPointer(ivar1), ""); + setWidgetContextMenuOption(2, new WidgetPointer(ivar1), ""); + if (arg0 >= 2) { + if (isSiteSettingsMembers()) { + setWidgetIsHidden(true, script_624(arg0)); + } else { + setWidgetIsHidden(false, script_624(arg0)); + } + } + } else if (getGEIsDone(arg0)) { + setWidgetContextMenuOption(2, new WidgetPointer(ivar1), "Abort Offer"); + } else { + setWidgetContextMenuOption(2, new WidgetPointer(ivar1), ""); + } + setWidgetContextMenuOption(1, new WidgetPointer(ivar1), "View Offer"); + svar1 = formatNumber(ivar5, 1); + svar2 = formatNumber(ivar8, 1); + ivar10 = 0; + ivar11 = 0; + ivar12 = ((int)script_627(arg0)); + setWidgetIsHidden(true, new WidgetPointer(ivar12)); + ivar13 = ((int)script_626(arg0)); + ivar14 = ((int)script_625(arg0)); + svar3 = ""; + ivar15 = 0; + ivar16 = 0; + if (getGENotStarted(arg0)) { + if ((arg0 < 2) || isSiteSettingsMembers()) { + setWidgetIsHidden(false, new WidgetPointer(ivar12)); + } + } else { + ivar10 = 7; + ivar11 = subtract(ivar3, 30); + if (getGEIsStatus1(arg0)) { + ivar9 = getExtraChildGap(new WidgetPointer(ivar1)); + createExtraChild(new WidgetPointer(ivar1), 4, ivar9); + setWidgetPosition(ivar10, ivar11, 0, 0); + setWidgetSize(subtract(ivar2, 14), 15, 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(219, 216, 132)); + setWidgetText("Submitting..."); + setWidgetTextAlignment(1, 1, 0); + } else { + script_652(ivar10, ivar11, subtract(ivar2, 14), 15, arg0, ivar1, ivar9, ivar13, 1); + } + ivar9 = getExtraChildGap(new WidgetPointer(ivar1)); + createExtraChild(new WidgetPointer(ivar1), 5, ivar9); + ivar9 = add(ivar9, 1); + setWidgetPosition(6, 30, 0, 0); + setWidgetSize(40, 36, 0, 0); + setWidgetSprite(1137); + createExtraChild(new WidgetPointer(ivar1), 5, ivar9); + setWidgetPosition(8, 32, 0, 0); + setWidgetSize(36, 32, 0, 0); + setItemOnWidgetMethod1200(ivar7, ivar5); + setWidgetShadowColor(new Color(0, 0, 0)); + svar0 = formatNumber(ivar5, 1); + setScriptCallOnMouseOver(648, new WidgetPointer(ivar1), ivar9, new WidgetPointer(ivar13), svar0, 25, 106, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(ivar13), "I"); + ivar9 = add(ivar9, 1); + createExtraChild(new WidgetPointer(ivar1), 4, ivar9); + setWidgetPosition(48, 30, 0, 0); + svar0 = getItemName(ivar7); + ivar16 = subtract(ivar2, 53); + ivar15 = getMaxLineWidth(ivar16, 494, svar0); + if (ivar15 > ivar16) { + ivar10 = strLength(svar0); + while ((ivar15 > ivar16) && (ivar10 > 0)) { + ivar10 = subtract(ivar10, 1); + svar0 = substr(0, ivar10, svar0) + "..."; + ivar15 = getMaxLineWidth(ivar16, 494, svar0); + } + } + ivar9 = add(ivar9, 1); + ivar3 = multiply(getLineCount(ivar16, 494, svar0), 11); + if (ivar3 < 22) { + ivar3 = 22; + } + setWidgetSize(ivar16, ivar3, 0, 0); + setWidgetRGB(new Color(204, 153, 0)); + setWidgetFont(494); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(true); + setWidgetText(svar0); + createExtraChild(new WidgetPointer(ivar1), 4, ivar9); + ivar9 = add(ivar9, 1); + setWidgetPosition(48, add(32, ivar3), 0, 0); + setWidgetSize(subtract(ivar2, 53), 15, 0, 0); + setWidgetRGB(new Color(189, 187, 91)); + setWidgetFont(494); + setWidgetTextAlignment(0, 0, 15); + setWidgetUnknownBoolean(true); + setWidgetText(svar2 + " gp"); + createExtraChild(new WidgetPointer(ivar1), 5, ivar9); + setWidgetPosition(4, 2, 2, 0); + setWidgetSize(20, 20, 0, 0); + setWidgetSprite(-1); + ivar9 = add(ivar9, 1); + } + return; +} diff --git a/dumps/scripts/652.cs2 b/dumps/scripts/652.cs2 new file mode 100644 index 000000000..53e718f8d --- /dev/null +++ b/dumps/scripts/652.cs2 @@ -0,0 +1,74 @@ +void script_652(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8) { + int ivar9; + int ivar10; + int ivar11; + int ivar12; + string svar0; + createExtraChild(new WidgetPointer(arg5), 3, arg6); + setWidgetPosition(arg0, arg1, 0, 0); + setWidgetSize(arg2, arg3, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFilled(0); + svar0 = "null"; + if (getGENotStarted(arg4)) { + if (getGEIsDone(arg4)) { + if (getGEItemAmtTransfered(arg4) == getGEItemAmt(arg4)) { + svar0 = "Completed"; + } else { + svar0 = "Aborted"; + } + } else { + svar0 = "In progress"; + } + if (arg7 != -1) { + if (((boolean)arg8)) { + setScriptCallOnMouseOver(648, new WidgetPointer(arg5), arg6, new WidgetPointer(arg7), svar0, 25, 106, "IiIsii"); + } else if (arg8 == 2) { + setScriptCallOnMouseOver(649, new WidgetPointer(arg5), new WidgetPointer(arg7), svar0, 25, 106, "IIsii"); + } else { + setScriptCallOnMouseOver(568, new WidgetPointer(arg5), arg6, new WidgetPointer(arg7), svar0, 25, 106, "IiIsii"); + } + setScriptCallOnMouseExit(40, new WidgetPointer(arg7), "I"); + } + } + ivar9 = add(arg0, 1); + ivar10 = add(arg1, 1); + ivar11 = subtract(arg2, 2); + ivar12 = subtract(arg3, 2); + createExtraChild(new WidgetPointer(arg5), 3, add(arg6, 1)); + setWidgetPosition(ivar9, ivar10, 0, 0); + setWidgetSize(ivar11, ivar12, 0, 0); + setWidgetRGB(new Color(48, 37, 32)); + cs2method2103(100); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg5), 3, add(arg6, 2)); + if (getGENotStarted(arg4)) { + setWidgetPosition(add(arg0, 1), add(arg1, 1), 0, 0); + cs2method2103(0); + setWidgetFilled(1); + if (getGEIsDone(arg4)) { + setWidgetSize(ivar11, ivar12, 0, 0); + if (getGEItemAmtTransfered(arg4) == getGEItemAmt(arg4)) { + setWidgetRGB(new Color(63, 130, 30)); + } else { + setWidgetRGB(new Color(138, 0, 16)); + } + } else { + setWidgetSize(multiplyDivide(getGEItemAmtTransfered(arg4), getGEItemAmt(arg4), ivar11), ivar12, 0, 0); + setWidgetRGB(new Color(198, 139, 1)); + } + } + createExtraChild(new WidgetPointer(arg5), 3, add(arg6, 3)); + setWidgetPosition(ivar9, ivar10, 0, 0); + setWidgetSize(ivar11, 3, 0, 0); + setWidgetFilled(1); + cs2method2103(200); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg5), 3, add(arg6, 4)); + setWidgetPosition(ivar9, add(ivar10, 3), 0, 0); + setWidgetSize(3, subtract(ivar12, 3), 0, 0); + setWidgetFilled(1); + cs2method2103(200); + setWidgetRGB(new Color(0, 0, 0)); + return; +} diff --git a/dumps/scripts/653.cs2 b/dumps/scripts/653.cs2 new file mode 100644 index 000000000..f9092e4ed --- /dev/null +++ b/dumps/scripts/653.cs2 @@ -0,0 +1,5 @@ +void script_653(int arg0) { + script_680(arg0); + script_41(6881490); + return; +} diff --git a/dumps/scripts/654.cs2 b/dumps/scripts/654.cs2 new file mode 100644 index 000000000..70875cb5c --- /dev/null +++ b/dumps/scripts/654.cs2 @@ -0,0 +1,7 @@ +void script_654() { + setScriptCallOnItemContainerUpdate(4113, 523, 524, 525, 526, 527, 528, 540, 7, "Y", new WidgetPointer(109,16)); + setScriptCallOnGrandExchangeUpdate(4113, "", new WidgetPointer(109,16)); + setScriptCallOnConfigChange(4113, 1267, 1269, 2, "Y", new WidgetPointer(109,16)); + script_4114(); + return; +} diff --git a/dumps/scripts/655.cs2 b/dumps/scripts/655.cs2 new file mode 100644 index 000000000..77fb1351a --- /dev/null +++ b/dumps/scripts/655.cs2 @@ -0,0 +1,4 @@ +void script_655() { + script_656(); + return; +} diff --git a/dumps/scripts/656.cs2 b/dumps/scripts/656.cs2 new file mode 100644 index 000000000..c0d2a910a --- /dev/null +++ b/dumps/scripts/656.cs2 @@ -0,0 +1,9 @@ +void script_656() { + if (setWidgetRegister(new WidgetPointer(662,74), 0)) { + deleteExtraChild(); + } + if (setWidgetRegister(new WidgetPointer(747,17), 0)) { + deleteExtraChild(); + } + return; +} diff --git a/dumps/scripts/657.cs2 b/dumps/scripts/657.cs2 new file mode 100644 index 000000000..007142e08 --- /dev/null +++ b/dumps/scripts/657.cs2 @@ -0,0 +1,9 @@ +void script_657(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetBorderThickness(2); + if (bitAnd(getWidgetAMaskBit11to17(), 32) != 0) { + script_71(4); + } + } + return; +} diff --git a/dumps/scripts/658.cs2 b/dumps/scripts/658.cs2 new file mode 100644 index 000000000..cc91c5e54 --- /dev/null +++ b/dumps/scripts/658.cs2 @@ -0,0 +1,6 @@ +void script_658(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + setWidgetBorderThickness(0); + } + return; +} diff --git a/dumps/scripts/659.cs2 b/dumps/scripts/659.cs2 new file mode 100644 index 000000000..219447928 --- /dev/null +++ b/dumps/scripts/659.cs2 @@ -0,0 +1,15 @@ +void script_659(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,string arg12,string arg13) { + if (setWidgetRegister(new WidgetPointer(662,74), 0)) { + setScriptCallOnUse(657, new WidgetPointer(-32768,3), "I"); + setScriptCallOnUseWith(658, new WidgetPointer(-32768,3), "I"); + setScriptCallOnItemContainerUpdate(660, new WidgetPointer(662,74), new WidgetPointer(arg0), arg1, arg2, arg3, arg12, arg13, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, 93, 1, "IIddissoioioioiY"); + setScriptCallOnSkillChange(660, new WidgetPointer(662,74), new WidgetPointer(arg0), arg1, arg2, arg3, arg12, arg13, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, 23, 1, "IIddissoioioioiY"); + setScriptCallOnConfigChange(660, new WidgetPointer(662,74), new WidgetPointer(arg0), arg1, arg2, arg3, arg12, arg13, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, 1175, 448, 2, "IIddissoioioioiY"); + script_661(43384906, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); + } + if (setWidgetRegister(new WidgetPointer(747,17), 0)) { + setScriptCallOnUse(697, new WidgetPointer(747,6), "I"); + setScriptCallOnUseWith(698, new WidgetPointer(747,6), "I"); + } + return; +} diff --git a/dumps/scripts/66.cs2 b/dumps/scripts/66.cs2 new file mode 100644 index 000000000..cd84ad6a9 --- /dev/null +++ b/dumps/scripts/66.cs2 @@ -0,0 +1,4 @@ +void script_66(int arg0,int arg1,int arg2,int arg3) { + setWidget3DRotation(0, 0, bitAnd(add(getWidgetRotateX(new WidgetPointer(arg3)), arg0), 2047), bitAnd(add(getWidgetRotateY(new WidgetPointer(arg3)), arg1), 2047), bitAnd(add(cs2method2607(new WidgetPointer(arg3)), arg2), 2047), getWidget3DDistance(new WidgetPointer(arg3)), new WidgetPointer(arg3)); + return; +} diff --git a/dumps/scripts/660.cs2 b/dumps/scripts/660.cs2 new file mode 100644 index 000000000..f9d3551d0 --- /dev/null +++ b/dumps/scripts/660.cs2 @@ -0,0 +1,4 @@ +void script_660(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,string arg13,string arg14) { + script_661(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + return; +} diff --git a/dumps/scripts/661.cs2 b/dumps/scripts/661.cs2 new file mode 100644 index 000000000..4c6891c26 --- /dev/null +++ b/dumps/scripts/661.cs2 @@ -0,0 +1,59 @@ +void script_661(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,string arg13,string arg14) { + cs2func_script_3357_struct(2,1,0) structdump_0; + cs2func_script_3358_struct(2,1,0) structdump_1; + cs2func_script_3359_struct(2,1,0) structdump_2; + cs2func_script_3360_struct(2,1,0) structdump_3; + cs2func_script_3361_struct(2,1,0) structdump_4; + cs2func_script_3362_struct(2,1,0) structdump_5; + cs2func_script_775_struct(2,1,0) structdump_6; + if (setWidgetRegister(new WidgetPointer(arg0), 0)) { + switch (arg5) { + case 18027: + structdump_0 = script_3357(); + arg5 = structdump_0.intpart_1; + arg13 = structdump_0.stringpart_0; + arg4 = structdump_0.intpart_0; + break; + case 18037: + structdump_1 = script_3358(); + arg5 = structdump_1.intpart_1; + arg13 = structdump_1.stringpart_0; + arg4 = structdump_1.intpart_0; + break; + case 18047: + structdump_2 = script_3359(); + arg5 = structdump_2.intpart_1; + arg13 = structdump_2.stringpart_0; + arg4 = structdump_2.intpart_0; + break; + case 18057: + structdump_3 = script_3360(); + arg5 = structdump_3.intpart_1; + arg13 = structdump_3.stringpart_0; + arg4 = structdump_3.intpart_0; + break; + case 18067: + structdump_4 = script_3361(); + arg5 = structdump_4.intpart_1; + arg13 = structdump_4.stringpart_0; + arg4 = structdump_4.intpart_0; + break; + case 18077: + structdump_5 = script_3362(); + arg5 = structdump_5.intpart_1; + arg13 = structdump_5.stringpart_0; + arg4 = structdump_5.intpart_0; + break; + case 12461: + structdump_6 = script_775(); + arg5 = structdump_6.intpart_1; + arg13 = structdump_6.stringpart_0; + arg4 = structdump_6.intpart_0; + } + arg13 = concat(arg13, " (" + intToStr(bitconfig_4288) + " Special Move points)"); + script_664(43384906, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); + setScriptCallOnMouseOver(10, new WidgetPointer(-32768,3), new WidgetPointer(662,73), arg4, arg13, arg14, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, "IIissoioioioi"); + setScriptCallOnMouseExit(778, new WidgetPointer(662,73), "I"); + } + return; +} diff --git a/dumps/scripts/662.cs2 b/dumps/scripts/662.cs2 new file mode 100644 index 000000000..c56411e77 --- /dev/null +++ b/dumps/scripts/662.cs2 @@ -0,0 +1,139 @@ +void script_662(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + string svar0; + flow_0: + ivar1 = ((int)cs2method_3408(105, 73, 1080, arg0)); + ivar2 = ((int)cs2method_3408(105, 73, 1081, arg0)); + ivar3 = cs2method_3408(105, 118, 1079, arg0); + deleteAllExtraChilds(new WidgetPointer(ivar1)); + ivar4 = getWidgetActualWidth(new WidgetPointer(ivar1)); + ivar5 = getWidgetActualHeight(new WidgetPointer(ivar1)); + ivar6 = subtract(divide(ivar4, 2), 40); + ivar7 = subtract(ivar5, 47); + ivar8 = getItemIdInSlot(ivar3, 0); + ivar9 = getItemIdInSlot(ivar3, 1); + ivar10 = ((int)cs2method_3408(105, 73, 1082, arg0)); + if (ivar10 != -1) { + if (isSiteSettingsMembers() || getGENotStarted(arg0)) { + setWidgetIsHidden(true, new WidgetPointer(ivar10)); + } else { + setWidgetIsHidden(false, new WidgetPointer(ivar10)); + } + } + script_98(ivar1, 0, 1138, subtract(ivar6, 2), subtract(ivar7, 2), 40, 36); + ivar11 = 1140; + IF (ivar10 == -1) + GOTO flow_5 + IF (isWidgetHidden(new WidgetPointer(ivar10)) && setWidgetRegister(new WidgetPointer(ivar1), 0)) + GOTO flow_6 + GOTO flow_14 + flow_5: + flow_6: + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar11, "Iid"); + ivar11 = 1138; + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar11, "Iid"); + if (ivar8 != -1) { + if (getNotedItem(ivar8) != ivar8) { + if (getItemAmtInSlot(ivar3, 0) > 1) { + setWidgetContextMenuOption(1, "Collect-notes"); + setWidgetContextMenuOption(2, "Collect-items"); + } else { + setWidgetContextMenuOption(1, "Collect-items"); + setWidgetContextMenuOption(2, "Collect-notes"); + } + } else { + setWidgetContextMenuOption(1, "Collect"); + } + cs2method1305(getItemName(ivar8)); + } + flow_14: + createExtraChild(new WidgetPointer(ivar1), 5, 1); + setWidgetPosition(ivar6, ivar7, 0, 0); + setWidgetSize(36, 32, 0, 0); + setWidgetShadowColor(new Color(51, 51, 51)); + setItemOnWidgetMethod1200(ivar8, getItemAmtInSlot(ivar3, 0)); + ivar6 = add(divide(ivar4, 2), 4); + script_98(ivar1, 2, 1138, subtract(ivar6, 2), subtract(ivar7, 2), 40, 36); + IF (ivar10 == -1) + GOTO flow_15 + IF (isWidgetHidden(new WidgetPointer(ivar10)) && setWidgetRegister(new WidgetPointer(ivar1), 2)) + GOTO flow_16 + GOTO flow_24 + flow_15: + flow_16: + ivar11 = 1140; + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar11, "Iid"); + ivar11 = 1138; + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar11, "Iid"); + if (ivar9 != -1) { + if (getNotedItem(ivar9) != ivar9) { + if (getItemAmtInSlot(ivar3, 1) > 1) { + setWidgetContextMenuOption(1, "Collect-notes"); + setWidgetContextMenuOption(2, "Collect-items"); + } else { + setWidgetContextMenuOption(1, "Collect-items"); + setWidgetContextMenuOption(2, "Collect-notes"); + } + } else { + setWidgetContextMenuOption(1, "Collect"); + } + cs2method1305(getItemName(ivar9)); + } + flow_24: + createExtraChild(new WidgetPointer(ivar1), 5, 3); + setWidgetPosition(ivar6, ivar7, 0, 0); + setWidgetSize(36, 32, 0, 0); + setWidgetShadowColor(new Color(51, 51, 51)); + setItemOnWidgetMethod1200(ivar9, getItemAmtInSlot(ivar3, 1)); + script_652(11, 11, subtract(ivar4, 65), 16, arg0, ivar1, 4, ivar2, 0); + createExtraChild(new WidgetPointer(ivar1), 3, 9); + ivar6 = subtract(ivar4, 30); + setWidgetPosition(ivar6, 11, 0, 0); + setWidgetSize(18, 16, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(160); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(ivar1), 6, 10); + ivar12 = getGEItem(arg0); + if (getGENotStarted(arg0)) { + setWidgetPosition(ivar6, 11, 0, 0); + setWidgetSize(18, 16, 0, 0); + setItemOnWidgetMethod1200(ivar12, 0); + setScriptCallOnMouseOver(568, new WidgetPointer(ivar1), 10, new WidgetPointer(ivar2), getItemName(ivar12), 25, 106, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(ivar2), "I"); + } + createExtraChild(new WidgetPointer(ivar1), 3, 11); + ivar6 = subtract(ivar4, 50); + setWidgetPosition(ivar6, 11, 0, 0); + setWidgetSize(18, 16, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(160); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(ivar1), 5, 12); + svar0 = "null"; + if (getGENotStarted(arg0)) { + setWidgetPosition(ivar6, 12, 0, 0); + setWidgetSize(16, 14, 0, 0); + if (((boolean)getGEIsSelling(arg0))) { + setWidgetSprite(1157); + svar0 = "Buy"; + } else { + setWidgetSprite(1156); + svar0 = "Sell"; + } + setScriptCallOnMouseOver(568, new WidgetPointer(ivar1), 12, new WidgetPointer(ivar2), svar0, 25, 106, "IiIsii"); + setScriptCallOnMouseExit(40, new WidgetPointer(ivar2), "I"); + } + return; +} diff --git a/dumps/scripts/663.cs2 b/dumps/scripts/663.cs2 new file mode 100644 index 000000000..9e707e665 --- /dev/null +++ b/dumps/scripts/663.cs2 @@ -0,0 +1,24 @@ +void script_663(int arg0,int arg1) { + setWidgetFont(764, new WidgetPointer(arg1)); + setWidgetTextAlignment(1, 1, 0, new WidgetPointer(arg1)); + if (((boolean)bitconfig_4191)) { + setWidgetModel(30184, new WidgetPointer(arg0)); + setWidget3DRotation(0, 0, 0, 0, 0, 365, new WidgetPointer(arg0)); + setWidgetPosition(2, 84, 0, 0, new WidgetPointer(arg0)); + setWidgetSize(509, 156, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(15, 89, 0, 0, new WidgetPointer(arg1)); + setWidgetSize(487, 143, 0, 0, new WidgetPointer(arg1)); + setWidgetRGB(new Color(script_693(43, 26, 11)), new WidgetPointer(arg1)); + } else { + if (((boolean)bitconfig_4191)) { + setWidgetModel(30183, new WidgetPointer(arg0)); + setWidget3DRotation(0, 0, 0, 0, 0, 344, new WidgetPointer(arg0)); + setWidgetPosition(3, 90, 0, 0, new WidgetPointer(arg0)); + setWidgetSize(509, 156, 0, 0, new WidgetPointer(arg0)); + setWidgetPosition(4, 88, 0, 0, new WidgetPointer(arg1)); + setWidgetSize(506, 139, 0, 0, new WidgetPointer(arg1)); + setWidgetRGB(new Color(script_693(85, 85, 65)), new WidgetPointer(arg1)); + } + } + return; +} diff --git a/dumps/scripts/664.cs2 b/dumps/scripts/664.cs2 new file mode 100644 index 000000000..31ddb81a9 --- /dev/null +++ b/dumps/scripts/664.cs2 @@ -0,0 +1,26 @@ +void script_664(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11) { + if (isWidgetHidden(new WidgetPointer(arg0)) && setWidgetRegister(new WidgetPointer(arg0), 0)) { + if ((arg4 != -1) && (script_19(arg4, 43384906) < arg5)) { + setWidgetSprite(arg2); + return; + } + if ((arg6 != -1) && (script_19(arg6, 43384906) < arg7)) { + setWidgetSprite(arg2); + return; + } + if ((arg8 != -1) && (script_19(arg8, 43384906) < arg9)) { + setWidgetSprite(arg2); + return; + } + if ((arg10 != -1) && (script_19(arg10, 43384906) < arg11)) { + setWidgetSprite(arg2); + return; + } + if (getSkillActualLvl(23) < arg3) { + setWidgetSprite(arg2); + } else { + setWidgetSprite(arg1); + } + } + return; +} diff --git a/dumps/scripts/665.cs2 b/dumps/scripts/665.cs2 new file mode 100644 index 000000000..9e033d298 --- /dev/null +++ b/dumps/scripts/665.cs2 @@ -0,0 +1,11 @@ +void script_665(int arg0,int arg1,int arg2,int arg3) { + createExtraChild(new WidgetPointer(arg2), 3, arg3); + cs2method2103(255); + setWidgetFilled(1); + setWidgetRGB(new Color(arg0)); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + arg1 = min(arg1, 250); + setScriptCallOnGameloop(666, add(getClientCycle(), arg1), new WidgetPointer(arg2), arg3, "iIi"); + return; +} diff --git a/dumps/scripts/666.cs2 b/dumps/scripts/666.cs2 new file mode 100644 index 000000000..994b5c89e --- /dev/null +++ b/dumps/scripts/666.cs2 @@ -0,0 +1,14 @@ +void script_666(int arg0,int arg1,int arg2) { + int ivar3; + ivar3 = 0; + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + ivar3 = subtract(arg0, getClientCycle()); + if (ivar3 <= 0) { + cs2method2103(0); + setScriptCallOnGameloop(-1, ""); + return; + } + cs2method2103(max(subtract(cs2method1609(), divide(cs2method1609(), ivar3)), 1)); + } + return; +} diff --git a/dumps/scripts/667.cs2 b/dumps/scripts/667.cs2 new file mode 100644 index 000000000..71b531d6f --- /dev/null +++ b/dumps/scripts/667.cs2 @@ -0,0 +1,10 @@ +void script_667(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetFilled(1); + setWidgetSize(0, 0, 1, 1); + setWidgetPosition(0, 0, 1, 1); + cs2method2103(0); + setScriptCallOnGameloop(668, add(getClientCycle(), arg0), new WidgetPointer(arg1), arg2, "iIi"); + } + return; +} diff --git a/dumps/scripts/668.cs2 b/dumps/scripts/668.cs2 new file mode 100644 index 000000000..b73887bdb --- /dev/null +++ b/dumps/scripts/668.cs2 @@ -0,0 +1,17 @@ +void script_668(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = 0; + ivar4 = 0; + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + ivar3 = subtract(arg0, getClientCycle()); + if (ivar3 <= 0) { + setScriptCallOnGameloop(-1, ""); + deleteExtraChild(); + return; + } + ivar4 = subtract(255, cs2method1609()); + cs2method2103(min(add(cs2method1609(), divide(ivar4, ivar3)), 254)); + } + return; +} diff --git a/dumps/scripts/669.cs2 b/dumps/scripts/669.cs2 new file mode 100644 index 000000000..6c0883e43 --- /dev/null +++ b/dumps/scripts/669.cs2 @@ -0,0 +1,19 @@ +int script_669(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = 0; + ivar4 = 0; + if (((boolean)arg1)) { + return 0; + } + if (((boolean)arg0) || ((boolean)arg2)) { + return 0; + } + if (divide(arg0, arg1) >= divide(2147483647, arg2)) { + return 2147483647; + } + if (mod(multiply(mod(arg0, arg1), mod(arg2, arg1)), arg1) > divide(arg1, 2)) { + return add(multiplyDivide(arg0, arg1, arg2), 1); + } + return multiplyDivide(arg0, arg1, arg2); +} diff --git a/dumps/scripts/67.cs2 b/dumps/scripts/67.cs2 new file mode 100644 index 000000000..1d9c72f76 --- /dev/null +++ b/dumps/scripts/67.cs2 @@ -0,0 +1,4 @@ +void script_67(int arg0,int arg1) { + setWidgetModel(arg1, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/670.cs2 b/dumps/scripts/670.cs2 new file mode 100644 index 000000000..8ad909978 --- /dev/null +++ b/dumps/scripts/670.cs2 @@ -0,0 +1,9 @@ +void script_670() { + int ivar0; + ivar0 = 0; + while (ivar0 < 6) { + script_673(ivar0, 0, 0, 0, 0, -1, 0, 1, 0, -1); + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/671.cs2 b/dumps/scripts/671.cs2 new file mode 100644 index 000000000..f3e1d693f --- /dev/null +++ b/dumps/scripts/671.cs2 @@ -0,0 +1,10 @@ +void script_671() { + int ivar0; + script_673(0, 0, 0, 0, 0, -1, 0, 1, 0, 0); + ivar0 = 1; + while (ivar0 < 6) { + script_673(ivar0, 0, 0, 0, 0, -1, 0, 1, 0, -1); + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/672.cs2 b/dumps/scripts/672.cs2 new file mode 100644 index 000000000..3c932a6f9 --- /dev/null +++ b/dumps/scripts/672.cs2 @@ -0,0 +1,10 @@ +void script_672() { + int ivar0; + script_673(0, 0, 2, 0, 0, 1381, 1281, 0, 0, -1); + ivar0 = 1; + while (ivar0 < 6) { + script_673(ivar0, 0, 0, 0, 0, -1, 0, 1, 0, -1); + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/673.cs2 b/dumps/scripts/673.cs2 new file mode 100644 index 000000000..fdb438b0b --- /dev/null +++ b/dumps/scripts/673.cs2 @@ -0,0 +1,97 @@ +void script_673(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9) { + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + string svar0; + string svar1; + string svar2; + string svar3; + ivar10 = ((int)cs2method_3408(105, 73, 1083, arg0)); + deleteAllExtraChilds(new WidgetPointer(ivar10)); + ivar11 = getWidgetActualWidth(new WidgetPointer(ivar10)); + ivar12 = getWidgetActualHeight(new WidgetPointer(ivar10)); + svar0 = ""; + if (((boolean)arg7)) { + svar0 = "Empty"; + } else if (((boolean)arg1)) { + svar0 = "Buy"; + } else { + svar0 = "Sell"; + } + createExtraChild(new WidgetPointer(ivar10), 3, 0); + setWidgetSize(ivar11, ivar12, 0, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 255)); + cs2method2103(255); + script_584(ivar10, svar0); + ivar13 = getExtraChildGap(new WidgetPointer(ivar10)); + if (((boolean)arg7)) { + if ((arg0 < 2) || isSiteSettingsMembers()) { + if ((arg9 == arg0) && setWidgetRegister(new WidgetPointer(ivar10), 0)) { + cs2method2103(230); + } + } else { + setWidgetIsHidden(false, cs2method_3408(105, 73, 1085, arg0)); + } + } + svar1 = script_46(arg2, ","); + svar2 = script_46(arg6, ","); + ivar14 = 0; + ivar15 = 0; + ivar16 = ((int)cs2method_3408(105, 73, 1084, arg0)); + setWidgetIsHidden(true, new WidgetPointer(ivar16)); + svar3 = ""; + if (((boolean)arg7)) { + if ((arg0 < 2) || isSiteSettingsMembers()) { + if (arg0 == arg9) { + setWidgetIsHidden(false, new WidgetPointer(ivar16)); + } else { + createExtraChild(new WidgetPointer(ivar10), 5, ivar13); + setWidgetSprite(1155); + setWidgetSize(16, 14, 0, 0); + setWidgetPosition(5, 29, 0, 0); + ivar13 = add(ivar13, 1); + } + } + } else { + ivar14 = 7; + ivar15 = subtract(ivar12, 30); + script_674(ivar14, ivar15, subtract(ivar11, 14), 15, arg0, ivar10, ivar13, 1, arg7, arg8, arg2, arg3); + ivar13 = getExtraChildGap(new WidgetPointer(ivar10)); + createExtraChild(new WidgetPointer(ivar10), 5, ivar13); + ivar13 = add(ivar13, 1); + setWidgetPosition(6, 30, 0, 0); + setWidgetSize(40, 36, 0, 0); + setWidgetSprite(1137); + createExtraChild(new WidgetPointer(ivar10), 5, ivar13); + setWidgetPosition(8, 32, 0, 0); + setWidgetSize(36, 32, 0, 0); + setItemOnWidgetMethod1200(arg5, arg2); + setWidgetShadowColor(new Color(0, 0, 0)); + ivar13 = add(ivar13, 1); + createExtraChild(new WidgetPointer(ivar10), 4, ivar13); + ivar13 = add(ivar13, 1); + setWidgetPosition(48, 30, 0, 0); + setWidgetSize(subtract(ivar11, 53), 22, 0, 0); + setWidgetRGB(new Color(204, 153, 0)); + setWidgetFont(494); + setWidgetTextAlignment(0, 0, 0); + setWidgetUnknownBoolean(true); + setWidgetText(getItemName(arg5)); + createExtraChild(new WidgetPointer(ivar10), 4, ivar13); + ivar13 = add(ivar13, 1); + setWidgetPosition(48, 54, 0, 0); + setWidgetSize(subtract(ivar11, 53), 15, 0, 0); + setWidgetRGB(new Color(189, 187, 91)); + setWidgetFont(494); + setWidgetTextAlignment(0, 0, 15); + setWidgetUnknownBoolean(true); + setWidgetText(svar2 + " gp"); + } + return; +} diff --git a/dumps/scripts/674.cs2 b/dumps/scripts/674.cs2 new file mode 100644 index 000000000..613fd431a --- /dev/null +++ b/dumps/scripts/674.cs2 @@ -0,0 +1,51 @@ +void script_674(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11) { + int ivar12; + int ivar13; + int ivar14; + int ivar15; + createExtraChild(new WidgetPointer(arg5), 3, arg6); + setWidgetPosition(arg0, arg1, 0, 0); + setWidgetSize(arg2, arg3, 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetFilled(0); + ivar12 = add(arg0, 1); + ivar13 = add(arg1, 1); + ivar14 = subtract(arg2, 2); + ivar15 = subtract(arg3, 2); + createExtraChild(new WidgetPointer(arg5), 3, add(arg6, 1)); + setWidgetPosition(ivar12, ivar13, 0, 0); + setWidgetSize(ivar14, ivar15, 0, 0); + setWidgetRGB(new Color(48, 37, 32)); + cs2method2103(100); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg5), 3, add(arg6, 2)); + if (((boolean)arg8)) { + setWidgetPosition(add(arg0, 1), add(arg1, 1), 0, 0); + cs2method2103(0); + setWidgetFilled(1); + if (((boolean)arg9)) { + setWidgetSize(ivar14, ivar15, 0, 0); + if (arg11 == arg10) { + setWidgetRGB(new Color(63, 130, 30)); + } else { + setWidgetRGB(new Color(138, 0, 16)); + } + } else { + setWidgetSize(multiplyDivide(arg11, arg10, ivar14), ivar15, 0, 0); + setWidgetRGB(new Color(198, 139, 1)); + } + } + createExtraChild(new WidgetPointer(arg5), 3, add(arg6, 3)); + setWidgetPosition(ivar12, ivar13, 0, 0); + setWidgetSize(ivar14, 3, 0, 0); + setWidgetFilled(1); + cs2method2103(200); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg5), 3, add(arg6, 4)); + setWidgetPosition(ivar12, add(ivar13, 3), 0, 0); + setWidgetSize(3, subtract(ivar15, 3), 0, 0); + setWidgetFilled(1); + cs2method2103(200); + setWidgetRGB(new Color(0, 0, 0)); + return; +} diff --git a/dumps/scripts/675.cs2 b/dumps/scripts/675.cs2 new file mode 100644 index 000000000..d99234ddf --- /dev/null +++ b/dumps/scripts/675.cs2 @@ -0,0 +1,6 @@ +void script_675() { + sendCloseWidgetPacket(); + script_1364(); + globalint_199 = -1; + return; +} diff --git a/dumps/scripts/676.cs2 b/dumps/scripts/676.cs2 new file mode 100644 index 000000000..0d3c33188 --- /dev/null +++ b/dumps/scripts/676.cs2 @@ -0,0 +1,118 @@ +void script_676() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar2 = divide(subtract(getWidgetActualWidth(new WidgetPointer(645,16)), multiply(36, 10)), subtract(10, 1)); + ivar3 = divide(subtract(getWidgetActualHeight(new WidgetPointer(645,16)), 128), 3); + while (((boolean)ivar4)) { + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) != 11760) { + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11846) { + ivar5 = add(ivar5, 2); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11858) { + ivar5 = add(ivar5, 4); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11864) { + ivar5 = add(ivar5, 6); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11872) { + ivar5 = add(ivar5, 6); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 19520) { + ivar5 = add(ivar5, 5); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11902) { + ivar5 = add(ivar5, 8); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11908) { + ivar5 = add(ivar5, 7); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11926) { + ivar5 = add(ivar5, 8); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11942) { + ivar5 = add(ivar5, 6); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11967) { + ivar5 = add(ivar5, 7); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 14525) { + ivar5 = add(ivar5, 9); + } + createExtraChild(new WidgetPointer(645,16), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar2), mod(ivar5, 10)), multiply(divide(ivar5, 10), add(32, ivar3)), 0, 0); + setItemOnWidgetMethod1200(cs2method_3408(105, 79, 1087, add(ivar0, 1)), -1); + cs2method1305("" + getItemName(cs2method_3408(105, 79, 1087, add(ivar0, 1)))); + setWidgetContextMenuOption(1, "Components"); + setWidgetContextMenuOption(2, "Exchange"); + setWidgetContextMenuOption(3, "Examine"); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + ivar0 = add(ivar0, 1); + ivar5 = add(ivar5, 1); + } else { + ivar4 = 1; + } + } + ivar1 = ivar0; + ivar0 = 0; + ivar5 = 0; + ivar4 = 0; + while (((boolean)ivar4)) { + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) != 11760) { + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11846) { + ivar5 = add(ivar5, 2); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11858) { + ivar5 = add(ivar5, 4); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11864) { + ivar5 = add(ivar5, 6); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11872) { + ivar5 = add(ivar5, 6); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 19520) { + ivar5 = add(ivar5, 5); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11902) { + ivar5 = add(ivar5, 8); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11908) { + ivar5 = add(ivar5, 7); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11926) { + ivar5 = add(ivar5, 8); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11942) { + ivar5 = add(ivar5, 6); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 11967) { + ivar5 = add(ivar5, 7); + } + if (cs2method_3408(105, 79, 1087, add(ivar0, 1)) == 14525) { + ivar5 = add(ivar5, 9); + } + createExtraChild(new WidgetPointer(645,16), 5, ivar1); + setWidgetSize(12, 6, 0, 0); + setWidgetPosition(multiply(add(36, ivar2), mod(ivar5, 10)), multiply(divide(ivar5, 10), add(32, ivar3)), 0, 0); + setWidgetSprite(1066); + } else { + ivar4 = 1; + } + ivar0 = add(ivar0, 1); + ivar5 = add(ivar5, 1); + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/677.cs2 b/dumps/scripts/677.cs2 new file mode 100644 index 000000000..059430448 --- /dev/null +++ b/dumps/scripts/677.cs2 @@ -0,0 +1,11 @@ +void script_677(int arg0) { + if (arg0 <= 9) { + setWidgetScrollMax(358, 225, new WidgetPointer(156,2)); + setWidgetIsHidden(true, new WidgetPointer(156,1)); + } else { + setWidgetIsHidden(false, new WidgetPointer(156,1)); + setWidgetScrollMax(358, add(multiply(arg0, 20), 30), new WidgetPointer(156,2)); + script_72(10223617, 10223618, 0); + } + return; +} diff --git a/dumps/scripts/678.cs2 b/dumps/scripts/678.cs2 new file mode 100644 index 000000000..da91d9efb --- /dev/null +++ b/dumps/scripts/678.cs2 @@ -0,0 +1,9 @@ +void script_678() { + script_31(42401811, 42401815, 792, 789, 790, 791, 773, 788); + cs2method2100(0, 0, new WidgetPointer(647,19)); + script_157(42401811, 42401815, 0, 1); + script_31(42401812, 42401816, 792, 789, 790, 791, 773, 788); + cs2method2100(0, 0, new WidgetPointer(647,20)); + script_157(42401812, 42401816, 0, 1); + return; +} diff --git a/dumps/scripts/679.cs2 b/dumps/scripts/679.cs2 new file mode 100644 index 000000000..14b3a31de --- /dev/null +++ b/dumps/scripts/679.cs2 @@ -0,0 +1,24 @@ +void script_679(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + script_98(arg0, 0, 913, 0, 0, 9, 9); + script_98(arg0, 1, 914, ivar3, 0, 9, 9); + script_98(arg0, 2, 915, 0, ivar4, 9, 9); + script_98(arg0, 3, 916, ivar3, ivar4, 9, 9); + script_98(arg0, 4, 917, 0, 9, 9, ivar6); + script_98(arg0, 5, 918, 9, 0, ivar5, 9); + script_98(arg0, 6, 919, ivar3, 9, 9, ivar6); + script_98(arg0, 7, 920, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/68.cs2 b/dumps/scripts/68.cs2 new file mode 100644 index 000000000..cff7ccb2b --- /dev/null +++ b/dumps/scripts/68.cs2 @@ -0,0 +1,4 @@ +void script_68(int arg0,string arg1) { + setWidgetText(new WidgetPointer(arg0), arg1); + return; +} diff --git a/dumps/scripts/680.cs2 b/dumps/scripts/680.cs2 new file mode 100644 index 000000000..13351eeae --- /dev/null +++ b/dumps/scripts/680.cs2 @@ -0,0 +1,25 @@ +void script_680(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + script_98(arg0, 0, 297, 0, 0, ivar1, ivar2); + script_98(arg0, 1, 913, 0, 0, 9, 9); + script_98(arg0, 2, 914, ivar3, 0, 9, 9); + script_98(arg0, 3, 915, 0, ivar4, 9, 9); + script_98(arg0, 4, 916, ivar3, ivar4, 9, 9); + script_98(arg0, 5, 917, 0, 9, 9, ivar6); + script_98(arg0, 6, 918, 9, 0, ivar5, 9); + script_98(arg0, 7, 919, ivar3, 9, 9, ivar6); + script_98(arg0, 8, 920, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/681.cs2 b/dumps/scripts/681.cs2 new file mode 100644 index 000000000..2b822fcf2 --- /dev/null +++ b/dumps/scripts/681.cs2 @@ -0,0 +1,30 @@ +void script_681(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + int ivar6; + int ivar7; + int ivar8; + int ivar9; + deleteAllExtraChilds(new WidgetPointer(arg0)); + cs2method2100(0, 0, new WidgetPointer(arg0)); + deleteAllExtraChilds(new WidgetPointer(arg1)); + deleteAllExtraChilds(new WidgetPointer(arg2)); + setWidgetText(new WidgetPointer(arg4), "Gravestones"); + setWidgetText(new WidgetPointer(arg5), "Please make your selection from the list."); + setWidgetText(new WidgetPointer(arg3), ""); + script_682(arg0, 0, 0, arg2, arg3, arg4, arg5); + ivar6 = 1; + ivar7 = 0; + while (ivar7 <= 26) { + if (isBitFlagged(bitconfig_4191, ivar7)) { + script_682(arg0, add(ivar7, 1), ivar6, arg2, arg3, arg4, arg5); + ivar6 = add(ivar6, 1); + } + ivar7 = add(ivar7, 1); + } + ivar8 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 164), 2); + ivar9 = add(ivar8, multiply(add(146, ivar8), ivar6)); + if (ivar9 > getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetScrollMax(0, ivar9, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + } + return; +} diff --git a/dumps/scripts/682.cs2 b/dumps/scripts/682.cs2 new file mode 100644 index 000000000..3fde8deb5 --- /dev/null +++ b/dumps/scripts/682.cs2 @@ -0,0 +1,46 @@ +void script_682(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + ivar7 = divide(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), 164), 2); + ivar8 = add(ivar7, multiply(add(146, ivar7), arg2)); + createExtraChild(new WidgetPointer(arg0), 3, multiply(arg2, 6)); + setWidgetSize(164, 146, 0, 0); + setWidgetPosition(ivar7, ivar8, 0, 0); + if (bitconfig_4190 == arg1) { + setWidgetRGB(new Color(127, 0, 0)); + } else { + setWidgetRGB(new Color(0, 0, 0)); + } + cs2method2103(200); + setWidgetFilled(1); + setWidgetContextMenuOption(1, "Choose"); + cs2method1305("" + cs2method_3408(105, 115, 1099, arg1) + ""); + setScriptCallOnClickContextMenu(687, arg1, new WidgetPointer(arg0), -2147483643, new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), new WidgetPointer(arg6), "iIiIIII"); + createExtraChild(new WidgetPointer(arg0), 6, add(multiply(arg2, 6), 1)); + setWidgetSize(164, 146, 0, 0); + setWidgetPosition(ivar7, ivar8, 0, 0); + script_683(arg1); + createExtraChild(new WidgetPointer(arg0), 5, add(multiply(arg2, 6), 2)); + setWidgetSize(165, 32, 0, 0); + cs2method1107(1); + setWidgetSprite(1074); + setWidgetPosition(ivar7, subtract(ivar8, 17), 0, 0); + createExtraChild(new WidgetPointer(arg0), 5, add(multiply(arg2, 6), 3)); + setWidgetSize(165, 32, 0, 0); + cs2method1107(1); + setWidgetVFlip(1); + setWidgetSprite(1074); + setWidgetPosition(ivar7, add(ivar8, 130), 0, 0); + createExtraChild(new WidgetPointer(arg0), 5, add(multiply(arg2, 6), 4)); + setWidgetSize(32, 144, 0, 0); + cs2method1107(1); + setWidgetSprite(1075); + setWidgetPosition(subtract(ivar7, 14), add(ivar8, 1), 0, 0); + createExtraChild(new WidgetPointer(arg0), 5, add(multiply(arg2, 6), 5)); + setWidgetSize(32, 144, 0, 0); + cs2method1107(1); + setWidgetHFlip(1); + setWidgetSprite(1075); + setWidgetPosition(add(ivar7, 147), add(ivar8, 1), 0, 0); + return; +} diff --git a/dumps/scripts/683.cs2 b/dumps/scripts/683.cs2 new file mode 100644 index 000000000..a9353e0cd --- /dev/null +++ b/dumps/scripts/683.cs2 @@ -0,0 +1,90 @@ +void script_683(int arg0) { + setWidgetNpcHead(cs2method_3408(105, 110, 1098, arg0)); + if (((boolean)arg0)) { + script_684(0, 63); + setWidget3DRotation(0, 0, 0, 0, 0, 528); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 256, 2, "Iiiiii"); + return; + } + if (((boolean)arg0)) { + script_684(-31, 58); + setWidget3DRotation(0, 0, 0, 0, 0, 400); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 256, 3, "Iiiiii"); + setWidgetAnimation(7375); + return; + } + if (arg0 == 2) { + script_684(0, 58); + setWidget3DRotation(0, 0, 0, 0, 0, 528); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 3) { + script_684(0, 48); + setWidget3DRotation(0, 0, 52, 0, 0, 650); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 4) { + script_684(0, 62); + setWidget3DRotation(0, 0, 35, 0, 0, 528); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 5) { + script_684(-3, 60); + setWidget3DRotation(0, 0, 35, 0, 0, 656); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 512, 3, "Iiiiii"); + return; + } + if (arg0 == 6) { + script_684(0, 68); + setWidget3DRotation(0, 0, 35, 0, 0, 720); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 7) { + script_684(0, 61); + setWidget3DRotation(0, 0, 35, 0, 0, 584); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 8) { + script_684(0, 67); + setWidget3DRotation(0, 0, 35, 0, 0, 840); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 9) { + script_684(0, 65); + setWidget3DRotation(0, 0, 35, 0, 0, 614); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 0, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 10) { + script_684(0, 69); + setWidget3DRotation(0, 0, 35, 0, 0, 755); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 35, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 11) { + script_684(0, 68); + setWidget3DRotation(0, 0, 35, 0, 0, 671); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 35, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 12) { + script_684(0, 70); + setWidget3DRotation(0, 0, 35, 1891, 0, 1277); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 35, 0, 256, 2, "Iiiiii"); + return; + } + if (arg0 == 13) { + script_684(0, 70); + setWidget3DRotation(0, 0, 35, 1891, 0, 1277); + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, 35, 0, 256, 2, "Iiiiii"); + return; + } + setWidget3DRotation(0, 0, 0, 0, 0, 2000); + return; +} diff --git a/dumps/scripts/684.cs2 b/dumps/scripts/684.cs2 new file mode 100644 index 000000000..40c8d9353 --- /dev/null +++ b/dumps/scripts/684.cs2 @@ -0,0 +1,4 @@ +void script_684(int arg0,int arg1) { + setWidgetPosition(add(getWidgetActualX(), arg0), add(getWidgetActualY(), arg1), 0, 0); + return; +} diff --git a/dumps/scripts/685.cs2 b/dumps/scripts/685.cs2 new file mode 100644 index 000000000..dffc64463 --- /dev/null +++ b/dumps/scripts/685.cs2 @@ -0,0 +1,16 @@ +void script_685(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5) { + arg3 = mod(add(arg3, arg5), multiply(arg4, 4)); + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (arg3 <= arg4) { + setWidget3DRotation(0, 0, getWidgetRotateX(), mod(add(arg2, arg3), 2048), cs2method1607(), getWidget3DDistance()); + } else if (arg3 <= multiply(arg4, 2)) { + setWidget3DRotation(0, 0, getWidgetRotateX(), mod(subtract(add(arg2, arg4), subtract(arg3, arg4)), 2048), cs2method1607(), getWidget3DDistance()); + } else if (arg3 <= multiply(arg4, 3)) { + setWidget3DRotation(0, 0, getWidgetRotateX(), script_686(subtract(arg2, subtract(arg3, multiply(arg4, 2))), 2048), cs2method1607(), getWidget3DDistance()); + } else { + setWidget3DRotation(0, 0, getWidgetRotateX(), script_686(add(subtract(arg2, arg4), subtract(arg3, multiply(arg4, 3))), 2048), cs2method1607(), getWidget3DDistance()); + } + setScriptCallOnGameloop(685, new WidgetPointer(-32768,3), -2147483643, arg2, arg3, arg4, arg5, "Iiiiii"); + } + return; +} diff --git a/dumps/scripts/686.cs2 b/dumps/scripts/686.cs2 new file mode 100644 index 000000000..93be6ff0e --- /dev/null +++ b/dumps/scripts/686.cs2 @@ -0,0 +1,6 @@ +int script_686(int arg0,int arg1) { + while (arg0 < 0) { + arg0 = add(arg0, arg1); + } + return arg0; +} diff --git a/dumps/scripts/687.cs2 b/dumps/scripts/687.cs2 new file mode 100644 index 000000000..f3f742177 --- /dev/null +++ b/dumps/scripts/687.cs2 @@ -0,0 +1,81 @@ +void script_687(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + string svar0; + deleteAllExtraChilds(new WidgetPointer(arg3)); + ivar7 = 0; + while (ivar7 <= 27) { + if (setWidgetRegister(new WidgetPointer(arg1), multiply(ivar7, 6))) { + cs2method2103(200); + } + ivar7 = add(ivar7, 1); + } + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + cs2method2103(150); + } + setWidgetText(new WidgetPointer(arg5), cs2method_3408(105, 115, 1099, arg0)); + ivar8 = cs2method_3408(105, 110, 1098, arg0); + ivar9 = 0; + ivar10 = 0; + svar0 = cs2method_3408(105, 115, 1100, arg0); + if (ivar8 != -1) { + ivar7 = getNpcNodemapData(ivar8, 356); + ivar9 = divide(ivar7, 100); + ivar10 = multiplyDivide(mod(ivar7, 100), 100, 60); + if (ivar10 < 10) { + svar0 = svar0 + "
" + "
" + "Initial duration: " + intToStr(ivar9) + ":0" + intToStr(ivar10); + } else { + svar0 = svar0 + "
" + "
" + "Initial duration: " + intToStr(ivar9) + ":" + intToStr(ivar10); + } + } + setWidgetText(new WidgetPointer(arg6), svar0); + ivar7 = cs2method_3408(105, 105, 1101, arg0); + if (ivar7 < 0) { + setWidgetText(new WidgetPointer(arg4), "" + "Unavailable" + ""); + return; + } + if (((boolean)ivar7)) { + svar0 = "(No charge)"; + } else if (((boolean)ivar7)) { + if (getItemAmtInContainer(93, 995) >= 1) { + svar0 = "1 coin"; + } else { + svar0 = "" + "1 coin" + ""; + } + } else if (getItemAmtInContainer(93, 995) >= ivar7) { + svar0 = formatNumber(ivar7, 1) + " coins"; + if (getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg4)), 496, svar0) > subtract(getWidgetActualWidth(new WidgetPointer(arg4)), 5)) { + svar0 = formatNumber(ivar7, 1) + "
" + "coins"; + } + } else { + svar0 = "" + formatNumber(ivar7, 1) + " coins" + ""; + if (getMaxLineWidth(getWidgetActualWidth(new WidgetPointer(arg4)), 496, svar0) > subtract(getWidgetActualWidth(new WidgetPointer(arg4)), 5)) { + svar0 = "" + formatNumber(ivar7, 1) + "" + "
" + "" + "coins" + ""; + } + } + setWidgetText(new WidgetPointer(arg4), concat("Confirm:" + "
", svar0)); + ivar7 = 0; + ivar11 = -1; + while (ivar7 <= 27) { + createExtraChild(new WidgetPointer(arg3), 5, ivar7); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg3)), getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0); + if (ivar7 == arg0) { + setWidgetSprite(833); + setWidgetHidden(0); + ivar11 = 834; + setScriptCallOnMouseEntered(688, new WidgetPointer(-32768,3), -2147483643, ivar11, "Iid"); + ivar11 = 833; + setScriptCallOnMouseExit(688, new WidgetPointer(-32768,3), -2147483643, ivar11, "Iid"); + setWidgetContextMenuOption(1, "Confirm:"); + cs2method1305("" + cs2method_3408(105, 115, 1099, arg0) + ""); + } else { + setWidgetHidden(1); + } + ivar7 = add(ivar7, 1); + } + return; +} diff --git a/dumps/scripts/688.cs2 b/dumps/scripts/688.cs2 new file mode 100644 index 000000000..167bff0bd --- /dev/null +++ b/dumps/scripts/688.cs2 @@ -0,0 +1,6 @@ +void script_688(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + setWidgetSprite(arg2); + } + return; +} diff --git a/dumps/scripts/689.cs2 b/dumps/scripts/689.cs2 new file mode 100644 index 000000000..0e074ca12 --- /dev/null +++ b/dumps/scripts/689.cs2 @@ -0,0 +1,24 @@ +int script_689() { + int ivar0; + ivar0 = 0; + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + ivar0 = add(ivar0, 1); + return ivar0; +} diff --git a/dumps/scripts/69.cs2 b/dumps/scripts/69.cs2 new file mode 100644 index 000000000..91929f80d --- /dev/null +++ b/dumps/scripts/69.cs2 @@ -0,0 +1,4 @@ +void script_69(int arg0,int arg1) { + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/690.cs2 b/dumps/scripts/690.cs2 new file mode 100644 index 000000000..6e5ca1e45 --- /dev/null +++ b/dumps/scripts/690.cs2 @@ -0,0 +1,4 @@ +void script_690() { + setWidgetText(new WidgetPointer(667,25), intToStr(getPlayerWeight()) + " kg"); + return; +} diff --git a/dumps/scripts/691.cs2 b/dumps/scripts/691.cs2 new file mode 100644 index 000000000..3a454614f --- /dev/null +++ b/dumps/scripts/691.cs2 @@ -0,0 +1,5 @@ +void script_691(int arg0,int arg1,int arg2,int arg3) { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + cs2method2103(arg3, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/692.cs2 b/dumps/scripts/692.cs2 new file mode 100644 index 000000000..55129c829 --- /dev/null +++ b/dumps/scripts/692.cs2 @@ -0,0 +1,13 @@ +void script_692(int arg0,int arg1,int arg2) { + switch (bitconfig_5367) { + case 0: + script_1839(1, arg0, arg1, arg2); + break; + case 1: + script_1839(2, arg0, arg1, arg2); + break; + default: + script_1839(0, arg0, arg1, arg2); + } + return; +} diff --git a/dumps/scripts/693.cs2 b/dumps/scripts/693.cs2 new file mode 100644 index 000000000..3d830cbed --- /dev/null +++ b/dumps/scripts/693.cs2 @@ -0,0 +1,114 @@ +int script_693(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + if (arg0 > 255) { + ivar3 = 255; + } else if (arg0 < 0) { + ivar3 = 0; + } else { + ivar3 = arg0; + } + if (arg1 > 255) { + ivar4 = 255; + } else if (arg1 < 0) { + ivar4 = 0; + } else { + ivar4 = arg1; + } + if (arg2 > 255) { + ivar5 = 255; + } else if (arg2 < 0) { + ivar5 = 0; + } else { + ivar5 = arg2; + } + if (isBitFlagged(ivar3, 0)) { + ivar6 = flagBit(ivar6, 16); + } + if (isBitFlagged(ivar3, 1)) { + ivar6 = flagBit(ivar6, 17); + } + if (isBitFlagged(ivar3, 2)) { + ivar6 = flagBit(ivar6, 18); + } + if (isBitFlagged(ivar3, 3)) { + ivar6 = flagBit(ivar6, 19); + } + if (isBitFlagged(ivar3, 4)) { + ivar6 = flagBit(ivar6, 20); + } + if (isBitFlagged(ivar3, 5)) { + ivar6 = flagBit(ivar6, 21); + } + if (isBitFlagged(ivar3, 6)) { + ivar6 = flagBit(ivar6, 22); + } + if (isBitFlagged(ivar3, 7)) { + ivar6 = flagBit(ivar6, 23); + } + if (isBitFlagged(ivar4, 0)) { + ivar7 = flagBit(ivar7, 8); + } + if (isBitFlagged(ivar4, 1)) { + ivar7 = flagBit(ivar7, 9); + } + if (isBitFlagged(ivar4, 2)) { + ivar7 = flagBit(ivar7, 10); + } + if (isBitFlagged(ivar4, 3)) { + ivar7 = flagBit(ivar7, 11); + } + if (isBitFlagged(ivar4, 4)) { + ivar7 = flagBit(ivar7, 12); + } + if (isBitFlagged(ivar4, 5)) { + ivar7 = flagBit(ivar7, 13); + } + if (isBitFlagged(ivar4, 6)) { + ivar7 = flagBit(ivar7, 14); + } + if (isBitFlagged(ivar4, 7)) { + ivar7 = flagBit(ivar7, 15); + } + if (isBitFlagged(ivar5, 0)) { + ivar8 = flagBit(ivar8, 0); + } + if (isBitFlagged(ivar5, 1)) { + ivar8 = flagBit(ivar8, 1); + } + if (isBitFlagged(ivar5, 2)) { + ivar8 = flagBit(ivar8, 2); + } + if (isBitFlagged(ivar5, 3)) { + ivar8 = flagBit(ivar8, 3); + } + if (isBitFlagged(ivar5, 4)) { + ivar8 = flagBit(ivar8, 4); + } + if (isBitFlagged(ivar5, 5)) { + ivar8 = flagBit(ivar8, 5); + } + if (isBitFlagged(ivar5, 6)) { + ivar8 = flagBit(ivar8, 6); + } + if (isBitFlagged(ivar5, 7)) { + ivar8 = flagBit(ivar8, 7); + } + ivar9 = bitOr(ivar6, ivar7); + ivar10 = bitOr(ivar9, ivar8); + return ivar10; +} diff --git a/dumps/scripts/694.cs2 b/dumps/scripts/694.cs2 new file mode 100644 index 000000000..290e6bac6 --- /dev/null +++ b/dumps/scripts/694.cs2 @@ -0,0 +1,36 @@ +int script_694(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int stack_dump0; + cs2func_script_2413_struct(3,0,0) structdump_1; + cs2func_script_2413_struct(3,0,0) structdump_2; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + stack_dump0 = arg0; + structdump_1 = script_2413(stack_dump0); + ivar4 = structdump_1.intpart_2; + ivar3 = structdump_1.intpart_1; + ivar2 = structdump_1.intpart_0; + stack_dump0 = arg1; + structdump_2 = script_2413(stack_dump0); + ivar7 = structdump_2.intpart_2; + ivar6 = structdump_2.intpart_1; + ivar5 = structdump_2.intpart_0; + ivar2 = add(ivar2, ivar5); + ivar3 = add(ivar3, ivar6); + ivar4 = add(ivar4, ivar7); + ivar8 = max(ivar2, max(ivar3, ivar4)); + ivar5 = script_669(255, ivar8, ivar2); + ivar6 = script_669(255, ivar8, ivar3); + ivar7 = script_669(255, ivar8, ivar4); + return script_693(ivar5, ivar6, ivar7); +} diff --git a/dumps/scripts/695.cs2 b/dumps/scripts/695.cs2 new file mode 100644 index 000000000..15ff9107b --- /dev/null +++ b/dumps/scripts/695.cs2 @@ -0,0 +1,5 @@ +void script_695(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6,string arg7,string arg8,string arg9,string arg10,string arg11,string arg12,string arg13,string arg14) { + script_160(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + setScriptCallOnItemContainerUpdate(159, new WidgetPointer(arg0), arg1, arg2, arg3, arg4, new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg1, 1, "IviiiIsssssssssY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/696.cs2 b/dumps/scripts/696.cs2 new file mode 100644 index 000000000..7c3ec7d1c --- /dev/null +++ b/dumps/scripts/696.cs2 @@ -0,0 +1,6 @@ +void script_696() { + script_675(); + messageType0("Cancelled."); + playSoundEffect(1042, 1, 0); + return; +} diff --git a/dumps/scripts/697.cs2 b/dumps/scripts/697.cs2 new file mode 100644 index 000000000..786abbae4 --- /dev/null +++ b/dumps/scripts/697.cs2 @@ -0,0 +1,9 @@ +void script_697(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetBorderThickness(2); + } + if (setWidgetRegister(new WidgetPointer(662,74), 0) && (bitAnd(getWidgetAMaskBit11to17(), 32) != 0)) { + script_71(4); + } + return; +} diff --git a/dumps/scripts/698.cs2 b/dumps/scripts/698.cs2 new file mode 100644 index 000000000..197b18dbb --- /dev/null +++ b/dumps/scripts/698.cs2 @@ -0,0 +1,6 @@ +void script_698(int arg0) { + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetBorderThickness(0); + } + return; +} diff --git a/dumps/scripts/699.cs2 b/dumps/scripts/699.cs2 new file mode 100644 index 000000000..c2834f573 --- /dev/null +++ b/dumps/scripts/699.cs2 @@ -0,0 +1,31 @@ +void script_699(int arg0,int arg1) { + int ivar2; + int ivar3; + ivar2 = 0; + ivar3 = 0; + if (setWidgetRegister(new WidgetPointer(arg1))) { + ivar2 = getWidgetActualX(); + if (arg0 < 5) { + ivar2 = getWidgetActualX(); + if (((boolean)script_700(arg0))) { + ivar3 = -57; + } else if (((boolean)script_700(arg0))) { + ivar3 = -68; + } else { + ivar3 = -79; + } + setWidgetPosition(ivar2, ivar3, 0, 1); + } else { + ivar3 = getWidgetActualY(); + if (((boolean)script_700(arg0))) { + ivar2 = -42; + } else if (((boolean)script_700(arg0))) { + ivar2 = -53; + } else { + ivar2 = -64; + } + setWidgetPosition(ivar2, ivar3, 1, 0); + } + } + return; +} diff --git a/dumps/scripts/7.cs2 b/dumps/scripts/7.cs2 new file mode 100644 index 000000000..a75722852 --- /dev/null +++ b/dumps/scripts/7.cs2 @@ -0,0 +1,18 @@ +void script_7() { + int ivar0; + int ivar1; + ivar0 = subtract(globalint_10, 100); + globalint_10 = 0; + if ((ivar0 < -1) || (ivar0 == script_1305())) { + return; + } + ivar1 = script_8(ivar0); + if (ivar1 == -1) { + return; + } + if (isWidgetOpen(new WidgetPointer(ivar1))) { + return; + } + script_71(ivar0); + return; +} diff --git a/dumps/scripts/70.cs2 b/dumps/scripts/70.cs2 new file mode 100644 index 000000000..2d85e8281 --- /dev/null +++ b/dumps/scripts/70.cs2 @@ -0,0 +1,8 @@ +void script_70() { + if (standart_config_560 < 1) { + setWidgetText(new WidgetPointer(373,1), "You're the Winner!"); + } else { + setWidgetText(new WidgetPointer(373,1), "Foes Remaining: " + intToStr(standart_config_560)); + } + return; +} diff --git a/dumps/scripts/700.cs2 b/dumps/scripts/700.cs2 new file mode 100644 index 000000000..1684358da --- /dev/null +++ b/dumps/scripts/700.cs2 @@ -0,0 +1,21 @@ +int script_700(int arg0) { + switch (arg0) { + case 1: + return bitconfig_1000; + case 2: + return bitconfig_1001; + case 3: + return bitconfig_1002; + case 4: + return bitconfig_1003; + case 5: + return bitconfig_1004; + case 6: + return bitconfig_1005; + case 7: + return bitconfig_1006; + case 8: + return bitconfig_1009; + } + return 0; +} diff --git a/dumps/scripts/701.cs2 b/dumps/scripts/701.cs2 new file mode 100644 index 000000000..3f05e35fd --- /dev/null +++ b/dumps/scripts/701.cs2 @@ -0,0 +1,29 @@ +void script_701() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + while (ivar0 < getItemContainerLength(93)) { + createExtraChild(new WidgetPointer(478,14), 5, ivar0); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(40, ivar1), multiply(40, ivar2), 0, 0); + if (getItemIdInSlot(93, ivar0) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(93, ivar0), getItemAmtInSlot(93, ivar0)); + cs2method1305(getItemName(getItemIdInSlot(93, ivar0))); + setWidgetContextMenuOption(1, "Deposit"); + setWidgetContextMenuOption(2, "Examine"); + setScriptCallOnMouseDragReleased(703, new WidgetPointer(-32768,3), -2147483643, new WidgetPointer(-32768,6), -2147483641, "IiIi"); + cs2method1303(5); + cs2method1304(10); + } + ivar0 = add(ivar0, 1); + ivar1 = add(ivar1, 1); + if (ivar1 == 8) { + ivar1 = 0; + ivar2 = add(ivar2, 1); + } + } + return; +} diff --git a/dumps/scripts/702.cs2 b/dumps/scripts/702.cs2 new file mode 100644 index 000000000..e90a8f4fc --- /dev/null +++ b/dumps/scripts/702.cs2 @@ -0,0 +1,4 @@ +void script_702(int arg0,string arg1) { + script_5337(arg0, arg1); + return; +} diff --git a/dumps/scripts/703.cs2 b/dumps/scripts/703.cs2 new file mode 100644 index 000000000..d8f663547 --- /dev/null +++ b/dumps/scripts/703.cs2 @@ -0,0 +1,13 @@ +void script_703(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + ivar4 = 0; + ivar5 = 0; + if (setWidgetRegister(new WidgetPointer(arg0), arg1) && setWidgetRegister(new WidgetPointer(arg2), arg3)) { + ivar4 = getWidgetActualX(); + ivar5 = getWidgetActualY(); + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0); + setWidgetPosition(ivar4, ivar5, 0, 0); + } + return; +} diff --git a/dumps/scripts/704.cs2 b/dumps/scripts/704.cs2 new file mode 100644 index 000000000..c409541b6 --- /dev/null +++ b/dumps/scripts/704.cs2 @@ -0,0 +1,23 @@ +int script_704(int arg0) { + switch (arg0) { + case 1: + return globalint_203; + case 2: + return globalint_204; + case 3: + return globalint_205; + case 4: + return globalint_206; + case 5: + return globalint_207; + case 6: + return globalint_208; + case 7: + return globalint_209; + case 8: + return globalint_210; + case 9: + return globalint_211; + } + return 0; +} diff --git a/dumps/scripts/705.cs2 b/dumps/scripts/705.cs2 new file mode 100644 index 000000000..5193a2260 --- /dev/null +++ b/dumps/scripts/705.cs2 @@ -0,0 +1,31 @@ +void script_705(int arg0,int arg1) { + switch (arg0) { + case 1: + globalint_203 = arg1; + break; + case 2: + globalint_204 = arg1; + break; + case 3: + globalint_205 = arg1; + break; + case 4: + globalint_206 = arg1; + break; + case 5: + globalint_207 = arg1; + break; + case 6: + globalint_208 = arg1; + break; + case 7: + globalint_209 = arg1; + break; + case 8: + globalint_210 = arg1; + break; + case 9: + globalint_211 = arg1; + } + return; +} diff --git a/dumps/scripts/706.cs2 b/dumps/scripts/706.cs2 new file mode 100644 index 000000000..9440b3436 --- /dev/null +++ b/dumps/scripts/706.cs2 @@ -0,0 +1,26 @@ +int script_706(int arg0) { + if ((arg0 < 1) || (arg0 > 9)) { + return 0; + } + switch (arg0) { + case 1: + return subtract(subtract(subtract(subtract(subtract(subtract(subtract(subtract(516, bitconfig_4885), bitconfig_4886), bitconfig_4887), bitconfig_4888), bitconfig_4889), bitconfig_4890), bitconfig_4891), bitconfig_4892); + case 2: + return bitconfig_4885; + case 3: + return bitconfig_4886; + case 4: + return bitconfig_4887; + case 5: + return bitconfig_4888; + case 6: + return bitconfig_4889; + case 7: + return bitconfig_4890; + case 8: + return bitconfig_4891; + case 9: + return bitconfig_4892; + } + return 0; +} diff --git a/dumps/scripts/707.cs2 b/dumps/scripts/707.cs2 new file mode 100644 index 000000000..edea5af0d --- /dev/null +++ b/dumps/scripts/707.cs2 @@ -0,0 +1,10 @@ +void script_707() { + if (getDisplayMode() >= 2) { + setWidgetPosition(220, 11, 2, 0, new WidgetPointer(680,19)); + } else { + setWidgetPosition(12, 11, 2, 0, new WidgetPointer(680,19)); + } + globalint_215 = 255; + globalint_216 = 0; + return; +} diff --git a/dumps/scripts/708.cs2 b/dumps/scripts/708.cs2 new file mode 100644 index 000000000..bd60730f9 --- /dev/null +++ b/dumps/scripts/708.cs2 @@ -0,0 +1,10 @@ +void script_708(int arg0) { + if (bitconfig_5032 < 80) { + setScriptCallOnGameloop(709, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } else { + if (bitconfig_5331 < 35) { + setScriptCallOnGameloop(709, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/709.cs2 b/dumps/scripts/709.cs2 new file mode 100644 index 000000000..ec32b1c0b --- /dev/null +++ b/dumps/scripts/709.cs2 @@ -0,0 +1,8 @@ +void script_709(int arg0) { + if (getDisplayMode() >= 2) { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(746,9)), getWidgetActualHeight(new WidgetPointer(746,9)), 0, 0, new WidgetPointer(arg0)); + } else { + setWidgetSize(getWidgetActualWidth(new WidgetPointer(548,8)), getWidgetActualHeight(new WidgetPointer(548,8)), 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/71.cs2 b/dumps/scripts/71.cs2 new file mode 100644 index 000000000..6d74a3728 --- /dev/null +++ b/dumps/scripts/71.cs2 @@ -0,0 +1,35 @@ +void script_71(int arg0) { + int ivar1; + ivar1 = script_1305(); + if ((arg0 == -1) && ((boolean)bitconfig_9030)) { + arg0 = 1; + } + globalint_168 = arg0; + if (arg0 == -1) { + if (getDisplayMode() >= 2) { + script_1306(); + } else { + return; + } + } + if (((boolean)script_2709()) && (((arg0 == 9) || (arg0 == 11)) || (arg0 == 10))) { + return; + } + if (ivar1 > -1) { + if (ivar1 == arg0) { + if (getDisplayMode() >= 2) { + script_1306(); + script_1387(arg0); + } else { + return; + } + } else { + script_1306(); + script_1387(arg0); + } + } else { + script_1306(); + script_1387(arg0); + } + return; +} diff --git a/dumps/scripts/710.cs2 b/dumps/scripts/710.cs2 new file mode 100644 index 000000000..5266fb7c8 --- /dev/null +++ b/dumps/scripts/710.cs2 @@ -0,0 +1,6 @@ +void script_710() { + if (globalint_41 == 5) { + script_84(); + } + return; +} diff --git a/dumps/scripts/711.cs2 b/dumps/scripts/711.cs2 new file mode 100644 index 000000000..c69cc8ab7 --- /dev/null +++ b/dumps/scripts/711.cs2 @@ -0,0 +1,160 @@ +void script_711() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + string svar0; + string svar1; + setScriptCallOnClickContextMenu(2023, -2147483644, 1, "ii", new WidgetPointer(916,19)); + setScriptCallOnClickContextMenu(2023, -2147483644, -1, "ii", new WidgetPointer(916,20)); + script_2020(1, 41, 60030981, "1"); + script_2020(5, 41, 60030982, "5"); + script_2020(10, 41, 60030983, "10"); + ivar0 = getWidgetActualWidth(new WidgetPointer(916,9)); + ivar1 = getWidgetActualWidth(new WidgetPointer(905,3)); + ivar2 = subtract(subtract(ivar1, ivar0), add(multiply(41, 3), multiply(5, 2))); + ivar3 = 0; + ivar4 = 0; + svar0 = "All"; + svar1 = "Custom"; + if (((boolean)script_1103())) { + ivar3 = add(max(getTextWidth(494, svar0), getTextWidth(494, svar1)), 20); + script_2020(bitconfig_8094, ivar3, 60030984, svar0); + script_2020(-1, ivar3, 59310086, svar1); + ivar2 = subtract(ivar2, add(multiply(ivar3, 2), 5)); + ivar4 = multiplyDivide(2, 5, ivar2); + setWidgetPosition(ivar4, 0, 0, 1, new WidgetPointer(916,8)); + ivar4 = add(add(ivar4, ivar3), 5); + setWidgetPosition(ivar4, 0, 0, 1, new WidgetPointer(905,6)); + ivar4 = add(ivar4, ivar3); + ivar4 = add(ivar4, divide(ivar2, 5)); + setWidgetPosition(ivar4, 0, 0, 1, new WidgetPointer(916,5)); + ivar4 = add(add(ivar4, 41), 5); + setWidgetPosition(ivar4, 0, 0, 1, new WidgetPointer(916,6)); + ivar4 = add(add(ivar4, 41), 5); + setWidgetPosition(ivar4, 0, 0, 1, new WidgetPointer(916,7)); + } else { + setWidgetIsHidden(true, new WidgetPointer(916,8)); + setWidgetIsHidden(true, new WidgetPointer(905,6)); + ivar4 = divide(ivar2, 2); + setWidgetPosition(ivar4, 0, 0, 1, new WidgetPointer(916,5)); + ivar4 = add(add(ivar4, 41), 5); + setWidgetPosition(ivar4, 0, 0, 1, new WidgetPointer(916,6)); + ivar4 = add(add(ivar4, 41), 5); + setWidgetPosition(ivar4, 0, 0, 1, new WidgetPointer(916,7)); + } + setWidgetPosition(subtract(ivar0, 5), 0, 2, 1, new WidgetPointer(916,2)); + setWidgetPosition(ivar0, 0, 2, 1, new WidgetPointer(905,5)); + ivar5 = subtract(ivar1, ivar0); + if (((boolean)globalint_92)) { + setWidgetSize(add(ivar5, 5), 0, 0, 1, new WidgetPointer(916,2)); + setWidgetSize(ivar5, 0, 0, 1, new WidgetPointer(905,5)); + script_2192(0, ivar5); + } else { + setWidgetSize(5, 0, 0, 1, new WidgetPointer(916,2)); + setWidgetSize(0, 0, 0, 1, new WidgetPointer(905,5)); + script_2192(1, ivar5); + } + setWidgetSize(add(multiply(getWidgetActualX(new WidgetPointer(916,1)), 2), ivar0), 0, 1, 1, new WidgetPointer(916,1)); + svar1 = "Show/Hide additional number buttons"; + ivar6 = 3883; + setScriptCallOnMouseOver(1160, new WidgetPointer(-32768,3), -1, new WidgetPointer(905,29), svar1, 25, 519, "IiIsii", new WidgetPointer(916,21)); + setScriptCallOnMouseExit(299, new WidgetPointer(905,29), new WidgetPointer(916,22), ivar6, "IId", new WidgetPointer(916,21)); + ivar2 = divide(subtract(70, 56), 2); + ivar3 = 0; + if (globalint_755 != -1) { + ivar3 = getMaxLineWidth(2147483647, 494, globalstring_132); + } + if (globalint_756 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_133), ivar3); + } + if (globalint_757 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_134), ivar3); + } + if (globalint_758 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_135), ivar3); + } + if (globalint_759 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_136), ivar3); + } + if (globalint_760 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_137), ivar3); + } + if (globalint_1139 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_280), ivar3); + } + if (globalint_1140 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_281), ivar3); + } + if (globalint_1141 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_282), ivar3); + } + if (globalint_1142 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_283), ivar3); + } + if (globalint_120 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_275), ivar3); + } + if (globalint_185 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_316), ivar3); + } + if (globalint_87 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_317), ivar3); + } + if (globalint_90 != -1) { + ivar3 = max(getMaxLineWidth(2147483647, 494, globalstring_318), ivar3); + } + ivar3 = add(ivar3, 4); + ivar3 = max(add(ivar3, multiply(4, 2)), 56); + ivar4 = script_1883(ivar2, ivar3, ivar2, globalint_755, 59310094, globalstring_132); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_756, 59310095, globalstring_133); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_757, 59310096, globalstring_134); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_758, 59310097, globalstring_135); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_759, 59310098, globalstring_136); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_760, 59310099, globalstring_137); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_1139, 59310100, globalstring_280); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_1140, 59310101, globalstring_281); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_1141, 59310102, globalstring_282); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_1142, 59310103, globalstring_283); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_120, 59310104, globalstring_275); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_185, 59310105, globalstring_316); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_87, 59310106, globalstring_317); + ivar4 = script_1883(ivar4, ivar3, ivar2, globalint_90, 59310107, globalstring_318); + script_2047(); + ivar3 = subtract(getWidgetActualWidth(new WidgetPointer(905,7)), 50); + ivar7 = 3877; + ivar6 = 3879; + ivar8 = 3878; + ivar9 = 3880; + if (ivar4 > ivar3) { + setWidgetSize(ivar3, 0, 0, 1, new WidgetPointer(905,13)); + setWidgetScrollMax(ivar4, 0, new WidgetPointer(905,13)); + cs2method2100(globalint_93, 0, new WidgetPointer(905,13)); + setScriptCallOnMouseOver(2369, new WidgetPointer(-32768,3), ivar8, -4, "Idi", new WidgetPointer(905,11)); + setScriptCallOnMouseOver(2369, new WidgetPointer(-32768,3), ivar9, 4, "Idi", new WidgetPointer(905,12)); + setScriptCallOnMouseDraggedOver(2369, new WidgetPointer(-32768,3), ivar8, -6, "Idi", new WidgetPointer(905,11)); + setScriptCallOnMouseDraggedOver(2369, new WidgetPointer(-32768,3), ivar9, 6, "Idi", new WidgetPointer(905,12)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar7, "Id", new WidgetPointer(905,11)); + setScriptCallOnMouseExit(44, new WidgetPointer(-32768,3), ivar6, "Id", new WidgetPointer(905,12)); + script_2370(); + } else { + setWidgetSize(ivar4, 0, 0, 1, new WidgetPointer(905,13)); + setWidgetScrollMax(0, 0, new WidgetPointer(905,13)); + cs2method2100(0, 0, new WidgetPointer(905,13)); + removeAllEventListeners(new WidgetPointer(905,11)); + removeAllEventListeners(new WidgetPointer(905,12)); + cs2method2103(150, new WidgetPointer(905,11)); + cs2method2103(150, new WidgetPointer(905,12)); + } + setWidgetSprite(ivar7, new WidgetPointer(905,11)); + setWidgetSprite(ivar6, new WidgetPointer(905,12)); + setScriptCallOnGlobalConfigChange(711, 754, 1, "Y", new WidgetPointer(905,2)); + setScriptCallOnConfigChange(2025, 1363, 1, "Y", new WidgetPointer(905,2)); + return; +} diff --git a/dumps/scripts/712.cs2 b/dumps/scripts/712.cs2 new file mode 100644 index 000000000..ee980d73f --- /dev/null +++ b/dumps/scripts/712.cs2 @@ -0,0 +1,4 @@ +void script_712(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + script_713(arg0, arg1, arg2, arg3, arg4, arg5, arg6); + return; +} diff --git a/dumps/scripts/713.cs2 b/dumps/scripts/713.cs2 new file mode 100644 index 000000000..685bc1f21 --- /dev/null +++ b/dumps/scripts/713.cs2 @@ -0,0 +1,60 @@ +void script_713(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + int ivar7; + ivar7 = getItemIdInSlot(541, 0); + if (ivar7 != -1) { + setItemOnWidgetMethod2205(ivar7, 1, new WidgetPointer(arg1)); + setWidgetBorderThickness(1, new WidgetPointer(arg1)); + setWidgetShadowColor(new Color(51, 51, 51), new WidgetPointer(arg1)); + setWidgetContextMenuOption(1, new WidgetPointer(arg1), "Remove"); + setWidgetContextMenuOption(10, new WidgetPointer(arg1), "Examine"); + cs2method2305(new WidgetPointer(arg1), "" + getItemName(ivar7) + ""); + if (((boolean)bitconfig_5026)) { + setWidgetText(new WidgetPointer(arg2), "" + "Until" + "" + "
" + "" + "logout" + ""); + setWidgetNoOptions(new WidgetPointer(arg2)); + setWidgetContextMenuOption(2, new WidgetPointer(arg2), "Specify"); + } else { + if (((boolean)bitconfig_5026)) { + setWidgetText(new WidgetPointer(arg2), "1 hour"); + } else { + setWidgetText(new WidgetPointer(arg2), intToStr(bitconfig_5026) + " hours"); + } + setWidgetContextMenuOption(1, new WidgetPointer(arg2), "'Until logout'"); + setWidgetContextMenuOption(2, new WidgetPointer(arg2), "Edit"); + } + cs2method2305(new WidgetPointer(arg2), "" + "Duration" + ""); + script_679(arg3); + setScriptCallOnMouseOver(94, new WidgetPointer(arg3), "I", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(92, new WidgetPointer(arg3), "I", new WidgetPointer(arg3)); + } else { + setItemOnWidgetMethod2205(-1, 0, new WidgetPointer(arg1)); + setWidgetText(new WidgetPointer(arg2), ""); + setWidgetNoOptions(new WidgetPointer(arg1)); + setWidgetNoOptions(new WidgetPointer(arg2)); + cs2method2305(new WidgetPointer(arg1), ""); + cs2method2305(new WidgetPointer(arg2), ""); + deleteAllExtraChilds(new WidgetPointer(arg3)); + setScriptCallOnMouseOver(-1, "", new WidgetPointer(arg3)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg3)); + } + ivar7 = getItemIdInSlotSplit(541, 0); + if (ivar7 != -1) { + setItemOnWidgetMethod2205(ivar7, 1, new WidgetPointer(arg5)); + setWidgetBorderThickness(1, new WidgetPointer(arg5)); + setWidgetShadowColor(new Color(51, 51, 51), new WidgetPointer(arg5)); + setWidgetContextMenuOption(10, new WidgetPointer(arg5), "Examine"); + cs2method2305(new WidgetPointer(arg5), "" + getItemName(ivar7) + ""); + if (((boolean)bitconfig_5070)) { + setWidgetText(new WidgetPointer(arg6), "" + "Until" + "" + "
" + "" + "logout" + ""); + } else if (((boolean)bitconfig_5070)) { + setWidgetText(new WidgetPointer(arg6), "1 hour"); + } else { + setWidgetText(new WidgetPointer(arg6), intToStr(bitconfig_5070) + " hours"); + } + } else { + setItemOnWidgetMethod2205(-1, 0, new WidgetPointer(arg5)); + setWidgetText(new WidgetPointer(arg6), ""); + setWidgetNoOptions(new WidgetPointer(arg5)); + cs2method2305(new WidgetPointer(arg5), ""); + } + return; +} diff --git a/dumps/scripts/714.cs2 b/dumps/scripts/714.cs2 new file mode 100644 index 000000000..5050fccff --- /dev/null +++ b/dumps/scripts/714.cs2 @@ -0,0 +1,9 @@ +void script_714(int arg0) { + createExtraChild(new WidgetPointer(arg0), 5, 4); + setWidgetSprite(937); + setWidgetSize(10, 32, 0, 0); + setWidgetPosition(0, 0, 1, 1); + setWidgetHidden(0); + setScriptCallOnGameloop(144, new WidgetPointer(arg0), 4, getClientCycle(), add(getClientCycle(), 750), "Iiii"); + return; +} diff --git a/dumps/scripts/715.cs2 b/dumps/scripts/715.cs2 new file mode 100644 index 000000000..36fdc76c5 --- /dev/null +++ b/dumps/scripts/715.cs2 @@ -0,0 +1,46 @@ +int script_715(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int stack_dump0; + cs2func_script_2413_struct(3,0,0) structdump_1; + cs2func_script_2413_struct(3,0,0) structdump_2; + int stack_dump3; + int stack_dump4; + cs2func_script_4127_struct(3,0,0) structdump_5; + ivar4 = 0; + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + stack_dump0 = arg0; + structdump_1 = script_2413(stack_dump0); + ivar6 = structdump_1.intpart_2; + ivar5 = structdump_1.intpart_1; + ivar4 = structdump_1.intpart_0; + stack_dump0 = arg2; + structdump_2 = script_2413(stack_dump0); + ivar9 = structdump_2.intpart_2; + ivar8 = structdump_2.intpart_1; + ivar7 = structdump_2.intpart_0; + ivar4 = add(multiply(ivar4, arg1), multiply(ivar7, arg3)); + ivar5 = add(multiply(ivar5, arg1), multiply(ivar8, arg3)); + ivar6 = add(multiply(ivar6, arg1), multiply(ivar9, arg3)); + ivar10 = max(ivar4, max(ivar5, ivar6)); + ivar7 = script_669(255, ivar10, ivar4); + ivar8 = script_669(255, ivar10, ivar5); + ivar9 = script_669(255, ivar10, ivar6); + stack_dump0 = ivar7; + stack_dump3 = ivar8; + stack_dump4 = ivar9; + structdump_5 = script_4127(stack_dump0, stack_dump3, stack_dump4); + ivar6 = structdump_5.intpart_2; + ivar5 = structdump_5.intpart_1; + ivar4 = structdump_5.intpart_0; + return script_693(ivar7, ivar8, ivar9); +} diff --git a/dumps/scripts/716.cs2 b/dumps/scripts/716.cs2 new file mode 100644 index 000000000..2484a0392 --- /dev/null +++ b/dumps/scripts/716.cs2 @@ -0,0 +1,15 @@ +void script_716(int arg0) { + if (arg0 == 50724876) { + setWidgetModel(41312, new WidgetPointer(774,11)); + playSoundEffect(5111, 1, 0); + } else if (arg0 == 50724877) { + setWidgetModel(41303, new WidgetPointer(774,11)); + playSoundEffect(5112, 1, 0); + } else { + if (arg0 == 50724878) { + setWidgetModel(41305, new WidgetPointer(774,11)); + playSoundEffect(5110, 1, 0); + } + } + return; +} diff --git a/dumps/scripts/717.cs2 b/dumps/scripts/717.cs2 new file mode 100644 index 000000000..0628b79fe --- /dev/null +++ b/dumps/scripts/717.cs2 @@ -0,0 +1,4 @@ +void script_717() { + setWidgetModel(41313, new WidgetPointer(774,11)); + return; +} diff --git a/dumps/scripts/718.cs2 b/dumps/scripts/718.cs2 new file mode 100644 index 000000000..ae4ecdd73 --- /dev/null +++ b/dumps/scripts/718.cs2 @@ -0,0 +1,34 @@ +int script_718(int arg0) { + flow_0: + SWITCH (arg0) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + case 4: + GOTO flow_4 + case 5: + GOTO flow_5 + case 6: + GOTO flow_6 + case 7: + GOTO flow_7 + } + return 16777215; + flow_1: + return 16711680; + flow_2: + return 16744448; + flow_3: + return 16776960; + flow_4: + return 65280; + flow_5: + return 255; + flow_6: + return 4194559; + flow_7: + return 8388863; +} diff --git a/dumps/scripts/719.cs2 b/dumps/scripts/719.cs2 new file mode 100644 index 000000000..0423ec7e9 --- /dev/null +++ b/dumps/scripts/719.cs2 @@ -0,0 +1,5 @@ +void script_719(int arg0,int arg1) { + setItemOnWidgetMethod2205(standart_config_850, 1, new WidgetPointer(arg0)); + setItemOnWidgetMethod2205(standart_config_855, 1, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/72.cs2 b/dumps/scripts/72.cs2 new file mode 100644 index 000000000..9058f4d59 --- /dev/null +++ b/dumps/scripts/72.cs2 @@ -0,0 +1,23 @@ +void script_72(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar3 = getWidgetScrollMaxV(new WidgetPointer(arg1)); + ivar4 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar5 = subtract(ivar4, 32); + ivar6 = 0; + if (ivar3 > 0) { + ivar6 = divide(multiply(ivar5, ivar4), ivar3); + } else { + ivar6 = ivar5; + } + if (ivar6 < 10) { + ivar6 = 10; + } + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + setWidgetSize(16, ivar6, 0, 0); + script_37(arg0, arg1, arg2, 1); + } + return; +} diff --git a/dumps/scripts/720.cs2 b/dumps/scripts/720.cs2 new file mode 100644 index 000000000..8ca2a500b --- /dev/null +++ b/dumps/scripts/720.cs2 @@ -0,0 +1,3 @@ +void script_720() { + return; +} diff --git a/dumps/scripts/721.cs2 b/dumps/scripts/721.cs2 new file mode 100644 index 000000000..516488047 --- /dev/null +++ b/dumps/scripts/721.cs2 @@ -0,0 +1,4 @@ +void script_721() { + script_722(); + return; +} diff --git a/dumps/scripts/722.cs2 b/dumps/scripts/722.cs2 new file mode 100644 index 000000000..e8ee706ac --- /dev/null +++ b/dumps/scripts/722.cs2 @@ -0,0 +1,190 @@ +void script_722() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + opcStruct6203(2,0,0) structdump_0; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + ivar4 = 0; + if (getDisplayMode() >= 2) { + structdump_0 = cs2method6203(); + setWidgetSize(structdump_0.intpart_0, structdump_0.intpart_1, 0, 0, new WidgetPointer(746,9)); + script_1658(); + script_1650(); + ivar0 = getWidgetActualWidth(new WidgetPointer(746,3)); + ivar1 = getWidgetActualHeight(new WidgetPointer(746,3)); + ivar2 = divide(subtract(ivar0, 512), 2); + if (isParent(new WidgetPointer(746,12), 762)) { + if (((boolean)bitconfig_8348)) { + setWidgetSize(10, 10, 0, 0, new WidgetPointer(746,12)); + } else { + ivar4 = subtract(ivar1, 185); + ivar3 = 175; + if (ivar4 > 942) { + ivar4 = 942; + ivar3 = add(divide(subtract(subtract(ivar1, 175), ivar4), 2), 175); + } else { + if (ivar4 < 334) { + ivar4 = 334; + ivar3 = divide(subtract(ivar1, 334), 2); + } + } + setWidgetSize(512, ivar4, 0, 0, new WidgetPointer(746,12)); + script_1654(); + } + } else { + setWidgetSize(512, 334, 0, 0, new WidgetPointer(746,12)); + ivar3 = divide(subtract(ivar1, 334), 2); + } + if (ivar2 < 223) { + ivar2 = 223; + } + if (ivar3 < 165) { + ivar3 = 165; + } + setWidgetPosition(ivar2, ivar3, 2, 2, new WidgetPointer(746,12)); + if (isParent(new WidgetPointer(746,9), 667)) { + setWidgetSize(512, 334, 0, 0, new WidgetPointer(746,9)); + setWidgetPosition(ivar2, max(divide(subtract(ivar1, 334), 2), ivar3), 2, 2, new WidgetPointer(746,9)); + setWidgetSize(219, 164, 1, 1, new WidgetPointer(746,10)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(746,10)); + } else if (isParent(new WidgetPointer(746,10), 667)) { + setWidgetSize(512, 334, 0, 0, new WidgetPointer(746,10)); + setWidgetPosition(ivar2, max(divide(subtract(ivar1, 334), 2), ivar3), 2, 2, new WidgetPointer(746,10)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(746,9)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(746,9)); + } else { + setWidgetSize(219, 164, 1, 1, new WidgetPointer(746,10)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(746,10)); + setWidgetSize(0, 0, 1, 1, new WidgetPointer(746,9)); + setWidgetPosition(0, 0, 1, 1, new WidgetPointer(746,9)); + } + if (ivar0 < 996) { + setWidgetPosition(0, 74, 2, 2, new WidgetPointer(746,79)); + setWidgetSize(240, 74, 0, 0, new WidgetPointer(746,20)); + setWidgetPosition(4, 42, 2, 2, new WidgetPointer(746,30)); + setWidgetPosition(34, 43, 2, 2, new WidgetPointer(746,29)); + setWidgetPosition(64, 43, 2, 2, new WidgetPointer(746,28)); + setWidgetPosition(94, 43, 2, 2, new WidgetPointer(746,27)); + setWidgetPosition(124, 43, 2, 2, new WidgetPointer(746,26)); + setWidgetPosition(154, 43, 2, 2, new WidgetPointer(746,25)); + setWidgetPosition(184, 44, 2, 2, new WidgetPointer(746,131)); + setWidgetPosition(214, 43, 2, 2, new WidgetPointer(746,24)); + setWidgetPosition(0, 37, 2, 2, new WidgetPointer(746,62)); + setWidgetPosition(30, 37, 2, 2, new WidgetPointer(746,61)); + setWidgetPosition(60, 37, 2, 2, new WidgetPointer(746,60)); + setWidgetPosition(90, 37, 2, 2, new WidgetPointer(746,59)); + setWidgetPosition(120, 37, 2, 2, new WidgetPointer(746,58)); + setWidgetPosition(150, 37, 2, 2, new WidgetPointer(746,57)); + setWidgetPosition(180, 37, 2, 2, new WidgetPointer(746,56)); + setWidgetPosition(210, 37, 2, 2, new WidgetPointer(746,55)); + setWidgetPosition(0, 37, 2, 2, new WidgetPointer(746,46)); + setWidgetPosition(30, 37, 2, 2, new WidgetPointer(746,45)); + setWidgetPosition(60, 37, 2, 2, new WidgetPointer(746,44)); + setWidgetPosition(90, 37, 2, 2, new WidgetPointer(746,43)); + setWidgetPosition(120, 37, 2, 2, new WidgetPointer(746,42)); + setWidgetPosition(150, 37, 2, 2, new WidgetPointer(746,41)); + setWidgetPosition(180, 37, 2, 2, new WidgetPointer(746,40)); + setWidgetPosition(210, 37, 2, 2, new WidgetPointer(746,39)); + setWidgetSize(249, 78, 0, 0, new WidgetPointer(746,71)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(746,133)); + setWidgetPosition(30, 0, 0, 0, new WidgetPointer(746,135)); + setWidgetPosition(60, 0, 0, 0, new WidgetPointer(746,137)); + setWidgetPosition(90, 0, 0, 0, new WidgetPointer(746,139)); + setWidgetPosition(120, 0, 0, 0, new WidgetPointer(746,141)); + setWidgetPosition(150, 0, 0, 0, new WidgetPointer(746,143)); + setWidgetPosition(180, 0, 0, 0, new WidgetPointer(746,145)); + setWidgetPosition(210, 0, 0, 0, new WidgetPointer(746,147)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(746,132)); + setWidgetPosition(30, 0, 0, 0, new WidgetPointer(746,134)); + setWidgetPosition(60, 0, 0, 0, new WidgetPointer(746,136)); + setWidgetPosition(90, 0, 0, 0, new WidgetPointer(746,138)); + setWidgetPosition(120, 0, 0, 0, new WidgetPointer(746,140)); + setWidgetPosition(150, 0, 0, 0, new WidgetPointer(746,142)); + setWidgetPosition(180, 0, 0, 0, new WidgetPointer(746,144)); + setWidgetPosition(210, 0, 0, 0, new WidgetPointer(746,146)); + } else { + setWidgetPosition(0, 37, 2, 2, new WidgetPointer(746,79)); + setWidgetSize(480, 37, 0, 0, new WidgetPointer(746,20)); + setWidgetPosition(244, 6, 2, 2, new WidgetPointer(746,30)); + setWidgetPosition(274, 7, 2, 2, new WidgetPointer(746,29)); + setWidgetPosition(305, 7, 2, 2, new WidgetPointer(746,28)); + setWidgetPosition(334, 6, 2, 2, new WidgetPointer(746,27)); + setWidgetPosition(364, 6, 2, 2, new WidgetPointer(746,26)); + setWidgetPosition(394, 6, 2, 2, new WidgetPointer(746,25)); + setWidgetPosition(424, 7, 2, 2, new WidgetPointer(746,131)); + setWidgetPosition(454, 6, 2, 2, new WidgetPointer(746,24)); + setWidgetPosition(240, 0, 2, 2, new WidgetPointer(746,62)); + setWidgetPosition(270, 0, 2, 2, new WidgetPointer(746,61)); + setWidgetPosition(300, 0, 2, 2, new WidgetPointer(746,60)); + setWidgetPosition(330, 0, 2, 2, new WidgetPointer(746,59)); + setWidgetPosition(360, 0, 2, 2, new WidgetPointer(746,58)); + setWidgetPosition(390, 0, 2, 2, new WidgetPointer(746,57)); + setWidgetPosition(420, 0, 2, 2, new WidgetPointer(746,56)); + setWidgetPosition(450, 0, 2, 2, new WidgetPointer(746,55)); + setWidgetPosition(240, 0, 2, 2, new WidgetPointer(746,46)); + setWidgetPosition(270, 0, 2, 2, new WidgetPointer(746,45)); + setWidgetPosition(300, 0, 2, 2, new WidgetPointer(746,44)); + setWidgetPosition(330, 0, 2, 2, new WidgetPointer(746,43)); + setWidgetPosition(360, 0, 2, 2, new WidgetPointer(746,42)); + setWidgetPosition(390, 0, 2, 2, new WidgetPointer(746,41)); + setWidgetPosition(420, 0, 2, 2, new WidgetPointer(746,40)); + setWidgetPosition(450, 0, 2, 2, new WidgetPointer(746,39)); + setWidgetSize(489, 42, 0, 0, new WidgetPointer(746,71)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(746,133)); + setWidgetPosition(30, 0, 0, 0, new WidgetPointer(746,135)); + setWidgetPosition(60, 0, 0, 0, new WidgetPointer(746,137)); + setWidgetPosition(90, 0, 0, 0, new WidgetPointer(746,139)); + setWidgetPosition(120, 0, 0, 0, new WidgetPointer(746,141)); + setWidgetPosition(150, 0, 0, 0, new WidgetPointer(746,143)); + setWidgetPosition(180, 0, 0, 0, new WidgetPointer(746,145)); + setWidgetPosition(210, 0, 0, 0, new WidgetPointer(746,147)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(746,132)); + setWidgetPosition(30, 0, 0, 0, new WidgetPointer(746,134)); + setWidgetPosition(60, 0, 0, 0, new WidgetPointer(746,136)); + setWidgetPosition(90, 0, 0, 0, new WidgetPointer(746,138)); + setWidgetPosition(120, 0, 0, 0, new WidgetPointer(746,140)); + setWidgetPosition(150, 0, 0, 0, new WidgetPointer(746,142)); + setWidgetPosition(180, 0, 0, 0, new WidgetPointer(746,144)); + setWidgetPosition(210, 0, 0, 0, new WidgetPointer(746,146)); + } + script_4251(); + } else if (isParent(new WidgetPointer(548,19), 762) && ((boolean)bitconfig_8348)) { + setWidgetSize(10, 10, 0, 0, new WidgetPointer(548,19)); + cs2method202(35913738); + cs2method202(35913739); + cs2method202(35913740); + cs2method202(35913743); + cs2method202(35913744); + cs2method202(35913745); + cs2method202(35913746); + cs2method202(35913748); + cs2method202(35913749); + cs2method202(35913750); + cs2method202(35913768); + cs2method202(35913736); + cs2method202(35913737); + cs2method202(35913747); + } else { + setWidgetSize(512, 334, 0, 0, new WidgetPointer(548,19)); + cs2method202(35913736); + cs2method202(35913737); + cs2method202(35913738); + cs2method202(35913739); + cs2method202(35913740); + cs2method202(35913743); + cs2method202(35913744); + cs2method202(35913745); + cs2method202(35913746); + cs2method202(35913747); + cs2method202(35913748); + cs2method202(35913749); + cs2method202(35913750); + cs2method202(35913768); + } + return; +} diff --git a/dumps/scripts/723.cs2 b/dumps/scripts/723.cs2 new file mode 100644 index 000000000..060894252 --- /dev/null +++ b/dumps/scripts/723.cs2 @@ -0,0 +1,4 @@ +void script_723() { + script_776(); + return; +} diff --git a/dumps/scripts/724.cs2 b/dumps/scripts/724.cs2 new file mode 100644 index 000000000..2927a8bb1 --- /dev/null +++ b/dumps/scripts/724.cs2 @@ -0,0 +1,45 @@ +void script_724(int arg0,int arg1,int arg2,string arg3) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + if ((arg0 == 48824321) && ((boolean)globalint_616)) { + return; + } + ivar3 = 0; + ivar4 = 0; + ivar5 = 0; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + if (globalint_1 < add(getClientCycle(), 25)) { + if (globalint_1 < getClientCycle()) { + globalint_1 = getClientCycle(); + } + globalint_1 = add(globalint_1, 2); + return; + } + globalint_1 = add(add(getClientCycle(), 25), 10); + if (globalint_2 != 1) { + ivar5 = add(getMaxLineWidth(1000, 495, arg3), 8); + if (getDisplayMode() < 2) { + ivar6 = 35913744; + ivar8 = 35913953; + ivar7 = 35913743; + } else { + ivar6 = 48889872; + ivar8 = 48890023; + ivar7 = 48889871; + } + ivar3 = subtract(add(add(getWidgetActualX(new WidgetPointer(ivar7)), getWidgetActualX(new WidgetPointer(arg0))), arg1), ivar5); + ivar4 = subtract(add(add(getWidgetActualY(new WidgetPointer(ivar7)), getWidgetActualY(new WidgetPointer(arg0))), arg2), 17); + setWidgetIsHidden(false, new WidgetPointer(ivar6)); + setWidgetSize(ivar5, 17, 0, 0, new WidgetPointer(ivar6)); + setWidgetPosition(ivar3, ivar4, 0, 0, new WidgetPointer(ivar6)); + setWidgetText(new WidgetPointer(ivar8), arg3); + globalint_2 = 1; + } + return; +} diff --git a/dumps/scripts/725.cs2 b/dumps/scripts/725.cs2 new file mode 100644 index 000000000..bdf19706e --- /dev/null +++ b/dumps/scripts/725.cs2 @@ -0,0 +1,5 @@ +void script_725(int arg0,int arg1) { + globalint_199 = -1; + setScriptCallOnGlobalConfigChange(726, new WidgetPointer(arg0), new WidgetPointer(arg1), 199, 213, 2, "IIY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/726.cs2 b/dumps/scripts/726.cs2 new file mode 100644 index 000000000..4a540507d --- /dev/null +++ b/dumps/scripts/726.cs2 @@ -0,0 +1,36 @@ +void script_726(int arg0,int arg1) { + if (isWidgetOpen(new WidgetPointer(arg1)) || (globalint_199 == -1)) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + globalint_199 = -1; + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setScriptCallOnWidgetResize(-1, "", new WidgetPointer(arg0)); + return; + } + setScriptCallOnGameloop(727, new WidgetPointer(arg0), new WidgetPointer(arg1), "II", new WidgetPointer(arg0)); + setScriptCallOnWidgetResize(726, new WidgetPointer(arg0), new WidgetPointer(arg1), "II", new WidgetPointer(arg0)); + createExtraChild(new WidgetPointer(arg0), 3, 0); + setWidgetPosition(0, 0, 3, 3); + setWidgetSize(getWidgetActualX(new WidgetPointer(arg1)), 16384, 0, 2); + setWidgetRGB(new Color(globalint_199)); + cs2method2103(globalint_213); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 3, 1); + setWidgetPosition(0, 0, 5, 3); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg0)), add(getWidgetActualX(new WidgetPointer(arg1)), getWidgetActualWidth(new WidgetPointer(arg1)))), 16384, 0, 2); + setWidgetRGB(new Color(globalint_199)); + cs2method2103(globalint_213); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 3, 2); + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg1)), 0, 0, 3); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg1)), getWidgetActualY(new WidgetPointer(arg1)), 0, 0); + setWidgetRGB(new Color(globalint_199)); + cs2method2103(globalint_213); + setWidgetFilled(1); + createExtraChild(new WidgetPointer(arg0), 3, 3); + setWidgetPosition(getWidgetActualX(new WidgetPointer(arg1)), 0, 0, 5); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg1)), subtract(getWidgetActualHeight(new WidgetPointer(arg0)), add(getWidgetActualY(new WidgetPointer(arg1)), getWidgetActualHeight(new WidgetPointer(arg1)))), 0, 0); + setWidgetRGB(new Color(globalint_199)); + cs2method2103(globalint_213); + setWidgetFilled(1); + return; +} diff --git a/dumps/scripts/727.cs2 b/dumps/scripts/727.cs2 new file mode 100644 index 000000000..71e26e32e --- /dev/null +++ b/dumps/scripts/727.cs2 @@ -0,0 +1,10 @@ +void script_727(int arg0,int arg1) { + if (isWidgetOpen(new WidgetPointer(arg1)) && (globalint_199 != -1)) { + return; + } + deleteAllExtraChilds(new WidgetPointer(arg0)); + globalint_199 = -1; + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + setScriptCallOnWidgetResize(-1, "", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/728.cs2 b/dumps/scripts/728.cs2 new file mode 100644 index 000000000..92b91648f --- /dev/null +++ b/dumps/scripts/728.cs2 @@ -0,0 +1,16 @@ +void script_728() { + setWidgetIsHidden(true, new WidgetPointer(780,35)); + setWidgetIsHidden(true, new WidgetPointer(780,36)); + setWidgetIsHidden(true, new WidgetPointer(780,37)); + setWidgetIsHidden(true, new WidgetPointer(780,38)); + setWidgetIsHidden(true, new WidgetPointer(780,39)); + setWidgetIsHidden(true, new WidgetPointer(780,40)); + setWidgetIsHidden(true, new WidgetPointer(780,41)); + setWidgetIsHidden(true, new WidgetPointer(780,42)); + setWidgetIsHidden(true, new WidgetPointer(780,44)); + setWidgetIsHidden(true, new WidgetPointer(780,47)); + setWidgetIsHidden(true, new WidgetPointer(780,48)); + setWidgetIsHidden(true, new WidgetPointer(780,43)); + setWidgetText(new WidgetPointer(780,33), "Use a talisman to display the altar location."); + return; +} diff --git a/dumps/scripts/729.cs2 b/dumps/scripts/729.cs2 new file mode 100644 index 000000000..810e7743f --- /dev/null +++ b/dumps/scripts/729.cs2 @@ -0,0 +1,173 @@ +void script_729() { + script_730(1438, 51052561, 51052560); + script_730(1448, 51052575, 51052574); + script_730(1444, 51052579, 51052578); + script_730(1440, 51052569, 51052568); + script_730(1442, 51052571, 51052570); + script_730(1446, 51052563, 51052562); + script_730(1452, 51052565, 51052564); + script_730(1458, 51052573, 51052572); + script_730(1462, 51052577, 51052576); + script_730(1454, 51052567, 51052566); + script_730(13625, 51052597, 51052596); + script_730(13624, 51052603, 51052602); + script_730(13627, 51052609, 51052608); + script_730(13628, 51052615, 51052614); + script_730(13615, 51052599, 51052598); + script_730(13614, 51052605, 51052604); + script_730(13617, 51052611, 51052610); + script_730(13618, 51052617, 51052616); + script_730(13620, 51052601, 51052600); + script_730(13619, 51052607, 51052606); + script_730(13622, 51052613, 51052612); + script_730(13623, 51052619, 51052618); + script_730(13599, 51052635, 51052634); + script_730(13602, 51052645, 51052644); + script_730(13601, 51052657, 51052656); + script_730(13603, 51052647, 51052646); + script_730(13600, 51052651, 51052650); + script_730(13604, 51052637, 51052636); + script_730(13608, 51052649, 51052648); + script_730(13606, 51052639, 51052638); + script_730(13605, 51052641, 51052640); + script_730(13607, 51052653, 51052652); + script_730(13609, 51052643, 51052642); + script_730(13610, 51052659, 51052658); + script_730(13598, 51052661, 51052660); + script_730(13611, 51052655, 51052654); + script_730(13629, 51052665, 51052664); + script_730(1437, 51052667, 51052666); + setWidgetText(new WidgetPointer(779,123), "1 token each"); + script_730(21517, 51052714, 51052713); + script_730(21516, 51052716, 51052715); + script_730(21518, 51052718, 51052717); + script_730(21519, 51052720, 51052719); + switch (standart_config_1278) { + case 1438: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,16)); + break; + case 1440: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,24)); + break; + case 1442: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,26)); + break; + case 1444: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,34)); + break; + case 1448: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,30)); + break; + case 1446: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,18)); + break; + case 1458: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,28)); + break; + case 1452: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,20)); + break; + case 1462: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,32)); + break; + case 1454: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,22)); + break; + case 13625: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,52)); + break; + case 13624: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,58)); + break; + case 13627: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,64)); + break; + case 13628: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,70)); + break; + case 13615: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,54)); + break; + case 13614: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,60)); + break; + case 13617: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,66)); + break; + case 13618: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,72)); + break; + case 13620: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,56)); + break; + case 13619: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,62)); + break; + case 13622: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,68)); + break; + case 13623: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,74)); + break; + case 13599: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,90)); + break; + case 13601: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,112)); + break; + case 13602: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,100)); + break; + case 13603: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,102)); + break; + case 13600: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,106)); + break; + case 13604: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,92)); + break; + case 13608: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,104)); + break; + case 13606: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,94)); + break; + case 13607: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,108)); + break; + case 13605: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,96)); + break; + case 13609: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,98)); + break; + case 13610: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,114)); + break; + case 13598: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,116)); + break; + case 13611: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,110)); + break; + case 13629: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,120)); + break; + case 1437: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,122)); + break; + case 21517: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,169)); + break; + case 21516: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,171)); + break; + case 21518: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,173)); + break; + case 21519: + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(779,175)); + } + return; +} diff --git a/dumps/scripts/73.cs2 b/dumps/scripts/73.cs2 new file mode 100644 index 000000000..69641cdc8 --- /dev/null +++ b/dumps/scripts/73.cs2 @@ -0,0 +1,564 @@ +void script_73(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + string svar5; + string svar6; + string svar7; + cs2func_script_4590_struct(6,0,0) structdump_0; + cs2func_script_4729_struct(0,8,0) structdump_1; + cs2func_script_4590_struct(6,0,0) structdump_2; + int stack_dump3; + int stack_dump4; + int stack_dump5; + int stack_dump6; + string stack_dump7; + cs2func_script_802_struct(1,1,0) structdump_8; + cs2func_script_802_struct(1,1,0) structdump_9; + if (((boolean)script_2709())) { + if (arg0 == 84) { + messageType0("Chat is not available until your Date of Birth is recorded. Please enter your DOB above."); + } + return; + } + if (arg0 == 9) { + if (globalint_132 != -1) { + script_1052(globalint_133, globalint_132, globalstring_29); + } + return; + } + if (arg0 == 10) { + if (script_1036() != -1) { + script_1051(0, ""); + } + return; + } + ivar2 = 0; + if (arg0 == 80) { + if (strLength(globalstring_276) > 0) { + ivar2 = cs2method3628(globalstring_276); + if (ivar2 != -1) { + if (isMuteRelatedMethod3329() && cs2method6900()) { + globalint_1650 = 1; + globalstring_23 = globalstring_276; + script_1558(0); + return; + } + if (cs2method3627(ivar2)) { + script_1050(1, globalstring_276); + } else { + script_1050(3, globalstring_276); + } + return; + } + if (globalint_183 > subtract(getClientCycle(), 100)) { + return; + } + messageType0("That player is not on your Friends list."); + globalint_183 = getClientCycle(); + return; + } + if (globalint_183 > subtract(getClientCycle(), 100)) { + return; + } + messageType0("You haven't received any messages to which you can reply."); + globalint_183 = getClientCycle(); + return; + } + ivar3 = 0; + ivar4 = 0; + if (arg0 == 11) { + ivar3 = 150; + ivar4 = subtract(getClientCycle(), globalint_158); + if (ivar4 > 1500) { + globalint_159 = 0; + } + if (globalint_159 >= 7) { + ivar3 = 600; + } else if (globalint_159 >= 5) { + ivar3 = 450; + } else { + if (globalint_159 >= 3) { + ivar3 = 300; + } + } + if (ivar4 >= ivar3) { + globalint_158 = getClientCycle(); + globalint_159 = add(globalint_159, 1); + if (globalint_130 != -1) { + script_1069(); + } + return; + } + } + ivar5 = 0; + ivar6 = -1; + ivar7 = -1; + ivar8 = -1; + ivar9 = -1; + ivar10 = -1; + ivar11 = -1; + if (getClientRights() > 0) { + if (arg0 == 104) { + script_75(); + } else { + if (arg0 == 105) { + script_76(); + } + } + } else { + if (cs2method6900() || isMuteRelatedMethod3329()) { + if (arg0 == 84) { + structdump_0 = script_4590(); + ivar11 = structdump_0.intpart_5; + ivar10 = structdump_0.intpart_4; + ivar9 = structdump_0.intpart_3; + ivar8 = structdump_0.intpart_2; + ivar7 = structdump_0.intpart_1; + ivar6 = structdump_0.intpart_0; + if (globalint_41 == 4) { + script_1050(2, ""); + } + if (globalint_41 == 7) { + if (ivar6 >= 0) { + if (ivar7 >= ivar8) { + script_1050(8, ""); + return; + } + message(43, 0, "Your rank is not high enough to talk in your clan chat."); + return; + } + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Clan Chat channel."); + return; + } + script_1050(0, ""); + return; + } + return; + } + } + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + svar4 = ""; + svar5 = ""; + svar6 = ""; + svar7 = ""; + structdump_1 = script_4729(); + svar7 = structdump_1.stringpart_7; + svar3 = structdump_1.stringpart_6; + svar6 = structdump_1.stringpart_5; + svar2 = structdump_1.stringpart_4; + svar5 = structdump_1.stringpart_3; + svar1 = structdump_1.stringpart_2; + svar4 = structdump_1.stringpart_1; + svar0 = structdump_1.stringpart_0; + switch (arg0) { + case 84: + structdump_2 = script_4590(); + ivar11 = structdump_2.intpart_5; + ivar10 = structdump_2.intpart_4; + ivar9 = structdump_2.intpart_3; + ivar8 = structdump_2.intpart_2; + ivar7 = structdump_2.intpart_1; + ivar6 = structdump_2.intpart_0; + if (strLength(globalstring_1) <= 0) { + globalint_1650 = 0; + globalstring_1 = ""; + if (globalint_41 == 4) { + script_1050(2, ""); + return; + } + if (globalint_41 == 7) { + if (ivar6 >= 0) { + if (ivar7 >= ivar8) { + script_1050(8, ""); + return; + } + message(43, 0, "Your rank is not high enough to talk in your clan chat."); + return; + } + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Clan Chat channel."); + return; + } + script_1050(0, ""); + return; + } + if (((boolean)stringMethod4107("/", globalstring_1))) { + globalstring_1 = ""; + script_1050(2, ""); + return; + } + if (((boolean)stringMethod4107("//", globalstring_1))) { + globalstring_1 = ""; + if (ivar6 >= 0) { + if (ivar7 >= ivar8) { + script_1050(8, ""); + return; + } + message(43, 0, "Your rank is not high enough to talk in your clan chat."); + return; + } + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Clan Chat channel."); + return; + } + if (((boolean)stringMethod4107("///", globalstring_1))) { + globalstring_1 = ""; + if (ivar9 >= 0) { + if (ivar10 >= ivar11) { + script_1050(10, ""); + return; + } + message(43, 0, "Guests cannot chat in this Clan Chat channel."); + return; + } + globalint_41 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't a guest in a visited Clan Chat channel."); + return; + } + if ((getClientRights() > 0) && ((boolean)strIndexof(0, globalstring_1, "::"))) { + messageType0("" + "Use the reverse apostrophe (`) key to open the console to enter that command."); + messageType0("" + "It is usually located under the ESC key."); + globalstring_1 = ""; + script_1558(0); + return; + } + if (((boolean)stringMethod4107(svar1, lower(globalstring_1))) || ((boolean)stringMethod4107(svar5, lower(globalstring_1)))) { + globalint_1650 = 0; + globalint_1651 = 2; + cs2method5006(2); + globalstring_1 = ""; + globalint_1028 = 0; + globalint_1652 = 1; + script_1558(0); + return; + } + if (((boolean)stringMethod4107(svar3, lower(globalstring_1))) || ((boolean)stringMethod4107(svar7, lower(globalstring_1)))) { + globalint_1650 = 0; + globalint_1651 = 3; + cs2method5006(3); + globalstring_1 = ""; + globalint_1028 = 0; + globalint_1652 = 1; + script_1558(0); + return; + } + if (((boolean)stringMethod4107(svar2, lower(globalstring_1))) || ((boolean)stringMethod4107(svar6, lower(globalstring_1)))) { + globalint_1650 = 0; + globalint_1651 = 1; + cs2method5006(1); + globalstring_1 = ""; + globalint_1028 = 0; + globalint_1652 = 1; + script_1558(0); + return; + } + if (((boolean)stringMethod4107(svar0, lower(globalstring_1))) || ((boolean)stringMethod4107(svar4, lower(globalstring_1)))) { + globalint_1650 = 0; + globalint_1651 = 0; + cs2method5006(0); + globalstring_1 = ""; + globalint_1028 = 0; + globalint_1652 = 1; + script_1558(0); + return; + } + if (((boolean)globalint_1650) && (stringMethod4107(substr(0, 1, globalstring_1), "/") != 0)) { + cs2method5009(globalstring_23, globalstring_1); + globalint_1650 = 0; + globalstring_1 = ""; + return; + } + globalint_1650 = 0; + if (((boolean)globalint_1651)) { + if (((boolean)script_4730(ivar9, ivar10, ivar11, ivar6, ivar7, ivar8))) { + if (((boolean)stringMethod4107("", cs2method3611()))) { + globalstring_1 = ""; + globalint_41 = 0; + globalint_1651 = 0; + cs2method5006(0); + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Friends Chat channel."); + return; + } + cs2method5006(1); + cs2method5008(globalstring_1); + globalstring_1 = ""; + } + } else if (globalint_1651 == 2) { + if (((boolean)script_4730(ivar9, ivar10, ivar11, ivar6, ivar7, ivar8))) { + if (ivar6 >= 0) { + if (ivar7 >= ivar8) { + cs2method5006(2); + cs2method5008(globalstring_1); + globalstring_1 = ""; + } else { + message(43, 0, "Your rank is not high enough to talk in your clan chat."); + globalstring_1 = ""; + cs2method5006(0); + globalint_1651 = 0; + script_1558(0); + return; + } + } else { + globalint_41 = 0; + globalint_1651 = 0; + cs2method5006(0); + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Clan Chat channel."); + globalstring_1 = ""; + return; + } + } + } else if (globalint_1651 == 3) { + if (((boolean)script_4730(ivar9, ivar10, ivar11, ivar6, ivar7, ivar8))) { + if (ivar9 >= 0) { + if (ivar10 >= ivar11) { + if (((boolean)stringMethod4107(globalstring_1, ""))) { + return; + } + cs2method5006(3); + cs2method5008(globalstring_1); + globalstring_1 = ""; + } else { + message(43, 0, "Guests cannot chat in this Clan Chat channel."); + globalstring_1 = ""; + cs2method5006(0); + globalint_1651 = 0; + script_1558(0); + return; + } + } else { + globalint_41 = 0; + cs2method5006(0); + globalint_1651 = 0; + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't a guest in a visited Clan Chat channel."); + globalstring_1 = ""; + return; + } + } + } else { + if (((boolean)stringMethod4107(substr(0, 1, globalstring_1), "/"))) { + cs2method5006(1); + globalstring_1 = substr(1, strLength(globalstring_1), globalstring_1); + if (((boolean)stringMethod4107(globalstring_1, ""))) { + return; + } + if (((boolean)stringMethod4107(substr(0, 1, globalstring_1), "/"))) { + globalstring_1 = substr(1, strLength(globalstring_1), globalstring_1); + if (((boolean)stringMethod4107(substr(0, 1, globalstring_1), "/"))) { + if (ivar9 >= 0) { + if (ivar10 >= ivar11) { + cs2method5006(3); + globalstring_1 = substr(1, strLength(globalstring_1), globalstring_1); + if (((boolean)stringMethod4107(globalstring_1, ""))) { + return; + } + } else { + message(43, 0, "Guests cannot chat in this Clan Chat channel."); + globalstring_1 = ""; + cs2method5006(0); + script_1558(0); + return; + } + } else { + globalint_41 = 0; + cs2method5006(0); + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't a guest in a visited Clan Chat channel."); + globalstring_1 = ""; + return; + } + } else if (ivar6 >= 0) { + if (ivar7 >= ivar8) { + cs2method5006(2); + if (((boolean)stringMethod4107(globalstring_1, ""))) { + return; + } + } else { + message(43, 0, "Your rank is not high enough to talk in your clan chat."); + globalstring_1 = ""; + cs2method5006(0); + script_1558(0); + return; + } + } else { + globalint_41 = 0; + cs2method5006(0); + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Clan Chat channel."); + globalstring_1 = ""; + return; + } + } else { + if (((boolean)stringMethod4107("", cs2method3611()))) { + globalstring_1 = ""; + globalint_41 = 0; + globalint_1651 = 0; + cs2method5006(0); + script_181(0); + script_178(); + script_84(); + script_89(); + messageType0("You aren't in a Friends Chat channel."); + return; + } + cs2method5006(1); + } + } + cs2method5008(globalstring_1); + cs2method5006(0); + } + script_77(globalstring_1); + globalstring_1 = ""; + break; + case 102: + case 103: + case 98: + case 99: + case 96: + case 97: + if (isHoldingCtrl()) { + return; + } + globalint_1028 = script_1553(arg0, globalint_1028, globalstring_1); + break; + case 13: + if (((boolean)globalint_1650)) { + if (strLength(globalstring_1) < 1) { + globalint_1650 = 0; + } else { + globalstring_1 = ""; + globalint_1028 = 0; + } + } else if (strLength(globalstring_1) < 1) { + globalint_1651 = 0; + cs2method5006(0); + } else { + globalstring_1 = ""; + globalint_1028 = 0; + } + break; + case 83: + if (((boolean)stringMethod4107(svar1, lower(globalstring_1))) || ((boolean)stringMethod4107(svar5, lower(globalstring_1)))) { + globalint_1651 = 2; + globalint_1650 = 0; + cs2method5006(2); + globalstring_1 = ""; + globalint_1028 = 0; + globalint_1652 = 1; + script_1558(0); + return; + } + if (((boolean)stringMethod4107(svar3, lower(globalstring_1))) || ((boolean)stringMethod4107(svar7, lower(globalstring_1)))) { + globalint_1651 = 3; + globalint_1650 = 0; + cs2method5006(3); + globalstring_1 = ""; + globalint_1028 = 0; + globalint_1652 = 1; + script_1558(0); + return; + } + if (((boolean)stringMethod4107(svar2, lower(globalstring_1))) || ((boolean)stringMethod4107(svar6, lower(globalstring_1)))) { + globalint_1651 = 1; + globalint_1650 = 0; + cs2method5006(1); + globalstring_1 = ""; + globalint_1028 = 0; + globalint_1652 = 1; + script_1558(0); + return; + } + if (((boolean)stringMethod4107(svar0, lower(globalstring_1))) || ((boolean)stringMethod4107(svar4, lower(globalstring_1)))) { + globalint_1651 = 0; + globalint_1650 = 0; + cs2method5006(0); + globalstring_1 = ""; + globalint_1028 = 0; + globalint_1652 = 1; + script_1558(0); + return; + } + stack_dump3 = globalint_1028; + stack_dump4 = 0; + stack_dump5 = arg0; + stack_dump6 = arg1; + stack_dump7 = globalstring_1; + structdump_8 = script_802(stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7); + stack_dump7 = structdump_8.stringpart_0; + globalint_1028 = structdump_8.intpart_0; + globalstring_1 = stack_dump7; + break; + default: + if (((boolean)globalint_1652)) { + globalint_1652 = 0; + return; + } + stack_dump3 = globalint_1028; + stack_dump4 = 0; + stack_dump5 = arg0; + stack_dump6 = arg1; + stack_dump7 = globalstring_1; + structdump_9 = script_802(stack_dump3, stack_dump4, stack_dump5, stack_dump6, stack_dump7); + stack_dump7 = structdump_9.stringpart_0; + globalint_1028 = structdump_9.intpart_0; + globalstring_1 = stack_dump7; + } + script_1558(0); + return; +} diff --git a/dumps/scripts/730.cs2 b/dumps/scripts/730.cs2 new file mode 100644 index 000000000..46e20eee8 --- /dev/null +++ b/dumps/scripts/730.cs2 @@ -0,0 +1,13 @@ +void script_730(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + ivar3 = getItemAmtInContainer(93, 13650); + ivar4 = cs2method_3408(111, 105, 1680, arg0); + setWidgetText(new WidgetPointer(arg1), intToStr(ivar4) + " tokens"); + if ((ivar4 > ivar3) || (isMembersItem(arg0) && isMember())) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg2)); + } else { + setWidgetRGB(new Color(1, 184, 1), new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/731.cs2 b/dumps/scripts/731.cs2 new file mode 100644 index 000000000..ca90327a9 --- /dev/null +++ b/dumps/scripts/731.cs2 @@ -0,0 +1,14 @@ +void script_731() { + setWidgetModel(-1, new WidgetPointer(781,15)); + setWidgetModel(-1, new WidgetPointer(781,16)); + setWidgetModel(-1, new WidgetPointer(781,17)); + setWidgetModel(-1, new WidgetPointer(781,18)); + setWidgetModel(-1, new WidgetPointer(781,19)); + setWidgetModel(-1, new WidgetPointer(781,20)); + setWidgetModel(-1, new WidgetPointer(781,21)); + setWidgetModel(-1, new WidgetPointer(781,22)); + setWidgetAnimation(10139, new WidgetPointer(781,33)); + setWidgetAnimation(10139, new WidgetPointer(781,42)); + setWidgetIsHidden(true, new WidgetPointer(781,1)); + return; +} diff --git a/dumps/scripts/732.cs2 b/dumps/scripts/732.cs2 new file mode 100644 index 000000000..fe86890c3 --- /dev/null +++ b/dumps/scripts/732.cs2 @@ -0,0 +1,10 @@ +void script_732(int arg0) { + if (((boolean)bitconfig_278)) { + setWidgetAnimation(1377, new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_278)) { + setWidgetAnimation(2114, new WidgetPointer(arg0)); + } else { + setWidgetAnimation(2116, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/733.cs2 b/dumps/scripts/733.cs2 new file mode 100644 index 000000000..1c6f2fab0 --- /dev/null +++ b/dumps/scripts/733.cs2 @@ -0,0 +1,10 @@ +void script_733(int arg0) { + if (((boolean)bitconfig_278)) { + setWidgetAnimation(1378, new WidgetPointer(arg0)); + } else if (((boolean)bitconfig_278)) { + setWidgetAnimation(2115, new WidgetPointer(arg0)); + } else { + setWidgetAnimation(2117, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/734.cs2 b/dumps/scripts/734.cs2 new file mode 100644 index 000000000..a5403115b --- /dev/null +++ b/dumps/scripts/734.cs2 @@ -0,0 +1,6 @@ +int script_734(int arg0) { + if (arg0 >= 1) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/735.cs2 b/dumps/scripts/735.cs2 new file mode 100644 index 000000000..55880a08e --- /dev/null +++ b/dumps/scripts/735.cs2 @@ -0,0 +1,7 @@ +void script_735(int arg0,int arg1,int arg2,int arg3) { + script_41(arg0); + if (setWidgetRegister(new WidgetPointer(arg1), arg2)) { + setWidgetSprite(arg3); + } + return; +} diff --git a/dumps/scripts/736.cs2 b/dumps/scripts/736.cs2 new file mode 100644 index 000000000..17935ab17 --- /dev/null +++ b/dumps/scripts/736.cs2 @@ -0,0 +1,90 @@ +void script_736(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int stack_dump0; + ivar4 = 48889937; + ivar5 = 35913917; + ivar6 = 35913930; + if (arg0 == -1) { + setWidgetIsHidden(true, new WidgetPointer(ivar4)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(ivar4)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(746,21)); + setWidgetIsHidden(true, new WidgetPointer(ivar5)); + setWidgetIsHidden(true, new WidgetPointer(ivar6)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(ivar5)); + setWidgetPosition(0, 0, 0, 0, new WidgetPointer(ivar6)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(548,116)); + return; + } + setWidgetIsHidden(false, new WidgetPointer(ivar4)); + script_2755(arg0, arg1, ivar4); + setScriptCallOnGameloop(2754, new WidgetPointer(arg0), arg1, new WidgetPointer(ivar4), "IiI", new WidgetPointer(746,21)); + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + if (setWidgetRegister(new WidgetPointer(arg2), arg3) || ((arg3 == -1) && setWidgetRegister(new WidgetPointer(arg2)))) { + stack_dump0 = script_1743(); + ivar8 = script_1744(); + ivar7 = stack_dump0; + stack_dump0 = getWidgetActualWidth(); + ivar10 = getWidgetActualHeight(); + ivar9 = stack_dump0; + } else { + return; + } + ivar11 = getWidgetParentId(new WidgetPointer(ivar5)); + ivar12 = 0; + ivar13 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + stack_dump0 = script_3365(ivar11); + ivar13 = script_3366(ivar11); + ivar12 = stack_dump0; + stack_dump0 = getWidgetActualWidth(new WidgetPointer(ivar11)); + ivar15 = getWidgetActualHeight(new WidgetPointer(ivar11)); + ivar14 = stack_dump0; + stack_dump0 = add(ivar12, ivar14); + ivar17 = add(ivar13, ivar15); + ivar16 = stack_dump0; + ivar18 = 0; + ivar19 = 0; + if (((add(ivar7, ivar9) >= ivar12) && (ivar7 <= ivar16)) && ((add(ivar8, ivar10) >= ivar13) && (ivar8 <= ivar17))) { + ivar4 = ivar5; + } else { + ivar4 = ivar6; + ivar11 = getWidgetParentId(new WidgetPointer(ivar6)); + stack_dump0 = script_3365(ivar11); + ivar13 = script_3366(ivar11); + ivar12 = stack_dump0; + stack_dump0 = getWidgetActualWidth(new WidgetPointer(ivar11)); + ivar15 = getWidgetActualHeight(new WidgetPointer(ivar11)); + ivar14 = stack_dump0; + stack_dump0 = add(ivar12, ivar14); + ivar17 = add(ivar13, ivar15); + ivar16 = stack_dump0; + } + stack_dump0 = subtract(ivar7, ivar12); + ivar19 = subtract(ivar8, ivar13); + ivar18 = stack_dump0; + setWidgetIsHidden(false, new WidgetPointer(ivar4)); + script_1176(ivar4, ivar7, ivar8, ivar9, ivar10, ivar18, ivar19, ivar12, ivar13, ivar14, ivar15); + setScriptCallOnGameloop(836, new WidgetPointer(ivar4), ivar7, ivar8, ivar9, ivar10, ivar18, ivar19, ivar12, ivar13, ivar14, ivar15, "Iiiiiiiiiii", new WidgetPointer(548,116)); + return; +} diff --git a/dumps/scripts/737.cs2 b/dumps/scripts/737.cs2 new file mode 100644 index 000000000..1e2ea04f7 --- /dev/null +++ b/dumps/scripts/737.cs2 @@ -0,0 +1,38 @@ +void script_737(int arg0) { + int ivar1; + ivar1 = -1; + if (((boolean)globalint_99)) { + globalint_99 = arg0; + return; + } + if (((boolean)globalint_100)) { + globalint_100 = arg0; + return; + } + if (((boolean)globalint_101)) { + globalint_101 = arg0; + if ((script_739(globalint_99) == script_739(globalint_100)) && (script_739(globalint_99) == script_739(globalint_101))) { + ivar1 = cs2method_3408(105, 109, 1152, script_739(globalint_99)); + setWidgetModel(ivar1, cs2method_3408(105, 73, 1153, globalint_99)); + setWidgetModel(ivar1, cs2method_3408(105, 73, 1153, globalint_100)); + setWidgetModel(ivar1, cs2method_3408(105, 73, 1153, globalint_101)); + globalint_104 = flagBit(globalint_104, script_739(globalint_99)); + globalint_99 = 0; + globalint_100 = 0; + globalint_101 = 0; + globalint_102 = add(globalint_102, 1); + globalint_105 = subtract(globalint_105, 1); + script_738(); + } + return; + } + setWidgetModel(31025, cs2method_3408(105, 73, 1153, globalint_99)); + setWidgetModel(31025, cs2method_3408(105, 73, 1153, globalint_100)); + setWidgetModel(31025, cs2method_3408(105, 73, 1153, globalint_101)); + globalint_99 = arg0; + globalint_100 = 0; + globalint_101 = 0; + globalint_105 = subtract(globalint_105, 1); + script_738(); + return; +} diff --git a/dumps/scripts/738.cs2 b/dumps/scripts/738.cs2 new file mode 100644 index 000000000..11c8d1ab7 --- /dev/null +++ b/dumps/scripts/738.cs2 @@ -0,0 +1,9 @@ +void script_738() { + string svar0; + string svar1; + svar0 = intToStr(divide(globalint_105, 10)); + svar1 = intToStr(mod(globalint_105, 10)); + setWidgetText(new WidgetPointer(269,48), svar0); + setWidgetText(new WidgetPointer(269,49), svar1); + return; +} diff --git a/dumps/scripts/739.cs2 b/dumps/scripts/739.cs2 new file mode 100644 index 000000000..fad7588b1 --- /dev/null +++ b/dumps/scripts/739.cs2 @@ -0,0 +1,38 @@ +int script_739(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + arg0 = subtract(arg0, 1); + ivar1 = 1; + ivar2 = 1; + ivar3 = 0; + globalarray_0 = new int[36]; + ivar4 = 0; + if (globalint_103 != bitconfig_4227) { + globalint_103 = bitconfig_4227; + } + ivar3 = globalint_103; + while (ivar1 <= 12) { + while (ivar2 <= 3) { + ivar4 = mod(ivar3, 36); + while (globalarray_0[ivar4] != 0) { + ivar4 = add(ivar4, 1); + if (ivar4 == 36) { + ivar4 = 0; + } + } + if (ivar4 == arg0) { + return ivar1; + } + globalarray_0[ivar4] = ivar1; + ivar3 = multiply(ivar3, ivar3); + ivar3 = subtract(ivar3, multiply(divide(ivar3, 1000000), 1000000)); + ivar3 = divide(ivar3, 100); + ivar2 = add(ivar2, 1); + } + ivar1 = add(ivar1, 1); + ivar2 = 1; + } + return 0; +} diff --git a/dumps/scripts/74.cs2 b/dumps/scripts/74.cs2 new file mode 100644 index 000000000..4cb65499b --- /dev/null +++ b/dumps/scripts/74.cs2 @@ -0,0 +1,21 @@ +string script_74(int arg0,int arg1,int arg2,string arg3) { + int ivar3; + string svar1; + int stack_dump0; + int stack_dump1; + int stack_dump2; + int stack_dump3; + string stack_dump4; + cs2func_script_802_struct(1,1,0) structdump_5; + svar1 = ""; + ivar3 = -1; + stack_dump0 = ivar3; + stack_dump1 = arg0; + stack_dump2 = arg1; + stack_dump3 = arg2; + stack_dump4 = arg3; + structdump_5 = script_802(stack_dump0, stack_dump1, stack_dump2, stack_dump3, stack_dump4); + ivar3 = structdump_5.intpart_0; + svar1 = structdump_5.stringpart_0; + return svar1; +} diff --git a/dumps/scripts/740.cs2 b/dumps/scripts/740.cs2 new file mode 100644 index 000000000..b01a854e0 --- /dev/null +++ b/dumps/scripts/740.cs2 @@ -0,0 +1,12 @@ +void script_740() { + globalint_106 = 0; + globalint_106 = 0; + globalint_99 = 0; + globalint_100 = 0; + globalint_101 = 0; + globalint_104 = 0; + globalint_102 = 0; + globalint_105 = 20; + script_738(); + return; +} diff --git a/dumps/scripts/741.cs2 b/dumps/scripts/741.cs2 new file mode 100644 index 000000000..b6d36bf5a --- /dev/null +++ b/dumps/scripts/741.cs2 @@ -0,0 +1,29 @@ +void script_741() { + int ivar0; + int ivar1; + int ivar2; + flow_0: + ivar0 = standart_config_1163; + if (((boolean)ivar0)) { + return; + } + ivar1 = script_739(ivar0); + ivar2 = cs2method_3408(105, 109, 1151, ivar1); + if (isBitFlagged(globalint_104, ivar1)) { + return; + } + if (((ivar0 == globalint_99) || (ivar0 == globalint_100)) || (ivar0 == globalint_101)) { + return; + } + setWidgetModel(ivar2, cs2method_3408(105, 73, 1153, ivar0)); + script_737(ivar0); + IF (globalint_102 == 12) + GOTO flow_7 + GOTO flow_7 + flow_7: + if (((boolean)globalint_105)) { + messageType0("The mechanism issues forth a whine and shuts down."); + script_675(); + } + return; +} diff --git a/dumps/scripts/742.cs2 b/dumps/scripts/742.cs2 new file mode 100644 index 000000000..c264662bf --- /dev/null +++ b/dumps/scripts/742.cs2 @@ -0,0 +1,38 @@ +void script_742() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + ivar0 = standart_config_1164; + ivar1 = 0; + if (((boolean)ivar0)) { + return; + } + if (ivar0 == 10) { + globalint_105 = subtract(globalint_105, 1); + if (bitconfig_4228 != globalint_105) { + if (bitconfig_4228 > globalint_105) { + ivar1 = 1; + messageType0("Part of the mechanism jams due to your frenzied manipulation."); + } + globalint_105 = bitconfig_4228; + } + if (((boolean)globalint_105)) { + messageType0("The mechanism issues forth a whine and shuts down."); + script_675(); + } + script_738(); + return; + } + ivar0 = subtract(ivar0, 1); + if (isBitFlagged(globalint_106, ivar0)) { + return; + } + globalint_106 = flagBit(globalint_106, ivar0); + globalint_105 = add(globalint_105, 5); + script_738(); + ivar2 = cs2method_3408(105, 109, 1155, ivar0); + ivar3 = ((int)cs2method_3408(105, 73, 1154, ivar0)); + setWidgetModel(ivar2, new WidgetPointer(ivar3)); + return; +} diff --git a/dumps/scripts/743.cs2 b/dumps/scripts/743.cs2 new file mode 100644 index 000000000..c042fe5cc --- /dev/null +++ b/dumps/scripts/743.cs2 @@ -0,0 +1,12 @@ +void script_743(int arg0,int arg1,int arg2) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1)) { + if (((boolean)arg2)) { + setWidgetPosition(getWidgetActualX(), getWidgetActualY(), 0, 0, new WidgetPointer(18,46)); + setWidgetSize(getWidgetActualWidth(), getWidgetActualHeight(), 0, 0, new WidgetPointer(18,46)); + setWidgetIsHidden(false, new WidgetPointer(18,46)); + } else { + setWidgetIsHidden(true, new WidgetPointer(18,46)); + } + } + return; +} diff --git a/dumps/scripts/744.cs2 b/dumps/scripts/744.cs2 new file mode 100644 index 000000000..66c42010b --- /dev/null +++ b/dumps/scripts/744.cs2 @@ -0,0 +1,31 @@ +void script_744(int arg0,int arg1,int arg2,int arg3,int arg4) { + int ivar5; + int ivar6; + int stack_dump0; + ivar5 = -1; + ivar6 = -1; + if (arg0 == 1179657) { + if (arg2 == 1179657) { + if (setWidgetRegister(new WidgetPointer(arg0), arg1) && setWidgetRegister(new WidgetPointer(arg2), arg3)) { + stack_dump0 = getWidgetItemId(); + ivar6 = getWidgetItemId(); + ivar5 = stack_dump0; + setItemOnWidgetMethod1205(ivar6, 1); + setItemOnWidgetMethod1205(ivar5, 1); + cs2method1305("" + getItemName(ivar6) + ""); + cs2method1305("" + getItemName(ivar5) + ""); + } + return; + } + if (arg2 == 1179665) { + script_1535(arg1, 0); + script_59(arg4); + } + return; + } + if ((arg0 == 1179665) && (arg2 == 1179657)) { + script_1535(arg3, arg1); + script_59(arg4); + } + return; +} diff --git a/dumps/scripts/745.cs2 b/dumps/scripts/745.cs2 new file mode 100644 index 000000000..04693b608 --- /dev/null +++ b/dumps/scripts/745.cs2 @@ -0,0 +1,4 @@ +void script_745(int arg0) { + script_746(arg0); + return; +} diff --git a/dumps/scripts/746.cs2 b/dumps/scripts/746.cs2 new file mode 100644 index 000000000..a9bbeb93b --- /dev/null +++ b/dumps/scripts/746.cs2 @@ -0,0 +1,14 @@ +void script_746(int arg0) { + if (((boolean)arg0)) { + setWidgetIsHidden(false, new WidgetPointer(18,42)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(18,29)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(18,29)); + } else { + setWidgetIsHidden(true, new WidgetPointer(18,42)); + setScriptCallOnMouseEntered(748, 1, "1", new WidgetPointer(18,29)); + setScriptCallOnMouseExit(748, 0, "1", new WidgetPointer(18,29)); + } + script_749(0); + script_41(1179689); + return; +} diff --git a/dumps/scripts/747.cs2 b/dumps/scripts/747.cs2 new file mode 100644 index 000000000..ddcc1d2fd --- /dev/null +++ b/dumps/scripts/747.cs2 @@ -0,0 +1,9 @@ +void script_747(int arg0,int arg1,string arg2) { + if (arg0 != 1) { + return; + } + if (setWidgetRegister(new WidgetPointer(18,29), arg1)) { + setWidgetText(arg2); + } + return; +} diff --git a/dumps/scripts/748.cs2 b/dumps/scripts/748.cs2 new file mode 100644 index 000000000..ef3cf61b9 --- /dev/null +++ b/dumps/scripts/748.cs2 @@ -0,0 +1,4 @@ +void script_748(int arg0) { + script_749(arg0); + return; +} diff --git a/dumps/scripts/749.cs2 b/dumps/scripts/749.cs2 new file mode 100644 index 000000000..1a669d8f6 --- /dev/null +++ b/dumps/scripts/749.cs2 @@ -0,0 +1,24 @@ +void script_749(int arg0) { + if (((boolean)arg0)) { + if (setWidgetRegister(new WidgetPointer(18,29), 0)) { + setWidgetSprite(6135); + } + if (setWidgetRegister(new WidgetPointer(18,29), 1)) { + setWidgetSprite(6134); + } + if (setWidgetRegister(new WidgetPointer(18,29), 2)) { + setWidgetSprite(6136); + } + } else { + if (setWidgetRegister(new WidgetPointer(18,29), 0)) { + setWidgetSprite(6132); + } + if (setWidgetRegister(new WidgetPointer(18,29), 1)) { + setWidgetSprite(6131); + } + if (setWidgetRegister(new WidgetPointer(18,29), 2)) { + setWidgetSprite(6133); + } + } + return; +} diff --git a/dumps/scripts/75.cs2 b/dumps/scripts/75.cs2 new file mode 100644 index 000000000..45f3f772d --- /dev/null +++ b/dumps/scripts/75.cs2 @@ -0,0 +1,21 @@ +void script_75() { + int ivar0; + string svar0; + ivar0 = globalint_3; + svar0 = "null"; + if (ivar0 == -1) { + ivar0 = globalint_4; + } + if (globalint_3 != globalint_4) { + ivar0 = subtract(ivar0, 1); + if (ivar0 < 0) { + ivar0 = 19; + } + svar0 = script_79(ivar0); + if (strLength(svar0) > 0) { + globalstring_1 = svar0; + globalint_3 = ivar0; + } + } + return; +} diff --git a/dumps/scripts/750.cs2 b/dumps/scripts/750.cs2 new file mode 100644 index 000000000..b323dd0ae --- /dev/null +++ b/dumps/scripts/750.cs2 @@ -0,0 +1,16 @@ +int script_750(int arg0) { + int ivar1; + if (arg0 <= 0) { + return -1; + } + arg0 = subtract(arg0, 1); + ivar1 = getItemContainerLength(94); + if (arg0 < ivar1) { + return getItemIdInSlot(94, arg0); + } + arg0 = subtract(arg0, ivar1); + if (arg0 < getItemContainerLength(93)) { + return getItemIdInSlot(93, arg0); + } + return -1; +} diff --git a/dumps/scripts/751.cs2 b/dumps/scripts/751.cs2 new file mode 100644 index 000000000..49ea84ed8 --- /dev/null +++ b/dumps/scripts/751.cs2 @@ -0,0 +1,51 @@ +void script_751() { + int ivar0; + int ivar1; + string svar0; + ivar0 = -1; + svar0 = ""; + ivar1 = -1; + if ((standart_config_1174 != -1) && (standart_config_1174 != 0)) { + svar0 = cs2method_3408(110, 115, 1279, standart_config_1174); + setWidgetNpcHead(standart_config_1174, new WidgetPointer(662,1)); + } else { + if (cs2method_3408(111, 110, 1320, standart_config_448) != 6988) { + standart_config_1174 = cs2method_3408(111, 110, 1320, standart_config_448); + svar0 = cs2method_3408(110, 115, 1279, standart_config_1174); + setWidgetNpcHead(standart_config_1174, new WidgetPointer(662,1)); + } + } + if (((boolean)stringMethod4107(svar0, "Animal"))) { + setWidgetText(new WidgetPointer(662,54), getItemName(standart_config_448)); + } else { + setWidgetText(new WidgetPointer(662,54), svar0); + } + if (bitconfig_4282 > 50) { + bitconfig_4282 = subtract(bitconfig_4282, 50); + ivar0 = cs2method_3408(105, 65, 1275, bitconfig_4282); + setWidgetAnimation(ivar0, new WidgetPointer(662,1)); + } else { + ivar0 = cs2method_3408(105, 65, 1276, bitconfig_4282); + setWidgetAnimation(ivar0, new WidgetPointer(662,1)); + } + if (cs2method_3408(111, 111, 1283, standart_config_448) != 526) { + setWidgetIsHidden(true, new WidgetPointer(662,71)); + if (((int)cs2method_3408(110, 73, 1282, standart_config_1174)) != 43384877) { + setWidgetIsHidden(false, new WidgetPointer(662,72)); + setWidgetIsHidden(false, new WidgetPointer(662,66)); + setWidgetIsHidden(false, cs2method_3408(110, 73, 1282, standart_config_1174)); + setWidgetIsHidden(false, cs2method_3408(110, 73, 1092, standart_config_1174)); + setWidgetSprite(1802, new WidgetPointer(747,3)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,66)); + } + } else { + setWidgetIsHidden(false, new WidgetPointer(662,71)); + setWidgetIsHidden(true, new WidgetPointer(662,66)); + if ((standart_config_448 != -1) && (getItemHashmapData(standart_config_448, 394) != 0)) { + setWidgetIsHidden(false, cs2method_3408(110, 73, 1092, standart_config_1174)); + } + } + script_2671(); + return; +} diff --git a/dumps/scripts/752.cs2 b/dumps/scripts/752.cs2 new file mode 100644 index 000000000..131ecdd3d --- /dev/null +++ b/dumps/scripts/752.cs2 @@ -0,0 +1,12 @@ +void script_752() { + if (((boolean)bitconfig_4534) && ((boolean)bitconfig_4290)) { + setWidgetText(new WidgetPointer(662,43), "---"); + return; + } + if (((boolean)bitconfig_4290)) { + setWidgetText(new WidgetPointer(662,43), intToStr(bitconfig_4534) + ".00"); + } else { + setWidgetText(new WidgetPointer(662,43), intToStr(bitconfig_4534) + ".30"); + } + return; +} diff --git a/dumps/scripts/753.cs2 b/dumps/scripts/753.cs2 new file mode 100644 index 000000000..15d784724 --- /dev/null +++ b/dumps/scripts/753.cs2 @@ -0,0 +1,20 @@ +void script_753() { + if (bitconfig_4286 != 101) { + setWidgetText(new WidgetPointer(662,48), intToStr(bitconfig_4286) + "%"); + if (bitconfig_4286 > 74) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(662,48)); + } else { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(662,48)); + } + } else { + setWidgetText(new WidgetPointer(662,48), "NA"); + } + if (bitconfig_4285 != 101) { + setWidgetText(new WidgetPointer(662,45), intToStr(bitconfig_4285) + "%"); + setWidgetText(new WidgetPointer(662,46), intToStr(bitconfig_4285) + "%"); + } else { + setWidgetText(new WidgetPointer(662,45), "NA"); + setWidgetText(new WidgetPointer(662,46), "NA"); + } + return; +} diff --git a/dumps/scripts/754.cs2 b/dumps/scripts/754.cs2 new file mode 100644 index 000000000..08b7eb7ff --- /dev/null +++ b/dumps/scripts/754.cs2 @@ -0,0 +1,8 @@ +void script_754(int arg0,int arg1) { + if (((boolean)arg1)) { + setWidgetText(new WidgetPointer(662,43), intToStr(arg0) + ".00"); + } else { + setWidgetText(new WidgetPointer(662,43), intToStr(arg0) + ".30"); + } + return; +} diff --git a/dumps/scripts/755.cs2 b/dumps/scripts/755.cs2 new file mode 100644 index 000000000..5f5475da8 --- /dev/null +++ b/dumps/scripts/755.cs2 @@ -0,0 +1,4 @@ +void script_755() { + setWidgetText(new WidgetPointer(662,41), intToStr(getSkillCurrentLvl(23)) + "/" + intToStr(getSkillActualLvl(23))); + return; +} diff --git a/dumps/scripts/756.cs2 b/dumps/scripts/756.cs2 new file mode 100644 index 000000000..8fccc9b16 --- /dev/null +++ b/dumps/scripts/756.cs2 @@ -0,0 +1,106 @@ +void script_756() { + if (standart_config_1177 > 60) { + standart_config_1177 = 60; + } + if (standart_config_1177 == 60) { + setWidgetIsHidden(false, new WidgetPointer(662,39)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,39)); + } + if (standart_config_1177 >= 57) { + setWidgetIsHidden(false, new WidgetPointer(662,38)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,38)); + } + if (standart_config_1177 >= 54) { + setWidgetIsHidden(false, new WidgetPointer(662,37)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,37)); + } + if (standart_config_1177 >= 51) { + setWidgetIsHidden(false, new WidgetPointer(662,36)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,36)); + } + if (standart_config_1177 >= 48) { + setWidgetIsHidden(false, new WidgetPointer(662,35)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,35)); + } + if (standart_config_1177 >= 45) { + setWidgetIsHidden(false, new WidgetPointer(662,34)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,34)); + } + if (standart_config_1177 >= 42) { + setWidgetIsHidden(false, new WidgetPointer(662,33)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,33)); + } + if (standart_config_1177 >= 39) { + setWidgetIsHidden(false, new WidgetPointer(662,32)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,32)); + } + if (standart_config_1177 >= 36) { + setWidgetIsHidden(false, new WidgetPointer(662,31)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,31)); + } + if (standart_config_1177 >= 33) { + setWidgetIsHidden(false, new WidgetPointer(662,30)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,30)); + } + if (standart_config_1177 >= 30) { + setWidgetIsHidden(false, new WidgetPointer(662,29)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,29)); + } + if (standart_config_1177 >= 27) { + setWidgetIsHidden(false, new WidgetPointer(662,28)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,28)); + } + if (standart_config_1177 >= 24) { + setWidgetIsHidden(false, new WidgetPointer(662,27)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,27)); + } + if (standart_config_1177 >= 21) { + setWidgetIsHidden(false, new WidgetPointer(662,26)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,26)); + } + if (standart_config_1177 >= 18) { + setWidgetIsHidden(false, new WidgetPointer(662,25)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,25)); + } + if (standart_config_1177 >= 15) { + setWidgetIsHidden(false, new WidgetPointer(662,24)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,24)); + } + if (standart_config_1177 >= 12) { + setWidgetIsHidden(false, new WidgetPointer(662,23)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,23)); + } + if (standart_config_1177 >= 9) { + setWidgetIsHidden(false, new WidgetPointer(662,22)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,22)); + } + if (standart_config_1177 >= 6) { + setWidgetIsHidden(false, new WidgetPointer(662,21)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,21)); + } + if (standart_config_1177 >= 3) { + setWidgetIsHidden(false, new WidgetPointer(662,20)); + } else { + setWidgetIsHidden(true, new WidgetPointer(662,20)); + } + return; +} diff --git a/dumps/scripts/757.cs2 b/dumps/scripts/757.cs2 new file mode 100644 index 000000000..d160b12a3 --- /dev/null +++ b/dumps/scripts/757.cs2 @@ -0,0 +1,5 @@ +void script_757(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + script_759(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + setScriptCallOnItemContainerUpdate(758, new WidgetPointer(arg0), arg1, arg2, arg5, arg6, arg7, arg8, arg9, arg10, arg3, arg4, 93, 1, "IiissssssiiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/758.cs2 b/dumps/scripts/758.cs2 new file mode 100644 index 000000000..d4d35e56a --- /dev/null +++ b/dumps/scripts/758.cs2 @@ -0,0 +1,4 @@ +void script_758(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + script_759(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + return; +} diff --git a/dumps/scripts/759.cs2 b/dumps/scripts/759.cs2 new file mode 100644 index 000000000..16baffa36 --- /dev/null +++ b/dumps/scripts/759.cs2 @@ -0,0 +1,298 @@ +void script_759(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9,string arg10) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + int ivar35; + int ivar36; + string svar6; + int stack_dump0; + cs2func_script_767_struct(20,0,0) structdump_1; + deleteAllExtraChilds(new WidgetPointer(arg0)); + setWidgetScrollMax(0, multiply(add(divide(subtract(arg4, arg3), arg1), 1), 57), new WidgetPointer(arg0)); + ivar5 = 0; + ivar6 = arg3; + ivar7 = 0; + ivar8 = arg4; + ivar9 = 0; + ivar10 = -1; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + ivar14 = -1; + ivar15 = -1; + ivar16 = -1; + ivar17 = -1; + ivar18 = -1; + ivar19 = -1; + ivar20 = -1; + ivar21 = 0; + ivar22 = 0; + ivar23 = 0; + ivar24 = 0; + ivar25 = 0; + ivar26 = 0; + ivar27 = 0; + ivar28 = 0; + ivar29 = 0; + ivar30 = 0; + svar6 = "hello"; + ivar31 = 0; + globalarray_0 = new int[10]; + ivar32 = -1; + ivar33 = 0; + ivar34 = 0; + ivar35 = 0; + ivar36 = 1; + while (ivar5 <= subtract(arg4, arg3)) { + ivar36 = 1; + ivar32 = cs2method_3408(105, 111, 1182, ivar6); + if (((boolean)bitconfig_8701)) { + if (getItemHashmapData(ivar32, 697) != -1) { + switch (getItemHashmapData(ivar32, 697)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(ivar32, 698)) { + ivar36 = 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(ivar32, 698)) { + ivar36 = 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(ivar32, 698)) { + ivar36 = 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(ivar32, 697)) < getItemHashmapData(ivar32, 698)) { + ivar36 = 0; + } + } + } + if ((getItemHashmapData(ivar32, 699) != -1) && ((boolean)ivar36)) { + switch (getItemHashmapData(ivar32, 699)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(ivar32, 700)) { + ivar36 = 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(ivar32, 700)) { + ivar36 = 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(ivar32, 700)) { + ivar36 = 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(ivar32, 699)) < getItemHashmapData(ivar32, 700)) { + ivar36 = 0; + } + } + } + if ((getItemHashmapData(ivar32, 701) != -1) && ((boolean)ivar36)) { + switch (getItemHashmapData(ivar32, 701)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(ivar32, 702)) { + ivar36 = 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(ivar32, 702)) { + ivar36 = 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(ivar32, 702)) { + ivar36 = 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(ivar32, 701)) < getItemHashmapData(ivar32, 702)) { + ivar36 = 0; + } + } + } + if ((getItemHashmapData(ivar32, 703) != -1) && ((boolean)ivar36)) { + switch (getItemHashmapData(ivar32, 703)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(ivar32, 704)) { + ivar36 = 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(ivar32, 704)) { + ivar36 = 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(ivar32, 704)) { + ivar36 = 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(ivar32, 703)) < getItemHashmapData(ivar32, 704)) { + ivar36 = 0; + } + } + } + if ((getItemHashmapData(ivar32, 705) != -1) && ((boolean)ivar36)) { + switch (getItemHashmapData(ivar32, 705)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(ivar32, 706)) { + ivar36 = 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(ivar32, 706)) { + ivar36 = 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(ivar32, 706)) { + ivar36 = 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(ivar32, 705)) < getItemHashmapData(ivar32, 706)) { + ivar36 = 0; + } + } + } + if ((getItemHashmapData(ivar32, 707) != -1) && ((boolean)ivar36)) { + switch (getItemHashmapData(ivar32, 707)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(ivar32, 708)) { + ivar36 = 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(ivar32, 708)) { + ivar36 = 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(ivar32, 708)) { + ivar36 = 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(ivar32, 707)) < getItemHashmapData(ivar32, 708)) { + ivar36 = 0; + } + } + } + } + if (((boolean)ivar36)) { + ivar33 = add(add(16, multiply(mod(ivar7, arg1), 48)), multiply(mod(ivar7, arg1), 5)); + ivar34 = add(multiply(divide(ivar7, arg1), 52), multiply(divide(ivar7, arg1), 5)); + createExtraChild(new WidgetPointer(arg0), 5, ivar35); + ivar35 = add(ivar35, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar33, ivar34, 0, 0); + setWidgetSprite(2205); + setScriptCallOnMouseEntered(2724, new WidgetPointer(-32768,3), ivar35, 0, "Ii1"); + setScriptCallOnMouseExit(2724, new WidgetPointer(-32768,3), ivar35, 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, ivar35); + ivar35 = add(ivar35, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar33, ivar34, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar35); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar33, 6), add(ivar34, 4), 0, 0); + if (ivar32 == 12292) { + script_760(ivar32, ivar32, arg0, ivar35, arg5, arg6, arg7, arg8, arg9, arg10); + } else if (((boolean)script_766(ivar32)) && (getSkillActualLvl(23) >= cs2method_3408(111, 105, 1185, ivar32))) { + script_760(ivar32, ivar32, arg0, ivar35, arg5, arg6, arg7, arg8, arg9, arg10); + } else { + script_760(cs2method_3408(105, 111, 1183, ivar6), ivar32, arg0, ivar35, arg5, arg6, arg7, arg8, arg9, arg10); + } + if (ivar32 == 12292) { + setScriptCallOnMouseOver(782, -2147483643, new WidgetPointer(79,31), new WidgetPointer(79,16), ivar31, svar6, "iIIis"); + setScriptCallOnMouseExit(40, new WidgetPointer(79,31), "I"); + } else { + svar6 = cs2method_3408(111, 115, 1187, ivar32); + ivar31 = cs2method_3408(111, 105, 1185, ivar32); + stack_dump0 = ivar32; + structdump_1 = script_767(stack_dump0); + ivar30 = structdump_1.intpart_19; + ivar29 = structdump_1.intpart_18; + ivar28 = structdump_1.intpart_17; + ivar27 = structdump_1.intpart_16; + ivar26 = structdump_1.intpart_15; + ivar25 = structdump_1.intpart_14; + ivar24 = structdump_1.intpart_13; + ivar23 = structdump_1.intpart_12; + ivar22 = structdump_1.intpart_11; + ivar21 = structdump_1.intpart_10; + ivar20 = structdump_1.intpart_9; + ivar19 = structdump_1.intpart_8; + ivar18 = structdump_1.intpart_7; + ivar17 = structdump_1.intpart_6; + ivar16 = structdump_1.intpart_5; + ivar15 = structdump_1.intpart_4; + ivar14 = structdump_1.intpart_3; + ivar13 = structdump_1.intpart_2; + ivar12 = structdump_1.intpart_1; + ivar11 = structdump_1.intpart_0; + setScriptCallOnMouseOver(770, -2147483643, new WidgetPointer(79,31), new WidgetPointer(79,16), ivar31, svar6, ivar11, 1, ivar12, ivar22, ivar13, ivar23, ivar14, ivar24, ivar15, ivar25, ivar16, ivar26, ivar17, ivar27, ivar18, ivar28, ivar19, ivar29, ivar20, ivar30, "iIIisoioioioioioioioioioi"); + setScriptCallOnMouseExit(40, new WidgetPointer(79,31), "I"); + } + ivar35 = add(ivar35, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar35); + ivar35 = add(ivar35, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar33, 2), add(ivar34, 38), 0, 0); + setItemOnWidgetMethod1205(12183, 1); + createExtraChild(new WidgetPointer(arg0), 4, ivar35); + ivar35 = add(ivar35, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar33, 13), add(ivar34, 39), 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetTextAlignment(2, 1, 0); + if (getItemHashmapData(ivar32, 541) < 1) { + setWidgetText("--"); + } else { + setWidgetText(script_940(getItemHashmapData(ivar32, 541))); + } + setWidgetUnknownBoolean(true); + ivar7 = add(ivar7, 1); + } + ivar5 = add(ivar5, 1); + ivar6 = add(ivar6, 1); + } + return; +} diff --git a/dumps/scripts/76.cs2 b/dumps/scripts/76.cs2 new file mode 100644 index 000000000..0c8bef098 --- /dev/null +++ b/dumps/scripts/76.cs2 @@ -0,0 +1,20 @@ +void script_76() { + string svar0; + svar0 = "null"; + if (globalint_3 != -1) { + globalint_3 = add(globalint_3, 1); + if (globalint_3 >= 20) { + globalint_3 = 0; + } + if (globalint_3 == globalint_4) { + globalstring_1 = ""; + globalint_3 = -1; + } else { + svar0 = script_79(globalint_3); + if (strLength(svar0) > 0) { + globalstring_1 = svar0; + } + } + } + return; +} diff --git a/dumps/scripts/760.cs2 b/dumps/scripts/760.cs2 new file mode 100644 index 000000000..8ed6eeb6c --- /dev/null +++ b/dumps/scripts/760.cs2 @@ -0,0 +1,28 @@ +void script_760(int arg0,int arg1,int arg2,int arg3,string arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + if (arg0 != -1) { + setItemOnWidgetMethod1200(arg0, -1); + cs2method1305(getItemName(arg1)); + setWidgetContextMenuOption(1, arg4); + setWidgetContextMenuOption(2, arg5); + setWidgetContextMenuOption(3, arg6); + setWidgetContextMenuOption(4, arg7); + setWidgetContextMenuOption(5, arg8); + setWidgetContextMenuOption(6, "Examine" + ""); + setWidgetContextMenuOption(7, arg9); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + } else { + setItemOnWidgetMethod1200(-1, 0); + cs2method1305(""); + setWidgetContextMenuOption(1, ""); + setWidgetContextMenuOption(2, ""); + setWidgetContextMenuOption(3, ""); + setWidgetContextMenuOption(4, ""); + setWidgetContextMenuOption(5, ""); + setWidgetContextMenuOption(6, ""); + setWidgetContextMenuOption(7, ""); + } + } + return; +} diff --git a/dumps/scripts/761.cs2 b/dumps/scripts/761.cs2 new file mode 100644 index 000000000..4189c2433 --- /dev/null +++ b/dumps/scripts/761.cs2 @@ -0,0 +1,15 @@ +int script_761(int arg0) { + if (((boolean)arg0)) { + return 36; + } + if (((boolean)arg0)) { + return 147; + } + if (arg0 == 2) { + return 258; + } + if (arg0 == 3) { + return 369; + } + return 0; +} diff --git a/dumps/scripts/762.cs2 b/dumps/scripts/762.cs2 new file mode 100644 index 000000000..ec0039a28 --- /dev/null +++ b/dumps/scripts/762.cs2 @@ -0,0 +1,15 @@ +int script_762(int arg0) { + if (((boolean)arg0)) { + return 6; + } + if (((boolean)arg0)) { + return 117; + } + if (arg0 == 2) { + return 228; + } + if (arg0 == 3) { + return 340; + } + return 0; +} diff --git a/dumps/scripts/763.cs2 b/dumps/scripts/763.cs2 new file mode 100644 index 000000000..351ffe64a --- /dev/null +++ b/dumps/scripts/763.cs2 @@ -0,0 +1,5 @@ +void script_763(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + script_765(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + setScriptCallOnItemContainerUpdate(764, new WidgetPointer(arg0), arg1, arg2, arg5, arg6, arg7, arg8, arg9, arg3, arg4, 93, 1, "IiisssssiiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/764.cs2 b/dumps/scripts/764.cs2 new file mode 100644 index 000000000..cd25ce3c2 --- /dev/null +++ b/dumps/scripts/764.cs2 @@ -0,0 +1,4 @@ +void script_764(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + script_765(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + return; +} diff --git a/dumps/scripts/765.cs2 b/dumps/scripts/765.cs2 new file mode 100644 index 000000000..8ad7b94d5 --- /dev/null +++ b/dumps/scripts/765.cs2 @@ -0,0 +1,89 @@ +void script_765(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + string svar5; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar5 = 0; + ivar6 = 0; + setWidgetScrollMax(0, multiply(add(divide(subtract(arg4, arg3), arg1), 1), 57), new WidgetPointer(arg0)); + ivar7 = 0; + ivar8 = arg3; + ivar9 = 0; + ivar10 = arg4; + ivar11 = 0; + ivar12 = -1; + ivar13 = -1; + ivar14 = -1; + svar5 = "hello"; + ivar15 = 0; + ivar16 = 0; + while (ivar7 <= subtract(arg4, arg3)) { + if (((boolean)bitconfig_8701) || (getItemAmtInContainer(93, cs2method_3408(105, 111, 1182, ivar8)) > 0)) { + ivar5 = add(add(16, multiply(mod(ivar9, arg1), 48)), multiply(mod(ivar9, arg1), 5)); + ivar6 = add(multiply(divide(ivar9, arg1), 52), multiply(divide(ivar9, arg1), 5)); + createExtraChild(new WidgetPointer(arg0), 5, ivar16); + ivar16 = add(ivar16, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2205); + setScriptCallOnMouseEntered(2724, new WidgetPointer(-32768,3), ivar16, 0, "Ii1"); + setScriptCallOnMouseExit(2724, new WidgetPointer(-32768,3), ivar16, 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, ivar16); + ivar16 = add(ivar16, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar16); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar5, 6), add(ivar6, 4), 0, 0); + ivar13 = cs2method_3408(105, 111, 1277, ivar8); + ivar14 = cs2method_3408(105, 111, 1188, ivar8); + if (ivar14 == 12421) { + script_760(ivar14, ivar14, arg0, ivar16, arg5, arg6, arg7, arg8, arg9, ""); + } else if (((boolean)script_768(ivar14, ivar13)) && (getSkillActualLvl(23) >= cs2method_3408(111, 105, 1185, ivar13))) { + script_760(ivar14, ivar14, arg0, ivar16, arg5, arg6, arg7, arg8, arg9, ""); + } else { + script_760(cs2method_3408(105, 111, 1184, ivar8), ivar14, arg0, ivar16, arg5, arg6, arg7, arg8, arg9, ""); + } + if (ivar14 == 12421) { + setScriptCallOnMouseOver(782, -2147483643, new WidgetPointer(79,31), new WidgetPointer(79,17), ivar15, svar5, "iIIis"); + setScriptCallOnMouseExit(40, new WidgetPointer(79,31), "I"); + } else { + svar5 = cs2method_3408(111, 115, 1187, ivar14); + ivar15 = cs2method_3408(111, 105, 1185, ivar13); + setScriptCallOnMouseOver(770, -2147483643, new WidgetPointer(79,31), new WidgetPointer(79,17), ivar15, svar5, ivar13, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, "iIIisoioioioioioioioioioi"); + setScriptCallOnMouseExit(40, new WidgetPointer(79,31), "I"); + } + ivar16 = add(ivar16, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar16); + ivar16 = add(ivar16, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar5, 2), add(ivar6, 38), 0, 0); + setItemOnWidgetMethod1205(ivar13, 1); + createExtraChild(new WidgetPointer(arg0), 4, ivar16); + ivar16 = add(ivar16, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar5, 13), add(ivar6, 39), 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetTextAlignment(2, 1, 0); + setWidgetText("1"); + setWidgetUnknownBoolean(true); + ivar9 = add(ivar9, 1); + } + ivar7 = add(ivar7, 1); + ivar8 = add(ivar8, 1); + } + return; +} diff --git a/dumps/scripts/766.cs2 b/dumps/scripts/766.cs2 new file mode 100644 index 000000000..c0152f44d --- /dev/null +++ b/dumps/scripts/766.cs2 @@ -0,0 +1,150 @@ +int script_766(int arg0) { + if ((getItemHashmapData(arg0, 538) != -1) && (getItemAmtInContainer(93, getItemHashmapData(arg0, 538)) < getItemHashmapData(arg0, 539))) { + return 0; + } + if ((getItemHashmapData(arg0, 540) != -1) && (getItemAmtInContainer(93, getItemHashmapData(arg0, 540)) < getItemHashmapData(arg0, 541))) { + return 0; + } + if ((getItemHashmapData(arg0, 542) != -1) && (getItemAmtInContainer(93, getItemHashmapData(arg0, 542)) < getItemHashmapData(arg0, 543))) { + return 0; + } + if (getItemHashmapData(arg0, 697) != -1) { + switch (getItemHashmapData(arg0, 697)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(arg0, 698)) { + return 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(arg0, 698)) { + return 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(arg0, 698)) { + return 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(arg0, 697)) < getItemHashmapData(arg0, 698)) { + return 0; + } + } + } + if (getItemHashmapData(arg0, 699) != -1) { + switch (getItemHashmapData(arg0, 699)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(arg0, 700)) { + return 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(arg0, 700)) { + return 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(arg0, 700)) { + return 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(arg0, 699)) < getItemHashmapData(arg0, 700)) { + return 0; + } + } + } + if (getItemHashmapData(arg0, 701) != -1) { + switch (getItemHashmapData(arg0, 701)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(arg0, 702)) { + return 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(arg0, 702)) { + return 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(arg0, 702)) { + return 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(arg0, 701)) < getItemHashmapData(arg0, 702)) { + return 0; + } + } + } + if (getItemHashmapData(arg0, 703) != -1) { + switch (getItemHashmapData(arg0, 703)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(arg0, 704)) { + return 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(arg0, 704)) { + return 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(arg0, 704)) { + return 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(arg0, 703)) < getItemHashmapData(arg0, 704)) { + return 0; + } + } + } + if (getItemHashmapData(arg0, 705) != -1) { + switch (getItemHashmapData(arg0, 705)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(arg0, 706)) { + return 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(arg0, 706)) { + return 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(arg0, 706)) { + return 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(arg0, 705)) < getItemHashmapData(arg0, 706)) { + return 0; + } + } + } + if (getItemHashmapData(arg0, 707) != -1) { + switch (getItemHashmapData(arg0, 707)) { + case 6287: + if (add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)) < getItemHashmapData(arg0, 708)) { + return 0; + } + break; + case 6979: + if (add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)) < getItemHashmapData(arg0, 708)) { + return 0; + } + break; + case 2462: + if (add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)) < getItemHashmapData(arg0, 708)) { + return 0; + } + break; + default: + if (getItemAmtInContainer(93, getItemHashmapData(arg0, 707)) < getItemHashmapData(arg0, 708)) { + return 0; + } + } + } + return 1; +} diff --git a/dumps/scripts/767.cs2 b/dumps/scripts/767.cs2 new file mode 100644 index 000000000..c830c6982 --- /dev/null +++ b/dumps/scripts/767.cs2 @@ -0,0 +1,52 @@ +cs2func_script_767_struct(20,0,0) script_767(int arg0) { + int ivar1; + globalarray_0 = new int[10]; + globalarray_1 = new int[10]; + ivar1 = 0; + if (getItemHashmapData(arg0, 538) != -1) { + globalarray_0[ivar1] = getItemHashmapData(arg0, 538); + globalarray_0[ivar1] = getItemHashmapData(arg0, 539); + ivar1 = add(ivar1, 1); + } + if (getItemHashmapData(arg0, 540) != -1) { + globalarray_0[ivar1] = getItemHashmapData(arg0, 540); + globalarray_0[ivar1] = getItemHashmapData(arg0, 541); + ivar1 = add(ivar1, 1); + } + if (getItemHashmapData(arg0, 542) != -1) { + globalarray_0[ivar1] = getItemHashmapData(arg0, 542); + globalarray_0[ivar1] = getItemHashmapData(arg0, 543); + ivar1 = add(ivar1, 1); + } + if (getItemHashmapData(arg0, 697) != -1) { + globalarray_0[ivar1] = getItemHashmapData(arg0, 697); + globalarray_0[ivar1] = getItemHashmapData(arg0, 698); + ivar1 = add(ivar1, 1); + } + if (getItemHashmapData(arg0, 699) != -1) { + globalarray_0[ivar1] = getItemHashmapData(arg0, 699); + globalarray_0[ivar1] = getItemHashmapData(arg0, 700); + ivar1 = add(ivar1, 1); + } + if (getItemHashmapData(arg0, 701) != -1) { + globalarray_0[ivar1] = getItemHashmapData(arg0, 701); + globalarray_0[ivar1] = getItemHashmapData(arg0, 702); + ivar1 = add(ivar1, 1); + } + if (getItemHashmapData(arg0, 703) != -1) { + globalarray_0[ivar1] = getItemHashmapData(arg0, 703); + globalarray_0[ivar1] = getItemHashmapData(arg0, 704); + ivar1 = add(ivar1, 1); + } + if (getItemHashmapData(arg0, 705) != -1) { + globalarray_0[ivar1] = getItemHashmapData(arg0, 705); + globalarray_0[ivar1] = getItemHashmapData(arg0, 706); + ivar1 = add(ivar1, 1); + } + if (getItemHashmapData(arg0, 707) != -1) { + globalarray_0[ivar1] = getItemHashmapData(arg0, 707); + globalarray_0[ivar1] = getItemHashmapData(arg0, 708); + ivar1 = add(ivar1, 1); + } + return newstruct cs2func_script_767_struct(globalarray_0[0], globalarray_0[1], globalarray_0[2], globalarray_0[3], globalarray_0[4], globalarray_0[5], globalarray_0[6], globalarray_0[7], globalarray_0[8], globalarray_0[9], globalarray_1[0], globalarray_1[1], globalarray_1[2], globalarray_1[3], globalarray_1[4], globalarray_1[5], globalarray_1[6], globalarray_1[7], globalarray_1[8], globalarray_1[9]); +} diff --git a/dumps/scripts/768.cs2 b/dumps/scripts/768.cs2 new file mode 100644 index 000000000..474ffb41c --- /dev/null +++ b/dumps/scripts/768.cs2 @@ -0,0 +1,6 @@ +int script_768(int arg0,int arg1) { + if (getItemAmtInContainer(93, arg1) < 1) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/769.cs2 b/dumps/scripts/769.cs2 new file mode 100644 index 000000000..e6f3e8459 --- /dev/null +++ b/dumps/scripts/769.cs2 @@ -0,0 +1,26 @@ +void script_769() { + int ivar0; + int ivar1; + ivar0 = cs2method_3408(111, 111, 1283, standart_config_448); + if (ivar0 == 526) { + setWidgetText(new WidgetPointer(662,66), "0"); + return; + } + ivar1 = getItemAmtInContainer(93, ivar0); + if (ivar1 > 0) { + if (ivar1 > 1000000) { + ivar1 = divide(ivar1, 1000000); + setWidgetText(new WidgetPointer(662,66), intToStr(ivar1) + "M"); + return; + } + if (ivar1 > 1000) { + ivar1 = divide(ivar1, 1000); + setWidgetText(new WidgetPointer(662,66), intToStr(ivar1) + "K"); + return; + } + setWidgetText(new WidgetPointer(662,66), intToStr(getItemAmtInContainer(93, ivar0))); + return; + } + setWidgetText(new WidgetPointer(662,66), "0"); + return; +} diff --git a/dumps/scripts/77.cs2 b/dumps/scripts/77.cs2 new file mode 100644 index 000000000..64586b81e --- /dev/null +++ b/dumps/scripts/77.cs2 @@ -0,0 +1,9 @@ +void script_77(string arg0) { + script_78(globalint_4, arg0); + globalint_4 = add(globalint_4, 1); + if (globalint_4 >= 20) { + globalint_4 = 0; + } + globalint_3 = -1; + return; +} diff --git a/dumps/scripts/770.cs2 b/dumps/scripts/770.cs2 new file mode 100644 index 000000000..95735f8dd --- /dev/null +++ b/dumps/scripts/770.cs2 @@ -0,0 +1,231 @@ +void script_770(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,int arg21,int arg22,int arg23,string arg24) { + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar24 = getLineCount(177, 495, "Level " + intToStr(arg3) + ": " + arg24); + ivar25 = add(2, multiply(13, ivar24)); + ivar26 = add(2, multiply(13, getLineCount(177, 494, "To craft this you need"))); + ivar27 = add(add(add(add(add(2, ivar25), ivar26), 32), 14), 2); + ivar28 = 5; + ivar29 = 5; + ivar30 = 1; + ivar31 = 1; + if (setWidgetRegister(new WidgetPointer(arg2), arg0)) { + if (arg4 == -1) { + ivar27 = subtract(subtract(ivar27, 32), 14); + } + if (ivar24 > 1) { + if (arg12 != -1) { + ivar27 = add(ivar27, 57); + } + } else { + if (arg12 != -1) { + ivar27 = add(add(ivar27, 32), 14); + } + } + ivar28 = add(subtract(getWidgetActualY(), cs2method2601(new WidgetPointer(arg2))), 110); + if (ivar28 > 200) { + ivar28 = add(subtract(subtract(getWidgetActualY(), cs2method2601(new WidgetPointer(arg2))), ivar27), 45); + } + ivar29 = subtract(getWidgetActualX(), 60); + if (ivar29 < 0) { + ivar29 = 5; + } + if (ivar29 > 270) { + ivar29 = 285; + } + createExtraChild(new WidgetPointer(arg1), 3, 0); + setWidgetPosition(ivar29, ivar28, 0, 0); + setWidgetSize(180, ivar27, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(42); + createExtraChild(new WidgetPointer(arg1), 3, 1); + setWidgetPosition(add(ivar29, 1), add(ivar28, 1), 0, 0); + setWidgetSize(179, subtract(ivar27, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(46, 43, 35)); + createExtraChild(new WidgetPointer(arg1), 3, 2); + setWidgetPosition(ivar29, ivar28, 0, 0); + setWidgetSize(179, subtract(ivar27, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(114, 100, 81)); + createExtraChild(new WidgetPointer(arg1), 4, 3); + setWidgetPosition(add(ivar29, 2), add(ivar28, 2), 0, 0); + setWidgetSize(177, ivar25, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(false); + setWidgetText("Level " + intToStr(arg3) + ": " + arg24); + createExtraChild(new WidgetPointer(arg1), 4, 4); + setWidgetPosition(ivar29, add(add(ivar28, 2), ivar25), 0, 0); + setWidgetSize(177, ivar26, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + setWidgetRGB(new Color(175, 106, 26)); + setWidgetUnknownBoolean(false); + setWidgetText("This item requires"); + if (arg6 != -1) { + ivar30 = 2; + } + if (arg8 != -1) { + ivar30 = 3; + } + if (arg10 != -1) { + ivar30 = 4; + } + ivar31 = divide(subtract(190, multiply(ivar30, 35)), add(ivar30, 1)); + if (arg4 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 5); + setWidgetPosition(add(ivar29, ivar31), add(add(add(ivar28, 2), ivar25), ivar26), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg4, -1); + createExtraChild(new WidgetPointer(arg1), 4, 6); + setWidgetPosition(add(ivar29, ivar31), add(add(add(add(ivar28, 2), ivar25), ivar26), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_771(arg4) >= arg5) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_781(script_771(arg4)) + "/" + intToStr(arg5)); + } + if (arg6 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 7); + setWidgetPosition(add(add(ivar29, multiply(ivar31, 2)), 35), add(add(add(ivar28, 2), ivar25), ivar26), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg6, -1); + createExtraChild(new WidgetPointer(arg1), 4, 8); + setWidgetPosition(add(add(ivar29, multiply(ivar31, 2)), 35), add(add(add(add(ivar28, 2), ivar25), ivar26), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_771(arg6) >= arg7) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_780(script_771(arg6)) + "/" + intToStr(arg7)); + } + if (arg8 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 9); + setWidgetPosition(add(add(ivar29, multiply(ivar31, 3)), 70), add(add(add(ivar28, 2), ivar25), ivar26), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg8, -1); + createExtraChild(new WidgetPointer(arg1), 4, 10); + setWidgetPosition(add(add(ivar29, multiply(ivar31, 3)), 70), add(add(add(add(ivar28, 2), ivar25), ivar26), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_771(arg8) >= arg9) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_780(script_771(arg8)) + "/" + intToStr(arg9)); + } + if (arg10 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 11); + setWidgetPosition(add(add(ivar29, multiply(ivar31, 4)), 105), add(add(add(ivar28, 2), ivar25), ivar26), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg10, -1); + createExtraChild(new WidgetPointer(arg1), 4, 12); + setWidgetPosition(add(add(ivar29, multiply(ivar31, 4)), 105), add(add(add(add(ivar28, 2), ivar25), ivar26), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_771(arg10) >= arg11) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_780(script_771(arg10)) + "/" + intToStr(arg11)); + } + if (arg12 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 13); + setWidgetPosition(add(ivar29, ivar31), add(add(add(ivar28, 16), multiply(2, ivar25)), multiply(2, ivar26)), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg12, -1); + createExtraChild(new WidgetPointer(arg1), 4, 14); + setWidgetPosition(add(ivar29, ivar31), add(add(add(add(ivar28, 16), multiply(2, ivar25)), multiply(2, ivar26)), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_771(arg12) >= arg13) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_780(script_771(arg12)) + "/" + intToStr(arg13)); + } + if (arg14 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 15); + setWidgetPosition(add(add(ivar29, multiply(ivar31, 2)), 35), add(add(add(ivar28, 16), multiply(2, ivar25)), multiply(2, ivar26)), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg14, -1); + createExtraChild(new WidgetPointer(arg1), 4, 16); + setWidgetPosition(add(add(ivar29, multiply(ivar31, 2)), 35), add(add(add(add(ivar28, 16), multiply(2, ivar25)), multiply(2, ivar26)), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_771(arg14) >= arg15) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_780(script_771(arg14)) + "/" + intToStr(arg15)); + } + if (arg16 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 15); + setWidgetPosition(add(add(add(ivar29, multiply(ivar31, 3)), 35), 2), add(add(add(ivar28, 16), multiply(2, ivar25)), multiply(2, ivar26)), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg16, -1); + createExtraChild(new WidgetPointer(arg1), 4, 16); + setWidgetPosition(add(add(add(ivar29, multiply(ivar31, 3)), 35), 2), add(add(add(add(ivar28, 16), multiply(2, ivar25)), multiply(2, ivar26)), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_771(arg16) >= arg17) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_780(script_771(arg16)) + "/" + intToStr(arg17)); + } + if (arg18 != -1) { + createExtraChild(new WidgetPointer(arg1), 5, 15); + setWidgetPosition(add(add(add(ivar29, multiply(ivar31, 4)), 35), 3), add(add(add(ivar28, 16), multiply(2, ivar25)), multiply(2, ivar26)), 0, 0); + setWidgetSize(35, 32, 0, 0); + setItemOnWidgetMethod1200(arg18, -1); + createExtraChild(new WidgetPointer(arg1), 4, 16); + setWidgetPosition(add(add(add(ivar29, multiply(ivar31, 4)), 35), 3), add(add(add(add(ivar28, 16), multiply(2, ivar25)), multiply(2, ivar26)), 32), 0, 0); + setWidgetSize(35, 14, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(494); + if (script_771(arg18) >= arg19) { + setWidgetRGB(new Color(0, 255, 0)); + } else { + setWidgetRGB(new Color(255, 0, 0)); + } + setWidgetUnknownBoolean(false); + setWidgetText(script_780(script_771(arg18)) + "/" + intToStr(arg19)); + } + } + return; +} diff --git a/dumps/scripts/771.cs2 b/dumps/scripts/771.cs2 new file mode 100644 index 000000000..7ab2abeee --- /dev/null +++ b/dumps/scripts/771.cs2 @@ -0,0 +1,11 @@ +int script_771(int arg0) { + switch (arg0) { + case 6287: + return add(getItemAmtInContainer(93, 6287), getItemAmtInContainer(93, 7801)); + case 6979: + return add(add(getItemAmtInContainer(93, 6979), getItemAmtInContainer(93, 6981)), getItemAmtInContainer(93, 6983)); + case 2462: + return add(add(add(add(add(add(getItemAmtInContainer(93, 2462), getItemAmtInContainer(93, 2460)), getItemAmtInContainer(93, 2464)), getItemAmtInContainer(93, 2466)), getItemAmtInContainer(93, 2468)), getItemAmtInContainer(93, 2470)), getItemAmtInContainer(93, 2472)); + } + return script_1(93, arg0); +} diff --git a/dumps/scripts/772.cs2 b/dumps/scripts/772.cs2 new file mode 100644 index 000000000..cf4487048 --- /dev/null +++ b/dumps/scripts/772.cs2 @@ -0,0 +1,5 @@ +void script_772(int arg0) { + script_1184(arg0); + setScriptCallOnGeneralDataChange(838, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/773.cs2 b/dumps/scripts/773.cs2 new file mode 100644 index 000000000..9a1f22cc2 --- /dev/null +++ b/dumps/scripts/773.cs2 @@ -0,0 +1,34 @@ +void script_773(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12) { + if (isWidgetHidden(new WidgetPointer(arg1))) { + if ((arg5 != -1) && (script_19(arg5, arg0) < arg6)) { + setWidgetSprite(arg3, new WidgetPointer(arg0)); + return; + } + if ((arg7 != -1) && (script_19(arg7, arg0) < arg8)) { + setWidgetSprite(arg3, new WidgetPointer(arg0)); + return; + } + if ((arg9 != -1) && (script_19(arg9, arg0) < arg10)) { + setWidgetSprite(arg3, new WidgetPointer(arg0)); + return; + } + if ((arg11 != -1) && (script_19(arg11, arg0) < arg12)) { + setWidgetSprite(arg3, new WidgetPointer(arg0)); + return; + } + if (getSkillActualLvl(23) < arg4) { + if (((boolean)bitconfig_4089)) { + if ((standart_config_1092 < arg4) || ((boolean)cs2method_3408(73, 105, 1061, arg0))) { + setWidgetSprite(arg3, new WidgetPointer(arg0)); + return; + } + } else { + setWidgetSprite(arg3, new WidgetPointer(arg0)); + return; + } + } else { + setWidgetSprite(arg2, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/774.cs2 b/dumps/scripts/774.cs2 new file mode 100644 index 000000000..f9ee065ca --- /dev/null +++ b/dumps/scripts/774.cs2 @@ -0,0 +1,5 @@ +void script_774(int arg0,int arg1) { + setItemOnWidgetMethod2205(standart_config_851, 1, new WidgetPointer(arg0)); + setItemOnWidgetMethod2205(standart_config_852, 1, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/775.cs2 b/dumps/scripts/775.cs2 new file mode 100644 index 000000000..ac6d95e49 --- /dev/null +++ b/dumps/scripts/775.cs2 @@ -0,0 +1,30 @@ +cs2func_script_775_struct(2,1,0) script_775() { + flow_0: + SWITCH (standart_config_448) { + case 12073: + GOTO flow_1 + case 12075: + GOTO flow_2 + case 12077: + GOTO flow_3 + case 12079: + GOTO flow_4 + case 12081: + GOTO flow_5 + case 12083: + GOTO flow_6 + } + return newstruct cs2func_script_775_struct(36, 12461, "Bronze Bull Rush"); + flow_1: + return newstruct cs2func_script_775_struct(36, 12461, "Bronze Bull Rush"); + flow_2: + return newstruct cs2func_script_775_struct(46, 12462, "Iron Bull Rush"); + flow_3: + return newstruct cs2func_script_775_struct(56, 12463, "Steel Bull Rush"); + flow_4: + return newstruct cs2func_script_775_struct(66, 12464, "Mithril Bull Rush"); + flow_5: + return newstruct cs2func_script_775_struct(76, 12465, "Adamant Bull Rush"); + flow_6: + return newstruct cs2func_script_775_struct(86, 12466, "Rune Bull Rush"); +} diff --git a/dumps/scripts/776.cs2 b/dumps/scripts/776.cs2 new file mode 100644 index 000000000..43a3441df --- /dev/null +++ b/dumps/scripts/776.cs2 @@ -0,0 +1,40 @@ +void script_776() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + string svar0; + string svar1; + string svar2; + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + svar0 = "Hello"; + svar1 = "00:00"; + svar2 = "1.1x"; + if (((boolean)bitconfig_7232)) { + ivar0 = divide(bitconfig_7233, 60); + ivar1 = mod(bitconfig_7233, 60); + ivar2 = divide(script_338(16), 1000); + ivar3 = divide(mod(script_338(16), 1000), 100); + if (ivar1 < 10) { + if (ivar0 < 10) { + svar1 = "0" + intToStr(ivar0) + ":0" + intToStr(ivar1); + } else { + svar1 = intToStr(ivar0) + ":0" + intToStr(ivar1); + } + } else if (ivar0 < 10) { + svar1 = "0" + intToStr(ivar0) + ":" + intToStr(ivar1); + } else { + svar1 = intToStr(ivar0) + ":" + intToStr(ivar1); + } + svar2 = intToStr(ivar2) + "." + intToStr(ivar3) + "x"; + svar0 = "Multiplier:" + "" + svar2 + "" + "
" + "Elapsed:" + "" + svar1 + "" + "
" + "Bonus:" + "" + intToStr(divide(standart_config_1878, 10)) + "xp" + ""; + setScriptCallOnMouseOver(38, new WidgetPointer(746,190), new WidgetPointer(746,186), svar0, 0, 500, "IIsii", new WidgetPointer(746,190)); + setScriptCallOnMouseExit(40, new WidgetPointer(746,186), "I", new WidgetPointer(746,190)); + setScriptCallOnMouseOver(38, new WidgetPointer(548,27), new WidgetPointer(548,23), svar0, 0, 500, "IIsii", new WidgetPointer(548,27)); + setScriptCallOnMouseExit(40, new WidgetPointer(548,23), "I", new WidgetPointer(548,27)); + } + return; +} diff --git a/dumps/scripts/777.cs2 b/dumps/scripts/777.cs2 new file mode 100644 index 000000000..155b66309 --- /dev/null +++ b/dumps/scripts/777.cs2 @@ -0,0 +1,48 @@ +void script_777(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar4 = add(2, multiply(13, getLineCount(125, 495, intToStr(standart_config_1177) + "/60 special move points remaining"))); + ivar5 = add(add(add(add(2, ivar4), 32), 14), 2); + ivar6 = 5; + ivar7 = 5; + ivar8 = 1; + ivar9 = 1; + ivar5 = subtract(subtract(ivar5, 32), 14); + ivar6 = getWidgetActualY(new WidgetPointer(arg0)); + if (ivar6 == 224) { + ivar6 = 180; + } + ivar7 = subtract(getWidgetActualX(new WidgetPointer(arg0)), 60); + if (ivar7 < 0) { + ivar7 = 5; + } + createExtraChild(new WidgetPointer(arg1), 3, 0); + setWidgetPosition(ivar7, ivar6, 0, 0); + setWidgetSize(128, ivar5, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 160)); + createExtraChild(new WidgetPointer(arg1), 3, 1); + setWidgetPosition(add(ivar7, 1), add(ivar6, 1), 0, 0); + setWidgetSize(127, subtract(ivar5, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg1), 3, 2); + setWidgetPosition(ivar7, ivar6, 0, 0); + setWidgetSize(127, subtract(ivar5, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg1), 4, 3); + setWidgetPosition(add(ivar7, 2), add(ivar6, 2), 0, 0); + setWidgetSize(125, ivar4, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetText(intToStr(standart_config_1177) + "/60 special move points remaining"); + return; +} diff --git a/dumps/scripts/778.cs2 b/dumps/scripts/778.cs2 new file mode 100644 index 000000000..f9f6aabcb --- /dev/null +++ b/dumps/scripts/778.cs2 @@ -0,0 +1,4 @@ +void script_778(int arg0) { + deleteAllExtraChilds(new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/779.cs2 b/dumps/scripts/779.cs2 new file mode 100644 index 000000000..a739e81fe --- /dev/null +++ b/dumps/scripts/779.cs2 @@ -0,0 +1,57 @@ +void script_779(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + deleteAllExtraChilds(new WidgetPointer(arg1)); + if (((boolean)stringMethod4107(arg4, "Call familiar")) && (cs2method_3408(111, 111, 1283, standart_config_448) == 526)) { + arg4 = "Call pet"; + } + if (((boolean)stringMethod4107(arg4, "Dismiss familiar")) && (cs2method_3408(111, 111, 1283, standart_config_448) == 526)) { + arg4 = "Dismiss pet"; + } + ivar4 = add(2, multiply(13, getLineCount(125, 495, arg4))); + ivar5 = add(add(add(add(2, ivar4), 32), 14), 2); + ivar6 = 5; + ivar7 = 5; + ivar8 = 1; + ivar9 = 1; + ivar5 = subtract(subtract(ivar5, 32), 14); + ivar6 = getWidgetActualY(new WidgetPointer(arg0)); + if ((ivar6 == 225) && (getWidgetActualX(new WidgetPointer(arg0)) == 83)) { + ivar6 = 180; + } + ivar7 = subtract(getWidgetActualX(new WidgetPointer(arg0)), 60); + if (ivar7 < 0) { + ivar7 = 5; + } + if (ivar7 > 70) { + ivar7 = 65; + } + createExtraChild(new WidgetPointer(arg1), 3, 0); + setWidgetPosition(ivar7, ivar6, 0, 0); + setWidgetSize(128, ivar5, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 255, 160)); + createExtraChild(new WidgetPointer(arg1), 3, 1); + setWidgetPosition(add(ivar7, 1), add(ivar6, 1), 0, 0); + setWidgetSize(127, subtract(ivar5, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg1), 3, 2); + setWidgetPosition(ivar7, ivar6, 0, 0); + setWidgetSize(127, subtract(ivar5, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(0, 0, 0)); + createExtraChild(new WidgetPointer(arg1), 4, 3); + setWidgetPosition(add(ivar7, 2), add(ivar6, 2), 0, 0); + setWidgetSize(125, ivar4, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetUnknownBoolean(false); + setWidgetText(arg4); + return; +} diff --git a/dumps/scripts/78.cs2 b/dumps/scripts/78.cs2 new file mode 100644 index 000000000..4da0c4bc9 --- /dev/null +++ b/dumps/scripts/78.cs2 @@ -0,0 +1,58 @@ +void script_78(int arg0,string arg1) { + if (arg0 < 10) { + if (arg0 < 5) { + if (((boolean)arg0)) { + globalstring_2 = arg1; + } else if (((boolean)arg0)) { + globalstring_3 = arg1; + } else if (arg0 == 2) { + globalstring_4 = arg1; + } else if (arg0 == 3) { + globalstring_5 = arg1; + } else { + if (arg0 == 4) { + globalstring_6 = arg1; + } + } + } else if (arg0 == 5) { + globalstring_7 = arg1; + } else if (arg0 == 6) { + globalstring_8 = arg1; + } else if (arg0 == 7) { + globalstring_9 = arg1; + } else if (arg0 == 8) { + globalstring_10 = arg1; + } else { + if (arg0 == 9) { + globalstring_11 = arg1; + } + } + } else if (arg0 < 15) { + if (arg0 == 10) { + globalstring_12 = arg1; + } else if (arg0 == 11) { + globalstring_13 = arg1; + } else if (arg0 == 12) { + globalstring_14 = arg1; + } else if (arg0 == 13) { + globalstring_15 = arg1; + } else { + if (arg0 == 14) { + globalstring_16 = arg1; + } + } + } else if (arg0 == 15) { + globalstring_17 = arg1; + } else if (arg0 == 16) { + globalstring_18 = arg1; + } else if (arg0 == 17) { + globalstring_19 = arg1; + } else if (arg0 == 18) { + globalstring_20 = arg1; + } else { + if (arg0 == 19) { + globalstring_21 = arg1; + } + } + return; +} diff --git a/dumps/scripts/780.cs2 b/dumps/scripts/780.cs2 new file mode 100644 index 000000000..f8cf487f7 --- /dev/null +++ b/dumps/scripts/780.cs2 @@ -0,0 +1,9 @@ +string script_780(int arg0) { + if (arg0 >= 999999) { + return "*"; + } + if (arg0 >= 10000) { + return concat(intToStr(divide(arg0, 1000)), "K"); + } + return intToStr(arg0); +} diff --git a/dumps/scripts/781.cs2 b/dumps/scripts/781.cs2 new file mode 100644 index 000000000..f9a319ed2 --- /dev/null +++ b/dumps/scripts/781.cs2 @@ -0,0 +1,6 @@ +string script_781(int arg0) { + if (arg0 >= 1000) { + return "*"; + } + return intToStr(arg0); +} diff --git a/dumps/scripts/782.cs2 b/dumps/scripts/782.cs2 new file mode 100644 index 000000000..77c02cc10 --- /dev/null +++ b/dumps/scripts/782.cs2 @@ -0,0 +1,56 @@ +void script_782(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar4 = add(2, multiply(13, getLineCount(177, 495, "This space is reserved"))); + ivar5 = add(2, multiply(13, getLineCount(177, 494, "You cannot make this pouch."))); + ivar6 = add(add(add(add(add(2, ivar4), ivar5), 32), 14), 2); + ivar7 = 5; + ivar8 = 5; + ivar9 = 1; + ivar10 = 1; + if (setWidgetRegister(new WidgetPointer(arg2), arg0)) { + ivar6 = subtract(subtract(ivar6, 32), 14); + ivar7 = add(subtract(getWidgetActualY(), cs2method2601(new WidgetPointer(arg2))), 110); + if (ivar7 > 200) { + ivar7 = add(subtract(subtract(getWidgetActualY(), cs2method2601(new WidgetPointer(arg2))), ivar6), 45); + } + ivar8 = subtract(getWidgetActualX(), 60); + if (ivar8 < 0) { + ivar8 = 5; + } + if (ivar8 > 270) { + ivar8 = 285; + } + createExtraChild(new WidgetPointer(arg1), 3, 0); + setWidgetPosition(ivar8, ivar7, 0, 0); + setWidgetSize(180, ivar6, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(42); + createExtraChild(new WidgetPointer(arg1), 3, 1); + setWidgetPosition(add(ivar8, 1), add(ivar7, 1), 0, 0); + setWidgetSize(179, subtract(ivar6, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(46, 43, 35)); + createExtraChild(new WidgetPointer(arg1), 3, 2); + setWidgetPosition(ivar8, ivar7, 0, 0); + setWidgetSize(179, subtract(ivar6, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(114, 100, 81)); + createExtraChild(new WidgetPointer(arg1), 4, 3); + setWidgetPosition(add(ivar8, 2), add(ivar7, 2), 0, 0); + setWidgetSize(177, ivar4, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(false); + setWidgetText("This space is reserved."); + } + return; +} diff --git a/dumps/scripts/783.cs2 b/dumps/scripts/783.cs2 new file mode 100644 index 000000000..0479771c2 --- /dev/null +++ b/dumps/scripts/783.cs2 @@ -0,0 +1,15 @@ +void script_783() { + if (bitconfig_4762 != globalint_155) { + globalint_155 = bitconfig_4762; + if (((boolean)bitconfig_4762)) { + script_1029(1484, 9); + } else if (bitconfig_4762 == 2) { + script_1032(1486, 0, 7); + } else { + if (bitconfig_4762 == 3) { + script_1030(1485); + } + } + } + return; +} diff --git a/dumps/scripts/784.cs2 b/dumps/scripts/784.cs2 new file mode 100644 index 000000000..ebe52c7c2 --- /dev/null +++ b/dumps/scripts/784.cs2 @@ -0,0 +1,4 @@ +void script_784(int arg0,int arg1,int arg2) { + script_1032(arg0, arg1, arg2); + return; +} diff --git a/dumps/scripts/785.cs2 b/dumps/scripts/785.cs2 new file mode 100644 index 000000000..8cc079cc5 --- /dev/null +++ b/dumps/scripts/785.cs2 @@ -0,0 +1,86 @@ +void script_785(int arg0) { + globalint_988 = 0; + globalint_989 = 0; + globalint_990 = 0; + globalint_991 = 0; + switch (arg0) { + case 12582919: + globalint_988 = 1; + if (((boolean)bitconfig_6459)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 12582921: + globalint_989 = 1; + if (((boolean)bitconfig_6462)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 12582923: + globalint_990 = 1; + if (((boolean)bitconfig_6461)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 12582925: + globalint_991 = 1; + if (((boolean)bitconfig_6460)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 28180485: + globalint_988 = 1; + if (((boolean)bitconfig_6463)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 28180489: + globalint_990 = 1; + if (((boolean)bitconfig_6464)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 28180487: + globalint_989 = 1; + if (((boolean)bitconfig_6465)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 12648453: + globalint_988 = 1; + if (((boolean)bitconfig_6466)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 12648455: + globalint_989 = 1; + if (((boolean)bitconfig_6467)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 62259207: + globalint_988 = 1; + if (((boolean)bitconfig_7348)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 62259209: + globalint_989 = 1; + if (((boolean)bitconfig_7351)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 62259211: + globalint_990 = 1; + if (((boolean)bitconfig_7350)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + break; + case 62259213: + globalint_991 = 1; + if (((boolean)bitconfig_7349)) { + setWidgetSprite(1702, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/786.cs2 b/dumps/scripts/786.cs2 new file mode 100644 index 000000000..79c51ef73 --- /dev/null +++ b/dumps/scripts/786.cs2 @@ -0,0 +1,20 @@ +void script_786(int arg0) { + if (arg0 == 70254793) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1072,53)); + } else if (arg0 == 70254805) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1072,53)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1072,49)); + } else if (arg0 == 70254817) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1072,57)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1072,49)); + } else if (arg0 == 70254829) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1072,61)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1072,49)); + } else { + if (arg0 == 70254841) { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1072,65)); + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(1072,49)); + } + } + return; +} diff --git a/dumps/scripts/787.cs2 b/dumps/scripts/787.cs2 new file mode 100644 index 000000000..73e2ee5a3 --- /dev/null +++ b/dumps/scripts/787.cs2 @@ -0,0 +1,23 @@ +void script_787(int arg0) { + deleteAllExtraChilds(new WidgetPointer(667,5)); + script_1516(43712517, 375, 125); + script_2647(43712517); + script_2373(arg0, -1); + script_2947(); + script_680(43712577); + setScriptCallOnMouseEntered(95, new WidgetPointer(-32768,3), "I", new WidgetPointer(667,65)); + setScriptCallOnMouseExit(93, new WidgetPointer(-32768,3), "I", new WidgetPointer(667,65)); + setScriptCallOnGlobalStringChange(2782, 321, 322, 323, 324, 325, 5, "Y", new WidgetPointer(arg0)); + if (((boolean)bitconfig_4894)) { + setWidgetIsHidden(false, new WidgetPointer(667,49)); + } else { + setWidgetIsHidden(true, new WidgetPointer(667,49)); + } + script_2957(43712562); + setScriptCallOnMouseEntered(1413, new WidgetPointer(-32768,3), "I", new WidgetPointer(667,50)); + setScriptCallOnMouseExit(1414, new WidgetPointer(-32768,3), "I", new WidgetPointer(667,50)); + setScriptCallOnConfigChange(2371, 1248, 1, "Y", new WidgetPointer(arg0)); + setScriptCallOnGeneralDataChange(690, "", new WidgetPointer(667,25)); + setScriptCallOnGeneralDataChange(690, "", new WidgetPointer(762,121)); + return; +} diff --git a/dumps/scripts/788.cs2 b/dumps/scripts/788.cs2 new file mode 100644 index 000000000..d5c675b25 --- /dev/null +++ b/dumps/scripts/788.cs2 @@ -0,0 +1,3 @@ +cs2func_script_788_struct(2,0,0) script_788(int arg0,int arg1,int arg2) { + return newstruct cs2func_script_788_struct(add(getWidgetActualX(new WidgetPointer(arg0)), arg1), add(getWidgetActualY(new WidgetPointer(arg0)), arg2)); +} diff --git a/dumps/scripts/789.cs2 b/dumps/scripts/789.cs2 new file mode 100644 index 000000000..e10ac1dab --- /dev/null +++ b/dumps/scripts/789.cs2 @@ -0,0 +1,48 @@ +void script_789(int arg0) { + flow_0: + IF ((((((((arg0 == 74645541) || (arg0 == 74645542)) || (arg0 == 74645543)) || (arg0 == 74645545)) || (arg0 == 74645553)) || (arg0 == 74645555)) || (arg0 == 74645556)) || (arg0 == 74645554)) + GOTO flow_1 + IF ((arg0 == 74645557) && isMember()) + GOTO flow_2 + GOTO flow_3 + flow_1: + flow_2: + return; + flow_3: + if ((arg0 == 74645557) && (bitconfig_4302 < 110)) { + return; + } + if ((arg0 == 74645542) && (standart_config_80 < 4)) { + return; + } + if ((arg0 == 74645556) && ((boolean)bitconfig_2187)) { + return; + } + setWidgetIsHidden(true, new WidgetPointer(1139,4)); + setWidgetIsHidden(true, new WidgetPointer(1139,21)); + setWidgetIsHidden(true, new WidgetPointer(1139,22)); + setWidgetIsHidden(true, new WidgetPointer(1139,23)); + setWidgetIsHidden(true, new WidgetPointer(1139,24)); + setWidgetIsHidden(true, new WidgetPointer(1139,25)); + setWidgetIsHidden(true, new WidgetPointer(1139,27)); + setWidgetIsHidden(true, new WidgetPointer(1139,5)); + setWidgetIsHidden(true, new WidgetPointer(1139,6)); + setWidgetIsHidden(true, new WidgetPointer(1139,8)); + setWidgetIsHidden(true, new WidgetPointer(1139,26)); + setWidgetIsHidden(true, new WidgetPointer(1139,9)); + setWidgetIsHidden(true, new WidgetPointer(1139,12)); + setWidgetIsHidden(true, new WidgetPointer(1139,13)); + setWidgetIsHidden(true, new WidgetPointer(1139,7)); + setWidgetIsHidden(true, new WidgetPointer(1139,15)); + setWidgetIsHidden(true, new WidgetPointer(1139,16)); + setWidgetIsHidden(true, new WidgetPointer(1139,17)); + setWidgetIsHidden(true, new WidgetPointer(1139,18)); + setWidgetIsHidden(true, new WidgetPointer(1139,10)); + setWidgetIsHidden(true, new WidgetPointer(1139,11)); + setWidgetIsHidden(true, new WidgetPointer(1139,19)); + setWidgetIsHidden(true, new WidgetPointer(1139,14)); + setWidgetIsHidden(true, new WidgetPointer(1139,20)); + setWidgetIsHidden(true, new WidgetPointer(1139,28)); + setWidgetIsHidden(false, new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/79.cs2 b/dumps/scripts/79.cs2 new file mode 100644 index 000000000..400ffba00 --- /dev/null +++ b/dumps/scripts/79.cs2 @@ -0,0 +1,70 @@ +string script_79(int arg0) { + if (arg0 < 10) { + if (arg0 < 5) { + if (((boolean)arg0)) { + return globalstring_2; + } + if (((boolean)arg0)) { + return globalstring_3; + } + if (arg0 == 2) { + return globalstring_4; + } + if (arg0 == 3) { + return globalstring_5; + } + if (arg0 == 4) { + return globalstring_6; + } + } else { + if (arg0 == 5) { + return globalstring_7; + } + if (arg0 == 6) { + return globalstring_8; + } + if (arg0 == 7) { + return globalstring_9; + } + if (arg0 == 8) { + return globalstring_10; + } + if (arg0 == 9) { + return globalstring_11; + } + } + } else if (arg0 < 15) { + if (arg0 == 10) { + return globalstring_12; + } + if (arg0 == 11) { + return globalstring_13; + } + if (arg0 == 12) { + return globalstring_14; + } + if (arg0 == 13) { + return globalstring_15; + } + if (arg0 == 14) { + return globalstring_16; + } + } else { + if (arg0 == 15) { + return globalstring_17; + } + if (arg0 == 16) { + return globalstring_18; + } + if (arg0 == 17) { + return globalstring_19; + } + if (arg0 == 18) { + return globalstring_20; + } + if (arg0 == 19) { + return globalstring_21; + } + } + return ""; +} diff --git a/dumps/scripts/790.cs2 b/dumps/scripts/790.cs2 new file mode 100644 index 000000000..4847c313e --- /dev/null +++ b/dumps/scripts/790.cs2 @@ -0,0 +1,128 @@ +void script_790() { + if (((boolean)standart_config_261)) { + setWidgetIsHidden(false, new WidgetPointer(1139,4)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,4)); + } + if (standart_config_261 == 2) { + setWidgetIsHidden(false, new WidgetPointer(1139,21)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,21)); + } + if (standart_config_261 == 3) { + setWidgetIsHidden(false, new WidgetPointer(1139,22)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,22)); + } + if (standart_config_261 == 4) { + setWidgetIsHidden(false, new WidgetPointer(1139,23)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,23)); + } + if (standart_config_261 == 5) { + setWidgetIsHidden(false, new WidgetPointer(1139,24)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,24)); + } + if (standart_config_261 == 6) { + setWidgetIsHidden(false, new WidgetPointer(1139,25)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,25)); + } + if (standart_config_261 == 7) { + setWidgetIsHidden(false, new WidgetPointer(1139,27)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,27)); + } + if (standart_config_261 == 8) { + setWidgetIsHidden(false, new WidgetPointer(1139,5)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,5)); + } + if (standart_config_261 == 9) { + setWidgetIsHidden(false, new WidgetPointer(1139,6)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,6)); + } + if (standart_config_261 == 10) { + setWidgetIsHidden(false, new WidgetPointer(1139,8)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,8)); + } + if (standart_config_261 == 11) { + setWidgetIsHidden(false, new WidgetPointer(1139,26)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,26)); + } + if (standart_config_261 == 12) { + setWidgetIsHidden(false, new WidgetPointer(1139,9)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,9)); + } + if (standart_config_261 == 13) { + setWidgetIsHidden(false, new WidgetPointer(1139,12)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,12)); + } + if (standart_config_261 == 14) { + setWidgetIsHidden(false, new WidgetPointer(1139,13)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,13)); + } + if (standart_config_261 == 15) { + setWidgetIsHidden(false, new WidgetPointer(1139,7)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,7)); + } + if (standart_config_261 == 16) { + setWidgetIsHidden(false, new WidgetPointer(1139,15)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,15)); + } + if (standart_config_261 == 17) { + setWidgetIsHidden(false, new WidgetPointer(1139,16)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,16)); + } + if (standart_config_261 == 18) { + setWidgetIsHidden(false, new WidgetPointer(1139,17)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,17)); + } + if (standart_config_261 == 19) { + setWidgetIsHidden(false, new WidgetPointer(1139,18)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,18)); + } + if (standart_config_261 == 20) { + setWidgetIsHidden(false, new WidgetPointer(1139,10)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,10)); + } + if (standart_config_261 == 21) { + setWidgetIsHidden(false, new WidgetPointer(1139,11)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,11)); + } + if (standart_config_261 == 22) { + setWidgetIsHidden(false, new WidgetPointer(1139,19)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,19)); + } + if (standart_config_261 == 23) { + setWidgetIsHidden(false, new WidgetPointer(1139,14)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,14)); + } + if (standart_config_261 == 24) { + setWidgetIsHidden(false, new WidgetPointer(1139,20)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,20)); + } + if (standart_config_261 == 25) { + setWidgetIsHidden(false, new WidgetPointer(1139,28)); + } else { + setWidgetIsHidden(true, new WidgetPointer(1139,28)); + } + return; +} diff --git a/dumps/scripts/791.cs2 b/dumps/scripts/791.cs2 new file mode 100644 index 000000000..4ab450617 --- /dev/null +++ b/dumps/scripts/791.cs2 @@ -0,0 +1,5 @@ +void script_791(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + script_793(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + setScriptCallOnItemContainerUpdate(792, new WidgetPointer(arg0), arg1, arg2, arg5, arg6, arg7, arg8, arg9, arg3, arg4, 93, 1, "IiisssssiiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/792.cs2 b/dumps/scripts/792.cs2 new file mode 100644 index 000000000..592ca2a0a --- /dev/null +++ b/dumps/scripts/792.cs2 @@ -0,0 +1,4 @@ +void script_792(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + script_793(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + return; +} diff --git a/dumps/scripts/793.cs2 b/dumps/scripts/793.cs2 new file mode 100644 index 000000000..ac7e718a3 --- /dev/null +++ b/dumps/scripts/793.cs2 @@ -0,0 +1,127 @@ +void script_793(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + int ivar22; + int ivar23; + int ivar24; + int ivar25; + int ivar26; + int ivar27; + int ivar28; + int ivar29; + int ivar30; + int ivar31; + int ivar32; + int ivar33; + int ivar34; + string svar5; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar5 = 0; + ivar6 = 0; + setWidgetScrollMax(0, multiply(add(divide(subtract(arg4, arg3), arg1), 1), 57), new WidgetPointer(arg0)); + ivar7 = 0; + ivar8 = 1; + ivar9 = 0; + ivar10 = 0; + ivar11 = -1; + ivar12 = 12525; + ivar13 = 12530; + ivar14 = 2859; + ivar15 = 12527; + ivar16 = -1; + ivar17 = -1; + ivar18 = -1; + ivar19 = -1; + ivar20 = -1; + ivar21 = -1; + ivar22 = 1; + ivar23 = 7; + ivar24 = 1; + ivar25 = 1; + ivar26 = 0; + ivar27 = 0; + ivar28 = 0; + ivar29 = 0; + ivar30 = 0; + ivar31 = 0; + svar5 = "hello"; + ivar32 = 0; + globalarray_0 = new int[10]; + ivar33 = -1; + ivar34 = 0; + while (ivar7 <= subtract(arg4, arg3)) { + ivar5 = add(add(16, multiply(mod(ivar7, arg1), 48)), multiply(mod(ivar7, arg1), 5)); + ivar6 = add(multiply(divide(ivar7, arg1), 52), multiply(divide(ivar7, arg1), 5)); + createExtraChild(new WidgetPointer(arg0), 5, ivar34); + ivar34 = add(ivar34, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2205); + setScriptCallOnMouseEntered(2724, new WidgetPointer(-32768,3), ivar34, 0, "Ii1"); + setScriptCallOnMouseExit(2724, new WidgetPointer(-32768,3), ivar34, 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, ivar34); + ivar34 = add(ivar34, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar34); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar5, 6), add(ivar6, 4), 0, 0); + ivar33 = cs2method_3408(105, 111, 1182, ivar8); + if (((boolean)ivar8)) { + if (((boolean)script_795(ivar33))) { + script_794(ivar33, ivar33, arg0, ivar34, arg5, arg6, arg7, arg8, arg9); + } else { + script_794(cs2method_3408(105, 111, 1183, ivar8), ivar33, arg0, ivar34, arg5, arg6, arg7, arg8, arg9); + } + } else if (ivar33 == 12292) { + script_794(ivar33, ivar33, arg0, ivar34, arg5, arg6, arg7, arg8, arg9); + } else { + script_794(cs2method_3408(105, 111, 1183, ivar8), ivar33, arg0, ivar34, arg5, arg6, arg7, arg8, arg9); + } + svar5 = cs2method_3408(111, 115, 1187, ivar33); + ivar32 = cs2method_3408(111, 105, 1185, ivar33); + if (((boolean)ivar8)) { + setScriptCallOnMouseOver(770, -2147483643, new WidgetPointer(672,24), new WidgetPointer(672,16), ivar32, svar5, ivar12, 1, ivar13, ivar23, ivar14, ivar24, ivar15, ivar25, ivar16, ivar26, ivar17, ivar27, ivar18, ivar28, ivar19, ivar29, ivar20, ivar30, ivar21, ivar31, "iIIisoioioioioioioioioioi"); + setScriptCallOnMouseExit(40, new WidgetPointer(672,24), "I"); + } else { + svar5 = "You do not have access to this type of Summoning pouch."; + setScriptCallOnMouseOver(800, -2147483643, new WidgetPointer(672,24), new WidgetPointer(672,16), ivar32, svar5, "iIIis"); + setScriptCallOnMouseExit(40, new WidgetPointer(672,24), "I"); + } + ivar34 = add(ivar34, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar34); + ivar34 = add(ivar34, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar5, 2), add(ivar6, 38), 0, 0); + setItemOnWidgetMethod1205(12183, 1); + createExtraChild(new WidgetPointer(arg0), 4, ivar34); + ivar34 = add(ivar34, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar5, 13), add(ivar6, 39), 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetTextAlignment(2, 1, 0); + setWidgetText(script_940(getItemHashmapData(ivar33, 541))); + setWidgetUnknownBoolean(true); + ivar7 = add(ivar7, 1); + ivar8 = add(ivar8, 1); + } + return; +} diff --git a/dumps/scripts/794.cs2 b/dumps/scripts/794.cs2 new file mode 100644 index 000000000..12cf29271 --- /dev/null +++ b/dumps/scripts/794.cs2 @@ -0,0 +1,26 @@ +void script_794(int arg0,int arg1,int arg2,int arg3,string arg4,string arg5,string arg6,string arg7,string arg8) { + if (setWidgetRegister(new WidgetPointer(arg2), arg3)) { + if (arg0 != -1) { + setItemOnWidgetMethod1200(arg0, -1); + cs2method1305(getItemName(arg1)); + setWidgetContextMenuOption(1, arg4); + setWidgetContextMenuOption(2, arg5); + setWidgetContextMenuOption(3, arg6); + setWidgetContextMenuOption(4, arg7); + setWidgetContextMenuOption(5, arg8); + setWidgetContextMenuOption(6, "Examine" + ""); + setWidgetShadowColor(new Color(51, 51, 51)); + setWidgetBorderThickness(1); + } else { + setItemOnWidgetMethod1200(-1, 0); + cs2method1305(""); + setWidgetContextMenuOption(1, ""); + setWidgetContextMenuOption(2, ""); + setWidgetContextMenuOption(3, ""); + setWidgetContextMenuOption(4, ""); + setWidgetContextMenuOption(5, ""); + setWidgetContextMenuOption(6, ""); + } + } + return; +} diff --git a/dumps/scripts/795.cs2 b/dumps/scripts/795.cs2 new file mode 100644 index 000000000..a7fd745f4 --- /dev/null +++ b/dumps/scripts/795.cs2 @@ -0,0 +1,15 @@ +int script_795(int arg0) { + if (getItemAmtInContainer(93, 2859) < 1) { + return 0; + } + if (getItemAmtInContainer(93, 12530) < 1) { + return 0; + } + if (getItemAmtInContainer(93, 12527) < 1) { + return 0; + } + if (getItemAmtInContainer(93, 12525) < 1) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/796.cs2 b/dumps/scripts/796.cs2 new file mode 100644 index 000000000..66d77df6e --- /dev/null +++ b/dumps/scripts/796.cs2 @@ -0,0 +1,5 @@ +void script_796(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + script_798(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + setScriptCallOnItemContainerUpdate(797, new WidgetPointer(arg0), arg1, arg2, arg5, arg6, arg7, arg8, arg9, arg3, arg4, 93, 1, "IiisssssiiY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/797.cs2 b/dumps/scripts/797.cs2 new file mode 100644 index 000000000..07fe31a06 --- /dev/null +++ b/dumps/scripts/797.cs2 @@ -0,0 +1,4 @@ +void script_797(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + script_798(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + return; +} diff --git a/dumps/scripts/798.cs2 b/dumps/scripts/798.cs2 new file mode 100644 index 000000000..da2abf545 --- /dev/null +++ b/dumps/scripts/798.cs2 @@ -0,0 +1,89 @@ +void script_798(int arg0,int arg1,int arg2,int arg3,int arg4,string arg5,string arg6,string arg7,string arg8,string arg9) { + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + string svar5; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar5 = 0; + ivar6 = 0; + setWidgetScrollMax(0, multiply(add(divide(subtract(arg4, arg3), arg1), 1), 57), new WidgetPointer(arg0)); + ivar7 = 0; + ivar8 = 1; + ivar9 = 0; + ivar10 = 0; + ivar11 = -1; + ivar12 = -1; + ivar13 = -1; + svar5 = "hello"; + ivar14 = 0; + ivar15 = 0; + while (ivar7 <= subtract(arg4, arg3)) { + ivar5 = add(add(16, multiply(mod(ivar7, arg1), 48)), multiply(mod(ivar7, arg1), 5)); + ivar6 = add(multiply(divide(ivar7, arg1), 52), multiply(divide(ivar7, arg1), 5)); + createExtraChild(new WidgetPointer(arg0), 5, ivar15); + ivar15 = add(ivar15, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2205); + setScriptCallOnMouseEntered(2724, new WidgetPointer(-32768,3), ivar15, 0, "Ii1"); + setScriptCallOnMouseExit(2724, new WidgetPointer(-32768,3), ivar15, 1, "Ii1"); + createExtraChild(new WidgetPointer(arg0), 5, ivar15); + ivar15 = add(ivar15, 1); + setWidgetSize(48, 52, 0, 0); + setWidgetPosition(ivar5, ivar6, 0, 0); + setWidgetSprite(2206); + setWidgetHidden(1); + createExtraChild(new WidgetPointer(arg0), 5, ivar15); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(add(ivar5, 6), add(ivar6, 4), 0, 0); + ivar12 = cs2method_3408(105, 111, 1277, ivar8); + ivar13 = cs2method_3408(105, 111, 1188, ivar8); + if (((boolean)ivar8)) { + if (((boolean)script_799(ivar13))) { + script_760(ivar13, ivar13, arg0, ivar15, arg5, arg6, arg7, arg8, arg9, ""); + } else { + script_760(cs2method_3408(105, 111, 1184, ivar8), ivar13, arg0, ivar15, arg5, arg6, arg7, arg8, arg9, ""); + } + } else if (ivar13 == 12421) { + script_760(ivar13, ivar13, arg0, ivar15, arg5, arg6, arg7, arg8, arg9, ""); + } else { + script_760(cs2method_3408(105, 111, 1184, ivar8), ivar13, arg0, ivar15, arg5, arg6, arg7, arg8, arg9, ""); + } + svar5 = cs2method_3408(111, 115, 1187, ivar13); + ivar14 = cs2method_3408(111, 105, 1185, ivar12); + if (((boolean)ivar8)) { + setScriptCallOnMouseOver(770, -2147483643, new WidgetPointer(666,23), new WidgetPointer(666,16), ivar14, svar5, 12526, 1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, "iIIisoioioioioioioioioioi"); + setScriptCallOnMouseExit(40, new WidgetPointer(666,23), "I"); + } else { + svar5 = "You do not have access to this type of scroll."; + setScriptCallOnMouseOver(800, -2147483643, new WidgetPointer(666,23), new WidgetPointer(666,16), ivar14, svar5, "iIIis"); + setScriptCallOnMouseExit(40, new WidgetPointer(666,23), "I"); + } + ivar15 = add(ivar15, 1); + createExtraChild(new WidgetPointer(arg0), 5, ivar15); + ivar15 = add(ivar15, 1); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(add(ivar5, 2), add(ivar6, 38), 0, 0); + setItemOnWidgetMethod1205(ivar12, 1); + createExtraChild(new WidgetPointer(arg0), 4, ivar15); + ivar15 = add(ivar15, 1); + setWidgetSize(31, 12, 0, 0); + setWidgetPosition(add(ivar5, 13), add(ivar6, 39), 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(255, 255, 255)); + setWidgetTextAlignment(2, 1, 0); + setWidgetText("1"); + setWidgetUnknownBoolean(true); + ivar7 = add(ivar7, 1); + ivar8 = add(ivar8, 1); + } + return; +} diff --git a/dumps/scripts/799.cs2 b/dumps/scripts/799.cs2 new file mode 100644 index 000000000..d51412018 --- /dev/null +++ b/dumps/scripts/799.cs2 @@ -0,0 +1,6 @@ +int script_799(int arg0) { + if (getItemAmtInContainer(93, 12526) < 1) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/8.cs2 b/dumps/scripts/8.cs2 new file mode 100644 index 000000000..8beb0e544 --- /dev/null +++ b/dumps/scripts/8.cs2 @@ -0,0 +1,82 @@ +int script_8(int arg0) { + if (getDisplayMode() >= 2) { + switch (arg0) { + case 0: + return 48889946; + case 1: + return 48889947; + case 2: + return 48889948; + case 3: + return 48889949; + case 4: + return 48889950; + case 5: + return 48889951; + case 6: + return 48889952; + case 7: + return 48889953; + case 8: + return 48889954; + case 9: + return 48889955; + case 10: + return 48889956; + case 11: + return 48889957; + case 12: + return 48889958; + case 13: + return 48889959; + case 14: + return 48889960; + case 15: + return 48889961; + case 95: + return 48889963; + case 99: + return 48889964; + } + } else { + switch (arg0) { + case 0: + return 35913932; + case 1: + return 35913933; + case 2: + return 35913934; + case 3: + return 35913935; + case 4: + return 35913936; + case 5: + return 35913937; + case 6: + return 35913938; + case 7: + return 35913939; + case 8: + return 35913940; + case 9: + return 35913941; + case 10: + return 35913942; + case 11: + return 35913943; + case 12: + return 35913944; + case 13: + return 35913945; + case 14: + return 35913946; + case 15: + return 35913947; + case 95: + return 35913949; + case 99: + return 35913950; + } + } + return -1; +} diff --git a/dumps/scripts/80.cs2 b/dumps/scripts/80.cs2 new file mode 100644 index 000000000..6345795b1 --- /dev/null +++ b/dumps/scripts/80.cs2 @@ -0,0 +1,30 @@ +void script_80(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 0; + ivar2 = 0; + ivar3 = 0; + while (ivar1 < getItemContainerLength(140)) { + createExtraChild(new WidgetPointer(arg0), 6, ivar1); + setWidgetSize(49, 49, 0, 0); + setWidgetPosition(multiply(56, ivar2), multiply(56, ivar3), 0, 0); + if (getItemIdInSlot(140, ivar1) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(140, ivar1), getItemAmtInSlot(140, ivar1)); + setWidget3DRotation(0, 0, 512, 0, 0, 1340); + cs2method1111(1); + cs2method1305(getItemName(getItemIdInSlot(140, ivar1))); + setWidgetContextMenuOption(1, "Move"); + setScriptCallOnClickContextMenu(106, new WidgetPointer(-32768,3), ivar1, -2147483644, "Iii"); + } else { + setWidgetHidden(1); + } + ivar1 = add(ivar1, 1); + ivar2 = add(ivar2, 1); + if (ivar2 == 5) { + ivar2 = 0; + ivar3 = add(ivar3, 1); + } + } + return; +} diff --git a/dumps/scripts/800.cs2 b/dumps/scripts/800.cs2 new file mode 100644 index 000000000..53e5c0d2d --- /dev/null +++ b/dumps/scripts/800.cs2 @@ -0,0 +1,56 @@ +void script_800(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + deleteAllExtraChilds(new WidgetPointer(arg1)); + ivar4 = add(2, multiply(13, getLineCount(177, 495, "Level " + intToStr(arg3) + ": " + arg4))); + ivar5 = add(2, multiply(13, getLineCount(177, 494, "You cannot make this Summoning pouch."))); + ivar6 = add(add(add(add(add(2, ivar4), ivar5), 32), 14), 2); + ivar7 = 5; + ivar8 = 5; + ivar9 = 1; + ivar10 = 1; + if (setWidgetRegister(new WidgetPointer(arg2), arg0)) { + ivar6 = subtract(subtract(ivar6, 32), 14); + ivar7 = add(subtract(getWidgetActualY(), cs2method2601(new WidgetPointer(arg2))), 110); + if (ivar7 > 200) { + ivar7 = add(subtract(subtract(getWidgetActualY(), cs2method2601(new WidgetPointer(arg2))), ivar6), 45); + } + ivar8 = subtract(getWidgetActualX(), 60); + if (ivar8 < 0) { + ivar8 = 5; + } + if (ivar8 > 270) { + ivar8 = 285; + } + createExtraChild(new WidgetPointer(arg1), 3, 0); + setWidgetPosition(ivar8, ivar7, 0, 0); + setWidgetSize(180, ivar6, 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(0, 0, 0)); + cs2method2103(42); + createExtraChild(new WidgetPointer(arg1), 3, 1); + setWidgetPosition(add(ivar8, 1), add(ivar7, 1), 0, 0); + setWidgetSize(179, subtract(ivar6, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(46, 43, 35)); + createExtraChild(new WidgetPointer(arg1), 3, 2); + setWidgetPosition(ivar8, ivar7, 0, 0); + setWidgetSize(179, subtract(ivar6, 1), 0, 0); + setWidgetFilled(0); + setWidgetRGB(new Color(114, 100, 81)); + createExtraChild(new WidgetPointer(arg1), 4, 3); + setWidgetPosition(add(ivar8, 2), add(ivar7, 2), 0, 0); + setWidgetSize(177, ivar4, 0, 0); + setWidgetTextAlignment(1, 1, 0); + setWidgetFont(495); + setWidgetRGB(new Color(255, 152, 31)); + setWidgetUnknownBoolean(false); + setWidgetText(arg4); + } + return; +} diff --git a/dumps/scripts/801.cs2 b/dumps/scripts/801.cs2 new file mode 100644 index 000000000..bc433dfd8 --- /dev/null +++ b/dumps/scripts/801.cs2 @@ -0,0 +1,9 @@ +void script_801(int arg0,int arg1) { + setWidgetRGB(new Color(script_805(arg1)), new WidgetPointer(arg0)); + if (arg1 == 5) { + setWidgetText(new WidgetPointer(arg0), intToStr(bitconfig_9816)); + } else { + setWidgetText(new WidgetPointer(arg0), intToStr(getSkillCurrentLvl(arg1))); + } + return; +} diff --git a/dumps/scripts/802.cs2 b/dumps/scripts/802.cs2 new file mode 100644 index 000000000..10c4e8b79 --- /dev/null +++ b/dumps/scripts/802.cs2 @@ -0,0 +1,154 @@ +cs2func_script_802_struct(1,1,0) script_802(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + int ivar5; + int ivar6; + int ivar7; + string svar1; + string svar2; + ivar4 = strLength(arg4); + if (arg0 <= -1) { + arg0 = ivar4; + } else { + arg0 = min(arg0, ivar4); + } + svar1 = ""; + if (arg0 > 0) { + svar1 = substr(0, arg0, arg4); + } + svar2 = ""; + if (arg0 < ivar4) { + svar2 = substr(arg0, ivar4, arg4); + } + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + if (arg2 == 85) { + ivar5 = strLength(svar1); + if (ivar5 > 1) { + svar1 = substr(0, subtract(ivar5, 1), svar1); + } else { + svar1 = ""; + ivar7 = 1; + } + arg4 = concat(svar1, svar2); + arg0 = max(subtract(arg0, 1), 0); + } else if (arg2 == 101) { + ivar5 = strLength(svar2); + if (ivar5 > 1) { + svar2 = substr(1, ivar5, svar2); + } else { + svar2 = ""; + ivar7 = 1; + } + arg4 = concat(svar1, svar2); + } else { + if (isValidChar(((char)arg3))) { + switch (arg1) { + flow_19: + case 0: + if (((boolean)globalint_1650)) { + ivar6 = 255; + } else { + ivar6 = 80; + } + if (ivar4 < ivar6) { + arg4 = concat(concatChar(((char)arg3), svar1), svar2); + arg0 = add(arg0, 1); + } else { + ivar7 = 1; + } + break; + case 1: + if (isDigit(((char)arg3)) && (ivar4 < 10)) { + arg4 = concat(concatChar(((char)arg3), svar1), svar2); + arg0 = add(arg0, 1); + } else { + ivar7 = 1; + } + break; + case 2: + if (ivar4 < 12) { + arg4 = concat(concatChar(((char)arg3), svar1), svar2); + arg0 = add(arg0, 1); + } else { + ivar7 = 1; + } + break; + case 3: + if (ivar4 < 320) { + arg4 = concat(concatChar(((char)arg3), svar1), svar2); + arg0 = add(arg0, 1); + } else { + ivar7 = 1; + } + break; + case 4: + IF (isAlphaNumeric(((char)arg3))) + GOTO flow_40 + IF ((strIndexof(((char)arg3), 0, " '&,.!-\u00e0\u00c0\u00e1\u00c1\u00e2\u00c2\u00e3\u00c3\u00e4\u00c4\u00e5\u00c5\u00e7\u00c7\u00e8\u00c8\u00e9\u00c9\u00ea\u00ca\u00eb\u00cb\u00ec\u00cc\u00ed\u00cd\u00ee\u00ce\u00ef\u00cf\u00f1\u00d1\u00f2\u00d2\u00f3\u00d3\u00f4\u00d4\u00f5\u00d5\u00f6\u00d6\u00f9\u00d9\u00fa\u00da\u00fb\u00db\u00fc\u00dc\u00fd\u00dd\u00ff") != -1) && (ivar4 < 50)) + GOTO flow_41 + GOTO flow_42 + flow_40: + flow_41: + arg4 = concat(concatChar(((char)arg3), svar1), svar2); + arg0 = add(arg0, 1); + GOTO flow_43 + flow_42: + ivar7 = 1; + flow_43: + break; + case 5: + if (ivar4 < 50) { + arg4 = concat(concatChar(((char)arg3), svar1), svar2); + arg0 = add(arg0, 1); + } else { + ivar7 = 1; + } + break; + case 6: + switch (getLanguage()) { + flow_49: + case 1: + IF (isDigit(((char)arg3))) + GOTO flow_51 + IF (((strIndexof(((char)arg3), 0, "KkMmTt") != -1) && (ivar4 > 0)) && (ivar4 < 10)) + GOTO flow_52 + GOTO flow_61 + flow_51: + flow_52: + if ((((strIndexof(0, arg4, "K") == -1) && (strIndexof(0, arg4, "k") == -1)) && ((strIndexof(0, arg4, "M") == -1) && (strIndexof(0, arg4, "m") == -1))) && ((strIndexof(0, arg4, "T") == -1) && (strIndexof(0, arg4, "t") == -1))) { + arg4 = concat(concatChar(((char)arg3), svar1), svar2); + arg0 = add(arg0, 1); + } else { + ivar7 = 1; + } + GOTO flow_62 + flow_61: + ivar7 = 1; + flow_62: + break; + } + IF (isDigit(((char)arg3))) + GOTO flow_65 + IF (((strIndexof(((char)arg3), 0, "KkMm") != -1) && (ivar4 > 0)) && (ivar4 < 10)) + GOTO flow_66 + GOTO flow_73 + flow_65: + flow_66: + if (((strIndexof(0, arg4, "K") == -1) && (strIndexof(0, arg4, "k") == -1)) && ((strIndexof(0, arg4, "M") == -1) && (strIndexof(0, arg4, "m") == -1))) { + arg4 = concat(concatChar(((char)arg3), svar1), svar2); + arg0 = add(arg0, 1); + } else { + ivar7 = 1; + } + break; + flow_73: + ivar7 = 1; + } + } + } + if (((boolean)ivar7)) { + playSoundEffect2False(4173, 1, 0, 255); + } + return newstruct cs2func_script_802_struct(arg0, arg4); +} diff --git a/dumps/scripts/803.cs2 b/dumps/scripts/803.cs2 new file mode 100644 index 000000000..69ba61a1a --- /dev/null +++ b/dumps/scripts/803.cs2 @@ -0,0 +1,146 @@ +void script_803() { + string svar0; + svar0 = cs2method_3408(105, 115, 1711, bitconfig_5145); + switch (bitconfig_5145) { + case 1: + setWidgetIsHidden(false, new WidgetPointer(575,17)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 130, "IIsii", new WidgetPointer(575,17)); + break; + case 2: + setWidgetIsHidden(false, new WidgetPointer(575,18)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 160, "IIsii", new WidgetPointer(575,18)); + break; + case 3: + setWidgetIsHidden(false, new WidgetPointer(575,19)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,19)); + break; + case 4: + setWidgetIsHidden(false, new WidgetPointer(575,20)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,20)); + break; + case 5: + setWidgetIsHidden(false, new WidgetPointer(575,21)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,21)); + break; + case 6: + setWidgetIsHidden(false, new WidgetPointer(575,22)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,22)); + break; + case 7: + setWidgetIsHidden(false, new WidgetPointer(575,23)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,23)); + break; + case 8: + setWidgetIsHidden(false, new WidgetPointer(575,24)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,24)); + break; + case 9: + setWidgetIsHidden(false, new WidgetPointer(575,25)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,25)); + break; + case 10: + setWidgetIsHidden(false, new WidgetPointer(575,26)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,26)); + break; + case 11: + setWidgetIsHidden(false, new WidgetPointer(575,27)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,27)); + break; + case 12: + setWidgetIsHidden(false, new WidgetPointer(575,28)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,28)); + break; + default: + return; + } + globalint_2 = 0; + switch (bitconfig_5145) { + case 1: + if (((boolean)bitconfig_5168)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 2: + if (((boolean)bitconfig_5169)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 3: + if (((boolean)bitconfig_5170)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 4: + if (((boolean)bitconfig_5171)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 5: + if (((boolean)bitconfig_5172)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 6: + if (((boolean)bitconfig_5173)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 7: + if (((boolean)bitconfig_5174)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 8: + if (((boolean)bitconfig_5175)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 9: + if (((boolean)bitconfig_5176)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 10: + if (((boolean)bitconfig_5177)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 11: + if (((boolean)bitconfig_5178)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + case 12: + if (((boolean)bitconfig_5179)) { + script_804(); + } else { + script_813(bitconfig_5145); + } + break; + default: + return; + } + return; +} diff --git a/dumps/scripts/804.cs2 b/dumps/scripts/804.cs2 new file mode 100644 index 000000000..c6cda540e --- /dev/null +++ b/dumps/scripts/804.cs2 @@ -0,0 +1,23 @@ +void script_804() { + int ivar0; + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5146), new WidgetPointer(575,3)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5147), new WidgetPointer(575,4)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5148), new WidgetPointer(575,5)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5149), new WidgetPointer(575,6)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5150), new WidgetPointer(575,7)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5151), new WidgetPointer(575,8)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5152), new WidgetPointer(575,9)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5153), new WidgetPointer(575,10)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5154), new WidgetPointer(575,11)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5155), new WidgetPointer(575,12)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5156), new WidgetPointer(575,13)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5157), new WidgetPointer(575,14)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5158), new WidgetPointer(575,15)); + setWidgetModel(cs2method_3408(105, 109, 1696, bitconfig_5159), new WidgetPointer(575,16)); + ivar0 = 14; + while (ivar0 > 0) { + script_1421(ivar0); + ivar0 = subtract(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/805.cs2 b/dumps/scripts/805.cs2 new file mode 100644 index 000000000..bfe682033 --- /dev/null +++ b/dumps/scripts/805.cs2 @@ -0,0 +1,16 @@ +int script_805(int arg0) { + int ivar1; + int ivar2; + ivar1 = script_807(arg0); + ivar2 = 5592405; + if (ivar1 > 75) { + ivar2 = 65280; + } else if (ivar1 > 50) { + ivar2 = 16776960; + } else if (ivar1 > 25) { + ivar2 = 16750623; + } else { + ivar2 = 16711680; + } + return ivar2; +} diff --git a/dumps/scripts/806.cs2 b/dumps/scripts/806.cs2 new file mode 100644 index 000000000..4df09ffc2 --- /dev/null +++ b/dumps/scripts/806.cs2 @@ -0,0 +1,14 @@ +int script_806() { + int ivar0; + ivar0 = 5592405; + if (getRunEnergy() > 75) { + ivar0 = 65280; + } else if (getRunEnergy() > 50) { + ivar0 = 16776960; + } else if (getRunEnergy() > 25) { + ivar0 = 16750623; + } else { + ivar0 = 16711680; + } + return ivar0; +} diff --git a/dumps/scripts/807.cs2 b/dumps/scripts/807.cs2 new file mode 100644 index 000000000..ce8770dad --- /dev/null +++ b/dumps/scripts/807.cs2 @@ -0,0 +1,12 @@ +int script_807(int arg0) { + int ivar1; + ivar1 = 0; + if (getSkillActualLvl(arg0) > 0) { + if (arg0 == 5) { + ivar1 = divide(multiply(100, bitconfig_9816), script_5255()); + } else { + ivar1 = divide(multiply(100, getSkillCurrentLvl(arg0)), getSkillActualLvl(arg0)); + } + } + return ivar1; +} diff --git a/dumps/scripts/808.cs2 b/dumps/scripts/808.cs2 new file mode 100644 index 000000000..7319f8bd4 --- /dev/null +++ b/dumps/scripts/808.cs2 @@ -0,0 +1,42 @@ +void script_808() { + int ivar0; + int ivar1; + setWidgetIsHidden(false, new WidgetPointer(748,7)); + ivar0 = multiplyDivide(bitconfig_7198, script_2916(), 100); + ivar1 = mod(getClientCycle(), 32); + if (ivar0 > 25) { + globalint_615 = 0; + if (((script_2916() < 200) && (bitconfig_7198 < 45)) && ((ivar0 < 100) && (getSkillActualLvl(3) > 0))) { + script_1888(); + } else { + globalint_1025 = 0; + } + if (getWidgetShadeColor(new WidgetPointer(748,7)) != 0) { + cs2method2103(0, new WidgetPointer(748,7)); + } else { + return; + } + } else { + if (((boolean)ivar1)) { + if (globalint_615 <= 0) { + globalint_615 = getClientCycle(); + } + if (subtract(getClientCycle(), globalint_615) < 1500) { + playSoundEffect(5644, 1, 0); + } + if (getSkillActualLvl(3) > 0) { + script_1888(); + } + } + if (ivar1 < 8) { + cs2method2103(0, new WidgetPointer(748,7)); + } else if (ivar1 < 16) { + cs2method2103(85, new WidgetPointer(748,7)); + } else if (ivar1 < 24) { + cs2method2103(255, new WidgetPointer(748,7)); + } else { + cs2method2103(85, new WidgetPointer(748,7)); + } + } + return; +} diff --git a/dumps/scripts/809.cs2 b/dumps/scripts/809.cs2 new file mode 100644 index 000000000..008ba8bcb --- /dev/null +++ b/dumps/scripts/809.cs2 @@ -0,0 +1,4 @@ +void script_809() { + script_810(); + return; +} diff --git a/dumps/scripts/81.cs2 b/dumps/scripts/81.cs2 new file mode 100644 index 000000000..10ef9a56c --- /dev/null +++ b/dumps/scripts/81.cs2 @@ -0,0 +1,8 @@ +void script_81(int arg0) { + if (cs2method5428(49283081, -1)) { + setScriptCallOnGameloop(1559, arg0, "1", new WidgetPointer(752,9)); + return; + } + script_1560(arg0); + return; +} diff --git a/dumps/scripts/810.cs2 b/dumps/scripts/810.cs2 new file mode 100644 index 000000000..63e18cb27 --- /dev/null +++ b/dumps/scripts/810.cs2 @@ -0,0 +1,21 @@ +void script_810() { + if (isMember() && ((boolean)bitconfig_4280)) { + setWidgetIsHidden(false, new WidgetPointer(747,2)); + setWidgetIsHidden(false, new WidgetPointer(747,3)); + setWidgetIsHidden(false, new WidgetPointer(747,6)); + setWidgetIsHidden(false, new WidgetPointer(747,4)); + setWidgetIsHidden(false, new WidgetPointer(747,7)); + script_817(23); + setWidgetIsHidden(false, new WidgetPointer(747,5)); + setWidgetRGB(new Color(script_805(23)), new WidgetPointer(747,5)); + setWidgetText(new WidgetPointer(747,5), intToStr(getSkillCurrentLvl(23))); + } else { + setWidgetIsHidden(true, new WidgetPointer(747,2)); + setWidgetIsHidden(true, new WidgetPointer(747,3)); + setWidgetIsHidden(true, new WidgetPointer(747,5)); + setWidgetIsHidden(true, new WidgetPointer(747,6)); + setWidgetIsHidden(true, new WidgetPointer(747,4)); + setWidgetIsHidden(true, new WidgetPointer(747,7)); + } + return; +} diff --git a/dumps/scripts/811.cs2 b/dumps/scripts/811.cs2 new file mode 100644 index 000000000..b1fee0618 --- /dev/null +++ b/dumps/scripts/811.cs2 @@ -0,0 +1,26 @@ +void script_811(int arg0) { + int ivar1; + ivar1 = 0; + if (arg0 > 1) { + return; + } + if (getDisplayMode() >= 2) { + ivar1 = ((int)isWidgetHidden(new WidgetPointer(746,184))); + } else { + ivar1 = ((int)isWidgetHidden(new WidgetPointer(548,22))); + } + if (((boolean)ivar1)) { + script_3337(); + setWidgetIsHidden(true, new WidgetPointer(548,24)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(548,22)); + setWidgetIsHidden(true, new WidgetPointer(746,187)); + setScriptCallOnGameloop(-1, "", new WidgetPointer(746,184)); + setWidgetIsHidden(false, new WidgetPointer(746,184)); + setWidgetIsHidden(false, new WidgetPointer(548,22)); + } else { + setWidgetIsHidden(true, new WidgetPointer(746,184)); + setWidgetIsHidden(true, new WidgetPointer(548,22)); + } + script_776(); + return; +} diff --git a/dumps/scripts/812.cs2 b/dumps/scripts/812.cs2 new file mode 100644 index 000000000..7e07e95d2 --- /dev/null +++ b/dumps/scripts/812.cs2 @@ -0,0 +1,32 @@ +void script_812(int arg0) { + setWidgetHidden(1); + if (arg0 == -1) { + return; + } + if (getItemHashmapData(arg0, 740) > 1) { + if (((boolean)script_925(arg0)) && ((boolean)script_926(arg0))) { + return; + } + setWidgetHidden(0); + return; + } + if (((boolean)getItemHashmapData(arg0, 740))) { + if (((boolean)script_925(arg0))) { + return; + } + setWidgetHidden(0); + return; + } + if (((boolean)script_928(arg0))) { + if (((boolean)script_926(arg0))) { + return; + } + setWidgetHidden(0); + return; + } + if (((boolean)script_925(arg0))) { + return; + } + setWidgetHidden(0); + return; +} diff --git a/dumps/scripts/813.cs2 b/dumps/scripts/813.cs2 new file mode 100644 index 000000000..244a1f8a3 --- /dev/null +++ b/dumps/scripts/813.cs2 @@ -0,0 +1,60 @@ +void script_813(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int stack_dump0; + cs2func_script_814_struct(3,0,0) structdump_1; + cs2func_script_814_struct(3,0,0) structdump_2; + cs2func_script_814_struct(3,0,0) structdump_3; + ivar1 = arg0; + ivar2 = -1; + ivar3 = 0; + ivar4 = -1; + stack_dump0 = arg0; + structdump_1 = script_814(stack_dump0); + ivar2 = structdump_1.intpart_2; + ivar4 = structdump_1.intpart_1; + ivar3 = structdump_1.intpart_0; + setWidgetModel(ivar2, new WidgetPointer(ivar4)); + script_1421(arg0); + ivar1 = subtract(arg0, 1); + while (ivar1 > 0) { + stack_dump0 = ivar1; + structdump_2 = script_814(stack_dump0); + ivar2 = structdump_2.intpart_2; + ivar4 = structdump_2.intpart_1; + ivar3 = structdump_2.intpart_0; + setWidgetModel(ivar2, new WidgetPointer(ivar4)); + script_1421(ivar1); + if (ivar3 > 1) { + ivar1 = subtract(ivar1, 1); + } else { + ivar1 = subtract(ivar1, 1); + while (ivar1 > 0) { + script_818(ivar1); + ivar1 = subtract(ivar1, 1); + } + } + } + ivar1 = add(arg0, 1); + while (ivar1 <= 14) { + stack_dump0 = ivar1; + structdump_3 = script_814(stack_dump0); + ivar2 = structdump_3.intpart_2; + ivar4 = structdump_3.intpart_1; + ivar3 = structdump_3.intpart_0; + setWidgetModel(ivar2, new WidgetPointer(ivar4)); + script_1421(ivar1); + if (ivar3 > 1) { + ivar1 = add(ivar1, 1); + } else { + ivar1 = add(ivar1, 1); + while (ivar1 <= 14) { + script_818(ivar1); + ivar1 = add(ivar1, 1); + } + } + } + return; +} diff --git a/dumps/scripts/814.cs2 b/dumps/scripts/814.cs2 new file mode 100644 index 000000000..76aaa47cd --- /dev/null +++ b/dumps/scripts/814.cs2 @@ -0,0 +1,33 @@ +cs2func_script_814_struct(3,0,0) script_814(int arg0) { + switch (arg0) { + case 1: + return newstruct cs2func_script_814_struct(bitconfig_5146, 37683203, cs2method_3408(105, 109, 1696, bitconfig_5146)); + case 2: + return newstruct cs2func_script_814_struct(bitconfig_5147, 37683204, cs2method_3408(105, 109, 1696, bitconfig_5147)); + case 3: + return newstruct cs2func_script_814_struct(bitconfig_5148, 37683205, cs2method_3408(105, 109, 1696, bitconfig_5148)); + case 4: + return newstruct cs2func_script_814_struct(bitconfig_5149, 37683206, cs2method_3408(105, 109, 1696, bitconfig_5149)); + case 5: + return newstruct cs2func_script_814_struct(bitconfig_5150, 37683207, cs2method_3408(105, 109, 1696, bitconfig_5150)); + case 6: + return newstruct cs2func_script_814_struct(bitconfig_5151, 37683208, cs2method_3408(105, 109, 1696, bitconfig_5151)); + case 7: + return newstruct cs2func_script_814_struct(bitconfig_5152, 37683209, cs2method_3408(105, 109, 1696, bitconfig_5152)); + case 8: + return newstruct cs2func_script_814_struct(bitconfig_5153, 37683210, cs2method_3408(105, 109, 1696, bitconfig_5153)); + case 9: + return newstruct cs2func_script_814_struct(bitconfig_5154, 37683211, cs2method_3408(105, 109, 1696, bitconfig_5154)); + case 10: + return newstruct cs2func_script_814_struct(bitconfig_5155, 37683212, cs2method_3408(105, 109, 1696, bitconfig_5155)); + case 11: + return newstruct cs2func_script_814_struct(bitconfig_5156, 37683213, cs2method_3408(105, 109, 1696, bitconfig_5156)); + case 12: + return newstruct cs2func_script_814_struct(bitconfig_5157, 37683214, cs2method_3408(105, 109, 1696, bitconfig_5157)); + case 13: + return newstruct cs2func_script_814_struct(bitconfig_5158, 37683215, cs2method_3408(105, 109, 1696, bitconfig_5158)); + case 14: + return newstruct cs2func_script_814_struct(bitconfig_5159, 37683216, cs2method_3408(105, 109, 1696, bitconfig_5159)); + } + return newstruct cs2func_script_814_struct(-1, -1, -1); +} diff --git a/dumps/scripts/815.cs2 b/dumps/scripts/815.cs2 new file mode 100644 index 000000000..e9b5d3679 --- /dev/null +++ b/dumps/scripts/815.cs2 @@ -0,0 +1,4 @@ +void script_815() { + script_817(23); + return; +} diff --git a/dumps/scripts/816.cs2 b/dumps/scripts/816.cs2 new file mode 100644 index 000000000..e2c0452fe --- /dev/null +++ b/dumps/scripts/816.cs2 @@ -0,0 +1,4 @@ +void script_816(int arg0,int arg1) { + script_817(arg1); + return; +} diff --git a/dumps/scripts/817.cs2 b/dumps/scripts/817.cs2 new file mode 100644 index 000000000..460ec9262 --- /dev/null +++ b/dumps/scripts/817.cs2 @@ -0,0 +1,31 @@ +void script_817(int arg0) { + int ivar1; + int ivar2; + int ivar3; + ivar1 = 31; + ivar2 = 0; + ivar3 = 31; + if (arg0 == 5) { + if (bitconfig_9816 >= script_5255()) { + ivar2 = 0; + } else if (((boolean)getSkillActualLvl(arg0)) || (getSkillActualLvl(arg0) == -1)) { + ivar2 = 0; + } else { + ivar2 = subtract(ivar1, divide(multiply(ivar1, bitconfig_9816), script_5255())); + } + } else if (getSkillCurrentLvl(arg0) >= getSkillActualLvl(arg0)) { + ivar2 = 0; + } else if (((boolean)getSkillActualLvl(arg0)) || (getSkillActualLvl(arg0) == -1)) { + ivar2 = 0; + } else { + ivar2 = subtract(ivar1, divide(multiply(ivar1, getSkillCurrentLvl(arg0)), getSkillActualLvl(arg0))); + } + if (arg0 == 5) { + setWidgetSize(ivar3, ivar2, 0, 0, new WidgetPointer(749,3)); + } else { + if (arg0 == 23) { + setWidgetSize(ivar3, ivar2, 0, 0, new WidgetPointer(747,4)); + } + } + return; +} diff --git a/dumps/scripts/818.cs2 b/dumps/scripts/818.cs2 new file mode 100644 index 000000000..d4bf8d7e4 --- /dev/null +++ b/dumps/scripts/818.cs2 @@ -0,0 +1,63 @@ +void script_818(int arg0) { + string svar0; + svar0 = "No information is available about this beacon."; + switch (arg0) { + case 1: + setWidgetModel(41805, new WidgetPointer(575,3)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 130, "IIsii", new WidgetPointer(575,3)); + break; + case 2: + setWidgetModel(41805, new WidgetPointer(575,4)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 160, "IIsii", new WidgetPointer(575,4)); + break; + case 3: + setWidgetModel(41805, new WidgetPointer(575,5)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,5)); + break; + case 4: + setWidgetModel(41805, new WidgetPointer(575,6)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,6)); + break; + case 5: + setWidgetModel(41805, new WidgetPointer(575,7)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,7)); + break; + case 6: + setWidgetModel(41805, new WidgetPointer(575,8)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,8)); + break; + case 7: + setWidgetModel(41805, new WidgetPointer(575,9)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,9)); + break; + case 8: + setWidgetModel(41805, new WidgetPointer(575,10)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,10)); + break; + case 9: + setWidgetModel(41805, new WidgetPointer(575,11)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,11)); + break; + case 10: + setWidgetModel(41805, new WidgetPointer(575,12)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,12)); + break; + case 11: + setWidgetModel(41805, new WidgetPointer(575,13)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,13)); + break; + case 12: + setWidgetModel(41805, new WidgetPointer(575,14)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,14)); + break; + case 13: + setWidgetModel(41805, new WidgetPointer(575,15)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,15)); + break; + case 14: + setWidgetModel(41805, new WidgetPointer(575,16)); + setScriptCallOnMouseOver(38, new WidgetPointer(-32768,3), new WidgetPointer(575,2), svar0, 25, 200, "IIsii", new WidgetPointer(575,16)); + } + globalint_2 = 0; + return; +} diff --git a/dumps/scripts/819.cs2 b/dumps/scripts/819.cs2 new file mode 100644 index 000000000..e2b48d949 --- /dev/null +++ b/dumps/scripts/819.cs2 @@ -0,0 +1,21 @@ +void script_819() { + if ((standart_config_1174 != -1) && (standart_config_1174 != 0)) { + setWidgetNpcHead(standart_config_1174, new WidgetPointer(663,3)); + } else { + setWidgetModel(-1, new WidgetPointer(663,3)); + } + if (((boolean)bitconfig_1049)) { + setWidgetText(new WidgetPointer(663,25), script_821()); + } else if (standart_config_448 != -1) { + setWidgetText(new WidgetPointer(663,25), getItemName(standart_config_448)); + } else { + setWidgetText(new WidgetPointer(663,25), ""); + } + if (bitconfig_4282 > 50) { + bitconfig_4282 = subtract(bitconfig_4282, 50); + setWidgetAnimation(cs2method_3408(105, 65, 1275, bitconfig_4282), new WidgetPointer(663,3)); + } else { + setWidgetAnimation(cs2method_3408(105, 65, 1276, bitconfig_4282), new WidgetPointer(663,3)); + } + return; +} diff --git a/dumps/scripts/82.cs2 b/dumps/scripts/82.cs2 new file mode 100644 index 000000000..097bd59ea --- /dev/null +++ b/dumps/scripts/82.cs2 @@ -0,0 +1,6 @@ +void script_82() { + if (getSystemUpdateTimer() > 0) { + script_89(); + } + return; +} diff --git a/dumps/scripts/820.cs2 b/dumps/scripts/820.cs2 new file mode 100644 index 000000000..c7fa18985 --- /dev/null +++ b/dumps/scripts/820.cs2 @@ -0,0 +1,18 @@ +void script_820() { + if (bitconfig_4286 != 101) { + setWidgetText(new WidgetPointer(663,19), intToStr(bitconfig_4286) + "%"); + if (bitconfig_4286 > 74) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(663,19)); + } else { + setWidgetRGB(new Color(255, 255, 255), new WidgetPointer(663,19)); + } + } else { + setWidgetText(new WidgetPointer(663,19), "NA"); + } + if (bitconfig_4285 != 101) { + setWidgetText(new WidgetPointer(663,17), intToStr(bitconfig_4285) + "%"); + } else { + setWidgetText(new WidgetPointer(663,17), "NA"); + } + return; +} diff --git a/dumps/scripts/821.cs2 b/dumps/scripts/821.cs2 new file mode 100644 index 000000000..71590085a --- /dev/null +++ b/dumps/scripts/821.cs2 @@ -0,0 +1,11 @@ +string script_821() { + string svar0; + svar0 = ""; + svar0 = script_822(bitconfig_1043, 1, svar0); + svar0 = script_822(bitconfig_1044, 0, svar0); + svar0 = script_822(bitconfig_1045, 0, svar0); + svar0 = script_822(bitconfig_1046, 0, svar0); + svar0 = script_822(bitconfig_1047, 0, svar0); + svar0 = script_822(bitconfig_1048, 0, svar0); + return svar0; +} diff --git a/dumps/scripts/822.cs2 b/dumps/scripts/822.cs2 new file mode 100644 index 000000000..b8476ac16 --- /dev/null +++ b/dumps/scripts/822.cs2 @@ -0,0 +1,10 @@ +string script_822(int arg0,int arg1,string arg2) { + int ivar2; + ivar2 = arg0; + if (((boolean)arg1)) { + arg2 = script_823(ivar2, arg2); + } else { + arg2 = script_824(ivar2, arg2); + } + return arg2; +} diff --git a/dumps/scripts/823.cs2 b/dumps/scripts/823.cs2 new file mode 100644 index 000000000..a2c539e56 --- /dev/null +++ b/dumps/scripts/823.cs2 @@ -0,0 +1,111 @@ +string script_823(int arg0,string arg1) { + if (((boolean)arg0)) { + arg1 = concat(arg1, " "); + return arg1; + } + if (((boolean)arg0)) { + arg1 = concat(arg1, "A"); + return arg1; + } + if (arg0 == 2) { + arg1 = concat(arg1, "B"); + return arg1; + } + if (arg0 == 3) { + arg1 = concat(arg1, "C"); + return arg1; + } + if (arg0 == 4) { + arg1 = concat(arg1, "D"); + return arg1; + } + if (arg0 == 5) { + arg1 = concat(arg1, "E"); + return arg1; + } + if (arg0 == 6) { + arg1 = concat(arg1, "F"); + return arg1; + } + if (arg0 == 7) { + arg1 = concat(arg1, "G"); + return arg1; + } + if (arg0 == 8) { + arg1 = concat(arg1, "H"); + return arg1; + } + if (arg0 == 9) { + arg1 = concat(arg1, "I"); + return arg1; + } + if (arg0 == 10) { + arg1 = concat(arg1, "J"); + return arg1; + } + if (arg0 == 11) { + arg1 = concat(arg1, "K"); + return arg1; + } + if (arg0 == 12) { + arg1 = concat(arg1, "L"); + return arg1; + } + if (arg0 == 13) { + arg1 = concat(arg1, "M"); + return arg1; + } + if (arg0 == 14) { + arg1 = concat(arg1, "N"); + return arg1; + } + if (arg0 == 15) { + arg1 = concat(arg1, "O"); + return arg1; + } + if (arg0 == 16) { + arg1 = concat(arg1, "P"); + return arg1; + } + if (arg0 == 17) { + arg1 = concat(arg1, "Q"); + return arg1; + } + if (arg0 == 18) { + arg1 = concat(arg1, "R"); + return arg1; + } + if (arg0 == 19) { + arg1 = concat(arg1, "S"); + return arg1; + } + if (arg0 == 20) { + arg1 = concat(arg1, "T"); + return arg1; + } + if (arg0 == 21) { + arg1 = concat(arg1, "U"); + return arg1; + } + if (arg0 == 22) { + arg1 = concat(arg1, "V"); + return arg1; + } + if (arg0 == 23) { + arg1 = concat(arg1, "W"); + return arg1; + } + if (arg0 == 24) { + arg1 = concat(arg1, "X"); + return arg1; + } + if (arg0 == 25) { + arg1 = concat(arg1, "Y"); + return arg1; + } + if (arg0 == 26) { + arg1 = concat(arg1, "Z"); + return arg1; + } + return ""; +} diff --git a/dumps/scripts/824.cs2 b/dumps/scripts/824.cs2 new file mode 100644 index 000000000..9faf56898 --- /dev/null +++ b/dumps/scripts/824.cs2 @@ -0,0 +1,111 @@ +string script_824(int arg0,string arg1) { + if (((boolean)arg0)) { + arg1 = concat(arg1, " "); + return arg1; + } + if (((boolean)arg0)) { + arg1 = concat(arg1, "a"); + return arg1; + } + if (arg0 == 2) { + arg1 = concat(arg1, "b"); + return arg1; + } + if (arg0 == 3) { + arg1 = concat(arg1, "c"); + return arg1; + } + if (arg0 == 4) { + arg1 = concat(arg1, "d"); + return arg1; + } + if (arg0 == 5) { + arg1 = concat(arg1, "e"); + return arg1; + } + if (arg0 == 6) { + arg1 = concat(arg1, "f"); + return arg1; + } + if (arg0 == 7) { + arg1 = concat(arg1, "g"); + return arg1; + } + if (arg0 == 8) { + arg1 = concat(arg1, "h"); + return arg1; + } + if (arg0 == 9) { + arg1 = concat(arg1, "i"); + return arg1; + } + if (arg0 == 10) { + arg1 = concat(arg1, "j"); + return arg1; + } + if (arg0 == 11) { + arg1 = concat(arg1, "k"); + return arg1; + } + if (arg0 == 12) { + arg1 = concat(arg1, "l"); + return arg1; + } + if (arg0 == 13) { + arg1 = concat(arg1, "m"); + return arg1; + } + if (arg0 == 14) { + arg1 = concat(arg1, "n"); + return arg1; + } + if (arg0 == 15) { + arg1 = concat(arg1, "o"); + return arg1; + } + if (arg0 == 16) { + arg1 = concat(arg1, "p"); + return arg1; + } + if (arg0 == 17) { + arg1 = concat(arg1, "q"); + return arg1; + } + if (arg0 == 18) { + arg1 = concat(arg1, "r"); + return arg1; + } + if (arg0 == 19) { + arg1 = concat(arg1, "s"); + return arg1; + } + if (arg0 == 20) { + arg1 = concat(arg1, "t"); + return arg1; + } + if (arg0 == 21) { + arg1 = concat(arg1, "u"); + return arg1; + } + if (arg0 == 22) { + arg1 = concat(arg1, "v"); + return arg1; + } + if (arg0 == 23) { + arg1 = concat(arg1, "w"); + return arg1; + } + if (arg0 == 24) { + arg1 = concat(arg1, "x"); + return arg1; + } + if (arg0 == 25) { + arg1 = concat(arg1, "y"); + return arg1; + } + if (arg0 == 26) { + arg1 = concat(arg1, "z"); + return arg1; + } + return ""; +} diff --git a/dumps/scripts/825.cs2 b/dumps/scripts/825.cs2 new file mode 100644 index 000000000..8f5ee4558 --- /dev/null +++ b/dumps/scripts/825.cs2 @@ -0,0 +1,4 @@ +void script_825(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_1657(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + return; +} diff --git a/dumps/scripts/826.cs2 b/dumps/scripts/826.cs2 new file mode 100644 index 000000000..920fe29ce --- /dev/null +++ b/dumps/scripts/826.cs2 @@ -0,0 +1,7 @@ +void script_826() { + int ivar0; + ivar0 = getClientCycle(); + setScriptCallOnGameloop(827, ivar0, "i", new WidgetPointer(465,2)); + playSoundEffect(4437, 1, 58); + return; +} diff --git a/dumps/scripts/827.cs2 b/dumps/scripts/827.cs2 new file mode 100644 index 000000000..c1bfd1808 --- /dev/null +++ b/dumps/scripts/827.cs2 @@ -0,0 +1,16 @@ +void script_827(int arg0) { + int ivar1; + ivar1 = 0; + if ((getClientCycle() >= add(arg0, 32)) && (getClientCycle() < add(arg0, 140))) { + setWidgetText(new WidgetPointer(465,2), "Varrock Herald"); + setWidgetText(new WidgetPointer(465,3), "Covering all of Misthalin and beyond."); + setWidgetText(new WidgetPointer(465,4), "1 gp"); + setWidgetText(new WidgetPointer(465,5), "Oo'glog Ogresses Open Health Spa!"); + } else { + setWidgetText(new WidgetPointer(465,2), " "); + setWidgetText(new WidgetPointer(465,3), " "); + setWidgetText(new WidgetPointer(465,4), " "); + setWidgetText(new WidgetPointer(465,5), " "); + } + return; +} diff --git a/dumps/scripts/828.cs2 b/dumps/scripts/828.cs2 new file mode 100644 index 000000000..1c72ac827 --- /dev/null +++ b/dumps/scripts/828.cs2 @@ -0,0 +1,51 @@ +void script_828() { + int ivar0; + int ivar1; + int ivar2; + script_2872(); + globalarray_0 = new int[add(1016, 1)]; + ivar0 = 0; + if (((boolean)globalint_89) || (globalint_89 == -1)) { + globalstring_196 = ""; + globalint_89 = 1; + } + while (ivar0 <= 1016) { + globalarray_0[ivar0] = ivar0; + createExtraChild(new WidgetPointer(187,1), 4, multiply(ivar0, 2)); + createExtraChild(new WidgetPointer(187,1), 5, add(multiply(ivar0, 2), 1)); + ivar0 = add(ivar0, 1); + } + script_520(0, 0, 1016, 1347); + setWidgetIntegerNode(1133, -1, new WidgetPointer(187,4)); + ivar0 = 0; + ivar1 = 0; + ivar2 = 0; + while (ivar1 <= 1016) { + ivar0 = globalarray_0[ivar1]; + if (setWidgetRegister(new WidgetPointer(187,1), multiply(ivar0, 2)) && setWidgetRegister(new WidgetPointer(187,1), add(multiply(ivar0, 2), 1))) { + if ((cs2method_3408(105, 77, 1351, ivar0) != 147) && ((boolean)cs2method_3408(105, 105, 1350, ivar0))) { + setWidgetTextAlignment(0, 1, 0); + setWidgetText(getCommonString(1345, ivar0)); + setWidgetSize(150, 15, 0, 0); + setScriptCallOnClickContextMenu(833, -2147483644, ivar0, "ii"); + cs2method1305(getCommonString(1345, ivar0)); + cs2method1305(getCommonString(1345, ivar0)); + setWidgetUnknownBoolean(false); + setWidgetFont(494); + setScriptCallOnMouseEntered(1356, new WidgetPointer(-32768,3), -2147483643, 16777215, "Iii"); + setWidgetSize(12, 12, 0, 0); + if (((boolean)ivar2)) { + setWidgetIntegerNode(1133, ivar0, new WidgetPointer(187,4)); + ivar2 = 1; + } + } + if (ivar1 < 1016) { + setWidgetIntegerNode(1133, globalarray_0[add(ivar1, 1)]); + } + } + ivar1 = add(ivar1, 1); + } + script_31(12255234, 12255233, 792, 789, 790, 791, 773, 788); + script_3680(); + return; +} diff --git a/dumps/scripts/829.cs2 b/dumps/scripts/829.cs2 new file mode 100644 index 000000000..343731153 --- /dev/null +++ b/dumps/scripts/829.cs2 @@ -0,0 +1,6 @@ +int script_829(int arg0,int arg1) { + if (arg0 == 845) { + return subtract(cs2method5302(), 1); + } + return subtract(getCommonDefinitionSize(arg1), 1); +} diff --git a/dumps/scripts/83.cs2 b/dumps/scripts/83.cs2 new file mode 100644 index 000000000..e12a25811 --- /dev/null +++ b/dumps/scripts/83.cs2 @@ -0,0 +1,107 @@ +void script_83(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20,int arg21) { + int ivar22; + script_1298(arg0, 29, 50, 0); + script_1298(arg12, 0, 0, 0); + script_1298(arg9, 0, 0, 0); + script_1298(arg20, 0, 0, 0); + script_1298(arg15, 0, 0, 0); + script_2670(arg1, arg4, arg5, arg8, arg2, arg6, arg3, arg7, globalint_91); + setWidgetRGB(new Color(cs2method_3408(105, 105, 3724, bitconfig_3612)), new WidgetPointer(arg11)); + ivar22 = getDisplayMode(); + script_2730(arg10, arg11, ivar22); + setScriptCallOnGameloop(2729, new WidgetPointer(-32768,3), new WidgetPointer(arg10), new WidgetPointer(arg11), ivar22, "IIIi", new WidgetPointer(arg0)); + script_2731(64356369, 0, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356370, 1, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356371, 2, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356372, 3, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356373, 4, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356374, 5, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356375, 6, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356376, 7, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356377, 8, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356378, 9, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356379, 10, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356380, 11, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356381, 12, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356382, 13, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356383, 14, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356384, 15, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356385, 20, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356386, 17, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356387, 18, arg19, arg11, arg20, arg21, arg14, arg17); + script_2731(64356388, 19, arg19, arg11, arg20, arg21, arg14, arg17); + setWidgetRGB(new Color(cs2method_3408(105, 105, 3723, bitconfig_9188)), new WidgetPointer(arg14)); + script_2730(arg13, arg14, ivar22); + setScriptCallOnGameloop(2729, new WidgetPointer(-32768,3), new WidgetPointer(arg13), new WidgetPointer(arg14), ivar22, "IIIi", new WidgetPointer(arg0)); + script_4426(64356424, 0, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356425, 1, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356426, 2, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356427, 3, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356428, 4, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356429, 5, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356430, 6, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356431, 7, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356432, 8, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356433, 9, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356434, 10, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356435, 11, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356436, 12, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356437, 13, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356438, 14, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356439, 15, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356440, 20, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356441, 17, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356442, 18, arg19, arg11, arg20, arg21, arg14, arg17); + script_4426(64356443, 19, arg19, arg11, arg20, arg21, arg14, arg17); + setWidgetRGB(new Color(cs2method_3408(105, 105, 3726, bitconfig_9191)), new WidgetPointer(arg17)); + script_2730(arg16, arg17, ivar22); + setScriptCallOnGameloop(2729, new WidgetPointer(-32768,3), new WidgetPointer(arg16), new WidgetPointer(arg17), ivar22, "IIIi", new WidgetPointer(arg0)); + script_4584(64356449, 0, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356450, 1, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356451, 2, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356452, 3, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356453, 4, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356454, 5, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356455, 6, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356456, 7, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356457, 8, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356458, 9, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356459, 10, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356460, 11, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356461, 12, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356462, 13, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356463, 14, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356464, 15, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356465, 20, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356466, 17, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356467, 18, arg19, arg11, arg20, arg21, arg14, arg17); + script_4584(64356468, 19, arg19, arg11, arg20, arg21, arg14, arg17); + if (standart_config_287 <= 0) { + setWidgetIsHidden(true, new WidgetPointer(arg20)); + } else { + setWidgetIsHidden(false, new WidgetPointer(arg20)); + } + setWidgetRGB(new Color(cs2method_3408(105, 105, 3056, standart_config_287)), new WidgetPointer(arg21)); + setWidgetUnknownBoolean(((boolean)cs2method_3408(105, 49, 3057, standart_config_287)), new WidgetPointer(arg21)); + script_176(64356401, 1, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356402, 2, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356403, 3, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356404, 4, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356405, 5, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356406, 6, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356407, 7, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356408, 8, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356409, 9, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356410, 10, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356411, 11, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356412, 12, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356413, 13, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356414, 14, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356415, 15, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356416, 16, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356417, 17, arg19, arg11, arg20, arg21, arg14, arg17); + script_176(64356418, 18, arg19, arg11, arg20, arg21, arg14, arg17); + setScriptCallOnClickContextMenu(3417, -2147483644, 0, new WidgetPointer(arg19), new WidgetPointer(arg11), new WidgetPointer(arg20), new WidgetPointer(arg21), new WidgetPointer(arg14), new WidgetPointer(arg17), "iiIIIIII", new WidgetPointer(arg18)); + setScriptCallOnConfigChange(2734, new WidgetPointer(arg19), new WidgetPointer(arg11), new WidgetPointer(arg20), new WidgetPointer(arg21), new WidgetPointer(arg14), new WidgetPointer(arg17), 287, 1438, 2, "IIIIIIY", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/830.cs2 b/dumps/scripts/830.cs2 new file mode 100644 index 000000000..9798f5918 --- /dev/null +++ b/dumps/scripts/830.cs2 @@ -0,0 +1,6 @@ +void script_830(int arg0,int arg1) { + setWidgetAnimation(3320, new WidgetPointer(arg1)); + setScriptCallOnConfigChange(831, new WidgetPointer(arg0), 425, 1, "IY", new WidgetPointer(arg0)); + script_834(arg0); + return; +} diff --git a/dumps/scripts/831.cs2 b/dumps/scripts/831.cs2 new file mode 100644 index 000000000..d4ab873f8 --- /dev/null +++ b/dumps/scripts/831.cs2 @@ -0,0 +1,4 @@ +void script_831(int arg0) { + script_834(arg0); + return; +} diff --git a/dumps/scripts/832.cs2 b/dumps/scripts/832.cs2 new file mode 100644 index 000000000..09fe5f2a0 --- /dev/null +++ b/dumps/scripts/832.cs2 @@ -0,0 +1,4 @@ +void script_832() { + script_3680(); + return; +} diff --git a/dumps/scripts/833.cs2 b/dumps/scripts/833.cs2 new file mode 100644 index 000000000..6fed27241 --- /dev/null +++ b/dumps/scripts/833.cs2 @@ -0,0 +1,17 @@ +void script_833(int arg0,int arg1) { + if (arg0 == 2) { + script_3683(); + if (arg1 < 500) { + if (((boolean)script_837(arg1)) && ((boolean)cs2method_3408(105, 105, 1350, arg1))) { + messageType0("This track was unlocked " + getCommonString(1349, arg1)); + } else { + messageType0("This track unlocks " + getCommonString(1349, arg1)); + } + } else if (((boolean)script_837(arg1)) && ((boolean)cs2method_3408(105, 105, 1350, arg1))) { + messageType0("This track was unlocked " + getCommonString(952, arg1)); + } else { + messageType0("This track unlocks " + getCommonString(952, arg1)); + } + } + return; +} diff --git a/dumps/scripts/834.cs2 b/dumps/scripts/834.cs2 new file mode 100644 index 000000000..6cbb6cbe2 --- /dev/null +++ b/dumps/scripts/834.cs2 @@ -0,0 +1,16 @@ +void script_834(int arg0) { + switch (bitconfig_278) { + case 1: + cs2method2103(200, new WidgetPointer(arg0)); + break; + case 2: + cs2method2103(150, new WidgetPointer(arg0)); + break; + case 3: + cs2method2103(50, new WidgetPointer(arg0)); + break; + default: + cs2method2103(255, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/835.cs2 b/dumps/scripts/835.cs2 new file mode 100644 index 000000000..4728f7640 --- /dev/null +++ b/dumps/scripts/835.cs2 @@ -0,0 +1,8 @@ +void script_835(int arg0) { + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(475,55)); + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(475,57)); + setWidgetIsHidden(((boolean)arg0), new WidgetPointer(475,56)); + script_84(); + script_89(); + return; +} diff --git a/dumps/scripts/836.cs2 b/dumps/scripts/836.cs2 new file mode 100644 index 000000000..a96a9e0a6 --- /dev/null +++ b/dumps/scripts/836.cs2 @@ -0,0 +1,4 @@ +void script_836(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + script_1176(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + return; +} diff --git a/dumps/scripts/837.cs2 b/dumps/scripts/837.cs2 new file mode 100644 index 000000000..afa5a1711 --- /dev/null +++ b/dumps/scripts/837.cs2 @@ -0,0 +1,99 @@ +int script_837(int arg0) { + if (arg0 < 32) { + return isBitFlagged(standart_config_20, bitAnd(arg0, 31)); + } + if (arg0 < 64) { + return isBitFlagged(standart_config_21, bitAnd(arg0, 31)); + } + if (arg0 < 96) { + return isBitFlagged(standart_config_22, bitAnd(arg0, 31)); + } + if (arg0 < 128) { + return isBitFlagged(standart_config_23, bitAnd(arg0, 31)); + } + if (arg0 < 160) { + return isBitFlagged(standart_config_24, bitAnd(arg0, 31)); + } + if (arg0 < 192) { + return isBitFlagged(standart_config_25, bitAnd(arg0, 31)); + } + if (arg0 < 224) { + return isBitFlagged(standart_config_298, bitAnd(arg0, 31)); + } + if (arg0 < 256) { + return isBitFlagged(standart_config_311, bitAnd(arg0, 31)); + } + if (arg0 < 288) { + return isBitFlagged(standart_config_346, bitAnd(arg0, 31)); + } + if (arg0 < 320) { + return isBitFlagged(standart_config_414, bitAnd(arg0, 31)); + } + if (arg0 < 352) { + return isBitFlagged(standart_config_464, bitAnd(arg0, 31)); + } + if (arg0 < 384) { + return isBitFlagged(standart_config_598, bitAnd(arg0, 31)); + } + if (arg0 < 416) { + return isBitFlagged(standart_config_662, bitAnd(arg0, 31)); + } + if (arg0 < 448) { + return isBitFlagged(standart_config_721, bitAnd(arg0, 31)); + } + if (arg0 < 480) { + return isBitFlagged(standart_config_906, bitAnd(arg0, 31)); + } + if (arg0 < 512) { + return isBitFlagged(standart_config_1009, bitAnd(arg0, 31)); + } + if (arg0 < 544) { + return isBitFlagged(standart_config_1104, bitAnd(arg0, 31)); + } + if (arg0 < 576) { + return isBitFlagged(standart_config_1136, bitAnd(arg0, 31)); + } + if (arg0 < 608) { + return isBitFlagged(standart_config_1180, bitAnd(arg0, 31)); + } + if (arg0 < 640) { + return isBitFlagged(standart_config_1202, bitAnd(arg0, 31)); + } + if (arg0 < 672) { + return isBitFlagged(standart_config_1381, bitAnd(arg0, 31)); + } + if (arg0 < 704) { + return isBitFlagged(standart_config_1394, bitAnd(arg0, 31)); + } + if (arg0 < 736) { + return isBitFlagged(standart_config_1434, bitAnd(arg0, 31)); + } + if (arg0 < 768) { + return isBitFlagged(standart_config_1596, bitAnd(arg0, 31)); + } + if (arg0 < 800) { + return isBitFlagged(standart_config_1618, bitAnd(arg0, 31)); + } + if (arg0 < 832) { + return isBitFlagged(standart_config_1619, bitAnd(arg0, 31)); + } + if (arg0 < 864) { + return isBitFlagged(standart_config_1620, bitAnd(arg0, 31)); + } + if (arg0 < 896) { + return 1; + } + if (arg0 < 928) { + return isBitFlagged(standart_config_1864, bitAnd(arg0, 31)); + } + if (arg0 < 960) { + return isBitFlagged(standart_config_1865, bitAnd(arg0, 31)); + } + if (arg0 < 992) { + return isBitFlagged(standart_config_2019, bitAnd(arg0, 31)); + } + if (arg0 < 1024) { + return isBitFlagged(standart_config_2246, bitAnd(arg0, 31)); + } + return -1; +} diff --git a/dumps/scripts/838.cs2 b/dumps/scripts/838.cs2 new file mode 100644 index 000000000..c9fe9c1cb --- /dev/null +++ b/dumps/scripts/838.cs2 @@ -0,0 +1,4 @@ +void script_838(int arg0) { + script_1184(arg0); + return; +} diff --git a/dumps/scripts/839.cs2 b/dumps/scripts/839.cs2 new file mode 100644 index 000000000..f9261eab6 --- /dev/null +++ b/dumps/scripts/839.cs2 @@ -0,0 +1,9 @@ +void script_839() { + playSoundEffect(4501, 1, 0); + if (((boolean)bitconfig_4399)) { + script_841(1); + } else { + script_841(0); + } + return; +} diff --git a/dumps/scripts/84.cs2 b/dumps/scripts/84.cs2 new file mode 100644 index 000000000..253ed146c --- /dev/null +++ b/dumps/scripts/84.cs2 @@ -0,0 +1,357 @@ +void script_84() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + int ivar17; + int ivar18; + int ivar19; + int ivar20; + int ivar21; + string svar0; + string svar1; + string svar2; + string svar3; + string svar4; + ivar0 = -1; + ivar1 = -1; + ivar2 = 0; + ivar3 = 1; + ivar4 = 1; + if (globalint_41 == 3) { + ivar2 = 1; + } + deleteAllExtraChilds(new WidgetPointer(137,58)); + ivar5 = -1; + ivar6 = script_4467(); + ivar7 = -1; + ivar8 = script_1891(); + globalint_132 = -1; + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + ivar9 = 0; + ivar10 = 0; + ivar11 = 0; + ivar12 = 0; + svar4 = ""; + ivar13 = 0; + if (getDisplayMode() >= 2) { + svar0 = ""; + svar1 = ""; + svar2 = ""; + svar3 = ""; + ivar12 = 16777215; + svar4 = ""; + ivar13 = 1; + ivar10 = cs2method_3408(105, 105, 3724, bitconfig_3612); + ivar9 = cs2method_3408(105, 105, 3723, bitconfig_9188); + ivar11 = cs2method_3408(105, 105, 3726, bitconfig_9191); + } else { + ivar10 = cs2method_3408(105, 105, 3724, bitconfig_3612); + ivar9 = cs2method_3408(105, 105, 3723, bitconfig_9188); + ivar11 = cs2method_3408(105, 105, 3726, bitconfig_9191); + } + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + ivar17 = 0; + ivar18 = 0; + ivar19 = 0; + ivar20 = 2; + ivar21 = 2; + while (ivar18 < 100) { + if (((boolean)script_193(ivar18)) && ((boolean)script_90(ivar18, ivar2))) { + createExtraChild(new WidgetPointer(137,58), 4, ivar14); + ivar15 = ivar14; + ivar16 = 1; + ivar14 = add(ivar14, 1); + ivar17 = cs2method5004(ivar18); + setWidgetRGB(new Color(ivar12)); + setWidgetFont(495); + setWidgetTextAlignment(0, 0, 14); + setWidgetUnknownBoolean(((boolean)ivar13)); + setWidgetPosition(3, ivar21, 0, 2); + switch (ivar17) { + case 0: + case 4: + case 11: + case 27: + case 26: + case 29: + case 28: + case 31: + case 30: + case 103: + case 110: + case 43: + case 109: + case 104: + setWidgetText(cs2method5003(ivar18)); + if (((boolean)ivar3) && (((((((((boolean)ivar17) || (ivar17 == 4)) || (ivar17 == 27)) || (ivar17 == 28)) || (ivar17 == 29)) || (ivar17 == 26)) || (ivar17 == 30)) || (ivar17 == 31))) { + globalint_1269 = cs2method5024(ivar18); + ivar3 = 0; + } + break; + case 1: + case 2: + setWidgetText(cs2method5010(ivar18) + ": " + svar0 + cs2method5003(ivar18)); + break; + case 3: + setWidgetText("From " + cs2method5010(ivar18) + ": " + svar1 + cs2method5003(ivar18)); + break; + case 100: + setWidgetText(svar2 + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 5: + setWidgetText(svar1 + cs2method5003(ivar18)); + break; + case 6: + setWidgetText("To " + cs2method5010(ivar18) + ": " + svar1 + cs2method5003(ivar18)); + break; + case 7: + setWidgetText("From " + cs2method5010(ivar18) + ": " + svar1 + cs2method5003(ivar18)); + break; + case 101: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 41: + setWidgetRGB(new Color(ivar10)); + setWidgetText(svar4 + "[" + "" + svar0 + cs2method5011(ivar18) + "" + svar4 + "] " + cs2method5010(ivar18) + ": " + "" + cs2method5003(ivar18)); + break; + case 9: + setWidgetRGB(new Color(ivar9)); + setWidgetText(svar4 + "[" + "" + svar0 + cs2method5011(ivar18) + "" + svar4 + "] " + cs2method5010(ivar18) + ": " + "" + cs2method5003(ivar18)); + break; + case 44: + setWidgetRGB(new Color(ivar11)); + setWidgetText(svar4 + "[" + "" + svar0 + cs2method5011(ivar18) + "" + svar4 + "] " + cs2method5010(ivar18) + ": " + "" + cs2method5003(ivar18)); + break; + case 117: + setWidgetText("" + cs2method5003(ivar18)); + break; + case 102: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 105: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 106: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 107: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 118: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 17: + if ((stringMethod4107(strRemoveEntities(cs2method5015()), strRemoveEntities(cs2method5010(ivar18))) != 0) && (cs2method5056(cs2method5012(ivar18)) > 0)) { + setWidgetText(cs2method5010(ivar18) + "" + ": " + svar0 + cs2method5003(ivar18)); + } else { + setWidgetText(cs2method5010(ivar18) + ": " + svar0 + cs2method5003(ivar18)); + } + break; + case 18: + if ((stringMethod4107(strRemoveEntities(cs2method5015()), strRemoveEntities(cs2method5010(ivar18))) != 0) && (cs2method5056(cs2method5012(ivar18)) > 0)) { + setWidgetText("From " + cs2method5010(ivar18) + "" + ": " + svar1 + cs2method5003(ivar18)); + } else { + setWidgetText("From " + cs2method5010(ivar18) + ": " + svar1 + cs2method5003(ivar18)); + } + break; + case 19: + setWidgetText("To " + cs2method5010(ivar18) + ": " + svar1 + cs2method5003(ivar18)); + break; + case 42: + setWidgetRGB(new Color(ivar10)); + if ((stringMethod4107(strRemoveEntities(cs2method5015()), strRemoveEntities(cs2method5010(ivar18))) != 0) && (cs2method5056(cs2method5012(ivar18)) > 0)) { + setWidgetText(svar4 + "[" + "" + svar0 + cs2method5011(ivar18) + "" + svar4 + "] " + cs2method5010(ivar18) + "" + ": " + "" + cs2method5003(ivar18)); + } else { + setWidgetText(svar4 + "[" + "" + svar0 + cs2method5011(ivar18) + "" + svar4 + "] " + cs2method5010(ivar18) + ": " + "" + cs2method5003(ivar18)); + } + break; + case 45: + setWidgetRGB(new Color(ivar11)); + if ((stringMethod4107(strRemoveEntities(cs2method5015()), strRemoveEntities(cs2method5010(ivar18))) != 0) && (cs2method5056(cs2method5012(ivar18)) > 0)) { + setWidgetText(svar4 + "[" + "" + svar0 + cs2method5011(ivar18) + "" + svar4 + "] " + cs2method5010(ivar18) + "" + ": " + "" + cs2method5003(ivar18)); + } else { + setWidgetText(svar4 + "[" + "" + svar0 + cs2method5011(ivar18) + "" + svar4 + "] " + cs2method5010(ivar18) + ": " + "" + cs2method5003(ivar18)); + } + break; + case 20: + setWidgetRGB(new Color(ivar9)); + if ((stringMethod4107(strRemoveEntities(cs2method5015()), strRemoveEntities(cs2method5010(ivar18))) != 0) && (cs2method5056(cs2method5012(ivar18)) > 0)) { + setWidgetText(svar4 + "[" + "" + svar0 + cs2method5011(ivar18) + "" + svar4 + "] " + cs2method5010(ivar18) + "" + ": " + "" + cs2method5003(ivar18)); + } else { + setWidgetText(svar4 + "[" + "" + svar0 + cs2method5011(ivar18) + "" + svar4 + "] " + cs2method5010(ivar18) + ": " + "" + cs2method5003(ivar18)); + } + break; + case 108: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 111: + case 112: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 114: + case 113: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 115: + setWidgetText("" + cs2method5010(ivar18) + " " + cs2method5003(ivar18)); + break; + case 116: + setWidgetText(cs2method5003(ivar18)); + } + setWidgetNoOptions(); + setScriptCallOnClickContextMenu(86, -2147483644, cs2method5019(ivar18), ivar18, "isi"); + cs2method1305("" + strRemoveEntities(cs2method5010(ivar18))); + switch (ivar17) { + case 1: + case 2: + case 3: + case 6: + case 7: + case 9: + case 41: + case 44: + if (((boolean)stringMethod4107(strRemoveEntities(cs2method5015()), strRemoveEntities(cs2method5010(ivar18)))) || ((boolean)stringMethod4107(strRemoveEntities(cs2method5020()), strRemoveEntities(cs2method5010(ivar18))))) { + } else { + if (isFriend(cs2method5019(ivar18))) { + if (isMuteRelatedMethod3329() && cs2method6900()) { + setWidgetContextMenuOption(6, "Message"); + } + } else { + setWidgetContextMenuOption(6, "Add friend"); + setWidgetContextMenuOption(7, "Add ignore"); + } + if ((getClientRights() > 0) || (((int)hasMoreThen5Blackmarks()) > 0)) { + setWidgetContextMenuOption(8, "Report abuse"); + } + if ((ivar17 == 41) && ((boolean)ivar6)) { + setWidgetContextMenuOption(10, "Kick/ban"); + } + if ((ivar17 == 9) && ((boolean)ivar8)) { + setWidgetContextMenuOption(10, "Kick/ban"); + } + } + break; + case 100: + setWidgetContextMenuOption(1, "Accept trade"); + break; + case 101: + case 106: + case 107: + case 105: + case 118: + case 114: + case 113: + setWidgetContextMenuOption(2, "Accept challenge"); + break; + case 102: + setWidgetContextMenuOption(3, "Give assistance"); + break; + case 111: + setWidgetContextMenuOption(4, "Open invitation"); + break; + case 112: + setWidgetContextMenuOption(3, "Vote"); + break; + case 17: + case 18: + case 20: + case 42: + case 45: + if (((boolean)stringMethod4107(strRemoveEntities(cs2method5015()), strRemoveEntities(cs2method5010(ivar18)))) || ((boolean)stringMethod4107(strRemoveEntities(cs2method5020()), strRemoveEntities(cs2method5010(ivar18))))) { + } else { + if (isFriend(cs2method5019(ivar18))) { + if (isMuteRelatedMethod3329() && cs2method6900()) { + setWidgetContextMenuOption(6, "Message"); + } + } else { + setWidgetContextMenuOption(6, "Add friend"); + setWidgetContextMenuOption(7, "Add ignore"); + } + if ((ivar17 == 42) && ((boolean)ivar6)) { + setWidgetContextMenuOption(10, "Kick/ban"); + } + if ((ivar17 == 20) && ((boolean)ivar8)) { + setWidgetContextMenuOption(10, "Kick/ban"); + } + if (cs2method5056(cs2method5012(ivar18)) > 0) { + if (globalint_132 == -1) { + globalint_132 = cs2method5012(ivar18); + globalstring_29 = cs2method5010(ivar18); + if (ivar17 == 20) { + globalint_133 = 6; + setWidgetContextMenuOption(9, "Quick Response"); + } + if (ivar17 == 42) { + globalint_133 = 9; + setWidgetContextMenuOption(9, "Quick Response"); + } + if (ivar17 == 45) { + globalint_133 = 11; + setWidgetContextMenuOption(9, "Quick Response"); + } else if (ivar17 == 18) { + globalint_133 = 5; + if (isFriend(cs2method5019(ivar18))) { + setWidgetContextMenuOption(9, "Quick Response"); + } + } else { + globalint_133 = 4; + setWidgetContextMenuOption(9, "Quick Response"); + } + } else { + setWidgetContextMenuOption(9, "Quick Response"); + } + } + } + break; + case 108: + setWidgetContextMenuOption(10, "Accept alliance"); + break; + case 117: + setWidgetContextMenuOption(5, "View invite from"); + } + } else { + ivar16 = 0; + } + if (((boolean)ivar4)) { + switch (cs2method5004(ivar18)) { + case 18: + case 7: + case 3: + globalstring_276 = strRemoveEntities(cs2method5019(ivar18)); + ivar4 = 0; + } + } + if (setWidgetRegister(new WidgetPointer(137,58), ivar15) && ((boolean)ivar16)) { + ivar19 = max(getLineCount(484, getWidgetFont(), getWidgetText()), 1); + setWidgetSize(max(min(getMaxLineWidth(484, getWidgetFont(), getWidgetText()), 484), 1), multiply(14, ivar19), 0, 0); + ivar20 = add(ivar20, getWidgetActualHeight()); + ivar21 = add(ivar21, getWidgetActualHeight()); + } + ivar18 = add(ivar18, 1); + } + ivar20 = max(ivar20, getWidgetActualHeight(new WidgetPointer(137,58))); + setWidgetScrollMax(463, ivar20, new WidgetPointer(137,58)); + script_72(8978491, 8978490, subtract(add(globalint_7, getWidgetScrollMaxV(new WidgetPointer(137,58))), globalint_8)); + globalint_7 = cs2method2601(new WidgetPointer(137,58)); + globalint_8 = getWidgetScrollMaxV(new WidgetPointer(137,58)); + return; +} diff --git a/dumps/scripts/840.cs2 b/dumps/scripts/840.cs2 new file mode 100644 index 000000000..33c33c705 --- /dev/null +++ b/dumps/scripts/840.cs2 @@ -0,0 +1,4 @@ +void script_840() { + playSoundEffect(4501, 1, 0); + return; +} diff --git a/dumps/scripts/841.cs2 b/dumps/scripts/841.cs2 new file mode 100644 index 000000000..c0df992d0 --- /dev/null +++ b/dumps/scripts/841.cs2 @@ -0,0 +1,25 @@ +void script_841(int arg0) { + int ivar1; + ivar1 = 0; + bitconfig_4399 = arg0; + setWidgetIsHidden(true, cs2method_3408(105, 73, 1355, bitconfig_4398)); + setWidgetIsHidden(true, cs2method_3408(105, 73, 1358, bitconfig_4398)); + if (((boolean)arg0)) { + setWidgetIsHidden(false, new WidgetPointer(681,9)); + setWidgetIsHidden(true, new WidgetPointer(681,12)); + } else { + setWidgetIsHidden(false, new WidgetPointer(681,12)); + setWidgetIsHidden(true, new WidgetPointer(681,9)); + } + while (ivar1 < 10) { + if (script_855(ivar1) == arg0) { + if ((script_851(ivar1) != 7) || (script_852(ivar1) != 2)) { + setWidgetIsHidden(false, cs2method_3408(105, 73, 1354, ivar1)); + } + } else { + setWidgetIsHidden(true, cs2method_3408(105, 73, 1354, ivar1)); + } + ivar1 = add(ivar1, 1); + } + return; +} diff --git a/dumps/scripts/842.cs2 b/dumps/scripts/842.cs2 new file mode 100644 index 000000000..3f6f38059 --- /dev/null +++ b/dumps/scripts/842.cs2 @@ -0,0 +1,4 @@ +void script_842() { + script_846(bitconfig_4398, 2); + return; +} diff --git a/dumps/scripts/843.cs2 b/dumps/scripts/843.cs2 new file mode 100644 index 000000000..036bc5d3c --- /dev/null +++ b/dumps/scripts/843.cs2 @@ -0,0 +1,4 @@ +void script_843() { + script_846(bitconfig_4398, 3); + return; +} diff --git a/dumps/scripts/844.cs2 b/dumps/scripts/844.cs2 new file mode 100644 index 000000000..20c97645d --- /dev/null +++ b/dumps/scripts/844.cs2 @@ -0,0 +1,4 @@ +void script_844() { + script_846(bitconfig_4398, 0); + return; +} diff --git a/dumps/scripts/845.cs2 b/dumps/scripts/845.cs2 new file mode 100644 index 000000000..ce9055040 --- /dev/null +++ b/dumps/scripts/845.cs2 @@ -0,0 +1,4 @@ +void script_845() { + script_846(bitconfig_4398, 1); + return; +} diff --git a/dumps/scripts/846.cs2 b/dumps/scripts/846.cs2 new file mode 100644 index 000000000..f705dc789 --- /dev/null +++ b/dumps/scripts/846.cs2 @@ -0,0 +1,52 @@ +void script_846(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + ivar2 = ((int)cs2method_3408(105, 73, 1354, arg0)); + ivar3 = ((int)cs2method_3408(105, 73, 1355, arg0)); + ivar4 = 0; + ivar5 = 0; + ivar6 = getWidgetActualX(new WidgetPointer(ivar2)); + ivar7 = getWidgetActualY(new WidgetPointer(ivar2)); + ivar8 = getWidgetActualX(new WidgetPointer(ivar3)); + ivar9 = getWidgetActualY(new WidgetPointer(ivar3)); + ivar10 = getWidgetRotateY(new WidgetPointer(ivar2)); + ivar11 = add(multiply(15, 18), 65); + ivar12 = add(multiply(11, 18), -2); + ivar13 = 0; + ivar14 = 0; + if (arg0 != 10) { + if (((boolean)arg1) && (ivar6 > 65)) { + ivar13 = subtract(ivar13, 18); + playSoundEffect(4503, 1, 0); + } else if (((boolean)arg1) && (ivar6 < subtract(ivar11, 1))) { + ivar13 = add(ivar13, 18); + playSoundEffect(4503, 1, 0); + } else if ((arg1 == 2) && (ivar7 > -2)) { + ivar14 = subtract(ivar14, 18); + playSoundEffect(4503, 1, 0); + } else { + if ((arg1 == 3) && (ivar7 < ivar12)) { + ivar14 = add(ivar14, 18); + playSoundEffect(4503, 1, 0); + } + } + ivar6 = add(add(ivar6, ivar13), ivar4); + ivar7 = add(add(ivar7, ivar14), ivar5); + ivar8 = add(add(ivar8, ivar13), ivar4); + ivar9 = add(add(ivar9, ivar14), ivar5); + setWidgetPosition(ivar6, ivar7, 0, 0, new WidgetPointer(ivar2)); + setWidgetPosition(ivar8, ivar9, 0, 0, new WidgetPointer(ivar3)); + } + return; +} diff --git a/dumps/scripts/847.cs2 b/dumps/scripts/847.cs2 new file mode 100644 index 000000000..cbdd51173 --- /dev/null +++ b/dumps/scripts/847.cs2 @@ -0,0 +1,4 @@ +void script_847() { + script_849(bitconfig_4398, 1); + return; +} diff --git a/dumps/scripts/848.cs2 b/dumps/scripts/848.cs2 new file mode 100644 index 000000000..daf75614d --- /dev/null +++ b/dumps/scripts/848.cs2 @@ -0,0 +1,4 @@ +void script_848() { + script_849(bitconfig_4398, 0); + return; +} diff --git a/dumps/scripts/849.cs2 b/dumps/scripts/849.cs2 new file mode 100644 index 000000000..8c4cec0ad --- /dev/null +++ b/dumps/scripts/849.cs2 @@ -0,0 +1,63 @@ +void script_849(int arg0,int arg1) { + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + ivar2 = ((int)cs2method_3408(105, 73, 1354, arg0)); + ivar3 = ((int)cs2method_3408(105, 73, 1355, arg0)); + ivar4 = ((int)cs2method_3408(105, 73, 1358, arg0)); + ivar5 = script_853(arg0); + ivar6 = script_854(arg0); + ivar7 = 0; + ivar8 = 0; + ivar9 = 0; + ivar10 = 0; + ivar11 = getWidgetActualX(new WidgetPointer(ivar2)); + ivar12 = getWidgetActualY(new WidgetPointer(ivar2)); + ivar13 = getWidgetActualX(new WidgetPointer(ivar3)); + ivar14 = getWidgetActualY(new WidgetPointer(ivar3)); + ivar15 = getWidgetRotateY(new WidgetPointer(ivar2)); + if (arg0 != 10) { + playSoundEffect(4503, 1, 0); + if (((boolean)arg1)) { + ivar15 = add(ivar15, 512); + if (ivar15 >= 2047) { + ivar15 = 0; + } + } else { + ivar15 = subtract(ivar15, 512); + if (ivar15 < 0) { + ivar15 = 2047; + } + } + setWidget3DRotation(0, 0, 512, ivar15, 0, 3500, new WidgetPointer(ivar2)); + setWidget3DRotation(0, 0, 512, ivar15, 0, 3500, new WidgetPointer(ivar3)); + setWidget3DRotation(0, 0, 512, ivar15, 0, 3500, new WidgetPointer(ivar4)); + if (script_850(ivar5) != script_850(ivar6)) { + if ((ivar15 == 512) || (ivar15 == 1536)) { + ivar9 = 9; + ivar10 = 9; + } else { + ivar9 = -9; + ivar10 = -9; + } + ivar11 = add(add(ivar11, ivar9), ivar7); + ivar12 = add(add(ivar12, ivar10), ivar8); + ivar13 = add(add(ivar13, ivar9), ivar7); + ivar14 = add(add(ivar14, ivar10), ivar8); + } + setWidgetPosition(ivar11, ivar12, 0, 0, new WidgetPointer(ivar2)); + setWidgetPosition(ivar13, ivar14, 0, 0, new WidgetPointer(ivar3)); + } + return; +} diff --git a/dumps/scripts/85.cs2 b/dumps/scripts/85.cs2 new file mode 100644 index 000000000..645fb85e7 --- /dev/null +++ b/dumps/scripts/85.cs2 @@ -0,0 +1,5 @@ +void script_85(int arg0) { + setWidgetText(new WidgetPointer(arg0), ""); + setWidgetNoOptions(new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/850.cs2 b/dumps/scripts/850.cs2 new file mode 100644 index 000000000..484b1f551 --- /dev/null +++ b/dumps/scripts/850.cs2 @@ -0,0 +1,6 @@ +int script_850(int arg0) { + if (((boolean)mod(arg0, 2))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/851.cs2 b/dumps/scripts/851.cs2 new file mode 100644 index 000000000..b3d82ea4c --- /dev/null +++ b/dumps/scripts/851.cs2 @@ -0,0 +1,36 @@ +int script_851(int arg0) { + if (arg0 == 10) { + return 0; + } + if (((boolean)arg0)) { + return bitconfig_4400; + } + if (((boolean)arg0)) { + return bitconfig_4404; + } + if (arg0 == 2) { + return bitconfig_4408; + } + if (arg0 == 3) { + return bitconfig_4412; + } + if (arg0 == 4) { + return bitconfig_4416; + } + if (arg0 == 5) { + return bitconfig_4420; + } + if (arg0 == 6) { + return bitconfig_4424; + } + if (arg0 == 7) { + return bitconfig_4428; + } + if (arg0 == 8) { + return bitconfig_4432; + } + if (arg0 == 9) { + return bitconfig_4436; + } + return 0; +} diff --git a/dumps/scripts/852.cs2 b/dumps/scripts/852.cs2 new file mode 100644 index 000000000..d8854ae59 --- /dev/null +++ b/dumps/scripts/852.cs2 @@ -0,0 +1,36 @@ +int script_852(int arg0) { + if (arg0 == 10) { + return 0; + } + if (((boolean)arg0)) { + return bitconfig_4401; + } + if (((boolean)arg0)) { + return bitconfig_4405; + } + if (arg0 == 2) { + return bitconfig_4409; + } + if (arg0 == 3) { + return bitconfig_4413; + } + if (arg0 == 4) { + return bitconfig_4417; + } + if (arg0 == 5) { + return bitconfig_4421; + } + if (arg0 == 6) { + return bitconfig_4425; + } + if (arg0 == 7) { + return bitconfig_4431; + } + if (arg0 == 8) { + return bitconfig_4433; + } + if (arg0 == 9) { + return bitconfig_4437; + } + return 0; +} diff --git a/dumps/scripts/853.cs2 b/dumps/scripts/853.cs2 new file mode 100644 index 000000000..64b7d7f4f --- /dev/null +++ b/dumps/scripts/853.cs2 @@ -0,0 +1,36 @@ +int script_853(int arg0) { + if (arg0 == 10) { + return 0; + } + if (((boolean)arg0)) { + return 2; + } + if (((boolean)arg0)) { + return 3; + } + if (arg0 == 2) { + return 4; + } + if (arg0 == 3) { + return 5; + } + if (arg0 == 4) { + return 3; + } + if (arg0 == 5) { + return 4; + } + if (arg0 == 6) { + return 4; + } + if (arg0 == 7) { + return 3; + } + if (arg0 == 8) { + return 4; + } + if (arg0 == 9) { + return 3; + } + return 0; +} diff --git a/dumps/scripts/854.cs2 b/dumps/scripts/854.cs2 new file mode 100644 index 000000000..6bf8dcc7d --- /dev/null +++ b/dumps/scripts/854.cs2 @@ -0,0 +1,36 @@ +int script_854(int arg0) { + if (arg0 == 10) { + return 0; + } + if (((boolean)arg0)) { + return 1; + } + if (((boolean)arg0)) { + return 1; + } + if (arg0 == 2) { + return 1; + } + if (arg0 == 3) { + return 1; + } + if (arg0 == 4) { + return 2; + } + if (arg0 == 5) { + return 2; + } + if (arg0 == 6) { + return 2; + } + if (arg0 == 7) { + return 2; + } + if (arg0 == 8) { + return 2; + } + if (arg0 == 9) { + return 3; + } + return 0; +} diff --git a/dumps/scripts/855.cs2 b/dumps/scripts/855.cs2 new file mode 100644 index 000000000..dc20c9174 --- /dev/null +++ b/dumps/scripts/855.cs2 @@ -0,0 +1,36 @@ +int script_855(int arg0) { + if (arg0 == 10) { + return 0; + } + if (((boolean)arg0)) { + return bitconfig_4403; + } + if (((boolean)arg0)) { + return bitconfig_4406; + } + if (arg0 == 2) { + return bitconfig_4411; + } + if (arg0 == 3) { + return bitconfig_4415; + } + if (arg0 == 4) { + return bitconfig_4419; + } + if (arg0 == 5) { + return bitconfig_4423; + } + if (arg0 == 6) { + return bitconfig_4427; + } + if (arg0 == 7) { + return bitconfig_4430; + } + if (arg0 == 8) { + return bitconfig_4435; + } + if (arg0 == 9) { + return bitconfig_4439; + } + return 0; +} diff --git a/dumps/scripts/856.cs2 b/dumps/scripts/856.cs2 new file mode 100644 index 000000000..a3cc1a0c7 --- /dev/null +++ b/dumps/scripts/856.cs2 @@ -0,0 +1,8 @@ +void script_856() { + playSoundEffect(2605, 1, 0); + if (bitconfig_4400 < subtract(7, 1)) { + globalint_108 = add(bitconfig_4400, 1); + script_861(); + } + return; +} diff --git a/dumps/scripts/857.cs2 b/dumps/scripts/857.cs2 new file mode 100644 index 000000000..6e44e5a92 --- /dev/null +++ b/dumps/scripts/857.cs2 @@ -0,0 +1,8 @@ +void script_857() { + playSoundEffect(2605, 1, 0); + if (bitconfig_4400 > 0) { + globalint_108 = subtract(bitconfig_4400, 1); + script_861(); + } + return; +} diff --git a/dumps/scripts/858.cs2 b/dumps/scripts/858.cs2 new file mode 100644 index 000000000..9c3c0c97e --- /dev/null +++ b/dumps/scripts/858.cs2 @@ -0,0 +1,4 @@ +void script_858() { + playSoundEffect(2605, 1, 0); + return; +} diff --git a/dumps/scripts/859.cs2 b/dumps/scripts/859.cs2 new file mode 100644 index 000000000..0ecbfcf99 --- /dev/null +++ b/dumps/scripts/859.cs2 @@ -0,0 +1,4 @@ +void script_859() { + playSoundEffect(2605, 1, 0); + return; +} diff --git a/dumps/scripts/86.cs2 b/dumps/scripts/86.cs2 new file mode 100644 index 000000000..558fcc45b --- /dev/null +++ b/dumps/scripts/86.cs2 @@ -0,0 +1,68 @@ +void script_86(int arg0,int arg1,string arg2) { + int ivar2; + arg2 = strRemoveEntities(arg2); + ivar2 = cs2method5004(arg1); + switch (arg0) { + case 1: + clickPlayerOption(4, arg2); + break; + case 2: + clickPlayerOption(1, arg2); + break; + case 3: + clickPlayerOption(7, arg2); + break; + case 4: + clickPlayerOption(1, arg2); + break; + case 5: + clickPlayerOption(9, arg2); + break; + case 6: + if (((boolean)script_2709())) { + messageType0("You cannot add a friend until you have entered your date of birth"); + return; + } + if (isFriend(arg2)) { + if (isMuteRelatedMethod3329() && cs2method6900()) { + globalint_1650 = 1; + globalstring_23 = arg2; + script_1558(0); + return; + } + } else { + cs2method3605(arg2); + } + break; + case 7: + cs2method3607(arg2); + break; + case 8: + globalstring_24 = arg2; + break; + case 9: + if (ivar2 == 17) { + script_1052(4, cs2method5012(arg1), cs2method5010(arg1)); + } else if (ivar2 == 18) { + script_1052(5, cs2method5012(arg1), cs2method5010(arg1)); + } else if (ivar2 == 20) { + script_1052(6, cs2method5012(arg1), cs2method5010(arg1)); + } else if (ivar2 == 42) { + script_1052(9, cs2method5012(arg1), cs2method5010(arg1)); + } else { + if (ivar2 == 45) { + script_1052(11, cs2method5012(arg1), cs2method5010(arg1)); + } + } + break; + case 10: + if ((ivar2 == 41) || (ivar2 == 42)) { + script_4465(arg2); + } else if ((ivar2 == 9) || (ivar2 == 20)) { + script_1633(arg2); + } else { + clickPlayerOption(5, arg2); + } + } + return; +} diff --git a/dumps/scripts/860.cs2 b/dumps/scripts/860.cs2 new file mode 100644 index 000000000..29c22d108 --- /dev/null +++ b/dumps/scripts/860.cs2 @@ -0,0 +1,4 @@ +void script_860() { + playSoundEffect(4502, 1, 0); + return; +} diff --git a/dumps/scripts/861.cs2 b/dumps/scripts/861.cs2 new file mode 100644 index 000000000..9e5a03bc8 --- /dev/null +++ b/dumps/scripts/861.cs2 @@ -0,0 +1,28 @@ +void script_861() { + setWidgetIsHidden(false, new WidgetPointer(682,29)); + setWidgetIsHidden(true, new WidgetPointer(682,30)); + setWidgetIsHidden(true, new WidgetPointer(682,31)); + setWidgetIsHidden(true, new WidgetPointer(682,32)); + setWidgetIsHidden(true, new WidgetPointer(682,33)); + setWidgetIsHidden(true, new WidgetPointer(682,34)); + setWidgetIsHidden(true, new WidgetPointer(682,35)); + if (globalint_108 > 0) { + setWidgetIsHidden(false, new WidgetPointer(682,30)); + } + if (globalint_108 > 1) { + setWidgetIsHidden(false, new WidgetPointer(682,31)); + } + if (globalint_108 > 2) { + setWidgetIsHidden(false, new WidgetPointer(682,32)); + } + if (globalint_108 > 3) { + setWidgetIsHidden(false, new WidgetPointer(682,33)); + } + if (globalint_108 > 4) { + setWidgetIsHidden(false, new WidgetPointer(682,34)); + } + if (globalint_108 > 5) { + setWidgetIsHidden(false, new WidgetPointer(682,35)); + } + return; +} diff --git a/dumps/scripts/862.cs2 b/dumps/scripts/862.cs2 new file mode 100644 index 000000000..dac680de7 --- /dev/null +++ b/dumps/scripts/862.cs2 @@ -0,0 +1,4 @@ +void script_862() { + setWidgetText(new WidgetPointer(689,8), intToStr(bitconfig_4449)); + return; +} diff --git a/dumps/scripts/863.cs2 b/dumps/scripts/863.cs2 new file mode 100644 index 000000000..75c175dfc --- /dev/null +++ b/dumps/scripts/863.cs2 @@ -0,0 +1,21 @@ +void script_863() { + if (((boolean)bitconfig_7912) && ((boolean)bitconfig_7921)) { + setWidgetModel(cs2method_3408(105, 109, 5079, bitconfig_7919), new WidgetPointer(986,3)); + setWidgetIsHidden(true, new WidgetPointer(986,16)); + if (bitconfig_7920 != 0) { + setWidgetIsHidden(false, new WidgetPointer(986,5)); + } + if (((boolean)bitconfig_7920)) { + setWidgetPosition(30, 205, 0, 0, new WidgetPointer(986,5)); + } else if (bitconfig_7920 == 2) { + setWidgetPosition(112, 205, 0, 0, new WidgetPointer(986,5)); + } else if (bitconfig_7920 == 3) { + setWidgetPosition(196, 205, 0, 0, new WidgetPointer(986,5)); + } else { + setWidgetIsHidden(true, new WidgetPointer(986,5)); + } + } else { + setWidgetModel(-1, new WidgetPointer(986,3)); + } + return; +} diff --git a/dumps/scripts/864.cs2 b/dumps/scripts/864.cs2 new file mode 100644 index 000000000..407ecafb7 --- /dev/null +++ b/dumps/scripts/864.cs2 @@ -0,0 +1,16 @@ +void script_864(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10) { + int ivar11; + ivar11 = 0; + if (((boolean)arg6)) { + ivar11 = getTextWidth(468, getWidgetText(new WidgetPointer(arg5))); + } else { + ivar11 = getWidgetActualWidth(new WidgetPointer(arg5)); + } + if (((boolean)arg1) && (subtract(getWidgetActualWidth(new WidgetPointer(arg0)), ivar11) < arg7)) { + setScriptCallOnGameloop(2929, new WidgetPointer(arg0), arg1, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), new WidgetPointer(arg5), arg6, arg7, arg8, arg9, arg10, "I1IIII1iiii", new WidgetPointer(arg2)); + return; + } + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg2)); + setScriptCallOnGameloop(2930, new WidgetPointer(arg0), arg1, ivar11, new WidgetPointer(arg2), new WidgetPointer(arg3), new WidgetPointer(arg4), arg7, arg8, arg9, arg10, "I1iIIIiiii", new WidgetPointer(arg0)); + return; +} diff --git a/dumps/scripts/865.cs2 b/dumps/scripts/865.cs2 new file mode 100644 index 000000000..d3dd469f7 --- /dev/null +++ b/dumps/scripts/865.cs2 @@ -0,0 +1,23 @@ +void script_865() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = 0; + if (((boolean)standart_config_1113)) { + if (globalint_84 <= 2147482647) { + globalint_84 = add(globalint_84, 1000); + } + } else { + ivar0 = getItemAmtInContainer(93, standart_config_1109); + if (standart_config_1109 != getNotedItem(standart_config_1109)) { + ivar1 = getItemAmtInContainer(93, getNotedItem(standart_config_1109)); + } + globalint_84 = ivar0; + if ((globalint_84 <= 1000000000) && (ivar1 <= 1000000000)) { + globalint_84 = add(globalint_84, ivar1); + } + } + setWidgetText(new WidgetPointer(105,148), formatNumber(globalint_84, 1)); + script_602(); + return; +} diff --git a/dumps/scripts/866.cs2 b/dumps/scripts/866.cs2 new file mode 100644 index 000000000..1f39a79b2 --- /dev/null +++ b/dumps/scripts/866.cs2 @@ -0,0 +1,5 @@ +void script_866(int arg0,int arg1) { + setItemOnWidgetMethod2205(standart_config_853, 1, new WidgetPointer(arg0)); + setItemOnWidgetMethod2205(standart_config_854, 1, new WidgetPointer(arg1)); + return; +} diff --git a/dumps/scripts/867.cs2 b/dumps/scripts/867.cs2 new file mode 100644 index 000000000..201ad484b --- /dev/null +++ b/dumps/scripts/867.cs2 @@ -0,0 +1,5 @@ +void script_867(int arg0,int arg1,int arg2,int arg3) { + setWidgetSprite(arg1, new WidgetPointer(arg0)); + setWidgetIsHidden(((boolean)arg3), new WidgetPointer(arg2)); + return; +} diff --git a/dumps/scripts/868.cs2 b/dumps/scripts/868.cs2 new file mode 100644 index 000000000..ace885ea2 --- /dev/null +++ b/dumps/scripts/868.cs2 @@ -0,0 +1,44 @@ +void script_868(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13) { + int ivar14; + int ivar15; + int ivar16; + int ivar17; + ivar14 = script_718(globalint_1441); + ivar15 = script_718(globalint_1442); + ivar16 = script_715(ivar14, globalint_1443, ivar15, globalint_1444); + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetStringNode(718, script_4126(ivar16)); + setWidgetRGB(new Color(ivar16)); + } + if (setWidgetRegister(new WidgetPointer(arg8))) { + setWidgetStringNode(718, script_4126(ivar16)); + setWidgetRGB(new Color(ivar16)); + } + if (setWidgetRegister(new WidgetPointer(arg1))) { + setWidgetStringNode(718, script_4126(ivar14)); + setWidgetRGB(new Color(ivar14)); + } + if (setWidgetRegister(new WidgetPointer(arg2))) { + setWidgetStringNode(718, script_4126(ivar15)); + setWidgetRGB(new Color(ivar15)); + } + setWidgetModel(cs2method_3408(105, 109, 1595, divide(globalint_1450, 10)), new WidgetPointer(arg10)); + setWidgetModel(cs2method_3408(105, 109, 1595, mod(globalint_1450, 10)), new WidgetPointer(arg11)); + ivar17 = add(multiply(globalint_1441, globalint_1443), multiply(globalint_1442, globalint_1444)); + if (globalint_1450 < ivar17) { + setWidgetSprite(4567, new WidgetPointer(arg13)); + } else if (globalint_1450 > ivar17) { + setWidgetSprite(4568, new WidgetPointer(arg13)); + } else { + setWidgetSprite(4565, new WidgetPointer(arg13)); + playSoundEffect2False(3559, 1, 0, 255); + } + if (ivar16 == 16711935) { + setWidgetSprite(4565, new WidgetPointer(arg12)); + playSoundEffect2False(3559, 1, 10, 255); + } else { + setWidgetSprite(4566, new WidgetPointer(arg12)); + } + script_2472(arg3, arg4, arg5, arg6, arg7, arg9, standart_config_851, standart_config_852, 1109); + return; +} diff --git a/dumps/scripts/869.cs2 b/dumps/scripts/869.cs2 new file mode 100644 index 000000000..169eb00eb --- /dev/null +++ b/dumps/scripts/869.cs2 @@ -0,0 +1,44 @@ +void script_869(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13) { + int ivar14; + int ivar15; + int ivar16; + int ivar17; + ivar14 = script_718(globalint_1445); + ivar15 = script_718(globalint_1446); + ivar16 = script_715(ivar14, globalint_1447, ivar15, globalint_1448); + if (setWidgetRegister(new WidgetPointer(arg0))) { + setWidgetStringNode(718, script_4126(ivar16)); + setWidgetRGB(new Color(ivar16)); + } + if (setWidgetRegister(new WidgetPointer(arg8))) { + setWidgetStringNode(718, script_4126(ivar16)); + setWidgetRGB(new Color(ivar16)); + } + if (setWidgetRegister(new WidgetPointer(arg1))) { + setWidgetStringNode(718, script_4126(ivar14)); + setWidgetRGB(new Color(ivar14)); + } + if (setWidgetRegister(new WidgetPointer(arg2))) { + setWidgetStringNode(718, script_4126(ivar15)); + setWidgetRGB(new Color(ivar15)); + } + setWidgetModel(cs2method_3408(105, 109, 1595, divide(globalint_1451, 10)), new WidgetPointer(arg10)); + setWidgetModel(cs2method_3408(105, 109, 1595, mod(globalint_1451, 10)), new WidgetPointer(arg11)); + ivar17 = add(multiply(globalint_1445, globalint_1447), multiply(globalint_1446, globalint_1448)); + if (globalint_1451 < ivar17) { + setWidgetSprite(4567, new WidgetPointer(arg13)); + } else if (globalint_1451 > ivar17) { + setWidgetSprite(4568, new WidgetPointer(arg13)); + } else { + setWidgetSprite(4565, new WidgetPointer(arg13)); + playSoundEffect2False(3559, 1, 0, 255); + } + if (ivar16 == 16776960) { + setWidgetSprite(4565, new WidgetPointer(arg12)); + playSoundEffect2False(3559, 1, 10, 255); + } else { + setWidgetSprite(4566, new WidgetPointer(arg12)); + } + script_2472(arg3, arg4, arg5, arg6, arg7, arg9, standart_config_853, standart_config_854, 1110); + return; +} diff --git a/dumps/scripts/87.cs2 b/dumps/scripts/87.cs2 new file mode 100644 index 000000000..936e2f321 --- /dev/null +++ b/dumps/scripts/87.cs2 @@ -0,0 +1,9 @@ +void script_87(int arg0) { + setWidgetText(new WidgetPointer(arg0), "Score: " + intToStr(bitconfig_2121)); + if (((boolean)bitconfig_2121)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(arg0)); + } else { + setWidgetRGB(new Color(255, 255, 0), new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/870.cs2 b/dumps/scripts/870.cs2 new file mode 100644 index 000000000..cac0f45d1 --- /dev/null +++ b/dumps/scripts/870.cs2 @@ -0,0 +1,7 @@ +void script_870(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7) { + script_31(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7); + if (setWidgetRegister(new WidgetPointer(arg0), 1)) { + script_157(arg0, arg1, globalint_109, 1); + } + return; +} diff --git a/dumps/scripts/871.cs2 b/dumps/scripts/871.cs2 new file mode 100644 index 000000000..03bd9e0cd --- /dev/null +++ b/dumps/scripts/871.cs2 @@ -0,0 +1,24 @@ +void script_871() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + ivar0 = subtract(20, 0); + ivar1 = subtract(80, 0); + ivar2 = divide(ivar1, ivar0); + ivar3 = multiply(bitconfig_4523, ivar2); + ivar4 = divide(1024, ivar1); + globalint_111 = ivar3; + ivar5 = multiply(globalint_111, ivar4); + ivar5 = add(ivar5, 512); + ivar5 = subtract(2048, ivar5); + setWidget3DRotation(0, 0, 0, 0, ivar5, 388, new WidgetPointer(717,4)); + script_896(); + ivar6 = multiply(cs2method_3408(105, 105, 1422, bitconfig_4519), divide(1024, ivar0)); + ivar6 = add(ivar6, 512); + setWidget3DRotation(0, 0, 0, 0, ivar6, 365, new WidgetPointer(717,3)); + return; +} diff --git a/dumps/scripts/872.cs2 b/dumps/scripts/872.cs2 new file mode 100644 index 000000000..868c4c9e6 --- /dev/null +++ b/dumps/scripts/872.cs2 @@ -0,0 +1,7 @@ +void script_872(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(697,4)); + setWidgetIsHidden(true, new WidgetPointer(697,5)); + return; +} diff --git a/dumps/scripts/873.cs2 b/dumps/scripts/873.cs2 new file mode 100644 index 000000000..fa2101371 --- /dev/null +++ b/dumps/scripts/873.cs2 @@ -0,0 +1,7 @@ +void script_873(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(697,3)); + setWidgetIsHidden(true, new WidgetPointer(697,5)); + return; +} diff --git a/dumps/scripts/874.cs2 b/dumps/scripts/874.cs2 new file mode 100644 index 000000000..600759d9e --- /dev/null +++ b/dumps/scripts/874.cs2 @@ -0,0 +1,7 @@ +void script_874(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(697,3)); + setWidgetIsHidden(true, new WidgetPointer(697,4)); + return; +} diff --git a/dumps/scripts/875.cs2 b/dumps/scripts/875.cs2 new file mode 100644 index 000000000..d3e29eb09 --- /dev/null +++ b/dumps/scripts/875.cs2 @@ -0,0 +1,6 @@ +void script_875(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(694,24)); + return; +} diff --git a/dumps/scripts/876.cs2 b/dumps/scripts/876.cs2 new file mode 100644 index 000000000..a896b4c86 --- /dev/null +++ b/dumps/scripts/876.cs2 @@ -0,0 +1,6 @@ +void script_876(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(694,23)); + return; +} diff --git a/dumps/scripts/877.cs2 b/dumps/scripts/877.cs2 new file mode 100644 index 000000000..40cd864fb --- /dev/null +++ b/dumps/scripts/877.cs2 @@ -0,0 +1,6 @@ +void script_877(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(696,4)); + return; +} diff --git a/dumps/scripts/878.cs2 b/dumps/scripts/878.cs2 new file mode 100644 index 000000000..e385b00da --- /dev/null +++ b/dumps/scripts/878.cs2 @@ -0,0 +1,6 @@ +void script_878(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(696,3)); + return; +} diff --git a/dumps/scripts/879.cs2 b/dumps/scripts/879.cs2 new file mode 100644 index 000000000..e79347501 --- /dev/null +++ b/dumps/scripts/879.cs2 @@ -0,0 +1,6 @@ +void script_879(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(707,4)); + return; +} diff --git a/dumps/scripts/88.cs2 b/dumps/scripts/88.cs2 new file mode 100644 index 000000000..1c7eadeff --- /dev/null +++ b/dumps/scripts/88.cs2 @@ -0,0 +1,30 @@ +void script_88(int arg0,int arg1,string arg2) { + arg2 = strRemoveEntities(arg2); + switch (arg0) { + case 7: + if (((boolean)script_2709())) { + messageType0("You cannot add a friend until you have entered your date of birth"); + return; + } + if (isFriend(arg2)) { + if (isMuteRelatedMethod3329() && cs2method6900()) { + globalint_1650 = 1; + globalstring_23 = arg2; + script_1558(0); + return; + } + } else { + cs2method3605(arg2); + } + break; + case 8: + cs2method3607(arg2); + break; + case 9: + script_1052(5, cs2method5012(arg1), arg2); + break; + case 10: + globalstring_24 = arg2; + } + return; +} diff --git a/dumps/scripts/880.cs2 b/dumps/scripts/880.cs2 new file mode 100644 index 000000000..4b4737ac1 --- /dev/null +++ b/dumps/scripts/880.cs2 @@ -0,0 +1,6 @@ +void script_880(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(707,3)); + return; +} diff --git a/dumps/scripts/881.cs2 b/dumps/scripts/881.cs2 new file mode 100644 index 000000000..5bc48f835 --- /dev/null +++ b/dumps/scripts/881.cs2 @@ -0,0 +1,6 @@ +void script_881(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(699,4)); + return; +} diff --git a/dumps/scripts/882.cs2 b/dumps/scripts/882.cs2 new file mode 100644 index 000000000..806412f9d --- /dev/null +++ b/dumps/scripts/882.cs2 @@ -0,0 +1,6 @@ +void script_882(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(699,3)); + return; +} diff --git a/dumps/scripts/883.cs2 b/dumps/scripts/883.cs2 new file mode 100644 index 000000000..eba84f5c5 --- /dev/null +++ b/dumps/scripts/883.cs2 @@ -0,0 +1,6 @@ +void script_883(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(708,13)); + return; +} diff --git a/dumps/scripts/884.cs2 b/dumps/scripts/884.cs2 new file mode 100644 index 000000000..bb85cf11a --- /dev/null +++ b/dumps/scripts/884.cs2 @@ -0,0 +1,6 @@ +void script_884(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(708,12)); + return; +} diff --git a/dumps/scripts/885.cs2 b/dumps/scripts/885.cs2 new file mode 100644 index 000000000..4d6051884 --- /dev/null +++ b/dumps/scripts/885.cs2 @@ -0,0 +1,7 @@ +void script_885(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(704,11)); + setWidgetIsHidden(true, new WidgetPointer(704,12)); + return; +} diff --git a/dumps/scripts/886.cs2 b/dumps/scripts/886.cs2 new file mode 100644 index 000000000..b44f29c24 --- /dev/null +++ b/dumps/scripts/886.cs2 @@ -0,0 +1,7 @@ +void script_886(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(704,10)); + setWidgetIsHidden(true, new WidgetPointer(704,12)); + return; +} diff --git a/dumps/scripts/887.cs2 b/dumps/scripts/887.cs2 new file mode 100644 index 000000000..32ee4884b --- /dev/null +++ b/dumps/scripts/887.cs2 @@ -0,0 +1,7 @@ +void script_887(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(704,10)); + setWidgetIsHidden(true, new WidgetPointer(704,11)); + return; +} diff --git a/dumps/scripts/888.cs2 b/dumps/scripts/888.cs2 new file mode 100644 index 000000000..fa353e80a --- /dev/null +++ b/dumps/scripts/888.cs2 @@ -0,0 +1,7 @@ +void script_888(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(705,11)); + setWidgetIsHidden(true, new WidgetPointer(705,12)); + return; +} diff --git a/dumps/scripts/889.cs2 b/dumps/scripts/889.cs2 new file mode 100644 index 000000000..fcc9ca7a2 --- /dev/null +++ b/dumps/scripts/889.cs2 @@ -0,0 +1,7 @@ +void script_889(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(705,10)); + setWidgetIsHidden(true, new WidgetPointer(705,12)); + return; +} diff --git a/dumps/scripts/89.cs2 b/dumps/scripts/89.cs2 new file mode 100644 index 000000000..a6136c198 --- /dev/null +++ b/dumps/scripts/89.cs2 @@ -0,0 +1,165 @@ +void script_89() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + flow_0: + if (cs2method5428(49414144, -1)) { + setScriptCallOnGameloop(1562, "", new WidgetPointer(754,0)); + return; + } + ivar0 = 0; + ivar1 = -1; + ivar2 = 0; + ivar3 = 0; + if (getSystemUpdateTimer() > 0) { + ivar2 = mod(divide(getSystemUpdateTimer(), 50), 60); + ivar3 = divide(getSystemUpdateTimer(), 3000); + if (ivar2 < 10) { + setWidgetText(new WidgetPointer(754,5), "" + "System update in: " + intToStr(ivar3) + ":0" + intToStr(ivar2)); + } else { + setWidgetText(new WidgetPointer(754,5), "" + "System update in: " + intToStr(ivar3) + ":" + intToStr(ivar2)); + } + ivar0 = 1; + setWidgetNoOptions(new WidgetPointer(754,5)); + setScriptCallOnClickContextMenu(-1, "", new WidgetPointer(754,5)); + setWidgetUnknownBoolean(true, new WidgetPointer(754,5)); + } + ivar4 = 0; + ivar5 = 0; + ivar6 = cs2method_3408(105, 105, 3056, standart_config_287); + ivar7 = cs2method_3408(105, 49, 3057, standart_config_287); + IF (standart_config_287 > 0) + GOTO flow_8 + GOTO flow_43 + flow_8: + IF (getDisplayMode() < 2) + GOTO flow_9 + IF ((globalint_41 != -1) && (ivar4 < 100)) + GOTO flow_10 + GOTO flow_43 + flow_9: + flow_10: + IF (ivar0 < 5) + GOTO flow_11 + GOTO flow_43 + flow_11: + if (((boolean)script_91(ivar4))) { + ivar1 = ((int)cs2method_3408(105, 73, 580, ivar0)); + setWidgetRGB(new Color(ivar6), new WidgetPointer(ivar1)); + setWidgetUnknownBoolean(((boolean)ivar7), new WidgetPointer(ivar1)); + ivar5 = cs2method5004(ivar4); + switch (ivar5) { + case 18: + case 3: + case 7: + setWidgetText(new WidgetPointer(ivar1), "From " + cs2method5010(ivar4) + ": " + cs2method5003(ivar4)); + break; + case 5: + setWidgetText(new WidgetPointer(ivar1), cs2method5003(ivar4)); + break; + case 19: + case 6: + setWidgetText(new WidgetPointer(ivar1), "To " + cs2method5010(ivar4) + ": " + cs2method5003(ivar4)); + } + setWidgetNoOptions(new WidgetPointer(ivar1)); + setScriptCallOnClickContextMenu(88, -2147483644, cs2method5019(ivar4), ivar4, "isi", new WidgetPointer(ivar1)); + switch (ivar5) { + flow_17: + case 3: + case 6: + case 7: + cs2method2305(new WidgetPointer(ivar1), "" + strRemoveEntities(cs2method5010(ivar4))); + if (stringMethod4107(strRemoveEntities(cs2method5015()), strRemoveEntities(cs2method5010(ivar4))) != 0) { + if (isFriend(cs2method5019(ivar4))) { + if (isMuteRelatedMethod3329() && cs2method6900()) { + setWidgetContextMenuOption(7, new WidgetPointer(ivar1), "Message"); + } + } else { + setWidgetContextMenuOption(7, new WidgetPointer(ivar1), "Add friend"); + setWidgetContextMenuOption(8, new WidgetPointer(ivar1), "Add ignore"); + } + if ((getClientRights() > 0) || (((int)hasMoreThen5Blackmarks()) > 0)) { + setWidgetContextMenuOption(10, new WidgetPointer(ivar1), "Report abuse"); + } + } + break; + case 19: + case 18: + cs2method2305(new WidgetPointer(ivar1), "" + strRemoveEntities(cs2method5010(ivar4))); + IF (stringMethod4107(strRemoveEntities(cs2method5015()), strRemoveEntities(cs2method5010(ivar4))) != 0) + GOTO flow_28 + break; + flow_28: + if (isFriend(cs2method5019(ivar4))) { + if (isMuteRelatedMethod3329() && cs2method6900()) { + setWidgetContextMenuOption(7, new WidgetPointer(ivar1), "Message"); + } + } else { + setWidgetContextMenuOption(7, new WidgetPointer(ivar1), "Add friend"); + setWidgetContextMenuOption(8, new WidgetPointer(ivar1), "Add ignore"); + } + if ((ivar5 == 18) && (cs2method5056(cs2method5012(ivar4)) > 0)) { + if (globalint_132 == -1) { + globalint_132 = cs2method5012(ivar4); + globalstring_29 = cs2method5010(ivar4); + globalint_133 = 5; + if (isFriend(cs2method5019(ivar4))) { + setWidgetContextMenuOption(9, new WidgetPointer(ivar1), "Quick Response"); + } + } else { + setWidgetContextMenuOption(9, new WidgetPointer(ivar1), "Quick Response"); + } + } + } + ivar0 = add(ivar0, 1); + } + ivar4 = add(ivar4, 1); + GOTO flow_9 + flow_43: + IF (ivar0 < 5) + GOTO flow_44 + GOTO flow_45 + flow_44: + ivar1 = ((int)cs2method_3408(105, 73, 580, ivar0)); + setWidgetText(new WidgetPointer(ivar1), ""); + setWidgetNoOptions(new WidgetPointer(ivar1)); + ivar0 = add(ivar0, 1); + GOTO flow_43 + flow_45: + ivar8 = 0; + ivar9 = 0; + if (getDisplayMode() >= 2) { + ivar9 = 9; + } else { + ivar9 = 5; + } + ivar8 = subtract(512, ivar9); + ivar0 = 0; + while (ivar0 < 5) { + ivar1 = ((int)cs2method_3408(105, 73, 580, ivar0)); + setWidgetSize(max(min(getMaxLineWidth(ivar8, getWidgetFont(new WidgetPointer(ivar1)), getWidgetText(new WidgetPointer(ivar1))), ivar8), 1), multiply(max(getLineCount(ivar8, getWidgetFont(new WidgetPointer(ivar1)), getWidgetText(new WidgetPointer(ivar1))), 1), 14), 0, 0, new WidgetPointer(ivar1)); + ivar0 = add(ivar0, 1); + } + ivar10 = -1; + ivar0 = 0; + ivar1 = ((int)cs2method_3408(105, 73, 580, ivar0)); + setWidgetPosition(ivar9, 2, 0, 2, new WidgetPointer(ivar1)); + ivar0 = 1; + while (ivar0 < 5) { + ivar1 = ((int)cs2method_3408(105, 73, 580, ivar0)); + ivar10 = ((int)cs2method_3408(105, 73, 580, subtract(ivar0, 1))); + if ((ivar1 != -1) && (ivar10 != -1)) { + setWidgetPosition(ivar9, subtract(getWidgetActualY(new WidgetPointer(ivar10)), getWidgetActualHeight(new WidgetPointer(ivar1))), 0, 0, new WidgetPointer(ivar1)); + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/890.cs2 b/dumps/scripts/890.cs2 new file mode 100644 index 000000000..f230f0d22 --- /dev/null +++ b/dumps/scripts/890.cs2 @@ -0,0 +1,7 @@ +void script_890(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(705,10)); + setWidgetIsHidden(true, new WidgetPointer(705,11)); + return; +} diff --git a/dumps/scripts/891.cs2 b/dumps/scripts/891.cs2 new file mode 100644 index 000000000..74faceda7 --- /dev/null +++ b/dumps/scripts/891.cs2 @@ -0,0 +1,6 @@ +void script_891(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(710,10)); + return; +} diff --git a/dumps/scripts/892.cs2 b/dumps/scripts/892.cs2 new file mode 100644 index 000000000..73dfbb037 --- /dev/null +++ b/dumps/scripts/892.cs2 @@ -0,0 +1,6 @@ +void script_892(int arg0) { + setWidgetModel(32408, new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(710,9)); + return; +} diff --git a/dumps/scripts/893.cs2 b/dumps/scripts/893.cs2 new file mode 100644 index 000000000..f94a0ff7c --- /dev/null +++ b/dumps/scripts/893.cs2 @@ -0,0 +1,47 @@ +void script_893() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + if (globalint_112 < 10) { + globalint_112 = add(globalint_112, 1); + return; + } + globalint_112 = 0; + ivar0 = subtract(20, 0); + ivar1 = subtract(80, 0); + ivar2 = divide(ivar1, ivar0); + ivar3 = multiply(bitconfig_4523, ivar2); + if (globalint_111 < ivar3) { + globalint_111 = add(globalint_111, 1); + } else { + if (globalint_111 > ivar3) { + globalint_111 = subtract(globalint_111, 1); + } + } + if (((boolean)globalint_114)) { + if (globalint_113 > 0) { + globalint_113 = subtract(globalint_113, 1); + } else { + globalint_114 = 1; + } + } else if (globalint_113 < 4) { + globalint_113 = add(globalint_113, 1); + } else { + globalint_114 = 0; + } + ivar4 = add(globalint_111, add(globalint_113, 2)); + ivar5 = divide(1024, ivar1); + ivar4 = multiply(ivar4, ivar5); + ivar4 = add(ivar4, 512); + ivar4 = subtract(2048, ivar4); + setWidget3DRotation(0, 0, 0, 0, ivar4, 388, new WidgetPointer(717,4)); + ivar6 = multiply(cs2method_3408(105, 105, 1422, bitconfig_4519), divide(1024, ivar0)); + ivar6 = add(ivar6, 512); + ivar6 = subtract(2048, ivar6); + setWidget3DRotation(0, 0, 0, 0, ivar6, 365, new WidgetPointer(717,3)); + return; +} diff --git a/dumps/scripts/894.cs2 b/dumps/scripts/894.cs2 new file mode 100644 index 000000000..c5c824194 --- /dev/null +++ b/dumps/scripts/894.cs2 @@ -0,0 +1,4 @@ +void script_894() { + script_896(); + return; +} diff --git a/dumps/scripts/895.cs2 b/dumps/scripts/895.cs2 new file mode 100644 index 000000000..a9d81ec9f --- /dev/null +++ b/dumps/scripts/895.cs2 @@ -0,0 +1,4 @@ +void script_895() { + script_896(); + return; +} diff --git a/dumps/scripts/896.cs2 b/dumps/scripts/896.cs2 new file mode 100644 index 000000000..aac9f5af9 --- /dev/null +++ b/dumps/scripts/896.cs2 @@ -0,0 +1,13 @@ +void script_896() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = divide(116, 12); + ivar1 = multiply(ivar0, bitconfig_4527); + ivar2 = multiply(ivar0, bitconfig_4526); + setWidgetPosition(getWidgetActualX(new WidgetPointer(717,8)), add(122, subtract(116, ivar1)), 0, 0, new WidgetPointer(717,8)); + setWidgetPosition(getWidgetActualX(new WidgetPointer(717,7)), add(122, subtract(116, ivar2)), 0, 0, new WidgetPointer(717,7)); + setWidgetSize(27, ivar1, 0, 0, new WidgetPointer(717,8)); + setWidgetSize(27, ivar2, 0, 0, new WidgetPointer(717,7)); + return; +} diff --git a/dumps/scripts/897.cs2 b/dumps/scripts/897.cs2 new file mode 100644 index 000000000..dc51a9204 --- /dev/null +++ b/dumps/scripts/897.cs2 @@ -0,0 +1,4 @@ +void script_897() { + setWidgetIsHidden(false, new WidgetPointer(717,33)); + return; +} diff --git a/dumps/scripts/898.cs2 b/dumps/scripts/898.cs2 new file mode 100644 index 000000000..65cdda75b --- /dev/null +++ b/dumps/scripts/898.cs2 @@ -0,0 +1,4 @@ +void script_898() { + setWidgetIsHidden(true, new WidgetPointer(717,33)); + return; +} diff --git a/dumps/scripts/899.cs2 b/dumps/scripts/899.cs2 new file mode 100644 index 000000000..c56e2d638 --- /dev/null +++ b/dumps/scripts/899.cs2 @@ -0,0 +1,4 @@ +void script_899() { + setWidgetIsHidden(false, new WidgetPointer(717,35)); + return; +} diff --git a/dumps/scripts/9.cs2 b/dumps/scripts/9.cs2 new file mode 100644 index 000000000..0e88587ff --- /dev/null +++ b/dumps/scripts/9.cs2 @@ -0,0 +1,18 @@ +void script_9(int arg0,int arg1,int arg2) { + if (((boolean)globalint_169)) { + setWidgetIsHidden(false, new WidgetPointer(arg0)); + setWidgetIsHidden(false, new WidgetPointer(arg1)); + setWidgetIsHidden(false, new WidgetPointer(arg2)); + script_680(arg0); + setScriptCallOnMouseEntered(95, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(93, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } else { + deleteAllExtraChilds(new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg0)); + setWidgetIsHidden(true, new WidgetPointer(arg1)); + setWidgetIsHidden(true, new WidgetPointer(arg2)); + setScriptCallOnMouseEntered(-1, "", new WidgetPointer(arg0)); + setScriptCallOnMouseExit(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/90.cs2 b/dumps/scripts/90.cs2 new file mode 100644 index 000000000..18da33ca8 --- /dev/null +++ b/dumps/scripts/90.cs2 @@ -0,0 +1,129 @@ +int script_90(int arg0,int arg1) { + switch (cs2method5004(arg0)) { + case -1: + return 0; + case 0: + case 1: + case 4: + case 27: + case 26: + case 29: + case 28: + case 31: + case 30: + case 110: + case 117: + case 116: + case 115: + return 1; + case 109: + if (((boolean)bitconfig_6161)) { + return 0; + } + return 1; + case 2: + case 17: + if (((boolean)cs2method5000())) { + return 1; + } + if (((boolean)cs2method5000()) && isFriend(cs2method5019(arg0))) { + return 1; + } + return 0; + case 3: + case 18: + if (((standart_config_287 > 0) && (globalint_41 >= 0)) && (((boolean)arg1) && ((boolean)script_506(arg0)))) { + return 0; + } + if (((boolean)cs2method5005())) { + return 1; + } + if (((boolean)cs2method5005()) && isFriend(cs2method5019(arg0))) { + return 1; + } + return 0; + case 100: + case 101: + case 111: + case 108: + case 106: + case 105: + case 118: + case 114: + case 113: + case 112: + if (((boolean)cs2method5016())) { + return 1; + } + if (((boolean)cs2method5016()) && isFriend(cs2method5019(arg0))) { + return 1; + } + return 0; + case 5: + case 6: + case 19: + if (((standart_config_287 > 0) && (globalint_41 >= 0)) && (((boolean)arg1) && ((boolean)script_506(arg0)))) { + return 0; + } + if (cs2method5005() < 2) { + return 1; + } + return 0; + case 7: + if (((standart_config_287 > 0) && (globalint_41 >= 0)) && (((boolean)arg1) && ((boolean)script_506(arg0)))) { + return 0; + } + return 1; + case 42: + case 41: + case 107: + case 44: + case 45: + if (((boolean)standart_config_1054)) { + return 1; + } + if (((boolean)standart_config_1054) && isFriend(cs2method5019(arg0))) { + return 1; + } + return 0; + case 9: + case 20: + if (((boolean)standart_config_2159)) { + return 1; + } + if (((boolean)standart_config_2159) && isFriend(cs2method5019(arg0))) { + return 1; + } + return 0; + case 102: + if (((boolean)standart_config_1055)) { + return 1; + } + if (((boolean)standart_config_1055) && isFriend(cs2method5019(arg0))) { + return 1; + } + return 0; + case 11: + if (standart_config_2159 < 2) { + return 1; + } + return 0; + case 43: + case 46: + if (standart_config_1054 < 2) { + return 1; + } + return 0; + case 103: + if (cs2method5016() < 2) { + return 1; + } + return 0; + case 104: + if (standart_config_1055 < 2) { + return 1; + } + return 0; + } + return 1; +} diff --git a/dumps/scripts/900.cs2 b/dumps/scripts/900.cs2 new file mode 100644 index 000000000..0d596f0dd --- /dev/null +++ b/dumps/scripts/900.cs2 @@ -0,0 +1,4 @@ +void script_900() { + setWidgetIsHidden(true, new WidgetPointer(717,35)); + return; +} diff --git a/dumps/scripts/901.cs2 b/dumps/scripts/901.cs2 new file mode 100644 index 000000000..c36dcd146 --- /dev/null +++ b/dumps/scripts/901.cs2 @@ -0,0 +1,5 @@ +void script_901() { + setWidget3DRotation(0, 0, 0, 0, 1024, 400, new WidgetPointer(717,14)); + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(717,14)), 2), subtract(getWidgetActualY(new WidgetPointer(717,14)), 2), 0, 0, new WidgetPointer(717,14)); + return; +} diff --git a/dumps/scripts/902.cs2 b/dumps/scripts/902.cs2 new file mode 100644 index 000000000..e4d336bdb --- /dev/null +++ b/dumps/scripts/902.cs2 @@ -0,0 +1,5 @@ +void script_902() { + setWidget3DRotation(0, 0, 0, 0, 0, 400, new WidgetPointer(717,14)); + setWidgetPosition(add(getWidgetActualX(new WidgetPointer(717,14)), 2), add(getWidgetActualY(new WidgetPointer(717,14)), 2), 0, 0, new WidgetPointer(717,14)); + return; +} diff --git a/dumps/scripts/903.cs2 b/dumps/scripts/903.cs2 new file mode 100644 index 000000000..317ff5f81 --- /dev/null +++ b/dumps/scripts/903.cs2 @@ -0,0 +1,5 @@ +void script_903() { + setWidget3DRotation(0, 0, 0, 0, 1024, 400, new WidgetPointer(717,13)); + setWidgetPosition(subtract(getWidgetActualX(new WidgetPointer(717,13)), 2), subtract(getWidgetActualY(new WidgetPointer(717,13)), 2), 0, 0, new WidgetPointer(717,13)); + return; +} diff --git a/dumps/scripts/904.cs2 b/dumps/scripts/904.cs2 new file mode 100644 index 000000000..ef7e8f0b2 --- /dev/null +++ b/dumps/scripts/904.cs2 @@ -0,0 +1,5 @@ +void script_904() { + setWidget3DRotation(0, 0, 0, 0, 0, 400, new WidgetPointer(717,13)); + setWidgetPosition(add(getWidgetActualX(new WidgetPointer(717,13)), 2), add(getWidgetActualY(new WidgetPointer(717,13)), 2), 0, 0, new WidgetPointer(717,13)); + return; +} diff --git a/dumps/scripts/905.cs2 b/dumps/scripts/905.cs2 new file mode 100644 index 000000000..3b934f71d --- /dev/null +++ b/dumps/scripts/905.cs2 @@ -0,0 +1,4 @@ +void script_905() { + globalint_116 = 0; + return; +} diff --git a/dumps/scripts/906.cs2 b/dumps/scripts/906.cs2 new file mode 100644 index 000000000..39602a321 --- /dev/null +++ b/dumps/scripts/906.cs2 @@ -0,0 +1,4 @@ +void script_906() { + globalint_116 = 1; + return; +} diff --git a/dumps/scripts/907.cs2 b/dumps/scripts/907.cs2 new file mode 100644 index 000000000..c93bd2cea --- /dev/null +++ b/dumps/scripts/907.cs2 @@ -0,0 +1,4 @@ +void script_907() { + globalint_116 = 0; + return; +} diff --git a/dumps/scripts/908.cs2 b/dumps/scripts/908.cs2 new file mode 100644 index 000000000..786f5a0fa --- /dev/null +++ b/dumps/scripts/908.cs2 @@ -0,0 +1,4 @@ +void script_908() { + globalint_117 = 1; + return; +} diff --git a/dumps/scripts/909.cs2 b/dumps/scripts/909.cs2 new file mode 100644 index 000000000..ea6afe2e0 --- /dev/null +++ b/dumps/scripts/909.cs2 @@ -0,0 +1,4 @@ +void script_909() { + globalint_117 = 0; + return; +} diff --git a/dumps/scripts/91.cs2 b/dumps/scripts/91.cs2 new file mode 100644 index 000000000..1cb10e86b --- /dev/null +++ b/dumps/scripts/91.cs2 @@ -0,0 +1,23 @@ +int script_91(int arg0) { + switch (cs2method5004(arg0)) { + case 7: + return 1; + case 18: + case 3: + if (((boolean)cs2method5005())) { + return 1; + } + if (((boolean)cs2method5005()) && isFriend(cs2method5019(arg0))) { + return 1; + } + return 0; + case 19: + case 5: + case 6: + if (cs2method5005() < 2) { + return 1; + } + return 0; + } + return 0; +} diff --git a/dumps/scripts/910.cs2 b/dumps/scripts/910.cs2 new file mode 100644 index 000000000..215b7b4f4 --- /dev/null +++ b/dumps/scripts/910.cs2 @@ -0,0 +1,8 @@ +void script_910() { + if (((boolean)globalint_116) || ((boolean)globalint_117)) { + setWidgetBorderThickness(2, new WidgetPointer(716,31)); + } else { + setWidgetBorderThickness(0, new WidgetPointer(716,31)); + } + return; +} diff --git a/dumps/scripts/911.cs2 b/dumps/scripts/911.cs2 new file mode 100644 index 000000000..cf55f2710 --- /dev/null +++ b/dumps/scripts/911.cs2 @@ -0,0 +1,12 @@ +void script_911() { + if (((boolean)bitconfig_4532) && (globalint_118 < 253)) { + globalint_118 = add(globalint_118, 3); + cs2method2103(subtract(255, globalint_118), new WidgetPointer(721,3)); + } else { + if (((boolean)bitconfig_4532) && (globalint_118 > 3)) { + globalint_118 = subtract(globalint_118, 3); + cs2method2103(subtract(255, globalint_118), new WidgetPointer(721,3)); + } + } + return; +} diff --git a/dumps/scripts/912.cs2 b/dumps/scripts/912.cs2 new file mode 100644 index 000000000..9f379caa6 --- /dev/null +++ b/dumps/scripts/912.cs2 @@ -0,0 +1,24 @@ +string script_912(int arg0) { + string svar0; + svar0 = cs2method_3408(111, 115, 1440, arg0); + if (stringMethod4107(svar0, "") != 0) { + return "
" + svar0; + } + switch (globalint_746) { + case 0: + if (getItemHashmapData(arg0, 1047) != 1) { + return "
" + cs2method_3408(105, 115, 1437, getItemHashmapData(arg0, 23)); + } + break; + case 1: + return "
" + cs2method_3408(105, 115, 1439, getItemHashmapData(arg0, 23)); + case 2: + case 5: + return "
" + cs2method_3408(105, 115, 1436, getItemHashmapData(arg0, 23)); + case 3: + return "
" + cs2method_3408(105, 115, 1438, getItemHashmapData(arg0, 23)); + case 4: + return "
" + "Requires an ogre composite bow."; + } + return ""; +} diff --git a/dumps/scripts/913.cs2 b/dumps/scripts/913.cs2 new file mode 100644 index 000000000..1be86a5ad --- /dev/null +++ b/dumps/scripts/913.cs2 @@ -0,0 +1,6 @@ +string script_913(int arg0,int arg1,string arg2) { + if (arg0 < arg1) { + return "
" + "" + arg2; + } + return "
" + "" + arg2; +} diff --git a/dumps/scripts/914.cs2 b/dumps/scripts/914.cs2 new file mode 100644 index 000000000..89b33921a --- /dev/null +++ b/dumps/scripts/914.cs2 @@ -0,0 +1,3 @@ +string script_914() { + return script_2706(globalint_741); +} diff --git a/dumps/scripts/915.cs2 b/dumps/scripts/915.cs2 new file mode 100644 index 000000000..9822110f3 --- /dev/null +++ b/dumps/scripts/915.cs2 @@ -0,0 +1,25 @@ +void script_915(int arg0) { + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + deleteAllExtraChilds(new WidgetPointer(arg0)); + ivar1 = getWidgetActualWidth(new WidgetPointer(arg0)); + ivar2 = getWidgetActualHeight(new WidgetPointer(arg0)); + ivar3 = subtract(ivar1, 9); + ivar4 = subtract(ivar2, 9); + ivar5 = subtract(ivar1, 18); + ivar6 = subtract(ivar2, 18); + script_98(arg0, 0, 1040, 0, 0, ivar1, ivar2); + script_98(arg0, 1, 929, 0, 0, 9, 9); + script_98(arg0, 2, 930, ivar3, 0, 9, 9); + script_98(arg0, 3, 931, 0, ivar4, 9, 9); + script_98(arg0, 4, 932, ivar3, ivar4, 9, 9); + script_98(arg0, 5, 933, 0, 9, 9, ivar6); + script_98(arg0, 6, 934, 9, 0, ivar5, 9); + script_98(arg0, 7, 935, ivar3, 9, 9, ivar6); + script_98(arg0, 8, 936, 9, ivar4, ivar5, 9); + return; +} diff --git a/dumps/scripts/916.cs2 b/dumps/scripts/916.cs2 new file mode 100644 index 000000000..0d97ad9a5 --- /dev/null +++ b/dumps/scripts/916.cs2 @@ -0,0 +1,4 @@ +void script_916() { + script_917(); + return; +} diff --git a/dumps/scripts/917.cs2 b/dumps/scripts/917.cs2 new file mode 100644 index 000000000..cd6d6f46b --- /dev/null +++ b/dumps/scripts/917.cs2 @@ -0,0 +1,49 @@ +void script_917() { + int ivar0; + int ivar1; + int ivar2; + deleteAllExtraChilds(new WidgetPointer(449,8)); + globalint_742 = 0; + ivar0 = 0; + setWidgetRGB(new Color(globalint_1241), new WidgetPointer(449,2)); + setWidgetRGB(new Color(globalint_1241), new WidgetPointer(449,14)); + setWidgetRGB(new Color(globalint_1241), new WidgetPointer(449,22)); + setWidgetRGB(new Color(globalint_1241), new WidgetPointer(449,24)); + if (globalint_743 != -1) { + ivar0 = getItemAmtInContainer(93, globalint_743); + script_919(); + setWidgetIsHidden(false, new WidgetPointer(449,15)); + setWidgetSize(16384, 147, 2, 0, new WidgetPointer(449,6)); + } else if ((standart_config_1109 != -1) && (multiply(standart_config_1111, standart_config_1110) > ivar0)) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(449,25)); + } else { + setWidgetRGB(new Color(globalint_1241), new WidgetPointer(449,25)); + } + ivar0 = getItemAmtInContainer(93, 995); + setItemOnWidgetMethod2205(-1, -1, new WidgetPointer(449,23)); + setWidgetIsHidden(true, new WidgetPointer(449,15)); + setWidgetSize(16384, 187, 2, 0, new WidgetPointer(449,6)); + if (((boolean)ivar0)) { + setWidgetText(new WidgetPointer(449,25), "You have no " + cs2method_3408(111, 115, 62, globalint_743) + "."); + } else if (((boolean)ivar0)) { + setWidgetText(new WidgetPointer(449,25), "You have one " + cs2method_3408(111, 115, 923, globalint_743) + "."); + } else { + setWidgetText(new WidgetPointer(449,25), "You have " + script_940(ivar0) + " " + cs2method_3408(111, 115, 62, globalint_743) + "."); + } + ivar1 = 181; + ivar2 = script_920(ivar1); + if (ivar2 > getWidgetActualHeight(new WidgetPointer(449,8))) { + ivar1 = 165; + deleteAllExtraChilds(new WidgetPointer(449,8)); + ivar2 = script_920(ivar1); + } else { + deleteAllExtraChilds(new WidgetPointer(449,9)); + } + setWidgetScrollMax(ivar1, ivar2, new WidgetPointer(449,8)); + setWidgetSize(ivar1, 6, 0, 1, new WidgetPointer(449,8)); + cs2method2100(0, 0, new WidgetPointer(449,8)); + if (ivar2 > getWidgetActualHeight(new WidgetPointer(449,8))) { + script_31(29425673, 29425672, 792, 789, 790, 791, 773, 788); + } + return; +} diff --git a/dumps/scripts/918.cs2 b/dumps/scripts/918.cs2 new file mode 100644 index 000000000..12616cacb --- /dev/null +++ b/dumps/scripts/918.cs2 @@ -0,0 +1,4 @@ +void script_918() { + script_919(); + return; +} diff --git a/dumps/scripts/919.cs2 b/dumps/scripts/919.cs2 new file mode 100644 index 000000000..4fa89d74f --- /dev/null +++ b/dumps/scripts/919.cs2 @@ -0,0 +1,40 @@ +void script_919() { + int ivar0; + int ivar1; + string svar0; + ivar0 = getItemAmtInContainer(93, globalint_743); + svar0 = "Cost:"; + ivar1 = -1; + if (((boolean)globalint_744)) { + svar0 = "None available"; + } else if (globalint_744 == -1) { + svar0 = "Free sample!"; + } else { + ivar1 = globalint_744; + } + setWidgetText(new WidgetPointer(449,24), svar0); + if (ivar1 > ivar0) { + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(449,25)); + } else { + setWidgetRGB(new Color(globalint_1241), new WidgetPointer(449,25)); + } + if (ivar1 > -1) { + setItemOnWidgetMethod2212(globalint_743, ivar1, new WidgetPointer(449,23)); + } else { + setItemOnWidgetMethod2205(-1, -1, new WidgetPointer(449,23)); + } + if (globalint_744 == -1) { + setWidgetText(new WidgetPointer(449,22), "Take"); + setWidgetContextMenuOption(1, new WidgetPointer(449,21), "Take 1"); + setWidgetContextMenuOption(2, new WidgetPointer(449,21), "Take 5"); + setWidgetContextMenuOption(3, new WidgetPointer(449,21), "Take 10"); + setWidgetContextMenuOption(4, new WidgetPointer(449,21), "Take 50"); + } else { + setWidgetText(new WidgetPointer(449,22), "Buy"); + setWidgetContextMenuOption(1, new WidgetPointer(449,21), "Buy 1"); + setWidgetContextMenuOption(2, new WidgetPointer(449,21), "Buy 5"); + setWidgetContextMenuOption(3, new WidgetPointer(449,21), "Buy 10"); + setWidgetContextMenuOption(4, new WidgetPointer(449,21), "Buy 50"); + } + return; +} diff --git a/dumps/scripts/92.cs2 b/dumps/scripts/92.cs2 new file mode 100644 index 000000000..053cff20c --- /dev/null +++ b/dumps/scripts/92.cs2 @@ -0,0 +1,4 @@ +void script_92(int arg0) { + script_679(arg0); + return; +} diff --git a/dumps/scripts/920.cs2 b/dumps/scripts/920.cs2 new file mode 100644 index 000000000..bfa9cc48c --- /dev/null +++ b/dumps/scripts/920.cs2 @@ -0,0 +1,53 @@ +int script_920(int arg0) { + int ivar1; + string svar0; + globalint_742 = 0; + svar0 = ""; + ivar1 = 0; + if (globalint_741 != -1) { + if (((boolean)stringMethod4107(getItemOption(globalint_741, 2), "Wear")) || ((boolean)stringMethod4107(getItemOption(globalint_741, 2), "Wield"))) { + ivar1 = 1; + } + setItemOnWidgetMethod2205(globalint_741, -1, new WidgetPointer(449,13)); + setItemOnWidgetMethod2205(globalint_741, -1, new WidgetPointer(449,14)); + if (isMember() && isMembersItem(globalint_741)) { + script_922(1, arg0, "This is a members item. Additional information is not available on this world."); + } else { + svar0 = script_914(); + if (stringMethod4107(svar0, "") != 0) { + script_922(1, arg0, svar0); + globalint_742 = add(globalint_742, 1); + } + script_921(1, arg0, globalstring_25); + if (stringMethod4107(getItemHashmapData(globalint_741, 690), "") != 0) { + script_921(1, arg0, " "); + script_921(1, arg0, getItemHashmapData(globalint_741, 690)); + } + if (((boolean)mod(getItemHashmapData(globalint_741, 740), 2))) { + if ((stringMethod4107(globalstring_26, "") != 0) && ((boolean)ivar1)) { + script_921(0, arg0, globalstring_26); + } + if (stringMethod4107(globalstring_34, "") != 0) { + script_921(0, arg0, globalstring_34); + } + } else { + if (stringMethod4107(globalstring_34, "") != 0) { + script_921(0, arg0, globalstring_34); + } + if ((stringMethod4107(globalstring_26, "") != 0) && ((boolean)ivar1)) { + script_921(0, arg0, globalstring_26); + } + } + svar0 = script_912(globalint_741); + if (stringMethod4107(svar0, "") != 0) { + script_921(0, arg0, svar0); + } + if ((stringMethod4107(globalstring_35, "") != 0) && ((boolean)ivar1)) { + script_923(arg0, globalstring_35, globalstring_36, globalstring_52); + } + } + } else { + script_921(1, arg0, "Select an item to see its information."); + } + return add(multiply(6, 2), multiply(globalint_742, 11)); +} diff --git a/dumps/scripts/921.cs2 b/dumps/scripts/921.cs2 new file mode 100644 index 000000000..8f2201e20 --- /dev/null +++ b/dumps/scripts/921.cs2 @@ -0,0 +1,6 @@ +void script_921(int arg0,int arg1,string arg2) { + int ivar2; + ivar2 = getLineCount(arg1, 494, arg2); + script_924(ivar2, arg0, 1, 494, arg2); + return; +} diff --git a/dumps/scripts/922.cs2 b/dumps/scripts/922.cs2 new file mode 100644 index 000000000..e34d87e22 --- /dev/null +++ b/dumps/scripts/922.cs2 @@ -0,0 +1,62 @@ +void script_922(int arg0,int arg1,string arg2) { + int ivar2; + int ivar3; + ivar2 = getLineCount(135, 494, arg2); + ivar3 = add(6, multiply(globalint_742, 11)); + if (stringMethod4107(arg2, "") != 0) { + createExtraChild(new WidgetPointer(449,8), 4, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetPosition(0, add(ivar3, 3), 1, 0); + setWidgetSize(135, multiply(11, ivar2), 0, 0); + setWidgetFont(494); + setWidgetRGB(new Color(198, 2, 2)); + setWidgetText(arg2); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(arg0, 0, 0); + globalint_742 = add(globalint_742, ivar2); + } + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(3, add(ivar3, 3), 0, 0); + setWidgetSprite(2180); + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(12, 12, 0, 0); + setWidgetPosition(3, add(ivar3, 3), 2, 0); + setWidgetSprite(2180); + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(4, 4, 0, 0); + setWidgetPosition(0, ivar3, 0, 0); + setWidgetSprite(2225); + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(subtract(arg1, 8), 4, 0, 0); + setWidgetPosition(4, ivar3, 0, 0); + setWidgetSprite(2226); + cs2method1107(1); + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(4, 4, 0, 0); + setWidgetPosition(0, ivar3, 2, 0); + setWidgetSprite(2227); + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(4, subtract(multiply(11, ivar2), 2), 0, 0); + setWidgetPosition(-2, add(ivar3, 4), 2, 0); + setWidgetSprite(2228); + cs2method1107(1); + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(4, 4, 0, 0); + setWidgetPosition(0, add(multiply(11, ivar2), 8), 2, 0); + setWidgetSprite(2230); + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(subtract(arg1, 8), 4, 0, 0); + setWidgetPosition(4, add(multiply(11, ivar2), 10), 0, 0); + setWidgetSprite(2226); + cs2method1107(1); + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(4, 4, 0, 0); + setWidgetPosition(0, add(multiply(11, ivar2), 8), 0, 0); + setWidgetSprite(2229); + createExtraChild(new WidgetPointer(449,8), 5, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetSize(4, subtract(multiply(11, ivar2), 2), 0, 0); + setWidgetPosition(0, add(ivar3, 4), 0, 0); + setWidgetSprite(2228); + cs2method1107(1); + return; +} diff --git a/dumps/scripts/923.cs2 b/dumps/scripts/923.cs2 new file mode 100644 index 000000000..9029799b3 --- /dev/null +++ b/dumps/scripts/923.cs2 @@ -0,0 +1,17 @@ +void script_923(int arg0,string arg1,string arg2,string arg3) { + int ivar1; + int ivar2; + ivar1 = getLineCount(arg0, 494, arg1); + ivar2 = getLineCount(arg0, 494, arg2); + if (ivar2 > ivar1) { + ivar1 = ivar2; + } + ivar2 = getLineCount(arg0, 494, arg3); + if (ivar2 > ivar1) { + ivar1 = ivar2; + } + script_924(ivar1, 0, 0, 494, arg1); + script_924(ivar1, 1, 0, 494, arg2); + script_924(ivar1, 2, 1, 494, arg3); + return; +} diff --git a/dumps/scripts/924.cs2 b/dumps/scripts/924.cs2 new file mode 100644 index 000000000..0616a0862 --- /dev/null +++ b/dumps/scripts/924.cs2 @@ -0,0 +1,17 @@ +void script_924(int arg0,int arg1,int arg2,int arg3,string arg4) { + int ivar4; + ivar4 = add(6, multiply(globalint_742, 11)); + if (stringMethod4107(arg4, "") != 0) { + createExtraChild(new WidgetPointer(449,8), 4, getExtraChildGap(new WidgetPointer(449,8))); + setWidgetPosition(0, ivar4, 0, 0); + setWidgetSize(16384, multiply(11, arg0), 2, 0); + setWidgetFont(arg3); + setWidgetRGB(new Color(globalint_1242)); + setWidgetText(arg4); + setWidgetTextAlignment(arg1, 0, 0); + if (((boolean)arg2)) { + globalint_742 = add(globalint_742, arg0); + } + } + return; +} diff --git a/dumps/scripts/925.cs2 b/dumps/scripts/925.cs2 new file mode 100644 index 000000000..a13d960c8 --- /dev/null +++ b/dumps/scripts/925.cs2 @@ -0,0 +1,15 @@ +int script_925(int arg0) { + if (((boolean)script_929(arg0))) { + return 0; + } + if (((boolean)script_930(arg0))) { + return 0; + } + if (((boolean)script_933(arg0))) { + return 0; + } + if (script_1432() < getItemHashmapData(arg0, 761)) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/926.cs2 b/dumps/scripts/926.cs2 new file mode 100644 index 000000000..aa72a098b --- /dev/null +++ b/dumps/scripts/926.cs2 @@ -0,0 +1,12 @@ +int script_926(int arg0) { + if (((boolean)script_931(arg0))) { + return 0; + } + if (((boolean)script_932(arg0))) { + return 0; + } + if (((boolean)script_935(arg0))) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/927.cs2 b/dumps/scripts/927.cs2 new file mode 100644 index 000000000..5761e5887 --- /dev/null +++ b/dumps/scripts/927.cs2 @@ -0,0 +1,12 @@ +int script_927(int arg0) { + if (getItemHashmapData(arg0, 749) != -1) { + return 1; + } + if (getItemHashmapData(arg0, 743) > -1) { + return 1; + } + if (((boolean)getItemHashmapData(arg0, 741))) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/928.cs2 b/dumps/scripts/928.cs2 new file mode 100644 index 000000000..bee497c20 --- /dev/null +++ b/dumps/scripts/928.cs2 @@ -0,0 +1,12 @@ +int script_928(int arg0) { + if (getItemHashmapData(arg0, 770) != -1) { + return 1; + } + if (getItemHashmapData(arg0, 764) > -1) { + return 1; + } + if (getItemHashmapData(arg0, 762) > 0) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/929.cs2 b/dumps/scripts/929.cs2 new file mode 100644 index 000000000..68e72bfc1 --- /dev/null +++ b/dumps/scripts/929.cs2 @@ -0,0 +1,109 @@ +int script_929(int arg0) { + int ivar1; + int ivar2; + flow_0: + ivar1 = getItemHashmapData(arg0, 823); + ivar2 = getItemHashmapData(arg0, 749); + if (ivar2 == -1) { + return 1; + } + IF (isBitFlagged(ivar1, 0)) + GOTO flow_3 + GOTO flow_4 + flow_3: + IF (getSkillActualLvl(ivar2) < getItemHashmapData(arg0, 750)) + GOTO flow_6 + flow_4: + IF (isBitFlagged(ivar1, 0) && (getSkillCurrentLvl(ivar2) < getItemHashmapData(arg0, 750))) + GOTO flow_6 + GOTO flow_7 + flow_6: + return 0; + flow_7: + ivar2 = getItemHashmapData(arg0, 751); + if (ivar2 == -1) { + return 1; + } + IF (isBitFlagged(ivar1, 1)) + GOTO flow_10 + GOTO flow_11 + flow_10: + IF (getSkillActualLvl(ivar2) < getItemHashmapData(arg0, 752)) + GOTO flow_13 + flow_11: + IF (isBitFlagged(ivar1, 1) && (getSkillCurrentLvl(ivar2) < getItemHashmapData(arg0, 752))) + GOTO flow_13 + GOTO flow_14 + flow_13: + return 0; + flow_14: + ivar2 = getItemHashmapData(arg0, 753); + if (ivar2 == -1) { + return 1; + } + IF (isBitFlagged(ivar1, 2)) + GOTO flow_17 + GOTO flow_18 + flow_17: + IF (getSkillActualLvl(ivar2) < getItemHashmapData(arg0, 754)) + GOTO flow_20 + flow_18: + IF (isBitFlagged(ivar1, 2) && (getSkillCurrentLvl(ivar2) < getItemHashmapData(arg0, 754))) + GOTO flow_20 + GOTO flow_21 + flow_20: + return 0; + flow_21: + ivar2 = getItemHashmapData(arg0, 755); + if (ivar2 == -1) { + return 1; + } + IF (isBitFlagged(ivar1, 3)) + GOTO flow_24 + GOTO flow_25 + flow_24: + IF (getSkillActualLvl(ivar2) < getItemHashmapData(arg0, 756)) + GOTO flow_27 + flow_25: + IF (isBitFlagged(ivar1, 3) && (getSkillCurrentLvl(ivar2) < getItemHashmapData(arg0, 756))) + GOTO flow_27 + GOTO flow_28 + flow_27: + return 0; + flow_28: + ivar2 = getItemHashmapData(arg0, 757); + if (ivar2 == -1) { + return 1; + } + IF (isBitFlagged(ivar1, 4)) + GOTO flow_31 + GOTO flow_32 + flow_31: + IF (getSkillActualLvl(ivar2) < getItemHashmapData(arg0, 758)) + GOTO flow_34 + flow_32: + IF (isBitFlagged(ivar1, 4) && (getSkillCurrentLvl(ivar2) < getItemHashmapData(arg0, 758))) + GOTO flow_34 + GOTO flow_35 + flow_34: + return 0; + flow_35: + ivar2 = getItemHashmapData(arg0, 759); + if (ivar2 == -1) { + return 1; + } + IF (isBitFlagged(ivar1, 5)) + GOTO flow_38 + GOTO flow_39 + flow_38: + IF (getSkillActualLvl(ivar2) < getItemHashmapData(arg0, 760)) + GOTO flow_41 + flow_39: + IF (isBitFlagged(ivar1, 5) && (getSkillCurrentLvl(ivar2) < getItemHashmapData(arg0, 760))) + GOTO flow_41 + GOTO flow_42 + flow_41: + return 0; + flow_42: + return 1; +} diff --git a/dumps/scripts/93.cs2 b/dumps/scripts/93.cs2 new file mode 100644 index 000000000..8891b3585 --- /dev/null +++ b/dumps/scripts/93.cs2 @@ -0,0 +1,4 @@ +void script_93(int arg0) { + script_680(arg0); + return; +} diff --git a/dumps/scripts/930.cs2 b/dumps/scripts/930.cs2 new file mode 100644 index 000000000..4af3edb0a --- /dev/null +++ b/dumps/scripts/930.cs2 @@ -0,0 +1,46 @@ +int script_930(int arg0) { + int ivar1; + ivar1 = getItemHashmapData(arg0, 743); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 744); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 745); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 746); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 747); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 748); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/931.cs2 b/dumps/scripts/931.cs2 new file mode 100644 index 000000000..7b7016e3b --- /dev/null +++ b/dumps/scripts/931.cs2 @@ -0,0 +1,46 @@ +int script_931(int arg0) { + int ivar1; + ivar1 = getItemHashmapData(arg0, 770); + if (ivar1 == -1) { + return 1; + } + if (getSkillActualLvl(ivar1) < getItemHashmapData(arg0, 771)) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 772); + if (ivar1 == -1) { + return 1; + } + if (getSkillActualLvl(ivar1) < getItemHashmapData(arg0, 773)) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 774); + if (ivar1 == -1) { + return 1; + } + if (getSkillActualLvl(ivar1) < getItemHashmapData(arg0, 775)) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 776); + if (ivar1 == -1) { + return 1; + } + if (getSkillActualLvl(ivar1) < getItemHashmapData(arg0, 777)) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 778); + if (ivar1 == -1) { + return 1; + } + if (getSkillActualLvl(ivar1) < getItemHashmapData(arg0, 779)) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 780); + if (ivar1 == -1) { + return 1; + } + if (getSkillActualLvl(ivar1) < getItemHashmapData(arg0, 781)) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/932.cs2 b/dumps/scripts/932.cs2 new file mode 100644 index 000000000..bf5a9c070 --- /dev/null +++ b/dumps/scripts/932.cs2 @@ -0,0 +1,46 @@ +int script_932(int arg0) { + int ivar1; + ivar1 = getItemHashmapData(arg0, 764); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 765); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 766); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 767); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 768); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + ivar1 = getItemHashmapData(arg0, 769); + if (ivar1 == -1) { + return 1; + } + if (((boolean)script_2156(ivar1))) { + return 0; + } + return 1; +} diff --git a/dumps/scripts/933.cs2 b/dumps/scripts/933.cs2 new file mode 100644 index 000000000..66b5fce2e --- /dev/null +++ b/dumps/scripts/933.cs2 @@ -0,0 +1,42 @@ +int script_933(int arg0) { + switch (getItemHashmapData(arg0, 741)) { + case 1: + if (bitconfig_1852 < getItemHashmapData(arg0, 742)) { + return 0; + } + break; + case 2: + if (bitconfig_3763 < 2) { + return 0; + } + break; + case 3: + if (bitconfig_4310 < 10) { + return 0; + } + break; + case 4: + if (bitconfig_1990 < 280) { + return 0; + } + break; + case 5: + if (bitconfig_1850 < 4) { + return 0; + } + break; + case 6: + if (bitconfig_3550 < 8) { + return 0; + } + break; + case 7: + if (bitconfig_998 < 7) { + return 0; + } + break; + default: + return 1; + } + return -1; +} diff --git a/dumps/scripts/934.cs2 b/dumps/scripts/934.cs2 new file mode 100644 index 000000000..14360807d --- /dev/null +++ b/dumps/scripts/934.cs2 @@ -0,0 +1,28 @@ +string script_934(int arg0) { + int ivar1; + string svar0; + svar0 = ""; + ivar1 = getItemHashmapData(arg0, 742); + switch (getItemHashmapData(arg0, 741)) { + case 1: + if (((boolean)ivar1)) { + svar0 = "Rescued 1 dignitary in Recipe for Disaster"; + } else { + svar0 = "Rescued " + intToStr(ivar1) + " dignitaries in Recipe for Disaster"; + } + return script_913(bitconfig_1852, getItemHashmapData(arg0, 742), svar0); + case 2: + return script_913(bitconfig_3763, 2, "Barbarian spearmaking"); + case 3: + return script_913(bitconfig_4310, 10, "Complete: Chaos Tunnels"); + case 4: + return script_913(bitconfig_1990, 280, "Part of quest: In Aid of the Myreque"); + case 5: + return script_913(bitconfig_1850, 4, "Part of quest: Recipe for Disaster"); + case 6: + return script_913(bitconfig_3550, 8, "Part of quest: Another Slice of H.A.M."); + case 7: + return script_913(bitconfig_998, 7, "You need to complete the first puzzle in the Elemental Workshop IV Quest."); + } + return ""; +} diff --git a/dumps/scripts/935.cs2 b/dumps/scripts/935.cs2 new file mode 100644 index 000000000..5c9c8ac95 --- /dev/null +++ b/dumps/scripts/935.cs2 @@ -0,0 +1,17 @@ +int script_935(int arg0) { + switch (getItemHashmapData(arg0, 762)) { + case 1: + if (standart_config_322 < 10) { + return 0; + } + break; + case 2: + if (bitconfig_4310 < 10) { + return 0; + } + break; + default: + return 1; + } + return -1; +} diff --git a/dumps/scripts/936.cs2 b/dumps/scripts/936.cs2 new file mode 100644 index 000000000..a2523673f --- /dev/null +++ b/dumps/scripts/936.cs2 @@ -0,0 +1,13 @@ +string script_936(int arg0) { + int ivar1; + string svar0; + svar0 = ""; + ivar1 = getItemHashmapData(arg0, 763); + switch (getItemHashmapData(arg0, 762)) { + case 1: + return script_913(standart_config_322, 10, "Part of quest: Tai Bwo Wannai Trio"); + case 2: + return script_913(bitconfig_4310, 10, "Complete: Chaos Tunnels"); + } + return ""; +} diff --git a/dumps/scripts/937.cs2 b/dumps/scripts/937.cs2 new file mode 100644 index 000000000..f3a7a0b3b --- /dev/null +++ b/dumps/scripts/937.cs2 @@ -0,0 +1,36 @@ +void script_937() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + deleteAllExtraChilds(new WidgetPointer(335,32)); + ivar0 = 0; + ivar1 = 0; + ivar2 = 4; + ivar3 = 7; + if (getWidgetScrollMaxH(new WidgetPointer(335,32)) > 0) { + ivar0 = divide(subtract(getWidgetScrollMaxH(new WidgetPointer(335,32)), multiply(36, ivar2)), subtract(ivar2, 1)); + } else { + ivar0 = divide(subtract(getWidgetActualWidth(new WidgetPointer(335,32)), multiply(36, ivar2)), subtract(ivar2, 1)); + } + if (getWidgetScrollMaxV(new WidgetPointer(335,32)) > 0) { + ivar1 = divide(subtract(getWidgetScrollMaxV(new WidgetPointer(335,32)), multiply(32, ivar3)), subtract(ivar3, 1)); + } else { + ivar1 = divide(subtract(getWidgetActualHeight(new WidgetPointer(335,32)), multiply(32, ivar3)), subtract(ivar3, 1)); + } + ivar4 = 0; + ivar5 = -1; + while (ivar4 < getItemContainerLength(90)) { + createExtraChild(new WidgetPointer(335,32), 3, ivar4); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(multiply(add(36, ivar0), mod(ivar4, ivar2)), multiply(divide(ivar4, ivar2), add(32, ivar1)), 0, 0); + setWidgetFilled(1); + setWidgetRGB(new Color(255, 0, 0)); + cs2method2103(255); + ivar4 = add(ivar4, 1); + } + setScriptCallOnItemContainerUpdate(938, 90, 1, "Y", new WidgetPointer(335,32)); + return; +} diff --git a/dumps/scripts/938.cs2 b/dumps/scripts/938.cs2 new file mode 100644 index 000000000..04994f180 --- /dev/null +++ b/dumps/scripts/938.cs2 @@ -0,0 +1,4 @@ +void script_938() { + script_939(); + return; +} diff --git a/dumps/scripts/939.cs2 b/dumps/scripts/939.cs2 new file mode 100644 index 000000000..c24046d4c --- /dev/null +++ b/dumps/scripts/939.cs2 @@ -0,0 +1,14 @@ +void script_939() { + int ivar0; + int ivar1; + ivar0 = 0; + ivar1 = -1; + while (ivar0 < getItemContainerLength(90)) { + if (setWidgetRegister(new WidgetPointer(335,32), ivar0)) { + ivar1 = getItemIdInSlotSplit(90, ivar0); + script_812(ivar1); + } + ivar0 = add(ivar0, 1); + } + return; +} diff --git a/dumps/scripts/94.cs2 b/dumps/scripts/94.cs2 new file mode 100644 index 000000000..6be2def91 --- /dev/null +++ b/dumps/scripts/94.cs2 @@ -0,0 +1,4 @@ +void script_94(int arg0) { + script_1360(arg0); + return; +} diff --git a/dumps/scripts/940.cs2 b/dumps/scripts/940.cs2 new file mode 100644 index 000000000..4055bc9fa --- /dev/null +++ b/dumps/scripts/940.cs2 @@ -0,0 +1,12 @@ +string script_940(int arg0) { + if (arg0 < 0) { + return ""; + } + if (arg0 < 10000) { + return intToStr(arg0); + } + if (arg0 < 10000000) { + return concat(intToStr(divide(arg0, 1000)), "K"); + } + return concat(intToStr(divide(arg0, 1000000)), "M"); +} diff --git a/dumps/scripts/941.cs2 b/dumps/scripts/941.cs2 new file mode 100644 index 000000000..1358dea5c --- /dev/null +++ b/dumps/scripts/941.cs2 @@ -0,0 +1,86 @@ +void script_941(int arg0) { + globalint_988 = 0; + globalint_989 = 0; + globalint_990 = 0; + globalint_991 = 0; + switch (arg0) { + case 12582919: + script_41(12583008); + if (((boolean)bitconfig_6459)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12582921: + script_41(12583008); + if (((boolean)bitconfig_6462)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12582923: + script_41(12583008); + if (((boolean)bitconfig_6461)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12582925: + script_41(12583008); + if (((boolean)bitconfig_6460)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 28180485: + script_41(28180545); + if (((boolean)bitconfig_6463)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 28180489: + script_41(28180545); + if (((boolean)bitconfig_6464)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 28180487: + script_41(28180545); + if (((boolean)bitconfig_6465)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12648453: + script_41(12648501); + if (((boolean)bitconfig_6466)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 12648455: + script_41(12648501); + if (((boolean)bitconfig_6467)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 62259207: + script_41(62259272); + if (((boolean)bitconfig_7348)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 62259209: + script_41(62259272); + if (((boolean)bitconfig_7351)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 62259211: + script_41(62259272); + if (((boolean)bitconfig_7350)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + break; + case 62259213: + script_41(62259272); + if (((boolean)bitconfig_7349)) { + setWidgetSprite(1701, new WidgetPointer(arg0)); + } + } + return; +} diff --git a/dumps/scripts/942.cs2 b/dumps/scripts/942.cs2 new file mode 100644 index 000000000..eedb60b92 --- /dev/null +++ b/dumps/scripts/942.cs2 @@ -0,0 +1,40 @@ +cs2func_script_942_struct(1,1,0) script_942(int arg0) { + if (standart_config_1469 == cs2method_3408(105, 99, 2536, arg0)) { + return newstruct cs2func_script_942_struct(0, "null"); + } + switch (arg0) { + case 0: + return newstruct cs2func_script_942_struct(1, cs2method_3408(105, 115, 2535, 0)); + case 1: + return newstruct cs2func_script_942_struct(1, cs2method_3408(105, 115, 2535, 1)); + case 2: + return newstruct cs2func_script_942_struct(1, cs2method_3408(105, 115, 2535, 2)); + case 3: + return newstruct cs2func_script_942_struct(1, cs2method_3408(105, 115, 2535, 3)); + case 4: + return newstruct cs2func_script_942_struct(1, cs2method_3408(105, 115, 2535, 4)); + case 5: + if (bitconfig_720 == 20) { + return newstruct cs2func_script_942_struct(1, cs2method_3408(105, 115, 2535, 5)); + } + break; + case 6: + if (bitconfig_722 == 20) { + return newstruct cs2func_script_942_struct(1, cs2method_3408(105, 115, 2535, 6)); + } + break; + case 7: + if (bitconfig_724 == 20) { + return newstruct cs2func_script_942_struct(1, cs2method_3408(105, 115, 2535, 7)); + } + break; + case 8: + if (bitconfig_3959 >= 3) { + return newstruct cs2func_script_942_struct(1, cs2method_3408(105, 115, 2535, 8)); + } + break; + default: + return newstruct cs2func_script_942_struct(-1, "null"); + } + return newstruct cs2func_script_942_struct(0, "null"); +} diff --git a/dumps/scripts/943.cs2 b/dumps/scripts/943.cs2 new file mode 100644 index 000000000..be8a450e4 --- /dev/null +++ b/dumps/scripts/943.cs2 @@ -0,0 +1,24 @@ +void script_943(int arg0,int arg1,int arg2,int arg3) { + int ivar4; + ivar4 = getOtherCommonData(cs2method_3408(105, 74, 169, arg0), 782); + if (isMember()) { + messageType0("More advanced grouping options are available on a members' world."); + } else if (standart_config_281 < 1000) { + messageType0("More advanced grouping options will be available when you've finished the Tutorial."); + } else { + if (globalint_693 == arg1) { + globalint_694 = mod(add(1, globalint_694), 2); + } else { + globalint_693 = arg1; + globalint_694 = 0; + } + script_2162(arg0, globalint_693, globalint_694, globalint_692, globalint_1103); + script_1349(12451856, 12451854, 12451855, -1, 1); + if (setWidgetRegister(new WidgetPointer(190,16), 2)) { + setWidgetText(cs2method_3408(105, 115, ivar4, arg1)); + setWidgetRGB(new Color(arg3)); + setScriptCallOnMouseExit(1354, new WidgetPointer(190,16), 2, arg3, "Iii"); + } + } + return; +} diff --git a/dumps/scripts/944.cs2 b/dumps/scripts/944.cs2 new file mode 100644 index 000000000..ea6f8a34c --- /dev/null +++ b/dumps/scripts/944.cs2 @@ -0,0 +1,4 @@ +void script_944(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19) { + script_945(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19); + return; +} diff --git a/dumps/scripts/945.cs2 b/dumps/scripts/945.cs2 new file mode 100644 index 000000000..d1200c30f --- /dev/null +++ b/dumps/scripts/945.cs2 @@ -0,0 +1,43 @@ +void script_945(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18,int arg19,int arg20) { + int ivar21; + int ivar22; + int ivar23; + ivar21 = getOtherCommonData(cs2method_3408(105, 74, 169, arg0), 782); + deleteAllExtraChilds(new WidgetPointer(arg3)); + createExtraChild(new WidgetPointer(arg3), 5, 0); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg3)), getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0); + setWidgetSprite(arg7); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg3), 3, getExtraChildGap(new WidgetPointer(arg3))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg3)), getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + ivar22 = 1; + createExtraChild(new WidgetPointer(arg3), 5, ivar22); + setWidgetPosition(subtract(getWidgetActualWidth(new WidgetPointer(arg3)), 16), 0, 0, 0); + setWidgetSize(16, getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0); + setWidgetSprite(arg8); + cs2method1107(0); + setScriptCallOnMouseEntered(1351, new WidgetPointer(arg3), ivar22, arg9, "Iid"); + setScriptCallOnMouseExit(1352, new WidgetPointer(arg3), ivar22, arg8, "Iid"); + ivar23 = getExtraChildGap(new WidgetPointer(arg3)); + setScriptCallOnMousePressed(946, arg0, arg2, new WidgetPointer(arg4), arg10, new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg3), arg11, arg12, arg13, arg14, ivar23, ivar22, arg15, arg16, arg17, arg18, arg19, arg20, "iiIdIIIiiidiidddddd"); + createExtraChild(new WidgetPointer(arg3), 4, ivar23); + setWidgetText(cs2method_3408(105, 115, ivar21, arg1)); + setWidgetPosition(5, 0, 0, 0); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg3)), 22), getWidgetActualHeight(new WidgetPointer(arg3)), 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(arg14); + setWidgetTextAlignment(0, 1, 0); + if (arg1 >= arg2) { + setWidgetRGB(new Color(arg12)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg3), ivar23, arg12, "Iii"); + } else { + setWidgetRGB(new Color(arg11)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg3), ivar23, arg11, "Iii"); + } + setScriptCallOnMouseEntered(1353, new WidgetPointer(arg3), ivar23, arg13, "Iii"); + setScriptCallOnMousePressed(946, arg0, arg2, new WidgetPointer(arg4), arg10, new WidgetPointer(arg5), new WidgetPointer(arg6), new WidgetPointer(arg3), arg11, arg12, arg13, arg14, ivar23, ivar22, arg15, arg16, arg17, arg18, arg19, arg20, "iiIdIIIiiidiidddddd"); + return; +} diff --git a/dumps/scripts/946.cs2 b/dumps/scripts/946.cs2 new file mode 100644 index 000000000..ee2a351ce --- /dev/null +++ b/dumps/scripts/946.cs2 @@ -0,0 +1,9 @@ +void script_946(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18) { + if (isWidgetHidden(new WidgetPointer(arg2))) { + cs2method2100(0, 0, new WidgetPointer(arg4)); + script_947(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18); + } else { + script_1349(arg6, arg2, arg4, arg5, arg12); + } + return; +} diff --git a/dumps/scripts/947.cs2 b/dumps/scripts/947.cs2 new file mode 100644 index 000000000..a48b398a7 --- /dev/null +++ b/dumps/scripts/947.cs2 @@ -0,0 +1,56 @@ +void script_947(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16,int arg17,int arg18) { + int ivar19; + int ivar20; + int ivar21; + string svar0; + if (setWidgetRegister(new WidgetPointer(arg6), arg12)) { + setWidgetVFlip(1); + } + createExtraChild(new WidgetPointer(arg2), 5, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetSprite(arg3); + cs2method1107(1); + createExtraChild(new WidgetPointer(arg2), 3, getExtraChildGap(new WidgetPointer(arg2))); + setWidgetPosition(0, 0, 0, 0); + setWidgetSize(getWidgetActualWidth(new WidgetPointer(arg2)), getWidgetActualHeight(new WidgetPointer(arg2)), 0, 0); + setWidgetRGB(new Color(0, 0, 0)); + setWidgetScrollMax(getWidgetActualWidth(new WidgetPointer(arg4)), multiply(arg1, 15), new WidgetPointer(arg4)); + ivar19 = 0; + ivar20 = -1; + svar0 = ""; + ivar21 = getOtherCommonData(cs2method_3408(105, 74, 169, arg0), 782); + while (ivar19 <= arg1) { + ivar20 = getExtraChildGap(new WidgetPointer(arg4)); + svar0 = cs2method_3408(105, 115, ivar21, ivar19); + createExtraChild(new WidgetPointer(arg4), 4, ivar20); + cs2method1305(svar0); + if ((ivar20 == globalint_693) && ((boolean)globalint_694)) { + svar0 = concat(svar0, " (r)"); + } + setWidgetText(svar0); + setWidgetTextAlignment(0, 1, 0); + setWidgetPosition(5, multiply(ivar19, 15), 0, 0); + setWidgetSize(subtract(getWidgetActualWidth(new WidgetPointer(arg4)), 16), 15, 0, 0); + setWidgetUnknownBoolean(false); + setWidgetFont(arg10); + setWidgetContextMenuOption(1, "Select"); + setScriptCallOnClickContextMenu(943, arg0, -2147483643, -2147483644, arg7, "iiii"); + if (ivar19 >= arg1) { + setWidgetRGB(new Color(arg8)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg4), ivar20, arg8, "Iii"); + } else { + setWidgetRGB(new Color(arg7)); + setScriptCallOnMouseExit(1354, new WidgetPointer(arg4), ivar20, arg7, "Iii"); + } + setScriptCallOnMouseEntered(1353, new WidgetPointer(arg4), ivar20, arg9, "Iii"); + ivar19 = add(ivar19, 1); + } + if (arg5 != -1) { + script_31(arg5, arg4, arg13, arg14, arg15, arg16, arg17, arg18); + setWidgetIsHidden(false, new WidgetPointer(arg5)); + } + setWidgetIsHidden(false, new WidgetPointer(arg2)); + setWidgetIsHidden(false, new WidgetPointer(arg4)); + return; +} diff --git a/dumps/scripts/948.cs2 b/dumps/scripts/948.cs2 new file mode 100644 index 000000000..20d5a227b --- /dev/null +++ b/dumps/scripts/948.cs2 @@ -0,0 +1,6 @@ +void script_948() { + setScriptCallOnGameloop(-1, "", new WidgetPointer(894,5)); + setWidgetIsHidden(true, new WidgetPointer(894,7)); + setWidgetSprite(-1, new WidgetPointer(894,4)); + return; +} diff --git a/dumps/scripts/949.cs2 b/dumps/scripts/949.cs2 new file mode 100644 index 000000000..6e73b9e61 --- /dev/null +++ b/dumps/scripts/949.cs2 @@ -0,0 +1,23 @@ +void script_949() { + if (((boolean)globalint_1198)) { + setWidgetIsHidden(false, new WidgetPointer(933,322)); + setWidgetIsHidden(false, new WidgetPointer(933,323)); + } + if (((boolean)globalint_1199)) { + setWidgetIsHidden(false, new WidgetPointer(933,321)); + setWidgetIsHidden(false, new WidgetPointer(933,324)); + } + if (((boolean)globalint_1200)) { + setWidgetIsHidden(false, new WidgetPointer(933,320)); + setWidgetIsHidden(false, new WidgetPointer(933,325)); + } + if (((boolean)globalint_1201)) { + setWidgetIsHidden(false, new WidgetPointer(933,319)); + setWidgetIsHidden(false, new WidgetPointer(933,326)); + } + if (((boolean)globalint_1202)) { + setWidgetIsHidden(false, new WidgetPointer(933,318)); + setWidgetIsHidden(false, new WidgetPointer(933,327)); + } + return; +} diff --git a/dumps/scripts/95.cs2 b/dumps/scripts/95.cs2 new file mode 100644 index 000000000..928cefc80 --- /dev/null +++ b/dumps/scripts/95.cs2 @@ -0,0 +1,4 @@ +void script_95(int arg0) { + script_1361(arg0); + return; +} diff --git a/dumps/scripts/950.cs2 b/dumps/scripts/950.cs2 new file mode 100644 index 000000000..5c12d01a4 --- /dev/null +++ b/dumps/scripts/950.cs2 @@ -0,0 +1,13 @@ +void script_950() { + switch (globalint_1397) { + case 0: + setWidgetRGB(new Color(255, 180, 0), new WidgetPointer(933,323)); + break; + case 1: + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(933,323)); + break; + case 2: + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(933,323)); + } + return; +} diff --git a/dumps/scripts/951.cs2 b/dumps/scripts/951.cs2 new file mode 100644 index 000000000..565368180 --- /dev/null +++ b/dumps/scripts/951.cs2 @@ -0,0 +1,13 @@ +void script_951() { + switch (globalint_1398) { + case 0: + setWidgetRGB(new Color(255, 180, 0), new WidgetPointer(933,324)); + break; + case 1: + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(933,324)); + break; + case 2: + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(933,324)); + } + return; +} diff --git a/dumps/scripts/952.cs2 b/dumps/scripts/952.cs2 new file mode 100644 index 000000000..ada26f38a --- /dev/null +++ b/dumps/scripts/952.cs2 @@ -0,0 +1,13 @@ +void script_952() { + switch (globalint_1399) { + case 0: + setWidgetRGB(new Color(255, 180, 0), new WidgetPointer(933,325)); + break; + case 1: + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(933,325)); + break; + case 2: + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(933,325)); + } + return; +} diff --git a/dumps/scripts/953.cs2 b/dumps/scripts/953.cs2 new file mode 100644 index 000000000..ffe27f24a --- /dev/null +++ b/dumps/scripts/953.cs2 @@ -0,0 +1,13 @@ +void script_953() { + switch (globalint_1400) { + case 0: + setWidgetRGB(new Color(255, 180, 0), new WidgetPointer(933,326)); + break; + case 1: + setWidgetRGB(new Color(0, 255, 0), new WidgetPointer(933,326)); + break; + case 2: + setWidgetRGB(new Color(255, 0, 0), new WidgetPointer(933,326)); + } + return; +} diff --git a/dumps/scripts/954.cs2 b/dumps/scripts/954.cs2 new file mode 100644 index 000000000..acfa6991d --- /dev/null +++ b/dumps/scripts/954.cs2 @@ -0,0 +1,4 @@ +void script_954() { + setWidgetSize(multiplyDivide(subtract(1000, bitconfig_4564), 1000, 182), 6, 0, 0, new WidgetPointer(730,29)); + return; +} diff --git a/dumps/scripts/955.cs2 b/dumps/scripts/955.cs2 new file mode 100644 index 000000000..e343c13c3 --- /dev/null +++ b/dumps/scripts/955.cs2 @@ -0,0 +1,6 @@ +void script_955() { + if (((((bitconfig_4540 == 3) && ((boolean)getItemAmtInContainer(94, 12845))) && (((boolean)getItemAmtInContainer(93, 12845)) && ((boolean)getItemAmtInContainer(94, 12846)))) && ((((boolean)getItemAmtInContainer(93, 12846)) && ((boolean)getItemAmtInContainer(94, 12847))) && (((boolean)getItemAmtInContainer(93, 12847)) && ((boolean)getItemAmtInContainer(94, 12848))))) && ((((boolean)getItemAmtInContainer(93, 12848)) && ((boolean)getItemAmtInContainer(94, 12849))) && ((boolean)getItemAmtInContainer(93, 12849)))) { + setWidgetIsHidden(false, new WidgetPointer(730,24)); + } + return; +} diff --git a/dumps/scripts/956.cs2 b/dumps/scripts/956.cs2 new file mode 100644 index 000000000..165703f6a --- /dev/null +++ b/dumps/scripts/956.cs2 @@ -0,0 +1,38 @@ +void script_956() { + cs2method2305(new WidgetPointer(732,2), "" + "Druidic Mage Top" + ""); + cs2method2305(new WidgetPointer(732,7), "" + "Druidic Mage Bottom" + ""); + cs2method2305(new WidgetPointer(732,12), "" + "Druidic Mage Hood" + ""); + cs2method2305(new WidgetPointer(732,19), "" + "Combat Robe Top" + ""); + cs2method2305(new WidgetPointer(732,24), "" + "Combat Robe Bottom" + ""); + cs2method2305(new WidgetPointer(732,29), "" + "Combat Hood" + ""); + cs2method2305(new WidgetPointer(732,36), "" + "Battle Robe Top" + ""); + cs2method2305(new WidgetPointer(732,41), "" + "Battle Robe Bottom" + ""); + cs2method2305(new WidgetPointer(732,46), "" + "Battle Hood" + ""); + cs2method2305(new WidgetPointer(732,53), "" + "Green D'Hide Coif" + ""); + cs2method2305(new WidgetPointer(732,58), "" + "Blue D'Hide Coif" + ""); + cs2method2305(new WidgetPointer(732,63), "" + "Red D'Hide Coif" + ""); + cs2method2305(new WidgetPointer(732,68), "" + "Black D'Hide Coif" + ""); + cs2method2305(new WidgetPointer(732,75), "" + "Bronze Gauntlets" + ""); + cs2method2305(new WidgetPointer(732,80), "" + "Iron Gauntlets" + ""); + cs2method2305(new WidgetPointer(732,85), "" + "Steel Gauntlets" + ""); + cs2method2305(new WidgetPointer(732,90), "" + "Black Gauntlets" + ""); + cs2method2305(new WidgetPointer(732,95), "" + "Mithril Gauntlets" + ""); + cs2method2305(new WidgetPointer(732,100), "" + "Adamant Gauntlets" + ""); + cs2method2305(new WidgetPointer(732,105), "" + "Rune Gauntlets" + ""); + cs2method2305(new WidgetPointer(732,110), "" + "Dragon Gauntlets" + ""); + cs2method2305(new WidgetPointer(732,117), "" + "Adamant Spikeshield" + ""); + cs2method2305(new WidgetPointer(732,122), "" + "Adamant Berserker Shield" + ""); + cs2method2305(new WidgetPointer(732,127), "" + "Rune Spikeshield" + ""); + cs2method2305(new WidgetPointer(732,132), "" + "Rune Berserker Shield" + ""); + cs2method2305(new WidgetPointer(732,139), "" + "Irit Gloves" + ""); + cs2method2305(new WidgetPointer(732,144), "" + "Avantoe Gloves" + ""); + cs2method2305(new WidgetPointer(732,149), "" + "Kwuarm Gloves" + ""); + cs2method2305(new WidgetPointer(732,154), "" + "Cadantine Gloves" + ""); + cs2method2305(new WidgetPointer(732,161), "" + "Swordfish Gloves" + ""); + cs2method2305(new WidgetPointer(732,166), "" + "Shark Gloves" + ""); + cs2method2305(new WidgetPointer(732,171), "" + "Dragon Slayer Gloves" + ""); + cs2method2305(new WidgetPointer(732,176), "" + "Air Runecrafting Gloves" + ""); + cs2method2305(new WidgetPointer(732,181), "" + "Water Runecrafting Gloves" + ""); + cs2method2305(new WidgetPointer(732,186), "" + "Earth Runecrafting Gloves" + ""); + return; +} diff --git a/dumps/scripts/957.cs2 b/dumps/scripts/957.cs2 new file mode 100644 index 000000000..6f0eccf90 --- /dev/null +++ b/dumps/scripts/957.cs2 @@ -0,0 +1,10 @@ +void script_957(int arg0,int arg1,int arg2) { + if (((boolean)bitconfig_4618)) { + script_959(arg0, arg1, 0); + setWidgetSprite(1156, new WidgetPointer(arg2)); + } else { + script_959(arg0, arg1, 1); + setWidgetSprite(1157, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/958.cs2 b/dumps/scripts/958.cs2 new file mode 100644 index 000000000..5bdd90115 --- /dev/null +++ b/dumps/scripts/958.cs2 @@ -0,0 +1,10 @@ +void script_958(int arg0,int arg1,int arg2) { + if (((boolean)bitconfig_4618)) { + script_959(arg0, arg1, 1); + setWidgetSprite(1157, new WidgetPointer(arg2)); + } else { + script_959(arg0, arg1, 0); + setWidgetSprite(1156, new WidgetPointer(arg2)); + } + return; +} diff --git a/dumps/scripts/959.cs2 b/dumps/scripts/959.cs2 new file mode 100644 index 000000000..7f6423b6d --- /dev/null +++ b/dumps/scripts/959.cs2 @@ -0,0 +1,112 @@ +void script_959(int arg0,int arg1,int arg2) { + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + string svar0; + deleteAllExtraChilds(new WidgetPointer(arg0)); + globalarray_0 = new WidgetPointer[64]; + ivar3 = 0; + ivar4 = -1; + ivar5 = 0; + while (ivar5 < 64) { + ivar4 = ((int)cs2method_3408(105, 73, 1467, ivar5)); + if (strLength(getWidgetText(new WidgetPointer(ivar4))) > 0) { + setWidgetIsHidden(false, new WidgetPointer(ivar4)); + globalarray_0[ivar3] = ivar4; + ivar3 = add(ivar3, 1); + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar4)); + } + ivar5 = add(ivar5, 1); + } + if (ivar3 > 1) { + if (((boolean)arg2)) { + script_0(0, 0, subtract(ivar3, 1)); + } else { + script_62(0, 0, subtract(ivar3, 1), 1466); + } + } + ivar6 = 0; + ivar7 = 0; + ivar8 = getWidgetActualWidth(new WidgetPointer(ivar4)); + ivar5 = 0; + while (ivar5 < ivar3) { + ivar4 = globalarray_0[ivar5]; + ivar7 = getLineCount(ivar8, 495, getWidgetText(new WidgetPointer(ivar4))); + ivar7 = add(multiply(12, ivar7), 10); + setWidgetFont(495, new WidgetPointer(ivar4)); + setWidgetSize(ivar8, ivar7, 0, 0, new WidgetPointer(ivar4)); + setWidgetPosition(0, ivar6, 0, 0, new WidgetPointer(ivar4)); + createExtraChild(new WidgetPointer(arg0), 4, ivar5); + setWidgetSize(ivar8, ivar7, 0, 0); + setWidgetPosition(0, ivar6, 0, 0); + setWidgetFont(495); + setWidgetRGB(new Color(223, 15, 15)); + setWidgetUnknownBoolean(true); + setWidgetTextAlignment(0, 0, 0); + setWidgetText(cs2method_3408(73, 115, 1466, ivar4)); + ivar6 = add(ivar6, ivar7); + ivar5 = add(ivar5, 1); + } + ivar4 = ((int)cs2method_3408(105, 73, 1467, 64)); + svar0 = getWidgetText(new WidgetPointer(ivar4)); + if (strLength(svar0) > 0) { + if (ivar6 > 0) { + ivar6 = add(ivar6, 5); + } + ivar7 = getLineCount(ivar8, 495, svar0); + ivar7 = add(multiply(12, ivar7), 5); + setWidgetSize(ivar8, ivar7, 0, 0, new WidgetPointer(ivar4)); + setWidgetPosition(0, ivar6, 0, 0, new WidgetPointer(ivar4)); + setWidgetIsHidden(false, new WidgetPointer(ivar4)); + ivar6 = add(ivar6, ivar7); + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar4)); + } + ivar4 = ((int)cs2method_3408(105, 73, 1467, 65)); + svar0 = getWidgetText(new WidgetPointer(ivar4)); + if (strLength(svar0) > 0) { + if (ivar6 > 0) { + ivar6 = add(ivar6, 5); + } + ivar7 = getLineCount(ivar8, 495, svar0); + ivar7 = add(multiply(12, ivar7), 5); + setWidgetSize(ivar8, ivar7, 0, 0, new WidgetPointer(ivar4)); + setWidgetPosition(0, ivar6, 0, 0, new WidgetPointer(ivar4)); + setWidgetIsHidden(false, new WidgetPointer(ivar4)); + ivar6 = add(ivar6, ivar7); + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar4)); + } + ivar4 = ((int)cs2method_3408(105, 73, 1467, 66)); + svar0 = getWidgetText(new WidgetPointer(ivar4)); + if (strLength(svar0) > 0) { + if (ivar6 > 0) { + ivar6 = add(ivar6, 5); + } + ivar7 = getLineCount(ivar8, 495, svar0); + ivar7 = add(multiply(12, ivar7), 5); + setWidgetSize(ivar8, ivar7, 0, 0, new WidgetPointer(ivar4)); + setWidgetPosition(0, ivar6, 0, 0, new WidgetPointer(ivar4)); + setWidgetIsHidden(false, new WidgetPointer(ivar4)); + ivar6 = add(ivar6, ivar7); + } else { + setWidgetIsHidden(true, new WidgetPointer(ivar4)); + } + setWidgetScrollMax(ivar8, ivar6, new WidgetPointer(arg0)); + if (ivar6 > getWidgetActualHeight(new WidgetPointer(arg0))) { + setWidgetPosition(3, getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + script_31(arg1, arg0, 792, 789, 790, 791, 773, 788); + if (setWidgetRegister(new WidgetPointer(arg1), 1)) { + script_157(arg1, arg0, globalint_121, 1); + } + } else { + cs2method2100(0, 0, new WidgetPointer(arg0)); + globalint_121 = 0; + setWidgetPosition(12, getWidgetActualY(new WidgetPointer(arg0)), 0, 0, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/96.cs2 b/dumps/scripts/96.cs2 new file mode 100644 index 000000000..9bab88e6f --- /dev/null +++ b/dumps/scripts/96.cs2 @@ -0,0 +1,4 @@ +void script_96(int arg0) { + script_1363(arg0); + return; +} diff --git a/dumps/scripts/960.cs2 b/dumps/scripts/960.cs2 new file mode 100644 index 000000000..7ab4bc537 --- /dev/null +++ b/dumps/scripts/960.cs2 @@ -0,0 +1,17 @@ +void script_960() { + script_333(44957699, 0, 4537650, 0, 0); + script_333(44957700, 4537650, 6052707, 0, 0); + setWidgetIsHidden(true, new WidgetPointer(686,9)); + script_680(44957710); + setScriptCallOnMouseEntered(95, new WidgetPointer(-32768,3), "I", new WidgetPointer(686,14)); + setScriptCallOnMouseExit(93, new WidgetPointer(-32768,3), "I", new WidgetPointer(686,14)); + setScriptCallOnClickContextMenu(69, 1, new WidgetPointer(686,9), "1I", new WidgetPointer(686,14)); + script_680(44957712); + setScriptCallOnMouseEntered(95, new WidgetPointer(-32768,3), "I", new WidgetPointer(686,16)); + setScriptCallOnMouseExit(93, new WidgetPointer(-32768,3), "I", new WidgetPointer(686,16)); + setScriptCallOnClickContextMenu(69, 1, new WidgetPointer(686,9), "1I", new WidgetPointer(686,16)); + script_2003(); + setScriptCallOnConfigChange(961, 1195, 1, "Y", new WidgetPointer(686,1)); + setScriptCallOnSkillChange(961, 19, 1, "Y", new WidgetPointer(686,1)); + return; +} diff --git a/dumps/scripts/961.cs2 b/dumps/scripts/961.cs2 new file mode 100644 index 000000000..45b7bd8d9 --- /dev/null +++ b/dumps/scripts/961.cs2 @@ -0,0 +1,4 @@ +void script_961() { + script_2003(); + return; +} diff --git a/dumps/scripts/962.cs2 b/dumps/scripts/962.cs2 new file mode 100644 index 000000000..f422adcbd --- /dev/null +++ b/dumps/scripts/962.cs2 @@ -0,0 +1,52 @@ +void script_962(int arg0) { + globalint_157 = 1; + if (globalint_125 >= subtract(getClientCycle(), 5)) { + return; + } + if (arg0 == 48103425) { + switch (globalint_122) { + case 0: + globalint_122 = 1536; + break; + case 512: + globalint_122 = 0; + break; + case 1024: + globalint_122 = 1024; + break; + default: + globalint_122 = 512; + } + } else if (arg0 == 48103430) { + switch (globalint_123) { + case 0: + globalint_123 = 1536; + break; + case 512: + globalint_123 = 0; + break; + case 1024: + globalint_123 = 1024; + break; + default: + globalint_123 = 512; + } + } else { + if (arg0 == 48103435) { + switch (globalint_124) { + case 0: + globalint_124 = 1536; + break; + case 512: + globalint_124 = 0; + break; + case 1024: + globalint_124 = 1024; + break; + default: + globalint_124 = 512; + } + } + } + return; +} diff --git a/dumps/scripts/963.cs2 b/dumps/scripts/963.cs2 new file mode 100644 index 000000000..c26d56804 --- /dev/null +++ b/dumps/scripts/963.cs2 @@ -0,0 +1,52 @@ +void script_963(int arg0) { + globalint_157 = 1; + if (globalint_125 >= subtract(getClientCycle(), 5)) { + return; + } + if (arg0 == 48103425) { + switch (globalint_122) { + case 0: + globalint_122 = 512; + break; + case 512: + globalint_122 = 1024; + break; + case 1024: + globalint_122 = 1536; + break; + default: + globalint_122 = 0; + } + } else if (arg0 == 48103430) { + switch (globalint_123) { + case 0: + globalint_123 = 512; + break; + case 512: + globalint_123 = 1024; + break; + case 1024: + globalint_123 = 1536; + break; + default: + globalint_123 = 0; + } + } else { + if (arg0 == 48103435) { + switch (globalint_124) { + case 0: + globalint_124 = 512; + break; + case 512: + globalint_124 = 1024; + break; + case 1024: + globalint_124 = 1536; + break; + default: + globalint_124 = 0; + } + } + } + return; +} diff --git a/dumps/scripts/964.cs2 b/dumps/scripts/964.cs2 new file mode 100644 index 000000000..deb56eefe --- /dev/null +++ b/dumps/scripts/964.cs2 @@ -0,0 +1,61 @@ +void script_964() { + flow_0: + SWITCH (bitconfig_2341) { + case 1: + GOTO flow_1 + case 2: + GOTO flow_2 + case 3: + GOTO flow_3 + } + globalint_122 = 0; + GOTO flow_4 + flow_1: + globalint_122 = 1536; + GOTO flow_4 + flow_2: + globalint_122 = 1024; + GOTO flow_4 + flow_3: + globalint_122 = 512; + flow_4: + SWITCH (bitconfig_2342) { + case 1: + GOTO flow_5 + case 2: + GOTO flow_6 + case 3: + GOTO flow_7 + } + globalint_123 = 0; + GOTO flow_8 + flow_5: + globalint_123 = 1536; + GOTO flow_8 + flow_6: + globalint_123 = 1024; + GOTO flow_8 + flow_7: + globalint_123 = 512; + flow_8: + SWITCH (bitconfig_2343) { + case 1: + GOTO flow_9 + case 2: + GOTO flow_10 + case 3: + GOTO flow_11 + } + globalint_124 = 0; + GOTO flow_12 + flow_9: + globalint_124 = 1536; + GOTO flow_12 + flow_10: + globalint_124 = 1024; + GOTO flow_12 + flow_11: + globalint_124 = 512; + flow_12: + return; +} diff --git a/dumps/scripts/965.cs2 b/dumps/scripts/965.cs2 new file mode 100644 index 000000000..4f17c78f1 --- /dev/null +++ b/dumps/scripts/965.cs2 @@ -0,0 +1,29 @@ +void script_965(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6,int arg7,int arg8,int arg9,int arg10,int arg11,int arg12,int arg13,int arg14,int arg15,int arg16) { + script_966(arg0, globalint_122); + script_966(arg1, globalint_122); + script_966(arg2, globalint_122); + script_966(arg3, globalint_122); + script_966(arg4, globalint_122); + script_966(arg5, globalint_123); + script_966(arg6, globalint_123); + script_966(arg7, globalint_123); + script_966(arg8, globalint_123); + script_966(arg9, globalint_123); + script_966(arg10, globalint_124); + script_966(arg11, globalint_124); + script_966(arg12, globalint_124); + script_966(arg13, globalint_124); + script_966(arg14, globalint_124); + if (globalint_125 < getClientCycle()) { + setWidgetIsHidden(false, new WidgetPointer(arg15)); + setWidgetIsHidden(true, new WidgetPointer(arg16)); + } else { + if ((globalint_156 <= getClientCycle()) && ((boolean)globalint_157)) { + playSoundEffect2False(7540, 1, 0, 100, cs2method_4019(15, 15)); + globalint_156 = add(getClientCycle(), 30); + } + setWidgetIsHidden(true, new WidgetPointer(arg15)); + setWidgetIsHidden(false, new WidgetPointer(arg16)); + } + return; +} diff --git a/dumps/scripts/966.cs2 b/dumps/scripts/966.cs2 new file mode 100644 index 000000000..abd26dbcd --- /dev/null +++ b/dumps/scripts/966.cs2 @@ -0,0 +1,9 @@ +void script_966(int arg0,int arg1) { + int ivar2; + ivar2 = cs2method2607(new WidgetPointer(arg0)); + if (ivar2 != arg1) { + setWidget3DRotation(0, 0, getWidgetRotateX(new WidgetPointer(arg0)), getWidgetRotateY(new WidgetPointer(arg0)), script_967(ivar2, arg1), getWidget3DDistance(new WidgetPointer(arg0)), new WidgetPointer(arg0)); + globalint_125 = getClientCycle(); + } + return; +} diff --git a/dumps/scripts/967.cs2 b/dumps/scripts/967.cs2 new file mode 100644 index 000000000..cfc6af312 --- /dev/null +++ b/dumps/scripts/967.cs2 @@ -0,0 +1,18 @@ +int script_967(int arg0,int arg1) { + if (arg1 > arg0) { + if (subtract(arg1, arg0) <= 1024) { + return min(add(arg0, 6), arg1); + } + if (arg0 >= 6) { + return subtract(arg0, 6); + } + return max(script_686(subtract(arg0, 6), 2048), arg1); + } + if (subtract(arg0, arg1) <= 1024) { + return max(subtract(arg0, 6), arg1); + } + if (arg0 < subtract(2048, 6)) { + return add(arg0, 6); + } + return min(mod(add(arg0, 6), 2048), arg1); +} diff --git a/dumps/scripts/968.cs2 b/dumps/scripts/968.cs2 new file mode 100644 index 000000000..3fb31c65b --- /dev/null +++ b/dumps/scripts/968.cs2 @@ -0,0 +1,8 @@ +void script_968(int arg0) { + if (((boolean)script_970(arg0))) { + setScriptCallOnGameloop(969, new WidgetPointer(arg0), "I", new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/969.cs2 b/dumps/scripts/969.cs2 new file mode 100644 index 000000000..cba47d02a --- /dev/null +++ b/dumps/scripts/969.cs2 @@ -0,0 +1,20 @@ +void script_969(int arg0) { + int ivar1; + ivar1 = mod(getClientCycle(), 32); + if (((boolean)script_970(arg0))) { + if (getWidgetShadeColor(new WidgetPointer(arg0)) != 0) { + cs2method2103(0, new WidgetPointer(arg0)); + } else { + setScriptCallOnGameloop(-1, "", new WidgetPointer(arg0)); + } + } else if (ivar1 < 8) { + cs2method2103(0, new WidgetPointer(arg0)); + } else if (ivar1 < 16) { + cs2method2103(85, new WidgetPointer(arg0)); + } else if (ivar1 < 24) { + cs2method2103(255, new WidgetPointer(arg0)); + } else { + cs2method2103(85, new WidgetPointer(arg0)); + } + return; +} diff --git a/dumps/scripts/97.cs2 b/dumps/scripts/97.cs2 new file mode 100644 index 000000000..9d693bb57 --- /dev/null +++ b/dumps/scripts/97.cs2 @@ -0,0 +1,4 @@ +void script_97(int arg0) { + script_915(arg0); + return; +} diff --git a/dumps/scripts/970.cs2 b/dumps/scripts/970.cs2 new file mode 100644 index 000000000..ee2a07921 --- /dev/null +++ b/dumps/scripts/970.cs2 @@ -0,0 +1,78 @@ +int script_970(int arg0) { + if ((arg0 == 20971715) && ((boolean)bitconfig_4732)) { + return 1; + } + if ((arg0 == 20971526) && ((boolean)bitconfig_4733)) { + return 1; + } + if ((arg0 == 20971543) && ((boolean)bitconfig_4734)) { + return 1; + } + if ((arg0 == 20971567) && ((boolean)bitconfig_4735)) { + return 1; + } + if ((arg0 == 20971591) && ((boolean)bitconfig_4736)) { + return 1; + } + if ((arg0 == 20971608) && ((boolean)bitconfig_4737)) { + return 1; + } + if ((arg0 == 20971708) && ((boolean)bitconfig_4738)) { + return 1; + } + if ((arg0 == 20971534) && ((boolean)bitconfig_4739)) { + return 1; + } + if ((arg0 == 20971551) && ((boolean)bitconfig_4740)) { + return 1; + } + if ((arg0 == 20971575) && ((boolean)bitconfig_4741)) { + return 1; + } + if ((arg0 == 20971599) && ((boolean)bitconfig_4742)) { + return 1; + } + if ((arg0 == 20971616) && ((boolean)bitconfig_4743)) { + return 1; + } + if ((arg0 == 20971701) && ((boolean)bitconfig_4744)) { + return 1; + } + if ((arg0 == 20971694) && ((boolean)bitconfig_4745)) { + return 1; + } + if ((arg0 == 20971559) && ((boolean)bitconfig_4746)) { + return 1; + } + if ((arg0 == 20971583) && ((boolean)bitconfig_4747)) { + return 1; + } + if ((arg0 == 20971687) && ((boolean)bitconfig_4748)) { + return 1; + } + if ((arg0 == 20971680) && ((boolean)bitconfig_4749)) { + return 1; + } + if ((arg0 == 20971625) && ((boolean)bitconfig_4750)) { + return 1; + } + if ((arg0 == 20971633) && ((boolean)bitconfig_4751)) { + return 1; + } + if ((arg0 == 20971641) && ((boolean)bitconfig_4752)) { + return 1; + } + if ((arg0 == 20971649) && ((boolean)bitconfig_4753)) { + return 1; + } + if ((arg0 == 20971657) && ((boolean)bitconfig_4754)) { + return 1; + } + if ((arg0 == 20971665) && ((boolean)bitconfig_4755)) { + return 1; + } + if ((arg0 == 20971673) && ((boolean)bitconfig_7756)) { + return 1; + } + return 0; +} diff --git a/dumps/scripts/971.cs2 b/dumps/scripts/971.cs2 new file mode 100644 index 000000000..adc1b2bd7 --- /dev/null +++ b/dumps/scripts/971.cs2 @@ -0,0 +1,6 @@ +void script_971() { + if (bitconfig_4757 > 0) { + setWidgetSprite(cs2method_3408(105, 100, 1478, bitconfig_4757), new WidgetPointer(740,4)); + } + return; +} diff --git a/dumps/scripts/972.cs2 b/dumps/scripts/972.cs2 new file mode 100644 index 000000000..e5f24f993 --- /dev/null +++ b/dumps/scripts/972.cs2 @@ -0,0 +1,4 @@ +void script_972() { + script_973(); + return; +} diff --git a/dumps/scripts/973.cs2 b/dumps/scripts/973.cs2 new file mode 100644 index 000000000..84d9ee829 --- /dev/null +++ b/dumps/scripts/973.cs2 @@ -0,0 +1,284 @@ +void script_973() { + int ivar0; + int ivar1; + int ivar2; + int ivar3; + int ivar4; + int ivar5; + int ivar6; + int ivar7; + int ivar8; + int ivar9; + int ivar10; + int ivar11; + int ivar12; + int ivar13; + int ivar14; + int ivar15; + int ivar16; + string svar0; + string svar1; + string svar2; + int stack_dump0; + cs2func_script_976_struct(2,1,0) structdump_1; + int stack_dump2; + cs2func_script_1023_struct(2,1,0) structdump_3; + cs2func_script_12_struct(1,1,0) structdump_4; + cs2func_script_13_struct(1,1,0) structdump_5; + int stack_dump6; + cs2func_script_1567_struct(2,2,0) structdump_7; + cs2func_script_14_struct(2,2,0) structdump_8; + ivar0 = bitconfig_4729; + if ((bitconfig_4729 < 1) || (bitconfig_4729 > 25)) { + return; + } + svar0 = getCommonString(1477, ivar0); + ivar1 = cs2method_3408(105, 83, 681, ivar0); + ivar2 = cs2method_3408(105, 100, 1478, ivar0); + ivar3 = 1; + ivar4 = 1; + switch (ivar0) { + case 1: + ivar4 = globalint_1469; + break; + case 2: + ivar4 = globalint_1470; + break; + case 5: + ivar4 = globalint_1471; + break; + case 3: + ivar4 = globalint_1472; + break; + case 7: + ivar4 = globalint_1473; + break; + case 4: + ivar4 = globalint_1474; + break; + case 6: + ivar4 = globalint_1475; + break; + case 8: + ivar4 = globalint_1476; + break; + case 9: + ivar4 = globalint_1477; + break; + case 10: + ivar4 = globalint_1478; + break; + case 11: + ivar4 = globalint_1479; + break; + case 19: + ivar4 = globalint_1480; + break; + case 13: + ivar4 = globalint_1481; + break; + case 14: + ivar4 = globalint_1482; + break; + case 15: + ivar4 = globalint_1483; + break; + case 16: + ivar4 = globalint_1484; + break; + case 17: + ivar4 = globalint_1485; + break; + case 18: + ivar4 = globalint_1486; + break; + case 12: + ivar4 = globalint_1487; + break; + case 20: + ivar4 = globalint_1488; + break; + case 21: + ivar4 = globalint_1489; + break; + case 22: + ivar4 = globalint_1490; + break; + case 23: + ivar4 = globalint_1491; + break; + case 24: + ivar4 = globalint_1492; + break; + case 25: + ivar4 = globalint_1493; + } + if (add(ivar4, 1) != getSkillActualLvl(ivar1)) { + svar0 = getCommonString(3644, ivar0) + intToStr(subtract(getSkillActualLvl(ivar1), ivar4)) + getCommonString(3645, ivar0); + } + setWidgetText(new WidgetPointer(741,4), svar0); + setWidgetText(new WidgetPointer(741,6), "You have now reached level " + intToStr(getSkillActualLvl(ivar1)) + "."); + setWidgetSprite(ivar2, new WidgetPointer(741,7)); + ivar5 = 0; + ivar6 = 0; + ivar7 = 0; + svar1 = ""; + ivar8 = 0; + ivar9 = -1; + ivar10 = 2287; + ivar11 = ivar10; + ivar12 = 0; + deleteAllExtraChilds(new WidgetPointer(741,2)); + deleteAllExtraChilds(new WidgetPointer(741,3)); + if ((standart_config_281 < 1000) && (getSkillActualLvl(ivar1) == 3)) { + svar1 = "" + "You've now reached the highest skill level that you can achieve during the tutorial. Once you finish the tutorial, you can advance this skill even further!"; + ivar7 = script_974(ivar5, ivar6, 7620, ivar10, 0, 0, svar1); + setWidgetText(svar1); + ivar6 = script_975(ivar6, ivar7); + ivar5 = add(2, ivar5); + } + if (((boolean)bitconfig_4730)) { + svar1 = "" + "Well done! You've reached the total level " + intToStr(cs2method_3408(105, 105, 1475, bitconfig_4728)) + " milestone!"; + ivar7 = script_974(ivar5, ivar6, 7620, ivar10, 0, 0, svar1); + setWidgetText(svar1); + ivar6 = script_975(ivar6, ivar7); + ivar5 = add(2, ivar5); + } + ivar8 = 0; + svar1 = "null"; + ivar9 = 7620; + if (((((((((boolean)ivar0) || (ivar0 == 2)) || (ivar0 == 5)) || (ivar0 == 3)) || (ivar0 == 7)) || (ivar0 == 4)) || (ivar0 == 6)) || (ivar0 == 24)) { + if (((boolean)bitconfig_4731)) { + svar1 = "" + "Well done! You've reached the Combat level " + intToStr(cs2method_3408(105, 105, 1473, bitconfig_4727)) + " milestone!"; + ivar7 = script_974(ivar5, ivar6, 7620, ivar10, 0, 0, svar1); + setWidgetText(svar1); + ivar6 = script_975(ivar6, ivar7); + ivar5 = add(2, ivar5); + } + if (((boolean)bitconfig_5395) && (ivar9 != -1)) { + while (true) { + stack_dump0 = ivar8; + structdump_1 = script_976(stack_dump0); + svar1 = structdump_1.stringpart_0; + ivar9 = structdump_1.intpart_1; + ivar12 = structdump_1.intpart_0; + if (ivar12 == script_1432()) { + ivar7 = script_974(ivar5, ivar6, ivar9, ivar10, 0, 0, svar1); + setWidgetText(svar1); + ivar6 = script_975(ivar6, ivar7); + ivar5 = add(2, ivar5); + } + ivar8 = add(ivar8, 1); + } + } + } + svar1 = ""; + ivar9 = 7620; + ivar13 = 0; + ivar8 = 0; + while (ivar13 != -1) { + ivar13 = 0; + stack_dump0 = ivar1; + stack_dump2 = ivar8; + structdump_3 = script_1023(stack_dump0, stack_dump2); + ivar13 = structdump_3.intpart_1; + ivar9 = structdump_3.intpart_0; + svar1 = structdump_3.stringpart_0; + if (((boolean)ivar13)) { + ivar7 = script_974(ivar5, ivar6, ivar9, ivar10, 0, 0, svar1); + setWidgetText(svar1); + ivar6 = script_975(ivar6, ivar7); + ivar5 = add(2, ivar5); + ivar3 = 0; + } + ivar8 = add(ivar8, 1); + } + ivar11 = ivar10; + ivar9 = 7620; + svar1 = ""; + ivar8 = 0; + ivar14 = 0; + ivar15 = 0; + ivar16 = 0; + svar2 = ""; + stack_dump0 = ivar0; + structdump_4 = script_12(stack_dump0); + ivar14 = structdump_4.intpart_0; + svar0 = structdump_4.stringpart_0; + while (ivar8 < ivar14) { + flow_49: + stack_dump0 = ivar0; + stack_dump2 = ivar8; + structdump_5 = script_13(stack_dump0, stack_dump2); + ivar15 = structdump_5.intpart_0; + svar0 = structdump_5.stringpart_0; + ivar16 = 0; + ivar9 = 7620; + ivar11 = ivar10; + IF (((boolean)script_1566(ivar0, ivar8))) + GOTO flow_51 + GOTO flow_57 + flow_51: + IF (ivar11 != -1) + GOTO flow_52 + GOTO flow_56 + flow_52: + stack_dump0 = ivar0; + stack_dump2 = ivar8; + stack_dump6 = ivar16; + structdump_7 = script_1567(stack_dump0, stack_dump2, stack_dump6); + svar1 = structdump_7.stringpart_1; + svar2 = structdump_7.stringpart_0; + ivar11 = structdump_7.intpart_1; + ivar12 = structdump_7.intpart_0; + if ((ivar12 <= getSkillActualLvl(ivar1)) && (ivar12 > ivar4)) { + ivar7 = script_974(ivar5, ivar6, ivar9, ivar11, ivar0, ivar8, svar1); + setWidgetText(svar1); + ivar6 = script_975(ivar6, ivar7); + ivar5 = add(2, ivar5); + ivar3 = 0; + } + ivar16 = add(ivar16, 1); + GOTO flow_51 + flow_56: + ivar8 = add(ivar8, 1); + GOTO flow_63 + flow_57: + IF (ivar9 != -1) + GOTO flow_58 + GOTO flow_62 + flow_58: + stack_dump0 = ivar0; + stack_dump2 = ivar8; + stack_dump6 = ivar16; + structdump_8 = script_14(stack_dump0, stack_dump2, stack_dump6); + svar1 = structdump_8.stringpart_1; + svar2 = structdump_8.stringpart_0; + ivar9 = structdump_8.intpart_1; + ivar12 = structdump_8.intpart_0; + if ((ivar12 <= getSkillActualLvl(ivar1)) && (ivar12 > ivar4)) { + ivar7 = script_974(ivar5, ivar6, ivar9, ivar11, ivar0, ivar8, svar1); + setWidgetText(svar1); + ivar6 = script_975(ivar6, ivar7); + ivar5 = add(2, ivar5); + ivar3 = 0; + } + ivar16 = add(ivar16, 1); + GOTO flow_57 + flow_62: + ivar8 = add(ivar8, 1); + flow_63: + } + if (((boolean)ivar3)) { + svar1 = concat(script_4242(ivar0), "Check out the skill advance guide to see what you'll be able to do when you reach even higher levels..."); + ivar7 = script_974(ivar5, ivar6, 7620, ivar10, 0, 0, svar1); + setWidgetText(svar1); + ivar6 = script_975(ivar6, ivar7); + } + cs2method2100(0, 0, new WidgetPointer(741,2)); + setWidgetScrollMax(296, ivar6, new WidgetPointer(741,2)); + if (ivar6 > 160) { + script_31(48562179, 48562178, 798, 795, 796, 797, 793, 794); + } + return; +} diff --git a/dumps/scripts/974.cs2 b/dumps/scripts/974.cs2 new file mode 100644 index 000000000..1fab0cd9f --- /dev/null +++ b/dumps/scripts/974.cs2 @@ -0,0 +1,42 @@ +int script_974(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,string arg6) { + int ivar6; + int ivar7; + ivar6 = 0; + ivar7 = 2287; + createExtraChild(new WidgetPointer(741,2), 5, arg0); + if (((boolean)script_1566(arg4, arg5))) { + if (arg4 == 7) { + setWidgetSize(30, 30, 0, 0); + } else if (arg4 == 4) { + setWidgetSize(24, 24, 0, 0); + } else { + setWidgetSize(36, 32, 0, 0); + } + setWidgetBorderThickness(0); + if (arg3 != -1) { + setWidgetSprite(arg3); + } else { + setWidgetSprite(ivar7); + } + } else if ((arg2 == 18637) || (arg2 == 18638)) { + setWidgetSize(24, 24, 0, 0); + setWidgetBorderThickness(0); + if (arg2 == 18637) { + setWidgetSprite(3057); + } else { + setWidgetSprite(3056); + } + } else if (arg2 != -1) { + setItemOnWidgetMethod1200(arg2, -1); + } else { + setItemOnWidgetMethod1200(7620, -1); + } + setWidgetSize(36, 32, 0, 0); + setWidgetBorderThickness(1); + setWidgetShadowColor(new Color(96, 78, 50)); + setWidgetPosition(0, arg1, 0, 0); + createExtraChild(new WidgetPointer(741,2), 4, add(arg0, 1)); + ivar6 = getLineCount(300, 495, arg6); + setWidgetSize(300, multiply(ivar6, 16), 0, 0); + return ivar6; +} diff --git a/dumps/scripts/975.cs2 b/dumps/scripts/975.cs2 new file mode 100644 index 000000000..a9cfc911f --- /dev/null +++ b/dumps/scripts/975.cs2 @@ -0,0 +1,13 @@ +int script_975(int arg0,int arg1) { + setWidgetPosition(50, arg0, 0, 0); + setWidgetTextAlignment(0, 0, 16); + setWidgetRGB(new Color(70, 50, 10)); + setWidgetFont(495); + setWidgetUnknownBoolean(false); + if (multiply(arg1, 16) < 32) { + arg0 = add(arg0, 32); + } else { + arg0 = add(arg0, add(multiply(arg1, 16), 5)); + } + return arg0; +} diff --git a/dumps/scripts/976.cs2 b/dumps/scripts/976.cs2 new file mode 100644 index 000000000..6e204ce40 --- /dev/null +++ b/dumps/scripts/976.cs2 @@ -0,0 +1,25 @@ +cs2func_script_976_struct(2,1,0) script_976(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_976_struct(3, 4155, "Members now have the Combat level required to request Slayer tasks from the Burthorpe Slayer Master."); + case 1: + return newstruct cs2func_script_976_struct(20, 4155, "Members now have the Combat level required to request Slayer tasks from Mazchna."); + case 2: + return newstruct cs2func_script_976_struct(40, 4155, "Members now have the Combat level required to request Slayer tasks from Vannaka."); + case 3: + return newstruct cs2func_script_976_struct(40, 11673, "Members now have the Combat level required to board the novice lander in Pest Control."); + case 4: + return newstruct cs2func_script_976_struct(70, 4155, "Members now have the Combat level required to request Slayer tasks from Chaeldar."); + case 5: + return newstruct cs2func_script_976_struct(70, 11673, "Members now have the Combat level required to board the intermediate lander in Pest Control."); + case 6: + return newstruct cs2func_script_976_struct(85, 6513, "Members now have the Combat level required to start Dream Mentor."); + case 7: + return newstruct cs2func_script_976_struct(85, 6513, "Members now have the Combat level required to start Smoking Kills."); + case 8: + return newstruct cs2func_script_976_struct(100, 4155, "Members now have the Combat level required to request Slayer tasks from the Shilo Village Slayer Master. (Level 50 Slayer is also required.)"); + case 9: + return newstruct cs2func_script_976_struct(100, 11673, "Members now have the Combat level required to board the veteran lander in Pest Control."); + } + return newstruct cs2func_script_976_struct(-1, -1, ""); +} diff --git a/dumps/scripts/977.cs2 b/dumps/scripts/977.cs2 new file mode 100644 index 000000000..49c4b705c --- /dev/null +++ b/dumps/scripts/977.cs2 @@ -0,0 +1,35 @@ +cs2func_script_977_struct(1,1,0) script_977(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_977_struct(0, "Bronze"); + case 1: + return newstruct cs2func_script_977_struct(0, "Iron"); + case 2: + return newstruct cs2func_script_977_struct(0, "Steel"); + case 3: + return newstruct cs2func_script_977_struct(0, "Black"); + case 4: + return newstruct cs2func_script_977_struct(1, "White"); + case 5: + return newstruct cs2func_script_977_struct(0, "Mithril"); + case 6: + return newstruct cs2func_script_977_struct(0, "Adamant"); + case 7: + return newstruct cs2func_script_977_struct(0, "Rune"); + case 8: + return newstruct cs2func_script_977_struct(0, "Dragon"); + case 9: + return newstruct cs2func_script_977_struct(1, "Barrows"); + case 10: + return newstruct cs2func_script_977_struct(0, "Magic"); + case 11: + return newstruct cs2func_script_977_struct(0, "Equipment"); + case 12: + return newstruct cs2func_script_977_struct(1, "Minigames"); + case 13: + return newstruct cs2func_script_977_struct(0, "Dungeoneering"); + case 14: + return newstruct cs2func_script_977_struct(0, "Milestones"); + } + return newstruct cs2func_script_977_struct(-1, ""); +} diff --git a/dumps/scripts/978.cs2 b/dumps/scripts/978.cs2 new file mode 100644 index 000000000..40962746b --- /dev/null +++ b/dumps/scripts/978.cs2 @@ -0,0 +1,1269 @@ +cs2func_script_978_struct(2,2,0) script_978(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(1, 1173, "Bronze square shield", "You can now wield " + "" + "bronze square shields" + "" + "."); + case 1: + return newstruct cs2func_script_978_struct(1, 1189, "Bronze kiteshield", "You can now wield " + "" + "bronze kiteshields" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(1, 1139, "Bronze medium helm", "You can now wear " + "" + "bronze medium helms" + "" + "."); + case 3: + return newstruct cs2func_script_978_struct(1, 1155, "Bronze full helm", "You can now wear " + "" + "bronze full helms" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(1, 1103, "Bronze chainbody", "You can now wear " + "" + "bronze chainbodies" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(1, 1117, "Bronze platebody", "You can now wear " + "" + "bronze platebodies" + "" + "."); + case 6: + return newstruct cs2func_script_978_struct(1, 1087, "Bronze plateskirt", "You can now wear " + "" + "bronze plateskirts" + "" + "."); + case 7: + return newstruct cs2func_script_978_struct(1, 1075, "Bronze platelegs", "You can now wear " + "" + "bronze platelegs" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(1, 4119, "Members: Bronze boots", "Members can now wear " + "" + "bronze boots" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(1, 8844, "Members: Bronze defender", "Members can now wield " + "" + "bronze defenders" + "" + "."); + case 10: + return newstruct cs2func_script_978_struct(1, 12985, "Bronze gauntlets", "You can now wear " + "" + "bronze gauntlets" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(1, 1175, "Iron square shield", "You can now wield " + "" + "iron square shields" + "" + "."); + case 1: + return newstruct cs2func_script_978_struct(1, 1191, "Iron kiteshield", "You can now wield " + "" + "iron kiteshields" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(1, 1137, "Iron medium helm", "You can now wear " + "" + "iron medium helms" + "" + "."); + case 3: + return newstruct cs2func_script_978_struct(1, 1153, "Iron full helm", "You can now wear " + "" + "iron full helms" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(1, 1101, "Iron chainbody", "You can now wear " + "" + "iron chainbodies" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(1, 1115, "Iron platebody", "You can now wear " + "" + "iron platebodies" + "" + "."); + case 6: + return newstruct cs2func_script_978_struct(1, 1081, "Iron plateskirt", "You can now wear " + "" + "iron plateskirts" + "" + "."); + case 7: + return newstruct cs2func_script_978_struct(1, 1067, "Iron platelegs", "You can now wear " + "" + "iron platelegs" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(1, 4121, "Members: Iron boots", "Members can now wear " + "" + "iron boots" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(1, 8845, "Members: Iron defender", "Members can now wield " + "" + "iron defenders" + "" + "."); + case 10: + return newstruct cs2func_script_978_struct(1, 12988, "Iron gauntlets", "You can now wear " + "" + "iron gauntlets" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(5, 1177, "Steel square shield", "You can now wield " + "" + "steel square shields" + "" + "."); + case 1: + return newstruct cs2func_script_978_struct(5, 1193, "Steel kiteshield", "You can now wield " + "" + "steel kiteshields" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(5, 1141, "Steel medium helm", "You can now wear " + "" + "steel medium helms" + "" + "."); + case 3: + return newstruct cs2func_script_978_struct(5, 1157, "Steel full helm", "You can now wear " + "" + "steel full helms" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(5, 1105, "Steel chainbody", "You can now wear " + "" + "steel chainbodies" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(5, 1119, "Steel platebody", "You can now wear " + "" + "steel platebodies" + "" + "."); + case 6: + return newstruct cs2func_script_978_struct(5, 1083, "Steel plateskirt", "You can now wear " + "" + "steel plateskirts" + "" + "."); + case 7: + return newstruct cs2func_script_978_struct(5, 1069, "Steel platelegs", "You can now wear " + "" + "steel platelegs" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(5, 4123, "Members: Steel boots", "Members can now wear " + "" + "steel boots" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(5, 8846, "Members: Steel defender" + "
" + " (with 5 Attack)", "Members now have the Defence level required to wield " + "" + "steel defenders" + "" + ". (They also need level 5 Attack.)"); + case 10: + return newstruct cs2func_script_978_struct(5, 12991, "Steel gauntlets", "You can now wear " + "" + "steel gauntlets" + "" + "."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(10, 1179, "Black square shield", "You can now wield " + "" + "black square shields" + "" + "."); + case 1: + return newstruct cs2func_script_978_struct(10, 1195, "Black kiteshield", "You can now wield " + "" + "black kiteshields" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(10, 1151, "Black medium helm", "You can now wear " + "" + "black medium helms" + "" + "."); + case 3: + return newstruct cs2func_script_978_struct(10, 1165, "Black full helm", "You can now wear " + "" + "black full helms" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(10, 1107, "Black chainbody", "You can now wear " + "" + "black chainbodies" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(10, 1125, "Black platebody", "You can now wear " + "" + "black platebodies" + "" + "."); + case 6: + return newstruct cs2func_script_978_struct(10, 1089, "Black plateskirt", "You can now wear " + "" + "black plateskirts" + "" + "."); + case 7: + return newstruct cs2func_script_978_struct(10, 1077, "Black platelegs", "You can now wear " + "" + "black platelegs" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(10, 4125, "Members: Black boots", "Members can now wear " + "" + "black boots" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(10, 8847, "Members: Black defender" + "
" + " (with 10 Attack)", "Members now have the Defence level required to wield " + "" + "black defenders" + "" + ". (They also need level 10 Attack.)"); + case 10: + return newstruct cs2func_script_978_struct(10, 12994, "Black gauntlets", "You can now wear " + "" + "black gauntlets" + "" + "."); + case 11: + return newstruct cs2func_script_978_struct(40, 14494, "Members: Elite black full helm", "Members can now wear " + "" + "elite black full helms" + "" + "."); + case 12: + return newstruct cs2func_script_978_struct(40, 14492, "Members: Elite black platebody", "Members can now wear " + "" + "elite black platebodies" + "" + "."); + case 13: + return newstruct cs2func_script_978_struct(40, 14490, "Members: Elite black platelegs", "Members can now wear " + "" + "elite black platelegs" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(-1, 7620, "To use any white equipment, you must have completed Wanted!.", ""); + case 1: + return newstruct cs2func_script_978_struct(10, 6631, "Members: White square shield", "Members can now wield " + "" + "white square shields" + "" + " (after finishing Wanted!)."); + case 2: + return newstruct cs2func_script_978_struct(10, 6633, "Members: White kiteshield", "Members can now wield " + "" + "white kiteshields" + "" + " (after finishing Wanted!)."); + case 3: + return newstruct cs2func_script_978_struct(10, 6621, "Members: White medium helm", "Members can now wear " + "" + "white medium helms" + "" + " (after finishing Wanted!)."); + case 4: + return newstruct cs2func_script_978_struct(10, 6623, "Members: White full helm", "Members can now wear " + "" + "white full helms" + "" + " (after finishing Wanted!)."); + case 5: + return newstruct cs2func_script_978_struct(10, 6615, "Members: White chainbody", "Members can now wear " + "" + "white chainbodies" + "" + " (after finishing Wanted!)."); + case 6: + return newstruct cs2func_script_978_struct(10, 6617, "Members: White platebody", "Members can now wear " + "" + "white platebodies" + "" + " (after finishing Wanted!)."); + case 7: + return newstruct cs2func_script_978_struct(10, 6627, "Members: White plateskirt", "Members can now wear " + "" + "white plateskirts" + "" + " (after finishing Wanted!)."); + case 8: + return newstruct cs2func_script_978_struct(10, 6625, "Members: White platelegs", "Members can now wear " + "" + "white platelegs" + "" + " (after finishing Wanted!)."); + case 9: + return newstruct cs2func_script_978_struct(10, 6619, "Members: White boots", "Members can now wear " + "" + "white boots" + "" + " (after finishing Wanted!)."); + case 10: + return newstruct cs2func_script_978_struct(10, 6629, "Members: White gloves", "Members can now wear " + "" + "white gloves" + "" + " (after finishing Wanted!)."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(20, 1181, "Mithril square shield", "You can now wield " + "" + "mithril square shields" + "" + "."); + case 1: + return newstruct cs2func_script_978_struct(20, 1197, "Mithril kiteshield", "You can now wield " + "" + "mithril kiteshields" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(20, 1143, "Mithril medium helm", "You can now wear " + "" + "mithril medium helms" + "" + "."); + case 3: + return newstruct cs2func_script_978_struct(20, 1159, "Mithril full helm", "You can now wear " + "" + "mithril full helms" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(20, 1109, "Mithril chainbody", "You can now wear " + "" + "mithril chainbodies" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(20, 1121, "Mithril platebody", "You can now wear " + "" + "mithril platebodies" + "" + "."); + case 6: + return newstruct cs2func_script_978_struct(20, 1085, "Mithril plateskirt", "You can now wear " + "" + "mithril plateskirts" + "" + "."); + case 7: + return newstruct cs2func_script_978_struct(20, 1071, "Mithril platelegs", "You can now wear " + "" + "mithril platelegs" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(20, 4127, "Members: Mithril boots", "Members can now wear " + "" + "mithril boots" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(20, 8848, "Members: Defender" + "
" + " (with 20 Attack)", "Members now have the Defence level required to wield " + "" + "mithril defenders" + "" + ". (They also need level 20 Attack.)"); + case 10: + return newstruct cs2func_script_978_struct(20, 12997, "Mithril gauntlets", "You can now wear " + "" + "mithril gauntlets" + "" + "."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(30, 1183, "Adamant square shield", "You can now wield " + "" + "adamant square shields" + "" + "."); + case 1: + return newstruct cs2func_script_978_struct(30, 1199, "Adamant kiteshield", "You can now wield " + "" + "adamant kiteshields" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(30, 1145, "Adamant medium helm", "You can now wear " + "" + "adamant medium helms" + "" + "."); + case 3: + return newstruct cs2func_script_978_struct(30, 1161, "Adamant full helm", "You can now wear " + "" + "adamant full helms" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(30, 1111, "Adamant chainbody", "You can now wear " + "" + "adamant chainbodies" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(30, 1123, "Adamant platebody", "You can now wear " + "" + "adamant platebodies" + "" + "."); + case 6: + return newstruct cs2func_script_978_struct(30, 1091, "Adamant plateskirt", "You can now wear " + "" + "adamant plateskirts" + "" + "."); + case 7: + return newstruct cs2func_script_978_struct(30, 1073, "Adamant platelegs", "You can now wear " + "" + "adamant platelegs" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(30, 4129, "Members: Adamant boots", "Members can now wear " + "" + "adamant boots" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(30, 8849, "Members: Adamant defender" + "
" + " (with 30 Attack)", "Members now have the Defence level required to wield " + "" + "adamant defenders" + "" + ". (They also need level 30 Attack.)"); + case 10: + return newstruct cs2func_script_978_struct(30, 13000, "Adamant gauntlets", "You can now wear " + "" + "adamant gauntlets" + "" + "."); + case 11: + return newstruct cs2func_script_978_struct(35, 12915, "Adamant berserker shield", "You can now wield " + "" + "adamant berserker shields" + "" + "."); + case 12: + return newstruct cs2func_script_978_struct(35, 12908, "Adamant spikeshield", "You can now wield " + "" + "adamant spikeshields" + "" + "."); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(40, 1185, "Rune square shield", "You can now wield " + "" + "rune square shields" + "" + "."); + case 1: + return newstruct cs2func_script_978_struct(40, 1201, "Rune kiteshield", "You can now wield " + "" + "rune kiteshields" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(40, 1147, "Rune medium helm", "You can now wear " + "" + "rune medium helms" + "" + "."); + case 3: + return newstruct cs2func_script_978_struct(40, 1163, "Rune full helm", "You can now wear " + "" + "rune full helms" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(40, 1113, "Rune chainbody", "You can now wear " + "" + "rune chainbodies" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(40, 1127, "Rune platebody" + "
" + " (after Dragon Slayer)", "You can now wear " + "" + "rune platebodies" + "" + " (after Dragon Slayer)."); + case 6: + return newstruct cs2func_script_978_struct(40, 1093, "Rune plateskirt", "You can now wear " + "" + "rune plateskirts" + "" + "."); + case 7: + return newstruct cs2func_script_978_struct(40, 1079, "Rune platelegs", "You can now wear " + "" + "rune platelegs" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(40, 4131, "Members: Rune boots", "Members can now wear " + "" + "rune boots" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(40, 8850, "Members: Rune defender" + "
" + " (with 40 Attack)", "Members now have the Defence level required to wield " + "" + "rune defenders" + "" + ". (They also need level 40 Attack.)"); + case 10: + return newstruct cs2func_script_978_struct(40, 13003, "Rune gauntlets", "You can now wear " + "" + "rune gauntlets" + "" + "."); + case 11: + return newstruct cs2func_script_978_struct(45, 12929, "Rune berserker shield", "You can now wield " + "" + "rune berserker shields" + "" + "."); + case 12: + return newstruct cs2func_script_978_struct(45, 12922, "Rune spikeshield", "You can now wield " + "" + "rune spikeshields" + "" + "."); + } + break; + case 8: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(60, 1187, "Members: Dragon square shield" + "
" + " (after Legends' Quest)", "Members can now wield " + "" + "dragon square shields" + "" + " (after Legends' Quest)."); + case 1: + return newstruct cs2func_script_978_struct(60, 1149, "Members: Dragon medium helm", "Members can now wear " + "" + "dragon medium helms" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(60, 11335, "Members: Dragon full helm", "Members can now wear " + "" + "dragon full helms" + "" + "."); + case 3: + return newstruct cs2func_script_978_struct(60, 3140, "Members: Dragon chainbody", "Members can now wear " + "" + "dragon chainbodies" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(60, 14479, "Members: Dragon platebody", "Members can now wear " + "" + "dragon platebodies" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(60, 4585, "Members: Dragon plateskirt", "Members can now wear " + "" + "dragon plateskirts" + "" + "."); + case 6: + return newstruct cs2func_script_978_struct(60, 4087, "Members: Dragon platelegs", "Members can now wear " + "" + "dragon platelegs" + "" + "."); + case 7: + return newstruct cs2func_script_978_struct(60, 13006, "Members: Dragon gauntlets", "Members can now wear " + "" + "dragon gauntlets" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(60, 11732, "Members: Dragon boots", "Members can now wear " + "" + "dragon boots" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(60, 20072, "Members: Dragon defender" + "
" + " (with 60 Attack)", "Members now have the Defence level required to wield " + "" + "dragon defenders" + "" + ". (They also need level 60 Attack.)"); + case 10: + return newstruct cs2func_script_978_struct(60, 13964, "Corrupt dragon square shield", "You can now wield " + "" + "corrupt dragon square shields" + "" + "."); + case 11: + return newstruct cs2func_script_978_struct(60, 13961, "Corrupt dragon medium helm", "You can now wear " + "" + "corrupt dragon medium helms" + "" + "."); + case 12: + return newstruct cs2func_script_978_struct(60, 13958, "Corrupt dragon chainbody", "You can now wear " + "" + "corrupt dragon chainbodies" + "" + "."); + case 13: + return newstruct cs2func_script_978_struct(60, 13967, "Corrupt dragon plateskirt", "You can now wear " + "" + "corrupt dragon plateskirts" + "" + "."); + case 14: + return newstruct cs2func_script_978_struct(60, 13970, "Corrupt dragon platelegs", "You can now wear " + "" + "corrupt dragon platelegs" + "" + "."); + } + break; + case 9: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(70, 4708, "Members: Ahrim's hood" + "
" + " (with 70 Magic)", "Members now have the Defence level required to wear " + "" + "Ahrim's hood" + "" + ". (They also need level 70 Magic.)"); + case 1: + return newstruct cs2func_script_978_struct(70, 4712, "Members: Ahrim's robe top" + "
" + " (with 70 Magic)", "Members now have the Defence level required to wear " + "" + "Ahrim's robe top" + "" + ". (They also need level 70 Magic.)"); + case 2: + return newstruct cs2func_script_978_struct(70, 4714, "Members: Ahrim's robe skirt" + "
" + " (with 70 Magic)", "Members now have the Defence level required to wear " + "" + "Ahrim's robe skirt" + "" + ". (They also need level 70 Magic.)"); + case 3: + return newstruct cs2func_script_978_struct(70, 4716, "Members: Dharok's helm", "Members can now wear " + "" + "Dharok's helm" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(70, 4720, "Members: Dharok's platebody", "Members can now wear " + "" + "Dharok's platebody" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(70, 4722, "Members: Dharok's platelegs", "Members can now wear " + "" + "Dharok's platelegs" + "" + "."); + case 6: + return newstruct cs2func_script_978_struct(70, 4724, "Members: Guthan's helm", "Members can now wear " + "" + "Guthan's helm" + "" + "."); + case 7: + return newstruct cs2func_script_978_struct(70, 4728, "Members: Guthan's platebody", "Members can now wear " + "" + "Guthan's platebody" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(70, 4730, "Members: Guthan's chainskirt", "Members can now wear " + "" + "Guthan's chainskirt" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(70, 4732, "Members: Karil's coif" + "
" + " (with 70 Ranged)", "Members now have the Defence level required to wear " + "" + "Karil's coif" + "" + ". (They also need level 70 Ranged.)"); + case 10: + return newstruct cs2func_script_978_struct(70, 4736, "Members: Karil's leather top" + "
" + " (with 70 Ranged)", "Members now have the Defence level required to wear " + "" + "Karil's leather top" + "" + ". (They also need level 70 Ranged.)"); + case 11: + return newstruct cs2func_script_978_struct(70, 4738, "Members: Karil's leather skirt" + "
" + " (with 70 Ranged)", "Members now have the Defence level required to wear " + "" + "Karil's leather skirt" + "" + ". (They also need level 70 Ranged.)"); + case 12: + return newstruct cs2func_script_978_struct(70, 4745, "Members: Torag's helm", "Members can now wear " + "" + "Torag's helm" + "" + "."); + case 13: + return newstruct cs2func_script_978_struct(70, 4749, "Members: Torag's platebody", "Members can now wear " + "" + "Torag's platebody" + "" + "."); + case 14: + return newstruct cs2func_script_978_struct(70, 4751, "Members: Torag's platelegs", "Members can now wear " + "" + "Torag's platelegs" + "" + "."); + case 15: + return newstruct cs2func_script_978_struct(70, 4753, "Members: Verac's helm", "Members can now wear " + "" + "Verac's helm" + "" + "."); + case 16: + return newstruct cs2func_script_978_struct(70, 4757, "Members: Verac's brassard", "Members can now wear " + "" + "Verac's brassard" + "" + "."); + case 17: + return newstruct cs2func_script_978_struct(70, 4759, "Members: Verac's plateskirt", "Members can now wear " + "" + "Verac's plateskirt" + "" + "."); + case 18: + return newstruct cs2func_script_978_struct(70, 21736, "Members: Akrisae's hood" + "
" + " (after Ritual of the Mahjarrat and with level 70 Prayer and 70 Magic)", "Members now have the Defence level required to wear " + "" + "Akrisae's hood" + "" + " (after Ritual of the Mahjarrat and with level 70 Prayer and 70 Magic)."); + case 19: + return newstruct cs2func_script_978_struct(70, 21752, "Members: Akrisae's robe top" + "
" + " (after Ritual of the Mahjarrat and with level 70 Prayer and 70 Magic)", "Members now have the Defence level required to wear " + "" + "Akrisae's robe top" + "" + " (after Ritual of the Mahjarrat and with level 70 Prayer and 70 Magic)."); + case 20: + return newstruct cs2func_script_978_struct(70, 21760, "Members: Akrisae's robe skirt" + "
" + " (after Ritual of the Mahjarrat and with level 70 Prayer and 70 Magic)", "Members now have the Defence level required to wear " + "" + "Akrisae's robe skirt" + "" + " (after Ritual of the Mahjarrat and with level 70 Prayer and 70 Magic)."); + } + break; + case 10: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(1, 6153, "Members: Skeletal gloves", "Members can now wear " + "" + "skeletal gloves" + "" + "."); + case 1: + return newstruct cs2func_script_978_struct(1, 6147, "Members: Skeletal boots", "Members can now wear " + "" + "skeletal boots" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(1, 2890, "Members: Elemental equipment" + "
" + " (after Elemental Workshop I)", "Members can now use " + "" + "elemental equipment" + "" + " (after Elemental Workshop I)."); + case 3: + return newstruct cs2func_script_978_struct(1, 9733, "Members: Mind equipment" + "
" + " (after Elemental Workshop II)", "Members can now use " + "" + "mind equipment" + "" + " (after Elemental Workshop II)."); + case 4: + return newstruct cs2func_script_978_struct(10, 12964, "Combat hood" + "
" + " (with 20 Magic)", "You now have the Defence level required to wear " + "" + "combat hoods" + "" + ". (You also need level 20 Magic.)"); + case 5: + return newstruct cs2func_script_978_struct(10, 12971, "Combat robe top" + "
" + " (with 20 Magic)", "You now have the Defence level required to wear " + "" + "combat robe tops" + "" + ". (You also need level 20 Magic.)"); + case 6: + return newstruct cs2func_script_978_struct(10, 12978, "Combat robe bottom" + "
" + " (with 20 Magic)", "You now have the Defence level required to wear " + "" + "combat robe bottoms" + "" + ". (You also need level 20 Magic.)"); + case 7: + return newstruct cs2func_script_978_struct(10, 12887, "Druidic mage hood" + "
" + " (with 20 Magic)", "You now have the Defence level required to wear " + "" + "druidic mage hoods" + "" + ". (You also need level 20 Magic.)"); + case 8: + return newstruct cs2func_script_978_struct(10, 12894, "Druidic mage top" + "
" + " (with 20 Magic)", "You now have the Defence level required to wear " + "" + "druidic mage tops" + "" + ". (You also need level 20 Magic.)"); + case 9: + return newstruct cs2func_script_978_struct(10, 12901, "Druidic mage bottom" + "
" + " (with 20 Magic)", "You now have the Defence level required to wear " + "" + "druidic mage bottoms" + "" + ". (You also need level 20 Magic.)"); + case 10: + return newstruct cs2func_script_978_struct(20, 7400, "Members: Enchanted hat" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "enchanted hats" + "" + ". (They also need level 40 Magic.)"); + case 11: + return newstruct cs2func_script_978_struct(20, 7399, "Members: Enchanted robe top" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "enchanted robe tops" + "" + ". (They also need level 40 Magic.)"); + case 12: + return newstruct cs2func_script_978_struct(20, 7398, "Members: Enchanted robe" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "enchanted robes" + "" + ". (They also need level 40 Magic.)"); + case 13: + return newstruct cs2func_script_978_struct(20, 4089, "Members: Mystic hat" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "mystic hats" + "" + ". (They also need level 40 Magic.)"); + case 14: + return newstruct cs2func_script_978_struct(20, 4091, "Members: Mystic robe top" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "mystic robe tops" + "" + ". (They also need level 40 Magic.)"); + case 15: + return newstruct cs2func_script_978_struct(20, 4093, "Members: Mystic robe" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "mystic robes" + "" + ". (They also need level 40 Magic.)"); + case 16: + return newstruct cs2func_script_978_struct(20, 4095, "Members: Mystic gloves" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "mystic gloves" + "" + ". (They also need level 40 Magic.)"); + case 17: + return newstruct cs2func_script_978_struct(20, 4097, "Members: Mystic boots" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "mystic boots" + "" + ". (They also need level 40 Magic.)"); + case 18: + return newstruct cs2func_script_978_struct(20, 14499, "Members: Dagon'hai hat" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "Dagon'hai hats" + "" + ". (They also need level 40 Magic.)"); + case 19: + return newstruct cs2func_script_978_struct(20, 14497, "Members: Dagon'hai robe top" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "Dagon'hai robe tops" + "" + ". (They also need level 40 Magic.)"); + case 20: + return newstruct cs2func_script_978_struct(20, 14501, "Members: Dagon'hai robe bottom" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "Dagon'hai robe bottoms" + "" + ". (They also need level 40 Magic.)"); + case 21: + return newstruct cs2func_script_978_struct(20, 13938, "Members: Corrupt Zuriel's hood" + "
" + " (with 20 Magic)", "Members now have the Defence level required to wear " + "" + "corrupt Zuriel's hood" + "" + ". (They also need level 20 Magic.)"); + case 22: + return newstruct cs2func_script_978_struct(20, 13932, "Members: Corrupt Zuriel's robe top" + "
" + " (with 20 Magic)", "Members now have the Defence level required to wear " + "" + "corrupt Zuriel's robe top" + "" + ". (They also need level 20 Magic.)"); + case 23: + return newstruct cs2func_script_978_struct(20, 13935, "Members: Corrupt Zuriel's robe bottom" + "
" + " (with 20 Magic)", "Members now have the Defence level required to wear " + "" + "corrupt Zuriel's robe bottom" + "" + ". (They also need level 20 Magic.)"); + case 24: + return newstruct cs2func_script_978_struct(20, 19323, "Members: Dragon staff" + "
" + " (with 40 Magic, 40 Attack and 60 Prayer)", "Members now have the Defence level required to wield " + "" + "dragon staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 60 Prayer.)"); + case 25: + return newstruct cs2func_script_978_struct(20, 19325, "Members: Penguin staff" + "
" + " (with 40 Magic, 40 Attack and 60 Prayer)", "Members now have the Defence level required to wield " + "" + "penguin staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 60 Prayer.)"); + case 26: + return newstruct cs2func_script_978_struct(20, 19327, "Members: Bat staff" + "
" + " (with 40 Magic, 40 Attack and 60 Prayer)", "Members now have the Defence level required to wield " + "" + "bat staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 60 Prayer.)"); + case 27: + return newstruct cs2func_script_978_struct(20, 19329, "Members: Wolf staff" + "
" + " (with 40 Magic, 40 Attack and 60 Prayer)", "Members now have the Defence level required to wield " + "" + "wolf staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 60 Prayer.)"); + case 28: + return newstruct cs2func_script_978_struct(20, 19331, "Members: Cat staff" + "
" + " (with 40 Magic, 40 Attack and 60 Prayer)", "Members now have the Defence level required to wield " + "" + "cat staves" + "" + ". (They also need level 40 Magic, level 40 Attack and level 60 Prayer.)"); + case 29: + return newstruct cs2func_script_978_struct(20, 21509, "Members: Necromancer hood" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "Necromancer hoods" + "" + ". (They also need level 40 Magic.)"); + case 30: + return newstruct cs2func_script_978_struct(20, 21508, "Members: Necromancer robe" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "Necromancer robes" + "" + ". (They also need level 40 Magic.)"); + case 31: + return newstruct cs2func_script_978_struct(20, 21510, "Members: Necromancer legs" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "Necromancer legs" + "" + ". (They also need level 40 Magic.)"); + case 32: + return newstruct cs2func_script_978_struct(25, 6918, "Members: Infinity hat" + "
" + " (with 50 Magic)", "Members now have the Defence level required to wear " + "" + "infinity hats" + "" + ". (They also need level 50 Magic.)"); + case 33: + return newstruct cs2func_script_978_struct(25, 6916, "Members: Infinity top" + "
" + " (with 50 Magic)", "Members now have the Defence level required to wear " + "" + "infinity tops" + "" + ". (They also need level 50 Magic.)"); + case 34: + return newstruct cs2func_script_978_struct(25, 6924, "Members: Infinity bottom" + "
" + " (with 50 Magic)", "Members now have the Defence level required to wear " + "" + "infinity robe bottoms" + "" + ". (They also need level 50 Magic.)"); + case 35: + return newstruct cs2func_script_978_struct(25, 6922, "Members: Infinity gloves" + "
" + " (with 50 Magic)", "Members now have the Defence level required to wear " + "" + "infinity gloves" + "" + ". (They also need level 50 Magic.)"); + case 36: + return newstruct cs2func_script_978_struct(25, 6920, "Members: Infinity boots" + "
" + " (with 50 Magic)", "Members now have the Defence level required to wear " + "" + "infinity boots" + "" + ". (They also need level 50 Magic.)"); + case 37: + return newstruct cs2func_script_978_struct(30, 10342, "Members: Third-Age mage hat" + "
" + " (with 65 Magic)", "Members now have the Defence level required to wear " + "" + "Third-Age mage hats" + "" + ". (They also need level 65 Magic.)"); + case 38: + return newstruct cs2func_script_978_struct(30, 10338, "Members: Third-Age robe top" + "
" + " (with 65 Magic)", "Members now have the Defence level required to wear " + "" + "Third-Age robe tops" + "" + ". (They also need level 65 Magic.)"); + case 39: + return newstruct cs2func_script_978_struct(30, 10340, "Members: Third-Age robe" + "
" + " (with 65 Magic)", "Members now have the Defence level required to wear " + "" + "Third-Age robes" + "" + ". (They also need level 65 Magic.)"); + case 40: + return newstruct cs2func_script_978_struct(30, 10344, "Members: Third-Age amulet" + "
" + " (with 65 Magic)", "Members now have the Defence level required to wear " + "" + "Third-Age amulets" + "" + ". (They also need level 65 Magic.)"); + case 41: + return newstruct cs2func_script_978_struct(33, 18695, "Members: Body equipment (after Elemental Workshop III and with 33 Smithing)", "Members now have the Defence level required to use " + "" + "body equipment" + "" + " (after Elemental Workshop III and with level 33 Smithing)."); + case 42: + return newstruct cs2func_script_978_struct(40, 3385, "Members: Splitbark helm" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "splitbark helms" + "" + ". (They also need level 40 Magic.)"); + case 43: + return newstruct cs2func_script_978_struct(40, 3387, "Members: Splitbark body" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "splitbark body" + "" + ". (They also need level 40 Magic.)"); + case 44: + return newstruct cs2func_script_978_struct(40, 3389, "Members: Splitbark legs" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "splitbark legs" + "" + ". (They also need level 40 Magic.)"); + case 45: + return newstruct cs2func_script_978_struct(40, 3391, "Members: Splitbark gauntlets" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "splitbark gauntlets" + "" + ". (They also need level 40 Magic.)"); + case 46: + return newstruct cs2func_script_978_struct(40, 3393, "Members: Splitbark boots" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "splitbark boots" + "" + ". (They also need level 40 Magic.)"); + case 47: + return newstruct cs2func_script_978_struct(40, 6137, "Members: Skeletal helm" + "
" + " (after Fremennik Trials, with 40 Magic)", "Members now have the Defence level required to wear " + "" + "skeletal helms" + "" + " (after Fremennik Trials and with level 40 Magic)."); + case 48: + return newstruct cs2func_script_978_struct(40, 6139, "Members: Skeletal top" + "
" + " (after Fremennik Trials, with 40 Magic)", "Members now have the Defence level required to wear " + "" + "skeletal tops" + "" + " (after Fremennik Trials and with level 40 Magic)."); + case 49: + return newstruct cs2func_script_978_struct(40, 6141, "Members: Skeletal bottoms" + "
" + " (after Fremennik Trials, with 40 Magic)", "Members now have the Defence level required to wear " + "" + "skeletal bottoms" + "" + " (after Fremennik Trials and with level 40 Magic)."); + case 50: + return newstruct cs2func_script_978_struct(40, 9096, "Members: Lunar helm" + "
" + " (after Lunar Diplomacy, with 65 Magic)", "Members now have the Defence level required to wear " + "" + "lunar helms" + "" + " (after Lunar Diplomacy and with level 65 Magic)."); + case 51: + return newstruct cs2func_script_978_struct(40, 9097, "Members: Lunar torso" + "
" + " (after Lunar Diplomacy, with 65 Magic)", "Members now have the Defence level required to wear " + "" + "lunar torsos" + "" + " (after Lunar Diplomacy and with level 65 Magic)."); + case 52: + return newstruct cs2func_script_978_struct(40, 9099, "Members: Lunar gloves" + "
" + " (after Lunar Diplomacy, with 65 Magic)", "Members now have the Defence level required to wear " + "" + "lunar gloves" + "" + " (after Lunar Diplomacy and with level 65 Magic)."); + case 53: + return newstruct cs2func_script_978_struct(40, 9098, "Members: Lunar legs" + "
" + " (after Lunar Diplomacy, with 65 Magic)", "Members now have the Defence level required to wear " + "" + "lunar legs" + "" + " (after Lunar Diplomacy and with level 65 Magic)."); + case 54: + return newstruct cs2func_script_978_struct(40, 9100, "Members: Lunar boots" + "
" + " (after Lunar Diplomacy, with 65 Magic)", "Members now have the Defence level required to wear " + "" + "lunar boots" + "" + " (after Lunar Diplomacy and with level 65 Magic)."); + case 55: + return newstruct cs2func_script_978_struct(40, 9101, "Members: Lunar cape" + "
" + " (after Lunar Diplomacy, with 65 Magic)", "Members now have the Defence level required to wear " + "" + "lunar capes" + "" + " (after Lunar Diplomacy and with level 65 Magic)."); + case 56: + return newstruct cs2func_script_978_struct(40, 14116, "Members: Sacred clay hat" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "sacred clay hats" + "" + ". (They also need level 40 Magic.)"); + case 57: + return newstruct cs2func_script_978_struct(40, 14114, "Members: Sacred clay robe top" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "sacred clay robe tops" + "" + ". (They also need level 40 Magic.)"); + case 58: + return newstruct cs2func_script_978_struct(40, 14115, "Members: Sacred clay robe bottom" + "
" + " (with 40 Magic)", "Members now have the Defence level required to wear " + "" + "sacred clay robe bottoms" + "" + ". (They also need level 40 Magic.)"); + case 59: + return newstruct cs2func_script_978_struct(40, 20436, "Members: Cosmic shield" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wield " + "" + "cosmic shields" + "" + " (after Elemental Workshop IV)."); + case 60: + return newstruct cs2func_script_978_struct(40, 20440, "Members: Cosmic helmet" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wear " + "" + "cosmic helmets" + "" + " (after Elemental Workshop IV)."); + case 61: + return newstruct cs2func_script_978_struct(40, 20444, "Members: Cosmic body" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wear " + "" + "cosmic bodies" + "" + " (after Elemental Workshop IV)."); + case 62: + return newstruct cs2func_script_978_struct(40, 20464, "Members: Cosmic gloves" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wear " + "" + "cosmic gloves" + "" + " (after Elemental Workshop IV)."); + case 63: + return newstruct cs2func_script_978_struct(40, 20454, "Members: Cosmic boots" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wear " + "" + "cosmic boots" + "" + " (after Elemental Workshop IV)."); + case 64: + return newstruct cs2func_script_978_struct(45, 3755, "Members: Farseer helm" + "
" + " (after Fremennik Trials)", "Members can now wear " + "" + "farseer helms" + "" + " (after Fremennik Trials)."); + case 65: + return newstruct cs2func_script_978_struct(50, 12866, "Members: Battle hood" + "
" + " (with 60 Magic)", "Members now have the Defence level required to wear " + "" + "battle hoods" + "" + ". (They also need level 60 Magic.)"); + case 66: + return newstruct cs2func_script_978_struct(50, 12873, "Members: Battle robe top" + "
" + " (with 60 Magic)", "Members now have the Defence level required to wear " + "" + "battle robe tops" + "" + ". (They also need level 60 Magic.)"); + case 67: + return newstruct cs2func_script_978_struct(50, 12880, "Members: Battle robe bottom" + "
" + " (with 60 Magic)", "Members now have the Defence level required to wear " + "" + "battle robe bottoms" + "" + ". (They also need level 60 Magic.)"); + case 68: + return newstruct cs2func_script_978_struct(50, 20438, "Members: Chaos shield" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wield " + "" + "chaos shields" + "" + " (after Elemental Workshop IV)."); + case 69: + return newstruct cs2func_script_978_struct(50, 20442, "Members: Chaos helmet" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wear " + "" + "chaos helmets" + "" + " (after Elemental Workshop IV)."); + case 70: + return newstruct cs2func_script_978_struct(50, 20446, "Members: Chaos body" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wear " + "" + "chaos bodies" + "" + " (after Elemental Workshop IV)."); + case 71: + return newstruct cs2func_script_978_struct(50, 20466, "Members: Chaos gloves" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wear " + "" + "chaos gloves" + "" + " (after Elemental Workshop IV)."); + case 72: + return newstruct cs2func_script_978_struct(50, 20456, "Members: Chaos boots" + "
" + " (after Elemental Workshop IV)", "Members now have the Defence level required to wear " + "" + "chaos boots" + "" + " (after Elemental Workshop IV)."); + case 73: + return newstruct cs2func_script_978_struct(78, 13864, "Members: Zuriel's hood" + "
" + " (with 78 Magic)", "Members now have the Defence level required to wear " + "" + "Zuriel's hood" + "" + ". (They also need level 78 Magic.)"); + case 74: + return newstruct cs2func_script_978_struct(78, 13858, "Members: Zuriel's robe top" + "
" + " (with 78 Magic)", "Members now have the Defence level required to wear " + "" + "Zuriel's robe top" + "" + ". (They also need level 78 Magic.)"); + case 75: + return newstruct cs2func_script_978_struct(78, 13861, "Members: Zuriel's robe bottom" + "
" + " (with 78 Magic)", "Members now have the Defence level required to wear " + "" + "Zuriel's robe bottom" + "" + ". (They also need level 78 Magic.)"); + case 76: + return newstruct cs2func_script_978_struct(80, 20159, "Members: Virtus mask" + "
" + " (with 80 Magic and Constitution)", "Members can now wear " + "" + "virtus masks" + "" + ". (They also need level 80 Magic and Constitution.)"); + case 77: + return newstruct cs2func_script_978_struct(80, 20163, "Members: Virtus robe top" + "
" + " (with 80 Magic and Constitution)", "Members can now wear " + "" + "virtus robe tops" + "" + ". (They also need level 80 Magic and Constitution.)"); + case 78: + return newstruct cs2func_script_978_struct(80, 20167, "Members: Virtus robe legs" + "
" + " (with 80 Magic and Constitution)", "Members can now wear " + "" + "virtus robe legs" + "" + ". (They also need level 80 Magic and Constitution.)"); + } + break; + case 11: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(1, 1540, "Anti-dragonbreath shield", "You can now wield " + "" + "anti-dragonbreath shields" + "" + "."); + case 1: + return newstruct cs2func_script_978_struct(1, 6149, "Members: Spined gloves", "Members can now wear " + "" + "spined gloves" + "" + "."); + case 2: + return newstruct cs2func_script_978_struct(1, 6143, "Members: Spined boots", "Members can now wear " + "" + "spined boots" + "" + "."); + case 3: + return newstruct cs2func_script_978_struct(1, 6151, "Members: Rock-shell gloves", "Members can now wear " + "" + "rock-shell gloves" + "" + "."); + case 4: + return newstruct cs2func_script_978_struct(1, 6145, "Members: Rock-shell boots", "Members can now wear " + "" + "rock-shell boots" + "" + "."); + case 5: + return newstruct cs2func_script_978_struct(1, 75, "Members: Khazard armour", "Members can now wear " + "" + "Khazard armour" + "" + "."); + case 6: + return newstruct cs2func_script_978_struct(5, 4551, "Members: Spiny helmet", "Members now have the Defence level required to wear " + "" + "spiny helmets" + "" + " to ward off wall beast attacks."); + case 7: + return newstruct cs2func_script_978_struct(5, 4071, "Members: Basic decorative helm", "Members can now wear " + "" + "basic decorative helms" + "" + "."); + case 8: + return newstruct cs2func_script_978_struct(5, 4069, "Members: Basic decorative armour", "Members can now wear " + "" + "basic decorative platebodies" + "" + "."); + case 9: + return newstruct cs2func_script_978_struct(5, 4070, "Members: Basic decorative armour", "Members can now wear " + "" + "basic decorative platelegs" + "" + "."); + case 10: + return newstruct cs2func_script_978_struct(5, 4072, "Members: Basic decorative shield", "Members can now wear " + "" + "basic decorative shields" + "" + "."); + case 11: + return newstruct cs2func_script_978_struct(10, 15490, "Members: Focus sight" + "
" + " (with 20 Ranged)", "Members can now wear " + "" + "focus sights" + "" + "."); + case 12: + return newstruct cs2func_script_978_struct(10, 15488, "Members: Hexcrest" + "
" + " (with 20 Magic)", "Members can now wear " + "" + "hexcrests" + "" + "."); + case 13: + return newstruct cs2func_script_978_struct(10, 8921, "Members: Black mask" + "
" + " (with 20 Strength)", "Members can now wear " + "" + "black masks" + "" + "."); + case 14: + return newstruct cs2func_script_978_struct(10, 13263, "Members: Slayer helmet" + "
" + " (after Smoking Kills)", "Members can now wear " + "" + "slayer helmets" + "" + " (after Smoking Kills)."); + case 15: + return newstruct cs2func_script_978_struct(10, 15492, "Members: Full Slayer helmet" + "
" + " (after Smoking Kills with 20 Ranged, Magic and Strength)", "Members can now wear " + "" + "full slayer helmets" + "" + " (after Smoking Kills with 20 Ranged, Magic and Strength)."); + case 16: + return newstruct cs2func_script_978_struct(20, 1133, "Studded body" + "
" + " (with 20 Ranged)", "You now have the Defence level required to wear " + "" + "studded bodies" + "" + ". (You also need level 20 Ranged.)"); + case 17: + return newstruct cs2func_script_978_struct(20, 10822, "Members: Yak-hide bodies", "Members can now wear " + "" + "yak-hide bodies" + "" + "."); + case 18: + return newstruct cs2func_script_978_struct(20, 10824, "Members: Yak-hide legs", "Members can now wear " + "" + "yak-hide legs" + "" + "."); + case 19: + return newstruct cs2func_script_978_struct(20, 5574, "Members: Initiate sallet" + "
" + " (after Recruitment Drive, with 10 Prayer)", "Members now have the Defence level required to wear " + "" + "initiate sallets" + "" + " (after Recruitment Drive and with level 10 Prayer)."); + case 20: + return newstruct cs2func_script_978_struct(20, 5575, "Members: Initiate hauberk" + "
" + " (after Recruitment Drive, with 10 Prayer)", "Members now have the Defence level required to wear " + "" + "initiate hauberks" + "" + " (after Recruitment Drive and with level 10 Prayer)."); + case 21: + return newstruct cs2func_script_978_struct(20, 5576, "Members: Initiate cuisse" + "
" + " (after Recruitment Drive, with 10 Prayer)", "Members now have the Defence level required to wear " + "" + "initiate cuisses" + "" + " (after Recruitment Drive and with level 10 Prayer)."); + case 22: + return newstruct cs2func_script_978_struct(20, 4156, "Members: Mirror shield" + "
" + " (with 25 Slayer)", "Members now have the Defence level required to wield " + "" + "mirror shields" + "" + " to protect against cockatrices and basilisks. (They also need level 25 Slayer.)"); + case 23: + return newstruct cs2func_script_978_struct(20, 4506, "Members: Detailed decorative helm", "Members can now wear " + "" + "detailed decorative helms" + "" + "."); + case 24: + return newstruct cs2func_script_978_struct(20, 4504, "Members: Detailed decorative armour", "Members can now wear " + "" + "detailed decorative platebodies" + "" + "."); + case 25: + return newstruct cs2func_script_978_struct(20, 4505, "Members: Detailed decorative armour", "Members can now wear " + "" + "detailed decorative platelegs" + "" + "."); + case 26: + return newstruct cs2func_script_978_struct(20, 4507, "Members: Detailed decorative shield", "Members can now wear " + "" + "detailed decorative shields" + "" + "."); + case 27: + return newstruct cs2func_script_978_struct(20, 13950, "Members: Corrupt Morrigan's coif" + "
" + " (with 20 Ranged)", "Members now have the Defence level required to wield " + "" + "corrupt Morrigan's coif" + "" + ". (They also need level 20 Ranged.)"); + case 28: + return newstruct cs2func_script_978_struct(20, 13944, "Members: Corrupt Morrigan's leather body" + "
" + " (with 20 Ranged)", "Members now have the Defence level required to wield " + "" + "corrupt Morrigan's leather body" + "" + ". (They also need level 20 Ranged.)"); + case 29: + return newstruct cs2func_script_978_struct(20, 13947, "Members: Corrupt Morrigan's leather chaps" + "
" + " (with 20 Ranged)", "Members now have the Defence level required to wield " + "" + "corrupt Morrigan's leather chaps" + "" + ". (They also need level 20 Ranged.)"); + case 30: + return newstruct cs2func_script_978_struct(20, 13920, "Members: Corrupt Statius's full helm", "Members now have the Defence level required to wear " + "" + "corrupt Statius's full helm" + "" + "."); + case 31: + return newstruct cs2func_script_978_struct(20, 13908, "Members: Corrupt Statius's platebody", "Members now have the Defence level required to wear " + "" + "corrupt Statius's platebody" + "" + "."); + case 32: + return newstruct cs2func_script_978_struct(20, 13911, "Members: Corrupt Vesta's chainbody", "Members now have the Defence level required to wear " + "" + "corrupt Vesta's chainbody" + "" + "."); + case 33: + return newstruct cs2func_script_978_struct(20, 13914, "Members: Corrupt Statius's platelegs", "Members now have the Defence level required to wear " + "" + "corrupt Statius's platelegs" + "" + "."); + case 34: + return newstruct cs2func_script_978_struct(20, 13917, "Members: Corrupt Vesta's plateskirt", "Members now have the Defence level required to wear " + "" + "corrupt Vesta's plateskirt" + "" + "."); + case 35: + return newstruct cs2func_script_978_struct(25, 10826, "Members: Fremennik round shield", "Members can now wield Fremennik round shields" + "" + "."); + case 36: + return newstruct cs2func_script_978_struct(25, 10954, "Members: Frog-leather body" + "
" + " (with 25 Ranged)", "Members now have the Defence level required to wear " + "" + "frog-leather bodies" + "" + ". (They also need level 25 Ranged.)"); + case 37: + return newstruct cs2func_script_978_struct(25, 10956, "Members: Frog-leather chaps" + "
" + " (with 25 Ranged)", "Members now have the Defence level required to wear " + "" + "frog-leather chaps" + "" + ". (They also need level 25 Ranged.)"); + case 38: + return newstruct cs2func_script_978_struct(25, 10958, "Members: Frog-leather boots" + "
" + " (with 25 Ranged)", "Members now have the Defence level required to wear " + "" + "frog-leather boots" + "" + ". (They also need level 25 Ranged.)."); + case 39: + return newstruct cs2func_script_978_struct(30, 3758, "Members: Fremennik shield", "Members can now wield " + "" + "Fremennik shields" + "" + "."); + case 40: + return newstruct cs2func_script_978_struct(30, 3748, "Members: Fremennik helm", "Members can now wear " + "" + "Fremennik helms" + "" + "."); + case 41: + return newstruct cs2func_script_978_struct(30, 4567, "Members: Gold helmet", "Members can now wear " + "" + "gold helmets" + "" + "."); + case 42: + return newstruct cs2func_script_978_struct(30, 7917, "Members: Ram skull helm (after Rag and Bone Man)", "Members can now wear " + "" + "ram skull helms" + "" + " (after Rag and Bone Man)."); + case 43: + return newstruct cs2func_script_978_struct(30, 9672, "Members: Proselyte sallet" + "
" + " (after Slug Menace and with 20 Prayer)", "Members now have the Defence level required to wear " + "" + "proselyte sallets" + "" + " (after Slug Menace, with level 20 Prayer)."); + case 44: + return newstruct cs2func_script_978_struct(30, 9674, "Members: Proselyte hauberk" + "
" + " (after Slug Menace and with 20 Prayer)", "Members now have the Defence level required to wear " + "" + "proselyte hauberks" + "" + " (after Slug Menace, with level 20 Prayer)."); + case 45: + return newstruct cs2func_script_978_struct(30, 9678, "Members: Proselyte tasset" + "
" + " (after Slug Menace and with 20 Prayer)", "Members now have the Defence level required to wear " + "" + "proselyte tassets" + "" + " (after Slug Menace, with level 20 Prayer)."); + case 46: + return newstruct cs2func_script_978_struct(30, 9676, "Members: Proselyte cuisse" + "
" + " (after Slug Menace and with 20 Prayer)", "Members now have the Defence level required to wear " + "" + "proselyte cuisses" + "" + " (after Slug Menace, with level 20 Prayer)."); + case 47: + return newstruct cs2func_script_978_struct(30, 4511, "Members: Intricate decorative helm", "Members can now wear " + "" + "intricate decorative helms" + "" + "."); + case 48: + return newstruct cs2func_script_978_struct(30, 4509, "Members: Intricate decorative armour", "Members can now wear " + "" + "intricate decorative platebodies" + "" + "."); + case 49: + return newstruct cs2func_script_978_struct(30, 4510, "Members: Intricate decorative armour", "Members can now wear " + "" + "intricate decorative platelegs" + "" + "."); + case 50: + return newstruct cs2func_script_978_struct(30, 4512, "Members: Intricate decorative shield", "Members can now wear " + "" + "intricate decorative shields" + "" + "."); + case 51: + return newstruct cs2func_script_978_struct(30, 6326, "Members: Snakeskin bandana" + "
" + " (with 30 Ranged)", "Members now have the Defence level required to wear " + "" + "snakeskin bandanas" + "" + ". (They also need level 30 Ranged.)"); + case 52: + return newstruct cs2func_script_978_struct(30, 6322, "Members: Snakeskin body" + "
" + " (with 30 Ranged)", "Members now have the Defence level required to wear " + "" + "snakeskin bodies" + "" + ". (They also need level 30 Ranged.)"); + case 53: + return newstruct cs2func_script_978_struct(30, 6324, "Members: Snakeskin chaps" + "
" + " (with 30 Ranged)", "Members now have the Defence level required to wear " + "" + "snakeskin chaps" + "" + ". (They also need level 30 Ranged.)"); + case 54: + return newstruct cs2func_script_978_struct(30, 6330, "Members: Snakeskin vambraces" + "
" + " (with 30 Ranged)", "Members now have the Defence level required to wear " + "" + "snakeskin vambraces" + "" + ". (They also need level 30 Ranged.)"); + case 55: + return newstruct cs2func_script_978_struct(30, 6328, "Members: Snakeskin boots" + "
" + " (with 30 Ranged)", "Members now have the Defence level required to wear " + "" + "snakeskin boots" + "" + ". (They also need level 30 Ranged.)"); + case 56: + return newstruct cs2func_script_978_struct(35, 14936, "Members: Agile top" + "
" + " (with 35 Constitution)", "Members now have the Defence level required to wear " + "" + "Agile tops" + "" + ". (They also need level 35 Constitution.)"); + case 57: + return newstruct cs2func_script_978_struct(35, 14938, "Members: Agile legs" + "
" + " (with 35 Constitution)", "Members now have the Defence level required to wear " + "" + "Agile legs" + "" + ". (They also need level 35 Constitution.)"); + case 58: + return newstruct cs2func_script_978_struct(40, 1135, "Green dragonhide body" + "
" + " (after Dragon Slayer and with 40 Ranged)", "You now have the Defence level required to wear " + "" + "green dragonhide bodies" + "" + ". (You also need to have completed Dragon Slayer and have level 40 Ranged.)"); + case 59: + return newstruct cs2func_script_978_struct(40, 12936, "Green dragonhide coif" + "
" + " (with 40 Ranged)", "You now have the Defence level required to wear " + "" + "green dragonhide coifs" + "" + ". (You also need level 40 Ranged.)"); + case 60: + return newstruct cs2func_script_978_struct(40, 2499, "Members: Blue dragonhide body" + "
" + " (with 50 Ranged)", "Members now have the Defence level required to wear " + "" + "blue dragonhide bodies" + "" + ". (They also need level 50 Ranged.)"); + case 61: + return newstruct cs2func_script_978_struct(40, 12943, "Members: Blue dragonhide coif" + "
" + " (with 50 Ranged)", "Members now have the Defence level required to wear " + "" + "blue dragonhide coifs" + "" + ". (They also need level 50 Ranged.)"); + case 62: + return newstruct cs2func_script_978_struct(40, 2501, "Members: Red dragonhide body" + "
" + " (with 60 Ranged)", "Members now have the Defence level required to wear " + "" + "red dragonhide bodies" + "" + ". (They also need level 60 Ranged.)"); + case 63: + return newstruct cs2func_script_978_struct(40, 12950, "Members: Red dragonhide coif" + "
" + " (with 60 Ranged)", "Members now have the Defence level required to wear " + "" + "red dragonhide coifs" + "" + ". (They also need level 60 Ranged.)"); + case 64: + return newstruct cs2func_script_978_struct(40, 2503, "Members: Black dragonhide body" + "
" + " (with 70 Ranged)", "Members now have the Defence level required to wear " + "" + "black dragonhide bodies" + "" + ". (They also need level 70 Ranged.)"); + case 65: + return newstruct cs2func_script_978_struct(40, 12957, "Members: Black dragonhide coif" + "
" + " (with 70 Ranged)", "Members now have the Defence level required to wear " + "" + "black dragonhide coifs" + "" + ". (They also need level 70 Ranged.)"); + case 66: + return newstruct cs2func_script_978_struct(40, 10374, "Members: Blessed dragonhide coif" + "
" + " (with 70 Ranged)", "Members now have the Defence level required to wear " + "" + "blessed dragonhide coifs" + "" + ". (They also need level 70 Ranged.)"); + case 67: + return newstruct cs2func_script_978_struct(40, 6131, "Members: Spined helm" + "
" + " (after Fremennik Trials and with 40 Ranged)", "Members now have the Defence level required to wear " + "" + "spined helms" + "" + " (after Fremennik Trials and with level 40 Ranged)."); + case 68: + return newstruct cs2func_script_978_struct(40, 6133, "Members: Spined body" + "
" + " (after Fremennik Trials and with 40 Ranged)", "Members now have the Defence level required to wear " + "" + "spined bodies" + "" + " (after Fremennik Trials and with level 40 Ranged)."); + case 69: + return newstruct cs2func_script_978_struct(40, 6135, "Members: Spined chaps" + "
" + " (after Fremennik Trials and with 40 Ranged)", "Members now have the Defence level required to wear " + "" + "spined chaps" + "" + " (after Fremennik Trials and with level 40 Ranged)."); + case 70: + return newstruct cs2func_script_978_struct(40, 6128, "Members: Rock-shell helm" + "
" + " (after Fremennik Trials)", "Members now have the Defence level required to wear " + "" + "rock-shell helms" + "" + " (after Fremennik Trials)."); + case 71: + return newstruct cs2func_script_978_struct(40, 6129, "Members: Rock-shell plate" + "
" + " (after Fremennik Trials)", "Members now have the Defence level required to wear " + "" + "rock-shell plates" + "" + " (after Fremennik Trials)."); + case 72: + return newstruct cs2func_script_978_struct(40, 6130, "Members: Rock-shell legs" + "
" + " (after Fremennik Trials)", "Members now have the Defence level required to wear " + "" + "rock-shell legs" + "" + " (after Fremennik Trials)."); + case 73: + return newstruct cs2func_script_978_struct(40, 10551, "Members: Fighter torso", "Members can now wear " + "" + "fighter torsos" + "" + "."); + case 74: + return newstruct cs2func_script_978_struct(40, 10553, "Members: Penance gloves", "Members can now wear " + "" + "penance gloves" + "" + "."); + case 75: + return newstruct cs2func_script_978_struct(40, 10555, "Members: Penance skirt", "Members can now wear " + "" + "penance skirts" + "" + "."); + case 76: + return newstruct cs2func_script_978_struct(40, 10552, "Members: Runner boots", "Members can now wear " + "" + "runner boots" + "" + "."); + case 77: + return newstruct cs2func_script_978_struct(40, 10547, "Members: Healer hat", "Members can now wear " + "" + "healer hats" + "" + "."); + case 78: + return newstruct cs2func_script_978_struct(40, 10548, "Members: Fighter hat", "Members can now wear " + "" + "fighter hats" + "" + "."); + case 79: + return newstruct cs2func_script_978_struct(40, 10550, "Members: Ranger hat", "Members can now wear " + "" + "ranger hats" + "" + "."); + case 80: + return newstruct cs2func_script_978_struct(40, 10549, "Members: Runner hat", "Members can now wear " + "" + "runner hats" + "" + "."); + case 81: + return newstruct cs2func_script_978_struct(40, 13734, "Members: Spirit shield" + "
" + " (after Summer's End and with 55 Prayer)", "Members now have the Defence level required to wield " + "" + "spirit shields" + "" + " (after Summer's End, with level 55 Prayer)."); + case 82: + return newstruct cs2func_script_978_struct(40, 14096, "Members: Sacred clay helmet", "Members now have the Defence level required to wear " + "" + "sacred clay helmets" + "" + "."); + case 83: + return newstruct cs2func_script_978_struct(40, 14094, "Members: Sacred clay platebody", "Members now have the Defence level required to wear " + "" + "sacred clay platebodies" + "" + "."); + case 84: + return newstruct cs2func_script_978_struct(40, 14095, "Members: Sacred clay platelegs", "Members now have the Defence level required to wear " + "" + "sacred clay platelegs" + "" + "."); + case 85: + return newstruct cs2func_script_978_struct(40, 14120, "Members: Sacred clay coif" + "
" + " (with 40 Ranged)", "Members now have the Defence level required to wear " + "" + "sacred clay coifs" + "" + ". (They also need level 40 Ranged.)"); + case 86: + return newstruct cs2func_script_978_struct(40, 14118, "Members: Sacred clay body" + "
" + " (with 40 Ranged)", "Members now have the Defence level required to wear " + "" + "sacred clay bodies" + "" + ". (They also need level 40 Ranged.)"); + case 87: + return newstruct cs2func_script_978_struct(40, 14119, "Members: Sacred clay chaps" + "
" + " (with 40 Ranged)", "Members now have the Defence level required to wear " + "" + "sacred clay chaps" + "" + ". (They also need level 40 Ranged.)"); + case 88: + return newstruct cs2func_script_978_struct(40, 18708, "Members: Profound decorative helm", "Members can now wear " + "" + "profound decorative helms" + "" + "."); + case 89: + return newstruct cs2func_script_978_struct(40, 18706, "Members: Profound decorative armour", "Members can now wear " + "" + "profound decorative platebodies" + "" + "."); + case 90: + return newstruct cs2func_script_978_struct(40, 18707, "Members: Profound decorative armour", "Members can now wear " + "" + "profound decorative platelegs" + "" + "."); + case 91: + return newstruct cs2func_script_978_struct(40, 18709, "Members: Profound decorative shield", "Members can now wear " + "" + "profound decorative shields" + "" + "."); + case 92: + return newstruct cs2func_script_978_struct(40, 18747, "Members: Faithful shield", "Members now have the Defence level required to wear " + "" + "faithful shields" + "" + "."); + case 93: + return newstruct cs2func_script_978_struct(42, 11665, "Members: Void melee helm", "Members now have the Defence level required to wear " + "" + "Void melee helms" + "" + "."); + case 94: + return newstruct cs2func_script_978_struct(42, 11664, "Members: Void ranger helm", "Members now have the Defence level required to wear " + "" + "Void ranger helms" + "" + "."); + case 95: + return newstruct cs2func_script_978_struct(42, 11663, "Members: Void mage helm", "Members now have the Defence level required to wear " + "" + "Void mage helms" + "" + "."); + case 96: + return newstruct cs2func_script_978_struct(42, 8839, "Members: Void knight top", "Members now have the Defence level required to wear " + "" + "Void knight tops" + "" + "."); + case 97: + return newstruct cs2func_script_978_struct(42, 8840, "Members: Void knight robe", "Members now have the Defence level required to wear " + "" + "Void knight robes" + "" + "."); + case 98: + return newstruct cs2func_script_978_struct(42, 8842, "Members: Void knight gloves", "Members now have the Defence level required to wear " + "" + "Void knight gloves" + "" + "."); + case 99: + return newstruct cs2func_script_978_struct(42, 19712, "Members: Void knight deflector", "Members now have the Defence level required to wear " + "" + "Void knight deflectors" + "" + "."); + case 100: + return newstruct cs2func_script_978_struct(42, 8841, "Members: Void knight mace", "Members now have the Defence level required to wield " + "" + "Void knight maces" + "" + "."); + case 101: + return newstruct cs2func_script_978_struct(42, 7620, "Void knight equipment requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer.", "" + "Void knight equipment" + "" + " requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer."); + case 102: + return newstruct cs2func_script_978_struct(45, 3751, "Members: Berserker helm" + "
" + " (after Fremennik Trials)", "Members now have the Defence level required to wear " + "" + "berserker helms" + "" + " (after Fremennik Trials)."); + case 103: + return newstruct cs2func_script_978_struct(45, 3753, "Members: Warrior helm" + "
" + " (after Fremennik Trials)", "Members now have the Defence level required to wear " + "" + "warrior helms" + "" + " (after Fremennik Trials)."); + case 104: + return newstruct cs2func_script_978_struct(45, 3749, "Members: Archer helm" + "
" + " (after Fremennik Trials)", "Members now have the Defence level required to wear " + "" + "archer helms" + "" + " (after Fremennik Trials)."); + case 105: + return newstruct cs2func_script_978_struct(50, 11200, "Members: Dwarven helmet" + "
" + " (after Grim Tales)", "Members can now wear " + "" + "dwarven helmets" + "" + " (after Grim Tales)."); + case 106: + return newstruct cs2func_script_978_struct(50, 10589, "Members: Granite helm" + "
" + " (with 50 Strength)", "Members now have the Defence level required to wear " + "" + "granite helms" + "" + ". (They also need level 50 Strength.)"); + case 107: + return newstruct cs2func_script_978_struct(50, 10564, "Members: Granite body" + "
" + " (with 50 Strength)", "Members now have the Defence level required to wear " + "" + "granite bodies" + "" + ". (They also need level 50 Strength.)"); + case 108: + return newstruct cs2func_script_978_struct(50, 6809, "Members: Granite legs" + "
" + " (with 50 Strength)", "Members now have the Defence level required to wear " + "" + "granite legs" + "" + ". (They also need level 50 Strength.)"); + case 109: + return newstruct cs2func_script_978_struct(50, 3122, "Members: Granite shield" + "
" + " (with 50 Strength)", "Members now have the Defence level required to wield " + "" + "granite shields" + "" + ". (They also need level 50 Strength.)"); + case 110: + return newstruct cs2func_script_978_struct(50, 19893, "Spirit cape" + "
" + " (with 50 Summoning and 50 Dungeoneering)", "You can now wear " + "" + "spirit capes" + "" + ". (You also need level 50 Summoning and 50 Dungeoneering.)"); + case 111: + return newstruct cs2func_script_978_struct(55, 10828, "Members: Helm of Neitiznot" + "
" + " (after Fremennik Isles)", "Members now have the Defence level required to wear the " + "" + "Helm of Neitiznot" + "" + " (after Fremennik Isles)."); + case 112: + return newstruct cs2func_script_978_struct(60, 6524, "Members: TokTz-Ket-Xil", "Members can now wield " + "" + "TokTz-Ket-Xil" + "" + "."); + case 113: + return newstruct cs2func_script_978_struct(60, 18340, "Members: Anti-poison totem" + "
" + " (with 70 Herblore and 60 Dungeoneering)", "Members can now wield " + "" + "anti-poison totems" + "" + ". (They also need level 70 Herblore and level 60 Dungeoneering.)"); + case 114: + return newstruct cs2func_script_978_struct(65, 10350, "Members: Third-Age full helm", "Members can now wear " + "" + "Third-Age full helms" + "" + "."); + case 115: + return newstruct cs2func_script_978_struct(65, 10348, "Members: Third-Age platebody", "Members can now wear " + "" + "Third-Age platebodies" + "" + "."); + case 116: + return newstruct cs2func_script_978_struct(65, 10346, "Members: Third-Age platelegs", "Members can now wear " + "" + "Third-Age platelegs" + "" + "."); + case 117: + return newstruct cs2func_script_978_struct(65, 10352, "Members: Third-Age kiteshield", "Members can now wield " + "" + "Third-Age kiteshields" + "" + "."); + case 118: + return newstruct cs2func_script_978_struct(65, 11724, "Members: Bandos chestplate", "Members can now wear " + "" + "Bandos chestplates" + "" + "."); + case 119: + return newstruct cs2func_script_978_struct(65, 11726, "Members: Bandos tassets", "Members can now wear " + "" + "Bandos tassets" + "" + "."); + case 120: + return newstruct cs2func_script_978_struct(65, 11728, "Members: Bandos boots", "Members can now wear " + "" + "Bandos boots" + "" + "."); + case 121: + return newstruct cs2func_script_978_struct(65, 21527, "Members: Sacred Clay Shield", "Members can now equip " + "" + "Sacred clay shields" + "" + "."); + case 122: + return newstruct cs2func_script_978_struct(70, 4224, "Members: Crystal shield" + "
" + " (with 50 Agility)", "Members now have the Defence level required to wield " + "" + "crystal shields" + "" + ". (They also need level 50 Agility.)"); + case 123: + return newstruct cs2func_script_978_struct(70, 11718, "Members: Armadyl helmet" + "
" + " (with 70 Ranged)", "Members now have the Defence level required to wear Armadyl helmets. (They also need level 70 Ranged.)"); + case 124: + return newstruct cs2func_script_978_struct(70, 11720, "Members: Armadyl chestplate" + "
" + " (with 70 Ranged)", "Members now have the Defence level required to wear Armadyl chestplates. (They also need level 70 Ranged.)"); + case 125: + return newstruct cs2func_script_978_struct(70, 11722, "Members: Armadyl chainskirt" + "
" + " (with 70 Ranged)", "Members now have the Defence level required to wear Armadyl chainskirts. (They also need level 70 Ranged.)"); + case 126: + return newstruct cs2func_script_978_struct(70, 13736, "Members: Blessed spirit shield" + "
" + " (after Summer's End and with 60 Prayer)", "Members now have the Defence level required to wield " + "" + "blessed spirit shields" + "" + " (after Summer's End, with level 60 Prayer)."); + case 127: + return newstruct cs2func_script_978_struct(75, 11283, "Members: Dragonfire shield", "Members can now wield " + "" + "dragonfire shields" + "" + "."); + case 128: + return newstruct cs2func_script_978_struct(75, 13738, "Members: Arcane spirit shield" + "
" + " (after Summer's End and with 70 Prayer and 65 Magic)", "Members now have the Defence level required to wield " + "" + "arcane spirit shields" + "" + " (after Summer's End, with level 65 Magic and level 70 Prayer)."); + case 129: + return newstruct cs2func_script_978_struct(75, 13740, "Members: Divine spirit shield" + "
" + " (after Summer's End and with 75 Prayer)", "Members now have the Defence level required to wield " + "" + "divine spirit shields" + "" + " (after Summer's End, with level 75 Prayer)."); + case 130: + return newstruct cs2func_script_978_struct(75, 13742, "Members: Elysian spirit shield" + "
" + " (after Summer's End and with 75 Prayer)", "Members now have the Defence level required to wield " + "" + "elysian spirit shields" + "" + " (after Summer's End, with level 75 Prayer)."); + case 131: + return newstruct cs2func_script_978_struct(75, 13744, "Members: Spectral spirit shield" + "
" + " (after Summer's End and with 70 Prayer and 65 Magic)", "Members now have the Defence level required to wield " + "" + "spectral spirit shields" + "" + " (after Summer's End, with level 65 Magic and level 70 Prayer)."); + case 132: + return newstruct cs2func_script_978_struct(75, 21787, "Members: Steadfast boots" + "
" + " (with 75 Attack)", "Members now have the Defence level required to wear " + "" + "steadfast boots" + "" + " (with 75 Attack)."); + case 133: + return newstruct cs2func_script_978_struct(75, 21793, "Members: Ragefire boots" + "
" + " (with 75 Magic)", "Members now have the Defence level required to wear " + "" + "ragefire boots" + "" + " (with 75 Magic)."); + case 134: + return newstruct cs2func_script_978_struct(75, 21790, "Members: Glaiven boots" + "
" + " (with 75 Ranged)", "Members now have the Defence level required to wear " + "" + "glaiven boots" + "" + " (with 75 Ranged)."); + case 135: + return newstruct cs2func_script_978_struct(78, 13876, "Members: Morrigan's coif" + "
" + " (with 78 Ranged)", "Members now have the Defence level required to wear " + "" + "Morrigan's coif" + "" + ". (They also need level 78 Ranged.)"); + case 136: + return newstruct cs2func_script_978_struct(78, 13870, "Members: Morrigan's leather body" + "
" + " (with 78 Ranged)", "Members now have the Defence level required to wear " + "" + "Morrigan's leather body" + "" + ". (They also need level 78 Ranged.)"); + case 137: + return newstruct cs2func_script_978_struct(78, 13873, "Members: Morrigan's leather chaps" + "
" + " (with 78 Ranged)", "Members now have the Defence level required to wear " + "" + "Morrigan's leather chaps" + "" + ". (They also need level 78 Ranged.)"); + case 138: + return newstruct cs2func_script_978_struct(78, 13896, "Members: Statius's full helm", "Members now have the Defence level required to wear " + "" + "Statius's full helm" + "" + "."); + case 139: + return newstruct cs2func_script_978_struct(78, 13884, "Members: Statius's platebody", "Members now have the Defence level required to wear " + "" + "Statius's platebody" + "" + "."); + case 140: + return newstruct cs2func_script_978_struct(78, 13887, "Members: Vesta's chainbody", "Members now have the Defence level required to wear " + "" + "Vesta's chainbody" + "" + "."); + case 141: + return newstruct cs2func_script_978_struct(78, 13890, "Members: Statius's platelegs", "Members now have the Defence level required to wear " + "" + "Statius's platelegs" + "" + "."); + case 142: + return newstruct cs2func_script_978_struct(78, 13893, "Members: Vesta's plateskirt", "Members now have the Defence level required to wear " + "" + "Vesta's plateskirt" + "" + "."); + case 143: + return newstruct cs2func_script_978_struct(80, 18359, "Members: Chaotic kiteshield" + "
" + " (with 80 Dungeoneering)", "Members can now wield " + "" + "chaotic kiteshields" + "" + ". (They also need level 80 Dungeoneering.)"); + case 144: + return newstruct cs2func_script_978_struct(80, 18361, "Members: Eagle-eye kiteshield" + "
" + " (with 80 Dungeoneering)", "Members can now wield " + "" + "eagle-eye kiteshields" + "" + ". (They also need level 80 Dungeoneering.)"); + case 145: + return newstruct cs2func_script_978_struct(80, 18363, "Members: Farseer kiteshield" + "
" + " (with 80 Dungeoneering)", "Members can now wield " + "" + "farseer kiteshields" + "" + ". (They also need level 80 Dungeoneering.)"); + case 146: + return newstruct cs2func_script_978_struct(80, 20135, "Members: Torva full helm" + "
" + " (with 80 Strength and Constitution)", "Members can now wear " + "" + "torva full helms" + "" + ". (They also need level 80 Strength and Constitution.)"); + case 147: + return newstruct cs2func_script_978_struct(80, 20139, "Members: Torva platebody" + "
" + " (with 80 Strength and Constitution)", "Members can now wear " + "" + "torva platebodies" + "" + ". (They also need level 80 Strength and Constitution.)"); + case 148: + return newstruct cs2func_script_978_struct(80, 20143, "Members: Torva platelegs" + "
" + " (with 80 Strength and Constitution)", "Members can now wear " + "" + "torva platelegs" + "" + ". (They also need level 80 Strength and Constitution.)"); + case 149: + return newstruct cs2func_script_978_struct(80, 20147, "Members: Pernix cowl" + "
" + " (with 80 Ranged and Constitution)", "Members can now wear " + "" + "pernix cowls" + "" + ". (They also need level 80 Ranged and Constitution.)"); + case 150: + return newstruct cs2func_script_978_struct(80, 20151, "Members: Pernix body" + "
" + " (with 80 Ranged and Constitution)", "Members can now wear " + "" + "pernix bodies" + "" + ". (They also need level 80 Ranged and Constitution.)"); + case 151: + return newstruct cs2func_script_978_struct(80, 20155, "Members: Pernix chaps" + "
" + " (with 80 Ranged and Constitution)", "Members can now wear " + "" + "pernix chaps" + "" + ". (They also need level 80 Ranged and Constitution.)"); + } + break; + case 12: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(1, 14367, "Members: Stealing Creation - class 1 helmet", "Members can now wear " + "" + "class 1 helmets" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_978_struct(1, 14357, "Members: Stealing Creation - class 1 platelegs", "Members can now wear " + "" + "class 1 platelegs" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_978_struct(1, 14347, "Members: Stealing Creation - class 1 platebody", "Members can now wear " + "" + "class 1 platebodies" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_978_struct(20, 14369, "Members: Stealing Creation - class 2 helmet", "Members can now wear " + "" + "class 2 helmets" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_978_struct(20, 14359, "Members: Stealing Creation - class 2 platelegs", "Members can now wear " + "" + "class 2 platelegs" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_978_struct(20, 14349, "Members: Stealing Creation - class 2 platebody", "Members can now wear " + "" + "class 2 platebodies" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_978_struct(40, 14371, "Members: Stealing Creation - class 3 helmet", "Members can now wear " + "" + "class 3 helmets" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_978_struct(40, 14361, "Members: Stealing Creation - class 3 platelegs", "Members can now wear " + "" + "class 3 platelegs" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_978_struct(40, 14351, "Members: Stealing Creation - class 3 platebody", "Members can now wear " + "" + "class 3 platebodies" + "" + " in Stealing Creation."); + case 9: + return newstruct cs2func_script_978_struct(60, 14373, "Members: Stealing Creation - class 4 helmet", "Members can now wear " + "" + "class 4 helmets" + "" + " in Stealing Creation."); + case 10: + return newstruct cs2func_script_978_struct(60, 14363, "Members: Stealing Creation - class 4 platelegs", "Members can now wear " + "" + "class 4 platelegs" + "" + " in Stealing Creation."); + case 11: + return newstruct cs2func_script_978_struct(60, 14353, "Members: Stealing Creation - class 4 platebody", "Members can now wear " + "" + "class 4 platebodies" + "" + " in Stealing Creation."); + case 12: + return newstruct cs2func_script_978_struct(80, 14375, "Members: Stealing Creation - class 5 helmet", "Members can now wear " + "" + "class 5 helmets" + "" + " in Stealing Creation."); + case 13: + return newstruct cs2func_script_978_struct(80, 14365, "Members: Stealing Creation - class 5 platelegs", "Members can now wear " + "" + "class 5 platelegs" + "" + " in Stealing Creation."); + case 14: + return newstruct cs2func_script_978_struct(80, 14355, "Members: Stealing Creation - class 5 platebody", "Members can now wear " + "" + "class 5 platebodies" + "" + " in Stealing Creation."); + case 15: + return newstruct cs2func_script_978_struct(85, 21537, "Members: Battle-mage helm" + "
" + " (with 85 Magic and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Battle-mage helms" + "" + ". (They also need level 85 Magic and level 85 Strength.)"); + case 16: + return newstruct cs2func_script_978_struct(85, 21539, "Members: Battle-mage robe" + "
" + " (with 85 Magic and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Battle-mage robes" + "" + ". (They also need level 85 Magic and level 85 Strength.)"); + case 17: + return newstruct cs2func_script_978_struct(85, 21541, "Members: Battle-mage legs" + "
" + " (with 85 Magic and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Battle-mage legs" + "" + ". (They also need level 85 Magic and level 85 Strength.)"); + case 18: + return newstruct cs2func_script_978_struct(85, 21543, "Members: Battle-mage gloves" + "
" + " (with 85 Magic and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Battle-mage gloves" + "" + ". (They also need level 85 Magic and level 85 Strength.)"); + case 19: + return newstruct cs2func_script_978_struct(85, 21545, "Members: Battle-mage boots" + "
" + " (with 85 Magic and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Battle-mage boots" + "" + ". (They also need level 85 Magic and level 85 Strength.)"); + case 20: + return newstruct cs2func_script_978_struct(85, 21547, "Members: Trickster hood" + "
" + " (with 85 Magic and 85 Ranged)", "Members now have the Defence requirement to wear " + "" + "Trickster hoods" + "" + ". (They also need level 85 Magic and level 85 Ranged)"); + case 21: + return newstruct cs2func_script_978_struct(85, 21549, "Members: Trickster robe" + "
" + " (with 85 Magic and 85 Ranged)", "Members now have the Defence requirement to wear " + "" + "Trickster robes" + "" + ". (They also need level 85 Magic and level 85 Ranged)"); + case 22: + return newstruct cs2func_script_978_struct(85, 21551, "Members: Trickster legs" + "
" + " (with 85 Magic and 85 Ranged)", "Members now have the Defence requirement to wear " + "" + "Trickster legs" + "" + ". (They also need level 85 Magic and level 85 Ranged)"); + case 23: + return newstruct cs2func_script_978_struct(85, 21553, "Members: Trickster gloves" + "
" + " (with 85 Magic and 85 Ranged)", "Members now have the Defence requirement to wear " + "" + "Trickster gloves" + "" + ". (They also need level 85 Magic and level 85 Ranged)"); + case 24: + return newstruct cs2func_script_978_struct(85, 21555, "Members: Trickster boots" + "
" + " (with 85 Magic and 85 Ranged)", "Members now have the Defence requirement to wear " + "" + "Trickster boots" + "" + ". (They also need level 85 Magic and level 85 Ranged)"); + case 25: + return newstruct cs2func_script_978_struct(85, 21557, "Members: Vanguard helm" + "
" + " (with 85 Ranged and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Vanguard helms" + "" + ". (They also need level 85 Ranged and level 85 Strength.)"); + case 26: + return newstruct cs2func_script_978_struct(85, 21559, "Members: Vanguard body" + "
" + " (with 85 Ranged and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Vanguard body armour" + "" + ". (They also need level 85 Ranged and level 85 Strength.)"); + case 27: + return newstruct cs2func_script_978_struct(85, 21561, "Members: Vanguard legs" + "
" + " (with 85 Ranged and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Vanguard leg armour" + "" + ". (They also need level 85 Ranged and level 85 Strength.)"); + case 28: + return newstruct cs2func_script_978_struct(85, 21563, "Members: Vanguard gloves" + "
" + " (with 85 Ranged and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Vanguard gloves" + "" + ". (They also need level 85 Ranged and level 85 Strength.)"); + case 29: + return newstruct cs2func_script_978_struct(85, 21565, "Members: Vanguard boots" + "
" + " (with 85 Ranged and 85 Strength)", "Members now have the Defence requirement to wear " + "" + "Vanguard boots" + "" + ". (They also need level 85 Ranged and level 85 Strength.)"); + } + break; + case 13: + switch (arg1) { + case 0: + return newstruct cs2func_script_978_struct(1, 16691, "Novite full helm (Tier 1)", "You can now wear " + "" + "novite full helms" + "" + " within Daemonheim."); + case 1: + return newstruct cs2func_script_978_struct(1, 17239, "Novite platebody (Tier 1)", "You can now wear " + "" + "novite platebodies" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_978_struct(1, 16713, "Novite chainbody (Tier 1)", "You can now wear " + "" + "novite chainbodies" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_978_struct(1, 16669, "Novite platelegs (Tier 1)", "You can now wear " + "" + "novite platelegs" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_978_struct(1, 16647, "Novite plateskirt (Tier 1)", "You can now wear " + "" + "novite plateskirts" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_978_struct(1, 16273, "Novite gauntlets (Tier 1)", "You can now wear " + "" + "novite gauntlets" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_978_struct(1, 16339, "Novite boots (Tier 1)", "You can now wear " + "" + "novite boots" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_978_struct(1, 17341, "Novite kiteshield (Tier 1)", "You can now wield " + "" + "novite kiteshields" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_978_struct(1, 16735, "Salve hood (Tier 1)" + "
" + " (with 1 Magic)", "You can now wear " + "" + "salve hoods" + "" + " within Daemonheim. (You also need level 1 Magic.)"); + case 9: + return newstruct cs2func_script_978_struct(1, 17217, "Salve robe top (Tier 1)" + "
" + " (with 1 Magic)", "You can now wear " + "" + "salve robe tops" + "" + " within Daemonheim. (You also need level 1 Magic.)"); + case 10: + return newstruct cs2func_script_978_struct(1, 16845, "Salve robe bottom (Tier 1)" + "
" + " (with 1 Magic)", "You can now wear " + "" + "salve robe bottoms" + "" + " within Daemonheim. (You also need level 1 Magic.)"); + case 11: + return newstruct cs2func_script_978_struct(1, 17151, "Salve gloves (Tier 1)" + "
" + " (with 1 Magic)", "You can now wear " + "" + "salve gloves" + "" + " within Daemonheim. (You also need level 1 Magic.)"); + case 12: + return newstruct cs2func_script_978_struct(1, 16911, "Salve boots (Tier 1)" + "
" + " ( with 1 Magic)", "You can now wear " + "" + "salve boots" + "" + " within Daemonheim. (You also need level 1 Magic.)"); + case 13: + return newstruct cs2func_script_978_struct(1, 17041, "Protoleather coif (Tier 1)" + "
" + " (with 1 Ranged)", "You can now wear " + "" + "protoleather coifs" + "" + " within Daemonheim. (You also need level 1 Ranged.)"); + case 14: + return newstruct cs2func_script_978_struct(1, 17173, "Protoleather body (Tier 1)" + "
" + " (with 1 Ranged)", "You can now wear " + "" + "protoleather bodies" + "" + " within Daemonheim. (You also need level 1 Ranged.)"); + case 15: + return newstruct cs2func_script_978_struct(1, 17319, "Protoleather chaps (Tier 1)" + "
" + " (with 1 Ranged)", "You can now wear " + "" + "protoleather chaps" + "" + " within Daemonheim. (You also need level 1 Ranged.)"); + case 16: + return newstruct cs2func_script_978_struct(1, 17195, "Protoleather vambraces (Tier 1)" + "
" + " (with 1 Ranged)", "You can now wear " + "" + "protoleather vambraces" + "" + " within Daemonheim. (You also need level 1 Ranged.)"); + case 17: + return newstruct cs2func_script_978_struct(1, 17297, "Protoleather boots (Tier 1)" + "
" + " (with 1 Ranged)", "You can now wear " + "" + "protoleather boots" + "" + " within Daemonheim. (You also need level 1 Ranged.)"); + case 18: + return newstruct cs2func_script_978_struct(10, 16693, "Bathus full helm (Tier 2)", "You can now wear " + "" + "bathus full helms" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_978_struct(10, 17241, "Bathus platebody (Tier 2)", "You can now wear " + "" + "bathus platebodies" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_978_struct(10, 16715, "Bathus chainbody (Tier 2)", "You can now wear " + "" + "bathus chainbodies" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_978_struct(10, 16671, "Bathus platelegs (Tier 2)", "You can now wear " + "" + "bathus platelegs" + "" + " within Daemonheim."); + case 22: + return newstruct cs2func_script_978_struct(10, 16649, "Bathus plateskirt (Tier 2)", "You can now wear " + "" + "bathus plateskirts" + "" + " within Daemonheim."); + case 23: + return newstruct cs2func_script_978_struct(10, 16275, "Bathus gauntlets (Tier 2)", "You can now wear " + "" + "bathus gauntlets" + "" + " within Daemonheim."); + case 24: + return newstruct cs2func_script_978_struct(10, 16341, "Bathus boots (Tier 2)", "You can now wear " + "" + "bathus boots" + "" + " within Daemonheim."); + case 25: + return newstruct cs2func_script_978_struct(10, 17343, "Bathus kiteshield (Tier 2)", "You can now wield " + "" + "bathus kiteshields" + "" + " within Daemonheim."); + case 26: + return newstruct cs2func_script_978_struct(10, 16737, "Wildercress hood (Tier 2)" + "
" + " (with 10 Magic)", "You can now wear " + "" + "wildercress hoods" + "" + " within Daemonheim. (You also need level 10 Magic.)"); + case 27: + return newstruct cs2func_script_978_struct(10, 17219, "Wildercress robe top (Tier 2)" + "
" + " (with 10 Magic)", "You can now wear " + "" + "wildercress robe tops" + "" + " within Daemonheim. (You also need level 10 Magic.)"); + case 28: + return newstruct cs2func_script_978_struct(10, 16847, "Wildercress robe bottom (Tier 2)" + "
" + " (with 10 Magic)", "You can now wear " + "" + "wildercress robe bottoms" + "" + " within Daemonheim. (You also need level 10 Magic.)"); + case 29: + return newstruct cs2func_script_978_struct(10, 17153, "Wildercress gloves (Tier 2)" + "
" + " (with 10 Magic)", "You can now wear " + "" + "wildercress gloves" + "" + " within Daemonheim. (You also need level 10 Magic.)"); + case 30: + return newstruct cs2func_script_978_struct(10, 16913, "Wildercress boots (Tier 2)" + "
" + " (with 10 Magic)", "You can now wear " + "" + "wildercress boots" + "" + " within Daemonheim. (You also need level 10 Magic.)"); + case 31: + return newstruct cs2func_script_978_struct(10, 17043, "Subleather coif (Tier 2)" + "
" + " (with 10 Ranged)", "You can now wear " + "" + "subleather coifs" + "" + " within Daemonheim. (You also need level 10 Ranged.)"); + case 32: + return newstruct cs2func_script_978_struct(10, 17175, "Subleather body (Tier 2)" + "
" + " (with 10 Ranged)", "You can now wear " + "" + "subleather bodies" + "" + " within Daemonheim. (You also need level 10 Ranged.)"); + case 33: + return newstruct cs2func_script_978_struct(10, 17321, "Subleather chaps (Tier 2)" + "
" + " (with 10 Ranged)", "You can now wear " + "" + "subleather chaps" + "" + " within Daemonheim. (You also need level 10 Ranged.)"); + case 34: + return newstruct cs2func_script_978_struct(10, 17197, "Subleather vambraces (Tier 2)" + "
" + " (with 10 Ranged)", "You can now wear " + "" + "subleather vambraces" + "" + " within Daemonheim. (You also need level 10 Ranged.)"); + case 35: + return newstruct cs2func_script_978_struct(10, 17299, "Subleather boots (Tier 2)" + "
" + " (with 10 Ranged)", "You can now wear " + "" + "subleather boots" + "" + " within Daemonheim. (You also need level 10 Ranged.)"); + case 36: + return newstruct cs2func_script_978_struct(15, 17261, "Members: Silver precision bracelet ", "Members can now wear " + "" + "silver precision bracelets" + "" + " within Daemonheim."); + case 37: + return newstruct cs2func_script_978_struct(20, 16695, "Marmaros full helm (Tier 3)", "You can now wear " + "" + "marmaros full helms" + "" + " within Daemonheim."); + case 38: + return newstruct cs2func_script_978_struct(20, 17243, "Marmaros platebody (Tier 3)", "You can now wear " + "" + "marmaros platebodies" + "" + " within Daemonheim."); + case 39: + return newstruct cs2func_script_978_struct(20, 16717, "Marmaros chainbody (Tier 3)", "You can now wear " + "" + "marmaros chainbodies" + "" + " within Daemonheim."); + case 40: + return newstruct cs2func_script_978_struct(20, 16673, "Marmaros platelegs (Tier 3)", "You can now wear " + "" + "marmaros platelegs" + "" + " within Daemonheim."); + case 41: + return newstruct cs2func_script_978_struct(20, 16651, "Marmaros plateskirt (Tier 3)", "You can now wear " + "" + "marmaros plateskirts" + "" + " within Daemonheim."); + case 42: + return newstruct cs2func_script_978_struct(20, 16277, "Marmaros gauntlets (Tier 3)", "You can now wear " + "" + "marmaros gauntlets" + "" + " within Daemonheim."); + case 43: + return newstruct cs2func_script_978_struct(20, 16343, "Marmaros boots (Tier 3)", "You can now wear " + "" + "marmaros boots" + "" + " within Daemonheim."); + case 44: + return newstruct cs2func_script_978_struct(20, 17345, "Marmaros kiteshield (Tier 3)", "You can now wield " + "" + "marmaros kiteshields" + "" + " within Daemonheim."); + case 45: + return newstruct cs2func_script_978_struct(20, 16739, "Blightleaf hood (Tier 3)" + "
" + " (with 20 Magic)", "You can now wear " + "" + "blightleaf hoods" + "" + " within Daemonheim. (You also need level 20 Magic.)"); + case 46: + return newstruct cs2func_script_978_struct(20, 17221, "Blightleaf robe top (Tier 3)" + "
" + " (with 20 Magic)", "You can now wear " + "" + "blightleaf robe tops" + "" + " within Daemonheim. (You also need 20 Magic)."); + case 47: + return newstruct cs2func_script_978_struct(20, 16849, "Blightleaf robe bottom (Tier 3)" + "
" + " (with 20 Magic)", "You can now wear " + "" + "blightleaf robe bottoms" + "" + " within Daemonheim. (You also need level 20 Magic.)"); + case 48: + return newstruct cs2func_script_978_struct(20, 17155, "Blightleaf gloves (Tier 3)" + "
" + " (with 20 Magic)", "You can now wear " + "" + "blightleaf gloves" + "" + " within Daemonheim. (You also need level 20 Magic.)"); + case 49: + return newstruct cs2func_script_978_struct(20, 16915, "Blightleaf boots (Tier 3)" + "
" + " (with 20 Magic)", "You can now wear " + "" + "blightleaf boots" + "" + " within Daemonheim. (You also need level 20 Magic.)"); + case 50: + return newstruct cs2func_script_978_struct(20, 17045, "Paraleather coif (Tier 3)" + "
" + " (with 20 Ranged)", "You can now wear " + "" + "paraleather coifs" + "" + " within Daemonheim. (You also need level 20 Ranged.)"); + case 51: + return newstruct cs2func_script_978_struct(20, 17177, "Paraleather body (Tier 3)" + "
" + " (with 20 Ranged)", "You can now wear " + "" + "paraleather bodies" + "" + " within Daemonheim. (You also need level 20 Ranged.)"); + case 52: + return newstruct cs2func_script_978_struct(20, 17323, "Paraleather chaps (Tier 3)" + "
" + " (with 20 Ranged)", "You can now wear " + "" + "paraleather chaps" + "" + " within Daemonheim. (You also need level 20 Ranged.)"); + case 53: + return newstruct cs2func_script_978_struct(20, 17199, "Paraleather vambraces (Tier 3)" + "
" + " (with 20 Ranged)", "You can now wear " + "" + "paraleather vambraces" + "" + " within Daemonheim. (You also need level 20 Ranged.)"); + case 54: + return newstruct cs2func_script_978_struct(20, 17301, "Paraleather boots (Tier 3)" + "
" + " (with 20 Ranged)", "You can now wear " + "" + "paraleather boots" + "" + " within Daemonheim. (You also need level 20 Ranged.)"); + case 55: + return newstruct cs2func_script_978_struct(21, 17265, "Members: Sunstriker boots ", "Members can now wear " + "" + "sunstriker boots" + "" + " within Daemonheim."); + case 56: + return newstruct cs2func_script_978_struct(28, 17269, "Members: Incantor's boots ", "Members can now wear " + "" + "incantor's boots" + "" + " within Daemonheim."); + case 57: + return newstruct cs2func_script_978_struct(30, 16697, "Kratonite full helm (Tier 4)", "You can now wear " + "" + "kratonite full helms" + "" + " within Daemonheim."); + case 58: + return newstruct cs2func_script_978_struct(30, 17245, "Kratonite platebody (Tier 4)", "You can now wear " + "" + "kratonite platebodies" + "" + " within Daemonheim."); + case 59: + return newstruct cs2func_script_978_struct(30, 16719, "Kratonite chainbody (Tier 4)", "You can now wear " + "" + "kratonite chainbodies" + "" + " within Daemonheim."); + case 60: + return newstruct cs2func_script_978_struct(30, 16675, "Kratonite platelegs (Tier 4)", "You can now wear " + "" + "kratonite platelegs" + "" + " within Daemonheim."); + case 61: + return newstruct cs2func_script_978_struct(30, 16653, "Kratonite plateskirt (Tier 4)", "You can now wear " + "" + "kratonite plateskirts" + "" + " within Daemonheim."); + case 62: + return newstruct cs2func_script_978_struct(30, 16279, "Kratonite gauntlets (Tier 4)", "You can now wear " + "" + "kratonite gauntlets" + "" + " within Daemonheim."); + case 63: + return newstruct cs2func_script_978_struct(30, 16345, "Kratonite boots (Tier 4)", "You can now wear " + "" + "kratonite boots" + "" + " within Daemonheim."); + case 64: + return newstruct cs2func_script_978_struct(30, 17347, "Kratonite kiteshield (Tier 4)", "You can now wield " + "" + "kratonite kiteshields" + "" + " within Daemonheim."); + case 65: + return newstruct cs2func_script_978_struct(30, 16741, "Roseblood hood (Tier 4)" + "
" + " (with 30 Magic)", "You can now wear " + "" + "roseblood hoods" + "" + " within Daemonheim. (You also need level 30 Magic.)"); + case 66: + return newstruct cs2func_script_978_struct(30, 17223, "Roseblood robe top (Tier 4)" + "
" + " (with 30 Magic)", "You can now wear " + "" + "roseblood robe tops" + "" + " within Daemonheim. (You also need level 30 Magic.)"); + case 67: + return newstruct cs2func_script_978_struct(30, 16851, "Roseblood robe bottom (Tier 4)" + "
" + " (with 30 Magic)", "You can now wear " + "" + "roseblood robe bottoms" + "" + " within Daemonheim. (You also need level 30 Magic.)"); + case 68: + return newstruct cs2func_script_978_struct(30, 17157, "Roseblood gloves (Tier 4)" + "
" + " (with 30 Magic)", "You can now wear " + "" + "roseblood gloves" + "" + " within Daemonheim. (You also need 30 Magic)."); + case 69: + return newstruct cs2func_script_978_struct(30, 16917, "Roseblood boots (Tier 4)" + "
" + " (with 30 Magic)", "You can now wear " + "" + "roseblood boots" + "" + " within Daemonheim. (You also need level 30 Magic.)"); + case 70: + return newstruct cs2func_script_978_struct(30, 17047, "Archleather coif (Tier 4)" + "
" + " (with 30 Ranged)", "You can now wear " + "" + "archleather coifs" + "" + " within Daemonheim. (You also need level 30 Ranged.)"); + case 71: + return newstruct cs2func_script_978_struct(30, 17179, "Archleather body (Tier 4)" + "
" + " (with 30 Ranged)", "You can now wear " + "" + "archleather bodies" + "" + " within Daemonheim. (You also need level 30 Ranged.)"); + case 72: + return newstruct cs2func_script_978_struct(30, 17325, "Archleather chaps (Tier 4)" + "
" + " (with 30 Ranged)", "You can now wear " + "" + "archleather chaps" + "" + " within Daemonheim. (You also need level 30 Ranged.)"); + case 73: + return newstruct cs2func_script_978_struct(30, 17201, "Archleather vambraces (Tier 4)" + "
" + " (with 30 Ranged)", "You can now wear " + "" + "archleather vambraces" + "" + " within Daemonheim. (You also need level 30 Ranged.)"); + case 74: + return newstruct cs2func_script_978_struct(30, 17303, "Archleather boots (Tier 4)" + "
" + " (with 30 Ranged)", "You can now wear " + "" + "archleather boots" + "" + " within Daemonheim. (You also need level 30 Ranged.)"); + case 75: + return newstruct cs2func_script_978_struct(33, 17273, "Members: Flameburst defender" + "
" + " (with 33 Magic)", "Members can now wield " + "" + "flameburst defenders" + "" + " within Daemonheim. (They also need level 33 Magic.)"); + case 76: + return newstruct cs2func_script_978_struct(40, 16699, "Fractite full helm (Tier 5)", "You can now wear " + "" + "fractite full helms" + "" + " within Daemonheim."); + case 77: + return newstruct cs2func_script_978_struct(40, 17247, "Fractite platebody (Tier 5)", "You can now wear " + "" + "fractite platebodies" + "" + " within Daemonheim."); + case 78: + return newstruct cs2func_script_978_struct(40, 16721, "Fractite chainbody (Tier 5)", "You can now wear " + "" + "fractite chainbodies" + "" + " within Daemonheim."); + case 79: + return newstruct cs2func_script_978_struct(40, 16677, "Fractite platelegs (Tier 5)", "You can now wear " + "" + "fractite platelegs" + "" + " within Daemonheim."); + case 80: + return newstruct cs2func_script_978_struct(40, 16655, "Fractite plateskirt (Tier 5)", "You can now wear " + "" + "fractite plateskirts" + "" + " within Daemonheim."); + case 81: + return newstruct cs2func_script_978_struct(40, 16281, "Fractite gauntlets (Tier 5)", "You can now wear " + "" + "fractite gauntlets" + "" + " within Daemonheim."); + case 82: + return newstruct cs2func_script_978_struct(40, 16347, "Fractite boots (Tier 5)", "You can now wear " + "" + "fractite boots" + "" + " within Daemonheim."); + case 83: + return newstruct cs2func_script_978_struct(40, 17349, "Fractite kiteshield (Tier 5)", "You can now wield " + "" + "fractite kiteshields" + "" + " within Daemonheim."); + case 84: + return newstruct cs2func_script_978_struct(40, 16743, "Bryll hood (Tier 5)" + "
" + " (with 40 Magic)", "You can now wear " + "" + "bryll hoods" + "" + " within Daemonheim. (You also need level 40 Magic.)"); + case 85: + return newstruct cs2func_script_978_struct(40, 17225, "Bryll robe top (Tier 5)" + "
" + " (with 40 Magic)", "You can now wear " + "" + "bryll robe tops" + "" + " within Daemonheim. (You also need level 40 Magic.)"); + case 86: + return newstruct cs2func_script_978_struct(40, 16853, "Bryll robe bottom (Tier 5)" + "
" + " (with 40 Magic)", "You can now wear " + "" + "bryll robe bottoms" + "" + " within Daemonheim. (You also need level 40 Magic.)"); + case 87: + return newstruct cs2func_script_978_struct(40, 17159, "Bryll gloves (Tier 5)" + "
" + " (with 40 Magic)", "You can now wear " + "" + "bryll gloves" + "" + " within Daemonheim. (You also need level 40 Magic.)"); + case 88: + return newstruct cs2func_script_978_struct(40, 16919, "Bryll boots (Tier 5)" + "
" + " (with 40 Magic)", "You can now wear " + "" + "bryll boots" + "" + " within Daemonheim. (You also need level 40 Magic.)"); + case 89: + return newstruct cs2func_script_978_struct(40, 17049, "Dromoleather coif (Tier 5)" + "
" + " (with 40 Ranged)", "You can now wear " + "" + "dromoleather coifs" + "" + " within Daemonheim. (You also need level 40 Ranged.)"); + case 90: + return newstruct cs2func_script_978_struct(40, 17181, "Dromoleather body (Tier 5)" + "
" + " (with 40 Ranged)", "You can now wear " + "" + "dromoleather bodies" + "" + " within Daemonheim. (You also need level 40 Ranged.)"); + case 91: + return newstruct cs2func_script_978_struct(40, 17327, "Dromoleather chaps (Tier 5)" + "
" + " (with 40 Ranged)", "You can now wear " + "" + "dromoleather chaps" + "" + " within Daemonheim. (You also need level 40 Ranged.)"); + case 92: + return newstruct cs2func_script_978_struct(40, 17203, "Dromoleather vambraces (Tier 5)" + "
" + " (with 40 Ranged)", "You can now wear " + "" + "dromoleather vambraces" + "" + " within Daemonheim. (You also need level 40 Ranged.)"); + case 93: + return newstruct cs2func_script_978_struct(40, 17305, "Dromoleather boots (Tier 5)" + "
" + " (with 40 Ranged)", "You can now wear " + "" + "dromoleather boots" + "" + " within Daemonheim. (You also need level 40 Ranged.)"); + case 94: + return newstruct cs2func_script_978_struct(45, 17263, "Members: Golden precision bracelet ", "Members can now wear " + "" + "golden precision bracelets" + "" + " within Daemonheim."); + case 95: + return newstruct cs2func_script_978_struct(45, 17279, "Members: Shadow silk hood ", "Members can now wear " + "" + "shadow silk hoods" + "" + " within Daemonheim."); + case 96: + return newstruct cs2func_script_978_struct(48, 17267, "Members: Marksman boots ", "Members can now wear " + "" + "marksman boots" + "" + " within Daemonheim."); + case 97: + return newstruct cs2func_script_978_struct(50, 16701, "Members: Zephyrium full helm (Tier 6)", "Members can now wear " + "" + "zephyrium full helms" + "" + " within Daemonheim."); + case 98: + return newstruct cs2func_script_978_struct(50, 17249, "Members: Zephyrium platebody (Tier 6)", "Members can now wear " + "" + "zephyrium platebodies" + "" + " within Daemonheim."); + case 99: + return newstruct cs2func_script_978_struct(50, 16723, "Members: Zephyrium chainbody (Tier 6)", "Members can now wear " + "" + "zephyrium chainbodies" + "" + " within Daemonheim."); + case 100: + return newstruct cs2func_script_978_struct(50, 16679, "Members: Zephyrium platelegs (Tier 6)", "Members can now wear " + "" + "zephyrium platelegs" + "" + " within Daemonheim."); + case 101: + return newstruct cs2func_script_978_struct(50, 16657, "Members: Zephyrium plateskirt (Tier 6)", "Members can now wear " + "" + "zephyrium plateskirts" + "" + " within Daemonheim."); + case 102: + return newstruct cs2func_script_978_struct(50, 16283, "Members: Zephyrium gauntlets (Tier 6)", "Members can now wear " + "" + "zephyrium gauntlets" + "" + " within Daemonheim."); + case 103: + return newstruct cs2func_script_978_struct(50, 16349, "Members: Zephyrium boots (Tier 6)", "Members can now wear " + "" + "zephyrium boots" + "" + " within Daemonheim."); + case 104: + return newstruct cs2func_script_978_struct(50, 17351, "Members: Zephyrium kiteshield (Tier 6)", "Members can now wield " + "" + "zephyrium kiteshields" + "" + " within Daemonheim."); + case 105: + return newstruct cs2func_script_978_struct(50, 16745, "Members: Duskweed hood (Tier 6)" + "
" + " (with 50 Magic)", "Members can now wear " + "" + "duskweed hoods" + "" + " within Daemonheim. (They also need level 50 Magic.)"); + case 106: + return newstruct cs2func_script_978_struct(50, 17227, "Members: Duskweed robe top (Tier 6)" + "
" + " (with 50 Magic)", "Members can now wear " + "" + "duskweed robe tops" + "" + " within Daemonheim. (They also need level 50 Magic.)"); + case 107: + return newstruct cs2func_script_978_struct(50, 16855, "Members: Duskweed robe bottom (Tier 6)" + "
" + " (with 50 Magic)", "Members can now wear " + "" + "duskweed robe bottoms" + "" + " within Daemonheim. (They also need level 50 Magic.)"); + case 108: + return newstruct cs2func_script_978_struct(50, 17161, "Members: Duskweed gloves (Tier 6)" + "
" + " (with 50 Magic)", "Members can now wear " + "" + "duskweed gloves" + "" + " within Daemonheim. (They also need level 50 Magic.)"); + case 109: + return newstruct cs2func_script_978_struct(50, 16921, "Members: Duskweed boots (Tier 6)" + "
" + " (with 50 Magic)", "Members can now wear " + "" + "duskweed boots" + "" + " within Daemonheim. (They also need level 50 Magic.)"); + case 110: + return newstruct cs2func_script_978_struct(50, 17051, "Members: Spinoleather coif (Tier 6)" + "
" + " (with 50 Ranged)", "Members can now wear " + "" + "spinoleather coifs" + "" + " within Daemonheim. (They also need level 50 Ranged.)"); + case 111: + return newstruct cs2func_script_978_struct(50, 17183, "Members: Spinoleather body (Tier 6)" + "
" + " (with 50 Ranged)", "Members can now wear " + "" + "spinoleather bodies" + "" + " within Daemonheim. (They also need level 50 Ranged.)"); + case 112: + return newstruct cs2func_script_978_struct(50, 17329, "Members: Spinoleather chaps (Tier 6)" + "
" + " (with 50 Ranged)", "Members can now wear " + "" + "spinoleather chaps" + "" + " within Daemonheim. (They also need level 50 Ranged.)"); + case 113: + return newstruct cs2func_script_978_struct(50, 17205, "Members: Spinoleather vambraces (Tier 6)" + "
" + " (with 50 Ranged)", "Members can now wear " + "" + "spinoleather vambraces" + "" + " within Daemonheim. (They also need level 50 Ranged.)"); + case 114: + return newstruct cs2func_script_978_struct(50, 17307, "Members: Spinoleather boots (Tier 6)" + "
" + " (with 50 Ranged)", "Members can now wear " + "" + "spinoleather boots" + "" + " within Daemonheim. (They also need level 50 Ranged.)"); + case 115: + return newstruct cs2func_script_978_struct(54, 17271, "Members: Sorcerer's boots ", "Members can now wear " + "" + "sorcerer's boots" + "" + " within Daemonheim."); + case 116: + return newstruct cs2func_script_978_struct(57, 17281, "Members: Absorption boots" + "
" + " (with 57 Ranged) ", "Members can now wear " + "" + "absorption boots" + "" + " within Daemonheim. (They also need level 57 Ranged.)"); + case 117: + return newstruct cs2func_script_978_struct(60, 16703, "Members: Argonite full helm (Tier 7)", "Members can now wear " + "" + "argonite full helms" + "" + " within Daemonheim."); + case 118: + return newstruct cs2func_script_978_struct(60, 17251, "Members: Argonite platebody (Tier 7)", "Members can now wear " + "" + "argonite platebodies" + "" + " within Daemonheim."); + case 119: + return newstruct cs2func_script_978_struct(60, 16725, "Members: Argonite chainbody (Tier 7)", "Members can now wear " + "" + "argonite chainbodies" + "" + " within Daemonheim."); + case 120: + return newstruct cs2func_script_978_struct(60, 16681, "Members: Argonite platelegs (Tier 7)", "Members can now wear " + "" + "argonite platelegs" + "" + " within Daemonheim."); + case 121: + return newstruct cs2func_script_978_struct(60, 16659, "Members: Argonite plateskirt (Tier 7)", "Members can now wear " + "" + "argonite plateskirts" + "" + " within Daemonheim."); + case 122: + return newstruct cs2func_script_978_struct(60, 16285, "Members: Argonite gauntlets (Tier 7)", "Members can now wear " + "" + "argonite gauntlets" + "" + " within Daemonheim."); + case 123: + return newstruct cs2func_script_978_struct(60, 16351, "Members: Argonite boots (Tier 7)", "Members can now wear " + "" + "argonite boots" + "" + " within Daemonheim."); + case 124: + return newstruct cs2func_script_978_struct(60, 17353, "Members: Argonite kiteshield (Tier 7)", "Members can now wield " + "" + "argonite kiteshields" + "" + " within Daemonheim."); + case 125: + return newstruct cs2func_script_978_struct(60, 16747, "Members: Soulbell hood (Tier 7)" + "
" + " (with 60 Magic)", "Members can now wear " + "" + "soulbell hoods" + "" + " within Daemonheim. (They also need level 60 Magic.)"); + case 126: + return newstruct cs2func_script_978_struct(60, 17229, "Members: Soulbell robe top (Tier 7)" + "
" + " (with 60 Magic)", "Members can now wear " + "" + "soulbell robe tops" + "" + " within Daemonheim. (They also need level 60 Magic.)"); + case 127: + return newstruct cs2func_script_978_struct(60, 16857, "Members: Soulbell robe bottom (Tier 7)" + "
" + " (with 60 Magic)", "Members can now wear " + "" + "soulbell robe bottoms" + "" + " within Daemonheim. (They also need level 60 Magic.)"); + case 128: + return newstruct cs2func_script_978_struct(60, 17163, "Members: Soulbell gloves (Tier 7)" + "
" + " with 60 Magic)", "Members can now wear " + "" + "soulbell gloves" + "" + " within Daemonheim. (They also need level 60 Magic.)"); + case 129: + return newstruct cs2func_script_978_struct(60, 16923, "Members: Soulbell boots (Tier 7)" + "
" + " (with 60 Magic)", "Members can now wear " + "" + "soulbell boots" + "" + " within Daemonheim. (They also need level 60 Magic.)"); + case 130: + return newstruct cs2func_script_978_struct(60, 17053, "Members: Gallileather coif (Tier 7)" + "
" + " (with 60 Ranged)", "Members can now wear " + "" + "gallileather coifs" + "" + " within Daemonheim. (They also need level 60 Ranged.)"); + case 131: + return newstruct cs2func_script_978_struct(60, 17185, "Members: Gallileather body (Tier 7)" + "
" + " (with 60 Ranged)", "Members can now wear " + "" + "gallileather bodies" + "" + " within Daemonheim. (They also need level 60 Ranged.)"); + case 132: + return newstruct cs2func_script_978_struct(60, 17331, "Members: Gallileather chaps (Tier 7)" + "
" + " (with 60 Ranged)", "Members can now wear " + "" + "gallileather chaps" + "" + " within Daemonheim. (They also need level 60 Ranged.)"); + case 133: + return newstruct cs2func_script_978_struct(60, 17207, "Members: Gallileather vambraces (Tier 7)" + "
" + " (with 60 Ranged)", "Members can now wear " + "" + "gallileather vambraces" + "" + " within Daemonheim. (They also need level 60 Ranged.)"); + case 134: + return newstruct cs2func_script_978_struct(60, 17309, "Members: Gallileather boots (Tier 7)" + "
" + " (with 60 Ranged)", "Members can now wear " + "" + "gallileather boots" + "" + " within Daemonheim. (They also need level 60 Ranged.)"); + case 135: + return newstruct cs2func_script_978_struct(65, 17285, "Members: Protector's ward", "Members can now wield " + "" + "protector's wards" + "" + " within Daemonheim."); + case 136: + return newstruct cs2func_script_978_struct(70, 16705, "Members: Katagon full helm (Tier 8)", "Members can now wear " + "" + "katagon full helms" + "" + " within Daemonheim."); + case 137: + return newstruct cs2func_script_978_struct(70, 17253, "Members: Katagon platebody (Tier 8)", "Members can now wear " + "" + "katagon platebodies" + "" + " within Daemonheim."); + case 138: + return newstruct cs2func_script_978_struct(70, 16727, "Members: Katagon chainbody (Tier 8)", "Members can now wear " + "" + "katagon chainbodies" + "" + " within Daemonheim."); + case 139: + return newstruct cs2func_script_978_struct(70, 16683, "Members: Katagon platelegs (Tier 8)", "Members can now wear " + "" + "katagon platelegs" + "" + " within Daemonheim."); + case 140: + return newstruct cs2func_script_978_struct(70, 16661, "Members: Katagon plateskirt (Tier 8)", "Members can now wear " + "" + "katagon plateskirts" + "" + " within Daemonheim."); + case 141: + return newstruct cs2func_script_978_struct(70, 16287, "Members: Katagon gauntlets (Tier 8)", "Members can now wear " + "" + "katagon gauntlets" + "" + " within Daemonheim."); + case 142: + return newstruct cs2func_script_978_struct(70, 16353, "Members: Katagon boots (Tier 8)", "Members can now wear " + "" + "katagon boots" + "" + " within Daemonheim."); + case 143: + return newstruct cs2func_script_978_struct(70, 17355, "Members: Katagon kiteshield (Tier 8)", "Members can now wield " + "" + "katagon kiteshields" + "" + " within Daemonheim."); + case 144: + return newstruct cs2func_script_978_struct(70, 16749, "Members: Ectohood (Tier 8)" + "
" + " (with 70 Magic)", "Members can now wear " + "" + "ectohoods" + "" + " within Daemonheim. (They also need level 70 Magic.)"); + case 145: + return newstruct cs2func_script_978_struct(70, 17231, "Members: Ectorobe top (Tier 8)" + "
" + " (with 70 Magic)", "Members can now wear " + "" + "ectorobe tops" + "" + " within Daemonheim. (They also need level 70 Magic.)"); + case 146: + return newstruct cs2func_script_978_struct(70, 16859, "Members: Ectorobe bottom (Tier 8)" + "
" + " (with 70 Magic)", "Members can now wear " + "" + "ectorobe bottoms" + "" + " within Daemonheim. (They also need level 70 Magic.)"); + case 147: + return newstruct cs2func_script_978_struct(70, 17165, "Members: Ectogloves (Tier 8)" + "
" + " (with 70 Magic)", "Members can now wear " + "" + "ectogloves" + "" + " within Daemonheim. (They also need level 70 Magic.)"); + case 148: + return newstruct cs2func_script_978_struct(70, 16925, "Members: Ectoboots (Tier 8)" + "
" + " (with 70 Magic)", "Members can now wear " + "" + "ectoboots" + "" + " within Daemonheim. (They also need level 70 Magic.)"); + case 149: + return newstruct cs2func_script_978_struct(70, 17055, "Members: Stegoleather coif (Tier 8)" + "
" + " (with 70 Ranged)", "Members can now wear " + "" + "stegoleather coifs" + "" + " within Daemonheim. (They also need level 70 Ranged.)"); + case 150: + return newstruct cs2func_script_978_struct(70, 17187, "Members: Stegoleather body (Tier 8)" + "
" + " (with 70 Ranged)", "Members can now wear " + "" + "stegoleather bodies" + "" + " within Daemonheim. (They also need level 70 Ranged.)"); + case 151: + return newstruct cs2func_script_978_struct(70, 17333, "Members: Stegoleather chaps (Tier 8)" + "
" + " (with 70 Ranged)", "Members can now wear " + "" + "stegoleather chaps" + "" + " within Daemonheim. (They also need level 70 Ranged.)"); + case 152: + return newstruct cs2func_script_978_struct(70, 17209, "Members: Stegoleather vambraces (Tier 8)" + "
" + " (with 70 Ranged)", "Members can now wear " + "" + "stegoleather vambraces" + "" + " within Daemonheim. (They also need level 70 Ranged.)"); + case 153: + return newstruct cs2func_script_978_struct(70, 17311, "Members: Stegoleather boots (Tier 8)" + "
" + " (with 70 Ranged)", "Members can now wear " + "" + "stegoleather boots" + "" + " within Daemonheim. (They also need level 70 Ranged.)"); + case 154: + return newstruct cs2func_script_978_struct(80, 16707, "Members: Gorgonite full helm (Tier 9)", "Members can now wear " + "" + "gorgonite full helms" + "" + " within Daemonheim."); + case 155: + return newstruct cs2func_script_978_struct(80, 17255, "Members: Gorgonite platebody (Tier 9)", "Members can now wear " + "" + "gorgonite platebodies" + "" + " within Daemonheim."); + case 156: + return newstruct cs2func_script_978_struct(80, 16729, "Members: Gorgonite chainbody (Tier 9)", "Members can now wear " + "" + "gorgonite chainbodies" + "" + " within Daemonheim."); + case 157: + return newstruct cs2func_script_978_struct(80, 16685, "Members: Gorgonite platelegs (Tier 9)", "Members can now wear " + "" + "gorgonite platelegs" + "" + " within Daemonheim."); + case 158: + return newstruct cs2func_script_978_struct(80, 16663, "Members: Gorgonite plateskirt (Tier 9)", "Members can now wear " + "" + "gorgonite plateskirts" + "" + " within Daemonheim."); + case 159: + return newstruct cs2func_script_978_struct(80, 16289, "Members: Gorgonite gauntlets (Tier 9)", "Members can now wear " + "" + "gorgonite gauntlets" + "" + " within Daemonheim."); + case 160: + return newstruct cs2func_script_978_struct(80, 16355, "Members: Gorgonite boots (Tier 9)", "Members can now wear " + "" + "gorgonite boots" + "" + " within Daemonheim."); + case 161: + return newstruct cs2func_script_978_struct(80, 17357, "Members: Gorgonite kiteshield (Tier 9)", "Members can now wield " + "" + "gorgonite kiteshields" + "" + " within Daemonheim."); + case 162: + return newstruct cs2func_script_978_struct(80, 16751, "Members: Runic hood (Tier 9)" + "
" + " (with 80 Magic)", "Members can now wear " + "" + "runic hoods" + "" + " within Daemonheim. (They also need level 80 Magic.)"); + case 163: + return newstruct cs2func_script_978_struct(80, 17233, "Members: Runic robe top (Tier 9)" + "
" + " (with 80 Magic)", "Members can now wear " + "" + "runic robe tops" + "" + " within Daemonheim. (They also need level 80 Magic.)"); + case 164: + return newstruct cs2func_script_978_struct(80, 16861, "Members: Runic robe bottom (Tier 9)" + "
" + " (with 80 Magic)", "Members can now wear " + "" + "runic robe bottoms" + "" + " within Daemonheim. (They also need level 80 Magic.)"); + case 165: + return newstruct cs2func_script_978_struct(80, 17167, "Members: Runic gloves (Tier 9)" + "
" + " (with 80 Magic)", "Members can now wear " + "" + "runic gloves" + "" + " within Daemonheim. (They also need level 80 Magic.)"); + case 166: + return newstruct cs2func_script_978_struct(80, 16927, "Members: Runic boots (Tier 9)" + "
" + " (with 80 Magic)", "Members can now wear " + "" + "runic boots" + "" + " within Daemonheim. (They also need level 80 Magic.)"); + case 167: + return newstruct cs2func_script_978_struct(80, 17057, "Members: Megaleather coif (Tier 9)" + "
" + " (with 80 Ranged)", "Members can now wear " + "" + "megaleather coifs" + "" + " within Daemonheim. (They also need level 80 Ranged.)"); + case 168: + return newstruct cs2func_script_978_struct(80, 17189, "Members: Megaleather body (Tier 9)" + "
" + " (with 80 Ranged)", "Members can now wear " + "" + "megaleather bodies" + "" + " within Daemonheim. (They also need level 80 Ranged.)"); + case 169: + return newstruct cs2func_script_978_struct(80, 17335, "Members: Megaleather chaps (Tier 9)" + "
" + " (with 80 Ranged)", "Members can now wear " + "" + "megaleather chaps" + "" + " within Daemonheim. (They also need level 80 Ranged.)"); + case 170: + return newstruct cs2func_script_978_struct(80, 17211, "Members: Megaleather vambraces (Tier 9)" + "
" + " (with 80 Ranged)", "Members can now wear " + "" + "megaleather vambraces" + "" + " within Daemonheim. (They also need level 80 Ranged.)"); + case 171: + return newstruct cs2func_script_978_struct(80, 17313, "Members: Megaleather boots (Tier 9)" + "
" + " (with 80 Ranged)", "Members can now wear " + "" + "megaleather boots" + "" + " within Daemonheim. (They also need level 80 Ranged.)"); + case 172: + return newstruct cs2func_script_978_struct(83, 17283, "Members: Grounding boots" + "
" + " (with 83 Ranged) ", "Members can now wear " + "" + "grounding boots" + "" + " within Daemonheim. (They also need level 83 Ranged.)"); + case 173: + return newstruct cs2func_script_978_struct(90, 16709, "Members: Promethium full helm (Tier 10)", "Members can now wear " + "" + "promethium full helms" + "" + " within Daemonheim."); + case 174: + return newstruct cs2func_script_978_struct(90, 17257, "Members: Promethium platebody (Tier 10)", "Members can now wear " + "" + "promethium platebodies" + "" + " within Daemonheim."); + case 175: + return newstruct cs2func_script_978_struct(90, 16731, "Members: Promethium chainbody (Tier 10)", "Members can now wear " + "" + "promethium chainbodies" + "" + " within Daemonheim."); + case 176: + return newstruct cs2func_script_978_struct(90, 16687, "Members: Promethium platelegs (Tier 10)", "Members can now wear " + "" + "promethium platelegs" + "" + " within Daemonheim."); + case 177: + return newstruct cs2func_script_978_struct(90, 16665, "Members: Promethium plateskirt (Tier 10)", "Members can now wear " + "" + "promethium plateskirts" + "" + " within Daemonheim."); + case 178: + return newstruct cs2func_script_978_struct(90, 16291, "Members: Promethium gauntlets (Tier 10)", "Members can now wear " + "" + "promethium gauntlets" + "" + " within Daemonheim."); + case 179: + return newstruct cs2func_script_978_struct(90, 16357, "Members: Promethium boots (Tier 10)", "Members can now wear " + "" + "promethium boots" + "" + " within Daemonheim."); + case 180: + return newstruct cs2func_script_978_struct(90, 17359, "Members: Promethium kiteshield (Tier 10)", "Members can now wield " + "" + "promethium kiteshields" + "" + " within Daemonheim."); + case 181: + return newstruct cs2func_script_978_struct(90, 16753, "Members: Spiritbloom hood (Tier 10)" + "
" + " (with 90 Magic)", "Members can now wear " + "" + "spiritbloom hoods" + "" + " within Daemonheim. (They also need level 90 Magic.)"); + case 182: + return newstruct cs2func_script_978_struct(90, 17235, "Members: Spiritbloom robe top (Tier 10)" + "
" + " (with 90 Magic)", "Members can now wear " + "" + "spiritbloom robe tops" + "" + " within Daemonheim. (They also need level 90 Magic.)"); + case 183: + return newstruct cs2func_script_978_struct(90, 16863, "Members: Spiritbloom robe bottom (Tier 10)" + "
" + " (with 90 Magic)", "Members can now wear " + "" + "spiritbloom robe bottoms" + "" + " within Daemonheim. (They also need level 90 Magic.)"); + case 184: + return newstruct cs2func_script_978_struct(90, 17169, "Members: Spiritbloom gloves (Tier 10)" + "
" + " (with 90 Magic)", "Members can now wear " + "" + "spiritbloom gloves" + "" + " within Daemonheim. (They also need level 90 Magic.)"); + case 185: + return newstruct cs2func_script_978_struct(90, 16929, "Members: Spiritbloom boots (Tier 10)" + "
" + " (with 90 Magic)", "Members can now wear " + "" + "spiritbloom boots" + "" + " within Daemonheim. (They also need level 90 Magic.)"); + case 186: + return newstruct cs2func_script_978_struct(90, 17059, "Members: Tyrannoleather coif (Tier 10)" + "
" + " (with 90 Ranged)", "Members can now wear " + "" + "tyrannoleather coifs" + "" + " within Daemonheim. (They also need level 90 Ranged.)"); + case 187: + return newstruct cs2func_script_978_struct(90, 17191, "Members: Tyrannoleather body (Tier 10)" + "
" + " (with 90 Ranged)", "Members can now wear " + "" + "tyrannoleather bodies" + "" + " within Daemonheim. (They also need level 90 Ranged.)"); + case 188: + return newstruct cs2func_script_978_struct(90, 17337, "Members: Tyrannoleather chaps (Tier 10)" + "
" + " (with 90 Ranged)", "Members can now wear " + "" + "tyrannoleather chaps" + "" + " within Daemonheim. (They also need level 90 Ranged.)"); + case 189: + return newstruct cs2func_script_978_struct(90, 17213, "Members: Tyrannoleather vambraces (Tier 10)" + "
" + " (with 90 Ranged)", "Members can now wear " + "" + "tyrannoleather vambraces" + "" + " within Daemonheim. (They also need level 90 Ranged.)"); + case 190: + return newstruct cs2func_script_978_struct(90, 17315, "Members: Tyrannoleather boots (Tier 10)" + "
" + " (with 90 Ranged)", "Members can now wear " + "" + "tyrannoleather boots" + "" + " within Daemonheim. (They also need level 90 Ranged.)"); + case 191: + return newstruct cs2func_script_978_struct(94, 17287, "Members: Guardian's ward ", "Members can now wield " + "" + "guardian's wards" + "" + " within Daemonheim."); + case 192: + return newstruct cs2func_script_978_struct(99, 16711, "Members: Primal full helm (Tier 11)", "Members can now wear " + "" + "primal full helms" + "" + " within Daemonheim."); + case 193: + return newstruct cs2func_script_978_struct(99, 17259, "Members: Primal platebody (Tier 11)", "Members can now wear " + "" + "primal platebodies" + "" + " within Daemonheim."); + case 194: + return newstruct cs2func_script_978_struct(99, 16733, "Members: Primal chainbody (Tier 11)", "Members can now wear " + "" + "primal chainbodies" + "" + " within Daemonheim."); + case 195: + return newstruct cs2func_script_978_struct(99, 16689, "Members: Primal platelegs (Tier 11)", "Members can now wear " + "" + "primal platelegs" + "" + " within Daemonheim."); + case 196: + return newstruct cs2func_script_978_struct(99, 16667, "Members: Primal plateskirt (Tier 11)", "Members can now wear " + "" + "primal plateskirts" + "" + " within Daemonheim."); + case 197: + return newstruct cs2func_script_978_struct(99, 16293, "Members: Primal gauntlets (Tier 11)", "Members can now wear " + "" + "primal gauntlets" + "" + " within Daemonheim."); + case 198: + return newstruct cs2func_script_978_struct(99, 16359, "Members: Primal boots (Tier 11)", "Members can now wear " + "" + "primal boots" + "" + " within Daemonheim."); + case 199: + return newstruct cs2func_script_978_struct(99, 17361, "Members: Primal kiteshield (Tier 11)", "Members can now wield " + "" + "primal kiteshields" + "" + " within Daemonheim."); + case 200: + return newstruct cs2func_script_978_struct(99, 16755, "Members: Celestial hood (Tier 11)" + "
" + " (with 99 Magic)", "Members can now wear " + "" + "celestial hoods" + "" + " within Daemonheim. (They also need level 99 Magic.)"); + case 201: + return newstruct cs2func_script_978_struct(99, 17237, "Members: Celestial robe top (Tier 11)" + "
" + " (with 99 Magic)", "Members can now wear " + "" + "celestial robe tops" + "" + " within Daemonheim. (They also need level 99 Magic.)"); + case 202: + return newstruct cs2func_script_978_struct(99, 16865, "Members: Celestial robe bottom (Tier 11)" + "
" + " (with 99 Magic)", "Members can now wear " + "" + "celestial robe bottoms" + "" + " within Daemonheim. (They also need level 99 Magic.)"); + case 203: + return newstruct cs2func_script_978_struct(99, 17171, "Members: Celestial gloves (Tier 11)" + "
" + " (with 99 Magic)", "Members can now wear " + "" + "celestial gloves" + "" + " within Daemonheim. (They also need level 99 Magic.)"); + case 204: + return newstruct cs2func_script_978_struct(99, 16931, "Members: Celestial boots (Tier 11)" + "
" + " (with 99 Magic)", "Members can now wear " + "" + "celestial boots" + "" + " within Daemonheim. (They also need level 99 Magic.)"); + case 205: + return newstruct cs2func_script_978_struct(99, 17061, "Members: Sagittarian coif (Tier 11)" + "
" + " (with 99 Ranged)", "Members can now wear " + "" + "sagittarian coifs" + "" + " within Daemonheim. (They also need level 99 Ranged.)"); + case 206: + return newstruct cs2func_script_978_struct(99, 17193, "Members: Sagittarian body (Tier 11)" + "
" + " (with 99 Ranged)", "Members can now wear " + "" + "sagittarian bodies" + "" + " within Daemonheim. (They also need level 99 Ranged.)"); + case 207: + return newstruct cs2func_script_978_struct(99, 17339, "Members: Sagittarian chaps (Tier 11)" + "
" + " (with 99 Ranged)", "Members can now wear " + "" + "sagittarian chaps" + "" + " within Daemonheim. (They also need level 99 Ranged.)"); + case 208: + return newstruct cs2func_script_978_struct(99, 17215, "Members: Sagittarian vambraces (Tier 11)" + "
" + " (with 99 Ranged)", "Members can now wear " + "" + "sagittarian vambraces" + "" + " within Daemonheim. (They also need level 99 Ranged.)"); + case 209: + return newstruct cs2func_script_978_struct(99, 17317, "Members: Sagittarian boots (Tier 11)" + "
" + " (with 99 Ranged)", "Members can now wear " + "" + "sagittarian boots" + "" + " within Daemonheim. (They also need level 99 Ranged.)"); + } + break; + case 14: + if (((boolean)arg1)) { + return newstruct cs2func_script_978_struct(99, 9753, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Defence" + "" + ". Members can visit the " + "" + "Melee Instructor" + "" + " in " + "" + "Lumbridge" + "" + ". He has something special that is only available to true masters of the " + "" + "Defence" + "" + " skill!"); + } + } + return newstruct cs2func_script_978_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/979.cs2 b/dumps/scripts/979.cs2 new file mode 100644 index 000000000..a017417da --- /dev/null +++ b/dumps/scripts/979.cs2 @@ -0,0 +1,23 @@ +cs2func_script_979_struct(1,1,0) script_979(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_979_struct(1, "Arrows"); + case 1: + return newstruct cs2func_script_979_struct(1, "Bows"); + case 2: + return newstruct cs2func_script_979_struct(1, "Bolts"); + case 3: + return newstruct cs2func_script_979_struct(1, "Darts"); + case 4: + return newstruct cs2func_script_979_struct(1, "Crossbows"); + case 5: + return newstruct cs2func_script_979_struct(1, "Other"); + case 6: + return newstruct cs2func_script_979_struct(1, "Minigames"); + case 7: + return newstruct cs2func_script_979_struct(1, "Dungeoneering"); + case 8: + return newstruct cs2func_script_979_struct(1, "Milestones"); + } + return newstruct cs2func_script_979_struct(-1, ""); +} diff --git a/dumps/scripts/98.cs2 b/dumps/scripts/98.cs2 new file mode 100644 index 000000000..37c04a23c --- /dev/null +++ b/dumps/scripts/98.cs2 @@ -0,0 +1,8 @@ +void script_98(int arg0,int arg1,int arg2,int arg3,int arg4,int arg5,int arg6) { + createExtraChild(new WidgetPointer(arg0), 5, arg1); + setWidgetPosition(arg3, arg4, 0, 0); + setWidgetSize(arg5, arg6, 0, 0); + setWidgetSprite(arg2); + cs2method1107(1); + return; +} diff --git a/dumps/scripts/980.cs2 b/dumps/scripts/980.cs2 new file mode 100644 index 000000000..aa068e17f --- /dev/null +++ b/dumps/scripts/980.cs2 @@ -0,0 +1,359 @@ +cs2func_script_980_struct(2,2,0) script_980(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_980_struct(1, 882, "Bronze arrow", "You can now fletch " + "" + "bronze arrows" + "" + "."); + case 1: + return newstruct cs2func_script_980_struct(5, 2866, "Ogre arrow" + "
" + " (after starting Big Chompy Bird Hunting)", "You now have the Fletching level required to fletch " + "" + "ogre arrows" + "" + " (after starting Big Chompy Bird Hunting)."); + case 2: + return newstruct cs2func_script_980_struct(7, 4773, "Bronze 'brutal' arrow" + "
" + " (after starting Zogre Flesh Eaters)", "You now have the Fletching level required to fletch " + "" + "bronze 'brutal' arrows" + "" + " (after starting Zogre Flesh Eaters)."); + case 3: + return newstruct cs2func_script_980_struct(15, 884, "Iron arrow", "You can now fletch " + "" + "iron arrows" + "" + "."); + case 4: + return newstruct cs2func_script_980_struct(18, 4778, "Iron 'brutal' arrow" + "
" + " (after starting Zogre Flesh Eaters)", "You now have the Fletching level required to fletch " + "" + "iron 'brutal' arrows" + "" + " (after starting Zogre Flesh Eaters)."); + case 5: + return newstruct cs2func_script_980_struct(30, 886, "Steel arrow", "You can now fletch " + "" + "steel arrows" + "" + "."); + case 6: + return newstruct cs2func_script_980_struct(33, 4783, "Steel 'brutal' arrow" + "
" + " (after starting Zogre Flesh Eaters)", "You now have the Fletching level required to fletch " + "" + "steel 'brutal' arrows" + "" + " (after starting Zogre Flesh Eaters)."); + case 7: + return newstruct cs2func_script_980_struct(38, 4788, "Black 'brutal' arrow" + "
" + " (after starting Zogre Flesh Eaters)", "You now have the Fletching level required to fletch " + "" + "black 'brutal' arrows" + "" + " (after starting Zogre Flesh Eaters)."); + case 8: + return newstruct cs2func_script_980_struct(45, 888, "Mithril arrow", "You can now fletch " + "" + "mithril arrows" + "" + "."); + case 9: + return newstruct cs2func_script_980_struct(49, 4793, "Mithril 'brutal' arrow" + "
" + " (after starting Zogre Flesh Eaters)", "You now have the Fletching level required to fletch " + "" + "mithril 'brutal' arrows" + "" + " (after starting Zogre Flesh Eaters)."); + case 10: + return newstruct cs2func_script_980_struct(52, 13278, "Broad leaf arrows" + "
" + " (after Smoking Kills)", "You can now fletch " + "" + "broad leaf arrows" + "" + " (after Smoking Kills)."); + case 11: + return newstruct cs2func_script_980_struct(60, 890, "Adamant arrow", "You can now fletch " + "" + "adamant arrows" + "" + "."); + case 12: + return newstruct cs2func_script_980_struct(62, 4798, "Adamant 'brutal' arrow" + "
" + " (after starting Zogre Flesh Eaters)", "You now have the Fletching level required to fletch " + "" + "adamant 'brutal' arrows" + "" + " (after starting Zogre Flesh Eaters)."); + case 13: + return newstruct cs2func_script_980_struct(75, 892, "Rune arrow", "You can now fletch " + "" + "rune arrows" + "" + "."); + case 14: + return newstruct cs2func_script_980_struct(76, 21640, "Dragonbane arrows (after Ritual of the Mahjarrat)", "You can now fletch " + "" + "dragonbane arrowtips" + "" + " (after Ritual of the Mahjarrat)."); + case 15: + return newstruct cs2func_script_980_struct(76, 21645, "Wallasalkibane arrows (after Ritual of the Mahjarrat)", "You can now fletch " + "" + "wallasalkibane arrowtips" + "" + " (after Ritual of the Mahjarrat)."); + case 16: + return newstruct cs2func_script_980_struct(76, 21650, "Basiliskbane arrows (after Ritual of the Mahjarrat)", "You can now fletch " + "" + "basiliskbane arrowtips" + "" + " (after Ritual of the Mahjarrat)."); + case 17: + return newstruct cs2func_script_980_struct(76, 21655, "Abyssalbane arrows (after Ritual of the Mahjarrat)", "You can now fletch " + "" + "abyssalbane arrowtips" + "" + " (after Ritual of the Mahjarrat)."); + case 18: + return newstruct cs2func_script_980_struct(77, 4803, "Rune 'brutal' arrow" + "
" + " (after starting Zogre Flesh Eaters)", "You now have the Fletching level required to fletch " + "" + "rune 'brutal' arrows" + "" + " (after starting Zogre Flesh Eaters)."); + case 19: + return newstruct cs2func_script_980_struct(90, 11212, "Dragon arrow", "You can now fletch " + "" + "dragon arrows" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_980_struct(5, 841, "Shortbow", "You can now fletch " + "" + "shortbows" + "" + "."); + case 1: + return newstruct cs2func_script_980_struct(10, 839, "Longbow", "You can now fletch " + "" + "longbows" + "" + "."); + case 2: + return newstruct cs2func_script_980_struct(20, 843, "Oak shortbow", "You can now fletch " + "" + "oak shortbows" + "" + "."); + case 3: + return newstruct cs2func_script_980_struct(25, 845, "Oak longbow", "You can now fletch " + "" + "oak longbows" + "" + "."); + case 4: + return newstruct cs2func_script_980_struct(30, 4827, "Ogre composite bow" + "
" + " (after starting Zogre Flesh Eaters)", "You now have the Fletching level required to fletch " + "" + "ogre composite bows" + "" + " (after starting Zogre Flesh Eaters)."); + case 5: + return newstruct cs2func_script_980_struct(35, 849, "Willow shortbow", "You can now fletch " + "" + "willow shortbows" + "" + "."); + case 6: + return newstruct cs2func_script_980_struct(40, 847, "Willow longbow", "You can now fletch " + "" + "willow longbows" + "" + "."); + case 7: + return newstruct cs2func_script_980_struct(50, 853, "Maple shortbow", "You can now fletch " + "" + "maple shortbows" + "" + "."); + case 8: + return newstruct cs2func_script_980_struct(55, 851, "Maple longbow", "You can now fletch " + "" + "maple longbows" + "" + "."); + case 9: + return newstruct cs2func_script_980_struct(65, 857, "Yew shortbow", "You can now fletch " + "" + "yew shortbows" + "" + "."); + case 10: + return newstruct cs2func_script_980_struct(70, 855, "Yew longbow", "You can now fletch " + "" + "yew longbows" + "" + "."); + case 11: + return newstruct cs2func_script_980_struct(80, 861, "Magic shortbow", "You can now fletch " + "" + "magic shortbows" + "" + "."); + case 12: + return newstruct cs2func_script_980_struct(85, 859, "Magic longbow", "You can now fletch " + "" + "magic longbows" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_980_struct(9, 877, "Bronze bolt", "You can now fletch " + "" + "bronze bolts" + "" + "."); + case 1: + return newstruct cs2func_script_980_struct(11, 879, "Opal-tipped bronze bolt", "You can now fletch " + "" + "opal-tipped bronze bolts" + "" + "."); + case 2: + return newstruct cs2func_script_980_struct(24, 9139, "Blurite bolt" + "
" + " (after The Knight's Sword)", "You now have the Fletching level required to fletch " + "" + "blurite bolts" + "" + " (after The Knight's Sword)."); + case 3: + return newstruct cs2func_script_980_struct(26, 9335, "Jade-tipped blurite bolt" + "
" + " (after The Knight's Sword)", "You now have the Fletching level required to fletch " + "" + "jade-tipped blurite bolts" + "" + " (after The Knight's Sword)."); + case 4: + return newstruct cs2func_script_980_struct(32, 10158, "Kebbit-tipped hunting bolt", "You can now fletch " + "" + "kebbit-tipped hunting bolts" + "" + "."); + case 5: + return newstruct cs2func_script_980_struct(39, 9140, "Iron bolt", "You can now fletch " + "" + "iron bolts" + "" + "."); + case 6: + return newstruct cs2func_script_980_struct(41, 880, "Pearl-tipped iron bolt", "You can now fletch " + "" + "pearl-tipped iron bolts" + "" + "."); + case 7: + return newstruct cs2func_script_980_struct(42, 10159, "Long kebbit-tipped hunting bolt", "You can now fletch " + "" + "long kebbit-tipped hunting bolts" + "" + "."); + case 8: + return newstruct cs2func_script_980_struct(43, 9145, "Silver bolt", "You can now fletch " + "" + "silver bolts" + "" + "."); + case 9: + return newstruct cs2func_script_980_struct(46, 9141, "Steel bolt", "You can now fletch " + "" + "steel bolts" + "" + "."); + case 10: + return newstruct cs2func_script_980_struct(48, 9336, "Red topaz-tipped steel bolt", "You can now fletch " + "" + "red topaz-tipped steel bolts" + "" + "."); + case 11: + return newstruct cs2func_script_980_struct(51, 881, "Barbed bolts", "You can now fletch " + "" + "barbed bolts" + "" + "."); + case 12: + return newstruct cs2func_script_980_struct(54, 9142, "Mithril bolt", "You can now fletch " + "" + "mithril bolts" + "" + "."); + case 13: + return newstruct cs2func_script_980_struct(55, 13279, "Broad leaf bolts" + "
" + " (after Smoking Kills)", "You can now fletch " + "" + "broad leaf bolts" + "" + " (after Smoking Kills)."); + case 14: + return newstruct cs2func_script_980_struct(56, 9337, "Sapphire-tipped mithril bolt", "You can now fletch " + "" + "sapphire-tipped mithril bolts" + "" + "."); + case 15: + return newstruct cs2func_script_980_struct(58, 9338, "Emerald-tipped mithril bolt", "You can now fletch " + "" + "emerald-tipped mithril bolts" + "" + "."); + case 16: + return newstruct cs2func_script_980_struct(59, 9418, "Mithril grapple-tipped bolt", "You can now fletch " + "" + "mithril grapple-tipped bolts" + "" + "."); + case 17: + return newstruct cs2func_script_980_struct(61, 9143, "Adamantite bolt", "You can now fletch " + "" + "adamantite bolts" + "" + "."); + case 18: + return newstruct cs2func_script_980_struct(63, 9339, "Ruby-tipped adamantite bolt", "You can now fletch " + "" + "ruby-tipped adamantite bolts" + "" + "."); + case 19: + return newstruct cs2func_script_980_struct(65, 9340, "Diamond-tipped adamantite bolt", "You can now fletch " + "" + "diamond-tipped adamantite bolts" + "" + "."); + case 20: + return newstruct cs2func_script_980_struct(69, 9144, "Runite bolt", "You can now fletch " + "" + "runite bolts" + "" + "."); + case 21: + return newstruct cs2func_script_980_struct(71, 9341, "Dragonstone-tipped runite bolt", "You can now fletch " + "" + "dragonstone-tipped runite bolts" + "" + "."); + case 22: + return newstruct cs2func_script_980_struct(73, 9342, "Onyx-tipped runite bolt", "You can now fletch " + "" + "onyx-tipped runite bolts" + "" + "."); + case 23: + return newstruct cs2func_script_980_struct(80, 21660, "Dragonbane bolts (after Ritual of the Mahjarrat)", "You can now fletch " + "" + "dragonbane bolts" + "" + " (after Ritual of the Mahjarrat)."); + case 24: + return newstruct cs2func_script_980_struct(80, 21665, "Wallasalkibane bolts (after Ritual of the Mahjarrat)", "You can now fletch " + "" + "wallasalkibane bolts" + "" + " (after Ritual of the Mahjarrat)."); + case 25: + return newstruct cs2func_script_980_struct(80, 21670, "Basiliskbane bolts (after Ritual of the Mahjarrat)", "You can now fletch " + "" + "basiliskbane bolts" + "" + " (after Ritual of the Mahjarrat)."); + case 26: + return newstruct cs2func_script_980_struct(80, 21675, "Abyssalbane bolts (after Ritual of the Mahjarrat)", "You can now fletch " + "" + "abyssalbane bolts" + "" + " (after Ritual of the Mahjarrat)."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_980_struct(1, 806, "Bronze dart", "You can now fletch " + "" + "bronze darts" + "" + "."); + case 1: + return newstruct cs2func_script_980_struct(22, 807, "Iron dart", "You can now fletch " + "" + "iron darts" + "" + "."); + case 2: + return newstruct cs2func_script_980_struct(37, 808, "Steel dart", "You can now fletch " + "" + "steel darts" + "" + "."); + case 3: + return newstruct cs2func_script_980_struct(52, 809, "Mithril dart", "You can now fletch " + "" + "mithril darts" + "" + "."); + case 4: + return newstruct cs2func_script_980_struct(67, 810, "Adamant dart", "You can now fletch " + "" + "adamant darts" + "" + "."); + case 5: + return newstruct cs2func_script_980_struct(70, 21581, "Blisterwood stake", "You can now fletch " + "" + "blisterwood stakes" + "" + " (after The Branches of Darkmeyer)."); + case 6: + return newstruct cs2func_script_980_struct(81, 811, "Rune dart", "You can now fletch " + "" + "rune darts" + "" + "."); + case 7: + return newstruct cs2func_script_980_struct(95, 11230, "Dragon dart", "You can now fletch " + "" + "dragon darts" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_980_struct(9, 9440, "Bronze/wooden crossbow", "You can now fletch " + "" + "bronze and wooden crossbows" + "" + "."); + case 1: + return newstruct cs2func_script_980_struct(24, 9442, "Blurite/oak crossbow" + "
" + " (after The Knight's Sword)", "You now have the Fletching level required to fletch " + "" + "blurite and oak crossbows" + "" + " (after The Knight's Sword)."); + case 2: + return newstruct cs2func_script_980_struct(39, 9444, "Iron/willow crossbow", "You can now fletch " + "" + "iron and willow crossbows" + "" + "."); + case 3: + return newstruct cs2func_script_980_struct(46, 9446, "Steel/teak crossbow", "You can now fletch " + "" + "steel and teak crossbows" + "" + "."); + case 4: + return newstruct cs2func_script_980_struct(54, 9448, "Mithril/maple crossbow", "You can now fletch " + "" + "mithril and maple crossbows" + "" + "."); + case 5: + return newstruct cs2func_script_980_struct(61, 9450, "Adamantite/mahogany crossbow", "You can now fletch " + "" + "adamantite and mahogany crossbows" + "" + "."); + case 6: + return newstruct cs2func_script_980_struct(69, 9452, "Runite/yew crossbow", "You can now fletch " + "" + "runite and yew crossbows" + "" + "."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_980_struct(70, 21580, "Blisterwood staff", "You can now fletch " + "" + "blisterwood staves" + "" + " (after the Branches of Darkmeyer)."); + case 1: + return newstruct cs2func_script_980_struct(70, 21582, "Blisterwood polearm", "You can now fletch " + "" + "blisterwood polearms" + "" + " (after the Branches of Darkmeyer)."); + case 2: + return newstruct cs2func_script_980_struct(83, 21364, "Sagaie", "You can now fletch " + "" + "sagaies" + "" + "."); + case 3: + return newstruct cs2func_script_980_struct(87, 21365, "Bolas", "You can now fletch " + "" + "bolas" + "" + "."); + case 4: + return newstruct cs2func_script_980_struct(91, 18778, "Starved ancient effigies", "You can now investigate " + "" + "starved ancient effigies" + "" + " using your knowledge of Fletching."); + case 5: + return newstruct cs2func_script_980_struct(93, 18779, "Nourished ancient effigies", "You can now investigate " + "" + "nourished ancient effigies" + "" + " using your knowledge of Fletching."); + case 6: + return newstruct cs2func_script_980_struct(95, 18780, "Sated ancient effigies", "You can now investigate " + "" + "sated ancient effigies" + "" + " using your knowledge of Fletching."); + case 7: + return newstruct cs2func_script_980_struct(97, 18781, "Gorged ancient effigies", "You can now investigate " + "" + "gorged ancient effigies" + "" + " using your knowledge of Fletching."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_980_struct(1, 14192, "Stealing Creation - class 1 bow", "Members can now fletch " + "" + "class 1 bows" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_980_struct(1, 14202, "Stealing Creation - class 1 arrow", "You can now fletch " + "" + "class 1 arrows" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_980_struct(20, 14194, "Stealing Creation - class 2 bow", "Members can now fletch " + "" + "class 2 bows" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_980_struct(20, 14203, "Stealing Creation - class 2 arrow", "You can now fletch " + "" + "class 2 arrows" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_980_struct(40, 14196, "Stealing Creation - class 3 bow", "Members can now fletch " + "" + "class 3 bows" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_980_struct(40, 14204, "Stealing Creation - class 3 arrow", "You can now fletch " + "" + "class 3 arrows" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_980_struct(53, 14611, "Phoenix lair - cinnamon weaving ribbon", "Members can now fletch " + "" + "cinnamon weaving ribbon" + "" + " in the phoenix lair."); + case 7: + return newstruct cs2func_script_980_struct(53, 14612, "Phoenix lair - sassafras weaving ribbon", "Members can now fletch " + "" + "sassafras weaving ribbon" + "" + " in the phoenix lair."); + case 8: + return newstruct cs2func_script_980_struct(53, 14613, "Phoenix lair - ailanthus weaving ribbon", "Members can now fletch " + "" + "ailanthus weaving ribbon" + "" + " in the phoenix lair."); + case 9: + return newstruct cs2func_script_980_struct(53, 14614, "Phoenix lair - cedar weaving ribbon", "Members can now fletch " + "" + "cedar weaving ribbon" + "" + " in the phoenix lair."); + case 10: + return newstruct cs2func_script_980_struct(53, 14615, "Phoenix lair - mastic weaving ribbon", "Members can now fletch " + "" + "mastic weaving ribbon" + "" + " in the phoenix lair."); + case 11: + return newstruct cs2func_script_980_struct(60, 14198, "Stealing Creation - class 4 bow", "Members can now fletch " + "" + "class 4 bows" + "" + " in Stealing Creation."); + case 12: + return newstruct cs2func_script_980_struct(60, 14205, "Stealing Creation - class 4 arrow", "You can now fletch " + "" + "class 4 arrows" + "" + " in Stealing Creation."); + case 13: + return newstruct cs2func_script_980_struct(80, 14200, "Stealing Creation - class 5 bow", "Members can now fletch " + "" + "class 5 bows" + "" + " in Stealing Creation."); + case 14: + return newstruct cs2func_script_980_struct(80, 14206, "Stealing Creation - class 5 arrow", "You can now fletch " + "" + "class 5 arrows" + "" + " in Stealing Creation."); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_980_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Fletching level increases, you will be able to attempt higher-level fletching tasks within Daemonheim. You will also be more likely to succeed when attempting fletching tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_980_struct(1, 17742, "Tangle gum" + "
" + " 15 Arrow shafts", "You can now fletch " + "" + "tangle gum branches" + "" + " into " + "" + "15 arrow shafts" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_980_struct(1, 16427, "Novite arrows (Tier 1)", "You can now fletch " + "" + "novite arrows" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_980_struct(1, 16867, "Tangle gum shortbow (Tier 1)", "You can now fletch " + "" + "tangle gum shortbows" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_980_struct(3, 17756, "Tangle gum trap (Tier 1)", "You can now fletch " + "" + "tangle gum traps" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_980_struct(6, 16317, "Tangle gum longbow (Tier 1)", "You can now fletch " + "" + "tangle gum longbows" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_980_struct(8, 16977, "Tangle gum staff (Tier 1)", "You can now fletch " + "" + "tangle gum staves" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_980_struct(10, 17742, "Seeping elm" + "
" + " 21 Arrow shafts", "You can now fletch " + "" + "seeping elm branches" + "" + " into " + "" + "21 arrow shafts" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_980_struct(11, 16432, "Bathus arrows (Tier 2)", "You can now fletch " + "" + "bathus arrows" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_980_struct(11, 16869, "Seeping elm shortbow (Tier 2)", "You can now fletch " + "" + "seeping elm shortbows" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_980_struct(13, 17758, "Seeping elm trap (Tier 2)", "You can now fletch " + "" + "seeping elm traps" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_980_struct(16, 16319, "Seeping elm longbow (Tier 2)", "You can now fletch " + "" + "seeping elm longbows" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_980_struct(18, 16979, "Seeping elm staff (Tier 2)", "You can now fletch " + "" + "seeping elm staves" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_980_struct(20, 17742, "Blood spindle" + "
" + " 26 Arrow shafts", "You can now fletch " + "" + "blood spindle branches" + "" + " into " + "" + "26 arrow shafts" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_980_struct(21, 16871, "Blood spindle shortbow (Tier 3)", "You can now fletch " + "" + "blood spindle shortbows" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_980_struct(22, 16437, "Marmaros arrows (Tier 3)", "You can now fletch " + "" + "marmaros arrows" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_980_struct(23, 17760, "Blood spindle trap (Tier 3)", "You can now fletch " + "" + "blood spindle traps" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_980_struct(26, 16321, "Blood spindle longbow (Tier 3)", "You can now fletch " + "" + "blood spindle longbows" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_980_struct(28, 16981, "Blood spindle staff (Tier 3)", "You can now fletch " + "" + "blood spindle staves" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_980_struct(30, 17742, "Utuku" + "
" + " 32 Arrow shafts", "You can now fletch " + "" + "utuku branches" + "" + " into " + "" + "32 arrow shafts" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_980_struct(31, 16873, "Utuku shortbow (Tier 4)", "You can now fletch " + "" + "utuku shortbows" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_980_struct(33, 16442, "Kratonite arrows (Tier 4)", "You can now fletch " + "" + "kratonite arrows" + "" + " within Daemonheim."); + case 22: + return newstruct cs2func_script_980_struct(33, 17762, "Utuku trap (Tier 4)", "You can now fletch " + "" + "utuku traps" + "" + " within Daemonheim."); + case 23: + return newstruct cs2func_script_980_struct(36, 16323, "Utuku longbow (Tier 4)", "You can now fletch " + "" + "utuku longbows" + "" + " within Daemonheim."); + case 24: + return newstruct cs2func_script_980_struct(38, 16983, "Utuku staff (Tier 4)", "You can now fletch " + "" + "utuku staves" + "" + " within Daemonheim."); + case 25: + return newstruct cs2func_script_980_struct(40, 17742, "Spinebeam" + "
" + " 37 Arrow shafts", "You can now fletch " + "" + "spinebeam branches" + "" + " into " + "" + "37 arrow shafts" + "" + " within Daemonheim."); + case 26: + return newstruct cs2func_script_980_struct(41, 16875, "Spinebeam shortbow (Tier 5)", "You can now fletch " + "" + "spinebeam shortbows" + "" + " within Daemonheim."); + case 27: + return newstruct cs2func_script_980_struct(43, 17764, "Spinebeam trap (Tier 5)", "You can now fletch " + "" + "spinebeam traps" + "" + " within Daemonheim."); + case 28: + return newstruct cs2func_script_980_struct(44, 16447, "Fractite arrows (Tier 5)", "You can now fletch " + "" + "fractite arrows" + "" + " within Daemonheim."); + case 29: + return newstruct cs2func_script_980_struct(46, 16325, "Spinebeam longbow (Tier 5)", "You can now fletch " + "" + "spinebeam longbows" + "" + " within Daemonheim."); + case 30: + return newstruct cs2func_script_980_struct(48, 16985, "Spinebeam staff (Tier 5)", "You can now fletch " + "" + "spinebeam staves" + "" + " within Daemonheim."); + case 31: + return newstruct cs2func_script_980_struct(50, 17742, "Bovistrangler" + "
" + " 43 Arrow shafts", "You can now fletch " + "" + "bovistrangler branches" + "" + " into " + "" + "43 arrow shafts" + "" + " within Daemonheim."); + case 32: + return newstruct cs2func_script_980_struct(51, 16877, "Bovistrangler shortbow (Tier 6)", "You can now fletch " + "" + "bovistrangler shortbows" + "" + " within Daemonheim."); + case 33: + return newstruct cs2func_script_980_struct(53, 17766, "Bovistrangler trap (Tier 6)", "You can now fletch " + "" + "bovistrangler traps" + "" + " within Daemonheim."); + case 34: + return newstruct cs2func_script_980_struct(55, 16452, "Zephyrium arrows (Tier 6)", "You can now fletch " + "" + "zephyrium arrows" + "" + " within Daemonheim."); + case 35: + return newstruct cs2func_script_980_struct(56, 16327, "Bovistrangler longbow (Tier 6)", "You can now fletch " + "" + "bovistrangler longbows" + "" + " within Daemonheim."); + case 36: + return newstruct cs2func_script_980_struct(58, 16987, "Bovistrangler staff (Tier 6)", "You can now fletch " + "" + "bovistrangler staves" + "" + " within Daemonheim."); + case 37: + return newstruct cs2func_script_980_struct(60, 17742, "Thigat" + "
" + " 48 Arrow shafts", "You can now fletch " + "" + "thigat branches" + "" + " into " + "" + "48 arrow shafts" + "" + " within Daemonheim."); + case 38: + return newstruct cs2func_script_980_struct(61, 16879, "Thigat shortbow (Tier 7)", "You can now fletch " + "" + "thigat shortbows" + "" + " within Daemonheim."); + case 39: + return newstruct cs2func_script_980_struct(63, 17768, "Thigat trap (Tier 7)", "You can now fletch " + "" + "thigat traps" + "" + " within Daemonheim."); + case 40: + return newstruct cs2func_script_980_struct(66, 16457, "Argonite arrows (Tier 7)", "You can now fletch " + "" + "argonite arrows" + "" + " within Daemonheim."); + case 41: + return newstruct cs2func_script_980_struct(66, 16329, "Thigat longbow (Tier 7)", "You can now fletch " + "" + "thigat longbows" + "" + " within Daemonheim."); + case 42: + return newstruct cs2func_script_980_struct(68, 16989, "Thigat staff (Tier 7)", "You can now fletch " + "" + "thigat staves" + "" + " within Daemonheim."); + case 43: + return newstruct cs2func_script_980_struct(70, 17742, "Corpsethorn" + "
" + " 54 Arrow shafts", "You can now fletch " + "" + "corpsethorn branches" + "" + " into " + "" + "54 arrow shafts" + "" + " within Daemonheim."); + case 44: + return newstruct cs2func_script_980_struct(71, 16881, "Corpsethorn shortbow (Tier 8)", "You can now fletch " + "" + "corpsethorn shortbows" + "" + " within Daemonheim."); + case 45: + return newstruct cs2func_script_980_struct(73, 17770, "Corpsethorn trap (Tier 8)", "You can now fletch " + "" + "corpsethorn traps" + "" + " within Daemonheim."); + case 46: + return newstruct cs2func_script_980_struct(76, 16331, "Corpsethorn longbow (Tier 8)", "You can now fletch " + "" + "corpsethorn longbows" + "" + " within Daemonheim."); + case 47: + return newstruct cs2func_script_980_struct(77, 16462, "Katagon arrows (Tier 8)", "You can now fletch " + "" + "katagon arrows" + "" + " within Daemonheim."); + case 48: + return newstruct cs2func_script_980_struct(78, 16991, "Corpsethorn staff (Tier 8)", "You can now fletch " + "" + "corpsethorn staves" + "" + " within Daemonheim."); + case 49: + return newstruct cs2func_script_980_struct(80, 17742, "Entgallow" + "
" + " 59 Arrow shafts", "You can now fletch " + "" + "entgallow branches" + "" + " into " + "" + "59 arrow shafts" + "" + " within Daemonheim."); + case 50: + return newstruct cs2func_script_980_struct(81, 16883, "Entgallow shortbow (Tier 9)", "You can now fletch " + "" + "entgallow shortbows" + "" + " within Daemonheim."); + case 51: + return newstruct cs2func_script_980_struct(83, 17772, "Entgallow trap (Tier 9)", "You can now fletch " + "" + "entgallow traps" + "" + " within Daemonheim."); + case 52: + return newstruct cs2func_script_980_struct(86, 16333, "Entgallow longbow (Tier 9)", "You can now fletch " + "" + "entgallow longbows" + "" + " within Daemonheim."); + case 53: + return newstruct cs2func_script_980_struct(88, 16467, "Gorgonite arrows (Tier 9)", "You can now fletch " + "" + "gorgonite arrows" + "" + " within Daemonheim."); + case 54: + return newstruct cs2func_script_980_struct(88, 16993, "Entgallow staff (Tier 9)", "You can now fletch " + "" + "entgallow staves" + "" + " within Daemonheim."); + case 55: + return newstruct cs2func_script_980_struct(90, 17742, "Grave creeper" + "
" + " 65 Arrow shafts", "You can now fletch " + "" + "grave creeper branches" + "" + " into " + "" + "65 arrow shafts" + "" + " within Daemonheim."); + case 56: + return newstruct cs2func_script_980_struct(91, 16885, "Grave creeper shortbow (Tier 10)", "You can now fletch " + "" + "grave creeper shortbows" + "" + " within Daemonheim."); + case 57: + return newstruct cs2func_script_980_struct(93, 17774, "Grave creeper trap (Tier 10)", "You can now fletch " + "" + "grave creeper traps" + "" + " within Daemonheim."); + case 58: + return newstruct cs2func_script_980_struct(96, 16335, "Grave creeper longbow (Tier 10)", "You can now fletch " + "" + "grave creeper longbows" + "" + " within Daemonheim."); + case 59: + return newstruct cs2func_script_980_struct(98, 16995, "Grave creeper staff (Tier 10)", "You can now fletch " + "" + "grave creeper staves" + "" + " within Daemonheim."); + case 60: + return newstruct cs2func_script_980_struct(99, 16472, "Promethium arrows (Tier 10)", "You can now fletch promethium arrows" + "" + " within Daemonheim."); + } + break; + case 8: + if (((boolean)arg1)) { + return newstruct cs2func_script_980_struct(99, 9783, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Fletching" + "" + ". Why not visit " + "" + "Hickton" + "" + " who runs the " + "" + "bow and arrow shop" + "" + " in " + "" + "Catherby" + "" + "? He has something special that is only available to true masters of the " + "" + "Fletching" + "" + " skill!"); + } + } + return newstruct cs2func_script_980_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/981.cs2 b/dumps/scripts/981.cs2 new file mode 100644 index 000000000..b62ef4be9 --- /dev/null +++ b/dumps/scripts/981.cs2 @@ -0,0 +1,35 @@ +cs2func_script_981_struct(1,1,0) script_981(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_981_struct(0, "Bronze"); + case 1: + return newstruct cs2func_script_981_struct(0, "Iron"); + case 2: + return newstruct cs2func_script_981_struct(0, "Steel"); + case 3: + return newstruct cs2func_script_981_struct(0, "Black"); + case 4: + return newstruct cs2func_script_981_struct(1, "White"); + case 5: + return newstruct cs2func_script_981_struct(0, "Mithril"); + case 6: + return newstruct cs2func_script_981_struct(0, "Adamant"); + case 7: + return newstruct cs2func_script_981_struct(0, "Rune"); + case 8: + return newstruct cs2func_script_981_struct(0, "Dragon"); + case 9: + return newstruct cs2func_script_981_struct(1, "Barrows"); + case 10: + return newstruct cs2func_script_981_struct(0, "Special"); + case 11: + return newstruct cs2func_script_981_struct(1, "Salamanders"); + case 12: + return newstruct cs2func_script_981_struct(1, "Minigames"); + case 13: + return newstruct cs2func_script_981_struct(0, "Dungeoneering"); + case 14: + return newstruct cs2func_script_981_struct(0, "Milestones"); + } + return newstruct cs2func_script_981_struct(-1, ""); +} diff --git a/dumps/scripts/982.cs2 b/dumps/scripts/982.cs2 new file mode 100644 index 000000000..81c513612 --- /dev/null +++ b/dumps/scripts/982.cs2 @@ -0,0 +1,780 @@ +cs2func_script_982_struct(2,2,0) script_982(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(1, 1205, "Bronze dagger", "You can now wield " + "" + "bronze daggers" + "" + "."); + case 1: + return newstruct cs2func_script_982_struct(1, 1351, "Bronze hatchet", "You can now wield " + "" + "bronze hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_982_struct(1, 1422, "Bronze mace", "You can now wield " + "" + "bronze maces" + "" + "."); + case 3: + return newstruct cs2func_script_982_struct(1, 3095, "Members: Bronze claws", "Members can now wield " + "" + "bronze claws" + "" + "."); + case 4: + return newstruct cs2func_script_982_struct(1, 1277, "Bronze sword", "You can now wield " + "" + "bronze swords" + "" + "."); + case 5: + return newstruct cs2func_script_982_struct(1, 1291, "Bronze longsword", "You can now wield " + "" + "bronze longswords" + "" + "."); + case 6: + return newstruct cs2func_script_982_struct(1, 1321, "Bronze scimitar", "You can now wield " + "" + "bronze scimitars" + "" + "."); + case 7: + return newstruct cs2func_script_982_struct(1, 1237, "Members: Bronze spear", "Members can now wield " + "" + "bronze spears" + "" + "."); + case 8: + return newstruct cs2func_script_982_struct(1, 1337, "Bronze warhammer", "You can now wield " + "" + "bronze warhammers" + "" + "."); + case 9: + return newstruct cs2func_script_982_struct(1, 1375, "Bronze battleaxe", "You can now wield " + "" + "bronze battleaxes" + "" + "."); + case 10: + return newstruct cs2func_script_982_struct(1, 1307, "Bronze two-handed sword", "You can now wield " + "" + "bronze two-handed swords" + "" + "."); + case 11: + return newstruct cs2func_script_982_struct(1, 3190, "Members: Bronze halberd", "Members can now wield " + "" + "bronze halberds" + "" + "."); + case 12: + return newstruct cs2func_script_982_struct(1, 8844, "Members: Bronze defender", "Members can now wield " + "" + "bronze defenders" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(1, 1203, "Iron dagger", "You can now wield " + "" + "iron daggers" + "" + "."); + case 1: + return newstruct cs2func_script_982_struct(1, 1349, "Iron hatchet", "You can now wield " + "" + "iron hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_982_struct(1, 1420, "Iron mace", "You can now wield " + "" + "iron maces" + "" + "."); + case 3: + return newstruct cs2func_script_982_struct(1, 3096, "Members: Iron claws", "Members can now wield " + "" + "iron claws" + "" + "."); + case 4: + return newstruct cs2func_script_982_struct(1, 1279, "Iron sword", "You can now wield " + "" + "iron swords" + "" + "."); + case 5: + return newstruct cs2func_script_982_struct(1, 1293, "Iron longsword", "You can now wield " + "" + "iron longswords" + "" + "."); + case 6: + return newstruct cs2func_script_982_struct(1, 1323, "Iron scimitar", "You can now wield " + "" + "iron scimitars" + "" + "."); + case 7: + return newstruct cs2func_script_982_struct(1, 20533, "Members: Iron Ceremonial Sword", "Members can now wield " + "" + "iron ceremonial swords" + "" + "."); + case 8: + return newstruct cs2func_script_982_struct(1, 1239, "Members: Iron spear", "Members can now wield " + "" + "iron spears" + "" + "."); + case 9: + return newstruct cs2func_script_982_struct(1, 1335, "Iron warhammer", "You can now wield " + "" + "iron warhammers" + "" + "."); + case 10: + return newstruct cs2func_script_982_struct(1, 1363, "Iron battleaxe", "You can now wield " + "" + "iron battleaxes" + "" + "."); + case 11: + return newstruct cs2func_script_982_struct(1, 1309, "Iron two-handed sword", "You can now wield " + "" + "iron two-handed swords" + "" + "."); + case 12: + return newstruct cs2func_script_982_struct(1, 3192, "Members: Iron halberd", "Members can now wield " + "" + "iron halberds" + "" + "."); + case 13: + return newstruct cs2func_script_982_struct(1, 8845, "Members: Iron defender", "Members can now wield " + "" + "iron defenders" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(5, 1207, "Steel dagger", "You can now wield " + "" + "steel daggers" + "" + "."); + case 1: + return newstruct cs2func_script_982_struct(5, 1353, "Steel hatchet", "You can now wield " + "" + "steel hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_982_struct(5, 1424, "Steel mace", "You can now wield " + "" + "steel maces" + "" + "."); + case 3: + return newstruct cs2func_script_982_struct(5, 3097, "Members: Steel claws", "Members can now wield " + "" + "steel claws" + "" + "."); + case 4: + return newstruct cs2func_script_982_struct(5, 1281, "Steel sword", "You can now wield " + "" + "steel swords" + "" + "."); + case 5: + return newstruct cs2func_script_982_struct(5, 1295, "Steel longsword", "You can now wield " + "" + "steel longswords" + "" + "."); + case 6: + return newstruct cs2func_script_982_struct(5, 1325, "Steel scimitar", "You can now wield " + "" + "steel scimitars" + "" + "."); + case 7: + return newstruct cs2func_script_982_struct(5, 20538, "Members: Steel Ceremonial Sword", "Members can now wield " + "" + "steel ceremonial swords" + "" + "."); + case 8: + return newstruct cs2func_script_982_struct(5, 1241, "Members: Steel spear", "Members can now wield " + "" + "steel spears" + "" + "."); + case 9: + return newstruct cs2func_script_982_struct(5, 1339, "Steel warhammer", "You can now wield " + "" + "steel warhammers" + "" + "."); + case 10: + return newstruct cs2func_script_982_struct(5, 1365, "Steel battleaxe", "You can now wield " + "" + "steel battleaxes" + "" + "."); + case 11: + return newstruct cs2func_script_982_struct(5, 1311, "Steel two-handed sword", "You can now wield " + "" + "steel two-handed swords" + "" + "."); + case 12: + return newstruct cs2func_script_982_struct(5, 3194, "Members: Steel halberd", "Members can now wield " + "" + "steel halberds" + "" + "."); + case 13: + return newstruct cs2func_script_982_struct(5, 8846, "Members: Steel defender" + "
" + " (with 5 Defence)", "Members now have the Attack level required to wield " + "" + "steel defenders" + "" + ". (They also need level 5 Defence.)"); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(10, 1217, "Black dagger", "You can now wield " + "" + "black daggers" + "" + "."); + case 1: + return newstruct cs2func_script_982_struct(10, 1361, "Black hatchet", "You can now wield " + "" + "black hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_982_struct(10, 1426, "Black mace", "You can now wield " + "" + "black maces" + "" + "."); + case 3: + return newstruct cs2func_script_982_struct(10, 3098, "Members: Black claws", "Members can now wield " + "" + "black claws" + "" + "."); + case 4: + return newstruct cs2func_script_982_struct(10, 1283, "Black sword", "You can now wield " + "" + "black swords" + "" + "."); + case 5: + return newstruct cs2func_script_982_struct(10, 1297, "Black longsword", "You can now wield " + "" + "black longswords" + "" + "."); + case 6: + return newstruct cs2func_script_982_struct(10, 1327, "Black scimitar", "You can now wield " + "" + "black scimitars" + "" + "."); + case 7: + return newstruct cs2func_script_982_struct(10, 4580, "Members: Black spear", "Members can now wield " + "" + "black spears" + "" + "."); + case 8: + return newstruct cs2func_script_982_struct(10, 1341, "Black warhammer", "You can now wield " + "" + "black warhammers" + "" + "."); + case 9: + return newstruct cs2func_script_982_struct(10, 1367, "Black battleaxe", "You can now wield " + "" + "black battleaxes" + "" + "."); + case 10: + return newstruct cs2func_script_982_struct(10, 1313, "Black two-handed sword", "You can now wield " + "" + "black two-handed swords" + "" + "."); + case 11: + return newstruct cs2func_script_982_struct(10, 3196, "Members: Black halberd", "Members can now wield " + "" + "black halberds" + "" + "."); + case 12: + return newstruct cs2func_script_982_struct(10, 8847, "Members: Black defender" + "
" + " (with 10 Defence)", "Members now have the Attack level required to wield " + "" + "black defenders" + "" + ". (They also need level 10 Defence.)"); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(-1, 7620, "To wield any white equipment, you must have completed Wanted!.", ""); + case 1: + return newstruct cs2func_script_982_struct(10, 6591, "Members: White dagger", "Members can now wield " + "" + "white daggers" + "" + " (after finishing Wanted!)."); + case 2: + return newstruct cs2func_script_982_struct(10, 6601, "Members: White mace", "Members can now wield " + "" + "white maces" + "" + " (after finishing Wanted!)."); + case 3: + return newstruct cs2func_script_982_struct(10, 6587, "Members: White claws", "Members can now wield " + "" + "white claws" + "" + " (after finishing Wanted!)."); + case 4: + return newstruct cs2func_script_982_struct(10, 6605, "Members: White sword", "Members can now wield " + "" + "white swords" + "" + " (after finishing Wanted!)."); + case 5: + return newstruct cs2func_script_982_struct(10, 6607, "Members: White longsword", "Members can now wield " + "" + "white longswords" + "" + " (after finishing Wanted!)."); + case 6: + return newstruct cs2func_script_982_struct(10, 6611, "Members: White scimitar", "Members can now wield " + "" + "white scimitars" + "" + " (after finishing Wanted!)."); + case 7: + return newstruct cs2func_script_982_struct(10, 6613, "Members: White warhammer", "Members can now wield " + "" + "white warhammers" + "" + " (after finishing Wanted!)."); + case 8: + return newstruct cs2func_script_982_struct(10, 6589, "Members: White battleaxe", "Members can now wield " + "" + "white battleaxes" + "" + " (after finishing Wanted!)."); + case 9: + return newstruct cs2func_script_982_struct(10, 6609, "Members: White two-handed sword", "Members can now wield " + "" + "white two-handed swords" + "" + " (after finishing Wanted!)."); + case 10: + return newstruct cs2func_script_982_struct(10, 6599, "Members: White halberd", "Members can now wield " + "" + "white halberds" + "" + " (after finishing Wanted!)."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(20, 1209, "Mithril dagger", "You can now wield mithril daggers" + "" + "."); + case 1: + return newstruct cs2func_script_982_struct(20, 1355, "Mithril hatchet", "You can now wield mithril hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_982_struct(20, 1428, "Mithril mace", "You can now wield mithril maces" + "" + "."); + case 3: + return newstruct cs2func_script_982_struct(20, 3099, "Members: Mithril claws", "Members can now wield mithril claws" + "" + "."); + case 4: + return newstruct cs2func_script_982_struct(20, 1285, "Mithril sword", "You can now wield mithril swords" + "" + "."); + case 5: + return newstruct cs2func_script_982_struct(20, 1299, "Mithril longsword", "You can now wield mithril longswords" + "" + "."); + case 6: + return newstruct cs2func_script_982_struct(20, 1329, "Mithril scimitar", "You can now wield mithril scimitars" + "" + "."); + case 7: + return newstruct cs2func_script_982_struct(20, 20543, "Members: Mithril Ceremonial Sword", "Members can now wield " + "" + "mithril ceremonial swords" + "" + "."); + case 8: + return newstruct cs2func_script_982_struct(20, 1243, "Members: Mithril spear", "Members can now wield mithril spears" + "" + "."); + case 9: + return newstruct cs2func_script_982_struct(20, 1343, "Mithril warhammer", "You can now wield mithril warhammers" + "" + "."); + case 10: + return newstruct cs2func_script_982_struct(20, 1369, "Mithril battleaxe", "You can now wield mithril battleaxes" + "" + "."); + case 11: + return newstruct cs2func_script_982_struct(20, 1315, "Mithril two-handed sword", "You can now wield mithril two-handed swords" + "" + "."); + case 12: + return newstruct cs2func_script_982_struct(20, 3198, "Members: Mithril halberd", "Members can now wield mithril halberds" + "" + "."); + case 13: + return newstruct cs2func_script_982_struct(20, 8848, "Members: Mithril defender" + "
" + " (with 20 Defence)", "Members now have the Attack level required to wield mithril defenders" + "" + ". (They also need level 20 Defence.)"); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(30, 1211, "Adamant dagger", "You can now wield " + "" + "adamant daggers" + "" + "."); + case 1: + return newstruct cs2func_script_982_struct(30, 1357, "Adamant hatchet", "You can now wield " + "" + "adamant hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_982_struct(30, 1430, "Adamant mace", "You can now wield " + "" + "adamant maces" + "" + "."); + case 3: + return newstruct cs2func_script_982_struct(30, 3100, "Members: Adamant claws", "Members can now wield " + "" + "adamant claws" + "" + "."); + case 4: + return newstruct cs2func_script_982_struct(30, 1287, "Adamant sword", "You can now wield " + "" + "adamant swords" + "" + "."); + case 5: + return newstruct cs2func_script_982_struct(30, 1301, "Adamant longsword", "You can now wield " + "" + "adamant longswords" + "" + "."); + case 6: + return newstruct cs2func_script_982_struct(30, 1331, "Adamant scimitar", "You can now wield " + "" + "adamant scimitars" + "" + "."); + case 7: + return newstruct cs2func_script_982_struct(30, 20548, "Members: Adamant Ceremonial Sword", "Members can now wield " + "" + "adamant ceremonial swords" + "" + "."); + case 8: + return newstruct cs2func_script_982_struct(30, 1245, "Members: Adamant spear", "Members can now wield " + "" + "adamant spears" + "" + "."); + case 9: + return newstruct cs2func_script_982_struct(30, 1345, "Adamant warhammer", "You can now wield " + "" + "adamant warhammers" + "" + "."); + case 10: + return newstruct cs2func_script_982_struct(30, 1371, "Adamant battleaxe", "You can now wield " + "" + "adamant battleaxes" + "" + "."); + case 11: + return newstruct cs2func_script_982_struct(30, 1317, "Adamant two-handed sword", "You can now wield " + "" + "adamant two-handed swords" + "" + "."); + case 12: + return newstruct cs2func_script_982_struct(30, 3200, "Members: Adamant halberd", "Members can now wield " + "" + "adamant halberds" + "" + "."); + case 13: + return newstruct cs2func_script_982_struct(30, 8849, "Members: Adamant defender" + "
" + " (with 30 Defence)", "Members now have the Attack level required to wield " + "" + "adamant defenders" + "" + ". (They also need level 30 Defence.)"); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(40, 1213, "Rune dagger", "You can now wield " + "" + "rune daggers" + "" + "."); + case 1: + return newstruct cs2func_script_982_struct(40, 1359, "Rune hatchet", "You can now wield " + "" + "rune hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_982_struct(40, 1432, "Rune mace", "You can now wield " + "" + "rune maces" + "" + "."); + case 3: + return newstruct cs2func_script_982_struct(40, 3101, "Members: Rune claws", "Members can now wield " + "" + "rune claws" + "" + "."); + case 4: + return newstruct cs2func_script_982_struct(40, 1289, "Rune sword", "You can now wield " + "" + "rune swords" + "" + "."); + case 5: + return newstruct cs2func_script_982_struct(40, 1303, "Rune longsword", "You can now wield " + "" + "rune longswords" + "" + "."); + case 6: + return newstruct cs2func_script_982_struct(40, 1333, "Rune scimitar", "You can now wield " + "" + "rune scimitars" + "" + "."); + case 7: + return newstruct cs2func_script_982_struct(40, 20553, "Members: Rune Ceremonial Sword", "Members can now wield " + "" + "rune ceremonial swords" + "" + "."); + case 8: + return newstruct cs2func_script_982_struct(40, 1247, "Members: Rune spear", "Members can now wield " + "" + "rune spears" + "" + "."); + case 9: + return newstruct cs2func_script_982_struct(40, 1347, "Rune warhammer", "You can now wield " + "" + "rune warhammers" + "" + "."); + case 10: + return newstruct cs2func_script_982_struct(40, 1373, "Rune battleaxe", "You can now wield " + "" + "rune battleaxes" + "" + "."); + case 11: + return newstruct cs2func_script_982_struct(40, 1319, "Rune two-handed sword", "You can now wield " + "" + "rune two-handed swords" + "" + "."); + case 12: + return newstruct cs2func_script_982_struct(40, 3202, "Members: Rune halberd", "Members can now wield " + "" + "rune halberds" + "" + "."); + case 13: + return newstruct cs2func_script_982_struct(40, 8850, "Members: Rune defender" + "
" + " (with 40 Defence)", "Members now have the Attack level required to wield " + "" + "rune defenders" + "" + ". (They also need level 40 Defence.)"); + } + break; + case 8: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(60, 1215, "Members: Dragon dagger" + "
" + " (after Lost City)", "Members can now wield " + "" + "dragon daggers" + "" + " (after Lost City)."); + case 1: + return newstruct cs2func_script_982_struct(60, 6739, "Members: Dragon hatchet", "Members can now wield " + "" + "dragon hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_982_struct(60, 1434, "Members: Dragon mace" + "
" + " (after Heroes' Quest)", "Members can now wield " + "" + "dragon maces" + "" + " (after Heroes' Quest)."); + case 3: + return newstruct cs2func_script_982_struct(60, 14484, "Members: Dragon claws", "Members can now wield " + "" + "dragon claws" + "" + "."); + case 4: + return newstruct cs2func_script_982_struct(60, 1305, "Members: Dragon longsword" + "
" + " (after Lost City)", "Members can now wield " + "" + "dragon longswords" + "" + " (after Lost City)."); + case 5: + return newstruct cs2func_script_982_struct(60, 4587, "Members: Dragon scimitar" + "
" + " (after Monkey Madness)", "Members can now wield " + "" + "dragon scimitars" + "" + " (after Monkey Madness)."); + case 6: + return newstruct cs2func_script_982_struct(60, 1249, "Members: Dragon spear", "Members can now wield " + "" + "dragon spears" + "" + "."); + case 7: + return newstruct cs2func_script_982_struct(60, 1377, "Members: Dragon battleaxe" + "
" + " (after Heroes' Quest)", "Members can now wield " + "" + "dragon battleaxes" + "" + " (after Heroes' Quest)."); + case 8: + return newstruct cs2func_script_982_struct(60, 7158, "Members: Dragon two-handed sword", "Members can now wield " + "" + "dragon two-handed swords" + "" + "."); + case 9: + return newstruct cs2func_script_982_struct(60, 3204, "Members: Dragon halberd" + "
" + " (after Regicide)", "Members can now wield " + "" + "dragon halberds" + "" + " (after Regicide)."); + case 10: + return newstruct cs2func_script_982_struct(60, 15259, "Members: Dragon pickaxe", "Members can now wield " + "" + "dragon pickaxes" + "" + "."); + case 11: + return newstruct cs2func_script_982_struct(60, 20072, "Members: Dragon defender" + "
" + " (with 60 Defence)", "Members now have the Attack level required to wield " + "" + "dragon defenders" + "" + ". (They also need level 60 Defence.)"); + case 12: + return newstruct cs2func_script_982_struct(60, 13976, "Corrupt dragon dagger", "You can now wield " + "" + "corrupt dragon daggers" + "" + "."); + case 13: + return newstruct cs2func_script_982_struct(60, 13985, "Corrupt dragon mace", "You can now wield " + "" + "corrupt dragon maces" + "" + "."); + case 14: + return newstruct cs2func_script_982_struct(60, 13982, "Corrupt dragon longsword", "You can now wield " + "" + "corrupt dragon longswords" + "" + "."); + case 15: + return newstruct cs2func_script_982_struct(60, 13979, "Corrupt dragon scimitar", "You can now wield " + "" + "corrupt dragon scimitars" + "" + "."); + case 16: + return newstruct cs2func_script_982_struct(60, 13988, "Corrupt dragon spear", "You can now wield " + "" + "corrupt dragon spears" + "" + "."); + case 17: + return newstruct cs2func_script_982_struct(60, 13973, "Corrupt dragon battleaxe", "You can now wield " + "" + "corrupt dragon battleaxes" + "" + "."); + } + break; + case 9: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(70, 4710, "Members: Ahrim's staff" + "
" + " (with 70 Magic)", "Members now have the Attack level required to wield " + "" + "Ahrim's staff" + "" + ". (They also need level 70 Magic.)"); + case 1: + return newstruct cs2func_script_982_struct(70, 4718, "Members: Dharok's greataxe" + "
" + " (with 70 Strength)", "Members now have the Attack level required to wield " + "" + "Dharok's greataxe" + "" + ". (They also need level 70 Strength.)"); + case 2: + return newstruct cs2func_script_982_struct(70, 4726, "Members: Guthan's spear", "Members can now wield " + "" + "Guthan's spear" + "" + "."); + case 3: + return newstruct cs2func_script_982_struct(70, 4747, "Members: Torag's hammers" + "
" + " (with 70 Strength)", "Members now have the Attack level required to wield " + "" + "Torag's hammers" + "" + ". (They also need level 70 Strength.)"); + case 4: + return newstruct cs2func_script_982_struct(70, 4755, "Members: Verac's flail", "Members can now wield " + "" + "Verac's flail" + "" + "."); + case 5: + return newstruct cs2func_script_982_struct(70, 21744, "Members: Akrisae's war mace" + "
" + " (After Ritual of the Mahjarrat and with level 70 Magic and 70 Prayer)", "Members now have the Attack level required to wield " + "" + "Akrisae's war mace" + "" + " (after Ritual of the Mahjarrat and with 70 Magic and 70 Prayer)."); + } + break; + case 10: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(1, 21340, "Members: Dwarven Army Axe", "Members can now wield a " + "" + "Dwarven Army Axe" + "" + "."); + case 1: + return newstruct cs2func_script_982_struct(1, 15596, "Reese's sword" + "
" + " (after The Blood Pact)", "You can now wield " + "" + "Reese's sword" + "" + " (after starting The Blood Pact)."); + case 2: + return newstruct cs2func_script_982_struct(1, 2402, "Silverlight" + "
" + " (after Demon Slayer)", "You can now wield " + "" + "Silverlight" + "" + " (after starting Demon Slayer)."); + case 3: + return newstruct cs2func_script_982_struct(1, 6746, "Members: Darklight" + "
" + " (after Shadow of the Storm)", "Members can now wield " + "" + "Darklight" + "" + " (after Shadow of the Storm)."); + case 4: + return newstruct cs2func_script_982_struct(1, 2952, "Members: Wolfbane Dagger" + "
" + " (after Priest in Peril)", "Members can now wield the " + "" + "Wolfbane Dagger" + "" + " (after Priest in Peril."); + case 5: + return newstruct cs2func_script_982_struct(1, 746, "Members: Dark Dagger", "Members can now wield the " + "" + "Dark Dagger" + "" + "."); + case 6: + return newstruct cs2func_script_982_struct(1, 667, "Faladian/Blurite Sword" + "
" + " (after starting The Knight's Sword)", "You can now wield the " + "" + "Faladian/Blurite Sword" + "" + " (after starting The Knight's Sword)."); + case 7: + return newstruct cs2func_script_982_struct(1, 10858, "Members: Shadow Sword", "Members can now wield the " + "" + "Shadow Sword" + "" + "."); + case 8: + return newstruct cs2func_script_982_struct(1, 5016, "Members: Bone spear", "Members can now wield " + "" + "bone spears" + "" + "."); + case 9: + return newstruct cs2func_script_982_struct(1, 5018, "Members: Bone club", "Members can now wield " + "" + "bone clubs" + "" + "."); + case 10: + return newstruct cs2func_script_982_struct(1, 8872, "Members: Bone dagger", "Members can now wield " + "" + "bone daggers" + "" + "."); + case 11: + return newstruct cs2func_script_982_struct(1, 6760, "Members: Guthix Mjolnir" + "
" + " (after Making History)", "Members can now wield the " + "" + "Guthix Mjolnir" + "" + " (after Making History)."); + case 12: + return newstruct cs2func_script_982_struct(1, 6762, "Members: Saradomin Mjolnir" + "
" + " (after Making History)", "Members can now wield the " + "" + "Saradomin Mjolnir" + "" + " after completing Making History."); + case 13: + return newstruct cs2func_script_982_struct(1, 6764, "Members: Zamorak Mjolnir" + "
" + " (after Making History)", "Members can now wield the " + "" + "Zamorak Mjolnir" + "" + " (after Making History)."); + case 14: + return newstruct cs2func_script_982_struct(1, 7668, "Members: Gadderhammer" + "
" + " (after starting In Aid of the Myreque)", "Members can now wield the " + "" + "Gadderhammer" + "" + " (after starting In Aid of the Myreque)."); + case 15: + return newstruct cs2func_script_982_struct(1, 10491, "Members: Blessed Axe" + "
" + " (after starting Animal Magnetism)", "Members can now wield the " + "" + "Blessed Axe" + "" + " (after starting Animal Magnetism)."); + case 16: + return newstruct cs2func_script_982_struct(1, 13661, "Members: Inferno Adze" + "
" + " (after All Fired Up and with 92 Firemaking)", "Members can now wield the " + "" + "Inferno Adze" + "" + " (after All Fired Up)."); + case 17: + return newstruct cs2func_script_982_struct(5, 4068, "Members: Basic decorative sword", "Members can now wield " + "" + "basic decorative swords" + "" + "."); + case 18: + return newstruct cs2func_script_982_struct(5, 12570, "Members: Ogre club", "Members can now wield " + "" + "ogre clubs" + "" + "."); + case 19: + return newstruct cs2func_script_982_struct(15, 11061, "Members: Ancient Mace" + "
" + " (after Another Slice of H.A.M. and with 25 Prayer)", "Members now have the Attack level required to wield the " + "" + "Ancient Mace" + "" + " (after Another Slice of H.A.M. and with level 25 Prayer)."); + case 20: + return newstruct cs2func_script_982_struct(20, 35, "Members: Excalibur" + "
" + " (after starting Merlin's Crystal)", "Members can now wield " + "" + "Excalibur" + "" + " (after starting Merlin's Crystal)."); + case 21: + return newstruct cs2func_script_982_struct(20, 4503, "Members: Detailed decorative sword", "Members can now wield " + "" + "detailed decorative swords" + "" + "."); + case 22: + return newstruct cs2func_script_982_struct(20, 13926, "Members: Corrupt Statius's warhammer", "Members now have the Attack level required to wield " + "" + "corrupt Statius's warhammer" + "" + "."); + case 23: + return newstruct cs2func_script_982_struct(20, 13923, "Members: Corrupt Vesta's longsword", "Members now have the Attack level required to wield " + "" + "corrupt Vesta's longsword" + "" + "."); + case 24: + return newstruct cs2func_script_982_struct(20, 13929, "Members: Corrupt Vesta's spear", "Members now have the Attack level required to wield " + "" + "corrupt Vesta's spear" + "" + "."); + case 25: + return newstruct cs2func_script_982_struct(20, 13941, "Members: Corrupt Zuriel's staff" + "
" + " (with 20 Magic)", "Members now have the Attack level required to wield " + "" + "corrupt Zuriel's staff" + "" + " (with level 20 Magic)."); + case 26: + return newstruct cs2func_script_982_struct(30, 1397, "Members: Air battlestaff" + "
" + " (with 30 Magic)", "Members now have the Attack level required to wield " + "" + "air battlestaves" + "" + ". (They also need level 30 Magic.)"); + case 27: + return newstruct cs2func_script_982_struct(30, 1399, "Members: Earth battlestaff" + "
" + " (with 30 Magic)", "Members now have the Attack level required to wield " + "" + "earth battlestaves" + "" + ". (They also need level 30 Magic.)"); + case 28: + return newstruct cs2func_script_982_struct(30, 1393, "Members: Fire battlestaff" + "
" + " (with 30 Magic)", "Members now have the Attack level required to wield " + "" + "fire battlestaves" + "" + ". (They also need level 30 Magic.)"); + case 29: + return newstruct cs2func_script_982_struct(30, 1395, "Members: Water battlestaff" + "
" + " (with 30 Magic)", "Members now have the Attack level required to wield " + "" + "water battlestaves" + "" + ". (They also need level 30 Magic.)"); + case 30: + return newstruct cs2func_script_982_struct(30, 3053, "Members: Lava battlestaff" + "
" + " (with 30 Magic)", "Members now have the Attack level required to wield " + "" + "lava battlestaves" + "" + ". (They also need level 30 Magic.)"); + case 31: + return newstruct cs2func_script_982_struct(30, 6562, "Members: Mud battlestaff" + "
" + " (with 30 Magic)", "Members now have the Attack level required to wield " + "" + "mud battlestaves" + "" + ". (They also need level 30 Magic.)"); + case 32: + return newstruct cs2func_script_982_struct(30, 21502, "Members: Skeletal battlestaves" + "
" + " (with 30 Magic)", "Members now have the Attack level required to wield " + "" + "skeletal battlestaves" + "" + ". (They also need level 30 Magic.)"); + case 33: + return newstruct cs2func_script_982_struct(30, 4508, "Members: Intricate decorative sword", "Members can now wield " + "" + "intricate decorative swords" + "" + "."); + case 34: + return newstruct cs2func_script_982_struct(30, 3757, "Members: Fremennik blade", "Members can now wield " + "" + "Fremennik blades" + "" + "."); + case 35: + return newstruct cs2func_script_982_struct(30, 21536, "Members: Sceptre of the gods" + "
" + " (with 30 Magic)", "Members can now wield " + "" + "the Sceptre of the gods" + "" + ". (They also need level 30 Magic.)"); + case 36: + return newstruct cs2func_script_982_struct(40, 18341, "Nature staff" + "
" + " (with 53 Magic and 53 Dungeoneering)", "You can now use " + "" + "nature staves" + "" + ". (You also need level 53 Magic and level 53 Dungeoneering.)"); + case 37: + return newstruct cs2func_script_982_struct(40, 18342, "Law staff" + "
" + " (with 45 Magic and 45 Dungeoneering)", "You can now use " + "" + "law staves" + "" + ". (You also need level 45 Magic and level 45 Dungeoneering.)"); + case 38: + return newstruct cs2func_script_982_struct(40, 1405, "Members: Mystic air staff" + "
" + " (with 40 Magic)", "Members now have the Attack level required to wield " + "" + "mystic air staves" + "" + ". (They also need level 40 Magic.)"); + case 39: + return newstruct cs2func_script_982_struct(40, 1407, "Members: Mystic earth staff" + "
" + " (with 40 Magic)", "Members now have the Attack level required to wield " + "" + "mystic earth staves" + "" + ". (They also need level 40 Magic.)"); + case 40: + return newstruct cs2func_script_982_struct(40, 1401, "Members: Mystic fire staff" + "
" + " (with 40 Magic)", "Members now have the Attack level required to wield " + "" + "mystic fire staves" + "" + ". (They also need level 40 Magic.)"); + case 41: + return newstruct cs2func_script_982_struct(40, 1403, "Members: Mystic water staff" + "
" + " (with 40 Magic)", "Members now have the Attack level required to wield " + "" + "mystic water staves" + "" + ". (They also need level 40 Magic.)"); + case 42: + return newstruct cs2func_script_982_struct(40, 3054, "Members: Mystic lava staff" + "
" + " (with 40 Magic)", "Members now have the Attack level required to wield " + "" + "mystic lava staves" + "" + ". (They also need level 40 Magic.)"); + case 43: + return newstruct cs2func_script_982_struct(40, 6563, "Members: Mystic mud staff" + "
" + " (with 40 Magic)", "Members now have the Attack level required to wield " + "" + "mystic mud staves" + "" + ". (They also need level 40 Magic.)"); + case 44: + return newstruct cs2func_script_982_struct(40, 21498, "Members: Necromancer staves" + "
" + " (with 40 Magic)", "Members now have the Attack level required to wield " + "" + "necromancer staves" + "" + ". (They also need level 40 Magic.)"); + case 45: + return newstruct cs2func_script_982_struct(40, 11738, "Members: Mystic steam staff" + "
" + " (with 40 Magic)", "Members now have the Attack level required to wield " + "" + "mystic steam staves" + "" + ". (They also need level 40 Magic.)"); + case 46: + return newstruct cs2func_script_982_struct(40, 11037, "Members: Brine sabre", "Members can now wield " + "" + "brine sabres" + "" + "."); + case 47: + return newstruct cs2func_script_982_struct(40, 14097, "Members: Sacred clay sword", "Members can now wield " + "" + "sacred clay swords" + "" + "."); + case 48: + return newstruct cs2func_script_982_struct(40, 4508, "Members: Profound decorative sword", "Members can now wield " + "" + "profound decorative swords" + "" + "."); + case 49: + return newstruct cs2func_script_982_struct(40, 19323, "Members: Dragon staff" + "
" + " (with 40 Magic, 60 Prayer and 20 Defence)", "Members now have the Attack level required to wield " + "" + "dragon staves" + "" + ". (They also need level 40 Magic, level 60 Prayer and level 20 Defence.)"); + case 50: + return newstruct cs2func_script_982_struct(40, 19325, "Members: Penguin staff" + "
" + " (with 40 Magic, 60 Prayer and 20 Defence)", "Members now have the Attack level required to wield " + "" + "penguin staves" + "" + ". (They also need level 40 Magic, level 60 Prayer and level 20 Defence.)"); + case 51: + return newstruct cs2func_script_982_struct(40, 19327, "Members: Bat staff" + "
" + " (with 40 Magic, 60 Prayer and 20 Defence)", "Members now have the Attack level required to wield " + "" + "bat staves" + "" + ". (They also need level 40 Magic, level 60 Prayer and level 20 Defence.)"); + case 52: + return newstruct cs2func_script_982_struct(40, 19329, "Members: Wolf staff" + "
" + " (with 40 Magic, 60 Prayer and 20 Defence)", "Members now have the Attack level required to wield " + "" + "wolf staves" + "" + ". (They also need level 40 Magic, level 60 Prayer and level 20 Defence.)"); + case 53: + return newstruct cs2func_script_982_struct(40, 19331, "Members: Cat staff" + "
" + " (with 40 Magic, 60 Prayer and 20 Defence)", "Members now have the Attack level required to wield " + "" + "cat staves" + "" + ". (They also need level 40 Magic, level 60 Prayer and level 20 Defence.)"); + case 54: + return newstruct cs2func_script_982_struct(40, 21777, "Members: Armadyl battlestaff" + "
" + " (with 77 Magic)", "Members now have the Attack level required to wield " + "" + "Armadyl battle staves" + "" + ". (They also need level 77 Magic.)"); + case 55: + return newstruct cs2func_script_982_struct(42, 11665, "Members: Void melee helm", "Members now have the Attack level required to wear " + "" + "Void melee helms" + "" + "."); + case 56: + return newstruct cs2func_script_982_struct(42, 11664, "Members: Void ranger helm", "Members now have the Attack level required to wear " + "" + "Void ranger helms" + "" + "."); + case 57: + return newstruct cs2func_script_982_struct(42, 11663, "Members: Void mage helm", "Members now have the Attack level required to wear " + "" + "Void mage helms" + "" + "."); + case 58: + return newstruct cs2func_script_982_struct(42, 8839, "Members: Void knight top", "Members now have the Attack level required to wear " + "" + "Void knight tops" + "" + "."); + case 59: + return newstruct cs2func_script_982_struct(42, 8840, "Members: Void knight robe", "Members now have the Attack level required to wear " + "" + "Void knight robes" + "" + "."); + case 60: + return newstruct cs2func_script_982_struct(42, 8842, "Members: Void knight gloves", "Members now have the Attack level required to wear " + "" + "Void knight gloves" + "" + "."); + case 61: + return newstruct cs2func_script_982_struct(42, 19712, "Members: Void knight deflector", "Members now have the Attack level required to wear " + "" + "Void knight deflectors" + "" + "."); + case 62: + return newstruct cs2func_script_982_struct(42, 8841, "Members: Void knight mace", "Members now have the Attack level required to wield " + "" + "Void knight maces" + "" + "."); + case 63: + return newstruct cs2func_script_982_struct(42, 7620, "Void knight equipment requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer.", "" + "Void knight equipment" + "" + " requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer."); + case 64: + return newstruct cs2func_script_982_struct(45, 18365, "Gravite rapier" + "
" + " (with 45 Dungeoneering)", "You can now wield " + "" + "gravite rapiers" + "" + ". (You also need level 45 Dungeoneering.)"); + case 65: + return newstruct cs2func_script_982_struct(45, 18367, "Gravite longsword" + "
" + " (with 45 Dungeoneering)", "You can now wield " + "" + "gravite longswords" + "" + ". (You also need level 45 Dungeoneering.)"); + case 66: + return newstruct cs2func_script_982_struct(45, 18369, "Gravite two-handed sword" + "
" + " (with 45 Dungeoneering)", "You can now wield " + "" + "gravite two-handed swords" + "" + ". (You also need level 45 Dungeoneering.)"); + case 67: + return newstruct cs2func_script_982_struct(50, 4158, "Members: Leaf-bladed spear" + "
" + " (with 55 Slayer)", "Members now have the Attack level required to wield " + "" + "leaf-bladed spears" + "" + ": melee weapons used for killing turoth and kurask. (They also need level 55 Slayer.)"); + case 68: + return newstruct cs2func_script_982_struct(50, 4675, "Members: Ancient Staff" + "
" + " (after Desert Treasure and with 50 Magic)", "Members now have the Attack level required to wield the " + "" + "Ancient Staff" + "" + " (after Desert Treasure and with level 50 Magic)."); + case 69: + return newstruct cs2func_script_982_struct(50, 1409, "Members: Iban's Staff" + "
" + " (after Underground Pass and with 50 Magic)", "Members now have the Attack level required to wield " + "" + "Iban's Staff" + "" + " (after Underground Pass and with level 50 Magic)."); + case 70: + return newstruct cs2func_script_982_struct(50, 4153, "Members: Granite maul" + "
" + " (with 50 Strength)", "Members can now wield " + "" + "granite mauls" + "" + ". (They also need level 50 Strength.)"); + case 71: + return newstruct cs2func_script_982_struct(50, 14679, "Members: Granite mace" + "
" + " (with 50 Strength)", "Members can now wield " + "" + "granite maces" + "" + ". (They also need level 50 Strength.)"); + case 72: + return newstruct cs2func_script_982_struct(50, 10581, "Members: Keris" + "
" + " (after Contact!)", "Members can now wield " + "" + "Keris" + "" + " (after Contact!)."); + case 73: + return newstruct cs2func_script_982_struct(50, 13290, "Members: Leaf-bladed swords" + "
" + " (with 55 Slayer)", "Members can now wield " + "" + "leaf-bladed swords" + "" + ". (They also need level 55 Slayer)."); + case 74: + return newstruct cs2func_script_982_struct(60, 10887, "Members: Barrelchest Anchor" + "
" + " (after Great Brain Robbery and with 40 Strength)", "Members now have the Attack level required to wield the " + "" + "Barrelchest Anchor" + "" + " (after Great Brain Robbery, with level 40 Strength)."); + case 75: + return newstruct cs2func_script_982_struct(60, 6523, "Members: TokTz-Xil-Ak", "Members can now wield " + "" + "TokTz-Xil-Ak" + "" + "."); + case 76: + return newstruct cs2func_script_982_struct(60, 6527, "Members: TzHaar-Ket-Em", "Members can now wield " + "" + "TzHaar-Ket-Em" + "" + "."); + case 77: + return newstruct cs2func_script_982_struct(60, 6525, "Members: TokTz-Xil-Ek", "Members can now wield " + "" + "TokTz-Xil-Ek" + "" + "."); + case 78: + return newstruct cs2func_script_982_struct(60, 6526, "Members: Toktz-Mej-Tal" + "
" + " (with 60 Magic)", "Members now have the Attack level required to wield " + "" + "Toktz-Mej-Tal" + "" + ". (They also need level 60 Magic.)"); + case 79: + return newstruct cs2func_script_982_struct(60, 20671, "Members: Brackish Blade", "Members can now wield " + "" + "Brackish Blades" + "" + "."); + case 80: + return newstruct cs2func_script_982_struct(62, 19669, "Members: Ring of vigour" + "
" + " (with 62 Dungeoneering)", "Members can now wear " + "" + "rings of vigour" + "" + ". (They also need level 62 Dungeoneering.)"); + case 81: + return newstruct cs2func_script_982_struct(70, 4151, "Members: Abyssal whip", "Members can now wield " + "" + "abyssal whips" + "" + "."); + case 82: + return newstruct cs2func_script_982_struct(70, 15485, "Members: Penance master trident (with 70 Magic)", "Members can now wield " + "" + "penance master tridents" + "" + ". (They also need level 70 Magic.)"); + case 83: + return newstruct cs2func_script_982_struct(70, 11730, "Members: Saradomin sword", "Members can now wield " + "" + "Saradomin swords" + "" + "."); + case 84: + return newstruct cs2func_script_982_struct(70, 11716, "Members: Zamorakian spear", "Members can now wield " + "" + "Zamorakian spears" + "" + "."); + case 85: + return newstruct cs2func_script_982_struct(70, 21582, "Members: Blisterwood polearm (after The Branches of Darkmeyer)", "Members can now wield " + "" + "blisterwood polearms" + "" + " (after The Branches of Darkmeyer.)"); + case 86: + return newstruct cs2func_script_982_struct(75, 11694, "Members: Armadyl godsword", "Members can now wield the " + "" + "Armadyl godsword" + "" + "."); + case 87: + return newstruct cs2func_script_982_struct(75, 11696, "Members: Bandos godsword", "Members can now wield the " + "" + "Bandos godsword" + "" + "."); + case 88: + return newstruct cs2func_script_982_struct(75, 11698, "Members: Saradomin godsword", "Members can now wield the " + "" + "Saradomin godsword" + "" + "."); + case 89: + return newstruct cs2func_script_982_struct(75, 11700, "Members: Zamorak godsword", "Members can now wield the " + "" + "Zamorak godsword" + "" + "."); + case 90: + return newstruct cs2func_script_982_struct(75, 15403, "Members: Balmung (after Blood Runs Deep and with 75 Strength)", "Members can now wield " + "" + "Balmung" + "" + " (after Blood Runs Deep, with 75 Strength)."); + case 91: + return newstruct cs2func_script_982_struct(75, 15486, "Members: Staff of Light (with 75 Magic)", "Members can now wield the " + "" + "Staff of Light" + "" + " (with 75 Magic)."); + case 92: + return newstruct cs2func_script_982_struct(75, 21787, "Members: Steadfast boots" + "
" + " (with 75 Defence)", "Members now have the Attack level required to wear " + "" + "steadfast boots" + "" + " (with 75 Defence)."); + case 93: + return newstruct cs2func_script_982_struct(78, 13902, "Members: Statius's warhammer", "Members now have the Attack level required to wield " + "" + "Statius's warhammer" + "" + "."); + case 94: + return newstruct cs2func_script_982_struct(78, 13899, "Members: Vesta's longsword", "Members now have the Attack level required to wield " + "" + "Vesta's longsword" + "" + "."); + case 95: + return newstruct cs2func_script_982_struct(78, 13905, "Members: Vesta's spear", "Members now have the Attack level required to wield " + "" + "Vesta's spear" + "" + "."); + case 96: + return newstruct cs2func_script_982_struct(78, 13867, "Members: Zuriel's staff" + "
" + " (with 78 Magic)", "Members now have the Attack level required to wield " + "" + "Zuriel's staff" + "" + " (with level 78 Magic)."); + case 97: + return newstruct cs2func_script_982_struct(80, 18349, "Members: Chaotic rapier" + "
" + " (with 80 Dungeoneering)", "Members can now wield " + "" + "chaotic rapiers" + "" + ". (They also need level 80 Dungeoneering.)"); + case 98: + return newstruct cs2func_script_982_struct(80, 18351, "Members: Chaotic longsword" + "
" + " (with 80 Dungeoneering)", "Members can now wield " + "" + "chaotic longswords" + "" + ". (They also need level 80 Dungeoneering.)"); + case 99: + return newstruct cs2func_script_982_struct(80, 18353, "Members: Chaotic maul" + "
" + " (with 80 Dungeoneering)", "Members can now wield " + "" + "chaotic mauls" + "" + ". (They also need level 80 Dungeoneering.)"); + case 100: + return newstruct cs2func_script_982_struct(85, 21371, "Members: Abyssal vine whip" + "
" + " (with 80 Slayer)", "Members now have the Attack level required to wield " + "" + "abyssal vine whips" + "" + ". (They also need level 80 Slayer.)"); + } + break; + case 11: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(30, 10149, "Members: Swamp lizard" + "
" + " (with 30 Magic and 30 Ranged)", "Members now have the Attack level required to wield " + "" + "swamp lizards" + "" + ". (They also need level 30 Magic and level 30 Ranged.)"); + case 1: + return newstruct cs2func_script_982_struct(50, 10146, "Members: Orange salamander" + "
" + " (with 50 Magic and 50 Ranged)", "Members now have the Attack level required to wield " + "" + "orange salamanders" + "" + ". (They also need level 50 Magic and level 50 Ranged.)"); + case 2: + return newstruct cs2func_script_982_struct(60, 10147, "Members: Red salamander" + "
" + " (with 60 Magic and 60 Ranged)", "Members now have the Attack level required to wield " + "" + "red salamanders" + "" + ". (They also need level 60 Magic and level 60 Ranged.)"); + case 3: + return newstruct cs2func_script_982_struct(70, 10148, "Members: Black salamander" + "
" + " (with 70 Magic and 70 Ranged)", "Members now have the Attack level required to wield " + "" + "black salamanders" + "" + ". (They also need level 70 Magic and level 70 Ranged.)"); + } + break; + case 12: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(1, 14297, "Members: Stealing Creation - class 1 dagger", "Members can now wield " + "" + "class 1 daggers" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_982_struct(1, 14287, "Members: Stealing Creation - class 1 scimitar", "Members can now wield " + "" + "class 1 scimitars" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_982_struct(1, 14307, "Members: Stealing Creation - class 1 warhammer", "Members can now wield " + "" + "class 1 warhammers" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_982_struct(20, 14299, "Members: Stealing Creation - class 2 dagger", "Members can now wield " + "" + "class 2 daggers" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_982_struct(20, 14289, "Members: Stealing Creation - class 2 scimitar", "Members can now wield " + "" + "class 2 scimitars" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_982_struct(20, 14309, "Members: Stealing Creation - class 2 warhammer", "Members can now wield " + "" + "class 2 warhammers" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_982_struct(40, 14301, "Members: Stealing Creation - class 3 dagger", "Members can now wield " + "" + "class 3 daggers" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_982_struct(40, 14291, "Members: Stealing Creation - class 3 scimitar", "Members can now wield " + "" + "class 3 scimitars" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_982_struct(40, 14311, "Members: Stealing Creation - class 3 warhammer", "Members can now wield " + "" + "class 3 warhammers" + "" + " in Stealing Creation."); + case 9: + return newstruct cs2func_script_982_struct(60, 14303, "Members: Stealing Creation - class 4 dagger", "Members can now wield " + "" + "class 4 daggers" + "" + " in Stealing Creation."); + case 10: + return newstruct cs2func_script_982_struct(60, 14293, "Members: Stealing Creation - class 4 scimitar", "Members can now wield " + "" + "class 4 scimitars" + "" + " in Stealing Creation."); + case 11: + return newstruct cs2func_script_982_struct(60, 14313, "Members: Stealing Creation - class 4 warhammer", "Members can now wield " + "" + "class 4 warhammers" + "" + " in Stealing Creation."); + case 12: + return newstruct cs2func_script_982_struct(80, 14305, "Members: Stealing Creation - class 5 dagger", "Members can now wield " + "" + "class 5 daggers" + "" + " in Stealing Creation."); + case 13: + return newstruct cs2func_script_982_struct(80, 14295, "Members: Stealing Creation - class 5 scimitar", "Members can now wield " + "" + "class 5 scimitars" + "" + " in Stealing Creation."); + case 14: + return newstruct cs2func_script_982_struct(80, 14315, "Members: Stealing Creation - class 5 warhammer", "Members can now wield " + "" + "class 5 warhammers" + "" + " in Stealing Creation."); + } + break; + case 13: + switch (arg1) { + case 0: + return newstruct cs2func_script_982_struct(1, 16757, "Novite dagger (Tier 1)", "You can now wield " + "" + "novite daggers" + "" + " within Daemonheim."); + case 1: + return newstruct cs2func_script_982_struct(1, 16935, "Novite rapier (Tier 1)", "You can now wield " + "" + "novite rapiers" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_982_struct(1, 16383, "Novite longsword (Tier 1)", "You can now wield " + "" + "novite longswords" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_982_struct(1, 15753, "Novite battleaxe (Tier 1)", "You can now wield " + "" + "novite battleaxes" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_982_struct(1, 16889, "Novite 2h swords (Tier 1)", "You can now wield " + "" + "novite 2h swords" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_982_struct(1, 17063, "Novite spears (Tier 1)", "You can now wield " + "" + "novite spears" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_982_struct(1, 17019, "Novite warhammer (Tier 1)", "You can now wield " + "" + "novite warhammers" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_982_struct(1, 16361, "Novite hatchet (Tier 1)", "You can now wield " + "" + "novite hatchets" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_982_struct(1, 16295, "Novite pickaxe (Tier 1)", "You can now wield " + "" + "novite pickaxes" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_982_struct(10, 16765, "Bathus dagger (Tier 2)", "You can now wield " + "" + "bathus daggers" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_982_struct(10, 16937, "Bathus rapier (Tier 2)", "You can now wield " + "" + "bathus rapiers" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_982_struct(10, 16385, "Bathus longsword (Tier 2)", "You can now wield " + "" + "bathus longswords" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_982_struct(10, 15755, "Bathus battleaxe (Tier 2)", "You can now wield " + "" + "bathus battleaxes" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_982_struct(10, 16891, "Bathus 2h swords (Tier 2)", "You can now wield " + "" + "bathus 2h swords" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_982_struct(10, 17071, "Bathus spears (Tier 2)", "You can now wield " + "" + "bathus spears" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_982_struct(10, 17021, "Bathus warhammer (Tier 2)", "You can now wield " + "" + "bathus warhammers" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_982_struct(10, 16363, "Bathus hatchet (Tier 2)", "You can now wield " + "" + "bathus hatchets" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_982_struct(10, 16297, "Bathus pickaxe (Tier 2)", "You can now wield " + "" + "bathus pickaxes" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_982_struct(20, 16773, "Marmaros dagger (Tier 3)", "You can now wield " + "" + "marmaros daggers" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_982_struct(20, 16939, "Marmaros rapier (Tier 3)", "You can now wield " + "" + "marmaros rapiers" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_982_struct(20, 16387, "Marmaros longsword (Tier 3)", "You can now wield " + "" + "marmaros longswords" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_982_struct(20, 15757, "Marmaros battleaxe (Tier 3)", "You can now wield " + "" + "marmaros battleaxes" + "" + " within Daemonheim."); + case 22: + return newstruct cs2func_script_982_struct(20, 16893, "Marmaros 2h swords (Tier 3)", "You can now wield " + "" + "marmaros 2h swords" + "" + " within Daemonheim."); + case 23: + return newstruct cs2func_script_982_struct(20, 17079, "Marmaros spears (Tier 3)", "You can now wield " + "" + "marmaros spears" + "" + " within Daemonheim."); + case 24: + return newstruct cs2func_script_982_struct(20, 17023, "Marmaros warhammer (Tier 3)", "You can now wield " + "" + "marmaros warhammers" + "" + " within Daemonheim."); + case 25: + return newstruct cs2func_script_982_struct(20, 16365, "Marmaros hatchet (Tier 3)", "You can now wield " + "" + "marmaros hatchets" + "" + " within Daemonheim."); + case 26: + return newstruct cs2func_script_982_struct(20, 16299, "Marmaros pickaxe (Tier 3)", "You can now wield " + "" + "marmaros pickaxes" + "" + " within Daemonheim."); + case 27: + return newstruct cs2func_script_982_struct(30, 16781, "Kratonite dagger (Tier 4)", "You can now wield " + "" + "kratonite daggers" + "" + " within Daemonheim."); + case 28: + return newstruct cs2func_script_982_struct(30, 16941, "Kratonite rapier (Tier 4)", "You can now wield " + "" + "kratonite rapiers" + "" + " within Daemonheim."); + case 29: + return newstruct cs2func_script_982_struct(30, 16389, "Kratonite longsword (Tier 4)", "You can now wield " + "" + "kratonite longswords" + "" + " within Daemonheim."); + case 30: + return newstruct cs2func_script_982_struct(30, 15759, "Kratonite battleaxe (Tier 4)", "You can now wield " + "" + "kratonite battleaxes" + "" + " within Daemonheim."); + case 31: + return newstruct cs2func_script_982_struct(30, 16895, "Kratonite 2h swords (Tier 4)", "You can now wield " + "" + "kratonite 2h swords" + "" + " within Daemonheim."); + case 32: + return newstruct cs2func_script_982_struct(30, 17087, "Kratonite spears (Tier 4)", "You can now wield " + "" + "kratonite spears" + "" + " within Daemonheim."); + case 33: + return newstruct cs2func_script_982_struct(30, 17025, "Kratonite warhammer (Tier 4)", "You can now wield " + "" + "kratonite warhammers" + "" + " within Daemonheim."); + case 34: + return newstruct cs2func_script_982_struct(30, 16367, "Kratonite hatchet (Tier 4)", "You can now wield " + "" + "kratonite hatchets" + "" + " within Daemonheim."); + case 35: + return newstruct cs2func_script_982_struct(30, 16301, "Kratonite pickaxe (Tier 4)", "You can now wield " + "" + "kratonite pickaxes" + "" + " within Daemonheim."); + case 36: + return newstruct cs2func_script_982_struct(36, 17275, "Members: Frostbite dagger" + "
" + " (with 36 Magic)", "Members can now wield " + "" + "frostbite daggers" + "" + " within Daemonheim. (They also need level 36 Magic.)"); + case 37: + return newstruct cs2func_script_982_struct(40, 16789, "Fractite dagger (Tier 5)", "You can now wield " + "" + "fractite daggers" + "" + " within Daemonheim."); + case 38: + return newstruct cs2func_script_982_struct(40, 16943, "Fractite rapier (Tier 5)", "You can now wield " + "" + "fractite rapiers" + "" + " within Daemonheim."); + case 39: + return newstruct cs2func_script_982_struct(40, 16391, "Fractite longsword (Tier 5)", "You can now wield " + "" + "fractite longswords" + "" + " within Daemonheim."); + case 40: + return newstruct cs2func_script_982_struct(40, 15761, "Fractite battleaxe (Tier 5)", "You can now wield " + "" + "fractite battleaxes" + "" + " within Daemonheim."); + case 41: + return newstruct cs2func_script_982_struct(40, 16897, "Fractite 2h swords (Tier 5)", "You can now wield " + "" + "fractite 2h swords" + "" + " within Daemonheim."); + case 42: + return newstruct cs2func_script_982_struct(40, 17095, "Fractite spears (Tier 5)", "You can now wield " + "" + "fractite spears" + "" + " within Daemonheim."); + case 43: + return newstruct cs2func_script_982_struct(40, 17027, "Fractite warhammer (Tier 5)", "You can now wield " + "" + "fractite warhammers" + "" + " within Daemonheim."); + case 44: + return newstruct cs2func_script_982_struct(40, 16369, "Fractite hatchet (Tier 5)", "You can now wield " + "" + "fractite hatchets" + "" + " within Daemonheim."); + case 45: + return newstruct cs2func_script_982_struct(40, 16303, "Fractite pickaxe (Tier 5)", "You can now wield " + "" + "fractite pickaxes" + "" + " within Daemonheim."); + case 46: + return newstruct cs2func_script_982_struct(50, 16797, "Members: Zephyrium dagger (Tier 6)", "Members can now wield " + "" + "zephyrium daggers" + "" + " within Daemonheim."); + case 47: + return newstruct cs2func_script_982_struct(50, 16945, "Members: Zephyrium rapier (Tier 6)", "Members can now wield " + "" + "zephyrium rapiers" + "" + " within Daemonheim."); + case 48: + return newstruct cs2func_script_982_struct(50, 16393, "Members: Zephyrium longsword (Tier 6)", "Members can now wield " + "" + "zephyrium longswords" + "" + " within Daemonheim."); + case 49: + return newstruct cs2func_script_982_struct(50, 15763, "Members: Zephyrium battleaxe (Tier 6)", "Members can now wield " + "" + "zephyrium battleaxes" + "" + " within Daemonheim."); + case 50: + return newstruct cs2func_script_982_struct(50, 16899, "Members: Zephyrium 2h swords (Tier 6)", "Members can now wield " + "" + "zephyrium 2h swords" + "" + " within Daemonheim."); + case 51: + return newstruct cs2func_script_982_struct(50, 17103, "Members: Zephyrium spears (Tier 6)", "Members can now wield " + "" + "zephyrium spears" + "" + " within Daemonheim."); + case 52: + return newstruct cs2func_script_982_struct(50, 17029, "Members: Zephyrium warhammer (Tier 6)", "Members can now wield " + "" + "zephyrium warhammers" + "" + " within Daemonheim."); + case 53: + return newstruct cs2func_script_982_struct(50, 16371, "Members: Zephyrium hatchet (Tier 6)", "Members can now wield " + "" + "zephyrium hatchets" + "" + " within Daemonheim."); + case 54: + return newstruct cs2func_script_982_struct(50, 16305, "Members: Zephyrium pickaxe (Tier 6)", "Members can now wield " + "" + "zephyrium pickaxes" + "" + " within Daemonheim."); + case 55: + return newstruct cs2func_script_982_struct(60, 16805, "Members: Argonite dagger (Tier 7)", "Members can now wield " + "" + "argonite daggers" + "" + " within Daemonheim."); + case 56: + return newstruct cs2func_script_982_struct(60, 16947, "Members: Argonite rapier (Tier 7)", "Members can now wield " + "" + "argonite rapiers" + "" + " within Daemonheim."); + case 57: + return newstruct cs2func_script_982_struct(60, 16395, "Members: Argonite longsword (Tier 7)", "Members can now wield " + "" + "argonite longswords" + "" + " within Daemonheim."); + case 58: + return newstruct cs2func_script_982_struct(60, 15765, "Members: Argonite battleaxe (Tier 7)", "Members can now wield " + "" + "argonite battleaxes" + "" + " within Daemonheim."); + case 59: + return newstruct cs2func_script_982_struct(60, 16901, "Members: Argonite 2h swords (Tier 7)", "Members can now wield " + "" + "argonite 2h swords" + "" + " within Daemonheim."); + case 60: + return newstruct cs2func_script_982_struct(60, 17111, "Members: Argonite spears (Tier 7)", "Members can now wield " + "" + "argonite spears" + "" + " within Daemonheim."); + case 61: + return newstruct cs2func_script_982_struct(60, 17031, "Members: Argonite warhammer (Tier 7)", "Members can now wield " + "" + "argonite warhammers" + "" + " within Daemonheim."); + case 62: + return newstruct cs2func_script_982_struct(60, 16373, "Members: Argonite hatchet (Tier 7)", "Members can now wield " + "" + "argonite hatchets" + "" + " within Daemonheim."); + case 63: + return newstruct cs2func_script_982_struct(60, 16307, "Members: Argonite pickaxe (Tier 7)", "Members can now wield " + "" + "argonite pickaxes" + "" + " within Daemonheim."); + case 64: + return newstruct cs2func_script_982_struct(68, 17275, "Members: Hailstorm dagger" + "
" + " (with 68 Magic)", "Members can now wield " + "" + "hailstorm daggers" + "" + " within Daemonheim. (They also need level 68 Magic)"); + case 65: + return newstruct cs2func_script_982_struct(68, 17293, "Members: Doomcore staff" + "
" + " (with 68 Magic)", "Members can now wield " + "" + "doomcore staves" + "" + " within Daemonheim. (They also need level 68 Magic.)"); + case 66: + return newstruct cs2func_script_982_struct(70, 16813, "Members: Katagon dagger (Tier 8)", "Members can now wield " + "" + "katagon daggers" + "" + " within Daemonheim."); + case 67: + return newstruct cs2func_script_982_struct(70, 16949, "Members: Katagon rapier (Tier 8)", "Members can now wield " + "" + "katagon rapiers" + "" + " within Daemonheim."); + case 68: + return newstruct cs2func_script_982_struct(70, 16397, "Members: Katagon longsword (Tier 8)", "Members can now wield " + "" + "katagon longswords" + "" + " within Daemonheim."); + case 69: + return newstruct cs2func_script_982_struct(70, 15767, "Members: Katagon battleaxe (Tier 8)", "Members can now wield " + "" + "katagon battleaxes" + "" + " within Daemonheim."); + case 70: + return newstruct cs2func_script_982_struct(70, 16903, "Members: Katagon 2h swords (Tier 8)", "Members can now wield " + "" + "katagon 2h swords" + "" + " within Daemonheim."); + case 71: + return newstruct cs2func_script_982_struct(70, 17119, "Members: Katagon spears (Tier 8)", "Members can now wield " + "" + "katagon spears" + "" + " within Daemonheim."); + case 72: + return newstruct cs2func_script_982_struct(70, 17033, "Members: Katagon warhammer (Tier 8)", "Members can now wield " + "" + "katagon warhammers" + "" + " within Daemonheim."); + case 73: + return newstruct cs2func_script_982_struct(70, 16375, "Members: Katagon hatchet (Tier 8)", "Members can now wield " + "" + "katagon hatchets" + "" + " within Daemonheim."); + case 74: + return newstruct cs2func_script_982_struct(70, 16309, "Members: Katagon pickaxe (Tier 8)", "Members can now wield " + "" + "katagon pickaxes" + "" + " within Daemonheim."); + case 75: + return newstruct cs2func_script_982_struct(80, 16821, "Members: Gorgonite dagger (Tier 9)", "Members can now wield " + "" + "gorgonite daggers" + "" + " within Daemonheim."); + case 76: + return newstruct cs2func_script_982_struct(80, 16951, "Members: Gorgonite rapier (Tier 9)", "Members can now wield " + "" + "gorgonite rapiers" + "" + " within Daemonheim."); + case 77: + return newstruct cs2func_script_982_struct(80, 16399, "Members: Gorgonite longsword (Tier 9)", "Members can now wield " + "" + "gorgonite longswords" + "" + " within Daemonheim."); + case 78: + return newstruct cs2func_script_982_struct(80, 15769, "Members: Gorgonite battleaxe (Tier 9)", "Members can now wield " + "" + "gorgonite battleaxes" + "" + " within Daemonheim."); + case 79: + return newstruct cs2func_script_982_struct(80, 16905, "Members: Gorgonite 2h swords (Tier 9)", "Members can now wield " + "" + "gorgonite 2h swords" + "" + " within Daemonheim."); + case 80: + return newstruct cs2func_script_982_struct(80, 17127, "Members: Gorgonite spears (Tier 9)", "Members can now wield " + "" + "gorgonite spears" + "" + " within Daemonheim."); + case 81: + return newstruct cs2func_script_982_struct(80, 17035, "Members: Gorgonite warhammer (Tier 9)", "Members can now wield " + "" + "gorgonite warhammers" + "" + " within Daemonheim."); + case 82: + return newstruct cs2func_script_982_struct(80, 16377, "Members: Gorgonite hatchet (Tier 9)", "Members can now wield " + "" + "gorgonite hatchets" + "" + " within Daemonheim."); + case 83: + return newstruct cs2func_script_982_struct(80, 16311, "Members: Gorgonite pickaxe (Tier 9)", "Members can now wield " + "" + "gorgonite pickaxes" + "" + " within Daemonheim."); + case 84: + return newstruct cs2func_script_982_struct(90, 16829, "Members: Promethium dagger (Tier 10)", "Members can now wield " + "" + "promethium daggers" + "" + " within Daemonheim."); + case 85: + return newstruct cs2func_script_982_struct(90, 16953, "Members: Promethium rapier (Tier 10)", "Members can now wield " + "" + "promethium rapiers" + "" + " within Daemonheim."); + case 86: + return newstruct cs2func_script_982_struct(90, 16401, "Members: Promethium longsword (Tier 10)", "Members can now wield " + "" + "promethium longswords" + "" + " within Daemonheim."); + case 87: + return newstruct cs2func_script_982_struct(90, 15771, "Members: Promethium battleaxe (Tier 10)", "Members can now wield " + "" + "promethium battleaxes" + "" + " within Daemonheim."); + case 88: + return newstruct cs2func_script_982_struct(90, 16907, "Members: Promethium 2h swords (Tier 10)", "Members can now wield " + "" + "promethium 2h swords" + "" + " within Daemonheim."); + case 89: + return newstruct cs2func_script_982_struct(90, 17135, "Members: Promethium spears (Tier 10)", "Members can now wield " + "" + "promethium spears" + "" + " within Daemonheim."); + case 90: + return newstruct cs2func_script_982_struct(90, 17037, "Members: Promethium warhammer (Tier 10)", "Members can now wield " + "" + "promethium warhammers" + "" + " within Daemonheim."); + case 91: + return newstruct cs2func_script_982_struct(90, 16379, "Members: Promethium hatchet (Tier 10)", "Members can now wield " + "" + "promethium hatchets" + "" + " within Daemonheim."); + case 92: + return newstruct cs2func_script_982_struct(90, 16313, "Members: Promethium pickaxe (Tier 10)", "Members can now wield " + "" + "promethium pickaxes" + "" + " within Daemonheim."); + case 93: + return newstruct cs2func_script_982_struct(99, 16837, "Members: Primal dagger (Tier 11)", "Members can now wield " + "" + "primal daggers" + "" + " within Daemonheim."); + case 94: + return newstruct cs2func_script_982_struct(99, 16955, "Members: Primal rapier (Tier 11)", "Members can now wield " + "" + "primal rapiers" + "" + " within Daemonheim."); + case 95: + return newstruct cs2func_script_982_struct(99, 16403, "Members: Primal longsword (Tier 11)", "Members can now wield " + "" + "primal longswords" + "" + " within Daemonheim."); + case 96: + return newstruct cs2func_script_982_struct(99, 15773, "Members: Primal battleaxe (Tier 11)", "Members can now wield " + "" + "primal battleaxes" + "" + " within Daemonheim."); + case 97: + return newstruct cs2func_script_982_struct(99, 16909, "Members: Primal 2h swords (Tier 11)", "Members can now wield " + "" + "primal 2h swords" + "" + " within Daemonheim."); + case 98: + return newstruct cs2func_script_982_struct(99, 17143, "Members: Primal spears (Tier 11)", "Members can now wield " + "" + "primal spears" + "" + " within Daemonheim."); + case 99: + return newstruct cs2func_script_982_struct(99, 17039, "Members: Primal warhammer (Tier 11)", "Members can now wield " + "" + "primal warhammers" + "" + " within Daemonheim."); + case 100: + return newstruct cs2func_script_982_struct(99, 16381, "Members: Primal hatchet (Tier 11)", "Members can now wield " + "" + "primal hatchets" + "" + " within Daemonheim."); + case 101: + return newstruct cs2func_script_982_struct(99, 16315, "Members: Primal pickaxe (Tier 11)", "Members can now wield " + "" + "primal pickaxes" + "" + " within Daemonheim."); + } + break; + case 14: + SWITCH (arg1) { + case 0: + GOTO flow_383 + case 1: + GOTO flow_384 + } + break; + flow_383: + return newstruct cs2func_script_982_struct(-1, 8855, "You can enter the Warriors' Guild when your Attack and Strength levels add up to 130 or more, or when you reach level 99 in either Attack or Strength.", ""); + flow_384: + return newstruct cs2func_script_982_struct(99, 9747, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Attack" + "" + ". Members can visit " + "" + "Ajjat" + "" + " at the " + "" + "Warriors' Guild" + "" + ". He has something special that is only available to true masters of the " + "" + "Attack" + "" + " skill!"); + } + return newstruct cs2func_script_982_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/983.cs2 b/dumps/scripts/983.cs2 new file mode 100644 index 000000000..230cddedd --- /dev/null +++ b/dumps/scripts/983.cs2 @@ -0,0 +1,21 @@ +cs2func_script_983_struct(1,1,0) script_983(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_983_struct(1, "Weaponry"); + case 1: + return newstruct cs2func_script_983_struct(1, "Armour"); + case 2: + return newstruct cs2func_script_983_struct(1, "Shortcuts"); + case 3: + return newstruct cs2func_script_983_struct(1, "Areas"); + case 4: + return newstruct cs2func_script_983_struct(1, "Barbarian"); + case 5: + return newstruct cs2func_script_983_struct(0, "Dungeoneering"); + case 6: + return newstruct cs2func_script_983_struct(0, "Milestones"); + case 7: + return newstruct cs2func_script_983_struct(1, "Minigames"); + } + return newstruct cs2func_script_983_struct(-1, ""); +} diff --git a/dumps/scripts/984.cs2 b/dumps/scripts/984.cs2 new file mode 100644 index 000000000..100cefd15 --- /dev/null +++ b/dumps/scripts/984.cs2 @@ -0,0 +1,202 @@ +cs2func_script_984_struct(2,2,0) script_984(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_984_struct(1, 21340, "Members: Dwarven Army Axe", "Members can now wield a " + "" + "Dwarven Army Axe" + "" + "."); + case 1: + return newstruct cs2func_script_984_struct(5, 3196, "Black halberd" + "
" + " (with 10 Attack)", "Members now have the Strength level required to wield " + "" + "black halberds" + "" + ". (You also need level 10 Attack.)"); + case 2: + return newstruct cs2func_script_984_struct(5, 6599, "White halberd" + "
" + " (with 10 Attack)", "Members now have the Strength level required to wield " + "" + "white halberds" + "" + ". (You also need level 10 Attack.)"); + case 3: + return newstruct cs2func_script_984_struct(10, 3198, "Mithril halberd" + "
" + " (with 20 Attack)", "Members now have the Strength level required to wield " + "" + "mithril halberds" + "" + ". (You also need level 20 Attack.)"); + case 4: + return newstruct cs2func_script_984_struct(15, 3200, "Adamant halberd" + "
" + " (with 30 Attack)", "Members now have the Strength level required to wield " + "" + "adamant halberds" + "" + ". (You also need level 30 Attack.)"); + case 5: + return newstruct cs2func_script_984_struct(20, 3202, "Rune halberd" + "
" + " (with 40 Attack)", "Members now have the Strength level required to wield " + "" + "rune halberds" + "" + ". (You also need level 40 Attack.)"); + case 6: + return newstruct cs2func_script_984_struct(30, 3204, "Dragon halberd" + "
" + " (with 60 Attack)", "Members now have the Strength level required to wield " + "" + "dragon halberds" + "" + ". (They also need level 60 Attack.)"); + case 7: + return newstruct cs2func_script_984_struct(42, 8841, "Members: Void knight mace", "Members now have the Strength level required to wield " + "" + "Void knight maces" + "" + "."); + case 8: + return newstruct cs2func_script_984_struct(50, 4153, "Granite maul" + "
" + " (with 50 Attack)", "Members now have the Strength level required to wield " + "" + "granite mauls" + "" + ". (They also need level 50 Attack.)"); + case 9: + return newstruct cs2func_script_984_struct(50, 14679, "Granite mace" + "
" + " (with 50 Attack)", "Members now have the Strength level required to wield " + "" + "granite maces" + "" + ". (They also need level 50 Attack.)"); + case 10: + return newstruct cs2func_script_984_struct(60, 6528, "Tzhaar-Ket-Om", "Members can now wield " + "" + "Tzhaar-Ket-Om" + "" + "."); + case 11: + return newstruct cs2func_script_984_struct(70, 4718, "Dharok's greataxe" + "
" + " (with 70 Attack)", "Members now have the Strength level required to wield " + "" + "Dharok's greataxe" + "" + ". (They also need level 70 Attack.)"); + case 12: + return newstruct cs2func_script_984_struct(70, 4747, "Torag's hammers" + "
" + " (with 70 Attack)", "Members now have the Strength level required to wield " + "" + "Torag's hammers" + "" + ". (They also need level 70 Attack.)"); + case 13: + return newstruct cs2func_script_984_struct(75, 15403, "Members: Balmung (after Blood Runs Deep and with 75 Attack)", "Members can now wield " + "" + "Balmung" + "" + " (after Blood Runs Deep, with 75 Attack)."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_984_struct(20, 8921, "Members: Black mask" + "
" + " (with 10 Defence)", "Members can now wear " + "" + "black masks (with 10 Defence)" + "" + "."); + case 1: + return newstruct cs2func_script_984_struct(20, 15492, "Members: Full Slayer helmet" + "
" + " (after Smoking Kills with 20 Ranged, Magic and 10 Defence)", "Members can now wear " + "" + "full slayer helmets" + "" + " (after Smoking Kills with 20 Ranged, Magic and 10 Defence)."); + case 2: + return newstruct cs2func_script_984_struct(42, 11665, "Members: Void melee helm", "Members now have the Strength level required to wear " + "" + "Void melee helms" + "" + "."); + case 3: + return newstruct cs2func_script_984_struct(42, 11664, "Members: Void ranger helm", "Members now have the Strength level required to wear " + "" + "Void ranger helms" + "" + "."); + case 4: + return newstruct cs2func_script_984_struct(42, 11663, "Members: Void mage helm", "Members now have the Strength level required to wear " + "" + "Void mage helms" + "" + "."); + case 5: + return newstruct cs2func_script_984_struct(42, 8839, "Members: Void knight top", "Members now have the Strength level required to wear " + "" + "Void knight tops" + "" + "."); + case 6: + return newstruct cs2func_script_984_struct(42, 8840, "Members: Void knight robe", "Members now have the Strength level required to wear " + "" + "Void knight robes" + "" + "."); + case 7: + return newstruct cs2func_script_984_struct(42, 8842, "Members: Void knight gloves", "Members now have the Strength level required to wear " + "" + "Void knight gloves" + "" + "."); + case 8: + return newstruct cs2func_script_984_struct(42, 19712, "Members: Void knight deflector", "Members now have the Strength level required to wear " + "" + "Void knight deflectors" + "" + "."); + case 9: + return newstruct cs2func_script_984_struct(42, 7620, "Void knight equipment requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer.", "" + "Void knight equipment" + "" + " requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer."); + case 10: + return newstruct cs2func_script_984_struct(50, 10589, "Granite helm" + "
" + " (with 50 Defence)", "Members now have the Strength level required to wear " + "" + "granite helms" + "" + ". (They also need level 50 Defence.)"); + case 11: + return newstruct cs2func_script_984_struct(50, 10564, "Granite body" + "
" + " (with 50 Defence)", "Members now have the Strength level required to wear " + "" + "granite bodies" + "" + ". (They also need level 50 Defence.)"); + case 12: + return newstruct cs2func_script_984_struct(50, 6809, "Granite legs" + "
" + " (with 50 Defence)", "Members now have the Strength level required to wear " + "" + "granite legs" + "" + ". (They also need level 50 Defence.)"); + case 13: + return newstruct cs2func_script_984_struct(50, 3122, "Granite shield" + "
" + " (with 50 Defence)", "Members now have the Strength level required to wield " + "" + "granite shields" + "" + ". (They also need level 50 Defence.)"); + case 14: + return newstruct cs2func_script_984_struct(80, 20135, "Members: Torva full helm" + "
" + " (with 80 Defence and Constitution)", "Members can now wear " + "" + "torva full helms" + "" + ". (They also need level 80 Defence and Constitution.)"); + case 15: + return newstruct cs2func_script_984_struct(80, 20139, "Members: Torva platebody" + "
" + " (with 80 Defence and Constitution)", "Members can now wear " + "" + "torva platebodies" + "" + ". (They also need level 80 Defence and Constitution.)"); + case 16: + return newstruct cs2func_script_984_struct(80, 20143, "Members: Torva platelegs" + "
" + " (with 80 Defence and Constitution)", "Members can now wear " + "" + "torva platelegs" + "" + ". (They also need level 80 Defence and Constitution.)"); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_984_struct(19, 6515, "River crossing to Al Kharid" + "
" + " (with 8 Agility and 37 Ranged)", "You now have the Strength level required to cross the " + "" + "River Lum" + "" + " to " + "" + "Al Kharid" + "" + ". (You also need level 8 Agility and level 37 Ranged.)"); + case 1: + return newstruct cs2func_script_984_struct(21, 6515, "Karamja crossing, south of the volcano" + "
" + " (with 53 Agility and 42 Ranged)", "You now have the Strength level required to use the " + "" + "Karamja crossing, south of the volcano" + "" + ". (You also need level 53 Agility and level 42 Ranged."); + case 2: + return newstruct cs2func_script_984_struct(22, 6515, "Water Obelisk Island escape" + "
" + " (with 36 Agility and 39 Ranged)", "You now have the Strength level required to make the " + "" + "Water Obelisk Island escape" + "" + ". (You also need level 36 Agility and level 39 Ranged)."); + case 3: + return newstruct cs2func_script_984_struct(35, 6517, "Catherby cliff" + "
" + " (after Fishing Contest, with 32 Agility and 35 Ranged)", "You now have the Strength level required to scale " + "" + "Catherby cliff" + "" + " (after Fishing Contest, with level 32 Agility and level 35 Ranged)."); + case 4: + return newstruct cs2func_script_984_struct(37, 6517, "Falador wall" + "
" + " (with 11 Agility and 19 Ranged)", "You now have the Strength level required to scale " + "" + "Falador wall" + "" + ". (You also need level 11 Agility and level 19 Ranged.)"); + case 5: + return newstruct cs2func_script_984_struct(38, 6517, "Yanille wall" + "
" + " (with 39 Agility and 21 Ranged)", "You now have the Strength level required to scale " + "" + "Yanille wall" + "" + ". (You also need level 39 Agility and level 21 Ranged.)"); + case 6: + return newstruct cs2func_script_984_struct(60, 6515, "Cross Bandos's Throne Room " + "
" + " (after The Chosen Commander and with 60 Agility and 60 Ranged)", "Members now have the Strength level required to cross " + "" + "Bandos's throne room" + "" + " (after The Chosen Commander and with 60 Agility and 60 Ranged)."); + case 7: + return newstruct cs2func_script_984_struct(80, 6515, "Cross cave, south of Dorgesh-Kaan " + "
" + " (after Death to the Dorgeshuun, with 80 Agility and 80 Ranged)", "You now have the Strength level required to " + "" + "cross the cave, south of Dorgesh-Kaan" + "" + " (after Death to the Dorgeshuun, with 80 Agility and 80 Ranged)."); + } + break; + case 3: + if (((boolean)arg1)) { + return newstruct cs2func_script_984_struct(60, 4043, "God Wars Dungeon access via the Strength route", "You can now access the " + "" + "God Wars Dungeon" + "" + " via the " + "" + "Strength route" + "" + "."); + } + if (((boolean)arg1)) { + return newstruct cs2func_script_984_struct(70, 8122, "Bandos's Stronghold of the God Wars Dungeon", "You can now enter the " + "" + "Bandos's Stronghold" + "" + " of the " + "" + "God Wars Dungeon" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_984_struct(-1, 7620, "To start fishing like a barbarian, talk to Otto Godblessed when you have at least level 48 Fishing and level 15 Agility.", ""); + case 1: + return newstruct cs2func_script_984_struct(15, 11328, "Leaping trout" + "
" + " (with 15 Agility and 48 Fishing)", "Members versed in the art of barbarian fishing now have the Strength level required to catch " + "" + "leaping trout" + "" + ". (They also need level 15 Agility and level 48 Fishing.)"); + case 2: + return newstruct cs2func_script_984_struct(30, 11330, "Leaping salmon" + "
" + " (with 30 Agility and 58 Fishing)", "Members versed in the art of barbarian fishing now have the Strength level required to catch " + "" + "leaping salmon" + "" + ". (They also need level 30 Agility and level 58 Fishing.)"); + case 3: + return newstruct cs2func_script_984_struct(35, 11322, "Tuna" + "
" + " (with 55 Fishing)", "Members versed in the art of barbarian fishing now have the Strength level required to catch " + "" + "tuna" + "" + " without a harpoon. (They also need level 55 Fishing.)"); + case 4: + return newstruct cs2func_script_984_struct(45, 11332, "Leaping sturgeon" + "
" + " (with 45 Agility and 70 Fishing)", "Members versed in the art of barbarian fishing now have the Strength level required to catch " + "" + "leaping sturgeon" + "" + ". (They also need level 45 Agility and level 70 Fishing.)"); + case 5: + return newstruct cs2func_script_984_struct(50, 11321, "Swordfish" + "
" + " (with 70 Fishing)", "Members versed in the art of barbarian fishing now have the Strength level required to catch " + "" + "swordfish" + "" + " without a harpoon. (They also need level 70 Fishing.)"); + case 6: + return newstruct cs2func_script_984_struct(76, 11320, "Shark" + "
" + " (with 96 Fishing)", "Members versed in the art of barbarian fishing now have the Strength level required to catch " + "" + "shark" + "" + " without a harpoon. (They also need level 96 Fishing.)"); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_984_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Strength level increases, you will be able to attempt higher-level strength tasks within Daemonheim. You will also be more likely to succeed when attempting strength tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_984_struct(1, 16405, "Novite maul (Tier 1)", "You can now wield " + "" + "novite mauls" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_984_struct(10, 16407, "Bathus maul (Tier 2)", "You can now wield " + "" + "bathus mauls" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_984_struct(20, 16409, "Marmaros maul (Tier 3)", "You can now wield " + "" + "marmaros mauls" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_984_struct(30, 16411, "Kratonite maul (Tier 4)", "You can now wield " + "" + "kratonite mauls" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_984_struct(40, 16413, "Fractite maul (Tier 5)", "You can now wield " + "" + "fractite mauls" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_984_struct(50, 16415, "Members: Zephyrium maul (Tier 6)", "Members can now wield " + "" + "zephyrium mauls" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_984_struct(60, 16417, "Members: Argonite maul (Tier 7)", "Members can now wield " + "" + "argonite mauls" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_984_struct(70, 16419, "Members: Katagon maul (Tier 8)", "Members can now wield " + "" + "katagon mauls" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_984_struct(80, 16421, "Members: Gorgonite maul (Tier 9)", "Members can now wield " + "" + "gorgonite mauls" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_984_struct(90, 16423, "Members: Promethium maul (Tier 10)", "Members can now wield " + "" + "promethium mauls" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_984_struct(99, 16425, "Members: Primal maul (Tier 11)", "Members can now wield " + "" + "primal mauls" + "" + " within Daemonheim."); + } + break; + case 6: + if (((boolean)arg1)) { + return newstruct cs2func_script_984_struct(-1, 8855, "You can enter the Warriors' Guild when your Attack and Strength levels add up to 130 or more, or when you reach level 99 in either Attack or Strength.", ""); + } + if (((boolean)arg1)) { + return newstruct cs2func_script_984_struct(99, 9750, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Strength" + "" + ". Members can visit " + "" + "the guard of the Strength training area" + "" + " at the " + "" + "Warriors' Guild" + "" + ". He has something special that is only available to true masters of the " + "" + "Strength" + "" + " skill!"); + } + break; + case 7: + SWITCH (arg1) { + case 0: + GOTO flow_80 + case 1: + GOTO flow_81 + case 2: + GOTO flow_82 + case 3: + GOTO flow_83 + case 4: + GOTO flow_84 + case 5: + GOTO flow_85 + case 6: + GOTO flow_86 + case 7: + GOTO flow_87 + case 8: + GOTO flow_88 + case 9: + GOTO flow_89 + } + break; + flow_80: + return newstruct cs2func_script_984_struct(85, 21537, "Members: Battle-mage helm" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Strength requirement to wear " + "" + "Battle-mage helms" + "" + ". (They also need level 85 Defence and level 85 Magic.)"); + flow_81: + return newstruct cs2func_script_984_struct(85, 21539, "Members: Battle-mage robe" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Strength requirement to wear " + "" + "Battle-mage robes" + "" + ". (They also need level 85 Defence and level 85 Magic.)"); + flow_82: + return newstruct cs2func_script_984_struct(85, 21541, "Members: Battle-mage legs" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Strength requirement to wear " + "" + "Battle-mage legs" + "" + ". (They also need level 85 Defence and level 85 Magic.)"); + flow_83: + return newstruct cs2func_script_984_struct(85, 21543, "Members: Battle-mage gloves" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Strength requirement to wear " + "" + "Battle-mage gloves" + "" + ". (They also need level 85 Defence and level 85 Magic.)"); + flow_84: + return newstruct cs2func_script_984_struct(85, 21545, "Members: Battle-mage boots" + "
" + " (with 85 Defence and 85 Magic)", "Members now have the Strength requirement to wear " + "" + "Battle-mage boots" + "" + ". (They also need level 85 Defence and level 85 Magic.)"); + flow_85: + return newstruct cs2func_script_984_struct(85, 21557, "Members: Vanguard helm" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the Strength requirement to wear " + "" + "Vanguard helms" + "" + ". (They also need level 85 Defence and level 85 Ranged.)"); + flow_86: + return newstruct cs2func_script_984_struct(85, 21559, "Members: Vanguard body" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the Strength requirement to wear " + "" + "Vanguard body armour" + "" + ". (They also need level 85 Defence and level 85 Ranged.)"); + flow_87: + return newstruct cs2func_script_984_struct(85, 21561, "Members: Vanguard legs" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the Strength requirement to wear " + "" + "Vanguard leg armour" + "" + ". (They also need level 85 Defence and level 85 Ranged.)"); + flow_88: + return newstruct cs2func_script_984_struct(85, 21563, "Members: Vanguard gloves" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the Strength requirement to wear " + "" + "Vanguard gloves" + "" + ". (They also need level 85 Defence and level 85 Ranged.)"); + flow_89: + return newstruct cs2func_script_984_struct(85, 21565, "Members: Vanguard boots" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the Strength requirement to wear " + "" + "Vanguard boots" + "" + ". (They also need level 85 Defence and level 85 Ranged.)"); + } + return newstruct cs2func_script_984_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/985.cs2 b/dumps/scripts/985.cs2 new file mode 100644 index 000000000..df91c42a8 --- /dev/null +++ b/dumps/scripts/985.cs2 @@ -0,0 +1,23 @@ +cs2func_script_985_struct(1,1,0) script_985(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_985_struct(0, "Firemaking"); + case 1: + return newstruct cs2func_script_985_struct(1, "Barbarian fires"); + case 2: + return newstruct cs2func_script_985_struct(1, "Pyre ships"); + case 3: + return newstruct cs2func_script_985_struct(0, "Equipment"); + case 4: + return newstruct cs2func_script_985_struct(1, "Beacons"); + case 5: + return newstruct cs2func_script_985_struct(0, "Other"); + case 6: + return newstruct cs2func_script_985_struct(1, "Minigames"); + case 7: + return newstruct cs2func_script_985_struct(0, "Dungeoneering"); + case 8: + return newstruct cs2func_script_985_struct(0, "Milestones"); + } + return newstruct cs2func_script_985_struct(-1, ""); +} diff --git a/dumps/scripts/986.cs2 b/dumps/scripts/986.cs2 new file mode 100644 index 000000000..fe44fee4c --- /dev/null +++ b/dumps/scripts/986.cs2 @@ -0,0 +1,245 @@ +cs2func_script_986_struct(2,2,0) script_986(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_986_struct(1, 1511, "Normal logs", "You can now light " + "" + "normal logs" + "" + "."); + case 1: + return newstruct cs2func_script_986_struct(1, 596, "Members: Torch", "Members can now light " + "" + "torches" + "" + "."); + case 2: + return newstruct cs2func_script_986_struct(1, 36, "Members: Candle", "Members can now light " + "" + "candles" + "" + "."); + case 3: + return newstruct cs2func_script_986_struct(1, 2862, "Members: Achey logs", "Members can now light " + "" + "achey logs" + "" + "."); + case 4: + return newstruct cs2func_script_986_struct(4, 4531, "Members: Candle lantern", "Members can now light " + "" + "candle lanterns" + "" + "."); + case 5: + return newstruct cs2func_script_986_struct(5, 3438, "Members: Pyre logs", "Members can now light " + "" + "pyre logs" + "" + "."); + case 6: + return newstruct cs2func_script_986_struct(12, 4524, "Members: Oil lamp", "Members can now light " + "" + "oil lamps" + "" + "."); + case 7: + return newstruct cs2func_script_986_struct(15, 1521, "Oak logs", "You can now light " + "" + "oak logs" + "" + "."); + case 8: + return newstruct cs2func_script_986_struct(20, 7225, "Members: Iron spit", "Members can now cook with " + "" + "iron spits" + "" + "."); + case 9: + return newstruct cs2func_script_986_struct(20, 3440, "Members: Oak pyre logs", "Members can now light " + "" + "oak pyre logs" + "" + "."); + case 10: + return newstruct cs2func_script_986_struct(26, 4539, "Members: Oil lantern", "Members can now light " + "" + "oil lanterns" + "" + "."); + case 11: + return newstruct cs2func_script_986_struct(30, 1519, "Willow logs", "You can now light " + "" + "willow logs" + "" + "."); + case 12: + return newstruct cs2func_script_986_struct(33, 7053, "Members: Harpie bug lantern (not a light source)", "Members can now light " + "" + "harpie bug lanterns" + "" + ". These are not a light source."); + case 13: + return newstruct cs2func_script_986_struct(35, 6333, "Members: Teak logs", "Members can now light " + "" + "teak logs" + "" + "."); + case 14: + return newstruct cs2func_script_986_struct(35, 3442, "Members: Willow pyre logs", "Members can now light " + "" + "willow pyre logs" + "" + "."); + case 15: + return newstruct cs2func_script_986_struct(40, 6211, "Members: Teak pyre logs", "Members can now light " + "" + "teak pyre logs" + "" + "."); + case 16: + return newstruct cs2func_script_986_struct(42, 10810, "Members: Arctic pine logs", "Members can now light " + "" + "arctic pine logs" + "" + "."); + case 17: + return newstruct cs2func_script_986_struct(45, 1517, "Maple logs", "You can now light " + "" + "maple logs" + "" + "."); + case 18: + return newstruct cs2func_script_986_struct(47, 10808, "Members: Arctic pine pyre logs", "Members can now light " + "" + "arctic pine pyre logs" + "" + "."); + case 19: + return newstruct cs2func_script_986_struct(49, 4550, "Members: Bullseye lantern", "Members can now light " + "" + "bullseye lanterns" + "" + "."); + case 20: + return newstruct cs2func_script_986_struct(49, 4702, "Members: Sapphire lantern", "Members can now light " + "" + "sapphire lanterns" + "" + "."); + case 21: + return newstruct cs2func_script_986_struct(49, 9065, "Members: Emerald lantern", "Members can now light " + "" + "emerald lanterns" + "" + "."); + case 22: + return newstruct cs2func_script_986_struct(50, 6332, "Members: Mahogany logs", "Members can now light " + "" + "mahogany logs" + "" + "."); + case 23: + return newstruct cs2func_script_986_struct(50, 3444, "Members: Maple pyre logs", "Members can now light " + "" + "maple pyre logs" + "" + "."); + case 24: + return newstruct cs2func_script_986_struct(52, 10973, "Members: Replace Dorgeshuun light orb", "Members can now replace " + "" + "Dorgeshuun light orbs" + "" + "."); + case 25: + return newstruct cs2func_script_986_struct(55, 6213, "Members: Mahogany pyre logs", "Members can now light " + "" + "mahogany pyre logs" + "" + "."); + case 26: + return newstruct cs2func_script_986_struct(58, 12581, "Members: Eucalyptus logs", "Members can now light " + "" + "eucalyptus logs" + "" + "."); + case 27: + return newstruct cs2func_script_986_struct(60, 1515, "Yew logs", "You can now light " + "" + "yew logs" + "" + "."); + case 28: + return newstruct cs2func_script_986_struct(63, 12583, "Members: Eucalyptus pyre logs", "Members can now light " + "" + "eucalyptus pyre logs" + "" + "."); + case 29: + return newstruct cs2func_script_986_struct(65, 5013, "Members: Cave goblin mining helmet", "Members can now light " + "" + "cave goblin mining helmets" + "" + "."); + case 30: + return newstruct cs2func_script_986_struct(65, 3446, "Members: Yew pyre logs", "Members can now light " + "" + "yew pyre logs" + "" + "."); + case 31: + return newstruct cs2func_script_986_struct(75, 1513, "Members: Magic logs", "Members can now light " + "" + "magic logs" + "" + "."); + case 32: + return newstruct cs2func_script_986_struct(76, 21600, "Members: Blisterwood logs", "Members can now light " + "" + "blisterwood logs" + "" + "."); + case 33: + return newstruct cs2func_script_986_struct(80, 3448, "Members: Magic pyre logs", "Members can now light " + "" + "magic pyre logs" + "" + "."); + case 34: + return newstruct cs2func_script_986_struct(83, 21350, "Members: Curly root", "Members can now light " + "" + "curly roots" + "" + " in the jadinko lair."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_986_struct(-1, 7620, "To start Firemaking in the manner of the barbarians, talk to Otto Godblessed when you have level 35 Firemaking or higher.", ""); + case 1: + return newstruct cs2func_script_986_struct(21, 1511, "Members: Normal Logs", "Members versed in the art of barbarian firemaking can now light " + "" + "normal logs" + "" + " without a tinderbox."); + case 2: + return newstruct cs2func_script_986_struct(21, 2862, "Members: Achey tree", "Members versed in the art of barbarian firemaking can now light " + "" + "achey tree logs" + "" + " without a tinderbox."); + case 3: + return newstruct cs2func_script_986_struct(35, 1521, "Members: Oak", "Members versed in the art of barbarian firemaking can now light " + "" + "oak logs" + "" + " without a tinderbox."); + case 4: + return newstruct cs2func_script_986_struct(50, 1519, "Members: Willow", "Members versed in the art of barbarian firemaking can now light " + "" + "willow logs" + "" + " without a tinderbox."); + case 5: + return newstruct cs2func_script_986_struct(55, 6333, "Members: Teak", "Members versed in the art of barbarian firemaking can now light " + "" + "teak logs" + "" + " without a tinderbox."); + case 6: + return newstruct cs2func_script_986_struct(62, 10810, "Members: Arctic pine", "Members versed in the art of barbarian firemaking can now light " + "" + "arctic pine logs" + "" + " without a tinderbox."); + case 7: + return newstruct cs2func_script_986_struct(65, 1517, "Members: Maple", "Members versed in the art of barbarian firemaking can now light " + "" + "maple logs" + "" + " without a tinderbox."); + case 8: + return newstruct cs2func_script_986_struct(70, 6332, "Members: Mahogany", "Members versed in the art of barbarian firemaking can now light " + "" + "mahogany logs" + "" + " without a tinderbox."); + case 9: + return newstruct cs2func_script_986_struct(78, 12581, "Members: Eucalyptus", "Members versed in the art of barbarian firemaking can now light " + "" + "eucalyptus logs" + "" + " without a tinderbox."); + case 10: + return newstruct cs2func_script_986_struct(80, 1515, "Members: Yew", "Members versed in the art of barbarian firemaking can now light " + "" + "yew logs" + "" + " without a tinderbox."); + case 11: + return newstruct cs2func_script_986_struct(95, 1513, "Members: Magic", "Members versed in the art of barbarian firemaking can now light " + "" + "magic logs" + "" + " without a tinderbox."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_986_struct(-1, 7620, "To start Firemaking in the manner of the barbarians, talk to Otto Godblessed when you have level 35 Firemaking or higher. Pyre ships can only be constructed and burnt where the ground is charred, around the lake next to Otto's hut.", ""); + case 1: + return newstruct cs2func_script_986_struct(11, 1511, "Members: Wood" + "
" + " (with 11 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "logs" + "" + ". (They also need level 11 Crafting.)"); + case 2: + return newstruct cs2func_script_986_struct(11, 2862, "Members: Achey" + "
" + " (with 11 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "achey tree logs" + "" + ". (They also need level 11 Crafting.)"); + case 3: + return newstruct cs2func_script_986_struct(25, 1521, "Members: Oak" + "
" + " (with 25 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "oak logs" + "" + ". (They also need level 25 Crafting.)"); + case 4: + return newstruct cs2func_script_986_struct(40, 1519, "Members: Willow" + "
" + " (with 40 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "willow logs" + "" + ". (They also need level 40 Crafting.)"); + case 5: + return newstruct cs2func_script_986_struct(45, 6333, "Members: Teak" + "
" + " (with 45 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "teak logs" + "" + ". (They also need level 45 Crafting.)"); + case 6: + return newstruct cs2func_script_986_struct(52, 10810, "Members: Arctic pine" + "
" + " (with 52 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "arctic pine logs" + "" + ". (They also need level 52 Crafting.)"); + case 7: + return newstruct cs2func_script_986_struct(55, 1517, "Members: Maple" + "
" + " (with 55 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "maple logs" + "" + ". (They also need level 55 Crafting.)"); + case 8: + return newstruct cs2func_script_986_struct(60, 6332, "Members: Mahogany" + "
" + " (with 60 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "mahogany logs" + "" + ". (They also need level 60 Crafting.)"); + case 9: + return newstruct cs2func_script_986_struct(68, 12581, "Members: Eucalyptus" + "
" + " (with 68 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "eucalyptus logs" + "" + ". (They also need level 68 Crafting.)"); + case 10: + return newstruct cs2func_script_986_struct(70, 1515, "Members: Yew" + "
" + " (with 70 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "yew logs" + "" + ". (They also need level 70 Crafting.)"); + case 11: + return newstruct cs2func_script_986_struct(85, 1513, "Members: Magic" + "
" + " (with 85 Crafting)", "Members versed in the art of barbarian firemaking now have the Firemaking level required to light pyre ships made out of " + "" + "magic logs" + "" + ". (They also need level 85 Crafting.)"); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_986_struct(1, 590, "Tinderbox", "You can now light fires with a " + "" + "tinderbox" + "" + "."); + case 1: + return newstruct cs2func_script_986_struct(61, 15241, "Members: Chaos dwarf hand cannon" + "
" + " (after Forgiveness of a Chaos Dwarf and with 75 Ranged)", "Members now have the Firemaking level required to fire the " + "" + "chaos dwarf hand cannon" + "" + " (after Forgiveness of a Chaos Dwarf and with 75 Ranged)."); + case 2: + return newstruct cs2func_script_986_struct(62, 13659, "Members: Ring of Fire" + "
" + " (after All Fired Up)", "Members can now wear the " + "" + "Ring of Fire" + "" + " (after All Fired Up)."); + case 3: + return newstruct cs2func_script_986_struct(79, 13660, "Members: Flame Gloves" + "
" + " (after All Fired Up)", "Members can now wear the " + "" + "Flame Gloves" + "" + " (after All Fired Up)."); + case 4: + return newstruct cs2func_script_986_struct(92, 13661, "Members: Inferno Adze" + "
" + " (after All Fired Up)", "Members can now use the " + "" + "Inferno Adze" + "" + " (after All Fired Up)."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_986_struct(-1, 7620, "To use the beacons, you must have completed All Fired Up.", ""); + case 1: + return newstruct cs2func_script_986_struct(43, 13662, "Members: Beacon near the River Salve", "Members can now light the " + "" + "beacon" + "" + " near the " + "" + "River Salve" + "" + " (after All Fired Up)."); + case 2: + return newstruct cs2func_script_986_struct(43, 13662, "Members: Beacon near the Rag and Bone Man", "Members can now light the " + "" + "beacon" + "" + " near the " + "" + "Rag and Bone Man" + "" + " (after All Fired Up)."); + case 3: + return newstruct cs2func_script_986_struct(48, 13662, "Members: Beacon near the Jolly Boar", "Members can now light the " + "" + "beacon" + "" + " near the " + "" + "Jolly Boar" + "" + " (after All Fired Up)."); + case 4: + return newstruct cs2func_script_986_struct(53, 13662, "Members: Beacon north of Varrock Palace", "Members can now light the " + "" + "beacon" + "" + " north of " + "" + "Varrock Palace" + "" + " (after All Fired Up)."); + case 5: + return newstruct cs2func_script_986_struct(59, 13662, "Members: Beacon near the Grand Exchange", "Members can now light the " + "" + "beacon" + "" + " near the " + "" + "Grand Exchange" + "" + " (after All Fired Up)."); + case 6: + return newstruct cs2func_script_986_struct(62, 13662, "Members: Beacon near Edgeville", "Members can now light the " + "" + "beacon" + "" + " near " + "" + "Edgeville" + "" + " (after All Fired Up)."); + case 7: + return newstruct cs2func_script_986_struct(68, 13662, "Members: Beacon near the Monastery" + "
" + " (after joining the Monastery)", "Members can now light the " + "" + "beacon" + "" + " near " + "" + "the Monastery" + "" + " (after All Fired Up and after joining the Monastery)."); + case 8: + return newstruct cs2func_script_986_struct(72, 13662, "Members: Beacon near Goblin Village" + "
" + " (after Land of the Goblins)", "Members can now light the " + "" + "beacon" + "" + " near " + "" + "Goblin Village" + "" + " (after All Fired Up and Land of the Goblins)."); + case 9: + return newstruct cs2func_script_986_struct(76, 13662, "Members: Beacon near Burthorpe" + "
" + " (with 56 Smithing)", "Members now have the Firemaking level required to light the " + "" + "beacon" + "" + " near " + "" + "Burthorpe" + "" + ". (They also need level 56 Smithing and to have completed All Fired Up)."); + case 10: + return newstruct cs2func_script_986_struct(79, 13662, "Members: Beacon east of Death Plateau" + "
" + " (with 42 Construction)", "Members now have the Firemaking level required to light the " + "" + "beacon" + "" + " east of " + "" + "Death Plateau" + "" + ". (They also need level 42 Construction and to have completed All Fired Up)."); + case 11: + return newstruct cs2func_script_986_struct(83, 13662, "Members: Beacon near the Trollheim shortcut" + "
" + " (with 64 Agility)", "Members now have the Firemaking level required to light the " + "" + "beacon" + "" + " near the " + "" + "Trollheim shortcut" + "" + ". (They also need level 64 Agility and to have completed All Fired Up)."); + case 12: + return newstruct cs2func_script_986_struct(87, 13662, "Members: Beacon near the entrance to the God Wars Dungeon" + "
" + " (with 60 Crafting)", "Members now have the Firemaking level required to light the " + "" + "beacon" + "" + " near the entrance to the " + "" + "God Wars Dungeon" + "" + ". (They also need level 60 Crafting and to have completed All Fired Up)."); + case 13: + return newstruct cs2func_script_986_struct(89, 13662, "Members: Beacon near small temple in the Wilderness" + "
" + " (with 70 Smithing or 59 Construction)", "Members now have the Firemaking level required to light the " + "" + "beacon" + "" + " near the " + "" + "small temple in the Wilderness" + "" + ". (They will also need level 70 Smithing or level 59 Construction, and to have completed All Fired Up)."); + case 14: + return newstruct cs2func_script_986_struct(92, 13662, "Members: Beacon on the Frozen Waste Plateau", "Members can now light the " + "" + "beacon" + "" + " on the " + "" + "Frozen Waste Plateau" + "" + " (after All Fired Up)."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_986_struct(91, 18778, "Members: Starved ancient effigies", "Members can now investigate " + "" + "starved ancient effigies" + "" + " using their knowledge of Firemaking."); + case 1: + return newstruct cs2func_script_986_struct(93, 18779, "Members: Nourished ancient effigies", "Members can now investigate " + "" + "nourished ancient effigies" + "" + " using their knowledge of Firemaking."); + case 2: + return newstruct cs2func_script_986_struct(95, 18780, "Members: Sated ancient effigies", "Members can now investigate " + "" + "sated ancient effigies" + "" + " using their knowledge of Firemaking."); + case 3: + return newstruct cs2func_script_986_struct(97, 18781, "Members: Gorged ancient effigies", "Members can now investigate " + "" + "gorged ancient effigies" + "" + " using their knowledge of Firemaking."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_986_struct(1, 14667, "Members: Burn basic evil tree", "Members can now burn " + "" + "basic evil trees" + ""); + case 1: + return newstruct cs2func_script_986_struct(15, 14667, "Members: Burn evil oak tree", "Members can now burn " + "" + "evil oak trees" + ""); + case 2: + return newstruct cs2func_script_986_struct(30, 14667, "Members: Burn evil willow tree", "Members can now burn " + "" + "evil willow trees" + ""); + case 3: + return newstruct cs2func_script_986_struct(45, 14667, "Members: Burn evil maple tree", "Members can now burn " + "" + "evil maple trees" + ""); + case 4: + return newstruct cs2func_script_986_struct(55, 14619, "Members: Phoenix Lair - funeral pyre", "Members can now light the phoenix's " + "" + "funeral pyre" + "" + " in the phoenix lair."); + case 5: + return newstruct cs2func_script_986_struct(60, 14667, "Members: Burn evil yew tree", "Members can now burn " + "" + "evil yew trees" + ""); + case 6: + return newstruct cs2func_script_986_struct(75, 14667, "Members: Burn evil magic tree", "Members can now burn " + "" + "evil magic trees" + ""); + case 7: + return newstruct cs2func_script_986_struct(85, 14667, "Members: Burn elder evil tree", "Members can now burn " + "" + "elder evil trees" + ""); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_986_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Firemaking level increases, you will be able to attempt higher-level firemaking tasks within Daemonheim. You will also be more likely to succeed when attempting firemaking tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_986_struct(1, 17682, "Tangle gum branches (Tier 1)", "You can now light " + "" + "tangle gum branches" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_986_struct(10, 17684, "Seeping elm branches (Tier 2)", "You can now light " + "" + "seeping elm branches" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_986_struct(20, 17686, "Blood spindle branches (Tier 3)", "You can now light " + "" + "blood spindle branches" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_986_struct(30, 17688, "Utuku branches (Tier 4)", "You can now light " + "" + "utuku branches" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_986_struct(40, 17690, "Spinebeam branches (Tier 5)", "You can now light " + "" + "spinebeam branches" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_986_struct(50, 17692, "Members: Bovistrangler branches (Tier 6)", "Members can now light " + "" + "bovistrangler branches" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_986_struct(60, 17694, "Members: Thigat branches (Tier 7)", "Members can now light " + "" + "thigat branches" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_986_struct(70, 17696, "Members: Corpsethorn branches (Tier 8)", "Members can now light " + "" + "corpsethorn branches" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_986_struct(80, 17698, "Members: Entgallow branches (Tier 9)", "Members can now light " + "" + "entgallow branches" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_986_struct(90, 17700, "Members: Grave creeper branches (Tier 10)", "Members can now light " + "" + "grave creeper branches" + "" + " within Daemonheim."); + } + break; + case 8: + if (((boolean)arg1)) { + return newstruct cs2func_script_986_struct(99, 9804, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Firemaking" + "" + ". Members can visit " + "" + "Ignatius" + "" + ", south of " + "" + "Seers' Village" + "" + ". He has something special that is only available to true masters of the " + "" + "Firemaking" + "" + " skill!"); + } + } + return newstruct cs2func_script_986_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/987.cs2 b/dumps/scripts/987.cs2 new file mode 100644 index 000000000..35c348821 --- /dev/null +++ b/dumps/scripts/987.cs2 @@ -0,0 +1,15 @@ +cs2func_script_987_struct(1,1,0) script_987(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_987_struct(1, "Equipment"); + case 1: + return newstruct cs2func_script_987_struct(1, "Monsters"); + case 2: + return newstruct cs2func_script_987_struct(1, "Slayer Masters"); + case 3: + return newstruct cs2func_script_987_struct(1, "Dungeoneering"); + case 4: + return newstruct cs2func_script_987_struct(1, "Milestones"); + } + return newstruct cs2func_script_987_struct(-1, ""); +} diff --git a/dumps/scripts/988.cs2 b/dumps/scripts/988.cs2 new file mode 100644 index 000000000..82f5e3ee6 --- /dev/null +++ b/dumps/scripts/988.cs2 @@ -0,0 +1,201 @@ +cs2func_script_988_struct(2,2,0) script_988(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_988_struct(1, 4155, "Enchanted gem", "You can now use an " + "" + "enchanted gem" + "" + " to communicate with your Slayer Master."); + case 1: + return newstruct cs2func_script_988_struct(1, 4161, "Bag of salt", "You can now use " + "" + "bags of salt" + "" + " to finish off rock slugs."); + case 2: + return newstruct cs2func_script_988_struct(1, 6696, "Ice cooler", "You can now use " + "" + "ice coolers" + "" + "to finish off desert lizards."); + case 3: + return newstruct cs2func_script_988_struct(1, 4551, "Spiny helmet" + "
" + " (with 5 Defence)", "You now have the Slayer level required to wear a " + "" + "spiny helmet" + "" + " to fend off wall beast attacks. (You also need level 5 Defence."); + case 4: + return newstruct cs2func_script_988_struct(1, 4162, "Rock hammer", "You can now use " + "" + "rock hammers" + "" + " to kill weakened gargoyles."); + case 5: + return newstruct cs2func_script_988_struct(1, 15490, "Members: Focus sight" + "
" + " (with 20 Ranged and 10 Defence)", "Members can now wear " + "" + "focus sights" + "" + "."); + case 6: + return newstruct cs2func_script_988_struct(1, 15488, "Members: Hexcrest" + "
" + " (with 20 Magic and 10 Defence)", "Members can now wear " + "" + "hexcrests" + "" + "."); + case 7: + return newstruct cs2func_script_988_struct(1, 8921, "Members: Black mask" + "
" + " (with 20 Strength and 10 Defence)", "Members can now wear " + "" + "black masks" + "" + "."); + case 8: + return newstruct cs2func_script_988_struct(1, 13263, "Members: Slayer helmet" + "
" + " (after Smoking Kills)", "Members can now wear " + "" + "slayer helmets" + "" + " (after Smoking Kills)."); + case 9: + return newstruct cs2func_script_988_struct(1, 15492, "Members: Full Slayer helmet" + "
" + " (after Smoking Kills with 20 Ranged, Magic, Strength and 10 Defence)", "Members can now wear " + "" + "full slayer helmets" + "" + " (after Smoking Kills with 20 Ranged, Magic, Strength and 10 Defence)."); + case 10: + return newstruct cs2func_script_988_struct(10, 4164, "Face mask", "You can now wear the " + "" + "face mask" + "" + " needed to kill dust devils."); + case 11: + return newstruct cs2func_script_988_struct(15, 4166, "Earmuffs", "You can now wear " + "" + "earmuffs" + "" + " to protect yourself against banshees."); + case 12: + return newstruct cs2func_script_988_struct(25, 4156, "Mirror shield" + "
" + " (with 20 Defence)", "You now have the Slayer level required to wield " + "" + "mirror shields" + "" + " to protect yourself from cockatrices and basilisks. (You also need level 20 Defence.)"); + case 13: + return newstruct cs2func_script_988_struct(32, 6660, "Fishing explosive", "You can now use " + "" + "fishing explosives" + "" + " to lure mogres."); + case 14: + return newstruct cs2func_script_988_struct(33, 7053, "Harpie bug lantern" + "
" + " (not a light source)", "You can now use " + "" + "harpie bug lanterns" + "" + " to fend off harpie bug swarms so that you can attack."); + case 15: + return newstruct cs2func_script_988_struct(35, 8923, "Witchwood icon", "You can now wear " + "" + "witchwood icons" + "" + " to protect yourself from cave horrors."); + case 16: + return newstruct cs2func_script_988_struct(37, 7159, "Insulated boots", "You can now wear " + "" + "insulated boots" + "" + " to protect yourself from killerwatt shocks."); + case 17: + return newstruct cs2func_script_988_struct(39, 10952, "Slayer bell", "You can now use " + "" + "slayer bells" + "" + ", which allow molanisks to be attacked."); + case 18: + return newstruct cs2func_script_988_struct(42, 6720, "Slayer gloves", "You can now wear " + "" + "slayer gloves" + "" + " to protect yourself from fever spiders."); + case 19: + return newstruct cs2func_script_988_struct(55, 4158, "Leaf-bladed spear" + "
" + " (with 50 Attack)", "You now have the Slayer level required to wield " + "" + "leaf-bladed spears" + "" + ", melee weapons used for killing turoth and kurask. (You also need level 50 Attack.)"); + case 20: + return newstruct cs2func_script_988_struct(55, 4150, "Broad arrows" + "
" + " (with 50 Ranged)", "You now have the Slayer level required to fire " + "" + "broad arrows" + "" + ", ranged weapons used for killing turoth and kurask. (You also need level 50 Ranged.)"); + case 21: + return newstruct cs2func_script_988_struct(55, 13280, "Broad-tipped bolts" + "
" + " (with 50 Ranged)", "You now have the Slayer level required to fire " + "" + "broad bolts" + "" + ", ranged weapons used for killing turoth and kurask. (You also need level 50 Ranged.)"); + case 22: + return newstruct cs2func_script_988_struct(55, 4170, "Slayer's staff" + "
" + " (with 50 Magic)", "You now have the Slayer level required to wield " + "" + "slayer's staves" + "" + ", magic weapons used for killing turoth and kurask. (You also need level 50 Magic.)"); + case 23: + return newstruct cs2func_script_988_struct(55, 13290, "Leaf-bladed swords" + "
" + " (with 50 Attack)", "You now have the Slayer level required to wield " + "" + "leaf-bladed swords" + "" + ", melee weapons used for killing turoth and kurask (with level 50 Attack)."); + case 24: + return newstruct cs2func_script_988_struct(56, 11749, "Crystal chime", "You can now use a " + "" + "crystal chime" + "" + " to kill warped terrorbirds and warped tortoises."); + case 25: + return newstruct cs2func_script_988_struct(57, 7432, "Fungicide spray", "You can now use " + "" + "fungicide spray" + "" + " to finish off mutated zygomites."); + case 26: + return newstruct cs2func_script_988_struct(60, 4168, "Nose peg", "You can now wear a " + "" + "nosepeg" + "" + " to protect yourself from aberrant spectres."); + case 27: + return newstruct cs2func_script_988_struct(70, 12862, "Dragon slayer gloves", "You can now wear " + "" + "dragon slayer gloves" + "" + "."); + case 28: + return newstruct cs2func_script_988_struct(80, 21371, "Abyssal vine whip" + "
" + " (with 85 Attack)", "You now have the Slayer level required to wield " + "" + "abyssal vine whips" + "" + ". (You also need level 85 Attack.)"); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_988_struct(5, 4133, "Crawling hand", "You can now slay " + "" + "crawling hands" + "" + "."); + case 1: + return newstruct cs2func_script_988_struct(7, 4521, "Cave bug", "You can now slay " + "" + "cave bugs" + "" + "."); + case 2: + return newstruct cs2func_script_988_struct(10, 4134, "Cave crawler", "You can now slay " + "" + "cave crawlers" + "" + "."); + case 3: + return newstruct cs2func_script_988_struct(15, 4135, "Banshee", "You can now slay " + "" + "banshees" + "" + "."); + case 4: + return newstruct cs2func_script_988_struct(17, 4520, "Cave slime", "You can now slay " + "" + "cave slimes" + "" + "."); + case 5: + return newstruct cs2func_script_988_struct(20, 4136, "Rockslug", "You can now slay " + "" + "rockslugs" + "" + "."); + case 6: + return newstruct cs2func_script_988_struct(22, 6695, "Desert lizard", "You can now slay " + "" + "desert lizards" + "" + "."); + case 7: + return newstruct cs2func_script_988_struct(25, 4137, "Cockatrice", "You can now slay " + "" + "cockatrices" + "" + "."); + case 8: + return newstruct cs2func_script_988_struct(30, 4138, "Pyrefiend", "You can now slay " + "" + "pyrefiends" + "" + "."); + case 9: + return newstruct cs2func_script_988_struct(32, 6661, "Mogre", "You can now slay " + "" + "mogres" + "" + "."); + case 10: + return newstruct cs2func_script_988_struct(33, 7050, "Harpie bug swarm", "You can now slay " + "" + "harpie bug swarms" + "" + "."); + case 11: + return newstruct cs2func_script_988_struct(35, 4519, "Wall beast", "You can now slay " + "" + "wall beasts" + "" + "."); + case 12: + return newstruct cs2func_script_988_struct(37, 7160, "Killerwatt", "You can now slay " + "" + "killerwatts" + "" + "."); + case 13: + return newstruct cs2func_script_988_struct(39, 10997, "Molanisk", "You can now slay " + "" + "molanisks" + "" + "."); + case 14: + return newstruct cs2func_script_988_struct(40, 4139, "Basilisk", "You can now slay " + "" + "basilisks" + "" + "."); + case 15: + return newstruct cs2func_script_988_struct(40, 10591, "Terror dog", "You can now slay " + "" + "terror dogs" + "" + "."); + case 16: + return newstruct cs2func_script_988_struct(42, 6709, "Fever spider", "You can now slay " + "" + "fever spiders" + "" + "."); + case 17: + return newstruct cs2func_script_988_struct(45, 4140, "Infernal mage", "You can now slay " + "" + "infernal mages" + "" + "."); + case 18: + return newstruct cs2func_script_988_struct(47, 11047, "Brine rat", "You can now slay " + "" + "brine rats" + "" + "."); + case 19: + return newstruct cs2func_script_988_struct(50, 4141, "Bloodveld", "You can now slay " + "" + "bloodvelds" + "" + "."); + case 20: + return newstruct cs2func_script_988_struct(51, 14618, "Phoenix" + "
" + " (after In Pyre Need)", "You can now slay the " + "" + "phoenix" + "" + "(after In Pyre Need)."); + case 21: + return newstruct cs2func_script_988_struct(52, 4142, "Jelly", "You can now slay " + "" + "jellies" + "" + "."); + case 22: + return newstruct cs2func_script_988_struct(55, 4143, "Turoth", "You can now slay " + "" + "turoths" + "" + "."); + case 23: + return newstruct cs2func_script_988_struct(56, 11752, "Warped terrorbird", "You can now slay " + "" + "warped terrorbirds" + "" + "."); + case 24: + return newstruct cs2func_script_988_struct(56, 11751, "Warped tortoise", "You can now slay " + "" + "warped tortoises" + "" + "."); + case 25: + return newstruct cs2func_script_988_struct(57, 7420, "Mutated zygomite", "You can now slay " + "" + "mutated zygomites" + "" + "."); + case 26: + return newstruct cs2func_script_988_struct(58, 8900, "Cave horror", "You can now slay " + "" + "cave horrors" + "" + "."); + case 27: + return newstruct cs2func_script_988_struct(59, 11779, "Wild jade vine" + "
" + " (after Back to My Roots)", "You now have the Slayer level required to slay " + "" + "wild jade vines" + "" + " (after Back to My Roots)."); + case 28: + return newstruct cs2func_script_988_struct(60, 4144, "Aberrant spectre", "You can now slay " + "" + "aberrant spectres" + "" + "."); + case 29: + return newstruct cs2func_script_988_struct(61, 12501, "'Rum'-pumped crab", "You can now slay " + "" + "'rum'-pumped crabs" + "" + "."); + case 30: + return newstruct cs2func_script_988_struct(63, 11742, "Spiritual ranger", "You can now slay " + "" + "spiritual rangers" + "" + "."); + case 31: + return newstruct cs2func_script_988_struct(65, 4145, "Dust devil", "You can now slay " + "" + "dust devils" + "" + "."); + case 32: + return newstruct cs2func_script_988_struct(68, 11744, "Spiritual warrior", "You can now slay " + "" + "spiritual warriors" + "" + "."); + case 33: + return newstruct cs2func_script_988_struct(70, 4146, "Kurask", "You can now slay " + "" + "kurask" + "" + "."); + case 34: + return newstruct cs2func_script_988_struct(72, 6811, "Skeletal wyvern", "You can now slay " + "" + "skeletal wyverns" + "" + "."); + case 35: + return newstruct cs2func_script_988_struct(73, 15499, "Jungle strykewyrm", "You can now slay " + "" + "jungle strykewyrms" + "" + "."); + case 36: + return newstruct cs2func_script_988_struct(75, 4147, "Gargoyle", "You can now slay " + "" + "gargoyles" + "" + "."); + case 37: + return newstruct cs2func_script_988_struct(77, 15498, "Desert strykewyrm", "You can now slay " + "" + "desert strykewyrms" + "" + "."); + case 38: + return newstruct cs2func_script_988_struct(78, 15125, "Aquanite", "You can now slay " + "" + "aquanites" + "" + "."); + case 39: + return newstruct cs2func_script_988_struct(80, 4148, "Nechryael", "You can now slay " + "" + "nechryaels" + "" + "."); + case 40: + return newstruct cs2func_script_988_struct(80, 21366, "Mutated jadinko baby", "You can now slay " + "" + "mutated jadinko babies" + "" + "."); + case 41: + return newstruct cs2func_script_988_struct(83, 11740, "Spiritual mage", "You can now slay " + "" + "spiritual mages" + "" + "."); + case 42: + return newstruct cs2func_script_988_struct(85, 4149, "Abyssal demon", "You can now slay " + "" + "abyssal demons" + "" + "."); + case 43: + return newstruct cs2func_script_988_struct(86, 21367, "Mutated jadinko guard", "You can now slay " + "" + "mutated jadinko guards" + "" + "."); + case 44: + return newstruct cs2func_script_988_struct(90, 6637, "Dark beast", "You can now slay " + "" + "dark beasts" + "" + "."); + case 45: + return newstruct cs2func_script_988_struct(91, 21368, "Mutated jadinko male", "You can now slay " + "" + "mutated jadinko males" + "" + "."); + case 46: + return newstruct cs2func_script_988_struct(93, 15500, "Ice strykewyrm", "You can now slay " + "" + "ice strykewyrms" + "" + "."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_988_struct(1, 4155, "Burthorpe" + "
" + " (with level 3 Combat)", "You can now receive " + "" + "Slayer assignments" + "" + " from the " + "" + "Burthorpe slayer master" + "" + "."); + case 1: + return newstruct cs2func_script_988_struct(1, 4155, "Canifis" + "
" + " (with level 20 Combat)", "You now have the Slayer level required to receive " + "" + "slayer assignments" + "" + " from the " + "" + "Canifis slayer master" + "" + ". (You also need level 20 Combat.)"); + case 2: + return newstruct cs2func_script_988_struct(1, 4155, "Edgeville Dungeon" + "
" + " (with level 40 Combat)", "You now have the Slayer level required to receive " + "" + "slayer assignments" + "" + " from the " + "" + "Edgeville Dungeon slayer master" + "" + ". (You also need level 40 Combat.)"); + case 3: + return newstruct cs2func_script_988_struct(1, 4155, "Zanaris" + "
" + " (with level 70 Combat)", "You now have the Slayer level required to receive " + "" + "slayer assignments" + "" + " from the " + "" + "Zanaris slayer master" + "" + ". (You also need level 70 Combat.)"); + case 4: + return newstruct cs2func_script_988_struct(35, 4155, "Pollnivneach" + "
" + " (after Smoking Kills)", "You now have the Slayer level required to receive " + "" + "slayer assignments" + "" + " from the " + "" + "Pollnivneach slayer master" + "" + " (after Smoking Kills)."); + case 5: + return newstruct cs2func_script_988_struct(50, 4155, "Shilo Village" + "
" + " (with level 100 Combat)", "You now have the Slayer level required to receive " + "" + "slayer assignments" + "" + " from the " + "" + "Shilo Village slayer master" + "" + ". (You also need level 100 Combat.)"); + case 6: + return newstruct cs2func_script_988_struct(75, 4155, "Ancient cavern" + "
" + " (with level 110 Combat)", "You now have the Slayer level required to receive " + "" + "slayer assignments" + "" + " from the " + "" + "Ancient Cavern slayer master" + "" + ". (You also need level 110 Combat.)"); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_988_struct(41, 18504, "Night spider", "You can now slay " + "" + "night spiders" + "" + " within Daemonheim."); + case 1: + return newstruct cs2func_script_988_struct(63, 18506, "Spiritual guardian", "You can now slay " + "" + "spiritual guardians" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_988_struct(71, 18505, "Seeker", "You can now slay " + "" + "seekers" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_988_struct(90, 18503, "Edimmu", "You can now slay " + "" + "edimmu" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_988_struct(99, 18507, "Soulgazer", "You can now slay " + "" + "soulgazers" + "" + " within Daemonheim."); + } + break; + case 4: + if (((boolean)arg1)) { + return newstruct cs2func_script_988_struct(99, 9786, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Slayer" + "" + ". Why not visit the " + "" + "ancient cavern Slayer Master" + "" + "? She has something special that is only available to true masters of the " + "" + "Slayer" + "" + " skill!"); + } + } + return newstruct cs2func_script_988_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/989.cs2 b/dumps/scripts/989.cs2 new file mode 100644 index 000000000..204ea6cf6 --- /dev/null +++ b/dumps/scripts/989.cs2 @@ -0,0 +1,21 @@ +cs2func_script_989_struct(1,1,0) script_989(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_989_struct(0, "Trees"); + case 1: + return newstruct cs2func_script_989_struct(0, "Hatchets"); + case 2: + return newstruct cs2func_script_989_struct(0, "Canoes"); + case 3: + return newstruct cs2func_script_989_struct(1, "Woodcraft"); + case 4: + return newstruct cs2func_script_989_struct(0, "Other"); + case 5: + return newstruct cs2func_script_989_struct(1, "Minigames"); + case 6: + return newstruct cs2func_script_989_struct(0, "Dungeoneering"); + case 7: + return newstruct cs2func_script_989_struct(0, "Milestones"); + } + return newstruct cs2func_script_989_struct(-1, ""); +} diff --git a/dumps/scripts/99.cs2 b/dumps/scripts/99.cs2 new file mode 100644 index 000000000..3a6b9e6a2 --- /dev/null +++ b/dumps/scripts/99.cs2 @@ -0,0 +1,42 @@ +void script_99() { + int ivar0; + int ivar1; + int ivar2; + ivar0 = 5; + ivar1 = 5; + ivar2 = 0; + while (ivar0 < 125) { + while (ivar1 < 120) { + createExtraChild(new WidgetPointer(631,47), 5, ivar2); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(ivar1, ivar0, 0, 0); + if (getItemIdInSlot(134, ivar2) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlot(134, ivar2), getItemAmtInSlot(134, ivar2)); + cs2method1305("" + getItemName(getItemIdInSlot(134, ivar2))); + setWidgetContextMenuOption(1, "Remove 1"); + setWidgetContextMenuOption(2, "Remove 5"); + setWidgetContextMenuOption(3, "Remove 10"); + setWidgetContextMenuOption(4, "Remove All"); + setWidgetContextMenuOption(5, "Remove X"); + setWidgetContextMenuOption(10, "Examine"); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + } + createExtraChild(new WidgetPointer(631,49), 5, ivar2); + setWidgetSize(36, 32, 0, 0); + setWidgetPosition(ivar1, ivar0, 0, 0); + if (getItemIdInSlotSplit(134, ivar2) != -1) { + setItemOnWidgetMethod1200(getItemIdInSlotSplit(134, ivar2), getItemAmtInSlotSplit(134, ivar2)); + cs2method1305("" + getItemName(getItemIdInSlotSplit(134, ivar2))); + setWidgetContextMenuOption(1, "Examine"); + setWidgetShadowColor(new Color(48, 32, 32)); + setWidgetBorderThickness(1); + } + ivar1 = add(ivar1, 40); + ivar2 = add(ivar2, 1); + } + ivar0 = add(ivar0, 42); + ivar1 = 5; + } + return; +} diff --git a/dumps/scripts/990.cs2 b/dumps/scripts/990.cs2 new file mode 100644 index 000000000..fc3cc0880 --- /dev/null +++ b/dumps/scripts/990.cs2 @@ -0,0 +1,206 @@ +cs2func_script_990_struct(2,2,0) script_990(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_990_struct(1, 1511, "Normal tree", "You can now chop down " + "" + "normal trees" + "" + "."); + case 1: + return newstruct cs2func_script_990_struct(1, 2862, "Members: Achey tree", "Members can now chop down " + "" + "achey trees" + "" + "."); + case 2: + return newstruct cs2func_script_990_struct(10, 6281, "Members: Light jungle" + "
" + " (after Jungle Potion)", "Members now have the Woodcutting level required to clear " + "" + "light jungle" + "" + " in Tai Bwo Wannai Clean-up (after Jungle Potion)."); + case 3: + return newstruct cs2func_script_990_struct(15, 1521, "Oak tree", "You can now chop down " + "" + "oak trees" + "" + "."); + case 4: + return newstruct cs2func_script_990_struct(20, 6283, "Members: Medium jungle" + "
" + " (after Jungle Potion)", "Members now have the Woodcutting level required to clear " + "" + "medium jungle" + "" + " in Tai Bwo Wannai Clean-up (after Jungle Potion)."); + case 5: + return newstruct cs2func_script_990_struct(30, 1519, "Willow tree", "You can now chop down " + "" + "willow trees" + "" + "."); + case 6: + return newstruct cs2func_script_990_struct(35, 6285, "Members: Dense jungle" + "
" + " (after Jungle Potion)", "Members now have the Woodcutting level required to clear " + "" + "dense jungle" + "" + " in Tai Bwo Wannai Clean-up (after Jungle Potion)."); + case 7: + return newstruct cs2func_script_990_struct(35, 6333, "Members: Teak tree" + "
" + " (after Jungle Potion)", "Members now have the Woodcutting level required to chop down " + "" + "teak trees" + "" + " (after Jungle Potion)."); + case 8: + return newstruct cs2func_script_990_struct(37, 13756, "Members: Cursed willow tree roots" + "
" + " (after starting Summer's End)", "Members now have the Woodcutting level required to chop " + "" + "cursed willow tree roots" + "" + " (after starting Summer's End)."); + case 9: + return newstruct cs2func_script_990_struct(45, 1517, "Maple tree", "You can now chop down " + "" + "maple trees" + "" + "."); + case 10: + return newstruct cs2func_script_990_struct(45, 3239, "Members: Hollow tree", "Members can now chop down " + "" + "hollow trees" + "" + "."); + case 11: + return newstruct cs2func_script_990_struct(50, 6332, "Members: Mahogany tree" + "
" + " (after Jungle Potion)", "Members now have the Woodcutting level required to chop down " + "" + "mahogany trees" + "" + " (after Jungle Potion)."); + case 12: + return newstruct cs2func_script_990_struct(54, 10810, "Members: Arctic pine tree", "Members can now chop down " + "" + "arctic pine trees" + "" + "."); + case 13: + return newstruct cs2func_script_990_struct(58, 12581, "Members: Eucalyptus tree", "Members can now chop down " + "" + "eucalyptus trees" + "" + "."); + case 14: + return newstruct cs2func_script_990_struct(60, 1515, "Yew tree", "You can now chop down " + "" + "yew trees" + "" + "."); + case 15: + return newstruct cs2func_script_990_struct(68, 15288, "Members: Choking ivy", "Members can now chop down " + "" + "choking ivy" + "" + "."); + case 16: + return newstruct cs2func_script_990_struct(75, 1513, "Members: Magic tree", "Members can now chop down " + "" + "magic trees" + "" + "."); + case 17: + return newstruct cs2func_script_990_struct(76, 21600, "Members: Blisterwood tree", "Members can now chop logs from the " + "" + "Blisterwood tree" + "" + "."); + case 18: + return newstruct cs2func_script_990_struct(80, 8794, "Members: Sawmill training", "Members can now participate in " + "" + "sawmill training" + "" + "."); + case 19: + return newstruct cs2func_script_990_struct(82, 13567, "Members: Cursed magic tree" + "
" + " (after Spirit of Summer)", "Members now have the Woodcutting level required to chop down " + "" + "cursed magic trees" + "" + " (after Spirit of Summer)."); + case 20: + return newstruct cs2func_script_990_struct(83, 21349, "Members: Straight root", "Members can now chop down " + "" + "straight roots" + "" + " in the jadinko lair."); + case 21: + return newstruct cs2func_script_990_struct(83, 21350, "Members: Curly root", "Members can now chop down " + "" + "curly roots" + "" + " in the jadinko lair."); + case 22: + return newstruct cs2func_script_990_struct(83, 21369, "Members: Mutated root", "Members can now chop down " + "" + "mutated roots" + "" + " in the jadinko lair."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_990_struct(1, 21340, "Members: Dwarven Army Axe", "Members can now use a " + "" + "Dwarven Army Axe" + "" + "."); + case 1: + return newstruct cs2func_script_990_struct(1, 1351, "Bronze hatchet", "You can now use " + "" + "bronze hatchets" + "" + "."); + case 2: + return newstruct cs2func_script_990_struct(1, 1349, "Iron hatchet", "You can now use " + "" + "iron hatchets" + "" + "."); + case 3: + return newstruct cs2func_script_990_struct(6, 1353, "Steel hatchet", "You can now use " + "" + "steel hatchets" + "" + "."); + case 4: + return newstruct cs2func_script_990_struct(6, 1361, "Black hatchet", "You can now use " + "" + "black hatchets" + "" + "."); + case 5: + return newstruct cs2func_script_990_struct(21, 1355, "Mithril hatchet", "You can now use " + "" + "mithril hatchets" + "" + "."); + case 6: + return newstruct cs2func_script_990_struct(31, 1357, "Adamant hatchet", "You can now use " + "" + "adamant hatchets" + "" + "."); + case 7: + return newstruct cs2func_script_990_struct(40, 14108, "Members: Sacred clay hatchet", "Members can now use " + "" + "sacred clay hatchets" + ""); + case 8: + return newstruct cs2func_script_990_struct(40, 14100, "Members: Volatile hatchet", "Members can now use " + "" + "volatile hatchets" + ""); + case 9: + return newstruct cs2func_script_990_struct(41, 1359, "Rune hatchet", "You can now use " + "" + "rune hatchets" + "" + "."); + case 10: + return newstruct cs2func_script_990_struct(61, 6739, "Members: Dragon hatchet", "Members can now use " + "" + "dragon hatchets" + "" + "."); + case 11: + return newstruct cs2func_script_990_struct(61, 13661, "Members: Inferno Adze" + "
" + " (after All Fired Up, with 92 Firemaking)", "Members can now use the " + "" + "Inferno Adze" + "" + " to chop down trees (after All Fired Up and with level 92 Firemaking)."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_990_struct(12, 7414, "Log canoe", "You can now make " + "" + "log canoes" + "" + "."); + case 1: + return newstruct cs2func_script_990_struct(27, 7414, "Dugout canoe", "You can now make " + "" + "dugout canoes" + "" + "."); + case 2: + return newstruct cs2func_script_990_struct(42, 7414, "Stable dugout canoe", "You can now make " + "" + "stable dugout canoes" + "" + "."); + case 3: + return newstruct cs2func_script_990_struct(57, 7414, "Waka canoe", "You can now make " + "" + "waka canoes" + "" + "."); + } + break; + case 3: + if (((boolean)arg1)) { + return newstruct cs2func_script_990_struct(44, 10939, "Lumberjack clothing", "Members can now wear the " + "" + "undead lumberjack" + "" + " clothing."); + } + if (((boolean)arg1)) { + return newstruct cs2func_script_990_struct(54, 10826, "Fremennik round shield", "Members can now make " + "" + "Fremennik round shields" + "" + "."); + } + if (arg1 == 2) { + return newstruct cs2func_script_990_struct(54, 10812, "Split arctic pine logs", "Members can now split " + "" + "arctic pine logs" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_990_struct(91, 18778, "Members: Starved ancient effigies", "Members can now investigate " + "" + "starved ancient effigies" + "" + " using their knowledge of Woodcutting."); + case 1: + return newstruct cs2func_script_990_struct(93, 18779, "Members: Nourished ancient effigies", "Members can now investigate " + "" + "nourished ancient effigies" + "" + " using their knowledge of Woodcutting."); + case 2: + return newstruct cs2func_script_990_struct(95, 18780, "Members: Sated ancient effigies", "Members can now investigate " + "" + "sated ancient effigies" + "" + " using their knowledge of Woodcutting."); + case 3: + return newstruct cs2func_script_990_struct(97, 18781, "Members: Gorged ancient effigies", "Members can now investigate " + "" + "gorged ancient effigies" + "" + " using their knowledge of Woodcutting."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_990_struct(1, 14667, "Chop basic evil tree", "Members can now chop " + "" + "basic evil trees" + ""); + case 1: + return newstruct cs2func_script_990_struct(1, 14132, "Stealing Creation - class 1 hatchet", "Members can now use " + "" + "class 1 hatchets" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_990_struct(15, 14667, "Chop evil oak tree", "Members can now chop " + "" + "evil oak trees" + ""); + case 3: + return newstruct cs2func_script_990_struct(20, 14184, "Stealing Creation - woodcut class 2 sacred clay", "Members can now woodcut " + "" + "class 2 sacred clay" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_990_struct(20, 14134, "Stealing Creation - class 2 hatchet", "Members can now use " + "" + "class 2 hatchets" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_990_struct(30, 14667, "Chop evil willow tree", "Members can now chop " + "" + "evil willow trees" + ""); + case 6: + return newstruct cs2func_script_990_struct(40, 14186, "Stealing Creation - woodcut class 3 sacred clay", "Members can now woodcut " + "" + "class 3 sacred clay" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_990_struct(40, 14136, "Stealing Creation - class 3 hatchet", "Members can now use " + "" + "class 3 hatchets" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_990_struct(45, 14667, "Chop evil maple tree", "Members can now chop " + "" + "evil maple trees" + ""); + case 9: + return newstruct cs2func_script_990_struct(60, 14667, "Chop evil yew tree", "Members can now chop " + "" + "evil yew trees" + ""); + case 10: + return newstruct cs2func_script_990_struct(60, 14188, "Stealing Creation - woodcut class 4 sacred clay", "Members can now woodcut " + "" + "class 4 sacred clay" + "" + " in Stealing Creation."); + case 11: + return newstruct cs2func_script_990_struct(60, 14138, "Stealing Creation - class 4 hatchet", "Members can now use " + "" + "class 4 hatchets" + "" + " in Stealing Creation."); + case 12: + return newstruct cs2func_script_990_struct(75, 14667, "Chop evil magic tree", "Members can now chop " + "" + "evil magic trees" + ""); + case 13: + return newstruct cs2func_script_990_struct(80, 14190, "Stealing Creation - woodcut class 5 sacred clay", "Members can now woodcut " + "" + "class 5 sacred clay" + "" + " in Stealing Creation."); + case 14: + return newstruct cs2func_script_990_struct(80, 14140, "Stealing Creation - class 5 hatchet", "Members can now use " + "" + "class 5 hatchets" + "" + " in Stealing Creation."); + case 15: + return newstruct cs2func_script_990_struct(85, 14667, "Chop elder evil tree", "Members can now chop " + "" + "elder evil trees" + ""); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_990_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Woodcutting level increases, you will be able to attempt higher-level woodcutting tasks within Daemonheim. You will also be more likely to succeed when attempting woodcutting tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_990_struct(1, 17682, "Tangle gum tree (Tier 1)", "You can now chop down " + "" + "tangle gum trees" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_990_struct(1, 16361, "Novite hatchet (Tier 1)", "You can now use " + "" + "novite hatchets" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_990_struct(10, 17684, "Seeping elm tree (Tier 2)", "You can now chop " + "" + "seeping elm trees" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_990_struct(10, 16363, "Bathus hatchet (Tier 2)", "You can now use " + "" + "bathus hatchets" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_990_struct(20, 17686, "Blood spindle tree (Tier 3)", "You can now chop down " + "" + "blood spindle trees" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_990_struct(20, 16365, "Marmaros hatchet (Tier 3)", "You can now use " + "" + "marmaros hatchets" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_990_struct(30, 17688, "Utuku tree (Tier 4)", "You can now chop down " + "" + "utuku trees" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_990_struct(30, 16367, "Kratonite hatchet (Tier 4)", "You can now use " + "" + "kratonite hatchets" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_990_struct(40, 17690, "Spinebeam tree (Tier 5)", "You can now chop down " + "" + "spinebeam trees" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_990_struct(40, 16369, "Fractite hatchet (Tier 5)", "You can now use " + "" + "fractite hatchets" + "" + " within Daemonheim."); + case 11: + return newstruct cs2func_script_990_struct(50, 17692, "Members: Bovistrangler tree (Tier 6)", "Members can now chop down " + "" + "bovistrangler trees" + "" + " within Daemonheim."); + case 12: + return newstruct cs2func_script_990_struct(50, 16371, "Members: Zephyrium hatchet (Tier 6)", "Members can now use " + "" + "zephyrium hatchets" + "" + " within Daemonheim."); + case 13: + return newstruct cs2func_script_990_struct(60, 17694, "Members: Thigat tree (Tier 7)", "Members can now chop down " + "" + "thigat trees" + "" + " within Daemonheim."); + case 14: + return newstruct cs2func_script_990_struct(60, 16373, "Members: Argonite hatchet (Tier 7)", "Members can now use " + "" + "argonite hatchets" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_990_struct(70, 17696, "Members: Corpsethorn tree (Tier 8)", "Members can now chop down " + "" + "corpsethorn trees" + "" + " within Daemonheim."); + case 16: + return newstruct cs2func_script_990_struct(70, 16375, "Members: Katagon hatchet (Tier 8)", "Members can now use " + "" + "katagon hatchets" + "" + " within Daemonheim."); + case 17: + return newstruct cs2func_script_990_struct(80, 17698, "Members: Entgallow tree (Tier 9)", "Members can now chop down " + "" + "entgallow trees" + "" + " within Daemonheim."); + case 18: + return newstruct cs2func_script_990_struct(80, 16377, "Members: Gorgonite hatchet (Tier 9)", "Members can now use " + "" + "gorgonite hatchets" + "" + " within Daemonheim."); + case 19: + return newstruct cs2func_script_990_struct(90, 17700, "Members: Grave creeper tree (Tier 10)", "Members can now chop down " + "" + "grave creeper trees" + "" + " within Daemonheim."); + case 20: + return newstruct cs2func_script_990_struct(90, 16379, "Members: Promethium hatchet (Tier 10)", "Members can now use " + "" + "promethium hatchets" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_990_struct(99, 16381, "Members: Primal hatchet (Tier 11)", "Members can now use primal hatchets" + "" + " within Daemonheim."); + } + break; + case 7: + if (((boolean)arg1)) { + return newstruct cs2func_script_990_struct(99, 9807, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Woodcutting" + "" + ". Members can visit " + "" + "Wilfred" + "" + ", just to the north of " + "" + "Falador" + "" + ". He has something special that is only available to true masters of the " + "" + "Woodcutting" + "" + " skill!"); + } + } + return newstruct cs2func_script_990_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/991.cs2 b/dumps/scripts/991.cs2 new file mode 100644 index 000000000..c34ce77b2 --- /dev/null +++ b/dumps/scripts/991.cs2 @@ -0,0 +1,23 @@ +cs2func_script_991_struct(1,1,0) script_991(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_991_struct(1, "Pickpocket"); + case 1: + return newstruct cs2func_script_991_struct(1, "Multiple Pickpocket"); + case 2: + return newstruct cs2func_script_991_struct(1, "Stalls"); + case 3: + return newstruct cs2func_script_991_struct(1, "Chests"); + case 4: + return newstruct cs2func_script_991_struct(1, "Miscellaneous"); + case 5: + return newstruct cs2func_script_991_struct(1, "Other"); + case 6: + return newstruct cs2func_script_991_struct(1, "Minigames"); + case 7: + return newstruct cs2func_script_991_struct(1, "Dungeoneering"); + case 8: + return newstruct cs2func_script_991_struct(1, "Milestones"); + } + return newstruct cs2func_script_991_struct(-1, ""); +} diff --git a/dumps/scripts/992.cs2 b/dumps/scripts/992.cs2 new file mode 100644 index 000000000..baa30836a --- /dev/null +++ b/dumps/scripts/992.cs2 @@ -0,0 +1,297 @@ +cs2func_script_992_struct(2,2,0) script_992(int arg0,int arg1) { + switch (arg0) { + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_992_struct(1, 3241, "Man", "You can now pickpocket " + "" + "men" + "" + " and " + "" + "women" + "" + "."); + case 1: + return newstruct cs2func_script_992_struct(10, 3243, "Farmer", "You can now pickpocket " + "" + "farmers" + "" + "."); + case 2: + return newstruct cs2func_script_992_struct(15, 4295, "Female H.A.M. follower", "You can now pickpocket " + "" + "female H.A.M. followers" + "" + "."); + case 3: + return newstruct cs2func_script_992_struct(20, 4297, "Male H.A.M. follower", "You can now pickpocket " + "" + "male H.A.M. followers" + "" + "."); + case 4: + return newstruct cs2func_script_992_struct(25, 3245, "Warrior", "You can now pickpocket " + "" + "warriors" + "" + "."); + case 5: + return newstruct cs2func_script_992_struct(32, 3247, "Rogue", "You can now pickpocket " + "" + "rogues" + "" + "."); + case 6: + return newstruct cs2func_script_992_struct(36, 10998, "Cave goblin", "You can now pickpocket " + "" + "cave goblins" + "" + "."); + case 7: + return newstruct cs2func_script_992_struct(38, 5068, "Master farmer", "You can now pickpocket " + "" + "master farmers" + "" + "."); + case 8: + return newstruct cs2func_script_992_struct(40, 3249, "Guard", "You can now pickpocket " + "" + "guards" + "" + "."); + case 9: + return newstruct cs2func_script_992_struct(45, 3686, "Fremennik citizen", "You can now pickpocket " + "" + "Fremennik citizens" + "" + "."); + case 10: + return newstruct cs2func_script_992_struct(45, 6782, "Bearded Pollnivnian bandit", "You can now pickpocket " + "" + "bearded Pollnivnian bandits" + "" + "."); + case 11: + return newstruct cs2func_script_992_struct(53, 4625, "Desert bandit", "You can now pickpocket " + "" + "desert bandits" + "" + "."); + case 12: + return newstruct cs2func_script_992_struct(55, 3251, "Knight", "You can now pickpocket " + "" + "knights" + "" + "."); + case 13: + return newstruct cs2func_script_992_struct(55, 6781, "Pollnivnian bandit", "You can now pickpocket " + "" + "Pollnivnian bandits" + "" + "."); + case 14: + return newstruct cs2func_script_992_struct(65, 3253, "Watchman", "You can now pickpocket " + "" + "watchmen" + "" + "."); + case 15: + return newstruct cs2func_script_992_struct(65, 6780, "Menaphite thug", "You can now pickpocket " + "" + "Menaphite thugs" + "" + "."); + case 16: + return newstruct cs2func_script_992_struct(70, 3255, "Paladin", "You can now pickpocket " + "" + "paladins" + "" + "."); + case 17: + return newstruct cs2func_script_992_struct(75, 3257, "Gnome", "You can now pickpocket " + "" + "gnomes" + "" + "."); + case 18: + return newstruct cs2func_script_992_struct(80, 3259, "Hero", "You can now pickpocket " + "" + "heroes" + "" + "."); + case 19: + return newstruct cs2func_script_992_struct(85, 6105, "Elf", "You can now pickpocket " + "" + "elves" + "" + "."); + case 20: + return newstruct cs2func_script_992_struct(90, 15258, "Dwarf trader", "You can now pickpocket " + "" + "dwarven traders" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_992_struct(11, 3241, "Possibility of stealing double loot from a man", "You now have the Thieving level required to potentially steal double loot from " + "" + "men" + "" + " and " + "" + "women" + "" + "."); + case 1: + return newstruct cs2func_script_992_struct(20, 3243, "Possibility of stealing double loot from a farmer" + "
" + " (with 10 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "farmers" + "" + ". (You also need level 10 Agility.)"); + case 2: + return newstruct cs2func_script_992_struct(21, 3241, "Possibility of stealing triple loot from a man" + "
" + " (with 11 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "men" + "" + " and " + "" + "women" + "" + ". (You also need level 11 Agility.)"); + case 3: + return newstruct cs2func_script_992_struct(25, 4295, "Possibility of stealing double loot from a female H.A.M. follower" + "
" + " (with 15 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "female H.A.M. followers" + "" + ". (You also need level 15 Agility.)"); + case 4: + return newstruct cs2func_script_992_struct(30, 3243, "Possibility of stealing triple loot from a farmer" + "
" + " (with 20 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "farmers" + "" + ". (You also need level 20 Agility.)"); + case 5: + return newstruct cs2func_script_992_struct(30, 4297, "Possibility of stealing double loot from a male H.A.M. follower" + "
" + " (with 20 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "male H.A.M. followers" + "" + ". (You also need level 20 Agility.)"); + case 6: + return newstruct cs2func_script_992_struct(31, 3241, "Possibility of stealing quadruple loot from a man" + "
" + " (with 21 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "men" + "" + " and " + "" + "women" + "" + ". (You also need level 21 Agility.)"); + case 7: + return newstruct cs2func_script_992_struct(35, 4295, "Possibility of stealing triple loot from a female H.A.M. follower" + "
" + " (with 25 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "female H.A.M. followers" + "" + ". (You also need level 25 Agility.)"); + case 8: + return newstruct cs2func_script_992_struct(35, 3245, "Possibility of stealing double loot from a warrior" + "
" + " (with 25 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "warriors" + "" + ". (You also need level 25 Agility.)"); + case 9: + return newstruct cs2func_script_992_struct(40, 3243, "Possibility of stealing quadruple loot from a farmer" + "
" + " (with 30 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "farmers" + "" + ". (You also need level 30 Agility.)"); + case 10: + return newstruct cs2func_script_992_struct(40, 4297, "Possibility of stealing triple loot from a male H.A.M. follower" + "
" + " (with 30 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "male H.A.M. followers" + "" + ". (You also need level 30 Agility.)"); + case 11: + return newstruct cs2func_script_992_struct(42, 3247, "Possibility of stealing double loot from a rogue" + "
" + " (with 32 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "rogues" + "" + ". (You also need level 32 Agility.)"); + case 12: + return newstruct cs2func_script_992_struct(45, 4295, "Possibility of stealing quadruple loot from a female H.A.M. follower" + "
" + " (with 35 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "female H.A.M. followers" + "" + ". (You also need level 35 Agility.)"); + case 13: + return newstruct cs2func_script_992_struct(45, 3245, "Possibility of stealing triple loot from a warrior" + "
" + " (with 35 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "warriors" + "" + ". (You also need level 35 Agility.)"); + case 14: + return newstruct cs2func_script_992_struct(46, 10998, "Possibility of stealing double loot from a cave goblin" + "
" + " (with 36 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "cave goblins" + "" + ". (You also need level 36 Agility.)"); + case 15: + return newstruct cs2func_script_992_struct(48, 5068, "Possibility of stealing double loot from a master farmer" + "
" + " (with 38 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "master farmers" + "" + ". (You also need level 38 Agility.)"); + case 16: + return newstruct cs2func_script_992_struct(50, 4297, "Possibility of stealing quadruple loot from a male H.A.M. follower" + "
" + " (with 40 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "male H.A.M. followers" + "" + ". (You also need level 40 Agility.)"); + case 17: + return newstruct cs2func_script_992_struct(50, 3249, "Possibility of stealing double loot from a guard" + "
" + " (with 40 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "guards" + "" + ". (You also need level 40 Agility.)"); + case 18: + return newstruct cs2func_script_992_struct(52, 3247, "Possibility of stealing triple loot from a rogue" + "
" + " (with 42 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "rogues" + "" + ". (You also need level 42 Agility.)"); + case 19: + return newstruct cs2func_script_992_struct(55, 3245, "Possibility of stealing quadruple loot from a warrior" + "
" + " (with 45 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "warriors" + "" + ". (You also need level 45 Agility.)"); + case 20: + return newstruct cs2func_script_992_struct(55, 3686, "Possibility of stealing double loot from a Fremennik citizen" + "
" + " (with 45 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "Fremennik citizens" + "" + ". (You also need level 45 Agility.)"); + case 21: + return newstruct cs2func_script_992_struct(55, 6782, "Possibility of stealing double loot from a bearded Pollnivnian bandit" + "
" + " (with 45 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "bearded Pollnivnian bandits" + "" + ". (You also need level 45 Agility.)"); + case 22: + return newstruct cs2func_script_992_struct(56, 10998, "Possibility of stealing triple loot from a cave goblin" + "
" + " (with 46 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "cave goblins" + "" + ". (You also need level 46 Agility.)"); + case 23: + return newstruct cs2func_script_992_struct(58, 5068, "Possibility of stealing triple loot from a master farmer" + "
" + " (with 48 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "master farmers" + "" + ". (You also need level 48 Agility.)"); + case 24: + return newstruct cs2func_script_992_struct(60, 3249, "Possibility of stealing triple loot from a guard" + "
" + " (with 50 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "guards" + "" + ". (You also need level 50 Agility.)"); + case 25: + return newstruct cs2func_script_992_struct(62, 3247, "Possibility of stealing quadruple loot from a rogue" + "
" + " (with 52 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "rogues" + "" + ". (You also need level 52 Agility.)"); + case 26: + return newstruct cs2func_script_992_struct(63, 4625, "Possibility of stealing double loot from a desert bandit" + "
" + " (with 53 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "desert bandits" + "" + ". (You also need level 53 Agility.)"); + case 27: + return newstruct cs2func_script_992_struct(65, 3686, "Possibility of stealing triple loot from a Fremennik citizen" + "
" + " (with 55 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "Fremennik citizens" + "" + ". (You also need level 55 Agility.)"); + case 28: + return newstruct cs2func_script_992_struct(65, 6782, "Possibility of stealing triple loot from a bearded Pollnivnian bandit" + "
" + " (with 55 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "bearded Pollnivnian bandits" + "" + ". (You also need level 55 Agility.)"); + case 29: + return newstruct cs2func_script_992_struct(65, 3251, "Possibility of stealing double loot from a knight" + "
" + " (with 55 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "knights" + "" + ". (You also need level 55 Agility.)"); + case 30: + return newstruct cs2func_script_992_struct(65, 6781, "Possibility of stealing double loot from a Pollnivnian bandit" + "
" + " (with 55 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "Pollnivnian bandits" + "" + ". (You also need level 55 Agility.)"); + case 31: + return newstruct cs2func_script_992_struct(66, 10998, "Possibility of stealing quadruple loot from a cave goblin" + "
" + " (with 56 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "cave goblins" + "" + ". (You also need level 56 Agility.)"); + case 32: + return newstruct cs2func_script_992_struct(68, 5068, "Possibility of stealing quadruple loot from a master farmer" + "
" + " (with 58 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "master farmers" + "" + ". (You also need level 58 Agility.)"); + case 33: + return newstruct cs2func_script_992_struct(70, 3249, "Possibility of stealing quadruple loot from a guard" + "
" + " (with 60 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "guards" + "" + ". (You also need level 60 Agility.)"); + case 34: + return newstruct cs2func_script_992_struct(73, 4625, "Possibility of stealing triple loot from a desert bandit" + "
" + " (with 63 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "desert bandits" + "" + ". (You also need level 63 Agility.)"); + case 35: + return newstruct cs2func_script_992_struct(75, 3686, "Possibility of stealing quadruple loot from a Fremennik citizen" + "
" + " (with 65 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "Fremennik citizens" + "" + ". (You also need level 65 Agility.)"); + case 36: + return newstruct cs2func_script_992_struct(75, 6782, "Possibility of stealing quadruple loot from a bearded Pollnivnian bandit" + "
" + " (with 65 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "bearded Pollnivnian bandits" + "" + ". (You also need level 65 Agility.)"); + case 37: + return newstruct cs2func_script_992_struct(75, 3251, "Possibility of stealing triple loot from a knight" + "
" + " (with 65 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "knights" + "" + ". (You also need level 65 Agility.)"); + case 38: + return newstruct cs2func_script_992_struct(75, 6781, "Possibility of stealing triple loot from a Pollnivnian bandit" + "
" + " (with 65 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "Pollnivnian bandits" + "" + ". (You also need level 65 Agility.)"); + case 39: + return newstruct cs2func_script_992_struct(75, 3253, "Possibility of stealing double loot from a watchman" + "
" + " (with 65 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "watchmen" + "" + ". (You also need level 65 Agility.)"); + case 40: + return newstruct cs2func_script_992_struct(75, 6780, "Possibility of stealing double loot from a Menaphite thug" + "
" + " (with 65 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "Menaphite thugs" + "" + ". (You also need level 65 Agility.)"); + case 41: + return newstruct cs2func_script_992_struct(80, 3255, "Possibility of stealing double loot from a paladin" + "
" + " (with 70 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "paladins" + "" + ". (You also need level 70 Agility.)"); + case 42: + return newstruct cs2func_script_992_struct(83, 4625, "Possibility of stealing quadruple loot from a desert bandit" + "
" + " (with 73 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "desert bandits" + "" + ". (You also need level 73 Agility.)"); + case 43: + return newstruct cs2func_script_992_struct(85, 3251, "Possibility of stealing quadruple loot from a knight" + "
" + " (with 75 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "knights" + "" + ". (You also need level 75 Agility.)"); + case 44: + return newstruct cs2func_script_992_struct(85, 6781, "Possibility of stealing quadruple loot from a Pollnivnian bandit" + "
" + " (with 75 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "Pollnivnian bandits" + "" + ". (You also need level 75 Agility.)"); + case 45: + return newstruct cs2func_script_992_struct(85, 3253, "Possibility of stealing triple loot from a watchman" + "
" + " (with 75 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "watchmen" + "" + ". (You also need level 75 Agility.)"); + case 46: + return newstruct cs2func_script_992_struct(85, 6780, "Possibility of stealing triple loot from a Menaphite thug" + "
" + " (with 75 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "Menaphite thugs" + "" + ". (You also need level 75 Agility.)"); + case 47: + return newstruct cs2func_script_992_struct(85, 3257, "Possibility of stealing double loot from a gnome" + "
" + " (with 75 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "gnomes" + "" + ". (You also need level 75 Agility.)"); + case 48: + return newstruct cs2func_script_992_struct(90, 3255, "Possibility of stealing triple loot from a paladin" + "
" + " (with 80 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "paladins" + "" + ". (You also need level 80 Agility.)"); + case 49: + return newstruct cs2func_script_992_struct(90, 3259, "Possibility of stealing double loot from a hero" + "
" + " (with 80 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "heroes" + "" + ". (You also need level 80 Agility.)"); + case 50: + return newstruct cs2func_script_992_struct(95, 3253, "Possibility of stealing quadruple loot from a watchman" + "
" + " (with 85 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "watchmen" + "" + ". (You also need level 85 Agility.)"); + case 51: + return newstruct cs2func_script_992_struct(95, 6780, "Possibility of stealing quadruple loot from a Menaphite thug" + "
" + " (with 85 Agility)", "You now have the Thieving level required to potentially steal quadruple loot from " + "" + "Menaphite thugs" + "" + ". (You also need level 85 Agility.)"); + case 52: + return newstruct cs2func_script_992_struct(95, 3257, "Possibility of stealing triple loot from a gnome" + "
" + " (with 85 Agility)", "You now have the Thieving level required to potentially steal triple loot from " + "" + "gnomes" + "" + ". (You also need level 85 Agility.)"); + case 53: + return newstruct cs2func_script_992_struct(95, 6105, "Possibility of stealing double loot from an elf" + "
" + " (with 85 Agility)", "You now have the Thieving level required to potentially steal double loot from " + "" + "elves" + "" + ". (You also need level 85 Agility.)"); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_992_struct(2, 1965, "Vegetable stall" + "
" + " (after Fremennik Trials)", "You now have the Thieving level required to steal from " + "" + "vegetable stalls" + "" + " (after Fremennik Trials)."); + case 1: + return newstruct cs2func_script_992_struct(5, 1891, "Baker's stall", "You can now steal from " + "" + "bakers' stalls" + "" + "."); + case 2: + return newstruct cs2func_script_992_struct(5, 1933, "Ape Atoll general stall" + "
" + " (after starting Monkey Madness)", "You now have the Thieving level required to steal from the " + "" + "general stall" + "" + " on Ape Atoll (after starting Monkey Madness)."); + case 3: + return newstruct cs2func_script_992_struct(5, 1978, "Tea stall", "You can now steal from " + "" + "tea stalls" + "" + "."); + case 4: + return newstruct cs2func_script_992_struct(5, 1755, "Crafting stall", "You can now steal from the " + "" + "crafting stalls" + "" + " in Keldagrim and, after starting Monkey Madness, the Ape Atoll."); + case 5: + return newstruct cs2func_script_992_struct(5, 1963, "Monkey food stall" + "
" + " (after starting Monkey Madness)", "You now have the Thieving level required to steal from the " + "" + "monkey food stall" + "" + " (after starting Monkey Madness)."); + case 6: + return newstruct cs2func_script_992_struct(15, 2379, "Rock cake stall", "You can now steal from " + "" + "rock cake stalls" + "" + "."); + case 7: + return newstruct cs2func_script_992_struct(20, 950, "Silk stall", "You can now steal from " + "" + "silk stalls" + "" + "."); + case 8: + return newstruct cs2func_script_992_struct(22, 7919, "Wine stall", "You can now steal from " + "" + "wine stalls" + "" + "."); + case 9: + return newstruct cs2func_script_992_struct(27, 5171, "Seed stall", "You can now steal from " + "" + "seed stalls" + "" + "."); + case 10: + return newstruct cs2func_script_992_struct(35, 948, "Fur stall", "You can now steal from " + "" + "fur stalls" + "" + "."); + case 11: + return newstruct cs2func_script_992_struct(42, 331, "Fish stall", "You can now steal from " + "" + "fish stalls" + "" + "."); + case 12: + return newstruct cs2func_script_992_struct(49, 9174, "Crossbow stall", "You can now steal from " + "" + "crossbow stalls" + "" + "."); + case 13: + return newstruct cs2func_script_992_struct(50, 442, "Silver stall", "You can now steal from " + "" + "silver stalls" + "" + "."); + case 14: + return newstruct cs2func_script_992_struct(63, 2773, "Customs evidence files" + "
" + " (after Rocking Out)", "You now have the Thieving level to steal from the " + "" + "customs evidence files" + "" + " of " + "" + "Rock Island Prison" + "" + " (after Rocking Out)."); + case 15: + return newstruct cs2func_script_992_struct(65, 556, "Magic stall", "You can now steal from " + "" + "magic stalls" + "" + "."); + case 16: + return newstruct cs2func_script_992_struct(65, 1323, "Scimitar stall", "You can now steal from " + "" + "scimitar stalls" + "" + "."); + case 17: + return newstruct cs2func_script_992_struct(65, 2007, "Spice stall", "You can now steal from " + "" + "spice stalls" + "" + "."); + case 18: + return newstruct cs2func_script_992_struct(75, 1607, "Gem stall", "You can now steal from " + "" + "gem stalls" + "" + "."); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_992_struct(13, 1001, "Ardougne, Rellekka and the Wilderness", "You can now steal from certain " + "" + "chests" + "" + " in " + "" + "Ardougne" + "" + ", " + "" + "Rellekka" + "" + " and the " + "" + "Wilderness" + "" + "."); + case 1: + return newstruct cs2func_script_992_struct(28, 561, "Upstairs in Ardougne and Rellekka", "You can now steal from certain " + "" + "chests" + "" + " upstairs in " + "" + "Ardougne" + "" + " and " + "" + "Rellekka" + "" + "."); + case 2: + return newstruct cs2func_script_992_struct(43, 1001, "Upstairs in Ardougne", "You can now steal from certain " + "" + "chests" + "" + " upstairs in " + "" + "Ardougne" + "" + "."); + case 3: + return newstruct cs2func_script_992_struct(47, 41, "Hemenster", "You can now steal from certain " + "" + "chests" + "" + " in " + "" + "Hemenster" + "" + "."); + case 4: + return newstruct cs2func_script_992_struct(47, 1001, "Rellekka", "You can now steal from certain " + "" + "chests" + "" + " in " + "" + "Rellekka" + "" + "."); + case 5: + return newstruct cs2func_script_992_struct(52, 4522, "Dorgesh-Kaan (average chests)", "You can now steal from " + "" + "average chests" + "" + " in " + "" + "Dorgesh-Kaan" + "" + "."); + case 6: + return newstruct cs2func_script_992_struct(59, 565, "Chaos Druid Tower, north of Ardougne", "You can now steal from " + "" + "chests" + "" + " in the " + "" + "Chaos Druid Tower" + "" + ", north of " + "" + "Ardougne" + "" + "."); + case 7: + return newstruct cs2func_script_992_struct(72, 383, "King Lathas's castle in Ardougne", "You can now steal from " + "" + "chests" + "" + " in " + "" + "King Lathas's castle" + "" + " in " + "" + "Ardougne" + "" + "."); + case 8: + return newstruct cs2func_script_992_struct(78, 1623, "Dorgesh-Kaan (rich chests)", "You can now steal from " + "" + "rich chests" + "" + " in " + "" + "Dorgesh-Kaan" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_992_struct(15, 10593, "Cowbells from dairy cows (after starting Cold War)", "You now have the Thieving level required to steal " + "" + "cowbells" + "" + " from " + "" + "dairy cows" + "" + " (after starting Cold War)."); + case 1: + return newstruct cs2func_script_992_struct(20, 4834, "Zogre coffins at Jiggig", "You can now pick locks in " + "" + "zogre coffins" + "" + " at " + "" + "Jiggig" + "" + "."); + case 2: + return newstruct cs2func_script_992_struct(21, 21534, "Black Ibis Gear" + "
" + " (from Pyramid Plunder)", "You now have the Thieving level required to wear " + "" + "Black Ibis clothing" + "" + " found in Pyramid Plunder."); + case 3: + return newstruct cs2func_script_992_struct(30, 4599, "Blackjack lure and knockout" + "
" + " (after starting The Feud)", "Members now have the Thieving level required to use a " + "" + "blackjack" + "" + " to lure and knockout a target (after starting The Feud)."); + case 4: + return newstruct cs2func_script_992_struct(44, 10981, "Wire from the Dorgeshuun wire machine.", "You can now steal " + "" + "wire" + "" + " from the " + "" + "Dorgeshuun wire machine" + "" + "."); + case 5: + return newstruct cs2func_script_992_struct(82, 1523, "Pick lock to enter Agility Dungeon from Yanille", "You can now use your lock-picking skills to access the " + "" + "Agility Dungeon" + "" + " from " + "" + "Yanille" + "" + "."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_992_struct(91, 18778, "Starved ancient effigies", "You can now investigate " + "" + "starved ancient effigies" + "" + " using your knowledge of Thieving."); + case 1: + return newstruct cs2func_script_992_struct(93, 18779, "Nourished ancient effigies", "You can now investigate " + "" + "nourished ancient effigies" + "" + " using your knowledge of Thieving."); + case 2: + return newstruct cs2func_script_992_struct(95, 18780, "Sated ancient effigies", "You can now investigate " + "" + "sated ancient effigies" + "" + " using your knowledge of Thieving."); + case 3: + return newstruct cs2func_script_992_struct(97, 18781, "Gorged ancient effigies", "You can now investigate " + "" + "gorged ancient effigies" + "" + " using your knowledge of Thieving."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_992_struct(-1, 7620, "In Stealing Creation, you can pickpocket players 20 levels above your own.", ""); + case 1: + return newstruct cs2func_script_992_struct(1, 10855, "Sorceress's Garden - Winter", "You can now enter the " + "" + "winter garden" + "" + " in " + "" + "Sorceress's Garden" + "" + "."); + case 2: + return newstruct cs2func_script_992_struct(21, 9026, "Pyramid Plunder - Room 1", "You can now enter the " + "" + "first chamber" + "" + " of the " + "" + "Pyramid of Jalsavrah" + "" + " in " + "" + "Pyramid Plunder" + "" + "."); + case 3: + return newstruct cs2func_script_992_struct(25, 10853, "Sorceress's Garden - Spring", "You can now enter the " + "" + "spring garden" + "" + " in " + "" + "Sorceress's Garden" + "" + "."); + case 4: + return newstruct cs2func_script_992_struct(31, 9032, "Pyramid Plunder - Room 2", "You can now enter the " + "" + "second chamber" + "" + " of the " + "" + "Pyramid of Jalsavrah" + "" + " in " + "" + "Pyramid Plunder" + "" + "."); + case 5: + return newstruct cs2func_script_992_struct(41, 9036, "Pyramid Plunder - Room 3", "You can now enter the " + "" + "third chamber" + "" + " of the " + "" + "Pyramid of Jalsavrah" + "" + " in " + "" + "Pyramid Plunder" + "" + "."); + case 6: + return newstruct cs2func_script_992_struct(45, 10854, "Sorceress's Garden - Autumn", "You can now enter the " + "" + "autumn garden" + "" + " in " + "" + "Sorceress's Garden" + "" + "."); + case 7: + return newstruct cs2func_script_992_struct(50, 5559, "Rogues' Den" + "
" + " (with 50 Agility)", "You now have the Thieving level required to attempt the " + "" + "Rogues' Den" + "" + ", located below the Toad and Chicken in " + "" + "Burthorpe" + "" + ". (You also need level 50 Agility.)"); + case 8: + return newstruct cs2func_script_992_struct(51, 9042, "Pyramid Plunder - Room 4", "You can now enter the " + "" + "fourth chamber" + "" + " of the " + "" + "Pyramid of Jalsavrah" + "" + " in " + "" + "Pyramid Plunder" + "" + "."); + case 9: + return newstruct cs2func_script_992_struct(61, 9038, "Pyramid Plunder - Room 5", "You can now enter the " + "" + "fifth chamber" + "" + " of the " + "" + "Pyramid of Jalsavrah" + "" + " in " + "" + "Pyramid Plunder" + "" + "."); + case 10: + return newstruct cs2func_script_992_struct(65, 10852, "Sorceress's Garden - Summer", "You can now enter the " + "" + "summer garden" + "" + " in " + "" + "Sorceress's Garden" + "" + "."); + case 11: + return newstruct cs2func_script_992_struct(71, 9040, "Pyramid Plunder - Room 6", "You can now enter the " + "" + "sixth chamber" + "" + " of the " + "" + "Pyramid of Jalsavrah" + "" + " in " + "" + "Pyramid Plunder" + "" + "."); + case 12: + return newstruct cs2func_script_992_struct(81, 9028, "Pyramid Plunder - Room 7", "You can now enter the " + "" + "seventh chamber" + "" + " of the " + "" + "Pyramid of Jalsavrah" + "" + " in " + "" + "Pyramid Plunder" + "" + "."); + case 13: + return newstruct cs2func_script_992_struct(91, 9034, "Pyramid Plunder - Room 8", "You can now enter the " + "" + "eighth chamber" + "" + " of the " + "" + "Pyramid of Jalsavrah" + "" + " in " + "" + "Pyramid Plunder" + "" + "."); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_992_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "
" + "As your Thieving level increases, you will be able to attempt higher-level Thieving tasks within Daemonheim." + "
" + "
" + "You will be more likely to succeed when attempting Thieving tasks within Daemonheim." + "
" + "
" + "You will also be able to open higher level " + "" + "locked chests" + "" + " within Daemonheim.", ""); + } + break; + case 8: + if (((boolean)arg1)) { + return newstruct cs2func_script_992_struct(99, 9777, "Skill mastery", "" + "Congratulations! You are now a master thief. Why not visit " + "" + "Martin Thwait" + "" + ", who runs a shop at the " + "" + "Rogues' Den" + "" + ". He has something special that is only available to true masters of the " + "" + "Thieving" + "" + " skill!"); + } + } + return newstruct cs2func_script_992_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/993.cs2 b/dumps/scripts/993.cs2 new file mode 100644 index 000000000..85aebdc15 --- /dev/null +++ b/dumps/scripts/993.cs2 @@ -0,0 +1,12 @@ +cs2func_script_993_struct(1,1,0) script_993(int arg0) { + if (((boolean)arg0)) { + return newstruct cs2func_script_993_struct(0, "Constitution"); + } + if (((boolean)arg0)) { + return newstruct cs2func_script_993_struct(0, "Armour"); + } + if (arg0 == 2) { + return newstruct cs2func_script_993_struct(0, "Milestones"); + } + return newstruct cs2func_script_993_struct(-1, ""); +} diff --git a/dumps/scripts/994.cs2 b/dumps/scripts/994.cs2 new file mode 100644 index 000000000..ae8ed6517 --- /dev/null +++ b/dumps/scripts/994.cs2 @@ -0,0 +1,78 @@ +cs2func_script_994_struct(2,2,0) script_994(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_994_struct(-1, 7620, "Your Constitution tells you how healthy your character can be. A character with low Constitution will only have a small number of life points when they're fully healed, whereas a character with high Constitution can have many more life points.", ""); + case 1: + return newstruct cs2func_script_994_struct(-1, 7620, "If you see any " + "" + "red 'hitsplats'" + "" + " during combat, the number shown corresponds to the number of life points lost as a result of that strike.", ""); + case 2: + return newstruct cs2func_script_994_struct(-1, 7620, "" + "Blue hitsplats" + "" + " mean no damage has been dealt.", ""); + case 3: + return newstruct cs2func_script_994_struct(-1, 7620, "" + "Green hitsplats" + "" + " are poison damage (members).", ""); + case 4: + return newstruct cs2func_script_994_struct(-1, 7620, "" + "Yellow hitsplats" + "" + " are disease damage (members).", ""); + case 5: + return newstruct cs2func_script_994_struct(-1, 7620, "" + "Pink hitsplats" + "" + " show life points restored through healing (while in Daemonheim).", ""); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_994_struct(35, 14936, "Members: Agile top (with 35 Defence)", "Members now have the Constitution level required to wear " + "" + "agile tops" + "" + ". (They also need level 35 Defence.)"); + case 1: + return newstruct cs2func_script_994_struct(35, 14938, "Members: Agile legs (with 35 Defence)", "Members now have the Constitution level required to wear " + "" + "agile legs" + "" + ". (They also need level 35 Defence.)"); + case 2: + return newstruct cs2func_script_994_struct(42, 11665, "Members: Void melee helm", "Members now have the Constitution level required to wear " + "" + "Void melee helms" + "" + "."); + case 3: + return newstruct cs2func_script_994_struct(42, 11664, "Members: Void ranger helm", "Members now have the Constitution level required to wear " + "" + "Void ranger helms" + "" + "."); + case 4: + return newstruct cs2func_script_994_struct(42, 11663, "Members: Void mage helm", "Members now have the Constitution level required to wear " + "" + "Void mage helms" + "" + "."); + case 5: + return newstruct cs2func_script_994_struct(42, 8839, "Members: Void knight top", "Members now have the Constitution level required to wear " + "" + "Void knight tops" + "" + "."); + case 6: + return newstruct cs2func_script_994_struct(42, 8840, "Members: Void knight robe", "Members now have the Constitution level required to wear " + "" + "Void knight robes" + "" + "."); + case 7: + return newstruct cs2func_script_994_struct(42, 8842, "Members: Void knight gloves", "Members now have the Constitution level required to wear " + "" + "Void knight gloves" + "" + "."); + case 8: + return newstruct cs2func_script_994_struct(42, 19712, "Members: Void knight deflector", "Members now have the Constitution level required to wear " + "" + "Void knight deflectors" + "" + "."); + case 9: + return newstruct cs2func_script_994_struct(42, 8841, "Members: Void knight mace", "Members now have the Constitution level required to wield " + "" + "Void knight maces" + "" + "."); + case 10: + return newstruct cs2func_script_994_struct(42, 7620, "Void knight equipment requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer.", "" + "Void knight equipment" + "" + " requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer."); + case 11: + return newstruct cs2func_script_994_struct(80, 20135, "Members: Torva full helm" + "
" + " (with 80 Strength and Defence)", "Members can now wear " + "" + "torva full helms" + "" + ". (They also need level 80 Strength and Defence)"); + case 12: + return newstruct cs2func_script_994_struct(80, 20139, "Members: Torva platebody" + "
" + " (with 80 Strength and Defence)", "Members can now wear " + "" + "torva platebodies" + "" + ". (They also need level 80 Strength and Defence)"); + case 13: + return newstruct cs2func_script_994_struct(80, 20143, "Members: Torva platelegs" + "
" + " (with 80 Strength and Defence)", "Members can now wear " + "" + "torva platelegs" + "" + ". (They also need level 80 Strength and Defence)"); + case 14: + return newstruct cs2func_script_994_struct(80, 20159, "Members: Virtus mask" + "
" + " (with 80 Magic and Defence)", "Members can now wear " + "" + "virtus masks" + "" + ". (They also need level 80 Magic and Defence)"); + case 15: + return newstruct cs2func_script_994_struct(80, 20163, "Members: Virtus robe top" + "
" + " (with 80 Magic and Defence)", "Members can now wear " + "" + "virtus robe tops" + "" + ". (They also need level 80 Magic and Defence)"); + case 16: + return newstruct cs2func_script_994_struct(80, 20167, "Members: Virtus robe legs" + "
" + " (with 80 Magic and Defence)", "Members can now wear " + "" + "virtus robe legs" + "" + ". (They also need level 80 Magic and Defence)"); + case 17: + return newstruct cs2func_script_994_struct(80, 20147, "Members: Pernix cowl" + "
" + " (with 80 Ranged and Defence)", "Members can now wear " + "" + "pernix cowls" + "" + ". (They also need level 80 Ranged and Defence)"); + case 18: + return newstruct cs2func_script_994_struct(80, 20151, "Members: Pernix body" + "
" + " (with 80 Ranged and Defence)", "Members can now wear " + "" + "pernix bodies" + "" + ". (They also need level 80 Ranged and Defence)"); + case 19: + return newstruct cs2func_script_994_struct(80, 20155, "Members: Pernix chaps" + "
" + " (with 80 Ranged and Defence)", "Members can now wear " + "" + "pernix chaps" + "" + ". (They also need level 80 Ranged and Defence)"); + } + break; + case 2: + SWITCH (arg1) { + case 0: + GOTO flow_32 + case 1: + GOTO flow_33 + } + break; + flow_32: + return newstruct cs2func_script_994_struct(70, 8122, "Members: Zamorak's Fortress in the God Wars Dungeon", "Members can now access the " + "" + "Zamorak Fortress" + "" + " in the " + "" + "God Wars Dungeon" + "" + "."); + flow_33: + return newstruct cs2func_script_994_struct(99, 9768, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Constitution" + "" + ". Members can visit " + "" + "Surgeon General Tafani" + "" + " at the " + "" + "Duel Arena Hospital" + "" + ". She has something special that is only available to true masters of the " + "" + "Constitution" + "" + " skill!"); + } + return newstruct cs2func_script_994_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/995.cs2 b/dumps/scripts/995.cs2 new file mode 100644 index 000000000..8ba0db855 --- /dev/null +++ b/dumps/scripts/995.cs2 @@ -0,0 +1,27 @@ +cs2func_script_995_struct(1,1,0) script_995(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_995_struct(0, "Normal Spells"); + case 1: + return newstruct cs2func_script_995_struct(1, "Ancient Magicks"); + case 2: + return newstruct cs2func_script_995_struct(1, "Lunar Spells"); + case 3: + return newstruct cs2func_script_995_struct(0, "Enchantment"); + case 4: + return newstruct cs2func_script_995_struct(0, "Armour"); + case 5: + return newstruct cs2func_script_995_struct(0, "Weapons"); + case 6: + return newstruct cs2func_script_995_struct(0, "Books and wands"); + case 7: + return newstruct cs2func_script_995_struct(1, "Salamanders"); + case 8: + return newstruct cs2func_script_995_struct(0, "Minigames"); + case 9: + return newstruct cs2func_script_995_struct(0, "Dungeoneering"); + case 10: + return newstruct cs2func_script_995_struct(0, "Milestones"); + } + return newstruct cs2func_script_995_struct(-1, ""); +} diff --git a/dumps/scripts/996.cs2 b/dumps/scripts/996.cs2 new file mode 100644 index 000000000..9d2aefdcf --- /dev/null +++ b/dumps/scripts/996.cs2 @@ -0,0 +1,624 @@ +cs2func_script_996_struct(2,2,0) script_996(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_996_struct(4, 9236, "Members: Opal-tipped bronze crossbow bolt", "Members can now enchant " + "" + "opal-tipped bronze crossbow bolts" + "" + "."); + case 1: + return newstruct cs2func_script_996_struct(7, 1607, "Sapphire items", "You can now enchant " + "" + "sapphire items" + "" + "."); + case 2: + return newstruct cs2func_script_996_struct(7, 9240, "Members: Sapphire-tipped mithril crossbow bolt", "Members can now enchant " + "" + "sapphire-tipped crossbow bolts" + "" + "."); + case 3: + return newstruct cs2func_script_996_struct(14, 9237, "Members: Jade-tipped blurite crossbow bolt", "Members can now enchant " + "" + "jade-tipped blurite crossbow bolts" + "" + "."); + case 4: + return newstruct cs2func_script_996_struct(24, 9238, "Members: Pearl-tipped iron crossbow bolt", "Members can now enchant " + "" + "pearl-tipped iron crossbow bolts" + "" + "."); + case 5: + return newstruct cs2func_script_996_struct(27, 1605, "Emerald items", "You can now enchant " + "" + "emerald items" + "" + "."); + case 6: + return newstruct cs2func_script_996_struct(27, 9241, "Members: Emerald-tipped mithril crossbow bolt", "Members can now enchant " + "" + "emerald-tipped mithril crossbow bolts" + "" + "."); + case 7: + return newstruct cs2func_script_996_struct(29, 9239, "Members: Red topaz-tipped steel crossbow bolt", "Members can now enchant " + "" + "red topaz-tipped steel crossbow bolts" + "" + "."); + case 8: + return newstruct cs2func_script_996_struct(49, 1603, "Ruby items", "You can now enchant " + "" + "ruby items" + "" + "."); + case 9: + return newstruct cs2func_script_996_struct(49, 9242, "Members: Ruby-tipped adamant crossbow bolt", "Members can now " + "" + "enchant ruby-tipped adamant crossbow bolts" + "" + "."); + case 10: + return newstruct cs2func_script_996_struct(56, 571, "Members: Charge water orbs", "Members can now charge " + "" + "water orbs" + "" + "."); + case 11: + return newstruct cs2func_script_996_struct(57, 1601, "Diamond items", "You can now enchant " + "" + "diamond items" + "" + "."); + case 12: + return newstruct cs2func_script_996_struct(57, 9243, "Members: Diamond-tipped adamant crossbow bolt", "Members can now enchant " + "" + "diamond-tipped adamant crossbow bolts" + "" + "."); + case 13: + return newstruct cs2func_script_996_struct(60, 575, "Members: Charge earth orbs", "Members can now charge " + "" + "earth orbs" + "" + "."); + case 14: + return newstruct cs2func_script_996_struct(63, 569, "Members: Charge fire orbs", "Members can now charge " + "" + "fire orbs" + "" + "."); + case 15: + return newstruct cs2func_script_996_struct(66, 573, "Members: Charge air orbs", "Members can now charge " + "" + "air orbs" + "" + "."); + case 16: + return newstruct cs2func_script_996_struct(68, 1615, "Members: Dragonstone items", "Members can now enchant " + "" + "dragonstone items" + "" + "."); + case 17: + return newstruct cs2func_script_996_struct(68, 9244, "Members: Dragonstone-tipped rune crossbow bolt", "Members can now enchant " + "" + "dragonstone-tipped rune crossbow bolts" + "" + "."); + case 18: + return newstruct cs2func_script_996_struct(87, 6573, "Members: Onyx items", "Members can now enchant " + "" + "onyx items" + "" + "."); + case 19: + return newstruct cs2func_script_996_struct(87, 9245, "Members: Onyx-tipped rune crossbow bolt", "Members can now enchant " + "" + "onyx-tipped rune crossbow bolts" + "" + "."); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_996_struct(1, 3755, "Members: Farseer helm" + "
" + " (after Fremennik Trials and with 45 Defence)", "Members now have the Magic level required to wear " + "" + "farseer helms" + "" + " (after Fremennik Trials)."); + case 1: + return newstruct cs2func_script_996_struct(1, 6153, "Members: Skeletal gloves", "Members can now wear " + "" + "skeletal gloves" + "" + "."); + case 2: + return newstruct cs2func_script_996_struct(1, 6147, "Members: Skeletal boots", "Members can now wear " + "" + "skeletal boots" + "" + "."); + case 3: + return newstruct cs2func_script_996_struct(20, 2579, "Members: Wizard boots", "Members can now wear " + "" + "wizard boots."); + case 4: + return newstruct cs2func_script_996_struct(20, 12964, "Combat hood" + "
" + " (with level 10 Defence)", "You now have the Magic level required to wear " + "" + "combat hoods" + "" + ". (You also need level 10 Defence.)"); + case 5: + return newstruct cs2func_script_996_struct(20, 12971, "Combat robe top" + "
" + " (with level 10 Defence)", "You now have the Magic level required to wear " + "" + "combat robe tops" + "" + ". (You also need level 10 Defence.)"); + case 6: + return newstruct cs2func_script_996_struct(20, 12978, "Combat robe bottom" + "
" + " (with level 10 Defence)", "You now have the Magic level required to wear " + "" + "combat robe bottoms" + "" + ". (You also need level 10 Defence.)"); + case 7: + return newstruct cs2func_script_996_struct(20, 12887, "Druidic mage hood" + "
" + " (with level 10 Defence)", "You now have the Magic level required to wear " + "" + "druidic mage hoods" + "" + ". (You also need level 10 Defence.)"); + case 8: + return newstruct cs2func_script_996_struct(20, 12894, "Druidic mage top" + "
" + " (with level 10 Defence)", "You now have the Magic level required to wear " + "" + "druidic mage tops" + "" + ". (You also need level 10 Defence.)"); + case 9: + return newstruct cs2func_script_996_struct(20, 12901, "Druidic mage bottom" + "
" + " (with level 10 Defence)", "You now have the Magic level required to wear " + "" + "druidic mage bottoms" + "" + ". (You also need level 10 Defence.)"); + case 10: + return newstruct cs2func_script_996_struct(20, 13938, "Members: Corrupt Zuriel's hood" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "corrupt Zuriel's hood" + "" + ". (They also need level 20 Defence.)"); + case 11: + return newstruct cs2func_script_996_struct(20, 13932, "Members: Corrupt Zuriel's robe top" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "corrupt Zuriel's robe top" + "" + ". (They also need level 20 Defence.)"); + case 12: + return newstruct cs2func_script_996_struct(20, 13935, "Members: Corrupt Zuriel's robe bottom" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "corrupt Zuriel's robe bottom" + "" + ". (They also need level 20 Defence.)"); + case 13: + return newstruct cs2func_script_996_struct(20, 15488, "Members: Hexcrest" + "
" + " (with 10 Defence)", "Members can now wear " + "" + "hexcrests" + "" + " (with 10 Defence)."); + case 14: + return newstruct cs2func_script_996_struct(20, 15492, "Members: Full Slayer helmet" + "
" + " (after Smoking Kills with 10 Defence, 20 Ranged and Strength)", "Members can now wear " + "" + "full slayer helmets" + "" + " (after Smoking Kills with 10 Defence, 20 Ranged and Strength)."); + case 15: + return newstruct cs2func_script_996_struct(20, 9733, "Members: Elemental mind equipment (After Elemental Workshop II and with level 30 Smithing)", "Members now have the Magic level required to wear " + "" + "Elemental mind equipment" + "" + ". (After Elemental Workshop II and with level 30 Smithing)"); + case 16: + return newstruct cs2func_script_996_struct(30, 18333, "Arcane pulse necklace" + "
" + " (with 30 Dungeoneering)", "You can now wear " + "" + "arcane pulse necklaces" + "" + ". (You also need level 30 Dungeoneering.)"); + case 17: + return newstruct cs2func_script_996_struct(40, 4089, "Members: Mystic hat" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "mystic hats" + "" + ". (They also need level 20 Defence.)"); + case 18: + return newstruct cs2func_script_996_struct(40, 4091, "Members: Mystic robe top" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "mystic robe tops" + "" + ". (They also need level 20 Defence.)"); + case 19: + return newstruct cs2func_script_996_struct(40, 4093, "Members: Mystic robe bottom" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "mystic robe bottoms" + "" + ". (They also need level 20 Defence.)"); + case 20: + return newstruct cs2func_script_996_struct(40, 4095, "Members: Mystic gloves" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "mystic gloves" + "" + ". (They also need level 20 Defence.)"); + case 21: + return newstruct cs2func_script_996_struct(40, 4097, "Members: Mystic boots" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "mystic boots" + "" + ". (They also need level 20 Defence.)"); + case 22: + return newstruct cs2func_script_996_struct(40, 14499, "Members: Dagon'hai hat" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "Dagon'hai hats" + "" + ". (They also need level 20 Defence.)"); + case 23: + return newstruct cs2func_script_996_struct(40, 14497, "Members: Dagon'hai robe top" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "Dagon'hai robe tops" + "" + ". (They also need level 20 Defence.)"); + case 24: + return newstruct cs2func_script_996_struct(40, 14501, "Members: Dagon'hai robe bottom" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "Dagon'hai robe bottoms" + "" + ". (They also need level 20 Defence.)"); + case 25: + return newstruct cs2func_script_996_struct(40, 21509, "Members: Necromancer hood" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "Necromancer hoods" + "" + ". (They also need level 20 Defence.)"); + case 26: + return newstruct cs2func_script_996_struct(40, 21508, "Members: Necromancer robe" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "Necromancer robes" + "" + ". (They also need level 20 Defence.)"); + case 27: + return newstruct cs2func_script_996_struct(40, 21510, "Members: Necromancer legs" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "Necromancer legs" + "" + ". (They also need level 20 Defence.)"); + case 28: + return newstruct cs2func_script_996_struct(40, 7400, "Members: Enchanted hat" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "enchanted hats" + "" + ". (They also need level 20 Defence.)"); + case 29: + return newstruct cs2func_script_996_struct(40, 7399, "Members: Enchanted top" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "enchanted tops" + "" + ". (They also need level 20 Defence.)"); + case 30: + return newstruct cs2func_script_996_struct(40, 7398, "Members: Enchanted robe" + "
" + " (with level 20 Defence)", "Members now have the Magic level required to wear " + "" + "enchanted robes" + "" + ". (They also need level 20 Defence.)"); + case 31: + return newstruct cs2func_script_996_struct(40, 3385, "Members: Splitbark helm" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "splitbark helms" + "" + ". (They also need level 40 Defence.)"); + case 32: + return newstruct cs2func_script_996_struct(40, 3387, "Members: Splitbark body" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "splitbark bodies" + "" + ". (They also need level 40 Defence.)"); + case 33: + return newstruct cs2func_script_996_struct(40, 3389, "Members: Splitbark legs" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "splitbark legs" + "" + ". (They also need level 40 Defence.)"); + case 34: + return newstruct cs2func_script_996_struct(40, 3391, "Members: Splitbark gauntlets" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "splitbark gauntlets" + "" + ". (They also need level 40 Defence.)"); + case 35: + return newstruct cs2func_script_996_struct(40, 3393, "Members: Splitbark boots" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "splitbark boots" + "" + ". (They also need level 40 Defence.)"); + case 36: + return newstruct cs2func_script_996_struct(40, 6137, "Members: Skeletal helmet" + "
" + " (after Fremennik Trials and with 40 Defence)", "Members now have the Magic level required to wear " + "" + "skeletal helmets" + "" + " (after Fremennik Trials and with level 40 Defence)."); + case 37: + return newstruct cs2func_script_996_struct(40, 6139, "Members: Skeletal top" + "
" + " (after Fremennik Trials and with 40 Defence)", "Members now have the Magic level required to wear " + "" + "skeletal tops" + "" + " (after Fremennik Trials and with level 40 Defence)."); + case 38: + return newstruct cs2func_script_996_struct(40, 6141, "Members: Skeletal bottoms" + "
" + " (after Fremennik Trials and with 40 Defence)", "Members now have the Magic level required to wear " + "" + "skeletal bottoms" + "" + " (after Fremennik Trials and with level 40 Defence)."); + case 39: + return newstruct cs2func_script_996_struct(40, 14116, "Members: Sacred clay hat" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "sacred clay hats" + "" + ". (They also need level 40 Defence.)"); + case 40: + return newstruct cs2func_script_996_struct(40, 14114, "Members: Sacred clay robe top" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "sacred clay robe tops" + "" + ". (They also need level 40 Defence.)"); + case 41: + return newstruct cs2func_script_996_struct(40, 14115, "Members: Sacred clay robe bottom" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "sacred clay robe bottoms" + "" + ". (They also need level 40 Defence.)"); + case 42: + return newstruct cs2func_script_996_struct(40, 10454, "Members: Guthix mitre" + "
" + " (with 40 Prayer)", "Members now have the Magic level required to wear " + "" + "Guthix mitres" + "" + ". (They also need level 40 Prayer.)"); + case 43: + return newstruct cs2func_script_996_struct(40, 10452, "Members: Saradomin mitre" + "
" + " (with 40 Prayer)", "Members now have the Magic level required to wear " + "" + "Saradomin mitres" + "" + ". (They also need level 40 Prayer.)"); + case 44: + return newstruct cs2func_script_996_struct(40, 10456, "Members: Zamorak mitre" + "
" + " (with 40 Prayer)", "Members now have the Magic level required to wear " + "" + "Zamorak mitres" + "" + ". (They also need level 40 Prayer.)"); + case 45: + return newstruct cs2func_script_996_struct(40, 19374, "Members: Armadyl mitre" + "
" + " (with 40 Prayer)", "Members now have the Magic level required to wear " + "" + "Armadyl mitres" + "" + ". (They also need level 40 Prayer.)"); + case 46: + return newstruct cs2func_script_996_struct(40, 19376, "Members: Bandos mitre" + "
" + " (with 40 Prayer)", "Members now have the Magic level required to wear " + "" + "Bandos mitres" + "" + ". (They also need level 40 Prayer.)"); + case 47: + return newstruct cs2func_script_996_struct(40, 19378, "Members: Ancient mitre" + "
" + " (with 40 Prayer)", "Members now have the Magic level required to wear " + "" + "Ancient mitres" + "" + ". (They also need level 40 Prayer.)"); + case 48: + return newstruct cs2func_script_996_struct(42, 11665, "Members: Void melee helm", "Members now have the Magic level required to wear " + "" + "Void melee helms" + "" + "."); + case 49: + return newstruct cs2func_script_996_struct(42, 11664, "Members: Void ranger helm", "Members now have the Magic level required to wear " + "" + "Void ranger helms" + "" + "."); + case 50: + return newstruct cs2func_script_996_struct(42, 11663, "Members: Void mage helm", "Members now have the Magic level required to wear " + "" + "Void mage helms" + "" + "."); + case 51: + return newstruct cs2func_script_996_struct(42, 8839, "Members: Void knight top", "Members now have the Magic level required to wear " + "" + "Void knight tops" + "" + "."); + case 52: + return newstruct cs2func_script_996_struct(42, 8840, "Members: Void knight robe", "Members now have the Magic level required to wear " + "" + "Void knight robes" + "" + "."); + case 53: + return newstruct cs2func_script_996_struct(42, 8842, "Members: Void knight gloves", "Members now have the Magic level required to wear " + "" + "Void knight gloves" + "" + "."); + case 54: + return newstruct cs2func_script_996_struct(42, 19712, "Members: Void knight deflector", "Members now have the Magic level required to wear " + "" + "Void knight deflectors" + "" + "."); + case 55: + return newstruct cs2func_script_996_struct(42, 7620, "Void knight equipment requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer.", "" + "Void knight equipment" + "" + " requires 42 Attack, Defence, Strength, Ranged, Magic and Constitution and 22 Prayer."); + case 56: + return newstruct cs2func_script_996_struct(50, 6918, "Members: Infinity hat" + "
" + " (with level 25 Defence)", "Members now have the Magic level required to wear " + "" + "infinity hats" + "" + ". (They also need level 25 Defence.)"); + case 57: + return newstruct cs2func_script_996_struct(50, 6916, "Members: Infinity top" + "
" + " (with level 25 Defence)", "Members now have the Magic level required to wear " + "" + "infinity tops" + "" + ". (They also need level 25 Defence.)"); + case 58: + return newstruct cs2func_script_996_struct(50, 6924, "Members: Infinity bottom" + "
" + " (with level 25 Defence)", "Members now have the Magic level required to wear " + "" + "infinity bottoms" + "" + ". (They also need level 25 Defence.)"); + case 59: + return newstruct cs2func_script_996_struct(50, 6920, "Members: Infinity boots" + "
" + " (with level 25 Defence)", "Members now have the Magic level required to wear " + "" + "infinity boots" + "" + ". (They also need level 25 Defence.)"); + case 60: + return newstruct cs2func_script_996_struct(50, 6922, "Members: Infinity gloves" + "
" + " (with level 25 Defence)", "Members now have the Magic level required to wear " + "" + "infinity gloves" + "" + ". (They also need level 25 Defence.)"); + case 61: + return newstruct cs2func_script_996_struct(50, 18334, "Arcane blast necklace" + "
" + " (with 50 Dungeoneering)", "You can now wear " + "" + "arcane blast necklaces" + "" + ". (You also need level 50 Dungeoneering.)"); + case 62: + return newstruct cs2func_script_996_struct(60, 2413, "Members: Guthix cape", "Members can now wear " + "" + "Guthix capes."); + case 63: + return newstruct cs2func_script_996_struct(60, 2412, "Members: Saradomin cape", "Members can now wear " + "" + "Saradomin capes."); + case 64: + return newstruct cs2func_script_996_struct(60, 2414, "Members: Zamorak cape", "Members can now wear " + "" + "Zamorak capes."); + case 65: + return newstruct cs2func_script_996_struct(60, 12866, "Members: Battle hood" + "
" + " (with level 50 Defence)", "Members now have the Magic level required to wear " + "" + "battle hoods" + "" + ". (They also need level 50 Defence.)"); + case 66: + return newstruct cs2func_script_996_struct(60, 12873, "Members: Battle robe top" + "
" + " (with level 50 Defence)", "Members now have the Magic level required to wear " + "" + "battle robe tops" + "" + ". (They also need level 50 Defence.)"); + case 67: + return newstruct cs2func_script_996_struct(60, 12880, "Members: Battle robe bottom" + "
" + " (with level 50 Defence)", "Members now have the Magic level required to wear " + "" + "battle robe bottoms" + "" + ". (They also need level 50 Defence.)"); + case 68: + return newstruct cs2func_script_996_struct(65, 10342, "Members: Third-Age mage hat" + "
" + " (with level 30 Defence)", "Members now have the Magic level required to wear " + "" + "Third-Age mage hats" + "" + ". (They also need level 30 Defence)"); + case 69: + return newstruct cs2func_script_996_struct(65, 10338, "Members: Third-Age robe top" + "
" + " (with level 30 Defence)", "Members now have the Magic level required to wear " + "" + "Third-Age robe tops" + "" + ". (They also need level 30 Defence)"); + case 70: + return newstruct cs2func_script_996_struct(65, 10340, "Members: Third-Age robe" + "
" + " (with level 30 Defence)", "Members now have the Magic level required to wear " + "" + "Third-Age robes" + "" + ". (They also need level 30 Defence)"); + case 71: + return newstruct cs2func_script_996_struct(65, 10344, "Members: Third-Age amulet" + "
" + " (with level 30 Defence)", "Members now have the Magic level required to wear " + "" + "Third-Age amulets" + "" + ". (They also need level 30 Defence)"); + case 72: + return newstruct cs2func_script_996_struct(65, 9096, "Members: Lunar helm" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "lunar helms" + "" + ". (They also need level 40 Defence.)"); + case 73: + return newstruct cs2func_script_996_struct(65, 9097, "Members: Lunar torso" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "lunar torsos" + "" + ". (They also need level 40 Defence.)"); + case 74: + return newstruct cs2func_script_996_struct(65, 9099, "Members: Lunar gloves" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "lunar gloves" + "" + ". (They also need level 40 Defence.)"); + case 75: + return newstruct cs2func_script_996_struct(65, 9098, "Members: Lunar legs" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "lunar legs" + "" + ". (They also need level 40 Defence.)"); + case 76: + return newstruct cs2func_script_996_struct(65, 9100, "Members: Lunar boots" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "lunar boots" + "" + ". (They also need level 40 Defence.)"); + case 77: + return newstruct cs2func_script_996_struct(65, 9101, "Members: Lunar cape" + "
" + " (with level 40 Defence)", "Members now have the Magic level required to wear " + "" + "lunar capes" + "" + ". (They also need level 40 Defence.)"); + case 78: + return newstruct cs2func_script_996_struct(65, 13738, "Members: Arcane spirit shield" + "
" + " (after Summer's End and with 70 Prayer and 75 Defence)", "Members now have the Magic level required to wield " + "" + "arcane spirit shields" + "" + " (after Summer's End, with level 70 Prayer and 75 Defence)."); + case 79: + return newstruct cs2func_script_996_struct(65, 13744, "Members: Spectral spirit shield" + "
" + " (after Summer's End and with 70 Prayer and 75 Defence)", "Members now have the Magic level required to wield " + "" + "spectral spirit shields" + "" + " (after Summer's End, with level 70 Prayer and 75 Defence)."); + case 80: + return newstruct cs2func_script_996_struct(70, 4708, "Members: Ahrim's hood" + "
" + " (with level 70 Defence)", "Members now have the Magic level required to wear " + "" + "Ahrim's hood" + "" + ". (They also need level 70 Defence.)"); + case 81: + return newstruct cs2func_script_996_struct(70, 4712, "Members: Ahrim's robe top" + "
" + " (with level 70 Defence)", "Members now have the Magic level required to wear " + "" + "Ahrim's robe top" + "" + ". (They also need level 70 Defence.)"); + case 82: + return newstruct cs2func_script_996_struct(70, 4714, "Members: Ahrim's robe skirt" + "
" + " (with level 70 Defence)", "Members now have the Magic level required to wear " + "" + "Ahrim's robe skirt" + "" + ". (They also need level 70 Defence.)"); + case 83: + return newstruct cs2func_script_996_struct(70, 21736, "Members: Akrisae's hood" + "
" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Prayer)", "Members now have the Magic level required to wear " + "" + "Akrisae's hood" + "" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Prayer)."); + case 84: + return newstruct cs2func_script_996_struct(70, 21752, "Members: Akrisae's robe top" + "
" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Prayer)", "Members now have the Magic level required to wear " + "" + "Akrisae's robe top" + "" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Prayer)."); + case 85: + return newstruct cs2func_script_996_struct(70, 21760, "Members: Akrisae's robe skirt" + "
" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Prayer)", "Members now have the Magic level required to wear " + "" + "Akrisae's robe skirt" + "" + " (after Ritual of the Mahjarrat and with level 70 Defence and 70 Prayer)."); + case 86: + return newstruct cs2func_script_996_struct(70, 18335, "Members: Arcane stream necklace" + "
" + " (with 70 Dungeoneering)", "Members can now wear " + "" + "arcane stream necklaces" + "" + ". (They also need level 70 Dungeoneering.)"); + case 87: + return newstruct cs2func_script_996_struct(75, 21793, "Members: Ragefire boots" + "
" + " (with 75 Defence)", "Members now have the Magic level required to wear " + "" + "ragefire boots" + "" + " (with 75 Defence)."); + case 88: + return newstruct cs2func_script_996_struct(78, 13864, "Members: Zuriel's hood" + "
" + " (with level 78 Defence)", "Members now have the Magic level required to wear " + "" + "Zuriel's hood" + "" + ". (They also need level 78 Defence.)"); + case 89: + return newstruct cs2func_script_996_struct(78, 13858, "Members: Zuriel's robe top" + "
" + " (with level 78 Defence)", "Members now have the Magic level required to wear " + "" + "Zuriel's robe top" + "" + ". (They also need level 78 Defence.)"); + case 90: + return newstruct cs2func_script_996_struct(78, 13861, "Members: Zuriel's robe bottom" + "
" + " (with level 78 Defence)", "Members now have the Magic level required to wear " + "" + "Zuriel's robe bottom" + "" + ". (They also need level 78 Defence.)"); + case 91: + return newstruct cs2func_script_996_struct(80, 20159, "Members: Virtus mask" + "
" + " (with 80 Defence and Constitution)", "Members can now wear " + "" + "virtus masks" + "" + ". (They also need level 80 Defence and Constitution.)"); + case 92: + return newstruct cs2func_script_996_struct(80, 20163, "Members: Virtus robe top" + "
" + " (with 80 Defence and Constitution)", "Members can now wear " + "" + "virtus robe tops" + "" + ". (They also need level 80 Defence and Constitution.)"); + case 93: + return newstruct cs2func_script_996_struct(80, 20167, "Members: Virtus robe legs" + "
" + " (with 80 Defence and Constitution)", "Members can now wear " + "" + "virtus robe legs" + "" + ". (They also need level 80 Defence and Constitution.)"); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_996_struct(1, 1379, "Staff", "You can now wield " + "" + "staves" + "" + "."); + case 1: + return newstruct cs2func_script_996_struct(1, 15598, "Caitlin's staff" + "
" + " (after The Blood Pact)", "You can now wield " + "" + "Caitlin's staff" + "" + " (after The Blood Pact)."); + case 2: + return newstruct cs2func_script_996_struct(1, 1389, "Magic staff", "You can now wield " + "" + "staves of magic" + "" + "."); + case 3: + return newstruct cs2func_script_996_struct(1, 1381, "Staff of air", "You can now wield " + "" + "staves of air" + "" + "."); + case 4: + return newstruct cs2func_script_996_struct(1, 1385, "Staff of earth", "You can now wield " + "" + "staves of earth" + "" + "."); + case 5: + return newstruct cs2func_script_996_struct(1, 1387, "Staff of fire", "You can now wield " + "" + "staves of fires" + "" + "."); + case 6: + return newstruct cs2func_script_996_struct(1, 1383, "Staff of water", "You can now wield " + "" + "staves of water" + "" + "."); + case 7: + return newstruct cs2func_script_996_struct(1, 21490, "Skeletal staves", "You can now wield " + "" + "skeletal staves" + "" + "."); + case 8: + return newstruct cs2func_script_996_struct(20, 13941, "Members: Corrupt Zuriel's staff" + "
" + " (with level 20 Attack)", "Members now have the Magic level required to use " + "" + "Corrupt Zuriel's staff" + "" + ". (They also need level 20 Attack.)"); + case 9: + return newstruct cs2func_script_996_struct(30, 1397, "Members: Air battlestaff" + "
" + " (with level 30 Attack)", "Members now have the Magic level required to use " + "" + "air battlestaves" + "" + ". (They also need level 30 Attack.)"); + case 10: + return newstruct cs2func_script_996_struct(30, 1399, "Members: Earth battlestaff" + "
" + " (with level 30 Attack)", "Members now have the Magic level required to use " + "" + "earth battlestaves" + "" + ". (They also need level 30 Attack.)"); + case 11: + return newstruct cs2func_script_996_struct(30, 1393, "Members: Fire battlestaff" + "
" + " (with level 30 Attack)", "Members now have the Magic level required to use " + "" + "fire battlestaves" + "" + ". (They also need level 30 Attack.)"); + case 12: + return newstruct cs2func_script_996_struct(30, 1395, "Members: Water battlestaff" + "
" + " (with level 30 Attack)", "Members now have the Magic level required to use " + "" + "water battlestaves" + "" + ". (They also need level 30 Attack.)"); + case 13: + return newstruct cs2func_script_996_struct(30, 3053, "Members: Lava battlestaff" + "
" + " (with level 30 Attack)", "Members now have the Magic level required to use " + "" + "lava battlestaves" + "" + ". (They also need level 30 Attack.)"); + case 14: + return newstruct cs2func_script_996_struct(30, 6562, "Members: Mud battlestaff" + "
" + " (with level 30 Attack)", "Members now have the Magic level required to use " + "" + "mud battlestaves" + "" + ". (They also need level 30 Attack.)"); + case 15: + return newstruct cs2func_script_996_struct(30, 11736, "Members: Steam battlestaff" + "
" + " (with level 30 Attack)", "Members now have the Magic level required to use " + "" + "steam battlestaves" + "" + ". (They also need level 30 Attack.)"); + case 16: + return newstruct cs2func_script_996_struct(30, 21502, "Members: Skeletal battlestaves" + "
" + " (with level 30 Attack)", "Members now have the Magic level required to use " + "" + "skeletal battlestaves" + "" + ". (They also need level 30 Attack.)"); + case 17: + return newstruct cs2func_script_996_struct(30, 21536, "Members: Sceptre of the gods" + "
" + " (with level 30 Attack)", "Members now have the Magic level required to use " + "" + "the sceptre of the gods" + "" + ". (They also need level 30 Attack.)"); + case 18: + return newstruct cs2func_script_996_struct(40, 1405, "Members: Mystic air staff" + "
" + " (with level 40 Attack)", "Members now have the Magic level required to use " + "" + "mystic air staves" + "" + ". (They also need level 40 Attack.)"); + case 19: + return newstruct cs2func_script_996_struct(40, 1407, "Members: Mystic earth staff" + "
" + " (with level 40 Attack)", "Members now have the Magic level required to use " + "" + "mystic earth staves" + "" + ". (They also need level 40 Attack.)"); + case 20: + return newstruct cs2func_script_996_struct(40, 1401, "Members: Mystic fire staff" + "
" + " (with level 40 Attack)", "Members now have the Magic level required to use " + "" + "mystic fire staves" + "" + ". (They also need level 40 Attack.)"); + case 21: + return newstruct cs2func_script_996_struct(40, 1403, "Members: Mystic water staff" + "
" + " (with level 40 Attack)", "Members now have the Magic level required to use " + "" + "mystic water staves" + "" + ". (They also need level 40 Attack.)"); + case 22: + return newstruct cs2func_script_996_struct(40, 3054, "Members: Mystic lava staff" + "
" + " (with level 40 Attack)", "Members now have the Magic level required to use " + "" + "mystic lava staves" + "" + ". (They also need level 40 Attack.)"); + case 23: + return newstruct cs2func_script_996_struct(40, 6563, "Members: Mystic mud staff" + "
" + " (with level 40 Attack)", "Members now have the Magic level required to use " + "" + "mystic mud staves" + "" + ". (They also need level 40 Attack.)"); + case 24: + return newstruct cs2func_script_996_struct(40, 11738, "Members: Mystic steam staff" + "
" + " (with level 40 Attack)", "Members now have the Magic level required to use " + "" + "mystic steam staves" + "" + ". (They also need level 40 Attack.)"); + case 25: + return newstruct cs2func_script_996_struct(40, 19323, "Members: Dragon staff" + "
" + " (with 40 Attack, 60 Prayer and 20 Defence)", "Members now have the Magic level required to wield " + "" + "dragon staves" + "" + ". (They also need level 40 Attack, level 60 Prayer and level 20 Defence.)"); + case 26: + return newstruct cs2func_script_996_struct(40, 19325, "Members: Penguin staff" + "
" + " (with 40 Attack, 60 Prayer and 20 Defence)", "Members now have the Magic level required to wield " + "" + "penguin staves" + "" + ". (They also need level 40 Attack, level 60 Prayer and level 20 Defence.)"); + case 27: + return newstruct cs2func_script_996_struct(40, 19327, "Members: Bat staff" + "
" + " (with 40 Attack, 60 Prayer and 20 Defence)", "Members now have the Magic level required to wield " + "" + "bat staves" + "" + ". (They also need level 40 Attack, level 60 Prayer and level 20 Defence.)"); + case 28: + return newstruct cs2func_script_996_struct(40, 19329, "Members: Wolf staff" + "
" + " (with 40 Attack, 60 Prayer and 20 Defence)", "Members now have the Magic level required to wield " + "" + "wolf staves" + "" + ". (They also need level 40 Attack, level 60 Prayer and level 20 Defence.)"); + case 29: + return newstruct cs2func_script_996_struct(40, 19331, "Members: Cat staff" + "
" + " (with 40 Attack, 60 Prayer and 20 Defence)", "Members now have the Magic level required to wield " + "" + "cat staves" + "" + ". (They also need level 40 Attack, level 60 Prayer and level 20 Defence.)"); + case 30: + return newstruct cs2func_script_996_struct(40, 14117, "Members: Sacred clay staff", "Members can now wield " + "" + "sacred clay staves" + "" + "."); + case 31: + return newstruct cs2func_script_996_struct(40, 21498, "Members: Necromancer staves" + "
" + " (with level 40 Attack)", "Members now have the Magic level required to use " + "" + "necromancer staves" + "" + ". (They also need level 40 Attack.)"); + case 32: + return newstruct cs2func_script_996_struct(42, 8841, "Members: Void knight mace", "Members now have the Magic level required to wield " + "" + "Void knight maces" + "" + "."); + case 33: + return newstruct cs2func_script_996_struct(45, 18342, "Law staff" + "
" + " (with 40 Attack and 45 Dungeoneering)", "You can now use " + "" + "law staves" + "" + ". (You also need level 40 Attack and level 45 Dungeoneering.)"); + case 34: + return newstruct cs2func_script_996_struct(45, 18371, "Gravite staff" + "
" + " (with 45 Dungeoneering)", "You can now wield " + "" + "gravite staves" + "" + ". (You also need level 45 Dungeoneering.)"); + case 35: + return newstruct cs2func_script_996_struct(50, 4170, "Members: Slayer's staff" + "
" + " (with level 55 Slayer)", "Members now have the Magic level required to use " + "" + "Slayer staves" + "" + ", magic weapons used for killing turoth and kurask. (They also need level 55 Slayer.)"); + case 36: + return newstruct cs2func_script_996_struct(50, 1409, "Members: Iban's Staff" + "
" + " (after Underground Pass and with 50 Attack)", "Members now have the Magic level required to use " + "" + "Iban's Staff" + "" + " (after Underground Pass and with 50 Attack)."); + case 37: + return newstruct cs2func_script_996_struct(50, 4675, "Members: Ancient Staff" + "
" + " (after Desert Treasure, with 50 Attack)", "Members now have the Magic level required to use the " + "" + "Ancient Staff" + "" + " (after Desert Treasure and with 50 Attack)."); + case 38: + return newstruct cs2func_script_996_struct(53, 18341, "Nature staff" + "
" + " (with 40 Attack and 53 Dungeoneering)", "You can now use " + "" + "nature staves" + "" + ". (You also need level 40 Attack and level 53 Dungeoneering.)"); + case 39: + return newstruct cs2func_script_996_struct(60, 2415, "Members: Saradomin staff", "Members can now use " + "" + "Saradomin staves" + "" + "."); + case 40: + return newstruct cs2func_script_996_struct(60, 2416, "Members: Guthix staff", "Members can now use the " + "" + "Guthix staves" + "" + "."); + case 41: + return newstruct cs2func_script_996_struct(60, 2417, "Members: Zamorak staff", "Members can now use the " + "" + "Zamorak staves" + "" + "."); + case 42: + return newstruct cs2func_script_996_struct(60, 6526, "Members: Toktz-Mej-Tal" + "
" + " (with level 60 Attack)", "Members now have the Magic level required to use " + "" + "Toktz-Mej-Tal" + "" + ". (They also need level 60 Attack.)"); + case 43: + return newstruct cs2func_script_996_struct(70, 15438, "Members: Penance Trident", "Members now have the Magic level required to use the " + "" + "Penance Trident" + "" + "."); + case 44: + return newstruct cs2func_script_996_struct(70, 15485, "Members: Penance Master Trident" + "
" + " (with level 70 Attack)", "Members now have the Magic level required to use the " + "" + "Penance Master Trident" + "" + ". (They also need level 70 Attack.)"); + case 45: + return newstruct cs2func_script_996_struct(70, 4710, "Members: Ahrim's staff" + "
" + " (with level 70 Attack)", "Members now have the Magic level required to use " + "" + "Ahrim's staff" + "" + ". (They also need level 70 Attack.)"); + case 46: + return newstruct cs2func_script_996_struct(70, 21744, "Members: Akrisae's war mace" + "
" + " (after Ritual of the Mahjarrat and with level 70 Attack and level 70 Prayer)", "Members now have the Magic level required to wield " + "" + "Akrisae's war mace" + "" + " (after Ritual of the Mahjarrat with level 70 Defence and 70 Prayer.)"); + case 47: + return newstruct cs2func_script_996_struct(70, 21580, "Members: Blisterwood staff (after The Branches of Darkmeyer)", "Members now have the Magic level required to use " + "" + "blisterwood staves" + "" + " (after The Branches of Darkmeyer.)"); + case 48: + return newstruct cs2func_script_996_struct(75, 15486, "Members: Staff of Light (with 75 Attack)", "Members can now wield the " + "" + "Staff of Light" + "" + " (with 75 Attack)."); + case 49: + return newstruct cs2func_script_996_struct(77, 21777, "Members: Armadyl battlestaff" + "
" + " (with level 40 Attack)", "Members now have the Magic level required to use " + "" + "Armadyl battlestaves" + "" + ". (They also need level 40 Attack.)"); + case 50: + return newstruct cs2func_script_996_struct(78, 13867, "Members: Zuriel's staff" + "
" + " (with level 78 Attack)", "Members now have the Magic level required to use " + "" + "Zuriel's staff" + "" + ". (They also need level 78 Attack.)"); + case 51: + return newstruct cs2func_script_996_struct(80, 18355, "Members: Chaotic staff" + "
" + " (with 80 Dungeoneering)", "Members can now wield " + "" + "chaotic staves" + "" + ". (They also need level 80 Dungeoneering.)"); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_996_struct(35, 19671, " Magical blastbox" + "
" + " (with 30 Dungeoneering and 30 Runecrafting)", "You can now use " + "" + "magical blastboxes" + "" + ". (You also need level 30 Dungeoneering and 30 Runecrafting.)"); + case 1: + return newstruct cs2func_script_996_struct(45, 6908, "Members: Beginner wand", "Members can now use " + "" + "beginner wands" + "" + "."); + case 2: + return newstruct cs2func_script_996_struct(48, 18346, "Tome of frost" + "
" + " (with 48 Dungeoneering)", "You can now use " + "" + "tomes of frost" + "" + ". (You also need level 48 Dungeoneering.)"); + case 3: + return newstruct cs2func_script_996_struct(50, 6910, "Members: Apprentice wand", "Members can now use " + "" + "apprentice wands" + "" + "."); + case 4: + return newstruct cs2func_script_996_struct(55, 6912, "Members: Teacher wand", "Members can now use " + "" + "teacher wands" + "" + "."); + case 5: + return newstruct cs2func_script_996_struct(60, 6914, "Members: Master wand", "Members can now use " + "" + "master wands" + "" + "."); + case 6: + return newstruct cs2func_script_996_struct(60, 6889, "Members: Mage's book", "Members can now use " + "" + "mages' books" + "" + "."); + case 7: + return newstruct cs2func_script_996_struct(70, 19889, "Members: Celestial surgebox" + "
" + " (with 70 Dungeoneering and 70 Runecrafting)", "Members can now use " + "" + "celestial surgeboxes" + "" + ". (They also need level 70 Dungeoneering and level 70 Runecrafting.)"); + } + break; + case 7: + switch (arg1) { + case 0: + return newstruct cs2func_script_996_struct(30, 10149, "Members: Swamp lizard" + "
" + " (with level 30 Attack and 30 Ranged)", "Members now have the Magic level required to wield " + "" + "swamp lizards" + "" + ". (They also need level 30 Attack and level 30 Ranged.)"); + case 1: + return newstruct cs2func_script_996_struct(50, 10146, "Members: Orange salamander" + "
" + " (with level 50 Attack and 50 Ranged)", "Members now have the Magic level required to wield " + "" + "orange salamanders" + "" + ". (They also need level 50 Attack and 50 Ranged.)"); + case 2: + return newstruct cs2func_script_996_struct(60, 10147, "Members: Red salamander" + "
" + " (with level 60 Attack and 60 Ranged)", "Members now have the Magic level required to wield " + "" + "red salamanders" + "" + ". (They also need level 60 Attack and 60 Ranged.)"); + case 3: + return newstruct cs2func_script_996_struct(70, 10148, "Members: Black salamander" + "
" + " (with level 70 Attack and 70 Ranged)", "Members now have the Magic level required to wield " + "" + "black salamanders" + "" + ". (They also need level 70 Attack and 70 Ranged.)"); + } + break; + case 8: + switch (arg1) { + case 0: + return newstruct cs2func_script_996_struct(1, 14377, "Members: Stealing Creation - class 1 staff", "Members can now wield " + "" + "class 1 staves" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_996_struct(1, 14337, "Members: Stealing Creation - class 1 hat", "Members can now wear " + "" + "class 1 hats" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_996_struct(1, 14317, "Members: Stealing Creation - class 1 robe top", "Members can now wear " + "" + "class 1 robe tops" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_996_struct(1, 14327, "Members: Stealing Creation - class 1 robe bottom", "Members can now wear " + "" + "class 1 robe bottoms" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_996_struct(20, 14379, "Members: Stealing Creation - class 2 staff", "Members can now wield " + "" + "class 2 staves" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_996_struct(20, 14339, "Members: Stealing Creation - class 2 hat", "Members can now wear " + "" + "class 2 hats" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_996_struct(20, 14319, "Members: Stealing Creation - class 2 robe top", "Members can now wear " + "" + "class 2 robe tops" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_996_struct(20, 14329, "Members: Stealing Creation - class 2 robe bottom", "Members can now wear " + "" + "class 2 robe bottoms" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_996_struct(40, 14381, "Members: Stealing Creation - class 3 staff", "Members can now wield " + "" + "class 3 staves" + "" + " in Stealing Creation."); + case 9: + return newstruct cs2func_script_996_struct(40, 14341, "Members: Stealing Creation - class 3 hat", "Members can now wear " + "" + "class 3 hats" + "" + " in Stealing Creation."); + case 10: + return newstruct cs2func_script_996_struct(40, 14321, "Members: Stealing Creation - class 3 robe top", "Members can now wear " + "" + "class 3 robe tops" + "" + " in Stealing Creation."); + case 11: + return newstruct cs2func_script_996_struct(40, 14331, "Members: Stealing Creation - class 3 robe bottom", "Members can now wear " + "" + "class 3 robe bottoms" + "" + " in Stealing Creation."); + case 12: + return newstruct cs2func_script_996_struct(60, 14383, "Members: Stealing Creation - class 4 staff", "Members can now wield " + "" + "class 4 staves" + "" + " in Stealing Creation."); + case 13: + return newstruct cs2func_script_996_struct(60, 14343, "Members: Stealing Creation - class 4 hat", "Members can now wear " + "" + "class 4 hats" + "" + " in Stealing Creation."); + case 14: + return newstruct cs2func_script_996_struct(60, 14323, "Members: Stealing Creation - class 4 robe top", "Members can now wear " + "" + "class 4 robe tops" + "" + " in Stealing Creation."); + case 15: + return newstruct cs2func_script_996_struct(60, 14333, "Members: Stealing Creation - class 4 robe bottom", "Members can now wear " + "" + "class 4 robe bottoms" + "" + " in Stealing Creation."); + case 16: + return newstruct cs2func_script_996_struct(80, 14385, "Members: Stealing Creation - class 5 staff", "Members can now wield " + "" + "class 5 staves" + "" + " in Stealing Creation."); + case 17: + return newstruct cs2func_script_996_struct(80, 14345, "Members: Stealing Creation - class 5 hat", "Members can now wear " + "" + "class 5 hats" + "" + " in Stealing Creation."); + case 18: + return newstruct cs2func_script_996_struct(80, 14325, "Members: Stealing Creation - class 5 robe top", "Members can now wear " + "" + "class 5 robe tops" + "" + " in Stealing Creation."); + case 19: + return newstruct cs2func_script_996_struct(80, 14335, "Members: Stealing Creation - class 5 robe bottom", "Members can now wear " + "" + "class 5 robe bottoms" + "" + " in Stealing Creation."); + case 20: + return newstruct cs2func_script_996_struct(85, 21537, "Members: Battle-mage helm" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the magic level require to wear " + "" + "Battle-mage helms" + "" + ". They also need level 85 Defence and level 85 Strength."); + case 21: + return newstruct cs2func_script_996_struct(85, 21539, "Members: Battle-mage robe" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the magic level require to wear " + "" + "Battle-mage robes" + "" + ". They also need level 85 Defence and level 85 Strength."); + case 22: + return newstruct cs2func_script_996_struct(85, 21541, "Members: Battle-mage legs" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the magic level require to wear " + "" + "Battle-mage legs" + "" + ". They also need level 85 Defence and level 85 Strength."); + case 23: + return newstruct cs2func_script_996_struct(85, 21543, "Members: Battle-mage gloves" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the magic level require to wear " + "" + "Battle-mage gloves" + "" + ". They also need level 85 Defence and level 85 Strength."); + case 24: + return newstruct cs2func_script_996_struct(85, 21545, "Members: Battle-mage boots" + "
" + " (with 85 Defence and 85 Strength)", "Members now have the magic level require to wear " + "" + "Battle-mage boots" + "" + ". They also need level 85 Defence and level 85 Strength."); + case 25: + return newstruct cs2func_script_996_struct(85, 21547, "Members: Trickster hood" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the magic level require to wear " + "" + "Trickster hoods" + "" + ". They also need level 85 Defence and level 85 Ranged"); + case 26: + return newstruct cs2func_script_996_struct(85, 21549, "Members: Trickster robe" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the magic level require to wear " + "" + "Trickster robes" + "" + ". They also need level 85 Defence and level 85 Ranged"); + case 27: + return newstruct cs2func_script_996_struct(85, 21551, "Members: Trickster legs" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the magic level require to wear " + "" + "Trickster legs" + "" + ". They also need level 85 Defence and level 85 Ranged"); + case 28: + return newstruct cs2func_script_996_struct(85, 21553, "Members: Trickster gloves" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the magic level require to wear " + "" + "Trickster gloves" + "" + ". They also need level 85 Defence and level 85 Ranged"); + case 29: + return newstruct cs2func_script_996_struct(85, 21555, "Members: Trickster boots" + "
" + " (with 85 Defence and 85 Ranged)", "Members now have the magic level require to wear " + "" + "Trickster boots" + "" + ". They also need level 85 Defence and level 85 Ranged"); + } + break; + case 9: + switch (arg1) { + case 0: + return newstruct cs2func_script_996_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Magic level increases, you will be able to attempt higher-level magic tasks within Daemonheim. You will also be more likely to succeed when attempting magic tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_996_struct(1, 16977, "Basic staves (all tiers)", "You can now wield " + "" + "basic staves" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_996_struct(1, 16997, "Water staff", "You can now wield " + "" + "water staves" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_996_struct(1, 16735, "Salve hood (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "salve hoods" + "" + " within Daemonheim. (You also need level 1 Defence.)"); + case 4: + return newstruct cs2func_script_996_struct(1, 17217, "Salve robe top (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "salve robe tops" + "" + " within Daemonheim. (You also need level 1 Defence.)"); + case 5: + return newstruct cs2func_script_996_struct(1, 16845, "Salve robe bottom (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "salve robe bottoms" + "" + " within Daemonheim. (You also need level 1 Defence.)"); + case 6: + return newstruct cs2func_script_996_struct(1, 17151, "Salve gloves (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "salve gloves" + "" + " within Daemonheim. (You also need level 1 Defence.)"); + case 7: + return newstruct cs2func_script_996_struct(1, 16911, "Salve boots (Tier 1)" + "
" + " (with 1 Defence)", "You can now wear " + "" + "salve boots" + "" + " within Daemonheim. (You also need level 1 Defence.)"); + case 8: + return newstruct cs2func_script_996_struct(10, 17001, "Earth staff", "You can now wield " + "" + "earth staves" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_996_struct(10, 16737, "Wildercress hood (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "wildercress hoods" + "" + " within Daemonheim. (You also need level 10 Defence.)"); + case 10: + return newstruct cs2func_script_996_struct(10, 17219, "Wildercress robe top (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "wildercress robe tops" + "" + " within Daemonheim. (You also need level 10 Defence.)"); + case 11: + return newstruct cs2func_script_996_struct(10, 16847, "Wildercress robe bottom (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "wildercress robe bottoms" + "" + " within Daemonheim. (You also need level 10 Defence.)"); + case 12: + return newstruct cs2func_script_996_struct(10, 17153, "Wildercress gloves (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "wildercress gloves" + "" + " within Daemonheim. (You also need level 10 Defence.)"); + case 13: + return newstruct cs2func_script_996_struct(10, 16913, "Wildercress boots (Tier 2)" + "
" + " (with 10 Defence)", "You can now wear " + "" + "wildercress boots" + "" + " within Daemonheim. (You also need level 10 Defence.)"); + case 14: + return newstruct cs2func_script_996_struct(20, 17005, "Fire staff", "You can now wield " + "" + "fire staves" + "" + " within Daemonheim."); + case 15: + return newstruct cs2func_script_996_struct(20, 16739, "Blightleaf hood (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "blightleaf hoods" + "" + " within Daemonheim. (You also need level 20 Defence.)"); + case 16: + return newstruct cs2func_script_996_struct(20, 17221, "Blightleaf robe top (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "blightleaf robe tops" + "" + " within Daemonheim. (You also need level 20 Defence.)"); + case 17: + return newstruct cs2func_script_996_struct(20, 16849, "Blightleaf robe bottom (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "blightleaf robe bottoms" + "" + " within Daemonheim. (You also need level 20 Defence.)"); + case 18: + return newstruct cs2func_script_996_struct(20, 17155, "Blightleaf gloves (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "blightleaf gloves" + "" + " within Daemonheim. (You also need level 20 Defence.)"); + case 19: + return newstruct cs2func_script_996_struct(20, 16915, "Blightleaf boots (Tier 3)" + "
" + " (with 20 Defence)", "You can now wear " + "" + "blightleaf boots" + "" + " within Daemonheim. (You also need level 20 Defence.)"); + case 20: + return newstruct cs2func_script_996_struct(30, 17009, "Air staff", "You can now wield " + "" + "air staves" + "" + " within Daemonheim."); + case 21: + return newstruct cs2func_script_996_struct(30, 16741, "Roseblood hood (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "roseblood hoods" + "" + " within Daemonheim. (You also need level 30 Defence.)"); + case 22: + return newstruct cs2func_script_996_struct(30, 17223, "Roseblood robe top (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "roseblood robe tops" + "" + " within Daemonheim. (You also need level 30 Defence.)"); + case 23: + return newstruct cs2func_script_996_struct(30, 16851, "Roseblood robe bottom (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "roseblood robe bottoms" + "" + " within Daemonheim. (You also need level 30 Defence.)"); + case 24: + return newstruct cs2func_script_996_struct(30, 17157, "Roseblood gloves (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "roseblood gloves" + "" + " within Daemonheim. (You also need level 30 Defence.)"); + case 25: + return newstruct cs2func_script_996_struct(30, 16917, "Roseblood boots (Tier 4)" + "
" + " (with 30 Defence)", "You can now wear " + "" + "roseblood boots" + "" + " within Daemonheim. (You also need level 30 Defence.)"); + case 26: + return newstruct cs2func_script_996_struct(32, 18637, "Spell: Create Gatestone", "You can now cast " + "" + "Create Gatestone" + "" + " within Daemonheim."); + case 27: + return newstruct cs2func_script_996_struct(32, 18638, "Spell: Gatestone Teleport", "You can now cast " + "" + "Gatestone Teleport" + "" + " within Daemonheim."); + case 28: + return newstruct cs2func_script_996_struct(33, 17273, "Members: Flameburst defender" + "
" + " (with 33 Defence)", "Members can now wield " + "" + "flameburst defenders" + "" + " within Daemonheim. (They also need level 33 Defence.)"); + case 29: + return newstruct cs2func_script_996_struct(36, 17275, "Members: Frostbite dagger" + "
" + " (with 36 Attack)", "Members can now wield " + "" + "frostbite daggers" + "" + " within Daemonheim. (They also need level 36 Attack.)"); + case 30: + return newstruct cs2func_script_996_struct(40, 17013, "Catalytic staff", "You can now wield " + "" + "catalytic staves" + "" + " within Daemonheim."); + case 31: + return newstruct cs2func_script_996_struct(40, 16743, "Bryll hood (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "bryll hoods" + "" + " within Daemonheim. (You also need level 40 Defence.)"); + case 32: + return newstruct cs2func_script_996_struct(40, 17225, "Bryll robe top (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "bryll robe tops" + "" + " within Daemonheim. (You also need level 40 Defence.)"); + case 33: + return newstruct cs2func_script_996_struct(40, 16853, "Bryll robe bottom (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "bryll robe bottoms" + "" + " within Daemonheim. (You also need level 40 Defence.)"); + case 34: + return newstruct cs2func_script_996_struct(40, 17159, "Bryll gloves (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "bryll gloves" + "" + " within Daemonheim. (You also need level 40 Defence.)"); + case 35: + return newstruct cs2func_script_996_struct(40, 16919, "Bryll boots (Tier 5)" + "
" + " (with 40 Defence)", "You can now wear " + "" + "bryll boots" + "" + " within Daemonheim. (You also need level 40 Defence.)"); + case 36: + return newstruct cs2func_script_996_struct(50, 16999, "Members: Empowered water staff", "Members can now wield " + "" + "empowered water staves" + "" + " within Daemonheim."); + case 37: + return newstruct cs2func_script_996_struct(50, 16745, "Members: Duskweed hood (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "duskweed hoods" + "" + " within Daemonheim. (They also need level 50 Defence.)"); + case 38: + return newstruct cs2func_script_996_struct(50, 17227, "Members: Duskweed robe top (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "duskweed robe tops" + "" + " within Daemonheim. (They also need level 50 Defence.)"); + case 39: + return newstruct cs2func_script_996_struct(50, 16855, "Members: Duskweed robe bottom (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "duskweed robe bottoms" + "" + " within Daemonheim. (They also need level 50 Defence.)"); + case 40: + return newstruct cs2func_script_996_struct(50, 17161, "Members: Duskweed gloves (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "duskweed gloves" + "" + " within Daemonheim. (They also need level 50 Defence.)"); + case 41: + return newstruct cs2func_script_996_struct(50, 16921, "Members: Duskweed boots (Tier 6)" + "
" + " (with 50 Defence)", "Members can now wear " + "" + "duskweed boots" + "" + " within Daemonheim. (They also need level 50 Defence.)"); + case 42: + return newstruct cs2func_script_996_struct(60, 17003, "Members: Empowered earth staff", "Members can now wield " + "" + "empowered earth staves" + "" + " within Daemonheim."); + case 43: + return newstruct cs2func_script_996_struct(60, 16747, "Members: Soulbell hood (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "soulbell hoods" + "" + " within Daemonheim. (You also need level 60 Defence)."); + case 44: + return newstruct cs2func_script_996_struct(60, 17229, "Members: Soulbell robe top (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "soulbell robe tops" + "" + " within Daemonheim. (They also need level 60 Defence.)"); + case 45: + return newstruct cs2func_script_996_struct(60, 16857, "Members: Soulbell robe bottom (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "soulbell robe bottoms" + "" + " within Daemonheim. (They also need level 60 Defence.)"); + case 46: + return newstruct cs2func_script_996_struct(60, 17163, "Members: Soulbell gloves (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "soulbell gloves" + "" + " within Daemonheim. (They also need level 60 Defence.)"); + case 47: + return newstruct cs2func_script_996_struct(60, 16923, "Members: Soulbell boots (Tier 7)" + "
" + " (with 60 Defence)", "Members can now wear " + "" + "soulbell boots" + "" + " within Daemonheim. (They also need level 60 Defence.)"); + case 48: + return newstruct cs2func_script_996_struct(68, 17275, "Members: Hailstorm dagger" + "
" + " (with 68 Attack)", "Members can now wield " + "" + "hailstorm daggers" + "" + " within Daemonheim. (They also need level 68 Attack.)"); + case 49: + return newstruct cs2func_script_996_struct(68, 17293, "Members: Doomcore staff" + "
" + " (with 68 Attack)", "Members can now wield " + "" + "doomcore staves" + "" + " within Daemonheim. (They also need level 68 Attack.)"); + case 50: + return newstruct cs2func_script_996_struct(70, 17007, "Members: Empowered fire staff", "Members can now wield " + "" + "empowered fire staves" + "" + " within Daemonheim."); + case 51: + return newstruct cs2func_script_996_struct(70, 16749, "Members: Ectohood (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "ectohoods" + "" + " within Daemonheim. (They also need level 70 Defence.)"); + case 52: + return newstruct cs2func_script_996_struct(70, 17231, "Members: Ectorobe top (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "ectorobe tops" + "" + " within Daemonheim. (They also need level 70 Defence.)"); + case 53: + return newstruct cs2func_script_996_struct(70, 16859, "Members: Ectorobe bottom (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "ectorobe bottoms" + "" + " within Daemonheim. (They also need level 70 Defence.)"); + case 54: + return newstruct cs2func_script_996_struct(70, 17165, "Members: Ectogloves (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "ectogloves" + "" + " within Daemonheim. (They also need level 70 Defence.)"); + case 55: + return newstruct cs2func_script_996_struct(70, 16925, "Members: Ectoboots (Tier 8)" + "
" + " (with 70 Defence)", "Members can now wear " + "" + "ectoboots" + "" + " within Daemonheim. (They also need level 70 Defence.)"); + case 56: + return newstruct cs2func_script_996_struct(80, 17011, "Members: Empowered air staff", "Members can now wield " + "" + "empowered air staves" + "" + " within Daemonheim."); + case 57: + return newstruct cs2func_script_996_struct(80, 16751, "Members: Runic hood (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "runic hoods" + "" + " within Daemonheim. (They also need level 80 Defence.)"); + case 58: + return newstruct cs2func_script_996_struct(80, 17233, "Members: Runic robe top (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "runic robe tops" + "" + " within Daemonheim. (They also need level 80 Defence.)"); + case 59: + return newstruct cs2func_script_996_struct(80, 16861, "Members: Runic robe bottom (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "runic robe bottoms" + "" + " within Daemonheim. (They also need level 80 Defence.)"); + case 60: + return newstruct cs2func_script_996_struct(80, 17167, "Members: Runic gloves (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "runic gloves" + "" + " within Daemonheim. (They also need level 80 Defence.)"); + case 61: + return newstruct cs2func_script_996_struct(80, 16927, "Members: Runic boots (Tier 9)" + "
" + " (with 80 Defence)", "Members can now wear " + "" + "runic boots" + "" + " within Daemonheim. (They also need level 80 Defence.)"); + case 62: + return newstruct cs2func_script_996_struct(83, 17293, "Members: Doomcore staff", "Members can now wield " + "" + "doomcore staves" + "" + " within Daemonheim."); + case 63: + return newstruct cs2func_script_996_struct(90, 17015, "Members: Empowered catalytic staff", "Members can now wield " + "" + "empowered catalytic staves" + "" + " within Daemonheim."); + case 64: + return newstruct cs2func_script_996_struct(90, 16753, "Members: Spiritbloom hood (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "spiritbloom hoods" + "" + " within Daemonheim. (They also need level 90 Defence.)"); + case 65: + return newstruct cs2func_script_996_struct(90, 17235, "Members: Spiritbloom robe top (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "spiritbloom robe tops" + "" + " within Daemonheim. (They also need level 90 Defence.)"); + case 66: + return newstruct cs2func_script_996_struct(90, 16863, "Members: Spiritbloom robe bottom (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "spiritbloom robe bottoms" + "" + " within Daemonheim. (They also need level 90 Defence.)"); + case 67: + return newstruct cs2func_script_996_struct(90, 17169, "Members: Spiritbloom gloves (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "spiritbloom gloves" + "" + " within Daemonheim. (They also need level 90 Defence.)"); + case 68: + return newstruct cs2func_script_996_struct(90, 16929, "Members: Spiritbloom boots (Tier 10)" + "
" + " (with 90 Defence)", "Members can now wear " + "" + "spiritbloom boots" + "" + " within Daemonheim. (They also need level 90 Defence.)"); + case 69: + return newstruct cs2func_script_996_struct(99, 17015, "Members: Celestial catalytic staff", "Members can now wield " + "" + "celestial catalytic staves" + "" + " within Daemonheim."); + case 70: + return newstruct cs2func_script_996_struct(99, 16755, "Members: Celestial hood (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "celestial hoods" + "" + " within Daemonheim. (They also need level 99 Defence.)"); + case 71: + return newstruct cs2func_script_996_struct(99, 17237, "Members: Celestial robe top (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "celestial robe tops" + "" + " within Daemonheim. (They also need level 99 Defence.)"); + case 72: + return newstruct cs2func_script_996_struct(99, 16865, "Members: Celestial robe bottom (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "celestial robe bottoms" + "" + " within Daemonheim. (They also need level 99 Defence.)"); + case 73: + return newstruct cs2func_script_996_struct(99, 17171, "Members: Celestial gloves (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "celestial gloves" + "" + " within Daemonheim. (They also need level 99 Defence.)"); + case 74: + return newstruct cs2func_script_996_struct(99, 16931, "Members: Celestial boots (Tier 11)" + "
" + " (with 99 Defence)", "Members can now wear " + "" + "celestial boots" + "" + " within Daemonheim. (They also need level 99 Defence.)"); + } + break; + case 10: + SWITCH (arg1) { + case 0: + GOTO flow_299 + case 1: + GOTO flow_300 + case 2: + GOTO flow_301 + case 3: + GOTO flow_302 + case 4: + GOTO flow_303 + } + break; + flow_299: + return newstruct cs2func_script_996_struct(1, 1907, "Wizard's Mind Bomb" + "
" + " will temporarily increase your Magic level by 2 levels.", "" + "Wizard's Mind Bomb" + "" + " will now temporarily increase your Magic level by " + "" + "2 levels" + "" + "."); + flow_300: + return newstruct cs2func_script_996_struct(50, 1907, "Wizard's Mind Bomb" + "
" + " will temporarily increase your Magic level by 3 levels.", "" + "Wizard's Mind Bomb" + "" + " will now temporarily increase your Magic level by " + "" + "3 levels" + "" + "."); + flow_301: + return newstruct cs2func_script_996_struct(66, 4675, "Members: Magic Guild", "Members can now enter the " + "" + "Wizard's Guild" + "" + "."); + flow_302: + return newstruct cs2func_script_996_struct(70, 20704, "Members: access to the Livid Farm (with 60 Agility, 60 Crafting, 60 Farming, 50 Construction and Lunar Diplomacy)", "Members can access the " + "" + "Livid Farm" + "" + " (with 60 Farming, 60 Agility, 60 Crafting, 50 Construction and Lunar Diplomacy)."); + flow_303: + return newstruct cs2func_script_996_struct(99, 9762, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Magic" + "" + ". Members can visit the " + "" + "robe store" + "" + " in the " + "" + "Wizards' Guild" + "" + ". They have something special that is only available to true masters of the " + "" + "Magic" + "" + " skill!"); + } + return newstruct cs2func_script_996_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/997.cs2 b/dumps/scripts/997.cs2 new file mode 100644 index 000000000..42dacb9c3 --- /dev/null +++ b/dumps/scripts/997.cs2 @@ -0,0 +1,21 @@ +cs2func_script_997_struct(1,1,0) script_997(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_997_struct(0, "Techniques"); + case 1: + return newstruct cs2func_script_997_struct(0, "Catches"); + case 2: + return newstruct cs2func_script_997_struct(1, "Barbarian"); + case 3: + return newstruct cs2func_script_997_struct(1, "Multiple Catch"); + case 4: + return newstruct cs2func_script_997_struct(0, "Other"); + case 5: + return newstruct cs2func_script_997_struct(1, "Minigames"); + case 6: + return newstruct cs2func_script_997_struct(0, "Dungeoneering"); + case 7: + return newstruct cs2func_script_997_struct(0, "Milestones"); + } + return newstruct cs2func_script_997_struct(-1, ""); +} diff --git a/dumps/scripts/998.cs2 b/dumps/scripts/998.cs2 new file mode 100644 index 000000000..98b6122ea --- /dev/null +++ b/dumps/scripts/998.cs2 @@ -0,0 +1,212 @@ +cs2func_script_998_struct(2,2,0) script_998(int arg0,int arg1) { + switch (arg0) { + flow_1: + case 0: + switch (arg1) { + case 0: + return newstruct cs2func_script_998_struct(1, 303, "Small net", "You can now fish with a " + "" + "small net" + "" + "."); + case 1: + return newstruct cs2func_script_998_struct(1, 13431, "Crayfish cage", "You can now fish with a " + "" + "crayfish cage" + "" + "."); + case 2: + return newstruct cs2func_script_998_struct(5, 307, "Bait fishing", "You can now fish with " + "" + "fishing rods" + "" + " and bait" + "" + "."); + case 3: + return newstruct cs2func_script_998_struct(16, 305, "Members: Big net", "Members can now fish with " + "" + "big nets" + "" + "."); + case 4: + return newstruct cs2func_script_998_struct(20, 309, "Fly fishing rod", "You can now fish with " + "" + "fly fishing rods" + "" + " and " + "" + "feathers" + "" + "."); + case 5: + return newstruct cs2func_script_998_struct(35, 311, "Harpoon", "You can now fish with " + "" + "harpoons" + "" + "."); + case 6: + return newstruct cs2func_script_998_struct(40, 301, "Lobster pot", "You can now fish with " + "" + "lobster pots" + "" + "."); + case 7: + return newstruct cs2func_script_998_struct(40, 14109, "Members: Sacred clay harpoon", "Members can now use " + "" + "sacred clay harpoons" + "" + "."); + case 8: + return newstruct cs2func_script_998_struct(40, 14101, "Members: Volatile harpoon", "Members can now use " + "" + "volatile harpoons" + "" + "."); + case 9: + return newstruct cs2func_script_998_struct(48, 11323, "Members: Heavy rod" + "
" + " (with 15 Agility and 15 Strength)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to fish with " + "" + "heavy rods" + "" + ". (They also need level 15 Agility and level 15 Strength.)"); + case 10: + return newstruct cs2func_script_998_struct(65, 3157, "Members: Vessel fishing" + "
" + " (after starting Tai Bwo Wannai Trio)", "Members now have the Fishing level required to use " + "" + "karambwan vessels" + "" + " to fish for " + "" + "karambwan" + "" + " (after starting Tai Bwo Wannai Trio)."); + case 11: + return newstruct cs2func_script_998_struct(65, 12860, "Swordfish gloves", "You can now wear " + "" + "swordfish gloves" + "" + "."); + case 12: + return newstruct cs2func_script_998_struct(70, 20891, "Members: Small cast net (after completing Deadliest Catch)", "You can now fish with " + "" + "small cast nets" + "" + " (after completing Deadliest Catch)."); + case 13: + return newstruct cs2func_script_998_struct(70, 20892, "Members: Big cast net (after completing Deadliest Catch)", "Members can now fish with " + "" + "big cast nets" + "" + " (after completing Deadliest Catch)."); + case 14: + return newstruct cs2func_script_998_struct(90, 12861, "Members: Shark gloves", "Members can now wear " + "" + "shark gloves" + "" + "."); + } + break; + case 1: + switch (arg1) { + case 0: + return newstruct cs2func_script_998_struct(1, 317, "Shrimp - Net fishing", "You can now catch " + "" + "shrimp" + "" + " with a net."); + case 1: + return newstruct cs2func_script_998_struct(1, 13435, "Crayfish - Crayfish cage", "You can now catch " + "" + "crayfish" + "" + " with a crayfish cage."); + case 2: + return newstruct cs2func_script_998_struct(5, 327, "Sardine - Sea bait fishing", "You can now catch " + "" + "sardines" + "" + " with a fishing rod."); + case 3: + return newstruct cs2func_script_998_struct(5, 3150, "Members: Karambwanji - Net fishing", "Members can now catch " + "" + "karabwanji" + "" + " with a net."); + case 4: + return newstruct cs2func_script_998_struct(10, 345, "Herring - Sea bait fishing", "You can now catch " + "" + "herring" + "" + " with a fishing rod."); + case 5: + return newstruct cs2func_script_998_struct(15, 321, "Anchovies - Net fishing", "You can now catch " + "" + "anchovies" + "" + " with a net."); + case 6: + return newstruct cs2func_script_998_struct(16, 353, "Members: Mackerel - Big net fishing", "Members can now catch " + "" + "mackerel" + "" + " with a big net."); + case 7: + return newstruct cs2func_script_998_struct(16, 407, "Members: Oyster - Big net fishing", "Members can now catch " + "" + "oysters" + "" + " with a big net."); + case 8: + return newstruct cs2func_script_998_struct(16, 405, "Members: Casket - Big net fishing", "Members can now catch " + "" + "caskets" + "" + " with a big net."); + case 9: + return newstruct cs2func_script_998_struct(16, 401, "Members: Seaweed - Big net fishing", "Members can now catch " + "" + "seaweed" + "" + " with a big net."); + case 10: + return newstruct cs2func_script_998_struct(20, 335, "Trout - Fly-fishing", "You can now catch " + "" + "trout" + "" + " with a fly-fishing rod."); + case 11: + return newstruct cs2func_script_998_struct(23, 341, "Members: Cod - Big net fishing", "Members can now catch " + "" + "cod" + "" + " with a big net."); + case 12: + return newstruct cs2func_script_998_struct(25, 349, "Pike - River bait fishing", "You can now catch " + "" + "pike" + "" + " with a fishing rod."); + case 13: + return newstruct cs2func_script_998_struct(28, 3379, "Members: Slimy eel - River bait fishing", "Members can now catch " + "" + "slimy eels" + "" + " with a fishing rod."); + case 14: + return newstruct cs2func_script_998_struct(30, 331, "Salmon - Fly-fishing", "You can now catch " + "" + "salmon" + "" + " with a fly-fishing rod."); + case 15: + return newstruct cs2func_script_998_struct(33, 5004, "Members: Giant frogspawn - Net fishing", "Members can now catch " + "" + "giant frogspawn" + "" + " with a net."); + case 16: + return newstruct cs2func_script_998_struct(35, 359, "Tuna - Harpoon fishing", "You can now catch " + "" + "tuna" + "" + " with a harpoon."); + case 17: + return newstruct cs2func_script_998_struct(38, 10138, "Members: Rainbow fish - Stripy fly-fishing", "Members can now catch " + "" + "rainbow fish" + "" + " with a fly-fishing rod."); + case 18: + return newstruct cs2func_script_998_struct(38, 5001, "Members: Cave eel - River bait fishing", "Members can now catch " + "" + "cave eels" + "" + " with a fishing rod."); + case 19: + return newstruct cs2func_script_998_struct(40, 377, "Lobster - Lobster pot fishing", "You can now catch " + "" + "lobsters" + "" + " with a lobster pot."); + case 20: + return newstruct cs2func_script_998_struct(46, 363, "Members: Bass - Big net fishing", "Members can now catch " + "" + "bass" + "" + " with a big net."); + case 21: + return newstruct cs2func_script_998_struct(50, 371, "Swordfish - Harpoon fishing", "You can now catch " + "" + "swordfish" + "" + " with a harpoon."); + case 22: + return newstruct cs2func_script_998_struct(53, 2148, "Members: Lava eel - Bait fishing (oily fishing rod)", "Members can now catch " + "" + "lava eels" + "" + " with an oily fishing rod."); + case 23: + return newstruct cs2func_script_998_struct(62, 7944, "Members: Monkfish - Net fishing", "Members can now catch " + "" + "monkfish" + "" + " with a net."); + case 24: + return newstruct cs2func_script_998_struct(65, 3142, "Members: Karambwan - Vessel fishing", "Members can now catch " + "" + "karambwan" + "" + " with a karambwan vessel in Karamja."); + case 25: + return newstruct cs2func_script_998_struct(76, 383, "Members: Shark - Harpoon fishing", "Members can now catch " + "" + "sharks" + "" + " with a harpoon."); + case 26: + return newstruct cs2func_script_998_struct(79, 395, "Members: Sea turtle - Fishing Trawler", "Members can now catch " + "" + "sea turtles" + "" + " in Fishing Trawler."); + case 27: + return newstruct cs2func_script_998_struct(81, 389, "Members: Manta ray - Fishing Trawler", "Members can now catch " + "" + "manta rays" + "" + " in Fishing Trawler."); + case 28: + return newstruct cs2func_script_998_struct(85, 15264, "Members: Cavefish - Cave bait fishing", "Members can now catch " + "" + "cavefish" + "" + " with a fishing rod."); + case 29: + return newstruct cs2func_script_998_struct(90, 15270, "Members: Rocktail - Living minerals cave bait fishing", "Members can now catch " + "" + "rocktails" + "" + " with a fishing rod."); + case 30: + return newstruct cs2func_script_998_struct(95, 21520, "Members: Tiger shark - Fishing Trawler", "Members can now catch " + "" + "tiger sharks" + "" + " in Fishing Trawler."); + } + break; + case 2: + switch (arg1) { + case 0: + return newstruct cs2func_script_998_struct(-1, 7620, "To start fishing like a barbarian, talk to Otto Godblessed when you have at least level 48 Fishing, level 15 Agility and level 15 Strength.", ""); + case 1: + return newstruct cs2func_script_998_struct(48, 11328, "Members: Leaping trout" + "
" + " (with 15 Strength and 15 Agility)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to catch " + "" + "leaping trout" + "" + " with a heavy rod. (They also need level 15 Agility and level 15 Strength.)"); + case 2: + return newstruct cs2func_script_998_struct(55, 359, "Members: Tuna" + "
" + " (with 35 Strength)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to catch " + "" + "tuna" + "" + " without a harpoon. (They also need level 35 Strength.)"); + case 3: + return newstruct cs2func_script_998_struct(55, 359, "Members: Possibility of catching two tuna in one fishing attempt" + "
" + " (with 35 Strength and 35 Agility)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to potentially catch two " + "" + "tuna" + "" + " in one attempt without a harpoon. (They also need level 35 Strength and 35 Agility.)"); + case 4: + return newstruct cs2func_script_998_struct(58, 11330, "Members: Leaping salmon" + "
" + " (with 30 Strength and 30 Agility)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to catch " + "" + "leaping salmon" + "" + " with a heavy rod. (They also need level 30 Agility and level 30 Strength.)"); + case 5: + return newstruct cs2func_script_998_struct(70, 371, "Members: Swordfish" + "
" + " (with 50 Strength)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to catch " + "" + "swordfish" + "" + " without a harpoon. (They also need level 50 Strength.)"); + case 6: + return newstruct cs2func_script_998_struct(70, 371, "Members: Possibility of catching two swordfish in one fishing attempt" + "
" + " (with 50 Strength and 50 Agility)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to catch two " + "" + "swordfish" + "" + " without a harpoon. (They also need level 50 Strength and 50 Agility.)"); + case 7: + return newstruct cs2func_script_998_struct(70, 11332, "Members: Leaping sturgeon" + "
" + " (with 45 Strength and 45 Agility)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to catch " + "" + "leaping sturgeon" + "" + " with a heavy rod. (They also need level 45 Agility and level 45 Strength.)"); + case 8: + return newstruct cs2func_script_998_struct(96, 383, "Members: Shark" + "
" + " (with 76 Strength)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to catch " + "" + "sharks" + "" + " without a harpoon. (They also need level 76 Strength.)"); + case 9: + return newstruct cs2func_script_998_struct(96, 383, "Members: Possibility of catching two sharks in one fishing attempt" + "
" + " (with 76 Strength and 76 Agility)", "Members who are versed in the art of barbarian fishing now have the Fishing level required to potentially catch two " + "" + "sharks" + "" + " in one attempt without a harpoon. (They also need level 76 Strength and 76 Agility.)"); + } + break; + case 3: + switch (arg1) { + case 0: + return newstruct cs2func_script_998_struct(35, 359, "Possibility of catching two tuna in one fishing attempt" + "
" + " (with 35 Agility)", "You now have the Fishing level required to potentially catch two " + "" + "tuna" + "" + " in one fishing attempt. (You also need level 35 Agility.)"); + case 1: + return newstruct cs2func_script_998_struct(50, 371, "Possibility of catching two swordfish in one fishing attempt" + "
" + " (with 50 Agility)", "You now have the Fishing level required to potentially catch two " + "" + "swordfish" + "" + " in one fishing attempt. (You also need level 50 Agility.)"); + case 2: + return newstruct cs2func_script_998_struct(76, 383, "Possibility of catching two sharks in one fishing attempt" + "
" + " (with 76 Agility)", "You now have the Fishing level required to potentially catch two " + "" + "sharks" + "" + " in one fishing attempt. (You also need level 76 Agility.)"); + } + break; + case 4: + switch (arg1) { + case 0: + return newstruct cs2func_script_998_struct(91, 18778, "Members: Starved ancient effigies", "Members can now investigate " + "" + "starved ancient effigies" + "" + " using their knowledge of Fishing."); + case 1: + return newstruct cs2func_script_998_struct(93, 18779, "Members: Nourished ancient effigies", "Members can now investigate " + "" + "nourished ancient effigies" + "" + " using their knowledge of Fishing."); + case 2: + return newstruct cs2func_script_998_struct(95, 18780, "Members: Sated ancient effigies", "Members can now investigate " + "" + "sated ancient effigies" + "" + " using their knowledge of Fishing."); + case 3: + return newstruct cs2func_script_998_struct(97, 18781, "Members: Gorged ancient effigies", "Members can now investigate " + "" + "gorged ancient effigies" + "" + " using their knowledge of Fishing."); + } + break; + case 5: + switch (arg1) { + case 0: + return newstruct cs2func_script_998_struct(1, 14142, "Members: Stealing Creation - class 1 harpoon", "Members can now use " + "" + "class 1 harpoons" + "" + " in Stealing Creation."); + case 1: + return newstruct cs2func_script_998_struct(20, 14184, "Members: Stealing Creation - catch class 2 sacred clay", "Members can now catch " + "" + "class 2 sacred clay" + "" + " in Stealing Creation."); + case 2: + return newstruct cs2func_script_998_struct(20, 14144, "Members: Stealing Creation - class 2 harpoon", "Members can now use " + "" + "class 2 harpoons" + "" + " in Stealing Creation."); + case 3: + return newstruct cs2func_script_998_struct(40, 14186, "Members: Stealing Creation - catch class 3 sacred clay", "Members can now catch " + "" + "class 3 sacred clay" + "" + " in Stealing Creation."); + case 4: + return newstruct cs2func_script_998_struct(40, 14146, "Members: Stealing Creation - class 3 harpoon", "Members can now use " + "" + "class 3 harpoons" + "" + " in Stealing Creation."); + case 5: + return newstruct cs2func_script_998_struct(60, 14188, "Members: Stealing Creation - catch class 4 sacred clay", "Members can now catch " + "" + "class 4 sacred clay" + "" + " in Stealing Creation."); + case 6: + return newstruct cs2func_script_998_struct(60, 14148, "Members: Stealing Creation - class 4 harpoon", "Members can now use " + "" + "class 4 harpoons" + "" + " in Stealing Creation."); + case 7: + return newstruct cs2func_script_998_struct(80, 14190, "Members: Stealing Creation - catch class 5 sacred clay", "Members can now catch " + "" + "class 5 sacred clay" + "" + " in Stealing Creation."); + case 8: + return newstruct cs2func_script_998_struct(80, 14150, "Members: Stealing Creation - class 5 harpoon", "Members can now use " + "" + "class 5 harpoons" + "" + " in Stealing Creation."); + } + break; + case 6: + switch (arg1) { + case 0: + return newstruct cs2func_script_998_struct(-1, 15707, "Dungeoneering skill tasks" + "
" + "As your Fishing level increases, you will be able to attempt higher-level fishing tasks within Daemonheim. You will also be more likely to succeed when attempting fishing tasks within Daemonheim.", ""); + case 1: + return newstruct cs2func_script_998_struct(1, 17797, "Heim crab (Tier 1)", "You can now catch " + "" + "heim crabs" + "" + " within Daemonheim."); + case 2: + return newstruct cs2func_script_998_struct(10, 17799, "Red-eye (Tier 2)", "You can now catch " + "" + "red-eye" + "" + " within Daemonheim."); + case 3: + return newstruct cs2func_script_998_struct(20, 17801, "Dusk eel (Tier 3)", "You can now catch " + "" + "dusk eels" + "" + " within Daemonheim."); + case 4: + return newstruct cs2func_script_998_struct(30, 17803, "Giant flatfish (Tier 4)", "You can now catch " + "" + "giant flatfish" + "" + " within Daemonheim."); + case 5: + return newstruct cs2func_script_998_struct(40, 17805, "Short-finned eel (Tier 5)", "You can now catch " + "" + "short-finned eels" + "" + " within Daemonheim."); + case 6: + return newstruct cs2func_script_998_struct(50, 17807, "Members: Web snipper (Tier 6)", "Members can now catch " + "" + "web snippers" + "" + " within Daemonheim."); + case 7: + return newstruct cs2func_script_998_struct(60, 17809, "Members: Bouldabass (Tier 7)", "Members can now catch " + "" + "bouldabass" + "" + " within Daemonheim."); + case 8: + return newstruct cs2func_script_998_struct(70, 17811, "Members: Salve eel (Tier 8)", "Members can now catch " + "" + "salve eels" + "" + " within Daemonheim."); + case 9: + return newstruct cs2func_script_998_struct(80, 17813, "Members: Blue crab (Tier 9)", "Members can now catch " + "" + "blue crabs" + "" + " within Daemonheim."); + case 10: + return newstruct cs2func_script_998_struct(90, 17815, "Members: Cave moray (Tier 10)", "Members can now catch " + "" + "cave morays" + "" + " within Daemonheim."); + } + break; + case 7: + SWITCH (arg1) { + case 0: + GOTO flow_99 + case 1: + GOTO flow_100 + } + break; + flow_99: + return newstruct cs2func_script_998_struct(68, 383, "Members: Fishing Guild", "Members can now enter the " + "" + "Fishing Guild" + "" + "."); + flow_100: + return newstruct cs2func_script_998_struct(99, 9798, "Skill mastery", "" + "Congratulations! You are now a master of " + "" + "Fishing" + "" + ". Members can visit the " + "" + "Master Fisherman" + "" + " at the " + "" + "Fishing Guild" + "" + ". He has something special that is only available to true masters of the " + "" + "Fishing" + "" + " skill!"); + } + return newstruct cs2func_script_998_struct(0, -1, "", ""); +} diff --git a/dumps/scripts/999.cs2 b/dumps/scripts/999.cs2 new file mode 100644 index 000000000..c1dd8b978 --- /dev/null +++ b/dumps/scripts/999.cs2 @@ -0,0 +1,31 @@ +cs2func_script_999_struct(1,1,0) script_999(int arg0) { + switch (arg0) { + case 0: + return newstruct cs2func_script_999_struct(1, "Weaving"); + case 1: + return newstruct cs2func_script_999_struct(0, "Armour"); + case 2: + return newstruct cs2func_script_999_struct(0, "Spinning"); + case 3: + return newstruct cs2func_script_999_struct(0, "Pottery"); + case 4: + return newstruct cs2func_script_999_struct(1, "Glass"); + case 5: + return newstruct cs2func_script_999_struct(0, "Jewellery"); + case 6: + return newstruct cs2func_script_999_struct(1, "Weaponry"); + case 7: + return newstruct cs2func_script_999_struct(1, "Pyre ships"); + case 8: + return newstruct cs2func_script_999_struct(1, "Objects"); + case 9: + return newstruct cs2func_script_999_struct(0, "Other"); + case 10: + return newstruct cs2func_script_999_struct(1, "Minigames"); + case 11: + return newstruct cs2func_script_999_struct(0, "Dungeoneering"); + case 12: + return newstruct cs2func_script_999_struct(0, "Milestones"); + } + return newstruct cs2func_script_999_struct(-1, ""); +} diff --git a/dumps/scripts/cs2mapping.txt b/dumps/scripts/cs2mapping.txt new file mode 100644 index 000000000..e0f526592 --- /dev/null +++ b/dumps/scripts/cs2mapping.txt @@ -0,0 +1,1472 @@ +Script 0 - [0,0,null,0]: null +Script 1 - [0,0,null,0]: null +Script 2 - [0,0,null,0]: null +Script 3 - [0,0,null,0]: null +Script 4 - [0,0,null,0]: null +Script 5 - [0,0,null,0]: null +Script 6 - [0,0,null,0]: null +Script 7 - [0,0,null,0]: null +Script 8 - [0,0,null,0]: null +Script 9 - [0,0,null,0]: null +Script 10 - [0,0,null,0]: null +Script 11 - [0,0,null,0]: null +Script 12 - [0,0,null,0]: null +Script 13 - [0,0,null,0]: null +Script 14 - [0,0,null,0]: null +Script 15 - [0,0,null,0]: null +Script 16 - [0,0,null,0]: null +Script 17 - [0,0,null,0]: null +Script 18 - [0,0,null,0]: null +Script 19 - [0,0,null,0]: null +Script 20 - [0,0,null,0]: null +Script 21 - [0,0,null,0]: null +Script 22 - [0,0,null,0]: null +Script 23 - [0,0,null,0]: null +Script 24 - [0,0,null,0]: null +Script 25 - [0,0,null,0]: null +Script 26 - [0,0,null,0]: null +Script 27 - [0,0,null,0]: null +Script 28 - [0,0,null,0]: null +Script 29 - [0,0,null,0]: null +Script 30 - [0,0,null,0]: null +Script 31 - [0,0,null,0]: null +Script 32 - [0,0,null,0]: null +Script 33 - [0,0,null,0]: null +Script 34 - [0,0,null,0]: null +Script 35 - [0,0,null,0]: null +Script 36 - [0,0,null,0]: null +Script 37 - [0,0,null,0]: null +Script 38 - [0,0,null,0]: null +Script 39 - [0,0,null,0]: null +Script 40 - [0,0,null,0]: null +Script 41 - [0,0,null,0]: null +Script 42 - [0,0,null,0]: null +Script 43 - [0,0,null,0]: null +Script 44 - [0,0,null,0]: null +Script 45 - [0,0,null,0]: null +Script 46 - [0,0,null,0]: null +Script 47 - [0,0,null,0]: null +Script 48 - [0,0,null,0]: null +Script 49 - [0,0,null,0]: null +Script 50 - [0,0,null,0]: null +Script 51 - [0,0,null,0]: null +Script 52 - [0,0,null,0]: null +Script 53 - [0,0,null,0]: null +Script 54 - [0,0,null,0]: null +Script 55 - [0,0,null,0]: null +Script 56 - [0,0,null,0]: null +Script 57 - [0,0,null,0]: null +Script 58 - [0,0,null,0]: null +Script 59 - [0,0,null,0]: null +Script 60 - [0,0,null,0]: null +Script 61 - [0,0,null,0]: null +Script 62 - [0,0,null,0]: null +Script 63 - [0,0,null,0]: null +Script 64 - [0,0,null,0]: null +Script 65 - [0,0,null,0]: null +Script 66 - [0,0,null,0]: null +Script 67 - [0,0,null,0]: null +Script 68 - [0,0,null,0]: null +Script 69 - [0,0,null,0]: null +Script 70 - [0,0,null,0]: null +Script 71 - [0,0,null,0]: null +Script 72 - [0,0,null,0]: null +Script 73 - [0,0,null,0]: null +Script 74 - [0,0,null,0]: null +Script 75 - [0,0,null,0]: null +Script 76 - [0,0,null,0]: null +Script 77 - [0,0,null,0]: null +Script 78 - [0,0,null,0]: null +Script 79 - [0,0,null,0]: null +Script 80 - [0,0,null,0]: null +Script 81 - [0,0,null,0]: null +Script 82 - [0,0,null,0]: null +Script 83 - [0,0,null,0]: null +Script 84 - [0,0,null,0]: null +Script 85 - [0,0,null,0]: null +Script 86 - [0,0,null,0]: null +Script 87 - [0,0,null,0]: null +Script 88 - [0,0,null,0]: null +Script 89 - [0,0,null,0]: null +Script 90 - [0,0,null,0]: null +Script 91 - [0,0,null,0]: null +Script 92 - [0,0,null,0]: null +Script 93 - [0,0,null,0]: null +Script 94 - [0,0,null,0]: null +Script 95 - [0,0,null,0]: null +Script 96 - [0,0,null,0]: null +Script 97 - [0,0,null,0]: null +Script 98 - [0,0,null,0]: null +Script 99 - [0,0,null,0]: null +Script 100 - [0,0,null,0]: null +Script 101 - [0,0,null,0]: null +Script 102 - [0,0,null,0]: null +Script 103 - [0,0,null,0]: null +Script 104 - [0,0,null,0]: null +Script 105 - [0,0,null,0]: null +Script 106 - [0,0,null,0]: null +Script 107 - [0,0,null,0]: null +Script 108 - [0,0,null,0]: null +Script 109 - [0,0,null,0]: null +Script 110 - [0,0,null,0]: null +Script 111 - [0,0,null,0]: null +Script 112 - [0,0,null,0]: null +Script 113 - [0,0,null,0]: null +Script 114 - [0,0,null,0]: null +Script 115 - [0,0,null,0]: null +Script 116 - [0,0,null,0]: null +Script 117 - [0,0,null,0]: null +Script 118 - [0,0,null,0]: null +Script 119 - [0,0,null,0]: null +Script 120 - [0,0,null,0]: null +Script 121 - [0,0,null,0]: null +Script 122 - [0,0,null,0]: null +Script 123 - [0,0,null,0]: null +Script 124 - [0,0,null,0]: null +Script 125 - [0,0,null,0]: null +Script 126 - [0,0,null,0]: null +Script 127 - [0,0,null,0]: null +Script 128 - [0,0,null,0]: null +Script 129 - [0,0,null,0]: null +Script 130 - [0,0,null,0]: null +Script 131 - [0,0,null,0]: null +Script 132 - [0,0,null,0]: null +Script 133 - [0,0,null,0]: null +Script 134 - [0,0,null,0]: null +Script 135 - [0,0,null,0]: null +Script 136 - [0,0,null,0]: null +Script 137 - [0,0,null,0]: null +Script 138 - [0,0,null,0]: null +Script 139 - [0,0,null,0]: null +Script 140 - [0,0,null,0]: null +Script 141 - [0,0,null,0]: null +Script 142 - [0,0,null,0]: null +Script 143 - [0,0,null,0]: null +Script 144 - [0,0,null,0]: null +Script 145 - [0,0,null,0]: null +Script 146 - [0,0,null,0]: null +Script 147 - [0,0,null,0]: null +Script 148 - [0,0,null,0]: null +Script 149 - [0,0,null,0]: null +Script 150 - [0,0,null,0]: null +Script 151 - [0,0,null,0]: null +Script 152 - [0,0,null,0]: null +Script 153 - [0,0,null,0]: null +Script 154 - [0,0,null,0]: null +Script 155 - [0,0,null,0]: null +Script 156 - [0,0,null,0]: null +Script 157 - [0,0,null,0]: null +Script 158 - [0,0,null,0]: null +Script 159 - [0,0,null,0]: null +Script 160 - [0,0,null,0]: null +Script 161 - [0,0,null,0]: null +Script 162 - [0,0,null,0]: null +Script 163 - [0,0,null,0]: null +Script 164 - [0,0,null,0]: null +Script 165 - [0,0,null,0]: null +Script 166 - [0,0,null,0]: null +Script 167 - [0,0,null,0]: null +Script 168 - [0,0,null,0]: null +Script 169 - [0,0,null,0]: null +Script 170 - [0,0,null,0]: null +Script 171 - [0,0,null,0]: null +Script 172 - [0,0,null,0]: null +Script 173 - [0,0,null,0]: null +Script 174 - [0,0,null,0]: null +Script 175 - [0,0,null,0]: null +Script 176 - [0,0,null,0]: null +Script 177 - [0,0,null,0]: null +Script 178 - [0,0,null,0]: null +Script 179 - [0,0,null,0]: null +Script 180 - [0,0,null,0]: null +Script 181 - [0,0,null,0]: null +Script 182 - [0,0,null,0]: null +Script 183 - [0,0,null,0]: null +Script 184 - [0,0,null,0]: null +Script 185 - [0,0,null,0]: null +Script 186 - [0,0,null,0]: null +Script 187 - [0,0,null,0]: null +Script 188 - [0,0,null,0]: null +Script 189 - [0,0,null,0]: null +Script 190 - [0,0,null,0]: null +Script 191 - [0,0,null,0]: null +Script 192 - [0,0,null,0]: null +Script 193 - [0,0,null,0]: null +Script 194 - [0,0,null,0]: null +Script 195 - [0,0,null,0]: null +Script 196 - [0,0,null,0]: null +Script 197 - [0,0,null,0]: null +Script 198 - [0,0,null,0]: null +Script 199 - [0,0,null,0]: null +Script 200 - [0,0,null,0]: null +Script 201 - [0,0,null,0]: null +Script 202 - [0,0,null,0]: null +Script 203 - [0,0,null,0]: null +Script 204 - [0,0,null,0]: null +Script 205 - [0,0,null,0]: null +Script 206 - [0,0,null,0]: null +Script 207 - [0,0,null,0]: null + f11=17956908, 12=17956909, 13=17956910, 14=17956911, 15=17956912, 17=17956914, 16=17956913, 19=17956916, 18=17956915, 21=17956918, 20=17956917, 23=17956920, 22=17956919, 25=17956922, 24=17956921, 27=17956924, 26=17956923, 29=17956926, 28=17956925, 31=17956928, 30=17956927, 34=17956931, 35=17956932, 32=17956929, 33=17956930, 38=17956935, 39=17956936, 36=17956933, 37=17956934, 42=17956939, 43=17956940, 40=17956937, 41=17956938, 46=17956943, 47=17956944, 44=17956941, 45=17956942, 51=17956948, 50=17956947, 49=17956946, 48=17956945, 55=17956952, 54=17956951, 53=17956950, 52=17956949, 59=17956956, 58=1 7956955, 57=17956954, 56=17956953, 63=17956960, 62=17956959, 61=17956958, 60=17956957, 68=17956965, 69=17956966, 70=17956967, 71=17956968, 64=17956961, 65=17956962, 66=17956963, 67=17956964, 76=17956973, 77=17956974, 78=17956975, 79=17956976, 72=17956969, 73=17956970, 74=17956971, 75=17956972, 85=17956982, 84=17956981, 87=17956984, 86=17956983, 81=17956978, 80=17956977, 83=17956980, 82=17956979, 93=17956990, 92=17956989, 95=17956992, 94=17956991, 89=17956986, 88=17956985, 91=17956988, 90=17956987, 102=17956999, 103=17957000, 100=17956997, 101=17956998, 98=17956995, 99=17956996, 96=17956993, 97=17956994, 110=17957007, 111=17957008, 108=17957005, 109=17957006, 106=17957003, 107=17957004, 104=17957001, 105=17957002, 119=17957016, 118=17957015, 117=17957014, 116=17957013, 115=17957012, 114=17957011, 113=17957010, 112=17957009} +Script 210 - [0,0,null,0]: null +Script 211 - [0,0,null,0]: null +Script 212 - [0,0,null,0]: null +Script 213 - [0,0,null,0]: null +Script 214 - [0,0,null,0]: null +Script 215 - [0,0,null,0]: null +Script 216 - [0,0,null,0]: null +Script 217 - [0,0,null,0]: null +Script 218 - [0,0,null,0]: null +Script 219 - [0,0,null,0]: null +Script 220 - [0,0,null,0]: null +Script 221 - [0,0,null,0]: null +Script 222 - [0,0,null,0]: null +Script 223 - [0,0,null,0]: null +Script 224 - [0,0,null,0]: null +Script 225 - [0,0,null,0]: null +Script 226 - [0,0,null,0]: null +Script 227 - [0,0,null,0]: null +Script 228 - [0,0,null,0]: null +Script 229 - [0,0,null,0]: null +Script 230 - [0,0,null,0]: null +Script 231 - [0,0,null,0]: null +Script 232 - [0,0,null,0]: null +Script 233 - [0,0,null,0]: null +Script 234 - [0,0,null,0]: null +Script 235 - [0,0,null,0]: null +Script 236 - [0,0,null,0]: null +Script 237 - [0,0,null,0]: null +Script 238 - [0,0,null,0]: null +Script 239 - [0,0,null,0]: null +Script 240 - [0,0,null,0]: null +Script 241 - [0,0,null,0]: null +Script 242 - [0,0,null,0]: null +Script 243 - [0,0,null,0]: null +Script 244 - [0,0,null,0]: null +Script 245 - [0,0,null,0]: null +Script 246 - [0,0,null,0]: null +Script 247 - [0,0,null,0]: null +Script 248 - [0,0,null,0]: null +Script 249 - [0,0,null,0]: null +Script 250 - [0,0,null,0]: null +Script 251 - [0,0,null,0]: null +Script 252 - [0,0,null,0]: null +Script 253 - [0,0,null,0]: null +Script 254 - [0,0,null,0]: null +Script 255 - [0,0,null,0]: null +Script 256 - [0,0,null,0]: null +Script 257 - [0,0,null,0]: null +Script 258 - [0,0,null,0]: null +Script 259 - [0,0,null,0]: null +Script 260 - [0,0,null,0]: null +Script 261 - [0,0,null,0]: null +Script 262 - [0,0,null,0]: null +Script 263 - [0,0,null,0]: null +Script 264 - [0,0,null,0]: null +Script 265 - [0,0,null,0]: null +Script 266 - [0,0,null,0]: null +Script 267 - [0,0,null,0]: null +Script 268 - [0,0,null,0]: null +Script 269 - [0,0,null,0]: null +Script 270 - [0,0,null,0]: null +Script 271 - [0,0,null,0]: null +Script 272 - [0,0,null,0]: null +Script 273 - [0,0,null,0]: null +Script 274 - [0,0,null,0]: null +Script 275 - [0,0,null,0]: null +Script 276 - [0,0,null,0]: null +Script 277 - [0,0,null,0]: null +Script 278 - [0,0,null,0]: null +Script 279 - [0,0,null,0]: null +Script 280 - [0,0,null,0]: null +Script 281 - [0,0,null,0]: null +Script 282 - [0,0,null,0]: null +Script 283 - [0,0,null,0]: null +Script 284 - [0,0,null,0]: null +Script 285 - [0,0,null,0]: null +Script 286 - [0,0,null,0]: null +Script 287 - [0,0,null,0]: null +Script 288 - [0,0,null,0]: null +Script 289 - [0,0,null,0]: null +Script 290 - [0,0,null,0]: null +Script 291 - [0,0,null,0]: null +Script 292 - [0,0,null,0]: null +Script 293 - [0,0,null,0]: null +Script 294 - [0,0,null,0]: null +Script 295 - [0,0,null,0]: null +Script 296 - [0,0,null,0]: null +Script 297 - [0,0,null,0]: null +Script 298 - [0,0,null,0]: null +Script 299 - [0,0,null,0]: null +Script 300 - [0,0,null,0]: null +Script 301 - [0,0,null,0]: null +Script 302 - [0,0,null,0]: null +Script 303 - [0,0,null,0]: null +Script 304 - [0,0,null,0]: null +Script 305 - [0,0,null,0]: null +Script 306 - [0,0,null,0]: null +Script 307 - [0,0,null,0]: null +Script 308 - [0,0,null,0]: null +Script 309 - [0,0,null,0]: null +Script 310 - [0,0,null,0]: null +Script 311 - [0,0,null,0]: null +Script 312 - [0,0,null,0]: null +Script 313 - [0,0,null,0]: null +Script 314 - [0,0,null,0]: null +Script 315 - [0,0,null,0]: null +Script 316 - [0,0,null,0]: null +Script 317 - [0,0,null,0]: null +Script 318 - [0,0,null,0]: null +Script 319 - [0,0,null,0]: null +Script 320 - [0,0,null,0]: null +Script 321 - [0,0,null,0]: null +Script 322 - [0,0,null,0]: null +Script 323 - [0,0,null,0]: null +Script 324 - [0,0,null,0]: null +Script 325 - [0,0,null,0]: null +Script 326 - [0,0,null,0]: null +Script 327 - [0,0,null,0]: null +Script 328 - [0,0,null,0]: null +Script 329 - [0,0,null,0]: null +Script 330 - [0,0,null,0]: null +Script 331 - [0,0,null,0]: null +Script 332 - [0,0,null,0]: null +Script 333 - [0,0,null,0]: null +Script 334 - [0,0,null,0]: null +Script 335 - [0,0,null,0]: null +Script 336 - [0,0,null,0]: null +Script 337 - [0,0,null,0]: null +Script 338 - [0,0,null,0]: null +Script 339 - [0,0,null,0]: null +Script 340 - [0,0,null,0]: null +Script 341 - [0,0,null,0]: null +Script 342 - [0,0,null,0]: null +Script 343 - [0,0,null,0]: null +Script 344 - [0,0,null,0]: null +Script 345 - [0,0,null,0]: null +Script 346 - [0,0,null,0]: null +Script 347 - [0,0,null,0]: null +Script 348 - [0,0,null,0]: null +Script 349 - [0,0,null,0]: null +Script 350 - [0,0,null,0]: null +Script 351 - [0,0,null,0]: null +Script 352 - [0,0,null,0]: null +Script 353 - [0,0,null,0]: null +Script 354 - [0,0,null,0]: null +Script 355 - [0,0,null,0]: null +Script 356 - [0,0,null,0]: null +Script 357 - [0,0,null,0]: null +Script 358 - [0,0,null,0]: null +Script 359 - [0,0,null,0]: null +Script 360 - [0,0,null,0]: null +Script 361 - [0,0,null,0]: null +Script 362 - [0,0,null,0]: null +Script 363 - [0,0,null,0]: null +Script 364 - [0,0,null,0]: null +Script 365 - [0,0,null,0]: null +Script 366 - [0,0,null,0]: null +Script 367 - [0,0,null,0]: null +Script 368 - [0,0,null,0]: null +Script 369 - [0,0,null,0]: null +Script 370 - [0,0,null,0]: null +Script 371 - [0,0,null,0]: null +Script 372 - [0,0,null,0]: null +Script 373 - [0,0,null,0]: null +Script 374 - [0,0,null,0]: null +Script 375 - [0,0,null,0]: null +Script 376 - [0,0,null,0]: null +Script 377 - [0,0,null,0]: null +Script 378 - [0,0,null,0]: null +Script 379 - [0,0,null,0]: null +Script 380 - [0,0,null,0]: null +Script 381 - [0,0,null,0]: null +Script 382 - [0,0,null,0]: null +Script 383 - [0,0,null,0]: null +Script 384 - [0,0,null,0]: null +Script 385 - [0,0,null,0]: null +Script 386 - [0,0,null,0]: null +Script 387 - [0,0,null,0]: null +Script 388 - [0,0,null,0]: null +Script 389 - [0,0,null,0]: null +Script 390 - [0,0,null,0]: null +Script 391 - [0,0,null,0]: null +Script 392 - [0,0,null,0]: null +Script 393 - [0,0,null,0]: null +Script 394 - [0,0,null,0]: null +Script 395 - [0,0,null,0]: null +Script 396 - [0,0,null,0]: null +Script 397 - [0,0,null,0]: null +Script 398 - [0,0,null,0]: null +Script 399 - [0,0,null,0]: null +Script 400 - [0,0,null,0]: null +Script 401 - [0,0,null,0]: null +Script 402 - [0,0,null,0]: null +Script 403 - [0,0,null,0]: null +Script 404 - [0,0,null,0]: null +Script 405 - [0,0,null,0]: null +Script 406 - [0,0,null,0]: null +Script 407 - [0,0,null,0]: null +Script 408 - [0,0,null,0]: null +Script 409 - [0,0,null,0]: null +Script 410 - [0,0,null,0]: null +Script 411 - [0,0,null,0]: null +Script 412 - [0,0,null,0]: null +Script 413 - [0,0,null,0]: null +Script 414 - [0,0,null,0]: null +Script 415 - [0,0,null,0]: null +Script 416 - [0,0,null,0]: null +Script 417 - [0,0,null,0]: null +Script 418 - [0,0,null,0]: null +Script 419 - [0,0,null,0]: null +Script 420 - [0,0,null,0]: null +Script 421 - [0,0,null,0]: null +Script 422 - [0,0,null,0]: null +Script 423 - [0,0,null,0]: null +Script 424 - [0,0,null,0]: null +Script 425 - [0,0,null,0]: null +Script 426 - [0,0,null,0]: null +Script 427 - [0,0,null,0]: null +Script 428 - [0,0,null,0]: null +Script 429 - [0,0,null,0]: null +Script 430 - [0,0,null,0]: null +Script 431 - [0,0,null,0]: null +Script 432 - [0,0,null,0]: null +Script 433 - [0,0,null,0]: null +Script 434 - [0,0,null,0]: null +Script 435 - [0,0,null,0]: null +Script 436 - [0,0,null,0]: null +Script 437 - [0,0,null,0]: null +Script 438 - [0,0,null,0]: null +Script 439 - [0,0,null,0]: null +Script 440 - [0,0,null,0]: null +Script 441 - [0,0,null,0]: null +Script 442 - [0,0,null,0]: null +Script 443 - [0,0,null,0]: null +Script 444 - [0,0,null,0]: null +Script 445 - [0,0,null,0]: null +Script 446 - [0,0,null,0]: null +Script 447 - [0,0,null,0]: null +Script 448 - [0,0,null,0]: null +Script 449 - [0,0,null,0]: null +Script 450 - [0,0,null,0]: null +Script 451 - [0,0,null,0]: null +Script 452 - [0,0,null,0]: null +Script 453 - [0,0,null,0]: null +Script 454 - [0,0,null,0]: null +Script 455 - [0,0,null,0]: null +Script 456 - [0,0,null,0]: null +Script 457 - [0,0,null,0]: null +Script 458 - [0,0,null,0]: null +Script 459 - [0,0,null,0]: null +Script 460 - [0,0,null,0]: null +Script 461 - [0,0,null,0]: null +Script 462 - [0,0,null,0]: null +Script 463 - [0,0,null,0]: null +Script 464 - [0,0,null,0]: null +Script 465 - [0,0,null,0]: null +Script 466 - [0,0,null,0]: null +Script 467 - [0,0,null,0]: null +Script 468 - [0,0,null,0]: null +Script 469 - [0,0,null,0]: null +Script 470 - [0,0,null,0]: null +Script 471 - [0,0,null,0]: null +Script 472 - [0,0,null,0]: null +Script 473 - [0,0,null,0]: null +Script 474 - [0,0,null,0]: null +Script 475 - [0,0,null,0]: null +Script 476 - [0,0,null,0]: null +Script 477 - [0,0,null,0]: null +Script 478 - [0,0,null,0]: null +Script 479 - [0,0,null,0]: null +Script 480 - [0,0,null,0]: null +Script 481 - [0,0,null,0]: null +Script 482 - [0,0,null,0]: null +Script 483 - [0,0,null,0]: null +Script 484 - [0,0,null,0]: null +Script 485 - [0,0,null,0]: null +Script 486 - [0,0,null,0]: null +Script 487 - [0,0,null,0]: null +Script 488 - [0,0,null,0]: null +Script 489 - [0,0,null,0]: null +Script 490 - [0,0,null,0]: null +Script 491 - [0,0,null,0]: null +Script 492 - [0,0,null,0]: null +Script 493 - [0,0,null,0]: null +Script 494 - [0,0,null,0]: null +Script 495 - [0,0,null,0]: null +Script 496 - [0,0,null,0]: null +Script 497 - [0,0,null,0]: null +Script 498 - [0,0,null,0]: null +Script 499 - [0,0,null,0]: null +Script 500 - [0,0,null,0]: null +Script 501 - [0,0,null,0]: null +Script 502 - [0,0,null,0]: null +Script 503 - [0,0,null,0]: null +Script 504 - [73,115,zzz,0]: {17956878=Black Knights' Fortress, 17956879=Cook's Assistant, 17956881=Doric's Quest, 17956880=Demon Slayer, 17956883=Ernest the Chicken, 17956882=Dragon Slayer, 17956885=Imp Catcher, 17956884=Goblin Diplomacy, 17956887=Pirate's Treasure, 17956886=Knight's Sword, The, 17956889=Restless Ghost, The, 17956888=Prince Ali Rescue, 17956891=Rune Mysteries, 17956890=Romeo & Juliet, 17956893=Shield of Arrav, 17956892=Sheep Shearer, 17956895=Witch's Potion, 17956894=Vampire Slayer, 17956898=Between a Rock..., 17956899=Big Chompy Bird Hunting, 17956897=Animal Magnetism, 17956902=Clock Tower, 17956903=Contact!, 17956900=Biohazard, 17956901=Cabin Fever, 17956906=Darkness of Hallowvale, 17956907=Death to the Dorgeshuun, 17956904=Zogre Flesh Eaters, 17956905=Creature of Fenkenstrain, 17956910=Devious Minds, 17956911=Dig Site, The, 17956908=Death Plateau, 17956909=Desert Treasure, 17956915=Eagles' Peak, 17956914=Eadgar's Ruse, 17956913=Dwarf Cannon, 17956912=Druidic Ritual, 17956919=Enlightened Journey, 17956918=Enakhra's Lament, 17956917=Elemental Workshop II, 17956916=Elemental Workshop I, 17956923=Family Crest, 17956922=Fairytale II - Cure a Queen, 17956921=Fairytale I - Growing Pains, 17956920=Eyes of Glouphrie, The, 17956927=Forgettable Tale..., 17956926=Fishing Contest, 17956925=Fight Arena, 17956924=Feud, The, 17956932=Ghosts Ahoy, 17956933=Giant Dwarf, The, 17956934=Golem, The, 17956935=Grand Tree, The, 17956928=Fremennik Trials, The, 17956929=Waterfall Quest, 17956930=Garden of Tranquillity, 17956931=Gertrude's Cat, 17956940=Holy Grail, 17956941=Horror from the Deep, 17956942=Icthlarin's Little Helper, 17956943=In Aid of the Myreque, 17956936=Hand in the Sand, The, 17956937=Haunted Mine, 17956938=Hazeel Cult, 17956939=Heroes' Quest, 17956949=Lunar Diplomacy, 17956948=Lost Tribe, The, 17956951=Merlin's Crystal, 17956950=Making History, 17956945=Jungle Potion, 17956944=In Search of the Myreque, 17956947=Lost City, 17956946=Legends' Quest, 17956957=Murder Mystery, 17956956=Mourning's Ends Part II, 17956959=Nature Spirit, 17956958=My Arm's Big Adventure, 17956953=Monk's Friend, 17956952=Monkey Madness, 17956955=Mourning's Ends Part I, 17956954=Mountain Daughter, 17956966=Recipe for Disaster, 17956967=Recruitment Drive, 17956964=Rag and Bone Man, 17956965=Ratcatchers, 17956962=Plague City, 17956963=Priest in Peril, 17956960=Observatory Quest, 17956961=One Small Favour, 17956974=Slug Menace, The, 17956975=Shades of Mort'ton, 17956972=Scorpion Catcher, 17956973=Sea Slug, 17956970=Royal Trouble, 17956971=Rum Deal, 17956968=Regicide, 17956969=Roving Elves, 17956983=Tail of Two Cats, A, 17956982=Tai Bwo Wannai Trio, 17956981=Swan Song, 17956980=Spirits of the Elid, 17956979=Soul's Bane, A, 17956978=Shilo Village, 17956977=Sheep Herder, 17956976=Shadow of the Storm, 17956991=Troll Romance, 17956990=Tribal Totem, 17956989=Tree Gnome Village, 17956988=Witch's House, 17956987=Tourist Trap, The, 17956986=Throne of Miscellania, 17956985=Temple of Ikov, 17956984=Tears of Guthix, 17957001=Olaf's Quest, 17957000=What Lies Below, 17957003=Dream Mentor, 17957002=Another Slice of H.A.M., 17957005=King's Ransom, 17957004=Grim Tales, 17957007=Back to my Roots, 17957006=Path of Glouphrie, The, 17956993=Underground Pass, 17956992=Troll Stronghold, 17956995=Watchtower, 17956994=Wanted!, 17956997=Fremennik Isles, The, 17956996=Cold War, 17956999=Great Brain Robbery, The, 17956998=Tower of Life, 17957016=TokTz-Ket-Dill, 17957008=Land of the Goblins, 17957009=Dealing with Scabaras, 17957010=Wolf Whistle, 17957011=As a First Resort..., 17957012=Catapult Construction, 17957013=Kennith's Concerns, 17957014=Legacy of Seergaze, 17957015=Perils of Ice Mountain} +Script 505 - [0,0,null,0]: null +Script 506 - [0,0,null,0]: null +Script 507 - [0,0,null,0]: null +Script 508 - [0,0,null,0]: null +Script 509 - [0,0,null,0]: null +Script 510 - [0,0,null,0]: null +Script 511 - [0,0,null,0]: null +Script 512 - [0,0,null,0]: null +Script 513 - [0,0,null,0]: null +Script 514 - [0,0,null,0]: null +Script 515 - [0,0,null,0]: null +Script 516 - [0,0,null,0]: null +Script 517 - [0,0,null,0]: null +Script 518 - [0,0,null,0]: null +Script 519 - [0,0,null,0]: null +Script 520 - [0,0,null,0]: null +Script 521 - [0,0,null,0]: null +Script 522 - [0,0,null,0]: null +Script 523 - [0,0,null,0]: null +Script 524 - [0,0,null,0]: null +Script 525 - [0,0,null,0]: null +Script 526 - [0,0,null,0]: null +Script 527 - [0,0,null,0]: null +Script 528 - [0,0,null,0]: null +Script 529 - [0,0,null,0]: null +Script 530 - [0,0,null,0]: null +Script 531 - [0,0,null,0]: null +Script 532 - [0,0,null,0]: null +Script 533 - [0,0,null,0]: null +Script 534 - [0,0,null,0]: null +Script 535 - [0,0,null,0]: null +Script 536 - [0,0,null,0]: null +Script 537 - [0,0,null,0]: null +Script 538 - [0,0,null,0]: null +Script 539 - [0,0,null,0]: null +Script 540 - [0,0,null,0]: null +Script 541 - [0,0,null,0]: null +Script 542 - [0,0,null,0]: null +Script 543 - [0,0,null,0]: null +Script 544 - [0,0,null,0]: null +Script 545 - [0,0,null,0]: null +Script 546 - [0,0,null,0]: null +Script 547 - [0,0,null,0]: null +Script 548 - [0,0,null,0]: null +Script 549 - [0,0,null,0]: null +Script 550 - [0,0,null,0]: null +Script 551 - [0,0,null,0]: null +Script 552 - [0,0,null,0]: null +Script 553 - [0,0,null,0]: null +Script 554 - [0,0,null,0]: null +Script 555 - [0,0,null,0]: null +Script 556 - [0,0,null,0]: null +Script 557 - [0,0,null,0]: null +Script 558 - [0,0,null,0]: null +Script 559 - [0,0,null,0]: null +Script 560 - [0,0,null,0]: null +Script 561 - [0,0,null,0]: null +Script 562 - [0,0,null,0]: null +Script 563 - [0,0,null,0]: null +Script 564 - [0,0,null,0]: null +Script 565 - [0,0,null,0]: null +Script 566 - [0,0,null,0]: null +Script 567 - [0,0,null,0]: null +Script 568 - [0,0,null,0]: null +Script 569 - [0,0,null,0]: null +Script 570 - [0,0,null,0]: null +Script 571 - [0,0,null,0]: null +Script 572 - [0,0,null,0]: null +Script 573 - [0,0,null,0]: null +Script 574 - [0,0,null,0]: null +Script 575 - [0,0,null,0]: null +Script 576 - [0,0,null,0]: null +Script 577 - [0,0,null,0]: null +Script 578 - [0,0,null,0]: null +Script 579 - [105,73,null,-1]: {0=8978436, 1=8978437, 2=8978438, 3=8978439, 4=8978440, 5=8978441, 6=8978442, 7=8978443, 8=8978444, 9=8978445, 10=8978446, 11=8978447, 12=8978448, 13=8978449, 14=8978450, 15=8978451, 17=8978453, 16=8978452, 19=8978455, 18=8978454, 21=8978457, 20=8978456, 23=8978459, 22=8978458, 25=8978461, 24=8978460, 27=8978463, 26=8978462, 29=8978465, 28=8978464, 31=8978467, 30=8978466, 34=8978470, 35=8978471, 32=8978468, 33=8978469, 38=8978474, 39=8978475, 36=8978472, 37=8978473, 42=8978478, 43=8978479, 40=8978476, 41=8978477, 46=8978482, 47=8978483, 44=8978480, 45=8978481, 51=8978487, 50=8978486, 49=8978485, 48=8978484, 55=8978491, 54=8978490, 53=8978489, 52=8978488, 59=8978495, 58=8978494, 57=8978493, 56=8978492, 63=8978499, 62=8978498, 61=8978497, 60=8978496, 68=8978504, 69=8978505, 70=8978506, 71=8978507, 64=8978500, 65=8978501, 66=8978502, 67=8978503, 76=8978512, 77=8978513, 78=8978514, 79=8978515, 72=8978508, 73=8978509, 74=8978510, 75=8978511, 85=8978521, 84=8978520, 87=8978523, 86=8978522, 81=8978517, 80=8978516, 83=8978519, 82=8978518, 93=8978529, 92=8978528, 95=8978531, 94=8978530, 89=8978525, 88=8978524, 91=8978527, 90=8978526, 98=8978534, 99=8978535, 96=8978532, 97=8978533} +Script 580 - [105,73,null,-1]: {0=35913812, 1=35913811, 2=35913810, 3=35913809, 4=35913808} +Script 581 - [0,0,null,0]: null +Script 582 - [0,0,null,0]: null +Script 583 - [0,0,null,0]: null +Script 584 - [0,0,null,0]: null +Script 585 - [0,0,null,0]: null +Script 586 - [0,0,null,0]: null +Script 587 - [0,0,null,0]: null +Script 588 - [0,0,null,0]: null +Script 589 - [0,0,null,0]: null +Script 590 - [0,0,null,0]: null +Script 591 - [0,0,null,0]: null +Script 592 - [0,0,null,0]: null +Script 593 - [0,0,null,0]: null +Script 594 - [0,0,null,0]: null +Script 595 - [0,0,null,0]: null +Script 596 - [0,0,null,0]: null +Script 597 - [0,0,null,0]: null +Script 598 - [0,0,null,0]: null +Script 599 - [0,0,null,0]: null +Script 600 - [0,0,null,0]: null +Script 601 - [0,0,null,0]: null +Script 602 - [0,0,null,0]: null +Script 603 - [0,0,null,0]: null +Script 604 - [0,0,null,0]: null +Script 605 - [0,0,null,0]: null +Script 606 - [0,0,null,0]: null +Script 607 - [0,0,null,0]: null +Script 608 - [0,0,null,0]: null +Script 609 - [0,0,null,0]: null +Script 610 - [0,0,null,0]: null +Script 611 - [0,0,null,0]: null +Script 612 - [0,0,null,0]: null +Script 613 - [0,0,null,0]: null +Script 614 - [0,0,null,0]: null +Script 615 - [0,0,null,0]: null +Script 616 - [111,105,null,0]: {7806=1, 7807=1, 8871=1, 4075=1, 1842=1, 5510=1, 7808=1, 5511=1, 7809=1, 10024=1, 431=1, 5509=1, 4657=1, 5514=1, 9067=1, 5515=1, 10023=1, 5512=1, 5513=1, 8949=1, 8950=1, 9433=1} +Script 617 - [0,0,null,0]: null +Script 618 - [0,0,null,0]: null +Script 619 - [0,0,null,0]: null +Script 620 - [0,0,null,0]: null +Script 621 - [0,0,null,0]: null +Script 622 - [0,0,null,0]: null +Script 623 - [0,0,null,0]: null +Script 624 - [0,0,null,0]: null +Script 625 - [0,0,null,0]: null +Script 626 - [0,0,null,0]: null +Script 627 - [0,0,null,0]: null +Script 628 - [0,0,null,0]: null +Script 629 - [0,0,null,0]: null +Script 630 - [0,0,null,0]: null +Script 631 - [0,0,null,0]: null +Script 632 - [0,0,null,0]: null +Script 633 - [0,0,null,0]: null +Script 634 - [0,0,null,0]: null +Script 635 - [0,0,null,0]: null +Script 636 - [0,0,null,0]: null +Script 637 - [0,0,null,0]: null +Script 638 - [0,0,null,0]: null +Script 639 - [0,0,null,0]: null +Script 640 - [0,0,null,0]: null +Script 641 - [0,0,null,0]: null +Script 642 - [0,0,null,0]: null +Script 643 - [0,0,null,0]: null +Script 644 - [0,0,null,0]: null +Script 645 - [0,0,null,0]: null +Script 646 - [0,0,null,0]: null +Script 647 - [0,0,null,0]: null +Script 648 - [0,0,null,0]: null +Script 649 - [0,0,null,0]: null +Script 650 - [0,0,null,0]: null +Script 651 - [0,0,null,0]: null +Script 652 - [0,0,null,0]: null +Script 653 - [0,0,null,0]: null +Script 654 - [0,0,null,0]: null +Script 655 - [0,0,null,0]: null +Script 656 - [0,0,null,0]: null +Script 657 - [0,0,null,0]: null +Script 658 - [0,0,null,0]: null +Script 659 - [0,0,null,0]: null +Script 660 - [0,0,null,0]: null +Script 661 - [0,0,null,0]: null +Script 662 - [0,0,null,0]: null +Script 663 - [0,0,null,0]: null +Script 664 - [0,0,null,0]: null +Script 665 - [0,0,null,0]: null +Script 666 - [0,0,null,0]: null +Script 667 - [0,0,null,0]: null +Script 668 - [0,0,null,0]: null +Script 669 - [0,0,null,0]: null +Script 670 - [0,0,null,0]: null +Script 671 - [0,0,null,0]: null +Script 672 - [0,0,null,0]: null +Script 673 - [0,0,null,0]: null +Script 674 - [0,0,null,0]: null +Script 675 - [0,0,null,0]: null +Script 676 - [0,0,null,0]: null +Script 677 - [0,0,null,0]: null +Script 678 - [0,0,null,0]: null +Script 679 - [0,0,null,0]: null +Script 680 - [83,115,this skill,0]: {0=Attack, 1=Defence, 2=Strength, 3=Hitpoints, 4=Ranged, 5=Prayer, 6=Magic, 7=Cooking, 8=Woodcutting, 9=Fletching, 10=Fishing, 11=Firemaking, 12=Crafting, 13=Smithing, 14=Mining, 15=Herblore, 17=Thieving, 16=Agility, 19=Farming, 18=Slayer, 21=Hunter, 20=Runecraft, 23=Summoning, 22=Construction} +Script 681 - [0,0,null,0]: null +Script 682 - [0,0,null,0]: null +Script 683 - [105,73,null,-1]: {0=35913731, 1=35913734, 2=35913737, 3=35913741, 4=35913745, 5=35913749, 6=35913753} +Script 684 - [105,73,null,-1]: {2=35913739, 3=35913743, 4=35913747, 5=35913751, 6=35913755} +Script 685 - [0,0,null,0]: null +Script 686 - [0,0,null,0]: null +Script 687 - [0,0,null,0]: null +Script 688 - [105,73,null,37617683]: {1=38207534, 2=38207540, 3=38207537, 4=38207536, 5=38207539, 6=38207538, 7=38207551, 8=38207550, 9=38207546, 10=38207547, 11=38207541, 12=38207549, 13=38207535, 14=38207542, 15=38207543, 17=38207548, 16=38207544, 19=38207552, 18=38207553, 21=38207558, 20=38207545, 23=38207554, 25=38207556, 24=38207555, 27=38207559, 26=38207557, 29=38207561, 28=38207560} +Script 689 - [0,0,null,0]: null +Script 690 - [0,0,null,0]: null +Script 691 - [0,0,null,0]: null +Script 692 - [0,0,null,0]: null +Script 693 - [0,0,null,0]: null +Script 694 - [0,0,null,0]: null +Script 695 - [0,0,null,0]: null +Script 696 - [0,0,null,0]: null +Script 697 - [0,0,null,0]: null +Script 698 - [0,0,null,0]: null +Script 699 - [0,0,null,0]: null +Script 700 - [0,0,null,0]: null +Script 701 - [0,0,null,0]: null +Script 702 - [0,0,null,0]: null +Script 703 - [0,0,null,0]: null +Script 704 - [0,0,null,0]: null +Script 705 - [0,0,null,0]: null +Script 706 - [0,0,null,0]: null +Script 707 - [0,0,null,0]: null +Script 708 - [0,0,null,0]: null +Script 709 - [0,0,null,0]: null +Script 710 - [0,0,null,0]: null +Script 711 - [0,0,null,0]: null +Script 712 - [0,0,null,0]: null +Script 713 - [0,0,null,0]: null +Script 714 - [0,0,null,0]: null +Script 715 - [0,0,null,0]: null +Script 716 - [105,105,null,0]: {2=83, 3=174, 4=276, 5=388, 6=512, 7=650, 8=801, 9=969, 10=1154, 11=1358, 12=1584, 13=1833, 14=2107, 15=2411, 17=3115, 16=2746, 19=3973, 18=3523, 21=5018, 20=4470, 23=6291, 22=5624, 25=7842, 24=7028, 27=9730, 26=8740, 29=12031, 28=10824, 31=14833, 30=13363, 34=20224, 35=22406, 32=16456, 33=18247, 38=30408, 39=33648, 36=24815, 37=27473, 42=45529, 43=50339, 40=37224, 41=41171, 46=67983, 47=75127, 44=55649, 45=61512, 51=111945, 50=101333, 49=91721, 48=83014, 55=166636, 54=150872, 53=136594, 52=123660, 59=247886, 58=224466, 57=203254, 56=184040, 63=368599, 62=333804, 61=302288, 60=273742, 68=605032, 69=668051, 70=737627, 71=814445, 64=407015, 65=449428, 66=496254, 67=547953, 76=1336443, 77=1475581, 78=1629200, 79=1798808, 72=899257, 73=992895, 74=1096278, 75=1210421, 85=3258594, 84=2951373, 87=3972294, 86=3597792, 81=2192818, 80=1986068, 83=2673114, 82=2421087, 93=7195629, 92=6517253, 95=8771558, 94=7944614, 89=4842295, 88=4385776, 91=5902831, 90=5346332, 98=11805606, 99=13034431, 96=9684577, 97=10692629} +Script 717 - [0,0,null,0]: null +Script 718 - [0,0,null,0]: null +Script 719 - [0,0,null,0]: null +Script 720 - [0,0,null,0]: null +Script 721 - [0,0,null,0]: null +Script 722 - [0,0,null,0]: null +Script 723 - [0,0,null,0]: null +Script 724 - [0,0,null,0]: null +Script 725 - [0,0,null,0]: null +Script 726 - [0,0,null,0]: null +Script 727 - [105,79,null,11760]: {1=1931, 2=954, 3=1265, 4=1925, 5=590, 6=2347, 7=1061, 8=839, 9=882, 10=329, 11=2327, 12=2309, 13=2142} +Script 728 - [105,79,null,11760]: {1=1205, 2=1203, 3=1207, 4=1209, 5=1211, 6=1213, 7=1321, 8=1323, 9=1325} +Script 729 - [105,79,null,11760]: {4=1823, 1=2309, 2=1891, 3=1901} +Script 730 - [105,79,null,11760]: {1=1755, 2=1592, 3=1597, 4=1595, 5=1733, 6=1734, 7=1599, 8=2976, 9=5523, 10=11065} +Script 731 - [105,79,null,11760]: {1=1931, 2=2169, 3=175} +Script 732 - [105,79,null,11760]: {1=4684, 2=1833, 3=1835, 4=1837, 5=950, 6=1734, 7=1733} +Script 733 - [105,79,null,11760]: {1=8794, 2=8790, 3=4819, 4=4820, 5=1539} +Script 734 - [105,79,null,11760]: {4=8788, 1=3420, 2=8786, 3=8784} +Script 735 - [105,79,null,11760]: {1=8417, 2=8419, 3=8421, 4=8423, 5=8425, 6=8427, 7=8429, 8=8431, 9=8433, 10=8435, 11=8437, 12=8439, 13=8441, 14=8443, 15=8445, 17=8449, 16=8447, 19=8453, 18=8451, 21=8457, 20=8455, 23=8461, 22=8459} +Script 736 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=590, 6=1755, 7=2347, 8=3424, 9=227, 10=1933, 11=3678} +Script 737 - [105,79,null,11760]: {1=3211, 2=3420, 3=8837, 4=1941, 5=960} +Script 738 - [105,79,null,11760]: {1=303, 2=307, 3=309, 4=311, 5=301, 6=313, 7=314, 8=305, 9=327} +Script 739 - [105,79,null,11760]: {1=1965, 2=1942, 3=1957, 4=1982, 5=1550} +Script 740 - [105,79,null,11760]: {1=303, 2=307, 3=309, 4=311, 5=301, 6=313, 7=314, 8=305, 9=327} +Script 741 - [105,79,null,11760]: {1=1965, 2=1942, 3=1957, 4=1982, 5=1550} +Script 742 - [105,79,null,11760]: {4=353, 1=1351, 2=590, 3=3363} +Script 743 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347} +Script 744 - [105,79,null,11760]: {1=3767, 2=3769, 3=3771, 4=3773, 5=3775, 6=3793, 7=3795, 8=5050, 9=5052, 10=5038, 11=5040, 12=5044, 13=5046, 14=5026, 15=5028, 17=5034, 16=5032} +Script 745 - [105,79,null,11760]: {4=1978, 1=1917, 2=5763, 3=1993} +Script 746 - [105,79,null,11760]: {8=1927, 1=2309, 2=1985, 3=1965, 4=1942, 5=1957, 6=1933, 7=1973} +Script 747 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=590, 6=1755, 7=2347, 8=952, 9=946} +Script 748 - [105,79,null,11760]: {1=1734, 2=1733, 3=1759, 4=1763, 5=1765, 6=1767, 7=1769, 8=1771, 9=1773} +Script 749 - [105,79,null,11760]: {1=884, 2=886, 3=888, 4=890, 5=892, 6=877, 7=843, 8=845, 9=837, 10=849, 11=847} +Script 750 - [105,79,null,11760]: {1=2309, 2=379, 3=1993, 4=1985, 5=1891} +Script 751 - [105,79,null,11760]: {1=9640, 2=9642, 3=9644, 4=9634, 5=9636, 6=9638} +Script 752 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=590, 5=2309, 6=3190, 7=3192, 8=3194, 9=3196, 10=3198, 11=3200, 12=3202} +Script 753 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=590, 5=2309, 6=3190, 7=3192, 8=3194, 9=3196, 10=3198, 11=3200, 12=3202, 13=3204} +Script 754 - [105,79,null,11760]: {1=954, 2=1523, 3=1755, 4=946, 5=5560, 6=864, 7=863, 8=865, 9=3095, 10=3096, 11=3097} +Script 755 - [105,79,null,11760]: {1=954, 2=1523, 3=1755, 4=946, 5=5560, 6=864, 7=863, 8=865, 9=3095, 10=3096, 11=3097, 12=9777} +Script 756 - [105,79,null,11760]: {1=954, 2=1523, 3=1755, 4=946, 5=5560, 6=864, 7=863, 8=865, 9=3095, 10=3096, 11=3097, 12=9778} +Script 757 - [105,79,null,11760]: {1=4315, 2=4335, 3=4355, 4=4375, 5=4395} +Script 758 - [105,79,null,11760]: {1=4317, 2=4337, 3=4357, 4=4377, 5=4397} +Script 759 - [105,79,null,11760]: {1=4319, 2=4339, 3=4359, 4=4379, 5=4399} +Script 760 - [105,79,null,11760]: {1=4321, 2=4341, 3=4361, 4=4381, 5=4401} +Script 761 - [105,79,null,11760]: {1=4323, 2=4343, 3=4363, 4=4383, 5=4403} +Script 762 - [105,79,null,11760]: {1=4325, 2=4345, 3=4365, 4=4385, 5=4405} +Script 763 - [105,79,null,11760]: {1=4327, 2=4347, 3=4367, 4=4387, 5=4407} +Script 764 - [105,79,null,11760]: {1=4329, 2=4349, 3=4369, 4=4389, 5=4409} +Script 765 - [105,79,null,11760]: {1=4331, 2=4351, 3=4371, 4=4391, 5=4411} +Script 766 - [105,79,null,11760]: {1=4333, 2=4353, 3=4373, 4=4393, 5=4413} +Script 767 - [105,79,null,11760]: {1=9068, 2=9069, 3=9070, 4=9071, 5=9072, 6=9073, 7=9074, 8=1733, 9=1734} +Script 768 - [105,79,null,11760]: {1=556, 2=555, 3=557, 4=554, 5=558, 6=559, 7=562, 8=561, 9=560, 10=563, 11=565, 12=566, 13=1387, 14=1383, 15=1381, 17=9078, 16=1385} +Script 769 - [105,79,null,11760]: {1=556, 2=555, 3=557, 4=554, 5=558, 6=559, 7=562, 8=561, 9=560, 10=563, 11=565, 12=566, 13=9075, 14=1387, 15=1383, 17=1385, 16=1381, 18=9078} +Script 770 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=9003} +Script 771 - [105,79,null,11760]: {1=2518} +Script 772 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=550, 11=9003, 12=954, 13=946, 14=1963, 15=1785, 17=307, 16=301, 19=9629, 18=1941, 21=1025, 20=3226} +Script 773 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347} +Script 774 - [105,79,null,11760]: {1=1093, 2=1079, 3=1113, 4=1099, 5=1065, 6=1193, 7=1151} +Script 775 - [105,79,null,11760]: {2=1973, 1=6794} +Script 776 - [105,79,null,11760]: {1=2309, 2=1891, 3=1901} +Script 777 - [105,79,null,11760]: {1=1755, 2=1592, 3=1597, 4=1733, 5=1734, 6=1759} +Script 778 - [105,79,null,11760]: {1=1714} +Script 779 - [105,79,null,11760]: {1=5048, 2=5036, 3=5042, 4=5024, 5=5030, 6=950} +Script 780 - [105,79,null,11760]: {1=1337, 2=1335, 3=1339, 4=1341, 5=1343, 6=1345} +Script 781 - [105,79,null,11760]: {1=1365, 2=1369, 3=1285, 4=1287, 5=1325, 6=1297, 7=1303, 8=853, 9=851, 10=888, 11=890} +Script 782 - [105,79,null,11760]: {1=1105, 2=1109, 3=1107, 4=1111, 5=1141, 6=1143, 7=1145, 8=1177, 9=1195} +Script 783 - [105,79,null,11760]: {1=1935, 2=1925, 3=590, 4=1755, 5=2347, 6=36, 7=596, 8=973, 9=1059, 10=229, 11=233, 12=954} +Script 784 - [105,79,null,11760]: {1=1265, 2=1269, 3=1273, 4=1271, 5=1275} +Script 785 - [105,79,null,11760]: {1=5050, 2=5052, 3=5038, 4=5040, 5=5044, 6=5046, 7=5026, 8=5028, 9=5032, 10=5034} +Script 786 - [105,79,null,11760]: {8=560, 1=554, 2=555, 3=556, 4=557, 5=558, 6=559, 7=562} +Script 787 - [105,79,null,11760]: {8=565, 1=554, 2=555, 3=556, 4=557, 5=558, 6=562, 7=560} +Script 788 - [105,79,null,11760]: {1=4844, 2=2878, 3=946} +Script 789 - [105,79,null,11760]: {1=554, 2=555, 3=556, 4=557, 5=558, 6=559, 7=561, 8=562, 9=563, 10=564, 11=560} +Script 790 - [105,79,null,11760]: {1=2415, 2=2416, 3=2417} +Script 791 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=590, 6=1755, 7=2347, 8=946, 9=1980} +Script 792 - [105,79,null,11760]: {1=1905, 2=1907, 3=1913} +Script 793 - [105,79,null,11760]: {1=1321, 2=1323, 3=1325, 4=1329, 5=2347} +Script 794 - [105,79,null,11760]: {4=2003, 1=1917, 2=7157, 3=1993} +Script 795 - [105,79,null,11760]: {1=317, 2=327, 3=345, 4=353, 5=341, 6=321} +Script 796 - [105,79,null,11760]: {1=7114, 2=7110, 3=7112, 4=7116, 5=7122, 6=7124, 7=7126, 8=7128, 9=7130, 10=7132, 11=7134, 12=7136, 13=7138} +Script 797 - [105,79,null,11760]: {1=8952, 2=8959, 3=8991, 4=8953, 5=8960, 6=8992, 7=8954, 8=8961, 9=8993, 10=8955, 11=8962, 12=8994, 13=8956, 14=8963, 15=8995, 17=8964, 16=8957, 19=8958, 18=8996, 21=8997, 20=8965, 23=8967, 22=8966, 25=8969, 24=8968, 27=8971, 26=8970, 29=8940, 28=8988, 30=8941} +Script 798 - [105,79,null,11760]: {1=347, 2=339, 3=361, 4=379, 5=373, 6=3144} +Script 799 - [105,79,null,11760]: {1=333, 2=365, 3=2289, 4=6705, 5=2003} +Script 800 - [105,79,null,11760]: {1=1363, 2=1365, 3=1369, 4=1277, 5=1279, 6=1281, 7=1283, 8=1285, 9=1287, 10=1291, 11=1293, 12=1295, 13=1297, 14=1299, 15=1301, 17=1203, 16=1205, 19=1217, 18=1207, 21=1211, 20=1209, 23=1420, 22=1422, 25=1428, 24=1424, 27=1307, 26=1430, 29=1311, 28=1309, 31=1315, 30=1313, 34=1101, 35=1105, 32=1317, 33=1103, 38=1141, 36=1139, 37=1137} +Script 801 - [105,79,null,11760]: {1=115, 2=121, 3=133} +Script 802 - [105,79,null,11760]: {1=6341, 2=6343, 3=6345, 4=6349, 5=6347, 6=6313, 7=6315, 8=6317, 9=6351, 10=6353, 11=6355, 12=6357, 13=6359, 14=6361, 15=6363, 17=6367, 16=6365, 19=6371, 18=6369, 21=6375, 20=6373, 23=6379, 22=6377} +Script 803 - [105,79,null,11760]: {1=2084, 2=2092, 3=2048, 4=2054, 5=2064, 6=2074, 7=2080} +Script 804 - [105,79,null,11760]: {1=10010, 2=10012, 3=10025, 4=10150, 5=10006, 6=10008, 7=10029, 8=596, 9=10031} +Script 805 - [105,79,null,11760]: {1=10010, 2=10012, 3=10025, 4=10150, 5=10006, 6=10008, 7=10029, 8=596, 9=10031} +Script 806 - [105,79,null,11760]: {1=596, 2=5014, 3=590} +Script 807 - [105,79,null,11760]: {1=10954, 2=10956, 3=10958} +Script 808 - [105,79,null,11760]: {8=1785, 1=596, 2=590, 3=1931, 4=1935, 5=1923, 6=1887, 7=954} +Script 809 - [105,79,null,11760]: null +Script 810 - [105,79,null,11760]: {4=9668, 1=5574, 2=5576, 3=5575} +Script 811 - [105,79,null,11760]: {1=5574, 2=5576, 3=5575, 4=9668, 5=9672, 6=9676, 7=9674, 8=9678, 9=9666, 10=9670} +Script 812 - [105,79,null,11760]: {2=3157, 1=3142} +Script 813 - [105,79,null,11760]: {1=3170, 2=3171, 3=3172, 4=3173, 5=3174, 6=3175, 7=3188} +Script 814 - [105,79,null,11760]: {1=6408, 2=6412, 3=6418, 4=6416, 5=4600} +Script 815 - [105,79,null,11760]: {1=6410, 2=6414, 3=6420, 4=6416, 5=4600} +Script 816 - [105,79,null,11760]: {8=6406, 1=6392, 2=6394, 3=6396, 4=6398, 5=6400, 6=6402, 7=6404} +Script 817 - [105,79,null,11760]: {1=6382, 2=6384, 3=6386, 4=6388, 5=6390} +Script 818 - [105,79,null,11760]: {4=557, 1=554, 2=555, 3=556} +Script 819 - [105,79,null,11760]: {1=561, 2=563, 3=562, 4=560, 5=558, 6=559, 7=565, 8=564, 9=566} +Script 820 - [0,0,null,0]: null +Script 821 - [105,79,null,11760]: {1=1265, 2=1351, 3=1349, 4=1353, 5=1363, 6=1365, 7=1369} +Script 822 - [105,79,null,11760]: {1=1277, 2=1279, 3=1281, 4=1283, 5=1285, 6=1287, 7=1291, 8=1293, 9=1295, 10=1297, 11=1299, 12=1301, 13=1205, 14=1203, 15=1207, 17=1209, 16=1217, 18=1211} +Script 823 - [105,79,null,11760]: {1=882, 2=884, 3=886, 4=888, 5=890, 6=877, 7=841, 8=839, 9=843, 10=845, 11=849, 12=847, 13=853, 14=851, 15=837} +Script 824 - [105,79,null,11760]: {1=886, 2=888, 3=890, 4=843, 5=845, 6=849, 7=847, 8=853, 9=851} +Script 825 - [105,79,null,11760]: {1=1379, 2=1389, 3=1381, 4=1383, 5=1385, 6=1387} +Script 826 - [105,79,null,11760]: {4=1329, 1=1321, 2=1323, 3=1325} +Script 827 - [105,79,null,11760]: {1=1422, 2=1420, 3=1424, 4=1428, 5=1430} +Script 828 - [105,79,null,11760]: {1=1375, 2=1363, 3=1365, 4=1367, 5=1369, 6=1371} +Script 829 - [105,79,null,11760]: {2=1215, 1=1305} +Script 830 - [105,79,null,11760]: {1=1307, 2=1309, 3=1311, 4=1313, 5=1315, 6=1317} +Script 831 - [105,79,null,11760]: {2=1434, 1=1377} +Script 832 - [105,79,null,11760]: {1=877, 2=882, 3=884, 4=39, 5=40, 6=41, 7=42, 8=43, 9=44, 10=841, 11=839, 12=837, 13=843, 14=845, 15=1133, 16=1097} +Script 833 - [105,79,null,11760]: {1=877, 2=882, 3=884, 4=39, 5=40, 6=41, 7=42, 8=43, 9=44, 10=841, 11=839, 12=837, 13=843, 14=845, 15=1133, 17=9783, 16=1097} +Script 834 - [105,79,null,11760]: {1=877, 2=882, 3=884, 4=39, 5=40, 6=41, 7=42, 8=43, 9=44, 10=841, 11=839, 12=837, 13=843, 14=845, 15=1133, 17=9784, 16=1097} +Script 835 - [105,79,null,11760]: {1=1379, 2=1389, 3=1381, 4=1383, 5=1385, 6=1387} +Script 836 - [105,79,null,11760]: {1=882, 2=877, 3=841, 4=839, 5=837, 6=39, 7=40, 8=41, 9=42, 10=1349, 11=1353, 12=1363, 13=1365, 14=1369, 15=1307, 17=1311, 16=1309, 19=1315, 18=1313, 20=1317} +Script 837 - [105,79,null,11760]: {1=1265, 2=1267, 3=1269, 4=1273, 5=1271, 6=1275} +Script 838 - [105,79,null,11760]: {1=6, 2=8, 3=10, 4=12, 5=5, 6=4} +Script 839 - [105,79,null,11760]: {1=52, 2=39, 3=40, 4=41, 5=42, 6=43, 7=44, 8=882, 9=884, 10=886, 11=888, 12=890, 13=892, 14=841, 15=843, 17=839, 16=849, 19=847, 18=845} +Script 840 - [105,79,null,11760]: {1=825, 2=826, 3=827, 4=828, 5=829, 6=830, 7=800, 8=801, 9=802, 10=803, 11=804, 12=805} +Script 841 - [105,79,null,11760]: {8=560, 1=554, 2=555, 3=556, 4=557, 5=558, 6=559, 7=562} +Script 842 - [105,79,null,11760]: {1=554, 2=555, 3=556, 4=557, 5=558, 6=559, 7=562, 8=560, 9=9765} +Script 843 - [105,79,null,11760]: {1=554, 2=555, 3=556, 4=557, 5=558, 6=559, 7=562, 8=560, 9=9766} +Script 844 - [105,79,null,11760]: {1=554, 2=555, 3=556, 4=557, 5=558, 6=559, 7=562, 8=560, 9=221, 10=579, 11=1017} +Script 845 - [105,79,null,11760]: {1=556, 2=555, 3=557, 4=554, 5=558, 6=559, 7=562, 8=561, 9=560, 10=563, 11=565, 12=566, 13=1387, 14=1383, 15=1381, 16=1385} +Script 846 - [105,79,null,11760]: {1=4089, 2=4091, 3=4093, 4=4095, 5=4097} +Script 847 - [105,79,null,11760]: {1=4089, 2=4091, 3=4093, 4=4095, 5=4097, 6=9762} +Script 848 - [105,79,null,11760]: {1=4089, 2=4091, 3=4093, 4=4095, 5=4097, 6=9763} +Script 849 - [105,79,null,11760]: {1=1103, 2=1101, 3=1105, 4=1109, 5=1117, 6=1115, 7=1119, 8=1125, 9=1121, 10=1067, 11=1133, 12=1097} +Script 850 - [105,79,null,11760]: {1=1139, 2=1137, 3=1141, 4=1143, 5=1145, 6=1155, 7=1153, 8=1157, 9=1159, 10=1161} +Script 851 - [105,79,null,11760]: {1=1075, 2=1067, 3=1069, 4=1077, 5=1071, 6=1073} +Script 852 - [105,79,null,11760]: {8=1181, 1=1171, 2=1173, 3=1189, 4=1175, 5=1191, 6=1177, 7=1193} +Script 853 - [105,79,null,11760]: {1=1087, 2=1081, 3=1083, 4=1089, 5=1085, 6=1091} +Script 854 - [105,79,null,11760]: {1=1103, 2=1101, 3=1105, 4=1107, 5=1109, 6=1111} +Script 855 - [105,79,null,11760]: {1=1093, 2=1079, 3=1432, 4=1113, 5=1303, 6=1289, 7=1099, 8=1065, 9=1169} +Script 856 - [105,79,null,11760]: {2=1135, 1=1127} +Script 857 - [105,79,null,11760]: {1=1117, 2=1115, 3=1119, 4=1125, 5=1121} +Script 858 - [105,79,null,11760]: {8=1063, 1=1129, 2=1131, 3=1133, 4=1095, 5=1097, 6=1169, 7=1167} +Script 859 - [105,79,null,11760]: {1=1129, 2=1131, 3=1133, 4=1095, 5=1097, 6=1169, 7=1167, 8=1063, 9=9756} +Script 860 - [105,79,null,11760]: {1=1129, 2=1131, 3=1133, 4=1095, 5=1097, 6=1169, 7=1167, 8=1063, 9=9757} +Script 861 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=550, 11=9003} +Script 862 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=550, 11=9003} +Script 863 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=550, 11=9003} +Script 864 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=550, 11=9003} +Script 865 - [105,79,null,11760]: {4=1123, 1=1021, 2=1165, 3=1077} +Script 866 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=590, 6=1755, 7=2347} +Script 867 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=550, 11=9003} +Script 868 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=550, 11=9003} +Script 869 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347} +Script 870 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=550, 11=9003} +Script 871 - [105,79,null,11760]: {1=1931, 2=1935, 3=590, 4=1755, 5=2347, 6=1265, 7=1351} +Script 872 - [105,79,null,11760]: {1=1925, 2=1265, 3=1923, 4=1887, 5=590, 6=1755, 7=2347, 8=954, 9=1931, 10=946} +Script 873 - [105,79,null,11760]: {1=227, 2=1265, 3=1349, 4=2142, 5=590, 6=1759, 7=882, 8=954, 9=970, 10=946} +Script 874 - [105,79,null,11760]: {1=1265, 2=1931, 3=1935, 4=1735, 5=1925, 6=590, 7=1755, 8=2347, 9=954, 10=1933, 11=583, 12=1941, 13=946} +Script 875 - [105,79,null,11760]: {1=1931, 2=1265, 3=1935, 4=1735, 5=1925, 6=590, 7=1755, 8=2347, 9=882, 10=2142} +Script 876 - [105,79,null,11760]: {1=590, 2=36, 3=596, 4=1931, 5=954, 6=1129, 7=1059, 8=1061, 9=2142, 10=2309, 11=229, 12=227, 13=233, 14=175, 15=970, 17=946, 16=973, 19=975, 18=2347, 21=952, 20=1755, 23=1265, 22=1351, 24=1349} +Script 877 - [105,79,null,11760]: {1=590, 2=229, 3=233, 4=1931, 5=1351, 6=1265, 7=1349, 8=1129, 9=1059, 10=1061, 11=2142, 12=2309, 13=952, 14=36, 15=596, 17=2347, 16=1755, 19=973, 18=970, 21=975, 20=227, 22=954} +Script 878 - [105,79,null,11760]: {1=1931, 2=1935, 3=946, 4=1925, 5=590, 6=1755, 7=2347} +Script 879 - [105,79,null,11760]: {4=886, 1=373, 2=2323, 3=121} +Script 880 - [105,79,null,11760]: {1=646, 2=648, 3=650, 4=652, 5=654, 6=656, 7=658, 8=660, 9=662, 10=664, 11=636, 12=638, 13=640, 14=642, 15=644, 17=628, 16=626, 19=632, 18=630, 20=634} +Script 881 - [105,79,null,11760]: {1=882, 2=877, 3=841, 4=839, 5=837, 6=39, 7=40, 8=41, 9=42, 10=1349, 11=1353, 12=1363, 13=1365, 14=1369, 15=1307, 17=1311, 16=1309, 19=1315, 18=1313, 20=1317} +Script 882 - [105,79,null,11760]: null +Script 883 - [105,79,null,11760]: null +Script 884 - [105,79,null,11760]: {8=327, 1=303, 2=307, 3=309, 4=311, 5=301, 6=313, 7=314} +Script 885 - [105,79,null,11760]: {1=2283} +Script 886 - [105,79,null,11760]: {1=303, 2=307, 3=311, 4=301, 5=313, 6=305} +Script 887 - [105,79,null,11760]: {4=1973, 1=2309, 2=1891, 3=1901} +Script 888 - [105,79,null,11760]: {4=1973, 1=2309, 2=1891, 3=1901} +Script 889 - [105,79,null,11760]: {2=314, 1=313} +Script 890 - [105,79,null,11760]: {1=2313, 2=1887, 3=1923, 4=1942, 5=590, 6=1935, 7=1931, 8=1973, 9=1933, 10=1980} +Script 891 - [105,79,null,11760]: {1=1978} +Script 892 - [105,79,null,11760]: {1=2007, 2=946, 3=1550} +Script 893 - [105,79,null,11760]: {1=1933, 2=2132, 3=2138, 4=1965, 5=2309, 6=1973, 7=1985, 8=1982, 9=1942} +Script 894 - [105,79,null,11760]: {4=314, 1=307, 2=309, 3=313} +Script 895 - [105,79,null,11760]: {1=1917, 2=431, 3=1993} +Script 896 - [105,79,null,11760]: {1=1635, 2=1637, 3=1639, 4=1641, 5=1643, 6=1654, 7=1656, 8=1658, 9=1660, 10=1662, 11=1692, 12=1694, 13=1696, 14=1698, 15=1700} +Script 897 - [105,79,null,11760]: {1=1641} +Script 898 - [105,79,null,11760]: {1=1718, 2=1727, 3=1729, 4=1725, 5=1731} +Script 899 - [105,79,null,11760]: {1=1714} +Script 900 - [105,79,null,11760]: {1=1005, 2=1129, 3=1059, 4=1061, 5=1757, 6=1013, 7=1015, 8=1011, 9=1007, 10=950, 11=428, 12=426} +Script 901 - [105,79,null,11760]: {2=1265, 1=2347} +Script 902 - [105,79,null,11760]: {1=1755, 2=1592, 3=1597, 4=1595, 5=1733, 6=1734, 7=1599, 8=2976, 9=5523, 10=9434, 11=11065} +Script 903 - [105,79,null,11760]: {8=5523, 1=1755, 2=1592, 3=1597, 4=1595, 5=1733, 6=1734, 7=1599} +Script 904 - [105,79,null,11760]: {1=1755, 2=1592, 3=1597, 4=1595, 5=1733, 6=1734, 7=1599, 8=2976, 9=5523, 10=9434, 11=11065} +Script 905 - [105,79,null,11760]: {8=5523, 1=1755, 2=1592, 3=1597, 4=1595, 5=1733, 6=1734, 7=1599} +Script 906 - [105,79,null,11760]: {1=229, 2=233, 3=221} +Script 907 - [105,79,null,11760]: {1=36} +Script 908 - [105,79,null,11760]: {1=229, 2=233, 3=221} +Script 909 - [105,79,null,11760]: {1=579, 2=1023, 3=958, 4=948, 5=1733, 6=1734, 7=1059, 8=1061, 9=428, 10=426, 11=1757, 12=1013, 13=1015, 14=1011, 15=1007, 16=1025} +Script 910 - [105,79,null,11760]: {1=229, 2=233, 3=221} +Script 911 - [105,79,null,11760]: {2=958, 1=948} +Script 912 - [105,79,null,11760]: {1=1823, 2=1831, 3=1937, 4=1921, 5=1929, 6=946, 7=2347} +Script 913 - [105,79,null,11760]: {1=1823, 2=1831, 3=1937, 4=1921, 5=1929, 6=946, 7=1833, 8=1835, 9=1837, 10=314, 11=2347, 12=1925, 13=1923, 14=1935, 15=1854, 16=954} +Script 914 - [105,79,null,11760]: {1=299, 2=1590, 3=1542, 4=2368, 5=1052} +Script 915 - [105,79,null,11760]: {1=2520, 2=2522, 3=2524, 4=2526, 5=4613, 6=12844} +Script 916 - [105,79,null,11760]: {1=5341, 2=5343, 3=5329, 4=952, 5=5325, 6=5331, 7=5354, 8=6032, 9=5418, 10=5376, 11=6036, 12=12622} +Script 917 - [105,79,null,11760]: {1=5341, 2=5343, 3=5329, 4=952, 5=5325, 6=5331, 7=5354, 8=6032, 9=5418, 10=5376, 11=6036, 12=12622} +Script 918 - [105,79,null,11760]: {1=5341, 2=5343, 3=5329, 4=952, 5=5325, 6=5331, 7=5354, 8=6032, 9=5418, 10=5376, 11=6036, 12=12622} +Script 919 - [105,79,null,11760]: {1=5341, 2=5343, 3=5329, 4=952, 5=5325, 6=5331, 7=5354, 8=6032, 9=5418, 10=5376, 11=6036, 12=12622} +Script 920 - [105,79,null,11760]: {1=5318, 2=5319, 3=5324, 4=5305, 5=5306, 6=5097, 7=5096, 8=5307, 9=5308, 10=5309} +Script 921 - [118,105,null,0]: {343=1, 204=1, 139=1, 70=1, 138=1, 3=1, 279=1, 4=1, 65=1, 13=1, 17=1, 256=1, 18=1, 83=1, 23=1, 456=1, 159=1, 455=1, 145=1, 24=1, 264=1, 214=1, 391=1, 148=1, 389=1, 31=1, 211=1, 34=1, 441=1, 442=1, 38=1, 235=1, 174=1, 513=1, 233=1, 383=1, 160=1, 41=1, 227=1, 47=1, 254=1, 255=1, 416=1, 57=1, 536=1, 62=1, 301=1, 61=1} +Script 922 - [105,79,null,11760]: null +Script 923 - [0,0,null,0]: null +Script 924 - [111,105,null,0]: {1038=1, 1057=1, 981=1, 1048=1, 1959=1, 1050=1, 1053=1, 1055=1, 1989=1, 1040=1, 962=1, 1042=1, 1961=1, 1044=1, 1046=1} +Script 925 - [105,79,null,11760]: {1=303, 2=311, 3=2309, 4=1931, 5=1927, 6=1733, 7=1734, 8=1917, 9=1785, 10=946} +Script 926 - [105,79,null,11760]: {1=4740} +Script 927 - [105,79,null,11760]: {1=1931, 2=1925, 3=1735, 4=1935, 5=590, 6=1755, 7=2347} +Script 928 - [105,79,null,11760]: {1=5341, 2=5343, 3=5329, 4=952, 5=5325, 6=5331, 7=6032, 8=6036, 9=2026, 10=1480} +Script 929 - [105,79,null,11760]: {2=6625, 1=6615} +Script 930 - [105,79,null,11760]: {4=6605, 1=6615, 2=6625, 3=6591} +Script 931 - [105,79,null,11760]: {1=6615, 2=6625, 3=6627, 4=6621, 5=6631, 6=6591, 7=6605} +Script 932 - [105,79,null,11760]: {1=6615, 2=6625, 3=6627, 4=6621, 5=6631, 6=6591, 7=6605, 8=6601, 9=6603, 10=6607} +Script 933 - [105,79,null,11760]: {1=6615, 2=6625, 3=6627, 4=6621, 5=6631, 6=6623, 7=6633, 8=6617, 9=6619, 10=6629, 11=6591, 12=6605, 13=6601, 14=6603, 15=6607} +Script 934 - [105,79,null,11760]: {1=6615, 2=6625, 3=6627, 4=6621, 5=6631, 6=6623, 7=6633, 8=6617, 9=6619, 10=6629, 11=6591, 12=6605, 13=6601, 14=6603, 15=6607, 17=6589, 16=6613, 19=6587, 18=6611, 21=6599, 20=6609} +Script 935 - [105,79,null,11760]: {1=946, 2=2347, 3=1734, 4=1733, 5=4819, 6=1351, 7=1759} +Script 936 - [105,79,null,11760]: {2=341, 1=331} +Script 937 - [105,79,null,11760]: {2=339, 1=329} +Script 938 - [105,79,null,11760]: {8=1121, 1=1109, 2=1143, 3=1159, 4=1181, 5=1197, 6=1071, 7=1085} +Script 939 - [105,79,null,11760]: {1=1299, 2=1343, 3=1369, 4=3099, 5=1315} +Script 940 - [105,79,null,11760]: {2=438, 1=436} +Script 941 - [105,79,null,11760]: {1=10818, 2=10816, 3=10814} +Script 942 - [105,79,null,11760]: {1=1993, 2=1935, 3=7919} +Script 943 - [105,79,null,11760]: {4=1935, 1=1993, 2=7810, 3=7919} +Script 944 - [105,79,null,11760]: {2=1935, 1=1993} +Script 945 - [105,79,null,11760]: {1=825, 2=826, 3=827, 4=828, 5=829, 6=830, 7=39, 8=40, 9=41, 10=42, 11=43, 12=44} +Script 946 - [105,79,null,11760]: {8=560, 1=554, 2=555, 3=556, 4=557, 5=558, 6=559, 7=562} +Script 947 - [105,79,null,11760]: {1=1931, 2=1935, 3=1735, 4=1925, 5=1923, 6=1887, 7=590, 8=1755, 9=2347, 10=1351, 11=7934} +Script 948 - [105,79,null,11760]: {1=954, 2=2347, 3=1755, 4=946, 5=952, 6=590, 7=36, 8=273, 9=233, 10=1931, 11=1925, 12=1929, 13=1935, 14=1937, 15=229, 17=2019, 16=227, 19=2015, 18=2021, 21=2017, 20=1915, 23=1913, 22=1909, 24=1907} +Script 949 - [105,79,null,11760]: {1=5018, 2=5016, 3=8872, 4=8880, 5=8882} +Script 950 - [105,79,null,11760]: {1=9440, 2=9442, 3=9444, 4=9446, 5=9448, 6=9420, 7=9423, 8=9425, 9=9427} +Script 951 - [105,79,null,11760]: {1=9440, 2=9442, 3=9444, 4=9446, 5=9448, 6=9450, 7=9420, 8=9423, 9=9425, 10=9427, 11=9429} +Script 952 - [105,79,null,11760]: {1=2518} +Script 953 - [105,79,null,11760]: {1=3775, 2=3773, 3=3767, 4=3769, 5=3771, 6=3793, 7=3795, 8=3797, 9=3799, 10=3791, 11=3765, 12=3763, 13=3761, 14=3759, 15=3777, 17=3781, 16=3779, 19=3785, 18=3783, 21=3789, 20=3787} +Script 954 - [105,79,null,11760]: {1=1917, 2=3803, 3=3801} +Script 955 - [105,79,null,11760]: {1=1337, 2=1335, 3=1339, 4=1341, 5=1343, 6=1345, 7=3749, 8=3751, 9=3753, 10=3755} +Script 956 - [105,79,null,11760]: {1=590, 2=954, 3=233, 4=1931, 5=2142, 6=2309, 7=952, 8=36, 9=1755, 10=2347, 11=229, 12=227, 13=1925, 14=1929, 15=1944, 17=1965, 16=1942} +Script 957 - [105,79,null,11760]: {1=303, 2=307, 3=309, 4=311, 5=301, 6=313, 7=314, 8=305, 9=317, 10=327} +Script 958 - [105,79,null,11760]: {2=958, 1=948} +Script 959 - [105,79,null,11760]: {1=314, 2=884, 3=886, 4=40, 5=41} +Script 960 - [105,79,null,11760]: {1=4684, 2=1833, 3=1835, 4=950, 5=1734, 6=1733} +Script 961 - [105,79,null,11760]: {1=1931, 2=1935, 3=1825, 4=1833, 5=1837, 6=1925, 7=4593, 8=4591, 9=970, 10=946, 11=590, 12=1265, 13=2138} +Script 962 - [105,79,null,11760]: {1=1931, 2=1935, 3=1825, 4=1833, 5=1837, 6=1925, 7=4593, 8=4591, 9=1985, 10=2120, 11=1982, 12=1937, 13=1921, 14=1929} +Script 963 - [105,79,null,11760]: {1=1917, 2=2017, 3=1993, 4=2015, 5=2021, 6=1915} +Script 964 - [105,79,null,11760]: {1=7162} +Script 965 - [105,79,null,11760]: {1=2028, 2=2030, 3=2032, 4=2034, 5=2036, 6=2038, 7=2040} +Script 966 - [105,79,null,11760]: {1=2227, 2=2219, 3=2221, 4=2225, 5=2223, 6=2233, 7=2231, 8=2235, 9=2229, 10=2237, 11=2243, 12=2239, 13=2241} +Script 967 - [105,79,null,11760]: {1=4155, 2=4156, 3=4158, 4=4160, 5=4161, 6=4162, 7=4164, 8=4166, 9=4168, 10=4170, 11=4551, 12=6664, 13=6696, 14=6720, 15=7051, 17=7421, 16=7159, 19=8923, 18=7432, 20=10952} +Script 968 - [105,79,null,11760]: {4=2136, 1=2132, 2=2138, 3=2134} +Script 969 - [105,79,null,11760]: {1=2894, 2=2896, 3=2898, 4=2900, 5=2902, 6=2904, 7=2906, 8=2908, 9=2910, 10=2912, 11=2914, 12=2916, 13=2918, 14=2920, 15=2922, 17=2926, 16=2924, 19=2930, 18=2928, 21=2934, 20=2932, 23=2938, 22=2936, 25=2942, 24=2940, 27=1019, 26=1007, 29=1023, 28=1021, 30=1027} +Script 970 - [105,79,null,11760]: {1=1733, 2=1734, 3=1931, 4=1925, 5=1935, 6=590, 7=1755, 8=2347, 9=3377, 10=946} +Script 971 - [105,79,null,11760]: {8=4023, 1=554, 2=555, 3=556, 4=557, 5=563, 6=4008, 7=4006} +Script 972 - [105,79,null,11760]: {4=1329, 1=1321, 2=1323, 3=1325} +Script 973 - [105,79,null,11760]: {1=1321, 2=1323, 3=1325, 4=1329, 5=4587} +Script 974 - [105,79,null,11760]: {4=4014, 1=4012, 2=1963, 3=4016} +Script 975 - [105,79,null,11760]: {8=11065, 1=1755, 2=1592, 3=1597, 4=4020, 5=1733, 6=1734, 7=1759} +Script 976 - [105,79,null,11760]: {1=1931, 2=1935, 3=954, 4=1925, 5=590, 6=2347} +Script 977 - [105,79,null,11760]: {1=1823, 2=1831, 3=1937, 4=1921, 5=1929, 6=1935, 7=1923, 8=1925, 9=1837, 10=1833, 11=1835, 12=946} +Script 978 - [105,79,null,11760]: {1=4627} +Script 979 - [105,79,null,11760]: {1=1969, 2=2023, 3=660, 4=1215, 5=550, 6=583, 7=1941, 8=273, 9=970, 10=975, 11=1599, 12=2976, 13=1823, 14=1837, 15=1854, 17=3377, 16=2524, 19=1909, 18=2894, 21=3801, 20=3787, 23=3424, 22=3678, 25=5, 24=3420} +Script 980 - [105,79,null,11760]: {8=6568, 1=6522, 2=6523, 3=6524, 4=6525, 5=6526, 6=6527, 7=6528} +Script 981 - [105,79,null,11760]: null +Script 982 - [105,79,null,11760]: {8=560, 1=554, 2=555, 3=556, 4=557, 5=558, 6=559, 7=562} +Script 983 - [0,0,null,0]: null +Script 984 - [111,105,null,9999]: {9075=330, 566=615, 565=825, 564=348, 563=567, 562=210, 561=558, 560=465, 558=26, 559=24, 556=26, 557=26, 554=26, 555=26} +Script 985 - [0,0,null,0]: null +Script 986 - [0,0,null,0]: null +Script 987 - [111,105,null,9999]: {562=9, 560=18} +Script 988 - [0,0,null,0]: null +Script 989 - [0,0,null,0]: null +Script 990 - [0,0,null,0]: null +Script 991 - [0,0,null,0]: null +Script 992 - [0,0,null,0]: null +Script 993 - [0,0,null,0]: null +Script 994 - [0,0,null,0]: null +Script 995 - [0,0,null,0]: null +Script 996 - [0,0,null,0]: null +Script 997 - [0,0,null,0]: null +Script 998 - [0,0,null,0]: null +Script 999 - [0,0,null,0]: null +Script 1000 - [0,0,null,0]: null +Script 1001 - [0,0,null,0]: null +Script 1002 - [0,0,null,0]: null +Script 1003 - [0,0,null,0]: null +Script 1004 - [0,0,null,0]: null +Script 1005 - [0,0,null,0]: null +Script 1006 - [0,0,null,0]: null +Script 1007 - [0,0,null,0]: null +Script 1008 - [0,0,null,0]: null +Script 1009 - [0,0,null,0]: null +Script 1010 - [0,0,null,0]: null +Script 1011 - [0,0,null,0]: null +Script 1012 - [0,0,null,0]: null +Script 1013 - [0,0,null,0]: null +Script 1014 - [0,0,null,0]: null +Script 1015 - [0,0,null,0]: null +Script 1016 - [0,0,null,0]: null +Script 1017 - [0,0,null,0]: null +Script 1018 - [0,0,null,0]: null +Script 1019 - [0,0,null,0]: null +Script 1020 - [0,0,null,0]: null +Script 1021 - [0,0,null,0]: null +Script 1022 - [0,0,null,0]: null +Script 1023 - [0,0,null,0]: null +Script 1024 - [0,0,null,0]: null +Script 1025 - [0,0,null,0]: null +Script 1026 - [0,0,null,0]: null +Script 1027 - [0,0,null,0]: null +Script 1028 - [0,0,null,0]: null +Script 1029 - [0,0,null,0]: null +Script 1030 - [0,0,null,0]: null +Script 1031 - [0,0,null,0]: null +Script 1032 - [0,0,null,0]: null +Script 1033 - [0,0,null,0]: null +Script 1034 - [0,0,null,0]: null +Script 1035 - [0,0,null,0]: null +Script 1036 - [0,0,null,0]: null +Script 1037 - [0,0,null,0]: null +Script 1038 - [0,0,null,0]: null +Script 1039 - [0,0,null,0]: null +Script 1040 - [0,0,null,0]: null +Script 1041 - [0,0,null,0]: null +Script 1042 - [0,0,null,0]: null +Script 1043 - [0,0,null,0]: null +Script 1044 - [0,0,null,0]: null +Script 1045 - [0,0,null,0]: null +Script 1046 - [0,0,null,0]: null +Script 1047 - [0,0,null,0]: null +Script 1048 - [0,0,null,0]: null +Script 1049 - [0,0,null,0]: null +Script 1050 - [0,0,null,0]: null +Script 1051 - [0,0,null,0]: null +Script 1052 - [0,0,null,0]: null +Script 1053 - [0,0,null,0]: null +Script 1054 - [0,0,null,0]: null +Script 1055 - [0,0,null,0]: null +Script 1056 - [0,0,null,0]: null +Script 1057 - [0,0,null,0]: null +Script 1058 - [0,0,null,0]: null +Script 1059 - [0,0,null,0]: null +Script 1060 - [0,0,null,0]: null +Script 1061 - [73,105,null,0]: {28180512=1, 12582928=1, 12582940=1, 12582937=1, 12582917=1, 12582915=1, 12582925=1, 12582921=1, 28180481=1, 28180482=1, 28180483=1, 28180484=1, 12582963=1, 28180485=1, 28180486=1, 12582961=1, 28180487=1, 28180488=1, 28180489=1, 28180490=1, 12582973=1, 28180491=1, 28180492=1, 28180493=1, 28180495=1, 12582951=1, 12582948=1, 12582946=1, 12582947=1, 28180503=1, 28180502=1, 28180505=1, 12582958=1, 28180507=1, 28180506=1, 28180509=1, 12582952=1, 28180510=1} +Script 1062 - [0,0,null,0]: null +Script 1063 - [0,0,null,0]: null +Script 1064 - [0,0,null,0]: null +Script 1065 - [0,0,null,0]: null +Script 1066 - [0,0,null,0]: null +Script 1067 - [0,0,null,0]: null +Script 1068 - [0,0,null,0]: null +Script 1069 - [0,0,null,0]: null +Script 1070 - [0,0,null,0]: null +Script 1071 - [0,0,null,0]: null +Script 1072 - [0,0,null,0]: null +Script 1073 - [105,73,null,-1]: {0=6881298, 1=6881314, 2=6881330, 3=6881349, 4=6881368, 5=6881387} +Script 1074 - [105,73,null,-1]: {0=6881313, 1=6881329, 2=6881345, 3=6881364, 4=6881383, 5=6881402} +Script 1075 - [105,73,null,-1]: {0=6881312, 1=6881328, 2=6881344, 3=6881363, 4=6881382, 5=6881401} +Script 1076 - [105,73,null,-1]: {0=6881299, 1=6881315, 2=6881331, 3=6881350, 4=6881369, 5=6881388} +Script 1077 - [105,73,null,-1]: {4=6881384, 5=6881403, 2=6881346, 3=6881365} +Script 1078 - [105,118,null,-1]: {0=517, 1=518, 2=519, 3=520, 4=521, 5=522} +Script 1079 - [105,118,null,-1]: {0=523, 1=524, 2=525, 3=526, 4=527, 5=528} +Script 1080 - [105,73,null,-1]: {0=7143442, 1=7143447, 2=7143452, 3=7143460, 4=7143468, 5=7143476} +Script 1081 - [105,73,null,-1]: {0=7143444, 1=7143449, 2=7143454, 3=7143462, 4=7143470, 5=7143478} +Script 1082 - [105,73,null,-1]: {4=7143471, 5=7143479, 2=7143455, 3=7143463} +Script 1083 - [105,73,null,-1]: {0=6946834, 1=6946848, 2=6946862, 3=6946879, 4=6946896, 5=6946913} +Script 1084 - [105,73,null,-1]: {0=6946835, 1=6946849, 2=6946863, 3=6946880, 4=6946897, 5=6946914} +Script 1085 - [105,73,null,-1]: {4=6946910, 5=6946927, 2=6946876, 3=6946893} +Script 1086 - [0,0,null,0]: null +Script 1087 - [105,79,null,11760]: {1=11814, 2=11816, 3=11818, 4=11820, 5=11822, 6=11824, 7=11826, 8=11828, 9=11830, 10=11832, 11=11834, 12=11836, 13=11838, 14=11840, 15=11842, 17=11846, 16=11844, 19=11850, 18=11848, 21=11854, 20=11852, 23=11858, 22=11856, 25=11862, 24=11860, 27=11866, 26=11864, 29=11870, 28=11868, 31=11960, 30=11872, 34=11876, 35=11878, 32=11962, 33=11874, 38=11884, 39=11886, 36=11880, 37=11882, 42=11892, 43=11894, 40=11888, 41=11890, 46=11900, 47=11902, 44=11896, 45=11898, 51=11910, 50=11908, 49=11906, 48=11904, 55=11918, 54=11916, 53=11914, 52=11912, 59=11926, 58=11924, 57=11922, 56=11920, 63=11934, 62=11932, 61=11930, 60=11928, 68=11944, 69=11946, 70=11967, 64=11936, 65=11938, 66=11940, 67=11942} +Script 1088 - [79,115,shop_dummy,0]: {11836=This item set is made up of adamant full helm, platebody, skirt and kiteshield., 11838=This item set is made up of rune full helm, platebody, legs and kiteshield., 11832=This item set is made up of mithril full helm, platebody, skirt and kiteshield., 11834=This item set is made up of adamant full helm, platebody, legs and kiteshield., 11828=This item set is made up of black full helm, platebody, skirt and kiteshield., 11967=This item set is made up of cannon base, stand, barrels and furnace., 11830=This item set is made up of mithril full helm, platebody, legs and kiteshield., 11960=This item set is made up of hat, top, bottoms, gloves and boots., 11824=This item set is made up of steel full helm, platebody, skirt and kiteshield., 11962=This item set is made up of hat, top, bottoms, gloves and boots., 11826=This item set is made up of black full helm, platebody, legs and kiteshield., 11820=This item set is made up of iron full helm, platebody, skirt and kiteshield., 11940=This item set is made up of full helm, platebody, skirt and kiteshield., 11822=This item set is made up of steel full helm, platebody, legs and kiteshield., 11942=This item set is made up of helm, platebody, legs, boots and gloves., 11816=This item set is made up of bronze full helm, platebody, skirt and kiteshield., 11936=This item set is made up of full helm, platebody, skirt and kiteshield., 11818=This item set is made up of iron full helm, platebody, legs and kiteshield., 11938=This item set is made up of full helm, platebody, legs and kiteshield., 11814=This item set is made up of bronze full helm, platebody, legs and kiteshield., 11944=This item set is made up of helm, body, chaps, boots and gloves., 11946=This item set is made up of helm, top, bottoms, boots and gloves., 11926=This item set is made up of full helm, platebody, legs and shield., 11924=This item set is made up of body, chaps, bracers and coif., 11922=This item set is made up of body, chaps, bracers and coif., 11920=This item set is made up of body, chaps, bracers and coif., 11934=This item set is made up of full helm, platebody, skirt and kiteshield., 11932=This item set is made up of full helm, platebody, skirt and kiteshield., 11930=This item set is made up of full helm, platebody, legs and kiteshield., 11928=This item set is made up of full helm, platebody, legs and kiteshield., 11910=This item set is made up of body and chaps., 11908=This item set is made up of body and chaps., 11906=This item set is made up of hat, robetop and bottoms., 11904=This item set is made up of hat, robetop and bottoms., 11918=This item set is made up of body and chaps., 11916=This item set is made up of body and chaps., 11914=This item set is made up of body and chaps., 11912=This item set is made up of body and chaps., 11896=This item set is made up of full helm, platebody, skirt and kiteshield., 11898=This item set is made up of full helm, platebody, legs and kiteshield., 11900=This item set is made up of full helm, platebody, skirt and kiteshield., 11902=This item set is made up of hat, robetop and bottoms., 11888=This item set is made up of full helm, platebody, skirt and kiteshield., 11890=This item set is made up of full helm, platebody, legs and kiteshield., 11892=This item set is made up of full helm, platebody, skirt and kiteshield., 11894=This item set is made up of full helm, platebody, legs and kiteshield., 11880=This item set is made up of full helm, platebody, skirt and kiteshield., 11882=This item set is made up of full helm, platebody, legs and kiteshield., 11884=This item set is made up of full helm, platebody, skirt and kiteshield., 11886=This item set is made up of full helm, platebody, legs and kiteshield., 11872=This item set is made up of hat, top, bottoms, gloves and boots., 11874=This item set is made up of hat, top, bottoms, gloves and boots., 11876=This item set is made up of helm, body, boots, gauntlets and legs., 11878=This item set is made up of full helm, platebody, legs and kiteshield., 11866=This item set is made up of body, chaps and vambraces., 11864=This item set is made up of body, chaps and vambraces., 11870=This item set is made up of body, chaps and vambraces., 11868=This item set is made up of body, chaps and vambraces., 11858=This item set is made up of helm, body, legs and shield., 11856=This item set is made up of Verac's helm, brassard, plateskirt and flail., 11862=This item set is made up of body, legs, amulet and hat., 11860=This item set is made up of coif, body, chaps and vambraces., 11850=This item set is made up of Guthan's helm, body, chainskirt and spear., 11848=This item set is made up of Dharok's helm, body, legs and greataxe., 11854=This item set is made up of Torag's helm, body, legs and hammers., 11852=This item set is made up of Karil's coif, leather top, leather skirt and crossbow., 11842=This item set is made up of dragon med helm, chainbody, legs., 11840=This item set is made up of rune full helm, platebody, skirt and kiteshield., 11846=This item set is made up of Ahrim's hood, robetop, robeskirt and staff., 11844=This item set is made up of dragon med helm, chainbody, skirt.} +Script 1089 - [111,115,shop_dummy,0]: {11836=This item set is made up of adamant full helm, platebody, skirt and kiteshield., 11838=This item set is made up of rune full helm, platebody, legs and kiteshield., 11832=This item set is made up of mithril full helm, platebody, skirt and kiteshield., 11834=This item set is made up of adamant full helm, platebody, legs and kiteshield., 11828=This item set is made up of black full helm, platebody, skirt and kiteshield., 11967=This item set is made up of cannon base, stand, barrels and furnace., 11830=This item set is made up of mithril full helm, platebody, legs and kiteshield., 11960=This item set is made up of hat, top, bottoms, gloves and boots., 11824=This item set is made up of steel full helm, platebody, skirt and kiteshield., 11962=This item set is made up of hat, top, bottoms, gloves and boots., 11826=This item set is made up of black full helm, platebody, legs and kiteshield., 11820=This item set is made up of iron full helm, platebody, skirt and kiteshield., 11940=This item set is made up of full helm, platebody, skirt and kiteshield., 11822=This item set is made up of steel full helm, platebody, legs and kiteshield., 11942=This item set is made up of helm, platebody, legs, boots and gloves., 11816=This item set is made up of bronze full helm, platebody, skirt and kiteshield., 11936=This item set is made up of full helm, platebody, skirt and kiteshield., 11818=This item set is made up of iron full helm, platebody, legs and kiteshield., 11938=This item set is made up of full helm, platebody, legs and kiteshield., 11814=This item set is made up of bronze full helm, platebody, legs and kiteshield., 11944=This item set is made up of helm, body, chaps, boots and gloves., 11946=This item set is made up of helm, top, bottoms, boots and gloves., 11926=This item set is made up of full helm, platebody, legs and shield., 11924=This item set is made up of body, chaps, bracers and coif., 11922=This item set is made up of body, chaps, bracers and coif., 11920=This item set is made up of body, chaps, bracers and coif., 11934=This item set is made up of full helm, platebody, skirt and kiteshield., 11932=This item set is made up of full helm, platebody, skirt and kiteshield., 11930=This item set is made up of full helm, platebody, legs and kiteshield., 11928=This item set is made up of full helm, platebody, legs and kiteshield., 11910=This item set is made up of body and chaps., 11908=This item set is made up of body and chaps., 11906=This item set is made up of hat, robetop and bottoms., 11904=This item set is made up of hat, robetop and bottoms., 11918=This item set is made up of body and chaps., 11916=This item set is made up of body and chaps., 11914=This item set is made up of body and chaps., 11912=This item set is made up of body and chaps., 11896=This item set is made up of full helm, platebody, skirt and kiteshield., 11898=This item set is made up of full helm, platebody, legs and kiteshield., 11900=This item set is made up of full helm, platebody, skirt and kiteshield., 11902=This item set is made up of hat, robetop and bottoms., 11888=This item set is made up of full helm, platebody, skirt and kiteshield., 11890=This item set is made up of full helm, platebody, legs and kiteshield., 11892=This item set is made up of full helm, platebody, skirt and kiteshield., 11894=This item set is made up of full helm, platebody, legs and kiteshield., 11880=This item set is made up of full helm, platebody, skirt and kiteshield., 11882=This item set is made up of full helm, platebody, legs and kiteshield., 11884=This item set is made up of full helm, platebody, skirt and kiteshield., 11886=This item set is made up of full helm, platebody, legs and kiteshield., 11872=This item set is made up of hat, top, bottoms, gloves and boots., 11874=This item set is made up of hat, top, bottoms, gloves and boots., 11876=This item set is made up of helm, body, greaves, gauntlets and legs, 11878=This item set is made up of full helm, platebody, legs and kiteshield., 11866=This item set is made up of body, chaps and vambraces., 11864=This item set is made up of body, chaps and vambraces., 11870=This item set is made up of body, chaps and vambraces., 11868=This item set is made up of body, chaps and vambraces., 11858=This item set is made up of helm, body, legs and shield., 11856=This item set is made up of Verac's helm, brassard, plateskirt and flail., 11862=This item set is made up of body, legs, amulet and hat., 11860=This item set is made up of coif, body, chaps and vambraces., 11850=This item set is made up of Guthan's helm, body, chainskirt and spear, 11848=This item set is made up of Dharok's helm, body, legs and greataxe, 11854=This item set is made up of Torag's helm, body, legs and hammers., 11852=This item set is made up of Karil's coif, leather top, leather skirt and crossbow., 11842=This item set is made up of dragon med helm, chainbody, legs., 11840=This item set is made up of rune full helm, platebody, skirt and kiteshield., 11846=This item set is made up of Ahrim's hood, robetop, robeskirt and staff., 11844=This item set is made up of dragon med helm, chainbody, skirt.} +Script 1090 - [0,0,null,0]: null +Script 1091 - [0,0,null,0]: null +Script 1092 - [0,0,null,0]: null +Script 1093 - [0,0,null,0]: null +Script 1094 - [0,0,null,0]: null +Script 1095 - [0,0,null,0]: null +Script 1096 - [0,0,null,0]: null +Script 1097 - [0,0,null,0]: null +Script 1098 - [105,110,null,6565]: {1=6568, 2=6571, 3=6574, 4=6577, 5=6580, 6=6583, 7=6586, 8=6589, 9=6592, 10=6595, 11=6598, 12=6601} +Script 1099 - [105,115,,0]: {0=Memorial plaque, 1=Flag, 2=Small gravestone, 3=Ornate gravestone, 4=Font of Life, 5=Stele, 6=Symbol of Saradomin, 7=Symbol of Zamorak, 8=Symbol of Guthix, 9=Symbol of Bandos, 10=Symbol of Armadyl, 11=Ancient symbol, 12=Angel of Death} +Script 1100 - [105,115,,0]: {0=A simple plaque, bearing the name of the deceased.

(Everyone has this by default.), 1=A dignified little flag flutters in the breeze., 2=A simple little gravestone., 3=An ornately carved gravestone., 4=An elaborate font. As water collects in the bowl, it symbolises new life and hope., 5=A monolithic memorial stone bearing a selection of emblems., 6=The four-pointed star is universally recognised as the symbol of Saradomin., 7=This serpentine sigil represents the ruthless Zamorak., 8=Favoured by humans of a mystical or druidic inclination., 9=Followers of Bandos are now scarce, but this symbol is still used by those who remember that violent god., 10=Armadyl's love of winged creatures is represented by this elegant symbol. Little else is remembered of him., 11=Adventurers often request this symbol, although its origin and meaning have become obscure in the centuries since the god wars., 12=The ultimate marker for a grave, this statue evokes intimations of mortality in all who are faced with it.} +Script 1101 - [105,105,null,-1]: {0=0, 1=50, 2=500, 3=5000, 4=50000, 5=50000, 6=50000, 7=50000, 8=50000, 9=50000, 10=50000, 11=50000, 12=500000} +Script 1102 - [0,0,null,0]: null +Script 1103 - [0,0,null,0]: null +Script 1104 - [0,0,null,0]: null +Script 1105 - [0,0,null,0]: null +Script 1106 - [0,0,null,0]: null +Script 1107 - [0,0,null,0]: null +Script 1108 - [0,0,null,0]: null +Script 1109 - [0,0,null,0]: null +Script 1110 - [0,0,null,0]: null +Script 1111 - [0,0,null,0]: null +Script 1112 - [0,0,null,0]: null +Script 1113 - [0,0,null,0]: null +Script 1114 - [0,0,null,0]: null +Script 1115 - [0,0,null,0]: null +Script 1116 - [0,0,null,0]: null +Script 1117 - [0,0,null,0]: null +Script 1118 - [0,0,null,0]: null +Script 1119 - [0,0,null,0]: null +Script 1120 - [0,0,null,0]: null +Script 1121 - [0,0,null,0]: null +Script 1122 - [0,0,null,0]: null +Script 1123 - [0,0,null,0]: null +Script 1124 - [0,0,null,0]: null +Script 1125 - [105,75,null,0]: {1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=91, 10=92, 11=93, 12=94, 13=95, 14=96, 15=97} +Script 1126 - [105,75,null,45]: {1=46, 2=47, 3=48, 4=49, 5=50, 6=51, 7=52, 8=53, 9=54, 10=135, 11=136, 12=137, 13=138, 14=139, 15=140, 17=142, 16=141, 19=144, 18=143, 21=146, 20=145} +Script 1127 - [105,75,null,10]: {1=11, 2=12, 3=13, 4=14, 5=15, 6=16, 7=17, 8=98, 9=99, 10=100, 11=101, 12=102, 13=103, 14=104} +Script 1128 - [105,75,null,18]: {1=19, 2=20, 3=21, 4=22, 5=23, 6=24, 7=25, 8=111, 9=112, 10=113, 11=114, 12=115, 13=116} +Script 1129 - [105,75,null,56]: {1=57, 2=58, 3=59, 4=60, 5=153, 6=154, 7=155, 8=156, 9=157, 10=158} +Script 1130 - [105,75,null,26]: {1=27, 2=28, 3=29, 4=30, 5=31, 6=105, 7=106, 8=107, 9=108, 10=109, 11=110} +Script 1131 - [105,75,null,61]: {1=62, 2=63, 3=64, 4=65, 5=147, 6=148, 7=149, 8=150, 9=151, 10=152} +Script 1132 - [105,75,null,33]: {1=34, 2=84, 3=117, 4=118, 5=119, 6=120, 7=121, 8=122, 9=123, 10=124, 11=125, 12=126} +Script 1133 - [105,75,null,67]: {1=68, 2=127, 3=159, 4=160, 5=161, 6=162, 7=163, 8=164, 9=165, 10=166, 11=167, 12=168} +Script 1134 - [105,75,null,36]: {1=37, 2=38, 3=39, 4=40, 5=85, 6=86, 7=87, 8=88, 9=89, 10=90} +Script 1135 - [105,75,null,70]: {1=71, 2=72, 3=73, 4=74, 5=75, 6=76, 7=77, 8=128, 9=129, 10=130, 11=131, 12=132, 13=133, 14=134} +Script 1136 - [105,75,null,42]: {1=43} +Script 1137 - [105,75,null,79]: {1=80} +Script 1138 - [0,0,null,0]: null +Script 1139 - [0,0,null,0]: null +Script 1140 - [0,0,null,0]: null +Script 1141 - [0,0,null,0]: null +Script 1142 - [0,0,null,0]: null +Script 1143 - [0,0,null,0]: null +Script 1144 - [0,0,null,0]: null +Script 1145 - [0,0,null,0]: null +Script 1146 - [0,0,null,0]: null +Script 1147 - [0,0,null,0]: null +Script 1148 - [0,0,null,0]: null +Script 1149 - [0,0,null,0]: null +Script 1150 - [0,0,null,0]: null +Script 1151 - [105,109,null,-1]: {1=31039, 2=31035, 3=31042, 4=31050, 5=31051, 6=31029, 7=31032, 8=31043, 9=31031, 10=31049, 11=31060, 12=31033} +Script 1152 - [105,109,null,-1]: {1=31036, 2=31046, 3=31056, 4=31027, 5=31026, 6=31045, 7=31048, 8=31058, 9=31028, 10=31041, 11=31044, 12=31057} +Script 1153 - [105,73,null,-1]: {1=17629192, 2=17629193, 3=17629194, 4=17629195, 5=17629196, 6=17629197, 7=17629198, 8=17629199, 9=17629200, 10=17629201, 11=17629202, 12=17629203, 13=17629204, 14=17629205, 15=17629206, 17=17629208, 16=17629207, 19=17629210, 18=17629209, 21=17629212, 20=17629211, 23=17629214, 22=17629213, 25=17629216, 24=17629215, 27=17629218, 26=17629217, 29=17629220, 28=17629219, 31=17629222, 30=17629221, 34=17629225, 35=17629226, 32=17629223, 33=17629224, 36=17629227} +Script 1154 - [105,73,null,-1]: {0=17629186, 1=17629187, 2=17629188} +Script 1155 - [105,109,null,-1]: {0=31054, 1=31038, 2=31055} +Script 1156 - [105,105,null,0]: {0=80, 1=75, 2=60, 3=50} +Script 1157 - [105,105,null,0]: {0=10, 1=10, 2=10, 3=10} +Script 1158 - [105,105,null,0]: {0=95, 1=85, 2=75, 3=60} +Script 1159 - [105,105,null,0]: {0=10, 1=10, 2=15, 3=15} +Script 1160 - [105,105,null,0]: {0=70, 1=65, 2=55, 3=45} +Script 1161 - [105,105,null,0]: {0=10, 1=10, 2=10, 3=5} +Script 1162 - [105,105,null,0]: {0=1, 1=35, 2=70, 3=105} +Script 1163 - [0,0,null,0]: null +Script 1164 - [0,0,null,0]: null +Script 1165 - [0,0,null,0]: null +Script 1166 - [0,0,null,0]: null +Script 1167 - [0,0,null,0]: null +Script 1168 - [0,0,null,0]: null +Script 1169 - [0,0,null,0]: null +Script 1170 - [0,0,null,0]: null +Script 1171 - [0,0,null,0]: null +Script 1172 - [0,0,null,0]: null +Script 1173 - [0,0,null,0]: null +Script 1174 - [0,0,null,0]: null +Script 1175 - [0,0,null,0]: null +Script 1176 - [0,0,null,0]: null +Script 1177 - [0,0,null,0]: null +Script 1178 - [0,0,null,0]: null +Script 1179 - [0,0,null,0]: null +Script 1180 - [0,0,null,0]: null +Script 1181 - [0,0,null,0]: null +Script 1182 - [105,111,null,526]: {1=12047, 2=12043, 3=12059, 4=12019, 5=12009, 6=12778, 7=12049, 8=12055, 9=12808, 10=12067, 11=12063, 12=12091, 13=12800, 14=12053, 15=12065, 17=12818, 16=12021, 19=12798, 18=12780, 21=12087, 20=12814, 23=12051, 22=12071, 25=12097, 24=12095, 27=12101, 26=12099, 29=12105, 28=12103, 31=12816, 30=12107, 34=12007, 35=12035, 32=12041, 33=12061, 38=12812, 39=12784, 36=12027, 37=12531, 42=12085, 43=12037, 40=12810, 41=12023, 46=12123, 47=12031, 44=12015, 45=12045, 51=12057, 50=12820, 49=12033, 48=12029, 55=12782, 54=12011, 53=12069, 52=12792, 59=12804, 58=12802, 57=12013, 56=12794, 63=12788, 62=12017, 61=12025, 60=12806, 68=12079, 69=12081, 70=12083, 71=12039, 64=12776, 65=12073, 66=12075, 67=12077, 76=12093, 77=12790, 72=12786, 73=12089, 74=12796, 75=12822} +Script 1183 - [105,111,null,526]: {1=12231, 2=12225, 3=12236, 4=12255, 5=12226, 6=12286, 7=12256, 8=12240, 9=12290, 10=12245, 11=12241, 12=12237, 13=12276, 14=12227, 15=12246, 17=12282, 16=12232, 19=12283, 18=12284, 21=12243, 20=12285, 23=12229, 22=12228, 25=12266, 24=12266, 27=12266, 26=12266, 29=12266, 28=12266, 31=12288, 30=12266, 34=12238, 35=12258, 32=12235, 33=12259, 38=12274, 39=12289, 36=12257, 37=12233, 42=12239, 43=12234, 40=12275, 41=12267, 46=12252, 47=12253, 44=12254, 45=12265, 51=12249, 50=12244, 49=12230, 48=12262, 55=12291, 54=12247, 53=12242, 52=12279, 59=12273, 58=12271, 57=12269, 56=12261, 63=12277, 62=12260, 61=12263, 60=12272, 68=12264, 69=12264, 70=12264, 71=12250, 64=12270, 65=12264, 66=12264, 67=12264, 76=12251, 77=12278, 72=12280, 73=12268, 74=12281, 75=12287} +Script 1184 - [105,111,null,526]: {1=12377, 2=12293, 3=12353, 4=12359, 5=12355, 6=12409, 7=12381, 8=12357, 9=12415, 10=12351, 11=12327, 12=12313, 13=12395, 14=12375, 15=12321, 17=12407, 16=12303, 19=12407, 18=12407, 21=12301, 20=12407, 23=12371, 22=12335, 25=12311, 24=12311, 27=12311, 26=12311, 29=12311, 28=12311, 31=12411, 30=12311, 34=12345, 35=12299, 32=12337, 33=12347, 38=12391, 39=12419, 36=12325, 37=12363, 42=12317, 43=12297, 40=12393, 41=12329, 46=12367, 47=12369, 44=12361, 45=12365, 51=12349, 50=12333, 49=12319, 48=12309, 55=12417, 54=12339, 53=12331, 52=12401, 59=12389, 58=12389, 57=12385, 56=12343, 63=12397, 62=12295, 61=12323, 60=12389, 68=12341, 69=12341, 70=12341, 71=12373, 64=12387, 65=12341, 66=12341, 67=12341, 76=12383, 77=12399, 72=12405, 73=12379, 74=12403, 75=12413} +Script 1185 - [111,105,null,0]: {12079=66, 12798=34, 12796=93, 12077=56, 12075=46, 12794=77, 12073=36, 12792=73, 12790=99, 12071=41, 12788=83, 12069=74, 12786=89, 12067=23, 12784=57, 12065=32, 12782=76, 12095=43, 12093=96, 12780=34, 12778=17, 12091=28, 12089=92, 12776=85, 12087=40, 12085=61, 12083=86, 12081=76, 12531=56, 12045=64, 12047=1, 12041=47, 12043=4, 12037=62, 12039=88, 12033=69, 12035=54, 12061=49, 12063=25, 12057=71, 12059=10, 12053=31, 12055=19, 12049=18, 12051=42, 12017=83, 12806=79, 12804=79, 12019=13, 12802=79, 12021=33, 12023=58, 12800=29, 12025=80, 12814=34, 12812=57, 12027=55, 12029=68, 12810=57, 12031=67, 12808=22, 12822=95, 12820=70, 12818=34, 12007=52, 12816=46, 12009=16, 12011=75, 12013=78, 12015=63, 12105=43, 12107=43, 12097=43, 12099=43, 12101=43, 12103=43, 12123=66} +Script 1186 - [111,115,You may not check this pouch for its ingredients.,0]: {12079=This pouch requires 1 mithril bar, 1 blue charm and 152 spirit shards., 12798=This pouch requires 1 torcher charm, 1 blue charm and 74 spirit shards., 12796=This pouch requires 1 abyssal charm, 1 green charm and 113 spirit shards., 12077=This pouch requires 1 steel bar, 1 blue charm and 141 spirit shards., 12075=This pouch requires 1 iron bar, 1 blue charm and 125 spirit shards., 12794=This pouch requires 1 talon beast charm, 1 crimson charm and 174 spirit shards., 12073=This pouch requires 1 bronze bar, 1 blue charm and 102 spirit shards., 12792=This pouch requires 1 obsidian charm, 1 blue charm and 195 spirit shards., 12790=This pouch requires 1 steel platebody, 1 crimson charm and 178 spirit shards., 12071=This pouch requires 1 clean guam leaf, 1 green charm and 78 spirit shards., 12788=This pouch requires 1 obsidian charm, 1 blue charm and 219 spirit shards., 12069=This pouch requires one 500g block of granite, 1 crimson charm and 166 spirit shards., 12786=This pouch requires 1 water talisman, 1 blue charm and 222 spirit shards., 12067=This pouch requires 1 raw rat meat, 1 blue charm and 75 spirit shards., 12784=This pouch requires 1 perfect larupia fur, 1 blue charm and 155 spirit shards., 12065=This pouch requires 1 honeycomb, 1 crimson charm and 84 spirit shards., 12782=This pouch requires 1 ruby harvest butterfly, 1 green charm and 141 spirit shards., 12095=This pouch requires 1 cockatrice egg, 1 green charm and 88 spirit shards., 12093=This pouch requires 1 yak hide, 1 crimson charm and 211 spirit shards., 12780=This pouch requires 1 spinner charm, 1 blue charm and 74 spirit shards., 12778=This pouch requires 1 mosquito proboscis, 1 gold charm and 1 spirit shard., 12091=This pouch requires 1 bucket of compost, 1 green charm and 47 spirit shards., 12089=This pouch requires 1 raw rabbit, 1 wolf bones, 1 crimson charm and 203 spirit shards., 12776=This pouch requires 1 swamp lizard, 1 crimson charm and 150 spirit shards., 12087=This pouch requires 1 marigold, 1 gold charm and 11 spirit shards., 12085=This pouch requires 1 pile of goat horn dust, 1 crimson charm and 141 spirit shards., 12083=This pouch requires 1 runite bar, 1 blue charm and 1 spirit shard., 12081=This pouch requires 1 adamantite bar, 1 blue charm and 144 spirit shards., 12531=This pouch requires 1 harpoon, 1 green charm and 109 spirit shards., 12045=This pouch requires 1 bagged plant 1, 1 crimson charm and 128 spirit shards., 12047=This pouch requires 1 set of wolf bones, 1 gold charm and 7 spirit shards., 12041=This pouch requires 1 gold ring, 1 green charm and 88 spirit shards., 12043=This pouch requires 1 raw chicken, 1 gold charm and 8 spirit shards., 12037=This pouch requires 1 abyssal charm, 1 green charm and 119 spirit shards., 12039=This pouch requires 1 unicorn horn, 1 green charm and 140 spirit shards., 12033=This pouch requires 1 banana, 1 green charm and 130 spirit shards., 12035=This pouch requires 1 abyssal charm, 1 green charm and 106 spirit shards., 12061=This pouch requires 1 raw beef, 1 crimson charm and 117 spirit shards., 12063=This pouch requires 1 potato cactus, 1 blue charm and 51 spirit shards., 12057=This pouch requires 1 polar kebbit fur, 1 gold charm and 14 spirit shards., 12059=This pouch requires 1 spider carcass, 1 gold charm and 8 spirit shards., 12053=This pouch requires 1 vampire dust, 1 crimson charm and 81 spirit shards., 12055=This pouch requires 1 pair of bronze claws, 1 crimson charm and 57 spirit shards., 12049=This pouch requires 1 bucket of sand, 1 green charm and 45 spirit shards., 12051=This pouch requires 1 carved evil turnip, 1 crimson charm and 104 spirit shards., 12017=This pouch requires 1 dagannoth hide, 1 crimson charm and 1 spirit shard., 12806=This pouch requires 1 air talisman, 1 water talisman, 1 blue charm and 198 spirit shards., 12804=This pouch requires 1 earth talisman, 1 blue charm and 202 spirit shards., 12019=This pouch requires 1 uncooked thin snail, 1 gold charm and 9 spirit shards., 12802=This pouch requires 1 fire talisman, 1 blue charm and 198 spirit shards., 12021=This pouch requires 1 willow log, 1 green charm and 72 spirit shards., 12023=This pouch requires 1 empty fishbowl, 1 blue charm and 144 spirit shards., 12800=This pouch requires 1 chinchompa, 1 blue charm and 84 spirit shards., 12025=This pouch requires 1 water orb, 1 green charm and 128 spirit shards., 12814=This pouch requires 1 shifter charm, 1 blue charm and 74 spirit shards., 12812=This pouch requires 1 perfect kyatt fur, 1 blue charm and 153 spirit shards., 12027=This pouch requires 1 jug of water, 1 blue charm and 151 spirit shards., 12029=This pouch requires 1 raw shark, 1 green charm and 110 spirit shards., 12810=This pouch requires 1 perfect graahk fur, 1 blue charm and 154 spirit shards., 12031=This pouch requires 1 tortoise shell, 1 gold charm and 1 spirit shard., 12808=This pouch requires 1 obsidian charm, 1 crimson charm and 64 spirit shards., 12822=This pouch requires 1 iron platebody, 1 crimson charm and 198 spirit shards., 12820=This pouch requires 1 pot of flour, 1 crimson charm and 79 spirit shards., 12818=This pouch requires 1 ravager charm, 1 green charm and 74 spirit shards., 12007=This pouch requires 1 raw bird meat, 1 gold charm and 12 spirit shards., 12816=This pouch requires 1 tinderbox, 1 crimson charm and 111 spirit shards., 12009=This pouch requires 1 iron ore, 1 gold charm and 7 spirit shards., 12011=This pouch requires 1 bunch of red flowers, 1 crimson charm and 168 spirit shards., 12013=This pouch requires 1 willow branch, 1 green charm and 124 spirit shards., 12015=This pouch requires 1 snake hide, 1 crimson charm and 116 spirit shards., 12105=This pouch requires 1 coraxatrice egg, 1 green charm and 88 spirit shards., 12107=This pouch requires 1 vulatrice egg, 1 green charm and 88 spirit shards., 12292=This pouch is not yet available., 12097=This pouch requires 1 guthatrice egg, 1 green charm and 88 spirit shards., 12099=This pouch requires 1 saratrice egg, 1 green charm and 88 spirit shards., 12101=This pouch requires 1 zamatrice egg, 1 green charm and 88 spirit shards., 12103=This pouch requires 1 pengatrice egg, 1 green charm and 88 spirit shards., 12123=This pouch requires 1 swamp toad, 1 gold charm and 11 spirit shards.} +Script 1187 - [111,115,Familiar,0]: {12017=Spirit dagannoth pouch, 12806=Ice titan pouch, 12804=Moss titan pouch, 12019=Thorny snail pouch, 12802=Fire titan pouch, 12021=Beaver pouch, 12023=Karamthulhu overlord pouch, 12800=Giant chinchompa pouch, 12025=Hydra pouch, 12814=Void shifter pouch, 12812=Spirit kyatt pouch, 12027=Spirit jelly pouch, 12029=Bunyip pouch, 12810=Spirit graahk pouch, 12031=War tortoise pouch, 12808=Spirit Tz-Kih pouch, 12822=Iron titan pouch, 12820=Ravenous locust pouch, 12818=Void ravager pouch, 12007=Spirit terrorbird pouch, 12816=Pyrelord pouch, 12830=Famine scroll, 12009=Granite crab pouch, 12831=Deadly Claw scroll, 12828=Iron Within scroll, 12011=Praying mantis pouch, 12829=Immense Heat scroll, 12826=Volcanic Strength scroll, 12013=Giant ent pouch, 12827=Essence Shipment scroll, 12824=Titan's Constitution scroll, 12015=Spirit cobra pouch, 12825=Steel of Legends scroll, 12837=Ebon Thunder scroll, 12836=Ambush scroll, 12839=Fireball Assault scroll, 12838=Pester scroll, 12833=Boil scroll, 12832=Swamp Plague scroll, 12835=Goad scroll, 12292=Reserved, 12834=Explode scroll, 12841=Inferno scroll, 12840=Rending scroll, 12079=Mithril minotaur pouch, 12798=Void torcher pouch, 12796=Abyssal titan pouch, 12077=Steel minotaur pouch, 12075=Iron minotaur pouch, 12794=Talon beast pouch, 12073=Bronze minotaur pouch, 12792=Obsidian golem pouch, 12790=Steel titan pouch, 12071=Macaw pouch, 12788=Lava titan pouch, 12069=Granite lobster pouch, 12786=Geyser titan pouch, 12067=Albino rat pouch, 12784=Spirit larupia pouch, 12065=Honey badger pouch, 12782=Forge regent pouch, 12095=Spirit cockatrice pouch, 12093=Pack yak pouch, 12780=Void spinner pouch, 12778=Spirit mosquito pouch, 12091=Compost mound pouch, 12089=Wolpertinger pouch, 12776=Swamp titan pouch, 12533=Stony Shell scroll, 12087=Bull ant pouch, 12085=Smoke devil pouch, 12083=Rune minotaur pouch, 12081=Adamant minotaur pouch, 12531=Ibis pouch, 12045=Stranger plant pouch, 12047=Spirit wolf pouch, 12041=Magpie pouch, 12043=Dreadfowl pouch, 12037=Abyssal lurker pouch, 12039=Unicorn stallion pouch, 12033=Fruit bat pouch, 12035=Abyssal parasite pouch, 12061=Bloated leech pouch, 12063=Spirit kalphite pouch, 12057=Arctic bear pouch, 12059=Spirit spider pouch, 12053=Vampire bat pouch, 12055=Spirit scorpion pouch, 12049=Desert wyrm pouch, 12051=Evil turnip pouch, 12456=Spike Shot scroll, 12457=Acorn Missile scroll, 12458=Petrifying Gaze scroll, 12459=Slime Spray scroll, 12460=Electric Lash scroll, 12461=Bronze Bull Rush scroll, 12462=Iron Bull Rush scroll, 12463=Steel Bull Rush scroll, 12448=Evil Flames scroll, 12449=Crushing Claw scroll, 12450=Mantis Strike scroll, 12451=Arctic Blast scroll, 12452=Toad Bark scroll, 12453=Dissolve scroll, 12454=Abyssal Drain scroll, 12455=Doomsphere Device scroll, 12465=Adamant Bull Rush scroll, 12464=Mithril Bull Rush scroll, 12467=Poisonous Blast scroll, 12466=Rune Bull Rush scroll, 12468=Dust Cloud scroll, 12426=Thieving Fingers scroll, 12427=Abyssal Stealth scroll, 12105=Spirit coraxatrice pouch, 12424=Fish Rain scroll, 12425=Howl scroll, 12107=Spirit vulatrice pouch, 12430=Cheese Feast scroll, 12431=Unburden scroll, 12428=Egg Spawn scroll, 12429=Multichop scroll, 12097=Spirit guthatrice pouch, 12099=Spirit saratrice pouch, 12422=Herbcall scroll, 12423=Fruitfall scroll, 12101=Spirit zamatrice pouch, 12421=Reserved, 12103=Spirit pengatrice pouch, 12443=Call to Arms scroll, 12442=Regrowth scroll, 12441=Tireless Run scroll, 12123=Barker toad pouch, 12440=Generate Compost scroll, 12447=Vampire Touch scroll, 12446=Sandstorm scroll, 12445=Dreadfowl Strike scroll, 12444=Blood Drain scroll, 12435=Winter Storage scroll, 12434=Healing Aura scroll, 12433=Insane Ferocity scroll, 12432=Venom Shot scroll, 12439=Testudo scroll, 12438=Swallow Whole scroll, 12437=Magic Focus scroll, 12436=Ophidian Incubation scroll} +Script 1188 - [105,111,null,526]: {1=12425, 2=12445, 3=12428, 4=12459, 5=12533, 6=12838, 7=12460, 8=12432, 9=12839, 10=12430, 11=12446, 12=12440, 13=12834, 14=12447, 15=12433, 17=12443, 16=12429, 19=12443, 18=12443, 21=12431, 20=12443, 23=12448, 22=12422, 25=12458, 24=12458, 27=12458, 26=12458, 29=12458, 28=12458, 31=12829, 30=12458, 34=12441, 35=12454, 32=12426, 33=12444, 38=12836, 39=12840, 36=12453, 37=12424, 42=12468, 43=12427, 40=12835, 41=12455, 46=12452, 47=12439, 44=12436, 45=12467, 51=12451, 50=12830, 49=12423, 48=12438, 55=12841, 54=12450, 53=12449, 52=12826, 59=12824, 58=12824, 57=12457, 56=12831, 63=12837, 62=12456, 61=12442, 60=12824, 68=12464, 69=12465, 70=12466, 71=12434, 64=12832, 65=12461, 66=12462, 67=12463, 76=12435, 77=12825, 72=12833, 73=12437, 74=12827, 75=12828} +Script 1189 - [111,105,null,0]: {12089=1, 12047=1} +Script 1190 - [111,105,null,0]: {12123=1, 12019=1, 12047=1, 12057=1, 12778=1, 12007=1, 12059=1, 12043=1, 12087=1, 12009=1, 12031=1} +Script 1191 - [111,105,null,0]: {12037=1, 12796=1, 12035=1} +Script 1192 - [111,105,null,0]: {12043=1} +Script 1193 - [111,105,null,0]: {12059=1} +Script 1194 - [111,105,null,0]: {12105=1, 12796=1, 12107=1, 12041=1, 12021=1, 12025=1, 12037=1, 12097=1, 12071=1, 12039=1, 12099=1, 12033=1, 12029=1, 12101=1, 12035=1, 12103=1, 12782=1, 12095=1, 12818=1, 12091=1, 12013=1, 12049=1, 12531=1} +Script 1195 - [111,105,null,0]: {12009=1} +Script 1196 - [111,105,null,0]: {12049=1} +Script 1197 - [111,105,null,0]: {12063=1} +Script 1198 - [111,105,null,0]: {12053=1} +Script 1199 - [111,105,null,0]: {12065=1} +Script 1200 - [111,105,null,0]: {12051=1} +Script 1201 - [111,105,null,0]: {12041=1} +Script 1202 - [111,105,null,0]: {12013=1} +Script 1203 - [111,105,null,0]: {12033=1} +Script 1204 - [111,105,null,0]: {12069=1} +Script 1205 - [111,105,null,0]: {12782=1} +Script 1206 - [111,105,null,0]: {12039=1} +Script 1207 - [111,105,null,0]: {12093=1} +Script 1208 - [111,105,null,0]: {12031=1} +Script 1209 - [111,105,null,0]: {12015=1} +Script 1210 - [111,105,null,0]: {12079=1, 12806=1, 12798=1, 12077=1, 12804=1, 12075=1, 12802=1, 12073=1, 12792=1, 12023=1, 12800=1, 12814=1, 12788=1, 12812=1, 12027=1, 12786=1, 12810=1, 12067=1, 12784=1, 12780=1, 12063=1, 12083=1, 12081=1} +Script 1211 - [111,105,null,0]: {12023=1} +Script 1212 - [111,105,null,0]: {12089=1} +Script 1213 - [0,0,null,0]: null +Script 1214 - [111,105,null,0]: {12776=150, 12794=50} +Script 1215 - [111,105,null,0]: {12794=1} +Script 1216 - [111,105,null,0]: {12091=1} +Script 1217 - [111,105,null,0]: {12019=1} +Script 1218 - [111,105,null,0]: {12017=1, 12045=1, 12794=1, 12790=1, 12069=1, 12065=1, 12808=1, 12822=1, 12061=1, 12093=1, 12820=1, 12089=1, 12776=1, 12816=1, 12053=1, 12011=1, 12085=1, 12055=1, 12015=1, 12051=1} +Script 1219 - [111,105,null,0]: {12095=1} +Script 1220 - [111,105,null,0]: {12097=1} +Script 1221 - [111,105,null,0]: {12099=1} +Script 1222 - [111,105,null,0]: {12101=1} +Script 1223 - [111,105,null,0]: {12103=1} +Script 1224 - [111,105,null,0]: {12105=1} +Script 1225 - [111,105,null,0]: {12107=1} +Script 1226 - [111,105,null,0]: {12806=1, 12786=1} +Script 1227 - [111,105,null,0]: null +Script 1228 - [111,105,null,0]: {12029=1} +Script 1229 - [111,105,null,0]: {12812=1} +Script 1230 - [111,105,null,0]: {12810=1} +Script 1231 - [111,105,null,0]: {12077=1} +Script 1232 - [111,105,null,0]: {12788=1, 12792=1, 12808=1} +Script 1233 - [111,105,null,0]: {12818=1} +Script 1234 - [111,105,null,0]: {12814=1} +Script 1235 - [111,105,null,0]: {12780=1} +Script 1236 - [111,105,null,0]: {12798=1} +Script 1237 - [111,105,null,0]: {12814=1} +Script 1238 - [111,105,null,0]: {12778=1} +Script 1239 - [111,105,null,0]: {12784=1} +Script 1240 - [111,105,null,0]: {12075=1} +Script 1241 - [111,105,null,0]: {12055=1} +Script 1242 - [111,105,null,0]: {12067=1} +Script 1243 - [111,105,null,0]: {12087=1} +Script 1244 - [111,105,null,0]: {12820=1} +Script 1245 - [111,105,null,0]: {12021=1} +Script 1246 - [111,105,null,0]: {12816=1} +Script 1247 - [111,105,null,0]: {12061=1} +Script 1248 - [111,105,null,0]: null +Script 1249 - [111,105,null,0]: {12071=1} +Script 1250 - [111,105,null,0]: {12800=1} +Script 1251 - [111,105,null,0]: {12007=1} +Script 1252 - [111,105,null,0]: {12027=1} +Script 1253 - [111,105,null,0]: {12531=1} +Script 1254 - [111,105,null,0]: {12085=1} +Script 1255 - [111,105,null,0]: {12045=1} +Script 1256 - [111,105,null,0]: {12057=1} +Script 1257 - [111,105,null,0]: {12011=1} +Script 1258 - [111,105,null,0]: {12806=1} +Script 1259 - [111,105,null,0]: {12804=1} +Script 1260 - [111,105,null,0]: {12802=1} +Script 1261 - [111,105,null,0]: {12025=1} +Script 1262 - [111,105,null,0]: {12017=1} +Script 1263 - [111,105,null,0]: {12776=1} +Script 1264 - [111,105,null,0]: {12073=1} +Script 1265 - [111,105,null,0]: {12079=1} +Script 1266 - [111,105,null,0]: {12081=1} +Script 1267 - [111,105,null,0]: {12083=1} +Script 1268 - [111,105,null,0]: {12822=1} +Script 1269 - [111,105,null,0]: {12790=1} +Script 1270 - [111,105,null,0]: {12079=152, 12798=74, 12796=113, 12077=141, 12075=125, 12794=174, 12073=102, 12792=195, 12790=178, 12071=78, 12788=219, 12069=166, 12786=222, 12067=75, 12784=155, 12065=84, 12782=141, 12095=88, 12093=211, 12780=74, 12778=1, 12091=47, 12089=203, 12776=150, 12087=11, 12085=141, 12083=1, 12081=144, 12531=109, 12045=128, 12047=7, 12041=88, 12043=8, 12037=119, 12039=140, 12033=130, 12035=106, 12061=117, 12063=51, 12057=14, 12059=8, 12053=81, 12055=57, 12049=45, 12051=104, 12017=1, 12806=198, 12804=202, 12019=9, 12802=198, 12021=72, 12023=144, 12800=84, 12025=128, 12814=74, 12812=153, 12027=151, 12029=110, 12810=154, 12031=1, 12808=64, 12822=198, 12820=79, 12818=74, 12007=12, 12816=111, 12009=7, 12011=168, 12013=124, 12015=116, 12105=88, 12107=88, 12097=88, 12099=88, 12101=88, 12103=88, 12123=11} +Script 1271 - [0,0,null,0]: null +Script 1272 - [0,0,null,0]: null +Script 1273 - [0,0,null,0]: null +Script 1274 - [0,0,null,0]: null +Script 1275 - [105,65,null,8374]: {1=4844, 2=6824, 3=8378, 4=8374, 5=5665, 6=8476, 7=6552, 8=7639, 9=8383, 10=4844, 11=8394, 12=8397, 13=8418, 14=8412, 15=8402, 17=8420, 16=8406, 19=8485, 18=8433, 21=8430, 20=8425, 23=8454, 22=8464, 25=8442, 24=8458, 27=8444, 26=8437, 29=8488, 28=8450, 31=8387, 30=8474, 34=8469, 32=8480, 33=8493} +Script 1276 - [105,65,null,8373]: {1=4846, 2=8, 3=8376, 4=8373, 5=5661, 6=8477, 7=6551, 8=7637, 9=8381, 10=8390, 11=8392, 12=8396, 13=8416, 14=8413, 15=8399, 17=8421, 16=8404, 19=8483, 18=8431, 21=8429, 20=8423, 23=8452, 22=8463, 25=8440, 24=8456, 27=8445, 26=8436, 29=8487, 28=8448, 31=8385, 30=8473, 34=8467, 32=8482, 33=8491} +Script 1277 - [105,111,null,526]: {1=12047, 2=12043, 3=12059, 4=12019, 5=12009, 6=12778, 7=12049, 8=12055, 9=12808, 10=12067, 11=12063, 12=12091, 13=12800, 14=12053, 15=12065, 17=12818, 16=12021, 19=12798, 18=12780, 21=12087, 20=12814, 23=12051, 22=12071, 25=12097, 24=12095, 27=12101, 26=12099, 29=12105, 28=12103, 31=12816, 30=12107, 34=12007, 35=12035, 32=12041, 33=12061, 38=12812, 39=12784, 36=12027, 37=12531, 42=12085, 43=12037, 40=12810, 41=12023, 46=12123, 47=12031, 44=12015, 45=12045, 51=12057, 50=12820, 49=12033, 48=12029, 55=12782, 54=12011, 53=12069, 52=12792, 59=12804, 58=12802, 57=12013, 56=12794, 63=12788, 62=12017, 61=12025, 60=12806, 68=12079, 69=12081, 70=12083, 71=12039, 64=12776, 65=12073, 66=12075, 67=12077, 76=12093, 77=12790, 72=12786, 73=12089, 74=12796, 75=12822} +Script 1278 - [105,115,Animal,0]: {1=Spirit wolf, 2=Dreadfowl, 3=Desert wyrm, 4=Spirit spider, 5=Thorny snail, 6=Granite crab, 7=Spirit scorpion, 8=Spirit Tz-Kih, 9=Albino rat, 10=Spirit kalphite, 11=Compost mound, 12=Ravenous locust, 13=Vampire bat, 14=Honey badger, 15=Beaver, 17=Void spinner, 16=Void ravager, 19=Void torcher, 18=Void shifter, 21=Bull ant, 20=Mosquito, 23=Evil turnip, 22=Macaw, 25=Spirit guthatrice, 24=Spirit cockatrice, 27=Spirit zamatrice, 26=Spirit saratrice, 29=Spirit coraxatrice, 28=Spirit pengatrice, 30=Spirit vulatrice, 34=Bloated leech, 35=Giant chinchompa, 32=Pyrelord, 33=Magpie, 38=Spirit jelly, 39=Ibis, 36=Spirit terrorbird, 37=Abyssal parasite, 42=Spirit graahk, 43=Karamthulhu overlord, 40=Spirit kyatt, 41=Spirit larupia, 46=Spirit cobra, 47=Stranger plant, 44=Smoke devil, 45=Abyssal lurker, 51=Fruit bat, 50=Bunyip, 49=War tortoise, 48=Barker toad, 55=Praying mantis, 54=Obsidian golem, 53=Arctic bear, 52=Granite lobster, 59=Fire titan, 58=Giant ent, 57=Talon beast, 56=Forge regent, 63=Spirit dagannoth, 62=Hydra, 61=Moss titan, 60=Ice titan, 68=Steel minotaur, 69=Mithril minotaur, 70=Adamant minotaur, 71=Rune minotaur, 64=Lava titan, 65=Swamp titan, 66=Bronze minotaur, 67=Iron minotaur, 76=Iron titan, 77=Pack yak, 78=Steel titan, 72=Unicorn stallion, 73=Geyser titan, 74=Wolpertinger, 75=Abyssal titan} +Script 1279 - [110,115,Animal,0]: {6813=Bunyip, 6815=War tortoise, 6809=Karamthulhu overlord, 6808=Beaver, 6811=Hydra, 6804=Spirit dagannoth, 6806=Thorny snail, 6800=Giant ent, 6802=Spirit cobra, 6796=Granite crab, 6798=Praying mantis, 6794=Spirit terrorbird, 6847=Albino rat, 6845=Honey badger, 6843=Bloated leech, 7377=Pyrelord, 6841=Spirit spider, 6839=Arctic bear, 6837=Spirit scorpion, 6835=Vampire bat, 6833=Evil turnip, 7365=Spirit kyatt, 6831=Desert wyrm, 7367=Void shifter, 6829=Spirit wolf, 6827=Stranger plant, 7361=Spirit Tz-Kih, 6824=Magpie, 7363=Spirit graahk, 6825=Dreadfowl, 6822=Unicorn stallion, 7372=Ravenous locust, 6820=Abyssal lurker, 7375=Iron titan, 6818=Abyssal parasite, 7370=Void ravager, 6817=Fruit bat, 6873=Pack yak, 7347=Talon beast, 7345=Obsidian golem, 6875=Spirit cockatrice, 6877=Spirit guthatrice, 7351=Void torcher, 7349=Abyssal titan, 6879=Spirit saratrice, 7355=Fire titan, 6865=Smoke devil, 7353=Giant chinchompa, 6867=Bull ant, 6869=Wolpertinger, 7359=Ice titan, 6991=Ibis, 7357=Moss titan, 6871=Compost mound, 6994=Spirit kalphite, 6857=Steel minotaur, 7331=Spirit mosquito, 6992=Spirit jelly, 6859=Mithril minotaur, 7329=Swamp titan, 6861=Adamant minotaur, 7335=Forge regent, 6863=Rune minotaur, 7333=Void spinner, 7339=Geyser titan, 6849=Granite lobster, 7337=Spirit larupia, 6851=Macaw, 7343=Steel titan, 6853=Bronze minotaur, 6855=Iron minotaur, 7341=Lava titan, 6889=Barker toad, 6883=Spirit pengatrice, 6881=Spirit zamatrice, 6887=Spirit vulatrice, 6885=Spirit coraxatrice} +Script 1280 - [0,0,null,0]: null +Script 1281 - [0,0,null,0]: null +Script 1282 - [110,73,null,43384878]: {6813=43384984, 6815=43384948, 6809=43384966, 6808=43384920, 6811=43384976, 6804=43384978, 6806=43384950, 6800=43384970, 6802=43384946, 6796=43384906, 6798=43384926, 6794=43384960, 6847=43384934, 6845=43384936, 6843=43384962, 7377=43385016, 6841=43384914, 6839=43384940, 6837=43384932, 6835=43384902, 6833=43384908, 7365=43385000, 6831=43384952, 7367=43384988, 6829=43384898, 6827=43384972, 7361=43385010, 6824=43384912, 7363=43384998, 6825=43384900, 6822=43384944, 7372=43384928, 6820=43384918, 7375=43385014, 6818=43384956, 7370=43384988, 6817=43384910, 6873=43384942, 7347=43384974, 7345=43385004, 6875=43384958, 6877=43384958, 7351=43384988, 7349=43385006, 6879=43384958, 7355=43384990, 6865=43384964, 7353=43384996, 6867=43384922, 6869=43384982, 7359=43384990, 6991=43384916, 7357=43384990, 6871=43384968, 6994=43384930, 6857=43384980, 7331=43385008, 6992=43384954, 6859=43384980, 7329=43384986, 6861=43384980, 7335=43385018, 6863=43384980, 7333=43384988, 7339=43384992, 6849=43384924, 7337=43385012, 6851=43384904, 7343=43384994, 6853=43384980, 6855=43384980, 7341=43385002, 6889=43384938, 6883=43384958, 6881=43384958, 6887=43384958, 6885=43384958} +Script 1283 - [111,111,null,526]: {12079=12464, 12798=12443, 12796=12827, 12077=12463, 12075=12462, 12794=12831, 12073=12461, 12792=12826, 12790=12825, 12071=12422, 12788=12837, 12069=12449, 12786=12833, 12067=12430, 12784=12840, 12065=12433, 12782=12841, 12095=12458, 12093=12435, 12780=12443, 12778=12838, 12091=12440, 12089=12437, 12776=12832, 12087=12431, 12085=12468, 12083=12466, 12081=12465, 12531=12424, 12045=12467, 12047=12425, 12041=12426, 12043=12445, 12037=12427, 12039=12434, 12033=12423, 12035=12454, 12061=12444, 12063=12446, 12057=12451, 12059=12428, 12053=12447, 12055=12432, 12049=12460, 12051=12448, 12017=12456, 12806=12824, 12804=12824, 12019=12459, 12802=12824, 12021=12429, 12023=12455, 12800=12834, 12025=12442, 12814=12443, 12812=12836, 12027=12453, 12029=12438, 12810=12835, 12031=12439, 12808=12839, 12822=12828, 12820=12830, 12818=12443, 12007=12441, 12816=12829, 12009=12533, 12011=12450, 12013=12457, 12015=12436, 12105=12458, 12107=12458, 12097=12458, 12099=12458, 12101=12458, 12103=12458, 12123=12452} +Script 1284 - [0,0,null,0]: null +Script 1285 - [0,0,null,0]: null +Script 1286 - [105,79,null,11760]: {1=12130, 2=12125, 3=12127} +Script 1287 - [105,79,null,11760]: {4=12207, 1=12155, 2=12183, 3=12204} +Script 1288 - [0,0,null,0]: null +Script 1289 - [0,0,null,0]: null +Script 1290 - [0,0,null,0]: null +Script 1291 - [0,0,null,0]: null +Script 1292 - [0,0,null,0]: null +Script 1293 - [0,0,null,0]: null +Script 1294 - [0,0,null,0]: null +Script 1295 - [0,0,null,0]: null +Script 1296 - [0,0,null,0]: null +Script 1297 - [0,0,null,0]: null +Script 1298 - [0,0,null,0]: null +Script 1299 - [0,0,null,0]: null +Script 1300 - [0,0,null,0]: null +Script 1301 - [0,0,null,0]: null +Script 1302 - [0,0,null,0]: null +Script 1303 - [0,0,null,0]: null +Script 1304 - [0,0,null,0]: null +Script 1305 - [0,0,null,0]: null +Script 1306 - [0,0,null,0]: null +Script 1307 - [0,0,null,0]: null +Script 1308 - [0,0,null,0]: null +Script 1309 - [0,0,null,0]: null +Script 1310 - [0,0,null,0]: null +Script 1311 - [0,0,null,0]: null +Script 1312 - [0,0,null,0]: null +Script 1313 - [0,0,null,0]: null +Script 1314 - [0,0,null,0]: null +Script 1315 - [0,0,null,0]: null +Script 1316 - [0,0,null,0]: null +Script 1317 - [111,105,null,0]: {12123=1} +Script 1318 - [0,0,null,0]: null +Script 1319 - [0,0,null,0]: null +Script 1320 - [111,110,null,6988]: {12079=6859, 12798=7351, 12796=7349, 12077=6857, 12075=6855, 12794=7347, 12073=6853, 12792=7345, 12790=7343, 12071=6851, 12788=7341, 12069=6849, 12786=7339, 12067=6847, 12784=7337, 12065=6845, 12782=7335, 12095=6875, 12093=6873, 12780=7333, 12778=7331, 12091=6871, 12089=6869, 12776=7329, 12087=6867, 12085=6865, 12083=6863, 12081=6861, 12531=6991, 12045=6827, 12047=6829, 12041=6824, 12043=6825, 12037=6820, 12039=6822, 12033=6817, 12035=6818, 12061=6843, 12063=6994, 12057=6839, 12059=6841, 12053=6835, 12055=6837, 12049=6831, 12051=6833, 12017=6804, 12806=7359, 12804=7357, 12019=6806, 12802=7355, 12021=6808, 12023=6809, 12800=7353, 12025=6811, 12814=7367, 12812=7365, 12027=6992, 12029=6813, 12810=7363, 12031=6815, 12808=7361, 12822=7375, 12820=7372, 12818=7370, 12007=6794, 12816=7377, 12009=6796, 12011=6798, 12013=6800, 12015=6802, 12105=6885, 12107=6887, 12097=6877, 12099=6879, 12101=6881, 12103=6883, 12123=6889} +Script 1321 - [105,79,null,11760]: {1=2134, 2=2132, 3=2136, 4=2138, 5=3226, 6=9978, 7=2876, 8=2142, 9=2140, 10=3228} +Script 1322 - [0,0,null,0]: null +Script 1323 - [0,0,null,0]: null +Script 1324 - [0,0,null,0]: null +Script 1325 - [0,0,null,0]: null +Script 1326 - [0,0,null,0]: null +Script 1327 - [105,79,null,11760]: {1=590, 2=2866, 3=2878, 4=314, 5=1351, 6=954, 7=1931, 8=1925, 9=2347, 10=946, 11=12561, 12=12563, 13=12565} +Script 1328 - [0,0,null,0]: null +Script 1329 - [0,0,null,0]: null +Script 1330 - [0,0,null,0]: null +Script 1331 - [0,0,null,0]: null +Script 1332 - [0,0,null,0]: null +Script 1333 - [0,0,null,0]: null +Script 1334 - [0,0,null,0]: null +Script 1335 - [0,0,null,0]: null +Script 1336 - [0,0,null,0]: null +Script 1337 - [0,0,null,0]: null +Script 1338 - [0,0,null,0]: null +Script 1339 - [0,0,null,0]: null +Script 1340 - [0,0,null,0]: null +Script 1341 - [0,0,null,0]: null +Script 1342 - [0,0,null,0]: null +Script 1343 - [0,0,null,0]: null +Script 1344 - [0,0,null,0]: null +Script 1345 - [105,115, ,0]: {0=Adventure, 1=Al Kharid, 2=Alone, 3=Ambient Jungle, 4=Arabian, 5=Arabian2, 6=Arabian3, 7=Arabique, 8=Army of Darkness, 9=Arrival, 10=Attack1, 11=Attack2, 12=Attack3, 13=Attack4, 14=Attack5, 15=Attack6, 17=Autumn Voyage, 16=Attention, 19=Ballad of Enchantment, 18=Background, 21=Beyond, 20=Baroque, 23=Book of Spells, 22=Big Chords, 25=Cave Background, 24=Camelot, 27=Chain of Command, 26=Cavern, 29=Crystal Sword, 28=Crystal Cave, 31=Dark, 30=Dangerous, 34=Doorways, 35=Dream, 32=Deep Wildy, 33=Desert Voyage, 38=Emotion, 39=Emperor, 36=Dunjun, 37=Egypt, 42=Expedition, 43=Faerie, 40=Expanse, 41=Expecting, 46=Fishing, 47=Flute Salad, 44=Fanfare, 45=Fanfare3, 51=Gnome King, 50=Garden, 49=Gaol, 48=Forever, 55=Goblin Village, 54=Gnome Village2, 53=Gnome Village, 52=Dwarf Theme, 59=High Seas, 58=Harmony, 57=Greatness, 56=Gnomeball, 63=Inspiration, 62=In the Manor, 61=Iban, 60=Horizon, 68=Jungly2, 69=Jungly3, 70=Knightly, 71=Lasting, 64=Intrepid, 65=Jolly-R, 66=Jungle Island, 67=Jungly1, 76=Long Way Home, 77=Lullaby, 78=Mage Arena, 79=Magic Dance, 72=Legion, 73=Lightness, 74=Lightwalk, 75=Long Ago, 85=Miracle Dance, 84=Miles Away, 87=Moody, 86=Monarch Waltz, 81=March, 80=Magical Journey, 83=Mellow, 82=Medieval, 93=Parade, 92=Overture, 95=Regal, 94=Quest, 89=Newbie Melody, 88=Neverland, 91=Oriental, 90=Nightfall, 102=Scape Cave, 103=Scape Original, 100=Rune Essence, 101=Sad Meadow, 98=Riverside, 99=Royale, 96=Reggae, 97=Reggae2, 110=Shine, 111=Soundscape, 108=Serenade, 109=Serene, 106=Sea Shanty, 107=Sea Shanty2, 104=Scape Sad, 105=Scape Wild, 119=Talking Forest, 118=Still Night, 117=Start, 116=Starlight, 115=Spookyjungle, 114=Spooky, 113=Splendour, 112=Spirit, 127=Tribal Background, 126=Tree Spirits, 125=Trawler Minor, 124=Trawler, 123=Theme, 122=The Tower, 121=The Shadow, 120=The Desert, 137=Vision, 136=Venture, 139=Voyage, 138=Voodoo Cult, 141=Waterfall, 140=Wander, 143=Wilderness2, 142=Wilderness, 129=Tribal2, 128=Tribal, 131=Troubled, 130=Trinity, 133=Unknown Land, 132=Underground, 135=Upcoming, 134=Underground Pass, 152=Scape Scared, 153=Scape Santa, 154=Land of Snow, 155=Shaping Up, 156=Exam Conditions, 157=Roots and Flutes, 158=Incarceration, 159=Scape Soft, 144=Wilderness3, 145=Witching, 146=Wonder, 147=Wonderous, 148=Workshop, 149=Lonesome, 150=Scape Main, 151=Ground Scape, 171=Nomad, 170=Undercurrent, 169=Landlubber, 168=Venture2, 175=Close Quarters, 174=Heart and Mind, 173=Cellar Song, 172=Zealot, 163=Tomorrow, 162=Fanfare2, 161=Yesteryear, 160=Shining, 167=Harmony2, 166=Wild Isle, 165=Ice Melody, 164=Duel Arena, 186=Cursed, 187=Understanding, 184=Mausoleum, 185=Forbidden, 190=Kingdom, 191=Hermit, 188=Principality, 189=Tremble, 178=Chompy Hunt, 179=Twilight, 176=Escape, 177=Grumpy, 182=Village, 183=Bone Dance, 180=Morytania, 181=Dead Quiet, 205=Meridian, 204=Lost Soul, 207=Overpass, 206=Woodland, 201=Aztec, 200=Artistry, 203=Forest, 202=Elven Mist, 197=Natural, 196=Time Out, 199=Waterlogged, 198=Grotto, 193=Stagnant, 192=La Mort, 195=Stratosphere, 194=Breeze, 220=Exposed, 221=Well of Voyage, 222=Haunted Mine, 223=Righteousness, 216=Bone Dry, 217=Competition, 218=Spooky2, 219=Everywhere, 212=Insect Queen, 213=Mad Eadgar, 214=Bandit Camp, 215=Sunburn, 208=Contest, 209=Sojourn, 210=Crystal Castle, 211=Marzipan, 239=Monkey Madness, 238=Technology, 237=Warrior, 236=Frostbite, 235=Legend, 234=Stranded, 233=Borderland, 232=Saga, 231=Rellekka, 230=Deadlands, 229=Lair, 228=Shadowland, 227=Etcetera, 226=Miscellania, 225=Chamber, 224=Deep Down, 254=Hell's Bells, 255=The Navigator, 252=Goblin Game, 253=Out of the Deep, 250=Stillness, 251=Lighthouse, 248=Melodrama, 249=Ready For Battle, 246=Find My Way, 247=Castlewars, 244=Suspicious, 245=Showdown, 242=Island Life, 243=Temple, 240=Anywhere, 241=Marooned, 275=Dynasty, 274=Barking Mad, 273=Fruits de Mer, 272=Monster Melee, 279=Settlement, 278=The Other Side, 277=Phasmatys, 276=Shipwrecked, 283=Sarcophagus, 282=Scarab, 281=Dragontooth Island, 280=Cave of Beasts, 287=Pathways, 286=Karamja Jam, 285=7th Realm, 284=Down Below, 258=Complication, 259=Down to Earth, 256=Wildwood, 257=Barbarianism, 262=Pirates of Peril, 263=Dangerous Road, 260=Courage, 261=Superstition, 266=Tiptoe, 267=The Terrible Tower, 264=Romancing the Crone, 265=Faithless, 270=Body Parts, 271=Fenkenstrain's Refrain, 268=Masquerade, 269=The Slayer, 305=Bish Bash Bosh, 304=Cave of the Goblins, 307=Path of Peril, 306=Zogre Dance, 309=Tale of Keldagrim, 308=Wayward, 311=Tears of Guthix, 310=Land of the Dwarves, 313=The Rogues' Den, 312=Romper Chomper, 315=The Lost Melody, 314=The Far Side, 317=Into the Abyss, 316=Evil Bob's Island, 319=The Power of Tears, 318=The Quiz Master, 288=Eagle Peak, 289=Time to Mine, 290=In Between, 291=Claustrophobia, 292=Far Away, 293=Fight or Flight, 294=Temple of Light, 295=The Golem, 296=Forgotten, 297=Throne of the Demon, 298=Dance of the Undead, 299=Dangerous Way, 300=City of the Dead, 301=Hypnotized, 302=Sphinx, 303=Mirage, 343=Jungle Troubles, 342=The Cellar Dwellers, 341=Dead Can Dance, 340=Wild Side, 339=TzHaar!, 338=Brew Hoo Hoo, 337=Strange Place, 336=Frogland, 351=Aye Car Rum Ba, 350=Homescape, 349=Rat Hunt, 348=Sarim's Vermin, 347=Bubble and Squeak, 346=The Noble Rodent, 345=Rat a Tat Tat, 344=Catch Me If You Can, 326=Forgettable Melody, 327=Right On Track, 324=The Chosen, 325=Have a Blast, 322=The Lost Tribe, 323=Corporal Punishment, 321=Pheasant Peasant, 334=Fire and Brimstone, 335=In the Pits, 332=The Genie, 333=Desert Heat, 330=The Desolate Isle, 331=Spirits of Elid, 328=Over To Nardah, 329=The Monsters Below, 373=Mind Over Matter, 372=Roll the Bones, 374=Golden Touch, 369=Woe of the Wyvern, 368=Victory is Mine, 371=Diango's Little Helpers, 370=In the Brine, 381=Lament, 380=Last Stand, 383=Scarabaeoidea, 382=Poles Apart, 377=Scape Hunter, 376=The Enchanter, 379=Cabin Fever, 378=Making Waves, 356=Land Down Under, 357=Meddling Kids, 358=Corridors of Power, 359=Slither and Thither, 352=Blistering Barnacles, 353=Distant Land, 354=Fangs For the Memory, 355=Pharaoh's Tomb, 364=Grip of the Talon, 365=Dagannoth Dawn, 366=Xenophobe, 367=Title Fight, 360=In the Clink, 361=Mudskipper Melody, 362=Subterranea, 363=Incantation, 410=Trouble Brewing, 411=Head to Head, 408=The Depths, 409=Distillery Hilarity, 414=Back to Life, 415=Labyrinth, 412=Pinball Wizard, 413=Beetle Juice, 402=Tomb Raider, 403=No Way Out, 400=Null and Void, 401=Pest Control, 406=Funny Bunnies, 407=Assault and Battery, 404=Method of Madness, 405=Fear and Loathing, 395=Chickened Out, 394=Davy Jones's Locker, 393=The Mad Mole, 392=Storm Brew, 399=Chef Surprize, 398=Too Many Cooks..., 397=Mastermindless, 396=Hot 'n' Bothered, 387=Dogs of War, 386=Joy of the Hunt, 385=Home Sweet Home, 384=Jungle Hunt, 391=Wrath and Ruin, 390=Dance of Death, 389=Malady, 388=Food For Thought, 440=Volcanic Vikings, 441=Island of the Trolls, 442=Pirates of Penance, 443=Brimstail's Scales, 444=My Arm's Journey, 445=Slug a Bug Ball, 446=Prime Time, 447=Rising Damp, 432=The Last Shanty, 433=Night of the Vampyre, 434=We are the Fairies, 435=Dimension X, 436=All's Fairy in Love and War, 437=Major Miner, 438=Jester Minute, 439=Norse Code, 425=On the Wing, 424=Life's a Beach!, 427=The Mollusc Menace, 426=Little Cave of Horrors, 429=H.A.M. Fisted, 428=The Galleon, 431=Sigmund's Showdown, 430=Lament of Meiyerditch, 417=Everlasting Fire, 416=Safety in Numbers, 419=Dreamstate, 418=Waking Dream, 421=Isle of Everywhere, 420=The Lunar Isle, 423=Warriors' Guild, 422=Way of the Enchanter, 478=Ham and Seek, 479=Venomous, 476=Ham Attack, 477=Slice of Silent Movie, 474=Impetuous, 475=Easter Jig, 472=Slice of Station, 473=Barb Wire, 470=Espionage, 471=Undead Dungeon, 468=Creature Cruelty, 469=Alternative Root, 466=Have an Ice Day, 467=Zombiism, 464=Garden of Winter, 465=Garden of Autumn, 463=Garden of Spring, 462=Garden of Summer, 461=Jungle Bells, 460=Sea Shanty XMAS, 459=Jungle Island XMAS, 458=Looking Back, 457=High Spirits, 456=Roc and Roll, 455=Floating Free, 454=Dorgeshuun Deep, 453=Dorgeshuun City, 452=Mutant Medley, 451=Magic Magic Magic, 450=Work Work Work, 449=Ogre the Top, 448=Where Eagles Lair, 508=Dusk in Yu'biusk, 509=Grimly Fiendish, 510=Tune from the Dune, 511=Spa Bizarre, 504=Animal Apogee, 505=Temple of Tribes, 506=Catacombs and Tombs, 507=Zanik's Theme, 500=Terrorbird Tussle, 501=Altar Ego, 502=Bolrie's Diary, 503=Healin' Feelin', 496=The Longramble Scramble, 497=Waste Defaced, 498=Knightmare, 499=Lore and Order, 493=Armadyl Alliance, 492=Bandos Battalion, 495=Storeroom Shuffle, 494=Armageddon, 489=Melzar's Maze, 488=On the Up, 491=Strength of Saradomin, 490=Zamorak Zoo, 485=Everlasting, 484=Illusive, 487=Down and Out, 486=Untouchable, 481=Fe Fi Fo Fum, 480=Mouse Trap, 483=Inadequacy, 482=School's Out, 550= , 551= , 548= , 549= , 546= , 547= , 544= , 545= , 558=Icy Trouble Ahead, 559=Icy a Worried Gnome, 556=Jungle Community, 557= , 554= , 555=The Trade Parade, 552= , 553= , 567= , 566= , 565= , 564= , 563= , 562= , 561= , 560= , 575= , 574= , 573= , 572= , 571= , 570= , 569= , 568= , 516=Charmin' Farmin', 517=Bounty Hunter Level 1, 518=Bounty Hunter Level 2, 519=Bounty Hunter Level 3, 512=Copris Lunaris, 513=Narnode's Theme, 514=Tournament!, 515=Clan Wars, 524= , 525= , 526= , 527= , 521=Creepy, 522=A New Menace, 523= , 533=Brain Battle, 532= , 535= , 534= , 529= , 528= , 531= , 530= , 541= , 540= , 543= , 542= , 537= , 536=Surok's Theme, 539= , 538= , 576= , 577=Distant Land, 578=Castle Wars, 579=Pest Control, 580=Competition, 581=Poles Apart, 582=Far Away, 583=Hell's Bells, 584=Bloodbath, 585=The Route of All Evil, 586=The Route of the Problem, 587=The Wrong Path, 588=The Columbarium, 589=The Terrible Tunnels, 590=The Terrible Caverns, 591=Dillo-gence is Key, 593=TokTz-Ket-Ek-Mack, 592=Arma Gonna Get You, 595=Bittersweet Bunny, 601=Conspiracy: Part 2, 600=Conspiracy: Part 1, 603=Guthix's Hunter, 602=Scape Summon, 604=Waiting for the Hunt} +Script 1346 - [105,105,null,255]: {0=3, 1=8, 2=0, 3=10, 4=8, 5=8, 6=8, 7=33, 8=1, 9=14, 10=32, 11=32, 12=32, 13=32, 14=32, 15=32, 17=4, 16=14, 19=18, 18=14, 21=35, 20=18, 23=4, 22=17, 25=35, 24=19, 27=33, 26=33, 29=1, 28=23, 31=1, 30=1, 34=1, 35=4, 32=1, 33=8, 38=12, 39=14, 36=0, 37=8, 42=33, 43=23, 40=3, 41=17, 46=19, 47=4, 44=14, 45=15, 51=12, 50=3, 49=16, 48=3, 55=0, 54=12, 53=12, 52=0, 59=15, 58=4, 57=3, 56=12, 63=1, 62=17, 61=0, 60=14, 68=10, 69=10, 70=18, 71=19, 64=33, 65=15, 66=10, 67=10, 76=14, 77=19, 78=1, 79=17, 72=7, 73=1, 74=19, 75=17, 85=0, 84=14, 87=18, 86=19, 81=18, 80=19, 83=20, 82=3, 93=3, 92=19, 95=1, 94=0, 89=4, 88=12, 91=33, 90=14, 102=33, 103=0, 100=23, 101=18, 98=11, 99=33, 96=10, 97=10, 110=3, 111=33, 108=17, 109=0, 106=15, 107=15, 104=1, 105=1, 119=19, 118=3, 117=4, 116=22, 115=10, 114=5, 113=14, 112=3, 127=10, 126=12, 125=15, 124=15, 123=19, 122=18, 121=0, 120=8, 137=4, 136=3, 139=20, 138=0, 141=20, 140=14, 143=1, 142=1, 129=10, 128=10, 131=1, 130=18, 133=4, 132=33, 135=18, 134=33, 152=0, 153=27, 154=27, 155=0, 156=0, 157=10, 158=0, 159=14, 144=1, 145=1, 146=1, 147=18, 148=14, 149=33, 150=0, 151=0, 171=8, 170=1, 169=15, 168=3, 175=1, 174=0, 173=33, 172=0, 163=14, 162=15, 161=4, 160=1, 167=4, 166=1, 165=13, 164=0, 186=33, 187=0, 184=25, 185=1, 190=13, 191=13, 188=14, 189=13, 178=16, 179=0, 176=33, 177=16, 182=25, 183=16, 180=25, 181=25, 205=11, 204=31, 207=11, 206=11, 201=8, 200=0, 203=11, 202=11, 197=25, 196=0, 199=25, 198=33, 193=25, 192=0, 195=0, 194=11, 220=31, 221=31, 222=0, 223=0, 216=8, 217=0, 218=5, 219=11, 212=0, 213=0, 214=8, 215=8, 208=13, 209=13, 210=11, 211=35, 239=10, 238=0, 237=33, 236=30, 235=7, 234=30, 233=7, 232=7, 231=7, 230=25, 229=33, 228=25, 227=9, 226=9, 225=33, 224=33, 254=30, 255=7, 252=34, 253=0, 250=33, 251=0, 248=17, 249=32, 246=33, 247=0, 244=0, 245=0, 242=10, 243=33, 240=10, 241=10, 275=8, 274=0, 273=15, 272=0, 279=7, 278=25, 277=25, 276=15, 283=8, 282=8, 281=15, 280=0, 287=33, 286=10, 285=33, 284=33, 258=0, 259=0, 256=1, 257=7, 262=15, 263=33, 260=33, 261=33, 266=33, 267=25, 264=30, 265=1, 270=25, 271=25, 268=33, 269=33, 305=0, 304=34, 307=33, 306=16, 309=35, 308=33, 311=0, 310=35, 313=0, 312=16, 315=34, 314=0, 317=24, 316=0, 319=0, 318=0, 288=21, 289=35, 290=0, 291=0, 292=11, 293=33, 294=23, 295=8, 296=0, 297=0, 298=25, 299=25, 300=8, 301=0, 302=8, 303=8, 343=10, 342=0, 341=1, 340=1, 339=36, 338=0, 337=0, 336=0, 351=15, 350=0, 349=0, 348=0, 347=0, 346=0, 345=0, 344=0, 326=35, 327=35, 324=0, 325=35, 322=34, 323=0, 321=0, 334=36, 335=36, 332=0, 333=8, 330=9, 331=8, 328=8, 329=0, 373=0, 372=0, 374=0, 369=0, 368=0, 371=27, 370=15, 381=0, 380=0, 383=0, 382=30, 377=0, 376=0, 379=15, 378=21, 356=0, 357=0, 358=0, 359=0, 352=15, 353=25, 354=0, 355=0, 364=0, 365=0, 366=0, 367=0, 360=0, 361=15, 362=0, 363=33, 410=15, 411=0, 408=0, 409=15, 414=8, 415=33, 412=0, 413=0, 402=8, 403=0, 400=0, 401=0, 406=26, 407=0, 404=0, 405=0, 395=0, 394=15, 393=0, 392=0, 399=0, 398=0, 397=0, 396=8, 387=33, 386=21, 385=37, 384=21, 391=0, 390=0, 389=0, 388=0, 440=38, 441=13, 442=0, 443=0, 444=15, 445=0, 446=0, 447=0, 432=15, 433=25, 434=23, 435=0, 436=23, 437=0, 438=0, 439=38, 425=21, 424=15, 427=0, 426=0, 429=0, 428=15, 431=0, 430=25, 417=1, 416=33, 419=9, 418=9, 421=9, 420=9, 423=0, 422=9, 478=0, 479=1, 477=0, 474=0, 475=26, 472=0, 473=0, 470=0, 471=0, 468=0, 469=33, 466=22, 467=0, 464=0, 465=0, 463=0, 462=0, 461=27, 460=27, 459=27, 458=0, 457=28, 456=0, 455=0, 454=34, 453=0, 452=0, 451=0, 450=0, 449=13, 448=0, 508=0, 509=0, 510=0, 511=0, 504=0, 505=0, 506=0, 507=0, 500=0, 501=0, 502=0, 503=0, 496=31, 497=31, 498=0, 499=0, 493=0, 492=0, 495=0, 494=0, 489=0, 488=0, 491=0, 490=0, 485=0, 484=0, 487=0, 486=0, 481=0, 480=0, 483=0, 482=0, 550=0, 551=0, 548=0, 549=0, 546=0, 547=0, 544=0, 545=0, 558=0, 559=0, 556=10, 557=0, 554=0, 555=3, 552=0, 553=0, 567=0, 566=0, 565=0, 564=0, 563=0, 562=0, 561=0, 560=0, 575=0, 574=0, 573=0, 572=0, 571=0, 570=0, 569=0, 568=0, 516=0, 517=0, 518=0, 519=0, 512=0, 513=12, 514=0, 515=0, 524=0, 525=0, 526=0, 527=0, 520=0, 521=0, 522=0, 523=0, 533=0, 532=0, 535=0, 534=0, 529=0, 528=0, 531=10, 530=0, 541=0, 540=0, 543=0, 542=0, 537=0, 536=0, 539=0, 538=0, 576=0, 577=0, 578=0, 579=0, 580=0, 581=0, 582=0, 583=0, 584=0, 585=33, 586=33, 587=0, 588=0, 589=0, 590=33, 591=0, 593=0, 592=0, 595=0, 594=15, 597=0, 596=15, 599=0, 598=0, 601=0, 600=0, 603=0, 602=0, 604=0} +Script 1347 - [105,115, ,0]: {0=adventure, 1=al kharid, 2=alone, 3=ambient jungle, 4=arabian, 5=arabian2, 6=arabian3, 7=arabique, 8=army of darkness, 9=arrival, 10=attack1, 11=attack2, 12=attack3, 13=attack4, 14=attack5, 15=attack6, 17=autumn voyage, 16=attention, 19=ballad of enchantment, 18=background, 21=beyond, 20=baroque, 23=book of spells, 22=big chords, 25=cave background, 24=camelot, 27=chain of command, 26=cavern, 29=crystal sword, 28=crystal cave, 31=dark, 30=dangerous, 34=doorways, 35=dream, 32=deep wildy, 33=desert voyage, 38=emotion, 39=emperor, 36=dunjun, 37=egypt, 42=expedition, 43=faerie, 40=expanse, 41=expecting, 46=fishing, 47=flute salad, 44=fanfare, 45=fanfare3, 51=gnome king, 50=garden, 49=gaol, 48=forever, 55=goblin village, 54=gnome village2, 53=gnome village, 52=dwarf theme, 59=high seas, 58=harmony, 57=greatness, 56=gnomeball, 63=inspiration, 62=in the manor, 61=iban, 60=horizon, 68=jungly2, 69=jungly3, 70=knightly, 71=lasting, 64=intrepid, 65=jolly-r, 66=jungle island, 67=jungly1, 76=long way home, 77=lullaby, 78=mage arena, 79=magic dance, 72=legion, 73=lightness, 74=lightwalk, 75=long ago, 85=miracle dance, 84=miles away, 87=moody, 86=monarch waltz, 81=march, 80=magical journey, 83=mellow, 82=medieval, 93=parade, 92=overture, 95=regal, 94=quest, 89=newbie melody, 88=neverland, 91=oriental, 90=nightfall, 102=scape cave, 103=Scape original, 100=rune essence, 101=sad meadow, 98=riverside, 99=royale, 96=reggae, 97=reggae2, 110=shine, 111=soundscape, 108=serenade, 109=serene, 106=sea shanty, 107=sea shanty2, 104=scape sad, 105=scape wild, 119=talking forest, 118=still night, 117=start, 116=starlight, 115=spookyjungle, 114=spooky, 113=splendour, 112=spirit, 127=tribal background, 126=tree spirits, 125=trawler minor, 124=trawler, 123=theme, 122=tower, 121=shadow, 120=desert, 137=vision, 136=venture, 139=voyage, 138=voodoo cult, 141=waterfall, 140=wander, 143=wilderness2, 142=wilderness, 129=tribal2, 128=tribal, 131=troubled, 130=trinity, 133=unknown land, 132=underground, 135=upcoming, 134=Underground Pass, 152=scape scared, 153=scape santa, 154=land of snow, 155=shaping up, 156=exam conditions, 157=roots and flutes, 158=incarceration, 159=scape soft, 144=wilderness3, 145=witching, 146=wonder, 147=wonderous, 148=workshop, 149=lonesome, 150=scape main, 151=ground scape, 171=nomad, 170=undercurrent, 169=landlubber, 168=venture2, 175=close quarters, 174=heart and mind, 173=cellar song, 172=zealot, 163=tomorrow, 162=fanfare2, 161=yesteryear, 160=shining, 167=harmony2, 166=wild isle, 165=ice melody, 164=duel arena, 186=cursed, 187=understanding, 184=mausoleum, 185=forbidden, 190=kingdom, 191=hermit, 188=principality, 189=tremble, 178=chompy hunt, 179=twilight, 176=escape, 177=grumpy, 182=village, 183=bone dance, 180=morytania, 181=dead quiet, 205=meridian, 204=lost soul, 207=overpass, 206=woodland, 201=aztec, 200=artistry, 203=forest, 202=elven mist, 197=natural, 196=time out, 199=waterlogged, 198=grotto, 193=stagnant, 192=la mort, 195=stratosphere, 194=breeze, 220=exposed, 221=well of voyage, 222=haunted mine, 223=righteousness, 216=bone dry, 217=competition, 218=spooky2, 219=everywhere, 212=insect queen, 213=mad eadgar, 214=bandit camp, 215=sunburn, 208=contest, 209=sojourn, 210=crystal castle, 211=marzipan, 239=monkey madness, 238=technology, 237=warrior, 236=frostbite, 235=legend, 234=stranded, 233=borderland, 232=saga, 231=rellekka, 230=deadlands, 229=lair, 228=shadowland, 227=etcetera, 226=miscellania, 225=chamber, 224=deep down, 254=hell's bells, 255=navigator the, 252=goblin game, 253=out of the deep, 250=stillness, 251=lighthouse, 248=melodrama, 249=ready for battle, 246=find my way, 247=castlewars, 244=suspicious, 245=showdown, 242=island life, 243=temple, 240=anywhere, 241=marooned, 275=dynasty, 274=barking mad, 273=fruits de mer, 272=monster melee, 279=settlement, 278=other side, 277=phasmatys, 276=shipwrecked, 283=sarcophagus, 282=scarab, 281=dragontooth island, 280=cave of beasts, 287=pathways, 286=karamja jam, 285=7th realm, 284=down below, 258=complication, 259=down to earth, 256=wildwood, 257=barbarianism, 262=pirates of peril, 263=dangerous road, 260=courage, 261=superstition, 266=tiptoe, 267=terrible tower, 264=romancing the crone, 265=faithless, 270=body parts, 271=fenkenstrain's refrain, 268=masquerade, 269=slayer the, 305=bish bash bosh, 304=cave of the goblins, 307=path of peril, 306=zogre dance, 309=tale of keldagrim, 308=wayward, 311=tears of guthix, 310=land of the dwarves, 313=rogues' den, 312=romper chomper, 315=lost melody, 314=far side, 317=into the abyss, 316=evil bob's island, 319=power of tears, 318=quiz master, 288=eagle peak, 289=time to mine, 290=in between, 291=claustrophobia, 292=far away, 293=fight or flight, 294=temple of light, 295=golem the, 296=forgotten, 297=throne of the demon, 298=dance of the undead, 299=dangerous way, 300=city of the dead, 301=hypnotized, 302=sphinx, 303=mirage, 343=jungle troubles, 342=cellar dwellers, 341=dead can dance, 340=wild side, 339=tzhaar!, 338=brew hoo hoo, 337=strange place, 336=frogland, 351=aye car rum ba, 350=homescape, 349=rat hunt, 348=sarim's vermin, 347=bubble and squeak, 346=noble rodent, 345=rat a tat tat, 344=catch me if you can, 326=forgettable melody, 327=right on track, 324=chosen, 325=have a blast, 322=lost tribe, 323=corporal punishment, 321=pheasant peasant, 334=fire and brimstone, 335=in the pits, 332=genie, 333=desert heat, 330=desolate isle, 331=spirits of elid, 328=over to nardah, 329=monsters below, 373=mind over matter, 372=roll the bones, 374=golden touch, 369=woe of the wyvern, 368=victory is mine, 371=diango's little helpers, 370=in the brine, 381=lament, 380=last stand, 383=scarabaeoidea, 382=poles apart, 377=scape hunter, 376=enchanter, 379=cabin fever, 378=making waves, 356=land down under, 357=meddling kids, 358=corridors of power, 359=slither and thither, 352=blistering barnacles, 353=distant land, 354=fangs for the memory, 355=pharaoh's tomb, 364=grip of the talon, 365=dagannoth dawn, 366=xenophobe, 367=title fight, 360=in the clink, 361=mudskipper melody, 362=subterranea, 363=incantation, 410=trouble brewing, 411=head to head, 408=depths the, 409=distillery hilarity, 414=back to life, 415=labyrinth, 412=pinball wizard, 413=beetle juice, 402=tomb raider, 403=no way out, 400=null and void, 401=pest control, 406=funny bunnies, 407=assault and battery, 404=method of madness, 405=fear and loathing, 395=chickened out, 394=davy jones's locker, 393=mad mole, 392=storm brew, 399=chef surprize, 398=too many cooks..., 397=mastermindless, 396=hot 'n' bothered, 387=dogs of war, 386=joy of the hunt, 385=home sweet home, 384=jungle hunt, 391=wrath and ruin, 390=dance of death, 389=malady, 388=food for thought, 440=volcanic vikings, 441=island of the trolls, 442=pirates of penance, 443=brimstail's scales, 444=my arm's journey, 445=slug a bug ball, 446=prime time, 447=rising damp, 432=last shanty the, 433=night of the vampyre, 434=we are the fairies, 435=dimension x, 436=all's fairy in love and war, 437=major miner, 438=jester minute, 439=norse code, 425=on the wing, 424=life's a beach!, 427=mollusc menace, 426=little cave of horrors, 429=h.a.m. fisted, 428=galleon, 431=sigmund's showdown, 430=lament of meiyerditch, 417=everlasting fire, 416=safety in numbers, 419=dreamstate, 418=waking dream, 421=isle of everywhere, 420=lunar isle, 423=warriors' guild, 422=way of the enchanter, 478=h.a.m. and seek, 479=venomous, 476=h.a.m. attack, 477=slice of silent movie, 474=impetuous, 475=easter jig, 472=slice of station, 473=barb wire, 470=espionage, 471=undead dungeon, 468=creature cruelty, 469=alternative root, 466=have an ice day, 467=zombiism, 464=garden of winter, 465=garden of autumn, 463=garden of spring, 462=garden of summer, 461=jungle bells, 460=sea shanty xmas, 459=jungle island xmas, 458=looking back, 457=high spirits, 456=roc and roll, 455=floating free, 454=dorgeshuun deep, 453=dorgeshuun city, 452=mutant medley, 451=magic magic magic, 450=work work work, 449=ogre the top, 448=where eagles lair, 508=dusk in yu'biusk, 509=grimly fiendish, 510=tune from the dune, 511=spa bizarre, 504=animal apogee, 505=temple of tribes, 506=catacombs and tombs, 507=zanik's theme, 500=terrorbird tussle, 501=altar ego, 502=bolrie's diary, 503=healin' feelin', 496=longramble scramble, 497=waste defaced, 498=knightmare, 499=lore and order, 493=armadyl alliance, 492=bandos battalion, 495=storeroom shuffle, 494=armageddon, 489=melzar's maze, 488=on the up, 491=strength of saradomin, 490=zamorak zoo, 485=everlasting, 484=illusive, 487=down and out, 486=untouchable, 481=fe fi fo fum, 480=mouse trap, 483=inadequacy, 482=school's out, 550=zzzzzzzzzzzzz, 551=zzzzzzzzzzzzz, 548=zzzzzzzzzzzzz, 549=zzzzzzzzzzzzz, 546=zzzzzzzzzzzzz, 547=zzzzzzzzzzzzz, 544=zzzzzzzzzzzzz, 545=zzzzzzzzzzzzz, 558=icy trouble ahead, 559=icy a worried gnome, 556=jungle community, 557=zzzzzzzzzzzzz, 554=zzzzzzzzzzzzz, 555=trade parade, 552=zzzzzzzzzzzzz, 553=zzzzzzzzzzzzz, 567=zzzzzzzzzzzzz, 566=zzzzzzzzzzzzz, 565=zzzzzzzzzzzzz, 564=zzzzzzzzzzzzz, 563=zzzzzzzzzzzzz, 562=zzzzzzzzzzzzz, 561=zzzzzzzzzzzzz, 560=zzzzzzzzzzzzz, 575=zzzzzzzzzzzzz, 574=zzzzzzzzzzzzz, 573=zzzzzzzzzzzzz, 572=zzzzzzzzzzzzz, 571=zzzzzzzzzzzzz, 570=zzzzzzzzzzzzz, 569=zzzzzzzzzzzzz, 568=zzzzzzzzzzzzz, 516=charmin' farmin', 517=bounty hunter level 1, 518=bounty hunter level 2, 519=bounty hunter level 3, 512=copris lunaris, 513=narnode's theme, 514=tournament!, 515=clan wars, 524=zzzzzzzzzzzzz, 525=zzzzzzzzzzzzz, 526=zzzzzzzzzzzzz, 527=zzzzzzzzzzzzz, 521=creepy, 522=a new menace, 523=zzzzzzzzzzzzz, 533=brain battle, 532=zzzzzzzzzzzzz, 535=zzzzzzzzzzzzz, 534=zzzzzzzzzzzzz, 529=zzzzzzzzzzzzz, 528=zzzzzzzzzzzzz, 531=zzzzzzzzzzzzz, 530=zzzzzzzzzzzzz, 541=zzzzzzzzzzzzz, 540=zzzzzzzzzzzzz, 543=zzzzzzzzzzzzz, 542=zzzzzzzzzzzzz, 537=zzzzzzzzzzzzz, 536=surok's theme, 539=zzzzzzzzzzzzz, 538=zzzzzzzzzzzzz, 576=zzzzzzzzzzzzz, 577=zzzzzzzzzzzzz, 578=zzzzzzzzzzzzz, 579=zzzzzzzzzzzzz, 580=zzzzzzzzzzzzz, 581=zzzzzzzzzzzzz, 582=zzzzzzzzzzzzz, 583=zzzzzzzzzzzzz, 584=bloodbath, 585=route of all evil, 586=route of the problem, 587=wrong path, 588=columbarium, 589=terrible tunnels, 590=terrible caverns, 591=dillo-gence is key, 593=toktz-ket-ek-mack, 592=arma gonna get you, 595=bittersweet bunny, 601=conspiracy: part 2, 600=conspiracy: part 1, 603=guthix's hunter, 602=scape summon, 604=waiting for the hunt} +Script 1348 - [0,0,null,0]: null +Script 1349 - [105,115,default info,0]: {0=at Varrock Palace., 1=at Al Kharid., 2=at the Clock Tower Dungeon., 3=at Shilo Village., 4=in the Kharidian Desert., 5=at Al Kharid mine., 6=at the desert entrance to the Kalphite Lair., 7=at the hellhounds in Taverley Dungeon., 8=at the Dark Warrior's Fortress., 9=at the gem trader in Falador., 10=at the Battlefield north of Tree Gnome Village., 11=at Elvarg's lair or during Grand Tree Quest., 12=to the north of the Lava Maze., 13=at the Fight Arena., 14=at the King Black Dragon., 15=at Gu'Tanoth Ogre Enclave., 17=at Lumbridge farm., 16=at the coastline below Rimmington., 19=at the Monastery., 18=on Entrana., 21=at the ice dungeon under Wolf Mountain., 20=in Ardougne., 23=at Lumbridge Swamp., 22=to the west of Yanille., 25=at the Dwarven Mine., 24=at Camelot Castle., 27=during Temple of Ikov., 26=at Yanille Agility Dungeon., 29=at the Wilderness, north of Varrock., 28=at Zanaris market., 31=in the south-east of the Wilderness., 30=to the north of Edgeville., 34=to the north of the Grand Exchange., 35=on the path between Lumbridge and Draynor., 32=in the north-west of the Wilderness., 33=around the Desert Mining Camp., 38=in the Tree Gnome Village maze., 39=in Melzar's Maze., 36=in Taverley Dungeon., 37=at Shantay Pass., 42=in the caverns below the Observatory., 43=at Zanaris., 40=at the stone circle in Varrock., 41=at the unholy altar north of the Observatory., 46=at Catherby beach., 47=at the Lumbridge windmill area., 44=at Falador Castle., 45=at Port Khazard., 51=at the Tree Gnome Stronghold., 50=at Varrock city centre., 49=to the north of the Bandit Camp in the Wilderness., 48=at Edgeville., 55=at Goblin Village., 54=to the south-west of the Tree Gnome Stronghold., 53=at the Tree Gnome Stronghold's Agility Training Area., 52=at the Dwarven Mine., 59=at Brimhaven., 58=at Lumbridge Castle., 57=at the Champions' Guild., 56=at the Gnome Ball Field., 63=at the area north of the Black Knights' Fortress., 62=at the ogre island, west of Yanille., 61=at Iban's lair in the Underground Pass., 60=in Taverley., 68=to the north-west of Brimhaven., 69=at Tai Bwo Wannai Village., 70=at Ardougne Castle., 71=at Hemenster., 64=in the Underground Pass caverns., 65=at the north dock of Brimhaven., 66=on Karamja., 67=at Cairn Isle., 76=at Rimmington., 77=at the area south-west of Rellekka., 78=at the Mage Arena., 79=in the east of Yanille., 72=at the Barbarian Outpost., 73=to the north of Edgeville., 74=at Keep Le Faye., 75=at the Fishing Platform., 85=at the Mind Altar., 84=at the Crafting Guild., 87=at the entrance to the Underground Pass., 86=at the Sinclair Mansion., 81=at King Lathas's Combat Training Camp., 80=at the Sorcerer's Tower., 83=at the Fishing Guild., 82=to the west of the Dig Site., 93=at the Jolly Boar Inn., 92=at Seers' Village., 95=at the Rogues' Castle., 94=at the Fire Altar., 89=on Tutorial Island., 88=to the south of Tree Gnome Village., 91=in the Waterfall Dungeon, East of Shilo Village., 90=to the north of Rimmington., 102=during the Lumbridge Tutorial and in Varrock Sewers., 103=automatically., 100=at the rune essence mine., 101=at West Ardougne., 98=to the west of Tyras Camp., 99=at the Black Knight base in Taverley Dungeon., 96=to the south-east of the Kharazi Jungle., 97=to the east of Karamja Jungle., 110=at the Duel Arena hospital., 111=at the Feldip Hills glider area., 108=at the Observatory., 109=at the Air Altar., 106=at Karamja port., 107=at Port Sarim., 104=at the Demonic Ruins in the Wilderness., 105=in the Wilderness., 119=at McGrubor's Wood., 118=at the Mining area south-east of Varrock., 117=at Draynor Village., 116=at the Asgarnian Ice Dungeon north of Mudskipper Point., 115=to the north-east of Karamja., 114=at Draynor Manor., 113=at the Heroes' Guild., 112=at the Cooks' Guild., 127=in the south-east Kharazi Jungle., 126=to the west of the Tree Gnome Stronghold., 125=during the Fishing Trawler minigame., 124=during the Fishing Trawler minigame., 123=at the Coal Trucks., 122=to the north-west of Ardougne., 121=on Crandor., 120=to the west of the Kharidian Desert., 137=at the Wizards' Tower., 136=at the Dig Site., 139=at the top of Baxtorian Falls., 138=at the cave under the Kharazi Jungle., 141=at Baxtorian Falls., 140=at the farm area south of Falador., 143=to the south of the Lava Maze in the Wilderness., 142=in the Wilderness., 129=at the gnome glider on Karamja., 128=to the east of Tai Bwo Wannai Village., 131=to the west of the Bandit Camp in the Wilderness., 130=at the Legends' Guild., 133=at Draynor Market., 132=at the dramen tree in Entrana Dungeon., 135=at the tower of the Necromancer., 134=during Underground Pass., 152=automatically., 153=automatically., 154=during or after the Christmas 2007 holiday event., 155=during As a First Resort..., 156=at the Stronghold of Player Safety., 157=during Back to my Roots., 158=at the Stronghold of Player Safety., 159=to the north of Falador., 144=to the west of Bounty Hunter in the Wilderness., 145=on the east side of the Wilderness., 146=to the north-west of the Black Knights' Fortress., 147=near the Legends' Guild., 148=at the Mining Guild in Falador., 149=at the Desert Mining Camp., 150=automatically., 151=automatically., 171=to the east of the Bedabin Camp., 170=in the south-east of the Wilderness., 169=to the west of Brimhaven., 168=during Dig Site., 175=at the entrance to Bounty Hunter in the Wilderness., 174=at the Body Altar., 173=at the bank vault west of Varrock., 172=at the Water Altar., 163=at the coastline south of Port Sarim., 162=at the Shipyard on Karamja., 161=to the east of Lumbridge Swamp., 160=at the Bone Yard in the Wilderness., 167=in Lumbridge Castle's basement., 166=to the south of Red Dragon Isle in the Wilderness., 165=at White Wolf Mountain., 164=at the Duel Arena., 186=during Underground Pass., 187=at the Nature Altar., 184=under Paterdomus., 185=to the north of the Lumber Yard., 190=on the way to Death Plateau., 191=at the hermit's cave north-west of Burthorpe., 188=at Burthorpe's training ground., 189=during Death Plateau., 178=at the chompy hunt area near Rantz the ogre., 179=during Elemental Workshop., 176=at the perfect gold mine under Ardougne., 177=at the swamp toad pond in the Feldip Hills., 182=at Canifis in Morytania., 183=to the west of Mort'ton., 180=to the east of Paterdomus., 181=to the north of the Mort Myre area., 205=at the area around Tyras Camp in Isafdar., 204=at the Poison Waste in south Isafdar., 207=at Arandar, east of Tirannwn., 206=at the Elf Camp in Tirannwn., 201=at the Brimhaven Agility Arena., 200=during the Mime random event., 203=to the south-east of Isafdar., 202=at the exit of the Underground Pass., 197=at the nature spirit's island in Mort Myre Swamp., 196=during the Maze random event., 199=to the south of Canifis., 198=at the nature spirit's grotto in Mort Myre Swamp., 193=at the Hollows in the Mort Myre Swamp., 192=at the Death Altar., 195=at the Cosmic Altar., 194=at Isafdar near the Underground Pass., 220=to the south of Tyras Camp in Isafdar., 221=in the passage between Iban's Temple and Isafdar., 222=at the boss area of the Haunted Mine., 223=at the Law Altar., 216=in the smoky well near Pollnivneach., 217=at Burthorpe Games Room., 218=at the entrance to the Haunted Mine., 219=to the south-west of Prifddinas., 212=at the Kalphite Queen., 213=at Eadgar's cave atop Trollheim., 214=at the Bandit Camp in the Kharidian Desert., 215=in the desert north of Jaldraocht Pyramid., 208=in Trollheim., 209=at the troll champion arena., 210=to the south-east of Prifddinas., 211=at the Trollheim cave., 239=on Ape Atoll., 238=at the gnome glider hanger., 237=during Fremennik Trials., 236=at the Ice Path north of Trollheim., 235=to the south-east of Rellekka., 234=at the gate to the Ice Path, north of Trollheim., 233=to the east of Rellekka., 232=to the south of Rellekka., 231=at Rellekka., 230=at the Haunted Woods of Morytania., 229=at the shade catacombs below Mort'ton., 228=to the east of Mort'ton., 227=on Etceteria., 226=on Miscellania., 225=on the middle floor of the Haunted Mine., 224=on the bottom floor of the Haunted Mine., 254=during the Troll Romance quest., 255=during Fremennik Trials., 252=at the goblin cave near the Fishing Guild., 253=at the dagannoth cave under the Lighthouse., 250=at the Myreque area under Mort Myre., 251=at the Lighthouse., 248=during the Castle Wars minigame., 249=during the Castle Wars minigame., 246=at the gnome tunnel in Monkey Madness., 247=during the Castle Wars minigame., 244=during Monkey Madness., 245=during the boss fight in Monkey Madness., 242=at the southern part of Ape Atoll., 243=on Ape Atoll., 240=at Marim's main gate., 241=on Crash Island during Monkey Madness., 275=at the town of Pollnivneach., 274=at the Werewolf Agility Course., 273=at the Fishing Platform., 272=at the H.A.M. cave., 279=at the Mountain Camp., 278=at Port Phasmatys., 277=at the pool of ectoplasm underneath the Ectofuntus., 276=at the shipwreck on the north coast of Morytania., 283=inside Jaldraocht, the pyramid visited in Desert Treasure., 282=at Jaldraocht, the pyramid visited in Desert Treasure., 281=on Dragontooth Island., 280=during Mountain Daughter., 287=at Brimhaven Dungeon's entrance., 286=at the dragon area of Brimhaven Dungeon., 285=at Brimhaven Dungeon., 284=at the dungeon below Draynor Village., 258=at the Chaos Altar., 259=at the Earth Altar., 256=to the south of Bounty Hunter., 257=at Barbarian Village., 262=at the Pirates' Hideout in the Wilderness., 263=at the caves below Crandor., 260=at Taverley Dungeon., 261=at the cave below the Kharazi Jungle., 266=at Draynor Manor's cellar., 267=at the Slayer Tower., 264=during the Troll Romance quest., 265=at the Chaos Temple in the Wilderness., 270=at the dungeon south-east of Fenkenstrain's Castle., 271=at Fenkenstrain's Castle., 268=on the west side of the Fremennik Slayer Dungeon., 269=on the east side of the Fremennik Slayer Dungeon., 305=during As a First Resort..., 304=at the caves beneath Lumbridge Swamp., 307=in Damis's Shadow Dungeon., 306=at the zogre area., 309=on the east side of Keldagrim., 308=at the zogre dungeon., 311=during Tears of Guthix., 310=on the west side of Keldagrim., 313=at the Rogues' Den., 312=at the ogre area south of Castle Wars., 315=at the Dorgesh-Kaan mine., 314=at the Rogues' Den training area., 317=in abyssal space., 316=during the Evil Bob random event., 319=during the Tears of Guthix quest., 318=during the Quiz Master random event., 288=during Eagles' Peak., 289=during Between a Rock..., 290=during Between a Rock..., 291=during Between a Rock..., 292=at Lletya., 293=at the slave mine under West Ardougne., 294=during Mourning's Ends Part II., 295=at the Ruins of Uzer., 296=during the Golem., 297=during Shadow of the Storm., 298=at the Barrows., 299=beneath the Barrows., 300=at Sophanem., 301=during Icthlarin's Little Helper., 302=to the north of Sophanem., 303=during Icthlarin's Little Helper., 343=in the jungle of north-east Karamja., 342=during the Hazeel Cult., 341=to the east of Bounty Hunter., 340=to the north of the Lava Maze in the Wilderness., 339=in the TzHaar Fight Cave minigame., 338=at Port Phasmatys brewery., 337=during the Tale of Two Cats., 336=during the Frog random event., 351=on Braindeath Island., 350=automatically., 349=during Rat Catchers., 348=at Port Sarim Rat Pits., 347=at the Keldagrim Rat Pits., 346=during Rat Catchers., 345=at the Varrock Rat Pits., 344=at the Ardougne Rat Pits., 326=during Forgettable Tale..., 327=during Forgettable Tale..., 324=during Recruitment Drive., 325=during the Blast Furnace minigame., 322=at the goblin mines under Lumbridge., 323=during the Drill Demon random event., 321=during the Freaky Forester random event., 334=in the TzHaar Fight Pit minigame., 335=in TzHaar., 332=at the genie's cave west of Nardah., 333=in the desert north of Nardah., 330=on Waterbirth Island., 331=during the Spirits of Elid., 328=at Nardah., 329=in Waterbirth Island Dungeon., 373=at the Mage Training Arena's Telekinetic Theatre., 372=at the Mage Training Arena's Creature Graveyard., 374=at the Mage Training Arena's Alchemists' Playground., 369=at the Asgarnian Ice Dungeon's wyvern area., 368=at the Champion's Challenge arena., 371=at Diango's Christmas workshop., 370=on Mos Le'Harmless., 381=during Enakhra's Lament., 380=during Swan Song., 383=during Dealing with Scabaras., 382=at the Trollweiss and Rellekka Hunter area., 377=automatically., 376=at the Mage Training Arena's Enchanting Chamber., 379=during Cabin Fever., 378=during Swan Song., 356=during Royal Trouble., 357=during Royal Trouble., 358=during Royal Trouble., 359=at the sea snake cave in Royal Trouble., 352=on Braindeath Island's mountain., 353=at Burgh de Rott., 354=during In Aid of the Myreque., 355=at the Agility Pyramid., 364=during Shadow of the Storm., 365=in Waterbirth Island Dungeon., 366=in Waterbirth Island Dungeon., 367=at the Champion's Challenge underground area., 360=during the Prison Pete random event., 361=at Mudskipper Point., 362=in Waterbirth Island Dungeon., 363=during Shadow of the Storm., 410=during the Trouble Brewing minigame., 411=during the Evil Twin random event., 408=during Contact!, 409=at Trouble Brewing's distillery., 414=during Contact!, 415=during Contact!, 412=during the Pinball random event., 413=during Contact!, 402=during the Pyramid Plunder minigame., 403=at the hopelessness room of Tolna's rift area., 400=at the Pest Control minigame landing area., 401=during the Pest Control minigame., 406=during or after the Easter 2006 holiday event., 407=during the Barbarian Assault minigame., 404=at the confusion room of Tolna's rift area., 405=at the fear room of Tolna's rift area., 395=at the Evil Chicken's lair., 394=during Recipe for Disaster., 393=at Falador Mole Lair., 392=at the killerwatt plane., 399=during Recipe for Disaster., 398=during Recipe for Disaster., 397=during Recipe for Disaster., 396=during As a First Resort..., 387=at the Vault of War in the Stronghold of Security., 386=at the Feldip Hunter area cave., 385=at your player-owned house., 384=at the Feldip Hunter area., 391=at the anger room of Tolna's rift., 390=at the Sepulchre of Death in the Stronghold of Security., 389=at the Pit of Pestilence in the Stronghold of Security., 388=at the Catacomb of Famine in the Stronghold of Security., 440=during Fremennik Isles., 441=during Fremennik Isles., 442=during the Barbarian Assault minigame., 443=at Brimstail's cave., 444=during My Arm's Big Adventure., 445=during the Slug Menace Quest., 446=during Elemental Workshop II., 447=during Olaf's Quest., 432=during the Darkness of Hallowvale., 433=during the Darkness of Hallowvale., 434=on the cosmic entity plane during Fairy Tale Part II., 435=on the gorak plane in Fairy Tale Part II., 436=at the fairy resistance hideout in Fairy Tale Part II., 437=during Fremennik Isles., 438=during Fremennik Isles., 439=during Fremennik Isles., 425=during Fairy Tale Part II., 424=at the coastal area of Mos Le'Harmless., 427=during Slug Menace., 426=in the cave horror dungeon beneath Mos Le'Harmless., 429=during Death to the Dorgeshuun., 428=during Lunar Diplomacy., 431=during Death to the Dorgeshuun., 430=during the Darkness of Hallowvale., 417=in the north-east corner of the Wilderness., 416=at the Stronghold of Player Safety., 419=during your dream in Lunar Diplomacy., 418=during your dream in Lunar Diplomacy., 421=on the east coast of Lunar Isle., 420=at Lunar Isle., 423=at the Warriors' Guild., 422=in the dungeon beneath Lunar Isle., 478=during Another Slice of H.A.M.., 479=at the Scorpion Pit in the Wilderness., 476=during Another Slice of H.A.M.., 477=during Another Slice of H.A.M.., 474=during the Impetuous Impulses minigame., 475=during or after the Easter 2007 holiday event., 472=during Another Slice of H.A.M.., 473=while learning barbarian skills., 470=during Cold War., 471=in Tarn's Lair., 468=during Tower of Life., 469=during What Lies Below., 466=during Cold War., 467=during Great Brain Robbery., 464=during the Sorceress's Garden minigame., 465=during the Sorceress's Garden minigame., 463=during the Sorceress's Garden minigame., 462=during the Sorceress's Garden minigame., 461=during or after the Christmas 2006 holiday event., 460=during or after the Christmas 2006 holiday event., 459=during or after the Christmas 2006 holiday event., 458=at Varrock Museum., 457=during or after the Halloween 2006 holiday event., 456=during My Arm's Big Adventure., 455=during An Enlightened Journey., 454=at the Dorgesh-Kaan caves., 453=at Dorgesh-Kaan., 452=during Tower of Life., 451=during Tower of Life., 450=during Tower of Life., 449=during Fremennik Isles., 448=during Eagles' Peak., 508=during Land of the Goblins., 509=during the Halloween 2007 holiday event., 510=during Dealing with Scabaras., 511=during As a First Resort..., 504=during Wolf Whistle., 505=during Land of the Goblins., 506=during Land of the Goblins., 507=during Land of the Goblins., 500=during Path of Glouphrie., 501=at Ourania Altar., 502=during Path of Glouphrie., 503=during Path of Glouphrie., 496=during Path of Glouphrie., 497=during Path of Glouphrie., 498=at the Black Knights' Fortress., 499=during King's Ransom., 493=in the God Wars Dungeon., 492=in the God Wars Dungeon., 495=during Path of Glouphrie., 494=in the God Wars Dungeon., 489=during Dragon Slayer., 488=during Dream Mentor., 491=in the God Wars Dungeon., 490=in the God Wars Dungeon., 485=during Dream Mentor., 484=during Dream Mentor., 487=during Dream Mentor., 486=during Dream Mentor., 481=during Grim Tales., 480=during Grim Tales., 483=during Dream Mentor., 482=during the Pattern Recognition random event., 550=not unlockable!, 551=not unlockable!, 548=not unlockable!, 549=not unlockable!, 546=not unlockable!, 547=not unlockable!, 544=not unlockable!, 545=not unlockable!, 558=during the Perils of Ice Mountain., 559=during the Perils of Ice Mountain., 556=to the north of Tai Bwo Wannai Village., 557=not unlockable!, 554=not unlockable!, 555=at the Grand Exchange., 552=not unlockable!, 553=not unlockable!, 567=not unlockable!, 566=not unlockable!, 565=not unlockable!, 564=not unlockable!, 563=not unlockable!, 562=not unlockable!, 561=not unlockable!, 560=not unlockable!, 575=not unlockable!, 574=not unlockable!, 573=not unlockable!, 572=not unlockable!, 571=not unlockable!, 570=not unlockable!, 569=not unlockable!, 568=not unlockable!, 516=during the Vinesweeper minigame., 517=while playing Bounty Hunter., 518=while playing Bounty Hunter., 519=while playing Bounty Hunter., 512=during Dealing with Scabaras., 513=beneath the Grand Tree., 514=during a Duel Arena Tournament., 515=during the Clan Wars minigame., 524=not unlockable!, 525=not unlockable!, 526=not unlockable!, 527=not unlockable!, 521=during Kennith's Concerns., 522=during Kennith's Concerns., 523=automatically., 533=on completion of Great Brain Robbery., 532=not unlockable!, 535=not unlockable!, 534=not unlockable!, 529=not unlockable!, 528=not unlockable!, 531=not unlockable!, 530=not unlockable!, 541=not unlockable!, 540=not unlockable!, 543=not unlockable!, 542=not unlockable!, 537=not unlockable!, 536=on completion of What Lies Below., 539=not unlockable!, 538=not unlockable!, 576=not unlockable!, 577=not unlockable!, 578=not unlockable!, 579=not unlockable!, 580=not unlockable!, 581=not unlockable!, 582=not unlockable!, 583=not unlockable!, 584=at the Blood Altar., 585=in the Chaos Tunnels., 586=in the Chaos Tunnels., 587=in the Chaos Tunnels., 588=during Myreque Part IV., 589=during Myreque Part IV., 590=during Myreque Part IV., 591=during TokTz-Ket-Dill., 593=during TokTz-Ket-Dill., 592=during TokTz-Ket-Dill., 595=during or after the Easter 2008 holiday event., 601=during Myreque Part IV., 600=during Myreque Part IV., 603=during the Fist of Guthix minigame., 602=automatically., 604=in the Fist of Guthix minigame waiting room.} +Script 1350 - [105,105,null,0]: {550=1, 551=1, 548=1, 549=1, 546=1, 547=1, 544=1, 545=1, 557=1, 554=1, 552=1, 553=1, 567=1, 566=1, 565=1, 564=1, 563=1, 562=1, 561=1, 560=1, 575=1, 574=1, 573=1, 572=1, 571=1, 570=1, 569=1, 568=1, 524=1, 525=1, 526=1, 527=1, 523=1, 532=1, 535=1, 534=1, 529=1, 528=1, 531=1, 530=1, 541=1, 540=1, 543=1, 542=1, 537=1, 539=1, 538=1, 320=1, 576=1, 577=1, 578=1, 375=1, 579=1, 580=1, 581=1, 582=1, 583=1} +Script 1351 - [105,77,null,147]: {0=177, 1=50, 2=102, 3=90, 4=36, 5=123, 6=124, 7=19, 8=160, 9=186, 10=24, 11=25, 12=26, 13=27, 14=28, 15=29, 17=2, 16=180, 19=152, 18=324, 21=100, 20=99, 23=64, 22=83, 25=325, 24=104, 27=63, 26=68, 29=169, 28=181, 31=326, 30=182, 34=56, 35=327, 32=37, 33=174, 38=148, 39=138, 36=173, 37=69, 42=153, 43=118, 40=106, 41=41, 46=119, 47=163, 44=72, 45=167, 51=22, 50=125, 49=159, 48=98, 55=313, 54=101, 53=33, 52=310, 59=55, 58=76, 57=116, 56=112, 63=96, 62=188, 61=1, 60=18, 68=115, 69=117, 70=191, 71=60, 64=95, 65=6, 66=172, 67=114, 76=12, 77=20, 78=13, 79=185, 72=66, 73=113, 74=74, 75=161, 85=65, 84=107, 87=10, 86=21, 81=328, 80=184, 83=193, 82=157, 93=93, 92=7, 95=329, 94=158, 89=62, 88=155, 91=103, 90=127, 102=144, 103=400, 100=57, 101=5, 98=91, 99=53, 96=78, 97=89, 110=122, 111=80, 108=110, 109=52, 106=92, 107=35, 104=331, 105=332, 119=140, 118=111, 117=151, 116=108, 115=129, 114=333, 113=77, 112=175, 127=162, 126=130, 125=51, 124=38, 123=109, 122=133, 121=170, 120=79, 137=85, 136=75, 139=32, 138=30, 141=82, 140=49, 143=42, 142=435, 129=94, 128=165, 131=183, 130=192, 133=3, 132=179, 135=70, 134=323, 152=321, 153=547, 154=189, 155=468, 156=492, 157=429, 158=494, 159=54, 144=43, 145=14, 146=34, 147=81, 148=15, 149=168, 150=16, 151=466, 171=58, 170=176, 169=164, 168=45, 175=67, 174=190, 173=330, 172=146, 163=105, 162=166, 161=145, 160=120, 167=46, 166=449, 165=87, 164=47, 186=59, 187=131, 184=156, 185=121, 190=9, 191=97, 188=149, 189=187, 178=71, 179=88, 176=17, 177=128, 182=61, 183=154, 180=48, 181=84, 205=254, 204=253, 207=256, 206=255, 201=248, 200=247, 203=251, 202=252, 197=245, 196=242, 199=244, 198=246, 193=241, 192=134, 195=243, 194=132, 220=270, 221=271, 222=277, 223=262, 216=266, 217=269, 218=11, 219=268, 212=260, 213=264, 214=263, 215=267, 208=258, 209=257, 210=259, 211=261, 239=303, 238=296, 237=295, 236=294, 235=293, 234=292, 233=291, 232=290, 231=289, 230=288, 229=287, 228=286, 227=285, 226=284, 225=282, 224=278, 254=4, 255=316, 252=346, 253=322, 250=319, 251=320, 248=317, 249=318, 246=312, 247=314, 244=308, 245=311, 242=306, 243=307, 240=305, 241=304, 275=351, 274=345, 273=347, 272=343, 279=356, 278=355, 277=354, 276=353, 283=359, 282=352, 281=358, 280=357, 287=364, 286=362, 285=363, 284=361, 258=142, 259=143, 256=8, 257=141, 262=334, 263=336, 260=178, 261=265, 266=338, 267=339, 264=335, 265=337, 270=342, 271=344, 268=340, 269=341, 305=474, 304=389, 307=393, 306=392, 309=395, 308=394, 311=397, 310=396, 313=402, 312=390, 315=407, 314=403, 317=412, 316=411, 319=398, 318=413, 288=366, 289=369, 290=370, 291=373, 292=372, 293=375, 294=376, 295=377, 296=378, 297=379, 298=380, 299=381, 300=383, 301=384, 302=387, 303=388, 343=479, 342=478, 341=476, 340=475, 339=473, 338=471, 337=470, 336=409, 351=497, 350=621, 349=491, 348=490, 347=489, 346=485, 345=482, 344=481, 326=436, 327=44, 324=425, 325=434, 322=420, 323=418, 321=419, 334=463, 335=469, 332=464, 333=465, 330=461, 331=462, 328=447, 329=448, 373=534, 372=533, 374=535, 369=529, 368=528, 371=532, 370=530, 381=542, 380=546, 383=455, 382=548, 377=207, 376=541, 379=545, 378=544, 356=506, 357=508, 358=509, 359=510, 352=498, 353=501, 354=504, 355=505, 364=520, 365=198, 366=524, 367=525, 360=511, 361=515, 362=517, 363=519, 410=611, 411=612, 408=606, 409=610, 414=616, 415=213, 412=614, 413=615, 402=591, 403=594, 400=587, 401=588, 406=603, 407=604, 404=600, 405=602, 395=575, 394=576, 393=573, 392=568, 399=583, 398=582, 397=577, 396=477, 387=537, 386=460, 385=454, 384=453, 391=565, 390=560, 389=559, 388=558, 440=225, 441=220, 442=211, 443=194, 444=203, 445=201, 446=202, 447=274, 432=643, 433=646, 434=126, 435=86, 436=73, 437=222, 438=221, 439=223, 425=633, 424=631, 427=200, 426=632, 429=638, 428=630, 431=640, 430=197, 417=586, 416=493, 419=623, 418=622, 421=627, 420=625, 423=634, 422=626, 478=276, 479=450, 476=279, 477=281, 474=349, 475=273, 472=275, 473=367, 470=216, 471=214, 468=234, 469=272, 466=217, 467=238, 464=231, 465=228, 463=229, 462=230, 461=209, 460=210, 459=208, 458=309, 457=205, 456=204, 455=206, 454=249, 453=240, 452=236, 451=235, 450=237, 449=224, 448=620, 508=433, 509=432, 510=451, 511=472, 504=456, 505=440, 506=439, 507=437, 500=417, 501=428, 502=427, 503=416, 496=414, 497=426, 498=374, 499=382, 493=404, 492=386, 495=421, 494=399, 489=365, 488=302, 491=408, 490=391, 485=283, 484=298, 487=301, 486=300, 481=23, 480=150, 483=299, 482=371, 550=430, 551=422, 548=368, 549=458, 546=480, 547=232, 544=212, 545=297, 558=523, 559=522, 556=483, 557=495, 554=446, 555=496, 552=423, 553=424, 567=174, 566=288, 565=260, 564=332, 563=79, 562=40, 561=39, 560=385, 575=33, 574=172, 573=241, 572=529, 571=347, 570=548, 569=165, 568=573, 516=487, 517=444, 518=443, 519=445, 512=452, 513=348, 514=441, 515=442, 524=350, 525=360, 526=195, 527=219, 521=499, 522=500, 523=147, 533=239, 532=574, 535=226, 534=406, 529=227, 528=218, 531=431, 530=196, 541=405, 540=410, 543=199, 542=484, 537=233, 536=250, 539=315, 538=215, 576=24, 577=501, 578=314, 579=588, 580=269, 581=548, 582=372, 583=4, 584=512, 585=459, 586=467, 587=488, 588=514, 589=518, 590=521, 591=527, 593=531, 592=526, 595=502, 601=516, 600=513, 603=507, 602=457, 604=503} +Script 1352 - [0,0,null,0]: null +Script 1353 - [0,0,null,0]: null +Script 1354 - [105,73,null,44630126]: {0=44630034, 1=44630035, 2=44630036, 3=44630037, 4=44630038, 5=44630039, 6=44630040, 7=44630041, 8=44630042, 9=44630043} +Script 1355 - [105,73,null,44630126]: {0=44630044, 1=44630045, 2=44630046, 3=44630047, 4=44630048, 5=44630049, 6=44630050, 7=44630051, 8=44630052, 9=44630053} +Script 1356 - [105,73,null,44630126]: {0=44630064, 1=44630065, 2=44630066, 3=44630067, 4=44630068, 5=44630069, 6=44630070, 7=44630071, 8=44630072, 9=44630073} +Script 1357 - [105,73,null,44630126]: {0=44630054, 1=44630055, 2=44630056, 3=44630057, 4=44630058, 5=44630059, 6=44630060, 7=44630061, 8=44630062, 9=44630063} +Script 1358 - [105,73,null,44630126]: {0=44761112, 1=44761113, 2=44761114, 3=44761115, 4=44761116, 5=44761117, 6=44761118, 7=44761119, 8=44761120, 9=44761121} +Script 1359 - [105,73,null,44630127]: {0=44630078, 1=44630083, 2=44630088, 3=44630093, 4=44630098, 5=44630103, 6=44630108, 7=44630113, 8=44630118, 9=44630123} +Script 1360 - [105,73,null,44630127]: {0=44630079, 1=44630084, 2=44630089, 3=44630094, 4=44630099, 5=44630104, 6=44630109, 7=44630114, 8=44630119, 9=44630124} +Script 1361 - [105,73,null,44630127]: {0=44630077, 1=44630082, 2=44630087, 3=44630092, 4=44630097, 5=44630102, 6=44630107, 7=44630112, 8=44630117, 9=44630122} +Script 1362 - [105,73,null,44630127]: {0=44630076, 1=44630081, 2=44630086, 3=44630091, 4=44630096, 5=44630101, 6=44630106, 7=44630111, 8=44630116, 9=44630121} +Script 1363 - [0,0,null,0]: null +Script 1364 - [0,0,null,0]: null +Script 1365 - [0,0,null,0]: null +Script 1366 - [0,0,null,0]: null +Script 1367 - [0,0,null,0]: null +Script 1368 - [0,0,null,0]: null +Script 1369 - [105,105,null,1]: {1=13, 2=13, 3=13, 4=13, 5=13, 6=13, 7=13, 8=13, 9=14, 10=15, 11=15, 12=16, 13=16, 14=16, 15=16, 17=19, 16=17, 19=22, 18=20, 21=26, 20=25, 23=30, 22=28, 25=35, 24=32, 27=40, 26=37, 29=47, 28=45, 31=55, 30=50, 34=70, 35=75, 32=60, 33=65, 38=90, 39=95, 36=80, 37=85} +Script 1370 - [0,0,null,0]: null +Script 1371 - [0,0,null,0]: null +Script 1372 - [0,0,null,0]: null +Script 1373 - [0,0,null,0]: null +Script 1374 - [0,0,null,0]: null +Script 1375 - [0,0,null,0]: null +Script 1376 - [0,0,null,0]: null +Script 1377 - [0,0,null,0]: null +Script 1378 - [0,0,null,0]: null +Script 1379 - [0,0,null,0]: null +Script 1380 - [0,0,null,0]: null +Script 1381 - [0,0,null,0]: null +Script 1382 - [0,0,null,0]: null +Script 1383 - [0,0,null,0]: null +Script 1384 - [0,0,null,0]: null +Script 1385 - [0,0,null,0]: null +Script 1386 - [0,0,null,0]: null +Script 1387 - [0,0,null,0]: null +Script 1388 - [0,0,null,0]: null +Script 1389 - [0,0,null,0]: null +Script 1390 - [0,0,null,0]: null +Script 1391 - [0,0,null,0]: null +Script 1392 - [0,0,null,0]: null +Script 1393 - [0,0,null,0]: null +Script 1394 - [0,0,null,0]: null +Script 1395 - [0,0,null,0]: null +Script 1396 - [0,0,null,0]: null +Script 1397 - [0,0,null,0]: null +Script 1398 - [0,0,null,0]: null +Script 1399 - [0,0,null,0]: null +Script 1400 - [0,0,null,0]: null +Script 1401 - [0,0,null,0]: null +Script 1402 - [0,0,null,0]: null +Script 1403 - [0,0,null,0]: null +Script 1404 - [0,0,null,0]: null +Script 1405 - [0,0,null,0]: null +Script 1406 - [0,0,null,0]: null +Script 1407 - [0,0,null,0]: null +Script 1408 - [0,0,null,0]: null +Script 1409 - [0,0,null,0]: null +Script 1410 - [0,0,null,0]: null +Script 1411 - [0,0,null,0]: null +Script 1412 - [0,0,null,0]: null +Script 1413 - [0,0,null,0]: null +Script 1414 - [0,0,null,0]: null +Script 1415 - [0,0,null,0]: null +Script 1416 - [0,0,null,0]: null +Script 1417 - [0,0,null,0]: null +Script 1418 - [0,0,null,0]: null +Script 1419 - [0,0,null,0]: null +Script 1420 - [0,0,null,0]: null +Script 1421 - [0,0,null,0]: null +Script 1422 - [105,105,null,0]: {50=6, 70=14, 80=4, 60=11, 45=10} +Script 1423 - [0,0,null,0]: null +Script 1424 - [0,0,null,0]: null +Script 1425 - [0,0,null,0]: null +Script 1426 - [0,0,null,0]: null +Script 1427 - [0,0,null,0]: null +Script 1428 - [0,0,null,0]: null +Script 1429 - [0,0,null,0]: null +Script 1430 - [0,0,null,0]: null +Script 1431 - [0,0,null,0]: null +Script 1432 - [0,0,null,0]: null +Script 1433 - [105,79,null,11760]: {1=1931, 2=1929, 3=1937, 4=2313, 5=1887, 6=590, 7=1735, 8=1951, 9=1969, 10=1949} +Script 1434 - [0,0,null,0]: null +Script 1435 - [0,0,null,0]: null +Script 1436 - [0,0,null,0]: null +Script 1437 - [0,0,null,0]: null +Script 1438 - [0,0,null,0]: null +Script 1439 - [0,0,null,0]: null +Script 1440 - [0,0,null,0]: null +Script 1441 - [0,0,null,0]: null +Script 1442 - [105,73,null,-1]: {0=47513626, 1=47513646, 2=47513647, 3=47513652, 4=47513640, 5=47513641, 6=47513648, 7=47513658, 8=47513664, 9=47513659, 10=47513660, 11=47513642, 12=47513649, 13=47513650, 14=47513661, 15=47513643, 17=47513662, 16=47513644, 19=47513634, 18=47513651, 21=47513635, 20=47513663, 23=47513628, 22=47513645, 25=47513636, 24=47513629, 27=47513630, 26=47513637, 29=47513665, 28=47513631, 31=47513667, 30=47513666, 34=47513632, 35=47513633, 32=47513668, 33=47513669, 38=47513653, 39=47513654, 36=47513638, 37=47513639, 42=47513657, 40=47513655, 41=47513656} +Script 1443 - [105,73,null,-1]: {0=47579257, 1=47579293, 2=47579301, 3=47579279, 4=47579285, 5=47579292, 6=47579299, 7=47579276, 8=47579277, 9=47579284, 10=47579275, 11=47579300, 12=47579288, 13=47579278, 14=47579296, 15=47579304, 17=47579283, 16=47579302, 19=47579280, 18=47579291, 21=47579272, 20=47579281, 23=47579282, 22=47579263, 25=47579303, 24=47579312, 27=47579289, 26=47579310, 29=47579317, 28=47579271, 31=47579297, 30=47579298, 34=47579319, 35=47579262, 32=47579290, 33=47579306, 38=47579305, 39=47579320, 36=47579261, 37=47579270, 42=47579265, 43=47579318, 40=47579269, 41=47579264, 46=47579307, 47=47579274, 44=47579311, 45=47579309, 51=47579266, 50=47579273, 49=47579322, 48=47579321, 55=47579315, 54=47579314, 53=47579313, 52=47579316, 59=47579260, 58=47579268, 57=47579267, 56=47579308, 60=47579259} +Script 1444 - [0,0,null,0]: null +Script 1445 - [0,0,null,0]: null +Script 1446 - [0,0,null,0]: null +Script 1447 - [0,0,null,0]: null +Script 1448 - [0,0,null,0]: null +Script 1449 - [0,0,null,0]: null +Script 1450 - [0,0,null,0]: null +Script 1451 - [0,0,null,0]: null +Script 1452 - [0,0,null,0]: null +Script 1453 - [0,0,null,0]: null +Script 1454 - [0,0,null,0]: null +Script 1455 - [0,0,null,0]: null +Script 1456 - [0,0,null,0]: null +Script 1457 - [0,0,null,0]: null +Script 1458 - [0,0,null,0]: null +Script 1459 - [0,0,null,0]: null +Script 1460 - [0,0,null,0]: null +Script 1461 - [0,0,null,0]: null +Script 1462 - [0,0,null,0]: null +Script 1463 - [0,0,null,0]: null +Script 1464 - [0,0,null,0]: null +Script 1465 - [0,0,null,0]: null +Script 1466 - [73,115,,0]: {48168986=A L P, 48168987=A L Q, 48168984=A K R, 48168985=A K S, 48168990=B I P, 48168991=B I Q, 48168988=A L R, 48168989=A L S, 48168978=A J P, 48168979=A J Q, 48168976=A I R, 48168977=A I S, 48168982=A K P, 48168983=A K Q, 48168980=A J R, 48168981=A J S, 48169037=D L S, 48169036=D L R, 48169035=D L Q, 48168975=A I Q, 48169034=D L P, 48168974=A I P, 48169033=D K S, 48169032=D K R, 48169031=D K Q, 48169030=D K P, 48169029=D J S, 48169028=D J R, 48169027=D J Q, 48169026=D J P, 48169025=D I S, 48169024=D I R, 48169016=C K R, 48169017=C K S, 48169018=C L P, 48169019=C L Q, 48169020=C L R, 48169021=C L S, 48169022=D I P, 48169023=D I Q, 48169008=C I R, 48169009=C I S, 48169010=C J P, 48169011=C J Q, 48169012=C J R, 48169013=C J S, 48169014=C K P, 48169015=C K Q, 48169001=B K S, 48169000=B K R, 48169003=B L Q, 48169002=B L P, 48169005=B L S, 48169004=B L R, 48169007=C I Q, 48169006=C I P, 48168993=B I S, 48168992=B I R, 48168995=B J Q, 48168994=B J P, 48168997=B J S, 48168996=B J R, 48168999=B K Q, 48168998=B K P} +Script 1467 - [105,73,null,-1]: {0=48168974, 1=48168977, 2=48168976, 3=48168975, 4=48168986, 5=48168989, 6=48168988, 7=48168987, 8=48168982, 9=48168985, 10=48168984, 11=48168983, 12=48168978, 13=48168981, 14=48168980, 15=48168979, 17=48169025, 16=48169022, 19=48169023, 18=48169024, 21=48169037, 20=48169034, 23=48169035, 22=48169036, 25=48169033, 24=48169030, 27=48169031, 26=48169032, 29=48169029, 28=48169026, 31=48169027, 30=48169028, 34=48169008, 35=48169007, 32=48169006, 33=48169009, 38=48169020, 39=48169019, 36=48169018, 37=48169021, 42=48169016, 43=48169015, 40=48169014, 41=48169017, 46=48169012, 47=48169011, 44=48169010, 45=48169013, 51=48168991, 50=48168992, 49=48168993, 48=48168990, 55=48169003, 54=48169004, 53=48169005, 52=48169002, 59=48168999, 58=48169000, 57=48169001, 56=48168998, 63=48168995, 62=48168996, 61=48168997, 60=48168994, 64=48169038} +Script 1468 - [0,0,null,0]: null +Script 1469 - [0,0,null,0]: null +Script 1470 - [0,0,null,0]: null +Script 1471 - [0,0,null,0]: null +Script 1472 - [0,0,null,0]: null diff --git a/fishing-trawler-inventory.png b/fishing-trawler-inventory.png new file mode 100644 index 000000000..c193b8e8f Binary files /dev/null and b/fishing-trawler-inventory.png differ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..e708b1c02 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..be52383ef --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 000000000..fbd7c5158 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 000000000..5093609d5 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/rsapriv b/rsapriv new file mode 100644 index 000000000..2b3f960f7 --- /dev/null +++ b/rsapriv @@ -0,0 +1,3 @@ +private static final BigInteger RSA_MODULUS = new BigInteger("109343860332353211924482133180092752644123222251570035818592399718899543340247882615012834369709881454157761178411602406231525266135486523035643931381979724348736863559735931163013508521663192459153115214061347330689961869574877386212674606945486858607548180282077056338048348202722564364196572081666257569141"); + +private static final BigInteger RSA_EXPONENT = new BigInteger("95173889082484041396770660926273875548642218748471262389730760479803859656394101284629936124414155021910910305038549943712271347199790854327254412343464762995659105022851838580116068092150368910517451017915949840772299561161571056594672403779799544425453760758971945371791327421959495479929143440618467926273"); diff --git a/rsapub b/rsapub new file mode 100644 index 000000000..d9774cbb0 --- /dev/null +++ b/rsapub @@ -0,0 +1,3 @@ +private static final BigInteger RSA_MODULUS = new BigInteger("109343860332353211924482133180092752644123222251570035818592399718899543340247882615012834369709881454157761178411602406231525266135486523035643931381979724348736863559735931163013508521663192459153115214061347330689961869574877386212674606945486858607548180282077056338048348202722564364196572081666257569141"); + +private static final BigInteger RSA_EXPONENT = new BigInteger("65537"); diff --git a/run.sh b/run.sh new file mode 100755 index 000000000..6d3861c11 --- /dev/null +++ b/run.sh @@ -0,0 +1,46 @@ +#!/bin/bash +echo "Make sure you have built the server before running this command." +if [ $# -eq 0 ]; then + echo "Usage: $0 [--build] type" + echo "Example: $0 ms" + echo "Example: $0 server Server/worldprops/default.json" + echo "Example: $0 client" + echo "Example: $0 --build server Server/worldprops/default.json" + exit +fi +readIndex=1 +propsFile="$1" +doBuild=false +function run_server { + Server/bin/Server "$1" +} +run_ms(){ + exec "Management-Server/bin/Management-Server" +} +run_client(){ + exec "Client/bin/Client" +} +if [ "$1" = "--build" ]; then + readIndex="$((readIndex + 1))" + doBuild=true + if [ $# -lt 2 ]; then + echo "You must supply a type." + echo "If you just want to build without running, use build.sh" + exit + fi +fi + +type="${!readIndex}" +if [ $doBuild = true ]; then + ./build.sh "$type" +fi +if [ "$type" = "server" ]; then + readIndex="$((readIndex + 1))" + propsFile="${!readIndex}" + echo $propsFile + run_server "$propsFile" +elif [ "$type" = "ms" ]; then + run_ms +elif [ "$type" = "client" ]; then + run_client +fi diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..741d92f87 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = '2009Scape' +include 'Client' +include 'Management-Server' +include 'Server' \ No newline at end of file diff --git a/telecoordinates b/telecoordinates new file mode 100644 index 000000000..1c21db96c --- /dev/null +++ b/telecoordinates @@ -0,0 +1,1326 @@ +Big water fall ::tele 2534,3511 +Very back of wild ::tele 3100,3957 +Varrock east bank ::tele 3250,3423 +Varrock ::tele 3210,3424 +Falador ::tele 2964,3378 +Lumbridge ::tele 3222,3218 +Camelot ::tele 2757,3477 +East Ardougne ::tele 2662,3305 +West Ardougne ::tele 2529,3307 +King Lathas Training Grounds ::tele 2516,3369 +Tree Gnome Stronghold ::tele 2461,3443 +Al Kharid ::tele 3293,3174 +Shantays Pass ::tele 3304,3116 +Kalphite Lair ::tele 3226,3107 +Pyramid ::tele 3233,2902 +Pollnivneach ::tele 3359,2910 +Menaphos/Sophanem ::tele 3274,2784 +Yanille ::tele 2606,3093 +Gul'Tanoth ::tele 2516,3044 +Tutorial Island ::tele 3094,3107 +Barbarian Village ::tele 3082,3420 +Entrana ::tele 2834,3335 +Heroes Guild ::tele 2902,3510 +Rangers Guild ::tele 2658,3439 +Coal Trucks ::tele 2582,3481 +Goblin Village ::tele 2956,3506 +Druids Circle ::tele 2926,3482 +Burthorpe ::tele 2926,3559 +White wolf mountain ::tele 2848,3498 +Catherby ::tele 2813,3447 +Seers village ::tele 2708,3492 +Fishing guild ::tele 2603,3414 +Barbarian Agility Course ::tele 2541,3546 +Prifddinas ::tele 2242,3278 +Elf camp (Tirannwn) ::tele 2197,3252 +Isafdar (Tirannwn) ::tele 2241,3238 +Duel arena ::tele 3360,3213 +Desert mining camp ::tele 3286,3023 +Bedabin camp ::tele 3171,3026 +Bandit camp ::tele 3176,2987 +Sophanem ::tele 3305,2755 +Ruins of Uzer ::tele 3490,3090 +Mort'ton ::tele 3489,3288 +Canifis ::tele 3506,3496 +Port Phasmatys ::tele 3687,3502 +Fenkenstrain's castle ::tele 3550,3548 +Dig site ::tele 3354,3402 +Exam centre ::tele 3354,3344 +Edgeville ::tele 3093,3493 +Crafting guild ::tele 2933,3285 +Port Sarim ::tele 3023,3208 +Rimmington ::tele 2957,3214 +Draynor village ::tele 3093,3244 +Fight arena ::tele 2585,3150 +Tree gnome village ::tele 2525,3167 +Port Khazard ::tele 2665,3161 +Monastery ::tele 3051,3490 +Karamja ::tele 2948,3147 +Crandor ::tele 2851,3238 +King Black Dragon Lair ::tele 2717,9816 +KQ Lair ::tele 3487,9493 +Underground pass level 2 ::tele 2337,9798 +Weird water place ::tele 2676,3008 +Members Karajama ::tele 2815,3182 +Grave island ::tele 3504,3575 +HAM camp ::tele 3165,9629 +Pyramid under Sophanem ::tele 3277,9171 +Juna the snake (Press Burst of Strength a few times to get to it) ::tele 3251,9517 +Smoky tunnels/dark room (This place needs more tests) 3206,9379 +Underground pass level 1 ::tele 2495,9715 +Mage Arena ::tele 3107,3937 +Ape Atoll ::tele 2755,2784 +Jungle demon area bottom level ::tele 2714,9183 +Jungle demon area top level (use Burst of Strength) ::tele 2703,9178 +Wilderness Agility Course ::tele 3003,3934 +Keldagram ::tele 2937,9999 (and run north for a little while) +(Alternate) Keldagram, if you tele to 2937,3763 then Press Clarity of Thought then you will be able to walk around in Keldagrim! +Agility arena on Karamja ::tele 2761,9557 +Metal dragon dungeon (back) ::tele 2713,9459 +Metal dragon dungeon (front) ::tele 2713,9564 +Inside the desert treasure pyramid ::tele 3233,9315 +Tree gnome hanger ::tele 2390,9886 +Fishing platform ::tele 2782,3273 +Boat crash island place ::tele 2795,3321 +Legends quest jungle dungeon ::tele 2772,9341 +TzHaar ::tele 2480,5175 +Essence mine ::tele 2911,4832 +Morings end part 1 mine ::tele 2044,4649 +Dwarf cut scene meeting area ::tele 2035,4529 +New KBD lair ::tele 2273,4695 +Elven forest cut scene area ::tele 2309,4597 +Gold mine rock ::tele 2358,4959 +White knight tasks area ::tele 2443,4956 +Rouge maze (Press Burst of Strength) ::tele 3050,5071 +The shadow guys dungeon ::tele 2738,5081 +Barrows top ::tele 3564,3288 +Barrows tunnel ::tele 3568,9695 (Press Burst of Strength a few times to get to the barrows bros coffins) +Barrows chest ::tele 3551,9694 +CW bank= 2441,3090 +CW center= 2400,3103 +Blue dragons= 2910,9801 +Black demons= 2860 9775 +Hell Hounds= 2867,9844 +Black dragons= 2829,9826 +Chaos rune crafting alter ::tele 2269,4843 +Legends dungeon prt2 ::tele 2375,4705 +Mage arena dungeon ::tele 2519,4719 +Evil Bobs island "scaperune" ::tele 2525,4776 +Distant kingdom (alive) 2576,4655 +Distant kingdom (dead) 2803,4723 +Forester random event ::tele 2602,4775 +Alt area ::tele 2527,4547 +Fremmy maze ::tele 2652,9999 +Death rune altar ::tele 2207,4836 +Cosmic alter ::tele 2162,4833 +Middle of under ground pass (Press Burst of Strength) ::tele 2168 4726 +Quiz random event ::tele 1952,4768 +Trawler boat ::tele 2013,4820 +Sunk trawler mini game boat ::tele 1951,4825 +Trawler boat empty of water ::tele 1886,4830 +Mime stage ::tele 2008,4762 +"Draynor" ::tele 2130,4913 +Game room ::tele 2196,4961 +Mind alter ::tele 2796,4818 +Air Alter ::tele 2845,4832 +Water Alter ::tele 2713,4836 +Earth Alter ::tele 2660,4839 +Fire Alter ::tele 2584,4836 +Body Alter ::tele 2527,4833 +Law Alter ::tele 2464,4834 +Nature Alter ::tele 2398,4841 +Gas hole ::tele 2464,4782 +Edge of maze ::tele 2885,4550 +Center of maze ::tele 2912,4576 +Falador mine ::tele 3038,9800 +2867 9955 - Ice Queen Lair +3429 3538 - Slayer Tower +2710 9466 - Brimhaven Dungeon +2856 3812 - Ice Path +2480 3437 - Gnome Agility Training +3281 2765 - Pyramid Plunder room +3345 3251 - Duel Arena +2717 9808 - King Black Dragon Cave +3044 4973 - Rouges Den +2979 3611 - Green Dragons +Big water fall ::tele 2534,3511 +Very back of wild ::tele 3100,3957 +Varrock east bank ::tele 3250,3423 +Varrock ::tele 3210,3424 +Falador ::tele 2964,3378 +Lumbridge ::tele 3222,3218 +Camelot ::tele 2757,3477 +East Ardougne ::tele 2662,3305 +West Ardougne ::tele 2529,3307 +King Lathas Training Grounds ::tele 2516,3369 +Tree Gnome Stronghold ::tele 2461,3443 +Al Kharid ::tele 3293,3174 +Shantays Pass ::tele 3304,3116 +Kalphite Lair ::tele 3226,3107 +Pyramid ::tele 3233,2902 +Pollnivneach ::tele 3359,2910 +Menaphos/Sophanem ::tele 3274,2784 +Yanille ::tele 2606,3093 +Gul'Tanoth ::tele 2516,3044 +Tutorial Island ::tele 3094,3107 +Barbarian Village ::tele 3082,3420 +Entrana ::tele 2834,3335 +Heroes Guild ::tele 2902,3510 +Rangers Guild ::tele 2658,3439 +Coal Trucks ::tele 2582,3481 +Goblin Village ::tele 2956,3506 +Druids Circle ::tele 2926,3482 +Burthorpe ::tele 2926,3559 +White wolf mountain ::tele 2848,3498 +Catherby ::tele 2813,3447 +Seers village ::tele 2708,3492 +Fishing guild ::tele 2603,3414 +Barbarian Agility Course ::tele 2541,3546 +Prifddinas ::tele 2242,3278 +Elf camp (Tirannwn) ::tele 2197,3252 +Isafdar (Tirannwn) ::tele 2241,3238 +Duel arena ::tele 3360,3213 +Desert mining camp ::tele 3286,3023 +Bedabin camp ::tele 3171,3026 +Bandit camp ::tele 3176,2987 +Sophanem ::tele 3305,2755 +Ruins of Uzer ::tele 3490,3090 +Mort'ton ::tele 3489,3288 +Canifis ::tele 3506,3496 +Port Phasmatys ::tele 3687,3502 +Fenkenstrain's castle ::tele 3550,3548 +Dig site ::tele 3354,3402 +Exam centre ::tele 3354,3344 +Edgeville ::tele 3093,3493 +Crafting guild ::tele 2933,3285 +Port Sarim ::tele 3023,3208 +Rimmington ::tele 2957,3214 +Draynor village ::tele 3093,3244 +Fight arena ::tele 2585,3150 +Tree gnome village ::tele 2525,3167 +Port Khazard ::tele 2665,3161 +Monastery ::tele 3051,3490 +Karamja ::tele 2948,3147 +Crandor ::tele 2851,3238 +King Black Dragon Lair ::tele 2717,9816 +KQ Lair ::tele 3487,9493 +Underground pass level 2 ::tele 2337,9798 +Weird water place ::tele 2676,3008 +Members Karajama ::tele 2815,3182 +Grave island ::tele 3504,3575 +HAM camp ::tele 3165,9629 +Pyramid under Sophanem ::tele 3277,9171 +Juna the snake ::tele 3251,9517 +Smoky tunnels/dark room (This place needs more tests) 3206,9379 +Underground pass level 1 ::tele 2495,9715 +Mage Arena ::tele 3107,3937 +Ape Atoll ::tele 2755,2784 +Jungle demon area bottom level ::tele 2714,9183 +Jungle demon area top level (use Burst of Strength) ::tele 2703,9178 +Wilderness Agility Course ::tele 3003,3934 +Keldagram ::tele 2937,9999 +Agility arena on Karamja ::tele 2761,9557 +Metal dragon dungeon (back) ::tele 2713,9459 +Metal dragon dungeon (front) ::tele 2713,9564 +Inside the desert treasure pyramid ::tele 3233,9315 +Tree gnome hanger ::tele 2390,9886 +Fishing platform ::tele 2782,3273 +Boat crash island place ::tele 2795,3321 +Legends quest jungle dungeon ::tele 2772,9341 +TzHaar ::tele 2480,5175 +Essence mine ::tele 2911,4832 +Morings end part 1 mine ::tele 2044,4649 +Dwarf cut scene meeting area ::tele 2035,4529 +New KBD lair ::tele 2273,4695 +Elven forest cut scene area ::tele 2309,4597 +Gold mine rock ::tele 2358,4959 +White knight tasks area ::tele 2443,4956 +Rouge maze (Press Burst of Strength) ::tele 3050,5071 +The shadow guys dungeon ::tele 2738,5081 +Barrows top ::tele 3564,3288 +Barrows tunnel ::tele 3568,9695 +Barrows chest ::tele 3551,9694 +CW bank= 2441,3090 +CW center= 2400,3103 +Blue dragons= 2910,9801 +Black demons= 2860 9775 +Hell Hounds= 2867,9844 +Black dragons= 2829,9826 +Chaos rune crafting alter ::tele 2269,4843 +Legends dungeon prt2 ::tele 2375,4705 +Mage arena dungeon ::tele 2519,4719 +Evil Bobs island "scaperune" ::tele 2525,4776 +Distant kingdom (alive) 2576,4655 +Distant kingdom (dead) 2803,4723 +Forester random event ::tele 2602,4775 +Alt area ::tele 2527,4547 +Fremmy maze ::tele 2652,9999 +Death rune altar ::tele 2207,4836 +Cosmic alter ::tele 2162,4833 +Middle of under ground pass ::tele 2168 4726 +Quiz random event ::tele 1952,4768 +Trawler boat ::tele 2013,4820 +Sunk trawler mini game boat ::tele 1951,4825 +Trawler boat empty of water ::tele 1886,4830 +Mime stage ::tele 2008,4762 +"Draynor" ::tele 2130,4913 +Game room ::tele 2196,4961 +Mind alter ::tele 2796,4818 +Air Alter ::tele 2845,4832 +Water Alter ::tele 2713,4836 +Earth Alter ::tele 2660,4839 +Fire Alter ::tele 2584,4836 +Body Alter ::tele 2527,4833 +Law Alter ::tele 2464,4834 +Nature Alter ::tele 2398,4841 +Gas hole ::tele 2464,4782 +Edge of maze ::tele 2885,4550 +Center of maze ::tele 2912,4576 +Falador mine ::tele 3038,9800 +::tele 3157 4822 = drill deamon camp + +::tele 2477 4768 = frog cave + +::tele 2596 4780 = freaky forester + +::tele 2095 4428 = prison pete + +::tele 1952 4764 = quiz show + +::tele 2338 4747 = Lost and found + +::tele 1960 4824 = Twarler Mini-Game + +::tele 2015 4826 = twarler mini-game inside + +::tele 1971 5001 = WIERD CHRUCH! NOT ON RUNESCAPE! + +::tele 1928 5002 = Grave digger + +::tele 2584 4838 = fire alter + +::tele 2966 9633 = somekind of rat-hole never seen this + +::tele 2929 9649 = dragon slayer mace + +::tele 2907 9705 = quest place (dont remember (or newer seen) what quest) + +::tele 2981 9914 = recipes goblin cook place + +::tele 2916 9912 = heroes guild cave + +::tele 2932 9848 = chaos druids + +::tele 2898 9766 = baby bluedragons + +::tele 3048 9582 = ice-warriors & giants + +::tele 2977 9515 = recipes crabs + +::tele 2973 9505 = recipe water "mini-quest" + +::tele 2783 9574 = agility arena + +::tele 2835 9562 = karamja lessers + +::tele 1891 4947 = quest place (dont remember (or newer seen) what quest) + +::tele 2007 4431 = x-mas workshop event wooot! + +::tele 2400 4850 = nature altar! + +::tele 3421 9622 = quest place (dont remember (or newer seen) what quest) + +::tele 1865 5330 = recipe the lum kitchen when started recipe near the secret sky must check if it is possible to see in rs. + +::tele 1860 5345 = same as above but no barrier & no chairs expet one why? + +::tele 2393 4713 = i don't know prob: quest place (dont remember (or newer seen) what quest) + +::tele 2385 4685 = have a relation to the place above what is that? + +::tele 2525 4776 = evil bob's island + +::tele 2633 4700 = quest place (dont remember (or newer seen) what quest) + +::tele 2650 4565 = monkey sadness fight the jungle demon? + +::tele 2650 4508 = monkey sadness the gnome glider puzzle! + +::tele 3300 9825 = A Soul's Bane quest + +::tele 3345 9715 = mage training arena (telegrab) ftw + +::tele 3350 9680 = mage training arena (telegrab) ftw another one + +::tele 3345 9712 = mage training arena (telegrab) ftw another one NOTE: if you see the same arenas try changin height level! + +::tele 2152 5095 = Secret island + +::tele 2721 4828 = water alter + +::tele 2784 4840 = mind alter + +::tele 2842 4835 = air alter + +::tele 2898 4819 = rune essent mining + +::tele 3029 4834 = abyss + +::tele 2528 4833 = wierd alter + +::tele 2471 4838 = law alter + +::tele 1823 4835 = two ships + +::tele 3105 3930 = mage arena + +::tele 1894 5333 = secret sky + +::tele 1865 5341 = recipie for desaster feast + +::tele 3424 9891 = under passage way to canfis + +::tele 3681 9889 = ecto plasm floor + +::tele 2470 9899 = under gnomes grand tree + +::tele 2319 9804 = i'bans trap drop + +::tele 2856 3809 = slippery ice path + +::tele 3551 9693 = barrows chest + +::tele 3177 9753 = under draynore mannor + +::tele 3040 9741 = faladore mining guild + +::tele 3079 9505 = toturial mining + +::tele 3110 9512 = toturial combat train + +::tele 3232 2896 = top of piramid for desert tresure + +::tele 3291 2764 = desert city + +::tele 3298 9179 = under desert city + +::tele 2861 3165 = volcano + +::tele 2863 9570 = under volcano + +::tele 2835 3268 = candor + +::tele 2766 3277 = fishing docks + +::tele 2446 10147 = daganoth cave ( go to "::tele 2446 9999" then keep walking the right direction then ul get there ) + +::tele 2438 5172 = volcano lava + +::tele 2395 5154 = fight pits + +::tele 3234 9896 = wierd place + +::tele 3132 9909 = under edgevill + +::tele 3233 9313 = under piramid at acent alter + +::tele 3363 9639 = mage train up ( shapes ) + +::tele 3363 9637 = mage train up ( bones ) + +::tele 3365 9637 = mage train up ( alching ) + +::tele 3363 2984 = a desert city + +::tele 2396 5093 = fight caves + +::tele 3559 9895 = football traning corse + +::tele 3541 9891 = jumping corse + +::tele 3528 9871 = zip line + +::tele 3539 9872 = jumping steps + +::tele 3555 9947 = cave + +::tele 2972 9507 = Under water + +::tele 2545 4715 = mage arena room + +::tele 2505 4707 = mage arena statues + +::tele 3551 9712 = barrows coffins + +::tele 2716 9816 = black king dragon + +::tele 3487 9493 = kaphite queen place + +::tele 2744 3444 = camalot flax + +::tele 2273 4695 = king black drags + +::tele 2516 4646 = daganoth quest place mother + +::tele 2121 4918 = Draynor private from map + +::tele 2142 4834 = cosmic alter + +::tele 2134 4717 = slave cages ( look up to see them,,cannot be walked on ) + +::tele 2091 3210 = wierd grass land?? + + +/*Guilds*/ +rangeguild = 2657 3439 +rangingguild = 2657 3439 + +fishguild = 2611 3393 +fishingguild = 2611 3393 + +mineguild = 3016 3339 +miningguild = 3016 3339 + +craftguild = 2933 3289 +craftingguild = 2933 3289 + +heroguild = 2902 3510 +herosguild = 2902 3510 +heroesguild = 2902 3510 + +/*End Guilds*/ + +crystalchest = 2914 3450 + +/*Altars*/ +deathaltar = 2207 4836 +cosmicaltar = 2162 4833 +chaosaltar = 2269 4843 +mindaltar = 2796 4818 +airaltar = 2845 4832 +wateraltar = 2713 4836 +earthaltar = 2660 4839 +firealtar = 2584 4836 +bodyaltar = 2527 4833 +lawaltar = 2464 4834 +naturealtar = 2398 4841 + +/*End Altars*/ + +falador = 2965 3380 +goblinvillage = 2956 3506 +druidscircle = 2926 3482 +burthrope = 2926 3561 + +whitewolf = 2848 3498 +catherby = 2815 3447 +camelotcastle = 2758 3495 +seersvillage = 2708 3492 + + +barbagil = 2541 3546 +grandtree1 = 2480 3488 +grandtree2 = 2466 3490 +treegnome = 2441 3429 +westardy = 2535 3305 +eastardy = 2659 3308 +prifddinas = 2242 3278 +elfcamp = 2197 3252 +isafdar = 2241 3238 +duelarena = 3360 3213 +alkharid = 3288 3189 +desertmine = 3286 3023 +bedabincamp = 3171 3026 +banditcamp = 3176 2987 +pollnivneach = 3365 2970 +pyramid = 3233 2901 +sophanem = 3305 2755 +uzer = 3490 3090 +mortton = 3489 3288 +canifis = 3506 3496 +phasmatys = 3687 3502 +fenkencastle = 3550 3548 +digsite = 3354 3402 +examcentre = 3354 3344 +varrock = 3214 3424 +barbvillage = 3081 3424 +edgeville = 3093 3493 + +sarim = 3023 3208 +rimmington = 2957 3214 +draynor = 3093 3244 +lumbridge = 3223 3218 +fightarena = 2585 3150 +gnomevillage1 = 2521 3177 +gnomevillage2 = 2525 3167 +khazard = 2665 3161 +yanille = 2569 3098 +monestary = 3051 3490 +karamja = 2814 3182 +crandor = 2851 3238 +tutisland = 3123 3100 +tzhaar = 2480 5175 +mineess = 2911 4832 +bobsiland = 2526 4777 + +membersdungeon = 2884 9798 +dramentree = 2861 9736 +karamjadungeon = 2843 9636 +steeldragons = 2719 9433 +bluedragons = 2591 9439 +theogre = 2584 9737 +shadowwarrior = 2705 9758 +subwhitewolf = 2822 9882 +gloryfountain = 2918 9895 +spampdungeon = 3168 9572 +barrowscenter = 3551 9693 +canifis = 3477 9845 +werewol***il = 3549 9865 +eledungeon = 2715 9889 +blurite = 3007 9550 +miniagil = 2759 9557 +runerocks = 3061 3886 +kalphites = 3485 9509 +smokedungeon = 3207 9377 +pyramid4 = 3233 9313 +crashisland = 2893 2724 +apeatoll = 2801 2704 +marimpray = 2807 9201 +marimcreate = 2764 9164 +apeatolldungeon = 2805 9142 +kharazi = 2822 2911 +jungledemon = 2657 4568 +hangar = 2584 4516 +gnomedungeon = 2596 4435 +purplecrystal = 2792 4427 +submage = 2538 4717 +godpray = 2507 4718 +lighttower = 2519 4642 +bigdwarfs = 2776 10162 +bigdwarfs2 = 2838 10126 +bigdwarfs3 = 2923 10191 +waterfall = 2534 3511 +endwild = 3100 3957 +eastbank = 3250 3423 +varrock = 3210 3424 +falador2 = 2964 3378 +lumbridge = 3222 3218 +camelot = 2757 3477 +eardy2 = 2662 3305 +wardy2 = 2529 3307 +lathas = 2516 3369 +gnomestrong = 2461 3443 +kharid = 3293 3174 +shantay = 3304 3116 +kalphlair = 3226 3107 +pyramid2 = 3233 2902 +pollnivneach = 3359 2910 +menaphos = 3274 2784 +yanille = 2606 3093 +gultanoth = 2516 3044 +tutisland2 = 3094 3107 +barbarins = 3082 3420 +entrana = 2834 3335 + +coaltrucks = 2582 3481 +gvillage = 2956 3506 +stonehenge2 = 2926 3482 +burth = 2926 3559 +wwolf = 2848 3498 +catherb = 2813 3447 +seers = 2708 3492 +barbyagil = 2541 3546 +prifdinas = 2242 3278 +elfcamp2 = 2197 3252 +isafdar2 = 2241 3238 +darena = 3360 3213 +dminecamp = 3286 3023 +bedcamp = 3171 3026 +bandcamp = 3176 2987 +soph = 3305 2755 +uzerruins = 3490 3090 +morton = 3489 3288 +canif = 3506 3496 +portp = 3687 3502 +fenken = 3550 3548 +dsite = 3354 3402 +ecentre = 3354 3344 +edgeville = 3093 3493 + +psarim = 3023 3208 +rimm = 2957 3214 +farena = 2585 3150 +tgvill = 2525 3167 +pkhazard = 2665 3161 +monkies = 3051 3490 +karamj = 2948 3147 +crandor2 = 2851 3238 +thekbd = 2717 9816 +thebigkq = 3487 9493 +thepass2 = 2337 9798 +wiredwater = 2676 3008 +karamja4memb = 2815 3182 +meetjuna = 3251 9517 +darkroom = 3206 9379 +thepass1 = 2495 9715 +magicarena = 3107 3937 +aatoll = 2755 2784 +jungledemonb = 2714 9183 +jungledemont = 2703 9178 +wagility = 3003 3934 +keldagrim = 2937 9999 +karamjaagil = 2761 9557 +metaldragback = 2713 9459 +metaldragfront = 2713 9564 +desertpyramid = 3233 9315 +thehangar = 2390 9886 +fishplatform = 2782 3273 +boatcrash = 2795 3321 +legendsjungle = 2772 9341 +tzhaar2 = 2480 5175 +mineess2 = 2911 4832 +morningsend = 2044 4649 +dwarfs = 2035 4529 +kbdlair = 2273 4695 +elvenforest = 2309 4597 +goldmine = 2358 4959 +initiate = 2443 4956 +shadowguys = 2738 5081 +barrowstop = 3564 3288 +barrowstunnel = 3568 9695 +barrowschest = 3551 9694 +cwbank = 2441 3090 +castlewars = 2400 3103 +bluedrags = 2910 9801 +blackdemons = 2860 9775 +hellhounds = 2867 9844 +blackdrags = 2829 9826 + +legends2 = 2377 4705 +magearena = 2519 4719 +scaperune = 2525 4776 +forester = 2602 4775 +theisland = 2527 4547 +fremmymaze = 2652 9999 + +quizgame = 1952 4768 +trawler = 2013 4820 +sunktrawler = 1951 4825 +emptytrawler = 1886 4830 +mimestage = 2008 4762 +draynor = 2130 4913 +gameroom = 2196 4961 +gashole = 2464 4782 +shilo = 2827 2995 +karamja1 = 2973 2890 +karamja2 = 2973 2910 +greater = 3288 3886 +wildpalace = 3288 3886 +slayertower = 3428 3535 +misc = 2512 3860 +shilo = 2852 2955 + +party = 2739 3472 +rellaka = 2659 3661 +trollheim = 2910 3612 +tears of guthix = 3257 9517 + +Pest Control Game: X 2667 Y 2594 +Pest Control Bank: X 2658 Y 2649 + +2867 9955 - Ice Queen Lair +3429 3538 - Slayer Tower +2710 9466 - Brimhaven Dungeon +2856 3812 - Ice Path +2480 3437 - Gnome Agility Training +3281 2765 - Pyramid Plunder room +3345 3251 - Duel Arena +2717 9808 - King Black Dragon Cave +3044 4973 - Rouges Den +2979 3611 - Green Dragons +Big water fall ::tele 2534,3511 +Very back of wild ::tele 3100,3957 +Varrock east bank ::tele 3250,3423 +Varrock ::tele 3210,3424 +Falador ::tele 2964,3378 +Lumbridge ::tele 3222,3218 +Camelot ::tele 2757,3477 +East Ardougne ::tele 2662,3305 +West Ardougne ::tele 2529,3307 +King Lathas Training Grounds ::tele 2516,3369 +Tree Gnome Stronghold ::tele 2461,3443 +Al Kharid ::tele 3293,3174 +Shantays Pass ::tele 3304,3116 +Kalphite Lair ::tele 3226,3107 +Pyramid ::tele 3233,2902 +Pollnivneach ::tele 3359,2910 +Menaphos/Sophanem ::tele 3274,2784 +Yanille ::tele 2606,3093 +Gul'Tanoth ::tele 2516,3044 +Tutorial Island ::tele 3094,3107 +Barbarian Village ::tele 3082,3420 +Entrana ::tele 2834,3335 +Heroes Guild ::tele 2902,3510 +Rangers Guild ::tele 2658,3439 +Coal Trucks ::tele 2582,3481 +Goblin Village ::tele 2956,3506 +Druids Circle ::tele 2926,3482 +Burthorpe ::tele 2926,3559 +White wolf mountain ::tele 2848,3498 +Catherby ::tele 2813,3447 +Seers village ::tele 2708,3492 +Fishing guild ::tele 2603,3414 +Barbarian Agility Course ::tele 2541,3546 +Prifddinas ::tele 2242,3278 +Elf camp (Tirannwn) ::tele 2197,3252 +Isafdar (Tirannwn) ::tele 2241,3238 +Duel arena ::tele 3360,3213 +Desert mining camp ::tele 3286,3023 +Bedabin camp ::tele 3171,3026 +Bandit camp ::tele 3176,2987 +Sophanem ::tele 3305,2755 +Ruins of Uzer ::tele 3490,3090 +Mort'ton ::tele 3489,3288 +Canifis ::tele 3506,3496 +Port Phasmatys ::tele 3687,3502 +Fenkenstrain's castle ::tele 3550,3548 +Dig site ::tele 3354,3402 +Exam centre ::tele 3354,3344 +Edgeville ::tele 3093,3493 +Crafting guild ::tele 2933,3285 +Port Sarim ::tele 3023,3208 +Rimmington ::tele 2957,3214 +Draynor village ::tele 3093,3244 +Fight arena ::tele 2585,3150 +Tree gnome village ::tele 2525,3167 +Port Khazard ::tele 2665,3161 +Monastery ::tele 3051,3490 +Karamja ::tele 2948,3147 +Crandor ::tele 2851,3238 +King Black Dragon Lair ::tele 2717,9816 +KQ Lair ::tele 3487,9493 +Underground pass level 2 ::tele 2337,9798 +Weird water place ::tele 2676,3008 +Members Karajama ::tele 2815,3182 +Grave island ::tele 3504,3575 +HAM camp ::tele 3165,9629 +Pyramid under Sophanem ::tele 3277,9171 +Juna the snake ::tele 3251,9517 +Smoky tunnels/dark room (This place needs more tests) 3206,9379 +Underground pass level 1 ::tele 2495,9715 +Mage Arena ::tele 3107,3937 +Ape Atoll ::tele 2755,2784 +Jungle demon area bottom level ::tele 2714,9183 +Jungle demon area top level (use Burst of Strength) ::tele 2703,9178 +Wilderness Agility Course ::tele 3003,3934 +Keldagram ::tele 2937,9999 +Agility arena on Karamja ::tele 2761,9557 +Metal dragon dungeon (back) ::tele 2713,9459 +Metal dragon dungeon (front) ::tele 2713,9564 +Inside the desert treasure pyramid ::tele 3233,9315 +Tree gnome hanger ::tele 2390,9886 +Fishing platform ::tele 2782,3273 +Boat crash island place ::tele 2795,3321 +Legends quest jungle dungeon ::tele 2772,9341 +TzHaar ::tele 2480,5175 +Essence mine ::tele 2911,4832 +Morings end part 1 mine ::tele 2044,4649 +Dwarf cut scene meeting area ::tele 2035,4529 +New KBD lair ::tele 2273,4695 +Elven forest cut scene area ::tele 2309,4597 +Gold mine rock ::tele 2358,4959 +White knight tasks area ::tele 2443,4956 +Rouge maze (Press Burst of Strength) ::tele 3050,5071 +The shadow guys dungeon ::tele 2738,5081 +Barrows top ::tele 3564,3288 +Barrows tunnel ::tele 3568,9695 +Barrows chest ::tele 3551,9694 +CW bank= 2441,3090 +CW center= 2400,3103 +Blue dragons= 2910,9801 +Black demons= 2860 9775 +Hell Hounds= 2867,9844 +Black dragons= 2829,9826 +Chaos rune crafting alter ::tele 2269,4843 +Legends dungeon prt2 ::tele 2375,4705 +Mage arena dungeon ::tele 2519,4719 +Evil Bobs island "scaperune" ::tele 2525,4776 +Distant kingdom (alive) 2576,4655 +Distant kingdom (dead) 2803,4723 +Forester random event ::tele 2602,4775 +Alt area ::tele 2527,4547 +Fremmy maze ::tele 2652,9999 +Death rune altar ::tele 2207,4836 +Cosmic alter ::tele 2162,4833 +Middle of under ground pass ::tele 2168 4726 +Quiz random event ::tele 1952,4768 +Trawler boat ::tele 2013,4820 +Sunk trawler mini game boat ::tele 1951,4825 +Trawler boat empty of water ::tele 1886,4830 +Mime stage ::tele 2008,4762 +"Draynor" ::tele 2130,4913 +Game room ::tele 2196,4961 +Mind alter ::tele 2796,4818 +Air Alter ::tele 2845,4832 +Water Alter ::tele 2713,4836 +Earth Alter ::tele 2660,4839 +Fire Alter ::tele 2584,4836 +Body Alter ::tele 2527,4833 +Law Alter ::tele 2464,4834 +Nature Alter ::tele 2398,4841 +Gas hole ::tele 2464,4782 +Edge of maze ::tele 2885,4550 +Center of maze ::tele 2912,4576 +Falador mine ::tele 3038,9800 +::tele 3157 4822 = drill deamon camp + +::tele 2477 4768 = frog cave + +::tele 2596 4780 = freaky forester + +::tele 2095 4428 = prison pete + +::tele 1952 4764 = quiz show + +::tele 2338 4747 = Lost and found + +::tele 1960 4824 = Twarler Mini-Game + +::tele 2015 4826 = twarler mini-game inside + +::tele 1971 5001 = WIERD CHRUCH! NOT ON RUNESCAPE! + +::tele 1928 5002 = Grave digger + +::tele 2584 4838 = fire alter + +::tele 2966 9633 = somekind of rat-hole never seen this + +::tele 2929 9649 = dragon slayer mace + +::tele 2907 9705 = quest place (dont remember (or newer seen) what quest) + +::tele 2981 9914 = recipes goblin cook place + +::tele 2916 9912 = heroes guild cave + +::tele 2932 9848 = chaos druids + +::tele 2898 9766 = baby bluedragons + +::tele 3048 9582 = ice-warriors & giants + +::tele 2977 9515 = recipes crabs + +::tele 2973 9505 = recipe water "mini-quest" + +::tele 2783 9574 = agility arena + +::tele 2835 9562 = karamja lessers + +::tele 1891 4947 = quest place (dont remember (or newer seen) what quest) + +::tele 2007 4431 = x-mas workshop event wooot! + +::tele 2400 4850 = nature altar! + +::tele 3421 9622 = quest place (dont remember (or newer seen) what quest) + +::tele 1865 5330 = recipe the lum kitchen when started recipe near the secret sky must check if it is possible to see in rs. + +::tele 1860 5345 = same as above but no barrier & no chairs expet one why? + +::tele 2393 4713 = i don't know prob: quest place (dont remember (or newer seen) what quest) + +::tele 2385 4685 = have a relation to the place above what is that? + +::tele 2525 4776 = evil bob's island + +::tele 2633 4700 = quest place (dont remember (or newer seen) what quest) + +::tele 2650 4565 = monkey sadness fight the jungle demon? + +::tele 2650 4508 = monkey sadness the gnome glider puzzle! + +::tele 3300 9825 = A Soul's Bane quest + +::tele 3345 9715 = mage training arena (telegrab) ftw + +::tele 3350 9680 = mage training arena (telegrab) ftw another one + +::tele 3345 9712 = mage training arena (telegrab) ftw another one NOTE: if you see the same arenas try changin height level! + +::tele 2152 5095 = Secret island + +::tele 2721 4828 = water alter + +::tele 2784 4840 = mind alter + +::tele 2842 4835 = air alter + +::tele 2898 4819 = rune essent mining + +::tele 3029 4834 = abyss + +::tele 2528 4833 = wierd alter + +::tele 2471 4838 = law alter + +::tele 1823 4835 = two ships + +::tele 3105 3930 = mage arena + +::tele 1894 5333 = secret sky + +::tele 1865 5341 = recipie for desaster feast + +::tele 3424 9891 = under passage way to canfis + +::tele 3681 9889 = ecto plasm floor + +::tele 2470 9899 = under gnomes grand tree + +::tele 2319 9804 = i'bans trap drop + +::tele 2856 3809 = slippery ice path + +::tele 3551 9693 = barrows chest + +::tele 3177 9753 = under draynore mannor + +::tele 3040 9741 = faladore mining guild + +::tele 3079 9505 = toturial mining + +::tele 3110 9512 = toturial combat train + +::tele 3232 2896 = top of piramid for desert tresure + +::tele 3291 2764 = desert city + +::tele 3298 9179 = under desert city + +::tele 2861 3165 = volcano + +::tele 2863 9570 = under volcano + +::tele 2835 3268 = candor + +::tele 2766 3277 = fishing docks + +::tele 2446 10147 = daganoth cave ( go to "::tele 2446 9999" then keep walking the right direction then ul get there ) + +::tele 2438 5172 = volcano lava + +::tele 2395 5154 = fight pits + +::tele 3234 9896 = wierd place + +::tele 3132 9909 = under edgevill + +::tele 3233 9313 = under piramid at acent alter + +::tele 3363 9639 = mage train up ( shapes ) + +::tele 3363 9637 = mage train up ( bones ) + +::tele 3365 9637 = mage train up ( alching ) + +::tele 3363 2984 = a desert city + +::tele 2396 5093 = fight caves + +::tele 3559 9895 = football traning corse + +::tele 3541 9891 = jumping corse + +::tele 3528 9871 = zip line + +::tele 3539 9872 = jumping steps + +::tele 3555 9947 = cave + +::tele 2972 9507 = Under water + +::tele 2545 4715 = mage arena room + +::tele 2505 4707 = mage arena statues + +::tele 3551 9712 = barrows coffins + +::tele 2716 9816 = black king dragon + +::tele 3487 9493 = kaphite queen place + +::tele 2744 3444 = camalot flax + +::tele 2273 4695 = king black drags + +::tele 2516 4646 = daganoth quest place mother + +::tele 2121 4918 = Draynor private from map + +::tele 2142 4834 = cosmic alter + +::tele 2134 4717 = slave cages ( look up to see them,,cannot be walked on ) + +::tele 2091 3210 = wierd grass land?? + + +/*Guilds*/ +rangeguild = 2657 3439 +rangingguild = 2657 3439 + +fishguild = 2611 3393 +fishingguild = 2611 3393 + +mineguild = 3016 3339 +miningguild = 3016 3339 + +craftguild = 2933 3289 +craftingguild = 2933 3289 + +heroguild = 2902 3510 +herosguild = 2902 3510 +heroesguild = 2902 3510 + +/*End Guilds*/ + +crystalchest = 2914 3450 + +/*Altars*/ +deathaltar = 2207 4836 +cosmicaltar = 2162 4833 +chaosaltar = 2269 4843 +mindaltar = 2796 4818 +airaltar = 2845 4832 +wateraltar = 2713 4836 +earthaltar = 2660 4839 +firealtar = 2584 4836 +bodyaltar = 2527 4833 +lawaltar = 2464 4834 +naturealtar = 2398 4841 + +/*End Altars*/ + +falador = 2965 3380 +goblinvillage = 2956 3506 +druidscircle = 2926 3482 +burthrope = 2926 3561 + +whitewolf = 2848 3498 +catherby = 2815 3447 +camelotcastle = 2758 3495 +seersvillage = 2708 3492 + + +barbagil = 2541 3546 +grandtree1 = 2480 3488 +grandtree2 = 2466 3490 +treegnome = 2441 3429 +westardy = 2535 3305 +eastardy = 2659 3308 +prifddinas = 2242 3278 +elfcamp = 2197 3252 +isafdar = 2241 3238 +duelarena = 3360 3213 +alkharid = 3288 3189 +desertmine = 3286 3023 +bedabincamp = 3171 3026 +banditcamp = 3176 2987 +pollnivneach = 3365 2970 +pyramid = 3233 2901 +sophanem = 3305 2755 +uzer = 3490 3090 +mortton = 3489 3288 +canifis = 3506 3496 +phasmatys = 3687 3502 +fenkencastle = 3550 3548 +digsite = 3354 3402 +examcentre = 3354 3344 +varrock = 3214 3424 +barbvillage = 3081 3424 +edgeville = 3093 3493 + +sarim = 3023 3208 +rimmington = 2957 3214 +draynor = 3093 3244 +lumbridge = 3223 3218 +fightarena = 2585 3150 +gnomevillage1 = 2521 3177 +gnomevillage2 = 2525 3167 +khazard = 2665 3161 +yanille = 2569 3098 +monestary = 3051 3490 +karamja = 2814 3182 +crandor = 2851 3238 +tutisland = 3123 3100 +tzhaar = 2480 5175 +mineess = 2911 4832 +bobsiland = 2526 4777 + +membersdungeon = 2884 9798 +dramentree = 2861 9736 +karamjadungeon = 2843 9636 +steeldragons = 2719 9433 +bluedragons = 2591 9439 +theogre = 2584 9737 +shadowwarrior = 2705 9758 +subwhitewolf = 2822 9882 +gloryfountain = 2918 9895 +spampdungeon = 3168 9572 +barrowscenter = 3551 9693 +canifis = 3477 9845 +werewol***il = 3549 9865 +eledungeon = 2715 9889 +blurite = 3007 9550 +miniagil = 2759 9557 +runerocks = 3061 3886 +kalphites = 3485 9509 +smokedungeon = 3207 9377 +pyramid4 = 3233 9313 +crashisland = 2893 2724 +apeatoll = 2801 2704 +marimpray = 2807 9201 +marimcreate = 2764 9164 +apeatolldungeon = 2805 9142 +kharazi = 2822 2911 +jungledemon = 2657 4568 +hangar = 2584 4516 +gnomedungeon = 2596 4435 +purplecrystal = 2792 4427 +submage = 2538 4717 +godpray = 2507 4718 +lighttower = 2519 4642 +bigdwarfs = 2776 10162 +bigdwarfs2 = 2838 10126 +bigdwarfs3 = 2923 10191 +waterfall = 2534 3511 +endwild = 3100 3957 +eastbank = 3250 3423 +varrock = 3210 3424 +falador2 = 2964 3378 +lumbridge = 3222 3218 +camelot = 2757 3477 +eardy2 = 2662 3305 +wardy2 = 2529 3307 +lathas = 2516 3369 +gnomestrong = 2461 3443 +kharid = 3293 3174 +shantay = 3304 3116 +kalphlair = 3226 3107 +pyramid2 = 3233 2902 +pollnivneach = 3359 2910 +menaphos = 3274 2784 +yanille = 2606 3093 +gultanoth = 2516 3044 +tutisland2 = 3094 3107 +barbarins = 3082 3420 +entrana = 2834 3335 + +coaltrucks = 2582 3481 +gvillage = 2956 3506 +stonehenge2 = 2926 3482 +burth = 2926 3559 +wwolf = 2848 3498 +catherb = 2813 3447 +seers = 2708 3492 +barbyagil = 2541 3546 +prifdinas = 2242 3278 +elfcamp2 = 2197 3252 +isafdar2 = 2241 3238 +darena = 3360 3213 +dminecamp = 3286 3023 +bedcamp = 3171 3026 +bandcamp = 3176 2987 +soph = 3305 2755 +uzerruins = 3490 3090 +morton = 3489 3288 +canif = 3506 3496 +portp = 3687 3502 +fenken = 3550 3548 +dsite = 3354 3402 +ecentre = 3354 3344 +edgeville = 3093 3493 + +psarim = 3023 3208 +rimm = 2957 3214 +farena = 2585 3150 +tgvill = 2525 3167 +pkhazard = 2665 3161 +monkies = 3051 3490 +karamj = 2948 3147 +crandor2 = 2851 3238 +thekbd = 2717 9816 +thebigkq = 3487 9493 +thepass2 = 2337 9798 +wiredwater = 2676 3008 +karamja4memb = 2815 3182 +meetjuna = 3251 9517 +darkroom = 3206 9379 +thepass1 = 2495 9715 +magicarena = 3107 3937 +aatoll = 2755 2784 +jungledemonb = 2714 9183 +jungledemont = 2703 9178 +wagility = 3003 3934 +keldagrim = 2937 9999 +karamjaagil = 2761 9557 +metaldragback = 2713 9459 +metaldragfront = 2713 9564 +desertpyramid = 3233 9315 +thehangar = 2390 9886 +fishplatform = 2782 3273 +boatcrash = 2795 3321 +legendsjungle = 2772 9341 +tzhaar2 = 2480 5175 +mineess2 = 2911 4832 +morningsend = 2044 4649 +dwarfs = 2035 4529 +kbdlair = 2273 4695 +elvenforest = 2309 4597 +goldmine = 2358 4959 +initiate = 2443 4956 +shadowguys = 2738 5081 +barrowstop = 3564 3288 +barrowstunnel = 3568 9695 +barrowschest = 3551 9694 +cwbank = 2441 3090 +castlewars = 2400 3103 +bluedrags = 2910 9801 +blackdemons = 2860 9775 +hellhounds = 2867 9844 +blackdrags = 2829 9826 + +legends2 = 2377 4705 +magearena = 2519 4719 +scaperune = 2525 4776 +forester = 2602 4775 +theisland = 2527 4547 +fremmymaze = 2652 9999 + +quizgame = 1952 4768 +trawler = 2013 4820 +sunktrawler = 1951 4825 +emptytrawler = 1886 4830 +mimestage = 2008 4762 +draynor = 2130 4913 +gameroom = 2196 4961 +gashole = 2464 4782 +shilo = 2827 2995 +karamja1 = 2973 2890 +karamja2 = 2973 2910 +greater = 3288 3886 +wildpalace = 3288 3886 +slayertower = 3428 3535 +misc = 2512 3860 +shilo = 2852 2955 + +party = 2739 3472 +rellaka = 2659 3661 +trollheim = 2910 3612 +tears of guthix = 3257 9517 + +Pest Control Game: X 2667 Y 2594 +Pest Control Bank: X 2658 Y 2649 diff --git a/test b/test new file mode 100644 index 000000000..9b79d200a --- /dev/null +++ b/test @@ -0,0 +1,217 @@ +package core + +import core.game.system.SystemShutdownHook +import core.game.system.mysql.SQLManager +import core.game.world.map.Location +import core.tools.mysql.Database +import core.tools.secondsToTicks +import org.json.simple.JSONObject +import java.io.File +import java.math.BigInteger + +/** + * A class holding various variables for the server. + * @author Ceikry + */ +class ServerConstants { + companion object { + @JvmField + var SHUTDOWN_HOOK: Thread = Thread(SystemShutdownHook()) + + @JvmField + var DATA_PATH: String? = null + + //path to the cache + @JvmField + var CACHE_PATH: String? = null + + //path for the server store (obsolete, but kept for the sake of system sanity.) + @JvmField + var STORE_PATH: String? = null + + //path for player saves + @JvmField + var PLAYER_SAVE_PATH: String? = null + + @JvmField + var PLAYER_ATTRIBUTE_PATH = "ish"; + + //path to the various config files, such as npc_spawns.json + var CONFIG_PATH: String? = null + + @JvmField + var GRAND_EXCHANGE_DATA_PATH: String? = null + + @JvmField + var RDT_DATA_PATH: String? = null + + @JvmField + var OBJECT_PARSER_PATH: String? = null + + @JvmField + var SCRIPTS_PATH: String? = null + + @JvmField + var DIALOGUE_SCRIPTS_PATH: String? = null + + @JvmField + var LOGS_PATH: String? = null + + @JvmField + var BOT_DATA_PATH: String? = null + + //the max number of players. + @JvmField + var MAX_PLAYERS = 0 + + //the max number of NPCs + @JvmField + var MAX_NPCS = 0 + + //the location where new players are placed on login. + @JvmField + var START_LOCATION: Location? = null + + //Location for all home teleports/respawn location + @JvmField + var HOME_LOCATION: Location? = null + + //the name for the database + @JvmField + var DATABASE_NAME: String? = null + + //username for the database + @JvmField + var DATABASE_USER: String? = null + + //password for the database + @JvmField + var DATABASE_PASS: String? = null + + //address for the database + @JvmField + var DATABASE_ADDRESS: String? = null + + @JvmField + var DATABASE_PORT: String? = null + + @JvmField + var WRITE_LOGS: Boolean = false + + @JvmField + var BANK_SIZE: Int = 496 + + @JvmField + var GE_AUTOSAVE_FREQUENCY = secondsToTicks(3600) //1 hour + + @JvmField + var GE_AUTOSTOCK_ENABLED = false + + //location names for the ::to command. + val TELEPORT_DESTINATIONS = arrayOf( + arrayOf(Location.create(2974, 4383, 2), "corp", "corporal", "corporeal"), + arrayOf(Location.create(2659, 2649, 0), "pc", "pest control", "pest"), + arrayOf(Location.create(3293, 3184, 0), "al kharid", "alkharid", "kharid"), + arrayOf(Location.create(3222, 3217, 0), "lumbridge", "lumby"), + arrayOf(Location.create(3110, 3168, 0), "wizard tower", "wizards tower", "tower", "wizards"), + arrayOf(Location.create(3083, 3249, 0), "draynor", "draynor village"), + arrayOf(Location.create(3019, 3244, 0), "port sarim", "sarim"), + arrayOf(Location.create(2956, 3209, 0), "rimmington"), + arrayOf(Location.create(2965, 3380, 0), "fally", "falador"), + arrayOf(Location.create(2895, 3436, 0), "taverley"), + arrayOf(Location.create(3080, 3423, 0), "barbarian village", "barb"), + arrayOf(Location.create(3213, 3428, 0), "varrock"), + arrayOf(Location.create(3164, 3485, 0), "grand exchange", "ge"), + arrayOf(Location.create(2917, 3175, 0), "karamja"), + arrayOf(Location.create(2450, 5165, 0), "tzhaar"), + arrayOf(Location.create(2795, 3177, 0), "brimhaven"), + arrayOf(Location.create(2849, 2961, 0), "shilo village", "shilo"), + arrayOf(Location.create(2605, 3093, 0), "yanille"), + arrayOf(Location.create(2663, 3305, 0), "ardougne", "ardy"), + arrayOf(Location.create(2450, 3422, 0), "gnome stronghold", "gnome"), + arrayOf(Location.create(2730, 3485, 0), "camelot", "cammy", "seers"), + arrayOf(Location.create(2805, 3435, 0), "catherby"), + arrayOf(Location.create(2659, 3657, 0), "rellekka"), + arrayOf(Location.create(2890, 3676, 0), "trollheim"), + arrayOf(Location.create(2914, 3746, 0), "godwars", "gwd", "god wars"), + arrayOf(Location.create(3180, 3684, 0), "bounty hunter", "bh"), + arrayOf(Location.create(3272, 3687, 0), "clan wars", "clw"), + arrayOf(Location.create(3090, 3957, 0), "mage arena", "mage", "magearena", "arena"), + arrayOf(Location.create(3069, 10257, 0), "king black dragon", "kbd"), + arrayOf(Location.create(3359, 3416, 0), "digsite"), + arrayOf(Location.create(3488, 3489, 0), "canifis"), + arrayOf(Location.create(3428, 3526, 0), "slayer tower", "slayer"), + arrayOf(Location.create(3502, 9483, 2), "kalphite queen", "kq", "kalphite hive", "kalphite"), + arrayOf(Location.create(3233, 2913, 0), "pyramid"), + arrayOf(Location.create(3419, 2917, 0), "nardah"), + arrayOf(Location.create(3482, 3090, 0), "uzer"), + arrayOf(Location.create(3358, 2970, 0), "pollnivneach", "poln"), + arrayOf(Location.create(3305, 2788, 0), "sophanem"), + arrayOf(Location.create(2898, 3544, 0), "burthorpe", "burthorp"), + arrayOf(Location.create(3088, 3491, 0), "edge", "edgeville"), + arrayOf(Location.create(3169, 3034, 0), "bedabin"), + arrayOf(Location.create(3565, 3289, 0), "barrows"), + arrayOf(Location.create(3016, 3513, 0), "bkf", "black knights fortress"), + arrayOf(Location.create(3052, 3481, 0), "monastery") + ) + + @JvmField + var DATABASE: Database? = null + + //if SQL is enabled + @JvmField + var MYSQL = true + + //the server name + @JvmField + var SERVER_NAME: String = "" + + //The RSA_KEY for the server. + @JvmField + var EXPONENT = BigInteger("109343860332353211924482133180092752644123222251570035818592399718899543340247882615012834369709881454157761178411602406231525266135486523035643931381979724348736863559735931163013508521663192459153115214061347330689961869574877386212674606945486858607548180282077056338048348202722564364196572081666257569141") + + //The MODULUS for the server. + @JvmField + var MODULUS = BigInteger("96982303379631821170939875058071478695026608406924780574168393250855797534862289546229721580153879336741968220328805101128831071152160922518190059946555203865621183480223212969502122536662721687753974815205744569357388338433981424032996046420057284324856368815997832596174397728134370577184183004453899764051") + + /** + * Parses a JSONObject and retrieves the values for all settings in this file. + * @author Ceikry + * @param data : The JSONObject to parse. + */ + fun parse(data: JSONObject) { + MAX_PLAYERS = data["max_players"].toString().toInt() + MAX_NPCS = data["max_npcs"].toString().toInt() + + START_LOCATION = JSONUtils.parseLocation(data["new_player_location"].toString()) + HOME_LOCATION = JSONUtils.parseLocation(data["home_location"].toString()) + + DATA_PATH = JSONUtils.parsePath(data["data_path"].toString()) + CACHE_PATH = JSONUtils.parsePath(data["cache_path"].toString()) + STORE_PATH = JSONUtils.parsePath(data["store_path"].toString()) + PLAYER_SAVE_PATH = JSONUtils.parsePath(data["save_path"].toString()) + CONFIG_PATH = JSONUtils.parsePath(data["configs_path"].toString()) + PLAYER_ATTRIBUTE_PATH = PLAYER_SAVE_PATH + "attributes" + File.separator + GRAND_EXCHANGE_DATA_PATH = JSONUtils.parsePath(data["grand_exchange_data_path"].toString()) + BOT_DATA_PATH = JSONUtils.parsePath(data["bot_data_path"].toString()) + RDT_DATA_PATH = JSONUtils.parsePath(data["rare_drop_table_path"].toString()) + OBJECT_PARSER_PATH = JSONUtils.parsePath(data["object_parser_path"].toString()) + SCRIPTS_PATH = JSONUtils.parsePath(data["scripts_path"].toString()) + DIALOGUE_SCRIPTS_PATH = JSONUtils.parsePath(data["dialogue_scripts_path"].toString()) + if(data.containsKey("logs_path")){ + LOGS_PATH = data["logs_path"].toString() + } + if(data.containsKey("writeLogs")){ + WRITE_LOGS = data["writeLogs"] as Boolean + } + + DATABASE_NAME = data["database_name"].toString() + DATABASE_USER = data["database_username"].toString() + DATABASE_PASS = data["database_password"].toString() + DATABASE_ADDRESS = data["database_address"].toString() + DATABASE_PORT = data["database_port"].toString() + + DATABASE = Database(DATABASE_ADDRESS, DATABASE_NAME, DATABASE_USER, DATABASE_PASS) + } + } +} \ No newline at end of file